diff --git a/.github/workflows/build-act-wheels.yml b/.github/workflows/build-act-wheels.yml deleted file mode 100644 index b85f151a89..0000000000 --- a/.github/workflows/build-act-wheels.yml +++ /dev/null @@ -1,577 +0,0 @@ -name: build-act-wheels -'on': - workflow_dispatch: - inputs: - name: - type: string - description: Pkg to build (empty for all) - required: false - graalpy: - type: string - description: GraalPy download url prefix (empty for default) - required: false -jobs: - numpy-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'numpy') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y gcc-toolset-12-gcc-gfortran openblas-devel - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) numpy - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: numpy-linux-amd64 - path: numpy*.whl - if-no-files-found: error - numpy-linux-aarch64: - runs-on: - - self-hosted - - Linux - - ARM64 - container: quay.io/pypa/manylinux_2_28_aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'numpy') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y gcc-toolset-12-gcc-gfortran openblas-devel - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) numpy - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: numpy-linux-aarch64 - path: numpy*.whl - if-no-files-found: error - numpy-macos-amd64: - runs-on: macos-12 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'numpy') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: brew install gcc openblas - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) numpy - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: numpy-macos-amd64 - path: numpy*.whl - if-no-files-found: error - numpy-macos-aarch64: - runs-on: macos-latest - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'numpy') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: brew install gcc openblas - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) numpy - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: numpy-macos-aarch64 - path: numpy*.whl - if-no-files-found: error - PyYAML-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: numpy-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'PyYAML') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) PyYAML - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: PyYAML-linux-amd64 - path: PyYAML*.whl - if-no-files-found: error - PyYAML-linux-aarch64: - runs-on: - - self-hosted - - Linux - - ARM64 - container: quay.io/pypa/manylinux_2_28_aarch64 - needs: numpy-linux-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'PyYAML') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-linux-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) PyYAML - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: PyYAML-linux-aarch64 - path: PyYAML*.whl - if-no-files-found: error - PyYAML-macos-amd64: - runs-on: macos-12 - needs: numpy-macos-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'PyYAML') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-macos-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) PyYAML - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: PyYAML-macos-amd64 - path: PyYAML*.whl - if-no-files-found: error - PyYAML-macos-aarch64: - runs-on: macos-latest - needs: numpy-macos-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'PyYAML') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-macos-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) PyYAML - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: PyYAML-macos-aarch64 - path: PyYAML*.whl - if-no-files-found: error - PyYAML-windows-amd64: - runs-on: windows-latest - needs: numpy-windows-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'PyYAML') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - Invoke-WebRequest https://kumisystems.dl.sourceforge.net/project/gnuwin32/patch/2.5.9-7/patch-2.5.9-7-bin.zip -OutFile patch.zip - Expand-Archive patch.zip -DestinationPath ../patch -Force - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - $ProgressPreference = 'SilentlyContinue' - Invoke-WebRequest ${{ inputs.graalpy }}-windows-amd64.zip -OutFile graalpy-windows-amd64.zip - Expand-Archive graalpy-windows-amd64.zip - mv graalpy-windows-amd64/* graalpy - graalpy/bin/graalpy.exe -s -m ensurepip - graalpy/bin/graalpy.exe -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-windows-amd64 - - name: Build wheel - run: |- - $env:PIP_FIND_LINKS=$PWD - $env:PATH+=";$PWD\graalpy\bin;$PWD\graalpy\Scripts;$PWD\..\patch\bin" - graalpy/bin/graalpy -m pip wheel --find-links $PWD PyYAML - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: PyYAML-windows-amd64 - path: PyYAML*.whl - if-no-files-found: error - ujson-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: PyYAML-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'ujson') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from PyYAML - uses: actions/download-artifact@main - continue-on-error: true - with: - name: PyYAML-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) ujson - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: ujson-linux-amd64 - path: ujson*.whl - if-no-files-found: error - ujson-linux-aarch64: - runs-on: - - self-hosted - - Linux - - ARM64 - container: quay.io/pypa/manylinux_2_28_aarch64 - needs: PyYAML-linux-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'ujson') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from PyYAML - uses: actions/download-artifact@main - continue-on-error: true - with: - name: PyYAML-linux-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) ujson - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: ujson-linux-aarch64 - path: ujson*.whl - if-no-files-found: error - ujson-macos-amd64: - runs-on: macos-12 - needs: PyYAML-macos-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'ujson') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from PyYAML - uses: actions/download-artifact@main - continue-on-error: true - with: - name: PyYAML-macos-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) ujson - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: ujson-macos-amd64 - path: ujson*.whl - if-no-files-found: error - ujson-macos-aarch64: - runs-on: macos-latest - needs: PyYAML-macos-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'ujson') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from PyYAML - uses: actions/download-artifact@main - continue-on-error: true - with: - name: PyYAML-macos-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) ujson - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: ujson-macos-aarch64 - path: ujson*.whl - if-no-files-found: error diff --git a/.github/workflows/build-linux-aarch64-wheels.yml b/.github/workflows/build-linux-aarch64-wheels.yml index c5ab981b23..a38721dbc8 100644 --- a/.github/workflows/build-linux-aarch64-wheels.yml +++ b/.github/workflows/build-linux-aarch64-wheels.yml @@ -2,712 +2,24 @@ name: build-linux-aarch64-wheels 'on': workflow_dispatch: inputs: - name: + packages: type: string - description: Pkg to build (empty for all) + description: Pkgs to build (comma-separated, empty for all) required: false - graalpy: + graalpy_url: type: string - description: GraalPy download url prefix (empty for default) - required: false + description: GraalPy download url + required: true jobs: - psutil-linux-aarch64: - runs-on: - - self-hosted - - Linux - - ARM64 - container: quay.io/pypa/manylinux_2_28_aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'psutil') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) psutil - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: psutil-linux-aarch64 - path: psutil*.whl - if-no-files-found: error - numpy-linux-aarch64: - runs-on: - - self-hosted - - Linux - - ARM64 - container: quay.io/pypa/manylinux_2_28_aarch64 - needs: psutil-linux-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'numpy' || inputs.name - == 'pandas' || inputs.name == 'contourpy' || inputs.name == 'matplotlib' || - inputs.name == 'scipy' || inputs.name == 'scikit-learn' || inputs.name == 'torch') - }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y gcc-toolset-12-gcc-gfortran openblas-devel - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from psutil - uses: actions/download-artifact@main - continue-on-error: true - with: - name: psutil-linux-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) numpy - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: numpy-linux-aarch64 - path: numpy*.whl - if-no-files-found: error - pandas-linux-aarch64: - runs-on: - - self-hosted - - Linux - - ARM64 - container: quay.io/pypa/manylinux_2_28_aarch64 - needs: numpy-linux-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'pandas') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y openblas - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-linux-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) pandas - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: pandas-linux-aarch64 - path: pandas*.whl - if-no-files-found: error - pybind11-linux-aarch64: - runs-on: - - self-hosted - - Linux - - ARM64 - container: quay.io/pypa/manylinux_2_28_aarch64 - needs: pandas-linux-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'pybind11' || inputs.name - == 'contourpy' || inputs.name == 'kiwisolver' || inputs.name == 'torch' || inputs.name - == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from pandas - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pandas-linux-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) pybind11 - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: pybind11-linux-aarch64 - path: pybind11*.whl - if-no-files-found: error - ninja-linux-aarch64: - runs-on: - - self-hosted - - Linux - - ARM64 - container: quay.io/pypa/manylinux_2_28_aarch64 - needs: pybind11-linux-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'ninja' || inputs.name - == 'contourpy' || inputs.name == 'torch' || inputs.name == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from pybind11 - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pybind11-linux-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) ninja - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: ninja-linux-aarch64 - path: ninja*.whl - if-no-files-found: error - pillow-linux-aarch64: - runs-on: - - self-hosted - - Linux - - ARM64 - container: quay.io/pypa/manylinux_2_28_aarch64 - needs: ninja-linux-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'pillow' || inputs.name - == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y libtiff-devel libjpeg-devel openjpeg2-devel zlib-devel freetype-devel lcms2-devel libwebp-devel - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from ninja - uses: actions/download-artifact@main - continue-on-error: true - with: - name: ninja-linux-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) pillow - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: pillow-linux-aarch64 - path: pillow*.whl - if-no-files-found: error - contourpy-linux-aarch64: - runs-on: - - self-hosted - - Linux - - ARM64 - container: quay.io/pypa/manylinux_2_28_aarch64 - needs: - - ninja-linux-aarch64 - - pybind11-linux-aarch64 - - numpy-linux-aarch64 - - pillow-linux-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'contourpy' || inputs.name - == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from ninja - uses: actions/download-artifact@main - continue-on-error: true - with: - name: ninja-linux-aarch64 - - name: Download artifacts from pybind11 - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pybind11-linux-aarch64 - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-linux-aarch64 - - name: Download artifacts from pillow - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pillow-linux-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) contourpy - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: contourpy-linux-aarch64 - path: contourpy*.whl - if-no-files-found: error - kiwisolver-linux-aarch64: - runs-on: - - self-hosted - - Linux - - ARM64 - container: quay.io/pypa/manylinux_2_28_aarch64 - needs: - - pybind11-linux-aarch64 - - contourpy-linux-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'kiwisolver' || inputs.name - == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from pybind11 - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pybind11-linux-aarch64 - - name: Download artifacts from contourpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: contourpy-linux-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) kiwisolver - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: kiwisolver-linux-aarch64 - path: kiwisolver*.whl - if-no-files-found: error - matplotlib-linux-aarch64: - runs-on: - - self-hosted - - Linux - - ARM64 - container: quay.io/pypa/manylinux_2_28_aarch64 - needs: - - pillow-linux-aarch64 - - kiwisolver-linux-aarch64 - - numpy-linux-aarch64 - - contourpy-linux-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y openblas - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from pillow - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pillow-linux-aarch64 - - name: Download artifacts from kiwisolver - uses: actions/download-artifact@main - continue-on-error: true - with: - name: kiwisolver-linux-aarch64 - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-linux-aarch64 - - name: Download artifacts from contourpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: contourpy-linux-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) matplotlib - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: matplotlib-linux-aarch64 - path: matplotlib*.whl - if-no-files-found: error - scipy-linux-aarch64: - runs-on: - - self-hosted - - Linux - - ARM64 - container: quay.io/pypa/manylinux_2_28_aarch64 - needs: - - numpy-linux-aarch64 - - matplotlib-linux-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'scipy' || inputs.name - == 'scikit-learn') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y gcc-toolset-12-gcc-gfortran openblas-devel - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-linux-aarch64 - - name: Download artifacts from matplotlib - uses: actions/download-artifact@main - continue-on-error: true - with: - name: matplotlib-linux-aarch64 - - name: Build wheel - run: |- - export FFLAGS=-fallow-argument-mismatch - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) scipy - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: scipy-linux-aarch64 - path: scipy*.whl - if-no-files-found: error - scikit-learn-linux-aarch64: - runs-on: - - self-hosted - - Linux - - ARM64 - container: quay.io/pypa/manylinux_2_28_aarch64 - needs: - - numpy-linux-aarch64 - - scipy-linux-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'scikit-learn') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y openblas - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-linux-aarch64 - - name: Download artifacts from scipy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: scipy-linux-aarch64 - - name: Build wheel - run: |- - export FFLAGS=-fallow-argument-mismatch - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) scikit-learn - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: scikit-learn-linux-aarch64 - path: scikit*learn*.whl - if-no-files-found: error - cffi-linux-aarch64: - runs-on: - - self-hosted - - Linux - - ARM64 - container: quay.io/pypa/manylinux_2_28_aarch64 - needs: scikit-learn-linux-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'cffi' || inputs.name - == 'torch') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y libffi-devel - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from scikit-learn - uses: actions/download-artifact@main - continue-on-error: true - with: - name: scikit-learn-linux-aarch64 - - name: Build wheel - run: |- - graalpy/bin/graalpy -m pip install wheel - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) cffi - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: cffi-linux-aarch64 - path: cffi*.whl - if-no-files-found: error - PyYAML-linux-aarch64: + build_wheels: runs-on: - self-hosted - Linux - ARM64 container: quay.io/pypa/manylinux_2_28_aarch64 - needs: cffi-linux-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'PyYAML' || inputs.name - == 'torch') }} + env: + PACKAGES_TO_BUILD: ${{ inputs.packages }} steps: - - uses: ilammy/msvc-dev-cmd@v1 - name: Install dependencies run: | dnf install -y epel-release @@ -717,231 +29,18 @@ jobs: dnf install -y /usr/bin/patch - name: Checkout uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from cffi - uses: actions/download-artifact@main - continue-on-error: true - with: - name: cffi-linux-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) PyYAML - - name: Store wheels - uses: actions/upload-artifact@main + - uses: actions-rust-lang/setup-rust-toolchain@v1 with: - name: PyYAML-linux-aarch64 - path: PyYAML*.whl - if-no-files-found: error - cmake-linux-aarch64: - runs-on: - - self-hosted - - Linux - - ARM64 - container: quay.io/pypa/manylinux_2_28_aarch64 - needs: PyYAML-linux-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'cmake' || inputs.name - == 'torch') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies + rustflags: "-A warnings -A unexpected-cfgs -A unused-macros -A static-mut-refs -A unused-variables -A unused-imports" + cache: false + - name: Build wheels run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from PyYAML - uses: actions/download-artifact@main - continue-on-error: true - with: - name: PyYAML-linux-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) cmake - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: cmake-linux-aarch64 - path: cmake*.whl - if-no-files-found: error - ujson-linux-aarch64: - runs-on: - - self-hosted - - Linux - - ARM64 - container: quay.io/pypa/manylinux_2_28_aarch64 - needs: cmake-linux-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'ujson') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from cmake - uses: actions/download-artifact@main - continue-on-error: true - with: - name: cmake-linux-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) ujson - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: ujson-linux-aarch64 - path: ujson*.whl - if-no-files-found: error - torch-linux-aarch64: - runs-on: - - self-hosted - - Linux - - ARM64 - container: quay.io/pypa/manylinux_2_28_aarch64 - needs: - - numpy-linux-aarch64 - - ninja-linux-aarch64 - - cmake-linux-aarch64 - - pybind11-linux-aarch64 - - cffi-linux-aarch64 - - PyYAML-linux-aarch64 - - ujson-linux-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'torch') }} - env: - MAX_JOBS: 4 - BUILD_TEST: 0 - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y openblas-devel /usr/bin/cmake /usr/bin/sudo libffi-devel - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-linux-aarch64 - - name: Download artifacts from ninja - uses: actions/download-artifact@main - continue-on-error: true - with: - name: ninja-linux-aarch64 - - name: Download artifacts from cmake - uses: actions/download-artifact@main - continue-on-error: true - with: - name: cmake-linux-aarch64 - - name: Download artifacts from pybind11 - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pybind11-linux-aarch64 - - name: Download artifacts from cffi - uses: actions/download-artifact@main - continue-on-error: true - with: - name: cffi-linux-aarch64 - - name: Download artifacts from PyYAML - uses: actions/download-artifact@main - continue-on-error: true - with: - name: PyYAML-linux-aarch64 - - name: Download artifacts from ujson - uses: actions/download-artifact@main - continue-on-error: true - with: - name: ujson-linux-aarch64 - - name: Build wheel - run: |- - export USE_CUDA=0 - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) torch + export PIP_GRAALPY_PATCHES_URL="${GITHUB_WORKSPACE}/graalpython/lib-graalpython/patches" + python3 -m venv wheelbuilder_venv + wheelbuilder_venv/bin/python3 scripts/wheelbuilder/build_wheels.py ${{ inputs.graalpy_url }} - name: Store wheels uses: actions/upload-artifact@main with: - name: torch-linux-aarch64 - path: torch*.whl + name: wheels + path: wheelhouse/*.whl if-no-files-found: error diff --git a/.github/workflows/build-linux-amd64-wheels.yml b/.github/workflows/build-linux-amd64-wheels.yml index ee070f604b..03578196c4 100644 --- a/.github/workflows/build-linux-amd64-wheels.yml +++ b/.github/workflows/build-linux-amd64-wheels.yml @@ -2,969 +2,22 @@ name: build-linux-amd64-wheels 'on': workflow_dispatch: inputs: - name: + packages: type: string - description: Pkg to build (empty for all) + description: Pkgs to build (comma-separated, empty for all) required: false - graalpy: + graalpy_url: type: string - description: GraalPy download url prefix (empty for default) - required: false + description: GraalPy download url + required: true jobs: - psutil-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'psutil' || inputs.name - == 'tensorflow') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) psutil - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: psutil-linux-amd64 - path: psutil*.whl - if-no-files-found: error - numpy-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: psutil-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'numpy' || inputs.name - == 'pandas' || inputs.name == 'contourpy' || inputs.name == 'matplotlib' || - inputs.name == 'scipy' || inputs.name == 'scikit-learn' || inputs.name == 'torch' - || inputs.name == 'opt_einsum' || inputs.name == 'Keras_Preprocessing' || inputs.name - == 'tensorflow') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y gcc-toolset-12-gcc-gfortran openblas-devel - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from psutil - uses: actions/download-artifact@main - continue-on-error: true - with: - name: psutil-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) numpy - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: numpy-linux-amd64 - path: numpy*.whl - if-no-files-found: error - pandas-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: numpy-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'pandas') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y openblas - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) pandas - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: pandas-linux-amd64 - path: pandas*.whl - if-no-files-found: error - pybind11-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: pandas-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'pybind11' || inputs.name - == 'contourpy' || inputs.name == 'kiwisolver' || inputs.name == 'torch' || inputs.name - == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from pandas - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pandas-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) pybind11 - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: pybind11-linux-amd64 - path: pybind11*.whl - if-no-files-found: error - ninja-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: pybind11-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'ninja' || inputs.name - == 'contourpy' || inputs.name == 'torch' || inputs.name == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from pybind11 - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pybind11-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) ninja - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: ninja-linux-amd64 - path: ninja*.whl - if-no-files-found: error - pillow-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: ninja-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'pillow' || inputs.name - == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y libtiff-devel libjpeg-devel openjpeg2-devel zlib-devel freetype-devel lcms2-devel libwebp-devel - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from ninja - uses: actions/download-artifact@main - continue-on-error: true - with: - name: ninja-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) pillow - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: pillow-linux-amd64 - path: pillow*.whl - if-no-files-found: error - contourpy-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: - - ninja-linux-amd64 - - pybind11-linux-amd64 - - numpy-linux-amd64 - - pillow-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'contourpy' || inputs.name - == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from ninja - uses: actions/download-artifact@main - continue-on-error: true - with: - name: ninja-linux-amd64 - - name: Download artifacts from pybind11 - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pybind11-linux-amd64 - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-linux-amd64 - - name: Download artifacts from pillow - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pillow-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) contourpy - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: contourpy-linux-amd64 - path: contourpy*.whl - if-no-files-found: error - kiwisolver-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: - - pybind11-linux-amd64 - - contourpy-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'kiwisolver' || inputs.name - == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from pybind11 - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pybind11-linux-amd64 - - name: Download artifacts from contourpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: contourpy-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) kiwisolver - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: kiwisolver-linux-amd64 - path: kiwisolver*.whl - if-no-files-found: error - matplotlib-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: - - pillow-linux-amd64 - - kiwisolver-linux-amd64 - - numpy-linux-amd64 - - contourpy-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y openblas - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from pillow - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pillow-linux-amd64 - - name: Download artifacts from kiwisolver - uses: actions/download-artifact@main - continue-on-error: true - with: - name: kiwisolver-linux-amd64 - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-linux-amd64 - - name: Download artifacts from contourpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: contourpy-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) matplotlib - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: matplotlib-linux-amd64 - path: matplotlib*.whl - if-no-files-found: error - scipy-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: - - numpy-linux-amd64 - - matplotlib-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'scipy' || inputs.name - == 'scikit-learn') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y gcc-toolset-12-gcc-gfortran openblas-devel - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-linux-amd64 - - name: Download artifacts from matplotlib - uses: actions/download-artifact@main - continue-on-error: true - with: - name: matplotlib-linux-amd64 - - name: Build wheel - run: |- - export FFLAGS=-fallow-argument-mismatch - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) scipy - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: scipy-linux-amd64 - path: scipy*.whl - if-no-files-found: error - scikit-learn-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: - - numpy-linux-amd64 - - scipy-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'scikit-learn') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y openblas - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-linux-amd64 - - name: Download artifacts from scipy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: scipy-linux-amd64 - - name: Build wheel - run: |- - export FFLAGS=-fallow-argument-mismatch - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) scikit-learn - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: scikit-learn-linux-amd64 - path: scikit*learn*.whl - if-no-files-found: error - cffi-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: scikit-learn-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'cffi' || inputs.name - == 'torch') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y libffi-devel - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from scikit-learn - uses: actions/download-artifact@main - continue-on-error: true - with: - name: scikit-learn-linux-amd64 - - name: Build wheel - run: |- - graalpy/bin/graalpy -m pip install wheel - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) cffi - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: cffi-linux-amd64 - path: cffi*.whl - if-no-files-found: error - PyYAML-linux-amd64: - runs-on: ubuntu-latest + build_wheels: + runs-on: + - ubuntu-latest container: quay.io/pypa/manylinux_2_28_x86_64 - needs: cffi-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'PyYAML' || inputs.name - == 'torch') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from cffi - uses: actions/download-artifact@main - continue-on-error: true - with: - name: cffi-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) PyYAML - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: PyYAML-linux-amd64 - path: PyYAML*.whl - if-no-files-found: error - cmake-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: PyYAML-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'cmake' || inputs.name - == 'torch') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from PyYAML - uses: actions/download-artifact@main - continue-on-error: true - with: - name: PyYAML-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) cmake - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: cmake-linux-amd64 - path: cmake*.whl - if-no-files-found: error - ujson-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: cmake-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'ujson') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from cmake - uses: actions/download-artifact@main - continue-on-error: true - with: - name: cmake-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) ujson - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: ujson-linux-amd64 - path: ujson*.whl - if-no-files-found: error - torch-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: - - numpy-linux-amd64 - - ninja-linux-amd64 - - cmake-linux-amd64 - - pybind11-linux-amd64 - - cffi-linux-amd64 - - PyYAML-linux-amd64 - - ujson-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'torch') }} env: - MAX_JOBS: 4 - BUILD_TEST: 0 - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y openblas-devel /usr/bin/cmake /usr/bin/sudo libffi-devel - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-linux-amd64 - - name: Download artifacts from ninja - uses: actions/download-artifact@main - continue-on-error: true - with: - name: ninja-linux-amd64 - - name: Download artifacts from cmake - uses: actions/download-artifact@main - continue-on-error: true - with: - name: cmake-linux-amd64 - - name: Download artifacts from pybind11 - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pybind11-linux-amd64 - - name: Download artifacts from cffi - uses: actions/download-artifact@main - continue-on-error: true - with: - name: cffi-linux-amd64 - - name: Download artifacts from PyYAML - uses: actions/download-artifact@main - continue-on-error: true - with: - name: PyYAML-linux-amd64 - - name: Download artifacts from ujson - uses: actions/download-artifact@main - continue-on-error: true - with: - name: ujson-linux-amd64 - - name: Build wheel - run: |- - export USE_CUDA=0 - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) torch - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: torch-linux-amd64 - path: torch*.whl - if-no-files-found: error - opt_einsum-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: - - numpy-linux-amd64 - - torch-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'opt_einsum' || inputs.name - == 'tensorflow') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-linux-amd64 - - name: Download artifacts from torch - uses: actions/download-artifact@main - continue-on-error: true - with: - name: torch-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) opt_einsum - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: opt_einsum-linux-amd64 - path: opt*einsum*.whl - if-no-files-found: error - Keras_Preprocessing-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: - - numpy-linux-amd64 - - opt_einsum-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'Keras_Preprocessing' - || inputs.name == 'tensorflow') }} + PACKAGES_TO_BUILD: ${{ inputs.packages }} steps: - - uses: ilammy/msvc-dev-cmd@v1 - name: Install dependencies run: | dnf install -y epel-release @@ -974,336 +27,18 @@ jobs: dnf install -y /usr/bin/patch - name: Checkout uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-linux-amd64 - - name: Download artifacts from opt_einsum - uses: actions/download-artifact@main - continue-on-error: true - with: - name: opt_einsum-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) Keras_Preprocessing - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: Keras_Preprocessing-linux-amd64 - path: Keras*Preprocessing*.whl - if-no-files-found: error - grpcio-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: Keras_Preprocessing-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'grpcio' || inputs.name - == 'tensorflow') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from Keras_Preprocessing - uses: actions/download-artifact@main - continue-on-error: true + - uses: actions-rust-lang/setup-rust-toolchain@v1 with: - name: Keras_Preprocessing-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) grpcio - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: grpcio-linux-amd64 - path: grpcio*.whl - if-no-files-found: error - ml_dtypes-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: grpcio-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'ml_dtypes' || inputs.name - == 'tensorflow') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from grpcio - uses: actions/download-artifact@main - continue-on-error: true - with: - name: grpcio-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) ml_dtypes - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: ml_dtypes-linux-amd64 - path: ml*dtypes*.whl - if-no-files-found: error - wrapt-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: ml_dtypes-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'wrapt' || inputs.name - == 'tensorflow') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies + rustflags: "-A warnings -A unexpected-cfgs -A unused-macros -A static-mut-refs -A unused-variables -A unused-imports" + cache: false + - name: Build wheels run: | - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from ml_dtypes - uses: actions/download-artifact@main - continue-on-error: true - with: - name: ml_dtypes-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) wrapt - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: wrapt-linux-amd64 - path: wrapt*.whl - if-no-files-found: error - h5py-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: wrapt-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'h5py' || inputs.name - == 'tensorflow') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y hdf5-devel - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from wrapt - uses: actions/download-artifact@main - continue-on-error: true - with: - name: wrapt-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) h5py - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: h5py-linux-amd64 - path: h5py*.whl - if-no-files-found: error - tensorflow-linux-amd64: - runs-on: ubuntu-latest - container: quay.io/pypa/manylinux_2_28_x86_64 - needs: - - grpcio-linux-amd64 - - psutil-linux-amd64 - - wrapt-linux-amd64 - - ml_dtypes-linux-amd64 - - h5py-linux-amd64 - - numpy-linux-amd64 - - opt_einsum-linux-amd64 - - Keras_Preprocessing-linux-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'tensorflow') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: |- - dnf install -y epel-release - crb enable - dnf makecache --refresh - dnf module install -y nodejs:18 - dnf install -y /usr/bin/patch - dnf install -y openblas-devel /usr/bin/cmake /usr/bin/sudo /usr/bin/curl java-11-openjdk-devel - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-linux-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from grpcio - uses: actions/download-artifact@main - continue-on-error: true - with: - name: grpcio-linux-amd64 - - name: Download artifacts from psutil - uses: actions/download-artifact@main - continue-on-error: true - with: - name: psutil-linux-amd64 - - name: Download artifacts from wrapt - uses: actions/download-artifact@main - continue-on-error: true - with: - name: wrapt-linux-amd64 - - name: Download artifacts from ml_dtypes - uses: actions/download-artifact@main - continue-on-error: true - with: - name: ml_dtypes-linux-amd64 - - name: Download artifacts from h5py - uses: actions/download-artifact@main - continue-on-error: true - with: - name: h5py-linux-amd64 - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-linux-amd64 - - name: Download artifacts from opt_einsum - uses: actions/download-artifact@main - continue-on-error: true - with: - name: opt_einsum-linux-amd64 - - name: Download artifacts from Keras_Preprocessing - uses: actions/download-artifact@main - continue-on-error: true - with: - name: Keras_Preprocessing-linux-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - pip install pip numpy wheel packaging requests opt_einsum - pip install keras_preprocessing --no-deps - curl -L https://github.com/bazelbuild/bazel/releases/download/6.4.0/bazel-6.4.0-linux-x86_64 -o $(pwd)/graalpy/bin/bazel - chmod +x graalpy/bin/bazel - export PATH=$(pwd)/graalpy/bin/:$PATH - bazel --version - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) tensorflow + export PIP_GRAALPY_PATCHES_URL="${GITHUB_WORKSPACE}/graalpython/lib-graalpython/patches" + python3 -m venv wheelbuilder_venv + wheelbuilder_venv/bin/python3 scripts/wheelbuilder/build_wheels.py ${{ inputs.graalpy_url }} - name: Store wheels uses: actions/upload-artifact@main with: - name: tensorflow-linux-amd64 - path: tensorflow*.whl + name: wheels + path: wheelhouse/*.whl if-no-files-found: error diff --git a/.github/workflows/build-macos-aarch64-wheels.yml b/.github/workflows/build-macos-aarch64-wheels.yml index f69141f605..0e74bcea44 100644 --- a/.github/workflows/build-macos-aarch64-wheels.yml +++ b/.github/workflows/build-macos-aarch64-wheels.yml @@ -2,781 +2,37 @@ name: build-macos-aarch64-wheels 'on': workflow_dispatch: inputs: - name: + packages: type: string - description: Pkg to build (empty for all) + description: Pkgs to build (comma-separated, empty for all) required: false - graalpy: + graalpy_url: type: string - description: GraalPy download url prefix (empty for default) - required: false + description: GraalPy download url + required: true jobs: - psutil-macos-aarch64: - runs-on: macos-latest - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'psutil') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) psutil - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: psutil-macos-aarch64 - path: psutil*.whl - if-no-files-found: error - numpy-macos-aarch64: - runs-on: macos-latest - needs: psutil-macos-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'numpy' || inputs.name - == 'pandas' || inputs.name == 'contourpy' || inputs.name == 'matplotlib' || - inputs.name == 'scipy' || inputs.name == 'scikit-learn' || inputs.name == 'torch') - }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: brew install gcc openblas - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from psutil - uses: actions/download-artifact@main - continue-on-error: true - with: - name: psutil-macos-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) numpy - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: numpy-macos-aarch64 - path: numpy*.whl - if-no-files-found: error - pandas-macos-aarch64: - runs-on: macos-latest - needs: numpy-macos-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'pandas') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: brew install openblas - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-macos-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) pandas - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: pandas-macos-aarch64 - path: pandas*.whl - if-no-files-found: error - pybind11-macos-aarch64: - runs-on: macos-latest - needs: pandas-macos-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'pybind11' || inputs.name - == 'contourpy' || inputs.name == 'kiwisolver' || inputs.name == 'torch' || inputs.name - == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from pandas - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pandas-macos-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) pybind11 - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: pybind11-macos-aarch64 - path: pybind11*.whl - if-no-files-found: error - ninja-macos-aarch64: - runs-on: macos-latest - needs: pybind11-macos-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'ninja' || inputs.name - == 'contourpy' || inputs.name == 'torch' || inputs.name == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from pybind11 - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pybind11-macos-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) ninja - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: ninja-macos-aarch64 - path: ninja*.whl - if-no-files-found: error - pillow-macos-aarch64: - runs-on: macos-latest - needs: ninja-macos-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'pillow' || inputs.name - == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: brew install libjpeg libtiff little-cms2 openjpeg webp - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from ninja - uses: actions/download-artifact@main - continue-on-error: true - with: - name: ninja-macos-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) pillow - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: pillow-macos-aarch64 - path: pillow*.whl - if-no-files-found: error - contourpy-macos-aarch64: - runs-on: macos-latest - needs: - - ninja-macos-aarch64 - - pybind11-macos-aarch64 - - numpy-macos-aarch64 - - pillow-macos-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'contourpy' || inputs.name - == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from ninja - uses: actions/download-artifact@main - continue-on-error: true - with: - name: ninja-macos-aarch64 - - name: Download artifacts from pybind11 - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pybind11-macos-aarch64 - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-macos-aarch64 - - name: Download artifacts from pillow - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pillow-macos-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) contourpy - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: contourpy-macos-aarch64 - path: contourpy*.whl - if-no-files-found: error - kiwisolver-macos-aarch64: - runs-on: macos-latest - needs: - - pybind11-macos-aarch64 - - contourpy-macos-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'kiwisolver' || inputs.name - == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from pybind11 - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pybind11-macos-aarch64 - - name: Download artifacts from contourpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: contourpy-macos-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) kiwisolver - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: kiwisolver-macos-aarch64 - path: kiwisolver*.whl - if-no-files-found: error - matplotlib-macos-aarch64: - runs-on: macos-latest - needs: - - pillow-macos-aarch64 - - kiwisolver-macos-aarch64 - - numpy-macos-aarch64 - - contourpy-macos-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: brew install openblas - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from pillow - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pillow-macos-aarch64 - - name: Download artifacts from kiwisolver - uses: actions/download-artifact@main - continue-on-error: true - with: - name: kiwisolver-macos-aarch64 - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-macos-aarch64 - - name: Download artifacts from contourpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: contourpy-macos-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) matplotlib - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: matplotlib-macos-aarch64 - path: matplotlib*.whl - if-no-files-found: error - scipy-macos-aarch64: - runs-on: macos-latest - needs: - - numpy-macos-aarch64 - - matplotlib-macos-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'scipy' || inputs.name - == 'scikit-learn') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: brew install gcc openblas pkg-config - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-macos-aarch64 - - name: Download artifacts from matplotlib - uses: actions/download-artifact@main - continue-on-error: true - with: - name: matplotlib-macos-aarch64 - - name: Build wheel - run: |- - export PKG_CONFIG_PATH=/opt/homebrew/opt/openblas/lib/pkgconfig - export FFLAGS=-fallow-argument-mismatch - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) scipy - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: scipy-macos-aarch64 - path: scipy*.whl - if-no-files-found: error - scikit-learn-macos-aarch64: + build_wheels: runs-on: macos-latest - needs: - - numpy-macos-aarch64 - - scipy-macos-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'scikit-learn') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: brew install openblas - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-macos-aarch64 - - name: Download artifacts from scipy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: scipy-macos-aarch64 - - name: Build wheel - run: |- - export PKG_CONFIG_PATH=/opt/homebrew/opt/openblas/lib/pkgconfig - export FFLAGS=-fallow-argument-mismatch - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) scikit-learn - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: scikit-learn-macos-aarch64 - path: scikit*learn*.whl - if-no-files-found: error - cffi-macos-aarch64: - runs-on: macos-latest - needs: scikit-learn-macos-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'cffi' || inputs.name - == 'torch') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: brew install libffi - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from scikit-learn - uses: actions/download-artifact@main - continue-on-error: true - with: - name: scikit-learn-macos-aarch64 - - name: Build wheel - run: |- - graalpy/bin/graalpy -m pip install wheel - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) cffi - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: cffi-macos-aarch64 - path: cffi*.whl - if-no-files-found: error - PyYAML-macos-aarch64: - runs-on: macos-latest - needs: cffi-macos-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'PyYAML' || inputs.name - == 'torch') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from cffi - uses: actions/download-artifact@main - continue-on-error: true - with: - name: cffi-macos-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) PyYAML - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: PyYAML-macos-aarch64 - path: PyYAML*.whl - if-no-files-found: error - cmake-macos-aarch64: - runs-on: macos-latest - needs: PyYAML-macos-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'cmake' || inputs.name - == 'torch') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from PyYAML - uses: actions/download-artifact@main - continue-on-error: true - with: - name: PyYAML-macos-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) cmake - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: cmake-macos-aarch64 - path: cmake*.whl - if-no-files-found: error - ujson-macos-aarch64: - runs-on: macos-latest - needs: cmake-macos-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'ujson') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from cmake - uses: actions/download-artifact@main - continue-on-error: true - with: - name: cmake-macos-aarch64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) ujson - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: ujson-macos-aarch64 - path: ujson*.whl - if-no-files-found: error - torch-macos-aarch64: - runs-on: macos-latest - needs: - - numpy-macos-aarch64 - - ninja-macos-aarch64 - - cmake-macos-aarch64 - - pybind11-macos-aarch64 - - cffi-macos-aarch64 - - PyYAML-macos-aarch64 - - ujson-macos-aarch64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'torch') }} env: - MAX_JOBS: 4 - BUILD_TEST: 0 + PACKAGES_TO_BUILD: ${{ inputs.packages }} steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: brew install openblas cmake libffi - name: Checkout uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-aarch64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-macos-aarch64 - - name: Download artifacts from ninja - uses: actions/download-artifact@main - continue-on-error: true + - uses: actions-rust-lang/setup-rust-toolchain@v1 with: - name: ninja-macos-aarch64 - - name: Download artifacts from cmake - uses: actions/download-artifact@main - continue-on-error: true - with: - name: cmake-macos-aarch64 - - name: Download artifacts from pybind11 - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pybind11-macos-aarch64 - - name: Download artifacts from cffi - uses: actions/download-artifact@main - continue-on-error: true - with: - name: cffi-macos-aarch64 - - name: Download artifacts from PyYAML - uses: actions/download-artifact@main - continue-on-error: true - with: - name: PyYAML-macos-aarch64 - - name: Download artifacts from ujson - uses: actions/download-artifact@main - continue-on-error: true + rustflags: "-A warnings -A unexpected-cfgs -A unused-macros -A static-mut-refs -A unused-variables -A unused-imports" + cache: false + - name: Setup Python + uses: actions/setup-python@v5 with: - name: ujson-macos-aarch64 - - name: Build wheel - run: |- - export USE_CUDA=0 - export PKG_CONFIG_PATH=/opt/homebrew/opt/openblas/lib/pkgconfig - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) torch + python-version: 3.12 + - name: Build wheels + run: | + export PIP_GRAALPY_PATCHES_URL="${GITHUB_WORKSPACE}/graalpython/lib-graalpython/patches" + python3 scripts/wheelbuilder/build_wheels.py ${{ inputs.graalpy_url }} - name: Store wheels uses: actions/upload-artifact@main with: - name: torch-macos-aarch64 - path: torch*.whl + name: wheels + path: wheelhouse/*.whl if-no-files-found: error diff --git a/.github/workflows/build-macos-amd64-wheels.yml b/.github/workflows/build-macos-amd64-wheels.yml index 1ba8c2ee49..b6bd9a4226 100644 --- a/.github/workflows/build-macos-amd64-wheels.yml +++ b/.github/workflows/build-macos-amd64-wheels.yml @@ -2,781 +2,37 @@ name: build-macos-amd64-wheels 'on': workflow_dispatch: inputs: - name: + packages: type: string - description: Pkg to build (empty for all) + description: Pkgs to build (comma-separated, empty for all) required: false - graalpy: + graalpy_url: type: string - description: GraalPy download url prefix (empty for default) - required: false + description: GraalPy download url + required: true jobs: - psutil-macos-amd64: - runs-on: macos-12 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'psutil') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) psutil - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: psutil-macos-amd64 - path: psutil*.whl - if-no-files-found: error - numpy-macos-amd64: - runs-on: macos-12 - needs: psutil-macos-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'numpy' || inputs.name - == 'pandas' || inputs.name == 'contourpy' || inputs.name == 'matplotlib' || - inputs.name == 'scipy' || inputs.name == 'scikit-learn' || inputs.name == 'torch') - }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: brew install gcc openblas - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from psutil - uses: actions/download-artifact@main - continue-on-error: true - with: - name: psutil-macos-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) numpy - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: numpy-macos-amd64 - path: numpy*.whl - if-no-files-found: error - pandas-macos-amd64: - runs-on: macos-12 - needs: numpy-macos-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'pandas') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: brew install openblas - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-macos-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) pandas - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: pandas-macos-amd64 - path: pandas*.whl - if-no-files-found: error - pybind11-macos-amd64: - runs-on: macos-12 - needs: pandas-macos-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'pybind11' || inputs.name - == 'contourpy' || inputs.name == 'kiwisolver' || inputs.name == 'torch' || inputs.name - == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from pandas - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pandas-macos-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) pybind11 - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: pybind11-macos-amd64 - path: pybind11*.whl - if-no-files-found: error - ninja-macos-amd64: - runs-on: macos-12 - needs: pybind11-macos-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'ninja' || inputs.name - == 'contourpy' || inputs.name == 'torch' || inputs.name == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from pybind11 - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pybind11-macos-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) ninja - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: ninja-macos-amd64 - path: ninja*.whl - if-no-files-found: error - pillow-macos-amd64: - runs-on: macos-12 - needs: ninja-macos-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'pillow' || inputs.name - == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: brew install libjpeg libtiff little-cms2 openjpeg webp - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from ninja - uses: actions/download-artifact@main - continue-on-error: true - with: - name: ninja-macos-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) pillow - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: pillow-macos-amd64 - path: pillow*.whl - if-no-files-found: error - contourpy-macos-amd64: - runs-on: macos-12 - needs: - - ninja-macos-amd64 - - pybind11-macos-amd64 - - numpy-macos-amd64 - - pillow-macos-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'contourpy' || inputs.name - == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from ninja - uses: actions/download-artifact@main - continue-on-error: true - with: - name: ninja-macos-amd64 - - name: Download artifacts from pybind11 - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pybind11-macos-amd64 - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-macos-amd64 - - name: Download artifacts from pillow - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pillow-macos-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) contourpy - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: contourpy-macos-amd64 - path: contourpy*.whl - if-no-files-found: error - kiwisolver-macos-amd64: - runs-on: macos-12 - needs: - - pybind11-macos-amd64 - - contourpy-macos-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'kiwisolver' || inputs.name - == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from pybind11 - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pybind11-macos-amd64 - - name: Download artifacts from contourpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: contourpy-macos-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) kiwisolver - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: kiwisolver-macos-amd64 - path: kiwisolver*.whl - if-no-files-found: error - matplotlib-macos-amd64: - runs-on: macos-12 - needs: - - pillow-macos-amd64 - - kiwisolver-macos-amd64 - - numpy-macos-amd64 - - contourpy-macos-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'matplotlib') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: brew install openblas - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from pillow - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pillow-macos-amd64 - - name: Download artifacts from kiwisolver - uses: actions/download-artifact@main - continue-on-error: true - with: - name: kiwisolver-macos-amd64 - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-macos-amd64 - - name: Download artifacts from contourpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: contourpy-macos-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) matplotlib - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: matplotlib-macos-amd64 - path: matplotlib*.whl - if-no-files-found: error - scipy-macos-amd64: - runs-on: macos-12 - needs: - - numpy-macos-amd64 - - matplotlib-macos-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'scipy' || inputs.name - == 'scikit-learn') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: brew install gcc openblas pkg-config - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-macos-amd64 - - name: Download artifacts from matplotlib - uses: actions/download-artifact@main - continue-on-error: true - with: - name: matplotlib-macos-amd64 - - name: Build wheel - run: |- - export PKG_CONFIG_PATH=/opt/homebrew/opt/openblas/lib/pkgconfig - export FFLAGS=-fallow-argument-mismatch - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) scipy - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: scipy-macos-amd64 - path: scipy*.whl - if-no-files-found: error - scikit-learn-macos-amd64: + build_wheels: runs-on: macos-12 - needs: - - numpy-macos-amd64 - - scipy-macos-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'scikit-learn') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: brew install openblas - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-macos-amd64 - - name: Download artifacts from scipy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: scipy-macos-amd64 - - name: Build wheel - run: |- - export PKG_CONFIG_PATH=/opt/homebrew/opt/openblas/lib/pkgconfig - export FFLAGS=-fallow-argument-mismatch - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) scikit-learn - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: scikit-learn-macos-amd64 - path: scikit*learn*.whl - if-no-files-found: error - cffi-macos-amd64: - runs-on: macos-12 - needs: scikit-learn-macos-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'cffi' || inputs.name - == 'torch') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: brew install libffi - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from scikit-learn - uses: actions/download-artifact@main - continue-on-error: true - with: - name: scikit-learn-macos-amd64 - - name: Build wheel - run: |- - graalpy/bin/graalpy -m pip install wheel - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) cffi - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: cffi-macos-amd64 - path: cffi*.whl - if-no-files-found: error - PyYAML-macos-amd64: - runs-on: macos-12 - needs: cffi-macos-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'PyYAML' || inputs.name - == 'torch') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from cffi - uses: actions/download-artifact@main - continue-on-error: true - with: - name: cffi-macos-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) PyYAML - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: PyYAML-macos-amd64 - path: PyYAML*.whl - if-no-files-found: error - cmake-macos-amd64: - runs-on: macos-12 - needs: PyYAML-macos-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'cmake' || inputs.name - == 'torch') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from PyYAML - uses: actions/download-artifact@main - continue-on-error: true - with: - name: PyYAML-macos-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) cmake - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: cmake-macos-amd64 - path: cmake*.whl - if-no-files-found: error - ujson-macos-amd64: - runs-on: macos-12 - needs: cmake-macos-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'ujson') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from cmake - uses: actions/download-artifact@main - continue-on-error: true - with: - name: cmake-macos-amd64 - - name: Build wheel - run: |- - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) ujson - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: ujson-macos-amd64 - path: ujson*.whl - if-no-files-found: error - torch-macos-amd64: - runs-on: macos-12 - needs: - - numpy-macos-amd64 - - ninja-macos-amd64 - - cmake-macos-amd64 - - pybind11-macos-amd64 - - cffi-macos-amd64 - - PyYAML-macos-amd64 - - ujson-macos-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'torch') }} env: - MAX_JOBS: 4 - BUILD_TEST: 0 + PACKAGES_TO_BUILD: ${{ inputs.packages }} steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: brew install openblas cmake libffi - name: Checkout uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - curl -L -o graalpy.tar.gz ${{ inputs.graalpy }}-macos-amd64.tar.gz - mkdir -p graalpy - tar -C $(pwd)/graalpy --strip-components=1 -xzf graalpy.tar.gz - graalpy/bin/graalpy -s -m ensurepip - graalpy/bin/graalpy -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-macos-amd64 - - name: Download artifacts from ninja - uses: actions/download-artifact@main - continue-on-error: true + - uses: actions-rust-lang/setup-rust-toolchain@v1 with: - name: ninja-macos-amd64 - - name: Download artifacts from cmake - uses: actions/download-artifact@main - continue-on-error: true - with: - name: cmake-macos-amd64 - - name: Download artifacts from pybind11 - uses: actions/download-artifact@main - continue-on-error: true - with: - name: pybind11-macos-amd64 - - name: Download artifacts from cffi - uses: actions/download-artifact@main - continue-on-error: true - with: - name: cffi-macos-amd64 - - name: Download artifacts from PyYAML - uses: actions/download-artifact@main - continue-on-error: true - with: - name: PyYAML-macos-amd64 - - name: Download artifacts from ujson - uses: actions/download-artifact@main - continue-on-error: true + rustflags: "-A warnings -A unexpected-cfgs -A unused-macros -A static-mut-refs -A unused-variables -A unused-imports" + cache: false + - name: Setup Python + uses: actions/setup-python@v5 with: - name: ujson-macos-amd64 - - name: Build wheel - run: |- - export USE_CUDA=0 - export PKG_CONFIG_PATH=/opt/homebrew/opt/openblas/lib/pkgconfig - export PIP_FIND_LINKS=$(pwd) - export PATH=$(pwd)/graalpy/bin/:$PATH - graalpy/bin/graalpy -m pip wheel --find-links $(pwd) torch + python-version: 3.12 + - name: Build wheels + run: | + export PIP_GRAALPY_PATCHES_URL="${GITHUB_WORKSPACE}/graalpython/lib-graalpython/patches" + python3 scripts/wheelbuilder/build_wheels.py ${{ inputs.graalpy_url }} - name: Store wheels uses: actions/upload-artifact@main with: - name: torch-macos-amd64 - path: torch*.whl + name: wheels + path: wheelhouse/*.whl if-no-files-found: error diff --git a/.github/workflows/build-repository.yml b/.github/workflows/build-repository.yml deleted file mode 100644 index 942b814d88..0000000000 --- a/.github/workflows/build-repository.yml +++ /dev/null @@ -1,60 +0,0 @@ -name: build-repository -'on': workflow_dispatch -jobs: - build-repo: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Download artifacts for linux-amd64 - uses: dawidd6/action-download-artifact@268677152d06ba59fcec7a7f0b5d961b6ccd7e1e - continue-on-error: true - with: - workflow: build-linux-amd64-wheels.yml - workflow_conclusion: '' - if_no_artifact_found: warn - allow_forks: 'false' - - name: Download artifacts for linux-aarch64 - uses: dawidd6/action-download-artifact@268677152d06ba59fcec7a7f0b5d961b6ccd7e1e - continue-on-error: true - with: - workflow: build-linux-aarch64-wheels.yml - workflow_conclusion: '' - if_no_artifact_found: warn - allow_forks: 'false' - - name: Download artifacts for macos-amd64 - uses: dawidd6/action-download-artifact@268677152d06ba59fcec7a7f0b5d961b6ccd7e1e - continue-on-error: true - with: - workflow: build-macos-amd64-wheels.yml - workflow_conclusion: '' - if_no_artifact_found: warn - allow_forks: 'false' - - name: Download artifacts for macos-aarch64 - uses: dawidd6/action-download-artifact@268677152d06ba59fcec7a7f0b5d961b6ccd7e1e - continue-on-error: true - with: - workflow: build-macos-aarch64-wheels.yml - workflow_conclusion: '' - if_no_artifact_found: warn - allow_forks: 'false' - - name: Download artifacts for windows-amd64 - uses: dawidd6/action-download-artifact@268677152d06ba59fcec7a7f0b5d961b6ccd7e1e - continue-on-error: true - with: - workflow: build-windows-amd64-wheels.yml - workflow_conclusion: '' - if_no_artifact_found: warn - allow_forks: 'false' - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.10' - - name: Create repository - run: python ${GITHUB_WORKSPACE}/scripts/wheelbuilder/generate_repository.py - - name: Store repository - uses: umutozd/upload-artifact@5c459179e7745e2c730c50b10a6459da0b6f25db - with: - name: repository - path: repository.zip - if-no-files-found: error diff --git a/.github/workflows/build-windows-amd64-wheels.yml b/.github/workflows/build-windows-amd64-wheels.yml index 00a18a2c40..782524ed7b 100644 --- a/.github/workflows/build-windows-amd64-wheels.yml +++ b/.github/workflows/build-windows-amd64-wheels.yml @@ -2,141 +2,40 @@ name: build-windows-amd64-wheels 'on': workflow_dispatch: inputs: - name: + packages: type: string - description: Pkg to build (empty for all) + description: Pkgs to build (comma-separated, empty for all) required: false - graalpy: + graalpy_url: type: string - description: GraalPy download url prefix (empty for default) - required: false + description: GraalPy download url + required: true jobs: - numpy-windows-amd64: + build_wheels: runs-on: windows-latest - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'numpy') }} + env: + PACKAGES_TO_BUILD: ${{ inputs.packages }} steps: - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - Invoke-WebRequest https://kumisystems.dl.sourceforge.net/project/gnuwin32/patch/2.5.9-7/patch-2.5.9-7-bin.zip -OutFile patch.zip - Expand-Archive patch.zip -DestinationPath ../patch -Force - name: Checkout uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - $ProgressPreference = 'SilentlyContinue' - Invoke-WebRequest ${{ inputs.graalpy }}-windows-amd64.zip -OutFile graalpy-windows-amd64.zip - Expand-Archive graalpy-windows-amd64.zip - mv graalpy-windows-amd64/* graalpy - graalpy/bin/graalpy.exe -s -m ensurepip - graalpy/bin/graalpy.exe -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' + - uses: actions-rust-lang/setup-rust-toolchain@v1 with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Build wheel - run: |- - $env:PIP_FIND_LINKS=$PWD - $env:PATH+=";$PWD\graalpy\bin;$PWD\graalpy\Scripts;$PWD\..\patch\bin" - graalpy/bin/graalpy -m pip wheel --find-links $PWD numpy - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: numpy-windows-amd64 - path: numpy*.whl - if-no-files-found: error - PyYAML-windows-amd64: - runs-on: windows-latest - needs: numpy-windows-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'PyYAML') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies - run: | - Invoke-WebRequest https://kumisystems.dl.sourceforge.net/project/gnuwin32/patch/2.5.9-7/patch-2.5.9-7-bin.zip -OutFile patch.zip - Expand-Archive patch.zip -DestinationPath ../patch -Force - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - $ProgressPreference = 'SilentlyContinue' - Invoke-WebRequest ${{ inputs.graalpy }}-windows-amd64.zip -OutFile graalpy-windows-amd64.zip - Expand-Archive graalpy-windows-amd64.zip - mv graalpy-windows-amd64/* graalpy - graalpy/bin/graalpy.exe -s -m ensurepip - graalpy/bin/graalpy.exe -m pip install wheel - - name: Setup GraalPy + rustflags: "-A warnings -A unexpected-cfgs -A unused-macros -A static-mut-refs -A unused-variables -A unused-imports" + cache: false + - name: Setup Python uses: actions/setup-python@v5 - if: inputs.graalpy == '' with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from numpy - uses: actions/download-artifact@main - continue-on-error: true - with: - name: numpy-windows-amd64 - - name: Build wheel - run: |- - $env:PIP_FIND_LINKS=$PWD - $env:PATH+=";$PWD\graalpy\bin;$PWD\graalpy\Scripts;$PWD\..\patch\bin" - graalpy/bin/graalpy -m pip wheel --find-links $PWD PyYAML - - name: Store wheels - uses: actions/upload-artifact@main - with: - name: PyYAML-windows-amd64 - path: PyYAML*.whl - if-no-files-found: error - ujson-windows-amd64: - runs-on: windows-latest - needs: PyYAML-windows-amd64 - if: ${{ !cancelled() && (inputs.name == '' || inputs.name == 'ujson') }} - steps: - - uses: ilammy/msvc-dev-cmd@v1 - - name: Install dependencies + python-version: 3.12 + - name: Build wheels run: | - Invoke-WebRequest https://kumisystems.dl.sourceforge.net/project/gnuwin32/patch/2.5.9-7/patch-2.5.9-7-bin.zip -OutFile patch.zip - Expand-Archive patch.zip -DestinationPath ../patch -Force - - name: Checkout - uses: actions/checkout@main - - name: Setup custom GraalPy - if: inputs.graalpy != '' - run: |- - $ProgressPreference = 'SilentlyContinue' - Invoke-WebRequest ${{ inputs.graalpy }}-windows-amd64.zip -OutFile graalpy-windows-amd64.zip - Expand-Archive graalpy-windows-amd64.zip - mv graalpy-windows-amd64/* graalpy - graalpy/bin/graalpy.exe -s -m ensurepip - graalpy/bin/graalpy.exe -m pip install wheel - - name: Setup GraalPy - uses: actions/setup-python@v5 - if: inputs.graalpy == '' - with: - python-version: graalpy24.1 - - name: Setup local GraalPy venv - if: inputs.graalpy == '' - run: python -m venv graalpy - - name: Download artifacts from PyYAML - uses: actions/download-artifact@main - continue-on-error: true - with: - name: PyYAML-windows-amd64 - - name: Build wheel - run: |- - $env:PIP_FIND_LINKS=$PWD - $env:PATH+=";$PWD\graalpy\bin;$PWD\graalpy\Scripts;$PWD\..\patch\bin" - graalpy/bin/graalpy -m pip wheel --find-links $PWD ujson + $env:PATH+=";C:\Program Files\Git\usr\bin" + $env:PIP_GRAALPY_PATCHES_URL=$env:GITHUB_WORKSPACE + $env:PIP_GRAALPY_PATCHES_URL+="/graalpython/lib-graalpython/patches" + python3 scripts/wheelbuilder/build_wheels.py ${{ inputs.graalpy_url }} - name: Store wheels uses: actions/upload-artifact@main with: - name: ujson-windows-amd64 - path: ujson*.whl + name: wheels + path: wheelhouse/*.whl if-no-files-found: error diff --git a/.gitignore b/.gitignore index f4da3d24c6..bf2d8928b6 100644 --- a/.gitignore +++ b/.gitignore @@ -70,6 +70,7 @@ Python.asdl.stamp *.jfr .DS_Store +docs/site/_site graalpython/com.oracle.graal.python/src/com/oracle/graal/python/parser/antlr/.antlr/ graalpython/lib-python/3/test/data !graalpython/lib-python/3/test/data/README @@ -94,3 +95,5 @@ graalpython/com.oracle.graal.python.test/src/tests/cpyext/build/ pom-mx.xml .venv !graalpython/com.oracle.graal.python.test/src/tests/standalone/gradle/gradle-test-project/gradle/wrapper/gradle-wrapper.jar +/*-venv/ +.aider* diff --git a/CHANGELOG.md b/CHANGELOG.md index 775ffa6036..737ca73d43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,16 +3,45 @@ This changelog summarizes major changes between GraalVM versions of the Python language runtime. The main focus is on user-observable behavior of the engine. +## Version 25.0.0 +* `sys.implementation.version` now returns the GraalPy version instead of the Python version it implements. Also available as `sys.graalpy_version_info` for better discoverability by people already familiar with PyPy and its `sys.pypy_version_info`. +* `GRAALPY_VERSION_NUM` C macro now inlcudes the release level and serial number at the end to conform to the `hexversion` format. This shouldn't break any existing comparisons. +* `dir(foreign_object)` now returns both foreign methods and Python methods (it used to return only foreign methods). +* Support `__name__`, `__doc__`, `__text_signature__` fields on foreign executables to serve as their proper counterparts on the Python side. This is useful to, for example, use Java functional interfaces in lieu of Python functions for things like LangChain's `@tool` annotation that want to inspect the underlying function. +* Remove support for running C extensions as LLVM bitcode. This also removes the related options `python.UseSystemToolchain` and `python.NativeModules`. +* Remove built-in HPy module. HPy can now be installed and used from the upstream sources. + ## Version 24.2.0 * Updated developer metadata of Maven artifacts. * Added gradle plugin for polyglot embedding of Python packages into Java. * When calling a method on a foreign object in Python code, Python methods are now prioritized over foreign members. +* Added `polyglot.register_interop_type` and `@polyglot.interop_type` to define custom Python methods for a given foreign class/type. See [the documentation](https://github.com/oracle/graalpython/blob/master/docs/user/Interoperability.md#the-interoperability-extension-api) for more information. +* Foreign objects are now given a Python class corresponding to their interop traits. + * Foreign lists now inherit from Python `list`, foreign dictionaries from `dict`, foreign strings from `str`, foreign iterators from `iterator`, foreign exceptions from `BaseException`, foreign numbers from `polyglot.ForeignNumber`, foreign booleans from `polyglot.ForeignBoolean`, and foreign null values from `NoneType`. + * This means all Python methods of these types are available on the corresponding foreign objects, which behave as close as possible as if they were Python objects. + * See [the documentation](https://github.com/oracle/graalpython/blob/master/docs/user/Interoperability.md#interacting-with-foreign-objects-from-python-scripts) for more information. +* Remove support for running with Sulong managed both in embeddings as well as through the `graalpy-managed` launcher. +* Rewrite wheelbuilder to be easier to use and contribute to. This version is now the same we run internally to build publishable wheels for some platforms we support, so the community can build the same wheels on their own hardware easily if desired. +* `pip` is now able to fetch newer versions of GraalPy patches for third-party packages from `graalpython` GitHub repository, allowing us to add new patches to released versions. + * The patch repository can be overridden using `PIP_GRAALPY_PATCHES_URL` environment variable, which can point to a local path or a URL. It can be disabled by setting it to an empty string. +* Added `GRAALPY_VERSION` and `GRAALPY_VERSION_NUM` C macros. +* Remove `ginstall` module. It hasn't been necessary for several releases. Please, use `pip install`. +* Remove experimental `SetupLLVMLibraryPaths` option. It was used to pre-set library path for LLVM toolchain's libc++. The path can still be set manually. +* Added `GRAALPY_VERSION` and `GRAALPY_VERSION_NUM` C macros +* Added experimental `python.IsolateNativeModules` option to allow loading native extensions multiple times in different contexts. See [the documentation](https://github.com/oracle/graalpython/blob/master/docs/user/Native-Extensions.md) for more information. +* GraalPy Embedding: + * Introduced new types: KeywordArguments and PositionalArguments, in the GraalPy Embedding library (org.graalvm.python:python-embedding), to support directly passing [keyword and positional arguments](https://docs.python.org/3/glossary.html#term-argument) from Java to Python. + * Deprecated the org.graalvm.python.embedding.util API package and added new equivalents to org.graalvm.python.embedding + * Maven and Gradle plugins do not embed Python home into the generated virtual filesystem. Instead, the handling of language home for any Truffle language, including GraalPy, for the GraalVM Native Image build can be controlled by new Native Image options +H:IncludeLanguageResources and +H:CopyLanguageResources. By default, the whole Python home is embedded into the native executable. In the case of JVM deployment, the language home is embedded in the GraalPy artifacts at Mavencentral. + * Removed deprecated methods in VirtualFileSystem +* No longer ship `graalpy_virtualenv` virtualenv plugin within the standard library. Instead, inject the dependency on it into virtualenv, so that it gets installed only when necessary and can be uninstalled. +* Rename `graalpy_virtualenv` to `graalpy_virtualenv_seeder`. ## Version 24.1.0 * GraalPy is now considered stable for pure Python workloads. While many workloads involving native extension modules work, we continue to consider them experimental. You can use the command-line option `--python.WarnExperimentalFeatures` to enable warnings for such modules at runtime. In Java embeddings the warnings are enabled by default and you can suppress them by setting the context option 'python.WarnExperimentalFeatures' to 'false'. * Update to Python 3.11.7. * We now provide intrinsified `_pickle` module also in the community version. -* `polyglot.eval` now raises more meaningful exceptions. Unavaliable languages raise `ValueError`. Exceptions from the polyglot language are raised directly as interop objects (typed as `polyglot.ForeignException`). The shortcut for executing python files without specifying language has been removed, use regular `eval` for executing Python code. +* `polyglot.eval` now raises more meaningful exceptions. Unavailable languages raise `ValueError`. Exceptions from the polyglot language are raised directly as interop objects (typed as `polyglot.ForeignException`). The shortcut for executing python files without specifying language has been removed, use regular `eval` for executing Python code. * In Jython emulation mode we now magically fall back to calling Java getters or setters when using Python attribute access for non-visible properties. This can help migrating away from Jython if you relied on this behavior. * The option `python.EmulateJython` to enable Jython emulation is now marked as stable, and can thus be relied upon in production. * Fixed parsing of pyvenv.cfg according to PEP 405, which is required to use [uv](https://github.com/astral-sh/uv?tab=readme-ov-file#uv) generated venvs with GraalPy. @@ -33,10 +62,10 @@ language runtime. The main focus is on user-observable behavior of the engine. * Add option `python.InitialLocale` to change the default locale. If not set, then Java Locale#getDefault is used. * `multiprocessing` module now uses the `spawn` method (creates new processes) by default. The formerly default method that uses threads and multiple Truffle contexts can be selected using `multiprocessing.set_start_method('graalpy')`. * `polyglot` module: add API to redefine Truffle interop messages for external / user defined types. For more details see [The Truffle Interoperability Extension API](docs/user/Interoperability.md). -*Adding integration with jBang (https://www.jbang.dev/) -** running example via `jbang hello@oracle/graalpython` or `jbang hello@oracle/graalpython "print(1*4)"` -** creating new script via: `jbang init --template=graalpy@oracle/graalpython myscript.java` -** creating new script with local maven repo for testing: `jbang init --template=graalpy_local_repo@oracle/graalpython -Dpath_to_local_repo=/absolute/path/to/local/maven/repository myscript.java' +* Adding integration with jBang (https://www.jbang.dev/) + * running example via `jbang hello@oracle/graalpython` or `jbang hello@oracle/graalpython "print(1*4)"` + * creating new script via: `jbang init --template=graalpy@oracle/graalpython myscript.java` + * creating new script with local maven repo for testing: `jbang init --template=graalpy_local_repo@oracle/graalpython -Dpath_to_local_repo=/absolute/path/to/local/maven/repository myscript.java' ## Version 23.1.0 * GraalPy distributions (previously known as GraalPy Enterprise) are now available under the [GFTC license](https://www.oracle.com/downloads/licenses/graal-free-license.html). The community builds published on Github have been renamed to `graalpy-community---.tar.gz`. diff --git a/README.md b/README.md index d4d108e9af..3d42b21e50 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ [![](https://img.shields.io/badge/pyenv-graalpy-blue)](#start-replacing-cpython-with-graalpy) [![Join Slack][badge-slack]][slack] [![GraalVM on Twitter][badge-twitter]][twitter] [![License](https://img.shields.io/badge/license-UPL-green)](#license) -GraalPy is a high-performance implementation of the [Python](https://www.python.org/) language for the JVM built on [GraalVM](https://www.graalvm.org/). -GraalPy is a Python 3.11 compliant runtime. +GraalPy is a high-performance implementation of the Python language for the JVM built on [GraalVM](https://www.graalvm.org/python). +GraalPy is a Python 3.11 compliant runtime. It has first-class support for embedding in Java and can turn Python applications into fast, standalone binaries. GraalPy is ready for production running pure Python code and has experimental support for many popular native extension modules. @@ -24,7 +24,7 @@ GraalPy is ready for production running pure Python code and has experimental su * Support for native extension modules is considered experimental, but you can already install [packages](docs/user/Python-Runtime.md#installing-packages) like *NumPy*, *PyTorch*, or *Tensorflow*; run [Hugging Face](https://huggingface.co/) models like *Stable Diffusion* or *GPT* ![](docs/user/assets/mcd.svg#gh-light-mode-only)![](docs/user/assets/mcd-dark.svg#gh-dark-mode-only) We run the tests of the [most depended on PyPI packages](https://libraries.io/pypi) every day. -For 96% of those packages a recent version can be installed on GraalPy and GraalPy passes about 50% of all tests of all packages combined. +For 97% of those packages a recent version can be installed on GraalPy and GraalPy passes over 60% of all tests of all packages combined. We assume that CPython not passing 100% of all tests is due to problems in our infrastructure that may also affect GraalPy. Packages where CPython fails all tests are marked as "not tested" for both CPython and GraalPy. @@ -54,20 +54,20 @@ Refer to our [embedding documentation](https://www.graalvm.org/latest/reference- org.graalvm.polyglot polyglot - 24.1.0 + 24.2.0 org.graalvm.polyglot python - 24.1.0 + 24.2.0 pom ``` * Gradle ```kotlin - implementation("org.graalvm.polyglot:polyglot:24.1.0") - implementation("org.graalvm.polyglot:python:24.1.0") + implementation("org.graalvm.polyglot:polyglot:24.2.0") + implementation("org.graalvm.polyglot:python:24.2.0") ``` @@ -85,12 +85,12 @@ Thanks to our integration with GraalVM Native Image, we can deploy Python applic * Linux The easiest way to install GraalPy on Linux is to use [Pyenv](https://github.com/pyenv/pyenv) (the Python version manager). - To install version 24.1.0 using Pyenv, run the following commands: + To install version 24.2.0 using Pyenv, run the following commands: ```bash - pyenv install graalpy-24.1.0 + pyenv install graalpy-24.2.0 ``` ```bash - pyenv shell graalpy-24.1.0 + pyenv shell graalpy-24.2.0 ``` > NOTE: There will be a delay between GraalPy release and its availability on Pyenv. Make sure to update Pyenv. @@ -102,12 +102,12 @@ Thanks to our integration with GraalVM Native Image, we can deploy Python applic * macOS The easiest way to install GraalPy on macOS is to use [Pyenv](https://github.com/pyenv/pyenv) (the Python version manager). - To install version 24.1.0 using Pyenv, run the following commands: + To install version 24.2.0 using Pyenv, run the following commands: ```bash - pyenv install graalpy-24.1.0 + pyenv install graalpy-24.2.0 ``` ```bash - pyenv shell graalpy-24.1.0 + pyenv shell graalpy-24.2.0 ``` > NOTE: There will be a delay between GraalPy release and its availability on Pyenv. Make sure to update Pyenv. @@ -120,7 +120,7 @@ Thanks to our integration with GraalVM Native Image, we can deploy Python applic ``` For example: ```bash - sudo xattr -r -d com.apple.quarantine ~/.pyenv/versions/graalpy-24.1.0 + sudo xattr -r -d com.apple.quarantine ~/.pyenv/versions/graalpy-24.2.0 ``` 3. Uncompress the file and update your `PATH` environment variable to include to the _graalpy-XX.Y.Z-macos-amd64/bin_ (or _graalpy-XX.Y.Z-macos-aarch64/bin_) directory. @@ -128,12 +128,12 @@ Thanks to our integration with GraalVM Native Image, we can deploy Python applic The Windows support of GraalPy is still experimental, so not all features and packages may be available. The easiest way to install GraalPy on Windows is to use [Pyenv-win](https://pyenv-win.github.io/pyenv-win/) (the Python version manager for Windows). - To install version 24.1.0 using Pyenv-win, run the following commands: + To install version 24.2.0 using Pyenv-win, run the following commands: ```cmd - pyenv install graalpy-24.1.0-windows-amd64 + pyenv install graalpy-24.2.0-windows-amd64 ``` ```cmd - pyenv shell graalpy-24.1.0-windows-amd64 + pyenv shell graalpy-24.2.0-windows-amd64 ``` > NOTE: There will be a delay between GraalPy release and its availability on Pyenv. Make sure to update Pyenv. @@ -152,7 +152,7 @@ The _setup-python_ action supports GraalPy: - name: Setup GraalPy uses: actions/setup-python@v5 with: - python-version: graalpy # or graalpy24.1 to pin a version + python-version: graalpy # or graalpy24.2 to pin a version ``` @@ -179,7 +179,7 @@ To run Jython scripts, you need to use a GraalPy distribution running on the JVM ``` For example: ```bash - sudo xattr -r -d com.apple.quarantine ~/.pyenv/versions/graalpy-24.1.0 + sudo xattr -r -d com.apple.quarantine ~/.pyenv/versions/graalpy-24.2.0 ``` 3. Uncompress the file and update your `PATH` environment variable to include to the _graalpy-jvm-XX.Y.Z-macos-amd64/bin_ (or _graalpy-jvm-XX.Y.Z-macos-aarch64/bin_) directory. 4. Run your scripts with `graalpy --python.EmulateJython`. diff --git a/bisect-benchmark.ini b/bisect-benchmark.ini index 531b465294..c118098366 100644 --- a/bisect-benchmark.ini +++ b/bisect-benchmark.ini @@ -3,7 +3,7 @@ # Usage: # - Create a temporary branch based on the main branch (or the bad commit) # - Fill in this configuration file, preferably using the automated script -# graalpython-apptests/scripts/create-bisect-config +# graal-enterprise/graalpython-enterprise/scripts/create-bisect-config # - Commit and push the file # - The push command output should give you a link to create a PR. Open it, but # don't create a PR. Instead, you should execute the job on your commit using diff --git a/ci.jsonnet b/ci.jsonnet index 27d2901e7c..20a3bc7c16 100644 --- a/ci.jsonnet +++ b/ci.jsonnet @@ -1 +1 @@ -{ "overlay": "2c97f9a352b2773941722f15612bd5c531f63489" } +{ "overlay": "a74e2e4ae250150f0f974c20c80ac212a9116ea1" } diff --git a/docs/contributor/CONTRIBUTING.md b/docs/contributor/CONTRIBUTING.md index 9857c7a594..7b5d80b559 100644 --- a/docs/contributor/CONTRIBUTING.md +++ b/docs/contributor/CONTRIBUTING.md @@ -16,18 +16,34 @@ git clone https://github.com/graalvm/mx.git ``` Make sure to add the `mx` directory to your `PATH`. -You can always use the latest stable JDK for development. -You can also download a suitable JDK using mx: +Use `mx` to get additional projects at the right versions. +From within your `graalpython` checkout, run: +``` +mx sforceimport +``` + +You can then download a suitable JDK: ```bash -mx fetch-jdk +mx -p ../graal/vm --env ce-python fetch-jdk -A --jdk-id labsjdk-ce-latest +``` + +Make sure that the `JAVA_HOME` environment variable is set: +```bash +export JAVA_HOME="${HOME}/.mx/jdks/labsjdk-ce-latest +``` + +(Or on Windows) +``` +$env:JAVA_HOME="$HOME\.mx\jdks\labsjdk-ce-latest" ``` -Make sure that the `JAVA_HOME` environment variable is set. For building GraalPy, you will also need some native build tools and libraries. On a Debian based system, install: ```bash sudo apt install build-essential libc++-12-dev zlib1g-dev cmake ``` +(On Windows, make sure you are running in a Visual Studio Developer Powershell, that should have everything you need.) + Lastly, download maven, extract it and include it on your `PATH`. Once you have all the necessary tools, you can run `mx python-jvm` in this repository. @@ -36,7 +52,8 @@ If it succeeds without errors, you should already be able to run `mx python` and For development, we recommend running `mx ideinit` next. This will generate configurations for Eclipse, IntelliJ, and NetBeans so that you can open the projects in these IDEs. -If you use another editor with support for the [Eclipse language server](https://github.com/eclipse/eclipse.jdt.ls) we have also had reports of useable development setups with that, but it's not something we support. +See also the documentation in mx for [setting up your IDE](https://github.com/graalvm/mx/blob/master/docs/IDE.md). +If you use another editor (such as VSCode, Emacs, or Neovim) with support for the [Eclipse language server](https://github.com/eclipse/eclipse.jdt.ls) or [Apache NetBeans language server](https://marketplace.visualstudio.com/items?itemName=ASF.apache-netbeans-java), you can also get useable development setups with that, but it's not something we explicitly support. ## Development Layout @@ -110,6 +127,11 @@ If the IDE was initialized properly by using the command mentioned above, the ex Both of these commands also work when you have a `graalpy` executable, e.g. inside a `venv`. +For debugging the C API and native extensions, first make sure you rebuild (`mx clean` first!) graalpything with the environment variable `CFLAGS=-g` set. +This will keep debug symbols in our C API implementation which should allow you to use `gdb` or [`rr`](https://rr-project.org/) to debug. +When you build an SVM image, debugging the entire application is possible, and there are [docs](https://www.graalvm.org/reference-manual/native-image/guides/debug-native-image-process/) to see Java code when inside the native debugger. +Make sure you find and keep the `libpythonvm.so.debug` file around next to your GraalPy build, you can find it somewhere under `graal/sdk/mxbuild`. + ## Advanced Commands to Develop and Debug Here are some advanced commands to debug test failures and fix issues. @@ -117,7 +139,7 @@ Here are some advanced commands to debug test failures and fix issues. First, we have three sets of unit tests in the base repository: 1. Our own Python-bases unit tests 2. JUnit tests -3. Python's standard library tests +3. Python's standard library tests, we often refer to those as tagged tests To run the first, you can use this command: @@ -125,11 +147,11 @@ To run the first, you can use this command: mx python-gate --tags python-unittest ``` -If some of the tests fail, you can re-run just a single test like this, substituting TEST-PATTERN (and possibly the file glob on the third line) with the test you want to run. +If some of the tests fail, you can re-run just a single test like this, substituting TEST-SELECTOR with the test you want to run. You can use the whole failed test name including the path as the selector. Note that you can insert `-d` to debug on the Java level or use `--inspect` to debug in the Chrome debugger. ```bash -mx [-d] graalpytest [--inspect] test_*.py -k TEST-PATTERN +mx [-d] graalpytest [--inspect] TEST-SELECTOR ``` To run the JUnit tests, you can use this command: @@ -152,16 +174,16 @@ mx python-gate --tags python-tagged-unittest ``` Note that we use "tag files", small _*.txt_ files that select which tests to run, so we only run tests that we know should pass. -To run a subset of those tests, use the following command: +To run a subset of those tests, use the following command. The selector can be a test name, a test file path a glob or an individual test ID. ``` -mx [-d] python-run-cpython-unittest [--inspect] NAME-OF-CPYTHON-UNITTEST +mx [-d] graalpytest [--inspect] --tagged TEST-SELECTOR ``` A tag file can be regenerated with ``` -mx python-retag-unittests NAME-OF-CPYTHON-UNITTEST +mx graalpytest --retag TEST-SELECTOR ``` There are also several other gates that may fail with changes. @@ -251,7 +273,7 @@ There are also different options for how the Python interpreter is run, passed v * `default` - run using the standard options * `default-multi` - run using a shared engine, which is the mode that is recommended to embedders that want to spawn multiple isolated Python contexts * `native` - same as `default`, its name is due to the fact that it runs C extensions using a mixture of LLVM bitcode interpreted and compiled via GraalVM and real native libraries - * `sandboxed` - this name is historical - this configuration requires Oracle GraalVM and runs all C extensions purely as LLVM bitcode on the GraalVM, without any access to the native OS libraries, i.e., using the `--llvm.managed` option for GraalVM. + * `sandboxed` - this name is historical - this configuration runs some modules such as the posix and sha3 modules with Java code instead of with native access. ### Configuration of the underlying GraalVM runtime @@ -299,22 +321,3 @@ mx --env ../../graal/vm/mx.vm/ce \ --jvm-config=native \ --python-vm-config=default -- ``` - -## Finding Memory Leaks - -For best performance we keep references to long-lived user objects (mostly functions, classes, and modules) directly in the AST nodes when using the default configuration of a single Python context (as is used when running the launcher). -For better sharing of warm-up and where absolutely best peak performance is not needed, contexts can be configured with a shared engine and the ASTs will be shared across contexts. -However, that implies we *must* not store any user objects strongly in the ASTs. -We test that we have no PythonObjects alive after a Context is closed that are run as part of our JUnit tests. -These can be run by themselves, for example, like so: - -```bash -mx python-leak-test --lang python \ - --shared-engine \ - --code 'import site, json' \ - --forbidden-class com.oracle.graal.python.builtins.objects.object.PythonObject \ - --keep-dump -``` - -The `--keep-dump` option will print the heapdump location and leave the file there rather than deleting it. -It can then be opened for example with VisualVM to check for the paths of any leaked object, if there are any. diff --git a/docs/contributor/DEV_TASKS.md b/docs/contributor/DEV_TASKS.md index 6fed69a26a..da569c4a5b 100644 --- a/docs/contributor/DEV_TASKS.md +++ b/docs/contributor/DEV_TASKS.md @@ -3,7 +3,7 @@ ### Updating dependencies We can use the following command to update our CI jsonnet as well as all -dependencies (truffle, sulong, ...) in one go: +dependencies (truffle, ...) in one go: mx python-update-import @@ -26,32 +26,22 @@ It prints a fairly long help. Note that you'll need to make sure you also pushed your `python-import` branch after doing the update, so that any conflicts you resolved don't have to be resolved again by the next person. -### Updating hpy - -Follow these steps to update HPy. - - - 1. Merge updated hpy sources. To do so, clone hpy somewhere next to - graalpython. Then run the following command on a new branch of graalpython: +### Updating patch branch +GraalPy's `pip` has an ability to download newer versions of patches from our +GitHub so that we can update patches outside of the release cycle. There should +be a patch branch for every minor release, with the name +`github/patches/$version`. When creating the branch, it should be based on the +release tag commit and then it should change the CI overlay version to point to +the head of branch `graalpy-patch-branch` in order to disable unnecessary gates +on it. The GitHub sync needs to be manually enabled in the mirroring service +configuration. - mx python-update-hpy-import --pull /path/to/clone/of/hpy - - Follow the instructions. - 2. We need to fix compilation. We patch the hpy sources, and the merge may - have introduced new API or types, and for these we need to apply - patches. At the time of this writing, we redefine hpy types conditionally - on `#ifdef GRAALVM_PYTHON_LLVM` (grep for this to find some - examples). Also, we use macros to convert between the structured hpy types - and plain pointers for our native interface, see the uses of the `WRAP` and - `UNWRAP` macros. - 3. Once compilation is working, we try to run the tests and go on fixing - them. If new API was added, `GraalHPyContext` needs to be adapted with the - new signatures and/or types. This may include: - - - Updating the HPyContextMember enum - - Updating the HPyContextSignatureType enum - - Adding `GraalHPyContextFunction` implementations for the new APIs - - Updating the `createMembers` method to assign the appropriate - implementations to the context members - - Updating hpy.c to assign new context members to their native locations +### Updating hpy +1. Switch to the `hpy-import` branch +2. Delete `graalpython/hpy` +3. Copy the sources from the hpy repo into `graalpython/hpy` (e.g git clone + them there, then delete the `graalpython/hpy/.git` folder) +4. Go back to your previous branch and merge hpy-import. +5. Go to `graalpython/hpy/build.py` and update the `VERSION` constant to + whatever you updated to. diff --git a/docs/contributor/IMPLEMENTATION_DETAILS.md b/docs/contributor/IMPLEMENTATION_DETAILS.md index 509dae8a19..8e773edd25 100644 --- a/docs/contributor/IMPLEMENTATION_DETAILS.md +++ b/docs/contributor/IMPLEMENTATION_DETAILS.md @@ -85,20 +85,19 @@ and holding on to the last (if any) in a local variable. Some PyPI packages contain code that is not compatible with GraalPy. To overcome this limitation and support such packages, GraalPy contains patches for some popular packages. The patches are applied to packages -installed via GraalPy specific utility `ginstall` and also to packages installed via `pip`. This is achieved by patching `pip` code. The patches are regular POSIX `patch` command compatible diffs located in -`lib-graalpython/patches`. Check out the directory structure and metadate.toml -files to get an idea of how rules are set for patches to be applied. +`lib-graalpython/patches`. The directory has a `README.md` file describing +how the patches are applied. ## The GIL We always run with a GIL, because C extensions in CPython expect to do so and are usually not written to be reentrant. The reason to always have the GIL -enabled is that when using Python, at least Sulong/LLVM is always available in -the same context and we cannot know if someone may be using that (or another -polyglot language or the Java host interop) to start additional threads that +enabled is that when using Python, another polyglot language or the Java host +interop can be available in the same context, and we cannot know if someone +may be using that to start additional threads that could call back into Python. This could legitimately happen in C extensions when the C extension authors use knowledge of how CPython works to do something GIL-less in a C thread that is fine to do on CPython's data structures, but not @@ -165,3 +164,157 @@ For embedders, it may be important to be able to interrupt Python threads by other means. We use the TruffleSafepoint mechanism to mark our threads waiting to acquire the GIL as blocked for the purpose of safepoints. The Truffle safepoint action mechanism can thus be used to kill threads waiting on the GIL. + +## C Extensions and Memory Management + +### High-level + +C extensions assume reference counting, but on the managed side we want to leverage +Java tracing GC. This creates a mismatch. The approach is to do both, reference +counting and tracing GC, at the same time. + +On the native side we use reference counting. The native code is responsible for doing +the counting, i.e., calling the `Py_IncRef` and `Py_DecRef` API functions. Inside those +functions we add special handling for the point when first reference from the native +code is created and when the last reference from the native code is destroyed. + +On the managed side we rely on tracing GC, so managed references are not ref-counted. +For the ref-counting scheme on the native side, we approximate all the managed references +as a single reference, i.e., we increment the refcount when object is referenced from managed +code, and using a `PhantomReference` and reference queue we decrement the refcount when +there are no longer any managed references (but we do not clean the object as long as +`refcount > 0`, because that means that there are still native references to it). + +### Details + +There are two kinds of Python objects in GraalPy: managed and native. + +#### Managed Objects + +Managed objects are allocated in the interpreter. If there is no native code involved, +we do not do anything special and let the Java GC handle them. When a managed object +is passed to a native extension code: + +* We wrap it in `PythonObjectNativeWrapper`. This is mostly in order to provide different +interop protocol: we do not want to expose `toNative` and `asPointer` on Python objects. + +* When NFI calls `toNative`/`asPointer` we: + * Allocate C memory that will represent the object on the native side (including the refcount field) + * Add a mapping of that memory address to the `PythonObjectNativeWrapper` object to a hash map `CApiTransitions.nativeLookup`. + * We initialize the refcount field to a constant `MANAGED_REFCNT` (larger number, because some + extensions like to special case on some small refcount values) + * Create `PythonObjectReference`: a weak reference to the `PythonObjectNativeWrapper`, + when this reference is enqueued (i.e., no managed references exist), we decrement the refcount by + `MANAGED_REFCNT` and if the recount falls back to `0`, we deallocate the native memory of the object, + otherwise we need to wait for the native code to eventually call `Py_DecRef` and make it `0`. + +* When extension code wants to create a new reference, it will call `Py_IncRef`. +In the C implementation of `Py_IncRef` we check if a managed object with +`refcount==MANAGED_REFCNT` wants to increment its refcount. In such case, the native code is +creating a first reference to the managed object, we must make sure to keep the object alive +as long as there are some native references. We set a field `PythonObjectReference.strongReference`, +which will keep the `PythonObjectNativeWrapper` alive even when all other managed references die. + +* When extension code is done with the object, it will call `Py_DecRef`. +In the C implementation of `Py_DecRef` we check if a managed object with `refcount == MANAGED_REFCNT+1` +wants to decrement its refcount to MANAGED_REFCNT, which means that there are no native references +to that object anymore. In such case we clear the `PythonObjectReference.strongReference` field, +and the memory management is then again left solely to the Java tracing GC. + +#### Native Objects + +Native objects allocated using `PyObject_GC_New` in the native code are backed by native memory +and may never be passed to managed code (as a return value of extension function or as an argument +to some C API call). If a native object is not made available to managed code, it is just reference +counted as usual, where `Py_DecRef` call that reaches `0` will deallocate the object. If a native +object is passed to managed code: + +* We increment the refcount of the native object by `MANAGED_REFCNT` +* We create: + * `PythonAbstractNativeObject` Java object to mirror it on the managed side + * `NativeObjectReference`, a weak reference to the `PythonAbstractNativeObject`. +* Add mapping: native object address => `NativeObjectReference` into hash map `CApiTransitions.nativeLookup` + * Next time we just fetch the existing wrapper and don't do any of this +* When `NativeObjectReference` is enqueued, we decrement the refcount by `MANAGED_REFCNT` + * If the refcount falls to `0`, it means that there are no references to the object even from + native code, and we can destroy it. If it does not fall to `0`, we just wait for the native + code to eventually call `Py_DecRef` that makes it fall to `0`. + +#### Weak References + +TODO + +### Cycle GC + +We leverage the CPython's GC module to detect cycles for objects that participate +in the reference counting scheme (native objects or managed objects that got passed +to native code). +See: https://devguide.python.org/internals/garbage-collector/index.html. + +There are two issues: + +* Objects that are referenced from the managed code have `refcount >= MANAGED_REFCNT` and +until Java GC runs we do not know if they are garbage or not. +* We cannot traverse the managed objects: since we don't do refcounting on the managed +side, we cannot traverse them and decrement refcounts to see if there is a cycle. + +The high level solution is that when we see a "dead" cycle going through an object with a managed reference, +(i.e., cycle not referenced by any native object from the "outside" of the collected set, +which may be, however, referenced from managed), +we fully replicate the object graphs (and the cycle) on the managed side (refcounts of native objects +in the cycle, which were not referenced from managed yet, will get new `NativeObjectReference` +created and refcount incremented by `MANAGED_REFCNT`). Managed objects already refer +to the `PythonAbstractNativeObject` wrappers of the native objects (e.g., some Python container +with managed storage), but we also make the native wrappers refer to whatever their referents +are on the Java side (we use `tp_traverse` to find their referents). + +As part of that, we make the objects in the cycle only weakly referenced on the Java side. +One can think about this as pushing the baseline reference count when the +object is eligible for being GC'ed and thus freed. Normally when the object has +`refcount > MANAGED_REFCNT` we keep it alive with a strong reference assuming that +there are some native references to it. In this case, we know that all the native +references to that object are part of potentially dead cycle, and we do not +count them into this limit. Let us call this limit *weak to strong limit*. + +After this, if the objects on the managed side (the managed objects or `PythonAbstractNativeObject` +mirrors of native objects) are garbage, eventually Java GC will collect them. +This will push their references to the reference queue. When polled from the queue (`CApiTransitions#pollReferenceQueue`), +we decrement the refcount by `MANAGED_REFCNT` (no managed references anymore) and +if their refcount falls to `0`, they are freed - as part of that, we call the +`tp_clear` slot for native objects, which should call `Py_CLEAR` for their references, +which does `Py_DecRef` - eventually all objects in the cycle should fall to refcount `0`. + +*Example: managed object `o1` has refcount `MANAGED_REFCNT+1`: `MANAGED_REFCNT` representing all managed +references, and `+1` for some native object `o2` referencing it. Native object `o2` has +refcount `MANAGED_REFCNT`, because it is referenced only from managed (from `o1`). +Both `o1` and `o2` form a cycle that was already transformed to managed during cycle GC. +The reference queue processing will subtract `MANAGED_REFCNT` from `o1`'s refcount making it `1`. +Then the reference queue processing will subtract `MANAGED_REFCNT` from `o2`'s refcount making it fall +to `0` - this triggers the `tp_clear` of `o2`, which should subtract the final `1` from `o1`'s refcount.* + +If some of the managed objects are not garbage, and they passed back to native code, +the native code can then access and resurrect the whole cycle. W.r.t. the refcounts +integrity this is fine, because we did not alter the refcounts. The native references +between the objects are still factored in their refcounts. What may seem like a problem +is that we pushed the *weak to strong limit* for some objects. Such an object may be +passed to native, get `Py_IncRef`'ed making it strong reference again. Since `Py_DecRef` is +checking the same `MANAGED_REFCNT` limit for all objects, the subsequent `Py_DecRef` +call for this object will not detect that the reference should be made weak again! +However, this is OK, it only prolongs the collection: we will make it weak again in +the next run of the cycle GC on the native side. + +## C extension copying + +On Linux, Python native extensions expect to lookup Python C API functions in the global namespace and specify no explicit dependency on any libpython. +To isolate them, we copy them with a new name, change their `SONAME`, add a `DT_NEEDED` dependency on a copy of our libpython shared object, and finally load them with `RTLD_LOCAL`. +The ELF format is not really meant to allow such modifications after the fact. +The most widely used tool to do so, [patchelf](https://github.com/NixOS/patchelf), still sees regular bugfixes and can corrupt ELF files. + +On Windows there is no global namespace so native extensions already have a dependency on our libpython DLL. +We copy them and just change the dependency to point to the context-local copy of libpython rather than the global one. + +On macOS, while two-level namespaces exist, Python extensions historically use `-undefined dynamic_lookup` where they (just like in Linux) expect to find C API functions in any loaded image. +We have to apply a similar workaround as on Linux, copy to a new name, change the `LC_ID_DYLIB` to that name, and add a `LC_LOAD_DYLIB` section to make the linker load the symbols from our libpython. +This is currently not fully implemented. + +Note that any code signatures are invalidated by this process. diff --git a/docs/contributor/INVESTIGATING_PERFORMANCE.md b/docs/contributor/INVESTIGATING_PERFORMANCE.md new file mode 100644 index 0000000000..6e62cb64d1 --- /dev/null +++ b/docs/contributor/INVESTIGATING_PERFORMANCE.md @@ -0,0 +1,80 @@ +# Investigating GraalPy Performance + +First, make sure to build GraalPy with debug symbols. +`export CFLAGS=-g` before doing a fresh `mx build` adds the debug symbols flags to all our C extension libraries. +When you build a native image, use `find` to get the `.debug` file somewhere from the `mxbuild` directory tree, it's called something like `libpythonvm.so.debug`. +Make sure to get that one and put it next to the `libpythonvm.so` in the Python standalone so that tools can pick it up. + +## Peak Performance + +[Truffle docs](https://www.graalvm.org/graalvm-as-a-platform/language-implementation-framework/Optimizing/) under graal/truffle/docs/Optimizing.md are a good starting point. +They describe how to start with the profiler, especially useful is the [flamegraph](https://www.graalvm.org/graalvm-as-a-platform/language-implementation-framework/Profiling/#creating-a-flame-graph-from-cpu-sampler). +This gives you a high-level idea of where time is spent. +Note that currently (GR-58204) executions with native extensions may be less accurate. + +In GraalPy's case the flamegraph is also useful to compare performance to CPython. +[Py-spy](https://pypi.org/project/py-spy/) is pretty good for that, since it generates a flamegraph that is sufficiently comparable. +Note that `py-spy` is a sampling profiler that accesses CPython internals, so it often does not work on the latest CPython, use a bit older one. + +``` +py-spy record -n -r 100 -o pyspy.svg -- foo.py +``` + +Once you have identified something that takes way too long on GraalPy as compared to CPython, follow the Truffle guide. + +When you use [IGV](https://www.graalvm.org/tools/igv/), an interesting thing about debugging deoptimizations with IGV is that if you trace deopts as per the Truffle document linked above, search for "JVMCI: installed code name=". +If the name ends with "#2" it's a second tier compilation. +You might notice the presence of a `debugId` or `debug_id` in the output of these options. +That id can be searched via `id=NUMBER`, `idx=NUMBER` or `debugId=NUMBER` in IGV's `Search in Nodes` search box, then selecting `Open Search for node NUMBER in Node Searches window`, and then clicking the `Search in following phases` button. +Another useful thing to know is the `compile_id` matches the `compilationId` in IGVs "properties" view of the dumped graph. + +[Proftool](https://github.com/graalvm/mx/blob/master/README-proftool.md) can also be helpful. +Note that this is not really prepared for language launchers, if it doesn't work, just get the commandline and build the arguments manually. + +## Interpreter Performance + +For interpreter performance async profiler is good and also allows for some visualizations. +Backtrace view and flat views are good. +It is only for JVM executions (not native images). +Download async-profiler and make sure you also have debug symbols in your C extensions. +Use these options: + +``` +--vm.agentpath:/path/to/async-profiler/lib/libasyncProfiler.so=start,event=cpu,file=profile.html' --vm.XX:+UnlockDiagnosticVMOptions --vm.XX:+DebugNonSafepoints +``` + +Another very useful tool is [gprofng](https://blogs.oracle.com/linux/post/gprofng-the-next-generation-gnu-profiling-tool), it is part of binutils these days. +If you have debug symbols, it works quite well with JVM launchers since it understands Hotspot frames, but also works fine with native images. +You might run into a bug with our language launchers: https://sourceware.org/bugzilla/show_bug.cgi?id=32110 The patch in that bugreport from me (Tim) -- while not entirely correct and not passing their testsuite -- lets you review recorded profiles (the bug only manifests when viewing a recorded profile). +What's nice about gprofng is that it can attribute time spent to Java bytecodes, so you can even profile huge methods like bytecode loops that, for example, the DSL has generated. + +For SVM builds it is very useful to look at Truffle's [HostInlining](https://www.graalvm.org/graalvm-as-a-platform/language-implementation-framework/HostOptimization/) docs and check the debugging section there. +This helps ensure that expected code is inlined (or not). +When I identify something that takes long using gprofng, for example, I find it useful to check if that stuff is inlined as expected on SVM during the HostInliningPhase. + +Supposedly Intel VTune and Oracle Developer Studio work well, but I haven't tried them. + +## Memory Usage + +Memory usage is best tracked with VisualVM for the Java heap. +For best performance we keep references to long-lived user objects (mostly functions, classes, and modules) directly in the AST nodes when using the default configuration of a single Python context (as is used when running the launcher). +For better sharing of warm-up and where absolutely best peak performance is not needed, contexts can be configured with a shared engine and the ASTs will be shared across contexts. +However, that implies we *must* not store any user objects strongly in the ASTs. +We test that we have no PythonObjects alive after a Context is closed that are run as part of our JUnit tests. +These can be run by themselves, for example, like so: + +```bash +mx python-leak-test --lang python \ + --shared-engine \ + --code 'import site, json' \ + --forbidden-class com.oracle.graal.python.builtins.objects.object.PythonObject \ + --keep-dump +``` + +The `--keep-dump` option will print the heapdump location and leave the file there rather than deleting it. +It can then be opened for example with VisualVM to check for the paths of any leaked object, if there are any. + +For native code, use native memory profiling tools. +I have used [`massif`](https://valgrind.org/docs/manual/ms-manual.html) in the past to find allocations and memory issues in native extensions, but be aware of the large overhead. +However, once you do find something interesting using `massif`, [`rr`](https://rr-project.org/) is a good option to dive further into it, because then you can break around places massif found allocations, and use memory breakpoints and reverse and forward execution to find where the memory is allocated and released. +This can be useful to identify memory leaks in our C API emulation. diff --git a/docs/contributor/MISSING.md b/docs/contributor/MISSING.md deleted file mode 100644 index 961787d79a..0000000000 --- a/docs/contributor/MISSING.md +++ /dev/null @@ -1,35 +0,0 @@ -# (Largely) Missing Core Modules - -This is just a snapshot as of 2023-09-14. - -### Builtin modules from sys.builtin_module_names that we don't have built-in or care shared object modules - -#### These we might want to use from C - * **_curses, _curses_panel**: Use from C - * **_dbm**: Use from C - * **_gdbm**: Use from C - * **_tkinter**: Should be used from C - * **syslog**: Access to syslog. We should probably just use this from the C module. - -#### These are not strictly needed for now - * **_bisect**: Just a performance optimization, not necessary. - * **_datetime**: Just a performance optimization, not necessary. - * **_decimal**: Just performance, not necessary - * **_elementtree**: Just a performance optimization, not necessary. - * **_heapq**: Just a performance optimization, not necessary. - * **_stat**: Just a performance optimization, not necessary. - -#### These we probably won't support - * **_opcode**: We won't have it, our opcodes are different from CPython. - * **_symtable**: Interface for the compilers internal symboltable. - -#### These we should re-implement - * **_uuid**: Can be implemented ourselves, is just 1 function - * **grp**: UNIX group file access. Should be added to our POSIX APIs - * **spwd**: UNIX shadow password file access. Should be added to our POSIX APIs - * **parser**: We need to implement this for our parser - -#### Deprecated in CPython, won't implement - * **audioop**: Scheduled for removal in 3.13 - * **ossaudiodev**: Scheduled for removal in 3.13 - * **nis**: Scheduled for removal in 3.13 diff --git a/docs/site/01-docs.md b/docs/site/01-docs.md new file mode 100644 index 0000000000..294c748ac1 --- /dev/null +++ b/docs/site/01-docs.md @@ -0,0 +1,19 @@ +--- +layout: docs +title: Documentation +permalink: docs/ +--- + +{% gfm_docs ../user/README.md %} +{% gfm_docs ../user/Python-Runtime.md %} +{% gfm_docs ../user/Performance.md %} +{% gfm_docs ../user/Python-on-JVM.md %} +{% gfm_docs ../user/Native-Images-with-Python.md %} +{% gfm_docs ../user/Python-Standalone-Applications.md %} +{% gfm_docs ../user/Interoperability.md %} +{% gfm_docs ../user/Embedding-Build-Tools.md %} +{% gfm_docs ../user/Embedding-Permissions.md %} +{% gfm_docs ../user/Tooling.md %} +{% gfm_docs ../user/Troubleshooting.md %} + +{% copy_assets ../user/assets %} diff --git a/docs/site/02-downloads.md b/docs/site/02-downloads.md new file mode 100644 index 0000000000..fcf6ca3795 --- /dev/null +++ b/docs/site/02-downloads.md @@ -0,0 +1,396 @@ +--- +layout: base +title: Downloads +permalink: downloads/ +published: false +--- + +
+
+
+
+

Download GraalPy from Maven Central

+
+
+ Have a Java application? +
+
+You can extend it with Python code or leverage packages from the Python ecosystem. GraalPy is available on Maven Central and can be added as a dependency to your Maven or Gradle project as — see setup instructions. +
+
+
+
+
+
+ +
+
+
+
+

Download Standalone Distributions of GraalPy

+
+
+ Do you want to test your Python application or package on GraalPy? +
+
+ To test Python code on GraalPy, a standalone distribution is available for different platforms and in two different kinds: Native (for compact download and footprint) and JVM (for full Java interoperability). We recommend the distributions based on Oracle GraalVM for best performance and advanced features (released under the GFTC license). Distributions based on GraalVM Community Edition (released under the OSI-approved UPL license) are available on GitHub. Standalone distributions are also available via pyenv, pyenv-win, and setup-python: +
+
+
+
+
+ {%- highlight bash -%} +# Latest GraalPy release +pyenv install graalpy-{{ site.language_version }} +pyenv shell graalpy-{{ site.language_version }} + +# Latest EA build of GraalPy +pyenv install graalpy-dev +pyenv shell graalpy-dev + {%- endhighlight -%} +
+
+
+ pyenv and pyenv-win +
+
+
+
+
+ {%- highlight yml -%} +steps: +- uses: actions/checkout@v4 +- uses: actions/setup-python@v5 + with: + python-version: 'graalpy-{{ site.language_version }}' +- run: python my_script.py + {%- endhighlight -%} +
+ +
+
+ +
GraalPy on Oracle GraalVM is free to use in production and free to redistribute, at no cost, under the GraalVM Free Terms and Conditions.
+
+
+
+
diff --git a/docs/site/03-compatibility.md b/docs/site/03-compatibility.md new file mode 100644 index 0000000000..8d3f1b86be --- /dev/null +++ b/docs/site/03-compatibility.md @@ -0,0 +1,379 @@ +--- +layout: base +title: Compatibility +permalink: compatibility/ +--- + + + +
+
+
+
+

GraalPy: Package Compatibility

+
+
+

GraalPy 24.2

+

GraalPy 24.1

+
+
+
+
+
+
+ +
+
+
+
+
To ensure GraalPy is compatible with common Python packages, the GraalPy team conducts + compatibility testing to verify the presence and correct functioning of + the top 500 packages on PyPI plus some more that are of special interest to us, including + libraries and frameworks such as NumPy, Pandas, and Django.
+
Compatibility testing ensures that + developers can leverage GraalPy's powerful capabilities in their existing applications. + It also enables developers to use GraalPy to create more efficient and productive applications in the areas of + machine learning, data analysis, and web development using their familiar Python + toolsets.
+
Many more Python packages than are on this list work on GraalPy. + If there is a package you are interested in that you cannot find here, chances are that it + might just work.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Compatible: loading...
+
+ Currently Untested: loading...
+
+
+
Currently + Incompatible: loading...
+
Not + Supported: loading...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

Python Packages

+
+ +
+
+ + +
+ +
+
+
+ + + + + + + + + + + +
Python Packages
NameVersionTest Level %Package URL
+
+
+
+ + +
+
+ + +
+
+
+
+
+
+
diff --git a/docs/site/Gemfile b/docs/site/Gemfile new file mode 100644 index 0000000000..2c11ff519e --- /dev/null +++ b/docs/site/Gemfile @@ -0,0 +1,33 @@ +source "https://rubygems.org/" + +gem "jekyll", "~> 4.3.4" + +gem "graal-languages-jekyll-theme" + +group :jekyll_plugins do + gem "jekyll-relative-links" + gem "jekyll-seo-tag" +end + +# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem +# and associated library. +platforms :mingw, :x64_mingw, :mswin, :jruby do + gem "tzinfo", ">= 1", "< 3" + gem "tzinfo-data" +end + +# Performance-booster for watching directories on Windows +gem "wdm", "~> 0.1", :platforms => [:mingw, :x64_mingw, :mswin] + +# Lock `http_parser.rb` gem to `v0.6.x` on JRuby builds since newer versions of the gem +# do not have a Java counterpart. +gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby] + +# Clean unused resources with `bundle exec siteleaf clean resources` +group :development do + gem 'siteleaf' + gem 'pry' + gem 'html-proofer' + # Run this with: + # bundle exec htmlproofer --swap-urls '^/python/:/' ./_site/ +end diff --git a/docs/site/Gemfile.lock b/docs/site/Gemfile.lock new file mode 100644 index 0000000000..d7ae358a10 --- /dev/null +++ b/docs/site/Gemfile.lock @@ -0,0 +1,157 @@ +GEM + remote: https://rubygems.org/ + specs: + Ascii85 (2.0.1) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) + afm (0.2.2) + async (2.23.0) + console (~> 1.29) + fiber-annotation + io-event (~> 1.9) + metrics (~> 0.12) + traces (~> 0.15) + bigdecimal (3.1.8) + coderay (1.1.3) + colorator (1.1.0) + concurrent-ruby (1.3.4) + console (1.29.3) + fiber-annotation + fiber-local (~> 1.1) + json + csv (3.3.0) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + ethon (0.16.0) + ffi (>= 1.15.0) + eventmachine (1.2.7) + ffi (1.17.0-x86_64-linux-gnu) + fiber-annotation (0.2.0) + fiber-local (1.1.0) + fiber-storage + fiber-storage (1.0.0) + forwardable-extended (2.6.0) + google-protobuf (4.28.3-x86_64-linux) + bigdecimal + rake (>= 13) + graal-languages-jekyll-theme (0.1.0) + jekyll (~> 4.3) + hashery (2.1.2) + html-proofer (5.0.10) + addressable (~> 2.3) + async (~> 2.1) + nokogiri (~> 1.13) + pdf-reader (~> 2.11) + rainbow (~> 3.0) + typhoeus (~> 1.3) + yell (~> 2.0) + zeitwerk (~> 2.5) + http_parser.rb (0.8.0) + httparty (0.22.0) + csv + mini_mime (>= 1.0.0) + multi_xml (>= 0.5.2) + i18n (1.14.6) + concurrent-ruby (~> 1.0) + io-event (1.9.0) + jekyll (4.3.4) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (~> 1.0) + jekyll-sass-converter (>= 2.0, < 4.0) + jekyll-watch (~> 2.0) + kramdown (~> 2.3, >= 2.3.1) + kramdown-parser-gfm (~> 1.0) + liquid (~> 4.0) + mercenary (>= 0.3.6, < 0.5) + pathutil (~> 0.9) + rouge (>= 3.0, < 5.0) + safe_yaml (~> 1.0) + terminal-table (>= 1.8, < 4.0) + webrick (~> 1.7) + jekyll-relative-links (0.7.0) + jekyll (>= 3.3, < 5.0) + jekyll-sass-converter (3.0.0) + sass-embedded (~> 1.54) + jekyll-seo-tag (2.8.0) + jekyll (>= 3.8, < 5.0) + jekyll-watch (2.2.1) + listen (~> 3.0) + json (2.10.1) + kramdown (2.4.0) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.4) + listen (3.9.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.4.0) + method_source (1.1.0) + metrics (0.12.1) + mini_mime (1.1.5) + multi_xml (0.7.1) + bigdecimal (~> 3.1) + nokogiri (1.18.3-x86_64-linux-gnu) + racc (~> 1.4) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + pdf-reader (2.14.1) + Ascii85 (>= 1.0, < 3.0, != 2.0.0) + afm (~> 0.2.1) + hashery (~> 2.0) + ruby-rc4 + ttfunk + pry (0.14.2) + coderay (~> 1.1) + method_source (~> 1.0) + public_suffix (6.0.1) + racc (1.8.1) + rack (3.1.8) + rainbow (3.1.1) + rake (13.2.1) + rb-fsevent (0.11.2) + rb-inotify (0.11.1) + ffi (~> 1.0) + rexml (3.3.9) + rouge (4.5.1) + ruby-rc4 (0.1.5) + safe_yaml (1.0.5) + sass-embedded (1.81.0-x86_64-linux-gnu) + google-protobuf (~> 4.28) + siteleaf (2.3.0) + httparty (>= 0.16.0) + jekyll (>= 1.4.1) + rack + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + traces (0.15.2) + ttfunk (1.8.0) + bigdecimal (~> 3.1) + typhoeus (1.4.1) + ethon (>= 0.9.0) + unicode-display_width (2.6.0) + webrick (1.9.0) + yell (2.2.2) + zeitwerk (2.7.2) + +PLATFORMS + x86_64-linux + +DEPENDENCIES + graal-languages-jekyll-theme + html-proofer + http_parser.rb (~> 0.6.0) + jekyll (~> 4.3.4) + jekyll-relative-links + jekyll-seo-tag + pry + siteleaf + tzinfo (>= 1, < 3) + tzinfo-data + wdm (~> 0.1) + +BUNDLED WITH + 2.5.9 diff --git a/docs/site/_config.yml b/docs/site/_config.yml new file mode 100644 index 0000000000..645b2f75c2 --- /dev/null +++ b/docs/site/_config.yml @@ -0,0 +1,21 @@ +baseurl: "/python" +url: "https://graalvm.org/" +github: "oracle/graalpython" +language_version: 24.2.0 +name: GraalPy + +permalink: pretty + +plugins: + - jekyll-relative-links + - jekyll-seo-tag + - graal-languages-jekyll-theme + +theme: graal-languages-jekyll-theme + +sass: + quiet_deps: true + +exclude: + - Gemfile + - Gemfile.lock diff --git a/docs/site/_plugins/graalpy_wheels.txt b/docs/site/_plugins/graalpy_wheels.txt new file mode 100644 index 0000000000..8136d81c2e --- /dev/null +++ b/docs/site/_plugins/graalpy_wheels.txt @@ -0,0 +1,54 @@ +# This file is processed by _plugins/wheel_repo_plugin.rb +# Each line is a wheel filename. Comments and empty lines are ignored +# GraalPy 24.1: +contourpy-1.2.1-graalpy311-graalpy241_311_native-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +httptools-0.6.1-graalpy311-graalpy241_311_native-macosx_11_0_arm64.whl +httptools-0.6.1-graalpy311-graalpy241_311_native-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl +httptools-0.6.1-graalpy311-graalpy241_311_native-win_amd64.whl +jiter-0.5.0-graalpy311-graalpy241_311_native-manylinux_2_28_x86_64.whl +kiwisolver-1.4.5-graalpy311-graalpy241_311_native-macosx_11_0_arm64.whl +kiwisolver-1.4.5-graalpy311-graalpy241_311_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl +kiwisolver-1.4.5-graalpy311-graalpy241_311_native-win_amd64.whl +numpy-1.26.4-graalpy311-graalpy241_311_native-macosx_11_0_arm64.whl +numpy-1.26.4-graalpy311-graalpy241_311_native-manylinux_2_28_x86_64.whl +numpy-1.26.4-graalpy311-graalpy241_311_native-win_amd64.whl +oracledb-2.2.1-graalpy311-graalpy241_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl +psutil-5.9.8-graalpy311-graalpy241_311_native-macosx_11_0_arm64.whl +psutil-5.9.8-graalpy311-graalpy241_311_native-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_28_x86_64.whl +psutil-5.9.8-graalpy311-graalpy241_311_native-win_amd64.whl +pydantic_core-2.10.1-graalpy311-graalpy241_311_native-manylinux_2_28_x86_64.whl +ujson-5.10.0-graalpy311-graalpy241_311_native-macosx_11_0_arm64.whl +ujson-5.10.0-graalpy311-graalpy241_311_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl +ujson-5.10.0-graalpy311-graalpy241_311_native-win_amd64.whl +uvloop-0.19.0-graalpy311-graalpy241_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl +watchfiles-0.21.0-graalpy311-graalpy241_311_native-manylinux_2_28_x86_64.whl +xxhash-3.4.1-graalpy311-graalpy241_311_native-macosx_11_0_arm64.whl +xxhash-3.4.1-graalpy311-graalpy241_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl +xxhash-3.4.1-graalpy311-graalpy241_311_native-win_amd64.whl + +# GraalPy 24.2 +contourpy-1.2.1-graalpy311-graalpy242_311_native-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl +httptools-0.6.1-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl +httptools-0.6.1-graalpy311-graalpy242_311_native-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl +httptools-0.6.1-graalpy311-graalpy242_311_native-win_amd64.whl +jiter-0.5.0-graalpy311-graalpy242_311_native-manylinux_2_28_x86_64.whl +kiwisolver-1.4.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl +kiwisolver-1.4.5-graalpy311-graalpy242_311_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl +kiwisolver-1.4.5-graalpy311-graalpy242_311_native-win_amd64.whl +numpy-1.26.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl +numpy-1.26.4-graalpy311-graalpy242_311_native-manylinux_2_28_x86_64.whl +numpy-1.26.4-graalpy311-graalpy242_311_native-win_amd64.whl +oracledb-3.0.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl +polyleven-0.8-graalpy311-graalpy242_311_native-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl +psutil-5.9.8-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl +psutil-5.9.8-graalpy311-graalpy242_311_native-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_28_x86_64.whl +psutil-5.9.8-graalpy311-graalpy242_311_native-win_amd64.whl +pydantic_core-2.10.1-graalpy311-graalpy242_311_native-manylinux_2_28_x86_64.whl +ujson-5.10.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl +ujson-5.10.0-graalpy311-graalpy242_311_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl +ujson-5.10.0-graalpy311-graalpy242_311_native-win_amd64.whl +uvloop-0.19.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl +watchfiles-0.21.0-graalpy311-graalpy242_311_native-manylinux_2_28_x86_64.whl +xxhash-3.4.1-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl +xxhash-3.4.1-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl +xxhash-3.4.1-graalpy311-graalpy242_311_native-win_amd64.whl diff --git a/docs/site/_plugins/wheel_repo_plugin.rb b/docs/site/_plugins/wheel_repo_plugin.rb new file mode 100644 index 0000000000..05a0a70ce6 --- /dev/null +++ b/docs/site/_plugins/wheel_repo_plugin.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +# Plugin that generates a Python repository index for GraalPy wheels at +# /python/wheels. The input is the graalpy_wheels.txt file next to this file. +# The wheels themselves are hosted in GDS. +module WheelRepoPlugin + TEMPLATE = <<~EOF + + + + GraalPy wheel repository + + +
+      %{content}
+      
+ + + EOF + + Wheel = Struct.new(:name, :filename) + + class IndexGenerator < Jekyll::Generator + safe true + + def generate(site) + index_path = File.join(__dir__, "graalpy_wheels.txt") + all_wheels = File.readlines(index_path).select do |line| + !line.strip.empty? && !line.start_with?("#") + end.collect do |line| + if /([^-]+)-([^-]+)-.*\.whl/ =~ line + Wheel.new($1.downcase.gsub(/[-_.]+/, "-"), line.strip) + else + raise "Invalid wheel name in #{index_path}: #{line.inspect}" + end + end + wheels_by_name = all_wheels.group_by(&:name) + index_links = wheels_by_name.keys.map do |name| + "#{name}" + end + index_page = Jekyll::PageWithoutAFile.new(site, "", "/wheels", "index.html") + index_page.content = render index_links + site.pages << index_page + + wheels_by_name.each do |name, wheels| + package_links = wheels.collect do |wheel| + "#{wheel.filename}" + end + package_page = Jekyll::PageWithoutAFile.new(site, "", "/wheels/#{name}", "index.html") + package_page.content = render package_links + site.pages << package_page + end + end + + def render(links) + TEMPLATE % { content: links.join("\n") } + end + end +end diff --git a/docs/site/assets/img/python/devoxx2024-cover.png b/docs/site/assets/img/python/devoxx2024-cover.png new file mode 100644 index 0000000000..c3980a6d39 Binary files /dev/null and b/docs/site/assets/img/python/devoxx2024-cover.png differ diff --git a/docs/site/assets/img/python/jfocus2025-cover.png b/docs/site/assets/img/python/jfocus2025-cover.png new file mode 100644 index 0000000000..50d98b313f Binary files /dev/null and b/docs/site/assets/img/python/jfocus2025-cover.png differ diff --git a/docs/site/assets/js/check_compatibility_helpers.js b/docs/site/assets/js/check_compatibility_helpers.js new file mode 100644 index 0000000000..2cb2384b76 --- /dev/null +++ b/docs/site/assets/js/check_compatibility_helpers.js @@ -0,0 +1,280 @@ +class RequestedModule { + constructor(name, version) { + this.name = name; + this.version = Utilities.normalize_version(version); + } +} + +class ModuleListing { + constructor(name, contents) { + this.name = name; + this.contents = contents; + } +} + +class DBEntry { + constructor([library_name, library_version, test_status, pass_percentage]) { + this.name = library_name; + this.version = Utilities.normalize_version(library_version); + this.test_status = parseInt(test_status); + this.pass_percentage = pass_percentage; + } +} + +class DB { + constructor(language, db_contents) { + this.db = {}; + this.language = language; + + const lines = db_contents.split('\n'); + + for (let l in lines) { + const entry = new DBEntry(lines[l].split(',')); + + if (!(entry.name in this.db)) { + this.db[entry.name] = {}; + } + + this.db[entry.name][entry.version] = entry; + this.db[entry.name][Utilities.approximate_recommendation(entry.version)] = entry; + } + } + + lookup(requested_name, requested_version, print_missing) { + const ret = []; + + if (requested_name in this.db) { + if (requested_version === undefined) { + const versions = this.db[requested_name]; + for (let version in versions) { + if (!version.startsWith('~')) { + const entry = versions[version]; + ret.push([entry.name, version, entry.test_status, entry.pass_percentage]); + } + } + } else { + if (requested_version in this.db[requested_name]) { + const entry = this.db[requested_name][requested_version]; + ret.push([entry.name, entry.version, entry.test_status, entry.pass_percentage]); + } else { + const semver_match = Utilities.approximate_recommendation(requested_version); + if (semver_match in this.db[requested_name]) { + const entry = this.db[requested_name][semver_match]; + ret.push([entry.name, entry.version, entry.test_status, entry.pass_percentage]); + } else { + ret.push([requested_name, requested_version, 'unknown', undefined]); + } + } + } + } else { + if (print_missing) { + ret.push([requested_name, '*', 'library not yet tested', undefined]); + } + } + + // In the event of multiple versions for a module, sort the results from highest version to lowest. + ret.sort(function(a, b) { + return b[1].localeCompare(a[1]); + }); + + return ret; + } + + lookup_module(module, print_missing) { + return this.lookup(module.name, module.version, print_missing); + } + +} + +class Utilities { + static pretty_name(language) { + switch(language) { + case 'js': return 'GraalVM JavaScript'; + case 'r': return 'GraalVM R'; + case 'ruby': return 'GraalVM Ruby'; + case 'python': return 'GraalVM Python'; + } + } + + static normalize_version(version) { + if (version === undefined) { + return undefined; + } else { + return version.replace(/^v(\d.*)/, '$1'); + } + } + + static version_segments(version) { + if (version === undefined) { + return undefined; + } + + const string_parts = version.match(/[0-9]+|[a-z]+/ig); + + // The result of the regexp match will be an array of strings. We would like to be + // able to perform numeric comparisons on the parts corresponding to integer values, + // so convert them here. + return string_parts.map(function(e) { + let x = parseInt(e); + + if (isNaN(x)) { + return e; + } else { + return x; + } + }); + } + + static approximate_recommendation(version) { + if (version === undefined) { + return undefined; + } + + const segments = this.version_segments(version); + + while (segments.some(function(e) { typeof(e) === 'string' })) { + segments.pop(); + } + + while (segments.length > 2) { + segments.pop(); + } + + while (segments.length < 2) { + segments.push(0); + } + + return `~> ${segments.join('.')}` + } +} + +class DependencyFileProcessor { + static handle_gemfile(db, contents) { + if (db.language !== 'ruby') { + return []; + } + + const r = /\n (\S+?) \((.+?)\)/g; + let match; + const queries = []; + + while (match = r.exec(contents)) { + queries.push(match.slice(1, 3)); + } + + queries.sort(function(a, b) { + return a[0].localeCompare(b[0]); + }); + + let results = []; + for (let [name, version] of queries) { + results = results.concat(db.lookup(name, version, true)); + } + + return results; + } + + static handle_package_json(db, contents) { + if (db.language !== 'js') { + return []; + } + + const json = JSON.parse(contents); + let queries = []; + + for (let name in json['dependencies']) { + queries.push([name, undefined]); + } + + let results = []; + for (let [name, version] of queries) { + results = results.concat(db.lookup(name, version, true)); + } + + return results; + } + + static handle_package_lock(db, contents) { + if (db.language !== 'js') { + return []; + } + + const json = JSON.parse(contents); + let queries = [[json['name'], json['version']]]; + + for (let name in json['dependencies']) { + let metadata = json['dependencies'][name]; + + if (metadata['dev'] || metadata['optional']) { + continue; + } + + queries.push([name, metadata['version']]); + } + + let results = []; + for (let [name, version] of queries) { + results = results.concat(db.lookup(name, version, true)); + } + + return results; + } + + static handle_yarn_lock(db, contents) { + if (db.language != 'js') { + return []; + } + + const r = /\n(\w.*?)@.+?:\s+?version "(.+?)"/g; + let match; + const queries = []; + + while (match = r.exec(contents)) { + queries.push(match.slice(1, 3)); + } + + queries.sort(function(a, b) { + return a[0].localeCompare(b[0]); + }); + + let results = []; + for (let [name, version] of queries) { + results = results.concat(db.lookup(name, version, true)); + } + + return results; + } + + static handle_packrat_lock(db, contents) { + if (db.language != 'r') { + return []; + } + + const r = /\nPackage: (\w+)\nSource: (\w+)\nVersion: (.+?)\n/g; + let match; + const queries = []; + + while (match = r.exec(contents)) { + queries.push(match.slice(1, 4)); + } + + queries.sort(function(a, b) { + return a[0].localeCompare(b[0]); + }); + + let results = []; + for (let [name, repository, version] of queries) { + results = results.concat(db.lookup(name, version, true)); + } + + return results; + } +} + +if (typeof module !== 'undefined') { + module.exports.DB = DB; + module.exports.DependencyFileProcessor = DependencyFileProcessor; + module.exports.ModuleListing = ModuleListing; + module.exports.RequestedModule = RequestedModule; + module.exports.Utilities = Utilities; +} diff --git a/docs/site/assets/logo.svg b/docs/site/assets/logo.svg new file mode 100644 index 0000000000..4b73a0e933 --- /dev/null +++ b/docs/site/assets/logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/site/index.md b/docs/site/index.md new file mode 100644 index 0000000000..b544cbd82c --- /dev/null +++ b/docs/site/index.md @@ -0,0 +1,387 @@ +--- +layout: base +--- +
+
+
+
+
+
+

A high-performance embeddable Python 3 runtime for Java

+ +
+
+ Python icon +
+
+
+
+
+
+ + +
+
+
+
+

Benefits

+
+
+
+ access icon +
+
+

Python for Java

+
+ +
+
+
+ compatibility icon +
+
+

Python 3 Compatible

+
+
+
Compatible with many Python packages, including popular AI and Data Science libraries
+
+
+
+
+ speed icon +
+
+

Fastest Python on the JVM

+
+
+
Graal JIT compiles Python for native code speed
+
+
+
+
+
+
+ upgrade icon +
+
+

Modern Python for the JVM

+
+
+
GraalPy provides an upgrade path for Jython users
+
+
+
+
+ code icon +
+
+

Script Java with Python

+
+
+
Extend applications with Python scripts that interact with Java
+
+
+
+
+ binary icon +
+
+

Simple distribution

+
+
+
Package Python applications as a single binary with GraalVM Native Image
+
+
+
+
+
+
+
+ + +
+
+
+
+

How to Get Started

+
+
You have the option to extend your Java application with Python, or go straight to the starter project
+
+
+
+

1. Add GraalPy as a dependency from Maven Central

+
+
+
+
+

1. Add GraalPy as a dependency from Maven Central

+
+ {%- highlight xml -%} + + org.graalvm.polyglot + polyglot + {{ site.language_version }} + + + org.graalvm.polyglot + python + {{ site.language_version }} + pom + + {%- endhighlight -%} +
+
+ +
+
+
+
+
+

or

+
+ {%- highlight groovy -%} +implementation("org.graalvm.polyglot:polyglot:{{ site.language_version }}") +implementation("org.graalvm.polyglot:python:{{ site.language_version }}") + {%- endhighlight -%} +
+
+ +
+
+
+

2. Embed Python code in Java

+
+
+
+
+

2. Embed Python code in Java

+
+ {%- highlight java -%} +import org.graalvm.polyglot.Context; + +try (Context context = Context.create()) { + context.eval("python", "print('Hello from GraalPy!')"); +} + {%- endhighlight -%} +
+
+ +
+
+
+

3. Add GraalPy plugins for additional Python packages (optional)

+
+
+
+
+

3. Add GraalPy plugins for additional Python packages (optional)

+
+ {%- highlight xml -%} + + org.graalvm.python + graalpy-maven-plugin + {{ site.language_version }} + + + + + + pyfiglet==1.0.2 + + + + process-graalpy-resources + + + + + {%- endhighlight -%} +
+
+ +
+
+
+
+
+

or

+
+ {%- highlight groovy -%} +plugins { + id("org.graalvm.python") version "{{ site.language_version }}" +} + +graalPy { + packages = setOf("pyfiglet==1.0.2") +} + {%- endhighlight -%} +
+
+ +
+
+
+
+
+
+
+ +
+ +
+ +
+ +
+ + +
+
+
+
+

Videos

+
+ +
+
+

Supercharge your Java Applications with Python!
Jfokus'25

+
+
+
Projects such as LangChain4j, Spring AI, and llama3.java got the Java community very excited about AI in the last year. + The Python ecosystem also provides many powerful packages for data science, machine learning, and more. + Wouldn't it be cool if you, as a Java developer, could benefit from this, too? +
+ In this talk, we show how you can get started with GraalPy and use packages from the Python ecosystem. + We also show some live demos and preview upcoming features that will improve the interaction between Java and native extensions that ship with popular Python packages. +
+
+
+
+
+ +
+
+

Supercharge your Java Applications with Python!
Devoxx'24

+
+
+
The Python ecosystem provides many powerful packages for data science, machine learning, and more, that you can now leverage in Java. + Get started by adding GraalPy as a dependency to your Java project. + There are also Maven and Gradle plugins for GraalPy that help you install additional Python packages. + In this presentation, we also show live demos that illustrate different use cases, such as a Spring Boot application that visualizes data with Python, Python running on JBang!, a Java application scripted with Python, and more. +
+
+
+
+
+
+
+
diff --git a/docs/site/module_results/python-module-testing-v241.csv b/docs/site/module_results/python-module-testing-v241.csv new file mode 100644 index 0000000000..76fba74795 --- /dev/null +++ b/docs/site/module_results/python-module-testing-v241.csv @@ -0,0 +1,689 @@ +absl-py,1.3.0,0,99.25 +aif360,0.5.0,2,0.00 +aiodns,3.0.0,1,33.33 +aiofiles,22.1.0,0,98.99 +aiohttp,3.8.3,0,94.55 +aiohttp_cors,0.7.0,0,97.98 +aioredis,2.0.1,2,0.00 +aiorwlock,1.3.0,0,97.78 +aiosignal,1.3.1,0,100.00 +alembic,1.8.1,0,99.64 +aliyun-python-sdk-core,2.13.36,0,90.22 +altair,4.2.2,0,100.00 +ansible-core,2.14.2,1,0.00 +anyio,3.7.0,1,0.00 +appdirs,1.4.4,0,100.00 +APScheduler,3.9.1.post1,1,0.00 +argcomplete,2.0.0,0,100.00 +arrow,1.2.3,0,99.95 +asgiref,3.5.2,0,98.46 +asn1crypto,1.5.1,0,99.87 +astor,0.8.1,0,94.55 +astroid,2.12.13,1,0.00 +astropy,5.2.1,2,0.00 +asttokens,2.2.1,0,82.76 +asttokens,2.4.1,0,96.55 +astunparse,1.6.3,1,60.64 +async-timeout,4.0.2,0,100.00 +async_generator,1.10,0,88.37 +asyncpg,0.27.0,1,0.00 +atomicwrites,1.4.1,0,100.00 +attrs,22.1.0,0,96.04 +autoflake,2.0.0,0,100.00 +autopep8,2.0.1,1,0.00 +autopep8,2.3.1,0,99.65 +awscli,1.27.23,0,99.96 +azure-common,1.1.28,0,100.00 +azure-identity,1.12.0,0,97.45 +azure-storage-blob,12.14.1,2,0.00 +azure-storage-blob,12.18.3,1,0.00 +Babel,2.11.0,0,99.60 +backcall,0.2.0,0,100.00 +backoff,2.2.1,0,97.48 +bandit,1.7.4,1,0.00 +base58,2.1.1,0,100.00 +bcrypt,4.0.1,0,100.00 +bcrypt,4.2.0,0,100.00 +beautifulsoup4,4.11.1,0,99.81 +biopython,1.80,1,0.00 +black,22.10.0,1,44.19 +black,24.2.0,1,53.81 +bleach,5.0.0,0,100.00 +blessed,1.20.0,1,0.00 +blessings,1.7,1,0.00 +blinker,1.5,0,78.57 +blis,0.9.1,2,0.00 +bokeh,3.0.2,2,0.00 +boto3,1.26.23,1,66.01 +boto3,1.34.116,0,93.91 +botocore,1.29.23,1,0.00 +bottle,0.12.23,0,100.00 +build,0.9.0,0,95.65 +bump2version,1.0.1,0,97.63 +CacheControl,0.12.11,1,0.00 +cached-property,1.5.2,2,0.00 +cachetools,5.2.0,0,99.52 +catalogue,2.0.8,0,100.00 +catboost,1.2.2,2,0.00 +category-encoders,2.5.1.post0,1,0.00 +category-encoders,2.6.3,1,0.00 +cchardet,2.1.7,2,0.00 +celery,5.2.7,2,0.00 +celery,5.3.6,2,0.00 +Cerberus,1.3.4,0,100.00 +certifi,2022.9.24,0,100.00 +cffi,1.15.1,1,0.00 +chardet,5.1.0,0,100.00 +charset-normalizer,3.0.1,0,81.68 +charset-normalizer,3.3.2,0,79.56 +check-manifest,0.49,0,100.00 +circuitbreaker,2.0.0,0,100.00 +click,8.1.3,0,100.00 +cliff,4.3.0,1,0.00 +cloudpickle,2.2.1,0,98.85 +cmaes,0.9.1,1,0.00 +cmd2,2.4.3,1,0.00 +codecov,2.1.12,0,100.00 +colorama,0.4.6,0,100.00 +coloredlogs,15.0.1,1,0.00 +colorful,0.5.5,0,99.65 +colorlog,6.7.0,0,100.00 +commonmark,0.9.1,0,100.00 +ConfigArgParse,1.5.3,0,100.00 +configobj,5.0.6,0,100.00 +configparser,5.3.0,0,95.79 +confluent-kafka,2.0.2,1,0.00 +cookiecutter,2.1.1,0,99.68 +coverage,6.5.0,1,0.00 +coveralls,3.3.1,1,0.00 +cryptography,3.4.7,0,99.90 +cryptography,42.0.5,0,99.23 +cryptography,43.0.0,0,99.24 +cssselect,1.2.0,0,100.00 +cycler,0.11.0,0,100.00 +cymem,2.0.7,2,0.00 +Cython,0.29.32,1,0.00 +dask,2022.12.0,1,0.00 +dataclasses-json,0.5.7,0,99.57 +datasets,2.10.0,1,69.88 +datasets,2.18.0,1,0.00 +dateparser,1.1.4,0,99.98 +DateTime,4.7,2,0.00 +DAWG-Python,0.7.2,2,0.00 +debugpy,1.6.7,1,0.00 +decorator,5.1.1,0,100.00 +deepdiff,6.2.1,2,0.00 +defusedxml,0.7.1,0,95.06 +Deprecated,1.2.13,0,88.68 +dice-ml,0.9,2,0.00 +dill,0.3.6,1,0.00 +discord.py,2.1.0,1,0.00 +distlib,0.3.6,0,77.02 +distributed,2022.12.0,2,0.00 +distro,1.8.0,0,100.00 +Django,4.1.4,2,0.00 +django-filter,22.1,0,93.11 +django-model-utils,4.3.1,0,99.40 +djangorestframework,3.14.0,1,29.40 +dnspython,2.2.1,0,95.61 +docker,6.0.1,0,99.83 +docopt,0.6.2,0,100.00 +docutils,0.19,0,99.81 +dohq-artifactory,0.8.4,0,96.39 +ecdsa,0.18.0,1,0.00 +einops,0.6.0,2,0.00 +elasticsearch,8.13.0,0,94.04 +elasticsearch,8.5.2,2,0.00 +email-validator,1.3.1,0,100.00 +emoji,2.2.0,0,97.37 +entrypoints,0.4,0,100.00 +eventlet,0.33.3,1,0.00 +execnet,1.9.0,2,0.00 +executing,1.2.0,1,43.33 +faiss,1.5.3,2,0.00 +fake-useragent,1.1.1,0,100.00 +Faker,15.3.4,0,99.46 +fastapi,0.88.0,1,0.00 +feedparser,6.0.10,1,0.00 +filelock,3.8.2,0,100.00 +Fiona,1.9.1,1,0.00 +fiona,1.9.1,1,0.00 +fire,0.4.0,2,0.00 +fire,0.6.0,0,99.63 +flake8,6.0.0,0,99.13 +flake8-bandit,4.1.1,0,88.89 +flake8-bugbear,23.2.13,0,94.23 +flake8-comprehensions,3.11.1,0,99.22 +flake8-polyfill,1.0.2,2,0.00 +Flask,2.2.2,0,100.00 +Flask-Cors,3.0.10,0,100.00 +Flask-Login,0.6.2,0,100.00 +Flask-OpenTracing,1.1.0,0,93.75 +Flask-RESTful,0.3.9,0,99.06 +Flask-SQLAlchemy,3.0.3,0,100.00 +Flask-WTF,1.0.1,0,96.08 +flatbuffers,23.5.26,2,0.00 +fonttools,4.38.0,2,0.00 +fpdf2,2.7.4,1,0.00 +freezegun,1.2.1,0,99.19 +frozenlist,1.3.3,2,0.00 +fsspec,2022.11.0,0,88.27 +fsspec,2023.12.2,0,75.76 +fsspec,2024.2.0,0,97.15 +future,0.18.2,1,0.00 +fuzzywuzzy,0.18.0,0,98.59 +gast,0.5.4,0,97.87 +GDAL,3.6.1,1,0.06 +gensim,4.2.0,2,0.00 +geojson,3.0.0,2,0.00 +geojson,3.1.0,0,100.00 +geopandas,0.12.1,0,96.43 +geopy,2.3.0,1,0.00 +gevent,22.10.2,1,0.00 +gitdb,4.0.10,0,100.00 +gitdb2,4.0.2,0,80.00 +GitPython,3.1.29,0,99.34 +google-api-core,2.11.0,2,0.00 +google-api-python-client,2.68.0,0,99.67 +google-auth,2.15.0,2,0.00 +google-auth-httplib2,0.1.0,0,100.00 +google-auth-oauthlib,1.0.0,2,0.00 +google-cloud-bigquery,3.4.0,2,0.00 +google-cloud-storage,2.6.0,0,100.00 +google-pasta,0.2.0,0,78.24 +googleapis-common-protos,1.57.0,2,0.00 +gpustat,1.1,2,0.00 +graphviz,0.20.1,2,0.00 +graphviz,0.20.3,0,99.73 +greenlet,2.0.1,1,0.00 +grpcio,1.51.1,1,0.00 +grpcio,1.60.0,1,0.00 +grpcio-tools,1.51.1,2,0.00 +grpcio-tools,1.60.0,2,0.00 +gssapi,1.8.2,2,0.00 +gunicorn,20.1.0,1,0.00 +gym,0.26.2,2,0.00 +h11,0.14.0,0,100.00 +h5py,3.10.0,0,98.64 +horovod,0.28.1,1,53.59 +html2text,2020.1.16,0,100.00 +html5lib,1.1,0,99.99 +httplib2,0.21.0,1,0.00 +httplib2,0.22.0,0,99.60 +httpx,0.23.1,1,0.00 +huggingface-hub,0.15.1,2,0.00 +humanfriendly,10.0,1,27.78 +humanize,4.4.0,0,100.00 +hvac,1.1.1,1,47.56 +hypothesis,6.60.0,1,0.00 +idna,3.4,0,100.00 +imageio,2.22.4,0,85.79 +imbalanced-learn,0.10.0,2,0.00 +implicit,0.7.2,0,97.48 +importlib-metadata,5.1.0,0,100.00 +importlib-resources,5.10.1,0,88.81 +inflection,0.5.1,0,100.00 +iniconfig,2.0.0,0,100.00 +invoke,1.7.3,2,0.00 +ipaddress,1.0.23,2,0.00 +ipdb,0.13.9,0,100.00 +ipykernel,6.17.1,1,0.00 +ipython,8.7.0,1,0.00 +ipywidgets,8.0.3,0,91.23 +iso8601,1.1.0,0,100.00 +isodate,0.6.1,0,100.00 +isort,5.10.1,0,98.65 +itsdangerous,2.1.2,0,100.00 +jaeger-client,4.8.0,2,0.00 +jax,0.4.13,2,0.00 +jedi,0.18.2,1,0.00 +jeepney,0.8.0,2,0.00 +jieba,0.42.1,0,100.00 +Jinja2,3.1.2,0,99.76 +jmespath,1.0.1,0,100.00 +joblib,1.2.0,0,84.36 +jsii,1.72.0,2,0.00 +json5,0.9.14,0,100.00 +jsonpickle,3.0.0,1,0.00 +jsonschema,4.17.3,1,0.00 +jupyter-client,7.4.8,1,0.00 +jupyter-core,5.2.0,0,100.00 +jupyterlab,3.5.1,1,0.00 +kafka-python,2.0.2,0,91.89 +kazoo,2.9.0,2,0.00 +keras,2.14.0,2,0.00 +Keras-Preprocessing,1.1.2,1,56.67 +keyboard,0.13.5,0,99.36 +keyring,23.11.0,0,80.26 +keyring,25.2.1,0,99.65 +kiwisolver,1.4.4,0,100.00 +krb5,0.5.0,0,100.00 +kubernetes,25.3.0,0,99.62 +lark-parser,0.12.0,2,0.00 +lazy-object-proxy,1.8.0,0,96.87 +libclang,16.0.0,2,0.00 +librosa,0.9.2,2,0.00 +lightfm,1.17,2,0.00 +lightgbm,3.3.3,0,99.28 +lightgbm,4.3.0,2,0.00 +livereload,2.6.3,2,0.00 +lizard,1.17.10,1,0.00 +llvmlite,0.40.1,2,0.00 +llvmlite,0.40.2,2,0.00 +llvmlite,0.42.0,1,0.00 +loguru,0.6.0,2,0.00 +loguru,0.7.2,2,0.00 +logzero,1.7.0,1,0.00 +lxml,4.9.1,0,94.24 +lxml,5.3.0,1,0.00 +m2r2,0.3.3,0,100.00 +Mako,1.2.4,0,100.00 +Markdown,3.4.1,0,100.00 +MarkupSafe,2.1.1,0,100.00 +marshmallow,3.19.0,0,100.00 +matplotlib,3.7.0,0,99.62 +matplotlib-inline,0.1.6,2,0.00 +mccabe,0.7.0,0,93.75 +memory-profiler,0.61.0,2,0.00 +mistune,2.0.4,0,100.00 +mkdocs,1.4.2,0,100.00 +mkdocstrings,0.19.0,1,0.00 +mlflow,2.0.1,2,0.00 +mock,4.0.3,1,0.00 +more-itertools,9.0.0,1,0.00 +moto,4.1.2,1,7.18 +moviepy,1.0.3,0,84.55 +msgpack,1.0.4,1,0.00 +msrest,0.7.1,1,0.00 +multidict,6.0.3,1,72.08 +multiprocess,0.70.14,2,0.00 +murmurhash,1.0.9,2,0.00 +mypy,0.991,0,96.62 +mypy-extensions,0.4.3,0,85.71 +mypy-extensions,1.0.0,0,100.00 +mysql-connector-python,8.0.31,1,0.00 +mysqlclient,2.1.1,0,100.00 +myst-parser,0.18.1,0,95.94 +natsort,8.2.0,1,0.00 +nbconvert,7.2.6,0,97.66 +nbformat,5.7.0,0,100.00 +nest-asyncio,1.5.6,0,100.00 +netaddr,0.8.0,0,100.00 +netCDF4,1.6.2,0,91.35 +netifaces,0.11.0,0,100.00 +networkx,2.8.8,1,0.00 +nibabel,4.0.2,2,0.00 +nltk,3.7,1,0.00 +nltk,3.8.1,0,98.12 +notebook,6.5.2,1,39.17 +nox,2022.11.21,0,97.71 +numba,0.56.4,2,0.00 +numba,0.59.1,1,0.00 +numexpr,2.8.4,0,84.38 +numpy,1.23.5,0,88.55 +numpy,1.24.3,0,95.24 +numpydoc,1.5.0,0,99.59 +oauthlib,3.2.2,0,99.85 +oci,2.104.3,1,56.76 +onnx,1.12.0,2,0.00 +onnx,1.15.0,0,99.28 +onnx,1.16.0,2,0.00 +onnxmltools,1.11.1,1,0.00 +onnxruntime,1.14.1,0,79.10 +onnxruntime,1.17.1,0,98.31 +openai,0.27.4,0,80.70 +opencensus,0.11.2,2,0.00 +opencensus-context,0.1.3,2,0.00 +opencv-python,4.6.0.66,2,0.00 +opencv-python-headless,4.6.0.66,2,0.00 +openpyxl,3.0.10,0,99.55 +opentracing,2.4.0,2,0.00 +opt-einsum,3.3.0,0,99.91 +optree,0.12.1,1,0.00 +optuna,3.1.1,2,0.00 +optuna,3.2.0,0,98.30 +oracledb,1.3.2,0,99.82 +oracledb,2.2.1,0,83.76 +orbit-ml,1.1.4.2,2,0.00 +orjson,3.8.3,1,0.00 +orjson,3.9.7,1,0.17 +oslo.config,9.0.0,1,0.00 +oslo.utils,6.1.0,1,0.00 +packaging,21.3,0,100.00 +paho-mqtt,1.6.1,0,100.00 +pandas,1.5.2,0,86.84 +papermill,2.4.0,0,99.45 +paramiko,2.12.0,0,99.76 +parse,1.19.0,0,100.00 +parso,0.8.3,0,91.49 +pathlib2,2.3.7.post1,0,100.00 +pathos,0.3.0,1,0.00 +pathspec,0.10.2,0,100.00 +pathy,0.10.2,0,100.00 +patsy,0.5.3,0,98.65 +pbr,5.11.0,1,0.00 +peewee,3.15.4,0,100.00 +pendulum,2.1.2,0,99.83 +pep8-naming,0.13.2,0,100.00 +peppercorn,0.6,0,100.00 +pexpect,4.8.0,1,29.91 +phonenumbers,8.13.6,1,49.34 +pickleshare,0.7.5,0,100.00 +pika,1.3.1,0,83.57 +pillow,10.2.0,0,99.00 +pillow,10.3.0,0,99.03 +Pillow,9.3.0,0,98.15 +pillow,9.3.0,0,98.17 +Pint,0.20.1,0,99.09 +pip,22.3.1,1,58.47 +pip-tools,6.11.0,0,90.05 +pkginfo,1.9.2,0,100.00 +platformdirs,3.0.0,0,100.00 +plotly,5.11.0,1,0.00 +pluggy,1.0.0,0,100.00 +ply,3.11,0,90.91 +polyleven,0.8,0,100.00 +pre-commit,2.20.0,1,0.00 +preshed,3.0.8,2,0.00 +prettytable,3.5.0,0,100.00 +progress,1.6,0,100.00 +progressbar2,4.2.0,0,100.00 +prometheus-client,0.15.0,0,100.00 +prompt-toolkit,3.0.33,0,100.00 +prophet,1.1.4,0,100.00 +prophet,1.1.5,0,100.00 +protobuf,4.21.10,1,0.00 +psutil,5.9.4,0,76.03 +psutil,5.9.5,0,93.68 +psutil,5.9.8,1,0.00 +psycopg2,2.9.5,0,98.11 +psycopg2,2.9.9,0,98.25 +psycopg2-binary,2.9.9,0,98.11 +ptyprocess,0.7.0,1,14.29 +pure-eval,0.2.2,0,97.87 +py,1.11.0,0,91.22 +py-spy,0.3.14,2,0.00 +py4j,0.10.9.7,2,0.00 +pyaml,21.10.1,0,100.00 +pyarrow,12.0.0,0,98.15 +pyarrow,15.0.0,0,98.22 +pyasn1,0.4.8,0,97.90 +pyasn1-modules,0.2.8,0,100.00 +PyAudio,0.2.12,1,42.31 +PyAutoGUI,0.9.53,1,0.00 +pybind11,2.10.1,2,0.00 +pycodestyle,2.10.0,0,98.11 +pycparser,2.21,0,98.46 +pycryptodome,3.16.0,1,0.00 +pycryptodomex,3.16.0,1,0.00 +pydantic,1.10.2,1,0.00 +pydata-sphinx-theme,0.12.0,2,0.00 +pydicom,2.3.1,0,99.64 +pydocstyle,6.1.1,2,0.00 +pydot,1.4.2,0,93.75 +PyDriller,2.2,0,99.60 +pydub,0.25.1,1,0.00 +pyfiglet,0.8.post0,0,100.00 +pyflakes,3.0.1,0,99.45 +pygame,2.1.2,2,0.00 +PyGithub,1.57,0,100.00 +Pygments,2.13.0,0,100.00 +PyGObject,3.42.2,1,0.00 +PyJWT,2.6.0,1,0.00 +pylint,2.15.8,1,0.00 +pymdown-extensions,10.0.1,0,98.95 +pymongo,4.3.3,0,99.45 +pymorphy2,0.9.1,1,0.00 +pymorphy2-dicts-ru,2.4.417127.4579844,2,0.00 +PyNaCl,1.5.0,0,100.00 +pyod,1.0.6,1,0.00 +pyod,1.1.3,1,0.00 +pyodbc,4.0.35,1,0.00 +pyOpenSSL,22.1.0,1,0.00 +pypandoc,1.10,0,87.50 +pyparsing,3.0.9,0,100.00 +PyPDF2,2.11.2,2,0.00 +PyPDF2,3.0.0,2,0.00 +pyperclip,1.8.2,0,100.00 +pyproj,3.4.0,0,98.93 +pyqtgraph,0.13.1,1,0.00 +pyramid,2.0,0,99.89 +pyrsistent,0.19.2,0,100.00 +pysam,0.20.0,1,0.00 +pyserial,3.5,0,93.48 +PySide2,5.15.2.1,2,0.00 +PySocks,1.7.1,0,100.00 +pysolr,3.9.0,1,0.00 +pyspark,3.4.1,1,0.00 +pyspnego,0.9.1,0,99.70 +pytesseract,0.3.10,0,89.58 +pytest,7.2.0,0,97.45 +pytest,8.0.0,0,98.54 +pytest,8.3.2,0,98.57 +pytest-asyncio,0.20.3,1,0.00 +pytest-benchmark,4.0.0,0,94.14 +pytest-cov,4.0.0,1,62.50 +pytest-django,4.5.2,1,0.00 +pytest-django,4.8.0,0,79.40 +pytest-flake8,1.1.1,0,100.00 +pytest-forked,1.6.0,0,90.91 +pytest-mock,3.10.0,0,98.72 +pytest-mypy,0.10.2,0,84.21 +pytest-runner,6.0.0,1,44.44 +pytest-sugar,0.9.6,1,0.00 +pytest-sugar,1.0.0,0,83.00 +pytest-timeout,2.1.0,0,75.47 +pytest-xdist,3.1.0,0,93.30 +python-dateutil,2.8.2,0,98.71 +python-dotenv,0.21.0,0,93.10 +python-editor,1.0.4,2,0.00 +python-jose,3.3.0,0,99.79 +python-json-logger,2.0.4,0,100.00 +python-magic,0.4.27,0,95.00 +python-multipart,0.0.5,0,90.38 +python-slugify,7.0.0,0,98.77 +pytorch-lightning,1.8.3.post1,2,0.00 +pytorch-tabnet,4.0,1,0.00 +pytz,2022.6,0,100.00 +PyYAML,6.0,0,100.00 +pyzmq,24.0.1,0,98.04 +qrcode,7.3.1,0,98.63 +QtPy,2.3.0,2,0.00 +rasterio,1.3.4,2,0.00 +ray,2.3.0,2,0.00 +ray,2.9.1,2,0.00 +rdflib,6.2.0,1,0.00 +readme-renderer,37.3,0,87.67 +recommonmark,0.7.1,1,60.71 +redis,4.4.0,0,99.59 +regex,2022.10.31,0,99.01 +reportlab,3.6.12,1,0.00 +requests,2.28.1,0,99.49 +requests-cache,0.9.7,1,41.98 +requests-kerberos,0.14.0,0,100.00 +requests-mock,1.10.0,0,100.00 +requests-oauthlib,1.3.1,0,95.59 +requests-toolbelt,0.10.1,0,100.00 +responses,0.22.0,0,95.38 +retrying,1.3.4,0,100.00 +rfc3986,2.0.0,0,100.00 +rich,12.6.0,0,94.27 +robotframework,6.0.1,1,5.98 +rsa,4.9,0,98.85 +ruamel.yaml,0.17.21,0,99.76 +s3fs,2022.11.0,1,8.38 +s3transfer,0.10.1,1,49.39 +s3transfer,0.6.0,2,0.00 +sacremoses,0.0.53,2,0.00 +sanic,22.9.1,2,0.00 +sanic,23.12.1,1,0.00 +schedule,1.1.0,0,82.86 +schema,0.7.5,0,100.00 +scikit-image,0.19.3,2,0.00 +scikit-learn,1.1.3,1,65.03 +scikit-learn,1.2.2,0,85.12 +scipy,1.10.1,1,63.17 +Scrapy,2.7.1,1,0.00 +seaborn,0.12.1,1,65.38 +seaborn,0.13.2,1,0.00 +SecretStorage,3.3.3,1,26.92 +seldon-core,1.16.0,2,0.00 +selenium,4.20.0,2,0.00 +selenium,4.7.2,1,0.00 +semantic-version,2.10.0,0,100.00 +semver,2.13.0,1,50.00 +semver,3.0.2,0,100.00 +sentence-transformers,2.2.2,2,0.00 +sentencepiece,0.1.97,1,0.00 +sentry-sdk,1.15.0,0,87.63 +setproctitle,1.3.2,0,82.14 +setproctitle,1.3.3,0,82.14 +setuptools,65.5.0,0,89.31 +setuptools,65.6.3,2,0.00 +setuptools-scm,7.0.5,0,100.00 +setuptools-scm-git-archive,1.4,2,0.00 +sh,1.14.3,1,14.86 +shap,0.41.0,2,0.00 +shap,0.45.1,2,0.00 +shapely,2.0.0,0,99.97 +simplejson,3.18.0,0,100.00 +six,1.16.0,0,100.00 +skl2onnx,1.13,2,0.00 +skl2onnx,1.16,2,0.00 +sktime,0.19.1,2,0.00 +sktime,0.24.0,0,96.94 +slackclient,2.9.4,0,98.89 +slicer,0.0.7,2,0.00 +smart-open,6.3.0,2,0.00 +smart-open,7.0.4,1,0.00 +smmap,5.0.0,0,100.00 +smmap2,3.0.1,2,0.00 +sniffio,1.3.0,0,100.00 +snowballstemmer,2.2.0,2,0.00 +sortedcontainers,2.4.0,1,0.00 +soupsieve,2.3.2.post1,0,100.00 +spacy,3.4.3,2,0.00 +spacy-legacy,3.0.12,2,0.00 +spacy-lookups-data,1.0.3,2,0.00 +spacy-pkuseg,0.0.32,2,0.00 +Sphinx,5.3.0,1,47.80 +sphinx-autobuild,2021.3.14,0,100.00 +sphinx-autodoc-typehints,1.19.5,0,94.74 +sphinx-click,4.4.0,2,0.00 +sphinx-click,6.0.0,0,100.00 +sphinx-gallery,0.11.1,0,81.95 +sphinx-multiversion,0.2.4,0,100.00 +sphinx-rtd-theme,1.1.1,1,0.00 +sphinxcontrib-bibtex,2.5.0,2,0.00 +sphinxcontrib-bibtex,2.6.2,0,98.37 +SQLAlchemy,1.4.44,1,0.00 +SQLAlchemy,1.4.52,1,0.00 +SQLAlchemy-Utils,0.38.3,0,77.62 +sqlparse,0.4.3,0,100.00 +srsly,2.4.6,2,0.00 +stack-data,0.6.2,2,0.00 +starlette,0.23.0,1,0.00 +statsmodels,0.13.5,1,0.00 +statsmodels,0.14.0,1,0.00 +statsmodels,0.14.1,1,0.00 +stevedore,4.1.1,1,0.00 +streamlit,1.15.2,2,0.00 +structlog,22.3.0,0,96.26 +sympy,1.11.1,1,0.00 +tables,3.7.0,2,0.00 +tabulate,0.9.0,0,99.33 +tenacity,8.1.0,0,99.07 +tensorboard,2.11.0,2,0.00 +tensorboard-data-server,0.7.1,2,0.00 +tensorboard-plugin-wit,1.8.1,2,0.00 +tensorboardX,2.6.1,1,0.00 +tensorflow,2.15.0,1,0.00 +tensorflow-estimator,2.12.0,2,0.00 +tensorflow-gpu,2.11.0,2,0.00 +tensorflow-io-gcs-filesystem,0.32.0,2,0.00 +tensorflow-probability,0.19.0,2,0.00 +termcolor,2.1.1,0,100.00 +terminaltables,3.1.10,0,90.76 +testbook,0.4.2,0,100.00 +thinc,8.1.10,1,43.84 +threadloop,1.0.2,2,0.00 +threadpoolctl,3.1.0,0,100.00 +thrift,0.16.0,2,0.00 +tifffile,2022.10.10,2,0.00 +tinydb,4.7.0,0,100.00 +tldextract,3.4.0,1,0.00 +tokenizers,0.13.3,2,0.00 +toml,0.10.2,0,91.30 +tomli,2.0.1,0,100.00 +tomlkit,0.11.6,0,99.76 +toolz,0.12.0,0,97.06 +torch,1.13.1,0,98.14 +torch,2.2.1,2,11.56 +torchvision,0.14.1,1,0.00 +torchvision,0.17.1,0,98.20 +tornado,6.2,0,98.05 +tox,3.27.1,0,90.14 +tqdm,4.64.1,1,0.00 +tqdm,4.66.4,0,98.01 +traitlets,5.6.0,0,99.82 +transformers,4.33.3,2,0.00 +trio,0.22.0,1,0.00 +twine,4.0.2,0,96.11 +Twisted,22.10.0,2,0.00 +typed-ast,1.5.4,1,0.00 +typeguard,2.13.3,1,74.49 +typer,0.7.0,1,0.00 +types-pytz,2022.6.0.1,0,85.71 +types-PyYAML,6.0.12.2,0,85.71 +types-requests,2.28.11.5,1,71.43 +types-requests,2.31.0.20240311,2,0.00 +types-setuptools,65.6.0.2,0,85.71 +typing-extensions,4.4.0,2,0.00 +tzlocal,4.2,0,100.00 +ujson,5.10.0,0,96.91 +ujson,5.6.0,0,97.85 +umap-learn,0.5.3,1,0.00 +Unidecode,1.3.6,0,98.57 +urllib3,1.26.13,0,98.59 +uvicorn,0.20.0,1,30.80 +uvloop,0.17.0,1,0.50 +uvloop,0.19.0,1,0.00 +validators,0.20.0,0,100.00 +versioneer,0.28,0,83.94 +virtualenv,20.17.1,0,86.46 +virtualenv,20.26.3,1,61.75 +wagtail,4.1.1,1,0.00 +waitress,2.1.2,1,0.00 +wandb,0.13.5,1,33.33 +wasabi,1.1.2,0,100.00 +watchdog,2.2.0,0,96.99 +wcwidth,0.2.13,0,100.00 +wcwidth,0.2.5,1,63.64 +webdriver-manager,3.8.5,0,75.29 +webencodings,0.5.1,0,87.50 +WebOb,1.8.7,0,98.16 +websocket-client,1.4.2,0,98.46 +websockets,10.4,1,0.00 +Werkzeug,2.2.2,0,96.30 +wget,3.2,0,100.00 +wheel,0.38.4,0,98.57 +wheel,0.43.0,0,100.00 +wrapt,1.14.1,0,92.35 +WTForms,3.0.1,0,100.00 +xarray,2022.12.0,0,99.60 +xarray,2024.6.0,0,99.89 +xgboost,1.7.1,0,83.15 +xgboost,2.0.3,2,0.00 +xlrd,2.0.1,0,100.00 +XlsxWriter,3.0.3,0,100.00 +xlwt,1.3.0,0,100.00 +xmltodict,0.13.0,0,100.00 +xxhash,3.2.0,0,100.00 +yamale,4.0.4,0,100.00 +yapf,0.32.0,1,0.00 +yarl,1.8.2,0,99.24 +youtube_dl,2021.12.17,0,86.87 +zarr,2.14.0,1,0.00 +zeep,4.2.1,0,99.39 +zipp,3.11.0,1,0.00 +zope.interface,5.5.2,0,94.97 diff --git a/docs/site/module_results/python-module-testing-v242.csv b/docs/site/module_results/python-module-testing-v242.csv new file mode 100644 index 0000000000..8e19918730 --- /dev/null +++ b/docs/site/module_results/python-module-testing-v242.csv @@ -0,0 +1,615 @@ +absl-py,1.3.0,0,98.61 +aif360,0.5.0,2,0.00 +aiodns,3.0.0,1,33.33 +aiofiles,22.1.0,0,98.99 +aiohttp,3.8.3,0,94.55 +aiohttp_cors,0.7.0,2,0.00 +aioredis,2.0.1,2,0.00 +aiorwlock,1.3.0,0,97.78 +aiosignal,1.3.1,0,100.00 +alembic,1.8.1,0,99.64 +aliyun-python-sdk-core,2.13.36,0,90.22 +altair,4.2.2,0,100.00 +annotated-types,0.7.0,0,100.00 +ansible-core,2.14.2,1,0.00 +anyio,3.7.0,1,0.00 +appdirs,1.4.4,0,100.00 +APScheduler,3.9.1.post1,1,0.00 +argcomplete,2.0.0,0,100.00 +arrow,1.2.3,0,99.95 +asgiref,3.5.2,0,98.46 +asn1crypto,1.5.1,0,99.87 +astor,0.8.1,0,94.55 +astroid,2.12.13,1,0.00 +astropy,5.2.1,2,0.00 +asttokens,2.4.1,0,96.55 +async-timeout,4.0.2,0,100.00 +async_generator,1.10,0,88.37 +asyncpg,0.27.0,1,0.00 +atomicwrites,1.4.1,0,100.00 +attrs,22.1.0,0,96.12 +autoflake,2.0.0,0,100.00 +autopep8,2.3.1,0,99.65 +awscli,1.34.23,1,0.00 +azure-common,1.1.28,0,100.00 +azure-identity,1.12.0,0,97.45 +azure-storage-blob,12.18.3,1,0.00 +backcall,0.2.0,0,100.00 +backoff,2.2.1,0,97.48 +bandit,1.7.4,1,0.00 +base58,2.1.1,0,100.00 +bcrypt,4.2.0,0,100.00 +beautifulsoup4,4.11.1,0,99.04 +biopython,1.80,1,0.00 +black,24.2.0,0,99.61 +bleach,5.0.0,0,100.00 +blessed,1.20.0,1,0.00 +blessings,1.7,1,0.00 +blinker,1.8.2,0,80.00 +blis,0.9.1,2,0.00 +bokeh,3.0.2,2,0.00 +boto3,1.34.116,0,93.91 +botocore,1.35.23,1,0.00 +bottle,0.12.23,0,100.00 +build,0.9.0,0,95.65 +bump2version,1.0.1,0,97.63 +CacheControl,0.12.11,1,0.00 +cachetools,5.2.0,0,99.52 +catalogue,2.0.8,0,100.00 +catboost,1.2.3,2,0.00 +category-encoders,2.6.1,1,0.00 +celery,5.3.6,2,0.00 +Cerberus,1.3.4,0,100.00 +certifi,2022.9.24,0,100.00 +cffi,1.17.1,1,0.00 +chardet,5.1.0,0,100.00 +charset-normalizer,3.3.2,0,79.56 +check-manifest,0.49,0,100.00 +circuitbreaker,2.0.0,0,100.00 +click,8.1.7,0,100.00 +cliff,4.3.0,1,0.00 +cloudpickle,2.2.1,0,98.85 +cmaes,0.9.1,1,0.00 +cmd2,2.4.3,1,0.00 +codecov,2.1.12,0,100.00 +colorama,0.4.6,0,100.00 +coloredlogs,15.0.1,1,0.00 +colorful,0.5.5,0,100.00 +colorlog,6.7.0,0,100.00 +commonmark,0.9.1,0,100.00 +ConfigArgParse,1.7,0,100.00 +configobj,5.0.6,0,100.00 +configparser,5.3.0,0,97.63 +confluent-kafka,2.0.2,1,0.00 +contourpy,1.2.1,0,99.00 +contourpy,1.3.0,0,98.37 +cookiecutter,2.1.1,0,99.68 +coverage,6.5.0,1,0.00 +coveralls,3.3.1,1,0.00 +cryptography,43.0.0,0,100.00 +cssselect,1.2.0,0,100.00 +cycler,0.11.0,0,100.00 +cymem,2.0.7,2,0.00 +Cython,0.29.32,2,0.00 +dask,2022.12.0,1,0.00 +dataclasses-json,0.5.7,0,99.57 +datasets,2.18.0,1,0.00 +dateparser,1.1.4,0,99.98 +DateTime,4.7,1,0.00 +DAWG-Python,0.7.2,2,0.00 +debugpy,1.6.7,1,0.00 +decorator,5.1.1,0,100.00 +deepdiff,6.2.1,2,0.00 +defusedxml,0.7.1,0,95.06 +Deprecated,1.2.13,0,88.68 +dice-ml,0.9,2,0.00 +dill,0.3.6,1,0.00 +discord.py,2.1.0,1,0.00 +diskcache,5.6.3,1,0.00 +distlib,0.3.6,0,77.02 +distributed,2022.12.0,2,0.00 +distro,1.8.0,0,100.00 +Django,4.1.4,2,0.00 +django-filter,22.1,0,94.09 +django-model-utils,4.3.1,0,99.40 +djangorestframework,3.14.0,0,99.72 +dnspython,2.2.1,0,95.61 +docker,6.0.1,0,99.83 +docopt,0.6.2,0,100.00 +docutils,0.19,0,99.81 +dohq-artifactory,0.8.4,0,96.39 +ecdsa,0.18.0,1,0.00 +einops,0.6.0,2,0.00 +elasticsearch,8.13.0,0,94.04 +email-validator,2.2.0,0,100.00 +emoji,2.2.0,0,100.00 +entrypoints,0.4,0,100.00 +eventlet,0.33.3,1,0.00 +execnet,1.9.0,2,0.00 +fake-useragent,1.1.1,0,100.00 +Faker,15.3.4,0,99.46 +fastapi,0.88.0,1,0.00 +feedparser,6.0.10,1,0.00 +filelock,3.8.2,0,100.00 +fiona,1.9.1,1,0.00 +fire,0.6.0,0,99.63 +flake8,6.0.0,0,99.13 +flake8-bandit,4.1.1,0,87.98 +flake8-bugbear,23.2.13,0,96.15 +flake8-comprehensions,3.11.1,0,99.22 +flake8-polyfill,1.0.2,2,0.00 +FLAML,2.3.1,2,0.00 +Flask,3.0.3,0,100.00 +flask-cors,5.0.1,2,0.00 +Flask-Login,0.6.3,0,100.00 +Flask-OpenTracing,1.1.0,0,93.75 +Flask-RESTful,0.3.9,0,98.43 +Flask-SQLAlchemy,3.0.3,0,100.00 +Flask-WTF,1.2.1,0,100.00 +flatbuffers,23.5.26,2,0.00 +fonttools,4.38.0,2,0.00 +fpdf2,2.7.4,1,0.00 +freezegun,1.2.1,0,99.19 +frozenlist,1.3.3,2,0.00 +fsspec,2024.2.0,0,94.25 +future,0.18.2,1,0.00 +fuzzywuzzy,0.18.0,0,98.59 +gast,0.5.4,0,97.87 +gensim,4.3.1,1,0.00 +geojson,3.1.0,0,100.00 +geopandas,0.12.1,0,94.96 +geopy,2.3.0,0,98.78 +gevent,22.10.2,2,0.00 +gitdb,4.0.10,0,95.83 +gitdb2,4.0.2,0,80.00 +GitPython,3.1.29,0,99.56 +google-api-core,2.11.0,1,0.00 +google-api-python-client,2.68.0,0,99.67 +google-auth,2.15.0,0,99.42 +google-auth-httplib2,0.1.0,0,100.00 +google-auth-oauthlib,1.0.0,2,0.00 +google-cloud-bigquery,3.4.0,2,0.00 +google-cloud-storage,2.6.0,0,100.00 +google-pasta,0.2.0,0,78.24 +googleapis-common-protos,1.57.0,0,100.00 +gpustat,1.1,2,0.00 +graphviz,0.20.3,0,99.73 +greenlet,2.0.1,1,0.00 +grpcio,1.60.0,2,0.00 +grpcio-tools,1.60.0,2,0.00 +gssapi,1.8.2,2,0.00 +gunicorn,20.1.0,1,0.00 +h11,0.14.0,0,100.00 +h5py,3.11.0,0,98.79 +horovod,0.28.1,1,53.04 +html2text,2020.1.16,0,100.00 +html5lib,1.1,0,99.99 +httpcore,1.0.6,1,0.00 +httplib2,0.22.0,0,99.60 +httptools,0.6.1,1,0.00 +httpx,0.23.1,1,0.00 +huggingface-hub,0.15.1,1,0.00 +humanfriendly,10.0,1,27.78 +humanize,4.4.0,0,100.00 +hvac,1.1.1,1,47.56 +hypothesis,6.112.1,1,0.00 +idna,3.4,0,100.00 +imageio,2.22.4,0,85.79 +imbalanced-learn,0.12.3,0,99.91 +implicit,0.7.2,0,100.00 +importlib-metadata,5.1.0,0,100.00 +importlib-resources,5.10.1,0,99.64 +inflection,0.5.1,0,100.00 +iniconfig,2.0.0,0,100.00 +invoke,1.7.3,2,0.00 +ipdb,0.13.13,0,100.00 +ipykernel,6.17.1,1,0.00 +ipython,8.7.0,1,0.00 +ipywidgets,8.0.3,0,91.23 +iso8601,1.1.0,0,100.00 +isodate,0.6.1,0,100.00 +isort,5.10.1,0,98.84 +itsdangerous,2.2.0,0,100.00 +jaeger-client,4.8.0,2,0.00 +jax,0.4.13,2,0.00 +jedi,0.18.2,1,0.00 +jeepney,0.8.0,2,0.00 +jieba,0.42.1,0,100.00 +Jinja2,3.1.4,0,99.65 +jiter,0.5.0,0,100.00 +jmespath,1.0.1,0,100.00 +joblib,1.2.0,0,84.02 +jq,1.8.0,1,0.00 +jsii,1.72.0,2,0.00 +json5,0.9.14,0,100.00 +jsonpickle,3.0.0,1,0.00 +jsonschema,4.17.3,1,0.00 +jupyter-client,7.4.8,1,0.00 +jupyter-core,5.2.0,0,100.00 +jupyterlab,3.5.1,1,0.00 +kafka-python,2.0.2,0,91.89 +kazoo,2.9.0,2,0.00 +keras,2.14.0,2,0.00 +Keras-Preprocessing,1.1.2,1,56.67 +keyboard,0.13.5,0,99.36 +keyring,25.2.1,0,99.65 +kiwisolver,1.4.4,0,100.00 +kiwisolver,1.4.5,0,100.00 +krb5,0.5.0,0,100.00 +kubernetes,25.3.0,0,99.62 +langchain,0.3.19,2,0.00 +lark-parser,0.12.0,2,0.00 +lazy-object-proxy,1.8.0,0,96.87 +libclang,16.0.0,2,0.00 +librosa,0.9.2,2,0.00 +lightfm,1.17,2,0.00 +lightgbm,4.3.0,2,0.00 +livereload,2.6.3,2,0.00 +lizard,1.17.10,0,98.35 +llvmlite,0.42.0,1,0.00 +loguru,0.7.2,2,0.00 +logzero,1.7.0,1,0.00 +lxml,5.3.0,1,0.00 +m2r2,0.3.3,0,100.00 +Mako,1.2.4,0,100.00 +Markdown,3.4.1,0,100.00 +MarkupSafe,2.1.5,0,100.00 +marshmallow,3.19.0,0,100.00 +matplotlib,3.9.2,0,99.74 +matplotlib-inline,0.1.7,2,0.00 +mccabe,0.7.0,0,93.75 +memory-profiler,0.61.0,2,0.00 +mistune,2.0.4,0,100.00 +mkdocs,1.4.2,0,100.00 +mkdocstrings,0.19.0,1,0.00 +mlflow,2.0.1,2,0.00 +mock,4.0.3,1,0.00 +more-itertools,9.0.0,1,0.00 +moto,4.1.2,1,4.96 +moviepy,1.0.3,1,0.00 +msgpack,1.0.4,1,0.00 +msrest,0.7.1,1,0.00 +multidict,6.0.3,0,86.99 +multiprocess,0.70.14,2,0.00 +murmurhash,1.0.9,2,0.00 +mypy,0.991,0,96.65 +mypy-extensions,1.0.0,0,100.00 +mysql-connector-python,8.0.31,1,0.00 +mysqlclient,2.1.1,0,100.00 +myst-parser,0.18.1,0,95.94 +natsort,8.2.0,1,0.00 +nbconvert,7.2.6,0,97.66 +nbformat,5.7.0,0,100.00 +nest-asyncio,1.5.6,0,100.00 +netaddr,0.8.0,0,100.00 +netCDF4,1.6.2,0,92.31 +netifaces,0.11.0,0,100.00 +networkx,2.8.8,1,0.00 +nibabel,4.0.2,2,0.00 +nltk,3.8.1,0,97.93 +notebook,6.5.2,1,39.17 +nox,2022.11.21,0,99.54 +numba,0.59.1,1,0.00 +numexpr,2.10.1,0,95.33 +numpy,1.24.3,1,64.39 +numpydoc,1.5.0,0,97.53 +oauthlib,3.2.2,0,99.85 +oci,2.104.3,1,56.76 +onnx,1.16.0,1,0.00 +onnxmltools,1.11.1,1,68.61 +onnxruntime,1.17.1,0,98.31 +openai,0.27.4,0,80.70 +opencensus,0.11.2,2,0.00 +opencensus-context,0.1.3,2,0.00 +opencv-python,4.6.0.66,2,0.00 +opencv-python-headless,4.6.0.66,2,0.00 +openpyxl,3.0.10,0,99.55 +opentracing,2.4.0,2,0.00 +opt-einsum,3.3.0,0,99.93 +optree,0.12.1,1,0.00 +optuna,3.2.0,1,0.00 +oracledb,3.0.0,2,0.00 +orbit-ml,1.1.4.2,1,0.00 +orjson,3.9.7,1,0.17 +oslo.config,9.0.0,1,0.00 +oslo.utils,6.1.0,1,0.00 +packaging,24.1,0,100.00 +paho-mqtt,2.1.0,0,96.95 +pandas,2.2.3,1,36.01 +papermill,2.4.0,0,98.90 +paramiko,2.12.0,0,99.76 +parse,1.19.0,0,100.00 +parso,0.8.3,0,91.49 +pathlib2,2.3.7.post1,0,100.00 +pathos,0.3.0,1,0.00 +pathspec,0.10.2,0,100.00 +pathy,0.10.2,0,100.00 +patsy,1.0.1,0,99.32 +pbr,5.11.0,1,0.00 +peewee,3.15.4,0,100.00 +pendulum,2.1.2,0,99.83 +pep8-naming,0.13.2,0,100.00 +peppercorn,0.6,0,100.00 +pexpect,4.8.0,1,29.91 +phonenumbers,8.13.6,1,49.34 +pickleshare,0.7.5,0,100.00 +pika,1.3.1,0,83.57 +pillow,10.3.0,0,99.06 +Pint,0.20.1,0,99.09 +pip,22.3.1,1,58.47 +pip-tools,6.11.0,0,90.05 +pkginfo,1.9.2,0,100.00 +platformdirs,3.0.0,0,100.00 +plotly,5.11.0,1,0.00 +pluggy,1.0.0,0,100.00 +ply,3.11,0,90.91 +polyleven,0.8,0,100.00 +pre-commit,2.20.0,1,0.00 +preshed,3.0.8,2,0.00 +prettytable,3.5.0,0,100.00 +progress,1.6,0,100.00 +progressbar2,4.2.0,0,100.00 +prometheus-client,0.15.0,0,100.00 +prompt-toolkit,3.0.33,0,100.00 +prophet,1.1.5,0,98.72 +protobuf,4.21.10,2,0.00 +psutil,5.9.8,1,0.00 +psycopg2,2.9.9,0,98.38 +psycopg2-binary,2.9.9,0,97.98 +ptyprocess,0.7.0,1,14.29 +pure-eval,0.2.2,0,97.87 +py,1.11.0,0,95.12 +py-spy,0.3.14,1,25.00 +py4j,0.10.9.7,2,0.00 +pyaml,21.10.1,0,100.00 +pyarrow,15.0.0,1,0.00 +pyasn1,0.4.8,0,97.90 +pyasn1-modules,0.2.8,0,100.00 +PyAudio,0.2.12,1,42.31 +pyautogen,0.3.0,2,0.00 +PyAutoGUI,0.9.53,1,0.00 +pybind11,2.10.1,1,0.00 +pycodestyle,2.10.0,0,98.11 +pycparser,2.21,0,98.46 +pycryptodome,3.16.0,1,0.00 +pycryptodomex,3.16.0,1,0.00 +pydantic,2.4.2,0,98.41 +pydantic-core,2.10.1,0,99.68 +pydantic-settings,2.8.1,1,0.00 +pydata-sphinx-theme,0.12.0,2,0.00 +pydicom,2.3.1,0,99.64 +pydocstyle,6.1.1,2,0.00 +pydot,1.4.2,0,93.75 +PyDriller,2.2,0,99.20 +pydub,0.25.1,1,0.00 +pyfiglet,0.8.post0,0,100.00 +pyflakes,3.0.1,0,99.45 +pygame,2.1.2,2,0.00 +PyGithub,1.57,1,0.00 +Pygments,2.13.0,0,100.00 +PyGObject,3.42.2,2,0.00 +PyJWT,2.6.0,1,0.00 +pylint,2.15.8,1,0.00 +pymdown-extensions,10.0.1,0,89.08 +pymongo,4.9.1,1,14.44 +PyNaCl,1.5.0,0,100.00 +pyod,1.1.3,1,0.00 +pyodbc,4.0.35,1,0.00 +pyOpenSSL,22.1.0,1,0.00 +pypandoc,1.13,0,87.80 +pyparsing,3.0.9,0,100.00 +PyPDF2,3.0.0,0,77.80 +pyperclip,1.8.2,0,100.00 +pyproj,3.7.0,0,100.00 +pyqtgraph,0.13.1,1,0.00 +pyramid,2.0,0,99.89 +pyrsistent,0.20.0,0,100.00 +pysam,0.20.0,1,0.00 +pyserial,3.5,0,93.48 +PySide2,5.15.2.1,2,0.00 +PySocks,1.7.1,0,100.00 +pysolr,3.9.0,1,0.00 +pyspark,3.4.1,2,0.00 +pyspnego,0.9.1,0,99.70 +pytesseract,0.3.10,0,89.58 +pytest,8.3.2,0,98.98 +pytest-asyncio,0.20.3,1,0.00 +pytest-benchmark,4.0.0,0,95.69 +pytest-cov,4.0.0,1,61.72 +pytest-django,4.8.0,0,81.65 +pytest-flake8,1.1.1,0,100.00 +pytest-forked,1.6.0,0,100.00 +pytest-mock,3.10.0,0,96.15 +pytest-mypy,0.10.2,0,84.21 +pytest-runner,6.0.0,1,50.00 +pytest-sugar,1.0.0,0,100.00 +pytest-timeout,2.1.0,0,90.24 +pytest-xdist,3.1.0,0,98.33 +python-dateutil,2.8.2,0,98.71 +python-dotenv,0.21.0,0,93.10 +python-editor,1.0.4,2,0.00 +python-jose,3.3.0,0,99.79 +python-json-logger,2.0.4,0,100.00 +python-magic,0.4.27,0,95.00 +python-multipart,0.0.5,0,90.38 +python-slugify,7.0.0,0,100.00 +pytorch-lightning,1.8.3.post1,2,0.00 +pytorch-tabnet,4.0,1,0.00 +pytype,2024.9.13,2,0.00 +pytz,2022.6,0,100.00 +PyYAML,6.0,0,100.00 +pyzmq,24.0.1,0,97.77 +qrcode,7.3.1,0,98.63 +QtPy,2.3.0,2,0.00 +rasterio,1.3.4,2,0.00 +ray,2.9.1,2,0.00 +rdflib,6.2.0,1,0.00 +readme-renderer,37.3,0,87.67 +redis,4.4.0,0,99.64 +regex,2024.5.15,0,99.02 +reportlab,3.6.12,1,0.00 +requests,2.28.1,0,99.49 +requests-cache,0.9.7,1,41.98 +requests-kerberos,0.14.0,0,100.00 +requests-mock,1.10.0,0,100.00 +requests-oauthlib,1.3.1,1,0.00 +requests-toolbelt,0.10.1,0,100.00 +responses,0.22.0,0,95.38 +retrying,1.3.4,0,100.00 +rfc3986,2.0.0,0,100.00 +rich,12.6.0,0,94.39 +robotframework,6.0.1,1,5.98 +rsa,4.9,0,98.85 +ruamel.yaml,0.17.21,0,100.00 +s3fs,2022.11.0,1,8.38 +s3transfer,0.10.2,1,49.39 +sacremoses,0.0.53,2,0.00 +sanic,23.12.1,1,0.00 +schedule,1.1.0,0,82.86 +schema,0.7.5,0,100.00 +scikit-image,0.25.0,1,0.00 +scikit-learn,1.5.2,1,0.00 +scipy,1.13.1,0,79.39 +Scrapy,2.7.1,1,0.00 +seaborn,0.13.2,0,98.95 +SecretStorage,3.3.3,1,26.92 +seldon-core,1.16.0,2,0.00 +selenium,4.20.0,1,0.00 +semantic-version,2.10.0,0,100.00 +semver,3.0.2,0,100.00 +sentence-transformers,2.2.2,2,0.00 +sentencepiece,0.1.97,2,0.00 +sentry-sdk,1.15.0,0,87.77 +setproctitle,1.3.3,0,82.14 +setuptools,65.5.0,2,0.00 +setuptools-scm,7.0.5,0,100.00 +setuptools-scm-git-archive,1.4,2,0.00 +sh,1.14.3,1,14.86 +shap,0.45.1,2,0.00 +shapely,2.0.0,0,99.97 +simplejson,3.18.0,0,100.00 +six,1.16.0,0,100.00 +skl2onnx,1.16,2,0.00 +sktime,0.24.0,1,0.00 +slackclient,2.9.4,0,98.89 +slicer,0.0.7,2,0.00 +smart-open,7.0.4,1,0.00 +smmap,5.0.0,0,100.00 +smmap2,3.0.1,2,0.00 +sniffio,1.3.0,0,100.00 +snowballstemmer,2.2.0,2,0.00 +sortedcontainers,2.4.0,1,0.00 +soupsieve,2.3.2.post1,2,0.00 +spacy,3.6.1,0,97.83 +spacy-legacy,3.0.12,0,97.96 +spacy-loggers,1.0.4,0,100.00 +spacy-lookups-data,1.0.5,1,59.91 +spacy-model-manager,0.1.3,0,100.00 +spacy-pkuseg,0.0.32,2,0.00 +Sphinx,5.3.0,1,47.80 +sphinx-autobuild,2021.3.14,0,100.00 +sphinx-autodoc-typehints,1.19.5,0,94.74 +sphinx-click,6.0.0,0,100.00 +sphinx-gallery,0.18.0,0,99.56 +sphinx-multiversion,0.2.4,0,100.00 +sphinx-rtd-theme,1.1.1,1,0.00 +sphinxcontrib-bibtex,2.6.2,0,98.37 +SQLAlchemy,1.4.52,1,0.00 +SQLAlchemy-Utils,0.38.3,1,0.00 +sqlparse,0.4.3,0,100.00 +srsly,2.4.6,2,0.00 +stack-data,0.6.2,2,0.00 +starlette,0.23.0,2,0.00 +statsmodels,0.14.1,0,99.96 +stevedore,4.1.1,1,0.00 +streamlit,1.15.2,2,0.00 +structlog,22.3.0,0,96.26 +sympy,1.11.1,1,0.00 +tables,3.7.0,2,0.00 +tabulate,0.9.0,0,99.33 +tenacity,8.1.0,0,99.07 +tensorboard,2.11.0,2,0.00 +tensorboard-data-server,0.7.1,2,0.00 +tensorboard-plugin-wit,1.8.1,2,0.00 +tensorboardX,2.6.1,1,0.00 +tensorflow,2.15.0,1,0.00 +tensorflow-estimator,2.12.0,2,0.00 +tensorflow-gpu,2.11.0,2,0.00 +tensorflow-io-gcs-filesystem,0.32.0,2,0.00 +tensorflow-probability,0.19.0,2,0.00 +termcolor,2.1.1,0,100.00 +terminaltables,3.1.10,0,90.76 +testbook,0.4.2,0,100.00 +thinc,8.1.10,1,43.84 +threadloop,1.0.2,1,64.29 +threadpoolctl,3.1.0,0,100.00 +thrift,0.16.0,2,0.00 +tifffile,2022.10.10,2,0.00 +tiktoken,0.7.0,2,0.00 +tinydb,4.7.0,0,100.00 +tldextract,3.4.0,1,0.00 +tokenizers,0.13.3,2,0.00 +toml,0.10.2,0,91.30 +tomli,2.0.1,0,100.00 +tomlkit,0.11.6,0,99.76 +toolz,0.12.0,0,97.06 +torch,2.4.1,2,0.00 +torchvision,0.19.1,0,96.38 +tornado,6.2,0,98.14 +tox,3.27.1,0,99.37 +tqdm,4.66.4,0,99.33 +traitlets,5.6.0,0,99.82 +transformers,4.33.3,2,0.00 +trio,0.22.0,1,0.00 +twine,4.0.2,0,96.11 +Twisted,22.10.0,1,0.00 +typed-ast,1.5.4,1,0.00 +typeguard,2.13.3,1,74.49 +typer,0.7.0,1,0.00 +types-pytz,2024.2.0.20240913,1,75.00 +types-PyYAML,6.0.12.20240917,1,75.00 +types-requests,2.31.0.20240311,0,88.89 +types-setuptools,75.1.0.20240917,1,75.00 +typing-extensions,4.4.0,2,0.00 +tzlocal,4.2,0,100.00 +ujson,5.10.0,0,96.91 +umap-learn,0.5.3,1,0.00 +Unidecode,1.3.6,0,98.57 +urllib3,1.26.13,0,98.54 +uvicorn,0.20.0,1,25.94 +uvloop,0.19.0,1,0.00 +validators,0.20.0,0,100.00 +versioneer,0.28,0,100.00 +virtualenv,20.26.3,0,89.46 +wagtail,4.1.1,1,64.47 +waitress,2.1.2,2,0.00 +wandb,0.13.5,1,0.00 +wasabi,1.1.2,0,100.00 +watchdog,2.2.0,2,0.00 +watchfiles,0.21.0,2,0.00 +wcwidth,0.2.13,0,100.00 +webdriver-manager,3.8.5,0,75.29 +webencodings,0.5.1,0,87.50 +WebOb,1.8.7,0,98.16 +websocket-client,1.4.2,0,98.46 +websockets,10.4,1,0.00 +Werkzeug,3.0.4,1,0.00 +wget,3.2,0,100.00 +wheel,0.43.0,0,100.00 +wrapt,1.14.1,0,92.60 +WTForms,3.0.1,0,100.00 +xarray,2024.6.0,0,99.89 +xgboost,2.0.3,2,0.00 +xlrd,2.0.1,0,100.00 +XlsxWriter,3.0.3,0,100.00 +xlwt,1.3.0,0,100.00 +xmltodict,0.13.0,0,100.00 +xxhash,3.4.1,0,100.00 +yamale,4.0.4,0,100.00 +yapf,0.32.0,1,0.00 +yarl,1.8.2,0,99.24 +youtube_dl,2021.12.17,0,86.87 +zarr,2.14.0,1,0.00 +zeep,4.2.1,0,99.18 +zipp,3.11.0,0,98.61 +zope.interface,5.5.2,0,97.56 diff --git a/docs/user/Embedding-Build-Tools.md b/docs/user/Embedding-Build-Tools.md index a7be65dcd1..8f79dfe0a8 100644 --- a/docs/user/Embedding-Build-Tools.md +++ b/docs/user/Embedding-Build-Tools.md @@ -1,20 +1,12 @@ ---- -layout: docs -toc_group: python -link_title: Embedding Build Tools -permalink: /reference-manual/python/Embedding-Build-Tools/ ---- - # Embedding Build Tools The GraalPy **Maven** and **Gradle** plugins provide functionality to manage Python related resources required for embedding Python code in Java-based applications: - *Python application files* provided by the user, for example, Python sources which are part of the project. - *Third-party Python packages* installed by the plugin during the build according to the plugin configuration. -- *The Python standard library*, which is necessary to make Native Image generated executables self-contained. -Apart from physically managing and deploying those files, it is also necessary to make them available in Python at runtime by configuring the **GraalPy Context** in your Java code accordingly. -The [GraalPyResources](https://github.com/oracle/graalpython/blob/master/graalpython/org.graalvm.python.embedding/src/org/graalvm/python/embedding/utils/GraalPyResources.java) API provides factory methods to create a Context preconfigured for accessing Python, embedding relevant resources with a **Virtual Filesystem** or from a dedicated **external directory**. +Apart from physically managing and deploying those files, it is also necessary to make them available in Python at runtime by configuring the **GraalPy Context** in your Java code accordingly. +The [GraalPyResources](https://github.com/oracle/graalpython/blob/master/graalpython/org.graalvm.python.embedding/src/org/graalvm/python/embedding/GraalPyResources.java) API provides factory methods to create a Context preconfigured for accessing Python, embedding relevant resources with a **Virtual Filesystem** or from a dedicated **external directory**. ## Deployment @@ -23,47 +15,113 @@ There are two modes how to deploy the resources: as Java resources using the Vir ### Virtual Filesystem The Python related resources are embedded in the application file, either in JAR or Native Image generated -executable, as standard Java resources. -The GraalPy Virtual Filesystem accesses resource files as standard Java resources and makes them available to Python code running in GraalPy. +executable, as standard Java resources. +The GraalPy Virtual Filesystem internally accesses the resource files as standard Java resources and makes them available to Python code running in GraalPy. This is transparent to the Python code, which can use standard Python IO to access those files. -Java resource files in a Maven or Gradle project are typically located in dedicated resources directories. -All resources subdirectories named _org.graalvm.python.vfs_ are merged and mapped to a configurable Virtual Filesystem mount point at the Python side, by default `/graalpy_vfs`. +Java resource files in a Maven or Gradle project are typically located in dedicated resources directories, such as `src/main/resources`. +Moreover, there can be multiple resources directories and Maven or Gradle usually merges them. + +User can choose relative Java resources path that will be made accessible in Python through the virtual filesystem, +by default it is `org.graalvm.python.vfs`. All resources subdirectories with this path are merged during build and mapped to a configurable Virtual Filesystem mount point at the Python side, by default `/graalpy_vfs`. For example, a Python file with the real filesystem path `${project_resources_directory}/org.graalvm.python.vfs/src/foo/bar.py` will be accessible as `/graalpy_vfs/src/foo/bar.py` in Python. -Use the following [GraalPyResources](https://github.com/oracle/graalpython/blob/master/graalpython/org.graalvm.python.embedding/src/org/graalvm/python/embedding/utils/GraalPyResources.java) +Use the following [GraalPyResources](https://github.com/oracle/graalpython/blob/master/graalpython/org.graalvm.python.embedding/src/org/graalvm/python/embedding/GraalPyResources.java) factory methods to create GraalPy Context preconfigured for the use of the Virtual Filesystem: * `GraalPyResources.createContext()` * `GraalPyResources.contextBuilder()` * `GraalPyResources.contextBuilder(VirtualFileSystem)` +#### Java Resource Path +Particularly when developing reusable libraries, it is recommended to use custom unique Java resources path for your +virtual filesystem to avoid conflicts with other libraries on the classpath or module path that may also use the +Virtual Filesystem. The recommended path is: +```bash +GRAALPY-VFS/${project.groupId}/${project.artifactId} +``` + +The Java resources path must be configured in the Maven and Gradle plugins and must be also set to the same value +at runtime using the `VirtualFileSystem$Builder#resourceDirectory` API. + +*Note regarding Java module system: resources in named modules are subject to the encapsulation rules specified by +[Module.getResourceAsStream](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Module.html#getResourceAsStream(java.lang.String)). +This is also the case of the default virtual filesystem location. +When a resources directory is not a valid Java package name, such as the recommended "GRAALPY-VFS", the resources are not subject to the encapsulation rules and do not require additional module system configuration.* + +#### Extracting files from Virtual Filesystem +Normally, Virtual Filesystem resources are loaded like java resources, but there are cases when files need to be accessed +outside the Truffle sandbox, e.g. Python C extension files which need to be accessed by the operating system loader. + +By default, files which are of type `.so`, `.dylib`, `.pyd`, `.dll`, or `.ttf`, are automatically extracted to a temporary directory +in the real filesystem when accessed for the first time and the Virtual Filesystem then delegates to those real files. + +The default extract rule can be enhanced using the `VirtualFileSystem$Builder#extractFilter` API. + +Alternatively, it is possible to extract all Python resources into a user-defined directory before creating a GraalPy +context, and then configure the context to use that directory. Please refer to the following [GraalPyResources](https://github.com/oracle/graalpython/blob/master/graalpython/org.graalvm.python.embedding/src/org/graalvm/python/embedding/GraalPyResources.java) +methods for more details: +* `GraalPyResources.extractVirtualFileSystemResources(VirtualFileSystem vfs, Path externalResourcesDirectory)` +* `GraalPyResourcescontextBuilder(Path externalResourcesDirectory)` + ### External Directory -As an alternative to Java resources with the Virtual Filesystem, it is also possible to configure the Maven or Gradle plugin to manage the contents of an external directory, which will **not be embedded** as a Java resource into the resulting application. -A user is then responsible for the deployment of such directory. +As an alternative to Java resources with the Virtual Filesystem, it is also possible to configure the Maven or Gradle plugin to manage the contents of an external directory, which will **not be embedded** as a Java resource into the resulting application. +A user is then responsible for the deployment of such directory. Python code will access the files directly from the real filesystem. -Use the following [GraalPyResources](https://github.com/oracle/graalpython/blob/master/graalpython/org.graalvm.python.embedding/src/org/graalvm/python/embedding/utils/GraalPyResources.java) factory methods to create GraalPy Context preconfigured for the use of an external directory: +Use the following [GraalPyResources](https://github.com/oracle/graalpython/blob/master/graalpython/org.graalvm.python.embedding/src/org/graalvm/python/embedding/GraalPyResources.java) factory methods to create GraalPy Context preconfigured for the use of an external directory: * `GraalPyResources.createContextBuilder(Path)` ## Conventions -The factory methods in [GraalPyResources](https://github.com/oracle/graalpython/blob/master/graalpython/org.graalvm.python.embedding/src/org/graalvm/python/embedding/utils/GraalPyResources.java) rely on the following conventions, where the `${root}` is either an external directory, or a Virtual System mount point on the Python side and `${project_resources_directory}/org.graalvm.python.vfs` on the real filesystem: +The factory methods in [GraalPyResources](https://github.com/oracle/graalpython/blob/master/graalpython/org.graalvm.python.embedding/src/org/graalvm/python/embedding/GraalPyResources.java) rely on the following conventions, where the `${root}` is either an external directory, or a Virtual System mount point on the Python side and Java resources directories, such as `${project_resources_directory}/org.graalvm.python.vfs`, on the real filesystem: - `${root}/src`: used for Python application files. This directory will be configured as the default search path for Python module files (equivalent to `PYTHONPATH` environment variable). -- `${root}/venv`: used for the Python virtual environment holding installed third-party Python packages. +- `${root}/venv`: used for the Python virtual environment holding installed third-party Python packages. The Context will be configured as if it is executed from this virtual environment. Notably packages installed in this virtual environment will be automatically available for importing. -- `${root}/home`: used for the Python standard library (equivalent to `PYTHONHOME` environment variable). -The Maven or Gradle plugin will fully manage the contents of the `venv` and `home` subdirectories. -Any manual changes in these directories will be overridden by the plugin during the build. +The Maven or Gradle plugin will fully manage the contents of the `venv` subdirectory. +Any manual change will be overridden by the plugin during the build. - `${root}/venv`: the plugin creates a virtual environment and installs required packages according to the plugin configuration in _pom.xml_ or _build.gradle_. -- `${root}/home`: the plugin copies the required (also configurable) parts of the Python standard library into this directory. -By default, the full standard library is used. The _src_ subdirectory is left to be manually populated by the user with custom Python scripts or modules. -## GraalPy Maven Plugin Configuration +To manage third-party Python packages, a [Python virtual environment](https://docs.python.org/3.11/tutorial/venv.html) is used behind the scenes. +Whether deployed in a virtual filesystem or an external directory, its contents are managed by the plugin based on the Python packages +specified in the plugin configuration. + +## Python Dependency Management for Reproducible Builds + +In Python ecosystem, it is common that packages specify their dependencies as ranges rather than a fixed version. +For example, package A depends on package B of any version higher or equal to 2.0.0 (denoted as `B>=2.0.0`). +Installation of package A today may pull package `B==2.0.0`. Tomorrow package B releases new version `2.0.1` +and a clean build of a project depending on A will pull new version of B, which may not be compatible +with GraalPy or may introduce (unintentional) breaking changes. + +### Locking Dependencies + +We **highly recommend locking** all Python dependencies whenever there is a change in the list of required packages +for a project. Locking the dependencies means explicitly invoking a Maven goal or Gradle task that generates file +`graalpy.lock` that captures versions of all Python package dependencies: those specified explicitly in +`pom.xml` or `build.gradle` and all their transitive dependencies. + +The `graalpy.lock` file should be commited to version control system (e.g., git). Once the `graalpy.lock` file exists, +the package installation during Maven or Gradle build installs the exact same versions as captured in `graalpy.lock`. + +When the set of explicit dependencies in `pom.xml` or `build.gradle` changes and does not match what is in +`graalpy.lock` anymore, the build will fail and the user will be asked to explicitly regenerate the `graalpy.lock` file. + +Note that unless specific version of a package is desired, we recommend to specify explicit dependencies in +`pom.xml` or `build.gradle` without version quantifier. For some well known packages, GraalPy automatically +installs the version that is known to be compatible with GraalPy. However, once installed, the versions should be +locked to ensure reproducible builds. + +For information on the specific Maven or Gradle lock packages actions, please refer to the +Locking Python Packages subsections below. + +## GraalPy Maven Plugin + +### Maven Plugin Configuration Add the plugin configuration in the `configuration` block of `graalpy-maven-plugin` in the _pom.xml_ file: ```xml @@ -77,8 +135,8 @@ Add the plugin configuration in the `configuration` block of `graalpy-maven-plug ... ``` -The **packages** element declares a list of third-party Python packages to be downloaded and installed by the plugin. -- The Python packages and their versions are specified as if used with `pip`: +- The **packages** element declares a list of third-party Python packages to be downloaded and installed by the plugin. +The Python packages and their versions are specified as if used with `pip`: ```xml @@ -88,66 +146,113 @@ The **packages** element declares a list of third-party Python packages to be do ... ``` -- The **pythonHome** subsection declares what parts of the standard library should be deployed. + +- The **resourceDirectory** element can specify the relative [Java resource path](#java-resource-path). + Remember to use `VirtualFileSystem$Builder#resourceDirectory` when configuring the `VirtualFileSystem` in Java. + ```xml + GRAALPY-VFS/${project.groupId}/${project.artifactId} + ``` - Each `include` and `exclude` element is interpreted as a Java-like regular expression specifying which file paths should be included or excluded. +- If the **externalDirectory** element is specified, then the given directory is used as an [external directory](#external-directory) and no Java resources are embedded. +Remember to use the appropriate `GraalPyResources` API to create the Context. This element and **resourceDirectory** are mutually exclusive. ```xml - - - .* - ... - - - - ... - - + ${basedir}/python-resources ... ``` -- If the **pythonResourcesDirectory** element is specified, then the given directory is used as an [external directory](#external-directory) and no Java resources are embedded. -Remember to use the appropriate `GraalPyResources` API to create the Context. + +### Locking Python Packages +To lock the dependency tree of the specified Python packages, execute the GraalPy plugin goal `org.graalvm.python:graalpy-maven-plugin:lock-packages`. +```bash +$ mvn org.graalvm.python:graalpy-maven-plugin:lock-packages +``` +*Note that the action will override the existing lock file.* + +For a high level description of this feature, please refer to the +[Python Dependency Management for Reproducible Builds](#pythop-dependency-management-for-reproducible-builds) section +in this document. + +* The **graalPyLockFile** element can change the default path to the GraalPy lock file. Default value is `${basedir}/graalpy.lock`. + The **graalPyLockFile** element by itself will not trigger the locking. The locking must be done by explicitly executing the + `org.graalvm.python:graalpy-maven-plugin:lock-packages` goal. ```xml - ${basedir}/python-resources + ${basedir}/graalpy.lock ... ``` -## GraalPy Gradle Plugin Configuration +## GraalPy Gradle Plugin -Add the plugin configuration in the `GraalPy` block in the _build.gradle_ file. -The **packages** element declares a list of third-party Python packages to be downloaded and installed by the plugin. -- The Python packages and their versions are specified as if used with `pip`. - ``` +### Gradle Plugin Configuration +The plugin must be added to the plugins section in the _build.gradle_ file. +The **version** property defines which version of GraalPy to use. +```groovy +plugins { + // other plugins ... + id 'org.graalvm.python' version '24.2.0' +} +``` + +The plugin automatically injects these dependencies of the same version as the plugin version: + - `org.graalvm.python:python` + - `org.graalvm.python:python-embedding` + +The plugin can be configured in the `graalPy` block: + +- The **packages** element declares a list of third-party Python packages to be downloaded and installed by the plugin. + The Python packages and their versions are specified as if used with `pip`. + ```bash graalPy { packages = ["termcolor==2.2"] ... } ``` -- The **pythonHome** subsection declares what parts of the standard library should be deployed. + +- The **resourceDirectory** element can specify the relative [Java resource path](#java-resource-path). + Remember to use `VirtualFileSystem$Builder#resourceDirectory` when configuring the `VirtualFileSystem` in Java. + ```bash + resourceDirectory = "GRAALPY-VFS/my.group.id/artifact.id" + ``` - Each element in the `includes` and `excludes` list is interpreted as a Java-like regular expression specifying which file paths should be included or excluded. +- If the **externalDirectory** element is specified, then the given directory is used as an [external directory](#external-directory) and no Java resources are embedded. + Remember to use the appropriate `GraalPyResources` API to create the Context. + ```bash + graalPy { + externalDirectory = file("$rootDir/python-resources") + ... + } ``` +- Boolean flag **community** switches the automatically injected +dependency `org.graalvm.python:python` to the community build: `org.graalvm.python:python-community`. + ```bash graalPy { - pythonHome { - includes = [".*"] - excludes = [] - } + community = true ... } ``` -- If the **pythonResourcesDirectory** element is specified, then the given directory is used as an [external directory](#external-directory) and no Java resources are embedded. -Remember to use the appropriate `GraalPyResources` API to create the Context. +### Locking Python Packages +To lock the dependency tree of the specified Python packages, execute the GraalPy plugin task `graalPyLockPackages`. +```bash +gradle graalPyLockPackages +``` +*Note that the action will override the existing lock file.* + +For a high level description of this feature, please refer to the +[Python Dependency Management for Reproducible Builds](#pythop-dependency-management-for-reproducible-builds) section +in this document. + +* The **graalPyLockFile** element can change the default path to the GraalPy lock file. Default value is `${basedir}/graalpy.lock`. + The **graalPyLockFile** element by itself will not trigger the locking. The locking must be done by explicitly executing the + `graalPyLockPackages` task. ``` graalPy { - pythonResourcesDirectory = file("$rootDir/python-resources") + graalPyLockFile = file("$rootDir/graalpy.lock") ... } - ``` -### Related Documentation +## Related Documentation * [Embedding Graal languages in Java](https://www.graalvm.org/reference-manual/embed-languages/) -* [Permissions for Python Embeddings](Embedding-Permissions.md) \ No newline at end of file +* [Permissions for Python Embeddings](Embedding-Permissions.md) diff --git a/docs/user/Embedding-Permissions.md b/docs/user/Embedding-Permissions.md index b6ac245f26..aec8ea7a50 100644 --- a/docs/user/Embedding-Permissions.md +++ b/docs/user/Embedding-Permissions.md @@ -1,11 +1,3 @@ ---- -layout: docs -toc_group: python -link_title: Embedding Permissions -permalink: /reference-manual/python/Embedding-Permissions/ -redirect_from: /reference-manual/python/OSInterface/ ---- - # Permissions for Python Embeddings ## Access Control and Security Limits for Python Scripts @@ -35,7 +27,6 @@ This approach is the most compatible with CPython and provides bare access to th By default, this implementation bypasses the Truffle abstraction layer, and therefore it is not sandboxed and does not support custom implementations of [Truffle FileSystem service-provider](https://www.graalvm.org/truffle/javadoc/org/graalvm/polyglot/io/FileSystem.html), and other Polyglot API providers related to system interfaces. The native backend is chosen by default when GraalPy is started via the `graalpy` or any other Python related launcher. -The exceptions are Python related launchers with `-managed` suffix available only in Oracle GraalVM (for example, `graalpy-managed`), which by default use the `java` POSIX backend. #### Limitations of the Native Backend @@ -49,7 +40,7 @@ Known limitations are: This backend uses the [Truffle abstraction layer](https://github.com/oracle/graal/blob/master/truffle/docs/README.md) and therefore supports custom Polyglot API providers related to system interfaces and sandboxing. Because this abstraction is POSIX agnostic, it does not expose all the necessary functionality. Some functionality is emulated, and some functionality is unsupported. -The Java backend is the default when GraalPy is run via the `Context` API, that is, [embedded in Java applications](https://github.com/oracle/graal/blob/master/docs/reference-manual/embedding/embed-languages.md), or when it is launched using Python-related launchers with the `-managed` suffix (available only in Oracle GraalVM). +The Java backend is the default when GraalPy is run via the `Context` API, that is, [embedded in Java applications](https://github.com/oracle/graal/blob/master/docs/reference-manual/embedding/embed-languages.md). #### Limitations of the Java Backend diff --git a/docs/user/Interoperability.md b/docs/user/Interoperability.md index d827461dbc..5dec91c72b 100644 --- a/docs/user/Interoperability.md +++ b/docs/user/Interoperability.md @@ -1,9 +1,3 @@ ---- -layout: docs -toc_group: python -link_title: Interoperability -permalink: /reference-manual/python/Interoperability/ ---- # Interoperability Besides being primarily recommended to use in your Java application, GraalPy can interoperate with other Graal languages (languages implemented on the [Truffle framework](https://www.graalvm.org/latest/graalvm-as-a-platform/language-implementation-framework/)). @@ -26,10 +20,6 @@ byteArray = myBigInt.toByteArray() assert len(byteArray) == 1 and byteArray[0] == 42 ``` - - To import packages from the `java` namespace, you can also use the conventional Python import syntax: ```python import java.util.ArrayList @@ -46,7 +36,7 @@ In addition to the `type` built-in method, the `java` module exposes the followi Built-in | Specification --- | --- -`instanceof(obj, class)` | returns `True` if `obj` is an instance of `class` (`class` must be a foreign object class) +`instanceof(obj, class)` | returns `True` if `obj` is an instance of `class` (`class` must be a foreign object class) `is_function(obj)` | returns `True` if `obj` is a Java host language function wrapped using interop `is_object(obj)` | returns `True` if `obj` if the argument is Java host language object wrapped using interop `is_symbol(obj)` | returns `True` if `obj` if the argument is a Java host symbol, representing the constructor and static members of a Java class, as obtained by `java.type` @@ -63,6 +53,52 @@ assert java.instanceof(my_list, ArrayList) See [Polyglot Programming](https://github.com/oracle/graal/blob/master/docs/reference-manual/polyglot-programming.md) and [Embed Languages](https://github.com/oracle/graal/blob/master/docs/reference-manual/embedding/embed-languages.md) for more information about interoperability with other programming languages. +## Interacting with foreign objects from Python scripts + +Foreign objects are given a Python class corresponding to their interop traits: + +```python +from java.util import ArrayList, HashMap +type(ArrayList()).mro() # => [, , , ] +type(HashMap()).mro() # => [, , , ] +``` + +This means all Python methods of these types are available on the corresponding foreign objects, which behave as close as possible as if they were Python objects: + +```python +from java.util import ArrayList, HashMap +l = ArrayList() +l.append(1) # l: [1] +l.extend([2, 3]) # l: [1, 2, 3] +l.add(4) # l: [1, 2, 3, 4] # we can still call Java methods, this is calling ArrayList#add +l[1:3] # => [2, 3] +l.pop(1) # => 2; l: [1, 3, 4] +l.insert(1, 2) # l: [1, 2, 3, 4] +l == [1, 2, 3, 4] # True + +h = HashMap() +h[1] = 2 # h: {1: 2} +h.setdefault(3, 4) # h: {1: 2, 3: 4} +h |= {3: 6} # {1: 2, 3: 6} +h == {1: 2, 3: 6} # True +``` + +In case of a method defined both in Python and on the foreign object, the Python method wins. +To call the foreign method instead, use `super(type_owning_the_python_method, foreign_object).method(*args)`: + +```python +from java.util import ArrayList +l = ArrayList() +l.extend([5, 6, 7]) +l.remove(7) # Python list.remove +assert l == [5, 6] + +super(list, l).remove(0) # ArrayList#remove(int index) +assert l == [6] +``` + +See [this section](#interop-types-to-python) for more interop traits and how they map to Python types. + ## Interacting with other dynamic languages from Python scripts More general, non-JVM specific interactions with other languages from Python scripts are achieved via the _polyglot_ API. @@ -76,14 +112,14 @@ For example, if you have already configured a Maven project with GraalPy, add th org.graalvm.polyglot js - 24.1.0 + 24.2.0 ``` @@ -139,7 +175,7 @@ libexec/graalpy-polyglot-get js md = pattern.exec("Look, we have matching strings! This string was matched by Graal.js") assert "Graal.js" in md[1] - ``` + ``` This program matches Python strings using the JavaScript regular expression object. Python reads the captured group from the JavaScript result and checks for a substring in it. @@ -187,35 +223,36 @@ The `polyglot` module can be used to expose Python objects to JVM languages and ## Mapping Types between Python and Other Languages -The interop protocol defines different "types" which can overlap in all kinds of ways and have restrictions on how they can interact with Python. +The interop protocol defines different "types/traits" which can overlap in all kinds of ways and have restrictions on how they can interact with Python. ### Interop Types to Python -Most importantly and upfront: all foreign objects passed into Python have the Python type `foreign`. -There is no emulation of (for example) objects that are of interop type "boolean" to have the Python type `bool`. -This is because interop types can overlap in ways that the Python built-in types cannot, and we have yet to define which type should take precedence and such situations. -We do expect to change this in the future, however. -For now, the `foreign` type defines all of the Python special methods for type conversion that are used throughout the interpreter (methods such as `__add__`, `__int__`, `__str__`, `__getitem__`, and so on) -and these try to "do the right thing" based on the interop type (or raise an exception). +All foreign objects passed into Python have the Python type `polyglot.ForeignObject` or a subclass. Types not listed in the table below have no special interpretation in Python. -| Interop Type | Python Interpretation | -|:--------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `null` | `null` is like `None`. Important to know: interop `null` values are all identical to `None`. JavaScript defines two "null-like" values; `undefined` and `null`, which are *not* identical, but when passed to Python, they are treated so. | -| `boolean` | `boolean` behaves like Python booleans, including the fact that in Python, all booleans are also integers (1 and 0 for true and false, respectively). | -| `number` | `number` Behaves like Python numbers. Python only has one integer and one floating point type, but ranges are imported in some places such as typed arrays. | -| `string` | Behaves in the same way as a Python string. | -| `buffer` | Buffers are also a concept in Python's native API (albeit slightly different). Interop buffers are treated in the same was as Python buffers in some places (such as `memoryview`) to avoid copies of data. | -| `array` | An `array` can be used with subscript access in the same way as Python lists, with integers and slices as indices. | -| `hash` | A `hash` can be used with subscript access in the same way as Python dictionaries, with any "hashable" object as a key. "Hashable" follows Python semantics: generally every interop type with an identity is deemed "hashable". Note that if an interop object is of type `Array` **and** `Hash`, the behavior of subscript access is undefined. | -| `members` | An object of type `members` can be read using conventional Python `.` notation or `getattr` and related functions. | -| `iterable` | An `iterable` is treated in the same way as any Python object with an `__iter__` method. That is, it can be used in a loop and other places that accept Python iterables. | -| `iterator` | An `iterator` is treated in the same way as any Python object with a `__next__` method. | -| `exception` | An `exception` can be caught in a generic `except` clause. | -| `MetaObject` | Meta objects can be used in subtype and `isinstance` checks. | -| `executable` | An `executable` object can be executed as a function, but never with keyword arguments. | -| `instantiable` | An `instantiable` object can be called just like a Python type, but never with keyword arguments. | +| Interop Type | Inherits from | Python Interpretation | +|:---------------|:----------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `null` | ForeignNone, `NoneType` | `null` is like `None`. Important to know: interop `null` values are all identical to `None`. JavaScript defines two "null-like" values; `undefined` and `null`, which are *not* identical, but when passed to Python, they are treated so. | +| `boolean` | ForeignBoolean, ForeignNumber | `boolean` behaves like Python booleans, including the fact that in Python, all booleans are also integers (1 and 0 for true and false, respectively). | +| `number` | ForeignNumber | `number` behaves like Python numbers. Python only has one integer and one floating point type, but ranges are imported in some places such as typed arrays. | +| `string` | ForeignString, `str` | Behaves in the same way as a Python string. | +| `buffer` | ForeignObject | Buffers are also a concept in Python's native API (albeit slightly different). Interop buffers are treated in the same was as Python buffers in some places (such as `memoryview`) to avoid copies of data. | +| `array` | ForeignList, `list` | An `array` behaves like a Python `list`. | +| `hash` | ForeignDict, `dict` | A `hash` behaves like a Python `dict`, with any "hashable" object as a key. "Hashable" follows Python semantics: generally every interop type with an identity is deemed "hashable". | +| `members` | ForeignObject | An object of type `members` can be read using conventional Python `.` notation or `getattr` and related functions. | +| `iterable` | ForeignIterable | An `iterable` is treated in the same way as any Python object with an `__iter__` method. That is, it can be used in a loop and other places that accept Python iterables. | +| `iterator` | ForeignIterator, `iterator` | An `iterator` is treated in the same way as any Python object with a `__next__` method. | +| `exception` | ForeignException, `BaseException` | An `exception` can be caught in a generic `except` clause. | +| `MetaObject` | ForeignAbstractClass | Meta objects can be used in subtype and `isinstance` checks. | +| `executable` | ForeignExecutable | An `executable` object can be executed as a function, but never with keyword arguments. | +| `instantiable` | ForeignInstantiable | An `instantiable` object can be called just like a Python type, but never with keyword arguments. | + +Foreign numbers inherit from `polyglot.ForeignNumber` and not `int` or `float` because `InteropLibrary` has currently no way to differentiate integers and floats. +However: +* When foreign numbers are represented as Java primitives `byte`, `short`, `int`, `long`, they are considered Python `int` objects. +* When foreign numbers are represented as Java primitives `float`, `double`, they are considered Python `float` objects. +* When foreign booleans re represented as Java primitives `boolean`, they are considered Python `bool` objects. ### Python to Interop Types @@ -249,8 +286,173 @@ An example in this sense are the `numpy` numeric types (for example, `numpy.int3 | register_interop_behavior | Takes the receiver **type** as first argument. The remainder keyword arguments correspond to the respective interop messages. Not All interop messages are supported. | | get_registered_interop_behavior | Takes the receiver **type** as first argument. Returns the list of extended interop messages for the given type. | | @interop_behavior | Class decorator, takes the receiver **type** as only argument. The interop messages are extended via **static** methods defined in the decorated class (supplier). | +| register_interop_type | Takes a `foreign class` and `python class` as positional arguments and `allow_method_overwrites` as optional argument (default: `False`). Every instance of foreign class is then treated as an instance of the given python class. | +| @interop_type | Class decorator, takes the `foreign class` and optionally `allow_method_overwrites` as arguments. The instances of foreign class will be treated as an instance of the annotated python class. | + +### Usage Examples + +#### Interop Behavior + +A simple `register_interop_behavior` API is available to register interop behaviors for existing types: + +```python +import polyglot +import numpy -#### Supported messages +polyglot.register_interop_behavior(numpy.int32, + is_number=True, + fitsInByte=lambda v: -128 <= v < 128, + fitsInShort=lambda v: -0x8000 <= v < 0x8000, + fitsInInt = True, + fitsInLong = True, + fitsInBigInteger = True, + asByte = int, + asShort = int, + asInt = int, + asLong = int, + asBigInteger = int, +) +``` + +The `@interop_behavior` decorator may be more convenient when declaring more behaviors. +Interop message extension is achieved via **static** methods of the decorated class. +The names of the static methods are identical to the keyword names expected by `register_interop_behavior`. + +```python +from polyglot import interop_behavior +import numpy + + +@interop_behavior(numpy.float64) +class Int8InteropBehaviorSupplier: + @staticmethod + def is_number(_): + return True + + @staticmethod + def fitsInDouble(_): + return True + + @staticmethod + def asDouble(v): + return float(v) +``` + +Both classes can then behave as expected when embedded: + +```java +import java.nio.file.Files; +import java.nio.file.Path; + +import org.graalvm.polyglot.Context; + +class Main { + public static void main(String[] args) { + try (var context = Context.create()) { + context.eval("python", Files.readString(Path.of("path/to/interop/behavior/script.py"))); + assert context.eval("python", "numpy.float64(12)").asDouble() == 12.0; + assert context.eval("python", "numpy.int32(12)").asByte() == 12; + } + } +} +``` +#### Interop Types + +The `register_interop_type` API allows the usage of python classes for foreign objects. +The class of such a foreign object will no longer be `polyglot.ForeignObject` or `polyglot.Foreign*`. +Instead, it will be a generated class with the registered python classes and `polyglot.ForeignObject` as super class. +This allows custom mapping of foreign methods and attributes to Python's magic methods or more idiomatic Python code. + +```java +package org.example; + +class MyJavaClass { + private int x; + private int y; + + public MyJavaClass(int x, int y) { + this.x = x; + this.y = y; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + } +``` + +```java +import org.example.MyJavaClass; + +class Main { + + public static void main(String[] args) { + MyJavaClass myJavaObject = new MyJavaClass(42, 17); + try (var context = Context.create()) { + // myJavaObject will be globally available in example.py as my_java_object + context.getBindings("python").putMember("my_java_object", myJavaObject); + context.eval(Source.newBuilder("python", "example.py")); + } + } +} +``` + +```python +# example.py +import java +from polyglot import register_interop_type + +print(my_java_object.getX()) # 42 +print(type(my_java_object)) # + +class MyPythonClass: + def get_tuple(self): + return (self.getX(), self.getY()) + +foreign_class = java.type("org.example.MyJavaClass") + +register_interop_type(foreign_class, MyPythonClass) + +print(my_java_object.get_tuple()) # (42, 17) +print(type(my_java_object)) # +print(type(my_java_object).mro()) # [polyglot.Java_org.example.MyJavaClass_generated, MyPythonClass, polyglot.ForeignObject, object] + +class MyPythonClassTwo: + def get_tuple(self): + return (self.getY(), self.getX()) + + def __str__(self): + return f"MyJavaInstance(x={self.getX()}, y={self.getY()}" + +# If 'allow_method_overwrites=True' is not given, this would lead to an error due to the method conflict of 'get_tuple' +register_interop_type(foreign_class, MyPythonClassTwo, allow_method_overwrites=True) + +# A newly registered class will be before already registered classes in the mro. +# It allows overwriting methods from already registered classes with the flag 'allow_method_overwrites=True' +print(type(my_java_object).mro()) # [generated_class, MyPythonClassTwo, MyPythonClass, polyglot.ForeignObject, object] + +print(my_java_object.get_tuple()) # (17, 42) +print(my_java_object) # MyJavaInstance(x=42, y=17) +``` + +Registering classes may be more convenient with `@interop_type`: +```python +import java +from polyglot import interop_type + +foreign_class = java.type("org.example.MyJavaClass") + +@interop_type(foreign_class) +class MyPythonClass: + def get_tuple(self): + return (self.getX(), self.getY()) +``` + +### Supported messages The majority (with some exceptions) of the interop messages are supported by the interop behavior extension API, as shown in the table below. The naming convention for the `register_interop_behavior` keyword arguments follows the _snake_case_ naming convention, i.e. the interop `fitsInLong` message @@ -314,66 +516,3 @@ The table below describes the supported interop messages: | readHashValue | read_hash_value | object | | writeHashEntry | write_hash_entry | NoneType | | removeHashEntry | remove_hash_entry | NoneType | - -### Usage Example - -A simple `register_interop_behavior` API is available to register interop behaviors for existing types: - -```python -import polyglot -import numpy - -polyglot.register_interop_behavior(numpy.int32, - is_number=True, - fitsInByte=lambda v: -128 <= v < 128, - fitsInShort=lambda v: -0x8000 <= v < 0x8000 - fitsInInt=True, - fitsInLong=True, - fitsInBigInteger=True, - asByte=int, - asShort=int, - asInt=int, - asLong=int, - asBigInteger=int, -) -``` - -The `@interop_behavior` decorator may be more convenient when declaring more behaviors. -Interop message extension is achieved via **static** methods of the decorated class. -The names of the static methods are identical to the keyword names expected by `register_interop_behavior`. - -```python -from polyglot import interop_behavior -import numpy - -@interop_behavior(numpy.float64) -class Int8InteropBehaviorSupplier: - @staticmethod - def is_number(_): - return True - - @staticmethod - def fitsInDouble(_): - return True - - @staticmethod - def asDouble(v): - return float(v) -``` - -Both classes can then behave as expected when embedded: -```java -import java.nio.file.Files; -import java.nio.file.Path; -import org.graalvm.polyglot.Context; - -class Main { - public static void main(String[] args) { - try (var context = Context.create()) { - context.eval("python", Files.readString(Path.of("path/to/interop/behavior/script.py"))); - assert context.eval("python", "numpy.float64(12)").asDouble() == 12.0; - assert context.eval("python", "numpy.int32(12)").asByte() == 12; - } - } -} -``` diff --git a/docs/user/Native-Extensions.md b/docs/user/Native-Extensions.md index 7411da2eac..5746d1372a 100644 --- a/docs/user/Native-Extensions.md +++ b/docs/user/Native-Extensions.md @@ -1,26 +1,54 @@ ---- -layout: docs-experimental -toc_group: python -link_title: Native Extensions Support -permalink: /reference-manual/python/Native-Extensions/ ---- - # Native Extensions Support CPython provides a [native extensions API](https://docs.python.org/3/c-api/index.html) for writing Python extensions in C/C++. GraalPy provides experimental support for this API, which allows many packages like NumPy and PyTorch to work well for many use cases. The support extends only to the API, not the binary interface (ABI), so extensions built for CPython are not binary compatible with GraalPy. Packages that use the native API must be built and installed with GraalPy, and the prebuilt wheels for CPython from pypi.org cannot be used. -For best results, it is crucial that you only use the `pip` command that comes preinstalled in GraalPy virtualenvs to install packages. +For best results, it is crucial that you only use the `pip` command that comes preinstalled in GraalPy virtual environments to install packages. The version of `pip` shipped with GraalPy applies additional patches to packages upon installation to fix known compatibility issues and it is preconfigured to use an additional repository from graalvm.org where we publish a selection of prebuilt wheels for GraalPy. Please do not update `pip` or use alternative tools such as `uv`. ## Embedding limitations Python native extensions run by default as native binaries, with full access to the underlying system. -Native code is entirely unrestricted and can circumvent any security protections Truffle or the JVM may provide. -Native data structures are not subject to the Java GC and the combination of them with Java data structures may lead to memory leaks. -Native libraries generally cannot be loaded multiple times into the same process, and they may contain global state that cannot be safely reset. -Thus, it is not possible to create multiple GraalPy contexts that access native modules within the same JVM. -This includes the case when you create a context, close it, and then create another context. -The second context will not be able to access native extensions. +This has a few implications: + +1. Native code is entirely unrestricted and can circumvent any security protections Truffle or the JVM may provide. +2. Native data structures are not subject to the Java GC and the combination of them with Java data structures may lead to increased memory pressure or memory leaks. +3. Native libraries generally cannot be loaded multiple times into the same process, and they may contain global state that cannot be safely reset. + +### Full Native Access + +The Context API allows to set options such as `allowIO`, `allowHostAccess`, `allowThreads` and more on the created contexts. +To use Python native extensions on GraalPy, the `allowNativeAccess` option must be set to true, but this opens the door to full native access. +This means that while Python code may be denied access to the host file system, thread- or subprocess creation, and more, the native extension is under no such restriction. + +### Memory Management + +Python C extensions, like the CPython reference implementation, use reference counting for memory management. +This is fundamentally incompatible with JVM GCs. + +Java objects may end up being referenced from native data structures which the JVM cannot trace, so to avoid crashing, GraalPy keeps such Java objects strongly referenced. +To avoid memory leaks, GraalPy implements a cycle detector that regularly traces references between Java objects and native objects that have crossed between the two worlds and cleans up strong references that are no longer needed. + +On the other side, reference-counted native extension objects may end up being referenced from Java objects, and in this case GraalPy bumps their reference count to make them unreclaimable. +Any such references to native extension objects are registered with a `java.lang.ref.WeakReference` and when the JVM GC has collected the owning Java object, the reference count of the native object is reduced again. + +Both of these mechanisms together mean there is additional delay between objects becoming unreachable and their memory being reclaimed when compared to the CPython implementation. +This can manifest in increased memory usage when running C extensions. +You can tweak the Context options `python.BackgroundGCTaskInterval`, `python.BackgroundGCTaskThreshold`, and `BackgroundGCTaskMinimum` to mitigate this. +They control the minimum interval between cycle detections, how much RSS memory must have increased since the last time to trigger the cycle detector, and the absolute minimum RSS under which no cycle detection should be done. +You can also manually trigger the detector with the Python `gc.collect()` call. + +### Multi-Context and Native Libraries + +Using C extensions in multiple contexts is only possible on Linux for now, and many C extensions still have issues in this mode. +You should test your applications thoroughly if you want to use this feature. +There are many possibilities for native code to sidestep the library isolation through other process-wide global state, corrupting the state and leading to incorrect results or crashing. +The implementation also relies on `venv` to work, even if you are not using external packages. + +To support creating multiple GraalPy contexts that access native modules within the same JVM or Native Image, we need to isolate them from each other. +The current strategy for this is to copy the libraries and modify them such that the dynamic library loader of the operating system will isolate them for us. +To do this, all GraalPy contexts in the same process (not just those in the same engine!) must set the `python.IsolateNativeModules` option to `true`. + +For more details on this, see [our implementation details](https://github.com/oracle/graalpython/blob/master/docs/contributor/IMPLEMENTATION_DETAILS.md#c-extension-copying). diff --git a/docs/user/Native-Images-with-Python.md b/docs/user/Native-Images-with-Python.md index dad20dabfd..1c16f43f66 100644 --- a/docs/user/Native-Images-with-Python.md +++ b/docs/user/Native-Images-with-Python.md @@ -1,11 +1,3 @@ ---- -layout: docs -toc_group: python -link_title: Native Java-Python Applications -permalink: /reference-manual/python/native-applications/ -redirect_from: /reference-manual/python/native-image/ ---- - # Native Executables with Python GraalPy supports GraalVM Native Image to generate native binaries of Java applications that use GraalPy. @@ -62,7 +54,6 @@ These are: This uses an `ExecutorService` with a thread pool. If you want to disallow such extra threads or avoid pulling in `ExecutorService` and related classes, then set this property to `false` and retrieve the `PollPythonAsyncActions` object from the context's polyglot bindings. This object is executable and can be used to trigger Python asynchronous actions at the locations you desire. -* `python.WithoutJNI=true` - This option removes any code that uses JNI. As a consequence, you cannot use the HPy JNI backend and maybe other parts that rely on JNI. ### Removing Pre-initialized Python Heap diff --git a/docs/user/Performance.md b/docs/user/Performance.md index a13213ecda..fa84d2be43 100644 --- a/docs/user/Performance.md +++ b/docs/user/Performance.md @@ -1,18 +1,10 @@ ---- -layout: docs -toc_group: python -link_title: Python Performance -permalink: /reference-manual/python/Performance/ -redirect_from: /reference-manual/python/ParserDetails/ ---- - # Python Performance ## Execution Performance GraalPy uses the state-of-the-art just-in-time (JIT) compiler of GraalVM. When JIT compiled, GraalPy runs Python code ~4x faster than CPython on the official [Python Performance Benchmark Suite](https://pyperformance.readthedocs.io/). -![](assets/performance.svg) +![](./assets/performance.svg) These benchmarks can be run by installing the `pyperformance` package and calling `pyperformance run` on each of CPython and GraalPy. To get the Jython numbers we adapted the harness and benchmarks because of missing Python 3 support in Jython. @@ -52,7 +44,8 @@ The magic number is hard-coded in the source of Python and can not be changed by The developers of GraalPy change the magic number when the bytecode format changes. This is an implementation detail, so the magic number does not have to correspond to the version of GraalPy (as in CPython). -The magic number of `pyc` is a function of the actual Python runtime Java code that is running. Changes to the magic number are communicated in the release notes so that developers or system administrators can delete old _.pyc_ files when upgrading. +The magic number of `pyc` is a function of the actual Python runtime Java code that is running. +Changes to the magic number are communicated in the release notes so that developers or system administrators can delete old _.pyc_ files when upgrading. Note that if you use _.pyc_ files, you must allow write-access to GraalPy at least when switching versions or modifying the original source code file. Otherwise, the regeneration of source code files will fail and every import will have the overhead of accessing each old _.pyc_ file, parsing the code, serializing it, and trying (and failing) to write out a new _.pyc_ file. @@ -74,7 +67,8 @@ top_directory/ By default, GraalPy creates the _\_\_pycache\_\__ directory on the same directory level as a source code file and in this directory all _.pyc_ files from the same directory are stored. This directory may store _.pyc_ files created with different versions of Python (including, for example, CPython), so the user may see files ending in _.cpython3-6.pyc_, for example. -_.pyc_ files are largely managed automatically by GraalPy in a manner compatible with CPython. GraalPy provides options similar to CPython to specify the location of t_.pyc_ files, and if they should be written at all, and both of these options can be changed by guest code. +_.pyc_ files are largely managed automatically by GraalPy in a manner compatible with CPython. +GraalPy provides options similar to CPython to specify the location of t_.pyc_ files, and if they should be written at all, and both of these options can be changed by guest code. The creation of _.pyc_ files can be controlled in the [same way as CPython](https://docs.python.org/3/using/cmdline.html): @@ -93,23 +87,20 @@ The creation of _.pyc_ files can be controlled in the [same way as CPython](http * A guest language code can change the attribute `pycache_prefix` of the `sys` module at runtime to change the location for subsequent imports. -Because the developer cannot use environment variables or CPython options to -communicate these options to GraalPy, these options are made available as language options: +Because the developer cannot use environment variables or CPython options to communicate these options to GraalPy, these options are made available as language options: * `python.DontWriteBytecodeFlag` - equivalent to `-B` or `PYTHONDONTWRITEBYTECODE` * `python.PyCachePrefix` - equivalent to `PYTHONPYCACHEPREFIX` - Note that a Python context will not enable writing _.pyc_ files by default. The GraalPy launcher enables it by default, but if this is desired in the embedding use case, care should be taken to ensure that the _\_\_pycache\_\__ location is properly managed and the files in that location are secured against manipulation in the same way as the source code files (_.py_) from which they were derived. -Note also that to upgrade the application sources to Oracle GraalPy, old _.pyc_ -files must be removed by the developer as required. +Note also that to upgrade the application sources to Oracle GraalPy, old _.pyc_ files must be removed by the developer as required. ### Security Considerations -GraalPy performs all file operations (obtaining the data, timestamps, and writing _.pyc_ files) -via the [FileSystem API](https://www.graalvm.org/sdk/javadoc/org/graalvm/polyglot/io/FileSystem.html). Developers can modify all of these operations by means of custom (for example, read-only) `FileSystem` implementations. +GraalPy performs all file operations (obtaining the data, timestamps, and writing _.pyc_ files) via the [FileSystem API](https://www.graalvm.org/sdk/javadoc/org/graalvm/polyglot/io/FileSystem.html). +Developers can modify all of these operations by means of custom (for example, read-only) `FileSystem` implementations. The developer can also effectively disable the creation of _.pyc_ files by disabling I/O permissions for GraalPy. If _.pyc_ files are not readable, their location is not writable. diff --git a/docs/user/Python-Runtime.md b/docs/user/Python-Runtime.md index 1d79f2c793..2415adcb7f 100644 --- a/docs/user/Python-Runtime.md +++ b/docs/user/Python-Runtime.md @@ -1,12 +1,4 @@ ---- -layout: docs -toc_group: python -link_title: Python Runtime -permalink: /reference-manual/python/Python-Runtime/ -redirect_from: /reference-manual/python/Packages/ ---- - -# GraalPy as a CPython Replacement +# Testing Python Applications and Packages on GraalPy ## Choosing the GraalPy Runtime @@ -16,7 +8,7 @@ GraalPy is distributed as an ahead-of-time compiled native executable, compact i GraalPy provides the following capabilities: -* Replacement for CPython. Use GraalPy as a replacement for CPython. It is the most compatible, since it most closely resembles the structure of CPython installation packages. +* CPython-compatible distribution. This is the most compatible option to test Python code on GraalPy, since it most closely resembles the structure of CPython distributions. * Unique deployment mode for Python applications. Compile a Python application on GraalPy to [a single native binary](Python-Standalone-Applications.md) that embeds all needed resources. * Access to GraalVM's language ecosystems and tools. GraalPy can run many standard Python tools as well as tools from the GraalVM ecosystem. @@ -77,12 +69,12 @@ The four GraalPy runtimes are identified as follows, using the general pattern _ ### Linux The easiest way to install GraalPy on Linux is to use [Pyenv](https://github.com/pyenv/pyenv) (the Python version manager). -To install version 24.1.0 using Pyenv, run the following commands: +To install version 24.2.0 using Pyenv, run the following commands: ```bash -pyenv install graalpy-24.1.0 +pyenv install graalpy-24.2.0 ``` ```bash -pyenv shell graalpy-24.1.0 +pyenv shell graalpy-24.2.0 ``` > Before running `pyenv install`, you may need to update `pyenv` to include the latest GraalPy versions. @@ -91,17 +83,15 @@ Alternatively, you can download a compressed GraalPy installation file from [Git 1. Find the download that matches the pattern _graalpy-XX.Y.Z-linux-amd64.tar.gz_ or _graalpy-XX.Y.Z-linux-aarch64.tar.gz_ (depending on your platform) and download. 2. Uncompress the file and update your `PATH` environment variable to include to the _graalpy-XX.Y.Z-linux-amd64/bin_ (or _graalpy-XX.Y.Z-linux-aarch64/bin_) directory. -> Note: On Oracle Linux 9, additionally install the [`libxcrypt` library](https://github.com/besser82/libxcrypt) that is required for the GraalPy native runtime: `yum install libxcrypt-compat`. - ### macOS The easiest way to install GraalPy on macOS is to use [Pyenv](https://github.com/pyenv/pyenv) (the Python version manager). -To install version 24.1.0 using Pyenv, run the following commands: +To install version 24.2.0 using Pyenv, run the following commands: ```bash -pyenv install graalpy-24.1.0 +pyenv install graalpy-24.2.0 ``` ```bash -pyenv shell graalpy-24.1.0 +pyenv shell graalpy-24.2.0 ``` > Before running `pyenv install`, you may need to update `pyenv` to include the latest GraalPy versions. @@ -114,7 +104,7 @@ Alternatively, you can download a compressed GraalPy installation file from [Git ``` For example: ```bash - sudo xattr -r -d com.apple.quarantine ~/.pyenv/versions/graalpy-24.1.0 + sudo xattr -r -d com.apple.quarantine ~/.pyenv/versions/graalpy-24.2.0 ``` 3. Uncompress the file and update your `PATH` environment variable to include to the _graalpy-XX.Y.Z-macos-amd64/bin_ (or _graalpy-XX.Y.Z-macos-aarch64/bin_) directory. @@ -149,7 +139,7 @@ This generates wrapper scripts and makes the implementation usable from a shell ``` For example: ```bash - graalpy -m venv ~/.virtualenvs/graalpy-24.1.0 + graalpy -m venv ~/.virtualenvs/graalpy-24.2.0 ``` 2. Activate the environment in your shell session: @@ -158,7 +148,7 @@ This generates wrapper scripts and makes the implementation usable from a shell ``` For example: ```bash - source ~/.virtualenvs/graalpy-24.1.0/bin/activate + source ~/.virtualenvs/graalpy-24.2.0/bin/activate ``` Multiple executables are available in the virtual environment, including: `python`, `python3`, and `graalpy`. diff --git a/docs/user/Python-Standalone-Applications.md b/docs/user/Python-Standalone-Applications.md index eaddcb14c0..fdbedb729b 100644 --- a/docs/user/Python-Standalone-Applications.md +++ b/docs/user/Python-Standalone-Applications.md @@ -1,15 +1,8 @@ ---- -layout: docs -toc_group: python -link_title: Python Standalone Applications -permalink: /reference-manual/python/standalone-applications/ -redirect_from: /reference-manual/python/standalone-binaries/ ---- - # Python Standalone Applications GraalPy enables you to create a Python application or library as a native application or JAR file with no external dependencies. -The [Truffle framework](https://github.com/oracle/graal/tree/master/truffle) on which GraalPy is built, combined with the [Sulong LLVM runtime](https://github.com/oracle/graal/tree/master/sulong) that GraalPy leverages for managed execution of Python's native extensions, completely virtualizes all filesystem accesses, including those to the standard library and installed packages. +The [Truffle framework](https://github.com/oracle/graal/tree/master/truffle) on which GraalPy is built virtualizes all filesystem accesses, including those to the standard library and installed pure Python packages. +Packages that include native code can still circumvent this, however! GraalPy includes a module named `standalone` to create a Python binary for Linux, macOS, and Windows. The modules bundles all your application's resources into a single file. @@ -28,7 +21,7 @@ graalpy -m standalone native \ It produces a native _my_binary_ file which includes your Python code, the GraalPy runtime, and the Python standard library in a single, self-contained executable. Use `graalpy -m standalone native --help` for further options. -## Security Considerations +### Security Considerations of Python Standalone Applications Creating a native executable or a JAR file that includes Python code could be seen as a mild form of obfuscation, but it does not protect your source code. Python source code is not stored verbatim into the executable (only the GraalPy bytecode is stored), but bytecode is easy to convert back into Python source code. diff --git a/docs/user/Python-on-JVM.md b/docs/user/Python-on-JVM.md index 3fc2cc9631..3ee3be1e2c 100644 --- a/docs/user/Python-on-JVM.md +++ b/docs/user/Python-on-JVM.md @@ -1,11 +1,3 @@ ---- -layout: docs -toc_group: python -link_title: Jython Compatibility -permalink: /reference-manual/python/Modern-Python-on-JVM/ -redirect_from: /reference-manual/python/Jython/ ---- - # Modern Python for the JVM For Python version 2 (now EOL), Jython is the _de facto_ means of interfacing Python and Java. @@ -109,6 +101,7 @@ This enables you, for example, to use a Pandas frame as `double[][]` or NumPy ar ### Special Jython Module: `jarray` GraalPy implements the `jarray` module (to create primitive Java arrays) for compatibility. +This module is always available, since we have not found its presence to have a negative impact. For example: ```python @@ -142,10 +135,7 @@ However, implicitly, this may produce a copy of the array data, which can be dec ### Exceptions from Java -To catch Java exceptions, use the `--python.EmulateJython` option. - -> Note: Catching a Java exception incurs a performance penalty. - +You can catch Java exceptions as you would expect. For example: ```python @@ -161,8 +151,8 @@ For example: ### Java Collections -* Java arrays and collections that implement the `java.util.Collection` interface can be accessed using the `[]` syntax. -An empty collection is considered `false` in boolean conversions. +* Java arrays and collections that implement the `java.util.Collection` interface can be accessed using the `[]` syntax. +An empty collection is considered `false` in boolean conversions. The length of a collection is exposed by the `len` built-in function. For example: @@ -186,7 +176,7 @@ For example: False ``` -* Java iterables that implement the `java.lang.Iterable` interface can be iterated over using a `for` loop or the `iter` built-in function and are accepted by all built-ins that expect an iterable. +* Java iterables that implement the `java.lang.Iterable` interface can be iterated over using a `for` loop or the `iter` built-in function and are accepted by all built-ins that expect an iterable. For example: ```python @@ -242,12 +232,24 @@ For example: ### Inheritance from Java -Inheriting from a Java class (or implementing a Java interface) is supported with some syntactical differences from Jython. -To create a class that inherits from a Java class (or implements a Java interface), use the conventional Python `class` statement: declared methods -override (implement) superclass (interface) methods when their names match. -To call the a superclass method, use the special attribute `self.__super__`. +Inheriting from a Java class (or implementing a Java interface) is supported with some syntactical and significant behavioral differences from Jython. +To create a class that inherits from a Java class (or implements a Java interface), use the conventional Python `class` statement. +Declared methods override (implement) superclass (interface) methods when their names match. + +It is important to understand that there is actually delegation happening here - when inheriting from Java, two classes are created, one in Java and one in Python. +These reference each other and any methods that are declared in Python that override or implement a Java method on the superclass are declared on the Java side as delegating to Python. The created object does not behave like a Python object but instead in the same way as a foreign Java object. -Its Python-level members can be accessed using its `this` attribute. For example: +The reason for this is that when you create an instance of your new class, you get a reference to the *Java* object. + +To call Python methods that do *not* override or implement methods that already existed on the superclass, you need to use the special `this` attribute. +Once you are in a Python method, your `self` refers to the Python object, and to get back from a Python method to Java, use the special attribute `__super__`. +And since we do not expose static members on the instance side, if you need to call a static method from an instance on the Java side, use `getClass().static` to get to the meta-object holding the static members. + +One important consequence of the two-object-schema here is that the `__init__` method on the Python object is actually called *before* the connection to the Java side is established. +So you cannot currently override construction of the Java object or run code during initialization that would affect the Java half of the combined structure. +You will have to create a factory method if you want to achieve this. + +For example: ```python import atexit @@ -277,6 +279,8 @@ for record in handler.this.logged: print(f'Python captured message "{record.getMessage()}" at level {record.getLevel().getName()}') ``` +For more information about how the generated Java subclass behaves, see the [Truffle documentation](https://www.graalvm.org/truffle/javadoc/com/oracle/truffle/api/TruffleLanguage.Env.html#createHostAdapter(java.lang.Object%5B%5D)). + ## Embedding Python into Java The other way to use Jython was to embed it into a Java application. There were two options for such an embedding. @@ -284,7 +288,7 @@ The other way to use Jython was to embed it into a Java application. There were 1. Use the `PythonInterpreter` object that Jython provides. Existing code using Jython in this manner depends directly on the Jython package (for example, in the Maven configuration), because the Java code has references to Jython internal classes. These classes do not exist in GraalVM, and no equivalent classes are exposed. -To migrate from this usage, switch to the [GraalVM SDK](https://mvnrepository.com/artifact/org.graalvm.sdk/graal-sdk). +To migrate from this usage, switch to the [GraalVM SDK](https://central.sonatype.com/artifact/org.graalvm.sdk/graal-sdk). Using this SDK, no APIs particular to Python are exposed, everything is achieved via the GraalVM API, with maximum configurability of the Python runtime. Refer to the [Getting Started](README.md) documentation for preparing a setup. diff --git a/docs/user/README.md b/docs/user/README.md index 2803c08397..43886c14b4 100644 --- a/docs/user/README.md +++ b/docs/user/README.md @@ -1,38 +1,28 @@ ---- -layout: docs -toc_group: python -link_title: Python Reference -permalink: /reference-manual/python/ -redirect_from: - - /docs/reference-manual/python/ - - /reference-manual/python/FAQ/ ---- - # Getting Started with GraalPy on the JVM You can use GraalPy with GraalVM JDK, Oracle JDK, or OpenJDK. You can easily add GraalPy to your Java application using Maven or Gradle build tools as shown below. -Other build systems (Ant, Make, CMake, ...) can also be used with a bit more manual work. +Other build systems (Ant, Make, CMake, and so on) can also be used with a bit more manual work. ## Maven -GraalPy can generate a Maven project that embeds Python packages into a Java application using [Maven artefacts](https://mvnrepository.com/artifact/org.graalvm.python). +GraalPy can generate a Maven project that embeds Python packages into a Java application using [Maven artefacts](https://central.sonatype.com/namespace/org.graalvm.python). 1. GraalPy project publishes a Maven archetype to generate a starter project: ```bash mvn archetype:generate \ -DarchetypeGroupId=org.graalvm.python \ -DarchetypeArtifactId=graalpy-archetype-polyglot-app \ - -DarchetypeVersion=24.1.0 + -DarchetypeVersion=24.2.0 ``` -2. Build a native executable using the [ GraalVM Native Image "tool"](https://www.graalvm.org/latest/reference-manual/native-image/) plugin that was added for you automatically: +2. Build a native executable using the [GraalVM Native Image "tool"](https://www.graalvm.org/latest/reference-manual/native-image/) plugin that was added for you automatically: ```bash mvn -Pnative package ``` 3. Once completed, run the executable: - ``` + ```bash ./target/polyglot_app ``` The application prints "hello java" to the console. @@ -54,7 +44,6 @@ In order to distribute the resulting application for other systems, follow these 2. Unzip each of the JAR files (substituting the correct names for the JAR files). A special file, _vfs/fileslist.txt_ needs to be concatenated from each JAR file. Finally, create a new _combined.jar_ from the combination of all files and with the concatenated _fileslist.txt_. - ```bash unzip linux.jar -d combined mv combined/vfs/fileslist.txt fileslist-linux.txt @@ -89,8 +78,7 @@ In order to distribute the resulting application for other systems, follow these 2. Open your project configuration file, _app/build.gradle_, and modify it as follows. - Include the GraalPy support and the [GraalVM Polyglot API](https://www.graalvm.org/sdk/javadoc/org/graalvm/polyglot/package-summary.html) in the `dependencies` section: - - ``` + ```bash implementation("org.graalvm.polyglot:polyglot:24.2.0") implementation("org.graalvm.polyglot:python:24.2.0") ``` @@ -116,25 +104,25 @@ In order to distribute the resulting application for other systems, follow these ``` The application prints "Hello Python!" to the console. -> Note: The performance of the GraalPy runtime depends on the JDK in which you embed it. For more information, see [Runtime Optimization Support](https://www.graalvm.org/latest/reference-manual/embed-languages/#runtime-optimization-support). + > Note: The performance of the GraalPy runtime depends on the JDK in which you embed it. For more information, see [Runtime Optimization Support](https://www.graalvm.org/latest/reference-manual/embed-languages/#runtime-optimization-support). -5. Optionally, you can also use a third-party Python package: +5. Optionally, you can also use a third-party Python package. 5.1. In _app/build.gradle_: - add the graalpy-gradle-plugin to the `plugins` section: - ``` + ```bash id "org.graalvm.python" version "24.2.0" ``` - configure the GraalPy Gradle plugin: - ``` + ```bash graalPy { packages = ["termcolor==2.2"] } ``` - 5.2, In _settings.gradle_, add the following `pluginManagement` configuration. - ``` + 5.2. In _settings.gradle_, add the following `pluginManagement` configuration. + ```bash pluginManagement { repositories { gradlePluginPortal() @@ -147,7 +135,7 @@ In order to distribute the resulting application for other systems, follow these package interop; import org.graalvm.polyglot.*; - import org.graalvm.python.embedding.utils.GraalPyResources; + import org.graalvm.python.embedding.GraalPyResources; class App { ... @@ -173,7 +161,7 @@ GraalPy comes with a tool to obtain the required JAR files from Maven. 1. Assuming there is some directory where third-party dependencies are stored for the project and that the build system is set up to put any JAR files there on the classpath, the project directory tree might look similar to this: - ``` + ```bash ├───lib │ └─── ... *.jar dependencies are here └───src @@ -191,7 +179,7 @@ GraalPy comes with a tool to obtain the required JAR files from Maven. ``` In PowerShell: - ``` + ```bash $GRAALPY_HOME = graalpy -c "print(__graalpython__.home)" & "$GRAALPY_HOME/libexec/graalpy-polyglot-get" -a python -o lib -v "24.2.0" ``` @@ -212,9 +200,9 @@ GraalPy comes with a tool to obtain the required JAR files from Maven. } ``` -## GraalPy as CPython Replacement +## Testing Python Applications and Packages on GraalPy -Go [here](Python-Runtime.md) to get started with GraalPy as CPython replacement. +Go [here](Python-Runtime.md) to get a CPython compatible distribution of GraalPy to test Python applications and packages. #### Related Documentation diff --git a/docs/user/Tooling.md b/docs/user/Tooling.md index f4731c2fb9..1861ba588a 100644 --- a/docs/user/Tooling.md +++ b/docs/user/Tooling.md @@ -1,9 +1,3 @@ ---- -layout: docs -toc_group: python -link_title: Tooling Support for Python -permalink: /reference-manual/python/Tooling/ ---- # Tooling Support for Python ## Debugging @@ -30,7 +24,8 @@ You can inspect variables, set watch expressions, interactively evaluate code sn 3. Open your Chrome browser and enter the URL provided. Now you can inspect the stack, variables, evaluate variables, and selected expressions in a tooltip, and so on. For example: - ![Chrome Inspector](./assets/Chrome_Inspector.png) + + ![Chrome Inspector](./assets/Chrome_Inspector.png) ## Profiling @@ -48,7 +43,7 @@ You should see output similar to: {::options parse_block_html="true" /}
CPU Sampler Output (Click to expand) -``` +```bash -------------------------------------------------------------------------------------------------------------------------------------------------------------- Sampling Histogram. Recorded 564 samples with period 10ms. Missed 235 samples. Self Time: Time spent on the top of the stack. @@ -80,7 +75,7 @@ You should see output similar to: {::options parse_block_html="true" /}
CPU Tracer Output (Click to Expand) -``` +```bash -------------------------------------------------------------------------------------------------------------------- Tracing Histogram. Counted a total of 1135 element executions. Total Count: Number of times the element was executed and percentage of total executions. @@ -116,7 +111,7 @@ You should see output similar to: {::options parse_block_html="true" /}
Memory Tracer Output (Click to Expand) -``` +```bash ---------------------------------------------------------------------------- Location Histogram with Allocation Counts. Recorded a total of 565 allocations. Total Count: Number of allocations during the execution of this element. @@ -152,7 +147,7 @@ You should see output similar to: {::options parse_block_html="true" /}
CPU Sampler Output (Click to expand) -``` +```bash ------------------------------------------------------------------------------------------------------------------------------------------------ Code coverage histogram. Shows what percent of each element was covered during execution @@ -210,17 +205,17 @@ The standard Python `trace` module is also provided. > Note: This works in the same way as CPython. The programmatic API also works, with some limitations: it does not currently track calls, only line counts and called functions. -For example, the command +For example, running this command: ```bash graalpy -m trace -c -s text_styler.py Welcome to GraalPy! ``` -Give example output +You should see output similar to: {::options parse_block_html="true" /} -
CPU Sampler Output (Click to expand) -``` +
CPU Tracer Output (Click to Expand) +```bash _ __ __ __ | | / /__ / /________ ____ ___ ___ / /_____ | | /| / / _ \/ / ___/ __ \/ __ `__ \/ _ \ / __/ __ \ @@ -330,7 +325,7 @@ You can use GraalPy in PyCharm to create a virtual environment, install packages 3. Create, or open, a Python project. (For more information, see [Create a Python project](https://www.jetbrains.com/help/pycharm/creating-empty-project.html), or [Open, reopen, and close projects](https://www.jetbrains.com/help/pycharm/open-projects.html), respectively.) -4. Create a new _venv_ virtual environment for your Python project. +4. Create a new `venv` virtual environment for your Python project. (For more information, see [Create a virtualenv environment](https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html#python_create_virtual_env).) 5. Install packages by following the PyCharm instructions. @@ -345,7 +340,7 @@ You can use GraalPy in Visual Studio (VS) Code to create a virtual environment, 1. Install `graalpy`. (For more information, see [Installing GraalPy](Python-Runtime.md).) -2. Install VS Code and the Python Extension, following the instructions here: [Install Visual Studio Code and the Python Extension](https://code.visualstudio.com/docs/python/python-tutorial#_install-visual-studio-code-and-the-python-extension). +2. Install VS Code and the Python Extension, following the instructions here: [Install Visual Studio Code and the Python Extension](https://code.visualstudio.com/docs/python/python-tutorial#_prerequisites). 3. Create, or open, a Python file. @@ -355,9 +350,8 @@ You can use GraalPy in Visual Studio (VS) Code to create a virtual environment, 5. Install packages by following the VS Code instructions. (For more information, see [Install and use packages](https://code.visualstudio.com/docs/python/python-tutorial#_install-and-use-packages).) -6. Use the VS Code menu items to run your Python application. (For more information, see [Run Hello World](https://code.visualstudio.com/docs/python/python-tutorial#_run-hello-world).) +6. Use the VS Code menu items to run your Python application. (For more information, see [Run Hello World](https://code.visualstudio.com/docs/python/python-tutorial#_run-python-code).) Alternatively, use a VS Code terminal emulator to run the `graalpy` command. 7. You cannot use VS Code to debug your Python application. Instead, open a VS Code terminal emulator and follow these instructions: [Debugging a Python Application](#debugging). - diff --git a/docs/user/Troubleshooting.md b/docs/user/Troubleshooting.md new file mode 100644 index 0000000000..da916dcc22 --- /dev/null +++ b/docs/user/Troubleshooting.md @@ -0,0 +1,141 @@ +# GraalPy Troubleshooting + +[[TOC]] + +## GraalPy Embedding + +#### VirtualFileSystem cannot load a file +There are situations where a file cannot be loaded even though it is part of the Virtual Filesystem resources. +GraalPy tries to prevent such situations by automatically [extracting](Embedding-Build-Tools.md#extracting-files-from-virtual-filesystem) +some well known files to the real filesystem, but if you see an error like: +``` +ImportError: cannot load /graalpy_vfs/venv/lib/python3.11/site-packages/_cffi_backend.graalpy250dev09433ef706-311-native-aarch64-darwin.so: +NFIUnsatisfiedLinkError: dlopen(/graalpy_vfs/venv/lib/python3.11/site-packages/_cffi_backend.graalpy250dev09433ef706-311-native-aarch64-darwin.so, 0x0002): +``` +then the default behavior did not work as intended. + +Depending on how you [deploy Python resources](Embedding-Build-Tools.md#deployment) in your application, you can try one of the following: +- if you need to package resources within your Jar or Native Image executable: + - if the problematic file is not one of the following types: `.so`, `.dylib`, `.pyd`, `.dll`, or `.ttf`, which are extracted to + the real filesystem by default, you can simply attempt to add it to the extraction filter using: + ```java + VirtualFileSystem.Builder.extractFilter(filter); + ``` + - if the previous does not help, it is also possible to extract all Python resources into a user-defined directory before creating a GraalPy + context, and then configure the context to use that directory: + ```java + // extract the Python resources from the jar or native image into a given directory + GraalPyResources.extractVirtualFileSystemResources(VirtualFileSystem.create(), externalResourceDirectoryPath); + // create a GraalPy context configured with an external Python resource directory + Context context = GraalPyResources.contextBuilder(externalResourceDirectoryPath).build(); + ``` +- or if you're able to ship resources in a separate directory, you have to set the `externalDirectory` tag in + [Maven](Embedding-Build-Tools.md#graalpy-maven-plugin) or `externalDirectory` field in [Gradle](Embedding-Build-Tools.md#graalpy-gradle-plugin) + and also configure the GraalPy context to use that directory as well: + ```java + // create a Context configured with an external Python resource directory + Context context = GraalPyResources.contextBuilder(externalResourceDirectoryPath).build(); + ``` + Please **note**, that if switching from Virtual FileSystem to an external directory, also all **user files** from the previous + Virtual FileSystem resource root have to be moved into that directory as well. + +For more details about the Python resources in GraalPy Embedding please refer to the [Embedding Build Tools](Embedding-Build-Tools.md) documentation. + +For more details about GraalPy context and Virtual FileSystem configuration please refer to [GraalPyResources](https://github.com/oracle/graalpython/blob/master/graalpython/org.graalvm.python.embedding/src/org/graalvm/python/embedding/GraalPyResources.java) and +[VirtualFileSystem](https://github.com/oracle/graalpython/blob/master/graalpython/org.graalvm.python.embedding/src/org/graalvm/python/embedding/VirtualFileSystem.java) javadoc. + +#### Issues with GraalPy 'java' posix backend +The Virtual FileSystem is built on the Truffle filesystem and relies on the GraalPy Java POSIX backend. +Unfortunately, certain Python packages bypass Python's I/O and directly access files through their +native extensions. If you encounter an error like: +``` +NotImplementedError: 'PyObject_AsFileDescriptor' not supported when using 'java' posix backend +``` +then you have to override the default `java` GraalPy backend option byt setting the `native` POSIX backend +and completely omit the Virtual FileSystem at runtime. + +Depending on how you [deploy Python resources](Embedding-Build-Tools.md#deployment) in your application, +you can do one of the following: + +- if you need to package Python resources within your Jar or Native Image executable, then: + ```java + // extract the Python resources from the jar or native image into a given directory + GraalPyResources.extractVirtualFileSystemResources(VirtualFileSystem.create(), externalResourceDirectoryPath); + // create a Context.Builder configured with an external python resource directory + Builder builder = GraalPyResources.contextBuilder(externalResourceDirectoryPath); + // override the python.PosixModuleBackend option with "native" + builder.option("python.PosixModuleBackend", "native"); + // create a context + Context context = builder.build(); + ``` +- or if you're able to ship Python resources in a separate directory, you have to set the `externalDirectory` tag in + [Maven](Embedding-Build-Tools.md#graalpy-maven-plugin) or `externalDirectory` field in [Gradle](Embedding-Build-Tools.md#graalpy-gradle-plugin) + and configure the GraalPy context accordingly: + ```java + // create a Context.Builder configured with an external python resource directory + Builder builder = GraalPyResources.contextBuilder(externalResourceDirectoryPath); + // override the python.PosixModuleBackend option with "native" + builder.option("python.PosixModuleBackend", "native"); + // create a context + Context context = builder.build(); + ``` + Please **note**, that if switching from Virtual FileSystem to an external directory, also all **user files** from the previous + Virtual FileSystem resource root have to be moved into that directory as well. + +For more details about the Python resources in GraalPy Embedding please refer to the [Embedding Build Tools](Embedding-Build-Tools.md) documentation. + +For more details about GraalPy context and Virtual FileSystem configuration please refer to [GraalPyResources](https://github.com/oracle/graalpython/blob/master/graalpython/org.graalvm.python.embedding/src/org/graalvm/python/embedding/GraalPyResources.java) and +[VirtualFileSystem](https://github.com/oracle/graalpython/blob/master/graalpython/org.graalvm.python.embedding/src/org/graalvm/python/embedding/VirtualFileSystem.java) javadoc. + +### Maven and Gradle applications + +#### ImportError reports "unknown location" +A possible cause of an `ImportError` ending with `(unknown location)` when running a GraalPy Java Embedding project might be +that an embedded Python package was built for a different operating system. If you see an error like the following: +``` +ImportError: cannot import name 'exceptions' from 'cryptography.hazmat.bindings._rust' (unknown location) +``` +You probably need to rebuild your project on the correct operating system before running it. + +#### GraalVM JDK Compatibility +To enable runtime compilation when running GraalPy from a Maven or Gradle application, +you must use versions of GraalPy and the Polyglot API dependencies that are compatible +with the specified GraalVM JDK version. If you see errors like the following: + +``` +Your Java runtime '23.0.1+11-jvmci-b01' with compiler version '24.1.1' is incompatible with polyglot version '24.1.0'. +``` +You need to keep the versions of your GraalPy and Polyglot dependencies according to the error message, +so either upgrade the version of your JDK or your polyglot and GraalPy dependencies. + +Note, this can also apply to cases when your dependencies are transitively pulled in by another artifact, +e.g. micronaut-graalpy. + +#### The following artifacts could not be resolved: org.graalvm.python:python-language-enterprise +`python-language-enterprise` was discontinued, use `org.graalvm.polyglot:python` instead. + +#### Issues with Meson build system when installing Python packages on OSX with Maven or Gradle GraalPy plugin +Errors like the following: +``` +../meson.build:1:0: ERROR: Failed running 'cython', binary or interpreter not executable. +``` + +could be caused by the GraalPy launcher used internally by the Maven or Gradle GraalPy plugin +for installing Python packages. Currently, there is no straightforward solution. However, +a workaround is to set the Java system property graalpy.vfs.venvLauncher to a launcher from +a downloaded [GraalPy](https://github.com/oracle/graalpython/releases/) distribution with a version +matching the GraalPy Maven artifacts version. + +e.g. +``` +mvn package -Dgraalpy.vfs.venvLauncher={graalpy_directroy}/Contents/Home/bin/graalpy +``` + +#### No language and polyglot implementation was found on the module-path. +If you see an error like: +``` +java.lang.IllegalStateException: No language and polyglot implementation was found on the module-path. Make sure at last one language is added to the module-path. +``` +you are probably missing the python langauge dependency in your Maven of Gradle configuration file. +You need to add either `org.graalvm.polyglot:python` or `org.graalvm.polyglot:python-community` to your dependencies. + diff --git a/docs/user/assets/mcd-dark.svg b/docs/user/assets/mcd-dark.svg index 16f0097a4a..d5275e7442 100644 --- a/docs/user/assets/mcd-dark.svg +++ b/docs/user/assets/mcd-dark.svg @@ -1,4 +1,4 @@ -Compatibility with Top PyPI PackagesGraalPy 24.0.00.25CPython 3.10.80.750100200300400500600213125.9104477611940531.096153846153847GraalPy 24.0.0438245.385189437428310.903846153846155CPython 3.10.879280.9621125143513631.096153846153847GraalPy 24.0.059509.2916188289323710.903846153846155CPython 3.10.827337.2479908151550531.096153846153847GraalPy 24.0.021551.771526980482310.903846153846155CPython 3.10.8193454.0677382319173631.096153846153847GraalPy 24.0.09567.701492537313510.903846153846155CPython 3.10.865591.06544202066631.096153846153847GraalPy 24.0.076612.836394948335310.903846153846155CPython 3.10.826639.38633754305431.096153846153847GraalPy 24.0.00653.192307692307710.903846153846155CPython 3.10.8Compatibility with Top PyPI PackagesWorking≥80% tests pass≥50% tests pass<50% tests passNot testedCannot install \ No newline at end of file +Compatibility with Top PyPI PackagesGraalPy 24.1.00.25CPython 3.11.70.750100200300400500600239138.2600882723833431.096153846153847GraalPy 24.1.0404224.8694829760403310.903846153846155CPython 3.11.796314.1034047919293431.096153846153847GraalPy 24.1.069473.149747793190410.903846153846155CPython 3.11.720374.992433795712431.096153846153847GraalPy 24.1.011515.142181588902810.903846153846155CPython 3.11.7138457.927490542244531.096153846153847GraalPy 24.1.013527.739911727616610.903846153846155CPython 3.11.796580.755359394703631.096153846153847GraalPy 24.1.0113593.877994955863810.903846153846155CPython 3.11.721642.16929382093331.096153846153847GraalPy 24.1.00653.192307692307610.903846153846155CPython 3.11.7Compatibility with Top PyPI PackagesWorking≥80% tests pass≥50% tests pass<50% tests passNot testedCannot install \ No newline at end of file diff --git a/docs/user/assets/mcd.svg b/docs/user/assets/mcd.svg index 91d35a745b..c68997811f 100644 --- a/docs/user/assets/mcd.svg +++ b/docs/user/assets/mcd.svg @@ -1,4 +1,4 @@ -Compatibility with Top PyPI PackagesGraalPy 24.0.00.25CPython 3.10.80.750100200300400500600213125.9104477611940531.096153846153847GraalPy 24.0.0438245.385189437428310.903846153846155CPython 3.10.879280.9621125143513631.096153846153847GraalPy 24.0.059509.2916188289323710.903846153846155CPython 3.10.827337.2479908151550531.096153846153847GraalPy 24.0.021551.771526980482310.903846153846155CPython 3.10.8193454.0677382319173631.096153846153847GraalPy 24.0.09567.701492537313510.903846153846155CPython 3.10.865591.06544202066631.096153846153847GraalPy 24.0.076612.836394948335310.903846153846155CPython 3.10.826639.38633754305431.096153846153847GraalPy 24.0.00653.192307692307710.903846153846155CPython 3.10.8Compatibility with Top PyPI PackagesWorking≥80% tests pass≥50% tests pass<50% tests passNot testedCannot install \ No newline at end of file +Compatibility with Top PyPI PackagesGraalPy 24.1.00.25CPython 3.11.70.750100200300400500600239138.2600882723833431.096153846153847GraalPy 24.1.0404224.8694829760403310.903846153846155CPython 3.11.796314.1034047919293431.096153846153847GraalPy 24.1.069473.149747793190410.903846153846155CPython 3.11.720374.992433795712431.096153846153847GraalPy 24.1.011515.142181588902810.903846153846155CPython 3.11.7138457.927490542244531.096153846153847GraalPy 24.1.013527.739911727616610.903846153846155CPython 3.11.796580.755359394703631.096153846153847GraalPy 24.1.0113593.877994955863810.903846153846155CPython 3.11.721642.16929382093331.096153846153847GraalPy 24.1.00653.192307692307610.903846153846155CPython 3.11.7Compatibility with Top PyPI PackagesWorking≥80% tests pass≥50% tests pass<50% tests passNot testedCannot install \ No newline at end of file diff --git a/graalpy_virtualenv/graalpy_virtualenv/__init__.py b/graalpy_virtualenv/graalpy_virtualenv/__init__.py deleted file mode 100644 index 18f8205525..0000000000 --- a/graalpy_virtualenv/graalpy_virtualenv/__init__.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# The Universal Permissive License (UPL), Version 1.0 -# -# Subject to the condition set forth below, permission is hereby granted to any -# person obtaining a copy of this software, associated documentation and/or -# data (collectively the "Software"), free of charge and under any and all -# copyright rights in the Software, and any and all patent rights owned or -# freely licensable by each licensor hereunder covering either (i) the -# unmodified Software as contributed to or provided by such licensor, or (ii) -# the Larger Works (as defined below), to deal in both -# -# (a) the Software, and -# -# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if -# one is included with the Software each a "Larger Work" to which the Software -# is contributed by such licensors), -# -# without restriction, including without limitation the rights to copy, create -# derivative works of, display, perform, and distribute the Software and make, -# use, sell, offer for sale, import, export, have made, and have sold the -# Software and the Larger Work(s), and to sublicense the foregoing rights on -# either these or other terms. -# -# This license is subject to the following condition: -# -# The above copyright notice and either this complete permission notice or at a -# minimum a reference to the UPL must be included in all copies or substantial -# portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - diff --git a/graalpy_virtualenv/graalpy_virtualenv/graalpy.py b/graalpy_virtualenv/graalpy_virtualenv/graalpy.py deleted file mode 100644 index 172fa5bc00..0000000000 --- a/graalpy_virtualenv/graalpy_virtualenv/graalpy.py +++ /dev/null @@ -1,206 +0,0 @@ -# Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# The Universal Permissive License (UPL), Version 1.0 -# -# Subject to the condition set forth below, permission is hereby granted to any -# person obtaining a copy of this software, associated documentation and/or -# data (collectively the "Software"), free of charge and under any and all -# copyright rights in the Software, and any and all patent rights owned or -# freely licensable by each licensor hereunder covering either (i) the -# unmodified Software as contributed to or provided by such licensor, or (ii) -# the Larger Works (as defined below), to deal in both -# -# (a) the Software, and -# -# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if -# one is included with the Software each a "Larger Work" to which the Software -# is contributed by such licensors), -# -# without restriction, including without limitation the rights to copy, create -# derivative works of, display, perform, and distribute the Software and make, -# use, sell, offer for sale, import, export, have made, and have sold the -# Software and the Larger Work(s), and to sublicense the foregoing rights on -# either these or other terms. -# -# This license is subject to the following condition: -# -# The above copyright notice and either this complete permission notice or at a -# minimum a reference to the UPL must be included in all copies or substantial -# portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -import sys -from contextlib import contextmanager -from functools import lru_cache -from pathlib import Path -from subprocess import check_output as subprocess_check_output - -from virtualenv.create.creator import Creator -from virtualenv.create.describe import PosixSupports -from virtualenv.seed.embed.pip_invoke import PipInvoke -from virtualenv.seed.wheels import get_wheel -from virtualenv.seed.wheels.bundle import from_dir - - -class GraalPyCreatorPosix(Creator, PosixSupports): - """ - Describe and fake Creator service for GraalPy. - - For the time being, we expect users to just use the builtin 'venv' creator - with GraalPy, but the virtualenv package cannot just support GraalPy as a - generic "venv capable python", because it needs a Describe service for the - Seeder and Activator services. - - Note: that even if we provided GraalPy specific Creator service, the builtin - 'venv' Creator takes precedence as the default. Therefore, the users would - have to enable the GraalPy Creator via explicit option `--creator graalpy`. - - Note: GraalPy cannot just simply pretend that it is CPython, because then the - virtualenv Creator would not set up the toolchain executables in the new virtual - environment. - """ - - def __init__(self, options, interpreter): - super().__init__(options, interpreter) - self.options = options - - @classmethod - def can_create(cls, interpreter): - # We are fake creator, we actually do not want to be used as Creator - return None - - @classmethod - def can_describe(cls, interpreter): - if not (interpreter.implementation == "GraalVM" and super().can_describe(interpreter)): - return False - - # We monkey patch SeederSelector to use our ensurepip, but only if we know that there - # is a chance that we are creating virtualenv for GraalPy, so that we do not mess up - # with virtualenv if not necessary. This relies on the fact that virtualenv calls this - # because it calls SeederSelector._get_default, but even if we monkey patched SeederSelector - # eagerly, that code would still be executed only when virtualenv loads our plugin, which - # happens to be very close to the point when it calls can_describe - try: - from virtualenv.run import SeederSelector - _get_default_orig = SeederSelector._get_default - - def _seeder_selector_get_default_override(self): - if self.interpreter.implementation == "GraalVM": - return "graalpy" - else: - return _get_default_orig(self) - - SeederSelector._get_default = _seeder_selector_get_default_override - except ImportError: - pass - except AttributeError: - pass - return True - - @classmethod - def exe_stem(cls): - return "graalpy" - - def create(self): - raise RuntimeError("Please use the 'venv' creator with GraalPy. " - "It should be the default and can be explicitly requested " - "with command line option `--creator venv`, " - "or environment variable VIRTUALENV_CREATOR=venv") - - -@lru_cache() -def get_ensurepip_path(exe): - if exe.samefile(sys.executable): - import ensurepip - ensurepip_path = ensurepip.__path__[0] - else: - cmd = [exe, "-u", "-c", 'import ensurepip; print(ensurepip.__path__[0])'] - ensurepip_path = subprocess_check_output(cmd, universal_newlines=True).strip() - return Path(ensurepip_path) / '_bundled' - - -def pip_wheel_env_run(search_dirs, app_data, env, exe): - env = env.copy() - env.update({"PIP_USE_WHEEL": "1", "PIP_USER": "0", "PIP_NO_INPUT": "1"}) - ensurepip_path = get_ensurepip_path(exe) - if ensurepip_path: - wheel_paths = list(ensurepip_path.glob('pip-*.whl')) - if wheel_paths: - env["PYTHONPATH"] = str(wheel_paths[0]) - return env - wheel = get_wheel( - distribution="pip", - version=None, - for_py_version=f"{sys.version_info.major}.{sys.version_info.minor}", - search_dirs=search_dirs, - download=False, - app_data=app_data, - do_periodic_update=False, - env=env, - ) - if wheel is None: - raise RuntimeError("could not find the embedded pip") - env["PYTHONPATH"] = str(wheel.path) - return env - - -class GraalPySeeder(PipInvoke): - """ - Seeder for GraalPy that reuses the PipInvoke seeder to install setuptools - and pip bundled with GraalPy in the ensurepip module, so that we can be - sure that the new environment is seeded with versions compatible with - GraalPy. This applies only if the user does not explicitly set the - setuptools/pip versions via command line flags to virtualenv. - - The choice of the wheel package version is left to the base class. - - We have to resort to reusing implementation classes from virtualenv, because - we would end up duplicating them here anyway in order for our seeder to match - the user expectations w.r.t. caching, internet access, etc., and to work - seamlessly with other tools, like tox, which just passes --no-download - regardless whether the seeder may support that flag or not (the latter case - casing an error). - """ - - def run(self, creator): - if not self.enabled: - return - for_py_version = creator.interpreter.version_release_str - with self.get_pip_install_cmd(creator.exe, for_py_version) as cmd: - env = pip_wheel_env_run(self.extra_search_dir, self.app_data, self.env, creator.exe) - self._execute(cmd, env) - - @contextmanager - def get_pip_install_cmd(self, exe, for_py_version): - cmd = [str(exe), "-m", "pip", "-q", "install", "--only-binary", ":all:", "--disable-pip-version-check"] - ensurepip_path = get_ensurepip_path(exe) - for dist, version in self.distribution_to_versions().items(): - if ensurepip_path and version == 'bundle': - if dist in ('pip', 'setuptools'): - wheel = from_dir(dist, None, for_py_version, [ensurepip_path]) - else: - # For wheel, install just `wheel` our patching logic should pick the right version - cmd.append(dist) - continue - else: - wheel = get_wheel( - distribution=dist, - version=version, - for_py_version=for_py_version, - search_dirs=self.extra_search_dir, - download=False, - app_data=self.app_data, - do_periodic_update=self.periodic_update, - env=self.env, - ) - if wheel is None: - raise RuntimeError("could not get wheel for distribution {}".format(dist)) - cmd.append(str(wheel.path)) - yield cmd diff --git a/graalpy_virtualenv/pyproject.toml b/graalpy_virtualenv/pyproject.toml deleted file mode 100644 index b816ff4a61..0000000000 --- a/graalpy_virtualenv/pyproject.toml +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# The Universal Permissive License (UPL), Version 1.0 -# -# Subject to the condition set forth below, permission is hereby granted to any -# person obtaining a copy of this software, associated documentation and/or -# data (collectively the "Software"), free of charge and under any and all -# copyright rights in the Software, and any and all patent rights owned or -# freely licensable by each licensor hereunder covering either (i) the -# unmodified Software as contributed to or provided by such licensor, or (ii) -# the Larger Works (as defined below), to deal in both -# -# (a) the Software, and -# -# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if -# one is included with the Software each a "Larger Work" to which the Software -# is contributed by such licensors), -# -# without restriction, including without limitation the rights to copy, create -# derivative works of, display, perform, and distribute the Software and make, -# use, sell, offer for sale, import, export, have made, and have sold the -# Software and the Larger Work(s), and to sublicense the foregoing rights on -# either these or other terms. -# -# This license is subject to the following condition: -# -# The above copyright notice and either this complete permission notice or at a -# minimum a reference to the UPL must be included in all copies or substantial -# portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[project] -name = "graalpy-virtualenv" -version = "0.0.1" -license = "UPL-1.0" -authors = [ - { name = "GraalPy Developers", email = "graalvm-users@oss.oracle.com" }, -] -keywords = [ - "environments", - "isolated", - "virtual", -] -dependencies = [ - "virtualenv", -] - -[project.entry-points."virtualenv.create"] -graalpy-posix = "graalpy_virtualenv.graalpy:GraalPyCreatorPosix" - -[project.entry-points."virtualenv.seed"] -graalpy = "graalpy_virtualenv:graalpy.GraalPySeeder" - -[project.urls] -Homepage = "https://graalvm.org/python" diff --git a/graalpy_virtualenv_seeder/graalpy_virtualenv_seeder/__init__.py b/graalpy_virtualenv_seeder/graalpy_virtualenv_seeder/__init__.py new file mode 100644 index 0000000000..bbc0effa9a --- /dev/null +++ b/graalpy_virtualenv_seeder/graalpy_virtualenv_seeder/__init__.py @@ -0,0 +1,39 @@ +# Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# The Universal Permissive License (UPL), Version 1.0 +# +# Subject to the condition set forth below, permission is hereby granted to any +# person obtaining a copy of this software, associated documentation and/or +# data (collectively the "Software"), free of charge and under any and all +# copyright rights in the Software, and any and all patent rights owned or +# freely licensable by each licensor hereunder covering either (i) the +# unmodified Software as contributed to or provided by such licensor, or (ii) +# the Larger Works (as defined below), to deal in both +# +# (a) the Software, and +# +# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +# one is included with the Software each a "Larger Work" to which the Software +# is contributed by such licensors), +# +# without restriction, including without limitation the rights to copy, create +# derivative works of, display, perform, and distribute the Software and make, +# use, sell, offer for sale, import, export, have made, and have sold the +# Software and the Larger Work(s), and to sublicense the foregoing rights on +# either these or other terms. +# +# This license is subject to the following condition: +# +# The above copyright notice and either this complete permission notice or at a +# minimum a reference to the UPL must be included in all copies or substantial +# portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + diff --git a/graalpy_virtualenv_seeder/graalpy_virtualenv_seeder/graalpy.py b/graalpy_virtualenv_seeder/graalpy_virtualenv_seeder/graalpy.py new file mode 100644 index 0000000000..7d3f4ee708 --- /dev/null +++ b/graalpy_virtualenv_seeder/graalpy_virtualenv_seeder/graalpy.py @@ -0,0 +1,238 @@ +# Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# The Universal Permissive License (UPL), Version 1.0 +# +# Subject to the condition set forth below, permission is hereby granted to any +# person obtaining a copy of this software, associated documentation and/or +# data (collectively the "Software"), free of charge and under any and all +# copyright rights in the Software, and any and all patent rights owned or +# freely licensable by each licensor hereunder covering either (i) the +# unmodified Software as contributed to or provided by such licensor, or (ii) +# the Larger Works (as defined below), to deal in both +# +# (a) the Software, and +# +# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +# one is included with the Software each a "Larger Work" to which the Software +# is contributed by such licensors), +# +# without restriction, including without limitation the rights to copy, create +# derivative works of, display, perform, and distribute the Software and make, +# use, sell, offer for sale, import, export, have made, and have sold the +# Software and the Larger Work(s), and to sublicense the foregoing rights on +# either these or other terms. +# +# This license is subject to the following condition: +# +# The above copyright notice and either this complete permission notice or at a +# minimum a reference to the UPL must be included in all copies or substantial +# portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +import sys +from contextlib import contextmanager +from functools import lru_cache +from pathlib import Path +from subprocess import check_output as subprocess_check_output + +from virtualenv.seed.embed.pip_invoke import PipInvoke +from virtualenv.seed.wheels import get_wheel +from virtualenv.seed.wheels.bundle import from_dir + +try: + from virtualenv.create.via_global_ref.builtin.graalpy import GraalPyPosix, GraalPyWindows +except ImportError: + from abc import ABC + from pathlib import Path + + from virtualenv.create.describe import PosixSupports, WindowsSupports + from virtualenv.create.via_global_ref.builtin.ref import PathRefToDest, RefMust, RefWhen + from virtualenv.create.via_global_ref.builtin.via_global_self_do import ViaGlobalRefVirtualenvBuiltin + + class GraalPy(ViaGlobalRefVirtualenvBuiltin, ABC): + @classmethod + def can_describe(cls, interpreter): + return interpreter.implementation == "GraalVM" and super().can_describe(interpreter) + + @classmethod + def exe_stem(cls): + return "graalpy" + + @classmethod + def exe_names(cls, interpreter): + return { + cls.exe_stem(), + "python", + f"python{interpreter.version_info.major}", + f"python{interpreter.version_info.major}.{interpreter.version_info.minor}", + } + + @classmethod + def _executables(cls, interpreter): + host = Path(interpreter.system_executable) + targets = sorted(f"{name}{cls.suffix}" for name in cls.exe_names(interpreter)) + yield host, targets, RefMust.NA, RefWhen.ANY + + @classmethod + def sources(cls, interpreter): + yield from super().sources(interpreter) + python_dir = Path(interpreter.system_executable).resolve().parent + if python_dir.name in {"bin", "Scripts"}: + python_dir = python_dir.parent + + native_lib = cls._native_lib(python_dir / "lib", interpreter.platform) + if native_lib.exists(): + yield PathRefToDest(native_lib, dest=lambda self, s: self.bin_dir.parent / "lib" / s.name) + + for jvm_dir_name in ("jvm", "jvmlibs", "modules"): + jvm_dir = python_dir / jvm_dir_name + if jvm_dir.exists(): + yield PathRefToDest(jvm_dir, dest=lambda self, s: self.bin_dir.parent / s.name) + + @classmethod + def _shared_libs(cls, python_dir): + raise NotImplementedError + + def set_pyenv_cfg(self): + super().set_pyenv_cfg() + # GraalPy 24.0 and older had home without the bin + version = self.interpreter.version_info + if version.major == 3 and version.minor <= 10: # noqa: PLR2004 + home = Path(self.pyenv_cfg["home"]) + if home.name == "bin": + self.pyenv_cfg["home"] = str(home.parent) + + + class GraalPyPosix(GraalPy, PosixSupports): + @classmethod + def _native_lib(cls, lib_dir, platform): + if platform == "darwin": + return lib_dir / "libpythonvm.dylib" + return lib_dir / "libpythonvm.so" + + + class GraalPyWindows(GraalPy, WindowsSupports): + @classmethod + def _native_lib(cls, lib_dir, _platform): + return lib_dir / "pythonvm.dll" + + def set_pyenv_cfg(self): + # GraalPy needs an additional entry in pyvenv.cfg on Windows + super().set_pyenv_cfg() + self.pyenv_cfg["venvlauncher_command"] = self.interpreter.system_executable + + + +# We monkey patch SeederSelector to use our seeder by default when creating +# a GraalPy virtualenv. +try: + from virtualenv.run import SeederSelector + _get_default_orig = SeederSelector._get_default + + def _seeder_selector_get_default_override(self): + if self.interpreter.implementation == "GraalVM": + return "graalpy" + else: + return _get_default_orig() + + SeederSelector._get_default = _seeder_selector_get_default_override +except Exception: + pass + + +@lru_cache() +def get_ensurepip_path(exe): + if exe.samefile(sys.executable): + import ensurepip + ensurepip_path = ensurepip.__path__[0] + else: + cmd = [str(exe), "-u", "-c", 'import ensurepip; print(ensurepip.__path__[0])'] + ensurepip_path = subprocess_check_output(cmd, universal_newlines=True).strip() + return Path(ensurepip_path) / '_bundled' + + +def pip_wheel_env_run(search_dirs, app_data, env, exe): + env = env.copy() + env.update({"PIP_USE_WHEEL": "1", "PIP_USER": "0", "PIP_NO_INPUT": "1"}) + ensurepip_path = get_ensurepip_path(exe) + if ensurepip_path: + wheel_paths = list(ensurepip_path.glob('pip-*.whl')) + if wheel_paths: + env["PYTHONPATH"] = str(wheel_paths[0]) + return env + wheel = get_wheel( + distribution="pip", + version=None, + for_py_version=f"{sys.version_info.major}.{sys.version_info.minor}", + search_dirs=search_dirs, + download=False, + app_data=app_data, + do_periodic_update=False, + env=env, + ) + if wheel is None: + raise RuntimeError("could not find the embedded pip") + env["PYTHONPATH"] = str(wheel.path) + return env + + +class GraalPySeeder(PipInvoke): + """ + Seeder for GraalPy that reuses the PipInvoke seeder to install setuptools + and pip bundled with GraalPy in the ensurepip module, so that we can be + sure that the new environment is seeded with versions compatible with + GraalPy. This applies only if the user does not explicitly set the + setuptools/pip versions via command line flags to virtualenv. + + The choice of the wheel package version is left to the base class. + + We have to resort to reusing implementation classes from virtualenv, because + we would end up duplicating them here anyway in order for our seeder to match + the user expectations w.r.t. caching, internet access, etc., and to work + seamlessly with other tools, like tox, which just passes --no-download + regardless whether the seeder may support that flag or not (the latter case + casing an error). + """ + + def run(self, creator): + if not self.enabled: + return + for_py_version = creator.interpreter.version_release_str + with self.get_pip_install_cmd(creator.exe, for_py_version) as cmd: + env = pip_wheel_env_run(self.extra_search_dir, self.app_data, self.env, creator.exe) + self._execute(cmd, env) + + @contextmanager + def get_pip_install_cmd(self, exe, for_py_version): + cmd = [str(exe), "-m", "pip", "-q", "install", "--only-binary", ":all:", "--disable-pip-version-check"] + ensurepip_path = get_ensurepip_path(exe) + for dist, version in self.distribution_to_versions().items(): + if ensurepip_path and version == 'bundle': + if dist in ('pip', 'setuptools'): + wheel = from_dir(dist, None, for_py_version, [ensurepip_path]) + else: + # For wheel, install just `wheel` our patching logic should pick the right version + cmd.append(dist) + continue + else: + wheel = get_wheel( + distribution=dist, + version=version, + for_py_version=for_py_version, + search_dirs=self.extra_search_dir, + download=False, + app_data=self.app_data, + do_periodic_update=self.periodic_update, + env=self.env, + ) + if wheel is None: + raise RuntimeError("could not get wheel for distribution {}".format(dist)) + cmd.append(str(wheel.path)) + yield cmd diff --git a/graalpy_virtualenv_seeder/pyproject.toml b/graalpy_virtualenv_seeder/pyproject.toml new file mode 100644 index 0000000000..a6c7004c3a --- /dev/null +++ b/graalpy_virtualenv_seeder/pyproject.toml @@ -0,0 +1,68 @@ +# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# The Universal Permissive License (UPL), Version 1.0 +# +# Subject to the condition set forth below, permission is hereby granted to any +# person obtaining a copy of this software, associated documentation and/or +# data (collectively the "Software"), free of charge and under any and all +# copyright rights in the Software, and any and all patent rights owned or +# freely licensable by each licensor hereunder covering either (i) the +# unmodified Software as contributed to or provided by such licensor, or (ii) +# the Larger Works (as defined below), to deal in both +# +# (a) the Software, and +# +# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +# one is included with the Software each a "Larger Work" to which the Software +# is contributed by such licensors), +# +# without restriction, including without limitation the rights to copy, create +# derivative works of, display, perform, and distribute the Software and make, +# use, sell, offer for sale, import, export, have made, and have sold the +# Software and the Larger Work(s), and to sublicense the foregoing rights on +# either these or other terms. +# +# This license is subject to the following condition: +# +# The above copyright notice and either this complete permission notice or at a +# minimum a reference to the UPL must be included in all copies or substantial +# portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "graalpy-virtualenv-seeder" +version = "0.0.1" +license = "UPL-1.0" +authors = [ + { name = "GraalPy Developers", email = "graalvm-users@oss.oracle.com" }, +] +keywords = [ + "environments", + "isolated", + "virtual", +] +dependencies = [ + "virtualenv", +] + +[project.entry-points."virtualenv.create"] +graalpy-posix = "graalpy_virtualenv_seeder.graalpy:GraalPyPosix" +graalpy-win = "graalpy_virtualenv_seeder.graalpy:GraalPyWindows" + +[project.entry-points."virtualenv.seed"] +graalpy = "graalpy_virtualenv_seeder.graalpy:GraalPySeeder" + +[project.urls] +Homepage = "https://graalvm.org/python" diff --git a/graalpython/com.oracle.graal.python.annotations/src/com/oracle/graal/python/annotations/HashNotImplemented.java b/graalpython/com.oracle.graal.python.annotations/src/com/oracle/graal/python/annotations/HashNotImplemented.java new file mode 100644 index 0000000000..8e29954896 --- /dev/null +++ b/graalpython/com.oracle.graal.python.annotations/src/com/oracle/graal/python/annotations/HashNotImplemented.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Indicates that the annotated class inheriting {@code PythonBuiltins} should have slot + * {@code tp_hash} filled with the {@code PyObject_HashNotImplemented} placeholder. There is some + * special inheritance semantics for this specific slot value. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface HashNotImplemented { +} diff --git a/graalpython/com.oracle.graal.python.annotations/src/com/oracle/graal/python/annotations/Slot.java b/graalpython/com.oracle.graal.python.annotations/src/com/oracle/graal/python/annotations/Slot.java index f6bd3a0d51..e4deb40dd7 100644 --- a/graalpython/com.oracle.graal.python.annotations/src/com/oracle/graal/python/annotations/Slot.java +++ b/graalpython/com.oracle.graal.python.annotations/src/com/oracle/graal/python/annotations/Slot.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -76,48 +76,152 @@ */ @Retention(RetentionPolicy.RUNTIME) @interface SlotSignature { + /** + * Used to supply the function name for error messages from argument parsing. + */ + String name() default ""; + int minNumOfPositionalArgs() default 0; + int maxNumOfPositionalArgs() default -1; + + int numOfPositionalOnlyArgs() default -1; + boolean takesVarArgs() default false; boolean takesVarKeywordArgs() default false; String[] parameterNames() default {}; + String[] keywordOnlyNames() default {}; + boolean needsFrame() default false; boolean alwaysNeedsCallerFrame() default false; - - String raiseErrorName() default ""; } /** See slot documentation */ enum SlotKind { /** Whether this object is treated as true or false for {@code if object} */ nb_bool("__bool__"), + /** Conversion to index (operator.index) */ + nb_index("__index__"), + /** Conversion to int */ + nb_int("__int__"), + /** Conversion to float */ + nb_float("__float__"), + /** abs(foo) */ + nb_absolute("__abs__"), + /** +foo */ + nb_positive("__pos__"), + /** -foo */ + nb_negative("__neg__"), + /** ~foo */ + nb_invert("__invert__"), /** foo + bar */ nb_add("__add__, __radd__"), + /** foo - bar */ + nb_subtract("__sub__, __rsub__"), + /** foo * bar */ nb_multiply("__mul__, __rmul__"), + /** foo % bar */ + nb_remainder("__mod__, __rmod__"), + /** divmod(foo, bar) */ + nb_divmod("__divmod__, __rdivmod__"), + /** foo << bar */ + nb_lshift("__lshift__, __rlshift__"), + /** foo >> bar */ + nb_rshift("__rshift__, __rrshift__"), + /** foo & bar */ + nb_and("__and__, __rand__"), + /** foo ^ bar */ + nb_xor("__xor__, __rxor__"), + /** foo | bar */ + nb_or("__or__, __ror__"), + /** foo // bar */ + nb_floor_divide("__floordiv__, __rfloordiv__"), + /** foo / bar */ + nb_true_divide("__truediv__, __rtruediv__"), + /** foo @ bar */ + nb_matrix_multiply("__matmul__, __rmatmul__"), + /** foo ** bar */ + nb_power("__pow__, __rpow__"), + /** foo += bar */ + nb_inplace_add("__iadd__"), + /** foo -= bar */ + nb_inplace_subtract("__isub__"), + /** foo *= bar */ + nb_inplace_multiply("__imul__"), + /** foo %= bar */ + nb_inplace_remainder("__imod__"), + /** foo <<= bar */ + nb_inplace_lshift("__ilshift__"), + /** foo >>= bar */ + nb_inplace_rshift("__irshift__"), + /** foo &= bar */ + nb_inplace_and("__iand__"), + /** foo ^= bar */ + nb_inplace_xor("__ixor__"), + /** foo |= bar */ + nb_inplace_or("__ior__"), + /** foo //= bar */ + nb_inplace_floor_divide("__ifloordiv__"), + /** foo /= bar */ + nb_inplace_true_divide("__itruediv__"), + /** foo @= bar */ + nb_inplace_matrix_multiply("__imatmul__"), + /** foo **= bar */ + nb_inplace_power("__ipow__"), /** sequence length/size */ sq_length("__len__"), /** sequence item: read element at index */ sq_item("__getitem__"), + /** write sequence element at index */ + sq_ass_item("__setitem__"), /** seq + seq, nb_add is tried before */ sq_concat("__add__"), /** seq * number, nb_multiply is tried before */ sq_repeat("__mul__"), + /** seq += seq */ + sq_inplace_concat("__iadd__"), + /** seq *= seq */ + sq_inplace_repeat("__imul__"), + /** item in seq **/ + sq_contains("__contains__"), /** mapping length */ mp_length("__len__"), /** mapping subscript, e.g. o[key], o[i:j] */ mp_subscript("__getitem__"), + /** o[key] = value */ + mp_ass_subscript("__setitem__"), + /** comparison operations: >,=>, ==, !=, <, <= */ + tp_richcompare("__lt__, __le__, __eq__, __ne__, __gt__, __ge__"), /** type descriptor get */ tp_descr_get("__get__"), /** type descriptor set/delete */ tp_descr_set("__set__, __delete__"), + /** + * hash code. See also if {@link HashNotImplemented} is not more appropriate. + */ + tp_hash("__hash__"), /** get object attribute */ tp_getattro("__getattribute__, __getattr__"), /** set/delete object attribute */ - tp_setattro("__setattr__, __delattr__"); + tp_setattro("__setattr__, __delattr__"), + /** iter(obj) */ + tp_iter("__iter__"), + /** next(obj) */ + tp_iternext("__next__"), + /** str(obj) */ + tp_str("__str__"), + /** repr(obj) */ + tp_repr("__repr__"), + tp_init("__init__"), + tp_new("__new__"), + tp_call("__call__"), + am_await("__await__"), + am_aiter("__aiter__"), + am_anext("__anext__"); SlotKind(@SuppressWarnings("unused") String specialMethods) { } diff --git a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/JavaBenchmarkDriver.java b/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/JavaBenchmarkDriver.java index d32cd9f917..ab47f9ec9c 100644 --- a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/JavaBenchmarkDriver.java +++ b/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/JavaBenchmarkDriver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -58,6 +58,11 @@ import org.graalvm.polyglot.Source; import org.graalvm.polyglot.Value; +/** + * Driver that can execute our Python benchmarks via Java embedding. Java version of the Python + * benchmark harness. The benchmarks must define Python function entry point named + * {@code java_embedded_bench_entrypoint} and this driver executes that as one benchmark iteration. + */ public class JavaBenchmarkDriver extends AbstractLanguageLauncher { private static final String LINE = "-------------------------------------------------------------------------------"; private static final String BENCHMARK_ENTRY_POINT = "java_embedded_bench_entrypoint"; diff --git a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/BenchOutputFormat.java b/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/BenchOutputFormat.java deleted file mode 100644 index d5753c4c4c..0000000000 --- a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/BenchOutputFormat.java +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.benchmarks.interop; - -import java.io.IOException; -import java.io.PrintStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; - -import org.openjdk.jmh.infra.BenchmarkParams; -import org.openjdk.jmh.infra.IterationParams; -import org.openjdk.jmh.results.BenchmarkResult; -import org.openjdk.jmh.results.IterationResult; -import org.openjdk.jmh.results.RunResult; -import org.openjdk.jmh.runner.format.OutputFormat; -import org.openjdk.jmh.runner.options.VerboseMode; -import org.openjdk.jmh.util.Utils; - -public class BenchOutputFormat implements OutputFormat { - - final VerboseMode verbose; - final PrintStream out; - - final String name; - - final HashMap> raws; - - public BenchOutputFormat(PrintStream out, VerboseMode verbose, String name) { - this.out = out; - this.verbose = verbose; - this.raws = new HashMap<>(); - this.name = name; - } - - public BenchOutputFormat(PrintStream out, VerboseMode verbose) { - this(out, verbose, null); - } - - private void add(BenchmarkParams params, double value) { - if (!raws.containsKey(params.getBenchmark())) { - raws.put(params.getBenchmark(), new ArrayList<>()); - } - raws.get(params.getBenchmark()).add(value); - } - - protected String benchName(BenchmarkParams params) { - if (name != null) { - return name; - } - return params.getBenchmark(); - } - - @Override - public void startBenchmark(BenchmarkParams params) { - String opts = Utils.join(params.getJvmArgs(), " "); - if (opts.trim().isEmpty()) { - opts = ""; - } - - println("# JMH version: " + params.getJmhVersion()); - println("# VM version: JDK " + params.getJdkVersion() + ", " + params.getVmName() + ", " + params.getVmVersion()); - - println("# VM invoker: " + params.getJvm()); - println("# VM options: " + opts); - println("# Benchmark mode: " + params.getMode().longLabel()); - - hline(); - String benchName = benchName(params); - IterationParams warmup = params.getWarmup(); - IterationParams measurement = params.getMeasurement(); - String info = "### %s, %d warmup iterations, %d bench iterations"; - println(String.format(info, benchName, warmup.getCount(), measurement.getCount())); - String s = ""; - boolean isFirst = true; - for (String k : params.getParamsKeys()) { - if (isFirst) { - isFirst = false; - } else { - s += ", "; - } - s += k + " = " + params.getParam(k); - } - - println(String.format("### args = [%s]", s)); - hline(); - println("### start benchmark ..."); - } - - @Override - public void iteration(BenchmarkParams benchmarkParams, IterationParams params, int iteration) { - } - - @Override - public void iterationResult(BenchmarkParams benchmParams, IterationParams params, int iteration, IterationResult data) { - double value = data.getPrimaryResult().getScore(); - add(benchmParams, value); - String benchName = benchName(benchmParams); - switch (params.getType()) { - case WARMUP: - out.println(String.format("### (pre)warming up for %s iteration=%d, duration=%.3f", benchName, iteration, value)); - break; - case MEASUREMENT: - out.println(String.format("### iteration=%d, name=%s, duration=%.3f", iteration, benchName, value)); - break; - default: - throw new IllegalStateException("Unknown iteration type: " + params.getType()); - } - } - - @Override - public void endBenchmark(BenchmarkResult result) { - final ArrayList raw = raws.get(result.getParams().getBenchmark()); - final double[] durations = new double[raw.size()]; - for (int i = 0; i < raw.size(); i++) { - durations[i] = raw.get(i); - } - hline(); - println("### teardown ..."); - println("### benchmark complete"); - hline(); - double best = min(durations); - println(String.format("### BEST duration: %.3f s", best)); - double worst = max(durations); - println(String.format("### WORST duration: %.3f s", worst)); - double avg = avg(durations); - println(String.format("### AVG (all runs) duration: %.3f s", avg)); - int warmupIndex = detect_warmup(durations); - println(String.format("### WARMUP detected at iteration: %d", warmupIndex)); - double avg2 = avg(Arrays.copyOfRange(durations, Math.min(durations.length - 1, warmupIndex + 1), durations.length)); - println(String.format("### AVG (no warmup) duration: %.3f s", avg2)); - hline(); - String s = ""; - for (double d : durations) { - s += d + ", "; - } - println(String.format("### RAW DURATIONS: [%s]", s)); - hline(); - } - - private static int[] cusum(double[] values, double threshold) { - // double threshold=1.0; - double drift = 0.0; - int size = values.length; - double[] csum_pos = new double[size]; - double[] csum_neg = new double[size]; - int[] change_points = new int[size]; - int cp_idx = -1; - for (int i = 1; i < size; i++) { - double diff = values[i] - values[i - 1]; - csum_pos[i] = csum_pos[i - 1] + diff - drift; - csum_neg[i] = csum_neg[i - 1] - diff - drift; - - if (csum_pos[i] < 0) { - csum_pos[i] = 0; - } - if (csum_neg[i] < 0) { - csum_neg[i] = 0; - } - - if (csum_pos[i] > threshold || csum_neg[i] > threshold) { - cp_idx++; - change_points[cp_idx] = i; - csum_pos[i] = 0.; - csum_neg[i] = 0.; - } - } - - return Arrays.copyOf(change_points, cp_idx + 1); - - } - - private static double avg(double[] values) { - return Arrays.stream(values).average().getAsDouble(); - } - - private static double min(double[] values) { - return Arrays.stream(values).min().getAsDouble(); - } - - private static double max(double[] values) { - return Arrays.stream(values).max().getAsDouble(); - } - - private static double[] norm(double[] values) { - double min = min(values); - double max = max(values); - return Arrays.stream(values).map(v -> (v - min) / (max - min) * 100.0).toArray(); - } - - private static double[] pairwise_slopes(double[] values, int[] cp) { - double[] copy = Arrays.copyOf(values, values.length - 1); - for (int i = 0; i < copy.length; i++) { - copy[i] = Math.abs((values[i + 1] - values[i]) / (cp[i + 1] - cp[i])); - } - return copy; - } - - private static double[] last_n_percent_runs(double[] values, double n) { - int size = values.length; - int newSize = size - (int) (size * n); - if (newSize >= size) { - newSize = size - 1; - } - return Arrays.copyOfRange(values, newSize, size); - } - - private static int warmup(int idx, int[] cp, int max) { - return cp[idx] < max ? cp[idx] : -1; - } - - private static int detect_warmup(double[] durations) { - double cp_threshold = 0.03, stability_slope_grade = 0.01; - stability_slope_grade *= 100.0; - cp_threshold *= 100; - double[] values = norm(durations); - int size = values.length; - int[] cp = cusum(values, cp_threshold); - double[] rolling_avg = new double[cp.length]; - for (int i = 0; i < cp.length; i++) { - // [avg(values[i:]) for i in cp] - rolling_avg[i] = avg(Arrays.copyOfRange(values, cp[i], values.length)); - } - - // find the point where the duration avg is below the cp threshold - for (int i = 0; i < rolling_avg.length; i++) { - if (rolling_avg[i] <= cp_threshold) { - return warmup(i, cp, size); - } - } - - // could not find something below the CP threshold (noise in the data), use the - // stabilisation of slopes - double n = 0.1; - double[] last_n_vals = last_n_percent_runs(values, n); - int last_n_idx = size - (int) (size * n); - int totalSize = cp.length + last_n_vals.length; - double[] rolling_avg2 = new double[totalSize]; - int[] cp2 = new int[totalSize]; - for (int i = 0; i < totalSize; i++) { - if (i < cp.length) { - rolling_avg2[i] = rolling_avg[i]; - cp2[i] = cp[i]; - } else { - int j = i - cp.length; - rolling_avg2[i] = last_n_vals[j]; - cp2[i] = last_n_idx++; - } - } - double[] slopes = pairwise_slopes(rolling_avg2, cp2); - - for (int i = 0; i < slopes.length; i++) { - if (slopes[i] <= stability_slope_grade) { - return warmup(i, cp, size); - } - } - - return -1; - } - - private void hline() { - println("-------------------------------------------------------------------------------"); - } - - @Override - public void print(String s) { - out.print(s); - } - - @Override - public void println(String s) { - out.println(s); - } - - @Override - public void flush() { - out.flush(); - } - - @Override - public void verbosePrintln(String s) { - if (verbose == VerboseMode.EXTRA) { - out.println(s); - } - } - - @Override - public void write(int b) { - out.write(b); - } - - @Override - public void write(byte[] b) throws IOException { - out.write(b); - } - - @Override - public void close() { - } - - @Override - public void startRun() { - } - - @Override - public void endRun(Collection runResults) { - } - -} diff --git a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/BenchRunner.java b/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/BenchRunner.java deleted file mode 100644 index 09fc5ee5b9..0000000000 --- a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/BenchRunner.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.benchmarks.interop; - -import java.util.HashMap; -import java.util.concurrent.TimeUnit; - -import org.graalvm.polyglot.Context; -import org.graalvm.polyglot.Value; -import org.graalvm.polyglot.io.IOAccess; -import org.openjdk.jmh.annotations.BenchmarkMode; -import org.openjdk.jmh.annotations.Measurement; -import org.openjdk.jmh.annotations.Mode; -import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.State; -import org.openjdk.jmh.annotations.Warmup; -import org.openjdk.jmh.runner.Runner; -import org.openjdk.jmh.runner.RunnerException; -import org.openjdk.jmh.runner.options.ChainedOptionsBuilder; -import org.openjdk.jmh.runner.options.Options; -import org.openjdk.jmh.runner.options.OptionsBuilder; -import org.openjdk.jmh.runner.options.VerboseMode; - -@State(Scope.Benchmark) -@BenchmarkMode(Mode.SingleShotTime) -@OutputTimeUnit(TimeUnit.SECONDS) -@Warmup(iterations = BenchRunner.WARMUP_ITERATIONS) -@Measurement(iterations = BenchRunner.MEASUREMENT_ITERATIONS, time = 1) -public class BenchRunner { - - public static final int MEASUREMENT_ITERATIONS = 5; - public static final int WARMUP_ITERATIONS = 0; - - protected Context context; - - protected BenchRunner() { - this.context = Context.newBuilder().allowIO(IOAccess.ALL).build(); - } - - public static void main(String[] args) throws RunnerException { - assert args.length > 1; - final HashMap rest = new HashMap<>(); - String benchName = args[0]; - String benchClass = args[1]; - int iter = MEASUREMENT_ITERATIONS; - int warmup = WARMUP_ITERATIONS; - int restCount = 0; - for (int i = 2; i < args.length; i++) { - final String arg = args[i]; - if (arg.contentEquals("-i")) { - i++; - iter = Integer.valueOf(args[i]); - } else if (arg.contentEquals("-w")) { - i++; - warmup = Integer.valueOf(args[i]); - } else { - restCount++; - rest.put("arg" + restCount, arg); - } - } - ChainedOptionsBuilder options = new OptionsBuilder(); - options = options.include(benchClass); - options = options.warmupIterations(warmup).measurementIterations(iter); - for (String arg : rest.keySet()) { - options = options.param(arg, rest.get(arg)); - } - Options opt = options.forks(1).build(); - new Runner(opt, new BenchOutputFormat(System.out, VerboseMode.SILENT, benchName)).run(); - } - - protected static Value get(Value a, int i) { - return a.getArrayElement(i); - } - - protected static void set(Value a, int i, Object v) { - a.setArrayElement(i, v); - } - - protected static double getd(Value a, int i) { - return a.getArrayElement(i).asDouble(); - } - - protected static void setd(Value a, int i, double v) { - a.setArrayElement(i, v); - } - - protected static int geti(Value a, int i) { - return a.getArrayElement(i).asInt(); - } - - protected static void seti(Value a, int i, int v) { - a.setArrayElement(i, v); - } - -} diff --git a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/PyEuler11.java b/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/PyEuler11.java deleted file mode 100644 index 7e6ccc58b5..0000000000 --- a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/PyEuler11.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.benchmarks.interop; - -import org.graalvm.polyglot.Value; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.Param; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.infra.Blackhole; - -public class PyEuler11 extends BenchRunner { - - @Param({"1000"}) public int arg1; - - private Value sub_list1; - private Value sub_list2; - private Value sub_list3; - private Value sub_list4; - private Value NUMS; - - @Setup - public void setup() { - System.out.println("### setup ..."); - this.sub_list1 = this.context.eval("python", "def sub_list1(nums, row, col): return list(nums[i][col] for i in range(row, row+4))\nsub_list1"); - this.sub_list2 = this.context.eval("python", "def sub_list2(nums, row, col): return list(nums[row][i] for i in range(col, col+4))\nsub_list2"); - this.sub_list3 = this.context.eval("python", "def sub_list3(nums, row, col): return list(nums[row+i][col+i] for i in range(0, 4))\nsub_list3"); - this.sub_list4 = this.context.eval("python", "def sub_list4(nums, row, col): return list(nums[row+i][col-i] for i in range(0, 4))\nsub_list4"); - this.NUMS = this.context.eval("python", "[\n" + - "[ 8, 2,22,97,38,15, 0,40, 0,75, 4, 5, 7,78,52,12,50,77,91, 8,],\n" + - "[49,49,99,40,17,81,18,57,60,87,17,40,98,43,69,48, 4,56,62, 0,],\n" + - "[81,49,31,73,55,79,14,29,93,71,40,67,53,88,30, 3,49,13,36,65,],\n" + - "[52,70,95,23, 4,60,11,42,69,24,68,56, 1,32,56,71,37, 2,36,91,],\n" + - "[22,31,16,71,51,67,63,89,41,92,36,54,22,40,40,28,66,33,13,80,],\n" + - "[24,47,32,60,99, 3,45, 2,44,75,33,53,78,36,84,20,35,17,12,50,],\n" + - "[32,98,81,28,64,23,67,10,26,38,40,67,59,54,70,66,18,38,64,70,],\n" + - "[67,26,20,68, 2,62,12,20,95,63,94,39,63, 8,40,91,66,49,94,21,],\n" + - "[24,55,58, 5,66,73,99,26,97,17,78,78,96,83,14,88,34,89,63,72,],\n" + - "[21,36,23, 9,75, 0,76,44,20,45,35,14, 0,61,33,97,34,31,33,95,],\n" + - "[78,17,53,28,22,75,31,67,15,94, 3,80, 4,62,16,14, 9,53,56,92,],\n" + - "[16,39, 5,42,96,35,31,47,55,58,88,24, 0,17,54,24,36,29,85,57,],\n" + - "[86,56, 0,48,35,71,89, 7, 5,44,44,37,44,60,21,58,51,54,17,58,],\n" + - "[19,80,81,68, 5,94,47,69,28,73,92,13,86,52,17,77, 4,89,55,40,],\n" + - "[ 4,52, 8,83,97,35,99,16, 7,97,57,32,16,26,26,79,33,27,98,66,],\n" + - "[88,36,68,87,57,62,20,72, 3,46,33,67,46,55,12,32,63,93,53,69,],\n" + - "[ 4,42,16,73,38,25,39,11,24,94,72,18, 8,46,29,32,40,62,76,36,],\n" + - "[20,69,36,41,72,30,23,88,34,62,99,69,82,67,59,85,74, 4,36,16,],\n" + - "[20,73,35,29,78,31,90, 1,74,31,49,71,48,86,81,16,23,57, 5,54,],\n" + - "[ 1,70,54,71,83,51,54,69,16,92,33,48,61,43,52, 1,89,19,67,48,],\n" + - "]"); - } - - @Benchmark - public int euler11(Blackhole bh) { - for (int i = 0; i < arg1; i++) { - bh.consume(solve()); - } - - int max = solve(); - System.out.println("max: " + max); - return max; - } - - private int solve() { - int max = Integer.MIN_VALUE; - long size1 = NUMS.getArraySize(); - long size2 = NUMS.getArrayElement(0).getArraySize(); - for (int row = 0; row < size1; row++) { - for (int col = 0; col < size2; col++) { - if (row + 4 <= size1) { - max = Math.max(max, product(call(sub_list1, row, col))); - } - if (col + 4 <= size2) { - max = Math.max(max, product(call(sub_list2, row, col))); - } - if (row + 4 <= size1 && col + 4 <= size2) { - max = Math.max(max, product(call(sub_list3, row, col))); - } - if (row + 4 <= size1 && col >= 3) { - max = Math.max(max, product(call(sub_list4, row, col))); - } - } - } - return max; - } - - private static int product(Value seq) { - int n = 1; - for (int i = 0; i < seq.getArraySize(); i++) { - n *= geti(seq, i); - } - return n; - } - - private Value call(Value func, int row, int col) { - return func.execute(NUMS, context.asValue(row), context.asValue(col)); - } -} diff --git a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/PyEuler31.java b/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/PyEuler31.java deleted file mode 100644 index 5de777761c..0000000000 --- a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/PyEuler31.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.benchmarks.interop; - -import org.graalvm.polyglot.Value; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.Param; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.infra.Blackhole; - -public class PyEuler31 extends BenchRunner { - - @Param({"100"}) public int arg1; - - private Value newpat; - private Value EMPTY; - private Value COINS; - - @Setup - public void setup() { - System.out.println("### setup ..."); - this.newpat = this.context.eval("python", // - "def newpat(t, end, p):" + // - " return t[:end] + (p,)\n" + // - "newpat"); - this.COINS = this.context.eval("python", "[1, 2, 5, 10, 20, 50, 100, 200]"); - this.EMPTY = this.context.eval("python", "()"); - } - - @Benchmark - public void euler31(Blackhole bh) { - int result = gen(EMPTY, 0, arg1); - bh.consume(result); - System.out.println("total number of different ways: " + result); - } - - private int gen(Value pattern, int coinnum, int num) { - int count = 0; - int coin = geti(COINS, coinnum); - for (int p = 0; p < (num / coin + 1); p++) { - Value newpattern = newpat(pattern, coinnum, p); - int bal = balance(newpattern); - if (bal > num) { - return count; - } else if (bal == num) { - count++; - } else if (coinnum < (COINS.getArraySize() - 1)) { - count += gen(newpattern, coinnum + 1, num); - } - } - return count; - } - - private int balance(Value pattern) { - long size = pattern.getArraySize(); - int sum = 0; - for (int i = 0; i < size; i++) { - sum += geti(COINS, i) * geti(pattern, i); - } - return sum; - } - - private Value newpat(Value t, int end, int p) { - return this.newpat.execute(t, this.context.asValue(end), this.context.asValue(p)); - } -} diff --git a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/PyFannkuchredux.java b/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/PyFannkuchredux.java deleted file mode 100644 index 7f9544c842..0000000000 --- a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/PyFannkuchredux.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.benchmarks.interop; - -import org.graalvm.polyglot.Value; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.Param; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.infra.Blackhole; - -public class PyFannkuchredux extends BenchRunner { - - @Param({"11"}) public int arg1; - - private Value createArray; - - @Setup - public void setup() { - System.out.println("### setup ..."); - this.createArray = this.context.eval("python", // - "from array import array\n" + // - "def create_array(n):" + // - " return array('i', range(n))\n" + // - "create_array"); - } - - @Benchmark - public void fannkuchredux3(Blackhole bh) { - int[] result = fannkuch(arg1); - bh.consume(result); - System.out.println("" + result[0]); - System.out.println(String.format("Pfannkuchen(%d) = %d", arg1, result[1])); - } - - public int[] fannkuch(int n) { - int[] result = new int[]{0, 0}; - int sign, maxflips, summ, flips, m, q0, qq, i, t, j, sx, tmp; - Value p = array(n); - Value q = array(n); - Value s = array(n); - sign = 1; - maxflips = 0; - summ = 0; - m = n - 1; - while (true) { - q0 = geti(p, 0); - if (q0 != 0) { - i = 1; - while (i < n) { - seti(q, i, geti(p, i)); - i += 1; - } - flips = 1; - while (true) { - qq = geti(q, q0); - if (qq == 0) { - summ += sign * flips; - if (flips > maxflips) { - maxflips = flips; - } - break; - } - seti(q, q0, q0); - if (q0 >= 3) { - i = 1; - j = q0 - 1; - while (true) { - tmp = geti(q, i); - seti(q, i, geti(q, j)); - seti(q, j, tmp); - i += 1; - j -= 1; - if (i >= j) { - break; - } - } - } - q0 = qq; - flips += 1; - } - } - - if (sign == 1) { - tmp = geti(p, 1); - seti(p, 1, geti(p, 0)); - seti(p, 0, tmp); - - sign = -1; - } else { - tmp = geti(p, 1); - seti(p, 1, geti(p, 2)); - seti(p, 2, tmp); - - sign = 1; - i = 2; - while (i < n) { - sx = geti(s, i); - if (sx != 0) { - seti(s, i, sx - 1); - break; - } - if (i == m) { - result[0] = summ; - result[1] = maxflips; - return result; - } - seti(s, i, i); - t = geti(p, 0); - j = 0; - while (j <= i) { - seti(p, j, geti(p, j + 1)); - j += 1; - } - seti(p, i + 1, t); - i += 1; - } - } - } - } - - public Value array(int n) { - return this.createArray.execute(context.asValue(n)); - } -} diff --git a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/PyNbody.java b/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/PyNbody.java deleted file mode 100644 index 74ec3016f7..0000000000 --- a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/PyNbody.java +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.benchmarks.interop; - -import org.graalvm.polyglot.*; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.Param; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.infra.Blackhole; - -public class PyNbody extends BenchRunner { - - @Param({"5000000"}) public int arg1; - - private Value combinations; - private Value dictValues; - private Value dictGetValue; - private Value create; - private Value BODIES; - private Value BODIES_ref; - private Value SYSTEM; - private Value PAIRS; - - @Setup - public void setup() { - System.out.println("### setup ..."); - this.combinations = this.context.eval("python", // - "def combinations(l):\n" + - " result = []\n" + - " for x in range(len(l) - 1):\n" + - " ls = l[x+1:]\n" + - " for y in ls:\n" + - " result.append((l[x],y))\n" + - " return result\n" + // - "combinations"); - this.dictValues = this.context.eval("python", // - "def dict_values(d):" + // - " return list(d.values())\n" + // - "dict_values"); - this.dictGetValue = this.context.eval("python", // - "def dict_get(d, s):" + // - " return d[s]\n" + // - "dict_get"); - this.create = this.context.eval("python", // - "PI = 3.14159265358979323\n" + // - "SOLAR_MASS = 4 * PI * PI\n" + // - "DAYS_PER_YEAR = 365.24\n" + // - "\n" + // - "BODIES = {\n" + // - " 'sun': ([0.0, 0.0, 0.0], [0.0, 0.0, 0.0], SOLAR_MASS),\n" + // - "\n" + // - " 'jupiter': ([4.84143144246472090e+00,\n" + // - " -1.16032004402742839e+00,\n" + // - " -1.03622044471123109e-01],\n" + // - " [1.66007664274403694e-03 * DAYS_PER_YEAR,\n" + // - " 7.69901118419740425e-03 * DAYS_PER_YEAR,\n" + // - " -6.90460016972063023e-05 * DAYS_PER_YEAR],\n" + // - " 9.54791938424326609e-04 * SOLAR_MASS),\n" + // - "\n" + // - " 'saturn': ([8.34336671824457987e+00,\n" + // - " 4.12479856412430479e+00,\n" + // - " -4.03523417114321381e-01],\n" + // - " [-2.76742510726862411e-03 * DAYS_PER_YEAR,\n" + // - " 4.99852801234917238e-03 * DAYS_PER_YEAR,\n" + // - " 2.30417297573763929e-05 * DAYS_PER_YEAR],\n" + // - " 2.85885980666130812e-04 * SOLAR_MASS),\n" + // - "\n" + // - " 'uranus': ([1.28943695621391310e+01,\n" + // - " -1.51111514016986312e+01,\n" + // - " -2.23307578892655734e-01],\n" + // - " [2.96460137564761618e-03 * DAYS_PER_YEAR,\n" + // - " 2.37847173959480950e-03 * DAYS_PER_YEAR,\n" + // - " -2.96589568540237556e-05 * DAYS_PER_YEAR],\n" + // - " 4.36624404335156298e-05 * SOLAR_MASS),\n" + // - "\n" + // - " 'neptune': ([1.53796971148509165e+01,\n" + // - " -2.59193146099879641e+01,\n" + // - " 1.79258772950371181e-01],\n" + // - " [2.68067772490389322e-03 * DAYS_PER_YEAR,\n" + // - " 1.62824170038242295e-03 * DAYS_PER_YEAR,\n" + // - " -9.51592254519715870e-05 * DAYS_PER_YEAR],\n" + // - " 5.15138902046611451e-05 * SOLAR_MASS) }\n" + // - "def create(): return BODIES\n" + // - "create"); - this.BODIES = create.execute(); - this.BODIES_ref = dictGetValue.execute(BODIES, context.asValue("sun")); - this.SYSTEM = dictValues.execute(BODIES); - this.PAIRS = combinations.execute(SYSTEM); - } - - @Benchmark - public void nbody3(@SuppressWarnings("unused") Blackhole bh) { - nbody(arg1); - } - - private void nbody(int n) { - offset_momentum(BODIES_ref, SYSTEM); - report_energy(SYSTEM, PAIRS); - advance(0.01, n, SYSTEM, PAIRS); - report_energy(SYSTEM, PAIRS); - } - - private static void report_energy(Value bodies, Value pairs) { - double e = 0.; - double dx, dy, dz; - for (int i = 0; i < pairs.getArraySize(); i++) { - // (((x1, y1, z1), v1, m1), ((x2, y2, z2), v2, m2)) - Value pair1 = pairs.getArrayElement(i).getArrayElement(0); - Value xyz1 = pair1.getArrayElement(0); - double x1 = getd(xyz1, 0), y1 = getd(xyz1, 1), z1 = getd(xyz1, 2); - double m1 = getd(pair1, 2); - Value pair2 = pairs.getArrayElement(i).getArrayElement(1); - Value xyz2 = pair2.getArrayElement(0); - double x2 = getd(xyz2, 0), y2 = getd(xyz2, 1), z2 = getd(xyz2, 2); - double m2 = getd(pair2, 2); - dx = x1 - x2; - dy = y1 - y2; - dz = z1 - z2; - e -= (m1 * m2) / Math.pow(dx * dx + dy * dy + dz * dz, 0.5); - } - for (int i = 0; i < bodies.getArraySize(); i++) { - Value body = bodies.getArrayElement(i); - Value v = body.getArrayElement(1); - double vx = getd(v, 0), vy = getd(v, 1), vz = getd(v, 2); - double m = getd(body, 2); - e += m * (vx * vx + vy * vy + vz * vz) / 2.; - } - System.out.println(String.format("%.9f", e)); - } - - private static void setAdd(Value a, int i, double v) { - a.setArrayElement(i, getd(a, i) + v); - } - - private static void setSubtract(Value a, int i, double v) { - a.setArrayElement(i, getd(a, i) - v); - } - - private static void advance(double dt, int n, Value bodies, Value pairs) { - double dx, dy, dz, mag, b1m, b2m; - for (int i = 0; i < n; i++) { - for (int j = 0; j < pairs.getArraySize(); j++) { - // (([x1, y1, z1], v1, m1), ([x2, y2, z2], v2, m2)) - Value pair1 = pairs.getArrayElement(j).getArrayElement(0); - Value xyz1 = pair1.getArrayElement(0); - double x1 = getd(xyz1, 0), y1 = getd(xyz1, 1), z1 = getd(xyz1, 2); - Value v1 = pair1.getArrayElement(1); - double m1 = getd(pair1, 2); - Value pair2 = pairs.getArrayElement(j).getArrayElement(1); - Value xyz2 = pair2.getArrayElement(0); - double x2 = getd(xyz2, 0), y2 = getd(xyz2, 1), z2 = getd(xyz2, 2); - Value v2 = pair2.getArrayElement(1); - double m2 = getd(pair2, 2); - dx = x1 - x2; - dy = y1 - y2; - dz = z1 - z2; - mag = dt * Math.pow(dx * dx + dy * dy + dz * dz, -1.5); - b1m = m1 * mag; - b2m = m2 * mag; - setSubtract(v1, 0, dx * b2m); - setSubtract(v1, 1, dy * b2m); - setSubtract(v1, 2, dz * b2m); - setAdd(v2, 0, dx * b1m); - setAdd(v2, 1, dy * b1m); - setAdd(v2, 2, dz * b1m); - } - for (int j = 0; j < bodies.getArraySize(); j++) { - // (r, [vx, vy, vz], m) - Value body = bodies.getArrayElement(j); - Value r = body.getArrayElement(0); - Value v = body.getArrayElement(1); - double vx = getd(v, 0), vy = getd(v, 1), vz = getd(v, 2); - setAdd(r, 0, dt * vx); - setAdd(r, 1, dt * vy); - setAdd(r, 2, dt * vz); - } - } - - } - - private static void offset_momentum(Value ref, Value bodies) { - double px = 0.0, py = 0.0, pz = 0.0; - for (int j = 0; j < bodies.getArraySize(); j++) { - // (r, [vx, vy, vz], m) - Value body = bodies.getArrayElement(j); - Value v = body.getArrayElement(1); - double vx = getd(v, 0), vy = getd(v, 1), vz = getd(v, 2); - double m = getd(body, 2); - px -= vx * m; - py -= vy * m; - pz -= vz * m; - } - // (r, v, m) - Value v = ref.getArrayElement(1); - double m = getd(ref, 2); - setd(v, 0, px / m); - setd(v, 1, py / m); - setd(v, 2, pz / m); - } -} diff --git a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/PyRichards.java b/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/PyRichards.java deleted file mode 100644 index 56f76bba49..0000000000 --- a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/interop/PyRichards.java +++ /dev/null @@ -1,593 +0,0 @@ -/* - * Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.benchmarks.interop; - -import static com.oracle.graal.python.benchmarks.interop.BenchRunner.get; -import static com.oracle.graal.python.benchmarks.interop.BenchRunner.set; -import static com.oracle.graal.python.benchmarks.interop.PyRichards.isNone; -import static com.oracle.graal.python.benchmarks.interop.PyRichards.BUFSIZE; -import static com.oracle.graal.python.benchmarks.interop.PyRichards.I_DEVA; -import static com.oracle.graal.python.benchmarks.interop.PyRichards.I_DEVB; -import static com.oracle.graal.python.benchmarks.interop.PyRichards.I_HANDLERA; -import static com.oracle.graal.python.benchmarks.interop.PyRichards.I_HANDLERB; -import static com.oracle.graal.python.benchmarks.interop.PyRichards.K_WORK; -import static com.oracle.graal.python.benchmarks.interop.PyRichards.getField; -import static com.oracle.graal.python.benchmarks.interop.PyRichards.getIntField; -import static com.oracle.graal.python.benchmarks.interop.PyRichards.getTaskList; -import static com.oracle.graal.python.benchmarks.interop.PyRichards.setField; -import static com.oracle.graal.python.benchmarks.interop.PyRichards.taskWorkArea; -import static com.oracle.graal.python.benchmarks.interop.PyRichards.trace; -import static com.oracle.graal.python.benchmarks.interop.PyRichards.tracing; - -import org.graalvm.polyglot.Value; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.Param; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.infra.Blackhole; - -public class PyRichards extends BenchRunner { - - @Param({"200"}) public int arg1; - - public static final boolean tracing = false; - public static final int TASKTABSIZE = 10; - public static int layout = 0; - - private Value classes; - private Value PacketClass; - private Value DeviceTaskRecClass; - private Value IdleTaskRecClass; - private Value HandlerTaskRecClass; - private Value WorkerTaskRecClass; - - public static final int I_IDLE = 1; - public static final int I_WORK = 2; - public static final int I_HANDLERA = 3; - public static final int I_HANDLERB = 4; - public static final int I_DEVA = 5; - public static final int I_DEVB = 6; - - // Packet types - public static final int K_DEV = 1000; - public static final int K_WORK = 1001; - - // Packet - public static final int BUFSIZE = 4; - - public static Value taskWorkArea; - public static Value None; - - @Setup - public void setup() { - System.out.println("### setup ..."); - PyRichards.None = this.context.eval("python", "None"); - this.classes = this.context.eval("python", // - "BUFSIZE = " + BUFSIZE + "\n" + - "I_HANDLERA = " + I_HANDLERA + "\n" + - "\n" + - "class Packet(object):\n" + - " def __init__(self,l,i,k):\n" + - " self.link = l\n" + - " self.ident = i\n" + - " self.kind = k\n" + - " self.datum = 0\n" + - " self.data = [0] * BUFSIZE\n" + - "\n" + - " def append_to(self,lst):\n" + - " self.link = None\n" + - " if lst is None:\n" + - " return self\n" + - " else:\n" + - " p = lst\n" + - " next = p.link\n" + - " while next is not None:\n" + - " p = next\n" + - " next = p.link\n" + - " p.link = self\n" + - " return lst\n" + - "\n" + - "\n" + - "# Task Records\n" + - "class TaskRec(object):\n" + - " pass\n" + - "\n" + - "\n" + - "class DeviceTaskRec(TaskRec):\n" + - " def __init__(self):\n" + - " self.pending = None\n" + - "\n" + - "\n" + - "class IdleTaskRec(TaskRec):\n" + - " def __init__(self):\n" + - " self.control = 1\n" + - " self.count = 10000\n" + - "\n" + - "\n" + - "class HandlerTaskRec(TaskRec):\n" + - " def __init__(self):\n" + - " self.work_in = None\n" + - " self.device_in = None\n" + - "\n" + - " def workInAdd(self,p):\n" + - " self.work_in = p.append_to(self.work_in)\n" + - " return self.work_in\n" + - "\n" + - " def deviceInAdd(self,p):\n" + - " self.device_in = p.append_to(self.device_in)\n" + - " return self.device_in\n" + - "\n" + - "\n" + - "class WorkerTaskRec(TaskRec):\n" + - " def __init__(self):\n" + - " self.destination = I_HANDLERA\n" + - " self.count = 0\n" + - "\n" + - "TASKTABSIZE = " + TASKTABSIZE + "\n" + - "\n" + - "class TaskWorkArea(object):\n" + - " def __init__(self):\n" + - " self.taskTab = [None] * TASKTABSIZE\n" + - "\n" + - " self.taskList = None\n" + - "\n" + - " self.holdCount = 0\n" + - " self.qpktCount = 0\n" + - "\n" + - "def get_class(c):\n" + - " if c == 1:\n" + - " return Packet\n" + - " if c == 2:\n" + - " return DeviceTaskRec\n" + - " if c == 3:\n" + - " return IdleTaskRec\n" + - " if c == 4:\n" + - " return HandlerTaskRec\n" + - " if c == 5:\n" + - " return WorkerTaskRec\n" + - " if c == 6:\n" + - " return TaskWorkArea\n" + - "get_class"); - this.PacketClass = classes.execute(1); - this.DeviceTaskRecClass = classes.execute(2); - this.IdleTaskRecClass = classes.execute(3); - this.HandlerTaskRecClass = classes.execute(4); - this.WorkerTaskRecClass = classes.execute(5); - PyRichards.taskWorkArea = classes.execute(6).newInstance(); - } - - public Value Packet(Value l, int i, int k) { - return PacketClass.newInstance(l, i, k); - } - - public Value IdleTaskRec() { - return IdleTaskRecClass.newInstance(); - } - - public Value WorkerTaskRec() { - return WorkerTaskRecClass.newInstance(); - } - - public Value HandlerTaskRec() { - return HandlerTaskRecClass.newInstance(); - } - - public Value DeviceTaskRec() { - return DeviceTaskRecClass.newInstance(); - } - - public static int getHoldCount() { - return getIntField(taskWorkArea, "holdCount"); - } - - public static void setHoldCount(int i) { - setField(taskWorkArea, "holdCount", i); - } - - public static int getQpktCount() { - return getIntField(taskWorkArea, "qpktCount"); - } - - public static void setQpktCount(int i) { - setField(taskWorkArea, "qpktCount", i); - } - - @Benchmark - public void richards3(Blackhole bh) { - for (int i = 0; i < arg1; i++) { - setHoldCount(0); - setQpktCount(0); - - bh.consume(new IdleTask(I_IDLE, 1, PyRichards.None, new TaskState().running(), IdleTaskRec())); - - Value wkq = Packet(None, 0, K_WORK); - wkq = Packet(wkq, 0, K_WORK); - bh.consume(new WorkTask(I_WORK, 1000, wkq, new TaskState().waitingWithPacket(), WorkerTaskRec())); - - wkq = Packet(None, I_DEVA, K_DEV); - wkq = Packet(wkq, I_DEVA, K_DEV); - wkq = Packet(wkq, I_DEVA, K_DEV); - bh.consume(new HandlerTask(I_HANDLERA, 2000, wkq, new TaskState().waitingWithPacket(), HandlerTaskRec())); - - wkq = Packet(None, I_DEVB, K_DEV); - wkq = Packet(wkq, I_DEVB, K_DEV); - wkq = Packet(wkq, I_DEVB, K_DEV); - bh.consume(new HandlerTask(I_HANDLERB, 3000, wkq, new TaskState().waitingWithPacket(), HandlerTaskRec())); - - wkq = None; - bh.consume(new DeviceTask(I_DEVA, 4000, wkq, new TaskState().waiting(), DeviceTaskRec())); - bh.consume(new DeviceTask(I_DEVB, 5000, wkq, new TaskState().waiting(), DeviceTaskRec())); - - schedule(); - - if (getHoldCount() == 9297 && getQpktCount() == 23246) { - continue; - } else { - return; - } - } - } - - public static void trace(int a) { - layout -= 1; - if (layout <= 0) { - System.out.println(); - layout = 50; - } - System.out.print(a + " "); - } - - void schedule() { - Task t = getTaskList(); - while (t != null) { - if (tracing) { - System.out.println("tcb =" + t.ident); - } - - if (t.isTaskHoldingOrWaiting()) { - t = (Task) t.link; - } else { - if (tracing) { - trace('0' + t.ident); - } - t = (Task) t.runTask(); - } - } - } - - public static Task getTaskList() { - Value t = getField(taskWorkArea, "taskList"); - return isNone(t) ? null : t.asHostObject(); - } - - public static void setField(Value clazz, String member, Object val) { - clazz.putMember(member, val); - } - - public static Value getField(Value clazz, String member) { - return clazz.getMember(member); - } - - public static int getIntField(Value clazz, String member) { - return clazz.getMember(member).asInt(); - } - - public static boolean isNone(Value v) { - if (v == null) { - return true; - } - return v.isNull(); - } -} - -class TaskState { - boolean packet_pending; - boolean task_waiting; - boolean task_holding; - - public TaskState() { - this.packet_pending = true; - this.task_waiting = false; - this.task_holding = false; - } - - TaskState packetPending() { - this.packet_pending = true; - this.task_waiting = false; - this.task_holding = false; - return this; - } - - TaskState waiting() { - this.packet_pending = false; - this.task_waiting = true; - this.task_holding = false; - return this; - } - - TaskState running() { - this.packet_pending = false; - this.task_waiting = false; - this.task_holding = false; - return this; - } - - TaskState waitingWithPacket() { - this.packet_pending = true; - this.task_waiting = true; - this.task_holding = false; - return this; - } - - boolean isPacketPending() { - return this.packet_pending; - } - - boolean isTaskWaiting() { - return this.task_waiting; - } - - boolean isTaskHolding() { - return this.task_holding; - } - - boolean isTaskHoldingOrWaiting() { - return this.task_holding || (!this.packet_pending && this.task_waiting); - } - - boolean isWaitingWithPacket() { - return this.packet_pending && this.task_waiting && !this.task_holding; - } - -} - -abstract class Task extends TaskState { - public int ident; - public int priority; - public Value input; // Packet - public Value handle; // TaskRec - public TaskState link; - - public Task(int i, int p, Value w, TaskState initialState, Value r) { - this.link = getTaskList(); - this.ident = i; - this.priority = p; - this.input = w; - - this.packet_pending = initialState.isPacketPending(); - this.task_waiting = initialState.isTaskWaiting(); - this.task_holding = initialState.isTaskHolding(); - - this.handle = r; - - setField(taskWorkArea, "taskList", this); - set(getField(taskWorkArea, "taskTab"), i, this); - } - - public abstract TaskState fn(Value pkt, Value r); - - public TaskState addPacket(Value p, Task old) { - if (isNone(this.input)) { - this.input = p; - this.packet_pending = true; - if (this.priority > old.priority) { - return this; - } - } else { - p.invokeMember("append_to", this.input); - } - return old; - } - - public TaskState runTask() { - Value msg = PyRichards.None; - if (this.isWaitingWithPacket()) { - msg = this.input; - this.input = getField(msg, "link"); - if (isNone(this.input)) { - this.running(); - } else { - this.packetPending(); - } - } - return this.fn(msg, this.handle); - } - - public TaskState waitTask() { - this.task_waiting = true; - return this; - } - - public TaskState hold() { - setField(taskWorkArea, "holdCount", getIntField(taskWorkArea, "holdCount") + 1); - this.task_holding = true; - return this.link; - } - - public TaskState release(int i) { - Task t = this.findtcb(i); - t.task_holding = false; - if (t.priority > this.priority) { - return t; - } else { - return this; - } - } - - public TaskState qpkt(Value pkt) { - Task t = this.findtcb(getIntField(pkt, "ident")); - setField(taskWorkArea, "qpktCount", getIntField(taskWorkArea, "qpktCount") + 1); - setField(pkt, "link", PyRichards.None); - setField(pkt, "ident", this.ident); - return t.addPacket(pkt, this); - } - - public Task findtcb(int id) { - Value t = get(getField(taskWorkArea, "taskTab"), id); - if (isNone(t)) { - throw new IllegalStateException(String.format("Bad task id %d", id)); - } - return t.asHostObject(); - } -} - -class DeviceTask extends Task { - public DeviceTask(int i, int p, Value w, TaskState s, Value r) { - super(i, p, w, s, r); - } - - @Override - public TaskState fn(Value pkt, Value r) { - Value d = r; // DeviceTaskRec - // assert isinstance(d, DeviceTaskRec) - if (isNone(pkt)) { - Value pkt2 = getField(d, "pending"); - if (isNone(pkt2)) { - return this.waitTask(); - } else { - setField(d, "pending", PyRichards.None); - return this.qpkt(pkt2); - } - } else { - setField(d, "pending", pkt); - if (tracing) { - trace(getIntField(pkt, "datum")); - } - return this.hold(); - } - } -} - -class HandlerTask extends Task { - public HandlerTask(int i, int p, Value w, TaskState s, Value r) { - super(i, p, w, s, r); - } - - @Override - public TaskState fn(Value pkt, Value r) { - Value h = r; - // assert isinstance(h, HandlerTaskRec) - if (!isNone(pkt)) { - if (getIntField(pkt, "kind") == K_WORK) { - h.invokeMember("workInAdd", pkt); - } else { - h.invokeMember("deviceInAdd", pkt); - } - } - Value work = getField(h, "work_in"); - if (isNone(work)) { - return this.waitTask(); - } - int count = getIntField(work, "datum"); - if (count >= BUFSIZE) { - setField(h, "work_in", getField(work, "link")); - return this.qpkt(work); - } - - Value dev = getField(h, "device_in"); - if (isNone(dev)) { - return this.waitTask(); - } - - setField(h, "device_in", getField(dev, "link")); - setField(dev, "datum", get(getField(work, "data"), count)); - setField(work, "datum", count + 1); - return this.qpkt(dev); - } -} - -class IdleTask extends Task { - @SuppressWarnings("unused") - public IdleTask(int i, int p, Value w, TaskState s, Value r) { - super(i, 0, PyRichards.None, s, r); - } - - @Override - public TaskState fn(Value pkt, Value r) { - Value i = r; - // assert isinstance(i, IdleTaskRec); - int count = getIntField(i, "count") - 1; - setField(i, "count", count); - if (count == 0) { - return this.hold(); - } else if ((getIntField(i, "control") & 1) == 0) { - setField(i, "control", getIntField(i, "control") / 2); - return this.release(I_DEVA); - } else { - setField(i, "control", getIntField(i, "control") / 2 ^ 0xd008); - return this.release(I_DEVB); - } - } -} - -class WorkTask extends Task { - public WorkTask(int i, int p, Value w, TaskState s, Value r) { - super(i, p, w, s, r); - } - - @Override - public TaskState fn(Value pkt, Value r) { - Value w = r; - // assert isinstance(w, WorkerTaskRec); - if (isNone(pkt)) { - return this.waitTask(); - } - int dest = I_HANDLERA; - if (getIntField(w, "destination") == I_HANDLERA) { - dest = I_HANDLERB; - } - - setField(w, "destination", dest); - setField(pkt, "ident", dest); - setField(pkt, "datum", 0); - - for (int i = 0; i < BUFSIZE; i++) { - int count = getIntField(w, "count") + 1; - setField(w, "count", count); - if (count > 26) { - setField(w, "count", 1); - } - // A = ord('A') - set(getField(pkt, "data"), i, 'A' + getIntField(w, "count") - 1); - } - return this.qpkt(pkt); - } - -} diff --git a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/jmh/ContextInitBenchmark.java b/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/jmh/ContextInitBenchmark.java new file mode 100644 index 0000000000..d6c0af5031 --- /dev/null +++ b/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/jmh/ContextInitBenchmark.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.benchmarks.jmh; + +import java.util.concurrent.TimeUnit; + +import org.graalvm.polyglot.Context; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.annotations.Warmup; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@Warmup(iterations = 5, time = 5) +@Measurement(iterations = 5, time = 5) +@State(Scope.Thread) +public class ContextInitBenchmark { + private Context context; + + @Setup(Level.Invocation) + public void setup() { + context = Context.newBuilder("python").option("engine.WarnInterpreterOnly", "false").build(); + } + + @TearDown(Level.Invocation) + public void tearDown() { + context.close(true); + context = null; + } + + @Benchmark + public void initCtx() { + context.initialize("python"); + } +} diff --git a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/jmh/ContextInitSharedEngineBenchmark.java b/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/jmh/ContextInitSharedEngineBenchmark.java new file mode 100644 index 0000000000..09e2225cbd --- /dev/null +++ b/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/jmh/ContextInitSharedEngineBenchmark.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.benchmarks.jmh; + +import java.util.concurrent.TimeUnit; + +import org.graalvm.polyglot.Context; +import org.graalvm.polyglot.Engine; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.annotations.Warmup; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@Warmup(iterations = 10, time = 5) +@Measurement(iterations = 5, time = 5) +@State(Scope.Thread) +public class ContextInitSharedEngineBenchmark { + private Engine engine; + private Context context; + + @Setup(Level.Trial) + public void setupEngine() { + engine = Engine.newBuilder().option("engine.WarnInterpreterOnly", "false").build(); + } + + @Setup(Level.Invocation) + public void setup() { + context = Context.newBuilder("python").engine(engine).build(); + } + + @TearDown(Level.Invocation) + public void tearDown() { + context.close(true); + context = null; + } + + @Benchmark + public void initCtx() { + context.initialize("python"); + } +} diff --git a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/jmh/HostInteropMicroBenchmarks.java b/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/jmh/HostInteropMicroBenchmarks.java new file mode 100644 index 0000000000..f015abc5ec --- /dev/null +++ b/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/jmh/HostInteropMicroBenchmarks.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.benchmarks.jmh; + +import java.util.concurrent.TimeUnit; +import java.util.stream.IntStream; + +import org.graalvm.polyglot.Context; +import org.graalvm.polyglot.HostAccess; +import org.graalvm.polyglot.Value; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.annotations.Warmup; + +/** + * Set of micro benchmarks exercising Python and Java interop. + */ +@State(Scope.Benchmark) +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@Warmup(iterations = 5, time = 5) +@Measurement(iterations = 5, time = 5) +public class HostInteropMicroBenchmarks { + private Context context; + private Value positionalArgsFun; + private Value object; + private MyType objectAsIface; + private Value sumFun; + + public interface MyType { + int foo(int a, int b); + } + + @Setup + public void setup() { + this.context = Context.newBuilder().allowHostAccess(HostAccess.ALL).build(); + this.positionalArgsFun = context.eval("python", "def pos_args_fun(a, b): return a + b\npos_args_fun"); + this.object = context.eval("python", """ + class MyType: + def foo(self, a, b): + return a + b + + MyType() + """); + this.objectAsIface = object.as(MyType.class); + this.sumFun = context.eval("python", """ + def my_sum(args): + r = 0 + for i in args: + r += i + return r + + my_sum + """); + } + + @TearDown + public void tearDown() { + context.close(true); + context = null; + } + + /** Just to avoid constant folding of the arguments to various operations */ + @State(Scope.Thread) + public static class Arguments { + public int num1 = 42; + public int num2 = 24; + } + + @State(Scope.Thread) + public static class IntArrayArgument { + public int[] data = IntStream.range(0, 1000).toArray(); + } + + @Benchmark + public Value callPythonPositionalArgs(Arguments args) { + return positionalArgsFun.execute(args.num1, args.num2); + } + + @Benchmark + public Value invokePythonMemberPositionalArgs(Arguments args) { + return object.invokeMember("foo", args.num1, args.num2); + } + + @Benchmark + public int ifaceInvokePythonMethodPositionalArgs(Arguments args) { + return objectAsIface.foo(args.num1, args.num2); + } + + @Benchmark + public Object sumJavaArrayInPython(IntArrayArgument arg) { + return sumFun.execute((Object) arg.data); + } +} diff --git a/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/jmh/PyEuler11Benchmark.java b/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/jmh/PyEuler11Benchmark.java new file mode 100644 index 0000000000..2935bd86d5 --- /dev/null +++ b/graalpython/com.oracle.graal.python.benchmarks/java/com/oracle/graal/python/benchmarks/jmh/PyEuler11Benchmark.java @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.benchmarks.jmh; + +import java.util.concurrent.TimeUnit; + +import org.graalvm.polyglot.Context; +import org.graalvm.polyglot.Value; +import org.graalvm.polyglot.io.IOAccess; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.annotations.Warmup; + +/** + * PyEuler11 benchmark rewritten as mix of Python and Java. Exercises following interop: function + * call with 2 positional primitive arguments, and array reads. + */ +@State(Scope.Benchmark) +@Warmup(iterations = 5, time = 5) +@Measurement(iterations = 5, time = 5) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@BenchmarkMode(Mode.AverageTime) +public class PyEuler11Benchmark { + private Context context; + private Value sub_list1; + private Value sub_list2; + private Value sub_list3; + private Value sub_list4; + private Value NUMS; + + @Setup + public void setup() { + this.context = Context.newBuilder().allowIO(IOAccess.ALL).build(); + this.sub_list1 = this.context.eval("python", "def sub_list1(nums, row, col): return list(nums[i][col] for i in range(row, row+4))\nsub_list1"); + this.sub_list2 = this.context.eval("python", "def sub_list2(nums, row, col): return list(nums[row][i] for i in range(col, col+4))\nsub_list2"); + this.sub_list3 = this.context.eval("python", "def sub_list3(nums, row, col): return list(nums[row+i][col+i] for i in range(0, 4))\nsub_list3"); + this.sub_list4 = this.context.eval("python", "def sub_list4(nums, row, col): return list(nums[row+i][col-i] for i in range(0, 4))\nsub_list4"); + this.NUMS = this.context.eval("python", "[\n" + + "[ 8, 2,22,97,38,15, 0,40, 0,75, 4, 5, 7,78,52,12,50,77,91, 8,],\n" + + "[49,49,99,40,17,81,18,57,60,87,17,40,98,43,69,48, 4,56,62, 0,],\n" + + "[81,49,31,73,55,79,14,29,93,71,40,67,53,88,30, 3,49,13,36,65,],\n" + + "[52,70,95,23, 4,60,11,42,69,24,68,56, 1,32,56,71,37, 2,36,91,],\n" + + "[22,31,16,71,51,67,63,89,41,92,36,54,22,40,40,28,66,33,13,80,],\n" + + "[24,47,32,60,99, 3,45, 2,44,75,33,53,78,36,84,20,35,17,12,50,],\n" + + "[32,98,81,28,64,23,67,10,26,38,40,67,59,54,70,66,18,38,64,70,],\n" + + "[67,26,20,68, 2,62,12,20,95,63,94,39,63, 8,40,91,66,49,94,21,],\n" + + "[24,55,58, 5,66,73,99,26,97,17,78,78,96,83,14,88,34,89,63,72,],\n" + + "[21,36,23, 9,75, 0,76,44,20,45,35,14, 0,61,33,97,34,31,33,95,],\n" + + "[78,17,53,28,22,75,31,67,15,94, 3,80, 4,62,16,14, 9,53,56,92,],\n" + + "[16,39, 5,42,96,35,31,47,55,58,88,24, 0,17,54,24,36,29,85,57,],\n" + + "[86,56, 0,48,35,71,89, 7, 5,44,44,37,44,60,21,58,51,54,17,58,],\n" + + "[19,80,81,68, 5,94,47,69,28,73,92,13,86,52,17,77, 4,89,55,40,],\n" + + "[ 4,52, 8,83,97,35,99,16, 7,97,57,32,16,26,26,79,33,27,98,66,],\n" + + "[88,36,68,87,57,62,20,72, 3,46,33,67,46,55,12,32,63,93,53,69,],\n" + + "[ 4,42,16,73,38,25,39,11,24,94,72,18, 8,46,29,32,40,62,76,36,],\n" + + "[20,69,36,41,72,30,23,88,34,62,99,69,82,67,59,85,74, 4,36,16,],\n" + + "[20,73,35,29,78,31,90, 1,74,31,49,71,48,86,81,16,23,57, 5,54,],\n" + + "[ 1,70,54,71,83,51,54,69,16,92,33,48,61,43,52, 1,89,19,67,48,],\n" + + "[ 1,70,54,71,83,51,54,69,16,92,33,48,61,43,52, 1,89,19,67,48,],\n" + + "[ 4,42,16,73,38,25,39,11,24,94,72,18, 8,46,29,32,40,62,76,36,],\n" + + "[32,98,81,28,64,23,67,10,26,38,40,67,59,54,70,66,18,38,64,70,],\n" + + "[32,98,81,28,64,23,67,10,26,38,40,67,59,54,70,66,18,38,64,70,],\n" + + "[22,31,16,71,51,67,63,89,41,92,36,54,22,40,40,28,66,33,13,80,],\n" + + "[20,69,36,41,72,30,23,88,34,62,99,69,82,67,59,85,74, 4,36,16,],\n" + + "[52,70,95,23, 4,60,11,42,69,24,68,56, 1,32,56,71,37, 2,36,91,],\n" + + "[22,31,16,71,51,67,63,89,41,92,36,54,22,40,40,28,66,33,13,80,],\n" + + "[ 4,42,16,73,38,25,39,11,24,94,72,18, 8,46,29,32,40,62,76,36,],\n" + + "[88,36,68,87,57,62,20,72, 3,46,33,67,46,55,12,32,63,93,53,69,],\n" + + "[20,69,36,41,72,30,23,88,34,62,99,69,82,67,59,85,74, 4,36,16,],\n" + + "[78,17,53,28,22,75,31,67,15,94, 3,80, 4,62,16,14, 9,53,56,92,],\n" + + "[ 4,52, 8,83,97,35,99,16, 7,97,57,32,16,26,26,79,33,27,98,66,],\n" + + "[52,70,95,23, 4,60,11,42,69,24,68,56, 1,32,56,71,37, 2,36,91,],\n" + + "[ 4,42,16,73,38,25,39,11,24,94,72,18, 8,46,29,32,40,62,76,36,],\n" + + "[88,36,68,87,57,62,20,72, 3,46,33,67,46,55,12,32,63,93,53,69,],\n" + + "[78,17,53,28,22,75,31,67,15,94, 3,80, 4,62,16,14, 9,53,56,92,],\n" + + "]"); + } + + @TearDown + public void tearDown() { + context.close(true); + context = null; + } + + @Benchmark + public int euler11() { + return solve(); + } + + private int solve() { + int max = Integer.MIN_VALUE; + long size1 = NUMS.getArraySize(); + long size2 = NUMS.getArrayElement(0).getArraySize(); + for (int row = 0; row < size1; row++) { + for (int col = 0; col < size2; col++) { + if (row + 4 <= size1) { + max = Math.max(max, product(call(sub_list1, row, col))); + } + if (col + 4 <= size2) { + max = Math.max(max, product(call(sub_list2, row, col))); + } + if (row + 4 <= size1 && col + 4 <= size2) { + max = Math.max(max, product(call(sub_list3, row, col))); + } + if (row + 4 <= size1 && col >= 3) { + max = Math.max(max, product(call(sub_list4, row, col))); + } + } + } + return max; + } + + private static int product(Value seq) { + int n = 1; + for (int i = 0; i < seq.getArraySize(); i++) { + n *= seq.getArrayElement(i).asInt(); + } + return n; + } + + private Value call(Value func, int row, int col) { + return func.execute(NUMS, row, col); + } +} diff --git a/graalpython/com.oracle.graal.python.benchmarks/python/harness.py b/graalpython/com.oracle.graal.python.benchmarks/python/harness.py index 5e5a6b6645..2de6bbdcbc 100644 --- a/graalpython/com.oracle.graal.python.benchmarks/python/harness.py +++ b/graalpython/com.oracle.graal.python.benchmarks/python/harness.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -267,12 +267,13 @@ def __init__(self, bench_file, bench_args=None, iterations=1, warmup=-1, warmup_ @staticmethod def get_bench_module(bench_file): - name = bench_file.rpartition("/")[2].partition(".")[0].replace('.py', '') - directory = bench_file.rpartition("/")[0] + name = bench_file.rpartition(os.sep)[2].partition(".")[0].replace('.py', '') + directory = bench_file.rpartition(os.sep)[0] pkg = [] - while any(f.endswith("__init__.py") for f in os.listdir(directory)): - directory, slash, postfix = directory.rpartition("/") - pkg.insert(0, postfix) + if directory: + while any(f.endswith("__init__.py") for f in os.listdir(directory)): + directory, slash, postfix = directory.rpartition("/") + pkg.insert(0, postfix) if pkg: sys.path.insert(0, directory) @@ -501,6 +502,9 @@ def run_benchmark(args): else: print("### no extra module search paths specified") + if GRAALPYTHON: + print(f"### using bytecode DSL interpreter: {__graalpython__.is_bytecode_dsl_interpreter}") + BenchRunner(bench_file, bench_args=bench_args, iterations=iterations, warmup=warmup, warmup_runs=warmup_runs, startup=startup, live_results=live_results).run() diff --git a/graalpython/com.oracle.graal.python.benchmarks/python/heap/allocate-objects.py b/graalpython/com.oracle.graal.python.benchmarks/python/heap/allocate-objects.py new file mode 100644 index 0000000000..64eb36ed03 --- /dev/null +++ b/graalpython/com.oracle.graal.python.benchmarks/python/heap/allocate-objects.py @@ -0,0 +1,51 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# The Universal Permissive License (UPL), Version 1.0 +# +# Subject to the condition set forth below, permission is hereby granted to any +# person obtaining a copy of this software, associated documentation and/or +# data (collectively the "Software"), free of charge and under any and all +# copyright rights in the Software, and any and all patent rights owned or +# freely licensable by each licensor hereunder covering either (i) the +# unmodified Software as contributed to or provided by such licensor, or (ii) +# the Larger Works (as defined below), to deal in both +# +# (a) the Software, and +# +# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +# one is included with the Software each a "Larger Work" to which the Software +# is contributed by such licensors), +# +# without restriction, including without limitation the rights to copy, create +# derivative works of, display, perform, and distribute the Software and make, +# use, sell, offer for sale, import, export, have made, and have sold the +# Software and the Larger Work(s), and to sublicense the foregoing rights on +# either these or other terms. +# +# This license is subject to the following condition: +# +# The above copyright notice and either this complete permission notice or at a +# minimum a reference to the UPL must be included in all copies or substantial +# portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import time + +class MyObject: + def __init__(self, name, value): + self.name = name + self.value = value + +objects = [MyObject("foo", 42) for i in range(10 ** 6)] + +# Sleep a bit to shake out weakref callbacks and get more measurement samples +for i in range(30): + time.sleep(0.1) diff --git a/graalpython/com.oracle.graal.python.benchmarks/python/heap/import-a-lot.py b/graalpython/com.oracle.graal.python.benchmarks/python/heap/import-a-lot.py new file mode 100644 index 0000000000..e609712a8c --- /dev/null +++ b/graalpython/com.oracle.graal.python.benchmarks/python/heap/import-a-lot.py @@ -0,0 +1,72 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# The Universal Permissive License (UPL), Version 1.0 +# +# Subject to the condition set forth below, permission is hereby granted to any +# person obtaining a copy of this software, associated documentation and/or +# data (collectively the "Software"), free of charge and under any and all +# copyright rights in the Software, and any and all patent rights owned or +# freely licensable by each licensor hereunder covering either (i) the +# unmodified Software as contributed to or provided by such licensor, or (ii) +# the Larger Works (as defined below), to deal in both +# +# (a) the Software, and +# +# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +# one is included with the Software each a "Larger Work" to which the Software +# is contributed by such licensors), +# +# without restriction, including without limitation the rights to copy, create +# derivative works of, display, perform, and distribute the Software and make, +# use, sell, offer for sale, import, export, have made, and have sold the +# Software and the Larger Work(s), and to sublicense the foregoing rights on +# either these or other terms. +# +# This license is subject to the following condition: +# +# The above copyright notice and either this complete permission notice or at a +# minimum a reference to the UPL must be included in all copies or substantial +# portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +# Measure the heap after importing many modules +import time +import urllib.request, urllib.parse +import pickle +import os +import xmlrpc +import json +import email +import multiprocessing +import re +import concurrent.futures +import collections +import inspect +import hashlib +import decimal +import fractions +import unittest +import contextlib +import configparser +import tomllib +import argparse +import subprocess +import sys + +# We log the bytecode DSL flag only in this benchamark, because we do not want to influence +# the other benchmarks by importing the sys module. Other benchmarks will print a warning +# that bytecode DSL flag could not be verified +if getattr(getattr(sys, "implementation", None), "name", None) == "graalpy": + print(f"### using bytecode DSL interpreter: {__graalpython__.is_bytecode_dsl_interpreter}") + +# Sleep a bit to shake out weakref callbacks and get more measurement samples +for i in range(30): + time.sleep(0.1) diff --git a/graalpython/com.oracle.graal.python.benchmarks/python/heap/post-startup.py b/graalpython/com.oracle.graal.python.benchmarks/python/heap/post-startup.py new file mode 100644 index 0000000000..109dace077 --- /dev/null +++ b/graalpython/com.oracle.graal.python.benchmarks/python/heap/post-startup.py @@ -0,0 +1,45 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# The Universal Permissive License (UPL), Version 1.0 +# +# Subject to the condition set forth below, permission is hereby granted to any +# person obtaining a copy of this software, associated documentation and/or +# data (collectively the "Software"), free of charge and under any and all +# copyright rights in the Software, and any and all patent rights owned or +# freely licensable by each licensor hereunder covering either (i) the +# unmodified Software as contributed to or provided by such licensor, or (ii) +# the Larger Works (as defined below), to deal in both +# +# (a) the Software, and +# +# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +# one is included with the Software each a "Larger Work" to which the Software +# is contributed by such licensors), +# +# without restriction, including without limitation the rights to copy, create +# derivative works of, display, perform, and distribute the Software and make, +# use, sell, offer for sale, import, export, have made, and have sold the +# Software and the Larger Work(s), and to sublicense the foregoing rights on +# either these or other terms. +# +# This license is subject to the following condition: +# +# The above copyright notice and either this complete permission notice or at a +# minimum a reference to the UPL must be included in all copies or substantial +# portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +# Measure the heap after startup +import time + +# Sleep a bit to shake out weakref callbacks and get more measurement samples +for i in range(30): + time.sleep(0.1) diff --git a/graalpython/com.oracle.graal.python.benchmarks/python/host_interop/java-register.py b/graalpython/com.oracle.graal.python.benchmarks/python/host_interop/java-register.py new file mode 100644 index 0000000000..700cb0eb2a --- /dev/null +++ b/graalpython/com.oracle.graal.python.benchmarks/python/host_interop/java-register.py @@ -0,0 +1,84 @@ +# Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# The Universal Permissive License (UPL), Version 1.0 +# +# Subject to the condition set forth below, permission is hereby granted to any +# person obtaining a copy of this software, associated documentation and/or +# data (collectively the "Software"), free of charge and under any and all +# copyright rights in the Software, and any and all patent rights owned or +# freely licensable by each licensor hereunder covering either (i) the +# unmodified Software as contributed to or provided by such licensor, or (ii) +# the Larger Works (as defined below), to deal in both +# +# (a) the Software, and +# +# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +# one is included with the Software each a "Larger Work" to which the Software +# is contributed by such licensors), +# +# without restriction, including without limitation the rights to copy, create +# derivative works of, display, perform, and distribute the Software and make, +# use, sell, offer for sale, import, export, have made, and have sold the +# Software and the Larger Work(s), and to sublicense the foregoing rights on +# either these or other terms. +# +# This license is subject to the following condition: +# +# The above copyright notice and either this complete permission notice or at a +# minimum a reference to the UPL must be included in all copies or substantial +# portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +# This benchmark hits the GetRegisteredClassNodes as much as possible with one registration + +import polyglot +import sys +from java.util import List, ArrayList + +@polyglot.interop_type(List) +class JList: + def append(self, value): + self.add(value) + + def __getitem__(self, item): + return self.get(item) + + def get_value(self): + sum = 0 + for i in range(self.length()): + sum += self[i] + return sum + + def length(self): + return self.size() + + +# igv: function_root_create_list_at +def create_list(num: int, l: JList): + for i in range(num): + l.append(ArrayList()) + for j in range(i): + l[i].append(j) + + for i in range(num): + li = l[i] + assert li.length() * (li.length() - 1) / 2 == li.get_value() + +def measure(num): + j_list = ArrayList() + create_list(num, j_list) + +def __benchmark__(num=2_000): + measure(num) + +if __name__ == '__main__': + __benchmark__(int(sys.argv[1])) diff --git a/graalpython/com.oracle.graal.python.benchmarks/python/micro/class-access.py b/graalpython/com.oracle.graal.python.benchmarks/python/micro/class-access.py deleted file mode 100644 index 726ec34aa0..0000000000 --- a/graalpython/com.oracle.graal.python.benchmarks/python/micro/class-access.py +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# The Universal Permissive License (UPL), Version 1.0 -# -# Subject to the condition set forth below, permission is hereby granted to any -# person obtaining a copy of this software, associated documentation and/or -# data (collectively the "Software"), free of charge and under any and all -# copyright rights in the Software, and any and all patent rights owned or -# freely licensable by each licensor hereunder covering either (i) the -# unmodified Software as contributed to or provided by such licensor, or (ii) -# the Larger Works (as defined below), to deal in both -# -# (a) the Software, and -# -# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if -# one is included with the Software each a "Larger Work" to which the Software -# is contributed by such licensors), -# -# without restriction, including without limitation the rights to copy, create -# derivative works of, display, perform, and distribute the Software and make, -# use, sell, offer for sale, import, export, have made, and have sold the -# Software and the Larger Work(s), and to sublicense the foregoing rights on -# either these or other terms. -# -# This license is subject to the following condition: -# -# The above copyright notice and either this complete permission notice or at a -# minimum a reference to the UPL must be included in all copies or substantial -# portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -class Foo(object): - pass - - -class Bar(Foo): - pass - - -def do_stuff(foo, bar, baz): - for i in range(50000): - type(foo) - type(bar) - type(baz) - - return type(foo), type(bar), type(baz) - - -def measure(num): - for i in range(num): - if i % 3 == 0: - result = do_stuff(Foo(), Bar(), {}) - elif i % 3 == 1: - result = do_stuff(Bar(), Foo(), {}) - else: - result = do_stuff({}, Foo(), Bar()) - - return result - - -def __benchmark__(num=5000): - return measure(num) diff --git a/graalpython/com.oracle.graal.python.cext/CAPIFunctions.txt b/graalpython/com.oracle.graal.python.cext/CAPIFunctions.txt index c44c9eb909..4f6b8f9f87 100644 --- a/graalpython/com.oracle.graal.python.cext/CAPIFunctions.txt +++ b/graalpython/com.oracle.graal.python.cext/CAPIFunctions.txt @@ -356,6 +356,14 @@ PyMapping_Length;Py_ssize_t;PyObject* PyMapping_SetItemString;int;PyObject*|const char*|PyObject* PyMapping_Size;Py_ssize_t;PyObject* PyMapping_Values;PyObject*;PyObject* +PyMarshal_ReadLastObjectFromFile;PyObject*;FILE* +PyMarshal_ReadLongFromFile;long;FILE* +PyMarshal_ReadObjectFromFile;PyObject*;FILE* +PyMarshal_ReadObjectFromString;PyObject*;const char*|Py_ssize_t +PyMarshal_ReadShortFromFile;int;FILE* +PyMarshal_WriteLongToFile;void;long|FILE*|int +PyMarshal_WriteObjectToFile;void;PyObject*|FILE*|int +PyMarshal_WriteObjectToString;PyObject*;PyObject*|int PyMem_Calloc;void*;size_t|size_t PyMem_Free;void;void* PyMem_GetAllocator;void;PyMemAllocatorDomain|PyMemAllocatorEx* diff --git a/graalpython/com.oracle.graal.python.cext/CEXT-WINDOWS-README.md b/graalpython/com.oracle.graal.python.cext/CEXT-WINDOWS-README.md deleted file mode 100644 index 26fb62009f..0000000000 --- a/graalpython/com.oracle.graal.python.cext/CEXT-WINDOWS-README.md +++ /dev/null @@ -1 +0,0 @@ -C extensions on Windows not supported yet diff --git a/graalpython/com.oracle.graal.python.cext/CMakeLists.txt b/graalpython/com.oracle.graal.python.cext/CMakeLists.txt index 35f12a4a36..dafc8d0f1f 100644 --- a/graalpython/com.oracle.graal.python.cext/CMakeLists.txt +++ b/graalpython/com.oracle.graal.python.cext/CMakeLists.txt @@ -1,5 +1,5 @@ # -# Copyright (c) 2023, Oracle and/or its affiliates. +# Copyright (c) 2023, 2025, Oracle and/or its affiliates. # # All rights reserved. # @@ -37,55 +37,83 @@ endfunction() set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -if(MSVC) - message(FATAL_ERROR "C API cannot be built with MSVC") -endif() - -if(WIN32) - require_var(GRAALVM_LLVM_LIB_DIR) - endif() +require_var(GRAALPY_PARENT_DIR) require_var(CAPI_INC_DIR) -require_var(TRUFFLE_H_INC) +require_var(PYCONFIG_INCLUDE_DIR) require_var(TRUFFLE_NFI_H_INC) -require_var(LLVM_MODE) require_var(GRAALPY_EXT) if(NOT DEFINED SRC_DIR) set(SRC_DIR "${CMAKE_SOURCE_DIR}") endif() -set(TARGET_LIBPYTHON "python-${LLVM_MODE}") +set(TARGET_LIBPYTHON "python-native") ###################################################################### # common variables and compile/link options (for all build targets) ###################################################################### -set(CFLAGS_WARNINGS -Wall -Werror -Wno-unused-function -Wno-unused-variable -Wno-unused-const-variable +if (MSVC) + SET(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "" FORCE) + SET(CFLAGS_WARNINGS /Wall /WX + # Many warnings that are just MSVC being a bit pedantic + /wd4255 # no function prototype given: converting '()' to '(void)' + /wd4820 # padding added after data member + /wd4100 # unreferenced formal parameter + /wd4200 # nonstandard extension used: zero-sized array in struct/union + /wd4996 # This function or variable may be unsafe ... see _CRT_SECURE_NO_WARNINGS + /wd4668 # ... is not defined as a preprocessor macro, replacing with '0' for '#if/#elif' + /wd4115 # named type definition in parentheses + /wd4152 # nonstandard extension, function/data pointer conversion in expression + /wd5045 # Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified + /wd4047 # 'int64_t' differs in levels of indirection from 'char []' / 'void *' + /wd4242 # conversion from 'int' to 'char', possible loss of data + /wd4244 # conversion from 'long' to 'char', possible loss of data + /wd4267 # conversion from 'size_t' to 'int', possible loss of data + /wd4127 # conditional expression is constant + /wd4702 # unreachable code + /wd4101 # unreferenced local variable + /wd4456 # declaration hides previous local declaration + /wd4459 # declaration hides global declaration + /wd4061 # enumerator X in switch of enum Y is not explicitly handled by a case label + /wd4464 # relative include path contains '..' + /wd4710 # 'fprintf': function not inlined + /wd4706 # assignment within conditional expression + + # Some that I'm not so happy about + /wd4232 # sre: nonstandard extension used: 'ml_meth': address of dllimport 'Py_GenericAlias' is not static, identity not guaranteed + /wd4191 # sre and sqlite: 'type cast': like unsafe conversion from 'PyObject *(__cdecl *)(MatchObject *,PyObject *const *,Py_ssize_t)' to 'void (__cdecl *)(void)' + /wd4918 # sre: invalid character in pragma optimization list + /wd4701 # cpython_unicodedata: potentially uninitialized local variable 'rc' used + /wd4574 # sqlite: 'SQLITE_ATOMIC_INTRINSICS' is defined to be '0': did you mean to use '#if SQLITE_ATOMIC_INTRINSICS'? + /wd4310 # xmlparse: cast truncates constant value + ) +else() + set(CFLAGS_WARNINGS -Wall -Werror -Wno-unused-function -Wno-unused-variable -Wno-unused-const-variable + -Wno-unknown-warning-option + -Wno-discarded-qualifiers # _testbuffer.c -Wno-tautological-constant-out-of-range-compare # fileutils.c: wchar_t > MAX_UNICODE is always false on Windows -Wno-unused-but-set-variable # sqlite.c: BOOL bRc -Wno-ignored-pragmas # sre.c: #pragma optimize("agtw", on) -Wno-int-to-pointer-cast -Wno-int-conversion -Wno-void-pointer-to-int-cast - -Wno-incompatible-pointer-types-discards-qualifiers -Wno-pointer-type-mismatch + -Wno-incompatible-pointer-types-discards-qualifiers -Wno-braced-scalar-init -Wno-deprecated-declarations) + add_compile_options(-ffile-prefix-map=${GRAALPY_PARENT_DIR}=.) +endif() + # preprocessor defines for all platforms add_compile_definitions( NDEBUG - GRAALVM_PYTHON_LLVM ) -if(${LLVM_MODE} STREQUAL "native") - add_compile_definitions(GRAALVM_PYTHON_LLVM_NATIVE) -else() - add_compile_definitions(GRAALVM_PYTHON_LLVM_MANAGED) -endif() - if(WIN32) add_compile_definitions( MS_WINDOWS Py_ENABLE_SHARED HAVE_DECLSPEC_DLL + ) endif() @@ -117,7 +145,7 @@ set(SRC_FILES ${CAPI_SRC}/codecs.c ${CAPI_SRC}/setobject.c ${CAPI_SRC}/compile.c ${CAPI_SRC}/fileobject.c ${CAPI_SRC}/pystrcmp.c ${CAPI_SRC}/getversion.c ${CAPI_SRC}/genobject.c ${CAPI_SRC}/methodobject.c ${CAPI_SRC}/boolobject.c ${CAPI_SRC}/pylifecycle.c ${CAPI_SRC}/errors.c ${CAPI_SRC}/signals.c ${CAPI_SRC}/datetime.c ${CAPI_SRC}/call.c - ${CAPI_SRC}/getargs.c + ${CAPI_SRC}/getargs.c ${CAPI_SRC}/tracemalloc.c ) file(GLOB_RECURSE ACTUAL_SRC_FILES @@ -154,7 +182,7 @@ include_directories( ${CAPI_SRC} "${SRC_DIR}/include" "${CAPI_INC_DIR}" - "${TRUFFLE_H_INC}" + "${PYCONFIG_INCLUDE_DIR}" "${TRUFFLE_NFI_H_INC}" ) @@ -225,28 +253,28 @@ if(NOT WIN32) # variable 'TARGET_LIBBZ2' is defined in file 'LIBBZ2_BUILD_FILE' target_link_libraries(${TARGET_BZ2} ${TARGET_LIBBZ2}) endif() - - - ###################### PYEXPAT ###################### - set(TARGET_PYEXPAT "pyexpat") - simple_native_module(${TARGET_PYEXPAT}) - set(EXPAT_SRC "${SRC_DIR}/expat") - set(PYEXPAT_HEADERS - ${EXPAT_SRC}/ascii.h ${EXPAT_SRC}/asciitab.h ${EXPAT_SRC}/expat.h ${EXPAT_SRC}/expat_config.h - ${EXPAT_SRC}/expat_external.h ${EXPAT_SRC}/internal.h ${EXPAT_SRC}/latin1tab.h ${EXPAT_SRC}/utf8tab.h - ${EXPAT_SRC}/xmlrole.h ${EXPAT_SRC}/xmltok.h ${EXPAT_SRC}/xmltok_impl.h - ) - target_sources(${TARGET_PYEXPAT} PRIVATE ${PYEXPAT_HEADERS}) - target_sources(${TARGET_PYEXPAT} PRIVATE ${EXPAT_SRC}/xmlparse.c ${EXPAT_SRC}/xmlrole.c ${EXPAT_SRC}/xmltok.c) - target_include_directories(${TARGET_PYEXPAT} PRIVATE ${EXPAT_SRC}) - # bpo-30947: Python uses best available entropy sources to call XML_SetHashSalt(), - # expat entropy sources are not needed - target_compile_definitions(${TARGET_PYEXPAT} PRIVATE - HAVE_EXPAT_CONFIG_H=1 - XML_POOR_ENTROPY=1 - ) endif() +###################### PYEXPAT ###################### +set(TARGET_PYEXPAT "pyexpat") +simple_native_module(${TARGET_PYEXPAT}) +set(EXPAT_SRC "${SRC_DIR}/expat") +set(PYEXPAT_HEADERS + ${EXPAT_SRC}/ascii.h ${EXPAT_SRC}/asciitab.h ${EXPAT_SRC}/expat.h ${EXPAT_SRC}/expat_config.h + ${EXPAT_SRC}/expat_external.h ${EXPAT_SRC}/internal.h ${EXPAT_SRC}/latin1tab.h ${EXPAT_SRC}/utf8tab.h + ${EXPAT_SRC}/xmlrole.h ${EXPAT_SRC}/xmltok.h ${EXPAT_SRC}/xmltok_impl.h +) +target_sources(${TARGET_PYEXPAT} PRIVATE ${PYEXPAT_HEADERS}) +target_sources(${TARGET_PYEXPAT} PRIVATE ${EXPAT_SRC}/xmlparse.c ${EXPAT_SRC}/xmlrole.c ${EXPAT_SRC}/xmltok.c) +target_include_directories(${TARGET_PYEXPAT} PRIVATE ${EXPAT_SRC}) +# bpo-30947: Python uses best available entropy sources to call XML_SetHashSalt(), +# expat entropy sources are not needed +target_compile_definitions(${TARGET_PYEXPAT} PRIVATE + HAVE_EXPAT_CONFIG_H=1 + XML_POOR_ENTROPY=1 + XML_DTD=1 +) + target_sources(${TARGET_LIBPYTHON} PRIVATE ${SRC_FILES}) target_include_directories(${TARGET_LIBPYTHON} PRIVATE "${SRC_DIR}/include/internal" @@ -260,9 +288,9 @@ target_compile_definitions(${TARGET_LIBPYTHON} PRIVATE Py_BUILD_CORE Py_BUILD_CO target_compile_options(${TARGET_LIBPYTHON} PRIVATE ${CFLAGS_WARNINGS}) if(WIN32) - target_link_directories(${TARGET_LIBPYTHON} PRIVATE ${GRAALVM_LLVM_LIB_DIR}) - target_compile_options(${TARGET_LIBPYTHON} PRIVATE "-fmsc-version=1920") - target_link_libraries(${TARGET_LIBPYTHON} sulong-native graalvm-llvm) + if (NOT MSVC) + target_compile_options(${TARGET_LIBPYTHON} PRIVATE "-fmsc-version=1920") + endif() else() # Link to math library; required for functions like 'hypot' or similar target_link_libraries(${TARGET_LIBPYTHON} m) diff --git a/graalpython/com.oracle.graal.python.cext/expat/winconfig.h b/graalpython/com.oracle.graal.python.cext/expat/winconfig.h new file mode 100644 index 0000000000..f3e6a9c06c --- /dev/null +++ b/graalpython/com.oracle.graal.python.cext/expat/winconfig.h @@ -0,0 +1,47 @@ +/* + __ __ _ + ___\ \/ /_ __ __ _| |_ + / _ \\ /| '_ \ / _` | __| + | __// \| |_) | (_| | |_ + \___/_/\_\ .__/ \__,_|\__| + |_| XML parser + + Copyright (c) 2000 Clark Cooper + Copyright (c) 2002 Greg Stein + Copyright (c) 2005 Karl Waclawek + Copyright (c) 2017-2021 Sebastian Pipping + Licensed under the MIT license: + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to permit + persons to whom the Software is furnished to do so, subject to the + following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifndef WINCONFIG_H +#define WINCONFIG_H + +#define WIN32_LEAN_AND_MEAN +#include +#undef WIN32_LEAN_AND_MEAN + +#include +#include + +#include "expat_config.h" + +#endif /* ndef WINCONFIG_H */ diff --git a/graalpython/com.oracle.graal.python.cext/include/Python.h b/graalpython/com.oracle.graal.python.cext/include/Python.h index a210ccb897..85b223eefb 100644 --- a/graalpython/com.oracle.graal.python.cext/include/Python.h +++ b/graalpython/com.oracle.graal.python.cext/include/Python.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2022, 2023, Oracle and/or its affiliates. +/* Copyright (c) 2022, 2024, Oracle and/or its affiliates. * Copyright (C) 1996-2022 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -64,6 +64,7 @@ struct timeval; #include "boolobject.h" #include "floatobject.h" #include "complexobject.h" +#include "rangeobject.h" #include "memoryobject.h" #include "tupleobject.h" #include "listobject.h" diff --git a/graalpython/com.oracle.graal.python.cext/include/cpython/object.h b/graalpython/com.oracle.graal.python.cext/include/cpython/object.h index e629422578..32e4813b27 100644 --- a/graalpython/com.oracle.graal.python.cext/include/cpython/object.h +++ b/graalpython/com.oracle.graal.python.cext/include/cpython/object.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2020, 2023, Oracle and/or its affiliates. +/* Copyright (c) 2020, 2024, Oracle and/or its affiliates. * Copyright (C) 1996-2020 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -42,8 +42,8 @@ PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void); typedef struct _Py_Identifier { const char* string; /* XXX Truffle change: CPython migrated away from keeping the pointer directly - * in the struct to support subinterpreters. We don't have subinterpreters, so - * we keep the object pointer for now */ + * in the struct to support subinterpreters. We do subinterpreters differently, + * so we keep the object pointer for now */ PyObject *object; } _Py_Identifier; diff --git a/graalpython/com.oracle.graal.python.cext/include/cpython/pystate.h b/graalpython/com.oracle.graal.python.cext/include/cpython/pystate.h index fc62587852..f45aa75b13 100644 --- a/graalpython/com.oracle.graal.python.cext/include/cpython/pystate.h +++ b/graalpython/com.oracle.graal.python.cext/include/cpython/pystate.h @@ -206,12 +206,16 @@ struct _ts { /* The bottom-most frame on the stack. */ _PyCFrame root_cframe; - /* GraalVM change: We add field 'small_ints' which roughly corresponds to + /* GraalPy change: We add field 'small_ints' which roughly corresponds to field '_PyRuntimeState._Py_global_objects.small_ints'. We do so because we maintain the runtime state in Java objects and don't want to allocate the large structures and arrays where for us, most fields will be zero. */ PyObject **small_ints; + + /* GraalPy change: We add field 'gc' which corresponds to field + '&interp->gc'. */ + struct _gc_runtime_state *gc; }; diff --git a/graalpython/com.oracle.graal.python.cext/include/cpython/tupleobject.h b/graalpython/com.oracle.graal.python.cext/include/cpython/tupleobject.h index ef3d3c3790..e5d9ea8436 100644 --- a/graalpython/com.oracle.graal.python.cext/include/cpython/tupleobject.h +++ b/graalpython/com.oracle.graal.python.cext/include/cpython/tupleobject.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2020, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2020, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2020 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -39,14 +39,9 @@ PyAPI_FUNC(PyObject *) _PyTuple_GET_ITEM(PyObject *, Py_ssize_t); // GraalPy-specific PyAPI_FUNC(PyObject **) PyTruffleTuple_GetItems(PyObject *op); -/* Function *only* to be used to fill in brand new tuples */ -static inline void -PyTuple_SET_ITEM(PyObject *op, Py_ssize_t index, PyObject *value) { - PyTruffleTuple_GetItems(op)[index] = value; -} -#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000 +// GraalPy change: Export PyTuple_SET_ITEM as regular API function to use in PyO3 and others +PyAPI_FUNC(void) PyTuple_SET_ITEM(PyObject*, Py_ssize_t, PyObject*); #define PyTuple_SET_ITEM(op, index, value) \ - PyTuple_SET_ITEM(_PyObject_CAST(op), index, _PyObject_CAST(value)) -#endif + PyTuple_SET_ITEM(_PyObject_CAST(op), (index), _PyObject_CAST(value)) PyAPI_FUNC(void) _PyTuple_DebugMallocStats(FILE *out); diff --git a/graalpython/com.oracle.graal.python.cext/include/graalpy/handles.h b/graalpython/com.oracle.graal.python.cext/include/graalpy/handles.h index a0edc4302c..dde27b887a 100644 --- a/graalpython/com.oracle.graal.python.cext/include/graalpy/handles.h +++ b/graalpython/com.oracle.graal.python.cext/include/graalpy/handles.h @@ -48,20 +48,8 @@ #define HANDLE_BASE 0x8000000000000000ULL #define IMMORTAL_REFCNT (INT64_MAX >> 1) -#ifdef GRAALVM_PYTHON_LLVM_MANAGED -/* - * We can't include sulong headers here, they include stdbool.h and CPython has a test that - * Python.h won't pull in stdbool.h - */ -PyAPI_FUNC(int) points_to_py_handle_space(void* ptr); -#define stub_to_pointer(STUB_PTR) (STUB_PTR) -#define pointer_to_stub(O) (O) -#else /* GRAALVM_PYTHON_LLVM_MANAGED */ - #define points_to_py_handle_space(PTR) ((((uintptr_t) (PTR)) & HANDLE_BASE) != 0) #define stub_to_pointer(STUB_PTR) (((uintptr_t) (STUB_PTR)) | HANDLE_BASE) #define pointer_to_stub(PTR) ((PyObject *)(((uintptr_t) (PTR)) & ~HANDLE_BASE)) -#endif /* GRAALVM_PYTHON_LLVM_MANAGED */ - #endif /* SRC_HANDLES_H_ */ diff --git a/graalpython/com.oracle.graal.python.cext/include/internal/pycore_gc.h b/graalpython/com.oracle.graal.python.cext/include/internal/pycore_gc.h index 2a0a0cd6ef..ef2771a7a7 100644 --- a/graalpython/com.oracle.graal.python.cext/include/internal/pycore_gc.h +++ b/graalpython/com.oracle.graal.python.cext/include/internal/pycore_gc.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2022, 2023, Oracle and/or its affiliates. +/* Copyright (c) 2022, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2022 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -27,8 +27,11 @@ typedef struct { #define _Py_AS_GC(o) ((PyGC_Head *)(o)-1) #define _PyGC_Head_UNUSED PyGC_Head +// GraalPy change +#define _PyGCHead_UNTAG(PTR) ((PyGC_Head *)(((uintptr_t) (PTR)) & ~HANDLE_BASE)) + /* True if the object is currently tracked by the GC. */ -#define _PyObject_GC_IS_TRACKED(o) (_Py_AS_GC(o)->_gc_next != 0) +#define _PyObject_GC_IS_TRACKED(o) (_PyGCHead_UNTAG(_Py_AS_GC(o))->_gc_next != 0) /* True if the object may be tracked by the GC in the future, or already is. This can be useful to implement some optimizations. */ @@ -48,21 +51,21 @@ typedef struct { // Lowest bit of _gc_next is used for flags only in GC. // But it is always 0 for normal code. -#define _PyGCHead_NEXT(g) ((PyGC_Head*)(g)->_gc_next) -#define _PyGCHead_SET_NEXT(g, p) _Py_RVALUE((g)->_gc_next = (uintptr_t)(p)) +#define _PyGCHead_NEXT(g) ((PyGC_Head*)_PyGCHead_UNTAG(g)->_gc_next) +#define _PyGCHead_SET_NEXT(g, p) _Py_RVALUE(_PyGCHead_UNTAG(g)->_gc_next = (uintptr_t)(p)) // Lowest two bits of _gc_prev is used for _PyGC_PREV_MASK_* flags. -#define _PyGCHead_PREV(g) ((PyGC_Head*)((g)->_gc_prev & _PyGC_PREV_MASK)) +#define _PyGCHead_PREV(g) ((PyGC_Head*)(_PyGCHead_UNTAG(g)->_gc_prev & _PyGC_PREV_MASK)) #define _PyGCHead_SET_PREV(g, p) do { \ assert(((uintptr_t)p & ~_PyGC_PREV_MASK) == 0); \ - (g)->_gc_prev = ((g)->_gc_prev & ~_PyGC_PREV_MASK) \ + _PyGCHead_UNTAG(g)->_gc_prev = (_PyGCHead_UNTAG(g)->_gc_prev & ~_PyGC_PREV_MASK) \ | ((uintptr_t)(p)); \ } while (0) #define _PyGCHead_FINALIZED(g) \ - (((g)->_gc_prev & _PyGC_PREV_MASK_FINALIZED) != 0) + ((_PyGCHead_UNTAG(g)->_gc_prev & _PyGC_PREV_MASK_FINALIZED) != 0) #define _PyGCHead_SET_FINALIZED(g) \ - _Py_RVALUE((g)->_gc_prev |= _PyGC_PREV_MASK_FINALIZED) + _Py_RVALUE(_PyGCHead_UNTAG(g)->_gc_prev |= _PyGC_PREV_MASK_FINALIZED) #define _PyGC_FINALIZED(o) \ _PyGCHead_FINALIZED(_Py_AS_GC(o)) @@ -171,7 +174,8 @@ struct _gc_runtime_state { extern void _PyGC_InitState(struct _gc_runtime_state *); -extern Py_ssize_t _PyGC_CollectNoFail(PyThreadState *tstate); +// GraalPy change: exporting _PyGC_CollectNoFail +extern PyAPI_FUNC(Py_ssize_t) _PyGC_CollectNoFail(PyThreadState *tstate); // Functions to clear types free lists diff --git a/graalpython/com.oracle.graal.python.cext/include/internal/pycore_global_objects.h b/graalpython/com.oracle.graal.python.cext/include/internal/pycore_global_objects.h index c3dc82f453..ff8cb933c7 100644 --- a/graalpython/com.oracle.graal.python.cext/include/internal/pycore_global_objects.h +++ b/graalpython/com.oracle.graal.python.cext/include/internal/pycore_global_objects.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Oracle and/or its affiliates. +/* Copyright (c) 2024, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2023 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -53,6 +53,7 @@ struct _Py_global_objects { _PyGC_Head_UNUSED _tuple_empty_gc_not_used; PyTupleObject tuple_empty; */ + char GraalDummyField; } singletons; }; diff --git a/graalpython/com.oracle.graal.python.cext/include/internal/pycore_object.h b/graalpython/com.oracle.graal.python.cext/include/internal/pycore_object.h index a538cabe64..36f6e95602 100644 --- a/graalpython/com.oracle.graal.python.cext/include/internal/pycore_object.h +++ b/graalpython/com.oracle.graal.python.cext/include/internal/pycore_object.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2022, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2022, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2022 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -14,10 +14,14 @@ extern "C" { #endif #include -// #include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() -// #include "pycore_interp.h" // PyInterpreterState.gc -// #include "pycore_pystate.h" // _PyInterpreterState_GET() -// #include "pycore_runtime.h" // _PyRuntime +#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() +#if 0 // GraalPy change +#include "pycore_interp.h" // PyInterpreterState.gc +#endif +#include "pycore_pystate.h" // _PyInterpreterState_GET() +#if 0 // GraalPy change +#include "pycore_runtime.h" // _PyRuntime +#endif #define _PyObject_IMMORTAL_INIT(type) \ { \ @@ -134,8 +138,28 @@ static inline void _PyObject_GC_TRACK( #endif PyObject *op) { - // GraalPy change - PyObject_GC_Track(op); + _PyObject_ASSERT_FROM(op, !_PyObject_GC_IS_TRACKED(op), + "object already tracked by the garbage collector", + filename, lineno, __func__); + + PyGC_Head *gc = _Py_AS_GC(op); + _PyObject_ASSERT_FROM(op, + (gc->_gc_prev & _PyGC_PREV_MASK_COLLECTING) == 0, + "object is in generation which is garbage collected", + filename, lineno, __func__); + +#if 0 // GraalPy change + PyInterpreterState *interp = _PyInterpreterState_GET(); + PyGC_Head *generation0 = interp->gc.generation0; +#else // GraalPy change + PyThreadState *tstate = _PyThreadState_GET(); + PyGC_Head *generation0 = tstate->gc->generation0; +#endif // GraalPy change + PyGC_Head *last = (PyGC_Head*)(generation0->_gc_prev); + _PyGCHead_SET_NEXT(last, gc); + _PyGCHead_SET_PREV(gc, last); + _PyGCHead_SET_NEXT(gc, generation0); + generation0->_gc_prev = (uintptr_t)gc; } /* Tell the GC to stop tracking this object. @@ -155,8 +179,17 @@ static inline void _PyObject_GC_UNTRACK( #endif PyObject *op) { - // GraalPy change - PyObject_GC_UnTrack(op); + _PyObject_ASSERT_FROM(op, _PyObject_GC_IS_TRACKED(op), + "object not tracked by the garbage collector", + filename, lineno, __func__); + + PyGC_Head *gc = _Py_AS_GC(op); + PyGC_Head *prev = _PyGCHead_PREV(gc); + PyGC_Head *next = _PyGCHead_NEXT(gc); + _PyGCHead_SET_NEXT(prev, next); + _PyGCHead_SET_PREV(next, prev); + _PyGCHead_UNTAG(gc)->_gc_next = 0; + _PyGCHead_UNTAG(gc)->_gc_prev &= _PyGC_PREV_MASK_FINALIZED; } // Macros to accept any type for the parameter, and to automatically pass @@ -197,7 +230,12 @@ _PyObject_IS_GC(PyObject *obj) { return (PyType_IS_GC(Py_TYPE(obj)) && (Py_TYPE(obj)->tp_is_gc == NULL - || Py_TYPE(obj)->tp_is_gc(obj))); + || Py_TYPE(obj)->tp_is_gc(obj)) + /* GraalPy change: our built-in types do not yet consistently + declare the HAVE_GC flag. So, also check if 'tp_traverse' + is there. */ + && (!points_to_py_handle_space(obj) + || Py_TYPE(obj)->tp_traverse != NULL)); } // Fast inlined version of PyType_IS_GC() @@ -206,12 +244,15 @@ _PyObject_IS_GC(PyObject *obj) static inline size_t _PyType_PreHeaderSize(PyTypeObject *tp) { - // GraalPy change: remove CPython's GC header; also we put only one pointer for dict, we don't store it inlined - return _PyType_HasFeature(tp, Py_TPFLAGS_MANAGED_DICT) * sizeof(PyObject *); + // GraalPy change: we put only one pointer for dict, we don't store it inlined + return _PyType_IS_GC(tp) * sizeof(PyGC_Head) + + _PyType_HasFeature(tp, Py_TPFLAGS_MANAGED_DICT) * sizeof(PyObject *); } void _PyObject_GC_Link(PyObject *op); +PyAPI_FUNC(void) _GraalPyObject_GC_NotifyOwnershipTransfer(PyObject *op); + // Usage: assert(_Py_CheckSlotResult(obj, "__getitem__", result != NULL)); extern int _Py_CheckSlotResult( PyObject *obj, @@ -245,8 +286,7 @@ static inline PyDictValues **_PyObject_ValuesPointer(PyObject *obj) static inline PyObject **_PyObject_ManagedDictPointer(PyObject *obj) { assert(Py_TYPE(obj)->tp_flags & Py_TPFLAGS_MANAGED_DICT); - // GraalPy change: ours is at a different offset - return ((PyObject **)obj)-1; + return ((PyObject **)obj)-3; } #define MANAGED_DICT_OFFSET (((int)sizeof(PyObject *))*-3) diff --git a/graalpython/com.oracle.graal.python.cext/include/object.h b/graalpython/com.oracle.graal.python.cext/include/object.h index 24d6156eeb..a427c70040 100644 --- a/graalpython/com.oracle.graal.python.cext/include/object.h +++ b/graalpython/com.oracle.graal.python.cext/include/object.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2018, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2018, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2020 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -124,7 +124,9 @@ typedef struct { // Test if the 'x' object is the 'y' object, the same as "x is y" in Python. PyAPI_FUNC(int) Py_Is(PyObject *x, PyObject *y); +#if 0 // GraalPy change #define Py_Is(x, y) ((x) == (y)) +#endif // GraalPy change PyAPI_FUNC(Py_ssize_t) PyTruffle_REFCNT(PyObject *ob); @@ -139,7 +141,7 @@ static inline Py_ssize_t Py_REFCNT(PyObject *ob) { // bpo-39573: The Py_SET_TYPE() function must be used to set an object type. PyAPI_FUNC(PyTypeObject*) PyTruffle_TYPE(PyObject *ob); static inline PyTypeObject* Py_TYPE(PyObject *ob) { -#if defined(GRAALVM_PYTHON) && !defined(GRAALVM_PYTHON_LLVM_MANAGED) && defined(NDEBUG) +#if defined(GRAALVM_PYTHON) && defined(NDEBUG) return (pointer_to_stub(ob)->ob_type); #else return PyTruffle_TYPE(ob); diff --git a/graalpython/com.oracle.graal.python.cext/include/pyconfig.h b/graalpython/com.oracle.graal.python.cext/include/pyconfig.h deleted file mode 100644 index e83cf5dc61..0000000000 --- a/graalpython/com.oracle.graal.python.cext/include/pyconfig.h +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -#ifndef Py_PYCONFIG_H -#define Py_PYCONFIG_H - -#define GRAALVM_PYTHON 1 - -// The graalpy build always sets MS_WINDOWS, so when this is not set, we are -// dealing with an extension build. In that case, if we're on Windows, we need -// to set the appropriate flags to link against our python C API dll. -#if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE) && !defined(MS_WINDOWS) -# ifdef _MSC_VER -# define MS_WINDOWS -# define Py_ENABLE_SHARED -# define HAVE_DECLSPEC_DLL -// This pragma is only understood by MSVC, not our LLVM toolchain, so it's only -// relevant for code that is compiled without bitcode and will run only -// natively. Since the pythonjni library contains all the trampolines to call -// into the python-native.dll in this case, we must only depend on that. -# pragma comment(lib, "python311.lib") -# endif -#endif - -/* If Cython is involved, avoid accesses to internal structures. While we are - * supporting this in many cases, it still involves overhead. */ -#define CYTHON_USE_TYPE_SLOTS 0 -#define CYTHON_USE_PYTYPE_LOOKUP 0 -#define CYTHON_UNPACK_METHODS 0 -#define CYTHON_FAST_PYCALL 0 -#define CYTHON_FAST_PYCCALL 0 -#define CYTHON_USE_DICT_VERSIONS 0 -#define CYTHON_AVOID_BORROWED_REFS 1 -#define CYTHON_USE_TP_FINALIZE 0 -#define CYTHON_USE_PYLIST_INTERNALS 0 -#define CYTHON_USE_UNICODE_INTERNALS 0 -#define CYTHON_USE_PYLONG_INTERNALS 0 -#define CYTHON_USE_ASYNC_SLOTS 1 -#define CYTHON_USE_UNICODE_WRITER 0 -#define CYTHON_USE_EXC_INFO_STACK 0 -#define CYTHON_FAST_THREAD_STATE 0 -#define CYTHON_PROFILE 0 -#define CYTHON_TRACE 0 -#define CYTHON_UPDATE_DESCRIPTOR_DOC 0 -// This s a workaround for a Cython bug that it uses a macro that CPython already removed -#define _Py_DEC_REFTOTAL - -/* Enable GNU extensions on systems that have them. */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE 1 -#endif - -// required for __UINT32_MAX__ etc. -#include - -#if defined(_MSC_VER) && !defined(__clang__) -// defines based on MSVC documentation -#define __SIZEOF_INT__ 4 -#define __SIZEOF_SHORT__ 2 -#define __SIZEOF_LONG__ 4 -#define __SIZEOF_LONG_LONG__ 8 -#define __SIZEOF_FLOAT__ 4 -#define __SIZEOF_DOUBLE__ 8 -#define __SIZEOF_LONG_DOUBLE__ 8 -#define __SIZEOF_SIZE_T__ 8 -#define __SIZEOF_UINTPTR_T__ 8 -#define __SIZEOF_POINTER__ 8 -#define __SIZEOF_WCHAR_T__ 2 -#endif - -// defines based on Clang defines -#define SIZEOF_DOUBLE __SIZEOF_DOUBLE__ -#define SIZEOF_FLOAT __SIZEOF_FLOAT__ -#define SIZEOF_FPOS_T __SIZEOF_INT128__ -#define SIZEOF_INT __SIZEOF_INT__ -#define SIZEOF_LONG __SIZEOF_LONG__ -#define SIZEOF_LONG_DOUBLE __SIZEOF_LONG_DOUBLE__ -#define SIZEOF_LONG_LONG __SIZEOF_LONG_LONG__ -#define SIZEOF_OFF_T __SIZEOF_SIZE_T__ -#define SIZEOF_PID_T __SIZEOF_INT__ -#define SIZEOF_PTHREAD_T __SIZEOF_LONG__ -#define SIZEOF_SHORT __SIZEOF_SHORT__ -#define SIZEOF_SIZE_T __SIZEOF_SIZE_T__ -#define SIZEOF_TIME_T __SIZEOF_POINTER__ -#define SIZEOF_UINTPTR_T __SIZEOF_POINTER__ -#define SIZEOF_VOID_P __SIZEOF_POINTER__ -#define SIZEOF_WCHAR_T __SIZEOF_WCHAR_T__ -#define SIZEOF__BOOL 1 - -/* Define if your compiler supports function prototype */ -#define HAVE_PROTOTYPES 1 - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -# ifndef UINT_MAX -#define UINT_MAX __UINT32_MAX__ -#endif -# ifndef SHRT_MIN -#define SHRT_MIN ((-__INT16_MAX__)-1) -#endif -# ifndef SHRT_MAX -#define SHRT_MAX __INT16_MAX__ -#endif -# ifndef USHRT_MAX -#define USHRT_MAX __UINT16_MAX__ -#endif -# ifndef CHAR_BIT -#define CHAR_BIT __CHAR_BIT__ -#endif -// #define Py_LIMITED_API 1 -// END TRUFFLE DEFS - -#define HAVE_ACOSH 1 -#define HAVE_ASINH 1 -#define HAVE_ATANH 1 -#define HAVE_CLOCK 1 -#define HAVE_DIRENT_H 1 -#define HAVE_SENDFILE 1 -#define HAVE_SYS_STAT_H 1 -#define HAVE_ERRNO_H 1 -#define HAVE_UTIME_H -#define HAVE_SIGNAL_H -#define HAVE_FCNTL_H - -#define HAVE_STDARG_PROTOTYPES - -#define HAVE_WCHAR_H 1 - -#define WITH_THREAD 1 -#define WITH_DOC_STRINGS 1 - -#ifndef MS_WINDOWS -#define HAVE_UNISTD_H -#define HAVE_PTHREAD_H -#define HAVE_SYS_WAIT_H -#define HAVE_SYS_TIME_H -#define TIME_WITH_SYS_TIME 1 -#else -#define HAVE_COPYSIGN 1 -#define HAVE_ROUND 1 -#define HAVE_HYPOT 1 -#define NT_THREADS 1 -#endif - -// The following should have been generated using `configure` command, -// but instead, are set manully for the time being. - -/* Define if C doubles are 64-bit IEEE 754 binary format, stored with the - least significant byte first */ -#define DOUBLE_IS_LITTLE_ENDIAN_IEEE754 1 - - -#endif /*Py_PYCONFIG_H*/ - diff --git a/graalpython/com.oracle.graal.python.cext/include/pydtrace.h b/graalpython/com.oracle.graal.python.cext/include/pydtrace.h new file mode 100644 index 0000000000..c7fe86cac6 --- /dev/null +++ b/graalpython/com.oracle.graal.python.cext/include/pydtrace.h @@ -0,0 +1,65 @@ +/* Copyright (c) 2018, 2024, Oracle and/or its affiliates. + * Copyright (C) 1996-2023 Python Software Foundation + * + * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 + */ + +/* Static DTrace probes interface */ + +#ifndef Py_DTRACE_H +#define Py_DTRACE_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef WITH_DTRACE + +#include "pydtrace_probes.h" + +/* pydtrace_probes.h, on systems with DTrace, is auto-generated to include + `PyDTrace_{PROBE}` and `PyDTrace_{PROBE}_ENABLED()` macros for every probe + defined in pydtrace_provider.d. + + Calling these functions must be guarded by a `PyDTrace_{PROBE}_ENABLED()` + check to minimize performance impact when probing is off. For example: + + if (PyDTrace_FUNCTION_ENTRY_ENABLED()) + PyDTrace_FUNCTION_ENTRY(f); +*/ + +#else + +/* Without DTrace, compile to nothing. */ + +static inline void PyDTrace_LINE(const char *arg0, const char *arg1, int arg2) {} +static inline void PyDTrace_FUNCTION_ENTRY(const char *arg0, const char *arg1, int arg2) {} +static inline void PyDTrace_FUNCTION_RETURN(const char *arg0, const char *arg1, int arg2) {} +static inline void PyDTrace_GC_START(int arg0) {} +static inline void PyDTrace_GC_DONE(Py_ssize_t arg0) {} +static inline void PyDTrace_INSTANCE_NEW_START(int arg0) {} +static inline void PyDTrace_INSTANCE_NEW_DONE(int arg0) {} +static inline void PyDTrace_INSTANCE_DELETE_START(int arg0) {} +static inline void PyDTrace_INSTANCE_DELETE_DONE(int arg0) {} +static inline void PyDTrace_IMPORT_FIND_LOAD_START(const char *arg0) {} +static inline void PyDTrace_IMPORT_FIND_LOAD_DONE(const char *arg0, int arg1) {} +static inline void PyDTrace_AUDIT(const char *arg0, void *arg1) {} + +static inline int PyDTrace_LINE_ENABLED(void) { return 0; } +static inline int PyDTrace_FUNCTION_ENTRY_ENABLED(void) { return 0; } +static inline int PyDTrace_FUNCTION_RETURN_ENABLED(void) { return 0; } +static inline int PyDTrace_GC_START_ENABLED(void) { return 0; } +static inline int PyDTrace_GC_DONE_ENABLED(void) { return 0; } +static inline int PyDTrace_INSTANCE_NEW_START_ENABLED(void) { return 0; } +static inline int PyDTrace_INSTANCE_NEW_DONE_ENABLED(void) { return 0; } +static inline int PyDTrace_INSTANCE_DELETE_START_ENABLED(void) { return 0; } +static inline int PyDTrace_INSTANCE_DELETE_DONE_ENABLED(void) { return 0; } +static inline int PyDTrace_IMPORT_FIND_LOAD_START_ENABLED(void) { return 0; } +static inline int PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED(void) { return 0; } +static inline int PyDTrace_AUDIT_ENABLED(void) { return 0; } + +#endif /* !WITH_DTRACE */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_DTRACE_H */ diff --git a/graalpython/com.oracle.graal.python.cext/include/pythonrun.h b/graalpython/com.oracle.graal.python.cext/include/pythonrun.h index e14625daae..95d64fbcc9 100644 --- a/graalpython/com.oracle.graal.python.cext/include/pythonrun.h +++ b/graalpython/com.oracle.graal.python.cext/include/pythonrun.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2018, 2023, Oracle and/or its affiliates. +/* Copyright (c) 2018, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2020 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -27,11 +27,13 @@ PyAPI_DATA(int) (*PyOS_InputHook)(void); to an 8k margin. */ #define PYOS_STACK_MARGIN 2048 +#if 0 // GraalPy change #if defined(WIN32) && !defined(MS_WIN64) && !defined(_M_ARM) && defined(_MSC_VER) && _MSC_VER >= 1300 /* Enable stack checking under Microsoft C */ // When changing the platforms, ensure PyOS_CheckStack() docs are still correct #define USE_STACKCHECK #endif +#endif #ifdef USE_STACKCHECK /* Check that we aren't overflowing our stack */ diff --git a/graalpython/com.oracle.graal.python.cext/include/rangeobject.h b/graalpython/com.oracle.graal.python.cext/include/rangeobject.h new file mode 100644 index 0000000000..b34bdebf7a --- /dev/null +++ b/graalpython/com.oracle.graal.python.cext/include/rangeobject.h @@ -0,0 +1,32 @@ +/* Copyright (c) 2018, 2024, Oracle and/or its affiliates. + * Copyright (C) 1996-2020 Python Software Foundation + * + * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 + */ + +/* Range object interface */ + +#ifndef Py_RANGEOBJECT_H +#define Py_RANGEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +/* +A range object represents an integer range. This is an immutable object; +a range cannot change its value after creation. + +Range objects behave like the corresponding tuple objects except that +they are represented by a start, stop, and step datamembers. +*/ + +PyAPI_DATA(PyTypeObject) PyRange_Type; +PyAPI_DATA(PyTypeObject) PyRangeIter_Type; +PyAPI_DATA(PyTypeObject) PyLongRangeIter_Type; + +#define PyRange_Check(op) Py_IS_TYPE(op, &PyRange_Type) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_RANGEOBJECT_H */ diff --git a/graalpython/com.oracle.graal.python.cext/modules/_cpython_sre/sre.c b/graalpython/com.oracle.graal.python.cext/modules/_cpython_sre/sre.c index db0e8e2831..126594b905 100644 --- a/graalpython/com.oracle.graal.python.cext/modules/_cpython_sre/sre.c +++ b/graalpython/com.oracle.graal.python.cext/modules/_cpython_sre/sre.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2018, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2018, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2020 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -1052,19 +1052,6 @@ _sre_SRE_Pattern_split_impl(PatternObject *self, PyObject *string, } -__attribute__((always_inline)) -inline static void *_memchr(const void *s, int c, Py_ssize_t n) { - unsigned char *p = (unsigned char*)s; - while(n--) { - if(*p != (unsigned char)c) { - p++; - } else { - return p; - } - } - return 0; -} - static PyObject* pattern_subx(_sremodulestate* module_state, PatternObject* self, @@ -1099,7 +1086,7 @@ pattern_subx(_sremodulestate* module_state, ptr = getstring(ptemplate, &n, &isbytes, &charsize, &view); if (ptr) { if (charsize == 1) - literal = _memchr(ptr, '\\', n) == NULL; + literal = memchr(ptr, '\\', n) == NULL; else literal = PyUnicode_FindChar(ptemplate, '\\', 0, n, 1) == -1; } else { diff --git a/graalpython/com.oracle.graal.python.cext/modules/_sqlite/sqlite/sqlite3.c b/graalpython/com.oracle.graal.python.cext/modules/_sqlite/sqlite/sqlite3.c index d58bdaa751..c748d03346 100644 --- a/graalpython/com.oracle.graal.python.cext/modules/_sqlite/sqlite/sqlite3.c +++ b/graalpython/com.oracle.graal.python.cext/modules/_sqlite/sqlite/sqlite3.c @@ -1,6 +1,6 @@ /****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite -** version 3.41.2. By combining all the individual C code files into this +** version 3.47.2. By combining all the individual C code files into this ** single large file, the entire code can be compiled as a single translation ** unit. This allows many compilers to do optimizations that would not be ** possible if the files were compiled separately. Performance improvements @@ -16,6 +16,9 @@ ** if you want a wrapper to interface SQLite with your choice of programming ** language. The code for the "sqlite3" command-line shell is also in a ** separate file. This file contains only code for the core SQLite library. +** +** The content in this amalgamation comes from Fossil check-in +** 2aabe05e2e8cae4847a802ee2daddc1d7413. */ #define SQLITE_CORE 1 #define SQLITE_AMALGAMATION 1 @@ -50,11 +53,11 @@ ** used on lines of code that actually ** implement parts of coverage testing. ** -** OPTIMIZATION-IF-TRUE - This branch is allowed to alway be false +** OPTIMIZATION-IF-TRUE - This branch is allowed to always be false ** and the correct answer is still obtained, ** though perhaps more slowly. ** -** OPTIMIZATION-IF-FALSE - This branch is allowed to alway be true +** OPTIMIZATION-IF-FALSE - This branch is allowed to always be true ** and the correct answer is still obtained, ** though perhaps more slowly. ** @@ -123,6 +126,10 @@ #define SQLITE_4_BYTE_ALIGNED_MALLOC #endif /* defined(_MSC_VER) && !defined(_WIN64) */ +#if !defined(HAVE_LOG2) && defined(_MSC_VER) && _MSC_VER<1800 +#define HAVE_LOG2 0 +#endif /* !defined(HAVE_LOG2) && defined(_MSC_VER) && _MSC_VER<1800 */ + #endif /* SQLITE_MSVC_H */ /************** End of msvc.h ************************************************/ @@ -249,10 +256,13 @@ /* ** Macro to disable warnings about missing "break" at the end of a "case". */ -#if GCC_VERSION>=7000000 -# define deliberate_fall_through __attribute__((fallthrough)); -#else -# define deliberate_fall_through +#if defined(__has_attribute) +# if __has_attribute(fallthrough) +# define deliberate_fall_through __attribute__((fallthrough)); +# endif +#endif +#if !defined(deliberate_fall_through) +# define deliberate_fall_through #endif /* @@ -452,9 +462,9 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.41.2" -#define SQLITE_VERSION_NUMBER 3041002 -#define SQLITE_SOURCE_ID "2023-03-22 11:56:21 0d1fc92f94cb6b76bffe3ec34d69cffde2924203304e8ffc4155597af0c191da" +#define SQLITE_VERSION "3.47.2" +#define SQLITE_VERSION_NUMBER 3047002 +#define SQLITE_SOURCE_ID "2024-12-07 20:39:59 2aabe05e2e8cae4847a802ee2daddc1d7413d8fc560254d93ee3e72c14685b6c" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -726,6 +736,8 @@ typedef int (*sqlite3_callback)(void*,int,char**, char**); ** the 1st parameter to sqlite3_exec() while sqlite3_exec() is running. **
  • The application must not modify the SQL statement text passed into ** the 2nd parameter of sqlite3_exec() while sqlite3_exec() is running. +**
  • The application must not dereference the arrays or string pointers +** passed as the 3rd and 4th callback parameters after it returns. ** */ SQLITE_API int sqlite3_exec( @@ -834,6 +846,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8)) #define SQLITE_IOERR_DATA (SQLITE_IOERR | (32<<8)) #define SQLITE_IOERR_CORRUPTFS (SQLITE_IOERR | (33<<8)) +#define SQLITE_IOERR_IN_PAGE (SQLITE_IOERR | (34<<8)) #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) #define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8)) #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) @@ -955,6 +968,13 @@ SQLITE_API int sqlite3_exec( ** filesystem supports doing multiple write operations atomically when those ** write operations are bracketed by [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] and ** [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]. +** +** The SQLITE_IOCAP_SUBPAGE_READ property means that it is ok to read +** from the database file in amounts that are not a multiple of the +** page size and that do not begin at a page boundary. Without this +** property, SQLite is careful to only do full-page reads and write +** on aligned pages, with the one exception that it will do a sub-page +** read of the first page to access the database header. */ #define SQLITE_IOCAP_ATOMIC 0x00000001 #define SQLITE_IOCAP_ATOMIC512 0x00000002 @@ -971,6 +991,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 #define SQLITE_IOCAP_IMMUTABLE 0x00002000 #define SQLITE_IOCAP_BATCH_ATOMIC 0x00004000 +#define SQLITE_IOCAP_SUBPAGE_READ 0x00008000 /* ** CAPI3REF: File Locking Levels @@ -1067,16 +1088,16 @@ struct sqlite3_file { ** ** xLock() upgrades the database file lock. In other words, xLock() moves the ** database file lock in the direction NONE toward EXCLUSIVE. The argument to -** xLock() is always on of SHARED, RESERVED, PENDING, or EXCLUSIVE, never +** xLock() is always one of SHARED, RESERVED, PENDING, or EXCLUSIVE, never ** SQLITE_LOCK_NONE. If the database file lock is already at or above the ** requested lock, then the call to xLock() is a no-op. ** xUnlock() downgrades the database file lock to either SHARED or NONE. -* If the lock is already at or below the requested lock state, then the call +** If the lock is already at or below the requested lock state, then the call ** to xUnlock() is a no-op. ** The xCheckReservedLock() method checks whether any database connection, ** either in this process or in some other process, is holding a RESERVED, -** PENDING, or EXCLUSIVE lock on the file. It returns true -** if such a lock exists and false otherwise. +** PENDING, or EXCLUSIVE lock on the file. It returns, via its output +** pointer parameter, true if such a lock exists and false otherwise. ** ** The xFileControl() method is a generic interface that allows custom ** VFS implementations to directly control an open file using the @@ -1117,6 +1138,7 @@ struct sqlite3_file { **
  • [SQLITE_IOCAP_POWERSAFE_OVERWRITE] **
  • [SQLITE_IOCAP_IMMUTABLE] **
  • [SQLITE_IOCAP_BATCH_ATOMIC] +**
  • [SQLITE_IOCAP_SUBPAGE_READ] ** ** ** The SQLITE_IOCAP_ATOMIC property means that all writes of @@ -1496,7 +1518,7 @@ struct sqlite3_io_methods { ** by clients within the current process, only within other processes. ** **
  • [[SQLITE_FCNTL_CKSM_FILE]] -** The [SQLITE_FCNTL_CKSM_FILE] opcode is for use interally by the +** The [SQLITE_FCNTL_CKSM_FILE] opcode is for use internally by the ** [checksum VFS shim] only. ** **
  • [[SQLITE_FCNTL_RESET_CACHE]] @@ -1961,20 +1983,23 @@ SQLITE_API int sqlite3_os_end(void); ** must ensure that no other SQLite interfaces are invoked by other ** threads while sqlite3_config() is running. ** -** The sqlite3_config() interface -** may only be invoked prior to library initialization using -** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. -** ^If sqlite3_config() is called after [sqlite3_initialize()] and before -** [sqlite3_shutdown()] then it will return SQLITE_MISUSE. -** Note, however, that ^sqlite3_config() can be called as part of the -** implementation of an application-defined [sqlite3_os_init()]. -** ** The first argument to sqlite3_config() is an integer ** [configuration option] that determines ** what property of SQLite is to be configured. Subsequent arguments ** vary depending on the [configuration option] ** in the first argument. ** +** For most configuration options, the sqlite3_config() interface +** may only be invoked prior to library initialization using +** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. +** The exceptional configuration options that may be invoked at any time +** are called "anytime configuration options". +** ^If sqlite3_config() is called after [sqlite3_initialize()] and before +** [sqlite3_shutdown()] with a first argument that is not an anytime +** configuration option, then the sqlite3_config() call will return SQLITE_MISUSE. +** Note, however, that ^sqlite3_config() can be called as part of the +** implementation of an application-defined [sqlite3_os_init()]. +** ** ^When a configuration option is set, sqlite3_config() returns [SQLITE_OK]. ** ^If the option is unknown or SQLite is unable to set the option ** then this routine returns a non-zero [error code]. @@ -2082,6 +2107,23 @@ struct sqlite3_mem_methods { ** These constants are the available integer configuration options that ** can be passed as the first argument to the [sqlite3_config()] interface. ** +** Most of the configuration options for sqlite3_config() +** will only work if invoked prior to [sqlite3_initialize()] or after +** [sqlite3_shutdown()]. The few exceptions to this rule are called +** "anytime configuration options". +** ^Calling [sqlite3_config()] with a first argument that is not an +** anytime configuration option in between calls to [sqlite3_initialize()] and +** [sqlite3_shutdown()] is a no-op that returns SQLITE_MISUSE. +** +** The set of anytime configuration options can change (by insertions +** and/or deletions) from one release of SQLite to the next. +** As of SQLite version 3.42.0, the complete set of anytime configuration +** options is: +**
      +**
    • SQLITE_CONFIG_LOG +**
    • SQLITE_CONFIG_PCACHE_HDRSZ +**
    +** ** New configuration options may be added in future releases of SQLite. ** Existing configuration options might be discontinued. Applications ** should check the return code from [sqlite3_config()] to make sure that @@ -2412,7 +2454,7 @@ struct sqlite3_mem_methods { ** is stored in each sorted record and the required column values loaded ** from the database as records are returned in sorted order. The default ** value for this option is to never use this optimization. Specifying a -** negative value for this option restores the default behaviour. +** negative value for this option restores the default behavior. ** This option is only available if SQLite is compiled with the ** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option. ** @@ -2426,30 +2468,46 @@ struct sqlite3_mem_methods { ** configuration setting is never used, then the default maximum is determined ** by the [SQLITE_MEMDB_DEFAULT_MAXSIZE] compile-time option. If that ** compile-time option is not set, then the default maximum is 1073741824. +** +** [[SQLITE_CONFIG_ROWID_IN_VIEW]] +**
    SQLITE_CONFIG_ROWID_IN_VIEW +**
    The SQLITE_CONFIG_ROWID_IN_VIEW option enables or disables the ability +** for VIEWs to have a ROWID. The capability can only be enabled if SQLite is +** compiled with -DSQLITE_ALLOW_ROWID_IN_VIEW, in which case the capability +** defaults to on. This configuration option queries the current setting or +** changes the setting to off or on. The argument is a pointer to an integer. +** If that integer initially holds a value of 1, then the ability for VIEWs to +** have ROWIDs is activated. If the integer initially holds zero, then the +** ability is deactivated. Any other initial value for the integer leaves the +** setting unchanged. After changes, if any, the integer is written with +** a 1 or 0, if the ability for VIEWs to have ROWIDs is on or off. If SQLite +** is compiled without -DSQLITE_ALLOW_ROWID_IN_VIEW (which is the usual and +** recommended case) then the integer is always filled with zero, regardless +** if its initial value. ** */ -#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ -#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */ -#define SQLITE_CONFIG_SERIALIZED 3 /* nil */ -#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */ -#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */ -#define SQLITE_CONFIG_SCRATCH 6 /* No longer used */ -#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */ -#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */ -#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ -#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */ -#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ -/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ -#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ -#define SQLITE_CONFIG_PCACHE 14 /* no-op */ -#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */ -#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */ -#define SQLITE_CONFIG_URI 17 /* int */ -#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */ -#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */ +#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ +#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */ +#define SQLITE_CONFIG_SERIALIZED 3 /* nil */ +#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_SCRATCH 6 /* No longer used */ +#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */ +#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */ +#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ +#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */ +#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ +/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ +#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ +#define SQLITE_CONFIG_PCACHE 14 /* no-op */ +#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */ +#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */ +#define SQLITE_CONFIG_URI 17 /* int */ +#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */ +#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */ #define SQLITE_CONFIG_COVERING_INDEX_SCAN 20 /* int */ -#define SQLITE_CONFIG_SQLLOG 21 /* xSqllog, void* */ -#define SQLITE_CONFIG_MMAP_SIZE 22 /* sqlite3_int64, sqlite3_int64 */ +#define SQLITE_CONFIG_SQLLOG 21 /* xSqllog, void* */ +#define SQLITE_CONFIG_MMAP_SIZE 22 /* sqlite3_int64, sqlite3_int64 */ #define SQLITE_CONFIG_WIN32_HEAPSIZE 23 /* int nByte */ #define SQLITE_CONFIG_PCACHE_HDRSZ 24 /* int *psz */ #define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */ @@ -2457,6 +2515,7 @@ struct sqlite3_mem_methods { #define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */ #define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */ #define SQLITE_CONFIG_MEMDB_MAXSIZE 29 /* sqlite3_int64 */ +#define SQLITE_CONFIG_ROWID_IN_VIEW 30 /* int* */ /* ** CAPI3REF: Database Connection Configuration Options @@ -2587,7 +2646,7 @@ struct sqlite3_mem_methods { ** database handle, SQLite checks if this will mean that there are now no ** connections at all to the database. If so, it performs a checkpoint ** operation before closing the connection. This option may be used to -** override this behaviour. The first parameter passed to this operation +** override this behavior. The first parameter passed to this operation ** is an integer - positive to disable checkpoints-on-close, or zero (the ** default) to enable them, and negative to leave the setting unchanged. ** The second parameter is a pointer to an integer @@ -2684,7 +2743,7 @@ struct sqlite3_mem_methods { **
    ** ** [[SQLITE_DBCONFIG_DQS_DML]] -**
    SQLITE_DBCONFIG_DQS_DML +**
    SQLITE_DBCONFIG_DQS_DML
    **
    The SQLITE_DBCONFIG_DQS_DML option activates or deactivates ** the legacy [double-quoted string literal] misfeature for DML statements ** only, that is DELETE, INSERT, SELECT, and UPDATE statements. The @@ -2693,7 +2752,7 @@ struct sqlite3_mem_methods { **
    ** ** [[SQLITE_DBCONFIG_DQS_DDL]] -**
    SQLITE_DBCONFIG_DQS_DDL +**
    SQLITE_DBCONFIG_DQS_DDL
    **
    The SQLITE_DBCONFIG_DQS option activates or deactivates ** the legacy [double-quoted string literal] misfeature for DDL statements, ** such as CREATE TABLE and CREATE INDEX. The @@ -2702,7 +2761,7 @@ struct sqlite3_mem_methods { **
    ** ** [[SQLITE_DBCONFIG_TRUSTED_SCHEMA]] -**
    SQLITE_DBCONFIG_TRUSTED_SCHEMA +**
    SQLITE_DBCONFIG_TRUSTED_SCHEMA
    **
    The SQLITE_DBCONFIG_TRUSTED_SCHEMA option tells SQLite to ** assume that database schemas are untainted by malicious content. ** When the SQLITE_DBCONFIG_TRUSTED_SCHEMA option is disabled, SQLite @@ -2722,7 +2781,7 @@ struct sqlite3_mem_methods { **
    ** ** [[SQLITE_DBCONFIG_LEGACY_FILE_FORMAT]] -**
    SQLITE_DBCONFIG_LEGACY_FILE_FORMAT +**
    SQLITE_DBCONFIG_LEGACY_FILE_FORMAT
    **
    The SQLITE_DBCONFIG_LEGACY_FILE_FORMAT option activates or deactivates ** the legacy file format flag. When activated, this flag causes all newly ** created database file to have a schema format version number (the 4-byte @@ -2731,7 +2790,7 @@ struct sqlite3_mem_methods { ** any SQLite version back to 3.0.0 ([dateof:3.0.0]). Without this setting, ** newly created databases are generally not understandable by SQLite versions ** prior to 3.3.0 ([dateof:3.3.0]). As these words are written, there -** is now scarcely any need to generated database files that are compatible +** is now scarcely any need to generate database files that are compatible ** all the way back to version 3.0.0, and so this setting is of little ** practical use, but is provided so that SQLite can continue to claim the ** ability to generate new database files that are compatible with version @@ -2740,8 +2799,40 @@ struct sqlite3_mem_methods { ** the [VACUUM] command will fail with an obscure error when attempting to ** process a table with generated columns and a descending index. This is ** not considered a bug since SQLite versions 3.3.0 and earlier do not support -** either generated columns or decending indexes. +** either generated columns or descending indexes. +**
    +** +** [[SQLITE_DBCONFIG_STMT_SCANSTATUS]] +**
    SQLITE_DBCONFIG_STMT_SCANSTATUS
    +**
    The SQLITE_DBCONFIG_STMT_SCANSTATUS option is only useful in +** SQLITE_ENABLE_STMT_SCANSTATUS builds. In this case, it sets or clears +** a flag that enables collection of the sqlite3_stmt_scanstatus_v2() +** statistics. For statistics to be collected, the flag must be set on +** the database handle both when the SQL statement is prepared and when it +** is stepped. The flag is set (collection of statistics is enabled) +** by default. This option takes two arguments: an integer and a pointer to +** an integer.. The first argument is 1, 0, or -1 to enable, disable, or +** leave unchanged the statement scanstatus option. If the second argument +** is not NULL, then the value of the statement scanstatus setting after +** processing the first argument is written into the integer that the second +** argument points to. **
    +** +** [[SQLITE_DBCONFIG_REVERSE_SCANORDER]] +**
    SQLITE_DBCONFIG_REVERSE_SCANORDER
    +**
    The SQLITE_DBCONFIG_REVERSE_SCANORDER option changes the default order +** in which tables and indexes are scanned so that the scans start at the end +** and work toward the beginning rather than starting at the beginning and +** working toward the end. Setting SQLITE_DBCONFIG_REVERSE_SCANORDER is the +** same as setting [PRAGMA reverse_unordered_selects]. This option takes +** two arguments which are an integer and a pointer to an integer. The first +** argument is 1, 0, or -1 to enable, disable, or leave unchanged the +** reverse scan order flag, respectively. If the second argument is not NULL, +** then 0 or 1 is written into the integer that the second argument points to +** depending on if the reverse scan order flag is set after processing the +** first argument. +**
    +** ** */ #define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ @@ -2762,7 +2853,9 @@ struct sqlite3_mem_methods { #define SQLITE_DBCONFIG_ENABLE_VIEW 1015 /* int int* */ #define SQLITE_DBCONFIG_LEGACY_FILE_FORMAT 1016 /* int int* */ #define SQLITE_DBCONFIG_TRUSTED_SCHEMA 1017 /* int int* */ -#define SQLITE_DBCONFIG_MAX 1017 /* Largest DBCONFIG */ +#define SQLITE_DBCONFIG_STMT_SCANSTATUS 1018 /* int int* */ +#define SQLITE_DBCONFIG_REVERSE_SCANORDER 1019 /* int int* */ +#define SQLITE_DBCONFIG_MAX 1019 /* Largest DBCONFIG */ /* ** CAPI3REF: Enable Or Disable Extended Result Codes @@ -2987,6 +3080,7 @@ SQLITE_API sqlite3_int64 sqlite3_total_changes64(sqlite3*); ** ** ^The [sqlite3_is_interrupted(D)] interface can be used to determine whether ** or not an interrupt is currently in effect for [database connection] D. +** It returns 1 if an interrupt is currently in effect, or 0 otherwise. */ SQLITE_API void sqlite3_interrupt(sqlite3*); SQLITE_API int sqlite3_is_interrupted(sqlite3*); @@ -3536,8 +3630,8 @@ SQLITE_API int sqlite3_set_authorizer( #define SQLITE_RECURSIVE 33 /* NULL NULL */ /* -** CAPI3REF: Tracing And Profiling Functions -** METHOD: sqlite3 +** CAPI3REF: Deprecated Tracing And Profiling Functions +** DEPRECATED ** ** These routines are deprecated. Use the [sqlite3_trace_v2()] interface ** instead of the routines described here. @@ -3640,8 +3734,10 @@ SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*, ** M argument should be the bitwise OR-ed combination of ** zero or more [SQLITE_TRACE] constants. ** -** ^Each call to either sqlite3_trace() or sqlite3_trace_v2() overrides -** (cancels) any prior calls to sqlite3_trace() or sqlite3_trace_v2(). +** ^Each call to either sqlite3_trace(D,X,P) or sqlite3_trace_v2(D,M,X,P) +** overrides (cancels) all prior calls to sqlite3_trace(D,X,P) or +** sqlite3_trace_v2(D,M,X,P) for the [database connection] D. Each +** database connection may have at most one trace callback. ** ** ^The X callback is invoked whenever any of the events identified by ** mask M occur. ^The integer return value from the callback is currently @@ -3799,8 +3895,8 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** ** [[OPEN_EXRESCODE]] ^(
    [SQLITE_OPEN_EXRESCODE]
    **
    The database connection comes up in "extended result code mode". -** In other words, the database behaves has if -** [sqlite3_extended_result_codes(db,1)] where called on the database +** In other words, the database behaves as if +** [sqlite3_extended_result_codes(db,1)] were called on the database ** connection as soon as the connection is created. In addition to setting ** the extended result code mode, this flag also causes [sqlite3_open_v2()] ** to return an extended result code.
    @@ -4010,7 +4106,7 @@ SQLITE_API int sqlite3_open_v2( ** as F) must be one of: **
      **
    • A database filename pointer created by the SQLite core and -** passed into the xOpen() method of a VFS implemention, or +** passed into the xOpen() method of a VFS implementation, or **
    • A filename obtained from [sqlite3_db_filename()], or **
    • A new filename constructed using [sqlite3_create_filename()]. **
    @@ -4123,7 +4219,7 @@ SQLITE_API sqlite3_file *sqlite3_database_file_object(const char*); /* ** CAPI3REF: Create and Destroy VFS Filenames ** -** These interfces are provided for use by [VFS shim] implementations and +** These interfaces are provided for use by [VFS shim] implementations and ** are not useful outside of that context. ** ** The sqlite3_create_filename(D,J,W,N,P) allocates memory to hold a version of @@ -4202,14 +4298,17 @@ SQLITE_API void sqlite3_free_filename(sqlite3_filename); ** ** ** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language -** text that describes the error, as either UTF-8 or UTF-16 respectively. +** text that describes the error, as either UTF-8 or UTF-16 respectively, +** or NULL if no error message is available. +** (See how SQLite handles [invalid UTF] for exceptions to this rule.) ** ^(Memory to hold the error message string is managed internally. ** The application does not need to worry about freeing the result. ** However, the error string might be overwritten or deallocated by ** subsequent calls to other SQLite interface functions.)^ ** -** ^The sqlite3_errstr() interface returns the English-language text -** that describes the [result code], as UTF-8. +** ^The sqlite3_errstr(E) interface returns the English-language text +** that describes the [result code] E, as UTF-8, or NULL if E is not an +** result code for which a text error message is available. ** ^(Memory to hold the error message string is managed internally ** and must not be freed by the application)^. ** @@ -4448,13 +4547,17 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** and sqlite3_prepare16_v3() use UTF-16. ** ** ^If the nByte argument is negative, then zSql is read up to the -** first zero terminator. ^If nByte is positive, then it is the -** number of bytes read from zSql. ^If nByte is zero, then no prepared +** first zero terminator. ^If nByte is positive, then it is the maximum +** number of bytes read from zSql. When nByte is positive, zSql is read +** up to the first zero terminator or until the nByte bytes have been read, +** whichever comes first. ^If nByte is zero, then no prepared ** statement is generated. ** If the caller knows that the supplied string is nul-terminated, then ** there is a small performance advantage to passing an nByte parameter that ** is the number of bytes in the input string including ** the nul-terminator. +** Note that nByte measure the length of the input in bytes, not +** characters, even for the UTF-16 interfaces. ** ** ^If pzTail is not NULL then *pzTail is made to point to the first byte ** past the end of the first SQL statement in zSql. These routines only @@ -4670,6 +4773,41 @@ SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); */ SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt); +/* +** CAPI3REF: Change The EXPLAIN Setting For A Prepared Statement +** METHOD: sqlite3_stmt +** +** The sqlite3_stmt_explain(S,E) interface changes the EXPLAIN +** setting for [prepared statement] S. If E is zero, then S becomes +** a normal prepared statement. If E is 1, then S behaves as if +** its SQL text began with "[EXPLAIN]". If E is 2, then S behaves as if +** its SQL text began with "[EXPLAIN QUERY PLAN]". +** +** Calling sqlite3_stmt_explain(S,E) might cause S to be reprepared. +** SQLite tries to avoid a reprepare, but a reprepare might be necessary +** on the first transition into EXPLAIN or EXPLAIN QUERY PLAN mode. +** +** Because of the potential need to reprepare, a call to +** sqlite3_stmt_explain(S,E) will fail with SQLITE_ERROR if S cannot be +** reprepared because it was created using [sqlite3_prepare()] instead of +** the newer [sqlite3_prepare_v2()] or [sqlite3_prepare_v3()] interfaces and +** hence has no saved SQL text with which to reprepare. +** +** Changing the explain setting for a prepared statement does not change +** the original SQL text for the statement. Hence, if the SQL text originally +** began with EXPLAIN or EXPLAIN QUERY PLAN, but sqlite3_stmt_explain(S,0) +** is called to convert the statement into an ordinary statement, the EXPLAIN +** or EXPLAIN QUERY PLAN keywords will still appear in the sqlite3_sql(S) +** output, even though the statement now acts like a normal SQL statement. +** +** This routine returns SQLITE_OK if the explain mode is successfully +** changed, or an error code if the explain mode could not be changed. +** The explain mode cannot be changed while a statement is active. +** Hence, it is good practice to call [sqlite3_reset(S)] +** immediately prior to calling sqlite3_stmt_explain(S,E). +*/ +SQLITE_API int sqlite3_stmt_explain(sqlite3_stmt *pStmt, int eMode); + /* ** CAPI3REF: Determine If A Prepared Statement Has Been Reset ** METHOD: sqlite3_stmt @@ -4833,7 +4971,7 @@ typedef struct sqlite3_context sqlite3_context; ** with it may be passed. ^It is called to dispose of the BLOB or string even ** if the call to the bind API fails, except the destructor is not called if ** the third parameter is a NULL pointer or the fourth parameter is negative. -** ^ (2) The special constant, [SQLITE_STATIC], may be passsed to indicate that +** ^ (2) The special constant, [SQLITE_STATIC], may be passed to indicate that ** the application remains responsible for disposing of the object. ^In this ** case, the object and the provided pointer to it must remain valid until ** either the prepared statement is finalized or the same SQL parameter is @@ -5512,20 +5650,33 @@ SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); ** ^The [sqlite3_reset(S)] interface resets the [prepared statement] S ** back to the beginning of its program. ** -** ^If the most recent call to [sqlite3_step(S)] for the -** [prepared statement] S returned [SQLITE_ROW] or [SQLITE_DONE], -** or if [sqlite3_step(S)] has never before been called on S, -** then [sqlite3_reset(S)] returns [SQLITE_OK]. +** ^The return code from [sqlite3_reset(S)] indicates whether or not +** the previous evaluation of prepared statement S completed successfully. +** ^If [sqlite3_step(S)] has never before been called on S or if +** [sqlite3_step(S)] has not been called since the previous call +** to [sqlite3_reset(S)], then [sqlite3_reset(S)] will return +** [SQLITE_OK]. ** ** ^If the most recent call to [sqlite3_step(S)] for the ** [prepared statement] S indicated an error, then ** [sqlite3_reset(S)] returns an appropriate [error code]. +** ^The [sqlite3_reset(S)] interface might also return an [error code] +** if there were no prior errors but the process of resetting +** the prepared statement caused a new error. ^For example, if an +** [INSERT] statement with a [RETURNING] clause is only stepped one time, +** that one call to [sqlite3_step(S)] might return SQLITE_ROW but +** the overall statement might still fail and the [sqlite3_reset(S)] call +** might return SQLITE_BUSY if locking constraints prevent the +** database change from committing. Therefore, it is important that +** applications check the return code from [sqlite3_reset(S)] even if +** no prior call to [sqlite3_step(S)] indicated a problem. ** ** ^The [sqlite3_reset(S)] interface does not change the values ** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S. */ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); + /* ** CAPI3REF: Create Or Redefine SQL Functions ** KEYWORDS: {function creation routines} @@ -5736,7 +5887,7 @@ SQLITE_API int sqlite3_create_window_function( ** [application-defined SQL function] ** that has side-effects or that could potentially leak sensitive information. ** This will prevent attacks in which an application is tricked -** into using a database file that has had its schema surreptiously +** into using a database file that has had its schema surreptitiously ** modified to invoke the application-defined function in ways that are ** harmful. **

    @@ -5772,13 +5923,36 @@ SQLITE_API int sqlite3_create_window_function( ** ** ** [[SQLITE_SUBTYPE]]

    SQLITE_SUBTYPE
    -** The SQLITE_SUBTYPE flag indicates to SQLite that a function may call +** The SQLITE_SUBTYPE flag indicates to SQLite that a function might call ** [sqlite3_value_subtype()] to inspect the sub-types of its arguments. -** Specifying this flag makes no difference for scalar or aggregate user -** functions. However, if it is not specified for a user-defined window -** function, then any sub-types belonging to arguments passed to the window -** function may be discarded before the window function is called (i.e. -** sqlite3_value_subtype() will always return 0). +** This flag instructs SQLite to omit some corner-case optimizations that +** might disrupt the operation of the [sqlite3_value_subtype()] function, +** causing it to return zero rather than the correct subtype(). +** All SQL functions that invoke [sqlite3_value_subtype()] should have this +** property. If the SQLITE_SUBTYPE property is omitted, then the return +** value from [sqlite3_value_subtype()] might sometimes be zero even though +** a non-zero subtype was specified by the function argument expression. +** +** [[SQLITE_RESULT_SUBTYPE]]
    SQLITE_RESULT_SUBTYPE
    +** The SQLITE_RESULT_SUBTYPE flag indicates to SQLite that a function might call +** [sqlite3_result_subtype()] to cause a sub-type to be associated with its +** result. +** Every function that invokes [sqlite3_result_subtype()] should have this +** property. If it does not, then the call to [sqlite3_result_subtype()] +** might become a no-op if the function is used as term in an +** [expression index]. On the other hand, SQL functions that never invoke +** [sqlite3_result_subtype()] should avoid setting this property, as the +** purpose of this property is to disable certain optimizations that are +** incompatible with subtypes. +** +** [[SQLITE_SELFORDER1]]
    SQLITE_SELFORDER1
    +** The SQLITE_SELFORDER1 flag indicates that the function is an aggregate +** that internally orders the values provided to the first argument. The +** ordered-set aggregate SQL notation with a single ORDER BY term can be +** used to invoke this function. If the ordered-set aggregate notation is +** used on a function that lacks this flag, then an error is raised. Note +** that the ordered-set aggregate syntax is only available if SQLite is +** built using the -DSQLITE_ENABLE_ORDERED_SET_AGGREGATES compile-time option. **
    ** */ @@ -5786,6 +5960,8 @@ SQLITE_API int sqlite3_create_window_function( #define SQLITE_DIRECTONLY 0x000080000 #define SQLITE_SUBTYPE 0x000100000 #define SQLITE_INNOCUOUS 0x000200000 +#define SQLITE_RESULT_SUBTYPE 0x001000000 +#define SQLITE_SELFORDER1 0x002000000 /* ** CAPI3REF: Deprecated Functions @@ -5982,6 +6158,12 @@ SQLITE_API int sqlite3_value_encoding(sqlite3_value*); ** information can be used to pass a limited amount of context from ** one SQL function to another. Use the [sqlite3_result_subtype()] ** routine to set the subtype for the return value of an SQL function. +** +** Every [application-defined SQL function] that invokes this interface +** should include the [SQLITE_SUBTYPE] property in the text +** encoding argument when the function is [sqlite3_create_function|registered]. +** If the [SQLITE_SUBTYPE] property is omitted, then sqlite3_value_subtype() +** might return zero instead of the upstream subtype in some corner cases. */ SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*); @@ -6080,48 +6262,56 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); ** METHOD: sqlite3_context ** ** These functions may be used by (non-aggregate) SQL functions to -** associate metadata with argument values. If the same value is passed to -** multiple invocations of the same SQL function during query execution, under -** some circumstances the associated metadata may be preserved. An example -** of where this might be useful is in a regular-expression matching -** function. The compiled version of the regular expression can be stored as -** metadata associated with the pattern string. +** associate auxiliary data with argument values. If the same argument +** value is passed to multiple invocations of the same SQL function during +** query execution, under some circumstances the associated auxiliary data +** might be preserved. An example of where this might be useful is in a +** regular-expression matching function. The compiled version of the regular +** expression can be stored as auxiliary data associated with the pattern string. ** Then as long as the pattern string remains the same, ** the compiled regular expression can be reused on multiple ** invocations of the same function. ** -** ^The sqlite3_get_auxdata(C,N) interface returns a pointer to the metadata +** ^The sqlite3_get_auxdata(C,N) interface returns a pointer to the auxiliary data ** associated by the sqlite3_set_auxdata(C,N,P,X) function with the Nth argument ** value to the application-defined function. ^N is zero for the left-most -** function argument. ^If there is no metadata +** function argument. ^If there is no auxiliary data ** associated with the function argument, the sqlite3_get_auxdata(C,N) interface ** returns a NULL pointer. ** -** ^The sqlite3_set_auxdata(C,N,P,X) interface saves P as metadata for the N-th -** argument of the application-defined function. ^Subsequent +** ^The sqlite3_set_auxdata(C,N,P,X) interface saves P as auxiliary data for the +** N-th argument of the application-defined function. ^Subsequent ** calls to sqlite3_get_auxdata(C,N) return P from the most recent -** sqlite3_set_auxdata(C,N,P,X) call if the metadata is still valid or -** NULL if the metadata has been discarded. +** sqlite3_set_auxdata(C,N,P,X) call if the auxiliary data is still valid or +** NULL if the auxiliary data has been discarded. ** ^After each call to sqlite3_set_auxdata(C,N,P,X) where X is not NULL, ** SQLite will invoke the destructor function X with parameter P exactly -** once, when the metadata is discarded. -** SQLite is free to discard the metadata at any time, including:
      +** once, when the auxiliary data is discarded. +** SQLite is free to discard the auxiliary data at any time, including:
        **
      • ^(when the corresponding function parameter changes)^, or **
      • ^(when [sqlite3_reset()] or [sqlite3_finalize()] is called for the ** SQL statement)^, or **
      • ^(when sqlite3_set_auxdata() is invoked again on the same ** parameter)^, or **
      • ^(during the original sqlite3_set_auxdata() call when a memory -** allocation error occurs.)^
      +** allocation error occurs.)^ +**
    • ^(during the original sqlite3_set_auxdata() call if the function +** is evaluated during query planning instead of during query execution, +** as sometimes happens with [SQLITE_ENABLE_STAT4].)^
    ** -** Note the last bullet in particular. The destructor X in +** Note the last two bullets in particular. The destructor X in ** sqlite3_set_auxdata(C,N,P,X) might be called immediately, before the ** sqlite3_set_auxdata() interface even returns. Hence sqlite3_set_auxdata() ** should be called near the end of the function implementation and the ** function implementation should not make any use of P after -** sqlite3_set_auxdata() has been called. -** -** ^(In practice, metadata is preserved between function calls for +** sqlite3_set_auxdata() has been called. Furthermore, a call to +** sqlite3_get_auxdata() that occurs immediately after a corresponding call +** to sqlite3_set_auxdata() might still return NULL if an out-of-memory +** condition occurred during the sqlite3_set_auxdata() call or if the +** function is being evaluated during query planning rather than during +** query execution. +** +** ^(In practice, auxiliary data is preserved between function calls for ** function parameters that are compile-time constants, including literal ** values and [parameters] and expressions composed from the same.)^ ** @@ -6131,10 +6321,67 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); ** ** These routines must be called from the same thread in which ** the SQL function is running. +** +** See also: [sqlite3_get_clientdata()] and [sqlite3_set_clientdata()]. */ SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N); SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*)); +/* +** CAPI3REF: Database Connection Client Data +** METHOD: sqlite3 +** +** These functions are used to associate one or more named pointers +** with a [database connection]. +** A call to sqlite3_set_clientdata(D,N,P,X) causes the pointer P +** to be attached to [database connection] D using name N. Subsequent +** calls to sqlite3_get_clientdata(D,N) will return a copy of pointer P +** or a NULL pointer if there were no prior calls to +** sqlite3_set_clientdata() with the same values of D and N. +** Names are compared using strcmp() and are thus case sensitive. +** +** If P and X are both non-NULL, then the destructor X is invoked with +** argument P on the first of the following occurrences: +**
      +**
    • An out-of-memory error occurs during the call to +** sqlite3_set_clientdata() which attempts to register pointer P. +**
    • A subsequent call to sqlite3_set_clientdata(D,N,P,X) is made +** with the same D and N parameters. +**
    • The database connection closes. SQLite does not make any guarantees +** about the order in which destructors are called, only that all +** destructors will be called exactly once at some point during the +** database connection closing process. +**
    +** +** SQLite does not do anything with client data other than invoke +** destructors on the client data at the appropriate time. The intended +** use for client data is to provide a mechanism for wrapper libraries +** to store additional information about an SQLite database connection. +** +** There is no limit (other than available memory) on the number of different +** client data pointers (with different names) that can be attached to a +** single database connection. However, the implementation is optimized +** for the case of having only one or two different client data names. +** Applications and wrapper libraries are discouraged from using more than +** one client data name each. +** +** There is no way to enumerate the client data pointers +** associated with a database connection. The N parameter can be thought +** of as a secret key such that only code that knows the secret key is able +** to access the associated data. +** +** Security Warning: These interfaces should not be exposed in scripting +** languages or in other circumstances where it might be possible for an +** an attacker to invoke them. Any agent that can invoke these interfaces +** can probably also take control of the process. +** +** Database connection client data is only available for SQLite +** version 3.44.0 ([dateof:3.44.0]) and later. +** +** See also: [sqlite3_set_auxdata()] and [sqlite3_get_auxdata()]. +*/ +SQLITE_API void *sqlite3_get_clientdata(sqlite3*,const char*); +SQLITE_API int sqlite3_set_clientdata(sqlite3*, const char*, void*, void(*)(void*)); /* ** CAPI3REF: Constants Defining Special Destructor Behavior @@ -6336,6 +6583,20 @@ SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context*, sqlite3_uint64 n); ** higher order bits are discarded. ** The number of subtype bytes preserved by SQLite might increase ** in future releases of SQLite. +** +** Every [application-defined SQL function] that invokes this interface +** should include the [SQLITE_RESULT_SUBTYPE] property in its +** text encoding argument when the SQL function is +** [sqlite3_create_function|registered]. If the [SQLITE_RESULT_SUBTYPE] +** property is omitted from the function that invokes sqlite3_result_subtype(), +** then in some cases the sqlite3_result_subtype() might fail to set +** the result subtype. +** +** If SQLite is compiled with -DSQLITE_STRICT_SUBTYPE=1, then any +** SQL function that invokes the sqlite3_result_subtype() interface +** and that does not have the SQLITE_RESULT_SUBTYPE property will raise +** an error. Future versions of SQLite might enable -DSQLITE_STRICT_SUBTYPE=1 +** by default. */ SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int); @@ -6507,6 +6768,13 @@ SQLITE_API void sqlite3_activate_cerod( ** of the default VFS is not implemented correctly, or not implemented at ** all, then the behavior of sqlite3_sleep() may deviate from the description ** in the previous paragraphs. +** +** If a negative argument is passed to sqlite3_sleep() the results vary by +** VFS and operating system. Some system treat a negative argument as an +** instruction to sleep forever. Others understand it to mean do not sleep +** at all. ^In SQLite version 3.42.0 and later, a negative +** argument passed into sqlite3_sleep() is changed to zero before it is relayed +** down into the xSleep method of the VFS. */ SQLITE_API int sqlite3_sleep(int); @@ -6760,7 +7028,7 @@ SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName); SQLITE_API int sqlite3_txn_state(sqlite3*,const char *zSchema); /* -** CAPI3REF: Allowed return values from [sqlite3_txn_state()] +** CAPI3REF: Allowed return values from sqlite3_txn_state() ** KEYWORDS: {transaction state} ** ** These constants define the current transaction state of a database file. @@ -6892,7 +7160,7 @@ SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); ** ^Each call to the sqlite3_autovacuum_pages() interface overrides all ** previous invocations for that database connection. ^If the callback ** argument (C) to sqlite3_autovacuum_pages(D,C,P,X) is a NULL pointer, -** then the autovacuum steps callback is cancelled. The return value +** then the autovacuum steps callback is canceled. The return value ** from sqlite3_autovacuum_pages() is normally SQLITE_OK, but might ** be some other error code if something goes wrong. The current ** implementation will only return SQLITE_OK or SQLITE_MISUSE, but other @@ -6958,6 +7226,12 @@ SQLITE_API int sqlite3_autovacuum_pages( ** The exceptions defined in this paragraph might change in a future ** release of SQLite. ** +** Whether the update hook is invoked before or after the +** corresponding change is currently unspecified and may differ +** depending on the type of change. Do not rely on the order of the +** hook call with regards to the final result of the operation which +** triggers the hook. +** ** The update hook implementation must not do anything that will modify ** the database connection that invoked the update hook. Any actions ** to modify the database connection must be deferred until after the @@ -7411,6 +7685,10 @@ struct sqlite3_module { /* The methods above are in versions 1 and 2 of the sqlite_module object. ** Those below are for version 3 and greater. */ int (*xShadowName)(const char*); + /* The methods above are in versions 1 through 3 of the sqlite_module object. + ** Those below are for version 4 and greater. */ + int (*xIntegrity)(sqlite3_vtab *pVTab, const char *zSchema, + const char *zTabName, int mFlags, char **pzErr); }; /* @@ -7488,9 +7766,11 @@ struct sqlite3_module { ** will be returned by the strategy. ** ** The xBestIndex method may optionally populate the idxFlags field with a -** mask of SQLITE_INDEX_SCAN_* flags. Currently there is only one such flag - -** SQLITE_INDEX_SCAN_UNIQUE. If the xBestIndex method sets this flag, SQLite -** assumes that the strategy may visit at most one row. +** mask of SQLITE_INDEX_SCAN_* flags. One such flag is +** [SQLITE_INDEX_SCAN_HEX], which if set causes the [EXPLAIN QUERY PLAN] +** output to show the idxNum has hex instead of as decimal. Another flag is +** SQLITE_INDEX_SCAN_UNIQUE, which if set indicates that the query plan will +** return at most one row. ** ** Additionally, if xBestIndex sets the SQLITE_INDEX_SCAN_UNIQUE flag, then ** SQLite also assumes that if a call to the xUpdate() method is made as @@ -7554,7 +7834,9 @@ struct sqlite3_index_info { ** [sqlite3_index_info].idxFlags field to some combination of ** these bits. */ -#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */ +#define SQLITE_INDEX_SCAN_UNIQUE 0x00000001 /* Scan visits at most 1 row */ +#define SQLITE_INDEX_SCAN_HEX 0x00000002 /* Display idxNum as hex */ + /* in EXPLAIN QUERY PLAN */ /* ** CAPI3REF: Virtual Table Constraint Operator Codes @@ -7898,7 +8180,7 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); ** code is returned and the transaction rolled back. ** ** Calling this function with an argument that is not a NULL pointer or an -** open blob handle results in undefined behaviour. ^Calling this routine +** open blob handle results in undefined behavior. ^Calling this routine ** with a null pointer (such as would be returned by a failed call to ** [sqlite3_blob_open()]) is a harmless no-op. ^Otherwise, if this function ** is passed a valid open blob handle, the values returned by the @@ -8125,18 +8407,20 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); ** ** ^(Some systems (for example, Windows 95) do not support the operation ** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() -** will always return SQLITE_BUSY. The SQLite core only ever uses -** sqlite3_mutex_try() as an optimization so this is acceptable -** behavior.)^ +** will always return SQLITE_BUSY. In most cases the SQLite core only uses +** sqlite3_mutex_try() as an optimization, so this is acceptable +** behavior. The exceptions are unix builds that set the +** SQLITE_ENABLE_SETLK_TIMEOUT build option. In that case a working +** sqlite3_mutex_try() is required.)^ ** ** ^The sqlite3_mutex_leave() routine exits a mutex that was ** previously entered by the same thread. The behavior ** is undefined if the mutex is not currently entered by the ** calling thread or is not currently allocated. ** -** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or -** sqlite3_mutex_leave() is a NULL pointer, then all three routines -** behave as no-ops. +** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), +** sqlite3_mutex_leave(), or sqlite3_mutex_free() is a NULL pointer, +** then any of the four routines behaves as a no-op. ** ** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. */ @@ -8378,6 +8662,7 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_PRNG_SAVE 5 #define SQLITE_TESTCTRL_PRNG_RESTORE 6 #define SQLITE_TESTCTRL_PRNG_RESET 7 /* NOT USED */ +#define SQLITE_TESTCTRL_FK_NO_ACTION 7 #define SQLITE_TESTCTRL_BITVEC_TEST 8 #define SQLITE_TESTCTRL_FAULT_INSTALL 9 #define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 @@ -8385,8 +8670,10 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_ASSERT 12 #define SQLITE_TESTCTRL_ALWAYS 13 #define SQLITE_TESTCTRL_RESERVE 14 /* NOT USED */ +#define SQLITE_TESTCTRL_JSON_SELFCHECK 14 #define SQLITE_TESTCTRL_OPTIMIZATIONS 15 #define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */ +#define SQLITE_TESTCTRL_GETOPT 16 #define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */ #define SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 17 #define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 @@ -8406,7 +8693,8 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_TRACEFLAGS 31 #define SQLITE_TESTCTRL_TUNE 32 #define SQLITE_TESTCTRL_LOGEST 33 -#define SQLITE_TESTCTRL_LAST 33 /* Largest TESTCTRL */ +#define SQLITE_TESTCTRL_USELONGDOUBLE 34 /* NOT USED */ +#define SQLITE_TESTCTRL_LAST 34 /* Largest TESTCTRL */ /* ** CAPI3REF: SQL Keyword Checking @@ -8419,7 +8707,7 @@ SQLITE_API int sqlite3_test_control(int op, ...); ** The sqlite3_keyword_count() interface returns the number of distinct ** keywords understood by SQLite. ** -** The sqlite3_keyword_name(N,Z,L) interface finds the N-th keyword and +** The sqlite3_keyword_name(N,Z,L) interface finds the 0-based N-th keyword and ** makes *Z point to that keyword expressed as UTF8 and writes the number ** of bytes in the keyword into *L. The string that *Z points to is not ** zero-terminated. The sqlite3_keyword_name(N,Z,L) routine returns @@ -9381,6 +9669,16 @@ typedef struct sqlite3_backup sqlite3_backup; ** APIs are not strictly speaking threadsafe. If they are invoked at the ** same time as another thread is invoking sqlite3_backup_step() it is ** possible that they return invalid values. +** +** Alternatives To Using The Backup API +** +** Other techniques for safely creating a consistent backup of an SQLite +** database include: +** +**
      +**
    • The [VACUUM INTO] command. +**
    • The [sqlite3_rsync] utility program. +**
    */ SQLITE_API sqlite3_backup *sqlite3_backup_init( sqlite3 *pDest, /* Destination database handle */ @@ -9862,7 +10160,7 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); ** [[SQLITE_VTAB_DIRECTONLY]]
    SQLITE_VTAB_DIRECTONLY
    **
    Calls of the form ** [sqlite3_vtab_config](db,SQLITE_VTAB_DIRECTONLY) from within the -** the [xConnect] or [xCreate] methods of a [virtual table] implmentation +** the [xConnect] or [xCreate] methods of a [virtual table] implementation ** prohibits that virtual table from being used from within triggers and ** views. **
    @@ -9870,18 +10168,28 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); ** [[SQLITE_VTAB_INNOCUOUS]]
    SQLITE_VTAB_INNOCUOUS
    **
    Calls of the form ** [sqlite3_vtab_config](db,SQLITE_VTAB_INNOCUOUS) from within the -** the [xConnect] or [xCreate] methods of a [virtual table] implmentation +** the [xConnect] or [xCreate] methods of a [virtual table] implementation ** identify that virtual table as being safe to use from within triggers ** and views. Conceptually, the SQLITE_VTAB_INNOCUOUS tag means that the ** virtual table can do no serious harm even if it is controlled by a ** malicious hacker. Developers should avoid setting the SQLITE_VTAB_INNOCUOUS ** flag unless absolutely necessary. **
    +** +** [[SQLITE_VTAB_USES_ALL_SCHEMAS]]
    SQLITE_VTAB_USES_ALL_SCHEMAS
    +**
    Calls of the form +** [sqlite3_vtab_config](db,SQLITE_VTAB_USES_ALL_SCHEMA) from within the +** the [xConnect] or [xCreate] methods of a [virtual table] implementation +** instruct the query planner to begin at least a read transaction on +** all schemas ("main", "temp", and any ATTACH-ed databases) whenever the +** virtual table is used. +**
    ** */ #define SQLITE_VTAB_CONSTRAINT_SUPPORT 1 #define SQLITE_VTAB_INNOCUOUS 2 #define SQLITE_VTAB_DIRECTONLY 3 +#define SQLITE_VTAB_USES_ALL_SCHEMAS 4 /* ** CAPI3REF: Determine The Virtual Table Conflict Policy @@ -9988,24 +10296,45 @@ SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info*,int); **
  • ** ^(If the sqlite3_vtab_distinct() interface returns 2, that means ** that the query planner does not need the rows returned in any particular -** order, as long as rows with the same values in all "aOrderBy" columns -** are adjacent.)^ ^(Furthermore, only a single row for each particular -** combination of values in the columns identified by the "aOrderBy" field -** needs to be returned.)^ ^It is always ok for two or more rows with the same -** values in all "aOrderBy" columns to be returned, as long as all such rows -** are adjacent. ^The virtual table may, if it chooses, omit extra rows -** that have the same value for all columns identified by "aOrderBy". -** ^However omitting the extra rows is optional. +** order, as long as rows with the same values in all columns identified +** by "aOrderBy" are adjacent.)^ ^(Furthermore, when two or more rows +** contain the same values for all columns identified by "colUsed", all but +** one such row may optionally be omitted from the result.)^ +** The virtual table is not required to omit rows that are duplicates +** over the "colUsed" columns, but if the virtual table can do that without +** too much extra effort, it could potentially help the query to run faster. ** This mode is used for a DISTINCT query. **

  • -** ^(If the sqlite3_vtab_distinct() interface returns 3, that means -** that the query planner needs only distinct rows but it does need the -** rows to be sorted.)^ ^The virtual table implementation is free to omit -** rows that are identical in all aOrderBy columns, if it wants to, but -** it is not required to omit any rows. This mode is used for queries +** ^(If the sqlite3_vtab_distinct() interface returns 3, that means the +** virtual table must return rows in the order defined by "aOrderBy" as +** if the sqlite3_vtab_distinct() interface had returned 0. However if +** two or more rows in the result have the same values for all columns +** identified by "colUsed", then all but one such row may optionally be +** omitted.)^ Like when the return value is 2, the virtual table +** is not required to omit rows that are duplicates over the "colUsed" +** columns, but if the virtual table can do that without +** too much extra effort, it could potentially help the query to run faster. +** This mode is used for queries ** that have both DISTINCT and ORDER BY clauses. ** ** +**

    The following table summarizes the conditions under which the +** virtual table is allowed to set the "orderByConsumed" flag based on +** the value returned by sqlite3_vtab_distinct(). This table is a +** restatement of the previous four paragraphs: +** +** +** +**
    sqlite3_vtab_distinct() return value +** Rows are returned in aOrderBy order +** Rows with the same value in all aOrderBy columns are adjacent +** Duplicates over all colUsed columns may be omitted +**
    0yesyesno +**
    1noyesno +**
    2noyesyes +**
    3yesyesyes +**
    +** ** ^For the purposes of comparing virtual table output values to see if the ** values are same value for sorting purposes, two NULL values are considered ** to be the same. In other words, the comparison operator is "IS" @@ -10042,7 +10371,7 @@ SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info*); ** communicated to the xBestIndex method as a ** [SQLITE_INDEX_CONSTRAINT_EQ] constraint.)^ If xBestIndex wants to use ** this constraint, it must set the corresponding -** aConstraintUsage[].argvIndex to a postive integer. ^(Then, under +** aConstraintUsage[].argvIndex to a positive integer. ^(Then, under ** the usual mode of handling IN operators, SQLite generates [bytecode] ** that invokes the [xFilter|xFilter() method] once for each value ** on the right-hand side of the IN operator.)^ Thus the virtual table @@ -10471,7 +10800,7 @@ SQLITE_API int sqlite3_db_cacheflush(sqlite3*); ** When the [sqlite3_blob_write()] API is used to update a blob column, ** the pre-update hook is invoked with SQLITE_DELETE. This is because the ** in this case the new values are not available. In this case, when a -** callback made with op==SQLITE_DELETE is actuall a write using the +** callback made with op==SQLITE_DELETE is actually a write using the ** sqlite3_blob_write() API, the [sqlite3_preupdate_blobwrite()] returns ** the index of the column being written. In other cases, where the ** pre-update hook is being invoked for some other reason, including a @@ -10549,6 +10878,14 @@ typedef struct sqlite3_snapshot { ** If there is not already a read-transaction open on schema S when ** this function is called, one is opened automatically. ** +** If a read-transaction is opened by this function, then it is guaranteed +** that the returned snapshot object may not be invalidated by a database +** writer or checkpointer until after the read-transaction is closed. This +** is not guaranteed if a read-transaction is already open when this +** function is called. In that case, any subsequent write or checkpoint +** operation on the database may invalidate the returned snapshot handle, +** even while the read-transaction remains open. +** ** The following must be true for this function to succeed. If any of ** the following statements are false when sqlite3_snapshot_get() is ** called, SQLITE_ERROR is returned. The final value of *P is undefined @@ -10732,6 +11069,13 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const c ** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy ** of the database exists. ** +** After the call, if the SQLITE_SERIALIZE_NOCOPY bit had been set, +** the returned buffer content will remain accessible and unchanged +** until either the next write operation on the connection or when +** the connection is closed, and applications must not modify the +** buffer. If the bit had been clear, the returned buffer will not +** be accessed by SQLite after the call. +** ** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the ** SQLITE_SERIALIZE_NOCOPY bit is omitted from argument F if a memory ** allocation error occurs. @@ -10780,6 +11124,9 @@ SQLITE_API unsigned char *sqlite3_serialize( ** SQLite will try to increase the buffer size using sqlite3_realloc64() ** if writes on the database cause it to grow larger than M bytes. ** +** Applications must not modify the buffer P or invalidate it before +** the database connection D is closed. +** ** The sqlite3_deserialize() interface will fail with SQLITE_BUSY if the ** database is currently in a read transaction or is involved in a backup ** operation. @@ -10788,6 +11135,13 @@ SQLITE_API unsigned char *sqlite3_serialize( ** S argument to sqlite3_deserialize(D,S,P,N,M,F) is "temp" then the ** function returns SQLITE_ERROR. ** +** The deserialized database should not be in [WAL mode]. If the database +** is in WAL mode, then any attempt to use the database file will result +** in an [SQLITE_CANTOPEN] error. The application can set the +** [file format version numbers] (bytes 18 and 19) of the input database P +** to 0x01 prior to invoking sqlite3_deserialize(D,S,P,N,M,F) to force the +** database file into rollback mode and work around this limitation. +** ** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the ** SQLITE_DESERIALIZE_FREEONCLOSE bit is set in argument F, then ** [sqlite3_free()] is invoked on argument P prior to returning. @@ -10840,8 +11194,6 @@ SQLITE_API int sqlite3_deserialize( #if defined(__wasi__) # undef SQLITE_WASI # define SQLITE_WASI 1 -# undef SQLITE_OMIT_WAL -# define SQLITE_OMIT_WAL 1/* because it requires shared memory APIs */ # ifndef SQLITE_OMIT_LOAD_EXTENSION # define SQLITE_OMIT_LOAD_EXTENSION # endif @@ -11056,16 +11408,20 @@ SQLITE_API int sqlite3session_create( SQLITE_API void sqlite3session_delete(sqlite3_session *pSession); /* -** CAPIREF: Conigure a Session Object +** CAPI3REF: Configure a Session Object ** METHOD: sqlite3_session ** ** This method is used to configure a session object after it has been -** created. At present the only valid value for the second parameter is -** [SQLITE_SESSION_OBJCONFIG_SIZE]. +** created. At present the only valid values for the second parameter are +** [SQLITE_SESSION_OBJCONFIG_SIZE] and [SQLITE_SESSION_OBJCONFIG_ROWID]. ** -** Arguments for sqlite3session_object_config() +*/ +SQLITE_API int sqlite3session_object_config(sqlite3_session*, int op, void *pArg); + +/* +** CAPI3REF: Options for sqlite3session_object_config ** -** The following values may passed as the the 4th parameter to +** The following values may passed as the the 2nd parameter to ** sqlite3session_object_config(). ** **

    SQLITE_SESSION_OBJCONFIG_SIZE
    @@ -11081,12 +11437,21 @@ SQLITE_API void sqlite3session_delete(sqlite3_session *pSession); ** ** It is an error (SQLITE_MISUSE) to attempt to modify this setting after ** the first table has been attached to the session object. +** +**
    SQLITE_SESSION_OBJCONFIG_ROWID
    +** This option is used to set, clear or query the flag that enables +** collection of data for tables with no explicit PRIMARY KEY. +** +** Normally, tables with no explicit PRIMARY KEY are simply ignored +** by the sessions module. However, if this flag is set, it behaves +** as if such tables have a column "_rowid_ INTEGER PRIMARY KEY" inserted +** as their leftmost columns. +** +** It is an error (SQLITE_MISUSE) to attempt to modify this setting after +** the first table has been attached to the session object. */ -SQLITE_API int sqlite3session_object_config(sqlite3_session*, int op, void *pArg); - -/* -*/ -#define SQLITE_SESSION_OBJCONFIG_SIZE 1 +#define SQLITE_SESSION_OBJCONFIG_SIZE 1 +#define SQLITE_SESSION_OBJCONFIG_ROWID 2 /* ** CAPI3REF: Enable Or Disable A Session Object @@ -11847,6 +12212,18 @@ SQLITE_API int sqlite3changeset_concat( ); +/* +** CAPI3REF: Upgrade the Schema of a Changeset/Patchset +*/ +SQLITE_API int sqlite3changeset_upgrade( + sqlite3 *db, + const char *zDb, + int nIn, const void *pIn, /* Input changeset */ + int *pnOut, void **ppOut /* OUT: Inverse of input */ +); + + + /* ** CAPI3REF: Changegroup Handle ** @@ -11893,6 +12270,38 @@ typedef struct sqlite3_changegroup sqlite3_changegroup; */ SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); +/* +** CAPI3REF: Add a Schema to a Changegroup +** METHOD: sqlite3_changegroup_schema +** +** This method may be used to optionally enforce the rule that the changesets +** added to the changegroup handle must match the schema of database zDb +** ("main", "temp", or the name of an attached database). If +** sqlite3changegroup_add() is called to add a changeset that is not compatible +** with the configured schema, SQLITE_SCHEMA is returned and the changegroup +** object is left in an undefined state. +** +** A changeset schema is considered compatible with the database schema in +** the same way as for sqlite3changeset_apply(). Specifically, for each +** table in the changeset, there exists a database table with: +** +**
      +**
    • The name identified by the changeset, and +**
    • at least as many columns as recorded in the changeset, and +**
    • the primary key columns in the same position as recorded in +** the changeset. +**
    +** +** The output of the changegroup object always has the same schema as the +** database nominated using this function. In cases where changesets passed +** to sqlite3changegroup_add() have fewer columns than the corresponding table +** in the database schema, these are filled in using the default column +** values from the database schema. This makes it possible to combined +** changesets that have different numbers of columns for a single table +** within a changegroup, provided that they are otherwise compatible. +*/ +SQLITE_API int sqlite3changegroup_schema(sqlite3_changegroup*, sqlite3*, const char *zDb); + /* ** CAPI3REF: Add A Changeset To A Changegroup ** METHOD: sqlite3_changegroup @@ -11961,16 +12370,45 @@ SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); ** If the new changeset contains changes to a table that is already present ** in the changegroup, then the number of columns and the position of the ** primary key columns for the table must be consistent. If this is not the -** case, this function fails with SQLITE_SCHEMA. If the input changeset -** appears to be corrupt and the corruption is detected, SQLITE_CORRUPT is -** returned. Or, if an out-of-memory condition occurs during processing, this -** function returns SQLITE_NOMEM. In all cases, if an error occurs the state -** of the final contents of the changegroup is undefined. +** case, this function fails with SQLITE_SCHEMA. Except, if the changegroup +** object has been configured with a database schema using the +** sqlite3changegroup_schema() API, then it is possible to combine changesets +** with different numbers of columns for a single table, provided that +** they are otherwise compatible. ** -** If no error occurs, SQLITE_OK is returned. +** If the input changeset appears to be corrupt and the corruption is +** detected, SQLITE_CORRUPT is returned. Or, if an out-of-memory condition +** occurs during processing, this function returns SQLITE_NOMEM. +** +** In all cases, if an error occurs the state of the final contents of the +** changegroup is undefined. If no error occurs, SQLITE_OK is returned. */ SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pData); +/* +** CAPI3REF: Add A Single Change To A Changegroup +** METHOD: sqlite3_changegroup +** +** This function adds the single change currently indicated by the iterator +** passed as the second argument to the changegroup object. The rules for +** adding the change are just as described for [sqlite3changegroup_add()]. +** +** If the change is successfully added to the changegroup, SQLITE_OK is +** returned. Otherwise, an SQLite error code is returned. +** +** The iterator must point to a valid entry when this function is called. +** If it does not, SQLITE_ERROR is returned and no change is added to the +** changegroup. Additionally, the iterator must not have been opened with +** the SQLITE_CHANGESETAPPLY_INVERT flag. In this case SQLITE_ERROR is also +** returned. +*/ +SQLITE_API int sqlite3changegroup_add_change( + sqlite3_changegroup*, + sqlite3_changeset_iter* +); + + + /* ** CAPI3REF: Obtain A Composite Changeset From A Changegroup ** METHOD: sqlite3_changegroup @@ -12219,9 +12657,30 @@ SQLITE_API int sqlite3changeset_apply_v2( ** Invert the changeset before applying it. This is equivalent to inverting ** a changeset using sqlite3changeset_invert() before applying it. It is ** an error to specify this flag with a patchset. +** +**
    SQLITE_CHANGESETAPPLY_IGNORENOOP
    +** Do not invoke the conflict handler callback for any changes that +** would not actually modify the database even if they were applied. +** Specifically, this means that the conflict handler is not invoked +** for: +**
      +**
    • a delete change if the row being deleted cannot be found, +**
    • an update change if the modified fields are already set to +** their new values in the conflicting row, or +**
    • an insert change if all fields of the conflicting row match +** the row being inserted. +**
    +** +**
    SQLITE_CHANGESETAPPLY_FKNOACTION
    +** If this flag it set, then all foreign key constraints in the target +** database behave as if they were declared with "ON UPDATE NO ACTION ON +** DELETE NO ACTION", even if they are actually CASCADE, RESTRICT, SET NULL +** or SET DEFAULT. */ #define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001 #define SQLITE_CHANGESETAPPLY_INVERT 0x0002 +#define SQLITE_CHANGESETAPPLY_IGNORENOOP 0x0004 +#define SQLITE_CHANGESETAPPLY_FKNOACTION 0x0008 /* ** CAPI3REF: Constants Passed To The Conflict Handler @@ -12754,8 +13213,8 @@ struct Fts5PhraseIter { ** EXTENSION API FUNCTIONS ** ** xUserData(pFts): -** Return a copy of the context pointer the extension function was -** registered with. +** Return a copy of the pUserData pointer passed to the xCreateFunction() +** API when the extension function was registered. ** ** xColumnTotalSize(pFts, iCol, pnToken): ** If parameter iCol is less than zero, set output variable *pnToken @@ -12787,8 +13246,11 @@ struct Fts5PhraseIter { ** created with the "columnsize=0" option. ** ** xColumnText: -** This function attempts to retrieve the text of column iCol of the -** current document. If successful, (*pz) is set to point to a buffer +** If parameter iCol is less than zero, or greater than or equal to the +** number of columns in the table, SQLITE_RANGE is returned. +** +** Otherwise, this function attempts to retrieve the text of column iCol of +** the current document. If successful, (*pz) is set to point to a buffer ** containing the text in utf-8 encoding, (*pn) is set to the size in bytes ** (not characters) of the buffer and SQLITE_OK is returned. Otherwise, ** if an error occurs, an SQLite error code is returned and the final values @@ -12798,8 +13260,10 @@ struct Fts5PhraseIter { ** Returns the number of phrases in the current query expression. ** ** xPhraseSize: -** Returns the number of tokens in phrase iPhrase of the query. Phrases -** are numbered starting from zero. +** If parameter iCol is less than zero, or greater than or equal to the +** number of phrases in the current query, as returned by xPhraseCount, +** 0 is returned. Otherwise, this function returns the number of tokens in +** phrase iPhrase of the query. Phrases are numbered starting from zero. ** ** xInstCount: ** Set *pnInst to the total number of occurrences of all phrases within @@ -12815,12 +13279,13 @@ struct Fts5PhraseIter { ** Query for the details of phrase match iIdx within the current row. ** Phrase matches are numbered starting from zero, so the iIdx argument ** should be greater than or equal to zero and smaller than the value -** output by xInstCount(). +** output by xInstCount(). If iIdx is less than zero or greater than +** or equal to the value returned by xInstCount(), SQLITE_RANGE is returned. ** -** Usually, output parameter *piPhrase is set to the phrase number, *piCol +** Otherwise, output parameter *piPhrase is set to the phrase number, *piCol ** to the column in which it occurs and *piOff the token offset of the -** first token of the phrase. Returns SQLITE_OK if successful, or an error -** code (i.e. SQLITE_NOMEM) if an error occurs. +** first token of the phrase. SQLITE_OK is returned if successful, or an +** error code (i.e. SQLITE_NOMEM) if an error occurs. ** ** This API can be quite slow if used with an FTS5 table created with the ** "detail=none" or "detail=column" option. @@ -12846,6 +13311,10 @@ struct Fts5PhraseIter { ** Invoking Api.xUserData() returns a copy of the pointer passed as ** the third argument to pUserData. ** +** If parameter iPhrase is less than zero, or greater than or equal to +** the number of phrases in the query, as returned by xPhraseCount(), +** this function returns SQLITE_RANGE. +** ** If the callback function returns any value other than SQLITE_OK, the ** query is abandoned and the xQueryPhrase function returns immediately. ** If the returned value is SQLITE_DONE, xQueryPhrase returns SQLITE_OK. @@ -12927,6 +13396,10 @@ struct Fts5PhraseIter { ** (i.e. if it is a contentless table), then this API always iterates ** through an empty set (all calls to xPhraseFirst() set iCol to -1). ** +** In all cases, matches are visited in (column ASC, offset ASC) order. +** i.e. all those in column 0, sorted by offset, followed by those in +** column 1, etc. +** ** xPhraseNext() ** See xPhraseFirst above. ** @@ -12960,9 +13433,65 @@ struct Fts5PhraseIter { ** ** xPhraseNextColumn() ** See xPhraseFirstColumn above. +** +** xQueryToken(pFts5, iPhrase, iToken, ppToken, pnToken) +** This is used to access token iToken of phrase iPhrase of the current +** query. Before returning, output parameter *ppToken is set to point +** to a buffer containing the requested token, and *pnToken to the +** size of this buffer in bytes. +** +** If iPhrase or iToken are less than zero, or if iPhrase is greater than +** or equal to the number of phrases in the query as reported by +** xPhraseCount(), or if iToken is equal to or greater than the number of +** tokens in the phrase, SQLITE_RANGE is returned and *ppToken and *pnToken + are both zeroed. +** +** The output text is not a copy of the query text that specified the +** token. It is the output of the tokenizer module. For tokendata=1 +** tables, this includes any embedded 0x00 and trailing data. +** +** xInstToken(pFts5, iIdx, iToken, ppToken, pnToken) +** This is used to access token iToken of phrase hit iIdx within the +** current row. If iIdx is less than zero or greater than or equal to the +** value returned by xInstCount(), SQLITE_RANGE is returned. Otherwise, +** output variable (*ppToken) is set to point to a buffer containing the +** matching document token, and (*pnToken) to the size of that buffer in +** bytes. This API is not available if the specified token matches a +** prefix query term. In that case both output variables are always set +** to 0. +** +** The output text is not a copy of the document text that was tokenized. +** It is the output of the tokenizer module. For tokendata=1 tables, this +** includes any embedded 0x00 and trailing data. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. +** +** xColumnLocale(pFts5, iIdx, pzLocale, pnLocale) +** If parameter iCol is less than zero, or greater than or equal to the +** number of columns in the table, SQLITE_RANGE is returned. +** +** Otherwise, this function attempts to retrieve the locale associated +** with column iCol of the current row. Usually, there is no associated +** locale, and output parameters (*pzLocale) and (*pnLocale) are set +** to NULL and 0, respectively. However, if the fts5_locale() function +** was used to associate a locale with the value when it was inserted +** into the fts5 table, then (*pzLocale) is set to point to a nul-terminated +** buffer containing the name of the locale in utf-8 encoding. (*pnLocale) +** is set to the size in bytes of the buffer, not including the +** nul-terminator. +** +** If successful, SQLITE_OK is returned. Or, if an error occurs, an +** SQLite error code is returned. The final value of the output parameters +** is undefined in this case. +** +** xTokenize_v2: +** Tokenize text using the tokenizer belonging to the FTS5 table. This +** API is the same as the xTokenize() API, except that it allows a tokenizer +** locale to be specified. */ struct Fts5ExtensionApi { - int iVersion; /* Currently always set to 3 */ + int iVersion; /* Currently always set to 4 */ void *(*xUserData)(Fts5Context*); @@ -12997,6 +13526,22 @@ struct Fts5ExtensionApi { int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*); void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol); + + /* Below this point are iVersion>=3 only */ + int (*xQueryToken)(Fts5Context*, + int iPhrase, int iToken, + const char **ppToken, int *pnToken + ); + int (*xInstToken)(Fts5Context*, int iIdx, int iToken, const char**, int*); + + /* Below this point are iVersion>=4 only */ + int (*xColumnLocale)(Fts5Context*, int iCol, const char **pz, int *pn); + int (*xTokenize_v2)(Fts5Context*, + const char *pText, int nText, /* Text to tokenize */ + const char *pLocale, int nLocale, /* Locale to pass to tokenizer */ + void *pCtx, /* Context passed to xToken() */ + int (*xToken)(void*, int, const char*, int, int, int) /* Callback */ + ); }; /* @@ -13017,7 +13562,7 @@ struct Fts5ExtensionApi { ** A tokenizer instance is required to actually tokenize text. ** ** The first argument passed to this function is a copy of the (void*) -** pointer provided by the application when the fts5_tokenizer object +** pointer provided by the application when the fts5_tokenizer_v2 object ** was registered with FTS5 (the third argument to xCreateTokenizer()). ** The second and third arguments are an array of nul-terminated strings ** containing the tokenizer arguments, if any, specified following the @@ -13041,7 +13586,7 @@ struct Fts5ExtensionApi { ** argument passed to this function is a pointer to an Fts5Tokenizer object ** returned by an earlier call to xCreate(). ** -** The second argument indicates the reason that FTS5 is requesting +** The third argument indicates the reason that FTS5 is requesting ** tokenization of the supplied text. This is always one of the following ** four values: ** @@ -13065,6 +13610,13 @@ struct Fts5ExtensionApi { ** on a columnsize=0 database. ** ** +** The sixth and seventh arguments passed to xTokenize() - pLocale and +** nLocale - are a pointer to a buffer containing the locale to use for +** tokenization (e.g. "en_US") and its size in bytes, respectively. The +** pLocale buffer is not nul-terminated. pLocale may be passed NULL (in +** which case nLocale is always 0) to indicate that the tokenizer should +** use its default locale. +** ** For each token in the input string, the supplied callback xToken() must ** be invoked. The first argument to it should be a copy of the pointer ** passed as the second argument to xTokenize(). The third and fourth @@ -13088,6 +13640,30 @@ struct Fts5ExtensionApi { ** may abandon the tokenization and return any error code other than ** SQLITE_OK or SQLITE_DONE. ** +** If the tokenizer is registered using an fts5_tokenizer_v2 object, +** then the xTokenize() method has two additional arguments - pLocale +** and nLocale. These specify the locale that the tokenizer should use +** for the current request. If pLocale and nLocale are both 0, then the +** tokenizer should use its default locale. Otherwise, pLocale points to +** an nLocale byte buffer containing the name of the locale to use as utf-8 +** text. pLocale is not nul-terminated. +** +** FTS5_TOKENIZER +** +** There is also an fts5_tokenizer object. This is an older, deprecated, +** version of fts5_tokenizer_v2. It is similar except that: +** +**
      +**
    • There is no "iVersion" field, and +**
    • The xTokenize() method does not take a locale argument. +**
    +** +** Legacy fts5_tokenizer tokenizers must be registered using the +** legacy xCreateTokenizer() function, instead of xCreateTokenizer_v2(). +** +** Tokenizer implementations registered using either API may be retrieved +** using both xFindTokenizer() and xFindTokenizer_v2(). +** ** SYNONYM SUPPORT ** ** Custom tokenizers may also support synonyms. Consider a case in which a @@ -13191,11 +13767,38 @@ struct Fts5ExtensionApi { ** as separate queries of the FTS index are required for each synonym. ** ** When using methods (2) or (3), it is important that the tokenizer only -** provide synonyms when tokenizing document text (method (2)) or query -** text (method (3)), not both. Doing so will not cause any errors, but is +** provide synonyms when tokenizing document text (method (3)) or query +** text (method (2)), not both. Doing so will not cause any errors, but is ** inefficient. */ typedef struct Fts5Tokenizer Fts5Tokenizer; +typedef struct fts5_tokenizer_v2 fts5_tokenizer_v2; +struct fts5_tokenizer_v2 { + int iVersion; /* Currently always 2 */ + + int (*xCreate)(void*, const char **azArg, int nArg, Fts5Tokenizer **ppOut); + void (*xDelete)(Fts5Tokenizer*); + int (*xTokenize)(Fts5Tokenizer*, + void *pCtx, + int flags, /* Mask of FTS5_TOKENIZE_* flags */ + const char *pText, int nText, + const char *pLocale, int nLocale, + int (*xToken)( + void *pCtx, /* Copy of 2nd argument to xTokenize() */ + int tflags, /* Mask of FTS5_TOKEN_* flags */ + const char *pToken, /* Pointer to buffer containing token */ + int nToken, /* Size of token in bytes */ + int iStart, /* Byte offset of token within input text */ + int iEnd /* Byte offset of end of token within input text */ + ) + ); +}; + +/* +** New code should use the fts5_tokenizer_v2 type to define tokenizer +** implementations. The following type is included for legacy applications +** that still use it. +*/ typedef struct fts5_tokenizer fts5_tokenizer; struct fts5_tokenizer { int (*xCreate)(void*, const char **azArg, int nArg, Fts5Tokenizer **ppOut); @@ -13215,6 +13818,7 @@ struct fts5_tokenizer { ); }; + /* Flags that may be passed as the third argument to xTokenize() */ #define FTS5_TOKENIZE_QUERY 0x0001 #define FTS5_TOKENIZE_PREFIX 0x0002 @@ -13234,13 +13838,13 @@ struct fts5_tokenizer { */ typedef struct fts5_api fts5_api; struct fts5_api { - int iVersion; /* Currently always set to 2 */ + int iVersion; /* Currently always set to 3 */ /* Create a new tokenizer */ int (*xCreateTokenizer)( fts5_api *pApi, const char *zName, - void *pContext, + void *pUserData, fts5_tokenizer *pTokenizer, void (*xDestroy)(void*) ); @@ -13249,7 +13853,7 @@ struct fts5_api { int (*xFindTokenizer)( fts5_api *pApi, const char *zName, - void **ppContext, + void **ppUserData, fts5_tokenizer *pTokenizer ); @@ -13257,10 +13861,29 @@ struct fts5_api { int (*xCreateFunction)( fts5_api *pApi, const char *zName, - void *pContext, + void *pUserData, fts5_extension_function xFunction, void (*xDestroy)(void*) ); + + /* APIs below this point are only available if iVersion>=3 */ + + /* Create a new tokenizer */ + int (*xCreateTokenizer_v2)( + fts5_api *pApi, + const char *zName, + void *pUserData, + fts5_tokenizer_v2 *pTokenizer, + void (*xDestroy)(void*) + ); + + /* Find an existing tokenizer */ + int (*xFindTokenizer_v2)( + fts5_api *pApi, + const char *zName, + void **ppUserData, + fts5_tokenizer_v2 **ppTokenizer + ); }; /* @@ -13368,7 +13991,7 @@ struct fts5_api { ** level of recursion for each term. A stack overflow can result ** if the number of terms is too large. In practice, most SQL ** never has more than 3 or 4 terms. Use a value of 0 to disable -** any limit on the number of terms in a compount SELECT. +** any limit on the number of terms in a compound SELECT. */ #ifndef SQLITE_MAX_COMPOUND_SELECT # define SQLITE_MAX_COMPOUND_SELECT 500 @@ -13483,7 +14106,7 @@ struct fts5_api { ** max_page_count macro. */ #ifndef SQLITE_MAX_PAGE_COUNT -# define SQLITE_MAX_PAGE_COUNT 1073741823 +# define SQLITE_MAX_PAGE_COUNT 0xfffffffe /* 4294967294 */ #endif /* @@ -13518,8 +14141,8 @@ struct fts5_api { #endif /* -** WAL mode depends on atomic aligned 32-bit loads and stores in a few -** places. The following macros try to make this explicit. +** A few places in the code require atomic load/store of aligned +** integer values. */ #ifndef __has_extension # define __has_extension(x) 0 /* compatibility with non-clang compilers */ @@ -13575,15 +14198,22 @@ struct fts5_api { #endif /* -** A macro to hint to the compiler that a function should not be +** Macros to hint to the compiler that a function should or should not be ** inlined. */ #if defined(__GNUC__) # define SQLITE_NOINLINE __attribute__((noinline)) +# define SQLITE_INLINE __attribute__((always_inline)) inline #elif defined(_MSC_VER) && _MSC_VER>=1310 # define SQLITE_NOINLINE __declspec(noinline) +# define SQLITE_INLINE __forceinline #else # define SQLITE_NOINLINE +# define SQLITE_INLINE +#endif +#if defined(SQLITE_COVERAGE_TEST) || defined(__STRICT_ANSI__) +# undef SQLITE_INLINE +# define SQLITE_INLINE #endif /* @@ -13605,6 +14235,29 @@ struct fts5_api { # endif #endif +/* +** Enable SQLITE_USE_SEH by default on MSVC builds. Only omit +** SEH support if the -DSQLITE_OMIT_SEH option is given. +*/ +#if defined(_MSC_VER) && !defined(SQLITE_OMIT_SEH) +# define SQLITE_USE_SEH 1 +#else +# undef SQLITE_USE_SEH +#endif + +/* +** Enable SQLITE_DIRECT_OVERFLOW_READ, unless the build explicitly +** disables it using -DSQLITE_DIRECT_OVERFLOW_READ=0 +*/ +#if defined(SQLITE_DIRECT_OVERFLOW_READ) && SQLITE_DIRECT_OVERFLOW_READ+1==1 + /* Disable if -DSQLITE_DIRECT_OVERFLOW_READ=0 */ +# undef SQLITE_DIRECT_OVERFLOW_READ +#else + /* In all other cases, enable */ +# define SQLITE_DIRECT_OVERFLOW_READ 1 +#endif + + /* ** The SQLITE_THREADSAFE macro must be defined as 0, 1, or 2. ** 0 means mutexes are permanently disable and the library is never @@ -13873,6 +14526,8 @@ struct fts5_api { # define SQLITE_OMIT_ALTERTABLE #endif +#define SQLITE_DIGIT_SEPARATOR '_' + /* ** Return true (non-zero) if the input is an integer that is too large ** to fit in 32-bits. This macro is used inside of various testcase() @@ -14038,135 +14693,135 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); #define TK_OR 43 #define TK_AND 44 #define TK_IS 45 -#define TK_MATCH 46 -#define TK_LIKE_KW 47 -#define TK_BETWEEN 48 -#define TK_IN 49 -#define TK_ISNULL 50 -#define TK_NOTNULL 51 -#define TK_NE 52 -#define TK_EQ 53 -#define TK_GT 54 -#define TK_LE 55 -#define TK_LT 56 -#define TK_GE 57 -#define TK_ESCAPE 58 -#define TK_ID 59 -#define TK_COLUMNKW 60 -#define TK_DO 61 -#define TK_FOR 62 -#define TK_IGNORE 63 -#define TK_INITIALLY 64 -#define TK_INSTEAD 65 -#define TK_NO 66 -#define TK_KEY 67 -#define TK_OF 68 -#define TK_OFFSET 69 -#define TK_PRAGMA 70 -#define TK_RAISE 71 -#define TK_RECURSIVE 72 -#define TK_REPLACE 73 -#define TK_RESTRICT 74 -#define TK_ROW 75 -#define TK_ROWS 76 -#define TK_TRIGGER 77 -#define TK_VACUUM 78 -#define TK_VIEW 79 -#define TK_VIRTUAL 80 -#define TK_WITH 81 -#define TK_NULLS 82 -#define TK_FIRST 83 -#define TK_LAST 84 -#define TK_CURRENT 85 -#define TK_FOLLOWING 86 -#define TK_PARTITION 87 -#define TK_PRECEDING 88 -#define TK_RANGE 89 -#define TK_UNBOUNDED 90 -#define TK_EXCLUDE 91 -#define TK_GROUPS 92 -#define TK_OTHERS 93 -#define TK_TIES 94 -#define TK_GENERATED 95 -#define TK_ALWAYS 96 -#define TK_MATERIALIZED 97 -#define TK_REINDEX 98 -#define TK_RENAME 99 -#define TK_CTIME_KW 100 -#define TK_ANY 101 -#define TK_BITAND 102 -#define TK_BITOR 103 -#define TK_LSHIFT 104 -#define TK_RSHIFT 105 -#define TK_PLUS 106 -#define TK_MINUS 107 -#define TK_STAR 108 -#define TK_SLASH 109 -#define TK_REM 110 -#define TK_CONCAT 111 -#define TK_PTR 112 -#define TK_COLLATE 113 -#define TK_BITNOT 114 -#define TK_ON 115 -#define TK_INDEXED 116 -#define TK_STRING 117 -#define TK_JOIN_KW 118 -#define TK_CONSTRAINT 119 -#define TK_DEFAULT 120 -#define TK_NULL 121 -#define TK_PRIMARY 122 -#define TK_UNIQUE 123 -#define TK_CHECK 124 -#define TK_REFERENCES 125 -#define TK_AUTOINCR 126 -#define TK_INSERT 127 -#define TK_DELETE 128 -#define TK_UPDATE 129 -#define TK_SET 130 -#define TK_DEFERRABLE 131 -#define TK_FOREIGN 132 -#define TK_DROP 133 -#define TK_UNION 134 -#define TK_ALL 135 -#define TK_EXCEPT 136 -#define TK_INTERSECT 137 -#define TK_SELECT 138 -#define TK_VALUES 139 -#define TK_DISTINCT 140 -#define TK_DOT 141 -#define TK_FROM 142 -#define TK_JOIN 143 -#define TK_USING 144 -#define TK_ORDER 145 -#define TK_GROUP 146 -#define TK_HAVING 147 -#define TK_LIMIT 148 -#define TK_WHERE 149 -#define TK_RETURNING 150 -#define TK_INTO 151 -#define TK_NOTHING 152 -#define TK_FLOAT 153 -#define TK_BLOB 154 -#define TK_INTEGER 155 -#define TK_VARIABLE 156 -#define TK_CASE 157 -#define TK_WHEN 158 -#define TK_THEN 159 -#define TK_ELSE 160 -#define TK_INDEX 161 -#define TK_ALTER 162 -#define TK_ADD 163 -#define TK_WINDOW 164 -#define TK_OVER 165 -#define TK_FILTER 166 -#define TK_COLUMN 167 -#define TK_AGG_FUNCTION 168 -#define TK_AGG_COLUMN 169 -#define TK_TRUEFALSE 170 -#define TK_ISNOT 171 +#define TK_ISNOT 46 +#define TK_MATCH 47 +#define TK_LIKE_KW 48 +#define TK_BETWEEN 49 +#define TK_IN 50 +#define TK_ISNULL 51 +#define TK_NOTNULL 52 +#define TK_NE 53 +#define TK_EQ 54 +#define TK_GT 55 +#define TK_LE 56 +#define TK_LT 57 +#define TK_GE 58 +#define TK_ESCAPE 59 +#define TK_ID 60 +#define TK_COLUMNKW 61 +#define TK_DO 62 +#define TK_FOR 63 +#define TK_IGNORE 64 +#define TK_INITIALLY 65 +#define TK_INSTEAD 66 +#define TK_NO 67 +#define TK_KEY 68 +#define TK_OF 69 +#define TK_OFFSET 70 +#define TK_PRAGMA 71 +#define TK_RAISE 72 +#define TK_RECURSIVE 73 +#define TK_REPLACE 74 +#define TK_RESTRICT 75 +#define TK_ROW 76 +#define TK_ROWS 77 +#define TK_TRIGGER 78 +#define TK_VACUUM 79 +#define TK_VIEW 80 +#define TK_VIRTUAL 81 +#define TK_WITH 82 +#define TK_NULLS 83 +#define TK_FIRST 84 +#define TK_LAST 85 +#define TK_CURRENT 86 +#define TK_FOLLOWING 87 +#define TK_PARTITION 88 +#define TK_PRECEDING 89 +#define TK_RANGE 90 +#define TK_UNBOUNDED 91 +#define TK_EXCLUDE 92 +#define TK_GROUPS 93 +#define TK_OTHERS 94 +#define TK_TIES 95 +#define TK_GENERATED 96 +#define TK_ALWAYS 97 +#define TK_MATERIALIZED 98 +#define TK_REINDEX 99 +#define TK_RENAME 100 +#define TK_CTIME_KW 101 +#define TK_ANY 102 +#define TK_BITAND 103 +#define TK_BITOR 104 +#define TK_LSHIFT 105 +#define TK_RSHIFT 106 +#define TK_PLUS 107 +#define TK_MINUS 108 +#define TK_STAR 109 +#define TK_SLASH 110 +#define TK_REM 111 +#define TK_CONCAT 112 +#define TK_PTR 113 +#define TK_COLLATE 114 +#define TK_BITNOT 115 +#define TK_ON 116 +#define TK_INDEXED 117 +#define TK_STRING 118 +#define TK_JOIN_KW 119 +#define TK_CONSTRAINT 120 +#define TK_DEFAULT 121 +#define TK_NULL 122 +#define TK_PRIMARY 123 +#define TK_UNIQUE 124 +#define TK_CHECK 125 +#define TK_REFERENCES 126 +#define TK_AUTOINCR 127 +#define TK_INSERT 128 +#define TK_DELETE 129 +#define TK_UPDATE 130 +#define TK_SET 131 +#define TK_DEFERRABLE 132 +#define TK_FOREIGN 133 +#define TK_DROP 134 +#define TK_UNION 135 +#define TK_ALL 136 +#define TK_EXCEPT 137 +#define TK_INTERSECT 138 +#define TK_SELECT 139 +#define TK_VALUES 140 +#define TK_DISTINCT 141 +#define TK_DOT 142 +#define TK_FROM 143 +#define TK_JOIN 144 +#define TK_USING 145 +#define TK_ORDER 146 +#define TK_GROUP 147 +#define TK_HAVING 148 +#define TK_LIMIT 149 +#define TK_WHERE 150 +#define TK_RETURNING 151 +#define TK_INTO 152 +#define TK_NOTHING 153 +#define TK_FLOAT 154 +#define TK_BLOB 155 +#define TK_INTEGER 156 +#define TK_VARIABLE 157 +#define TK_CASE 158 +#define TK_WHEN 159 +#define TK_THEN 160 +#define TK_ELSE 161 +#define TK_INDEX 162 +#define TK_ALTER 163 +#define TK_ADD 164 +#define TK_WINDOW 165 +#define TK_OVER 166 +#define TK_FILTER 167 +#define TK_COLUMN 168 +#define TK_AGG_FUNCTION 169 +#define TK_AGG_COLUMN 170 +#define TK_TRUEFALSE 171 #define TK_FUNCTION 172 -#define TK_UMINUS 173 -#define TK_UPLUS 174 +#define TK_UPLUS 173 +#define TK_UMINUS 174 #define TK_TRUTH 175 #define TK_REGISTER 176 #define TK_VECTOR 177 @@ -14175,8 +14830,9 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); #define TK_ASTERISK 180 #define TK_SPAN 181 #define TK_ERROR 182 -#define TK_SPACE 183 -#define TK_ILLEGAL 184 +#define TK_QNUMBER 183 +#define TK_SPACE 184 +#define TK_ILLEGAL 185 /************** End of parse.h ***********************************************/ /************** Continuing where we left off in sqliteInt.h ******************/ @@ -14185,6 +14841,7 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); #include #include #include +#include /* ** Use a macro to replace memcpy() if compiled with SQLITE_INLINE_MEMCPY. @@ -14205,7 +14862,8 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); #ifdef SQLITE_OMIT_FLOATING_POINT # define double sqlite_int64 # define float sqlite_int64 -# define LONGDOUBLE_TYPE sqlite_int64 +# define fabs(X) ((X)<0?-(X):(X)) +# define sqlite3IsOverflow(X) 0 # ifndef SQLITE_BIG_DBL # define SQLITE_BIG_DBL (((sqlite3_int64)1)<<50) # endif @@ -14380,9 +15038,6 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); # define INT8_TYPE signed char # endif #endif -#ifndef LONGDOUBLE_TYPE -# define LONGDOUBLE_TYPE long double -#endif typedef sqlite_int64 i64; /* 8-byte signed integer */ typedef sqlite_uint64 u64; /* 8-byte unsigned integer */ typedef UINT32_TYPE u32; /* 4-byte unsigned integer */ @@ -14438,7 +15093,7 @@ typedef INT16_TYPE LogEst; # define SQLITE_PTRSIZE __SIZEOF_POINTER__ # elif defined(i386) || defined(__i386__) || defined(_M_IX86) || \ defined(_M_ARM) || defined(__arm__) || defined(__x86) || \ - (defined(__APPLE__) && defined(__POWERPC__)) || \ + (defined(__APPLE__) && defined(__ppc__)) || \ (defined(__TOS_AIX__) && !defined(__64BIT__)) # define SQLITE_PTRSIZE 4 # else @@ -14464,8 +15119,31 @@ typedef INT16_TYPE LogEst; ** the end of buffer S. This macro returns true if P points to something ** contained within the buffer S. */ -#define SQLITE_WITHIN(P,S,E) (((uptr)(P)>=(uptr)(S))&&((uptr)(P)<(uptr)(E))) +#define SQLITE_WITHIN(P,S,E) (((uptr)(P)>=(uptr)(S))&&((uptr)(P)<(uptr)(E))) +/* +** P is one byte past the end of a large buffer. Return true if a span of bytes +** between S..E crosses the end of that buffer. In other words, return true +** if the sub-buffer S..E-1 overflows the buffer whose last byte is P-1. +** +** S is the start of the span. E is one byte past the end of end of span. +** +** P +** |-----------------| FALSE +** |-------| +** S E +** +** P +** |-----------------| +** |-------| TRUE +** S E +** +** P +** |-----------------| +** |-------| FALSE +** S E +*/ +#define SQLITE_OVERFLOW(P,S,E) (((uptr)(S)<(uptr)(P))&&((uptr)(E)>(uptr)(P))) /* ** Macros to determine whether the machine is big or little endian, @@ -14475,16 +15153,33 @@ typedef INT16_TYPE LogEst; ** using C-preprocessor macros. If that is unsuccessful, or if ** -DSQLITE_BYTEORDER=0 is set, then byte-order is determined ** at run-time. +** +** If you are building SQLite on some obscure platform for which the +** following ifdef magic does not work, you can always include either: +** +** -DSQLITE_BYTEORDER=1234 +** +** or +** +** -DSQLITE_BYTEORDER=4321 +** +** to cause the build to work for little-endian or big-endian processors, +** respectively. */ -#ifndef SQLITE_BYTEORDER -# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ +#ifndef SQLITE_BYTEORDER /* Replicate changes at tag-20230904a */ +# if defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_BIG_ENDIAN__ +# define SQLITE_BYTEORDER 4321 +# elif defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ +# define SQLITE_BYTEORDER 1234 +# elif defined(__BIG_ENDIAN__) && __BIG_ENDIAN__==1 +# define SQLITE_BYTEORDER 4321 +# elif defined(i386) || defined(__i386__) || defined(_M_IX86) || \ defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) -# define SQLITE_BYTEORDER 1234 -# elif defined(sparc) || defined(__ppc__) || \ - defined(__ARMEB__) || defined(__AARCH64EB__) -# define SQLITE_BYTEORDER 4321 +# define SQLITE_BYTEORDER 1234 +# elif defined(sparc) || defined(__ARMEB__) || defined(__AARCH64EB__) +# define SQLITE_BYTEORDER 4321 # else # define SQLITE_BYTEORDER 0 # endif @@ -14635,6 +15330,7 @@ SQLITE_PRIVATE u32 sqlite3TreeTrace; ** 0x00010000 Beginning of DELETE/INSERT/UPDATE processing ** 0x00020000 Transform DISTINCT into GROUP BY ** 0x00040000 SELECT tree dump after all code has been generated +** 0x00080000 NOT NULL strength reduction */ /* @@ -14665,7 +15361,7 @@ SQLITE_PRIVATE u32 sqlite3WhereTrace; ** 0x00000010 Display sqlite3_index_info xBestIndex calls ** 0x00000020 Range an equality scan metrics ** 0x00000040 IN operator decisions -** 0x00000080 WhereLoop cost adjustements +** 0x00000080 WhereLoop cost adjustments ** 0x00000100 ** 0x00000200 Covering index decisions ** 0x00000400 OR optimization @@ -14699,7 +15395,7 @@ struct BusyHandler { /* ** Name of table that holds the database schema. ** -** The PREFERRED names are used whereever possible. But LEGACY is also +** The PREFERRED names are used wherever possible. But LEGACY is also ** used for backwards compatibility. ** ** 1. Queries can use either the PREFERRED or the LEGACY names @@ -14808,11 +15504,13 @@ typedef struct Column Column; typedef struct Cte Cte; typedef struct CteUse CteUse; typedef struct Db Db; +typedef struct DbClientData DbClientData; typedef struct DbFixer DbFixer; typedef struct Schema Schema; typedef struct Expr Expr; typedef struct ExprList ExprList; typedef struct FKey FKey; +typedef struct FpDecode FpDecode; typedef struct FuncDestructor FuncDestructor; typedef struct FuncDef FuncDef; typedef struct FuncDefHash FuncDefHash; @@ -14831,6 +15529,7 @@ typedef struct Parse Parse; typedef struct ParseCleanup ParseCleanup; typedef struct PreUpdate PreUpdate; typedef struct PrintfArguments PrintfArguments; +typedef struct RCStr RCStr; typedef struct RenameToken RenameToken; typedef struct Returning Returning; typedef struct RowSet RowSet; @@ -14838,6 +15537,7 @@ typedef struct Savepoint Savepoint; typedef struct Select Select; typedef struct SQLiteThread SQLiteThread; typedef struct SelectDest SelectDest; +typedef struct Subquery Subquery; typedef struct SrcItem SrcItem; typedef struct SrcList SrcList; typedef struct sqlite3_str StrAccum; /* Internal alias for sqlite3_str */ @@ -15444,7 +16144,7 @@ SQLITE_PRIVATE sqlite3_file *sqlite3PagerJrnlFile(Pager*); SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager*); SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager*); SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager*); -SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *, int, int, int *); +SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *, int, int, u64*); SQLITE_PRIVATE void sqlite3PagerClearCache(Pager*); SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file *); @@ -15468,6 +16168,10 @@ SQLITE_PRIVATE void sqlite3PagerRefdump(Pager*); # define enable_simulated_io_errors() #endif +#if defined(SQLITE_USE_SEH) && !defined(SQLITE_OMIT_WAL) +SQLITE_PRIVATE int sqlite3PagerWalSystemErrno(Pager*); +#endif + #endif /* SQLITE_PAGER_H */ /************** End of pager.h ***********************************************/ @@ -15716,6 +16420,9 @@ SQLITE_PRIVATE int sqlite3BtreeCursor( ); SQLITE_PRIVATE BtCursor *sqlite3BtreeFakeValidCursor(void); SQLITE_PRIVATE int sqlite3BtreeCursorSize(void); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3BtreeClosesWithCursor(Btree*,BtCursor*); +#endif SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor*); SQLITE_PRIVATE void sqlite3BtreeCursorHintFlags(BtCursor*, unsigned); #ifdef SQLITE_ENABLE_CURSOR_HINTS @@ -15797,9 +16504,7 @@ SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor*, int flags); SQLITE_PRIVATE i64 sqlite3BtreeIntegerKey(BtCursor*); SQLITE_PRIVATE void sqlite3BtreeCursorPin(BtCursor*); SQLITE_PRIVATE void sqlite3BtreeCursorUnpin(BtCursor*); -#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC SQLITE_PRIVATE i64 sqlite3BtreeOffset(BtCursor*); -#endif SQLITE_PRIVATE int sqlite3BtreePayload(BtCursor*, u32 offset, u32 amt, void*); SQLITE_PRIVATE const void *sqlite3BtreePayloadFetch(BtCursor*, u32 *pAmt); SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor*); @@ -15809,6 +16514,7 @@ SQLITE_PRIVATE int sqlite3BtreeIntegrityCheck( sqlite3 *db, /* Database connection that is running the check */ Btree *p, /* The btree to be checked */ Pgno *aRoot, /* An array of root pages numbers for individual trees */ + sqlite3_value *aCnt, /* OUT: entry counts for each btree in aRoot[] */ int nRoot, /* Number of entries in aRoot[] */ int mxErr, /* Stop reporting errors after this many */ int *pnErr, /* OUT: Write number of errors seen to this variable */ @@ -15935,6 +16641,19 @@ typedef struct Vdbe Vdbe; */ typedef struct sqlite3_value Mem; typedef struct SubProgram SubProgram; +typedef struct SubrtnSig SubrtnSig; + +/* +** A signature for a reusable subroutine that materializes the RHS of +** an IN operator. +*/ +struct SubrtnSig { + int selId; /* SELECT-id for the SELECT statement on the RHS */ + char *zAff; /* Affinity of the overall IN expression */ + int iTable; /* Ephemeral table generated by the subroutine */ + int iAddr; /* Subroutine entry address */ + int regReturn; /* Register used to hold return address */ +}; /* ** A single instruction of the virtual machine has an opcode @@ -15963,6 +16682,7 @@ struct VdbeOp { u32 *ai; /* Used when p4type is P4_INTARRAY */ SubProgram *pProgram; /* Used when p4type is P4_SUBPROGRAM */ Table *pTab; /* Used when p4type is P4_TABLE */ + SubrtnSig *pSubrtnSig; /* Used when p4type is P4_SUBRTNSIG */ #ifdef SQLITE_ENABLE_CURSOR_HINTS Expr *pExpr; /* Used when p4type is P4_EXPR */ #endif @@ -16029,6 +16749,8 @@ typedef struct VdbeOpList VdbeOpList; #define P4_INT64 (-13) /* P4 is a 64-bit signed integer */ #define P4_INTARRAY (-14) /* P4 is a vector of 32-bit integers */ #define P4_FUNCCTX (-15) /* P4 is a pointer to an sqlite3_context object */ +#define P4_TABLEREF (-16) /* Like P4_TABLE, but reference counted */ +#define P4_SUBRTNSIG (-17) /* P4 is a SubrtnSig pointer */ /* Error message codes for OP_Halt */ #define P5_ConstraintNotNull 1 @@ -16078,12 +16800,12 @@ typedef struct VdbeOpList VdbeOpList; #define OP_Vacuum 5 #define OP_VFilter 6 /* jump, synopsis: iplan=r[P3] zplan='P4' */ #define OP_VUpdate 7 /* synopsis: data=r[P3@P2] */ -#define OP_Init 8 /* jump, synopsis: Start at P2 */ +#define OP_Init 8 /* jump0, synopsis: Start at P2 */ #define OP_Goto 9 /* jump */ #define OP_Gosub 10 /* jump */ -#define OP_InitCoroutine 11 /* jump */ -#define OP_Yield 12 /* jump */ -#define OP_MustBeInt 13 /* jump */ +#define OP_InitCoroutine 11 /* jump0 */ +#define OP_Yield 12 /* jump0 */ +#define OP_MustBeInt 13 /* jump0 */ #define OP_Jump 14 /* jump */ #define OP_Once 15 /* jump */ #define OP_If 16 /* jump */ @@ -16091,22 +16813,22 @@ typedef struct VdbeOpList VdbeOpList; #define OP_IsType 18 /* jump, synopsis: if typeof(P1.P3) in P5 goto P2 */ #define OP_Not 19 /* same as TK_NOT, synopsis: r[P2]= !r[P1] */ #define OP_IfNullRow 20 /* jump, synopsis: if P1.nullRow then r[P3]=NULL, goto P2 */ -#define OP_SeekLT 21 /* jump, synopsis: key=r[P3@P4] */ -#define OP_SeekLE 22 /* jump, synopsis: key=r[P3@P4] */ -#define OP_SeekGE 23 /* jump, synopsis: key=r[P3@P4] */ -#define OP_SeekGT 24 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekLT 21 /* jump0, synopsis: key=r[P3@P4] */ +#define OP_SeekLE 22 /* jump0, synopsis: key=r[P3@P4] */ +#define OP_SeekGE 23 /* jump0, synopsis: key=r[P3@P4] */ +#define OP_SeekGT 24 /* jump0, synopsis: key=r[P3@P4] */ #define OP_IfNotOpen 25 /* jump, synopsis: if( !csr[P1] ) goto P2 */ #define OP_IfNoHope 26 /* jump, synopsis: key=r[P3@P4] */ #define OP_NoConflict 27 /* jump, synopsis: key=r[P3@P4] */ #define OP_NotFound 28 /* jump, synopsis: key=r[P3@P4] */ #define OP_Found 29 /* jump, synopsis: key=r[P3@P4] */ -#define OP_SeekRowid 30 /* jump, synopsis: intkey=r[P3] */ +#define OP_SeekRowid 30 /* jump0, synopsis: intkey=r[P3] */ #define OP_NotExists 31 /* jump, synopsis: intkey=r[P3] */ -#define OP_Last 32 /* jump */ -#define OP_IfSmaller 33 /* jump */ +#define OP_Last 32 /* jump0 */ +#define OP_IfSizeBetween 33 /* jump */ #define OP_SorterSort 34 /* jump */ #define OP_Sort 35 /* jump */ -#define OP_Rewind 36 /* jump */ +#define OP_Rewind 36 /* jump0 */ #define OP_SorterNext 37 /* jump */ #define OP_Prev 38 /* jump */ #define OP_Next 39 /* jump */ @@ -16118,18 +16840,18 @@ typedef struct VdbeOpList VdbeOpList; #define OP_IdxGE 45 /* jump, synopsis: key=r[P3@P4] */ #define OP_RowSetRead 46 /* jump, synopsis: r[P3]=rowset(P1) */ #define OP_RowSetTest 47 /* jump, synopsis: if r[P3] in rowset(P1) goto P2 */ -#define OP_Program 48 /* jump */ +#define OP_Program 48 /* jump0 */ #define OP_FkIfZero 49 /* jump, synopsis: if fkctr[P1]==0 goto P2 */ -#define OP_IsNull 50 /* jump, same as TK_ISNULL, synopsis: if r[P1]==NULL goto P2 */ -#define OP_NotNull 51 /* jump, same as TK_NOTNULL, synopsis: if r[P1]!=NULL goto P2 */ -#define OP_Ne 52 /* jump, same as TK_NE, synopsis: IF r[P3]!=r[P1] */ -#define OP_Eq 53 /* jump, same as TK_EQ, synopsis: IF r[P3]==r[P1] */ -#define OP_Gt 54 /* jump, same as TK_GT, synopsis: IF r[P3]>r[P1] */ -#define OP_Le 55 /* jump, same as TK_LE, synopsis: IF r[P3]<=r[P1] */ -#define OP_Lt 56 /* jump, same as TK_LT, synopsis: IF r[P3]=r[P1] */ -#define OP_ElseEq 58 /* jump, same as TK_ESCAPE */ -#define OP_IfPos 59 /* jump, synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 */ +#define OP_IfPos 50 /* jump, synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 */ +#define OP_IsNull 51 /* jump, same as TK_ISNULL, synopsis: if r[P1]==NULL goto P2 */ +#define OP_NotNull 52 /* jump, same as TK_NOTNULL, synopsis: if r[P1]!=NULL goto P2 */ +#define OP_Ne 53 /* jump, same as TK_NE, synopsis: IF r[P3]!=r[P1] */ +#define OP_Eq 54 /* jump, same as TK_EQ, synopsis: IF r[P3]==r[P1] */ +#define OP_Gt 55 /* jump, same as TK_GT, synopsis: IF r[P3]>r[P1] */ +#define OP_Le 56 /* jump, same as TK_LE, synopsis: IF r[P3]<=r[P1] */ +#define OP_Lt 57 /* jump, same as TK_LT, synopsis: IF r[P3]=r[P1] */ +#define OP_ElseEq 59 /* jump, same as TK_ESCAPE */ #define OP_IfNotZero 60 /* jump, synopsis: if r[P1]!=0 then r[P1]--, goto P2 */ #define OP_DecrJumpZero 61 /* jump, synopsis: if (--r[P1])==0 goto P2 */ #define OP_IncrVacuum 62 /* jump */ @@ -16148,7 +16870,7 @@ typedef struct VdbeOpList VdbeOpList; #define OP_Null 75 /* synopsis: r[P2..P3]=NULL */ #define OP_SoftNull 76 /* synopsis: r[P1]=NULL */ #define OP_Blob 77 /* synopsis: r[P2]=P4 (len=P1) */ -#define OP_Variable 78 /* synopsis: r[P2]=parameter(P1,P4) */ +#define OP_Variable 78 /* synopsis: r[P2]=parameter(P1) */ #define OP_Move 79 /* synopsis: r[P2@P3]=r[P1@P3] */ #define OP_Copy 80 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ #define OP_SCopy 81 /* synopsis: r[P2]=r[P1] */ @@ -16172,23 +16894,23 @@ typedef struct VdbeOpList VdbeOpList; #define OP_ReadCookie 99 #define OP_SetCookie 100 #define OP_ReopenIdx 101 /* synopsis: root=P2 iDb=P3 */ -#define OP_BitAnd 102 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ -#define OP_BitOr 103 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ -#define OP_ShiftLeft 104 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<>r[P1] */ -#define OP_Add 106 /* same as TK_PLUS, synopsis: r[P3]=r[P1]+r[P2] */ -#define OP_Subtract 107 /* same as TK_MINUS, synopsis: r[P3]=r[P2]-r[P1] */ -#define OP_Multiply 108 /* same as TK_STAR, synopsis: r[P3]=r[P1]*r[P2] */ -#define OP_Divide 109 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */ -#define OP_Remainder 110 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */ -#define OP_Concat 111 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */ -#define OP_OpenRead 112 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenRead 102 /* synopsis: root=P2 iDb=P3 */ +#define OP_BitAnd 103 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ +#define OP_BitOr 104 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ +#define OP_ShiftLeft 105 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<>r[P1] */ +#define OP_Add 107 /* same as TK_PLUS, synopsis: r[P3]=r[P1]+r[P2] */ +#define OP_Subtract 108 /* same as TK_MINUS, synopsis: r[P3]=r[P2]-r[P1] */ +#define OP_Multiply 109 /* same as TK_STAR, synopsis: r[P3]=r[P1]*r[P2] */ +#define OP_Divide 110 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */ +#define OP_Remainder 111 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */ +#define OP_Concat 112 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */ #define OP_OpenWrite 113 /* synopsis: root=P2 iDb=P3 */ -#define OP_BitNot 114 /* same as TK_BITNOT, synopsis: r[P2]= ~r[P1] */ -#define OP_OpenDup 115 +#define OP_OpenDup 114 +#define OP_BitNot 115 /* same as TK_BITNOT, synopsis: r[P2]= ~r[P1] */ #define OP_OpenAutoindex 116 /* synopsis: nColumn=P2 */ -#define OP_String8 117 /* same as TK_STRING, synopsis: r[P2]='P4' */ -#define OP_OpenEphemeral 118 /* synopsis: nColumn=P2 */ +#define OP_OpenEphemeral 117 /* synopsis: nColumn=P2 */ +#define OP_String8 118 /* same as TK_STRING, synopsis: r[P2]='P4' */ #define OP_SorterOpen 119 #define OP_SequenceTest 120 /* synopsis: if( cursor[P1].ctr++ ) pc = P2 */ #define OP_OpenPseudo 121 /* synopsis: P3 columns in r[P2] */ @@ -16223,8 +16945,8 @@ typedef struct VdbeOpList VdbeOpList; #define OP_LoadAnalysis 150 #define OP_DropTable 151 #define OP_DropIndex 152 -#define OP_Real 153 /* same as TK_FLOAT, synopsis: r[P2]=P4 */ -#define OP_DropTrigger 154 +#define OP_DropTrigger 153 +#define OP_Real 154 /* same as TK_FLOAT, synopsis: r[P2]=P4 */ #define OP_IntegrityCk 155 #define OP_RowSetAdd 156 /* synopsis: rowset(P1)=r[P2] */ #define OP_Param 157 @@ -16244,19 +16966,22 @@ typedef struct VdbeOpList VdbeOpList; #define OP_VCreate 171 #define OP_VDestroy 172 #define OP_VOpen 173 -#define OP_VInitIn 174 /* synopsis: r[P2]=ValueList(P1,P3) */ -#define OP_VColumn 175 /* synopsis: r[P3]=vcolumn(P2) */ -#define OP_VRename 176 -#define OP_Pagecount 177 -#define OP_MaxPgcnt 178 -#define OP_ClrSubtype 179 /* synopsis: r[P1].subtype = 0 */ -#define OP_FilterAdd 180 /* synopsis: filter(P1) += key(P3@P4) */ -#define OP_Trace 181 -#define OP_CursorHint 182 -#define OP_ReleaseReg 183 /* synopsis: release r[P1@P2] mask P3 */ -#define OP_Noop 184 -#define OP_Explain 185 -#define OP_Abortable 186 +#define OP_VCheck 174 +#define OP_VInitIn 175 /* synopsis: r[P2]=ValueList(P1,P3) */ +#define OP_VColumn 176 /* synopsis: r[P3]=vcolumn(P2) */ +#define OP_VRename 177 +#define OP_Pagecount 178 +#define OP_MaxPgcnt 179 +#define OP_ClrSubtype 180 /* synopsis: r[P1].subtype = 0 */ +#define OP_GetSubtype 181 /* synopsis: r[P2] = r[P1].subtype */ +#define OP_SetSubtype 182 /* synopsis: r[P2].subtype = r[P1] */ +#define OP_FilterAdd 183 /* synopsis: filter(P1) += key(P3@P4) */ +#define OP_Trace 184 +#define OP_CursorHint 185 +#define OP_ReleaseReg 186 /* synopsis: release r[P1@P2] mask P3 */ +#define OP_Noop 187 +#define OP_Explain 188 +#define OP_Abortable 189 /* Properties such as "out2" or "jump" that are specified in ** comments following the "case" for each opcode in the vdbe.c @@ -16269,31 +16994,32 @@ typedef struct VdbeOpList VdbeOpList; #define OPFLG_OUT2 0x10 /* out2: P2 is an output */ #define OPFLG_OUT3 0x20 /* out3: P3 is an output */ #define OPFLG_NCYCLE 0x40 /* ncycle:Cycles count against P1 */ +#define OPFLG_JUMP0 0x80 /* jump0: P2 might be zero */ #define OPFLG_INITIALIZER {\ /* 0 */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x41, 0x00,\ -/* 8 */ 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01,\ -/* 16 */ 0x03, 0x03, 0x01, 0x12, 0x01, 0x49, 0x49, 0x49,\ -/* 24 */ 0x49, 0x01, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49,\ -/* 32 */ 0x41, 0x01, 0x01, 0x01, 0x41, 0x01, 0x41, 0x41,\ +/* 8 */ 0x81, 0x01, 0x01, 0x81, 0x83, 0x83, 0x01, 0x01,\ +/* 16 */ 0x03, 0x03, 0x01, 0x12, 0x01, 0xc9, 0xc9, 0xc9,\ +/* 24 */ 0xc9, 0x01, 0x49, 0x49, 0x49, 0x49, 0xc9, 0x49,\ +/* 32 */ 0xc1, 0x01, 0x41, 0x41, 0xc1, 0x01, 0x41, 0x41,\ /* 40 */ 0x41, 0x41, 0x41, 0x26, 0x26, 0x41, 0x23, 0x0b,\ -/* 48 */ 0x01, 0x01, 0x03, 0x03, 0x0b, 0x0b, 0x0b, 0x0b,\ -/* 56 */ 0x0b, 0x0b, 0x01, 0x03, 0x03, 0x03, 0x01, 0x41,\ +/* 48 */ 0x81, 0x01, 0x03, 0x03, 0x03, 0x0b, 0x0b, 0x0b,\ +/* 56 */ 0x0b, 0x0b, 0x0b, 0x01, 0x03, 0x03, 0x01, 0x41,\ /* 64 */ 0x01, 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, 0x10,\ /* 72 */ 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00,\ /* 80 */ 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x02, 0x02,\ /* 88 */ 0x02, 0x00, 0x00, 0x12, 0x1e, 0x20, 0x40, 0x00,\ -/* 96 */ 0x00, 0x00, 0x10, 0x10, 0x00, 0x40, 0x26, 0x26,\ +/* 96 */ 0x00, 0x00, 0x10, 0x10, 0x00, 0x40, 0x40, 0x26,\ /* 104 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26,\ -/* 112 */ 0x40, 0x00, 0x12, 0x40, 0x40, 0x10, 0x40, 0x00,\ +/* 112 */ 0x26, 0x00, 0x40, 0x12, 0x40, 0x40, 0x10, 0x00,\ /* 120 */ 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x10, 0x10,\ -/* 128 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50,\ +/* 128 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x50,\ /* 136 */ 0x00, 0x40, 0x04, 0x04, 0x00, 0x40, 0x50, 0x40,\ /* 144 */ 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,\ -/* 152 */ 0x00, 0x10, 0x00, 0x00, 0x06, 0x10, 0x00, 0x04,\ +/* 152 */ 0x00, 0x00, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04,\ /* 160 */ 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 168 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x50, 0x40,\ -/* 176 */ 0x00, 0x10, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00,\ -/* 184 */ 0x00, 0x00, 0x00,} +/* 168 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x50,\ +/* 176 */ 0x40, 0x00, 0x10, 0x10, 0x02, 0x12, 0x12, 0x00,\ +/* 184 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,} /* The resolve3P2Values() routine is able to run faster if it knows ** the value of the largest JUMP opcode. The smaller the maximum @@ -16436,6 +17162,8 @@ SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord*); SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *); SQLITE_PRIVATE int sqlite3VdbeHasSubProgram(Vdbe*); +SQLITE_PRIVATE void sqlite3MemSetArrayInt64(sqlite3_value *aMem, int iIdx, i64 val); + SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context*); #ifdef SQLITE_ENABLE_BYTECODE_VTAB SQLITE_PRIVATE int sqlite3VdbeBytecodeVtabInit(sqlite3*); @@ -16468,7 +17196,7 @@ SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe*, const char*, ...); ** The VdbeCoverage macros are used to set a coverage testing point ** for VDBE branch instructions. The coverage testing points are line ** numbers in the sqlite3.c source file. VDBE branch coverage testing -** only works with an amalagmation build. That's ok since a VDBE branch +** only works with an amalgamation build. That's ok since a VDBE branch ** coverage build designed for testing the test suite only. No application ** should ever ship with VDBE branch coverage measuring turned on. ** @@ -16486,7 +17214,7 @@ SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe*, const char*, ...); ** // NULL option is not possible ** ** VdbeCoverageEqNe(v) // Previous OP_Jump is only interested -** // in distingishing equal and not-equal. +** // in distinguishing equal and not-equal. ** ** Every VDBE branch operation must be tagged with one of the macros above. ** If not, then when "make test" is run with -DSQLITE_VDBE_COVERAGE and @@ -16496,7 +17224,7 @@ SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe*, const char*, ...); ** During testing, the test application will invoke ** sqlite3_test_control(SQLITE_TESTCTRL_VDBE_COVERAGE,...) to set a callback ** routine that is invoked as each bytecode branch is taken. The callback -** contains the sqlite3.c source line number ov the VdbeCoverage macro and +** contains the sqlite3.c source line number of the VdbeCoverage macro and ** flags to indicate whether or not the branch was taken. The test application ** is responsible for keeping track of this and reporting byte-code branches ** that are never taken. @@ -16544,6 +17272,10 @@ SQLITE_PRIVATE void sqlite3VdbeScanStatusCounters(Vdbe*, int, int, int); SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE*, int, VdbeOp*); #endif +#if defined(SQLITE_ENABLE_CURSOR_HINTS) && defined(SQLITE_DEBUG) +SQLITE_PRIVATE int sqlite3CursorRangeHintExprCheck(Walker *pWalker, Expr *pExpr); +#endif + #endif /* SQLITE_VDBE_H */ /************** End of vdbe.h ************************************************/ @@ -16831,7 +17563,7 @@ SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); /* ** Default synchronous levels. ** -** Note that (for historcal reasons) the PAGER_SYNCHRONOUS_* macros differ +** Note that (for historical reasons) the PAGER_SYNCHRONOUS_* macros differ ** from the SQLITE_DEFAULT_SYNCHRONOUS value by 1. ** ** PAGER_SYNCHRONOUS DEFAULT_SYNCHRONOUS @@ -16870,7 +17602,7 @@ struct Db { ** An instance of the following structure stores a database schema. ** ** Most Schema objects are associated with a Btree. The exception is -** the Schema for the TEMP databaes (sqlite3.aDb[1]) which is free-standing. +** the Schema for the TEMP database (sqlite3.aDb[1]) which is free-standing. ** In shared cache mode, a single Schema object can be shared by multiple ** Btrees that refer to the same underlying BtShared object. ** @@ -16981,7 +17713,7 @@ struct Lookaside { LookasideSlot *pInit; /* List of buffers not previously used */ LookasideSlot *pFree; /* List of available buffers */ #ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE - LookasideSlot *pSmallInit; /* List of small buffers not prediously used */ + LookasideSlot *pSmallInit; /* List of small buffers not previously used */ LookasideSlot *pSmallFree; /* List of available small buffers */ void *pMiddle; /* First byte past end of full-size buffers and ** the first byte of LOOKASIDE_SMALL buffers */ @@ -16998,7 +17730,7 @@ struct LookasideSlot { #define EnableLookaside db->lookaside.bDisable--;\ db->lookaside.sz=db->lookaside.bDisable?0:db->lookaside.szTrue -/* Size of the smaller allocations in two-size lookside */ +/* Size of the smaller allocations in two-size lookaside */ #ifdef SQLITE_OMIT_TWOSIZE_LOOKASIDE # define LOOKASIDE_SMALL 0 #else @@ -17019,6 +17751,10 @@ struct FuncDefHash { }; #define SQLITE_FUNC_HASH(C,L) (((C)+(L))%SQLITE_FUNC_HASH_SZ) +#if defined(SQLITE_USER_AUTHENTICATION) +# warning "The SQLITE_USER_AUTHENTICATION extension is deprecated. \ + See ext/userauth/user-auth.txt for details." +#endif #ifdef SQLITE_USER_AUTHENTICATION /* ** Information held in the "sqlite3" database connection object and used @@ -17198,6 +17934,7 @@ struct sqlite3 { i64 nDeferredCons; /* Net deferred constraints this transaction. */ i64 nDeferredImmCons; /* Net deferred immediate constraints */ int *pnBytesFreed; /* If not NULL, increment this in DbFree() */ + DbClientData *pDbData; /* sqlite3_set_clientdata() content */ #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY /* The following variables are all protected by the STATIC_MAIN ** mutex, not by sqlite3.mutex. They are used by code in notify.c. @@ -17253,7 +17990,7 @@ struct sqlite3 { #define SQLITE_NullCallback 0x00000100 /* Invoke the callback once if the */ /* result set is empty */ #define SQLITE_IgnoreChecks 0x00000200 /* Do not enforce check constraints */ -#define SQLITE_ReadUncommit 0x00000400 /* READ UNCOMMITTED in shared-cache */ +#define SQLITE_StmtScanStatus 0x00000400 /* Enable stmt_scanstats() counters */ #define SQLITE_NoCkptOnClose 0x00000800 /* No checkpoint on close()/DETACH */ #define SQLITE_ReverseOrder 0x00001000 /* Reverse unordered SELECTs */ #define SQLITE_RecTriggers 0x00002000 /* Enable recursive triggers */ @@ -17279,6 +18016,8 @@ struct sqlite3 { /* DELETE, or UPDATE and return */ /* the count using a callback. */ #define SQLITE_CorruptRdOnly HI(0x00002) /* Prohibit writes due to error */ +#define SQLITE_ReadUncommit HI(0x00004) /* READ UNCOMMITTED in shared-cache */ +#define SQLITE_FkNoAction HI(0x00008) /* Treat all FK as NO ACTION */ /* Flags used only if debugging */ #ifdef SQLITE_DEBUG @@ -17319,7 +18058,7 @@ struct sqlite3 { #define SQLITE_CursorHints 0x00000400 /* Add OP_CursorHint opcodes */ #define SQLITE_Stat4 0x00000800 /* Use STAT4 data */ /* TH3 expects this value ^^^^^^^^^^ to be 0x0000800. Don't change it */ -#define SQLITE_PushDown 0x00001000 /* The push-down optimization */ +#define SQLITE_PushDown 0x00001000 /* WHERE-clause push-down opt */ #define SQLITE_SimplifyJoin 0x00002000 /* Convert LEFT JOIN to JOIN */ #define SQLITE_SkipScan 0x00004000 /* Skip-scans */ #define SQLITE_PropagateConst 0x00008000 /* The constant propagation opt */ @@ -17335,6 +18074,9 @@ struct sqlite3 { /* TH3 expects this value ^^^^^^^^^^ See flatten04.test */ #define SQLITE_IndexedExpr 0x01000000 /* Pull exprs from index when able */ #define SQLITE_Coroutines 0x02000000 /* Co-routines for subqueries */ +#define SQLITE_NullUnusedCols 0x04000000 /* NULL unused columns in subqueries */ +#define SQLITE_OnePass 0x08000000 /* Single-pass DELETE and UPDATE */ +#define SQLITE_OrderBySubq 0x10000000 /* ORDER BY in subquery helps outer */ #define SQLITE_AllOpts 0xffffffff /* All optimizations */ /* @@ -17417,6 +18159,7 @@ struct FuncDestructor { ** SQLITE_FUNC_ANYORDER == NC_OrderAgg == SF_OrderByReqd ** SQLITE_FUNC_LENGTH == OPFLAG_LENGTHARG ** SQLITE_FUNC_TYPEOF == OPFLAG_TYPEOFARG +** SQLITE_FUNC_BYTELEN == OPFLAG_BYTELENARG ** SQLITE_FUNC_CONSTANT == SQLITE_DETERMINISTIC from the API ** SQLITE_FUNC_DIRECT == SQLITE_DIRECTONLY from the API ** SQLITE_FUNC_UNSAFE == SQLITE_INNOCUOUS -- opposite meanings!!! @@ -17424,7 +18167,7 @@ struct FuncDestructor { ** ** Note that even though SQLITE_FUNC_UNSAFE and SQLITE_INNOCUOUS have the ** same bit value, their meanings are inverted. SQLITE_FUNC_UNSAFE is -** used internally and if set means tha the function has side effects. +** used internally and if set means that the function has side effects. ** SQLITE_INNOCUOUS is used by application code and means "not unsafe". ** See multiple instances of tag-20230109-1. */ @@ -17435,6 +18178,7 @@ struct FuncDestructor { #define SQLITE_FUNC_NEEDCOLL 0x0020 /* sqlite3GetFuncCollSeq() might be called*/ #define SQLITE_FUNC_LENGTH 0x0040 /* Built-in length() function */ #define SQLITE_FUNC_TYPEOF 0x0080 /* Built-in typeof() function */ +#define SQLITE_FUNC_BYTELEN 0x00c0 /* Built-in octet_length() function */ #define SQLITE_FUNC_COUNT 0x0100 /* Built-in count(*) aggregate */ /* 0x0200 -- available for reuse */ #define SQLITE_FUNC_UNLIKELY 0x0400 /* Built-in unlikely() function */ @@ -17443,14 +18187,15 @@ struct FuncDestructor { #define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a ** single query - might change over time */ #define SQLITE_FUNC_TEST 0x4000 /* Built-in testing functions */ -/* 0x8000 -- available for reuse */ +#define SQLITE_FUNC_RUNONLY 0x8000 /* Cannot be used by valueFromFunction */ #define SQLITE_FUNC_WINDOW 0x00010000 /* Built-in window-only function */ #define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */ #define SQLITE_FUNC_DIRECT 0x00080000 /* Not for use in TRIGGERs or VIEWs */ -#define SQLITE_FUNC_SUBTYPE 0x00100000 /* Result likely to have sub-type */ +/* SQLITE_SUBTYPE 0x00100000 // Consumer of subtypes */ #define SQLITE_FUNC_UNSAFE 0x00200000 /* Function has side effects */ #define SQLITE_FUNC_INLINE 0x00400000 /* Functions implemented in-line */ #define SQLITE_FUNC_BUILTIN 0x00800000 /* This is a built-in function */ +/* SQLITE_RESULT_SUBTYPE 0x01000000 // Generator of subtypes */ #define SQLITE_FUNC_ANYORDER 0x08000000 /* count/min/max aggregate */ /* Identifier numbers for each in-line function */ @@ -17542,10 +18287,11 @@ struct FuncDestructor { #define MFUNCTION(zName, nArg, xPtr, xFunc) \ {nArg, SQLITE_FUNC_BUILTIN|SQLITE_FUNC_CONSTANT|SQLITE_UTF8, \ xPtr, 0, xFunc, 0, 0, 0, #zName, {0} } -#define JFUNCTION(zName, nArg, iArg, xFunc) \ - {nArg, SQLITE_FUNC_BUILTIN|SQLITE_DETERMINISTIC|\ - SQLITE_FUNC_CONSTANT|SQLITE_UTF8, \ - SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } +#define JFUNCTION(zName, nArg, bUseCache, bWS, bRS, bJsonB, iArg, xFunc) \ + {nArg, SQLITE_FUNC_BUILTIN|SQLITE_DETERMINISTIC|SQLITE_FUNC_CONSTANT|\ + SQLITE_UTF8|((bUseCache)*SQLITE_FUNC_RUNONLY)|\ + ((bRS)*SQLITE_SUBTYPE)|((bWS)*SQLITE_RESULT_SUBTYPE), \ + SQLITE_INT_TO_PTR(iArg|((bJsonB)*JSON_BLOB)),0,xFunc,0, 0, 0, #zName, {0} } #define INLINE_FUNC(zName, nArg, iArg, mFlags) \ {nArg, SQLITE_FUNC_BUILTIN|\ SQLITE_UTF8|SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \ @@ -17806,6 +18552,7 @@ struct VTable { sqlite3_vtab *pVtab; /* Pointer to vtab instance */ int nRef; /* Number of pointers to this structure */ u8 bConstraint; /* True if constraints are supported */ + u8 bAllSchemas; /* True if might use any attached schema */ u8 eVtabRisk; /* Riskiness of allowing hacker access */ int iSavepoint; /* Depth of the SAVEPOINT stack */ VTable *pNext; /* Next in linked list (see above) */ @@ -17885,8 +18632,7 @@ struct Table { #define TF_HasStored 0x00000040 /* Has one or more STORED columns */ #define TF_HasGenerated 0x00000060 /* Combo: HasVirtual + HasStored */ #define TF_WithoutRowid 0x00000080 /* No rowid. PRIMARY KEY is the key */ -#define TF_StatsUsed 0x00000100 /* Query planner decisions affected by - ** Index.aiRowLogEst[] values */ +#define TF_MaybeReanalyze 0x00000100 /* Maybe run ANALYZE on this table */ #define TF_NoVisibleRowid 0x00000200 /* No user-visible "rowid" column */ #define TF_OOOHidden 0x00000400 /* Out-of-Order hidden columns */ #define TF_HasNotNull 0x00000800 /* Contains NOT NULL constraints */ @@ -17942,6 +18688,15 @@ struct Table { #define HasRowid(X) (((X)->tabFlags & TF_WithoutRowid)==0) #define VisibleRowid(X) (((X)->tabFlags & TF_NoVisibleRowid)==0) +/* Macro is true if the SQLITE_ALLOW_ROWID_IN_VIEW (mis-)feature is +** available. By default, this macro is false +*/ +#ifndef SQLITE_ALLOW_ROWID_IN_VIEW +# define ViewCanHaveRowid 0 +#else +# define ViewCanHaveRowid (sqlite3Config.mNoVisibleRowid==0) +#endif + /* ** Each foreign key constraint is an instance of the following structure. ** @@ -18013,7 +18768,7 @@ struct FKey { ** foreign key. ** ** The OE_Default value is a place holder that means to use whatever -** conflict resolution algorthm is required from context. +** conflict resolution algorithm is required from context. ** ** The following symbolic values are used to record which type ** of conflict resolution action to take. @@ -18179,6 +18934,7 @@ struct Index { unsigned isCovering:1; /* True if this is a covering index */ unsigned noSkipScan:1; /* Do not try to use skip-scan if true */ unsigned hasStat1:1; /* aiRowLogEst values come from sqlite_stat1 */ + unsigned bLowQual:1; /* sqlite_stat1 says this is a low-quality index */ unsigned bNoQuery:1; /* Do not use this index to optimize queries */ unsigned bAscKeyBug:1; /* True if the bba7b69f9849b5bf bug applies */ unsigned bHasVCol:1; /* Index references one or more VIRTUAL columns */ @@ -18186,6 +18942,7 @@ struct Index { ** expression, or a reference to a VIRTUAL column */ #ifdef SQLITE_ENABLE_STAT4 int nSample; /* Number of elements in aSample[] */ + int mxSample; /* Number of slots allocated to aSample[] */ int nSampleCol; /* Size of IndexSample.anEq[] and so on */ tRowcnt *aAvgEq; /* Average nEq values for keys not in aSample */ IndexSample *aSample; /* Samples of the left-most key */ @@ -18288,6 +19045,10 @@ struct AggInfo { FuncDef *pFunc; /* The aggregate function implementation */ int iDistinct; /* Ephemeral table used to enforce DISTINCT */ int iDistAddr; /* Address of OP_OpenEphemeral */ + int iOBTab; /* Ephemeral table to implement ORDER BY */ + u8 bOBPayload; /* iOBTab has payload columns separate from key */ + u8 bOBUnique; /* Enforce uniqueness on iOBTab keys */ + u8 bUseSubtype; /* Transfer subtype info through sorter */ } *aFunc; int nFunc; /* Number of entries in aFunc[] */ u32 selId; /* Select to which this AggInfo belongs */ @@ -18303,9 +19064,15 @@ struct AggInfo { ** assignAggregateRegisters() that computes the value of pAggInfo->iFirstReg. ** The assert()s that are part of this macro verify that constraint. */ +#ifndef NDEBUG #define AggInfoColumnReg(A,I) (assert((A)->iFirstReg),(A)->iFirstReg+(I)) #define AggInfoFuncReg(A,I) \ (assert((A)->iFirstReg),(A)->iFirstReg+(A)->nColumn+(I)) +#else +#define AggInfoColumnReg(A,I) ((A)->iFirstReg+(I)) +#define AggInfoFuncReg(A,I) \ + ((A)->iFirstReg+(A)->nColumn+(I)) +#endif /* ** The datatype ynVar is a signed integer, either 16-bit or 32-bit. @@ -18426,7 +19193,7 @@ struct Expr { ** TK_REGISTER: register number ** TK_TRIGGER: 1 -> new, 0 -> old ** EP_Unlikely: 134217728 times likelihood - ** TK_IN: ephemerial table holding RHS + ** TK_IN: ephemeral table holding RHS ** TK_SELECT_COLUMN: Number of columns on the LHS ** TK_SELECT: 1st register of result vector */ ynVar iColumn; /* TK_COLUMN: column index. -1 for rowid. @@ -18472,7 +19239,7 @@ struct Expr { #define EP_Reduced 0x004000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ #define EP_Win 0x008000 /* Contains window functions */ #define EP_TokenOnly 0x010000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ - /* 0x020000 // Available for reuse */ +#define EP_FullSize 0x020000 /* Expr structure must remain full sized */ #define EP_IfNullRow 0x040000 /* The TK_IF_NULL_ROW opcode */ #define EP_Unlikely 0x080000 /* unlikely() or likelihood() function */ #define EP_ConstFunc 0x100000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */ @@ -18486,7 +19253,7 @@ struct Expr { #define EP_IsTrue 0x10000000 /* Always has boolean value of TRUE */ #define EP_IsFalse 0x20000000 /* Always has boolean value of FALSE */ #define EP_FromDDL 0x40000000 /* Originates from sqlite_schema */ - /* 0x80000000 // Available */ +#define EP_SubtArg 0x80000000 /* Is argument to SQLITE_SUBTYPE function */ /* The EP_Propagate mask is a set of properties that automatically propagate ** upwards into parent nodes. @@ -18502,12 +19269,15 @@ struct Expr { #define ExprClearProperty(E,P) (E)->flags&=~(P) #define ExprAlwaysTrue(E) (((E)->flags&(EP_OuterON|EP_IsTrue))==EP_IsTrue) #define ExprAlwaysFalse(E) (((E)->flags&(EP_OuterON|EP_IsFalse))==EP_IsFalse) +#define ExprIsFullSize(E) (((E)->flags&(EP_Reduced|EP_TokenOnly))==0) /* Macros used to ensure that the correct members of unions are accessed ** in Expr. */ #define ExprUseUToken(E) (((E)->flags&EP_IntValue)==0) #define ExprUseUValue(E) (((E)->flags&EP_IntValue)!=0) +#define ExprUseWOfst(E) (((E)->flags&(EP_InnerON|EP_OuterON))==0) +#define ExprUseWJoin(E) (((E)->flags&(EP_InnerON|EP_OuterON))!=0) #define ExprUseXList(E) (((E)->flags&EP_xIsSelect)==0) #define ExprUseXSelect(E) (((E)->flags&EP_xIsSelect)!=0) #define ExprUseYTab(E) (((E)->flags&(EP_WinFunc|EP_Subrtn))==0) @@ -18617,6 +19387,7 @@ struct ExprList { #define ENAME_NAME 0 /* The AS clause of a result set */ #define ENAME_SPAN 1 /* Complete text of the result set expression */ #define ENAME_TAB 2 /* "DB.TABLE.NAME" for the result set */ +#define ENAME_ROWID 3 /* "DB.TABLE._rowid_" for * expansion of rowid */ /* ** An instance of this structure can hold a simple list of identifiers, @@ -18653,6 +19424,16 @@ struct IdList { #define EU4_IDX 1 /* Uses IdList.a.u4.idx */ #define EU4_EXPR 2 /* Uses IdList.a.u4.pExpr -- NOT CURRENTLY USED */ +/* +** Details of the implementation of a subquery. +*/ +struct Subquery { + Select *pSelect; /* A SELECT statement used in place of a table name */ + int addrFillSub; /* Address of subroutine to initialize a subquery */ + int regReturn; /* Register holding return address of addrFillSub */ + int regResult; /* Registers holding results of a co-routine */ +}; + /* ** The SrcItem object represents a single term in the FROM clause of a query. ** The SrcList object is mostly an array of SrcItems. @@ -18665,27 +19446,40 @@ struct IdList { ** In the colUsed field, the high-order bit (bit 63) is set if the table ** contains more than 63 columns and the 64-th or later column is used. ** -** Union member validity: +** Aggressive use of "union" helps keep the size of the object small. This +** has been shown to boost performance, in addition to saving memory. +** Access to union elements is gated by the following rules which should +** always be checked, either by an if-statement or by an assert(). +** +** Field Only access if this is true +** --------------- ----------------------------------- +** u1.zIndexedBy fg.isIndexedBy +** u1.pFuncArg fg.isTabFunc +** u1.nRow !fg.isTabFunc && !fg.isIndexedBy +** +** u2.pIBIndex fg.isIndexedBy +** u2.pCteUse fg.isCte ** -** u1.zIndexedBy fg.isIndexedBy && !fg.isTabFunc -** u1.pFuncArg fg.isTabFunc && !fg.isIndexedBy -** u2.pIBIndex fg.isIndexedBy && !fg.isCte -** u2.pCteUse fg.isCte && !fg.isIndexedBy +** u3.pOn !fg.isUsing +** u3.pUsing fg.isUsing +** +** u4.zDatabase !fg.fixedSchema && !fg.isSubquery +** u4.pSchema fg.fixedSchema +** u4.pSubq fg.isSubquery +** +** See also the sqlite3SrcListDelete() routine for assert() statements that +** check invariants on the fields of this object, especially the flags +** inside the fg struct. */ struct SrcItem { - Schema *pSchema; /* Schema to which this item is fixed */ - char *zDatabase; /* Name of database holding this table */ char *zName; /* Name of the table */ char *zAlias; /* The "B" part of a "A AS B" phrase. zName is the "A" */ - Table *pTab; /* An SQL table corresponding to zName */ - Select *pSelect; /* A SELECT statement used in place of a table name */ - int addrFillSub; /* Address of subroutine to manifest a subquery */ - int regReturn; /* Register holding return address of addrFillSub */ - int regResult; /* Registers holding results of a co-routine */ + Table *pSTab; /* Table object for zName. Mnemonic: Srcitem-TABle */ struct { u8 jointype; /* Type of join between this table and the previous */ unsigned notIndexed :1; /* True if there is a NOT INDEXED clause */ unsigned isIndexedBy :1; /* True if there is an INDEXED BY clause */ + unsigned isSubquery :1; /* True if this term is a subquery */ unsigned isTabFunc :1; /* True if table-valued-function syntax */ unsigned isCorrelated :1; /* True if sub-query is correlated */ unsigned isMaterialized:1; /* This is a materialized view */ @@ -18696,23 +19490,32 @@ struct SrcItem { unsigned notCte :1; /* This item may not match a CTE */ unsigned isUsing :1; /* u3.pUsing is valid */ unsigned isOn :1; /* u3.pOn was once valid and non-NULL */ - unsigned isSynthUsing :1; /* u3.pUsing is synthensized from NATURAL */ + unsigned isSynthUsing :1; /* u3.pUsing is synthesized from NATURAL */ unsigned isNestedFrom :1; /* pSelect is a SF_NestedFrom subquery */ + unsigned rowidUsed :1; /* The ROWID of this table is referenced */ + unsigned fixedSchema :1; /* Uses u4.pSchema, not u4.zDatabase */ + unsigned hadSchema :1; /* Had u4.zDatabase before u4.pSchema */ } fg; int iCursor; /* The VDBE cursor number used to access this table */ - union { - Expr *pOn; /* fg.isUsing==0 => The ON clause of a join */ - IdList *pUsing; /* fg.isUsing==1 => The USING clause of a join */ - } u3; Bitmask colUsed; /* Bit N set if column N used. Details above for N>62 */ union { char *zIndexedBy; /* Identifier from "INDEXED BY " clause */ ExprList *pFuncArg; /* Arguments to table-valued-function */ + u32 nRow; /* Number of rows in a VALUES clause */ } u1; union { Index *pIBIndex; /* Index structure corresponding to u1.zIndexedBy */ CteUse *pCteUse; /* CTE Usage info when fg.isCte is true */ } u2; + union { + Expr *pOn; /* fg.isUsing==0 => The ON clause of a join */ + IdList *pUsing; /* fg.isUsing==1 => The USING clause of a join */ + } u3; + union { + Schema *pSchema; /* Schema to which this item is fixed */ + char *zDatabase; /* Name of database holding this table */ + Subquery *pSubq; /* Description of a subquery */ + } u4; }; /* @@ -18772,7 +19575,7 @@ struct SrcList { #define WHERE_AGG_DISTINCT 0x0400 /* Query is "SELECT agg(DISTINCT ...)" */ #define WHERE_ORDERBY_LIMIT 0x0800 /* ORDERBY+LIMIT on the inner loop */ #define WHERE_RIGHT_JOIN 0x1000 /* Processing a RIGHT JOIN */ - /* 0x2000 not currently used */ +#define WHERE_KEEP_ALL_JOINS 0x2000 /* Do not do the omit-noop-join opt */ #define WHERE_USE_LIMIT 0x4000 /* Use the LIMIT in cost estimates */ /* 0x8000 not currently used */ @@ -18817,6 +19620,7 @@ struct NameContext { int nRef; /* Number of names resolved by this context */ int nNcErr; /* Number of errors encountered while resolving names */ int ncFlags; /* Zero or more NC_* flags defined below */ + u32 nNestedSelect; /* Number of nested selects using this NC */ Select *pWinSelect; /* SELECT statement for any window functions */ }; @@ -18843,13 +19647,14 @@ struct NameContext { #define NC_UUpsert 0x000200 /* True if uNC.pUpsert is used */ #define NC_UBaseReg 0x000400 /* True if uNC.iBaseReg is used */ #define NC_MinMaxAgg 0x001000 /* min/max aggregates seen. See note above */ -#define NC_Complex 0x002000 /* True if a function or subquery seen */ +/* 0x002000 // available for reuse */ #define NC_AllowWin 0x004000 /* Window functions are allowed here */ #define NC_HasWin 0x008000 /* One or more window functions seen */ #define NC_IsDDL 0x010000 /* Resolving names in a CREATE statement */ #define NC_InAggFunc 0x020000 /* True if analyzing arguments to an agg func */ #define NC_FromDDL 0x040000 /* SQL text comes from sqlite_schema */ #define NC_NoSelect 0x080000 /* Do not descend into sub-selects */ +#define NC_Where 0x100000 /* Processing WHERE clause of a SELECT */ #define NC_OrderAgg 0x8000000 /* Has an aggregate other than count/min/max */ /* @@ -18873,6 +19678,7 @@ struct Upsert { Expr *pUpsertWhere; /* WHERE clause for the ON CONFLICT UPDATE */ Upsert *pNextUpsert; /* Next ON CONFLICT clause in the list */ u8 isDoUpdate; /* True for DO UPDATE. False for DO NOTHING */ + u8 isDup; /* True if 2nd or later with same pUpsertIdx */ /* Above this point is the parse tree for the ON CONFLICT clauses. ** The next group of fields stores intermediate data. */ void *pToFree; /* Free memory when deleting the Upsert object */ @@ -18962,14 +19768,17 @@ struct Select { #define SF_View 0x0200000 /* SELECT statement is a view */ #define SF_NoopOrderBy 0x0400000 /* ORDER BY is ignored for this query */ #define SF_UFSrcCheck 0x0800000 /* Check pSrc as required by UPDATE...FROM */ -#define SF_PushDown 0x1000000 /* SELECT has be modified by push-down opt */ +#define SF_PushDown 0x1000000 /* Modified by WHERE-clause push-down opt */ #define SF_MultiPart 0x2000000 /* Has multiple incompatible PARTITIONs */ #define SF_CopyCte 0x4000000 /* SELECT statement is a copy of a CTE */ #define SF_OrderByReqd 0x8000000 /* The ORDER BY clause may not be omitted */ #define SF_UpdateFrom 0x10000000 /* Query originates with UPDATE FROM */ +#define SF_Correlated 0x20000000 /* True if references the outer context */ -/* True if S exists and has SF_NestedFrom */ -#define IsNestedFrom(S) ((S)!=0 && ((S)->selFlags&SF_NestedFrom)!=0) +/* True if SrcItem X is a subquery that has SF_NestedFrom */ +#define IsNestedFrom(X) \ + ((X)->fg.isSubquery && \ + ((X)->u4.pSubq->pSelect->selFlags&SF_NestedFrom)!=0) /* ** The results of a SELECT can be distributed in several ways, as defined @@ -18999,7 +19808,11 @@ struct Select { ** SRT_Set The result must be a single column. Store each ** row of result as the key in table pDest->iSDParm. ** Apply the affinity pDest->affSdst before storing -** results. Used to implement "IN (SELECT ...)". +** results. if pDest->iSDParm2 is positive, then it is +** a register holding a Bloom filter for the IN operator +** that should be populated in addition to the +** pDest->iSDParm table. This SRT is used to +** implement "IN (SELECT ...)". ** ** SRT_EphemTab Create an temporary table pDest->iSDParm and store ** the result there. The cursor is left open after @@ -19206,6 +20019,8 @@ struct Parse { u8 disableLookaside; /* Number of times lookaside has been disabled */ u8 prepFlags; /* SQLITE_PREPARE_* flags */ u8 withinRJSubrtn; /* Nesting level for RIGHT JOIN body subroutines */ + u8 bHasWith; /* True if statement contains WITH */ + u8 mSubrtnSig; /* mini Bloom filter on available SubrtnSig.selId */ #if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) u8 earlyCleanup; /* OOM inside sqlite3ParserAddCleanup() */ #endif @@ -19225,6 +20040,7 @@ struct Parse { int *aLabel; /* Space to hold the labels */ ExprList *pConstExpr;/* Constant expressions */ IndexedExpr *pIdxEpr;/* List of expressions used by active indexes */ + IndexedExpr *pIdxPartExpr; /* Exprs constrained by index WHERE clauses */ Token constraintName;/* Name of the constraint currently being parsed */ yDbMask writeMask; /* Start a write transaction on these databases */ yDbMask cookieMask; /* Bitmask of schema verified databases */ @@ -19232,6 +20048,9 @@ struct Parse { int regRoot; /* Register holding root page number for new objects */ int nMaxArg; /* Max args passed to user function by sub-program */ int nSelect; /* Number of SELECT stmts. Counter for Select.selId */ +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + u32 nProgressSteps; /* xProgress steps taken during sqlite3_prepare() */ +#endif #ifndef SQLITE_OMIT_SHARED_CACHE int nTableLock; /* Number of locks in aTableLock */ TableLock *aTableLock; /* Required table locks for shared-cache mode */ @@ -19245,12 +20064,9 @@ struct Parse { int addrCrTab; /* Address of OP_CreateBtree on CREATE TABLE */ Returning *pReturning; /* The RETURNING clause */ } u1; - u32 nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ u32 oldmask; /* Mask of old.* columns referenced */ u32 newmask; /* Mask of new.* columns referenced */ -#ifndef SQLITE_OMIT_PROGRESS_CALLBACK - u32 nProgressSteps; /* xProgress steps taken during sqlite3_prepare() */ -#endif + LogEst nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ u8 eTriggerOp; /* TK_UPDATE, TK_INSERT or TK_DELETE */ u8 bReturning; /* Coding a RETURNING trigger */ u8 eOrconf; /* Default ON CONFLICT policy for trigger steps */ @@ -19374,6 +20190,7 @@ struct AuthContext { #define OPFLAG_ISNOOP 0x40 /* OP_Delete does pre-update-hook only */ #define OPFLAG_LENGTHARG 0x40 /* OP_Column only used for length() */ #define OPFLAG_TYPEOFARG 0x80 /* OP_Column only used for typeof() */ +#define OPFLAG_BYTELENARG 0xc0 /* OP_Column only for octet_length() */ #define OPFLAG_BULKCSR 0x01 /* OP_Open** used to open bulk cursor */ #define OPFLAG_SEEKEQ 0x02 /* OP_Open** cursor uses EQ seek only */ #define OPFLAG_FORDELETE 0x08 /* OP_Open should use BTREE_FORDELETE */ @@ -19495,10 +20312,11 @@ struct Returning { int iRetCur; /* Transient table holding RETURNING results */ int nRetCol; /* Number of in pReturnEL after expansion */ int iRetReg; /* Register array for holding a row of RETURNING */ + char zName[40]; /* Name of trigger: "sqlite_returning_%p" */ }; /* -** An objected used to accumulate the text of a string where we +** An object used to accumulate the text of a string where we ** do not necessarily know how big the string will be in the end. */ struct sqlite3_str { @@ -19512,10 +20330,32 @@ struct sqlite3_str { }; #define SQLITE_PRINTF_INTERNAL 0x01 /* Internal-use-only converters allowed */ #define SQLITE_PRINTF_SQLFUNC 0x02 /* SQL function arguments to VXPrintf */ -#define SQLITE_PRINTF_MALLOCED 0x04 /* True if xText is allocated space */ +#define SQLITE_PRINTF_MALLOCED 0x04 /* True if zText is allocated space */ #define isMalloced(X) (((X)->printfFlags & SQLITE_PRINTF_MALLOCED)!=0) +/* +** The following object is the header for an "RCStr" or "reference-counted +** string". An RCStr is passed around and used like any other char* +** that has been dynamically allocated. The important interface +** differences: +** +** 1. RCStr strings are reference counted. They are deallocated +** when the reference count reaches zero. +** +** 2. Use sqlite3RCStrUnref() to free an RCStr string rather than +** sqlite3_free() +** +** 3. Make a (read-only) copy of a read-only RCStr string using +** sqlite3RCStrRef(). +** +** "String" is in the name, but an RCStr object can also be used to hold +** binary data. +*/ +struct RCStr { + u64 nRCRef; /* Number of references */ + /* Total structure size should be a multiple of 8 bytes for alignment */ +}; /* ** A pointer to this structure is used to communicate information @@ -19542,7 +20382,7 @@ typedef struct { /* Tuning parameters are set using SQLITE_TESTCTRL_TUNE and are controlled ** on debug-builds of the CLI using ".testctrl tune ID VALUE". Tuning ** parameters are for temporary use during development, to help find -** optimial values for parameters in the query planner. The should not +** optimal values for parameters in the query planner. The should not ** be used on trunk check-ins. They are a temporary mechanism available ** for transient development builds only. ** @@ -19568,6 +20408,9 @@ struct Sqlite3Config { u8 bUseCis; /* Use covering indices for full-scans */ u8 bSmallMalloc; /* Avoid large memory allocations if true */ u8 bExtraSchemaChecks; /* Verify type,name,tbl_name in schema */ +#ifdef SQLITE_DEBUG + u8 bJsonSelfcheck; /* Double-check JSON parsing */ +#endif int mxStrlen; /* Maximum string length */ int neverCorrupt; /* Database is always well-formed */ int szLookaside; /* Default lookaside buffer size */ @@ -19614,6 +20457,11 @@ struct Sqlite3Config { #endif #ifndef SQLITE_UNTESTABLE int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */ +#endif +#ifdef SQLITE_ALLOW_ROWID_IN_VIEW + u32 mNoVisibleRowid; /* TF_NoVisibleRowid if the ROWID_IN_VIEW + ** feature is disabled. 0 if rowids can + ** occur in views. */ #endif int bLocaltimeFault; /* True to fail localtime() calls */ int (*xAltLocaltime)(const void*,void*); /* Alternative localtime() routine */ @@ -19654,6 +20502,7 @@ struct Walker { void (*xSelectCallback2)(Walker*,Select*);/* Second callback for SELECTs */ int walkerDepth; /* Number of subqueries */ u16 eCode; /* A small processing code */ + u16 mWFlags; /* Use-dependent flags */ union { /* Extra data for callback */ NameContext *pNC; /* Naming context */ int n; /* A counter */ @@ -19672,6 +20521,7 @@ struct Walker { struct CoveringIndexCheck *pCovIdxCk; /* Check for covering index */ SrcItem *pSrcItem; /* A single FROM clause item */ DbFixer *pFix; /* See sqlite3FixSelect() */ + Mem *aMem; /* See sqlite3BtreeCursorHint() */ } u; }; @@ -19692,6 +20542,7 @@ struct DbFixer { /* Forward declarations */ SQLITE_PRIVATE int sqlite3WalkExpr(Walker*, Expr*); +SQLITE_PRIVATE int sqlite3WalkExprNN(Walker*, Expr*); SQLITE_PRIVATE int sqlite3WalkExprList(Walker*, ExprList*); SQLITE_PRIVATE int sqlite3WalkSelect(Walker*, Select*); SQLITE_PRIVATE int sqlite3WalkSelectExpr(Walker*, Select*); @@ -19772,6 +20623,16 @@ struct CteUse { }; +/* Client data associated with sqlite3_set_clientdata() and +** sqlite3_get_clientdata(). +*/ +struct DbClientData { + DbClientData *pNext; /* Next in a linked list */ + void *pData; /* The data */ + void (*xDestructor)(void*); /* Destructor. Might be NULL */ + char zName[1]; /* Name of this client data. MUST BE LAST */ +}; + #ifdef SQLITE_DEBUG /* ** An instance of the TreeView object is used for printing the content of @@ -19838,6 +20699,9 @@ struct Window { ** due to the SQLITE_SUBTYPE flag */ }; +SQLITE_PRIVATE Select *sqlite3MultiValues(Parse *pParse, Select *pLeft, ExprList *pRow); +SQLITE_PRIVATE void sqlite3MultiValuesEnd(Parse *pParse, Select *pVal); + #ifndef SQLITE_OMIT_WINDOWFUNC SQLITE_PRIVATE void sqlite3WindowDelete(sqlite3*, Window*); SQLITE_PRIVATE void sqlite3WindowUnlinkFromSelect(Window*); @@ -19918,15 +20782,6 @@ SQLITE_PRIVATE int sqlite3CorruptPgnoError(int,Pgno); # define SQLITE_ENABLE_FTS3 1 #endif -/* -** The ctype.h header is needed for non-ASCII systems. It is also -** needed by FTS3 when FTS3 is included in the amalgamation. -*/ -#if !defined(SQLITE_ASCII) || \ - (defined(SQLITE_ENABLE_FTS3) && defined(SQLITE_AMALGAMATION)) -# include -#endif - /* ** The following macros mimic the standard library functions toupper(), ** isspace(), isalnum(), isdigit() and isxdigit(), respectively. The @@ -19941,6 +20796,8 @@ SQLITE_PRIVATE int sqlite3CorruptPgnoError(int,Pgno); # define sqlite3Isxdigit(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x08) # define sqlite3Tolower(x) (sqlite3UpperToLower[(unsigned char)(x)]) # define sqlite3Isquote(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x80) +# define sqlite3JsonId1(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x42) +# define sqlite3JsonId2(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x46) #else # define sqlite3Toupper(x) toupper((unsigned char)(x)) # define sqlite3Isspace(x) isspace((unsigned char)(x)) @@ -19950,6 +20807,8 @@ SQLITE_PRIVATE int sqlite3CorruptPgnoError(int,Pgno); # define sqlite3Isxdigit(x) isxdigit((unsigned char)(x)) # define sqlite3Tolower(x) tolower((unsigned char)(x)) # define sqlite3Isquote(x) ((x)=='"'||(x)=='\''||(x)=='['||(x)=='`') +# define sqlite3JsonId1(x) (sqlite3IsIdChar(x)&&(x)<'0') +# define sqlite3JsonId2(x) sqlite3IsIdChar(x) #endif SQLITE_PRIVATE int sqlite3IsIdChar(u8); @@ -20053,10 +20912,13 @@ SQLITE_PRIVATE void sqlite3MutexWarnOnContention(sqlite3_mutex*); # define EXP754 (((u64)0x7ff)<<52) # define MAN754 ((((u64)1)<<52)-1) # define IsNaN(X) (((X)&EXP754)==EXP754 && ((X)&MAN754)!=0) +# define IsOvfl(X) (((X)&EXP754)==EXP754) SQLITE_PRIVATE int sqlite3IsNaN(double); +SQLITE_PRIVATE int sqlite3IsOverflow(double); #else -# define IsNaN(X) 0 -# define sqlite3IsNaN(X) 0 +# define IsNaN(X) 0 +# define sqlite3IsNaN(X) 0 +# define sqlite3IsOVerflow(X) 0 #endif /* @@ -20069,6 +20931,20 @@ struct PrintfArguments { sqlite3_value **apArg; /* The argument values */ }; +/* +** An instance of this object receives the decoding of a floating point +** value into an approximate decimal representation. +*/ +struct FpDecode { + char sign; /* '+' or '-' */ + char isSpecial; /* 1: Infinity 2: NaN */ + int n; /* Significant digits in the decode */ + int iDP; /* Location of the decimal point */ + char *z; /* Start of significant digits */ + char zBuf[24]; /* Storage for significant digits */ +}; + +SQLITE_PRIVATE void sqlite3FpDecode(FpDecode*,double,int,int); SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3*,const char*, ...); SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3*,const char*, va_list); #if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) @@ -20134,6 +21010,7 @@ SQLITE_PRIVATE int sqlite3ErrorToParser(sqlite3*,int); SQLITE_PRIVATE void sqlite3Dequote(char*); SQLITE_PRIVATE void sqlite3DequoteExpr(Expr*); SQLITE_PRIVATE void sqlite3DequoteToken(Token*); +SQLITE_PRIVATE void sqlite3DequoteNumber(Parse*, Expr*); SQLITE_PRIVATE void sqlite3TokenInit(Token*,char*); SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char*, int); SQLITE_PRIVATE int sqlite3RunParser(Parse*, const char*); @@ -20143,6 +21020,10 @@ SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse*,int); SQLITE_PRIVATE int sqlite3GetTempRange(Parse*,int); SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse*,int,int); SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse*); +SQLITE_PRIVATE void sqlite3TouchRegister(Parse*,int); +#if defined(SQLITE_ENABLE_STAT4) || defined(SQLITE_DEBUG) +SQLITE_PRIVATE int sqlite3FirstAvailableRegister(Parse*,int); +#endif #ifdef SQLITE_DEBUG SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse*,int,int); #endif @@ -20154,10 +21035,13 @@ SQLITE_PRIVATE void sqlite3PExprAddSelect(Parse*, Expr*, Select*); SQLITE_PRIVATE Expr *sqlite3ExprAnd(Parse*,Expr*, Expr*); SQLITE_PRIVATE Expr *sqlite3ExprSimplifiedAndOr(Expr*); SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse*,ExprList*, const Token*, int); +SQLITE_PRIVATE void sqlite3ExprAddFunctionOrderBy(Parse*,Expr*,ExprList*); +SQLITE_PRIVATE void sqlite3ExprOrderByAggregateError(Parse*,Expr*); SQLITE_PRIVATE void sqlite3ExprFunctionUsable(Parse*,const Expr*,const FuncDef*); SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse*, Expr*, u32); SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3*, Expr*); -SQLITE_PRIVATE void sqlite3ExprDeferredDelete(Parse*, Expr*); +SQLITE_PRIVATE void sqlite3ExprDeleteGeneric(sqlite3*,void*); +SQLITE_PRIVATE int sqlite3ExprDeferredDelete(Parse*, Expr*); SQLITE_PRIVATE void sqlite3ExprUnmapAndDelete(Parse*, Expr*); SQLITE_PRIVATE ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*); SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector(Parse*,ExprList*,IdList*,Expr*); @@ -20166,6 +21050,7 @@ SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList*,int,int); SQLITE_PRIVATE void sqlite3ExprListSetName(Parse*,ExprList*,const Token*,int); SQLITE_PRIVATE void sqlite3ExprListSetSpan(Parse*,ExprList*,const char*,const char*); SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3*, ExprList*); +SQLITE_PRIVATE void sqlite3ExprListDeleteGeneric(sqlite3*,void*); SQLITE_PRIVATE u32 sqlite3ExprListFlags(const ExprList*); SQLITE_PRIVATE int sqlite3IndexHasDuplicateRootPage(Index*); SQLITE_PRIVATE int sqlite3Init(sqlite3*, char**); @@ -20256,6 +21141,7 @@ SQLITE_PRIVATE int sqlite3DbMaskAllZero(yDbMask); SQLITE_PRIVATE void sqlite3DropTable(Parse*, SrcList*, int, int); SQLITE_PRIVATE void sqlite3CodeDropTable(Parse*, Table*, int, int); SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3*, Table*); +SQLITE_PRIVATE void sqlite3DeleteTableGeneric(sqlite3*, void*); SQLITE_PRIVATE void sqlite3FreeIndex(sqlite3*, Index*); #ifndef SQLITE_OMIT_AUTOINCREMENT SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse); @@ -20274,6 +21160,9 @@ SQLITE_PRIVATE int sqlite3IdListIndex(IdList*,const char*); SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge(Parse*, SrcList*, int, int); SQLITE_PRIVATE SrcList *sqlite3SrcListAppendList(Parse *pParse, SrcList *p1, SrcList *p2); SQLITE_PRIVATE SrcList *sqlite3SrcListAppend(Parse*, SrcList*, Token*, Token*); +SQLITE_PRIVATE void sqlite3SubqueryDelete(sqlite3*,Subquery*); +SQLITE_PRIVATE Select *sqlite3SubqueryDetach(sqlite3*,SrcItem*); +SQLITE_PRIVATE int sqlite3SrcItemAttachSubquery(Parse*, SrcItem*, Select*, int); SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*, Token*, Select*, OnOrUsing*); SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *, SrcList *, Token *); @@ -20292,8 +21181,9 @@ SQLITE_PRIVATE int sqlite3Select(Parse*, Select*, SelectDest*); SQLITE_PRIVATE Select *sqlite3SelectNew(Parse*,ExprList*,SrcList*,Expr*,ExprList*, Expr*,ExprList*,u32,Expr*); SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3*, Select*); +SQLITE_PRIVATE void sqlite3SelectDeleteGeneric(sqlite3*,void*); SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse*, SrcList*); -SQLITE_PRIVATE int sqlite3IsReadOnly(Parse*, Table*, int); +SQLITE_PRIVATE int sqlite3IsReadOnly(Parse*, Table*, Trigger*); SQLITE_PRIVATE void sqlite3OpenTable(Parse*, int iCur, int iDb, Table*, int); #if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY) SQLITE_PRIVATE Expr *sqlite3LimitWhere(Parse*,SrcList*,Expr*,ExprList*,Expr*,char*); @@ -20322,6 +21212,7 @@ SQLITE_PRIVATE void sqlite3ExprCodeLoadIndexColumn(Parse*, Index*, int, int, int SQLITE_PRIVATE int sqlite3ExprCodeGetColumn(Parse*, Table*, int, int, int, u8); SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int); SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse*, int, int, int); +SQLITE_PRIVATE void sqlite3ExprToRegister(Expr *pExpr, int iReg); SQLITE_PRIVATE void sqlite3ExprCode(Parse*, Expr*, int); #ifndef SQLITE_OMIT_GENERATED_COLUMNS SQLITE_PRIVATE void sqlite3ExprCodeGeneratedColumn(Parse*, Table*, Column*, int); @@ -20355,7 +21246,7 @@ SQLITE_PRIVATE int sqlite3ExprCompare(const Parse*,const Expr*,const Expr*, int) SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr*,Expr*,int); SQLITE_PRIVATE int sqlite3ExprListCompare(const ExprList*,const ExprList*, int); SQLITE_PRIVATE int sqlite3ExprImpliesExpr(const Parse*,const Expr*,const Expr*, int); -SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr*,int); +SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr*,int,int); SQLITE_PRIVATE void sqlite3AggInfoPersistWalkerInit(Walker*,Parse*); SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*); SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*); @@ -20377,19 +21268,18 @@ SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3*); SQLITE_PRIVATE u32 sqlite3IsTrueOrFalse(const char*); SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr*); SQLITE_PRIVATE int sqlite3ExprTruthValue(const Expr*); -SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr*); -SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr*); +SQLITE_PRIVATE int sqlite3ExprIsConstant(Parse*,Expr*); SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr*, u8); SQLITE_PRIVATE int sqlite3ExprIsConstantOrGroupBy(Parse*, Expr*, ExprList*); -SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr*,int); -SQLITE_PRIVATE int sqlite3ExprIsTableConstraint(Expr*,const SrcItem*); +SQLITE_PRIVATE int sqlite3ExprIsSingleTableConstraint(Expr*,const SrcList*,int,int); #ifdef SQLITE_ENABLE_CURSOR_HINTS SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr*); #endif -SQLITE_PRIVATE int sqlite3ExprIsInteger(const Expr*, int*); +SQLITE_PRIVATE int sqlite3ExprIsInteger(const Expr*, int*, Parse*); SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr*); SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr*, char); SQLITE_PRIVATE int sqlite3IsRowid(const char*); +SQLITE_PRIVATE const char *sqlite3RowidAlias(Table *pTab); SQLITE_PRIVATE void sqlite3GenerateRowDelete( Parse*,Table*,Trigger*,int,int,int,i16,u8,u8,u8,int); SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int, int*, int); @@ -20504,6 +21394,7 @@ SQLITE_PRIVATE int sqlite3FixSrcList(DbFixer*, SrcList*); SQLITE_PRIVATE int sqlite3FixSelect(DbFixer*, Select*); SQLITE_PRIVATE int sqlite3FixExpr(DbFixer*, Expr*); SQLITE_PRIVATE int sqlite3FixTriggerStep(DbFixer*, TriggerStep*); + SQLITE_PRIVATE int sqlite3RealSameAsInt(double,sqlite3_int64); SQLITE_PRIVATE i64 sqlite3RealToI64(double); SQLITE_PRIVATE int sqlite3Int64ToText(i64,char*); @@ -20512,10 +21403,11 @@ SQLITE_PRIVATE int sqlite3GetInt32(const char *, int*); SQLITE_PRIVATE int sqlite3GetUInt32(const char*, u32*); SQLITE_PRIVATE int sqlite3Atoi(const char*); #ifndef SQLITE_OMIT_UTF16 -SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *pData, int nChar); +SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *pData, int nByte, int nChar); #endif SQLITE_PRIVATE int sqlite3Utf8CharLen(const char *pData, int nByte); SQLITE_PRIVATE u32 sqlite3Utf8Read(const u8**); +SQLITE_PRIVATE int sqlite3Utf8ReadLimited(const u8*, int, u32*); SQLITE_PRIVATE LogEst sqlite3LogEst(u64); SQLITE_PRIVATE LogEst sqlite3LogEstAdd(LogEst,LogEst); SQLITE_PRIVATE LogEst sqlite3LogEstFromDouble(double); @@ -20564,7 +21456,9 @@ SQLITE_PRIVATE void sqlite3ErrorWithMsg(sqlite3*, int, const char*,...); SQLITE_PRIVATE void sqlite3Error(sqlite3*,int); SQLITE_PRIVATE void sqlite3ErrorClear(sqlite3*); SQLITE_PRIVATE void sqlite3SystemError(sqlite3*,int); +#if !defined(SQLITE_OMIT_BLOB_LITERAL) SQLITE_PRIVATE void *sqlite3HexToBlob(sqlite3*, const char *z, int n); +#endif SQLITE_PRIVATE u8 sqlite3HexToInt(int h); SQLITE_PRIVATE int sqlite3TwoPartName(Parse *, Token *, Token *, Token **); @@ -20608,6 +21502,7 @@ SQLITE_PRIVATE void sqlite3FileSuffix3(const char*, char*); SQLITE_PRIVATE u8 sqlite3GetBoolean(const char *z,u8); SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value*, u8); +SQLITE_PRIVATE int sqlite3ValueIsOfClass(const sqlite3_value*, void(*)(void*)); SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value*, u8); SQLITE_PRIVATE void sqlite3ValueSetStr(sqlite3_value*, int, const void *,u8, void(*)(void*)); @@ -20659,7 +21554,8 @@ SQLITE_PRIVATE int sqlite3MatchEName( const struct ExprList_item*, const char*, const char*, - const char* + const char*, + int* ); SQLITE_PRIVATE Bitmask sqlite3ExprColUsed(Expr*); SQLITE_PRIVATE u8 sqlite3StrIHash(const char*); @@ -20715,6 +21611,11 @@ SQLITE_PRIVATE void sqlite3OomClear(sqlite3*); SQLITE_PRIVATE int sqlite3ApiExit(sqlite3 *db, int); SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *); +SQLITE_PRIVATE char *sqlite3RCStrRef(char*); +SQLITE_PRIVATE void sqlite3RCStrUnref(void*); +SQLITE_PRIVATE char *sqlite3RCStrNew(u64); +SQLITE_PRIVATE char *sqlite3RCStrResize(char*,u64); + SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum*, sqlite3*, char*, int, int); SQLITE_PRIVATE int sqlite3StrAccumEnlarge(StrAccum*, i64); SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum*); @@ -20830,10 +21731,7 @@ SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3*, int, const char *); SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, VTable *); SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*); -#if (defined(SQLITE_ENABLE_DBPAGE_VTAB) || defined(SQLITE_TEST)) \ - && !defined(SQLITE_OMIT_VIRTUALTABLE) -SQLITE_PRIVATE void sqlite3VtabUsesAllSchemas(sqlite3_index_info*); -#endif +SQLITE_PRIVATE void sqlite3VtabUsesAllSchemas(Parse*); SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*); SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int); SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *); @@ -20858,6 +21756,7 @@ SQLITE_PRIVATE Cte *sqlite3CteNew(Parse*,Token*,ExprList*,Select*,u8); SQLITE_PRIVATE void sqlite3CteDelete(sqlite3*,Cte*); SQLITE_PRIVATE With *sqlite3WithAdd(Parse*,With*,Cte*); SQLITE_PRIVATE void sqlite3WithDelete(sqlite3*,With*); +SQLITE_PRIVATE void sqlite3WithDeleteGeneric(sqlite3*,void*); SQLITE_PRIVATE With *sqlite3WithPush(Parse*, With*, u8); #else # define sqlite3CteNew(P,T,E,S) ((void*)0) @@ -20870,7 +21769,7 @@ SQLITE_PRIVATE With *sqlite3WithPush(Parse*, With*, u8); SQLITE_PRIVATE Upsert *sqlite3UpsertNew(sqlite3*,ExprList*,Expr*,ExprList*,Expr*,Upsert*); SQLITE_PRIVATE void sqlite3UpsertDelete(sqlite3*,Upsert*); SQLITE_PRIVATE Upsert *sqlite3UpsertDup(sqlite3*,Upsert*); -SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget(Parse*,SrcList*,Upsert*); +SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget(Parse*,SrcList*,Upsert*,Upsert*); SQLITE_PRIVATE void sqlite3UpsertDoUpdate(Parse*,Upsert*,Table*,Index*,int); SQLITE_PRIVATE Upsert *sqlite3UpsertOfIndex(Upsert*,Index*); SQLITE_PRIVATE int sqlite3UpsertNextIsIPK(Upsert*); @@ -20969,6 +21868,7 @@ SQLITE_PRIVATE int sqlite3ExprCheckHeight(Parse*, int); #define sqlite3SelectExprHeight(x) 0 #define sqlite3ExprCheckHeight(x,y) #endif +SQLITE_PRIVATE void sqlite3ExprSetErrorOffset(Expr*,int); SQLITE_PRIVATE u32 sqlite3Get4byte(const u8*); SQLITE_PRIVATE void sqlite3Put4byte(u8*, u32); @@ -21080,6 +21980,12 @@ SQLITE_PRIVATE int sqlite3KvvfsInit(void); SQLITE_PRIVATE sqlite3_uint64 sqlite3Hwtime(void); #endif +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS +# define IS_STMT_SCANSTATUS(db) (db->flags & SQLITE_StmtScanStatus) +#else +# define IS_STMT_SCANSTATUS(db) 0 +#endif + #endif /* SQLITEINT_H */ /************** End of sqliteInt.h *******************************************/ @@ -21248,14 +22154,14 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_4_BYTE_ALIGNED_MALLOC "4_BYTE_ALIGNED_MALLOC", #endif -#ifdef SQLITE_64BIT_STATS - "64BIT_STATS", -#endif #ifdef SQLITE_ALLOW_COVERING_INDEX_SCAN # if SQLITE_ALLOW_COVERING_INDEX_SCAN != 1 "ALLOW_COVERING_INDEX_SCAN=" CTIMEOPT_VAL(SQLITE_ALLOW_COVERING_INDEX_SCAN), # endif #endif +#ifdef SQLITE_ALLOW_ROWID_IN_VIEW + "ALLOW_ROWID_IN_VIEW", +#endif #ifdef SQLITE_ALLOW_URI_AUTHORITY "ALLOW_URI_AUTHORITY", #endif @@ -21483,6 +22389,9 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC "ENABLE_OFFSET_SQL_FUNC", #endif +#ifdef SQLITE_ENABLE_ORDERED_SET_AGGREGATES + "ENABLE_ORDERED_SET_AGGREGATES", +#endif #ifdef SQLITE_ENABLE_OVERSIZE_CELL_CHECK "ENABLE_OVERSIZE_CELL_CHECK", #endif @@ -21546,6 +22455,9 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_EXPLAIN_ESTIMATED_ROWS "EXPLAIN_ESTIMATED_ROWS", #endif +#ifdef SQLITE_EXTRA_AUTOEXT + "EXTRA_AUTOEXT=" CTIMEOPT_VAL(SQLITE_EXTRA_AUTOEXT), +#endif #ifdef SQLITE_EXTRA_IFNULLROW "EXTRA_IFNULLROW", #endif @@ -21587,6 +22499,9 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_INTEGRITY_CHECK_ERROR_MAX "INTEGRITY_CHECK_ERROR_MAX=" CTIMEOPT_VAL(SQLITE_INTEGRITY_CHECK_ERROR_MAX), #endif +#ifdef SQLITE_LEGACY_JSON_VALID + "LEGACY_JSON_VALID", +#endif #ifdef SQLITE_LIKE_DOESNT_MATCH_BLOBS "LIKE_DOESNT_MATCH_BLOBS", #endif @@ -21824,6 +22739,9 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS "OMIT_SCHEMA_VERSION_PRAGMAS", #endif +#ifdef SQLITE_OMIT_SEH + "OMIT_SEH", +#endif #ifdef SQLITE_OMIT_SHARED_CACHE "OMIT_SHARED_CACHE", #endif @@ -22075,7 +22993,7 @@ SQLITE_PRIVATE const unsigned char *sqlite3aGTb = &sqlite3UpperToLower[256+12-OP ** isalnum() 0x06 ** isxdigit() 0x08 ** toupper() 0x20 -** SQLite identifier character 0x40 +** SQLite identifier character 0x40 $, _, or non-ascii ** Quote character 0x80 ** ** Bit 0x20 is set if the mapped character requires translation to upper @@ -22221,6 +23139,9 @@ SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = { SQLITE_ALLOW_COVERING_INDEX_SCAN, /* bUseCis */ 0, /* bSmallMalloc */ 1, /* bExtraSchemaChecks */ +#ifdef SQLITE_DEBUG + 0, /* bJsonSelfcheck */ +#endif 0x7ffffffe, /* mxStrlen */ 0, /* neverCorrupt */ SQLITE_DEFAULT_LOOKASIDE, /* szLookaside, nLookaside */ @@ -22262,6 +23183,9 @@ SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = { #endif #ifndef SQLITE_UNTESTABLE 0, /* xTestCallback */ +#endif +#ifdef SQLITE_ALLOW_ROWID_IN_VIEW + 0, /* mNoVisibleRowid. 0 == allow rowid-in-view */ #endif 0, /* bLocaltimeFault */ 0, /* xAltLocaltime */ @@ -22269,7 +23193,7 @@ SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = { SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */ 0, /* iPrngSeed */ #ifdef SQLITE_DEBUG - {0,0,0,0,0,0} /* aTune */ + {0,0,0,0,0,0}, /* aTune */ #endif }; @@ -22450,6 +23374,9 @@ typedef struct VdbeSorter VdbeSorter; /* Elements of the linked list at Vdbe.pAuxData */ typedef struct AuxData AuxData; +/* A cache of large TEXT or BLOB values in a VdbeCursor */ +typedef struct VdbeTxtBlbCache VdbeTxtBlbCache; + /* Types of VDBE cursors */ #define CURTYPE_BTREE 0 #define CURTYPE_SORTER 1 @@ -22481,6 +23408,7 @@ struct VdbeCursor { Bool useRandomRowid:1; /* Generate new record numbers semi-randomly */ Bool isOrdered:1; /* True if the table is not BTREE_UNORDERED */ Bool noReuse:1; /* OpenEphemeral may not reuse this cursor */ + Bool colCache:1; /* pCache pointer is initialized and non-NULL */ u16 seekHit; /* See the OP_SeekHit and OP_IfNoHope opcodes */ union { /* pBtx for isEphermeral. pAltMap otherwise */ Btree *pBtx; /* Separate file holding temporary table */ @@ -22521,6 +23449,7 @@ struct VdbeCursor { #ifdef SQLITE_ENABLE_COLUMN_USED_MASK u64 maskUsed; /* Mask of columns used by this cursor */ #endif + VdbeTxtBlbCache *pCache; /* Cache of large TEXT or BLOB values */ /* 2*nField extra array elements allocated for aType[], beyond the one ** static element declared in the structure. nField total array slots for @@ -22533,12 +23462,25 @@ struct VdbeCursor { #define IsNullCursor(P) \ ((P)->eCurType==CURTYPE_PSEUDO && (P)->nullRow && (P)->seekResult==0) - /* ** A value for VdbeCursor.cacheStatus that means the cache is always invalid. */ #define CACHE_STALE 0 +/* +** Large TEXT or BLOB values can be slow to load, so we want to avoid +** loading them more than once. For that reason, large TEXT and BLOB values +** can be stored in a cache defined by this object, and attached to the +** VdbeCursor using the pCache field. +*/ +struct VdbeTxtBlbCache { + char *pCValue; /* A RCStr buffer to hold the value */ + i64 iOffset; /* File offset of the row being cached */ + int iCol; /* Column for which the cache is valid */ + u32 cacheStatus; /* Vdbe.cacheCtr value */ + u32 colCacheCtr; /* Column cache counter */ +}; + /* ** When a sub-program is executed (OP_Program), a structure of this type ** is allocated to store the current value of the program counter, as @@ -22859,16 +23801,18 @@ struct Vdbe { u32 nWrite; /* Number of write operations that have occurred */ #endif u16 nResColumn; /* Number of columns in one row of the result set */ + u16 nResAlloc; /* Column slots allocated to aColName[] */ u8 errorAction; /* Recovery action to do in case of an error */ u8 minWriteFileFormat; /* Minimum file format for writable database files */ u8 prepFlags; /* SQLITE_PREPARE_* flags */ u8 eVdbeState; /* On of the VDBE_*_STATE values */ bft expired:2; /* 1: recompile VM immediately 2: when convenient */ - bft explain:2; /* True if EXPLAIN present on SQL command */ + bft explain:2; /* 0: normal, 1: EXPLAIN, 2: EXPLAIN QUERY PLAN */ bft changeCntOn:1; /* True to update the change-counter */ bft usesStmtJournal:1; /* True if uses a statement journal */ bft readOnly:1; /* True for statements that do not write */ bft bIsReader:1; /* True for statements that read */ + bft haveEqpOps:1; /* Bytecode supports EXPLAIN QUERY PLAN */ yDbMask btreeMask; /* Bitmask of db->aDb[] entries referenced */ yDbMask lockMask; /* Subset of btreeMask that requires a lock */ u32 aCounter[9]; /* Counters used by sqlite3_stmt_status() */ @@ -22915,8 +23859,9 @@ struct PreUpdate { i64 iKey1; /* First key value passed to hook */ i64 iKey2; /* Second key value passed to hook */ Mem *aNew; /* Array of new.* values */ - Table *pTab; /* Schema object being upated */ + Table *pTab; /* Schema object being updated */ Index *pPk; /* PK index if pTab is WITHOUT ROWID */ + sqlite3_value **apDflt; /* Array of default values, if required */ }; /* @@ -23005,6 +23950,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetZeroBlob(Mem*,int); SQLITE_PRIVATE int sqlite3VdbeMemIsRowSet(const Mem*); #endif SQLITE_PRIVATE int sqlite3VdbeMemSetRowSet(Mem*); +SQLITE_PRIVATE void sqlite3VdbeMemZeroTerminateIfAble(Mem*); SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem*); SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem*, u8, u8); SQLITE_PRIVATE int sqlite3IntFloatCompare(i64,double); @@ -23452,7 +24398,7 @@ SQLITE_API int sqlite3_db_status( case SQLITE_DBSTATUS_CACHE_MISS: case SQLITE_DBSTATUS_CACHE_WRITE:{ int i; - int nRet = 0; + u64 nRet = 0; assert( SQLITE_DBSTATUS_CACHE_MISS==SQLITE_DBSTATUS_CACHE_HIT+1 ); assert( SQLITE_DBSTATUS_CACHE_WRITE==SQLITE_DBSTATUS_CACHE_HIT+2 ); @@ -23465,7 +24411,7 @@ SQLITE_API int sqlite3_db_status( *pHighwater = 0; /* IMP: R-42420-56072 */ /* IMP: R-54100-20147 */ /* IMP: R-29431-39229 */ - *pCurrent = nRet; + *pCurrent = (int)nRet & 0x7fffffff; break; } @@ -23562,12 +24508,14 @@ struct DateTime { int tz; /* Timezone offset in minutes */ double s; /* Seconds */ char validJD; /* True (1) if iJD is valid */ - char rawS; /* Raw numeric value stored in s */ char validYMD; /* True (1) if Y,M,D are valid */ char validHMS; /* True (1) if h,m,s are valid */ - char validTZ; /* True (1) if tz is valid */ - char tzSet; /* Timezone was set explicitly */ - char isError; /* An overflow has occurred */ + char nFloor; /* Days to implement "floor" */ + unsigned rawS : 1; /* Raw numeric value stored in s */ + unsigned isError : 1; /* An overflow has occurred */ + unsigned useSubsec : 1; /* Display subsecond precision */ + unsigned isUtc : 1; /* Time is known to be UTC */ + unsigned isLocal : 1; /* Time is known to be localtime */ }; @@ -23600,8 +24548,8 @@ struct DateTime { */ static int getDigits(const char *zDate, const char *zFormat, ...){ /* The aMx[] array translates the 3rd character of each format - ** spec into a max size: a b c d e f */ - static const u16 aMx[] = { 12, 14, 24, 31, 59, 9999 }; + ** spec into a max size: a b c d e f */ + static const u16 aMx[] = { 12, 14, 24, 31, 59, 14712 }; va_list ap; int cnt = 0; char nextC; @@ -23665,6 +24613,8 @@ static int parseTimezone(const char *zDate, DateTime *p){ sgn = +1; }else if( c=='Z' || c=='z' ){ zDate++; + p->isLocal = 0; + p->isUtc = 1; goto zulu_time; }else{ return c!=0; @@ -23677,7 +24627,6 @@ static int parseTimezone(const char *zDate, DateTime *p){ p->tz = sgn*(nMn + nHr*60); zulu_time: while( sqlite3Isspace(*zDate) ){ zDate++; } - p->tzSet = 1; return *zDate!=0; } @@ -23721,7 +24670,6 @@ static int parseHhMmSs(const char *zDate, DateTime *p){ p->m = m; p->s = s + ms; if( parseTimezone(zDate, p) ) return 1; - p->validTZ = (p->tz!=0)?1:0; return 0; } @@ -23760,23 +24708,48 @@ static void computeJD(DateTime *p){ Y--; M += 12; } - A = Y/100; - B = 2 - A + (A/4); + A = (Y+4800)/100; + B = 38 - A + (A/4); X1 = 36525*(Y+4716)/100; X2 = 306001*(M+1)/10000; p->iJD = (sqlite3_int64)((X1 + X2 + D + B - 1524.5 ) * 86400000); p->validJD = 1; if( p->validHMS ){ p->iJD += p->h*3600000 + p->m*60000 + (sqlite3_int64)(p->s*1000 + 0.5); - if( p->validTZ ){ + if( p->tz ){ p->iJD -= p->tz*60000; p->validYMD = 0; p->validHMS = 0; - p->validTZ = 0; + p->tz = 0; + p->isUtc = 1; + p->isLocal = 0; } } } +/* +** Given the YYYY-MM-DD information current in p, determine if there +** is day-of-month overflow and set nFloor to the number of days that +** would need to be subtracted from the date in order to bring the +** date back to the end of the month. +*/ +static void computeFloor(DateTime *p){ + assert( p->validYMD || p->isError ); + assert( p->D>=0 && p->D<=31 ); + assert( p->M>=0 && p->M<=12 ); + if( p->D<=28 ){ + p->nFloor = 0; + }else if( (1<M) & 0x15aa ){ + p->nFloor = 0; + }else if( p->M!=2 ){ + p->nFloor = (p->D==31); + }else if( p->Y%4!=0 || (p->Y%100==0 && p->Y%400!=0) ){ + p->nFloor = p->D - 28; + }else{ + p->nFloor = p->D - 29; + } +} + /* ** Parse dates of the form ** @@ -23815,12 +24788,16 @@ static int parseYyyyMmDd(const char *zDate, DateTime *p){ p->Y = neg ? -Y : Y; p->M = M; p->D = D; - if( p->validTZ ){ + computeFloor(p); + if( p->tz ){ computeJD(p); } return 0; } + +static void clearYMD_HMS_TZ(DateTime *p); /* Forward declaration */ + /* ** Set the time to the current time reported by the VFS. ** @@ -23830,6 +24807,9 @@ static int setDateTimeToCurrent(sqlite3_context *context, DateTime *p){ p->iJD = sqlite3StmtCurrentTime(context); if( p->iJD>0 ){ p->validJD = 1; + p->isUtc = 1; + p->isLocal = 0; + clearYMD_HMS_TZ(p); return 0; }else{ return 1; @@ -23882,6 +24862,11 @@ static int parseDateOrTime( }else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8)>0 ){ setRawDateNumber(p, r); return 0; + }else if( (sqlite3StrICmp(zDate,"subsec")==0 + || sqlite3StrICmp(zDate,"subsecond")==0) + && sqlite3NotPureFunc(context) ){ + p->useSubsec = 1; + return setDateTimeToCurrent(context, p); } return 1; } @@ -23908,7 +24893,7 @@ static int validJulianDay(sqlite3_int64 iJD){ ** Compute the Year, Month, and Day from the julian day number. */ static void computeYMD(DateTime *p){ - int Z, A, B, C, D, E, X1; + int Z, alpha, A, B, C, D, E, X1; if( p->validYMD ) return; if( !p->validJD ){ p->Y = 2000; @@ -23919,8 +24904,8 @@ static void computeYMD(DateTime *p){ return; }else{ Z = (int)((p->iJD + 43200000)/86400000); - A = (int)((Z - 1867216.25)/36524.25); - A = Z + 1 + A - (A/4); + alpha = (int)((Z + 32044.75)/36524.25) - 52; + A = Z + 1 + alpha - ((alpha+100)/4) + 25; B = A + 1524; C = (int)((B - 122.1)/365.25); D = (36525*(C&32767))/100; @@ -23937,17 +24922,14 @@ static void computeYMD(DateTime *p){ ** Compute the Hour, Minute, and Seconds from the julian day number. */ static void computeHMS(DateTime *p){ - int s; + int day_ms, day_min; /* milliseconds, minutes into the day */ if( p->validHMS ) return; computeJD(p); - s = (int)((p->iJD + 43200000) % 86400000); - p->s = s/1000.0; - s = (int)p->s; - p->s -= s; - p->h = s/3600; - s -= p->h*3600; - p->m = s/60; - p->s += s - p->m*60; + day_ms = (int)((p->iJD + 43200000) % 86400000); + p->s = (day_ms % 60000)/1000.0; + day_min = day_ms/60000; + p->m = day_min % 60; + p->h = day_min / 60; p->rawS = 0; p->validHMS = 1; } @@ -23966,7 +24948,7 @@ static void computeYMD_HMS(DateTime *p){ static void clearYMD_HMS_TZ(DateTime *p){ p->validYMD = 0; p->validHMS = 0; - p->validTZ = 0; + p->tz = 0; } #ifndef SQLITE_OMIT_LOCALTIME @@ -24098,7 +25080,7 @@ static int toLocaltime( p->validHMS = 1; p->validJD = 0; p->rawS = 0; - p->validTZ = 0; + p->tz = 0; p->isError = 0; return SQLITE_OK; } @@ -24118,14 +25100,33 @@ static const struct { float rLimit; /* Maximum NNN value for this transform */ float rXform; /* Constant used for this transform */ } aXformType[] = { - { 6, "second", 4.6427e+14, 1.0 }, - { 6, "minute", 7.7379e+12, 60.0 }, - { 4, "hour", 1.2897e+11, 3600.0 }, - { 3, "day", 5373485.0, 86400.0 }, - { 5, "month", 176546.0, 2592000.0 }, - { 4, "year", 14713.0, 31536000.0 }, + /* 0 */ { 6, "second", 4.6427e+14, 1.0 }, + /* 1 */ { 6, "minute", 7.7379e+12, 60.0 }, + /* 2 */ { 4, "hour", 1.2897e+11, 3600.0 }, + /* 3 */ { 3, "day", 5373485.0, 86400.0 }, + /* 4 */ { 5, "month", 176546.0, 2592000.0 }, + /* 5 */ { 4, "year", 14713.0, 31536000.0 }, }; +/* +** If the DateTime p is raw number, try to figure out if it is +** a julian day number of a unix timestamp. Set the p value +** appropriately. +*/ +static void autoAdjustDate(DateTime *p){ + if( !p->rawS || p->validJD ){ + p->rawS = 0; + }else if( p->s>=-21086676*(i64)10000 /* -4713-11-24 12:00:00 */ + && p->s<=(25340230*(i64)10000)+799 /* 9999-12-31 23:59:59 */ + ){ + double r = p->s*1000.0 + 210866760000000.0; + clearYMD_HMS_TZ(p); + p->iJD = (sqlite3_int64)(r + 0.5); + p->validJD = 1; + p->rawS = 0; + } +} + /* ** Process a modifier to a date-time stamp. The modifiers are ** as follows: @@ -24136,14 +25137,20 @@ static const struct { ** NNN.NNNN seconds ** NNN months ** NNN years +** +/-YYYY-MM-DD HH:MM:SS.SSS +** ceiling +** floor ** start of month ** start of year ** start of week ** start of day ** weekday N ** unixepoch +** auto ** localtime ** utc +** subsec +** subsecond ** ** Return 0 on success and 1 if there is any kind of error. If the error ** is in a system call (i.e. localtime()), then an error message is written @@ -24169,19 +25176,39 @@ static int parseModifier( */ if( sqlite3_stricmp(z, "auto")==0 ){ if( idx>1 ) return 1; /* IMP: R-33611-57934 */ - if( !p->rawS || p->validJD ){ - rc = 0; - p->rawS = 0; - }else if( p->s>=-21086676*(i64)10000 /* -4713-11-24 12:00:00 */ - && p->s<=(25340230*(i64)10000)+799 /* 9999-12-31 23:59:59 */ - ){ - r = p->s*1000.0 + 210866760000000.0; - clearYMD_HMS_TZ(p); - p->iJD = (sqlite3_int64)(r + 0.5); - p->validJD = 1; - p->rawS = 0; - rc = 0; - } + autoAdjustDate(p); + rc = 0; + } + break; + } + case 'c': { + /* + ** ceiling + ** + ** Resolve day-of-month overflow by rolling forward into the next + ** month. As this is the default action, this modifier is really + ** a no-op that is only included for symmetry. See "floor". + */ + if( sqlite3_stricmp(z, "ceiling")==0 ){ + computeJD(p); + clearYMD_HMS_TZ(p); + rc = 0; + p->nFloor = 0; + } + break; + } + case 'f': { + /* + ** floor + ** + ** Resolve day-of-month overflow by rolling back to the end of the + ** previous month. + */ + if( sqlite3_stricmp(z, "floor")==0 ){ + computeJD(p); + p->iJD -= p->nFloor*86400000; + clearYMD_HMS_TZ(p); + rc = 0; } break; } @@ -24211,7 +25238,9 @@ static int parseModifier( ** show local time. */ if( sqlite3_stricmp(z, "localtime")==0 && sqlite3NotPureFunc(pCtx) ){ - rc = toLocaltime(p, pCtx); + rc = p->isLocal ? SQLITE_OK : toLocaltime(p, pCtx); + p->isUtc = 0; + p->isLocal = 1; } break; } @@ -24236,7 +25265,7 @@ static int parseModifier( } #ifndef SQLITE_OMIT_LOCALTIME else if( sqlite3_stricmp(z, "utc")==0 && sqlite3NotPureFunc(pCtx) ){ - if( p->tzSet==0 ){ + if( p->isUtc==0 ){ i64 iOrigJD; /* Original localtime */ i64 iGuess; /* Guess at the corresponding utc time */ int cnt = 0; /* Safety to prevent infinite loop */ @@ -24259,7 +25288,8 @@ static int parseModifier( memset(p, 0, sizeof(*p)); p->iJD = iGuess; p->validJD = 1; - p->tzSet = 1; + p->isUtc = 1; + p->isLocal = 0; } rc = SQLITE_OK; } @@ -24279,7 +25309,7 @@ static int parseModifier( && r>=0.0 && r<7.0 && (n=(int)r)==r ){ sqlite3_int64 Z; computeYMD_HMS(p); - p->validTZ = 0; + p->tz = 0; p->validJD = 0; computeJD(p); Z = ((p->iJD + 129600000)/86400000) % 7; @@ -24296,8 +25326,22 @@ static int parseModifier( ** ** Move the date backwards to the beginning of the current day, ** or month or year. + ** + ** subsecond + ** subsec + ** + ** Show subsecond precision in the output of datetime() and + ** unixepoch() and strftime('%s'). */ - if( sqlite3_strnicmp(z, "start of ", 9)!=0 ) break; + if( sqlite3_strnicmp(z, "start of ", 9)!=0 ){ + if( sqlite3_stricmp(z, "subsec")==0 + || sqlite3_stricmp(z, "subsecond")==0 + ){ + p->useSubsec = 1; + rc = 0; + } + break; + } if( !p->validJD && !p->validYMD && !p->validHMS ) break; z += 9; computeYMD(p); @@ -24305,7 +25349,7 @@ static int parseModifier( p->h = p->m = 0; p->s = 0.0; p->rawS = 0; - p->validTZ = 0; + p->tz = 0; p->validJD = 0; if( sqlite3_stricmp(z,"month")==0 ){ p->D = 1; @@ -24333,18 +25377,74 @@ static int parseModifier( case '9': { double rRounder; int i; - for(n=1; z[n] && z[n]!=':' && !sqlite3Isspace(z[n]); n++){} + int Y,M,D,h,m,x; + const char *z2 = z; + char z0 = z[0]; + for(n=1; z[n]; n++){ + if( z[n]==':' ) break; + if( sqlite3Isspace(z[n]) ) break; + if( z[n]=='-' ){ + if( n==5 && getDigits(&z[1], "40f", &Y)==1 ) break; + if( n==6 && getDigits(&z[1], "50f", &Y)==1 ) break; + } + } if( sqlite3AtoF(z, &r, n, SQLITE_UTF8)<=0 ){ - rc = 1; + assert( rc==1 ); break; } - if( z[n]==':' ){ + if( z[n]=='-' ){ + /* A modifier of the form (+|-)YYYY-MM-DD adds or subtracts the + ** specified number of years, months, and days. MM is limited to + ** the range 0-11 and DD is limited to 0-30. + */ + if( z0!='+' && z0!='-' ) break; /* Must start with +/- */ + if( n==5 ){ + if( getDigits(&z[1], "40f-20a-20d", &Y, &M, &D)!=3 ) break; + }else{ + assert( n==6 ); + if( getDigits(&z[1], "50f-20a-20d", &Y, &M, &D)!=3 ) break; + z++; + } + if( M>=12 ) break; /* M range 0..11 */ + if( D>=31 ) break; /* D range 0..30 */ + computeYMD_HMS(p); + p->validJD = 0; + if( z0=='-' ){ + p->Y -= Y; + p->M -= M; + D = -D; + }else{ + p->Y += Y; + p->M += M; + } + x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12; + p->Y += x; + p->M -= x*12; + computeFloor(p); + computeJD(p); + p->validHMS = 0; + p->validYMD = 0; + p->iJD += (i64)D*86400000; + if( z[11]==0 ){ + rc = 0; + break; + } + if( sqlite3Isspace(z[11]) + && getDigits(&z[12], "20c:20e", &h, &m)==2 + ){ + z2 = &z[12]; + n = 2; + }else{ + break; + } + } + if( z2[n]==':' ){ /* A modifier of the form (+|-)HH:MM:SS.FFF adds (or subtracts) the ** specified number of hours, minutes, seconds, and fractional seconds ** to the time. The ".FFF" may be omitted. The ":SS.FFF" may be ** omitted. */ - const char *z2 = z; + DateTime tx; sqlite3_int64 day; if( !sqlite3Isdigit(*z2) ) z2++; @@ -24354,7 +25454,7 @@ static int parseModifier( tx.iJD -= 43200000; day = tx.iJD/86400000; tx.iJD -= day*86400000; - if( z[0]=='-' ) tx.iJD = -tx.iJD; + if( z0=='-' ) tx.iJD = -tx.iJD; computeJD(p); clearYMD_HMS_TZ(p); p->iJD += tx.iJD; @@ -24367,11 +25467,12 @@ static int parseModifier( z += n; while( sqlite3Isspace(*z) ) z++; n = sqlite3Strlen30(z); - if( n>10 || n<3 ) break; + if( n<3 || n>10 ) break; if( sqlite3UpperToLower[(u8)z[n-1]]=='s' ) n--; computeJD(p); - rc = 1; + assert( rc==1 ); rRounder = r<0 ? -0.5 : +0.5; + p->nFloor = 0; for(i=0; iM += (int)r; x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12; p->Y += x; p->M -= x*12; + computeFloor(p); p->validJD = 0; r -= (int)r; break; } case 5: { /* Special processing to add years */ int y = (int)r; - assert( strcmp(aXformType[i].zName,"year")==0 ); + assert( strcmp(aXformType[5].zName,"year")==0 ); computeYMD_HMS(p); + assert( p->M>=0 && p->M<=12 ); p->Y += y; + computeFloor(p); p->validJD = 0; r -= (int)r; break; @@ -24455,6 +25558,12 @@ static int isDate( } computeJD(p); if( p->isError || !validJulianDay(p->iJD) ) return 1; + if( argc==1 && p->validYMD && p->D>28 ){ + /* Make sure a YYYY-MM-DD is normalized. + ** Example: 2023-02-31 -> 2023-03-03 */ + assert( p->validJD ); + p->validYMD = 0; + } return 0; } @@ -24495,7 +25604,11 @@ static void unixepochFunc( DateTime x; if( isDate(context, argc, argv, &x)==0 ){ computeJD(&x); - sqlite3_result_int64(context, x.iJD/1000 - 21086676*(i64)10000); + if( x.useSubsec ){ + sqlite3_result_double(context, (x.iJD - 21086676*(i64)10000000)/1000.0); + }else{ + sqlite3_result_int64(context, x.iJD/1000 - 21086676*(i64)10000); + } } } @@ -24511,8 +25624,8 @@ static void datetimeFunc( ){ DateTime x; if( isDate(context, argc, argv, &x)==0 ){ - int Y, s; - char zBuf[24]; + int Y, s, n; + char zBuf[32]; computeYMD_HMS(&x); Y = x.Y; if( Y<0 ) Y = -Y; @@ -24533,15 +25646,28 @@ static void datetimeFunc( zBuf[15] = '0' + (x.m/10)%10; zBuf[16] = '0' + (x.m)%10; zBuf[17] = ':'; - s = (int)x.s; - zBuf[18] = '0' + (s/10)%10; - zBuf[19] = '0' + (s)%10; - zBuf[20] = 0; + if( x.useSubsec ){ + s = (int)(1000.0*x.s + 0.5); + zBuf[18] = '0' + (s/10000)%10; + zBuf[19] = '0' + (s/1000)%10; + zBuf[20] = '.'; + zBuf[21] = '0' + (s/100)%10; + zBuf[22] = '0' + (s/10)%10; + zBuf[23] = '0' + (s)%10; + zBuf[24] = 0; + n = 24; + }else{ + s = (int)x.s; + zBuf[18] = '0' + (s/10)%10; + zBuf[19] = '0' + (s)%10; + zBuf[20] = 0; + n = 20; + } if( x.Y<0 ){ zBuf[0] = '-'; - sqlite3_result_text(context, zBuf, 20, SQLITE_TRANSIENT); + sqlite3_result_text(context, zBuf, n, SQLITE_TRANSIENT); }else{ - sqlite3_result_text(context, &zBuf[1], 19, SQLITE_TRANSIENT); + sqlite3_result_text(context, &zBuf[1], n-1, SQLITE_TRANSIENT); } } } @@ -24558,7 +25684,7 @@ static void timeFunc( ){ DateTime x; if( isDate(context, argc, argv, &x)==0 ){ - int s; + int s, n; char zBuf[16]; computeHMS(&x); zBuf[0] = '0' + (x.h/10)%10; @@ -24567,11 +25693,24 @@ static void timeFunc( zBuf[3] = '0' + (x.m/10)%10; zBuf[4] = '0' + (x.m)%10; zBuf[5] = ':'; - s = (int)x.s; - zBuf[6] = '0' + (s/10)%10; - zBuf[7] = '0' + (s)%10; - zBuf[8] = 0; - sqlite3_result_text(context, zBuf, 8, SQLITE_TRANSIENT); + if( x.useSubsec ){ + s = (int)(1000.0*x.s + 0.5); + zBuf[6] = '0' + (s/10000)%10; + zBuf[7] = '0' + (s/1000)%10; + zBuf[8] = '.'; + zBuf[9] = '0' + (s/100)%10; + zBuf[10] = '0' + (s/10)%10; + zBuf[11] = '0' + (s)%10; + zBuf[12] = 0; + n = 12; + }else{ + s = (int)x.s; + zBuf[6] = '0' + (s/10)%10; + zBuf[7] = '0' + (s)%10; + zBuf[8] = 0; + n = 8; + } + sqlite3_result_text(context, zBuf, n, SQLITE_TRANSIENT); } } @@ -24612,22 +25751,83 @@ static void dateFunc( } } +/* +** Compute the number of days after the most recent January 1. +** +** In other words, compute the zero-based day number for the +** current year: +** +** Jan01 = 0, Jan02 = 1, ..., Jan31 = 30, Feb01 = 31, ... +** Dec31 = 364 or 365. +*/ +static int daysAfterJan01(DateTime *pDate){ + DateTime jan01 = *pDate; + assert( jan01.validYMD ); + assert( jan01.validHMS ); + assert( pDate->validJD ); + jan01.validJD = 0; + jan01.M = 1; + jan01.D = 1; + computeJD(&jan01); + return (int)((pDate->iJD-jan01.iJD+43200000)/86400000); +} + +/* +** Return the number of days after the most recent Monday. +** +** In other words, return the day of the week according +** to this code: +** +** 0=Monday, 1=Tuesday, 2=Wednesday, ..., 6=Sunday. +*/ +static int daysAfterMonday(DateTime *pDate){ + assert( pDate->validJD ); + return (int)((pDate->iJD+43200000)/86400000) % 7; +} + +/* +** Return the number of days after the most recent Sunday. +** +** In other words, return the day of the week according +** to this code: +** +** 0=Sunday, 1=Monday, 2=Tues, ..., 6=Saturday +*/ +static int daysAfterSunday(DateTime *pDate){ + assert( pDate->validJD ); + return (int)((pDate->iJD+129600000)/86400000) % 7; +} + /* ** strftime( FORMAT, TIMESTRING, MOD, MOD, ...) ** ** Return a string described by FORMAT. Conversions as follows: ** -** %d day of month +** %d day of month 01-31 +** %e day of month 1-31 ** %f ** fractional seconds SS.SSS +** %F ISO date. YYYY-MM-DD +** %G ISO year corresponding to %V 0000-9999. +** %g 2-digit ISO year corresponding to %V 00-99 ** %H hour 00-24 -** %j day of year 000-366 +** %k hour 0-24 (leading zero converted to space) +** %I hour 01-12 +** %j day of year 001-366 ** %J ** julian day number +** %l hour 1-12 (leading zero converted to space) ** %m month 01-12 ** %M minute 00-59 +** %p "am" or "pm" +** %P "AM" or "PM" +** %R time as HH:MM ** %s seconds since 1970-01-01 ** %S seconds 00-59 -** %w day of week 0-6 sunday==0 -** %W week of year 00-53 +** %T time as HH:MM:SS +** %u day of week 1-7 Monday==1, Sunday==7 +** %w day of week 0-6 Sunday==0, Monday==1 +** %U week of year 00-53 (First Sunday is start of week 01) +** %V week of year 01-53 (First week containing Thursday is week 01) +** %W week of year 00-53 (First Monday is start of week 01) ** %Y year 0000-9999 ** %% % */ @@ -24652,44 +25852,61 @@ static void strftimeFunc( computeJD(&x); computeYMD_HMS(&x); for(i=j=0; zFmt[i]; i++){ + char cf; if( zFmt[i]!='%' ) continue; if( j59.999 ) s = 59.999; sqlite3_str_appendf(&sRes, "%06.3f", s); break; } - case 'H': { - sqlite3_str_appendf(&sRes, "%02d", x.h); + case 'F': { + sqlite3_str_appendf(&sRes, "%04d-%02d-%02d", x.Y, x.M, x.D); break; } - case 'W': /* Fall thru */ - case 'j': { - int nDay; /* Number of days since 1st day of year */ + case 'G': /* Fall thru */ + case 'g': { DateTime y = x; - y.validJD = 0; - y.M = 1; - y.D = 1; - computeJD(&y); - nDay = (int)((x.iJD-y.iJD+43200000)/86400000); - if( zFmt[i]=='W' ){ - int wd; /* 0=Monday, 1=Tuesday, ... 6=Sunday */ - wd = (int)(((x.iJD+43200000)/86400000)%7); - sqlite3_str_appendf(&sRes,"%02d",(nDay+7-wd)/7); + assert( y.validJD ); + /* Move y so that it is the Thursday in the same week as x */ + y.iJD += (3 - daysAfterMonday(&x))*86400000; + y.validYMD = 0; + computeYMD(&y); + if( cf=='g' ){ + sqlite3_str_appendf(&sRes, "%02d", y.Y%100); }else{ - sqlite3_str_appendf(&sRes,"%03d",nDay+1); + sqlite3_str_appendf(&sRes, "%04d", y.Y); } break; } - case 'J': { + case 'H': + case 'k': { + sqlite3_str_appendf(&sRes, cf=='H' ? "%02d" : "%2d", x.h); + break; + } + case 'I': /* Fall thru */ + case 'l': { + int h = x.h; + if( h>12 ) h -= 12; + if( h==0 ) h = 12; + sqlite3_str_appendf(&sRes, cf=='I' ? "%02d" : "%2d", h); + break; + } + case 'j': { /* Day of year. Jan01==1, Jan02==2, and so forth */ + sqlite3_str_appendf(&sRes,"%03d",daysAfterJan01(&x)+1); + break; + } + case 'J': { /* Julian day number. (Non-standard) */ sqlite3_str_appendf(&sRes,"%.16g",x.iJD/86400000.0); break; } @@ -24701,18 +25918,62 @@ static void strftimeFunc( sqlite3_str_appendf(&sRes,"%02d",x.m); break; } + case 'p': /* Fall thru */ + case 'P': { + if( x.h>=12 ){ + sqlite3_str_append(&sRes, cf=='p' ? "PM" : "pm", 2); + }else{ + sqlite3_str_append(&sRes, cf=='p' ? "AM" : "am", 2); + } + break; + } + case 'R': { + sqlite3_str_appendf(&sRes, "%02d:%02d", x.h, x.m); + break; + } case 's': { - i64 iS = (i64)(x.iJD/1000 - 21086676*(i64)10000); - sqlite3_str_appendf(&sRes,"%lld",iS); + if( x.useSubsec ){ + sqlite3_str_appendf(&sRes,"%.3f", + (x.iJD - 21086676*(i64)10000000)/1000.0); + }else{ + i64 iS = (i64)(x.iJD/1000 - 21086676*(i64)10000); + sqlite3_str_appendf(&sRes,"%lld",iS); + } break; } case 'S': { sqlite3_str_appendf(&sRes,"%02d",(int)x.s); break; } - case 'w': { - sqlite3_str_appendchar(&sRes, 1, - (char)(((x.iJD+129600000)/86400000) % 7) + '0'); + case 'T': { + sqlite3_str_appendf(&sRes,"%02d:%02d:%02d", x.h, x.m, (int)x.s); + break; + } + case 'u': /* Day of week. 1 to 7. Monday==1, Sunday==7 */ + case 'w': { /* Day of week. 0 to 6. Sunday==0, Monday==1 */ + char c = (char)daysAfterSunday(&x) + '0'; + if( c=='0' && cf=='u' ) c = '7'; + sqlite3_str_appendchar(&sRes, 1, c); + break; + } + case 'U': { /* Week num. 00-53. First Sun of the year is week 01 */ + sqlite3_str_appendf(&sRes,"%02d", + (daysAfterJan01(&x)-daysAfterSunday(&x)+7)/7); + break; + } + case 'V': { /* Week num. 01-53. First week with a Thur is week 01 */ + DateTime y = x; + /* Adjust y so that is the Thursday in the same week as x */ + assert( y.validJD ); + y.iJD += (3 - daysAfterMonday(&x))*86400000; + y.validYMD = 0; + computeYMD(&y); + sqlite3_str_appendf(&sRes,"%02d", daysAfterJan01(&y)/7+1); + break; + } + case 'W': { /* Week num. 00-53. First Mon of the year is week 01 */ + sqlite3_str_appendf(&sRes,"%02d", + (daysAfterJan01(&x)-daysAfterMonday(&x)+7)/7); break; } case 'Y': { @@ -24761,6 +26022,115 @@ static void cdateFunc( dateFunc(context, 0, 0); } +/* +** timediff(DATE1, DATE2) +** +** Return the amount of time that must be added to DATE2 in order to +** convert it into DATE2. The time difference format is: +** +** +YYYY-MM-DD HH:MM:SS.SSS +** +** The initial "+" becomes "-" if DATE1 occurs before DATE2. For +** date/time values A and B, the following invariant should hold: +** +** datetime(A) == (datetime(B, timediff(A,B)) +** +** Both DATE arguments must be either a julian day number, or an +** ISO-8601 string. The unix timestamps are not supported by this +** routine. +*/ +static void timediffFunc( + sqlite3_context *context, + int NotUsed1, + sqlite3_value **argv +){ + char sign; + int Y, M; + DateTime d1, d2; + sqlite3_str sRes; + UNUSED_PARAMETER(NotUsed1); + if( isDate(context, 1, &argv[0], &d1) ) return; + if( isDate(context, 1, &argv[1], &d2) ) return; + computeYMD_HMS(&d1); + computeYMD_HMS(&d2); + if( d1.iJD>=d2.iJD ){ + sign = '+'; + Y = d1.Y - d2.Y; + if( Y ){ + d2.Y = d1.Y; + d2.validJD = 0; + computeJD(&d2); + } + M = d1.M - d2.M; + if( M<0 ){ + Y--; + M += 12; + } + if( M!=0 ){ + d2.M = d1.M; + d2.validJD = 0; + computeJD(&d2); + } + while( d1.iJDd2.iJD ){ + M--; + if( M<0 ){ + M = 11; + Y--; + } + d2.M++; + if( d2.M>12 ){ + d2.M = 1; + d2.Y++; + } + d2.validJD = 0; + computeJD(&d2); + } + d1.iJD = d2.iJD - d1.iJD; + d1.iJD += (u64)1486995408 * (u64)100000; + } + clearYMD_HMS_TZ(&d1); + computeYMD_HMS(&d1); + sqlite3StrAccumInit(&sRes, 0, 0, 0, 100); + sqlite3_str_appendf(&sRes, "%c%04d-%02d-%02d %02d:%02d:%06.3f", + sign, Y, M, d1.D-1, d1.h, d1.m, d1.s); + sqlite3ResultStrAccum(context, &sRes); +} + + /* ** current_timestamp() ** @@ -24821,6 +26191,36 @@ static void currentTimeFunc( } #endif +#if !defined(SQLITE_OMIT_DATETIME_FUNCS) && defined(SQLITE_DEBUG) +/* +** datedebug(...) +** +** This routine returns JSON that describes the internal DateTime object. +** Used for debugging and testing only. Subject to change. +*/ +static void datedebugFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + DateTime x; + if( isDate(context, argc, argv, &x)==0 ){ + char *zJson; + zJson = sqlite3_mprintf( + "{iJD:%lld,Y:%d,M:%d,D:%d,h:%d,m:%d,tz:%d," + "s:%.3f,validJD:%d,validYMS:%d,validHMS:%d," + "nFloor:%d,rawS:%d,isError:%d,useSubsec:%d," + "isUtc:%d,isLocal:%d}", + x.iJD, x.Y, x.M, x.D, x.h, x.m, x.tz, + x.s, x.validJD, x.validYMD, x.validHMS, + x.nFloor, x.rawS, x.isError, x.useSubsec, + x.isUtc, x.isLocal); + sqlite3_result_text(context, zJson, -1, sqlite3_free); + } +} +#endif /* !SQLITE_OMIT_DATETIME_FUNCS && SQLITE_DEBUG */ + + /* ** This function registered all of the above C functions as SQL ** functions. This should be the only routine in this file with @@ -24835,6 +26235,10 @@ SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void){ PURE_DATE(time, -1, 0, 0, timeFunc ), PURE_DATE(datetime, -1, 0, 0, datetimeFunc ), PURE_DATE(strftime, -1, 0, 0, strftimeFunc ), + PURE_DATE(timediff, 2, 0, 0, timediffFunc ), +#ifdef SQLITE_DEBUG + PURE_DATE(datedebug, -1, 0, 0, datedebugFunc ), +#endif DFUNCTION(current_time, 0, 0, 0, ctimeFunc ), DFUNCTION(current_timestamp, 0, 0, 0, ctimestampFunc), DFUNCTION(current_date, 0, 0, 0, cdateFunc ), @@ -24988,7 +26392,7 @@ SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){ /* Faults are not injected into COMMIT_PHASETWO because, assuming SQLite ** is using a regular VFS, it is called after the corresponding ** transaction has been committed. Injecting a fault at this point - ** confuses the test scripts - the COMMIT comand returns SQLITE_NOMEM + ** confuses the test scripts - the COMMIT command returns SQLITE_NOMEM ** but the transaction is committed anyway. ** ** The core must call OsFileControl() though, not OsFileControlHint(), @@ -25609,7 +27013,7 @@ static void *sqlite3MemMalloc(int nByte){ ** or sqlite3MemRealloc(). ** ** For this low-level routine, we already know that pPrior!=0 since -** cases where pPrior==0 will have been intecepted and dealt with +** cases where pPrior==0 will have been intercepted and dealt with ** by higher-level routines. */ static void sqlite3MemFree(void *pPrior){ @@ -25697,7 +27101,7 @@ static int sqlite3MemInit(void *NotUsed){ return SQLITE_OK; } len = sizeof(cpuCount); - /* One usually wants to use hw.acctivecpu for MT decisions, but not here */ + /* One usually wants to use hw.activecpu for MT decisions, but not here */ sysctlbyname("hw.ncpu", &cpuCount, &len, NULL, 0); if( cpuCount>1 ){ /* defer MT decisions to system malloc */ @@ -27689,7 +29093,7 @@ static void checkMutexFree(sqlite3_mutex *p){ assert( SQLITE_MUTEX_FAST<2 ); assert( SQLITE_MUTEX_WARNONCONTENTION<2 ); -#if SQLITE_ENABLE_API_ARMOR +#ifdef SQLITE_ENABLE_API_ARMOR if( ((CheckMutex*)p)->iType<2 ) #endif { @@ -27903,16 +29307,29 @@ SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex *p){ /* ** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are ** intended for use inside assert() statements. +** +** Because these routines raise false-positive alerts in TSAN, disable +** them (make them always return 1) when compiling with TSAN. */ SQLITE_API int sqlite3_mutex_held(sqlite3_mutex *p){ +# if defined(__has_feature) +# if __has_feature(thread_sanitizer) + p = 0; +# endif +# endif assert( p==0 || sqlite3GlobalConfig.mutex.xMutexHeld ); return p==0 || sqlite3GlobalConfig.mutex.xMutexHeld(p); } SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){ +# if defined(__has_feature) +# if __has_feature(thread_sanitizer) + p = 0; +# endif +# endif assert( p==0 || sqlite3GlobalConfig.mutex.xMutexNotheld ); return p==0 || sqlite3GlobalConfig.mutex.xMutexNotheld(p); } -#endif +#endif /* NDEBUG */ #endif /* !defined(SQLITE_MUTEX_OMIT) */ @@ -28164,7 +29581,7 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ /* ** The sqlite3_mutex.id, sqlite3_mutex.nRef, and sqlite3_mutex.owner fields -** are necessary under two condidtions: (1) Debug builds and (2) using +** are necessary under two conditions: (1) Debug builds and (2) using ** home-grown mutexes. Encapsulate these conditions into a single #define. */ #if defined(SQLITE_DEBUG) || defined(SQLITE_HOMEGROWN_RECURSIVE_MUTEX) @@ -28361,7 +29778,7 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){ */ static void pthreadMutexFree(sqlite3_mutex *p){ assert( p->nRef==0 ); -#if SQLITE_ENABLE_API_ARMOR +#ifdef SQLITE_ENABLE_API_ARMOR if( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ) #endif { @@ -28665,7 +30082,7 @@ struct sqlite3_mutex { CRITICAL_SECTION mutex; /* Mutex controlling the lock */ int id; /* Mutex type */ #ifdef SQLITE_DEBUG - volatile int nRef; /* Number of enterances */ + volatile int nRef; /* Number of entrances */ volatile DWORD owner; /* Thread holding this mutex */ volatile LONG trace; /* True to trace changes */ #endif @@ -28714,7 +30131,7 @@ SQLITE_PRIVATE void sqlite3MemoryBarrier(void){ SQLITE_MEMORY_BARRIER; #elif defined(__GNUC__) __sync_synchronize(); -#elif MSVC_VERSION>=1300 +#elif MSVC_VERSION>=1400 _ReadWriteBarrier(); #elif defined(MemoryBarrier) MemoryBarrier(); @@ -29250,6 +30667,24 @@ static void sqlite3MallocAlarm(int nByte){ sqlite3_mutex_enter(mem0.mutex); } +#ifdef SQLITE_DEBUG +/* +** This routine is called whenever an out-of-memory condition is seen, +** It's only purpose to to serve as a breakpoint for gdb or similar +** code debuggers when working on out-of-memory conditions, for example +** caused by PRAGMA hard_heap_limit=N. +*/ +static SQLITE_NOINLINE void test_oom_breakpoint(u64 n){ + static u64 nOomFault = 0; + nOomFault += n; + /* The assert() is never reached in a human lifetime. It is here mostly + ** to prevent code optimizers from optimizing out this function. */ + assert( (nOomFault>>32) < 0xffffffff ); +} +#else +# define test_oom_breakpoint(X) /* No-op for production builds */ +#endif + /* ** Do a memory allocation with statistics and alarms. Assume the ** lock is already held. @@ -29276,6 +30711,7 @@ static void mallocWithAlarm(int n, void **pp){ if( mem0.hardLimit ){ nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); if( nUsed >= mem0.hardLimit - nFull ){ + test_oom_breakpoint(1); *pp = 0; return; } @@ -29564,6 +31000,7 @@ SQLITE_PRIVATE void *sqlite3Realloc(void *pOld, u64 nBytes){ sqlite3MallocAlarm(nDiff); if( mem0.hardLimit>0 && nUsed >= mem0.hardLimit - nDiff ){ sqlite3_mutex_leave(mem0.mutex); + test_oom_breakpoint(1); return 0; } } @@ -29925,7 +31362,7 @@ SQLITE_PRIVATE int sqlite3ApiExit(sqlite3* db, int rc){ if( db->mallocFailed || rc ){ return apiHandleError(db, rc); } - return rc & db->errMask; + return 0; } /************** End of malloc.c **********************************************/ @@ -30037,43 +31474,6 @@ static const et_info fmtinfo[] = { ** %!S Like %S but prefer the zName over the zAlias */ -/* Floating point constants used for rounding */ -static const double arRound[] = { - 5.0e-01, 5.0e-02, 5.0e-03, 5.0e-04, 5.0e-05, - 5.0e-06, 5.0e-07, 5.0e-08, 5.0e-09, 5.0e-10, -}; - -/* -** If SQLITE_OMIT_FLOATING_POINT is defined, then none of the floating point -** conversions will work. -*/ -#ifndef SQLITE_OMIT_FLOATING_POINT -/* -** "*val" is a double such that 0.1 <= *val < 10.0 -** Return the ascii code for the leading digit of *val, then -** multiply "*val" by 10.0 to renormalize. -** -** Example: -** input: *val = 3.14159 -** output: *val = 1.4159 function return = '3' -** -** The counter *cnt is incremented each time. After counter exceeds -** 16 (the number of significant digits in a 64-bit float) '0' is -** always returned. -*/ -static char et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){ - int digit; - LONGDOUBLE_TYPE d; - if( (*cnt)<=0 ) return '0'; - (*cnt)--; - digit = (int)*val; - d = digit; - digit += '0'; - *val = (*val - d)*10.0; - return (char)digit; -} -#endif /* SQLITE_OMIT_FLOATING_POINT */ - /* ** Set the StrAccum object to an error mode. */ @@ -30165,18 +31565,15 @@ SQLITE_API void sqlite3_str_vappendf( u8 bArgList; /* True for SQLITE_PRINTF_SQLFUNC */ char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */ sqlite_uint64 longvalue; /* Value for integer types */ - LONGDOUBLE_TYPE realvalue; /* Value for real types */ + double realvalue; /* Value for real types */ const et_info *infop; /* Pointer to the appropriate info structure */ char *zOut; /* Rendering buffer */ int nOut; /* Size of the rendering buffer */ char *zExtra = 0; /* Malloced memory used by some conversion */ -#ifndef SQLITE_OMIT_FLOATING_POINT - int exp, e2; /* exponent of real numbers */ - int nsd; /* Number of significant digits returned */ - double rounder; /* Used for rounding floating point values */ + int exp, e2; /* exponent of real numbers */ etByte flag_dp; /* True if decimal point should be shown */ etByte flag_rtz; /* True if trailing zeros should be removed */ -#endif + PrintfArguments *pArgList = 0; /* Arguments for SQLITE_PRINTF_SQLFUNC */ char buf[etBUFSIZE]; /* Conversion buffer */ @@ -30451,74 +31848,69 @@ SQLITE_API void sqlite3_str_vappendf( break; case etFLOAT: case etEXP: - case etGENERIC: + case etGENERIC: { + FpDecode s; + int iRound; + int j; + if( bArgList ){ realvalue = getDoubleArg(pArgList); }else{ realvalue = va_arg(ap,double); } -#ifdef SQLITE_OMIT_FLOATING_POINT - length = 0; -#else if( precision<0 ) precision = 6; /* Set default precision */ #ifdef SQLITE_FP_PRECISION_LIMIT if( precision>SQLITE_FP_PRECISION_LIMIT ){ precision = SQLITE_FP_PRECISION_LIMIT; } #endif - if( realvalue<0.0 ){ - realvalue = -realvalue; - prefix = '-'; - }else{ - prefix = flag_prefix; - } - if( xtype==etGENERIC && precision>0 ) precision--; - testcase( precision>0xfff ); - idx = precision & 0xfff; - rounder = arRound[idx%10]; - while( idx>=10 ){ rounder *= 1.0e-10; idx -= 10; } if( xtype==etFLOAT ){ - double rx = (double)realvalue; - sqlite3_uint64 u; - int ex; - memcpy(&u, &rx, sizeof(u)); - ex = -1023 + (int)((u>>52)&0x7ff); - if( precision+(ex/3) < 15 ) rounder += realvalue*3e-16; - realvalue += rounder; - } - /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */ - exp = 0; - if( sqlite3IsNaN((double)realvalue) ){ - bufpt = "NaN"; - length = 3; - break; + iRound = -precision; + }else if( xtype==etGENERIC ){ + if( precision==0 ) precision = 1; + iRound = precision; + }else{ + iRound = precision+1; } - if( realvalue>0.0 ){ - LONGDOUBLE_TYPE scale = 1.0; - while( realvalue>=1e100*scale && exp<=350 ){ scale *= 1e100;exp+=100;} - while( realvalue>=1e10*scale && exp<=350 ){ scale *= 1e10; exp+=10; } - while( realvalue>=10.0*scale && exp<=350 ){ scale *= 10.0; exp++; } - realvalue /= scale; - while( realvalue<1e-8 ){ realvalue *= 1e8; exp-=8; } - while( realvalue<1.0 ){ realvalue *= 10.0; exp--; } - if( exp>350 ){ + sqlite3FpDecode(&s, realvalue, iRound, flag_altform2 ? 26 : 16); + if( s.isSpecial ){ + if( s.isSpecial==2 ){ + bufpt = flag_zeropad ? "null" : "NaN"; + length = sqlite3Strlen30(bufpt); + break; + }else if( flag_zeropad ){ + s.z[0] = '9'; + s.iDP = 1000; + s.n = 1; + }else{ + memcpy(buf, "-Inf", 5); bufpt = buf; - buf[0] = prefix; - memcpy(buf+(prefix!=0),"Inf",4); - length = 3+(prefix!=0); + if( s.sign=='-' ){ + /* no-op */ + }else if( flag_prefix ){ + buf[0] = flag_prefix; + }else{ + bufpt++; + } + length = sqlite3Strlen30(bufpt); break; } } - bufpt = buf; + if( s.sign=='-' ){ + prefix = '-'; + }else{ + prefix = flag_prefix; + } + + exp = s.iDP-1; + /* ** If the field type is etGENERIC, then convert to either etEXP ** or etFLOAT, as appropriate. */ - if( xtype!=etFLOAT ){ - realvalue += rounder; - if( realvalue>=10.0 ){ realvalue *= 0.1; exp++; } - } if( xtype==etGENERIC ){ + assert( precision>0 ); + precision--; flag_rtz = !flag_alternateform; if( exp<-4 || exp>precision ){ xtype = etEXP; @@ -30532,29 +31924,32 @@ SQLITE_API void sqlite3_str_vappendf( if( xtype==etEXP ){ e2 = 0; }else{ - e2 = exp; + e2 = s.iDP - 1; } + bufpt = buf; { i64 szBufNeeded; /* Size of a temporary buffer needed */ szBufNeeded = MAX(e2,0)+(i64)precision+(i64)width+15; + if( cThousand && e2>0 ) szBufNeeded += (e2+2)/3; if( szBufNeeded > etBUFSIZE ){ bufpt = zExtra = printfTempBuf(pAccum, szBufNeeded); if( bufpt==0 ) return; } } zOut = bufpt; - nsd = 16 + flag_altform2*10; flag_dp = (precision>0 ?1:0) | flag_alternateform | flag_altform2; /* The sign in front of the number */ if( prefix ){ *(bufpt++) = prefix; } /* Digits prior to the decimal point */ + j = 0; if( e2<0 ){ *(bufpt++) = '0'; }else{ for(; e2>=0; e2--){ - *(bufpt++) = et_getdigit(&realvalue,&nsd); + *(bufpt++) = j1 ) *(bufpt++) = ','; } } /* The decimal point */ @@ -30563,13 +31958,12 @@ SQLITE_API void sqlite3_str_vappendf( } /* "0" digits after the decimal point but before the first ** significant digit of the number */ - for(e2++; e2<0; precision--, e2++){ - assert( precision>0 ); + for(e2++; e2<0 && precision>0; precision--, e2++){ *(bufpt++) = '0'; } /* Significant digits after the decimal point */ while( (precision--)>0 ){ - *(bufpt++) = et_getdigit(&realvalue,&nsd); + *(bufpt++) = jcharset]; if( exp<0 ){ *(bufpt++) = '-'; exp = -exp; @@ -30618,8 +32013,8 @@ SQLITE_API void sqlite3_str_vappendf( while( nPad-- ) bufpt[i++] = '0'; length = width; } -#endif /* !defined(SQLITE_OMIT_FLOATING_POINT) */ break; + } case etSIZE: if( !bArgList ){ *(va_arg(ap,int*)) = pAccum->nChar; @@ -30822,18 +32217,25 @@ SQLITE_API void sqlite3_str_vappendf( if( pItem->zAlias && !flag_altform2 ){ sqlite3_str_appendall(pAccum, pItem->zAlias); }else if( pItem->zName ){ - if( pItem->zDatabase ){ - sqlite3_str_appendall(pAccum, pItem->zDatabase); + if( pItem->fg.fixedSchema==0 + && pItem->fg.isSubquery==0 + && pItem->u4.zDatabase!=0 + ){ + sqlite3_str_appendall(pAccum, pItem->u4.zDatabase); sqlite3_str_append(pAccum, ".", 1); } sqlite3_str_appendall(pAccum, pItem->zName); }else if( pItem->zAlias ){ sqlite3_str_appendall(pAccum, pItem->zAlias); - }else{ - Select *pSel = pItem->pSelect; + }else if( ALWAYS(pItem->fg.isSubquery) ){/* Because of tag-20240424-1 */ + Select *pSel = pItem->u4.pSubq->pSelect; assert( pSel!=0 ); if( pSel->selFlags & SF_NestedFrom ){ sqlite3_str_appendf(pAccum, "(join-%u)", pSel->selId); + }else if( pSel->selFlags & SF_MultiValue ){ + assert( !pItem->fg.isTabFunc && !pItem->fg.isIndexedBy ); + sqlite3_str_appendf(pAccum, "%u-ROW VALUES CLAUSE", + pItem->u1.nRow); }else{ sqlite3_str_appendf(pAccum, "(subquery-%u)", pSel->selId); } @@ -30905,6 +32307,7 @@ SQLITE_PRIVATE void sqlite3RecordErrorOffsetOfExpr(sqlite3 *db, const Expr *pExp pExpr = pExpr->pLeft; } if( pExpr==0 ) return; + if( ExprHasProperty(pExpr, EP_FromDDL) ) return; db->errByteOffset = pExpr->w.iOfst; } @@ -31250,12 +32653,22 @@ SQLITE_API char *sqlite3_vsnprintf(int n, char *zBuf, const char *zFormat, va_li return zBuf; } SQLITE_API char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){ - char *z; + StrAccum acc; va_list ap; + if( n<=0 ) return zBuf; +#ifdef SQLITE_ENABLE_API_ARMOR + if( zBuf==0 || zFormat==0 ) { + (void)SQLITE_MISUSE_BKPT; + if( zBuf ) zBuf[0] = 0; + return zBuf; + } +#endif + sqlite3StrAccumInit(&acc, 0, zBuf, n, 0); va_start(ap,zFormat); - z = sqlite3_vsnprintf(n, zBuf, zFormat, ap); + sqlite3_str_vappendf(&acc, zFormat, ap); va_end(ap); - return z; + zBuf[acc.nChar] = 0; + return zBuf; } /* @@ -31333,6 +32746,75 @@ SQLITE_API void sqlite3_str_appendf(StrAccum *p, const char *zFormat, ...){ va_end(ap); } + +/***************************************************************************** +** Reference counted string/blob storage +*****************************************************************************/ + +/* +** Increase the reference count of the string by one. +** +** The input parameter is returned. +*/ +SQLITE_PRIVATE char *sqlite3RCStrRef(char *z){ + RCStr *p = (RCStr*)z; + assert( p!=0 ); + p--; + p->nRCRef++; + return z; +} + +/* +** Decrease the reference count by one. Free the string when the +** reference count reaches zero. +*/ +SQLITE_PRIVATE void sqlite3RCStrUnref(void *z){ + RCStr *p = (RCStr*)z; + assert( p!=0 ); + p--; + assert( p->nRCRef>0 ); + if( p->nRCRef>=2 ){ + p->nRCRef--; + }else{ + sqlite3_free(p); + } +} + +/* +** Create a new string that is capable of holding N bytes of text, not counting +** the zero byte at the end. The string is uninitialized. +** +** The reference count is initially 1. Call sqlite3RCStrUnref() to free the +** newly allocated string. +** +** This routine returns 0 on an OOM. +*/ +SQLITE_PRIVATE char *sqlite3RCStrNew(u64 N){ + RCStr *p = sqlite3_malloc64( N + sizeof(*p) + 1 ); + if( p==0 ) return 0; + p->nRCRef = 1; + return (char*)&p[1]; +} + +/* +** Change the size of the string so that it is able to hold N bytes. +** The string might be reallocated, so return the new allocation. +*/ +SQLITE_PRIVATE char *sqlite3RCStrResize(char *z, u64 N){ + RCStr *p = (RCStr*)z; + RCStr *pNew; + assert( p!=0 ); + p--; + assert( p->nRCRef==1 ); + pNew = sqlite3_realloc64(p, N+sizeof(RCStr)+1); + if( pNew==0 ){ + sqlite3_free(p); + return 0; + }else{ + return (char*)&pNew[1]; + } +} + /************** End of printf.c **********************************************/ /************** Begin file treeview.c ****************************************/ /* @@ -31530,9 +33012,11 @@ SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc) sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); x.printfFlags |= SQLITE_PRINTF_INTERNAL; sqlite3_str_appendf(&x, "{%d:*} %!S", pItem->iCursor, pItem); - if( pItem->pTab ){ - sqlite3_str_appendf(&x, " tab=%Q nCol=%d ptr=%p used=%llx", - pItem->pTab->zName, pItem->pTab->nCol, pItem->pTab, pItem->colUsed); + if( pItem->pSTab ){ + sqlite3_str_appendf(&x, " tab=%Q nCol=%d ptr=%p used=%llx%s", + pItem->pSTab->zName, pItem->pSTab->nCol, pItem->pSTab, + pItem->colUsed, + pItem->fg.rowidUsed ? "+rowid" : ""); } if( (pItem->fg.jointype & (JT_LEFT|JT_RIGHT))==(JT_LEFT|JT_RIGHT) ){ sqlite3_str_appendf(&x, " FULL-OUTER-JOIN"); @@ -31561,23 +33045,30 @@ SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc) if( pItem->fg.viaCoroutine ) sqlite3_str_appendf(&x, " viaCoroutine"); if( pItem->fg.notCte ) sqlite3_str_appendf(&x, " notCte"); if( pItem->fg.isNestedFrom ) sqlite3_str_appendf(&x, " isNestedFrom"); + if( pItem->fg.fixedSchema ) sqlite3_str_appendf(&x, " fixedSchema"); + if( pItem->fg.hadSchema ) sqlite3_str_appendf(&x, " hadSchema"); + if( pItem->fg.isSubquery ) sqlite3_str_appendf(&x, " isSubquery"); sqlite3StrAccumFinish(&x); sqlite3TreeViewItem(pView, zLine, inSrc-1); n = 0; - if( pItem->pSelect ) n++; + if( pItem->fg.isSubquery ) n++; if( pItem->fg.isTabFunc ) n++; if( pItem->fg.isUsing ) n++; if( pItem->fg.isUsing ){ sqlite3TreeViewIdList(pView, pItem->u3.pUsing, (--n)>0, "USING"); } - if( pItem->pSelect ){ - if( pItem->pTab ){ - Table *pTab = pItem->pTab; + if( pItem->fg.isSubquery ){ + assert( n==1 ); + if( pItem->pSTab ){ + Table *pTab = pItem->pSTab; sqlite3TreeViewColumnList(pView, pTab->aCol, pTab->nCol, 1); } - assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect) ); - sqlite3TreeViewSelect(pView, pItem->pSelect, (--n)>0); + assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem) ); + sqlite3TreeViewPush(&pView, 0); + sqlite3TreeViewLine(pView, "SUBQUERY"); + sqlite3TreeViewPop(&pView); + sqlite3TreeViewSelect(pView, pItem->u4.pSubq->pSelect, 0); } if( pItem->fg.isTabFunc ){ sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:"); @@ -31619,7 +33110,7 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m n = 1000; }else{ n = 0; - if( p->pSrc && p->pSrc->nSrc ) n++; + if( p->pSrc && p->pSrc->nSrc && p->pSrc->nAlloc ) n++; if( p->pWhere ) n++; if( p->pGroupBy ) n++; if( p->pHaving ) n++; @@ -31645,7 +33136,7 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m sqlite3TreeViewPop(&pView); } #endif - if( p->pSrc && p->pSrc->nSrc ){ + if( p->pSrc && p->pSrc->nSrc && p->pSrc->nAlloc ){ sqlite3TreeViewPush(&pView, (n--)>0); sqlite3TreeViewLine(pView, "FROM"); sqlite3TreeViewSrcList(pView, p->pSrc); @@ -31681,7 +33172,7 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m sqlite3TreeViewItem(pView, "LIMIT", (n--)>0); sqlite3TreeViewExpr(pView, p->pLimit->pLeft, p->pLimit->pRight!=0); if( p->pLimit->pRight ){ - sqlite3TreeViewItem(pView, "OFFSET", (n--)>0); + sqlite3TreeViewItem(pView, "OFFSET", 0); sqlite3TreeViewExpr(pView, p->pLimit->pRight, 0); sqlite3TreeViewPop(&pView); } @@ -31749,6 +33240,7 @@ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u sqlite3TreeViewItem(pView, "FILTER", 1); sqlite3TreeViewExpr(pView, pWin->pFilter, 0); sqlite3TreeViewPop(&pView); + if( pWin->eFrmType==TK_FILTER ) return; } sqlite3TreeViewPush(&pView, more); if( pWin->zName ){ @@ -31758,7 +33250,7 @@ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u } if( pWin->zBase ) nElement++; if( pWin->pOrderBy ) nElement++; - if( pWin->eFrmType ) nElement++; + if( pWin->eFrmType!=0 && pWin->eFrmType!=TK_FILTER ) nElement++; if( pWin->eExclude ) nElement++; if( pWin->zBase ){ sqlite3TreeViewPush(&pView, (--nElement)>0); @@ -31771,7 +33263,7 @@ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u if( pWin->pOrderBy ){ sqlite3TreeViewExprList(pView, pWin->pOrderBy, (--nElement)>0, "ORDER-BY"); } - if( pWin->eFrmType ){ + if( pWin->eFrmType!=0 && pWin->eFrmType!=TK_FILTER ){ char zBuf[30]; const char *zFrmType = "ROWS"; if( pWin->eFrmType==TK_RANGE ) zFrmType = "RANGE"; @@ -31980,7 +33472,8 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m }; assert( pExpr->op2==TK_IS || pExpr->op2==TK_ISNOT ); assert( pExpr->pRight ); - assert( sqlite3ExprSkipCollate(pExpr->pRight)->op==TK_TRUEFALSE ); + assert( sqlite3ExprSkipCollateAndLikely(pExpr->pRight)->op + == TK_TRUEFALSE ); x = (pExpr->op2==TK_ISNOT)*2 + sqlite3ExprTruthValue(pExpr->pRight); zUniOp = azOp[x]; break; @@ -32018,7 +33511,7 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m assert( ExprUseXList(pExpr) ); pFarg = pExpr->x.pList; #ifndef SQLITE_OMIT_WINDOWFUNC - pWin = ExprHasProperty(pExpr, EP_WinFunc) ? pExpr->y.pWin : 0; + pWin = IsWindowFunc(pExpr) ? pExpr->y.pWin : 0; #else pWin = 0; #endif @@ -32044,7 +33537,13 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m sqlite3TreeViewLine(pView, "FUNCTION %Q%s", pExpr->u.zToken, zFlgs); } if( pFarg ){ - sqlite3TreeViewExprList(pView, pFarg, pWin!=0, 0); + sqlite3TreeViewExprList(pView, pFarg, pWin!=0 || pExpr->pLeft, 0); + if( pExpr->pLeft ){ + Expr *pOB = pExpr->pLeft; + assert( pOB->op==TK_ORDER ); + assert( ExprUseXList(pOB) ); + sqlite3TreeViewExprList(pView, pOB->x.pList, pWin!=0, "ORDERBY"); + } } #ifndef SQLITE_OMIT_WINDOWFUNC if( pWin ){ @@ -32053,6 +33552,10 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m #endif break; } + case TK_ORDER: { + sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, "ORDERBY"); + break; + } #ifndef SQLITE_OMIT_SUBQUERY case TK_EXISTS: { assert( ExprUseXSelect(pExpr) ); @@ -32106,7 +33609,7 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m assert( pExpr->x.pList->nExpr==2 ); pY = pExpr->x.pList->a[0].pExpr; pZ = pExpr->x.pList->a[1].pExpr; - sqlite3TreeViewLine(pView, "BETWEEN"); + sqlite3TreeViewLine(pView, "BETWEEN%s", zFlgs); sqlite3TreeViewExpr(pView, pX, 1); sqlite3TreeViewExpr(pView, pY, 1); sqlite3TreeViewExpr(pView, pZ, 0); @@ -32141,7 +33644,8 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m case OE_Ignore: zType = "ignore"; break; } assert( !ExprHasProperty(pExpr, EP_IntValue) ); - sqlite3TreeViewLine(pView, "RAISE %s(%Q)", zType, pExpr->u.zToken); + sqlite3TreeViewLine(pView, "RAISE %s", zType); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); break; } #endif @@ -32221,9 +33725,10 @@ SQLITE_PRIVATE void sqlite3TreeViewBareExprList( sqlite3TreeViewLine(pView, "%s", zLabel); for(i=0; inExpr; i++){ int j = pList->a[i].u.x.iOrderByCol; + u8 sortFlags = pList->a[i].fg.sortFlags; char *zName = pList->a[i].zEName; int moreToFollow = inExpr - 1; - if( j || zName ){ + if( j || zName || sortFlags ){ sqlite3TreeViewPush(&pView, moreToFollow); moreToFollow = 0; sqlite3TreeViewLine(pView, 0); @@ -32244,13 +33749,18 @@ SQLITE_PRIVATE void sqlite3TreeViewBareExprList( } } if( j ){ - fprintf(stdout, "iOrderByCol=%d", j); + fprintf(stdout, "iOrderByCol=%d ", j); + } + if( sortFlags & KEYINFO_ORDER_DESC ){ + fprintf(stdout, "DESC "); + }else if( sortFlags & KEYINFO_ORDER_BIGNULL ){ + fprintf(stdout, "NULLS-LAST"); } fprintf(stdout, "\n"); fflush(stdout); } sqlite3TreeViewExpr(pView, pList->a[i].pExpr, moreToFollow); - if( j || zName ){ + if( j || zName || sortFlags ){ sqlite3TreeViewPop(&pView); } } @@ -33213,7 +34723,7 @@ static const unsigned char sqlite3Utf8Trans1[] = { c = *(zIn++); \ if( c>=0xc0 ){ \ c = sqlite3Utf8Trans1[c-0xc0]; \ - while( zIn!=zTerm && (*zIn & 0xc0)==0x80 ){ \ + while( zIn0 ); + c = z[0]; + if( c>=0xc0 ){ + c = sqlite3Utf8Trans1[c-0xc0]; + if( n>4 ) n = 4; + while( i=0xd8 && c<0xdc && z[0]>=0xdc && z[0]<0xe0 ) z += 2; + if( c>=0xd8 && c<0xdc && z<=zEnd && z[0]>=0xdc && z[0]<0xe0 ) z += 2; n++; } return (int)(z-(unsigned char const *)zIn) @@ -33639,7 +35182,7 @@ SQLITE_PRIVATE void sqlite3UtfSelfTest(void){ /* ** Calls to sqlite3FaultSim() are used to simulate a failure during testing, ** or to bypass normal error detection during testing in order to let -** execute proceed futher downstream. +** execute proceed further downstream. ** ** In deployment, sqlite3FaultSim() *always* return SQLITE_OK (0). The ** sqlite3FaultSim() function only returns non-zero during testing. @@ -33683,6 +35226,19 @@ SQLITE_PRIVATE int sqlite3IsNaN(double x){ } #endif /* SQLITE_OMIT_FLOATING_POINT */ +#ifndef SQLITE_OMIT_FLOATING_POINT +/* +** Return true if the floating point value is NaN or +Inf or -Inf. +*/ +SQLITE_PRIVATE int sqlite3IsOverflow(double x){ + int rc; /* The value return */ + u64 y; + memcpy(&y,&x,sizeof(y)); + rc = IsOvfl(y); + return rc; +} +#endif /* SQLITE_OMIT_FLOATING_POINT */ + /* ** Compute a string length that is limited to what can be stored in ** lower 30 bits of a 32-bit signed integer. @@ -33756,6 +35312,23 @@ SQLITE_PRIVATE void sqlite3ErrorClear(sqlite3 *db){ */ SQLITE_PRIVATE void sqlite3SystemError(sqlite3 *db, int rc){ if( rc==SQLITE_IOERR_NOMEM ) return; +#if defined(SQLITE_USE_SEH) && !defined(SQLITE_OMIT_WAL) + if( rc==SQLITE_IOERR_IN_PAGE ){ + int ii; + int iErr; + sqlite3BtreeEnterAll(db); + for(ii=0; iinDb; ii++){ + if( db->aDb[ii].pBt ){ + iErr = sqlite3PagerWalSystemErrno(sqlite3BtreePager(db->aDb[ii].pBt)); + if( iErr ){ + db->iSysErrno = iErr; + } + } + } + sqlite3BtreeLeaveAll(db); + return; + } +#endif rc &= 0xff; if( rc==SQLITE_CANTOPEN || rc==SQLITE_IOERR ){ db->iSysErrno = sqlite3OsGetLastError(db->pVfs); @@ -33800,12 +35373,16 @@ SQLITE_PRIVATE void sqlite3ProgressCheck(Parse *p){ p->rc = SQLITE_INTERRUPT; } #ifndef SQLITE_OMIT_PROGRESS_CALLBACK - if( db->xProgress && (++p->nProgressSteps)>=db->nProgressOps ){ - if( db->xProgress(db->pProgressArg) ){ - p->nErr++; - p->rc = SQLITE_INTERRUPT; + if( db->xProgress ){ + if( p->rc==SQLITE_INTERRUPT ){ + p->nProgressSteps = 0; + }else if( (++p->nProgressSteps)>=db->nProgressOps ){ + if( db->xProgress(db->pProgressArg) ){ + p->nErr++; + p->rc = SQLITE_INTERRUPT; + } + p->nProgressSteps = 0; } - p->nProgressSteps = 0; } #endif } @@ -33905,6 +35482,44 @@ SQLITE_PRIVATE void sqlite3DequoteExpr(Expr *p){ sqlite3Dequote(p->u.zToken); } +/* +** Expression p is a QNUMBER (quoted number). Dequote the value in p->u.zToken +** and set the type to INTEGER or FLOAT. "Quoted" integers or floats are those +** that contain '_' characters that must be removed before further processing. +*/ +SQLITE_PRIVATE void sqlite3DequoteNumber(Parse *pParse, Expr *p){ + assert( p!=0 || pParse->db->mallocFailed ); + if( p ){ + const char *pIn = p->u.zToken; + char *pOut = p->u.zToken; + int bHex = (pIn[0]=='0' && (pIn[1]=='x' || pIn[1]=='X')); + int iValue; + assert( p->op==TK_QNUMBER ); + p->op = TK_INTEGER; + do { + if( *pIn!=SQLITE_DIGIT_SEPARATOR ){ + *pOut++ = *pIn; + if( *pIn=='e' || *pIn=='E' || *pIn=='.' ) p->op = TK_FLOAT; + }else{ + if( (bHex==0 && (!sqlite3Isdigit(pIn[-1]) || !sqlite3Isdigit(pIn[1]))) + || (bHex==1 && (!sqlite3Isxdigit(pIn[-1]) || !sqlite3Isxdigit(pIn[1]))) + ){ + sqlite3ErrorMsg(pParse, "unrecognized token: \"%s\"", p->u.zToken); + } + } + }while( *pIn++ ); + if( bHex ) p->op = TK_INTEGER; + + /* tag-20240227-a: If after dequoting, the number is an integer that + ** fits in 32 bits, then it must be converted into EP_IntValue. Other + ** parts of the code expect this. See also tag-20240227-b. */ + if( p->op==TK_INTEGER && sqlite3GetInt32(p->u.zToken, &iValue) ){ + p->u.iValue = iValue; + p->flags |= EP_IntValue; + } + } +} + /* ** If the input token p is quoted, try to adjust the token to remove ** the quotes. This is not always possible: @@ -34001,43 +35616,40 @@ SQLITE_PRIVATE u8 sqlite3StrIHash(const char *z){ return h; } -/* -** Compute 10 to the E-th power. Examples: E==1 results in 10. -** E==2 results in 100. E==50 results in 1.0e50. +/* Double-Double multiplication. (x[0],x[1]) *= (y,yy) ** -** This routine only works for values of E between 1 and 341. +** Reference: +** T. J. Dekker, "A Floating-Point Technique for Extending the +** Available Precision". 1971-07-26. */ -static LONGDOUBLE_TYPE sqlite3Pow10(int E){ -#if defined(_MSC_VER) - static const LONGDOUBLE_TYPE x[] = { - 1.0e+001L, - 1.0e+002L, - 1.0e+004L, - 1.0e+008L, - 1.0e+016L, - 1.0e+032L, - 1.0e+064L, - 1.0e+128L, - 1.0e+256L - }; - LONGDOUBLE_TYPE r = 1.0; - int i; - assert( E>=0 && E<=307 ); - for(i=0; E!=0; i++, E >>=1){ - if( E & 1 ) r *= x[i]; - } - return r; -#else - LONGDOUBLE_TYPE x = 10.0; - LONGDOUBLE_TYPE r = 1.0; - while(1){ - if( E & 1 ) r *= x; - E >>= 1; - if( E==0 ) break; - x *= x; - } - return r; -#endif +static void dekkerMul2(volatile double *x, double y, double yy){ + /* + ** The "volatile" keywords on parameter x[] and on local variables + ** below are needed force intermediate results to be truncated to + ** binary64 rather than be carried around in an extended-precision + ** format. The truncation is necessary for the Dekker algorithm to + ** work. Intel x86 floating point might omit the truncation without + ** the use of volatile. + */ + volatile double tx, ty, p, q, c, cc; + double hx, hy; + u64 m; + memcpy(&m, (void*)&x[0], 8); + m &= 0xfffffffffc000000LL; + memcpy(&hx, &m, 8); + tx = x[0] - hx; + memcpy(&m, &y, 8); + m &= 0xfffffffffc000000LL; + memcpy(&hy, &m, 8); + ty = y - hy; + p = hx*hy; + q = hx*ty + tx*hy; + c = p+q; + cc = p - c + q + tx*ty; + cc = x[0]*yy + x[1]*y + cc; + x[0] = c + cc; + x[1] = c - x[0]; + x[1] += cc; } /* @@ -34078,14 +35690,15 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en const char *zEnd; /* sign * significand * (10 ^ (esign * exponent)) */ int sign = 1; /* sign of significand */ - i64 s = 0; /* significand */ + u64 s = 0; /* significand */ int d = 0; /* adjust exponent for shifting decimal point */ int esign = 1; /* sign of exponent */ int e = 0; /* exponent */ int eValid = 1; /* True exponent is either not used or is well-formed */ - double result; int nDigit = 0; /* Number of digits processed */ int eType = 1; /* 1: pure integer, 2+: fractional -1 or less: bad UTF16 */ + u64 s2; /* round-tripped significand */ + double rr[2]; assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); *pResult = 0.0; /* Default return value, in case of an error */ @@ -34123,7 +35736,7 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en while( z=((LARGEST_INT64-9)/10) ){ + if( s>=((LARGEST_UINT64-9)/10) ){ /* skip non-significant significand digits ** (increase exponent by d to shift decimal left) */ while( z0 ){ /*OPTIMIZATION-IF-TRUE*/ - if( esign>0 ){ - if( s>=(LARGEST_INT64/10) ) break; /*OPTIMIZATION-IF-FALSE*/ - s *= 10; - }else{ - if( s%10!=0 ) break; /*OPTIMIZATION-IF-FALSE*/ - s /= 10; - } - e--; - } + /* Try to adjust the exponent to make it smaller */ + while( e>0 && s<((LARGEST_UINT64-0x7ff)/10) ){ + s *= 10; + e--; + } + while( e<0 && (s%10)==0 ){ + s /= 10; + e++; + } - /* adjust the sign of significand */ - s = sign<0 ? -s : s; + rr[0] = (double)s; + assert( sizeof(s2)==sizeof(rr[0]) ); + memcpy(&s2, &rr[0], sizeof(s2)); + if( s2<=0x43efffffffffffffLL ){ + s2 = (u64)rr[0]; + rr[1] = s>=s2 ? (double)(s - s2) : -(double)(s2 - s); + }else{ + rr[1] = 0.0; + } + assert( rr[1]<=1.0e-10*rr[0] ); /* Equal only when rr[0]==0.0 */ - if( e==0 ){ /*OPTIMIZATION-IF-TRUE*/ - result = (double)s; - }else{ - /* attempt to handle extremely small/large numbers better */ - if( e>307 ){ /*OPTIMIZATION-IF-TRUE*/ - if( e<342 ){ /*OPTIMIZATION-IF-TRUE*/ - LONGDOUBLE_TYPE scale = sqlite3Pow10(e-308); - if( esign<0 ){ - result = s / scale; - result /= 1.0e+308; - }else{ - result = s * scale; - result *= 1.0e+308; - } - }else{ assert( e>=342 ); - if( esign<0 ){ - result = 0.0*s; - }else{ -#ifdef INFINITY - result = INFINITY*s; -#else - result = 1e308*1e308*s; /* Infinity */ -#endif - } - } - }else{ - LONGDOUBLE_TYPE scale = sqlite3Pow10(e); - if( esign<0 ){ - result = s / scale; - }else{ - result = s * scale; - } - } + if( e>0 ){ + while( e>=100 ){ + e -= 100; + dekkerMul2(rr, 1.0e+100, -1.5902891109759918046e+83); + } + while( e>=10 ){ + e -= 10; + dekkerMul2(rr, 1.0e+10, 0.0); + } + while( e>=1 ){ + e -= 1; + dekkerMul2(rr, 1.0e+01, 0.0); + } + }else{ + while( e<=-100 ){ + e += 100; + dekkerMul2(rr, 1.0e-100, -1.99918998026028836196e-117); + } + while( e<=-10 ){ + e += 10; + dekkerMul2(rr, 1.0e-10, -3.6432197315497741579e-27); + } + while( e<=-1 ){ + e += 1; + dekkerMul2(rr, 1.0e-01, -5.5511151231257827021e-18); } } + *pResult = rr[0]+rr[1]; + if( sqlite3IsNaN(*pResult) ) *pResult = 1e300*1e300; + if( sign<0 ) *pResult = -*pResult; + assert( !sqlite3IsNaN(*pResult) ); - /* store the result */ - *pResult = result; - - /* return true if number and no extra non-whitespace chracters after */ +atof_return: + /* return true if number and no extra non-whitespace characters after */ if( z==zEnd && nDigit>0 && eValid && eType>0 ){ return eType; }else if( eType>=2 && (eType==3 || eValid) && nDigit>0 ){ @@ -34285,13 +35889,15 @@ SQLITE_PRIVATE int sqlite3Int64ToText(i64 v, char *zOut){ } i = sizeof(zTemp)-2; zTemp[sizeof(zTemp)-1] = 0; - do{ - zTemp[i--] = (x%10) + '0'; + while( 1 /*exit-by-break*/ ){ + zTemp[i] = (x%10) + '0'; x = x/10; - }while( x ); - if( v<0 ) zTemp[i--] = '-'; - memcpy(zOut, &zTemp[i+1], sizeof(zTemp)-1-i); - return sizeof(zTemp)-2-i; + if( x==0 ) break; + i--; + }; + if( v<0 ) zTemp[--i] = '-'; + memcpy(zOut, &zTemp[i], sizeof(zTemp)-i); + return sizeof(zTemp)-1-i; } /* @@ -34384,7 +35990,7 @@ SQLITE_PRIVATE int sqlite3Atoi64(const char *zNum, i64 *pNum, int length, u8 enc /* This test and assignment is needed only to suppress UB warnings ** from clang and -fsanitize=undefined. This test and assignment make ** the code a little larger and slower, and no harm comes from omitting - ** them, but we must appaise the undefined-behavior pharisees. */ + ** them, but we must appease the undefined-behavior pharisees. */ *pNum = neg ? SMALLEST_INT64 : LARGEST_INT64; }else if( neg ){ *pNum = -(i64)u; @@ -34456,11 +36062,15 @@ SQLITE_PRIVATE int sqlite3DecOrHexToI64(const char *z, i64 *pOut){ u = u*16 + sqlite3HexToInt(z[k]); } memcpy(pOut, &u, 8); - return (z[k]==0 && k-i<=16) ? 0 : 2; + if( k-i>16 ) return 2; + if( z[k]!=0 ) return 1; + return 0; }else #endif /* SQLITE_OMIT_HEX_INTEGER */ { - return sqlite3Atoi64(z, pOut, sqlite3Strlen30(z), SQLITE_UTF8); + int n = (int)(0x3fffffff&strspn(z,"+- \n\t0123456789")); + if( z[n] ) n++; + return sqlite3Atoi64(z, pOut, n, SQLITE_UTF8); } } @@ -34492,7 +36102,7 @@ SQLITE_PRIVATE int sqlite3GetInt32(const char *zNum, int *pValue){ u32 u = 0; zNum += 2; while( zNum[0]=='0' ) zNum++; - for(i=0; sqlite3Isxdigit(zNum[i]) && i<8; i++){ + for(i=0; i<8 && sqlite3Isxdigit(zNum[i]); i++){ u = u*16 + sqlite3HexToInt(zNum[i]); } if( (u&0x80000000)==0 && sqlite3Isxdigit(zNum[i])==0 ){ @@ -34539,6 +36149,142 @@ SQLITE_PRIVATE int sqlite3Atoi(const char *z){ return x; } +/* +** Decode a floating-point value into an approximate decimal +** representation. +** +** If iRound<=0 then round to -iRound significant digits to the +** the left of the decimal point, or to a maximum of mxRound total +** significant digits. +** +** If iRound>0 round to min(iRound,mxRound) significant digits total. +** +** mxRound must be positive. +** +** The significant digits of the decimal representation are +** stored in p->z[] which is a often (but not always) a pointer +** into the middle of p->zBuf[]. There are p->n significant digits. +** The p->z[] array is *not* zero-terminated. +*/ +SQLITE_PRIVATE void sqlite3FpDecode(FpDecode *p, double r, int iRound, int mxRound){ + int i; + u64 v; + int e, exp = 0; + double rr[2]; + + p->isSpecial = 0; + p->z = p->zBuf; + assert( mxRound>0 ); + + /* Convert negative numbers to positive. Deal with Infinity, 0.0, and + ** NaN. */ + if( r<0.0 ){ + p->sign = '-'; + r = -r; + }else if( r==0.0 ){ + p->sign = '+'; + p->n = 1; + p->iDP = 1; + p->z = "0"; + return; + }else{ + p->sign = '+'; + } + memcpy(&v,&r,8); + e = v>>52; + if( (e&0x7ff)==0x7ff ){ + p->isSpecial = 1 + (v!=0x7ff0000000000000LL); + p->n = 0; + p->iDP = 0; + return; + } + + /* Multiply r by powers of ten until it lands somewhere in between + ** 1.0e+19 and 1.0e+17. + ** + ** Use Dekker-style double-double computation to increase the + ** precision. + ** + ** The error terms on constants like 1.0e+100 computed using the + ** decimal extension, for example as follows: + ** + ** SELECT decimal_exp(decimal_sub('1.0e+100',decimal(1.0e+100))); + */ + rr[0] = r; + rr[1] = 0.0; + if( rr[0]>9.223372036854774784e+18 ){ + while( rr[0]>9.223372036854774784e+118 ){ + exp += 100; + dekkerMul2(rr, 1.0e-100, -1.99918998026028836196e-117); + } + while( rr[0]>9.223372036854774784e+28 ){ + exp += 10; + dekkerMul2(rr, 1.0e-10, -3.6432197315497741579e-27); + } + while( rr[0]>9.223372036854774784e+18 ){ + exp += 1; + dekkerMul2(rr, 1.0e-01, -5.5511151231257827021e-18); + } + }else{ + while( rr[0]<9.223372036854774784e-83 ){ + exp -= 100; + dekkerMul2(rr, 1.0e+100, -1.5902891109759918046e+83); + } + while( rr[0]<9.223372036854774784e+07 ){ + exp -= 10; + dekkerMul2(rr, 1.0e+10, 0.0); + } + while( rr[0]<9.22337203685477478e+17 ){ + exp -= 1; + dekkerMul2(rr, 1.0e+01, 0.0); + } + } + v = rr[1]<0.0 ? (u64)rr[0]-(u64)(-rr[1]) : (u64)rr[0]+(u64)rr[1]; + + /* Extract significant digits. */ + i = sizeof(p->zBuf)-1; + assert( v>0 ); + while( v ){ p->zBuf[i--] = (v%10) + '0'; v /= 10; } + assert( i>=0 && izBuf)-1 ); + p->n = sizeof(p->zBuf) - 1 - i; + assert( p->n>0 ); + assert( p->nzBuf) ); + p->iDP = p->n + exp; + if( iRound<=0 ){ + iRound = p->iDP - iRound; + if( iRound==0 && p->zBuf[i+1]>='5' ){ + iRound = 1; + p->zBuf[i--] = '0'; + p->n++; + p->iDP++; + } + } + if( iRound>0 && (iRoundn || p->n>mxRound) ){ + char *z = &p->zBuf[i+1]; + if( iRound>mxRound ) iRound = mxRound; + p->n = iRound; + if( z[iRound]>='5' ){ + int j = iRound-1; + while( 1 /*exit-by-break*/ ){ + z[j]++; + if( z[j]<='9' ) break; + z[j] = '0'; + if( j==0 ){ + p->z[i--] = '1'; + p->n++; + p->iDP++; + break; + }else{ + j--; + } + } + } + } + p->z = &p->zBuf[i+1]; + assert( i+p->n < sizeof(p->zBuf) ); + while( ALWAYS(p->n>0) && p->z[p->n-1]=='0' ){ p->n--; } +} + /* ** Try to convert z into an unsigned 32-bit integer. Return true on ** success and false if there is an error. @@ -34802,121 +36548,32 @@ SQLITE_PRIVATE u8 sqlite3GetVarint(const unsigned char *p, u64 *v){ ** this function assumes the single-byte case has already been handled. */ SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char *p, u32 *v){ - u32 a,b; + u64 v64; + u8 n; - /* The 1-byte case. Overwhelmingly the most common. Handled inline - ** by the getVarin32() macro */ - a = *p; - /* a: p0 (unmasked) */ -#ifndef getVarint32 - if (!(a&0x80)) - { - /* Values between 0 and 127 */ - *v = a; - return 1; - } -#endif + /* Assume that the single-byte case has already been handled by + ** the getVarint32() macro */ + assert( (p[0] & 0x80)!=0 ); - /* The 2-byte case */ - p++; - b = *p; - /* b: p1 (unmasked) */ - if (!(b&0x80)) - { - /* Values between 128 and 16383 */ - a &= 0x7f; - a = a<<7; - *v = a | b; + if( (p[1] & 0x80)==0 ){ + /* This is the two-byte case */ + *v = ((p[0]&0x7f)<<7) | p[1]; return 2; } - - /* The 3-byte case */ - p++; - a = a<<14; - a |= *p; - /* a: p0<<14 | p2 (unmasked) */ - if (!(a&0x80)) - { - /* Values between 16384 and 2097151 */ - a &= (0x7f<<14)|(0x7f); - b &= 0x7f; - b = b<<7; - *v = a | b; + if( (p[2] & 0x80)==0 ){ + /* This is the three-byte case */ + *v = ((p[0]&0x7f)<<14) | ((p[1]&0x7f)<<7) | p[2]; return 3; } - - /* A 32-bit varint is used to store size information in btrees. - ** Objects are rarely larger than 2MiB limit of a 3-byte varint. - ** A 3-byte varint is sufficient, for example, to record the size - ** of a 1048569-byte BLOB or string. - ** - ** We only unroll the first 1-, 2-, and 3- byte cases. The very - ** rare larger cases can be handled by the slower 64-bit varint - ** routine. - */ -#if 1 - { - u64 v64; - u8 n; - - n = sqlite3GetVarint(p-2, &v64); - assert( n>3 && n<=9 ); - if( (v64 & SQLITE_MAX_U32)!=v64 ){ - *v = 0xffffffff; - }else{ - *v = (u32)v64; - } - return n; - } - -#else - /* For following code (kept for historical record only) shows an - ** unrolling for the 3- and 4-byte varint cases. This code is - ** slightly faster, but it is also larger and much harder to test. - */ - p++; - b = b<<14; - b |= *p; - /* b: p1<<14 | p3 (unmasked) */ - if (!(b&0x80)) - { - /* Values between 2097152 and 268435455 */ - b &= (0x7f<<14)|(0x7f); - a &= (0x7f<<14)|(0x7f); - a = a<<7; - *v = a | b; - return 4; - } - - p++; - a = a<<14; - a |= *p; - /* a: p0<<28 | p2<<14 | p4 (unmasked) */ - if (!(a&0x80)) - { - /* Values between 268435456 and 34359738367 */ - a &= SLOT_4_2_0; - b &= SLOT_4_2_0; - b = b<<7; - *v = a | b; - return 5; - } - - /* We can only reach this point when reading a corrupt database - ** file. In that case we are not in any hurry. Use the (relatively - ** slow) general-purpose sqlite3GetVarint() routine to extract the - ** value. */ - { - u64 v64; - u8 n; - - p -= 4; - n = sqlite3GetVarint(p, &v64); - assert( n>5 && n<=9 ); + /* four or more bytes */ + n = sqlite3GetVarint(p, &v64); + assert( n>3 && n<=9 ); + if( (v64 & SQLITE_MAX_U32)!=v64 ){ + *v = 0xffffffff; + }else{ *v = (u32)v64; - return n; } -#endif + return n; } /* @@ -35067,7 +36724,7 @@ SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3 *db){ } /* -** Attempt to add, substract, or multiply the 64-bit signed value iB against +** Attempt to add, subtract, or multiply the 64-bit signed value iB against ** the other 64-bit signed integer at *pA and store the result in *pA. ** Return 0 on success. Or if the operation would have resulted in an ** overflow, leave *pA unchanged and return 1. @@ -35353,104 +37010,6 @@ SQLITE_PRIVATE int sqlite3VListNameToNum(VList *pIn, const char *zName, int nNam return 0; } -/* -** High-resolution hardware timer used for debugging and testing only. -*/ -#if defined(VDBE_PROFILE) \ - || defined(SQLITE_PERFORMANCE_TRACE) \ - || defined(SQLITE_ENABLE_STMT_SCANSTATUS) -/************** Include hwtime.h in the middle of util.c *********************/ -/************** Begin file hwtime.h ******************************************/ -/* -** 2008 May 27 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -****************************************************************************** -** -** This file contains inline asm code for retrieving "high-performance" -** counters for x86 and x86_64 class CPUs. -*/ -#ifndef SQLITE_HWTIME_H -#define SQLITE_HWTIME_H - -/* -** The following routine only works on pentium-class (or newer) processors. -** It uses the RDTSC opcode to read the cycle count value out of the -** processor and returns that value. This can be used for high-res -** profiling. -*/ -#if !defined(__STRICT_ANSI__) && \ - (defined(__GNUC__) || defined(_MSC_VER)) && \ - (defined(i386) || defined(__i386__) || defined(_M_IX86)) - - #if defined(__GNUC__) - - __inline__ sqlite_uint64 sqlite3Hwtime(void){ - unsigned int lo, hi; - __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); - return (sqlite_uint64)hi << 32 | lo; - } - - #elif defined(_MSC_VER) - - __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){ - __asm { - rdtsc - ret ; return value at EDX:EAX - } - } - - #endif - -#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__x86_64__)) - - __inline__ sqlite_uint64 sqlite3Hwtime(void){ - unsigned int lo, hi; - __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); - return (sqlite_uint64)hi << 32 | lo; - } - -#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__ppc__)) - - __inline__ sqlite_uint64 sqlite3Hwtime(void){ - unsigned long long retval; - unsigned long junk; - __asm__ __volatile__ ("\n\ - 1: mftbu %1\n\ - mftb %L0\n\ - mftbu %0\n\ - cmpw %0,%1\n\ - bne 1b" - : "=r" (retval), "=r" (junk)); - return retval; - } - -#else - - /* - ** asm() is needed for hardware timing support. Without asm(), - ** disable the sqlite3Hwtime() routine. - ** - ** sqlite3Hwtime() is only used for some obscure debugging - ** and analysis configurations, not in any deliverable, so this - ** should not be a great loss. - */ -SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } - -#endif - -#endif /* !defined(SQLITE_HWTIME_H) */ - -/************** End of hwtime.h **********************************************/ -/************** Continuing where we left off in util.c ***********************/ -#endif - /************** End of util.c ************************************************/ /************** Begin file hash.c ********************************************/ /* @@ -35552,7 +37111,7 @@ static void insertElement( } -/* Resize the hash table so that it cantains "new_size" buckets. +/* Resize the hash table so that it contains "new_size" buckets. ** ** The hash table might fail to resize if sqlite3_malloc() fails or ** if the new size is the same as the prior size. @@ -35771,7 +37330,7 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 30 */ "SeekRowid" OpHelp("intkey=r[P3]"), /* 31 */ "NotExists" OpHelp("intkey=r[P3]"), /* 32 */ "Last" OpHelp(""), - /* 33 */ "IfSmaller" OpHelp(""), + /* 33 */ "IfSizeBetween" OpHelp(""), /* 34 */ "SorterSort" OpHelp(""), /* 35 */ "Sort" OpHelp(""), /* 36 */ "Rewind" OpHelp(""), @@ -35788,16 +37347,16 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 47 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"), /* 48 */ "Program" OpHelp(""), /* 49 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"), - /* 50 */ "IsNull" OpHelp("if r[P1]==NULL goto P2"), - /* 51 */ "NotNull" OpHelp("if r[P1]!=NULL goto P2"), - /* 52 */ "Ne" OpHelp("IF r[P3]!=r[P1]"), - /* 53 */ "Eq" OpHelp("IF r[P3]==r[P1]"), - /* 54 */ "Gt" OpHelp("IF r[P3]>r[P1]"), - /* 55 */ "Le" OpHelp("IF r[P3]<=r[P1]"), - /* 56 */ "Lt" OpHelp("IF r[P3]=r[P1]"), - /* 58 */ "ElseEq" OpHelp(""), - /* 59 */ "IfPos" OpHelp("if r[P1]>0 then r[P1]-=P3, goto P2"), + /* 50 */ "IfPos" OpHelp("if r[P1]>0 then r[P1]-=P3, goto P2"), + /* 51 */ "IsNull" OpHelp("if r[P1]==NULL goto P2"), + /* 52 */ "NotNull" OpHelp("if r[P1]!=NULL goto P2"), + /* 53 */ "Ne" OpHelp("IF r[P3]!=r[P1]"), + /* 54 */ "Eq" OpHelp("IF r[P3]==r[P1]"), + /* 55 */ "Gt" OpHelp("IF r[P3]>r[P1]"), + /* 56 */ "Le" OpHelp("IF r[P3]<=r[P1]"), + /* 57 */ "Lt" OpHelp("IF r[P3]=r[P1]"), + /* 59 */ "ElseEq" OpHelp(""), /* 60 */ "IfNotZero" OpHelp("if r[P1]!=0 then r[P1]--, goto P2"), /* 61 */ "DecrJumpZero" OpHelp("if (--r[P1])==0 goto P2"), /* 62 */ "IncrVacuum" OpHelp(""), @@ -35816,7 +37375,7 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 75 */ "Null" OpHelp("r[P2..P3]=NULL"), /* 76 */ "SoftNull" OpHelp("r[P1]=NULL"), /* 77 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), - /* 78 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), + /* 78 */ "Variable" OpHelp("r[P2]=parameter(P1)"), /* 79 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), /* 80 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), /* 81 */ "SCopy" OpHelp("r[P2]=r[P1]"), @@ -35840,23 +37399,23 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 99 */ "ReadCookie" OpHelp(""), /* 100 */ "SetCookie" OpHelp(""), /* 101 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), - /* 102 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), - /* 103 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), - /* 104 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<>r[P1]"), - /* 106 */ "Add" OpHelp("r[P3]=r[P1]+r[P2]"), - /* 107 */ "Subtract" OpHelp("r[P3]=r[P2]-r[P1]"), - /* 108 */ "Multiply" OpHelp("r[P3]=r[P1]*r[P2]"), - /* 109 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"), - /* 110 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"), - /* 111 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"), - /* 112 */ "OpenRead" OpHelp("root=P2 iDb=P3"), + /* 102 */ "OpenRead" OpHelp("root=P2 iDb=P3"), + /* 103 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), + /* 104 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), + /* 105 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<>r[P1]"), + /* 107 */ "Add" OpHelp("r[P3]=r[P1]+r[P2]"), + /* 108 */ "Subtract" OpHelp("r[P3]=r[P2]-r[P1]"), + /* 109 */ "Multiply" OpHelp("r[P3]=r[P1]*r[P2]"), + /* 110 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"), + /* 111 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"), + /* 112 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"), /* 113 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), - /* 114 */ "BitNot" OpHelp("r[P2]= ~r[P1]"), - /* 115 */ "OpenDup" OpHelp(""), + /* 114 */ "OpenDup" OpHelp(""), + /* 115 */ "BitNot" OpHelp("r[P2]= ~r[P1]"), /* 116 */ "OpenAutoindex" OpHelp("nColumn=P2"), - /* 117 */ "String8" OpHelp("r[P2]='P4'"), - /* 118 */ "OpenEphemeral" OpHelp("nColumn=P2"), + /* 117 */ "OpenEphemeral" OpHelp("nColumn=P2"), + /* 118 */ "String8" OpHelp("r[P2]='P4'"), /* 119 */ "SorterOpen" OpHelp(""), /* 120 */ "SequenceTest" OpHelp("if( cursor[P1].ctr++ ) pc = P2"), /* 121 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"), @@ -35891,8 +37450,8 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 150 */ "LoadAnalysis" OpHelp(""), /* 151 */ "DropTable" OpHelp(""), /* 152 */ "DropIndex" OpHelp(""), - /* 153 */ "Real" OpHelp("r[P2]=P4"), - /* 154 */ "DropTrigger" OpHelp(""), + /* 153 */ "DropTrigger" OpHelp(""), + /* 154 */ "Real" OpHelp("r[P2]=P4"), /* 155 */ "IntegrityCk" OpHelp(""), /* 156 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), /* 157 */ "Param" OpHelp(""), @@ -35912,19 +37471,22 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 171 */ "VCreate" OpHelp(""), /* 172 */ "VDestroy" OpHelp(""), /* 173 */ "VOpen" OpHelp(""), - /* 174 */ "VInitIn" OpHelp("r[P2]=ValueList(P1,P3)"), - /* 175 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), - /* 176 */ "VRename" OpHelp(""), - /* 177 */ "Pagecount" OpHelp(""), - /* 178 */ "MaxPgcnt" OpHelp(""), - /* 179 */ "ClrSubtype" OpHelp("r[P1].subtype = 0"), - /* 180 */ "FilterAdd" OpHelp("filter(P1) += key(P3@P4)"), - /* 181 */ "Trace" OpHelp(""), - /* 182 */ "CursorHint" OpHelp(""), - /* 183 */ "ReleaseReg" OpHelp("release r[P1@P2] mask P3"), - /* 184 */ "Noop" OpHelp(""), - /* 185 */ "Explain" OpHelp(""), - /* 186 */ "Abortable" OpHelp(""), + /* 174 */ "VCheck" OpHelp(""), + /* 175 */ "VInitIn" OpHelp("r[P2]=ValueList(P1,P3)"), + /* 176 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), + /* 177 */ "VRename" OpHelp(""), + /* 178 */ "Pagecount" OpHelp(""), + /* 179 */ "MaxPgcnt" OpHelp(""), + /* 180 */ "ClrSubtype" OpHelp("r[P1].subtype = 0"), + /* 181 */ "GetSubtype" OpHelp("r[P2] = r[P1].subtype"), + /* 182 */ "SetSubtype" OpHelp("r[P2].subtype = r[P1]"), + /* 183 */ "FilterAdd" OpHelp("filter(P1) += key(P3@P4)"), + /* 184 */ "Trace" OpHelp(""), + /* 185 */ "CursorHint" OpHelp(""), + /* 186 */ "ReleaseReg" OpHelp("release r[P1@P2] mask P3"), + /* 187 */ "Noop" OpHelp(""), + /* 188 */ "Explain" OpHelp(""), + /* 189 */ "Abortable" OpHelp(""), }; return azName[i]; } @@ -36938,7 +38500,7 @@ SQLITE_PRIVATE int sqlite3KvvfsInit(void){ ** This source file is organized into divisions where the logic for various ** subfunctions is contained within the appropriate division. PLEASE ** KEEP THE STRUCTURE OF THIS FILE INTACT. New code should be placed -** in the correct division and should be clearly labeled. +** in the correct division and should be clearly labelled. ** ** The layout of divisions is as follows: ** @@ -36988,7 +38550,7 @@ SQLITE_PRIVATE int sqlite3KvvfsInit(void){ #endif /* Use pread() and pwrite() if they are available */ -#if defined(__APPLE__) +#if defined(__APPLE__) || defined(__linux__) # define HAVE_PREAD 1 # define HAVE_PWRITE 1 #endif @@ -37238,7 +38800,7 @@ static pid_t randomnessPid = 0; #define UNIXFILE_EXCL 0x01 /* Connections from one process only */ #define UNIXFILE_RDONLY 0x02 /* Connection is read only */ #define UNIXFILE_PERSIST_WAL 0x04 /* Persistent WAL mode */ -#ifndef SQLITE_DISABLE_DIRSYNC +#if !defined(SQLITE_DISABLE_DIRSYNC) && !defined(_AIX) # define UNIXFILE_DIRSYNC 0x08 /* Directory sync needed */ #else # define UNIXFILE_DIRSYNC 0x00 @@ -37525,7 +39087,7 @@ static int robustFchown(int fd, uid_t uid, gid_t gid){ /* ** This is the xSetSystemCall() method of sqlite3_vfs for all of the -** "unix" VFSes. Return SQLITE_OK opon successfully updating the +** "unix" VFSes. Return SQLITE_OK upon successfully updating the ** system call pointer, or SQLITE_NOTFOUND if there is no configurable ** system call named zName. */ @@ -38047,7 +39609,7 @@ static void vxworksReleaseFileId(struct vxworksFileId *pId){ ** If you close a file descriptor that points to a file that has locks, ** all locks on that file that are owned by the current process are ** released. To work around this problem, each unixInodeInfo object -** maintains a count of the number of pending locks on tha inode. +** maintains a count of the number of pending locks on the inode. ** When an attempt is made to close an unixFile, if there are ** other unixFile open on the same inode that are holding locks, the call ** to close() the file descriptor is deferred until all of the locks clear. @@ -38061,7 +39623,7 @@ static void vxworksReleaseFileId(struct vxworksFileId *pId){ ** not posix compliant. Under LinuxThreads, a lock created by thread ** A cannot be modified or overridden by a different thread B. ** Only thread A can modify the lock. Locking behavior is correct -** if the appliation uses the newer Native Posix Thread Library (NPTL) +** if the application uses the newer Native Posix Thread Library (NPTL) ** on linux - with NPTL a lock created by thread A can override locks ** in thread B. But there is no way to know at compile-time which ** threading library is being used. So there is no way to know at @@ -38211,8 +39773,12 @@ static int unixLogErrorAtLine( ** available, the error message will often be an empty string. Not a ** huge problem. Incorrectly concluding that the GNU version is available ** could lead to a segfault though. + ** + ** Forum post 3f13857fa4062301 reports that the Android SDK may use + ** int-type return, depending on its version. */ -#if defined(STRERROR_R_CHAR_P) || defined(__USE_GNU) +#if (defined(STRERROR_R_CHAR_P) || defined(__USE_GNU)) \ + && !defined(ANDROID) && !defined(__ANDROID__) zErr = # endif strerror_r(iErrno, aErr, sizeof(aErr)-1); @@ -38263,7 +39829,7 @@ static void storeLastErrno(unixFile *pFile, int error){ } /* -** Close all file descriptors accumuated in the unixInodeInfo->pUnused list. +** Close all file descriptors accumulated in the unixInodeInfo->pUnused list. */ static void closePendingFds(unixFile *pFile){ unixInodeInfo *pInode = pFile->pInode; @@ -38626,7 +40192,7 @@ static int unixLock(sqlite3_file *id, int eFileLock){ ** slightly in order to be compatible with Windows95 systems simultaneously ** accessing the same database file, in case that is ever required. ** - ** Symbols defined in os.h indentify the 'pending byte' and the 'reserved + ** Symbols defined in os.h identify the 'pending byte' and the 'reserved ** byte', each single bytes at well known offsets, and the 'shared byte ** range', a range of 510 bytes at a well known offset. ** @@ -38634,7 +40200,7 @@ static int unixLock(sqlite3_file *id, int eFileLock){ ** byte'. If this is successful, 'shared byte range' is read-locked ** and the lock on the 'pending byte' released. (Legacy note: When ** SQLite was first developed, Windows95 systems were still very common, - ** and Widnows95 lacks a shared-lock capability. So on Windows95, a + ** and Windows95 lacks a shared-lock capability. So on Windows95, a ** single randomly selected by from the 'shared byte range' is locked. ** Windows95 is now pretty much extinct, but this work-around for the ** lack of shared-locks on Windows95 lives on, for backwards @@ -38655,7 +40221,7 @@ static int unixLock(sqlite3_file *id, int eFileLock){ ** obtaining a write-lock on the 'pending byte'. This ensures that no new ** SHARED locks can be obtained, but existing SHARED locks are allowed to ** persist. If the call to this function fails to obtain the EXCLUSIVE - ** lock in this case, it holds the PENDING lock intead. The client may + ** lock in this case, it holds the PENDING lock instead. The client may ** then re-attempt the EXCLUSIVE lock later on, after existing SHARED ** locks have cleared. */ @@ -38683,7 +40249,7 @@ static int unixLock(sqlite3_file *id, int eFileLock){ /* Make sure the locking sequence is correct. ** (1) We never move from unlocked to anything higher than shared lock. - ** (2) SQLite never explicitly requests a pendig lock. + ** (2) SQLite never explicitly requests a pending lock. ** (3) A shared lock is always held when a reserve lock is requested. */ assert( pFile->eFileLock!=NO_LOCK || eFileLock==SHARED_LOCK ); @@ -39191,26 +40757,22 @@ static int nolockClose(sqlite3_file *id) { /* ** This routine checks if there is a RESERVED lock held on the specified -** file by this or any other process. If such a lock is held, set *pResOut -** to a non-zero value otherwise *pResOut is set to zero. The return value -** is set to SQLITE_OK unless an I/O error occurs during lock checking. -** -** In dotfile locking, either a lock exists or it does not. So in this -** variation of CheckReservedLock(), *pResOut is set to true if any lock -** is held on the file and false if the file is unlocked. +** file by this or any other process. If the caller holds a SHARED +** or greater lock when it is called, then it is assumed that no other +** client may hold RESERVED. Or, if the caller holds no lock, then it +** is assumed another client holds RESERVED if the lock-file exists. */ static int dotlockCheckReservedLock(sqlite3_file *id, int *pResOut) { - int rc = SQLITE_OK; - int reserved = 0; unixFile *pFile = (unixFile*)id; - SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); - assert( pFile ); - reserved = osAccess((const char*)pFile->lockingContext, 0)==0; - OSTRACE(("TEST WR-LOCK %d %d %d (dotlock)\n", pFile->h, rc, reserved)); - *pResOut = reserved; - return rc; + if( pFile->eFileLock>=SHARED_LOCK ){ + *pResOut = 0; + }else{ + *pResOut = osAccess((const char*)pFile->lockingContext, 0)==0; + } + OSTRACE(("TEST WR-LOCK %d %d %d (dotlock)\n", pFile->h, 0, *pResOut)); + return SQLITE_OK; } /* @@ -39380,54 +40942,33 @@ static int robust_flock(int fd, int op){ ** is set to SQLITE_OK unless an I/O error occurs during lock checking. */ static int flockCheckReservedLock(sqlite3_file *id, int *pResOut){ - int rc = SQLITE_OK; - int reserved = 0; +#ifdef SQLITE_DEBUG unixFile *pFile = (unixFile*)id; +#else + UNUSED_PARAMETER(id); +#endif SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); assert( pFile ); + assert( pFile->eFileLock<=SHARED_LOCK ); - /* Check if a thread in this process holds such a lock */ - if( pFile->eFileLock>SHARED_LOCK ){ - reserved = 1; - } - - /* Otherwise see if some other process holds it. */ - if( !reserved ){ - /* attempt to get the lock */ - int lrc = robust_flock(pFile->h, LOCK_EX | LOCK_NB); - if( !lrc ){ - /* got the lock, unlock it */ - lrc = robust_flock(pFile->h, LOCK_UN); - if ( lrc ) { - int tErrno = errno; - /* unlock failed with an error */ - lrc = SQLITE_IOERR_UNLOCK; - storeLastErrno(pFile, tErrno); - rc = lrc; - } - } else { - int tErrno = errno; - reserved = 1; - /* someone else might have it reserved */ - lrc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); - if( IS_LOCK_ERROR(lrc) ){ - storeLastErrno(pFile, tErrno); - rc = lrc; - } - } - } - OSTRACE(("TEST WR-LOCK %d %d %d (flock)\n", pFile->h, rc, reserved)); + /* The flock VFS only ever takes exclusive locks (see function flockLock). + ** Therefore, if this connection is holding any lock at all, no other + ** connection may be holding a RESERVED lock. So set *pResOut to 0 + ** in this case. + ** + ** Or, this connection may be holding no lock. In that case, set *pResOut to + ** 0 as well. The caller will then attempt to take an EXCLUSIVE lock on the + ** db in order to roll the hot journal back. If there is another connection + ** holding a lock, that attempt will fail and an SQLITE_BUSY returned to + ** the user. With other VFS, we try to avoid this, in order to allow a reader + ** to proceed while a writer is preparing its transaction. But that won't + ** work with the flock VFS - as it always takes EXCLUSIVE locks - so it is + ** not a problem in this case. */ + *pResOut = 0; -#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS - if( (rc & 0xff) == SQLITE_IOERR ){ - rc = SQLITE_OK; - reserved=1; - } -#endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */ - *pResOut = reserved; - return rc; + return SQLITE_OK; } /* @@ -39901,7 +41442,7 @@ static int afpLock(sqlite3_file *id, int eFileLock){ /* Make sure the locking sequence is correct ** (1) We never move from unlocked to anything higher than shared lock. - ** (2) SQLite never explicitly requests a pendig lock. + ** (2) SQLite never explicitly requests a pending lock. ** (3) A shared lock is always held when a reserve lock is requested. */ assert( pFile->eFileLock!=NO_LOCK || eFileLock==SHARED_LOCK ); @@ -40017,7 +41558,7 @@ static int afpLock(sqlite3_file *id, int eFileLock){ if( !(failed = afpSetLock(context->dbPath, pFile, SHARED_FIRST + pInode->sharedByte, 1, 0)) ){ int failed2 = SQLITE_OK; - /* now attemmpt to get the exclusive lock range */ + /* now attempt to get the exclusive lock range */ failed = afpSetLock(context->dbPath, pFile, SHARED_FIRST, SHARED_SIZE, 1); if( failed && (failed2 = afpSetLock(context->dbPath, pFile, @@ -40066,9 +41607,6 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) { unixInodeInfo *pInode; afpLockingContext *context = (afpLockingContext *) pFile->lockingContext; int skipShared = 0; -#ifdef SQLITE_TEST - int h = pFile->h; -#endif assert( pFile ); OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (afp)\n", pFile->h, eFileLock, @@ -40084,9 +41622,6 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) { assert( pInode->nShared!=0 ); if( pFile->eFileLock>SHARED_LOCK ){ assert( pInode->eFileLock==pFile->eFileLock ); - SimulateIOErrorBenign(1); - SimulateIOError( h=(-1) ) - SimulateIOErrorBenign(0); #ifdef SQLITE_DEBUG /* When reducing a lock such that other processes can start @@ -40135,9 +41670,6 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) { unsigned long long sharedLockByte = SHARED_FIRST+pInode->sharedByte; pInode->nShared--; if( pInode->nShared==0 ){ - SimulateIOErrorBenign(1); - SimulateIOError( h=(-1) ) - SimulateIOErrorBenign(0); if( !skipShared ){ rc = afpSetLock(context->dbPath, pFile, sharedLockByte, 1, 0); } @@ -40238,12 +41770,6 @@ static int nfsUnlock(sqlite3_file *id, int eFileLock){ ** Seek to the offset passed as the second argument, then read cnt ** bytes into pBuf. Return the number of bytes actually read. ** -** NB: If you define USE_PREAD or USE_PREAD64, then it might also -** be necessary to define _XOPEN_SOURCE to be 500. This varies from -** one system to another. Since SQLite does not define USE_PREAD -** in any form by default, we will not attempt to define _XOPEN_SOURCE. -** See tickets #2741 and #2681. -** ** To avoid stomping the errno value on a failed read the lastErrno value ** is set before returning. */ @@ -40318,7 +41844,7 @@ static int unixRead( #endif #if SQLITE_MAX_MMAP_SIZE>0 - /* Deal with as much of this read request as possible by transfering + /* Deal with as much of this read request as possible by transferring ** data from the memory mapping using memcpy(). */ if( offsetmmapSize ){ if( offset+amt <= pFile->mmapSize ){ @@ -40470,7 +41996,7 @@ static int unixWrite( #endif #if defined(SQLITE_MMAP_READWRITE) && SQLITE_MAX_MMAP_SIZE>0 - /* Deal with as much of this write request as possible by transfering + /* Deal with as much of this write request as possible by transferring ** data from the memory mapping using memcpy(). */ if( offsetmmapSize ){ if( offset+amt <= pFile->mmapSize ){ @@ -40592,7 +42118,7 @@ static int full_fsync(int fd, int fullSync, int dataOnly){ /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a ** no-op. But go ahead and call fstat() to validate the file ** descriptor as we need a method to provoke a failure during - ** coverate testing. + ** coverage testing. */ #ifdef SQLITE_NO_SYNC { @@ -40914,7 +42440,7 @@ static void unixModeBit(unixFile *pFile, unsigned char mask, int *pArg){ /* Forward declaration */ static int unixGetTempname(int nBuf, char *zBuf); -#ifndef SQLITE_OMIT_WAL +#if !defined(SQLITE_WASI) && !defined(SQLITE_OMIT_WAL) static int unixFcntlExternalReader(unixFile*, int*); #endif @@ -40985,7 +42511,13 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ #ifdef SQLITE_ENABLE_SETLK_TIMEOUT case SQLITE_FCNTL_LOCK_TIMEOUT: { int iOld = pFile->iBusyTimeout; +#if SQLITE_ENABLE_SETLK_TIMEOUT==1 pFile->iBusyTimeout = *(int*)pArg; +#elif SQLITE_ENABLE_SETLK_TIMEOUT==2 + pFile->iBusyTimeout = !!(*(int*)pArg); +#else +# error "SQLITE_ENABLE_SETLK_TIMEOUT must be set to 1 or 2" +#endif *(int*)pArg = iOld; return SQLITE_OK; } @@ -41035,7 +42567,7 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ #endif /* SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) */ case SQLITE_FCNTL_EXTERNAL_READER: { -#ifndef SQLITE_OMIT_WAL +#if !defined(SQLITE_WASI) && !defined(SQLITE_OMIT_WAL) return unixFcntlExternalReader((unixFile*)id, (int*)pArg); #else *(int*)pArg = 0; @@ -41074,6 +42606,7 @@ static void setDeviceCharacteristics(unixFile *pFd){ if( pFd->ctrlFlags & UNIXFILE_PSOW ){ pFd->deviceCharacteristics |= SQLITE_IOCAP_POWERSAFE_OVERWRITE; } + pFd->deviceCharacteristics |= SQLITE_IOCAP_SUBPAGE_READ; pFd->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; } @@ -41124,7 +42657,7 @@ static void setDeviceCharacteristics(unixFile *pFile){ pFile->sectorSize = fsInfo.f_bsize; pFile->deviceCharacteristics = /* full bitset of atomics from max sector size and smaller */ - ((pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) << 1) - 2 | + (((pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) << 1) - 2) | SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind ** so it is ordered */ 0; @@ -41132,7 +42665,7 @@ static void setDeviceCharacteristics(unixFile *pFile){ pFile->sectorSize = fsInfo.f_bsize; pFile->deviceCharacteristics = /* full bitset of atomics from max sector size and smaller */ - ((pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) << 1) - 2 | + (((pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) << 1) - 2) | SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind ** so it is ordered */ 0; @@ -41208,7 +42741,7 @@ static int unixGetpagesize(void){ #endif /* !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 */ -#ifndef SQLITE_OMIT_WAL +#if !defined(SQLITE_WASI) && !defined(SQLITE_OMIT_WAL) /* ** Object used to represent an shared memory buffer. @@ -41238,6 +42771,25 @@ static int unixGetpagesize(void){ ** Either unixShmNode.pShmMutex must be held or unixShmNode.nRef==0 and ** unixMutexHeld() is true when reading or writing any other field ** in this structure. +** +** aLock[SQLITE_SHM_NLOCK]: +** This array records the various locks held by clients on each of the +** SQLITE_SHM_NLOCK slots. If the aLock[] entry is set to 0, then no +** locks are held by the process on this slot. If it is set to -1, then +** some client holds an EXCLUSIVE lock on the locking slot. If the aLock[] +** value is set to a positive value, then it is the number of shared +** locks currently held on the slot. +** +** aMutex[SQLITE_SHM_NLOCK]: +** Normally, when SQLITE_ENABLE_SETLK_TIMEOUT is not defined, mutex +** pShmMutex is used to protect the aLock[] array and the right to +** call fcntl() on unixShmNode.hShm to obtain or release locks. +** +** If SQLITE_ENABLE_SETLK_TIMEOUT is defined though, we use an array +** of mutexes - one for each locking slot. To read or write locking +** slot aLock[iSlot], the caller must hold the corresponding mutex +** aMutex[iSlot]. Similarly, to call fcntl() to obtain or release a +** lock corresponding to slot iSlot, mutex aMutex[iSlot] must be held. */ struct unixShmNode { unixInodeInfo *pInode; /* unixInodeInfo that owns this SHM node */ @@ -41251,10 +42803,11 @@ struct unixShmNode { char **apRegion; /* Array of mapped shared-memory regions */ int nRef; /* Number of unixShm objects pointing to this */ unixShm *pFirst; /* All unixShm objects pointing to this */ +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + sqlite3_mutex *aMutex[SQLITE_SHM_NLOCK]; +#endif int aLock[SQLITE_SHM_NLOCK]; /* # shared locks on slot, -1==excl lock */ #ifdef SQLITE_DEBUG - u8 exclMask; /* Mask of exclusive locks held */ - u8 sharedMask; /* Mask of shared locks held */ u8 nextShmId; /* Next available unixShm.id value */ #endif }; @@ -41337,16 +42890,35 @@ static int unixShmSystemLock( struct flock f; /* The posix advisory locking structure */ int rc = SQLITE_OK; /* Result code form fcntl() */ - /* Access to the unixShmNode object is serialized by the caller */ pShmNode = pFile->pInode->pShmNode; - assert( pShmNode->nRef==0 || sqlite3_mutex_held(pShmNode->pShmMutex) ); - assert( pShmNode->nRef>0 || unixMutexHeld() ); + + /* Assert that the parameters are within expected range and that the + ** correct mutex or mutexes are held. */ + assert( pShmNode->nRef>=0 ); + assert( (ofst==UNIX_SHM_DMS && n==1) + || (ofst>=UNIX_SHM_BASE && ofst+n<=(UNIX_SHM_BASE+SQLITE_SHM_NLOCK)) + ); + if( ofst==UNIX_SHM_DMS ){ + assert( pShmNode->nRef>0 || unixMutexHeld() ); + assert( pShmNode->nRef==0 || sqlite3_mutex_held(pShmNode->pShmMutex) ); + }else{ +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + int ii; + for(ii=ofst-UNIX_SHM_BASE; iiaMutex[ii]) ); + } +#else + assert( sqlite3_mutex_held(pShmNode->pShmMutex) ); + assert( pShmNode->nRef>0 ); +#endif + } /* Shared locks never span more than one byte */ assert( n==1 || lockType!=F_RDLCK ); /* Locks are within range */ assert( n>=1 && n<=SQLITE_SHM_NLOCK ); + assert( ofst>=UNIX_SHM_BASE && ofst<=(UNIX_SHM_DMS+SQLITE_SHM_NLOCK) ); if( pShmNode->hShm>=0 ){ int res; @@ -41357,7 +42929,7 @@ static int unixShmSystemLock( f.l_len = n; res = osSetPosixAdvisoryLock(pShmNode->hShm, &f, pFile); if( res==-1 ){ -#ifdef SQLITE_ENABLE_SETLK_TIMEOUT +#if defined(SQLITE_ENABLE_SETLK_TIMEOUT) && SQLITE_ENABLE_SETLK_TIMEOUT==1 rc = (pFile->iBusyTimeout ? SQLITE_BUSY_TIMEOUT : SQLITE_BUSY); #else rc = SQLITE_BUSY; @@ -41365,39 +42937,28 @@ static int unixShmSystemLock( } } - /* Update the global lock state and do debug tracing */ + /* Do debug tracing */ #ifdef SQLITE_DEBUG - { u16 mask; OSTRACE(("SHM-LOCK ")); - mask = ofst>31 ? 0xffff : (1<<(ofst+n)) - (1<exclMask &= ~mask; - pShmNode->sharedMask &= ~mask; + OSTRACE(("unlock %d..%d ok\n", ofst, ofst+n-1)); }else if( lockType==F_RDLCK ){ - OSTRACE(("read-lock %d ok", ofst)); - pShmNode->exclMask &= ~mask; - pShmNode->sharedMask |= mask; + OSTRACE(("read-lock %d..%d ok\n", ofst, ofst+n-1)); }else{ assert( lockType==F_WRLCK ); - OSTRACE(("write-lock %d ok", ofst)); - pShmNode->exclMask |= mask; - pShmNode->sharedMask &= ~mask; + OSTRACE(("write-lock %d..%d ok\n", ofst, ofst+n-1)); } }else{ if( lockType==F_UNLCK ){ - OSTRACE(("unlock %d failed", ofst)); + OSTRACE(("unlock %d..%d failed\n", ofst, ofst+n-1)); }else if( lockType==F_RDLCK ){ - OSTRACE(("read-lock failed")); + OSTRACE(("read-lock %d..%d failed\n", ofst, ofst+n-1)); }else{ assert( lockType==F_WRLCK ); - OSTRACE(("write-lock %d failed", ofst)); + OSTRACE(("write-lock %d..%d failed\n", ofst, ofst+n-1)); } } - OSTRACE((" - afterwards %03x,%03x\n", - pShmNode->sharedMask, pShmNode->exclMask)); - } #endif return rc; @@ -41434,6 +42995,11 @@ static void unixShmPurge(unixFile *pFd){ int i; assert( p->pInode==pFd->pInode ); sqlite3_mutex_free(p->pShmMutex); +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + for(i=0; iaMutex[i]); + } +#endif for(i=0; inRegion; i+=nShmPerMap){ if( p->hShm>=0 ){ osMunmap(p->apRegion[i], p->szRegion); @@ -41493,7 +43059,20 @@ static int unixLockSharedMemory(unixFile *pDbFd, unixShmNode *pShmNode){ pShmNode->isUnlocked = 1; rc = SQLITE_READONLY_CANTINIT; }else{ +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + /* Do not use a blocking lock here. If the lock cannot be obtained + ** immediately, it means some other connection is truncating the + ** *-shm file. And after it has done so, it will not release its + ** lock, but only downgrade it to a shared lock. So no point in + ** blocking here. The call below to obtain the shared DMS lock may + ** use a blocking lock. */ + int iSaveTimeout = pDbFd->iBusyTimeout; + pDbFd->iBusyTimeout = 0; +#endif rc = unixShmSystemLock(pDbFd, F_WRLCK, UNIX_SHM_DMS, 1); +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + pDbFd->iBusyTimeout = iSaveTimeout; +#endif /* The first connection to attach must truncate the -shm file. We ** truncate to 3 bytes (an arbitrary small number, less than the ** -shm header size) rather than 0 as a system debugging aid, to @@ -41614,6 +43193,18 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ rc = SQLITE_NOMEM_BKPT; goto shm_open_err; } +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + { + int ii; + for(ii=0; iiaMutex[ii] = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); + if( pShmNode->aMutex[ii]==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto shm_open_err; + } + } + } +#endif } if( pInode->bProcessLock==0 ){ @@ -41835,9 +43426,11 @@ static int unixShmMap( */ #ifdef SQLITE_DEBUG static int assertLockingArrayOk(unixShmNode *pShmNode){ +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + return 1; +#else unixShm *pX; int aLock[SQLITE_SHM_NLOCK]; - assert( sqlite3_mutex_held(pShmNode->pShmMutex) ); memset(aLock, 0, sizeof(aLock)); for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ @@ -41855,13 +43448,14 @@ static int assertLockingArrayOk(unixShmNode *pShmNode){ assert( 0==memcmp(pShmNode->aLock, aLock, sizeof(aLock)) ); return (memcmp(pShmNode->aLock, aLock, sizeof(aLock))==0); +#endif } #endif /* ** Change the lock state for a shared-memory segment. ** -** Note that the relationship between SHAREd and EXCLUSIVE locks is a little +** Note that the relationship between SHARED and EXCLUSIVE locks is a little ** different here than in posix. In xShmLock(), one can go from unlocked ** to shared and back or from unlocked to exclusive and back. But one may ** not go from shared to exclusive or from exclusive to shared. @@ -41876,7 +43470,7 @@ static int unixShmLock( unixShm *p; /* The shared memory being locked */ unixShmNode *pShmNode; /* The underlying file iNode */ int rc = SQLITE_OK; /* Result code */ - u16 mask; /* Mask of locks to take or release */ + u16 mask = (1<<(ofst+n)) - (1<pShm; @@ -41911,88 +43505,151 @@ static int unixShmLock( ** It is not permitted to block on the RECOVER lock. */ #ifdef SQLITE_ENABLE_SETLK_TIMEOUT - assert( (flags & SQLITE_SHM_UNLOCK) || pDbFd->iBusyTimeout==0 || ( - (ofst!=2) /* not RECOVER */ - && (ofst!=1 || (p->exclMask|p->sharedMask)==0) - && (ofst!=0 || (p->exclMask|p->sharedMask)<3) - && (ofst<3 || (p->exclMask|p->sharedMask)<(1<exclMask|p->sharedMask); + assert( (flags & SQLITE_SHM_UNLOCK) || pDbFd->iBusyTimeout==0 || ( + (ofst!=2) /* not RECOVER */ + && (ofst!=1 || lockMask==0 || lockMask==2) + && (ofst!=0 || lockMask<3) + && (ofst<3 || lockMask<(1<1 || mask==(1<pShmMutex); - assert( assertLockingArrayOk(pShmNode) ); - if( flags & SQLITE_SHM_UNLOCK ){ - if( (p->exclMask|p->sharedMask) & mask ){ - int ii; - int bUnlock = 1; + /* Check if there is any work to do. There are three cases: + ** + ** a) An unlock operation where there are locks to unlock, + ** b) An shared lock where the requested lock is not already held + ** c) An exclusive lock where the requested lock is not already held + ** + ** The SQLite core never requests an exclusive lock that it already holds. + ** This is assert()ed below. + */ + assert( flags!=(SQLITE_SHM_EXCLUSIVE|SQLITE_SHM_LOCK) + || 0==(p->exclMask & mask) + ); + if( ((flags & SQLITE_SHM_UNLOCK) && ((p->exclMask|p->sharedMask) & mask)) + || (flags==(SQLITE_SHM_SHARED|SQLITE_SHM_LOCK) && 0==(p->sharedMask & mask)) + || (flags==(SQLITE_SHM_EXCLUSIVE|SQLITE_SHM_LOCK)) + ){ - for(ii=ofst; ii((p->sharedMask & (1<aMutex[iMutex]); + if( rc!=SQLITE_OK ) goto leave_shmnode_mutexes; + }else{ + sqlite3_mutex_enter(pShmNode->aMutex[iMutex]); } + } +#else + sqlite3_mutex_enter(pShmNode->pShmMutex); +#endif - if( bUnlock ){ - rc = unixShmSystemLock(pDbFd, F_UNLCK, ofst+UNIX_SHM_BASE, n); - if( rc==SQLITE_OK ){ - memset(&aLock[ofst], 0, sizeof(int)*n); + if( ALWAYS(rc==SQLITE_OK) ){ + if( flags & SQLITE_SHM_UNLOCK ){ + /* Case (a) - unlock. */ + int bUnlock = 1; + assert( (p->exclMask & p->sharedMask)==0 ); + assert( !(flags & SQLITE_SHM_EXCLUSIVE) || (p->exclMask & mask)==mask ); + assert( !(flags & SQLITE_SHM_SHARED) || (p->sharedMask & mask)==mask ); + + /* If this is a SHARED lock being unlocked, it is possible that other + ** clients within this process are holding the same SHARED lock. In + ** this case, set bUnlock to 0 so that the posix lock is not removed + ** from the file-descriptor below. */ + if( flags & SQLITE_SHM_SHARED ){ + assert( n==1 ); + assert( aLock[ofst]>=1 ); + if( aLock[ofst]>1 ){ + bUnlock = 0; + aLock[ofst]--; + p->sharedMask &= ~mask; + } } - }else if( ALWAYS(p->sharedMask & (1<1 ); - aLock[ofst]--; - } - /* Undo the local locks */ - if( rc==SQLITE_OK ){ - p->exclMask &= ~mask; - p->sharedMask &= ~mask; - } - } - }else if( flags & SQLITE_SHM_SHARED ){ - assert( n==1 ); - assert( (p->exclMask & (1<sharedMask & mask)==0 ){ - if( aLock[ofst]<0 ){ - rc = SQLITE_BUSY; - }else if( aLock[ofst]==0 ){ - rc = unixShmSystemLock(pDbFd, F_RDLCK, ofst+UNIX_SHM_BASE, n); - } + if( bUnlock ){ + rc = unixShmSystemLock(pDbFd, F_UNLCK, ofst+UNIX_SHM_BASE, n); + if( rc==SQLITE_OK ){ + memset(&aLock[ofst], 0, sizeof(int)*n); + p->sharedMask &= ~mask; + p->exclMask &= ~mask; + } + } + }else if( flags & SQLITE_SHM_SHARED ){ + /* Case (b) - a shared lock. */ - /* Get the local shared locks */ - if( rc==SQLITE_OK ){ - p->sharedMask |= mask; - aLock[ofst]++; - } - } - }else{ - /* Make sure no sibling connections hold locks that will block this - ** lock. If any do, return SQLITE_BUSY right away. */ - int ii; - for(ii=ofst; iisharedMask & mask)==0 ); - if( ALWAYS((p->exclMask & (1<sharedMask |= mask; + aLock[ofst]++; + } + }else{ + /* Case (c) - an exclusive lock. */ + int ii; + + assert( flags==(SQLITE_SHM_LOCK|SQLITE_SHM_EXCLUSIVE) ); assert( (p->sharedMask & mask)==0 ); - p->exclMask |= mask; + assert( (p->exclMask & mask)==0 ); + + /* Make sure no sibling connections hold locks that will block this + ** lock. If any do, return SQLITE_BUSY right away. */ for(ii=ofst; iiexclMask |= mask; + for(ii=ofst; ii=ofst; iMutex--){ + sqlite3_mutex_leave(pShmNode->aMutex[iMutex]); + } +#else + sqlite3_mutex_leave(pShmNode->pShmMutex); +#endif } - assert( assertLockingArrayOk(pShmNode) ); - sqlite3_mutex_leave(pShmNode->pShmMutex); + OSTRACE(("SHM-LOCK shmid-%d, pid-%d got %03x,%03x\n", p->id, osGetpid(0), p->sharedMask, p->exclMask)); return rc; @@ -42242,11 +43899,16 @@ static int unixFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){ #if SQLITE_MAX_MMAP_SIZE>0 if( pFd->mmapSizeMax>0 ){ + /* Ensure that there is always at least a 256 byte buffer of addressable + ** memory following the returned page. If the database is corrupt, + ** SQLite may overread the page slightly (in practice only a few bytes, + ** but 256 is safe, round, number). */ + const int nEofBuffer = 256; if( pFd->pMapRegion==0 ){ int rc = unixMapfile(pFd, -1); if( rc!=SQLITE_OK ) return rc; } - if( pFd->mmapSize >= iOff+nAmt ){ + if( pFd->mmapSize >= (iOff+nAmt+nEofBuffer) ){ *pp = &((u8 *)pFd->pMapRegion)[iOff]; pFd->nFetchOut++; } @@ -43190,12 +44852,19 @@ static int unixOpen( rc = SQLITE_READONLY_DIRECTORY; }else if( errno!=EISDIR && isReadWrite ){ /* Failed to open the file for read/write access. Try read-only. */ + UnixUnusedFd *pReadonly = 0; flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE); openFlags &= ~(O_RDWR|O_CREAT); flags |= SQLITE_OPEN_READONLY; openFlags |= O_RDONLY; isReadonly = 1; - fd = robust_open(zName, openFlags, openMode); + pReadonly = findReusableFd(zName, flags); + if( pReadonly ){ + fd = pReadonly->fd; + sqlite3_free(pReadonly); + }else{ + fd = robust_open(zName, openFlags, openMode); + } } } if( fd<0 ){ @@ -43637,12 +45306,17 @@ static int unixRandomness(sqlite3_vfs *NotUsed, int nBuf, char *zBuf){ ** than the argument. */ static int unixSleep(sqlite3_vfs *NotUsed, int microseconds){ -#if OS_VXWORKS || _POSIX_C_SOURCE >= 199309L +#if !defined(HAVE_NANOSLEEP) || HAVE_NANOSLEEP+0 struct timespec sp; - sp.tv_sec = microseconds / 1000000; sp.tv_nsec = (microseconds % 1000000) * 1000; + + /* Almost all modern unix systems support nanosleep(). But if you are + ** compiling for one of the rare exceptions, you can use + ** -DHAVE_NANOSLEEP=0 (perhaps in conjuction with -DHAVE_USLEEP if + ** usleep() is available) in order to bypass the use of nanosleep() */ nanosleep(&sp, NULL); + UNUSED_PARAMETER(NotUsed); return microseconds; #elif defined(HAVE_USLEEP) && HAVE_USLEEP @@ -46232,7 +47906,7 @@ static struct win_syscall { /* ** This is the xSetSystemCall() method of sqlite3_vfs for all of the -** "win32" VFSes. Return SQLITE_OK opon successfully updating the +** "win32" VFSes. Return SQLITE_OK upon successfully updating the ** system call pointer, or SQLITE_NOTFOUND if there is no configurable ** system call named zName. */ @@ -47812,7 +49486,7 @@ static int winRead( pFile->h, pBuf, amt, offset, pFile->locktype)); #if SQLITE_MAX_MMAP_SIZE>0 - /* Deal with as much of this read request as possible by transfering + /* Deal with as much of this read request as possible by transferring ** data from the memory mapping using memcpy(). */ if( offsetmmapSize ){ if( offset+amt <= pFile->mmapSize ){ @@ -47890,7 +49564,7 @@ static int winWrite( pFile->h, pBuf, amt, offset, pFile->locktype)); #if defined(SQLITE_MMAP_READWRITE) && SQLITE_MAX_MMAP_SIZE>0 - /* Deal with as much of this write request as possible by transfering + /* Deal with as much of this write request as possible by transferring ** data from the memory mapping using memcpy(). */ if( offsetmmapSize ){ if( offset+amt <= pFile->mmapSize ){ @@ -48000,7 +49674,7 @@ static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){ ** all references to memory-mapped content are closed. That is doable, ** but involves adding a few branches in the common write code path which ** could slow down normal operations slightly. Hence, we have decided for - ** now to simply make trancations a no-op if there are pending reads. We + ** now to simply make transactions a no-op if there are pending reads. We ** can maybe revisit this decision in the future. */ return SQLITE_OK; @@ -48059,7 +49733,7 @@ static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){ #ifdef SQLITE_TEST /* ** Count the number of fullsyncs and normal syncs. This is used to test -** that syncs and fullsyncs are occuring at the right times. +** that syncs and fullsyncs are occurring at the right times. */ SQLITE_API int sqlite3_sync_count = 0; SQLITE_API int sqlite3_fullsync_count = 0; @@ -48416,7 +50090,7 @@ static int winLock(sqlite3_file *id, int locktype){ */ if( locktype==EXCLUSIVE_LOCK && res ){ assert( pFile->locktype>=SHARED_LOCK ); - res = winUnlockReadLock(pFile); + (void)winUnlockReadLock(pFile); res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, SHARED_FIRST, 0, SHARED_SIZE, 0); if( res ){ @@ -48733,7 +50407,7 @@ static int winSectorSize(sqlite3_file *id){ */ static int winDeviceCharacteristics(sqlite3_file *id){ winFile *p = (winFile*)id; - return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | + return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | SQLITE_IOCAP_SUBPAGE_READ | ((p->ctrlFlags & WINFILE_PSOW)?SQLITE_IOCAP_POWERSAFE_OVERWRITE:0); } @@ -49594,6 +51268,11 @@ static int winFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){ #if SQLITE_MAX_MMAP_SIZE>0 if( pFd->mmapSizeMax>0 ){ + /* Ensure that there is always at least a 256 byte buffer of addressable + ** memory following the returned page. If the database is corrupt, + ** SQLite may overread the page slightly (in practice only a few bytes, + ** but 256 is safe, round, number). */ + const int nEofBuffer = 256; if( pFd->pMapRegion==0 ){ int rc = winMapfile(pFd, -1); if( rc!=SQLITE_OK ){ @@ -49602,7 +51281,7 @@ static int winFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){ return rc; } } - if( pFd->mmapSize >= iOff+nAmt ){ + if( pFd->mmapSize >= (iOff+nAmt+nEofBuffer) ){ assert( pFd->pMapRegion!=0 ); *pp = &((u8 *)pFd->pMapRegion)[iOff]; pFd->nFetchOut++; @@ -49820,6 +51499,7 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "0123456789"; size_t i, j; + DWORD pid; int nPre = sqlite3Strlen30(SQLITE_TEMP_FILE_PREFIX); int nMax, nBuf, nDir, nLen; char *zBuf; @@ -50032,7 +51712,10 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){ j = sqlite3Strlen30(zBuf); sqlite3_randomness(15, &zBuf[j]); + pid = osGetCurrentProcessId(); for(i=0; i<15; i++, j++){ + zBuf[j] += pid & 0xff; + pid >>= 8; zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ]; } zBuf[j] = 0; @@ -50112,7 +51795,7 @@ static int winOpen( int rc = SQLITE_OK; /* Function Return Code */ #if !defined(NDEBUG) || SQLITE_OS_WINCE - int eType = flags&0xFFFFFF00; /* Type of file to open */ + int eType = flags&0x0FFF00; /* Type of file to open */ #endif int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE); @@ -50270,7 +51953,7 @@ static int winOpen( if( isReadWrite ){ int rc2, isRO = 0; sqlite3BeginBenignMalloc(); - rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO); + rc2 = winAccess(pVfs, zUtf8Name, SQLITE_ACCESS_READ, &isRO); sqlite3EndBenignMalloc(); if( rc2==SQLITE_OK && isRO ) break; } @@ -50287,7 +51970,7 @@ static int winOpen( if( isReadWrite ){ int rc2, isRO = 0; sqlite3BeginBenignMalloc(); - rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO); + rc2 = winAccess(pVfs, zUtf8Name, SQLITE_ACCESS_READ, &isRO); sqlite3EndBenignMalloc(); if( rc2==SQLITE_OK && isRO ) break; } @@ -50307,7 +51990,7 @@ static int winOpen( if( isReadWrite ){ int rc2, isRO = 0; sqlite3BeginBenignMalloc(); - rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO); + rc2 = winAccess(pVfs, zUtf8Name, SQLITE_ACCESS_READ, &isRO); sqlite3EndBenignMalloc(); if( rc2==SQLITE_OK && isRO ) break; } @@ -50530,6 +52213,13 @@ static int winAccess( OSTRACE(("ACCESS name=%s, flags=%x, pResOut=%p\n", zFilename, flags, pResOut)); + if( zFilename==0 ){ + *pResOut = 0; + OSTRACE(("ACCESS name=%s, pResOut=%p, *pResOut=%d, rc=SQLITE_OK\n", + zFilename, pResOut, *pResOut)); + return SQLITE_OK; + } + zConverted = winConvertFromUtf8Filename(zFilename); if( zConverted==0 ){ OSTRACE(("ACCESS name=%s, rc=SQLITE_IOERR_NOMEM\n", zFilename)); @@ -52070,6 +53760,14 @@ SQLITE_API unsigned char *sqlite3_serialize( pOut = 0; }else{ sz = sqlite3_column_int64(pStmt, 0)*szPage; + if( sz==0 ){ + sqlite3_reset(pStmt); + sqlite3_exec(db, "BEGIN IMMEDIATE; COMMIT;", 0, 0, 0); + rc = sqlite3_step(pStmt); + if( rc==SQLITE_ROW ){ + sz = sqlite3_column_int64(pStmt, 0)*szPage; + } + } if( piSize ) *piSize = sz; if( mFlags & SQLITE_SERIALIZE_NOCOPY ){ pOut = 0; @@ -52390,7 +54088,7 @@ SQLITE_PRIVATE int sqlite3BitvecSet(Bitvec *p, u32 i){ h = BITVEC_HASH(i++); /* if there wasn't a hash collision, and this doesn't */ /* completely fill the hash, then just add it without */ - /* worring about sub-dividing and re-hashing. */ + /* worrying about sub-dividing and re-hashing. */ if( !p->u.aHash[h] ){ if (p->nSet<(BITVEC_NINT-1)) { goto bitvec_set_end; @@ -52686,11 +54384,15 @@ struct PCache { PgHdr *pPg; unsigned char *a; int j; - pPg = (PgHdr*)pLower->pExtra; - printf("%3lld: nRef %2d flgs %02x data ", i, pPg->nRef, pPg->flags); - a = (unsigned char *)pLower->pBuf; - for(j=0; j<12; j++) printf("%02x", a[j]); - printf(" ptr %p\n", pPg); + if( pLower==0 ){ + printf("%3d: NULL\n", i); + }else{ + pPg = (PgHdr*)pLower->pExtra; + printf("%3d: nRef %2lld flgs %02x data ", i, pPg->nRef, pPg->flags); + a = (unsigned char *)pLower->pBuf; + for(j=0; j<12; j++) printf("%02x", a[j]); + printf(" ptr %p\n", pPg); + } } static void pcacheDump(PCache *pCache){ int N; @@ -52703,9 +54405,8 @@ struct PCache { if( N>sqlite3PcacheMxDump ) N = sqlite3PcacheMxDump; for(i=1; i<=N; i++){ pLower = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, i, 0); - if( pLower==0 ) continue; pcachePageTrace(i, pLower); - if( ((PgHdr*)pLower)->pPage==0 ){ + if( pLower && ((PgHdr*)pLower)->pPage==0 ){ sqlite3GlobalConfig.pcache2.xUnpin(pCache->pCache, pLower, 0); } } @@ -52720,7 +54421,7 @@ struct PCache { ** Return 1 if pPg is on the dirty list for pCache. Return 0 if not. ** This routine runs inside of assert() statements only. */ -#ifdef SQLITE_DEBUG +#if defined(SQLITE_ENABLE_EXPENSIVE_ASSERT) static int pageOnDirtyList(PCache *pCache, PgHdr *pPg){ PgHdr *p; for(p=pCache->pDirty; p; p=p->pDirtyNext){ @@ -52728,6 +54429,16 @@ static int pageOnDirtyList(PCache *pCache, PgHdr *pPg){ } return 0; } +static int pageNotOnDirtyList(PCache *pCache, PgHdr *pPg){ + PgHdr *p; + for(p=pCache->pDirty; p; p=p->pDirtyNext){ + if( p==pPg ) return 0; + } + return 1; +} +#else +# define pageOnDirtyList(A,B) 1 +# define pageNotOnDirtyList(A,B) 1 #endif /* @@ -52748,7 +54459,7 @@ SQLITE_PRIVATE int sqlite3PcachePageSanity(PgHdr *pPg){ assert( pCache!=0 ); /* Every page has an associated PCache */ if( pPg->flags & PGHDR_CLEAN ){ assert( (pPg->flags & PGHDR_DIRTY)==0 );/* Cannot be both CLEAN and DIRTY */ - assert( !pageOnDirtyList(pCache, pPg) );/* CLEAN pages not on dirty list */ + assert( pageNotOnDirtyList(pCache, pPg) );/* CLEAN pages not on dirtylist */ }else{ assert( (pPg->flags & PGHDR_DIRTY)!=0 );/* If not CLEAN must be DIRTY */ assert( pPg->pDirtyNext==0 || pPg->pDirtyNext->pDirtyPrev==pPg ); @@ -52884,7 +54595,7 @@ static int numberOfCachePages(PCache *p){ return p->szCache; }else{ i64 n; - /* IMPLEMANTATION-OF: R-59858-46238 If the argument N is negative, then the + /* IMPLEMENTATION-OF: R-59858-46238 If the argument N is negative, then the ** number of cache pages is adjusted to be a number of pages that would ** use approximately abs(N*1024) bytes of memory based on the current ** page size. */ @@ -53115,6 +54826,7 @@ static SQLITE_NOINLINE PgHdr *pcacheFetchFinishWithInit( pPgHdr->pData = pPage->pBuf; pPgHdr->pExtra = (void *)&pPgHdr[1]; memset(pPgHdr->pExtra, 0, 8); + assert( EIGHT_BYTE_ALIGNMENT( pPgHdr->pExtra ) ); pPgHdr->pCache = pCache; pPgHdr->pgno = pgno; pPgHdr->flags = PGHDR_CLEAN; @@ -53372,7 +55084,7 @@ static PgHdr *pcacheMergeDirtyList(PgHdr *pA, PgHdr *pB){ } /* -** Sort the list of pages in accending order by pgno. Pages are +** Sort the list of pages in ascending order by pgno. Pages are ** connected by pDirty pointers. The pDirtyPrev pointers are ** corrupted by this sort. ** @@ -53612,7 +55324,7 @@ SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHd ** If N is positive, then N pages worth of memory are allocated using a single ** sqlite3Malloc() call and that memory is used for the first N pages allocated. ** Or if N is negative, then -1024*N bytes of memory are allocated and used -** for as many pages as can be accomodated. +** for as many pages as can be accommodated. ** ** Only one of (2) or (3) can be used. Once the memory available to (2) or ** (3) is exhausted, subsequent allocations fail over to the general-purpose @@ -53646,7 +55358,7 @@ typedef struct PGroup PGroup; ** in memory directly after the associated page data, if the database is ** corrupt, code at the b-tree layer may overread the page buffer and ** read part of this structure before the corruption is detected. This -** can cause a valgrind error if the unitialized gap is accessed. Using u16 +** can cause a valgrind error if the uninitialized gap is accessed. Using u16 ** ensures there is no such gap, and therefore no bytes of uninitialized ** memory in the structure. ** @@ -53861,7 +55573,8 @@ static int pcache1InitBulk(PCache1 *pCache){ do{ PgHdr1 *pX = (PgHdr1*)&zBulk[pCache->szPage]; pX->page.pBuf = zBulk; - pX->page.pExtra = &pX[1]; + pX->page.pExtra = (u8*)pX + ROUND8(sizeof(*pX)); + assert( EIGHT_BYTE_ALIGNMENT( pX->page.pExtra ) ); pX->isBulkLocal = 1; pX->isAnchor = 0; pX->pNext = pCache->pFree; @@ -53998,7 +55711,8 @@ static PgHdr1 *pcache1AllocPage(PCache1 *pCache, int benignMalloc){ if( pPg==0 ) return 0; p = (PgHdr1 *)&((u8 *)pPg)[pCache->szPage]; p->page.pBuf = pPg; - p->page.pExtra = &p[1]; + p->page.pExtra = (u8*)p + ROUND8(sizeof(*p)); + assert( EIGHT_BYTE_ALIGNMENT( p->page.pExtra ) ); p->isBulkLocal = 0; p->isAnchor = 0; p->pLruPrev = 0; /* Initializing this saves a valgrind error */ @@ -54866,7 +56580,7 @@ SQLITE_PRIVATE void sqlite3PcacheStats( ** The TEST primitive includes a "batch" number. The TEST primitive ** will only see elements that were inserted before the last change ** in the batch number. In other words, if an INSERT occurs between -** two TESTs where the TESTs have the same batch nubmer, then the +** two TESTs where the TESTs have the same batch number, then the ** value added by the INSERT will not be visible to the second TEST. ** The initial batch number is zero, so if the very first TEST contains ** a non-zero batch number, it will see all prior INSERTs. @@ -55398,6 +57112,7 @@ SQLITE_PRIVATE int sqlite3RowSetTest(RowSet *pRowSet, int iBatch, sqlite3_int64 # define sqlite3WalFramesize(z) 0 # define sqlite3WalFindFrame(x,y,z) 0 # define sqlite3WalFile(x) 0 +# undef SQLITE_USE_SEH #else #define WAL_SAVEPOINT_NDATA 4 @@ -55504,6 +57219,10 @@ SQLITE_PRIVATE int sqlite3WalWriteLock(Wal *pWal, int bLock); SQLITE_PRIVATE void sqlite3WalDb(Wal *pWal, sqlite3 *db); #endif +#ifdef SQLITE_USE_SEH +SQLITE_PRIVATE int sqlite3WalSystemErrno(Wal*); +#endif + #endif /* ifndef SQLITE_OMIT_WAL */ #endif /* SQLITE_WAL_H */ @@ -55789,7 +57508,7 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** outstanding transactions have been abandoned, the pager is able to ** transition back to OPEN state, discarding the contents of the ** page-cache and any other in-memory state at the same time. Everything -** is reloaded from disk (and, if necessary, hot-journal rollback peformed) +** is reloaded from disk (and, if necessary, hot-journal rollback performed) ** when a read-transaction is next opened on the pager (transitioning ** the pager into READER state). At that point the system has recovered ** from the error. @@ -56176,7 +57895,7 @@ struct Pager { char *zJournal; /* Name of the journal file */ int (*xBusyHandler)(void*); /* Function to call when busy */ void *pBusyHandlerArg; /* Context argument for xBusyHandler */ - int aStat[4]; /* Total cache hits, misses, writes, spills */ + u32 aStat[4]; /* Total cache hits, misses, writes, spills */ #ifdef SQLITE_TEST int nRead; /* Database pages read */ #endif @@ -56296,19 +58015,26 @@ static const unsigned char aJournalMagic[] = { ** Return true if page pgno can be read directly from the database file ** by the b-tree layer. This is the case if: ** -** * the database file is open, -** * there are no dirty pages in the cache, and -** * the desired page is not currently in the wal file. +** (1) the database file is open +** (2) the VFS for the database is able to do unaligned sub-page reads +** (3) there are no dirty pages in the cache, and +** (4) the desired page is not currently in the wal file. */ SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ - if( pPager->fd->pMethods==0 ) return 0; - if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; + assert( pPager!=0 ); + assert( pPager->fd!=0 ); + if( pPager->fd->pMethods==0 ) return 0; /* Case (1) */ + assert( pPager->fd->pMethods->xDeviceCharacteristics!=0 ); + if( (pPager->fd->pMethods->xDeviceCharacteristics(pPager->fd) + & SQLITE_IOCAP_SUBPAGE_READ)==0 ){ + return 0; /* Case (2) */ + } + if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; /* Failed (3) */ #ifndef SQLITE_OMIT_WAL if( pPager->pWal ){ u32 iRead = 0; - int rc; - rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iRead); - return (rc==SQLITE_OK && iRead==0); + (void)sqlite3WalFindFrame(pPager->pWal, pgno, &iRead); + return iRead==0; /* Condition (4) */ } #endif return 1; @@ -56980,9 +58706,32 @@ static int writeJournalHdr(Pager *pPager){ memset(zHeader, 0, sizeof(aJournalMagic)+4); } + + /* The random check-hash initializer */ - sqlite3_randomness(sizeof(pPager->cksumInit), &pPager->cksumInit); + if( pPager->journalMode!=PAGER_JOURNALMODE_MEMORY ){ + sqlite3_randomness(sizeof(pPager->cksumInit), &pPager->cksumInit); + } +#ifdef SQLITE_DEBUG + else{ + /* The Pager.cksumInit variable is usually randomized above to protect + ** against there being existing records in the journal file. This is + ** dangerous, as following a crash they may be mistaken for records + ** written by the current transaction and rolled back into the database + ** file, causing corruption. The following assert statements verify + ** that this is not required in "journal_mode=memory" mode, as in that + ** case the journal file is always 0 bytes in size at this point. + ** It is advantageous to avoid the sqlite3_randomness() call if possible + ** as it takes the global PRNG mutex. */ + i64 sz = 0; + sqlite3OsFileSize(pPager->jfd, &sz); + assert( sz==0 ); + assert( pPager->journalOff==journalHdrOffset(pPager) ); + assert( sqlite3JournalIsInMemory(pPager->jfd) ); + } +#endif put32bits(&zHeader[sizeof(aJournalMagic)+4], pPager->cksumInit); + /* The initial database size */ put32bits(&zHeader[sizeof(aJournalMagic)+8], pPager->dbOrigSize); /* The assumed sector size for this process */ @@ -57162,7 +58911,7 @@ static int readJournalHdr( ** + 4 bytes: super-journal name checksum. ** + 8 bytes: aJournalMagic[]. ** -** The super-journal page checksum is the sum of the bytes in thesuper-journal +** The super-journal page checksum is the sum of the bytes in the super-journal ** name, where each byte is interpreted as a signed 8-bit integer. ** ** If zSuper is a NULL pointer (occurs for a single database transaction), @@ -57215,7 +58964,7 @@ static int writeSuperJournal(Pager *pPager, const char *zSuper){ } pPager->journalOff += (nSuper+20); - /* If the pager is in peristent-journal mode, then the physical + /* If the pager is in persistent-journal mode, then the physical ** journal-file may extend past the end of the super-journal name ** and 8 bytes of magic data just written to the file. This is ** dangerous because the code to rollback a hot-journal file @@ -57385,7 +59134,7 @@ static void pager_unlock(Pager *pPager){ /* ** This function is called whenever an IOERR or FULL error that requires -** the pager to transition into the ERROR state may ahve occurred. +** the pager to transition into the ERROR state may have occurred. ** The first argument is a pointer to the pager structure, the second ** the error-code about to be returned by a pager API function. The ** value returned is a copy of the second argument to this function. @@ -57626,6 +59375,9 @@ static int pager_end_transaction(Pager *pPager, int hasSuper, int bCommit){ return (rc==SQLITE_OK?rc2:rc); } +/* Forward reference */ +static int pager_playback(Pager *pPager, int isHot); + /* ** Execute a rollback if a transaction is active and unlock the ** database file. @@ -57654,13 +59406,28 @@ static void pagerUnlockAndRollback(Pager *pPager){ assert( pPager->eState==PAGER_READER ); pager_end_transaction(pPager, 0, 0); } + }else if( pPager->eState==PAGER_ERROR + && pPager->journalMode==PAGER_JOURNALMODE_MEMORY + && isOpen(pPager->jfd) + ){ + /* Special case for a ROLLBACK due to I/O error with an in-memory + ** journal: We have to rollback immediately, before the journal is + ** closed, because once it is closed, all content is forgotten. */ + int errCode = pPager->errCode; + u8 eLock = pPager->eLock; + pPager->eState = PAGER_OPEN; + pPager->errCode = SQLITE_OK; + pPager->eLock = EXCLUSIVE_LOCK; + pager_playback(pPager, 1); + pPager->errCode = errCode; + pPager->eLock = eLock; } pager_unlock(pPager); } /* ** Parameter aData must point to a buffer of pPager->pageSize bytes -** of data. Compute and return a checksum based ont the contents of the +** of data. Compute and return a checksum based on the contents of the ** page of data and the current value of pPager->cksumInit. ** ** This is not a real checksum. It is really just the sum of the @@ -58093,6 +59860,8 @@ static int pager_truncate(Pager *pPager, Pgno nPage){ int rc = SQLITE_OK; assert( pPager->eState!=PAGER_ERROR ); assert( pPager->eState!=PAGER_READER ); + PAGERTRACE(("Truncate %d npage %u\n", PAGERID(pPager), nPage)); + if( isOpen(pPager->fd) && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN) @@ -58624,7 +60393,7 @@ static int pagerWalFrames( assert( pPager->pWal ); assert( pList ); #ifdef SQLITE_DEBUG - /* Verify that the page list is in accending order */ + /* Verify that the page list is in ascending order */ for(p=pList; p && p->pDirty; p=p->pDirty){ assert( p->pgno < p->pDirty->pgno ); } @@ -58755,7 +60524,7 @@ static int pagerPagecount(Pager *pPager, Pgno *pnPage){ #ifndef SQLITE_OMIT_WAL /* ** Check if the *-wal file that corresponds to the database opened by pPager -** exists if the database is not empy, or verify that the *-wal file does +** exists if the database is not empty, or verify that the *-wal file does ** not exist (by deleting it) if the database file is empty. ** ** If the database is not empty and the *-wal file exists, open the pager @@ -59510,6 +61279,7 @@ static int pagerAcquireMapPage( return SQLITE_NOMEM_BKPT; } p->pExtra = (void *)&p[1]; + assert( EIGHT_BYTE_ALIGNMENT( p->pExtra ) ); p->flags = PGHDR_MMAP; p->nRef = 1; p->pPager = pPager; @@ -60165,11 +61935,7 @@ SQLITE_PRIVATE int sqlite3PagerOpen( int rc = SQLITE_OK; /* Return code */ int tempFile = 0; /* True for temp files (incl. in-memory files) */ int memDb = 0; /* True if this is an in-memory file */ -#ifndef SQLITE_OMIT_DESERIALIZE int memJM = 0; /* Memory journal mode */ -#else -# define memJM 0 -#endif int readOnly = 0; /* True if this is a read-only file */ int journalFileSize; /* Bytes to allocate for each journal fd */ char *zPathname = 0; /* Full path to database file */ @@ -60288,12 +62054,13 @@ SQLITE_PRIVATE int sqlite3PagerOpen( ** specific formatting and order of the various filenames, so if the format ** changes here, be sure to change it there as well. */ + assert( SQLITE_PTRSIZE==sizeof(Pager*) ); pPtr = (u8 *)sqlite3MallocZero( ROUND8(sizeof(*pPager)) + /* Pager structure */ ROUND8(pcacheSize) + /* PCache object */ ROUND8(pVfs->szOsFile) + /* The main db file */ journalFileSize * 2 + /* The two journal files */ - sizeof(pPager) + /* Space to hold a pointer */ + SQLITE_PTRSIZE + /* Space to hold a pointer */ 4 + /* Database prefix */ nPathname + 1 + /* database filename */ nUriByte + /* query parameters */ @@ -60314,7 +62081,7 @@ SQLITE_PRIVATE int sqlite3PagerOpen( pPager->sjfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; pPager->jfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; assert( EIGHT_BYTE_ALIGNMENT(pPager->jfd) ); - memcpy(pPtr, &pPager, sizeof(pPager)); pPtr += sizeof(pPager); + memcpy(pPtr, &pPager, SQLITE_PTRSIZE); pPtr += SQLITE_PTRSIZE; /* Fill in the Pager.zFilename and pPager.zQueryParam fields */ pPtr += 4; /* Skip zero prefix */ @@ -60368,9 +62135,7 @@ SQLITE_PRIVATE int sqlite3PagerOpen( int fout = 0; /* VFS flags returned by xOpen() */ rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, vfsFlags, &fout); assert( !memDb ); -#ifndef SQLITE_OMIT_DESERIALIZE pPager->memVfs = memJM = (fout&SQLITE_OPEN_MEMORY)!=0; -#endif readOnly = (fout&SQLITE_OPEN_READONLY)!=0; /* If the file was successfully opened for read/write access, @@ -60507,15 +62272,18 @@ SQLITE_PRIVATE int sqlite3PagerOpen( /* ** Return the sqlite3_file for the main database given the name -** of the corresonding WAL or Journal name as passed into +** of the corresponding WAL or Journal name as passed into ** xOpen. */ SQLITE_API sqlite3_file *sqlite3_database_file_object(const char *zName){ Pager *pPager; + const char *p; while( zName[-1]!=0 || zName[-2]!=0 || zName[-3]!=0 || zName[-4]!=0 ){ zName--; } - pPager = *(Pager**)(zName - 4 - sizeof(Pager*)); + p = zName - 4 - sizeof(Pager*); + assert( EIGHT_BYTE_ALIGNMENT(p) ); + pPager = *(Pager**)p; return pPager->fd; } @@ -61010,6 +62778,10 @@ static int getPageNormal( if( !isOpen(pPager->fd) || pPager->dbSizepPager->mxPgno ){ rc = SQLITE_FULL; + if( pgno<=pPager->dbSize ){ + sqlite3PcacheRelease(pPg); + pPg = 0; + } goto pager_acquire_err; } if( noContent ){ @@ -61145,8 +62917,20 @@ SQLITE_PRIVATE int sqlite3PagerGet( DbPage **ppPage, /* Write a pointer to the page here */ int flags /* PAGER_GET_XXX flags */ ){ - /* printf("PAGE %u\n", pgno); fflush(stdout); */ +#if 0 /* Trace page fetch by setting to 1 */ + int rc; + printf("PAGE %u\n", pgno); + fflush(stdout); + rc = pPager->xGet(pPager, pgno, ppPage, flags); + if( rc ){ + printf("PAGE %u failed with 0x%02x\n", pgno, rc); + fflush(stdout); + } + return rc; +#else + /* Normal, high-speed version of sqlite3PagerGet() */ return pPager->xGet(pPager, pgno, ppPage, flags); +#endif } /* @@ -61174,10 +62958,12 @@ SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){ /* ** Release a page reference. ** -** The sqlite3PagerUnref() and sqlite3PagerUnrefNotNull() may only be -** used if we know that the page being released is not the last page. +** The sqlite3PagerUnref() and sqlite3PagerUnrefNotNull() may only be used +** if we know that the page being released is not the last reference to page1. ** The btree layer always holds page1 open until the end, so these first -** to routines can be used to release any page other than BtShared.pPage1. +** two routines can be used to release any page other than BtShared.pPage1. +** The assert() at tag-20230419-2 proves that this constraint is always +** honored. ** ** Use sqlite3PagerUnrefPageOne() to release page1. This latter routine ** checks the total number of outstanding pages and if the number of @@ -61193,7 +62979,7 @@ SQLITE_PRIVATE void sqlite3PagerUnrefNotNull(DbPage *pPg){ sqlite3PcacheRelease(pPg); } /* Do not use this routine to release the last reference to page1 */ - assert( sqlite3PcacheRefCount(pPager->pPCache)>0 ); + assert( sqlite3PcacheRefCount(pPager->pPCache)>0 ); /* tag-20230419-2 */ } SQLITE_PRIVATE void sqlite3PagerUnref(DbPage *pPg){ if( pPg ) sqlite3PagerUnrefNotNull(pPg); @@ -62020,6 +63806,13 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( rc = sqlite3OsFileControl(fd, SQLITE_FCNTL_BEGIN_ATOMIC_WRITE, 0); if( rc==SQLITE_OK ){ rc = pager_write_pagelist(pPager, pList); + if( rc==SQLITE_OK && pPager->dbSize>pPager->dbFileSize ){ + char *pTmp = pPager->pTmpSpace; + int szPage = (int)pPager->pageSize; + memset(pTmp, 0, szPage); + rc = sqlite3OsWrite(pPager->fd, pTmp, szPage, + ((i64)pPager->dbSize*pPager->pageSize)-szPage); + } if( rc==SQLITE_OK ){ rc = sqlite3OsFileControl(fd, SQLITE_FCNTL_COMMIT_ATOMIC_WRITE, 0); } @@ -62254,11 +64047,11 @@ SQLITE_PRIVATE int *sqlite3PagerStats(Pager *pPager){ a[3] = pPager->eState==PAGER_OPEN ? -1 : (int) pPager->dbSize; a[4] = pPager->eState; a[5] = pPager->errCode; - a[6] = pPager->aStat[PAGER_STAT_HIT]; - a[7] = pPager->aStat[PAGER_STAT_MISS]; + a[6] = (int)pPager->aStat[PAGER_STAT_HIT] & 0x7fffffff; + a[7] = (int)pPager->aStat[PAGER_STAT_MISS] & 0x7fffffff; a[8] = 0; /* Used to be pPager->nOvfl */ a[9] = pPager->nRead; - a[10] = pPager->aStat[PAGER_STAT_WRITE]; + a[10] = (int)pPager->aStat[PAGER_STAT_WRITE] & 0x7fffffff; return a; } #endif @@ -62274,7 +64067,7 @@ SQLITE_PRIVATE int *sqlite3PagerStats(Pager *pPager){ ** reset parameter is non-zero, the cache hit or miss count is zeroed before ** returning. */ -SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *pPager, int eStat, int reset, int *pnVal){ +SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *pPager, int eStat, int reset, u64 *pnVal){ assert( eStat==SQLITE_DBSTATUS_CACHE_HIT || eStat==SQLITE_DBSTATUS_CACHE_MISS @@ -62510,7 +64303,7 @@ SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager *pPager){ ** This will be either the rollback journal or the WAL file. */ SQLITE_PRIVATE sqlite3_file *sqlite3PagerJrnlFile(Pager *pPager){ -#if SQLITE_OMIT_WAL +#ifdef SQLITE_OMIT_WAL return pPager->jfd; #else return pPager->pWal ? sqlite3WalFile(pPager->pWal) : pPager->jfd; @@ -62786,7 +64579,7 @@ SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){ assert( pPager->eState!=PAGER_ERROR ); pPager->journalMode = (u8)eMode; - /* When transistioning from TRUNCATE or PERSIST to any other journal + /* When transitioning from TRUNCATE or PERSIST to any other journal ** mode except WAL, unless the pager is in locking_mode=exclusive mode, ** delete the journal file. */ @@ -62831,7 +64624,7 @@ SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){ } assert( state==pPager->eState ); } - }else if( eMode==PAGER_JOURNALMODE_OFF ){ + }else if( eMode==PAGER_JOURNALMODE_OFF || eMode==PAGER_JOURNALMODE_MEMORY ){ sqlite3OsClose(pPager->jfd); } } @@ -62953,13 +64746,15 @@ SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager){ */ static int pagerExclusiveLock(Pager *pPager){ int rc; /* Return code */ + u8 eOrigLock; /* Original lock */ - assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK ); + assert( pPager->eLock>=SHARED_LOCK ); + eOrigLock = pPager->eLock; rc = pagerLockDb(pPager, EXCLUSIVE_LOCK); if( rc!=SQLITE_OK ){ /* If the attempt to grab the exclusive lock failed, release the ** pending lock that may have been obtained instead. */ - pagerUnlockDb(pPager, SHARED_LOCK); + pagerUnlockDb(pPager, eOrigLock); } return rc; @@ -63212,6 +65007,12 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ } #endif +#if defined(SQLITE_USE_SEH) && !defined(SQLITE_OMIT_WAL) +SQLITE_PRIVATE int sqlite3PagerWalSystemErrno(Pager *pPager){ + return sqlite3WalSystemErrno(pPager->pWal); +} +#endif + #endif /* SQLITE_OMIT_DISKIO */ /************** End of pager.c ***********************************************/ @@ -63262,7 +65063,7 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ ** 28: Checksum-2 (second part of checksum for first 24 bytes of header). ** ** Immediately following the wal-header are zero or more frames. Each -** frame consists of a 24-byte frame-header followed by a bytes +** frame consists of a 24-byte frame-header followed by bytes ** of page data. The frame-header is six big-endian 32-bit unsigned ** integer values, as follows: ** @@ -63502,7 +65303,7 @@ SQLITE_PRIVATE int sqlite3WalTrace = 0; ** ** Technically, the various VFSes are free to implement these locks however ** they see fit. However, compatibility is encouraged so that VFSes can -** interoperate. The standard implemention used on both unix and windows +** interoperate. The standard implementation used on both unix and windows ** is for the index number to indicate a byte offset into the ** WalCkptInfo.aLock[] array in the wal-index header. In other words, all ** locks are on the shm file. The WALINDEX_LOCK_OFFSET constant (which @@ -63578,7 +65379,7 @@ struct WalIndexHdr { ** the mxFrame for that reader. The value READMARK_NOT_USED (0xffffffff) ** for any aReadMark[] means that entry is unused. aReadMark[0] is ** a special case; its value is never used and it exists as a place-holder -** to avoid having to offset aReadMark[] indexs by one. Readers holding +** to avoid having to offset aReadMark[] indexes by one. Readers holding ** WAL_READ_LOCK(0) always ignore the entire WAL and read all content ** directly from the database. ** @@ -63746,11 +65547,20 @@ struct Wal { u32 iReCksum; /* On commit, recalculate checksums from here */ const char *zWalName; /* Name of WAL file */ u32 nCkpt; /* Checkpoint sequence counter in the wal-header */ +#ifdef SQLITE_USE_SEH + u32 lockMask; /* Mask of locks held */ + void *pFree; /* Pointer to sqlite3_free() if exception thrown */ + u32 *pWiValue; /* Value to write into apWiData[iWiPg] */ + int iWiPg; /* Write pWiValue into apWiData[iWiPg] */ + int iSysErrno; /* System error code following exception */ +#endif #ifdef SQLITE_DEBUG + int nSehTry; /* Number of nested SEH_TRY{} blocks */ u8 lockError; /* True if a locking error has occurred */ #endif #ifdef SQLITE_ENABLE_SNAPSHOT WalIndexHdr *pSnapshot; /* Start transaction here if not NULL */ + int bGetSnapshot; /* Transaction opened for sqlite3_get_snapshot() */ #endif #ifdef SQLITE_ENABLE_SETLK_TIMEOUT sqlite3 *db; @@ -63828,6 +65638,113 @@ struct WalIterator { sizeof(ht_slot)*HASHTABLE_NSLOT + HASHTABLE_NPAGE*sizeof(u32) \ ) +/* +** Structured Exception Handling (SEH) is a Windows-specific technique +** for catching exceptions raised while accessing memory-mapped files. +** +** The -DSQLITE_USE_SEH compile-time option means to use SEH to catch and +** deal with system-level errors that arise during WAL -shm file processing. +** Without this compile-time option, any system-level faults that appear +** while accessing the memory-mapped -shm file will cause a process-wide +** signal to be deliver, which will more than likely cause the entire +** process to exit. +*/ +#ifdef SQLITE_USE_SEH +#include + +/* Beginning of a block of code in which an exception might occur */ +# define SEH_TRY __try { \ + assert( walAssertLockmask(pWal) && pWal->nSehTry==0 ); \ + VVA_ONLY(pWal->nSehTry++); + +/* The end of a block of code in which an exception might occur */ +# define SEH_EXCEPT(X) \ + VVA_ONLY(pWal->nSehTry--); \ + assert( pWal->nSehTry==0 ); \ + } __except( sehExceptionFilter(pWal, GetExceptionCode(), GetExceptionInformation() ) ){ X } + +/* Simulate a memory-mapping fault in the -shm file for testing purposes */ +# define SEH_INJECT_FAULT sehInjectFault(pWal) + +/* +** The second argument is the return value of GetExceptionCode() for the +** current exception. Return EXCEPTION_EXECUTE_HANDLER if the exception code +** indicates that the exception may have been caused by accessing the *-shm +** file mapping. Or EXCEPTION_CONTINUE_SEARCH otherwise. +*/ +static int sehExceptionFilter(Wal *pWal, int eCode, EXCEPTION_POINTERS *p){ + VVA_ONLY(pWal->nSehTry--); + if( eCode==EXCEPTION_IN_PAGE_ERROR ){ + if( p && p->ExceptionRecord && p->ExceptionRecord->NumberParameters>=3 ){ + /* From MSDN: For this type of exception, the first element of the + ** ExceptionInformation[] array is a read-write flag - 0 if the exception + ** was thrown while reading, 1 if while writing. The second element is + ** the virtual address being accessed. The "third array element specifies + ** the underlying NTSTATUS code that resulted in the exception". */ + pWal->iSysErrno = (int)p->ExceptionRecord->ExceptionInformation[2]; + } + return EXCEPTION_EXECUTE_HANDLER; + } + return EXCEPTION_CONTINUE_SEARCH; +} + +/* +** If one is configured, invoke the xTestCallback callback with 650 as +** the argument. If it returns true, throw the same exception that is +** thrown by the system if the *-shm file mapping is accessed after it +** has been invalidated. +*/ +static void sehInjectFault(Wal *pWal){ + int res; + assert( pWal->nSehTry>0 ); + + res = sqlite3FaultSim(650); + if( res!=0 ){ + ULONG_PTR aArg[3]; + aArg[0] = 0; + aArg[1] = 0; + aArg[2] = (ULONG_PTR)res; + RaiseException(EXCEPTION_IN_PAGE_ERROR, 0, 3, (const ULONG_PTR*)aArg); + } +} + +/* +** There are two ways to use this macro. To set a pointer to be freed +** if an exception is thrown: +** +** SEH_FREE_ON_ERROR(0, pPtr); +** +** and to cancel the same: +** +** SEH_FREE_ON_ERROR(pPtr, 0); +** +** In the first case, there must not already be a pointer registered to +** be freed. In the second case, pPtr must be the registered pointer. +*/ +#define SEH_FREE_ON_ERROR(X,Y) \ + assert( (X==0 || Y==0) && pWal->pFree==X ); pWal->pFree = Y + +/* +** There are two ways to use this macro. To arrange for pWal->apWiData[iPg] +** to be set to pValue if an exception is thrown: +** +** SEH_SET_ON_ERROR(iPg, pValue); +** +** and to cancel the same: +** +** SEH_SET_ON_ERROR(0, 0); +*/ +#define SEH_SET_ON_ERROR(X,Y) pWal->iWiPg = X; pWal->pWiValue = Y + +#else +# define SEH_TRY VVA_ONLY(pWal->nSehTry++); +# define SEH_EXCEPT(X) VVA_ONLY(pWal->nSehTry--); assert( pWal->nSehTry==0 ); +# define SEH_INJECT_FAULT assert( pWal->nSehTry>0 ); +# define SEH_FREE_ON_ERROR(X,Y) +# define SEH_SET_ON_ERROR(X,Y) +#endif /* ifdef SQLITE_USE_SEH */ + + /* ** Obtain a pointer to the iPage'th page of the wal-index. The wal-index ** is broken into pages of WALINDEX_PGSZ bytes. Wal-index pages are @@ -63900,6 +65817,7 @@ static int walIndexPage( int iPage, /* The page we seek */ volatile u32 **ppPage /* Write the page pointer here */ ){ + SEH_INJECT_FAULT; if( pWal->nWiData<=iPage || (*ppPage = pWal->apWiData[iPage])==0 ){ return walIndexPageRealloc(pWal, iPage, ppPage); } @@ -63911,6 +65829,7 @@ static int walIndexPage( */ static volatile WalCkptInfo *walCkptInfo(Wal *pWal){ assert( pWal->nWiData>0 && pWal->apWiData[0] ); + SEH_INJECT_FAULT; return (volatile WalCkptInfo*)&(pWal->apWiData[0][sizeof(WalIndexHdr)/2]); } @@ -63919,6 +65838,7 @@ static volatile WalCkptInfo *walCkptInfo(Wal *pWal){ */ static volatile WalIndexHdr *walIndexHdr(Wal *pWal){ assert( pWal->nWiData>0 && pWal->apWiData[0] ); + SEH_INJECT_FAULT; return (volatile WalIndexHdr*)pWal->apWiData[0]; } @@ -63964,19 +65884,40 @@ static void walChecksumBytes( assert( nByte>=8 ); assert( (nByte&0x00000007)==0 ); assert( nByte<=65536 ); + assert( nByte%4==0 ); - if( nativeCksum ){ + if( !nativeCksum ){ + do { + s1 += BYTESWAP32(aData[0]) + s2; + s2 += BYTESWAP32(aData[1]) + s1; + aData += 2; + }while( aDatalockError = (u8)(rc!=SQLITE_OK && (rc&0xFF)!=SQLITE_BUSY); ) +#ifdef SQLITE_USE_SEH + if( rc==SQLITE_OK ) pWal->lockMask |= (1 << lockIdx); +#endif return rc; } static void walUnlockShared(Wal *pWal, int lockIdx){ if( pWal->exclusiveMode ) return; (void)sqlite3OsShmLock(pWal->pDbFd, lockIdx, 1, SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED); +#ifdef SQLITE_USE_SEH + pWal->lockMask &= ~(1 << lockIdx); +#endif WALTRACE(("WAL%p: release SHARED-%s\n", pWal, walLockName(lockIdx))); } static int walLockExclusive(Wal *pWal, int lockIdx, int n){ @@ -64171,12 +66118,20 @@ static int walLockExclusive(Wal *pWal, int lockIdx, int n){ WALTRACE(("WAL%p: acquire EXCLUSIVE-%s cnt=%d %s\n", pWal, walLockName(lockIdx), n, rc ? "failed" : "ok")); VVA_ONLY( pWal->lockError = (u8)(rc!=SQLITE_OK && (rc&0xFF)!=SQLITE_BUSY); ) +#ifdef SQLITE_USE_SEH + if( rc==SQLITE_OK ){ + pWal->lockMask |= (((1<exclusiveMode ) return; (void)sqlite3OsShmLock(pWal->pDbFd, lockIdx, n, SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE); +#ifdef SQLITE_USE_SEH + pWal->lockMask &= ~(((1<apWiData[0][WALINDEX_HDR_SIZE/sizeof(u32) + iFrame - 1]; } @@ -64527,6 +66483,7 @@ static int walIndexRecover(Wal *pWal){ /* Malloc a buffer to read frames into. */ szFrame = szPage + WAL_FRAME_HDRSIZE; aFrame = (u8 *)sqlite3_malloc64(szFrame + WALINDEX_PGSZ); + SEH_FREE_ON_ERROR(0, aFrame); if( !aFrame ){ rc = SQLITE_NOMEM_BKPT; goto recovery_error; @@ -64545,6 +66502,7 @@ static int walIndexRecover(Wal *pWal){ rc = walIndexPage(pWal, iPg, (volatile u32**)&aShare); assert( aShare!=0 || rc!=SQLITE_OK ); if( aShare==0 ) break; + SEH_SET_ON_ERROR(iPg, aShare); pWal->apWiData[iPg] = aPrivate; for(iFrame=iFirst; iFrame<=iLast; iFrame++){ @@ -64572,6 +66530,7 @@ static int walIndexRecover(Wal *pWal){ } } pWal->apWiData[iPg] = aShare; + SEH_SET_ON_ERROR(0,0); nHdr = (iPg==0 ? WALINDEX_HDR_SIZE : 0); nHdr32 = nHdr / sizeof(u32); #ifndef SQLITE_SAFER_WALINDEX_RECOVERY @@ -64602,9 +66561,11 @@ static int walIndexRecover(Wal *pWal){ } } #endif + SEH_INJECT_FAULT; if( iFrame<=iLast ) break; } + SEH_FREE_ON_ERROR(aFrame, 0); sqlite3_free(aFrame); } @@ -64632,6 +66593,7 @@ static int walIndexRecover(Wal *pWal){ }else{ pInfo->aReadMark[i] = READMARK_NOT_USED; } + SEH_INJECT_FAULT; walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); }else if( rc!=SQLITE_BUSY ){ goto recovery_error; @@ -64789,7 +66751,7 @@ SQLITE_PRIVATE int sqlite3WalOpen( } /* -** Change the size to which the WAL file is trucated on each reset. +** Change the size to which the WAL file is truncated on each reset. */ SQLITE_PRIVATE void sqlite3WalLimit(Wal *pWal, i64 iLimit){ if( pWal ) pWal->mxWalSize = iLimit; @@ -65015,23 +66977,16 @@ static int walIteratorInit(Wal *pWal, u32 nBackfill, WalIterator **pp){ nByte = sizeof(WalIterator) + (nSegment-1)*sizeof(struct WalSegment) + iLast*sizeof(ht_slot); - p = (WalIterator *)sqlite3_malloc64(nByte); + p = (WalIterator *)sqlite3_malloc64(nByte + + sizeof(ht_slot) * (iLast>HASHTABLE_NPAGE?HASHTABLE_NPAGE:iLast) + ); if( !p ){ return SQLITE_NOMEM_BKPT; } memset(p, 0, nByte); p->nSegment = nSegment; - - /* Allocate temporary space used by the merge-sort routine. This block - ** of memory will be freed before this function returns. - */ - aTmp = (ht_slot *)sqlite3_malloc64( - sizeof(ht_slot) * (iLast>HASHTABLE_NPAGE?HASHTABLE_NPAGE:iLast) - ); - if( !aTmp ){ - rc = SQLITE_NOMEM_BKPT; - } - + aTmp = (ht_slot*)&(((u8*)p)[nByte]); + SEH_FREE_ON_ERROR(0, p); for(i=walFramePage(nBackfill+1); rc==SQLITE_OK && iaSegment[i].aPgno = (u32 *)sLoc.aPgno; } } - sqlite3_free(aTmp); - if( rc!=SQLITE_OK ){ + SEH_FREE_ON_ERROR(p, 0); walIteratorFree(p); p = 0; } @@ -65070,6 +67024,19 @@ static int walIteratorInit(Wal *pWal, u32 nBackfill, WalIterator **pp){ } #ifdef SQLITE_ENABLE_SETLK_TIMEOUT + + +/* +** Attempt to enable blocking locks that block for nMs ms. Return 1 if +** blocking locks are successfully enabled, or 0 otherwise. +*/ +static int walEnableBlockingMs(Wal *pWal, int nMs){ + int rc = sqlite3OsFileControl( + pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&nMs + ); + return (rc==SQLITE_OK); +} + /* ** Attempt to enable blocking locks. Blocking locks are enabled only if (a) ** they are supported by the VFS, and (b) the database handle is configured @@ -65081,11 +67048,7 @@ static int walEnableBlocking(Wal *pWal){ if( pWal->db ){ int tmout = pWal->db->busyTimeout; if( tmout ){ - int rc; - rc = sqlite3OsFileControl( - pWal->pDbFd, SQLITE_FCNTL_LOCK_TIMEOUT, (void*)&tmout - ); - res = (rc==SQLITE_OK); + res = walEnableBlockingMs(pWal, tmout); } } return res; @@ -65134,20 +67097,10 @@ SQLITE_PRIVATE void sqlite3WalDb(Wal *pWal, sqlite3 *db){ pWal->db = db; } -/* -** Take an exclusive WRITE lock. Blocking if so configured. -*/ -static int walLockWriter(Wal *pWal){ - int rc; - walEnableBlocking(pWal); - rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1); - walDisableBlocking(pWal); - return rc; -} #else # define walEnableBlocking(x) 0 # define walDisableBlocking(x) -# define walLockWriter(pWal) walLockExclusive((pWal), WAL_WRITE_LOCK, 1) +# define walEnableBlockingMs(pWal, ms) 0 # define sqlite3WalDb(pWal, db) #endif /* ifdef SQLITE_ENABLE_SETLK_TIMEOUT */ @@ -65287,13 +67240,13 @@ static int walCheckpoint( mxSafeFrame = pWal->hdr.mxFrame; mxPage = pWal->hdr.nPage; for(i=1; iaReadMark+i); + u32 y = AtomicLoad(pInfo->aReadMark+i); SEH_INJECT_FAULT; if( mxSafeFrame>y ){ assert( y<=pWal->hdr.mxFrame ); rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(i), 1); if( rc==SQLITE_OK ){ u32 iMark = (i==1 ? mxSafeFrame : READMARK_NOT_USED); - AtomicStore(pInfo->aReadMark+i, iMark); + AtomicStore(pInfo->aReadMark+i, iMark); SEH_INJECT_FAULT; walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); }else if( rc==SQLITE_BUSY ){ mxSafeFrame = y; @@ -65314,8 +67267,7 @@ static int walCheckpoint( && (rc = walBusyLock(pWal,xBusy,pBusyArg,WAL_READ_LOCK(0),1))==SQLITE_OK ){ u32 nBackfill = pInfo->nBackfill; - - pInfo->nBackfillAttempted = mxSafeFrame; + pInfo->nBackfillAttempted = mxSafeFrame; SEH_INJECT_FAULT; /* Sync the WAL to disk */ rc = sqlite3OsSync(pWal->pWalFd, CKPT_SYNC_FLAGS(sync_flags)); @@ -65346,6 +67298,7 @@ static int walCheckpoint( while( rc==SQLITE_OK && 0==walIteratorNext(pIter, &iDbpage, &iFrame) ){ i64 iOffset; assert( walFramePgno(pWal, iFrame)==iDbpage ); + SEH_INJECT_FAULT; if( AtomicLoad(&db->u1.isInterrupted) ){ rc = db->mallocFailed ? SQLITE_NOMEM_BKPT : SQLITE_INTERRUPT; break; @@ -65375,7 +67328,7 @@ static int walCheckpoint( } } if( rc==SQLITE_OK ){ - AtomicStore(&pInfo->nBackfill, mxSafeFrame); + AtomicStore(&pInfo->nBackfill, mxSafeFrame); SEH_INJECT_FAULT; } } @@ -65397,6 +67350,7 @@ static int walCheckpoint( */ if( rc==SQLITE_OK && eMode!=SQLITE_CHECKPOINT_PASSIVE ){ assert( pWal->writeLock ); + SEH_INJECT_FAULT; if( pInfo->nBackfillhdr.mxFrame ){ rc = SQLITE_BUSY; }else if( eMode>=SQLITE_CHECKPOINT_RESTART ){ @@ -65428,6 +67382,7 @@ static int walCheckpoint( } walcheckpoint_out: + SEH_FREE_ON_ERROR(pIter, 0); walIteratorFree(pIter); return rc; } @@ -65450,6 +67405,93 @@ static void walLimitSize(Wal *pWal, i64 nMax){ } } +#ifdef SQLITE_USE_SEH +/* +** This is the "standard" exception handler used in a few places to handle +** an exception thrown by reading from the *-shm mapping after it has become +** invalid in SQLITE_USE_SEH builds. It is used as follows: +** +** SEH_TRY { ... } +** SEH_EXCEPT( rc = walHandleException(pWal); ) +** +** This function does three things: +** +** 1) Determines the locks that should be held, based on the contents of +** the Wal.readLock, Wal.writeLock and Wal.ckptLock variables. All other +** held locks are assumed to be transient locks that would have been +** released had the exception not been thrown and are dropped. +** +** 2) Frees the pointer at Wal.pFree, if any, using sqlite3_free(). +** +** 3) Set pWal->apWiData[pWal->iWiPg] to pWal->pWiValue if not NULL +** +** 4) Returns SQLITE_IOERR. +*/ +static int walHandleException(Wal *pWal){ + if( pWal->exclusiveMode==0 ){ + static const int S = 1; + static const int E = (1<lockMask & ~( + (pWal->readLock<0 ? 0 : (S << WAL_READ_LOCK(pWal->readLock))) + | (pWal->writeLock ? (E << WAL_WRITE_LOCK) : 0) + | (pWal->ckptLock ? (E << WAL_CKPT_LOCK) : 0) + ); + for(ii=0; iipFree); + pWal->pFree = 0; + if( pWal->pWiValue ){ + pWal->apWiData[pWal->iWiPg] = pWal->pWiValue; + pWal->pWiValue = 0; + } + return SQLITE_IOERR_IN_PAGE; +} + +/* +** Assert that the Wal.lockMask mask, which indicates the locks held +** by the connection, is consistent with the Wal.readLock, Wal.writeLock +** and Wal.ckptLock variables. To be used as: +** +** assert( walAssertLockmask(pWal) ); +*/ +static int walAssertLockmask(Wal *pWal){ + if( pWal->exclusiveMode==0 ){ + static const int S = 1; + static const int E = (1<readLock<0 ? 0 : (S << WAL_READ_LOCK(pWal->readLock))) + | (pWal->writeLock ? (E << WAL_WRITE_LOCK) : 0) + | (pWal->ckptLock ? (E << WAL_CKPT_LOCK) : 0) +#ifdef SQLITE_ENABLE_SNAPSHOT + | (pWal->pSnapshot ? (pWal->lockMask & (1 << WAL_CKPT_LOCK)) : 0) +#endif + ); + assert( mExpect==pWal->lockMask ); + } + return 1; +} + +/* +** Return and zero the "system error" field set when an +** EXCEPTION_IN_PAGE_ERROR exception is caught. +*/ +SQLITE_PRIVATE int sqlite3WalSystemErrno(Wal *pWal){ + int iRet = 0; + if( pWal ){ + iRet = pWal->iSysErrno; + pWal->iSysErrno = 0; + } + return iRet; +} + +#else +# define walAssertLockmask(x) 1 +#endif /* ifdef SQLITE_USE_SEH */ + /* ** Close a connection to a log file. */ @@ -65464,6 +67506,8 @@ SQLITE_PRIVATE int sqlite3WalClose( if( pWal ){ int isDelete = 0; /* True to unlink wal and wal-index files */ + assert( walAssertLockmask(pWal) ); + /* If an EXCLUSIVE lock can be obtained on the database file (using the ** ordinary, rollback-mode locking methods, this guarantees that the ** connection associated with this log file is the only connection to @@ -65488,7 +67532,7 @@ SQLITE_PRIVATE int sqlite3WalClose( ); if( bPersist!=1 ){ /* Try to delete the WAL file if the checkpoint completed and - ** fsyned (rc==SQLITE_OK) and if we are not in persistent-wal + ** fsynced (rc==SQLITE_OK) and if we are not in persistent-wal ** mode (!bPersist) */ isDelete = 1; }else if( pWal->mxWalSize>=0 ){ @@ -65555,7 +67599,7 @@ static SQLITE_NO_TSAN int walIndexTryHdr(Wal *pWal, int *pChanged){ ** give false-positive warnings about these accesses because the tools do not ** account for the double-read and the memory barrier. The use of mutexes ** here would be problematic as the memory being accessed is potentially - ** shared among multiple processes and not all mutex implementions work + ** shared among multiple processes and not all mutex implementations work ** reliably in that environment. */ aHdr = walIndexHdr(pWal); @@ -65657,7 +67701,9 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){ } }else{ int bWriteLock = pWal->writeLock; - if( bWriteLock || SQLITE_OK==(rc = walLockWriter(pWal)) ){ + if( bWriteLock + || SQLITE_OK==(rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1)) + ){ pWal->writeLock = 1; if( SQLITE_OK==(rc = walIndexPage(pWal, 0, &page0)) ){ badHdr = walIndexTryHdr(pWal, pChanged); @@ -65665,7 +67711,8 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){ /* If the wal-index header is still malformed even while holding ** a WRITE lock, it can only mean that the header is corrupted and ** needs to be reconstructed. So run recovery to do exactly that. - */ + ** Disable blocking locks first. */ + walDisableBlocking(pWal); rc = walIndexRecover(pWal); *pChanged = 1; } @@ -65875,6 +67922,37 @@ static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ return rc; } +/* +** The final argument passed to walTryBeginRead() is of type (int*). The +** caller should invoke walTryBeginRead as follows: +** +** int cnt = 0; +** do { +** rc = walTryBeginRead(..., &cnt); +** }while( rc==WAL_RETRY ); +** +** The final value of "cnt" is of no use to the caller. It is used by +** the implementation of walTryBeginRead() as follows: +** +** + Each time walTryBeginRead() is called, it is incremented. Once +** it reaches WAL_RETRY_PROTOCOL_LIMIT - indicating that walTryBeginRead() +** has many times been invoked and failed with WAL_RETRY - walTryBeginRead() +** returns SQLITE_PROTOCOL. +** +** + If SQLITE_ENABLE_SETLK_TIMEOUT is defined and walTryBeginRead() failed +** because a blocking lock timed out (SQLITE_BUSY_TIMEOUT from the OS +** layer), the WAL_RETRY_BLOCKED_MASK bit is set in "cnt". In this case +** the next invocation of walTryBeginRead() may omit an expected call to +** sqlite3OsSleep(). There has already been a delay when the previous call +** waited on a lock. +*/ +#define WAL_RETRY_PROTOCOL_LIMIT 100 +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT +# define WAL_RETRY_BLOCKED_MASK 0x10000000 +#else +# define WAL_RETRY_BLOCKED_MASK 0 +#endif + /* ** Attempt to start a read transaction. This might fail due to a race or ** other transient condition. When that happens, it returns WAL_RETRY to @@ -65925,13 +68003,16 @@ static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ ** so it takes care to hold an exclusive lock on the corresponding ** WAL_READ_LOCK() while changing values. */ -static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ +static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int *pCnt){ volatile WalCkptInfo *pInfo; /* Checkpoint information in wal-index */ u32 mxReadMark; /* Largest aReadMark[] value */ int mxI; /* Index of largest aReadMark[] value */ int i; /* Loop counter */ int rc = SQLITE_OK; /* Return code */ u32 mxFrame; /* Wal frame to lock to */ +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + int nBlockTmout = 0; +#endif assert( pWal->readLock<0 ); /* Not currently locked */ @@ -65955,14 +68036,34 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ ** so that on the 100th (and last) RETRY we delay for 323 milliseconds. ** The total delay time before giving up is less than 10 seconds. */ - if( cnt>5 ){ + (*pCnt)++; + if( *pCnt>5 ){ int nDelay = 1; /* Pause time in microseconds */ - if( cnt>100 ){ + int cnt = (*pCnt & ~WAL_RETRY_BLOCKED_MASK); + if( cnt>WAL_RETRY_PROTOCOL_LIMIT ){ VVA_ONLY( pWal->lockError = 1; ) return SQLITE_PROTOCOL; } - if( cnt>=10 ) nDelay = (cnt-9)*(cnt-9)*39; + if( *pCnt>=10 ) nDelay = (cnt-9)*(cnt-9)*39; +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + /* In SQLITE_ENABLE_SETLK_TIMEOUT builds, configure the file-descriptor + ** to block for locks for approximately nDelay us. This affects three + ** locks: (a) the shared lock taken on the DMS slot in os_unix.c (if + ** using os_unix.c), (b) the WRITER lock taken in walIndexReadHdr() if the + ** first attempted read fails, and (c) the shared lock taken on the + ** read-mark. + ** + ** If the previous call failed due to an SQLITE_BUSY_TIMEOUT error, + ** then sleep for the minimum of 1us. The previous call already provided + ** an extra delay while it was blocking on the lock. + */ + nBlockTmout = (nDelay+998) / 1000; + if( !useWal && walEnableBlockingMs(pWal, nBlockTmout) ){ + if( *pCnt & WAL_RETRY_BLOCKED_MASK ) nDelay = 1; + } +#endif sqlite3OsSleep(pWal->pVfs, nDelay); + *pCnt &= ~WAL_RETRY_BLOCKED_MASK; } if( !useWal ){ @@ -65970,6 +68071,13 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ if( pWal->bShmUnreliable==0 ){ rc = walIndexReadHdr(pWal, pChanged); } +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + walDisableBlocking(pWal); + if( rc==SQLITE_BUSY_TIMEOUT ){ + rc = SQLITE_BUSY; + *pCnt |= WAL_RETRY_BLOCKED_MASK; + } +#endif if( rc==SQLITE_BUSY ){ /* If there is not a recovery running in another thread or process ** then convert BUSY errors to WAL_RETRY. If recovery is known to @@ -66006,9 +68114,10 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ assert( pWal->nWiData>0 ); assert( pWal->apWiData[0]!=0 ); pInfo = walCkptInfo(pWal); + SEH_INJECT_FAULT; if( !useWal && AtomicLoad(&pInfo->nBackfill)==pWal->hdr.mxFrame #ifdef SQLITE_ENABLE_SNAPSHOT - && (pWal->pSnapshot==0 || pWal->hdr.mxFrame==0) + && ((pWal->bGetSnapshot==0 && pWal->pSnapshot==0) || pWal->hdr.mxFrame==0) #endif ){ /* The WAL has been completely backfilled (or it is empty). @@ -66055,7 +68164,7 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ } #endif for(i=1; iaReadMark+i); + u32 thisMark = AtomicLoad(pInfo->aReadMark+i); SEH_INJECT_FAULT; if( mxReadMark<=thisMark && thisMark<=mxFrame ){ assert( thisMark!=READMARK_NOT_USED ); mxReadMark = thisMark; @@ -66083,9 +68192,19 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ return rc==SQLITE_BUSY ? WAL_RETRY : SQLITE_READONLY_CANTINIT; } + (void)walEnableBlockingMs(pWal, nBlockTmout); rc = walLockShared(pWal, WAL_READ_LOCK(mxI)); + walDisableBlocking(pWal); if( rc ){ - return rc==SQLITE_BUSY ? WAL_RETRY : rc; +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + if( rc==SQLITE_BUSY_TIMEOUT ){ + *pCnt |= WAL_RETRY_BLOCKED_MASK; + } +#else + assert( rc!=SQLITE_BUSY_TIMEOUT ); +#endif + assert( (rc&0xFF)!=SQLITE_BUSY||rc==SQLITE_BUSY||rc==SQLITE_BUSY_TIMEOUT ); + return (rc&0xFF)==SQLITE_BUSY ? WAL_RETRY : rc; } /* Now that the read-lock has been obtained, check that neither the ** value in the aReadMark[] array or the contents of the wal-index @@ -66121,7 +68240,7 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ ** we can guarantee that the checkpointer that set nBackfill could not ** see any pages past pWal->hdr.mxFrame, this problem does not come up. */ - pWal->minFrame = AtomicLoad(&pInfo->nBackfill)+1; + pWal->minFrame = AtomicLoad(&pInfo->nBackfill)+1; SEH_INJECT_FAULT; walShmBarrier(pWal); if( AtomicLoad(pInfo->aReadMark+mxI)!=mxReadMark || memcmp((void *)walIndexHdr(pWal), &pWal->hdr, sizeof(WalIndexHdr)) @@ -66136,6 +68255,54 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ } #ifdef SQLITE_ENABLE_SNAPSHOT +/* +** This function does the work of sqlite3WalSnapshotRecover(). +*/ +static int walSnapshotRecover( + Wal *pWal, /* WAL handle */ + void *pBuf1, /* Temp buffer pWal->szPage bytes in size */ + void *pBuf2 /* Temp buffer pWal->szPage bytes in size */ +){ + int szPage = (int)pWal->szPage; + int rc; + i64 szDb; /* Size of db file in bytes */ + + rc = sqlite3OsFileSize(pWal->pDbFd, &szDb); + if( rc==SQLITE_OK ){ + volatile WalCkptInfo *pInfo = walCkptInfo(pWal); + u32 i = pInfo->nBackfillAttempted; + for(i=pInfo->nBackfillAttempted; i>AtomicLoad(&pInfo->nBackfill); i--){ + WalHashLoc sLoc; /* Hash table location */ + u32 pgno; /* Page number in db file */ + i64 iDbOff; /* Offset of db file entry */ + i64 iWalOff; /* Offset of wal file entry */ + + rc = walHashGet(pWal, walFramePage(i), &sLoc); + if( rc!=SQLITE_OK ) break; + assert( i - sLoc.iZero - 1 >=0 ); + pgno = sLoc.aPgno[i-sLoc.iZero-1]; + iDbOff = (i64)(pgno-1) * szPage; + + if( iDbOff+szPage<=szDb ){ + iWalOff = walFrameOffset(i, szPage) + WAL_FRAME_HDRSIZE; + rc = sqlite3OsRead(pWal->pWalFd, pBuf1, szPage, iWalOff); + + if( rc==SQLITE_OK ){ + rc = sqlite3OsRead(pWal->pDbFd, pBuf2, szPage, iDbOff); + } + + if( rc!=SQLITE_OK || 0==memcmp(pBuf1, pBuf2, szPage) ){ + break; + } + } + + pInfo->nBackfillAttempted = i-1; + } + } + + return rc; +} + /* ** Attempt to reduce the value of the WalCkptInfo.nBackfillAttempted ** variable so that older snapshots can be accessed. To do this, loop @@ -66161,50 +68328,21 @@ SQLITE_PRIVATE int sqlite3WalSnapshotRecover(Wal *pWal){ assert( pWal->readLock>=0 ); rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1); if( rc==SQLITE_OK ){ - volatile WalCkptInfo *pInfo = walCkptInfo(pWal); - int szPage = (int)pWal->szPage; - i64 szDb; /* Size of db file in bytes */ - - rc = sqlite3OsFileSize(pWal->pDbFd, &szDb); - if( rc==SQLITE_OK ){ - void *pBuf1 = sqlite3_malloc(szPage); - void *pBuf2 = sqlite3_malloc(szPage); - if( pBuf1==0 || pBuf2==0 ){ - rc = SQLITE_NOMEM; - }else{ - u32 i = pInfo->nBackfillAttempted; - for(i=pInfo->nBackfillAttempted; i>AtomicLoad(&pInfo->nBackfill); i--){ - WalHashLoc sLoc; /* Hash table location */ - u32 pgno; /* Page number in db file */ - i64 iDbOff; /* Offset of db file entry */ - i64 iWalOff; /* Offset of wal file entry */ - - rc = walHashGet(pWal, walFramePage(i), &sLoc); - if( rc!=SQLITE_OK ) break; - assert( i - sLoc.iZero - 1 >=0 ); - pgno = sLoc.aPgno[i-sLoc.iZero-1]; - iDbOff = (i64)(pgno-1) * szPage; - - if( iDbOff+szPage<=szDb ){ - iWalOff = walFrameOffset(i, szPage) + WAL_FRAME_HDRSIZE; - rc = sqlite3OsRead(pWal->pWalFd, pBuf1, szPage, iWalOff); - - if( rc==SQLITE_OK ){ - rc = sqlite3OsRead(pWal->pDbFd, pBuf2, szPage, iDbOff); - } - - if( rc!=SQLITE_OK || 0==memcmp(pBuf1, pBuf2, szPage) ){ - break; - } - } - - pInfo->nBackfillAttempted = i-1; - } + void *pBuf1 = sqlite3_malloc(pWal->szPage); + void *pBuf2 = sqlite3_malloc(pWal->szPage); + if( pBuf1==0 || pBuf2==0 ){ + rc = SQLITE_NOMEM; + }else{ + pWal->ckptLock = 1; + SEH_TRY { + rc = walSnapshotRecover(pWal, pBuf1, pBuf2); } - - sqlite3_free(pBuf1); - sqlite3_free(pBuf2); + SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; ) + pWal->ckptLock = 0; } + + sqlite3_free(pBuf1); + sqlite3_free(pBuf2); walUnlockExclusive(pWal, WAL_CKPT_LOCK, 1); } @@ -66213,28 +68351,20 @@ SQLITE_PRIVATE int sqlite3WalSnapshotRecover(Wal *pWal){ #endif /* SQLITE_ENABLE_SNAPSHOT */ /* -** Begin a read transaction on the database. -** -** This routine used to be called sqlite3OpenSnapshot() and with good reason: -** it takes a snapshot of the state of the WAL and wal-index for the current -** instant in time. The current thread will continue to use this snapshot. -** Other threads might append new content to the WAL and wal-index but -** that extra content is ignored by the current thread. -** -** If the database contents have changes since the previous read -** transaction, then *pChanged is set to 1 before returning. The -** Pager layer will use this to know that its cache is stale and -** needs to be flushed. +** This function does the work of sqlite3WalBeginReadTransaction() (see +** below). That function simply calls this one inside an SEH_TRY{...} block. */ -SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ +static int walBeginReadTransaction(Wal *pWal, int *pChanged){ int rc; /* Return code */ int cnt = 0; /* Number of TryBeginRead attempts */ #ifdef SQLITE_ENABLE_SNAPSHOT + int ckptLock = 0; int bChanged = 0; WalIndexHdr *pSnapshot = pWal->pSnapshot; #endif assert( pWal->ckptLock==0 ); + assert( pWal->nSehTry>0 ); #ifdef SQLITE_ENABLE_SNAPSHOT if( pSnapshot ){ @@ -66257,12 +68387,12 @@ SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ if( rc!=SQLITE_OK ){ return rc; } - pWal->ckptLock = 1; + ckptLock = 1; } #endif do{ - rc = walTryBeginRead(pWal, pChanged, 0, ++cnt); + rc = walTryBeginRead(pWal, pChanged, 0, &cnt); }while( rc==WAL_RETRY ); testcase( (rc&0xff)==SQLITE_BUSY ); testcase( (rc&0xff)==SQLITE_IOERR ); @@ -66321,15 +68451,37 @@ SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ } /* Release the shared CKPT lock obtained above. */ - if( pWal->ckptLock ){ + if( ckptLock ){ assert( pSnapshot ); walUnlockShared(pWal, WAL_CKPT_LOCK); - pWal->ckptLock = 0; } #endif return rc; } +/* +** Begin a read transaction on the database. +** +** This routine used to be called sqlite3OpenSnapshot() and with good reason: +** it takes a snapshot of the state of the WAL and wal-index for the current +** instant in time. The current thread will continue to use this snapshot. +** Other threads might append new content to the WAL and wal-index but +** that extra content is ignored by the current thread. +** +** If the database contents have changes since the previous read +** transaction, then *pChanged is set to 1 before returning. The +** Pager layer will use this to know that its cache is stale and +** needs to be flushed. +*/ +SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ + int rc; + SEH_TRY { + rc = walBeginReadTransaction(pWal, pChanged); + } + SEH_EXCEPT( rc = walHandleException(pWal); ) + return rc; +} + /* ** Finish with a read transaction. All this does is release the ** read-lock. @@ -66350,7 +68502,7 @@ SQLITE_PRIVATE void sqlite3WalEndReadTransaction(Wal *pWal){ ** Return SQLITE_OK if successful, or an error code if an error occurs. If an ** error does occur, the final value of *piRead is undefined. */ -SQLITE_PRIVATE int sqlite3WalFindFrame( +static int walFindFrame( Wal *pWal, /* WAL handle */ Pgno pgno, /* Database page number to read data for */ u32 *piRead /* OUT: Frame number (or zero) */ @@ -66413,6 +68565,7 @@ SQLITE_PRIVATE int sqlite3WalFindFrame( } nCollide = HASHTABLE_NSLOT; iKey = walHash(pgno); + SEH_INJECT_FAULT; while( (iH = AtomicLoad(&sLoc.aHash[iKey]))!=0 ){ u32 iFrame = iH + sLoc.iZero; if( iFrame<=iLast && iFrame>=pWal->minFrame && sLoc.aPgno[iH-1]==pgno ){ @@ -66420,6 +68573,7 @@ SQLITE_PRIVATE int sqlite3WalFindFrame( iRead = iFrame; } if( (nCollide--)==0 ){ + *piRead = 0; return SQLITE_CORRUPT_BKPT; } iKey = walNextHash(iKey); @@ -66449,6 +68603,30 @@ SQLITE_PRIVATE int sqlite3WalFindFrame( return SQLITE_OK; } +/* +** Search the wal file for page pgno. If found, set *piRead to the frame that +** contains the page. Otherwise, if pgno is not in the wal file, set *piRead +** to zero. +** +** Return SQLITE_OK if successful, or an error code if an error occurs. If an +** error does occur, the final value of *piRead is undefined. +** +** The difference between this function and walFindFrame() is that this +** function wraps walFindFrame() in an SEH_TRY{...} block. +*/ +SQLITE_PRIVATE int sqlite3WalFindFrame( + Wal *pWal, /* WAL handle */ + Pgno pgno, /* Database page number to read data for */ + u32 *piRead /* OUT: Frame number (or zero) */ +){ + int rc; + SEH_TRY { + rc = walFindFrame(pWal, pgno, piRead); + } + SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; ) + return rc; +} + /* ** Read the contents of frame iRead from the wal file into buffer pOut ** (which is nOut bytes in size). Return SQLITE_OK if successful, or an @@ -66530,12 +68708,17 @@ SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal){ ** time the read transaction on this connection was started, then ** the write is disallowed. */ - if( memcmp(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr))!=0 ){ + SEH_TRY { + if( memcmp(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr))!=0 ){ + rc = SQLITE_BUSY_SNAPSHOT; + } + } + SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; ) + + if( rc!=SQLITE_OK ){ walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); pWal->writeLock = 0; - rc = SQLITE_BUSY_SNAPSHOT; } - return rc; } @@ -66571,30 +68754,33 @@ SQLITE_PRIVATE int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *p Pgno iMax = pWal->hdr.mxFrame; Pgno iFrame; - /* Restore the clients cache of the wal-index header to the state it - ** was in before the client began writing to the database. - */ - memcpy(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr)); - - for(iFrame=pWal->hdr.mxFrame+1; - ALWAYS(rc==SQLITE_OK) && iFrame<=iMax; - iFrame++ - ){ - /* This call cannot fail. Unless the page for which the page number - ** is passed as the second argument is (a) in the cache and - ** (b) has an outstanding reference, then xUndo is either a no-op - ** (if (a) is false) or simply expels the page from the cache (if (b) - ** is false). - ** - ** If the upper layer is doing a rollback, it is guaranteed that there - ** are no outstanding references to any page other than page 1. And - ** page 1 is never written to the log until the transaction is - ** committed. As a result, the call to xUndo may not fail. + SEH_TRY { + /* Restore the clients cache of the wal-index header to the state it + ** was in before the client began writing to the database. */ - assert( walFramePgno(pWal, iFrame)!=1 ); - rc = xUndo(pUndoCtx, walFramePgno(pWal, iFrame)); + memcpy(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr)); + + for(iFrame=pWal->hdr.mxFrame+1; + ALWAYS(rc==SQLITE_OK) && iFrame<=iMax; + iFrame++ + ){ + /* This call cannot fail. Unless the page for which the page number + ** is passed as the second argument is (a) in the cache and + ** (b) has an outstanding reference, then xUndo is either a no-op + ** (if (a) is false) or simply expels the page from the cache (if (b) + ** is false). + ** + ** If the upper layer is doing a rollback, it is guaranteed that there + ** are no outstanding references to any page other than page 1. And + ** page 1 is never written to the log until the transaction is + ** committed. As a result, the call to xUndo may not fail. + */ + assert( walFramePgno(pWal, iFrame)!=1 ); + rc = xUndo(pUndoCtx, walFramePgno(pWal, iFrame)); + } + if( iMax!=pWal->hdr.mxFrame ) walCleanupHash(pWal); } - if( iMax!=pWal->hdr.mxFrame ) walCleanupHash(pWal); + SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; ) } return rc; } @@ -66638,7 +68824,10 @@ SQLITE_PRIVATE int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData){ pWal->hdr.mxFrame = aWalData[0]; pWal->hdr.aFrameCksum[0] = aWalData[1]; pWal->hdr.aFrameCksum[1] = aWalData[2]; - walCleanupHash(pWal); + SEH_TRY { + walCleanupHash(pWal); + } + SEH_EXCEPT( rc = SQLITE_IOERR_IN_PAGE; ) } return rc; @@ -66688,7 +68877,7 @@ static int walRestartLog(Wal *pWal){ cnt = 0; do{ int notUsed; - rc = walTryBeginRead(pWal, ¬Used, 1, ++cnt); + rc = walTryBeginRead(pWal, ¬Used, 1, &cnt); }while( rc==WAL_RETRY ); assert( (rc&0xff)!=SQLITE_BUSY ); /* BUSY not possible when useWal==1 */ testcase( (rc&0xff)==SQLITE_IOERR ); @@ -66819,7 +69008,7 @@ static int walRewriteChecksums(Wal *pWal, u32 iLast){ ** Write a set of frames to the log. The caller must hold the write-lock ** on the log file (obtained using sqlite3WalBeginWriteTransaction()). */ -SQLITE_PRIVATE int sqlite3WalFrames( +static int walFrames( Wal *pWal, /* Wal handle to write to */ int szPage, /* Database page-size in bytes */ PgHdr *pList, /* List of dirty pages to write */ @@ -66907,7 +69096,9 @@ SQLITE_PRIVATE int sqlite3WalFrames( if( rc ) return rc; } } - assert( (int)pWal->szPage==szPage ); + if( (int)pWal->szPage!=szPage ){ + return SQLITE_CORRUPT_BKPT; /* TH3 test case: cov1/corrupt155.test */ + } /* Setup information needed to write frames into the WAL */ w.pWal = pWal; @@ -66928,7 +69119,7 @@ SQLITE_PRIVATE int sqlite3WalFrames( ** checksums must be recomputed when the transaction is committed. */ if( iFirst && (p->pDirty || isCommit==0) ){ u32 iWrite = 0; - VVA_ONLY(rc =) sqlite3WalFindFrame(pWal, p->pgno, &iWrite); + VVA_ONLY(rc =) walFindFrame(pWal, p->pgno, &iWrite); assert( rc==SQLITE_OK || iWrite==0 ); if( iWrite>=iFirst ){ i64 iOff = walFrameOffset(iWrite, szPage) + WAL_FRAME_HDRSIZE; @@ -67047,6 +69238,29 @@ SQLITE_PRIVATE int sqlite3WalFrames( return rc; } +/* +** Write a set of frames to the log. The caller must hold the write-lock +** on the log file (obtained using sqlite3WalBeginWriteTransaction()). +** +** The difference between this function and walFrames() is that this +** function wraps walFrames() in an SEH_TRY{...} block. +*/ +SQLITE_PRIVATE int sqlite3WalFrames( + Wal *pWal, /* Wal handle to write to */ + int szPage, /* Database page-size in bytes */ + PgHdr *pList, /* List of dirty pages to write */ + Pgno nTruncate, /* Database size after this commit */ + int isCommit, /* True if this is a commit */ + int sync_flags /* Flags to pass to OsSync() (or 0) */ +){ + int rc; + SEH_TRY { + rc = walFrames(pWal, szPage, pList, nTruncate, isCommit, sync_flags); + } + SEH_EXCEPT( rc = walHandleException(pWal); ) + return rc; +} + /* ** This routine is called to implement sqlite3_wal_checkpoint() and ** related interfaces. @@ -67084,10 +69298,9 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( if( pWal->readOnly ) return SQLITE_READONLY; WALTRACE(("WAL%p: checkpoint begins\n", pWal)); - /* Enable blocking locks, if possible. If blocking locks are successfully - ** enabled, set xBusy2=0 so that the busy-handler is never invoked. */ + /* Enable blocking locks, if possible. */ sqlite3WalDb(pWal, db); - (void)walEnableBlocking(pWal); + if( xBusy2 ) (void)walEnableBlocking(pWal); /* IMPLEMENTATION-OF: R-62028-47212 All calls obtain an exclusive ** "checkpoint" lock on the database file. @@ -67126,30 +69339,38 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( /* Read the wal-index header. */ - if( rc==SQLITE_OK ){ - walDisableBlocking(pWal); - rc = walIndexReadHdr(pWal, &isChanged); - (void)walEnableBlocking(pWal); - if( isChanged && pWal->pDbFd->pMethods->iVersion>=3 ){ - sqlite3OsUnfetch(pWal->pDbFd, 0, 0); + SEH_TRY { + if( rc==SQLITE_OK ){ + /* For a passive checkpoint, do not re-enable blocking locks after + ** reading the wal-index header. A passive checkpoint should not block + ** or invoke the busy handler. The only lock such a checkpoint may + ** attempt to obtain is a lock on a read-slot, and it should give up + ** immediately and do a partial checkpoint if it cannot obtain it. */ + walDisableBlocking(pWal); + rc = walIndexReadHdr(pWal, &isChanged); + if( eMode2!=SQLITE_CHECKPOINT_PASSIVE ) (void)walEnableBlocking(pWal); + if( isChanged && pWal->pDbFd->pMethods->iVersion>=3 ){ + sqlite3OsUnfetch(pWal->pDbFd, 0, 0); + } } - } - - /* Copy data from the log to the database file. */ - if( rc==SQLITE_OK ){ - if( pWal->hdr.mxFrame && walPagesize(pWal)!=nBuf ){ - rc = SQLITE_CORRUPT_BKPT; - }else{ - rc = walCheckpoint(pWal, db, eMode2, xBusy2, pBusyArg, sync_flags, zBuf); - } + /* Copy data from the log to the database file. */ + if( rc==SQLITE_OK ){ + if( pWal->hdr.mxFrame && walPagesize(pWal)!=nBuf ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + rc = walCheckpoint(pWal, db, eMode2, xBusy2, pBusyArg, sync_flags,zBuf); + } - /* If no error occurred, set the output variables. */ - if( rc==SQLITE_OK || rc==SQLITE_BUSY ){ - if( pnLog ) *pnLog = (int)pWal->hdr.mxFrame; - if( pnCkpt ) *pnCkpt = (int)(walCkptInfo(pWal)->nBackfill); + /* If no error occurred, set the output variables. */ + if( rc==SQLITE_OK || rc==SQLITE_BUSY ){ + if( pnLog ) *pnLog = (int)pWal->hdr.mxFrame; + SEH_INJECT_FAULT; + if( pnCkpt ) *pnCkpt = (int)(walCkptInfo(pWal)->nBackfill); + } } } + SEH_EXCEPT( rc = walHandleException(pWal); ) if( isChanged ){ /* If a new wal-index header was loaded before the checkpoint was @@ -67226,7 +69447,9 @@ SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op){ ** locks are taken in this case). Nor should the pager attempt to ** upgrade to exclusive-mode following such an error. */ +#ifndef SQLITE_USE_SEH assert( pWal->readLock>=0 || pWal->lockError ); +#endif assert( pWal->readLock>=0 || (op<=0 && pWal->exclusiveMode==0) ); if( op==0 ){ @@ -67294,7 +69517,20 @@ SQLITE_PRIVATE void sqlite3WalSnapshotOpen( Wal *pWal, sqlite3_snapshot *pSnapshot ){ - pWal->pSnapshot = (WalIndexHdr*)pSnapshot; + if( pSnapshot && ((WalIndexHdr*)pSnapshot)->iVersion==0 ){ + /* iVersion==0 means that this is a call to sqlite3_snapshot_get(). In + ** this case set the bGetSnapshot flag so that if the call to + ** sqlite3_snapshot_get() is about to read transaction on this wal + ** file, it does not take read-lock 0 if the wal file has been completely + ** checkpointed. Taking read-lock 0 would work, but then it would be + ** possible for a subsequent writer to destroy the snapshot even while + ** this connection is holding its read-transaction open. This is contrary + ** to user expectations, so we avoid it by not taking read-lock 0. */ + pWal->bGetSnapshot = 1; + }else{ + pWal->pSnapshot = (WalIndexHdr*)pSnapshot; + pWal->bGetSnapshot = 0; + } } /* @@ -67327,16 +69563,19 @@ SQLITE_API int sqlite3_snapshot_cmp(sqlite3_snapshot *p1, sqlite3_snapshot *p2){ */ SQLITE_PRIVATE int sqlite3WalSnapshotCheck(Wal *pWal, sqlite3_snapshot *pSnapshot){ int rc; - rc = walLockShared(pWal, WAL_CKPT_LOCK); - if( rc==SQLITE_OK ){ - WalIndexHdr *pNew = (WalIndexHdr*)pSnapshot; - if( memcmp(pNew->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt)) - || pNew->mxFramenBackfillAttempted - ){ - rc = SQLITE_ERROR_SNAPSHOT; - walUnlockShared(pWal, WAL_CKPT_LOCK); + SEH_TRY { + rc = walLockShared(pWal, WAL_CKPT_LOCK); + if( rc==SQLITE_OK ){ + WalIndexHdr *pNew = (WalIndexHdr*)pSnapshot; + if( memcmp(pNew->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt)) + || pNew->mxFramenBackfillAttempted + ){ + rc = SQLITE_ERROR_SNAPSHOT; + walUnlockShared(pWal, WAL_CKPT_LOCK); + } } } + SEH_EXCEPT( rc = walHandleException(pWal); ) return rc; } @@ -67459,7 +69698,7 @@ SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal){ ** 22 1 Min embedded payload fraction (must be 32) ** 23 1 Min leaf payload fraction (must be 32) ** 24 4 File change counter -** 28 4 Reserved for future use +** 28 4 The size of the database in pages ** 32 4 First freelist page ** 36 4 Number of freelist pages in the file ** 40 60 15 4-byte meta values passed to higher layers @@ -67567,7 +69806,7 @@ SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal){ ** byte are used. The integer consists of all bytes that have bit 8 set and ** the first byte with bit 8 clear. The most significant byte of the integer ** appears first. A variable-length integer may not be more than 9 bytes long. -** As a special case, all 8 bytes of the 9th byte are used as data. This +** As a special case, all 8 bits of the 9th byte are used as data. This ** allows a 64-bit integer to be encoded in 9 bytes. ** ** 0x00 becomes 0x00000000 @@ -67575,7 +69814,7 @@ SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal){ ** 0x81 0x00 becomes 0x00000080 ** 0x82 0x00 becomes 0x00000100 ** 0x80 0x7f becomes 0x0000007f -** 0x8a 0x91 0xd1 0xac 0x78 becomes 0x12345678 +** 0x81 0x91 0xd1 0xac 0x78 becomes 0x12345678 ** 0x81 0x81 0x81 0x81 0x01 becomes 0x10204081 ** ** Variable length integers are used for rowids and to hold the number of @@ -67658,7 +69897,7 @@ typedef struct CellInfo CellInfo; ** page that has been loaded into memory. The information in this object ** is derived from the raw on-disk page content. ** -** As each database page is loaded into memory, the pager allocats an +** As each database page is loaded into memory, the pager allocates an ** instance of this object and zeros the first 8 bytes. (This is the ** "extra" information associated with each page of the pager.) ** @@ -67951,7 +70190,7 @@ struct BtCursor { #define BTCF_WriteFlag 0x01 /* True if a write cursor */ #define BTCF_ValidNKey 0x02 /* True if info.nKey is valid */ #define BTCF_ValidOvfl 0x04 /* True if aOverflow is valid */ -#define BTCF_AtLast 0x08 /* Cursor is pointing ot the last entry */ +#define BTCF_AtLast 0x08 /* Cursor is pointing to the last entry */ #define BTCF_Incrblob 0x10 /* True if an incremental I/O handle */ #define BTCF_Multiple 0x20 /* Maybe another cursor on the same btree */ #define BTCF_Pinned 0x40 /* Cursor is busy and cannot be moved */ @@ -68090,17 +70329,19 @@ struct IntegrityCk { BtShared *pBt; /* The tree being checked out */ Pager *pPager; /* The associated pager. Also accessible by pBt->pPager */ u8 *aPgRef; /* 1 bit per page in the db (see above) */ - Pgno nPage; /* Number of pages in the database */ + Pgno nCkPage; /* Pages in the database. 0 for partial check */ int mxErr; /* Stop accumulating errors when this reaches zero */ int nErr; /* Number of messages written to zErrMsg so far */ int rc; /* SQLITE_OK, SQLITE_NOMEM, or SQLITE_INTERRUPT */ u32 nStep; /* Number of steps into the integrity_check process */ const char *zPfx; /* Error message prefix */ - Pgno v1; /* Value for first %u substitution in zPfx */ - int v2; /* Value for second %d substitution in zPfx */ + Pgno v0; /* Value for first %u substitution in zPfx (root page) */ + Pgno v1; /* Value for second %u substitution in zPfx (current pg) */ + int v2; /* Value for third %d substitution in zPfx */ StrAccum errMsg; /* Accumulate the error message text here */ u32 *heap; /* Min-heap used for analyzing cell coverage */ sqlite3 *db; /* Database connection running the check */ + i64 nRow; /* Number of rows visited in current tree */ }; /* @@ -68113,7 +70354,7 @@ struct IntegrityCk { /* ** get2byteAligned(), unlike get2byte(), requires that its argument point to a -** two-byte aligned address. get2bytea() is only used for accessing the +** two-byte aligned address. get2byteAligned() is only used for accessing the ** cell addresses in a btree header. */ #if SQLITE_BYTEORDER==4321 @@ -68290,7 +70531,7 @@ SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree *p){ ** ** There is a corresponding leave-all procedures. ** -** Enter the mutexes in accending order by BtShared pointer address +** Enter the mutexes in ascending order by BtShared pointer address ** to avoid the possibility of deadlock when two threads with ** two or more btrees in common both try to lock all their btrees ** at the same instant. @@ -68560,8 +70801,8 @@ SQLITE_PRIVATE sqlite3_uint64 sqlite3BtreeSeekCount(Btree *pBt){ int corruptPageError(int lineno, MemPage *p){ char *zMsg; sqlite3BeginBenignMalloc(); - zMsg = sqlite3_mprintf("database corruption page %d of %s", - (int)p->pgno, sqlite3PagerFilename(p->pBt->pPager, 0) + zMsg = sqlite3_mprintf("database corruption page %u of %s", + p->pgno, sqlite3PagerFilename(p->pBt->pPager, 0) ); sqlite3EndBenignMalloc(); if( zMsg ){ @@ -68575,8 +70816,47 @@ int corruptPageError(int lineno, MemPage *p){ # define SQLITE_CORRUPT_PAGE(pMemPage) SQLITE_CORRUPT_PGNO(pMemPage->pgno) #endif +/* Default value for SHARED_LOCK_TRACE macro if shared-cache is disabled +** or if the lock tracking is disabled. This is always the value for +** release builds. +*/ +#define SHARED_LOCK_TRACE(X,MSG,TAB,TYPE) /*no-op*/ + #ifndef SQLITE_OMIT_SHARED_CACHE +#if 0 +/* ^---- Change to 1 and recompile to enable shared-lock tracing +** for debugging purposes. +** +** Print all shared-cache locks on a BtShared. Debugging use only. +*/ +static void sharedLockTrace( + BtShared *pBt, + const char *zMsg, + int iRoot, + int eLockType +){ + BtLock *pLock; + if( iRoot>0 ){ + printf("%s-%p %u%s:", zMsg, pBt, iRoot, eLockType==READ_LOCK?"R":"W"); + }else{ + printf("%s-%p:", zMsg, pBt); + } + for(pLock=pBt->pLock; pLock; pLock=pLock->pNext){ + printf(" %p/%u%s", pLock->pBtree, pLock->iTable, + pLock->eLock==READ_LOCK ? "R" : "W"); + while( pLock->pNext && pLock->pBtree==pLock->pNext->pBtree ){ + pLock = pLock->pNext; + printf(",%u%s", pLock->iTable, pLock->eLock==READ_LOCK ? "R" : "W"); + } + } + printf("\n"); + fflush(stdout); +} +#undef SHARED_LOCK_TRACE +#define SHARED_LOCK_TRACE(X,MSG,TAB,TYPE) sharedLockTrace(X,MSG,TAB,TYPE) +#endif /* Shared-lock tracing */ + #ifdef SQLITE_DEBUG /* **** This function is only used as part of an assert() statement. *** @@ -68653,6 +70933,8 @@ static int hasSharedCacheTableLock( iTab = iRoot; } + SHARED_LOCK_TRACE(pBtree->pBt,"hasLock",iRoot,eLockType); + /* Search for the required lock. Either a write-lock on root-page iTab, a ** write-lock on the schema table, or (if the client is reading) a ** read-lock on iTab will suffice. Return 1 if any of these are found. */ @@ -68786,6 +71068,8 @@ static int setSharedCacheTableLock(Btree *p, Pgno iTable, u8 eLock){ BtLock *pLock = 0; BtLock *pIter; + SHARED_LOCK_TRACE(pBt,"setLock", iTable, eLock); + assert( sqlite3BtreeHoldsMutex(p) ); assert( eLock==READ_LOCK || eLock==WRITE_LOCK ); assert( p->db!=0 ); @@ -68853,6 +71137,8 @@ static void clearAllSharedCacheTableLocks(Btree *p){ assert( p->sharable || 0==*ppIter ); assert( p->inTrans>0 ); + SHARED_LOCK_TRACE(pBt, "clearAllLocks", 0, 0); + while( *ppIter ){ BtLock *pLock = *ppIter; assert( (pBt->btsFlags & BTS_EXCLUSIVE)==0 || pBt->pWriter==pLock->pBtree ); @@ -68891,6 +71177,9 @@ static void clearAllSharedCacheTableLocks(Btree *p){ */ static void downgradeAllSharedCacheTableLocks(Btree *p){ BtShared *pBt = p->pBt; + + SHARED_LOCK_TRACE(pBt, "downgradeLocks", 0, 0); + if( pBt->pWriter==p ){ BtLock *pLock; pBt->pWriter = 0; @@ -69370,8 +71659,25 @@ SQLITE_PRIVATE int sqlite3BtreeCursorRestore(BtCursor *pCur, int *pDifferentRow) */ SQLITE_PRIVATE void sqlite3BtreeCursorHint(BtCursor *pCur, int eHintType, ...){ /* Used only by system that substitute their own storage engine */ +#ifdef SQLITE_DEBUG + if( ALWAYS(eHintType==BTREE_HINT_RANGE) ){ + va_list ap; + Expr *pExpr; + Walker w; + memset(&w, 0, sizeof(w)); + w.xExprCallback = sqlite3CursorRangeHintExprCheck; + va_start(ap, eHintType); + pExpr = va_arg(ap, Expr*); + w.u.aMem = va_arg(ap, Mem*); + va_end(ap); + assert( pExpr!=0 ); + assert( w.u.aMem!=0 ); + sqlite3WalkExpr(&w, pExpr); + } +#endif /* SQLITE_DEBUG */ } -#endif +#endif /* SQLITE_ENABLE_CURSOR_HINTS */ + /* ** Provide flag hints to the cursor. @@ -69456,7 +71762,7 @@ static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){ pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage); if( eType!=pPtrmap[offset] || get4byte(&pPtrmap[offset+1])!=parent ){ - TRACE(("PTRMAP_UPDATE: %d->(%d,%d)\n", key, eType, parent)); + TRACE(("PTRMAP_UPDATE: %u->(%u,%u)\n", key, eType, parent)); *pRC= rc = sqlite3PagerWrite(pDbPage); if( rc==SQLITE_OK ){ pPtrmap[offset] = eType; @@ -69655,27 +71961,31 @@ static void btreeParseCellPtr( iKey = *pIter; if( iKey>=0x80 ){ u8 x; - iKey = ((iKey&0x7f)<<7) | ((x = *++pIter) & 0x7f); + iKey = (iKey<<7) ^ (x = *++pIter); if( x>=0x80 ){ - iKey = (iKey<<7) | ((x =*++pIter) & 0x7f); + iKey = (iKey<<7) ^ (x = *++pIter); if( x>=0x80 ){ - iKey = (iKey<<7) | ((x = *++pIter) & 0x7f); + iKey = (iKey<<7) ^ 0x10204000 ^ (x = *++pIter); if( x>=0x80 ){ - iKey = (iKey<<7) | ((x = *++pIter) & 0x7f); + iKey = (iKey<<7) ^ 0x4000 ^ (x = *++pIter); if( x>=0x80 ){ - iKey = (iKey<<7) | ((x = *++pIter) & 0x7f); + iKey = (iKey<<7) ^ 0x4000 ^ (x = *++pIter); if( x>=0x80 ){ - iKey = (iKey<<7) | ((x = *++pIter) & 0x7f); + iKey = (iKey<<7) ^ 0x4000 ^ (x = *++pIter); if( x>=0x80 ){ - iKey = (iKey<<7) | ((x = *++pIter) & 0x7f); + iKey = (iKey<<7) ^ 0x4000 ^ (x = *++pIter); if( x>=0x80 ){ - iKey = (iKey<<8) | (*++pIter); + iKey = (iKey<<8) ^ 0x8000 ^ (*++pIter); } } } } } + }else{ + iKey ^= 0x204000; } + }else{ + iKey ^= 0x4000; } } pIter++; @@ -69752,10 +72062,11 @@ static void btreeParseCell( ** ** cellSizePtrNoPayload() => table internal nodes ** cellSizePtrTableLeaf() => table leaf nodes -** cellSizePtr() => all index nodes & table leaf nodes +** cellSizePtr() => index internal nodes +** cellSizeIdxLeaf() => index leaf nodes */ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ - u8 *pIter = pCell + pPage->childPtrSize; /* For looping over bytes of pCell */ + u8 *pIter = pCell + 4; /* For looping over bytes of pCell */ u8 *pEnd; /* End mark for a varint */ u32 nSize; /* Size value to return */ @@ -69768,6 +72079,49 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ pPage->xParseCell(pPage, pCell, &debuginfo); #endif + assert( pPage->childPtrSize==4 ); + nSize = *pIter; + if( nSize>=0x80 ){ + pEnd = &pIter[8]; + nSize &= 0x7f; + do{ + nSize = (nSize<<7) | (*++pIter & 0x7f); + }while( *(pIter)>=0x80 && pItermaxLocal ); + testcase( nSize==(u32)pPage->maxLocal+1 ); + if( nSize<=pPage->maxLocal ){ + nSize += (u32)(pIter - pCell); + assert( nSize>4 ); + }else{ + int minLocal = pPage->minLocal; + nSize = minLocal + (nSize - minLocal) % (pPage->pBt->usableSize - 4); + testcase( nSize==pPage->maxLocal ); + testcase( nSize==(u32)pPage->maxLocal+1 ); + if( nSize>pPage->maxLocal ){ + nSize = minLocal; + } + nSize += 4 + (u16)(pIter - pCell); + } + assert( nSize==debuginfo.nSize || CORRUPT_DB ); + return (u16)nSize; +} +static u16 cellSizePtrIdxLeaf(MemPage *pPage, u8 *pCell){ + u8 *pIter = pCell; /* For looping over bytes of pCell */ + u8 *pEnd; /* End mark for a varint */ + u32 nSize; /* Size value to return */ + +#ifdef SQLITE_DEBUG + /* The value returned by this function should always be the same as + ** the (CellInfo.nSize) value found by doing a full parse of the + ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of + ** this function verifies that this invariant is not violated. */ + CellInfo debuginfo; + pPage->xParseCell(pPage, pCell, &debuginfo); +#endif + + assert( pPage->childPtrSize==0 ); nSize = *pIter; if( nSize>=0x80 ){ pEnd = &pIter[8]; @@ -69892,7 +72246,7 @@ static void ptrmapPutOvflPtr(MemPage *pPage, MemPage *pSrc, u8 *pCell,int *pRC){ pPage->xParseCell(pPage, pCell, &info); if( info.nLocalaDataEnd, pCell, pCell+info.nLocal) ){ + if( SQLITE_OVERFLOW(pSrc->aDataEnd, pCell, pCell+info.nLocal) ){ testcase( pSrc!=pPage ); *pRC = SQLITE_CORRUPT_BKPT; return; @@ -69993,7 +72347,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ iCellStart = get2byte(&data[hdr+5]); if( nCell>0 ){ temp = sqlite3PagerTempSpace(pPage->pBt->pPager); - memcpy(&temp[iCellStart], &data[iCellStart], usableSize - iCellStart); + memcpy(temp, data, usableSize); src = temp; for(i=0; iiCellLast ){ + if( pc>iCellLast ){ return SQLITE_CORRUPT_PAGE(pPage); } - assert( pc>=iCellStart && pc<=iCellLast ); + assert( pc>=0 && pc<=iCellLast ); size = pPage->xCellSize(pPage, &src[pc]); cbrk -= size; if( cbrkusableSize ){ @@ -70122,7 +72476,7 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ ** allocation is being made in order to insert a new cell, so we will ** also end up needing a new cell pointer. */ -static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ +static SQLITE_INLINE int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ const int hdr = pPage->hdrOffset; /* Local cache of pPage->hdrOffset */ u8 * const data = pPage->aData; /* Local cache of pPage->aData */ int top; /* First byte of cell content area */ @@ -70148,13 +72502,14 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ ** integer, so a value of 0 is used in its place. */ pTmp = &data[hdr+5]; top = get2byte(pTmp); - assert( top<=(int)pPage->pBt->usableSize ); /* by btreeComputeFreeSpace() */ if( gap>top ){ if( top==0 && pPage->pBt->usableSize==65536 ){ top = 65536; }else{ return SQLITE_CORRUPT_PAGE(pPage); } + }else if( top>(int)pPage->pBt->usableSize ){ + return SQLITE_CORRUPT_PAGE(pPage); } /* If there is enough space between gap and top for one more cell pointer, @@ -70216,7 +72571,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ ** ** Even though the freeblock list was checked by btreeComputeFreeSpace(), ** that routine will not detect overlap between cells or freeblocks. Nor -** does it detect cells or freeblocks that encrouch into the reserved bytes +** does it detect cells or freeblocks that encroach into the reserved bytes ** at the end of the page. So do additional corruption checks inside this ** routine and return SQLITE_CORRUPT if any problems are found. */ @@ -70237,7 +72592,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ assert( CORRUPT_DB || iEnd <= pPage->pBt->usableSize ); assert( sqlite3_mutex_held(pPage->pBt->mutex) ); assert( iSize>=4 ); /* Minimum cell size is 4 */ - assert( iStart<=pPage->pBt->usableSize-4 ); + assert( CORRUPT_DB || iStart<=pPage->pBt->usableSize-4 ); /* The list of freeblocks must be in ascending order. Find the ** spot on the list where iStart should be inserted. @@ -70294,6 +72649,11 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ } pTmp = &data[hdr+5]; x = get2byte(pTmp); + if( pPage->pBt->btsFlags & BTS_FAST_SECURE ){ + /* Overwrite deleted information with zeros when the secure_delete + ** option is enabled */ + memset(&data[iStart], 0, iSize); + } if( iStart<=x ){ /* The new freeblock is at the beginning of the cell content area, ** so just extend the cell content area rather than create another @@ -70305,14 +72665,9 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ }else{ /* Insert the new freeblock into the freelist */ put2byte(&data[iPtr], iStart); + put2byte(&data[iStart], iFreeBlk); + put2byte(&data[iStart+2], iSize); } - if( pPage->pBt->btsFlags & BTS_FAST_SECURE ){ - /* Overwrite deleted information with zeros when the secure_delete - ** option is enabled */ - memset(&data[iStart], 0, iSize); - } - put2byte(&data[iStart], iFreeBlk); - put2byte(&data[iStart+2], iSize); pPage->nFree += iOrigSize; return SQLITE_OK; } @@ -70349,14 +72704,14 @@ static int decodeFlags(MemPage *pPage, int flagByte){ }else if( flagByte==(PTF_ZERODATA | PTF_LEAF) ){ pPage->intKey = 0; pPage->intKeyLeaf = 0; - pPage->xCellSize = cellSizePtr; + pPage->xCellSize = cellSizePtrIdxLeaf; pPage->xParseCell = btreeParseCellPtrIndex; pPage->maxLocal = pBt->maxLocal; pPage->minLocal = pBt->minLocal; }else{ pPage->intKey = 0; pPage->intKeyLeaf = 0; - pPage->xCellSize = cellSizePtr; + pPage->xCellSize = cellSizePtrIdxLeaf; pPage->xParseCell = btreeParseCellPtrIndex; return SQLITE_CORRUPT_PAGE(pPage); } @@ -70675,68 +73030,41 @@ SQLITE_PRIVATE Pgno sqlite3BtreeLastPage(Btree *p){ /* ** Get a page from the pager and initialize it. -** -** If pCur!=0 then the page is being fetched as part of a moveToChild() -** call. Do additional sanity checking on the page in this case. -** And if the fetch fails, this routine must decrement pCur->iPage. -** -** The page is fetched as read-write unless pCur is not NULL and is -** a read-only cursor. -** -** If an error occurs, then *ppPage is undefined. It -** may remain unchanged, or it may be set to an invalid value. */ static int getAndInitPage( BtShared *pBt, /* The database file */ Pgno pgno, /* Number of the page to get */ MemPage **ppPage, /* Write the page pointer here */ - BtCursor *pCur, /* Cursor to receive the page, or NULL */ int bReadOnly /* True for a read-only page */ ){ int rc; DbPage *pDbPage; + MemPage *pPage; assert( sqlite3_mutex_held(pBt->mutex) ); - assert( pCur==0 || ppPage==&pCur->pPage ); - assert( pCur==0 || bReadOnly==pCur->curPagerFlags ); - assert( pCur==0 || pCur->iPage>0 ); if( pgno>btreePagecount(pBt) ){ - rc = SQLITE_CORRUPT_BKPT; - goto getAndInitPage_error1; + *ppPage = 0; + return SQLITE_CORRUPT_BKPT; } rc = sqlite3PagerGet(pBt->pPager, pgno, (DbPage**)&pDbPage, bReadOnly); if( rc ){ - goto getAndInitPage_error1; + *ppPage = 0; + return rc; } - *ppPage = (MemPage*)sqlite3PagerGetExtra(pDbPage); - if( (*ppPage)->isInit==0 ){ + pPage = (MemPage*)sqlite3PagerGetExtra(pDbPage); + if( pPage->isInit==0 ){ btreePageFromDbPage(pDbPage, pgno, pBt); - rc = btreeInitPage(*ppPage); + rc = btreeInitPage(pPage); if( rc!=SQLITE_OK ){ - goto getAndInitPage_error2; + releasePage(pPage); + *ppPage = 0; + return rc; } } - assert( (*ppPage)->pgno==pgno || CORRUPT_DB ); - assert( (*ppPage)->aData==sqlite3PagerGetData(pDbPage) ); - - /* If obtaining a child page for a cursor, we must verify that the page is - ** compatible with the root page. */ - if( pCur && ((*ppPage)->nCell<1 || (*ppPage)->intKey!=pCur->curIntKey) ){ - rc = SQLITE_CORRUPT_PGNO(pgno); - goto getAndInitPage_error2; - } + assert( pPage->pgno==pgno || CORRUPT_DB ); + assert( pPage->aData==sqlite3PagerGetData(pDbPage) ); + *ppPage = pPage; return SQLITE_OK; - -getAndInitPage_error2: - releasePage(*ppPage); -getAndInitPage_error1: - if( pCur ){ - pCur->iPage--; - pCur->pPage = pCur->apPage[pCur->iPage]; - } - testcase( pgno==0 ); - assert( pgno!=0 || rc!=SQLITE_OK ); - return rc; } /* @@ -70819,7 +73147,7 @@ static void pageReinit(DbPage *pData){ ** call to btreeInitPage() will likely return SQLITE_CORRUPT. ** But no harm is done by this. And it is very important that ** btreeInitPage() be called on every btree page so we make - ** the call for every page that comes in for re-initing. */ + ** the call for every page that comes in for re-initializing. */ btreeInitPage(pPage); } } @@ -70998,6 +73326,9 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( assert( sizeof(u16)==2 ); assert( sizeof(Pgno)==4 ); + /* Suppress false-positive compiler warning from PVS-Studio */ + memset(&zDbHeader[16], 0, 8); + pBt = sqlite3MallocZero( sizeof(*pBt) ); if( pBt==0 ){ rc = SQLITE_NOMEM_BKPT; @@ -71214,7 +73545,7 @@ static SQLITE_NOINLINE int allocateTempSpace(BtShared *pBt){ ** can mean that fillInCell() only initializes the first 2 or 3 ** bytes of pTmpSpace, but that the first 4 bytes are copied from ** it into a database page. This is not actually a problem, but it - ** does cause a valgrind error when the 1 or 2 bytes of unitialized + ** does cause a valgrind error when the 1 or 2 bytes of uninitialized ** data is passed to system call write(). So to avoid this error, ** zero the first 4 bytes of temp space here. ** @@ -71449,7 +73780,7 @@ SQLITE_PRIVATE int sqlite3BtreeGetReserveNoMutex(Btree *p){ /* ** Return the number of bytes of space at the end of every page that -** are intentually left unused. This is the "reserved" space that is +** are intentionally left unused. This is the "reserved" space that is ** sometimes used by extensions. ** ** The value returned is the larger of the current reserve size and @@ -71696,7 +74027,6 @@ static int lockBtree(BtShared *pBt){ ){ goto page1_init_failed; } - pBt->btsFlags |= BTS_PAGESIZE_FIXED; assert( (pageSize & 7)==0 ); /* EVIDENCE-OF: R-59310-51205 The "reserved space" size in the 1-byte ** integer at offset 20 is the number of bytes of space at the end of @@ -71716,6 +74046,7 @@ static int lockBtree(BtShared *pBt){ releasePageOne(pPage1); pBt->usableSize = usableSize; pBt->pageSize = pageSize; + pBt->btsFlags |= BTS_PAGESIZE_FIXED; freeTempSpace(pBt); rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, pageSize-usableSize); @@ -71735,6 +74066,7 @@ static int lockBtree(BtShared *pBt){ if( usableSize<480 ){ goto page1_init_failed; } + pBt->btsFlags |= BTS_PAGESIZE_FIXED; pBt->pageSize = pageSize; pBt->usableSize = usableSize; #ifndef SQLITE_OMIT_AUTOVACUUM @@ -71913,7 +74245,11 @@ SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p){ ** when A already has a read lock, we encourage A to give up and let B ** proceed. */ -SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ +static SQLITE_NOINLINE int btreeBeginTrans( + Btree *p, /* The btree in which to start the transaction */ + int wrflag, /* True to start a write transaction */ + int *pSchemaVersion /* Put schema version number here, if not NULL */ +){ BtShared *pBt = p->pBt; Pager *pPager = pBt->pPager; int rc = SQLITE_OK; @@ -72085,6 +74421,28 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVers sqlite3BtreeLeave(p); return rc; } +SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ + BtShared *pBt; + if( p->sharable + || p->inTrans==TRANS_NONE + || (p->inTrans==TRANS_READ && wrflag!=0) + ){ + return btreeBeginTrans(p,wrflag,pSchemaVersion); + } + pBt = p->pBt; + if( pSchemaVersion ){ + *pSchemaVersion = get4byte(&pBt->pPage1->aData[40]); + } + if( wrflag ){ + /* This call makes sure that the pager has the correct number of + ** open savepoints. If the second parameter is greater than 0 and + ** the sub-journal is not already open, then it will be opened here. + */ + return sqlite3PagerOpenSavepoint(pBt->pPager, p->db->nSavepoint); + }else{ + return SQLITE_OK; + } +} #ifndef SQLITE_OMIT_AUTOVACUUM @@ -72222,7 +74580,7 @@ static int relocatePage( if( iDbPage<3 ) return SQLITE_CORRUPT_BKPT; /* Move page iDbPage from its current location to page number iFreePage */ - TRACE(("AUTOVACUUM: Moving %d to free page %d (ptr page %d type %d)\n", + TRACE(("AUTOVACUUM: Moving %u to free page %u (ptr page %u type %u)\n", iDbPage, iFreePage, iPtrPage, eType)); rc = sqlite3PagerMovepage(pPager, pDbPage->pDbPage, iFreePage, isCommit); if( rc!=SQLITE_OK ){ @@ -73053,6 +75411,25 @@ SQLITE_PRIVATE int sqlite3BtreeCursorSize(void){ return ROUND8(sizeof(BtCursor)); } +#ifdef SQLITE_DEBUG +/* +** Return true if and only if the Btree object will be automatically +** closed with the BtCursor closes. This is used within assert() statements +** only. +*/ +SQLITE_PRIVATE int sqlite3BtreeClosesWithCursor( + Btree *pBtree, /* the btree object */ + BtCursor *pCur /* Corresponding cursor */ +){ + BtShared *pBt = pBtree->pBt; + if( (pBt->openFlags & BTREE_SINGLE)==0 ) return 0; + if( pBt->pCursor!=pCur ) return 0; + if( pCur->pNext!=0 ) return 0; + if( pCur->pBtree!=pBtree ) return 0; + return 1; +} +#endif + /* ** Initialize memory that will be converted into a BtCursor object. ** @@ -73180,7 +75557,6 @@ SQLITE_PRIVATE void sqlite3BtreeCursorUnpin(BtCursor *pCur){ pCur->curFlags &= ~BTCF_Pinned; } -#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC /* ** Return the offset into the database file for the start of the ** payload to which the cursor is pointing. @@ -73192,7 +75568,6 @@ SQLITE_PRIVATE i64 sqlite3BtreeOffset(BtCursor *pCur){ return (i64)pCur->pBt->pageSize*((i64)pCur->pPage->pgno - 1) + (i64)(pCur->info.pPayload - pCur->pPage->aData); } -#endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */ /* ** Return the number of bytes of payload for the entry that pCur is @@ -73218,7 +75593,7 @@ SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor *pCur){ ** routine always returns 2147483647 (which is the largest record ** that SQLite can handle) or more. But returning a smaller value might ** prevent large memory allocations when trying to interpret a -** corrupt datrabase. +** corrupt database. ** ** The current implementation merely returns the size of the underlying ** database file. @@ -73437,9 +75812,12 @@ static int accessPayload( if( pCur->aOverflow==0 || nOvfl*(int)sizeof(Pgno) > sqlite3MallocSize(pCur->aOverflow) ){ - Pgno *aNew = (Pgno*)sqlite3Realloc( - pCur->aOverflow, nOvfl*2*sizeof(Pgno) - ); + Pgno *aNew; + if( sqlite3FaultSim(413) ){ + aNew = 0; + }else{ + aNew = (Pgno*)sqlite3Realloc(pCur->aOverflow, nOvfl*2*sizeof(Pgno)); + } if( aNew==0 ){ return SQLITE_NOMEM_BKPT; }else{ @@ -73449,6 +75827,12 @@ static int accessPayload( memset(pCur->aOverflow, 0, nOvfl*sizeof(Pgno)); pCur->curFlags |= BTCF_ValidOvfl; }else{ + /* Sanity check the validity of the overflow page cache */ + assert( pCur->aOverflow[0]==nextPage + || pCur->aOverflow[0]==0 + || CORRUPT_DB ); + assert( pCur->aOverflow[0]!=0 || pCur->aOverflow[offset/ovflSize]==0 ); + /* If the overflow page-list cache has been allocated and the ** entry for the first required overflow page is valid, skip ** directly to it. @@ -73518,7 +75902,6 @@ static int accessPayload( assert( aWrite>=pBufStart ); /* due to (6) */ memcpy(aSave, aWrite, 4); rc = sqlite3OsRead(fd, aWrite, a+4, (i64)pBt->pageSize*(nextPage-1)); - if( rc && nextPage>pBt->nPage ) rc = SQLITE_CORRUPT_BKPT; nextPage = get4byte(aWrite); memcpy(aWrite, aSave, 4); }else @@ -73680,6 +76063,7 @@ SQLITE_PRIVATE const void *sqlite3BtreePayloadFetch(BtCursor *pCur, u32 *pAmt){ ** vice-versa). */ static int moveToChild(BtCursor *pCur, u32 newPgno){ + int rc; assert( cursorOwnsBtShared(pCur) ); assert( pCur->eState==CURSOR_VALID ); assert( pCur->iPageapPage[pCur->iPage] = pCur->pPage; pCur->ix = 0; pCur->iPage++; - return getAndInitPage(pCur->pBt, newPgno, &pCur->pPage, pCur, - pCur->curPagerFlags); + rc = getAndInitPage(pCur->pBt, newPgno, &pCur->pPage, pCur->curPagerFlags); + assert( pCur->pPage!=0 || rc!=SQLITE_OK ); + if( rc==SQLITE_OK + && (pCur->pPage->nCell<1 || pCur->pPage->intKey!=pCur->curIntKey) + ){ + releasePage(pCur->pPage); + rc = SQLITE_CORRUPT_PGNO(newPgno); + } + if( rc ){ + pCur->pPage = pCur->apPage[--pCur->iPage]; + } + return rc; } #ifdef SQLITE_DEBUG @@ -73801,7 +76195,7 @@ static int moveToRoot(BtCursor *pCur){ sqlite3BtreeClearCursor(pCur); } rc = getAndInitPage(pCur->pBt, pCur->pgnoRoot, &pCur->pPage, - 0, pCur->curPagerFlags); + pCur->curPagerFlags); if( rc!=SQLITE_OK ){ pCur->eState = CURSOR_INVALID; return rc; @@ -73913,13 +76307,30 @@ SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor *pCur, int *pRes){ *pRes = 0; rc = moveToLeftmost(pCur); }else if( rc==SQLITE_EMPTY ){ - assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 ); + assert( pCur->pgnoRoot==0 || (pCur->pPage!=0 && pCur->pPage->nCell==0) ); *pRes = 1; rc = SQLITE_OK; } return rc; } +#ifdef SQLITE_DEBUG +/* The cursors is CURSOR_VALID and has BTCF_AtLast set. Verify that +** this flags are true for a consistent database. +** +** This routine is is called from within assert() statements only. +** It is an internal verification routine and does not appear in production +** builds. +*/ +static int cursorIsAtLastEntry(BtCursor *pCur){ + int ii; + for(ii=0; iiiPage; ii++){ + if( pCur->aiIdx[ii]!=pCur->apPage[ii]->nCell ) return 0; + } + return pCur->ix==pCur->pPage->nCell-1 && pCur->pPage->leaf!=0; +} +#endif + /* Move the cursor to the last entry in the table. Return SQLITE_OK ** on success. Set *pRes to 0 if the cursor actually points to something ** or set *pRes to 1 if the table is empty. @@ -73948,18 +76359,7 @@ SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor *pCur, int *pRes){ /* If the cursor already points to the last entry, this is a no-op. */ if( CURSOR_VALID==pCur->eState && (pCur->curFlags & BTCF_AtLast)!=0 ){ -#ifdef SQLITE_DEBUG - /* This block serves to assert() that the cursor really does point - ** to the last entry in the b-tree. */ - int ii; - for(ii=0; iiiPage; ii++){ - assert( pCur->aiIdx[ii]==pCur->apPage[ii]->nCell ); - } - assert( pCur->ix==pCur->pPage->nCell-1 || CORRUPT_DB ); - testcase( pCur->ix!=pCur->pPage->nCell-1 ); - /* ^-- dbsqlfuzz b92b72e4de80b5140c30ab71372ca719b8feb618 */ - assert( pCur->pPage->leaf ); -#endif + assert( cursorIsAtLastEntry(pCur) || CORRUPT_DB ); *pRes = 0; return SQLITE_OK; } @@ -74012,13 +76412,14 @@ SQLITE_PRIVATE int sqlite3BtreeTableMoveto( } if( pCur->info.nKeycurFlags & BTCF_AtLast)!=0 ){ + assert( cursorIsAtLastEntry(pCur) || CORRUPT_DB ); *pRes = -1; return SQLITE_OK; } /* If the requested key is one more than the previous key, then ** try to get there using sqlite3BtreeNext() rather than a full ** binary search. This is an optimization only. The correct answer - ** is still obtained without this case, only a little more slowely */ + ** is still obtained without this case, only a little more slowly. */ if( pCur->info.nKey+1==intKey ){ *pRes = 0; rc = sqlite3BtreeNext(pCur, 0); @@ -74272,7 +76673,7 @@ SQLITE_PRIVATE int sqlite3BtreeIndexMoveto( && indexCellCompare(pCur, 0, pIdxKey, xRecordCompare)<=0 && pIdxKey->errCode==SQLITE_OK ){ - pCur->curFlags &= ~BTCF_ValidOvfl; + pCur->curFlags &= ~(BTCF_ValidOvfl|BTCF_AtLast); if( !pCur->pPage->isInit ){ return SQLITE_CORRUPT_BKPT; } @@ -74414,10 +76815,36 @@ SQLITE_PRIVATE int sqlite3BtreeIndexMoveto( }else{ chldPg = get4byte(findCell(pPage, lwr)); } - pCur->ix = (u16)lwr; - rc = moveToChild(pCur, chldPg); - if( rc ) break; - } + + /* This block is similar to an in-lined version of: + ** + ** pCur->ix = (u16)lwr; + ** rc = moveToChild(pCur, chldPg); + ** if( rc ) break; + */ + pCur->info.nSize = 0; + pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); + if( pCur->iPage>=(BTCURSOR_MAX_DEPTH-1) ){ + return SQLITE_CORRUPT_BKPT; + } + pCur->aiIdx[pCur->iPage] = (u16)lwr; + pCur->apPage[pCur->iPage] = pCur->pPage; + pCur->ix = 0; + pCur->iPage++; + rc = getAndInitPage(pCur->pBt, chldPg, &pCur->pPage, pCur->curPagerFlags); + if( rc==SQLITE_OK + && (pCur->pPage->nCell<1 || pCur->pPage->intKey!=pCur->curIntKey) + ){ + releasePage(pCur->pPage); + rc = SQLITE_CORRUPT_PGNO(chldPg); + } + if( rc ){ + pCur->pPage = pCur->apPage[--pCur->iPage]; + break; + } + /* + ***** End of in-lined moveToChild() call */ + } moveto_index_finish: pCur->info.nSize = 0; assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); @@ -74452,10 +76879,10 @@ SQLITE_PRIVATE i64 sqlite3BtreeRowCountEst(BtCursor *pCur){ assert( cursorOwnsBtShared(pCur) ); assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); - /* Currently this interface is only called by the OP_IfSmaller - ** opcode, and it that case the cursor will always be valid and - ** will always point to a leaf node. */ - if( NEVER(pCur->eState!=CURSOR_VALID) ) return -1; + /* Currently this interface is only called by the OP_IfSizeBetween + ** opcode and the OP_Count opcode with P3=1. In either case, + ** the cursor will always be valid unless the btree is empty. */ + if( pCur->eState!=CURSOR_VALID ) return 0; if( NEVER(pCur->pPage->leaf==0) ) return -1; n = pCur->pPage->nCell; @@ -74508,7 +76935,8 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ pPage = pCur->pPage; idx = ++pCur->ix; - if( !pPage->isInit || sqlite3FaultSim(412) ){ + if( sqlite3FaultSim(412) ) pPage->isInit = 0; + if( !pPage->isInit ){ return SQLITE_CORRUPT_BKPT; } @@ -74600,7 +77028,10 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ } pPage = pCur->pPage; - assert( pPage->isInit ); + if( sqlite3FaultSim(412) ) pPage->isInit = 0; + if( !pPage->isInit ){ + return SQLITE_CORRUPT_BKPT; + } if( !pPage->leaf ){ int idx = pCur->ix; rc = moveToChild(pCur, get4byte(findCell(pPage, idx))); @@ -74771,7 +77202,7 @@ static int allocateBtreePage( memcpy(&pPage1->aData[32], &pTrunk->aData[0], 4); *ppPage = pTrunk; pTrunk = 0; - TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1)); + TRACE(("ALLOCATE: %u trunk - %u free pages left\n", *pPgno, n-1)); }else if( k>(u32)(pBt->usableSize/4 - 2) ){ /* Value of k is out of range. Database corruption */ rc = SQLITE_CORRUPT_PGNO(iTrunk); @@ -74837,7 +77268,7 @@ static int allocateBtreePage( } } pTrunk = 0; - TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1)); + TRACE(("ALLOCATE: %u trunk - %u free pages left\n", *pPgno, n-1)); #endif }else if( k>0 ){ /* Extract a leaf from the trunk */ @@ -74882,8 +77313,8 @@ static int allocateBtreePage( ){ int noContent; *pPgno = iPage; - TRACE(("ALLOCATE: %d was leaf %d of %d on trunk %d" - ": %d more free pages\n", + TRACE(("ALLOCATE: %u was leaf %u of %u on trunk %u" + ": %u more free pages\n", *pPgno, closest+1, k, pTrunk->pgno, n-1)); rc = sqlite3PagerWrite(pTrunk->pDbPage); if( rc ) goto end_allocate_page; @@ -74939,7 +77370,7 @@ static int allocateBtreePage( ** becomes a new pointer-map page, the second is used by the caller. */ MemPage *pPg = 0; - TRACE(("ALLOCATE: %d from end of file (pointer-map page)\n", pBt->nPage)); + TRACE(("ALLOCATE: %u from end of file (pointer-map page)\n", pBt->nPage)); assert( pBt->nPage!=PENDING_BYTE_PAGE(pBt) ); rc = btreeGetUnusedPage(pBt, pBt->nPage, &pPg, bNoContent); if( rc==SQLITE_OK ){ @@ -74962,7 +77393,7 @@ static int allocateBtreePage( releasePage(*ppPage); *ppPage = 0; } - TRACE(("ALLOCATE: %d from end of file\n", *pPgno)); + TRACE(("ALLOCATE: %u from end of file\n", *pPgno)); } assert( CORRUPT_DB || *pPgno!=PENDING_BYTE_PAGE(pBt) ); @@ -75090,7 +77521,7 @@ static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){ } rc = btreeSetHasContent(pBt, iPage); } - TRACE(("FREE-PAGE: %d leaf on trunk page %d\n",pPage->pgno,pTrunk->pgno)); + TRACE(("FREE-PAGE: %u leaf on trunk page %u\n",pPage->pgno,pTrunk->pgno)); goto freepage_out; } } @@ -75111,7 +77542,7 @@ static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){ put4byte(pPage->aData, iTrunk); put4byte(&pPage->aData[4], 0); put4byte(&pPage1->aData[32], iPage); - TRACE(("FREE-PAGE: %d new trunk page replacing %d\n", pPage->pgno, iTrunk)); + TRACE(("FREE-PAGE: %u new trunk page replacing %u\n", pPage->pgno, iTrunk)); freepage_out: if( pPage ){ @@ -75200,7 +77631,7 @@ static SQLITE_NOINLINE int clearCellOverflow( /* Call xParseCell to compute the size of a cell. If the cell contains ** overflow, then invoke cellClearOverflow to clear out that overflow. -** STore the result code (SQLITE_OK or some error code) in rc. +** Store the result code (SQLITE_OK or some error code) in rc. ** ** Implemented as macro to force inlining for performance. */ @@ -75273,7 +77704,10 @@ static int fillInCell( n = nHeader + nPayload; testcase( n==3 ); testcase( n==4 ); - if( n<4 ) n = 4; + if( n<4 ){ + n = 4; + pPayload[nPayload] = 0; + } *pnSize = n; assert( nSrc<=nPayload ); testcase( nSrcaCell[] implies that ** pPage->nOverflow is incremented. +** +** The insertCellFast() routine below works exactly the same as +** insertCell() except that it lacks the pTemp and iChild parameters +** which are assumed zero. Other than that, the two routines are the +** same. +** +** Fixes or enhancements to this routine should be reflected in +** insertCellFast()! */ static int insertCell( MemPage *pPage, /* Page into which we are copying */ @@ -75492,14 +77934,103 @@ static int insertCell( assert( sqlite3_mutex_held(pPage->pBt->mutex) ); assert( sz==pPage->xCellSize(pPage, pCell) || CORRUPT_DB ); assert( pPage->nFree>=0 ); + assert( iChild>0 ); if( pPage->nOverflow || sz+2>pPage->nFree ){ if( pTemp ){ memcpy(pTemp, pCell, sz); pCell = pTemp; } - if( iChild ){ - put4byte(pCell, iChild); + put4byte(pCell, iChild); + j = pPage->nOverflow++; + /* Comparison against ArraySize-1 since we hold back one extra slot + ** as a contingency. In other words, never need more than 3 overflow + ** slots but 4 are allocated, just to be safe. */ + assert( j < ArraySize(pPage->apOvfl)-1 ); + pPage->apOvfl[j] = pCell; + pPage->aiOvfl[j] = (u16)i; + + /* When multiple overflows occur, they are always sequential and in + ** sorted order. This invariants arise because multiple overflows can + ** only occur when inserting divider cells into the parent page during + ** balancing, and the dividers are adjacent and sorted. + */ + assert( j==0 || pPage->aiOvfl[j-1]<(u16)i ); /* Overflows in sorted order */ + assert( j==0 || i==pPage->aiOvfl[j-1]+1 ); /* Overflows are sequential */ + }else{ + int rc = sqlite3PagerWrite(pPage->pDbPage); + if( NEVER(rc!=SQLITE_OK) ){ + return rc; } + assert( sqlite3PagerIswriteable(pPage->pDbPage) ); + data = pPage->aData; + assert( &data[pPage->cellOffset]==pPage->aCellIdx ); + rc = allocateSpace(pPage, sz, &idx); + if( rc ){ return rc; } + /* The allocateSpace() routine guarantees the following properties + ** if it returns successfully */ + assert( idx >= 0 ); + assert( idx >= pPage->cellOffset+2*pPage->nCell+2 || CORRUPT_DB ); + assert( idx+sz <= (int)pPage->pBt->usableSize ); + pPage->nFree -= (u16)(2 + sz); + /* In a corrupt database where an entry in the cell index section of + ** a btree page has a value of 3 or less, the pCell value might point + ** as many as 4 bytes in front of the start of the aData buffer for + ** the source page. Make sure this does not cause problems by not + ** reading the first 4 bytes */ + memcpy(&data[idx+4], pCell+4, sz-4); + put4byte(&data[idx], iChild); + pIns = pPage->aCellIdx + i*2; + memmove(pIns+2, pIns, 2*(pPage->nCell - i)); + put2byte(pIns, idx); + pPage->nCell++; + /* increment the cell count */ + if( (++data[pPage->hdrOffset+4])==0 ) data[pPage->hdrOffset+3]++; + assert( get2byte(&data[pPage->hdrOffset+3])==pPage->nCell || CORRUPT_DB ); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pPage->pBt->autoVacuum ){ + int rc2 = SQLITE_OK; + /* The cell may contain a pointer to an overflow page. If so, write + ** the entry for the overflow page into the pointer map. + */ + ptrmapPutOvflPtr(pPage, pPage, pCell, &rc2); + if( rc2 ) return rc2; + } +#endif + } + return SQLITE_OK; +} + +/* +** This variant of insertCell() assumes that the pTemp and iChild +** parameters are both zero. Use this variant in sqlite3BtreeInsert() +** for performance improvement, and also so that this variant is only +** called from that one place, and is thus inlined, and thus runs must +** faster. +** +** Fixes or enhancements to this routine should be reflected into +** the insertCell() routine. +*/ +static int insertCellFast( + MemPage *pPage, /* Page into which we are copying */ + int i, /* New cell becomes the i-th cell of the page */ + u8 *pCell, /* Content of the new cell */ + int sz /* Bytes of content in pCell */ +){ + int idx = 0; /* Where to write new cell content in data[] */ + int j; /* Loop counter */ + u8 *data; /* The content of the whole page */ + u8 *pIns; /* The point in pPage->aCellIdx[] where no cell inserted */ + + assert( i>=0 && i<=pPage->nCell+pPage->nOverflow ); + assert( MX_CELL(pPage->pBt)<=10921 ); + assert( pPage->nCell<=MX_CELL(pPage->pBt) || CORRUPT_DB ); + assert( pPage->nOverflow<=ArraySize(pPage->apOvfl) ); + assert( ArraySize(pPage->apOvfl)==ArraySize(pPage->aiOvfl) ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( sz==pPage->xCellSize(pPage, pCell) || CORRUPT_DB ); + assert( pPage->nFree>=0 ); + assert( pPage->nOverflow==0 ); + if( sz+2>pPage->nFree ){ j = pPage->nOverflow++; /* Comparison against ArraySize-1 since we hold back one extra slot ** as a contingency. In other words, never need more than 3 overflow @@ -75531,17 +78062,7 @@ static int insertCell( assert( idx >= pPage->cellOffset+2*pPage->nCell+2 || CORRUPT_DB ); assert( idx+sz <= (int)pPage->pBt->usableSize ); pPage->nFree -= (u16)(2 + sz); - if( iChild ){ - /* In a corrupt database where an entry in the cell index section of - ** a btree page has a value of 3 or less, the pCell value might point - ** as many as 4 bytes in front of the start of the aData buffer for - ** the source page. Make sure this does not cause problems by not - ** reading the first 4 bytes */ - memcpy(&data[idx+4], pCell+4, sz-4); - put4byte(&data[idx], iChild); - }else{ - memcpy(&data[idx], pCell, sz); - } + memcpy(&data[idx], pCell, sz); pIns = pPage->aCellIdx + i*2; memmove(pIns+2, pIns, 2*(pPage->nCell - i)); put2byte(pIns, idx); @@ -75724,12 +78245,14 @@ static int rebuildPage( int k; /* Current slot in pCArray->apEnd[] */ u8 *pSrcEnd; /* Current pCArray->apEnd[k] value */ + assert( nCell>0 ); assert( i(u32)usableSize ){ j = 0; } memcpy(&pTmp[j], &aData[j], usableSize - j); - for(k=0; pCArray->ixNx[k]<=i && ALWAYS(kixNx[NB*2-1]>i ); + for(k=0; pCArray->ixNx[k]<=i; k++){} pSrcEnd = pCArray->apEnd[k]; pData = pEnd; @@ -75792,7 +78315,7 @@ static int rebuildPage( ** Finally, argument pBegin points to the byte immediately following the ** end of the space required by this page for the cell-pointer area (for ** all cells - not just those inserted by the current call). If the content -** area must be extended to before this point in order to accomodate all +** area must be extended to before this point in order to accommodate all ** cells in apCell[], then the cells do not fit and non-zero is returned. */ static int pageInsertArray( @@ -75812,7 +78335,8 @@ static int pageInsertArray( u8 *pEnd; /* Maximum extent of cell data */ assert( CORRUPT_DB || pPg->hdrOffset==0 ); /* Never called on page 1 */ if( iEnd<=iFirst ) return 0; - for(k=0; pCArray->ixNx[k]<=i && ALWAYS(kixNx[NB*2-1]>i ); + for(k=0; pCArray->ixNx[k]<=i ; k++){} pEnd = pCArray->apEnd[k]; while( 1 /*Exit by break*/ ){ int sz, rc; @@ -75870,42 +78394,50 @@ static int pageFreeArray( u8 * const pEnd = &aData[pPg->pBt->usableSize]; u8 * const pStart = &aData[pPg->hdrOffset + 8 + pPg->childPtrSize]; int nRet = 0; - int i; + int i, j; int iEnd = iFirst + nCell; - u8 *pFree = 0; /* \__ Parameters for pending call to */ - int szFree = 0; /* / freeSpace() */ + int nFree = 0; + int aOfst[10]; + int aAfter[10]; for(i=iFirst; iapCell[i]; if( SQLITE_WITHIN(pCell, pStart, pEnd) ){ int sz; + int iAfter; + int iOfst; /* No need to use cachedCellSize() here. The sizes of all cells that ** are to be freed have already been computing while deciding which ** cells need freeing */ sz = pCArray->szCell[i]; assert( sz>0 ); - if( pFree!=(pCell + sz) ){ - if( pFree ){ - assert( pFree>aData && (pFree - aData)<65536 ); - freeSpace(pPg, (u16)(pFree - aData), szFree); - } - pFree = pCell; - szFree = sz; - if( pFree+sz>pEnd ){ - return 0; + iOfst = (u16)(pCell - aData); + iAfter = iOfst+sz; + for(j=0; j=nFree ){ + if( nFree>=(int)(sizeof(aOfst)/sizeof(aOfst[0])) ){ + for(j=0; jpEnd ) return 0; + nFree++; } nRet++; } } - if( pFree ){ - assert( pFree>aData && (pFree - aData)<65536 ); - freeSpace(pPg, (u16)(pFree - aData), szFree); + for(j=0; jpPg->aDataEnd ) goto editpage_fail; + if( NEVER(pData>pPg->aDataEnd) ) goto editpage_fail; /* Add cells to the start of the page */ if( iNewaDataEnd; b.ixNx[0] = 2; + b.ixNx[NB*2-1] = 0x7fffffff; rc = rebuildPage(&b, 0, 1, pNew); if( NEVER(rc) ){ releasePage(pNew); @@ -76099,7 +78633,7 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ ** with entries for the new page, and any pointer from the ** cell on the page to an overflow page. If either of these ** operations fails, the return code is set, but the contents - ** of the parent page are still manipulated by thh code below. + ** of the parent page are still manipulated by the code below. ** That is Ok, at this point the parent page is guaranteed to ** be marked as dirty. Returning an error code will cause a ** rollback, undoing any changes made to the parent page. @@ -76323,7 +78857,9 @@ static int balance_nonroot( CellArray b; /* Parsed information on cells being balanced */ memset(abDone, 0, sizeof(abDone)); - memset(&b, 0, sizeof(b)); + assert( sizeof(b) - sizeof(b.ixNx) == offsetof(CellArray,ixNx) ); + memset(&b, 0, sizeof(b)-sizeof(b.ixNx[0])); + b.ixNx[NB*2-1] = 0x7fffffff; pBt = pParent->pBt; assert( sqlite3_mutex_held(pBt->mutex) ); assert( sqlite3PagerIswriteable(pParent->pDbPage) ); @@ -76375,7 +78911,7 @@ static int balance_nonroot( pgno = get4byte(pRight); while( 1 ){ if( rc==SQLITE_OK ){ - rc = getAndInitPage(pBt, pgno, &apOld[i], 0, 0); + rc = getAndInitPage(pBt, pgno, &apOld[i], 0); } if( rc ){ memset(apOld, 0, (i+1)*sizeof(MemPage*)); @@ -76482,7 +79018,7 @@ static int balance_nonroot( ** table-interior, index-leaf, or index-interior). */ if( pOld->aData[0]!=apOld[0]->aData[0] ){ - rc = SQLITE_CORRUPT_BKPT; + rc = SQLITE_CORRUPT_PAGE(pOld); goto balance_cleanup; } @@ -76506,7 +79042,7 @@ static int balance_nonroot( memset(&b.szCell[b.nCell], 0, sizeof(b.szCell[0])*(limit+pOld->nOverflow)); if( pOld->nOverflow>0 ){ if( NEVER(limitaiOvfl[0]) ){ - rc = SQLITE_CORRUPT_BKPT; + rc = SQLITE_CORRUPT_PAGE(pOld); goto balance_cleanup; } limit = pOld->aiOvfl[0]; @@ -76689,7 +79225,7 @@ static int balance_nonroot( } } - /* Sanity check: For a non-corrupt database file one of the follwing + /* Sanity check: For a non-corrupt database file one of the following ** must be true: ** (1) We found one or more cells (cntNew[0])>0), or ** (2) pPage is a virtual root page. A virtual root page is when @@ -76697,7 +79233,7 @@ static int balance_nonroot( ** that page. */ assert( cntNew[0]>0 || (pParent->pgno==1 && pParent->nCell==0) || CORRUPT_DB); - TRACE(("BALANCE: old: %d(nc=%d) %d(nc=%d) %d(nc=%d)\n", + TRACE(("BALANCE: old: %u(nc=%u) %u(nc=%u) %u(nc=%u)\n", apOld[0]->pgno, apOld[0]->nCell, nOld>=2 ? apOld[1]->pgno : 0, nOld>=2 ? apOld[1]->nCell : 0, nOld>=3 ? apOld[2]->pgno : 0, nOld>=3 ? apOld[2]->nCell : 0 @@ -76781,8 +79317,8 @@ static int balance_nonroot( } } - TRACE(("BALANCE: new: %d(%d nc=%d) %d(%d nc=%d) %d(%d nc=%d) " - "%d(%d nc=%d) %d(%d nc=%d)\n", + TRACE(("BALANCE: new: %u(%u nc=%u) %u(%u nc=%u) %u(%u nc=%u) " + "%u(%u nc=%u) %u(%u nc=%u)\n", apNew[0]->pgno, szNew[0], cntNew[0], nNew>=2 ? apNew[1]->pgno : 0, nNew>=2 ? szNew[1] : 0, nNew>=2 ? cntNew[1] - cntNew[0] - !leafData : 0, @@ -76914,9 +79450,10 @@ static int balance_nonroot( iOvflSpace += sz; assert( sz<=pBt->maxLocal+23 ); assert( iOvflSpace <= (int)pBt->pageSize ); - for(k=0; b.ixNx[k]<=j && ALWAYS(kj ); + for(k=0; b.ixNx[k]<=j; k++){} pSrcEnd = b.apEnd[k]; - if( SQLITE_WITHIN(pSrcEnd, pCell, pCell+sz) ){ + if( SQLITE_OVERFLOW(pSrcEnd, pCell, pCell+sz) ){ rc = SQLITE_CORRUPT_BKPT; goto balance_cleanup; } @@ -76950,6 +79487,8 @@ static int balance_nonroot( for(i=1-nNew; i=0 && iPg=1 || i>=0 ); + assert( iPg=0 /* On the upwards pass, or... */ || cntOld[iPg-1]>=cntNew[iPg-1] /* Condition (1) is true */ @@ -77027,7 +79566,7 @@ static int balance_nonroot( } assert( pParent->isInit ); - TRACE(("BALANCE: finished: old=%d new=%d cells=%d\n", + TRACE(("BALANCE: finished: old=%u new=%u cells=%u\n", nOld, nNew, b.nCell)); /* Free any old pages that were not reused as new pages. @@ -77112,7 +79651,7 @@ static int balance_deeper(MemPage *pRoot, MemPage **ppChild){ assert( sqlite3PagerIswriteable(pRoot->pDbPage) ); assert( pChild->nCell==pRoot->nCell || CORRUPT_DB ); - TRACE(("BALANCE: copy root %d into %d\n", pRoot->pgno, pChild->pgno)); + TRACE(("BALANCE: copy root %u into %u\n", pRoot->pgno, pChild->pgno)); /* Copy the overflow cells from pRoot to pChild */ memcpy(pChild->aiOvfl, pRoot->aiOvfl, @@ -77147,7 +79686,7 @@ static int anotherValidCursor(BtCursor *pCur){ && pOther->eState==CURSOR_VALID && pOther->pPage==pCur->pPage ){ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PAGE(pCur->pPage); } } return SQLITE_OK; @@ -77207,7 +79746,7 @@ static int balance(BtCursor *pCur){ /* The page being written is not a root page, and there is currently ** more than one reference to it. This only happens if the page is one ** of its own ancestor pages. Corruption. */ - rc = SQLITE_CORRUPT_BKPT; + rc = SQLITE_CORRUPT_PAGE(pPage); }else{ MemPage * const pParent = pCur->apPage[iPage-1]; int const iIdx = pCur->aiIdx[iPage-1]; @@ -77306,7 +79845,7 @@ static int btreeOverwriteContent( ){ int nData = pX->nData - iOffset; if( nData<=0 ){ - /* Overwritting with zeros */ + /* Overwriting with zeros */ int i; for(i=0; ipData to write */ @@ -77371,7 +79910,7 @@ static SQLITE_NOINLINE int btreeOverwriteOverflowCell( rc = btreeGetPage(pBt, ovflPgno, &pPage, 0); if( rc ) return rc; if( sqlite3PagerPageRefcount(pPage->pDbPage)!=1 || pPage->isInit ){ - rc = SQLITE_CORRUPT_BKPT; + rc = SQLITE_CORRUPT_PAGE(pPage); }else{ if( iOffset+ovflPageSize<(u32)nTotal ){ ovflPgno = get4byte(pPage->aData); @@ -77399,7 +79938,7 @@ static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){ if( pCur->info.pPayload + pCur->info.nLocal > pPage->aDataEnd || pCur->info.pPayload < pPage->aData + pPage->cellOffset ){ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PAGE(pPage); } if( pCur->info.nLocal==nTotal ){ /* The entire cell is local */ @@ -77480,7 +80019,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( ** Which can only happen if the SQLITE_NoSchemaError flag was set when ** the schema was loaded. This cannot be asserted though, as a user might ** set the flag, load the schema, and then unset the flag. */ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PGNO(pCur->pgnoRoot); } } @@ -77595,7 +80134,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( } } assert( pCur->eState==CURSOR_VALID - || (pCur->eState==CURSOR_INVALID && loc) ); + || (pCur->eState==CURSOR_INVALID && loc) || CORRUPT_DB ); pPage = pCur->pPage; assert( pPage->intKey || pX->nKey>=0 || (flags & BTREE_PREFORMAT) ); @@ -77603,14 +80142,14 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( if( pPage->nFree<0 ){ if( NEVER(pCur->eState>CURSOR_INVALID) ){ /* ^^^^^--- due to the moveToRoot() call above */ - rc = SQLITE_CORRUPT_BKPT; + rc = SQLITE_CORRUPT_PAGE(pPage); }else{ rc = btreeComputeFreeSpace(pPage); } if( rc ) return rc; } - TRACE(("INSERT: table=%d nkey=%lld ndata=%d page=%d %s\n", + TRACE(("INSERT: table=%u nkey=%lld ndata=%u page=%u %s\n", pCur->pgnoRoot, pX->nKey, pX->nData, pPage->pgno, loc==0 ? "overwrite" : "new entry")); assert( pPage->isInit || CORRUPT_DB ); @@ -77620,7 +80159,10 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( if( flags & BTREE_PREFORMAT ){ rc = SQLITE_OK; szNew = p->pBt->nPreformatSize; - if( szNew<4 ) szNew = 4; + if( szNew<4 ){ + szNew = 4; + newCell[3] = 0; + } if( ISAUTOVACUUM(p->pBt) && szNew>pPage->maxLocal ){ CellInfo info; pPage->xParseCell(pPage, newCell, &info); @@ -77642,7 +80184,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( CellInfo info; assert( idx>=0 ); if( idx>=pPage->nCell ){ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PAGE(pPage); } rc = sqlite3PagerWrite(pPage->pDbPage); if( rc ){ @@ -77669,10 +80211,10 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( ** necessary to add the PTRMAP_OVERFLOW1 pointer-map entry. */ assert( rc==SQLITE_OK ); /* clearCell never fails when nLocal==nPayload */ if( oldCell < pPage->aData+pPage->hdrOffset+10 ){ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PAGE(pPage); } if( oldCell+szNew > pPage->aDataEnd ){ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PAGE(pPage); } memcpy(oldCell, newCell, szNew); return SQLITE_OK; @@ -77682,11 +80224,11 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( }else if( loc<0 && pPage->nCell>0 ){ assert( pPage->leaf ); idx = ++pCur->ix; - pCur->curFlags &= ~BTCF_ValidNKey; + pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); }else{ assert( pPage->leaf ); } - rc = insertCell(pPage, idx, newCell, szNew, 0, 0); + rc = insertCellFast(pPage, idx, newCell, szNew); assert( pPage->nOverflow==0 || rc==SQLITE_OK ); assert( rc!=SQLITE_OK || pPage->nCell>0 || pPage->nOverflow>0 ); @@ -77712,7 +80254,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( */ if( pPage->nOverflow ){ assert( rc==SQLITE_OK ); - pCur->curFlags &= ~(BTCF_ValidNKey); + pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); rc = balance(pCur); /* Must make sure nOverflow is reset to zero even if the balance() @@ -77774,7 +80316,7 @@ SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor *pDest, BtCursor *pSrc, i64 nIn = pSrc->info.nLocal; aIn = pSrc->info.pPayload; if( aIn+nIn>pSrc->pPage->aDataEnd ){ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PAGE(pSrc->pPage); } nRem = pSrc->info.nPayload; if( nIn==nRem && nInpPage->maxLocal ){ @@ -77799,7 +80341,7 @@ SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor *pDest, BtCursor *pSrc, i64 if( nRem>nIn ){ if( aIn+nIn+4>pSrc->pPage->aDataEnd ){ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PAGE(pSrc->pPage); } ovflIn = get4byte(&pSrc->info.pPayload[nIn]); } @@ -77895,7 +80437,7 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ assert( rc!=SQLITE_OK || CORRUPT_DB || pCur->eState==CURSOR_VALID ); if( rc || pCur->eState!=CURSOR_VALID ) return rc; }else{ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PGNO(pCur->pgnoRoot); } } assert( pCur->eState==CURSOR_VALID ); @@ -77904,11 +80446,14 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ iCellIdx = pCur->ix; pPage = pCur->pPage; if( pPage->nCell<=iCellIdx ){ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PAGE(pPage); } pCell = findCell(pPage, iCellIdx); if( pPage->nFree<0 && btreeComputeFreeSpace(pPage) ){ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PAGE(pPage); + } + if( pCell<&pPage->aCellIdx[pPage->nCell] ){ + return SQLITE_CORRUPT_PAGE(pPage); } /* If the BTREE_SAVEPOSITION bit is on, then the cursor position must @@ -77999,7 +80544,7 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ n = pCur->pPage->pgno; } pCell = findCell(pLeaf, pLeaf->nCell-1); - if( pCell<&pLeaf->aData[4] ) return SQLITE_CORRUPT_BKPT; + if( pCell<&pLeaf->aData[4] ) return SQLITE_CORRUPT_PAGE(pLeaf); nCell = pLeaf->xCellSize(pLeaf, pCell); assert( MX_CELL_SIZE(pBt) >= nCell ); pTmp = pBt->pTmpSpace; @@ -78086,7 +80631,7 @@ static int btreeCreateTable(Btree *p, Pgno *piTable, int createTabFlags){ MemPage *pRoot; Pgno pgnoRoot; int rc; - int ptfFlags; /* Page-type flage for the root page of new table */ + int ptfFlags; /* Page-type flags for the root page of new table */ assert( sqlite3BtreeHoldsMutex(p) ); assert( pBt->inTransaction==TRANS_WRITE ); @@ -78115,7 +80660,7 @@ static int btreeCreateTable(Btree *p, Pgno *piTable, int createTabFlags){ */ sqlite3BtreeGetMeta(p, BTREE_LARGEST_ROOT_PAGE, &pgnoRoot); if( pgnoRoot>btreePagecount(pBt) ){ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PGNO(pgnoRoot); } pgnoRoot++; @@ -78163,7 +80708,7 @@ static int btreeCreateTable(Btree *p, Pgno *piTable, int createTabFlags){ } rc = ptrmapGet(pBt, pgnoRoot, &eType, &iPtrPage); if( eType==PTRMAP_ROOTPAGE || eType==PTRMAP_FREEPAGE ){ - rc = SQLITE_CORRUPT_BKPT; + rc = SQLITE_CORRUPT_PGNO(pgnoRoot); } if( rc!=SQLITE_OK ){ releasePage(pRoot); @@ -78253,14 +80798,14 @@ static int clearDatabasePage( assert( sqlite3_mutex_held(pBt->mutex) ); if( pgno>btreePagecount(pBt) ){ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PGNO(pgno); } - rc = getAndInitPage(pBt, pgno, &pPage, 0, 0); + rc = getAndInitPage(pBt, pgno, &pPage, 0); if( rc ) return rc; if( (pBt->openFlags & BTREE_SINGLE)==0 && sqlite3PagerPageRefcount(pPage->pDbPage) != (1 + (pgno==1)) ){ - rc = SQLITE_CORRUPT_BKPT; + rc = SQLITE_CORRUPT_PAGE(pPage); goto cleardatabasepage_out; } hdr = pPage->hdrOffset; @@ -78364,7 +80909,7 @@ static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){ assert( p->inTrans==TRANS_WRITE ); assert( iTable>=2 ); if( iTable>btreePagecount(pBt) ){ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PGNO(iTable); } rc = sqlite3BtreeClearTable(p, iTable, 0); @@ -78658,7 +81203,8 @@ static void checkAppendMsg( sqlite3_str_append(&pCheck->errMsg, "\n", 1); } if( pCheck->zPfx ){ - sqlite3_str_appendf(&pCheck->errMsg, pCheck->zPfx, pCheck->v1, pCheck->v2); + sqlite3_str_appendf(&pCheck->errMsg, pCheck->zPfx, + pCheck->v0, pCheck->v1, pCheck->v2); } sqlite3_str_vappendf(&pCheck->errMsg, zFormat, ap); va_end(ap); @@ -78675,7 +81221,8 @@ static void checkAppendMsg( ** corresponds to page iPg is already set. */ static int getPageReferenced(IntegrityCk *pCheck, Pgno iPg){ - assert( iPg<=pCheck->nPage && sizeof(pCheck->aPgRef[0])==1 ); + assert( pCheck->aPgRef!=0 ); + assert( iPg<=pCheck->nCkPage && sizeof(pCheck->aPgRef[0])==1 ); return (pCheck->aPgRef[iPg/8] & (1 << (iPg & 0x07))); } @@ -78683,7 +81230,8 @@ static int getPageReferenced(IntegrityCk *pCheck, Pgno iPg){ ** Set the bit in the IntegrityCk.aPgRef[] array that corresponds to page iPg. */ static void setPageReferenced(IntegrityCk *pCheck, Pgno iPg){ - assert( iPg<=pCheck->nPage && sizeof(pCheck->aPgRef[0])==1 ); + assert( pCheck->aPgRef!=0 ); + assert( iPg<=pCheck->nCkPage && sizeof(pCheck->aPgRef[0])==1 ); pCheck->aPgRef[iPg/8] |= (1 << (iPg & 0x07)); } @@ -78697,12 +81245,12 @@ static void setPageReferenced(IntegrityCk *pCheck, Pgno iPg){ ** Also check that the page number is in bounds. */ static int checkRef(IntegrityCk *pCheck, Pgno iPage){ - if( iPage>pCheck->nPage || iPage==0 ){ - checkAppendMsg(pCheck, "invalid page number %d", iPage); + if( iPage>pCheck->nCkPage || iPage==0 ){ + checkAppendMsg(pCheck, "invalid page number %u", iPage); return 1; } if( getPageReferenced(pCheck, iPage) ){ - checkAppendMsg(pCheck, "2nd reference to page %d", iPage); + checkAppendMsg(pCheck, "2nd reference to page %u", iPage); return 1; } setPageReferenced(pCheck, iPage); @@ -78728,13 +81276,13 @@ static void checkPtrmap( rc = ptrmapGet(pCheck->pBt, iChild, &ePtrmapType, &iPtrmapParent); if( rc!=SQLITE_OK ){ if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ) checkOom(pCheck); - checkAppendMsg(pCheck, "Failed to read ptrmap key=%d", iChild); + checkAppendMsg(pCheck, "Failed to read ptrmap key=%u", iChild); return; } if( ePtrmapType!=eType || iPtrmapParent!=iParent ){ checkAppendMsg(pCheck, - "Bad ptr map entry key=%d expected=(%d,%d) got=(%d,%d)", + "Bad ptr map entry key=%u expected=(%u,%u) got=(%u,%u)", iChild, eType, iParent, ePtrmapType, iPtrmapParent); } } @@ -78759,7 +81307,7 @@ static void checkList( if( checkRef(pCheck, iPage) ) break; N--; if( sqlite3PagerGet(pCheck->pPager, (Pgno)iPage, &pOvflPage, 0) ){ - checkAppendMsg(pCheck, "failed to get page %d", iPage); + checkAppendMsg(pCheck, "failed to get page %u", iPage); break; } pOvflData = (unsigned char *)sqlite3PagerGetData(pOvflPage); @@ -78772,7 +81320,7 @@ static void checkList( #endif if( n>pCheck->pBt->usableSize/4-2 ){ checkAppendMsg(pCheck, - "freelist leaf count too big on page %d", iPage); + "freelist leaf count too big on page %u", iPage); N--; }else{ for(i=0; i<(int)n; i++){ @@ -78804,7 +81352,7 @@ static void checkList( } if( N && nErrAtStart==pCheck->nErr ){ checkAppendMsg(pCheck, - "%s is %d but should be %d", + "%s is %u but should be %u", isFreeList ? "size" : "overflow list length", expected-N, expected); } @@ -78919,11 +81467,12 @@ static int checkTreePage( usableSize = pBt->usableSize; if( iPage==0 ) return 0; if( checkRef(pCheck, iPage) ) return 0; - pCheck->zPfx = "Page %u: "; + pCheck->zPfx = "Tree %u page %u: "; pCheck->v1 = iPage; if( (rc = btreeGetPage(pBt, iPage, &pPage, 0))!=0 ){ checkAppendMsg(pCheck, "unable to get the page. error code=%d", rc); + if( rc==SQLITE_IOERR_NOMEM ) pCheck->rc = SQLITE_NOMEM; goto end_of_check; } @@ -78946,7 +81495,7 @@ static int checkTreePage( hdr = pPage->hdrOffset; /* Set up for cell analysis */ - pCheck->zPfx = "On tree page %u cell %d: "; + pCheck->zPfx = "Tree %u page %u cell %u: "; contentOffset = get2byteNotZero(&data[hdr+5]); assert( contentOffset<=usableSize ); /* Enforced by btreeInitPage() */ @@ -78954,6 +81503,9 @@ static int checkTreePage( ** number of cells on the page. */ nCell = get2byte(&data[hdr+3]); assert( pPage->nCell==nCell ); + if( pPage->leaf || pPage->intKey==0 ){ + pCheck->nRow += nCell; + } /* EVIDENCE-OF: R-23882-45353 The cell pointer array of a b-tree page ** immediately follows the b-tree page header. */ @@ -78966,7 +81518,7 @@ static int checkTreePage( pgno = get4byte(&data[hdr+8]); #ifndef SQLITE_OMIT_AUTOVACUUM if( pBt->autoVacuum ){ - pCheck->zPfx = "On page %u at right child: "; + pCheck->zPfx = "Tree %u page %u right child: "; checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage); } #endif @@ -78990,7 +81542,7 @@ static int checkTreePage( pc = get2byteAligned(pCellIdx); pCellIdx -= 2; if( pcusableSize-4 ){ - checkAppendMsg(pCheck, "Offset %d out of range %d..%d", + checkAppendMsg(pCheck, "Offset %u out of range %u..%u", pc, contentOffset, usableSize-4); doCoverageCheck = 0; continue; @@ -79065,6 +81617,7 @@ static int checkTreePage( btreeHeapInsert(heap, (pc<<16)|(pc+size-1)); } } + assert( heap!=0 ); /* Add the freeblocks to the min-heap ** ** EVIDENCE-OF: R-20690-50594 The second field of the b-tree page header @@ -79122,7 +81675,7 @@ static int checkTreePage( */ if( heap[0]==0 && nFrag!=data[hdr+7] ){ checkAppendMsg(pCheck, - "Fragmentation of %d bytes reported as %d on page %u", + "Fragmentation of %u bytes reported as %u on page %u", nFrag, data[hdr+7], iPage); } } @@ -79164,6 +81717,7 @@ SQLITE_PRIVATE int sqlite3BtreeIntegrityCheck( sqlite3 *db, /* Database connection that is running the check */ Btree *p, /* The btree to be checked */ Pgno *aRoot, /* An array of root pages numbers for individual trees */ + Mem *aCnt, /* Memory cells to write counts for each tree to */ int nRoot, /* Number of entries in aRoot[] */ int mxErr, /* Stop reporting errors after this many */ int *pnErr, /* OUT: Write number of errors seen to this variable */ @@ -79177,7 +81731,9 @@ SQLITE_PRIVATE int sqlite3BtreeIntegrityCheck( int bPartial = 0; /* True if not checking all btrees */ int bCkFreelist = 1; /* True to scan the freelist */ VVA_ONLY( int nRef ); + assert( nRoot>0 ); + assert( aCnt!=0 ); /* aRoot[0]==0 means this is a partial check */ if( aRoot[0]==0 ){ @@ -79194,15 +81750,15 @@ SQLITE_PRIVATE int sqlite3BtreeIntegrityCheck( sCheck.db = db; sCheck.pBt = pBt; sCheck.pPager = pBt->pPager; - sCheck.nPage = btreePagecount(sCheck.pBt); + sCheck.nCkPage = btreePagecount(sCheck.pBt); sCheck.mxErr = mxErr; sqlite3StrAccumInit(&sCheck.errMsg, 0, zErr, sizeof(zErr), SQLITE_MAX_LENGTH); sCheck.errMsg.printfFlags = SQLITE_PRINTF_INTERNAL; - if( sCheck.nPage==0 ){ + if( sCheck.nCkPage==0 ){ goto integrity_ck_cleanup; } - sCheck.aPgRef = sqlite3MallocZero((sCheck.nPage / 8)+ 1); + sCheck.aPgRef = sqlite3MallocZero((sCheck.nCkPage / 8)+ 1); if( !sCheck.aPgRef ){ checkOom(&sCheck); goto integrity_ck_cleanup; @@ -79214,12 +81770,12 @@ SQLITE_PRIVATE int sqlite3BtreeIntegrityCheck( } i = PENDING_BYTE_PAGE(pBt); - if( i<=sCheck.nPage ) setPageReferenced(&sCheck, i); + if( i<=sCheck.nCkPage ) setPageReferenced(&sCheck, i); /* Check the integrity of the freelist */ if( bCkFreelist ){ - sCheck.zPfx = "Main freelist: "; + sCheck.zPfx = "Freelist: "; checkList(&sCheck, 1, get4byte(&pBt->pPage1->aData[32]), get4byte(&pBt->pPage1->aData[36])); sCheck.zPfx = 0; @@ -79236,7 +81792,7 @@ SQLITE_PRIVATE int sqlite3BtreeIntegrityCheck( mxInHdr = get4byte(&pBt->pPage1->aData[52]); if( mx!=mxInHdr ){ checkAppendMsg(&sCheck, - "max rootpage (%d) disagrees with header (%d)", + "max rootpage (%u) disagrees with header (%u)", mx, mxInHdr ); } @@ -79250,24 +81806,28 @@ SQLITE_PRIVATE int sqlite3BtreeIntegrityCheck( testcase( pBt->db->flags & SQLITE_CellSizeCk ); pBt->db->flags &= ~(u64)SQLITE_CellSizeCk; for(i=0; (int)iautoVacuum && aRoot[i]>1 && !bPartial ){ - checkPtrmap(&sCheck, aRoot[i], PTRMAP_ROOTPAGE, 0); - } + if( pBt->autoVacuum && aRoot[i]>1 && !bPartial ){ + checkPtrmap(&sCheck, aRoot[i], PTRMAP_ROOTPAGE, 0); + } #endif - checkTreePage(&sCheck, aRoot[i], ¬Used, LARGEST_INT64); + sCheck.v0 = aRoot[i]; + checkTreePage(&sCheck, aRoot[i], ¬Used, LARGEST_INT64); + } + sqlite3MemSetArrayInt64(aCnt, i, sCheck.nRow); } pBt->db->flags = savedDbFlags; /* Make sure every page in the file is referenced */ if( !bPartial ){ - for(i=1; i<=sCheck.nPage && sCheck.mxErr; i++){ + for(i=1; i<=sCheck.nCkPage && sCheck.mxErr; i++){ #ifdef SQLITE_OMIT_AUTOVACUUM if( getPageReferenced(&sCheck, i)==0 ){ - checkAppendMsg(&sCheck, "Page %d is never used", i); + checkAppendMsg(&sCheck, "Page %u: never used", i); } #else /* If the database supports auto-vacuum, make sure no tables contain @@ -79275,11 +81835,11 @@ SQLITE_PRIVATE int sqlite3BtreeIntegrityCheck( */ if( getPageReferenced(&sCheck, i)==0 && (PTRMAP_PAGENO(pBt, i)!=i || !pBt->autoVacuum) ){ - checkAppendMsg(&sCheck, "Page %d is never used", i); + checkAppendMsg(&sCheck, "Page %u: never used", i); } if( getPageReferenced(&sCheck, i)!=0 && (PTRMAP_PAGENO(pBt, i)==i && pBt->autoVacuum) ){ - checkAppendMsg(&sCheck, "Pointer map page %d is referenced", i); + checkAppendMsg(&sCheck, "Page %u: pointer map referenced", i); } #endif } @@ -79841,13 +82401,7 @@ static int backupOnePage( assert( !isFatalError(p->rc) ); assert( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) ); assert( zSrcData ); - - /* Catch the case where the destination is an in-memory database and the - ** page sizes of the source and destination differ. - */ - if( nSrcPgsz!=nDestPgsz && sqlite3PagerIsMemdb(pDestPager) ){ - rc = SQLITE_READONLY; - } + assert( nSrcPgsz==nDestPgsz || sqlite3PagerIsMemdb(pDestPager)==0 ); /* This loop runs once for each destination page spanned by the source ** page. For each iteration, variable iOff is set to the byte offset @@ -79980,7 +82534,10 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ pgszSrc = sqlite3BtreeGetPageSize(p->pSrc); pgszDest = sqlite3BtreeGetPageSize(p->pDest); destMode = sqlite3PagerGetJournalMode(sqlite3BtreePager(p->pDest)); - if( SQLITE_OK==rc && destMode==PAGER_JOURNALMODE_WAL && pgszSrc!=pgszDest ){ + if( SQLITE_OK==rc + && (destMode==PAGER_JOURNALMODE_WAL || sqlite3PagerIsMemdb(pDestPager)) + && pgszSrc!=pgszDest + ){ rc = SQLITE_READONLY; } @@ -80529,6 +83086,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemValidStrRep(Mem *p){ char *z; int i, j, incr; if( (p->flags & MEM_Str)==0 ) return 1; + if( p->db && p->db->mallocFailed ) return 1; if( p->flags & MEM_Term ){ /* Insure that the string is properly zero-terminated. Pay particular ** attention to the case where p->n is odd */ @@ -80685,6 +83243,40 @@ SQLITE_PRIVATE int sqlite3VdbeMemClearAndResize(Mem *pMem, int szNew){ return SQLITE_OK; } +/* +** If pMem is already a string, detect if it is a zero-terminated +** string, or make it into one if possible, and mark it as such. +** +** This is an optimization. Correct operation continues even if +** this routine is a no-op. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemZeroTerminateIfAble(Mem *pMem){ + if( (pMem->flags & (MEM_Str|MEM_Term|MEM_Ephem|MEM_Static))!=MEM_Str ){ + /* pMem must be a string, and it cannot be an ephemeral or static string */ + return; + } + if( pMem->enc!=SQLITE_UTF8 ) return; + if( NEVER(pMem->z==0) ) return; + if( pMem->flags & MEM_Dyn ){ + if( pMem->xDel==sqlite3_free + && sqlite3_msize(pMem->z) >= (u64)(pMem->n+1) + ){ + pMem->z[pMem->n] = 0; + pMem->flags |= MEM_Term; + return; + } + if( pMem->xDel==sqlite3RCStrUnref ){ + /* Blindly assume that all RCStr objects are zero-terminated */ + pMem->flags |= MEM_Term; + return; + } + }else if( pMem->szMalloc >= pMem->n+1 ){ + pMem->z[pMem->n] = 0; + pMem->flags |= MEM_Term; + return; + } +} + /* ** It is already known that pMem contains an unterminated string. ** Add the zero terminator. @@ -80811,7 +83403,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){ vdbeMemRenderNum(nByte, pMem->z, pMem); assert( pMem->z!=0 ); - assert( pMem->n==sqlite3Strlen30NN(pMem->z) ); + assert( pMem->n==(int)sqlite3Strlen30NN(pMem->z) ); pMem->enc = SQLITE_UTF8; pMem->flags |= MEM_Str|MEM_Term; if( bForce ) pMem->flags &= ~(MEM_Int|MEM_Real|MEM_IntReal); @@ -80946,36 +83538,6 @@ SQLITE_PRIVATE void sqlite3VdbeMemReleaseMalloc(Mem *p){ if( p->szMalloc ) vdbeMemClear(p); } -/* -** Convert a 64-bit IEEE double into a 64-bit signed integer. -** If the double is out of range of a 64-bit signed integer then -** return the closest available 64-bit signed integer. -*/ -static SQLITE_NOINLINE i64 doubleToInt64(double r){ -#ifdef SQLITE_OMIT_FLOATING_POINT - /* When floating-point is omitted, double and int64 are the same thing */ - return r; -#else - /* - ** Many compilers we encounter do not define constants for the - ** minimum and maximum 64-bit integers, or they define them - ** inconsistently. And many do not understand the "LL" notation. - ** So we define our own static constants here using nothing - ** larger than a 32-bit integer constant. - */ - static const i64 maxInt = LARGEST_INT64; - static const i64 minInt = SMALLEST_INT64; - - if( r<=(double)minInt ){ - return minInt; - }else if( r>=(double)maxInt ){ - return maxInt; - }else{ - return (i64)r; - } -#endif -} - /* ** Return some kind of integer value which is the best we can do ** at representing the value that *pMem describes as an integer. @@ -81002,7 +83564,7 @@ SQLITE_PRIVATE i64 sqlite3VdbeIntValue(const Mem *pMem){ testcase( flags & MEM_IntReal ); return pMem->u.i; }else if( flags & MEM_Real ){ - return doubleToInt64(pMem->u.r); + return sqlite3RealToI64(pMem->u.r); }else if( (flags & (MEM_Str|MEM_Blob))!=0 && pMem->z!=0 ){ return memIntValue(pMem); }else{ @@ -81064,7 +83626,7 @@ SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem *pMem){ if( pMem->flags & MEM_IntReal ){ MemSetTypeFlag(pMem, MEM_Int); }else{ - i64 ix = doubleToInt64(pMem->u.r); + i64 ix = sqlite3RealToI64(pMem->u.r); /* Only mark the value as an integer if ** @@ -81132,8 +83694,8 @@ SQLITE_PRIVATE int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){ ** from UBSAN. */ SQLITE_PRIVATE i64 sqlite3RealToI64(double r){ - if( r<=(double)SMALLEST_INT64 ) return SMALLEST_INT64; - if( r>=(double)LARGEST_INT64) return LARGEST_INT64; + if( r<-9223372036854774784.0 ) return SMALLEST_INT64; + if( r>+9223372036854774784.0 ) return LARGEST_INT64; return (i64)r; } @@ -81204,6 +83766,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemCast(Mem *pMem, u8 aff, u8 encoding){ break; } default: { + int rc; assert( aff==SQLITE_AFF_TEXT ); assert( MEM_Str==(MEM_Blob>>3) ); pMem->flags |= (pMem->flags&MEM_Blob)>>3; @@ -81211,7 +83774,9 @@ SQLITE_PRIVATE int sqlite3VdbeMemCast(Mem *pMem, u8 aff, u8 encoding){ assert( pMem->flags & MEM_Str || pMem->db->mallocFailed ); pMem->flags &= ~(MEM_Int|MEM_Real|MEM_IntReal|MEM_Blob|MEM_Zero); if( encoding!=SQLITE_UTF8 ) pMem->n &= ~1; - return sqlite3VdbeChangeEncoding(pMem, encoding); + rc = sqlite3VdbeChangeEncoding(pMem, encoding); + if( rc ) return rc; + sqlite3VdbeMemZeroTerminateIfAble(pMem); } } return SQLITE_OK; @@ -81307,6 +83872,13 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem *pMem, i64 val){ } } +/* +** Set the iIdx'th entry of array aMem[] to contain integer value val. +*/ +SQLITE_PRIVATE void sqlite3MemSetArrayInt64(sqlite3_value *aMem, int iIdx, i64 val){ + sqlite3VdbeMemSetInt64(&aMem[iIdx], val); +} + /* A no-op destructor */ SQLITE_PRIVATE void sqlite3NoopDestructor(void *p){ UNUSED_PARAMETER(p); } @@ -81735,6 +84307,24 @@ SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value* pVal, u8 enc){ return valueToText(pVal, enc); } +/* Return true if sqlit3_value object pVal is a string or blob value +** that uses the destructor specified in the second argument. +** +** TODO: Maybe someday promote this interface into a published API so +** that third-party extensions can get access to it? +*/ +SQLITE_PRIVATE int sqlite3ValueIsOfClass(const sqlite3_value *pVal, void(*xFree)(void*)){ + if( ALWAYS(pVal!=0) + && ALWAYS((pVal->flags & (MEM_Str|MEM_Blob))!=0) + && (pVal->flags & MEM_Dyn)!=0 + && pVal->xDel==xFree + ){ + return 1; + }else{ + return 0; + } +} + /* ** Create a new sqlite3_value object. */ @@ -81802,6 +84392,7 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ } pRec->nField = p->iVal+1; + sqlite3VdbeMemSetNull(&pRec->aMem[p->iVal]); return &pRec->aMem[p->iVal]; } #else @@ -81855,9 +84446,12 @@ static int valueFromFunction( if( pList ) nVal = pList->nExpr; assert( !ExprHasProperty(p, EP_IntValue) ); pFunc = sqlite3FindFunction(db, p->u.zToken, nVal, enc, 0); +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + if( pFunc==0 ) return SQLITE_OK; +#endif assert( pFunc ); if( (pFunc->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG))==0 - || (pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) + || (pFunc->funcFlags & (SQLITE_FUNC_NEEDCOLL|SQLITE_FUNC_RUNONLY))!=0 ){ return SQLITE_OK; } @@ -81869,7 +84463,8 @@ static int valueFromFunction( goto value_from_function_out; } for(i=0; ia[i].pExpr, enc, aff, &apVal[i]); + rc = sqlite3Stat4ValueFromExpr(pCtx->pParse, pList->a[i].pExpr, aff, + &apVal[i]); if( apVal[i]==0 || rc!=SQLITE_OK ) goto value_from_function_out; } } @@ -81891,16 +84486,11 @@ static int valueFromFunction( }else{ sqlite3ValueApplyAffinity(pVal, aff, SQLITE_UTF8); assert( rc==SQLITE_OK ); - assert( enc==pVal->enc - || (pVal->flags & MEM_Str)==0 - || db->mallocFailed ); -#if 0 /* Not reachable except after a prior failure */ rc = sqlite3VdbeChangeEncoding(pVal, enc); - if( rc==SQLITE_OK && sqlite3VdbeMemTooBig(pVal) ){ + if( NEVER(rc==SQLITE_OK && sqlite3VdbeMemTooBig(pVal)) ){ rc = SQLITE_TOOBIG; pCtx->pParse->nErr++; } -#endif } value_from_function_out: @@ -81964,6 +84554,13 @@ static int valueFromExpr( rc = valueFromExpr(db, pExpr->pLeft, enc, aff, ppVal, pCtx); testcase( rc!=SQLITE_OK ); if( *ppVal ){ +#ifdef SQLITE_ENABLE_STAT4 + rc = ExpandBlob(*ppVal); +#else + /* zero-blobs only come from functions, not literal values. And + ** functions are only processed under STAT4 */ + assert( (ppVal[0][0].flags & MEM_Zero)==0 ); +#endif sqlite3VdbeMemCast(*ppVal, aff, enc); sqlite3ValueApplyAffinity(*ppVal, affinity, enc); } @@ -81971,14 +84568,20 @@ static int valueFromExpr( } /* Handle negative integers in a single step. This is needed in the - ** case when the value is -9223372036854775808. - */ - if( op==TK_UMINUS - && (pExpr->pLeft->op==TK_INTEGER || pExpr->pLeft->op==TK_FLOAT) ){ - pExpr = pExpr->pLeft; - op = pExpr->op; - negInt = -1; - zNeg = "-"; + ** case when the value is -9223372036854775808. Except - do not do this + ** for hexadecimal literals. */ + if( op==TK_UMINUS ){ + Expr *pLeft = pExpr->pLeft; + if( (pLeft->op==TK_INTEGER || pLeft->op==TK_FLOAT) ){ + if( ExprHasProperty(pLeft, EP_IntValue) + || pLeft->u.zToken[0]!='0' || (pLeft->u.zToken[1] & ~0x20)!='X' + ){ + pExpr = pLeft; + op = pExpr->op; + negInt = -1; + zNeg = "-"; + } + } } if( op==TK_STRING || op==TK_FLOAT || op==TK_INTEGER ){ @@ -81987,12 +84590,26 @@ static int valueFromExpr( if( ExprHasProperty(pExpr, EP_IntValue) ){ sqlite3VdbeMemSetInt64(pVal, (i64)pExpr->u.iValue*negInt); }else{ - zVal = sqlite3MPrintf(db, "%s%s", zNeg, pExpr->u.zToken); - if( zVal==0 ) goto no_mem; - sqlite3ValueSetStr(pVal, -1, zVal, SQLITE_UTF8, SQLITE_DYNAMIC); + i64 iVal; + if( op==TK_INTEGER && 0==sqlite3DecOrHexToI64(pExpr->u.zToken, &iVal) ){ + sqlite3VdbeMemSetInt64(pVal, iVal*negInt); + }else{ + zVal = sqlite3MPrintf(db, "%s%s", zNeg, pExpr->u.zToken); + if( zVal==0 ) goto no_mem; + sqlite3ValueSetStr(pVal, -1, zVal, SQLITE_UTF8, SQLITE_DYNAMIC); + } } - if( (op==TK_INTEGER || op==TK_FLOAT ) && affinity==SQLITE_AFF_BLOB ){ - sqlite3ValueApplyAffinity(pVal, SQLITE_AFF_NUMERIC, SQLITE_UTF8); + if( affinity==SQLITE_AFF_BLOB ){ + if( op==TK_FLOAT ){ + assert( pVal && pVal->z && pVal->flags==(MEM_Str|MEM_Term) ); + sqlite3AtoF(pVal->z, &pVal->u.r, pVal->n, SQLITE_UTF8); + pVal->flags = MEM_Real; + }else if( op==TK_INTEGER ){ + /* This case is required by -9223372036854775808 and other strings + ** that look like integers but cannot be handled by the + ** sqlite3DecOrHexToI64() call above. */ + sqlite3ValueApplyAffinity(pVal, SQLITE_AFF_NUMERIC, SQLITE_UTF8); + } }else{ sqlite3ValueApplyAffinity(pVal, affinity, SQLITE_UTF8); } @@ -82056,6 +84673,7 @@ static int valueFromExpr( if( pVal ){ pVal->flags = MEM_Int; pVal->u.i = pExpr->u.zToken[4]==0; + sqlite3ValueApplyAffinity(pVal, affinity, enc); } } @@ -82261,17 +84879,17 @@ SQLITE_PRIVATE int sqlite3Stat4Column( sqlite3_value **ppVal /* OUT: Extracted value */ ){ u32 t = 0; /* a column type code */ - int nHdr; /* Size of the header in the record */ - int iHdr; /* Next unread header byte */ - int iField; /* Next unread data byte */ - int szField = 0; /* Size of the current data field */ + u32 nHdr; /* Size of the header in the record */ + u32 iHdr; /* Next unread header byte */ + i64 iField; /* Next unread data byte */ + u32 szField = 0; /* Size of the current data field */ int i; /* Column index */ u8 *a = (u8*)pRec; /* Typecast byte array */ Mem *pMem = *ppVal; /* Write result into this Mem object */ assert( iCol>0 ); iHdr = getVarint32(a, nHdr); - if( nHdr>nRec || iHdr>=nHdr ) return SQLITE_CORRUPT_BKPT; + if( nHdr>(u32)nRec || iHdr>=nHdr ) return SQLITE_CORRUPT_BKPT; iField = nHdr; for(i=0; i<=iCol; i++){ iHdr += getVarint32(&a[iHdr], t); @@ -82578,13 +85196,43 @@ static int growOpArray(Vdbe *v, int nOp){ ** sqlite3CantopenError(lineno) */ static void test_addop_breakpoint(int pc, Op *pOp){ - static int n = 0; + static u64 n = 0; (void)pc; (void)pOp; n++; + if( n==LARGEST_UINT64 ) abort(); /* so that n is used, preventing a warning */ } #endif +/* +** Slow paths for sqlite3VdbeAddOp3() and sqlite3VdbeAddOp4Int() for the +** unusual case when we need to increase the size of the Vdbe.aOp[] array +** before adding the new opcode. +*/ +static SQLITE_NOINLINE int growOp3(Vdbe *p, int op, int p1, int p2, int p3){ + assert( p->nOpAlloc<=p->nOp ); + if( growOpArray(p, 1) ) return 1; + assert( p->nOpAlloc>p->nOp ); + return sqlite3VdbeAddOp3(p, op, p1, p2, p3); +} +static SQLITE_NOINLINE int addOp4IntSlow( + Vdbe *p, /* Add the opcode to this VM */ + int op, /* The new opcode */ + int p1, /* The P1 operand */ + int p2, /* The P2 operand */ + int p3, /* The P3 operand */ + int p4 /* The P4 operand as an integer */ +){ + int addr = sqlite3VdbeAddOp3(p, op, p1, p2, p3); + if( p->db->mallocFailed==0 ){ + VdbeOp *pOp = &p->aOp[addr]; + pOp->p4type = P4_INT32; + pOp->p4.i = p4; + } + return addr; +} + + /* ** Add a new instruction to the list of instructions current in the ** VDBE. Return the address of the new instruction. @@ -82595,17 +85243,16 @@ static void test_addop_breakpoint(int pc, Op *pOp){ ** ** op The opcode for this instruction ** -** p1, p2, p3 Operands -** -** Use the sqlite3VdbeResolveLabel() function to fix an address and -** the sqlite3VdbeChangeP4() function to change the value of the P4 -** operand. +** p1, p2, p3, p4 Operands */ -static SQLITE_NOINLINE int growOp3(Vdbe *p, int op, int p1, int p2, int p3){ - assert( p->nOpAlloc<=p->nOp ); - if( growOpArray(p, 1) ) return 1; - assert( p->nOpAlloc>p->nOp ); - return sqlite3VdbeAddOp3(p, op, p1, p2, p3); +SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe *p, int op){ + return sqlite3VdbeAddOp3(p, op, 0, 0, 0); +} +SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe *p, int op, int p1){ + return sqlite3VdbeAddOp3(p, op, p1, 0, 0); +} +SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe *p, int op, int p1, int p2){ + return sqlite3VdbeAddOp3(p, op, p1, p2, 0); } SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ int i; @@ -82628,6 +85275,9 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ pOp->p3 = p3; pOp->p4.p = 0; pOp->p4type = P4_NOTUSED; + + /* Replicate this logic in sqlite3VdbeAddOp4Int() + ** vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS pOp->zComment = 0; #endif @@ -82644,16 +85294,59 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ #ifdef SQLITE_VDBE_COVERAGE pOp->iSrcLine = 0; #endif + /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ** Replicate in sqlite3VdbeAddOp4Int() */ + return i; } -SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe *p, int op){ - return sqlite3VdbeAddOp3(p, op, 0, 0, 0); -} -SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe *p, int op, int p1){ - return sqlite3VdbeAddOp3(p, op, p1, 0, 0); -} -SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe *p, int op, int p1, int p2){ - return sqlite3VdbeAddOp3(p, op, p1, p2, 0); +SQLITE_PRIVATE int sqlite3VdbeAddOp4Int( + Vdbe *p, /* Add the opcode to this VM */ + int op, /* The new opcode */ + int p1, /* The P1 operand */ + int p2, /* The P2 operand */ + int p3, /* The P3 operand */ + int p4 /* The P4 operand as an integer */ +){ + int i; + VdbeOp *pOp; + + i = p->nOp; + if( p->nOpAlloc<=i ){ + return addOp4IntSlow(p, op, p1, p2, p3, p4); + } + p->nOp++; + pOp = &p->aOp[i]; + assert( pOp!=0 ); + pOp->opcode = (u8)op; + pOp->p5 = 0; + pOp->p1 = p1; + pOp->p2 = p2; + pOp->p3 = p3; + pOp->p4.i = p4; + pOp->p4type = P4_INT32; + + /* Replicate this logic in sqlite3VdbeAddOp3() + ** vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + pOp->zComment = 0; +#endif +#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || defined(VDBE_PROFILE) + pOp->nExec = 0; + pOp->nCycle = 0; +#endif +#ifdef SQLITE_DEBUG + if( p->db->flags & SQLITE_VdbeAddopTrace ){ + sqlite3VdbePrintOp(0, i, &p->aOp[i]); + test_addop_breakpoint(i, &p->aOp[i]); + } +#endif +#ifdef SQLITE_VDBE_COVERAGE + pOp->iSrcLine = 0; +#endif + /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ** Replicate in sqlite3VdbeAddOp3() */ + + return i; } /* Generate code for an unconditional jump to instruction iDest @@ -82810,10 +85503,10 @@ SQLITE_PRIVATE void sqlite3ExplainBreakpoint(const char *z1, const char *z2){ */ SQLITE_PRIVATE int sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){ int addr = 0; -#if !defined(SQLITE_DEBUG) && !defined(SQLITE_ENABLE_STMT_SCANSTATUS) +#if !defined(SQLITE_DEBUG) /* Always include the OP_Explain opcodes if SQLITE_DEBUG is defined. ** But omit them (for performance) during production builds */ - if( pParse->explain==2 ) + if( pParse->explain==2 || IS_STMT_SCANSTATUS(pParse->db) ) #endif { char *zMsg; @@ -82831,7 +85524,7 @@ SQLITE_PRIVATE int sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, if( bPush){ pParse->addrExplain = iThis; } - sqlite3VdbeScanStatus(v, iThis, 0, 0, 0, 0); + sqlite3VdbeScanStatus(v, iThis, -1, -1, 0, 0); } return addr; } @@ -82861,26 +85554,6 @@ SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe *p, int iDb, char *zWhere, sqlite3MayAbort(p->pParse); } -/* -** Add an opcode that includes the p4 value as an integer. -*/ -SQLITE_PRIVATE int sqlite3VdbeAddOp4Int( - Vdbe *p, /* Add the opcode to this VM */ - int op, /* The new opcode */ - int p1, /* The P1 operand */ - int p2, /* The P2 operand */ - int p3, /* The P3 operand */ - int p4 /* The P4 operand as an integer */ -){ - int addr = sqlite3VdbeAddOp3(p, op, p1, p2, p3); - if( p->db->mallocFailed==0 ){ - VdbeOp *pOp = &p->aOp[addr]; - pOp->p4type = P4_INT32; - pOp->p4.i = p4; - } - return addr; -} - /* Insert the end of a co-routine */ SQLITE_PRIVATE void sqlite3VdbeEndCoroutine(Vdbe *v, int regYield){ @@ -83187,11 +85860,13 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ Op *pOp; Parse *pParse = p->pParse; int *aLabel = pParse->aLabel; + + assert( pParse->db->mallocFailed==0 ); /* tag-20230419-1 */ p->readOnly = 1; p->bIsReader = 0; pOp = &p->aOp[p->nOp-1]; assert( p->aOp[0].opcode==OP_Init ); - while( 1 /* Loop termates when it reaches the OP_Init opcode */ ){ + while( 1 /* Loop terminates when it reaches the OP_Init opcode */ ){ /* Only JUMP opcodes and the short list of special opcodes in the switch ** below need to be considered. The mkopcodeh.tcl generator script groups ** all these opcodes together near the front of the opcode list. Skip @@ -83246,8 +85921,18 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ ** have non-negative values for P2. */ assert( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP)!=0 ); assert( ADDR(pOp->p2)<-pParse->nLabel ); + assert( aLabel!=0 ); /* True because of tag-20230419-1 */ pOp->p2 = aLabel[ADDR(pOp->p2)]; } + + /* OPFLG_JUMP opcodes never have P2==0, though OPFLG_JUMP0 opcodes + ** might */ + assert( pOp->p2>0 + || (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP0)!=0 ); + + /* Jumps never go off the end of the bytecode array */ + assert( pOp->p2nOp + || (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP)==0 ); break; } } @@ -83312,6 +85997,10 @@ SQLITE_PRIVATE void sqlite3VdbeNoJumpsOutsideSubrtn( int iDest = pOp->p2; /* Jump destination */ if( iDest==0 ) continue; if( pOp->opcode==OP_Gosub ) continue; + if( pOp->p3==20230325 && pOp->opcode==OP_NotNull ){ + /* This is a deliberately taken illegal branch. tag-20230325-2 */ + continue; + } if( iDest<0 ){ int j = ADDR(iDest); assert( j>=0 ); @@ -83489,18 +86178,20 @@ SQLITE_PRIVATE void sqlite3VdbeScanStatus( LogEst nEst, /* Estimated number of output rows */ const char *zName /* Name of table or index being scanned */ ){ - sqlite3_int64 nByte = (p->nScan+1) * sizeof(ScanStatus); - ScanStatus *aNew; - aNew = (ScanStatus*)sqlite3DbRealloc(p->db, p->aScan, nByte); - if( aNew ){ - ScanStatus *pNew = &aNew[p->nScan++]; - memset(pNew, 0, sizeof(ScanStatus)); - pNew->addrExplain = addrExplain; - pNew->addrLoop = addrLoop; - pNew->addrVisit = addrVisit; - pNew->nEst = nEst; - pNew->zName = sqlite3DbStrDup(p->db, zName); - p->aScan = aNew; + if( IS_STMT_SCANSTATUS(p->db) ){ + sqlite3_int64 nByte = (p->nScan+1) * sizeof(ScanStatus); + ScanStatus *aNew; + aNew = (ScanStatus*)sqlite3DbRealloc(p->db, p->aScan, nByte); + if( aNew ){ + ScanStatus *pNew = &aNew[p->nScan++]; + memset(pNew, 0, sizeof(ScanStatus)); + pNew->addrExplain = addrExplain; + pNew->addrLoop = addrLoop; + pNew->addrVisit = addrVisit; + pNew->nEst = nEst; + pNew->zName = sqlite3DbStrDup(p->db, zName); + p->aScan = aNew; + } } } @@ -83517,20 +86208,22 @@ SQLITE_PRIVATE void sqlite3VdbeScanStatusRange( int addrStart, int addrEnd ){ - ScanStatus *pScan = 0; - int ii; - for(ii=p->nScan-1; ii>=0; ii--){ - pScan = &p->aScan[ii]; - if( pScan->addrExplain==addrExplain ) break; - pScan = 0; - } - if( pScan ){ - if( addrEnd<0 ) addrEnd = sqlite3VdbeCurrentAddr(p)-1; - for(ii=0; iiaAddrRange); ii+=2){ - if( pScan->aAddrRange[ii]==0 ){ - pScan->aAddrRange[ii] = addrStart; - pScan->aAddrRange[ii+1] = addrEnd; - break; + if( IS_STMT_SCANSTATUS(p->db) ){ + ScanStatus *pScan = 0; + int ii; + for(ii=p->nScan-1; ii>=0; ii--){ + pScan = &p->aScan[ii]; + if( pScan->addrExplain==addrExplain ) break; + pScan = 0; + } + if( pScan ){ + if( addrEnd<0 ) addrEnd = sqlite3VdbeCurrentAddr(p)-1; + for(ii=0; iiaAddrRange); ii+=2){ + if( pScan->aAddrRange[ii]==0 ){ + pScan->aAddrRange[ii] = addrStart; + pScan->aAddrRange[ii+1] = addrEnd; + break; + } } } } @@ -83547,19 +86240,21 @@ SQLITE_PRIVATE void sqlite3VdbeScanStatusCounters( int addrLoop, int addrVisit ){ - ScanStatus *pScan = 0; - int ii; - for(ii=p->nScan-1; ii>=0; ii--){ - pScan = &p->aScan[ii]; - if( pScan->addrExplain==addrExplain ) break; - pScan = 0; - } - if( pScan ){ - pScan->addrLoop = addrLoop; - pScan->addrVisit = addrVisit; + if( IS_STMT_SCANSTATUS(p->db) ){ + ScanStatus *pScan = 0; + int ii; + for(ii=p->nScan-1; ii>=0; ii--){ + pScan = &p->aScan[ii]; + if( pScan->addrExplain==addrExplain ) break; + pScan = 0; + } + if( pScan ){ + if( addrLoop>0 ) pScan->addrLoop = addrLoop; + if( addrVisit>0 ) pScan->addrVisit = addrVisit; + } } } -#endif +#endif /* defined(SQLITE_ENABLE_STMT_SCANSTATUS) */ /* @@ -83638,7 +86333,7 @@ SQLITE_PRIVATE void sqlite3VdbeJumpHereOrPopInst(Vdbe *p, int addr){ /* ** If the input FuncDef structure is ephemeral, then free it. If -** the FuncDef is not ephermal, then do nothing. +** the FuncDef is not ephemeral, then do nothing. */ static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef){ assert( db!=0 ); @@ -83699,6 +86394,16 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){ if( db->pnBytesFreed==0 ) sqlite3VtabUnlock((VTable *)p4); break; } + case P4_TABLEREF: { + if( db->pnBytesFreed==0 ) sqlite3DeleteTable(db, (Table*)p4); + break; + } + case P4_SUBRTNSIG: { + SubrtnSig *pSig = (SubrtnSig*)p4; + sqlite3DbFree(db, pSig->zAff); + sqlite3DbFree(db, pSig); + break; + } } } @@ -83802,7 +86507,6 @@ SQLITE_PRIVATE void sqlite3VdbeReleaseRegisters( } #endif /* SQLITE_DEBUG */ - /* ** Change the value of the P4 operand for a specific instruction. ** This routine is useful when a large program is loaded from a @@ -83827,7 +86531,7 @@ static void SQLITE_NOINLINE vdbeChangeP4Full( int n ){ if( pOp->p4type ){ - freeP4(p->db, pOp->p4type, pOp->p4.p); + assert( pOp->p4type > P4_FREE_IF_LE ); pOp->p4type = 0; pOp->p4.p = 0; } @@ -83983,7 +86687,7 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe *p, int addr){ /* Return the most recently added opcode */ -VdbeOp * sqlite3VdbeGetLastOp(Vdbe *p){ +SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetLastOp(Vdbe *p){ return sqlite3VdbeGetOp(p, p->nOp - 1); } @@ -84279,6 +86983,11 @@ SQLITE_PRIVATE char *sqlite3VdbeDisplayP4(sqlite3 *db, Op *pOp){ zP4 = pOp->p4.pTab->zName; break; } + case P4_SUBRTNSIG: { + SubrtnSig *pSig = pOp->p4.pSubrtnSig; + sqlite3_str_appendf(&x, "subrtnsig:%d,%s", pSig->selId, pSig->zAff); + break; + } default: { zP4 = pOp->p4.z; } @@ -84723,7 +87432,7 @@ SQLITE_PRIVATE int sqlite3VdbeList( sqlite3VdbeMemSetInt64(pMem+1, pOp->p2); sqlite3VdbeMemSetInt64(pMem+2, pOp->p3); sqlite3VdbeMemSetStr(pMem+3, zP4, -1, SQLITE_UTF8, sqlite3_free); - p->nResColumn = 4; + assert( p->nResColumn==4 ); }else{ sqlite3VdbeMemSetInt64(pMem+0, i); sqlite3VdbeMemSetStr(pMem+1, (char*)sqlite3OpcodeName(pOp->opcode), @@ -84742,7 +87451,7 @@ SQLITE_PRIVATE int sqlite3VdbeList( sqlite3VdbeMemSetNull(pMem+7); #endif sqlite3VdbeMemSetStr(pMem+5, zP4, -1, SQLITE_UTF8, sqlite3_free); - p->nResColumn = 8; + assert( p->nResColumn==8 ); } p->pResultRow = pMem; if( db->mallocFailed ){ @@ -84956,26 +87665,9 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( resolveP2Values(p, &nArg); p->usesStmtJournal = (u8)(pParse->isMultiWrite && pParse->mayAbort); if( pParse->explain ){ - static const char * const azColName[] = { - "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment", - "id", "parent", "notused", "detail" - }; - int iFirst, mx, i; if( nMem<10 ) nMem = 10; p->explain = pParse->explain; - if( pParse->explain==2 ){ - sqlite3VdbeSetNumCols(p, 4); - iFirst = 8; - mx = 12; - }else{ - sqlite3VdbeSetNumCols(p, 8); - iFirst = 0; - mx = 8; - } - for(i=iFirst; inResColumn = 12 - 4*p->explain; } p->expired = 0; @@ -85027,7 +87719,23 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *p, VdbeCursor *pCx){ if( pCx ) sqlite3VdbeFreeCursorNN(p,pCx); } +static SQLITE_NOINLINE void freeCursorWithCache(Vdbe *p, VdbeCursor *pCx){ + VdbeTxtBlbCache *pCache = pCx->pCache; + assert( pCx->colCache ); + pCx->colCache = 0; + pCx->pCache = 0; + if( pCache->pCValue ){ + sqlite3RCStrUnref(pCache->pCValue); + pCache->pCValue = 0; + } + sqlite3DbFree(p->db, pCache); + sqlite3VdbeFreeCursorNN(p, pCx); +} SQLITE_PRIVATE void sqlite3VdbeFreeCursorNN(Vdbe *p, VdbeCursor *pCx){ + if( pCx->colCache ){ + freeCursorWithCache(p, pCx); + return; + } switch( pCx->eCurType ){ case CURTYPE_SORTER: { sqlite3VdbeSorterClose(p->db, pCx); @@ -85128,12 +87836,12 @@ SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe *p, int nResColumn){ int n; sqlite3 *db = p->db; - if( p->nResColumn ){ - releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); + if( p->nResAlloc ){ + releaseMemArray(p->aColName, p->nResAlloc*COLNAME_N); sqlite3DbFree(db, p->aColName); } n = nResColumn*COLNAME_N; - p->nResColumn = (u16)nResColumn; + p->nResColumn = p->nResAlloc = (u16)nResColumn; p->aColName = (Mem*)sqlite3DbMallocRawNN(db, sizeof(Mem)*n ); if( p->aColName==0 ) return; initMemArray(p->aColName, n, db, MEM_Null); @@ -85158,14 +87866,14 @@ SQLITE_PRIVATE int sqlite3VdbeSetColName( ){ int rc; Mem *pColName; - assert( idxnResColumn ); + assert( idxnResAlloc ); assert( vardb->mallocFailed ){ assert( !zName || xDel!=SQLITE_DYNAMIC ); return SQLITE_NOMEM_BKPT; } assert( p->aColName!=0 ); - pColName = &(p->aColName[idx+var*p->nResColumn]); + pColName = &(p->aColName[idx+var*p->nResAlloc]); rc = sqlite3VdbeMemSetStr(pColName, zName, -1, SQLITE_UTF8, xDel); assert( rc!=0 || !zName || (pColName->flags&MEM_Term)!=0 ); return rc; @@ -85643,7 +88351,7 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ /* Check for immediate foreign key violations. */ if( p->rc==SQLITE_OK || (p->errorAction==OE_Fail && !isSpecialError) ){ - sqlite3VdbeCheckFk(p, 0); + (void)sqlite3VdbeCheckFk(p, 0); } /* If the auto-commit flag is set and this is the only active writer @@ -85678,6 +88386,7 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ sqlite3VdbeLeave(p); return SQLITE_BUSY; }else if( rc!=SQLITE_OK ){ + sqlite3SystemError(db, rc); p->rc = rc; sqlite3RollbackAll(db, SQLITE_OK); p->nChange = 0; @@ -85687,6 +88396,8 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ db->flags &= ~(u64)SQLITE_DeferFKs; sqlite3CommitInternalChanges(db); } + }else if( p->rc==SQLITE_SCHEMA && db->nVdbeActive>1 ){ + p->nChange = 0; }else{ sqlite3RollbackAll(db, SQLITE_OK); p->nChange = 0; @@ -85987,7 +88698,7 @@ static void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ assert( db!=0 ); assert( p->db==0 || p->db==db ); if( p->aColName ){ - releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); + releaseMemArray(p->aColName, p->nResAlloc*COLNAME_N); sqlite3DbNNFreeNN(db, p->aColName); } for(pSub=p->pProgram; pSub; pSub=pNext){ @@ -86005,9 +88716,9 @@ static void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ #ifdef SQLITE_ENABLE_NORMALIZE sqlite3DbFree(db, p->zNormSql); { - DblquoteStr *pThis, *pNext; - for(pThis=p->pDblStr; pThis; pThis=pNext){ - pNext = pThis->pNextStr; + DblquoteStr *pThis, *pNxt; + for(pThis=p->pDblStr; pThis; pThis=pNxt){ + pNxt = pThis->pNextStr; sqlite3DbFree(db, pThis); } } @@ -86354,6 +89065,23 @@ static void serialGet( pMem->flags = IsNaN(x) ? MEM_Null : MEM_Real; } } +static int serialGet7( + const unsigned char *buf, /* Buffer to deserialize from */ + Mem *pMem /* Memory cell to write value into */ +){ + u64 x = FOUR_BYTE_UINT(buf); + u32 y = FOUR_BYTE_UINT(buf+4); + x = (x<<32) + y; + assert( sizeof(x)==8 && sizeof(pMem->u.r)==8 ); + swapMixedEndianFloat(x); + memcpy(&pMem->u.r, &x, sizeof(x)); + if( IsNaN(x) ){ + pMem->flags = MEM_Null; + return 1; + } + pMem->flags = MEM_Real; + return 0; +} SQLITE_PRIVATE void sqlite3VdbeSerialGet( const unsigned char *buf, /* Buffer to deserialize from */ u32 serial_type, /* Serial type to deserialize */ @@ -86587,6 +89315,15 @@ static int vdbeRecordCompareDebug( if( d1+(u64)serial_type1+2>(u64)nKey1 && d1+(u64)sqlite3VdbeSerialTypeLen(serial_type1)>(u64)nKey1 ){ + if( serial_type1>=1 + && serial_type1<=7 + && d1+(u64)sqlite3VdbeSerialTypeLen(serial_type1)<=(u64)nKey1+8 + && CORRUPT_DB + ){ + return 1; /* corrupt record not detected by + ** sqlite3VdbeRecordCompareWithSkip(). Return true + ** to avoid firing the assert() */ + } break; } @@ -86755,32 +89492,37 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3BlobCompare(const Mem *pB1, const Mem return n1 - n2; } +/* The following two functions are used only within testcase() to prove +** test coverage. These functions do no exist for production builds. +** We must use separate SQLITE_NOINLINE functions here, since otherwise +** optimizer code movement causes gcov to become very confused. +*/ +#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_DEBUG) +static int SQLITE_NOINLINE doubleLt(double a, double b){ return a8 ){ - LONGDOUBLE_TYPE x = (LONGDOUBLE_TYPE)i; - testcase( xr ); - testcase( x==r ); - if( xr ) return +1; /*NO_TEST*/ /* work around bugs in gcov */ - return 0; /*NO_TEST*/ /* work around bugs in gcov */ + if( sqlite3IsNaN(r) ){ + /* SQLite considers NaN to be a NULL. And all integer values are greater + ** than NULL */ + return 1; }else{ i64 y; - double s; if( r<-9223372036854775808.0 ) return +1; if( r>=9223372036854775808.0 ) return -1; y = (i64)r; if( iy ) return +1; - s = (double)i; - if( sr ) return +1; - return 0; + testcase( doubleLt(((double)i),r) ); + testcase( doubleLt(r,((double)i)) ); + testcase( doubleEq(r,((double)i)) ); + return (((double)i)r); } } @@ -87010,7 +89752,7 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip( }else if( serial_type==0 ){ rc = -1; }else if( serial_type==7 ){ - sqlite3VdbeSerialGet(&aKey1[d1], serial_type, &mem1); + serialGet7(&aKey1[d1], &mem1); rc = -sqlite3IntFloatCompare(pRhs->u.i, mem1.u.r); }else{ i64 lhs = vdbeRecordDecodeInt(serial_type, &aKey1[d1]); @@ -87030,19 +89772,23 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip( /* Serial types 12 or greater are strings and blobs (greater than ** numbers). Types 10 and 11 are currently "reserved for future ** use", so it doesn't really matter what the results of comparing - ** them to numberic values are. */ + ** them to numeric values are. */ rc = serial_type==10 ? -1 : +1; }else if( serial_type==0 ){ rc = -1; }else{ - sqlite3VdbeSerialGet(&aKey1[d1], serial_type, &mem1); if( serial_type==7 ){ - if( mem1.u.ru.r ){ + if( serialGet7(&aKey1[d1], &mem1) ){ + rc = -1; /* mem1 is a NaN */ + }else if( mem1.u.ru.r ){ rc = -1; }else if( mem1.u.r>pRhs->u.r ){ rc = +1; + }else{ + assert( rc==0 ); } }else{ + sqlite3VdbeSerialGet(&aKey1[d1], serial_type, &mem1); rc = sqlite3IntFloatCompare(mem1.u.i, pRhs->u.r); } } @@ -87112,7 +89858,14 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip( /* RHS is null */ else{ serial_type = aKey1[idx1]; - rc = (serial_type!=0 && serial_type!=10); + if( serial_type==0 + || serial_type==10 + || (serial_type==7 && serialGet7(&aKey1[d1], &mem1)!=0) + ){ + assert( rc==0 ); + }else{ + rc = 1; + } } if( rc!=0 ){ @@ -87572,7 +90325,8 @@ SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe *v, int iVar, u8 aff assert( iVar>0 ); if( v ){ Mem *pMem = &v->aVar[iVar-1]; - assert( (v->db->flags & SQLITE_EnableQPSG)==0 ); + assert( (v->db->flags & SQLITE_EnableQPSG)==0 + || (v->db->mDbFlags & DBFLAG_InternalFunc)!=0 ); if( 0==(pMem->flags & MEM_Null) ){ sqlite3_value *pRet = sqlite3ValueNew(v->db); if( pRet ){ @@ -87592,7 +90346,8 @@ SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe *v, int iVar, u8 aff */ SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe *v, int iVar){ assert( iVar>0 ); - assert( (v->db->flags & SQLITE_EnableQPSG)==0 ); + assert( (v->db->flags & SQLITE_EnableQPSG)==0 + || (v->db->mDbFlags & DBFLAG_InternalFunc)!=0 ); if( iVar>=32 ){ v->expmask |= 0x80000000; }else{ @@ -87634,6 +90389,20 @@ SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context *pCtx){ return 1; } +#if defined(SQLITE_ENABLE_CURSOR_HINTS) && defined(SQLITE_DEBUG) +/* +** This Walker callback is used to help verify that calls to +** sqlite3BtreeCursorHint() with opcode BTREE_HINT_RANGE have +** byte-code register values correctly initialized. +*/ +SQLITE_PRIVATE int sqlite3CursorRangeHintExprCheck(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_REGISTER ){ + assert( (pWalker->u.aMem[pExpr->iTable].flags & MEM_Undefined)==0 ); + } + return WRC_Continue; +} +#endif /* SQLITE_ENABLE_CURSOR_HINTS && SQLITE_DEBUG */ + #ifndef SQLITE_OMIT_VIRTUALTABLE /* ** Transfer error message text from an sqlite3_vtab.zErrMsg (text stored @@ -87696,6 +90465,16 @@ SQLITE_PRIVATE void sqlite3VdbePreUpdateHook( PreUpdate preupdate; const char *zTbl = pTab->zName; static const u8 fakeSortOrder = 0; +#ifdef SQLITE_DEBUG + int nRealCol; + if( pTab->tabFlags & TF_WithoutRowid ){ + nRealCol = sqlite3PrimaryKeyIndex(pTab)->nColumn; + }else if( pTab->tabFlags & TF_HasVirtual ){ + nRealCol = pTab->nNVCol; + }else{ + nRealCol = pTab->nCol; + } +#endif assert( db->pPreUpdate==0 ); memset(&preupdate, 0, sizeof(PreUpdate)); @@ -87712,8 +90491,8 @@ SQLITE_PRIVATE void sqlite3VdbePreUpdateHook( assert( pCsr!=0 ); assert( pCsr->eCurType==CURTYPE_BTREE ); - assert( pCsr->nField==pTab->nCol - || (pCsr->nField==pTab->nCol+1 && op==SQLITE_DELETE && iReg==-1) + assert( pCsr->nField==nRealCol + || (pCsr->nField==nRealCol+1 && op==SQLITE_DELETE && iReg==-1) ); preupdate.v = v; @@ -87742,6 +90521,13 @@ SQLITE_PRIVATE void sqlite3VdbePreUpdateHook( } sqlite3DbNNFreeNN(db, preupdate.aNew); } + if( preupdate.apDflt ){ + int i; + for(i=0; inCol; i++){ + sqlite3ValueFree(preupdate.apDflt[i]); + } + sqlite3DbFree(db, preupdate.apDflt); + } } #endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ @@ -87901,7 +90687,15 @@ SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt *pStmt){ int rc = SQLITE_OK; Vdbe *p = (Vdbe*)pStmt; #if SQLITE_THREADSAFE - sqlite3_mutex *mutex = ((Vdbe*)pStmt)->db->mutex; + sqlite3_mutex *mutex; +#endif +#ifdef SQLITE_ENABLE_API_ARMOR + if( pStmt==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif +#if SQLITE_THREADSAFE + mutex = p->db->mutex; #endif sqlite3_mutex_enter(mutex); for(i=0; inVar; i++){ @@ -88020,7 +90814,7 @@ SQLITE_API int sqlite3_value_type(sqlite3_value* pVal){ SQLITE_NULL, /* 0x1f (not possible) */ SQLITE_FLOAT, /* 0x20 INTREAL */ SQLITE_NULL, /* 0x21 (not possible) */ - SQLITE_TEXT, /* 0x22 INTREAL + TEXT */ + SQLITE_FLOAT, /* 0x22 INTREAL + TEXT */ SQLITE_NULL, /* 0x23 (not possible) */ SQLITE_FLOAT, /* 0x24 (not possible) */ SQLITE_NULL, /* 0x25 (not possible) */ @@ -88124,7 +90918,7 @@ SQLITE_API void sqlite3_value_free(sqlite3_value *pOld){ ** is too big or if an OOM occurs. ** ** The invokeValueDestructor(P,X) routine invokes destructor function X() -** on value P is not going to be used and need to be destroyed. +** on value P if P is not going to be used and need to be destroyed. */ static void setResultStrOrError( sqlite3_context *pCtx, /* Function context */ @@ -88154,7 +90948,7 @@ static void setResultStrOrError( static int invokeValueDestructor( const void *p, /* Value to destroy */ void (*xDel)(void*), /* The destructor */ - sqlite3_context *pCtx /* Set a SQLITE_TOOBIG error if no NULL */ + sqlite3_context *pCtx /* Set a SQLITE_TOOBIG error if not NULL */ ){ assert( xDel!=SQLITE_DYNAMIC ); if( xDel==0 ){ @@ -88164,7 +90958,14 @@ static int invokeValueDestructor( }else{ xDel((void*)p); } +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx!=0 ){ + sqlite3_result_error_toobig(pCtx); + } +#else + assert( pCtx!=0 ); sqlite3_result_error_toobig(pCtx); +#endif return SQLITE_TOOBIG; } SQLITE_API void sqlite3_result_blob( @@ -88173,6 +90974,12 @@ SQLITE_API void sqlite3_result_blob( int n, void (*xDel)(void *) ){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 || n<0 ){ + invokeValueDestructor(z, xDel, pCtx); + return; + } +#endif assert( n>=0 ); assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); setResultStrOrError(pCtx, z, n, 0, xDel); @@ -88183,8 +90990,14 @@ SQLITE_API void sqlite3_result_blob64( sqlite3_uint64 n, void (*xDel)(void *) ){ - assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); assert( xDel!=SQLITE_DYNAMIC ); +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 ){ + invokeValueDestructor(z, xDel, 0); + return; + } +#endif + assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); if( n>0x7fffffff ){ (void)invokeValueDestructor(z, xDel, pCtx); }else{ @@ -88192,30 +91005,48 @@ SQLITE_API void sqlite3_result_blob64( } } SQLITE_API void sqlite3_result_double(sqlite3_context *pCtx, double rVal){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 ) return; +#endif assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); sqlite3VdbeMemSetDouble(pCtx->pOut, rVal); } SQLITE_API void sqlite3_result_error(sqlite3_context *pCtx, const char *z, int n){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 ) return; +#endif assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); pCtx->isError = SQLITE_ERROR; sqlite3VdbeMemSetStr(pCtx->pOut, z, n, SQLITE_UTF8, SQLITE_TRANSIENT); } #ifndef SQLITE_OMIT_UTF16 SQLITE_API void sqlite3_result_error16(sqlite3_context *pCtx, const void *z, int n){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 ) return; +#endif assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); pCtx->isError = SQLITE_ERROR; sqlite3VdbeMemSetStr(pCtx->pOut, z, n, SQLITE_UTF16NATIVE, SQLITE_TRANSIENT); } #endif SQLITE_API void sqlite3_result_int(sqlite3_context *pCtx, int iVal){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 ) return; +#endif assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); sqlite3VdbeMemSetInt64(pCtx->pOut, (i64)iVal); } SQLITE_API void sqlite3_result_int64(sqlite3_context *pCtx, i64 iVal){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 ) return; +#endif assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); sqlite3VdbeMemSetInt64(pCtx->pOut, iVal); } SQLITE_API void sqlite3_result_null(sqlite3_context *pCtx){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 ) return; +#endif assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); sqlite3VdbeMemSetNull(pCtx->pOut); } @@ -88225,14 +91056,37 @@ SQLITE_API void sqlite3_result_pointer( const char *zPType, void (*xDestructor)(void*) ){ - Mem *pOut = pCtx->pOut; + Mem *pOut; +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 ){ + invokeValueDestructor(pPtr, xDestructor, 0); + return; + } +#endif + pOut = pCtx->pOut; assert( sqlite3_mutex_held(pOut->db->mutex) ); sqlite3VdbeMemRelease(pOut); pOut->flags = MEM_Null; sqlite3VdbeMemSetPointer(pOut, pPtr, zPType, xDestructor); } SQLITE_API void sqlite3_result_subtype(sqlite3_context *pCtx, unsigned int eSubtype){ - Mem *pOut = pCtx->pOut; + Mem *pOut; +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 ) return; +#endif +#if defined(SQLITE_STRICT_SUBTYPE) && SQLITE_STRICT_SUBTYPE+0!=0 + if( pCtx->pFunc!=0 + && (pCtx->pFunc->funcFlags & SQLITE_RESULT_SUBTYPE)==0 + ){ + char zErr[200]; + sqlite3_snprintf(sizeof(zErr), zErr, + "misuse of sqlite3_result_subtype() by %s()", + pCtx->pFunc->zName); + sqlite3_result_error(pCtx, zErr, -1); + return; + } +#endif /* SQLITE_STRICT_SUBTYPE */ + pOut = pCtx->pOut; assert( sqlite3_mutex_held(pOut->db->mutex) ); pOut->eSubtype = eSubtype & 0xff; pOut->flags |= MEM_Subtype; @@ -88243,6 +91097,12 @@ SQLITE_API void sqlite3_result_text( int n, void (*xDel)(void *) ){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 ){ + invokeValueDestructor(z, xDel, 0); + return; + } +#endif assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); setResultStrOrError(pCtx, z, n, SQLITE_UTF8, xDel); } @@ -88253,6 +91113,12 @@ SQLITE_API void sqlite3_result_text64( void (*xDel)(void *), unsigned char enc ){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 ){ + invokeValueDestructor(z, xDel, 0); + return; + } +#endif assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); assert( xDel!=SQLITE_DYNAMIC ); if( enc!=SQLITE_UTF8 ){ @@ -88263,6 +91129,7 @@ SQLITE_API void sqlite3_result_text64( (void)invokeValueDestructor(z, xDel, pCtx); }else{ setResultStrOrError(pCtx, z, (int)n, enc, xDel); + sqlite3VdbeMemZeroTerminateIfAble(pCtx->pOut); } } #ifndef SQLITE_OMIT_UTF16 @@ -88295,7 +91162,16 @@ SQLITE_API void sqlite3_result_text16le( } #endif /* SQLITE_OMIT_UTF16 */ SQLITE_API void sqlite3_result_value(sqlite3_context *pCtx, sqlite3_value *pValue){ - Mem *pOut = pCtx->pOut; + Mem *pOut; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 ) return; + if( pValue==0 ){ + sqlite3_result_null(pCtx); + return; + } +#endif + pOut = pCtx->pOut; assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); sqlite3VdbeMemCopy(pOut, pValue); sqlite3VdbeChangeEncoding(pOut, pCtx->enc); @@ -88307,7 +91183,12 @@ SQLITE_API void sqlite3_result_zeroblob(sqlite3_context *pCtx, int n){ sqlite3_result_zeroblob64(pCtx, n>0 ? n : 0); } SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context *pCtx, u64 n){ - Mem *pOut = pCtx->pOut; + Mem *pOut; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 ) return SQLITE_MISUSE_BKPT; +#endif + pOut = pCtx->pOut; assert( sqlite3_mutex_held(pOut->db->mutex) ); if( n>(u64)pOut->db->aLimit[SQLITE_LIMIT_LENGTH] ){ sqlite3_result_error_toobig(pCtx); @@ -88321,6 +91202,9 @@ SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context *pCtx, u64 n){ #endif } SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 ) return; +#endif pCtx->isError = errCode ? errCode : -1; #ifdef SQLITE_DEBUG if( pCtx->pVdbe ) pCtx->pVdbe->rcApp = errCode; @@ -88333,6 +91217,9 @@ SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){ /* Force an SQLITE_TOOBIG error. */ SQLITE_API void sqlite3_result_error_toobig(sqlite3_context *pCtx){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 ) return; +#endif assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); pCtx->isError = SQLITE_TOOBIG; sqlite3VdbeMemSetStr(pCtx->pOut, "string or blob too big", -1, @@ -88341,6 +91228,9 @@ SQLITE_API void sqlite3_result_error_toobig(sqlite3_context *pCtx){ /* An SQLITE_NOMEM error. */ SQLITE_API void sqlite3_result_error_nomem(sqlite3_context *pCtx){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 ) return; +#endif assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); sqlite3VdbeMemSetNull(pCtx->pOut); pCtx->isError = SQLITE_NOMEM_BKPT; @@ -88593,6 +91483,9 @@ SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){ ** pointer to it. */ SQLITE_API void *sqlite3_user_data(sqlite3_context *p){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( p==0 ) return 0; +#endif assert( p && p->pFunc ); return p->pFunc->pUserData; } @@ -88608,7 +91501,11 @@ SQLITE_API void *sqlite3_user_data(sqlite3_context *p){ ** application defined function. */ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context *p){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( p==0 ) return 0; +#else assert( p && p->pOut ); +#endif return p->pOut->db; } @@ -88627,7 +91524,11 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context *p){ ** value, as a signal to the xUpdate routine that the column is unchanged. */ SQLITE_API int sqlite3_vtab_nochange(sqlite3_context *p){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( p==0 ) return 0; +#else assert( p ); +#endif return sqlite3_value_nochange(p->pOut); } @@ -88635,7 +91536,7 @@ SQLITE_API int sqlite3_vtab_nochange(sqlite3_context *p){ ** The destructor function for a ValueList object. This needs to be ** a separate function, unknowable to the application, to ensure that ** calls to sqlite3_vtab_in_first()/sqlite3_vtab_in_next() that are not -** preceeded by activation of IN processing via sqlite3_vtab_int() do not +** preceded by activation of IN processing via sqlite3_vtab_int() do not ** try to access a fake ValueList object inserted by a hostile extension. */ SQLITE_PRIVATE void sqlite3VdbeValueListFree(void *pToDelete){ @@ -88655,7 +91556,7 @@ static int valueFromValueList( ValueList *pRhs; *ppOut = 0; - if( pVal==0 ) return SQLITE_MISUSE; + if( pVal==0 ) return SQLITE_MISUSE_BKPT; if( (pVal->flags & MEM_Dyn)==0 || pVal->xDel!=sqlite3VdbeValueListFree ){ return SQLITE_ERROR; }else{ @@ -88786,6 +91687,9 @@ SQLITE_API void *sqlite3_aggregate_context(sqlite3_context *p, int nByte){ SQLITE_API void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){ AuxData *pAuxData; +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 ) return 0; +#endif assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); #if SQLITE_ENABLE_STAT4 if( pCtx->pVdbe==0 ) return 0; @@ -88818,8 +91722,12 @@ SQLITE_API void sqlite3_set_auxdata( void (*xDelete)(void*) ){ AuxData *pAuxData; - Vdbe *pVdbe = pCtx->pVdbe; + Vdbe *pVdbe; +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCtx==0 ) return; +#endif + pVdbe= pCtx->pVdbe; assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); #ifdef SQLITE_ENABLE_STAT4 if( pVdbe==0 ) goto failed; @@ -88875,7 +91783,8 @@ SQLITE_API int sqlite3_aggregate_count(sqlite3_context *p){ */ SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt){ Vdbe *pVm = (Vdbe *)pStmt; - return pVm ? pVm->nResColumn : 0; + if( pVm==0 ) return 0; + return pVm->nResColumn; } /* @@ -88964,7 +91873,7 @@ static Mem *columnMem(sqlite3_stmt *pStmt, int i){ ** sqlite3_column_real() ** sqlite3_column_bytes() ** sqlite3_column_bytes16() -** sqiite3_column_blob() +** sqlite3_column_blob() */ static void columnMallocFailure(sqlite3_stmt *pStmt) { @@ -89048,6 +91957,32 @@ SQLITE_API int sqlite3_column_type(sqlite3_stmt *pStmt, int i){ return iType; } +/* +** Column names appropriate for EXPLAIN or EXPLAIN QUERY PLAN. +*/ +static const char * const azExplainColNames8[] = { + "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment", /* EXPLAIN */ + "id", "parent", "notused", "detail" /* EQP */ +}; +static const u16 azExplainColNames16data[] = { + /* 0 */ 'a', 'd', 'd', 'r', 0, + /* 5 */ 'o', 'p', 'c', 'o', 'd', 'e', 0, + /* 12 */ 'p', '1', 0, + /* 15 */ 'p', '2', 0, + /* 18 */ 'p', '3', 0, + /* 21 */ 'p', '4', 0, + /* 24 */ 'p', '5', 0, + /* 27 */ 'c', 'o', 'm', 'm', 'e', 'n', 't', 0, + /* 35 */ 'i', 'd', 0, + /* 38 */ 'p', 'a', 'r', 'e', 'n', 't', 0, + /* 45 */ 'n', 'o', 't', 'u', 's', 'e', 'd', 0, + /* 53 */ 'd', 'e', 't', 'a', 'i', 'l', 0 +}; +static const u8 iExplainColNames16[] = { + 0, 5, 12, 15, 18, 21, 24, 27, + 35, 38, 45, 53 +}; + /* ** Convert the N-th element of pStmt->pColName[] into a string using ** xFunc() then return that string. If N is out of range, return 0. @@ -89080,15 +92015,29 @@ static const void *columnName( return 0; } #endif + if( N<0 ) return 0; ret = 0; p = (Vdbe *)pStmt; db = p->db; assert( db!=0 ); - n = sqlite3_column_count(pStmt); - if( N=0 ){ + sqlite3_mutex_enter(db->mutex); + + if( p->explain ){ + if( useType>0 ) goto columnName_end; + n = p->explain==1 ? 8 : 4; + if( N>=n ) goto columnName_end; + if( useUtf16 ){ + int i = iExplainColNames16[N + 8*p->explain - 8]; + ret = (void*)&azExplainColNames16data[i]; + }else{ + ret = (void*)azExplainColNames8[N + 8*p->explain - 8]; + } + goto columnName_end; + } + n = p->nResColumn; + if( NmallocFailed; N += useType*n; - sqlite3_mutex_enter(db->mutex); - assert( db->mallocFailed==0 ); #ifndef SQLITE_OMIT_UTF16 if( useUtf16 ){ ret = sqlite3_value_text16((sqlite3_value*)&p->aColName[N]); @@ -89100,12 +92049,14 @@ static const void *columnName( /* A malloc may have failed inside of the _text() call. If this ** is the case, clear the mallocFailed flag and return NULL. */ - if( db->mallocFailed ){ + assert( db->mallocFailed==0 || db->mallocFailed==1 ); + if( db->mallocFailed > prior_mallocFailed ){ sqlite3OomClear(db); ret = 0; } - sqlite3_mutex_leave(db->mutex); } +columnName_end: + sqlite3_mutex_leave(db->mutex); return ret; } @@ -89198,13 +92149,24 @@ SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){ /* ** Unbind the value bound to variable i in virtual machine p. This is the ** the same as binding a NULL value to the column. If the "i" parameter is -** out of range, then SQLITE_RANGE is returned. Othewise SQLITE_OK. +** out of range, then SQLITE_RANGE is returned. Otherwise SQLITE_OK. ** ** A successful evaluation of this routine acquires the mutex on p. ** the mutex is released if any kind of error occurs. ** ** The error code stored in database p->db is overwritten with the return ** value in any case. +** +** (tag-20240917-01) If vdbeUnbind(p,(u32)(i-1)) returns SQLITE_OK, +** that means all of the the following will be true: +** +** p!=0 +** p->pVar!=0 +** i>0 +** i<=p->nVar +** +** An assert() is normally added after vdbeUnbind() to help static analyzers +** realize this. */ static int vdbeUnbind(Vdbe *p, unsigned int i){ Mem *pVar; @@ -89213,7 +92175,7 @@ static int vdbeUnbind(Vdbe *p, unsigned int i){ } sqlite3_mutex_enter(p->db->mutex); if( p->eVdbeState!=VDBE_READY_STATE ){ - sqlite3Error(p->db, SQLITE_MISUSE); + sqlite3Error(p->db, SQLITE_MISUSE_BKPT); sqlite3_mutex_leave(p->db->mutex); sqlite3_log(SQLITE_MISUSE, "bind on a busy prepared statement: [%s]", p->zSql); @@ -89262,6 +92224,7 @@ static int bindText( rc = vdbeUnbind(p, (u32)(i-1)); if( rc==SQLITE_OK ){ + assert( p!=0 && p->aVar!=0 && i>0 && i<=p->nVar ); /* tag-20240917-01 */ if( zData!=0 ){ pVar = &p->aVar[i-1]; rc = sqlite3VdbeMemSetStr(pVar, zData, nData, encoding, xDel); @@ -89311,6 +92274,7 @@ SQLITE_API int sqlite3_bind_double(sqlite3_stmt *pStmt, int i, double rValue){ Vdbe *p = (Vdbe *)pStmt; rc = vdbeUnbind(p, (u32)(i-1)); if( rc==SQLITE_OK ){ + assert( p!=0 && p->aVar!=0 && i>0 && i<=p->nVar ); /* tag-20240917-01 */ sqlite3VdbeMemSetDouble(&p->aVar[i-1], rValue); sqlite3_mutex_leave(p->db->mutex); } @@ -89324,6 +92288,7 @@ SQLITE_API int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValu Vdbe *p = (Vdbe *)pStmt; rc = vdbeUnbind(p, (u32)(i-1)); if( rc==SQLITE_OK ){ + assert( p!=0 && p->aVar!=0 && i>0 && i<=p->nVar ); /* tag-20240917-01 */ sqlite3VdbeMemSetInt64(&p->aVar[i-1], iValue); sqlite3_mutex_leave(p->db->mutex); } @@ -89334,6 +92299,7 @@ SQLITE_API int sqlite3_bind_null(sqlite3_stmt *pStmt, int i){ Vdbe *p = (Vdbe*)pStmt; rc = vdbeUnbind(p, (u32)(i-1)); if( rc==SQLITE_OK ){ + assert( p!=0 && p->aVar!=0 && i>0 && i<=p->nVar ); /* tag-20240917-01 */ sqlite3_mutex_leave(p->db->mutex); } return rc; @@ -89349,6 +92315,7 @@ SQLITE_API int sqlite3_bind_pointer( Vdbe *p = (Vdbe*)pStmt; rc = vdbeUnbind(p, (u32)(i-1)); if( rc==SQLITE_OK ){ + assert( p!=0 && p->aVar!=0 && i>0 && i<=p->nVar ); /* tag-20240917-01 */ sqlite3VdbeMemSetPointer(&p->aVar[i-1], pPtr, zPTtype, xDestructor); sqlite3_mutex_leave(p->db->mutex); }else if( xDestructor ){ @@ -89430,6 +92397,7 @@ SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt *pStmt, int i, int n){ Vdbe *p = (Vdbe *)pStmt; rc = vdbeUnbind(p, (u32)(i-1)); if( rc==SQLITE_OK ){ + assert( p!=0 && p->aVar!=0 && i>0 && i<=p->nVar ); /* tag-20240917-01 */ #ifndef SQLITE_OMIT_INCRBLOB sqlite3VdbeMemSetZeroBlob(&p->aVar[i-1], n); #else @@ -89442,6 +92410,9 @@ SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt *pStmt, int i, int n){ SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt *pStmt, int i, sqlite3_uint64 n){ int rc; Vdbe *p = (Vdbe *)pStmt; +#ifdef SQLITE_ENABLE_API_ARMOR + if( p==0 ) return SQLITE_MISUSE_BKPT; +#endif sqlite3_mutex_enter(p->db->mutex); if( n>(u64)p->db->aLimit[SQLITE_LIMIT_LENGTH] ){ rc = SQLITE_TOOBIG; @@ -89562,6 +92533,42 @@ SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt){ return pStmt ? ((Vdbe*)pStmt)->explain : 0; } +/* +** Set the explain mode for a statement. +*/ +SQLITE_API int sqlite3_stmt_explain(sqlite3_stmt *pStmt, int eMode){ + Vdbe *v = (Vdbe*)pStmt; + int rc; +#ifdef SQLITE_ENABLE_API_ARMOR + if( pStmt==0 ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(v->db->mutex); + if( ((int)v->explain)==eMode ){ + rc = SQLITE_OK; + }else if( eMode<0 || eMode>2 ){ + rc = SQLITE_ERROR; + }else if( (v->prepFlags & SQLITE_PREPARE_SAVESQL)==0 ){ + rc = SQLITE_ERROR; + }else if( v->eVdbeState!=VDBE_READY_STATE ){ + rc = SQLITE_BUSY; + }else if( v->nMem>=10 && (eMode!=2 || v->haveEqpOps) ){ + /* No reprepare necessary */ + v->explain = eMode; + rc = SQLITE_OK; + }else{ + v->explain = eMode; + rc = sqlite3Reprepare(v); + v->haveEqpOps = eMode==2; + } + if( v->explain ){ + v->nResColumn = 12 - 4*v->explain; + }else{ + v->nResColumn = v->nResAlloc; + } + sqlite3_mutex_leave(v->db->mutex); + return rc; +} + /* ** Return true if the prepared statement is in need of being reset. */ @@ -89701,10 +92708,16 @@ static UnpackedRecord *vdbeUnpackRecord( ** a field of the row currently being updated or deleted. */ SQLITE_API int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ - PreUpdate *p = db->pPreUpdate; + PreUpdate *p; Mem *pMem; int rc = SQLITE_OK; +#ifdef SQLITE_ENABLE_API_ARMOR + if( db==0 || ppValue==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + p = db->pPreUpdate; /* Test that this call is being made from within an SQLITE_DELETE or ** SQLITE_UPDATE pre-update callback, and that iIdx is within range. */ if( !p || p->op==SQLITE_INSERT ){ @@ -89744,7 +92757,30 @@ SQLITE_API int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppVa if( iIdx==p->pTab->iPKey ){ sqlite3VdbeMemSetInt64(pMem, p->iKey1); }else if( iIdx>=p->pUnpacked->nField ){ - *ppValue = (sqlite3_value *)columnNullValue(); + /* This occurs when the table has been extended using ALTER TABLE + ** ADD COLUMN. The value to return is the default value of the column. */ + Column *pCol = &p->pTab->aCol[iIdx]; + if( pCol->iDflt>0 ){ + if( p->apDflt==0 ){ + int nByte = sizeof(sqlite3_value*)*p->pTab->nCol; + p->apDflt = (sqlite3_value**)sqlite3DbMallocZero(db, nByte); + if( p->apDflt==0 ) goto preupdate_old_out; + } + if( p->apDflt[iIdx]==0 ){ + sqlite3_value *pVal = 0; + Expr *pDflt; + assert( p->pTab!=0 && IsOrdinaryTable(p->pTab) ); + pDflt = p->pTab->u.tab.pDfltList->a[pCol->iDflt-1].pExpr; + rc = sqlite3ValueFromExpr(db, pDflt, ENC(db), pCol->affinity, &pVal); + if( rc==SQLITE_OK && pVal==0 ){ + rc = SQLITE_CORRUPT_BKPT; + } + p->apDflt[iIdx] = pVal; + } + *ppValue = p->apDflt[iIdx]; + }else{ + *ppValue = (sqlite3_value *)columnNullValue(); + } }else if( p->pTab->aCol[iIdx].affinity==SQLITE_AFF_REAL ){ if( pMem->flags & (MEM_Int|MEM_IntReal) ){ testcase( pMem->flags & MEM_Int ); @@ -89765,7 +92801,12 @@ SQLITE_API int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppVa ** the number of columns in the row being updated, deleted or inserted. */ SQLITE_API int sqlite3_preupdate_count(sqlite3 *db){ - PreUpdate *p = db->pPreUpdate; + PreUpdate *p; +#ifdef SQLITE_ENABLE_API_ARMOR + p = db!=0 ? db->pPreUpdate : 0; +#else + p = db->pPreUpdate; +#endif return (p ? p->keyinfo.nKeyField : 0); } #endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ @@ -89783,7 +92824,12 @@ SQLITE_API int sqlite3_preupdate_count(sqlite3 *db){ ** or SET DEFAULT action is considered a trigger. */ SQLITE_API int sqlite3_preupdate_depth(sqlite3 *db){ - PreUpdate *p = db->pPreUpdate; + PreUpdate *p; +#ifdef SQLITE_ENABLE_API_ARMOR + p = db!=0 ? db->pPreUpdate : 0; +#else + p = db->pPreUpdate; +#endif return (p ? p->v->nFrame : 0); } #endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ @@ -89794,7 +92840,12 @@ SQLITE_API int sqlite3_preupdate_depth(sqlite3 *db){ ** only. */ SQLITE_API int sqlite3_preupdate_blobwrite(sqlite3 *db){ - PreUpdate *p = db->pPreUpdate; + PreUpdate *p; +#ifdef SQLITE_ENABLE_API_ARMOR + p = db!=0 ? db->pPreUpdate : 0; +#else + p = db->pPreUpdate; +#endif return (p ? p->iBlobWrite : -1); } #endif @@ -89805,10 +92856,16 @@ SQLITE_API int sqlite3_preupdate_blobwrite(sqlite3 *db){ ** a field of the row currently being updated or inserted. */ SQLITE_API int sqlite3_preupdate_new(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ - PreUpdate *p = db->pPreUpdate; + PreUpdate *p; int rc = SQLITE_OK; Mem *pMem; +#ifdef SQLITE_ENABLE_API_ARMOR + if( db==0 || ppValue==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + p = db->pPreUpdate; if( !p || p->op==SQLITE_DELETE ){ rc = SQLITE_MISUSE_BKPT; goto preupdate_new_out; @@ -89887,15 +92944,33 @@ SQLITE_API int sqlite3_stmt_scanstatus_v2( void *pOut /* OUT: Write the answer here */ ){ Vdbe *p = (Vdbe*)pStmt; - ScanStatus *pScan; + VdbeOp *aOp; + int nOp; + ScanStatus *pScan = 0; int idx; +#ifdef SQLITE_ENABLE_API_ARMOR + if( p==0 || pOut==0 + || iScanStatusOpSQLITE_SCANSTAT_NCYCLE ){ + return 1; + } +#endif + aOp = p->aOp; + nOp = p->nOp; + if( p->pFrame ){ + VdbeFrame *pFrame; + for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent); + aOp = pFrame->aOp; + nOp = pFrame->nOp; + } + if( iScan<0 ){ int ii; if( iScanStatusOp==SQLITE_SCANSTAT_NCYCLE ){ i64 res = 0; - for(ii=0; iinOp; ii++){ - res += p->aOp[ii].nCycle; + for(ii=0; iiaScan[idx]; }else{ /* If the COMPLEX flag is clear, then this function must ignore any ** ScanStatus structures with ScanStatus.addrLoop set to 0. */ @@ -89917,11 +92991,13 @@ SQLITE_API int sqlite3_stmt_scanstatus_v2( } } if( idx>=p->nScan ) return 1; + assert( pScan==0 || pScan==&p->aScan[idx] ); + pScan = &p->aScan[idx]; switch( iScanStatusOp ){ case SQLITE_SCANSTAT_NLOOP: { if( pScan->addrLoop>0 ){ - *(sqlite3_int64*)pOut = p->aOp[pScan->addrLoop].nExec; + *(sqlite3_int64*)pOut = aOp[pScan->addrLoop].nExec; }else{ *(sqlite3_int64*)pOut = -1; } @@ -89929,7 +93005,7 @@ SQLITE_API int sqlite3_stmt_scanstatus_v2( } case SQLITE_SCANSTAT_NVISIT: { if( pScan->addrVisit>0 ){ - *(sqlite3_int64*)pOut = p->aOp[pScan->addrVisit].nExec; + *(sqlite3_int64*)pOut = aOp[pScan->addrVisit].nExec; }else{ *(sqlite3_int64*)pOut = -1; } @@ -89951,7 +93027,7 @@ SQLITE_API int sqlite3_stmt_scanstatus_v2( } case SQLITE_SCANSTAT_EXPLAIN: { if( pScan->addrExplain ){ - *(const char**)pOut = p->aOp[ pScan->addrExplain ].p4.z; + *(const char**)pOut = aOp[ pScan->addrExplain ].p4.z; }else{ *(const char**)pOut = 0; } @@ -89959,7 +93035,7 @@ SQLITE_API int sqlite3_stmt_scanstatus_v2( } case SQLITE_SCANSTAT_SELECTID: { if( pScan->addrExplain ){ - *(int*)pOut = p->aOp[ pScan->addrExplain ].p1; + *(int*)pOut = aOp[ pScan->addrExplain ].p1; }else{ *(int*)pOut = -1; } @@ -89967,7 +93043,7 @@ SQLITE_API int sqlite3_stmt_scanstatus_v2( } case SQLITE_SCANSTAT_PARENTID: { if( pScan->addrExplain ){ - *(int*)pOut = p->aOp[ pScan->addrExplain ].p2; + *(int*)pOut = aOp[ pScan->addrExplain ].p2; }else{ *(int*)pOut = -1; } @@ -89985,18 +93061,18 @@ SQLITE_API int sqlite3_stmt_scanstatus_v2( if( iIns==0 ) break; if( iIns>0 ){ while( iIns<=iEnd ){ - res += p->aOp[iIns].nCycle; + res += aOp[iIns].nCycle; iIns++; } }else{ int iOp; - for(iOp=0; iOpnOp; iOp++){ - Op *pOp = &p->aOp[iOp]; + for(iOp=0; iOpp1!=iEnd ) continue; if( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_NCYCLE)==0 ){ continue; } - res += p->aOp[iOp].nCycle; + res += aOp[iOp].nCycle; } } } @@ -90029,7 +93105,7 @@ SQLITE_API int sqlite3_stmt_scanstatus( SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt *pStmt){ Vdbe *p = (Vdbe*)pStmt; int ii; - for(ii=0; iinOp; ii++){ + for(ii=0; p!=0 && iinOp; ii++){ Op *pOp = &p->aOp[ii]; pOp->nExec = 0; pOp->nCycle = 0; @@ -90257,6 +93333,104 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql( /* #include "sqliteInt.h" */ /* #include "vdbeInt.h" */ +/* +** High-resolution hardware timer used for debugging and testing only. +*/ +#if defined(VDBE_PROFILE) \ + || defined(SQLITE_PERFORMANCE_TRACE) \ + || defined(SQLITE_ENABLE_STMT_SCANSTATUS) +/************** Include hwtime.h in the middle of vdbe.c *********************/ +/************** Begin file hwtime.h ******************************************/ +/* +** 2008 May 27 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This file contains inline asm code for retrieving "high-performance" +** counters for x86 and x86_64 class CPUs. +*/ +#ifndef SQLITE_HWTIME_H +#define SQLITE_HWTIME_H + +/* +** The following routine only works on Pentium-class (or newer) processors. +** It uses the RDTSC opcode to read the cycle count value out of the +** processor and returns that value. This can be used for high-res +** profiling. +*/ +#if !defined(__STRICT_ANSI__) && \ + (defined(__GNUC__) || defined(_MSC_VER)) && \ + (defined(i386) || defined(__i386__) || defined(_M_IX86)) + + #if defined(__GNUC__) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned int lo, hi; + __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); + return (sqlite_uint64)hi << 32 | lo; + } + + #elif defined(_MSC_VER) + + __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){ + __asm { + rdtsc + ret ; return value at EDX:EAX + } + } + + #endif + +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__x86_64__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned int lo, hi; + __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi)); + return (sqlite_uint64)hi << 32 | lo; + } + +#elif !defined(__STRICT_ANSI__) && (defined(__GNUC__) && defined(__ppc__)) + + __inline__ sqlite_uint64 sqlite3Hwtime(void){ + unsigned long long retval; + unsigned long junk; + __asm__ __volatile__ ("\n\ + 1: mftbu %1\n\ + mftb %L0\n\ + mftbu %0\n\ + cmpw %0,%1\n\ + bne 1b" + : "=r" (retval), "=r" (junk)); + return retval; + } + +#else + + /* + ** asm() is needed for hardware timing support. Without asm(), + ** disable the sqlite3Hwtime() routine. + ** + ** sqlite3Hwtime() is only used for some obscure debugging + ** and analysis configurations, not in any deliverable, so this + ** should not be a great loss. + */ +SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } + +#endif + +#endif /* !defined(SQLITE_HWTIME_H) */ + +/************** End of hwtime.h **********************************************/ +/************** Continuing where we left off in vdbe.c ***********************/ +#endif + /* ** Invoke this macro on memory cells just prior to changing the ** value of the cell. This macro verifies that shallow copies are @@ -90368,11 +93542,12 @@ SQLITE_API int sqlite3_found_count = 0; ** sqlite3CantopenError(lineno) */ static void test_trace_breakpoint(int pc, Op *pOp, Vdbe *v){ - static int n = 0; + static u64 n = 0; (void)pc; (void)pOp; (void)v; n++; + if( n==LARGEST_UINT64 ) abort(); /* So that n is used, preventing a warning */ } #endif @@ -90792,6 +93967,9 @@ SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, StrAccum *pStr){ sqlite3_str_appendchar(pStr, 1, (c>=0x20&&c<=0x7f) ? c : '.'); } sqlite3_str_appendf(pStr, "]%s", encnames[pMem->enc]); + if( f & MEM_Term ){ + sqlite3_str_appendf(pStr, "(0-term)"); + } } } #endif @@ -90919,12 +94097,102 @@ static u64 filterHash(const Mem *aMem, const Op *pOp){ }else if( p->flags & MEM_Real ){ h += sqlite3VdbeIntValue(p); }else if( p->flags & (MEM_Str|MEM_Blob) ){ - /* no-op */ + /* All strings have the same hash and all blobs have the same hash, + ** though, at least, those hashes are different from each other and + ** from NULL. */ + h += 4093 + (p->flags & (MEM_Str|MEM_Blob)); } } return h; } + +/* +** For OP_Column, factor out the case where content is loaded from +** overflow pages, so that the code to implement this case is separate +** the common case where all content fits on the page. Factoring out +** the code reduces register pressure and helps the common case +** to run faster. +*/ +static SQLITE_NOINLINE int vdbeColumnFromOverflow( + VdbeCursor *pC, /* The BTree cursor from which we are reading */ + int iCol, /* The column to read */ + int t, /* The serial-type code for the column value */ + i64 iOffset, /* Offset to the start of the content value */ + u32 cacheStatus, /* Current Vdbe.cacheCtr value */ + u32 colCacheCtr, /* Current value of the column cache counter */ + Mem *pDest /* Store the value into this register. */ +){ + int rc; + sqlite3 *db = pDest->db; + int encoding = pDest->enc; + int len = sqlite3VdbeSerialTypeLen(t); + assert( pC->eCurType==CURTYPE_BTREE ); + if( len>db->aLimit[SQLITE_LIMIT_LENGTH] ) return SQLITE_TOOBIG; + if( len > 4000 && pC->pKeyInfo==0 ){ + /* Cache large column values that are on overflow pages using + ** an RCStr (reference counted string) so that if they are reloaded, + ** that do not have to be copied a second time. The overhead of + ** creating and managing the cache is such that this is only + ** profitable for larger TEXT and BLOB values. + ** + ** Only do this on table-btrees so that writes to index-btrees do not + ** need to clear the cache. This buys performance in the common case + ** in exchange for generality. + */ + VdbeTxtBlbCache *pCache; + char *pBuf; + if( pC->colCache==0 ){ + pC->pCache = sqlite3DbMallocZero(db, sizeof(VdbeTxtBlbCache) ); + if( pC->pCache==0 ) return SQLITE_NOMEM; + pC->colCache = 1; + } + pCache = pC->pCache; + if( pCache->pCValue==0 + || pCache->iCol!=iCol + || pCache->cacheStatus!=cacheStatus + || pCache->colCacheCtr!=colCacheCtr + || pCache->iOffset!=sqlite3BtreeOffset(pC->uc.pCursor) + ){ + if( pCache->pCValue ) sqlite3RCStrUnref(pCache->pCValue); + pBuf = pCache->pCValue = sqlite3RCStrNew( len+3 ); + if( pBuf==0 ) return SQLITE_NOMEM; + rc = sqlite3BtreePayload(pC->uc.pCursor, iOffset, len, pBuf); + if( rc ) return rc; + pBuf[len] = 0; + pBuf[len+1] = 0; + pBuf[len+2] = 0; + pCache->iCol = iCol; + pCache->cacheStatus = cacheStatus; + pCache->colCacheCtr = colCacheCtr; + pCache->iOffset = sqlite3BtreeOffset(pC->uc.pCursor); + }else{ + pBuf = pCache->pCValue; + } + assert( t>=12 ); + sqlite3RCStrRef(pBuf); + if( t&1 ){ + rc = sqlite3VdbeMemSetStr(pDest, pBuf, len, encoding, + sqlite3RCStrUnref); + pDest->flags |= MEM_Term; + }else{ + rc = sqlite3VdbeMemSetStr(pDest, pBuf, len, 0, + sqlite3RCStrUnref); + } + }else{ + rc = sqlite3VdbeMemFromBtree(pC->uc.pCursor, iOffset, len, pDest); + if( rc ) return rc; + sqlite3VdbeSerialGet((const u8*)pDest->z, t, pDest); + if( (t&1)!=0 && encoding==SQLITE_UTF8 ){ + pDest->z[len] = 0; + pDest->flags |= MEM_Term; + } + } + pDest->flags &= ~MEM_Ephem; + return rc; +} + + /* ** Return the symbolic name for the data type of a pMem */ @@ -90967,8 +94235,10 @@ SQLITE_PRIVATE int sqlite3VdbeExec( Mem *pIn2 = 0; /* 2nd input operand */ Mem *pIn3 = 0; /* 3rd input operand */ Mem *pOut = 0; /* Output operand */ + u32 colCacheCtr = 0; /* Column cache counter */ #if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || defined(VDBE_PROFILE) u64 *pnCycle = 0; + int bStmtScanStatus = IS_STMT_SCANSTATUS(db)!=0; #endif /*** INSERT STACK UNION HERE ***/ @@ -91033,13 +94303,17 @@ SQLITE_PRIVATE int sqlite3VdbeExec( assert( pOp>=aOp && pOp<&aOp[p->nOp]); nVmStep++; -#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || defined(VDBE_PROFILE) + +#if defined(VDBE_PROFILE) pOp->nExec++; pnCycle = &pOp->nCycle; -# ifdef VDBE_PROFILE - if( sqlite3NProfileCnt==0 ) -# endif + if( sqlite3NProfileCnt==0 ) *pnCycle -= sqlite3Hwtime(); +#elif defined(SQLITE_ENABLE_STMT_SCANSTATUS) + if( bStmtScanStatus ){ + pOp->nExec++; + pnCycle = &pOp->nCycle; *pnCycle -= sqlite3Hwtime(); + } #endif /* Only allow tracing if SQLITE_DEBUG is defined. @@ -91157,8 +94431,8 @@ SQLITE_PRIVATE int sqlite3VdbeExec( case OP_Goto: { /* jump */ #ifdef SQLITE_DEBUG - /* In debuggging mode, when the p5 flags is set on an OP_Goto, that - ** means we should really jump back to the preceeding OP_ReleaseReg + /* In debugging mode, when the p5 flags is set on an OP_Goto, that + ** means we should really jump back to the preceding OP_ReleaseReg ** instruction. */ if( pOp->p5 ){ assert( pOp->p2 < (int)(pOp - aOp) ); @@ -91265,7 +94539,7 @@ case OP_Return: { /* in1 */ ** ** See also: EndCoroutine */ -case OP_InitCoroutine: { /* jump */ +case OP_InitCoroutine: { /* jump0 */ assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); assert( pOp->p2>=0 && pOp->p2nOp ); assert( pOp->p3>=0 && pOp->p3nOp ); @@ -91288,7 +94562,9 @@ case OP_InitCoroutine: { /* jump */ ** ** The instruction at the address in register P1 is a Yield. ** Jump to the P2 parameter of that Yield. -** After the jump, register P1 becomes undefined. +** After the jump, the value register P1 is left with a value +** such that subsequent OP_Yields go back to the this same +** OP_EndCoroutine instruction. ** ** See also: InitCoroutine */ @@ -91300,8 +94576,8 @@ case OP_EndCoroutine: { /* in1 */ pCaller = &aOp[pIn1->u.i]; assert( pCaller->opcode==OP_Yield ); assert( pCaller->p2>=0 && pCaller->p2nOp ); + pIn1->u.i = (int)(pOp - p->aOp) - 1; pOp = &aOp[pCaller->p2 - 1]; - pIn1->flags = MEM_Undefined; break; } @@ -91318,7 +94594,7 @@ case OP_EndCoroutine: { /* in1 */ ** ** See also: InitCoroutine */ -case OP_Yield: { /* in1, jump */ +case OP_Yield: { /* in1, jump0 */ int pcDest; pIn1 = &aMem[pOp->p1]; assert( VdbeMemDynamic(pIn1)==0 ); @@ -91348,7 +94624,7 @@ case OP_HaltIfNull: { /* in3 */ /* no break */ deliberate_fall_through } -/* Opcode: Halt P1 P2 * P4 P5 +/* Opcode: Halt P1 P2 P3 P4 P5 ** ** Exit immediately. All open cursors, etc are closed ** automatically. @@ -91361,18 +94637,22 @@ case OP_HaltIfNull: { /* in3 */ ** then back out all changes that have occurred during this execution of the ** VDBE, but do not rollback the transaction. ** -** If P4 is not null then it is an error message string. +** If P3 is not zero and P4 is NULL, then P3 is a register that holds the +** text of an error message. ** -** P5 is a value between 0 and 4, inclusive, that modifies the P4 string. +** If P3 is zero and P4 is not null then the error message string is held +** in P4. ** -** 0: (no change) -** 1: NOT NULL contraint failed: P4 +** P5 is a value between 1 and 4, inclusive, then the P4 error message +** string is modified as follows: +** +** 1: NOT NULL constraint failed: P4 ** 2: UNIQUE constraint failed: P4 ** 3: CHECK constraint failed: P4 ** 4: FOREIGN KEY constraint failed: P4 ** -** If P5 is not zero and P4 is NULL, then everything after the ":" is -** omitted. +** If P3 is zero and P5 is not zero and P4 is NULL, then everything after +** the ":" is omitted. ** ** There is an implied "Halt 0 0 0" instruction inserted at the very end of ** every program. So a jump past the last instruction of the program @@ -91385,6 +94665,9 @@ case OP_Halt: { #ifdef SQLITE_DEBUG if( pOp->p2==OE_Abort ){ sqlite3VdbeAssertAbortable(p); } #endif + assert( pOp->p4type==P4_NOTUSED + || pOp->p4type==P4_STATIC + || pOp->p4type==P4_DYNAMIC ); /* A deliberately coded "OP_Halt SQLITE_INTERNAL * * * *" opcode indicates ** something is wrong with the code generator. Raise an assertion in order @@ -91415,7 +94698,12 @@ case OP_Halt: { p->errorAction = (u8)pOp->p2; assert( pOp->p5<=4 ); if( p->rc ){ - if( pOp->p5 ){ + if( pOp->p3>0 && pOp->p4type==P4_NOTUSED ){ + const char *zErr; + assert( pOp->p3<=(p->nMem + 1 - p->nCursor) ); + zErr = sqlite3ValueText(&aMem[pOp->p3], SQLITE_UTF8); + sqlite3VdbeError(p, "%s", zErr); + }else if( pOp->p5 ){ static const char * const azType[] = { "NOT NULL", "UNIQUE", "CHECK", "FOREIGN KEY" }; testcase( pOp->p5==1 ); @@ -91648,19 +94936,15 @@ case OP_Blob: { /* out2 */ break; } -/* Opcode: Variable P1 P2 * P4 * -** Synopsis: r[P2]=parameter(P1,P4) +/* Opcode: Variable P1 P2 * * * +** Synopsis: r[P2]=parameter(P1) ** ** Transfer the values of bound parameter P1 into register P2 -** -** If the parameter is named, then its name appears in P4. -** The P4 value is used by sqlite3_bind_parameter_name(). */ case OP_Variable: { /* out2 */ Mem *pVar; /* Value being transferred */ assert( pOp->p1>0 && pOp->p1<=p->nVar ); - assert( pOp->p4.z==0 || pOp->p4.z==sqlite3VListNumToName(p->pVList,pOp->p1) ); pVar = &p->aVar[pOp->p1 - 1]; if( sqlite3VdbeMemTooBig(pVar) ){ goto too_big; @@ -92170,7 +95454,7 @@ case OP_AddImm: { /* in1 */ pIn1 = &aMem[pOp->p1]; memAboutToChange(p, pIn1); sqlite3VdbeMemIntegerify(pIn1); - pIn1->u.i += pOp->p2; + *(u64*)&pIn1->u.i += (u64)pOp->p2; break; } @@ -92181,7 +95465,7 @@ case OP_AddImm: { /* in1 */ ** without data loss, then jump immediately to P2, or if P2==0 ** raise an SQLITE_MISMATCH exception. */ -case OP_MustBeInt: { /* jump, in1 */ +case OP_MustBeInt: { /* jump0, in1 */ pIn1 = &aMem[pOp->p1]; if( (pIn1->flags & MEM_Int)==0 ){ applyAffinity(pIn1, SQLITE_AFF_NUMERIC, encoding); @@ -92222,7 +95506,7 @@ case OP_RealAffinity: { /* in1 */ } #endif -#ifndef SQLITE_OMIT_CAST +#if !defined(SQLITE_OMIT_CAST) || !defined(SQLITE_OMIT_ANALYZE) /* Opcode: Cast P1 P2 * * * ** Synopsis: affinity(r[P1]) ** @@ -92437,7 +95721,9 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ } } }else if( affinity==SQLITE_AFF_TEXT && ((flags1 | flags3) & MEM_Str)!=0 ){ - if( (flags1 & MEM_Str)==0 && (flags1&(MEM_Int|MEM_Real|MEM_IntReal))!=0 ){ + if( (flags1 & MEM_Str)!=0 ){ + pIn1->flags &= ~(MEM_Int|MEM_Real|MEM_IntReal); + }else if( (flags1&(MEM_Int|MEM_Real|MEM_IntReal))!=0 ){ testcase( pIn1->flags & MEM_Int ); testcase( pIn1->flags & MEM_Real ); testcase( pIn1->flags & MEM_IntReal ); @@ -92446,7 +95732,9 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ flags1 = (pIn1->flags & ~MEM_TypeMask) | (flags1 & MEM_TypeMask); if( NEVER(pIn1==pIn3) ) flags3 = flags1 | MEM_Str; } - if( (flags3 & MEM_Str)==0 && (flags3&(MEM_Int|MEM_Real|MEM_IntReal))!=0 ){ + if( (flags3 & MEM_Str)!=0 ){ + pIn3->flags &= ~(MEM_Int|MEM_Real|MEM_IntReal); + }else if( (flags3&(MEM_Int|MEM_Real|MEM_IntReal))!=0 ){ testcase( pIn3->flags & MEM_Int ); testcase( pIn3->flags & MEM_Real ); testcase( pIn3->flags & MEM_IntReal ); @@ -92497,10 +95785,10 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ ** opcodes are allowed to occur between this instruction and the previous ** OP_Lt or OP_Gt. ** -** If result of an OP_Eq comparison on the same two operands as the -** prior OP_Lt or OP_Gt would have been true, then jump to P2. -** If the result of an OP_Eq comparison on the two previous -** operands would have been false or NULL, then fall through. +** If the result of an OP_Eq comparison on the same two operands as +** the prior OP_Lt or OP_Gt would have been true, then jump to P2. If +** the result of an OP_Eq comparison on the two previous operands +** would have been false or NULL, then fall through. */ case OP_ElseEq: { /* same as TK_ESCAPE, jump */ @@ -92627,7 +95915,7 @@ case OP_Compare: { /* Opcode: Jump P1 P2 P3 * * ** ** Jump to the instruction at address P1, P2, or P3 depending on whether -** in the most recent OP_Compare instruction the P1 vector was less than +** in the most recent OP_Compare instruction the P1 vector was less than, ** equal to, or greater than the P2 vector, respectively. ** ** This opcode must immediately follow an OP_Compare opcode. @@ -92854,6 +96142,12 @@ case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */ ** (0x01) bit. SQLITE_FLOAT is the 0x02 bit. SQLITE_TEXT is 0x04. ** SQLITE_BLOB is 0x08. SQLITE_NULL is 0x10. ** +** WARNING: This opcode does not reliably distinguish between NULL and REAL +** when P1>=0. If the database contains a NaN value, this opcode will think +** that the datatype is REAL when it should be NULL. When P1<0 and the value +** is already stored in register P3, then this opcode does reliably +** distinguish between NULL and REAL. The problem only arises then P1>=0. +** ** Take the jump to address P2 if and only if the datatype of the ** value determined by P1 and P3 corresponds to one of the bits in the ** P5 bitmask. @@ -92924,7 +96218,7 @@ case OP_IsType: { /* jump */ /* Opcode: ZeroOrNull P1 P2 P3 * * ** Synopsis: r[P2] = 0 OR NULL ** -** If all both registers P1 and P3 are NOT NULL, then store a zero in +** If both registers P1 and P3 are NOT NULL, then store a zero in ** register P2. If either registers P1 or P3 are NULL then put ** a NULL in register P2. */ @@ -92967,7 +96261,7 @@ case OP_IfNullRow: { /* jump */ VdbeCursor *pC; assert( pOp->p1>=0 && pOp->p1nCursor ); pC = p->apCsr[pOp->p1]; - if( ALWAYS(pC) && pC->nullRow ){ + if( pC && pC->nullRow ){ sqlite3VdbeMemSetNull(aMem + pOp->p3); goto jump_to_p2; } @@ -93278,11 +96572,16 @@ case OP_Column: { /* ncycle */ pDest->flags = aFlag[t&1]; } }else{ + u8 p5; pDest->enc = encoding; + assert( pDest->db==db ); /* This branch happens only when content is on overflow pages */ - if( ((pOp->p5 & (OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG))!=0 - && ((t>=12 && (t&1)==0) || (pOp->p5 & OPFLAG_TYPEOFARG)!=0)) - || (len = sqlite3VdbeSerialTypeLen(t))==0 + if( ((p5 = (pOp->p5 & OPFLAG_BYTELENARG))!=0 + && (p5==OPFLAG_TYPEOFARG + || (t>=12 && ((t&1)==0 || p5==OPFLAG_BYTELENARG)) + ) + ) + || sqlite3VdbeSerialTypeLen(t)==0 ){ /* Content is irrelevant for ** 1. the typeof() function, @@ -93299,11 +96598,13 @@ case OP_Column: { /* ncycle */ */ sqlite3VdbeSerialGet((u8*)sqlite3CtypeMap, t, pDest); }else{ - if( len>db->aLimit[SQLITE_LIMIT_LENGTH] ) goto too_big; - rc = sqlite3VdbeMemFromBtree(pC->uc.pCursor, aOffset[p2], len, pDest); - if( rc!=SQLITE_OK ) goto abort_due_to_error; - sqlite3VdbeSerialGet((const u8*)pDest->z, t, pDest); - pDest->flags &= ~MEM_Ephem; + rc = vdbeColumnFromOverflow(pC, p2, t, aOffset[p2], + p->cacheCtr, colCacheCtr, pDest); + if( rc ){ + if( rc==SQLITE_NOMEM ) goto no_mem; + if( rc==SQLITE_TOOBIG ) goto too_big; + goto abort_due_to_error; + } } } @@ -93462,7 +96763,7 @@ case OP_Affinity: { }else{ pIn1->u.r = (double)pIn1->u.i; pIn1->flags |= MEM_Real; - pIn1->flags &= ~MEM_Int; + pIn1->flags &= ~(MEM_Int|MEM_Str); } } REGISTER_TRACE((int)(pIn1-aMem), pIn1); @@ -93765,7 +97066,6 @@ case OP_MakeRecord: { /* NULL value. No change in zPayload */ }else{ u64 v; - u32 i; if( serial_type==7 ){ assert( sizeof(v)==sizeof(pRec->u.r) ); memcpy(&v, &pRec->u.r, sizeof(v)); @@ -93773,12 +97073,22 @@ case OP_MakeRecord: { }else{ v = pRec->u.i; } - len = i = sqlite3SmallTypeSizes[serial_type]; - assert( i>0 ); - while( 1 /*exit-by-break*/ ){ - zPayload[--i] = (u8)(v&0xFF); - if( i==0 ) break; - v >>= 8; + len = sqlite3SmallTypeSizes[serial_type]; + assert( len>=1 && len<=8 && len!=5 && len!=7 ); + switch( len ){ + default: zPayload[7] = (u8)(v&0xff); v >>= 8; + zPayload[6] = (u8)(v&0xff); v >>= 8; + /* no break */ deliberate_fall_through + case 6: zPayload[5] = (u8)(v&0xff); v >>= 8; + zPayload[4] = (u8)(v&0xff); v >>= 8; + /* no break */ deliberate_fall_through + case 4: zPayload[3] = (u8)(v&0xff); v >>= 8; + /* no break */ deliberate_fall_through + case 3: zPayload[2] = (u8)(v&0xff); v >>= 8; + /* no break */ deliberate_fall_through + case 2: zPayload[1] = (u8)(v&0xff); v >>= 8; + /* no break */ deliberate_fall_through + case 1: zPayload[0] = (u8)(v&0xff); } zPayload += len; } @@ -94436,23 +97746,23 @@ case OP_OpenWrite: if( pDb->pSchema->file_format < p->minWriteFileFormat ){ p->minWriteFileFormat = pDb->pSchema->file_format; } + if( pOp->p5 & OPFLAG_P2ISREG ){ + assert( p2>0 ); + assert( p2<=(u32)(p->nMem+1 - p->nCursor) ); + pIn2 = &aMem[p2]; + assert( memIsValid(pIn2) ); + assert( (pIn2->flags & MEM_Int)!=0 ); + sqlite3VdbeMemIntegerify(pIn2); + p2 = (int)pIn2->u.i; + /* The p2 value always comes from a prior OP_CreateBtree opcode and + ** that opcode will always set the p2 value to 2 or more or else fail. + ** If there were a failure, the prepared statement would have halted + ** before reaching this instruction. */ + assert( p2>=2 ); + } }else{ wrFlag = 0; - } - if( pOp->p5 & OPFLAG_P2ISREG ){ - assert( p2>0 ); - assert( p2<=(u32)(p->nMem+1 - p->nCursor) ); - assert( pOp->opcode==OP_OpenWrite ); - pIn2 = &aMem[p2]; - assert( memIsValid(pIn2) ); - assert( (pIn2->flags & MEM_Int)!=0 ); - sqlite3VdbeMemIntegerify(pIn2); - p2 = (int)pIn2->u.i; - /* The p2 value always comes from a prior OP_CreateBtree opcode and - ** that opcode will always set the p2 value to 2 or more or else fail. - ** If there were a failure, the prepared statement would have halted - ** before reaching this instruction. */ - assert( p2>=2 ); + assert( (pOp->p5 & OPFLAG_P2ISREG)==0 ); } if( pOp->p4type==P4_KEYINFO ){ pKeyInfo = pOp->p4.pKeyInfo; @@ -94587,7 +97897,7 @@ case OP_OpenEphemeral: { /* ncycle */ } pCx = p->apCsr[pOp->p1]; if( pCx && !pCx->noReuse && ALWAYS(pOp->p2<=pCx->nField) ){ - /* If the ephermeral table is already open and has no duplicates from + /* If the ephemeral table is already open and has no duplicates from ** OP_OpenDup, then erase all existing content so that the table is ** empty again, rather than creating a new table. */ assert( pCx->isEphemeral ); @@ -94630,7 +97940,10 @@ case OP_OpenEphemeral: { /* ncycle */ } pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); if( rc ){ + assert( !sqlite3BtreeClosesWithCursor(pCx->ub.pBtx, pCx->uc.pCursor) ); sqlite3BtreeClose(pCx->ub.pBtx); + }else{ + assert( sqlite3BtreeClosesWithCursor(pCx->ub.pBtx, pCx->uc.pCursor) ); } } } @@ -94696,7 +98009,8 @@ case OP_SequenceTest: { ** is the only cursor opcode that works with a pseudo-table. ** ** P3 is the number of fields in the records that will be stored by -** the pseudo-table. +** the pseudo-table. If P2 is 0 or negative then the pseudo-cursor +** will return NULL for every column. */ case OP_OpenPseudo: { VdbeCursor *pCx; @@ -94839,10 +98153,10 @@ case OP_ColumnsUsed: { ** ** See also: Found, NotFound, SeekGt, SeekGe, SeekLt */ -case OP_SeekLT: /* jump, in3, group, ncycle */ -case OP_SeekLE: /* jump, in3, group, ncycle */ -case OP_SeekGE: /* jump, in3, group, ncycle */ -case OP_SeekGT: { /* jump, in3, group, ncycle */ +case OP_SeekLT: /* jump0, in3, group, ncycle */ +case OP_SeekLE: /* jump0, in3, group, ncycle */ +case OP_SeekGE: /* jump0, in3, group, ncycle */ +case OP_SeekGT: { /* jump0, in3, group, ncycle */ int res; /* Comparison result */ int oc; /* Opcode */ VdbeCursor *pC; /* The cursor to seek */ @@ -95078,7 +98392,7 @@ case OP_SeekGT: { /* jump, in3, group, ncycle */ ** row. If This.P5 is false (0) then a jump is made to SeekGE.P2. If ** This.P5 is true (non-zero) then a jump is made to This.P2. The P5==0 ** case occurs when there are no inequality constraints to the right of -** the IN constraing. The jump to SeekGE.P2 ends the loop. The P5!=0 case +** the IN constraint. The jump to SeekGE.P2 ends the loop. The P5!=0 case ** occurs when there are inequality constraints to the right of the IN ** operator. In that case, the This.P2 will point either directly to or ** to setup code prior to the OP_IdxGT or OP_IdxGE opcode that checks for @@ -95086,7 +98400,7 @@ case OP_SeekGT: { /* jump, in3, group, ncycle */ ** ** Possible outcomes from this opcode:
      ** -**
    1. If the cursor is initally not pointed to any valid row, then +**
    2. If the cursor is initially not pointed to any valid row, then ** fall through into the subsequent OP_SeekGE opcode. ** **
    3. If the cursor is left pointing to a row that is before the target @@ -95201,6 +98515,7 @@ case OP_SeekScan: { /* ncycle */ break; } nStep--; + pC->cacheStatus = CACHE_STALE; rc = sqlite3BtreeNext(pC->uc.pCursor, 0); if( rc ){ if( rc==SQLITE_DONE ){ @@ -95317,13 +98632,13 @@ case OP_IfNotOpen: { /* jump */ ** operands to OP_NotFound and OP_IdxGT. ** ** This opcode is an optimization attempt only. If this opcode always -** falls through, the correct answer is still obtained, but extra works +** falls through, the correct answer is still obtained, but extra work ** is performed. ** ** A value of N in the seekHit flag of cursor P1 means that there exists ** a key P3:N that will match some record in the index. We want to know ** if it is possible for a record P3:P4 to match some record in the -** index. If it is not possible, we can skips some work. So if seekHit +** index. If it is not possible, we can skip some work. So if seekHit ** is less than P4, attempt to find out if a match is possible by running ** OP_NotFound. ** @@ -95406,6 +98721,7 @@ case OP_Found: { /* jump, in3, ncycle */ r.pKeyInfo = pC->pKeyInfo; r.default_rc = 0; #ifdef SQLITE_DEBUG + (void)sqlite3FaultSim(50); /* For use by --counter in TH3 */ for(ii=0; iideferredMoveto = 0; pC->cacheStatus = CACHE_STALE; + colCacheCtr++; /* Invoke the update-hook if required. */ if( rc ) goto abort_due_to_error; @@ -95888,13 +99205,18 @@ case OP_RowCell: { ** left in an undefined state. ** ** If the OPFLAG_AUXDELETE bit is set on P5, that indicates that this -** delete one of several associated with deleting a table row and all its -** associated index entries. Exactly one of those deletes is the "primary" -** delete. The others are all on OPFLAG_FORDELETE cursors or else are -** marked with the AUXDELETE flag. +** delete is one of several associated with deleting a table row and +** all its associated index entries. Exactly one of those deletes is +** the "primary" delete. The others are all on OPFLAG_FORDELETE +** cursors or else are marked with the AUXDELETE flag. +** +** If the OPFLAG_NCHANGE (0x01) flag of P2 (NB: P2 not P5) is set, then +** the row change count is incremented (otherwise not). ** -** If the OPFLAG_NCHANGE flag of P2 (NB: P2 not P5) is set, then the row -** change count is incremented (otherwise not). +** If the OPFLAG_ISNOOP (0x40) flag of P2 (not P5!) is set, then the +** pre-update-hook for deletes is run, but the btree is otherwise unchanged. +** This happens when the OP_Delete is to be shortly followed by an OP_Insert +** with the same key, causing the btree entry to be overwritten. ** ** P1 must not be pseudo-table. It has to be a real table with ** multiple rows. @@ -95995,6 +99317,7 @@ case OP_Delete: { rc = sqlite3BtreeDelete(pC->uc.pCursor, pOp->p5); pC->cacheStatus = CACHE_STALE; + colCacheCtr++; pC->seekResult = 0; if( rc ) goto abort_due_to_error; @@ -96062,13 +99385,13 @@ case OP_SorterCompare: { ** Write into register P2 the current sorter data for sorter cursor P1. ** Then clear the column header cache on cursor P3. ** -** This opcode is normally use to move a record out of the sorter and into +** This opcode is normally used to move a record out of the sorter and into ** a register that is the source for a pseudo-table cursor created using ** OpenPseudo. That pseudo-table cursor is the one that is identified by ** parameter P3. Clearing the P3 column cache as part of this opcode saves ** us from having to issue a separate NullRow instruction to clear that cache. */ -case OP_SorterData: { +case OP_SorterData: { /* ncycle */ VdbeCursor *pC; pOut = &aMem[pOp->p2]; @@ -96260,7 +99583,7 @@ case OP_NullRow: { ** configured to use Prev, not Next. */ case OP_SeekEnd: /* ncycle */ -case OP_Last: { /* jump, ncycle */ +case OP_Last: { /* jump0, ncycle */ VdbeCursor *pC; BtCursor *pCrsr; int res; @@ -96294,28 +99617,38 @@ case OP_Last: { /* jump, ncycle */ break; } -/* Opcode: IfSmaller P1 P2 P3 * * +/* Opcode: IfSizeBetween P1 P2 P3 P4 * ** -** Estimate the number of rows in the table P1. Jump to P2 if that -** estimate is less than approximately 2**(0.1*P3). +** Let N be the approximate number of rows in the table or index +** with cursor P1 and let X be 10*log2(N) if N is positive or -1 +** if N is zero. +** +** Jump to P2 if X is in between P3 and P4, inclusive. */ -case OP_IfSmaller: { /* jump */ +case OP_IfSizeBetween: { /* jump */ VdbeCursor *pC; BtCursor *pCrsr; int res; i64 sz; assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p4type==P4_INT32 ); + assert( pOp->p3>=-1 && pOp->p3<=640*2 ); + assert( pOp->p4.i>=-1 && pOp->p4.i<=640*2 ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); pCrsr = pC->uc.pCursor; assert( pCrsr ); rc = sqlite3BtreeFirst(pCrsr, &res); if( rc ) goto abort_due_to_error; - if( res==0 ){ + if( res!=0 ){ + sz = -1; /* -Infinity encoding */ + }else{ sz = sqlite3BtreeRowCountEst(pCrsr); - if( ALWAYS(sz>=0) && sqlite3LogEst((u64)sz)p3 ) res = 1; + assert( sz>0 ); + sz = sqlite3LogEst((u64)sz); } + res = sz>=pOp->p3 && sz<=pOp->p4.i; VdbeBranchTaken(res!=0,2); if( res ) goto jump_to_p2; break; @@ -96343,8 +99676,8 @@ case OP_IfSmaller: { /* jump */ ** regression tests can determine whether or not the optimizer is ** correctly optimizing out sorts. */ -case OP_SorterSort: /* jump */ -case OP_Sort: { /* jump */ +case OP_SorterSort: /* jump ncycle */ +case OP_Sort: { /* jump ncycle */ #ifdef SQLITE_TEST sqlite3_sort_count++; sqlite3_search_count--; @@ -96368,7 +99701,7 @@ case OP_Sort: { /* jump */ ** from the beginning toward the end. In other words, the cursor is ** configured to use Next, not Prev. */ -case OP_Rewind: { /* jump, ncycle */ +case OP_Rewind: { /* jump0, ncycle */ VdbeCursor *pC; BtCursor *pCrsr; int res; @@ -96871,7 +100204,7 @@ case OP_IdxGE: { /* jump, ncycle */ ** file is given by P1. ** ** The table being destroyed is in the main database file if P3==0. If -** P3==1 then the table to be clear is in the auxiliary database file +** P3==1 then the table to be destroyed is in the auxiliary database file ** that is used to store tables create using CREATE TEMPORARY TABLE. ** ** If AUTOVACUUM is enabled then it is possible that another root page @@ -96931,8 +100264,8 @@ case OP_Destroy: { /* out2 */ ** in the database file is given by P1. But, unlike Destroy, do not ** remove the table or index from the database file. ** -** The table being clear is in the main database file if P2==0. If -** P2==1 then the table to be clear is in the auxiliary database file +** The table being cleared is in the main database file if P2==0. If +** P2==1 then the table to be cleared is in the auxiliary database file ** that is used to store tables create using CREATE TEMPORARY TABLE. ** ** If the P3 value is non-zero, then the row change count is incremented @@ -97015,16 +100348,57 @@ case OP_CreateBtree: { /* out2 */ break; } -/* Opcode: SqlExec * * * P4 * +/* Opcode: SqlExec P1 P2 * P4 * ** ** Run the SQL statement or statements specified in the P4 string. +** +** The P1 parameter is a bitmask of options: +** +** 0x0001 Disable Auth and Trace callbacks while the statements +** in P4 are running. +** +** 0x0002 Set db->nAnalysisLimit to P2 while the statements in +** P4 are running. +** */ case OP_SqlExec: { + char *zErr; +#ifndef SQLITE_OMIT_AUTHORIZATION + sqlite3_xauth xAuth; +#endif + u8 mTrace; + int savedAnalysisLimit; + sqlite3VdbeIncrWriteCounter(p, 0); db->nSqlExec++; - rc = sqlite3_exec(db, pOp->p4.z, 0, 0, 0); + zErr = 0; +#ifndef SQLITE_OMIT_AUTHORIZATION + xAuth = db->xAuth; +#endif + mTrace = db->mTrace; + savedAnalysisLimit = db->nAnalysisLimit; + if( pOp->p1 & 0x0001 ){ +#ifndef SQLITE_OMIT_AUTHORIZATION + db->xAuth = 0; +#endif + db->mTrace = 0; + } + if( pOp->p1 & 0x0002 ){ + db->nAnalysisLimit = pOp->p2; + } + rc = sqlite3_exec(db, pOp->p4.z, 0, 0, &zErr); db->nSqlExec--; - if( rc ) goto abort_due_to_error; +#ifndef SQLITE_OMIT_AUTHORIZATION + db->xAuth = xAuth; +#endif + db->mTrace = mTrace; + db->nAnalysisLimit = savedAnalysisLimit; + if( zErr || rc ){ + sqlite3VdbeError(p, "%s", zErr); + sqlite3_free(zErr); + if( rc==SQLITE_NOMEM ) goto no_mem; + goto abort_due_to_error; + } break; } @@ -97170,11 +100544,11 @@ case OP_DropTrigger: { /* Opcode: IntegrityCk P1 P2 P3 P4 P5 ** ** Do an analysis of the currently open database. Store in -** register P1 the text of an error message describing any problems. -** If no problems are found, store a NULL in register P1. +** register (P1+1) the text of an error message describing any problems. +** If no problems are found, store a NULL in register (P1+1). ** -** The register P3 contains one less than the maximum number of allowed errors. -** At most reg(P3) errors will be reported. +** The register (P1) contains one less than the maximum number of allowed +** errors. At most reg(P1) errors will be reported. ** In other words, the analysis stops as soon as reg(P1) errors are ** seen. Reg(P1) is updated with the number of errors remaining. ** @@ -97194,19 +100568,21 @@ case OP_IntegrityCk: { Mem *pnErr; /* Register keeping track of errors remaining */ assert( p->bIsReader ); + assert( pOp->p4type==P4_INTARRAY ); nRoot = pOp->p2; aRoot = pOp->p4.ai; assert( nRoot>0 ); + assert( aRoot!=0 ); assert( aRoot[0]==(Pgno)nRoot ); - assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); - pnErr = &aMem[pOp->p3]; + assert( pOp->p1>0 && (pOp->p1+1)<=(p->nMem+1 - p->nCursor) ); + pnErr = &aMem[pOp->p1]; assert( (pnErr->flags & MEM_Int)!=0 ); assert( (pnErr->flags & (MEM_Str|MEM_Blob))==0 ); - pIn1 = &aMem[pOp->p1]; + pIn1 = &aMem[pOp->p1+1]; assert( pOp->p5nDb ); assert( DbMaskTest(p->btreeMask, pOp->p5) ); - rc = sqlite3BtreeIntegrityCheck(db, db->aDb[pOp->p5].pBt, &aRoot[1], nRoot, - (int)pnErr->u.i+1, &nErr, &z); + rc = sqlite3BtreeIntegrityCheck(db, db->aDb[pOp->p5].pBt, &aRoot[1], + &aMem[pOp->p3], nRoot, (int)pnErr->u.i+1, &nErr, &z); sqlite3VdbeMemSetNull(pIn1); if( nErr==0 ){ assert( z==0 ); @@ -97333,7 +100709,9 @@ case OP_RowSetTest: { /* jump, in1, in3 */ ** P1 contains the address of the memory cell that contains the first memory ** cell in an array of values used as arguments to the sub-program. P2 ** contains the address to jump to if the sub-program throws an IGNORE -** exception using the RAISE() function. Register P3 contains the address +** exception using the RAISE() function. P2 might be zero, if there is +** no possibility that an IGNORE exception will be raised. +** Register P3 contains the address ** of a memory cell in this (the parent) VM that is used to allocate the ** memory required by the sub-vdbe at runtime. ** @@ -97341,7 +100719,7 @@ case OP_RowSetTest: { /* jump, in1, in3 */ ** ** If P5 is non-zero, then recursive program invocation is enabled. */ -case OP_Program: { /* jump */ +case OP_Program: { /* jump0 */ int nMem; /* Number of memory registers for sub-program */ int nByte; /* Bytes of runtime space required for sub-program */ Mem *pRt; /* Register to allocate runtime space */ @@ -97706,18 +101084,29 @@ case OP_AggInverse: case OP_AggStep: { int n; sqlite3_context *pCtx; + u64 nAlloc; assert( pOp->p4type==P4_FUNCDEF ); n = pOp->p5; assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); assert( n==0 || (pOp->p2>0 && pOp->p2+n<=(p->nMem+1 - p->nCursor)+1) ); assert( pOp->p3p2 || pOp->p3>=pOp->p2+n ); - pCtx = sqlite3DbMallocRawNN(db, n*sizeof(sqlite3_value*) + - (sizeof(pCtx[0]) + sizeof(Mem) - sizeof(sqlite3_value*))); + + /* Allocate space for (a) the context object and (n-1) extra pointers + ** to append to the sqlite3_context.argv[1] array, and (b) a memory + ** cell in which to store the accumulation. Be careful that the memory + ** cell is 8-byte aligned, even on platforms where a pointer is 32-bits. + ** + ** Note: We could avoid this by using a regular memory cell from aMem[] for + ** the accumulator, instead of allocating one here. */ + nAlloc = ROUND8P( sizeof(pCtx[0]) + (n-1)*sizeof(sqlite3_value*) ); + pCtx = sqlite3DbMallocRawNN(db, nAlloc + sizeof(Mem)); if( pCtx==0 ) goto no_mem; - pCtx->pMem = 0; - pCtx->pOut = (Mem*)&(pCtx->argv[n]); + pCtx->pOut = (Mem*)((u8*)pCtx + nAlloc); + assert( EIGHT_BYTE_ALIGNMENT(pCtx->pOut) ); + sqlite3VdbeMemInit(pCtx->pOut, db, MEM_Null); + pCtx->pMem = 0; pCtx->pFunc = pOp->p4.pFunc; pCtx->iOp = (int)(pOp - aOp); pCtx->pVdbe = p; @@ -97758,7 +101147,7 @@ case OP_AggStep1: { /* If this function is inside of a trigger, the register array in aMem[] ** might change from one evaluation to the next. The next block of code ** checks to see if the register array has changed, and if so it - ** reinitializes the relavant parts of the sqlite3_context object */ + ** reinitializes the relevant parts of the sqlite3_context object */ if( pCtx->pMem != pMem ){ pCtx->pMem = pMem; for(i=pCtx->argc-1; i>=0; i--) pCtx->argv[i] = &aMem[pOp->p2+i]; @@ -97853,6 +101242,7 @@ case OP_AggFinal: { } sqlite3VdbeChangeEncoding(pMem, encoding); UPDATE_MAX_BLOBSIZE(pMem); + REGISTER_TRACE((int)(pMem-aMem), pMem); break; } @@ -98244,6 +101634,52 @@ case OP_VOpen: { /* ncycle */ } #endif /* SQLITE_OMIT_VIRTUALTABLE */ +#ifndef SQLITE_OMIT_VIRTUALTABLE +/* Opcode: VCheck P1 P2 P3 P4 * +** +** P4 is a pointer to a Table object that is a virtual table in schema P1 +** that supports the xIntegrity() method. This opcode runs the xIntegrity() +** method for that virtual table, using P3 as the integer argument. If +** an error is reported back, the table name is prepended to the error +** message and that message is stored in P2. If no errors are seen, +** register P2 is set to NULL. +*/ +case OP_VCheck: { /* out2 */ + Table *pTab; + sqlite3_vtab *pVtab; + const sqlite3_module *pModule; + char *zErr = 0; + + pOut = &aMem[pOp->p2]; + sqlite3VdbeMemSetNull(pOut); /* Innocent until proven guilty */ + assert( pOp->p4type==P4_TABLEREF ); + pTab = pOp->p4.pTab; + assert( pTab!=0 ); + assert( pTab->nTabRef>0 ); + assert( IsVirtual(pTab) ); + if( pTab->u.vtab.p==0 ) break; + pVtab = pTab->u.vtab.p->pVtab; + assert( pVtab!=0 ); + pModule = pVtab->pModule; + assert( pModule!=0 ); + assert( pModule->iVersion>=4 ); + assert( pModule->xIntegrity!=0 ); + sqlite3VtabLock(pTab->u.vtab.p); + assert( pOp->p1>=0 && pOp->p1nDb ); + rc = pModule->xIntegrity(pVtab, db->aDb[pOp->p1].zDbSName, pTab->zName, + pOp->p3, &zErr); + sqlite3VtabUnlock(pTab->u.vtab.p); + if( rc ){ + sqlite3_free(zErr); + goto abort_due_to_error; + } + if( zErr ){ + sqlite3VdbeMemSetStr(pOut, zErr, -1, SQLITE_UTF8, sqlite3_free); + } + break; +} +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + #ifndef SQLITE_OMIT_VIRTUALTABLE /* Opcode: VInitIn P1 P2 P3 * * ** Synopsis: r[P2]=ValueList(P1,P3) @@ -98357,6 +101793,7 @@ case OP_VColumn: { /* ncycle */ const sqlite3_module *pModule; Mem *pDest; sqlite3_context sContext; + FuncDef nullFunc; VdbeCursor *pCur = p->apCsr[pOp->p1]; assert( pCur!=0 ); @@ -98374,6 +101811,9 @@ case OP_VColumn: { /* ncycle */ memset(&sContext, 0, sizeof(sContext)); sContext.pOut = pDest; sContext.enc = encoding; + nullFunc.pUserData = 0; + nullFunc.funcFlags = SQLITE_RESULT_SUBTYPE; + sContext.pFunc = &nullFunc; assert( pOp->p5==OPFLAG_NOCHNG || pOp->p5==0 ); if( pOp->p5 & OPFLAG_NOCHNG ){ sqlite3VdbeMemSetNull(pDest); @@ -98635,7 +102075,7 @@ case OP_MaxPgcnt: { /* out2 */ ** This opcode works exactly like OP_Function. The only difference is in ** its name. This opcode is used in places where the function must be ** purely non-deterministic. Some built-in date/time functions can be -** either determinitic of non-deterministic, depending on their arguments. +** either deterministic of non-deterministic, depending on their arguments. ** When those function are used in a non-deterministic way, they will check ** to see if they were called using OP_PureFunc instead of OP_Function, and ** if they were, they throw an error. @@ -98653,7 +102093,7 @@ case OP_Function: { /* group */ /* If this function is inside of a trigger, the register array in aMem[] ** might change from one evaluation to the next. The next block of code ** checks to see if the register array has changed, and if so it - ** reinitializes the relavant parts of the sqlite3_context object */ + ** reinitializes the relevant parts of the sqlite3_context object */ pOut = &aMem[pOp->p3]; if( pCtx->pOut != pOut ){ pCtx->pVdbe = p; @@ -98706,6 +102146,42 @@ case OP_ClrSubtype: { /* in1 */ break; } +/* Opcode: GetSubtype P1 P2 * * * +** Synopsis: r[P2] = r[P1].subtype +** +** Extract the subtype value from register P1 and write that subtype +** into register P2. If P1 has no subtype, then P1 gets a NULL. +*/ +case OP_GetSubtype: { /* in1 out2 */ + pIn1 = &aMem[pOp->p1]; + pOut = &aMem[pOp->p2]; + if( pIn1->flags & MEM_Subtype ){ + sqlite3VdbeMemSetInt64(pOut, pIn1->eSubtype); + }else{ + sqlite3VdbeMemSetNull(pOut); + } + break; +} + +/* Opcode: SetSubtype P1 P2 * * * +** Synopsis: r[P2].subtype = r[P1] +** +** Set the subtype value of register P2 to the integer from register P1. +** If P1 is NULL, clear the subtype from p2. +*/ +case OP_SetSubtype: { /* in1 out2 */ + pIn1 = &aMem[pOp->p1]; + pOut = &aMem[pOp->p2]; + if( pIn1->flags & MEM_Null ){ + pOut->flags &= ~MEM_Subtype; + }else{ + assert( pIn1->flags & MEM_Int ); + pOut->flags |= MEM_Subtype; + pOut->eSubtype = (u8)(pIn1->u.i & 0xff); + } + break; +} + /* Opcode: FilterAdd P1 * P3 P4 * ** Synopsis: filter(P1) += key(P3@P4) ** @@ -98729,7 +102205,7 @@ case OP_FilterAdd: { printf("hash: %llu modulo %d -> %u\n", h, pIn1->n, (int)(h%pIn1->n)); } #endif - h %= pIn1->n; + h %= (pIn1->n*8); pIn1->z[h/8] |= 1<<(h&7); break; } @@ -98765,7 +102241,7 @@ case OP_Filter: { /* jump */ printf("hash: %llu modulo %d -> %u\n", h, pIn1->n, (int)(h%pIn1->n)); } #endif - h %= pIn1->n; + h %= (pIn1->n*8); if( (pIn1->z[h/8] & (1<<(h&7)))==0 ){ VdbeBranchTaken(1, 2); p->aCounter[SQLITE_STMTSTATUS_FILTER_HIT]++; @@ -98803,7 +102279,7 @@ case OP_Filter: { /* jump */ ** error is encountered. */ case OP_Trace: -case OP_Init: { /* jump */ +case OP_Init: { /* jump0 */ int i; #ifndef SQLITE_OMIT_TRACE char *zTrace; @@ -98964,14 +102440,29 @@ case OP_ReleaseReg: { /* Opcode: Noop * * * * * ** -** Do nothing. This instruction is often useful as a jump -** destination. +** Do nothing. Continue downward to the next opcode. */ -/* -** The magic Explain opcode are only inserted when explain==2 (which -** is to say when the EXPLAIN QUERY PLAN syntax is used.) -** This opcode records information from the optimizer. It is the -** the same as a no-op. This opcodesnever appears in a real VM program. +/* Opcode: Explain P1 P2 P3 P4 * +** +** This is the same as OP_Noop during normal query execution. The +** purpose of this opcode is to hold information about the query +** plan for the purpose of EXPLAIN QUERY PLAN output. +** +** The P4 value is human-readable text that describes the query plan +** element. Something like "SCAN t1" or "SEARCH t2 USING INDEX t2x1". +** +** The P1 value is the ID of the current element and P2 is the parent +** element for the case of nested query plan elements. If P2 is zero +** then this element is a top-level element. +** +** For loop elements, P3 is the estimated code of each invocation of this +** element. +** +** As with all opcodes, the meanings of the parameters for OP_Explain +** are subject to change from one release to the next. Applications +** should not attempt to interpret or use any of the information +** contained in the OP_Explain opcode. The information provided by this +** opcode is intended for testing and debugging use only. */ default: { /* This is really OP_Noop, OP_Explain */ assert( pOp->opcode==OP_Noop || pOp->opcode==OP_Explain ); @@ -98991,8 +102482,10 @@ default: { /* This is really OP_Noop, OP_Explain */ *pnCycle += sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime(); pnCycle = 0; #elif defined(SQLITE_ENABLE_STMT_SCANSTATUS) - *pnCycle += sqlite3Hwtime(); - pnCycle = 0; + if( pnCycle ){ + *pnCycle += sqlite3Hwtime(); + pnCycle = 0; + } #endif /* The following code adds nothing to the actual functionality @@ -99015,7 +102508,7 @@ default: { /* This is really OP_Noop, OP_Explain */ } if( opProperty==0xff ){ /* Never happens. This code exists to avoid a harmless linkage - ** warning aboud sqlite3VdbeRegisterDump() being defined but not + ** warning about sqlite3VdbeRegisterDump() being defined but not ** used. */ sqlite3VdbeRegisterDump(p); } @@ -99188,8 +102681,7 @@ static int blobSeekToRow(Incrblob *p, sqlite3_int64 iRow, char **pzErr){ /* Set the value of register r[1] in the SQL statement to integer iRow. ** This is done directly as a performance optimization */ - v->aMem[1].flags = MEM_Int; - v->aMem[1].u.i = iRow; + sqlite3VdbeMemSetInt64(&v->aMem[1], iRow); /* If the statement has been run before (and is paused at the OP_ResultRow) ** then back it up to the point where it does the OP_NotExists. This could @@ -99272,7 +102764,7 @@ SQLITE_API int sqlite3_blob_open( #endif *ppBlob = 0; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) || zTable==0 ){ + if( !sqlite3SafetyCheckOk(db) || zTable==0 || zColumn==0 ){ return SQLITE_MISUSE_BKPT; } #endif @@ -99297,6 +102789,11 @@ SQLITE_API int sqlite3_blob_open( pTab = 0; sqlite3ErrorMsg(&sParse, "cannot open table without rowid: %s", zTable); } + if( pTab && (pTab->tabFlags&TF_HasGenerated)!=0 ){ + pTab = 0; + sqlite3ErrorMsg(&sParse, "cannot open table with generated columns: %s", + zTable); + } #ifndef SQLITE_OMIT_VIEW if( pTab && IsView(pTab) ){ pTab = 0; @@ -99471,7 +102968,7 @@ SQLITE_API int sqlite3_blob_open( if( pBlob && pBlob->pStmt ) sqlite3VdbeFinalize((Vdbe *)pBlob->pStmt); sqlite3DbFree(db, pBlob); } - sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : 0), zErr); + sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : (char*)0), zErr); sqlite3DbFree(db, zErr); sqlite3ParseObjectReset(&sParse); rc = sqlite3ApiExit(db, rc); @@ -99630,7 +103127,7 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *pBlob, sqlite3_int64 iRow){ ((Vdbe*)p->pStmt)->rc = SQLITE_OK; rc = blobSeekToRow(p, iRow, &zErr); if( rc!=SQLITE_OK ){ - sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : 0), zErr); + sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : (char*)0), zErr); sqlite3DbFree(db, zErr); } assert( rc!=SQLITE_SCHEMA ); @@ -99733,7 +103230,7 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *pBlob, sqlite3_int64 iRow){ ** The threshold for the amount of main memory to use before flushing ** records to a PMA is roughly the same as the limit configured for the ** page-cache of the main database. Specifically, the threshold is set to -** the value returned by "PRAGMA main.page_size" multipled by +** the value returned by "PRAGMA main.page_size" multiplied by ** that returned by "PRAGMA main.cache_size", in bytes. ** ** If the sorter is running in single-threaded mode, then all PMAs generated @@ -99756,7 +103253,7 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *pBlob, sqlite3_int64 iRow){ ** ** If there are fewer than SORTER_MAX_MERGE_COUNT PMAs in total and the ** sorter is running in single-threaded mode, then these PMAs are merged -** incrementally as keys are retreived from the sorter by the VDBE. The +** incrementally as keys are retrieved from the sorter by the VDBE. The ** MergeEngine object, described in further detail below, performs this ** merge. ** @@ -99834,7 +103331,7 @@ struct SorterFile { struct SorterList { SorterRecord *pList; /* Linked list of records */ u8 *aMemory; /* If non-NULL, bulk memory to hold pList */ - int szPMA; /* Size of pList as PMA in bytes */ + i64 szPMA; /* Size of pList as PMA in bytes */ }; /* @@ -99919,7 +103416,7 @@ struct MergeEngine { ** ** Essentially, this structure contains all those fields of the VdbeSorter ** structure for which each thread requires a separate instance. For example, -** each thread requries its own UnpackedRecord object to unpack records in +** each thread requeries its own UnpackedRecord object to unpack records in ** as part of comparison operations. ** ** Before a background thread is launched, variable bDone is set to 0. Then, @@ -99943,10 +103440,10 @@ typedef int (*SorterCompare)(SortSubtask*,int*,const void*,int,const void*,int); struct SortSubtask { SQLiteThread *pThread; /* Background thread, if any */ int bDone; /* Set if thread is finished but not joined */ + int nPMA; /* Number of PMAs currently in file */ VdbeSorter *pSorter; /* Sorter that owns this sub-task */ UnpackedRecord *pUnpacked; /* Space to unpack a record */ SorterList list; /* List for thread to write to a PMA */ - int nPMA; /* Number of PMAs currently in file */ SorterCompare xCompare; /* Compare function to use */ SorterFile file; /* Temp file for level-0 PMAs */ SorterFile file2; /* Space for other PMAs */ @@ -99991,7 +103488,7 @@ struct VdbeSorter { ** PMA, in sorted order. The next key to be read is cached in nKey/aKey. ** aKey might point into aMap or into aBuffer. If neither of those locations ** contain a contiguous representation of the key, then aAlloc is allocated -** and the key is copied into aAlloc and aKey is made to poitn to aAlloc. +** and the key is copied into aAlloc and aKey is made to point to aAlloc. ** ** pFd==0 at EOF. */ @@ -100204,13 +103701,14 @@ static int vdbePmaReadBlob( while( nRem>0 ){ int rc; /* vdbePmaReadBlob() return code */ int nCopy; /* Number of bytes to copy */ - u8 *aNext; /* Pointer to buffer to copy data from */ + u8 *aNext = 0; /* Pointer to buffer to copy data from */ nCopy = nRem; if( nRem>p->nBuffer ) nCopy = p->nBuffer; rc = vdbePmaReadBlob(p, nCopy, &aNext); if( rc!=SQLITE_OK ) return rc; assert( aNext!=p->aAlloc ); + assert( aNext!=0 ); memcpy(&p->aAlloc[nByte - nRem], aNext, nCopy); nRem -= nCopy; } @@ -101362,7 +104860,7 @@ static int vdbeSorterFlushPMA(VdbeSorter *pSorter){ ** the background thread from a sub-tasks previous turn is still running, ** skip it. If the first (pSorter->nTask-1) sub-tasks are all still busy, ** fall back to using the final sub-task. The first (pSorter->nTask-1) - ** sub-tasks are prefered as they use background threads - the final + ** sub-tasks are preferred as they use background threads - the final ** sub-task uses the main thread. */ for(i=0; iiPrev + i + 1) % nWorker; @@ -101420,8 +104918,8 @@ SQLITE_PRIVATE int sqlite3VdbeSorterWrite( int rc = SQLITE_OK; /* Return Code */ SorterRecord *pNew; /* New list element */ int bFlush; /* True to flush contents of memory to PMA */ - int nReq; /* Bytes of memory required */ - int nPMA; /* Bytes of PMA space required */ + i64 nReq; /* Bytes of memory required */ + i64 nPMA; /* Bytes of PMA space required */ int t; /* serial type of first record field */ assert( pCsr->eCurType==CURTYPE_SORTER ); @@ -101846,7 +105344,7 @@ static int vdbePmaReaderIncrMergeInit(PmaReader *pReadr, int eMode){ rc = vdbeMergeEngineInit(pTask, pIncr->pMerger, eMode); - /* Set up the required files for pIncr. A multi-theaded IncrMerge object + /* Set up the required files for pIncr. A multi-threaded IncrMerge object ** requires two temp files to itself, whereas a single-threaded object ** only requires a region of pTask->file2. */ if( rc==SQLITE_OK ){ @@ -102486,6 +105984,8 @@ static int bytecodevtabConnect( "p5 INT," "comment TEXT," "subprog TEXT," + "nexec INT," + "ncycle INT," "stmt HIDDEN" ");", @@ -102648,7 +106148,7 @@ static int bytecodevtabColumn( } } } - i += 10; + i += 20; } } switch( i ){ @@ -102698,16 +106198,31 @@ static int bytecodevtabColumn( } break; } - case 10: /* tables_used.type */ + +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + case 9: /* nexec */ + sqlite3_result_int64(ctx, pOp->nExec); + break; + case 10: /* ncycle */ + sqlite3_result_int64(ctx, pOp->nCycle); + break; +#else + case 9: /* nexec */ + case 10: /* ncycle */ + sqlite3_result_int(ctx, 0); + break; +#endif + + case 20: /* tables_used.type */ sqlite3_result_text(ctx, pCur->zType, -1, SQLITE_STATIC); break; - case 11: /* tables_used.schema */ + case 21: /* tables_used.schema */ sqlite3_result_text(ctx, pCur->zSchema, -1, SQLITE_STATIC); break; - case 12: /* tables_used.name */ + case 22: /* tables_used.name */ sqlite3_result_text(ctx, pCur->zName, -1, SQLITE_STATIC); break; - case 13: /* tables_used.wr */ + case 23: /* tables_used.wr */ sqlite3_result_int(ctx, pOp->opcode==OP_OpenWrite); break; } @@ -102781,7 +106296,7 @@ static int bytecodevtabBestIndex( int rc = SQLITE_CONSTRAINT; struct sqlite3_index_constraint *p; bytecodevtab *pVTab = (bytecodevtab*)tab; - int iBaseCol = pVTab->bTablesUsed ? 4 : 8; + int iBaseCol = pVTab->bTablesUsed ? 4 : 10; pIdxInfo->estimatedCost = (double)100; pIdxInfo->estimatedRows = 100; pIdxInfo->idxNum = 0; @@ -102828,7 +106343,8 @@ static sqlite3_module bytecodevtabModule = { /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ 0, - /* xShadowName */ 0 + /* xShadowName */ 0, + /* xIntegrity */ 0 }; @@ -103352,7 +106868,7 @@ static int walkWindowList(Walker *pWalker, Window *pList, int bOneOnly){ ** The return value from this routine is WRC_Abort to abandon the tree walk ** and WRC_Continue to continue. */ -static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ +SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3WalkExprNN(Walker *pWalker, Expr *pExpr){ int rc; testcase( ExprHasProperty(pExpr, EP_TokenOnly) ); testcase( ExprHasProperty(pExpr, EP_Reduced) ); @@ -103361,7 +106877,9 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ if( rc ) return rc & WRC_Abort; if( !ExprHasProperty(pExpr,(EP_TokenOnly|EP_Leaf)) ){ assert( pExpr->x.pList==0 || pExpr->pRight==0 ); - if( pExpr->pLeft && walkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort; + if( pExpr->pLeft && sqlite3WalkExprNN(pWalker, pExpr->pLeft) ){ + return WRC_Abort; + } if( pExpr->pRight ){ assert( !ExprHasProperty(pExpr, EP_WinFunc) ); pExpr = pExpr->pRight; @@ -103385,7 +106903,7 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ return WRC_Continue; } SQLITE_PRIVATE int sqlite3WalkExpr(Walker *pWalker, Expr *pExpr){ - return pExpr ? walkExpr(pWalker,pExpr) : WRC_Continue; + return pExpr ? sqlite3WalkExprNN(pWalker,pExpr) : WRC_Continue; } /* @@ -103460,7 +106978,9 @@ SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){ pSrc = p->pSrc; if( ALWAYS(pSrc) ){ for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ - if( pItem->pSelect && sqlite3WalkSelect(pWalker, pItem->pSelect) ){ + if( pItem->fg.isSubquery + && sqlite3WalkSelect(pWalker, pItem->u4.pSubq->pSelect) + ){ return WRC_Abort; } if( pItem->fg.isTabFunc @@ -103511,7 +107031,7 @@ SQLITE_PRIVATE int sqlite3WalkSelect(Walker *pWalker, Select *p){ } /* Increase the walkerDepth when entering a subquery, and -** descrease when leaving the subquery. +** decrease when leaving the subquery. */ SQLITE_PRIVATE int sqlite3WalkerDepthIncrease(Walker *pWalker, Select *pSelect){ UNUSED_PARAMETER(pSelect); @@ -103630,6 +107150,8 @@ static void resolveAlias( assert( iCol>=0 && iColnExpr ); pOrig = pEList->a[iCol].pExpr; assert( pOrig!=0 ); + assert( !ExprHasProperty(pExpr, EP_Reduced|EP_TokenOnly) ); + if( pExpr->pAggInfo ) return; db = pParse->db; pDup = sqlite3ExprDup(db, pOrig, 0); if( db->mallocFailed ){ @@ -103655,21 +107177,36 @@ static void resolveAlias( } /* -** Subqueries stores the original database, table and column names for their -** result sets in ExprList.a[].zSpan, in the form "DATABASE.TABLE.COLUMN". -** Check to see if the zSpan given to this routine matches the zDb, zTab, -** and zCol. If any of zDb, zTab, and zCol are NULL then those fields will -** match anything. +** Subqueries store the original database, table and column names for their +** result sets in ExprList.a[].zSpan, in the form "DATABASE.TABLE.COLUMN", +** and mark the expression-list item by setting ExprList.a[].fg.eEName +** to ENAME_TAB. +** +** Check to see if the zSpan/eEName of the expression-list item passed to this +** routine matches the zDb, zTab, and zCol. If any of zDb, zTab, and zCol are +** NULL then those fields will match anything. Return true if there is a match, +** or false otherwise. +** +** SF_NestedFrom subqueries also store an entry for the implicit rowid (or +** _rowid_, or oid) column by setting ExprList.a[].fg.eEName to ENAME_ROWID, +** and setting zSpan to "DATABASE.TABLE.". This type of pItem +** argument matches if zCol is a rowid alias. If it is not NULL, (*pbRowid) +** is set to 1 if there is this kind of match. */ SQLITE_PRIVATE int sqlite3MatchEName( const struct ExprList_item *pItem, const char *zCol, const char *zTab, - const char *zDb + const char *zDb, + int *pbRowid ){ int n; const char *zSpan; - if( pItem->fg.eEName!=ENAME_TAB ) return 0; + int eEName = pItem->fg.eEName; + if( eEName!=ENAME_TAB && (eEName!=ENAME_ROWID || NEVER(pbRowid==0)) ){ + return 0; + } + assert( pbRowid==0 || *pbRowid==0 ); zSpan = pItem->zEName; for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){} if( zDb && (sqlite3StrNICmp(zSpan, zDb, n)!=0 || zDb[n]!=0) ){ @@ -103681,9 +107218,11 @@ SQLITE_PRIVATE int sqlite3MatchEName( return 0; } zSpan += n+1; - if( zCol && sqlite3StrICmp(zSpan, zCol)!=0 ){ - return 0; + if( zCol ){ + if( eEName==ENAME_TAB && sqlite3StrICmp(zSpan, zCol)!=0 ) return 0; + if( eEName==ENAME_ROWID && sqlite3IsRowid(zCol)==0 ) return 0; } + if( eEName==ENAME_ROWID ) *pbRowid = 1; return 1; } @@ -103716,6 +107255,7 @@ SQLITE_PRIVATE Bitmask sqlite3ExprColUsed(Expr *pExpr){ assert( ExprUseYTab(pExpr) ); pExTab = pExpr->y.pTab; assert( pExTab!=0 ); + assert( n < pExTab->nCol ); if( (pExTab->tabFlags & TF_HasGenerated)!=0 && (pExTab->aCol[n].colFlags & COLFLAG_GENERATED)!=0 ){ @@ -103746,7 +107286,7 @@ static void extendFJMatch( if( pNew ){ pNew->iTable = pMatch->iCursor; pNew->iColumn = iColumn; - pNew->y.pTab = pMatch->pTab; + pNew->y.pTab = pMatch->pSTab; assert( (pMatch->fg.jointype & (JT_LEFT|JT_LTORJ))!=0 ); ExprSetProperty(pNew, EP_CanBeNull); *ppList = sqlite3ExprListAppend(pParse, *ppList, pNew); @@ -103759,7 +107299,7 @@ static void extendFJMatch( static SQLITE_NOINLINE int isValidSchemaTableName( const char *zTab, /* Name as it appears in the SQL */ Table *pTab, /* The schema table we are trying to match */ - Schema *pSchema /* non-NULL if a database qualifier is present */ + const char *zDb /* non-NULL if a database qualifier is present */ ){ const char *zLegacy; assert( pTab!=0 ); @@ -103770,7 +107310,7 @@ static SQLITE_NOINLINE int isValidSchemaTableName( if( sqlite3StrICmp(zTab+7, &PREFERRED_TEMP_SCHEMA_TABLE[7])==0 ){ return 1; } - if( pSchema==0 ) return 0; + if( zDb==0 ) return 0; if( sqlite3StrICmp(zTab+7, &LEGACY_SCHEMA_TABLE[7])==0 ) return 1; if( sqlite3StrICmp(zTab+7, &PREFERRED_SCHEMA_TABLE[7])==0 ) return 1; }else{ @@ -103810,13 +107350,13 @@ static int lookupName( Parse *pParse, /* The parsing context */ const char *zDb, /* Name of the database containing table, or NULL */ const char *zTab, /* Name of table containing column, or NULL */ - const char *zCol, /* Name of the column. */ + const Expr *pRight, /* Name of the column. */ NameContext *pNC, /* The name context used to resolve the name */ Expr *pExpr /* Make this EXPR node point to the selected column */ ){ int i, j; /* Loop counters */ int cnt = 0; /* Number of matching column names */ - int cntTab = 0; /* Number of matching table names */ + int cntTab = 0; /* Number of potential "rowid" matches */ int nSubquery = 0; /* How many levels of subquery */ sqlite3 *db = pParse->db; /* The database connection */ SrcItem *pItem; /* Use for looping over pSrcList items */ @@ -103827,6 +107367,7 @@ static int lookupName( Table *pTab = 0; /* Table holding the row */ Column *pCol; /* A column of pTab */ ExprList *pFJMatch = 0; /* Matches for FULL JOIN .. USING */ + const char *zCol = pRight->u.zToken; assert( pNC ); /* the name context cannot be NULL. */ assert( zCol ); /* The Z in X.Y.Z cannot be NULL */ @@ -103876,10 +107417,10 @@ static int lookupName( if( pSrcList ){ for(i=0, pItem=pSrcList->a; inSrc; i++, pItem++){ u8 hCol; - pTab = pItem->pTab; + pTab = pItem->pSTab; assert( pTab!=0 && pTab->zName!=0 ); assert( pTab->nCol>0 || pParse->nErr ); - assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect) ); + assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem)); if( pItem->fg.isNestedFrom ){ /* In this case, pItem is a subquery that has been formed from a ** parenthesized subset of the FROM clause terms. Example: @@ -103888,44 +107429,58 @@ static int lookupName( ** This pItem -------------^ */ int hit = 0; - assert( pItem->pSelect!=0 ); - pEList = pItem->pSelect->pEList; + Select *pSel; + assert( pItem->fg.isSubquery ); + assert( pItem->u4.pSubq!=0 ); + pSel = pItem->u4.pSubq->pSelect; + assert( pSel!=0 ); + pEList = pSel->pEList; assert( pEList!=0 ); assert( pEList->nExpr==pTab->nCol ); for(j=0; jnExpr; j++){ - if( !sqlite3MatchEName(&pEList->a[j], zCol, zTab, zDb) ){ + int bRowid = 0; /* True if possible rowid match */ + if( !sqlite3MatchEName(&pEList->a[j], zCol, zTab, zDb, &bRowid) ){ continue; } - if( cnt>0 ){ - if( pItem->fg.isUsing==0 - || sqlite3IdListIndex(pItem->u3.pUsing, zCol)<0 - ){ - /* Two or more tables have the same column name which is - ** not joined by USING. This is an error. Signal as much - ** by clearing pFJMatch and letting cnt go above 1. */ - sqlite3ExprListDelete(db, pFJMatch); - pFJMatch = 0; - }else - if( (pItem->fg.jointype & JT_RIGHT)==0 ){ - /* An INNER or LEFT JOIN. Use the left-most table */ - continue; - }else - if( (pItem->fg.jointype & JT_LEFT)==0 ){ - /* A RIGHT JOIN. Use the right-most table */ - cnt = 0; - sqlite3ExprListDelete(db, pFJMatch); - pFJMatch = 0; - }else{ - /* For a FULL JOIN, we must construct a coalesce() func */ - extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn); + if( bRowid==0 ){ + if( cnt>0 ){ + if( pItem->fg.isUsing==0 + || sqlite3IdListIndex(pItem->u3.pUsing, zCol)<0 + ){ + /* Two or more tables have the same column name which is + ** not joined by USING. This is an error. Signal as much + ** by clearing pFJMatch and letting cnt go above 1. */ + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + }else + if( (pItem->fg.jointype & JT_RIGHT)==0 ){ + /* An INNER or LEFT JOIN. Use the left-most table */ + continue; + }else + if( (pItem->fg.jointype & JT_LEFT)==0 ){ + /* A RIGHT JOIN. Use the right-most table */ + cnt = 0; + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + }else{ + /* For a FULL JOIN, we must construct a coalesce() func */ + extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn); + } } + cnt++; + hit = 1; + }else if( cnt>0 ){ + /* This is a potential rowid match, but there has already been + ** a real match found. So this can be ignored. */ + continue; } - cnt++; - cntTab = 2; + cntTab++; pMatch = pItem; pExpr->iColumn = j; pEList->a[j].fg.bUsed = 1; - hit = 1; + + /* rowid cannot be part of a USING clause - assert() this. */ + assert( bRowid==0 || pEList->a[j].fg.bUsingTerm==0 ); if( pEList->a[j].fg.bUsingTerm ) break; } if( hit || zTab==0 ) continue; @@ -103942,7 +107497,7 @@ static int lookupName( } }else if( sqlite3StrICmp(zTab, pTab->zName)!=0 ){ if( pTab->tnum!=1 ) continue; - if( !isValidSchemaTableName(zTab, pTab, pSchema) ) continue; + if( !isValidSchemaTableName(zTab, pTab, zDb) ) continue; } assert( ExprUseYTab(pExpr) ); if( IN_RENAME_OBJECT && pItem->zAlias ){ @@ -103989,14 +107544,43 @@ static int lookupName( } } if( 0==cnt && VisibleRowid(pTab) ){ + /* pTab is a potential ROWID match. Keep track of it and match + ** the ROWID later if that seems appropriate. (Search for "cntTab" + ** to find related code.) Only allow a ROWID match if there is + ** a single ROWID match candidate. + */ +#ifdef SQLITE_ALLOW_ROWID_IN_VIEW + /* In SQLITE_ALLOW_ROWID_IN_VIEW mode, allow a ROWID match + ** if there is a single VIEW candidate or if there is a single + ** non-VIEW candidate plus multiple VIEW candidates. In other + ** words non-VIEW candidate terms take precedence over VIEWs. + */ + if( cntTab==0 + || (cntTab==1 + && pMatch!=0 + && ALWAYS(pMatch->pSTab!=0) + && (pMatch->pSTab->tabFlags & TF_Ephemeral)!=0 + && (pTab->tabFlags & TF_Ephemeral)==0) + ){ + cntTab = 1; + pMatch = pItem; + }else{ + cntTab++; + } +#else + /* The (much more common) non-SQLITE_ALLOW_ROWID_IN_VIEW case is + ** simpler since we require exactly one candidate, which will + ** always be a non-VIEW + */ cntTab++; pMatch = pItem; +#endif } } if( pMatch ){ pExpr->iTable = pMatch->iCursor; assert( ExprUseYTab(pExpr) ); - pExpr->y.pTab = pMatch->pTab; + pExpr->y.pTab = pMatch->pSTab; if( (pMatch->fg.jointype & (JT_LEFT|JT_LTORJ))!=0 ){ ExprSetProperty(pExpr, EP_CanBeNull); } @@ -104018,7 +107602,9 @@ static int lookupName( assert( op==TK_DELETE || op==TK_UPDATE || op==TK_INSERT ); if( pParse->bReturning ){ if( (pNC->ncFlags & NC_UBaseReg)!=0 - && (zTab==0 || sqlite3StrICmp(zTab,pParse->pTriggerTab->zName)==0) + && ALWAYS(zTab==0 + || sqlite3StrICmp(zTab,pParse->pTriggerTab->zName)==0 + || isValidSchemaTableName(zTab, pParse->pTriggerTab, 0)) ){ pExpr->iTable = op!=TK_DELETE; pTab = pParse->pTriggerTab; @@ -104036,7 +107622,7 @@ static int lookupName( if( (pNC->ncFlags & NC_UUpsert)!=0 && zTab!=0 ){ Upsert *pUpsert = pNC->uNC.pUpsert; if( pUpsert && sqlite3StrICmp("excluded",zTab)==0 ){ - pTab = pUpsert->pUpsertSrc->a[0].pTab; + pTab = pUpsert->pUpsertSrc->a[0].pSTab; pExpr->iTable = EXCLUDED_TABLE_NUMBER; } } @@ -104115,14 +107701,19 @@ static int lookupName( ** Perhaps the name is a reference to the ROWID */ if( cnt==0 - && cntTab==1 + && cntTab>=1 && pMatch && (pNC->ncFlags & (NC_IdxExpr|NC_GenCol))==0 && sqlite3IsRowid(zCol) - && ALWAYS(VisibleRowid(pMatch->pTab)) + && ALWAYS(VisibleRowid(pMatch->pSTab) || pMatch->fg.isNestedFrom) ){ - cnt = 1; - pExpr->iColumn = -1; + cnt = cntTab; +#if SQLITE_ALLOW_ROWID_IN_VIEW+0==2 + if( pMatch->pSTab!=0 && IsView(pMatch->pSTab) ){ + eNewExprOp = TK_NULL; + } +#endif + if( pMatch->fg.isNestedFrom==0 ) pExpr->iColumn = -1; pExpr->affExpr = SQLITE_AFF_INTEGER; } @@ -104275,12 +107866,17 @@ static int lookupName( sqlite3ErrorMsg(pParse, "%s: %s.%s.%s", zErr, zDb, zTab, zCol); }else if( zTab ){ sqlite3ErrorMsg(pParse, "%s: %s.%s", zErr, zTab, zCol); + }else if( cnt==0 && ExprHasProperty(pRight,EP_DblQuoted) ){ + sqlite3ErrorMsg(pParse, "%s: \"%s\" - should this be a" + " string literal in single-quotes?", + zErr, zCol); }else{ sqlite3ErrorMsg(pParse, "%s: %s", zErr, zCol); } sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr); pParse->checkSchema = 1; pTopNC->nNcErr++; + eNewExprOp = TK_NULL; } assert( pFJMatch==0 ); @@ -104307,8 +107903,12 @@ static int lookupName( ** If a generated column is referenced, set bits for every column ** of the table. */ - if( pExpr->iColumn>=0 && pMatch!=0 ){ - pMatch->colUsed |= sqlite3ExprColUsed(pExpr); + if( pMatch ){ + if( pExpr->iColumn>=0 ){ + pMatch->colUsed |= sqlite3ExprColUsed(pExpr); + }else{ + pMatch->fg.rowidUsed = 1; + } } pExpr->op = eNewExprOp; @@ -104346,7 +107946,7 @@ SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *db, SrcList *pSrc, int iSr SrcItem *pItem = &pSrc->a[iSrc]; Table *pTab; assert( ExprUseYTab(p) ); - pTab = p->y.pTab = pItem->pTab; + pTab = p->y.pTab = pItem->pSTab; p->iTable = pItem->iCursor; if( p->y.pTab->iPKey==iCol ){ p->iColumn = -1; @@ -104465,7 +108065,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ pItem = pSrcList->a; pExpr->op = TK_COLUMN; assert( ExprUseYTab(pExpr) ); - pExpr->y.pTab = pItem->pTab; + pExpr->y.pTab = pItem->pSTab; pExpr->iTable = pItem->iCursor; pExpr->iColumn--; pExpr->affExpr = SQLITE_AFF_INTEGER; @@ -104485,6 +108085,19 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ ** resolved. This prevents "column" from being counted as having been ** referenced, which might prevent a SELECT from being erroneously ** marked as correlated. + ** + ** 2024-03-28: Beware of aggregates. A bare column of aggregated table + ** can still evaluate to NULL even though it is marked as NOT NULL. + ** Example: + ** + ** CREATE TABLE t1(a INT NOT NULL); + ** SELECT a, a IS NULL, a IS NOT NULL, count(*) FROM t1; + ** + ** The "a IS NULL" and "a IS NOT NULL" expressions cannot be optimized + ** here because at the time this case is hit, we do not yet know whether + ** or not t1 is being aggregated. We have to assume the worst and omit + ** the optimization. The only time it is safe to apply this optimization + ** is within the WHERE clause. */ case TK_NOTNULL: case TK_ISNULL: { @@ -104495,19 +108108,36 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ anRef[i] = p->nRef; } sqlite3WalkExpr(pWalker, pExpr->pLeft); - if( 0==sqlite3ExprCanBeNull(pExpr->pLeft) && !IN_RENAME_OBJECT ){ - testcase( ExprHasProperty(pExpr, EP_OuterON) ); - assert( !ExprHasProperty(pExpr, EP_IntValue) ); - pExpr->u.iValue = (pExpr->op==TK_NOTNULL); - pExpr->flags |= EP_IntValue; - pExpr->op = TK_INTEGER; + if( IN_RENAME_OBJECT ) return WRC_Prune; + if( sqlite3ExprCanBeNull(pExpr->pLeft) ){ + /* The expression can be NULL. So the optimization does not apply */ + return WRC_Prune; + } - for(i=0, p=pNC; p && ipNext, i++){ - p->nRef = anRef[i]; + for(i=0, p=pNC; p; p=p->pNext, i++){ + if( (p->ncFlags & NC_Where)==0 ){ + return WRC_Prune; /* Not in a WHERE clause. Unsafe to optimize. */ } - sqlite3ExprDelete(pParse->db, pExpr->pLeft); - pExpr->pLeft = 0; } + testcase( ExprHasProperty(pExpr, EP_OuterON) ); + assert( !ExprHasProperty(pExpr, EP_IntValue) ); +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x80000 ){ + sqlite3DebugPrintf( + "NOT NULL strength reduction converts the following to %d:\n", + pExpr->op==TK_NOTNULL + ); + sqlite3ShowExpr(pExpr); + } +#endif /* TREETRACE_ENABLED */ + pExpr->u.iValue = (pExpr->op==TK_NOTNULL); + pExpr->flags |= EP_IntValue; + pExpr->op = TK_INTEGER; + for(i=0, p=pNC; p && ipNext, i++){ + p->nRef = anRef[i]; + } + sqlite3ExprDelete(pParse->db, pExpr->pLeft); + pExpr->pLeft = 0; return WRC_Prune; } @@ -104521,7 +108151,6 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ */ case TK_ID: case TK_DOT: { - const char *zColumn; const char *zTable; const char *zDb; Expr *pRight; @@ -104530,7 +108159,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ zDb = 0; zTable = 0; assert( !ExprHasProperty(pExpr, EP_IntValue) ); - zColumn = pExpr->u.zToken; + pRight = pExpr; }else{ Expr *pLeft = pExpr->pLeft; testcase( pNC->ncFlags & NC_IdxExpr ); @@ -104549,21 +108178,20 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ } assert( ExprUseUToken(pLeft) && ExprUseUToken(pRight) ); zTable = pLeft->u.zToken; - zColumn = pRight->u.zToken; assert( ExprUseYTab(pExpr) ); if( IN_RENAME_OBJECT ){ sqlite3RenameTokenRemap(pParse, (void*)pExpr, (void*)pRight); sqlite3RenameTokenRemap(pParse, (void*)&pExpr->y.pTab, (void*)pLeft); } } - return lookupName(pParse, zDb, zTable, zColumn, pNC, pExpr); + return lookupName(pParse, zDb, zTable, pRight, pNC, pExpr); } /* Resolve function names */ case TK_FUNCTION: { - ExprList *pList = pExpr->x.pList; /* The argument list */ - int n = pList ? pList->nExpr : 0; /* Number of arguments */ + ExprList *pList; /* The argument list */ + int n; /* Number of arguments */ int no_such_func = 0; /* True if no such function exists */ int wrong_num_args = 0; /* True if wrong number of arguments */ int is_agg = 0; /* True if is an aggregate function */ @@ -104575,6 +108203,9 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ Window *pWin = (IsWindowFunc(pExpr) ? pExpr->y.pWin : 0); #endif assert( !ExprHasProperty(pExpr, EP_xIsSelect|EP_IntValue) ); + assert( pExpr->pLeft==0 || pExpr->pLeft->op==TK_ORDER ); + pList = pExpr->x.pList; + n = pList ? pList->nExpr : 0; zId = pExpr->u.zToken; pDef = sqlite3FindFunction(pParse->db, zId, n, enc, 0); if( pDef==0 ){ @@ -104623,6 +108254,24 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ } } #endif + + /* If the function may call sqlite3_value_subtype(), then set the + ** EP_SubtArg flag on all of its argument expressions. This prevents + ** where.c from replacing the expression with a value read from an + ** index on the same expression, which will not have the correct + ** subtype. Also set the flag if the function expression itself is + ** an EP_SubtArg expression. In this case subtypes are required as + ** the function may return a value with a subtype back to its + ** caller using sqlite3_result_value(). */ + if( (pDef->funcFlags & SQLITE_SUBTYPE) + || ExprHasProperty(pExpr, EP_SubtArg) + ){ + int ii; + for(ii=0; iia[ii].pExpr, EP_SubtArg); + } + } + if( pDef->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG) ){ /* For the purposes of the EP_ConstFunc flag, date and time ** functions and other functions that change slowly are considered @@ -104716,6 +108365,10 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ pNC->nNcErr++; } #endif + else if( is_agg==0 && pExpr->pLeft ){ + sqlite3ExprOrderByAggregateError(pParse, pExpr); + pNC->nNcErr++; + } if( is_agg ){ /* Window functions may not be arguments of aggregate functions. ** Or arguments of other window functions. But aggregate functions @@ -104727,17 +108380,20 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ #endif } } -#ifndef SQLITE_OMIT_WINDOWFUNC - else if( ExprHasProperty(pExpr, EP_WinFunc) ){ + else if( ExprHasProperty(pExpr, EP_WinFunc) || pExpr->pLeft ){ is_agg = 1; } -#endif sqlite3WalkExprList(pWalker, pList); if( is_agg ){ + if( pExpr->pLeft ){ + assert( pExpr->pLeft->op==TK_ORDER ); + assert( ExprUseXList(pExpr->pLeft) ); + sqlite3WalkExprList(pWalker, pExpr->pLeft->x.pList); + } #ifndef SQLITE_OMIT_WINDOWFUNC - if( pWin ){ + if( pWin && pParse->nErr==0 ){ Select *pSel = pNC->pWinSelect; - assert( pWin==0 || (ExprUseYWin(pExpr) && pWin==pExpr->y.pWin) ); + assert( ExprUseYWin(pExpr) && pWin==pExpr->y.pWin ); if( IN_RENAME_OBJECT==0 ){ sqlite3WindowUpdate(pParse, pSel ? pSel->pWinDefn : 0, pWin, pDef); if( pParse->db->mallocFailed ) break; @@ -104762,11 +108418,12 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ while( pNC2 && sqlite3ReferencesSrcList(pParse, pExpr, pNC2->pSrcList)==0 ){ - pExpr->op2++; + pExpr->op2 += (1 + pNC2->nNestedSelect); pNC2 = pNC2->pNext; } assert( pDef!=0 || IN_RENAME_OBJECT ); if( pNC2 && pDef ){ + pExpr->op2 += pNC2->nNestedSelect; assert( SQLITE_FUNC_MINMAX==NC_MinMaxAgg ); assert( SQLITE_FUNC_ANYORDER==NC_OrderAgg ); testcase( (pDef->funcFlags & SQLITE_FUNC_MINMAX)!=0 ); @@ -104795,6 +108452,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ testcase( pNC->ncFlags & NC_PartIdx ); testcase( pNC->ncFlags & NC_IdxExpr ); testcase( pNC->ncFlags & NC_GenCol ); + assert( pExpr->x.pSelect ); if( pNC->ncFlags & NC_SelfRef ){ notValidImpl(pParse, pNC, "subqueries", pExpr, pExpr); }else{ @@ -104803,6 +108461,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ assert( pNC->nRef>=nRef ); if( nRef!=pNC->nRef ){ ExprSetProperty(pExpr, EP_VarSelect); + pExpr->x.pSelect->selFlags |= SF_Correlated; } pNC->ncFlags |= NC_Subquery; } @@ -104941,7 +108600,7 @@ static int resolveOrderByTermToExprList( int rc; /* Return code from subprocedures */ u8 savedSuppErr; /* Saved value of db->suppressErr */ - assert( sqlite3ExprIsInteger(pE, &i)==0 ); + assert( sqlite3ExprIsInteger(pE, &i, 0)==0 ); pEList = pSelect->pEList; /* Resolve all names in the ORDER BY term expression @@ -105040,7 +108699,7 @@ static int resolveCompoundOrderBy( if( pItem->fg.done ) continue; pE = sqlite3ExprSkipCollateAndLikely(pItem->pExpr); if( NEVER(pE==0) ) continue; - if( sqlite3ExprIsInteger(pE, &iCol) ){ + if( sqlite3ExprIsInteger(pE, &iCol, 0) ){ if( iCol<=0 || iCol>pEList->nExpr ){ resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr, pE); return 1; @@ -105225,7 +108884,7 @@ static int resolveOrderGroupBy( continue; } } - if( sqlite3ExprIsInteger(pE2, &iCol) ){ + if( sqlite3ExprIsInteger(pE2, &iCol, 0) ){ /* The ORDER BY term is an integer constant. Again, set the column ** number so that sqlite3ResolveOrderGroupBy() will convert the ** order-by term to a copy of the result-set expression */ @@ -105244,7 +108903,7 @@ static int resolveOrderGroupBy( } for(j=0; jpEList->nExpr; j++){ if( sqlite3ExprCompare(0, pE, pSelect->pEList->a[j].pExpr, -1)==0 ){ - /* Since this expresion is being changed into a reference + /* Since this expression is being changed into a reference ** to an identical expression in the result set, remove all Window ** objects belonging to the expression from the Select.pWin list. */ windowRemoveExprFromSelect(pSelect, pE); @@ -105297,10 +108956,8 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ while( p ){ assert( (p->selFlags & SF_Expanded)!=0 ); assert( (p->selFlags & SF_Resolved)==0 ); - assert( db->suppressErr==0 ); /* SF_Resolved not set if errors suppressed */ p->selFlags |= SF_Resolved; - /* Resolve the expressions in the LIMIT and OFFSET clauses. These ** are not allowed to refer to any names, so pass an empty NameContext. */ @@ -105318,7 +108975,11 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ ** moves the pOrderBy down to the sub-query. It will be moved back ** after the names have been resolved. */ if( p->selFlags & SF_Converted ){ - Select *pSub = p->pSrc->a[0].pSelect; + Select *pSub; + assert( p->pSrc->a[0].fg.isSubquery ); + assert( p->pSrc->a[0].u4.pSubq!=0 ); + pSub = p->pSrc->a[0].u4.pSubq->pSelect; + assert( pSub!=0 ); assert( p->pSrc->nSrc==1 && p->pOrderBy ); assert( pSub->pPrior && pSub->pOrderBy==0 ); pSub->pOrderBy = p->pOrderBy; @@ -105327,14 +108988,19 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ /* Recursively resolve names in all subqueries in the FROM clause */ + if( pOuterNC ) pOuterNC->nNestedSelect++; for(i=0; ipSrc->nSrc; i++){ SrcItem *pItem = &p->pSrc->a[i]; - if( pItem->pSelect && (pItem->pSelect->selFlags & SF_Resolved)==0 ){ + assert( pItem->zName!=0 + || pItem->fg.isSubquery ); /* Test of tag-20240424-1*/ + if( pItem->fg.isSubquery + && (pItem->u4.pSubq->pSelect->selFlags & SF_Resolved)==0 + ){ int nRef = pOuterNC ? pOuterNC->nRef : 0; const char *zSavedContext = pParse->zAuthContext; if( pItem->zName ) pParse->zAuthContext = pItem->zName; - sqlite3ResolveSelectNames(pParse, pItem->pSelect, pOuterNC); + sqlite3ResolveSelectNames(pParse, pItem->u4.pSubq->pSelect, pOuterNC); pParse->zAuthContext = zSavedContext; if( pParse->nErr ) return WRC_Abort; assert( db->mallocFailed==0 ); @@ -105351,6 +109017,9 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ } } } + if( pOuterNC && ALWAYS(pOuterNC->nNestedSelect>0) ){ + pOuterNC->nNestedSelect--; + } /* Set up the local name-context to pass to sqlite3ResolveExprNames() to ** resolve the result-set expression list. @@ -105394,7 +109063,9 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ } if( sqlite3ResolveExprNames(&sNC, p->pHaving) ) return WRC_Abort; } + sNC.ncFlags |= NC_Where; if( sqlite3ResolveExprNames(&sNC, p->pWhere) ) return WRC_Abort; + sNC.ncFlags &= ~NC_Where; /* Resolve names in table-valued-function arguments */ for(i=0; ipSrc->nSrc; i++){ @@ -105431,7 +109102,10 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ ** These integers will be replaced by copies of the corresponding result ** set expressions by the call to resolveOrderGroupBy() below. */ if( p->selFlags & SF_Converted ){ - Select *pSub = p->pSrc->a[0].pSelect; + Select *pSub; + assert( p->pSrc->a[0].fg.isSubquery ); + pSub = p->pSrc->a[0].u4.pSubq->pSelect; + assert( pSub!=0 ); p->pOrderBy = pSub->pOrderBy; pSub->pOrderBy = 0; } @@ -105567,7 +109241,8 @@ SQLITE_PRIVATE int sqlite3ResolveExprNames( return SQLITE_ERROR; } #endif - sqlite3WalkExpr(&w, pExpr); + assert( pExpr!=0 ); + sqlite3WalkExprNN(&w, pExpr); #if SQLITE_MAX_EXPR_DEPTH>0 w.pParse->nHeight -= pExpr->nHeight; #endif @@ -105584,6 +109259,9 @@ SQLITE_PRIVATE int sqlite3ResolveExprNames( ** Resolve all names for all expression in an expression list. This is ** just like sqlite3ResolveExprNames() except that it works for an expression ** list rather than a single expression. +** +** The return value is SQLITE_OK (0) for success or SQLITE_ERROR (1) for a +** failure. */ SQLITE_PRIVATE int sqlite3ResolveExprListNames( NameContext *pNC, /* Namespace to resolve expressions in. */ @@ -105592,7 +109270,7 @@ SQLITE_PRIVATE int sqlite3ResolveExprListNames( int i; int savedHasAgg = 0; Walker w; - if( pList==0 ) return WRC_Continue; + if( pList==0 ) return SQLITE_OK; w.pParse = pNC->pParse; w.xExprCallback = resolveExprStep; w.xSelectCallback = resolveSelectStep; @@ -105606,10 +109284,10 @@ SQLITE_PRIVATE int sqlite3ResolveExprListNames( #if SQLITE_MAX_EXPR_DEPTH>0 w.pParse->nHeight += pExpr->nHeight; if( sqlite3ExprCheckHeight(w.pParse, w.pParse->nHeight) ){ - return WRC_Abort; + return SQLITE_ERROR; } #endif - sqlite3WalkExpr(&w, pExpr); + sqlite3WalkExprNN(&w, pExpr); #if SQLITE_MAX_EXPR_DEPTH>0 w.pParse->nHeight -= pExpr->nHeight; #endif @@ -105623,15 +109301,15 @@ SQLITE_PRIVATE int sqlite3ResolveExprListNames( (NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg); pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg); } - if( w.pParse->nErr>0 ) return WRC_Abort; + if( w.pParse->nErr>0 ) return SQLITE_ERROR; } pNC->ncFlags |= savedHasAgg; - return WRC_Continue; + return SQLITE_OK; } /* ** Resolve all names in all expressions of a SELECT and in all -** decendents of the SELECT, including compounds off of p->pPrior, +** descendants of the SELECT, including compounds off of p->pPrior, ** subqueries in expressions, and subqueries used as FROM clause ** terms. ** @@ -105694,7 +109372,7 @@ SQLITE_PRIVATE int sqlite3ResolveSelfReference( if( pTab ){ sSrc.nSrc = 1; sSrc.a[0].zName = pTab->zName; - sSrc.a[0].pTab = pTab; + sSrc.a[0].pSTab = pTab; sSrc.a[0].iCursor = -1; if( pTab->pSchema!=pParse->db->aDb[1].pSchema ){ /* Cause EP_FromDDL to be set on TK_FUNCTION nodes of non-TEMP @@ -105781,6 +109459,7 @@ SQLITE_PRIVATE char sqlite3ExprAffinity(const Expr *pExpr){ if( op==TK_SELECT_COLUMN ){ assert( pExpr->pLeft!=0 && ExprUseXSelect(pExpr->pLeft) ); assert( pExpr->iColumn < pExpr->iTable ); + assert( pExpr->iColumn >= 0 ); assert( pExpr->iTable==pExpr->pLeft->x.pSelect->pEList->nExpr ); return sqlite3ExprAffinity( pExpr->pLeft->x.pSelect->pEList->a[pExpr->iColumn].pExpr @@ -105798,7 +109477,9 @@ SQLITE_PRIVATE char sqlite3ExprAffinity(const Expr *pExpr){ op = pExpr->op; continue; } - if( op!=TK_REGISTER || (op = pExpr->op2)==TK_REGISTER ) break; + if( op!=TK_REGISTER ) break; + op = pExpr->op2; + if( NEVER( op==TK_REGISTER ) ) break; } return pExpr->affExpr; } @@ -105931,9 +109612,10 @@ SQLITE_PRIVATE Expr *sqlite3ExprSkipCollateAndLikely(Expr *pExpr){ assert( pExpr->x.pList->nExpr>0 ); assert( pExpr->op==TK_FUNCTION ); pExpr = pExpr->x.pList->a[0].pExpr; - }else{ - assert( pExpr->op==TK_COLLATE ); + }else if( pExpr->op==TK_COLLATE ){ pExpr = pExpr->pLeft; + }else{ + break; } } return pExpr; @@ -105992,11 +109674,10 @@ SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr){ }else{ Expr *pNext = p->pRight; /* The Expr.x union is never used at the same time as Expr.pRight */ - assert( ExprUseXList(p) ); - assert( p->x.pList==0 || p->pRight==0 ); - if( p->x.pList!=0 && !db->mallocFailed ){ + assert( !ExprUseXList(p) || p->x.pList==0 || p->pRight==0 ); + if( ExprUseXList(p) && p->x.pList!=0 && !db->mallocFailed ){ int i; - for(i=0; ALWAYS(ix.pList->nExpr); i++){ + for(i=0; ix.pList->nExpr; i++){ if( ExprHasProperty(p->x.pList->a[i].pExpr, EP_Collate) ){ pNext = p->x.pList->a[i].pExpr; break; @@ -106018,7 +109699,7 @@ SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr){ /* ** Return the collation sequence for the expression pExpr. If ** there is no defined collating sequence, return a pointer to the -** defautl collation sequence. +** default collation sequence. ** ** See also: sqlite3ExprCollSeq() ** @@ -106148,7 +109829,7 @@ SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq( return pColl; } -/* Expresssion p is a comparison operator. Return a collation sequence +/* Expression p is a comparison operator. Return a collation sequence ** appropriate for the comparison operator. ** ** This is normally just a wrapper around sqlite3BinaryCompareCollSeq(). @@ -106305,6 +109986,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprForVectorField( */ pRet = sqlite3PExpr(pParse, TK_SELECT_COLUMN, 0, 0); if( pRet ){ + ExprSetProperty(pRet, EP_FullSize); pRet->iTable = nField; pRet->iColumn = iField; pRet->pLeft = pVector; @@ -106604,6 +110286,15 @@ SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){ #define exprSetHeight(y) #endif /* SQLITE_MAX_EXPR_DEPTH>0 */ +/* +** Set the error offset for an Expr node, if possible. +*/ +SQLITE_PRIVATE void sqlite3ExprSetErrorOffset(Expr *pExpr, int iOfst){ + if( pExpr==0 ) return; + if( NEVER(ExprUseWJoin(pExpr)) ) return; + pExpr->w.iOfst = iOfst; +} + /* ** This routine is the core allocator for Expr nodes. ** @@ -106618,11 +110309,12 @@ SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){ ** appear to be quoted. If the quotes were of the form "..." (double-quotes) ** then the EP_DblQuoted flag is set on the expression node. ** -** Special case: If op==TK_INTEGER and pToken points to a string that -** can be translated into a 32-bit integer, then the token is not -** stored in u.zToken. Instead, the integer values is written -** into u.iValue and the EP_IntValue flag is set. No extra storage +** Special case (tag-20240227-a): If op==TK_INTEGER and pToken points to +** a string that can be translated into a 32-bit integer, then the token is +** not stored in u.zToken. Instead, the integer values is written +** into u.iValue and the EP_IntValue flag is set. No extra storage ** is allocated to hold the integer text and the dequote flag is ignored. +** See also tag-20240227-b. */ SQLITE_PRIVATE Expr *sqlite3ExprAlloc( sqlite3 *db, /* Handle for sqlite3DbMallocRawNN() */ @@ -106638,7 +110330,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprAlloc( if( pToken ){ if( op!=TK_INTEGER || pToken->z==0 || sqlite3GetInt32(pToken->z, &iValue)==0 ){ - nExtra = pToken->n+1; + nExtra = pToken->n+1; /* tag-20240227-a */ assert( iValue>=0 ); } } @@ -106828,9 +110520,9 @@ SQLITE_PRIVATE Select *sqlite3ExprListToValues(Parse *pParse, int nElem, ExprLis ** Join two expressions using an AND operator. If either expression is ** NULL, then just return the other expression. ** -** If one side or the other of the AND is known to be false, then instead -** of returning an AND expression, just return a constant expression with -** a value of false. +** If one side or the other of the AND is known to be false, and neither side +** is part of an ON clause, then instead of returning an AND expression, +** just return a constant expression with a value of false. */ SQLITE_PRIVATE Expr *sqlite3ExprAnd(Parse *pParse, Expr *pLeft, Expr *pRight){ sqlite3 *db = pParse->db; @@ -106838,14 +110530,17 @@ SQLITE_PRIVATE Expr *sqlite3ExprAnd(Parse *pParse, Expr *pLeft, Expr *pRight){ return pRight; }else if( pRight==0 ){ return pLeft; - }else if( (ExprAlwaysFalse(pLeft) || ExprAlwaysFalse(pRight)) - && !IN_RENAME_OBJECT - ){ - sqlite3ExprDeferredDelete(pParse, pLeft); - sqlite3ExprDeferredDelete(pParse, pRight); - return sqlite3Expr(db, TK_INTEGER, "0"); }else{ - return sqlite3PExpr(pParse, TK_AND, pLeft, pRight); + u32 f = pLeft->flags | pRight->flags; + if( (f&(EP_OuterON|EP_InnerON|EP_IsFalse))==EP_IsFalse + && !IN_RENAME_OBJECT + ){ + sqlite3ExprDeferredDelete(pParse, pLeft); + sqlite3ExprDeferredDelete(pParse, pRight); + return sqlite3Expr(db, TK_INTEGER, "0"); + }else{ + return sqlite3PExpr(pParse, TK_AND, pLeft, pRight); + } } } @@ -106883,6 +110578,67 @@ SQLITE_PRIVATE Expr *sqlite3ExprFunction( return pNew; } +/* +** Report an error when attempting to use an ORDER BY clause within +** the arguments of a non-aggregate function. +*/ +SQLITE_PRIVATE void sqlite3ExprOrderByAggregateError(Parse *pParse, Expr *p){ + sqlite3ErrorMsg(pParse, + "ORDER BY may not be used with non-aggregate %#T()", p + ); +} + +/* +** Attach an ORDER BY clause to a function call. +** +** functionname( arguments ORDER BY sortlist ) +** \_____________________/ \______/ +** pExpr pOrderBy +** +** The ORDER BY clause is inserted into a new Expr node of type TK_ORDER +** and added to the Expr.pLeft field of the parent TK_FUNCTION node. +*/ +SQLITE_PRIVATE void sqlite3ExprAddFunctionOrderBy( + Parse *pParse, /* Parsing context */ + Expr *pExpr, /* The function call to which ORDER BY is to be added */ + ExprList *pOrderBy /* The ORDER BY clause to add */ +){ + Expr *pOB; + sqlite3 *db = pParse->db; + if( NEVER(pOrderBy==0) ){ + assert( db->mallocFailed ); + return; + } + if( pExpr==0 ){ + assert( db->mallocFailed ); + sqlite3ExprListDelete(db, pOrderBy); + return; + } + assert( pExpr->op==TK_FUNCTION ); + assert( pExpr->pLeft==0 ); + assert( ExprUseXList(pExpr) ); + if( pExpr->x.pList==0 || NEVER(pExpr->x.pList->nExpr==0) ){ + /* Ignore ORDER BY on zero-argument aggregates */ + sqlite3ParserAddCleanup(pParse, sqlite3ExprListDeleteGeneric, pOrderBy); + return; + } + if( IsWindowFunc(pExpr) ){ + sqlite3ExprOrderByAggregateError(pParse, pExpr); + sqlite3ExprListDelete(db, pOrderBy); + return; + } + + pOB = sqlite3ExprAlloc(db, TK_ORDER, 0, 0); + if( pOB==0 ){ + sqlite3ExprListDelete(db, pOrderBy); + return; + } + pOB->x.pList = pOrderBy; + assert( ExprUseXList(pOB) ); + pExpr->pLeft = pOB; + ExprSetProperty(pOB, EP_FullSize); +} + /* ** Check to see if a function is usable according to current access ** rules: @@ -107006,6 +110762,7 @@ SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ assert( p!=0 ); assert( db!=0 ); +exprDeleteRestart: assert( !ExprUseUValue(p) || p->u.iValue>=0 ); assert( !ExprUseYWin(p) || !ExprUseYSub(p) ); assert( !ExprUseYWin(p) || p->y.pWin!=0 || db->mallocFailed ); @@ -107021,7 +110778,6 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ if( !ExprHasProperty(p, (EP_TokenOnly|EP_Leaf)) ){ /* The Expr.x union is never used at the same time as Expr.pRight */ assert( (ExprUseXList(p) && p->x.pList==0) || p->pRight==0 ); - if( p->pLeft && p->op!=TK_SELECT_COLUMN ) sqlite3ExprDeleteNN(db, p->pLeft); if( p->pRight ){ assert( !ExprHasProperty(p, EP_WinFunc) ); sqlite3ExprDeleteNN(db, p->pRight); @@ -107036,6 +110792,19 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ } #endif } + if( p->pLeft && p->op!=TK_SELECT_COLUMN ){ + Expr *pLeft = p->pLeft; + if( !ExprHasProperty(p, EP_Static) + && !ExprHasProperty(pLeft, EP_Static) + ){ + /* Avoid unnecessary recursion on unary operators */ + sqlite3DbNNFreeNN(db, p); + p = pLeft; + goto exprDeleteRestart; + }else{ + sqlite3ExprDeleteNN(db, pLeft); + } + } } if( !ExprHasProperty(p, EP_Static) ){ sqlite3DbNNFreeNN(db, p); @@ -107044,6 +110813,9 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3 *db, Expr *p){ if( p ) sqlite3ExprDeleteNN(db, p); } +SQLITE_PRIVATE void sqlite3ExprDeleteGeneric(sqlite3 *db, void *p){ + if( ALWAYS(p) ) sqlite3ExprDeleteNN(db, (Expr*)p); +} /* ** Clear both elements of an OnOrUsing object @@ -107061,17 +110833,15 @@ SQLITE_PRIVATE void sqlite3ClearOnOrUsing(sqlite3 *db, OnOrUsing *p){ /* ** Arrange to cause pExpr to be deleted when the pParse is deleted. ** This is similar to sqlite3ExprDelete() except that the delete is -** deferred untilthe pParse is deleted. +** deferred until the pParse is deleted. ** ** The pExpr might be deleted immediately on an OOM error. ** -** The deferred delete is (currently) implemented by adding the -** pExpr to the pParse->pConstExpr list with a register number of 0. +** Return 0 if the delete was successfully deferred. Return non-zero +** if the delete happened immediately because of an OOM. */ -SQLITE_PRIVATE void sqlite3ExprDeferredDelete(Parse *pParse, Expr *pExpr){ - sqlite3ParserAddCleanup(pParse, - (void(*)(sqlite3*,void*))sqlite3ExprDelete, - pExpr); +SQLITE_PRIVATE int sqlite3ExprDeferredDelete(Parse *pParse, Expr *pExpr){ + return 0==sqlite3ParserAddCleanup(pParse, sqlite3ExprDeleteGeneric, pExpr); } /* Invoke sqlite3RenameExprUnmap() and sqlite3ExprDelete() on the @@ -107136,11 +110906,7 @@ static int dupedExprStructSize(const Expr *p, int flags){ assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */ assert( EXPR_FULLSIZE<=0xfff ); assert( (0xfff & (EP_Reduced|EP_TokenOnly))==0 ); - if( 0==flags || p->op==TK_SELECT_COLUMN -#ifndef SQLITE_OMIT_WINDOWFUNC - || ExprHasProperty(p, EP_WinFunc) -#endif - ){ + if( 0==flags || ExprHasProperty(p, EP_FullSize) ){ nSize = EXPR_FULLSIZE; }else{ assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); @@ -107171,56 +110937,93 @@ static int dupedExprNodeSize(const Expr *p, int flags){ /* ** Return the number of bytes required to create a duplicate of the -** expression passed as the first argument. The second argument is a -** mask containing EXPRDUP_XXX flags. +** expression passed as the first argument. ** ** The value returned includes space to create a copy of the Expr struct ** itself and the buffer referred to by Expr.u.zToken, if any. ** -** If the EXPRDUP_REDUCE flag is set, then the return value includes -** space to duplicate all Expr nodes in the tree formed by Expr.pLeft -** and Expr.pRight variables (but not for any structures pointed to or -** descended from the Expr.x.pList or Expr.x.pSelect variables). +** The return value includes space to duplicate all Expr nodes in the +** tree formed by Expr.pLeft and Expr.pRight, but not any other +** substructure such as Expr.x.pList, Expr.x.pSelect, and Expr.y.pWin. */ -static int dupedExprSize(const Expr *p, int flags){ - int nByte = 0; - if( p ){ - nByte = dupedExprNodeSize(p, flags); - if( flags&EXPRDUP_REDUCE ){ - nByte += dupedExprSize(p->pLeft, flags) + dupedExprSize(p->pRight, flags); - } - } +static int dupedExprSize(const Expr *p){ + int nByte; + assert( p!=0 ); + nByte = dupedExprNodeSize(p, EXPRDUP_REDUCE); + if( p->pLeft ) nByte += dupedExprSize(p->pLeft); + if( p->pRight ) nByte += dupedExprSize(p->pRight); + assert( nByte==ROUND8(nByte) ); return nByte; } /* -** This function is similar to sqlite3ExprDup(), except that if pzBuffer -** is not NULL then *pzBuffer is assumed to point to a buffer large enough -** to store the copy of expression p, the copies of p->u.zToken -** (if applicable), and the copies of the p->pLeft and p->pRight expressions, -** if any. Before returning, *pzBuffer is set to the first byte past the -** portion of the buffer copied into by this function. +** An EdupBuf is a memory allocation used to stored multiple Expr objects +** together with their Expr.zToken content. This is used to help implement +** compression while doing sqlite3ExprDup(). The top-level Expr does the +** allocation for itself and many of its decendents, then passes an instance +** of the structure down into exprDup() so that they decendents can have +** access to that memory. +*/ +typedef struct EdupBuf EdupBuf; +struct EdupBuf { + u8 *zAlloc; /* Memory space available for storage */ +#ifdef SQLITE_DEBUG + u8 *zEnd; /* First byte past the end of memory */ +#endif +}; + +/* +** This function is similar to sqlite3ExprDup(), except that if pEdupBuf +** is not NULL then it points to memory that can be used to store a copy +** of the input Expr p together with its p->u.zToken (if any). pEdupBuf +** is updated with the new buffer tail prior to returning. */ -static Expr *exprDup(sqlite3 *db, const Expr *p, int dupFlags, u8 **pzBuffer){ +static Expr *exprDup( + sqlite3 *db, /* Database connection (for memory allocation) */ + const Expr *p, /* Expr tree to be duplicated */ + int dupFlags, /* EXPRDUP_REDUCE for compression. 0 if not */ + EdupBuf *pEdupBuf /* Preallocated storage space, or NULL */ +){ Expr *pNew; /* Value to return */ - u8 *zAlloc; /* Memory space from which to build Expr object */ + EdupBuf sEdupBuf; /* Memory space from which to build Expr object */ u32 staticFlag; /* EP_Static if space not obtained from malloc */ + int nToken = -1; /* Space needed for p->u.zToken. -1 means unknown */ assert( db!=0 ); assert( p ); assert( dupFlags==0 || dupFlags==EXPRDUP_REDUCE ); - assert( pzBuffer==0 || dupFlags==EXPRDUP_REDUCE ); + assert( pEdupBuf==0 || dupFlags==EXPRDUP_REDUCE ); /* Figure out where to write the new Expr structure. */ - if( pzBuffer ){ - zAlloc = *pzBuffer; + if( pEdupBuf ){ + sEdupBuf.zAlloc = pEdupBuf->zAlloc; +#ifdef SQLITE_DEBUG + sEdupBuf.zEnd = pEdupBuf->zEnd; +#endif staticFlag = EP_Static; - assert( zAlloc!=0 ); + assert( sEdupBuf.zAlloc!=0 ); + assert( dupFlags==EXPRDUP_REDUCE ); }else{ - zAlloc = sqlite3DbMallocRawNN(db, dupedExprSize(p, dupFlags)); + int nAlloc; + if( dupFlags ){ + nAlloc = dupedExprSize(p); + }else if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ + nToken = sqlite3Strlen30NN(p->u.zToken)+1; + nAlloc = ROUND8(EXPR_FULLSIZE + nToken); + }else{ + nToken = 0; + nAlloc = ROUND8(EXPR_FULLSIZE); + } + assert( nAlloc==ROUND8(nAlloc) ); + sEdupBuf.zAlloc = sqlite3DbMallocRawNN(db, nAlloc); +#ifdef SQLITE_DEBUG + sEdupBuf.zEnd = sEdupBuf.zAlloc ? sEdupBuf.zAlloc+nAlloc : 0; +#endif + staticFlag = 0; } - pNew = (Expr *)zAlloc; + pNew = (Expr *)sEdupBuf.zAlloc; + assert( EIGHT_BYTE_ALIGNMENT(pNew) ); if( pNew ){ /* Set nNewSize to the size allocated for the structure pointed to @@ -107229,22 +111032,27 @@ static Expr *exprDup(sqlite3 *db, const Expr *p, int dupFlags, u8 **pzBuffer){ ** by the copy of the p->u.zToken string (if any). */ const unsigned nStructSize = dupedExprStructSize(p, dupFlags); - const int nNewSize = nStructSize & 0xfff; - int nToken; - if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ - nToken = sqlite3Strlen30(p->u.zToken) + 1; - }else{ - nToken = 0; + int nNewSize = nStructSize & 0xfff; + if( nToken<0 ){ + if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ + nToken = sqlite3Strlen30(p->u.zToken) + 1; + }else{ + nToken = 0; + } } if( dupFlags ){ + assert( (int)(sEdupBuf.zEnd - sEdupBuf.zAlloc) >= nNewSize+nToken ); assert( ExprHasProperty(p, EP_Reduced)==0 ); - memcpy(zAlloc, p, nNewSize); + memcpy(sEdupBuf.zAlloc, p, nNewSize); }else{ u32 nSize = (u32)exprStructSize(p); - memcpy(zAlloc, p, nSize); + assert( (int)(sEdupBuf.zEnd - sEdupBuf.zAlloc) >= + (int)EXPR_FULLSIZE+nToken ); + memcpy(sEdupBuf.zAlloc, p, nSize); if( nSizeu.zToken string, if any. */ - if( nToken ){ - char *zToken = pNew->u.zToken = (char*)&zAlloc[nNewSize]; + assert( nToken>=0 ); + if( nToken>0 ){ + char *zToken = pNew->u.zToken = (char*)&sEdupBuf.zAlloc[nNewSize]; memcpy(zToken, p->u.zToken, nToken); + nNewSize += nToken; } + sEdupBuf.zAlloc += ROUND8(nNewSize); + + if( ((p->flags|pNew->flags)&(EP_TokenOnly|EP_Leaf))==0 ){ - if( 0==((p->flags|pNew->flags) & (EP_TokenOnly|EP_Leaf)) ){ /* Fill in the pNew->x.pSelect or pNew->x.pList member. */ if( ExprUseXSelect(p) ){ pNew->x.pSelect = sqlite3SelectDup(db, p->x.pSelect, dupFlags); }else{ - pNew->x.pList = sqlite3ExprListDup(db, p->x.pList, dupFlags); + pNew->x.pList = sqlite3ExprListDup(db, p->x.pList, + p->op!=TK_ORDER ? dupFlags : 0); } - } - /* Fill in pNew->pLeft and pNew->pRight. */ - if( ExprHasProperty(pNew, EP_Reduced|EP_TokenOnly|EP_WinFunc) ){ - zAlloc += dupedExprNodeSize(p, dupFlags); - if( !ExprHasProperty(pNew, EP_TokenOnly|EP_Leaf) ){ - pNew->pLeft = p->pLeft ? - exprDup(db, p->pLeft, EXPRDUP_REDUCE, &zAlloc) : 0; - pNew->pRight = p->pRight ? - exprDup(db, p->pRight, EXPRDUP_REDUCE, &zAlloc) : 0; - } #ifndef SQLITE_OMIT_WINDOWFUNC if( ExprHasProperty(p, EP_WinFunc) ){ pNew->y.pWin = sqlite3WindowDup(db, pNew, p->y.pWin); assert( ExprHasProperty(pNew, EP_WinFunc) ); } #endif /* SQLITE_OMIT_WINDOWFUNC */ - if( pzBuffer ){ - *pzBuffer = zAlloc; - } - }else{ - if( !ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){ - if( pNew->op==TK_SELECT_COLUMN ){ + + /* Fill in pNew->pLeft and pNew->pRight. */ + if( dupFlags ){ + if( p->op==TK_SELECT_COLUMN ){ + pNew->pLeft = p->pLeft; + assert( p->pRight==0 + || p->pRight==p->pLeft + || ExprHasProperty(p->pLeft, EP_Subquery) ); + }else{ + pNew->pLeft = p->pLeft ? + exprDup(db, p->pLeft, EXPRDUP_REDUCE, &sEdupBuf) : 0; + } + pNew->pRight = p->pRight ? + exprDup(db, p->pRight, EXPRDUP_REDUCE, &sEdupBuf) : 0; + }else{ + if( p->op==TK_SELECT_COLUMN ){ pNew->pLeft = p->pLeft; - assert( p->pRight==0 || p->pRight==p->pLeft - || ExprHasProperty(p->pLeft, EP_Subquery) ); + assert( p->pRight==0 + || p->pRight==p->pLeft + || ExprHasProperty(p->pLeft, EP_Subquery) ); }else{ pNew->pLeft = sqlite3ExprDup(db, p->pLeft, 0); } @@ -107302,6 +111116,8 @@ static Expr *exprDup(sqlite3 *db, const Expr *p, int dupFlags, u8 **pzBuffer){ } } } + if( pEdupBuf ) memcpy(pEdupBuf, &sEdupBuf, sizeof(sEdupBuf)); + assert( sEdupBuf.zAlloc <= sEdupBuf.zEnd ); return pNew; } @@ -107453,30 +111269,46 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, const SrcList *p, int fla SrcItem *pNewItem = &pNew->a[i]; const SrcItem *pOldItem = &p->a[i]; Table *pTab; - pNewItem->pSchema = pOldItem->pSchema; - pNewItem->zDatabase = sqlite3DbStrDup(db, pOldItem->zDatabase); + pNewItem->fg = pOldItem->fg; + if( pOldItem->fg.isSubquery ){ + Subquery *pNewSubq = sqlite3DbMallocRaw(db, sizeof(Subquery)); + if( pNewSubq==0 ){ + assert( db->mallocFailed ); + pNewItem->fg.isSubquery = 0; + }else{ + memcpy(pNewSubq, pOldItem->u4.pSubq, sizeof(*pNewSubq)); + pNewSubq->pSelect = sqlite3SelectDup(db, pNewSubq->pSelect, flags); + if( pNewSubq->pSelect==0 ){ + sqlite3DbFree(db, pNewSubq); + pNewSubq = 0; + pNewItem->fg.isSubquery = 0; + } + } + pNewItem->u4.pSubq = pNewSubq; + }else if( pOldItem->fg.fixedSchema ){ + pNewItem->u4.pSchema = pOldItem->u4.pSchema; + }else{ + pNewItem->u4.zDatabase = sqlite3DbStrDup(db, pOldItem->u4.zDatabase); + } pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); pNewItem->zAlias = sqlite3DbStrDup(db, pOldItem->zAlias); - pNewItem->fg = pOldItem->fg; pNewItem->iCursor = pOldItem->iCursor; - pNewItem->addrFillSub = pOldItem->addrFillSub; - pNewItem->regReturn = pOldItem->regReturn; if( pNewItem->fg.isIndexedBy ){ pNewItem->u1.zIndexedBy = sqlite3DbStrDup(db, pOldItem->u1.zIndexedBy); + }else if( pNewItem->fg.isTabFunc ){ + pNewItem->u1.pFuncArg = + sqlite3ExprListDup(db, pOldItem->u1.pFuncArg, flags); + }else{ + pNewItem->u1.nRow = pOldItem->u1.nRow; } pNewItem->u2 = pOldItem->u2; if( pNewItem->fg.isCte ){ pNewItem->u2.pCteUse->nUse++; } - if( pNewItem->fg.isTabFunc ){ - pNewItem->u1.pFuncArg = - sqlite3ExprListDup(db, pOldItem->u1.pFuncArg, flags); - } - pTab = pNewItem->pTab = pOldItem->pTab; + pTab = pNewItem->pSTab = pOldItem->pSTab; if( pTab ){ pTab->nTabRef++; } - pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect, flags); if( pOldItem->fg.isUsing ){ assert( pNewItem->fg.isUsing ); pNewItem->u3.pUsing = sqlite3IdListDup(db, pOldItem->u3.pUsing); @@ -107550,7 +111382,6 @@ SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, const Select *pDup, int fla pp = &pNew->pPrior; pNext = pNew; } - return pRet; } #else @@ -107566,11 +111397,7 @@ SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, const Select *p, int flags) ** initially NULL, then create a new expression list. ** ** The pList argument must be either NULL or a pointer to an ExprList -** obtained from a prior call to sqlite3ExprListAppend(). This routine -** may not be used with an ExprList obtained from sqlite3ExprListDup(). -** Reason: This routine assumes that the number of slots in pList->a[] -** is a power of two. That is true for sqlite3ExprListAppend() returns -** but is not necessarily true from the return value of sqlite3ExprListDup(). +** obtained from a prior call to sqlite3ExprListAppend(). ** ** If a memory allocation error occurs, the entire list is freed and ** NULL is returned. If non-NULL is returned, then it is guaranteed @@ -107835,6 +111662,9 @@ static SQLITE_NOINLINE void exprListDeleteNN(sqlite3 *db, ExprList *pList){ SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3 *db, ExprList *pList){ if( pList ) exprListDeleteNN(db, pList); } +SQLITE_PRIVATE void sqlite3ExprListDeleteGeneric(sqlite3 *db, void *pList){ + if( ALWAYS(pList) ) exprListDeleteNN(db, (ExprList*)pList); +} /* ** Return the bitwise-OR of all Expr.flags fields in the given @@ -107903,7 +111733,7 @@ SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr *pExpr){ ** and 0 if it is FALSE. */ SQLITE_PRIVATE int sqlite3ExprTruthValue(const Expr *pExpr){ - pExpr = sqlite3ExprSkipCollate((Expr*)pExpr); + pExpr = sqlite3ExprSkipCollateAndLikely((Expr*)pExpr); assert( pExpr->op==TK_TRUEFALSE ); assert( !ExprHasProperty(pExpr, EP_IntValue) ); assert( sqlite3StrICmp(pExpr->u.zToken,"true")==0 @@ -107938,6 +111768,54 @@ SQLITE_PRIVATE Expr *sqlite3ExprSimplifiedAndOr(Expr *pExpr){ return pExpr; } +/* +** pExpr is a TK_FUNCTION node. Try to determine whether or not the +** function is a constant function. A function is constant if all of +** the following are true: +** +** (1) It is a scalar function (not an aggregate or window function) +** (2) It has either the SQLITE_FUNC_CONSTANT or SQLITE_FUNC_SLOCHNG +** property. +** (3) All of its arguments are constants +** +** This routine sets pWalker->eCode to 0 if pExpr is not a constant. +** It makes no changes to pWalker->eCode if pExpr is constant. In +** every case, it returns WRC_Abort. +** +** Called as a service subroutine from exprNodeIsConstant(). +*/ +static SQLITE_NOINLINE int exprNodeIsConstantFunction( + Walker *pWalker, + Expr *pExpr +){ + int n; /* Number of arguments */ + ExprList *pList; /* List of arguments */ + FuncDef *pDef; /* The function */ + sqlite3 *db; /* The database */ + + assert( pExpr->op==TK_FUNCTION ); + if( ExprHasProperty(pExpr, EP_TokenOnly) + || (pList = pExpr->x.pList)==0 + ){; + n = 0; + }else{ + n = pList->nExpr; + sqlite3WalkExprList(pWalker, pList); + if( pWalker->eCode==0 ) return WRC_Abort; + } + db = pWalker->pParse->db; + pDef = sqlite3FindFunction(db, pExpr->u.zToken, n, ENC(db), 0); + if( pDef==0 + || pDef->xFinalize!=0 + || (pDef->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG))==0 + || ExprHasProperty(pExpr, EP_WinFunc) + ){ + pWalker->eCode = 0; + return WRC_Abort; + } + return WRC_Prune; +} + /* ** These routines are Walker callbacks used to check expressions to @@ -107966,6 +111844,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprSimplifiedAndOr(Expr *pExpr){ ** malformed schema error. */ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ + assert( pWalker->eCode>0 ); /* If pWalker->eCode is 2 then any term of the expression that comes from ** the ON or USING clauses of an outer join disqualifies the expression @@ -107985,6 +111864,8 @@ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ ){ if( pWalker->eCode==5 ) ExprSetProperty(pExpr, EP_FromDDL); return WRC_Continue; + }else if( pWalker->pParse ){ + return exprNodeIsConstantFunction(pWalker, pExpr); }else{ pWalker->eCode = 0; return WRC_Abort; @@ -108013,9 +111894,11 @@ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ case TK_IF_NULL_ROW: case TK_REGISTER: case TK_DOT: + case TK_RAISE: testcase( pExpr->op==TK_REGISTER ); testcase( pExpr->op==TK_IF_NULL_ROW ); testcase( pExpr->op==TK_DOT ); + testcase( pExpr->op==TK_RAISE ); pWalker->eCode = 0; return WRC_Abort; case TK_VARIABLE: @@ -108037,15 +111920,15 @@ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ return WRC_Continue; } } -static int exprIsConst(Expr *p, int initFlag, int iCur){ +static int exprIsConst(Parse *pParse, Expr *p, int initFlag){ Walker w; w.eCode = initFlag; + w.pParse = pParse; w.xExprCallback = exprNodeIsConstant; w.xSelectCallback = sqlite3SelectWalkFail; #ifdef SQLITE_DEBUG w.xSelectCallback2 = sqlite3SelectWalkAssert2; #endif - w.u.iCur = iCur; sqlite3WalkExpr(&w, p); return w.eCode; } @@ -108057,9 +111940,15 @@ static int exprIsConst(Expr *p, int initFlag, int iCur){ ** For the purposes of this function, a double-quoted string (ex: "abc") ** is considered a variable but a single-quoted string (ex: 'abc') is ** a constant. +** +** The pParse parameter may be NULL. But if it is NULL, there is no way +** to determine if function calls are constant or not, and hence all +** function calls will be considered to be non-constant. If pParse is +** not NULL, then a function call might be constant, depending on the +** function and on its parameters. */ -SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr *p){ - return exprIsConst(p, 1, 0); +SQLITE_PRIVATE int sqlite3ExprIsConstant(Parse *pParse, Expr *p){ + return exprIsConst(pParse, p, 1); } /* @@ -108075,8 +111964,24 @@ SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr *p){ ** can be added to the pParse->pConstExpr list and evaluated once when ** the prepared statement starts up. See sqlite3ExprCodeRunJustOnce(). */ -SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr *p){ - return exprIsConst(p, 2, 0); +static int sqlite3ExprIsConstantNotJoin(Parse *pParse, Expr *p){ + return exprIsConst(pParse, p, 2); +} + +/* +** This routine examines sub-SELECT statements as an expression is being +** walked as part of sqlite3ExprIsTableConstant(). Sub-SELECTs are considered +** constant as long as they are uncorrelated - meaning that they do not +** contain any terms from outer contexts. +*/ +static int exprSelectWalkTableConstant(Walker *pWalker, Select *pSelect){ + assert( pSelect!=0 ); + assert( pWalker->eCode==3 || pWalker->eCode==0 ); + if( (pSelect->selFlags & SF_Correlated)!=0 ){ + pWalker->eCode = 0; + return WRC_Abort; + } + return WRC_Prune; } /* @@ -108084,35 +111989,79 @@ SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr *p){ ** for any single row of the table with cursor iCur. In other words, the ** expression must not refer to any non-deterministic function nor any ** table other than iCur. +** +** Consider uncorrelated subqueries to be constants if the bAllowSubq +** parameter is true. */ -SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr *p, int iCur){ - return exprIsConst(p, 3, iCur); +static int sqlite3ExprIsTableConstant(Expr *p, int iCur, int bAllowSubq){ + Walker w; + w.eCode = 3; + w.pParse = 0; + w.xExprCallback = exprNodeIsConstant; + if( bAllowSubq ){ + w.xSelectCallback = exprSelectWalkTableConstant; + }else{ + w.xSelectCallback = sqlite3SelectWalkFail; +#ifdef SQLITE_DEBUG + w.xSelectCallback2 = sqlite3SelectWalkAssert2; +#endif + } + w.u.iCur = iCur; + sqlite3WalkExpr(&w, p); + return w.eCode; } /* -** Check pExpr to see if it is an invariant constraint on data source pSrc. +** Check pExpr to see if it is an constraint on the single data source +** pSrc = &pSrcList->a[iSrc]. In other words, check to see if pExpr +** constrains pSrc but does not depend on any other tables or data +** sources anywhere else in the query. Return true (non-zero) if pExpr +** is a constraint on pSrc only. +** ** This is an optimization. False negatives will perhaps cause slower ** queries, but false positives will yield incorrect answers. So when in ** doubt, return 0. ** -** To be an invariant constraint, the following must be true: +** To be an single-source constraint, the following must be true: ** ** (1) pExpr cannot refer to any table other than pSrc->iCursor. ** -** (2) pExpr cannot use subqueries or non-deterministic functions. +** (2a) pExpr cannot use subqueries unless the bAllowSubq parameter is +** true and the subquery is non-correlated +** +** (2b) pExpr cannot use non-deterministic functions. ** ** (3) pSrc cannot be part of the left operand for a RIGHT JOIN. ** (Is there some way to relax this constraint?) ** ** (4) If pSrc is the right operand of a LEFT JOIN, then... ** (4a) pExpr must come from an ON clause.. - (4b) and specifically the ON clause associated with the LEFT JOIN. +** (4b) and specifically the ON clause associated with the LEFT JOIN. ** ** (5) If pSrc is not the right operand of a LEFT JOIN or the left ** operand of a RIGHT JOIN, then pExpr must be from the WHERE ** clause, not an ON clause. +** +** (6) Either: +** +** (6a) pExpr does not originate in an ON or USING clause, or +** +** (6b) The ON or USING clause from which pExpr is derived is +** not to the left of a RIGHT JOIN (or FULL JOIN). +** +** Without this restriction, accepting pExpr as a single-table +** constraint might move the the ON/USING filter expression +** from the left side of a RIGHT JOIN over to the right side, +** which leads to incorrect answers. See also restriction (9) +** on push-down. */ -SQLITE_PRIVATE int sqlite3ExprIsTableConstraint(Expr *pExpr, const SrcItem *pSrc){ +SQLITE_PRIVATE int sqlite3ExprIsSingleTableConstraint( + Expr *pExpr, /* The constraint */ + const SrcList *pSrcList, /* Complete FROM clause */ + int iSrc, /* Which element of pSrcList to use */ + int bAllowSubq /* Allow non-correlated subqueries */ +){ + const SrcItem *pSrc = &pSrcList->a[iSrc]; if( pSrc->fg.jointype & JT_LTORJ ){ return 0; /* rule (3) */ } @@ -108122,7 +112071,21 @@ SQLITE_PRIVATE int sqlite3ExprIsTableConstraint(Expr *pExpr, const SrcItem *pSrc }else{ if( ExprHasProperty(pExpr, EP_OuterON) ) return 0; /* rule (5) */ } - return sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor); /* rules (1), (2) */ + if( ExprHasProperty(pExpr, EP_OuterON|EP_InnerON) /* (6a) */ + && (pSrcList->a[0].fg.jointype & JT_LTORJ)!=0 /* Fast pre-test of (6b) */ + ){ + int jj; + for(jj=0; jjw.iJoin==pSrcList->a[jj].iCursor ){ + if( (pSrcList->a[jj].fg.jointype & JT_LTORJ)!=0 ){ + return 0; /* restriction (6) */ + } + break; + } + } + } + /* Rules (1), (2a), and (2b) handled by the following: */ + return sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor, bAllowSubq); } @@ -108207,7 +112170,7 @@ SQLITE_PRIVATE int sqlite3ExprIsConstantOrGroupBy(Parse *pParse, Expr *p, ExprLi */ SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr *p, u8 isInit){ assert( isInit==0 || isInit==1 ); - return exprIsConst(p, 4+isInit, 0); + return exprIsConst(0, p, 4+isInit); } #ifdef SQLITE_ENABLE_CURSOR_HINTS @@ -108233,8 +112196,12 @@ SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr *p){ ** to fit in a 32-bit integer, return 1 and put the value of the integer ** in *pValue. If the expression is not an integer or if it is too big ** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged. +** +** If the pParse pointer is provided, then allow the expression p to be +** a parameter (TK_VARIABLE) that is bound to an integer. +** But if pParse is NULL, then p must be a pure integer literal. */ -SQLITE_PRIVATE int sqlite3ExprIsInteger(const Expr *p, int *pValue){ +SQLITE_PRIVATE int sqlite3ExprIsInteger(const Expr *p, int *pValue, Parse *pParse){ int rc = 0; if( NEVER(p==0) ) return 0; /* Used to only happen following on OOM */ @@ -108249,18 +112216,38 @@ SQLITE_PRIVATE int sqlite3ExprIsInteger(const Expr *p, int *pValue){ } switch( p->op ){ case TK_UPLUS: { - rc = sqlite3ExprIsInteger(p->pLeft, pValue); + rc = sqlite3ExprIsInteger(p->pLeft, pValue, 0); break; } case TK_UMINUS: { int v = 0; - if( sqlite3ExprIsInteger(p->pLeft, &v) ){ + if( sqlite3ExprIsInteger(p->pLeft, &v, 0) ){ assert( ((unsigned int)v)!=0x80000000 ); *pValue = -v; rc = 1; } break; } + case TK_VARIABLE: { + sqlite3_value *pVal; + if( pParse==0 ) break; + if( NEVER(pParse->pVdbe==0) ) break; + if( (pParse->db->flags & SQLITE_EnableQPSG)!=0 ) break; + sqlite3VdbeSetVarmask(pParse->pVdbe, p->iColumn); + pVal = sqlite3VdbeGetBoundValue(pParse->pReprepare, p->iColumn, + SQLITE_AFF_BLOB); + if( pVal ){ + if( sqlite3_value_type(pVal)==SQLITE_INTEGER ){ + sqlite3_int64 vv = sqlite3_value_int64(pVal); + if( vv == (vv & 0x7fffffff) ){ /* non-negative numbers only */ + *pValue = (int)vv; + rc = 1; + } + } + sqlite3ValueFree(pVal); + } + break; + } default: break; } return rc; @@ -108297,10 +112284,14 @@ SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr *p){ return 0; case TK_COLUMN: assert( ExprUseYTab(p) ); - return ExprHasProperty(p, EP_CanBeNull) || - p->y.pTab==0 || /* Reference to column of index on expression */ - (p->iColumn>=0 + return ExprHasProperty(p, EP_CanBeNull) + || NEVER(p->y.pTab==0) /* Reference to column of index on expr */ +#ifdef SQLITE_ALLOW_ROWID_IN_VIEW + || (p->iColumn==XN_ROWID && IsView(p->y.pTab)) +#endif + || (p->iColumn>=0 && p->y.pTab->aCol!=0 /* Possible due to prior error */ + && ALWAYS(p->iColumny.pTab->nCol) && p->y.pTab->aCol[p->iColumn].notNull==0); default: return 1; @@ -108360,11 +112351,32 @@ SQLITE_PRIVATE int sqlite3IsRowid(const char *z){ return 0; } +/* +** Return a pointer to a buffer containing a usable rowid alias for table +** pTab. An alias is usable if there is not an explicit user-defined column +** of the same name. +*/ +SQLITE_PRIVATE const char *sqlite3RowidAlias(Table *pTab){ + const char *azOpt[] = {"_ROWID_", "ROWID", "OID"}; + int ii; + assert( VisibleRowid(pTab) ); + for(ii=0; iinCol; iCol++){ + if( sqlite3_stricmp(azOpt[ii], pTab->aCol[iCol].zCnName)==0 ) break; + } + if( iCol==pTab->nCol ){ + return azOpt[ii]; + } + } + return 0; +} + /* ** pX is the RHS of an IN operator. If pX is a SELECT statement ** that can be simplified to a direct table access, then return ** a pointer to the SELECT statement. If pX is not a SELECT statement, -** or if the SELECT statement needs to be manifested into a transient +** or if the SELECT statement needs to be materialized into a transient ** table, then return NULL. */ #ifndef SQLITE_OMIT_SUBQUERY @@ -108389,8 +112401,8 @@ static Select *isCandidateForInOpt(const Expr *pX){ pSrc = p->pSrc; assert( pSrc!=0 ); if( pSrc->nSrc!=1 ) return 0; /* Single term in FROM clause */ - if( pSrc->a[0].pSelect ) return 0; /* FROM is not a subquery or view */ - pTab = pSrc->a[0].pTab; + if( pSrc->a[0].fg.isSubquery) return 0;/* FROM is not a subquery or view */ + pTab = pSrc->a[0].pSTab; assert( pTab!=0 ); assert( !IsView(pTab) ); /* FROM clause is not a view */ if( IsVirtual(pTab) ) return 0; /* FROM clause not a virtual table */ @@ -108430,13 +112442,13 @@ static void sqlite3SetHasNullFlag(Vdbe *v, int iCur, int regHasNull){ ** The argument is an IN operator with a list (not a subquery) on the ** right-hand side. Return TRUE if that list is constant. */ -static int sqlite3InRhsIsConstant(Expr *pIn){ +static int sqlite3InRhsIsConstant(Parse *pParse, Expr *pIn){ Expr *pLHS; int res; assert( !ExprHasProperty(pIn, EP_xIsSelect) ); pLHS = pIn->pLeft; pIn->pLeft = 0; - res = sqlite3ExprIsConstant(pIn); + res = sqlite3ExprIsConstant(pParse, pIn); pIn->pLeft = pLHS; return res; } @@ -108460,7 +112472,7 @@ static int sqlite3InRhsIsConstant(Expr *pIn){ ** IN_INDEX_INDEX_ASC - The cursor was opened on an ascending index. ** IN_INDEX_INDEX_DESC - The cursor was opened on a descending index. ** IN_INDEX_EPH - The cursor was opened on a specially created and -** populated epheremal table. +** populated ephemeral table. ** IN_INDEX_NOOP - No cursor was allocated. The IN operator must be ** implemented as a sequence of comparisons. ** @@ -108473,7 +112485,7 @@ static int sqlite3InRhsIsConstant(Expr *pIn){ ** an ephemeral table might need to be generated from the RHS and then ** pX->iTable made to point to the ephemeral table instead of an ** existing table. In this case, the creation and initialization of the -** ephmeral table might be put inside of a subroutine, the EP_Subrtn flag +** ephemeral table might be put inside of a subroutine, the EP_Subrtn flag ** will be set on pX and the pX->y.sub fields will be set to show where ** the subroutine is coded. ** @@ -108485,12 +112497,12 @@ static int sqlite3InRhsIsConstant(Expr *pIn){ ** ** When IN_INDEX_LOOP is used (and the b-tree will be used to iterate ** through the set members) then the b-tree must not contain duplicates. -** An epheremal table will be created unless the selected columns are guaranteed +** An ephemeral table will be created unless the selected columns are guaranteed ** to be unique - either because it is an INTEGER PRIMARY KEY or due to ** a UNIQUE constraint or index. ** ** When IN_INDEX_MEMBERSHIP is used (and the b-tree will be used -** for fast set membership tests) then an epheremal table must +** for fast set membership tests) then an ephemeral table must ** be used unless is a single INTEGER PRIMARY KEY column or an ** index can be found with the specified as its left-most. ** @@ -108573,7 +112585,7 @@ SQLITE_PRIVATE int sqlite3FindInIndex( assert( p->pEList!=0 ); /* Because of isCandidateForInOpt(p) */ assert( p->pEList->a[0].pExpr!=0 ); /* Because of isCandidateForInOpt(p) */ assert( p->pSrc!=0 ); /* Because of isCandidateForInOpt(p) */ - pTab = p->pSrc->a[0].pTab; + pTab = p->pSrc->a[0].pSTab; /* Code an OP_Transaction and OP_TableLock for . */ iDb = sqlite3SchemaToIndex(db, pTab->pSchema); @@ -108650,7 +112662,6 @@ SQLITE_PRIVATE int sqlite3FindInIndex( CollSeq *pReq = sqlite3BinaryCompareCollSeq(pParse, pLhs, pRhs); int j; - assert( pReq!=0 || pRhs->iColumn==XN_ROWID || pParse->nErr ); for(j=0; jaiColumn[j]!=pRhs->iColumn ) continue; assert( pIdx->azColl[j] ); @@ -108706,7 +112717,7 @@ SQLITE_PRIVATE int sqlite3FindInIndex( if( eType==0 && (inFlags & IN_INDEX_NOOP_OK) && ExprUseXList(pX) - && (!sqlite3InRhsIsConstant(pX) || pX->x.pList->nExpr<=2) + && (!sqlite3InRhsIsConstant(pParse,pX) || pX->x.pList->nExpr<=2) ){ pParse->nTab--; /* Back out the allocation of the unused cursor */ iTab = -1; /* Cursor is not allocated */ @@ -108814,6 +112825,49 @@ SQLITE_PRIVATE void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){ } } +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Scan all previously generated bytecode looking for an OP_BeginSubrtn +** that is compatible with pExpr. If found, add the y.sub values +** to pExpr and return true. If not found, return false. +*/ +static int findCompatibleInRhsSubrtn( + Parse *pParse, /* Parsing context */ + Expr *pExpr, /* IN operator with RHS that we want to reuse */ + SubrtnSig *pNewSig /* Signature for the IN operator */ +){ + VdbeOp *pOp, *pEnd; + SubrtnSig *pSig; + Vdbe *v; + + if( pNewSig==0 ) return 0; + if( (pParse->mSubrtnSig & (1<<(pNewSig->selId&7)))==0 ) return 0; + assert( pExpr->op==TK_IN ); + assert( !ExprUseYSub(pExpr) ); + assert( ExprUseXSelect(pExpr) ); + assert( pExpr->x.pSelect!=0 ); + assert( (pExpr->x.pSelect->selFlags & SF_All)==0 ); + v = pParse->pVdbe; + assert( v!=0 ); + pOp = sqlite3VdbeGetOp(v, 1); + pEnd = sqlite3VdbeGetLastOp(v); + for(; pOpp4type!=P4_SUBRTNSIG ) continue; + assert( pOp->opcode==OP_BeginSubrtn ); + pSig = pOp->p4.pSubrtnSig; + assert( pSig!=0 ); + if( pNewSig->selId!=pSig->selId ) continue; + if( strcmp(pNewSig->zAff,pSig->zAff)!=0 ) continue; + pExpr->y.sub.iAddr = pSig->iAddr; + pExpr->y.sub.regReturn = pSig->regReturn; + pExpr->iTable = pSig->iTable; + ExprSetProperty(pExpr, EP_Subrtn); + return 1; + } + return 0; +} +#endif /* SQLITE_OMIT_SUBQUERY */ + #ifndef SQLITE_OMIT_SUBQUERY /* ** Generate code that will construct an ephemeral table containing all terms @@ -108824,7 +112878,7 @@ SQLITE_PRIVATE void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){ ** x IN (SELECT a FROM b) -- IN operator with subquery on the right ** ** The pExpr parameter is the IN operator. The cursor number for the -** constructed ephermeral table is returned. The first time the ephemeral +** constructed ephemeral table is returned. The first time the ephemeral ** table is computed, the cursor number is also stored in pExpr->iTable, ** however the cursor number returned might not be the same, as it might ** have been duplicated using OP_OpenDup. @@ -108863,11 +112917,28 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( ** and reuse it many names. */ if( !ExprHasProperty(pExpr, EP_VarSelect) && pParse->iSelfTab==0 ){ - /* Reuse of the RHS is allowed */ - /* If this routine has already been coded, but the previous code - ** might not have been invoked yet, so invoke it now as a subroutine. + /* Reuse of the RHS is allowed + ** + ** Compute a signature for the RHS of the IN operator to facility + ** finding and reusing prior instances of the same IN operator. */ - if( ExprHasProperty(pExpr, EP_Subrtn) ){ + SubrtnSig *pSig = 0; + assert( !ExprUseXSelect(pExpr) || pExpr->x.pSelect!=0 ); + if( ExprUseXSelect(pExpr) && (pExpr->x.pSelect->selFlags & SF_All)==0 ){ + pSig = sqlite3DbMallocRawNN(pParse->db, sizeof(pSig[0])); + if( pSig ){ + pSig->selId = pExpr->x.pSelect->selId; + pSig->zAff = exprINAffinity(pParse, pExpr); + } + } + + /* Check to see if there is a prior materialization of the RHS of + ** this IN operator. If there is, then make use of that prior + ** materialization rather than recomputing it. + */ + if( ExprHasProperty(pExpr, EP_Subrtn) + || findCompatibleInRhsSubrtn(pParse, pExpr, pSig) + ){ addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); if( ExprUseXSelect(pExpr) ){ ExplainQueryPlan((pParse, 0, "REUSE LIST SUBQUERY %d", @@ -108879,6 +112950,10 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( assert( iTab!=pExpr->iTable ); sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable); sqlite3VdbeJumpHere(v, addrOnce); + if( pSig ){ + sqlite3DbFree(pParse->db, pSig->zAff); + sqlite3DbFree(pParse->db, pSig); + } return; } @@ -108889,7 +112964,13 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( pExpr->y.sub.regReturn = ++pParse->nMem; pExpr->y.sub.iAddr = sqlite3VdbeAddOp2(v, OP_BeginSubrtn, 0, pExpr->y.sub.regReturn) + 1; - + if( pSig ){ + pSig->iAddr = pExpr->y.sub.iAddr; + pSig->regReturn = pExpr->y.sub.regReturn; + pSig->iTable = iTab; + pParse->mSubrtnSig = 1 << (pSig->selId&7); + sqlite3VdbeChangeP4(v, -1, (const char*)pSig, P4_SUBRTNSIG); + } addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); } @@ -108930,15 +113011,30 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( SelectDest dest; int i; int rc; + int addrBloom = 0; sqlite3SelectDestInit(&dest, SRT_Set, iTab); dest.zAffSdst = exprINAffinity(pParse, pExpr); pSelect->iLimit = 0; + if( addrOnce && OptimizationEnabled(pParse->db, SQLITE_BloomFilter) ){ + int regBloom = ++pParse->nMem; + addrBloom = sqlite3VdbeAddOp2(v, OP_Blob, 10000, regBloom); + VdbeComment((v, "Bloom filter")); + dest.iSDParm2 = regBloom; + } testcase( pSelect->selFlags & SF_Distinct ); testcase( pKeyInfo==0 ); /* Caused by OOM in sqlite3KeyInfoAlloc() */ pCopy = sqlite3SelectDup(pParse->db, pSelect, 0); rc = pParse->db->mallocFailed ? 1 :sqlite3Select(pParse, pCopy, &dest); sqlite3SelectDelete(pParse->db, pCopy); sqlite3DbFree(pParse->db, dest.zAffSdst); + if( addrBloom ){ + sqlite3VdbeGetOp(v, addrOnce)->p3 = dest.iSDParm2; + if( dest.iSDParm2==0 ){ + sqlite3VdbeChangeToNoop(v, addrBloom); + }else{ + sqlite3VdbeGetOp(v, addrOnce)->p3 = dest.iSDParm2; + } + } if( rc ){ sqlite3KeyInfoUnref(pKeyInfo); return; @@ -108989,7 +113085,7 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( ** this code only executes once. Because for a non-constant ** expression we need to rerun this code each time. */ - if( addrOnce && !sqlite3ExprIsConstant(pE2) ){ + if( addrOnce && !sqlite3ExprIsConstant(pParse, pE2) ){ sqlite3VdbeChangeToNoop(v, addrOnce-1); sqlite3VdbeChangeToNoop(v, addrOnce); ExprClearProperty(pExpr, EP_Subrtn); @@ -109236,9 +113332,7 @@ static void sqlite3ExprCodeIN( if( sqlite3ExprCheckIN(pParse, pExpr) ) return; zAff = exprINAffinity(pParse, pExpr); nVector = sqlite3ExprVectorSize(pExpr->pLeft); - aiMap = (int*)sqlite3DbMallocZero( - pParse->db, nVector*(sizeof(int) + sizeof(char)) + 1 - ); + aiMap = (int*)sqlite3DbMallocZero(pParse->db, nVector*sizeof(int)); if( pParse->db->mallocFailed ) goto sqlite3ExprCodeIN_oom_error; /* Attempt to compute the RHS. After this step, if anything other than @@ -109381,6 +113475,15 @@ static void sqlite3ExprCodeIN( sqlite3VdbeAddOp4(v, OP_Affinity, rLhs, nVector, 0, zAff, nVector); if( destIfFalse==destIfNull ){ /* Combine Step 3 and Step 5 into a single opcode */ + if( ExprHasProperty(pExpr, EP_Subrtn) ){ + const VdbeOp *pOp = sqlite3VdbeGetOp(v, pExpr->y.sub.iAddr); + assert( pOp->opcode==OP_Once || pParse->nErr ); + if( pOp->opcode==OP_Once && pOp->p3>0 ){ + assert( OptimizationEnabled(pParse->db, SQLITE_BloomFilter) ); + sqlite3VdbeAddOp4Int(v, OP_Filter, pOp->p3, destIfFalse, + rLhs, nVector); VdbeCoverage(v); + } + } sqlite3VdbeAddOp4Int(v, OP_NotFound, iTab, destIfFalse, rLhs, nVector); VdbeCoverage(v); goto sqlite3ExprCodeIN_finished; @@ -109639,10 +113742,13 @@ SQLITE_PRIVATE int sqlite3ExprCodeGetColumn( u8 p5 /* P5 value for OP_Column + FLAGS */ ){ assert( pParse->pVdbe!=0 ); + assert( (p5 & (OPFLAG_NOCHNG|OPFLAG_TYPEOFARG|OPFLAG_LENGTHARG))==p5 ); + assert( IsVirtual(pTab) || (p5 & OPFLAG_NOCHNG)==0 ); sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pTab, iTable, iColumn, iReg); if( p5 ){ VdbeOp *pOp = sqlite3VdbeGetLastOp(pParse->pVdbe); if( pOp->opcode==OP_Column ) pOp->p5 = p5; + if( pOp->opcode==OP_VColumn ) pOp->p5 = (p5 & OPFLAG_NOCHNG); } return iReg; } @@ -109660,18 +113766,22 @@ SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse *pParse, int iFrom, int iTo, int n ** register iReg. The caller must ensure that iReg already contains ** the correct value for the expression. */ -static void exprToRegister(Expr *pExpr, int iReg){ +SQLITE_PRIVATE void sqlite3ExprToRegister(Expr *pExpr, int iReg){ Expr *p = sqlite3ExprSkipCollateAndLikely(pExpr); if( NEVER(p==0) ) return; - p->op2 = p->op; - p->op = TK_REGISTER; - p->iTable = iReg; - ExprClearProperty(p, EP_Skip); + if( p->op==TK_REGISTER ){ + assert( p->iTable==iReg ); + }else{ + p->op2 = p->op; + p->op = TK_REGISTER; + p->iTable = iReg; + ExprClearProperty(p, EP_Skip); + } } /* ** Evaluate an expression (either a vector or a scalar expression) and store -** the result in continguous temporary registers. Return the index of +** the result in contiguous temporary registers. Return the index of ** the first register used to store the result. ** ** If the returned result register is a temporary scalar, then also write @@ -109711,7 +113821,7 @@ static int exprCodeVector(Parse *pParse, Expr *p, int *piFreeable){ */ static void setDoNotMergeFlagOnCopy(Vdbe *v){ if( sqlite3VdbeGetLastOp(v)->opcode==OP_Copy ){ - sqlite3VdbeChangeP5(v, 1); /* Tag trailing OP_Copy as not mergable */ + sqlite3VdbeChangeP5(v, 1); /* Tag trailing OP_Copy as not mergeable */ } } @@ -109801,13 +113911,13 @@ static int exprCodeInlineFunction( } case INLINEFUNC_implies_nonnull_row: { - /* REsult of sqlite3ExprImpliesNonNullRow() */ + /* Result of sqlite3ExprImpliesNonNullRow() */ Expr *pA1; assert( nFarg==2 ); pA1 = pFarg->a[1].pExpr; if( pA1->op==TK_COLUMN ){ sqlite3VdbeAddOp2(v, OP_Integer, - sqlite3ExprImpliesNonNullRow(pFarg->a[0].pExpr,pA1->iTable), + sqlite3ExprImpliesNonNullRow(pFarg->a[0].pExpr,pA1->iTable,1), target); }else{ sqlite3VdbeAddOp2(v, OP_Null, 0, target); @@ -109836,6 +113946,59 @@ static int exprCodeInlineFunction( return target; } +/* +** Expression Node callback for sqlite3ExprCanReturnSubtype(). +** +** Only a function call is able to return a subtype. So if the node +** is not a function call, return WRC_Prune immediately. +** +** A function call is able to return a subtype if it has the +** SQLITE_RESULT_SUBTYPE property. +** +** Assume that every function is able to pass-through a subtype from +** one of its argument (using sqlite3_result_value()). Most functions +** are not this way, but we don't have a mechanism to distinguish those +** that are from those that are not, so assume they all work this way. +** That means that if one of its arguments is another function and that +** other function is able to return a subtype, then this function is +** able to return a subtype. +*/ +static int exprNodeCanReturnSubtype(Walker *pWalker, Expr *pExpr){ + int n; + FuncDef *pDef; + sqlite3 *db; + if( pExpr->op!=TK_FUNCTION ){ + return WRC_Prune; + } + assert( ExprUseXList(pExpr) ); + db = pWalker->pParse->db; + n = ALWAYS(pExpr->x.pList) ? pExpr->x.pList->nExpr : 0; + pDef = sqlite3FindFunction(db, pExpr->u.zToken, n, ENC(db), 0); + if( NEVER(pDef==0) || (pDef->funcFlags & SQLITE_RESULT_SUBTYPE)!=0 ){ + pWalker->eCode = 1; + return WRC_Prune; + } + return WRC_Continue; +} + +/* +** Return TRUE if expression pExpr is able to return a subtype. +** +** A TRUE return does not guarantee that a subtype will be returned. +** It only indicates that a subtype return is possible. False positives +** are acceptable as they only disable an optimization. False negatives, +** on the other hand, can lead to incorrect answers. +*/ +static int sqlite3ExprCanReturnSubtype(Parse *pParse, Expr *pExpr){ + Walker w; + memset(&w, 0, sizeof(w)); + w.pParse = pParse; + w.xExprCallback = exprNodeCanReturnSubtype; + sqlite3WalkExpr(&w, pExpr); + return w.eCode; +} + + /* ** Check to see if pExpr is one of the indexed expressions on pParse->pIdxEpr. ** If it is, then resolve the expression by reading from the index and @@ -109868,6 +114031,17 @@ static SQLITE_NOINLINE int sqlite3IndexedExprLookup( continue; } + + /* Functions that might set a subtype should not be replaced by the + ** value taken from an expression index if they are themselves an + ** argument to another scalar function or aggregate. + ** https://sqlite.org/forum/forumpost/68d284c86b082c3e */ + if( ExprHasProperty(pExpr, EP_SubtArg) + && sqlite3ExprCanReturnSubtype(pParse, pExpr) + ){ + continue; + } + v = pParse->pVdbe; assert( v!=0 ); if( p->bMaybeNullRow ){ @@ -109895,6 +114069,41 @@ static SQLITE_NOINLINE int sqlite3IndexedExprLookup( } +/* +** Expresion pExpr is guaranteed to be a TK_COLUMN or equivalent. This +** function checks the Parse.pIdxPartExpr list to see if this column +** can be replaced with a constant value. If so, it generates code to +** put the constant value in a register (ideally, but not necessarily, +** register iTarget) and returns the register number. +** +** Or, if the TK_COLUMN cannot be replaced by a constant, zero is +** returned. +*/ +static int exprPartidxExprLookup(Parse *pParse, Expr *pExpr, int iTarget){ + IndexedExpr *p; + for(p=pParse->pIdxPartExpr; p; p=p->pIENext){ + if( pExpr->iColumn==p->iIdxCol && pExpr->iTable==p->iDataCur ){ + Vdbe *v = pParse->pVdbe; + int addr = 0; + int ret; + + if( p->bMaybeNullRow ){ + addr = sqlite3VdbeAddOp1(v, OP_IfNullRow, p->iIdxCur); + } + ret = sqlite3ExprCodeTarget(pParse, p->pExpr, iTarget); + sqlite3VdbeAddOp4(pParse->pVdbe, OP_Affinity, ret, 1, 0, + (const char*)&p->aff, 1); + if( addr ){ + sqlite3VdbeJumpHere(v, addr); + sqlite3VdbeChangeP3(v, addr, ret); + } + return ret; + } + } + return 0; +} + + /* ** Generate code into the current Vdbe to evaluate the given ** expression. Attempt to store the results in register "target". @@ -109931,12 +114140,25 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) assert( !ExprHasVVAProperty(pExpr,EP_Immutable) ); op = pExpr->op; } + assert( op!=TK_ORDER ); switch( op ){ case TK_AGG_COLUMN: { AggInfo *pAggInfo = pExpr->pAggInfo; struct AggInfo_col *pCol; assert( pAggInfo!=0 ); - assert( pExpr->iAgg>=0 && pExpr->iAggnColumn ); + assert( pExpr->iAgg>=0 ); + if( pExpr->iAgg>=pAggInfo->nColumn ){ + /* Happens when the left table of a RIGHT JOIN is null and + ** is using an expression index */ + sqlite3VdbeAddOp2(v, OP_Null, 0, target); +#ifdef SQLITE_VDBE_COVERAGE + /* Verify that the OP_Null above is exercised by tests + ** tag-20230325-2 */ + sqlite3VdbeAddOp3(v, OP_NotNull, target, 1, 20230325); + VdbeCoverageNeverTaken(v); +#endif + break; + } pCol = &pAggInfo->aCol[pExpr->iAgg]; if( !pAggInfo->directMode ){ return AggInfoColumnReg(pAggInfo, pExpr->iAgg); @@ -109971,7 +114193,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) if( ExprHasProperty(pExpr, EP_FixedCol) ){ /* This COLUMN expression is really a constant due to WHERE clause ** constraints, and that constant is coded by the pExpr->pLeft - ** expresssion. However, make sure the constant has the correct + ** expression. However, make sure the constant has the correct ** datatype by applying the Affinity of the table column to the ** constant. */ @@ -110040,6 +114262,11 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) iTab = pParse->iSelfTab - 1; } } + else if( pParse->pIdxPartExpr + && 0!=(r1 = exprPartidxExprLookup(pParse, pExpr, target)) + ){ + return r1; + } assert( ExprUseYTab(pExpr) ); assert( pExpr->y.pTab!=0 ); iReg = sqlite3ExprCodeGetColumn(pParse, pExpr->y.pTab, @@ -110097,12 +114324,6 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) assert( pExpr->u.zToken!=0 ); assert( pExpr->u.zToken[0]!=0 ); sqlite3VdbeAddOp2(v, OP_Variable, pExpr->iColumn, target); - if( pExpr->u.zToken[1]!=0 ){ - const char *z = sqlite3VListNumToName(pParse->pVList, pExpr->iColumn); - assert( pExpr->u.zToken[0]=='?' || (z && !strcmp(pExpr->u.zToken, z)) ); - pParse->pVList[0] = 0; /* Indicate VList may no longer be enlarged */ - sqlite3VdbeAppendP4(v, (char*)z, P4_STATIC); - } return target; } case TK_REGISTER: { @@ -110111,11 +114332,8 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) #ifndef SQLITE_OMIT_CAST case TK_CAST: { /* Expressions of the form: CAST(pLeft AS token) */ - inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); - if( inReg!=target ){ - sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target); - inReg = target; - } + sqlite3ExprCode(pParse, pExpr->pLeft, target); + assert( inReg==target ); assert( !ExprHasProperty(pExpr, EP_IntValue) ); sqlite3VdbeAddOp2(v, OP_Cast, target, sqlite3AffinityType(pExpr->u.zToken, 0)); @@ -110279,7 +114497,9 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) } #endif - if( ConstFactorOk(pParse) && sqlite3ExprIsConstantNotJoin(pExpr) ){ + if( ConstFactorOk(pParse) + && sqlite3ExprIsConstantNotJoin(pParse,pExpr) + ){ /* SQL functions can be expensive. So try to avoid running them ** multiple times if we know they always give the same result */ return sqlite3ExprCodeRunJustOnce(pParse, pExpr, -1); @@ -110300,7 +114520,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) sqlite3ErrorMsg(pParse, "unknown function: %#T()", pExpr); break; } - if( pDef->funcFlags & SQLITE_FUNC_INLINE ){ + if( (pDef->funcFlags & SQLITE_FUNC_INLINE)!=0 && ALWAYS(pFarg!=0) ){ assert( (pDef->funcFlags & SQLITE_FUNC_UNSAFE)==0 ); assert( (pDef->funcFlags & SQLITE_FUNC_DIRECT)==0 ); return exprCodeInlineFunction(pParse, pFarg, @@ -110310,7 +114530,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) } for(i=0; ia[i].pExpr) ){ + if( i<32 && sqlite3ExprIsConstant(pParse, pFarg->a[i].pExpr) ){ testcase( i==31 ); constMask |= MASKBIT32(i); } @@ -110326,10 +114546,10 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) r1 = sqlite3GetTempRange(pParse, nFarg); } - /* For length() and typeof() functions with a column argument, + /* For length() and typeof() and octet_length() functions, ** set the P5 parameter to the OP_Column opcode to OPFLAG_LENGTHARG - ** or OPFLAG_TYPEOFARG respectively, to avoid unnecessary data - ** loading. + ** or OPFLAG_TYPEOFARG or OPFLAG_BYTELENARG respectively, to avoid + ** unnecessary data loading. */ if( (pDef->funcFlags & (SQLITE_FUNC_LENGTH|SQLITE_FUNC_TYPEOF))!=0 ){ u8 exprOp; @@ -110339,14 +114559,16 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) if( exprOp==TK_COLUMN || exprOp==TK_AGG_COLUMN ){ assert( SQLITE_FUNC_LENGTH==OPFLAG_LENGTHARG ); assert( SQLITE_FUNC_TYPEOF==OPFLAG_TYPEOFARG ); - testcase( pDef->funcFlags & OPFLAG_LENGTHARG ); - pFarg->a[0].pExpr->op2 = - pDef->funcFlags & (OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG); + assert( SQLITE_FUNC_BYTELEN==OPFLAG_BYTELENARG ); + assert( (OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG)==OPFLAG_BYTELENARG ); + testcase( (pDef->funcFlags & OPFLAG_BYTELENARG)==OPFLAG_LENGTHARG ); + testcase( (pDef->funcFlags & OPFLAG_BYTELENARG)==OPFLAG_TYPEOFARG ); + testcase( (pDef->funcFlags & OPFLAG_BYTELENARG)==OPFLAG_BYTELENARG); + pFarg->a[0].pExpr->op2 = pDef->funcFlags & OPFLAG_BYTELENARG; } } - sqlite3ExprCodeExprList(pParse, pFarg, r1, 0, - SQLITE_ECEL_DUP|SQLITE_ECEL_FACTOR); + sqlite3ExprCodeExprList(pParse, pFarg, r1, 0, SQLITE_ECEL_FACTOR); }else{ r1 = 0; } @@ -110450,17 +114672,14 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) if( !ExprHasProperty(pExpr, EP_Collate) ){ /* A TK_COLLATE Expr node without the EP_Collate tag is a so-called ** "SOFT-COLLATE" that is added to constraints that are pushed down - ** from outer queries into sub-queries by the push-down optimization. - ** Clear subtypes as subtypes may not cross a subquery boundary. + ** from outer queries into sub-queries by the WHERE-clause push-down + ** optimization. Clear subtypes as subtypes may not cross a subquery + ** boundary. */ assert( pExpr->pLeft ); - inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); - if( inReg!=target ){ - sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target); - inReg = target; - } - sqlite3VdbeAddOp1(v, OP_ClrSubtype, inReg); - return inReg; + sqlite3ExprCode(pParse, pExpr->pLeft, target); + sqlite3VdbeAddOp1(v, OP_ClrSubtype, target); + return target; }else{ pExpr = pExpr->pLeft; goto expr_code_doover; /* 2018-04-28: Prevent deep recursion. */ @@ -110570,12 +114789,9 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) ** "target" and not someplace else. */ pParse->okConstFactor = 0; /* note (1) above */ - inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); + sqlite3ExprCode(pParse, pExpr->pLeft, target); + assert( target==inReg ); pParse->okConstFactor = okConstFactor; - if( inReg!=target ){ /* note (2) above */ - sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target); - inReg = target; - } sqlite3VdbeJumpHere(v, addrINR); break; } @@ -110627,7 +114843,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) break; } testcase( pX->op==TK_COLUMN ); - exprToRegister(pDel, exprCodeVector(pParse, pDel, ®Free1)); + sqlite3ExprToRegister(pDel, exprCodeVector(pParse, pDel, ®Free1)); testcase( regFree1==0 ); memset(&opCompare, 0, sizeof(opCompare)); opCompare.op = TK_EQ; @@ -110681,15 +114897,14 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) } assert( !ExprHasProperty(pExpr, EP_IntValue) ); if( pExpr->affExpr==OE_Ignore ){ - sqlite3VdbeAddOp4( - v, OP_Halt, SQLITE_OK, OE_Ignore, 0, pExpr->u.zToken,0); + sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_OK, OE_Ignore); VdbeCoverage(v); }else{ - sqlite3HaltConstraint(pParse, + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + sqlite3VdbeAddOp3(v, OP_Halt, pParse->pTriggerTab ? SQLITE_CONSTRAINT_TRIGGER : SQLITE_ERROR, - pExpr->affExpr, pExpr->u.zToken, 0, 0); + pExpr->affExpr, r1); } - break; } #endif @@ -110708,9 +114923,9 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) ** once. If no functions are involved, then factor the code out and put it at ** the end of the prepared statement in the initialization section. ** -** If regDest>=0 then the result is always stored in that register and the +** If regDest>0 then the result is always stored in that register and the ** result is not reusable. If regDest<0 then this routine is free to -** store the value whereever it wants. The register where the expression +** store the value wherever it wants. The register where the expression ** is stored is returned. When regDest<0, two identical expressions might ** code to the same register, if they do not contain function calls and hence ** are factored out into the initialization section at the end of the @@ -110723,6 +114938,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeRunJustOnce( ){ ExprList *p; assert( ConstFactorOk(pParse) ); + assert( regDest!=0 ); p = pParse->pConstExpr; if( regDest<0 && p ){ struct ExprList_item *pItem; @@ -110781,7 +114997,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse *pParse, Expr *pExpr, int *pReg){ if( ConstFactorOk(pParse) && ALWAYS(pExpr!=0) && pExpr->op!=TK_REGISTER - && sqlite3ExprIsConstantNotJoin(pExpr) + && sqlite3ExprIsConstantNotJoin(pParse, pExpr) ){ *pReg = 0; r2 = sqlite3ExprCodeRunJustOnce(pParse, pExpr, -1); @@ -110813,7 +115029,11 @@ SQLITE_PRIVATE void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); if( inReg!=target ){ u8 op; - if( ALWAYS(pExpr) && ExprHasProperty(pExpr,EP_Subquery) ){ + Expr *pX = sqlite3ExprSkipCollateAndLikely(pExpr); + testcase( pX!=pExpr ); + if( ALWAYS(pX) + && (ExprHasProperty(pX,EP_Subquery) || pX->op==TK_REGISTER) + ){ op = OP_Copy; }else{ op = OP_SCopy; @@ -110841,7 +115061,7 @@ SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse *pParse, Expr *pExpr, int target){ ** might choose to code the expression at initialization time. */ SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse *pParse, Expr *pExpr, int target){ - if( pParse->okConstFactor && sqlite3ExprIsConstantNotJoin(pExpr) ){ + if( pParse->okConstFactor && sqlite3ExprIsConstantNotJoin(pParse,pExpr) ){ sqlite3ExprCodeRunJustOnce(pParse, pExpr, target); }else{ sqlite3ExprCodeCopy(pParse, pExpr, target); @@ -110900,7 +115120,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeExprList( sqlite3VdbeAddOp2(v, copyOp, j+srcReg-1, target+i); } }else if( (flags & SQLITE_ECEL_FACTOR)!=0 - && sqlite3ExprIsConstantNotJoin(pExpr) + && sqlite3ExprIsConstantNotJoin(pParse,pExpr) ){ sqlite3ExprCodeRunJustOnce(pParse, pExpr, target+i); }else{ @@ -110973,7 +115193,7 @@ static void exprCodeBetween( compRight.op = TK_LE; compRight.pLeft = pDel; compRight.pRight = pExpr->x.pList->a[1].pExpr; - exprToRegister(pDel, exprCodeVector(pParse, pDel, ®Free1)); + sqlite3ExprToRegister(pDel, exprCodeVector(pParse, pDel, ®Free1)); if( xJump ){ xJump(pParse, &exprAnd, dest, jumpIfNull); }else{ @@ -111532,8 +115752,8 @@ SQLITE_PRIVATE int sqlite3ExprListCompare(const ExprList *pA, const ExprList *pB */ SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr *pA,Expr *pB, int iTab){ return sqlite3ExprCompare(0, - sqlite3ExprSkipCollateAndLikely(pA), - sqlite3ExprSkipCollateAndLikely(pB), + sqlite3ExprSkipCollate(pA), + sqlite3ExprSkipCollate(pB), iTab); } @@ -111626,7 +115846,7 @@ static int exprImpliesNotNull( ** pE1: x!=123 pE2: x IS NOT NULL Result: true ** pE1: x!=?1 pE2: x IS NOT NULL Result: true ** pE1: x IS NULL pE2: x IS NOT NULL Result: false -** pE1: x IS ?2 pE2: x IS NOT NULL Reuslt: false +** pE1: x IS ?2 pE2: x IS NOT NULL Result: false ** ** When comparing TK_COLUMN nodes between pE1 and pE2, if pE2 has ** Expr.iTable<0 then assume a table number given by iTab. @@ -111663,11 +115883,29 @@ SQLITE_PRIVATE int sqlite3ExprImpliesExpr( return 0; } +/* This is a helper function to impliesNotNullRow(). In this routine, +** set pWalker->eCode to one only if *both* of the input expressions +** separately have the implies-not-null-row property. +*/ +static void bothImplyNotNullRow(Walker *pWalker, Expr *pE1, Expr *pE2){ + if( pWalker->eCode==0 ){ + sqlite3WalkExpr(pWalker, pE1); + if( pWalker->eCode ){ + pWalker->eCode = 0; + sqlite3WalkExpr(pWalker, pE2); + } + } +} + /* ** This is the Expr node callback for sqlite3ExprImpliesNonNullRow(). ** If the expression node requires that the table at pWalker->iCur ** have one or more non-NULL column, then set pWalker->eCode to 1 and abort. ** +** pWalker->mWFlags is non-zero if this inquiry is being undertaking on +** behalf of a RIGHT JOIN (or FULL JOIN). That makes a difference when +** evaluating terms in the ON clause of an inner join. +** ** This routine controls an optimization. False positives (setting ** pWalker->eCode to 1 when it should not be) are deadly, but false-negatives ** (never setting pWalker->eCode) is a harmless missed optimization. @@ -111676,28 +115914,33 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_AGG_COLUMN ); testcase( pExpr->op==TK_AGG_FUNCTION ); if( ExprHasProperty(pExpr, EP_OuterON) ) return WRC_Prune; + if( ExprHasProperty(pExpr, EP_InnerON) && pWalker->mWFlags ){ + /* If iCur is used in an inner-join ON clause to the left of a + ** RIGHT JOIN, that does *not* mean that the table must be non-null. + ** But it is difficult to check for that condition precisely. + ** To keep things simple, any use of iCur from any inner-join is + ** ignored while attempting to simplify a RIGHT JOIN. */ + return WRC_Prune; + } switch( pExpr->op ){ case TK_ISNOT: case TK_ISNULL: case TK_NOTNULL: case TK_IS: - case TK_OR: case TK_VECTOR: - case TK_CASE: - case TK_IN: case TK_FUNCTION: case TK_TRUTH: + case TK_CASE: testcase( pExpr->op==TK_ISNOT ); testcase( pExpr->op==TK_ISNULL ); testcase( pExpr->op==TK_NOTNULL ); testcase( pExpr->op==TK_IS ); - testcase( pExpr->op==TK_OR ); testcase( pExpr->op==TK_VECTOR ); - testcase( pExpr->op==TK_CASE ); - testcase( pExpr->op==TK_IN ); testcase( pExpr->op==TK_FUNCTION ); testcase( pExpr->op==TK_TRUTH ); + testcase( pExpr->op==TK_CASE ); return WRC_Prune; + case TK_COLUMN: if( pWalker->u.iCur==pExpr->iTable ){ pWalker->eCode = 1; @@ -111705,21 +115948,38 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ } return WRC_Prune; + case TK_OR: case TK_AND: - if( pWalker->eCode==0 ){ + /* Both sides of an AND or OR must separately imply non-null-row. + ** Consider these cases: + ** 1. NOT (x AND y) + ** 2. x OR y + ** If only one of x or y is non-null-row, then the overall expression + ** can be true if the other arm is false (case 1) or true (case 2). + */ + testcase( pExpr->op==TK_OR ); + testcase( pExpr->op==TK_AND ); + bothImplyNotNullRow(pWalker, pExpr->pLeft, pExpr->pRight); + return WRC_Prune; + + case TK_IN: + /* Beware of "x NOT IN ()" and "x NOT IN (SELECT 1 WHERE false)", + ** both of which can be true. But apart from these cases, if + ** the left-hand side of the IN is NULL then the IN itself will be + ** NULL. */ + if( ExprUseXList(pExpr) && ALWAYS(pExpr->x.pList->nExpr>0) ){ sqlite3WalkExpr(pWalker, pExpr->pLeft); - if( pWalker->eCode ){ - pWalker->eCode = 0; - sqlite3WalkExpr(pWalker, pExpr->pRight); - } } return WRC_Prune; case TK_BETWEEN: - if( sqlite3WalkExpr(pWalker, pExpr->pLeft)==WRC_Abort ){ - assert( pWalker->eCode ); - return WRC_Abort; - } + /* In "x NOT BETWEEN y AND z" either x must be non-null-row or else + ** both y and z must be non-null row */ + assert( ExprUseXList(pExpr) ); + assert( pExpr->x.pList->nExpr==2 ); + sqlite3WalkExpr(pWalker, pExpr->pLeft); + bothImplyNotNullRow(pWalker, pExpr->x.pList->a[0].pExpr, + pExpr->x.pList->a[1].pExpr); return WRC_Prune; /* Virtual tables are allowed to use constraints like x=NULL. So @@ -111781,7 +116041,7 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ ** be non-NULL, then the LEFT JOIN can be safely converted into an ** ordinary join. */ -SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){ +SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab, int isRJ){ Walker w; p = sqlite3ExprSkipCollateAndLikely(p); if( p==0 ) return 0; @@ -111789,7 +116049,7 @@ SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){ p = p->pLeft; }else{ while( p->op==TK_AND ){ - if( sqlite3ExprImpliesNonNullRow(p->pLeft, iTab) ) return 1; + if( sqlite3ExprImpliesNonNullRow(p->pLeft, iTab, isRJ) ) return 1; p = p->pRight; } } @@ -111797,6 +116057,7 @@ SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){ w.xSelectCallback = 0; w.xSelectCallback2 = 0; w.eCode = 0; + w.mWFlags = isRJ!=0; w.u.iCur = iTab; sqlite3WalkExpr(&w, p); return w.eCode; @@ -111857,7 +116118,7 @@ SQLITE_PRIVATE int sqlite3ExprCoveredByIndex( } -/* Structure used to pass information throught the Walker in order to +/* Structure used to pass information throughout the Walker in order to ** implement sqlite3ReferencesSrcList(). */ struct RefSrcList { @@ -111964,6 +116225,12 @@ SQLITE_PRIVATE int sqlite3ReferencesSrcList(Parse *pParse, Expr *pExpr, SrcList assert( pExpr->op==TK_AGG_FUNCTION ); assert( ExprUseXList(pExpr) ); sqlite3WalkExprList(&w, pExpr->x.pList); + if( pExpr->pLeft ){ + assert( pExpr->pLeft->op==TK_ORDER ); + assert( ExprUseXList(pExpr->pLeft) ); + assert( pExpr->pLeft->x.pList!=0 ); + sqlite3WalkExprList(&w, pExpr->pLeft->x.pList); + } #ifndef SQLITE_OMIT_WINDOWFUNC if( ExprHasProperty(pExpr, EP_WinFunc) ){ sqlite3WalkExpr(&w, pExpr->y.pWin->pFilter); @@ -111998,23 +116265,24 @@ static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){ int iAgg = pExpr->iAgg; Parse *pParse = pWalker->pParse; sqlite3 *db = pParse->db; + assert( iAgg>=0 ); if( pExpr->op!=TK_AGG_FUNCTION ){ - assert( iAgg>=0 && iAggnColumn ); - if( pAggInfo->aCol[iAgg].pCExpr==pExpr ){ + if( iAggnColumn + && pAggInfo->aCol[iAgg].pCExpr==pExpr + ){ pExpr = sqlite3ExprDup(db, pExpr, 0); - if( pExpr ){ + if( pExpr && !sqlite3ExprDeferredDelete(pParse, pExpr) ){ pAggInfo->aCol[iAgg].pCExpr = pExpr; - sqlite3ExprDeferredDelete(pParse, pExpr); } } }else{ assert( pExpr->op==TK_AGG_FUNCTION ); - assert( iAgg>=0 && iAggnFunc ); - if( pAggInfo->aFunc[iAgg].pFExpr==pExpr ){ + if( ALWAYS(iAggnFunc) + && pAggInfo->aFunc[iAgg].pFExpr==pExpr + ){ pExpr = sqlite3ExprDup(db, pExpr, 0); - if( pExpr ){ + if( pExpr && !sqlite3ExprDeferredDelete(pParse, pExpr) ){ pAggInfo->aFunc[iAgg].pFExpr = pExpr; - sqlite3ExprDeferredDelete(pParse, pExpr); } } } @@ -112070,7 +116338,7 @@ static int addAggInfoFunc(sqlite3 *db, AggInfo *pInfo){ ** Return the index in aCol[] of the entry that describes that column. ** ** If no prior entry is found, create a new one and return -1. The -** new column will have an idex of pAggInfo->nColumn-1. +** new column will have an index of pAggInfo->nColumn-1. */ static void findOrCreateAggInfoColumn( Parse *pParse, /* Parsing context */ @@ -112083,6 +116351,7 @@ static void findOrCreateAggInfoColumn( assert( pAggInfo->iFirstReg==0 ); pCol = pAggInfo->aCol; for(k=0; knColumn; k++, pCol++){ + if( pCol->pCExpr==pExpr ) return; if( pCol->iTable==pExpr->iTable && pCol->iColumn==pExpr->iColumn && pExpr->op!=TK_IF_NULL_ROW @@ -112160,7 +116429,12 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ } if( pIEpr==0 ) break; if( NEVER(!ExprUseYTab(pExpr)) ) break; - if( pExpr->pAggInfo!=0 ) break; /* Already resolved by outer context */ + for(i=0; inSrc; i++){ + if( pSrcList->a[0].iCursor==pIEpr->iDataCur ) break; + } + if( i>=pSrcList->nSrc ) break; + if( NEVER(pExpr->pAggInfo!=0) ) break; /* Resolved by outer context */ + if( pParse->nErr ){ return WRC_Abort; } /* If we reach this point, it means that expression pExpr can be ** translated into a reference to an index column as described by @@ -112171,6 +116445,9 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ tmp.iTable = pIEpr->iIdxCur; tmp.iColumn = pIEpr->iIdxCol; findOrCreateAggInfoColumn(pParse, pAggInfo, &tmp); + if( pParse->nErr ){ return WRC_Abort; } + assert( pAggInfo->aCol!=0 ); + assert( tmp.iAggnColumn ); pAggInfo->aCol[tmp.iAgg].pCExpr = pExpr; pExpr->pAggInfo = pAggInfo; pExpr->iAgg = tmp.iAgg; @@ -112194,18 +116471,19 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ } /* endif pExpr->iTable==pItem->iCursor */ } /* end loop over pSrcList */ } - return WRC_Prune; + return WRC_Continue; } case TK_AGG_FUNCTION: { if( (pNC->ncFlags & NC_InAggFunc)==0 && pWalker->walkerDepth==pExpr->op2 + && pExpr->pAggInfo==0 ){ /* Check to see if pExpr is a duplicate of another aggregate ** function that is already in the pAggInfo structure */ struct AggInfo_func *pItem = pAggInfo->aFunc; for(i=0; inFunc; i++, pItem++){ - if( pItem->pFExpr==pExpr ) break; + if( NEVER(pItem->pFExpr==pExpr) ) break; if( sqlite3ExprCompare(0, pItem->pFExpr, pExpr, -1)==0 ){ break; } @@ -112216,14 +116494,44 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ u8 enc = ENC(pParse->db); i = addAggInfoFunc(pParse->db, pAggInfo); if( i>=0 ){ + int nArg; assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); pItem = &pAggInfo->aFunc[i]; pItem->pFExpr = pExpr; assert( ExprUseUToken(pExpr) ); + nArg = pExpr->x.pList ? pExpr->x.pList->nExpr : 0; pItem->pFunc = sqlite3FindFunction(pParse->db, - pExpr->u.zToken, - pExpr->x.pList ? pExpr->x.pList->nExpr : 0, enc, 0); - if( pExpr->flags & EP_Distinct ){ + pExpr->u.zToken, nArg, enc, 0); + assert( pItem->bOBUnique==0 ); + if( pExpr->pLeft + && (pItem->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL)==0 + ){ + /* The NEEDCOLL test above causes any ORDER BY clause on + ** aggregate min() or max() to be ignored. */ + ExprList *pOBList; + assert( nArg>0 ); + assert( pExpr->pLeft->op==TK_ORDER ); + assert( ExprUseXList(pExpr->pLeft) ); + pItem->iOBTab = pParse->nTab++; + pOBList = pExpr->pLeft->x.pList; + assert( pOBList->nExpr>0 ); + assert( pItem->bOBUnique==0 ); + if( pOBList->nExpr==1 + && nArg==1 + && sqlite3ExprCompare(0,pOBList->a[0].pExpr, + pExpr->x.pList->a[0].pExpr,0)==0 + ){ + pItem->bOBPayload = 0; + pItem->bOBUnique = ExprHasProperty(pExpr, EP_Distinct); + }else{ + pItem->bOBPayload = 1; + } + pItem->bUseSubtype = + (pItem->pFunc->funcFlags & SQLITE_SUBTYPE)!=0; + }else{ + pItem->iOBTab = -1; + } + if( ExprHasProperty(pExpr, EP_Distinct) && !pItem->bOBUnique ){ pItem->iDistinct = pParse->nTab++; }else{ pItem->iDistinct = -1; @@ -112347,6 +116655,37 @@ SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse *pParse){ pParse->nRangeReg = 0; } +/* +** Make sure sufficient registers have been allocated so that +** iReg is a valid register number. +*/ +SQLITE_PRIVATE void sqlite3TouchRegister(Parse *pParse, int iReg){ + if( pParse->nMemnMem = iReg; +} + +#if defined(SQLITE_ENABLE_STAT4) || defined(SQLITE_DEBUG) +/* +** Return the latest reusable register in the set of all registers. +** The value returned is no less than iMin. If any register iMin or +** greater is in permanent use, then return one more than that last +** permanent register. +*/ +SQLITE_PRIVATE int sqlite3FirstAvailableRegister(Parse *pParse, int iMin){ + const ExprList *pList = pParse->pConstExpr; + if( pList ){ + int i; + for(i=0; inExpr; i++){ + if( pList->a[i].u.iConstExprReg>=iMin ){ + iMin = pList->a[i].u.iConstExprReg + 1; + } + } + } + pParse->nTempReg = 0; + pParse->nRangeReg = 0; + return iMin; +} +#endif /* SQLITE_ENABLE_STAT4 || SQLITE_DEBUG */ + /* ** Validate that no temporary register falls within the range of ** iFirst..iLast, inclusive. This routine is only call from within assert() @@ -112366,6 +116705,14 @@ SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse *pParse, int iFirst, int iLast){ return 0; } } + if( pParse->pConstExpr ){ + ExprList *pList = pParse->pConstExpr; + for(i=0; inExpr; i++){ + int iReg = pList->a[i].u.iConstExprReg; + if( iReg==0 ) continue; + if( iReg>=iFirst && iReg<=iLast ) return 0; + } + } return 1; } #endif /* SQLITE_DEBUG */ @@ -112820,14 +117167,19 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ /* Verify that constraints are still satisfied */ if( pNew->pCheck!=0 || (pCol->notNull && (pCol->colFlags & COLFLAG_GENERATED)!=0) + || (pTab->tabFlags & TF_Strict)!=0 ){ sqlite3NestedParse(pParse, "SELECT CASE WHEN quick_check GLOB 'CHECK*'" " THEN raise(ABORT,'CHECK constraint failed')" + " WHEN quick_check GLOB 'non-* value in*'" + " THEN raise(ABORT,'type mismatch on DEFAULT')" " ELSE raise(ABORT,'NOT NULL constraint failed')" " END" " FROM pragma_quick_check(%Q,%Q)" - " WHERE quick_check GLOB 'CHECK*' OR quick_check GLOB 'NULL*'", + " WHERE quick_check GLOB 'CHECK*'" + " OR quick_check GLOB 'NULL*'" + " OR quick_check GLOB 'non-* value in*'", zTab, zDb ); } @@ -112916,7 +117268,7 @@ SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ pNew->u.tab.pDfltList = sqlite3ExprListDup(db, pTab->u.tab.pDfltList, 0); pNew->pSchema = db->aDb[iDb].pSchema; pNew->u.tab.addColOffset = pTab->u.tab.addColOffset; - pNew->nTabRef = 1; + assert( pNew->nTabRef==1 ); exit_begin_add_column: sqlite3SrcListDelete(db, pSrc); @@ -113421,7 +117773,7 @@ static RenameToken *renameColumnTokenNext(RenameCtx *pCtx){ } /* -** An error occured while parsing or otherwise processing a database +** An error occurred while parsing or otherwise processing a database ** object (either pParse->pNewTable, pNewIndex or pNewTrigger) as part of an ** ALTER TABLE RENAME COLUMN program. The error message emitted by the ** sub-routine is currently stored in pParse->zErrMsg. This function @@ -113653,6 +118005,19 @@ static int renameEditSql( return rc; } +/* +** Set all pEList->a[].fg.eEName fields in the expression-list to val. +*/ +static void renameSetENames(ExprList *pEList, int val){ + if( pEList ){ + int i; + for(i=0; inExpr; i++){ + assert( val==ENAME_NAME || pEList->a[i].fg.eEName==ENAME_NAME ); + pEList->a[i].fg.eEName = val; + } + } +} + /* ** Resolve all symbols in the trigger at pParse->pNewTrigger, assuming ** it was read from the schema of database zDb. Return SQLITE_OK if @@ -113676,7 +118041,7 @@ static int renameResolveTrigger(Parse *pParse){ /* ALWAYS() because if the table of the trigger does not exist, the ** error would have been hit before this point */ if( ALWAYS(pParse->pTriggerTab) ){ - rc = sqlite3ViewGetColumnNames(pParse, pParse->pTriggerTab); + rc = sqlite3ViewGetColumnNames(pParse, pParse->pTriggerTab)!=0; } /* Resolve symbols in WHEN clause */ @@ -113700,7 +118065,17 @@ static int renameResolveTrigger(Parse *pParse){ pSrc = 0; rc = SQLITE_NOMEM; }else{ + /* pStep->pExprList contains an expression-list used for an UPDATE + ** statement. So the a[].zEName values are the RHS of the + ** "= " clauses of the UPDATE statement. So, before + ** running SelectPrep(), change all the eEName values in + ** pStep->pExprList to ENAME_SPAN (from their current value of + ** ENAME_NAME). This is to prevent any ids in ON() clauses that are + ** part of pSrc from being incorrectly resolved against the + ** a[].zEName values as if they were column aliases. */ + renameSetENames(pStep->pExprList, ENAME_SPAN); sqlite3SelectPrep(pParse, pSel, 0); + renameSetENames(pStep->pExprList, ENAME_NAME); rc = pParse->nErr ? SQLITE_ERROR : SQLITE_OK; assert( pStep->pExprList==0 || pStep->pExprList==pSel->pEList ); assert( pSrc==pSel->pSrc ); @@ -113712,8 +118087,9 @@ static int renameResolveTrigger(Parse *pParse){ int i; for(i=0; ipFrom->nSrc && rc==SQLITE_OK; i++){ SrcItem *p = &pStep->pFrom->a[i]; - if( p->pSelect ){ - sqlite3SelectPrep(pParse, p->pSelect, 0); + if( p->fg.isSubquery ){ + assert( p->u4.pSubq!=0 ); + sqlite3SelectPrep(pParse, p->u4.pSubq->pSelect, 0); } } } @@ -113781,8 +118157,12 @@ static void renameWalkTrigger(Walker *pWalker, Trigger *pTrigger){ } if( pStep->pFrom ){ int i; - for(i=0; ipFrom->nSrc; i++){ - sqlite3WalkSelect(pWalker, pStep->pFrom->a[i].pSelect); + SrcList *pFrom = pStep->pFrom; + for(i=0; inSrc; i++){ + if( pFrom->a[i].fg.isSubquery ){ + assert( pFrom->a[i].u4.pSubq!=0 ); + sqlite3WalkSelect(pWalker, pFrom->a[i].u4.pSubq->pSelect); + } } } } @@ -114029,7 +118409,7 @@ static int renameTableSelectCb(Walker *pWalker, Select *pSelect){ } for(i=0; inSrc; i++){ SrcItem *pItem = &pSrc->a[i]; - if( pItem->pTab==p->pTab ){ + if( pItem->pSTab==p->pTab ){ renameTokenFind(pWalker->pParse, p, pItem->zName); } } @@ -114608,7 +118988,12 @@ SQLITE_PRIVATE void sqlite3AlterDropColumn(Parse *pParse, SrcList *pSrc, const T if( i==pTab->iPKey ){ sqlite3VdbeAddOp2(v, OP_Null, 0, regOut); }else{ + char aff = pTab->aCol[i].affinity; + if( aff==SQLITE_AFF_REAL ){ + pTab->aCol[i].affinity = SQLITE_AFF_NUMERIC; + } sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, i, regOut); + pTab->aCol[i].affinity = aff; } nField++; } @@ -114919,9 +119304,9 @@ static void openStatTable( typedef struct StatAccum StatAccum; typedef struct StatSample StatSample; struct StatSample { - tRowcnt *anEq; /* sqlite_stat4.nEq */ tRowcnt *anDLt; /* sqlite_stat4.nDLt */ #ifdef SQLITE_ENABLE_STAT4 + tRowcnt *anEq; /* sqlite_stat4.nEq */ tRowcnt *anLt; /* sqlite_stat4.nLt */ union { i64 iRowid; /* Rowid in main table of the key */ @@ -115079,9 +119464,9 @@ static void statInit( /* Allocate the space required for the StatAccum object */ n = sizeof(*p) - + sizeof(tRowcnt)*nColUp /* StatAccum.anEq */ - + sizeof(tRowcnt)*nColUp; /* StatAccum.anDLt */ + + sizeof(tRowcnt)*nColUp; /* StatAccum.anDLt */ #ifdef SQLITE_ENABLE_STAT4 + n += sizeof(tRowcnt)*nColUp; /* StatAccum.anEq */ if( mxSample ){ n += sizeof(tRowcnt)*nColUp /* StatAccum.anLt */ + sizeof(StatSample)*(nCol+mxSample) /* StatAccum.aBest[], a[] */ @@ -115102,9 +119487,9 @@ static void statInit( p->nKeyCol = nKeyCol; p->nSkipAhead = 0; p->current.anDLt = (tRowcnt*)&p[1]; - p->current.anEq = &p->current.anDLt[nColUp]; #ifdef SQLITE_ENABLE_STAT4 + p->current.anEq = &p->current.anDLt[nColUp]; p->mxSample = p->nLimit==0 ? mxSample : 0; if( mxSample ){ u8 *pSpace; /* Allocated space not yet assigned */ @@ -115371,7 +119756,9 @@ static void statPush( if( p->nRow==0 ){ /* This is the first call to this function. Do initialization. */ +#ifdef SQLITE_ENABLE_STAT4 for(i=0; inCol; i++) p->current.anEq[i] = 1; +#endif }else{ /* Second and subsequent calls get processed here */ #ifdef SQLITE_ENABLE_STAT4 @@ -115380,15 +119767,17 @@ static void statPush( /* Update anDLt[], anLt[] and anEq[] to reflect the values that apply ** to the current row of the index. */ +#ifdef SQLITE_ENABLE_STAT4 for(i=0; icurrent.anEq[i]++; } +#endif for(i=iChng; inCol; i++){ p->current.anDLt[i]++; #ifdef SQLITE_ENABLE_STAT4 if( p->mxSample ) p->current.anLt[i] += p->current.anEq[i]; -#endif p->current.anEq[i] = 1; +#endif } } @@ -115522,7 +119911,9 @@ static void statGet( u64 iVal = (p->nRow + nDistinct - 1) / nDistinct; if( iVal==2 && p->nRow*10 <= nDistinct*11 ) iVal = 1; sqlite3_str_appendf(&sStat, " %llu", iVal); - assert( p->current.anEq[i] ); +#ifdef SQLITE_ENABLE_STAT4 + assert( p->current.anEq[i] || p->nRow==0 ); +#endif } sqlite3ResultStrAccum(context, &sStat); } @@ -115649,11 +120040,15 @@ static void analyzeOneTable( int regIdxname = iMem++; /* Register containing index name */ int regStat1 = iMem++; /* Value for the stat column of sqlite_stat1 */ int regPrev = iMem; /* MUST BE LAST (see below) */ +#ifdef SQLITE_ENABLE_STAT4 + int doOnce = 1; /* Flag for a one-time computation */ +#endif #ifdef SQLITE_ENABLE_PREUPDATE_HOOK Table *pStat1 = 0; #endif - pParse->nMem = MAX(pParse->nMem, iMem); + sqlite3TouchRegister(pParse, iMem); + assert( sqlite3NoTempsInRange(pParse, regNewRowid, iMem) ); v = sqlite3GetVdbe(pParse); if( v==0 || NEVER(pTab==0) ){ return; @@ -115702,7 +120097,7 @@ static void analyzeOneTable( for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ int nCol; /* Number of columns in pIdx. "N" */ - int addrRewind; /* Address of "OP_Rewind iIdxCur" */ + int addrGotoEnd; /* Address of "OP_Rewind iIdxCur" */ int addrNextRow; /* Address of "next_row:" */ const char *zIdxName; /* Name of the index */ int nColTest; /* Number of columns to test for changes */ @@ -115726,9 +120121,14 @@ static void analyzeOneTable( /* ** Pseudo-code for loop that calls stat_push(): ** - ** Rewind csr - ** if eof(csr) goto end_of_scan; ** regChng = 0 + ** Rewind csr + ** if eof(csr){ + ** stat_init() with count = 0; + ** goto end_of_scan; + ** } + ** count() + ** stat_init() ** goto chng_addr_0; ** ** next_row: @@ -115759,7 +120159,7 @@ static void analyzeOneTable( ** the regPrev array and a trailing rowid (the rowid slot is required ** when building a record to insert into the sample column of ** the sqlite_stat4 table. */ - pParse->nMem = MAX(pParse->nMem, regPrev+nColTest); + sqlite3TouchRegister(pParse, regPrev+nColTest); /* Open a read-only cursor on the index being analyzed. */ assert( iDb==sqlite3SchemaToIndex(db, pIdx->pSchema) ); @@ -115767,41 +120167,36 @@ static void analyzeOneTable( sqlite3VdbeSetP4KeyInfo(pParse, pIdx); VdbeComment((v, "%s", pIdx->zName)); - /* Invoke the stat_init() function. The arguments are: + /* Implementation of the following: ** + ** regChng = 0 + ** Rewind csr + ** if eof(csr){ + ** stat_init() with count = 0; + ** goto end_of_scan; + ** } + ** count() + ** stat_init() + ** goto chng_addr_0; + */ + assert( regTemp2==regStat+4 ); + sqlite3VdbeAddOp2(v, OP_Integer, db->nAnalysisLimit, regTemp2); + + /* Arguments to stat_init(): ** (1) the number of columns in the index including the rowid ** (or for a WITHOUT ROWID table, the number of PK columns), ** (2) the number of columns in the key without the rowid/pk - ** (3) estimated number of rows in the index, - */ + ** (3) estimated number of rows in the index. */ sqlite3VdbeAddOp2(v, OP_Integer, nCol, regStat+1); assert( regRowid==regStat+2 ); sqlite3VdbeAddOp2(v, OP_Integer, pIdx->nKeyCol, regRowid); -#ifdef SQLITE_ENABLE_STAT4 - if( OptimizationEnabled(db, SQLITE_Stat4) ){ - sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regTemp); - addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, iIdxCur); - VdbeCoverage(v); - }else -#endif - { - addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, iIdxCur); - VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_Count, iIdxCur, regTemp, 1); - } - assert( regTemp2==regStat+4 ); - sqlite3VdbeAddOp2(v, OP_Integer, db->nAnalysisLimit, regTemp2); + sqlite3VdbeAddOp3(v, OP_Count, iIdxCur, regTemp, + OptimizationDisabled(db, SQLITE_Stat4)); sqlite3VdbeAddFunctionCall(pParse, 0, regStat+1, regStat, 4, &statInitFuncdef, 0); + addrGotoEnd = sqlite3VdbeAddOp1(v, OP_Rewind, iIdxCur); + VdbeCoverage(v); - /* Implementation of the following: - ** - ** Rewind csr - ** if eof(csr) goto end_of_scan; - ** regChng = 0 - ** goto next_push_0; - ** - */ sqlite3VdbeAddOp2(v, OP_Integer, 0, regChng); addrNextRow = sqlite3VdbeCurrentAddr(v); @@ -115908,6 +120303,12 @@ static void analyzeOneTable( } /* Add the entry to the stat1 table. */ + if( pIdx->pPartIdxWhere ){ + /* Partial indexes might get a zero-entry in sqlite_stat1. But + ** an empty table is omitted from sqlite_stat1. */ + sqlite3VdbeJumpHere(v, addrGotoEnd); + addrGotoEnd = 0; + } callStatGet(pParse, regStat, STAT_GET_STAT1, regStat1); assert( "BBB"[0]==SQLITE_AFF_TEXT ); sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regTemp, "BBB", 0); @@ -115931,7 +120332,42 @@ static void analyzeOneTable( int addrIsNull; u8 seekOp = HasRowid(pTab) ? OP_NotExists : OP_NotFound; - pParse->nMem = MAX(pParse->nMem, regCol+nCol); + /* No STAT4 data is generated if the number of rows is zero */ + if( addrGotoEnd==0 ){ + sqlite3VdbeAddOp2(v, OP_Cast, regStat1, SQLITE_AFF_INTEGER); + addrGotoEnd = sqlite3VdbeAddOp1(v, OP_IfNot, regStat1); + VdbeCoverage(v); + } + + if( doOnce ){ + int mxCol = nCol; + Index *pX; + + /* Compute the maximum number of columns in any index */ + for(pX=pTab->pIndex; pX; pX=pX->pNext){ + int nColX; /* Number of columns in pX */ + if( !HasRowid(pTab) && IsPrimaryKeyIndex(pX) ){ + nColX = pX->nKeyCol; + }else{ + nColX = pX->nColumn; + } + if( nColX>mxCol ) mxCol = nColX; + } + + /* Allocate space to compute results for the largest index */ + sqlite3TouchRegister(pParse, regCol+mxCol); + doOnce = 0; +#ifdef SQLITE_DEBUG + /* Verify that the call to sqlite3ClearTempRegCache() below + ** really is needed. + ** https://sqlite.org/forum/forumpost/83cb4a95a0 (2023-03-25) + */ + testcase( !sqlite3NoTempsInRange(pParse, regEq, regCol+mxCol) ); +#endif + sqlite3ClearTempRegCache(pParse); /* tag-20230325-1 */ + assert( sqlite3NoTempsInRange(pParse, regEq, regCol+mxCol) ); + } + assert( sqlite3NoTempsInRange(pParse, regEq, regCol+nCol) ); addrNext = sqlite3VdbeCurrentAddr(v); callStatGet(pParse, regStat, STAT_GET_ROWID, regSampleRowid); @@ -115955,7 +120391,7 @@ static void analyzeOneTable( #endif /* SQLITE_ENABLE_STAT4 */ /* End of analysis */ - sqlite3VdbeJumpHere(v, addrRewind); + if( addrGotoEnd ) sqlite3VdbeJumpHere(v, addrGotoEnd); } @@ -116012,6 +120448,11 @@ static void analyzeDatabase(Parse *pParse, int iDb){ for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){ Table *pTab = (Table*)sqliteHashData(k); analyzeOneTable(pParse, pTab, 0, iStatCur, iMem, iTab); +#ifdef SQLITE_ENABLE_STAT4 + iMem = sqlite3FirstAvailableRegister(pParse, iMem); +#else + assert( iMem==sqlite3FirstAvailableRegister(pParse,iMem) ); +#endif } loadAnalysis(pParse, iDb); } @@ -116174,6 +120615,16 @@ static void decodeIntArray( while( z[0]!=0 && z[0]!=' ' ) z++; while( z[0]==' ' ) z++; } + + /* Set the bLowQual flag if the peak number of rows obtained + ** from a full equality match is so large that a full table scan + ** seems likely to be faster than using the index. + */ + if( aLog[0] > 66 /* Index has more than 100 rows */ + && aLog[0] <= aLog[nOut-1] /* And only a single value seen */ + ){ + pIndex->bLowQual = 1; + } } } @@ -116386,12 +120837,13 @@ static int loadStatTbl( while( sqlite3_step(pStmt)==SQLITE_ROW ){ int nIdxCol = 1; /* Number of columns in stat4 records */ - char *zIndex; /* Index name */ - Index *pIdx; /* Pointer to the index object */ - int nSample; /* Number of samples */ - int nByte; /* Bytes of space required */ - int i; /* Bytes of space required */ - tRowcnt *pSpace; + char *zIndex; /* Index name */ + Index *pIdx; /* Pointer to the index object */ + int nSample; /* Number of samples */ + i64 nByte; /* Bytes of space required */ + i64 i; /* Bytes of space required */ + tRowcnt *pSpace; /* Available allocated memory space */ + u8 *pPtr; /* Available memory as a u8 for easier manipulation */ zIndex = (char *)sqlite3_column_text(pStmt, 0); if( zIndex==0 ) continue; @@ -116399,6 +120851,10 @@ static int loadStatTbl( pIdx = findIndexOrPrimaryKey(db, zIndex, zDb); assert( pIdx==0 || pIdx->nSample==0 ); if( pIdx==0 ) continue; + if( pIdx->aSample!=0 ){ + /* The same index appears in sqlite_stat4 under multiple names */ + continue; + } assert( !HasRowid(pIdx->pTable) || pIdx->nColumn==pIdx->nKeyCol+1 ); if( !HasRowid(pIdx->pTable) && IsPrimaryKeyIndex(pIdx) ){ nIdxCol = pIdx->nKeyCol; @@ -116406,7 +120862,8 @@ static int loadStatTbl( nIdxCol = pIdx->nColumn; } pIdx->nSampleCol = nIdxCol; - nByte = sizeof(IndexSample) * nSample; + pIdx->mxSample = nSample; + nByte = ROUND8(sizeof(IndexSample) * nSample); nByte += sizeof(tRowcnt) * nIdxCol * 3 * nSample; nByte += nIdxCol * sizeof(tRowcnt); /* Space for Index.aAvgEq[] */ @@ -116415,7 +120872,10 @@ static int loadStatTbl( sqlite3_finalize(pStmt); return SQLITE_NOMEM_BKPT; } - pSpace = (tRowcnt*)&pIdx->aSample[nSample]; + pPtr = (u8*)pIdx->aSample; + pPtr += ROUND8(nSample*sizeof(pIdx->aSample[0])); + pSpace = (tRowcnt*)pPtr; + assert( EIGHT_BYTE_ALIGNMENT( pSpace ) ); pIdx->aAvgEq = pSpace; pSpace += nIdxCol; pIdx->pTable->tabFlags |= TF_HasStat4; for(i=0; inSample>=pIdx->mxSample ){ + /* Too many slots used because the same index appears in + ** sqlite_stat4 using multiple names */ + continue; + } /* This next condition is true if data has already been loaded from ** the sqlite_stat4 table. */ nCol = pIdx->nSampleCol; @@ -116457,14 +120922,15 @@ static int loadStatTbl( decodeIntArray((char*)sqlite3_column_text(pStmt,2),nCol,pSample->anLt,0,0); decodeIntArray((char*)sqlite3_column_text(pStmt,3),nCol,pSample->anDLt,0,0); - /* Take a copy of the sample. Add two 0x00 bytes the end of the buffer. + /* Take a copy of the sample. Add 8 extra 0x00 bytes the end of the buffer. ** This is in case the sample record is corrupted. In that case, the ** sqlite3VdbeRecordCompare() may read up to two varints past the ** end of the allocated buffer before it realizes it is dealing with - ** a corrupt record. Adding the two 0x00 bytes prevents this from causing + ** a corrupt record. Or it might try to read a large integer from the + ** buffer. In any case, eight 0x00 bytes prevents this from causing ** a buffer overread. */ pSample->n = sqlite3_column_bytes(pStmt, 4); - pSample->p = sqlite3DbMallocZero(db, pSample->n + 2); + pSample->p = sqlite3DbMallocZero(db, pSample->n + 8); if( pSample->p==0 ){ sqlite3_finalize(pStmt); return SQLITE_NOMEM_BKPT; @@ -116488,11 +120954,12 @@ static int loadStat4(sqlite3 *db, const char *zDb){ const Table *pStat4; assert( db->lookaside.bDisable ); - if( (pStat4 = sqlite3FindTable(db, "sqlite_stat4", zDb))!=0 + if( OptimizationEnabled(db, SQLITE_Stat4) + && (pStat4 = sqlite3FindTable(db, "sqlite_stat4", zDb))!=0 && IsOrdinaryTable(pStat4) ){ rc = loadStatTbl(db, - "SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx", + "SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx COLLATE nocase", "SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4", zDb ); @@ -117076,20 +121543,21 @@ static int fixSelectCb(Walker *p, Select *pSelect){ if( NEVER(pList==0) ) return WRC_Continue; for(i=0, pItem=pList->a; inSrc; i++, pItem++){ - if( pFix->bTemp==0 ){ - if( pItem->zDatabase ){ - if( iDb!=sqlite3FindDbName(db, pItem->zDatabase) ){ + if( pFix->bTemp==0 && pItem->fg.isSubquery==0 ){ + if( pItem->fg.fixedSchema==0 && pItem->u4.zDatabase!=0 ){ + if( iDb!=sqlite3FindDbName(db, pItem->u4.zDatabase) ){ sqlite3ErrorMsg(pFix->pParse, "%s %T cannot reference objects in database %s", - pFix->zType, pFix->pName, pItem->zDatabase); + pFix->zType, pFix->pName, pItem->u4.zDatabase); return WRC_Abort; } - sqlite3DbFree(db, pItem->zDatabase); - pItem->zDatabase = 0; + sqlite3DbFree(db, pItem->u4.zDatabase); pItem->fg.notCte = 1; + pItem->fg.hadSchema = 1; } - pItem->pSchema = pFix->pSchema; + pItem->u4.pSchema = pFix->pSchema; pItem->fg.fromDDL = 1; + pItem->fg.fixedSchema = 1; } #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) if( pList->a[i].fg.isUsing==0 @@ -117382,7 +121850,7 @@ SQLITE_PRIVATE void sqlite3AuthRead( assert( pTabList ); for(iSrc=0; iSrcnSrc; iSrc++){ if( pExpr->iTable==pTabList->a[iSrc].iCursor ){ - pTab = pTabList->a[iSrc].pTab; + pTab = pTabList->a[iSrc].pSTab; break; } } @@ -117421,7 +121889,7 @@ SQLITE_PRIVATE int sqlite3AuthCheck( sqlite3 *db = pParse->db; int rc; - /* Don't do any authorization checks if the database is initialising + /* Don't do any authorization checks if the database is initializing ** or if the parser is being invoked from within sqlite3_declare_vtab. */ assert( !IN_RENAME_OBJECT || db->xAuth==0 ); @@ -117677,7 +122145,7 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ } sqlite3VdbeAddOp0(v, OP_Halt); -#if SQLITE_USER_AUTHENTICATION +#if SQLITE_USER_AUTHENTICATION && !defined(SQLITE_OMIT_SHARED_CACHE) if( pParse->nTableLock>0 && db->init.busy==0 ){ sqlite3UserAuthInit(db); if( db->auth.authLevelnVtabLock = 0; #endif +#ifndef SQLITE_OMIT_SHARED_CACHE /* Once all the cookies have been verified and transactions opened, ** obtain the required table-locks. This is a no-op unless the ** shared-cache feature is enabled. */ - codeTableLocks(pParse); + if( pParse->nTableLock ) codeTableLocks(pParse); +#endif /* Initialize any AUTOINCREMENT data structures required. */ - sqlite3AutoincrementBegin(pParse); + if( pParse->pAinc ) sqlite3AutoincrementBegin(pParse); - /* Code constant expressions that where factored out of inner loops. - ** - ** The pConstExpr list might also contain expressions that we simply - ** want to keep around until the Parse object is deleted. Such - ** expressions have iConstExprReg==0. Do not generate code for - ** those expressions, of course. + /* Code constant expressions that were factored out of inner loops. */ if( pParse->pConstExpr ){ ExprList *pEL = pParse->pConstExpr; pParse->okConstFactor = 0; for(i=0; inExpr; i++){ - int iReg = pEL->a[i].u.iConstExprReg; - sqlite3ExprCode(pParse, pEL->a[i].pExpr, iReg); + assert( pEL->a[i].u.iConstExprReg>0 ); + sqlite3ExprCode(pParse, pEL->a[i].pExpr, pEL->a[i].u.iConstExprReg); } } @@ -117988,12 +122453,12 @@ SQLITE_PRIVATE Table *sqlite3LocateTableItem( SrcItem *p ){ const char *zDb; - assert( p->pSchema==0 || p->zDatabase==0 ); - if( p->pSchema ){ - int iDb = sqlite3SchemaToIndex(pParse->db, p->pSchema); + if( p->fg.fixedSchema ){ + int iDb = sqlite3SchemaToIndex(pParse->db, p->u4.pSchema); zDb = pParse->db->aDb[iDb].zDbSName; }else{ - zDb = p->zDatabase; + assert( !p->fg.isSubquery ); + zDb = p->u4.zDatabase; } return sqlite3LocateTable(pParse, flags, p->zName, zDb); } @@ -118211,7 +122676,7 @@ SQLITE_PRIVATE void sqlite3ColumnSetExpr( */ SQLITE_PRIVATE Expr *sqlite3ColumnExpr(Table *pTab, Column *pCol){ if( pCol->iDflt==0 ) return 0; - if( NEVER(!IsOrdinaryTable(pTab)) ) return 0; + if( !IsOrdinaryTable(pTab) ) return 0; if( NEVER(pTab->u.tab.pDfltList==0) ) return 0; if( NEVER(pTab->u.tab.pDfltList->nExpriDflt) ) return 0; return pTab->u.tab.pDfltList->a[pCol->iDflt-1].pExpr; @@ -118243,7 +122708,7 @@ SQLITE_PRIVATE void sqlite3ColumnSetColl( } /* -** Return the collating squence name for a column +** Return the collating sequence name for a column */ SQLITE_PRIVATE const char *sqlite3ColumnColl(Column *pCol){ const char *z; @@ -118336,7 +122801,7 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){ if( IsOrdinaryTable(pTable) ){ sqlite3FkDelete(db, pTable); } -#ifndef SQLITE_OMIT_VIRTUAL_TABLE +#ifndef SQLITE_OMIT_VIRTUALTABLE else if( IsVirtual(pTable) ){ sqlite3VtabClear(db, pTable); } @@ -118364,6 +122829,9 @@ SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3 *db, Table *pTable){ if( db->pnBytesFreed==0 && (--pTable->nTabRef)>0 ) return; deleteTable(db, pTable); } +SQLITE_PRIVATE void sqlite3DeleteTableGeneric(sqlite3 *db, void *pTable){ + sqlite3DeleteTable(db, (Table*)pTable); +} /* @@ -118898,20 +123366,14 @@ SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table *pTab, Column *pCol){ } #endif -/* -** Name of the special TEMP trigger used to implement RETURNING. The -** name begins with "sqlite_" so that it is guaranteed not to collide -** with any application-generated triggers. -*/ -#define RETURNING_TRIGGER_NAME "sqlite_returning" - /* ** Clean up the data structures associated with the RETURNING clause. */ -static void sqlite3DeleteReturning(sqlite3 *db, Returning *pRet){ +static void sqlite3DeleteReturning(sqlite3 *db, void *pArg){ + Returning *pRet = (Returning*)pArg; Hash *pHash; pHash = &(db->aDb[1].pSchema->trigHash); - sqlite3HashInsert(pHash, RETURNING_TRIGGER_NAME, 0); + sqlite3HashInsert(pHash, pRet->zName, 0); sqlite3ExprListDelete(db, pRet->pReturnEL); sqlite3DbFree(db, pRet); } @@ -118950,11 +123412,12 @@ SQLITE_PRIVATE void sqlite3AddReturning(Parse *pParse, ExprList *pList){ pParse->u1.pReturning = pRet; pRet->pParse = pParse; pRet->pReturnEL = pList; - sqlite3ParserAddCleanup(pParse, - (void(*)(sqlite3*,void*))sqlite3DeleteReturning, pRet); + sqlite3ParserAddCleanup(pParse, sqlite3DeleteReturning, pRet); testcase( pParse->earlyCleanup ); if( db->mallocFailed ) return; - pRet->retTrig.zName = RETURNING_TRIGGER_NAME; + sqlite3_snprintf(sizeof(pRet->zName), pRet->zName, + "sqlite_returning_%p", pParse); + pRet->retTrig.zName = pRet->zName; pRet->retTrig.op = TK_RETURNING; pRet->retTrig.tr_tm = TRIGGER_AFTER; pRet->retTrig.bReturning = 1; @@ -118965,9 +123428,9 @@ SQLITE_PRIVATE void sqlite3AddReturning(Parse *pParse, ExprList *pList){ pRet->retTStep.pTrig = &pRet->retTrig; pRet->retTStep.pExprList = pList; pHash = &(db->aDb[1].pSchema->trigHash); - assert( sqlite3HashFind(pHash, RETURNING_TRIGGER_NAME)==0 + assert( sqlite3HashFind(pHash, pRet->zName)==0 || pParse->nErr || pParse->ifNotExists ); - if( sqlite3HashInsert(pHash, RETURNING_TRIGGER_NAME, &pRet->retTrig) + if( sqlite3HashInsert(pHash, pRet->zName, &pRet->retTrig) ==&pRet->retTrig ){ sqlite3OomFault(db); } @@ -119001,7 +123464,7 @@ SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){ } if( !IN_RENAME_OBJECT ) sqlite3DequoteToken(&sName); - /* Because keywords GENERATE ALWAYS can be converted into indentifiers + /* Because keywords GENERATE ALWAYS can be converted into identifiers ** by the parser, we can sometimes end up with a typename that ends ** with "generated always". Check for this case and omit the surplus ** text. */ @@ -119148,7 +123611,8 @@ SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn, Column *pCol){ assert( zIn!=0 ); while( zIn[0] ){ - h = (h<<8) + sqlite3UpperToLower[(*zIn)&0xff]; + u8 x = *(u8*)zIn; + h = (h<<8) + sqlite3UpperToLower[x]; zIn++; if( h==(('c'<<24)+('h'<<16)+('a'<<8)+'r') ){ /* CHAR */ aff = SQLITE_AFF_TEXT; @@ -119222,7 +123686,7 @@ SQLITE_PRIVATE void sqlite3AddDefaultValue( Parse *pParse, /* Parsing context */ Expr *pExpr, /* The parsed expression of the default value */ const char *zStart, /* Start of the default value text */ - const char *zEnd /* First character past end of defaut value text */ + const char *zEnd /* First character past end of default value text */ ){ Table *p; Column *pCol; @@ -119570,7 +124034,7 @@ static int identLength(const char *z){ ** to the specified offset in the buffer and updates *pIdx to refer ** to the first byte after the last byte written before returning. ** -** If the string zSignedIdent consists entirely of alpha-numeric +** If the string zSignedIdent consists entirely of alphanumeric ** characters, does not begin with a digit and is not an SQL keyword, ** then it is copied to the output buffer exactly as it is. Otherwise, ** it is quoted using double-quotes. @@ -119722,7 +124186,7 @@ static void estimateIndexWidth(Index *pIdx){ for(i=0; inColumn; i++){ i16 x = pIdx->aiColumn[i]; assert( xpTable->nCol ); - wIndex += x<0 ? 1 : aCol[pIdx->aiColumn[i]].szEst; + wIndex += x<0 ? 1 : aCol[x].szEst; } pIdx->szIdxRow = sqlite3LogEst(wIndex*4); } @@ -120320,20 +124784,20 @@ SQLITE_PRIVATE void sqlite3EndTable( int regRowid; /* Rowid of the next row to insert */ int addrInsLoop; /* Top of the loop for inserting rows */ Table *pSelTab; /* A table that describes the SELECT results */ + int iCsr; /* Write cursor on the new table */ if( IN_SPECIAL_PARSE ){ pParse->rc = SQLITE_ERROR; pParse->nErr++; return; } + iCsr = pParse->nTab++; regYield = ++pParse->nMem; regRec = ++pParse->nMem; regRowid = ++pParse->nMem; - assert(pParse->nTab==1); sqlite3MayAbort(pParse); - sqlite3VdbeAddOp3(v, OP_OpenWrite, 1, pParse->regRoot, iDb); + sqlite3VdbeAddOp3(v, OP_OpenWrite, iCsr, pParse->regRoot, iDb); sqlite3VdbeChangeP5(v, OPFLAG_P2ISREG); - pParse->nTab = 2; addrTop = sqlite3VdbeCurrentAddr(v) + 1; sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, addrTop); if( pParse->nErr ) return; @@ -120354,11 +124818,11 @@ SQLITE_PRIVATE void sqlite3EndTable( VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_MakeRecord, dest.iSdst, dest.nSdst, regRec); sqlite3TableAffinity(v, p, 0); - sqlite3VdbeAddOp2(v, OP_NewRowid, 1, regRowid); - sqlite3VdbeAddOp3(v, OP_Insert, 1, regRec, regRowid); + sqlite3VdbeAddOp2(v, OP_NewRowid, iCsr, regRowid); + sqlite3VdbeAddOp3(v, OP_Insert, iCsr, regRec, regRowid); sqlite3VdbeGoto(v, addrInsLoop); sqlite3VdbeJumpHere(v, addrInsLoop); - sqlite3VdbeAddOp1(v, OP_Close, 1); + sqlite3VdbeAddOp1(v, OP_Close, iCsr); } /* Compute the complete text of the CREATE statement */ @@ -120411,6 +124875,14 @@ SQLITE_PRIVATE void sqlite3EndTable( /* Reparse everything to update our internal data structures */ sqlite3VdbeAddParseSchemaOp(v, iDb, sqlite3MPrintf(db, "tbl_name='%q' AND type!='trigger'", p->zName),0); + + /* Test for cycles in generated columns and illegal expressions + ** in CHECK constraints and in DEFAULT clauses. */ + if( p->tabFlags & TF_HasGenerated ){ + sqlite3VdbeAddOp4(v, OP_SqlExec, 0x0001, 0, 0, + sqlite3MPrintf(db, "SELECT*FROM\"%w\".\"%w\"", + db->aDb[iDb].zDbSName, p->zName), P4_DYNAMIC); + } } /* Add the table to the in-memory representation of the database. @@ -120487,9 +124959,12 @@ SQLITE_PRIVATE void sqlite3CreateView( ** on a view, even though views do not have rowids. The following flag ** setting fixes this problem. But the fix can be disabled by compiling ** with -DSQLITE_ALLOW_ROWID_IN_VIEW in case there are legacy apps that - ** depend upon the old buggy behavior. */ -#ifndef SQLITE_ALLOW_ROWID_IN_VIEW - p->tabFlags |= TF_NoVisibleRowid; + ** depend upon the old buggy behavior. The ability can also be toggled + ** using sqlite3_config(SQLITE_CONFIG_ROWID_IN_VIEW,...) */ +#ifdef SQLITE_ALLOW_ROWID_IN_VIEW + p->tabFlags |= sqlite3Config.mNoVisibleRowid; /* Optional. Allow by default */ +#else + p->tabFlags |= TF_NoVisibleRowid; /* Never allow rowid in view */ #endif sqlite3TwoPartName(pParse, pName1, pName2, &pName); @@ -120545,8 +125020,9 @@ SQLITE_PRIVATE void sqlite3CreateView( #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) /* ** The Table structure pTable is really a VIEW. Fill in the names of -** the columns of the view in the pTable structure. Return the number -** of errors. If an error is seen leave an error message in pParse->zErrMsg. +** the columns of the view in the pTable structure. Return non-zero if +** there are errors. If an error is seen an error message is left +** in pParse->zErrMsg. */ static SQLITE_NOINLINE int viewGetColumnNames(Parse *pParse, Table *pTable){ Table *pSelTab; /* A fake table from which we get the result set */ @@ -120669,7 +125145,7 @@ static SQLITE_NOINLINE int viewGetColumnNames(Parse *pParse, Table *pTable){ sqlite3DeleteColumnNames(db, pTable); } #endif /* SQLITE_OMIT_VIEW */ - return nErr; + return nErr + pParse->nErr; } SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ assert( pTable!=0 ); @@ -120967,6 +125443,8 @@ SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, } assert( pParse->nErr==0 ); assert( pName->nSrc==1 ); + assert( pName->a[0].fg.fixedSchema==0 ); + assert( pName->a[0].fg.isSubquery==0 ); if( sqlite3ReadSchema(pParse) ) goto exit_drop_table; if( noErr ) db->suppressErr++; assert( isView==0 || isView==LOCATE_VIEW ); @@ -120975,7 +125453,7 @@ SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, if( pTab==0 ){ if( noErr ){ - sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].zDatabase); + sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].u4.zDatabase); sqlite3ForceNotReadOnly(pParse); } goto exit_drop_table; @@ -121460,7 +125938,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( #ifndef SQLITE_OMIT_TEMPDB /* If the index name was unqualified, check if the table ** is a temp table. If so, set the database to 1. Do not do this - ** if initialising a database schema. + ** if initializing a database schema. */ if( !db->init.busy ){ pTab = sqlite3SrcListLookup(pParse, pTblName); @@ -122066,15 +126544,17 @@ SQLITE_PRIVATE void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists } assert( pParse->nErr==0 ); /* Never called with prior non-OOM errors */ assert( pName->nSrc==1 ); + assert( pName->a[0].fg.fixedSchema==0 ); + assert( pName->a[0].fg.isSubquery==0 ); if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ goto exit_drop_index; } - pIndex = sqlite3FindIndex(db, pName->a[0].zName, pName->a[0].zDatabase); + pIndex = sqlite3FindIndex(db, pName->a[0].zName, pName->a[0].u4.zDatabase); if( pIndex==0 ){ if( !ifExists ){ sqlite3ErrorMsg(pParse, "no such index: %S", pName->a); }else{ - sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].zDatabase); + sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].u4.zDatabase); sqlite3ForceNotReadOnly(pParse); } pParse->checkSchema = 1; @@ -122371,12 +126851,14 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppend( if( pDatabase && pDatabase->z==0 ){ pDatabase = 0; } + assert( pItem->fg.fixedSchema==0 ); + assert( pItem->fg.isSubquery==0 ); if( pDatabase ){ pItem->zName = sqlite3NameFromToken(db, pDatabase); - pItem->zDatabase = sqlite3NameFromToken(db, pTable); + pItem->u4.zDatabase = sqlite3NameFromToken(db, pTable); }else{ pItem->zName = sqlite3NameFromToken(db, pTable); - pItem->zDatabase = 0; + pItem->u4.zDatabase = 0; } return pList; } @@ -122392,13 +126874,40 @@ SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){ for(i=0, pItem=pList->a; inSrc; i++, pItem++){ if( pItem->iCursor>=0 ) continue; pItem->iCursor = pParse->nTab++; - if( pItem->pSelect ){ - sqlite3SrcListAssignCursors(pParse, pItem->pSelect->pSrc); + if( pItem->fg.isSubquery ){ + assert( pItem->u4.pSubq!=0 ); + assert( pItem->u4.pSubq->pSelect!=0 ); + assert( pItem->u4.pSubq->pSelect->pSrc!=0 ); + sqlite3SrcListAssignCursors(pParse, pItem->u4.pSubq->pSelect->pSrc); } } } } +/* +** Delete a Subquery object and its substructure. +*/ +SQLITE_PRIVATE void sqlite3SubqueryDelete(sqlite3 *db, Subquery *pSubq){ + assert( pSubq!=0 && pSubq->pSelect!=0 ); + sqlite3SelectDelete(db, pSubq->pSelect); + sqlite3DbFree(db, pSubq); +} + +/* +** Remove a Subquery from a SrcItem. Return the associated Select object. +** The returned Select becomes the responsibility of the caller. +*/ +SQLITE_PRIVATE Select *sqlite3SubqueryDetach(sqlite3 *db, SrcItem *pItem){ + Select *pSel; + assert( pItem!=0 ); + assert( pItem->fg.isSubquery ); + pSel = pItem->u4.pSubq->pSelect; + sqlite3DbFree(db, pItem->u4.pSubq); + pItem->u4.pSubq = 0; + pItem->fg.isSubquery = 0; + return pSel; +} + /* ** Delete an entire SrcList including all its substructure. */ @@ -122408,13 +126917,24 @@ SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){ assert( db!=0 ); if( pList==0 ) return; for(pItem=pList->a, i=0; inSrc; i++, pItem++){ - if( pItem->zDatabase ) sqlite3DbNNFreeNN(db, pItem->zDatabase); + + /* Check invariants on SrcItem */ + assert( !pItem->fg.isIndexedBy || !pItem->fg.isTabFunc ); + assert( !pItem->fg.isCte || !pItem->fg.isIndexedBy ); + assert( !pItem->fg.fixedSchema || !pItem->fg.isSubquery ); + assert( !pItem->fg.isSubquery || (pItem->u4.pSubq!=0 && + pItem->u4.pSubq->pSelect!=0) ); + if( pItem->zName ) sqlite3DbNNFreeNN(db, pItem->zName); if( pItem->zAlias ) sqlite3DbNNFreeNN(db, pItem->zAlias); + if( pItem->fg.isSubquery ){ + sqlite3SubqueryDelete(db, pItem->u4.pSubq); + }else if( pItem->fg.fixedSchema==0 && pItem->u4.zDatabase!=0 ){ + sqlite3DbNNFreeNN(db, pItem->u4.zDatabase); + } if( pItem->fg.isIndexedBy ) sqlite3DbFree(db, pItem->u1.zIndexedBy); if( pItem->fg.isTabFunc ) sqlite3ExprListDelete(db, pItem->u1.pFuncArg); - sqlite3DeleteTable(db, pItem->pTab); - if( pItem->pSelect ) sqlite3SelectDelete(db, pItem->pSelect); + sqlite3DeleteTable(db, pItem->pSTab); if( pItem->fg.isUsing ){ sqlite3IdListDelete(db, pItem->u3.pUsing); }else if( pItem->u3.pOn ){ @@ -122424,6 +126944,54 @@ SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){ sqlite3DbNNFreeNN(db, pList); } +/* +** Attach a Subquery object to pItem->uv.pSubq. Set the +** pSelect value but leave all the other values initialized +** to zero. +** +** A copy of the Select object is made if dupSelect is true, and the +** SrcItem takes responsibility for deleting the copy. If dupSelect is +** false, ownership of the Select passes to the SrcItem. Either way, +** the SrcItem will take responsibility for deleting the Select. +** +** When dupSelect is zero, that means the Select might get deleted right +** away if there is an OOM error. Beware. +** +** Return non-zero on success. Return zero on an OOM error. +*/ +SQLITE_PRIVATE int sqlite3SrcItemAttachSubquery( + Parse *pParse, /* Parsing context */ + SrcItem *pItem, /* Item to which the subquery is to be attached */ + Select *pSelect, /* The subquery SELECT. Must be non-NULL */ + int dupSelect /* If true, attach a copy of pSelect, not pSelect itself.*/ +){ + Subquery *p; + assert( pSelect!=0 ); + assert( pItem->fg.isSubquery==0 ); + if( pItem->fg.fixedSchema ){ + pItem->u4.pSchema = 0; + pItem->fg.fixedSchema = 0; + }else if( pItem->u4.zDatabase!=0 ){ + sqlite3DbFree(pParse->db, pItem->u4.zDatabase); + pItem->u4.zDatabase = 0; + } + if( dupSelect ){ + pSelect = sqlite3SelectDup(pParse->db, pSelect, 0); + if( pSelect==0 ) return 0; + } + p = pItem->u4.pSubq = sqlite3DbMallocRawNN(pParse->db, sizeof(Subquery)); + if( p==0 ){ + sqlite3SelectDelete(pParse->db, pSelect); + return 0; + } + pItem->fg.isSubquery = 1; + p->pSelect = pSelect; + assert( offsetof(Subquery, pSelect)==0 ); + memset(((char*)p)+sizeof(p->pSelect), 0, sizeof(*p)-sizeof(p->pSelect)); + return 1; +} + + /* ** This routine is called by the parser to add a new term to the ** end of a growing FROM clause. The "p" parameter is the part of @@ -122473,10 +127041,12 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm( if( pAlias->n ){ pItem->zAlias = sqlite3NameFromToken(db, pAlias); } + assert( pSubquery==0 || pDatabase==0 ); if( pSubquery ){ - pItem->pSelect = pSubquery; - if( pSubquery->selFlags & SF_NestedFrom ){ - pItem->fg.isNestedFrom = 1; + if( sqlite3SrcItemAttachSubquery(pParse, pItem, pSubquery, 0) ){ + if( pSubquery->selFlags & SF_NestedFrom ){ + pItem->fg.isNestedFrom = 1; + } } } assert( pOnUsing==0 || pOnUsing->pOn==0 || pOnUsing->pUsing==0 ); @@ -123002,7 +127572,7 @@ SQLITE_PRIVATE void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){ if( iDb<0 ) return; z = sqlite3NameFromToken(db, pObjName); if( z==0 ) return; - zDb = db->aDb[iDb].zDbSName; + zDb = pName2->n ? db->aDb[iDb].zDbSName : 0; pTab = sqlite3FindTable(db, z, zDb); if( pTab ){ reindexTable(pParse, pTab, 0); @@ -123012,6 +127582,7 @@ SQLITE_PRIVATE void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){ pIndex = sqlite3FindIndex(db, z, zDb); sqlite3DbFree(db, z); if( pIndex ){ + iDb = sqlite3SchemaToIndex(db, pIndex->pTable->pSchema); sqlite3BeginWriteOperation(pParse, 0, iDb); sqlite3RefillIndex(pParse, pIndex, -1); return; @@ -123117,7 +127688,7 @@ SQLITE_PRIVATE void sqlite3CteDelete(sqlite3 *db, Cte *pCte){ /* ** This routine is invoked once per CTE by the parser while parsing a -** WITH clause. The CTE described by teh third argument is added to +** WITH clause. The CTE described by the third argument is added to ** the WITH clause of the second argument. If the second argument is ** NULL, then a new WITH argument is created. */ @@ -123177,6 +127748,9 @@ SQLITE_PRIVATE void sqlite3WithDelete(sqlite3 *db, With *pWith){ sqlite3DbFree(db, pWith); } } +SQLITE_PRIVATE void sqlite3WithDeleteGeneric(sqlite3 *db, void *pWith){ + sqlite3WithDelete(db, (With*)pWith); +} #endif /* !defined(SQLITE_OMIT_CTE) */ /************** End of build.c ***********************************************/ @@ -123368,6 +127942,7 @@ SQLITE_PRIVATE void sqlite3SetTextEncoding(sqlite3 *db, u8 enc){ ** strings is BINARY. */ db->pDfltColl = sqlite3FindCollSeq(db, enc, sqlite3StrBINARY, 0); + sqlite3ExpirePreparedStatements(db, 1); } /* @@ -123749,8 +128324,8 @@ SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){ ** ** The following fields are initialized appropriate in pSrc: ** -** pSrc->a[0].pTab Pointer to the Table object -** pSrc->a[0].pIndex Pointer to the INDEXED BY index, if there is one +** pSrc->a[0].spTab Pointer to the Table object +** pSrc->a[0].u2.pIBIndex Pointer to the INDEXED BY index, if there is one ** */ SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){ @@ -123758,8 +128333,9 @@ SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){ Table *pTab; assert( pItem && pSrc->nSrc>=1 ); pTab = sqlite3LocateTableItem(pParse, 0, pItem); - sqlite3DeleteTable(pParse->db, pItem->pTab); - pItem->pTab = pTab; + if( pItem->pSTab ) sqlite3DeleteTable(pParse->db, pItem->pSTab); + pItem->pSTab = pTab; + pItem->fg.notCte = 1; if( pTab ){ pTab->nTabRef++; if( pItem->fg.isIndexedBy && sqlite3IndexedByLookup(pParse, pItem) ){ @@ -123799,6 +128375,7 @@ SQLITE_PRIVATE void sqlite3CodeChangeCount(Vdbe *v, int regCounter, const char * ** is for a top-level SQL statement. */ static int vtabIsReadOnly(Parse *pParse, Table *pTab){ + assert( IsVirtual(pTab) ); if( sqlite3GetVTable(pParse->db, pTab)->pMod->pModule->xUpdate==0 ){ return 1; } @@ -123839,13 +128416,15 @@ static int tabIsReadOnly(Parse *pParse, Table *pTab){ ** If pTab is writable but other errors have occurred -> return 1. ** If pTab is writable and no prior errors -> return 0; */ -SQLITE_PRIVATE int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){ +SQLITE_PRIVATE int sqlite3IsReadOnly(Parse *pParse, Table *pTab, Trigger *pTrigger){ if( tabIsReadOnly(pParse, pTab) ){ sqlite3ErrorMsg(pParse, "table %s may not be modified", pTab->zName); return 1; } #ifndef SQLITE_OMIT_VIEW - if( !viewOk && IsView(pTab) ){ + if( IsView(pTab) + && (pTrigger==0 || (pTrigger->bReturning && pTrigger->pNext==0)) + ){ sqlite3ErrorMsg(pParse,"cannot modify %s because it is a view",pTab->zName); return 1; } @@ -123878,7 +128457,8 @@ SQLITE_PRIVATE void sqlite3MaterializeView( if( pFrom ){ assert( pFrom->nSrc==1 ); pFrom->a[0].zName = sqlite3DbStrDup(db, pView->zName); - pFrom->a[0].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zDbSName); + assert( pFrom->a[0].fg.fixedSchema==0 && pFrom->a[0].fg.isSubquery==0 ); + pFrom->a[0].u4.zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zDbSName); assert( pFrom->a[0].fg.isUsing==0 ); assert( pFrom->a[0].u3.pOn==0 ); } @@ -123910,7 +128490,7 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere( sqlite3 *db = pParse->db; Expr *pLhs = NULL; /* LHS of IN(SELECT...) operator */ Expr *pInClause = NULL; /* WHERE rowid IN ( select ) */ - ExprList *pEList = NULL; /* Expression list contaning only pSelectRowid */ + ExprList *pEList = NULL; /* Expression list containing only pSelectRowid*/ SrcList *pSelectSrc = NULL; /* SELECT rowid FROM x ... (dup of pSrc) */ Select *pSelect = NULL; /* Complete SELECT tree */ Table *pTab; @@ -123940,7 +128520,7 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere( ** ); */ - pTab = pSrc->a[0].pTab; + pTab = pSrc->a[0].pSTab; if( HasRowid(pTab) ){ pLhs = sqlite3PExpr(pParse, TK_ROW, 0, 0); pEList = sqlite3ExprListAppend( @@ -123948,14 +128528,20 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere( ); }else{ Index *pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); + assert( pPk->nKeyCol>=1 ); if( pPk->nKeyCol==1 ){ - const char *zName = pTab->aCol[pPk->aiColumn[0]].zCnName; + const char *zName; + assert( pPk->aiColumn[0]>=0 && pPk->aiColumn[0]nCol ); + zName = pTab->aCol[pPk->aiColumn[0]].zCnName; pLhs = sqlite3Expr(db, TK_ID, zName); pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ID, zName)); }else{ int i; for(i=0; inKeyCol; i++){ - Expr *p = sqlite3Expr(db, TK_ID, pTab->aCol[pPk->aiColumn[i]].zCnName); + Expr *p; + assert( pPk->aiColumn[i]>=0 && pPk->aiColumn[i]nCol ); + p = sqlite3Expr(db, TK_ID, pTab->aCol[pPk->aiColumn[i]].zCnName); pEList = sqlite3ExprListAppend(pParse, pEList, p); } pLhs = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); @@ -123967,9 +128553,9 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere( /* duplicate the FROM clause as it is needed by both the DELETE/UPDATE tree ** and the SELECT subtree. */ - pSrc->a[0].pTab = 0; + pSrc->a[0].pSTab = 0; pSelectSrc = sqlite3SrcListDup(db, pSrc, 0); - pSrc->a[0].pTab = pTab; + pSrc->a[0].pSTab = pTab; if( pSrc->a[0].fg.isIndexedBy ){ assert( pSrc->a[0].fg.isCte==0 ); pSrc->a[0].u2.pIBIndex = 0; @@ -123984,7 +128570,7 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere( pOrderBy,0,pLimit ); - /* now generate the new WHERE rowid IN clause for the DELETE/UDPATE */ + /* now generate the new WHERE rowid IN clause for the DELETE/UPDATE */ pInClause = sqlite3PExpr(pParse, TK_IN, pLhs, 0); sqlite3PExprAddSelect(pParse, pInClause, pSelect); return pInClause; @@ -124099,7 +128685,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( goto delete_from_cleanup; } - if( sqlite3IsReadOnly(pParse, pTab, (pTrigger?1:0)) ){ + if( sqlite3IsReadOnly(pParse, pTab, pTrigger) ){ goto delete_from_cleanup; } iDb = sqlite3SchemaToIndex(db, pTab->pSchema); @@ -124213,7 +128799,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( if( HasRowid(pTab) ){ /* For a rowid table, initialize the RowSet to an empty set */ pPk = 0; - nPk = 1; + assert( nPk==1 ); iRowSet = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_Null, 0, iRowSet); }else{ @@ -124241,7 +128827,8 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( if( pWInfo==0 ) goto delete_from_cleanup; eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); assert( IsVirtual(pTab)==0 || eOnePass!=ONEPASS_MULTI ); - assert( IsVirtual(pTab) || bComplex || eOnePass!=ONEPASS_OFF ); + assert( IsVirtual(pTab) || bComplex || eOnePass!=ONEPASS_OFF + || OptimizationDisabled(db, SQLITE_OnePass) ); if( eOnePass!=ONEPASS_SINGLE ) sqlite3MultiWrite(pParse); if( sqlite3WhereUsesDeferredSeek(pWInfo) ){ sqlite3VdbeAddOp1(v, OP_FinishSeek, iTabCur); @@ -124578,9 +129165,11 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( sqlite3FkActions(pParse, pTab, 0, iOld, 0, 0); /* Invoke AFTER DELETE trigger programs. */ - sqlite3CodeRowTrigger(pParse, pTrigger, - TK_DELETE, 0, TRIGGER_AFTER, pTab, iOld, onconf, iLabel - ); + if( pTrigger ){ + sqlite3CodeRowTrigger(pParse, pTrigger, + TK_DELETE, 0, TRIGGER_AFTER, pTab, iOld, onconf, iLabel + ); + } /* Jump here if the row had already been deleted before any BEFORE ** trigger programs were invoked. Or if a trigger program throws a @@ -124893,6 +129482,42 @@ static void lengthFunc( } } +/* +** Implementation of the octet_length() function +*/ +static void bytelengthFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + assert( argc==1 ); + UNUSED_PARAMETER(argc); + switch( sqlite3_value_type(argv[0]) ){ + case SQLITE_BLOB: { + sqlite3_result_int(context, sqlite3_value_bytes(argv[0])); + break; + } + case SQLITE_INTEGER: + case SQLITE_FLOAT: { + i64 m = sqlite3_context_db_handle(context)->enc<=SQLITE_UTF8 ? 1 : 2; + sqlite3_result_int64(context, sqlite3_value_bytes(argv[0])*m); + break; + } + case SQLITE_TEXT: { + if( sqlite3_value_encoding(argv[0])<=SQLITE_UTF8 ){ + sqlite3_result_int(context, sqlite3_value_bytes(argv[0])); + }else{ + sqlite3_result_int(context, sqlite3_value_bytes16(argv[0])); + } + break; + } + default: { + sqlite3_result_null(context); + break; + } + } +} + /* ** Implementation of the abs() function. ** @@ -125169,7 +129794,7 @@ static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ }else if( n==0 ){ r = (double)((sqlite_int64)(r+(r<0?-0.5:+0.5))); }else{ - zBuf = sqlite3_mprintf("%.*f",n,r); + zBuf = sqlite3_mprintf("%!.*f",n,r); if( zBuf==0 ){ sqlite3_result_error_nomem(context); return; @@ -125369,7 +129994,7 @@ struct compareInfo { /* ** For LIKE and GLOB matching on EBCDIC machines, assume that every -** character is exactly one byte in size. Also, provde the Utf8Read() +** character is exactly one byte in size. Also, provide the Utf8Read() ** macro for fast reading of the next character in the common case where ** the next character is ASCII. */ @@ -125602,7 +130227,7 @@ SQLITE_API int sqlite3_like_count = 0; /* ** Implementation of the like() SQL function. This function implements -** the build-in LIKE operator. The first argument to the function is the +** the built-in LIKE operator. The first argument to the function is the ** pattern and the second argument is the string. So, the SQL statements: ** ** A LIKE B @@ -125809,13 +130434,13 @@ SQLITE_PRIVATE void sqlite3QuoteValue(StrAccum *pStr, sqlite3_value *pValue){ double r1, r2; const char *zVal; r1 = sqlite3_value_double(pValue); - sqlite3_str_appendf(pStr, "%!.15g", r1); + sqlite3_str_appendf(pStr, "%!0.15g", r1); zVal = sqlite3_str_value(pStr); if( zVal ){ sqlite3AtoF(zVal, &r2, pStr->nChar, SQLITE_UTF8); if( r1!=r2 ){ sqlite3_str_reset(pStr); - sqlite3_str_appendf(pStr, "%!.20e", r1); + sqlite3_str_appendf(pStr, "%!0.20e", r1); } } break; @@ -125935,6 +130560,7 @@ static void charFunc( *zOut++ = 0x80 + (u8)(c & 0x3F); } \ } + *zOut = 0; sqlite3_result_text64(context, (char*)z, zOut-z, sqlite3_free, SQLITE_UTF8); } @@ -125963,7 +130589,8 @@ static void hexFunc( *(z++) = hexdigits[c&0xf]; } *z = 0; - sqlite3_result_text(context, zHex, n*2, sqlite3_free); + sqlite3_result_text64(context, zHex, (u64)(z-zHex), + sqlite3_free, SQLITE_UTF8); } } @@ -125988,7 +130615,7 @@ static int strContainsChar(const u8 *zStr, int nStr, u32 ch){ ** decoded and returned as a blob. ** ** If there is only a single argument, then it must consist only of an -** even number of hexadeximal digits. Otherwise, return NULL. +** even number of hexadecimal digits. Otherwise, return NULL. ** ** Or, if there is a second argument, then any character that appears in ** the second argument is also allowed to appear between pairs of hexadecimal @@ -126115,7 +130742,7 @@ static void replaceFunc( } if( zPattern[0]==0 ){ assert( sqlite3_value_type(argv[1])!=SQLITE_NULL ); - sqlite3_result_value(context, argv[0]); + sqlite3_result_text(context, (const char*)zStr, nStr, SQLITE_TRANSIENT); return; } nPattern = sqlite3_value_bytes(argv[1]); @@ -126257,12 +130884,87 @@ static void trimFunc( sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT); } +/* The core implementation of the CONCAT(...) and CONCAT_WS(SEP,...) +** functions. +** +** Return a string value that is the concatenation of all non-null +** entries in argv[]. Use zSep as the separator. +*/ +static void concatFuncCore( + sqlite3_context *context, + int argc, + sqlite3_value **argv, + int nSep, + const char *zSep +){ + i64 j, k, n = 0; + int i; + char *z; + for(i=0; i0 ){ + const char *v = (const char*)sqlite3_value_text(argv[i]); + if( v!=0 ){ + if( j>0 && nSep>0 ){ + memcpy(&z[j], zSep, nSep); + j += nSep; + } + memcpy(&z[j], v, k); + j += k; + } + } + } + z[j] = 0; + assert( j<=n ); + sqlite3_result_text64(context, z, j, sqlite3_free, SQLITE_UTF8); +} + +/* +** The CONCAT(...) function. Generate a string result that is the +** concatentation of all non-null arguments. +*/ +static void concatFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + concatFuncCore(context, argc, argv, 0, ""); +} + +/* +** The CONCAT_WS(separator, ...) function. +** +** Generate a string that is the concatenation of 2nd through the Nth +** argument. Use the first argument (which must be non-NULL) as the +** separator. +*/ +static void concatwsFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int nSep = sqlite3_value_bytes(argv[0]); + const char *zSep = (const char*)sqlite3_value_text(argv[0]); + if( zSep==0 ) return; + concatFuncCore(context, argc-1, argv+1, nSep, zSep); +} + #ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION /* ** The "unknown" function is automatically substituted in place of ** any unrecognized function name when doing an EXPLAIN or EXPLAIN QUERY PLAN -** when the SQLITE_ENABLE_UNKNOWN_FUNCTION compile-time option is used. +** when the SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION compile-time option is used. ** When the "sqlite3" command-line shell is built using this functionality, ** that allows an EXPLAIN or EXPLAIN QUERY PLAN for complex queries ** involving application-defined functions to be examined in a generic @@ -126378,13 +131080,68 @@ static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){ */ typedef struct SumCtx SumCtx; struct SumCtx { - double rSum; /* Floating point sum */ - i64 iSum; /* Integer sum */ + double rSum; /* Running sum as as a double */ + double rErr; /* Error term for Kahan-Babushka-Neumaier summation */ + i64 iSum; /* Running sum as a signed integer */ i64 cnt; /* Number of elements summed */ - u8 overflow; /* True if integer overflow seen */ - u8 approx; /* True if non-integer value was input to the sum */ + u8 approx; /* True if any non-integer value was input to the sum */ + u8 ovrfl; /* Integer overflow seen */ }; +/* +** Do one step of the Kahan-Babushka-Neumaier summation. +** +** https://en.wikipedia.org/wiki/Kahan_summation_algorithm +** +** Variables are marked "volatile" to defeat c89 x86 floating point +** optimizations can mess up this algorithm. +*/ +static void kahanBabuskaNeumaierStep( + volatile SumCtx *pSum, + volatile double r +){ + volatile double s = pSum->rSum; + volatile double t = s + r; + if( fabs(s) > fabs(r) ){ + pSum->rErr += (s - t) + r; + }else{ + pSum->rErr += (r - t) + s; + } + pSum->rSum = t; +} + +/* +** Add a (possibly large) integer to the running sum. +*/ +static void kahanBabuskaNeumaierStepInt64(volatile SumCtx *pSum, i64 iVal){ + if( iVal<=-4503599627370496LL || iVal>=+4503599627370496LL ){ + i64 iBig, iSm; + iSm = iVal % 16384; + iBig = iVal - iSm; + kahanBabuskaNeumaierStep(pSum, iBig); + kahanBabuskaNeumaierStep(pSum, iSm); + }else{ + kahanBabuskaNeumaierStep(pSum, (double)iVal); + } +} + +/* +** Initialize the Kahan-Babaska-Neumaier sum from a 64-bit integer +*/ +static void kahanBabuskaNeumaierInit( + volatile SumCtx *p, + i64 iVal +){ + if( iVal<=-4503599627370496LL || iVal>=+4503599627370496LL ){ + i64 iSm = iVal % 16384; + p->rSum = (double)(iVal - iSm); + p->rErr = (double)iSm; + }else{ + p->rSum = (double)iVal; + p->rErr = 0.0; + } +} + /* ** Routines used to compute the sum, average, and total. ** @@ -126404,15 +131161,29 @@ static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){ type = sqlite3_value_numeric_type(argv[0]); if( p && type!=SQLITE_NULL ){ p->cnt++; - if( type==SQLITE_INTEGER ){ - i64 v = sqlite3_value_int64(argv[0]); - p->rSum += v; - if( (p->approx|p->overflow)==0 && sqlite3AddInt64(&p->iSum, v) ){ - p->approx = p->overflow = 1; + if( p->approx==0 ){ + if( type!=SQLITE_INTEGER ){ + kahanBabuskaNeumaierInit(p, p->iSum); + p->approx = 1; + kahanBabuskaNeumaierStep(p, sqlite3_value_double(argv[0])); + }else{ + i64 x = p->iSum; + if( sqlite3AddInt64(&x, sqlite3_value_int64(argv[0]))==0 ){ + p->iSum = x; + }else{ + p->ovrfl = 1; + kahanBabuskaNeumaierInit(p, p->iSum); + p->approx = 1; + kahanBabuskaNeumaierStepInt64(p, sqlite3_value_int64(argv[0])); + } } }else{ - p->rSum += sqlite3_value_double(argv[0]); - p->approx = 1; + if( type==SQLITE_INTEGER ){ + kahanBabuskaNeumaierStepInt64(p, sqlite3_value_int64(argv[0])); + }else{ + p->ovrfl = 0; + kahanBabuskaNeumaierStep(p, sqlite3_value_double(argv[0])); + } } } } @@ -126429,13 +131200,18 @@ static void sumInverse(sqlite3_context *context, int argc, sqlite3_value**argv){ if( ALWAYS(p) && type!=SQLITE_NULL ){ assert( p->cnt>0 ); p->cnt--; - assert( type==SQLITE_INTEGER || p->approx ); - if( type==SQLITE_INTEGER && p->approx==0 ){ - i64 v = sqlite3_value_int64(argv[0]); - p->rSum -= v; - p->iSum -= v; + if( !p->approx ){ + p->iSum -= sqlite3_value_int64(argv[0]); + }else if( type==SQLITE_INTEGER ){ + i64 iVal = sqlite3_value_int64(argv[0]); + if( iVal!=SMALLEST_INT64 ){ + kahanBabuskaNeumaierStepInt64(p, -iVal); + }else{ + kahanBabuskaNeumaierStepInt64(p, LARGEST_INT64); + kahanBabuskaNeumaierStepInt64(p, 1); + } }else{ - p->rSum -= sqlite3_value_double(argv[0]); + kahanBabuskaNeumaierStep(p, -sqlite3_value_double(argv[0])); } } } @@ -126446,10 +131222,14 @@ static void sumFinalize(sqlite3_context *context){ SumCtx *p; p = sqlite3_aggregate_context(context, 0); if( p && p->cnt>0 ){ - if( p->overflow ){ - sqlite3_result_error(context,"integer overflow",-1); - }else if( p->approx ){ - sqlite3_result_double(context, p->rSum); + if( p->approx ){ + if( p->ovrfl ){ + sqlite3_result_error(context,"integer overflow",-1); + }else if( !sqlite3IsOverflow(p->rErr) ){ + sqlite3_result_double(context, p->rSum+p->rErr); + }else{ + sqlite3_result_double(context, p->rSum); + } }else{ sqlite3_result_int64(context, p->iSum); } @@ -126459,14 +131239,29 @@ static void avgFinalize(sqlite3_context *context){ SumCtx *p; p = sqlite3_aggregate_context(context, 0); if( p && p->cnt>0 ){ - sqlite3_result_double(context, p->rSum/(double)p->cnt); + double r; + if( p->approx ){ + r = p->rSum; + if( !sqlite3IsOverflow(p->rErr) ) r += p->rErr; + }else{ + r = (double)(p->iSum); + } + sqlite3_result_double(context, r/(double)p->cnt); } } static void totalFinalize(sqlite3_context *context){ SumCtx *p; + double r = 0.0; p = sqlite3_aggregate_context(context, 0); - /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ - sqlite3_result_double(context, p ? p->rSum : (double)0); + if( p ){ + if( p->approx ){ + r = p->rSum; + if( !sqlite3IsOverflow(p->rErr) ) r += p->rErr; + }else{ + r = (double)(p->iSum); + } + } + sqlite3_result_double(context, r); } /* @@ -126585,8 +131380,13 @@ static void minMaxFinalize(sqlite3_context *context){ /* ** group_concat(EXPR, ?SEPARATOR?) +** string_agg(EXPR, SEPARATOR) ** -** The SEPARATOR goes before the EXPR string. This is tragic. The +** Content is accumulated in GroupConcatCtx.str with the SEPARATOR +** coming before the EXPR value, except for the first entry which +** omits the SEPARATOR. +** +** It is tragic that the SEPARATOR goes before the EXPR string. The ** groupConcatInverse() implementation would have been easier if the ** SEPARATOR were appended after EXPR. And the order is undocumented, ** so we could change it, in theory. But the old behavior has been @@ -126688,9 +131488,9 @@ static void groupConcatInverse( if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; pGCC = (GroupConcatCtx*)sqlite3_aggregate_context(context, sizeof(*pGCC)); /* pGCC is always non-NULL since groupConcatStep() will have always - ** run frist to initialize it */ + ** run first to initialize it */ if( ALWAYS(pGCC) ){ - int nVS; + int nVS; /* Number of characters to remove */ /* Must call sqlite3_value_text() to convert the argument into text prior ** to invoking sqlite3_value_bytes(), in case the text encoding is UTF16 */ (void)sqlite3_value_text(argv[0]); @@ -126743,6 +131543,8 @@ static void groupConcatValue(sqlite3_context *context){ sqlite3_result_error_toobig(context); }else if( pAccum->accError==SQLITE_NOMEM ){ sqlite3_result_error_nomem(context); + }else if( pGCC->nAccum>0 && pAccum->nChar==0 ){ + sqlite3_result_text(context, "", 1, SQLITE_STATIC); }else{ const char *zText = sqlite3_str_value(pAccum); sqlite3_result_text(context, zText, pAccum->nChar, SQLITE_TRANSIENT); @@ -126772,8 +131574,10 @@ SQLITE_PRIVATE void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3 *db){ ** sensitive. */ SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){ + FuncDef *pDef; struct compareInfo *pInfo; int flags; + int nArg; if( caseSensitive ){ pInfo = (struct compareInfo*)&likeInfoAlt; flags = SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE; @@ -126781,10 +131585,13 @@ SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive) pInfo = (struct compareInfo*)&likeInfoNorm; flags = SQLITE_FUNC_LIKE; } - sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0, 0, 0); - sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0, 0, 0); - sqlite3FindFunction(db, "like", 2, SQLITE_UTF8, 0)->funcFlags |= flags; - sqlite3FindFunction(db, "like", 3, SQLITE_UTF8, 0)->funcFlags |= flags; + for(nArg=2; nArg<=3; nArg++){ + sqlite3CreateFunc(db, "like", nArg, SQLITE_UTF8, pInfo, likeFunc, + 0, 0, 0, 0, 0); + pDef = sqlite3FindFunction(db, "like", nArg, SQLITE_UTF8, 0); + pDef->funcFlags |= flags; + pDef->funcFlags &= ~SQLITE_FUNC_UNSAFE; + } } /* @@ -127056,6 +131863,120 @@ static void signFunc( sqlite3_result_int(context, x<0.0 ? -1 : x>0.0 ? +1 : 0); } +#ifdef SQLITE_DEBUG +/* +** Implementation of fpdecode(x,y,z) function. +** +** x is a real number that is to be decoded. y is the precision. +** z is the maximum real precision. Return a string that shows the +** results of the sqlite3FpDecode() function. +** +** Used for testing and debugging only, specifically testing and debugging +** of the sqlite3FpDecode() function. This SQL function does not appear +** in production builds. This function is not an API and is subject to +** modification or removal in future versions of SQLite. +*/ +static void fpdecodeFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + FpDecode s; + double x; + int y, z; + char zBuf[100]; + UNUSED_PARAMETER(argc); + assert( argc==3 ); + x = sqlite3_value_double(argv[0]); + y = sqlite3_value_int(argv[1]); + z = sqlite3_value_int(argv[2]); + if( z<=0 ) z = 1; + sqlite3FpDecode(&s, x, y, z); + if( s.isSpecial==2 ){ + sqlite3_snprintf(sizeof(zBuf), zBuf, "NaN"); + }else{ + sqlite3_snprintf(sizeof(zBuf), zBuf, "%c%.*s/%d", s.sign, s.n, s.z, s.iDP); + } + sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT); +} +#endif /* SQLITE_DEBUG */ + +#ifdef SQLITE_DEBUG +/* +** Implementation of parseuri(uri,flags) function. +** +** Required Arguments: +** "uri" The URI to parse. +** "flags" Bitmask of flags, as if to sqlite3_open_v2(). +** +** Additional arguments beyond the first two make calls to +** sqlite3_uri_key() for integers and sqlite3_uri_parameter for +** anything else. +** +** The result is a string showing the results of calling sqlite3ParseUri(). +** +** Used for testing and debugging only, specifically testing and debugging +** of the sqlite3ParseUri() function. This SQL function does not appear +** in production builds. This function is not an API and is subject to +** modification or removal in future versions of SQLite. +*/ +static void parseuriFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + sqlite3_str *pResult; + const char *zVfs; + const char *zUri; + unsigned int flgs; + int rc; + sqlite3_vfs *pVfs = 0; + char *zFile = 0; + char *zErr = 0; + + if( argc<2 ) return; + pVfs = sqlite3_vfs_find(0); + assert( pVfs ); + zVfs = pVfs->zName; + zUri = (const char*)sqlite3_value_text(argv[0]); + if( zUri==0 ) return; + flgs = (unsigned int)sqlite3_value_int(argv[1]); + rc = sqlite3ParseUri(zVfs, zUri, &flgs, &pVfs, &zFile, &zErr); + pResult = sqlite3_str_new(0); + if( pResult ){ + int i; + sqlite3_str_appendf(pResult, "rc=%d", rc); + sqlite3_str_appendf(pResult, ", flags=0x%x", flgs); + sqlite3_str_appendf(pResult, ", vfs=%Q", pVfs ? pVfs->zName: 0); + sqlite3_str_appendf(pResult, ", err=%Q", zErr); + sqlite3_str_appendf(pResult, ", file=%Q", zFile); + if( zFile ){ + const char *z = zFile; + z += sqlite3Strlen30(z)+1; + while( z[0] ){ + sqlite3_str_appendf(pResult, ", %Q", z); + z += sqlite3Strlen30(z)+1; + } + for(i=2; iapTrigger[0] && pFKey->aAction[0]==OE_SetNull) || (p==pFKey->apTrigger[1] && pFKey->aAction[1]==OE_SetNull) ){ + assert( (pTop->db->flags & SQLITE_FkNoAction)==0 ); return 1; } } @@ -128290,9 +133225,9 @@ SQLITE_PRIVATE void sqlite3FkCheck( pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( pSrc ){ SrcItem *pItem = pSrc->a; - pItem->pTab = pFKey->pFrom; + pItem->pSTab = pFKey->pFrom; pItem->zName = pFKey->pFrom->zName; - pItem->pTab->nTabRef++; + pItem->pSTab->nTabRef++; pItem->iCursor = pParse->nTab++; if( regNew!=0 ){ @@ -128300,6 +133235,8 @@ SQLITE_PRIVATE void sqlite3FkCheck( } if( regOld!=0 ){ int eAction = pFKey->aAction[aChange!=0]; + if( (db->flags & SQLITE_FkNoAction) ) eAction = OE_None; + fkScanChildren(pParse, pSrc, pTab, pIdx, pFKey, aiCol, regOld, 1); /* If this is a deferred FK constraint, or a CASCADE or SET NULL ** action applies, then any foreign key violations caused by @@ -128415,7 +133352,11 @@ SQLITE_PRIVATE int sqlite3FkRequired( /* Check if any parent key columns are being modified. */ for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){ if( fkParentIsModified(pTab, p, aChange, chngRowid) ){ - if( p->aAction[1]!=OE_None ) return 2; + if( (pParse->db->flags & SQLITE_FkNoAction)==0 + && p->aAction[1]!=OE_None + ){ + return 2; + } bHaveFK = 1; } } @@ -128465,6 +133406,7 @@ static Trigger *fkActionTrigger( int iAction = (pChanges!=0); /* 1 for UPDATE, 0 for DELETE */ action = pFKey->aAction[iAction]; + if( (db->flags & SQLITE_FkNoAction) ) action = OE_None; if( action==OE_Restrict && (db->flags & SQLITE_DeferFKs) ){ return 0; } @@ -128565,22 +133507,24 @@ static Trigger *fkActionTrigger( if( action==OE_Restrict ){ int iDb = sqlite3SchemaToIndex(db, pTab->pSchema); - Token tFrom; - Token tDb; + SrcList *pSrc; Expr *pRaise; - tFrom.z = zFrom; - tFrom.n = nFrom; - tDb.z = db->aDb[iDb].zDbSName; - tDb.n = sqlite3Strlen30(tDb.z); - - pRaise = sqlite3Expr(db, TK_RAISE, "FOREIGN KEY constraint failed"); + pRaise = sqlite3Expr(db, TK_STRING, "FOREIGN KEY constraint failed"), + pRaise = sqlite3PExpr(pParse, TK_RAISE, pRaise, 0); if( pRaise ){ pRaise->affExpr = OE_Abort; } + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); + if( pSrc ){ + assert( pSrc->nSrc==1 ); + pSrc->a[0].zName = sqlite3DbStrDup(db, zFrom); + assert( pSrc->a[0].fg.fixedSchema==0 && pSrc->a[0].fg.isSubquery==0 ); + pSrc->a[0].u4.zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zDbSName); + } pSelect = sqlite3SelectNew(pParse, sqlite3ExprListAppend(pParse, 0, pRaise), - sqlite3SrcListAppend(pParse, 0, &tDb, &tFrom), + pSrc, pWhere, 0, 0, 0, 0, 0 ); @@ -128696,9 +133640,8 @@ SQLITE_PRIVATE void sqlite3FkDelete(sqlite3 *db, Table *pTab){ if( pFKey->pPrevTo ){ pFKey->pPrevTo->pNextTo = pFKey->pNextTo; }else{ - void *p = (void *)pFKey->pNextTo; - const char *z = (p ? pFKey->pNextTo->zTo : pFKey->zTo); - sqlite3HashInsert(&pTab->pSchema->fkeyHash, z, p); + const char *z = (pFKey->pNextTo ? pFKey->pNextTo->zTo : pFKey->zTo); + sqlite3HashInsert(&pTab->pSchema->fkeyHash, z, pFKey->pNextTo); } if( pFKey->pNextTo ){ pFKey->pNextTo->pPrevTo = pFKey->pPrevTo; @@ -128761,8 +133704,10 @@ SQLITE_PRIVATE void sqlite3OpenTable( assert( pParse->pVdbe!=0 ); v = pParse->pVdbe; assert( opcode==OP_OpenWrite || opcode==OP_OpenRead ); - sqlite3TableLock(pParse, iDb, pTab->tnum, - (opcode==OP_OpenWrite)?1:0, pTab->zName); + if( !pParse->db->noSharedCache ){ + sqlite3TableLock(pParse, iDb, pTab->tnum, + (opcode==OP_OpenWrite)?1:0, pTab->zName); + } if( HasRowid(pTab) ){ sqlite3VdbeAddOp4Int(v, opcode, iCur, pTab->tnum, iDb, pTab->nNVCol); VdbeComment((v, "%s", pTab->zName)); @@ -128796,46 +133741,48 @@ SQLITE_PRIVATE void sqlite3OpenTable( ** is managed along with the rest of the Index structure. It will be ** released when sqlite3DeleteIndex() is called. */ -SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ +static SQLITE_NOINLINE const char *computeIndexAffStr(sqlite3 *db, Index *pIdx){ + /* The first time a column affinity string for a particular index is + ** required, it is allocated and populated here. It is then stored as + ** a member of the Index structure for subsequent use. + ** + ** The column affinity string will eventually be deleted by + ** sqliteDeleteIndex() when the Index structure itself is cleaned + ** up. + */ + int n; + Table *pTab = pIdx->pTable; + pIdx->zColAff = (char *)sqlite3DbMallocRaw(0, pIdx->nColumn+1); if( !pIdx->zColAff ){ - /* The first time a column affinity string for a particular index is - ** required, it is allocated and populated here. It is then stored as - ** a member of the Index structure for subsequent use. - ** - ** The column affinity string will eventually be deleted by - ** sqliteDeleteIndex() when the Index structure itself is cleaned - ** up. - */ - int n; - Table *pTab = pIdx->pTable; - pIdx->zColAff = (char *)sqlite3DbMallocRaw(0, pIdx->nColumn+1); - if( !pIdx->zColAff ){ - sqlite3OomFault(db); - return 0; - } - for(n=0; nnColumn; n++){ - i16 x = pIdx->aiColumn[n]; - char aff; - if( x>=0 ){ - aff = pTab->aCol[x].affinity; - }else if( x==XN_ROWID ){ - aff = SQLITE_AFF_INTEGER; - }else{ - assert( x==XN_EXPR ); - assert( pIdx->bHasExpr ); - assert( pIdx->aColExpr!=0 ); - aff = sqlite3ExprAffinity(pIdx->aColExpr->a[n].pExpr); - } - if( affSQLITE_AFF_NUMERIC) aff = SQLITE_AFF_NUMERIC; - pIdx->zColAff[n] = aff; + sqlite3OomFault(db); + return 0; + } + for(n=0; nnColumn; n++){ + i16 x = pIdx->aiColumn[n]; + char aff; + if( x>=0 ){ + aff = pTab->aCol[x].affinity; + }else if( x==XN_ROWID ){ + aff = SQLITE_AFF_INTEGER; + }else{ + assert( x==XN_EXPR ); + assert( pIdx->bHasExpr ); + assert( pIdx->aColExpr!=0 ); + aff = sqlite3ExprAffinity(pIdx->aColExpr->a[n].pExpr); } - pIdx->zColAff[n] = 0; + if( affSQLITE_AFF_NUMERIC) aff = SQLITE_AFF_NUMERIC; + pIdx->zColAff[n] = aff; } - + pIdx->zColAff[n] = 0; + return pIdx->zColAff; +} +SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ + if( !pIdx->zColAff ) return computeIndexAffStr(db, pIdx); return pIdx->zColAff; } + /* ** Compute an affinity string for a table. Space is obtained ** from sqlite3DbMalloc(). The caller is responsible for freeing @@ -128889,7 +133836,7 @@ SQLITE_PRIVATE char *sqlite3TableAffinityStr(sqlite3 *db, const Table *pTab){ ** For STRICT tables: ** ------------------ ** -** Generate an appropropriate OP_TypeCheck opcode that will verify the +** Generate an appropriate OP_TypeCheck opcode that will verify the ** datatypes against the column definitions in pTab. If iReg==0, that ** means an OP_MakeRecord opcode has already been generated and should be ** the last opcode generated. The new OP_TypeCheck needs to be inserted @@ -129299,6 +134246,210 @@ SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse){ # define autoIncStep(A,B,C) #endif /* SQLITE_OMIT_AUTOINCREMENT */ +/* +** If argument pVal is a Select object returned by an sqlite3MultiValues() +** that was able to use the co-routine optimization, finish coding the +** co-routine. +*/ +SQLITE_PRIVATE void sqlite3MultiValuesEnd(Parse *pParse, Select *pVal){ + if( ALWAYS(pVal) && pVal->pSrc->nSrc>0 ){ + SrcItem *pItem = &pVal->pSrc->a[0]; + assert( (pItem->fg.isSubquery && pItem->u4.pSubq!=0) || pParse->nErr ); + if( pItem->fg.isSubquery ){ + sqlite3VdbeEndCoroutine(pParse->pVdbe, pItem->u4.pSubq->regReturn); + sqlite3VdbeJumpHere(pParse->pVdbe, pItem->u4.pSubq->addrFillSub - 1); + } + } +} + +/* +** Return true if all expressions in the expression-list passed as the +** only argument are constant. +*/ +static int exprListIsConstant(Parse *pParse, ExprList *pRow){ + int ii; + for(ii=0; iinExpr; ii++){ + if( 0==sqlite3ExprIsConstant(pParse, pRow->a[ii].pExpr) ) return 0; + } + return 1; +} + +/* +** Return true if all expressions in the expression-list passed as the +** only argument are both constant and have no affinity. +*/ +static int exprListIsNoAffinity(Parse *pParse, ExprList *pRow){ + int ii; + if( exprListIsConstant(pParse,pRow)==0 ) return 0; + for(ii=0; iinExpr; ii++){ + Expr *pExpr = pRow->a[ii].pExpr; + assert( pExpr->op!=TK_RAISE ); + assert( pExpr->affExpr==0 ); + if( 0!=sqlite3ExprAffinity(pExpr) ) return 0; + } + return 1; + +} + +/* +** This function is called by the parser for the second and subsequent +** rows of a multi-row VALUES clause. Argument pLeft is the part of +** the VALUES clause already parsed, argument pRow is the vector of values +** for the new row. The Select object returned represents the complete +** VALUES clause, including the new row. +** +** There are two ways in which this may be achieved - by incremental +** coding of a co-routine (the "co-routine" method) or by returning a +** Select object equivalent to the following (the "UNION ALL" method): +** +** "pLeft UNION ALL SELECT pRow" +** +** If the VALUES clause contains a lot of rows, this compound Select +** object may consume a lot of memory. +** +** When the co-routine method is used, each row that will be returned +** by the VALUES clause is coded into part of a co-routine as it is +** passed to this function. The returned Select object is equivalent to: +** +** SELECT * FROM ( +** Select object to read co-routine +** ) +** +** The co-routine method is used in most cases. Exceptions are: +** +** a) If the current statement has a WITH clause. This is to avoid +** statements like: +** +** WITH cte AS ( VALUES('x'), ('y') ... ) +** SELECT * FROM cte AS a, cte AS b; +** +** This will not work, as the co-routine uses a hard-coded register +** for its OP_Yield instructions, and so it is not possible for two +** cursors to iterate through it concurrently. +** +** b) The schema is currently being parsed (i.e. the VALUES clause is part +** of a schema item like a VIEW or TRIGGER). In this case there is no VM +** being generated when parsing is taking place, and so generating +** a co-routine is not possible. +** +** c) There are non-constant expressions in the VALUES clause (e.g. +** the VALUES clause is part of a correlated sub-query). +** +** d) One or more of the values in the first row of the VALUES clause +** has an affinity (i.e. is a CAST expression). This causes problems +** because the complex rules SQLite uses (see function +** sqlite3SubqueryColumnTypes() in select.c) to determine the effective +** affinity of such a column for all rows require access to all values in +** the column simultaneously. +*/ +SQLITE_PRIVATE Select *sqlite3MultiValues(Parse *pParse, Select *pLeft, ExprList *pRow){ + + if( pParse->bHasWith /* condition (a) above */ + || pParse->db->init.busy /* condition (b) above */ + || exprListIsConstant(pParse,pRow)==0 /* condition (c) above */ + || (pLeft->pSrc->nSrc==0 && + exprListIsNoAffinity(pParse,pLeft->pEList)==0) /* condition (d) above */ + || IN_SPECIAL_PARSE + ){ + /* The co-routine method cannot be used. Fall back to UNION ALL. */ + Select *pSelect = 0; + int f = SF_Values | SF_MultiValue; + if( pLeft->pSrc->nSrc ){ + sqlite3MultiValuesEnd(pParse, pLeft); + f = SF_Values; + }else if( pLeft->pPrior ){ + /* In this case set the SF_MultiValue flag only if it was set on pLeft */ + f = (f & pLeft->selFlags); + } + pSelect = sqlite3SelectNew(pParse, pRow, 0, 0, 0, 0, 0, f, 0); + pLeft->selFlags &= ~SF_MultiValue; + if( pSelect ){ + pSelect->op = TK_ALL; + pSelect->pPrior = pLeft; + pLeft = pSelect; + } + }else{ + SrcItem *p = 0; /* SrcItem that reads from co-routine */ + + if( pLeft->pSrc->nSrc==0 ){ + /* Co-routine has not yet been started and the special Select object + ** that accesses the co-routine has not yet been created. This block + ** does both those things. */ + Vdbe *v = sqlite3GetVdbe(pParse); + Select *pRet = sqlite3SelectNew(pParse, 0, 0, 0, 0, 0, 0, 0, 0); + + /* Ensure the database schema has been read. This is to ensure we have + ** the correct text encoding. */ + if( (pParse->db->mDbFlags & DBFLAG_SchemaKnownOk)==0 ){ + sqlite3ReadSchema(pParse); + } + + if( pRet ){ + SelectDest dest; + Subquery *pSubq; + pRet->pSrc->nSrc = 1; + pRet->pPrior = pLeft->pPrior; + pRet->op = pLeft->op; + if( pRet->pPrior ) pRet->selFlags |= SF_Values; + pLeft->pPrior = 0; + pLeft->op = TK_SELECT; + assert( pLeft->pNext==0 ); + assert( pRet->pNext==0 ); + p = &pRet->pSrc->a[0]; + p->fg.viaCoroutine = 1; + p->iCursor = -1; + assert( !p->fg.isIndexedBy && !p->fg.isTabFunc ); + p->u1.nRow = 2; + if( sqlite3SrcItemAttachSubquery(pParse, p, pLeft, 0) ){ + pSubq = p->u4.pSubq; + pSubq->addrFillSub = sqlite3VdbeCurrentAddr(v) + 1; + pSubq->regReturn = ++pParse->nMem; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, + pSubq->regReturn, 0, pSubq->addrFillSub); + sqlite3SelectDestInit(&dest, SRT_Coroutine, pSubq->regReturn); + + /* Allocate registers for the output of the co-routine. Do so so + ** that there are two unused registers immediately before those + ** used by the co-routine. This allows the code in sqlite3Insert() + ** to use these registers directly, instead of copying the output + ** of the co-routine to a separate array for processing. */ + dest.iSdst = pParse->nMem + 3; + dest.nSdst = pLeft->pEList->nExpr; + pParse->nMem += 2 + dest.nSdst; + + pLeft->selFlags |= SF_MultiValue; + sqlite3Select(pParse, pLeft, &dest); + pSubq->regResult = dest.iSdst; + assert( pParse->nErr || dest.iSdst>0 ); + } + pLeft = pRet; + } + }else{ + p = &pLeft->pSrc->a[0]; + assert( !p->fg.isTabFunc && !p->fg.isIndexedBy ); + p->u1.nRow++; + } + + if( pParse->nErr==0 ){ + Subquery *pSubq; + assert( p!=0 ); + assert( p->fg.isSubquery ); + pSubq = p->u4.pSubq; + assert( pSubq!=0 ); + assert( pSubq->pSelect!=0 ); + assert( pSubq->pSelect->pEList!=0 ); + if( pSubq->pSelect->pEList->nExpr!=pRow->nExpr ){ + sqlite3SelectWrongNumTermsError(pParse, pSubq->pSelect); + }else{ + sqlite3ExprCodeExprList(pParse, pRow, pSubq->regResult, 0, 0); + sqlite3VdbeAddOp1(pParse->pVdbe, OP_Yield, pSubq->regReturn); + } + } + sqlite3ExprListDelete(pParse->db, pRow); + } + + return pLeft; +} /* Forward declaration */ static int xferOptimization( @@ -129520,7 +134671,7 @@ SQLITE_PRIVATE void sqlite3Insert( /* Cannot insert into a read-only table. */ - if( sqlite3IsReadOnly(pParse, pTab, tmask) ){ + if( sqlite3IsReadOnly(pParse, pTab, pTrigger) ){ goto insert_cleanup; } @@ -129635,25 +134786,45 @@ SQLITE_PRIVATE void sqlite3Insert( if( pSelect ){ /* Data is coming from a SELECT or from a multi-row VALUES clause. ** Generate a co-routine to run the SELECT. */ - int regYield; /* Register holding co-routine entry-point */ - int addrTop; /* Top of the co-routine */ int rc; /* Result code */ - regYield = ++pParse->nMem; - addrTop = sqlite3VdbeCurrentAddr(v) + 1; - sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, addrTop); - sqlite3SelectDestInit(&dest, SRT_Coroutine, regYield); - dest.iSdst = bIdListInOrder ? regData : 0; - dest.nSdst = pTab->nCol; - rc = sqlite3Select(pParse, pSelect, &dest); - regFromSelect = dest.iSdst; - assert( db->pParse==pParse ); - if( rc || pParse->nErr ) goto insert_cleanup; - assert( db->mallocFailed==0 ); - sqlite3VdbeEndCoroutine(v, regYield); - sqlite3VdbeJumpHere(v, addrTop - 1); /* label B: */ - assert( pSelect->pEList ); - nColumn = pSelect->pEList->nExpr; + if( pSelect->pSrc->nSrc==1 + && pSelect->pSrc->a[0].fg.viaCoroutine + && pSelect->pPrior==0 + ){ + SrcItem *pItem = &pSelect->pSrc->a[0]; + Subquery *pSubq; + assert( pItem->fg.isSubquery ); + pSubq = pItem->u4.pSubq; + dest.iSDParm = pSubq->regReturn; + regFromSelect = pSubq->regResult; + assert( pSubq->pSelect!=0 ); + assert( pSubq->pSelect->pEList!=0 ); + nColumn = pSubq->pSelect->pEList->nExpr; + ExplainQueryPlan((pParse, 0, "SCAN %S", pItem)); + if( bIdListInOrder && nColumn==pTab->nCol ){ + regData = regFromSelect; + regRowid = regData - 1; + regIns = regRowid - (IsVirtual(pTab) ? 1 : 0); + } + }else{ + int addrTop; /* Top of the co-routine */ + int regYield = ++pParse->nMem; + addrTop = sqlite3VdbeCurrentAddr(v) + 1; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, addrTop); + sqlite3SelectDestInit(&dest, SRT_Coroutine, regYield); + dest.iSdst = bIdListInOrder ? regData : 0; + dest.nSdst = pTab->nCol; + rc = sqlite3Select(pParse, pSelect, &dest); + regFromSelect = dest.iSdst; + assert( db->pParse==pParse ); + if( rc || pParse->nErr ) goto insert_cleanup; + assert( db->mallocFailed==0 ); + sqlite3VdbeEndCoroutine(v, regYield); + sqlite3VdbeJumpHere(v, addrTop - 1); /* label B: */ + assert( pSelect->pEList ); + nColumn = pSelect->pEList->nExpr; + } /* Set useTempTable to TRUE if the result of the SELECT statement ** should be written into a temporary table (template 4). Set to @@ -129808,7 +134979,7 @@ SQLITE_PRIVATE void sqlite3Insert( pNx->iDataCur = iDataCur; pNx->iIdxCur = iIdxCur; if( pNx->pUpsertTarget ){ - if( sqlite3UpsertAnalyzeTarget(pParse, pTabList, pNx) ){ + if( sqlite3UpsertAnalyzeTarget(pParse, pTabList, pNx, pUpsert) ){ goto insert_cleanup; } } @@ -129967,7 +135138,7 @@ SQLITE_PRIVATE void sqlite3Insert( } /* Copy the new data already generated. */ - assert( pTab->nNVCol>0 ); + assert( pTab->nNVCol>0 || pParse->nErr>0 ); sqlite3VdbeAddOp3(v, OP_Copy, regRowid+1, regCols+1, pTab->nNVCol-1); #ifndef SQLITE_OMIT_GENERATED_COLUMNS @@ -130181,7 +135352,7 @@ SQLITE_PRIVATE void sqlite3Insert( /* This is the Walker callback from sqlite3ExprReferencesUpdatedColumn(). * Set bit 0x01 of pWalker->eCode if pWalker->eCode to 0 and if this ** expression node references any of the -** columns that are being modifed by an UPDATE statement. +** columns that are being modified by an UPDATE statement. */ static int checkConstraintExprNode(Walker *pWalker, Expr *pExpr){ if( pExpr->op==TK_COLUMN ){ @@ -130404,7 +135575,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( int *aiChng, /* column i is unchanged if aiChng[i]<0 */ Upsert *pUpsert /* ON CONFLICT clauses, if any. NULL otherwise */ ){ - Vdbe *v; /* VDBE under constrution */ + Vdbe *v; /* VDBE under construction */ Index *pIdx; /* Pointer to one of the indices */ Index *pPk = 0; /* The PRIMARY KEY index for WITHOUT ROWID tables */ sqlite3 *db; /* Database connection */ @@ -130887,7 +136058,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( pIdx; pIdx = indexIteratorNext(&sIdxIter, &ix) ){ - int regIdx; /* Range of registers hold conent for pIdx */ + int regIdx; /* Range of registers holding content for pIdx */ int regR; /* Range of registers holding conflicting PK */ int iThisCur; /* Cursor for this UNIQUE index */ int addrUniqueOk; /* Jump here if the UNIQUE constraint is satisfied */ @@ -131382,6 +136553,8 @@ SQLITE_PRIVATE int sqlite3OpenTableAndIndices( assert( op==OP_OpenRead || op==OP_OpenWrite ); assert( op==OP_OpenWrite || p5==0 ); + assert( piDataCur!=0 ); + assert( piIdxCur!=0 ); if( IsVirtual(pTab) ){ /* This routine is a no-op for virtual tables. Leave the output ** variables *piDataCur and *piIdxCur set to illegal cursor numbers @@ -131394,18 +136567,18 @@ SQLITE_PRIVATE int sqlite3OpenTableAndIndices( assert( v!=0 ); if( iBase<0 ) iBase = pParse->nTab; iDataCur = iBase++; - if( piDataCur ) *piDataCur = iDataCur; + *piDataCur = iDataCur; if( HasRowid(pTab) && (aToOpen==0 || aToOpen[0]) ){ sqlite3OpenTable(pParse, iDataCur, iDb, pTab, op); - }else{ + }else if( pParse->db->noSharedCache==0 ){ sqlite3TableLock(pParse, iDb, pTab->tnum, op==OP_OpenWrite, pTab->zName); } - if( piIdxCur ) *piIdxCur = iBase; + *piIdxCur = iBase; for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ int iIdxCur = iBase++; assert( pIdx->pSchema==pTab->pSchema ); if( IsPrimaryKeyIndex(pIdx) && !HasRowid(pTab) ){ - if( piDataCur ) *piDataCur = iIdxCur; + *piDataCur = iIdxCur; p5 = 0; } if( aToOpen==0 || aToOpen[i+1] ){ @@ -131547,7 +136720,7 @@ static int xferOptimization( if( pSelect->pSrc->nSrc!=1 ){ return 0; /* FROM clause must have exactly one term */ } - if( pSelect->pSrc->a[0].pSelect ){ + if( pSelect->pSrc->a[0].fg.isSubquery ){ return 0; /* FROM clause cannot contain a subquery */ } if( pSelect->pWhere ){ @@ -131698,12 +136871,15 @@ static int xferOptimization( } } #ifndef SQLITE_OMIT_CHECK - if( pDest->pCheck && sqlite3ExprListCompare(pSrc->pCheck,pDest->pCheck,-1) ){ + if( pDest->pCheck + && (db->mDbFlags & DBFLAG_Vacuum)==0 + && sqlite3ExprListCompare(pSrc->pCheck,pDest->pCheck,-1) + ){ return 0; /* Tables have different CHECK constraints. Ticket #2252 */ } #endif #ifndef SQLITE_OMIT_FOREIGN_KEY - /* Disallow the transfer optimization if the destination table constains + /* Disallow the transfer optimization if the destination table contains ** any foreign key constraints. This is more restrictive than necessary. ** But the main beneficiary of the transfer optimization is the VACUUM ** command, and the VACUUM command disables foreign key constraints. So @@ -132413,6 +137589,11 @@ struct sqlite3_api_routines { int (*value_encoding)(sqlite3_value*); /* Version 3.41.0 and later */ int (*is_interrupted)(sqlite3*); + /* Version 3.43.0 and later */ + int (*stmt_explain)(sqlite3_stmt*,int); + /* Version 3.44.0 and later */ + void *(*get_clientdata)(sqlite3*,const char*); + int (*set_clientdata)(sqlite3*, const char*, void*, void(*)(void*)); }; /* @@ -132741,6 +137922,11 @@ typedef int (*sqlite3_loadext_entry)( #define sqlite3_value_encoding sqlite3_api->value_encoding /* Version 3.41.0 and later */ #define sqlite3_is_interrupted sqlite3_api->is_interrupted +/* Version 3.43.0 and later */ +#define sqlite3_stmt_explain sqlite3_api->stmt_explain +/* Version 3.44.0 and later */ +#define sqlite3_get_clientdata sqlite3_api->get_clientdata +#define sqlite3_set_clientdata sqlite3_api->set_clientdata #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) @@ -133257,7 +138443,12 @@ static const sqlite3_api_routines sqlite3Apis = { /* Version 3.40.0 and later */ sqlite3_value_encoding, /* Version 3.41.0 and later */ - sqlite3_is_interrupted + sqlite3_is_interrupted, + /* Version 3.43.0 and later */ + sqlite3_stmt_explain, + /* Version 3.44.0 and later */ + sqlite3_get_clientdata, + sqlite3_set_clientdata }; /* True if x is the directory separator character @@ -133330,15 +138521,25 @@ static int sqlite3LoadExtension( /* tag-20210611-1. Some dlopen() implementations will segfault if given ** an oversize filename. Most filesystems have a pathname limit of 4K, ** so limit the extension filename length to about twice that. - ** https://sqlite.org/forum/forumpost/08a0d6d9bf */ + ** https://sqlite.org/forum/forumpost/08a0d6d9bf + ** + ** Later (2023-03-25): Save an extra 6 bytes for the filename suffix. + ** See https://sqlite.org/forum/forumpost/24083b579d. + */ if( nMsg>SQLITE_MAX_PATHLEN ) goto extension_not_found; + /* Do not allow sqlite3_load_extension() to link to a copy of the + ** running application, by passing in an empty filename. */ + if( nMsg==0 ) goto extension_not_found; + handle = sqlite3OsDlOpen(pVfs, zFile); #if SQLITE_OS_UNIX || SQLITE_OS_WIN for(ii=0; iimutex); if( onoff ){ db->flags |= SQLITE_LoadExtension|SQLITE_LoadExtFunc; @@ -133512,6 +138716,9 @@ SQLITE_API int sqlite3_auto_extension( void (*xInit)(void) ){ int rc = SQLITE_OK; +#ifdef SQLITE_ENABLE_API_ARMOR + if( xInit==0 ) return SQLITE_MISUSE_BKPT; +#endif #ifndef SQLITE_OMIT_AUTOINIT rc = sqlite3_initialize(); if( rc ){ @@ -133564,6 +138771,9 @@ SQLITE_API int sqlite3_cancel_auto_extension( int i; int n = 0; wsdAutoextInit; +#ifdef SQLITE_ENABLE_API_ARMOR + if( xInit==0 ) return 0; +#endif sqlite3_mutex_enter(mutex); for(i=(int)wsdAutoext.nExt-1; i>=0; i--){ if( wsdAutoext.aExt[i]==xInit ){ @@ -134339,6 +139549,34 @@ static const PragmaName aPragmaName[] = { /************** End of pragma.h **********************************************/ /************** Continuing where we left off in pragma.c *********************/ +/* +** When the 0x10 bit of PRAGMA optimize is set, any ANALYZE commands +** will be run with an analysis_limit set to the lessor of the value of +** the following macro or to the actual analysis_limit if it is non-zero, +** in order to prevent PRAGMA optimize from running for too long. +** +** The value of 2000 is chosen emperically so that the worst-case run-time +** for PRAGMA optimize does not exceed 100 milliseconds against a variety +** of test databases on a RaspberryPI-4 compiled using -Os and without +** -DSQLITE_DEBUG. Of course, your mileage may vary. For the purpose of +** this paragraph, "worst-case" means that ANALYZE ends up being +** run on every table in the database. The worst case typically only +** happens if PRAGMA optimize is run on a database file for which ANALYZE +** has not been previously run and the 0x10000 flag is included so that +** all tables are analyzed. The usual case for PRAGMA optimize is that +** no ANALYZE commands will be run at all, or if any ANALYZE happens it +** will be against a single table, so that expected timing for PRAGMA +** optimize on a PI-4 is more like 1 millisecond or less with the 0x10000 +** flag or less than 100 microseconds without the 0x10000 flag. +** +** An analysis limit of 2000 is almost always sufficient for the query +** planner to fully characterize an index. The additional accuracy from +** a larger analysis is not usually helpful. +*/ +#ifndef SQLITE_DEFAULT_OPTIMIZE_LIMIT +# define SQLITE_DEFAULT_OPTIMIZE_LIMIT 2000 +#endif + /* ** Interpret the given string as a safety level. Return 0 for OFF, ** 1 for ON or NORMAL, 2 for FULL, and 3 for EXTRA. Return 1 for an empty or @@ -135163,7 +140401,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** ** The first form reports the current local setting for the ** page cache spill size. The second form turns cache spill on - ** or off. When turnning cache spill on, the size is set to the + ** or off. When turning cache spill on, the size is set to the ** current cache_size. The third form sets a spill size that ** may be different form the cache size. ** If N is positive then that is the @@ -135433,7 +140671,11 @@ SQLITE_PRIVATE void sqlite3Pragma( #endif if( sqlite3GetBoolean(zRight, 0) ){ - db->flags |= mask; + if( (mask & SQLITE_WriteSchema)==0 + || (db->flags & SQLITE_Defensive)==0 + ){ + db->flags |= mask; + } }else{ db->flags &= ~mask; if( mask==SQLITE_DeferFKs ) db->nDeferredImmCons = 0; @@ -135833,7 +141075,7 @@ SQLITE_PRIVATE void sqlite3Pragma( zDb = db->aDb[iDb].zDbSName; sqlite3CodeVerifySchema(pParse, iDb); sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); - if( pTab->nCol+regRow>pParse->nMem ) pParse->nMem = pTab->nCol + regRow; + sqlite3TouchRegister(pParse, pTab->nCol+regRow); sqlite3OpenTable(pParse, 0, iDb, pTab, OP_OpenRead); sqlite3VdbeLoadString(v, regResult, pTab->zName); assert( IsOrdinaryTable(pTab) ); @@ -135874,7 +141116,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** regRow..regRow+n. If any of the child key values are NULL, this ** row cannot cause an FK violation. Jump directly to addrOk in ** this case. */ - if( regRow+pFK->nCol>pParse->nMem ) pParse->nMem = regRow+pFK->nCol; + sqlite3TouchRegister(pParse, regRow + pFK->nCol); for(j=0; jnCol; j++){ int iCol = aiCols ? aiCols[j] : pFK->aCol[j].iFrom; sqlite3ExprCodeGetColumnOfTable(v, pTab, 0, iCol, regRow+j); @@ -135941,9 +141183,9 @@ SQLITE_PRIVATE void sqlite3Pragma( ** The "quick_check" is reduced version of ** integrity_check designed to detect most database corruption ** without the overhead of cross-checking indexes. Quick_check - ** is linear time wherease integrity_check is O(NlogN). + ** is linear time whereas integrity_check is O(NlogN). ** - ** The maximum nubmer of errors is 100 by default. A different default + ** The maximum number of errors is 100 by default. A different default ** can be specified using a numeric parameter N. ** ** Or, the parameter N can be the name of a table. In that case, only @@ -135980,7 +141222,7 @@ SQLITE_PRIVATE void sqlite3Pragma( /* Set the maximum error count */ mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; if( zRight ){ - if( sqlite3GetInt32(zRight, &mxErr) ){ + if( sqlite3GetInt32(pValue->z, &mxErr) ){ if( mxErr<=0 ){ mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; } @@ -135997,12 +141239,12 @@ SQLITE_PRIVATE void sqlite3Pragma( Hash *pTbls; /* Set of all tables in the schema */ int *aRoot; /* Array of root page numbers of all btrees */ int cnt = 0; /* Number of entries in aRoot[] */ - int mxIdx = 0; /* Maximum number of indexes for any table */ if( OMIT_TEMPDB && i==1 ) continue; if( iDb>=0 && i!=iDb ) continue; sqlite3CodeVerifySchema(pParse, i); + pParse->okConstFactor = 0; /* tag-20230327-1 */ /* Do an integrity check of the B-Tree ** @@ -136018,7 +141260,6 @@ SQLITE_PRIVATE void sqlite3Pragma( if( pObjTab && pObjTab!=pTab ) continue; if( HasRowid(pTab) ) cnt++; for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ cnt++; } - if( nIdx>mxIdx ) mxIdx = nIdx; } if( cnt==0 ) continue; if( pObjTab ) cnt++; @@ -136038,11 +141279,12 @@ SQLITE_PRIVATE void sqlite3Pragma( aRoot[0] = cnt; /* Make sure sufficient number of registers have been allocated */ - pParse->nMem = MAX( pParse->nMem, 8+mxIdx ); + sqlite3TouchRegister(pParse, 8+cnt); + sqlite3VdbeAddOp3(v, OP_Null, 0, 8, 8+cnt); sqlite3ClearTempRegCache(pParse); /* Do the b-tree integrity checks */ - sqlite3VdbeAddOp4(v, OP_IntegrityCk, 2, cnt, 1, (char*)aRoot,P4_INTARRAY); + sqlite3VdbeAddOp4(v, OP_IntegrityCk, 1, cnt, 8, (char*)aRoot,P4_INTARRAY); sqlite3VdbeChangeP5(v, (u8)i); addr = sqlite3VdbeAddOp1(v, OP_IsNull, 2); VdbeCoverage(v); sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, @@ -136052,6 +141294,36 @@ SQLITE_PRIVATE void sqlite3Pragma( integrityCheckResultRow(v); sqlite3VdbeJumpHere(v, addr); + /* Check that the indexes all have the right number of rows */ + cnt = pObjTab ? 1 : 0; + sqlite3VdbeLoadString(v, 2, "wrong # of entries in index "); + for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ + int iTab = 0; + Table *pTab = sqliteHashData(x); + Index *pIdx; + if( pObjTab && pObjTab!=pTab ) continue; + if( HasRowid(pTab) ){ + iTab = cnt++; + }else{ + iTab = cnt; + for(pIdx=pTab->pIndex; ALWAYS(pIdx); pIdx=pIdx->pNext){ + if( IsPrimaryKeyIndex(pIdx) ) break; + iTab++; + } + } + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( pIdx->pPartIdxWhere==0 ){ + addr = sqlite3VdbeAddOp3(v, OP_Eq, 8+cnt, 0, 8+iTab); + VdbeCoverageNeverNull(v); + sqlite3VdbeLoadString(v, 4, pIdx->zName); + sqlite3VdbeAddOp3(v, OP_Concat, 4, 2, 3); + integrityCheckResultRow(v); + sqlite3VdbeJumpHere(v, addr); + } + cnt++; + } + } + /* Make sure all the indices are constructed correctly. */ for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ @@ -136065,8 +141337,8 @@ SQLITE_PRIVATE void sqlite3Pragma( int r2; /* Previous key for WITHOUT ROWID tables */ int mxCol; /* Maximum non-virtual column number */ - if( !IsOrdinaryTable(pTab) ) continue; if( pObjTab && pObjTab!=pTab ) continue; + if( !IsOrdinaryTable(pTab) ) continue; if( isQuick || HasRowid(pTab) ){ pPk = 0; r2 = 0; @@ -136188,15 +141460,30 @@ SQLITE_PRIVATE void sqlite3Pragma( labelOk = sqlite3VdbeMakeLabel(pParse); if( pCol->notNull ){ /* (1) NOT NULL columns may not contain a NULL */ + int jmp3; int jmp2 = sqlite3VdbeAddOp4Int(v, OP_IsType, p1, labelOk, p3, p4); - sqlite3VdbeChangeP5(v, 0x0f); VdbeCoverage(v); + if( p1<0 ){ + sqlite3VdbeChangeP5(v, 0x0f); /* INT, REAL, TEXT, or BLOB */ + jmp3 = jmp2; + }else{ + sqlite3VdbeChangeP5(v, 0x0d); /* INT, TEXT, or BLOB */ + /* OP_IsType does not detect NaN values in the database file + ** which should be treated as a NULL. So if the header type + ** is REAL, we have to load the actual data using OP_Column + ** to reliably determine if the value is a NULL. */ + sqlite3VdbeAddOp3(v, OP_Column, p1, p3, 3); + sqlite3ColumnDefault(v, pTab, j, 3); + jmp3 = sqlite3VdbeAddOp2(v, OP_NotNull, 3, labelOk); + VdbeCoverage(v); + } zErr = sqlite3MPrintf(db, "NULL value in %s.%s", pTab->zName, pCol->zCnName); sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC); if( doTypeCheck ){ sqlite3VdbeGoto(v, labelError); sqlite3VdbeJumpHere(v, jmp2); + sqlite3VdbeJumpHere(v, jmp3); }else{ /* VDBE byte code will fall thru */ } @@ -136304,7 +141591,7 @@ SQLITE_PRIVATE void sqlite3Pragma( int jmp7; sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur+j, 3); jmp7 = sqlite3VdbeAddOp3(v, OP_Eq, 3, 0, r1+pIdx->nColumn-1); - VdbeCoverage(v); + VdbeCoverageNeverNull(v); sqlite3VdbeLoadString(v, 3, "rowid not at end-of-record for row "); sqlite3VdbeAddOp3(v, OP_Concat, 7, 3, 3); @@ -136360,23 +141647,43 @@ SQLITE_PRIVATE void sqlite3Pragma( } sqlite3VdbeAddOp2(v, OP_Next, iDataCur, loopTop); VdbeCoverage(v); sqlite3VdbeJumpHere(v, loopTop-1); - if( !isQuick ){ - sqlite3VdbeLoadString(v, 2, "wrong # of entries in index "); - for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ - if( pPk==pIdx ) continue; - sqlite3VdbeAddOp2(v, OP_Count, iIdxCur+j, 3); - addr = sqlite3VdbeAddOp3(v, OP_Eq, 8+j, 0, 3); VdbeCoverage(v); - sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); - sqlite3VdbeLoadString(v, 4, pIdx->zName); - sqlite3VdbeAddOp3(v, OP_Concat, 4, 2, 3); - integrityCheckResultRow(v); - sqlite3VdbeJumpHere(v, addr); - } - if( pPk ){ - sqlite3ReleaseTempRange(pParse, r2, pPk->nKeyCol); - } + if( pPk ){ + assert( !isQuick ); + sqlite3ReleaseTempRange(pParse, r2, pPk->nKeyCol); } } + +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* Second pass to invoke the xIntegrity method on all virtual + ** tables. + */ + for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ + Table *pTab = sqliteHashData(x); + sqlite3_vtab *pVTab; + int a1; + if( pObjTab && pObjTab!=pTab ) continue; + if( IsOrdinaryTable(pTab) ) continue; + if( !IsVirtual(pTab) ) continue; + if( pTab->nCol<=0 ){ + const char *zMod = pTab->u.vtab.azArg[0]; + if( sqlite3HashFind(&db->aModule, zMod)==0 ) continue; + } + sqlite3ViewGetColumnNames(pParse, pTab); + if( pTab->u.vtab.p==0 ) continue; + pVTab = pTab->u.vtab.p->pVtab; + if( NEVER(pVTab==0) ) continue; + if( NEVER(pVTab->pModule==0) ) continue; + if( pVTab->pModule->iVersion<4 ) continue; + if( pVTab->pModule->xIntegrity==0 ) continue; + sqlite3VdbeAddOp3(v, OP_VCheck, i, 3, isQuick); + pTab->nTabRef++; + sqlite3VdbeAppendP4(v, pTab, P4_TABLEREF); + a1 = sqlite3VdbeAddOp1(v, OP_IsNull, 3); VdbeCoverage(v); + integrityCheckResultRow(v); + sqlite3VdbeJumpHere(v, a1); + continue; + } +#endif } { static const int iLn = VDBE_OFFSET_LINENO(2); @@ -136640,44 +141947,63 @@ SQLITE_PRIVATE void sqlite3Pragma( ** ** The optional argument is a bitmask of optimizations to perform: ** - ** 0x0001 Debugging mode. Do not actually perform any optimizations - ** but instead return one line of text for each optimization - ** that would have been done. Off by default. + ** 0x00001 Debugging mode. Do not actually perform any optimizations + ** but instead return one line of text for each optimization + ** that would have been done. Off by default. ** - ** 0x0002 Run ANALYZE on tables that might benefit. On by default. - ** See below for additional information. + ** 0x00002 Run ANALYZE on tables that might benefit. On by default. + ** See below for additional information. ** - ** 0x0004 (Not yet implemented) Record usage and performance - ** information from the current session in the - ** database file so that it will be available to "optimize" - ** pragmas run by future database connections. + ** 0x00010 Run all ANALYZE operations using an analysis_limit that + ** is the lessor of the current analysis_limit and the + ** SQLITE_DEFAULT_OPTIMIZE_LIMIT compile-time option. + ** The default value of SQLITE_DEFAULT_OPTIMIZE_LIMIT is + ** currently (2024-02-19) set to 2000, which is such that + ** the worst case run-time for PRAGMA optimize on a 100MB + ** database will usually be less than 100 milliseconds on + ** a RaspberryPI-4 class machine. On by default. ** - ** 0x0008 (Not yet implemented) Create indexes that might have - ** been helpful to recent queries + ** 0x10000 Look at tables to see if they need to be reanalyzed + ** due to growth or shrinkage even if they have not been + ** queried during the current connection. Off by default. ** - ** The default MASK is and always shall be 0xfffe. 0xfffe means perform all - ** of the optimizations listed above except Debug Mode, including new - ** optimizations that have not yet been invented. If new optimizations are - ** ever added that should be off by default, those off-by-default - ** optimizations will have bitmasks of 0x10000 or larger. + ** The default MASK is and always shall be 0x0fffe. In the current + ** implementation, the default mask only covers the 0x00002 optimization, + ** though additional optimizations that are covered by 0x0fffe might be + ** added in the future. Optimizations that are off by default and must + ** be explicitly requested have masks of 0x10000 or greater. ** ** DETERMINATION OF WHEN TO RUN ANALYZE ** ** In the current implementation, a table is analyzed if only if all of ** the following are true: ** - ** (1) MASK bit 0x02 is set. + ** (1) MASK bit 0x00002 is set. ** - ** (2) The query planner used sqlite_stat1-style statistics for one or - ** more indexes of the table at some point during the lifetime of - ** the current connection. + ** (2) The table is an ordinary table, not a virtual table or view. ** - ** (3) One or more indexes of the table are currently unanalyzed OR - ** the number of rows in the table has increased by 25 times or more - ** since the last time ANALYZE was run. + ** (3) The table name does not begin with "sqlite_". + ** + ** (4) One or more of the following is true: + ** (4a) The 0x10000 MASK bit is set. + ** (4b) One or more indexes on the table lacks an entry + ** in the sqlite_stat1 table. + ** (4c) The query planner used sqlite_stat1-style statistics for one + ** or more indexes of the table at some point during the lifetime + ** of the current connection. + ** + ** (5) One or more of the following is true: + ** (5a) One or more indexes on the table lacks an entry + ** in the sqlite_stat1 table. (Same as 4a) + ** (5b) The number of rows in the table has increased or decreased by + ** 10-fold. In other words, the current size of the table is + ** 10 times larger than the size in sqlite_stat1 or else the + ** current size is less than 1/10th the size in sqlite_stat1. ** ** The rules for when tables are analyzed are likely to change in - ** future releases. + ** future releases. Future versions of SQLite might accept a string + ** literal argument to this pragma that contains a mnemonic description + ** of the options rather than a bitmap. */ case PragTyp_OPTIMIZE: { int iDbLast; /* Loop termination point for the schema loop */ @@ -136686,9 +142012,13 @@ SQLITE_PRIVATE void sqlite3Pragma( Schema *pSchema; /* The current schema */ Table *pTab; /* A table in the schema */ Index *pIdx; /* An index of the table */ - LogEst szThreshold; /* Size threshold above which reanalysis is needd */ + LogEst szThreshold; /* Size threshold above which reanalysis needed */ char *zSubSql; /* SQL statement for the OP_SqlExec opcode */ u32 opMask; /* Mask of operations to perform */ + int nLimit; /* Analysis limit to use */ + int nCheck = 0; /* Number of tables to be optimized */ + int nBtree = 0; /* Number of btrees to scan */ + int nIndex; /* Number of indexes on the current table */ if( zRight ){ opMask = (u32)sqlite3Atoi(zRight); @@ -136696,6 +142026,14 @@ SQLITE_PRIVATE void sqlite3Pragma( }else{ opMask = 0xfffe; } + if( (opMask & 0x10)==0 ){ + nLimit = 0; + }else if( db->nAnalysisLimit>0 + && db->nAnalysisLimitnTab++; for(iDbLast = zDb?iDb:db->nDb-1; iDb<=iDbLast; iDb++){ if( iDb==1 ) continue; @@ -136704,23 +142042,61 @@ SQLITE_PRIVATE void sqlite3Pragma( for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){ pTab = (Table*)sqliteHashData(k); - /* If table pTab has not been used in a way that would benefit from - ** having analysis statistics during the current session, then skip it. - ** This also has the effect of skipping virtual tables and views */ - if( (pTab->tabFlags & TF_StatsUsed)==0 ) continue; + /* This only works for ordinary tables */ + if( !IsOrdinaryTable(pTab) ) continue; - /* Reanalyze if the table is 25 times larger than the last analysis */ - szThreshold = pTab->nRowLogEst + 46; assert( sqlite3LogEst(25)==46 ); + /* Do not scan system tables */ + if( 0==sqlite3StrNICmp(pTab->zName, "sqlite_", 7) ) continue; + + /* Find the size of the table as last recorded in sqlite_stat1. + ** If any index is unanalyzed, then the threshold is -1 to + ** indicate a new, unanalyzed index + */ + szThreshold = pTab->nRowLogEst; + nIndex = 0; for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + nIndex++; if( !pIdx->hasStat1 ){ - szThreshold = 0; /* Always analyze if any index lacks statistics */ - break; + szThreshold = -1; /* Always analyze if any index lacks statistics */ } } - if( szThreshold ){ - sqlite3OpenTable(pParse, iTabCur, iDb, pTab, OP_OpenRead); - sqlite3VdbeAddOp3(v, OP_IfSmaller, iTabCur, - sqlite3VdbeCurrentAddr(v)+2+(opMask&1), szThreshold); + + /* If table pTab has not been used in a way that would benefit from + ** having analysis statistics during the current session, then skip it, + ** unless the 0x10000 MASK bit is set. */ + if( (pTab->tabFlags & TF_MaybeReanalyze)!=0 ){ + /* Check for size change if stat1 has been used for a query */ + }else if( opMask & 0x10000 ){ + /* Check for size change if 0x10000 is set */ + }else if( pTab->pIndex!=0 && szThreshold<0 ){ + /* Do analysis if unanalyzed indexes exists */ + }else{ + /* Otherwise, we can skip this table */ + continue; + } + + nCheck++; + if( nCheck==2 ){ + /* If ANALYZE might be invoked two or more times, hold a write + ** transaction for efficiency */ + sqlite3BeginWriteOperation(pParse, 0, iDb); + } + nBtree += nIndex+1; + + /* Reanalyze if the table is 10 times larger or smaller than + ** the last analysis. Unconditional reanalysis if there are + ** unanalyzed indexes. */ + sqlite3OpenTable(pParse, iTabCur, iDb, pTab, OP_OpenRead); + if( szThreshold>=0 ){ + const LogEst iRange = 33; /* 10x size change */ + sqlite3VdbeAddOp4Int(v, OP_IfSizeBetween, iTabCur, + sqlite3VdbeCurrentAddr(v)+2+(opMask&1), + szThreshold>=iRange ? szThreshold-iRange : -1, + szThreshold+iRange); + VdbeCoverage(v); + }else{ + sqlite3VdbeAddOp2(v, OP_Rewind, iTabCur, + sqlite3VdbeCurrentAddr(v)+2+(opMask&1)); VdbeCoverage(v); } zSubSql = sqlite3MPrintf(db, "ANALYZE \"%w\".\"%w\"", @@ -136730,11 +142106,27 @@ SQLITE_PRIVATE void sqlite3Pragma( sqlite3VdbeAddOp4(v, OP_String8, 0, r1, 0, zSubSql, P4_DYNAMIC); sqlite3VdbeAddOp2(v, OP_ResultRow, r1, 1); }else{ - sqlite3VdbeAddOp4(v, OP_SqlExec, 0, 0, 0, zSubSql, P4_DYNAMIC); + sqlite3VdbeAddOp4(v, OP_SqlExec, nLimit ? 0x02 : 00, nLimit, 0, + zSubSql, P4_DYNAMIC); } } } sqlite3VdbeAddOp0(v, OP_Expire); + + /* In a schema with a large number of tables and indexes, scale back + ** the analysis_limit to avoid excess run-time in the worst case. + */ + if( !db->mallocFailed && nLimit>0 && nBtree>100 ){ + int iAddr, iEnd; + VdbeOp *aOp; + nLimit = 100*nLimit/nBtree; + if( nLimit<100 ) nLimit = 100; + aOp = sqlite3VdbeGetOp(v, 0); + iEnd = sqlite3VdbeCurrentAddr(v); + for(iAddr=0; iAddrnConstraint; i++, pConstraint++){ - if( pConstraint->usable==0 ) continue; - if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; if( pConstraint->iColumn < pTab->iHidden ) continue; + if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; + if( pConstraint->usable==0 ) return SQLITE_CONSTRAINT; j = pConstraint->iColumn - pTab->iHidden; assert( j < 2 ); seen[j] = i+1; @@ -137013,12 +142405,13 @@ static int pragmaVtabBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ j = seen[0]-1; pIdxInfo->aConstraintUsage[j].argvIndex = 1; pIdxInfo->aConstraintUsage[j].omit = 1; - if( seen[1]==0 ) return SQLITE_OK; pIdxInfo->estimatedCost = (double)20; pIdxInfo->estimatedRows = 20; - j = seen[1]-1; - pIdxInfo->aConstraintUsage[j].argvIndex = 2; - pIdxInfo->aConstraintUsage[j].omit = 1; + if( seen[1] ){ + j = seen[1]-1; + pIdxInfo->aConstraintUsage[j].argvIndex = 2; + pIdxInfo->aConstraintUsage[j].omit = 1; + } return SQLITE_OK; } @@ -137038,6 +142431,7 @@ static void pragmaVtabCursorClear(PragmaVtabCursor *pCsr){ int i; sqlite3_finalize(pCsr->pPragma); pCsr->pPragma = 0; + pCsr->iRowid = 0; for(i=0; iazArg); i++){ sqlite3_free(pCsr->azArg[i]); pCsr->azArg[i] = 0; @@ -137178,7 +142572,8 @@ static const sqlite3_module pragmaVtabModule = { 0, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ - 0 /* xShadowName */ + 0, /* xShadowName */ + 0 /* xIntegrity */ }; /* @@ -137510,7 +142905,9 @@ SQLITE_PRIVATE int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFl #else encoding = SQLITE_UTF8; #endif - if( db->nVdbeActive>0 && encoding!=ENC(db) ){ + if( db->nVdbeActive>0 && encoding!=ENC(db) + && (db->mDbFlags & DBFLAG_Vacuum)==0 + ){ rc = SQLITE_LOCKED; goto initone_error_out; }else{ @@ -137800,8 +143197,6 @@ SQLITE_PRIVATE void sqlite3ParseObjectReset(Parse *pParse){ db->lookaside.sz = db->lookaside.bDisable ? 0 : db->lookaside.szTrue; assert( pParse->db->pParse==pParse ); db->pParse = pParse->pOuterParse; - pParse->db = 0; - pParse->disableLookaside = 0; } /* @@ -137810,7 +143205,7 @@ SQLITE_PRIVATE void sqlite3ParseObjectReset(Parse *pParse){ ** immediately. ** ** Use this mechanism for uncommon cleanups. There is a higher setup -** cost for this mechansim (an extra malloc), so it should not be used +** cost for this mechanism (an extra malloc), so it should not be used ** for common cleanups that happen on most calls. But for less ** common cleanups, we save a single NULL-pointer comparison in ** sqlite3ParseObjectReset(), which reduces the total CPU cycle count. @@ -137837,7 +143232,13 @@ SQLITE_PRIVATE void *sqlite3ParserAddCleanup( void (*xCleanup)(sqlite3*,void*), /* The cleanup routine */ void *pPtr /* Pointer to object to be cleaned up */ ){ - ParseCleanup *pCleanup = sqlite3DbMallocRaw(pParse->db, sizeof(*pCleanup)); + ParseCleanup *pCleanup; + if( sqlite3FaultSim(300) ){ + pCleanup = 0; + sqlite3OomFault(pParse->db); + }else{ + pCleanup = sqlite3DbMallocRaw(pParse->db, sizeof(*pCleanup)); + } if( pCleanup ){ pCleanup->pNext = pParse->pCleanup; pParse->pCleanup = pCleanup; @@ -137902,9 +143303,18 @@ static int sqlite3Prepare( sParse.pOuterParse = db->pParse; db->pParse = &sParse; sParse.db = db; - sParse.pReprepare = pReprepare; + if( pReprepare ){ + sParse.pReprepare = pReprepare; + sParse.explain = sqlite3_stmt_isexplain((sqlite3_stmt*)pReprepare); + }else{ + assert( sParse.pReprepare==0 ); + } assert( ppStmt && *ppStmt==0 ); - if( db->mallocFailed ) sqlite3ErrorMsg(&sParse, "out of memory"); + if( db->mallocFailed ){ + sqlite3ErrorMsg(&sParse, "out of memory"); + db->errCode = rc = SQLITE_NOMEM; + goto end_prepare; + } assert( sqlite3_mutex_held(db->mutex) ); /* For a long-term use prepared statement avoid the use of @@ -138063,6 +143473,7 @@ static int sqlite3LockAndPrepare( assert( (rc&db->errMask)==rc ); db->busyHandler.nBusy = 0; sqlite3_mutex_leave(db->mutex); + assert( rc==SQLITE_OK || (*ppStmt)==0 ); return rc; } @@ -138195,12 +143606,24 @@ static int sqlite3Prepare16( if( !sqlite3SafetyCheckOk(db)||zSql==0 ){ return SQLITE_MISUSE_BKPT; } + + /* Make sure nBytes is non-negative and correct. It should be the + ** number of bytes until the end of the input buffer or until the first + ** U+0000 character. If the input nBytes is odd, convert it into + ** an even number. If the input nBytes is negative, then the input + ** must be terminated by at least one U+0000 character */ if( nBytes>=0 ){ int sz; const char *z = (const char*)zSql; for(sz=0; szmutex); zSql8 = sqlite3Utf16to8(db, zSql, nBytes, SQLITE_UTF16NATIVE); if( zSql8 ){ @@ -138214,7 +143637,7 @@ static int sqlite3Prepare16( ** the same number of characters into the UTF-16 string. */ int chars_parsed = sqlite3Utf8CharLen(zSql8, (int)(zTail8-zSql8)); - *pzTail = (u8 *)zSql + sqlite3Utf16ByteLen(zSql, chars_parsed); + *pzTail = (u8 *)zSql + sqlite3Utf16ByteLen(zSql, nBytes, chars_parsed); } sqlite3DbFree(db, zSql8); rc = sqlite3ApiExit(db, rc); @@ -138460,6 +143883,9 @@ SQLITE_PRIVATE Select *sqlite3SelectNew( SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3 *db, Select *p){ if( OK_IF_ALWAYS_TRUE(p) ) clearSelect(db, p, 1); } +SQLITE_PRIVATE void sqlite3SelectDeleteGeneric(sqlite3 *db, void *p){ + if( ALWAYS(p) ) clearSelect(db, (Select*)p, 1); +} /* ** Return a pointer to the right-most SELECT statement in a compound. @@ -138508,7 +143934,7 @@ static Select *findRightmost(Select *p){ ** NATURAL FULL OUTER JT_NATRUAL|JT_LEFT|JT_RIGHT ** ** To preserve historical compatibly, SQLite also accepts a variety -** of other non-standard and in many cases non-sensical join types. +** of other non-standard and in many cases nonsensical join types. ** This routine makes as much sense at it can from the nonsense join ** type and returns a result. Examples of accepted nonsense join types ** include but are not limited to: @@ -138605,11 +144031,13 @@ SQLITE_PRIVATE int sqlite3ColumnIndex(Table *pTab, const char *zCol){ */ SQLITE_PRIVATE void sqlite3SrcItemColumnUsed(SrcItem *pItem, int iCol){ assert( pItem!=0 ); - assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect) ); + assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem) ); if( pItem->fg.isNestedFrom ){ ExprList *pResults; - assert( pItem->pSelect!=0 ); - pResults = pItem->pSelect->pEList; + assert( pItem->fg.isSubquery ); + assert( pItem->u4.pSubq!=0 ); + assert( pItem->u4.pSubq->pSelect!=0 ); + pResults = pItem->u4.pSubq->pSelect->pEList; assert( pResults!=0 ); assert( iCol>=0 && iColnExpr ); pResults->a[iCol].fg.bUsed = 1; @@ -138643,9 +144071,9 @@ static int tableAndColumnIndex( assert( (piTab==0)==(piCol==0) ); /* Both or neither are NULL */ for(i=iStart; i<=iEnd; i++){ - iCol = sqlite3ColumnIndex(pSrc->a[i].pTab, zCol); + iCol = sqlite3ColumnIndex(pSrc->a[i].pSTab, zCol); if( iCol>=0 - && (bIgnoreHidden==0 || IsHiddenColumn(&pSrc->a[i].pTab->aCol[iCol])==0) + && (bIgnoreHidden==0 || IsHiddenColumn(&pSrc->a[i].pSTab->aCol[iCol])==0) ){ if( piTab ){ sqlite3SrcItemColumnUsed(&pSrc->a[i], iCol); @@ -138730,6 +144158,7 @@ static void unsetJoinExpr(Expr *p, int iTable, int nullable){ } if( p->op==TK_FUNCTION ){ assert( ExprUseXList(p) ); + assert( p->pLeft==0 ); if( p->x.pList ){ int i; for(i=0; ix.pList->nExpr; i++){ @@ -138773,13 +144202,13 @@ static int sqlite3ProcessJoin(Parse *pParse, Select *p){ pLeft = &pSrc->a[0]; pRight = &pLeft[1]; for(i=0; inSrc-1; i++, pRight++, pLeft++){ - Table *pRightTab = pRight->pTab; + Table *pRightTab = pRight->pSTab; u32 joinType; - if( NEVER(pLeft->pTab==0 || pRightTab==0) ) continue; + if( NEVER(pLeft->pSTab==0 || pRightTab==0) ) continue; joinType = (pRight->fg.jointype & JT_OUTER)!=0 ? EP_OuterON : EP_InnerON; - /* If this is a NATURAL join, synthesize an approprate USING clause + /* If this is a NATURAL join, synthesize an appropriate USING clause ** to specify which columns should be joined. */ if( pRight->fg.jointype & JT_NATURAL ){ @@ -138993,9 +144422,9 @@ static void pushOntoSorter( ** (2) All output columns are included in the sort record. In that ** case regData==regOrigData. ** (3) Some output columns are omitted from the sort record due to - ** the SQLITE_ENABLE_SORTER_REFERENCE optimization, or due to the + ** the SQLITE_ENABLE_SORTER_REFERENCES optimization, or due to the ** SQLITE_ECEL_OMITREF optimization, or due to the - ** SortCtx.pDeferredRowLoad optimiation. In any of these cases + ** SortCtx.pDeferredRowLoad optimization. In any of these cases ** regOrigData is 0 to prevent this routine from trying to copy ** values that might not yet exist. */ @@ -139051,7 +144480,7 @@ static void pushOntoSorter( testcase( pKI->nAllField > pKI->nKeyField+2 ); pOp->p4.pKeyInfo = sqlite3KeyInfoFromExprList(pParse,pSort->pOrderBy,nOBSat, pKI->nAllField-pKI->nKeyField-1); - pOp = 0; /* Ensure pOp not used after sqltie3VdbeAddOp3() */ + pOp = 0; /* Ensure pOp not used after sqlite3VdbeAddOp3() */ addrJmp = sqlite3VdbeCurrentAddr(v); sqlite3VdbeAddOp3(v, OP_Jump, addrJmp+1, 0, addrJmp+1); VdbeCoverage(v); pSort->labelBkOut = sqlite3VdbeMakeLabel(pParse); @@ -139145,7 +144574,7 @@ static void codeOffset( ** The returned value in this case is a copy of parameter iTab. ** ** WHERE_DISTINCT_ORDERED: -** In this case rows are being delivered sorted order. The ephermal +** In this case rows are being delivered sorted order. The ephemeral ** table is not required. Instead, the current set of values ** is compared against previous row. If they match, the new row ** is not distinct and control jumps to VM address addrRepeat. Otherwise, @@ -139574,6 +145003,16 @@ static void selectInnerLoop( testcase( eDest==SRT_Fifo ); testcase( eDest==SRT_DistFifo ); sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r1+nPrefixReg); +#if !defined(SQLITE_ENABLE_NULL_TRIM) && defined(SQLITE_DEBUG) + /* A destination of SRT_Table and a non-zero iSDParm2 parameter means + ** that this is an "UPDATE ... FROM" on a virtual table or view. In this + ** case set the p5 parameter of the OP_MakeRecord to OPFLAG_NOCHNG_MAGIC. + ** This does not affect operation in any way - it just allows MakeRecord + ** to process OPFLAG_NOCHANGE values without an assert() failing. */ + if( eDest==SRT_Table && pDest->iSDParm2 ){ + sqlite3VdbeChangeP5(v, OPFLAG_NOCHNG_MAGIC); + } +#endif #ifndef SQLITE_OMIT_CTE if( eDest==SRT_DistFifo ){ /* If the destination is DistFifo, then cursor (iParm+1) is open @@ -139639,12 +145078,18 @@ static void selectInnerLoop( ** case the order does matter */ pushOntoSorter( pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg); + pDest->iSDParm2 = 0; /* Signal that any Bloom filter is unpopulated */ }else{ int r1 = sqlite3GetTempReg(pParse); assert( sqlite3Strlen30(pDest->zAffSdst)==nResultCol ); sqlite3VdbeAddOp4(v, OP_MakeRecord, regResult, nResultCol, r1, pDest->zAffSdst, nResultCol); sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, nResultCol); + if( pDest->iSDParm2 ){ + sqlite3VdbeAddOp4Int(v, OP_FilterAdd, pDest->iSDParm2, 0, + regResult, nResultCol); + ExplainQueryPlan((pParse, 0, "CREATE BLOOM FILTER")); + } sqlite3ReleaseTempReg(pParse, r1); } break; @@ -139935,9 +145380,16 @@ static void generateSortTail( int addrExplain; /* Address of OP_Explain instruction */ #endif - ExplainQueryPlan2(addrExplain, (pParse, 0, - "USE TEMP B-TREE FOR %sORDER BY", pSort->nOBSat>0?"RIGHT PART OF ":"") - ); + nKey = pOrderBy->nExpr - pSort->nOBSat; + if( pSort->nOBSat==0 || nKey==1 ){ + ExplainQueryPlan2(addrExplain, (pParse, 0, + "USE TEMP B-TREE FOR %sORDER BY", pSort->nOBSat?"LAST TERM OF ":"" + )); + }else{ + ExplainQueryPlan2(addrExplain, (pParse, 0, + "USE TEMP B-TREE FOR LAST %d TERMS OF ORDER BY", nKey + )); + } sqlite3VdbeScanStatusRange(v, addrExplain,pSort->addrPush,pSort->addrPushEnd); sqlite3VdbeScanStatusCounters(v, addrExplain, addrExplain, pSort->addrPush); @@ -139975,7 +145427,6 @@ static void generateSortTail( regRow = sqlite3GetTempRange(pParse, nColumn); } } - nKey = pOrderBy->nExpr - pSort->nOBSat; if( pSort->sortFlags & SORTFLAG_UseSorter ){ int regSortOut = ++pParse->nMem; iSortTab = pParse->nTab++; @@ -140180,8 +145631,12 @@ static const char *columnTypeImpl( SrcList *pTabList = pNC->pSrcList; for(j=0;jnSrc && pTabList->a[j].iCursor!=pExpr->iTable;j++); if( jnSrc ){ - pTab = pTabList->a[j].pTab; - pS = pTabList->a[j].pSelect; + pTab = pTabList->a[j].pSTab; + if( pTabList->a[j].fg.isSubquery ){ + pS = pTabList->a[j].u4.pSubq->pSelect; + }else{ + pS = 0; + } }else{ pNC = pNC->pNext; } @@ -140215,11 +145670,7 @@ static const char *columnTypeImpl( ** data for the result-set column of the sub-select. */ if( iColpEList->nExpr -#ifdef SQLITE_ALLOW_ROWID_IN_VIEW - && iCol>=0 -#else - && ALWAYS(iCol>=0) -#endif + && (!ViewCanHaveRowid || iCol>=0) ){ /* If iCol is less than zero, then the expression requests the ** rowid of the sub-select or view. This expression is legal (see @@ -140377,13 +145828,6 @@ SQLITE_PRIVATE void sqlite3GenerateColumnNames( int fullName; /* TABLE.COLUMN if no AS clause and is a direct table ref */ int srcName; /* COLUMN or TABLE.COLUMN if no AS clause and is direct */ -#ifndef SQLITE_OMIT_EXPLAIN - /* If this is an EXPLAIN, skip this step */ - if( pParse->explain ){ - return; - } -#endif - if( pParse->colNamesSet ) return; /* Column names are determined by the left-most term of a compound select */ while( pSelect->pPrior ) pSelect = pSelect->pPrior; @@ -140570,7 +146014,7 @@ SQLITE_PRIVATE int sqlite3ColumnsFromExprList( ** kind (maybe a parenthesized subquery in the FROM clause of a larger ** query, or a VIEW, or a CTE). This routine computes type information ** for that Table object based on the Select object that implements the -** subquery. For the purposes of this routine, "type infomation" means: +** subquery. For the purposes of this routine, "type information" means: ** ** * The datatype name, as it might appear in a CREATE TABLE statement ** * Which collating sequence to use for the column @@ -140594,7 +146038,7 @@ SQLITE_PRIVATE void sqlite3SubqueryColumnTypes( assert( (pSelect->selFlags & SF_Resolved)!=0 ); assert( pTab->nCol==pSelect->pEList->nExpr || pParse->nErr>0 ); assert( aff==SQLITE_AFF_NONE || aff==SQLITE_AFF_BLOB ); - if( db->mallocFailed ) return; + if( db->mallocFailed || IN_RENAME_OBJECT ) return; while( pSelect->pPrior ) pSelect = pSelect->pPrior; a = pSelect->pEList->a; memset(&sNC, 0, sizeof(sNC)); @@ -140602,17 +146046,22 @@ SQLITE_PRIVATE void sqlite3SubqueryColumnTypes( for(i=0, pCol=pTab->aCol; inCol; i++, pCol++){ const char *zType; i64 n; + int m = 0; + Select *pS2 = pSelect; pTab->tabFlags |= (pCol->colFlags & COLFLAG_NOINSERT); p = a[i].pExpr; /* pCol->szEst = ... // Column size est for SELECT tables never used */ pCol->affinity = sqlite3ExprAffinity(p); + while( pCol->affinity<=SQLITE_AFF_NONE && pS2->pNext!=0 ){ + m |= sqlite3ExprDataType(pS2->pEList->a[i].pExpr); + pS2 = pS2->pNext; + pCol->affinity = sqlite3ExprAffinity(pS2->pEList->a[i].pExpr); + } if( pCol->affinity<=SQLITE_AFF_NONE ){ pCol->affinity = aff; } - if( pCol->affinity>=SQLITE_AFF_TEXT && pSelect->pNext ){ - int m = 0; - Select *pS2; - for(m=0, pS2=pSelect->pNext; pS2; pS2=pS2->pNext){ + if( pCol->affinity>=SQLITE_AFF_TEXT && (pS2->pNext || pS2!=pSelect) ){ + for(pS2=pS2->pNext; pS2; pS2=pS2->pNext){ m |= sqlite3ExprDataType(pS2->pEList->a[i].pExpr); } if( pCol->affinity==SQLITE_AFF_TEXT && (m&0x01)!=0 ){ @@ -140639,18 +146088,16 @@ SQLITE_PRIVATE void sqlite3SubqueryColumnTypes( break; } } - } - } - if( zType ){ - i64 m = sqlite3Strlen30(zType); - n = sqlite3Strlen30(pCol->zCnName); - pCol->zCnName = sqlite3DbReallocOrFree(db, pCol->zCnName, n+m+2); - if( pCol->zCnName ){ - memcpy(&pCol->zCnName[n+1], zType, m+1); - pCol->colFlags |= COLFLAG_HASTYPE; - }else{ - testcase( pCol->colFlags & COLFLAG_HASTYPE ); - pCol->colFlags &= ~(COLFLAG_HASTYPE|COLFLAG_HASCOLL); + } + } + if( zType ){ + const i64 k = sqlite3Strlen30(zType); + n = sqlite3Strlen30(pCol->zCnName); + pCol->zCnName = sqlite3DbReallocOrFree(db, pCol->zCnName, n+k+2); + pCol->colFlags &= ~(COLFLAG_HASTYPE|COLFLAG_HASCOLL); + if( pCol->zCnName ){ + memcpy(&pCol->zCnName[n+1], zType, k+1); + pCol->colFlags |= COLFLAG_HASTYPE; } } pColl = sqlite3ExprCollSeq(pParse, p); @@ -140756,7 +146203,7 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ p->iLimit = iLimit = ++pParse->nMem; v = sqlite3GetVdbe(pParse); assert( v!=0 ); - if( sqlite3ExprIsInteger(pLimit->pLeft, &n) ){ + if( sqlite3ExprIsInteger(pLimit->pLeft, &n, pParse) ){ sqlite3VdbeAddOp2(v, OP_Integer, n, iLimit); VdbeComment((v, "LIMIT counter")); if( n==0 ){ @@ -140901,7 +146348,7 @@ static void generateWithRecursiveQuery( int iQueue; /* The Queue table */ int iDistinct = 0; /* To ensure unique results if UNION */ int eDest = SRT_Fifo; /* How to write to Queue */ - SelectDest destQueue; /* SelectDest targetting the Queue table */ + SelectDest destQueue; /* SelectDest targeting the Queue table */ int i; /* Loop counter */ int rc; /* Result code */ ExprList *pOrderBy; /* The ORDER BY clause */ @@ -141236,7 +146683,7 @@ static int multiSelect( p->pPrior = pPrior; p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow); if( p->pLimit - && sqlite3ExprIsInteger(p->pLimit->pLeft, &nLimit) + && sqlite3ExprIsInteger(p->pLimit->pLeft, &nLimit, pParse) && nLimit>0 && p->nSelectRow > sqlite3LogEst((u64)nLimit) ){ p->nSelectRow = sqlite3LogEst((u64)nLimit); @@ -141477,9 +146924,7 @@ static int multiSelect( pDest->iSdst = dest.iSdst; pDest->nSdst = dest.nSdst; if( pDelete ){ - sqlite3ParserAddCleanup(pParse, - (void(*)(sqlite3*,void*))sqlite3SelectDelete, - pDelete); + sqlite3ParserAddCleanup(pParse, sqlite3SelectDeleteGeneric, pDelete); } return rc; } @@ -141501,7 +146946,7 @@ SQLITE_PRIVATE void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p){ /* ** Code an output subroutine for a coroutine implementation of a -** SELECT statment. +** SELECT statement. ** ** The data to be output is contained in pIn->iSdst. There are ** pIn->nSdst columns to be output. pDest is where the output should @@ -141582,6 +147027,11 @@ static int generateOutputSubroutine( r1, pDest->zAffSdst, pIn->nSdst); sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pDest->iSDParm, r1, pIn->iSdst, pIn->nSdst); + if( pDest->iSDParm2>0 ){ + sqlite3VdbeAddOp4Int(v, OP_FilterAdd, pDest->iSDParm2, 0, + pIn->iSdst, pIn->nSdst); + ExplainQueryPlan((pParse, 0, "CREATE BLOOM FILTER")); + } sqlite3ReleaseTempReg(pParse, r1); break; } @@ -141723,7 +147173,7 @@ static int generateOutputSubroutine( ** ** We call AltB, AeqB, AgtB, EofA, and EofB "subroutines" but they are not ** actually called using Gosub and they do not Return. EofA and EofB loop -** until all data is exhausted then jump to the "end" labe. AltB, AeqB, +** until all data is exhausted then jump to the "end" label. AltB, AeqB, ** and AgtB jump to either L2 or to one of EofA or EofB. */ #ifndef SQLITE_OMIT_COMPOUND_SELECT @@ -141760,7 +147210,7 @@ static int multiSelectOrderBy( int savedOffset; /* Saved value of p->iOffset */ int labelCmpr; /* Label for the start of the merge algorithm */ int labelEnd; /* Label for the end of the overall SELECT stmt */ - int addr1; /* Jump instructions that get retargetted */ + int addr1; /* Jump instructions that get retargeted */ int op; /* One of TK_ALL, TK_UNION, TK_EXCEPT, TK_INTERSECT */ KeyInfo *pKeyDup = 0; /* Comparison information for duplicate removal */ KeyInfo *pKeyMerge; /* Comparison information for merging rows */ @@ -142030,8 +147480,7 @@ static int multiSelectOrderBy( /* Make arrangements to free the 2nd and subsequent arms of the compound ** after the parse has finished */ if( pSplit->pPrior ){ - sqlite3ParserAddCleanup(pParse, - (void(*)(sqlite3*,void*))sqlite3SelectDelete, pSplit->pPrior); + sqlite3ParserAddCleanup(pParse, sqlite3SelectDeleteGeneric, pSplit->pPrior); } pSplit->pPrior = pPrior; pPrior->pNext = pSplit; @@ -142129,11 +147578,14 @@ static Expr *substExpr( #endif { Expr *pNew; - int iColumn = pExpr->iColumn; - Expr *pCopy = pSubst->pEList->a[iColumn].pExpr; + int iColumn; + Expr *pCopy; Expr ifNullRow; + iColumn = pExpr->iColumn; + assert( iColumn>=0 ); assert( pSubst->pEList!=0 && iColumnpEList->nExpr ); assert( pExpr->pRight==0 ); + pCopy = pSubst->pEList->a[iColumn].pExpr; if( sqlite3ExprIsVector(pCopy) ){ sqlite3VectorErrorMsg(pSubst->pParse, pCopy); }else{ @@ -142158,32 +147610,32 @@ static Expr *substExpr( if( pSubst->isOuterJoin ){ ExprSetProperty(pNew, EP_CanBeNull); } - if( ExprHasProperty(pExpr,EP_OuterON|EP_InnerON) ){ - sqlite3SetJoinExpr(pNew, pExpr->w.iJoin, - pExpr->flags & (EP_OuterON|EP_InnerON)); - } - sqlite3ExprDelete(db, pExpr); - pExpr = pNew; - if( pExpr->op==TK_TRUEFALSE ){ - pExpr->u.iValue = sqlite3ExprTruthValue(pExpr); - pExpr->op = TK_INTEGER; - ExprSetProperty(pExpr, EP_IntValue); + if( pNew->op==TK_TRUEFALSE ){ + pNew->u.iValue = sqlite3ExprTruthValue(pNew); + pNew->op = TK_INTEGER; + ExprSetProperty(pNew, EP_IntValue); } /* Ensure that the expression now has an implicit collation sequence, ** just as it did when it was a column of a view or sub-query. */ { - CollSeq *pNat = sqlite3ExprCollSeq(pSubst->pParse, pExpr); + CollSeq *pNat = sqlite3ExprCollSeq(pSubst->pParse, pNew); CollSeq *pColl = sqlite3ExprCollSeq(pSubst->pParse, pSubst->pCList->a[iColumn].pExpr ); - if( pNat!=pColl || (pExpr->op!=TK_COLUMN && pExpr->op!=TK_COLLATE) ){ - pExpr = sqlite3ExprAddCollateString(pSubst->pParse, pExpr, + if( pNat!=pColl || (pNew->op!=TK_COLUMN && pNew->op!=TK_COLLATE) ){ + pNew = sqlite3ExprAddCollateString(pSubst->pParse, pNew, (pColl ? pColl->zName : "BINARY") ); } } - ExprClearProperty(pExpr, EP_Collate); + ExprClearProperty(pNew, EP_Collate); + if( ExprHasProperty(pExpr,EP_OuterON|EP_InnerON) ){ + sqlite3SetJoinExpr(pNew, pExpr->w.iJoin, + pExpr->flags & (EP_OuterON|EP_InnerON)); + } + sqlite3ExprDelete(db, pExpr); + pExpr = pNew; } } }else{ @@ -142236,7 +147688,9 @@ static void substSelect( pSrc = p->pSrc; assert( pSrc!=0 ); for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ - substSelect(pSubst, pItem->pSelect, 1); + if( pItem->fg.isSubquery ){ + substSelect(pSubst, pItem->u4.pSubq->pSelect, 1); + } if( pItem->fg.isTabFunc ){ substExprList(pSubst, pItem->u1.pFuncArg); } @@ -142267,7 +147721,7 @@ static void recomputeColumnsUsed( SrcItem *pSrcItem /* Which FROM clause item to recompute */ ){ Walker w; - if( NEVER(pSrcItem->pTab==0) ) return; + if( NEVER(pSrcItem->pSTab==0) ) return; memset(&w, 0, sizeof(w)); w.xExprCallback = recomputeColumnsUsedExpr; w.xSelectCallback = sqlite3SelectWalkNoop; @@ -142307,8 +147761,10 @@ static void srclistRenumberCursors( aCsrMap[pItem->iCursor+1] = pParse->nTab++; } pItem->iCursor = aCsrMap[pItem->iCursor+1]; - for(p=pItem->pSelect; p; p=p->pPrior){ - srclistRenumberCursors(pParse, aCsrMap, p->pSrc, -1); + if( pItem->fg.isSubquery ){ + for(p=pItem->u4.pSubq->pSelect; p; p=p->pPrior){ + srclistRenumberCursors(pParse, aCsrMap, p->pSrc, -1); + } } } } @@ -142482,7 +147938,7 @@ static int compoundHasDifferentAffinities(Select *p){ ** (9) If the subquery uses LIMIT then the outer query may not be aggregate. ** ** (**) Restriction (10) was removed from the code on 2005-02-05 but we -** accidently carried the comment forward until 2014-09-15. Original +** accidentally carried the comment forward until 2014-09-15. Original ** constraint: "If the subquery is aggregate then the outer query ** may not use LIMIT." ** @@ -142517,8 +147973,7 @@ static int compoundHasDifferentAffinities(Select *p){ ** query or there are no RIGHT or FULL JOINs in any arm ** of the subquery. (This is a duplicate of condition (27b).) ** (17h) The corresponding result set expressions in all arms of the -** compound must have the same affinity. (See restriction (9) -** on the push-down optimization.) +** compound must have the same affinity. ** ** The parent and sub-query may contain WHERE clauses. Subject to ** rules (11), (13) and (14), they may also contain ORDER BY, @@ -142575,7 +148030,8 @@ static int compoundHasDifferentAffinities(Select *p){ ** (27b) the subquery is a compound query and the RIGHT JOIN occurs ** in any arm of the compound query. (See also (17g).) ** -** (28) The subquery is not a MATERIALIZED CTE. +** (28) The subquery is not a MATERIALIZED CTE. (This is handled +** in the caller before ever reaching this routine.) ** ** ** In this routine, the "p" parameter is a pointer to the outer query. @@ -142619,7 +148075,8 @@ static int flattenSubquery( assert( pSrc && iFrom>=0 && iFromnSrc ); pSubitem = &pSrc->a[iFrom]; iParent = pSubitem->iCursor; - pSub = pSubitem->pSelect; + assert( pSubitem->fg.isSubquery ); + pSub = pSubitem->u4.pSubq->pSelect; assert( pSub!=0 ); #ifndef SQLITE_OMIT_WINDOWFUNC @@ -142672,7 +148129,7 @@ static int flattenSubquery( */ if( (pSubitem->fg.jointype & (JT_OUTER|JT_LTORJ))!=0 ){ if( pSubSrc->nSrc>1 /* (3a) */ - || IsVirtual(pSubSrc->a[0].pTab) /* (3b) */ + || IsVirtual(pSubSrc->a[0].pSTab) /* (3b) */ || (p->selFlags & SF_Distinct)!=0 /* (3d) */ || (pSubitem->fg.jointype & JT_RIGHT)!=0 /* (26) */ ){ @@ -142685,9 +148142,9 @@ static int flattenSubquery( if( iFrom>0 && (pSubSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ return 0; /* Restriction (27a) */ } - if( pSubitem->fg.isCte && pSubitem->u2.pCteUse->eM10d==M10d_Yes ){ - return 0; /* (28) */ - } + + /* Condition (28) is blocked by the caller */ + assert( !pSubitem->fg.isCte || pSubitem->u2.pCteUse->eM10d!=M10d_Yes ); /* Restriction (17): If the sub-query is a compound SELECT, then it must ** use only the UNION ALL operator. And none of the simple select queries @@ -142757,15 +148214,19 @@ static int flattenSubquery( testcase( i==SQLITE_DENY ); pParse->zAuthContext = zSavedAuthContext; - /* Delete the transient structures associated with thesubquery */ - pSub1 = pSubitem->pSelect; - sqlite3DbFree(db, pSubitem->zDatabase); + /* Delete the transient structures associated with the subquery */ + + if( ALWAYS(pSubitem->fg.isSubquery) ){ + pSub1 = sqlite3SubqueryDetach(db, pSubitem); + }else{ + pSub1 = 0; + } + assert( pSubitem->fg.isSubquery==0 ); + assert( pSubitem->fg.fixedSchema==0 ); sqlite3DbFree(db, pSubitem->zName); sqlite3DbFree(db, pSubitem->zAlias); - pSubitem->zDatabase = 0; pSubitem->zName = 0; pSubitem->zAlias = 0; - pSubitem->pSelect = 0; assert( pSubitem->fg.isUsing!=0 || pSubitem->u3.pOn==0 ); /* If the sub-query is a compound SELECT statement, then (by restrictions @@ -142806,8 +148267,8 @@ static int flattenSubquery( ExprList *pOrderBy = p->pOrderBy; Expr *pLimit = p->pLimit; Select *pPrior = p->pPrior; - Table *pItemTab = pSubitem->pTab; - pSubitem->pTab = 0; + Table *pItemTab = pSubitem->pSTab; + pSubitem->pSTab = 0; p->pOrderBy = 0; p->pPrior = 0; p->pLimit = 0; @@ -142815,7 +148276,7 @@ static int flattenSubquery( p->pLimit = pLimit; p->pOrderBy = pOrderBy; p->op = TK_ALL; - pSubitem->pTab = pItemTab; + pSubitem->pSTab = pItemTab; if( pNew==0 ){ p->pPrior = pPrior; }else{ @@ -142830,11 +148291,14 @@ static int flattenSubquery( TREETRACE(0x4,pParse,p,("compound-subquery flattener" " creates %u as peer\n",pNew->selId)); } - assert( pSubitem->pSelect==0 ); + assert( pSubitem->fg.isSubquery==0 ); } sqlite3DbFree(db, aCsrMap); if( db->mallocFailed ){ - pSubitem->pSelect = pSub1; + assert( pSubitem->fg.fixedSchema==0 ); + assert( pSubitem->fg.isSubquery==0 ); + assert( pSubitem->u4.zDatabase==0 ); + sqlite3SrcItemAttachSubquery(pParse, pSubitem, pSub1, 0); return 1; } @@ -142845,18 +148309,16 @@ static int flattenSubquery( ** ** pSubitem->pTab is always non-NULL by test restrictions and tests above. */ - if( ALWAYS(pSubitem->pTab!=0) ){ - Table *pTabToDel = pSubitem->pTab; + if( ALWAYS(pSubitem->pSTab!=0) ){ + Table *pTabToDel = pSubitem->pSTab; if( pTabToDel->nTabRef==1 ){ Parse *pToplevel = sqlite3ParseToplevel(pParse); - sqlite3ParserAddCleanup(pToplevel, - (void(*)(sqlite3*,void*))sqlite3DeleteTable, - pTabToDel); + sqlite3ParserAddCleanup(pToplevel, sqlite3DeleteTableGeneric, pTabToDel); testcase( pToplevel->earlyCleanup ); }else{ pTabToDel->nTabRef--; } - pSubitem->pTab = 0; + pSubitem->pSTab = 0; } /* The following loop runs once for each term in a compound-subquery @@ -142912,8 +148374,11 @@ static int flattenSubquery( */ for(i=0; ia[i+iFrom]; - if( pItem->fg.isUsing ) sqlite3IdListDelete(db, pItem->u3.pUsing); assert( pItem->fg.isTabFunc==0 ); + assert( pItem->fg.isSubquery + || pItem->fg.fixedSchema + || pItem->u4.zDatabase==0 ); + if( pItem->fg.isUsing ) sqlite3IdListDelete(db, pItem->u3.pUsing); *pItem = pSubSrc->a[i]; pItem->fg.jointype |= ltorj; iNewParent = pSubSrc->a[i].iCursor; @@ -142939,7 +148404,7 @@ static int flattenSubquery( ** ORDER BY column expression is identical to the iOrderByCol'th ** expression returned by SELECT statement pSub. Since these values ** do not necessarily correspond to columns in SELECT statement pParent, - ** zero them before transfering the ORDER BY clause. + ** zero them before transferring the ORDER BY clause. ** ** Not doing this may cause an error if a subsequent call to this ** function attempts to flatten a compound sub-query into pParent @@ -142999,8 +148464,7 @@ static int flattenSubquery( } } - /* Finially, delete what is left of the subquery and return - ** success. + /* Finally, delete what is left of the subquery and return success. */ sqlite3AggInfoPersistWalkerInit(&w, pParse); sqlite3WalkSelect(&w,pSub1); @@ -143035,7 +148499,7 @@ struct WhereConst { /* ** Add a new entry to the pConst object. Except, do not add duplicate -** pColumn entires. Also, do not add if doing so would not be appropriate. +** pColumn entries. Also, do not add if doing so would not be appropriate. ** ** The caller guarantees the pColumn is a column and pValue is a constant. ** This routine has to do some additional checks before completing the @@ -143049,7 +148513,7 @@ static void constInsert( ){ int i; assert( pColumn->op==TK_COLUMN ); - assert( sqlite3ExprIsConstant(pValue) ); + assert( sqlite3ExprIsConstant(pConst->pParse, pValue) ); if( ExprHasProperty(pColumn, EP_FixedCol) ) return; if( sqlite3ExprAffinity(pValue)!=0 ) return; @@ -143107,10 +148571,10 @@ static void findConstInWhere(WhereConst *pConst, Expr *pExpr){ pLeft = pExpr->pLeft; assert( pRight!=0 ); assert( pLeft!=0 ); - if( pRight->op==TK_COLUMN && sqlite3ExprIsConstant(pLeft) ){ + if( pRight->op==TK_COLUMN && sqlite3ExprIsConstant(pConst->pParse, pLeft) ){ constInsert(pConst,pRight,pLeft,pExpr); } - if( pLeft->op==TK_COLUMN && sqlite3ExprIsConstant(pRight) ){ + if( pLeft->op==TK_COLUMN && sqlite3ExprIsConstant(pConst->pParse, pRight) ){ constInsert(pConst,pLeft,pRight,pExpr); } } @@ -143221,7 +148685,7 @@ static int propagateConstantExprRewrite(Walker *pWalker, Expr *pExpr){ ** SELECT * FROM t1 WHERE a=123 AND b=123; ** ** The two SELECT statements above should return different answers. b=a -** is alway true because the comparison uses numeric affinity, but b=123 +** is always true because the comparison uses numeric affinity, but b=123 ** is false because it uses text affinity and '0123' is not the same as '123'. ** To work around this, the expression tree is not actually changed from ** "b=a" to "b=123" but rather the "a" in "b=a" is tagged with EP_FixedCol @@ -143305,7 +148769,7 @@ static int propagateConstants( ** At the time this function is called it is guaranteed that ** ** * the sub-query uses only one distinct window frame, and -** * that the window frame has a PARTITION BY clase. +** * that the window frame has a PARTITION BY clause. */ static int pushDownWindowCheck(Parse *pParse, Select *pSubq, Expr *pExpr){ assert( pSubq->pWin->pPartition ); @@ -143331,6 +148795,19 @@ static int pushDownWindowCheck(Parse *pParse, Select *pSubq, Expr *pExpr){ ** The hope is that the terms added to the inner query will make it more ** efficient. ** +** NAME AMBIGUITY +** +** This optimization is called the "WHERE-clause push-down optimization" +** or sometimes the "predicate push-down optimization". +** +** Do not confuse this optimization with another unrelated optimization +** with a similar name: The "MySQL push-down optimization" causes WHERE +** clause terms that can be evaluated using only the index and without +** reference to the table are run first, so that if they are false, +** unnecessary table seeks are avoided. +** +** RULES +** ** Do not attempt this optimization if: ** ** (1) (** This restriction was removed on 2017-09-29. We used to @@ -143386,10 +148863,28 @@ static int pushDownWindowCheck(Parse *pParse, Select *pSubq, Expr *pExpr){ ** or EXCEPT, then all of the result set columns for all arms of ** the compound must use the BINARY collating sequence. ** -** (9) If the subquery is a compound, then all arms of the compound must -** have the same affinity. (This is the same as restriction (17h) -** for query flattening.) +** (9) All three of the following are true: ** +** (9a) The WHERE clause expression originates in the ON or USING clause +** of a join (either an INNER or an OUTER join), and +** +** (9b) The subquery is to the right of the ON/USING clause +** +** (9c) There is a RIGHT JOIN (or FULL JOIN) in between the ON/USING +** clause and the subquery. +** +** Without this restriction, the WHERE-clause push-down optimization +** might move the ON/USING filter expression from the left side of a +** RIGHT JOIN over to the right side, which leads to incorrect answers. +** See also restriction (6) in sqlite3ExprIsSingleTableConstraint(). +** +** (10) The inner query is not the right-hand table of a RIGHT JOIN. +** +** (11) The subquery is not a VALUES clause +** +** (12) The WHERE clause is not "rowid ISNULL" or the equivalent. This +** case only comes up if SQLite is compiled using +** SQLITE_ALLOW_ROWID_IN_VIEW. ** ** Return 0 if no changes are made and non-zero if one or more WHERE clause ** terms are duplicated into the subquery. @@ -143398,13 +148893,20 @@ static int pushDownWhereTerms( Parse *pParse, /* Parse context (for malloc() and error reporting) */ Select *pSubq, /* The subquery whose WHERE clause is to be augmented */ Expr *pWhere, /* The WHERE clause of the outer query */ - SrcItem *pSrc /* The subquery term of the outer FROM clause */ + SrcList *pSrcList, /* The complete from clause of the outer query */ + int iSrc /* Which FROM clause term to try to push into */ ){ Expr *pNew; + SrcItem *pSrc; /* The subquery FROM term into which WHERE is pushed */ int nChng = 0; + pSrc = &pSrcList->a[iSrc]; if( pWhere==0 ) return 0; - if( pSubq->selFlags & (SF_Recursive|SF_MultiPart) ) return 0; - if( pSrc->fg.jointype & (JT_LTORJ|JT_RIGHT) ) return 0; + if( pSubq->selFlags & (SF_Recursive|SF_MultiPart) ){ + return 0; /* restrictions (2) and (11) */ + } + if( pSrc->fg.jointype & (JT_LTORJ|JT_RIGHT) ){ + return 0; /* restrictions (10) */ + } if( pSubq->pPrior ){ Select *pSel; @@ -143420,9 +148922,6 @@ static int pushDownWhereTerms( if( pSel->pWin ) return 0; /* restriction (6b) */ #endif } - if( compoundHasDifferentAffinities(pSubq) ){ - return 0; /* restriction (9) */ - } if( notUnionAll ){ /* If any of the compound arms are connected using UNION, INTERSECT, ** or EXCEPT, then we must ensure that none of the columns use a @@ -143462,11 +148961,28 @@ static int pushDownWhereTerms( return 0; /* restriction (3) */ } while( pWhere->op==TK_AND ){ - nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight, pSrc); + nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight, pSrcList, iSrc); pWhere = pWhere->pLeft; } -#if 0 /* Legacy code. Checks now done by sqlite3ExprIsTableConstraint() */ +#if 0 /* These checks now done by sqlite3ExprIsSingleTableConstraint() */ + if( ExprHasProperty(pWhere, EP_OuterON|EP_InnerON) /* (9a) */ + && (pSrcList->a[0].fg.jointype & JT_LTORJ)!=0 /* Fast pre-test of (9c) */ + ){ + int jj; + for(jj=0; jjw.iJoin==pSrcList->a[jj].iCursor ){ + /* If we reach this point, both (9a) and (9b) are satisfied. + ** The following loop checks (9c): + */ + for(jj++; jja[jj].fg.jointype & JT_RIGHT)!=0 ){ + return 0; /* restriction (9) */ + } + } + } + } + } if( isLeftJoin && (ExprHasProperty(pWhere,EP_OuterON)==0 || pWhere->w.iJoin!=iCursor) @@ -143480,7 +148996,19 @@ static int pushDownWhereTerms( } #endif - if( sqlite3ExprIsTableConstraint(pWhere, pSrc) ){ +#ifdef SQLITE_ALLOW_ROWID_IN_VIEW + if( ViewCanHaveRowid && (pWhere->op==TK_ISNULL || pWhere->op==TK_NOTNULL) ){ + Expr *pLeft = pWhere->pLeft; + if( ALWAYS(pLeft) + && pLeft->op==TK_COLUMN + && pLeft->iColumn < 0 + ){ + return 0; /* Restriction (12) */ + } + } +#endif + + if( sqlite3ExprIsSingleTableConstraint(pWhere, pSrcList, iSrc, 1) ){ nChng++; pSubq->selFlags |= SF_PushDown; while( pSubq ){ @@ -143514,6 +149042,78 @@ static int pushDownWhereTerms( } #endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ +/* +** Check to see if a subquery contains result-set columns that are +** never used. If it does, change the value of those result-set columns +** to NULL so that they do not cause unnecessary work to compute. +** +** Return the number of column that were changed to NULL. +*/ +static int disableUnusedSubqueryResultColumns(SrcItem *pItem){ + int nCol; + Select *pSub; /* The subquery to be simplified */ + Select *pX; /* For looping over compound elements of pSub */ + Table *pTab; /* The table that describes the subquery */ + int j; /* Column number */ + int nChng = 0; /* Number of columns converted to NULL */ + Bitmask colUsed; /* Columns that may not be NULLed out */ + + assert( pItem!=0 ); + if( pItem->fg.isCorrelated || pItem->fg.isCte ){ + return 0; + } + assert( pItem->pSTab!=0 ); + pTab = pItem->pSTab; + assert( pItem->fg.isSubquery ); + pSub = pItem->u4.pSubq->pSelect; + assert( pSub->pEList->nExpr==pTab->nCol ); + for(pX=pSub; pX; pX=pX->pPrior){ + if( (pX->selFlags & (SF_Distinct|SF_Aggregate))!=0 ){ + testcase( pX->selFlags & SF_Distinct ); + testcase( pX->selFlags & SF_Aggregate ); + return 0; + } + if( pX->pPrior && pX->op!=TK_ALL ){ + /* This optimization does not work for compound subqueries that + ** use UNION, INTERSECT, or EXCEPT. Only UNION ALL is allowed. */ + return 0; + } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( pX->pWin ){ + /* This optimization does not work for subqueries that use window + ** functions. */ + return 0; + } +#endif + } + colUsed = pItem->colUsed; + if( pSub->pOrderBy ){ + ExprList *pList = pSub->pOrderBy; + for(j=0; jnExpr; j++){ + u16 iCol = pList->a[j].u.x.iOrderByCol; + if( iCol>0 ){ + iCol--; + colUsed |= ((Bitmask)1)<<(iCol>=BMS ? BMS-1 : iCol); + } + } + } + nCol = pTab->nCol; + for(j=0; jpPrior) { + Expr *pY = pX->pEList->a[j].pExpr; + if( pY->op==TK_NULL ) continue; + pY->op = TK_NULL; + ExprClearProperty(pY, EP_Skip|EP_Unlikely); + pX->selFlags |= SF_PushDown; + nChng++; + } + } + return nChng; +} + + /* ** The pFunc is the only aggregate function in the query. Check to see ** if the query is a candidate for the min/max optimization. @@ -143594,13 +149194,13 @@ static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ if( p->pWhere || p->pEList->nExpr!=1 || p->pSrc->nSrc!=1 - || p->pSrc->a[0].pSelect + || p->pSrc->a[0].fg.isSubquery || pAggInfo->nFunc!=1 || p->pHaving ){ return 0; } - pTab = p->pSrc->a[0].pTab; + pTab = p->pSrc->a[0].pSTab; assert( pTab!=0 ); assert( !IsView(pTab) ); if( !IsOrdinaryTable(pTab) ) return 0; @@ -143625,7 +149225,7 @@ static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ ** pFrom->pIndex and return SQLITE_OK. */ SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *pParse, SrcItem *pFrom){ - Table *pTab = pFrom->pTab; + Table *pTab = pFrom->pSTab; char *zIndexedBy = pFrom->u1.zIndexedBy; Index *pIdx; assert( pTab!=0 ); @@ -143702,7 +149302,11 @@ static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){ if( pNew==0 ) return WRC_Abort; memset(&dummy, 0, sizeof(dummy)); pNewSrc = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&dummy,pNew,0); - if( pNewSrc==0 ) return WRC_Abort; + assert( pNewSrc!=0 || pParse->nErr ); + if( pParse->nErr ){ + sqlite3SrcListDelete(db, pNewSrc); + return WRC_Abort; + } *pNew = *p; p->pSrc = pNewSrc; p->pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ASTERISK, 0)); @@ -143757,7 +149361,7 @@ static struct Cte *searchWith( ){ const char *zName = pItem->zName; With *p; - assert( pItem->zDatabase==0 ); + assert( pItem->fg.fixedSchema || pItem->u4.zDatabase==0 ); assert( zName!=0 ); for(p=pWith; p; p=p->pOuter){ int i; @@ -143792,8 +149396,7 @@ static struct Cte *searchWith( SQLITE_PRIVATE With *sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){ if( pWith ){ if( bFree ){ - pWith = (With*)sqlite3ParserAddCleanup(pParse, - (void(*)(sqlite3*,void*))sqlite3WithDelete, + pWith = (With*)sqlite3ParserAddCleanup(pParse, sqlite3WithDeleteGeneric, pWith); if( pWith==0 ) return 0; } @@ -143828,7 +149431,7 @@ static int resolveFromTermToCte( Cte *pCte; /* Matched CTE (or NULL if no match) */ With *pWith; /* The matching WITH */ - assert( pFrom->pTab==0 ); + assert( pFrom->pSTab==0 ); if( pParse->pWith==0 ){ /* There are no WITH clauses in the stack. No match is possible */ return 0; @@ -143838,7 +149441,8 @@ static int resolveFromTermToCte( ** go no further. */ return 0; } - if( pFrom->zDatabase!=0 ){ + assert( pFrom->fg.hadSchema==0 || pFrom->fg.notCte!=0 ); + if( pFrom->fg.fixedSchema==0 && pFrom->u4.zDatabase!=0 ){ /* The FROM term contains a schema qualifier (ex: main.t1) and so ** it cannot possibly be a CTE reference. */ return 0; @@ -143874,7 +149478,7 @@ static int resolveFromTermToCte( } if( cannotBeFunction(pParse, pFrom) ) return 2; - assert( pFrom->pTab==0 ); + assert( pFrom->pSTab==0 ); pTab = sqlite3DbMallocZero(db, sizeof(Table)); if( pTab==0 ) return 2; pCteUse = pCte->pUse; @@ -143888,26 +149492,29 @@ static int resolveFromTermToCte( } pCteUse->eM10d = pCte->eM10d; } - pFrom->pTab = pTab; + pFrom->pSTab = pTab; pTab->nTabRef = 1; pTab->zName = sqlite3DbStrDup(db, pCte->zName); pTab->iPKey = -1; pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); pTab->tabFlags |= TF_Ephemeral | TF_NoVisibleRowid; - pFrom->pSelect = sqlite3SelectDup(db, pCte->pSelect, 0); + sqlite3SrcItemAttachSubquery(pParse, pFrom, pCte->pSelect, 1); if( db->mallocFailed ) return 2; - pFrom->pSelect->selFlags |= SF_CopyCte; - assert( pFrom->pSelect ); + assert( pFrom->fg.isSubquery && pFrom->u4.pSubq ); + pSel = pFrom->u4.pSubq->pSelect; + assert( pSel!=0 ); + pSel->selFlags |= SF_CopyCte; if( pFrom->fg.isIndexedBy ){ sqlite3ErrorMsg(pParse, "no such index: \"%s\"", pFrom->u1.zIndexedBy); return 2; } + assert( !pFrom->fg.isIndexedBy ); pFrom->fg.isCte = 1; pFrom->u2.pCteUse = pCteUse; pCteUse->nUse++; /* Check if this is a recursive CTE. */ - pRecTerm = pSel = pFrom->pSelect; + pRecTerm = pSel; bMayRecursive = ( pSel->op==TK_ALL || pSel->op==TK_UNION ); while( bMayRecursive && pRecTerm->op==pSel->op ){ int i; @@ -143915,11 +149522,13 @@ static int resolveFromTermToCte( assert( pRecTerm->pPrior!=0 ); for(i=0; inSrc; i++){ SrcItem *pItem = &pSrc->a[i]; - if( pItem->zDatabase==0 - && pItem->zName!=0 + if( pItem->zName!=0 + && !pItem->fg.hadSchema + && ALWAYS( !pItem->fg.isSubquery ) + && (pItem->fg.fixedSchema || pItem->u4.zDatabase==0) && 0==sqlite3StrICmp(pItem->zName, pCte->zName) ){ - pItem->pTab = pTab; + pItem->pSTab = pTab; pTab->nTabRef++; pItem->fg.isRecursive = 1; if( pRecTerm->selFlags & SF_Recursive ){ @@ -144021,11 +149630,14 @@ SQLITE_PRIVATE void sqlite3SelectPopWith(Walker *pWalker, Select *p){ ** SQLITE_NOMEM. */ SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse *pParse, SrcItem *pFrom){ - Select *pSel = pFrom->pSelect; + Select *pSel; Table *pTab; + assert( pFrom->fg.isSubquery ); + assert( pFrom->u4.pSubq!=0 ); + pSel = pFrom->u4.pSubq->pSelect; assert( pSel ); - pFrom->pTab = pTab = sqlite3DbMallocZero(pParse->db, sizeof(Table)); + pFrom->pSTab = pTab = sqlite3DbMallocZero(pParse->db, sizeof(Table)); if( pTab==0 ) return SQLITE_NOMEM; pTab->nTabRef = 1; if( pFrom->zAlias ){ @@ -144036,12 +149648,14 @@ SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse *pParse, SrcItem *pFrom){ while( pSel->pPrior ){ pSel = pSel->pPrior; } sqlite3ColumnsFromExprList(pParse, pSel->pEList,&pTab->nCol,&pTab->aCol); pTab->iPKey = -1; + pTab->eTabType = TABTYP_VIEW; pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); #ifndef SQLITE_ALLOW_ROWID_IN_VIEW /* The usual case - do not allow ROWID on a subquery */ pTab->tabFlags |= TF_Ephemeral | TF_NoVisibleRowid; #else - pTab->tabFlags |= TF_Ephemeral; /* Legacy compatibility mode */ + /* Legacy compatibility mode */ + pTab->tabFlags |= TF_Ephemeral | sqlite3Config.mNoVisibleRowid; #endif return pParse->nErr ? SQLITE_ERROR : SQLITE_OK; } @@ -144143,33 +149757,35 @@ static int selectExpander(Walker *pWalker, Select *p){ */ for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ Table *pTab; - assert( pFrom->fg.isRecursive==0 || pFrom->pTab!=0 ); - if( pFrom->pTab ) continue; + assert( pFrom->fg.isRecursive==0 || pFrom->pSTab!=0 ); + if( pFrom->pSTab ) continue; assert( pFrom->fg.isRecursive==0 ); if( pFrom->zName==0 ){ #ifndef SQLITE_OMIT_SUBQUERY - Select *pSel = pFrom->pSelect; + Select *pSel; + assert( pFrom->fg.isSubquery && pFrom->u4.pSubq!=0 ); + pSel = pFrom->u4.pSubq->pSelect; /* A sub-query in the FROM clause of a SELECT */ assert( pSel!=0 ); - assert( pFrom->pTab==0 ); + assert( pFrom->pSTab==0 ); if( sqlite3WalkSelect(pWalker, pSel) ) return WRC_Abort; if( sqlite3ExpandSubquery(pParse, pFrom) ) return WRC_Abort; #endif #ifndef SQLITE_OMIT_CTE }else if( (rc = resolveFromTermToCte(pParse, pWalker, pFrom))!=0 ){ if( rc>1 ) return WRC_Abort; - pTab = pFrom->pTab; + pTab = pFrom->pSTab; assert( pTab!=0 ); #endif }else{ /* An ordinary table or view name in the FROM clause */ - assert( pFrom->pTab==0 ); - pFrom->pTab = pTab = sqlite3LocateTableItem(pParse, 0, pFrom); + assert( pFrom->pSTab==0 ); + pFrom->pSTab = pTab = sqlite3LocateTableItem(pParse, 0, pFrom); if( pTab==0 ) return WRC_Abort; if( pTab->nTabRef>=0xffff ){ sqlite3ErrorMsg(pParse, "too many references to \"%s\": max 65535", pTab->zName); - pFrom->pTab = 0; + pFrom->pSTab = 0; return WRC_Abort; } pTab->nTabRef++; @@ -144181,7 +149797,7 @@ static int selectExpander(Walker *pWalker, Select *p){ i16 nCol; u8 eCodeOrig = pWalker->eCode; if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort; - assert( pFrom->pSelect==0 ); + assert( pFrom->fg.isSubquery==0 ); if( IsView(pTab) ){ if( (db->flags & SQLITE_EnableView)==0 && pTab->pSchema!=db->aDb[1].pSchema @@ -144189,7 +149805,7 @@ static int selectExpander(Walker *pWalker, Select *p){ sqlite3ErrorMsg(pParse, "access to view \"%s\" prohibited", pTab->zName); } - pFrom->pSelect = sqlite3SelectDup(db, pTab->u.view.pSelect, 0); + sqlite3SrcItemAttachSubquery(pParse, pFrom, pTab->u.view.pSelect, 1); } #ifndef SQLITE_OMIT_VIRTUALTABLE else if( ALWAYS(IsVirtual(pTab)) @@ -144205,7 +149821,9 @@ static int selectExpander(Walker *pWalker, Select *p){ nCol = pTab->nCol; pTab->nCol = -1; pWalker->eCode = 1; /* Turn on Select.selId renumbering */ - sqlite3WalkSelect(pWalker, pFrom->pSelect); + if( pFrom->fg.isSubquery ){ + sqlite3WalkSelect(pWalker, pFrom->u4.pSubq->pSelect); + } pWalker->eCode = eCodeOrig; pTab->nCol = nCol; } @@ -144278,13 +149896,21 @@ static int selectExpander(Walker *pWalker, Select *p){ ** expanded. */ int tableSeen = 0; /* Set to 1 when TABLE matches */ char *zTName = 0; /* text of name of TABLE */ + int iErrOfst; if( pE->op==TK_DOT ){ + assert( (selFlags & SF_NestedFrom)==0 ); assert( pE->pLeft!=0 ); assert( !ExprHasProperty(pE->pLeft, EP_IntValue) ); zTName = pE->pLeft->u.zToken; + assert( ExprUseWOfst(pE->pLeft) ); + iErrOfst = pE->pRight->w.iOfst; + }else{ + assert( ExprUseWOfst(pE) ); + iErrOfst = pE->w.iOfst; } for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ - Table *pTab = pFrom->pTab; /* Table for this data source */ + int nAdd; /* Number of cols including rowid */ + Table *pTab = pFrom->pSTab; /* Table for this data source */ ExprList *pNestedFrom; /* Result-set of a nested FROM clause */ char *zTabName; /* AS name for this data source */ const char *zSchemaName = 0; /* Schema name for this data source */ @@ -144295,12 +149921,14 @@ static int selectExpander(Walker *pWalker, Select *p){ zTabName = pTab->zName; } if( db->mallocFailed ) break; - assert( (int)pFrom->fg.isNestedFrom == IsNestedFrom(pFrom->pSelect) ); + assert( (int)pFrom->fg.isNestedFrom == IsNestedFrom(pFrom) ); if( pFrom->fg.isNestedFrom ){ - assert( pFrom->pSelect!=0 ); - pNestedFrom = pFrom->pSelect->pEList; + assert( pFrom->fg.isSubquery && pFrom->u4.pSubq ); + assert( pFrom->u4.pSubq->pSelect!=0 ); + pNestedFrom = pFrom->u4.pSubq->pSelect->pEList; assert( pNestedFrom!=0 ); assert( pNestedFrom->nExpr==pTab->nCol ); + assert( VisibleRowid(pTab)==0 || ViewCanHaveRowid ); }else{ if( zTName && sqlite3StrICmp(zTName, zTabName)!=0 ){ continue; @@ -144318,6 +149946,7 @@ static int selectExpander(Walker *pWalker, Select *p){ for(ii=0; iinId; ii++){ const char *zUName = pUsing->a[ii].zName; pRight = sqlite3Expr(db, TK_ID, zUName); + sqlite3ExprSetErrorOffset(pRight, iErrOfst); pNew = sqlite3ExprListAppend(pParse, pNew, pRight); if( pNew ){ struct ExprList_item *pX = &pNew->a[pNew->nExpr-1]; @@ -144330,33 +149959,49 @@ static int selectExpander(Walker *pWalker, Select *p){ }else{ pUsing = 0; } - for(j=0; jnCol; j++){ - char *zName = pTab->aCol[j].zCnName; + + nAdd = pTab->nCol; + if( VisibleRowid(pTab) && (selFlags & SF_NestedFrom)!=0 ) nAdd++; + for(j=0; ja[j], 0, zTName, 0)==0 - ){ - continue; - } + if( j==pTab->nCol ){ + zName = sqlite3RowidAlias(pTab); + if( zName==0 ) continue; + }else{ + zName = pTab->aCol[j].zCnName; - /* If a column is marked as 'hidden', omit it from the expanded - ** result-set list unless the SELECT has the SF_IncludeHidden - ** bit set. - */ - if( (p->selFlags & SF_IncludeHidden)==0 - && IsHiddenColumn(&pTab->aCol[j]) - ){ - continue; - } - if( (pTab->aCol[j].colFlags & COLFLAG_NOEXPAND)!=0 - && zTName==0 - && (selFlags & (SF_NestedFrom))==0 - ){ - continue; + /* If pTab is actually an SF_NestedFrom sub-select, do not + ** expand any ENAME_ROWID columns. */ + if( pNestedFrom && pNestedFrom->a[j].fg.eEName==ENAME_ROWID ){ + continue; + } + + if( zTName + && pNestedFrom + && sqlite3MatchEName(&pNestedFrom->a[j], 0, zTName, 0, 0)==0 + ){ + continue; + } + + /* If a column is marked as 'hidden', omit it from the expanded + ** result-set list unless the SELECT has the SF_IncludeHidden + ** bit set. + */ + if( (p->selFlags & SF_IncludeHidden)==0 + && IsHiddenColumn(&pTab->aCol[j]) + ){ + continue; + } + if( (pTab->aCol[j].colFlags & COLFLAG_NOEXPAND)!=0 + && zTName==0 + && (selFlags & (SF_NestedFrom))==0 + ){ + continue; + } } + assert( zName ); tableSeen = 1; if( i>0 && zTName==0 && (selFlags & SF_NestedFrom)==0 ){ @@ -144390,6 +150035,7 @@ static int selectExpander(Walker *pWalker, Select *p){ }else{ pExpr = pRight; } + sqlite3ExprSetErrorOffset(pExpr, iErrOfst); pNew = sqlite3ExprListAppend(pParse, pNew, pExpr); if( pNew==0 ){ break; /* OOM */ @@ -144397,7 +150043,8 @@ static int selectExpander(Walker *pWalker, Select *p){ pX = &pNew->a[pNew->nExpr-1]; assert( pX->zEName==0 ); if( (selFlags & SF_NestedFrom)!=0 && !IN_RENAME_OBJECT ){ - if( pNestedFrom ){ + if( pNestedFrom && (!ViewCanHaveRowid || jnExpr) ){ + assert( jnExpr ); pX->zEName = sqlite3DbStrDup(db, pNestedFrom->a[j].zEName); testcase( pX->zEName==0 ); }else{ @@ -144405,11 +150052,11 @@ static int selectExpander(Walker *pWalker, Select *p){ zSchemaName, zTabName, zName); testcase( pX->zEName==0 ); } - pX->fg.eEName = ENAME_TAB; + pX->fg.eEName = (j==pTab->nCol ? ENAME_ROWID : ENAME_TAB); if( (pFrom->fg.isUsing && sqlite3IdListIndex(pFrom->u3.pUsing, zName)>=0) || (pUsing && sqlite3IdListIndex(pUsing, zName)>=0) - || (pTab->aCol[j].colFlags & COLFLAG_NOEXPAND)!=0 + || (jnCol && (pTab->aCol[j].colFlags & COLFLAG_NOEXPAND)) ){ pX->fg.bNoExpand = 1; } @@ -144511,20 +150158,18 @@ static void selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){ SrcList *pTabList; SrcItem *pFrom; - assert( p->selFlags & SF_Resolved ); if( p->selFlags & SF_HasTypeInfo ) return; p->selFlags |= SF_HasTypeInfo; pParse = pWalker->pParse; + assert( (p->selFlags & SF_Resolved) ); pTabList = p->pSrc; for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ - Table *pTab = pFrom->pTab; + Table *pTab = pFrom->pSTab; assert( pTab!=0 ); - if( (pTab->tabFlags & TF_Ephemeral)!=0 ){ + if( (pTab->tabFlags & TF_Ephemeral)!=0 && pFrom->fg.isSubquery ){ /* A sub-query in the FROM clause of a SELECT */ - Select *pSel = pFrom->pSelect; - if( pSel ){ - sqlite3SubqueryColumnTypes(pParse, pTab, pSel, SQLITE_AFF_NONE); - } + Select *pSel = pFrom->u4.pSubq->pSelect; + sqlite3SubqueryColumnTypes(pParse, pTab, pSel, SQLITE_AFF_NONE); } } } @@ -144584,6 +150229,8 @@ SQLITE_PRIVATE void sqlite3SelectPrep( */ static void printAggInfo(AggInfo *pAggInfo){ int ii; + sqlite3DebugPrintf("AggInfo %d/%p:\n", + pAggInfo->selId, pAggInfo); for(ii=0; iinColumn; ii++){ struct AggInfo_col *pCol = &pAggInfo->aCol[ii]; sqlite3DebugPrintf( @@ -144630,8 +150277,14 @@ static void analyzeAggFuncArgs( pNC->ncFlags |= NC_InAggFunc; for(i=0; inFunc; i++){ Expr *pExpr = pAggInfo->aFunc[i].pFExpr; + assert( pExpr->op==TK_FUNCTION || pExpr->op==TK_AGG_FUNCTION ); assert( ExprUseXList(pExpr) ); sqlite3ExprAnalyzeAggList(pNC, pExpr->x.pList); + if( pExpr->pLeft ){ + assert( pExpr->pLeft->op==TK_ORDER ); + assert( ExprUseXList(pExpr->pLeft) ); + sqlite3ExprAnalyzeAggList(pNC, pExpr->pLeft->x.pList); + } #ifndef SQLITE_OMIT_WINDOWFUNC assert( !IsWindowFunc(pExpr) ); if( ExprHasProperty(pExpr, EP_WinFunc) ){ @@ -144660,12 +150313,13 @@ static void optimizeAggregateUseOfIndexedExpr( assert( pSelect->pGroupBy!=0 ); pAggInfo->nColumn = pAggInfo->nAccumulator; if( ALWAYS(pAggInfo->nSortingColumn>0) ){ - if( pAggInfo->nColumn==0 ){ - pAggInfo->nSortingColumn = pSelect->pGroupBy->nExpr; - }else{ - pAggInfo->nSortingColumn = - pAggInfo->aCol[pAggInfo->nColumn-1].iSorterColumn+1; + int mx = pSelect->pGroupBy->nExpr - 1; + int j, k; + for(j=0; jnColumn; j++){ + k = pAggInfo->aCol[j].iSorterColumn; + if( k>mx ) mx = k; } + pAggInfo->nSortingColumn = mx+1; } analyzeAggFuncArgs(pAggInfo, pNC); #if TREETRACE_ENABLED @@ -144699,11 +150353,13 @@ static int aggregateIdxEprRefToColCallback(Walker *pWalker, Expr *pExpr){ if( pExpr->op==TK_AGG_FUNCTION ) return WRC_Continue; if( pExpr->op==TK_IF_NULL_ROW ) return WRC_Continue; pAggInfo = pExpr->pAggInfo; - assert( pExpr->iAgg>=0 && pExpr->iAggnColumn ); + if( NEVER(pExpr->iAgg>=pAggInfo->nColumn) ) return WRC_Continue; + assert( pExpr->iAgg>=0 ); pCol = &pAggInfo->aCol[pExpr->iAgg]; pExpr->op = TK_AGG_COLUMN; pExpr->iTable = pCol->iTable; pExpr->iColumn = pCol->iColumn; + ExprClearProperty(pExpr, EP_Skip|EP_Collate|EP_Unlikely); return WRC_Prune; } @@ -144734,7 +150390,7 @@ static void aggregateConvertIndexedExprRefToColumn(AggInfo *pAggInfo){ ** * The aCol[] and aFunc[] arrays may be modified ** * The AggInfoColumnReg() and AggInfoFuncReg() macros may not be used ** -** After clling this routine: +** After calling this routine: ** ** * The aCol[] and aFunc[] arrays are fixed ** * The AggInfoColumnReg() and AggInfoFuncReg() macros may be used @@ -144783,6 +150439,36 @@ static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){ pFunc->pFunc->zName)); } } + if( pFunc->iOBTab>=0 ){ + ExprList *pOBList; + KeyInfo *pKeyInfo; + int nExtra = 0; + assert( pFunc->pFExpr->pLeft!=0 ); + assert( pFunc->pFExpr->pLeft->op==TK_ORDER ); + assert( ExprUseXList(pFunc->pFExpr->pLeft) ); + assert( pFunc->pFunc!=0 ); + pOBList = pFunc->pFExpr->pLeft->x.pList; + if( !pFunc->bOBUnique ){ + nExtra++; /* One extra column for the OP_Sequence */ + } + if( pFunc->bOBPayload ){ + /* extra columns for the function arguments */ + assert( ExprUseXList(pFunc->pFExpr) ); + nExtra += pFunc->pFExpr->x.pList->nExpr; + } + if( pFunc->bUseSubtype ){ + nExtra += pFunc->pFExpr->x.pList->nExpr; + } + pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pOBList, 0, nExtra); + if( !pFunc->bOBUnique && pParse->nErr==0 ){ + pKeyInfo->nKeyField++; + } + sqlite3VdbeAddOp4(v, OP_OpenEphemeral, + pFunc->iOBTab, pOBList->nExpr+nExtra, 0, + (char*)pKeyInfo, P4_KEYINFO); + ExplainQueryPlan((pParse, 0, "USE TEMP B-TREE FOR %s(ORDER BY)", + pFunc->pFunc->zName)); + } } } @@ -144797,14 +150483,58 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ for(i=0, pF=pAggInfo->aFunc; inFunc; i++, pF++){ ExprList *pList; assert( ExprUseXList(pF->pFExpr) ); + if( pParse->nErr ) return; pList = pF->pFExpr->x.pList; + if( pF->iOBTab>=0 ){ + /* For an ORDER BY aggregate, calls to OP_AggStep were deferred. Inputs + ** were stored in emphermal table pF->iOBTab. Here, we extract those + ** inputs (in ORDER BY order) and make all calls to OP_AggStep + ** before doing the OP_AggFinal call. */ + int iTop; /* Start of loop for extracting columns */ + int nArg; /* Number of columns to extract */ + int nKey; /* Key columns to be skipped */ + int regAgg; /* Extract into this array */ + int j; /* Loop counter */ + + assert( pF->pFunc!=0 ); + nArg = pList->nExpr; + regAgg = sqlite3GetTempRange(pParse, nArg); + + if( pF->bOBPayload==0 ){ + nKey = 0; + }else{ + assert( pF->pFExpr->pLeft!=0 ); + assert( ExprUseXList(pF->pFExpr->pLeft) ); + assert( pF->pFExpr->pLeft->x.pList!=0 ); + nKey = pF->pFExpr->pLeft->x.pList->nExpr; + if( ALWAYS(!pF->bOBUnique) ) nKey++; + } + iTop = sqlite3VdbeAddOp1(v, OP_Rewind, pF->iOBTab); VdbeCoverage(v); + for(j=nArg-1; j>=0; j--){ + sqlite3VdbeAddOp3(v, OP_Column, pF->iOBTab, nKey+j, regAgg+j); + } + if( pF->bUseSubtype ){ + int regSubtype = sqlite3GetTempReg(pParse); + int iBaseCol = nKey + nArg + (pF->bOBPayload==0 && pF->bOBUnique==0); + for(j=nArg-1; j>=0; j--){ + sqlite3VdbeAddOp3(v, OP_Column, pF->iOBTab, iBaseCol+j, regSubtype); + sqlite3VdbeAddOp2(v, OP_SetSubtype, regSubtype, regAgg+j); + } + sqlite3ReleaseTempReg(pParse, regSubtype); + } + sqlite3VdbeAddOp3(v, OP_AggStep, 0, regAgg, AggInfoFuncReg(pAggInfo,i)); + sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF); + sqlite3VdbeChangeP5(v, (u8)nArg); + sqlite3VdbeAddOp2(v, OP_Next, pF->iOBTab, iTop+1); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, iTop); + sqlite3ReleaseTempRange(pParse, regAgg, nArg); + } sqlite3VdbeAddOp2(v, OP_AggFinal, AggInfoFuncReg(pAggInfo,i), pList ? pList->nExpr : 0); sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF); } } - /* ** Generate code that will update the accumulator memory cells for an ** aggregate based on the current cursor position. @@ -144813,6 +150543,13 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ ** in pAggInfo, then only populate the pAggInfo->nAccumulator accumulator ** registers if register regAcc contains 0. The caller will take care ** of setting and clearing regAcc. +** +** For an ORDER BY aggregate, the actual accumulator memory cell update +** is deferred until after all input rows have been received, so that they +** can be run in the requested order. In that case, instead of invoking +** OP_AggStep to update the accumulator, just add the arguments that would +** have been passed into OP_AggStep into the sorting ephemeral table +** (along with the appropriate sort key). */ static void updateAccumulator( Parse *pParse, @@ -144834,9 +150571,12 @@ static void updateAccumulator( int nArg; int addrNext = 0; int regAgg; + int regAggSz = 0; + int regDistinct = 0; ExprList *pList; assert( ExprUseXList(pF->pFExpr) ); assert( !IsWindowFunc(pF->pFExpr) ); + assert( pF->pFunc!=0 ); pList = pF->pFExpr->x.pList; if( ExprHasProperty(pF->pFExpr, EP_WinFunc) ){ Expr *pFilter = pF->pFExpr->y.pWin->pFilter; @@ -144860,9 +150600,55 @@ static void updateAccumulator( addrNext = sqlite3VdbeMakeLabel(pParse); sqlite3ExprIfFalse(pParse, pFilter, addrNext, SQLITE_JUMPIFNULL); } - if( pList ){ + if( pF->iOBTab>=0 ){ + /* Instead of invoking AggStep, we must push the arguments that would + ** have been passed to AggStep onto the sorting table. */ + int jj; /* Registered used so far in building the record */ + ExprList *pOBList; /* The ORDER BY clause */ + assert( pList!=0 ); + nArg = pList->nExpr; + assert( nArg>0 ); + assert( pF->pFExpr->pLeft!=0 ); + assert( pF->pFExpr->pLeft->op==TK_ORDER ); + assert( ExprUseXList(pF->pFExpr->pLeft) ); + pOBList = pF->pFExpr->pLeft->x.pList; + assert( pOBList!=0 ); + assert( pOBList->nExpr>0 ); + regAggSz = pOBList->nExpr; + if( !pF->bOBUnique ){ + regAggSz++; /* One register for OP_Sequence */ + } + if( pF->bOBPayload ){ + regAggSz += nArg; + } + if( pF->bUseSubtype ){ + regAggSz += nArg; + } + regAggSz++; /* One extra register to hold result of MakeRecord */ + regAgg = sqlite3GetTempRange(pParse, regAggSz); + regDistinct = regAgg; + sqlite3ExprCodeExprList(pParse, pOBList, regAgg, 0, SQLITE_ECEL_DUP); + jj = pOBList->nExpr; + if( !pF->bOBUnique ){ + sqlite3VdbeAddOp2(v, OP_Sequence, pF->iOBTab, regAgg+jj); + jj++; + } + if( pF->bOBPayload ){ + regDistinct = regAgg+jj; + sqlite3ExprCodeExprList(pParse, pList, regDistinct, 0, SQLITE_ECEL_DUP); + jj += nArg; + } + if( pF->bUseSubtype ){ + int kk; + int regBase = pF->bOBPayload ? regDistinct : regAgg; + for(kk=0; kknExpr; regAgg = sqlite3GetTempRange(pParse, nArg); + regDistinct = regAgg; sqlite3ExprCodeExprList(pParse, pList, regAgg, 0, SQLITE_ECEL_DUP); }else{ nArg = 0; @@ -144873,29 +150659,41 @@ static void updateAccumulator( addrNext = sqlite3VdbeMakeLabel(pParse); } pF->iDistinct = codeDistinct(pParse, eDistinctType, - pF->iDistinct, addrNext, pList, regAgg); - } - if( pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ - CollSeq *pColl = 0; - struct ExprList_item *pItem; - int j; - assert( pList!=0 ); /* pList!=0 if pF->pFunc has NEEDCOLL */ - for(j=0, pItem=pList->a; !pColl && jpExpr); - } - if( !pColl ){ - pColl = pParse->db->pDfltColl; + pF->iDistinct, addrNext, pList, regDistinct); + } + if( pF->iOBTab>=0 ){ + /* Insert a new record into the ORDER BY table */ + sqlite3VdbeAddOp3(v, OP_MakeRecord, regAgg, regAggSz-1, + regAgg+regAggSz-1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pF->iOBTab, regAgg+regAggSz-1, + regAgg, regAggSz-1); + sqlite3ReleaseTempRange(pParse, regAgg, regAggSz); + }else{ + /* Invoke the AggStep function */ + if( pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ + CollSeq *pColl = 0; + struct ExprList_item *pItem; + int j; + assert( pList!=0 ); /* pList!=0 if pF->pFunc has NEEDCOLL */ + for(j=0, pItem=pList->a; !pColl && jpExpr); + } + if( !pColl ){ + pColl = pParse->db->pDfltColl; + } + if( regHit==0 && pAggInfo->nAccumulator ) regHit = ++pParse->nMem; + sqlite3VdbeAddOp4(v, OP_CollSeq, regHit, 0, 0, + (char *)pColl, P4_COLLSEQ); } - if( regHit==0 && pAggInfo->nAccumulator ) regHit = ++pParse->nMem; - sqlite3VdbeAddOp4(v, OP_CollSeq, regHit, 0, 0, (char *)pColl, P4_COLLSEQ); + sqlite3VdbeAddOp3(v, OP_AggStep, 0, regAgg, AggInfoFuncReg(pAggInfo,i)); + sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF); + sqlite3VdbeChangeP5(v, (u8)nArg); + sqlite3ReleaseTempRange(pParse, regAgg, nArg); } - sqlite3VdbeAddOp3(v, OP_AggStep, 0, regAgg, AggInfoFuncReg(pAggInfo,i)); - sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF); - sqlite3VdbeChangeP5(v, (u8)nArg); - sqlite3ReleaseTempRange(pParse, regAgg, nArg); if( addrNext ){ sqlite3VdbeResolveLabel(v, addrNext); } + if( pParse->nErr ) return; } if( regHit==0 && pAggInfo->nAccumulator ){ regHit = regAcc; @@ -144905,6 +150703,7 @@ static void updateAccumulator( } for(i=0, pC=pAggInfo->aCol; inAccumulator; i++, pC++){ sqlite3ExprCode(pParse, pC->pCExpr, AggInfoColumnReg(pAggInfo,i)); + if( pParse->nErr ) return; } pAggInfo->directMode = 0; @@ -145020,25 +150819,28 @@ static SrcItem *isSelfJoinView( int iFirst, int iEnd /* Range of FROM-clause entries to search. */ ){ SrcItem *pItem; - assert( pThis->pSelect!=0 ); - if( pThis->pSelect->selFlags & SF_PushDown ) return 0; + Select *pSel; + assert( pThis->fg.isSubquery ); + pSel = pThis->u4.pSubq->pSelect; + assert( pSel!=0 ); + if( pSel->selFlags & SF_PushDown ) return 0; while( iFirsta[iFirst++]; - if( pItem->pSelect==0 ) continue; + if( !pItem->fg.isSubquery ) continue; if( pItem->fg.viaCoroutine ) continue; if( pItem->zName==0 ) continue; - assert( pItem->pTab!=0 ); - assert( pThis->pTab!=0 ); - if( pItem->pTab->pSchema!=pThis->pTab->pSchema ) continue; + assert( pItem->pSTab!=0 ); + assert( pThis->pSTab!=0 ); + if( pItem->pSTab->pSchema!=pThis->pSTab->pSchema ) continue; if( sqlite3_stricmp(pItem->zName, pThis->zName)!=0 ) continue; - pS1 = pItem->pSelect; - if( pItem->pTab->pSchema==0 && pThis->pSelect->selId!=pS1->selId ){ + pS1 = pItem->u4.pSubq->pSelect; + if( pItem->pSTab->pSchema==0 && pSel->selId!=pS1->selId ){ /* The query flattener left two different CTE tables with identical ** names in the same FROM clause. */ continue; } - if( pItem->pSelect->selFlags & SF_PushDown ){ + if( pS1->selFlags & SF_PushDown ){ /* The view was modified by some other optimization such as ** pushDownWhereTerms() */ continue; @@ -145051,13 +150853,13 @@ static SrcItem *isSelfJoinView( /* ** Deallocate a single AggInfo object */ -static void agginfoFree(sqlite3 *db, AggInfo *p){ +static void agginfoFree(sqlite3 *db, void *pArg){ + AggInfo *p = (AggInfo*)pArg; sqlite3DbFree(db, p->aCol); sqlite3DbFree(db, p->aFunc); sqlite3DbFreeNN(db, p); } -#ifdef SQLITE_COUNTOFVIEW_OPTIMIZATION /* ** Attempt to transform a query of the form ** @@ -145082,9 +150884,11 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ Expr *pExpr; Expr *pCount; sqlite3 *db; + SrcItem *pFrom; if( (p->selFlags & SF_Aggregate)==0 ) return 0; /* This is an aggregate */ if( p->pEList->nExpr!=1 ) return 0; /* Single result column */ if( p->pWhere ) return 0; + if( p->pHaving ) return 0; if( p->pGroupBy ) return 0; if( p->pOrderBy ) return 0; pExpr = p->pEList->a[0].pExpr; @@ -145095,8 +150899,9 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ if( pExpr->x.pList!=0 ) return 0; /* Must be count(*) */ if( p->pSrc->nSrc!=1 ) return 0; /* One table in FROM */ if( ExprHasProperty(pExpr, EP_WinFunc) ) return 0;/* Not a window function */ - pSub = p->pSrc->a[0].pSelect; - if( pSub==0 ) return 0; /* The FROM is a subquery */ + pFrom = p->pSrc->a; + if( pFrom->fg.isSubquery==0 ) return 0; /* FROM is a subquery */ + pSub = pFrom->u4.pSubq->pSelect; if( pSub->pPrior==0 ) return 0; /* Must be a compound */ if( pSub->selFlags & SF_CopyCte ) return 0; /* Not a CTE */ do{ @@ -145104,6 +150909,7 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ if( pSub->pWhere ) return 0; /* No WHERE clause */ if( pSub->pLimit ) return 0; /* No LIMIT clause */ if( pSub->selFlags & SF_Aggregate ) return 0; /* Not an aggregate */ + assert( pSub->pHaving==0 ); /* Due to the previous */ pSub = pSub->pPrior; /* Repeat over compound */ }while( pSub ); @@ -145112,8 +150918,7 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ db = pParse->db; pCount = pExpr; pExpr = 0; - pSub = p->pSrc->a[0].pSelect; - p->pSrc->a[0].pSelect = 0; + pSub = sqlite3SubqueryDetach(db, pFrom); sqlite3SrcListDelete(db, p->pSrc); p->pSrc = sqlite3DbMallocZero(pParse->db, sizeof(*p->pSrc)); while( pSub ){ @@ -145124,7 +150929,7 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ pSub->selFlags |= SF_Aggregate; pSub->selFlags &= ~SF_Compound; pSub->nSelectRow = 0; - sqlite3ExprListDelete(db, pSub->pEList); + sqlite3ParserAddCleanup(pParse, sqlite3ExprListDeleteGeneric, pSub->pEList); pTerm = pPrior ? sqlite3ExprDup(db, pCount, 0) : pCount; pSub->pEList = sqlite3ExprListAppend(pParse, 0, pTerm); pTerm = sqlite3PExpr(pParse, TK_SELECT, 0, 0); @@ -145147,7 +150952,6 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ #endif return 1; } -#endif /* SQLITE_COUNTOFVIEW_OPTIMIZATION */ /* ** If any term of pSrc, or any SF_NestedFrom sub-query, is not the same @@ -145159,12 +150963,12 @@ static int sameSrcAlias(SrcItem *p0, SrcList *pSrc){ for(i=0; inSrc; i++){ SrcItem *p1 = &pSrc->a[i]; if( p1==p0 ) continue; - if( p0->pTab==p1->pTab && 0==sqlite3_stricmp(p0->zAlias, p1->zAlias) ){ + if( p0->pSTab==p1->pSTab && 0==sqlite3_stricmp(p0->zAlias, p1->zAlias) ){ return 1; } - if( p1->pSelect - && (p1->pSelect->selFlags & SF_NestedFrom)!=0 - && sameSrcAlias(p0, p1->pSelect->pSrc) + if( p1->fg.isSubquery + && (p1->u4.pSubq->pSelect->selFlags & SF_NestedFrom)!=0 + && sameSrcAlias(p0, p1->u4.pSubq->pSelect->pSrc) ){ return 1; } @@ -145229,13 +151033,13 @@ static int fromClauseTermCanBeCoroutine( if( i==0 ) break; i--; pItem--; - if( pItem->pSelect!=0 ) return 0; /* (1c-i) */ + if( pItem->fg.isSubquery ) return 0; /* (1c-i) */ } return 1; } /* -** Generate code for the SELECT statement given in the p argument. +** Generate byte-code for the SELECT statement given in the p argument. ** ** The results are returned according to the SelectDest structure. ** See comments in sqliteInt.h for further information. @@ -145246,6 +151050,40 @@ static int fromClauseTermCanBeCoroutine( ** ** This routine does NOT free the Select structure passed in. The ** calling function needs to do that. +** +** This is a long function. The following is an outline of the processing +** steps, with tags referencing various milestones: +** +** * Resolve names and similar preparation tag-select-0100 +** * Scan of the FROM clause tag-select-0200 +** + OUTER JOIN strength reduction tag-select-0220 +** + Sub-query ORDER BY removal tag-select-0230 +** + Query flattening tag-select-0240 +** * Separate subroutine for compound-SELECT tag-select-0300 +** * WHERE-clause constant propagation tag-select-0330 +** * Count()-of-VIEW optimization tag-select-0350 +** * Scan of the FROM clause again tag-select-0400 +** + Authorize unreferenced tables tag-select-0410 +** + Predicate push-down optimization tag-select-0420 +** + Omit unused subquery columns optimization tag-select-0440 +** + Generate code to implement subqueries tag-select-0480 +** - Co-routines tag-select-0482 +** - Reuse previously computed CTE tag-select-0484 +** - REuse previously computed VIEW tag-select-0486 +** - Materialize a VIEW or CTE tag-select-0488 +** * DISTINCT ORDER BY -> GROUP BY optimization tag-select-0500 +** * Set up for ORDER BY tag-select-0600 +** * Create output table tag-select-0630 +** * Prepare registers for LIMIT tag-select-0650 +** * Setup for DISTINCT tag-select-0680 +** * Generate code for non-aggregate and non-GROUP BY tag-select-0700 +** * Generate code for aggregate and/or GROUP BY tag-select-0800 +** + GROUP BY queries tag-select-0810 +** + non-GROUP BY queries tag-select-0820 +** - Special case of count() w/o GROUP BY tag-select-0821 +** - General case of non-GROUP BY aggregates tag-select-0822 +** * Sort results, as needed tag-select-0900 +** * Internal self-checks tag-select-1000 */ SQLITE_PRIVATE int sqlite3Select( Parse *pParse, /* The parser context */ @@ -145289,6 +151127,7 @@ SQLITE_PRIVATE int sqlite3Select( } #endif + /* tag-select-0100 */ assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistFifo ); assert( p->pOrderBy==0 || pDest->eDest!=SRT_Fifo ); assert( p->pOrderBy==0 || pDest->eDest!=SRT_DistQueue ); @@ -145305,9 +151144,8 @@ SQLITE_PRIVATE int sqlite3Select( sqlite3TreeViewExprList(0, p->pOrderBy, 0, "ORDERBY"); } #endif - sqlite3ParserAddCleanup(pParse, - (void(*)(sqlite3*,void*))sqlite3ExprListDelete, - p->pOrderBy); + sqlite3ParserAddCleanup(pParse, sqlite3ExprListDeleteGeneric, + p->pOrderBy); testcase( pParse->earlyCleanup ); p->pOrderBy = 0; } @@ -145341,7 +151179,7 @@ SQLITE_PRIVATE int sqlite3Select( if( sameSrcAlias(p0, p->pSrc) ){ sqlite3ErrorMsg(pParse, "target object/alias may not appear in FROM clause: %s", - p0->zAlias ? p0->zAlias : p0->pTab->zName + p0->zAlias ? p0->zAlias : p0->pSTab->zName ); goto select_end; } @@ -145376,34 +151214,72 @@ SQLITE_PRIVATE int sqlite3Select( /* Try to do various optimizations (flattening subqueries, and strength ** reduction of join operators) in the FROM clause up into the main query + ** tag-select-0200 */ #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) for(i=0; !p->pPrior && inSrc; i++){ SrcItem *pItem = &pTabList->a[i]; - Select *pSub = pItem->pSelect; - Table *pTab = pItem->pTab; + Select *pSub = pItem->fg.isSubquery ? pItem->u4.pSubq->pSelect : 0; + Table *pTab = pItem->pSTab; /* The expander should have already created transient Table objects ** even for FROM clause elements such as subqueries that do not correspond ** to a real table */ assert( pTab!=0 ); - /* Convert LEFT JOIN into JOIN if there are terms of the right table - ** of the LEFT JOIN used in the WHERE clause. + /* Try to simplify joins: + ** + ** LEFT JOIN -> JOIN + ** RIGHT JOIN -> JOIN + ** FULL JOIN -> RIGHT JOIN + ** + ** If terms of the i-th table are used in the WHERE clause in such a + ** way that the i-th table cannot be the NULL row of a join, then + ** perform the appropriate simplification. This is called + ** "OUTER JOIN strength reduction" in the SQLite documentation. + ** tag-select-0220 */ - if( (pItem->fg.jointype & (JT_LEFT|JT_RIGHT))==JT_LEFT - && sqlite3ExprImpliesNonNullRow(p->pWhere, pItem->iCursor) + if( (pItem->fg.jointype & (JT_LEFT|JT_LTORJ))!=0 + && sqlite3ExprImpliesNonNullRow(p->pWhere, pItem->iCursor, + pItem->fg.jointype & JT_LTORJ) && OptimizationEnabled(db, SQLITE_SimplifyJoin) ){ - TREETRACE(0x1000,pParse,p, - ("LEFT-JOIN simplifies to JOIN on term %d\n",i)); - pItem->fg.jointype &= ~(JT_LEFT|JT_OUTER); - assert( pItem->iCursor>=0 ); - unsetJoinExpr(p->pWhere, pItem->iCursor, - pTabList->a[0].fg.jointype & JT_LTORJ); + if( pItem->fg.jointype & JT_LEFT ){ + if( pItem->fg.jointype & JT_RIGHT ){ + TREETRACE(0x1000,pParse,p, + ("FULL-JOIN simplifies to RIGHT-JOIN on term %d\n",i)); + pItem->fg.jointype &= ~JT_LEFT; + }else{ + TREETRACE(0x1000,pParse,p, + ("LEFT-JOIN simplifies to JOIN on term %d\n",i)); + pItem->fg.jointype &= ~(JT_LEFT|JT_OUTER); + unsetJoinExpr(p->pWhere, pItem->iCursor, 0); + } + } + if( pItem->fg.jointype & JT_LTORJ ){ + for(j=i+1; jnSrc; j++){ + SrcItem *pI2 = &pTabList->a[j]; + if( pI2->fg.jointype & JT_RIGHT ){ + if( pI2->fg.jointype & JT_LEFT ){ + TREETRACE(0x1000,pParse,p, + ("FULL-JOIN simplifies to LEFT-JOIN on term %d\n",j)); + pI2->fg.jointype &= ~JT_RIGHT; + }else{ + TREETRACE(0x1000,pParse,p, + ("RIGHT-JOIN simplifies to JOIN on term %d\n",j)); + pI2->fg.jointype &= ~(JT_RIGHT|JT_OUTER); + unsetJoinExpr(p->pWhere, pI2->iCursor, 1); + } + } + } + for(j=pTabList->nSrc-1; j>=0; j--){ + pTabList->a[j].fg.jointype &= ~JT_LTORJ; + if( pTabList->a[j].fg.jointype & JT_RIGHT ) break; + } + } } - /* No futher action if this term of the FROM clause is no a subquery */ + /* No further action if this term of the FROM clause is not a subquery */ if( pSub==0 ) continue; /* Catch mismatch in the declared columns of a view and the number of @@ -145414,6 +151290,14 @@ SQLITE_PRIVATE int sqlite3Select( goto select_end; } + /* Do not attempt the usual optimizations (flattening and ORDER BY + ** elimination) on a MATERIALIZED common table expression because + ** a MATERIALIZED common table expression is an optimization fence. + */ + if( pItem->fg.isCte && pItem->u2.pCteUse->eM10d==M10d_Yes ){ + continue; + } + /* Do not try to flatten an aggregate subquery. ** ** Flattening an aggregate subquery is only possible if the outer query @@ -145424,7 +151308,8 @@ SQLITE_PRIVATE int sqlite3Select( if( (pSub->selFlags & SF_Aggregate)!=0 ) continue; assert( pSub->pGroupBy==0 ); - /* If a FROM-clause subquery has an ORDER BY clause that is not + /* tag-select-0230: + ** If a FROM-clause subquery has an ORDER BY clause that is not ** really doing anything, then delete it now so that it does not ** interfere with query flattening. See the discussion at ** https://sqlite.org/forum/forumpost/2d76f2bcf65d256a @@ -145443,19 +151328,23 @@ SQLITE_PRIVATE int sqlite3Select( ** (a) The outer query has a different ORDER BY clause ** (b) The subquery is part of a join ** See forum post 062d576715d277c8 + ** (6) The subquery is not a recursive CTE. ORDER BY has a different + ** meaning for recursive CTEs and this optimization does not + ** apply. + ** + ** Also retain the ORDER BY if the OmitOrderBy optimization is disabled. */ if( pSub->pOrderBy!=0 && (p->pOrderBy!=0 || pTabList->nSrc>1) /* Condition (5) */ && pSub->pLimit==0 /* Condition (1) */ - && (pSub->selFlags & SF_OrderByReqd)==0 /* Condition (2) */ + && (pSub->selFlags & (SF_OrderByReqd|SF_Recursive))==0 /* (2) and (6) */ && (p->selFlags & SF_OrderByReqd)==0 /* Condition (3) and (4) */ && OptimizationEnabled(db, SQLITE_OmitOrderBy) ){ TREETRACE(0x800,pParse,p, ("omit superfluous ORDER BY on %r FROM-clause subquery\n",i+1)); - sqlite3ParserAddCleanup(pParse, - (void(*)(sqlite3*,void*))sqlite3ExprListDelete, - pSub->pOrderBy); + sqlite3ParserAddCleanup(pParse, sqlite3ExprListDeleteGeneric, + pSub->pOrderBy); pSub->pOrderBy = 0; } @@ -145486,6 +151375,7 @@ SQLITE_PRIVATE int sqlite3Select( continue; } + /* tag-select-0240 */ if( flattenSubquery(pParse, p, i, isAgg) ){ if( pParse->nErr ) goto select_end; /* This subquery can be absorbed into its parent. */ @@ -145501,7 +151391,7 @@ SQLITE_PRIVATE int sqlite3Select( #ifndef SQLITE_OMIT_COMPOUND_SELECT /* Handle compound SELECT statements using the separate multiSelect() - ** procedure. + ** procedure. tag-select-0300 */ if( p->pPrior ){ rc = multiSelect(pParse, p, pDest); @@ -145517,9 +151407,9 @@ SQLITE_PRIVATE int sqlite3Select( #endif /* Do the WHERE-clause constant propagation optimization if this is - ** a join. No need to speed time on this operation for non-join queries + ** a join. No need to spend time on this operation for non-join queries ** as the equivalent optimization will be handled by query planner in - ** sqlite3WhereBegin(). + ** sqlite3WhereBegin(). tag-select-0330 */ if( p->pWhere!=0 && p->pWhere->op==TK_AND @@ -145536,29 +151426,34 @@ SQLITE_PRIVATE int sqlite3Select( TREETRACE(0x2000,pParse,p,("Constant propagation not helpful\n")); } -#ifdef SQLITE_COUNTOFVIEW_OPTIMIZATION + /* tag-select-0350 */ if( OptimizationEnabled(db, SQLITE_QueryFlattener|SQLITE_CountOfView) && countOfViewOptimization(pParse, p) ){ if( db->mallocFailed ) goto select_end; pTabList = p->pSrc; } -#endif - /* For each term in the FROM clause, do two things: - ** (1) Authorized unreferenced tables - ** (2) Generate code for all sub-queries + /* Loop over all terms in the FROM clause and do two things for each term: + ** + ** (1) Authorize unreferenced tables + ** (2) Generate code for all sub-queries + ** + ** tag-select-0400 */ for(i=0; inSrc; i++){ SrcItem *pItem = &pTabList->a[i]; SrcItem *pPrior; SelectDest dest; + Subquery *pSubq; Select *pSub; #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) const char *zSavedAuthContext; #endif - /* Issue SQLITE_READ authorizations with a fake column name for any + /* Authorized unreferenced tables. tag-select-0410 + ** + ** Issue SQLITE_READ authorizations with a fake column name for any ** tables that are referenced but from which no values are extracted. ** Examples of where these kinds of null SQLITE_READ authorizations ** would occur: @@ -145575,17 +151470,28 @@ SQLITE_PRIVATE int sqlite3Select( ** string for the fake column name seems safer. */ if( pItem->colUsed==0 && pItem->zName!=0 ){ - sqlite3AuthCheck(pParse, SQLITE_READ, pItem->zName, "", pItem->zDatabase); + const char *zDb; + if( pItem->fg.fixedSchema ){ + int iDb = sqlite3SchemaToIndex(pParse->db, pItem->u4.pSchema); + zDb = db->aDb[iDb].zDbSName; + }else if( pItem->fg.isSubquery ){ + zDb = 0; + }else{ + zDb = pItem->u4.zDatabase; + } + sqlite3AuthCheck(pParse, SQLITE_READ, pItem->zName, "", zDb); } #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) /* Generate code for all sub-queries in the FROM clause */ - pSub = pItem->pSelect; - if( pSub==0 ) continue; + if( pItem->fg.isSubquery==0 ) continue; + pSubq = pItem->u4.pSubq; + assert( pSubq!=0 ); + pSub = pSubq->pSelect; /* The code for a subquery should only be generated once. */ - assert( pItem->addrFillSub==0 ); + if( pSubq->addrFillSub!=0 ) continue; /* Increment Parse.nHeight by the height of the largest expression ** tree referred to by this, the parent select. The child select @@ -145598,11 +151504,12 @@ SQLITE_PRIVATE int sqlite3Select( /* Make copies of constant WHERE-clause terms in the outer query down ** inside the subquery. This can help the subquery to run more efficiently. + ** This is the "predicate push-down optimization". tag-select-0420 */ if( OptimizationEnabled(db, SQLITE_PushDown) && (pItem->fg.isCte==0 || (pItem->u2.pCteUse->eM10d!=M10d_Yes && pItem->u2.pCteUse->nUse<2)) - && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem) + && pushDownWhereTerms(pParse, pSub, p->pWhere, pTabList, i) ){ #if TREETRACE_ENABLED if( sqlite3TreeTrace & 0x4000 ){ @@ -145611,40 +151518,58 @@ SQLITE_PRIVATE int sqlite3Select( sqlite3TreeViewSelect(0, p, 0); } #endif - assert( pItem->pSelect && (pItem->pSelect->selFlags & SF_PushDown)!=0 ); + assert( pSubq->pSelect && (pSub->selFlags & SF_PushDown)!=0 ); }else{ - TREETRACE(0x4000,pParse,p,("Push-down not possible\n")); + TREETRACE(0x4000,pParse,p,("WHERE-lcause push-down not possible\n")); + } + + /* Convert unused result columns of the subquery into simple NULL + ** expressions, to avoid unneeded searching and computation. + ** tag-select-0440 + */ + if( OptimizationEnabled(db, SQLITE_NullUnusedCols) + && disableUnusedSubqueryResultColumns(pItem) + ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x4000 ){ + TREETRACE(0x4000,pParse,p, + ("Change unused result columns to NULL for subquery %d:\n", + pSub->selId)); + sqlite3TreeViewSelect(0, p, 0); + } +#endif } zSavedAuthContext = pParse->zAuthContext; pParse->zAuthContext = pItem->zName; - /* Generate code to implement the subquery + /* Generate byte-code to implement the subquery tag-select-0480 */ if( fromClauseTermCanBeCoroutine(pParse, pTabList, i, p->selFlags) ){ /* Implement a co-routine that will return a single row of the result - ** set on each invocation. + ** set on each invocation. tag-select-0482 */ int addrTop = sqlite3VdbeCurrentAddr(v)+1; - pItem->regReturn = ++pParse->nMem; - sqlite3VdbeAddOp3(v, OP_InitCoroutine, pItem->regReturn, 0, addrTop); + pSubq->regReturn = ++pParse->nMem; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, pSubq->regReturn, 0, addrTop); VdbeComment((v, "%!S", pItem)); - pItem->addrFillSub = addrTop; - sqlite3SelectDestInit(&dest, SRT_Coroutine, pItem->regReturn); + pSubq->addrFillSub = addrTop; + sqlite3SelectDestInit(&dest, SRT_Coroutine, pSubq->regReturn); ExplainQueryPlan((pParse, 1, "CO-ROUTINE %!S", pItem)); sqlite3Select(pParse, pSub, &dest); - pItem->pTab->nRowLogEst = pSub->nSelectRow; + pItem->pSTab->nRowLogEst = pSub->nSelectRow; pItem->fg.viaCoroutine = 1; - pItem->regResult = dest.iSdst; - sqlite3VdbeEndCoroutine(v, pItem->regReturn); + pSubq->regResult = dest.iSdst; + sqlite3VdbeEndCoroutine(v, pSubq->regReturn); + VdbeComment((v, "end %!S", pItem)); sqlite3VdbeJumpHere(v, addrTop-1); sqlite3ClearTempRegCache(pParse); }else if( pItem->fg.isCte && pItem->u2.pCteUse->addrM9e>0 ){ /* This is a CTE for which materialization code has already been ** generated. Invoke the subroutine to compute the materialization, - ** the make the pItem->iCursor be a copy of the ephemerial table that - ** holds the result of the materialization. */ + ** then make the pItem->iCursor be a copy of the ephemeral table that + ** holds the result of the materialization. tag-select-0484 */ CteUse *pCteUse = pItem->u2.pCteUse; sqlite3VdbeAddOp2(v, OP_Gosub, pCteUse->regRtn, pCteUse->addrM9e); if( pItem->iCursor!=pCteUse->iCur ){ @@ -145654,25 +151579,30 @@ SQLITE_PRIVATE int sqlite3Select( pSub->nSelectRow = pCteUse->nRowEst; }else if( (pPrior = isSelfJoinView(pTabList, pItem, 0, i))!=0 ){ /* This view has already been materialized by a prior entry in - ** this same FROM clause. Reuse it. */ - if( pPrior->addrFillSub ){ - sqlite3VdbeAddOp2(v, OP_Gosub, pPrior->regReturn, pPrior->addrFillSub); + ** this same FROM clause. Reuse it. tag-select-0486 */ + Subquery *pPriorSubq; + assert( pPrior->fg.isSubquery ); + pPriorSubq = pPrior->u4.pSubq; + assert( pPriorSubq!=0 ); + if( pPriorSubq->addrFillSub ){ + sqlite3VdbeAddOp2(v, OP_Gosub, pPriorSubq->regReturn, + pPriorSubq->addrFillSub); } sqlite3VdbeAddOp2(v, OP_OpenDup, pItem->iCursor, pPrior->iCursor); - pSub->nSelectRow = pPrior->pSelect->nSelectRow; + pSub->nSelectRow = pPriorSubq->pSelect->nSelectRow; }else{ /* Materialize the view. If the view is not correlated, generate a ** subroutine to do the materialization so that subsequent uses of - ** the same view can reuse the materialization. */ + ** the same view can reuse the materialization. tag-select-0488 */ int topAddr; int onceAddr = 0; #ifdef SQLITE_ENABLE_STMT_SCANSTATUS int addrExplain; #endif - pItem->regReturn = ++pParse->nMem; + pSubq->regReturn = ++pParse->nMem; topAddr = sqlite3VdbeAddOp0(v, OP_Goto); - pItem->addrFillSub = topAddr+1; + pSubq->addrFillSub = topAddr+1; pItem->fg.isMaterialized = 1; if( pItem->fg.isCorrelated==0 ){ /* If the subquery is not correlated and if we are not inside of @@ -145687,17 +151617,17 @@ SQLITE_PRIVATE int sqlite3Select( ExplainQueryPlan2(addrExplain, (pParse, 1, "MATERIALIZE %!S", pItem)); sqlite3Select(pParse, pSub, &dest); - pItem->pTab->nRowLogEst = pSub->nSelectRow; + pItem->pSTab->nRowLogEst = pSub->nSelectRow; if( onceAddr ) sqlite3VdbeJumpHere(v, onceAddr); - sqlite3VdbeAddOp2(v, OP_Return, pItem->regReturn, topAddr+1); + sqlite3VdbeAddOp2(v, OP_Return, pSubq->regReturn, topAddr+1); VdbeComment((v, "end %!S", pItem)); sqlite3VdbeScanStatusRange(v, addrExplain, addrExplain, -1); sqlite3VdbeJumpHere(v, topAddr); sqlite3ClearTempRegCache(pParse); if( pItem->fg.isCte && pItem->fg.isCorrelated==0 ){ CteUse *pCteUse = pItem->u2.pCteUse; - pCteUse->addrM9e = pItem->addrFillSub; - pCteUse->regRtn = pItem->regReturn; + pCteUse->addrM9e = pSubq->addrFillSub; + pCteUse->regRtn = pSubq->regReturn; pCteUse->iCur = pItem->iCursor; pCteUse->nRowEst = pSub->nSelectRow; } @@ -145723,7 +151653,9 @@ SQLITE_PRIVATE int sqlite3Select( } #endif - /* If the query is DISTINCT with an ORDER BY but is not an aggregate, and + /* tag-select-0500 + ** + ** If the query is DISTINCT with an ORDER BY but is not an aggregate, and ** if the select-list is the same as the ORDER BY list, then this query ** can be rewritten as a GROUP BY. In other words, this: ** @@ -145740,12 +151672,18 @@ SQLITE_PRIVATE int sqlite3Select( */ if( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct && sqlite3ExprListCompare(sSort.pOrderBy, pEList, -1)==0 + && OptimizationEnabled(db, SQLITE_GroupByOrder) #ifndef SQLITE_OMIT_WINDOWFUNC && p->pWin==0 #endif ){ p->selFlags &= ~SF_Distinct; pGroupBy = p->pGroupBy = sqlite3ExprListDup(db, pEList, 0); + if( pGroupBy ){ + for(i=0; inExpr; i++){ + pGroupBy->a[i].u.x.iOrderByCol = i+1; + } + } p->selFlags |= SF_Aggregate; /* Notice that even thought SF_Distinct has been cleared from p->selFlags, ** the sDistinct.isTnct is still set. Hence, isTnct represents the @@ -145767,7 +151705,7 @@ SQLITE_PRIVATE int sqlite3Select( ** If that is the case, then the OP_OpenEphemeral instruction will be ** changed to an OP_Noop once we figure out that the sorting index is ** not needed. The sSort.addrSortIndex variable is used to facilitate - ** that change. + ** that change. tag-select-0600 */ if( sSort.pOrderBy ){ KeyInfo *pKeyInfo; @@ -145784,6 +151722,7 @@ SQLITE_PRIVATE int sqlite3Select( } /* If the output is destined for a temporary table, open that table. + ** tag-select-0630 */ if( pDest->eDest==SRT_EphemTab ){ sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pDest->iSDParm, pEList->nExpr); @@ -145801,7 +151740,7 @@ SQLITE_PRIVATE int sqlite3Select( } } - /* Set the limiter. + /* Set the limiter. tag-select-0650 */ iEnd = sqlite3VdbeMakeLabel(pParse); if( (p->selFlags & SF_FixedLimit)==0 ){ @@ -145813,7 +151752,7 @@ SQLITE_PRIVATE int sqlite3Select( sSort.sortFlags |= SORTFLAG_UseSorter; } - /* Open an ephemeral index to use for the distinct set. + /* Open an ephemeral index to use for the distinct set. tag-select-0680 */ if( p->selFlags & SF_Distinct ){ sDistinct.tabTnct = pParse->nTab++; @@ -145828,7 +151767,7 @@ SQLITE_PRIVATE int sqlite3Select( } if( !isAgg && pGroupBy==0 ){ - /* No aggregate functions and no GROUP BY clause */ + /* No aggregate functions and no GROUP BY clause. tag-select-0700 */ u16 wctrlFlags = (sDistinct.isTnct ? WHERE_WANT_DISTINCT : 0) | (p->selFlags & SF_FixedLimit); #ifndef SQLITE_OMIT_WINDOWFUNC @@ -145901,8 +151840,8 @@ SQLITE_PRIVATE int sqlite3Select( sqlite3WhereEnd(pWInfo); } }else{ - /* This case when there exist aggregate functions or a GROUP BY clause - ** or both */ + /* This case is for when there exist aggregate functions or a GROUP BY + ** clause or both. tag-select-0800 */ NameContext sNC; /* Name context for processing aggregate information */ int iAMem; /* First Mem address for storing current GROUP BY */ int iBMem; /* First Mem address for previous GROUP BY */ @@ -145970,8 +151909,7 @@ SQLITE_PRIVATE int sqlite3Select( */ pAggInfo = sqlite3DbMallocZero(db, sizeof(*pAggInfo) ); if( pAggInfo ){ - sqlite3ParserAddCleanup(pParse, - (void(*)(sqlite3*,void*))agginfoFree, pAggInfo); + sqlite3ParserAddCleanup(pParse, agginfoFree, pAggInfo); testcase( pParse->earlyCleanup ); } if( db->mallocFailed ){ @@ -146022,11 +151960,11 @@ SQLITE_PRIVATE int sqlite3Select( /* Processing for aggregates with GROUP BY is very different and - ** much more complex than aggregates without a GROUP BY. + ** much more complex than aggregates without a GROUP BY. tag-select-0810 */ if( pGroupBy ){ KeyInfo *pKeyInfo; /* Keying information for the group by clause */ - int addr1; /* A-vs-B comparision jump */ + int addr1; /* A-vs-B comparison jump */ int addrOutputRow; /* Start of subroutine that outputs a result row */ int regOutputRow; /* Return address register for output subroutine */ int addrSetAbort; /* Set the abort flag and return */ @@ -146117,9 +152055,13 @@ SQLITE_PRIVATE int sqlite3Select( int nCol; int nGroupBy; - explainTempTable(pParse, +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + int addrExp; /* Address of OP_Explain instruction */ +#endif + ExplainQueryPlan2(addrExp, (pParse, 0, "USE TEMP B-TREE FOR %s", (sDistinct.isTnct && (p->selFlags&SF_Distinct)==0) ? - "DISTINCT" : "GROUP BY"); + "DISTINCT" : "GROUP BY" + )); groupBySort = 1; nGroupBy = pGroupBy->nExpr; @@ -146144,18 +152086,23 @@ SQLITE_PRIVATE int sqlite3Select( } pAggInfo->directMode = 0; regRecord = sqlite3GetTempReg(pParse); + sqlite3VdbeScanStatusCounters(v, addrExp, 0, sqlite3VdbeCurrentAddr(v)); sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regRecord); sqlite3VdbeAddOp2(v, OP_SorterInsert, pAggInfo->sortingIdx, regRecord); + sqlite3VdbeScanStatusRange(v, addrExp, sqlite3VdbeCurrentAddr(v)-2, -1); sqlite3ReleaseTempReg(pParse, regRecord); sqlite3ReleaseTempRange(pParse, regBase, nCol); TREETRACE(0x2,pParse,p,("WhereEnd\n")); sqlite3WhereEnd(pWInfo); pAggInfo->sortingIdxPTab = sortPTab = pParse->nTab++; sortOut = sqlite3GetTempReg(pParse); + sqlite3VdbeScanStatusCounters(v, addrExp, sqlite3VdbeCurrentAddr(v), 0); sqlite3VdbeAddOp3(v, OP_OpenPseudo, sortPTab, sortOut, nCol); sqlite3VdbeAddOp2(v, OP_SorterSort, pAggInfo->sortingIdx, addrEnd); VdbeComment((v, "GROUP BY sort")); VdbeCoverage(v); pAggInfo->useSortingIdx = 1; + sqlite3VdbeScanStatusRange(v, addrExp, -1, sortPTab); + sqlite3VdbeScanStatusRange(v, addrExp, -1, pAggInfo->sortingIdx); } /* If there are entries in pAgggInfo->aFunc[] that contain subexpressions @@ -146200,12 +152147,25 @@ SQLITE_PRIVATE int sqlite3Select( sortOut, sortPTab); } for(j=0; jnExpr; j++){ + int iOrderByCol = pGroupBy->a[j].u.x.iOrderByCol; + if( groupBySort ){ sqlite3VdbeAddOp3(v, OP_Column, sortPTab, j, iBMem+j); }else{ pAggInfo->directMode = 1; sqlite3ExprCode(pParse, pGroupBy->a[j].pExpr, iBMem+j); } + + if( iOrderByCol ){ + Expr *pX = p->pEList->a[iOrderByCol-1].pExpr; + Expr *pBase = sqlite3ExprSkipCollateAndLikely(pX); + if( ALWAYS(pBase!=0) + && pBase->op!=TK_AGG_COLUMN + && pBase->op!=TK_REGISTER + ){ + sqlite3ExprToRegister(pX, iAMem+j); + } + } } sqlite3VdbeAddOp4(v, OP_Compare, iAMem, iBMem, pGroupBy->nExpr, (char*)sqlite3KeyInfoRef(pKeyInfo), P4_KEYINFO); @@ -146221,9 +152181,9 @@ SQLITE_PRIVATE int sqlite3Select( ** and resets the aggregate accumulator registers in preparation ** for the next GROUP BY batch. */ - sqlite3ExprCodeMove(pParse, iBMem, iAMem, pGroupBy->nExpr); sqlite3VdbeAddOp2(v, OP_Gosub, regOutputRow, addrOutputRow); VdbeComment((v, "output one row")); + sqlite3ExprCodeMove(pParse, iBMem, iAMem, pGroupBy->nExpr); sqlite3VdbeAddOp2(v, OP_IfPos, iAbortFlag, addrEnd); VdbeCoverage(v); VdbeComment((v, "check abort flag")); sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset); @@ -146297,9 +152257,12 @@ SQLITE_PRIVATE int sqlite3Select( } } /* endif pGroupBy. Begin aggregate queries without GROUP BY: */ else { + /* Aggregate functions without GROUP BY. tag-select-0820 */ Table *pTab; if( (pTab = isSimpleCount(p, pAggInfo))!=0 ){ - /* If isSimpleCount() returns a pointer to a Table structure, then + /* tag-select-0821 + ** + ** If isSimpleCount() returns a pointer to a Table structure, then ** the SQL statement is of the form: ** ** SELECT count(*) FROM @@ -146358,6 +152321,8 @@ SQLITE_PRIVATE int sqlite3Select( sqlite3VdbeAddOp1(v, OP_Close, iCsr); explainSimpleCount(pParse, pTab, pBest); }else{ + /* The general case of an aggregate query without GROUP BY + ** tag-select-0822 */ int regAcc = 0; /* "populate accumulators" flag */ ExprList *pDistinct = 0; u16 distFlag = 0; @@ -146446,7 +152411,7 @@ SQLITE_PRIVATE int sqlite3Select( } /* If there is an ORDER BY clause, then we need to sort the results - ** and send them to the callback one by one. + ** and send them to the callback one by one. tag-select-0900 */ if( sSort.pOrderBy ){ assert( p->pEList==pEList ); @@ -146469,7 +152434,14 @@ SQLITE_PRIVATE int sqlite3Select( assert( db->mallocFailed==0 || pParse->nErr!=0 ); sqlite3ExprListDelete(db, pMinMaxOrderBy); #ifdef SQLITE_DEBUG + /* Internal self-checks. tag-select-1000 */ if( pAggInfo && !db->mallocFailed ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x20 ){ + TREETRACE(0x20,pParse,p,("Finished with AggInfo\n")); + printAggInfo(pAggInfo); + } +#endif for(i=0; inColumn; i++){ Expr *pExpr = pAggInfo->aCol[i].pCExpr; if( pExpr==0 ) continue; @@ -146852,8 +152824,10 @@ SQLITE_PRIVATE void sqlite3BeginTrigger( ** name on pTableName if we are reparsing out of the schema table */ if( db->init.busy && iDb!=1 ){ - sqlite3DbFree(db, pTableName->a[0].zDatabase); - pTableName->a[0].zDatabase = 0; + assert( pTableName->a[0].fg.fixedSchema==0 ); + assert( pTableName->a[0].fg.isSubquery==0 ); + sqlite3DbFree(db, pTableName->a[0].u4.zDatabase); + pTableName->a[0].u4.zDatabase = 0; } /* If the trigger name was unqualified, and the table is a temp table, @@ -146883,6 +152857,10 @@ SQLITE_PRIVATE void sqlite3BeginTrigger( sqlite3ErrorMsg(pParse, "cannot create triggers on virtual tables"); goto trigger_orphan_error; } + if( (pTab->tabFlags & TF_Shadow)!=0 && sqlite3ReadOnlyShadowTables(db) ){ + sqlite3ErrorMsg(pParse, "cannot create triggers on shadow tables"); + goto trigger_orphan_error; + } /* Check that the trigger name is not reserved and that no trigger of the ** specified name exists */ @@ -147327,7 +153305,8 @@ SQLITE_PRIVATE void sqlite3DropTrigger(Parse *pParse, SrcList *pName, int noErr) } assert( pName->nSrc==1 ); - zDb = pName->a[0].zDatabase; + assert( pName->a[0].fg.fixedSchema==0 && pName->a[0].fg.isSubquery==0 ); + zDb = pName->a[0].u4.zDatabase; zName = pName->a[0].zName; assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) ); for(i=OMIT_TEMPDB; inDb; i++){ @@ -147564,7 +153543,9 @@ SQLITE_PRIVATE SrcList *sqlite3TriggerStepSrc( Schema *pSchema = pStep->pTrig->pSchema; pSrc->a[0].zName = zName; if( pSchema!=db->aDb[1].pSchema ){ - pSrc->a[0].pSchema = pSchema; + assert( pSrc->a[0].fg.fixedSchema || pSrc->a[0].u4.zDatabase==0 ); + pSrc->a[0].u4.pSchema = pSchema; + pSrc->a[0].fg.fixedSchema = 1; } if( pStep->pFrom ){ SrcList *pDup = sqlite3SrcListDup(db, pStep->pFrom, 0); @@ -147647,6 +153628,72 @@ static ExprList *sqlite3ExpandReturning( return pNew; } +/* If the Expr node is a subquery or an EXISTS operator or an IN operator that +** uses a subquery, and if the subquery is SF_Correlated, then mark the +** expression as EP_VarSelect. +*/ +static int sqlite3ReturningSubqueryVarSelect(Walker *NotUsed, Expr *pExpr){ + UNUSED_PARAMETER(NotUsed); + if( ExprUseXSelect(pExpr) + && (pExpr->x.pSelect->selFlags & SF_Correlated)!=0 + ){ + testcase( ExprHasProperty(pExpr, EP_VarSelect) ); + ExprSetProperty(pExpr, EP_VarSelect); + } + return WRC_Continue; +} + + +/* +** If the SELECT references the table pWalker->u.pTab, then do two things: +** +** (1) Mark the SELECT as as SF_Correlated. +** (2) Set pWalker->eCode to non-zero so that the caller will know +** that (1) has happened. +*/ +static int sqlite3ReturningSubqueryCorrelated(Walker *pWalker, Select *pSelect){ + int i; + SrcList *pSrc; + assert( pSelect!=0 ); + pSrc = pSelect->pSrc; + assert( pSrc!=0 ); + for(i=0; inSrc; i++){ + if( pSrc->a[i].pSTab==pWalker->u.pTab ){ + testcase( pSelect->selFlags & SF_Correlated ); + pSelect->selFlags |= SF_Correlated; + pWalker->eCode = 1; + break; + } + } + return WRC_Continue; +} + +/* +** Scan the expression list that is the argument to RETURNING looking +** for subqueries that depend on the table which is being modified in the +** statement that is hosting the RETURNING clause (pTab). Mark all such +** subqueries as SF_Correlated. If the subqueries are part of an +** expression, mark the expression as EP_VarSelect. +** +** https://sqlite.org/forum/forumpost/2c83569ce8945d39 +*/ +static void sqlite3ProcessReturningSubqueries( + ExprList *pEList, + Table *pTab +){ + Walker w; + memset(&w, 0, sizeof(w)); + w.xExprCallback = sqlite3ExprWalkNoop; + w.xSelectCallback = sqlite3ReturningSubqueryCorrelated; + w.u.pTab = pTab; + sqlite3WalkExprList(&w, pEList); + if( w.eCode ){ + w.xExprCallback = sqlite3ReturningSubqueryVarSelect; + w.xSelectCallback = sqlite3SelectWalkNoop; + sqlite3WalkExprList(&w, pEList); + } +} + /* ** Generate code for the RETURNING trigger. Unlike other triggers ** that invoke a subprogram in the bytecode, the code for RETURNING @@ -147666,16 +153713,24 @@ static void codeReturningTrigger( SrcList sFrom; assert( v!=0 ); - assert( pParse->bReturning ); + if( !pParse->bReturning ){ + /* This RETURNING trigger must be for a different statement as + ** this statement lacks a RETURNING clause. */ + return; + } assert( db->pParse==pParse ); pReturning = pParse->u1.pReturning; - assert( pTrigger == &(pReturning->retTrig) ); + if( pTrigger != &(pReturning->retTrig) ){ + /* This RETURNING trigger is for a different statement */ + return; + } memset(&sSelect, 0, sizeof(sSelect)); memset(&sFrom, 0, sizeof(sFrom)); sSelect.pEList = sqlite3ExprListDup(db, pReturning->pReturnEL, 0); sSelect.pSrc = &sFrom; sFrom.nSrc = 1; - sFrom.a[0].pTab = pTab; + sFrom.a[0].pSTab = pTab; + sFrom.a[0].zName = pTab->zName; /* tag-20240424-1 */ sFrom.a[0].iCursor = -1; sqlite3SelectPrep(pParse, &sSelect, 0); if( pParse->nErr==0 ){ @@ -147702,6 +153757,7 @@ static void codeReturningTrigger( int i; int nCol = pNew->nExpr; int reg = pParse->nMem+1; + sqlite3ProcessReturningSubqueries(pNew, pTab); pParse->nMem += nCol+2; pReturning->iRetReg = reg; for(i=0; ipNext){ if( p->op==op && (tr_tm&p->tr_tm) @@ -148381,7 +154440,7 @@ static void updateFromSelect( Expr *pLimit2 = 0; ExprList *pOrderBy2 = 0; sqlite3 *db = pParse->db; - Table *pTab = pTabList->a[0].pTab; + Table *pTab = pTabList->a[0].pSTab; SrcList *pSrc; Expr *pWhere2; int eDest; @@ -148403,10 +154462,10 @@ static void updateFromSelect( assert( pTabList->nSrc>1 ); if( pSrc ){ - pSrc->a[0].fg.notCte = 1; + assert( pSrc->a[0].fg.notCte ); pSrc->a[0].iCursor = -1; - pSrc->a[0].pTab->nTabRef--; - pSrc->a[0].pTab = 0; + pSrc->a[0].pSTab->nTabRef--; + pSrc->a[0].pSTab = 0; } if( pPk ){ for(i=0; inKeyCol; i++){ @@ -148587,7 +154646,7 @@ SQLITE_PRIVATE void sqlite3Update( if( sqlite3ViewGetColumnNames(pParse, pTab) ){ goto update_cleanup; } - if( sqlite3IsReadOnly(pParse, pTab, tmask) ){ + if( sqlite3IsReadOnly(pParse, pTab, pTrigger) ){ goto update_cleanup; } @@ -148920,7 +154979,7 @@ SQLITE_PRIVATE void sqlite3Update( && !hasFK && !chngKey && !bReplace - && (sNC.ncFlags & NC_Subquery)==0 + && (pWhere==0 || !ExprHasProperty(pWhere, EP_Subquery)) ){ flags |= WHERE_ONEPASS_MULTIROW; } @@ -148992,6 +155051,8 @@ SQLITE_PRIVATE void sqlite3Update( if( !isView ){ int addrOnce = 0; + int iNotUsed1 = 0; + int iNotUsed2 = 0; /* Open every index that needs updating. */ if( eOnePass!=ONEPASS_OFF ){ @@ -149003,7 +155064,7 @@ SQLITE_PRIVATE void sqlite3Update( addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); } sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, iBaseCur, - aToOpen, 0, 0); + aToOpen, &iNotUsed1, &iNotUsed2); if( addrOnce ){ sqlite3VdbeJumpHereOrPopInst(v, addrOnce); } @@ -149098,6 +155159,9 @@ SQLITE_PRIVATE void sqlite3Update( } } if( chngRowid==0 && pPk==0 ){ +#ifdef SQLITE_ALLOW_ROWID_IN_VIEW + if( isView ) sqlite3VdbeAddOp2(v, OP_Null, 0, regOldRowid); +#endif sqlite3VdbeAddOp2(v, OP_Copy, regOldRowid, regNewRowid); } } @@ -149294,8 +155358,10 @@ SQLITE_PRIVATE void sqlite3Update( sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1); } - sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, - TRIGGER_AFTER, pTab, regOldRowid, onError, labelContinue); + if( pTrigger ){ + sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, + TRIGGER_AFTER, pTab, regOldRowid, onError, labelContinue); + } /* Repeat the above with the next record to be updated, until ** all record selected by the WHERE clause have been updated. @@ -149390,7 +155456,7 @@ static void updateVirtualTable( int nArg = 2 + pTab->nCol; /* Number of arguments to VUpdate */ int regArg; /* First register in VUpdate arg array */ int regRec; /* Register in which to assemble record */ - int regRowid; /* Register for ephem table rowid */ + int regRowid; /* Register for ephemeral table rowid */ int iCsr = pSrc->a[0].iCursor; /* Cursor used for virtual table scan */ int aDummy[2]; /* Unused arg for sqlite3WhereOkOnePass() */ int eOnePass; /* True to use onepass strategy */ @@ -149434,7 +155500,9 @@ static void updateVirtualTable( sqlite3ExprDup(db, pChanges->a[aXRef[i]].pExpr, 0) ); }else{ - pList = sqlite3ExprListAppend(pParse, pList, exprRowColumn(pParse, i)); + Expr *pRowExpr = exprRowColumn(pParse, i); + if( pRowExpr ) pRowExpr->op2 = OPFLAG_NOCHNG; + pList = sqlite3ExprListAppend(pParse, pList, pRowExpr); } } @@ -149511,7 +155579,7 @@ static void updateVirtualTable( sqlite3WhereEnd(pWInfo); } - /* Begin scannning through the ephemeral table. */ + /* Begin scanning through the ephemeral table. */ addr = sqlite3VdbeAddOp1(v, OP_Rewind, ephemTab); VdbeCoverage(v); /* Extract arguments from the current row of the ephemeral table and @@ -149631,7 +155699,8 @@ SQLITE_PRIVATE Upsert *sqlite3UpsertNew( SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget( Parse *pParse, /* The parsing context */ SrcList *pTabList, /* Table into which we are inserting */ - Upsert *pUpsert /* The ON CONFLICT clauses */ + Upsert *pUpsert, /* The ON CONFLICT clauses */ + Upsert *pAll /* Complete list of all ON CONFLICT clauses */ ){ Table *pTab; /* That table into which we are inserting */ int rc; /* Result code */ @@ -149644,7 +155713,7 @@ SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget( int nClause = 0; /* Counter of ON CONFLICT clauses */ assert( pTabList->nSrc==1 ); - assert( pTabList->a[0].pTab!=0 ); + assert( pTabList->a[0].pSTab!=0 ); assert( pUpsert!=0 ); assert( pUpsert->pUpsertTarget!=0 ); @@ -149663,7 +155732,7 @@ SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget( if( rc ) return rc; /* Check to see if the conflict target matches the rowid. */ - pTab = pTabList->a[0].pTab; + pTab = pTabList->a[0].pSTab; pTarget = pUpsert->pUpsertTarget; iCursor = pTabList->a[0].iCursor; if( HasRowid(pTab) @@ -149719,7 +155788,7 @@ SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget( pExpr = &sCol[0]; } for(jj=0; jja[jj].pExpr,pExpr,iCursor)<2 ){ + if( sqlite3ExprCompare(0,pTarget->a[jj].pExpr,pExpr,iCursor)<2 ){ break; /* Column ii of the index matches column jj of target */ } } @@ -149734,6 +155803,14 @@ SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget( continue; } pUpsert->pUpsertIdx = pIdx; + if( sqlite3UpsertOfIndex(pAll,pIdx)!=pUpsert ){ + /* Really this should be an error. The isDup ON CONFLICT clause will + ** never fire. But this problem was not discovered until three years + ** after multi-CONFLICT upsert was added, and so we silently ignore + ** the problem to prevent breaking applications that might actually + ** have redundant ON CONFLICT clauses. */ + pUpsert->isDup = 1; + } break; } if( pUpsert->pUpsertIdx==0 ){ @@ -149760,9 +155837,13 @@ SQLITE_PRIVATE int sqlite3UpsertNextIsIPK(Upsert *pUpsert){ Upsert *pNext; if( NEVER(pUpsert==0) ) return 0; pNext = pUpsert->pNextUpsert; - if( pNext==0 ) return 1; - if( pNext->pUpsertTarget==0 ) return 1; - if( pNext->pUpsertIdx==0 ) return 1; + while( 1 /*exit-by-return*/ ){ + if( pNext==0 ) return 1; + if( pNext->pUpsertTarget==0 ) return 1; + if( pNext->pUpsertIdx==0 ) return 1; + if( !pNext->isDup ) return 0; + pNext = pNext->pNextUpsert; + } return 0; } @@ -150022,6 +156103,9 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( const char *zDbMain; /* Schema name of database to vacuum */ const char *zOut; /* Name of output file */ u32 pgflags = PAGER_SYNCHRONOUS_OFF; /* sync flags for output db */ + u64 iRandom; /* Random value used for zDbVacuum[] */ + char zDbVacuum[42]; /* Name of the ATTACH-ed database used for vacuum */ + if( !db->autoCommit ){ sqlite3SetString(pzErrMsg, db, "cannot VACUUM from within a transaction"); @@ -150062,27 +156146,29 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( pMain = db->aDb[iDb].pBt; isMemDb = sqlite3PagerIsMemdb(sqlite3BtreePager(pMain)); - /* Attach the temporary database as 'vacuum_db'. The synchronous pragma + /* Attach the temporary database as 'vacuum_XXXXXX'. The synchronous pragma ** can be set to 'off' for this file, as it is not recovered if a crash ** occurs anyway. The integrity of the database is maintained by a ** (possibly synchronous) transaction opened on the main database before ** sqlite3BtreeCopyFile() is called. ** - ** An optimisation would be to use a non-journaled pager. - ** (Later:) I tried setting "PRAGMA vacuum_db.journal_mode=OFF" but + ** An optimization would be to use a non-journaled pager. + ** (Later:) I tried setting "PRAGMA vacuum_XXXXXX.journal_mode=OFF" but ** that actually made the VACUUM run slower. Very little journalling ** actually occurs when doing a vacuum since the vacuum_db is initially ** empty. Only the journal header is written. Apparently it takes more ** time to parse and run the PRAGMA to turn journalling off than it does ** to write the journal header file. */ + sqlite3_randomness(sizeof(iRandom),&iRandom); + sqlite3_snprintf(sizeof(zDbVacuum), zDbVacuum, "vacuum_%016llx", iRandom); nDb = db->nDb; - rc = execSqlF(db, pzErrMsg, "ATTACH %Q AS vacuum_db", zOut); + rc = execSqlF(db, pzErrMsg, "ATTACH %Q AS %s", zOut, zDbVacuum); db->openFlags = saved_openFlags; if( rc!=SQLITE_OK ) goto end_of_vacuum; assert( (db->nDb-1)==nDb ); pDb = &db->aDb[nDb]; - assert( strcmp(pDb->zDbSName,"vacuum_db")==0 ); + assert( strcmp(pDb->zDbSName,zDbVacuum)==0 ); pTemp = pDb->pBt; if( pOut ){ sqlite3_file *id = sqlite3PagerFile(sqlite3BtreePager(pTemp)); @@ -150159,11 +156245,11 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( ** the contents to the temporary database. */ rc = execSqlF(db, pzErrMsg, - "SELECT'INSERT INTO vacuum_db.'||quote(name)" + "SELECT'INSERT INTO %s.'||quote(name)" "||' SELECT*FROM\"%w\".'||quote(name)" - "FROM vacuum_db.sqlite_schema " + "FROM %s.sqlite_schema " "WHERE type='table'AND coalesce(rootpage,1)>0", - zDbMain + zDbVacuum, zDbMain, zDbVacuum ); assert( (db->mDbFlags & DBFLAG_Vacuum)!=0 ); db->mDbFlags &= ~DBFLAG_Vacuum; @@ -150175,11 +156261,11 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( ** from the schema table. */ rc = execSqlF(db, pzErrMsg, - "INSERT INTO vacuum_db.sqlite_schema" + "INSERT INTO %s.sqlite_schema" " SELECT*FROM \"%w\".sqlite_schema" " WHERE type IN('view','trigger')" " OR(type='table'AND rootpage=0)", - zDbMain + zDbVacuum, zDbMain ); if( rc ) goto end_of_vacuum; @@ -150591,7 +156677,6 @@ SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3 *db){ if( p ){ db->pDisconnect = 0; - sqlite3ExpirePreparedStatements(db, 0); do { VTable *pNext = p->pNext; sqlite3VtabUnlock(p); @@ -150757,7 +156842,7 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ ** the information we've collected. ** ** The VM register number pParse->regRowid holds the rowid of an - ** entry in the sqlite_schema table tht was created for this vtab + ** entry in the sqlite_schema table that was created for this vtab ** by sqlite3StartTable(). */ iDb = sqlite3SchemaToIndex(db, pTab->pSchema); @@ -150888,6 +156973,8 @@ static int vtabCallConstructor( db->pVtabCtx = &sCtx; pTab->nTabRef++; rc = xConstruct(db, pMod->pAux, nArg, azArg, &pVTable->pVtab, &zErr); + assert( pTab!=0 ); + assert( pTab->nTabRef>1 || rc!=SQLITE_OK ); sqlite3DeleteTable(db, pTab); db->pVtabCtx = sCtx.pPrior; if( rc==SQLITE_NOMEM ) sqlite3OomFault(db); @@ -150910,7 +156997,7 @@ static int vtabCallConstructor( pVTable->nRef = 1; if( sCtx.bDeclared==0 ){ const char *zFormat = "vtable constructor did not declare schema: %s"; - *pzErr = sqlite3MPrintf(db, zFormat, pTab->zName); + *pzErr = sqlite3MPrintf(db, zFormat, zModuleName); sqlite3VtabUnlock(pVTable); rc = SQLITE_ERROR; }else{ @@ -151088,19 +157175,38 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ Table *pTab; Parse sParse; int initBusy; + int i; + const unsigned char *z; + static const u8 aKeyword[] = { TK_CREATE, TK_TABLE, 0 }; #ifdef SQLITE_ENABLE_API_ARMOR if( !sqlite3SafetyCheckOk(db) || zCreateTable==0 ){ return SQLITE_MISUSE_BKPT; } #endif + + /* Verify that the first two keywords in the CREATE TABLE statement + ** really are "CREATE" and "TABLE". If this is not the case, then + ** sqlite3_declare_vtab() is being misused. + */ + z = (const unsigned char*)zCreateTable; + for(i=0; aKeyword[i]; i++){ + int tokenType = 0; + do{ z += sqlite3GetToken(z, &tokenType); }while( tokenType==TK_SPACE ); + if( tokenType!=aKeyword[i] ){ + sqlite3ErrorWithMsg(db, SQLITE_ERROR, "syntax error"); + return SQLITE_ERROR; + } + } + sqlite3_mutex_enter(db->mutex); pCtx = db->pVtabCtx; if( !pCtx || pCtx->bDeclared ){ - sqlite3Error(db, SQLITE_MISUSE); + sqlite3Error(db, SQLITE_MISUSE_BKPT); sqlite3_mutex_leave(db->mutex); return SQLITE_MISUSE_BKPT; } + pTab = pCtx->pTab; assert( IsVirtual(pTab) ); @@ -151114,16 +157220,16 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ initBusy = db->init.busy; db->init.busy = 0; sParse.nQueryLoop = 1; - if( SQLITE_OK==sqlite3RunParser(&sParse, zCreateTable) - && ALWAYS(sParse.pNewTable!=0) - && ALWAYS(!db->mallocFailed) - && IsOrdinaryTable(sParse.pNewTable) - ){ + if( SQLITE_OK==sqlite3RunParser(&sParse, zCreateTable) ){ + assert( sParse.pNewTable!=0 ); + assert( !db->mallocFailed ); + assert( IsOrdinaryTable(sParse.pNewTable) ); assert( sParse.zErrMsg==0 ); if( !pTab->aCol ){ Table *pNew = sParse.pNewTable; Index *pIdx; pTab->aCol = pNew->aCol; + assert( IsOrdinaryTable(pNew) ); sqlite3ExprListDelete(db, pNew->u.tab.pDfltList); pTab->nNVCol = pTab->nCol = pNew->nCol; pTab->tabFlags |= pNew->tabFlags & (TF_WithoutRowid|TF_NoVisibleRowid); @@ -151378,7 +157484,10 @@ SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ break; } if( xMethod && pVTab->iSavepoint>iSavepoint ){ + u64 savedFlags = (db->flags & SQLITE_Defensive); + db->flags &= ~(u64)SQLITE_Defensive; rc = xMethod(pVTab->pVtab, iSavepoint); + db->flags |= savedFlags; } sqlite3VtabUnlock(pVTab); } @@ -151498,7 +157607,7 @@ SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse *pParse, Table *pTab){ ** ** An eponymous virtual table instance is one that is named after its ** module, and more importantly, does not require a CREATE VIRTUAL TABLE -** statement in order to come into existance. Eponymous virtual table +** statement in order to come into existence. Eponymous virtual table ** instances always exist. They cannot be DROP-ed. ** ** Any virtual table module for which xConnect and xCreate are the same @@ -151607,6 +157716,10 @@ SQLITE_API int sqlite3_vtab_config(sqlite3 *db, int op, ...){ p->pVTable->eVtabRisk = SQLITE_VTABRISK_High; break; } + case SQLITE_VTAB_USES_ALL_SCHEMAS: { + p->pVTable->bAllSchemas = 1; + break; + } default: { rc = SQLITE_MISUSE_BKPT; break; @@ -151685,7 +157798,7 @@ typedef struct WhereRightJoin WhereRightJoin; /* ** This object is a header on a block of allocated memory that will be -** automatically freed when its WInfo oject is destructed. +** automatically freed when its WInfo object is destructed. */ struct WhereMemBlock { WhereMemBlock *pNext; /* Next block in the chain */ @@ -151746,7 +157859,7 @@ struct WhereLevel { int iCur; /* The VDBE cursor used by this IN operator */ int addrInTop; /* Top of the IN loop */ int iBase; /* Base register of multi-key index record */ - int nPrefix; /* Number of prior entires in the key */ + int nPrefix; /* Number of prior entries in the key */ u8 eEndLoopOp; /* IN Loop terminator. OP_Next or OP_Prev */ } *aInLoop; /* Information about each nested IN operator */ } in; /* Used when pWLoop->wsFlags&WHERE_IN_ABLE */ @@ -151791,11 +157904,13 @@ struct WhereLoop { u16 nTop; /* Size of TOP vector */ u16 nDistinctCol; /* Index columns used to sort for DISTINCT */ Index *pIndex; /* Index used, or NULL */ + ExprList *pOrderBy; /* ORDER BY clause if this is really a subquery */ } btree; struct { /* Information for virtual tables */ int idxNum; /* Index number */ u32 needFree : 1; /* True if sqlite3_free(idxStr) is needed */ u32 bOmitOffset : 1; /* True to let virtual table handle offset */ + u32 bIdxNumHex : 1; /* Show idxNum as hex in EXPLAIN QUERY PLAN */ i8 isOrdered; /* True if satisfies ORDER BY */ u16 omitMask; /* Terms that may be omitted */ char *idxStr; /* Index identifier string */ @@ -151808,6 +157923,8 @@ struct WhereLoop { /**** whereLoopXfer() copies fields above ***********************/ # define WHERE_LOOP_XFER_SZ offsetof(WhereLoop,nLSlot) u16 nLSlot; /* Number of slots allocated for aLTerm[] */ + LogEst rStarDelta; /* Cost delta due to star-schema heuristic. Not + ** initialized unless pWInfo->nOutStarDelta>0 */ WhereTerm **aLTerm; /* WhereTerms used */ WhereLoop *pNextLoop; /* Next WhereLoop object in the WhereClause */ WhereTerm *aLTermSpace[3]; /* Initial aLTerm[] space */ @@ -151996,7 +158113,7 @@ struct WhereClause { int nTerm; /* Number of terms */ int nSlot; /* Number of entries in a[] */ int nBase; /* Number of terms through the last non-Virtual */ - WhereTerm *a; /* Each a[] describes a term of the WHERE cluase */ + WhereTerm *a; /* Each a[] describes a term of the WHERE clause */ #if defined(SQLITE_SMALL_STACK) WhereTerm aStatic[1]; /* Initial static space for a[] */ #else @@ -152130,6 +158247,7 @@ struct WhereInfo { unsigned untestedTerms :1; /* Not all WHERE terms resolved by outer loop */ unsigned bOrderedInnerLoop:1;/* True if only the inner-most loop is ordered */ unsigned sorted :1; /* True if really sorted (not just grouped) */ + LogEst nOutStarDelta; /* Artifical nOut reduction for star-query */ LogEst nRowOut; /* Estimated number of output rows */ int iTop; /* The very beginning of the WHERE loop */ int iEndWhere; /* End of the WHERE clause itself */ @@ -152150,7 +158268,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereGetMask(WhereMaskSet*,int); #ifdef WHERETRACE_ENABLED SQLITE_PRIVATE void sqlite3WhereClausePrint(WhereClause *pWC); SQLITE_PRIVATE void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm); -SQLITE_PRIVATE void sqlite3WhereLoopPrint(WhereLoop *p, WhereClause *pWC); +SQLITE_PRIVATE void sqlite3WhereLoopPrint(const WhereLoop *p, const WhereClause *pWC); #endif SQLITE_PRIVATE WhereTerm *sqlite3WhereFindTerm( WhereClause *pWC, /* The WHERE clause to be searched */ @@ -152281,7 +158399,8 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(Parse*, SrcItem*, WhereClause*); #define WHERE_BLOOMFILTER 0x00400000 /* Consider using a Bloom-filter */ #define WHERE_SELFCULL 0x00800000 /* nOut reduced by extra WHERE terms */ #define WHERE_OMIT_OFFSET 0x01000000 /* Set offset counter to zero */ -#define WHERE_VIEWSCAN 0x02000000 /* A full-scan of a VIEW or subquery */ +#define WHERE_COROUTINE 0x02000000 /* Implemented by co-routine. + ** NB: False-negatives are possible */ #define WHERE_EXPRIDX 0x04000000 /* Uses an index-on-expressions */ #endif /* !defined(SQLITE_WHEREINT_H) */ @@ -152380,9 +158499,9 @@ static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop){ /* ** This function is a no-op unless currently processing an EXPLAIN QUERY PLAN -** command, or if either SQLITE_DEBUG or SQLITE_ENABLE_STMT_SCANSTATUS was -** defined at compile-time. If it is not a no-op, a single OP_Explain opcode -** is added to the output to describe the table scan strategy in pLevel. +** command, or if stmt_scanstatus_v2() stats are enabled, or if SQLITE_DEBUG +** was defined at compile-time. If it is not a no-op, a single OP_Explain +** opcode is added to the output to describe the table scan strategy in pLevel. ** ** If an OP_Explain opcode is added to the VM, its address is returned. ** Otherwise, if no OP_Explain is coded, zero is returned. @@ -152394,8 +158513,8 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan( u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */ ){ int ret = 0; -#if !defined(SQLITE_DEBUG) && !defined(SQLITE_ENABLE_STMT_SCANSTATUS) - if( sqlite3ParseToplevel(pParse)->explain==2 ) +#if !defined(SQLITE_DEBUG) + if( sqlite3ParseToplevel(pParse)->explain==2 || IS_STMT_SCANSTATUS(pParse->db) ) #endif { SrcItem *pItem = &pTabList->a[pLevel->iFrom]; @@ -152426,7 +158545,7 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan( assert( pLoop->u.btree.pIndex!=0 ); pIdx = pLoop->u.btree.pIndex; assert( !(flags&WHERE_AUTO_INDEX) || (flags&WHERE_IDX_ONLY) ); - if( !HasRowid(pItem->pTab) && IsPrimaryKeyIndex(pIdx) ){ + if( !HasRowid(pItem->pSTab) && IsPrimaryKeyIndex(pIdx) ){ if( isSearch ){ zFmt = "PRIMARY KEY"; } @@ -152469,7 +158588,9 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan( } #ifndef SQLITE_OMIT_VIRTUALTABLE else if( (flags & WHERE_VIRTUALTABLE)!=0 ){ - sqlite3_str_appendf(&str, " VIRTUAL TABLE INDEX %d:%s", + sqlite3_str_appendall(&str, " VIRTUAL TABLE INDEX "); + sqlite3_str_appendf(&str, + pLoop->u.vtab.bIdxNumHex ? "0x%x:%s" : "%d:%s", pLoop->u.vtab.idxNum, pLoop->u.vtab.idxStr); } #endif @@ -152487,7 +158608,8 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan( zMsg = sqlite3StrAccumFinish(&str); sqlite3ExplainBreakpoint("",zMsg); ret = sqlite3VdbeAddOp4(v, OP_Explain, sqlite3VdbeCurrentAddr(v), - pParse->addrExplain, 0, zMsg,P4_DYNAMIC); + pParse->addrExplain, pLoop->rRun, + zMsg, P4_DYNAMIC); } return ret; } @@ -152522,7 +158644,7 @@ SQLITE_PRIVATE int sqlite3WhereExplainBloomFilter( sqlite3_str_appendf(&str, "BLOOM FILTER ON %S (", pItem); pLoop = pLevel->pWLoop; if( pLoop->wsFlags & WHERE_IPK ){ - const Table *pTab = pItem->pTab; + const Table *pTab = pItem->pSTab; if( pTab->iPKey>=0 ){ sqlite3_str_appendf(&str, "%s=?", pTab->aCol[pTab->iPKey].zCnName); }else{ @@ -152561,27 +158683,37 @@ SQLITE_PRIVATE void sqlite3WhereAddScanStatus( WhereLevel *pLvl, /* Level to add scanstatus() entry for */ int addrExplain /* Address of OP_Explain (or 0) */ ){ - const char *zObj = 0; - WhereLoop *pLoop = pLvl->pWLoop; - int wsFlags = pLoop->wsFlags; - int viaCoroutine = 0; + if( IS_STMT_SCANSTATUS( sqlite3VdbeDb(v) ) ){ + const char *zObj = 0; + WhereLoop *pLoop = pLvl->pWLoop; + int wsFlags = pLoop->wsFlags; + int viaCoroutine = 0; - if( (wsFlags & WHERE_VIRTUALTABLE)==0 && pLoop->u.btree.pIndex!=0 ){ - zObj = pLoop->u.btree.pIndex->zName; - }else{ - zObj = pSrclist->a[pLvl->iFrom].zName; - viaCoroutine = pSrclist->a[pLvl->iFrom].fg.viaCoroutine; - } - sqlite3VdbeScanStatus( - v, addrExplain, pLvl->addrBody, pLvl->addrVisit, pLoop->nOut, zObj - ); - - if( viaCoroutine==0 ){ - if( (wsFlags & (WHERE_MULTI_OR|WHERE_AUTO_INDEX))==0 ){ - sqlite3VdbeScanStatusRange(v, addrExplain, -1, pLvl->iTabCur); + if( (wsFlags & WHERE_VIRTUALTABLE)==0 && pLoop->u.btree.pIndex!=0 ){ + zObj = pLoop->u.btree.pIndex->zName; + }else{ + zObj = pSrclist->a[pLvl->iFrom].zName; + viaCoroutine = pSrclist->a[pLvl->iFrom].fg.viaCoroutine; } - if( wsFlags & WHERE_INDEXED ){ - sqlite3VdbeScanStatusRange(v, addrExplain, -1, pLvl->iIdxCur); + sqlite3VdbeScanStatus( + v, addrExplain, pLvl->addrBody, pLvl->addrVisit, pLoop->nOut, zObj + ); + + if( viaCoroutine==0 ){ + if( (wsFlags & (WHERE_MULTI_OR|WHERE_AUTO_INDEX))==0 ){ + sqlite3VdbeScanStatusRange(v, addrExplain, -1, pLvl->iTabCur); + } + if( wsFlags & WHERE_INDEXED ){ + sqlite3VdbeScanStatusRange(v, addrExplain, -1, pLvl->iIdxCur); + } + }else{ + int addr; + assert( pSrclist->a[pLvl->iFrom].fg.isSubquery ); + addr = pSrclist->a[pLvl->iFrom].u4.pSubq->addrFillSub; + VdbeOp *pOp = sqlite3VdbeGetOp(v, addr-1); + assert( sqlite3VdbeDb(v)->mallocFailed || pOp->opcode==OP_InitCoroutine ); + assert( sqlite3VdbeDb(v)->mallocFailed || pOp->p2>addr ); + sqlite3VdbeScanStatusRange(v, addrExplain, addr, pOp->p2-1); } } } @@ -152721,6 +158853,39 @@ static void updateRangeAffinityStr( } } +/* +** The pOrderBy->a[].u.x.iOrderByCol values might be incorrect because +** columns might have been rearranged in the result set. This routine +** fixes them up. +** +** pEList is the new result set. The pEList->a[].u.x.iOrderByCol values +** contain the *old* locations of each expression. This is a temporary +** use of u.x.iOrderByCol, not its intended use. The caller must reset +** u.x.iOrderByCol back to zero for all entries in pEList before the +** caller returns. +** +** This routine changes pOrderBy->a[].u.x.iOrderByCol values from +** pEList->a[N].u.x.iOrderByCol into N+1. (The "+1" is because of the 1-based +** indexing used by iOrderByCol.) Or if no match, iOrderByCol is set to zero. +*/ +static void adjustOrderByCol(ExprList *pOrderBy, ExprList *pEList){ + int i, j; + if( pOrderBy==0 ) return; + for(i=0; inExpr; i++){ + int t = pOrderBy->a[i].u.x.iOrderByCol; + if( t==0 ) continue; + for(j=0; jnExpr; j++){ + if( pEList->a[j].u.x.iOrderByCol==t ){ + pOrderBy->a[i].u.x.iOrderByCol = j+1; + break; + } + } + if( j>=pEList->nExpr ){ + pOrderBy->a[i].u.x.iOrderByCol = 0; + } + } +} + /* ** pX is an expression of the form: (vector) IN (SELECT ...) @@ -152784,6 +158949,7 @@ static Expr *removeUnindexableInClauseTerms( if( pOrigRhs->a[iField].pExpr==0 ) continue; /* Duplicate PK column */ pRhs = sqlite3ExprListAppend(pParse, pRhs, pOrigRhs->a[iField].pExpr); pOrigRhs->a[iField].pExpr = 0; + if( pRhs ) pRhs->a[pRhs->nExpr-1].u.x.iOrderByCol = iField+1; if( pOrigLhs ){ assert( pOrigLhs->a[iField].pExpr!=0 ); pLhs = sqlite3ExprListAppend(pParse,pLhs,pOrigLhs->a[iField].pExpr); @@ -152797,6 +158963,7 @@ static Expr *removeUnindexableInClauseTerms( pNew->pLeft->x.pList = pLhs; } pSelect->pEList = pRhs; + pSelect->selId = ++pParse->nSelect; /* Req'd for SubrtnSig validity */ if( pLhs && pLhs->nExpr==1 ){ /* Take care here not to generate a TK_VECTOR containing only a ** single value. Since the parser never creates such a vector, some @@ -152806,18 +158973,16 @@ static Expr *removeUnindexableInClauseTerms( sqlite3ExprDelete(db, pNew->pLeft); pNew->pLeft = p; } - if( pSelect->pOrderBy ){ - /* If the SELECT statement has an ORDER BY clause, zero the - ** iOrderByCol variables. These are set to non-zero when an - ** ORDER BY term exactly matches one of the terms of the - ** result-set. Since the result-set of the SELECT statement may - ** have been modified or reordered, these variables are no longer - ** set correctly. Since setting them is just an optimization, - ** it's easiest just to zero them here. */ - ExprList *pOrderBy = pSelect->pOrderBy; - for(i=0; inExpr; i++){ - pOrderBy->a[i].u.x.iOrderByCol = 0; - } + + /* If either the ORDER BY clause or the GROUP BY clause contains + ** references to result-set columns, those references might now be + ** obsolete. So fix them up. + */ + assert( pRhs!=0 || db->mallocFailed ); + if( pRhs ){ + adjustOrderByCol(pSelect->pOrderBy, pRhs); + adjustOrderByCol(pSelect->pGroupBy, pRhs); + for(i=0; inExpr; i++) pRhs->a[i].u.x.iOrderByCol = 0; } #if 0 @@ -152832,6 +158997,147 @@ static Expr *removeUnindexableInClauseTerms( } +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Generate code for a single X IN (....) term of the WHERE clause. +** +** This is a special-case of codeEqualityTerm() that works for IN operators +** only. It is broken out into a subroutine because this case is +** uncommon and by splitting it off into a subroutine, the common case +** runs faster. +** +** The current value for the constraint is left in register iTarget. +** This routine sets up a loop that will iterate over all values of X. +*/ +static SQLITE_NOINLINE void codeINTerm( + Parse *pParse, /* The parsing context */ + WhereTerm *pTerm, /* The term of the WHERE clause to be coded */ + WhereLevel *pLevel, /* The level of the FROM clause we are working on */ + int iEq, /* Index of the equality term within this level */ + int bRev, /* True for reverse-order IN operations */ + int iTarget /* Attempt to leave results in this register */ +){ + Expr *pX = pTerm->pExpr; + int eType = IN_INDEX_NOOP; + int iTab; + struct InLoop *pIn; + WhereLoop *pLoop = pLevel->pWLoop; + Vdbe *v = pParse->pVdbe; + int i; + int nEq = 0; + int *aiMap = 0; + + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 + && pLoop->u.btree.pIndex!=0 + && pLoop->u.btree.pIndex->aSortOrder[iEq] + ){ + testcase( iEq==0 ); + testcase( bRev ); + bRev = !bRev; + } + assert( pX->op==TK_IN ); + + for(i=0; iaLTerm[i] && pLoop->aLTerm[i]->pExpr==pX ){ + disableTerm(pLevel, pTerm); + return; + } + } + for(i=iEq;inLTerm; i++){ + assert( pLoop->aLTerm[i]!=0 ); + if( pLoop->aLTerm[i]->pExpr==pX ) nEq++; + } + + iTab = 0; + if( !ExprUseXSelect(pX) || pX->x.pSelect->pEList->nExpr==1 ){ + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab); + }else{ + Expr *pExpr = pTerm->pExpr; + if( pExpr->iTable==0 || !ExprHasProperty(pExpr, EP_Subrtn) ){ + sqlite3 *db = pParse->db; + pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); + if( !db->mallocFailed ){ + aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap,&iTab); + pExpr->iTable = iTab; + } + sqlite3ExprDelete(db, pX); + }else{ + int n = sqlite3ExprVectorSize(pX->pLeft); + aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*MAX(nEq,n)); + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap, &iTab); + } + pX = pExpr; + } + + if( eType==IN_INDEX_INDEX_DESC ){ + testcase( bRev ); + bRev = !bRev; + } + sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iTab, 0); + VdbeCoverageIf(v, bRev); + VdbeCoverageIf(v, !bRev); + + assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 ); + pLoop->wsFlags |= WHERE_IN_ABLE; + if( pLevel->u.in.nIn==0 ){ + pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse); + } + if( iEq>0 && (pLoop->wsFlags & WHERE_IN_SEEKSCAN)==0 ){ + pLoop->wsFlags |= WHERE_IN_EARLYOUT; + } + + i = pLevel->u.in.nIn; + pLevel->u.in.nIn += nEq; + pLevel->u.in.aInLoop = + sqlite3WhereRealloc(pTerm->pWC->pWInfo, + pLevel->u.in.aInLoop, + sizeof(pLevel->u.in.aInLoop[0])*pLevel->u.in.nIn); + pIn = pLevel->u.in.aInLoop; + if( pIn ){ + int iMap = 0; /* Index in aiMap[] */ + pIn += i; + for(i=iEq;inLTerm; i++){ + if( pLoop->aLTerm[i]->pExpr==pX ){ + int iOut = iTarget + i - iEq; + if( eType==IN_INDEX_ROWID ){ + pIn->addrInTop = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iOut); + }else{ + int iCol = aiMap ? aiMap[iMap++] : 0; + pIn->addrInTop = sqlite3VdbeAddOp3(v,OP_Column,iTab, iCol, iOut); + } + sqlite3VdbeAddOp1(v, OP_IsNull, iOut); VdbeCoverage(v); + if( i==iEq ){ + pIn->iCur = iTab; + pIn->eEndLoopOp = bRev ? OP_Prev : OP_Next; + if( iEq>0 ){ + pIn->iBase = iTarget - i; + pIn->nPrefix = i; + }else{ + pIn->nPrefix = 0; + } + }else{ + pIn->eEndLoopOp = OP_Noop; + } + pIn++; + } + } + testcase( iEq>0 + && (pLoop->wsFlags & WHERE_IN_SEEKSCAN)==0 + && (pLoop->wsFlags & WHERE_VIRTUALTABLE)!=0 ); + if( iEq>0 + && (pLoop->wsFlags & (WHERE_IN_SEEKSCAN|WHERE_VIRTUALTABLE))==0 + ){ + sqlite3VdbeAddOp3(v, OP_SeekHit, pLevel->iIdxCur, 0, iEq); + } + }else{ + pLevel->u.in.nIn = 0; + } + sqlite3DbFree(pParse->db, aiMap); +} +#endif + + /* ** Generate code for a single equality term of the WHERE clause. An equality ** term can be either X=expr or X IN (...). pTerm is the term to be @@ -152856,7 +159162,6 @@ static int codeEqualityTerm( int iTarget /* Attempt to leave results in this register */ ){ Expr *pX = pTerm->pExpr; - Vdbe *v = pParse->pVdbe; int iReg; /* Register holding results */ assert( pLevel->pWLoop->aLTerm[iEq]==pTerm ); @@ -152865,125 +159170,12 @@ static int codeEqualityTerm( iReg = sqlite3ExprCodeTarget(pParse, pX->pRight, iTarget); }else if( pX->op==TK_ISNULL ){ iReg = iTarget; - sqlite3VdbeAddOp2(v, OP_Null, 0, iReg); + sqlite3VdbeAddOp2(pParse->pVdbe, OP_Null, 0, iReg); #ifndef SQLITE_OMIT_SUBQUERY }else{ - int eType = IN_INDEX_NOOP; - int iTab; - struct InLoop *pIn; - WhereLoop *pLoop = pLevel->pWLoop; - int i; - int nEq = 0; - int *aiMap = 0; - - if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 - && pLoop->u.btree.pIndex!=0 - && pLoop->u.btree.pIndex->aSortOrder[iEq] - ){ - testcase( iEq==0 ); - testcase( bRev ); - bRev = !bRev; - } assert( pX->op==TK_IN ); iReg = iTarget; - - for(i=0; iaLTerm[i] && pLoop->aLTerm[i]->pExpr==pX ){ - disableTerm(pLevel, pTerm); - return iTarget; - } - } - for(i=iEq;inLTerm; i++){ - assert( pLoop->aLTerm[i]!=0 ); - if( pLoop->aLTerm[i]->pExpr==pX ) nEq++; - } - - iTab = 0; - if( !ExprUseXSelect(pX) || pX->x.pSelect->pEList->nExpr==1 ){ - eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab); - }else{ - Expr *pExpr = pTerm->pExpr; - if( pExpr->iTable==0 || !ExprHasProperty(pExpr, EP_Subrtn) ){ - sqlite3 *db = pParse->db; - pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); - if( !db->mallocFailed ){ - aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); - eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap,&iTab); - pExpr->iTable = iTab; - } - sqlite3ExprDelete(db, pX); - }else{ - int n = sqlite3ExprVectorSize(pX->pLeft); - aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*MAX(nEq,n)); - eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap, &iTab); - } - pX = pExpr; - } - - if( eType==IN_INDEX_INDEX_DESC ){ - testcase( bRev ); - bRev = !bRev; - } - sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iTab, 0); - VdbeCoverageIf(v, bRev); - VdbeCoverageIf(v, !bRev); - - assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 ); - pLoop->wsFlags |= WHERE_IN_ABLE; - if( pLevel->u.in.nIn==0 ){ - pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse); - } - if( iEq>0 && (pLoop->wsFlags & WHERE_IN_SEEKSCAN)==0 ){ - pLoop->wsFlags |= WHERE_IN_EARLYOUT; - } - - i = pLevel->u.in.nIn; - pLevel->u.in.nIn += nEq; - pLevel->u.in.aInLoop = - sqlite3WhereRealloc(pTerm->pWC->pWInfo, - pLevel->u.in.aInLoop, - sizeof(pLevel->u.in.aInLoop[0])*pLevel->u.in.nIn); - pIn = pLevel->u.in.aInLoop; - if( pIn ){ - int iMap = 0; /* Index in aiMap[] */ - pIn += i; - for(i=iEq;inLTerm; i++){ - if( pLoop->aLTerm[i]->pExpr==pX ){ - int iOut = iReg + i - iEq; - if( eType==IN_INDEX_ROWID ){ - pIn->addrInTop = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iOut); - }else{ - int iCol = aiMap ? aiMap[iMap++] : 0; - pIn->addrInTop = sqlite3VdbeAddOp3(v,OP_Column,iTab, iCol, iOut); - } - sqlite3VdbeAddOp1(v, OP_IsNull, iOut); VdbeCoverage(v); - if( i==iEq ){ - pIn->iCur = iTab; - pIn->eEndLoopOp = bRev ? OP_Prev : OP_Next; - if( iEq>0 ){ - pIn->iBase = iReg - i; - pIn->nPrefix = i; - }else{ - pIn->nPrefix = 0; - } - }else{ - pIn->eEndLoopOp = OP_Noop; - } - pIn++; - } - } - testcase( iEq>0 - && (pLoop->wsFlags & WHERE_IN_SEEKSCAN)==0 - && (pLoop->wsFlags & WHERE_VIRTUALTABLE)!=0 ); - if( iEq>0 - && (pLoop->wsFlags & (WHERE_IN_SEEKSCAN|WHERE_VIRTUALTABLE))==0 - ){ - sqlite3VdbeAddOp3(v, OP_SeekHit, pLevel->iIdxCur, 0, iEq); - } - }else{ - pLevel->u.in.nIn = 0; - } - sqlite3DbFree(pParse->db, aiMap); + codeINTerm(pParse, pTerm, pLevel, iEq, bRev, iTarget); #endif } @@ -153079,7 +159271,7 @@ static int codeAllEqualityTerms( /* Figure out how many memory cells we will need then allocate them. */ regBase = pParse->nMem + 1; - nReg = pLoop->u.btree.nEq + nExtraReg; + nReg = nEq + nExtraReg; pParse->nMem += nReg; zAff = sqlite3DbStrDup(pParse->db,sqlite3IndexAffinityStr(pParse->db,pIdx)); @@ -153126,9 +159318,6 @@ static int codeAllEqualityTerms( sqlite3VdbeAddOp2(v, OP_Copy, r1, regBase+j); } } - } - for(j=nSkip; jaLTerm[j]; if( pTerm->eOperator & WO_IN ){ if( pTerm->pExpr->flags & EP_xIsSelect ){ /* No affinity ever needs to be (or should be) applied to a value @@ -153271,18 +159460,19 @@ static int codeCursorHintIsOrFunction(Walker *pWalker, Expr *pExpr){ ** 2) transform the expression node to a TK_REGISTER node that reads ** from the newly populated register. ** -** Also, if the node is a TK_COLUMN that does access the table idenified +** Also, if the node is a TK_COLUMN that does access the table identified ** by pCCurHint.iTabCur, and an index is being used (which we will ** know because CCurHint.pIdx!=0) then transform the TK_COLUMN into ** an access of the index rather than the original table. */ static int codeCursorHintFixExpr(Walker *pWalker, Expr *pExpr){ int rc = WRC_Continue; + int reg; struct CCurHint *pHint = pWalker->u.pCCurHint; if( pExpr->op==TK_COLUMN ){ if( pExpr->iTable!=pHint->iTabCur ){ - int reg = ++pWalker->pParse->nMem; /* Register for column value */ - sqlite3ExprCode(pWalker->pParse, pExpr, reg); + reg = ++pWalker->pParse->nMem; /* Register for column value */ + reg = sqlite3ExprCodeTarget(pWalker->pParse, pExpr, reg); pExpr->op = TK_REGISTER; pExpr->iTable = reg; }else if( pHint->pIdx!=0 ){ @@ -153290,15 +159480,15 @@ static int codeCursorHintFixExpr(Walker *pWalker, Expr *pExpr){ pExpr->iColumn = sqlite3TableColumnToIndex(pHint->pIdx, pExpr->iColumn); assert( pExpr->iColumn>=0 ); } - }else if( pExpr->op==TK_AGG_FUNCTION ){ - /* An aggregate function in the WHERE clause of a query means this must - ** be a correlated sub-query, and expression pExpr is an aggregate from - ** the parent context. Do not walk the function arguments in this case. - ** - ** todo: It should be possible to replace this node with a TK_REGISTER - ** expression, as the result of the expression must be stored in a - ** register at this point. The same holds for TK_AGG_COLUMN nodes. */ + }else if( pExpr->pAggInfo ){ rc = WRC_Prune; + reg = ++pWalker->pParse->nMem; /* Register for column value */ + reg = sqlite3ExprCodeTarget(pWalker->pParse, pExpr, reg); + pExpr->op = TK_REGISTER; + pExpr->iTable = reg; + }else if( pExpr->op==TK_TRUEFALSE ){ + /* Do not walk disabled expressions. tag-20230504-1 */ + return WRC_Prune; } return rc; } @@ -153400,7 +159590,7 @@ static void codeCursorHint( } if( pExpr!=0 ){ sWalker.xExprCallback = codeCursorHintFixExpr; - sqlite3WalkExpr(&sWalker, pExpr); + if( pParse->nErr==0 ) sqlite3WalkExpr(&sWalker, pExpr); sqlite3VdbeAddOp4(v, OP_CursorHint, (sHint.pIdx ? sHint.iIdxCur : sHint.iTabCur), 0, 0, (const char*)pExpr, P4_EXPR); @@ -153600,6 +159790,27 @@ static SQLITE_NOINLINE void filterPullDown( } } +/* +** Loop pLoop is a WHERE_INDEXED level that uses at least one IN(...) +** operator. Return true if level pLoop is guaranteed to visit only one +** row for each key generated for the index. +*/ +static int whereLoopIsOneRow(WhereLoop *pLoop){ + if( pLoop->u.btree.pIndex->onError + && pLoop->nSkip==0 + && pLoop->u.btree.nEq==pLoop->u.btree.pIndex->nKeyCol + ){ + int ii; + for(ii=0; iiu.btree.nEq; ii++){ + if( pLoop->aLTerm[ii]->eOperator & (WO_IS|WO_ISNULL) ){ + return 0; + } + } + return 1; + } + return 0; +} + /* ** Generate code for the start of the iLevel-th loop in the WHERE clause ** implementation described by pWInfo. @@ -153636,7 +159847,8 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( iCur = pTabItem->iCursor; pLevel->notReady = notReady & ~sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur); bRev = (pWInfo->revMask>>iLevel)&1; - VdbeModuleComment((v, "Begin WHERE-loop%d: %s",iLevel,pTabItem->pTab->zName)); + VdbeModuleComment((v, "Begin WHERE-loop%d: %s", + iLevel, pTabItem->pSTab->zName)); #if WHERETRACE_ENABLED /* 0x4001 */ if( sqlite3WhereTrace & 0x1 ){ sqlite3DebugPrintf("Coding level %d of %d: notReady=%llx iFrom=%d\n", @@ -153678,7 +159890,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( if( pLevel->iFrom>0 && (pTabItem[0].fg.jointype & JT_LEFT)!=0 ){ pLevel->iLeftJoin = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_Integer, 0, pLevel->iLeftJoin); - VdbeComment((v, "init LEFT JOIN no-match flag")); + VdbeComment((v, "init LEFT JOIN match flag")); } /* Compute a safe address to jump to if we discover that the table for @@ -153691,11 +159903,15 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( /* Special case of a FROM clause subquery implemented as a co-routine */ if( pTabItem->fg.viaCoroutine ){ - int regYield = pTabItem->regReturn; - sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub); + int regYield; + Subquery *pSubq; + assert( pTabItem->fg.isSubquery && pTabItem->u4.pSubq!=0 ); + pSubq = pTabItem->u4.pSubq; + regYield = pSubq->regReturn; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pSubq->addrFillSub); pLevel->p2 = sqlite3VdbeAddOp2(v, OP_Yield, regYield, addrBrk); VdbeCoverage(v); - VdbeComment((v, "next row of %s", pTabItem->pTab->zName)); + VdbeComment((v, "next row of %s", pTabItem->pSTab->zName)); pLevel->op = OP_Goto; }else @@ -153888,7 +160104,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( }; assert( TK_LE==TK_GT+1 ); /* Make sure the ordering.. */ assert( TK_LT==TK_GT+2 ); /* ... of the TK_xx values... */ - assert( TK_GE==TK_GT+3 ); /* ... is correcct. */ + assert( TK_GE==TK_GT+3 ); /* ... is correct. */ assert( (pStart->wtFlags & TERM_VNULL)==0 ); testcase( pStart->wtFlags & TERM_VIRTUAL ); @@ -154194,7 +160410,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** guess. */ addrSeekScan = sqlite3VdbeAddOp1(v, OP_SeekScan, (pIdx->aiRowLogEst[0]+9)/10); - if( pRangeStart ){ + if( pRangeStart || pRangeEnd ){ sqlite3VdbeChangeP5(v, 1); sqlite3VdbeChangeP2(v, addrSeekScan, sqlite3VdbeCurrentAddr(v)+1); addrSeekScan = 0; @@ -154235,16 +160451,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( assert( pLevel->p2==0 ); if( pRangeEnd ){ Expr *pRight = pRangeEnd->pExpr->pRight; - if( addrSeekScan ){ - /* For a seek-scan that has a range on the lowest term of the index, - ** we have to make the top of the loop be code that sets the end - ** condition of the range. Otherwise, the OP_SeekScan might jump - ** over that initialization, leaving the range-end value set to the - ** range-start value, resulting in a wrong answer. - ** See ticket 5981a8c041a3c2f3 (2021-11-02). - */ - pLevel->p2 = sqlite3VdbeCurrentAddr(v); - } + assert( addrSeekScan==0 ); codeExprOrVector(pParse, pRight, regBase+nEq, nTop); whereLikeOptimizationStringFixup(v, pLevel, pRangeEnd); if( (pRangeEnd->wtFlags & TERM_VNULL)==0 @@ -154278,7 +160485,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( if( zEndAff ) sqlite3DbNNFreeNN(db, zEndAff); /* Top of the loop body */ - if( pLevel->p2==0 ) pLevel->p2 = sqlite3VdbeCurrentAddr(v); + pLevel->p2 = sqlite3VdbeCurrentAddr(v); /* Check if the index cursor is past the end of the range. */ if( nConstraint ){ @@ -154356,7 +160563,9 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( } /* Record the instruction used to terminate the loop. */ - if( pLoop->wsFlags & WHERE_ONEROW ){ + if( (pLoop->wsFlags & WHERE_ONEROW) + || (pLevel->u.in.nIn && regBignull==0 && whereLoopIsOneRow(pLoop)) + ){ pLevel->op = OP_Noop; }else if( bRev ){ pLevel->op = OP_Prev; @@ -154431,7 +160640,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( int untestedTerms = 0; /* Some terms not completely tested */ int ii; /* Loop counter */ Expr *pAndExpr = 0; /* An ".. AND (...)" expression */ - Table *pTab = pTabItem->pTab; + Table *pTab = pTabItem->pSTab; pTerm = pLoop->aLTerm[0]; assert( pTerm!=0 ); @@ -154746,6 +160955,12 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** iLoop==3: Code all remaining expressions. ** ** An effort is made to skip unnecessary iterations of the loop. + ** + ** This optimization of causing simple query restrictions to occur before + ** more complex one is call the "push-down" optimization in MySQL. Here + ** in SQLite, the name is "MySQL push-down", since there is also another + ** totally unrelated optimization called "WHERE-clause push-down". + ** Sometimes the qualifier is omitted, resulting in an ambiguity, so beware. */ iLoop = (pIdx ? 1 : 2); do{ @@ -154884,7 +161099,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** least once. This is accomplished by storing the PK for the row in ** both the iMatch index and the regBloom Bloom filter. */ - pTab = pWInfo->pTabList->a[pLevel->iFrom].pTab; + pTab = pWInfo->pTabList->a[pLevel->iFrom].pSTab; if( HasRowid(pTab) ){ r = sqlite3GetTempRange(pParse, 2); sqlite3ExprCodeGetColumnOfTable(v, pTab, pLevel->iTabCur, -1, r+1); @@ -154991,12 +161206,25 @@ SQLITE_PRIVATE SQLITE_NOINLINE void sqlite3WhereRightJoinLoop( Bitmask mAll = 0; int k; - ExplainQueryPlan((pParse, 1, "RIGHT-JOIN %s", pTabItem->pTab->zName)); + ExplainQueryPlan((pParse, 1, "RIGHT-JOIN %s", pTabItem->pSTab->zName)); sqlite3VdbeNoJumpsOutsideSubrtn(v, pRJ->addrSubrtn, pRJ->endSubrtn, pRJ->regReturn); for(k=0; ka[k].pWLoop->iTab == pWInfo->a[k].iFrom ); + pRight = &pWInfo->pTabList->a[pWInfo->a[k].iFrom]; mAll |= pWInfo->a[k].pWLoop->maskSelf; + if( pRight->fg.viaCoroutine ){ + Subquery *pSubq; + assert( pRight->fg.isSubquery && pRight->u4.pSubq!=0 ); + pSubq = pRight->u4.pSubq; + assert( pSubq->pSelect!=0 && pSubq->pSelect->pEList!=0 ); + sqlite3VdbeAddOp3( + v, OP_Null, 0, pSubq->regResult, + pSubq->regResult + pSubq->pSelect->pEList->nExpr-1 + ); + } sqlite3VdbeAddOp1(v, OP_NullRow, pWInfo->a[k].iTabCur); iIdxCur = pWInfo->a[k].iIdxCur; if( iIdxCur ){ @@ -155032,7 +161260,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE void sqlite3WhereRightJoinLoop( int nPk; int jmp; int addrCont = sqlite3WhereContinueLabel(pSubWInfo); - Table *pTab = pTabItem->pTab; + Table *pTab = pTabItem->pSTab; if( HasRowid(pTab) ){ sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, -1, r); nPk = 1; @@ -155077,7 +161305,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE void sqlite3WhereRightJoinLoop( ** the WHERE clause of SQL statements. ** ** This file was originally part of where.c but was split out to improve -** readability and editabiliity. This file contains utility routines for +** readability and editability. This file contains utility routines for ** analyzing Expr objects in the WHERE clause. */ /* #include "sqliteInt.h" */ @@ -155165,7 +161393,12 @@ static int allowedOp(int op){ assert( TK_LT>TK_EQ && TK_LTTK_EQ && TK_LE=TK_EQ && op<=TK_GE) || op==TK_ISNULL || op==TK_IS; + assert( TK_INTK_GE ) return 0; + if( op>=TK_EQ ) return 1; + return op==TK_IN || op==TK_ISNULL || op==TK_IS; } /* @@ -155198,15 +161431,16 @@ static u16 exprCommute(Parse *pParse, Expr *pExpr){ static u16 operatorMask(int op){ u16 c; assert( allowedOp(op) ); - if( op==TK_IN ){ + if( op>=TK_EQ ){ + assert( (WO_EQ<<(op-TK_EQ)) < 0x7fff ); + c = (u16)(WO_EQ<<(op-TK_EQ)); + }else if( op==TK_IN ){ c = WO_IN; }else if( op==TK_ISNULL ){ c = WO_ISNULL; - }else if( op==TK_IS ){ - c = WO_IS; }else{ - assert( (WO_EQ<<(op-TK_EQ)) < 0x7fff ); - c = (u16)(WO_EQ<<(op-TK_EQ)); + assert( op==TK_IS ); + c = WO_IS; } assert( op!=TK_ISNULL || c==WO_ISNULL ); assert( op!=TK_IN || c==WO_IN ); @@ -155277,12 +161511,26 @@ static int isLikeOrGlob( z = (u8*)pRight->u.zToken; } if( z ){ - - /* Count the number of prefix characters prior to the first wildcard */ + /* Count the number of prefix bytes prior to the first wildcard. + ** or U+fffd character. If the underlying database has a UTF16LE + ** encoding, then only consider ASCII characters. Note that the + ** encoding of z[] is UTF8 - we are dealing with only UTF8 here in + ** this code, but the database engine itself might be processing + ** content using a different encoding. */ cnt = 0; while( (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2] ){ cnt++; - if( c==wc[3] && z[cnt]!=0 ) cnt++; + if( c==wc[3] && z[cnt]>0 && z[cnt]<0x80 ){ + cnt++; + }else if( c>=0x80 ){ + const u8 *z2 = z+cnt-1; + if( sqlite3Utf8Read(&z2)==0xfffd || ENC(db)==SQLITE_UTF16LE ){ + cnt--; + break; + }else{ + cnt = (int)(z2-z); + } + } } /* The optimization is possible only if (1) the pattern does not begin @@ -155293,11 +161541,11 @@ static int isLikeOrGlob( ** range search. The third is because the caller assumes that the pattern ** consists of at least one character after all escapes have been ** removed. */ - if( cnt!=0 && 255!=(u8)z[cnt-1] && (cnt>1 || z[0]!=wc[3]) ){ + if( (cnt>1 || (cnt>0 && z[0]!=wc[3])) && ALWAYS(255!=(u8)z[cnt-1]) ){ Expr *pPrefix; /* A "complete" match if the pattern ends with "*" or "%" */ - *pisComplete = c==wc[0] && z[cnt+1]==0; + *pisComplete = c==wc[0] && z[cnt+1]==0 && ENC(db)!=SQLITE_UTF16LE; /* Get the pattern prefix. Remove all escapes from the prefix. */ pPrefix = sqlite3Expr(db, TK_STRING, (char*)z); @@ -155493,6 +161741,13 @@ static int isAuxiliaryVtabOperator( } } } + }else if( pExpr->op>=TK_EQ ){ + /* Comparison operators are a common case. Save a few comparisons for + ** that common case by terminating early. */ + assert( TK_NE < TK_EQ ); + assert( TK_ISNOT < TK_EQ ); + assert( TK_NOTNULL < TK_EQ ); + return 0; }else if( pExpr->op==TK_NE || pExpr->op==TK_ISNOT || pExpr->op==TK_NOTNULL ){ int res = 0; Expr *pLeft = pExpr->pLeft; @@ -155866,7 +162121,7 @@ static void exprAnalyzeOrTerm( pOrTerm->leftCursor))==0 ){ /* This term must be of the form t1.a==t2.b where t2 is in the ** chngToIN set but t1 is not. This term will be either preceded - ** or follwed by an inverted copy (t2.b==t1.a). Skip this term + ** or followed by an inverted copy (t2.b==t1.a). Skip this term ** and use its inversion. */ testcase( pOrTerm->wtFlags & TERM_COPIED ); testcase( pOrTerm->wtFlags & TERM_VIRTUAL ); @@ -156009,7 +162264,9 @@ static Bitmask exprSelectUsage(WhereMaskSet *pMaskSet, Select *pS){ if( ALWAYS(pSrc!=0) ){ int i; for(i=0; inSrc; i++){ - mask |= exprSelectUsage(pMaskSet, pSrc->a[i].pSelect); + if( pSrc->a[i].fg.isSubquery ){ + mask |= exprSelectUsage(pMaskSet, pSrc->a[i].u4.pSubq->pSelect); + } if( pSrc->a[i].fg.isUsing==0 ){ mask |= sqlite3WhereExprUsage(pMaskSet, pSrc->a[i].u3.pOn); } @@ -156047,13 +162304,13 @@ static SQLITE_NOINLINE int exprMightBeIndexed2( int iCur; do{ iCur = pFrom->a[j].iCursor; - for(pIdx=pFrom->a[j].pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + for(pIdx=pFrom->a[j].pSTab->pIndex; pIdx; pIdx=pIdx->pNext){ if( pIdx->aColExpr==0 ) continue; for(i=0; inKeyCol; i++){ if( pIdx->aiColumn[i]!=XN_EXPR ) continue; assert( pIdx->bHasExpr ); if( sqlite3ExprCompareSkip(pExpr,pIdx->aColExpr->a[i].pExpr,iCur)==0 - && pExpr->op!=TK_STRING + && !sqlite3ExprIsConstant(0,pIdx->aColExpr->a[i].pExpr) ){ aiCurCol[0] = iCur; aiCurCol[1] = XN_EXPR; @@ -156091,7 +162348,7 @@ static int exprMightBeIndexed( for(i=0; inSrc; i++){ Index *pIdx; - for(pIdx=pFrom->a[i].pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + for(pIdx=pFrom->a[i].pSTab->pIndex; pIdx; pIdx=pIdx->pNext){ if( pIdx->aColExpr ){ return exprMightBeIndexed2(pFrom,aiCurCol,pExpr,i); } @@ -156128,8 +162385,8 @@ static void exprAnalyze( WhereTerm *pTerm; /* The term to be analyzed */ WhereMaskSet *pMaskSet; /* Set of table index masks */ Expr *pExpr; /* The expression to be analyzed */ - Bitmask prereqLeft; /* Prerequesites of the pExpr->pLeft */ - Bitmask prereqAll; /* Prerequesites of pExpr */ + Bitmask prereqLeft; /* Prerequisites of the pExpr->pLeft */ + Bitmask prereqAll; /* Prerequisites of pExpr */ Bitmask extraRight = 0; /* Extra dependencies on LEFT JOIN */ Expr *pStr1 = 0; /* RHS of LIKE/GLOB operator */ int isComplete = 0; /* RHS of LIKE/GLOB ends with wildcard */ @@ -156275,7 +162532,7 @@ static void exprAnalyze( && 0==sqlite3ExprCanBeNull(pLeft) ){ assert( !ExprHasProperty(pExpr, EP_IntValue) ); - pExpr->op = TK_TRUEFALSE; + pExpr->op = TK_TRUEFALSE; /* See tag-20230504-1 */ pExpr->u.zToken = "false"; ExprSetProperty(pExpr, EP_IsFalse); pTerm->prereqAll = 0; @@ -156634,7 +162891,7 @@ static void whereAddLimitExpr( Expr *pNew; int iVal = 0; - if( sqlite3ExprIsInteger(pExpr, &iVal) && iVal>=0 ){ + if( sqlite3ExprIsInteger(pExpr, &iVal, pParse) && iVal>=0 ){ Expr *pVal = sqlite3Expr(db, TK_INTEGER, 0); if( pVal==0 ) return; ExprSetProperty(pVal, EP_IntValue); @@ -156679,7 +162936,7 @@ SQLITE_PRIVATE void SQLITE_NOINLINE sqlite3WhereAddLimit(WhereClause *pWC, Selec assert( p!=0 && p->pLimit!=0 ); /* 1 -- checked by caller */ if( p->pGroupBy==0 && (p->selFlags & (SF_Distinct|SF_Aggregate))==0 /* 2 */ - && (p->pSrc->nSrc==1 && IsVirtual(p->pSrc->a[0].pTab)) /* 3 */ + && (p->pSrc->nSrc==1 && IsVirtual(p->pSrc->a[0].pSTab)) /* 3 */ ){ ExprList *pOrderBy = p->pOrderBy; int iCsr = p->pSrc->a[0].iCursor; @@ -156702,6 +162959,7 @@ SQLITE_PRIVATE void SQLITE_NOINLINE sqlite3WhereAddLimit(WhereClause *pWC, Selec continue; } if( pWC->a[ii].leftCursor!=iCsr ) return; + if( pWC->a[ii].prereqRight!=0 ) return; } /* Check condition (5). Return early if it is not met. */ @@ -156716,12 +162974,14 @@ SQLITE_PRIVATE void SQLITE_NOINLINE sqlite3WhereAddLimit(WhereClause *pWC, Selec /* All conditions are met. Add the terms to the where-clause object. */ assert( p->pLimit->op==TK_LIMIT ); - whereAddLimitExpr(pWC, p->iLimit, p->pLimit->pLeft, - iCsr, SQLITE_INDEX_CONSTRAINT_LIMIT); - if( p->iOffset>0 ){ + if( p->iOffset!=0 && (p->selFlags & SF_Compound)==0 ){ whereAddLimitExpr(pWC, p->iOffset, p->pLimit->pRight, iCsr, SQLITE_INDEX_CONSTRAINT_OFFSET); } + if( p->iOffset==0 || (p->selFlags & SF_Compound)==0 ){ + whereAddLimitExpr(pWC, p->iLimit, p->pLimit->pLeft, + iCsr, SQLITE_INDEX_CONSTRAINT_LIMIT); + } } } @@ -156897,7 +163157,7 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs( Expr *pColRef; Expr *pTerm; if( pItem->fg.isTabFunc==0 ) return; - pTab = pItem->pTab; + pTab = pItem->pSTab; assert( pTab!=0 ); pArgs = pItem->u1.pFuncArg; if( pArgs==0 ) return; @@ -156920,9 +163180,12 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs( pRhs = sqlite3PExpr(pParse, TK_UPLUS, sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0), 0); pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef, pRhs); - if( pItem->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT) ){ + if( pItem->fg.jointype & (JT_LEFT|JT_RIGHT) ){ + testcase( pItem->fg.jointype & JT_LEFT ); /* testtag-20230227a */ + testcase( pItem->fg.jointype & JT_RIGHT ); /* testtag-20230227b */ joinType = EP_OuterON; }else{ + testcase( pItem->fg.jointype & JT_LTORJ ); /* testtag-20230227c */ joinType = EP_InnerON; } sqlite3SetJoinExpr(pTerm, pItem->iCursor, joinType); @@ -157236,6 +163499,42 @@ static Expr *whereRightSubexprIsColumn(Expr *p){ return 0; } +/* +** Term pTerm is guaranteed to be a WO_IN term. It may be a component term +** of a vector IN expression of the form "(x, y, ...) IN (SELECT ...)". +** This function checks to see if the term is compatible with an index +** column with affinity idxaff (one of the SQLITE_AFF_XYZ values). If so, +** it returns a pointer to the name of the collation sequence (e.g. "BINARY" +** or "NOCASE") used by the comparison in pTerm. If it is not compatible +** with affinity idxaff, NULL is returned. +*/ +static SQLITE_NOINLINE const char *indexInAffinityOk( + Parse *pParse, + WhereTerm *pTerm, + u8 idxaff +){ + Expr *pX = pTerm->pExpr; + Expr inexpr; + + assert( pTerm->eOperator & WO_IN ); + + if( sqlite3ExprIsVector(pX->pLeft) ){ + int iField = pTerm->u.x.iField - 1; + inexpr.flags = 0; + inexpr.op = TK_EQ; + inexpr.pLeft = pX->pLeft->x.pList->a[iField].pExpr; + assert( ExprUseXSelect(pX) ); + inexpr.pRight = pX->x.pSelect->pEList->a[iField].pExpr; + pX = &inexpr; + } + + if( sqlite3IndexAffinityOk(pX, idxaff) ){ + CollSeq *pRet = sqlite3ExprCompareCollSeq(pParse, pX); + return pRet ? pRet->zName : sqlite3StrBINARY; + } + return 0; +} + /* ** Advance to the next WhereTerm that matches according to the criteria ** established when the pScan object was initialized by whereScanInit(). @@ -157286,16 +163585,24 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ if( (pTerm->eOperator & pScan->opMask)!=0 ){ /* Verify the affinity and collating sequence match */ if( pScan->zCollName && (pTerm->eOperator & WO_ISNULL)==0 ){ - CollSeq *pColl; + const char *zCollName; Parse *pParse = pWC->pWInfo->pParse; pX = pTerm->pExpr; - if( !sqlite3IndexAffinityOk(pX, pScan->idxaff) ){ - continue; + + if( (pTerm->eOperator & WO_IN) ){ + zCollName = indexInAffinityOk(pParse, pTerm, pScan->idxaff); + if( !zCollName ) continue; + }else{ + CollSeq *pColl; + if( !sqlite3IndexAffinityOk(pX, pScan->idxaff) ){ + continue; + } + assert(pX->pLeft); + pColl = sqlite3ExprCompareCollSeq(pParse, pX); + zCollName = pColl ? pColl->zName : sqlite3StrBINARY; } - assert(pX->pLeft); - pColl = sqlite3ExprCompareCollSeq(pParse, pX); - if( pColl==0 ) pColl = pParse->db->pDfltColl; - if( sqlite3StrICmp(pColl->zName, pScan->zCollName) ){ + + if( sqlite3StrICmp(zCollName, pScan->zCollName) ){ continue; } } @@ -157534,7 +163841,7 @@ static int isDistinctRedundant( ** clause is redundant. */ if( pTabList->nSrc!=1 ) return 0; iBase = pTabList->a[0].iCursor; - pTab = pTabList->a[0].pTab; + pTab = pTabList->a[0].pSTab; /* If any of the expressions is an IPK column on table iBase, then return ** true. Note: The (p->iTable==iBase) part of this test may be false if the @@ -157609,15 +163916,31 @@ static void translateColumnToCopy( VdbeOp *pOp = sqlite3VdbeGetOp(v, iStart); int iEnd = sqlite3VdbeCurrentAddr(v); if( pParse->db->mallocFailed ) return; +#ifdef SQLITE_DEBUG + if( pParse->db->flags & SQLITE_VdbeAddopTrace ){ + printf("CHECKING for column-to-copy on cursor %d for %d..%d\n", + iTabCur, iStart, iEnd); + } +#endif for(; iStartp1!=iTabCur ) continue; if( pOp->opcode==OP_Column ){ +#ifdef SQLITE_DEBUG + if( pParse->db->flags & SQLITE_VdbeAddopTrace ){ + printf("TRANSLATE OP_Column to OP_Copy at %d\n", iStart); + } +#endif pOp->opcode = OP_Copy; pOp->p1 = pOp->p2 + iRegister; pOp->p2 = pOp->p3; pOp->p3 = 0; pOp->p5 = 2; /* Cause the MEM_Subtype flag to be cleared */ }else if( pOp->opcode==OP_Rowid ){ +#ifdef SQLITE_DEBUG + if( pParse->db->flags & SQLITE_VdbeAddopTrace ){ + printf("TRANSLATE OP_Rowid to OP_Sequence at %d\n", iStart); + } +#endif pOp->opcode = OP_Sequence; pOp->p1 = iAutoidxCur; #ifdef SQLITE_ALLOW_ROWID_IN_VIEW @@ -157637,9 +163960,13 @@ static void translateColumnToCopy( ** are no-ops. */ #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(WHERETRACE_ENABLED) -static void whereTraceIndexInfoInputs(sqlite3_index_info *p){ +static void whereTraceIndexInfoInputs( + sqlite3_index_info *p, /* The IndexInfo object */ + Table *pTab /* The TABLE that is the virtual table */ +){ int i; if( (sqlite3WhereTrace & 0x10)==0 ) return; + sqlite3DebugPrintf("sqlite3_index_info inputs for %s:\n", pTab->zName); for(i=0; inConstraint; i++){ sqlite3DebugPrintf( " constraint[%d]: col=%d termid=%d op=%d usabled=%d collseq=%s\n", @@ -157657,9 +163984,13 @@ static void whereTraceIndexInfoInputs(sqlite3_index_info *p){ p->aOrderBy[i].desc); } } -static void whereTraceIndexInfoOutputs(sqlite3_index_info *p){ +static void whereTraceIndexInfoOutputs( + sqlite3_index_info *p, /* The IndexInfo object */ + Table *pTab /* The TABLE that is the virtual table */ +){ int i; if( (sqlite3WhereTrace & 0x10)==0 ) return; + sqlite3DebugPrintf("sqlite3_index_info outputs for %s:\n", pTab->zName); for(i=0; inConstraint; i++){ sqlite3DebugPrintf(" usage[%d]: argvIdx=%d omit=%d\n", i, @@ -157673,8 +164004,8 @@ static void whereTraceIndexInfoOutputs(sqlite3_index_info *p){ sqlite3DebugPrintf(" estimatedRows=%lld\n", p->estimatedRows); } #else -#define whereTraceIndexInfoInputs(A) -#define whereTraceIndexInfoOutputs(A) +#define whereTraceIndexInfoInputs(A,B) +#define whereTraceIndexInfoOutputs(A,B) #endif /* @@ -157712,6 +164043,40 @@ static int constraintCompatibleWithOuterJoin( return 1; } +#ifndef SQLITE_OMIT_AUTOMATIC_INDEX +/* +** Return true if column iCol of table pTab seem like it might be a +** good column to use as part of a query-time index. +** +** Current algorithm (subject to improvement!): +** +** 1. If iCol is already the left-most column of some other index, +** then return false. +** +** 2. If iCol is part of an existing index that has an aiRowLogEst of +** more than 20, then return false. +** +** 3. If no disqualifying conditions above are found, return true. +*/ +static SQLITE_NOINLINE int columnIsGoodIndexCandidate( + const Table *pTab, + int iCol +){ + const Index *pIdx; + for(pIdx = pTab->pIndex; pIdx!=0; pIdx=pIdx->pNext){ + int j; + for(j=0; jnKeyCol; j++){ + if( pIdx->aiColumn[j]==iCol ){ + if( j==0 ) return 0; + if( pIdx->hasStat1 && pIdx->aiRowLogEst[j+1]>20 ) return 0; + break; + } + } + } + return 1; +} +#endif /* SQLITE_OMIT_AUTOMATIC_INDEX */ + #ifndef SQLITE_OMIT_AUTOMATIC_INDEX @@ -157726,6 +164091,8 @@ static int termCanDriveIndex( const Bitmask notReady /* Tables in outer loops of the join */ ){ char aff; + int leftCol; + if( pTerm->leftCursor!=pSrc->iCursor ) return 0; if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) return 0; assert( (pSrc->fg.jointype & JT_RIGHT)==0 ); @@ -157736,11 +164103,12 @@ static int termCanDriveIndex( } if( (pTerm->prereqRight & notReady)!=0 ) return 0; assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); - if( pTerm->u.x.leftColumn<0 ) return 0; - aff = pSrc->pTab->aCol[pTerm->u.x.leftColumn].affinity; + leftCol = pTerm->u.x.leftColumn; + if( leftCol<0 ) return 0; + aff = pSrc->pSTab->aCol[leftCol].affinity; if( !sqlite3IndexAffinityOk(pTerm->pExpr, aff) ) return 0; testcase( pTerm->pExpr->op==TK_IS ); - return 1; + return columnIsGoodIndexCandidate(pSrc->pSTab, leftCol); } #endif @@ -157765,7 +164133,7 @@ static void explainAutomaticIndex( int bPartial, /* True if pIdx is a partial index */ int *pAddrExplain /* OUT: Address of OP_Explain */ ){ - if( pParse->explain!=2 ){ + if( IS_STMT_SCANSTATUS(pParse->db) && pParse->explain!=2 ){ Table *pTab = pIdx->pTable; const char *zSep = ""; char *zText = 0; @@ -157804,8 +164172,7 @@ static void explainAutomaticIndex( */ static SQLITE_NOINLINE void constructAutomaticIndex( Parse *pParse, /* The parsing context */ - const WhereClause *pWC, /* The WHERE clause */ - const SrcItem *pSrc, /* The FROM clause term to get the next index */ + WhereClause *pWC, /* The WHERE clause */ const Bitmask notReady, /* Mask of cursors that are not available */ WhereLevel *pLevel /* Write new index here */ ){ @@ -157826,10 +164193,12 @@ static SQLITE_NOINLINE void constructAutomaticIndex( char *zNotUsed; /* Extra space on the end of pIdx */ Bitmask idxCols; /* Bitmap of columns used for indexing */ Bitmask extraCols; /* Bitmap of additional columns */ - u8 sentWarning = 0; /* True if a warnning has been issued */ + u8 sentWarning = 0; /* True if a warning has been issued */ + u8 useBloomFilter = 0; /* True to also add a Bloom filter */ Expr *pPartial = 0; /* Partial Index Expression */ int iContinue = 0; /* Jump here to skip excluded rows */ - SrcItem *pTabItem; /* FROM clause term being indexed */ + SrcList *pTabList; /* The complete FROM clause */ + SrcItem *pSrc; /* The FROM clause term to get the next index */ int addrCounter = 0; /* Address where integer counter is initialized */ int regBase; /* Array of registers where record is assembled */ #ifdef SQLITE_ENABLE_STMT_SCANSTATUS @@ -157845,7 +164214,9 @@ static SQLITE_NOINLINE void constructAutomaticIndex( /* Count the number of columns that will be added to the index ** and used to match WHERE clause constraints */ nKeyCol = 0; - pTable = pSrc->pTab; + pTabList = pWC->pWInfo->pTabList; + pSrc = &pTabList->a[pLevel->iFrom]; + pTable = pSrc->pSTab; pWCEnd = &pWC->a[pWC->nTerm]; pLoop = pLevel->pWLoop; idxCols = 0; @@ -157855,7 +164226,7 @@ static SQLITE_NOINLINE void constructAutomaticIndex( ** WHERE clause (or the ON clause of a LEFT join) that constrain which ** rows of the target table (pSrc) that can be used. */ if( (pTerm->wtFlags & TERM_VIRTUAL)==0 - && sqlite3ExprIsTableConstraint(pExpr, pSrc) + && sqlite3ExprIsSingleTableConstraint(pExpr, pTabList, pLevel->iFrom, 0) ){ pPartial = sqlite3ExprAnd(pParse, pPartial, sqlite3ExprDup(pParse->db, pExpr, 0)); @@ -157896,7 +164267,11 @@ static SQLITE_NOINLINE void constructAutomaticIndex( ** original table changes and the index and table cannot both be used ** if they go out of sync. */ - extraCols = pSrc->colUsed & (~idxCols | MASKBIT(BMS-1)); + if( IsView(pTable) ){ + extraCols = ALLBITS & ~idxCols; + }else{ + extraCols = pSrc->colUsed & (~idxCols | MASKBIT(BMS-1)); + } mxBitCol = MIN(BMS-1,pTable->nCol); testcase( pTable->nCol==BMS-1 ); testcase( pTable->nCol==BMS-2 ); @@ -157932,6 +164307,16 @@ static SQLITE_NOINLINE void constructAutomaticIndex( assert( pColl!=0 || pParse->nErr>0 ); /* TH3 collate01.800 */ pIdx->azColl[n] = pColl ? pColl->zName : sqlite3StrBINARY; n++; + if( ALWAYS(pX->pLeft!=0) + && sqlite3ExprAffinity(pX->pLeft)!=SQLITE_AFF_TEXT + ){ + /* TUNING: only use a Bloom filter on an automatic index + ** if one or more key columns has the ability to hold numeric + ** values, since strings all have the same hash in the Bloom + ** filter implementation and hence a Bloom filter on a text column + ** is not usually helpful. */ + useBloomFilter = 1; + } } } } @@ -157964,20 +164349,26 @@ static SQLITE_NOINLINE void constructAutomaticIndex( sqlite3VdbeAddOp2(v, OP_OpenAutoindex, pLevel->iIdxCur, nKeyCol+1); sqlite3VdbeSetP4KeyInfo(pParse, pIdx); VdbeComment((v, "for %s", pTable->zName)); - if( OptimizationEnabled(pParse->db, SQLITE_BloomFilter) ){ + if( OptimizationEnabled(pParse->db, SQLITE_BloomFilter) && useBloomFilter ){ + sqlite3WhereExplainBloomFilter(pParse, pWC->pWInfo, pLevel); pLevel->regFilter = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_Blob, 10000, pLevel->regFilter); } /* Fill the automatic index with content */ - pTabItem = &pWC->pWInfo->pTabList->a[pLevel->iFrom]; - if( pTabItem->fg.viaCoroutine ){ - int regYield = pTabItem->regReturn; + assert( pSrc == &pWC->pWInfo->pTabList->a[pLevel->iFrom] ); + if( pSrc->fg.viaCoroutine ){ + int regYield; + Subquery *pSubq; + assert( pSrc->fg.isSubquery ); + pSubq = pSrc->u4.pSubq; + assert( pSubq!=0 ); + regYield = pSubq->regReturn; addrCounter = sqlite3VdbeAddOp2(v, OP_Integer, 0, 0); - sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub); + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pSubq->addrFillSub); addrTop = sqlite3VdbeAddOp1(v, OP_Yield, regYield); VdbeCoverage(v); - VdbeComment((v, "next row of %s", pTabItem->pTab->zName)); + VdbeComment((v, "next row of %s", pSrc->pSTab->zName)); }else{ addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); VdbeCoverage(v); } @@ -157998,14 +164389,15 @@ static SQLITE_NOINLINE void constructAutomaticIndex( sqlite3VdbeAddOp2(v, OP_IdxInsert, pLevel->iIdxCur, regRecord); sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); if( pPartial ) sqlite3VdbeResolveLabel(v, iContinue); - if( pTabItem->fg.viaCoroutine ){ + if( pSrc->fg.viaCoroutine ){ + assert( pSrc->fg.isSubquery && pSrc->u4.pSubq!=0 ); sqlite3VdbeChangeP2(v, addrCounter, regBase+n); testcase( pParse->db->mallocFailed ); assert( pLevel->iIdxCur>0 ); translateColumnToCopy(pParse, addrTop, pLevel->iTabCur, - pTabItem->regResult, pLevel->iIdxCur); + pSrc->u4.pSubq->regResult, pLevel->iIdxCur); sqlite3VdbeGoto(v, addrTop); - pTabItem->fg.viaCoroutine = 0; + pSrc->fg.viaCoroutine = 0; }else{ sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); VdbeCoverage(v); sqlite3VdbeChangeP5(v, SQLITE_STMTSTATUS_AUTOINDEX); @@ -158058,19 +164450,25 @@ static SQLITE_NOINLINE void sqlite3ConstructBloomFilter( WhereLoop *pLoop = pLevel->pWLoop; /* The loop being coded */ int iCur; /* Cursor for table getting the filter */ IndexedExpr *saved_pIdxEpr; /* saved copy of Parse.pIdxEpr */ + IndexedExpr *saved_pIdxPartExpr; /* saved copy of Parse.pIdxPartExpr */ saved_pIdxEpr = pParse->pIdxEpr; + saved_pIdxPartExpr = pParse->pIdxPartExpr; pParse->pIdxEpr = 0; + pParse->pIdxPartExpr = 0; assert( pLoop!=0 ); assert( v!=0 ); assert( pLoop->wsFlags & WHERE_BLOOMFILTER ); + assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 ); addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); do{ + const SrcList *pTabList; const SrcItem *pItem; const Table *pTab; u64 sz; + int iSrc; sqlite3WhereExplainBloomFilter(pParse, pWInfo, pLevel); addrCont = sqlite3VdbeMakeLabel(pParse); iCur = pLevel->iTabCur; @@ -158084,9 +164482,11 @@ static SQLITE_NOINLINE void sqlite3ConstructBloomFilter( ** testing complicated. By basing the blob size on the value in the ** sqlite_stat1 table, testing is much easier. */ - pItem = &pWInfo->pTabList->a[pLevel->iFrom]; + pTabList = pWInfo->pTabList; + iSrc = pLevel->iFrom; + pItem = &pTabList->a[iSrc]; assert( pItem!=0 ); - pTab = pItem->pTab; + pTab = pItem->pSTab; assert( pTab!=0 ); sz = sqlite3LogEstToInt(pTab->nRowLogEst); if( sz<10000 ){ @@ -158101,7 +164501,7 @@ static SQLITE_NOINLINE void sqlite3ConstructBloomFilter( for(pTerm=pWInfo->sWC.a; pTermpExpr; if( (pTerm->wtFlags & TERM_VIRTUAL)==0 - && sqlite3ExprIsTableConstraint(pExpr, pItem) + && sqlite3ExprIsSingleTableConstraint(pExpr, pTabList, iSrc, 0) ){ sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL); } @@ -158117,7 +164517,7 @@ static SQLITE_NOINLINE void sqlite3ConstructBloomFilter( int r1 = sqlite3GetTempRange(pParse, n); int jj; for(jj=0; jjpTable==pItem->pTab ); + assert( pIdx->pTable==pItem->pSTab ); sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iCur, jj, r1+jj); } sqlite3VdbeAddOp4Int(v, OP_FilterAdd, pLevel->regFilter, 0, r1, n); @@ -158150,10 +164550,25 @@ static SQLITE_NOINLINE void sqlite3ConstructBloomFilter( }while( iLevel < pWInfo->nLevel ); sqlite3VdbeJumpHere(v, addrOnce); pParse->pIdxEpr = saved_pIdxEpr; + pParse->pIdxPartExpr = saved_pIdxPartExpr; } #ifndef SQLITE_OMIT_VIRTUALTABLE +/* +** Return term iTerm of the WhereClause passed as the first argument. Terms +** are numbered from 0 upwards, starting with the terms in pWC->a[], then +** those in pWC->pOuter->a[] (if any), and so on. +*/ +static WhereTerm *termFromWhereClause(WhereClause *pWC, int iTerm){ + WhereClause *p; + for(p=pWC; p; p=p->pOuter){ + if( iTermnTerm ) return &p->a[iTerm]; + iTerm -= p->nTerm; + } + return 0; +} + /* ** Allocate and populate an sqlite3_index_info structure. It is the ** responsibility of the caller to eventually release the structure @@ -158180,9 +164595,10 @@ static sqlite3_index_info *allocateIndexInfo( const Table *pTab; int eDistinct = 0; ExprList *pOrderBy = pWInfo->pOrderBy; + WhereClause *p; assert( pSrc!=0 ); - pTab = pSrc->pTab; + pTab = pSrc->pSTab; assert( pTab!=0 ); assert( IsVirtual(pTab) ); @@ -158190,28 +164606,30 @@ static sqlite3_index_info *allocateIndexInfo( ** Mark each term with the TERM_OK flag. Set nTerm to the number of ** terms found. */ - for(i=nTerm=0, pTerm=pWC->a; inTerm; i++, pTerm++){ - pTerm->wtFlags &= ~TERM_OK; - if( pTerm->leftCursor != pSrc->iCursor ) continue; - if( pTerm->prereqRight & mUnusable ) continue; - assert( IsPowerOfTwo(pTerm->eOperator & ~WO_EQUIV) ); - testcase( pTerm->eOperator & WO_IN ); - testcase( pTerm->eOperator & WO_ISNULL ); - testcase( pTerm->eOperator & WO_IS ); - testcase( pTerm->eOperator & WO_ALL ); - if( (pTerm->eOperator & ~(WO_EQUIV))==0 ) continue; - if( pTerm->wtFlags & TERM_VNULL ) continue; + for(p=pWC, nTerm=0; p; p=p->pOuter){ + for(i=0, pTerm=p->a; inTerm; i++, pTerm++){ + pTerm->wtFlags &= ~TERM_OK; + if( pTerm->leftCursor != pSrc->iCursor ) continue; + if( pTerm->prereqRight & mUnusable ) continue; + assert( IsPowerOfTwo(pTerm->eOperator & ~WO_EQUIV) ); + testcase( pTerm->eOperator & WO_IN ); + testcase( pTerm->eOperator & WO_ISNULL ); + testcase( pTerm->eOperator & WO_IS ); + testcase( pTerm->eOperator & WO_ALL ); + if( (pTerm->eOperator & ~(WO_EQUIV))==0 ) continue; + if( pTerm->wtFlags & TERM_VNULL ) continue; - assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); - assert( pTerm->u.x.leftColumn>=XN_ROWID ); - assert( pTerm->u.x.leftColumnnCol ); - if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 - && !constraintCompatibleWithOuterJoin(pTerm,pSrc) - ){ - continue; + assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); + assert( pTerm->u.x.leftColumn>=XN_ROWID ); + assert( pTerm->u.x.leftColumnnCol ); + if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 + && !constraintCompatibleWithOuterJoin(pTerm,pSrc) + ){ + continue; + } + nTerm++; + pTerm->wtFlags |= TERM_OK; } - nTerm++; - pTerm->wtFlags |= TERM_OK; } /* If the ORDER BY clause contains only columns in the current @@ -158226,7 +164644,7 @@ static sqlite3_index_info *allocateIndexInfo( Expr *pE2; /* Skip over constant terms in the ORDER BY clause */ - if( sqlite3ExprIsConstant(pExpr) ){ + if( sqlite3ExprIsConstant(0, pExpr) ){ continue; } @@ -158261,7 +164679,7 @@ static sqlite3_index_info *allocateIndexInfo( } if( i==n ){ nOrderBy = n; - if( (pWInfo->wctrlFlags & WHERE_DISTINCTBY) ){ + if( (pWInfo->wctrlFlags & WHERE_DISTINCTBY) && !pSrc->fg.rowidUsed ){ eDistinct = 2 + ((pWInfo->wctrlFlags & WHERE_SORTBYGROUP)!=0); }else if( pWInfo->wctrlFlags & WHERE_GROUPBY ){ eDistinct = 1; @@ -158286,59 +164704,75 @@ static sqlite3_index_info *allocateIndexInfo( pIdxInfo->aConstraint = pIdxCons; pIdxInfo->aOrderBy = pIdxOrderBy; pIdxInfo->aConstraintUsage = pUsage; + pIdxInfo->colUsed = (sqlite3_int64)pSrc->colUsed; + if( HasRowid(pTab)==0 ){ + /* Ensure that all bits associated with PK columns are set. This is to + ** ensure they are available for cases like RIGHT joins or OR loops. */ + Index *pPk = sqlite3PrimaryKeyIndex((Table*)pTab); + assert( pPk!=0 ); + for(i=0; inKeyCol; i++){ + int iCol = pPk->aiColumn[i]; + assert( iCol>=0 ); + if( iCol>=BMS-1 ) iCol = BMS-1; + pIdxInfo->colUsed |= MASKBIT(iCol); + } + } pHidden->pWC = pWC; pHidden->pParse = pParse; pHidden->eDistinct = eDistinct; pHidden->mIn = 0; - for(i=j=0, pTerm=pWC->a; inTerm; i++, pTerm++){ - u16 op; - if( (pTerm->wtFlags & TERM_OK)==0 ) continue; - pIdxCons[j].iColumn = pTerm->u.x.leftColumn; - pIdxCons[j].iTermOffset = i; - op = pTerm->eOperator & WO_ALL; - if( op==WO_IN ){ - if( (pTerm->wtFlags & TERM_SLICE)==0 ){ - pHidden->mIn |= SMASKBIT32(j); - } - op = WO_EQ; - } - if( op==WO_AUX ){ - pIdxCons[j].op = pTerm->eMatchOp; - }else if( op & (WO_ISNULL|WO_IS) ){ - if( op==WO_ISNULL ){ - pIdxCons[j].op = SQLITE_INDEX_CONSTRAINT_ISNULL; - }else{ - pIdxCons[j].op = SQLITE_INDEX_CONSTRAINT_IS; - } - }else{ - pIdxCons[j].op = (u8)op; - /* The direct assignment in the previous line is possible only because - ** the WO_ and SQLITE_INDEX_CONSTRAINT_ codes are identical. The - ** following asserts verify this fact. */ - assert( WO_EQ==SQLITE_INDEX_CONSTRAINT_EQ ); - assert( WO_LT==SQLITE_INDEX_CONSTRAINT_LT ); - assert( WO_LE==SQLITE_INDEX_CONSTRAINT_LE ); - assert( WO_GT==SQLITE_INDEX_CONSTRAINT_GT ); - assert( WO_GE==SQLITE_INDEX_CONSTRAINT_GE ); - assert( pTerm->eOperator&(WO_IN|WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE|WO_AUX) ); - - if( op & (WO_LT|WO_LE|WO_GT|WO_GE) - && sqlite3ExprIsVector(pTerm->pExpr->pRight) - ){ - testcase( j!=i ); - if( j<16 ) mNoOmit |= (1 << j); - if( op==WO_LT ) pIdxCons[j].op = WO_LE; - if( op==WO_GT ) pIdxCons[j].op = WO_GE; + for(p=pWC, i=j=0; p; p=p->pOuter){ + int nLast = i+p->nTerm;; + for(pTerm=p->a; iwtFlags & TERM_OK)==0 ) continue; + pIdxCons[j].iColumn = pTerm->u.x.leftColumn; + pIdxCons[j].iTermOffset = i; + op = pTerm->eOperator & WO_ALL; + if( op==WO_IN ){ + if( (pTerm->wtFlags & TERM_SLICE)==0 ){ + pHidden->mIn |= SMASKBIT32(j); + } + op = WO_EQ; + } + if( op==WO_AUX ){ + pIdxCons[j].op = pTerm->eMatchOp; + }else if( op & (WO_ISNULL|WO_IS) ){ + if( op==WO_ISNULL ){ + pIdxCons[j].op = SQLITE_INDEX_CONSTRAINT_ISNULL; + }else{ + pIdxCons[j].op = SQLITE_INDEX_CONSTRAINT_IS; + } + }else{ + pIdxCons[j].op = (u8)op; + /* The direct assignment in the previous line is possible only because + ** the WO_ and SQLITE_INDEX_CONSTRAINT_ codes are identical. The + ** following asserts verify this fact. */ + assert( WO_EQ==SQLITE_INDEX_CONSTRAINT_EQ ); + assert( WO_LT==SQLITE_INDEX_CONSTRAINT_LT ); + assert( WO_LE==SQLITE_INDEX_CONSTRAINT_LE ); + assert( WO_GT==SQLITE_INDEX_CONSTRAINT_GT ); + assert( WO_GE==SQLITE_INDEX_CONSTRAINT_GE ); + assert( pTerm->eOperator&(WO_IN|WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE|WO_AUX) ); + + if( op & (WO_LT|WO_LE|WO_GT|WO_GE) + && sqlite3ExprIsVector(pTerm->pExpr->pRight) + ){ + testcase( j!=i ); + if( j<16 ) mNoOmit |= (1 << j); + if( op==WO_LT ) pIdxCons[j].op = WO_LE; + if( op==WO_GT ) pIdxCons[j].op = WO_GE; + } } - } - j++; + j++; + } } assert( j==nTerm ); pIdxInfo->nConstraint = j; for(i=j=0; ia[i].pExpr; - if( sqlite3ExprIsConstant(pExpr) ) continue; + if( sqlite3ExprIsConstant(0, pExpr) ) continue; assert( pExpr->op==TK_COLUMN || (pExpr->op==TK_COLLATE && pExpr->pLeft->op==TK_COLUMN && pExpr->iColumn==pExpr->pLeft->iColumn) ); @@ -158352,6 +164786,17 @@ static sqlite3_index_info *allocateIndexInfo( return pIdxInfo; } +/* +** Free and zero the sqlite3_index_info.idxStr value if needed. +*/ +static void freeIdxStr(sqlite3_index_info *pIdxInfo){ + if( pIdxInfo->needToFreeIdxStr ){ + sqlite3_free(pIdxInfo->idxStr); + pIdxInfo->idxStr = 0; + pIdxInfo->needToFreeIdxStr = 0; + } +} + /* ** Free an sqlite3_index_info structure allocated by allocateIndexInfo() ** and possibly modified by xBestIndex methods. @@ -158367,6 +164812,7 @@ static void freeIndexInfo(sqlite3 *db, sqlite3_index_info *pIdxInfo){ sqlite3ValueFree(pHidden->aRhs[i]); /* IMP: R-14553-25174 */ pHidden->aRhs[i] = 0; } + freeIdxStr(pIdxInfo); sqlite3DbFree(db, pIdxInfo); } @@ -158387,14 +164833,16 @@ static void freeIndexInfo(sqlite3 *db, sqlite3_index_info *pIdxInfo){ ** that this is required. */ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ - sqlite3_vtab *pVtab = sqlite3GetVTable(pParse->db, pTab)->pVtab; int rc; + sqlite3_vtab *pVtab; - whereTraceIndexInfoInputs(p); + assert( IsVirtual(pTab) ); + pVtab = sqlite3GetVTable(pParse->db, pTab)->pVtab; + whereTraceIndexInfoInputs(p, pTab); pParse->db->nSchemaLock++; rc = pVtab->pModule->xBestIndex(pVtab, p); pParse->db->nSchemaLock--; - whereTraceIndexInfoOutputs(p); + whereTraceIndexInfoOutputs(p, pTab); if( rc!=SQLITE_OK && rc!=SQLITE_CONSTRAINT ){ if( rc==SQLITE_NOMEM ){ @@ -158405,6 +164853,9 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ sqlite3ErrorMsg(pParse, "%s", pVtab->zErrMsg); } } + if( pTab->u.vtab.p->bAllSchemas ){ + sqlite3VtabUsesAllSchemas(pParse); + } sqlite3_free(pVtab->zErrMsg); pVtab->zErrMsg = 0; return rc; @@ -158662,7 +165113,7 @@ SQLITE_PRIVATE char sqlite3IndexColumnAffinity(sqlite3 *db, Index *pIdx, int iCo ** Value pLoop->nOut is currently set to the estimated number of rows ** visited for scanning (a=? AND b=?). This function reduces that estimate ** by some factor to account for the (c BETWEEN ? AND ?) expression based -** on the stat4 data for the index. this scan will be peformed multiple +** on the stat4 data for the index. this scan will be performed multiple ** times (once for each (a,b) combination that matches a=?) is dealt with ** by the caller. ** @@ -158914,7 +165365,8 @@ static int whereRangeScanEst( ** sample, then assume they are 4x more selective. This brings ** the estimated selectivity more in line with what it would be ** if estimated without the use of STAT4 tables. */ - if( iLwrIdx==iUprIdx ) nNew -= 20; assert( 20==sqlite3LogEst(4) ); + if( iLwrIdx==iUprIdx ){ nNew -= 20; } + assert( 20==sqlite3LogEst(4) ); }else{ nNew = 10; assert( 10==sqlite3LogEst(2) ); } @@ -158935,7 +165387,7 @@ static int whereRangeScanEst( UNUSED_PARAMETER(pBuilder); assert( pLower || pUpper ); #endif - assert( pUpper==0 || (pUpper->wtFlags & TERM_VNULL)==0 ); + assert( pUpper==0 || (pUpper->wtFlags & TERM_VNULL)==0 || pParse->nErr>0 ); nNew = whereRangeAdjust(pLower, nOut); nNew = whereRangeAdjust(pUpper, nNew); @@ -159138,17 +165590,34 @@ SQLITE_PRIVATE void sqlite3WhereClausePrint(WhereClause *pWC){ #ifdef WHERETRACE_ENABLED /* ** Print a WhereLoop object for debugging purposes -*/ -SQLITE_PRIVATE void sqlite3WhereLoopPrint(WhereLoop *p, WhereClause *pWC){ - WhereInfo *pWInfo = pWC->pWInfo; - int nb = 1+(pWInfo->pTabList->nSrc+3)/4; - SrcItem *pItem = pWInfo->pTabList->a + p->iTab; - Table *pTab = pItem->pTab; - Bitmask mAll = (((Bitmask)1)<<(nb*4)) - 1; - sqlite3DebugPrintf("%c%2d.%0*llx.%0*llx", p->cId, - p->iTab, nb, p->maskSelf, nb, p->prereq & mAll); - sqlite3DebugPrintf(" %12s", - pItem->zAlias ? pItem->zAlias : pTab->zName); +** +** Format example: +** +** .--- Position in WHERE clause rSetup, rRun, nOut ---. +** | | +** | .--- selfMask nTerm ------. | +** | | | | +** | | .-- prereq Idx wsFlags----. | | +** | | | Name | | | +** | | | __|__ nEq ---. ___|__ | __|__ +** | / \ / \ / \ | / \ / \ / \ +** 1.002.001 t2.t2xy 2 f 010241 N 2 cost 0,56,31 +*/ +SQLITE_PRIVATE void sqlite3WhereLoopPrint(const WhereLoop *p, const WhereClause *pWC){ + if( pWC ){ + WhereInfo *pWInfo = pWC->pWInfo; + int nb = 1+(pWInfo->pTabList->nSrc+3)/4; + SrcItem *pItem = pWInfo->pTabList->a + p->iTab; + Table *pTab = pItem->pSTab; + Bitmask mAll = (((Bitmask)1)<<(nb*4)) - 1; + sqlite3DebugPrintf("%c%2d.%0*llx.%0*llx", p->cId, + p->iTab, nb, p->maskSelf, nb, p->prereq & mAll); + sqlite3DebugPrintf(" %12s", + pItem->zAlias ? pItem->zAlias : pTab->zName); + }else{ + sqlite3DebugPrintf("%c%2d.%03llx.%03llx %c%d", + p->cId, p->iTab, p->maskSelf, p->prereq & 0xfff, p->cId, p->iTab); + } if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){ const char *zName; if( p->u.btree.pIndex && (zName = p->u.btree.pIndex->zName)!=0 ){ @@ -159185,6 +165654,15 @@ SQLITE_PRIVATE void sqlite3WhereLoopPrint(WhereLoop *p, WhereClause *pWC){ } } } +SQLITE_PRIVATE void sqlite3ShowWhereLoop(const WhereLoop *p){ + if( p ) sqlite3WhereLoopPrint(p, 0); +} +SQLITE_PRIVATE void sqlite3ShowWhereLoopList(const WhereLoop *p){ + while( p ){ + sqlite3ShowWhereLoop(p); + p = p->pNextLoop; + } +} #endif /* @@ -159297,46 +165775,60 @@ static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){ } /* -** Return TRUE if all of the following are true: +** Return TRUE if X is a proper subset of Y but is of equal or less cost. +** In other words, return true if all constraints of X are also part of Y +** and Y has additional constraints that might speed the search that X lacks +** but the cost of running X is not more than the cost of running Y. +** +** In other words, return true if the cost relationship between X and Y +** is inverted and needs to be adjusted. ** -** (1) X has the same or lower cost, or returns the same or fewer rows, -** than Y. -** (2) X uses fewer WHERE clause terms than Y -** (3) Every WHERE clause term used by X is also used by Y -** (4) X skips at least as many columns as Y -** (5) If X is a covering index, than Y is too +** Case 1: ** -** Conditions (2) and (3) mean that X is a "proper subset" of Y. -** If X is a proper subset of Y then Y is a better choice and ought -** to have a lower cost. This routine returns TRUE when that cost -** relationship is inverted and needs to be adjusted. Constraint (4) -** was added because if X uses skip-scan less than Y it still might -** deserve a lower cost even if it is a proper subset of Y. Constraint (5) -** was added because a covering index probably deserves to have a lower cost -** than a non-covering index even if it is a proper subset. +** (1a) X and Y use the same index. +** (1b) X has fewer == terms than Y +** (1c) Neither X nor Y use skip-scan +** (1d) X does not have a a greater cost than Y +** +** Case 2: +** +** (2a) X has the same or lower cost, or returns the same or fewer rows, +** than Y. +** (2b) X uses fewer WHERE clause terms than Y +** (2c) Every WHERE clause term used by X is also used by Y +** (2d) X skips at least as many columns as Y +** (2e) If X is a covering index, than Y is too */ static int whereLoopCheaperProperSubset( const WhereLoop *pX, /* First WhereLoop to compare */ const WhereLoop *pY /* Compare against this WhereLoop */ ){ int i, j; + if( pX->rRun>pY->rRun && pX->nOut>pY->nOut ) return 0; /* (1d) and (2a) */ + assert( (pX->wsFlags & WHERE_VIRTUALTABLE)==0 ); + assert( (pY->wsFlags & WHERE_VIRTUALTABLE)==0 ); + if( pX->u.btree.nEq < pY->u.btree.nEq /* (1b) */ + && pX->u.btree.pIndex==pY->u.btree.pIndex /* (1a) */ + && pX->nSkip==0 && pY->nSkip==0 /* (1c) */ + ){ + return 1; /* Case 1 is true */ + } if( pX->nLTerm-pX->nSkip >= pY->nLTerm-pY->nSkip ){ - return 0; /* X is not a subset of Y */ + return 0; /* (2b) */ } - if( pX->rRun>pY->rRun && pX->nOut>pY->nOut ) return 0; - if( pY->nSkip > pX->nSkip ) return 0; + if( pY->nSkip > pX->nSkip ) return 0; /* (2d) */ for(i=pX->nLTerm-1; i>=0; i--){ if( pX->aLTerm[i]==0 ) continue; for(j=pY->nLTerm-1; j>=0; j--){ if( pY->aLTerm[j]==pX->aLTerm[i] ) break; } - if( j<0 ) return 0; /* X not a subset of Y since term X[i] not used by Y */ + if( j<0 ) return 0; /* (2c) */ } if( (pX->wsFlags&WHERE_IDX_ONLY)!=0 && (pY->wsFlags&WHERE_IDX_ONLY)==0 ){ - return 0; /* Constraint (5) */ + return 0; /* (2e) */ } - return 1; /* All conditions meet */ + return 1; /* Case 2 is true */ } /* @@ -159417,7 +165909,7 @@ static WhereLoop **whereLoopFindLesser( ** rSetup. Call this SETUP-INVARIANT */ assert( p->rSetup>=pTemplate->rSetup ); - /* Any loop using an appliation-defined index (or PRIMARY KEY or + /* Any loop using an application-defined index (or PRIMARY KEY or ** UNIQUE constraint) with one or more == constraints is better ** than an automatic index. Unless it is a skip-scan. */ if( (p->wsFlags & WHERE_AUTO_INDEX)!=0 @@ -159444,7 +165936,7 @@ static WhereLoop **whereLoopFindLesser( /* If pTemplate is always better than p, then cause p to be overwritten ** with pTemplate. pTemplate is better than p if: - ** (1) pTemplate has no more dependences than p, and + ** (1) pTemplate has no more dependencies than p, and ** (2) pTemplate has an equal or lower cost than p. */ if( (p->prereq & pTemplate->prereq)==pTemplate->prereq /* (1) */ @@ -159562,7 +166054,7 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ }else{ /* We will be overwriting WhereLoop p[]. But before we do, first ** go through the rest of the list and delete any other entries besides - ** p[] that are also supplated by pTemplate */ + ** p[] that are also supplanted by pTemplate */ WhereLoop **ppTail = &p->pNextLoop; WhereLoop *pToDel; while( *ppTail ){ @@ -159674,7 +166166,7 @@ static void whereLoopOutputAdjust( Expr *pRight = pTerm->pExpr->pRight; int k = 0; testcase( pTerm->pExpr->op==TK_IS ); - if( sqlite3ExprIsInteger(pRight, &k) && k>=(-1) && k<=1 ){ + if( sqlite3ExprIsInteger(pRight, &k, 0) && k>=(-1) && k<=1 ){ k = 10; }else{ k = 20; @@ -159762,7 +166254,7 @@ static int whereRangeVectorLen( } /* -** Adjust the cost C by the costMult facter T. This only occurs if +** Adjust the cost C by the costMult factor T. This only occurs if ** compiled with -DSQLITE_ENABLE_COSTMULT */ #ifdef SQLITE_ENABLE_COSTMULT @@ -159789,7 +166281,7 @@ static int whereLoopAddBtreeIndex( Index *pProbe, /* An index on pSrc */ LogEst nInMul /* log(Number of iterations due to IN) */ ){ - WhereInfo *pWInfo = pBuilder->pWInfo; /* WHERE analyse context */ + WhereInfo *pWInfo = pBuilder->pWInfo; /* WHERE analyze context */ Parse *pParse = pWInfo->pParse; /* Parsing context */ sqlite3 *db = pParse->db; /* Database connection malloc context */ WhereLoop *pNew; /* Template WhereLoop under construction */ @@ -159826,7 +166318,12 @@ static int whereLoopAddBtreeIndex( assert( pNew->u.btree.nBtm==0 ); opMask = WO_EQ|WO_IN|WO_GT|WO_GE|WO_LT|WO_LE|WO_ISNULL|WO_IS; } - if( pProbe->bUnordered ) opMask &= ~(WO_GT|WO_GE|WO_LT|WO_LE); + if( pProbe->bUnordered || pProbe->bLowQual ){ + if( pProbe->bUnordered ) opMask &= ~(WO_GT|WO_GE|WO_LT|WO_LE); + if( pProbe->bLowQual && pSrc->fg.isIndexedBy==0 ){ + opMask &= ~(WO_EQ|WO_IN|WO_IS); + } + } assert( pNew->u.btree.nEqnColumn ); assert( pNew->u.btree.nEqnKeyCol @@ -159966,7 +166463,7 @@ static int whereLoopAddBtreeIndex( || (iCol>=0 && nInMul==0 && saved_nEq==pProbe->nKeyCol-1) ){ if( iCol==XN_ROWID || pProbe->uniqNotNull - || (pProbe->nKeyCol==1 && pProbe->onError && eOp==WO_EQ) + || (pProbe->nKeyCol==1 && pProbe->onError && (eOp & WO_EQ)) ){ pNew->wsFlags |= WHERE_ONEROW; }else{ @@ -160092,21 +166589,32 @@ static int whereLoopAddBtreeIndex( } } - /* Set rCostIdx to the cost of visiting selected rows in index. Add - ** it to pNew->rRun, which is currently set to the cost of the index - ** seek only. Then, if this is a non-covering index, add the cost of - ** visiting the rows in the main table. */ - assert( pSrc->pTab->szTabRow>0 ); + /* Set rCostIdx to the estimated cost of visiting selected rows in the + ** index. The estimate is the sum of two values: + ** 1. The cost of doing one search-by-key to find the first matching + ** entry + ** 2. Stepping forward in the index pNew->nOut times to find all + ** additional matching entries. + */ + assert( pSrc->pSTab->szTabRow>0 ); if( pProbe->idxType==SQLITE_IDXTYPE_IPK ){ /* The pProbe->szIdxRow is low for an IPK table since the interior - ** pages are small. Thuse szIdxRow gives a good estimate of seek cost. + ** pages are small. Thus szIdxRow gives a good estimate of seek cost. ** But the leaf pages are full-size, so pProbe->szIdxRow would badly ** under-estimate the scanning cost. */ rCostIdx = pNew->nOut + 16; }else{ - rCostIdx = pNew->nOut + 1 + (15*pProbe->szIdxRow)/pSrc->pTab->szTabRow; + rCostIdx = pNew->nOut + 1 + (15*pProbe->szIdxRow)/pSrc->pSTab->szTabRow; } - pNew->rRun = sqlite3LogEstAdd(rLogSize, rCostIdx); + rCostIdx = sqlite3LogEstAdd(rLogSize, rCostIdx); + + /* Estimate the cost of running the loop. If all data is coming + ** from the index, then this is just the cost of doing the index + ** lookup and scan. But if some data is coming out of the main table, + ** we also have to add in the cost of doing pNew->nOut searches to + ** locate the row in the main table that corresponds to the index entry. + */ + pNew->rRun = rCostIdx; if( (pNew->wsFlags & (WHERE_IDX_ONLY|WHERE_IPK|WHERE_EXPRIDX))==0 ){ pNew->rRun = sqlite3LogEstAdd(pNew->rRun, pNew->nOut + 16); } @@ -160212,7 +166720,9 @@ static int indexMightHelpWithOrderBy( for(ii=0; iinExpr; ii++){ Expr *pExpr = sqlite3ExprSkipCollateAndLikely(pOB->a[ii].pExpr); if( NEVER(pExpr==0) ) continue; - if( pExpr->op==TK_COLUMN && pExpr->iTable==iCursor ){ + if( (pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN) + && pExpr->iTable==iCursor + ){ if( pExpr->iColumn<0 ) return 1; for(jj=0; jjnKeyCol; jj++){ if( pExpr->iColumn==pIndex->aiColumn[jj] ) return 1; @@ -160406,6 +166916,100 @@ static SQLITE_NOINLINE u32 whereIsCoveringIndex( return rc; } +/* +** This is an sqlite3ParserAddCleanup() callback that is invoked to +** free the Parse->pIdxEpr list when the Parse object is destroyed. +*/ +static void whereIndexedExprCleanup(sqlite3 *db, void *pObject){ + IndexedExpr **pp = (IndexedExpr**)pObject; + while( *pp!=0 ){ + IndexedExpr *p = *pp; + *pp = p->pIENext; + sqlite3ExprDelete(db, p->pExpr); + sqlite3DbFreeNN(db, p); + } +} + +/* +** This function is called for a partial index - one with a WHERE clause - in +** two scenarios. In both cases, it determines whether or not the WHERE +** clause on the index implies that a column of the table may be safely +** replaced by a constant expression. For example, in the following +** SELECT: +** +** CREATE INDEX i1 ON t1(b, c) WHERE a=; +** SELECT a, b, c FROM t1 WHERE a= AND b=?; +** +** The "a" in the select-list may be replaced by , iff: +** +** (a) is a constant expression, and +** (b) The (a=) comparison uses the BINARY collation sequence, and +** (c) Column "a" has an affinity other than NONE or BLOB. +** +** If argument pItem is NULL, then pMask must not be NULL. In this case this +** function is being called as part of determining whether or not pIdx +** is a covering index. This function clears any bits in (*pMask) +** corresponding to columns that may be replaced by constants as described +** above. +** +** Otherwise, if pItem is not NULL, then this function is being called +** as part of coding a loop that uses index pIdx. In this case, add entries +** to the Parse.pIdxPartExpr list for each column that can be replaced +** by a constant. +*/ +static void wherePartIdxExpr( + Parse *pParse, /* Parse context */ + Index *pIdx, /* Partial index being processed */ + Expr *pPart, /* WHERE clause being processed */ + Bitmask *pMask, /* Mask to clear bits in */ + int iIdxCur, /* Cursor number for index */ + SrcItem *pItem /* The FROM clause entry for the table */ +){ + assert( pItem==0 || (pItem->fg.jointype & JT_RIGHT)==0 ); + assert( (pItem==0 || pMask==0) && (pMask!=0 || pItem!=0) ); + + if( pPart->op==TK_AND ){ + wherePartIdxExpr(pParse, pIdx, pPart->pRight, pMask, iIdxCur, pItem); + pPart = pPart->pLeft; + } + + if( (pPart->op==TK_EQ || pPart->op==TK_IS) ){ + Expr *pLeft = pPart->pLeft; + Expr *pRight = pPart->pRight; + u8 aff; + + if( pLeft->op!=TK_COLUMN ) return; + if( !sqlite3ExprIsConstant(0, pRight) ) return; + if( !sqlite3IsBinary(sqlite3ExprCompareCollSeq(pParse, pPart)) ) return; + if( pLeft->iColumn<0 ) return; + aff = pIdx->pTable->aCol[pLeft->iColumn].affinity; + if( aff>=SQLITE_AFF_TEXT ){ + if( pItem ){ + sqlite3 *db = pParse->db; + IndexedExpr *p = (IndexedExpr*)sqlite3DbMallocRaw(db, sizeof(*p)); + if( p ){ + int bNullRow = (pItem->fg.jointype&(JT_LEFT|JT_LTORJ))!=0; + p->pExpr = sqlite3ExprDup(db, pRight, 0); + p->iDataCur = pItem->iCursor; + p->iIdxCur = iIdxCur; + p->iIdxCol = pLeft->iColumn; + p->bMaybeNullRow = bNullRow; + p->pIENext = pParse->pIdxPartExpr; + p->aff = aff; + pParse->pIdxPartExpr = p; + if( p->pIENext==0 ){ + void *pArg = (void*)&pParse->pIdxPartExpr; + sqlite3ParserAddCleanup(pParse, whereIndexedExprCleanup, pArg); + } + } + }else if( pLeft->iColumn<(BMS-1) ){ + *pMask &= ~((Bitmask)1 << pLeft->iColumn); + } + } + } +} + + /* ** Add all WhereLoop objects for a single table of the join where the table ** is identified by pBuilder->pNew->iTab. That table is guaranteed to be @@ -160444,7 +167048,7 @@ static SQLITE_NOINLINE u32 whereIsCoveringIndex( */ static int whereLoopAddBtree( WhereLoopBuilder *pBuilder, /* WHERE clause information */ - Bitmask mPrereq /* Extra prerequesites for using this table */ + Bitmask mPrereq /* Extra prerequisites for using this table */ ){ WhereInfo *pWInfo; /* WHERE analysis context */ Index *pProbe; /* An index we are evaluating */ @@ -160465,9 +167069,9 @@ static int whereLoopAddBtree( pWInfo = pBuilder->pWInfo; pTabList = pWInfo->pTabList; pSrc = pTabList->a + pNew->iTab; - pTab = pSrc->pTab; + pTab = pSrc->pSTab; pWC = pBuilder->pWC; - assert( !IsVirtual(pSrc->pTab) ); + assert( !IsVirtual(pSrc->pSTab) ); if( pSrc->fg.isIndexedBy ){ assert( pSrc->fg.isCte==0 ); @@ -160492,7 +167096,7 @@ static int whereLoopAddBtree( sPk.idxType = SQLITE_IDXTYPE_IPK; aiRowEstPk[0] = pTab->nRowLogEst; aiRowEstPk[1] = 0; - pFirst = pSrc->pTab->pIndex; + pFirst = pSrc->pSTab->pIndex; if( pSrc->fg.notIndexed==0 ){ /* The real indices of the table are only considered if the ** NOT INDEXED qualifier is omitted from the FROM clause */ @@ -160582,6 +167186,7 @@ static int whereLoopAddBtree( pNew->prereq = mPrereq; pNew->nOut = rSize; pNew->u.btree.pIndex = pProbe; + pNew->u.btree.pOrderBy = 0; b = indexMightHelpWithOrderBy(pBuilder, pProbe, pSrc->iCursor); /* The ONEPASS_DESIRED flags never occurs together with ORDER BY */ @@ -160609,11 +167214,12 @@ static int whereLoopAddBtree( #else pNew->rRun = rSize + 16; #endif - if( IsView(pTab) || (pTab->tabFlags & TF_Ephemeral)!=0 ){ - pNew->wsFlags |= WHERE_VIEWSCAN; - } ApplyCostMultiplier(pNew->rRun, pTab->costMult); whereLoopOutputAdjust(pWC, pNew, rSize); + if( pSrc->fg.isSubquery ){ + if( pSrc->fg.viaCoroutine ) pNew->wsFlags |= WHERE_COROUTINE; + pNew->u.btree.pOrderBy = pSrc->u4.pSubq->pSelect->pOrderBy; + } rc = whereLoopInsert(pBuilder, pNew); pNew->nOut = rSize; if( rc ) break; @@ -160624,6 +167230,11 @@ static int whereLoopAddBtree( pNew->wsFlags = WHERE_IDX_ONLY | WHERE_INDEXED; }else{ m = pSrc->colUsed & pProbe->colNotIdxed; + if( pProbe->pPartIdxWhere ){ + wherePartIdxExpr( + pWInfo->pParse, pProbe, pProbe->pPartIdxWhere, &m, 0, 0 + ); + } pNew->wsFlags = WHERE_INDEXED; if( m==TOPBIT || (pProbe->bHasExpr && !pProbe->bHasVCol && m!=0) ){ u32 isCov = whereIsCoveringIndex(pWInfo, pProbe, pSrc->iCursor); @@ -160646,7 +167257,9 @@ static int whereLoopAddBtree( " according to whereIsCoveringIndex()\n", pProbe->zName)); } } - }else if( m==0 ){ + }else if( m==0 + && (HasRowid(pTab) || pWInfo->pSelect!=0 || sqlite3FaultSim(700)) + ){ WHERETRACE(0x200, ("-> %s a covering index according to bitmasks\n", pProbe->zName, m==0 ? "is" : "is not")); @@ -160722,7 +167335,7 @@ static int whereLoopAddBtree( ** unique index is used (making the index functionally non-unique) ** then the sqlite_stat1 data becomes important for scoring the ** plan */ - pTab->tabFlags |= TF_StatsUsed; + pTab->tabFlags |= TF_MaybeReanalyze; } #ifdef SQLITE_ENABLE_STAT4 sqlite3Stat4ProbeFree(pBuilder->pRec); @@ -160744,6 +167357,21 @@ static int isLimitTerm(WhereTerm *pTerm){ && pTerm->eMatchOp<=SQLITE_INDEX_CONSTRAINT_OFFSET; } +/* +** Return true if the first nCons constraints in the pUsage array are +** marked as in-use (have argvIndex>0). False otherwise. +*/ +static int allConstraintsUsed( + struct sqlite3_index_constraint_usage *aUsage, + int nCons +){ + int ii; + for(ii=0; iipNew->iTab. This @@ -160794,7 +167422,7 @@ static int whereLoopAddVirtualOne( ** arguments mUsable and mExclude. */ pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint; for(i=0; ia[pIdxCons->iTermOffset]; + WhereTerm *pTerm = termFromWhereClause(pWC, pIdxCons->iTermOffset); pIdxCons->usable = 0; if( (pTerm->prereqRight & mUsable)==pTerm->prereqRight && (pTerm->eOperator & mExclude)==0 @@ -160813,11 +167441,10 @@ static int whereLoopAddVirtualOne( pIdxInfo->estimatedCost = SQLITE_BIG_DBL / (double)2; pIdxInfo->estimatedRows = 25; pIdxInfo->idxFlags = 0; - pIdxInfo->colUsed = (sqlite3_int64)pSrc->colUsed; pHidden->mHandleIn = 0; /* Invoke the virtual table xBestIndex() method */ - rc = vtabBestIndex(pParse, pSrc->pTab, pIdxInfo); + rc = vtabBestIndex(pParse, pSrc->pSTab, pIdxInfo); if( rc ){ if( rc==SQLITE_CONSTRAINT ){ /* If the xBestIndex method returns SQLITE_CONSTRAINT, that means @@ -160825,6 +167452,7 @@ static int whereLoopAddVirtualOne( ** Make no entries in the loop table. */ WHERETRACE(0xffffffff, (" ^^^^--- non-viable plan rejected!\n")); + freeIdxStr(pIdxInfo); return SQLITE_OK; } return rc; @@ -160842,18 +167470,17 @@ static int whereLoopAddVirtualOne( int j = pIdxCons->iTermOffset; if( iTerm>=nConstraint || j<0 - || j>=pWC->nTerm + || (pTerm = termFromWhereClause(pWC, j))==0 || pNew->aLTerm[iTerm]!=0 || pIdxCons->usable==0 ){ - sqlite3ErrorMsg(pParse,"%s.xBestIndex malfunction",pSrc->pTab->zName); - testcase( pIdxInfo->needToFreeIdxStr ); + sqlite3ErrorMsg(pParse,"%s.xBestIndex malfunction",pSrc->pSTab->zName); + freeIdxStr(pIdxInfo); return SQLITE_ERROR; } testcase( iTerm==nConstraint-1 ); testcase( j==0 ); testcase( j==pWC->nTerm-1 ); - pTerm = &pWC->a[j]; pNew->prereq |= pTerm->prereqRight; assert( iTermnLSlot ); pNew->aLTerm[iTerm] = pTerm; @@ -160884,18 +167511,21 @@ static int whereLoopAddVirtualOne( *pbIn = 1; assert( (mExclude & WO_IN)==0 ); } + /* Unless pbRetryLimit is non-NULL, there should be no LIMIT/OFFSET + ** terms. And if there are any, they should follow all other terms. */ assert( pbRetryLimit || !isLimitTerm(pTerm) ); - if( isLimitTerm(pTerm) && *pbIn ){ + assert( !isLimitTerm(pTerm) || i>=nConstraint-2 ); + assert( !isLimitTerm(pTerm) || i==nConstraint-1 || isLimitTerm(pTerm+1) ); + + if( isLimitTerm(pTerm) && (*pbIn || !allConstraintsUsed(pUsage, i)) ){ /* If there is an IN(...) term handled as an == (separate call to ** xFilter for each value on the RHS of the IN) and a LIMIT or - ** OFFSET term handled as well, the plan is unusable. Set output - ** variable *pbRetryLimit to true to tell the caller to retry with - ** LIMIT and OFFSET disabled. */ - if( pIdxInfo->needToFreeIdxStr ){ - sqlite3_free(pIdxInfo->idxStr); - pIdxInfo->idxStr = 0; - pIdxInfo->needToFreeIdxStr = 0; - } + ** OFFSET term handled as well, the plan is unusable. Similarly, + ** if there is a LIMIT/OFFSET and there are other unused terms, + ** the plan cannot be used. In these cases set variable *pbRetryLimit + ** to true to tell the caller to retry with LIMIT and OFFSET + ** disabled. */ + freeIdxStr(pIdxInfo); *pbRetryLimit = 1; return SQLITE_OK; } @@ -160907,8 +167537,8 @@ static int whereLoopAddVirtualOne( if( pNew->aLTerm[i]==0 ){ /* The non-zero argvIdx values must be contiguous. Raise an ** error if they are not */ - sqlite3ErrorMsg(pParse,"%s.xBestIndex malfunction",pSrc->pTab->zName); - testcase( pIdxInfo->needToFreeIdxStr ); + sqlite3ErrorMsg(pParse,"%s.xBestIndex malfunction",pSrc->pSTab->zName); + freeIdxStr(pIdxInfo); return SQLITE_ERROR; } } @@ -160919,6 +167549,7 @@ static int whereLoopAddVirtualOne( pNew->u.vtab.idxStr = pIdxInfo->idxStr; pNew->u.vtab.isOrdered = (i8)(pIdxInfo->orderByConsumed ? pIdxInfo->nOrderBy : 0); + pNew->u.vtab.bIdxNumHex = (pIdxInfo->idxFlags&SQLITE_INDEX_SCAN_HEX)!=0; pNew->rSetup = 0; pNew->rRun = sqlite3LogEstFromDouble(pIdxInfo->estimatedCost); pNew->nOut = sqlite3LogEst(pIdxInfo->estimatedRows); @@ -160951,7 +167582,7 @@ static int whereLoopAddVirtualOne( ** ** Return a pointer to the collation name: ** -** 1. If there is an explicit COLLATE operator on the constaint, return it. +** 1. If there is an explicit COLLATE operator on the constraint, return it. ** ** 2. Else, if the column has an alternative collation, return that. ** @@ -160963,7 +167594,7 @@ SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info *pIdxInfo, int if( iCons>=0 && iConsnConstraint ){ CollSeq *pC = 0; int iTerm = pIdxInfo->aConstraint[iCons].iTermOffset; - Expr *pX = pHidden->pWC->a[iTerm].pExpr; + Expr *pX = termFromWhereClause(pHidden->pWC, iTerm)->pExpr; if( pX->pLeft ){ pC = sqlite3ExprCompareCollSeq(pHidden->pParse, pX); } @@ -161006,10 +167637,12 @@ SQLITE_API int sqlite3_vtab_rhs_value( sqlite3_value *pVal = 0; int rc = SQLITE_OK; if( iCons<0 || iCons>=pIdxInfo->nConstraint ){ - rc = SQLITE_MISUSE; /* EV: R-30545-25046 */ + rc = SQLITE_MISUSE_BKPT; /* EV: R-30545-25046 */ }else{ if( pH->aRhs[iCons]==0 ){ - WhereTerm *pTerm = &pH->pWC->a[pIdxInfo->aConstraint[iCons].iTermOffset]; + WhereTerm *pTerm = termFromWhereClause( + pH->pWC, pIdxInfo->aConstraint[iCons].iTermOffset + ); rc = sqlite3ValueFromExpr( pH->pParse->db, pTerm->pExpr->pRight, ENC(pH->pParse->db), SQLITE_AFF_BLOB, &pH->aRhs[iCons] @@ -161036,8 +167669,6 @@ SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info *pIdxInfo){ return pHidden->eDistinct; } -#if (defined(SQLITE_ENABLE_DBPAGE_VTAB) || defined(SQLITE_TEST)) \ - && !defined(SQLITE_OMIT_VIRTUALTABLE) /* ** Cause the prepared statement that is associated with a call to ** xBestIndex to potentially use all schemas. If the statement being @@ -161047,9 +167678,7 @@ SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info *pIdxInfo){ ** ** This is used by the (built-in) sqlite_dbpage virtual table. */ -SQLITE_PRIVATE void sqlite3VtabUsesAllSchemas(sqlite3_index_info *pIdxInfo){ - HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; - Parse *pParse = pHidden->pParse; +SQLITE_PRIVATE void sqlite3VtabUsesAllSchemas(Parse *pParse){ int nDb = pParse->db->nDb; int i; for(i=0; ipWC; pNew = pBuilder->pNew; pSrc = &pWInfo->pTabList->a[pNew->iTab]; - assert( IsVirtual(pSrc->pTab) ); + assert( IsVirtual(pSrc->pSTab) ); p = allocateIndexInfo(pWInfo, pWC, mUnusable, pSrc, &mNoOmit); if( p==0 ) return SQLITE_NOMEM_BKPT; pNew->rSetup = 0; @@ -161126,7 +167754,7 @@ static int whereLoopAddVirtual( } /* First call xBestIndex() with all constraints usable. */ - WHERETRACE(0x800, ("BEGIN %s.addVirtual()\n", pSrc->pTab->zName)); + WHERETRACE(0x800, ("BEGIN %s.addVirtual()\n", pSrc->pSTab->zName)); WHERETRACE(0x800, (" VirtualOne: all usable\n")); rc = whereLoopAddVirtualOne( pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn, &bRetry @@ -161170,9 +167798,8 @@ static int whereLoopAddVirtual( Bitmask mNext = ALLBITS; assert( mNext>0 ); for(i=0; ia[p->aConstraint[i].iTermOffset].prereqRight & ~mPrereq - ); + int iTerm = p->aConstraint[i].iTermOffset; + Bitmask mThis = termFromWhereClause(pWC, iTerm)->prereqRight & ~mPrereq; if( mThis>mPrev && mThisneedToFreeIdxStr ) sqlite3_free(p->idxStr); freeIndexInfo(pParse->db, p); - WHERETRACE(0x800, ("END %s.addVirtual(), rc=%d\n", pSrc->pTab->zName, rc)); + WHERETRACE(0x800, ("END %s.addVirtual(), rc=%d\n", pSrc->pSTab->zName, rc)); return rc; } #endif /* SQLITE_OMIT_VIRTUALTABLE */ @@ -161282,7 +167908,7 @@ static int whereLoopAddOr( } #endif #ifndef SQLITE_OMIT_VIRTUALTABLE - if( IsVirtual(pItem->pTab) ){ + if( IsVirtual(pItem->pSTab) ){ rc = whereLoopAddVirtual(&sSubBuild, mPrereq, mUnusable); }else #endif @@ -161396,7 +168022,7 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ mPrereq = 0; } #ifndef SQLITE_OMIT_VIRTUALTABLE - if( IsVirtual(pItem->pTab) ){ + if( IsVirtual(pItem->pSTab) ){ SrcItem *p; for(p=&pItem[1]; pfg.jointype & (JT_OUTER|JT_CROSS)) ){ @@ -161428,6 +168054,97 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ return rc; } +/* Implementation of the order-by-subquery optimization: +** +** WhereLoop pLoop, which the iLoop-th term of the nested loop, is really +** a subquery or CTE that has an ORDER BY clause. See if any of the terms +** in the subquery ORDER BY clause will satisfy pOrderBy from the outer +** query. Mark off all satisfied terms (by setting bits in *pOBSat) and +** return TRUE if they do. If not, return false. +** +** Example: +** +** CREATE TABLE t1(a,b,c, PRIMARY KEY(a,b)); +** CREATE TABLE t2(x,y); +** WITH t3(p,q) AS MATERIALIZED (SELECT x+y, x-y FROM t2 ORDER BY x+y) +** SELECT * FROM t3 JOIN t1 ON a=q ORDER BY p, b; +** +** The CTE named "t3" comes out in the natural order of "p", so the first +** first them of "ORDER BY p,b" is satisfied by a sequential scan of "t3" +** and sorting only needs to occur on the second term "b". +** +** Limitations: +** +** (1) The optimization is not applied if the outer ORDER BY contains +** a COLLATE clause. The optimization might be applied if the +** outer ORDER BY uses NULLS FIRST, NULLS LAST, ASC, and/or DESC as +** long as the subquery ORDER BY does the same. But if the +** outer ORDER BY uses COLLATE, even a redundant COLLATE, the +** optimization is bypassed. +** +** (2) The subquery ORDER BY terms must exactly match subquery result +** columns, including any COLLATE annotations. This routine relies +** on iOrderByCol to do matching between order by terms and result +** columns, and iOrderByCol will not be set if the result column +** and ORDER BY collations differ. +** +** (3) The subquery and outer ORDER BY can be in opposite directions as +** long as the subquery is materialized. If the subquery is +** implemented as a co-routine, the sort orders must be in the same +** direction because there is no way to run a co-routine backwards. +*/ +static SQLITE_NOINLINE int wherePathMatchSubqueryOB( + WhereInfo *pWInfo, /* The WHERE clause */ + WhereLoop *pLoop, /* The nested loop term that is a subquery */ + int iLoop, /* Which level of the nested loop. 0==outermost */ + int iCur, /* Cursor used by the this loop */ + ExprList *pOrderBy, /* The ORDER BY clause on the whole query */ + Bitmask *pRevMask, /* When loops need to go in reverse order */ + Bitmask *pOBSat /* Which terms of pOrderBy are satisfied so far */ +){ + int iOB; /* Index into pOrderBy->a[] */ + int jSub; /* Index into pSubOB->a[] */ + u8 rev = 0; /* True if iOB and jSub sort in opposite directions */ + u8 revIdx = 0; /* Sort direction for jSub */ + Expr *pOBExpr; /* Current term of outer ORDER BY */ + ExprList *pSubOB; /* Complete ORDER BY on the subquery */ + + pSubOB = pLoop->u.btree.pOrderBy; + assert( pSubOB!=0 ); + for(iOB=0; (MASKBIT(iOB) & *pOBSat)!=0; iOB++){} + for(jSub=0; jSubnExpr && iOBnExpr; jSub++, iOB++){ + if( pSubOB->a[jSub].u.x.iOrderByCol==0 ) break; + pOBExpr = pOrderBy->a[iOB].pExpr; + if( pOBExpr->op!=TK_COLUMN && pOBExpr->op!=TK_AGG_COLUMN ) break; + if( pOBExpr->iTable!=iCur ) break; + if( pOBExpr->iColumn!=pSubOB->a[jSub].u.x.iOrderByCol-1 ) break; + if( (pWInfo->wctrlFlags & WHERE_GROUPBY)==0 ){ + u8 sfOB = pOrderBy->a[iOB].fg.sortFlags; /* sortFlags for iOB */ + u8 sfSub = pSubOB->a[jSub].fg.sortFlags; /* sortFlags for jSub */ + if( (sfSub & KEYINFO_ORDER_BIGNULL) != (sfOB & KEYINFO_ORDER_BIGNULL) ){ + break; + } + revIdx = sfSub & KEYINFO_ORDER_DESC; + if( jSub>0 ){ + if( (rev^revIdx)!=(sfOB & KEYINFO_ORDER_DESC) ){ + break; + } + }else{ + rev = revIdx ^ (sfOB & KEYINFO_ORDER_DESC); + if( rev ){ + if( (pLoop->wsFlags & WHERE_COROUTINE)!=0 ){ + /* Cannot run a co-routine in reverse order */ + break; + } + *pRevMask |= MASKBIT(iLoop); + } + } + } + *pOBSat |= MASKBIT(iOB); + } + return jSub>0; +} + /* ** Examine a WherePath (with the addition of the extra WhereLoop of the 6th ** parameters) to see if it outputs rows in the requested ORDER BY @@ -161573,9 +168290,18 @@ static i8 wherePathSatisfiesOrderBy( if( (pLoop->wsFlags & WHERE_ONEROW)==0 ){ if( pLoop->wsFlags & WHERE_IPK ){ + if( pLoop->u.btree.pOrderBy + && OptimizationEnabled(db, SQLITE_OrderBySubq) + && wherePathMatchSubqueryOB(pWInfo,pLoop,iLoop,iCur, + pOrderBy,pRevMask, &obSat) + ){ + nColumn = 0; + isOrderDistinct = 0; + }else{ + nColumn = 1; + } pIndex = 0; nKeyCol = 0; - nColumn = 1; }else if( (pIndex = pLoop->u.btree.pIndex)==0 || pIndex->bUnordered ){ return 0; }else{ @@ -161585,7 +168311,7 @@ static i8 wherePathSatisfiesOrderBy( assert( pIndex->aiColumn[nColumn-1]==XN_ROWID || !HasRowid(pIndex->pTable)); /* All relevant terms of the index must also be non-NULL in order - ** for isOrderDistinct to be true. So the isOrderDistint value + ** for isOrderDistinct to be true. So the isOrderDistinct value ** computed here might be a false positive. Corrections will be ** made at tag-20210426-1 below */ isOrderDistinct = IsUniqueIndex(pIndex) @@ -161670,7 +168396,7 @@ static i8 wherePathSatisfiesOrderBy( } /* Find the ORDER BY term that corresponds to the j-th column - ** of the index and mark that ORDER BY term off + ** of the index and mark that ORDER BY term having been satisfied. */ isMatch = 0; for(i=0; bOnce && ia[i].pExpr; mTerm = sqlite3WhereExprUsage(&pWInfo->sMaskSet,p); - if( mTerm==0 && !sqlite3ExprIsConstant(p) ) continue; + if( mTerm==0 && !sqlite3ExprIsConstant(0,p) ) continue; if( (mTerm&~orderDistinctMask)==0 ){ obSat |= MASKBIT(i); } @@ -161877,6 +168603,83 @@ static LogEst whereSortingCost( return rSortCost; } +/* +** Compute the maximum number of paths in the solver algorithm, for +** queries that have three or more terms in the FROM clause. Queries with +** two or fewer FROM clause terms are handled by the caller. +** +** Query planning is NP-hard. We must limit the number of paths at +** each step of the solver search algorithm to avoid exponential behavior. +** +** The value returned is a tuning parameter. Currently the value is: +** +** 18 for star queries +** 12 otherwise +** +** For the purposes of SQLite, a star-query is defined as a query +** with a large central table that is joined against four or more +** smaller tables. The central table is called the "fact" table. +** The smaller tables that get joined are "dimension tables". +** +** SIDE EFFECT: (and really the whole point of this subroutine) +** +** If pWInfo describes a star-query, then the cost on WhereLoops for the +** fact table is reduced. This heuristic helps keep fact tables in +** outer loops. Without this heuristic, paths with fact tables in outer +** loops tend to get pruned by the mxChoice limit on the number of paths, +** resulting in poor query plans. The total amount of heuristic cost +** adjustment is stored in pWInfo->nOutStarDelta and the cost adjustment +** for each WhereLoop is stored in its rStarDelta field. +*/ +static int computeMxChoice(WhereInfo *pWInfo, LogEst nRowEst){ + int nLoop = pWInfo->nLevel; /* Number of terms in the join */ + if( nRowEst==0 && nLoop>=5 ){ + /* Check to see if we are dealing with a star schema and if so, reduce + ** the cost of fact tables relative to dimension tables, as a heuristic + ** to help keep the fact tables in outer loops. + */ + int iLoop; /* Counter over join terms */ + Bitmask m; /* Bitmask for current loop */ + assert( pWInfo->nOutStarDelta==0 ); + for(iLoop=0, m=1; iLooppLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ + if( (pWLoop->prereq & m)!=0 && (pWLoop->maskSelf & mSeen)==0 ){ + nDep++; + mSeen |= pWLoop->maskSelf; + } + } + if( nDep<=3 ) continue; + rDelta = 15*(nDep-3); +#ifdef WHERETRACE_ENABLED /* 0x4 */ + if( sqlite3WhereTrace&0x4 ){ + SrcItem *pItem = pWInfo->pTabList->a + iLoop; + sqlite3DebugPrintf("Fact-table %s: %d dimensions, cost reduced %d\n", + pItem->zAlias ? pItem->zAlias : pItem->pSTab->zName, + nDep, rDelta); + } +#endif + if( pWInfo->nOutStarDelta==0 ){ + for(pWLoop=pWInfo->pLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ + pWLoop->rStarDelta = 0; + } + } + pWInfo->nOutStarDelta += rDelta; + for(pWLoop=pWInfo->pLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ + if( pWLoop->maskSelf==m ){ + pWLoop->rRun -= rDelta; + pWLoop->nOut -= rDelta; + pWLoop->rStarDelta = rDelta; + } + } + } + } + return pWInfo->nOutStarDelta>0 ? 18 : 12; +} + /* ** Given the list of WhereLoop objects at pWInfo->pLoops, this routine ** attempts to find the lowest cost path that visits each WhereLoop @@ -161912,12 +168715,25 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ pParse = pWInfo->pParse; nLoop = pWInfo->nLevel; - /* TUNING: For simple queries, only the best path is tracked. - ** For 2-way joins, the 5 best paths are followed. - ** For joins of 3 or more tables, track the 10 best paths */ - mxChoice = (nLoop<=1) ? 1 : (nLoop==2 ? 5 : 10); + WHERETRACE(0x002, ("---- begin solver. (nRowEst=%d, nQueryLoop=%d)\n", + nRowEst, pParse->nQueryLoop)); + /* TUNING: mxChoice is the maximum number of possible paths to preserve + ** at each step. Based on the number of loops in the FROM clause: + ** + ** nLoop mxChoice + ** ----- -------- + ** 1 1 // the most common case + ** 2 5 + ** 3+ 12 or 18 // see computeMxChoice() + */ + if( nLoop<=1 ){ + mxChoice = 1; + }else if( nLoop==2 ){ + mxChoice = 5; + }else{ + mxChoice = computeMxChoice(pWInfo, nRowEst); + } assert( nLoop<=pWInfo->pTabList->nSrc ); - WHERETRACE(0x002, ("---- begin solver. (nRowEst=%d)\n", nRowEst)); /* If nRowEst is zero and there is an ORDER BY clause, ignore it. In this ** case the purpose of this call is to estimate the number of rows returned @@ -162000,7 +168816,10 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ /* At this point, pWLoop is a candidate to be the next loop. ** Compute its cost */ - rUnsorted = sqlite3LogEstAdd(pWLoop->rSetup,pWLoop->rRun + pFrom->nRow); + rUnsorted = pWLoop->rRun + pFrom->nRow; + if( pWLoop->rSetup ){ + rUnsorted = sqlite3LogEstAdd(pWLoop->rSetup, rUnsorted); + } rUnsorted = sqlite3LogEstAdd(rUnsorted, pFrom->rUnsorted); nOut = pFrom->nRow + pWLoop->nOut; maskNew = pFrom->maskLoop | pWLoop->maskSelf; @@ -162020,7 +168839,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ ); } /* TUNING: Add a small extra penalty (3) to sorting as an - ** extra encouragment to the query planner to select a plan + ** extra encouragement to the query planner to select a plan ** where the rows emerge in the correct order without any sorting ** required. */ rCost = sqlite3LogEstAdd(rUnsorted, aSortCost[isOrdered]) + 3; @@ -162034,13 +168853,6 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ rUnsorted -= 2; /* TUNING: Slight bias in favor of no-sort plans */ } - /* TUNING: A full-scan of a VIEW or subquery in the outer loop - ** is not so bad. */ - if( iLoop==0 && (pWLoop->wsFlags & WHERE_VIEWSCAN)!=0 ){ - rCost += -10; - nOut += -30; - } - /* Check to see if pWLoop should be added to the set of ** mxChoice best-so-far paths. ** @@ -162052,6 +168864,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ ** to (pTo->isOrdered==(-1))==(isOrdered==(-1))" for the range ** of legal values for isOrdered, -1..64. */ + testcase( nTo==0 ); for(jj=0, pTo=aTo; jjmaskLoop==maskNew && ((pTo->isOrdered^isOrdered)&0x80)==0 @@ -162168,16 +168981,28 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ #ifdef WHERETRACE_ENABLED /* >=2 */ if( sqlite3WhereTrace & 0x02 ){ + LogEst rMin, rFloor = 0; + int nDone = 0; sqlite3DebugPrintf("---- after round %d ----\n", iLoop); - for(ii=0, pTo=aTo; iirCost, pTo->nRow, - pTo->isOrdered>=0 ? (pTo->isOrdered+'0') : '?'); - if( pTo->isOrdered>0 ){ - sqlite3DebugPrintf(" rev=0x%llx\n", pTo->revLoop); - }else{ - sqlite3DebugPrintf("\n"); + while( nDonerCost>rFloor && pTo->rCostrCost; + } + for(ii=0, pTo=aTo; iirCost==rMin ){ + sqlite3DebugPrintf(" %s cost=%-3d nrow=%-3d order=%c", + wherePathName(pTo, iLoop+1, 0), pTo->rCost, pTo->nRow, + pTo->isOrdered>=0 ? (pTo->isOrdered+'0') : '?'); + if( pTo->isOrdered>0 ){ + sqlite3DebugPrintf(" rev=0x%llx\n", pTo->revLoop); + }else{ + sqlite3DebugPrintf("\n"); + } + nDone++; + } } + rFloor = rMin; } } #endif @@ -162227,10 +169052,9 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ if( pFrom->isOrdered==pWInfo->pOrderBy->nExpr ){ pWInfo->eDistinct = WHERE_DISTINCT_ORDERED; } - if( pWInfo->pSelect->pOrderBy - && pWInfo->nOBSat > pWInfo->pSelect->pOrderBy->nExpr ){ - pWInfo->nOBSat = pWInfo->pSelect->pOrderBy->nExpr; - } + /* vvv--- See check-in [12ad822d9b827777] on 2023-03-16 ---vvv */ + assert( pWInfo->pSelect->pOrderBy==0 + || pWInfo->nOBSat <= pWInfo->pSelect->pOrderBy->nExpr ); }else{ pWInfo->revMask = pFrom->revLoop; if( pWInfo->nOBSat<=0 ){ @@ -162273,14 +169097,90 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ } } - - pWInfo->nRowOut = pFrom->nRow; + pWInfo->nRowOut = pFrom->nRow + pWInfo->nOutStarDelta; /* Free temporary memory and return success */ sqlite3StackFreeNN(pParse->db, pSpace); return SQLITE_OK; } +/* +** This routine implements a heuristic designed to improve query planning. +** This routine is called in between the first and second call to +** wherePathSolver(). Hence the name "Interstage" "Heuristic". +** +** The first call to wherePathSolver() (hereafter just "solver()") computes +** the best path without regard to the order of the outputs. The second call +** to the solver() builds upon the first call to try to find an alternative +** path that satisfies the ORDER BY clause. +** +** This routine looks at the results of the first solver() run, and for +** every FROM clause term in the resulting query plan that uses an equality +** constraint against an index, disable other WhereLoops for that same +** FROM clause term that would try to do a full-table scan. This prevents +** an index search from being converted into a full-table scan in order to +** satisfy an ORDER BY clause, since even though we might get slightly better +** performance using the full-scan without sorting if the output size +** estimates are very precise, we might also get severe performance +** degradation using the full-scan if the output size estimate is too large. +** It is better to err on the side of caution. +** +** Except, if the first solver() call generated a full-table scan in an outer +** loop then stop this analysis at the first full-scan, since the second +** solver() run might try to swap that full-scan for another in order to +** get the output into the correct order. In other words, we allow a +** rewrite like this: +** +** First Solver() Second Solver() +** |-- SCAN t1 |-- SCAN t2 +** |-- SEARCH t2 `-- SEARCH t1 +** `-- SORT USING B-TREE +** +** The purpose of this routine is to disallow rewrites such as: +** +** First Solver() Second Solver() +** |-- SEARCH t1 |-- SCAN t2 <--- bad! +** |-- SEARCH t2 `-- SEARCH t1 +** `-- SORT USING B-TREE +** +** See test cases in test/whereN.test for the real-world query that +** originally provoked this heuristic. +*/ +static SQLITE_NOINLINE void whereInterstageHeuristic(WhereInfo *pWInfo){ + int i; +#ifdef WHERETRACE_ENABLED + int once = 0; +#endif + for(i=0; inLevel; i++){ + WhereLoop *p = pWInfo->a[i].pWLoop; + if( p==0 ) break; + if( (p->wsFlags & WHERE_VIRTUALTABLE)!=0 ) continue; + if( (p->wsFlags & (WHERE_COLUMN_EQ|WHERE_COLUMN_NULL|WHERE_COLUMN_IN))!=0 ){ + u8 iTab = p->iTab; + WhereLoop *pLoop; + for(pLoop=pWInfo->pLoops; pLoop; pLoop=pLoop->pNextLoop){ + if( pLoop->iTab!=iTab ) continue; + if( (pLoop->wsFlags & (WHERE_CONSTRAINT|WHERE_AUTO_INDEX))!=0 ){ + /* Auto-index and index-constrained loops allowed to remain */ + continue; + } +#ifdef WHERETRACE_ENABLED + if( sqlite3WhereTrace & 0x80 ){ + if( once==0 ){ + sqlite3DebugPrintf("Loops disabled by interstage heuristic:\n"); + once = 1; + } + sqlite3WhereLoopPrint(pLoop, &pWInfo->sWC); + } +#endif /* WHERETRACE_ENABLED */ + pLoop->prereq = ALLBITS; /* Prevent 2nd solver() from using this one */ + } + }else{ + break; + } + } +} + /* ** Most queries use only a single table (they are not joins) and have ** simple == constraints against indexed fields. This routine attempts @@ -162308,7 +169208,7 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ if( pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE ) return 0; assert( pWInfo->pTabList->nSrc>=1 ); pItem = pWInfo->pTabList->a; - pTab = pItem->pTab; + pTab = pItem->pSTab; if( IsVirtual(pTab) ) return 0; if( pItem->fg.isIndexedBy || pItem->fg.notIndexed ){ testcase( pItem->fg.isIndexedBy ); @@ -162442,6 +169342,17 @@ static void showAllWhereLoops(WhereInfo *pWInfo, WhereClause *pWC){ ** at most a single row. ** 4) The table must not be referenced by any part of the query apart ** from its own USING or ON clause. +** 5) The table must not have an inner-join ON or USING clause if there is +** a RIGHT JOIN anywhere in the query. Otherwise the ON/USING clause +** might move from the right side to the left side of the RIGHT JOIN. +** Note: Due to (2), this condition can only arise if the table is +** the right-most table of a subquery that was flattened into the +** main query and that subquery was the right-hand operand of an +** inner join that held an ON or USING clause. +** 6) The ORDER BY clause has 63 or fewer terms +** 7) The omit-noop-join optimization is enabled. +** +** Items (1), (6), and (7) are checked by the caller. ** ** For example, given: ** @@ -162467,6 +169378,7 @@ static SQLITE_NOINLINE Bitmask whereOmitNoopJoin( ){ int i; Bitmask tabUsed; + int hasRightJoin; /* Preconditions checked by the caller */ assert( pWInfo->nLevel>=2 ); @@ -162481,10 +169393,12 @@ static SQLITE_NOINLINE Bitmask whereOmitNoopJoin( if( pWInfo->pOrderBy ){ tabUsed |= sqlite3WhereExprListUsage(&pWInfo->sMaskSet, pWInfo->pOrderBy); } + hasRightJoin = (pWInfo->pTabList->a[0].fg.jointype & JT_LTORJ)!=0; for(i=pWInfo->nLevel-1; i>=1; i--){ WhereTerm *pTerm, *pEnd; SrcItem *pItem; WhereLoop *pLoop; + Bitmask m1; pLoop = pWInfo->a[i].pWLoop; pItem = &pWInfo->pTabList->a[pLoop->iTab]; if( (pItem->fg.jointype & (JT_LEFT|JT_RIGHT))!=JT_LEFT ) continue; @@ -162503,9 +169417,18 @@ static SQLITE_NOINLINE Bitmask whereOmitNoopJoin( break; } } + if( hasRightJoin + && ExprHasProperty(pTerm->pExpr, EP_InnerON) + && pTerm->pExpr->w.iJoin==pItem->iCursor + ){ + break; /* restriction (5) */ + } } if( pTerm drop loop %c not used\n", pLoop->cId)); + WHERETRACE(0xffffffff,("-> omit unused FROM-clause term %c\n",pLoop->cId)); + m1 = MASKBIT(i)-1; + testcase( ((pWInfo->revMask>>1) & ~m1)!=0 ); + pWInfo->revMask = (m1 & pWInfo->revMask) | ((pWInfo->revMask>>1) & ~m1); notReady &= ~pLoop->maskSelf; for(pTerm=pWInfo->sWC.a; pTermprereqAll & pLoop->maskSelf)!=0 ){ @@ -162552,9 +169475,9 @@ static SQLITE_NOINLINE void whereCheckIfBloomFilterIsUseful( WhereLoop *pLoop = pWInfo->a[i].pWLoop; const unsigned int reqFlags = (WHERE_SELFCULL|WHERE_COLUMN_EQ); SrcItem *pItem = &pWInfo->pTabList->a[pLoop->iTab]; - Table *pTab = pItem->pTab; + Table *pTab = pItem->pSTab; if( (pTab->tabFlags & TF_HasStat1)==0 ) break; - pTab->tabFlags |= TF_StatsUsed; + pTab->tabFlags |= TF_MaybeReanalyze; if( i>=1 && (pLoop->wsFlags & reqFlags)==reqFlags /* vvvvvv--- Always the case if WHERE_COLUMN_EQ is defined */ @@ -162572,20 +169495,7 @@ static SQLITE_NOINLINE void whereCheckIfBloomFilterIsUseful( } } nSearch += pLoop->nOut; - } -} - -/* -** This is an sqlite3ParserAddCleanup() callback that is invoked to -** free the Parse->pIdxEpr list when the Parse object is destroyed. -*/ -static void whereIndexedExprCleanup(sqlite3 *db, void *pObject){ - Parse *pParse = (Parse*)pObject; - while( pParse->pIdxEpr!=0 ){ - IndexedExpr *p = pParse->pIdxEpr; - pParse->pIdxEpr = p->pIENext; - sqlite3ExprDelete(db, p->pExpr); - sqlite3DbFreeNN(db, p); + if( pWInfo->nOutStarDelta ) nSearch += pLoop->rStarDelta; } } @@ -162614,20 +169524,14 @@ static SQLITE_NOINLINE void whereAddIndexedExpr( for(i=0; inColumn; i++){ Expr *pExpr; int j = pIdx->aiColumn[i]; - int bMaybeNullRow; if( j==XN_EXPR ){ pExpr = pIdx->aColExpr->a[i].pExpr; - testcase( pTabItem->fg.jointype & JT_LEFT ); - testcase( pTabItem->fg.jointype & JT_RIGHT ); - testcase( pTabItem->fg.jointype & JT_LTORJ ); - bMaybeNullRow = (pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0; }else if( j>=0 && (pTab->aCol[j].colFlags & COLFLAG_VIRTUAL)!=0 ){ pExpr = sqlite3ColumnExpr(pTab, &pTab->aCol[j]); - bMaybeNullRow = 0; }else{ continue; } - if( sqlite3ExprIsConstant(pExpr) ) continue; + if( sqlite3ExprIsConstant(0,pExpr) ) continue; p = sqlite3DbMallocRaw(pParse->db, sizeof(IndexedExpr)); if( p==0 ) break; p->pIENext = pParse->pIdxEpr; @@ -162641,7 +169545,7 @@ static SQLITE_NOINLINE void whereAddIndexedExpr( p->iDataCur = pTabItem->iCursor; p->iIdxCur = iIdxCur; p->iIdxCol = i; - p->bMaybeNullRow = bMaybeNullRow; + p->bMaybeNullRow = (pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0; if( sqlite3IndexAffinityStr(pParse->db, pIdx) ){ p->aff = pIdx->zColAff[i]; } @@ -162650,7 +169554,30 @@ static SQLITE_NOINLINE void whereAddIndexedExpr( #endif pParse->pIdxEpr = p; if( p->pIENext==0 ){ - sqlite3ParserAddCleanup(pParse, whereIndexedExprCleanup, pParse); + void *pArg = (void*)&pParse->pIdxEpr; + sqlite3ParserAddCleanup(pParse, whereIndexedExprCleanup, pArg); + } + } +} + +/* +** Set the reverse-scan order mask to one for all tables in the query +** with the exception of MATERIALIZED common table expressions that have +** their own internal ORDER BY clauses. +** +** This implements the PRAGMA reverse_unordered_selects=ON setting. +** (Also SQLITE_DBCONFIG_REVERSE_SCANORDER). +*/ +static SQLITE_NOINLINE void whereReverseScanOrder(WhereInfo *pWInfo){ + int ii; + for(ii=0; iipTabList->nSrc; ii++){ + SrcItem *pItem = &pWInfo->pTabList->a[ii]; + if( !pItem->fg.isCte + || pItem->u2.pCteUse->eM10d!=M10d_Yes + || NEVER(pItem->fg.isSubquery==0) + || pItem->u4.pSubq->pSelect->pOrderBy==0 + ){ + pWInfo->revMask |= MASKBIT(ii); } } } @@ -162713,7 +169640,7 @@ static SQLITE_NOINLINE void whereAddIndexedExpr( ** ** OUTER JOINS ** -** An outer join of tables t1 and t2 is conceptally coded as follows: +** An outer join of tables t1 and t2 is conceptually coded as follows: ** ** foreach row1 in t1 do ** flag = 0 @@ -162783,7 +169710,11 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( /* An ORDER/GROUP BY clause of more than 63 terms cannot be optimized */ testcase( pOrderBy && pOrderBy->nExpr==BMS-1 ); - if( pOrderBy && pOrderBy->nExpr>=BMS ) pOrderBy = 0; + if( pOrderBy && pOrderBy->nExpr>=BMS ){ + pOrderBy = 0; + wctrlFlags &= ~WHERE_WANT_DISTINCT; + wctrlFlags |= WHERE_KEEP_ALL_JOINS; /* Disable omit-noop-join opt */ + } /* The number of tables in the FROM clause is limited by the number of ** bits in a Bitmask @@ -162808,7 +169739,10 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** field (type Bitmask) it must be aligned on an 8-byte boundary on ** some architectures. Hence the ROUND8() below. */ - nByteWInfo = ROUND8P(sizeof(WhereInfo)+(nTabList-1)*sizeof(WhereLevel)); + nByteWInfo = ROUND8P(sizeof(WhereInfo)); + if( nTabList>1 ){ + nByteWInfo = ROUND8P(nByteWInfo + (nTabList-1)*sizeof(WhereLevel)); + } pWInfo = sqlite3DbMallocRawNN(db, nByteWInfo + sizeof(WhereLoop)); if( db->mallocFailed ){ sqlite3DbFree(db, pWInfo); @@ -162862,13 +169796,17 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ){ pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; } - ExplainQueryPlan((pParse, 0, "SCAN CONSTANT ROW")); + if( ALWAYS(pWInfo->pSelect) + && (pWInfo->pSelect->selFlags & SF_MultiValue)==0 + ){ + ExplainQueryPlan((pParse, 0, "SCAN CONSTANT ROW")); + } }else{ /* Assign a bit from the bitmask to every term in the FROM clause. ** ** The N-th term of the FROM clause is assigned a bitmask of 1<nErr ) goto whereBeginError; - /* Special case: WHERE terms that do not refer to any tables in the join - ** (constant expressions). Evaluate each such term, and jump over all the - ** generated code if the result is not true. + /* The False-WHERE-Term-Bypass optimization: + ** + ** If there are WHERE terms that are false, then no rows will be output, + ** so skip over all of the code generated here. ** - ** Do not do this if the expression contains non-deterministic functions - ** that are not within a sub-select. This is not strictly required, but - ** preserves SQLite's legacy behaviour in the following two cases: + ** Conditions: ** - ** FROM ... WHERE random()>0; -- eval random() once per row - ** FROM ... WHERE (SELECT random())>0; -- eval random() once overall + ** (1) The WHERE term must not refer to any tables in the join. + ** (2) The term must not come from an ON clause on the + ** right-hand side of a LEFT or FULL JOIN. + ** (3) The term must not come from an ON clause, or there must be + ** no RIGHT or FULL OUTER joins in pTabList. + ** (4) If the expression contains non-deterministic functions + ** that are not within a sub-select. This is not required + ** for correctness but rather to preserves SQLite's legacy + ** behaviour in the following two cases: + ** + ** WHERE random()>0; -- eval random() once per row + ** WHERE (SELECT random())>0; -- eval random() just once overall + ** + ** Note that the Where term need not be a constant in order for this + ** optimization to apply, though it does need to be constant relative to + ** the current subquery (condition 1). The term might include variables + ** from outer queries so that the value of the term changes from one + ** invocation of the current subquery to the next. */ for(ii=0; iinBase; ii++){ - WhereTerm *pT = &sWLB.pWC->a[ii]; + WhereTerm *pT = &sWLB.pWC->a[ii]; /* A term of the WHERE clause */ + Expr *pX; /* The expression of pT */ if( pT->wtFlags & TERM_VIRTUAL ) continue; - if( pT->prereqAll==0 && (nTabList==0 || exprIsDeterministic(pT->pExpr)) ){ - sqlite3ExprIfFalse(pParse, pT->pExpr, pWInfo->iBreak, SQLITE_JUMPIFNULL); + pX = pT->pExpr; + assert( pX!=0 ); + assert( pT->prereqAll!=0 || !ExprHasProperty(pX, EP_OuterON) ); + if( pT->prereqAll==0 /* Conditions (1) and (2) */ + && (nTabList==0 || exprIsDeterministic(pX)) /* Condition (4) */ + && !(ExprHasProperty(pX, EP_InnerON) /* Condition (3) */ + && (pTabList->a[0].fg.jointype & JT_LTORJ)!=0 ) + ){ + sqlite3ExprIfFalse(pParse, pX, pWInfo->iBreak, SQLITE_JUMPIFNULL); pT->wtFlags |= TERM_CODED; } } @@ -162992,12 +169953,24 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( wherePathSolver(pWInfo, 0); if( db->mallocFailed ) goto whereBeginError; if( pWInfo->pOrderBy ){ - wherePathSolver(pWInfo, pWInfo->nRowOut+1); + whereInterstageHeuristic(pWInfo); + wherePathSolver(pWInfo, pWInfo->nRowOut<0 ? 1 : pWInfo->nRowOut+1); if( db->mallocFailed ) goto whereBeginError; } + + /* TUNING: Assume that a DISTINCT clause on a subquery reduces + ** the output size by a factor of 8 (LogEst -30). + */ + if( (pWInfo->wctrlFlags & WHERE_WANT_DISTINCT)!=0 ){ + WHERETRACE(0x0080,("nRowOut reduced from %d to %d due to DISTINCT\n", + pWInfo->nRowOut, pWInfo->nRowOut-30)); + pWInfo->nRowOut -= 30; + } + } + assert( pWInfo->pTabList!=0 ); if( pWInfo->pOrderBy==0 && (db->flags & SQLITE_ReverseOrder)!=0 ){ - pWInfo->revMask = ALLBITS; + whereReverseScanOrder(pWInfo); } if( pParse->nErr ){ goto whereBeginError; @@ -163041,10 +170014,10 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** in-line sqlite3WhereCodeOneLoopStart() for performance reasons. */ notReady = ~(Bitmask)0; - if( pWInfo->nLevel>=2 - && pResultSet!=0 /* these two combine to guarantee */ - && 0==(wctrlFlags & WHERE_AGG_DISTINCT) /* condition (1) above */ - && OptimizationEnabled(db, SQLITE_OmitNoopJoin) + if( pWInfo->nLevel>=2 /* Must be a join, or this opt8n is pointless */ + && pResultSet!=0 /* Condition (1) */ + && 0==(wctrlFlags & (WHERE_AGG_DISTINCT|WHERE_KEEP_ALL_JOINS)) /* (1),(6) */ + && OptimizationEnabled(db, SQLITE_OmitNoopJoin) /* (7) */ ){ notReady = whereOmitNoopJoin(pWInfo, notReady); nTabList = pWInfo->nLevel; @@ -163092,14 +170065,15 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 ){ int wsFlags = pWInfo->a[0].pWLoop->wsFlags; int bOnerow = (wsFlags & WHERE_ONEROW)!=0; - assert( !(wsFlags & WHERE_VIRTUALTABLE) || IsVirtual(pTabList->a[0].pTab) ); + assert( !(wsFlags&WHERE_VIRTUALTABLE) || IsVirtual(pTabList->a[0].pSTab) ); if( bOnerow || ( 0!=(wctrlFlags & WHERE_ONEPASS_MULTIROW) - && !IsVirtual(pTabList->a[0].pTab) + && !IsVirtual(pTabList->a[0].pSTab) && (0==(wsFlags & WHERE_MULTI_OR) || (wctrlFlags & WHERE_DUPLICATES_OK)) + && OptimizationEnabled(db, SQLITE_OnePass) )){ pWInfo->eOnePass = bOnerow ? ONEPASS_SINGLE : ONEPASS_MULTI; - if( HasRowid(pTabList->a[0].pTab) && (wsFlags & WHERE_IDX_ONLY) ){ + if( HasRowid(pTabList->a[0].pSTab) && (wsFlags & WHERE_IDX_ONLY) ){ if( wctrlFlags & WHERE_ONEPASS_MULTIROW ){ bFordelete = OPFLAG_FORDELETE; } @@ -163117,7 +170091,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( SrcItem *pTabItem; pTabItem = &pTabList->a[pLevel->iFrom]; - pTab = pTabItem->pTab; + pTab = pTabItem->pSTab; iDb = sqlite3SchemaToIndex(db, pTab->pSchema); pLoop = pLevel->pWLoop; if( (pTab->tabFlags & TF_Ephemeral)!=0 || IsView(pTab) ){ @@ -163160,7 +170134,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( assert( n<=pTab->nCol ); } #ifdef SQLITE_ENABLE_CURSOR_HINTS - if( pLoop->u.btree.pIndex!=0 ){ + if( pLoop->u.btree.pIndex!=0 && (pTab->tabFlags & TF_WithoutRowid)==0 ){ sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ|bFordelete); }else #endif @@ -163188,7 +170162,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( iIndexCur = pLevel->iTabCur; op = 0; }else if( pWInfo->eOnePass!=ONEPASS_OFF ){ - Index *pJ = pTabItem->pTab->pIndex; + Index *pJ = pTabItem->pSTab->pIndex; iIndexCur = iAuxArg; assert( wctrlFlags & WHERE_ONEPASS_DESIRED ); while( ALWAYS(pJ) && pJ!=pIx ){ @@ -163205,6 +170179,11 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( if( pIx->bHasExpr && OptimizationEnabled(db, SQLITE_IndexedExpr) ){ whereAddIndexedExpr(pParse, pIx, iIndexCur, pTabItem); } + if( pIx->pPartIdxWhere && (pTabItem->fg.jointype & JT_RIGHT)==0 ){ + wherePartIdxExpr( + pParse, pIx, pIx->pPartIdxWhere, 0, iIndexCur, pTabItem + ); + } } pLevel->iIdxCur = iIndexCur; assert( pIx!=0 ); @@ -163250,7 +170229,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( sqlite3VdbeAddOp2(v, OP_Blob, 65536, pRJ->regBloom); pRJ->regReturn = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_Null, 0, pRJ->regReturn); - assert( pTab==pTabItem->pTab ); + assert( pTab==pTabItem->pSTab ); if( HasRowid(pTab) ){ KeyInfo *pInfo; sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRJ->iMatch, 1); @@ -163289,19 +170268,24 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( wsFlags = pLevel->pWLoop->wsFlags; pSrc = &pTabList->a[pLevel->iFrom]; if( pSrc->fg.isMaterialized ){ - if( pSrc->fg.isCorrelated ){ - sqlite3VdbeAddOp2(v, OP_Gosub, pSrc->regReturn, pSrc->addrFillSub); + Subquery *pSubq; + int iOnce = 0; + assert( pSrc->fg.isSubquery ); + pSubq = pSrc->u4.pSubq; + if( pSrc->fg.isCorrelated==0 ){ + iOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); }else{ - int iOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Gosub, pSrc->regReturn, pSrc->addrFillSub); - sqlite3VdbeJumpHere(v, iOnce); + iOnce = 0; } + sqlite3VdbeAddOp2(v, OP_Gosub, pSubq->regReturn, pSubq->addrFillSub); + VdbeComment((v, "materialize %!S", pSrc)); + if( iOnce ) sqlite3VdbeJumpHere(v, iOnce); } + assert( pTabList == pWInfo->pTabList ); if( (wsFlags & (WHERE_AUTO_INDEX|WHERE_BLOOMFILTER))!=0 ){ if( (wsFlags & WHERE_AUTO_INDEX)!=0 ){ #ifndef SQLITE_OMIT_AUTOMATIC_INDEX - constructAutomaticIndex(pParse, &pWInfo->sWC, - &pTabList->a[pLevel->iFrom], notReady, pLevel); + constructAutomaticIndex(pParse, &pWInfo->sWC, notReady, pLevel); #endif }else{ sqlite3ConstructBloomFilter(pWInfo, ii, pLevel, notReady); @@ -163330,6 +170314,11 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( pParse->nQueryLoop = pWInfo->savedNQueryLoop; whereInfoFree(db, pWInfo); } +#ifdef WHERETRACE_ENABLED + /* Prevent harmless compiler warnings about debugging routines + ** being declared but never used */ + sqlite3ShowWhereLoopList(0); +#endif /* WHERETRACE_ENABLED */ return 0; } @@ -163353,26 +170342,6 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( } #endif -#ifdef SQLITE_DEBUG -/* -** Return true if cursor iCur is opened by instruction k of the -** bytecode. Used inside of assert() only. -*/ -static int cursorIsOpen(Vdbe *v, int iCur, int k){ - while( k>=0 ){ - VdbeOp *pOp = sqlite3VdbeGetOp(v,k--); - if( pOp->p1!=iCur ) continue; - if( pOp->opcode==OP_Close ) return 0; - if( pOp->opcode==OP_OpenRead ) return 1; - if( pOp->opcode==OP_OpenWrite ) return 1; - if( pOp->opcode==OP_OpenDup ) return 1; - if( pOp->opcode==OP_OpenAutoindex ) return 1; - if( pOp->opcode==OP_OpenEphemeral ) return 1; - } - return 0; -} -#endif /* SQLITE_DEBUG */ - /* ** Generate the end of the WHERE loop. See comments on ** sqlite3WhereBegin() for additional information. @@ -163519,7 +170488,16 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ addr = sqlite3VdbeAddOp1(v, OP_IfPos, pLevel->iLeftJoin); VdbeCoverage(v); assert( (ws & WHERE_IDX_ONLY)==0 || (ws & WHERE_INDEXED)!=0 ); if( (ws & WHERE_IDX_ONLY)==0 ){ - assert( pLevel->iTabCur==pTabList->a[pLevel->iFrom].iCursor ); + SrcItem *pSrc = &pTabList->a[pLevel->iFrom]; + assert( pLevel->iTabCur==pSrc->iCursor ); + if( pSrc->fg.viaCoroutine ){ + int m, n; + assert( pSrc->fg.isSubquery ); + n = pSrc->u4.pSubq->regResult; + assert( pSrc->pSTab!=0 ); + m = pSrc->pSTab->nCol; + sqlite3VdbeAddOp3(v, OP_Null, 0, n, n+m-1); + } sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iTabCur); } if( (ws & WHERE_INDEXED) @@ -163541,7 +170519,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ sqlite3VdbeJumpHere(v, addr); } VdbeModuleComment((v, "End WHERE-loop%d: %s", i, - pWInfo->pTabList->a[pLevel->iFrom].pTab->zName)); + pWInfo->pTabList->a[pLevel->iFrom].pSTab->zName)); } assert( pWInfo->nLevel<=pTabList->nSrc ); @@ -163550,7 +170528,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ VdbeOp *pOp, *pLastOp; Index *pIdx = 0; SrcItem *pTabItem = &pTabList->a[pLevel->iFrom]; - Table *pTab = pTabItem->pTab; + Table *pTab = pTabItem->pSTab; assert( pTab!=0 ); pLoop = pLevel->pWLoop; @@ -163569,8 +170547,10 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ */ if( pTabItem->fg.viaCoroutine ){ testcase( pParse->db->mallocFailed ); + assert( pTabItem->fg.isSubquery ); + assert( pTabItem->u4.pSubq->regResult>=0 ); translateColumnToCopy(pParse, pLevel->addrBody, pLevel->iTabCur, - pTabItem->regResult, 0); + pTabItem->u4.pSubq->regResult, 0); continue; } @@ -163618,7 +170598,8 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ k = pLevel->addrBody + 1; #ifdef SQLITE_DEBUG if( db->flags & SQLITE_VdbeAddopTrace ){ - printf("TRANSLATE opcodes in range %d..%d\n", k, last-1); + printf("TRANSLATE cursor %d->%d in opcode range %d..%d\n", + pLevel->iTabCur, pLevel->iIdxCur, k, last-1); } /* Proof that the "+1" on the k value above is safe */ pOp = sqlite3VdbeGetOp(v, k - 1); @@ -163662,16 +170643,10 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ ** reference. Verify that this is harmless - that the ** table being referenced really is open. */ -#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC - assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 - || cursorIsOpen(v,pOp->p1,k) - || pOp->opcode==OP_Offset - ); -#else - assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 - || cursorIsOpen(v,pOp->p1,k) - ); -#endif + if( pLoop->wsFlags & WHERE_IDX_ONLY ){ + sqlite3ErrorMsg(pParse, "internal query planner error"); + pParse->rc = SQLITE_INTERNAL; + } } }else if( pOp->opcode==OP_Rowid ){ pOp->p1 = pLevel->iIdxCur; @@ -163825,7 +170800,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ ** ** These are the same built-in window functions supported by Postgres. ** Although the behaviour of aggregate window functions (functions that -** can be used as either aggregates or window funtions) allows them to +** can be used as either aggregates or window functions) allows them to ** be implemented using an API, built-in window functions are much more ** esoteric. Additionally, some window functions (e.g. nth_value()) ** may only be implemented by caching the entire partition in memory. @@ -164355,7 +171330,7 @@ static Window *windowFind(Parse *pParse, Window *pList, const char *zName){ ** is the Window object representing the associated OVER clause. This ** function updates the contents of pWin as follows: ** -** * If the OVER clause refered to a named window (as in "max(x) OVER win"), +** * If the OVER clause referred to a named window (as in "max(x) OVER win"), ** search list pList for a matching WINDOW definition, and update pWin ** accordingly. If no such WINDOW clause can be found, leave an error ** in pParse. @@ -164493,6 +171468,7 @@ static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){ } /* no break */ deliberate_fall_through + case TK_IF_NULL_ROW: case TK_AGG_FUNCTION: case TK_COLUMN: { int iCol = -1; @@ -164616,7 +171592,7 @@ static ExprList *exprListAppendList( int iDummy; Expr *pSub; pSub = sqlite3ExprSkipCollateAndLikely(pDup); - if( sqlite3ExprIsInteger(pSub, &iDummy) ){ + if( sqlite3ExprIsInteger(pSub, &iDummy, 0) ){ pSub->op = TK_NULL; pSub->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse); pSub->u.zToken = 0; @@ -164745,7 +171721,7 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ assert( ExprUseXList(pWin->pOwner) ); assert( pWin->pWFunc!=0 ); pArgs = pWin->pOwner->x.pList; - if( pWin->pWFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){ + if( pWin->pWFunc->funcFlags & SQLITE_SUBTYPE ){ selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist); pWin->iArgCol = (pSublist ? pSublist->nExpr : 0); pWin->bExprArgs = 1; @@ -164784,9 +171760,10 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ assert( pSub!=0 || p->pSrc==0 ); /* Due to db->mallocFailed test inside ** of sqlite3DbMallocRawNN() called from ** sqlite3SrcListAppend() */ - if( p->pSrc ){ + if( p->pSrc==0 ){ + sqlite3SelectDelete(db, pSub); + }else if( sqlite3SrcItemAttachSubquery(pParse, &p->pSrc->a[0], pSub, 0) ){ Table *pTab2; - p->pSrc->a[0].pSelect = pSub; p->pSrc->a[0].fg.isCorrelated = 1; sqlite3SrcListAssignCursors(pParse, p->pSrc); pSub->selFlags |= SF_Expanded|SF_OrderByReqd; @@ -164800,7 +171777,7 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ }else{ memcpy(pTab, pTab2, sizeof(Table)); pTab->tabFlags |= TF_Ephemeral; - p->pSrc->a[0].pTab = pTab; + p->pSrc->a[0].pSTab = pTab; pTab = pTab2; memset(&w, 0, sizeof(w)); w.xExprCallback = sqlite3WindowExtraAggFuncDepth; @@ -164808,8 +171785,6 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ w.xSelectCallback2 = sqlite3WalkerDepthDecrease; sqlite3WalkSelect(&w, pSub); } - }else{ - sqlite3SelectDelete(db, pSub); } if( db->mallocFailed ) rc = SQLITE_NOMEM; @@ -164871,7 +171846,7 @@ SQLITE_PRIVATE void sqlite3WindowListDelete(sqlite3 *db, Window *p){ ** variable values in the expression tree. */ static Expr *sqlite3WindowOffsetExpr(Parse *pParse, Expr *pExpr){ - if( 0==sqlite3ExprIsConstant(pExpr) ){ + if( 0==sqlite3ExprIsConstant(0,pExpr) ){ if( IN_RENAME_OBJECT ) sqlite3RenameExprUnmap(pParse, pExpr); sqlite3ExprDelete(pParse->db, pExpr); pExpr = sqlite3ExprAlloc(pParse->db, TK_NULL, 0, 0); @@ -164975,7 +171950,7 @@ SQLITE_PRIVATE Window *sqlite3WindowAssemble( } /* -** Window *pWin has just been created from a WINDOW clause. Tokne pBase +** Window *pWin has just been created from a WINDOW clause. Token pBase ** is the base window. Earlier windows from the same WINDOW clause are ** stored in the linked list starting at pWin->pNextWin. This function ** either updates *pWin according to the base specification, or else @@ -165019,8 +171994,9 @@ SQLITE_PRIVATE void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){ if( p ){ assert( p->op==TK_FUNCTION ); assert( pWin ); + assert( ExprIsFullSize(p) ); p->y.pWin = pWin; - ExprSetProperty(p, EP_WinFunc); + ExprSetProperty(p, EP_WinFunc|EP_FullSize); pWin->pOwner = p; if( (p->flags & EP_Distinct) && pWin->eFrmType!=TK_FILTER ){ sqlite3ErrorMsg(pParse, @@ -165095,10 +172071,15 @@ SQLITE_PRIVATE int sqlite3WindowCompare( ** and initialize registers and cursors used by sqlite3WindowCodeStep(). */ SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Select *pSelect){ - int nEphExpr = pSelect->pSrc->a[0].pSelect->pEList->nExpr; - Window *pMWin = pSelect->pWin; Window *pWin; - Vdbe *v = sqlite3GetVdbe(pParse); + int nEphExpr; + Window *pMWin; + Vdbe *v; + + assert( pSelect->pSrc->a[0].fg.isSubquery ); + nEphExpr = pSelect->pSrc->a[0].u4.pSubq->pSelect->pEList->nExpr; + pMWin = pSelect->pWin; + v = sqlite3GetVdbe(pParse); sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pMWin->iEphCsr, nEphExpr); sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+1, pMWin->iEphCsr); @@ -165281,7 +172262,7 @@ struct WindowCsrAndReg { ** ** (ORDER BY a, b GROUPS BETWEEN 2 PRECEDING AND 2 FOLLOWING) ** -** The windows functions implmentation caches the input rows in a temp +** The windows functions implementation caches the input rows in a temp ** table, sorted by "a, b" (it actually populates the cache lazily, and ** aggressively removes rows once they are no longer required, but that's ** a mere detail). It keeps three cursors open on the temp table. One @@ -166290,7 +173271,7 @@ static int windowExprGtZero(Parse *pParse, Expr *pExpr){ ** ** For the most part, the patterns above are adapted to support UNBOUNDED by ** assuming that it is equivalent to "infinity PRECEDING/FOLLOWING" and -** CURRENT ROW by assuming that it is equivilent to "0 PRECEDING/FOLLOWING". +** CURRENT ROW by assuming that it is equivalent to "0 PRECEDING/FOLLOWING". ** This is optimized of course - branches that will never be taken and ** conditions that are always true are omitted from the VM code. The only ** exceptional case is: @@ -166495,7 +173476,7 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( Vdbe *v = sqlite3GetVdbe(pParse); int csrWrite; /* Cursor used to write to eph. table */ int csrInput = p->pSrc->a[0].iCursor; /* Cursor of sub-select */ - int nInput = p->pSrc->a[0].pTab->nCol; /* Number of cols returned by sub */ + int nInput = p->pSrc->a[0].pSTab->nCol; /* Number of cols returned by sub */ int iInput; /* To iterate through sub cols */ int addrNe; /* Address of OP_Ne */ int addrGosubFlush = 0; /* Address of OP_Gosub to flush: */ @@ -166569,7 +173550,7 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( } /* Allocate registers for the array of values from the sub-query, the - ** samve values in record form, and the rowid used to insert said record + ** same values in record form, and the rowid used to insert said record ** into the ephemeral table. */ regNew = pParse->nMem+1; pParse->nMem += nInput; @@ -166810,7 +173791,8 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( /************** End of window.c **********************************************/ /************** Begin file parse.c *******************************************/ /* This file is automatically generated by Lemon from input grammar -** source file "parse.y". */ +** source file "parse.y". +*/ /* ** 2001-09-15 ** @@ -166827,7 +173809,7 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep( ** The canonical source code to this file ("parse.y") is a Lemon grammar ** file that specifies the input grammar and actions to take while parsing. ** That input file is processed by Lemon to generate a C-language -** implementation of a parser for the given grammer. You might be reading +** implementation of a parser for the given grammar. You might be reading ** this comment as part of the translated C-code. Edits should be made ** to the original parse.y sources. */ @@ -166939,9 +173921,9 @@ static void updateDeleteLimitError( break; } } - if( (p->selFlags & SF_MultiValue)==0 && - (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 && - cnt>mxSelect + if( (p->selFlags & (SF_MultiValue|SF_Values))==0 + && (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 + && cnt>mxSelect ){ sqlite3ErrorMsg(pParse, "too many terms in compound SELECT"); } @@ -166961,6 +173943,14 @@ static void updateDeleteLimitError( return pSelect; } + /* Memory allocator for parser stack resizing. This is a thin wrapper around + ** sqlite3_realloc() that includes a call to sqlite3FaultSim() to facilitate + ** testing. + */ + static void *parserStackRealloc(void *pOld, sqlite3_uint64 newSize){ + return sqlite3FaultSim(700) ? 0 : sqlite3_realloc(pOld, newSize); + } + /* Construct a new Expr object from a single token */ static Expr *tokenExpr(Parse *pParse, int op, Token t){ @@ -167083,135 +174073,135 @@ static void updateDeleteLimitError( #define TK_OR 43 #define TK_AND 44 #define TK_IS 45 -#define TK_MATCH 46 -#define TK_LIKE_KW 47 -#define TK_BETWEEN 48 -#define TK_IN 49 -#define TK_ISNULL 50 -#define TK_NOTNULL 51 -#define TK_NE 52 -#define TK_EQ 53 -#define TK_GT 54 -#define TK_LE 55 -#define TK_LT 56 -#define TK_GE 57 -#define TK_ESCAPE 58 -#define TK_ID 59 -#define TK_COLUMNKW 60 -#define TK_DO 61 -#define TK_FOR 62 -#define TK_IGNORE 63 -#define TK_INITIALLY 64 -#define TK_INSTEAD 65 -#define TK_NO 66 -#define TK_KEY 67 -#define TK_OF 68 -#define TK_OFFSET 69 -#define TK_PRAGMA 70 -#define TK_RAISE 71 -#define TK_RECURSIVE 72 -#define TK_REPLACE 73 -#define TK_RESTRICT 74 -#define TK_ROW 75 -#define TK_ROWS 76 -#define TK_TRIGGER 77 -#define TK_VACUUM 78 -#define TK_VIEW 79 -#define TK_VIRTUAL 80 -#define TK_WITH 81 -#define TK_NULLS 82 -#define TK_FIRST 83 -#define TK_LAST 84 -#define TK_CURRENT 85 -#define TK_FOLLOWING 86 -#define TK_PARTITION 87 -#define TK_PRECEDING 88 -#define TK_RANGE 89 -#define TK_UNBOUNDED 90 -#define TK_EXCLUDE 91 -#define TK_GROUPS 92 -#define TK_OTHERS 93 -#define TK_TIES 94 -#define TK_GENERATED 95 -#define TK_ALWAYS 96 -#define TK_MATERIALIZED 97 -#define TK_REINDEX 98 -#define TK_RENAME 99 -#define TK_CTIME_KW 100 -#define TK_ANY 101 -#define TK_BITAND 102 -#define TK_BITOR 103 -#define TK_LSHIFT 104 -#define TK_RSHIFT 105 -#define TK_PLUS 106 -#define TK_MINUS 107 -#define TK_STAR 108 -#define TK_SLASH 109 -#define TK_REM 110 -#define TK_CONCAT 111 -#define TK_PTR 112 -#define TK_COLLATE 113 -#define TK_BITNOT 114 -#define TK_ON 115 -#define TK_INDEXED 116 -#define TK_STRING 117 -#define TK_JOIN_KW 118 -#define TK_CONSTRAINT 119 -#define TK_DEFAULT 120 -#define TK_NULL 121 -#define TK_PRIMARY 122 -#define TK_UNIQUE 123 -#define TK_CHECK 124 -#define TK_REFERENCES 125 -#define TK_AUTOINCR 126 -#define TK_INSERT 127 -#define TK_DELETE 128 -#define TK_UPDATE 129 -#define TK_SET 130 -#define TK_DEFERRABLE 131 -#define TK_FOREIGN 132 -#define TK_DROP 133 -#define TK_UNION 134 -#define TK_ALL 135 -#define TK_EXCEPT 136 -#define TK_INTERSECT 137 -#define TK_SELECT 138 -#define TK_VALUES 139 -#define TK_DISTINCT 140 -#define TK_DOT 141 -#define TK_FROM 142 -#define TK_JOIN 143 -#define TK_USING 144 -#define TK_ORDER 145 -#define TK_GROUP 146 -#define TK_HAVING 147 -#define TK_LIMIT 148 -#define TK_WHERE 149 -#define TK_RETURNING 150 -#define TK_INTO 151 -#define TK_NOTHING 152 -#define TK_FLOAT 153 -#define TK_BLOB 154 -#define TK_INTEGER 155 -#define TK_VARIABLE 156 -#define TK_CASE 157 -#define TK_WHEN 158 -#define TK_THEN 159 -#define TK_ELSE 160 -#define TK_INDEX 161 -#define TK_ALTER 162 -#define TK_ADD 163 -#define TK_WINDOW 164 -#define TK_OVER 165 -#define TK_FILTER 166 -#define TK_COLUMN 167 -#define TK_AGG_FUNCTION 168 -#define TK_AGG_COLUMN 169 -#define TK_TRUEFALSE 170 -#define TK_ISNOT 171 +#define TK_ISNOT 46 +#define TK_MATCH 47 +#define TK_LIKE_KW 48 +#define TK_BETWEEN 49 +#define TK_IN 50 +#define TK_ISNULL 51 +#define TK_NOTNULL 52 +#define TK_NE 53 +#define TK_EQ 54 +#define TK_GT 55 +#define TK_LE 56 +#define TK_LT 57 +#define TK_GE 58 +#define TK_ESCAPE 59 +#define TK_ID 60 +#define TK_COLUMNKW 61 +#define TK_DO 62 +#define TK_FOR 63 +#define TK_IGNORE 64 +#define TK_INITIALLY 65 +#define TK_INSTEAD 66 +#define TK_NO 67 +#define TK_KEY 68 +#define TK_OF 69 +#define TK_OFFSET 70 +#define TK_PRAGMA 71 +#define TK_RAISE 72 +#define TK_RECURSIVE 73 +#define TK_REPLACE 74 +#define TK_RESTRICT 75 +#define TK_ROW 76 +#define TK_ROWS 77 +#define TK_TRIGGER 78 +#define TK_VACUUM 79 +#define TK_VIEW 80 +#define TK_VIRTUAL 81 +#define TK_WITH 82 +#define TK_NULLS 83 +#define TK_FIRST 84 +#define TK_LAST 85 +#define TK_CURRENT 86 +#define TK_FOLLOWING 87 +#define TK_PARTITION 88 +#define TK_PRECEDING 89 +#define TK_RANGE 90 +#define TK_UNBOUNDED 91 +#define TK_EXCLUDE 92 +#define TK_GROUPS 93 +#define TK_OTHERS 94 +#define TK_TIES 95 +#define TK_GENERATED 96 +#define TK_ALWAYS 97 +#define TK_MATERIALIZED 98 +#define TK_REINDEX 99 +#define TK_RENAME 100 +#define TK_CTIME_KW 101 +#define TK_ANY 102 +#define TK_BITAND 103 +#define TK_BITOR 104 +#define TK_LSHIFT 105 +#define TK_RSHIFT 106 +#define TK_PLUS 107 +#define TK_MINUS 108 +#define TK_STAR 109 +#define TK_SLASH 110 +#define TK_REM 111 +#define TK_CONCAT 112 +#define TK_PTR 113 +#define TK_COLLATE 114 +#define TK_BITNOT 115 +#define TK_ON 116 +#define TK_INDEXED 117 +#define TK_STRING 118 +#define TK_JOIN_KW 119 +#define TK_CONSTRAINT 120 +#define TK_DEFAULT 121 +#define TK_NULL 122 +#define TK_PRIMARY 123 +#define TK_UNIQUE 124 +#define TK_CHECK 125 +#define TK_REFERENCES 126 +#define TK_AUTOINCR 127 +#define TK_INSERT 128 +#define TK_DELETE 129 +#define TK_UPDATE 130 +#define TK_SET 131 +#define TK_DEFERRABLE 132 +#define TK_FOREIGN 133 +#define TK_DROP 134 +#define TK_UNION 135 +#define TK_ALL 136 +#define TK_EXCEPT 137 +#define TK_INTERSECT 138 +#define TK_SELECT 139 +#define TK_VALUES 140 +#define TK_DISTINCT 141 +#define TK_DOT 142 +#define TK_FROM 143 +#define TK_JOIN 144 +#define TK_USING 145 +#define TK_ORDER 146 +#define TK_GROUP 147 +#define TK_HAVING 148 +#define TK_LIMIT 149 +#define TK_WHERE 150 +#define TK_RETURNING 151 +#define TK_INTO 152 +#define TK_NOTHING 153 +#define TK_FLOAT 154 +#define TK_BLOB 155 +#define TK_INTEGER 156 +#define TK_VARIABLE 157 +#define TK_CASE 158 +#define TK_WHEN 159 +#define TK_THEN 160 +#define TK_ELSE 161 +#define TK_INDEX 162 +#define TK_ALTER 163 +#define TK_ADD 164 +#define TK_WINDOW 165 +#define TK_OVER 166 +#define TK_FILTER 167 +#define TK_COLUMN 168 +#define TK_AGG_FUNCTION 169 +#define TK_AGG_COLUMN 170 +#define TK_TRUEFALSE 171 #define TK_FUNCTION 172 -#define TK_UMINUS 173 -#define TK_UPLUS 174 +#define TK_UPLUS 173 +#define TK_UMINUS 174 #define TK_TRUTH 175 #define TK_REGISTER 176 #define TK_VECTOR 177 @@ -167220,8 +174210,9 @@ static void updateDeleteLimitError( #define TK_ASTERISK 180 #define TK_SPAN 181 #define TK_ERROR 182 -#define TK_SPACE 183 -#define TK_ILLEGAL 184 +#define TK_QNUMBER 183 +#define TK_SPACE 184 +#define TK_ILLEGAL 185 #endif /**************** End token definitions ***************************************/ @@ -167262,6 +174253,9 @@ static void updateDeleteLimitError( ** sqlite3ParserARG_STORE Code to store %extra_argument into yypParser ** sqlite3ParserARG_FETCH Code to extract %extra_argument from yypParser ** sqlite3ParserCTX_* As sqlite3ParserARG_ except for %extra_context +** YYREALLOC Name of the realloc() function to use +** YYFREE Name of the free() function to use +** YYDYNSTACK True if stack space should be extended on heap ** YYERRORSYMBOL is the code number of the error symbol. If not ** defined, then do no error processing. ** YYNSTATE the combined number of states. @@ -167275,37 +174269,39 @@ static void updateDeleteLimitError( ** YY_NO_ACTION The yy_action[] code for no-op ** YY_MIN_REDUCE Minimum value for reduce actions ** YY_MAX_REDUCE Maximum value for reduce actions +** YY_MIN_DSTRCTR Minimum symbol value that has a destructor +** YY_MAX_DSTRCTR Maximum symbol value that has a destructor */ #ifndef INTERFACE # define INTERFACE 1 #endif /************* Begin control #defines *****************************************/ #define YYCODETYPE unsigned short int -#define YYNOCODE 319 +#define YYNOCODE 322 #define YYACTIONTYPE unsigned short int -#define YYWILDCARD 101 +#define YYWILDCARD 102 #define sqlite3ParserTOKENTYPE Token typedef union { int yyinit; sqlite3ParserTOKENTYPE yy0; - TriggerStep* yy33; - Window* yy41; - Select* yy47; - SrcList* yy131; - struct TrigEvent yy180; - struct {int value; int mask;} yy231; - IdList* yy254; - u32 yy285; - ExprList* yy322; - Cte* yy385; - int yy394; - Upsert* yy444; - u8 yy516; - With* yy521; - const char* yy522; - Expr* yy528; - OnOrUsing yy561; - struct FrameBound yy595; + ExprList* yy14; + With* yy59; + Cte* yy67; + Upsert* yy122; + IdList* yy132; + int yy144; + const char* yy168; + SrcList* yy203; + Window* yy211; + OnOrUsing yy269; + struct TrigEvent yy286; + struct {int value; int mask;} yy383; + u32 yy391; + TriggerStep* yy427; + Expr* yy454; + u8 yy462; + struct FrameBound yy509; + Select* yy555; } YYMINORTYPE; #ifndef YYSTACKDEPTH #define YYSTACKDEPTH 100 @@ -167315,24 +174311,29 @@ typedef union { #define sqlite3ParserARG_PARAM #define sqlite3ParserARG_FETCH #define sqlite3ParserARG_STORE +#define YYREALLOC parserStackRealloc +#define YYFREE sqlite3_free +#define YYDYNSTACK 1 #define sqlite3ParserCTX_SDECL Parse *pParse; #define sqlite3ParserCTX_PDECL ,Parse *pParse #define sqlite3ParserCTX_PARAM ,pParse #define sqlite3ParserCTX_FETCH Parse *pParse=yypParser->pParse; #define sqlite3ParserCTX_STORE yypParser->pParse=pParse; #define YYFALLBACK 1 -#define YYNSTATE 576 -#define YYNRULE 405 -#define YYNRULE_WITH_ACTION 342 -#define YYNTOKEN 185 -#define YY_MAX_SHIFT 575 -#define YY_MIN_SHIFTREDUCE 835 -#define YY_MAX_SHIFTREDUCE 1239 -#define YY_ERROR_ACTION 1240 -#define YY_ACCEPT_ACTION 1241 -#define YY_NO_ACTION 1242 -#define YY_MIN_REDUCE 1243 -#define YY_MAX_REDUCE 1647 +#define YYNSTATE 583 +#define YYNRULE 409 +#define YYNRULE_WITH_ACTION 344 +#define YYNTOKEN 186 +#define YY_MAX_SHIFT 582 +#define YY_MIN_SHIFTREDUCE 845 +#define YY_MAX_SHIFTREDUCE 1253 +#define YY_ERROR_ACTION 1254 +#define YY_ACCEPT_ACTION 1255 +#define YY_NO_ACTION 1256 +#define YY_MIN_REDUCE 1257 +#define YY_MAX_REDUCE 1665 +#define YY_MIN_DSTRCTR 205 +#define YY_MAX_DSTRCTR 319 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -167348,6 +174349,22 @@ typedef union { # define yytestcase(X) #endif +/* Macro to determine if stack space has the ability to grow using +** heap memory. +*/ +#if YYSTACKDEPTH<=0 || YYDYNSTACK +# define YYGROWABLESTACK 1 +#else +# define YYGROWABLESTACK 0 +#endif + +/* Guarantee a minimum number of initial stack slots. +*/ +#if YYSTACKDEPTH<=0 +# undef YYSTACKDEPTH +# define YYSTACKDEPTH 2 /* Need a minimum stack size */ +#endif + /* Next are the tables used to determine what action to take based on the ** current state and lookahead token. These tables are used to implement @@ -167399,618 +174416,643 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (2098) +#define YY_ACTTAB_COUNT (2207) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 568, 208, 568, 118, 115, 229, 568, 118, 115, 229, - /* 10 */ 568, 1314, 377, 1293, 408, 562, 562, 562, 568, 409, - /* 20 */ 378, 1314, 1276, 41, 41, 41, 41, 208, 1526, 71, - /* 30 */ 71, 971, 419, 41, 41, 491, 303, 279, 303, 972, - /* 40 */ 397, 71, 71, 125, 126, 80, 1217, 1217, 1050, 1053, - /* 50 */ 1040, 1040, 123, 123, 124, 124, 124, 124, 476, 409, - /* 60 */ 1241, 1, 1, 575, 2, 1245, 550, 118, 115, 229, - /* 70 */ 317, 480, 146, 480, 524, 118, 115, 229, 529, 1327, - /* 80 */ 417, 523, 142, 125, 126, 80, 1217, 1217, 1050, 1053, - /* 90 */ 1040, 1040, 123, 123, 124, 124, 124, 124, 118, 115, - /* 100 */ 229, 327, 122, 122, 122, 122, 121, 121, 120, 120, - /* 110 */ 120, 119, 116, 444, 284, 284, 284, 284, 442, 442, - /* 120 */ 442, 1567, 376, 1569, 1192, 375, 1163, 565, 1163, 565, - /* 130 */ 409, 1567, 537, 259, 226, 444, 101, 145, 449, 316, - /* 140 */ 559, 240, 122, 122, 122, 122, 121, 121, 120, 120, - /* 150 */ 120, 119, 116, 444, 125, 126, 80, 1217, 1217, 1050, - /* 160 */ 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, 142, - /* 170 */ 294, 1192, 339, 448, 120, 120, 120, 119, 116, 444, - /* 180 */ 127, 1192, 1193, 1194, 148, 441, 440, 568, 119, 116, - /* 190 */ 444, 124, 124, 124, 124, 117, 122, 122, 122, 122, - /* 200 */ 121, 121, 120, 120, 120, 119, 116, 444, 454, 113, - /* 210 */ 13, 13, 546, 122, 122, 122, 122, 121, 121, 120, - /* 220 */ 120, 120, 119, 116, 444, 422, 316, 559, 1192, 1193, - /* 230 */ 1194, 149, 1224, 409, 1224, 124, 124, 124, 124, 122, - /* 240 */ 122, 122, 122, 121, 121, 120, 120, 120, 119, 116, - /* 250 */ 444, 465, 342, 1037, 1037, 1051, 1054, 125, 126, 80, - /* 260 */ 1217, 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, - /* 270 */ 124, 124, 1279, 522, 222, 1192, 568, 409, 224, 514, - /* 280 */ 175, 82, 83, 122, 122, 122, 122, 121, 121, 120, - /* 290 */ 120, 120, 119, 116, 444, 1007, 16, 16, 1192, 133, - /* 300 */ 133, 125, 126, 80, 1217, 1217, 1050, 1053, 1040, 1040, - /* 310 */ 123, 123, 124, 124, 124, 124, 122, 122, 122, 122, - /* 320 */ 121, 121, 120, 120, 120, 119, 116, 444, 1041, 546, - /* 330 */ 1192, 373, 1192, 1193, 1194, 252, 1434, 399, 504, 501, - /* 340 */ 500, 111, 560, 566, 4, 926, 926, 433, 499, 340, - /* 350 */ 460, 328, 360, 394, 1237, 1192, 1193, 1194, 563, 568, - /* 360 */ 122, 122, 122, 122, 121, 121, 120, 120, 120, 119, - /* 370 */ 116, 444, 284, 284, 369, 1580, 1607, 441, 440, 154, - /* 380 */ 409, 445, 71, 71, 1286, 565, 1221, 1192, 1193, 1194, - /* 390 */ 85, 1223, 271, 557, 543, 515, 1561, 568, 98, 1222, - /* 400 */ 6, 1278, 472, 142, 125, 126, 80, 1217, 1217, 1050, - /* 410 */ 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, 550, - /* 420 */ 13, 13, 1027, 507, 1224, 1192, 1224, 549, 109, 109, - /* 430 */ 222, 568, 1238, 175, 568, 427, 110, 197, 445, 570, - /* 440 */ 569, 430, 1552, 1017, 325, 551, 1192, 270, 287, 368, - /* 450 */ 510, 363, 509, 257, 71, 71, 543, 71, 71, 359, - /* 460 */ 316, 559, 1613, 122, 122, 122, 122, 121, 121, 120, - /* 470 */ 120, 120, 119, 116, 444, 1017, 1017, 1019, 1020, 27, - /* 480 */ 284, 284, 1192, 1193, 1194, 1158, 568, 1612, 409, 901, - /* 490 */ 190, 550, 356, 565, 550, 937, 533, 517, 1158, 516, - /* 500 */ 413, 1158, 552, 1192, 1193, 1194, 568, 544, 1554, 51, - /* 510 */ 51, 214, 125, 126, 80, 1217, 1217, 1050, 1053, 1040, - /* 520 */ 1040, 123, 123, 124, 124, 124, 124, 1192, 474, 135, - /* 530 */ 135, 409, 284, 284, 1490, 505, 121, 121, 120, 120, - /* 540 */ 120, 119, 116, 444, 1007, 565, 518, 217, 541, 1561, - /* 550 */ 316, 559, 142, 6, 532, 125, 126, 80, 1217, 1217, - /* 560 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, - /* 570 */ 1555, 122, 122, 122, 122, 121, 121, 120, 120, 120, - /* 580 */ 119, 116, 444, 485, 1192, 1193, 1194, 482, 281, 1267, - /* 590 */ 957, 252, 1192, 373, 504, 501, 500, 1192, 340, 571, - /* 600 */ 1192, 571, 409, 292, 499, 957, 876, 191, 480, 316, - /* 610 */ 559, 384, 290, 380, 122, 122, 122, 122, 121, 121, - /* 620 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, - /* 630 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, - /* 640 */ 124, 409, 394, 1136, 1192, 869, 100, 284, 284, 1192, - /* 650 */ 1193, 1194, 373, 1093, 1192, 1193, 1194, 1192, 1193, 1194, - /* 660 */ 565, 455, 32, 373, 233, 125, 126, 80, 1217, 1217, - /* 670 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, - /* 680 */ 1433, 959, 568, 228, 958, 122, 122, 122, 122, 121, - /* 690 */ 121, 120, 120, 120, 119, 116, 444, 1158, 228, 1192, - /* 700 */ 157, 1192, 1193, 1194, 1553, 13, 13, 301, 957, 1232, - /* 710 */ 1158, 153, 409, 1158, 373, 1583, 1176, 5, 369, 1580, - /* 720 */ 429, 1238, 3, 957, 122, 122, 122, 122, 121, 121, - /* 730 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, - /* 740 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, - /* 750 */ 124, 409, 208, 567, 1192, 1028, 1192, 1193, 1194, 1192, - /* 760 */ 388, 852, 155, 1552, 286, 402, 1098, 1098, 488, 568, - /* 770 */ 465, 342, 1319, 1319, 1552, 125, 126, 80, 1217, 1217, - /* 780 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, - /* 790 */ 129, 568, 13, 13, 374, 122, 122, 122, 122, 121, - /* 800 */ 121, 120, 120, 120, 119, 116, 444, 302, 568, 453, - /* 810 */ 528, 1192, 1193, 1194, 13, 13, 1192, 1193, 1194, 1297, - /* 820 */ 463, 1267, 409, 1317, 1317, 1552, 1012, 453, 452, 200, - /* 830 */ 299, 71, 71, 1265, 122, 122, 122, 122, 121, 121, - /* 840 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, - /* 850 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, - /* 860 */ 124, 409, 227, 1073, 1158, 284, 284, 419, 312, 278, - /* 870 */ 278, 285, 285, 1419, 406, 405, 382, 1158, 565, 568, - /* 880 */ 1158, 1196, 565, 1600, 565, 125, 126, 80, 1217, 1217, - /* 890 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, - /* 900 */ 453, 1482, 13, 13, 1536, 122, 122, 122, 122, 121, - /* 910 */ 121, 120, 120, 120, 119, 116, 444, 201, 568, 354, - /* 920 */ 1586, 575, 2, 1245, 840, 841, 842, 1562, 317, 1212, - /* 930 */ 146, 6, 409, 255, 254, 253, 206, 1327, 9, 1196, - /* 940 */ 262, 71, 71, 424, 122, 122, 122, 122, 121, 121, - /* 950 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, - /* 960 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, - /* 970 */ 124, 568, 284, 284, 568, 1213, 409, 574, 313, 1245, - /* 980 */ 349, 1296, 352, 419, 317, 565, 146, 491, 525, 1643, - /* 990 */ 395, 371, 491, 1327, 70, 70, 1295, 71, 71, 240, - /* 1000 */ 1325, 104, 80, 1217, 1217, 1050, 1053, 1040, 1040, 123, - /* 1010 */ 123, 124, 124, 124, 124, 122, 122, 122, 122, 121, - /* 1020 */ 121, 120, 120, 120, 119, 116, 444, 1114, 284, 284, - /* 1030 */ 428, 448, 1525, 1213, 439, 284, 284, 1489, 1352, 311, - /* 1040 */ 474, 565, 1115, 971, 491, 491, 217, 1263, 565, 1538, - /* 1050 */ 568, 972, 207, 568, 1027, 240, 383, 1116, 519, 122, - /* 1060 */ 122, 122, 122, 121, 121, 120, 120, 120, 119, 116, - /* 1070 */ 444, 1018, 107, 71, 71, 1017, 13, 13, 912, 568, - /* 1080 */ 1495, 568, 284, 284, 97, 526, 491, 448, 913, 1326, - /* 1090 */ 1322, 545, 409, 284, 284, 565, 151, 209, 1495, 1497, - /* 1100 */ 262, 450, 55, 55, 56, 56, 565, 1017, 1017, 1019, - /* 1110 */ 443, 332, 409, 527, 12, 295, 125, 126, 80, 1217, - /* 1120 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, - /* 1130 */ 124, 347, 409, 864, 1534, 1213, 125, 126, 80, 1217, - /* 1140 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, - /* 1150 */ 124, 1137, 1641, 474, 1641, 371, 125, 114, 80, 1217, - /* 1160 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, - /* 1170 */ 124, 1495, 329, 474, 331, 122, 122, 122, 122, 121, - /* 1180 */ 121, 120, 120, 120, 119, 116, 444, 203, 1419, 568, - /* 1190 */ 1294, 864, 464, 1213, 436, 122, 122, 122, 122, 121, - /* 1200 */ 121, 120, 120, 120, 119, 116, 444, 553, 1137, 1642, - /* 1210 */ 539, 1642, 15, 15, 892, 122, 122, 122, 122, 121, - /* 1220 */ 121, 120, 120, 120, 119, 116, 444, 568, 298, 538, - /* 1230 */ 1135, 1419, 1559, 1560, 1331, 409, 6, 6, 1169, 1268, - /* 1240 */ 415, 320, 284, 284, 1419, 508, 565, 525, 300, 457, - /* 1250 */ 43, 43, 568, 893, 12, 565, 330, 478, 425, 407, - /* 1260 */ 126, 80, 1217, 1217, 1050, 1053, 1040, 1040, 123, 123, - /* 1270 */ 124, 124, 124, 124, 568, 57, 57, 288, 1192, 1419, - /* 1280 */ 496, 458, 392, 392, 391, 273, 389, 1135, 1558, 849, - /* 1290 */ 1169, 407, 6, 568, 321, 1158, 470, 44, 44, 1557, - /* 1300 */ 1114, 426, 234, 6, 323, 256, 540, 256, 1158, 431, - /* 1310 */ 568, 1158, 322, 17, 487, 1115, 58, 58, 122, 122, - /* 1320 */ 122, 122, 121, 121, 120, 120, 120, 119, 116, 444, - /* 1330 */ 1116, 216, 481, 59, 59, 1192, 1193, 1194, 111, 560, - /* 1340 */ 324, 4, 236, 456, 526, 568, 237, 456, 568, 437, - /* 1350 */ 168, 556, 420, 141, 479, 563, 568, 293, 568, 1095, - /* 1360 */ 568, 293, 568, 1095, 531, 568, 872, 8, 60, 60, - /* 1370 */ 235, 61, 61, 568, 414, 568, 414, 568, 445, 62, - /* 1380 */ 62, 45, 45, 46, 46, 47, 47, 199, 49, 49, - /* 1390 */ 557, 568, 359, 568, 100, 486, 50, 50, 63, 63, - /* 1400 */ 64, 64, 561, 415, 535, 410, 568, 1027, 568, 534, - /* 1410 */ 316, 559, 316, 559, 65, 65, 14, 14, 568, 1027, - /* 1420 */ 568, 512, 932, 872, 1018, 109, 109, 931, 1017, 66, - /* 1430 */ 66, 131, 131, 110, 451, 445, 570, 569, 416, 177, - /* 1440 */ 1017, 132, 132, 67, 67, 568, 467, 568, 932, 471, - /* 1450 */ 1364, 283, 226, 931, 315, 1363, 407, 568, 459, 407, - /* 1460 */ 1017, 1017, 1019, 239, 407, 86, 213, 1350, 52, 52, - /* 1470 */ 68, 68, 1017, 1017, 1019, 1020, 27, 1585, 1180, 447, - /* 1480 */ 69, 69, 288, 97, 108, 1541, 106, 392, 392, 391, - /* 1490 */ 273, 389, 568, 879, 849, 883, 568, 111, 560, 466, - /* 1500 */ 4, 568, 152, 30, 38, 568, 1132, 234, 396, 323, - /* 1510 */ 111, 560, 527, 4, 563, 53, 53, 322, 568, 163, - /* 1520 */ 163, 568, 337, 468, 164, 164, 333, 563, 76, 76, - /* 1530 */ 568, 289, 1514, 568, 31, 1513, 568, 445, 338, 483, - /* 1540 */ 100, 54, 54, 344, 72, 72, 296, 236, 1080, 557, - /* 1550 */ 445, 879, 1360, 134, 134, 168, 73, 73, 141, 161, - /* 1560 */ 161, 1574, 557, 535, 568, 319, 568, 348, 536, 1009, - /* 1570 */ 473, 261, 261, 891, 890, 235, 535, 568, 1027, 568, - /* 1580 */ 475, 534, 261, 367, 109, 109, 521, 136, 136, 130, - /* 1590 */ 130, 1027, 110, 366, 445, 570, 569, 109, 109, 1017, - /* 1600 */ 162, 162, 156, 156, 568, 110, 1080, 445, 570, 569, - /* 1610 */ 410, 351, 1017, 568, 353, 316, 559, 568, 343, 568, - /* 1620 */ 100, 497, 357, 258, 100, 898, 899, 140, 140, 355, - /* 1630 */ 1310, 1017, 1017, 1019, 1020, 27, 139, 139, 362, 451, - /* 1640 */ 137, 137, 138, 138, 1017, 1017, 1019, 1020, 27, 1180, - /* 1650 */ 447, 568, 372, 288, 111, 560, 1021, 4, 392, 392, - /* 1660 */ 391, 273, 389, 568, 1141, 849, 568, 1076, 568, 258, - /* 1670 */ 492, 563, 568, 211, 75, 75, 555, 962, 234, 261, - /* 1680 */ 323, 111, 560, 929, 4, 113, 77, 77, 322, 74, - /* 1690 */ 74, 42, 42, 1373, 445, 48, 48, 1418, 563, 974, - /* 1700 */ 975, 1092, 1091, 1092, 1091, 862, 557, 150, 930, 1346, - /* 1710 */ 113, 1358, 554, 1424, 1021, 1275, 1266, 1254, 236, 1253, - /* 1720 */ 1255, 445, 1593, 1343, 308, 276, 168, 309, 11, 141, - /* 1730 */ 393, 310, 232, 557, 1405, 1027, 335, 291, 1400, 219, - /* 1740 */ 336, 109, 109, 936, 297, 1410, 235, 341, 477, 110, - /* 1750 */ 502, 445, 570, 569, 1393, 1409, 1017, 400, 1293, 365, - /* 1760 */ 223, 1486, 1027, 1485, 1355, 1356, 1354, 1353, 109, 109, - /* 1770 */ 204, 1596, 1232, 558, 265, 218, 110, 205, 445, 570, - /* 1780 */ 569, 410, 387, 1017, 1533, 179, 316, 559, 1017, 1017, - /* 1790 */ 1019, 1020, 27, 230, 1531, 1229, 79, 560, 85, 4, - /* 1800 */ 418, 215, 548, 81, 84, 188, 1406, 173, 181, 461, - /* 1810 */ 451, 35, 462, 563, 183, 1017, 1017, 1019, 1020, 27, - /* 1820 */ 184, 1491, 185, 186, 495, 242, 98, 398, 1412, 36, - /* 1830 */ 1411, 484, 91, 469, 401, 1414, 445, 192, 1480, 246, - /* 1840 */ 1502, 490, 346, 277, 248, 196, 493, 511, 557, 350, - /* 1850 */ 1256, 249, 250, 403, 1313, 1312, 111, 560, 432, 4, - /* 1860 */ 1311, 1304, 93, 1611, 883, 1610, 224, 404, 434, 520, - /* 1870 */ 263, 435, 1579, 563, 1283, 1282, 364, 1027, 306, 1281, - /* 1880 */ 264, 1609, 1565, 109, 109, 370, 1303, 307, 1564, 438, - /* 1890 */ 128, 110, 1378, 445, 570, 569, 445, 546, 1017, 10, - /* 1900 */ 1466, 105, 381, 1377, 34, 572, 99, 1336, 557, 314, - /* 1910 */ 1186, 530, 272, 274, 379, 210, 1335, 547, 385, 386, - /* 1920 */ 275, 573, 1251, 1246, 411, 412, 1518, 165, 178, 1519, - /* 1930 */ 1017, 1017, 1019, 1020, 27, 1517, 1516, 1027, 78, 147, - /* 1940 */ 166, 220, 221, 109, 109, 836, 304, 167, 446, 212, - /* 1950 */ 318, 110, 231, 445, 570, 569, 144, 1090, 1017, 1088, - /* 1960 */ 326, 180, 169, 1212, 182, 334, 238, 915, 241, 1104, - /* 1970 */ 187, 170, 171, 421, 87, 88, 423, 189, 89, 90, - /* 1980 */ 172, 1107, 243, 1103, 244, 158, 18, 245, 345, 247, - /* 1990 */ 1017, 1017, 1019, 1020, 27, 261, 1096, 193, 1226, 489, - /* 2000 */ 194, 37, 366, 851, 494, 251, 195, 506, 92, 19, - /* 2010 */ 498, 358, 20, 503, 881, 361, 94, 894, 305, 159, - /* 2020 */ 513, 39, 95, 1174, 160, 1056, 966, 1143, 96, 174, - /* 2030 */ 1142, 225, 280, 282, 198, 960, 113, 1164, 1160, 260, - /* 2040 */ 21, 22, 23, 1162, 1168, 1167, 1148, 24, 33, 25, - /* 2050 */ 202, 542, 26, 100, 1071, 102, 1057, 103, 7, 1055, - /* 2060 */ 1059, 1113, 1060, 1112, 266, 267, 28, 40, 390, 1022, - /* 2070 */ 863, 112, 29, 564, 1182, 1181, 268, 176, 143, 925, - /* 2080 */ 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, - /* 2090 */ 1242, 1242, 1242, 1242, 269, 1602, 1242, 1601, + /* 0 */ 130, 127, 234, 282, 282, 1328, 576, 1307, 460, 289, + /* 10 */ 289, 576, 1622, 381, 576, 1328, 573, 576, 562, 413, + /* 20 */ 1300, 1542, 573, 481, 562, 524, 460, 459, 558, 82, + /* 30 */ 82, 983, 294, 375, 51, 51, 498, 61, 61, 984, + /* 40 */ 82, 82, 1577, 137, 138, 91, 7, 1228, 1228, 1063, + /* 50 */ 1066, 1053, 1053, 135, 135, 136, 136, 136, 136, 413, + /* 60 */ 288, 288, 182, 288, 288, 481, 536, 288, 288, 130, + /* 70 */ 127, 234, 432, 573, 525, 562, 573, 557, 562, 1290, + /* 80 */ 573, 421, 562, 137, 138, 91, 559, 1228, 1228, 1063, + /* 90 */ 1066, 1053, 1053, 135, 135, 136, 136, 136, 136, 296, + /* 100 */ 460, 398, 1249, 134, 134, 134, 134, 133, 133, 132, + /* 110 */ 132, 132, 131, 128, 451, 44, 1050, 1050, 1064, 1067, + /* 120 */ 1255, 1, 1, 582, 2, 1259, 581, 1174, 1259, 1174, + /* 130 */ 321, 413, 155, 321, 1584, 155, 379, 112, 498, 1341, + /* 140 */ 456, 299, 1341, 134, 134, 134, 134, 133, 133, 132, + /* 150 */ 132, 132, 131, 128, 451, 137, 138, 91, 1105, 1228, + /* 160 */ 1228, 1063, 1066, 1053, 1053, 135, 135, 136, 136, 136, + /* 170 */ 136, 1204, 320, 567, 288, 288, 283, 288, 288, 523, + /* 180 */ 523, 1250, 139, 1541, 7, 214, 503, 573, 1169, 562, + /* 190 */ 573, 1054, 562, 136, 136, 136, 136, 129, 401, 547, + /* 200 */ 487, 1169, 245, 1568, 1169, 245, 133, 133, 132, 132, + /* 210 */ 132, 131, 128, 451, 261, 134, 134, 134, 134, 133, + /* 220 */ 133, 132, 132, 132, 131, 128, 451, 451, 1204, 1205, + /* 230 */ 1204, 130, 127, 234, 455, 413, 182, 455, 130, 127, + /* 240 */ 234, 134, 134, 134, 134, 133, 133, 132, 132, 132, + /* 250 */ 131, 128, 451, 136, 136, 136, 136, 538, 576, 137, + /* 260 */ 138, 91, 261, 1228, 1228, 1063, 1066, 1053, 1053, 135, + /* 270 */ 135, 136, 136, 136, 136, 44, 472, 346, 1204, 472, + /* 280 */ 346, 51, 51, 418, 93, 157, 134, 134, 134, 134, + /* 290 */ 133, 133, 132, 132, 132, 131, 128, 451, 166, 363, + /* 300 */ 298, 134, 134, 134, 134, 133, 133, 132, 132, 132, + /* 310 */ 131, 128, 451, 1293, 461, 1570, 423, 377, 275, 134, + /* 320 */ 134, 134, 134, 133, 133, 132, 132, 132, 131, 128, + /* 330 */ 451, 418, 320, 567, 1292, 1204, 1205, 1204, 257, 413, + /* 340 */ 483, 511, 508, 507, 94, 132, 132, 132, 131, 128, + /* 350 */ 451, 506, 1204, 548, 548, 388, 576, 384, 7, 413, + /* 360 */ 550, 229, 522, 137, 138, 91, 530, 1228, 1228, 1063, + /* 370 */ 1066, 1053, 1053, 135, 135, 136, 136, 136, 136, 51, + /* 380 */ 51, 1582, 380, 137, 138, 91, 331, 1228, 1228, 1063, + /* 390 */ 1066, 1053, 1053, 135, 135, 136, 136, 136, 136, 320, + /* 400 */ 567, 288, 288, 320, 567, 1602, 582, 2, 1259, 1204, + /* 410 */ 1205, 1204, 1628, 321, 573, 155, 562, 576, 1511, 264, + /* 420 */ 231, 520, 1341, 134, 134, 134, 134, 133, 133, 132, + /* 430 */ 132, 132, 131, 128, 451, 519, 1511, 1513, 1333, 1333, + /* 440 */ 82, 82, 498, 134, 134, 134, 134, 133, 133, 132, + /* 450 */ 132, 132, 131, 128, 451, 1435, 257, 288, 288, 511, + /* 460 */ 508, 507, 944, 1568, 413, 1019, 1204, 943, 360, 506, + /* 470 */ 573, 1598, 562, 44, 575, 551, 551, 557, 1107, 1582, + /* 480 */ 544, 576, 1107, 40, 417, 245, 531, 1505, 137, 138, + /* 490 */ 91, 219, 1228, 1228, 1063, 1066, 1053, 1053, 135, 135, + /* 500 */ 136, 136, 136, 136, 81, 81, 1281, 1204, 413, 553, + /* 510 */ 1511, 48, 512, 448, 447, 493, 578, 455, 578, 344, + /* 520 */ 45, 1204, 1233, 1204, 1205, 1204, 428, 1235, 158, 882, + /* 530 */ 320, 567, 137, 138, 91, 1234, 1228, 1228, 1063, 1066, + /* 540 */ 1053, 1053, 135, 135, 136, 136, 136, 136, 134, 134, + /* 550 */ 134, 134, 133, 133, 132, 132, 132, 131, 128, 451, + /* 560 */ 1236, 576, 1236, 329, 1204, 1205, 1204, 387, 492, 403, + /* 570 */ 1040, 382, 489, 123, 568, 1569, 4, 377, 1204, 1205, + /* 580 */ 1204, 570, 570, 570, 82, 82, 882, 1029, 1331, 1331, + /* 590 */ 571, 1028, 134, 134, 134, 134, 133, 133, 132, 132, + /* 600 */ 132, 131, 128, 451, 288, 288, 1281, 1204, 576, 423, + /* 610 */ 576, 1568, 413, 423, 452, 378, 886, 573, 1279, 562, + /* 620 */ 46, 557, 532, 1028, 1028, 1030, 565, 130, 127, 234, + /* 630 */ 556, 82, 82, 82, 82, 479, 137, 138, 91, 462, + /* 640 */ 1228, 1228, 1063, 1066, 1053, 1053, 135, 135, 136, 136, + /* 650 */ 136, 136, 1188, 487, 1506, 1040, 413, 6, 1204, 50, + /* 660 */ 879, 121, 121, 948, 1204, 1205, 1204, 358, 557, 122, + /* 670 */ 316, 452, 577, 452, 535, 1204, 1028, 439, 303, 212, + /* 680 */ 137, 138, 91, 213, 1228, 1228, 1063, 1066, 1053, 1053, + /* 690 */ 135, 135, 136, 136, 136, 136, 134, 134, 134, 134, + /* 700 */ 133, 133, 132, 132, 132, 131, 128, 451, 1028, 1028, + /* 710 */ 1030, 1031, 35, 288, 288, 1204, 1205, 1204, 1040, 1339, + /* 720 */ 533, 123, 568, 1569, 4, 377, 573, 1019, 562, 353, + /* 730 */ 1277, 356, 1204, 1205, 1204, 1029, 488, 1188, 571, 1028, + /* 740 */ 134, 134, 134, 134, 133, 133, 132, 132, 132, 131, + /* 750 */ 128, 451, 576, 343, 288, 288, 449, 449, 449, 971, + /* 760 */ 413, 1627, 452, 911, 1187, 288, 288, 573, 464, 562, + /* 770 */ 238, 1028, 1028, 1030, 565, 82, 82, 498, 573, 411, + /* 780 */ 562, 344, 467, 332, 137, 138, 91, 197, 1228, 1228, + /* 790 */ 1063, 1066, 1053, 1053, 135, 135, 136, 136, 136, 136, + /* 800 */ 1188, 528, 1169, 1040, 413, 1110, 1110, 495, 1041, 121, + /* 810 */ 121, 1204, 317, 540, 862, 1169, 1244, 122, 1169, 452, + /* 820 */ 577, 452, 1340, 198, 1028, 1204, 481, 526, 137, 138, + /* 830 */ 91, 560, 1228, 1228, 1063, 1066, 1053, 1053, 135, 135, + /* 840 */ 136, 136, 136, 136, 134, 134, 134, 134, 133, 133, + /* 850 */ 132, 132, 132, 131, 128, 451, 1028, 1028, 1030, 1031, + /* 860 */ 35, 1204, 288, 288, 1204, 477, 288, 288, 1204, 1205, + /* 870 */ 1204, 539, 481, 437, 470, 573, 1451, 562, 364, 573, + /* 880 */ 1153, 562, 1204, 1205, 1204, 1188, 5, 576, 134, 134, + /* 890 */ 134, 134, 133, 133, 132, 132, 132, 131, 128, 451, + /* 900 */ 221, 214, 302, 96, 1149, 1657, 232, 1657, 413, 392, + /* 910 */ 19, 19, 1024, 949, 406, 373, 1595, 1085, 1204, 1205, + /* 920 */ 1204, 1204, 1205, 1204, 1204, 426, 1149, 1658, 413, 1658, + /* 930 */ 1659, 399, 137, 138, 91, 3, 1228, 1228, 1063, 1066, + /* 940 */ 1053, 1053, 135, 135, 136, 136, 136, 136, 304, 1311, + /* 950 */ 514, 1204, 137, 138, 91, 1498, 1228, 1228, 1063, 1066, + /* 960 */ 1053, 1053, 135, 135, 136, 136, 136, 136, 434, 131, + /* 970 */ 128, 451, 375, 1204, 274, 291, 372, 517, 367, 516, + /* 980 */ 262, 1204, 1205, 1204, 1147, 227, 363, 448, 447, 1435, + /* 990 */ 1568, 1310, 134, 134, 134, 134, 133, 133, 132, 132, + /* 1000 */ 132, 131, 128, 451, 1568, 576, 1147, 487, 1204, 1205, + /* 1010 */ 1204, 442, 134, 134, 134, 134, 133, 133, 132, 132, + /* 1020 */ 132, 131, 128, 451, 386, 576, 485, 576, 19, 19, + /* 1030 */ 1204, 1205, 1204, 1345, 1236, 970, 1236, 574, 47, 936, + /* 1040 */ 936, 473, 413, 431, 1552, 573, 1125, 562, 19, 19, + /* 1050 */ 19, 19, 49, 336, 850, 851, 852, 111, 1368, 315, + /* 1060 */ 429, 576, 413, 433, 341, 306, 137, 138, 91, 115, + /* 1070 */ 1228, 1228, 1063, 1066, 1053, 1053, 135, 135, 136, 136, + /* 1080 */ 136, 136, 576, 1309, 82, 82, 137, 138, 91, 529, + /* 1090 */ 1228, 1228, 1063, 1066, 1053, 1053, 135, 135, 136, 136, + /* 1100 */ 136, 136, 1569, 222, 377, 19, 19, 305, 1126, 1169, + /* 1110 */ 398, 1148, 22, 22, 498, 333, 1569, 335, 377, 576, + /* 1120 */ 438, 445, 1169, 1127, 486, 1169, 134, 134, 134, 134, + /* 1130 */ 133, 133, 132, 132, 132, 131, 128, 451, 1128, 576, + /* 1140 */ 902, 576, 145, 145, 6, 576, 134, 134, 134, 134, + /* 1150 */ 133, 133, 132, 132, 132, 131, 128, 451, 214, 1336, + /* 1160 */ 922, 576, 19, 19, 19, 19, 1282, 419, 19, 19, + /* 1170 */ 923, 412, 515, 141, 576, 1169, 413, 206, 465, 207, + /* 1180 */ 903, 215, 1575, 552, 147, 147, 7, 227, 1169, 411, + /* 1190 */ 1250, 1169, 120, 307, 117, 307, 413, 66, 66, 334, + /* 1200 */ 137, 138, 91, 119, 1228, 1228, 1063, 1066, 1053, 1053, + /* 1210 */ 135, 135, 136, 136, 136, 136, 413, 285, 209, 969, + /* 1220 */ 137, 138, 91, 471, 1228, 1228, 1063, 1066, 1053, 1053, + /* 1230 */ 135, 135, 136, 136, 136, 136, 435, 10, 1450, 267, + /* 1240 */ 137, 126, 91, 1435, 1228, 1228, 1063, 1066, 1053, 1053, + /* 1250 */ 135, 135, 136, 136, 136, 136, 1435, 1435, 410, 409, + /* 1260 */ 134, 134, 134, 134, 133, 133, 132, 132, 132, 131, + /* 1270 */ 128, 451, 576, 969, 576, 1224, 498, 373, 1595, 1554, + /* 1280 */ 134, 134, 134, 134, 133, 133, 132, 132, 132, 131, + /* 1290 */ 128, 451, 532, 457, 576, 82, 82, 82, 82, 111, + /* 1300 */ 134, 134, 134, 134, 133, 133, 132, 132, 132, 131, + /* 1310 */ 128, 451, 109, 233, 430, 1576, 546, 67, 67, 7, + /* 1320 */ 413, 351, 550, 1550, 260, 259, 258, 494, 443, 569, + /* 1330 */ 419, 983, 446, 1224, 450, 545, 1207, 576, 969, 984, + /* 1340 */ 413, 475, 1449, 1574, 1180, 138, 91, 7, 1228, 1228, + /* 1350 */ 1063, 1066, 1053, 1053, 135, 135, 136, 136, 136, 136, + /* 1360 */ 21, 21, 267, 576, 300, 1126, 91, 233, 1228, 1228, + /* 1370 */ 1063, 1066, 1053, 1053, 135, 135, 136, 136, 136, 136, + /* 1380 */ 1127, 373, 1595, 161, 1573, 16, 53, 53, 7, 108, + /* 1390 */ 533, 38, 969, 125, 1207, 1128, 1180, 576, 1224, 123, + /* 1400 */ 568, 893, 4, 324, 134, 134, 134, 134, 133, 133, + /* 1410 */ 132, 132, 132, 131, 128, 451, 571, 564, 534, 576, + /* 1420 */ 68, 68, 576, 39, 134, 134, 134, 134, 133, 133, + /* 1430 */ 132, 132, 132, 131, 128, 451, 576, 160, 1571, 1223, + /* 1440 */ 452, 576, 54, 54, 576, 69, 69, 576, 1366, 576, + /* 1450 */ 420, 184, 565, 463, 297, 576, 1224, 463, 297, 70, + /* 1460 */ 70, 576, 44, 474, 71, 71, 576, 72, 72, 576, + /* 1470 */ 73, 73, 55, 55, 411, 874, 242, 576, 56, 56, + /* 1480 */ 576, 1040, 576, 478, 57, 57, 576, 121, 121, 59, + /* 1490 */ 59, 23, 60, 60, 411, 122, 319, 452, 577, 452, + /* 1500 */ 74, 74, 1028, 75, 75, 76, 76, 411, 290, 20, + /* 1510 */ 20, 108, 287, 231, 553, 123, 568, 325, 4, 320, + /* 1520 */ 567, 97, 218, 944, 1144, 328, 400, 576, 943, 576, + /* 1530 */ 1380, 424, 571, 874, 1028, 1028, 1030, 1031, 35, 293, + /* 1540 */ 534, 576, 1104, 576, 1104, 9, 576, 342, 576, 111, + /* 1550 */ 77, 77, 143, 143, 576, 205, 452, 222, 1379, 889, + /* 1560 */ 576, 901, 900, 1188, 144, 144, 78, 78, 565, 62, + /* 1570 */ 62, 79, 79, 323, 1021, 576, 266, 63, 63, 908, + /* 1580 */ 909, 1589, 542, 80, 80, 576, 371, 541, 123, 568, + /* 1590 */ 480, 4, 266, 482, 244, 266, 370, 1040, 64, 64, + /* 1600 */ 576, 466, 576, 121, 121, 571, 1557, 576, 170, 170, + /* 1610 */ 576, 122, 576, 452, 577, 452, 576, 889, 1028, 576, + /* 1620 */ 165, 576, 111, 171, 171, 87, 87, 337, 1616, 452, + /* 1630 */ 65, 65, 1530, 83, 83, 146, 146, 986, 987, 84, + /* 1640 */ 84, 565, 168, 168, 148, 148, 1092, 347, 1032, 111, + /* 1650 */ 1028, 1028, 1030, 1031, 35, 542, 1103, 576, 1103, 576, + /* 1660 */ 543, 123, 568, 504, 4, 263, 576, 361, 1529, 111, + /* 1670 */ 1040, 1088, 576, 263, 576, 490, 121, 121, 571, 1188, + /* 1680 */ 142, 142, 169, 169, 122, 576, 452, 577, 452, 162, + /* 1690 */ 162, 1028, 576, 563, 576, 152, 152, 151, 151, 348, + /* 1700 */ 1376, 974, 452, 266, 1092, 942, 1032, 125, 149, 149, + /* 1710 */ 939, 576, 125, 576, 565, 150, 150, 86, 86, 872, + /* 1720 */ 352, 159, 576, 1028, 1028, 1030, 1031, 35, 542, 941, + /* 1730 */ 576, 125, 355, 541, 88, 88, 85, 85, 357, 359, + /* 1740 */ 1324, 1308, 366, 1040, 376, 52, 52, 499, 1389, 121, + /* 1750 */ 121, 1434, 1188, 58, 58, 1362, 1374, 122, 1439, 452, + /* 1760 */ 577, 452, 1289, 167, 1028, 1280, 280, 1268, 1267, 1269, + /* 1770 */ 1609, 1359, 312, 313, 12, 314, 397, 1421, 224, 1416, + /* 1780 */ 295, 237, 1409, 339, 340, 1426, 301, 345, 484, 228, + /* 1790 */ 1371, 1307, 1372, 1370, 1425, 404, 1028, 1028, 1030, 1031, + /* 1800 */ 35, 1601, 1192, 454, 509, 369, 292, 1502, 210, 1501, + /* 1810 */ 1369, 396, 396, 395, 277, 393, 211, 566, 859, 1612, + /* 1820 */ 1244, 123, 568, 391, 4, 1188, 223, 270, 1549, 1547, + /* 1830 */ 1241, 239, 186, 327, 422, 96, 195, 220, 571, 235, + /* 1840 */ 180, 326, 188, 468, 190, 1507, 191, 192, 92, 193, + /* 1850 */ 469, 95, 1422, 13, 502, 247, 1430, 109, 199, 402, + /* 1860 */ 476, 405, 452, 1496, 1428, 1427, 14, 491, 251, 102, + /* 1870 */ 497, 1518, 241, 281, 565, 253, 203, 354, 500, 254, + /* 1880 */ 175, 1270, 407, 43, 350, 518, 1327, 436, 255, 1326, + /* 1890 */ 1325, 1318, 104, 893, 1626, 229, 408, 440, 1625, 441, + /* 1900 */ 240, 310, 1296, 1040, 311, 1317, 527, 1594, 1297, 121, + /* 1910 */ 121, 368, 1295, 1624, 268, 269, 1580, 122, 1579, 452, + /* 1920 */ 577, 452, 374, 444, 1028, 1394, 1393, 140, 553, 90, + /* 1930 */ 568, 11, 4, 1483, 383, 414, 385, 110, 116, 216, + /* 1940 */ 320, 567, 1350, 555, 42, 318, 571, 537, 1349, 389, + /* 1950 */ 390, 579, 1198, 276, 279, 278, 1028, 1028, 1030, 1031, + /* 1960 */ 35, 580, 415, 1265, 458, 1260, 416, 185, 1534, 172, + /* 1970 */ 452, 1535, 173, 156, 308, 846, 1533, 1532, 453, 217, + /* 1980 */ 225, 89, 565, 174, 322, 1188, 226, 236, 1102, 154, + /* 1990 */ 1100, 330, 176, 187, 1223, 189, 925, 338, 243, 1116, + /* 2000 */ 246, 194, 177, 178, 425, 427, 98, 99, 196, 100, + /* 2010 */ 101, 1040, 179, 1119, 248, 1115, 249, 121, 121, 24, + /* 2020 */ 163, 250, 349, 1108, 266, 122, 1238, 452, 577, 452, + /* 2030 */ 1192, 454, 1028, 200, 292, 496, 252, 201, 861, 396, + /* 2040 */ 396, 395, 277, 393, 15, 501, 859, 370, 292, 256, + /* 2050 */ 202, 554, 505, 396, 396, 395, 277, 393, 103, 239, + /* 2060 */ 859, 327, 25, 26, 1028, 1028, 1030, 1031, 35, 326, + /* 2070 */ 362, 510, 891, 239, 365, 327, 513, 904, 105, 309, + /* 2080 */ 164, 181, 27, 326, 106, 521, 107, 1185, 1069, 1155, + /* 2090 */ 17, 1154, 284, 1188, 286, 978, 265, 204, 125, 1171, + /* 2100 */ 241, 230, 972, 1175, 28, 1160, 29, 1179, 175, 1173, + /* 2110 */ 30, 43, 31, 1178, 241, 32, 41, 549, 8, 33, + /* 2120 */ 208, 111, 175, 1083, 1070, 43, 113, 1068, 240, 114, + /* 2130 */ 1072, 34, 1073, 561, 1124, 118, 271, 36, 18, 1194, + /* 2140 */ 1033, 873, 240, 935, 124, 37, 272, 273, 1617, 572, + /* 2150 */ 183, 153, 394, 1193, 1256, 1256, 1256, 1256, 1256, 1256, + /* 2160 */ 1256, 1256, 1256, 414, 1256, 1256, 1256, 1256, 320, 567, + /* 2170 */ 1256, 1256, 1256, 1256, 1256, 1256, 1256, 414, 1256, 1256, + /* 2180 */ 1256, 1256, 320, 567, 1256, 1256, 1256, 1256, 1256, 1256, + /* 2190 */ 1256, 1256, 458, 1256, 1256, 1256, 1256, 1256, 1256, 1256, + /* 2200 */ 1256, 1256, 1256, 1256, 1256, 1256, 458, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 193, 193, 193, 274, 275, 276, 193, 274, 275, 276, - /* 10 */ 193, 223, 219, 225, 206, 210, 211, 212, 193, 19, - /* 20 */ 219, 233, 216, 216, 217, 216, 217, 193, 295, 216, - /* 30 */ 217, 31, 193, 216, 217, 193, 228, 213, 230, 39, - /* 40 */ 206, 216, 217, 43, 44, 45, 46, 47, 48, 49, - /* 50 */ 50, 51, 52, 53, 54, 55, 56, 57, 193, 19, - /* 60 */ 185, 186, 187, 188, 189, 190, 253, 274, 275, 276, - /* 70 */ 195, 193, 197, 193, 261, 274, 275, 276, 253, 204, - /* 80 */ 238, 204, 81, 43, 44, 45, 46, 47, 48, 49, - /* 90 */ 50, 51, 52, 53, 54, 55, 56, 57, 274, 275, - /* 100 */ 276, 262, 102, 103, 104, 105, 106, 107, 108, 109, - /* 110 */ 110, 111, 112, 113, 239, 240, 239, 240, 210, 211, - /* 120 */ 212, 314, 315, 314, 59, 316, 86, 252, 88, 252, - /* 130 */ 19, 314, 315, 256, 257, 113, 25, 72, 296, 138, - /* 140 */ 139, 266, 102, 103, 104, 105, 106, 107, 108, 109, - /* 150 */ 110, 111, 112, 113, 43, 44, 45, 46, 47, 48, - /* 160 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 81, - /* 170 */ 292, 59, 292, 298, 108, 109, 110, 111, 112, 113, - /* 180 */ 69, 116, 117, 118, 72, 106, 107, 193, 111, 112, - /* 190 */ 113, 54, 55, 56, 57, 58, 102, 103, 104, 105, - /* 200 */ 106, 107, 108, 109, 110, 111, 112, 113, 120, 25, - /* 210 */ 216, 217, 145, 102, 103, 104, 105, 106, 107, 108, - /* 220 */ 109, 110, 111, 112, 113, 231, 138, 139, 116, 117, - /* 230 */ 118, 164, 153, 19, 155, 54, 55, 56, 57, 102, - /* 240 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - /* 250 */ 113, 128, 129, 46, 47, 48, 49, 43, 44, 45, - /* 260 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - /* 270 */ 56, 57, 216, 193, 25, 59, 193, 19, 165, 166, - /* 280 */ 193, 67, 24, 102, 103, 104, 105, 106, 107, 108, - /* 290 */ 109, 110, 111, 112, 113, 73, 216, 217, 59, 216, - /* 300 */ 217, 43, 44, 45, 46, 47, 48, 49, 50, 51, - /* 310 */ 52, 53, 54, 55, 56, 57, 102, 103, 104, 105, - /* 320 */ 106, 107, 108, 109, 110, 111, 112, 113, 121, 145, - /* 330 */ 59, 193, 116, 117, 118, 119, 273, 204, 122, 123, - /* 340 */ 124, 19, 20, 134, 22, 136, 137, 19, 132, 127, - /* 350 */ 128, 129, 24, 22, 23, 116, 117, 118, 36, 193, - /* 360 */ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - /* 370 */ 112, 113, 239, 240, 311, 312, 215, 106, 107, 241, - /* 380 */ 19, 59, 216, 217, 223, 252, 115, 116, 117, 118, - /* 390 */ 151, 120, 26, 71, 193, 308, 309, 193, 149, 128, - /* 400 */ 313, 216, 269, 81, 43, 44, 45, 46, 47, 48, - /* 410 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 253, - /* 420 */ 216, 217, 100, 95, 153, 59, 155, 261, 106, 107, - /* 430 */ 25, 193, 101, 193, 193, 231, 114, 25, 116, 117, - /* 440 */ 118, 113, 304, 121, 193, 204, 59, 119, 120, 121, - /* 450 */ 122, 123, 124, 125, 216, 217, 193, 216, 217, 131, - /* 460 */ 138, 139, 230, 102, 103, 104, 105, 106, 107, 108, - /* 470 */ 109, 110, 111, 112, 113, 153, 154, 155, 156, 157, - /* 480 */ 239, 240, 116, 117, 118, 76, 193, 23, 19, 25, - /* 490 */ 22, 253, 23, 252, 253, 108, 87, 204, 89, 261, - /* 500 */ 198, 92, 261, 116, 117, 118, 193, 306, 307, 216, - /* 510 */ 217, 150, 43, 44, 45, 46, 47, 48, 49, 50, - /* 520 */ 51, 52, 53, 54, 55, 56, 57, 59, 193, 216, - /* 530 */ 217, 19, 239, 240, 283, 23, 106, 107, 108, 109, - /* 540 */ 110, 111, 112, 113, 73, 252, 253, 142, 308, 309, - /* 550 */ 138, 139, 81, 313, 145, 43, 44, 45, 46, 47, - /* 560 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - /* 570 */ 307, 102, 103, 104, 105, 106, 107, 108, 109, 110, - /* 580 */ 111, 112, 113, 281, 116, 117, 118, 285, 23, 193, - /* 590 */ 25, 119, 59, 193, 122, 123, 124, 59, 127, 203, - /* 600 */ 59, 205, 19, 268, 132, 25, 23, 22, 193, 138, - /* 610 */ 139, 249, 204, 251, 102, 103, 104, 105, 106, 107, - /* 620 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, - /* 630 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 640 */ 57, 19, 22, 23, 59, 23, 25, 239, 240, 116, - /* 650 */ 117, 118, 193, 11, 116, 117, 118, 116, 117, 118, - /* 660 */ 252, 269, 22, 193, 15, 43, 44, 45, 46, 47, - /* 670 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - /* 680 */ 273, 143, 193, 118, 143, 102, 103, 104, 105, 106, - /* 690 */ 107, 108, 109, 110, 111, 112, 113, 76, 118, 59, - /* 700 */ 241, 116, 117, 118, 304, 216, 217, 292, 143, 60, - /* 710 */ 89, 241, 19, 92, 193, 193, 23, 22, 311, 312, - /* 720 */ 231, 101, 22, 143, 102, 103, 104, 105, 106, 107, - /* 730 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, - /* 740 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 750 */ 57, 19, 193, 193, 59, 23, 116, 117, 118, 59, - /* 760 */ 201, 21, 241, 304, 22, 206, 127, 128, 129, 193, - /* 770 */ 128, 129, 235, 236, 304, 43, 44, 45, 46, 47, - /* 780 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - /* 790 */ 22, 193, 216, 217, 193, 102, 103, 104, 105, 106, - /* 800 */ 107, 108, 109, 110, 111, 112, 113, 231, 193, 193, - /* 810 */ 193, 116, 117, 118, 216, 217, 116, 117, 118, 226, - /* 820 */ 80, 193, 19, 235, 236, 304, 23, 211, 212, 231, - /* 830 */ 204, 216, 217, 205, 102, 103, 104, 105, 106, 107, - /* 840 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, - /* 850 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 860 */ 57, 19, 193, 123, 76, 239, 240, 193, 253, 239, - /* 870 */ 240, 239, 240, 193, 106, 107, 193, 89, 252, 193, - /* 880 */ 92, 59, 252, 141, 252, 43, 44, 45, 46, 47, - /* 890 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - /* 900 */ 284, 161, 216, 217, 193, 102, 103, 104, 105, 106, - /* 910 */ 107, 108, 109, 110, 111, 112, 113, 231, 193, 16, - /* 920 */ 187, 188, 189, 190, 7, 8, 9, 309, 195, 25, - /* 930 */ 197, 313, 19, 127, 128, 129, 262, 204, 22, 117, - /* 940 */ 24, 216, 217, 263, 102, 103, 104, 105, 106, 107, - /* 950 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, - /* 960 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 970 */ 57, 193, 239, 240, 193, 59, 19, 188, 253, 190, - /* 980 */ 77, 226, 79, 193, 195, 252, 197, 193, 19, 301, - /* 990 */ 302, 193, 193, 204, 216, 217, 226, 216, 217, 266, - /* 1000 */ 204, 159, 45, 46, 47, 48, 49, 50, 51, 52, - /* 1010 */ 53, 54, 55, 56, 57, 102, 103, 104, 105, 106, - /* 1020 */ 107, 108, 109, 110, 111, 112, 113, 12, 239, 240, - /* 1030 */ 232, 298, 238, 117, 253, 239, 240, 238, 259, 260, - /* 1040 */ 193, 252, 27, 31, 193, 193, 142, 204, 252, 193, - /* 1050 */ 193, 39, 262, 193, 100, 266, 278, 42, 204, 102, - /* 1060 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - /* 1070 */ 113, 117, 159, 216, 217, 121, 216, 217, 63, 193, - /* 1080 */ 193, 193, 239, 240, 115, 116, 193, 298, 73, 238, - /* 1090 */ 238, 231, 19, 239, 240, 252, 22, 24, 211, 212, - /* 1100 */ 24, 193, 216, 217, 216, 217, 252, 153, 154, 155, - /* 1110 */ 253, 16, 19, 144, 213, 268, 43, 44, 45, 46, - /* 1120 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 1130 */ 57, 238, 19, 59, 193, 59, 43, 44, 45, 46, - /* 1140 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 1150 */ 57, 22, 23, 193, 25, 193, 43, 44, 45, 46, - /* 1160 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 1170 */ 57, 284, 77, 193, 79, 102, 103, 104, 105, 106, - /* 1180 */ 107, 108, 109, 110, 111, 112, 113, 286, 193, 193, - /* 1190 */ 193, 117, 291, 117, 232, 102, 103, 104, 105, 106, - /* 1200 */ 107, 108, 109, 110, 111, 112, 113, 204, 22, 23, - /* 1210 */ 66, 25, 216, 217, 35, 102, 103, 104, 105, 106, - /* 1220 */ 107, 108, 109, 110, 111, 112, 113, 193, 268, 85, - /* 1230 */ 101, 193, 309, 309, 240, 19, 313, 313, 94, 208, - /* 1240 */ 209, 193, 239, 240, 193, 66, 252, 19, 268, 244, - /* 1250 */ 216, 217, 193, 74, 213, 252, 161, 19, 263, 254, - /* 1260 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - /* 1270 */ 54, 55, 56, 57, 193, 216, 217, 5, 59, 193, - /* 1280 */ 19, 244, 10, 11, 12, 13, 14, 101, 309, 17, - /* 1290 */ 146, 254, 313, 193, 193, 76, 115, 216, 217, 309, - /* 1300 */ 12, 263, 30, 313, 32, 46, 87, 46, 89, 130, - /* 1310 */ 193, 92, 40, 22, 263, 27, 216, 217, 102, 103, - /* 1320 */ 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - /* 1330 */ 42, 150, 291, 216, 217, 116, 117, 118, 19, 20, - /* 1340 */ 193, 22, 70, 260, 116, 193, 24, 264, 193, 263, - /* 1350 */ 78, 63, 61, 81, 116, 36, 193, 260, 193, 29, - /* 1360 */ 193, 264, 193, 33, 145, 193, 59, 48, 216, 217, - /* 1370 */ 98, 216, 217, 193, 115, 193, 115, 193, 59, 216, - /* 1380 */ 217, 216, 217, 216, 217, 216, 217, 255, 216, 217, - /* 1390 */ 71, 193, 131, 193, 25, 65, 216, 217, 216, 217, - /* 1400 */ 216, 217, 208, 209, 85, 133, 193, 100, 193, 90, - /* 1410 */ 138, 139, 138, 139, 216, 217, 216, 217, 193, 100, - /* 1420 */ 193, 108, 135, 116, 117, 106, 107, 140, 121, 216, - /* 1430 */ 217, 216, 217, 114, 162, 116, 117, 118, 299, 300, - /* 1440 */ 121, 216, 217, 216, 217, 193, 244, 193, 135, 244, - /* 1450 */ 193, 256, 257, 140, 244, 193, 254, 193, 193, 254, - /* 1460 */ 153, 154, 155, 141, 254, 149, 150, 258, 216, 217, - /* 1470 */ 216, 217, 153, 154, 155, 156, 157, 0, 1, 2, - /* 1480 */ 216, 217, 5, 115, 158, 193, 160, 10, 11, 12, - /* 1490 */ 13, 14, 193, 59, 17, 126, 193, 19, 20, 129, - /* 1500 */ 22, 193, 22, 22, 24, 193, 23, 30, 25, 32, - /* 1510 */ 19, 20, 144, 22, 36, 216, 217, 40, 193, 216, - /* 1520 */ 217, 193, 152, 129, 216, 217, 193, 36, 216, 217, - /* 1530 */ 193, 99, 193, 193, 53, 193, 193, 59, 23, 193, - /* 1540 */ 25, 216, 217, 193, 216, 217, 152, 70, 59, 71, - /* 1550 */ 59, 117, 193, 216, 217, 78, 216, 217, 81, 216, - /* 1560 */ 217, 318, 71, 85, 193, 133, 193, 193, 90, 23, - /* 1570 */ 23, 25, 25, 120, 121, 98, 85, 193, 100, 193, - /* 1580 */ 23, 90, 25, 121, 106, 107, 19, 216, 217, 216, - /* 1590 */ 217, 100, 114, 131, 116, 117, 118, 106, 107, 121, - /* 1600 */ 216, 217, 216, 217, 193, 114, 117, 116, 117, 118, - /* 1610 */ 133, 193, 121, 193, 193, 138, 139, 193, 23, 193, - /* 1620 */ 25, 23, 23, 25, 25, 7, 8, 216, 217, 193, - /* 1630 */ 193, 153, 154, 155, 156, 157, 216, 217, 193, 162, - /* 1640 */ 216, 217, 216, 217, 153, 154, 155, 156, 157, 1, - /* 1650 */ 2, 193, 193, 5, 19, 20, 59, 22, 10, 11, - /* 1660 */ 12, 13, 14, 193, 97, 17, 193, 23, 193, 25, - /* 1670 */ 288, 36, 193, 242, 216, 217, 236, 23, 30, 25, - /* 1680 */ 32, 19, 20, 23, 22, 25, 216, 217, 40, 216, - /* 1690 */ 217, 216, 217, 193, 59, 216, 217, 193, 36, 83, - /* 1700 */ 84, 153, 153, 155, 155, 23, 71, 25, 23, 193, - /* 1710 */ 25, 193, 193, 193, 117, 193, 193, 193, 70, 193, - /* 1720 */ 193, 59, 193, 255, 255, 287, 78, 255, 243, 81, - /* 1730 */ 191, 255, 297, 71, 271, 100, 293, 245, 267, 214, - /* 1740 */ 246, 106, 107, 108, 246, 271, 98, 245, 293, 114, - /* 1750 */ 220, 116, 117, 118, 267, 271, 121, 271, 225, 219, - /* 1760 */ 229, 219, 100, 219, 259, 259, 259, 259, 106, 107, - /* 1770 */ 249, 196, 60, 280, 141, 243, 114, 249, 116, 117, - /* 1780 */ 118, 133, 245, 121, 200, 297, 138, 139, 153, 154, - /* 1790 */ 155, 156, 157, 297, 200, 38, 19, 20, 151, 22, - /* 1800 */ 200, 150, 140, 294, 294, 22, 272, 43, 234, 18, - /* 1810 */ 162, 270, 200, 36, 237, 153, 154, 155, 156, 157, - /* 1820 */ 237, 283, 237, 237, 18, 199, 149, 246, 272, 270, - /* 1830 */ 272, 200, 158, 246, 246, 234, 59, 234, 246, 199, - /* 1840 */ 290, 62, 289, 200, 199, 22, 221, 115, 71, 200, - /* 1850 */ 200, 199, 199, 221, 218, 218, 19, 20, 64, 22, - /* 1860 */ 218, 227, 22, 224, 126, 224, 165, 221, 24, 305, - /* 1870 */ 200, 113, 312, 36, 218, 220, 218, 100, 282, 218, - /* 1880 */ 91, 218, 317, 106, 107, 221, 227, 282, 317, 82, - /* 1890 */ 148, 114, 265, 116, 117, 118, 59, 145, 121, 22, - /* 1900 */ 277, 158, 200, 265, 25, 202, 147, 250, 71, 279, - /* 1910 */ 13, 146, 194, 194, 249, 248, 250, 140, 247, 246, - /* 1920 */ 6, 192, 192, 192, 303, 303, 213, 207, 300, 213, - /* 1930 */ 153, 154, 155, 156, 157, 213, 213, 100, 213, 222, - /* 1940 */ 207, 214, 214, 106, 107, 4, 222, 207, 3, 22, - /* 1950 */ 163, 114, 15, 116, 117, 118, 16, 23, 121, 23, - /* 1960 */ 139, 151, 130, 25, 142, 16, 24, 20, 144, 1, - /* 1970 */ 142, 130, 130, 61, 53, 53, 37, 151, 53, 53, - /* 1980 */ 130, 116, 34, 1, 141, 5, 22, 115, 161, 141, - /* 1990 */ 153, 154, 155, 156, 157, 25, 68, 68, 75, 41, - /* 2000 */ 115, 24, 131, 20, 19, 125, 22, 96, 22, 22, - /* 2010 */ 67, 23, 22, 67, 59, 24, 22, 28, 67, 23, - /* 2020 */ 22, 22, 149, 23, 23, 23, 116, 23, 25, 37, - /* 2030 */ 97, 141, 23, 23, 22, 143, 25, 75, 88, 34, - /* 2040 */ 34, 34, 34, 86, 75, 93, 23, 34, 22, 34, - /* 2050 */ 25, 24, 34, 25, 23, 142, 23, 142, 44, 23, - /* 2060 */ 23, 23, 11, 23, 25, 22, 22, 22, 15, 23, - /* 2070 */ 23, 22, 22, 25, 1, 1, 141, 25, 23, 135, - /* 2080 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2090 */ 319, 319, 319, 319, 141, 141, 319, 141, 319, 319, - /* 2100 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2110 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2120 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2130 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2140 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2150 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2160 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2170 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2180 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2190 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2200 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2210 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2220 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2230 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2240 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2250 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2260 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2270 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2280 */ 319, 319, 319, + /* 0 */ 276, 277, 278, 240, 241, 224, 194, 226, 194, 240, + /* 10 */ 241, 194, 216, 220, 194, 234, 253, 194, 255, 19, + /* 20 */ 224, 297, 253, 194, 255, 205, 212, 213, 205, 217, + /* 30 */ 218, 31, 205, 194, 217, 218, 194, 217, 218, 39, + /* 40 */ 217, 218, 312, 43, 44, 45, 316, 47, 48, 49, + /* 50 */ 50, 51, 52, 53, 54, 55, 56, 57, 58, 19, + /* 60 */ 240, 241, 194, 240, 241, 194, 254, 240, 241, 276, + /* 70 */ 277, 278, 233, 253, 254, 255, 253, 254, 255, 217, + /* 80 */ 253, 239, 255, 43, 44, 45, 263, 47, 48, 49, + /* 90 */ 50, 51, 52, 53, 54, 55, 56, 57, 58, 270, + /* 100 */ 286, 22, 23, 103, 104, 105, 106, 107, 108, 109, + /* 110 */ 110, 111, 112, 113, 114, 82, 47, 48, 49, 50, + /* 120 */ 186, 187, 188, 189, 190, 191, 189, 87, 191, 89, + /* 130 */ 196, 19, 198, 196, 317, 198, 319, 25, 194, 205, + /* 140 */ 298, 270, 205, 103, 104, 105, 106, 107, 108, 109, + /* 150 */ 110, 111, 112, 113, 114, 43, 44, 45, 11, 47, + /* 160 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + /* 170 */ 58, 60, 139, 140, 240, 241, 214, 240, 241, 311, + /* 180 */ 312, 102, 70, 239, 316, 194, 19, 253, 77, 255, + /* 190 */ 253, 122, 255, 55, 56, 57, 58, 59, 207, 88, + /* 200 */ 194, 90, 268, 194, 93, 268, 107, 108, 109, 110, + /* 210 */ 111, 112, 113, 114, 47, 103, 104, 105, 106, 107, + /* 220 */ 108, 109, 110, 111, 112, 113, 114, 114, 117, 118, + /* 230 */ 119, 276, 277, 278, 300, 19, 194, 300, 276, 277, + /* 240 */ 278, 103, 104, 105, 106, 107, 108, 109, 110, 111, + /* 250 */ 112, 113, 114, 55, 56, 57, 58, 146, 194, 43, + /* 260 */ 44, 45, 47, 47, 48, 49, 50, 51, 52, 53, + /* 270 */ 54, 55, 56, 57, 58, 82, 129, 130, 60, 129, + /* 280 */ 130, 217, 218, 116, 68, 25, 103, 104, 105, 106, + /* 290 */ 107, 108, 109, 110, 111, 112, 113, 114, 23, 132, + /* 300 */ 294, 103, 104, 105, 106, 107, 108, 109, 110, 111, + /* 310 */ 112, 113, 114, 217, 121, 306, 194, 308, 26, 103, + /* 320 */ 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + /* 330 */ 114, 116, 139, 140, 217, 117, 118, 119, 120, 19, + /* 340 */ 194, 123, 124, 125, 24, 109, 110, 111, 112, 113, + /* 350 */ 114, 133, 60, 311, 312, 250, 194, 252, 316, 19, + /* 360 */ 194, 166, 167, 43, 44, 45, 205, 47, 48, 49, + /* 370 */ 50, 51, 52, 53, 54, 55, 56, 57, 58, 217, + /* 380 */ 218, 317, 318, 43, 44, 45, 264, 47, 48, 49, + /* 390 */ 50, 51, 52, 53, 54, 55, 56, 57, 58, 139, + /* 400 */ 140, 240, 241, 139, 140, 188, 189, 190, 191, 117, + /* 410 */ 118, 119, 231, 196, 253, 198, 255, 194, 194, 258, + /* 420 */ 259, 146, 205, 103, 104, 105, 106, 107, 108, 109, + /* 430 */ 110, 111, 112, 113, 114, 109, 212, 213, 236, 237, + /* 440 */ 217, 218, 194, 103, 104, 105, 106, 107, 108, 109, + /* 450 */ 110, 111, 112, 113, 114, 194, 120, 240, 241, 123, + /* 460 */ 124, 125, 136, 194, 19, 74, 60, 141, 23, 133, + /* 470 */ 253, 194, 255, 82, 194, 309, 310, 254, 29, 317, + /* 480 */ 318, 194, 33, 22, 199, 268, 263, 239, 43, 44, + /* 490 */ 45, 151, 47, 48, 49, 50, 51, 52, 53, 54, + /* 500 */ 55, 56, 57, 58, 217, 218, 194, 60, 19, 146, + /* 510 */ 286, 242, 23, 107, 108, 66, 204, 300, 206, 128, + /* 520 */ 73, 60, 116, 117, 118, 119, 265, 121, 165, 60, + /* 530 */ 139, 140, 43, 44, 45, 129, 47, 48, 49, 50, + /* 540 */ 51, 52, 53, 54, 55, 56, 57, 58, 103, 104, + /* 550 */ 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + /* 560 */ 154, 194, 156, 194, 117, 118, 119, 280, 283, 205, + /* 570 */ 101, 220, 287, 19, 20, 306, 22, 308, 117, 118, + /* 580 */ 119, 211, 212, 213, 217, 218, 117, 118, 236, 237, + /* 590 */ 36, 122, 103, 104, 105, 106, 107, 108, 109, 110, + /* 600 */ 111, 112, 113, 114, 240, 241, 194, 60, 194, 194, + /* 610 */ 194, 194, 19, 194, 60, 194, 23, 253, 206, 255, + /* 620 */ 73, 254, 19, 154, 155, 156, 72, 276, 277, 278, + /* 630 */ 263, 217, 218, 217, 218, 271, 43, 44, 45, 271, + /* 640 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 650 */ 57, 58, 183, 194, 285, 101, 19, 214, 60, 242, + /* 660 */ 23, 107, 108, 109, 117, 118, 119, 16, 254, 115, + /* 670 */ 254, 117, 118, 119, 194, 60, 122, 263, 205, 264, + /* 680 */ 43, 44, 45, 264, 47, 48, 49, 50, 51, 52, + /* 690 */ 53, 54, 55, 56, 57, 58, 103, 104, 105, 106, + /* 700 */ 107, 108, 109, 110, 111, 112, 113, 114, 154, 155, + /* 710 */ 156, 157, 158, 240, 241, 117, 118, 119, 101, 205, + /* 720 */ 117, 19, 20, 306, 22, 308, 253, 74, 255, 78, + /* 730 */ 205, 80, 117, 118, 119, 118, 293, 183, 36, 122, + /* 740 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + /* 750 */ 113, 114, 194, 294, 240, 241, 211, 212, 213, 144, + /* 760 */ 19, 23, 60, 25, 23, 240, 241, 253, 245, 255, + /* 770 */ 15, 154, 155, 156, 72, 217, 218, 194, 253, 256, + /* 780 */ 255, 128, 129, 130, 43, 44, 45, 22, 47, 48, + /* 790 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + /* 800 */ 183, 19, 77, 101, 19, 128, 129, 130, 23, 107, + /* 810 */ 108, 60, 254, 88, 21, 90, 61, 115, 93, 117, + /* 820 */ 118, 119, 239, 22, 122, 60, 194, 205, 43, 44, + /* 830 */ 45, 205, 47, 48, 49, 50, 51, 52, 53, 54, + /* 840 */ 55, 56, 57, 58, 103, 104, 105, 106, 107, 108, + /* 850 */ 109, 110, 111, 112, 113, 114, 154, 155, 156, 157, + /* 860 */ 158, 60, 240, 241, 60, 116, 240, 241, 117, 118, + /* 870 */ 119, 146, 194, 19, 81, 253, 275, 255, 24, 253, + /* 880 */ 98, 255, 117, 118, 119, 183, 22, 194, 103, 104, + /* 890 */ 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + /* 900 */ 151, 194, 270, 152, 22, 23, 194, 25, 19, 202, + /* 910 */ 217, 218, 23, 109, 207, 314, 315, 124, 117, 118, + /* 920 */ 119, 117, 118, 119, 60, 232, 22, 23, 19, 25, + /* 930 */ 303, 304, 43, 44, 45, 22, 47, 48, 49, 50, + /* 940 */ 51, 52, 53, 54, 55, 56, 57, 58, 270, 227, + /* 950 */ 96, 60, 43, 44, 45, 162, 47, 48, 49, 50, + /* 960 */ 51, 52, 53, 54, 55, 56, 57, 58, 114, 112, + /* 970 */ 113, 114, 194, 60, 120, 121, 122, 123, 124, 125, + /* 980 */ 126, 117, 118, 119, 102, 25, 132, 107, 108, 194, + /* 990 */ 194, 227, 103, 104, 105, 106, 107, 108, 109, 110, + /* 1000 */ 111, 112, 113, 114, 194, 194, 102, 194, 117, 118, + /* 1010 */ 119, 233, 103, 104, 105, 106, 107, 108, 109, 110, + /* 1020 */ 111, 112, 113, 114, 194, 194, 19, 194, 217, 218, + /* 1030 */ 117, 118, 119, 241, 154, 144, 156, 135, 242, 137, + /* 1040 */ 138, 130, 19, 232, 194, 253, 23, 255, 217, 218, + /* 1050 */ 217, 218, 242, 16, 7, 8, 9, 25, 261, 262, + /* 1060 */ 265, 194, 19, 232, 153, 232, 43, 44, 45, 160, + /* 1070 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 1080 */ 57, 58, 194, 227, 217, 218, 43, 44, 45, 194, + /* 1090 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 1100 */ 57, 58, 306, 143, 308, 217, 218, 294, 12, 77, + /* 1110 */ 22, 23, 217, 218, 194, 78, 306, 80, 308, 194, + /* 1120 */ 232, 254, 90, 27, 117, 93, 103, 104, 105, 106, + /* 1130 */ 107, 108, 109, 110, 111, 112, 113, 114, 42, 194, + /* 1140 */ 35, 194, 217, 218, 214, 194, 103, 104, 105, 106, + /* 1150 */ 107, 108, 109, 110, 111, 112, 113, 114, 194, 239, + /* 1160 */ 64, 194, 217, 218, 217, 218, 209, 210, 217, 218, + /* 1170 */ 74, 207, 67, 22, 194, 77, 19, 232, 245, 232, + /* 1180 */ 75, 24, 312, 232, 217, 218, 316, 25, 90, 256, + /* 1190 */ 102, 93, 159, 229, 161, 231, 19, 217, 218, 162, + /* 1200 */ 43, 44, 45, 160, 47, 48, 49, 50, 51, 52, + /* 1210 */ 53, 54, 55, 56, 57, 58, 19, 23, 288, 25, + /* 1220 */ 43, 44, 45, 293, 47, 48, 49, 50, 51, 52, + /* 1230 */ 53, 54, 55, 56, 57, 58, 131, 22, 275, 24, + /* 1240 */ 43, 44, 45, 194, 47, 48, 49, 50, 51, 52, + /* 1250 */ 53, 54, 55, 56, 57, 58, 194, 194, 107, 108, + /* 1260 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + /* 1270 */ 113, 114, 194, 25, 194, 60, 194, 314, 315, 194, + /* 1280 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + /* 1290 */ 113, 114, 19, 194, 194, 217, 218, 217, 218, 25, + /* 1300 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + /* 1310 */ 113, 114, 150, 119, 265, 312, 67, 217, 218, 316, + /* 1320 */ 19, 239, 194, 194, 128, 129, 130, 265, 265, 209, + /* 1330 */ 210, 31, 254, 118, 254, 86, 60, 194, 144, 39, + /* 1340 */ 19, 130, 275, 312, 95, 44, 45, 316, 47, 48, + /* 1350 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + /* 1360 */ 217, 218, 24, 194, 153, 12, 45, 119, 47, 48, + /* 1370 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + /* 1380 */ 27, 314, 315, 22, 312, 24, 217, 218, 316, 116, + /* 1390 */ 117, 22, 144, 25, 118, 42, 147, 194, 60, 19, + /* 1400 */ 20, 127, 22, 194, 103, 104, 105, 106, 107, 108, + /* 1410 */ 109, 110, 111, 112, 113, 114, 36, 64, 145, 194, + /* 1420 */ 217, 218, 194, 54, 103, 104, 105, 106, 107, 108, + /* 1430 */ 109, 110, 111, 112, 113, 114, 194, 22, 310, 25, + /* 1440 */ 60, 194, 217, 218, 194, 217, 218, 194, 260, 194, + /* 1450 */ 301, 302, 72, 262, 262, 194, 118, 266, 266, 217, + /* 1460 */ 218, 194, 82, 245, 217, 218, 194, 217, 218, 194, + /* 1470 */ 217, 218, 217, 218, 256, 60, 24, 194, 217, 218, + /* 1480 */ 194, 101, 194, 245, 217, 218, 194, 107, 108, 217, + /* 1490 */ 218, 22, 217, 218, 256, 115, 245, 117, 118, 119, + /* 1500 */ 217, 218, 122, 217, 218, 217, 218, 256, 22, 217, + /* 1510 */ 218, 116, 258, 259, 146, 19, 20, 194, 22, 139, + /* 1520 */ 140, 150, 151, 136, 23, 194, 25, 194, 141, 194, + /* 1530 */ 194, 62, 36, 118, 154, 155, 156, 157, 158, 100, + /* 1540 */ 145, 194, 154, 194, 156, 49, 194, 23, 194, 25, + /* 1550 */ 217, 218, 217, 218, 194, 257, 60, 143, 194, 60, + /* 1560 */ 194, 121, 122, 183, 217, 218, 217, 218, 72, 217, + /* 1570 */ 218, 217, 218, 134, 23, 194, 25, 217, 218, 7, + /* 1580 */ 8, 321, 86, 217, 218, 194, 122, 91, 19, 20, + /* 1590 */ 23, 22, 25, 23, 142, 25, 132, 101, 217, 218, + /* 1600 */ 194, 194, 194, 107, 108, 36, 194, 194, 217, 218, + /* 1610 */ 194, 115, 194, 117, 118, 119, 194, 118, 122, 194, + /* 1620 */ 23, 194, 25, 217, 218, 217, 218, 194, 142, 60, + /* 1630 */ 217, 218, 194, 217, 218, 217, 218, 84, 85, 217, + /* 1640 */ 218, 72, 217, 218, 217, 218, 60, 23, 60, 25, + /* 1650 */ 154, 155, 156, 157, 158, 86, 154, 194, 156, 194, + /* 1660 */ 91, 19, 20, 23, 22, 25, 194, 23, 194, 25, + /* 1670 */ 101, 23, 194, 25, 194, 194, 107, 108, 36, 183, + /* 1680 */ 217, 218, 217, 218, 115, 194, 117, 118, 119, 217, + /* 1690 */ 218, 122, 194, 237, 194, 217, 218, 217, 218, 194, + /* 1700 */ 194, 23, 60, 25, 118, 23, 118, 25, 217, 218, + /* 1710 */ 23, 194, 25, 194, 72, 217, 218, 217, 218, 23, + /* 1720 */ 194, 25, 194, 154, 155, 156, 157, 158, 86, 23, + /* 1730 */ 194, 25, 194, 91, 217, 218, 217, 218, 194, 194, + /* 1740 */ 194, 194, 194, 101, 194, 217, 218, 290, 194, 107, + /* 1750 */ 108, 194, 183, 217, 218, 194, 194, 115, 194, 117, + /* 1760 */ 118, 119, 194, 243, 122, 194, 289, 194, 194, 194, + /* 1770 */ 194, 257, 257, 257, 244, 257, 192, 273, 215, 269, + /* 1780 */ 246, 299, 269, 295, 247, 273, 247, 246, 295, 230, + /* 1790 */ 261, 226, 261, 261, 273, 273, 154, 155, 156, 157, + /* 1800 */ 158, 0, 1, 2, 221, 220, 5, 220, 250, 220, + /* 1810 */ 261, 10, 11, 12, 13, 14, 250, 282, 17, 197, + /* 1820 */ 61, 19, 20, 246, 22, 183, 244, 142, 201, 201, + /* 1830 */ 38, 30, 299, 32, 201, 152, 22, 151, 36, 299, + /* 1840 */ 43, 40, 235, 18, 238, 285, 238, 238, 296, 238, + /* 1850 */ 201, 296, 274, 272, 18, 200, 235, 150, 235, 247, + /* 1860 */ 247, 247, 60, 247, 274, 274, 272, 201, 200, 159, + /* 1870 */ 63, 292, 71, 201, 72, 200, 22, 201, 222, 200, + /* 1880 */ 79, 201, 222, 82, 291, 116, 219, 65, 200, 219, + /* 1890 */ 219, 228, 22, 127, 225, 166, 222, 24, 225, 114, + /* 1900 */ 99, 284, 221, 101, 284, 228, 307, 315, 219, 107, + /* 1910 */ 108, 219, 219, 219, 201, 92, 320, 115, 320, 117, + /* 1920 */ 118, 119, 222, 83, 122, 267, 267, 149, 146, 19, + /* 1930 */ 20, 22, 22, 279, 250, 134, 201, 148, 159, 249, + /* 1940 */ 139, 140, 251, 141, 25, 281, 36, 147, 251, 248, + /* 1950 */ 247, 203, 13, 195, 6, 195, 154, 155, 156, 157, + /* 1960 */ 158, 193, 305, 193, 163, 193, 305, 302, 214, 208, + /* 1970 */ 60, 214, 208, 223, 223, 4, 214, 214, 3, 22, + /* 1980 */ 215, 214, 72, 208, 164, 183, 215, 15, 23, 16, + /* 1990 */ 23, 140, 131, 152, 25, 143, 20, 16, 24, 1, + /* 2000 */ 145, 143, 131, 131, 62, 37, 54, 54, 152, 54, + /* 2010 */ 54, 101, 131, 117, 34, 1, 142, 107, 108, 22, + /* 2020 */ 5, 116, 162, 69, 25, 115, 76, 117, 118, 119, + /* 2030 */ 1, 2, 122, 69, 5, 41, 142, 116, 20, 10, + /* 2040 */ 11, 12, 13, 14, 24, 19, 17, 132, 5, 126, + /* 2050 */ 22, 141, 68, 10, 11, 12, 13, 14, 22, 30, + /* 2060 */ 17, 32, 22, 22, 154, 155, 156, 157, 158, 40, + /* 2070 */ 23, 68, 60, 30, 24, 32, 97, 28, 22, 68, + /* 2080 */ 23, 37, 34, 40, 150, 22, 25, 23, 23, 23, + /* 2090 */ 22, 98, 23, 183, 23, 117, 34, 22, 25, 89, + /* 2100 */ 71, 142, 144, 76, 34, 23, 34, 76, 79, 87, + /* 2110 */ 34, 82, 34, 94, 71, 34, 22, 24, 44, 34, + /* 2120 */ 25, 25, 79, 23, 23, 82, 143, 23, 99, 143, + /* 2130 */ 23, 22, 11, 25, 23, 25, 22, 22, 22, 1, + /* 2140 */ 23, 23, 99, 136, 22, 22, 142, 142, 142, 25, + /* 2150 */ 25, 23, 15, 1, 322, 322, 322, 322, 322, 322, + /* 2160 */ 322, 322, 322, 134, 322, 322, 322, 322, 139, 140, + /* 2170 */ 322, 322, 322, 322, 322, 322, 322, 134, 322, 322, + /* 2180 */ 322, 322, 139, 140, 322, 322, 322, 322, 322, 322, + /* 2190 */ 322, 322, 163, 322, 322, 322, 322, 322, 322, 322, + /* 2200 */ 322, 322, 322, 322, 322, 322, 163, 322, 322, 322, + /* 2210 */ 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, + /* 2220 */ 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, + /* 2230 */ 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, + /* 2240 */ 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, + /* 2250 */ 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, + /* 2260 */ 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, + /* 2270 */ 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, + /* 2280 */ 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, + /* 2290 */ 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, + /* 2300 */ 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, + /* 2310 */ 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, + /* 2320 */ 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, + /* 2330 */ 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, + /* 2340 */ 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, + /* 2350 */ 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, + /* 2360 */ 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, + /* 2370 */ 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, + /* 2380 */ 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, + /* 2390 */ 186, 186, 186, }; -#define YY_SHIFT_COUNT (575) +#define YY_SHIFT_COUNT (582) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (2074) +#define YY_SHIFT_MAX (2152) static const unsigned short int yy_shift_ofst[] = { - /* 0 */ 1648, 1477, 1272, 322, 322, 1, 1319, 1478, 1491, 1837, - /* 10 */ 1837, 1837, 471, 0, 0, 214, 1093, 1837, 1837, 1837, - /* 20 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, - /* 30 */ 271, 271, 1219, 1219, 216, 88, 1, 1, 1, 1, - /* 40 */ 1, 40, 111, 258, 361, 469, 512, 583, 622, 693, - /* 50 */ 732, 803, 842, 913, 1073, 1093, 1093, 1093, 1093, 1093, - /* 60 */ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, - /* 70 */ 1093, 1093, 1093, 1113, 1093, 1216, 957, 957, 1635, 1662, - /* 80 */ 1777, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, - /* 90 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, - /* 100 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, - /* 110 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, - /* 120 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, - /* 130 */ 137, 181, 181, 181, 181, 181, 181, 181, 94, 430, - /* 140 */ 66, 65, 112, 366, 533, 533, 740, 1261, 533, 533, - /* 150 */ 79, 79, 533, 412, 412, 412, 77, 412, 123, 113, - /* 160 */ 113, 22, 22, 2098, 2098, 328, 328, 328, 239, 468, - /* 170 */ 468, 468, 468, 1015, 1015, 409, 366, 1129, 1186, 533, - /* 180 */ 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, - /* 190 */ 533, 533, 533, 533, 533, 533, 533, 533, 533, 969, - /* 200 */ 621, 621, 533, 642, 788, 788, 1228, 1228, 822, 822, - /* 210 */ 67, 1274, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 1307, - /* 220 */ 954, 954, 585, 472, 640, 387, 695, 538, 541, 700, - /* 230 */ 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, - /* 240 */ 222, 533, 533, 533, 533, 533, 533, 533, 533, 533, - /* 250 */ 533, 533, 533, 1179, 1179, 1179, 533, 533, 533, 565, - /* 260 */ 533, 533, 533, 916, 1144, 533, 533, 1288, 533, 533, - /* 270 */ 533, 533, 533, 533, 533, 533, 639, 1330, 209, 1076, - /* 280 */ 1076, 1076, 1076, 580, 209, 209, 1313, 768, 917, 649, - /* 290 */ 1181, 1316, 405, 1316, 1238, 249, 1181, 1181, 249, 1181, - /* 300 */ 405, 1238, 1369, 464, 1259, 1012, 1012, 1012, 1368, 1368, - /* 310 */ 1368, 1368, 184, 184, 1326, 904, 1287, 1480, 1712, 1712, - /* 320 */ 1633, 1633, 1757, 1757, 1633, 1647, 1651, 1783, 1764, 1791, - /* 330 */ 1791, 1791, 1791, 1633, 1806, 1677, 1651, 1651, 1677, 1783, - /* 340 */ 1764, 1677, 1764, 1677, 1633, 1806, 1674, 1779, 1633, 1806, - /* 350 */ 1823, 1633, 1806, 1633, 1806, 1823, 1732, 1732, 1732, 1794, - /* 360 */ 1840, 1840, 1823, 1732, 1738, 1732, 1794, 1732, 1732, 1701, - /* 370 */ 1844, 1758, 1758, 1823, 1633, 1789, 1789, 1807, 1807, 1742, - /* 380 */ 1752, 1877, 1633, 1743, 1742, 1759, 1765, 1677, 1879, 1897, - /* 390 */ 1897, 1914, 1914, 1914, 2098, 2098, 2098, 2098, 2098, 2098, - /* 400 */ 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 207, - /* 410 */ 1095, 331, 620, 903, 806, 1074, 1483, 1432, 1481, 1322, - /* 420 */ 1370, 1394, 1515, 1291, 1546, 1547, 1557, 1595, 1598, 1599, - /* 430 */ 1434, 1453, 1618, 1462, 1567, 1489, 1644, 1654, 1616, 1660, - /* 440 */ 1548, 1549, 1682, 1685, 1597, 742, 1941, 1945, 1927, 1787, - /* 450 */ 1937, 1940, 1934, 1936, 1821, 1810, 1832, 1938, 1938, 1942, - /* 460 */ 1822, 1947, 1824, 1949, 1968, 1828, 1841, 1938, 1842, 1912, - /* 470 */ 1939, 1938, 1826, 1921, 1922, 1925, 1926, 1850, 1865, 1948, - /* 480 */ 1843, 1982, 1980, 1964, 1872, 1827, 1928, 1970, 1929, 1923, - /* 490 */ 1958, 1848, 1885, 1977, 1983, 1985, 1871, 1880, 1984, 1943, - /* 500 */ 1986, 1987, 1988, 1990, 1946, 1955, 1991, 1911, 1989, 1994, - /* 510 */ 1951, 1992, 1996, 1873, 1998, 2000, 2001, 2002, 2003, 2004, - /* 520 */ 1999, 1933, 1890, 2009, 2010, 1910, 2005, 2012, 1892, 2011, - /* 530 */ 2006, 2007, 2008, 2013, 1950, 1962, 1957, 2014, 1969, 1952, - /* 540 */ 2015, 2023, 2026, 2027, 2025, 2028, 2018, 1913, 1915, 2031, - /* 550 */ 2011, 2033, 2036, 2037, 2038, 2039, 2040, 2043, 2051, 2044, - /* 560 */ 2045, 2046, 2047, 2049, 2050, 2048, 1944, 1935, 1953, 1954, - /* 570 */ 1956, 2052, 2055, 2053, 2073, 2074, + /* 0 */ 2029, 1801, 2043, 1380, 1380, 33, 391, 1496, 1569, 1642, + /* 10 */ 702, 702, 702, 193, 33, 33, 33, 33, 33, 0, + /* 20 */ 0, 216, 1177, 702, 702, 702, 702, 702, 702, 702, + /* 30 */ 702, 702, 702, 702, 702, 702, 702, 702, 406, 406, + /* 40 */ 111, 111, 218, 447, 547, 598, 598, 260, 260, 260, + /* 50 */ 260, 40, 112, 320, 340, 445, 489, 593, 637, 741, + /* 60 */ 785, 889, 909, 1023, 1043, 1157, 1177, 1177, 1177, 1177, + /* 70 */ 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, + /* 80 */ 1177, 1177, 1177, 1177, 1197, 1177, 1301, 1321, 1321, 554, + /* 90 */ 1802, 1910, 702, 702, 702, 702, 702, 702, 702, 702, + /* 100 */ 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, + /* 110 */ 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, + /* 120 */ 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, + /* 130 */ 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, + /* 140 */ 702, 702, 138, 198, 198, 198, 198, 198, 198, 198, + /* 150 */ 183, 99, 236, 292, 598, 793, 167, 598, 598, 880, + /* 160 */ 880, 598, 857, 150, 195, 195, 195, 264, 113, 113, + /* 170 */ 2207, 2207, 854, 854, 854, 751, 765, 765, 765, 765, + /* 180 */ 1096, 1096, 725, 292, 882, 904, 598, 598, 598, 598, + /* 190 */ 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, + /* 200 */ 598, 598, 598, 598, 598, 1273, 1032, 1032, 598, 147, + /* 210 */ 1098, 1098, 603, 603, 1276, 1276, 363, 2207, 2207, 2207, + /* 220 */ 2207, 2207, 2207, 2207, 469, 617, 617, 801, 336, 461, + /* 230 */ 804, 864, 615, 891, 913, 598, 598, 598, 598, 598, + /* 240 */ 598, 598, 598, 598, 598, 653, 598, 598, 598, 598, + /* 250 */ 598, 598, 598, 598, 598, 598, 598, 598, 1105, 1105, + /* 260 */ 1105, 598, 598, 598, 1194, 598, 598, 598, 1215, 1249, + /* 270 */ 598, 1353, 598, 598, 598, 598, 598, 598, 598, 598, + /* 280 */ 677, 449, 902, 1338, 1338, 1338, 1338, 1248, 902, 902, + /* 290 */ 326, 1151, 1047, 755, 749, 1371, 960, 1371, 1007, 1162, + /* 300 */ 749, 749, 1162, 749, 960, 1007, 1274, 738, 215, 1300, + /* 310 */ 1300, 1300, 1395, 1395, 1395, 1395, 1368, 1368, 1033, 1414, + /* 320 */ 1387, 1361, 1759, 1759, 1685, 1685, 1792, 1792, 1685, 1683, + /* 330 */ 1686, 1814, 1797, 1825, 1825, 1825, 1825, 1685, 1836, 1707, + /* 340 */ 1686, 1686, 1707, 1814, 1797, 1707, 1797, 1707, 1685, 1836, + /* 350 */ 1710, 1807, 1685, 1836, 1854, 1685, 1836, 1685, 1836, 1854, + /* 360 */ 1769, 1769, 1769, 1822, 1870, 1870, 1854, 1769, 1766, 1769, + /* 370 */ 1822, 1769, 1769, 1729, 1873, 1785, 1785, 1854, 1685, 1823, + /* 380 */ 1823, 1840, 1840, 1778, 1782, 1909, 1685, 1779, 1778, 1789, + /* 390 */ 1800, 1707, 1919, 1939, 1939, 1948, 1948, 1948, 2207, 2207, + /* 400 */ 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, + /* 410 */ 2207, 2207, 2207, 69, 1037, 79, 1088, 651, 1196, 1415, + /* 420 */ 1501, 1439, 1369, 1452, 911, 1211, 1524, 1469, 1551, 1567, + /* 430 */ 1570, 1624, 1640, 1644, 1499, 1440, 1572, 1464, 1597, 275, + /* 440 */ 782, 1586, 1648, 1678, 1553, 1682, 1687, 1388, 1502, 1696, + /* 450 */ 1706, 1588, 1486, 1971, 1975, 1957, 1820, 1972, 1973, 1965, + /* 460 */ 1967, 1851, 1841, 1861, 1969, 1969, 1974, 1852, 1976, 1855, + /* 470 */ 1981, 1998, 1858, 1871, 1969, 1872, 1942, 1968, 1969, 1856, + /* 480 */ 1952, 1953, 1955, 1956, 1881, 1896, 1980, 1874, 2014, 2015, + /* 490 */ 1997, 1905, 1860, 1954, 1999, 1964, 1950, 1994, 1894, 1921, + /* 500 */ 2020, 2018, 2026, 1915, 1923, 2028, 1984, 2036, 2040, 2047, + /* 510 */ 2041, 2003, 2012, 2050, 1979, 2049, 2056, 2011, 2044, 2057, + /* 520 */ 2048, 1934, 2063, 2064, 2065, 2061, 2066, 2068, 1993, 1959, + /* 530 */ 2069, 2071, 1978, 2062, 2075, 1958, 2073, 2070, 2072, 2076, + /* 540 */ 2078, 2010, 2027, 2022, 2074, 2031, 2019, 2081, 2082, 2094, + /* 550 */ 2093, 2095, 2096, 2085, 1983, 1986, 2100, 2073, 2101, 2104, + /* 560 */ 2107, 2109, 2108, 2110, 2111, 2114, 2121, 2115, 2116, 2117, + /* 570 */ 2118, 2122, 2123, 2124, 2007, 2004, 2005, 2006, 2125, 2128, + /* 580 */ 2137, 2138, 2152, }; -#define YY_REDUCE_COUNT (408) -#define YY_REDUCE_MIN (-271) -#define YY_REDUCE_MAX (1740) +#define YY_REDUCE_COUNT (412) +#define YY_REDUCE_MIN (-276) +#define YY_REDUCE_MAX (1775) static const short yy_reduce_ofst[] = { - /* 0 */ -125, 733, 789, 241, 293, -123, -193, -191, -183, -187, - /* 10 */ 166, 238, 133, -207, -199, -267, -176, -6, 204, 489, - /* 20 */ 576, -175, 598, 686, 615, 725, 860, 778, 781, 857, - /* 30 */ 616, 887, 87, 240, -192, 408, 626, 796, 843, 854, - /* 40 */ 1003, -271, -271, -271, -271, -271, -271, -271, -271, -271, - /* 50 */ -271, -271, -271, -271, -271, -271, -271, -271, -271, -271, - /* 60 */ -271, -271, -271, -271, -271, -271, -271, -271, -271, -271, - /* 70 */ -271, -271, -271, -271, -271, -271, -271, -271, 80, 83, - /* 80 */ 313, 886, 888, 996, 1034, 1059, 1081, 1100, 1117, 1152, - /* 90 */ 1155, 1163, 1165, 1167, 1169, 1172, 1180, 1182, 1184, 1198, - /* 100 */ 1200, 1213, 1215, 1225, 1227, 1252, 1254, 1264, 1299, 1303, - /* 110 */ 1308, 1312, 1325, 1328, 1337, 1340, 1343, 1371, 1373, 1384, - /* 120 */ 1386, 1411, 1420, 1424, 1426, 1458, 1470, 1473, 1475, 1479, - /* 130 */ -271, -271, -271, -271, -271, -271, -271, -271, -271, -271, - /* 140 */ -271, 138, 459, 396, -158, 470, 302, -212, 521, 201, - /* 150 */ -195, -92, 559, 630, 632, 630, -271, 632, 901, 63, - /* 160 */ 407, -271, -271, -271, -271, 161, 161, 161, 251, 335, - /* 170 */ 847, 960, 980, 537, 588, 618, 628, 688, 688, -166, - /* 180 */ -161, 674, 790, 794, 799, 851, 852, -122, 680, -120, - /* 190 */ 995, 1038, 415, 1051, 893, 798, 962, 400, 1086, 779, - /* 200 */ 923, 924, 263, 1041, 979, 990, 1083, 1097, 1031, 1194, - /* 210 */ 362, 994, 1139, 1005, 1037, 1202, 1205, 1195, 1210, -194, - /* 220 */ 56, 185, -135, 232, 522, 560, 601, 617, 669, 683, - /* 230 */ 711, 856, 908, 941, 1048, 1101, 1147, 1257, 1262, 1265, - /* 240 */ 392, 1292, 1333, 1339, 1342, 1346, 1350, 1359, 1374, 1418, - /* 250 */ 1421, 1436, 1437, 593, 755, 770, 997, 1445, 1459, 1209, - /* 260 */ 1500, 1504, 1516, 1132, 1243, 1518, 1519, 1440, 1520, 560, - /* 270 */ 1522, 1523, 1524, 1526, 1527, 1529, 1382, 1438, 1431, 1468, - /* 280 */ 1469, 1472, 1476, 1209, 1431, 1431, 1485, 1525, 1539, 1435, - /* 290 */ 1463, 1471, 1492, 1487, 1443, 1494, 1474, 1484, 1498, 1486, - /* 300 */ 1502, 1455, 1530, 1531, 1533, 1540, 1542, 1544, 1505, 1506, - /* 310 */ 1507, 1508, 1521, 1528, 1493, 1537, 1532, 1575, 1488, 1496, - /* 320 */ 1584, 1594, 1509, 1510, 1600, 1538, 1534, 1541, 1574, 1577, - /* 330 */ 1583, 1585, 1586, 1612, 1626, 1581, 1556, 1558, 1587, 1559, - /* 340 */ 1601, 1588, 1603, 1592, 1631, 1640, 1550, 1553, 1643, 1645, - /* 350 */ 1625, 1649, 1652, 1650, 1653, 1632, 1636, 1637, 1642, 1634, - /* 360 */ 1639, 1641, 1646, 1656, 1655, 1658, 1659, 1661, 1663, 1560, - /* 370 */ 1564, 1596, 1605, 1664, 1670, 1565, 1571, 1627, 1638, 1657, - /* 380 */ 1665, 1623, 1702, 1630, 1666, 1667, 1671, 1673, 1703, 1718, - /* 390 */ 1719, 1729, 1730, 1731, 1621, 1622, 1628, 1720, 1713, 1716, - /* 400 */ 1722, 1723, 1733, 1717, 1724, 1727, 1728, 1725, 1740, + /* 0 */ -66, 217, -63, -177, -180, 161, 364, 64, -183, 162, + /* 10 */ 223, 367, 414, -173, 473, 514, 525, 622, 626, -207, + /* 20 */ 351, -276, -38, 693, 811, 831, 833, 888, -188, 945, + /* 30 */ 947, 416, 558, 951, 867, 287, 1078, 1080, -186, 224, + /* 40 */ -132, 42, 964, 269, 417, 796, 810, -237, -231, -237, + /* 50 */ -231, -45, -45, -45, -45, -45, -45, -45, -45, -45, + /* 60 */ -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, + /* 70 */ -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, + /* 80 */ -45, -45, -45, -45, -45, -45, -45, -45, -45, 895, + /* 90 */ 925, 967, 980, 1100, 1143, 1169, 1203, 1225, 1228, 1242, + /* 100 */ 1247, 1250, 1253, 1255, 1261, 1267, 1272, 1275, 1283, 1286, + /* 110 */ 1288, 1292, 1333, 1335, 1347, 1349, 1352, 1354, 1360, 1366, + /* 120 */ 1381, 1391, 1406, 1408, 1413, 1416, 1418, 1422, 1425, 1427, + /* 130 */ 1463, 1465, 1472, 1478, 1480, 1491, 1498, 1500, 1517, 1519, + /* 140 */ 1528, 1536, -45, -45, -45, -45, -45, -45, -45, -45, + /* 150 */ -45, -45, -45, 312, -158, 285, -219, 9, 166, 370, + /* 160 */ 545, 707, -45, 930, 601, 963, 1067, 792, -45, -45, + /* 170 */ -45, -45, -204, -204, -204, 369, -171, -129, 632, 678, + /* 180 */ 202, 352, -270, 412, 627, 627, -9, 122, 415, 419, + /* 190 */ -56, 248, 583, 920, 6, 261, 459, 795, 1049, 813, + /* 200 */ 1062, 1082, -161, 778, 1063, 797, 870, 1003, 1128, 443, + /* 210 */ 1031, 1072, 1191, 1192, 957, 1120, 105, 1149, 523, 933, + /* 220 */ 1218, 1238, 1254, 1251, -138, 96, 117, 146, 181, 277, + /* 230 */ 280, 421, 480, 712, 830, 850, 1085, 1099, 1129, 1209, + /* 240 */ 1323, 1331, 1336, 1364, 1407, 368, 1412, 1433, 1438, 1474, + /* 250 */ 1481, 1505, 1506, 1526, 1538, 1544, 1545, 1546, 722, 764, + /* 260 */ 856, 1547, 1548, 1550, 1188, 1554, 1557, 1561, 1298, 1260, + /* 270 */ 1562, 1456, 1564, 280, 1568, 1571, 1573, 1574, 1575, 1576, + /* 280 */ 1457, 1477, 1520, 1514, 1515, 1516, 1518, 1188, 1520, 1520, + /* 290 */ 1530, 1563, 1584, 1482, 1504, 1510, 1534, 1513, 1488, 1537, + /* 300 */ 1512, 1521, 1539, 1522, 1541, 1493, 1583, 1559, 1565, 1585, + /* 310 */ 1587, 1589, 1529, 1531, 1532, 1549, 1558, 1566, 1535, 1577, + /* 320 */ 1582, 1622, 1533, 1540, 1627, 1628, 1552, 1555, 1633, 1560, + /* 330 */ 1578, 1581, 1607, 1606, 1608, 1609, 1611, 1649, 1655, 1612, + /* 340 */ 1590, 1591, 1613, 1594, 1621, 1614, 1623, 1616, 1666, 1668, + /* 350 */ 1579, 1593, 1672, 1675, 1656, 1676, 1679, 1680, 1688, 1660, + /* 360 */ 1667, 1670, 1671, 1663, 1669, 1673, 1674, 1689, 1681, 1692, + /* 370 */ 1677, 1693, 1694, 1592, 1599, 1617, 1620, 1700, 1713, 1596, + /* 380 */ 1598, 1658, 1659, 1691, 1684, 1654, 1735, 1664, 1697, 1690, + /* 390 */ 1701, 1703, 1748, 1758, 1760, 1768, 1770, 1772, 1657, 1661, + /* 400 */ 1665, 1761, 1754, 1757, 1762, 1763, 1764, 1750, 1751, 1765, + /* 410 */ 1771, 1767, 1775, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 1647, 1647, 1647, 1475, 1240, 1351, 1240, 1240, 1240, 1475, - /* 10 */ 1475, 1475, 1240, 1381, 1381, 1528, 1273, 1240, 1240, 1240, - /* 20 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1474, 1240, 1240, - /* 30 */ 1240, 1240, 1563, 1563, 1240, 1240, 1240, 1240, 1240, 1240, - /* 40 */ 1240, 1240, 1390, 1240, 1397, 1240, 1240, 1240, 1240, 1240, - /* 50 */ 1476, 1477, 1240, 1240, 1240, 1527, 1529, 1492, 1404, 1403, - /* 60 */ 1402, 1401, 1510, 1369, 1395, 1388, 1392, 1470, 1471, 1469, - /* 70 */ 1473, 1477, 1476, 1240, 1391, 1438, 1454, 1437, 1240, 1240, - /* 80 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 90 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 100 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 110 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 120 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 130 */ 1446, 1453, 1452, 1451, 1460, 1450, 1447, 1440, 1439, 1441, - /* 140 */ 1442, 1240, 1240, 1264, 1240, 1240, 1261, 1315, 1240, 1240, - /* 150 */ 1240, 1240, 1240, 1547, 1546, 1240, 1443, 1240, 1273, 1432, - /* 160 */ 1431, 1457, 1444, 1456, 1455, 1535, 1599, 1598, 1493, 1240, - /* 170 */ 1240, 1240, 1240, 1240, 1240, 1563, 1240, 1240, 1240, 1240, - /* 180 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 190 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1371, - /* 200 */ 1563, 1563, 1240, 1273, 1563, 1563, 1372, 1372, 1269, 1269, - /* 210 */ 1375, 1240, 1542, 1342, 1342, 1342, 1342, 1351, 1342, 1240, - /* 220 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 230 */ 1240, 1240, 1240, 1240, 1532, 1530, 1240, 1240, 1240, 1240, - /* 240 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 250 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 260 */ 1240, 1240, 1240, 1347, 1240, 1240, 1240, 1240, 1240, 1240, - /* 270 */ 1240, 1240, 1240, 1240, 1240, 1592, 1240, 1505, 1329, 1347, - /* 280 */ 1347, 1347, 1347, 1349, 1330, 1328, 1341, 1274, 1247, 1639, - /* 290 */ 1407, 1396, 1348, 1396, 1636, 1394, 1407, 1407, 1394, 1407, - /* 300 */ 1348, 1636, 1290, 1615, 1285, 1381, 1381, 1381, 1371, 1371, - /* 310 */ 1371, 1371, 1375, 1375, 1472, 1348, 1341, 1240, 1639, 1639, - /* 320 */ 1357, 1357, 1638, 1638, 1357, 1493, 1623, 1416, 1318, 1324, - /* 330 */ 1324, 1324, 1324, 1357, 1258, 1394, 1623, 1623, 1394, 1416, - /* 340 */ 1318, 1394, 1318, 1394, 1357, 1258, 1509, 1633, 1357, 1258, - /* 350 */ 1483, 1357, 1258, 1357, 1258, 1483, 1316, 1316, 1316, 1305, - /* 360 */ 1240, 1240, 1483, 1316, 1290, 1316, 1305, 1316, 1316, 1581, - /* 370 */ 1240, 1487, 1487, 1483, 1357, 1573, 1573, 1384, 1384, 1389, - /* 380 */ 1375, 1478, 1357, 1240, 1389, 1387, 1385, 1394, 1308, 1595, - /* 390 */ 1595, 1591, 1591, 1591, 1644, 1644, 1542, 1608, 1273, 1273, - /* 400 */ 1273, 1273, 1608, 1292, 1292, 1274, 1274, 1273, 1608, 1240, - /* 410 */ 1240, 1240, 1240, 1240, 1240, 1603, 1240, 1537, 1494, 1361, - /* 420 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 430 */ 1240, 1240, 1240, 1240, 1548, 1240, 1240, 1240, 1240, 1240, - /* 440 */ 1240, 1240, 1240, 1240, 1240, 1421, 1240, 1243, 1539, 1240, - /* 450 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1398, 1399, 1362, - /* 460 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1413, 1240, 1240, - /* 470 */ 1240, 1408, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 480 */ 1635, 1240, 1240, 1240, 1240, 1240, 1240, 1508, 1507, 1240, - /* 490 */ 1240, 1359, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 500 */ 1240, 1240, 1240, 1240, 1240, 1288, 1240, 1240, 1240, 1240, - /* 510 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 520 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1386, - /* 530 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 540 */ 1240, 1240, 1240, 1240, 1578, 1376, 1240, 1240, 1240, 1240, - /* 550 */ 1626, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, - /* 560 */ 1240, 1240, 1240, 1240, 1240, 1619, 1332, 1423, 1240, 1422, - /* 570 */ 1426, 1262, 1240, 1252, 1240, 1240, + /* 0 */ 1663, 1663, 1663, 1491, 1254, 1367, 1254, 1254, 1254, 1254, + /* 10 */ 1491, 1491, 1491, 1254, 1254, 1254, 1254, 1254, 1254, 1397, + /* 20 */ 1397, 1544, 1287, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + /* 30 */ 1254, 1254, 1254, 1254, 1254, 1490, 1254, 1254, 1254, 1254, + /* 40 */ 1578, 1578, 1254, 1254, 1254, 1254, 1254, 1563, 1562, 1254, + /* 50 */ 1254, 1254, 1406, 1254, 1413, 1254, 1254, 1254, 1254, 1254, + /* 60 */ 1492, 1493, 1254, 1254, 1254, 1254, 1543, 1545, 1508, 1420, + /* 70 */ 1419, 1418, 1417, 1526, 1385, 1411, 1404, 1408, 1487, 1488, + /* 80 */ 1486, 1641, 1493, 1492, 1254, 1407, 1455, 1471, 1454, 1254, + /* 90 */ 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + /* 100 */ 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + /* 110 */ 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + /* 120 */ 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + /* 130 */ 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + /* 140 */ 1254, 1254, 1463, 1470, 1469, 1468, 1477, 1467, 1464, 1457, + /* 150 */ 1456, 1458, 1459, 1278, 1254, 1275, 1329, 1254, 1254, 1254, + /* 160 */ 1254, 1254, 1460, 1287, 1448, 1447, 1446, 1254, 1474, 1461, + /* 170 */ 1473, 1472, 1551, 1615, 1614, 1509, 1254, 1254, 1254, 1254, + /* 180 */ 1254, 1254, 1578, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + /* 190 */ 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + /* 200 */ 1254, 1254, 1254, 1254, 1254, 1387, 1578, 1578, 1254, 1287, + /* 210 */ 1578, 1578, 1388, 1388, 1283, 1283, 1391, 1558, 1358, 1358, + /* 220 */ 1358, 1358, 1367, 1358, 1254, 1254, 1254, 1254, 1254, 1254, + /* 230 */ 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1548, + /* 240 */ 1546, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + /* 250 */ 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + /* 260 */ 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1363, 1254, + /* 270 */ 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1608, + /* 280 */ 1254, 1521, 1343, 1363, 1363, 1363, 1363, 1365, 1344, 1342, + /* 290 */ 1357, 1288, 1261, 1655, 1423, 1412, 1364, 1412, 1652, 1410, + /* 300 */ 1423, 1423, 1410, 1423, 1364, 1652, 1304, 1630, 1299, 1397, + /* 310 */ 1397, 1397, 1387, 1387, 1387, 1387, 1391, 1391, 1489, 1364, + /* 320 */ 1357, 1254, 1655, 1655, 1373, 1373, 1654, 1654, 1373, 1509, + /* 330 */ 1638, 1432, 1332, 1338, 1338, 1338, 1338, 1373, 1272, 1410, + /* 340 */ 1638, 1638, 1410, 1432, 1332, 1410, 1332, 1410, 1373, 1272, + /* 350 */ 1525, 1649, 1373, 1272, 1499, 1373, 1272, 1373, 1272, 1499, + /* 360 */ 1330, 1330, 1330, 1319, 1254, 1254, 1499, 1330, 1304, 1330, + /* 370 */ 1319, 1330, 1330, 1596, 1254, 1503, 1503, 1499, 1373, 1588, + /* 380 */ 1588, 1400, 1400, 1405, 1391, 1494, 1373, 1254, 1405, 1403, + /* 390 */ 1401, 1410, 1322, 1611, 1611, 1607, 1607, 1607, 1660, 1660, + /* 400 */ 1558, 1623, 1287, 1287, 1287, 1287, 1623, 1306, 1306, 1288, + /* 410 */ 1288, 1287, 1623, 1254, 1254, 1254, 1254, 1254, 1254, 1618, + /* 420 */ 1254, 1553, 1510, 1377, 1254, 1254, 1254, 1254, 1254, 1254, + /* 430 */ 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + /* 440 */ 1564, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + /* 450 */ 1254, 1254, 1437, 1254, 1257, 1555, 1254, 1254, 1254, 1254, + /* 460 */ 1254, 1254, 1254, 1254, 1414, 1415, 1378, 1254, 1254, 1254, + /* 470 */ 1254, 1254, 1254, 1254, 1429, 1254, 1254, 1254, 1424, 1254, + /* 480 */ 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1651, 1254, 1254, + /* 490 */ 1254, 1254, 1254, 1254, 1524, 1523, 1254, 1254, 1375, 1254, + /* 500 */ 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + /* 510 */ 1254, 1254, 1302, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + /* 520 */ 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + /* 530 */ 1254, 1254, 1254, 1254, 1254, 1254, 1402, 1254, 1254, 1254, + /* 540 */ 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + /* 550 */ 1254, 1593, 1392, 1254, 1254, 1254, 1254, 1642, 1254, 1254, + /* 560 */ 1254, 1254, 1352, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + /* 570 */ 1254, 1254, 1254, 1634, 1346, 1438, 1254, 1441, 1276, 1254, + /* 580 */ 1266, 1254, 1254, }; /********** End of lemon-generated parsing tables *****************************/ @@ -168032,52 +175074,53 @@ static const YYACTIONTYPE yy_default[] = { static const YYCODETYPE yyFallback[] = { 0, /* $ => nothing */ 0, /* SEMI => nothing */ - 59, /* EXPLAIN => ID */ - 59, /* QUERY => ID */ - 59, /* PLAN => ID */ - 59, /* BEGIN => ID */ + 60, /* EXPLAIN => ID */ + 60, /* QUERY => ID */ + 60, /* PLAN => ID */ + 60, /* BEGIN => ID */ 0, /* TRANSACTION => nothing */ - 59, /* DEFERRED => ID */ - 59, /* IMMEDIATE => ID */ - 59, /* EXCLUSIVE => ID */ + 60, /* DEFERRED => ID */ + 60, /* IMMEDIATE => ID */ + 60, /* EXCLUSIVE => ID */ 0, /* COMMIT => nothing */ - 59, /* END => ID */ - 59, /* ROLLBACK => ID */ - 59, /* SAVEPOINT => ID */ - 59, /* RELEASE => ID */ + 60, /* END => ID */ + 60, /* ROLLBACK => ID */ + 60, /* SAVEPOINT => ID */ + 60, /* RELEASE => ID */ 0, /* TO => nothing */ 0, /* TABLE => nothing */ 0, /* CREATE => nothing */ - 59, /* IF => ID */ + 60, /* IF => ID */ 0, /* NOT => nothing */ 0, /* EXISTS => nothing */ - 59, /* TEMP => ID */ + 60, /* TEMP => ID */ 0, /* LP => nothing */ 0, /* RP => nothing */ 0, /* AS => nothing */ 0, /* COMMA => nothing */ - 59, /* WITHOUT => ID */ - 59, /* ABORT => ID */ - 59, /* ACTION => ID */ - 59, /* AFTER => ID */ - 59, /* ANALYZE => ID */ - 59, /* ASC => ID */ - 59, /* ATTACH => ID */ - 59, /* BEFORE => ID */ - 59, /* BY => ID */ - 59, /* CASCADE => ID */ - 59, /* CAST => ID */ - 59, /* CONFLICT => ID */ - 59, /* DATABASE => ID */ - 59, /* DESC => ID */ - 59, /* DETACH => ID */ - 59, /* EACH => ID */ - 59, /* FAIL => ID */ + 60, /* WITHOUT => ID */ + 60, /* ABORT => ID */ + 60, /* ACTION => ID */ + 60, /* AFTER => ID */ + 60, /* ANALYZE => ID */ + 60, /* ASC => ID */ + 60, /* ATTACH => ID */ + 60, /* BEFORE => ID */ + 60, /* BY => ID */ + 60, /* CASCADE => ID */ + 60, /* CAST => ID */ + 60, /* CONFLICT => ID */ + 60, /* DATABASE => ID */ + 60, /* DESC => ID */ + 60, /* DETACH => ID */ + 60, /* EACH => ID */ + 60, /* FAIL => ID */ 0, /* OR => nothing */ 0, /* AND => nothing */ 0, /* IS => nothing */ - 59, /* MATCH => ID */ - 59, /* LIKE_KW => ID */ + 0, /* ISNOT => nothing */ + 60, /* MATCH => ID */ + 60, /* LIKE_KW => ID */ 0, /* BETWEEN => nothing */ 0, /* IN => nothing */ 0, /* ISNULL => nothing */ @@ -168090,47 +175133,47 @@ static const YYCODETYPE yyFallback[] = { 0, /* GE => nothing */ 0, /* ESCAPE => nothing */ 0, /* ID => nothing */ - 59, /* COLUMNKW => ID */ - 59, /* DO => ID */ - 59, /* FOR => ID */ - 59, /* IGNORE => ID */ - 59, /* INITIALLY => ID */ - 59, /* INSTEAD => ID */ - 59, /* NO => ID */ - 59, /* KEY => ID */ - 59, /* OF => ID */ - 59, /* OFFSET => ID */ - 59, /* PRAGMA => ID */ - 59, /* RAISE => ID */ - 59, /* RECURSIVE => ID */ - 59, /* REPLACE => ID */ - 59, /* RESTRICT => ID */ - 59, /* ROW => ID */ - 59, /* ROWS => ID */ - 59, /* TRIGGER => ID */ - 59, /* VACUUM => ID */ - 59, /* VIEW => ID */ - 59, /* VIRTUAL => ID */ - 59, /* WITH => ID */ - 59, /* NULLS => ID */ - 59, /* FIRST => ID */ - 59, /* LAST => ID */ - 59, /* CURRENT => ID */ - 59, /* FOLLOWING => ID */ - 59, /* PARTITION => ID */ - 59, /* PRECEDING => ID */ - 59, /* RANGE => ID */ - 59, /* UNBOUNDED => ID */ - 59, /* EXCLUDE => ID */ - 59, /* GROUPS => ID */ - 59, /* OTHERS => ID */ - 59, /* TIES => ID */ - 59, /* GENERATED => ID */ - 59, /* ALWAYS => ID */ - 59, /* MATERIALIZED => ID */ - 59, /* REINDEX => ID */ - 59, /* RENAME => ID */ - 59, /* CTIME_KW => ID */ + 60, /* COLUMNKW => ID */ + 60, /* DO => ID */ + 60, /* FOR => ID */ + 60, /* IGNORE => ID */ + 60, /* INITIALLY => ID */ + 60, /* INSTEAD => ID */ + 60, /* NO => ID */ + 60, /* KEY => ID */ + 60, /* OF => ID */ + 60, /* OFFSET => ID */ + 60, /* PRAGMA => ID */ + 60, /* RAISE => ID */ + 60, /* RECURSIVE => ID */ + 60, /* REPLACE => ID */ + 60, /* RESTRICT => ID */ + 60, /* ROW => ID */ + 60, /* ROWS => ID */ + 60, /* TRIGGER => ID */ + 60, /* VACUUM => ID */ + 60, /* VIEW => ID */ + 60, /* VIRTUAL => ID */ + 60, /* WITH => ID */ + 60, /* NULLS => ID */ + 60, /* FIRST => ID */ + 60, /* LAST => ID */ + 60, /* CURRENT => ID */ + 60, /* FOLLOWING => ID */ + 60, /* PARTITION => ID */ + 60, /* PRECEDING => ID */ + 60, /* RANGE => ID */ + 60, /* UNBOUNDED => ID */ + 60, /* EXCLUDE => ID */ + 60, /* GROUPS => ID */ + 60, /* OTHERS => ID */ + 60, /* TIES => ID */ + 60, /* GENERATED => ID */ + 60, /* ALWAYS => ID */ + 60, /* MATERIALIZED => ID */ + 60, /* REINDEX => ID */ + 60, /* RENAME => ID */ + 60, /* CTIME_KW => ID */ 0, /* ANY => nothing */ 0, /* BITAND => nothing */ 0, /* BITOR => nothing */ @@ -168201,10 +175244,9 @@ static const YYCODETYPE yyFallback[] = { 0, /* AGG_FUNCTION => nothing */ 0, /* AGG_COLUMN => nothing */ 0, /* TRUEFALSE => nothing */ - 0, /* ISNOT => nothing */ 0, /* FUNCTION => nothing */ - 0, /* UMINUS => nothing */ 0, /* UPLUS => nothing */ + 0, /* UMINUS => nothing */ 0, /* TRUTH => nothing */ 0, /* REGISTER => nothing */ 0, /* VECTOR => nothing */ @@ -168213,6 +175255,7 @@ static const YYCODETYPE yyFallback[] = { 0, /* ASTERISK => nothing */ 0, /* SPAN => nothing */ 0, /* ERROR => nothing */ + 0, /* QNUMBER => nothing */ 0, /* SPACE => nothing */ 0, /* ILLEGAL => nothing */ }; @@ -168255,14 +175298,9 @@ struct yyParser { #endif sqlite3ParserARG_SDECL /* A place to hold %extra_argument */ sqlite3ParserCTX_SDECL /* A place to hold %extra_context */ -#if YYSTACKDEPTH<=0 - int yystksz; /* Current side of the stack */ - yyStackEntry *yystack; /* The parser's stack */ - yyStackEntry yystk0; /* First stack entry */ -#else - yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */ - yyStackEntry *yystackEnd; /* Last entry in the stack */ -#endif + yyStackEntry *yystackEnd; /* Last entry in the stack */ + yyStackEntry *yystack; /* The parser stack */ + yyStackEntry yystk0[YYSTACKDEPTH]; /* Initial stack space */ }; typedef struct yyParser yyParser; @@ -168349,135 +175387,135 @@ static const char *const yyTokenName[] = { /* 43 */ "OR", /* 44 */ "AND", /* 45 */ "IS", - /* 46 */ "MATCH", - /* 47 */ "LIKE_KW", - /* 48 */ "BETWEEN", - /* 49 */ "IN", - /* 50 */ "ISNULL", - /* 51 */ "NOTNULL", - /* 52 */ "NE", - /* 53 */ "EQ", - /* 54 */ "GT", - /* 55 */ "LE", - /* 56 */ "LT", - /* 57 */ "GE", - /* 58 */ "ESCAPE", - /* 59 */ "ID", - /* 60 */ "COLUMNKW", - /* 61 */ "DO", - /* 62 */ "FOR", - /* 63 */ "IGNORE", - /* 64 */ "INITIALLY", - /* 65 */ "INSTEAD", - /* 66 */ "NO", - /* 67 */ "KEY", - /* 68 */ "OF", - /* 69 */ "OFFSET", - /* 70 */ "PRAGMA", - /* 71 */ "RAISE", - /* 72 */ "RECURSIVE", - /* 73 */ "REPLACE", - /* 74 */ "RESTRICT", - /* 75 */ "ROW", - /* 76 */ "ROWS", - /* 77 */ "TRIGGER", - /* 78 */ "VACUUM", - /* 79 */ "VIEW", - /* 80 */ "VIRTUAL", - /* 81 */ "WITH", - /* 82 */ "NULLS", - /* 83 */ "FIRST", - /* 84 */ "LAST", - /* 85 */ "CURRENT", - /* 86 */ "FOLLOWING", - /* 87 */ "PARTITION", - /* 88 */ "PRECEDING", - /* 89 */ "RANGE", - /* 90 */ "UNBOUNDED", - /* 91 */ "EXCLUDE", - /* 92 */ "GROUPS", - /* 93 */ "OTHERS", - /* 94 */ "TIES", - /* 95 */ "GENERATED", - /* 96 */ "ALWAYS", - /* 97 */ "MATERIALIZED", - /* 98 */ "REINDEX", - /* 99 */ "RENAME", - /* 100 */ "CTIME_KW", - /* 101 */ "ANY", - /* 102 */ "BITAND", - /* 103 */ "BITOR", - /* 104 */ "LSHIFT", - /* 105 */ "RSHIFT", - /* 106 */ "PLUS", - /* 107 */ "MINUS", - /* 108 */ "STAR", - /* 109 */ "SLASH", - /* 110 */ "REM", - /* 111 */ "CONCAT", - /* 112 */ "PTR", - /* 113 */ "COLLATE", - /* 114 */ "BITNOT", - /* 115 */ "ON", - /* 116 */ "INDEXED", - /* 117 */ "STRING", - /* 118 */ "JOIN_KW", - /* 119 */ "CONSTRAINT", - /* 120 */ "DEFAULT", - /* 121 */ "NULL", - /* 122 */ "PRIMARY", - /* 123 */ "UNIQUE", - /* 124 */ "CHECK", - /* 125 */ "REFERENCES", - /* 126 */ "AUTOINCR", - /* 127 */ "INSERT", - /* 128 */ "DELETE", - /* 129 */ "UPDATE", - /* 130 */ "SET", - /* 131 */ "DEFERRABLE", - /* 132 */ "FOREIGN", - /* 133 */ "DROP", - /* 134 */ "UNION", - /* 135 */ "ALL", - /* 136 */ "EXCEPT", - /* 137 */ "INTERSECT", - /* 138 */ "SELECT", - /* 139 */ "VALUES", - /* 140 */ "DISTINCT", - /* 141 */ "DOT", - /* 142 */ "FROM", - /* 143 */ "JOIN", - /* 144 */ "USING", - /* 145 */ "ORDER", - /* 146 */ "GROUP", - /* 147 */ "HAVING", - /* 148 */ "LIMIT", - /* 149 */ "WHERE", - /* 150 */ "RETURNING", - /* 151 */ "INTO", - /* 152 */ "NOTHING", - /* 153 */ "FLOAT", - /* 154 */ "BLOB", - /* 155 */ "INTEGER", - /* 156 */ "VARIABLE", - /* 157 */ "CASE", - /* 158 */ "WHEN", - /* 159 */ "THEN", - /* 160 */ "ELSE", - /* 161 */ "INDEX", - /* 162 */ "ALTER", - /* 163 */ "ADD", - /* 164 */ "WINDOW", - /* 165 */ "OVER", - /* 166 */ "FILTER", - /* 167 */ "COLUMN", - /* 168 */ "AGG_FUNCTION", - /* 169 */ "AGG_COLUMN", - /* 170 */ "TRUEFALSE", - /* 171 */ "ISNOT", + /* 46 */ "ISNOT", + /* 47 */ "MATCH", + /* 48 */ "LIKE_KW", + /* 49 */ "BETWEEN", + /* 50 */ "IN", + /* 51 */ "ISNULL", + /* 52 */ "NOTNULL", + /* 53 */ "NE", + /* 54 */ "EQ", + /* 55 */ "GT", + /* 56 */ "LE", + /* 57 */ "LT", + /* 58 */ "GE", + /* 59 */ "ESCAPE", + /* 60 */ "ID", + /* 61 */ "COLUMNKW", + /* 62 */ "DO", + /* 63 */ "FOR", + /* 64 */ "IGNORE", + /* 65 */ "INITIALLY", + /* 66 */ "INSTEAD", + /* 67 */ "NO", + /* 68 */ "KEY", + /* 69 */ "OF", + /* 70 */ "OFFSET", + /* 71 */ "PRAGMA", + /* 72 */ "RAISE", + /* 73 */ "RECURSIVE", + /* 74 */ "REPLACE", + /* 75 */ "RESTRICT", + /* 76 */ "ROW", + /* 77 */ "ROWS", + /* 78 */ "TRIGGER", + /* 79 */ "VACUUM", + /* 80 */ "VIEW", + /* 81 */ "VIRTUAL", + /* 82 */ "WITH", + /* 83 */ "NULLS", + /* 84 */ "FIRST", + /* 85 */ "LAST", + /* 86 */ "CURRENT", + /* 87 */ "FOLLOWING", + /* 88 */ "PARTITION", + /* 89 */ "PRECEDING", + /* 90 */ "RANGE", + /* 91 */ "UNBOUNDED", + /* 92 */ "EXCLUDE", + /* 93 */ "GROUPS", + /* 94 */ "OTHERS", + /* 95 */ "TIES", + /* 96 */ "GENERATED", + /* 97 */ "ALWAYS", + /* 98 */ "MATERIALIZED", + /* 99 */ "REINDEX", + /* 100 */ "RENAME", + /* 101 */ "CTIME_KW", + /* 102 */ "ANY", + /* 103 */ "BITAND", + /* 104 */ "BITOR", + /* 105 */ "LSHIFT", + /* 106 */ "RSHIFT", + /* 107 */ "PLUS", + /* 108 */ "MINUS", + /* 109 */ "STAR", + /* 110 */ "SLASH", + /* 111 */ "REM", + /* 112 */ "CONCAT", + /* 113 */ "PTR", + /* 114 */ "COLLATE", + /* 115 */ "BITNOT", + /* 116 */ "ON", + /* 117 */ "INDEXED", + /* 118 */ "STRING", + /* 119 */ "JOIN_KW", + /* 120 */ "CONSTRAINT", + /* 121 */ "DEFAULT", + /* 122 */ "NULL", + /* 123 */ "PRIMARY", + /* 124 */ "UNIQUE", + /* 125 */ "CHECK", + /* 126 */ "REFERENCES", + /* 127 */ "AUTOINCR", + /* 128 */ "INSERT", + /* 129 */ "DELETE", + /* 130 */ "UPDATE", + /* 131 */ "SET", + /* 132 */ "DEFERRABLE", + /* 133 */ "FOREIGN", + /* 134 */ "DROP", + /* 135 */ "UNION", + /* 136 */ "ALL", + /* 137 */ "EXCEPT", + /* 138 */ "INTERSECT", + /* 139 */ "SELECT", + /* 140 */ "VALUES", + /* 141 */ "DISTINCT", + /* 142 */ "DOT", + /* 143 */ "FROM", + /* 144 */ "JOIN", + /* 145 */ "USING", + /* 146 */ "ORDER", + /* 147 */ "GROUP", + /* 148 */ "HAVING", + /* 149 */ "LIMIT", + /* 150 */ "WHERE", + /* 151 */ "RETURNING", + /* 152 */ "INTO", + /* 153 */ "NOTHING", + /* 154 */ "FLOAT", + /* 155 */ "BLOB", + /* 156 */ "INTEGER", + /* 157 */ "VARIABLE", + /* 158 */ "CASE", + /* 159 */ "WHEN", + /* 160 */ "THEN", + /* 161 */ "ELSE", + /* 162 */ "INDEX", + /* 163 */ "ALTER", + /* 164 */ "ADD", + /* 165 */ "WINDOW", + /* 166 */ "OVER", + /* 167 */ "FILTER", + /* 168 */ "COLUMN", + /* 169 */ "AGG_FUNCTION", + /* 170 */ "AGG_COLUMN", + /* 171 */ "TRUEFALSE", /* 172 */ "FUNCTION", - /* 173 */ "UMINUS", - /* 174 */ "UPLUS", + /* 173 */ "UPLUS", + /* 174 */ "UMINUS", /* 175 */ "TRUTH", /* 176 */ "REGISTER", /* 177 */ "VECTOR", @@ -168486,142 +175524,145 @@ static const char *const yyTokenName[] = { /* 180 */ "ASTERISK", /* 181 */ "SPAN", /* 182 */ "ERROR", - /* 183 */ "SPACE", - /* 184 */ "ILLEGAL", - /* 185 */ "input", - /* 186 */ "cmdlist", - /* 187 */ "ecmd", - /* 188 */ "cmdx", - /* 189 */ "explain", - /* 190 */ "cmd", - /* 191 */ "transtype", - /* 192 */ "trans_opt", - /* 193 */ "nm", - /* 194 */ "savepoint_opt", - /* 195 */ "create_table", - /* 196 */ "create_table_args", - /* 197 */ "createkw", - /* 198 */ "temp", - /* 199 */ "ifnotexists", - /* 200 */ "dbnm", - /* 201 */ "columnlist", - /* 202 */ "conslist_opt", - /* 203 */ "table_option_set", - /* 204 */ "select", - /* 205 */ "table_option", - /* 206 */ "columnname", - /* 207 */ "carglist", - /* 208 */ "typetoken", - /* 209 */ "typename", - /* 210 */ "signed", - /* 211 */ "plus_num", - /* 212 */ "minus_num", - /* 213 */ "scanpt", - /* 214 */ "scantok", - /* 215 */ "ccons", - /* 216 */ "term", - /* 217 */ "expr", - /* 218 */ "onconf", - /* 219 */ "sortorder", - /* 220 */ "autoinc", - /* 221 */ "eidlist_opt", - /* 222 */ "refargs", - /* 223 */ "defer_subclause", - /* 224 */ "generated", - /* 225 */ "refarg", - /* 226 */ "refact", - /* 227 */ "init_deferred_pred_opt", - /* 228 */ "conslist", - /* 229 */ "tconscomma", - /* 230 */ "tcons", - /* 231 */ "sortlist", - /* 232 */ "eidlist", - /* 233 */ "defer_subclause_opt", - /* 234 */ "orconf", - /* 235 */ "resolvetype", - /* 236 */ "raisetype", - /* 237 */ "ifexists", - /* 238 */ "fullname", - /* 239 */ "selectnowith", - /* 240 */ "oneselect", - /* 241 */ "wqlist", - /* 242 */ "multiselect_op", - /* 243 */ "distinct", - /* 244 */ "selcollist", - /* 245 */ "from", - /* 246 */ "where_opt", - /* 247 */ "groupby_opt", - /* 248 */ "having_opt", - /* 249 */ "orderby_opt", - /* 250 */ "limit_opt", - /* 251 */ "window_clause", - /* 252 */ "values", - /* 253 */ "nexprlist", - /* 254 */ "sclp", - /* 255 */ "as", - /* 256 */ "seltablist", - /* 257 */ "stl_prefix", - /* 258 */ "joinop", - /* 259 */ "on_using", - /* 260 */ "indexed_by", - /* 261 */ "exprlist", - /* 262 */ "xfullname", - /* 263 */ "idlist", - /* 264 */ "indexed_opt", - /* 265 */ "nulls", - /* 266 */ "with", - /* 267 */ "where_opt_ret", - /* 268 */ "setlist", - /* 269 */ "insert_cmd", - /* 270 */ "idlist_opt", - /* 271 */ "upsert", - /* 272 */ "returning", - /* 273 */ "filter_over", - /* 274 */ "likeop", - /* 275 */ "between_op", - /* 276 */ "in_op", - /* 277 */ "paren_exprlist", - /* 278 */ "case_operand", - /* 279 */ "case_exprlist", - /* 280 */ "case_else", - /* 281 */ "uniqueflag", - /* 282 */ "collate", - /* 283 */ "vinto", - /* 284 */ "nmnum", - /* 285 */ "trigger_decl", - /* 286 */ "trigger_cmd_list", - /* 287 */ "trigger_time", - /* 288 */ "trigger_event", - /* 289 */ "foreach_clause", - /* 290 */ "when_clause", - /* 291 */ "trigger_cmd", - /* 292 */ "trnm", - /* 293 */ "tridxby", - /* 294 */ "database_kw_opt", - /* 295 */ "key_opt", - /* 296 */ "add_column_fullname", - /* 297 */ "kwcolumn_opt", - /* 298 */ "create_vtab", - /* 299 */ "vtabarglist", - /* 300 */ "vtabarg", - /* 301 */ "vtabargtoken", - /* 302 */ "lp", - /* 303 */ "anylist", - /* 304 */ "wqitem", - /* 305 */ "wqas", - /* 306 */ "windowdefn_list", - /* 307 */ "windowdefn", - /* 308 */ "window", - /* 309 */ "frame_opt", - /* 310 */ "part_opt", - /* 311 */ "filter_clause", - /* 312 */ "over_clause", - /* 313 */ "range_or_rows", - /* 314 */ "frame_bound", - /* 315 */ "frame_bound_s", - /* 316 */ "frame_bound_e", - /* 317 */ "frame_exclude_opt", - /* 318 */ "frame_exclude", + /* 183 */ "QNUMBER", + /* 184 */ "SPACE", + /* 185 */ "ILLEGAL", + /* 186 */ "input", + /* 187 */ "cmdlist", + /* 188 */ "ecmd", + /* 189 */ "cmdx", + /* 190 */ "explain", + /* 191 */ "cmd", + /* 192 */ "transtype", + /* 193 */ "trans_opt", + /* 194 */ "nm", + /* 195 */ "savepoint_opt", + /* 196 */ "create_table", + /* 197 */ "create_table_args", + /* 198 */ "createkw", + /* 199 */ "temp", + /* 200 */ "ifnotexists", + /* 201 */ "dbnm", + /* 202 */ "columnlist", + /* 203 */ "conslist_opt", + /* 204 */ "table_option_set", + /* 205 */ "select", + /* 206 */ "table_option", + /* 207 */ "columnname", + /* 208 */ "carglist", + /* 209 */ "typetoken", + /* 210 */ "typename", + /* 211 */ "signed", + /* 212 */ "plus_num", + /* 213 */ "minus_num", + /* 214 */ "scanpt", + /* 215 */ "scantok", + /* 216 */ "ccons", + /* 217 */ "term", + /* 218 */ "expr", + /* 219 */ "onconf", + /* 220 */ "sortorder", + /* 221 */ "autoinc", + /* 222 */ "eidlist_opt", + /* 223 */ "refargs", + /* 224 */ "defer_subclause", + /* 225 */ "generated", + /* 226 */ "refarg", + /* 227 */ "refact", + /* 228 */ "init_deferred_pred_opt", + /* 229 */ "conslist", + /* 230 */ "tconscomma", + /* 231 */ "tcons", + /* 232 */ "sortlist", + /* 233 */ "eidlist", + /* 234 */ "defer_subclause_opt", + /* 235 */ "orconf", + /* 236 */ "resolvetype", + /* 237 */ "raisetype", + /* 238 */ "ifexists", + /* 239 */ "fullname", + /* 240 */ "selectnowith", + /* 241 */ "oneselect", + /* 242 */ "wqlist", + /* 243 */ "multiselect_op", + /* 244 */ "distinct", + /* 245 */ "selcollist", + /* 246 */ "from", + /* 247 */ "where_opt", + /* 248 */ "groupby_opt", + /* 249 */ "having_opt", + /* 250 */ "orderby_opt", + /* 251 */ "limit_opt", + /* 252 */ "window_clause", + /* 253 */ "values", + /* 254 */ "nexprlist", + /* 255 */ "mvalues", + /* 256 */ "sclp", + /* 257 */ "as", + /* 258 */ "seltablist", + /* 259 */ "stl_prefix", + /* 260 */ "joinop", + /* 261 */ "on_using", + /* 262 */ "indexed_by", + /* 263 */ "exprlist", + /* 264 */ "xfullname", + /* 265 */ "idlist", + /* 266 */ "indexed_opt", + /* 267 */ "nulls", + /* 268 */ "with", + /* 269 */ "where_opt_ret", + /* 270 */ "setlist", + /* 271 */ "insert_cmd", + /* 272 */ "idlist_opt", + /* 273 */ "upsert", + /* 274 */ "returning", + /* 275 */ "filter_over", + /* 276 */ "likeop", + /* 277 */ "between_op", + /* 278 */ "in_op", + /* 279 */ "paren_exprlist", + /* 280 */ "case_operand", + /* 281 */ "case_exprlist", + /* 282 */ "case_else", + /* 283 */ "uniqueflag", + /* 284 */ "collate", + /* 285 */ "vinto", + /* 286 */ "nmnum", + /* 287 */ "trigger_decl", + /* 288 */ "trigger_cmd_list", + /* 289 */ "trigger_time", + /* 290 */ "trigger_event", + /* 291 */ "foreach_clause", + /* 292 */ "when_clause", + /* 293 */ "trigger_cmd", + /* 294 */ "trnm", + /* 295 */ "tridxby", + /* 296 */ "database_kw_opt", + /* 297 */ "key_opt", + /* 298 */ "add_column_fullname", + /* 299 */ "kwcolumn_opt", + /* 300 */ "create_vtab", + /* 301 */ "vtabarglist", + /* 302 */ "vtabarg", + /* 303 */ "vtabargtoken", + /* 304 */ "lp", + /* 305 */ "anylist", + /* 306 */ "wqitem", + /* 307 */ "wqas", + /* 308 */ "withnm", + /* 309 */ "windowdefn_list", + /* 310 */ "windowdefn", + /* 311 */ "window", + /* 312 */ "frame_opt", + /* 313 */ "part_opt", + /* 314 */ "filter_clause", + /* 315 */ "over_clause", + /* 316 */ "range_or_rows", + /* 317 */ "frame_bound", + /* 318 */ "frame_bound_s", + /* 319 */ "frame_bound_e", + /* 320 */ "frame_exclude_opt", + /* 321 */ "frame_exclude", }; #endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ @@ -168724,351 +175765,363 @@ static const char *const yyRuleName[] = { /* 92 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt", /* 93 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt", /* 94 */ "values ::= VALUES LP nexprlist RP", - /* 95 */ "values ::= values COMMA LP nexprlist RP", - /* 96 */ "distinct ::= DISTINCT", - /* 97 */ "distinct ::= ALL", - /* 98 */ "distinct ::=", - /* 99 */ "sclp ::=", - /* 100 */ "selcollist ::= sclp scanpt expr scanpt as", - /* 101 */ "selcollist ::= sclp scanpt STAR", - /* 102 */ "selcollist ::= sclp scanpt nm DOT STAR", - /* 103 */ "as ::= AS nm", - /* 104 */ "as ::=", - /* 105 */ "from ::=", - /* 106 */ "from ::= FROM seltablist", - /* 107 */ "stl_prefix ::= seltablist joinop", - /* 108 */ "stl_prefix ::=", - /* 109 */ "seltablist ::= stl_prefix nm dbnm as on_using", - /* 110 */ "seltablist ::= stl_prefix nm dbnm as indexed_by on_using", - /* 111 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using", - /* 112 */ "seltablist ::= stl_prefix LP select RP as on_using", - /* 113 */ "seltablist ::= stl_prefix LP seltablist RP as on_using", - /* 114 */ "dbnm ::=", - /* 115 */ "dbnm ::= DOT nm", - /* 116 */ "fullname ::= nm", - /* 117 */ "fullname ::= nm DOT nm", - /* 118 */ "xfullname ::= nm", - /* 119 */ "xfullname ::= nm DOT nm", - /* 120 */ "xfullname ::= nm DOT nm AS nm", - /* 121 */ "xfullname ::= nm AS nm", - /* 122 */ "joinop ::= COMMA|JOIN", - /* 123 */ "joinop ::= JOIN_KW JOIN", - /* 124 */ "joinop ::= JOIN_KW nm JOIN", - /* 125 */ "joinop ::= JOIN_KW nm nm JOIN", - /* 126 */ "on_using ::= ON expr", - /* 127 */ "on_using ::= USING LP idlist RP", - /* 128 */ "on_using ::=", - /* 129 */ "indexed_opt ::=", - /* 130 */ "indexed_by ::= INDEXED BY nm", - /* 131 */ "indexed_by ::= NOT INDEXED", - /* 132 */ "orderby_opt ::=", - /* 133 */ "orderby_opt ::= ORDER BY sortlist", - /* 134 */ "sortlist ::= sortlist COMMA expr sortorder nulls", - /* 135 */ "sortlist ::= expr sortorder nulls", - /* 136 */ "sortorder ::= ASC", - /* 137 */ "sortorder ::= DESC", - /* 138 */ "sortorder ::=", - /* 139 */ "nulls ::= NULLS FIRST", - /* 140 */ "nulls ::= NULLS LAST", - /* 141 */ "nulls ::=", - /* 142 */ "groupby_opt ::=", - /* 143 */ "groupby_opt ::= GROUP BY nexprlist", - /* 144 */ "having_opt ::=", - /* 145 */ "having_opt ::= HAVING expr", - /* 146 */ "limit_opt ::=", - /* 147 */ "limit_opt ::= LIMIT expr", - /* 148 */ "limit_opt ::= LIMIT expr OFFSET expr", - /* 149 */ "limit_opt ::= LIMIT expr COMMA expr", - /* 150 */ "cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret", - /* 151 */ "where_opt ::=", - /* 152 */ "where_opt ::= WHERE expr", - /* 153 */ "where_opt_ret ::=", - /* 154 */ "where_opt_ret ::= WHERE expr", - /* 155 */ "where_opt_ret ::= RETURNING selcollist", - /* 156 */ "where_opt_ret ::= WHERE expr RETURNING selcollist", - /* 157 */ "cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret", - /* 158 */ "setlist ::= setlist COMMA nm EQ expr", - /* 159 */ "setlist ::= setlist COMMA LP idlist RP EQ expr", - /* 160 */ "setlist ::= nm EQ expr", - /* 161 */ "setlist ::= LP idlist RP EQ expr", - /* 162 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert", - /* 163 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning", - /* 164 */ "upsert ::=", - /* 165 */ "upsert ::= RETURNING selcollist", - /* 166 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert", - /* 167 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert", - /* 168 */ "upsert ::= ON CONFLICT DO NOTHING returning", - /* 169 */ "upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning", - /* 170 */ "returning ::= RETURNING selcollist", - /* 171 */ "insert_cmd ::= INSERT orconf", - /* 172 */ "insert_cmd ::= REPLACE", - /* 173 */ "idlist_opt ::=", - /* 174 */ "idlist_opt ::= LP idlist RP", - /* 175 */ "idlist ::= idlist COMMA nm", - /* 176 */ "idlist ::= nm", - /* 177 */ "expr ::= LP expr RP", - /* 178 */ "expr ::= ID|INDEXED", - /* 179 */ "expr ::= JOIN_KW", - /* 180 */ "expr ::= nm DOT nm", - /* 181 */ "expr ::= nm DOT nm DOT nm", - /* 182 */ "term ::= NULL|FLOAT|BLOB", - /* 183 */ "term ::= STRING", - /* 184 */ "term ::= INTEGER", - /* 185 */ "expr ::= VARIABLE", - /* 186 */ "expr ::= expr COLLATE ID|STRING", - /* 187 */ "expr ::= CAST LP expr AS typetoken RP", - /* 188 */ "expr ::= ID|INDEXED LP distinct exprlist RP", - /* 189 */ "expr ::= ID|INDEXED LP STAR RP", - /* 190 */ "expr ::= ID|INDEXED LP distinct exprlist RP filter_over", - /* 191 */ "expr ::= ID|INDEXED LP STAR RP filter_over", - /* 192 */ "term ::= CTIME_KW", - /* 193 */ "expr ::= LP nexprlist COMMA expr RP", - /* 194 */ "expr ::= expr AND expr", - /* 195 */ "expr ::= expr OR expr", - /* 196 */ "expr ::= expr LT|GT|GE|LE expr", - /* 197 */ "expr ::= expr EQ|NE expr", - /* 198 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr", - /* 199 */ "expr ::= expr PLUS|MINUS expr", - /* 200 */ "expr ::= expr STAR|SLASH|REM expr", - /* 201 */ "expr ::= expr CONCAT expr", - /* 202 */ "likeop ::= NOT LIKE_KW|MATCH", - /* 203 */ "expr ::= expr likeop expr", - /* 204 */ "expr ::= expr likeop expr ESCAPE expr", - /* 205 */ "expr ::= expr ISNULL|NOTNULL", - /* 206 */ "expr ::= expr NOT NULL", - /* 207 */ "expr ::= expr IS expr", - /* 208 */ "expr ::= expr IS NOT expr", - /* 209 */ "expr ::= expr IS NOT DISTINCT FROM expr", - /* 210 */ "expr ::= expr IS DISTINCT FROM expr", - /* 211 */ "expr ::= NOT expr", - /* 212 */ "expr ::= BITNOT expr", - /* 213 */ "expr ::= PLUS|MINUS expr", - /* 214 */ "expr ::= expr PTR expr", - /* 215 */ "between_op ::= BETWEEN", - /* 216 */ "between_op ::= NOT BETWEEN", - /* 217 */ "expr ::= expr between_op expr AND expr", - /* 218 */ "in_op ::= IN", - /* 219 */ "in_op ::= NOT IN", - /* 220 */ "expr ::= expr in_op LP exprlist RP", - /* 221 */ "expr ::= LP select RP", - /* 222 */ "expr ::= expr in_op LP select RP", - /* 223 */ "expr ::= expr in_op nm dbnm paren_exprlist", - /* 224 */ "expr ::= EXISTS LP select RP", - /* 225 */ "expr ::= CASE case_operand case_exprlist case_else END", - /* 226 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", - /* 227 */ "case_exprlist ::= WHEN expr THEN expr", - /* 228 */ "case_else ::= ELSE expr", - /* 229 */ "case_else ::=", - /* 230 */ "case_operand ::= expr", - /* 231 */ "case_operand ::=", - /* 232 */ "exprlist ::=", - /* 233 */ "nexprlist ::= nexprlist COMMA expr", - /* 234 */ "nexprlist ::= expr", - /* 235 */ "paren_exprlist ::=", - /* 236 */ "paren_exprlist ::= LP exprlist RP", - /* 237 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt", - /* 238 */ "uniqueflag ::= UNIQUE", - /* 239 */ "uniqueflag ::=", - /* 240 */ "eidlist_opt ::=", - /* 241 */ "eidlist_opt ::= LP eidlist RP", - /* 242 */ "eidlist ::= eidlist COMMA nm collate sortorder", - /* 243 */ "eidlist ::= nm collate sortorder", - /* 244 */ "collate ::=", - /* 245 */ "collate ::= COLLATE ID|STRING", - /* 246 */ "cmd ::= DROP INDEX ifexists fullname", - /* 247 */ "cmd ::= VACUUM vinto", - /* 248 */ "cmd ::= VACUUM nm vinto", - /* 249 */ "vinto ::= INTO expr", - /* 250 */ "vinto ::=", - /* 251 */ "cmd ::= PRAGMA nm dbnm", - /* 252 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", - /* 253 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", - /* 254 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", - /* 255 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", - /* 256 */ "plus_num ::= PLUS INTEGER|FLOAT", - /* 257 */ "minus_num ::= MINUS INTEGER|FLOAT", - /* 258 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", - /* 259 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", - /* 260 */ "trigger_time ::= BEFORE|AFTER", - /* 261 */ "trigger_time ::= INSTEAD OF", - /* 262 */ "trigger_time ::=", - /* 263 */ "trigger_event ::= DELETE|INSERT", - /* 264 */ "trigger_event ::= UPDATE", - /* 265 */ "trigger_event ::= UPDATE OF idlist", - /* 266 */ "when_clause ::=", - /* 267 */ "when_clause ::= WHEN expr", - /* 268 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", - /* 269 */ "trigger_cmd_list ::= trigger_cmd SEMI", - /* 270 */ "trnm ::= nm DOT nm", - /* 271 */ "tridxby ::= INDEXED BY nm", - /* 272 */ "tridxby ::= NOT INDEXED", - /* 273 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt", - /* 274 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt", - /* 275 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt", - /* 276 */ "trigger_cmd ::= scanpt select scanpt", - /* 277 */ "expr ::= RAISE LP IGNORE RP", - /* 278 */ "expr ::= RAISE LP raisetype COMMA nm RP", - /* 279 */ "raisetype ::= ROLLBACK", - /* 280 */ "raisetype ::= ABORT", - /* 281 */ "raisetype ::= FAIL", - /* 282 */ "cmd ::= DROP TRIGGER ifexists fullname", - /* 283 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", - /* 284 */ "cmd ::= DETACH database_kw_opt expr", - /* 285 */ "key_opt ::=", - /* 286 */ "key_opt ::= KEY expr", - /* 287 */ "cmd ::= REINDEX", - /* 288 */ "cmd ::= REINDEX nm dbnm", - /* 289 */ "cmd ::= ANALYZE", - /* 290 */ "cmd ::= ANALYZE nm dbnm", - /* 291 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", - /* 292 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", - /* 293 */ "cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm", - /* 294 */ "add_column_fullname ::= fullname", - /* 295 */ "cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm", - /* 296 */ "cmd ::= create_vtab", - /* 297 */ "cmd ::= create_vtab LP vtabarglist RP", - /* 298 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", - /* 299 */ "vtabarg ::=", - /* 300 */ "vtabargtoken ::= ANY", - /* 301 */ "vtabargtoken ::= lp anylist RP", - /* 302 */ "lp ::= LP", - /* 303 */ "with ::= WITH wqlist", - /* 304 */ "with ::= WITH RECURSIVE wqlist", - /* 305 */ "wqas ::= AS", - /* 306 */ "wqas ::= AS MATERIALIZED", - /* 307 */ "wqas ::= AS NOT MATERIALIZED", - /* 308 */ "wqitem ::= nm eidlist_opt wqas LP select RP", - /* 309 */ "wqlist ::= wqitem", - /* 310 */ "wqlist ::= wqlist COMMA wqitem", - /* 311 */ "windowdefn_list ::= windowdefn", - /* 312 */ "windowdefn_list ::= windowdefn_list COMMA windowdefn", - /* 313 */ "windowdefn ::= nm AS LP window RP", - /* 314 */ "window ::= PARTITION BY nexprlist orderby_opt frame_opt", - /* 315 */ "window ::= nm PARTITION BY nexprlist orderby_opt frame_opt", - /* 316 */ "window ::= ORDER BY sortlist frame_opt", - /* 317 */ "window ::= nm ORDER BY sortlist frame_opt", - /* 318 */ "window ::= frame_opt", - /* 319 */ "window ::= nm frame_opt", - /* 320 */ "frame_opt ::=", - /* 321 */ "frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt", - /* 322 */ "frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt", - /* 323 */ "range_or_rows ::= RANGE|ROWS|GROUPS", - /* 324 */ "frame_bound_s ::= frame_bound", - /* 325 */ "frame_bound_s ::= UNBOUNDED PRECEDING", - /* 326 */ "frame_bound_e ::= frame_bound", - /* 327 */ "frame_bound_e ::= UNBOUNDED FOLLOWING", - /* 328 */ "frame_bound ::= expr PRECEDING|FOLLOWING", - /* 329 */ "frame_bound ::= CURRENT ROW", - /* 330 */ "frame_exclude_opt ::=", - /* 331 */ "frame_exclude_opt ::= EXCLUDE frame_exclude", - /* 332 */ "frame_exclude ::= NO OTHERS", - /* 333 */ "frame_exclude ::= CURRENT ROW", - /* 334 */ "frame_exclude ::= GROUP|TIES", - /* 335 */ "window_clause ::= WINDOW windowdefn_list", - /* 336 */ "filter_over ::= filter_clause over_clause", - /* 337 */ "filter_over ::= over_clause", - /* 338 */ "filter_over ::= filter_clause", - /* 339 */ "over_clause ::= OVER LP window RP", - /* 340 */ "over_clause ::= OVER nm", - /* 341 */ "filter_clause ::= FILTER LP WHERE expr RP", - /* 342 */ "input ::= cmdlist", - /* 343 */ "cmdlist ::= cmdlist ecmd", - /* 344 */ "cmdlist ::= ecmd", - /* 345 */ "ecmd ::= SEMI", - /* 346 */ "ecmd ::= cmdx SEMI", - /* 347 */ "ecmd ::= explain cmdx SEMI", - /* 348 */ "trans_opt ::=", - /* 349 */ "trans_opt ::= TRANSACTION", - /* 350 */ "trans_opt ::= TRANSACTION nm", - /* 351 */ "savepoint_opt ::= SAVEPOINT", - /* 352 */ "savepoint_opt ::=", - /* 353 */ "cmd ::= create_table create_table_args", - /* 354 */ "table_option_set ::= table_option", - /* 355 */ "columnlist ::= columnlist COMMA columnname carglist", - /* 356 */ "columnlist ::= columnname carglist", - /* 357 */ "nm ::= ID|INDEXED", - /* 358 */ "nm ::= STRING", - /* 359 */ "nm ::= JOIN_KW", - /* 360 */ "typetoken ::= typename", - /* 361 */ "typename ::= ID|STRING", - /* 362 */ "signed ::= plus_num", - /* 363 */ "signed ::= minus_num", - /* 364 */ "carglist ::= carglist ccons", - /* 365 */ "carglist ::=", - /* 366 */ "ccons ::= NULL onconf", - /* 367 */ "ccons ::= GENERATED ALWAYS AS generated", - /* 368 */ "ccons ::= AS generated", - /* 369 */ "conslist_opt ::= COMMA conslist", - /* 370 */ "conslist ::= conslist tconscomma tcons", - /* 371 */ "conslist ::= tcons", - /* 372 */ "tconscomma ::=", - /* 373 */ "defer_subclause_opt ::= defer_subclause", - /* 374 */ "resolvetype ::= raisetype", - /* 375 */ "selectnowith ::= oneselect", - /* 376 */ "oneselect ::= values", - /* 377 */ "sclp ::= selcollist COMMA", - /* 378 */ "as ::= ID|STRING", - /* 379 */ "indexed_opt ::= indexed_by", - /* 380 */ "returning ::=", - /* 381 */ "expr ::= term", - /* 382 */ "likeop ::= LIKE_KW|MATCH", - /* 383 */ "exprlist ::= nexprlist", - /* 384 */ "nmnum ::= plus_num", - /* 385 */ "nmnum ::= nm", - /* 386 */ "nmnum ::= ON", - /* 387 */ "nmnum ::= DELETE", - /* 388 */ "nmnum ::= DEFAULT", - /* 389 */ "plus_num ::= INTEGER|FLOAT", - /* 390 */ "foreach_clause ::=", - /* 391 */ "foreach_clause ::= FOR EACH ROW", - /* 392 */ "trnm ::= nm", - /* 393 */ "tridxby ::=", - /* 394 */ "database_kw_opt ::= DATABASE", - /* 395 */ "database_kw_opt ::=", - /* 396 */ "kwcolumn_opt ::=", - /* 397 */ "kwcolumn_opt ::= COLUMNKW", - /* 398 */ "vtabarglist ::= vtabarg", - /* 399 */ "vtabarglist ::= vtabarglist COMMA vtabarg", - /* 400 */ "vtabarg ::= vtabarg vtabargtoken", - /* 401 */ "anylist ::=", - /* 402 */ "anylist ::= anylist LP anylist RP", - /* 403 */ "anylist ::= anylist ANY", - /* 404 */ "with ::=", + /* 95 */ "oneselect ::= mvalues", + /* 96 */ "mvalues ::= values COMMA LP nexprlist RP", + /* 97 */ "mvalues ::= mvalues COMMA LP nexprlist RP", + /* 98 */ "distinct ::= DISTINCT", + /* 99 */ "distinct ::= ALL", + /* 100 */ "distinct ::=", + /* 101 */ "sclp ::=", + /* 102 */ "selcollist ::= sclp scanpt expr scanpt as", + /* 103 */ "selcollist ::= sclp scanpt STAR", + /* 104 */ "selcollist ::= sclp scanpt nm DOT STAR", + /* 105 */ "as ::= AS nm", + /* 106 */ "as ::=", + /* 107 */ "from ::=", + /* 108 */ "from ::= FROM seltablist", + /* 109 */ "stl_prefix ::= seltablist joinop", + /* 110 */ "stl_prefix ::=", + /* 111 */ "seltablist ::= stl_prefix nm dbnm as on_using", + /* 112 */ "seltablist ::= stl_prefix nm dbnm as indexed_by on_using", + /* 113 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using", + /* 114 */ "seltablist ::= stl_prefix LP select RP as on_using", + /* 115 */ "seltablist ::= stl_prefix LP seltablist RP as on_using", + /* 116 */ "dbnm ::=", + /* 117 */ "dbnm ::= DOT nm", + /* 118 */ "fullname ::= nm", + /* 119 */ "fullname ::= nm DOT nm", + /* 120 */ "xfullname ::= nm", + /* 121 */ "xfullname ::= nm DOT nm", + /* 122 */ "xfullname ::= nm DOT nm AS nm", + /* 123 */ "xfullname ::= nm AS nm", + /* 124 */ "joinop ::= COMMA|JOIN", + /* 125 */ "joinop ::= JOIN_KW JOIN", + /* 126 */ "joinop ::= JOIN_KW nm JOIN", + /* 127 */ "joinop ::= JOIN_KW nm nm JOIN", + /* 128 */ "on_using ::= ON expr", + /* 129 */ "on_using ::= USING LP idlist RP", + /* 130 */ "on_using ::=", + /* 131 */ "indexed_opt ::=", + /* 132 */ "indexed_by ::= INDEXED BY nm", + /* 133 */ "indexed_by ::= NOT INDEXED", + /* 134 */ "orderby_opt ::=", + /* 135 */ "orderby_opt ::= ORDER BY sortlist", + /* 136 */ "sortlist ::= sortlist COMMA expr sortorder nulls", + /* 137 */ "sortlist ::= expr sortorder nulls", + /* 138 */ "sortorder ::= ASC", + /* 139 */ "sortorder ::= DESC", + /* 140 */ "sortorder ::=", + /* 141 */ "nulls ::= NULLS FIRST", + /* 142 */ "nulls ::= NULLS LAST", + /* 143 */ "nulls ::=", + /* 144 */ "groupby_opt ::=", + /* 145 */ "groupby_opt ::= GROUP BY nexprlist", + /* 146 */ "having_opt ::=", + /* 147 */ "having_opt ::= HAVING expr", + /* 148 */ "limit_opt ::=", + /* 149 */ "limit_opt ::= LIMIT expr", + /* 150 */ "limit_opt ::= LIMIT expr OFFSET expr", + /* 151 */ "limit_opt ::= LIMIT expr COMMA expr", + /* 152 */ "cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret", + /* 153 */ "where_opt ::=", + /* 154 */ "where_opt ::= WHERE expr", + /* 155 */ "where_opt_ret ::=", + /* 156 */ "where_opt_ret ::= WHERE expr", + /* 157 */ "where_opt_ret ::= RETURNING selcollist", + /* 158 */ "where_opt_ret ::= WHERE expr RETURNING selcollist", + /* 159 */ "cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret", + /* 160 */ "setlist ::= setlist COMMA nm EQ expr", + /* 161 */ "setlist ::= setlist COMMA LP idlist RP EQ expr", + /* 162 */ "setlist ::= nm EQ expr", + /* 163 */ "setlist ::= LP idlist RP EQ expr", + /* 164 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert", + /* 165 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning", + /* 166 */ "upsert ::=", + /* 167 */ "upsert ::= RETURNING selcollist", + /* 168 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert", + /* 169 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert", + /* 170 */ "upsert ::= ON CONFLICT DO NOTHING returning", + /* 171 */ "upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning", + /* 172 */ "returning ::= RETURNING selcollist", + /* 173 */ "insert_cmd ::= INSERT orconf", + /* 174 */ "insert_cmd ::= REPLACE", + /* 175 */ "idlist_opt ::=", + /* 176 */ "idlist_opt ::= LP idlist RP", + /* 177 */ "idlist ::= idlist COMMA nm", + /* 178 */ "idlist ::= nm", + /* 179 */ "expr ::= LP expr RP", + /* 180 */ "expr ::= ID|INDEXED|JOIN_KW", + /* 181 */ "expr ::= nm DOT nm", + /* 182 */ "expr ::= nm DOT nm DOT nm", + /* 183 */ "term ::= NULL|FLOAT|BLOB", + /* 184 */ "term ::= STRING", + /* 185 */ "term ::= INTEGER", + /* 186 */ "expr ::= VARIABLE", + /* 187 */ "expr ::= expr COLLATE ID|STRING", + /* 188 */ "expr ::= CAST LP expr AS typetoken RP", + /* 189 */ "expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist RP", + /* 190 */ "expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist ORDER BY sortlist RP", + /* 191 */ "expr ::= ID|INDEXED|JOIN_KW LP STAR RP", + /* 192 */ "expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist RP filter_over", + /* 193 */ "expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist ORDER BY sortlist RP filter_over", + /* 194 */ "expr ::= ID|INDEXED|JOIN_KW LP STAR RP filter_over", + /* 195 */ "term ::= CTIME_KW", + /* 196 */ "expr ::= LP nexprlist COMMA expr RP", + /* 197 */ "expr ::= expr AND expr", + /* 198 */ "expr ::= expr OR expr", + /* 199 */ "expr ::= expr LT|GT|GE|LE expr", + /* 200 */ "expr ::= expr EQ|NE expr", + /* 201 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr", + /* 202 */ "expr ::= expr PLUS|MINUS expr", + /* 203 */ "expr ::= expr STAR|SLASH|REM expr", + /* 204 */ "expr ::= expr CONCAT expr", + /* 205 */ "likeop ::= NOT LIKE_KW|MATCH", + /* 206 */ "expr ::= expr likeop expr", + /* 207 */ "expr ::= expr likeop expr ESCAPE expr", + /* 208 */ "expr ::= expr ISNULL|NOTNULL", + /* 209 */ "expr ::= expr NOT NULL", + /* 210 */ "expr ::= expr IS expr", + /* 211 */ "expr ::= expr IS NOT expr", + /* 212 */ "expr ::= expr IS NOT DISTINCT FROM expr", + /* 213 */ "expr ::= expr IS DISTINCT FROM expr", + /* 214 */ "expr ::= NOT expr", + /* 215 */ "expr ::= BITNOT expr", + /* 216 */ "expr ::= PLUS|MINUS expr", + /* 217 */ "expr ::= expr PTR expr", + /* 218 */ "between_op ::= BETWEEN", + /* 219 */ "between_op ::= NOT BETWEEN", + /* 220 */ "expr ::= expr between_op expr AND expr", + /* 221 */ "in_op ::= IN", + /* 222 */ "in_op ::= NOT IN", + /* 223 */ "expr ::= expr in_op LP exprlist RP", + /* 224 */ "expr ::= LP select RP", + /* 225 */ "expr ::= expr in_op LP select RP", + /* 226 */ "expr ::= expr in_op nm dbnm paren_exprlist", + /* 227 */ "expr ::= EXISTS LP select RP", + /* 228 */ "expr ::= CASE case_operand case_exprlist case_else END", + /* 229 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", + /* 230 */ "case_exprlist ::= WHEN expr THEN expr", + /* 231 */ "case_else ::= ELSE expr", + /* 232 */ "case_else ::=", + /* 233 */ "case_operand ::=", + /* 234 */ "exprlist ::=", + /* 235 */ "nexprlist ::= nexprlist COMMA expr", + /* 236 */ "nexprlist ::= expr", + /* 237 */ "paren_exprlist ::=", + /* 238 */ "paren_exprlist ::= LP exprlist RP", + /* 239 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt", + /* 240 */ "uniqueflag ::= UNIQUE", + /* 241 */ "uniqueflag ::=", + /* 242 */ "eidlist_opt ::=", + /* 243 */ "eidlist_opt ::= LP eidlist RP", + /* 244 */ "eidlist ::= eidlist COMMA nm collate sortorder", + /* 245 */ "eidlist ::= nm collate sortorder", + /* 246 */ "collate ::=", + /* 247 */ "collate ::= COLLATE ID|STRING", + /* 248 */ "cmd ::= DROP INDEX ifexists fullname", + /* 249 */ "cmd ::= VACUUM vinto", + /* 250 */ "cmd ::= VACUUM nm vinto", + /* 251 */ "vinto ::= INTO expr", + /* 252 */ "vinto ::=", + /* 253 */ "cmd ::= PRAGMA nm dbnm", + /* 254 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", + /* 255 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", + /* 256 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", + /* 257 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", + /* 258 */ "plus_num ::= PLUS INTEGER|FLOAT", + /* 259 */ "minus_num ::= MINUS INTEGER|FLOAT", + /* 260 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", + /* 261 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", + /* 262 */ "trigger_time ::= BEFORE|AFTER", + /* 263 */ "trigger_time ::= INSTEAD OF", + /* 264 */ "trigger_time ::=", + /* 265 */ "trigger_event ::= DELETE|INSERT", + /* 266 */ "trigger_event ::= UPDATE", + /* 267 */ "trigger_event ::= UPDATE OF idlist", + /* 268 */ "when_clause ::=", + /* 269 */ "when_clause ::= WHEN expr", + /* 270 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", + /* 271 */ "trigger_cmd_list ::= trigger_cmd SEMI", + /* 272 */ "trnm ::= nm DOT nm", + /* 273 */ "tridxby ::= INDEXED BY nm", + /* 274 */ "tridxby ::= NOT INDEXED", + /* 275 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt", + /* 276 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt", + /* 277 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt", + /* 278 */ "trigger_cmd ::= scanpt select scanpt", + /* 279 */ "expr ::= RAISE LP IGNORE RP", + /* 280 */ "expr ::= RAISE LP raisetype COMMA expr RP", + /* 281 */ "raisetype ::= ROLLBACK", + /* 282 */ "raisetype ::= ABORT", + /* 283 */ "raisetype ::= FAIL", + /* 284 */ "cmd ::= DROP TRIGGER ifexists fullname", + /* 285 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", + /* 286 */ "cmd ::= DETACH database_kw_opt expr", + /* 287 */ "key_opt ::=", + /* 288 */ "key_opt ::= KEY expr", + /* 289 */ "cmd ::= REINDEX", + /* 290 */ "cmd ::= REINDEX nm dbnm", + /* 291 */ "cmd ::= ANALYZE", + /* 292 */ "cmd ::= ANALYZE nm dbnm", + /* 293 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", + /* 294 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", + /* 295 */ "cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm", + /* 296 */ "add_column_fullname ::= fullname", + /* 297 */ "cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm", + /* 298 */ "cmd ::= create_vtab", + /* 299 */ "cmd ::= create_vtab LP vtabarglist RP", + /* 300 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", + /* 301 */ "vtabarg ::=", + /* 302 */ "vtabargtoken ::= ANY", + /* 303 */ "vtabargtoken ::= lp anylist RP", + /* 304 */ "lp ::= LP", + /* 305 */ "with ::= WITH wqlist", + /* 306 */ "with ::= WITH RECURSIVE wqlist", + /* 307 */ "wqas ::= AS", + /* 308 */ "wqas ::= AS MATERIALIZED", + /* 309 */ "wqas ::= AS NOT MATERIALIZED", + /* 310 */ "wqitem ::= withnm eidlist_opt wqas LP select RP", + /* 311 */ "withnm ::= nm", + /* 312 */ "wqlist ::= wqitem", + /* 313 */ "wqlist ::= wqlist COMMA wqitem", + /* 314 */ "windowdefn_list ::= windowdefn_list COMMA windowdefn", + /* 315 */ "windowdefn ::= nm AS LP window RP", + /* 316 */ "window ::= PARTITION BY nexprlist orderby_opt frame_opt", + /* 317 */ "window ::= nm PARTITION BY nexprlist orderby_opt frame_opt", + /* 318 */ "window ::= ORDER BY sortlist frame_opt", + /* 319 */ "window ::= nm ORDER BY sortlist frame_opt", + /* 320 */ "window ::= nm frame_opt", + /* 321 */ "frame_opt ::=", + /* 322 */ "frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt", + /* 323 */ "frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt", + /* 324 */ "range_or_rows ::= RANGE|ROWS|GROUPS", + /* 325 */ "frame_bound_s ::= frame_bound", + /* 326 */ "frame_bound_s ::= UNBOUNDED PRECEDING", + /* 327 */ "frame_bound_e ::= frame_bound", + /* 328 */ "frame_bound_e ::= UNBOUNDED FOLLOWING", + /* 329 */ "frame_bound ::= expr PRECEDING|FOLLOWING", + /* 330 */ "frame_bound ::= CURRENT ROW", + /* 331 */ "frame_exclude_opt ::=", + /* 332 */ "frame_exclude_opt ::= EXCLUDE frame_exclude", + /* 333 */ "frame_exclude ::= NO OTHERS", + /* 334 */ "frame_exclude ::= CURRENT ROW", + /* 335 */ "frame_exclude ::= GROUP|TIES", + /* 336 */ "window_clause ::= WINDOW windowdefn_list", + /* 337 */ "filter_over ::= filter_clause over_clause", + /* 338 */ "filter_over ::= over_clause", + /* 339 */ "filter_over ::= filter_clause", + /* 340 */ "over_clause ::= OVER LP window RP", + /* 341 */ "over_clause ::= OVER nm", + /* 342 */ "filter_clause ::= FILTER LP WHERE expr RP", + /* 343 */ "term ::= QNUMBER", + /* 344 */ "input ::= cmdlist", + /* 345 */ "cmdlist ::= cmdlist ecmd", + /* 346 */ "cmdlist ::= ecmd", + /* 347 */ "ecmd ::= SEMI", + /* 348 */ "ecmd ::= cmdx SEMI", + /* 349 */ "ecmd ::= explain cmdx SEMI", + /* 350 */ "trans_opt ::=", + /* 351 */ "trans_opt ::= TRANSACTION", + /* 352 */ "trans_opt ::= TRANSACTION nm", + /* 353 */ "savepoint_opt ::= SAVEPOINT", + /* 354 */ "savepoint_opt ::=", + /* 355 */ "cmd ::= create_table create_table_args", + /* 356 */ "table_option_set ::= table_option", + /* 357 */ "columnlist ::= columnlist COMMA columnname carglist", + /* 358 */ "columnlist ::= columnname carglist", + /* 359 */ "nm ::= ID|INDEXED|JOIN_KW", + /* 360 */ "nm ::= STRING", + /* 361 */ "typetoken ::= typename", + /* 362 */ "typename ::= ID|STRING", + /* 363 */ "signed ::= plus_num", + /* 364 */ "signed ::= minus_num", + /* 365 */ "carglist ::= carglist ccons", + /* 366 */ "carglist ::=", + /* 367 */ "ccons ::= NULL onconf", + /* 368 */ "ccons ::= GENERATED ALWAYS AS generated", + /* 369 */ "ccons ::= AS generated", + /* 370 */ "conslist_opt ::= COMMA conslist", + /* 371 */ "conslist ::= conslist tconscomma tcons", + /* 372 */ "conslist ::= tcons", + /* 373 */ "tconscomma ::=", + /* 374 */ "defer_subclause_opt ::= defer_subclause", + /* 375 */ "resolvetype ::= raisetype", + /* 376 */ "selectnowith ::= oneselect", + /* 377 */ "oneselect ::= values", + /* 378 */ "sclp ::= selcollist COMMA", + /* 379 */ "as ::= ID|STRING", + /* 380 */ "indexed_opt ::= indexed_by", + /* 381 */ "returning ::=", + /* 382 */ "expr ::= term", + /* 383 */ "likeop ::= LIKE_KW|MATCH", + /* 384 */ "case_operand ::= expr", + /* 385 */ "exprlist ::= nexprlist", + /* 386 */ "nmnum ::= plus_num", + /* 387 */ "nmnum ::= nm", + /* 388 */ "nmnum ::= ON", + /* 389 */ "nmnum ::= DELETE", + /* 390 */ "nmnum ::= DEFAULT", + /* 391 */ "plus_num ::= INTEGER|FLOAT", + /* 392 */ "foreach_clause ::=", + /* 393 */ "foreach_clause ::= FOR EACH ROW", + /* 394 */ "trnm ::= nm", + /* 395 */ "tridxby ::=", + /* 396 */ "database_kw_opt ::= DATABASE", + /* 397 */ "database_kw_opt ::=", + /* 398 */ "kwcolumn_opt ::=", + /* 399 */ "kwcolumn_opt ::= COLUMNKW", + /* 400 */ "vtabarglist ::= vtabarg", + /* 401 */ "vtabarglist ::= vtabarglist COMMA vtabarg", + /* 402 */ "vtabarg ::= vtabarg vtabargtoken", + /* 403 */ "anylist ::=", + /* 404 */ "anylist ::= anylist LP anylist RP", + /* 405 */ "anylist ::= anylist ANY", + /* 406 */ "with ::=", + /* 407 */ "windowdefn_list ::= windowdefn", + /* 408 */ "window ::= frame_opt", }; #endif /* NDEBUG */ -#if YYSTACKDEPTH<=0 +#if YYGROWABLESTACK /* ** Try to increase the size of the parser stack. Return the number ** of errors. Return 0 on success. */ static int yyGrowStack(yyParser *p){ + int oldSize = 1 + (int)(p->yystackEnd - p->yystack); int newSize; int idx; yyStackEntry *pNew; - newSize = p->yystksz*2 + 100; - idx = p->yytos ? (int)(p->yytos - p->yystack) : 0; - if( p->yystack==&p->yystk0 ){ - pNew = malloc(newSize*sizeof(pNew[0])); - if( pNew ) pNew[0] = p->yystk0; + newSize = oldSize*2 + 100; + idx = (int)(p->yytos - p->yystack); + if( p->yystack==p->yystk0 ){ + pNew = YYREALLOC(0, newSize*sizeof(pNew[0])); + if( pNew==0 ) return 1; + memcpy(pNew, p->yystack, oldSize*sizeof(pNew[0])); }else{ - pNew = realloc(p->yystack, newSize*sizeof(pNew[0])); + pNew = YYREALLOC(p->yystack, newSize*sizeof(pNew[0])); + if( pNew==0 ) return 1; } - if( pNew ){ - p->yystack = pNew; - p->yytos = &p->yystack[idx]; + p->yystack = pNew; + p->yytos = &p->yystack[idx]; #ifndef NDEBUG - if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n", - yyTracePrompt, p->yystksz, newSize); - } -#endif - p->yystksz = newSize; + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n", + yyTracePrompt, oldSize, newSize); } - return pNew==0; +#endif + p->yystackEnd = &p->yystack[newSize-1]; + return 0; } +#endif /* YYGROWABLESTACK */ + +#if !YYGROWABLESTACK +/* For builds that do no have a growable stack, yyGrowStack always +** returns an error. +*/ +# define yyGrowStack(X) 1 #endif /* Datatype of the argument to the memory allocated passed as the @@ -169088,24 +176141,14 @@ SQLITE_PRIVATE void sqlite3ParserInit(void *yypRawParser sqlite3ParserCTX_PDECL) #ifdef YYTRACKMAXSTACKDEPTH yypParser->yyhwm = 0; #endif -#if YYSTACKDEPTH<=0 - yypParser->yytos = NULL; - yypParser->yystack = NULL; - yypParser->yystksz = 0; - if( yyGrowStack(yypParser) ){ - yypParser->yystack = &yypParser->yystk0; - yypParser->yystksz = 1; - } -#endif + yypParser->yystack = yypParser->yystk0; + yypParser->yystackEnd = &yypParser->yystack[YYSTACKDEPTH-1]; #ifndef YYNOERRORRECOVERY yypParser->yyerrcnt = -1; #endif yypParser->yytos = yypParser->yystack; yypParser->yystack[0].stateno = 0; yypParser->yystack[0].major = 0; -#if YYSTACKDEPTH>0 - yypParser->yystackEnd = &yypParser->yystack[YYSTACKDEPTH-1]; -#endif } #ifndef sqlite3Parser_ENGINEALWAYSONSTACK @@ -169159,97 +176202,98 @@ static void yy_destructor( ** inside the C code. */ /********* Begin destructor definitions ***************************************/ - case 204: /* select */ - case 239: /* selectnowith */ - case 240: /* oneselect */ - case 252: /* values */ + case 205: /* select */ + case 240: /* selectnowith */ + case 241: /* oneselect */ + case 253: /* values */ + case 255: /* mvalues */ { -sqlite3SelectDelete(pParse->db, (yypminor->yy47)); -} - break; - case 216: /* term */ - case 217: /* expr */ - case 246: /* where_opt */ - case 248: /* having_opt */ - case 267: /* where_opt_ret */ - case 278: /* case_operand */ - case 280: /* case_else */ - case 283: /* vinto */ - case 290: /* when_clause */ - case 295: /* key_opt */ - case 311: /* filter_clause */ +sqlite3SelectDelete(pParse->db, (yypminor->yy555)); +} + break; + case 217: /* term */ + case 218: /* expr */ + case 247: /* where_opt */ + case 249: /* having_opt */ + case 269: /* where_opt_ret */ + case 280: /* case_operand */ + case 282: /* case_else */ + case 285: /* vinto */ + case 292: /* when_clause */ + case 297: /* key_opt */ + case 314: /* filter_clause */ { -sqlite3ExprDelete(pParse->db, (yypminor->yy528)); -} - break; - case 221: /* eidlist_opt */ - case 231: /* sortlist */ - case 232: /* eidlist */ - case 244: /* selcollist */ - case 247: /* groupby_opt */ - case 249: /* orderby_opt */ - case 253: /* nexprlist */ - case 254: /* sclp */ - case 261: /* exprlist */ - case 268: /* setlist */ - case 277: /* paren_exprlist */ - case 279: /* case_exprlist */ - case 310: /* part_opt */ +sqlite3ExprDelete(pParse->db, (yypminor->yy454)); +} + break; + case 222: /* eidlist_opt */ + case 232: /* sortlist */ + case 233: /* eidlist */ + case 245: /* selcollist */ + case 248: /* groupby_opt */ + case 250: /* orderby_opt */ + case 254: /* nexprlist */ + case 256: /* sclp */ + case 263: /* exprlist */ + case 270: /* setlist */ + case 279: /* paren_exprlist */ + case 281: /* case_exprlist */ + case 313: /* part_opt */ { -sqlite3ExprListDelete(pParse->db, (yypminor->yy322)); +sqlite3ExprListDelete(pParse->db, (yypminor->yy14)); } break; - case 238: /* fullname */ - case 245: /* from */ - case 256: /* seltablist */ - case 257: /* stl_prefix */ - case 262: /* xfullname */ + case 239: /* fullname */ + case 246: /* from */ + case 258: /* seltablist */ + case 259: /* stl_prefix */ + case 264: /* xfullname */ { -sqlite3SrcListDelete(pParse->db, (yypminor->yy131)); +sqlite3SrcListDelete(pParse->db, (yypminor->yy203)); } break; - case 241: /* wqlist */ + case 242: /* wqlist */ { -sqlite3WithDelete(pParse->db, (yypminor->yy521)); +sqlite3WithDelete(pParse->db, (yypminor->yy59)); } break; - case 251: /* window_clause */ - case 306: /* windowdefn_list */ + case 252: /* window_clause */ + case 309: /* windowdefn_list */ { -sqlite3WindowListDelete(pParse->db, (yypminor->yy41)); +sqlite3WindowListDelete(pParse->db, (yypminor->yy211)); } break; - case 263: /* idlist */ - case 270: /* idlist_opt */ + case 265: /* idlist */ + case 272: /* idlist_opt */ { -sqlite3IdListDelete(pParse->db, (yypminor->yy254)); +sqlite3IdListDelete(pParse->db, (yypminor->yy132)); } break; - case 273: /* filter_over */ - case 307: /* windowdefn */ - case 308: /* window */ - case 309: /* frame_opt */ - case 312: /* over_clause */ + case 275: /* filter_over */ + case 310: /* windowdefn */ + case 311: /* window */ + case 312: /* frame_opt */ + case 315: /* over_clause */ { -sqlite3WindowDelete(pParse->db, (yypminor->yy41)); +sqlite3WindowDelete(pParse->db, (yypminor->yy211)); } break; - case 286: /* trigger_cmd_list */ - case 291: /* trigger_cmd */ + case 288: /* trigger_cmd_list */ + case 293: /* trigger_cmd */ { -sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy33)); +sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy427)); } break; - case 288: /* trigger_event */ + case 290: /* trigger_event */ { -sqlite3IdListDelete(pParse->db, (yypminor->yy180).b); +sqlite3IdListDelete(pParse->db, (yypminor->yy286).b); } break; - case 314: /* frame_bound */ - case 315: /* frame_bound_s */ - case 316: /* frame_bound_e */ + case 317: /* frame_bound */ + case 318: /* frame_bound_s */ + case 319: /* frame_bound_e */ { -sqlite3ExprDelete(pParse->db, (yypminor->yy595).pExpr); +sqlite3ExprDelete(pParse->db, (yypminor->yy509).pExpr); } break; /********* End destructor definitions *****************************************/ @@ -169283,9 +176327,26 @@ static void yy_pop_parser_stack(yyParser *pParser){ */ SQLITE_PRIVATE void sqlite3ParserFinalize(void *p){ yyParser *pParser = (yyParser*)p; - while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser); -#if YYSTACKDEPTH<=0 - if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack); + + /* In-lined version of calling yy_pop_parser_stack() for each + ** element left in the stack */ + yyStackEntry *yytos = pParser->yytos; + while( yytos>pParser->yystack ){ +#ifndef NDEBUG + if( yyTraceFILE ){ + fprintf(yyTraceFILE,"%sPopping %s\n", + yyTracePrompt, + yyTokenName[yytos->major]); + } +#endif + if( yytos->major>=YY_MIN_DSTRCTR ){ + yy_destructor(pParser, yytos->major, &yytos->minor); + } + yytos--; + } + +#if YYGROWABLESTACK + if( pParser->yystack!=pParser->yystk0 ) YYFREE(pParser->yystack); #endif } @@ -169468,7 +176529,7 @@ static void yyStackOverflow(yyParser *yypParser){ ** stack every overflows */ /******** Begin %stack_overflow code ******************************************/ - sqlite3ErrorMsg(pParse, "parser stack overflow"); + sqlite3OomFault(pParse->db); /******** End %stack_overflow code ********************************************/ sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument var */ sqlite3ParserCTX_STORE @@ -169512,25 +176573,19 @@ static void yy_shift( assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) ); } #endif -#if YYSTACKDEPTH>0 - if( yypParser->yytos>yypParser->yystackEnd ){ - yypParser->yytos--; - yyStackOverflow(yypParser); - return; - } -#else - if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){ + yytos = yypParser->yytos; + if( yytos>yypParser->yystackEnd ){ if( yyGrowStack(yypParser) ){ yypParser->yytos--; yyStackOverflow(yypParser); return; } + yytos = yypParser->yytos; + assert( yytos <= yypParser->yystackEnd ); } -#endif if( yyNewState > YY_MAX_SHIFT ){ yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; } - yytos = yypParser->yytos; yytos->stateno = yyNewState; yytos->major = yyMajor; yytos->minor.yy0 = yyMinor; @@ -169540,411 +176595,415 @@ static void yy_shift( /* For rule J, yyRuleInfoLhs[J] contains the symbol on the left-hand side ** of that rule */ static const YYCODETYPE yyRuleInfoLhs[] = { - 189, /* (0) explain ::= EXPLAIN */ - 189, /* (1) explain ::= EXPLAIN QUERY PLAN */ - 188, /* (2) cmdx ::= cmd */ - 190, /* (3) cmd ::= BEGIN transtype trans_opt */ - 191, /* (4) transtype ::= */ - 191, /* (5) transtype ::= DEFERRED */ - 191, /* (6) transtype ::= IMMEDIATE */ - 191, /* (7) transtype ::= EXCLUSIVE */ - 190, /* (8) cmd ::= COMMIT|END trans_opt */ - 190, /* (9) cmd ::= ROLLBACK trans_opt */ - 190, /* (10) cmd ::= SAVEPOINT nm */ - 190, /* (11) cmd ::= RELEASE savepoint_opt nm */ - 190, /* (12) cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ - 195, /* (13) create_table ::= createkw temp TABLE ifnotexists nm dbnm */ - 197, /* (14) createkw ::= CREATE */ - 199, /* (15) ifnotexists ::= */ - 199, /* (16) ifnotexists ::= IF NOT EXISTS */ - 198, /* (17) temp ::= TEMP */ - 198, /* (18) temp ::= */ - 196, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_option_set */ - 196, /* (20) create_table_args ::= AS select */ - 203, /* (21) table_option_set ::= */ - 203, /* (22) table_option_set ::= table_option_set COMMA table_option */ - 205, /* (23) table_option ::= WITHOUT nm */ - 205, /* (24) table_option ::= nm */ - 206, /* (25) columnname ::= nm typetoken */ - 208, /* (26) typetoken ::= */ - 208, /* (27) typetoken ::= typename LP signed RP */ - 208, /* (28) typetoken ::= typename LP signed COMMA signed RP */ - 209, /* (29) typename ::= typename ID|STRING */ - 213, /* (30) scanpt ::= */ - 214, /* (31) scantok ::= */ - 215, /* (32) ccons ::= CONSTRAINT nm */ - 215, /* (33) ccons ::= DEFAULT scantok term */ - 215, /* (34) ccons ::= DEFAULT LP expr RP */ - 215, /* (35) ccons ::= DEFAULT PLUS scantok term */ - 215, /* (36) ccons ::= DEFAULT MINUS scantok term */ - 215, /* (37) ccons ::= DEFAULT scantok ID|INDEXED */ - 215, /* (38) ccons ::= NOT NULL onconf */ - 215, /* (39) ccons ::= PRIMARY KEY sortorder onconf autoinc */ - 215, /* (40) ccons ::= UNIQUE onconf */ - 215, /* (41) ccons ::= CHECK LP expr RP */ - 215, /* (42) ccons ::= REFERENCES nm eidlist_opt refargs */ - 215, /* (43) ccons ::= defer_subclause */ - 215, /* (44) ccons ::= COLLATE ID|STRING */ - 224, /* (45) generated ::= LP expr RP */ - 224, /* (46) generated ::= LP expr RP ID */ - 220, /* (47) autoinc ::= */ - 220, /* (48) autoinc ::= AUTOINCR */ - 222, /* (49) refargs ::= */ - 222, /* (50) refargs ::= refargs refarg */ - 225, /* (51) refarg ::= MATCH nm */ - 225, /* (52) refarg ::= ON INSERT refact */ - 225, /* (53) refarg ::= ON DELETE refact */ - 225, /* (54) refarg ::= ON UPDATE refact */ - 226, /* (55) refact ::= SET NULL */ - 226, /* (56) refact ::= SET DEFAULT */ - 226, /* (57) refact ::= CASCADE */ - 226, /* (58) refact ::= RESTRICT */ - 226, /* (59) refact ::= NO ACTION */ - 223, /* (60) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ - 223, /* (61) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ - 227, /* (62) init_deferred_pred_opt ::= */ - 227, /* (63) init_deferred_pred_opt ::= INITIALLY DEFERRED */ - 227, /* (64) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ - 202, /* (65) conslist_opt ::= */ - 229, /* (66) tconscomma ::= COMMA */ - 230, /* (67) tcons ::= CONSTRAINT nm */ - 230, /* (68) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ - 230, /* (69) tcons ::= UNIQUE LP sortlist RP onconf */ - 230, /* (70) tcons ::= CHECK LP expr RP onconf */ - 230, /* (71) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ - 233, /* (72) defer_subclause_opt ::= */ - 218, /* (73) onconf ::= */ - 218, /* (74) onconf ::= ON CONFLICT resolvetype */ - 234, /* (75) orconf ::= */ - 234, /* (76) orconf ::= OR resolvetype */ - 235, /* (77) resolvetype ::= IGNORE */ - 235, /* (78) resolvetype ::= REPLACE */ - 190, /* (79) cmd ::= DROP TABLE ifexists fullname */ - 237, /* (80) ifexists ::= IF EXISTS */ - 237, /* (81) ifexists ::= */ - 190, /* (82) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ - 190, /* (83) cmd ::= DROP VIEW ifexists fullname */ - 190, /* (84) cmd ::= select */ - 204, /* (85) select ::= WITH wqlist selectnowith */ - 204, /* (86) select ::= WITH RECURSIVE wqlist selectnowith */ - 204, /* (87) select ::= selectnowith */ - 239, /* (88) selectnowith ::= selectnowith multiselect_op oneselect */ - 242, /* (89) multiselect_op ::= UNION */ - 242, /* (90) multiselect_op ::= UNION ALL */ - 242, /* (91) multiselect_op ::= EXCEPT|INTERSECT */ - 240, /* (92) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ - 240, /* (93) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ - 252, /* (94) values ::= VALUES LP nexprlist RP */ - 252, /* (95) values ::= values COMMA LP nexprlist RP */ - 243, /* (96) distinct ::= DISTINCT */ - 243, /* (97) distinct ::= ALL */ - 243, /* (98) distinct ::= */ - 254, /* (99) sclp ::= */ - 244, /* (100) selcollist ::= sclp scanpt expr scanpt as */ - 244, /* (101) selcollist ::= sclp scanpt STAR */ - 244, /* (102) selcollist ::= sclp scanpt nm DOT STAR */ - 255, /* (103) as ::= AS nm */ - 255, /* (104) as ::= */ - 245, /* (105) from ::= */ - 245, /* (106) from ::= FROM seltablist */ - 257, /* (107) stl_prefix ::= seltablist joinop */ - 257, /* (108) stl_prefix ::= */ - 256, /* (109) seltablist ::= stl_prefix nm dbnm as on_using */ - 256, /* (110) seltablist ::= stl_prefix nm dbnm as indexed_by on_using */ - 256, /* (111) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using */ - 256, /* (112) seltablist ::= stl_prefix LP select RP as on_using */ - 256, /* (113) seltablist ::= stl_prefix LP seltablist RP as on_using */ - 200, /* (114) dbnm ::= */ - 200, /* (115) dbnm ::= DOT nm */ - 238, /* (116) fullname ::= nm */ - 238, /* (117) fullname ::= nm DOT nm */ - 262, /* (118) xfullname ::= nm */ - 262, /* (119) xfullname ::= nm DOT nm */ - 262, /* (120) xfullname ::= nm DOT nm AS nm */ - 262, /* (121) xfullname ::= nm AS nm */ - 258, /* (122) joinop ::= COMMA|JOIN */ - 258, /* (123) joinop ::= JOIN_KW JOIN */ - 258, /* (124) joinop ::= JOIN_KW nm JOIN */ - 258, /* (125) joinop ::= JOIN_KW nm nm JOIN */ - 259, /* (126) on_using ::= ON expr */ - 259, /* (127) on_using ::= USING LP idlist RP */ - 259, /* (128) on_using ::= */ - 264, /* (129) indexed_opt ::= */ - 260, /* (130) indexed_by ::= INDEXED BY nm */ - 260, /* (131) indexed_by ::= NOT INDEXED */ - 249, /* (132) orderby_opt ::= */ - 249, /* (133) orderby_opt ::= ORDER BY sortlist */ - 231, /* (134) sortlist ::= sortlist COMMA expr sortorder nulls */ - 231, /* (135) sortlist ::= expr sortorder nulls */ - 219, /* (136) sortorder ::= ASC */ - 219, /* (137) sortorder ::= DESC */ - 219, /* (138) sortorder ::= */ - 265, /* (139) nulls ::= NULLS FIRST */ - 265, /* (140) nulls ::= NULLS LAST */ - 265, /* (141) nulls ::= */ - 247, /* (142) groupby_opt ::= */ - 247, /* (143) groupby_opt ::= GROUP BY nexprlist */ - 248, /* (144) having_opt ::= */ - 248, /* (145) having_opt ::= HAVING expr */ - 250, /* (146) limit_opt ::= */ - 250, /* (147) limit_opt ::= LIMIT expr */ - 250, /* (148) limit_opt ::= LIMIT expr OFFSET expr */ - 250, /* (149) limit_opt ::= LIMIT expr COMMA expr */ - 190, /* (150) cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret */ - 246, /* (151) where_opt ::= */ - 246, /* (152) where_opt ::= WHERE expr */ - 267, /* (153) where_opt_ret ::= */ - 267, /* (154) where_opt_ret ::= WHERE expr */ - 267, /* (155) where_opt_ret ::= RETURNING selcollist */ - 267, /* (156) where_opt_ret ::= WHERE expr RETURNING selcollist */ - 190, /* (157) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret */ - 268, /* (158) setlist ::= setlist COMMA nm EQ expr */ - 268, /* (159) setlist ::= setlist COMMA LP idlist RP EQ expr */ - 268, /* (160) setlist ::= nm EQ expr */ - 268, /* (161) setlist ::= LP idlist RP EQ expr */ - 190, /* (162) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ - 190, /* (163) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning */ - 271, /* (164) upsert ::= */ - 271, /* (165) upsert ::= RETURNING selcollist */ - 271, /* (166) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert */ - 271, /* (167) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert */ - 271, /* (168) upsert ::= ON CONFLICT DO NOTHING returning */ - 271, /* (169) upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning */ - 272, /* (170) returning ::= RETURNING selcollist */ - 269, /* (171) insert_cmd ::= INSERT orconf */ - 269, /* (172) insert_cmd ::= REPLACE */ - 270, /* (173) idlist_opt ::= */ - 270, /* (174) idlist_opt ::= LP idlist RP */ - 263, /* (175) idlist ::= idlist COMMA nm */ - 263, /* (176) idlist ::= nm */ - 217, /* (177) expr ::= LP expr RP */ - 217, /* (178) expr ::= ID|INDEXED */ - 217, /* (179) expr ::= JOIN_KW */ - 217, /* (180) expr ::= nm DOT nm */ - 217, /* (181) expr ::= nm DOT nm DOT nm */ - 216, /* (182) term ::= NULL|FLOAT|BLOB */ - 216, /* (183) term ::= STRING */ - 216, /* (184) term ::= INTEGER */ - 217, /* (185) expr ::= VARIABLE */ - 217, /* (186) expr ::= expr COLLATE ID|STRING */ - 217, /* (187) expr ::= CAST LP expr AS typetoken RP */ - 217, /* (188) expr ::= ID|INDEXED LP distinct exprlist RP */ - 217, /* (189) expr ::= ID|INDEXED LP STAR RP */ - 217, /* (190) expr ::= ID|INDEXED LP distinct exprlist RP filter_over */ - 217, /* (191) expr ::= ID|INDEXED LP STAR RP filter_over */ - 216, /* (192) term ::= CTIME_KW */ - 217, /* (193) expr ::= LP nexprlist COMMA expr RP */ - 217, /* (194) expr ::= expr AND expr */ - 217, /* (195) expr ::= expr OR expr */ - 217, /* (196) expr ::= expr LT|GT|GE|LE expr */ - 217, /* (197) expr ::= expr EQ|NE expr */ - 217, /* (198) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ - 217, /* (199) expr ::= expr PLUS|MINUS expr */ - 217, /* (200) expr ::= expr STAR|SLASH|REM expr */ - 217, /* (201) expr ::= expr CONCAT expr */ - 274, /* (202) likeop ::= NOT LIKE_KW|MATCH */ - 217, /* (203) expr ::= expr likeop expr */ - 217, /* (204) expr ::= expr likeop expr ESCAPE expr */ - 217, /* (205) expr ::= expr ISNULL|NOTNULL */ - 217, /* (206) expr ::= expr NOT NULL */ - 217, /* (207) expr ::= expr IS expr */ - 217, /* (208) expr ::= expr IS NOT expr */ - 217, /* (209) expr ::= expr IS NOT DISTINCT FROM expr */ - 217, /* (210) expr ::= expr IS DISTINCT FROM expr */ - 217, /* (211) expr ::= NOT expr */ - 217, /* (212) expr ::= BITNOT expr */ - 217, /* (213) expr ::= PLUS|MINUS expr */ - 217, /* (214) expr ::= expr PTR expr */ - 275, /* (215) between_op ::= BETWEEN */ - 275, /* (216) between_op ::= NOT BETWEEN */ - 217, /* (217) expr ::= expr between_op expr AND expr */ - 276, /* (218) in_op ::= IN */ - 276, /* (219) in_op ::= NOT IN */ - 217, /* (220) expr ::= expr in_op LP exprlist RP */ - 217, /* (221) expr ::= LP select RP */ - 217, /* (222) expr ::= expr in_op LP select RP */ - 217, /* (223) expr ::= expr in_op nm dbnm paren_exprlist */ - 217, /* (224) expr ::= EXISTS LP select RP */ - 217, /* (225) expr ::= CASE case_operand case_exprlist case_else END */ - 279, /* (226) case_exprlist ::= case_exprlist WHEN expr THEN expr */ - 279, /* (227) case_exprlist ::= WHEN expr THEN expr */ - 280, /* (228) case_else ::= ELSE expr */ - 280, /* (229) case_else ::= */ - 278, /* (230) case_operand ::= expr */ - 278, /* (231) case_operand ::= */ - 261, /* (232) exprlist ::= */ - 253, /* (233) nexprlist ::= nexprlist COMMA expr */ - 253, /* (234) nexprlist ::= expr */ - 277, /* (235) paren_exprlist ::= */ - 277, /* (236) paren_exprlist ::= LP exprlist RP */ - 190, /* (237) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ - 281, /* (238) uniqueflag ::= UNIQUE */ - 281, /* (239) uniqueflag ::= */ - 221, /* (240) eidlist_opt ::= */ - 221, /* (241) eidlist_opt ::= LP eidlist RP */ - 232, /* (242) eidlist ::= eidlist COMMA nm collate sortorder */ - 232, /* (243) eidlist ::= nm collate sortorder */ - 282, /* (244) collate ::= */ - 282, /* (245) collate ::= COLLATE ID|STRING */ - 190, /* (246) cmd ::= DROP INDEX ifexists fullname */ - 190, /* (247) cmd ::= VACUUM vinto */ - 190, /* (248) cmd ::= VACUUM nm vinto */ - 283, /* (249) vinto ::= INTO expr */ - 283, /* (250) vinto ::= */ - 190, /* (251) cmd ::= PRAGMA nm dbnm */ - 190, /* (252) cmd ::= PRAGMA nm dbnm EQ nmnum */ - 190, /* (253) cmd ::= PRAGMA nm dbnm LP nmnum RP */ - 190, /* (254) cmd ::= PRAGMA nm dbnm EQ minus_num */ - 190, /* (255) cmd ::= PRAGMA nm dbnm LP minus_num RP */ - 211, /* (256) plus_num ::= PLUS INTEGER|FLOAT */ - 212, /* (257) minus_num ::= MINUS INTEGER|FLOAT */ - 190, /* (258) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ - 285, /* (259) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ - 287, /* (260) trigger_time ::= BEFORE|AFTER */ - 287, /* (261) trigger_time ::= INSTEAD OF */ - 287, /* (262) trigger_time ::= */ - 288, /* (263) trigger_event ::= DELETE|INSERT */ - 288, /* (264) trigger_event ::= UPDATE */ - 288, /* (265) trigger_event ::= UPDATE OF idlist */ - 290, /* (266) when_clause ::= */ - 290, /* (267) when_clause ::= WHEN expr */ - 286, /* (268) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ - 286, /* (269) trigger_cmd_list ::= trigger_cmd SEMI */ - 292, /* (270) trnm ::= nm DOT nm */ - 293, /* (271) tridxby ::= INDEXED BY nm */ - 293, /* (272) tridxby ::= NOT INDEXED */ - 291, /* (273) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ - 291, /* (274) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ - 291, /* (275) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ - 291, /* (276) trigger_cmd ::= scanpt select scanpt */ - 217, /* (277) expr ::= RAISE LP IGNORE RP */ - 217, /* (278) expr ::= RAISE LP raisetype COMMA nm RP */ - 236, /* (279) raisetype ::= ROLLBACK */ - 236, /* (280) raisetype ::= ABORT */ - 236, /* (281) raisetype ::= FAIL */ - 190, /* (282) cmd ::= DROP TRIGGER ifexists fullname */ - 190, /* (283) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ - 190, /* (284) cmd ::= DETACH database_kw_opt expr */ - 295, /* (285) key_opt ::= */ - 295, /* (286) key_opt ::= KEY expr */ - 190, /* (287) cmd ::= REINDEX */ - 190, /* (288) cmd ::= REINDEX nm dbnm */ - 190, /* (289) cmd ::= ANALYZE */ - 190, /* (290) cmd ::= ANALYZE nm dbnm */ - 190, /* (291) cmd ::= ALTER TABLE fullname RENAME TO nm */ - 190, /* (292) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ - 190, /* (293) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ - 296, /* (294) add_column_fullname ::= fullname */ - 190, /* (295) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ - 190, /* (296) cmd ::= create_vtab */ - 190, /* (297) cmd ::= create_vtab LP vtabarglist RP */ - 298, /* (298) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ - 300, /* (299) vtabarg ::= */ - 301, /* (300) vtabargtoken ::= ANY */ - 301, /* (301) vtabargtoken ::= lp anylist RP */ - 302, /* (302) lp ::= LP */ - 266, /* (303) with ::= WITH wqlist */ - 266, /* (304) with ::= WITH RECURSIVE wqlist */ - 305, /* (305) wqas ::= AS */ - 305, /* (306) wqas ::= AS MATERIALIZED */ - 305, /* (307) wqas ::= AS NOT MATERIALIZED */ - 304, /* (308) wqitem ::= nm eidlist_opt wqas LP select RP */ - 241, /* (309) wqlist ::= wqitem */ - 241, /* (310) wqlist ::= wqlist COMMA wqitem */ - 306, /* (311) windowdefn_list ::= windowdefn */ - 306, /* (312) windowdefn_list ::= windowdefn_list COMMA windowdefn */ - 307, /* (313) windowdefn ::= nm AS LP window RP */ - 308, /* (314) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ - 308, /* (315) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ - 308, /* (316) window ::= ORDER BY sortlist frame_opt */ - 308, /* (317) window ::= nm ORDER BY sortlist frame_opt */ - 308, /* (318) window ::= frame_opt */ - 308, /* (319) window ::= nm frame_opt */ - 309, /* (320) frame_opt ::= */ - 309, /* (321) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ - 309, /* (322) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ - 313, /* (323) range_or_rows ::= RANGE|ROWS|GROUPS */ - 315, /* (324) frame_bound_s ::= frame_bound */ - 315, /* (325) frame_bound_s ::= UNBOUNDED PRECEDING */ - 316, /* (326) frame_bound_e ::= frame_bound */ - 316, /* (327) frame_bound_e ::= UNBOUNDED FOLLOWING */ - 314, /* (328) frame_bound ::= expr PRECEDING|FOLLOWING */ - 314, /* (329) frame_bound ::= CURRENT ROW */ - 317, /* (330) frame_exclude_opt ::= */ - 317, /* (331) frame_exclude_opt ::= EXCLUDE frame_exclude */ - 318, /* (332) frame_exclude ::= NO OTHERS */ - 318, /* (333) frame_exclude ::= CURRENT ROW */ - 318, /* (334) frame_exclude ::= GROUP|TIES */ - 251, /* (335) window_clause ::= WINDOW windowdefn_list */ - 273, /* (336) filter_over ::= filter_clause over_clause */ - 273, /* (337) filter_over ::= over_clause */ - 273, /* (338) filter_over ::= filter_clause */ - 312, /* (339) over_clause ::= OVER LP window RP */ - 312, /* (340) over_clause ::= OVER nm */ - 311, /* (341) filter_clause ::= FILTER LP WHERE expr RP */ - 185, /* (342) input ::= cmdlist */ - 186, /* (343) cmdlist ::= cmdlist ecmd */ - 186, /* (344) cmdlist ::= ecmd */ - 187, /* (345) ecmd ::= SEMI */ - 187, /* (346) ecmd ::= cmdx SEMI */ - 187, /* (347) ecmd ::= explain cmdx SEMI */ - 192, /* (348) trans_opt ::= */ - 192, /* (349) trans_opt ::= TRANSACTION */ - 192, /* (350) trans_opt ::= TRANSACTION nm */ - 194, /* (351) savepoint_opt ::= SAVEPOINT */ - 194, /* (352) savepoint_opt ::= */ - 190, /* (353) cmd ::= create_table create_table_args */ - 203, /* (354) table_option_set ::= table_option */ - 201, /* (355) columnlist ::= columnlist COMMA columnname carglist */ - 201, /* (356) columnlist ::= columnname carglist */ - 193, /* (357) nm ::= ID|INDEXED */ - 193, /* (358) nm ::= STRING */ - 193, /* (359) nm ::= JOIN_KW */ - 208, /* (360) typetoken ::= typename */ - 209, /* (361) typename ::= ID|STRING */ - 210, /* (362) signed ::= plus_num */ - 210, /* (363) signed ::= minus_num */ - 207, /* (364) carglist ::= carglist ccons */ - 207, /* (365) carglist ::= */ - 215, /* (366) ccons ::= NULL onconf */ - 215, /* (367) ccons ::= GENERATED ALWAYS AS generated */ - 215, /* (368) ccons ::= AS generated */ - 202, /* (369) conslist_opt ::= COMMA conslist */ - 228, /* (370) conslist ::= conslist tconscomma tcons */ - 228, /* (371) conslist ::= tcons */ - 229, /* (372) tconscomma ::= */ - 233, /* (373) defer_subclause_opt ::= defer_subclause */ - 235, /* (374) resolvetype ::= raisetype */ - 239, /* (375) selectnowith ::= oneselect */ - 240, /* (376) oneselect ::= values */ - 254, /* (377) sclp ::= selcollist COMMA */ - 255, /* (378) as ::= ID|STRING */ - 264, /* (379) indexed_opt ::= indexed_by */ - 272, /* (380) returning ::= */ - 217, /* (381) expr ::= term */ - 274, /* (382) likeop ::= LIKE_KW|MATCH */ - 261, /* (383) exprlist ::= nexprlist */ - 284, /* (384) nmnum ::= plus_num */ - 284, /* (385) nmnum ::= nm */ - 284, /* (386) nmnum ::= ON */ - 284, /* (387) nmnum ::= DELETE */ - 284, /* (388) nmnum ::= DEFAULT */ - 211, /* (389) plus_num ::= INTEGER|FLOAT */ - 289, /* (390) foreach_clause ::= */ - 289, /* (391) foreach_clause ::= FOR EACH ROW */ - 292, /* (392) trnm ::= nm */ - 293, /* (393) tridxby ::= */ - 294, /* (394) database_kw_opt ::= DATABASE */ - 294, /* (395) database_kw_opt ::= */ - 297, /* (396) kwcolumn_opt ::= */ - 297, /* (397) kwcolumn_opt ::= COLUMNKW */ - 299, /* (398) vtabarglist ::= vtabarg */ - 299, /* (399) vtabarglist ::= vtabarglist COMMA vtabarg */ - 300, /* (400) vtabarg ::= vtabarg vtabargtoken */ - 303, /* (401) anylist ::= */ - 303, /* (402) anylist ::= anylist LP anylist RP */ - 303, /* (403) anylist ::= anylist ANY */ - 266, /* (404) with ::= */ + 190, /* (0) explain ::= EXPLAIN */ + 190, /* (1) explain ::= EXPLAIN QUERY PLAN */ + 189, /* (2) cmdx ::= cmd */ + 191, /* (3) cmd ::= BEGIN transtype trans_opt */ + 192, /* (4) transtype ::= */ + 192, /* (5) transtype ::= DEFERRED */ + 192, /* (6) transtype ::= IMMEDIATE */ + 192, /* (7) transtype ::= EXCLUSIVE */ + 191, /* (8) cmd ::= COMMIT|END trans_opt */ + 191, /* (9) cmd ::= ROLLBACK trans_opt */ + 191, /* (10) cmd ::= SAVEPOINT nm */ + 191, /* (11) cmd ::= RELEASE savepoint_opt nm */ + 191, /* (12) cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ + 196, /* (13) create_table ::= createkw temp TABLE ifnotexists nm dbnm */ + 198, /* (14) createkw ::= CREATE */ + 200, /* (15) ifnotexists ::= */ + 200, /* (16) ifnotexists ::= IF NOT EXISTS */ + 199, /* (17) temp ::= TEMP */ + 199, /* (18) temp ::= */ + 197, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_option_set */ + 197, /* (20) create_table_args ::= AS select */ + 204, /* (21) table_option_set ::= */ + 204, /* (22) table_option_set ::= table_option_set COMMA table_option */ + 206, /* (23) table_option ::= WITHOUT nm */ + 206, /* (24) table_option ::= nm */ + 207, /* (25) columnname ::= nm typetoken */ + 209, /* (26) typetoken ::= */ + 209, /* (27) typetoken ::= typename LP signed RP */ + 209, /* (28) typetoken ::= typename LP signed COMMA signed RP */ + 210, /* (29) typename ::= typename ID|STRING */ + 214, /* (30) scanpt ::= */ + 215, /* (31) scantok ::= */ + 216, /* (32) ccons ::= CONSTRAINT nm */ + 216, /* (33) ccons ::= DEFAULT scantok term */ + 216, /* (34) ccons ::= DEFAULT LP expr RP */ + 216, /* (35) ccons ::= DEFAULT PLUS scantok term */ + 216, /* (36) ccons ::= DEFAULT MINUS scantok term */ + 216, /* (37) ccons ::= DEFAULT scantok ID|INDEXED */ + 216, /* (38) ccons ::= NOT NULL onconf */ + 216, /* (39) ccons ::= PRIMARY KEY sortorder onconf autoinc */ + 216, /* (40) ccons ::= UNIQUE onconf */ + 216, /* (41) ccons ::= CHECK LP expr RP */ + 216, /* (42) ccons ::= REFERENCES nm eidlist_opt refargs */ + 216, /* (43) ccons ::= defer_subclause */ + 216, /* (44) ccons ::= COLLATE ID|STRING */ + 225, /* (45) generated ::= LP expr RP */ + 225, /* (46) generated ::= LP expr RP ID */ + 221, /* (47) autoinc ::= */ + 221, /* (48) autoinc ::= AUTOINCR */ + 223, /* (49) refargs ::= */ + 223, /* (50) refargs ::= refargs refarg */ + 226, /* (51) refarg ::= MATCH nm */ + 226, /* (52) refarg ::= ON INSERT refact */ + 226, /* (53) refarg ::= ON DELETE refact */ + 226, /* (54) refarg ::= ON UPDATE refact */ + 227, /* (55) refact ::= SET NULL */ + 227, /* (56) refact ::= SET DEFAULT */ + 227, /* (57) refact ::= CASCADE */ + 227, /* (58) refact ::= RESTRICT */ + 227, /* (59) refact ::= NO ACTION */ + 224, /* (60) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ + 224, /* (61) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ + 228, /* (62) init_deferred_pred_opt ::= */ + 228, /* (63) init_deferred_pred_opt ::= INITIALLY DEFERRED */ + 228, /* (64) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ + 203, /* (65) conslist_opt ::= */ + 230, /* (66) tconscomma ::= COMMA */ + 231, /* (67) tcons ::= CONSTRAINT nm */ + 231, /* (68) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ + 231, /* (69) tcons ::= UNIQUE LP sortlist RP onconf */ + 231, /* (70) tcons ::= CHECK LP expr RP onconf */ + 231, /* (71) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ + 234, /* (72) defer_subclause_opt ::= */ + 219, /* (73) onconf ::= */ + 219, /* (74) onconf ::= ON CONFLICT resolvetype */ + 235, /* (75) orconf ::= */ + 235, /* (76) orconf ::= OR resolvetype */ + 236, /* (77) resolvetype ::= IGNORE */ + 236, /* (78) resolvetype ::= REPLACE */ + 191, /* (79) cmd ::= DROP TABLE ifexists fullname */ + 238, /* (80) ifexists ::= IF EXISTS */ + 238, /* (81) ifexists ::= */ + 191, /* (82) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ + 191, /* (83) cmd ::= DROP VIEW ifexists fullname */ + 191, /* (84) cmd ::= select */ + 205, /* (85) select ::= WITH wqlist selectnowith */ + 205, /* (86) select ::= WITH RECURSIVE wqlist selectnowith */ + 205, /* (87) select ::= selectnowith */ + 240, /* (88) selectnowith ::= selectnowith multiselect_op oneselect */ + 243, /* (89) multiselect_op ::= UNION */ + 243, /* (90) multiselect_op ::= UNION ALL */ + 243, /* (91) multiselect_op ::= EXCEPT|INTERSECT */ + 241, /* (92) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ + 241, /* (93) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ + 253, /* (94) values ::= VALUES LP nexprlist RP */ + 241, /* (95) oneselect ::= mvalues */ + 255, /* (96) mvalues ::= values COMMA LP nexprlist RP */ + 255, /* (97) mvalues ::= mvalues COMMA LP nexprlist RP */ + 244, /* (98) distinct ::= DISTINCT */ + 244, /* (99) distinct ::= ALL */ + 244, /* (100) distinct ::= */ + 256, /* (101) sclp ::= */ + 245, /* (102) selcollist ::= sclp scanpt expr scanpt as */ + 245, /* (103) selcollist ::= sclp scanpt STAR */ + 245, /* (104) selcollist ::= sclp scanpt nm DOT STAR */ + 257, /* (105) as ::= AS nm */ + 257, /* (106) as ::= */ + 246, /* (107) from ::= */ + 246, /* (108) from ::= FROM seltablist */ + 259, /* (109) stl_prefix ::= seltablist joinop */ + 259, /* (110) stl_prefix ::= */ + 258, /* (111) seltablist ::= stl_prefix nm dbnm as on_using */ + 258, /* (112) seltablist ::= stl_prefix nm dbnm as indexed_by on_using */ + 258, /* (113) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using */ + 258, /* (114) seltablist ::= stl_prefix LP select RP as on_using */ + 258, /* (115) seltablist ::= stl_prefix LP seltablist RP as on_using */ + 201, /* (116) dbnm ::= */ + 201, /* (117) dbnm ::= DOT nm */ + 239, /* (118) fullname ::= nm */ + 239, /* (119) fullname ::= nm DOT nm */ + 264, /* (120) xfullname ::= nm */ + 264, /* (121) xfullname ::= nm DOT nm */ + 264, /* (122) xfullname ::= nm DOT nm AS nm */ + 264, /* (123) xfullname ::= nm AS nm */ + 260, /* (124) joinop ::= COMMA|JOIN */ + 260, /* (125) joinop ::= JOIN_KW JOIN */ + 260, /* (126) joinop ::= JOIN_KW nm JOIN */ + 260, /* (127) joinop ::= JOIN_KW nm nm JOIN */ + 261, /* (128) on_using ::= ON expr */ + 261, /* (129) on_using ::= USING LP idlist RP */ + 261, /* (130) on_using ::= */ + 266, /* (131) indexed_opt ::= */ + 262, /* (132) indexed_by ::= INDEXED BY nm */ + 262, /* (133) indexed_by ::= NOT INDEXED */ + 250, /* (134) orderby_opt ::= */ + 250, /* (135) orderby_opt ::= ORDER BY sortlist */ + 232, /* (136) sortlist ::= sortlist COMMA expr sortorder nulls */ + 232, /* (137) sortlist ::= expr sortorder nulls */ + 220, /* (138) sortorder ::= ASC */ + 220, /* (139) sortorder ::= DESC */ + 220, /* (140) sortorder ::= */ + 267, /* (141) nulls ::= NULLS FIRST */ + 267, /* (142) nulls ::= NULLS LAST */ + 267, /* (143) nulls ::= */ + 248, /* (144) groupby_opt ::= */ + 248, /* (145) groupby_opt ::= GROUP BY nexprlist */ + 249, /* (146) having_opt ::= */ + 249, /* (147) having_opt ::= HAVING expr */ + 251, /* (148) limit_opt ::= */ + 251, /* (149) limit_opt ::= LIMIT expr */ + 251, /* (150) limit_opt ::= LIMIT expr OFFSET expr */ + 251, /* (151) limit_opt ::= LIMIT expr COMMA expr */ + 191, /* (152) cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret */ + 247, /* (153) where_opt ::= */ + 247, /* (154) where_opt ::= WHERE expr */ + 269, /* (155) where_opt_ret ::= */ + 269, /* (156) where_opt_ret ::= WHERE expr */ + 269, /* (157) where_opt_ret ::= RETURNING selcollist */ + 269, /* (158) where_opt_ret ::= WHERE expr RETURNING selcollist */ + 191, /* (159) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret */ + 270, /* (160) setlist ::= setlist COMMA nm EQ expr */ + 270, /* (161) setlist ::= setlist COMMA LP idlist RP EQ expr */ + 270, /* (162) setlist ::= nm EQ expr */ + 270, /* (163) setlist ::= LP idlist RP EQ expr */ + 191, /* (164) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ + 191, /* (165) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning */ + 273, /* (166) upsert ::= */ + 273, /* (167) upsert ::= RETURNING selcollist */ + 273, /* (168) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert */ + 273, /* (169) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert */ + 273, /* (170) upsert ::= ON CONFLICT DO NOTHING returning */ + 273, /* (171) upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning */ + 274, /* (172) returning ::= RETURNING selcollist */ + 271, /* (173) insert_cmd ::= INSERT orconf */ + 271, /* (174) insert_cmd ::= REPLACE */ + 272, /* (175) idlist_opt ::= */ + 272, /* (176) idlist_opt ::= LP idlist RP */ + 265, /* (177) idlist ::= idlist COMMA nm */ + 265, /* (178) idlist ::= nm */ + 218, /* (179) expr ::= LP expr RP */ + 218, /* (180) expr ::= ID|INDEXED|JOIN_KW */ + 218, /* (181) expr ::= nm DOT nm */ + 218, /* (182) expr ::= nm DOT nm DOT nm */ + 217, /* (183) term ::= NULL|FLOAT|BLOB */ + 217, /* (184) term ::= STRING */ + 217, /* (185) term ::= INTEGER */ + 218, /* (186) expr ::= VARIABLE */ + 218, /* (187) expr ::= expr COLLATE ID|STRING */ + 218, /* (188) expr ::= CAST LP expr AS typetoken RP */ + 218, /* (189) expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist RP */ + 218, /* (190) expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist ORDER BY sortlist RP */ + 218, /* (191) expr ::= ID|INDEXED|JOIN_KW LP STAR RP */ + 218, /* (192) expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist RP filter_over */ + 218, /* (193) expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist ORDER BY sortlist RP filter_over */ + 218, /* (194) expr ::= ID|INDEXED|JOIN_KW LP STAR RP filter_over */ + 217, /* (195) term ::= CTIME_KW */ + 218, /* (196) expr ::= LP nexprlist COMMA expr RP */ + 218, /* (197) expr ::= expr AND expr */ + 218, /* (198) expr ::= expr OR expr */ + 218, /* (199) expr ::= expr LT|GT|GE|LE expr */ + 218, /* (200) expr ::= expr EQ|NE expr */ + 218, /* (201) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ + 218, /* (202) expr ::= expr PLUS|MINUS expr */ + 218, /* (203) expr ::= expr STAR|SLASH|REM expr */ + 218, /* (204) expr ::= expr CONCAT expr */ + 276, /* (205) likeop ::= NOT LIKE_KW|MATCH */ + 218, /* (206) expr ::= expr likeop expr */ + 218, /* (207) expr ::= expr likeop expr ESCAPE expr */ + 218, /* (208) expr ::= expr ISNULL|NOTNULL */ + 218, /* (209) expr ::= expr NOT NULL */ + 218, /* (210) expr ::= expr IS expr */ + 218, /* (211) expr ::= expr IS NOT expr */ + 218, /* (212) expr ::= expr IS NOT DISTINCT FROM expr */ + 218, /* (213) expr ::= expr IS DISTINCT FROM expr */ + 218, /* (214) expr ::= NOT expr */ + 218, /* (215) expr ::= BITNOT expr */ + 218, /* (216) expr ::= PLUS|MINUS expr */ + 218, /* (217) expr ::= expr PTR expr */ + 277, /* (218) between_op ::= BETWEEN */ + 277, /* (219) between_op ::= NOT BETWEEN */ + 218, /* (220) expr ::= expr between_op expr AND expr */ + 278, /* (221) in_op ::= IN */ + 278, /* (222) in_op ::= NOT IN */ + 218, /* (223) expr ::= expr in_op LP exprlist RP */ + 218, /* (224) expr ::= LP select RP */ + 218, /* (225) expr ::= expr in_op LP select RP */ + 218, /* (226) expr ::= expr in_op nm dbnm paren_exprlist */ + 218, /* (227) expr ::= EXISTS LP select RP */ + 218, /* (228) expr ::= CASE case_operand case_exprlist case_else END */ + 281, /* (229) case_exprlist ::= case_exprlist WHEN expr THEN expr */ + 281, /* (230) case_exprlist ::= WHEN expr THEN expr */ + 282, /* (231) case_else ::= ELSE expr */ + 282, /* (232) case_else ::= */ + 280, /* (233) case_operand ::= */ + 263, /* (234) exprlist ::= */ + 254, /* (235) nexprlist ::= nexprlist COMMA expr */ + 254, /* (236) nexprlist ::= expr */ + 279, /* (237) paren_exprlist ::= */ + 279, /* (238) paren_exprlist ::= LP exprlist RP */ + 191, /* (239) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + 283, /* (240) uniqueflag ::= UNIQUE */ + 283, /* (241) uniqueflag ::= */ + 222, /* (242) eidlist_opt ::= */ + 222, /* (243) eidlist_opt ::= LP eidlist RP */ + 233, /* (244) eidlist ::= eidlist COMMA nm collate sortorder */ + 233, /* (245) eidlist ::= nm collate sortorder */ + 284, /* (246) collate ::= */ + 284, /* (247) collate ::= COLLATE ID|STRING */ + 191, /* (248) cmd ::= DROP INDEX ifexists fullname */ + 191, /* (249) cmd ::= VACUUM vinto */ + 191, /* (250) cmd ::= VACUUM nm vinto */ + 285, /* (251) vinto ::= INTO expr */ + 285, /* (252) vinto ::= */ + 191, /* (253) cmd ::= PRAGMA nm dbnm */ + 191, /* (254) cmd ::= PRAGMA nm dbnm EQ nmnum */ + 191, /* (255) cmd ::= PRAGMA nm dbnm LP nmnum RP */ + 191, /* (256) cmd ::= PRAGMA nm dbnm EQ minus_num */ + 191, /* (257) cmd ::= PRAGMA nm dbnm LP minus_num RP */ + 212, /* (258) plus_num ::= PLUS INTEGER|FLOAT */ + 213, /* (259) minus_num ::= MINUS INTEGER|FLOAT */ + 191, /* (260) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + 287, /* (261) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + 289, /* (262) trigger_time ::= BEFORE|AFTER */ + 289, /* (263) trigger_time ::= INSTEAD OF */ + 289, /* (264) trigger_time ::= */ + 290, /* (265) trigger_event ::= DELETE|INSERT */ + 290, /* (266) trigger_event ::= UPDATE */ + 290, /* (267) trigger_event ::= UPDATE OF idlist */ + 292, /* (268) when_clause ::= */ + 292, /* (269) when_clause ::= WHEN expr */ + 288, /* (270) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + 288, /* (271) trigger_cmd_list ::= trigger_cmd SEMI */ + 294, /* (272) trnm ::= nm DOT nm */ + 295, /* (273) tridxby ::= INDEXED BY nm */ + 295, /* (274) tridxby ::= NOT INDEXED */ + 293, /* (275) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ + 293, /* (276) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + 293, /* (277) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ + 293, /* (278) trigger_cmd ::= scanpt select scanpt */ + 218, /* (279) expr ::= RAISE LP IGNORE RP */ + 218, /* (280) expr ::= RAISE LP raisetype COMMA expr RP */ + 237, /* (281) raisetype ::= ROLLBACK */ + 237, /* (282) raisetype ::= ABORT */ + 237, /* (283) raisetype ::= FAIL */ + 191, /* (284) cmd ::= DROP TRIGGER ifexists fullname */ + 191, /* (285) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + 191, /* (286) cmd ::= DETACH database_kw_opt expr */ + 297, /* (287) key_opt ::= */ + 297, /* (288) key_opt ::= KEY expr */ + 191, /* (289) cmd ::= REINDEX */ + 191, /* (290) cmd ::= REINDEX nm dbnm */ + 191, /* (291) cmd ::= ANALYZE */ + 191, /* (292) cmd ::= ANALYZE nm dbnm */ + 191, /* (293) cmd ::= ALTER TABLE fullname RENAME TO nm */ + 191, /* (294) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + 191, /* (295) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ + 298, /* (296) add_column_fullname ::= fullname */ + 191, /* (297) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + 191, /* (298) cmd ::= create_vtab */ + 191, /* (299) cmd ::= create_vtab LP vtabarglist RP */ + 300, /* (300) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + 302, /* (301) vtabarg ::= */ + 303, /* (302) vtabargtoken ::= ANY */ + 303, /* (303) vtabargtoken ::= lp anylist RP */ + 304, /* (304) lp ::= LP */ + 268, /* (305) with ::= WITH wqlist */ + 268, /* (306) with ::= WITH RECURSIVE wqlist */ + 307, /* (307) wqas ::= AS */ + 307, /* (308) wqas ::= AS MATERIALIZED */ + 307, /* (309) wqas ::= AS NOT MATERIALIZED */ + 306, /* (310) wqitem ::= withnm eidlist_opt wqas LP select RP */ + 308, /* (311) withnm ::= nm */ + 242, /* (312) wqlist ::= wqitem */ + 242, /* (313) wqlist ::= wqlist COMMA wqitem */ + 309, /* (314) windowdefn_list ::= windowdefn_list COMMA windowdefn */ + 310, /* (315) windowdefn ::= nm AS LP window RP */ + 311, /* (316) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ + 311, /* (317) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ + 311, /* (318) window ::= ORDER BY sortlist frame_opt */ + 311, /* (319) window ::= nm ORDER BY sortlist frame_opt */ + 311, /* (320) window ::= nm frame_opt */ + 312, /* (321) frame_opt ::= */ + 312, /* (322) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ + 312, /* (323) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ + 316, /* (324) range_or_rows ::= RANGE|ROWS|GROUPS */ + 318, /* (325) frame_bound_s ::= frame_bound */ + 318, /* (326) frame_bound_s ::= UNBOUNDED PRECEDING */ + 319, /* (327) frame_bound_e ::= frame_bound */ + 319, /* (328) frame_bound_e ::= UNBOUNDED FOLLOWING */ + 317, /* (329) frame_bound ::= expr PRECEDING|FOLLOWING */ + 317, /* (330) frame_bound ::= CURRENT ROW */ + 320, /* (331) frame_exclude_opt ::= */ + 320, /* (332) frame_exclude_opt ::= EXCLUDE frame_exclude */ + 321, /* (333) frame_exclude ::= NO OTHERS */ + 321, /* (334) frame_exclude ::= CURRENT ROW */ + 321, /* (335) frame_exclude ::= GROUP|TIES */ + 252, /* (336) window_clause ::= WINDOW windowdefn_list */ + 275, /* (337) filter_over ::= filter_clause over_clause */ + 275, /* (338) filter_over ::= over_clause */ + 275, /* (339) filter_over ::= filter_clause */ + 315, /* (340) over_clause ::= OVER LP window RP */ + 315, /* (341) over_clause ::= OVER nm */ + 314, /* (342) filter_clause ::= FILTER LP WHERE expr RP */ + 217, /* (343) term ::= QNUMBER */ + 186, /* (344) input ::= cmdlist */ + 187, /* (345) cmdlist ::= cmdlist ecmd */ + 187, /* (346) cmdlist ::= ecmd */ + 188, /* (347) ecmd ::= SEMI */ + 188, /* (348) ecmd ::= cmdx SEMI */ + 188, /* (349) ecmd ::= explain cmdx SEMI */ + 193, /* (350) trans_opt ::= */ + 193, /* (351) trans_opt ::= TRANSACTION */ + 193, /* (352) trans_opt ::= TRANSACTION nm */ + 195, /* (353) savepoint_opt ::= SAVEPOINT */ + 195, /* (354) savepoint_opt ::= */ + 191, /* (355) cmd ::= create_table create_table_args */ + 204, /* (356) table_option_set ::= table_option */ + 202, /* (357) columnlist ::= columnlist COMMA columnname carglist */ + 202, /* (358) columnlist ::= columnname carglist */ + 194, /* (359) nm ::= ID|INDEXED|JOIN_KW */ + 194, /* (360) nm ::= STRING */ + 209, /* (361) typetoken ::= typename */ + 210, /* (362) typename ::= ID|STRING */ + 211, /* (363) signed ::= plus_num */ + 211, /* (364) signed ::= minus_num */ + 208, /* (365) carglist ::= carglist ccons */ + 208, /* (366) carglist ::= */ + 216, /* (367) ccons ::= NULL onconf */ + 216, /* (368) ccons ::= GENERATED ALWAYS AS generated */ + 216, /* (369) ccons ::= AS generated */ + 203, /* (370) conslist_opt ::= COMMA conslist */ + 229, /* (371) conslist ::= conslist tconscomma tcons */ + 229, /* (372) conslist ::= tcons */ + 230, /* (373) tconscomma ::= */ + 234, /* (374) defer_subclause_opt ::= defer_subclause */ + 236, /* (375) resolvetype ::= raisetype */ + 240, /* (376) selectnowith ::= oneselect */ + 241, /* (377) oneselect ::= values */ + 256, /* (378) sclp ::= selcollist COMMA */ + 257, /* (379) as ::= ID|STRING */ + 266, /* (380) indexed_opt ::= indexed_by */ + 274, /* (381) returning ::= */ + 218, /* (382) expr ::= term */ + 276, /* (383) likeop ::= LIKE_KW|MATCH */ + 280, /* (384) case_operand ::= expr */ + 263, /* (385) exprlist ::= nexprlist */ + 286, /* (386) nmnum ::= plus_num */ + 286, /* (387) nmnum ::= nm */ + 286, /* (388) nmnum ::= ON */ + 286, /* (389) nmnum ::= DELETE */ + 286, /* (390) nmnum ::= DEFAULT */ + 212, /* (391) plus_num ::= INTEGER|FLOAT */ + 291, /* (392) foreach_clause ::= */ + 291, /* (393) foreach_clause ::= FOR EACH ROW */ + 294, /* (394) trnm ::= nm */ + 295, /* (395) tridxby ::= */ + 296, /* (396) database_kw_opt ::= DATABASE */ + 296, /* (397) database_kw_opt ::= */ + 299, /* (398) kwcolumn_opt ::= */ + 299, /* (399) kwcolumn_opt ::= COLUMNKW */ + 301, /* (400) vtabarglist ::= vtabarg */ + 301, /* (401) vtabarglist ::= vtabarglist COMMA vtabarg */ + 302, /* (402) vtabarg ::= vtabarg vtabargtoken */ + 305, /* (403) anylist ::= */ + 305, /* (404) anylist ::= anylist LP anylist RP */ + 305, /* (405) anylist ::= anylist ANY */ + 268, /* (406) with ::= */ + 309, /* (407) windowdefn_list ::= windowdefn */ + 311, /* (408) window ::= frame_opt */ }; /* For rule J, yyRuleInfoNRhs[J] contains the negative of the number @@ -170045,316 +177104,320 @@ static const signed char yyRuleInfoNRhs[] = { -9, /* (92) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ -10, /* (93) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ -4, /* (94) values ::= VALUES LP nexprlist RP */ - -5, /* (95) values ::= values COMMA LP nexprlist RP */ - -1, /* (96) distinct ::= DISTINCT */ - -1, /* (97) distinct ::= ALL */ - 0, /* (98) distinct ::= */ - 0, /* (99) sclp ::= */ - -5, /* (100) selcollist ::= sclp scanpt expr scanpt as */ - -3, /* (101) selcollist ::= sclp scanpt STAR */ - -5, /* (102) selcollist ::= sclp scanpt nm DOT STAR */ - -2, /* (103) as ::= AS nm */ - 0, /* (104) as ::= */ - 0, /* (105) from ::= */ - -2, /* (106) from ::= FROM seltablist */ - -2, /* (107) stl_prefix ::= seltablist joinop */ - 0, /* (108) stl_prefix ::= */ - -5, /* (109) seltablist ::= stl_prefix nm dbnm as on_using */ - -6, /* (110) seltablist ::= stl_prefix nm dbnm as indexed_by on_using */ - -8, /* (111) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using */ - -6, /* (112) seltablist ::= stl_prefix LP select RP as on_using */ - -6, /* (113) seltablist ::= stl_prefix LP seltablist RP as on_using */ - 0, /* (114) dbnm ::= */ - -2, /* (115) dbnm ::= DOT nm */ - -1, /* (116) fullname ::= nm */ - -3, /* (117) fullname ::= nm DOT nm */ - -1, /* (118) xfullname ::= nm */ - -3, /* (119) xfullname ::= nm DOT nm */ - -5, /* (120) xfullname ::= nm DOT nm AS nm */ - -3, /* (121) xfullname ::= nm AS nm */ - -1, /* (122) joinop ::= COMMA|JOIN */ - -2, /* (123) joinop ::= JOIN_KW JOIN */ - -3, /* (124) joinop ::= JOIN_KW nm JOIN */ - -4, /* (125) joinop ::= JOIN_KW nm nm JOIN */ - -2, /* (126) on_using ::= ON expr */ - -4, /* (127) on_using ::= USING LP idlist RP */ - 0, /* (128) on_using ::= */ - 0, /* (129) indexed_opt ::= */ - -3, /* (130) indexed_by ::= INDEXED BY nm */ - -2, /* (131) indexed_by ::= NOT INDEXED */ - 0, /* (132) orderby_opt ::= */ - -3, /* (133) orderby_opt ::= ORDER BY sortlist */ - -5, /* (134) sortlist ::= sortlist COMMA expr sortorder nulls */ - -3, /* (135) sortlist ::= expr sortorder nulls */ - -1, /* (136) sortorder ::= ASC */ - -1, /* (137) sortorder ::= DESC */ - 0, /* (138) sortorder ::= */ - -2, /* (139) nulls ::= NULLS FIRST */ - -2, /* (140) nulls ::= NULLS LAST */ - 0, /* (141) nulls ::= */ - 0, /* (142) groupby_opt ::= */ - -3, /* (143) groupby_opt ::= GROUP BY nexprlist */ - 0, /* (144) having_opt ::= */ - -2, /* (145) having_opt ::= HAVING expr */ - 0, /* (146) limit_opt ::= */ - -2, /* (147) limit_opt ::= LIMIT expr */ - -4, /* (148) limit_opt ::= LIMIT expr OFFSET expr */ - -4, /* (149) limit_opt ::= LIMIT expr COMMA expr */ - -6, /* (150) cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret */ - 0, /* (151) where_opt ::= */ - -2, /* (152) where_opt ::= WHERE expr */ - 0, /* (153) where_opt_ret ::= */ - -2, /* (154) where_opt_ret ::= WHERE expr */ - -2, /* (155) where_opt_ret ::= RETURNING selcollist */ - -4, /* (156) where_opt_ret ::= WHERE expr RETURNING selcollist */ - -9, /* (157) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret */ - -5, /* (158) setlist ::= setlist COMMA nm EQ expr */ - -7, /* (159) setlist ::= setlist COMMA LP idlist RP EQ expr */ - -3, /* (160) setlist ::= nm EQ expr */ - -5, /* (161) setlist ::= LP idlist RP EQ expr */ - -7, /* (162) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ - -8, /* (163) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning */ - 0, /* (164) upsert ::= */ - -2, /* (165) upsert ::= RETURNING selcollist */ - -12, /* (166) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert */ - -9, /* (167) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert */ - -5, /* (168) upsert ::= ON CONFLICT DO NOTHING returning */ - -8, /* (169) upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning */ - -2, /* (170) returning ::= RETURNING selcollist */ - -2, /* (171) insert_cmd ::= INSERT orconf */ - -1, /* (172) insert_cmd ::= REPLACE */ - 0, /* (173) idlist_opt ::= */ - -3, /* (174) idlist_opt ::= LP idlist RP */ - -3, /* (175) idlist ::= idlist COMMA nm */ - -1, /* (176) idlist ::= nm */ - -3, /* (177) expr ::= LP expr RP */ - -1, /* (178) expr ::= ID|INDEXED */ - -1, /* (179) expr ::= JOIN_KW */ - -3, /* (180) expr ::= nm DOT nm */ - -5, /* (181) expr ::= nm DOT nm DOT nm */ - -1, /* (182) term ::= NULL|FLOAT|BLOB */ - -1, /* (183) term ::= STRING */ - -1, /* (184) term ::= INTEGER */ - -1, /* (185) expr ::= VARIABLE */ - -3, /* (186) expr ::= expr COLLATE ID|STRING */ - -6, /* (187) expr ::= CAST LP expr AS typetoken RP */ - -5, /* (188) expr ::= ID|INDEXED LP distinct exprlist RP */ - -4, /* (189) expr ::= ID|INDEXED LP STAR RP */ - -6, /* (190) expr ::= ID|INDEXED LP distinct exprlist RP filter_over */ - -5, /* (191) expr ::= ID|INDEXED LP STAR RP filter_over */ - -1, /* (192) term ::= CTIME_KW */ - -5, /* (193) expr ::= LP nexprlist COMMA expr RP */ - -3, /* (194) expr ::= expr AND expr */ - -3, /* (195) expr ::= expr OR expr */ - -3, /* (196) expr ::= expr LT|GT|GE|LE expr */ - -3, /* (197) expr ::= expr EQ|NE expr */ - -3, /* (198) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ - -3, /* (199) expr ::= expr PLUS|MINUS expr */ - -3, /* (200) expr ::= expr STAR|SLASH|REM expr */ - -3, /* (201) expr ::= expr CONCAT expr */ - -2, /* (202) likeop ::= NOT LIKE_KW|MATCH */ - -3, /* (203) expr ::= expr likeop expr */ - -5, /* (204) expr ::= expr likeop expr ESCAPE expr */ - -2, /* (205) expr ::= expr ISNULL|NOTNULL */ - -3, /* (206) expr ::= expr NOT NULL */ - -3, /* (207) expr ::= expr IS expr */ - -4, /* (208) expr ::= expr IS NOT expr */ - -6, /* (209) expr ::= expr IS NOT DISTINCT FROM expr */ - -5, /* (210) expr ::= expr IS DISTINCT FROM expr */ - -2, /* (211) expr ::= NOT expr */ - -2, /* (212) expr ::= BITNOT expr */ - -2, /* (213) expr ::= PLUS|MINUS expr */ - -3, /* (214) expr ::= expr PTR expr */ - -1, /* (215) between_op ::= BETWEEN */ - -2, /* (216) between_op ::= NOT BETWEEN */ - -5, /* (217) expr ::= expr between_op expr AND expr */ - -1, /* (218) in_op ::= IN */ - -2, /* (219) in_op ::= NOT IN */ - -5, /* (220) expr ::= expr in_op LP exprlist RP */ - -3, /* (221) expr ::= LP select RP */ - -5, /* (222) expr ::= expr in_op LP select RP */ - -5, /* (223) expr ::= expr in_op nm dbnm paren_exprlist */ - -4, /* (224) expr ::= EXISTS LP select RP */ - -5, /* (225) expr ::= CASE case_operand case_exprlist case_else END */ - -5, /* (226) case_exprlist ::= case_exprlist WHEN expr THEN expr */ - -4, /* (227) case_exprlist ::= WHEN expr THEN expr */ - -2, /* (228) case_else ::= ELSE expr */ - 0, /* (229) case_else ::= */ - -1, /* (230) case_operand ::= expr */ - 0, /* (231) case_operand ::= */ - 0, /* (232) exprlist ::= */ - -3, /* (233) nexprlist ::= nexprlist COMMA expr */ - -1, /* (234) nexprlist ::= expr */ - 0, /* (235) paren_exprlist ::= */ - -3, /* (236) paren_exprlist ::= LP exprlist RP */ - -12, /* (237) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ - -1, /* (238) uniqueflag ::= UNIQUE */ - 0, /* (239) uniqueflag ::= */ - 0, /* (240) eidlist_opt ::= */ - -3, /* (241) eidlist_opt ::= LP eidlist RP */ - -5, /* (242) eidlist ::= eidlist COMMA nm collate sortorder */ - -3, /* (243) eidlist ::= nm collate sortorder */ - 0, /* (244) collate ::= */ - -2, /* (245) collate ::= COLLATE ID|STRING */ - -4, /* (246) cmd ::= DROP INDEX ifexists fullname */ - -2, /* (247) cmd ::= VACUUM vinto */ - -3, /* (248) cmd ::= VACUUM nm vinto */ - -2, /* (249) vinto ::= INTO expr */ - 0, /* (250) vinto ::= */ - -3, /* (251) cmd ::= PRAGMA nm dbnm */ - -5, /* (252) cmd ::= PRAGMA nm dbnm EQ nmnum */ - -6, /* (253) cmd ::= PRAGMA nm dbnm LP nmnum RP */ - -5, /* (254) cmd ::= PRAGMA nm dbnm EQ minus_num */ - -6, /* (255) cmd ::= PRAGMA nm dbnm LP minus_num RP */ - -2, /* (256) plus_num ::= PLUS INTEGER|FLOAT */ - -2, /* (257) minus_num ::= MINUS INTEGER|FLOAT */ - -5, /* (258) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ - -11, /* (259) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ - -1, /* (260) trigger_time ::= BEFORE|AFTER */ - -2, /* (261) trigger_time ::= INSTEAD OF */ - 0, /* (262) trigger_time ::= */ - -1, /* (263) trigger_event ::= DELETE|INSERT */ - -1, /* (264) trigger_event ::= UPDATE */ - -3, /* (265) trigger_event ::= UPDATE OF idlist */ - 0, /* (266) when_clause ::= */ - -2, /* (267) when_clause ::= WHEN expr */ - -3, /* (268) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ - -2, /* (269) trigger_cmd_list ::= trigger_cmd SEMI */ - -3, /* (270) trnm ::= nm DOT nm */ - -3, /* (271) tridxby ::= INDEXED BY nm */ - -2, /* (272) tridxby ::= NOT INDEXED */ - -9, /* (273) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ - -8, /* (274) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ - -6, /* (275) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ - -3, /* (276) trigger_cmd ::= scanpt select scanpt */ - -4, /* (277) expr ::= RAISE LP IGNORE RP */ - -6, /* (278) expr ::= RAISE LP raisetype COMMA nm RP */ - -1, /* (279) raisetype ::= ROLLBACK */ - -1, /* (280) raisetype ::= ABORT */ - -1, /* (281) raisetype ::= FAIL */ - -4, /* (282) cmd ::= DROP TRIGGER ifexists fullname */ - -6, /* (283) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ - -3, /* (284) cmd ::= DETACH database_kw_opt expr */ - 0, /* (285) key_opt ::= */ - -2, /* (286) key_opt ::= KEY expr */ - -1, /* (287) cmd ::= REINDEX */ - -3, /* (288) cmd ::= REINDEX nm dbnm */ - -1, /* (289) cmd ::= ANALYZE */ - -3, /* (290) cmd ::= ANALYZE nm dbnm */ - -6, /* (291) cmd ::= ALTER TABLE fullname RENAME TO nm */ - -7, /* (292) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ - -6, /* (293) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ - -1, /* (294) add_column_fullname ::= fullname */ - -8, /* (295) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ - -1, /* (296) cmd ::= create_vtab */ - -4, /* (297) cmd ::= create_vtab LP vtabarglist RP */ - -8, /* (298) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ - 0, /* (299) vtabarg ::= */ - -1, /* (300) vtabargtoken ::= ANY */ - -3, /* (301) vtabargtoken ::= lp anylist RP */ - -1, /* (302) lp ::= LP */ - -2, /* (303) with ::= WITH wqlist */ - -3, /* (304) with ::= WITH RECURSIVE wqlist */ - -1, /* (305) wqas ::= AS */ - -2, /* (306) wqas ::= AS MATERIALIZED */ - -3, /* (307) wqas ::= AS NOT MATERIALIZED */ - -6, /* (308) wqitem ::= nm eidlist_opt wqas LP select RP */ - -1, /* (309) wqlist ::= wqitem */ - -3, /* (310) wqlist ::= wqlist COMMA wqitem */ - -1, /* (311) windowdefn_list ::= windowdefn */ - -3, /* (312) windowdefn_list ::= windowdefn_list COMMA windowdefn */ - -5, /* (313) windowdefn ::= nm AS LP window RP */ - -5, /* (314) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ - -6, /* (315) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ - -4, /* (316) window ::= ORDER BY sortlist frame_opt */ - -5, /* (317) window ::= nm ORDER BY sortlist frame_opt */ - -1, /* (318) window ::= frame_opt */ - -2, /* (319) window ::= nm frame_opt */ - 0, /* (320) frame_opt ::= */ - -3, /* (321) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ - -6, /* (322) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ - -1, /* (323) range_or_rows ::= RANGE|ROWS|GROUPS */ - -1, /* (324) frame_bound_s ::= frame_bound */ - -2, /* (325) frame_bound_s ::= UNBOUNDED PRECEDING */ - -1, /* (326) frame_bound_e ::= frame_bound */ - -2, /* (327) frame_bound_e ::= UNBOUNDED FOLLOWING */ - -2, /* (328) frame_bound ::= expr PRECEDING|FOLLOWING */ - -2, /* (329) frame_bound ::= CURRENT ROW */ - 0, /* (330) frame_exclude_opt ::= */ - -2, /* (331) frame_exclude_opt ::= EXCLUDE frame_exclude */ - -2, /* (332) frame_exclude ::= NO OTHERS */ - -2, /* (333) frame_exclude ::= CURRENT ROW */ - -1, /* (334) frame_exclude ::= GROUP|TIES */ - -2, /* (335) window_clause ::= WINDOW windowdefn_list */ - -2, /* (336) filter_over ::= filter_clause over_clause */ - -1, /* (337) filter_over ::= over_clause */ - -1, /* (338) filter_over ::= filter_clause */ - -4, /* (339) over_clause ::= OVER LP window RP */ - -2, /* (340) over_clause ::= OVER nm */ - -5, /* (341) filter_clause ::= FILTER LP WHERE expr RP */ - -1, /* (342) input ::= cmdlist */ - -2, /* (343) cmdlist ::= cmdlist ecmd */ - -1, /* (344) cmdlist ::= ecmd */ - -1, /* (345) ecmd ::= SEMI */ - -2, /* (346) ecmd ::= cmdx SEMI */ - -3, /* (347) ecmd ::= explain cmdx SEMI */ - 0, /* (348) trans_opt ::= */ - -1, /* (349) trans_opt ::= TRANSACTION */ - -2, /* (350) trans_opt ::= TRANSACTION nm */ - -1, /* (351) savepoint_opt ::= SAVEPOINT */ - 0, /* (352) savepoint_opt ::= */ - -2, /* (353) cmd ::= create_table create_table_args */ - -1, /* (354) table_option_set ::= table_option */ - -4, /* (355) columnlist ::= columnlist COMMA columnname carglist */ - -2, /* (356) columnlist ::= columnname carglist */ - -1, /* (357) nm ::= ID|INDEXED */ - -1, /* (358) nm ::= STRING */ - -1, /* (359) nm ::= JOIN_KW */ - -1, /* (360) typetoken ::= typename */ - -1, /* (361) typename ::= ID|STRING */ - -1, /* (362) signed ::= plus_num */ - -1, /* (363) signed ::= minus_num */ - -2, /* (364) carglist ::= carglist ccons */ - 0, /* (365) carglist ::= */ - -2, /* (366) ccons ::= NULL onconf */ - -4, /* (367) ccons ::= GENERATED ALWAYS AS generated */ - -2, /* (368) ccons ::= AS generated */ - -2, /* (369) conslist_opt ::= COMMA conslist */ - -3, /* (370) conslist ::= conslist tconscomma tcons */ - -1, /* (371) conslist ::= tcons */ - 0, /* (372) tconscomma ::= */ - -1, /* (373) defer_subclause_opt ::= defer_subclause */ - -1, /* (374) resolvetype ::= raisetype */ - -1, /* (375) selectnowith ::= oneselect */ - -1, /* (376) oneselect ::= values */ - -2, /* (377) sclp ::= selcollist COMMA */ - -1, /* (378) as ::= ID|STRING */ - -1, /* (379) indexed_opt ::= indexed_by */ - 0, /* (380) returning ::= */ - -1, /* (381) expr ::= term */ - -1, /* (382) likeop ::= LIKE_KW|MATCH */ - -1, /* (383) exprlist ::= nexprlist */ - -1, /* (384) nmnum ::= plus_num */ - -1, /* (385) nmnum ::= nm */ - -1, /* (386) nmnum ::= ON */ - -1, /* (387) nmnum ::= DELETE */ - -1, /* (388) nmnum ::= DEFAULT */ - -1, /* (389) plus_num ::= INTEGER|FLOAT */ - 0, /* (390) foreach_clause ::= */ - -3, /* (391) foreach_clause ::= FOR EACH ROW */ - -1, /* (392) trnm ::= nm */ - 0, /* (393) tridxby ::= */ - -1, /* (394) database_kw_opt ::= DATABASE */ - 0, /* (395) database_kw_opt ::= */ - 0, /* (396) kwcolumn_opt ::= */ - -1, /* (397) kwcolumn_opt ::= COLUMNKW */ - -1, /* (398) vtabarglist ::= vtabarg */ - -3, /* (399) vtabarglist ::= vtabarglist COMMA vtabarg */ - -2, /* (400) vtabarg ::= vtabarg vtabargtoken */ - 0, /* (401) anylist ::= */ - -4, /* (402) anylist ::= anylist LP anylist RP */ - -2, /* (403) anylist ::= anylist ANY */ - 0, /* (404) with ::= */ + -1, /* (95) oneselect ::= mvalues */ + -5, /* (96) mvalues ::= values COMMA LP nexprlist RP */ + -5, /* (97) mvalues ::= mvalues COMMA LP nexprlist RP */ + -1, /* (98) distinct ::= DISTINCT */ + -1, /* (99) distinct ::= ALL */ + 0, /* (100) distinct ::= */ + 0, /* (101) sclp ::= */ + -5, /* (102) selcollist ::= sclp scanpt expr scanpt as */ + -3, /* (103) selcollist ::= sclp scanpt STAR */ + -5, /* (104) selcollist ::= sclp scanpt nm DOT STAR */ + -2, /* (105) as ::= AS nm */ + 0, /* (106) as ::= */ + 0, /* (107) from ::= */ + -2, /* (108) from ::= FROM seltablist */ + -2, /* (109) stl_prefix ::= seltablist joinop */ + 0, /* (110) stl_prefix ::= */ + -5, /* (111) seltablist ::= stl_prefix nm dbnm as on_using */ + -6, /* (112) seltablist ::= stl_prefix nm dbnm as indexed_by on_using */ + -8, /* (113) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using */ + -6, /* (114) seltablist ::= stl_prefix LP select RP as on_using */ + -6, /* (115) seltablist ::= stl_prefix LP seltablist RP as on_using */ + 0, /* (116) dbnm ::= */ + -2, /* (117) dbnm ::= DOT nm */ + -1, /* (118) fullname ::= nm */ + -3, /* (119) fullname ::= nm DOT nm */ + -1, /* (120) xfullname ::= nm */ + -3, /* (121) xfullname ::= nm DOT nm */ + -5, /* (122) xfullname ::= nm DOT nm AS nm */ + -3, /* (123) xfullname ::= nm AS nm */ + -1, /* (124) joinop ::= COMMA|JOIN */ + -2, /* (125) joinop ::= JOIN_KW JOIN */ + -3, /* (126) joinop ::= JOIN_KW nm JOIN */ + -4, /* (127) joinop ::= JOIN_KW nm nm JOIN */ + -2, /* (128) on_using ::= ON expr */ + -4, /* (129) on_using ::= USING LP idlist RP */ + 0, /* (130) on_using ::= */ + 0, /* (131) indexed_opt ::= */ + -3, /* (132) indexed_by ::= INDEXED BY nm */ + -2, /* (133) indexed_by ::= NOT INDEXED */ + 0, /* (134) orderby_opt ::= */ + -3, /* (135) orderby_opt ::= ORDER BY sortlist */ + -5, /* (136) sortlist ::= sortlist COMMA expr sortorder nulls */ + -3, /* (137) sortlist ::= expr sortorder nulls */ + -1, /* (138) sortorder ::= ASC */ + -1, /* (139) sortorder ::= DESC */ + 0, /* (140) sortorder ::= */ + -2, /* (141) nulls ::= NULLS FIRST */ + -2, /* (142) nulls ::= NULLS LAST */ + 0, /* (143) nulls ::= */ + 0, /* (144) groupby_opt ::= */ + -3, /* (145) groupby_opt ::= GROUP BY nexprlist */ + 0, /* (146) having_opt ::= */ + -2, /* (147) having_opt ::= HAVING expr */ + 0, /* (148) limit_opt ::= */ + -2, /* (149) limit_opt ::= LIMIT expr */ + -4, /* (150) limit_opt ::= LIMIT expr OFFSET expr */ + -4, /* (151) limit_opt ::= LIMIT expr COMMA expr */ + -6, /* (152) cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret */ + 0, /* (153) where_opt ::= */ + -2, /* (154) where_opt ::= WHERE expr */ + 0, /* (155) where_opt_ret ::= */ + -2, /* (156) where_opt_ret ::= WHERE expr */ + -2, /* (157) where_opt_ret ::= RETURNING selcollist */ + -4, /* (158) where_opt_ret ::= WHERE expr RETURNING selcollist */ + -9, /* (159) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret */ + -5, /* (160) setlist ::= setlist COMMA nm EQ expr */ + -7, /* (161) setlist ::= setlist COMMA LP idlist RP EQ expr */ + -3, /* (162) setlist ::= nm EQ expr */ + -5, /* (163) setlist ::= LP idlist RP EQ expr */ + -7, /* (164) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ + -8, /* (165) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning */ + 0, /* (166) upsert ::= */ + -2, /* (167) upsert ::= RETURNING selcollist */ + -12, /* (168) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert */ + -9, /* (169) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert */ + -5, /* (170) upsert ::= ON CONFLICT DO NOTHING returning */ + -8, /* (171) upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning */ + -2, /* (172) returning ::= RETURNING selcollist */ + -2, /* (173) insert_cmd ::= INSERT orconf */ + -1, /* (174) insert_cmd ::= REPLACE */ + 0, /* (175) idlist_opt ::= */ + -3, /* (176) idlist_opt ::= LP idlist RP */ + -3, /* (177) idlist ::= idlist COMMA nm */ + -1, /* (178) idlist ::= nm */ + -3, /* (179) expr ::= LP expr RP */ + -1, /* (180) expr ::= ID|INDEXED|JOIN_KW */ + -3, /* (181) expr ::= nm DOT nm */ + -5, /* (182) expr ::= nm DOT nm DOT nm */ + -1, /* (183) term ::= NULL|FLOAT|BLOB */ + -1, /* (184) term ::= STRING */ + -1, /* (185) term ::= INTEGER */ + -1, /* (186) expr ::= VARIABLE */ + -3, /* (187) expr ::= expr COLLATE ID|STRING */ + -6, /* (188) expr ::= CAST LP expr AS typetoken RP */ + -5, /* (189) expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist RP */ + -8, /* (190) expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist ORDER BY sortlist RP */ + -4, /* (191) expr ::= ID|INDEXED|JOIN_KW LP STAR RP */ + -6, /* (192) expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist RP filter_over */ + -9, /* (193) expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist ORDER BY sortlist RP filter_over */ + -5, /* (194) expr ::= ID|INDEXED|JOIN_KW LP STAR RP filter_over */ + -1, /* (195) term ::= CTIME_KW */ + -5, /* (196) expr ::= LP nexprlist COMMA expr RP */ + -3, /* (197) expr ::= expr AND expr */ + -3, /* (198) expr ::= expr OR expr */ + -3, /* (199) expr ::= expr LT|GT|GE|LE expr */ + -3, /* (200) expr ::= expr EQ|NE expr */ + -3, /* (201) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ + -3, /* (202) expr ::= expr PLUS|MINUS expr */ + -3, /* (203) expr ::= expr STAR|SLASH|REM expr */ + -3, /* (204) expr ::= expr CONCAT expr */ + -2, /* (205) likeop ::= NOT LIKE_KW|MATCH */ + -3, /* (206) expr ::= expr likeop expr */ + -5, /* (207) expr ::= expr likeop expr ESCAPE expr */ + -2, /* (208) expr ::= expr ISNULL|NOTNULL */ + -3, /* (209) expr ::= expr NOT NULL */ + -3, /* (210) expr ::= expr IS expr */ + -4, /* (211) expr ::= expr IS NOT expr */ + -6, /* (212) expr ::= expr IS NOT DISTINCT FROM expr */ + -5, /* (213) expr ::= expr IS DISTINCT FROM expr */ + -2, /* (214) expr ::= NOT expr */ + -2, /* (215) expr ::= BITNOT expr */ + -2, /* (216) expr ::= PLUS|MINUS expr */ + -3, /* (217) expr ::= expr PTR expr */ + -1, /* (218) between_op ::= BETWEEN */ + -2, /* (219) between_op ::= NOT BETWEEN */ + -5, /* (220) expr ::= expr between_op expr AND expr */ + -1, /* (221) in_op ::= IN */ + -2, /* (222) in_op ::= NOT IN */ + -5, /* (223) expr ::= expr in_op LP exprlist RP */ + -3, /* (224) expr ::= LP select RP */ + -5, /* (225) expr ::= expr in_op LP select RP */ + -5, /* (226) expr ::= expr in_op nm dbnm paren_exprlist */ + -4, /* (227) expr ::= EXISTS LP select RP */ + -5, /* (228) expr ::= CASE case_operand case_exprlist case_else END */ + -5, /* (229) case_exprlist ::= case_exprlist WHEN expr THEN expr */ + -4, /* (230) case_exprlist ::= WHEN expr THEN expr */ + -2, /* (231) case_else ::= ELSE expr */ + 0, /* (232) case_else ::= */ + 0, /* (233) case_operand ::= */ + 0, /* (234) exprlist ::= */ + -3, /* (235) nexprlist ::= nexprlist COMMA expr */ + -1, /* (236) nexprlist ::= expr */ + 0, /* (237) paren_exprlist ::= */ + -3, /* (238) paren_exprlist ::= LP exprlist RP */ + -12, /* (239) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + -1, /* (240) uniqueflag ::= UNIQUE */ + 0, /* (241) uniqueflag ::= */ + 0, /* (242) eidlist_opt ::= */ + -3, /* (243) eidlist_opt ::= LP eidlist RP */ + -5, /* (244) eidlist ::= eidlist COMMA nm collate sortorder */ + -3, /* (245) eidlist ::= nm collate sortorder */ + 0, /* (246) collate ::= */ + -2, /* (247) collate ::= COLLATE ID|STRING */ + -4, /* (248) cmd ::= DROP INDEX ifexists fullname */ + -2, /* (249) cmd ::= VACUUM vinto */ + -3, /* (250) cmd ::= VACUUM nm vinto */ + -2, /* (251) vinto ::= INTO expr */ + 0, /* (252) vinto ::= */ + -3, /* (253) cmd ::= PRAGMA nm dbnm */ + -5, /* (254) cmd ::= PRAGMA nm dbnm EQ nmnum */ + -6, /* (255) cmd ::= PRAGMA nm dbnm LP nmnum RP */ + -5, /* (256) cmd ::= PRAGMA nm dbnm EQ minus_num */ + -6, /* (257) cmd ::= PRAGMA nm dbnm LP minus_num RP */ + -2, /* (258) plus_num ::= PLUS INTEGER|FLOAT */ + -2, /* (259) minus_num ::= MINUS INTEGER|FLOAT */ + -5, /* (260) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + -11, /* (261) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + -1, /* (262) trigger_time ::= BEFORE|AFTER */ + -2, /* (263) trigger_time ::= INSTEAD OF */ + 0, /* (264) trigger_time ::= */ + -1, /* (265) trigger_event ::= DELETE|INSERT */ + -1, /* (266) trigger_event ::= UPDATE */ + -3, /* (267) trigger_event ::= UPDATE OF idlist */ + 0, /* (268) when_clause ::= */ + -2, /* (269) when_clause ::= WHEN expr */ + -3, /* (270) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + -2, /* (271) trigger_cmd_list ::= trigger_cmd SEMI */ + -3, /* (272) trnm ::= nm DOT nm */ + -3, /* (273) tridxby ::= INDEXED BY nm */ + -2, /* (274) tridxby ::= NOT INDEXED */ + -9, /* (275) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ + -8, /* (276) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + -6, /* (277) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ + -3, /* (278) trigger_cmd ::= scanpt select scanpt */ + -4, /* (279) expr ::= RAISE LP IGNORE RP */ + -6, /* (280) expr ::= RAISE LP raisetype COMMA expr RP */ + -1, /* (281) raisetype ::= ROLLBACK */ + -1, /* (282) raisetype ::= ABORT */ + -1, /* (283) raisetype ::= FAIL */ + -4, /* (284) cmd ::= DROP TRIGGER ifexists fullname */ + -6, /* (285) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + -3, /* (286) cmd ::= DETACH database_kw_opt expr */ + 0, /* (287) key_opt ::= */ + -2, /* (288) key_opt ::= KEY expr */ + -1, /* (289) cmd ::= REINDEX */ + -3, /* (290) cmd ::= REINDEX nm dbnm */ + -1, /* (291) cmd ::= ANALYZE */ + -3, /* (292) cmd ::= ANALYZE nm dbnm */ + -6, /* (293) cmd ::= ALTER TABLE fullname RENAME TO nm */ + -7, /* (294) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + -6, /* (295) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ + -1, /* (296) add_column_fullname ::= fullname */ + -8, /* (297) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + -1, /* (298) cmd ::= create_vtab */ + -4, /* (299) cmd ::= create_vtab LP vtabarglist RP */ + -8, /* (300) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + 0, /* (301) vtabarg ::= */ + -1, /* (302) vtabargtoken ::= ANY */ + -3, /* (303) vtabargtoken ::= lp anylist RP */ + -1, /* (304) lp ::= LP */ + -2, /* (305) with ::= WITH wqlist */ + -3, /* (306) with ::= WITH RECURSIVE wqlist */ + -1, /* (307) wqas ::= AS */ + -2, /* (308) wqas ::= AS MATERIALIZED */ + -3, /* (309) wqas ::= AS NOT MATERIALIZED */ + -6, /* (310) wqitem ::= withnm eidlist_opt wqas LP select RP */ + -1, /* (311) withnm ::= nm */ + -1, /* (312) wqlist ::= wqitem */ + -3, /* (313) wqlist ::= wqlist COMMA wqitem */ + -3, /* (314) windowdefn_list ::= windowdefn_list COMMA windowdefn */ + -5, /* (315) windowdefn ::= nm AS LP window RP */ + -5, /* (316) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ + -6, /* (317) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ + -4, /* (318) window ::= ORDER BY sortlist frame_opt */ + -5, /* (319) window ::= nm ORDER BY sortlist frame_opt */ + -2, /* (320) window ::= nm frame_opt */ + 0, /* (321) frame_opt ::= */ + -3, /* (322) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ + -6, /* (323) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ + -1, /* (324) range_or_rows ::= RANGE|ROWS|GROUPS */ + -1, /* (325) frame_bound_s ::= frame_bound */ + -2, /* (326) frame_bound_s ::= UNBOUNDED PRECEDING */ + -1, /* (327) frame_bound_e ::= frame_bound */ + -2, /* (328) frame_bound_e ::= UNBOUNDED FOLLOWING */ + -2, /* (329) frame_bound ::= expr PRECEDING|FOLLOWING */ + -2, /* (330) frame_bound ::= CURRENT ROW */ + 0, /* (331) frame_exclude_opt ::= */ + -2, /* (332) frame_exclude_opt ::= EXCLUDE frame_exclude */ + -2, /* (333) frame_exclude ::= NO OTHERS */ + -2, /* (334) frame_exclude ::= CURRENT ROW */ + -1, /* (335) frame_exclude ::= GROUP|TIES */ + -2, /* (336) window_clause ::= WINDOW windowdefn_list */ + -2, /* (337) filter_over ::= filter_clause over_clause */ + -1, /* (338) filter_over ::= over_clause */ + -1, /* (339) filter_over ::= filter_clause */ + -4, /* (340) over_clause ::= OVER LP window RP */ + -2, /* (341) over_clause ::= OVER nm */ + -5, /* (342) filter_clause ::= FILTER LP WHERE expr RP */ + -1, /* (343) term ::= QNUMBER */ + -1, /* (344) input ::= cmdlist */ + -2, /* (345) cmdlist ::= cmdlist ecmd */ + -1, /* (346) cmdlist ::= ecmd */ + -1, /* (347) ecmd ::= SEMI */ + -2, /* (348) ecmd ::= cmdx SEMI */ + -3, /* (349) ecmd ::= explain cmdx SEMI */ + 0, /* (350) trans_opt ::= */ + -1, /* (351) trans_opt ::= TRANSACTION */ + -2, /* (352) trans_opt ::= TRANSACTION nm */ + -1, /* (353) savepoint_opt ::= SAVEPOINT */ + 0, /* (354) savepoint_opt ::= */ + -2, /* (355) cmd ::= create_table create_table_args */ + -1, /* (356) table_option_set ::= table_option */ + -4, /* (357) columnlist ::= columnlist COMMA columnname carglist */ + -2, /* (358) columnlist ::= columnname carglist */ + -1, /* (359) nm ::= ID|INDEXED|JOIN_KW */ + -1, /* (360) nm ::= STRING */ + -1, /* (361) typetoken ::= typename */ + -1, /* (362) typename ::= ID|STRING */ + -1, /* (363) signed ::= plus_num */ + -1, /* (364) signed ::= minus_num */ + -2, /* (365) carglist ::= carglist ccons */ + 0, /* (366) carglist ::= */ + -2, /* (367) ccons ::= NULL onconf */ + -4, /* (368) ccons ::= GENERATED ALWAYS AS generated */ + -2, /* (369) ccons ::= AS generated */ + -2, /* (370) conslist_opt ::= COMMA conslist */ + -3, /* (371) conslist ::= conslist tconscomma tcons */ + -1, /* (372) conslist ::= tcons */ + 0, /* (373) tconscomma ::= */ + -1, /* (374) defer_subclause_opt ::= defer_subclause */ + -1, /* (375) resolvetype ::= raisetype */ + -1, /* (376) selectnowith ::= oneselect */ + -1, /* (377) oneselect ::= values */ + -2, /* (378) sclp ::= selcollist COMMA */ + -1, /* (379) as ::= ID|STRING */ + -1, /* (380) indexed_opt ::= indexed_by */ + 0, /* (381) returning ::= */ + -1, /* (382) expr ::= term */ + -1, /* (383) likeop ::= LIKE_KW|MATCH */ + -1, /* (384) case_operand ::= expr */ + -1, /* (385) exprlist ::= nexprlist */ + -1, /* (386) nmnum ::= plus_num */ + -1, /* (387) nmnum ::= nm */ + -1, /* (388) nmnum ::= ON */ + -1, /* (389) nmnum ::= DELETE */ + -1, /* (390) nmnum ::= DEFAULT */ + -1, /* (391) plus_num ::= INTEGER|FLOAT */ + 0, /* (392) foreach_clause ::= */ + -3, /* (393) foreach_clause ::= FOR EACH ROW */ + -1, /* (394) trnm ::= nm */ + 0, /* (395) tridxby ::= */ + -1, /* (396) database_kw_opt ::= DATABASE */ + 0, /* (397) database_kw_opt ::= */ + 0, /* (398) kwcolumn_opt ::= */ + -1, /* (399) kwcolumn_opt ::= COLUMNKW */ + -1, /* (400) vtabarglist ::= vtabarg */ + -3, /* (401) vtabarglist ::= vtabarglist COMMA vtabarg */ + -2, /* (402) vtabarg ::= vtabarg vtabargtoken */ + 0, /* (403) anylist ::= */ + -4, /* (404) anylist ::= anylist LP anylist RP */ + -2, /* (405) anylist ::= anylist ANY */ + 0, /* (406) with ::= */ + -1, /* (407) windowdefn_list ::= windowdefn */ + -1, /* (408) window ::= frame_opt */ }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -170397,25 +177460,25 @@ static YYACTIONTYPE yy_reduce( /********** Begin reduce actions **********************************************/ YYMINORTYPE yylhsminor; case 0: /* explain ::= EXPLAIN */ -{ pParse->explain = 1; } +{ if( pParse->pReprepare==0 ) pParse->explain = 1; } break; case 1: /* explain ::= EXPLAIN QUERY PLAN */ -{ pParse->explain = 2; } +{ if( pParse->pReprepare==0 ) pParse->explain = 2; } break; case 2: /* cmdx ::= cmd */ { sqlite3FinishCoding(pParse); } break; case 3: /* cmd ::= BEGIN transtype trans_opt */ -{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy394);} +{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy144);} break; case 4: /* transtype ::= */ -{yymsp[1].minor.yy394 = TK_DEFERRED;} +{yymsp[1].minor.yy144 = TK_DEFERRED;} break; case 5: /* transtype ::= DEFERRED */ case 6: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==6); case 7: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==7); - case 323: /* range_or_rows ::= RANGE|ROWS|GROUPS */ yytestcase(yyruleno==323); -{yymsp[0].minor.yy394 = yymsp[0].major; /*A-overwrites-X*/} + case 324: /* range_or_rows ::= RANGE|ROWS|GROUPS */ yytestcase(yyruleno==324); +{yymsp[0].minor.yy144 = yymsp[0].major; /*A-overwrites-X*/} break; case 8: /* cmd ::= COMMIT|END trans_opt */ case 9: /* cmd ::= ROLLBACK trans_opt */ yytestcase(yyruleno==9); @@ -170438,7 +177501,7 @@ static YYACTIONTYPE yy_reduce( break; case 13: /* create_table ::= createkw temp TABLE ifnotexists nm dbnm */ { - sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy394,0,0,yymsp[-2].minor.yy394); + sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy144,0,0,yymsp[-2].minor.yy144); } break; case 14: /* createkw ::= CREATE */ @@ -170450,40 +177513,40 @@ static YYACTIONTYPE yy_reduce( case 62: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==62); case 72: /* defer_subclause_opt ::= */ yytestcase(yyruleno==72); case 81: /* ifexists ::= */ yytestcase(yyruleno==81); - case 98: /* distinct ::= */ yytestcase(yyruleno==98); - case 244: /* collate ::= */ yytestcase(yyruleno==244); -{yymsp[1].minor.yy394 = 0;} + case 100: /* distinct ::= */ yytestcase(yyruleno==100); + case 246: /* collate ::= */ yytestcase(yyruleno==246); +{yymsp[1].minor.yy144 = 0;} break; case 16: /* ifnotexists ::= IF NOT EXISTS */ -{yymsp[-2].minor.yy394 = 1;} +{yymsp[-2].minor.yy144 = 1;} break; case 17: /* temp ::= TEMP */ -{yymsp[0].minor.yy394 = pParse->db->init.busy==0;} +{yymsp[0].minor.yy144 = pParse->db->init.busy==0;} break; case 19: /* create_table_args ::= LP columnlist conslist_opt RP table_option_set */ { - sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy285,0); + sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy391,0); } break; case 20: /* create_table_args ::= AS select */ { - sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy47); - sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy47); + sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy555); + sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy555); } break; case 21: /* table_option_set ::= */ -{yymsp[1].minor.yy285 = 0;} +{yymsp[1].minor.yy391 = 0;} break; case 22: /* table_option_set ::= table_option_set COMMA table_option */ -{yylhsminor.yy285 = yymsp[-2].minor.yy285|yymsp[0].minor.yy285;} - yymsp[-2].minor.yy285 = yylhsminor.yy285; +{yylhsminor.yy391 = yymsp[-2].minor.yy391|yymsp[0].minor.yy391;} + yymsp[-2].minor.yy391 = yylhsminor.yy391; break; case 23: /* table_option ::= WITHOUT nm */ { if( yymsp[0].minor.yy0.n==5 && sqlite3_strnicmp(yymsp[0].minor.yy0.z,"rowid",5)==0 ){ - yymsp[-1].minor.yy285 = TF_WithoutRowid | TF_NoVisibleRowid; + yymsp[-1].minor.yy391 = TF_WithoutRowid | TF_NoVisibleRowid; }else{ - yymsp[-1].minor.yy285 = 0; + yymsp[-1].minor.yy391 = 0; sqlite3ErrorMsg(pParse, "unknown table option: %.*s", yymsp[0].minor.yy0.n, yymsp[0].minor.yy0.z); } } @@ -170491,20 +177554,20 @@ static YYACTIONTYPE yy_reduce( case 24: /* table_option ::= nm */ { if( yymsp[0].minor.yy0.n==6 && sqlite3_strnicmp(yymsp[0].minor.yy0.z,"strict",6)==0 ){ - yylhsminor.yy285 = TF_Strict; + yylhsminor.yy391 = TF_Strict; }else{ - yylhsminor.yy285 = 0; + yylhsminor.yy391 = 0; sqlite3ErrorMsg(pParse, "unknown table option: %.*s", yymsp[0].minor.yy0.n, yymsp[0].minor.yy0.z); } } - yymsp[0].minor.yy285 = yylhsminor.yy285; + yymsp[0].minor.yy391 = yylhsminor.yy391; break; case 25: /* columnname ::= nm typetoken */ {sqlite3AddColumn(pParse,yymsp[-1].minor.yy0,yymsp[0].minor.yy0);} break; case 26: /* typetoken ::= */ case 65: /* conslist_opt ::= */ yytestcase(yyruleno==65); - case 104: /* as ::= */ yytestcase(yyruleno==104); + case 106: /* as ::= */ yytestcase(yyruleno==106); {yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = 0;} break; case 27: /* typetoken ::= typename LP signed RP */ @@ -170523,7 +177586,7 @@ static YYACTIONTYPE yy_reduce( case 30: /* scanpt ::= */ { assert( yyLookahead!=YYNOCODE ); - yymsp[1].minor.yy522 = yyLookaheadToken.z; + yymsp[1].minor.yy168 = yyLookaheadToken.z; } break; case 31: /* scantok ::= */ @@ -170537,17 +177600,17 @@ static YYACTIONTYPE yy_reduce( {pParse->constraintName = yymsp[0].minor.yy0;} break; case 33: /* ccons ::= DEFAULT scantok term */ -{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy528,yymsp[-1].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);} +{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy454,yymsp[-1].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);} break; case 34: /* ccons ::= DEFAULT LP expr RP */ -{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy528,yymsp[-2].minor.yy0.z+1,yymsp[0].minor.yy0.z);} +{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy454,yymsp[-2].minor.yy0.z+1,yymsp[0].minor.yy0.z);} break; case 35: /* ccons ::= DEFAULT PLUS scantok term */ -{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy528,yymsp[-2].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);} +{sqlite3AddDefaultValue(pParse,yymsp[0].minor.yy454,yymsp[-2].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]);} break; case 36: /* ccons ::= DEFAULT MINUS scantok term */ { - Expr *p = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy528, 0); + Expr *p = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy454, 0); sqlite3AddDefaultValue(pParse,p,yymsp[-2].minor.yy0.z,&yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]); } break; @@ -170562,161 +177625,160 @@ static YYACTIONTYPE yy_reduce( } break; case 38: /* ccons ::= NOT NULL onconf */ -{sqlite3AddNotNull(pParse, yymsp[0].minor.yy394);} +{sqlite3AddNotNull(pParse, yymsp[0].minor.yy144);} break; case 39: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */ -{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy394,yymsp[0].minor.yy394,yymsp[-2].minor.yy394);} +{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy144,yymsp[0].minor.yy144,yymsp[-2].minor.yy144);} break; case 40: /* ccons ::= UNIQUE onconf */ -{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy394,0,0,0,0, +{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy144,0,0,0,0, SQLITE_IDXTYPE_UNIQUE);} break; case 41: /* ccons ::= CHECK LP expr RP */ -{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy528,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy0.z);} +{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy454,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy0.z);} break; case 42: /* ccons ::= REFERENCES nm eidlist_opt refargs */ -{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy322,yymsp[0].minor.yy394);} +{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy14,yymsp[0].minor.yy144);} break; case 43: /* ccons ::= defer_subclause */ -{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy394);} +{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy144);} break; case 44: /* ccons ::= COLLATE ID|STRING */ {sqlite3AddCollateType(pParse, &yymsp[0].minor.yy0);} break; case 45: /* generated ::= LP expr RP */ -{sqlite3AddGenerated(pParse,yymsp[-1].minor.yy528,0);} +{sqlite3AddGenerated(pParse,yymsp[-1].minor.yy454,0);} break; case 46: /* generated ::= LP expr RP ID */ -{sqlite3AddGenerated(pParse,yymsp[-2].minor.yy528,&yymsp[0].minor.yy0);} +{sqlite3AddGenerated(pParse,yymsp[-2].minor.yy454,&yymsp[0].minor.yy0);} break; case 48: /* autoinc ::= AUTOINCR */ -{yymsp[0].minor.yy394 = 1;} +{yymsp[0].minor.yy144 = 1;} break; case 49: /* refargs ::= */ -{ yymsp[1].minor.yy394 = OE_None*0x0101; /* EV: R-19803-45884 */} +{ yymsp[1].minor.yy144 = OE_None*0x0101; /* EV: R-19803-45884 */} break; case 50: /* refargs ::= refargs refarg */ -{ yymsp[-1].minor.yy394 = (yymsp[-1].minor.yy394 & ~yymsp[0].minor.yy231.mask) | yymsp[0].minor.yy231.value; } +{ yymsp[-1].minor.yy144 = (yymsp[-1].minor.yy144 & ~yymsp[0].minor.yy383.mask) | yymsp[0].minor.yy383.value; } break; case 51: /* refarg ::= MATCH nm */ -{ yymsp[-1].minor.yy231.value = 0; yymsp[-1].minor.yy231.mask = 0x000000; } +{ yymsp[-1].minor.yy383.value = 0; yymsp[-1].minor.yy383.mask = 0x000000; } break; case 52: /* refarg ::= ON INSERT refact */ -{ yymsp[-2].minor.yy231.value = 0; yymsp[-2].minor.yy231.mask = 0x000000; } +{ yymsp[-2].minor.yy383.value = 0; yymsp[-2].minor.yy383.mask = 0x000000; } break; case 53: /* refarg ::= ON DELETE refact */ -{ yymsp[-2].minor.yy231.value = yymsp[0].minor.yy394; yymsp[-2].minor.yy231.mask = 0x0000ff; } +{ yymsp[-2].minor.yy383.value = yymsp[0].minor.yy144; yymsp[-2].minor.yy383.mask = 0x0000ff; } break; case 54: /* refarg ::= ON UPDATE refact */ -{ yymsp[-2].minor.yy231.value = yymsp[0].minor.yy394<<8; yymsp[-2].minor.yy231.mask = 0x00ff00; } +{ yymsp[-2].minor.yy383.value = yymsp[0].minor.yy144<<8; yymsp[-2].minor.yy383.mask = 0x00ff00; } break; case 55: /* refact ::= SET NULL */ -{ yymsp[-1].minor.yy394 = OE_SetNull; /* EV: R-33326-45252 */} +{ yymsp[-1].minor.yy144 = OE_SetNull; /* EV: R-33326-45252 */} break; case 56: /* refact ::= SET DEFAULT */ -{ yymsp[-1].minor.yy394 = OE_SetDflt; /* EV: R-33326-45252 */} +{ yymsp[-1].minor.yy144 = OE_SetDflt; /* EV: R-33326-45252 */} break; case 57: /* refact ::= CASCADE */ -{ yymsp[0].minor.yy394 = OE_Cascade; /* EV: R-33326-45252 */} +{ yymsp[0].minor.yy144 = OE_Cascade; /* EV: R-33326-45252 */} break; case 58: /* refact ::= RESTRICT */ -{ yymsp[0].minor.yy394 = OE_Restrict; /* EV: R-33326-45252 */} +{ yymsp[0].minor.yy144 = OE_Restrict; /* EV: R-33326-45252 */} break; case 59: /* refact ::= NO ACTION */ -{ yymsp[-1].minor.yy394 = OE_None; /* EV: R-33326-45252 */} +{ yymsp[-1].minor.yy144 = OE_None; /* EV: R-33326-45252 */} break; case 60: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ -{yymsp[-2].minor.yy394 = 0;} +{yymsp[-2].minor.yy144 = 0;} break; case 61: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ case 76: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==76); - case 171: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==171); -{yymsp[-1].minor.yy394 = yymsp[0].minor.yy394;} + case 173: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==173); +{yymsp[-1].minor.yy144 = yymsp[0].minor.yy144;} break; case 63: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */ case 80: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==80); - case 216: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==216); - case 219: /* in_op ::= NOT IN */ yytestcase(yyruleno==219); - case 245: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==245); -{yymsp[-1].minor.yy394 = 1;} + case 219: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==219); + case 222: /* in_op ::= NOT IN */ yytestcase(yyruleno==222); + case 247: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==247); +{yymsp[-1].minor.yy144 = 1;} break; case 64: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ -{yymsp[-1].minor.yy394 = 0;} +{yymsp[-1].minor.yy144 = 0;} break; case 66: /* tconscomma ::= COMMA */ {pParse->constraintName.n = 0;} break; case 68: /* tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ -{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy322,yymsp[0].minor.yy394,yymsp[-2].minor.yy394,0);} +{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy14,yymsp[0].minor.yy144,yymsp[-2].minor.yy144,0);} break; case 69: /* tcons ::= UNIQUE LP sortlist RP onconf */ -{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy322,yymsp[0].minor.yy394,0,0,0,0, +{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy14,yymsp[0].minor.yy144,0,0,0,0, SQLITE_IDXTYPE_UNIQUE);} break; case 70: /* tcons ::= CHECK LP expr RP onconf */ -{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy528,yymsp[-3].minor.yy0.z,yymsp[-1].minor.yy0.z);} +{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy454,yymsp[-3].minor.yy0.z,yymsp[-1].minor.yy0.z);} break; case 71: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ { - sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy322, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy322, yymsp[-1].minor.yy394); - sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy394); + sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy14, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy14, yymsp[-1].minor.yy144); + sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy144); } break; case 73: /* onconf ::= */ case 75: /* orconf ::= */ yytestcase(yyruleno==75); -{yymsp[1].minor.yy394 = OE_Default;} +{yymsp[1].minor.yy144 = OE_Default;} break; case 74: /* onconf ::= ON CONFLICT resolvetype */ -{yymsp[-2].minor.yy394 = yymsp[0].minor.yy394;} +{yymsp[-2].minor.yy144 = yymsp[0].minor.yy144;} break; case 77: /* resolvetype ::= IGNORE */ -{yymsp[0].minor.yy394 = OE_Ignore;} +{yymsp[0].minor.yy144 = OE_Ignore;} break; case 78: /* resolvetype ::= REPLACE */ - case 172: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==172); -{yymsp[0].minor.yy394 = OE_Replace;} + case 174: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==174); +{yymsp[0].minor.yy144 = OE_Replace;} break; case 79: /* cmd ::= DROP TABLE ifexists fullname */ { - sqlite3DropTable(pParse, yymsp[0].minor.yy131, 0, yymsp[-1].minor.yy394); + sqlite3DropTable(pParse, yymsp[0].minor.yy203, 0, yymsp[-1].minor.yy144); } break; case 82: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ { - sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy322, yymsp[0].minor.yy47, yymsp[-7].minor.yy394, yymsp[-5].minor.yy394); + sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy14, yymsp[0].minor.yy555, yymsp[-7].minor.yy144, yymsp[-5].minor.yy144); } break; case 83: /* cmd ::= DROP VIEW ifexists fullname */ { - sqlite3DropTable(pParse, yymsp[0].minor.yy131, 1, yymsp[-1].minor.yy394); + sqlite3DropTable(pParse, yymsp[0].minor.yy203, 1, yymsp[-1].minor.yy144); } break; case 84: /* cmd ::= select */ { SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0, 0}; - sqlite3Select(pParse, yymsp[0].minor.yy47, &dest); - sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy47); + sqlite3Select(pParse, yymsp[0].minor.yy555, &dest); + sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy555); } break; case 85: /* select ::= WITH wqlist selectnowith */ -{yymsp[-2].minor.yy47 = attachWithToSelect(pParse,yymsp[0].minor.yy47,yymsp[-1].minor.yy521);} +{yymsp[-2].minor.yy555 = attachWithToSelect(pParse,yymsp[0].minor.yy555,yymsp[-1].minor.yy59);} break; case 86: /* select ::= WITH RECURSIVE wqlist selectnowith */ -{yymsp[-3].minor.yy47 = attachWithToSelect(pParse,yymsp[0].minor.yy47,yymsp[-1].minor.yy521);} +{yymsp[-3].minor.yy555 = attachWithToSelect(pParse,yymsp[0].minor.yy555,yymsp[-1].minor.yy59);} break; case 87: /* select ::= selectnowith */ { - Select *p = yymsp[0].minor.yy47; + Select *p = yymsp[0].minor.yy555; if( p ){ parserDoubleLinkSelect(pParse, p); } - yymsp[0].minor.yy47 = p; /*A-overwrites-X*/ } break; case 88: /* selectnowith ::= selectnowith multiselect_op oneselect */ { - Select *pRhs = yymsp[0].minor.yy47; - Select *pLhs = yymsp[-2].minor.yy47; + Select *pRhs = yymsp[0].minor.yy555; + Select *pLhs = yymsp[-2].minor.yy555; if( pRhs && pRhs->pPrior ){ SrcList *pFrom; Token x; @@ -170726,150 +177788,160 @@ static YYACTIONTYPE yy_reduce( pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0); } if( pRhs ){ - pRhs->op = (u8)yymsp[-1].minor.yy394; + pRhs->op = (u8)yymsp[-1].minor.yy144; pRhs->pPrior = pLhs; if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue; pRhs->selFlags &= ~SF_MultiValue; - if( yymsp[-1].minor.yy394!=TK_ALL ) pParse->hasCompound = 1; + if( yymsp[-1].minor.yy144!=TK_ALL ) pParse->hasCompound = 1; }else{ sqlite3SelectDelete(pParse->db, pLhs); } - yymsp[-2].minor.yy47 = pRhs; + yymsp[-2].minor.yy555 = pRhs; } break; case 89: /* multiselect_op ::= UNION */ case 91: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==91); -{yymsp[0].minor.yy394 = yymsp[0].major; /*A-overwrites-OP*/} +{yymsp[0].minor.yy144 = yymsp[0].major; /*A-overwrites-OP*/} break; case 90: /* multiselect_op ::= UNION ALL */ -{yymsp[-1].minor.yy394 = TK_ALL;} +{yymsp[-1].minor.yy144 = TK_ALL;} break; case 92: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ { - yymsp[-8].minor.yy47 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy322,yymsp[-5].minor.yy131,yymsp[-4].minor.yy528,yymsp[-3].minor.yy322,yymsp[-2].minor.yy528,yymsp[-1].minor.yy322,yymsp[-7].minor.yy394,yymsp[0].minor.yy528); + yymsp[-8].minor.yy555 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy14,yymsp[-5].minor.yy203,yymsp[-4].minor.yy454,yymsp[-3].minor.yy14,yymsp[-2].minor.yy454,yymsp[-1].minor.yy14,yymsp[-7].minor.yy144,yymsp[0].minor.yy454); } break; case 93: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt window_clause orderby_opt limit_opt */ { - yymsp[-9].minor.yy47 = sqlite3SelectNew(pParse,yymsp[-7].minor.yy322,yymsp[-6].minor.yy131,yymsp[-5].minor.yy528,yymsp[-4].minor.yy322,yymsp[-3].minor.yy528,yymsp[-1].minor.yy322,yymsp[-8].minor.yy394,yymsp[0].minor.yy528); - if( yymsp[-9].minor.yy47 ){ - yymsp[-9].minor.yy47->pWinDefn = yymsp[-2].minor.yy41; + yymsp[-9].minor.yy555 = sqlite3SelectNew(pParse,yymsp[-7].minor.yy14,yymsp[-6].minor.yy203,yymsp[-5].minor.yy454,yymsp[-4].minor.yy14,yymsp[-3].minor.yy454,yymsp[-1].minor.yy14,yymsp[-8].minor.yy144,yymsp[0].minor.yy454); + if( yymsp[-9].minor.yy555 ){ + yymsp[-9].minor.yy555->pWinDefn = yymsp[-2].minor.yy211; }else{ - sqlite3WindowListDelete(pParse->db, yymsp[-2].minor.yy41); + sqlite3WindowListDelete(pParse->db, yymsp[-2].minor.yy211); } } break; case 94: /* values ::= VALUES LP nexprlist RP */ { - yymsp[-3].minor.yy47 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy322,0,0,0,0,0,SF_Values,0); + yymsp[-3].minor.yy555 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy14,0,0,0,0,0,SF_Values,0); } break; - case 95: /* values ::= values COMMA LP nexprlist RP */ + case 95: /* oneselect ::= mvalues */ { - Select *pRight, *pLeft = yymsp[-4].minor.yy47; - pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy322,0,0,0,0,0,SF_Values|SF_MultiValue,0); - if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue; - if( pRight ){ - pRight->op = TK_ALL; - pRight->pPrior = pLeft; - yymsp[-4].minor.yy47 = pRight; - }else{ - yymsp[-4].minor.yy47 = pLeft; - } + sqlite3MultiValuesEnd(pParse, yymsp[0].minor.yy555); } break; - case 96: /* distinct ::= DISTINCT */ -{yymsp[0].minor.yy394 = SF_Distinct;} + case 96: /* mvalues ::= values COMMA LP nexprlist RP */ + case 97: /* mvalues ::= mvalues COMMA LP nexprlist RP */ yytestcase(yyruleno==97); +{ + yymsp[-4].minor.yy555 = sqlite3MultiValues(pParse, yymsp[-4].minor.yy555, yymsp[-1].minor.yy14); +} break; - case 97: /* distinct ::= ALL */ -{yymsp[0].minor.yy394 = SF_All;} + case 98: /* distinct ::= DISTINCT */ +{yymsp[0].minor.yy144 = SF_Distinct;} break; - case 99: /* sclp ::= */ - case 132: /* orderby_opt ::= */ yytestcase(yyruleno==132); - case 142: /* groupby_opt ::= */ yytestcase(yyruleno==142); - case 232: /* exprlist ::= */ yytestcase(yyruleno==232); - case 235: /* paren_exprlist ::= */ yytestcase(yyruleno==235); - case 240: /* eidlist_opt ::= */ yytestcase(yyruleno==240); -{yymsp[1].minor.yy322 = 0;} + case 99: /* distinct ::= ALL */ +{yymsp[0].minor.yy144 = SF_All;} break; - case 100: /* selcollist ::= sclp scanpt expr scanpt as */ + case 101: /* sclp ::= */ + case 134: /* orderby_opt ::= */ yytestcase(yyruleno==134); + case 144: /* groupby_opt ::= */ yytestcase(yyruleno==144); + case 234: /* exprlist ::= */ yytestcase(yyruleno==234); + case 237: /* paren_exprlist ::= */ yytestcase(yyruleno==237); + case 242: /* eidlist_opt ::= */ yytestcase(yyruleno==242); +{yymsp[1].minor.yy14 = 0;} + break; + case 102: /* selcollist ::= sclp scanpt expr scanpt as */ { - yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy322, yymsp[-2].minor.yy528); - if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy322, &yymsp[0].minor.yy0, 1); - sqlite3ExprListSetSpan(pParse,yymsp[-4].minor.yy322,yymsp[-3].minor.yy522,yymsp[-1].minor.yy522); + yymsp[-4].minor.yy14 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy14, yymsp[-2].minor.yy454); + if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy14, &yymsp[0].minor.yy0, 1); + sqlite3ExprListSetSpan(pParse,yymsp[-4].minor.yy14,yymsp[-3].minor.yy168,yymsp[-1].minor.yy168); } break; - case 101: /* selcollist ::= sclp scanpt STAR */ + case 103: /* selcollist ::= sclp scanpt STAR */ { Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0); - yymsp[-2].minor.yy322 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy322, p); + sqlite3ExprSetErrorOffset(p, (int)(yymsp[0].minor.yy0.z - pParse->zTail)); + yymsp[-2].minor.yy14 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy14, p); } break; - case 102: /* selcollist ::= sclp scanpt nm DOT STAR */ + case 104: /* selcollist ::= sclp scanpt nm DOT STAR */ { - Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0); - Expr *pLeft = tokenExpr(pParse, TK_ID, yymsp[-2].minor.yy0); - Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); - yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, pDot); -} - break; - case 103: /* as ::= AS nm */ - case 115: /* dbnm ::= DOT nm */ yytestcase(yyruleno==115); - case 256: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==256); - case 257: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==257); + Expr *pRight, *pLeft, *pDot; + pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0); + sqlite3ExprSetErrorOffset(pRight, (int)(yymsp[0].minor.yy0.z - pParse->zTail)); + pLeft = tokenExpr(pParse, TK_ID, yymsp[-2].minor.yy0); + pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); + yymsp[-4].minor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy14, pDot); +} + break; + case 105: /* as ::= AS nm */ + case 117: /* dbnm ::= DOT nm */ yytestcase(yyruleno==117); + case 258: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==258); + case 259: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==259); {yymsp[-1].minor.yy0 = yymsp[0].minor.yy0;} break; - case 105: /* from ::= */ - case 108: /* stl_prefix ::= */ yytestcase(yyruleno==108); -{yymsp[1].minor.yy131 = 0;} + case 107: /* from ::= */ + case 110: /* stl_prefix ::= */ yytestcase(yyruleno==110); +{yymsp[1].minor.yy203 = 0;} break; - case 106: /* from ::= FROM seltablist */ + case 108: /* from ::= FROM seltablist */ { - yymsp[-1].minor.yy131 = yymsp[0].minor.yy131; - sqlite3SrcListShiftJoinType(pParse,yymsp[-1].minor.yy131); + yymsp[-1].minor.yy203 = yymsp[0].minor.yy203; + sqlite3SrcListShiftJoinType(pParse,yymsp[-1].minor.yy203); } break; - case 107: /* stl_prefix ::= seltablist joinop */ + case 109: /* stl_prefix ::= seltablist joinop */ { - if( ALWAYS(yymsp[-1].minor.yy131 && yymsp[-1].minor.yy131->nSrc>0) ) yymsp[-1].minor.yy131->a[yymsp[-1].minor.yy131->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy394; + if( ALWAYS(yymsp[-1].minor.yy203 && yymsp[-1].minor.yy203->nSrc>0) ) yymsp[-1].minor.yy203->a[yymsp[-1].minor.yy203->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy144; } break; - case 109: /* seltablist ::= stl_prefix nm dbnm as on_using */ + case 111: /* seltablist ::= stl_prefix nm dbnm as on_using */ { - yymsp[-4].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-4].minor.yy131,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0,&yymsp[0].minor.yy561); + yymsp[-4].minor.yy203 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-4].minor.yy203,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0,&yymsp[0].minor.yy269); } break; - case 110: /* seltablist ::= stl_prefix nm dbnm as indexed_by on_using */ + case 112: /* seltablist ::= stl_prefix nm dbnm as indexed_by on_using */ { - yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,0,&yymsp[0].minor.yy561); - sqlite3SrcListIndexedBy(pParse, yymsp[-5].minor.yy131, &yymsp[-1].minor.yy0); + yymsp[-5].minor.yy203 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy203,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,0,&yymsp[0].minor.yy269); + sqlite3SrcListIndexedBy(pParse, yymsp[-5].minor.yy203, &yymsp[-1].minor.yy0); } break; - case 111: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using */ + case 113: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using */ { - yymsp[-7].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-7].minor.yy131,&yymsp[-6].minor.yy0,&yymsp[-5].minor.yy0,&yymsp[-1].minor.yy0,0,&yymsp[0].minor.yy561); - sqlite3SrcListFuncArgs(pParse, yymsp[-7].minor.yy131, yymsp[-3].minor.yy322); + yymsp[-7].minor.yy203 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-7].minor.yy203,&yymsp[-6].minor.yy0,&yymsp[-5].minor.yy0,&yymsp[-1].minor.yy0,0,&yymsp[0].minor.yy269); + sqlite3SrcListFuncArgs(pParse, yymsp[-7].minor.yy203, yymsp[-3].minor.yy14); } break; - case 112: /* seltablist ::= stl_prefix LP select RP as on_using */ + case 114: /* seltablist ::= stl_prefix LP select RP as on_using */ { - yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,0,0,&yymsp[-1].minor.yy0,yymsp[-3].minor.yy47,&yymsp[0].minor.yy561); + yymsp[-5].minor.yy203 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy203,0,0,&yymsp[-1].minor.yy0,yymsp[-3].minor.yy555,&yymsp[0].minor.yy269); } break; - case 113: /* seltablist ::= stl_prefix LP seltablist RP as on_using */ + case 115: /* seltablist ::= stl_prefix LP seltablist RP as on_using */ { - if( yymsp[-5].minor.yy131==0 && yymsp[-1].minor.yy0.n==0 && yymsp[0].minor.yy561.pOn==0 && yymsp[0].minor.yy561.pUsing==0 ){ - yymsp[-5].minor.yy131 = yymsp[-3].minor.yy131; - }else if( yymsp[-3].minor.yy131->nSrc==1 ){ - yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,0,0,&yymsp[-1].minor.yy0,0,&yymsp[0].minor.yy561); - if( yymsp[-5].minor.yy131 ){ - SrcItem *pNew = &yymsp[-5].minor.yy131->a[yymsp[-5].minor.yy131->nSrc-1]; - SrcItem *pOld = yymsp[-3].minor.yy131->a; + if( yymsp[-5].minor.yy203==0 && yymsp[-1].minor.yy0.n==0 && yymsp[0].minor.yy269.pOn==0 && yymsp[0].minor.yy269.pUsing==0 ){ + yymsp[-5].minor.yy203 = yymsp[-3].minor.yy203; + }else if( ALWAYS(yymsp[-3].minor.yy203!=0) && yymsp[-3].minor.yy203->nSrc==1 ){ + yymsp[-5].minor.yy203 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy203,0,0,&yymsp[-1].minor.yy0,0,&yymsp[0].minor.yy269); + if( yymsp[-5].minor.yy203 ){ + SrcItem *pNew = &yymsp[-5].minor.yy203->a[yymsp[-5].minor.yy203->nSrc-1]; + SrcItem *pOld = yymsp[-3].minor.yy203->a; + assert( pOld->fg.fixedSchema==0 ); pNew->zName = pOld->zName; - pNew->zDatabase = pOld->zDatabase; - pNew->pSelect = pOld->pSelect; - if( pNew->pSelect && (pNew->pSelect->selFlags & SF_NestedFrom)!=0 ){ - pNew->fg.isNestedFrom = 1; + assert( pOld->fg.fixedSchema==0 ); + if( pOld->fg.isSubquery ){ + pNew->fg.isSubquery = 1; + pNew->u4.pSubq = pOld->u4.pSubq; + pOld->u4.pSubq = 0; + pOld->fg.isSubquery = 0; + assert( pNew->u4.pSubq!=0 && pNew->u4.pSubq->pSelect!=0 ); + if( (pNew->u4.pSubq->pSelect->selFlags & SF_NestedFrom)!=0 ){ + pNew->fg.isNestedFrom = 1; + } + }else{ + pNew->u4.zDatabase = pOld->u4.zDatabase; + pOld->u4.zDatabase = 0; } if( pOld->fg.isTabFunc ){ pNew->u1.pFuncArg = pOld->u1.pFuncArg; @@ -170877,156 +177949,155 @@ static YYACTIONTYPE yy_reduce( pOld->fg.isTabFunc = 0; pNew->fg.isTabFunc = 1; } - pOld->zName = pOld->zDatabase = 0; - pOld->pSelect = 0; + pOld->zName = 0; } - sqlite3SrcListDelete(pParse->db, yymsp[-3].minor.yy131); + sqlite3SrcListDelete(pParse->db, yymsp[-3].minor.yy203); }else{ Select *pSubquery; - sqlite3SrcListShiftJoinType(pParse,yymsp[-3].minor.yy131); - pSubquery = sqlite3SelectNew(pParse,0,yymsp[-3].minor.yy131,0,0,0,0,SF_NestedFrom,0); - yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,0,0,&yymsp[-1].minor.yy0,pSubquery,&yymsp[0].minor.yy561); + sqlite3SrcListShiftJoinType(pParse,yymsp[-3].minor.yy203); + pSubquery = sqlite3SelectNew(pParse,0,yymsp[-3].minor.yy203,0,0,0,0,SF_NestedFrom,0); + yymsp[-5].minor.yy203 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy203,0,0,&yymsp[-1].minor.yy0,pSubquery,&yymsp[0].minor.yy269); } } break; - case 114: /* dbnm ::= */ - case 129: /* indexed_opt ::= */ yytestcase(yyruleno==129); + case 116: /* dbnm ::= */ + case 131: /* indexed_opt ::= */ yytestcase(yyruleno==131); {yymsp[1].minor.yy0.z=0; yymsp[1].minor.yy0.n=0;} break; - case 116: /* fullname ::= nm */ + case 118: /* fullname ::= nm */ { - yylhsminor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); - if( IN_RENAME_OBJECT && yylhsminor.yy131 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy131->a[0].zName, &yymsp[0].minor.yy0); + yylhsminor.yy203 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); + if( IN_RENAME_OBJECT && yylhsminor.yy203 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy203->a[0].zName, &yymsp[0].minor.yy0); } - yymsp[0].minor.yy131 = yylhsminor.yy131; + yymsp[0].minor.yy203 = yylhsminor.yy203; break; - case 117: /* fullname ::= nm DOT nm */ + case 119: /* fullname ::= nm DOT nm */ { - yylhsminor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); - if( IN_RENAME_OBJECT && yylhsminor.yy131 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy131->a[0].zName, &yymsp[0].minor.yy0); + yylhsminor.yy203 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); + if( IN_RENAME_OBJECT && yylhsminor.yy203 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy203->a[0].zName, &yymsp[0].minor.yy0); } - yymsp[-2].minor.yy131 = yylhsminor.yy131; + yymsp[-2].minor.yy203 = yylhsminor.yy203; break; - case 118: /* xfullname ::= nm */ -{yymsp[0].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/} + case 120: /* xfullname ::= nm */ +{yymsp[0].minor.yy203 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/} break; - case 119: /* xfullname ::= nm DOT nm */ -{yymsp[-2].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/} + case 121: /* xfullname ::= nm DOT nm */ +{yymsp[-2].minor.yy203 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/} break; - case 120: /* xfullname ::= nm DOT nm AS nm */ + case 122: /* xfullname ::= nm DOT nm AS nm */ { - yymsp[-4].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,&yymsp[-2].minor.yy0); /*A-overwrites-X*/ - if( yymsp[-4].minor.yy131 ) yymsp[-4].minor.yy131->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); + yymsp[-4].minor.yy203 = sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,&yymsp[-2].minor.yy0); /*A-overwrites-X*/ + if( yymsp[-4].minor.yy203 ) yymsp[-4].minor.yy203->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); } break; - case 121: /* xfullname ::= nm AS nm */ + case 123: /* xfullname ::= nm AS nm */ { - yymsp[-2].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/ - if( yymsp[-2].minor.yy131 ) yymsp[-2].minor.yy131->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); + yymsp[-2].minor.yy203 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/ + if( yymsp[-2].minor.yy203 ) yymsp[-2].minor.yy203->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); } break; - case 122: /* joinop ::= COMMA|JOIN */ -{ yymsp[0].minor.yy394 = JT_INNER; } + case 124: /* joinop ::= COMMA|JOIN */ +{ yymsp[0].minor.yy144 = JT_INNER; } break; - case 123: /* joinop ::= JOIN_KW JOIN */ -{yymsp[-1].minor.yy394 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/} + case 125: /* joinop ::= JOIN_KW JOIN */ +{yymsp[-1].minor.yy144 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/} break; - case 124: /* joinop ::= JOIN_KW nm JOIN */ -{yymsp[-2].minor.yy394 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/} + case 126: /* joinop ::= JOIN_KW nm JOIN */ +{yymsp[-2].minor.yy144 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/} break; - case 125: /* joinop ::= JOIN_KW nm nm JOIN */ -{yymsp[-3].minor.yy394 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/} + case 127: /* joinop ::= JOIN_KW nm nm JOIN */ +{yymsp[-3].minor.yy144 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/} break; - case 126: /* on_using ::= ON expr */ -{yymsp[-1].minor.yy561.pOn = yymsp[0].minor.yy528; yymsp[-1].minor.yy561.pUsing = 0;} + case 128: /* on_using ::= ON expr */ +{yymsp[-1].minor.yy269.pOn = yymsp[0].minor.yy454; yymsp[-1].minor.yy269.pUsing = 0;} break; - case 127: /* on_using ::= USING LP idlist RP */ -{yymsp[-3].minor.yy561.pOn = 0; yymsp[-3].minor.yy561.pUsing = yymsp[-1].minor.yy254;} + case 129: /* on_using ::= USING LP idlist RP */ +{yymsp[-3].minor.yy269.pOn = 0; yymsp[-3].minor.yy269.pUsing = yymsp[-1].minor.yy132;} break; - case 128: /* on_using ::= */ -{yymsp[1].minor.yy561.pOn = 0; yymsp[1].minor.yy561.pUsing = 0;} + case 130: /* on_using ::= */ +{yymsp[1].minor.yy269.pOn = 0; yymsp[1].minor.yy269.pUsing = 0;} break; - case 130: /* indexed_by ::= INDEXED BY nm */ + case 132: /* indexed_by ::= INDEXED BY nm */ {yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;} break; - case 131: /* indexed_by ::= NOT INDEXED */ + case 133: /* indexed_by ::= NOT INDEXED */ {yymsp[-1].minor.yy0.z=0; yymsp[-1].minor.yy0.n=1;} break; - case 133: /* orderby_opt ::= ORDER BY sortlist */ - case 143: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==143); -{yymsp[-2].minor.yy322 = yymsp[0].minor.yy322;} + case 135: /* orderby_opt ::= ORDER BY sortlist */ + case 145: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==145); +{yymsp[-2].minor.yy14 = yymsp[0].minor.yy14;} break; - case 134: /* sortlist ::= sortlist COMMA expr sortorder nulls */ + case 136: /* sortlist ::= sortlist COMMA expr sortorder nulls */ { - yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322,yymsp[-2].minor.yy528); - sqlite3ExprListSetSortOrder(yymsp[-4].minor.yy322,yymsp[-1].minor.yy394,yymsp[0].minor.yy394); + yymsp[-4].minor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy14,yymsp[-2].minor.yy454); + sqlite3ExprListSetSortOrder(yymsp[-4].minor.yy14,yymsp[-1].minor.yy144,yymsp[0].minor.yy144); } break; - case 135: /* sortlist ::= expr sortorder nulls */ + case 137: /* sortlist ::= expr sortorder nulls */ { - yymsp[-2].minor.yy322 = sqlite3ExprListAppend(pParse,0,yymsp[-2].minor.yy528); /*A-overwrites-Y*/ - sqlite3ExprListSetSortOrder(yymsp[-2].minor.yy322,yymsp[-1].minor.yy394,yymsp[0].minor.yy394); + yymsp[-2].minor.yy14 = sqlite3ExprListAppend(pParse,0,yymsp[-2].minor.yy454); /*A-overwrites-Y*/ + sqlite3ExprListSetSortOrder(yymsp[-2].minor.yy14,yymsp[-1].minor.yy144,yymsp[0].minor.yy144); } break; - case 136: /* sortorder ::= ASC */ -{yymsp[0].minor.yy394 = SQLITE_SO_ASC;} + case 138: /* sortorder ::= ASC */ +{yymsp[0].minor.yy144 = SQLITE_SO_ASC;} break; - case 137: /* sortorder ::= DESC */ -{yymsp[0].minor.yy394 = SQLITE_SO_DESC;} + case 139: /* sortorder ::= DESC */ +{yymsp[0].minor.yy144 = SQLITE_SO_DESC;} break; - case 138: /* sortorder ::= */ - case 141: /* nulls ::= */ yytestcase(yyruleno==141); -{yymsp[1].minor.yy394 = SQLITE_SO_UNDEFINED;} + case 140: /* sortorder ::= */ + case 143: /* nulls ::= */ yytestcase(yyruleno==143); +{yymsp[1].minor.yy144 = SQLITE_SO_UNDEFINED;} break; - case 139: /* nulls ::= NULLS FIRST */ -{yymsp[-1].minor.yy394 = SQLITE_SO_ASC;} + case 141: /* nulls ::= NULLS FIRST */ +{yymsp[-1].minor.yy144 = SQLITE_SO_ASC;} break; - case 140: /* nulls ::= NULLS LAST */ -{yymsp[-1].minor.yy394 = SQLITE_SO_DESC;} + case 142: /* nulls ::= NULLS LAST */ +{yymsp[-1].minor.yy144 = SQLITE_SO_DESC;} break; - case 144: /* having_opt ::= */ - case 146: /* limit_opt ::= */ yytestcase(yyruleno==146); - case 151: /* where_opt ::= */ yytestcase(yyruleno==151); - case 153: /* where_opt_ret ::= */ yytestcase(yyruleno==153); - case 229: /* case_else ::= */ yytestcase(yyruleno==229); - case 231: /* case_operand ::= */ yytestcase(yyruleno==231); - case 250: /* vinto ::= */ yytestcase(yyruleno==250); -{yymsp[1].minor.yy528 = 0;} + case 146: /* having_opt ::= */ + case 148: /* limit_opt ::= */ yytestcase(yyruleno==148); + case 153: /* where_opt ::= */ yytestcase(yyruleno==153); + case 155: /* where_opt_ret ::= */ yytestcase(yyruleno==155); + case 232: /* case_else ::= */ yytestcase(yyruleno==232); + case 233: /* case_operand ::= */ yytestcase(yyruleno==233); + case 252: /* vinto ::= */ yytestcase(yyruleno==252); +{yymsp[1].minor.yy454 = 0;} break; - case 145: /* having_opt ::= HAVING expr */ - case 152: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==152); - case 154: /* where_opt_ret ::= WHERE expr */ yytestcase(yyruleno==154); - case 228: /* case_else ::= ELSE expr */ yytestcase(yyruleno==228); - case 249: /* vinto ::= INTO expr */ yytestcase(yyruleno==249); -{yymsp[-1].minor.yy528 = yymsp[0].minor.yy528;} + case 147: /* having_opt ::= HAVING expr */ + case 154: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==154); + case 156: /* where_opt_ret ::= WHERE expr */ yytestcase(yyruleno==156); + case 231: /* case_else ::= ELSE expr */ yytestcase(yyruleno==231); + case 251: /* vinto ::= INTO expr */ yytestcase(yyruleno==251); +{yymsp[-1].minor.yy454 = yymsp[0].minor.yy454;} break; - case 147: /* limit_opt ::= LIMIT expr */ -{yymsp[-1].minor.yy528 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy528,0);} + case 149: /* limit_opt ::= LIMIT expr */ +{yymsp[-1].minor.yy454 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy454,0);} break; - case 148: /* limit_opt ::= LIMIT expr OFFSET expr */ -{yymsp[-3].minor.yy528 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[-2].minor.yy528,yymsp[0].minor.yy528);} + case 150: /* limit_opt ::= LIMIT expr OFFSET expr */ +{yymsp[-3].minor.yy454 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[-2].minor.yy454,yymsp[0].minor.yy454);} break; - case 149: /* limit_opt ::= LIMIT expr COMMA expr */ -{yymsp[-3].minor.yy528 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy528,yymsp[-2].minor.yy528);} + case 151: /* limit_opt ::= LIMIT expr COMMA expr */ +{yymsp[-3].minor.yy454 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy454,yymsp[-2].minor.yy454);} break; - case 150: /* cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret */ + case 152: /* cmd ::= with DELETE FROM xfullname indexed_opt where_opt_ret */ { - sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy131, &yymsp[-1].minor.yy0); - sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy131,yymsp[0].minor.yy528,0,0); + sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy203, &yymsp[-1].minor.yy0); + sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy203,yymsp[0].minor.yy454,0,0); } break; - case 155: /* where_opt_ret ::= RETURNING selcollist */ -{sqlite3AddReturning(pParse,yymsp[0].minor.yy322); yymsp[-1].minor.yy528 = 0;} + case 157: /* where_opt_ret ::= RETURNING selcollist */ +{sqlite3AddReturning(pParse,yymsp[0].minor.yy14); yymsp[-1].minor.yy454 = 0;} break; - case 156: /* where_opt_ret ::= WHERE expr RETURNING selcollist */ -{sqlite3AddReturning(pParse,yymsp[0].minor.yy322); yymsp[-3].minor.yy528 = yymsp[-2].minor.yy528;} + case 158: /* where_opt_ret ::= WHERE expr RETURNING selcollist */ +{sqlite3AddReturning(pParse,yymsp[0].minor.yy14); yymsp[-3].minor.yy454 = yymsp[-2].minor.yy454;} break; - case 157: /* cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret */ + case 159: /* cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist from where_opt_ret */ { - sqlite3SrcListIndexedBy(pParse, yymsp[-5].minor.yy131, &yymsp[-4].minor.yy0); - sqlite3ExprListCheckLength(pParse,yymsp[-2].minor.yy322,"set list"); - if( yymsp[-1].minor.yy131 ){ - SrcList *pFromClause = yymsp[-1].minor.yy131; + sqlite3SrcListIndexedBy(pParse, yymsp[-5].minor.yy203, &yymsp[-4].minor.yy0); + sqlite3ExprListCheckLength(pParse,yymsp[-2].minor.yy14,"set list"); + if( yymsp[-1].minor.yy203 ){ + SrcList *pFromClause = yymsp[-1].minor.yy203; if( pFromClause->nSrc>1 ){ Select *pSubquery; Token as; @@ -171035,93 +178106,92 @@ static YYACTIONTYPE yy_reduce( as.z = 0; pFromClause = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&as,pSubquery,0); } - yymsp[-5].minor.yy131 = sqlite3SrcListAppendList(pParse, yymsp[-5].minor.yy131, pFromClause); + yymsp[-5].minor.yy203 = sqlite3SrcListAppendList(pParse, yymsp[-5].minor.yy203, pFromClause); } - sqlite3Update(pParse,yymsp[-5].minor.yy131,yymsp[-2].minor.yy322,yymsp[0].minor.yy528,yymsp[-6].minor.yy394,0,0,0); + sqlite3Update(pParse,yymsp[-5].minor.yy203,yymsp[-2].minor.yy14,yymsp[0].minor.yy454,yymsp[-6].minor.yy144,0,0,0); } break; - case 158: /* setlist ::= setlist COMMA nm EQ expr */ + case 160: /* setlist ::= setlist COMMA nm EQ expr */ { - yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy322, yymsp[0].minor.yy528); - sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy322, &yymsp[-2].minor.yy0, 1); + yymsp[-4].minor.yy14 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy14, yymsp[0].minor.yy454); + sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy14, &yymsp[-2].minor.yy0, 1); } break; - case 159: /* setlist ::= setlist COMMA LP idlist RP EQ expr */ + case 161: /* setlist ::= setlist COMMA LP idlist RP EQ expr */ { - yymsp[-6].minor.yy322 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy322, yymsp[-3].minor.yy254, yymsp[0].minor.yy528); + yymsp[-6].minor.yy14 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy14, yymsp[-3].minor.yy132, yymsp[0].minor.yy454); } break; - case 160: /* setlist ::= nm EQ expr */ + case 162: /* setlist ::= nm EQ expr */ { - yylhsminor.yy322 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy528); - sqlite3ExprListSetName(pParse, yylhsminor.yy322, &yymsp[-2].minor.yy0, 1); + yylhsminor.yy14 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy454); + sqlite3ExprListSetName(pParse, yylhsminor.yy14, &yymsp[-2].minor.yy0, 1); } - yymsp[-2].minor.yy322 = yylhsminor.yy322; + yymsp[-2].minor.yy14 = yylhsminor.yy14; break; - case 161: /* setlist ::= LP idlist RP EQ expr */ + case 163: /* setlist ::= LP idlist RP EQ expr */ { - yymsp[-4].minor.yy322 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy254, yymsp[0].minor.yy528); + yymsp[-4].minor.yy14 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy132, yymsp[0].minor.yy454); } break; - case 162: /* cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ + case 164: /* cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ { - sqlite3Insert(pParse, yymsp[-3].minor.yy131, yymsp[-1].minor.yy47, yymsp[-2].minor.yy254, yymsp[-5].minor.yy394, yymsp[0].minor.yy444); + sqlite3Insert(pParse, yymsp[-3].minor.yy203, yymsp[-1].minor.yy555, yymsp[-2].minor.yy132, yymsp[-5].minor.yy144, yymsp[0].minor.yy122); } break; - case 163: /* cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning */ + case 165: /* cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES returning */ { - sqlite3Insert(pParse, yymsp[-4].minor.yy131, 0, yymsp[-3].minor.yy254, yymsp[-6].minor.yy394, 0); + sqlite3Insert(pParse, yymsp[-4].minor.yy203, 0, yymsp[-3].minor.yy132, yymsp[-6].minor.yy144, 0); } break; - case 164: /* upsert ::= */ -{ yymsp[1].minor.yy444 = 0; } + case 166: /* upsert ::= */ +{ yymsp[1].minor.yy122 = 0; } break; - case 165: /* upsert ::= RETURNING selcollist */ -{ yymsp[-1].minor.yy444 = 0; sqlite3AddReturning(pParse,yymsp[0].minor.yy322); } + case 167: /* upsert ::= RETURNING selcollist */ +{ yymsp[-1].minor.yy122 = 0; sqlite3AddReturning(pParse,yymsp[0].minor.yy14); } break; - case 166: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert */ -{ yymsp[-11].minor.yy444 = sqlite3UpsertNew(pParse->db,yymsp[-8].minor.yy322,yymsp[-6].minor.yy528,yymsp[-2].minor.yy322,yymsp[-1].minor.yy528,yymsp[0].minor.yy444);} + case 168: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt upsert */ +{ yymsp[-11].minor.yy122 = sqlite3UpsertNew(pParse->db,yymsp[-8].minor.yy14,yymsp[-6].minor.yy454,yymsp[-2].minor.yy14,yymsp[-1].minor.yy454,yymsp[0].minor.yy122);} break; - case 167: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert */ -{ yymsp[-8].minor.yy444 = sqlite3UpsertNew(pParse->db,yymsp[-5].minor.yy322,yymsp[-3].minor.yy528,0,0,yymsp[0].minor.yy444); } + case 169: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING upsert */ +{ yymsp[-8].minor.yy122 = sqlite3UpsertNew(pParse->db,yymsp[-5].minor.yy14,yymsp[-3].minor.yy454,0,0,yymsp[0].minor.yy122); } break; - case 168: /* upsert ::= ON CONFLICT DO NOTHING returning */ -{ yymsp[-4].minor.yy444 = sqlite3UpsertNew(pParse->db,0,0,0,0,0); } + case 170: /* upsert ::= ON CONFLICT DO NOTHING returning */ +{ yymsp[-4].minor.yy122 = sqlite3UpsertNew(pParse->db,0,0,0,0,0); } break; - case 169: /* upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning */ -{ yymsp[-7].minor.yy444 = sqlite3UpsertNew(pParse->db,0,0,yymsp[-2].minor.yy322,yymsp[-1].minor.yy528,0);} + case 171: /* upsert ::= ON CONFLICT DO UPDATE SET setlist where_opt returning */ +{ yymsp[-7].minor.yy122 = sqlite3UpsertNew(pParse->db,0,0,yymsp[-2].minor.yy14,yymsp[-1].minor.yy454,0);} break; - case 170: /* returning ::= RETURNING selcollist */ -{sqlite3AddReturning(pParse,yymsp[0].minor.yy322);} + case 172: /* returning ::= RETURNING selcollist */ +{sqlite3AddReturning(pParse,yymsp[0].minor.yy14);} break; - case 173: /* idlist_opt ::= */ -{yymsp[1].minor.yy254 = 0;} + case 175: /* idlist_opt ::= */ +{yymsp[1].minor.yy132 = 0;} break; - case 174: /* idlist_opt ::= LP idlist RP */ -{yymsp[-2].minor.yy254 = yymsp[-1].minor.yy254;} + case 176: /* idlist_opt ::= LP idlist RP */ +{yymsp[-2].minor.yy132 = yymsp[-1].minor.yy132;} break; - case 175: /* idlist ::= idlist COMMA nm */ -{yymsp[-2].minor.yy254 = sqlite3IdListAppend(pParse,yymsp[-2].minor.yy254,&yymsp[0].minor.yy0);} + case 177: /* idlist ::= idlist COMMA nm */ +{yymsp[-2].minor.yy132 = sqlite3IdListAppend(pParse,yymsp[-2].minor.yy132,&yymsp[0].minor.yy0);} break; - case 176: /* idlist ::= nm */ -{yymsp[0].minor.yy254 = sqlite3IdListAppend(pParse,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/} + case 178: /* idlist ::= nm */ +{yymsp[0].minor.yy132 = sqlite3IdListAppend(pParse,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/} break; - case 177: /* expr ::= LP expr RP */ -{yymsp[-2].minor.yy528 = yymsp[-1].minor.yy528;} + case 179: /* expr ::= LP expr RP */ +{yymsp[-2].minor.yy454 = yymsp[-1].minor.yy454;} break; - case 178: /* expr ::= ID|INDEXED */ - case 179: /* expr ::= JOIN_KW */ yytestcase(yyruleno==179); -{yymsp[0].minor.yy528=tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/} + case 180: /* expr ::= ID|INDEXED|JOIN_KW */ +{yymsp[0].minor.yy454=tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/} break; - case 180: /* expr ::= nm DOT nm */ + case 181: /* expr ::= nm DOT nm */ { Expr *temp1 = tokenExpr(pParse,TK_ID,yymsp[-2].minor.yy0); Expr *temp2 = tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); - yylhsminor.yy528 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2); + yylhsminor.yy454 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2); } - yymsp[-2].minor.yy528 = yylhsminor.yy528; + yymsp[-2].minor.yy454 = yylhsminor.yy454; break; - case 181: /* expr ::= nm DOT nm DOT nm */ + case 182: /* expr ::= nm DOT nm DOT nm */ { Expr *temp1 = tokenExpr(pParse,TK_ID,yymsp[-4].minor.yy0); Expr *temp2 = tokenExpr(pParse,TK_ID,yymsp[-2].minor.yy0); @@ -171130,27 +178200,27 @@ static YYACTIONTYPE yy_reduce( if( IN_RENAME_OBJECT ){ sqlite3RenameTokenRemap(pParse, 0, temp1); } - yylhsminor.yy528 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); + yylhsminor.yy454 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); } - yymsp[-4].minor.yy528 = yylhsminor.yy528; + yymsp[-4].minor.yy454 = yylhsminor.yy454; break; - case 182: /* term ::= NULL|FLOAT|BLOB */ - case 183: /* term ::= STRING */ yytestcase(yyruleno==183); -{yymsp[0].minor.yy528=tokenExpr(pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/} + case 183: /* term ::= NULL|FLOAT|BLOB */ + case 184: /* term ::= STRING */ yytestcase(yyruleno==184); +{yymsp[0].minor.yy454=tokenExpr(pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/} break; - case 184: /* term ::= INTEGER */ + case 185: /* term ::= INTEGER */ { - yylhsminor.yy528 = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1); - if( yylhsminor.yy528 ) yylhsminor.yy528->w.iOfst = (int)(yymsp[0].minor.yy0.z - pParse->zTail); + yylhsminor.yy454 = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1); + if( yylhsminor.yy454 ) yylhsminor.yy454->w.iOfst = (int)(yymsp[0].minor.yy0.z - pParse->zTail); } - yymsp[0].minor.yy528 = yylhsminor.yy528; + yymsp[0].minor.yy454 = yylhsminor.yy454; break; - case 185: /* expr ::= VARIABLE */ + case 186: /* expr ::= VARIABLE */ { if( !(yymsp[0].minor.yy0.z[0]=='#' && sqlite3Isdigit(yymsp[0].minor.yy0.z[1])) ){ u32 n = yymsp[0].minor.yy0.n; - yymsp[0].minor.yy528 = tokenExpr(pParse, TK_VARIABLE, yymsp[0].minor.yy0); - sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy528, n); + yymsp[0].minor.yy454 = tokenExpr(pParse, TK_VARIABLE, yymsp[0].minor.yy0); + sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy454, n); }else{ /* When doing a nested parse, one can include terms in an expression ** that look like this: #1 #2 ... These terms refer to registers @@ -171159,179 +178229,203 @@ static YYACTIONTYPE yy_reduce( assert( t.n>=2 ); if( pParse->nested==0 ){ sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t); - yymsp[0].minor.yy528 = 0; + yymsp[0].minor.yy454 = 0; }else{ - yymsp[0].minor.yy528 = sqlite3PExpr(pParse, TK_REGISTER, 0, 0); - if( yymsp[0].minor.yy528 ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy528->iTable); + yymsp[0].minor.yy454 = sqlite3PExpr(pParse, TK_REGISTER, 0, 0); + if( yymsp[0].minor.yy454 ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy454->iTable); } } } break; - case 186: /* expr ::= expr COLLATE ID|STRING */ + case 187: /* expr ::= expr COLLATE ID|STRING */ { - yymsp[-2].minor.yy528 = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy528, &yymsp[0].minor.yy0, 1); + yymsp[-2].minor.yy454 = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy454, &yymsp[0].minor.yy0, 1); } break; - case 187: /* expr ::= CAST LP expr AS typetoken RP */ + case 188: /* expr ::= CAST LP expr AS typetoken RP */ { - yymsp[-5].minor.yy528 = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1); - sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy528, yymsp[-3].minor.yy528, 0); + yymsp[-5].minor.yy454 = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1); + sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy454, yymsp[-3].minor.yy454, 0); } break; - case 188: /* expr ::= ID|INDEXED LP distinct exprlist RP */ + case 189: /* expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist RP */ { - yylhsminor.yy528 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy322, &yymsp[-4].minor.yy0, yymsp[-2].minor.yy394); + yylhsminor.yy454 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy14, &yymsp[-4].minor.yy0, yymsp[-2].minor.yy144); } - yymsp[-4].minor.yy528 = yylhsminor.yy528; + yymsp[-4].minor.yy454 = yylhsminor.yy454; break; - case 189: /* expr ::= ID|INDEXED LP STAR RP */ + case 190: /* expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist ORDER BY sortlist RP */ { - yylhsminor.yy528 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0, 0); + yylhsminor.yy454 = sqlite3ExprFunction(pParse, yymsp[-4].minor.yy14, &yymsp[-7].minor.yy0, yymsp[-5].minor.yy144); + sqlite3ExprAddFunctionOrderBy(pParse, yylhsminor.yy454, yymsp[-1].minor.yy14); } - yymsp[-3].minor.yy528 = yylhsminor.yy528; + yymsp[-7].minor.yy454 = yylhsminor.yy454; break; - case 190: /* expr ::= ID|INDEXED LP distinct exprlist RP filter_over */ + case 191: /* expr ::= ID|INDEXED|JOIN_KW LP STAR RP */ { - yylhsminor.yy528 = sqlite3ExprFunction(pParse, yymsp[-2].minor.yy322, &yymsp[-5].minor.yy0, yymsp[-3].minor.yy394); - sqlite3WindowAttach(pParse, yylhsminor.yy528, yymsp[0].minor.yy41); + yylhsminor.yy454 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0, 0); } - yymsp[-5].minor.yy528 = yylhsminor.yy528; + yymsp[-3].minor.yy454 = yylhsminor.yy454; break; - case 191: /* expr ::= ID|INDEXED LP STAR RP filter_over */ + case 192: /* expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist RP filter_over */ { - yylhsminor.yy528 = sqlite3ExprFunction(pParse, 0, &yymsp[-4].minor.yy0, 0); - sqlite3WindowAttach(pParse, yylhsminor.yy528, yymsp[0].minor.yy41); + yylhsminor.yy454 = sqlite3ExprFunction(pParse, yymsp[-2].minor.yy14, &yymsp[-5].minor.yy0, yymsp[-3].minor.yy144); + sqlite3WindowAttach(pParse, yylhsminor.yy454, yymsp[0].minor.yy211); } - yymsp[-4].minor.yy528 = yylhsminor.yy528; + yymsp[-5].minor.yy454 = yylhsminor.yy454; break; - case 192: /* term ::= CTIME_KW */ + case 193: /* expr ::= ID|INDEXED|JOIN_KW LP distinct exprlist ORDER BY sortlist RP filter_over */ { - yylhsminor.yy528 = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0, 0); + yylhsminor.yy454 = sqlite3ExprFunction(pParse, yymsp[-5].minor.yy14, &yymsp[-8].minor.yy0, yymsp[-6].minor.yy144); + sqlite3WindowAttach(pParse, yylhsminor.yy454, yymsp[0].minor.yy211); + sqlite3ExprAddFunctionOrderBy(pParse, yylhsminor.yy454, yymsp[-2].minor.yy14); } - yymsp[0].minor.yy528 = yylhsminor.yy528; + yymsp[-8].minor.yy454 = yylhsminor.yy454; break; - case 193: /* expr ::= LP nexprlist COMMA expr RP */ + case 194: /* expr ::= ID|INDEXED|JOIN_KW LP STAR RP filter_over */ { - ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy322, yymsp[-1].minor.yy528); - yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); - if( yymsp[-4].minor.yy528 ){ - yymsp[-4].minor.yy528->x.pList = pList; + yylhsminor.yy454 = sqlite3ExprFunction(pParse, 0, &yymsp[-4].minor.yy0, 0); + sqlite3WindowAttach(pParse, yylhsminor.yy454, yymsp[0].minor.yy211); +} + yymsp[-4].minor.yy454 = yylhsminor.yy454; + break; + case 195: /* term ::= CTIME_KW */ +{ + yylhsminor.yy454 = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0, 0); +} + yymsp[0].minor.yy454 = yylhsminor.yy454; + break; + case 196: /* expr ::= LP nexprlist COMMA expr RP */ +{ + ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy14, yymsp[-1].minor.yy454); + yymsp[-4].minor.yy454 = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); + if( yymsp[-4].minor.yy454 ){ + yymsp[-4].minor.yy454->x.pList = pList; if( ALWAYS(pList->nExpr) ){ - yymsp[-4].minor.yy528->flags |= pList->a[0].pExpr->flags & EP_Propagate; + yymsp[-4].minor.yy454->flags |= pList->a[0].pExpr->flags & EP_Propagate; } }else{ sqlite3ExprListDelete(pParse->db, pList); } } break; - case 194: /* expr ::= expr AND expr */ -{yymsp[-2].minor.yy528=sqlite3ExprAnd(pParse,yymsp[-2].minor.yy528,yymsp[0].minor.yy528);} + case 197: /* expr ::= expr AND expr */ +{yymsp[-2].minor.yy454=sqlite3ExprAnd(pParse,yymsp[-2].minor.yy454,yymsp[0].minor.yy454);} break; - case 195: /* expr ::= expr OR expr */ - case 196: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==196); - case 197: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==197); - case 198: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==198); - case 199: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==199); - case 200: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==200); - case 201: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==201); -{yymsp[-2].minor.yy528=sqlite3PExpr(pParse,yymsp[-1].major,yymsp[-2].minor.yy528,yymsp[0].minor.yy528);} + case 198: /* expr ::= expr OR expr */ + case 199: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==199); + case 200: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==200); + case 201: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==201); + case 202: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==202); + case 203: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==203); + case 204: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==204); +{yymsp[-2].minor.yy454=sqlite3PExpr(pParse,yymsp[-1].major,yymsp[-2].minor.yy454,yymsp[0].minor.yy454);} break; - case 202: /* likeop ::= NOT LIKE_KW|MATCH */ + case 205: /* likeop ::= NOT LIKE_KW|MATCH */ {yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.n|=0x80000000; /*yymsp[-1].minor.yy0-overwrite-yymsp[0].minor.yy0*/} break; - case 203: /* expr ::= expr likeop expr */ + case 206: /* expr ::= expr likeop expr */ { ExprList *pList; int bNot = yymsp[-1].minor.yy0.n & 0x80000000; yymsp[-1].minor.yy0.n &= 0x7fffffff; - pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy528); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy528); - yymsp[-2].minor.yy528 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0); - if( bNot ) yymsp[-2].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-2].minor.yy528, 0); - if( yymsp[-2].minor.yy528 ) yymsp[-2].minor.yy528->flags |= EP_InfixFunc; + pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy454); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy454); + yymsp[-2].minor.yy454 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0); + if( bNot ) yymsp[-2].minor.yy454 = sqlite3PExpr(pParse, TK_NOT, yymsp[-2].minor.yy454, 0); + if( yymsp[-2].minor.yy454 ) yymsp[-2].minor.yy454->flags |= EP_InfixFunc; } break; - case 204: /* expr ::= expr likeop expr ESCAPE expr */ + case 207: /* expr ::= expr likeop expr ESCAPE expr */ { ExprList *pList; int bNot = yymsp[-3].minor.yy0.n & 0x80000000; yymsp[-3].minor.yy0.n &= 0x7fffffff; - pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy528); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy528); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy528); - yymsp[-4].minor.yy528 = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0, 0); - if( bNot ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); - if( yymsp[-4].minor.yy528 ) yymsp[-4].minor.yy528->flags |= EP_InfixFunc; + pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy454); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy454); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy454); + yymsp[-4].minor.yy454 = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0, 0); + if( bNot ) yymsp[-4].minor.yy454 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy454, 0); + if( yymsp[-4].minor.yy454 ) yymsp[-4].minor.yy454->flags |= EP_InfixFunc; } break; - case 205: /* expr ::= expr ISNULL|NOTNULL */ -{yymsp[-1].minor.yy528 = sqlite3PExpr(pParse,yymsp[0].major,yymsp[-1].minor.yy528,0);} + case 208: /* expr ::= expr ISNULL|NOTNULL */ +{yymsp[-1].minor.yy454 = sqlite3PExpr(pParse,yymsp[0].major,yymsp[-1].minor.yy454,0);} break; - case 206: /* expr ::= expr NOT NULL */ -{yymsp[-2].minor.yy528 = sqlite3PExpr(pParse,TK_NOTNULL,yymsp[-2].minor.yy528,0);} + case 209: /* expr ::= expr NOT NULL */ +{yymsp[-2].minor.yy454 = sqlite3PExpr(pParse,TK_NOTNULL,yymsp[-2].minor.yy454,0);} break; - case 207: /* expr ::= expr IS expr */ + case 210: /* expr ::= expr IS expr */ { - yymsp[-2].minor.yy528 = sqlite3PExpr(pParse,TK_IS,yymsp[-2].minor.yy528,yymsp[0].minor.yy528); - binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-2].minor.yy528, TK_ISNULL); + yymsp[-2].minor.yy454 = sqlite3PExpr(pParse,TK_IS,yymsp[-2].minor.yy454,yymsp[0].minor.yy454); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy454, yymsp[-2].minor.yy454, TK_ISNULL); } break; - case 208: /* expr ::= expr IS NOT expr */ + case 211: /* expr ::= expr IS NOT expr */ { - yymsp[-3].minor.yy528 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-3].minor.yy528,yymsp[0].minor.yy528); - binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-3].minor.yy528, TK_NOTNULL); + yymsp[-3].minor.yy454 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-3].minor.yy454,yymsp[0].minor.yy454); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy454, yymsp[-3].minor.yy454, TK_NOTNULL); } break; - case 209: /* expr ::= expr IS NOT DISTINCT FROM expr */ + case 212: /* expr ::= expr IS NOT DISTINCT FROM expr */ { - yymsp[-5].minor.yy528 = sqlite3PExpr(pParse,TK_IS,yymsp[-5].minor.yy528,yymsp[0].minor.yy528); - binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-5].minor.yy528, TK_ISNULL); + yymsp[-5].minor.yy454 = sqlite3PExpr(pParse,TK_IS,yymsp[-5].minor.yy454,yymsp[0].minor.yy454); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy454, yymsp[-5].minor.yy454, TK_ISNULL); } break; - case 210: /* expr ::= expr IS DISTINCT FROM expr */ + case 213: /* expr ::= expr IS DISTINCT FROM expr */ { - yymsp[-4].minor.yy528 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-4].minor.yy528,yymsp[0].minor.yy528); - binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-4].minor.yy528, TK_NOTNULL); + yymsp[-4].minor.yy454 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-4].minor.yy454,yymsp[0].minor.yy454); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy454, yymsp[-4].minor.yy454, TK_NOTNULL); } break; - case 211: /* expr ::= NOT expr */ - case 212: /* expr ::= BITNOT expr */ yytestcase(yyruleno==212); -{yymsp[-1].minor.yy528 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy528, 0);/*A-overwrites-B*/} + case 214: /* expr ::= NOT expr */ + case 215: /* expr ::= BITNOT expr */ yytestcase(yyruleno==215); +{yymsp[-1].minor.yy454 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy454, 0);/*A-overwrites-B*/} break; - case 213: /* expr ::= PLUS|MINUS expr */ + case 216: /* expr ::= PLUS|MINUS expr */ { - yymsp[-1].minor.yy528 = sqlite3PExpr(pParse, yymsp[-1].major==TK_PLUS ? TK_UPLUS : TK_UMINUS, yymsp[0].minor.yy528, 0); - /*A-overwrites-B*/ + Expr *p = yymsp[0].minor.yy454; + u8 op = yymsp[-1].major + (TK_UPLUS-TK_PLUS); + assert( TK_UPLUS>TK_PLUS ); + assert( TK_UMINUS == TK_MINUS + (TK_UPLUS - TK_PLUS) ); + if( p && p->op==TK_UPLUS ){ + p->op = op; + yymsp[-1].minor.yy454 = p; + }else{ + yymsp[-1].minor.yy454 = sqlite3PExpr(pParse, op, p, 0); + /*A-overwrites-B*/ + } } break; - case 214: /* expr ::= expr PTR expr */ + case 217: /* expr ::= expr PTR expr */ { - ExprList *pList = sqlite3ExprListAppend(pParse, 0, yymsp[-2].minor.yy528); - pList = sqlite3ExprListAppend(pParse, pList, yymsp[0].minor.yy528); - yylhsminor.yy528 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0); + ExprList *pList = sqlite3ExprListAppend(pParse, 0, yymsp[-2].minor.yy454); + pList = sqlite3ExprListAppend(pParse, pList, yymsp[0].minor.yy454); + yylhsminor.yy454 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0, 0); } - yymsp[-2].minor.yy528 = yylhsminor.yy528; + yymsp[-2].minor.yy454 = yylhsminor.yy454; break; - case 215: /* between_op ::= BETWEEN */ - case 218: /* in_op ::= IN */ yytestcase(yyruleno==218); -{yymsp[0].minor.yy394 = 0;} + case 218: /* between_op ::= BETWEEN */ + case 221: /* in_op ::= IN */ yytestcase(yyruleno==221); +{yymsp[0].minor.yy144 = 0;} break; - case 217: /* expr ::= expr between_op expr AND expr */ + case 220: /* expr ::= expr between_op expr AND expr */ { - ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy528); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy528); - yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy528, 0); - if( yymsp[-4].minor.yy528 ){ - yymsp[-4].minor.yy528->x.pList = pList; + ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy454); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy454); + yymsp[-4].minor.yy454 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy454, 0); + if( yymsp[-4].minor.yy454 ){ + yymsp[-4].minor.yy454->x.pList = pList; }else{ sqlite3ExprListDelete(pParse->db, pList); } - if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); + if( yymsp[-3].minor.yy144 ) yymsp[-4].minor.yy454 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy454, 0); } break; - case 220: /* expr ::= expr in_op LP exprlist RP */ + case 223: /* expr ::= expr in_op LP exprlist RP */ { - if( yymsp[-1].minor.yy322==0 ){ + if( yymsp[-1].minor.yy14==0 ){ /* Expressions of the form ** ** expr1 IN () @@ -171340,211 +178434,208 @@ static YYACTIONTYPE yy_reduce( ** simplify to constants 0 (false) and 1 (true), respectively, ** regardless of the value of expr1. */ - sqlite3ExprUnmapAndDelete(pParse, yymsp[-4].minor.yy528); - yymsp[-4].minor.yy528 = sqlite3Expr(pParse->db, TK_STRING, yymsp[-3].minor.yy394 ? "true" : "false"); - if( yymsp[-4].minor.yy528 ) sqlite3ExprIdToTrueFalse(yymsp[-4].minor.yy528); - }else{ - Expr *pRHS = yymsp[-1].minor.yy322->a[0].pExpr; - if( yymsp[-1].minor.yy322->nExpr==1 && sqlite3ExprIsConstant(pRHS) && yymsp[-4].minor.yy528->op!=TK_VECTOR ){ - yymsp[-1].minor.yy322->a[0].pExpr = 0; - sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy322); + sqlite3ExprUnmapAndDelete(pParse, yymsp[-4].minor.yy454); + yymsp[-4].minor.yy454 = sqlite3Expr(pParse->db, TK_STRING, yymsp[-3].minor.yy144 ? "true" : "false"); + if( yymsp[-4].minor.yy454 ) sqlite3ExprIdToTrueFalse(yymsp[-4].minor.yy454); + }else{ + Expr *pRHS = yymsp[-1].minor.yy14->a[0].pExpr; + if( yymsp[-1].minor.yy14->nExpr==1 && sqlite3ExprIsConstant(pParse,pRHS) && yymsp[-4].minor.yy454->op!=TK_VECTOR ){ + yymsp[-1].minor.yy14->a[0].pExpr = 0; + sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy14); pRHS = sqlite3PExpr(pParse, TK_UPLUS, pRHS, 0); - yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_EQ, yymsp[-4].minor.yy528, pRHS); - }else if( yymsp[-1].minor.yy322->nExpr==1 && pRHS->op==TK_SELECT ){ - yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy528, 0); - sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy528, pRHS->x.pSelect); + yymsp[-4].minor.yy454 = sqlite3PExpr(pParse, TK_EQ, yymsp[-4].minor.yy454, pRHS); + }else if( yymsp[-1].minor.yy14->nExpr==1 && pRHS->op==TK_SELECT ){ + yymsp[-4].minor.yy454 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy454, 0); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy454, pRHS->x.pSelect); pRHS->x.pSelect = 0; - sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy322); - }else{ - yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy528, 0); - if( yymsp[-4].minor.yy528==0 ){ - sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy322); - }else if( yymsp[-4].minor.yy528->pLeft->op==TK_VECTOR ){ - int nExpr = yymsp[-4].minor.yy528->pLeft->x.pList->nExpr; - Select *pSelectRHS = sqlite3ExprListToValues(pParse, nExpr, yymsp[-1].minor.yy322); + sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy14); + }else{ + yymsp[-4].minor.yy454 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy454, 0); + if( yymsp[-4].minor.yy454==0 ){ + sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy14); + }else if( yymsp[-4].minor.yy454->pLeft->op==TK_VECTOR ){ + int nExpr = yymsp[-4].minor.yy454->pLeft->x.pList->nExpr; + Select *pSelectRHS = sqlite3ExprListToValues(pParse, nExpr, yymsp[-1].minor.yy14); if( pSelectRHS ){ parserDoubleLinkSelect(pParse, pSelectRHS); - sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy528, pSelectRHS); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy454, pSelectRHS); } }else{ - yymsp[-4].minor.yy528->x.pList = yymsp[-1].minor.yy322; - sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy528); + yymsp[-4].minor.yy454->x.pList = yymsp[-1].minor.yy14; + sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy454); } } - if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); + if( yymsp[-3].minor.yy144 ) yymsp[-4].minor.yy454 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy454, 0); } } break; - case 221: /* expr ::= LP select RP */ + case 224: /* expr ::= LP select RP */ { - yymsp[-2].minor.yy528 = sqlite3PExpr(pParse, TK_SELECT, 0, 0); - sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy528, yymsp[-1].minor.yy47); + yymsp[-2].minor.yy454 = sqlite3PExpr(pParse, TK_SELECT, 0, 0); + sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy454, yymsp[-1].minor.yy555); } break; - case 222: /* expr ::= expr in_op LP select RP */ + case 225: /* expr ::= expr in_op LP select RP */ { - yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy528, 0); - sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy528, yymsp[-1].minor.yy47); - if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); + yymsp[-4].minor.yy454 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy454, 0); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy454, yymsp[-1].minor.yy555); + if( yymsp[-3].minor.yy144 ) yymsp[-4].minor.yy454 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy454, 0); } break; - case 223: /* expr ::= expr in_op nm dbnm paren_exprlist */ + case 226: /* expr ::= expr in_op nm dbnm paren_exprlist */ { SrcList *pSrc = sqlite3SrcListAppend(pParse, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0); - if( yymsp[0].minor.yy322 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy322); - yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy528, 0); - sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy528, pSelect); - if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); + if( yymsp[0].minor.yy14 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy14); + yymsp[-4].minor.yy454 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy454, 0); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy454, pSelect); + if( yymsp[-3].minor.yy144 ) yymsp[-4].minor.yy454 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy454, 0); } break; - case 224: /* expr ::= EXISTS LP select RP */ + case 227: /* expr ::= EXISTS LP select RP */ { Expr *p; - p = yymsp[-3].minor.yy528 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); - sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy47); + p = yymsp[-3].minor.yy454 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); + sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy555); } break; - case 225: /* expr ::= CASE case_operand case_exprlist case_else END */ + case 228: /* expr ::= CASE case_operand case_exprlist case_else END */ { - yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy528, 0); - if( yymsp[-4].minor.yy528 ){ - yymsp[-4].minor.yy528->x.pList = yymsp[-1].minor.yy528 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy322,yymsp[-1].minor.yy528) : yymsp[-2].minor.yy322; - sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy528); + yymsp[-4].minor.yy454 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy454, 0); + if( yymsp[-4].minor.yy454 ){ + yymsp[-4].minor.yy454->x.pList = yymsp[-1].minor.yy454 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy14,yymsp[-1].minor.yy454) : yymsp[-2].minor.yy14; + sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy454); }else{ - sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy322); - sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy528); + sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy14); + sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy454); } } break; - case 226: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ + case 229: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ { - yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, yymsp[-2].minor.yy528); - yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, yymsp[0].minor.yy528); + yymsp[-4].minor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy14, yymsp[-2].minor.yy454); + yymsp[-4].minor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy14, yymsp[0].minor.yy454); } break; - case 227: /* case_exprlist ::= WHEN expr THEN expr */ + case 230: /* case_exprlist ::= WHEN expr THEN expr */ { - yymsp[-3].minor.yy322 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy528); - yymsp[-3].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy322, yymsp[0].minor.yy528); + yymsp[-3].minor.yy14 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy454); + yymsp[-3].minor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy14, yymsp[0].minor.yy454); } break; - case 230: /* case_operand ::= expr */ -{yymsp[0].minor.yy528 = yymsp[0].minor.yy528; /*A-overwrites-X*/} - break; - case 233: /* nexprlist ::= nexprlist COMMA expr */ -{yymsp[-2].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy322,yymsp[0].minor.yy528);} + case 235: /* nexprlist ::= nexprlist COMMA expr */ +{yymsp[-2].minor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy14,yymsp[0].minor.yy454);} break; - case 234: /* nexprlist ::= expr */ -{yymsp[0].minor.yy322 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy528); /*A-overwrites-Y*/} + case 236: /* nexprlist ::= expr */ +{yymsp[0].minor.yy14 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy454); /*A-overwrites-Y*/} break; - case 236: /* paren_exprlist ::= LP exprlist RP */ - case 241: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==241); -{yymsp[-2].minor.yy322 = yymsp[-1].minor.yy322;} + case 238: /* paren_exprlist ::= LP exprlist RP */ + case 243: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==243); +{yymsp[-2].minor.yy14 = yymsp[-1].minor.yy14;} break; - case 237: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + case 239: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ { sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, - sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy322, yymsp[-10].minor.yy394, - &yymsp[-11].minor.yy0, yymsp[0].minor.yy528, SQLITE_SO_ASC, yymsp[-8].minor.yy394, SQLITE_IDXTYPE_APPDEF); + sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy14, yymsp[-10].minor.yy144, + &yymsp[-11].minor.yy0, yymsp[0].minor.yy454, SQLITE_SO_ASC, yymsp[-8].minor.yy144, SQLITE_IDXTYPE_APPDEF); if( IN_RENAME_OBJECT && pParse->pNewIndex ){ sqlite3RenameTokenMap(pParse, pParse->pNewIndex->zName, &yymsp[-4].minor.yy0); } } break; - case 238: /* uniqueflag ::= UNIQUE */ - case 280: /* raisetype ::= ABORT */ yytestcase(yyruleno==280); -{yymsp[0].minor.yy394 = OE_Abort;} + case 240: /* uniqueflag ::= UNIQUE */ + case 282: /* raisetype ::= ABORT */ yytestcase(yyruleno==282); +{yymsp[0].minor.yy144 = OE_Abort;} break; - case 239: /* uniqueflag ::= */ -{yymsp[1].minor.yy394 = OE_None;} + case 241: /* uniqueflag ::= */ +{yymsp[1].minor.yy144 = OE_None;} break; - case 242: /* eidlist ::= eidlist COMMA nm collate sortorder */ + case 244: /* eidlist ::= eidlist COMMA nm collate sortorder */ { - yymsp[-4].minor.yy322 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy322, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy394, yymsp[0].minor.yy394); + yymsp[-4].minor.yy14 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy14, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy144, yymsp[0].minor.yy144); } break; - case 243: /* eidlist ::= nm collate sortorder */ + case 245: /* eidlist ::= nm collate sortorder */ { - yymsp[-2].minor.yy322 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy394, yymsp[0].minor.yy394); /*A-overwrites-Y*/ + yymsp[-2].minor.yy14 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy144, yymsp[0].minor.yy144); /*A-overwrites-Y*/ } break; - case 246: /* cmd ::= DROP INDEX ifexists fullname */ -{sqlite3DropIndex(pParse, yymsp[0].minor.yy131, yymsp[-1].minor.yy394);} + case 248: /* cmd ::= DROP INDEX ifexists fullname */ +{sqlite3DropIndex(pParse, yymsp[0].minor.yy203, yymsp[-1].minor.yy144);} break; - case 247: /* cmd ::= VACUUM vinto */ -{sqlite3Vacuum(pParse,0,yymsp[0].minor.yy528);} + case 249: /* cmd ::= VACUUM vinto */ +{sqlite3Vacuum(pParse,0,yymsp[0].minor.yy454);} break; - case 248: /* cmd ::= VACUUM nm vinto */ -{sqlite3Vacuum(pParse,&yymsp[-1].minor.yy0,yymsp[0].minor.yy528);} + case 250: /* cmd ::= VACUUM nm vinto */ +{sqlite3Vacuum(pParse,&yymsp[-1].minor.yy0,yymsp[0].minor.yy454);} break; - case 251: /* cmd ::= PRAGMA nm dbnm */ + case 253: /* cmd ::= PRAGMA nm dbnm */ {sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);} break; - case 252: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ + case 254: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);} break; - case 253: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ + case 255: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);} break; - case 254: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ + case 256: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);} break; - case 255: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ + case 257: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);} break; - case 258: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + case 260: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ { Token all; all.z = yymsp[-3].minor.yy0.z; all.n = (int)(yymsp[0].minor.yy0.z - yymsp[-3].minor.yy0.z) + yymsp[0].minor.yy0.n; - sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy33, &all); + sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy427, &all); } break; - case 259: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + case 261: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ { - sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy394, yymsp[-4].minor.yy180.a, yymsp[-4].minor.yy180.b, yymsp[-2].minor.yy131, yymsp[0].minor.yy528, yymsp[-10].minor.yy394, yymsp[-8].minor.yy394); + sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy144, yymsp[-4].minor.yy286.a, yymsp[-4].minor.yy286.b, yymsp[-2].minor.yy203, yymsp[0].minor.yy454, yymsp[-10].minor.yy144, yymsp[-8].minor.yy144); yymsp[-10].minor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); /*A-overwrites-T*/ } break; - case 260: /* trigger_time ::= BEFORE|AFTER */ -{ yymsp[0].minor.yy394 = yymsp[0].major; /*A-overwrites-X*/ } + case 262: /* trigger_time ::= BEFORE|AFTER */ +{ yymsp[0].minor.yy144 = yymsp[0].major; /*A-overwrites-X*/ } break; - case 261: /* trigger_time ::= INSTEAD OF */ -{ yymsp[-1].minor.yy394 = TK_INSTEAD;} + case 263: /* trigger_time ::= INSTEAD OF */ +{ yymsp[-1].minor.yy144 = TK_INSTEAD;} break; - case 262: /* trigger_time ::= */ -{ yymsp[1].minor.yy394 = TK_BEFORE; } + case 264: /* trigger_time ::= */ +{ yymsp[1].minor.yy144 = TK_BEFORE; } break; - case 263: /* trigger_event ::= DELETE|INSERT */ - case 264: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==264); -{yymsp[0].minor.yy180.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy180.b = 0;} + case 265: /* trigger_event ::= DELETE|INSERT */ + case 266: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==266); +{yymsp[0].minor.yy286.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy286.b = 0;} break; - case 265: /* trigger_event ::= UPDATE OF idlist */ -{yymsp[-2].minor.yy180.a = TK_UPDATE; yymsp[-2].minor.yy180.b = yymsp[0].minor.yy254;} + case 267: /* trigger_event ::= UPDATE OF idlist */ +{yymsp[-2].minor.yy286.a = TK_UPDATE; yymsp[-2].minor.yy286.b = yymsp[0].minor.yy132;} break; - case 266: /* when_clause ::= */ - case 285: /* key_opt ::= */ yytestcase(yyruleno==285); -{ yymsp[1].minor.yy528 = 0; } + case 268: /* when_clause ::= */ + case 287: /* key_opt ::= */ yytestcase(yyruleno==287); +{ yymsp[1].minor.yy454 = 0; } break; - case 267: /* when_clause ::= WHEN expr */ - case 286: /* key_opt ::= KEY expr */ yytestcase(yyruleno==286); -{ yymsp[-1].minor.yy528 = yymsp[0].minor.yy528; } + case 269: /* when_clause ::= WHEN expr */ + case 288: /* key_opt ::= KEY expr */ yytestcase(yyruleno==288); +{ yymsp[-1].minor.yy454 = yymsp[0].minor.yy454; } break; - case 268: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + case 270: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ { - assert( yymsp[-2].minor.yy33!=0 ); - yymsp[-2].minor.yy33->pLast->pNext = yymsp[-1].minor.yy33; - yymsp[-2].minor.yy33->pLast = yymsp[-1].minor.yy33; + assert( yymsp[-2].minor.yy427!=0 ); + yymsp[-2].minor.yy427->pLast->pNext = yymsp[-1].minor.yy427; + yymsp[-2].minor.yy427->pLast = yymsp[-1].minor.yy427; } break; - case 269: /* trigger_cmd_list ::= trigger_cmd SEMI */ + case 271: /* trigger_cmd_list ::= trigger_cmd SEMI */ { - assert( yymsp[-1].minor.yy33!=0 ); - yymsp[-1].minor.yy33->pLast = yymsp[-1].minor.yy33; + assert( yymsp[-1].minor.yy427!=0 ); + yymsp[-1].minor.yy427->pLast = yymsp[-1].minor.yy427; } break; - case 270: /* trnm ::= nm DOT nm */ + case 272: /* trnm ::= nm DOT nm */ { yymsp[-2].minor.yy0 = yymsp[0].minor.yy0; sqlite3ErrorMsg(pParse, @@ -171552,370 +178643,377 @@ static YYACTIONTYPE yy_reduce( "statements within triggers"); } break; - case 271: /* tridxby ::= INDEXED BY nm */ + case 273: /* tridxby ::= INDEXED BY nm */ { sqlite3ErrorMsg(pParse, "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " "within triggers"); } break; - case 272: /* tridxby ::= NOT INDEXED */ + case 274: /* tridxby ::= NOT INDEXED */ { sqlite3ErrorMsg(pParse, "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " "within triggers"); } break; - case 273: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ -{yylhsminor.yy33 = sqlite3TriggerUpdateStep(pParse, &yymsp[-6].minor.yy0, yymsp[-2].minor.yy131, yymsp[-3].minor.yy322, yymsp[-1].minor.yy528, yymsp[-7].minor.yy394, yymsp[-8].minor.yy0.z, yymsp[0].minor.yy522);} - yymsp[-8].minor.yy33 = yylhsminor.yy33; + case 275: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ +{yylhsminor.yy427 = sqlite3TriggerUpdateStep(pParse, &yymsp[-6].minor.yy0, yymsp[-2].minor.yy203, yymsp[-3].minor.yy14, yymsp[-1].minor.yy454, yymsp[-7].minor.yy144, yymsp[-8].minor.yy0.z, yymsp[0].minor.yy168);} + yymsp[-8].minor.yy427 = yylhsminor.yy427; break; - case 274: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + case 276: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ { - yylhsminor.yy33 = sqlite3TriggerInsertStep(pParse,&yymsp[-4].minor.yy0,yymsp[-3].minor.yy254,yymsp[-2].minor.yy47,yymsp[-6].minor.yy394,yymsp[-1].minor.yy444,yymsp[-7].minor.yy522,yymsp[0].minor.yy522);/*yylhsminor.yy33-overwrites-yymsp[-6].minor.yy394*/ + yylhsminor.yy427 = sqlite3TriggerInsertStep(pParse,&yymsp[-4].minor.yy0,yymsp[-3].minor.yy132,yymsp[-2].minor.yy555,yymsp[-6].minor.yy144,yymsp[-1].minor.yy122,yymsp[-7].minor.yy168,yymsp[0].minor.yy168);/*yylhsminor.yy427-overwrites-yymsp[-6].minor.yy144*/ } - yymsp[-7].minor.yy33 = yylhsminor.yy33; + yymsp[-7].minor.yy427 = yylhsminor.yy427; break; - case 275: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ -{yylhsminor.yy33 = sqlite3TriggerDeleteStep(pParse, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy528, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy522);} - yymsp[-5].minor.yy33 = yylhsminor.yy33; + case 277: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ +{yylhsminor.yy427 = sqlite3TriggerDeleteStep(pParse, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy454, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy168);} + yymsp[-5].minor.yy427 = yylhsminor.yy427; break; - case 276: /* trigger_cmd ::= scanpt select scanpt */ -{yylhsminor.yy33 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy47, yymsp[-2].minor.yy522, yymsp[0].minor.yy522); /*yylhsminor.yy33-overwrites-yymsp[-1].minor.yy47*/} - yymsp[-2].minor.yy33 = yylhsminor.yy33; + case 278: /* trigger_cmd ::= scanpt select scanpt */ +{yylhsminor.yy427 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy555, yymsp[-2].minor.yy168, yymsp[0].minor.yy168); /*yylhsminor.yy427-overwrites-yymsp[-1].minor.yy555*/} + yymsp[-2].minor.yy427 = yylhsminor.yy427; break; - case 277: /* expr ::= RAISE LP IGNORE RP */ + case 279: /* expr ::= RAISE LP IGNORE RP */ { - yymsp[-3].minor.yy528 = sqlite3PExpr(pParse, TK_RAISE, 0, 0); - if( yymsp[-3].minor.yy528 ){ - yymsp[-3].minor.yy528->affExpr = OE_Ignore; + yymsp[-3].minor.yy454 = sqlite3PExpr(pParse, TK_RAISE, 0, 0); + if( yymsp[-3].minor.yy454 ){ + yymsp[-3].minor.yy454->affExpr = OE_Ignore; } } break; - case 278: /* expr ::= RAISE LP raisetype COMMA nm RP */ + case 280: /* expr ::= RAISE LP raisetype COMMA expr RP */ { - yymsp[-5].minor.yy528 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); - if( yymsp[-5].minor.yy528 ) { - yymsp[-5].minor.yy528->affExpr = (char)yymsp[-3].minor.yy394; + yymsp[-5].minor.yy454 = sqlite3PExpr(pParse, TK_RAISE, yymsp[-1].minor.yy454, 0); + if( yymsp[-5].minor.yy454 ) { + yymsp[-5].minor.yy454->affExpr = (char)yymsp[-3].minor.yy144; } } break; - case 279: /* raisetype ::= ROLLBACK */ -{yymsp[0].minor.yy394 = OE_Rollback;} + case 281: /* raisetype ::= ROLLBACK */ +{yymsp[0].minor.yy144 = OE_Rollback;} break; - case 281: /* raisetype ::= FAIL */ -{yymsp[0].minor.yy394 = OE_Fail;} + case 283: /* raisetype ::= FAIL */ +{yymsp[0].minor.yy144 = OE_Fail;} break; - case 282: /* cmd ::= DROP TRIGGER ifexists fullname */ + case 284: /* cmd ::= DROP TRIGGER ifexists fullname */ { - sqlite3DropTrigger(pParse,yymsp[0].minor.yy131,yymsp[-1].minor.yy394); + sqlite3DropTrigger(pParse,yymsp[0].minor.yy203,yymsp[-1].minor.yy144); } break; - case 283: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + case 285: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ { - sqlite3Attach(pParse, yymsp[-3].minor.yy528, yymsp[-1].minor.yy528, yymsp[0].minor.yy528); + sqlite3Attach(pParse, yymsp[-3].minor.yy454, yymsp[-1].minor.yy454, yymsp[0].minor.yy454); } break; - case 284: /* cmd ::= DETACH database_kw_opt expr */ + case 286: /* cmd ::= DETACH database_kw_opt expr */ { - sqlite3Detach(pParse, yymsp[0].minor.yy528); + sqlite3Detach(pParse, yymsp[0].minor.yy454); } break; - case 287: /* cmd ::= REINDEX */ + case 289: /* cmd ::= REINDEX */ {sqlite3Reindex(pParse, 0, 0);} break; - case 288: /* cmd ::= REINDEX nm dbnm */ + case 290: /* cmd ::= REINDEX nm dbnm */ {sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} break; - case 289: /* cmd ::= ANALYZE */ + case 291: /* cmd ::= ANALYZE */ {sqlite3Analyze(pParse, 0, 0);} break; - case 290: /* cmd ::= ANALYZE nm dbnm */ + case 292: /* cmd ::= ANALYZE nm dbnm */ {sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} break; - case 291: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ + case 293: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ { - sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy131,&yymsp[0].minor.yy0); + sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy203,&yymsp[0].minor.yy0); } break; - case 292: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + case 294: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ { yymsp[-1].minor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-1].minor.yy0.z) + pParse->sLastToken.n; sqlite3AlterFinishAddColumn(pParse, &yymsp[-1].minor.yy0); } break; - case 293: /* cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ + case 295: /* cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ { - sqlite3AlterDropColumn(pParse, yymsp[-3].minor.yy131, &yymsp[0].minor.yy0); + sqlite3AlterDropColumn(pParse, yymsp[-3].minor.yy203, &yymsp[0].minor.yy0); } break; - case 294: /* add_column_fullname ::= fullname */ + case 296: /* add_column_fullname ::= fullname */ { disableLookaside(pParse); - sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy131); + sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy203); } break; - case 295: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + case 297: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ { - sqlite3AlterRenameColumn(pParse, yymsp[-5].minor.yy131, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); + sqlite3AlterRenameColumn(pParse, yymsp[-5].minor.yy203, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 296: /* cmd ::= create_vtab */ + case 298: /* cmd ::= create_vtab */ {sqlite3VtabFinishParse(pParse,0);} break; - case 297: /* cmd ::= create_vtab LP vtabarglist RP */ + case 299: /* cmd ::= create_vtab LP vtabarglist RP */ {sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);} break; - case 298: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + case 300: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ { - sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy394); + sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy144); } break; - case 299: /* vtabarg ::= */ + case 301: /* vtabarg ::= */ {sqlite3VtabArgInit(pParse);} break; - case 300: /* vtabargtoken ::= ANY */ - case 301: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==301); - case 302: /* lp ::= LP */ yytestcase(yyruleno==302); + case 302: /* vtabargtoken ::= ANY */ + case 303: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==303); + case 304: /* lp ::= LP */ yytestcase(yyruleno==304); {sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);} break; - case 303: /* with ::= WITH wqlist */ - case 304: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==304); -{ sqlite3WithPush(pParse, yymsp[0].minor.yy521, 1); } + case 305: /* with ::= WITH wqlist */ + case 306: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==306); +{ sqlite3WithPush(pParse, yymsp[0].minor.yy59, 1); } break; - case 305: /* wqas ::= AS */ -{yymsp[0].minor.yy516 = M10d_Any;} + case 307: /* wqas ::= AS */ +{yymsp[0].minor.yy462 = M10d_Any;} break; - case 306: /* wqas ::= AS MATERIALIZED */ -{yymsp[-1].minor.yy516 = M10d_Yes;} + case 308: /* wqas ::= AS MATERIALIZED */ +{yymsp[-1].minor.yy462 = M10d_Yes;} break; - case 307: /* wqas ::= AS NOT MATERIALIZED */ -{yymsp[-2].minor.yy516 = M10d_No;} + case 309: /* wqas ::= AS NOT MATERIALIZED */ +{yymsp[-2].minor.yy462 = M10d_No;} break; - case 308: /* wqitem ::= nm eidlist_opt wqas LP select RP */ + case 310: /* wqitem ::= withnm eidlist_opt wqas LP select RP */ { - yymsp[-5].minor.yy385 = sqlite3CteNew(pParse, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy322, yymsp[-1].minor.yy47, yymsp[-3].minor.yy516); /*A-overwrites-X*/ + yymsp[-5].minor.yy67 = sqlite3CteNew(pParse, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy14, yymsp[-1].minor.yy555, yymsp[-3].minor.yy462); /*A-overwrites-X*/ } break; - case 309: /* wqlist ::= wqitem */ -{ - yymsp[0].minor.yy521 = sqlite3WithAdd(pParse, 0, yymsp[0].minor.yy385); /*A-overwrites-X*/ -} + case 311: /* withnm ::= nm */ +{pParse->bHasWith = 1;} break; - case 310: /* wqlist ::= wqlist COMMA wqitem */ + case 312: /* wqlist ::= wqitem */ { - yymsp[-2].minor.yy521 = sqlite3WithAdd(pParse, yymsp[-2].minor.yy521, yymsp[0].minor.yy385); + yymsp[0].minor.yy59 = sqlite3WithAdd(pParse, 0, yymsp[0].minor.yy67); /*A-overwrites-X*/ } break; - case 311: /* windowdefn_list ::= windowdefn */ -{ yylhsminor.yy41 = yymsp[0].minor.yy41; } - yymsp[0].minor.yy41 = yylhsminor.yy41; - break; - case 312: /* windowdefn_list ::= windowdefn_list COMMA windowdefn */ + case 313: /* wqlist ::= wqlist COMMA wqitem */ { - assert( yymsp[0].minor.yy41!=0 ); - sqlite3WindowChain(pParse, yymsp[0].minor.yy41, yymsp[-2].minor.yy41); - yymsp[0].minor.yy41->pNextWin = yymsp[-2].minor.yy41; - yylhsminor.yy41 = yymsp[0].minor.yy41; + yymsp[-2].minor.yy59 = sqlite3WithAdd(pParse, yymsp[-2].minor.yy59, yymsp[0].minor.yy67); } - yymsp[-2].minor.yy41 = yylhsminor.yy41; break; - case 313: /* windowdefn ::= nm AS LP window RP */ + case 314: /* windowdefn_list ::= windowdefn_list COMMA windowdefn */ { - if( ALWAYS(yymsp[-1].minor.yy41) ){ - yymsp[-1].minor.yy41->zName = sqlite3DbStrNDup(pParse->db, yymsp[-4].minor.yy0.z, yymsp[-4].minor.yy0.n); - } - yylhsminor.yy41 = yymsp[-1].minor.yy41; + assert( yymsp[0].minor.yy211!=0 ); + sqlite3WindowChain(pParse, yymsp[0].minor.yy211, yymsp[-2].minor.yy211); + yymsp[0].minor.yy211->pNextWin = yymsp[-2].minor.yy211; + yylhsminor.yy211 = yymsp[0].minor.yy211; } - yymsp[-4].minor.yy41 = yylhsminor.yy41; + yymsp[-2].minor.yy211 = yylhsminor.yy211; break; - case 314: /* window ::= PARTITION BY nexprlist orderby_opt frame_opt */ + case 315: /* windowdefn ::= nm AS LP window RP */ { - yymsp[-4].minor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, yymsp[-2].minor.yy322, yymsp[-1].minor.yy322, 0); + if( ALWAYS(yymsp[-1].minor.yy211) ){ + yymsp[-1].minor.yy211->zName = sqlite3DbStrNDup(pParse->db, yymsp[-4].minor.yy0.z, yymsp[-4].minor.yy0.n); + } + yylhsminor.yy211 = yymsp[-1].minor.yy211; } + yymsp[-4].minor.yy211 = yylhsminor.yy211; break; - case 315: /* window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ + case 316: /* window ::= PARTITION BY nexprlist orderby_opt frame_opt */ { - yylhsminor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, yymsp[-2].minor.yy322, yymsp[-1].minor.yy322, &yymsp[-5].minor.yy0); + yymsp[-4].minor.yy211 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy211, yymsp[-2].minor.yy14, yymsp[-1].minor.yy14, 0); } - yymsp[-5].minor.yy41 = yylhsminor.yy41; break; - case 316: /* window ::= ORDER BY sortlist frame_opt */ + case 317: /* window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ { - yymsp[-3].minor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, 0, yymsp[-1].minor.yy322, 0); + yylhsminor.yy211 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy211, yymsp[-2].minor.yy14, yymsp[-1].minor.yy14, &yymsp[-5].minor.yy0); } + yymsp[-5].minor.yy211 = yylhsminor.yy211; break; - case 317: /* window ::= nm ORDER BY sortlist frame_opt */ + case 318: /* window ::= ORDER BY sortlist frame_opt */ { - yylhsminor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, 0, yymsp[-1].minor.yy322, &yymsp[-4].minor.yy0); + yymsp[-3].minor.yy211 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy211, 0, yymsp[-1].minor.yy14, 0); } - yymsp[-4].minor.yy41 = yylhsminor.yy41; break; - case 318: /* window ::= frame_opt */ - case 337: /* filter_over ::= over_clause */ yytestcase(yyruleno==337); + case 319: /* window ::= nm ORDER BY sortlist frame_opt */ { - yylhsminor.yy41 = yymsp[0].minor.yy41; + yylhsminor.yy211 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy211, 0, yymsp[-1].minor.yy14, &yymsp[-4].minor.yy0); } - yymsp[0].minor.yy41 = yylhsminor.yy41; + yymsp[-4].minor.yy211 = yylhsminor.yy211; break; - case 319: /* window ::= nm frame_opt */ + case 320: /* window ::= nm frame_opt */ { - yylhsminor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, 0, 0, &yymsp[-1].minor.yy0); + yylhsminor.yy211 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy211, 0, 0, &yymsp[-1].minor.yy0); } - yymsp[-1].minor.yy41 = yylhsminor.yy41; + yymsp[-1].minor.yy211 = yylhsminor.yy211; break; - case 320: /* frame_opt ::= */ + case 321: /* frame_opt ::= */ { - yymsp[1].minor.yy41 = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0); + yymsp[1].minor.yy211 = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0); } break; - case 321: /* frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ + case 322: /* frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ { - yylhsminor.yy41 = sqlite3WindowAlloc(pParse, yymsp[-2].minor.yy394, yymsp[-1].minor.yy595.eType, yymsp[-1].minor.yy595.pExpr, TK_CURRENT, 0, yymsp[0].minor.yy516); + yylhsminor.yy211 = sqlite3WindowAlloc(pParse, yymsp[-2].minor.yy144, yymsp[-1].minor.yy509.eType, yymsp[-1].minor.yy509.pExpr, TK_CURRENT, 0, yymsp[0].minor.yy462); } - yymsp[-2].minor.yy41 = yylhsminor.yy41; + yymsp[-2].minor.yy211 = yylhsminor.yy211; break; - case 322: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ + case 323: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ { - yylhsminor.yy41 = sqlite3WindowAlloc(pParse, yymsp[-5].minor.yy394, yymsp[-3].minor.yy595.eType, yymsp[-3].minor.yy595.pExpr, yymsp[-1].minor.yy595.eType, yymsp[-1].minor.yy595.pExpr, yymsp[0].minor.yy516); + yylhsminor.yy211 = sqlite3WindowAlloc(pParse, yymsp[-5].minor.yy144, yymsp[-3].minor.yy509.eType, yymsp[-3].minor.yy509.pExpr, yymsp[-1].minor.yy509.eType, yymsp[-1].minor.yy509.pExpr, yymsp[0].minor.yy462); } - yymsp[-5].minor.yy41 = yylhsminor.yy41; + yymsp[-5].minor.yy211 = yylhsminor.yy211; break; - case 324: /* frame_bound_s ::= frame_bound */ - case 326: /* frame_bound_e ::= frame_bound */ yytestcase(yyruleno==326); -{yylhsminor.yy595 = yymsp[0].minor.yy595;} - yymsp[0].minor.yy595 = yylhsminor.yy595; + case 325: /* frame_bound_s ::= frame_bound */ + case 327: /* frame_bound_e ::= frame_bound */ yytestcase(yyruleno==327); +{yylhsminor.yy509 = yymsp[0].minor.yy509;} + yymsp[0].minor.yy509 = yylhsminor.yy509; break; - case 325: /* frame_bound_s ::= UNBOUNDED PRECEDING */ - case 327: /* frame_bound_e ::= UNBOUNDED FOLLOWING */ yytestcase(yyruleno==327); - case 329: /* frame_bound ::= CURRENT ROW */ yytestcase(yyruleno==329); -{yylhsminor.yy595.eType = yymsp[-1].major; yylhsminor.yy595.pExpr = 0;} - yymsp[-1].minor.yy595 = yylhsminor.yy595; + case 326: /* frame_bound_s ::= UNBOUNDED PRECEDING */ + case 328: /* frame_bound_e ::= UNBOUNDED FOLLOWING */ yytestcase(yyruleno==328); + case 330: /* frame_bound ::= CURRENT ROW */ yytestcase(yyruleno==330); +{yylhsminor.yy509.eType = yymsp[-1].major; yylhsminor.yy509.pExpr = 0;} + yymsp[-1].minor.yy509 = yylhsminor.yy509; break; - case 328: /* frame_bound ::= expr PRECEDING|FOLLOWING */ -{yylhsminor.yy595.eType = yymsp[0].major; yylhsminor.yy595.pExpr = yymsp[-1].minor.yy528;} - yymsp[-1].minor.yy595 = yylhsminor.yy595; + case 329: /* frame_bound ::= expr PRECEDING|FOLLOWING */ +{yylhsminor.yy509.eType = yymsp[0].major; yylhsminor.yy509.pExpr = yymsp[-1].minor.yy454;} + yymsp[-1].minor.yy509 = yylhsminor.yy509; break; - case 330: /* frame_exclude_opt ::= */ -{yymsp[1].minor.yy516 = 0;} + case 331: /* frame_exclude_opt ::= */ +{yymsp[1].minor.yy462 = 0;} break; - case 331: /* frame_exclude_opt ::= EXCLUDE frame_exclude */ -{yymsp[-1].minor.yy516 = yymsp[0].minor.yy516;} + case 332: /* frame_exclude_opt ::= EXCLUDE frame_exclude */ +{yymsp[-1].minor.yy462 = yymsp[0].minor.yy462;} break; - case 332: /* frame_exclude ::= NO OTHERS */ - case 333: /* frame_exclude ::= CURRENT ROW */ yytestcase(yyruleno==333); -{yymsp[-1].minor.yy516 = yymsp[-1].major; /*A-overwrites-X*/} + case 333: /* frame_exclude ::= NO OTHERS */ + case 334: /* frame_exclude ::= CURRENT ROW */ yytestcase(yyruleno==334); +{yymsp[-1].minor.yy462 = yymsp[-1].major; /*A-overwrites-X*/} break; - case 334: /* frame_exclude ::= GROUP|TIES */ -{yymsp[0].minor.yy516 = yymsp[0].major; /*A-overwrites-X*/} + case 335: /* frame_exclude ::= GROUP|TIES */ +{yymsp[0].minor.yy462 = yymsp[0].major; /*A-overwrites-X*/} break; - case 335: /* window_clause ::= WINDOW windowdefn_list */ -{ yymsp[-1].minor.yy41 = yymsp[0].minor.yy41; } + case 336: /* window_clause ::= WINDOW windowdefn_list */ +{ yymsp[-1].minor.yy211 = yymsp[0].minor.yy211; } break; - case 336: /* filter_over ::= filter_clause over_clause */ + case 337: /* filter_over ::= filter_clause over_clause */ { - if( yymsp[0].minor.yy41 ){ - yymsp[0].minor.yy41->pFilter = yymsp[-1].minor.yy528; + if( yymsp[0].minor.yy211 ){ + yymsp[0].minor.yy211->pFilter = yymsp[-1].minor.yy454; }else{ - sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy528); + sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy454); } - yylhsminor.yy41 = yymsp[0].minor.yy41; + yylhsminor.yy211 = yymsp[0].minor.yy211; +} + yymsp[-1].minor.yy211 = yylhsminor.yy211; + break; + case 338: /* filter_over ::= over_clause */ +{ + yylhsminor.yy211 = yymsp[0].minor.yy211; } - yymsp[-1].minor.yy41 = yylhsminor.yy41; + yymsp[0].minor.yy211 = yylhsminor.yy211; break; - case 338: /* filter_over ::= filter_clause */ + case 339: /* filter_over ::= filter_clause */ { - yylhsminor.yy41 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); - if( yylhsminor.yy41 ){ - yylhsminor.yy41->eFrmType = TK_FILTER; - yylhsminor.yy41->pFilter = yymsp[0].minor.yy528; + yylhsminor.yy211 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); + if( yylhsminor.yy211 ){ + yylhsminor.yy211->eFrmType = TK_FILTER; + yylhsminor.yy211->pFilter = yymsp[0].minor.yy454; }else{ - sqlite3ExprDelete(pParse->db, yymsp[0].minor.yy528); + sqlite3ExprDelete(pParse->db, yymsp[0].minor.yy454); } } - yymsp[0].minor.yy41 = yylhsminor.yy41; + yymsp[0].minor.yy211 = yylhsminor.yy211; break; - case 339: /* over_clause ::= OVER LP window RP */ + case 340: /* over_clause ::= OVER LP window RP */ { - yymsp[-3].minor.yy41 = yymsp[-1].minor.yy41; - assert( yymsp[-3].minor.yy41!=0 ); + yymsp[-3].minor.yy211 = yymsp[-1].minor.yy211; + assert( yymsp[-3].minor.yy211!=0 ); } break; - case 340: /* over_clause ::= OVER nm */ + case 341: /* over_clause ::= OVER nm */ { - yymsp[-1].minor.yy41 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); - if( yymsp[-1].minor.yy41 ){ - yymsp[-1].minor.yy41->zName = sqlite3DbStrNDup(pParse->db, yymsp[0].minor.yy0.z, yymsp[0].minor.yy0.n); + yymsp[-1].minor.yy211 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); + if( yymsp[-1].minor.yy211 ){ + yymsp[-1].minor.yy211->zName = sqlite3DbStrNDup(pParse->db, yymsp[0].minor.yy0.z, yymsp[0].minor.yy0.n); } } break; - case 341: /* filter_clause ::= FILTER LP WHERE expr RP */ -{ yymsp[-4].minor.yy528 = yymsp[-1].minor.yy528; } + case 342: /* filter_clause ::= FILTER LP WHERE expr RP */ +{ yymsp[-4].minor.yy454 = yymsp[-1].minor.yy454; } + break; + case 343: /* term ::= QNUMBER */ +{ + yylhsminor.yy454=tokenExpr(pParse,yymsp[0].major,yymsp[0].minor.yy0); + sqlite3DequoteNumber(pParse, yylhsminor.yy454); +} + yymsp[0].minor.yy454 = yylhsminor.yy454; break; default: - /* (342) input ::= cmdlist */ yytestcase(yyruleno==342); - /* (343) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==343); - /* (344) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=344); - /* (345) ecmd ::= SEMI */ yytestcase(yyruleno==345); - /* (346) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==346); - /* (347) ecmd ::= explain cmdx SEMI (NEVER REDUCES) */ assert(yyruleno!=347); - /* (348) trans_opt ::= */ yytestcase(yyruleno==348); - /* (349) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==349); - /* (350) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==350); - /* (351) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==351); - /* (352) savepoint_opt ::= */ yytestcase(yyruleno==352); - /* (353) cmd ::= create_table create_table_args */ yytestcase(yyruleno==353); - /* (354) table_option_set ::= table_option (OPTIMIZED OUT) */ assert(yyruleno!=354); - /* (355) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==355); - /* (356) columnlist ::= columnname carglist */ yytestcase(yyruleno==356); - /* (357) nm ::= ID|INDEXED */ yytestcase(yyruleno==357); - /* (358) nm ::= STRING */ yytestcase(yyruleno==358); - /* (359) nm ::= JOIN_KW */ yytestcase(yyruleno==359); - /* (360) typetoken ::= typename */ yytestcase(yyruleno==360); - /* (361) typename ::= ID|STRING */ yytestcase(yyruleno==361); - /* (362) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=362); - /* (363) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=363); - /* (364) carglist ::= carglist ccons */ yytestcase(yyruleno==364); - /* (365) carglist ::= */ yytestcase(yyruleno==365); - /* (366) ccons ::= NULL onconf */ yytestcase(yyruleno==366); - /* (367) ccons ::= GENERATED ALWAYS AS generated */ yytestcase(yyruleno==367); - /* (368) ccons ::= AS generated */ yytestcase(yyruleno==368); - /* (369) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==369); - /* (370) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==370); - /* (371) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=371); - /* (372) tconscomma ::= */ yytestcase(yyruleno==372); - /* (373) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=373); - /* (374) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=374); - /* (375) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=375); - /* (376) oneselect ::= values */ yytestcase(yyruleno==376); - /* (377) sclp ::= selcollist COMMA */ yytestcase(yyruleno==377); - /* (378) as ::= ID|STRING */ yytestcase(yyruleno==378); - /* (379) indexed_opt ::= indexed_by (OPTIMIZED OUT) */ assert(yyruleno!=379); - /* (380) returning ::= */ yytestcase(yyruleno==380); - /* (381) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=381); - /* (382) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==382); - /* (383) exprlist ::= nexprlist */ yytestcase(yyruleno==383); - /* (384) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=384); - /* (385) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=385); - /* (386) nmnum ::= ON */ yytestcase(yyruleno==386); - /* (387) nmnum ::= DELETE */ yytestcase(yyruleno==387); - /* (388) nmnum ::= DEFAULT */ yytestcase(yyruleno==388); - /* (389) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==389); - /* (390) foreach_clause ::= */ yytestcase(yyruleno==390); - /* (391) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==391); - /* (392) trnm ::= nm */ yytestcase(yyruleno==392); - /* (393) tridxby ::= */ yytestcase(yyruleno==393); - /* (394) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==394); - /* (395) database_kw_opt ::= */ yytestcase(yyruleno==395); - /* (396) kwcolumn_opt ::= */ yytestcase(yyruleno==396); - /* (397) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==397); - /* (398) vtabarglist ::= vtabarg */ yytestcase(yyruleno==398); - /* (399) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==399); - /* (400) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==400); - /* (401) anylist ::= */ yytestcase(yyruleno==401); - /* (402) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==402); - /* (403) anylist ::= anylist ANY */ yytestcase(yyruleno==403); - /* (404) with ::= */ yytestcase(yyruleno==404); + /* (344) input ::= cmdlist */ yytestcase(yyruleno==344); + /* (345) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==345); + /* (346) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=346); + /* (347) ecmd ::= SEMI */ yytestcase(yyruleno==347); + /* (348) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==348); + /* (349) ecmd ::= explain cmdx SEMI (NEVER REDUCES) */ assert(yyruleno!=349); + /* (350) trans_opt ::= */ yytestcase(yyruleno==350); + /* (351) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==351); + /* (352) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==352); + /* (353) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==353); + /* (354) savepoint_opt ::= */ yytestcase(yyruleno==354); + /* (355) cmd ::= create_table create_table_args */ yytestcase(yyruleno==355); + /* (356) table_option_set ::= table_option (OPTIMIZED OUT) */ assert(yyruleno!=356); + /* (357) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==357); + /* (358) columnlist ::= columnname carglist */ yytestcase(yyruleno==358); + /* (359) nm ::= ID|INDEXED|JOIN_KW */ yytestcase(yyruleno==359); + /* (360) nm ::= STRING */ yytestcase(yyruleno==360); + /* (361) typetoken ::= typename */ yytestcase(yyruleno==361); + /* (362) typename ::= ID|STRING */ yytestcase(yyruleno==362); + /* (363) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=363); + /* (364) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=364); + /* (365) carglist ::= carglist ccons */ yytestcase(yyruleno==365); + /* (366) carglist ::= */ yytestcase(yyruleno==366); + /* (367) ccons ::= NULL onconf */ yytestcase(yyruleno==367); + /* (368) ccons ::= GENERATED ALWAYS AS generated */ yytestcase(yyruleno==368); + /* (369) ccons ::= AS generated */ yytestcase(yyruleno==369); + /* (370) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==370); + /* (371) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==371); + /* (372) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=372); + /* (373) tconscomma ::= */ yytestcase(yyruleno==373); + /* (374) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=374); + /* (375) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=375); + /* (376) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=376); + /* (377) oneselect ::= values */ yytestcase(yyruleno==377); + /* (378) sclp ::= selcollist COMMA */ yytestcase(yyruleno==378); + /* (379) as ::= ID|STRING */ yytestcase(yyruleno==379); + /* (380) indexed_opt ::= indexed_by (OPTIMIZED OUT) */ assert(yyruleno!=380); + /* (381) returning ::= */ yytestcase(yyruleno==381); + /* (382) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=382); + /* (383) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==383); + /* (384) case_operand ::= expr */ yytestcase(yyruleno==384); + /* (385) exprlist ::= nexprlist */ yytestcase(yyruleno==385); + /* (386) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=386); + /* (387) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=387); + /* (388) nmnum ::= ON */ yytestcase(yyruleno==388); + /* (389) nmnum ::= DELETE */ yytestcase(yyruleno==389); + /* (390) nmnum ::= DEFAULT */ yytestcase(yyruleno==390); + /* (391) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==391); + /* (392) foreach_clause ::= */ yytestcase(yyruleno==392); + /* (393) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==393); + /* (394) trnm ::= nm */ yytestcase(yyruleno==394); + /* (395) tridxby ::= */ yytestcase(yyruleno==395); + /* (396) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==396); + /* (397) database_kw_opt ::= */ yytestcase(yyruleno==397); + /* (398) kwcolumn_opt ::= */ yytestcase(yyruleno==398); + /* (399) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==399); + /* (400) vtabarglist ::= vtabarg */ yytestcase(yyruleno==400); + /* (401) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==401); + /* (402) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==402); + /* (403) anylist ::= */ yytestcase(yyruleno==403); + /* (404) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==404); + /* (405) anylist ::= anylist ANY */ yytestcase(yyruleno==405); + /* (406) with ::= */ yytestcase(yyruleno==406); + /* (407) windowdefn_list ::= windowdefn (OPTIMIZED OUT) */ assert(yyruleno!=407); + /* (408) window ::= frame_opt (OPTIMIZED OUT) */ assert(yyruleno!=408); break; /********** End reduce actions ************************************************/ }; @@ -172102,19 +179200,12 @@ SQLITE_PRIVATE void sqlite3Parser( (int)(yypParser->yytos - yypParser->yystack)); } #endif -#if YYSTACKDEPTH>0 if( yypParser->yytos>=yypParser->yystackEnd ){ - yyStackOverflow(yypParser); - break; - } -#else - if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){ if( yyGrowStack(yypParser) ){ yyStackOverflow(yypParser); break; } } -#endif } yyact = yy_reduce(yypParser,yyruleno,yymajor,yyminor sqlite3ParserCTX_PARAM); }else if( yyact <= YY_MAX_SHIFTREDUCE ){ @@ -172491,7 +179582,7 @@ static const unsigned char aKWHash[127] = { /* aKWNext[] forms the hash collision chain. If aKWHash[i]==0 ** then the i-th keyword has no more hash collisions. Otherwise, ** the next keyword with the same hash is aKWHash[i]-1. */ -static const unsigned char aKWNext[147] = { +static const unsigned char aKWNext[148] = {0, 0, 0, 0, 0, 4, 0, 43, 0, 0, 106, 114, 0, 0, 0, 2, 0, 0, 143, 0, 0, 0, 13, 0, 0, 0, 0, 141, 0, 0, 119, 52, 0, 0, 137, 12, 0, 0, 62, 0, @@ -172506,7 +179597,7 @@ static const unsigned char aKWNext[147] = { 102, 0, 0, 87, }; /* aKWLen[i] is the length (in bytes) of the i-th keyword */ -static const unsigned char aKWLen[147] = { +static const unsigned char aKWLen[148] = {0, 7, 7, 5, 4, 6, 4, 5, 3, 6, 7, 3, 6, 6, 7, 7, 3, 8, 2, 6, 5, 4, 4, 3, 10, 4, 7, 6, 9, 4, 2, 6, 5, 9, 9, 4, 7, 3, 2, 4, @@ -172522,7 +179613,7 @@ static const unsigned char aKWLen[147] = { }; /* aKWOffset[i] is the index into zKWText[] of the start of ** the text for the i-th keyword. */ -static const unsigned short int aKWOffset[147] = { +static const unsigned short int aKWOffset[148] = {0, 0, 2, 2, 8, 9, 14, 16, 20, 23, 25, 25, 29, 33, 36, 41, 46, 48, 53, 54, 59, 62, 65, 67, 69, 78, 81, 86, 90, 90, 94, 99, 101, 105, 111, 119, 123, 123, 123, 126, @@ -172537,7 +179628,7 @@ static const unsigned short int aKWOffset[147] = { 648, 650, 655, 659, }; /* aKWCode[i] is the parser symbol code for the i-th keyword */ -static const unsigned char aKWCode[147] = { +static const unsigned char aKWCode[148] = {0, TK_REINDEX, TK_INDEXED, TK_INDEX, TK_DESC, TK_ESCAPE, TK_EACH, TK_CHECK, TK_KEY, TK_BEFORE, TK_FOREIGN, TK_FOR, TK_IGNORE, TK_LIKE_KW, TK_EXPLAIN, TK_INSTEAD, @@ -172704,185 +179795,185 @@ static const unsigned char aKWCode[147] = { static int keywordCode(const char *z, int n, int *pType){ int i, j; const char *zKW; - if( n>=2 ){ - i = ((charMap(z[0])*4) ^ (charMap(z[n-1])*3) ^ n*1) % 127; - for(i=((int)aKWHash[i])-1; i>=0; i=((int)aKWNext[i])-1){ - if( aKWLen[i]!=n ) continue; - zKW = &zKWText[aKWOffset[i]]; + assert( n>=2 ); + i = ((charMap(z[0])*4) ^ (charMap(z[n-1])*3) ^ n*1) % 127; + for(i=(int)aKWHash[i]; i>0; i=aKWNext[i]){ + if( aKWLen[i]!=n ) continue; + zKW = &zKWText[aKWOffset[i]]; #ifdef SQLITE_ASCII - if( (z[0]&~0x20)!=zKW[0] ) continue; - if( (z[1]&~0x20)!=zKW[1] ) continue; - j = 2; - while( j=2 ) keywordCode((char*)z, n, &id); return id; } #define SQLITE_N_KEYWORD 147 SQLITE_API int sqlite3_keyword_name(int i,const char **pzName,int *pnName){ if( i<0 || i>=SQLITE_N_KEYWORD ) return SQLITE_ERROR; + i++; *pzName = zKWText + aKWOffset[i]; *pnName = aKWLen[i]; return SQLITE_OK; @@ -173181,31 +180272,62 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ testcase( z[0]=='0' ); testcase( z[0]=='1' ); testcase( z[0]=='2' ); testcase( z[0]=='3' ); testcase( z[0]=='4' ); testcase( z[0]=='5' ); testcase( z[0]=='6' ); testcase( z[0]=='7' ); testcase( z[0]=='8' ); - testcase( z[0]=='9' ); + testcase( z[0]=='9' ); testcase( z[0]=='.' ); *tokenType = TK_INTEGER; #ifndef SQLITE_OMIT_HEX_INTEGER if( z[0]=='0' && (z[1]=='x' || z[1]=='X') && sqlite3Isxdigit(z[2]) ){ - for(i=3; sqlite3Isxdigit(z[i]); i++){} - return i; - } + for(i=3; 1; i++){ + if( sqlite3Isxdigit(z[i])==0 ){ + if( z[i]==SQLITE_DIGIT_SEPARATOR ){ + *tokenType = TK_QNUMBER; + }else{ + break; + } + } + } + }else #endif - for(i=0; sqlite3Isdigit(z[i]); i++){} + { + for(i=0; 1; i++){ + if( sqlite3Isdigit(z[i])==0 ){ + if( z[i]==SQLITE_DIGIT_SEPARATOR ){ + *tokenType = TK_QNUMBER; + }else{ + break; + } + } + } #ifndef SQLITE_OMIT_FLOATING_POINT - if( z[i]=='.' ){ - i++; - while( sqlite3Isdigit(z[i]) ){ i++; } - *tokenType = TK_FLOAT; - } - if( (z[i]=='e' || z[i]=='E') && - ( sqlite3Isdigit(z[i+1]) - || ((z[i+1]=='+' || z[i+1]=='-') && sqlite3Isdigit(z[i+2])) - ) - ){ - i += 2; - while( sqlite3Isdigit(z[i]) ){ i++; } - *tokenType = TK_FLOAT; - } + if( z[i]=='.' ){ + if( *tokenType==TK_INTEGER ) *tokenType = TK_FLOAT; + for(i++; 1; i++){ + if( sqlite3Isdigit(z[i])==0 ){ + if( z[i]==SQLITE_DIGIT_SEPARATOR ){ + *tokenType = TK_QNUMBER; + }else{ + break; + } + } + } + } + if( (z[i]=='e' || z[i]=='E') && + ( sqlite3Isdigit(z[i+1]) + || ((z[i+1]=='+' || z[i+1]=='-') && sqlite3Isdigit(z[i+2])) + ) + ){ + if( *tokenType==TK_INTEGER ) *tokenType = TK_FLOAT; + for(i+=2; 1; i++){ + if( sqlite3Isdigit(z[i])==0 ){ + if( z[i]==SQLITE_DIGIT_SEPARATOR ){ + *tokenType = TK_QNUMBER; + }else{ + break; + } + } + } + } #endif + } while( IdChar(z[i]) ){ *tokenType = TK_ILLEGAL; i++; @@ -173253,7 +180375,8 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ return i; } case CC_KYWD0: { - for(i=1; aiClass[z[i]]<=CC_KYWD; i++){} + if( aiClass[z[1]]>CC_KYWD ){ i = 1; break; } + for(i=2; aiClass[z[i]]<=CC_KYWD; i++){} if( IdChar(z[i]) ){ /* This token started out using characters that can appear in keywords, ** but z[i] is a character not allowed within keywords, so this must @@ -173369,10 +180492,13 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql){ if( tokenType>=TK_WINDOW ){ assert( tokenType==TK_SPACE || tokenType==TK_OVER || tokenType==TK_FILTER || tokenType==TK_ILLEGAL || tokenType==TK_WINDOW + || tokenType==TK_QNUMBER ); #else if( tokenType>=TK_SPACE ){ - assert( tokenType==TK_SPACE || tokenType==TK_ILLEGAL ); + assert( tokenType==TK_SPACE || tokenType==TK_ILLEGAL + || tokenType==TK_QNUMBER + ); #endif /* SQLITE_OMIT_WINDOWFUNC */ if( AtomicLoad(&db->u1.isInterrupted) ){ pParse->rc = SQLITE_INTERRUPT; @@ -173405,7 +180531,7 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql){ assert( n==6 ); tokenType = analyzeFilterKeyword((const u8*)&zSql[6], lastTokenParsed); #endif /* SQLITE_OMIT_WINDOWFUNC */ - }else{ + }else if( tokenType!=TK_QNUMBER ){ Token x; x.z = zSql; x.n = n; @@ -174032,30 +181158,20 @@ static int sqlite3TestExtInit(sqlite3 *db){ ** Forward declarations of external module initializer functions ** for modules that need them. */ -#ifdef SQLITE_ENABLE_FTS1 -SQLITE_PRIVATE int sqlite3Fts1Init(sqlite3*); -#endif -#ifdef SQLITE_ENABLE_FTS2 -SQLITE_PRIVATE int sqlite3Fts2Init(sqlite3*); -#endif #ifdef SQLITE_ENABLE_FTS5 SQLITE_PRIVATE int sqlite3Fts5Init(sqlite3*); #endif #ifdef SQLITE_ENABLE_STMTVTAB SQLITE_PRIVATE int sqlite3StmtVtabInit(sqlite3*); #endif - +#ifdef SQLITE_EXTRA_AUTOEXT +int SQLITE_EXTRA_AUTOEXT(sqlite3*); +#endif /* ** An array of pointers to extension initializer functions for ** built-in extensions. */ static int (*const sqlite3BuiltinExtensions[])(sqlite3*) = { -#ifdef SQLITE_ENABLE_FTS1 - sqlite3Fts1Init, -#endif -#ifdef SQLITE_ENABLE_FTS2 - sqlite3Fts2Init, -#endif #ifdef SQLITE_ENABLE_FTS3 sqlite3Fts3Init, #endif @@ -174084,6 +181200,9 @@ static int (*const sqlite3BuiltinExtensions[])(sqlite3*) = { #ifdef SQLITE_ENABLE_BYTECODE_VTAB sqlite3VdbeBytecodeVtabInit, #endif +#ifdef SQLITE_EXTRA_AUTOEXT + SQLITE_EXTRA_AUTOEXT, +#endif }; #ifndef SQLITE_AMALGAMATION @@ -174096,10 +181215,7 @@ SQLITE_API const char sqlite3_version[] = SQLITE_VERSION; /* IMPLEMENTATION-OF: R-53536-42575 The sqlite3_libversion() function returns ** a pointer to the to the sqlite3_version[] string constant. */ -/* -* GraalPy change: use SQLITE_VERSION instead of sqlite3_version -*/ -SQLITE_API const char *sqlite3_libversion(void){ return SQLITE_VERSION; } +SQLITE_API const char *sqlite3_libversion(void){ return sqlite3_version; } /* IMPLEMENTATION-OF: R-25063-23286 The sqlite3_sourceid() function returns a ** pointer to a string constant whose value is the same as the @@ -174354,7 +181470,6 @@ SQLITE_API int sqlite3_initialize(void){ rc = SQLITE_EXTRA_INIT(0); } #endif - return rc; } @@ -174424,9 +181539,21 @@ SQLITE_API int sqlite3_config(int op, ...){ va_list ap; int rc = SQLITE_OK; - /* sqlite3_config() shall return SQLITE_MISUSE if it is invoked while - ** the SQLite library is in use. */ - if( sqlite3GlobalConfig.isInit ) return SQLITE_MISUSE_BKPT; + /* sqlite3_config() normally returns SQLITE_MISUSE if it is invoked while + ** the SQLite library is in use. Except, a few selected opcodes + ** are allowed. + */ + if( sqlite3GlobalConfig.isInit ){ + static const u64 mAnytimeConfigOption = 0 + | MASKBIT64( SQLITE_CONFIG_LOG ) + | MASKBIT64( SQLITE_CONFIG_PCACHE_HDRSZ ) + ; + if( op<0 || op>63 || (MASKBIT64(op) & mAnytimeConfigOption)==0 ){ + return SQLITE_MISUSE_BKPT; + } + testcase( op==SQLITE_CONFIG_LOG ); + testcase( op==SQLITE_CONFIG_PCACHE_HDRSZ ); + } va_start(ap, op); switch( op ){ @@ -174495,6 +181622,7 @@ SQLITE_API int sqlite3_config(int op, ...){ break; } case SQLITE_CONFIG_MEMSTATUS: { + assert( !sqlite3GlobalConfig.isInit ); /* Cannot change at runtime */ /* EVIDENCE-OF: R-61275-35157 The SQLITE_CONFIG_MEMSTATUS option takes ** single argument of type int, interpreted as a boolean, which enables ** or disables the collection of memory allocation statistics. */ @@ -174618,8 +181746,10 @@ SQLITE_API int sqlite3_config(int op, ...){ ** sqlite3GlobalConfig.xLog = va_arg(ap, void(*)(void*,int,const char*)); */ typedef void(*LOGFUNC_t)(void*,int,const char*); - sqlite3GlobalConfig.xLog = va_arg(ap, LOGFUNC_t); - sqlite3GlobalConfig.pLogArg = va_arg(ap, void*); + LOGFUNC_t xLog = va_arg(ap, LOGFUNC_t); + void *pLogArg = va_arg(ap, void*); + AtomicStore(&sqlite3GlobalConfig.xLog, xLog); + AtomicStore(&sqlite3GlobalConfig.pLogArg, pLogArg); break; } @@ -174633,7 +181763,8 @@ SQLITE_API int sqlite3_config(int op, ...){ ** argument of type int. If non-zero, then URI handling is globally ** enabled. If the parameter is zero, then URI handling is globally ** disabled. */ - sqlite3GlobalConfig.bOpenUri = va_arg(ap, int); + int bOpenUri = va_arg(ap, int); + AtomicStore(&sqlite3GlobalConfig.bOpenUri, bOpenUri); break; } @@ -174718,6 +181849,18 @@ SQLITE_API int sqlite3_config(int op, ...){ } #endif /* SQLITE_OMIT_DESERIALIZE */ + case SQLITE_CONFIG_ROWID_IN_VIEW: { + int *pVal = va_arg(ap,int*); +#ifdef SQLITE_ALLOW_ROWID_IN_VIEW + if( 0==*pVal ) sqlite3GlobalConfig.mNoVisibleRowid = TF_NoVisibleRowid; + if( 1==*pVal ) sqlite3GlobalConfig.mNoVisibleRowid = 0; + *pVal = (sqlite3GlobalConfig.mNoVisibleRowid==0); +#else + *pVal = 0; +#endif + break; + } + default: { rc = SQLITE_ERROR; break; @@ -174909,6 +182052,10 @@ SQLITE_API int sqlite3_db_cacheflush(sqlite3 *db){ SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){ va_list ap; int rc; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif sqlite3_mutex_enter(db->mutex); va_start(ap, op); switch( op ){ @@ -174948,6 +182095,8 @@ SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){ { SQLITE_DBCONFIG_DQS_DML, SQLITE_DqsDML }, { SQLITE_DBCONFIG_LEGACY_FILE_FORMAT, SQLITE_LegacyFileFmt }, { SQLITE_DBCONFIG_TRUSTED_SCHEMA, SQLITE_TrustedSchema }, + { SQLITE_DBCONFIG_STMT_SCANSTATUS, SQLITE_StmtScanStatus }, + { SQLITE_DBCONFIG_REVERSE_SCANORDER, SQLITE_ReverseOrder }, }; unsigned int i; rc = SQLITE_ERROR; /* IMP: R-42790-23372 */ @@ -175236,6 +182385,14 @@ static int sqlite3Close(sqlite3 *db, int forceZombie){ } #endif + while( db->pDbData ){ + DbClientData *p = db->pDbData; + db->pDbData = p->pNext; + assert( p->pData!=0 ); + if( p->xDestructor ) p->xDestructor(p->pData); + sqlite3_free(p); + } + /* Convert the connection into a zombie and then close it. */ db->eOpenState = SQLITE_STATE_ZOMBIE; @@ -175653,9 +182810,9 @@ static int sqliteDefaultBusyCallback( void *ptr, /* Database connection */ int count /* Number of times table has been busy */ ){ -#if SQLITE_OS_WIN || HAVE_USLEEP +#if SQLITE_OS_WIN || !defined(HAVE_NANOSLEEP) || HAVE_NANOSLEEP /* This case is for systems that have support for sleeping for fractions of - ** a second. Examples: All windows systems, unix systems with usleep() */ + ** a second. Examples: All windows systems, unix systems with nanosleep() */ static const u8 delays[] = { 1, 2, 5, 10, 15, 20, 25, 25, 25, 50, 50, 100 }; static const u8 totals[] = @@ -175853,7 +183010,8 @@ SQLITE_PRIVATE int sqlite3CreateFunc( assert( SQLITE_FUNC_CONSTANT==SQLITE_DETERMINISTIC ); assert( SQLITE_FUNC_DIRECT==SQLITE_DIRECTONLY ); extraFlags = enc & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY| - SQLITE_SUBTYPE|SQLITE_INNOCUOUS); + SQLITE_SUBTYPE|SQLITE_INNOCUOUS| + SQLITE_RESULT_SUBTYPE|SQLITE_SELFORDER1); enc &= (SQLITE_FUNC_ENCMASK|SQLITE_ANY); /* The SQLITE_INNOCUOUS flag is the same bit as SQLITE_FUNC_UNSAFE. But @@ -176310,6 +183468,12 @@ SQLITE_API void *sqlite3_preupdate_hook( void *pArg /* First callback argument */ ){ void *pRet; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( db==0 ){ + return 0; + } +#endif sqlite3_mutex_enter(db->mutex); pRet = db->pPreUpdateArg; db->xPreUpdateCallback = xCallback; @@ -176456,7 +183620,7 @@ SQLITE_API int sqlite3_wal_checkpoint_v2( if( eModeSQLITE_CHECKPOINT_TRUNCATE ){ /* EVIDENCE-OF: R-03996-12088 The M parameter must be a valid checkpoint ** mode: */ - return SQLITE_MISUSE; + return SQLITE_MISUSE_BKPT; } sqlite3_mutex_enter(db->mutex); @@ -176933,9 +184097,9 @@ SQLITE_PRIVATE int sqlite3ParseUri( assert( *pzErrMsg==0 ); - if( ((flags & SQLITE_OPEN_URI) /* IMP: R-48725-32206 */ - || sqlite3GlobalConfig.bOpenUri) /* IMP: R-51689-46548 */ - && nUri>=5 && memcmp(zUri, "file:", 5)==0 /* IMP: R-57884-37496 */ + if( ((flags & SQLITE_OPEN_URI) /* IMP: R-48725-32206 */ + || AtomicLoad(&sqlite3GlobalConfig.bOpenUri)) /* IMP: R-51689-46548 */ + && nUri>=5 && memcmp(zUri, "file:", 5)==0 /* IMP: R-57884-37496 */ ){ char *zOpt; int eState; /* Parser state when parsing URI */ @@ -177293,7 +184457,7 @@ static int openDatabase( ** 0 off off ** ** Legacy behavior is 3 (double-quoted string literals are allowed anywhere) -** and so that is the default. But developers are encouranged to use +** and so that is the default. But developers are encouraged to use ** -DSQLITE_DQS=0 (best) or -DSQLITE_DQS=1 (second choice) if possible. */ #if !defined(SQLITE_DQS) @@ -177341,6 +184505,9 @@ static int openDatabase( #endif #if defined(SQLITE_DEFAULT_LEGACY_ALTER_TABLE) | SQLITE_LegacyAlter +#endif +#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) + | SQLITE_StmtScanStatus #endif ; sqlite3HashInit(&db->aCollSeq); @@ -177399,6 +184566,7 @@ static int openDatabase( if( ((1<<(flags&7)) & 0x46)==0 ){ rc = SQLITE_MISUSE_BKPT; /* IMP: R-18321-05872 */ }else{ + if( zFilename==0 ) zFilename = ":memory:"; rc = sqlite3ParseUri(zVfs, zFilename, &flags, &db->pVfs, &zOpen, &zErrMsg); } if( rc!=SQLITE_OK ){ @@ -177690,6 +184858,69 @@ SQLITE_API int sqlite3_collation_needed16( } #endif /* SQLITE_OMIT_UTF16 */ +/* +** Find existing client data. +*/ +SQLITE_API void *sqlite3_get_clientdata(sqlite3 *db, const char *zName){ + DbClientData *p; + sqlite3_mutex_enter(db->mutex); + for(p=db->pDbData; p; p=p->pNext){ + if( strcmp(p->zName, zName)==0 ){ + void *pResult = p->pData; + sqlite3_mutex_leave(db->mutex); + return pResult; + } + } + sqlite3_mutex_leave(db->mutex); + return 0; +} + +/* +** Add new client data to a database connection. +*/ +SQLITE_API int sqlite3_set_clientdata( + sqlite3 *db, /* Attach client data to this connection */ + const char *zName, /* Name of the client data */ + void *pData, /* The client data itself */ + void (*xDestructor)(void*) /* Destructor */ +){ + DbClientData *p, **pp; + sqlite3_mutex_enter(db->mutex); + pp = &db->pDbData; + for(p=db->pDbData; p && strcmp(p->zName,zName); p=p->pNext){ + pp = &p->pNext; + } + if( p ){ + assert( p->pData!=0 ); + if( p->xDestructor ) p->xDestructor(p->pData); + if( pData==0 ){ + *pp = p->pNext; + sqlite3_free(p); + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; + } + }else if( pData==0 ){ + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; + }else{ + size_t n = strlen(zName); + p = sqlite3_malloc64( sizeof(DbClientData)+n+1 ); + if( p==0 ){ + if( xDestructor ) xDestructor(pData); + sqlite3_mutex_leave(db->mutex); + return SQLITE_NOMEM; + } + memcpy(p->zName, zName, n+1); + p->pNext = db->pDbData; + db->pDbData = p; + } + p->pData = pData; + p->xDestructor = xDestructor; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + + #ifndef SQLITE_OMIT_DEPRECATED /* ** This function is now an anachronism. It used to be used to recover from a @@ -177825,7 +185056,7 @@ SQLITE_API int sqlite3_table_column_metadata( /* Find the column for which info is requested */ if( zColumnName==0 ){ - /* Query for existance of table only */ + /* Query for existence of table only */ }else{ for(iCol=0; iColnCol; iCol++){ pCol = &pTab->aCol[iCol]; @@ -177906,7 +185137,7 @@ SQLITE_API int sqlite3_sleep(int ms){ /* This function works in milliseconds, but the underlying OsSleep() ** API uses microseconds. Hence the 1000's. */ - rc = (sqlite3OsSleep(pVfs, 1000*ms)/1000); + rc = (sqlite3OsSleep(pVfs, ms<0 ? 0 : 1000*ms)/1000); return rc; } @@ -178039,6 +185270,28 @@ SQLITE_API int sqlite3_test_control(int op, ...){ } #endif + /* sqlite3_test_control(SQLITE_TESTCTRL_FK_NO_ACTION, sqlite3 *db, int b); + ** + ** If b is true, then activate the SQLITE_FkNoAction setting. If b is + ** false then clearn that setting. If the SQLITE_FkNoAction setting is + ** abled, all foreign key ON DELETE and ON UPDATE actions behave as if + ** they were NO ACTION, regardless of how they are defined. + ** + ** NB: One must usually run "PRAGMA writable_schema=RESET" after + ** using this test-control, before it will take full effect. failing + ** to reset the schema can result in some unexpected behavior. + */ + case SQLITE_TESTCTRL_FK_NO_ACTION: { + sqlite3 *db = va_arg(ap, sqlite3*); + int b = va_arg(ap, int); + if( b ){ + db->flags |= SQLITE_FkNoAction; + }else{ + db->flags &= ~SQLITE_FkNoAction; + } + break; + } + /* ** sqlite3_test_control(BITVEC_TEST, size, program) ** @@ -178145,10 +185398,12 @@ SQLITE_API int sqlite3_test_control(int op, ...){ sqlite3ShowSrcList(0); sqlite3ShowWith(0); sqlite3ShowUpsert(0); +#ifndef SQLITE_OMIT_TRIGGER sqlite3ShowTriggerStep(0); sqlite3ShowTriggerStepList(0); sqlite3ShowTrigger(0); sqlite3ShowTriggerList(0); +#endif #ifndef SQLITE_OMIT_WINDOWFUNC sqlite3ShowWindow(0); sqlite3ShowWinFunc(0); @@ -178224,6 +185479,18 @@ SQLITE_API int sqlite3_test_control(int op, ...){ break; } + /* sqlite3_test_control(SQLITE_TESTCTRL_GETOPT, sqlite3 *db, int *N) + ** + ** Write the current optimization settings into *N. A zero bit means that + ** the optimization is on, and a 1 bit means that the optimization is off. + */ + case SQLITE_TESTCTRL_GETOPT: { + sqlite3 *db = va_arg(ap, sqlite3*); + int *pN = va_arg(ap, int*); + *pN = db->dbOptFlags; + break; + } + /* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, onoff, xAlt); ** ** If parameter onoff is 1, subsequent calls to localtime() fail. @@ -178265,7 +185532,7 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** formed and never corrupt. This flag is clear by default, indicating that ** database files might have arbitrary corruption. Setting the flag during ** testing causes certain assert() statements in the code to be activated - ** that demonstrat invariants on well-formed database files. + ** that demonstrate invariants on well-formed database files. */ case SQLITE_TESTCTRL_NEVER_CORRUPT: { sqlite3GlobalConfig.neverCorrupt = va_arg(ap, int); @@ -178419,7 +185686,7 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** ** op==0 Store the current sqlite3TreeTrace in *ptr ** op==1 Set sqlite3TreeTrace to the value *ptr - ** op==3 Store the current sqlite3WhereTrace in *ptr + ** op==2 Store the current sqlite3WhereTrace in *ptr ** op==3 Set sqlite3WhereTrace to the value *ptr */ case SQLITE_TESTCTRL_TRACEFLAGS: { @@ -178455,7 +185722,6 @@ SQLITE_API int sqlite3_test_control(int op, ...){ break; } - #if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_WSD) /* sqlite3_test_control(SQLITE_TESTCTRL_TUNE, id, *piValue) ** @@ -178485,6 +185751,28 @@ SQLITE_API int sqlite3_test_control(int op, ...){ break; } #endif + + /* sqlite3_test_control(SQLITE_TESTCTRL_JSON_SELFCHECK, &onOff); + ** + ** Activate or deactivate validation of JSONB that is generated from + ** text. Off by default, as the validation is slow. Validation is + ** only available if compiled using SQLITE_DEBUG. + ** + ** If onOff is initially 1, then turn it on. If onOff is initially + ** off, turn it off. If onOff is initially -1, then change onOff + ** to be the current setting. + */ + case SQLITE_TESTCTRL_JSON_SELFCHECK: { +#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_WSD) + int *pOnOff = va_arg(ap, int*); + if( *pOnOff<0 ){ + *pOnOff = sqlite3Config.bJsonSelfcheck; + }else{ + sqlite3Config.bJsonSelfcheck = (u8)((*pOnOff)&0xff); + } +#endif + break; + } } va_end(ap); #endif /* SQLITE_UNTESTABLE */ @@ -178741,7 +186029,11 @@ SQLITE_API int sqlite3_snapshot_get( if( iDb==0 || iDb>1 ){ Btree *pBt = db->aDb[iDb].pBt; if( SQLITE_TXN_WRITE!=sqlite3BtreeTxnState(pBt) ){ + Pager *pPager = sqlite3BtreePager(pBt); + i64 dummy = 0; + sqlite3PagerSnapshotOpen(pPager, (sqlite3_snapshot*)&dummy); rc = sqlite3BtreeBeginTrans(pBt, 0, 0); + sqlite3PagerSnapshotOpen(pPager, 0); if( rc==SQLITE_OK ){ rc = sqlite3PagerSnapshotGet(sqlite3BtreePager(pBt), ppSnapshot); } @@ -178755,7 +186047,7 @@ SQLITE_API int sqlite3_snapshot_get( } /* -** Open a read-transaction on the snapshot idendified by pSnapshot. +** Open a read-transaction on the snapshot identified by pSnapshot. */ SQLITE_API int sqlite3_snapshot_open( sqlite3 *db, @@ -178862,7 +186154,7 @@ SQLITE_API int sqlite3_compileoption_used(const char *zOptName){ int nOpt; const char **azCompileOpt; -#if SQLITE_ENABLE_API_ARMOR +#ifdef SQLITE_ENABLE_API_ARMOR if( zOptName==0 ){ (void)SQLITE_MISUSE_BKPT; return 0; @@ -179057,6 +186349,9 @@ SQLITE_API int sqlite3_unlock_notify( ){ int rc = SQLITE_OK; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif sqlite3_mutex_enter(db->mutex); enterMutex(); @@ -180078,6 +187373,7 @@ struct Fts3Table { int nPgsz; /* Page size for host database */ char *zSegmentsTbl; /* Name of %_segments table */ sqlite3_blob *pSegments; /* Blob handle open on %_segments table */ + int iSavepoint; /* ** The following array of hash tables is used to buffer pending index @@ -180465,6 +187761,8 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int); SQLITE_PRIVATE int sqlite3Fts3ExprIterate(Fts3Expr*, int (*x)(Fts3Expr*,int,void*), void*); +SQLITE_PRIVATE int sqlite3Fts3IntegrityCheck(Fts3Table *p, int *pbOk); + #endif /* !SQLITE_CORE || SQLITE_ENABLE_FTS3 */ #endif /* _FTSINT_H */ @@ -180821,6 +188119,7 @@ static void fts3DeclareVtab(int *pRc, Fts3Table *p){ zLanguageid = (p->zLanguageid ? p->zLanguageid : "__langid"); sqlite3_vtab_config(p->db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1); + sqlite3_vtab_config(p->db, SQLITE_VTAB_INNOCUOUS); /* Create a list of user columns for the virtual table */ zCols = sqlite3_mprintf("%Q, ", p->azColumn[0]); @@ -182524,10 +189823,15 @@ static int fts3PoslistPhraseMerge( if( *p1==POS_COLUMN ){ p1++; p1 += fts3GetVarint32(p1, &iCol1); + /* iCol1==0 indicates corruption. Column 0 does not have a POS_COLUMN + ** entry, so this is actually end-of-doclist. */ + if( iCol1==0 ) return 0; } if( *p2==POS_COLUMN ){ p2++; p2 += fts3GetVarint32(p2, &iCol2); + /* As above, iCol2==0 indicates corruption. */ + if( iCol2==0 ) return 0; } while( 1 ){ @@ -184070,6 +191374,8 @@ static int fts3RenameMethod( rc = sqlite3Fts3PendingTermsFlush(p); } + p->bIgnoreSavepoint = 1; + if( p->zContentTbl==0 ){ fts3DbExec(&rc, db, "ALTER TABLE %Q.'%q_content' RENAME TO '%q_content';", @@ -184097,6 +191403,8 @@ static int fts3RenameMethod( "ALTER TABLE %Q.'%q_segdir' RENAME TO '%q_segdir';", p->zDb, p->zName, zName ); + + p->bIgnoreSavepoint = 0; return rc; } @@ -184107,12 +191415,28 @@ static int fts3RenameMethod( */ static int fts3SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ int rc = SQLITE_OK; - UNUSED_PARAMETER(iSavepoint); - assert( ((Fts3Table *)pVtab)->inTransaction ); - assert( ((Fts3Table *)pVtab)->mxSavepoint <= iSavepoint ); - TESTONLY( ((Fts3Table *)pVtab)->mxSavepoint = iSavepoint ); - if( ((Fts3Table *)pVtab)->bIgnoreSavepoint==0 ){ - rc = fts3SyncMethod(pVtab); + Fts3Table *pTab = (Fts3Table*)pVtab; + assert( pTab->inTransaction ); + assert( pTab->mxSavepoint<=iSavepoint ); + TESTONLY( pTab->mxSavepoint = iSavepoint ); + + if( pTab->bIgnoreSavepoint==0 ){ + if( fts3HashCount(&pTab->aIndex[0].hPending)>0 ){ + char *zSql = sqlite3_mprintf("INSERT INTO %Q.%Q(%Q) VALUES('flush')", + pTab->zDb, pTab->zName, pTab->zName + ); + if( zSql ){ + pTab->bIgnoreSavepoint = 1; + rc = sqlite3_exec(pTab->db, zSql, 0, 0, 0); + pTab->bIgnoreSavepoint = 0; + sqlite3_free(zSql); + }else{ + rc = SQLITE_NOMEM; + } + } + if( rc==SQLITE_OK ){ + pTab->iSavepoint = iSavepoint+1; + } } return rc; } @@ -184123,12 +191447,11 @@ static int fts3SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ ** This is a no-op. */ static int fts3ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ - TESTONLY( Fts3Table *p = (Fts3Table*)pVtab ); - UNUSED_PARAMETER(iSavepoint); - UNUSED_PARAMETER(pVtab); - assert( p->inTransaction ); - assert( p->mxSavepoint >= iSavepoint ); - TESTONLY( p->mxSavepoint = iSavepoint-1 ); + Fts3Table *pTab = (Fts3Table*)pVtab; + assert( pTab->inTransaction ); + assert( pTab->mxSavepoint >= iSavepoint ); + TESTONLY( pTab->mxSavepoint = iSavepoint-1 ); + pTab->iSavepoint = iSavepoint; return SQLITE_OK; } @@ -184138,11 +191461,13 @@ static int fts3ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ ** Discard the contents of the pending terms table. */ static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ - Fts3Table *p = (Fts3Table*)pVtab; + Fts3Table *pTab = (Fts3Table*)pVtab; UNUSED_PARAMETER(iSavepoint); - assert( p->inTransaction ); - TESTONLY( p->mxSavepoint = iSavepoint ); - sqlite3Fts3PendingTermsClear(p); + assert( pTab->inTransaction ); + TESTONLY( pTab->mxSavepoint = iSavepoint ); + if( (iSavepoint+1)<=pTab->iSavepoint ){ + sqlite3Fts3PendingTermsClear(pTab); + } return SQLITE_OK; } @@ -184161,8 +191486,42 @@ static int fts3ShadowName(const char *zName){ return 0; } +/* +** Implementation of the xIntegrity() method on the FTS3/FTS4 virtual +** table. +*/ +static int fts3IntegrityMethod( + sqlite3_vtab *pVtab, /* The virtual table to be checked */ + const char *zSchema, /* Name of schema in which pVtab lives */ + const char *zTabname, /* Name of the pVTab table */ + int isQuick, /* True if this is a quick_check */ + char **pzErr /* Write error message here */ +){ + Fts3Table *p = (Fts3Table*)pVtab; + int rc = SQLITE_OK; + int bOk = 0; + + UNUSED_PARAMETER(isQuick); + rc = sqlite3Fts3IntegrityCheck(p, &bOk); + assert( rc!=SQLITE_CORRUPT_VTAB ); + if( rc==SQLITE_ERROR || (rc&0xFF)==SQLITE_CORRUPT ){ + *pzErr = sqlite3_mprintf("unable to validate the inverted index for" + " FTS%d table %s.%s: %s", + p->bFts4 ? 4 : 3, zSchema, zTabname, sqlite3_errstr(rc)); + if( *pzErr ) rc = SQLITE_OK; + }else if( rc==SQLITE_OK && bOk==0 ){ + *pzErr = sqlite3_mprintf("malformed inverted index for FTS%d table %s.%s", + p->bFts4 ? 4 : 3, zSchema, zTabname); + if( *pzErr==0 ) rc = SQLITE_NOMEM; + } + sqlite3Fts3SegmentsClose(p); + return rc; +} + + + static const sqlite3_module fts3Module = { - /* iVersion */ 3, + /* iVersion */ 4, /* xCreate */ fts3CreateMethod, /* xConnect */ fts3ConnectMethod, /* xBestIndex */ fts3BestIndexMethod, @@ -184186,6 +191545,7 @@ static const sqlite3_module fts3Module = { /* xRelease */ fts3ReleaseMethod, /* xRollbackTo */ fts3RollbackToMethod, /* xShadowName */ fts3ShadowName, + /* xIntegrity */ fts3IntegrityMethod, }; /* @@ -185642,7 +193002,7 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ nTmp += p->pRight->pPhrase->doclist.nList; } nTmp += p->pPhrase->doclist.nList; - aTmp = sqlite3_malloc64(nTmp*2); + aTmp = sqlite3_malloc64(nTmp*2 + FTS3_VARINT_MAX); if( !aTmp ){ *pRc = SQLITE_NOMEM; res = 0; @@ -186861,7 +194221,8 @@ SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db){ 0, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ - 0 /* xShadowName */ + 0, /* xShadowName */ + 0 /* xIntegrity */ }; int rc; /* Return code */ @@ -187194,10 +194555,11 @@ static int getNextString( Fts3PhraseToken *pToken; p = fts3ReallocOrFree(p, nSpace + ii*sizeof(Fts3PhraseToken)); - if( !p ) goto no_mem; - zTemp = fts3ReallocOrFree(zTemp, nTemp + nByte); - if( !zTemp ) goto no_mem; + if( !zTemp || !p ){ + rc = SQLITE_NOMEM; + goto getnextstring_out; + } assert( nToken==ii ); pToken = &((Fts3Phrase *)(&p[1]))->aToken[ii]; @@ -187212,9 +194574,6 @@ static int getNextString( nToken = ii+1; } } - - pModule->xClose(pCursor); - pCursor = 0; } if( rc==SQLITE_DONE ){ @@ -187222,7 +194581,10 @@ static int getNextString( char *zBuf = 0; p = fts3ReallocOrFree(p, nSpace + nToken*sizeof(Fts3PhraseToken) + nTemp); - if( !p ) goto no_mem; + if( !p ){ + rc = SQLITE_NOMEM; + goto getnextstring_out; + } memset(p, 0, (char *)&(((Fts3Phrase *)&p[1])->aToken[0])-(char *)p); p->eType = FTSQUERY_PHRASE; p->pPhrase = (Fts3Phrase *)&p[1]; @@ -187230,11 +194592,9 @@ static int getNextString( p->pPhrase->nToken = nToken; zBuf = (char *)&p->pPhrase->aToken[nToken]; + assert( nTemp==0 || zTemp ); if( zTemp ){ memcpy(zBuf, zTemp, nTemp); - sqlite3_free(zTemp); - }else{ - assert( nTemp==0 ); } for(jj=0; jjpPhrase->nToken; jj++){ @@ -187244,17 +194604,17 @@ static int getNextString( rc = SQLITE_OK; } - *ppExpr = p; - return rc; -no_mem: - + getnextstring_out: if( pCursor ){ pModule->xClose(pCursor); } sqlite3_free(zTemp); - sqlite3_free(p); - *ppExpr = 0; - return SQLITE_NOMEM; + if( rc!=SQLITE_OK ){ + sqlite3_free(p); + p = 0; + } + *ppExpr = p; + return rc; } /* @@ -189448,11 +196808,7 @@ SQLITE_PRIVATE int sqlite3Fts3InitTokenizer( #ifdef SQLITE_TEST -#if defined(INCLUDE_SQLITE_TCL_H) -# include "sqlite_tcl.h" -#else -# include "tcl.h" -#endif +#include "tclsqlite.h" /* #include */ /* @@ -190427,7 +197783,8 @@ SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash, void(*xDestr 0, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ - 0 /* xShadowName */ + 0, /* xShadowName */ + 0 /* xIntegrity */ }; int rc; /* Return code */ @@ -193768,7 +201125,6 @@ SQLITE_PRIVATE int sqlite3Fts3PendingTermsFlush(Fts3Table *p){ rc = fts3SegmentMerge(p, p->iPrevLangid, i, FTS3_SEGCURSOR_PENDING); if( rc==SQLITE_DONE ) rc = SQLITE_OK; } - sqlite3Fts3PendingTermsClear(p); /* Determine the auto-incr-merge setting if unknown. If enabled, ** estimate the number of leaf blocks of content to be written @@ -193790,6 +201146,10 @@ SQLITE_PRIVATE int sqlite3Fts3PendingTermsFlush(Fts3Table *p){ rc = sqlite3_reset(pStmt); } } + + if( rc==SQLITE_OK ){ + sqlite3Fts3PendingTermsClear(p); + } return rc; } @@ -194421,6 +201781,8 @@ static int fts3AppendToNode( blobGrowBuffer(pPrev, nTerm, &rc); if( rc!=SQLITE_OK ) return rc; + assert( pPrev!=0 ); + assert( pPrev->a!=0 ); nPrefix = fts3PrefixCompress(pPrev->a, pPrev->n, zTerm, nTerm); nSuffix = nTerm - nPrefix; @@ -194477,9 +201839,13 @@ static int fts3IncrmergeAppend( nSpace += sqlite3Fts3VarintLen(nDoclist) + nDoclist; /* If the current block is not empty, and if adding this term/doclist - ** to the current block would make it larger than Fts3Table.nNodeSize - ** bytes, write this block out to the database. */ - if( pLeaf->block.n>0 && (pLeaf->block.n + nSpace)>p->nNodeSize ){ + ** to the current block would make it larger than Fts3Table.nNodeSize bytes, + ** and if there is still room for another leaf page, write this block out to + ** the database. */ + if( pLeaf->block.n>0 + && (pLeaf->block.n + nSpace)>p->nNodeSize + && pLeaf->iBlock < (pWriter->iStart + pWriter->nLeafEst) + ){ rc = fts3WriteSegment(p, pLeaf->iBlock, pLeaf->block.a, pLeaf->block.n); pWriter->nWork++; @@ -194790,6 +202156,7 @@ static int fts3IncrmergeLoad( for(i=nHeight; i>=0 && rc==SQLITE_OK; i--){ NodeReader reader; + memset(&reader, 0, sizeof(reader)); pNode = &pWriter->aNodeWriter[i]; if( pNode->block.a){ @@ -194810,7 +202177,7 @@ static int fts3IncrmergeLoad( rc = sqlite3Fts3ReadBlock(p, reader.iChild, &aBlock, &nBlock,0); blobGrowBuffer(&pNode->block, MAX(nBlock, p->nNodeSize)+FTS3_NODE_PADDING, &rc - ); + ); if( rc==SQLITE_OK ){ memcpy(pNode->block.a, aBlock, nBlock); pNode->block.n = nBlock; @@ -195660,7 +203027,7 @@ static u64 fts3ChecksumIndex( int rc; u64 cksum = 0; - assert( *pRc==SQLITE_OK ); + if( *pRc ) return 0; memset(&filter, 0, sizeof(filter)); memset(&csr, 0, sizeof(csr)); @@ -195727,7 +203094,7 @@ static u64 fts3ChecksumIndex( ** If an error occurs (e.g. an OOM or IO error), return an SQLite error ** code. The final value of *pbOk is undefined in this case. */ -static int fts3IntegrityCheck(Fts3Table *p, int *pbOk){ +SQLITE_PRIVATE int sqlite3Fts3IntegrityCheck(Fts3Table *p, int *pbOk){ int rc = SQLITE_OK; /* Return code */ u64 cksum1 = 0; /* Checksum based on FTS index contents */ u64 cksum2 = 0; /* Checksum based on %_content contents */ @@ -195805,7 +203172,12 @@ static int fts3IntegrityCheck(Fts3Table *p, int *pbOk){ sqlite3_finalize(pStmt); } - *pbOk = (cksum1==cksum2); + if( rc==SQLITE_CORRUPT_VTAB ){ + rc = SQLITE_OK; + *pbOk = 0; + }else{ + *pbOk = (rc==SQLITE_OK && cksum1==cksum2); + } return rc; } @@ -195845,7 +203217,7 @@ static int fts3DoIntegrityCheck( ){ int rc; int bOk = 0; - rc = fts3IntegrityCheck(p, &bOk); + rc = sqlite3Fts3IntegrityCheck(p, &bOk); if( rc==SQLITE_OK && bOk==0 ) rc = FTS_CORRUPT_VTAB; return rc; } @@ -195875,8 +203247,11 @@ static int fts3SpecialInsert(Fts3Table *p, sqlite3_value *pVal){ rc = fts3DoIncrmerge(p, &zVal[6]); }else if( nVal>10 && 0==sqlite3_strnicmp(zVal, "automerge=", 10) ){ rc = fts3DoAutoincrmerge(p, &zVal[10]); + }else if( nVal==5 && 0==sqlite3_strnicmp(zVal, "flush", 5) ){ + rc = sqlite3Fts3PendingTermsFlush(p); + } #if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) - }else{ + else{ int v; if( nVal>9 && 0==sqlite3_strnicmp(zVal, "nodesize=", 9) ){ v = atoi(&zVal[9]); @@ -195894,8 +203269,8 @@ static int fts3SpecialInsert(Fts3Table *p, sqlite3_value *pVal){ if( v>=4 && v<=FTS3_MERGE_COUNT && (v&1)==0 ) p->nMergeCount = v; rc = SQLITE_OK; } -#endif } +#endif return rc; } @@ -196660,6 +204035,7 @@ static int fts3SnippetNextCandidate(SnippetIter *pIter){ return 1; } + assert( pIter->nSnippet>=0 ); pIter->iCurrent = iStart = iEnd - pIter->nSnippet + 1; for(i=0; inPhrase; i++){ SnippetPhrase *pPhrase = &pIter->aPhrase[i]; @@ -196708,7 +204084,7 @@ static void fts3SnippetDetails( } mCover |= mPhrase; - for(j=0; jnToken; j++){ + for(j=0; jnToken && jnSnippet; j++){ mHighlight |= (mPos>>j); } @@ -198816,59 +206192,242 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int eRemoveDiacritic){ ** ****************************************************************************** ** -** This SQLite JSON functions. +** SQLite JSON functions. ** ** This file began as an extension in ext/misc/json1.c in 2015. That ** extension proved so useful that it has now been moved into the core. ** -** For the time being, all JSON is stored as pure text. (We might add -** a JSONB type in the future which stores a binary encoding of JSON in -** a BLOB, but there is no support for JSONB in the current implementation. -** This implementation parses JSON text at 250 MB/s, so it is hard to see -** how JSONB might improve on that.) +** The original design stored all JSON as pure text, canonical RFC-8259. +** Support for JSON-5 extensions was added with version 3.42.0 (2023-05-16). +** All generated JSON text still conforms strictly to RFC-8259, but text +** with JSON-5 extensions is accepted as input. +** +** Beginning with version 3.45.0 (circa 2024-01-01), these routines also +** accept BLOB values that have JSON encoded using a binary representation +** called "JSONB". The name JSONB comes from PostgreSQL, however the on-disk +** format SQLite JSONB is completely different and incompatible with +** PostgreSQL JSONB. +** +** Decoding and interpreting JSONB is still O(N) where N is the size of +** the input, the same as text JSON. However, the constant of proportionality +** for JSONB is much smaller due to faster parsing. The size of each +** element in JSONB is encoded in its header, so there is no need to search +** for delimiters using persnickety syntax rules. JSONB seems to be about +** 3x faster than text JSON as a result. JSONB is also tends to be slightly +** smaller than text JSON, by 5% or 10%, but there are corner cases where +** JSONB can be slightly larger. So you are not far mistaken to say that +** a JSONB blob is the same size as the equivalent RFC-8259 text. +** +** +** THE JSONB ENCODING: +** +** Every JSON element is encoded in JSONB as a header and a payload. +** The header is between 1 and 9 bytes in size. The payload is zero +** or more bytes. +** +** The lower 4 bits of the first byte of the header determines the +** element type: +** +** 0: NULL +** 1: TRUE +** 2: FALSE +** 3: INT -- RFC-8259 integer literal +** 4: INT5 -- JSON5 integer literal +** 5: FLOAT -- RFC-8259 floating point literal +** 6: FLOAT5 -- JSON5 floating point literal +** 7: TEXT -- Text literal acceptable to both SQL and JSON +** 8: TEXTJ -- Text containing RFC-8259 escapes +** 9: TEXT5 -- Text containing JSON5 and/or RFC-8259 escapes +** 10: TEXTRAW -- Text containing unescaped syntax characters +** 11: ARRAY +** 12: OBJECT +** +** The other three possible values (13-15) are reserved for future +** enhancements. +** +** The upper 4 bits of the first byte determine the size of the header +** and sometimes also the size of the payload. If X is the first byte +** of the element and if X>>4 is between 0 and 11, then the payload +** will be that many bytes in size and the header is exactly one byte +** in size. Other four values for X>>4 (12-15) indicate that the header +** is more than one byte in size and that the payload size is determined +** by the remainder of the header, interpreted as a unsigned big-endian +** integer. +** +** Value of X>>4 Size integer Total header size +** ------------- -------------------- ----------------- +** 12 1 byte (0-255) 2 +** 13 2 byte (0-65535) 3 +** 14 4 byte (0-4294967295) 5 +** 15 8 byte (0-1.8e19) 9 +** +** The payload size need not be expressed in its minimal form. For example, +** if the payload size is 10, the size can be expressed in any of 5 different +** ways: (1) (X>>4)==10, (2) (X>>4)==12 following by on 0x0a byte, +** (3) (X>>4)==13 followed by 0x00 and 0x0a, (4) (X>>4)==14 followed by +** 0x00 0x00 0x00 0x0a, or (5) (X>>4)==15 followed by 7 bytes of 0x00 and +** a single byte of 0x0a. The shorter forms are preferred, of course, but +** sometimes when generating JSONB, the payload size is not known in advance +** and it is convenient to reserve sufficient header space to cover the +** largest possible payload size and then come back later and patch up +** the size when it becomes known, resulting in a non-minimal encoding. +** +** The value (X>>4)==15 is not actually used in the current implementation +** (as SQLite is currently unable handle BLOBs larger than about 2GB) +** but is included in the design to allow for future enhancements. +** +** The payload follows the header. NULL, TRUE, and FALSE have no payload and +** their payload size must always be zero. The payload for INT, INT5, +** FLOAT, FLOAT5, TEXT, TEXTJ, TEXT5, and TEXTROW is text. Note that the +** "..." or '...' delimiters are omitted from the various text encodings. +** The payload for ARRAY and OBJECT is a list of additional elements that +** are the content for the array or object. The payload for an OBJECT +** must be an even number of elements. The first element of each pair is +** the label and must be of type TEXT, TEXTJ, TEXT5, or TEXTRAW. +** +** A valid JSONB blob consists of a single element, as described above. +** Usually this will be an ARRAY or OBJECT element which has many more +** elements as its content. But the overall blob is just a single element. +** +** Input validation for JSONB blobs simply checks that the element type +** code is between 0 and 12 and that the total size of the element +** (header plus payload) is the same as the size of the BLOB. If those +** checks are true, the BLOB is assumed to be JSONB and processing continues. +** Errors are only raised if some other miscoding is discovered during +** processing. +** +** Additional information can be found in the doc/jsonb.md file of the +** canonical SQLite source tree. */ #ifndef SQLITE_OMIT_JSON /* #include "sqliteInt.h" */ +/* JSONB element types +*/ +#define JSONB_NULL 0 /* "null" */ +#define JSONB_TRUE 1 /* "true" */ +#define JSONB_FALSE 2 /* "false" */ +#define JSONB_INT 3 /* integer acceptable to JSON and SQL */ +#define JSONB_INT5 4 /* integer in 0x000 notation */ +#define JSONB_FLOAT 5 /* float acceptable to JSON and SQL */ +#define JSONB_FLOAT5 6 /* float with JSON5 extensions */ +#define JSONB_TEXT 7 /* Text compatible with both JSON and SQL */ +#define JSONB_TEXTJ 8 /* Text with JSON escapes */ +#define JSONB_TEXT5 9 /* Text with JSON-5 escape */ +#define JSONB_TEXTRAW 10 /* SQL text that needs escaping for JSON */ +#define JSONB_ARRAY 11 /* An array */ +#define JSONB_OBJECT 12 /* An object */ + +/* Human-readable names for the JSONB values. The index for each +** string must correspond to the JSONB_* integer above. +*/ +static const char * const jsonbType[] = { + "null", "true", "false", "integer", "integer", + "real", "real", "text", "text", "text", + "text", "array", "object", "", "", "", "" +}; + /* ** Growing our own isspace() routine this way is twice as fast as ** the library isspace() function, resulting in a 7% overall performance -** increase for the parser. (Ubuntu14.10 gcc 4.8.4 x64 with -Os). +** increase for the text-JSON parser. (Ubuntu14.10 gcc 4.8.4 x64 with -Os). */ static const char jsonIsSpace[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; +#define jsonIsspace(x) (jsonIsSpace[(unsigned char)x]) + +/* +** The set of all space characters recognized by jsonIsspace(). +** Useful as the second argument to strspn(). +*/ +static const char jsonSpaces[] = "\011\012\015\040"; + +/* +** Characters that are special to JSON. Control characters, +** '"' and '\\' and '\''. Actually, '\'' is not special to +** canonical JSON, but it is special in JSON-5, so we include +** it in the set of special characters. +*/ +static const char jsonIsOk[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; -#define fast_isspace(x) (jsonIsSpace[(unsigned char)x]) - -#if !defined(SQLITE_DEBUG) && !defined(SQLITE_COVERAGE_TEST) -# define VVA(X) -#else -# define VVA(X) X -#endif /* Objects */ +typedef struct JsonCache JsonCache; typedef struct JsonString JsonString; -typedef struct JsonNode JsonNode; typedef struct JsonParse JsonParse; +/* +** Magic number used for the JSON parse cache in sqlite3_get_auxdata() +*/ +#define JSON_CACHE_ID (-429938) /* Cache entry */ +#define JSON_CACHE_SIZE 4 /* Max number of cache entries */ + +/* +** jsonUnescapeOneChar() returns this invalid code point if it encounters +** a syntax error. +*/ +#define JSON_INVALID_CHAR 0x99999 + +/* A cache mapping JSON text into JSONB blobs. +** +** Each cache entry is a JsonParse object with the following restrictions: +** +** * The bReadOnly flag must be set +** +** * The aBlob[] array must be owned by the JsonParse object. In other +** words, nBlobAlloc must be non-zero. +** +** * eEdit and delta must be zero. +** +** * zJson must be an RCStr. In other words bJsonIsRCStr must be true. +*/ +struct JsonCache { + sqlite3 *db; /* Database connection */ + int nUsed; /* Number of active entries in the cache */ + JsonParse *a[JSON_CACHE_SIZE]; /* One line for each cache entry */ +}; + /* An instance of this object represents a JSON string ** under construction. Really, this is a generic string accumulator ** that can be and is used to create strings other than JSON. +** +** If the generated string is longer than will fit into the zSpace[] buffer, +** then it will be an RCStr string. This aids with caching of large +** JSON strings. */ struct JsonString { sqlite3_context *pCtx; /* Function context - put error messages here */ @@ -198876,89 +206435,227 @@ struct JsonString { u64 nAlloc; /* Bytes of storage available in zBuf[] */ u64 nUsed; /* Bytes of zBuf[] currently used */ u8 bStatic; /* True if zBuf is static space */ - u8 bErr; /* True if an error has been encountered */ + u8 eErr; /* True if an error has been encountered */ char zSpace[100]; /* Initial static space */ }; -/* JSON type values -*/ -#define JSON_NULL 0 -#define JSON_TRUE 1 -#define JSON_FALSE 2 -#define JSON_INT 3 -#define JSON_REAL 4 -#define JSON_STRING 5 -#define JSON_ARRAY 6 -#define JSON_OBJECT 7 +/* Allowed values for JsonString.eErr */ +#define JSTRING_OOM 0x01 /* Out of memory */ +#define JSTRING_MALFORMED 0x02 /* Malformed JSONB */ +#define JSTRING_ERR 0x04 /* Error already sent to sqlite3_result */ -/* The "subtype" set for JSON values */ +/* The "subtype" set for text JSON values passed through using +** sqlite3_result_subtype() and sqlite3_value_subtype(). +*/ #define JSON_SUBTYPE 74 /* Ascii for "J" */ /* -** Names of the various JSON types: -*/ -static const char * const jsonType[] = { - "null", "true", "false", "integer", "real", "text", "array", "object" -}; - -/* Bit values for the JsonNode.jnFlag field +** Bit values for the flags passed into various SQL function implementations +** via the sqlite3_user_data() value. */ -#define JNODE_RAW 0x01 /* Content is raw, not JSON encoded */ -#define JNODE_ESCAPE 0x02 /* Content is text with \ escapes */ -#define JNODE_REMOVE 0x04 /* Do not output */ -#define JNODE_REPLACE 0x08 /* Replace with JsonNode.u.iReplace */ -#define JNODE_PATCH 0x10 /* Patch with JsonNode.u.pPatch */ -#define JNODE_APPEND 0x20 /* More ARRAY/OBJECT entries at u.iAppend */ -#define JNODE_LABEL 0x40 /* Is a label of an object */ - +#define JSON_JSON 0x01 /* Result is always JSON */ +#define JSON_SQL 0x02 /* Result is always SQL */ +#define JSON_ABPATH 0x03 /* Allow abbreviated JSON path specs */ +#define JSON_ISSET 0x04 /* json_set(), not json_insert() */ +#define JSON_BLOB 0x08 /* Use the BLOB output format */ -/* A single node of parsed JSON -*/ -struct JsonNode { - u8 eType; /* One of the JSON_ type values */ - u8 jnFlags; /* JNODE flags */ - u8 eU; /* Which union element to use */ - u32 n; /* Bytes of content, or number of sub-nodes */ - union { - const char *zJContent; /* 1: Content for INT, REAL, and STRING */ - u32 iAppend; /* 2: More terms for ARRAY and OBJECT */ - u32 iKey; /* 3: Key for ARRAY objects in json_tree() */ - u32 iReplace; /* 4: Replacement content for JNODE_REPLACE */ - JsonNode *pPatch; /* 5: Node chain of patch for JNODE_PATCH */ - } u; -}; -/* A completely parsed JSON string +/* A parsed JSON value. Lifecycle: +** +** 1. JSON comes in and is parsed into a JSONB value in aBlob. The +** original text is stored in zJson. This step is skipped if the +** input is JSONB instead of text JSON. +** +** 2. The aBlob[] array is searched using the JSON path notation, if needed. +** +** 3. Zero or more changes are made to aBlob[] (via json_remove() or +** json_replace() or json_patch() or similar). +** +** 4. New JSON text is generated from the aBlob[] for output. This step +** is skipped if the function is one of the jsonb_* functions that +** returns JSONB instead of text JSON. */ struct JsonParse { - u32 nNode; /* Number of slots of aNode[] used */ - u32 nAlloc; /* Number of slots of aNode[] allocated */ - JsonNode *aNode; /* Array of nodes containing the parse */ - const char *zJson; /* Original JSON string */ - u32 *aUp; /* Index of parent of each node */ - u8 oom; /* Set to true if out of memory */ - u8 nErr; /* Number of errors seen */ - u16 iDepth; /* Nesting depth */ + u8 *aBlob; /* JSONB representation of JSON value */ + u32 nBlob; /* Bytes of aBlob[] actually used */ + u32 nBlobAlloc; /* Bytes allocated to aBlob[]. 0 if aBlob is external */ + char *zJson; /* Json text used for parsing */ + sqlite3 *db; /* The database connection to which this object belongs */ int nJson; /* Length of the zJson string in bytes */ - u32 iHold; /* Replace cache line with the lowest iHold value */ + u32 nJPRef; /* Number of references to this object */ + u32 iErr; /* Error location in zJson[] */ + u16 iDepth; /* Nesting depth */ + u8 nErr; /* Number of errors seen */ + u8 oom; /* Set to true if out of memory */ + u8 bJsonIsRCStr; /* True if zJson is an RCStr */ + u8 hasNonstd; /* True if input uses non-standard features like JSON5 */ + u8 bReadOnly; /* Do not modify. */ + /* Search and edit information. See jsonLookupStep() */ + u8 eEdit; /* Edit operation to apply */ + int delta; /* Size change due to the edit */ + u32 nIns; /* Number of bytes to insert */ + u32 iLabel; /* Location of label if search landed on an object value */ + u8 *aIns; /* Content to be inserted */ }; +/* Allowed values for JsonParse.eEdit */ +#define JEDIT_DEL 1 /* Delete if exists */ +#define JEDIT_REPL 2 /* Overwrite if exists */ +#define JEDIT_INS 3 /* Insert if not exists */ +#define JEDIT_SET 4 /* Insert or overwrite */ + /* ** Maximum nesting depth of JSON for this implementation. ** ** This limit is needed to avoid a stack overflow in the recursive -** descent parser. A depth of 2000 is far deeper than any sane JSON -** should go. +** descent parser. A depth of 1000 is far deeper than any sane JSON +** should go. Historical note: This limit was 2000 prior to version 3.42.0 +*/ +#ifndef SQLITE_JSON_MAX_DEPTH +# define JSON_MAX_DEPTH 1000 +#else +# define JSON_MAX_DEPTH SQLITE_JSON_MAX_DEPTH +#endif + +/* +** Allowed values for the flgs argument to jsonParseFuncArg(); */ -#define JSON_MAX_DEPTH 2000 +#define JSON_EDITABLE 0x01 /* Generate a writable JsonParse object */ +#define JSON_KEEPERROR 0x02 /* Return non-NULL even if there is an error */ + +/************************************************************************** +** Forward references +**************************************************************************/ +static void jsonReturnStringAsBlob(JsonString*); +static int jsonFuncArgMightBeBinary(sqlite3_value *pJson); +static u32 jsonTranslateBlobToText(const JsonParse*,u32,JsonString*); +static void jsonReturnParse(sqlite3_context*,JsonParse*); +static JsonParse *jsonParseFuncArg(sqlite3_context*,sqlite3_value*,u32); +static void jsonParseFree(JsonParse*); +static u32 jsonbPayloadSize(const JsonParse*, u32, u32*); +static u32 jsonUnescapeOneChar(const char*, u32, u32*); + +/************************************************************************** +** Utility routines for dealing with JsonCache objects +**************************************************************************/ + +/* +** Free a JsonCache object. +*/ +static void jsonCacheDelete(JsonCache *p){ + int i; + for(i=0; inUsed; i++){ + jsonParseFree(p->a[i]); + } + sqlite3DbFree(p->db, p); +} +static void jsonCacheDeleteGeneric(void *p){ + jsonCacheDelete((JsonCache*)p); +} + +/* +** Insert a new entry into the cache. If the cache is full, expel +** the least recently used entry. Return SQLITE_OK on success or a +** result code otherwise. +** +** Cache entries are stored in age order, oldest first. +*/ +static int jsonCacheInsert( + sqlite3_context *ctx, /* The SQL statement context holding the cache */ + JsonParse *pParse /* The parse object to be added to the cache */ +){ + JsonCache *p; + + assert( pParse->zJson!=0 ); + assert( pParse->bJsonIsRCStr ); + assert( pParse->delta==0 ); + p = sqlite3_get_auxdata(ctx, JSON_CACHE_ID); + if( p==0 ){ + sqlite3 *db = sqlite3_context_db_handle(ctx); + p = sqlite3DbMallocZero(db, sizeof(*p)); + if( p==0 ) return SQLITE_NOMEM; + p->db = db; + sqlite3_set_auxdata(ctx, JSON_CACHE_ID, p, jsonCacheDeleteGeneric); + p = sqlite3_get_auxdata(ctx, JSON_CACHE_ID); + if( p==0 ) return SQLITE_NOMEM; + } + if( p->nUsed >= JSON_CACHE_SIZE ){ + jsonParseFree(p->a[0]); + memmove(p->a, &p->a[1], (JSON_CACHE_SIZE-1)*sizeof(p->a[0])); + p->nUsed = JSON_CACHE_SIZE-1; + } + assert( pParse->nBlobAlloc>0 ); + pParse->eEdit = 0; + pParse->nJPRef++; + pParse->bReadOnly = 1; + p->a[p->nUsed] = pParse; + p->nUsed++; + return SQLITE_OK; +} + +/* +** Search for a cached translation the json text supplied by pArg. Return +** the JsonParse object if found. Return NULL if not found. +** +** When a match if found, the matching entry is moved to become the +** most-recently used entry if it isn't so already. +** +** The JsonParse object returned still belongs to the Cache and might +** be deleted at any moment. If the caller whants the JsonParse to +** linger, it needs to increment the nPJRef reference counter. +*/ +static JsonParse *jsonCacheSearch( + sqlite3_context *ctx, /* The SQL statement context holding the cache */ + sqlite3_value *pArg /* Function argument containing SQL text */ +){ + JsonCache *p; + int i; + const char *zJson; + int nJson; + + if( sqlite3_value_type(pArg)!=SQLITE_TEXT ){ + return 0; + } + zJson = (const char*)sqlite3_value_text(pArg); + if( zJson==0 ) return 0; + nJson = sqlite3_value_bytes(pArg); + + p = sqlite3_get_auxdata(ctx, JSON_CACHE_ID); + if( p==0 ){ + return 0; + } + for(i=0; inUsed; i++){ + if( p->a[i]->zJson==zJson ) break; + } + if( i>=p->nUsed ){ + for(i=0; inUsed; i++){ + if( p->a[i]->nJson!=nJson ) continue; + if( memcmp(p->a[i]->zJson, zJson, nJson)==0 ) break; + } + } + if( inUsed ){ + if( inUsed-1 ){ + /* Make the matching entry the most recently used entry */ + JsonParse *tmp = p->a[i]; + memmove(&p->a[i], &p->a[i+1], (p->nUsed-i-1)*sizeof(tmp)); + p->a[p->nUsed-1] = tmp; + i = p->nUsed - 1; + } + assert( p->a[i]->delta==0 ); + return p->a[i]; + }else{ + return 0; + } +} /************************************************************************** ** Utility routines for dealing with JsonString objects **************************************************************************/ -/* Set the JsonString object to an empty string +/* Turn uninitialized bulk memory into a valid JsonString object +** holding a zero-length string. */ -static void jsonZero(JsonString *p){ +static void jsonStringZero(JsonString *p){ p->zBuf = p->zSpace; p->nAlloc = sizeof(p->zSpace); p->nUsed = 0; @@ -198967,53 +206664,51 @@ static void jsonZero(JsonString *p){ /* Initialize the JsonString object */ -static void jsonInit(JsonString *p, sqlite3_context *pCtx){ +static void jsonStringInit(JsonString *p, sqlite3_context *pCtx){ p->pCtx = pCtx; - p->bErr = 0; - jsonZero(p); + p->eErr = 0; + jsonStringZero(p); } - /* Free all allocated memory and reset the JsonString object back to its ** initial state. */ -static void jsonReset(JsonString *p){ - if( !p->bStatic ) sqlite3_free(p->zBuf); - jsonZero(p); +static void jsonStringReset(JsonString *p){ + if( !p->bStatic ) sqlite3RCStrUnref(p->zBuf); + jsonStringZero(p); } - /* Report an out-of-memory (OOM) condition */ -static void jsonOom(JsonString *p){ - p->bErr = 1; - sqlite3_result_error_nomem(p->pCtx); - jsonReset(p); +static void jsonStringOom(JsonString *p){ + p->eErr |= JSTRING_OOM; + if( p->pCtx ) sqlite3_result_error_nomem(p->pCtx); + jsonStringReset(p); } /* Enlarge pJson->zBuf so that it can hold at least N more bytes. ** Return zero on success. Return non-zero on an OOM error */ -static int jsonGrow(JsonString *p, u32 N){ +static int jsonStringGrow(JsonString *p, u32 N){ u64 nTotal = NnAlloc ? p->nAlloc*2 : p->nAlloc+N+10; char *zNew; if( p->bStatic ){ - if( p->bErr ) return 1; - zNew = sqlite3_malloc64(nTotal); + if( p->eErr ) return 1; + zNew = sqlite3RCStrNew(nTotal); if( zNew==0 ){ - jsonOom(p); + jsonStringOom(p); return SQLITE_NOMEM; } memcpy(zNew, p->zBuf, (size_t)p->nUsed); p->zBuf = zNew; p->bStatic = 0; }else{ - zNew = sqlite3_realloc64(p->zBuf, nTotal); - if( zNew==0 ){ - jsonOom(p); + p->zBuf = sqlite3RCStrResize(p->zBuf, nTotal); + if( p->zBuf==0 ){ + p->eErr |= JSTRING_OOM; + jsonStringZero(p); return SQLITE_NOMEM; } - p->zBuf = zNew; } p->nAlloc = nTotal; return SQLITE_OK; @@ -199021,18 +206716,40 @@ static int jsonGrow(JsonString *p, u32 N){ /* Append N bytes from zIn onto the end of the JsonString string. */ -static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){ - if( N==0 ) return; - if( (N+p->nUsed >= p->nAlloc) && jsonGrow(p,N)!=0 ) return; +static SQLITE_NOINLINE void jsonStringExpandAndAppend( + JsonString *p, + const char *zIn, + u32 N +){ + assert( N>0 ); + if( jsonStringGrow(p,N) ) return; memcpy(p->zBuf+p->nUsed, zIn, N); p->nUsed += N; } +static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){ + if( N==0 ) return; + if( N+p->nUsed >= p->nAlloc ){ + jsonStringExpandAndAppend(p,zIn,N); + }else{ + memcpy(p->zBuf+p->nUsed, zIn, N); + p->nUsed += N; + } +} +static void jsonAppendRawNZ(JsonString *p, const char *zIn, u32 N){ + assert( N>0 ); + if( N+p->nUsed >= p->nAlloc ){ + jsonStringExpandAndAppend(p,zIn,N); + }else{ + memcpy(p->zBuf+p->nUsed, zIn, N); + p->nUsed += N; + } +} /* Append formatted text (not to exceed N bytes) to the JsonString. */ static void jsonPrintf(int N, JsonString *p, const char *zFormat, ...){ va_list ap; - if( (p->nUsed + N >= p->nAlloc) && jsonGrow(p, N) ) return; + if( (p->nUsed + N >= p->nAlloc) && jsonStringGrow(p, N) ) return; va_start(ap, zFormat); sqlite3_vsnprintf(N, p->zBuf+p->nUsed, zFormat, ap); va_end(ap); @@ -199041,10 +206758,38 @@ static void jsonPrintf(int N, JsonString *p, const char *zFormat, ...){ /* Append a single character */ -static void jsonAppendChar(JsonString *p, char c){ - if( p->nUsed>=p->nAlloc && jsonGrow(p,1)!=0 ) return; +static SQLITE_NOINLINE void jsonAppendCharExpand(JsonString *p, char c){ + if( jsonStringGrow(p,1) ) return; p->zBuf[p->nUsed++] = c; } +static void jsonAppendChar(JsonString *p, char c){ + if( p->nUsed>=p->nAlloc ){ + jsonAppendCharExpand(p,c); + }else{ + p->zBuf[p->nUsed++] = c; + } +} + +/* Remove a single character from the end of the string +*/ +static void jsonStringTrimOneChar(JsonString *p){ + if( p->eErr==0 ){ + assert( p->nUsed>0 ); + p->nUsed--; + } +} + + +/* Make sure there is a zero terminator on p->zBuf[] +** +** Return true on success. Return false if an OOM prevents this +** from happening. +*/ +static int jsonStringTerminate(JsonString *p){ + jsonAppendChar(p, 0); + jsonStringTrimOneChar(p); + return p->eErr==0; +} /* Append a comma separator to the output buffer, if the previous ** character is not '[' or '{'. @@ -199053,68 +206798,137 @@ static void jsonAppendSeparator(JsonString *p){ char c; if( p->nUsed==0 ) return; c = p->zBuf[p->nUsed-1]; - if( c!='[' && c!='{' ) jsonAppendChar(p, ','); + if( c=='[' || c=='{' ) return; + jsonAppendChar(p, ','); +} + +/* c is a control character. Append the canonical JSON representation +** of that control character to p. +** +** This routine assumes that the output buffer has already been enlarged +** sufficiently to hold the worst-case encoding plus a nul terminator. +*/ +static void jsonAppendControlChar(JsonString *p, u8 c){ + static const char aSpecial[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 'b', 't', 'n', 0, 'f', 'r', 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + assert( sizeof(aSpecial)==32 ); + assert( aSpecial['\b']=='b' ); + assert( aSpecial['\f']=='f' ); + assert( aSpecial['\n']=='n' ); + assert( aSpecial['\r']=='r' ); + assert( aSpecial['\t']=='t' ); + assert( c>=0 && cnUsed+7 <= p->nAlloc ); + if( aSpecial[c] ){ + p->zBuf[p->nUsed] = '\\'; + p->zBuf[p->nUsed+1] = aSpecial[c]; + p->nUsed += 2; + }else{ + p->zBuf[p->nUsed] = '\\'; + p->zBuf[p->nUsed+1] = 'u'; + p->zBuf[p->nUsed+2] = '0'; + p->zBuf[p->nUsed+3] = '0'; + p->zBuf[p->nUsed+4] = "0123456789abcdef"[c>>4]; + p->zBuf[p->nUsed+5] = "0123456789abcdef"[c&0xf]; + p->nUsed += 6; + } } /* Append the N-byte string in zIn to the end of the JsonString string -** under construction. Enclose the string in "..." and escape -** any double-quotes or backslash characters contained within the +** under construction. Enclose the string in double-quotes ("...") and +** escape any double-quotes or backslash characters contained within the ** string. +** +** This routine is a high-runner. There is a measurable performance +** increase associated with unwinding the jsonIsOk[] loop. */ static void jsonAppendString(JsonString *p, const char *zIn, u32 N){ - u32 i; - if( zIn==0 || ((N+p->nUsed+2 >= p->nAlloc) && jsonGrow(p,N+2)!=0) ) return; + u32 k; + u8 c; + const u8 *z = (const u8*)zIn; + if( z==0 ) return; + if( (N+p->nUsed+2 >= p->nAlloc) && jsonStringGrow(p,N+2)!=0 ) return; p->zBuf[p->nUsed++] = '"'; - for(i=0; i=N ){ + while( k=N ){ + if( k>0 ){ + memcpy(&p->zBuf[p->nUsed], z, k); + p->nUsed += k; + } + break; + } + if( k>0 ){ + memcpy(&p->zBuf[p->nUsed], z, k); + p->nUsed += k; + z += k; + N -= k; + } + c = z[0]; if( c=='"' || c=='\\' ){ - json_simple_escape: - if( (p->nUsed+N+3-i > p->nAlloc) && jsonGrow(p,N+3-i)!=0 ) return; - p->zBuf[p->nUsed++] = '\\'; - }else if( c<=0x1f ){ - static const char aSpecial[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 'b', 't', 'n', 0, 'f', 'r', 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; - assert( sizeof(aSpecial)==32 ); - assert( aSpecial['\b']=='b' ); - assert( aSpecial['\f']=='f' ); - assert( aSpecial['\n']=='n' ); - assert( aSpecial['\r']=='r' ); - assert( aSpecial['\t']=='t' ); - if( aSpecial[c] ){ - c = aSpecial[c]; - goto json_simple_escape; - } - if( (p->nUsed+N+7+i > p->nAlloc) && jsonGrow(p,N+7-i)!=0 ) return; + if( (p->nUsed+N+3 > p->nAlloc) && jsonStringGrow(p,N+3)!=0 ) return; p->zBuf[p->nUsed++] = '\\'; - p->zBuf[p->nUsed++] = 'u'; - p->zBuf[p->nUsed++] = '0'; - p->zBuf[p->nUsed++] = '0'; - p->zBuf[p->nUsed++] = '0' + (c>>4); - c = "0123456789abcdef"[c&0xf]; + p->zBuf[p->nUsed++] = c; + }else if( c=='\'' ){ + p->zBuf[p->nUsed++] = c; + }else{ + if( (p->nUsed+N+7 > p->nAlloc) && jsonStringGrow(p,N+7)!=0 ) return; + jsonAppendControlChar(p, c); } - p->zBuf[p->nUsed++] = c; + z++; + N--; } p->zBuf[p->nUsed++] = '"'; assert( p->nUsednAlloc ); } /* -** Append a function parameter value to the JSON string under -** construction. +** Append an sqlite3_value (such as a function parameter) to the JSON +** string under construction in p. */ -static void jsonAppendValue( +static void jsonAppendSqlValue( JsonString *p, /* Append to this JSON string */ sqlite3_value *pValue /* Value to append */ ){ switch( sqlite3_value_type(pValue) ){ case SQLITE_NULL: { - jsonAppendRaw(p, "null", 4); + jsonAppendRawNZ(p, "null", 4); break; } - case SQLITE_INTEGER: case SQLITE_FLOAT: { + jsonPrintf(100, p, "%!0.15g", sqlite3_value_double(pValue)); + break; + } + case SQLITE_INTEGER: { const char *z = (const char*)sqlite3_value_text(pValue); u32 n = (u32)sqlite3_value_bytes(pValue); jsonAppendRaw(p, z, n); @@ -199131,184 +206945,127 @@ static void jsonAppendValue( break; } default: { - if( p->bErr==0 ){ + if( jsonFuncArgMightBeBinary(pValue) ){ + JsonParse px; + memset(&px, 0, sizeof(px)); + px.aBlob = (u8*)sqlite3_value_blob(pValue); + px.nBlob = sqlite3_value_bytes(pValue); + jsonTranslateBlobToText(&px, 0, p); + }else if( p->eErr==0 ){ sqlite3_result_error(p->pCtx, "JSON cannot hold BLOB values", -1); - p->bErr = 2; - jsonReset(p); + p->eErr = JSTRING_ERR; + jsonStringReset(p); } break; } } } - -/* Make the JSON in p the result of the SQL function. +/* Make the text in p (which is probably a generated JSON text string) +** the result of the SQL function. +** +** The JsonString is reset. +** +** If pParse and ctx are both non-NULL, then the SQL string in p is +** loaded into the zJson field of the pParse object as a RCStr and the +** pParse is added to the cache. */ -static void jsonResult(JsonString *p){ - if( p->bErr==0 ){ - sqlite3_result_text64(p->pCtx, p->zBuf, p->nUsed, - p->bStatic ? SQLITE_TRANSIENT : sqlite3_free, - SQLITE_UTF8); - jsonZero(p); +static void jsonReturnString( + JsonString *p, /* String to return */ + JsonParse *pParse, /* JSONB source or NULL */ + sqlite3_context *ctx /* Where to cache */ +){ + assert( (pParse!=0)==(ctx!=0) ); + assert( ctx==0 || ctx==p->pCtx ); + if( p->eErr==0 ){ + int flags = SQLITE_PTR_TO_INT(sqlite3_user_data(p->pCtx)); + if( flags & JSON_BLOB ){ + jsonReturnStringAsBlob(p); + }else if( p->bStatic ){ + sqlite3_result_text64(p->pCtx, p->zBuf, p->nUsed, + SQLITE_TRANSIENT, SQLITE_UTF8); + }else if( jsonStringTerminate(p) ){ + if( pParse && pParse->bJsonIsRCStr==0 && pParse->nBlobAlloc>0 ){ + int rc; + pParse->zJson = sqlite3RCStrRef(p->zBuf); + pParse->nJson = p->nUsed; + pParse->bJsonIsRCStr = 1; + rc = jsonCacheInsert(ctx, pParse); + if( rc==SQLITE_NOMEM ){ + sqlite3_result_error_nomem(ctx); + jsonStringReset(p); + return; + } + } + sqlite3_result_text64(p->pCtx, sqlite3RCStrRef(p->zBuf), p->nUsed, + sqlite3RCStrUnref, + SQLITE_UTF8); + }else{ + sqlite3_result_error_nomem(p->pCtx); + } + }else if( p->eErr & JSTRING_OOM ){ + sqlite3_result_error_nomem(p->pCtx); + }else if( p->eErr & JSTRING_MALFORMED ){ + sqlite3_result_error(p->pCtx, "malformed JSON", -1); } - assert( p->bStatic ); + jsonStringReset(p); } /************************************************************************** -** Utility routines for dealing with JsonNode and JsonParse objects +** Utility routines for dealing with JsonParse objects **************************************************************************/ -/* -** Return the number of consecutive JsonNode slots need to represent -** the parsed JSON at pNode. The minimum answer is 1. For ARRAY and -** OBJECT types, the number might be larger. -** -** Appended elements are not counted. The value returned is the number -** by which the JsonNode counter should increment in order to go to the -** next peer value. -*/ -static u32 jsonNodeSize(JsonNode *pNode){ - return pNode->eType>=JSON_ARRAY ? pNode->n+1 : 1; -} - /* ** Reclaim all memory allocated by a JsonParse object. But do not ** delete the JsonParse object itself. */ static void jsonParseReset(JsonParse *pParse){ - sqlite3_free(pParse->aNode); - pParse->aNode = 0; - pParse->nNode = 0; - pParse->nAlloc = 0; - sqlite3_free(pParse->aUp); - pParse->aUp = 0; + assert( pParse->nJPRef<=1 ); + if( pParse->bJsonIsRCStr ){ + sqlite3RCStrUnref(pParse->zJson); + pParse->zJson = 0; + pParse->nJson = 0; + pParse->bJsonIsRCStr = 0; + } + if( pParse->nBlobAlloc ){ + sqlite3DbFree(pParse->db, pParse->aBlob); + pParse->aBlob = 0; + pParse->nBlob = 0; + pParse->nBlobAlloc = 0; + } } /* -** Free a JsonParse object that was obtained from sqlite3_malloc(). +** Decrement the reference count on the JsonParse object. When the +** count reaches zero, free the object. */ static void jsonParseFree(JsonParse *pParse){ - jsonParseReset(pParse); - sqlite3_free(pParse); -} - -/* -** Convert the JsonNode pNode into a pure JSON string and -** append to pOut. Subsubstructure is also included. Return -** the number of JsonNode objects that are encoded. -*/ -static void jsonRenderNode( - JsonNode *pNode, /* The node to render */ - JsonString *pOut, /* Write JSON here */ - sqlite3_value **aReplace /* Replacement values */ -){ - assert( pNode!=0 ); - if( pNode->jnFlags & (JNODE_REPLACE|JNODE_PATCH) ){ - if( (pNode->jnFlags & JNODE_REPLACE)!=0 && ALWAYS(aReplace!=0) ){ - assert( pNode->eU==4 ); - jsonAppendValue(pOut, aReplace[pNode->u.iReplace]); - return; - } - assert( pNode->eU==5 ); - pNode = pNode->u.pPatch; - } - switch( pNode->eType ){ - default: { - assert( pNode->eType==JSON_NULL ); - jsonAppendRaw(pOut, "null", 4); - break; - } - case JSON_TRUE: { - jsonAppendRaw(pOut, "true", 4); - break; - } - case JSON_FALSE: { - jsonAppendRaw(pOut, "false", 5); - break; - } - case JSON_STRING: { - if( pNode->jnFlags & JNODE_RAW ){ - assert( pNode->eU==1 ); - jsonAppendString(pOut, pNode->u.zJContent, pNode->n); - break; - } - /* no break */ deliberate_fall_through - } - case JSON_REAL: - case JSON_INT: { - assert( pNode->eU==1 ); - jsonAppendRaw(pOut, pNode->u.zJContent, pNode->n); - break; - } - case JSON_ARRAY: { - u32 j = 1; - jsonAppendChar(pOut, '['); - for(;;){ - while( j<=pNode->n ){ - if( (pNode[j].jnFlags & JNODE_REMOVE)==0 ){ - jsonAppendSeparator(pOut); - jsonRenderNode(&pNode[j], pOut, aReplace); - } - j += jsonNodeSize(&pNode[j]); - } - if( (pNode->jnFlags & JNODE_APPEND)==0 ) break; - assert( pNode->eU==2 ); - pNode = &pNode[pNode->u.iAppend]; - j = 1; - } - jsonAppendChar(pOut, ']'); - break; - } - case JSON_OBJECT: { - u32 j = 1; - jsonAppendChar(pOut, '{'); - for(;;){ - while( j<=pNode->n ){ - if( (pNode[j+1].jnFlags & JNODE_REMOVE)==0 ){ - jsonAppendSeparator(pOut); - jsonRenderNode(&pNode[j], pOut, aReplace); - jsonAppendChar(pOut, ':'); - jsonRenderNode(&pNode[j+1], pOut, aReplace); - } - j += 1 + jsonNodeSize(&pNode[j+1]); - } - if( (pNode->jnFlags & JNODE_APPEND)==0 ) break; - assert( pNode->eU==2 ); - pNode = &pNode[pNode->u.iAppend]; - j = 1; - } - jsonAppendChar(pOut, '}'); - break; + if( pParse ){ + if( pParse->nJPRef>1 ){ + pParse->nJPRef--; + }else{ + jsonParseReset(pParse); + sqlite3DbFree(pParse->db, pParse); } } } -/* -** Return a JsonNode and all its descendents as a JSON string. -*/ -static void jsonReturnJson( - JsonNode *pNode, /* Node to return */ - sqlite3_context *pCtx, /* Return value for this function */ - sqlite3_value **aReplace /* Array of replacement values */ -){ - JsonString s; - jsonInit(&s, pCtx); - jsonRenderNode(pNode, &s, aReplace); - jsonResult(&s); - sqlite3_result_subtype(pCtx, JSON_SUBTYPE); -} +/************************************************************************** +** Utility routines for the JSON text parser +**************************************************************************/ /* ** Translate a single byte of Hex into an integer. -** This routine only works if h really is a valid hexadecimal -** character: 0..9a..fA..F +** This routine only gives a correct answer if h really is a valid hexadecimal +** character: 0..9a..fA..F. But unlike sqlite3HexToInt(), it does not +** assert() if the digit is not hex. */ static u8 jsonHexToInt(int h){ - assert( (h>='0' && h<='9') || (h>='a' && h<='f') || (h>='A' && h<='F') ); +#ifdef SQLITE_ASCII + h += 9*(1&(h>>6)); +#endif #ifdef SQLITE_EBCDIC h += 9*(1&~(h>>4)); -#else - h += 9*(1&(h>>6)); #endif return (u8)(h & 0xf); } @@ -199318,10 +207075,6 @@ static u8 jsonHexToInt(int h){ */ static u32 jsonHexToInt4(const char *z){ u32 v; - assert( sqlite3Isxdigit(z[0]) ); - assert( sqlite3Isxdigit(z[1]) ); - assert( sqlite3Isxdigit(z[2]) ); - assert( sqlite3Isxdigit(z[3]) ); v = (jsonHexToInt(z[0])<<12) + (jsonHexToInt(z[1])<<8) + (jsonHexToInt(z[2])<<4) @@ -199330,420 +207083,1108 @@ static u32 jsonHexToInt4(const char *z){ } /* -** Make the JsonNode the return value of the function. +** Return true if z[] begins with 2 (or more) hexadecimal digits */ -static void jsonReturn( - JsonNode *pNode, /* Node to return */ - sqlite3_context *pCtx, /* Return value for this function */ - sqlite3_value **aReplace /* Array of replacement values */ -){ - switch( pNode->eType ){ - default: { - assert( pNode->eType==JSON_NULL ); - sqlite3_result_null(pCtx); - break; - } - case JSON_TRUE: { - sqlite3_result_int(pCtx, 1); - break; - } - case JSON_FALSE: { - sqlite3_result_int(pCtx, 0); - break; - } - case JSON_INT: { - sqlite3_int64 i = 0; - const char *z; - assert( pNode->eU==1 ); - z = pNode->u.zJContent; - if( z[0]=='-' ){ z++; } - while( z[0]>='0' && z[0]<='9' ){ - unsigned v = *(z++) - '0'; - if( i>=LARGEST_INT64/10 ){ - if( i>LARGEST_INT64/10 ) goto int_as_real; - if( z[0]>='0' && z[0]<='9' ) goto int_as_real; - if( v==9 ) goto int_as_real; - if( v==8 ){ - if( pNode->u.zJContent[0]=='-' ){ - sqlite3_result_int64(pCtx, SMALLEST_INT64); - goto int_done; - }else{ - goto int_as_real; +static int jsonIs2Hex(const char *z){ + return sqlite3Isxdigit(z[0]) && sqlite3Isxdigit(z[1]); +} + +/* +** Return true if z[] begins with 4 (or more) hexadecimal digits +*/ +static int jsonIs4Hex(const char *z){ + return jsonIs2Hex(z) && jsonIs2Hex(&z[2]); +} + +/* +** Return the number of bytes of JSON5 whitespace at the beginning of +** the input string z[]. +** +** JSON5 whitespace consists of any of the following characters: +** +** Unicode UTF-8 Name +** U+0009 09 horizontal tab +** U+000a 0a line feed +** U+000b 0b vertical tab +** U+000c 0c form feed +** U+000d 0d carriage return +** U+0020 20 space +** U+00a0 c2 a0 non-breaking space +** U+1680 e1 9a 80 ogham space mark +** U+2000 e2 80 80 en quad +** U+2001 e2 80 81 em quad +** U+2002 e2 80 82 en space +** U+2003 e2 80 83 em space +** U+2004 e2 80 84 three-per-em space +** U+2005 e2 80 85 four-per-em space +** U+2006 e2 80 86 six-per-em space +** U+2007 e2 80 87 figure space +** U+2008 e2 80 88 punctuation space +** U+2009 e2 80 89 thin space +** U+200a e2 80 8a hair space +** U+2028 e2 80 a8 line separator +** U+2029 e2 80 a9 paragraph separator +** U+202f e2 80 af narrow no-break space (NNBSP) +** U+205f e2 81 9f medium mathematical space (MMSP) +** U+3000 e3 80 80 ideographical space +** U+FEFF ef bb bf byte order mark +** +** In addition, comments between '/', '*' and '*', '/' and +** from '/', '/' to end-of-line are also considered to be whitespace. +*/ +static int json5Whitespace(const char *zIn){ + int n = 0; + const u8 *z = (u8*)zIn; + while( 1 /*exit by "goto whitespace_done"*/ ){ + switch( z[n] ){ + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x20: { + n++; + break; + } + case '/': { + if( z[n+1]=='*' && z[n+2]!=0 ){ + int j; + for(j=n+3; z[j]!='/' || z[j-1]!='*'; j++){ + if( z[j]==0 ) goto whitespace_done; + } + n = j+1; + break; + }else if( z[n+1]=='/' ){ + int j; + char c; + for(j=n+2; (c = z[j])!=0; j++){ + if( c=='\n' || c=='\r' ) break; + if( 0xe2==(u8)c && 0x80==(u8)z[j+1] + && (0xa8==(u8)z[j+2] || 0xa9==(u8)z[j+2]) + ){ + j += 2; + break; } } + n = j; + if( z[n] ) n++; + break; } - i = i*10 + v; + goto whitespace_done; } - if( pNode->u.zJContent[0]=='-' ){ i = -i; } - sqlite3_result_int64(pCtx, i); - int_done: - break; - int_as_real: ; /* no break */ deliberate_fall_through - } - case JSON_REAL: { - double r; -#ifdef SQLITE_AMALGAMATION - const char *z; - assert( pNode->eU==1 ); - z = pNode->u.zJContent; - sqlite3AtoF(z, &r, sqlite3Strlen30(z), SQLITE_UTF8); -#else - assert( pNode->eU==1 ); - r = strtod(pNode->u.zJContent, 0); -#endif - sqlite3_result_double(pCtx, r); - break; - } - case JSON_STRING: { -#if 0 /* Never happens because JNODE_RAW is only set by json_set(), - ** json_insert() and json_replace() and those routines do not - ** call jsonReturn() */ - if( pNode->jnFlags & JNODE_RAW ){ - assert( pNode->eU==1 ); - sqlite3_result_text(pCtx, pNode->u.zJContent, pNode->n, - SQLITE_TRANSIENT); - }else -#endif - assert( (pNode->jnFlags & JNODE_RAW)==0 ); - if( (pNode->jnFlags & JNODE_ESCAPE)==0 ){ - /* JSON formatted without any backslash-escapes */ - assert( pNode->eU==1 ); - sqlite3_result_text(pCtx, pNode->u.zJContent+1, pNode->n-2, - SQLITE_TRANSIENT); - }else{ - /* Translate JSON formatted string into raw text */ - u32 i; - u32 n = pNode->n; - const char *z; - char *zOut; - u32 j; - assert( pNode->eU==1 ); - z = pNode->u.zJContent; - zOut = sqlite3_malloc( n+1 ); - if( zOut==0 ){ - sqlite3_result_error_nomem(pCtx); + case 0xc2: { + if( z[n+1]==0xa0 ){ + n += 2; break; } - for(i=1, j=0; i>6)); - zOut[j++] = 0x80 | (v&0x3f); - }else{ - u32 vlo; - if( (v&0xfc00)==0xd800 - && i>18); - zOut[j++] = 0x80 | ((v>>12)&0x3f); - zOut[j++] = 0x80 | ((v>>6)&0x3f); - zOut[j++] = 0x80 | (v&0x3f); - }else{ - zOut[j++] = 0xe0 | (v>>12); - zOut[j++] = 0x80 | ((v>>6)&0x3f); - zOut[j++] = 0x80 | (v&0x3f); - } - } - }else{ - if( c=='b' ){ - c = '\b'; - }else if( c=='f' ){ - c = '\f'; - }else if( c=='n' ){ - c = '\n'; - }else if( c=='r' ){ - c = '\r'; - }else if( c=='t' ){ - c = '\t'; - } - zOut[j++] = c; - } + goto whitespace_done; + } + case 0xe1: { + if( z[n+1]==0x9a && z[n+2]==0x80 ){ + n += 3; + break; + } + goto whitespace_done; + } + case 0xe2: { + if( z[n+1]==0x80 ){ + u8 c = z[n+2]; + if( c<0x80 ) goto whitespace_done; + if( c<=0x8a || c==0xa8 || c==0xa9 || c==0xaf ){ + n += 3; + break; } + }else if( z[n+1]==0x81 && z[n+2]==0x9f ){ + n += 3; + break; } - zOut[j] = 0; - sqlite3_result_text(pCtx, zOut, j, sqlite3_free); + goto whitespace_done; + } + case 0xe3: { + if( z[n+1]==0x80 && z[n+2]==0x80 ){ + n += 3; + break; + } + goto whitespace_done; + } + case 0xef: { + if( z[n+1]==0xbb && z[n+2]==0xbf ){ + n += 3; + break; + } + goto whitespace_done; + } + default: { + goto whitespace_done; } - break; - } - case JSON_ARRAY: - case JSON_OBJECT: { - jsonReturnJson(pNode, pCtx, aReplace); - break; } } + whitespace_done: + return n; } -/* Forward reference */ -static int jsonParseAddNode(JsonParse*,u32,u32,const char*); - /* -** A macro to hint to the compiler that a function should not be -** inlined. +** Extra floating-point literals to allow in JSON. */ -#if defined(__GNUC__) -# define JSON_NOINLINE __attribute__((noinline)) -#elif defined(_MSC_VER) && _MSC_VER>=1310 -# define JSON_NOINLINE __declspec(noinline) -#else -# define JSON_NOINLINE -#endif +static const struct NanInfName { + char c1; + char c2; + char n; + char eType; + char nRepl; + char *zMatch; + char *zRepl; +} aNanInfName[] = { + { 'i', 'I', 3, JSONB_FLOAT, 7, "inf", "9.0e999" }, + { 'i', 'I', 8, JSONB_FLOAT, 7, "infinity", "9.0e999" }, + { 'n', 'N', 3, JSONB_NULL, 4, "NaN", "null" }, + { 'q', 'Q', 4, JSONB_NULL, 4, "QNaN", "null" }, + { 's', 'S', 4, JSONB_NULL, 4, "SNaN", "null" }, +}; -static JSON_NOINLINE int jsonParseAddNodeExpand( - JsonParse *pParse, /* Append the node to this object */ - u32 eType, /* Node type */ - u32 n, /* Content size or sub-node count */ - const char *zContent /* Content */ +/* +** Report the wrong number of arguments for json_insert(), json_replace() +** or json_set(). +*/ +static void jsonWrongNumArgs( + sqlite3_context *pCtx, + const char *zFuncName ){ - u32 nNew; - JsonNode *pNew; - assert( pParse->nNode>=pParse->nAlloc ); - if( pParse->oom ) return -1; - nNew = pParse->nAlloc*2 + 10; - pNew = sqlite3_realloc64(pParse->aNode, sizeof(JsonNode)*nNew); - if( pNew==0 ){ - pParse->oom = 1; - return -1; + char *zMsg = sqlite3_mprintf("json_%s() needs an odd number of arguments", + zFuncName); + sqlite3_result_error(pCtx, zMsg, -1); + sqlite3_free(zMsg); +} + +/**************************************************************************** +** Utility routines for dealing with the binary BLOB representation of JSON +****************************************************************************/ + +/* +** Expand pParse->aBlob so that it holds at least N bytes. +** +** Return the number of errors. +*/ +static int jsonBlobExpand(JsonParse *pParse, u32 N){ + u8 *aNew; + u32 t; + assert( N>pParse->nBlobAlloc ); + if( pParse->nBlobAlloc==0 ){ + t = 100; + }else{ + t = pParse->nBlobAlloc*2; } - pParse->nAlloc = nNew; - pParse->aNode = pNew; - assert( pParse->nNodenAlloc ); - return jsonParseAddNode(pParse, eType, n, zContent); + if( tdb, pParse->aBlob, t); + if( aNew==0 ){ pParse->oom = 1; return 1; } + pParse->aBlob = aNew; + pParse->nBlobAlloc = t; + return 0; } /* -** Create a new JsonNode instance based on the arguments and append that -** instance to the JsonParse. Return the index in pParse->aNode[] of the -** new node, or -1 if a memory allocation fails. +** If pParse->aBlob is not previously editable (because it is taken +** from sqlite3_value_blob(), as indicated by the fact that +** pParse->nBlobAlloc==0 and pParse->nBlob>0) then make it editable +** by making a copy into space obtained from malloc. +** +** Return true on success. Return false on OOM. */ -static int jsonParseAddNode( - JsonParse *pParse, /* Append the node to this object */ - u32 eType, /* Node type */ - u32 n, /* Content size or sub-node count */ - const char *zContent /* Content */ +static int jsonBlobMakeEditable(JsonParse *pParse, u32 nExtra){ + u8 *aOld; + u32 nSize; + assert( !pParse->bReadOnly ); + if( pParse->oom ) return 0; + if( pParse->nBlobAlloc>0 ) return 1; + aOld = pParse->aBlob; + nSize = pParse->nBlob + nExtra; + pParse->aBlob = 0; + if( jsonBlobExpand(pParse, nSize) ){ + return 0; + } + assert( pParse->nBlobAlloc >= pParse->nBlob + nExtra ); + memcpy(pParse->aBlob, aOld, pParse->nBlob); + return 1; +} + +/* Expand pParse->aBlob and append one bytes. +*/ +static SQLITE_NOINLINE void jsonBlobExpandAndAppendOneByte( + JsonParse *pParse, + u8 c ){ - JsonNode *p; - if( pParse->aNode==0 || pParse->nNode>=pParse->nAlloc ){ - return jsonParseAddNodeExpand(pParse, eType, n, zContent); + jsonBlobExpand(pParse, pParse->nBlob+1); + if( pParse->oom==0 ){ + assert( pParse->nBlob+1<=pParse->nBlobAlloc ); + pParse->aBlob[pParse->nBlob++] = c; } - p = &pParse->aNode[pParse->nNode]; - p->eType = (u8)eType; - p->jnFlags = 0; - VVA( p->eU = zContent ? 1 : 0 ); - p->n = n; - p->u.zJContent = zContent; - return pParse->nNode++; } -/* -** Return true if z[] begins with 4 (or more) hexadecimal digits +/* Append a single character. */ -static int jsonIs4Hex(const char *z){ - int i; - for(i=0; i<4; i++) if( !sqlite3Isxdigit(z[i]) ) return 0; +static void jsonBlobAppendOneByte(JsonParse *pParse, u8 c){ + if( pParse->nBlob >= pParse->nBlobAlloc ){ + jsonBlobExpandAndAppendOneByte(pParse, c); + }else{ + pParse->aBlob[pParse->nBlob++] = c; + } +} + +/* Slow version of jsonBlobAppendNode() that first resizes the +** pParse->aBlob structure. +*/ +static void jsonBlobAppendNode(JsonParse*,u8,u32,const void*); +static SQLITE_NOINLINE void jsonBlobExpandAndAppendNode( + JsonParse *pParse, + u8 eType, + u32 szPayload, + const void *aPayload +){ + if( jsonBlobExpand(pParse, pParse->nBlob+szPayload+9) ) return; + jsonBlobAppendNode(pParse, eType, szPayload, aPayload); +} + + +/* Append an node type byte together with the payload size and +** possibly also the payload. +** +** If aPayload is not NULL, then it is a pointer to the payload which +** is also appended. If aPayload is NULL, the pParse->aBlob[] array +** is resized (if necessary) so that it is big enough to hold the +** payload, but the payload is not appended and pParse->nBlob is left +** pointing to where the first byte of payload will eventually be. +*/ +static void jsonBlobAppendNode( + JsonParse *pParse, /* The JsonParse object under construction */ + u8 eType, /* Node type. One of JSONB_* */ + u32 szPayload, /* Number of bytes of payload */ + const void *aPayload /* The payload. Might be NULL */ +){ + u8 *a; + if( pParse->nBlob+szPayload+9 > pParse->nBlobAlloc ){ + jsonBlobExpandAndAppendNode(pParse,eType,szPayload,aPayload); + return; + } + assert( pParse->aBlob!=0 ); + a = &pParse->aBlob[pParse->nBlob]; + if( szPayload<=11 ){ + a[0] = eType | (szPayload<<4); + pParse->nBlob += 1; + }else if( szPayload<=0xff ){ + a[0] = eType | 0xc0; + a[1] = szPayload & 0xff; + pParse->nBlob += 2; + }else if( szPayload<=0xffff ){ + a[0] = eType | 0xd0; + a[1] = (szPayload >> 8) & 0xff; + a[2] = szPayload & 0xff; + pParse->nBlob += 3; + }else{ + a[0] = eType | 0xe0; + a[1] = (szPayload >> 24) & 0xff; + a[2] = (szPayload >> 16) & 0xff; + a[3] = (szPayload >> 8) & 0xff; + a[4] = szPayload & 0xff; + pParse->nBlob += 5; + } + if( aPayload ){ + pParse->nBlob += szPayload; + memcpy(&pParse->aBlob[pParse->nBlob-szPayload], aPayload, szPayload); + } +} + +/* Change the payload size for the node at index i to be szPayload. +*/ +static int jsonBlobChangePayloadSize( + JsonParse *pParse, + u32 i, + u32 szPayload +){ + u8 *a; + u8 szType; + u8 nExtra; + u8 nNeeded; + int delta; + if( pParse->oom ) return 0; + a = &pParse->aBlob[i]; + szType = a[0]>>4; + if( szType<=11 ){ + nExtra = 0; + }else if( szType==12 ){ + nExtra = 1; + }else if( szType==13 ){ + nExtra = 2; + }else{ + nExtra = 4; + } + if( szPayload<=11 ){ + nNeeded = 0; + }else if( szPayload<=0xff ){ + nNeeded = 1; + }else if( szPayload<=0xffff ){ + nNeeded = 2; + }else{ + nNeeded = 4; + } + delta = nNeeded - nExtra; + if( delta ){ + u32 newSize = pParse->nBlob + delta; + if( delta>0 ){ + if( newSize>pParse->nBlobAlloc && jsonBlobExpand(pParse, newSize) ){ + return 0; /* OOM error. Error state recorded in pParse->oom. */ + } + a = &pParse->aBlob[i]; + memmove(&a[1+delta], &a[1], pParse->nBlob - (i+1)); + }else{ + memmove(&a[1], &a[1-delta], pParse->nBlob - (i+1-delta)); + } + pParse->nBlob = newSize; + } + if( nNeeded==0 ){ + a[0] = (a[0] & 0x0f) | (szPayload<<4); + }else if( nNeeded==1 ){ + a[0] = (a[0] & 0x0f) | 0xc0; + a[1] = szPayload & 0xff; + }else if( nNeeded==2 ){ + a[0] = (a[0] & 0x0f) | 0xd0; + a[1] = (szPayload >> 8) & 0xff; + a[2] = szPayload & 0xff; + }else{ + a[0] = (a[0] & 0x0f) | 0xe0; + a[1] = (szPayload >> 24) & 0xff; + a[2] = (szPayload >> 16) & 0xff; + a[3] = (szPayload >> 8) & 0xff; + a[4] = szPayload & 0xff; + } + return delta; +} + +/* +** If z[0] is 'u' and is followed by exactly 4 hexadecimal character, +** then set *pOp to JSONB_TEXTJ and return true. If not, do not make +** any changes to *pOp and return false. +*/ +static int jsonIs4HexB(const char *z, int *pOp){ + if( z[0]!='u' ) return 0; + if( !jsonIs4Hex(&z[1]) ) return 0; + *pOp = JSONB_TEXTJ; return 1; } /* -** Parse a single JSON value which begins at pParse->zJson[i]. Return the -** index of the first character past the end of the value parsed. +** Check a single element of the JSONB in pParse for validity. +** +** The element to be checked starts at offset i and must end at on the +** last byte before iEnd. +** +** Return 0 if everything is correct. Return the 1-based byte offset of the +** error if a problem is detected. (In other words, if the error is at offset +** 0, return 1). +*/ +static u32 jsonbValidityCheck( + const JsonParse *pParse, /* Input JSONB. Only aBlob and nBlob are used */ + u32 i, /* Start of element as pParse->aBlob[i] */ + u32 iEnd, /* One more than the last byte of the element */ + u32 iDepth /* Current nesting depth */ +){ + u32 n, sz, j, k; + const u8 *z; + u8 x; + if( iDepth>JSON_MAX_DEPTH ) return i+1; + sz = 0; + n = jsonbPayloadSize(pParse, i, &sz); + if( NEVER(n==0) ) return i+1; /* Checked by caller */ + if( NEVER(i+n+sz!=iEnd) ) return i+1; /* Checked by caller */ + z = pParse->aBlob; + x = z[i] & 0x0f; + switch( x ){ + case JSONB_NULL: + case JSONB_TRUE: + case JSONB_FALSE: { + return n+sz==1 ? 0 : i+1; + } + case JSONB_INT: { + if( sz<1 ) return i+1; + j = i+n; + if( z[j]=='-' ){ + j++; + if( sz<2 ) return i+1; + } + k = i+n+sz; + while( jk ) return j+1; + if( z[j+1]!='.' && z[j+1]!='e' && z[j+1]!='E' ) return j+1; + j++; + } + for(; j0 ) return j+1; + if( x==JSONB_FLOAT && (j==k-1 || !sqlite3Isdigit(z[j+1])) ){ + return j+1; + } + seen = 1; + continue; + } + if( z[j]=='e' || z[j]=='E' ){ + if( seen==2 ) return j+1; + if( j==k-1 ) return j+1; + if( z[j+1]=='+' || z[j+1]=='-' ){ + j++; + if( j==k-1 ) return j+1; + } + seen = 2; + continue; + } + return j+1; + } + if( seen==0 ) return i+1; + return 0; + } + case JSONB_TEXT: { + j = i+n; + k = j+sz; + while( j=k ){ + return j+1; + }else if( strchr("\"\\/bfnrt",z[j+1])!=0 ){ + j++; + }else if( z[j+1]=='u' ){ + if( j+5>=k ) return j+1; + if( !jsonIs4Hex((const char*)&z[j+2]) ) return j+1; + j++; + }else if( x!=JSONB_TEXT5 ){ + return j+1; + }else{ + u32 c = 0; + u32 szC = jsonUnescapeOneChar((const char*)&z[j], k-j, &c); + if( c==JSON_INVALID_CHAR ) return j+1; + j += szC - 1; + } + } + j++; + } + return 0; + } + case JSONB_TEXTRAW: { + return 0; + } + case JSONB_ARRAY: { + u32 sub; + j = i+n; + k = j+sz; + while( jk ) return j+1; + sub = jsonbValidityCheck(pParse, j, j+n+sz, iDepth+1); + if( sub ) return sub; + j += n + sz; + } + assert( j==k ); + return 0; + } + case JSONB_OBJECT: { + u32 cnt = 0; + u32 sub; + j = i+n; + k = j+sz; + while( jk ) return j+1; + if( (cnt & 1)==0 ){ + x = z[j] & 0x0f; + if( xJSONB_TEXTRAW ) return j+1; + } + sub = jsonbValidityCheck(pParse, j, j+n+sz, iDepth+1); + if( sub ) return sub; + cnt++; + j += n + sz; + } + assert( j==k ); + if( (cnt & 1)!=0 ) return j+1; + return 0; + } + default: { + return i+1; + } + } +} + +/* +** Translate a single element of JSON text at pParse->zJson[i] into +** its equivalent binary JSONB representation. Append the translation into +** pParse->aBlob[] beginning at pParse->nBlob. The size of +** pParse->aBlob[] is increased as necessary. ** -** Return negative for a syntax error. Special cases: return -2 if the -** first non-whitespace character is '}' and return -3 if the first -** non-whitespace character is ']'. +** Return the index of the first character past the end of the element parsed, +** or one of the following special result codes: +** +** 0 End of input +** -1 Syntax error or OOM +** -2 '}' seen \ +** -3 ']' seen \___ For these returns, pParse->iErr is set to +** -4 ',' seen / the index in zJson[] of the seen character +** -5 ':' seen / */ -static int jsonParseValue(JsonParse *pParse, u32 i){ +static int jsonTranslateTextToBlob(JsonParse *pParse, u32 i){ char c; u32 j; - int iThis; + u32 iThis, iStart; int x; - JsonNode *pNode; + u8 t; const char *z = pParse->zJson; - while( fast_isspace(z[i]) ){ i++; } - if( (c = z[i])=='{' ){ +json_parse_restart: + switch( (u8)z[i] ){ + case '{': { /* Parse object */ - iThis = jsonParseAddNode(pParse, JSON_OBJECT, 0, 0); - if( iThis<0 ) return -1; + iThis = pParse->nBlob; + jsonBlobAppendNode(pParse, JSONB_OBJECT, pParse->nJson-i, 0); + if( ++pParse->iDepth > JSON_MAX_DEPTH ){ + pParse->iErr = i; + return -1; + } + iStart = pParse->nBlob; for(j=i+1;;j++){ - while( fast_isspace(z[j]) ){ j++; } - if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1; - x = jsonParseValue(pParse, j); - if( x<0 ){ - pParse->iDepth--; - if( x==(-2) && pParse->nNode==(u32)iThis+1 ) return j+1; - return -1; + u32 iBlob = pParse->nBlob; + x = jsonTranslateTextToBlob(pParse, j); + if( x<=0 ){ + int op; + if( x==(-2) ){ + j = pParse->iErr; + if( pParse->nBlob!=(u32)iStart ) pParse->hasNonstd = 1; + break; + } + j += json5Whitespace(&z[j]); + op = JSONB_TEXT; + if( sqlite3JsonId1(z[j]) + || (z[j]=='\\' && jsonIs4HexB(&z[j+1], &op)) + ){ + int k = j+1; + while( (sqlite3JsonId2(z[k]) && json5Whitespace(&z[k])==0) + || (z[k]=='\\' && jsonIs4HexB(&z[k+1], &op)) + ){ + k++; + } + assert( iBlob==pParse->nBlob ); + jsonBlobAppendNode(pParse, op, k-j, &z[j]); + pParse->hasNonstd = 1; + x = k; + }else{ + if( x!=-1 ) pParse->iErr = j; + return -1; + } } if( pParse->oom ) return -1; - pNode = &pParse->aNode[pParse->nNode-1]; - if( pNode->eType!=JSON_STRING ) return -1; - pNode->jnFlags |= JNODE_LABEL; + t = pParse->aBlob[iBlob] & 0x0f; + if( tJSONB_TEXTRAW ){ + pParse->iErr = j; + return -1; + } j = x; - while( fast_isspace(z[j]) ){ j++; } - if( z[j]!=':' ) return -1; - j++; - x = jsonParseValue(pParse, j); - pParse->iDepth--; - if( x<0 ) return -1; + if( z[j]==':' ){ + j++; + }else{ + if( jsonIsspace(z[j]) ){ + /* strspn() is not helpful here */ + do{ j++; }while( jsonIsspace(z[j]) ); + if( z[j]==':' ){ + j++; + goto parse_object_value; + } + } + x = jsonTranslateTextToBlob(pParse, j); + if( x!=(-5) ){ + if( x!=(-1) ) pParse->iErr = j; + return -1; + } + j = pParse->iErr+1; + } + parse_object_value: + x = jsonTranslateTextToBlob(pParse, j); + if( x<=0 ){ + if( x!=(-1) ) pParse->iErr = j; + return -1; + } j = x; - while( fast_isspace(z[j]) ){ j++; } - c = z[j]; - if( c==',' ) continue; - if( c!='}' ) return -1; - break; + if( z[j]==',' ){ + continue; + }else if( z[j]=='}' ){ + break; + }else{ + if( jsonIsspace(z[j]) ){ + j += 1 + (u32)strspn(&z[j+1], jsonSpaces); + if( z[j]==',' ){ + continue; + }else if( z[j]=='}' ){ + break; + } + } + x = jsonTranslateTextToBlob(pParse, j); + if( x==(-4) ){ + j = pParse->iErr; + continue; + } + if( x==(-2) ){ + j = pParse->iErr; + break; + } + } + pParse->iErr = j; + return -1; } - pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1; + jsonBlobChangePayloadSize(pParse, iThis, pParse->nBlob - iStart); + pParse->iDepth--; return j+1; - }else if( c=='[' ){ + } + case '[': { /* Parse array */ - iThis = jsonParseAddNode(pParse, JSON_ARRAY, 0, 0); - if( iThis<0 ) return -1; - memset(&pParse->aNode[iThis].u, 0, sizeof(pParse->aNode[iThis].u)); + iThis = pParse->nBlob; + assert( i<=(u32)pParse->nJson ); + jsonBlobAppendNode(pParse, JSONB_ARRAY, pParse->nJson - i, 0); + iStart = pParse->nBlob; + if( pParse->oom ) return -1; + if( ++pParse->iDepth > JSON_MAX_DEPTH ){ + pParse->iErr = i; + return -1; + } for(j=i+1;;j++){ - while( fast_isspace(z[j]) ){ j++; } - if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1; - x = jsonParseValue(pParse, j); - pParse->iDepth--; - if( x<0 ){ - if( x==(-3) && pParse->nNode==(u32)iThis+1 ) return j+1; + x = jsonTranslateTextToBlob(pParse, j); + if( x<=0 ){ + if( x==(-3) ){ + j = pParse->iErr; + if( pParse->nBlob!=iStart ) pParse->hasNonstd = 1; + break; + } + if( x!=(-1) ) pParse->iErr = j; return -1; } j = x; - while( fast_isspace(z[j]) ){ j++; } - c = z[j]; - if( c==',' ) continue; - if( c!=']' ) return -1; - break; + if( z[j]==',' ){ + continue; + }else if( z[j]==']' ){ + break; + }else{ + if( jsonIsspace(z[j]) ){ + j += 1 + (u32)strspn(&z[j+1], jsonSpaces); + if( z[j]==',' ){ + continue; + }else if( z[j]==']' ){ + break; + } + } + x = jsonTranslateTextToBlob(pParse, j); + if( x==(-4) ){ + j = pParse->iErr; + continue; + } + if( x==(-3) ){ + j = pParse->iErr; + break; + } + } + pParse->iErr = j; + return -1; } - pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1; + jsonBlobChangePayloadSize(pParse, iThis, pParse->nBlob - iStart); + pParse->iDepth--; return j+1; - }else if( c=='"' ){ + } + case '\'': { + u8 opcode; + char cDelim; + pParse->hasNonstd = 1; + opcode = JSONB_TEXT; + goto parse_string; + case '"': /* Parse string */ - u8 jnFlags = 0; + opcode = JSONB_TEXT; + parse_string: + cDelim = z[i]; j = i+1; - for(;;){ - c = z[j]; - if( (c & ~0x1f)==0 ){ - /* Control characters are not allowed in strings */ - return -1; + while( 1 /*exit-by-break*/ ){ + if( jsonIsOk[(u8)z[j]] ){ + if( !jsonIsOk[(u8)z[j+1]] ){ + j += 1; + }else if( !jsonIsOk[(u8)z[j+2]] ){ + j += 2; + }else{ + j += 3; + continue; + } } - if( c=='\\' ){ + c = z[j]; + if( c==cDelim ){ + break; + }else if( c=='\\' ){ c = z[++j]; if( c=='"' || c=='\\' || c=='/' || c=='b' || c=='f' || c=='n' || c=='r' || c=='t' - || (c=='u' && jsonIs4Hex(z+j+1)) ){ - jnFlags = JNODE_ESCAPE; + || (c=='u' && jsonIs4Hex(&z[j+1])) ){ + if( opcode==JSONB_TEXT ) opcode = JSONB_TEXTJ; + }else if( c=='\'' || c=='0' || c=='v' || c=='\n' + || (0xe2==(u8)c && 0x80==(u8)z[j+1] + && (0xa8==(u8)z[j+2] || 0xa9==(u8)z[j+2])) + || (c=='x' && jsonIs2Hex(&z[j+1])) ){ + opcode = JSONB_TEXT5; + pParse->hasNonstd = 1; + }else if( c=='\r' ){ + if( z[j+1]=='\n' ) j++; + opcode = JSONB_TEXT5; + pParse->hasNonstd = 1; }else{ + pParse->iErr = j; + return -1; + } + }else if( c<=0x1f ){ + if( c==0 ){ + pParse->iErr = j; return -1; } + /* Control characters are not allowed in canonical JSON string + ** literals, but are allowed in JSON5 string literals. */ + opcode = JSONB_TEXT5; + pParse->hasNonstd = 1; }else if( c=='"' ){ - break; + opcode = JSONB_TEXT5; } j++; } - jsonParseAddNode(pParse, JSON_STRING, j+1-i, &z[i]); - if( !pParse->oom ) pParse->aNode[pParse->nNode-1].jnFlags = jnFlags; + jsonBlobAppendNode(pParse, opcode, j-1-i, &z[i+1]); return j+1; - }else if( c=='n' - && strncmp(z+i,"null",4)==0 - && !sqlite3Isalnum(z[i+4]) ){ - jsonParseAddNode(pParse, JSON_NULL, 0, 0); - return i+4; - }else if( c=='t' - && strncmp(z+i,"true",4)==0 - && !sqlite3Isalnum(z[i+4]) ){ - jsonParseAddNode(pParse, JSON_TRUE, 0, 0); - return i+4; - }else if( c=='f' - && strncmp(z+i,"false",5)==0 - && !sqlite3Isalnum(z[i+5]) ){ - jsonParseAddNode(pParse, JSON_FALSE, 0, 0); - return i+5; - }else if( c=='-' || (c>='0' && c<='9') ){ + } + case 't': { + if( strncmp(z+i,"true",4)==0 && !sqlite3Isalnum(z[i+4]) ){ + jsonBlobAppendOneByte(pParse, JSONB_TRUE); + return i+4; + } + pParse->iErr = i; + return -1; + } + case 'f': { + if( strncmp(z+i,"false",5)==0 && !sqlite3Isalnum(z[i+5]) ){ + jsonBlobAppendOneByte(pParse, JSONB_FALSE); + return i+5; + } + pParse->iErr = i; + return -1; + } + case '+': { + u8 seenE; + pParse->hasNonstd = 1; + t = 0x00; /* Bit 0x01: JSON5. Bit 0x02: FLOAT */ + goto parse_number; + case '.': + if( sqlite3Isdigit(z[i+1]) ){ + pParse->hasNonstd = 1; + t = 0x03; /* Bit 0x01: JSON5. Bit 0x02: FLOAT */ + seenE = 0; + goto parse_number_2; + } + pParse->iErr = i; + return -1; + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': /* Parse number */ - u8 seenDP = 0; - u8 seenE = 0; + t = 0x00; /* Bit 0x01: JSON5. Bit 0x02: FLOAT */ + parse_number: + seenE = 0; assert( '-' < '0' ); + assert( '+' < '0' ); + assert( '.' < '0' ); + c = z[i]; + if( c<='0' ){ - j = c=='-' ? i+1 : i; - if( z[j]=='0' && z[j+1]>='0' && z[j+1]<='9' ) return -1; + if( c=='0' ){ + if( (z[i+1]=='x' || z[i+1]=='X') && sqlite3Isxdigit(z[i+2]) ){ + assert( t==0x00 ); + pParse->hasNonstd = 1; + t = 0x01; + for(j=i+3; sqlite3Isxdigit(z[j]); j++){} + goto parse_number_finish; + }else if( sqlite3Isdigit(z[i+1]) ){ + pParse->iErr = i+1; + return -1; + } + }else{ + if( !sqlite3Isdigit(z[i+1]) ){ + /* JSON5 allows for "+Infinity" and "-Infinity" using exactly + ** that case. SQLite also allows these in any case and it allows + ** "+inf" and "-inf". */ + if( (z[i+1]=='I' || z[i+1]=='i') + && sqlite3StrNICmp(&z[i+1], "inf",3)==0 + ){ + pParse->hasNonstd = 1; + if( z[i]=='-' ){ + jsonBlobAppendNode(pParse, JSONB_FLOAT, 6, "-9e999"); + }else{ + jsonBlobAppendNode(pParse, JSONB_FLOAT, 5, "9e999"); + } + return i + (sqlite3StrNICmp(&z[i+4],"inity",5)==0 ? 9 : 4); + } + if( z[i+1]=='.' ){ + pParse->hasNonstd = 1; + t |= 0x01; + goto parse_number_2; + } + pParse->iErr = i; + return -1; + } + if( z[i+1]=='0' ){ + if( sqlite3Isdigit(z[i+2]) ){ + pParse->iErr = i+1; + return -1; + }else if( (z[i+2]=='x' || z[i+2]=='X') && sqlite3Isxdigit(z[i+3]) ){ + pParse->hasNonstd = 1; + t |= 0x01; + for(j=i+4; sqlite3Isxdigit(z[j]); j++){} + goto parse_number_finish; + } + } + } } - j = i+1; - for(;; j++){ + + parse_number_2: + for(j=i+1;; j++){ c = z[j]; - if( c>='0' && c<='9' ) continue; + if( sqlite3Isdigit(c) ) continue; if( c=='.' ){ - if( z[j-1]=='-' ) return -1; - if( seenDP ) return -1; - seenDP = 1; + if( (t & 0x02)!=0 ){ + pParse->iErr = j; + return -1; + } + t |= 0x02; continue; } if( c=='e' || c=='E' ){ - if( z[j-1]<'0' ) return -1; - if( seenE ) return -1; - seenDP = seenE = 1; + if( z[j-1]<'0' ){ + if( ALWAYS(z[j-1]=='.') && ALWAYS(j-2>=i) && sqlite3Isdigit(z[j-2]) ){ + pParse->hasNonstd = 1; + t |= 0x01; + }else{ + pParse->iErr = j; + return -1; + } + } + if( seenE ){ + pParse->iErr = j; + return -1; + } + t |= 0x02; + seenE = 1; c = z[j+1]; if( c=='+' || c=='-' ){ j++; c = z[j+1]; } - if( c<'0' || c>'9' ) return -1; + if( c<'0' || c>'9' ){ + pParse->iErr = j; + return -1; + } continue; } break; } - if( z[j-1]<'0' ) return -1; - jsonParseAddNode(pParse, seenDP ? JSON_REAL : JSON_INT, - j - i, &z[i]); + if( z[j-1]<'0' ){ + if( ALWAYS(z[j-1]=='.') && ALWAYS(j-2>=i) && sqlite3Isdigit(z[j-2]) ){ + pParse->hasNonstd = 1; + t |= 0x01; + }else{ + pParse->iErr = j; + return -1; + } + } + parse_number_finish: + assert( JSONB_INT+0x01==JSONB_INT5 ); + assert( JSONB_FLOAT+0x01==JSONB_FLOAT5 ); + assert( JSONB_INT+0x02==JSONB_FLOAT ); + if( z[i]=='+' ) i++; + jsonBlobAppendNode(pParse, JSONB_INT+t, j-i, &z[i]); return j; - }else if( c=='}' ){ + } + case '}': { + pParse->iErr = i; return -2; /* End of {...} */ - }else if( c==']' ){ + } + case ']': { + pParse->iErr = i; return -3; /* End of [...] */ - }else if( c==0 ){ + } + case ',': { + pParse->iErr = i; + return -4; /* List separator */ + } + case ':': { + pParse->iErr = i; + return -5; /* Object label/value separator */ + } + case 0: { return 0; /* End of file */ - }else{ + } + case 0x09: + case 0x0a: + case 0x0d: + case 0x20: { + i += 1 + (u32)strspn(&z[i+1], jsonSpaces); + goto json_parse_restart; + } + case 0x0b: + case 0x0c: + case '/': + case 0xc2: + case 0xe1: + case 0xe2: + case 0xe3: + case 0xef: { + j = json5Whitespace(&z[i]); + if( j>0 ){ + i += j; + pParse->hasNonstd = 1; + goto json_parse_restart; + } + pParse->iErr = i; + return -1; + } + case 'n': { + if( strncmp(z+i,"null",4)==0 && !sqlite3Isalnum(z[i+4]) ){ + jsonBlobAppendOneByte(pParse, JSONB_NULL); + return i+4; + } + /* fall-through into the default case that checks for NaN */ + /* no break */ deliberate_fall_through + } + default: { + u32 k; + int nn; + c = z[i]; + for(k=0; khasNonstd = 1; + return i + nn; + } + pParse->iErr = i; return -1; /* Syntax error */ } + } /* End switch(z[i]) */ } + /* ** Parse a complete JSON string. Return 0 on success or non-zero if there -** are any errors. If an error occurs, free all memory associated with -** pParse. +** are any errors. If an error occurs, free all memory held by pParse, +** but not pParse itself. ** -** pParse is uninitialized when this routine is called. +** pParse must be initialized to an empty parse object prior to calling +** this routine. */ -static int jsonParse( +static int jsonConvertTextToBlob( JsonParse *pParse, /* Initialize and fill this JsonParse object */ - sqlite3_context *pCtx, /* Report errors here */ - const char *zJson /* Input JSON text to be parsed */ + sqlite3_context *pCtx /* Report errors here */ ){ int i; - memset(pParse, 0, sizeof(*pParse)); - if( zJson==0 ) return 1; - pParse->zJson = zJson; - i = jsonParseValue(pParse, 0); + const char *zJson = pParse->zJson; + i = jsonTranslateTextToBlob(pParse, 0); if( pParse->oom ) i = -1; if( i>0 ){ +#ifdef SQLITE_DEBUG assert( pParse->iDepth==0 ); - while( fast_isspace(zJson[i]) ) i++; - if( zJson[i] ) i = -1; + if( sqlite3Config.bJsonSelfcheck ){ + assert( jsonbValidityCheck(pParse, 0, pParse->nBlob, 0)==0 ); + } +#endif + while( jsonIsspace(zJson[i]) ) i++; + if( zJson[i] ){ + i += json5Whitespace(&zJson[i]); + if( zJson[i] ){ + if( pCtx ) sqlite3_result_error(pCtx, "malformed JSON", -1); + jsonParseReset(pParse); + return 1; + } + pParse->hasNonstd = 1; + } } if( i<=0 ){ if( pCtx!=0 ){ @@ -199759,466 +208200,1687 @@ static int jsonParse( return 0; } -/* Mark node i of pParse as being a child of iParent. Call recursively -** to fill in all the descendants of node i. +/* +** The input string pStr is a well-formed JSON text string. Convert +** this into the JSONB format and make it the return value of the +** SQL function. */ -static void jsonParseFillInParentage(JsonParse *pParse, u32 i, u32 iParent){ - JsonNode *pNode = &pParse->aNode[i]; - u32 j; - pParse->aUp[i] = iParent; - switch( pNode->eType ){ - case JSON_ARRAY: { - for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j)){ - jsonParseFillInParentage(pParse, i+j, i); +static void jsonReturnStringAsBlob(JsonString *pStr){ + JsonParse px; + memset(&px, 0, sizeof(px)); + jsonStringTerminate(pStr); + if( pStr->eErr ){ + sqlite3_result_error_nomem(pStr->pCtx); + return; + } + px.zJson = pStr->zBuf; + px.nJson = pStr->nUsed; + px.db = sqlite3_context_db_handle(pStr->pCtx); + (void)jsonTranslateTextToBlob(&px, 0); + if( px.oom ){ + sqlite3DbFree(px.db, px.aBlob); + sqlite3_result_error_nomem(pStr->pCtx); + }else{ + assert( px.nBlobAlloc>0 ); + assert( !px.bReadOnly ); + sqlite3_result_blob(pStr->pCtx, px.aBlob, px.nBlob, SQLITE_DYNAMIC); + } +} + +/* The byte at index i is a node type-code. This routine +** determines the payload size for that node and writes that +** payload size in to *pSz. It returns the offset from i to the +** beginning of the payload. Return 0 on error. +*/ +static u32 jsonbPayloadSize(const JsonParse *pParse, u32 i, u32 *pSz){ + u8 x; + u32 sz; + u32 n; + if( NEVER(i>pParse->nBlob) ){ + *pSz = 0; + return 0; + } + x = pParse->aBlob[i]>>4; + if( x<=11 ){ + sz = x; + n = 1; + }else if( x==12 ){ + if( i+1>=pParse->nBlob ){ + *pSz = 0; + return 0; + } + sz = pParse->aBlob[i+1]; + n = 2; + }else if( x==13 ){ + if( i+2>=pParse->nBlob ){ + *pSz = 0; + return 0; + } + sz = (pParse->aBlob[i+1]<<8) + pParse->aBlob[i+2]; + n = 3; + }else if( x==14 ){ + if( i+4>=pParse->nBlob ){ + *pSz = 0; + return 0; + } + sz = ((u32)pParse->aBlob[i+1]<<24) + (pParse->aBlob[i+2]<<16) + + (pParse->aBlob[i+3]<<8) + pParse->aBlob[i+4]; + n = 5; + }else{ + if( i+8>=pParse->nBlob + || pParse->aBlob[i+1]!=0 + || pParse->aBlob[i+2]!=0 + || pParse->aBlob[i+3]!=0 + || pParse->aBlob[i+4]!=0 + ){ + *pSz = 0; + return 0; + } + sz = (pParse->aBlob[i+5]<<24) + (pParse->aBlob[i+6]<<16) + + (pParse->aBlob[i+7]<<8) + pParse->aBlob[i+8]; + n = 9; + } + if( (i64)i+sz+n > pParse->nBlob + && (i64)i+sz+n > pParse->nBlob-pParse->delta + ){ + sz = 0; + n = 0; + } + *pSz = sz; + return n; +} + + +/* +** Translate the binary JSONB representation of JSON beginning at +** pParse->aBlob[i] into a JSON text string. Append the JSON +** text onto the end of pOut. Return the index in pParse->aBlob[] +** of the first byte past the end of the element that is translated. +** +** If an error is detected in the BLOB input, the pOut->eErr flag +** might get set to JSTRING_MALFORMED. But not all BLOB input errors +** are detected. So a malformed JSONB input might either result +** in an error, or in incorrect JSON. +** +** The pOut->eErr JSTRING_OOM flag is set on a OOM. +*/ +static u32 jsonTranslateBlobToText( + const JsonParse *pParse, /* the complete parse of the JSON */ + u32 i, /* Start rendering at this index */ + JsonString *pOut /* Write JSON here */ +){ + u32 sz, n, j, iEnd; + + n = jsonbPayloadSize(pParse, i, &sz); + if( n==0 ){ + pOut->eErr |= JSTRING_MALFORMED; + return pParse->nBlob+1; + } + switch( pParse->aBlob[i] & 0x0f ){ + case JSONB_NULL: { + jsonAppendRawNZ(pOut, "null", 4); + return i+1; + } + case JSONB_TRUE: { + jsonAppendRawNZ(pOut, "true", 4); + return i+1; + } + case JSONB_FALSE: { + jsonAppendRawNZ(pOut, "false", 5); + return i+1; + } + case JSONB_INT: + case JSONB_FLOAT: { + if( sz==0 ) goto malformed_jsonb; + jsonAppendRaw(pOut, (const char*)&pParse->aBlob[i+n], sz); + break; + } + case JSONB_INT5: { /* Integer literal in hexadecimal notation */ + u32 k = 2; + sqlite3_uint64 u = 0; + const char *zIn = (const char*)&pParse->aBlob[i+n]; + int bOverflow = 0; + if( sz==0 ) goto malformed_jsonb; + if( zIn[0]=='-' ){ + jsonAppendChar(pOut, '-'); + k++; + }else if( zIn[0]=='+' ){ + k++; + } + for(; keErr |= JSTRING_MALFORMED; + break; + }else if( (u>>60)!=0 ){ + bOverflow = 1; + }else{ + u = u*16 + sqlite3HexToInt(zIn[k]); + } } + jsonPrintf(100,pOut,bOverflow?"9.0e999":"%llu", u); break; } - case JSON_OBJECT: { - for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j+1)+1){ - pParse->aUp[i+j] = i; - jsonParseFillInParentage(pParse, i+j+1, i); + case JSONB_FLOAT5: { /* Float literal missing digits beside "." */ + u32 k = 0; + const char *zIn = (const char*)&pParse->aBlob[i+n]; + if( sz==0 ) goto malformed_jsonb; + if( zIn[0]=='-' ){ + jsonAppendChar(pOut, '-'); + k++; + } + if( zIn[k]=='.' ){ + jsonAppendChar(pOut, '0'); + } + for(; kaBlob[i+n], sz); + jsonAppendChar(pOut, '"'); + break; + } + case JSONB_TEXT5: { + const char *zIn; + u32 k; + u32 sz2 = sz; + zIn = (const char*)&pParse->aBlob[i+n]; + jsonAppendChar(pOut, '"'); + while( sz2>0 ){ + for(k=0; k0 ){ + jsonAppendRawNZ(pOut, zIn, k); + if( k>=sz2 ){ + break; + } + zIn += k; + sz2 -= k; + } + if( zIn[0]=='"' ){ + jsonAppendRawNZ(pOut, "\\\"", 2); + zIn++; + sz2--; + continue; + } + if( zIn[0]<=0x1f ){ + if( pOut->nUsed+7>pOut->nAlloc && jsonStringGrow(pOut,7) ) break; + jsonAppendControlChar(pOut, zIn[0]); + zIn++; + sz2--; + continue; + } + assert( zIn[0]=='\\' ); + assert( sz2>=1 ); + if( sz2<2 ){ + pOut->eErr |= JSTRING_MALFORMED; + break; + } + switch( (u8)zIn[1] ){ + case '\'': + jsonAppendChar(pOut, '\''); + break; + case 'v': + jsonAppendRawNZ(pOut, "\\u0009", 6); + break; + case 'x': + if( sz2<4 ){ + pOut->eErr |= JSTRING_MALFORMED; + sz2 = 2; + break; + } + jsonAppendRawNZ(pOut, "\\u00", 4); + jsonAppendRawNZ(pOut, &zIn[2], 2); + zIn += 2; + sz2 -= 2; + break; + case '0': + jsonAppendRawNZ(pOut, "\\u0000", 6); + break; + case '\r': + if( sz2>2 && zIn[2]=='\n' ){ + zIn++; + sz2--; + } + break; + case '\n': + break; + case 0xe2: + /* '\' followed by either U+2028 or U+2029 is ignored as + ** whitespace. Not that in UTF8, U+2028 is 0xe2 0x80 0x29. + ** U+2029 is the same except for the last byte */ + if( sz2<4 + || 0x80!=(u8)zIn[2] + || (0xa8!=(u8)zIn[3] && 0xa9!=(u8)zIn[3]) + ){ + pOut->eErr |= JSTRING_MALFORMED; + sz2 = 2; + break; + } + zIn += 2; + sz2 -= 2; + break; + default: + jsonAppendRawNZ(pOut, zIn, 2); + break; + } + assert( sz2>=2 ); + zIn += 2; + sz2 -= 2; } + jsonAppendChar(pOut, '"'); + break; + } + case JSONB_TEXTRAW: { + jsonAppendString(pOut, (const char*)&pParse->aBlob[i+n], sz); + break; + } + case JSONB_ARRAY: { + jsonAppendChar(pOut, '['); + j = i+n; + iEnd = j+sz; + while( jeErr==0 ){ + j = jsonTranslateBlobToText(pParse, j, pOut); + jsonAppendChar(pOut, ','); + } + if( j>iEnd ) pOut->eErr |= JSTRING_MALFORMED; + if( sz>0 ) jsonStringTrimOneChar(pOut); + jsonAppendChar(pOut, ']'); break; } + case JSONB_OBJECT: { + int x = 0; + jsonAppendChar(pOut, '{'); + j = i+n; + iEnd = j+sz; + while( jeErr==0 ){ + j = jsonTranslateBlobToText(pParse, j, pOut); + jsonAppendChar(pOut, (x++ & 1) ? ',' : ':'); + } + if( (x & 1)!=0 || j>iEnd ) pOut->eErr |= JSTRING_MALFORMED; + if( sz>0 ) jsonStringTrimOneChar(pOut); + jsonAppendChar(pOut, '}'); + break; + } + default: { + malformed_jsonb: + pOut->eErr |= JSTRING_MALFORMED; break; } } + return i+n+sz; +} + +/* Context for recursion of json_pretty() +*/ +typedef struct JsonPretty JsonPretty; +struct JsonPretty { + JsonParse *pParse; /* The BLOB being rendered */ + JsonString *pOut; /* Generate pretty output into this string */ + const char *zIndent; /* Use this text for indentation */ + u32 szIndent; /* Bytes in zIndent[] */ + u32 nIndent; /* Current level of indentation */ +}; + +/* Append indentation to the pretty JSON under construction */ +static void jsonPrettyIndent(JsonPretty *pPretty){ + u32 jj; + for(jj=0; jjnIndent; jj++){ + jsonAppendRaw(pPretty->pOut, pPretty->zIndent, pPretty->szIndent); + } } /* -** Compute the parentage of all nodes in a completed parse. +** Translate the binary JSONB representation of JSON beginning at +** pParse->aBlob[i] into a JSON text string. Append the JSON +** text onto the end of pOut. Return the index in pParse->aBlob[] +** of the first byte past the end of the element that is translated. +** +** This is a variant of jsonTranslateBlobToText() that "pretty-prints" +** the output. Extra whitespace is inserted to make the JSON easier +** for humans to read. +** +** If an error is detected in the BLOB input, the pOut->eErr flag +** might get set to JSTRING_MALFORMED. But not all BLOB input errors +** are detected. So a malformed JSONB input might either result +** in an error, or in incorrect JSON. +** +** The pOut->eErr JSTRING_OOM flag is set on a OOM. */ -static int jsonParseFindParents(JsonParse *pParse){ - u32 *aUp; - assert( pParse->aUp==0 ); - aUp = pParse->aUp = sqlite3_malloc64( sizeof(u32)*pParse->nNode ); - if( aUp==0 ){ - pParse->oom = 1; - return SQLITE_NOMEM; +static u32 jsonTranslateBlobToPrettyText( + JsonPretty *pPretty, /* Pretty-printing context */ + u32 i /* Start rendering at this index */ +){ + u32 sz, n, j, iEnd; + const JsonParse *pParse = pPretty->pParse; + JsonString *pOut = pPretty->pOut; + n = jsonbPayloadSize(pParse, i, &sz); + if( n==0 ){ + pOut->eErr |= JSTRING_MALFORMED; + return pParse->nBlob+1; } - jsonParseFillInParentage(pParse, 0, 0); - return SQLITE_OK; + switch( pParse->aBlob[i] & 0x0f ){ + case JSONB_ARRAY: { + j = i+n; + iEnd = j+sz; + jsonAppendChar(pOut, '['); + if( jnIndent++; + while( pOut->eErr==0 ){ + jsonPrettyIndent(pPretty); + j = jsonTranslateBlobToPrettyText(pPretty, j); + if( j>=iEnd ) break; + jsonAppendRawNZ(pOut, ",\n", 2); + } + jsonAppendChar(pOut, '\n'); + pPretty->nIndent--; + jsonPrettyIndent(pPretty); + } + jsonAppendChar(pOut, ']'); + i = iEnd; + break; + } + case JSONB_OBJECT: { + j = i+n; + iEnd = j+sz; + jsonAppendChar(pOut, '{'); + if( jnIndent++; + while( pOut->eErr==0 ){ + jsonPrettyIndent(pPretty); + j = jsonTranslateBlobToText(pParse, j, pOut); + if( j>iEnd ){ + pOut->eErr |= JSTRING_MALFORMED; + break; + } + jsonAppendRawNZ(pOut, ": ", 2); + j = jsonTranslateBlobToPrettyText(pPretty, j); + if( j>=iEnd ) break; + jsonAppendRawNZ(pOut, ",\n", 2); + } + jsonAppendChar(pOut, '\n'); + pPretty->nIndent--; + jsonPrettyIndent(pPretty); + } + jsonAppendChar(pOut, '}'); + i = iEnd; + break; + } + default: { + i = jsonTranslateBlobToText(pParse, i, pOut); + break; + } + } + return i; +} + + +/* Return true if the input pJson +** +** For performance reasons, this routine does not do a detailed check of the +** input BLOB to ensure that it is well-formed. Hence, false positives are +** possible. False negatives should never occur, however. +*/ +static int jsonFuncArgMightBeBinary(sqlite3_value *pJson){ + u32 sz, n; + const u8 *aBlob; + int nBlob; + JsonParse s; + if( sqlite3_value_type(pJson)!=SQLITE_BLOB ) return 0; + aBlob = sqlite3_value_blob(pJson); + nBlob = sqlite3_value_bytes(pJson); + if( nBlob<1 ) return 0; + if( NEVER(aBlob==0) || (aBlob[0] & 0x0f)>JSONB_OBJECT ) return 0; + memset(&s, 0, sizeof(s)); + s.aBlob = (u8*)aBlob; + s.nBlob = nBlob; + n = jsonbPayloadSize(&s, 0, &sz); + if( n==0 ) return 0; + if( sz+n!=(u32)nBlob ) return 0; + if( (aBlob[0] & 0x0f)<=JSONB_FALSE && sz>0 ) return 0; + return sz+n==(u32)nBlob; } /* -** Magic number used for the JSON parse cache in sqlite3_get_auxdata() +** Given that a JSONB_ARRAY object starts at offset i, return +** the number of entries in that array. */ -#define JSON_CACHE_ID (-429938) /* First cache entry */ -#define JSON_CACHE_SZ 4 /* Max number of cache entries */ +static u32 jsonbArrayCount(JsonParse *pParse, u32 iRoot){ + u32 n, sz, i, iEnd; + u32 k = 0; + n = jsonbPayloadSize(pParse, iRoot, &sz); + iEnd = iRoot+n+sz; + for(i=iRoot+n; n>0 && idelta. */ -static JsonParse *jsonParseCached( - sqlite3_context *pCtx, - sqlite3_value **argv, - sqlite3_context *pErrCtx +static void jsonAfterEditSizeAdjust(JsonParse *pParse, u32 iRoot){ + u32 sz = 0; + u32 nBlob; + assert( pParse->delta!=0 ); + assert( pParse->nBlobAlloc >= pParse->nBlob ); + nBlob = pParse->nBlob; + pParse->nBlob = pParse->nBlobAlloc; + (void)jsonbPayloadSize(pParse, iRoot, &sz); + pParse->nBlob = nBlob; + sz += pParse->delta; + pParse->delta += jsonBlobChangePayloadSize(pParse, iRoot, sz); +} + +/* +** Modify the JSONB blob at pParse->aBlob by removing nDel bytes of +** content beginning at iDel, and replacing them with nIns bytes of +** content given by aIns. +** +** nDel may be zero, in which case no bytes are removed. But iDel is +** still important as new bytes will be insert beginning at iDel. +** +** aIns may be zero, in which case space is created to hold nIns bytes +** beginning at iDel, but that space is uninitialized. +** +** Set pParse->oom if an OOM occurs. +*/ +static void jsonBlobEdit( + JsonParse *pParse, /* The JSONB to be modified is in pParse->aBlob */ + u32 iDel, /* First byte to be removed */ + u32 nDel, /* Number of bytes to remove */ + const u8 *aIns, /* Content to insert */ + u32 nIns /* Bytes of content to insert */ ){ - const char *zJson = (const char*)sqlite3_value_text(argv[0]); - int nJson = sqlite3_value_bytes(argv[0]); - JsonParse *p; - JsonParse *pMatch = 0; - int iKey; - int iMinKey = 0; - u32 iMinHold = 0xffffffff; - u32 iMaxHold = 0; - if( zJson==0 ) return 0; - for(iKey=0; iKeynBlob + d > pParse->nBlobAlloc ){ + jsonBlobExpand(pParse, pParse->nBlob+d); + if( pParse->oom ) return; } - if( pMatch==0 - && p->nJson==nJson - && memcmp(p->zJson,zJson,nJson)==0 - ){ - p->nErr = 0; - pMatch = p; - }else if( p->iHoldiHold; - iMinKey = iKey; + memmove(&pParse->aBlob[iDel+nIns], + &pParse->aBlob[iDel+nDel], + pParse->nBlob - (iDel+nDel)); + pParse->nBlob += d; + pParse->delta += d; + } + if( nIns && aIns ) memcpy(&pParse->aBlob[iDel], aIns, nIns); +} + +/* +** Return the number of escaped newlines to be ignored. +** An escaped newline is a one of the following byte sequences: +** +** 0x5c 0x0a +** 0x5c 0x0d +** 0x5c 0x0d 0x0a +** 0x5c 0xe2 0x80 0xa8 +** 0x5c 0xe2 0x80 0xa9 +*/ +static u32 jsonBytesToBypass(const char *z, u32 n){ + u32 i = 0; + while( i+1iHold>iMaxHold ){ - iMaxHold = p->iHold; + if( 0xe2==(u8)z[i+1] + && i+3nErr = 0; - pMatch->iHold = iMaxHold+1; - return pMatch; + return i; +} + +/* +** Input z[0..n] defines JSON escape sequence including the leading '\\'. +** Decode that escape sequence into a single character. Write that +** character into *piOut. Return the number of bytes in the escape sequence. +** +** If there is a syntax error of some kind (for example too few characters +** after the '\\' to complete the encoding) then *piOut is set to +** JSON_INVALID_CHAR. +*/ +static u32 jsonUnescapeOneChar(const char *z, u32 n, u32 *piOut){ + assert( n>0 ); + assert( z[0]=='\\' ); + if( n<2 ){ + *piOut = JSON_INVALID_CHAR; + return n; } - p = sqlite3_malloc64( sizeof(*p) + nJson + 1 ); - if( p==0 ){ - sqlite3_result_error_nomem(pCtx); - return 0; + switch( (u8)z[1] ){ + case 'u': { + u32 v, vlo; + if( n<6 ){ + *piOut = JSON_INVALID_CHAR; + return n; + } + v = jsonHexToInt4(&z[2]); + if( (v & 0xfc00)==0xd800 + && n>=12 + && z[6]=='\\' + && z[7]=='u' + && ((vlo = jsonHexToInt4(&z[8]))&0xfc00)==0xdc00 + ){ + *piOut = ((v&0x3ff)<<10) + (vlo&0x3ff) + 0x10000; + return 12; + }else{ + *piOut = v; + return 6; + } + } + case 'b': { *piOut = '\b'; return 2; } + case 'f': { *piOut = '\f'; return 2; } + case 'n': { *piOut = '\n'; return 2; } + case 'r': { *piOut = '\r'; return 2; } + case 't': { *piOut = '\t'; return 2; } + case 'v': { *piOut = '\v'; return 2; } + case '0': { *piOut = 0; return 2; } + case '\'': + case '"': + case '/': + case '\\':{ *piOut = z[1]; return 2; } + case 'x': { + if( n<4 ){ + *piOut = JSON_INVALID_CHAR; + return n; + } + *piOut = (jsonHexToInt(z[2])<<4) | jsonHexToInt(z[3]); + return 4; + } + case 0xe2: + case '\r': + case '\n': { + u32 nSkip = jsonBytesToBypass(z, n); + if( nSkip==0 ){ + *piOut = JSON_INVALID_CHAR; + return n; + }else if( nSkip==n ){ + *piOut = 0; + return n; + }else if( z[nSkip]=='\\' ){ + return nSkip + jsonUnescapeOneChar(&z[nSkip], n-nSkip, piOut); + }else{ + int sz = sqlite3Utf8ReadLimited((u8*)&z[nSkip], n-nSkip, piOut); + return nSkip + sz; + } + } + default: { + *piOut = JSON_INVALID_CHAR; + return 2; + } } - memset(p, 0, sizeof(*p)); - p->zJson = (char*)&p[1]; - memcpy((char*)p->zJson, zJson, nJson+1); - if( jsonParse(p, pErrCtx, p->zJson) ){ - sqlite3_free(p); - return 0; +} + + +/* +** Compare two object labels. Return 1 if they are equal and +** 0 if they differ. +** +** In this version, we know that one or the other or both of the +** two comparands contains an escape sequence. +*/ +static SQLITE_NOINLINE int jsonLabelCompareEscaped( + const char *zLeft, /* The left label */ + u32 nLeft, /* Size of the left label in bytes */ + int rawLeft, /* True if zLeft contains no escapes */ + const char *zRight, /* The right label */ + u32 nRight, /* Size of the right label in bytes */ + int rawRight /* True if zRight is escape-free */ +){ + u32 cLeft, cRight; + assert( rawLeft==0 || rawRight==0 ); + while( 1 /*exit-by-return*/ ){ + if( nLeft==0 ){ + cLeft = 0; + }else if( rawLeft || zLeft[0]!='\\' ){ + cLeft = ((u8*)zLeft)[0]; + if( cLeft>=0xc0 ){ + int sz = sqlite3Utf8ReadLimited((u8*)zLeft, nLeft, &cLeft); + zLeft += sz; + nLeft -= sz; + }else{ + zLeft++; + nLeft--; + } + }else{ + u32 n = jsonUnescapeOneChar(zLeft, nLeft, &cLeft); + zLeft += n; + assert( n<=nLeft ); + nLeft -= n; + } + if( nRight==0 ){ + cRight = 0; + }else if( rawRight || zRight[0]!='\\' ){ + cRight = ((u8*)zRight)[0]; + if( cRight>=0xc0 ){ + int sz = sqlite3Utf8ReadLimited((u8*)zRight, nRight, &cRight); + zRight += sz; + nRight -= sz; + }else{ + zRight++; + nRight--; + } + }else{ + u32 n = jsonUnescapeOneChar(zRight, nRight, &cRight); + zRight += n; + assert( n<=nRight ); + nRight -= n; + } + if( cLeft!=cRight ) return 0; + if( cLeft==0 ) return 1; } - p->nJson = nJson; - p->iHold = iMaxHold+1; - sqlite3_set_auxdata(pCtx, JSON_CACHE_ID+iMinKey, p, - (void(*)(void*))jsonParseFree); - return (JsonParse*)sqlite3_get_auxdata(pCtx, JSON_CACHE_ID+iMinKey); } /* -** Compare the OBJECT label at pNode against zKey,nKey. Return true on -** a match. +** Compare two object labels. Return 1 if they are equal and +** 0 if they differ. Return -1 if an OOM occurs. */ -static int jsonLabelCompare(JsonNode *pNode, const char *zKey, u32 nKey){ - assert( pNode->eU==1 ); - if( pNode->jnFlags & JNODE_RAW ){ - if( pNode->n!=nKey ) return 0; - return strncmp(pNode->u.zJContent, zKey, nKey)==0; +static int jsonLabelCompare( + const char *zLeft, /* The left label */ + u32 nLeft, /* Size of the left label in bytes */ + int rawLeft, /* True if zLeft contains no escapes */ + const char *zRight, /* The right label */ + u32 nRight, /* Size of the right label in bytes */ + int rawRight /* True if zRight is escape-free */ +){ + if( rawLeft && rawRight ){ + /* Simpliest case: Neither label contains escapes. A simple + ** memcmp() is sufficient. */ + if( nLeft!=nRight ) return 0; + return memcmp(zLeft, zRight, nLeft)==0; }else{ - if( pNode->n!=nKey+2 ) return 0; - return strncmp(pNode->u.zJContent+1, zKey, nKey)==0; + return jsonLabelCompareEscaped(zLeft, nLeft, rawLeft, + zRight, nRight, rawRight); } } -/* forward declaration */ -static JsonNode *jsonLookupAppend(JsonParse*,const char*,int*,const char**); +/* +** Error returns from jsonLookupStep() +*/ +#define JSON_LOOKUP_ERROR 0xffffffff +#define JSON_LOOKUP_NOTFOUND 0xfffffffe +#define JSON_LOOKUP_PATHERROR 0xfffffffd +#define JSON_LOOKUP_ISERROR(x) ((x)>=JSON_LOOKUP_PATHERROR) + +/* Forward declaration */ +static u32 jsonLookupStep(JsonParse*,u32,const char*,u32); + + +/* This helper routine for jsonLookupStep() populates pIns with +** binary data that is to be inserted into pParse. +** +** In the common case, pIns just points to pParse->aIns and pParse->nIns. +** But if the zPath of the original edit operation includes path elements +** that go deeper, additional substructure must be created. +** +** For example: +** +** json_insert('{}', '$.a.b.c', 123); +** +** The search stops at '$.a' But additional substructure must be +** created for the ".b.c" part of the patch so that the final result +** is: {"a":{"b":{"c"::123}}}. This routine populates pIns with +** the binary equivalent of {"b":{"c":123}} so that it can be inserted. +** +** The caller is responsible for resetting pIns when it has finished +** using the substructure. +*/ +static u32 jsonCreateEditSubstructure( + JsonParse *pParse, /* The original JSONB that is being edited */ + JsonParse *pIns, /* Populate this with the blob data to insert */ + const char *zTail /* Tail of the path that determins substructure */ +){ + static const u8 emptyObject[] = { JSONB_ARRAY, JSONB_OBJECT }; + int rc; + memset(pIns, 0, sizeof(*pIns)); + pIns->db = pParse->db; + if( zTail[0]==0 ){ + /* No substructure. Just insert what is given in pParse. */ + pIns->aBlob = pParse->aIns; + pIns->nBlob = pParse->nIns; + rc = 0; + }else{ + /* Construct the binary substructure */ + pIns->nBlob = 1; + pIns->aBlob = (u8*)&emptyObject[zTail[0]=='.']; + pIns->eEdit = pParse->eEdit; + pIns->nIns = pParse->nIns; + pIns->aIns = pParse->aIns; + rc = jsonLookupStep(pIns, 0, zTail, 0); + pParse->oom |= pIns->oom; + } + return rc; /* Error code only */ +} /* -** Search along zPath to find the node specified. Return a pointer -** to that node, or NULL if zPath is malformed or if there is no such -** node. +** Search along zPath to find the Json element specified. Return an +** index into pParse->aBlob[] for the start of that element's value. +** +** If the value found by this routine is the value half of label/value pair +** within an object, then set pPath->iLabel to the start of the corresponding +** label, before returning. +** +** Return one of the JSON_LOOKUP error codes if problems are seen. ** -** If pApnd!=0, then try to append new nodes to complete zPath if it is -** possible to do so and if no existing node corresponds to zPath. If -** new nodes are appended *pApnd is set to 1. +** This routine will also modify the blob. If pParse->eEdit is one of +** JEDIT_DEL, JEDIT_REPL, JEDIT_INS, or JEDIT_SET, then changes might be +** made to the selected value. If an edit is performed, then the return +** value does not necessarily point to the select element. If an edit +** is performed, the return value is only useful for detecting error +** conditions. */ -static JsonNode *jsonLookupStep( +static u32 jsonLookupStep( JsonParse *pParse, /* The JSON to search */ - u32 iRoot, /* Begin the search at this node */ + u32 iRoot, /* Begin the search at this element of aBlob[] */ const char *zPath, /* The path to search */ - int *pApnd, /* Append nodes to complete path if not NULL */ - const char **pzErr /* Make *pzErr point to any syntax error in zPath */ + u32 iLabel /* Label if iRoot is a value of in an object */ ){ - u32 i, j, nKey; + u32 i, j, k, nKey, sz, n, iEnd, rc; const char *zKey; - JsonNode *pRoot = &pParse->aNode[iRoot]; - if( zPath[0]==0 ) return pRoot; - if( pRoot->jnFlags & JNODE_REPLACE ) return 0; + u8 x; + + if( zPath[0]==0 ){ + if( pParse->eEdit && jsonBlobMakeEditable(pParse, pParse->nIns) ){ + n = jsonbPayloadSize(pParse, iRoot, &sz); + sz += n; + if( pParse->eEdit==JEDIT_DEL ){ + if( iLabel>0 ){ + sz += iRoot - iLabel; + iRoot = iLabel; + } + jsonBlobEdit(pParse, iRoot, sz, 0, 0); + }else if( pParse->eEdit==JEDIT_INS ){ + /* Already exists, so json_insert() is a no-op */ + }else{ + /* json_set() or json_replace() */ + jsonBlobEdit(pParse, iRoot, sz, pParse->aIns, pParse->nIns); + } + } + pParse->iLabel = iLabel; + return iRoot; + } if( zPath[0]=='.' ){ - if( pRoot->eType!=JSON_OBJECT ) return 0; + int rawKey = 1; + x = pParse->aBlob[iRoot]; zPath++; if( zPath[0]=='"' ){ zKey = zPath + 1; - for(i=1; zPath[i] && zPath[i]!='"'; i++){} + for(i=1; zPath[i] && zPath[i]!='"'; i++){ + if( zPath[i]=='\\' && zPath[i+1]!=0 ) i++; + } nKey = i-1; if( zPath[i] ){ i++; }else{ - *pzErr = zPath; - return 0; + return JSON_LOOKUP_PATHERROR; } testcase( nKey==0 ); + rawKey = memchr(zKey, '\\', nKey)==0; }else{ zKey = zPath; for(i=0; zPath[i] && zPath[i]!='.' && zPath[i]!='['; i++){} nKey = i; if( nKey==0 ){ - *pzErr = zPath; - return 0; - } - } - j = 1; - for(;;){ - while( j<=pRoot->n ){ - if( jsonLabelCompare(pRoot+j, zKey, nKey) ){ - return jsonLookupStep(pParse, iRoot+j+1, &zPath[i], pApnd, pzErr); - } - j++; - j += jsonNodeSize(&pRoot[j]); + return JSON_LOOKUP_PATHERROR; + } + } + if( (x & 0x0f)!=JSONB_OBJECT ) return JSON_LOOKUP_NOTFOUND; + n = jsonbPayloadSize(pParse, iRoot, &sz); + j = iRoot + n; /* j is the index of a label */ + iEnd = j+sz; + while( jaBlob[j] & 0x0f; + if( xJSONB_TEXTRAW ) return JSON_LOOKUP_ERROR; + n = jsonbPayloadSize(pParse, j, &sz); + if( n==0 ) return JSON_LOOKUP_ERROR; + k = j+n; /* k is the index of the label text */ + if( k+sz>=iEnd ) return JSON_LOOKUP_ERROR; + zLabel = (const char*)&pParse->aBlob[k]; + rawLabel = x==JSONB_TEXT || x==JSONB_TEXTRAW; + if( jsonLabelCompare(zKey, nKey, rawKey, zLabel, sz, rawLabel) ){ + u32 v = k+sz; /* v is the index of the value */ + if( ((pParse->aBlob[v])&0x0f)>JSONB_OBJECT ) return JSON_LOOKUP_ERROR; + n = jsonbPayloadSize(pParse, v, &sz); + if( n==0 || v+n+sz>iEnd ) return JSON_LOOKUP_ERROR; + assert( j>0 ); + rc = jsonLookupStep(pParse, v, &zPath[i], j); + if( pParse->delta ) jsonAfterEditSizeAdjust(pParse, iRoot); + return rc; } - if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break; - assert( pRoot->eU==2 ); - iRoot += pRoot->u.iAppend; - pRoot = &pParse->aNode[iRoot]; - j = 1; - } - if( pApnd ){ - u32 iStart, iLabel; - JsonNode *pNode; - iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0); - iLabel = jsonParseAddNode(pParse, JSON_STRING, nKey, zKey); - zPath += i; - pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr); - if( pParse->oom ) return 0; - if( pNode ){ - pRoot = &pParse->aNode[iRoot]; - assert( pRoot->eU==0 ); - pRoot->u.iAppend = iStart - iRoot; - pRoot->jnFlags |= JNODE_APPEND; - VVA( pRoot->eU = 2 ); - pParse->aNode[iLabel].jnFlags |= JNODE_RAW; - } - return pNode; + j = k+sz; + if( ((pParse->aBlob[j])&0x0f)>JSONB_OBJECT ) return JSON_LOOKUP_ERROR; + n = jsonbPayloadSize(pParse, j, &sz); + if( n==0 ) return JSON_LOOKUP_ERROR; + j += n+sz; + } + if( j>iEnd ) return JSON_LOOKUP_ERROR; + if( pParse->eEdit>=JEDIT_INS ){ + u32 nIns; /* Total bytes to insert (label+value) */ + JsonParse v; /* BLOB encoding of the value to be inserted */ + JsonParse ix; /* Header of the label to be inserted */ + testcase( pParse->eEdit==JEDIT_INS ); + testcase( pParse->eEdit==JEDIT_SET ); + memset(&ix, 0, sizeof(ix)); + ix.db = pParse->db; + jsonBlobAppendNode(&ix, rawKey?JSONB_TEXTRAW:JSONB_TEXT5, nKey, 0); + pParse->oom |= ix.oom; + rc = jsonCreateEditSubstructure(pParse, &v, &zPath[i]); + if( !JSON_LOOKUP_ISERROR(rc) + && jsonBlobMakeEditable(pParse, ix.nBlob+nKey+v.nBlob) + ){ + assert( !pParse->oom ); + nIns = ix.nBlob + nKey + v.nBlob; + jsonBlobEdit(pParse, j, 0, 0, nIns); + if( !pParse->oom ){ + assert( pParse->aBlob!=0 ); /* Because pParse->oom!=0 */ + assert( ix.aBlob!=0 ); /* Because pPasre->oom!=0 */ + memcpy(&pParse->aBlob[j], ix.aBlob, ix.nBlob); + k = j + ix.nBlob; + memcpy(&pParse->aBlob[k], zKey, nKey); + k += nKey; + memcpy(&pParse->aBlob[k], v.aBlob, v.nBlob); + if( ALWAYS(pParse->delta) ) jsonAfterEditSizeAdjust(pParse, iRoot); + } + } + jsonParseReset(&v); + jsonParseReset(&ix); + return rc; } }else if( zPath[0]=='[' ){ - i = 0; - j = 1; - while( sqlite3Isdigit(zPath[j]) ){ - i = i*10 + zPath[j] - '0'; - j++; + x = pParse->aBlob[iRoot] & 0x0f; + if( x!=JSONB_ARRAY ) return JSON_LOOKUP_NOTFOUND; + n = jsonbPayloadSize(pParse, iRoot, &sz); + k = 0; + i = 1; + while( sqlite3Isdigit(zPath[i]) ){ + k = k*10 + zPath[i] - '0'; + i++; } - if( j<2 || zPath[j]!=']' ){ + if( i<2 || zPath[i]!=']' ){ if( zPath[1]=='#' ){ - JsonNode *pBase = pRoot; - int iBase = iRoot; - if( pRoot->eType!=JSON_ARRAY ) return 0; - for(;;){ - while( j<=pBase->n ){ - if( (pBase[j].jnFlags & JNODE_REMOVE)==0 ) i++; - j += jsonNodeSize(&pBase[j]); - } - if( (pBase->jnFlags & JNODE_APPEND)==0 ) break; - assert( pBase->eU==2 ); - iBase += pBase->u.iAppend; - pBase = &pParse->aNode[iBase]; - j = 1; - } - j = 2; + k = jsonbArrayCount(pParse, iRoot); + i = 2; if( zPath[2]=='-' && sqlite3Isdigit(zPath[3]) ){ - unsigned int x = 0; - j = 3; + unsigned int nn = 0; + i = 3; do{ - x = x*10 + zPath[j] - '0'; - j++; - }while( sqlite3Isdigit(zPath[j]) ); - if( x>i ) return 0; - i -= x; + nn = nn*10 + zPath[i] - '0'; + i++; + }while( sqlite3Isdigit(zPath[i]) ); + if( nn>k ) return JSON_LOOKUP_NOTFOUND; + k -= nn; } - if( zPath[j]!=']' ){ - *pzErr = zPath; - return 0; + if( zPath[i]!=']' ){ + return JSON_LOOKUP_PATHERROR; } }else{ - *pzErr = zPath; - return 0; + return JSON_LOOKUP_PATHERROR; } } - if( pRoot->eType!=JSON_ARRAY ) return 0; - zPath += j + 1; - j = 1; - for(;;){ - while( j<=pRoot->n && (i>0 || (pRoot[j].jnFlags & JNODE_REMOVE)!=0) ){ - if( (pRoot[j].jnFlags & JNODE_REMOVE)==0 ) i--; - j += jsonNodeSize(&pRoot[j]); - } - if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break; - assert( pRoot->eU==2 ); - iRoot += pRoot->u.iAppend; - pRoot = &pParse->aNode[iRoot]; - j = 1; - } - if( j<=pRoot->n ){ - return jsonLookupStep(pParse, iRoot+j, zPath, pApnd, pzErr); - } - if( i==0 && pApnd ){ - u32 iStart; - JsonNode *pNode; - iStart = jsonParseAddNode(pParse, JSON_ARRAY, 1, 0); - pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr); - if( pParse->oom ) return 0; - if( pNode ){ - pRoot = &pParse->aNode[iRoot]; - assert( pRoot->eU==0 ); - pRoot->u.iAppend = iStart - iRoot; - pRoot->jnFlags |= JNODE_APPEND; - VVA( pRoot->eU = 2 ); + j = iRoot+n; + iEnd = j+sz; + while( jdelta ) jsonAfterEditSizeAdjust(pParse, iRoot); + return rc; + } + k--; + n = jsonbPayloadSize(pParse, j, &sz); + if( n==0 ) return JSON_LOOKUP_ERROR; + j += n+sz; + } + if( j>iEnd ) return JSON_LOOKUP_ERROR; + if( k>0 ) return JSON_LOOKUP_NOTFOUND; + if( pParse->eEdit>=JEDIT_INS ){ + JsonParse v; + testcase( pParse->eEdit==JEDIT_INS ); + testcase( pParse->eEdit==JEDIT_SET ); + rc = jsonCreateEditSubstructure(pParse, &v, &zPath[i+1]); + if( !JSON_LOOKUP_ISERROR(rc) + && jsonBlobMakeEditable(pParse, v.nBlob) + ){ + assert( !pParse->oom ); + jsonBlobEdit(pParse, j, 0, v.aBlob, v.nBlob); } - return pNode; + jsonParseReset(&v); + if( pParse->delta ) jsonAfterEditSizeAdjust(pParse, iRoot); + return rc; } }else{ - *pzErr = zPath; + return JSON_LOOKUP_PATHERROR; } - return 0; + return JSON_LOOKUP_NOTFOUND; } /* -** Append content to pParse that will complete zPath. Return a pointer -** to the inserted node, or return NULL if the append fails. +** Convert a JSON BLOB into text and make that text the return value +** of an SQL function. */ -static JsonNode *jsonLookupAppend( - JsonParse *pParse, /* Append content to the JSON parse */ - const char *zPath, /* Description of content to append */ - int *pApnd, /* Set this flag to 1 */ - const char **pzErr /* Make this point to any syntax error */ +static void jsonReturnTextJsonFromBlob( + sqlite3_context *ctx, + const u8 *aBlob, + u32 nBlob ){ - *pApnd = 1; - if( zPath[0]==0 ){ - jsonParseAddNode(pParse, JSON_NULL, 0, 0); - return pParse->oom ? 0 : &pParse->aNode[pParse->nNode-1]; - } - if( zPath[0]=='.' ){ - jsonParseAddNode(pParse, JSON_OBJECT, 0, 0); - }else if( strncmp(zPath,"[0]",3)==0 ){ - jsonParseAddNode(pParse, JSON_ARRAY, 0, 0); - }else{ - return 0; - } - if( pParse->oom ) return 0; - return jsonLookupStep(pParse, pParse->nNode-1, zPath, pApnd, pzErr); + JsonParse x; + JsonString s; + + if( NEVER(aBlob==0) ) return; + memset(&x, 0, sizeof(x)); + x.aBlob = (u8*)aBlob; + x.nBlob = nBlob; + jsonStringInit(&s, ctx); + jsonTranslateBlobToText(&x, 0, &s); + jsonReturnString(&s, 0, 0); } + /* -** Return the text of a syntax error message on a JSON path. Space is -** obtained from sqlite3_malloc(). +** Return the value of the BLOB node at index i. +** +** If the value is a primitive, return it as an SQL value. +** If the value is an array or object, return it as either +** JSON text or the BLOB encoding, depending on the JSON_B flag +** on the userdata. */ -static char *jsonPathSyntaxError(const char *zErr){ - return sqlite3_mprintf("JSON path error near '%q'", zErr); +static void jsonReturnFromBlob( + JsonParse *pParse, /* Complete JSON parse tree */ + u32 i, /* Index of the node */ + sqlite3_context *pCtx, /* Return value for this function */ + int textOnly /* return text JSON. Disregard user-data */ +){ + u32 n, sz; + int rc; + sqlite3 *db = sqlite3_context_db_handle(pCtx); + + n = jsonbPayloadSize(pParse, i, &sz); + if( n==0 ){ + sqlite3_result_error(pCtx, "malformed JSON", -1); + return; + } + switch( pParse->aBlob[i] & 0x0f ){ + case JSONB_NULL: { + if( sz ) goto returnfromblob_malformed; + sqlite3_result_null(pCtx); + break; + } + case JSONB_TRUE: { + if( sz ) goto returnfromblob_malformed; + sqlite3_result_int(pCtx, 1); + break; + } + case JSONB_FALSE: { + if( sz ) goto returnfromblob_malformed; + sqlite3_result_int(pCtx, 0); + break; + } + case JSONB_INT5: + case JSONB_INT: { + sqlite3_int64 iRes = 0; + char *z; + int bNeg = 0; + char x; + if( sz==0 ) goto returnfromblob_malformed; + x = (char)pParse->aBlob[i+n]; + if( x=='-' ){ + if( sz<2 ) goto returnfromblob_malformed; + n++; + sz--; + bNeg = 1; + } + z = sqlite3DbStrNDup(db, (const char*)&pParse->aBlob[i+n], (int)sz); + if( z==0 ) goto returnfromblob_oom; + rc = sqlite3DecOrHexToI64(z, &iRes); + sqlite3DbFree(db, z); + if( rc==0 ){ + sqlite3_result_int64(pCtx, bNeg ? -iRes : iRes); + }else if( rc==3 && bNeg ){ + sqlite3_result_int64(pCtx, SMALLEST_INT64); + }else if( rc==1 ){ + goto returnfromblob_malformed; + }else{ + if( bNeg ){ n--; sz++; } + goto to_double; + } + break; + } + case JSONB_FLOAT5: + case JSONB_FLOAT: { + double r; + char *z; + if( sz==0 ) goto returnfromblob_malformed; + to_double: + z = sqlite3DbStrNDup(db, (const char*)&pParse->aBlob[i+n], (int)sz); + if( z==0 ) goto returnfromblob_oom; + rc = sqlite3AtoF(z, &r, sqlite3Strlen30(z), SQLITE_UTF8); + sqlite3DbFree(db, z); + if( rc<=0 ) goto returnfromblob_malformed; + sqlite3_result_double(pCtx, r); + break; + } + case JSONB_TEXTRAW: + case JSONB_TEXT: { + sqlite3_result_text(pCtx, (char*)&pParse->aBlob[i+n], sz, + SQLITE_TRANSIENT); + break; + } + case JSONB_TEXT5: + case JSONB_TEXTJ: { + /* Translate JSON formatted string into raw text */ + u32 iIn, iOut; + const char *z; + char *zOut; + u32 nOut = sz; + z = (const char*)&pParse->aBlob[i+n]; + zOut = sqlite3DbMallocRaw(db, nOut+1); + if( zOut==0 ) goto returnfromblob_oom; + for(iIn=iOut=0; iIn=2 ); + zOut[iOut++] = (char)(0xc0 | (v>>6)); + zOut[iOut++] = 0x80 | (v&0x3f); + }else if( v<0x10000 ){ + assert( szEscape>=3 ); + zOut[iOut++] = 0xe0 | (v>>12); + zOut[iOut++] = 0x80 | ((v>>6)&0x3f); + zOut[iOut++] = 0x80 | (v&0x3f); + }else if( v==JSON_INVALID_CHAR ){ + /* Silently ignore illegal unicode */ + }else{ + assert( szEscape>=4 ); + zOut[iOut++] = 0xf0 | (v>>18); + zOut[iOut++] = 0x80 | ((v>>12)&0x3f); + zOut[iOut++] = 0x80 | ((v>>6)&0x3f); + zOut[iOut++] = 0x80 | (v&0x3f); + } + iIn += szEscape - 1; + }else{ + zOut[iOut++] = c; + } + } /* end for() */ + assert( iOut<=nOut ); + zOut[iOut] = 0; + sqlite3_result_text(pCtx, zOut, iOut, SQLITE_DYNAMIC); + break; + } + case JSONB_ARRAY: + case JSONB_OBJECT: { + int flags = textOnly ? 0 : SQLITE_PTR_TO_INT(sqlite3_user_data(pCtx)); + if( flags & JSON_BLOB ){ + sqlite3_result_blob(pCtx, &pParse->aBlob[i], sz+n, SQLITE_TRANSIENT); + }else{ + jsonReturnTextJsonFromBlob(pCtx, &pParse->aBlob[i], sz+n); + } + break; + } + default: { + goto returnfromblob_malformed; + } + } + return; + +returnfromblob_oom: + sqlite3_result_error_nomem(pCtx); + return; + +returnfromblob_malformed: + sqlite3_result_error(pCtx, "malformed JSON", -1); + return; } /* -** Do a node lookup using zPath. Return a pointer to the node on success. -** Return NULL if not found or if there is an error. +** pArg is a function argument that might be an SQL value or a JSON +** value. Figure out what it is and encode it as a JSONB blob. +** Return the results in pParse. ** -** On an error, write an error message into pCtx and increment the -** pParse->nErr counter. +** pParse is uninitialized upon entry. This routine will handle the +** initialization of pParse. The result will be contained in +** pParse->aBlob and pParse->nBlob. pParse->aBlob might be dynamically +** allocated (if pParse->nBlobAlloc is greater than zero) in which case +** the caller is responsible for freeing the space allocated to pParse->aBlob +** when it has finished with it. Or pParse->aBlob might be a static string +** or a value obtained from sqlite3_value_blob(pArg). ** -** If pApnd!=NULL then try to append missing nodes and set *pApnd = 1 if -** nodes are appended. +** If the argument is a BLOB that is clearly not a JSONB, then this +** function might set an error message in ctx and return non-zero. +** It might also set an error message and return non-zero on an OOM error. */ -static JsonNode *jsonLookup( - JsonParse *pParse, /* The JSON to search */ - const char *zPath, /* The path to search */ - int *pApnd, /* Append nodes to complete path if not NULL */ - sqlite3_context *pCtx /* Report errors here, if not NULL */ -){ - const char *zErr = 0; - JsonNode *pNode = 0; - char *zMsg; - - if( zPath==0 ) return 0; - if( zPath[0]!='$' ){ - zErr = zPath; - goto lookup_err; +static int jsonFunctionArgToBlob( + sqlite3_context *ctx, + sqlite3_value *pArg, + JsonParse *pParse +){ + int eType = sqlite3_value_type(pArg); + static u8 aNull[] = { 0x00 }; + memset(pParse, 0, sizeof(pParse[0])); + pParse->db = sqlite3_context_db_handle(ctx); + switch( eType ){ + default: { + pParse->aBlob = aNull; + pParse->nBlob = 1; + return 0; + } + case SQLITE_BLOB: { + if( jsonFuncArgMightBeBinary(pArg) ){ + pParse->aBlob = (u8*)sqlite3_value_blob(pArg); + pParse->nBlob = sqlite3_value_bytes(pArg); + }else{ + sqlite3_result_error(ctx, "JSON cannot hold BLOB values", -1); + return 1; + } + break; + } + case SQLITE_TEXT: { + const char *zJson = (const char*)sqlite3_value_text(pArg); + int nJson = sqlite3_value_bytes(pArg); + if( zJson==0 ) return 1; + if( sqlite3_value_subtype(pArg)==JSON_SUBTYPE ){ + pParse->zJson = (char*)zJson; + pParse->nJson = nJson; + if( jsonConvertTextToBlob(pParse, ctx) ){ + sqlite3_result_error(ctx, "malformed JSON", -1); + sqlite3DbFree(pParse->db, pParse->aBlob); + memset(pParse, 0, sizeof(pParse[0])); + return 1; + } + }else{ + jsonBlobAppendNode(pParse, JSONB_TEXTRAW, nJson, zJson); + } + break; + } + case SQLITE_FLOAT: { + double r = sqlite3_value_double(pArg); + if( NEVER(sqlite3IsNaN(r)) ){ + jsonBlobAppendNode(pParse, JSONB_NULL, 0, 0); + }else{ + int n = sqlite3_value_bytes(pArg); + const char *z = (const char*)sqlite3_value_text(pArg); + if( z==0 ) return 1; + if( z[0]=='I' ){ + jsonBlobAppendNode(pParse, JSONB_FLOAT, 5, "9e999"); + }else if( z[0]=='-' && z[1]=='I' ){ + jsonBlobAppendNode(pParse, JSONB_FLOAT, 6, "-9e999"); + }else{ + jsonBlobAppendNode(pParse, JSONB_FLOAT, n, z); + } + } + break; + } + case SQLITE_INTEGER: { + int n = sqlite3_value_bytes(pArg); + const char *z = (const char*)sqlite3_value_text(pArg); + if( z==0 ) return 1; + jsonBlobAppendNode(pParse, JSONB_INT, n, z); + break; + } + } + if( pParse->oom ){ + sqlite3_result_error_nomem(ctx); + return 1; + }else{ + return 0; } - zPath++; - pNode = jsonLookupStep(pParse, 0, zPath, pApnd, &zErr); - if( zErr==0 ) return pNode; +} -lookup_err: - pParse->nErr++; - assert( zErr!=0 && pCtx!=0 ); - zMsg = jsonPathSyntaxError(zErr); +/* +** Generate a bad path error. +** +** If ctx is not NULL then push the error message into ctx and return NULL. +** If ctx is NULL, then return the text of the error message. +*/ +static char *jsonBadPathError( + sqlite3_context *ctx, /* The function call containing the error */ + const char *zPath /* The path with the problem */ +){ + char *zMsg = sqlite3_mprintf("bad JSON path: %Q", zPath); + if( ctx==0 ) return zMsg; if( zMsg ){ - sqlite3_result_error(pCtx, zMsg, -1); + sqlite3_result_error(ctx, zMsg, -1); sqlite3_free(zMsg); }else{ - sqlite3_result_error_nomem(pCtx); + sqlite3_result_error_nomem(ctx); } return 0; } +/* argv[0] is a BLOB that seems likely to be a JSONB. Subsequent +** arguments come in parse where each pair contains a JSON path and +** content to insert or set at that patch. Do the updates +** and return the result. +** +** The specific operation is determined by eEdit, which can be one +** of JEDIT_INS, JEDIT_REPL, or JEDIT_SET. +*/ +static void jsonInsertIntoBlob( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv, + int eEdit /* JEDIT_INS, JEDIT_REPL, or JEDIT_SET */ +){ + int i; + u32 rc = 0; + const char *zPath = 0; + int flgs; + JsonParse *p; + JsonParse ax; + + assert( (argc&1)==1 ); + flgs = argc==1 ? 0 : JSON_EDITABLE; + p = jsonParseFuncArg(ctx, argv[0], flgs); + if( p==0 ) return; + for(i=1; inBlob, ax.aBlob, ax.nBlob); + } + rc = 0; + }else{ + p->eEdit = eEdit; + p->nIns = ax.nBlob; + p->aIns = ax.aBlob; + p->delta = 0; + rc = jsonLookupStep(p, 0, zPath+1, 0); + } + jsonParseReset(&ax); + if( rc==JSON_LOOKUP_NOTFOUND ) continue; + if( JSON_LOOKUP_ISERROR(rc) ) goto jsonInsertIntoBlob_patherror; + } + jsonReturnParse(ctx, p); + jsonParseFree(p); + return; + +jsonInsertIntoBlob_patherror: + jsonParseFree(p); + if( rc==JSON_LOOKUP_ERROR ){ + sqlite3_result_error(ctx, "malformed JSON", -1); + }else{ + jsonBadPathError(ctx, zPath); + } + return; +} /* -** Report the wrong number of arguments for json_insert(), json_replace() -** or json_set(). +** If pArg is a blob that seems like a JSONB blob, then initialize +** p to point to that JSONB and return TRUE. If pArg does not seem like +** a JSONB blob, then return FALSE; +** +** This routine is only called if it is already known that pArg is a +** blob. The only open question is whether or not the blob appears +** to be a JSONB blob. */ -static void jsonWrongNumArgs( - sqlite3_context *pCtx, - const char *zFuncName -){ - char *zMsg = sqlite3_mprintf("json_%s() needs an odd number of arguments", - zFuncName); - sqlite3_result_error(pCtx, zMsg, -1); - sqlite3_free(zMsg); +static int jsonArgIsJsonb(sqlite3_value *pArg, JsonParse *p){ + u32 n, sz = 0; + p->aBlob = (u8*)sqlite3_value_blob(pArg); + p->nBlob = (u32)sqlite3_value_bytes(pArg); + if( p->nBlob==0 ){ + p->aBlob = 0; + return 0; + } + if( NEVER(p->aBlob==0) ){ + return 0; + } + if( (p->aBlob[0] & 0x0f)<=JSONB_OBJECT + && (n = jsonbPayloadSize(p, 0, &sz))>0 + && sz+n==p->nBlob + && ((p->aBlob[0] & 0x0f)>JSONB_FALSE || sz==0) + ){ + return 1; + } + p->aBlob = 0; + p->nBlob = 0; + return 0; } /* -** Mark all NULL entries in the Object passed in as JNODE_REMOVE. +** Generate a JsonParse object, containing valid JSONB in aBlob and nBlob, +** from the SQL function argument pArg. Return a pointer to the new +** JsonParse object. +** +** Ownership of the new JsonParse object is passed to the caller. The +** caller should invoke jsonParseFree() on the return value when it +** has finished using it. +** +** If any errors are detected, an appropriate error messages is set +** using sqlite3_result_error() or the equivalent and this routine +** returns NULL. This routine also returns NULL if the pArg argument +** is an SQL NULL value, but no error message is set in that case. This +** is so that SQL functions that are given NULL arguments will return +** a NULL value. */ -static void jsonRemoveAllNulls(JsonNode *pNode){ - int i, n; - assert( pNode->eType==JSON_OBJECT ); - n = pNode->n; - for(i=2; i<=n; i += jsonNodeSize(&pNode[i])+1){ - switch( pNode[i].eType ){ - case JSON_NULL: - pNode[i].jnFlags |= JNODE_REMOVE; - break; - case JSON_OBJECT: - jsonRemoveAllNulls(&pNode[i]); - break; +static JsonParse *jsonParseFuncArg( + sqlite3_context *ctx, + sqlite3_value *pArg, + u32 flgs +){ + int eType; /* Datatype of pArg */ + JsonParse *p = 0; /* Value to be returned */ + JsonParse *pFromCache = 0; /* Value taken from cache */ + sqlite3 *db; /* The database connection */ + + assert( ctx!=0 ); + eType = sqlite3_value_type(pArg); + if( eType==SQLITE_NULL ){ + return 0; + } + pFromCache = jsonCacheSearch(ctx, pArg); + if( pFromCache ){ + pFromCache->nJPRef++; + if( (flgs & JSON_EDITABLE)==0 ){ + return pFromCache; } } -} + db = sqlite3_context_db_handle(ctx); +rebuild_from_cache: + p = sqlite3DbMallocZero(db, sizeof(*p)); + if( p==0 ) goto json_pfa_oom; + memset(p, 0, sizeof(*p)); + p->db = db; + p->nJPRef = 1; + if( pFromCache!=0 ){ + u32 nBlob = pFromCache->nBlob; + p->aBlob = sqlite3DbMallocRaw(db, nBlob); + if( p->aBlob==0 ) goto json_pfa_oom; + memcpy(p->aBlob, pFromCache->aBlob, nBlob); + p->nBlobAlloc = p->nBlob = nBlob; + p->hasNonstd = pFromCache->hasNonstd; + jsonParseFree(pFromCache); + return p; + } + if( eType==SQLITE_BLOB ){ + if( jsonArgIsJsonb(pArg,p) ){ + if( (flgs & JSON_EDITABLE)!=0 && jsonBlobMakeEditable(p, 0)==0 ){ + goto json_pfa_oom; + } + return p; + } + /* If the blob is not valid JSONB, fall through into trying to cast + ** the blob into text which is then interpreted as JSON. (tag-20240123-a) + ** + ** This goes against all historical documentation about how the SQLite + ** JSON functions were suppose to work. From the beginning, blob was + ** reserved for expansion and a blob value should have raised an error. + ** But it did not, due to a bug. And many applications came to depend + ** upon this buggy behavior, espeically when using the CLI and reading + ** JSON text using readfile(), which returns a blob. For this reason + ** we will continue to support the bug moving forward. + ** See for example https://sqlite.org/forum/forumpost/012136abd5292b8d + */ + } + p->zJson = (char*)sqlite3_value_text(pArg); + p->nJson = sqlite3_value_bytes(pArg); + if( db->mallocFailed ) goto json_pfa_oom; + if( p->nJson==0 ) goto json_pfa_malformed; + assert( p->zJson!=0 ); + if( jsonConvertTextToBlob(p, (flgs & JSON_KEEPERROR) ? 0 : ctx) ){ + if( flgs & JSON_KEEPERROR ){ + p->nErr = 1; + return p; + }else{ + jsonParseFree(p); + return 0; + } + }else{ + int isRCStr = sqlite3ValueIsOfClass(pArg, sqlite3RCStrUnref); + int rc; + if( !isRCStr ){ + char *zNew = sqlite3RCStrNew( p->nJson ); + if( zNew==0 ) goto json_pfa_oom; + memcpy(zNew, p->zJson, p->nJson); + p->zJson = zNew; + p->zJson[p->nJson] = 0; + }else{ + sqlite3RCStrRef(p->zJson); + } + p->bJsonIsRCStr = 1; + rc = jsonCacheInsert(ctx, p); + if( rc==SQLITE_NOMEM ) goto json_pfa_oom; + if( flgs & JSON_EDITABLE ){ + pFromCache = p; + p = 0; + goto rebuild_from_cache; + } + } + return p; +json_pfa_malformed: + if( flgs & JSON_KEEPERROR ){ + p->nErr = 1; + return p; + }else{ + jsonParseFree(p); + sqlite3_result_error(ctx, "malformed JSON", -1); + return 0; + } -/**************************************************************************** -** SQL functions used for testing and debugging -****************************************************************************/ +json_pfa_oom: + jsonParseFree(pFromCache); + jsonParseFree(p); + sqlite3_result_error_nomem(ctx); + return 0; +} -#ifdef SQLITE_DEBUG /* -** The json_parse(JSON) function returns a string which describes -** a parse of the JSON provided. Or it returns NULL if JSON is not -** well-formed. +** Make the return value of a JSON function either the raw JSONB blob +** or make it JSON text, depending on whether the JSON_BLOB flag is +** set on the function. */ -static void jsonParseFunc( +static void jsonReturnParse( sqlite3_context *ctx, - int argc, - sqlite3_value **argv + JsonParse *p ){ - JsonString s; /* Output string - not real JSON */ - JsonParse x; /* The parse */ - u32 i; - - assert( argc==1 ); - if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; - jsonParseFindParents(&x); - jsonInit(&s, ctx); - for(i=0; ioom ){ + sqlite3_result_error_nomem(ctx); + return; + } + flgs = SQLITE_PTR_TO_INT(sqlite3_user_data(ctx)); + if( flgs & JSON_BLOB ){ + if( p->nBlobAlloc>0 && !p->bReadOnly ){ + sqlite3_result_blob(ctx, p->aBlob, p->nBlob, SQLITE_DYNAMIC); + p->nBlobAlloc = 0; }else{ - zType = jsonType[x.aNode[i].eType]; + sqlite3_result_blob(ctx, p->aBlob, p->nBlob, SQLITE_TRANSIENT); } - jsonPrintf(100, &s,"node %3u: %7s n=%-4d up=%-4d", - i, zType, x.aNode[i].n, x.aUp[i]); - assert( x.aNode[i].eU==0 || x.aNode[i].eU==1 ); - if( x.aNode[i].u.zJContent!=0 ){ - assert( x.aNode[i].eU==1 ); - jsonAppendRaw(&s, " ", 1); - jsonAppendRaw(&s, x.aNode[i].u.zJContent, x.aNode[i].n); - }else{ - assert( x.aNode[i].eU==0 ); + }else{ + JsonString s; + jsonStringInit(&s, ctx); + p->delta = 0; + jsonTranslateBlobToText(p, 0, &s); + jsonReturnString(&s, p, ctx); + sqlite3_result_subtype(ctx, JSON_SUBTYPE); + } +} + +/**************************************************************************** +** SQL functions used for testing and debugging +****************************************************************************/ + +#if SQLITE_DEBUG +/* +** Decode JSONB bytes in aBlob[] starting at iStart through but not +** including iEnd. Indent the +** content by nIndent spaces. +*/ +static void jsonDebugPrintBlob( + JsonParse *pParse, /* JSON content */ + u32 iStart, /* Start rendering here */ + u32 iEnd, /* Do not render this byte or any byte after this one */ + int nIndent, /* Indent by this many spaces */ + sqlite3_str *pOut /* Generate output into this sqlite3_str object */ +){ + while( iStartaBlob[iStart] & 0x0f; + u32 savedNBlob = pParse->nBlob; + sqlite3_str_appendf(pOut, "%5d:%*s", iStart, nIndent, ""); + if( pParse->nBlobAlloc>pParse->nBlob ){ + pParse->nBlob = pParse->nBlobAlloc; + } + nn = n = jsonbPayloadSize(pParse, iStart, &sz); + if( nn==0 ) nn = 1; + if( sz>0 && xaBlob[iStart+i]); + } + if( n==0 ){ + sqlite3_str_appendf(pOut, " ERROR invalid node size\n"); + iStart = n==0 ? iStart+1 : iEnd; + continue; } - jsonAppendRaw(&s, "\n", 1); + pParse->nBlob = savedNBlob; + if( iStart+n+sz>iEnd ){ + iEnd = iStart+n+sz; + if( iEnd>pParse->nBlob ){ + if( pParse->nBlobAlloc>0 && iEnd>pParse->nBlobAlloc ){ + iEnd = pParse->nBlobAlloc; + }else{ + iEnd = pParse->nBlob; + } + } + } + sqlite3_str_appendall(pOut," <-- "); + switch( x ){ + case JSONB_NULL: sqlite3_str_appendall(pOut,"null"); break; + case JSONB_TRUE: sqlite3_str_appendall(pOut,"true"); break; + case JSONB_FALSE: sqlite3_str_appendall(pOut,"false"); break; + case JSONB_INT: sqlite3_str_appendall(pOut,"int"); break; + case JSONB_INT5: sqlite3_str_appendall(pOut,"int5"); break; + case JSONB_FLOAT: sqlite3_str_appendall(pOut,"float"); break; + case JSONB_FLOAT5: sqlite3_str_appendall(pOut,"float5"); break; + case JSONB_TEXT: sqlite3_str_appendall(pOut,"text"); break; + case JSONB_TEXTJ: sqlite3_str_appendall(pOut,"textj"); break; + case JSONB_TEXT5: sqlite3_str_appendall(pOut,"text5"); break; + case JSONB_TEXTRAW: sqlite3_str_appendall(pOut,"textraw"); break; + case JSONB_ARRAY: { + sqlite3_str_appendf(pOut,"array, %u bytes\n", sz); + jsonDebugPrintBlob(pParse, iStart+n, iStart+n+sz, nIndent+2, pOut); + showContent = 0; + break; + } + case JSONB_OBJECT: { + sqlite3_str_appendf(pOut, "object, %u bytes\n", sz); + jsonDebugPrintBlob(pParse, iStart+n, iStart+n+sz, nIndent+2, pOut); + showContent = 0; + break; + } + default: { + sqlite3_str_appendall(pOut, "ERROR: unknown node type\n"); + showContent = 0; + break; + } + } + if( showContent ){ + if( sz==0 && x<=JSONB_FALSE ){ + sqlite3_str_append(pOut, "\n", 1); + }else{ + u32 j; + sqlite3_str_appendall(pOut, ": \""); + for(j=iStart+n; jaBlob[j]; + if( c<0x20 || c>=0x7f ) c = '.'; + sqlite3_str_append(pOut, (char*)&c, 1); + } + sqlite3_str_append(pOut, "\"\n", 2); + } + } + iStart += n + sz; + } +} +static void jsonShowParse(JsonParse *pParse){ + sqlite3_str out; + char zBuf[1000]; + if( pParse==0 ){ + printf("NULL pointer\n"); + return; + }else{ + printf("nBlobAlloc = %u\n", pParse->nBlobAlloc); + printf("nBlob = %u\n", pParse->nBlob); + printf("delta = %d\n", pParse->delta); + if( pParse->nBlob==0 ) return; + printf("content (bytes 0..%u):\n", pParse->nBlob-1); } - jsonParseReset(&x); - jsonResult(&s); + sqlite3StrAccumInit(&out, 0, zBuf, sizeof(zBuf), 1000000); + jsonDebugPrintBlob(pParse, 0, pParse->nBlob, 0, &out); + printf("%s", sqlite3_str_value(&out)); + sqlite3_str_reset(&out); } +#endif /* SQLITE_DEBUG */ +#ifdef SQLITE_DEBUG /* -** The json_test1(JSON) function return true (1) if the input is JSON -** text generated by another json function. It returns (0) if the input -** is not known to be JSON. +** SQL function: json_parse(JSON) +** +** Parse JSON using jsonParseFuncArg(). Return text that is a +** human-readable dump of the binary JSONB for the input parameter. */ -static void jsonTest1Func( +static void jsonParseFunc( sqlite3_context *ctx, int argc, sqlite3_value **argv ){ - UNUSED_PARAMETER(argc); - sqlite3_result_int(ctx, sqlite3_value_subtype(argv[0])==JSON_SUBTYPE); + JsonParse *p; /* The parse */ + sqlite3_str out; + + assert( argc>=1 ); + sqlite3StrAccumInit(&out, 0, 0, 0, 1000000); + p = jsonParseFuncArg(ctx, argv[0], 0); + if( p==0 ) return; + if( argc==1 ){ + jsonDebugPrintBlob(p, 0, p->nBlob, 0, &out); + sqlite3_result_text64(ctx,out.zText,out.nChar,SQLITE_TRANSIENT,SQLITE_UTF8); + }else{ + jsonShowParse(p); + } + jsonParseFree(p); + sqlite3_str_reset(&out); } #endif /* SQLITE_DEBUG */ @@ -200227,7 +209889,7 @@ static void jsonTest1Func( ****************************************************************************/ /* -** Implementation of the json_QUOTE(VALUE) function. Return a JSON value +** Implementation of the json_quote(VALUE) function. Return a JSON value ** corresponding to the SQL value input. Mostly this means putting ** double-quotes around strings and returning the unquoted string "null" ** when given a NULL input. @@ -200240,9 +209902,9 @@ static void jsonQuoteFunc( JsonString jx; UNUSED_PARAMETER(argc); - jsonInit(&jx, ctx); - jsonAppendValue(&jx, argv[0]); - jsonResult(&jx); + jsonStringInit(&jx, ctx); + jsonAppendSqlValue(&jx, argv[0]); + jsonReturnString(&jx, 0, 0); sqlite3_result_subtype(ctx, JSON_SUBTYPE); } @@ -200259,18 +209921,17 @@ static void jsonArrayFunc( int i; JsonString jx; - jsonInit(&jx, ctx); + jsonStringInit(&jx, ctx); jsonAppendChar(&jx, '['); for(i=0; inNode ); if( argc==2 ){ const char *zPath = (const char*)sqlite3_value_text(argv[1]); - pNode = jsonLookup(p, zPath, 0, ctx); + if( zPath==0 ){ + jsonParseFree(p); + return; + } + i = jsonLookupStep(p, 0, zPath[0]=='$' ? zPath+1 : "@", 0); + if( JSON_LOOKUP_ISERROR(i) ){ + if( i==JSON_LOOKUP_NOTFOUND ){ + /* no-op */ + }else if( i==JSON_LOOKUP_PATHERROR ){ + jsonBadPathError(ctx, zPath); + }else{ + sqlite3_result_error(ctx, "malformed JSON", -1); + } + eErr = 1; + i = 0; + } }else{ - pNode = p->aNode; + i = 0; } - if( pNode==0 ){ - return; + if( (p->aBlob[i] & 0x0f)==JSONB_ARRAY ){ + cnt = jsonbArrayCount(p, i); } - if( pNode->eType==JSON_ARRAY ){ - assert( (pNode->jnFlags & JNODE_APPEND)==0 ); - for(i=1; i<=pNode->n; n++){ - i += jsonNodeSize(&pNode[i]); - } - } - sqlite3_result_int64(ctx, n); + if( !eErr ) sqlite3_result_int64(ctx, cnt); + jsonParseFree(p); } -/* -** Bit values for the flags passed into jsonExtractFunc() or -** jsonSetFunc() via the user-data value. -*/ -#define JSON_JSON 0x01 /* Result is always JSON */ -#define JSON_SQL 0x02 /* Result is always SQL */ -#define JSON_ABPATH 0x03 /* Allow abbreviated JSON path specs */ -#define JSON_ISSET 0x04 /* json_set(), not json_insert() */ +/* True if the string is all alphanumerics and underscores */ +static int jsonAllAlphanum(const char *z, int n){ + int i; + for(i=0; i2 ){ + jsonAppendChar(&jx, '['); + } + for(i=1; i and ->> operators accept abbreviated PATH arguments. This - ** is mostly for compatibility with PostgreSQL, but also for - ** convenience. - ** - ** NUMBER ==> $[NUMBER] // PG compatible - ** LABEL ==> $.LABEL // PG compatible - ** [NUMBER] ==> $[NUMBER] // Not PG. Purely for convenience - */ - jsonInit(&jx, ctx); - if( sqlite3Isdigit(zPath[0]) ){ - jsonAppendRaw(&jx, "$[", 2); - jsonAppendRaw(&jx, zPath, (int)strlen(zPath)); - jsonAppendRaw(&jx, "]", 2); - }else{ - jsonAppendRaw(&jx, "$.", 1 + (zPath[0]!='[')); - jsonAppendRaw(&jx, zPath, (int)strlen(zPath)); - jsonAppendChar(&jx, 0); - } - pNode = jx.bErr ? 0 : jsonLookup(p, jx.zBuf, 0, ctx); - jsonReset(&jx); + const char *zPath = (const char*)sqlite3_value_text(argv[i]); + int nPath; + u32 j; + if( zPath==0 ) goto json_extract_error; + nPath = sqlite3Strlen30(zPath); + if( zPath[0]=='$' ){ + j = jsonLookupStep(p, 0, zPath+1, 0); + }else if( (flags & JSON_ABPATH) ){ + /* The -> and ->> operators accept abbreviated PATH arguments. This + ** is mostly for compatibility with PostgreSQL, but also for + ** convenience. + ** + ** NUMBER ==> $[NUMBER] // PG compatible + ** LABEL ==> $.LABEL // PG compatible + ** [NUMBER] ==> $[NUMBER] // Not PG. Purely for convenience + ** + ** Updated 2024-05-27: If the NUMBER is negative, then PG counts from + ** the right of the array. Hence for negative NUMBER: + ** + ** NUMBER ==> $[#NUMBER] // PG compatible + */ + jsonStringInit(&jx, ctx); + if( sqlite3_value_type(argv[i])==SQLITE_INTEGER ){ + jsonAppendRawNZ(&jx, "[", 1); + if( zPath[0]=='-' ) jsonAppendRawNZ(&jx,"#",1); + jsonAppendRaw(&jx, zPath, nPath); + jsonAppendRawNZ(&jx, "]", 2); + }else if( jsonAllAlphanum(zPath, nPath) ){ + jsonAppendRawNZ(&jx, ".", 1); + jsonAppendRaw(&jx, zPath, nPath); + }else if( zPath[0]=='[' && nPath>=3 && zPath[nPath-1]==']' ){ + jsonAppendRaw(&jx, zPath, nPath); }else{ - pNode = jsonLookup(p, zPath, 0, ctx); + jsonAppendRawNZ(&jx, ".\"", 2); + jsonAppendRaw(&jx, zPath, nPath); + jsonAppendRawNZ(&jx, "\"", 1); } - if( pNode ){ + jsonStringTerminate(&jx); + j = jsonLookupStep(p, 0, jx.zBuf, 0); + jsonStringReset(&jx); + }else{ + jsonBadPathError(ctx, zPath); + goto json_extract_error; + } + if( jnBlob ){ + if( argc==2 ){ if( flags & JSON_JSON ){ - jsonReturnJson(pNode, ctx, 0); + jsonStringInit(&jx, ctx); + jsonTranslateBlobToText(p, j, &jx); + jsonReturnString(&jx, 0, 0); + jsonStringReset(&jx); + assert( (flags & JSON_BLOB)==0 ); + sqlite3_result_subtype(ctx, JSON_SUBTYPE); }else{ - jsonReturn(pNode, ctx, 0); - sqlite3_result_subtype(ctx, 0); + jsonReturnFromBlob(p, j, ctx, 0); + if( (flags & (JSON_SQL|JSON_BLOB))==0 + && (p->aBlob[j]&0x0f)>=JSONB_ARRAY + ){ + sqlite3_result_subtype(ctx, JSON_SUBTYPE); + } } + }else{ + jsonAppendSeparator(&jx); + jsonTranslateBlobToText(p, j, &jx); } - }else{ - pNode = jsonLookup(p, zPath, 0, ctx); - if( p->nErr==0 && pNode ) jsonReturn(pNode, ctx, 0); - } - }else{ - /* Two or more PATH arguments results in a JSON array with each - ** element of the array being the value selected by one of the PATHs */ - int i; - jsonInit(&jx, ctx); - jsonAppendChar(&jx, '['); - for(i=1; inErr ) break; - jsonAppendSeparator(&jx); - if( pNode ){ - jsonRenderNode(pNode, &jx, 0); + }else if( j==JSON_LOOKUP_NOTFOUND ){ + if( argc==2 ){ + goto json_extract_error; /* Return NULL if not found */ }else{ - jsonAppendRaw(&jx, "null", 4); + jsonAppendSeparator(&jx); + jsonAppendRawNZ(&jx, "null", 4); } + }else if( j==JSON_LOOKUP_ERROR ){ + sqlite3_result_error(ctx, "malformed JSON", -1); + goto json_extract_error; + }else{ + jsonBadPathError(ctx, zPath); + goto json_extract_error; } - if( i==argc ){ - jsonAppendChar(&jx, ']'); - jsonResult(&jx); + } + if( argc>2 ){ + jsonAppendChar(&jx, ']'); + jsonReturnString(&jx, 0, 0); + if( (flags & JSON_BLOB)==0 ){ sqlite3_result_subtype(ctx, JSON_SUBTYPE); } - jsonReset(&jx); } +json_extract_error: + jsonStringReset(&jx); + jsonParseFree(p); + return; } -/* This is the RFC 7396 MergePatch algorithm. -*/ -static JsonNode *jsonMergePatch( - JsonParse *pParse, /* The JSON parser that contains the TARGET */ - u32 iTarget, /* Node of the TARGET in pParse */ - JsonNode *pPatch /* The PATCH */ -){ - u32 i, j; - u32 iRoot; - JsonNode *pTarget; - if( pPatch->eType!=JSON_OBJECT ){ - return pPatch; - } - assert( iTargetnNode ); - pTarget = &pParse->aNode[iTarget]; - assert( (pPatch->jnFlags & JNODE_APPEND)==0 ); - if( pTarget->eType!=JSON_OBJECT ){ - jsonRemoveAllNulls(pPatch); - return pPatch; - } - iRoot = iTarget; - for(i=1; in; i += jsonNodeSize(&pPatch[i+1])+1){ - u32 nKey; - const char *zKey; - assert( pPatch[i].eType==JSON_STRING ); - assert( pPatch[i].jnFlags & JNODE_LABEL ); - assert( pPatch[i].eU==1 ); - nKey = pPatch[i].n; - zKey = pPatch[i].u.zJContent; - assert( (pPatch[i].jnFlags & JNODE_RAW)==0 ); - for(j=1; jn; j += jsonNodeSize(&pTarget[j+1])+1 ){ - assert( pTarget[j].eType==JSON_STRING ); - assert( pTarget[j].jnFlags & JNODE_LABEL ); - assert( (pPatch[i].jnFlags & JNODE_RAW)==0 ); - if( pTarget[j].n==nKey && strncmp(pTarget[j].u.zJContent,zKey,nKey)==0 ){ - if( pTarget[j+1].jnFlags & (JNODE_REMOVE|JNODE_PATCH) ) break; - if( pPatch[i+1].eType==JSON_NULL ){ - pTarget[j+1].jnFlags |= JNODE_REMOVE; - }else{ - JsonNode *pNew = jsonMergePatch(pParse, iTarget+j+1, &pPatch[i+1]); - if( pNew==0 ) return 0; - pTarget = &pParse->aNode[iTarget]; - if( pNew!=&pTarget[j+1] ){ - assert( pTarget[j+1].eU==0 - || pTarget[j+1].eU==1 - || pTarget[j+1].eU==2 ); - testcase( pTarget[j+1].eU==1 ); - testcase( pTarget[j+1].eU==2 ); - VVA( pTarget[j+1].eU = 5 ); - pTarget[j+1].u.pPatch = pNew; - pTarget[j+1].jnFlags |= JNODE_PATCH; - } - } - break; +/* +** Return codes for jsonMergePatch() +*/ +#define JSON_MERGE_OK 0 /* Success */ +#define JSON_MERGE_BADTARGET 1 /* Malformed TARGET blob */ +#define JSON_MERGE_BADPATCH 2 /* Malformed PATCH blob */ +#define JSON_MERGE_OOM 3 /* Out-of-memory condition */ + +/* +** RFC-7396 MergePatch for two JSONB blobs. +** +** pTarget is the target. pPatch is the patch. The target is updated +** in place. The patch is read-only. +** +** The original RFC-7396 algorithm is this: +** +** define MergePatch(Target, Patch): +** if Patch is an Object: +** if Target is not an Object: +** Target = {} # Ignore the contents and set it to an empty Object +** for each Name/Value pair in Patch: +** if Value is null: +** if Name exists in Target: +** remove the Name/Value pair from Target +** else: +** Target[Name] = MergePatch(Target[Name], Value) +** return Target +** else: +** return Patch +** +** Here is an equivalent algorithm restructured to show the actual +** implementation: +** +** 01 define MergePatch(Target, Patch): +** 02 if Patch is not an Object: +** 03 return Patch +** 04 else: // if Patch is an Object +** 05 if Target is not an Object: +** 06 Target = {} +** 07 for each Name/Value pair in Patch: +** 08 if Name exists in Target: +** 09 if Value is null: +** 10 remove the Name/Value pair from Target +** 11 else +** 12 Target[name] = MergePatch(Target[Name], Value) +** 13 else if Value is not NULL: +** 14 if Value is not an Object: +** 15 Target[name] = Value +** 16 else: +** 17 Target[name] = MergePatch('{}',value) +** 18 return Target +** | +** ^---- Line numbers referenced in comments in the implementation +*/ +static int jsonMergePatch( + JsonParse *pTarget, /* The JSON parser that contains the TARGET */ + u32 iTarget, /* Index of TARGET in pTarget->aBlob[] */ + const JsonParse *pPatch, /* The PATCH */ + u32 iPatch /* Index of PATCH in pPatch->aBlob[] */ +){ + u8 x; /* Type of a single node */ + u32 n, sz=0; /* Return values from jsonbPayloadSize() */ + u32 iTCursor; /* Cursor position while scanning the target object */ + u32 iTStart; /* First label in the target object */ + u32 iTEndBE; /* Original first byte past end of target, before edit */ + u32 iTEnd; /* Current first byte past end of target */ + u8 eTLabel; /* Node type of the target label */ + u32 iTLabel = 0; /* Index of the label */ + u32 nTLabel = 0; /* Header size in bytes for the target label */ + u32 szTLabel = 0; /* Size of the target label payload */ + u32 iTValue = 0; /* Index of the target value */ + u32 nTValue = 0; /* Header size of the target value */ + u32 szTValue = 0; /* Payload size for the target value */ + + u32 iPCursor; /* Cursor position while scanning the patch */ + u32 iPEnd; /* First byte past the end of the patch */ + u8 ePLabel; /* Node type of the patch label */ + u32 iPLabel; /* Start of patch label */ + u32 nPLabel; /* Size of header on the patch label */ + u32 szPLabel; /* Payload size of the patch label */ + u32 iPValue; /* Start of patch value */ + u32 nPValue; /* Header size for the patch value */ + u32 szPValue; /* Payload size of the patch value */ + + assert( iTarget>=0 && iTargetnBlob ); + assert( iPatch>=0 && iPatchnBlob ); + x = pPatch->aBlob[iPatch] & 0x0f; + if( x!=JSONB_OBJECT ){ /* Algorithm line 02 */ + u32 szPatch; /* Total size of the patch, header+payload */ + u32 szTarget; /* Total size of the target, header+payload */ + n = jsonbPayloadSize(pPatch, iPatch, &sz); + szPatch = n+sz; + sz = 0; + n = jsonbPayloadSize(pTarget, iTarget, &sz); + szTarget = n+sz; + jsonBlobEdit(pTarget, iTarget, szTarget, pPatch->aBlob+iPatch, szPatch); + return pTarget->oom ? JSON_MERGE_OOM : JSON_MERGE_OK; /* Line 03 */ + } + x = pTarget->aBlob[iTarget] & 0x0f; + if( x!=JSONB_OBJECT ){ /* Algorithm line 05 */ + n = jsonbPayloadSize(pTarget, iTarget, &sz); + jsonBlobEdit(pTarget, iTarget+n, sz, 0, 0); + x = pTarget->aBlob[iTarget]; + pTarget->aBlob[iTarget] = (x & 0xf0) | JSONB_OBJECT; + } + n = jsonbPayloadSize(pPatch, iPatch, &sz); + if( NEVER(n==0) ) return JSON_MERGE_BADPATCH; + iPCursor = iPatch+n; + iPEnd = iPCursor+sz; + n = jsonbPayloadSize(pTarget, iTarget, &sz); + if( NEVER(n==0) ) return JSON_MERGE_BADTARGET; + iTStart = iTarget+n; + iTEndBE = iTStart+sz; + + while( iPCursoraBlob[iPCursor] & 0x0f; + if( ePLabelJSONB_TEXTRAW ){ + return JSON_MERGE_BADPATCH; + } + nPLabel = jsonbPayloadSize(pPatch, iPCursor, &szPLabel); + if( nPLabel==0 ) return JSON_MERGE_BADPATCH; + iPValue = iPCursor + nPLabel + szPLabel; + if( iPValue>=iPEnd ) return JSON_MERGE_BADPATCH; + nPValue = jsonbPayloadSize(pPatch, iPValue, &szPValue); + if( nPValue==0 ) return JSON_MERGE_BADPATCH; + iPCursor = iPValue + nPValue + szPValue; + if( iPCursor>iPEnd ) return JSON_MERGE_BADPATCH; + + iTCursor = iTStart; + iTEnd = iTEndBE + pTarget->delta; + while( iTCursoraBlob[iTCursor] & 0x0f; + if( eTLabelJSONB_TEXTRAW ){ + return JSON_MERGE_BADTARGET; + } + nTLabel = jsonbPayloadSize(pTarget, iTCursor, &szTLabel); + if( nTLabel==0 ) return JSON_MERGE_BADTARGET; + iTValue = iTLabel + nTLabel + szTLabel; + if( iTValue>=iTEnd ) return JSON_MERGE_BADTARGET; + nTValue = jsonbPayloadSize(pTarget, iTValue, &szTValue); + if( nTValue==0 ) return JSON_MERGE_BADTARGET; + if( iTValue + nTValue + szTValue > iTEnd ) return JSON_MERGE_BADTARGET; + isEqual = jsonLabelCompare( + (const char*)&pPatch->aBlob[iPLabel+nPLabel], + szPLabel, + (ePLabel==JSONB_TEXT || ePLabel==JSONB_TEXTRAW), + (const char*)&pTarget->aBlob[iTLabel+nTLabel], + szTLabel, + (eTLabel==JSONB_TEXT || eTLabel==JSONB_TEXTRAW)); + if( isEqual ) break; + iTCursor = iTValue + nTValue + szTValue; + } + x = pPatch->aBlob[iPValue] & 0x0f; + if( iTCursoroom) ) return JSON_MERGE_OOM; + }else{ + /* Algorithm line 12 */ + int rc, savedDelta = pTarget->delta; + pTarget->delta = 0; + rc = jsonMergePatch(pTarget, iTValue, pPatch, iPValue); + if( rc ) return rc; + pTarget->delta += savedDelta; + } + }else if( x>0 ){ /* Algorithm line 13 */ + /* No match and patch value is not NULL */ + u32 szNew = szPLabel+nPLabel; + if( (pPatch->aBlob[iPValue] & 0x0f)!=JSONB_OBJECT ){ /* Line 14 */ + jsonBlobEdit(pTarget, iTEnd, 0, 0, szPValue+nPValue+szNew); + if( pTarget->oom ) return JSON_MERGE_OOM; + memcpy(&pTarget->aBlob[iTEnd], &pPatch->aBlob[iPLabel], szNew); + memcpy(&pTarget->aBlob[iTEnd+szNew], + &pPatch->aBlob[iPValue], szPValue+nPValue); + }else{ + int rc, savedDelta; + jsonBlobEdit(pTarget, iTEnd, 0, 0, szNew+1); + if( pTarget->oom ) return JSON_MERGE_OOM; + memcpy(&pTarget->aBlob[iTEnd], &pPatch->aBlob[iPLabel], szNew); + pTarget->aBlob[iTEnd+szNew] = 0x00; + savedDelta = pTarget->delta; + pTarget->delta = 0; + rc = jsonMergePatch(pTarget, iTEnd+szNew,pPatch,iPValue); + if( rc ) return rc; + pTarget->delta += savedDelta; } } - if( j>=pTarget->n && pPatch[i+1].eType!=JSON_NULL ){ - int iStart, iPatch; - iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0); - jsonParseAddNode(pParse, JSON_STRING, nKey, zKey); - iPatch = jsonParseAddNode(pParse, JSON_TRUE, 0, 0); - if( pParse->oom ) return 0; - jsonRemoveAllNulls(pPatch); - pTarget = &pParse->aNode[iTarget]; - assert( pParse->aNode[iRoot].eU==0 || pParse->aNode[iRoot].eU==2 ); - testcase( pParse->aNode[iRoot].eU==2 ); - pParse->aNode[iRoot].jnFlags |= JNODE_APPEND; - VVA( pParse->aNode[iRoot].eU = 2 ); - pParse->aNode[iRoot].u.iAppend = iStart - iRoot; - iRoot = iStart; - assert( pParse->aNode[iPatch].eU==0 ); - VVA( pParse->aNode[iPatch].eU = 5 ); - pParse->aNode[iPatch].jnFlags |= JNODE_PATCH; - pParse->aNode[iPatch].u.pPatch = &pPatch[i+1]; - } } - return pTarget; + if( pTarget->delta ) jsonAfterEditSizeAdjust(pTarget, iTarget); + return pTarget->oom ? JSON_MERGE_OOM : JSON_MERGE_OK; } + /* ** Implementation of the json_mergepatch(JSON1,JSON2) function. Return a JSON ** object that is the result of running the RFC 7396 MergePatch() algorithm @@ -200508,25 +210328,27 @@ static void jsonPatchFunc( int argc, sqlite3_value **argv ){ - JsonParse x; /* The JSON that is being patched */ - JsonParse y; /* The patch */ - JsonNode *pResult; /* The result of the merge */ + JsonParse *pTarget; /* The TARGET */ + JsonParse *pPatch; /* The PATCH */ + int rc; /* Result code */ UNUSED_PARAMETER(argc); - if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; - if( jsonParse(&y, ctx, (const char*)sqlite3_value_text(argv[1])) ){ - jsonParseReset(&x); - return; - } - pResult = jsonMergePatch(&x, 0, y.aNode); - assert( pResult!=0 || x.oom ); - if( pResult ){ - jsonReturnJson(pResult, ctx, 0); - }else{ - sqlite3_result_error_nomem(ctx); + assert( argc==2 ); + pTarget = jsonParseFuncArg(ctx, argv[0], JSON_EDITABLE); + if( pTarget==0 ) return; + pPatch = jsonParseFuncArg(ctx, argv[1], 0); + if( pPatch ){ + rc = jsonMergePatch(pTarget, 0, pPatch, 0); + if( rc==JSON_MERGE_OK ){ + jsonReturnParse(ctx, pTarget); + }else if( rc==JSON_MERGE_OOM ){ + sqlite3_result_error_nomem(ctx); + }else{ + sqlite3_result_error(ctx, "malformed JSON", -1); + } + jsonParseFree(pPatch); } - jsonParseReset(&x); - jsonParseReset(&y); + jsonParseFree(pTarget); } @@ -200550,23 +210372,23 @@ static void jsonObjectFunc( "of arguments", -1); return; } - jsonInit(&jx, ctx); + jsonStringInit(&jx, ctx); jsonAppendChar(&jx, '{'); for(i=0; i1 ? JSON_EDITABLE : 0); + if( p==0 ) return; + for(i=1; ijnFlags |= JNODE_REMOVE; - } - if( (x.aNode[0].jnFlags & JNODE_REMOVE)==0 ){ - jsonReturnJson(x.aNode, ctx, 0); + if( zPath==0 ){ + goto json_remove_done; + } + if( zPath[0]!='$' ){ + goto json_remove_patherror; + } + if( zPath[1]==0 ){ + /* json_remove(j,'$') returns NULL */ + goto json_remove_done; + } + p->eEdit = JEDIT_DEL; + p->delta = 0; + rc = jsonLookupStep(p, 0, zPath+1, 0); + if( JSON_LOOKUP_ISERROR(rc) ){ + if( rc==JSON_LOOKUP_NOTFOUND ){ + continue; /* No-op */ + }else if( rc==JSON_LOOKUP_PATHERROR ){ + jsonBadPathError(ctx, zPath); + }else{ + sqlite3_result_error(ctx, "malformed JSON", -1); + } + goto json_remove_done; + } } -remove_done: - jsonParseReset(&x); + jsonReturnParse(ctx, p); + jsonParseFree(p); + return; + +json_remove_patherror: + jsonBadPathError(ctx, zPath); + +json_remove_done: + jsonParseFree(p); + return; } /* @@ -200615,38 +210461,12 @@ static void jsonReplaceFunc( int argc, sqlite3_value **argv ){ - JsonParse x; /* The parse */ - JsonNode *pNode; - const char *zPath; - u32 i; - if( argc<1 ) return; if( (argc&1)==0 ) { jsonWrongNumArgs(ctx, "replace"); return; } - if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; - assert( x.nNode ); - for(i=1; i<(u32)argc; i+=2){ - zPath = (const char*)sqlite3_value_text(argv[i]); - pNode = jsonLookup(&x, zPath, 0, ctx); - if( x.nErr ) goto replace_err; - if( pNode ){ - assert( pNode->eU==0 || pNode->eU==1 || pNode->eU==4 ); - testcase( pNode->eU!=0 && pNode->eU!=1 ); - pNode->jnFlags |= (u8)JNODE_REPLACE; - VVA( pNode->eU = 4 ); - pNode->u.iReplace = i + 1; - } - } - if( x.aNode[0].jnFlags & JNODE_REPLACE ){ - assert( x.aNode[0].eU==4 ); - sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]); - }else{ - jsonReturnJson(x.aNode, ctx, argv); - } -replace_err: - jsonParseReset(&x); + jsonInsertIntoBlob(ctx, argc, argv, JEDIT_REPL); } @@ -200667,45 +210487,16 @@ static void jsonSetFunc( int argc, sqlite3_value **argv ){ - JsonParse x; /* The parse */ - JsonNode *pNode; - const char *zPath; - u32 i; - int bApnd; - int bIsSet = sqlite3_user_data(ctx)!=0; + + int flags = SQLITE_PTR_TO_INT(sqlite3_user_data(ctx)); + int bIsSet = (flags&JSON_ISSET)!=0; if( argc<1 ) return; if( (argc&1)==0 ) { jsonWrongNumArgs(ctx, bIsSet ? "set" : "insert"); return; } - if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; - assert( x.nNode ); - for(i=1; i<(u32)argc; i+=2){ - zPath = (const char*)sqlite3_value_text(argv[i]); - bApnd = 0; - pNode = jsonLookup(&x, zPath, &bApnd, ctx); - if( x.oom ){ - sqlite3_result_error_nomem(ctx); - goto jsonSetDone; - }else if( x.nErr ){ - goto jsonSetDone; - }else if( pNode && (bApnd || bIsSet) ){ - testcase( pNode->eU!=0 && pNode->eU!=1 ); - assert( pNode->eU!=3 && pNode->eU!=5 ); - VVA( pNode->eU = 4 ); - pNode->jnFlags |= (u8)JNODE_REPLACE; - pNode->u.iReplace = i + 1; - } - } - if( x.aNode[0].jnFlags & JNODE_REPLACE ){ - assert( x.aNode[0].eU==4 ); - sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]); - }else{ - jsonReturnJson(x.aNode, ctx, argv); - } -jsonSetDone: - jsonParseReset(&x); + jsonInsertIntoBlob(ctx, argc, argv, bIsSet ? JEDIT_SET : JEDIT_INS); } /* @@ -200721,27 +210512,127 @@ static void jsonTypeFunc( sqlite3_value **argv ){ JsonParse *p; /* The parse */ - const char *zPath; - JsonNode *pNode; + const char *zPath = 0; + u32 i; - p = jsonParseCached(ctx, argv, ctx); + p = jsonParseFuncArg(ctx, argv[0], 0); if( p==0 ) return; if( argc==2 ){ zPath = (const char*)sqlite3_value_text(argv[1]); - pNode = jsonLookup(p, zPath, 0, ctx); + if( zPath==0 ) goto json_type_done; + if( zPath[0]!='$' ){ + jsonBadPathError(ctx, zPath); + goto json_type_done; + } + i = jsonLookupStep(p, 0, zPath+1, 0); + if( JSON_LOOKUP_ISERROR(i) ){ + if( i==JSON_LOOKUP_NOTFOUND ){ + /* no-op */ + }else if( i==JSON_LOOKUP_PATHERROR ){ + jsonBadPathError(ctx, zPath); + }else{ + sqlite3_result_error(ctx, "malformed JSON", -1); + } + goto json_type_done; + } }else{ - pNode = p->aNode; + i = 0; } - if( pNode ){ - sqlite3_result_text(ctx, jsonType[pNode->eType], -1, SQLITE_STATIC); + sqlite3_result_text(ctx, jsonbType[p->aBlob[i]&0x0f], -1, SQLITE_STATIC); +json_type_done: + jsonParseFree(p); +} + +/* +** json_pretty(JSON) +** json_pretty(JSON, INDENT) +** +** Return text that is a pretty-printed rendering of the input JSON. +** If the argument is not valid JSON, return NULL. +** +** The INDENT argument is text that is used for indentation. If omitted, +** it defaults to four spaces (the same as PostgreSQL). +*/ +static void jsonPrettyFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonString s; /* The output string */ + JsonPretty x; /* Pretty printing context */ + + memset(&x, 0, sizeof(x)); + x.pParse = jsonParseFuncArg(ctx, argv[0], 0); + if( x.pParse==0 ) return; + x.pOut = &s; + jsonStringInit(&s, ctx); + if( argc==1 || (x.zIndent = (const char*)sqlite3_value_text(argv[1]))==0 ){ + x.zIndent = " "; + x.szIndent = 4; + }else{ + x.szIndent = (u32)strlen(x.zIndent); } + jsonTranslateBlobToPrettyText(&x, 0); + jsonReturnString(&s, 0, 0); + jsonParseFree(x.pParse); } /* ** json_valid(JSON) -** -** Return 1 if JSON is a well-formed JSON string according to RFC-7159. -** Return 0 otherwise. +** json_valid(JSON, FLAGS) +** +** Check the JSON argument to see if it is well-formed. The FLAGS argument +** encodes the various constraints on what is meant by "well-formed": +** +** 0x01 Canonical RFC-8259 JSON text +** 0x02 JSON text with optional JSON-5 extensions +** 0x04 Superficially appears to be JSONB +** 0x08 Strictly well-formed JSONB +** +** If the FLAGS argument is omitted, it defaults to 1. Useful values for +** FLAGS include: +** +** 1 Strict canonical JSON text +** 2 JSON text perhaps with JSON-5 extensions +** 4 Superficially appears to be JSONB +** 5 Canonical JSON text or superficial JSONB +** 6 JSON-5 text or superficial JSONB +** 8 Strict JSONB +** 9 Canonical JSON text or strict JSONB +** 10 JSON-5 text or strict JSONB +** +** Other flag combinations are redundant. For example, every canonical +** JSON text is also well-formed JSON-5 text, so FLAG values 2 and 3 +** are the same. Similarly, any input that passes a strict JSONB validation +** will also pass the superficial validation so 12 through 15 are the same +** as 8 through 11 respectively. +** +** This routine runs in linear time to validate text and when doing strict +** JSONB validation. Superficial JSONB validation is constant time, +** assuming the BLOB is already in memory. The performance advantage +** of superficial JSONB validation is why that option is provided. +** Application developers can choose to do fast superficial validation or +** slower strict validation, according to their specific needs. +** +** Only the lower four bits of the FLAGS argument are currently used. +** Higher bits are reserved for future expansion. To facilitate +** compatibility, the current implementation raises an error if any bit +** in FLAGS is set other than the lower four bits. +** +** The original circa 2015 implementation of the JSON routines in +** SQLite only supported canonical RFC-8259 JSON text and the json_valid() +** function only accepted one argument. That is why the default value +** for the FLAGS argument is 1, since FLAGS=1 causes this routine to only +** recognize canonical RFC-8259 JSON text as valid. The extra FLAGS +** argument was added when the JSON routines were extended to support +** JSON5-like extensions and binary JSONB stored in BLOBs. +** +** Return Values: +** +** * Raise an error if FLAGS is outside the range of 1 to 15. +** * Return NULL if the input is NULL +** * Return 1 if the input is well-formed. +** * Return 0 if the input is not well-formed. */ static void jsonValidFunc( sqlite3_context *ctx, @@ -200749,11 +210640,127 @@ static void jsonValidFunc( sqlite3_value **argv ){ JsonParse *p; /* The parse */ - UNUSED_PARAMETER(argc); - p = jsonParseCached(ctx, argv, 0); - sqlite3_result_int(ctx, p!=0); + u8 flags = 1; + u8 res = 0; + if( argc==2 ){ + i64 f = sqlite3_value_int64(argv[1]); + if( f<1 || f>15 ){ + sqlite3_result_error(ctx, "FLAGS parameter to json_valid() must be" + " between 1 and 15", -1); + return; + } + flags = f & 0x0f; + } + switch( sqlite3_value_type(argv[0]) ){ + case SQLITE_NULL: { +#ifdef SQLITE_LEGACY_JSON_VALID + /* Incorrect legacy behavior was to return FALSE for a NULL input */ + sqlite3_result_int(ctx, 0); +#endif + return; + } + case SQLITE_BLOB: { + if( jsonFuncArgMightBeBinary(argv[0]) ){ + if( flags & 0x04 ){ + /* Superficial checking only - accomplished by the + ** jsonFuncArgMightBeBinary() call above. */ + res = 1; + }else if( flags & 0x08 ){ + /* Strict checking. Check by translating BLOB->TEXT->BLOB. If + ** no errors occur, call that a "strict check". */ + JsonParse px; + u32 iErr; + memset(&px, 0, sizeof(px)); + px.aBlob = (u8*)sqlite3_value_blob(argv[0]); + px.nBlob = sqlite3_value_bytes(argv[0]); + iErr = jsonbValidityCheck(&px, 0, px.nBlob, 1); + res = iErr==0; + } + break; + } + /* Fall through into interpreting the input as text. See note + ** above at tag-20240123-a. */ + /* no break */ deliberate_fall_through + } + default: { + JsonParse px; + if( (flags & 0x3)==0 ) break; + memset(&px, 0, sizeof(px)); + + p = jsonParseFuncArg(ctx, argv[0], JSON_KEEPERROR); + if( p ){ + if( p->oom ){ + sqlite3_result_error_nomem(ctx); + }else if( p->nErr ){ + /* no-op */ + }else if( (flags & 0x02)!=0 || p->hasNonstd==0 ){ + res = 1; + } + jsonParseFree(p); + }else{ + sqlite3_result_error_nomem(ctx); + } + break; + } + } + sqlite3_result_int(ctx, res); } +/* +** json_error_position(JSON) +** +** If the argument is NULL, return NULL +** +** If the argument is BLOB, do a full validity check and return non-zero +** if the check fails. The return value is the approximate 1-based offset +** to the byte of the element that contains the first error. +** +** Otherwise interpret the argument is TEXT (even if it is numeric) and +** return the 1-based character position for where the parser first recognized +** that the input was not valid JSON, or return 0 if the input text looks +** ok. JSON-5 extensions are accepted. +*/ +static void jsonErrorFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + i64 iErrPos = 0; /* Error position to be returned */ + JsonParse s; + + assert( argc==1 ); + UNUSED_PARAMETER(argc); + memset(&s, 0, sizeof(s)); + s.db = sqlite3_context_db_handle(ctx); + if( jsonFuncArgMightBeBinary(argv[0]) ){ + s.aBlob = (u8*)sqlite3_value_blob(argv[0]); + s.nBlob = sqlite3_value_bytes(argv[0]); + iErrPos = (i64)jsonbValidityCheck(&s, 0, s.nBlob, 1); + }else{ + s.zJson = (char*)sqlite3_value_text(argv[0]); + if( s.zJson==0 ) return; /* NULL input or OOM */ + s.nJson = sqlite3_value_bytes(argv[0]); + if( jsonConvertTextToBlob(&s,0) ){ + if( s.oom ){ + iErrPos = -1; + }else{ + /* Convert byte-offset s.iErr into a character offset */ + u32 k; + assert( s.zJson!=0 ); /* Because s.oom is false */ + for(k=0; kzBuf==0 ){ - jsonInit(pStr, ctx); + jsonStringInit(pStr, ctx); jsonAppendChar(pStr, '['); }else if( pStr->nUsed>1 ){ jsonAppendChar(pStr, ','); } pStr->pCtx = ctx; - jsonAppendValue(pStr, argv[0]); + jsonAppendSqlValue(pStr, argv[0]); } } static void jsonArrayCompute(sqlite3_context *ctx, int isFinal){ JsonString *pStr; pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); if( pStr ){ + int flags; pStr->pCtx = ctx; jsonAppendChar(pStr, ']'); - if( pStr->bErr ){ - if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx); - assert( pStr->bStatic ); + flags = SQLITE_PTR_TO_INT(sqlite3_user_data(ctx)); + if( pStr->eErr ){ + jsonReturnString(pStr, 0, 0); + return; + }else if( flags & JSON_BLOB ){ + jsonReturnStringAsBlob(pStr); + if( isFinal ){ + if( !pStr->bStatic ) sqlite3RCStrUnref(pStr->zBuf); + }else{ + jsonStringTrimOneChar(pStr); + } + return; }else if( isFinal ){ sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, - pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free); + pStr->bStatic ? SQLITE_TRANSIENT : + sqlite3RCStrUnref); pStr->bStatic = 1; }else{ sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT); - pStr->nUsed--; + jsonStringTrimOneChar(pStr); } }else{ sqlite3_result_text(ctx, "[]", 2, SQLITE_STATIC); @@ -200834,7 +210852,7 @@ static void jsonGroupInverse( pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); #ifdef NEVER /* pStr is always non-NULL since jsonArrayStep() or jsonObjectStep() will - ** always have been called to initalize it */ + ** always have been called to initialize it */ if( NEVER(!pStr) ) return; #endif z = pStr->zBuf; @@ -200878,34 +210896,46 @@ static void jsonObjectStep( pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr)); if( pStr ){ if( pStr->zBuf==0 ){ - jsonInit(pStr, ctx); + jsonStringInit(pStr, ctx); jsonAppendChar(pStr, '{'); }else if( pStr->nUsed>1 ){ jsonAppendChar(pStr, ','); } pStr->pCtx = ctx; z = (const char*)sqlite3_value_text(argv[0]); - n = (u32)sqlite3_value_bytes(argv[0]); + n = sqlite3Strlen30(z); jsonAppendString(pStr, z, n); jsonAppendChar(pStr, ':'); - jsonAppendValue(pStr, argv[1]); + jsonAppendSqlValue(pStr, argv[1]); } } static void jsonObjectCompute(sqlite3_context *ctx, int isFinal){ JsonString *pStr; pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); if( pStr ){ + int flags; jsonAppendChar(pStr, '}'); - if( pStr->bErr ){ - if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx); - assert( pStr->bStatic ); + pStr->pCtx = ctx; + flags = SQLITE_PTR_TO_INT(sqlite3_user_data(ctx)); + if( pStr->eErr ){ + jsonReturnString(pStr, 0, 0); + return; + }else if( flags & JSON_BLOB ){ + jsonReturnStringAsBlob(pStr); + if( isFinal ){ + if( !pStr->bStatic ) sqlite3RCStrUnref(pStr->zBuf); + }else{ + jsonStringTrimOneChar(pStr); + } + return; }else if( isFinal ){ sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, - pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free); + pStr->bStatic ? SQLITE_TRANSIENT : + sqlite3RCStrUnref); pStr->bStatic = 1; }else{ sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT); - pStr->nUsed--; + jsonStringTrimOneChar(pStr); } }else{ sqlite3_result_text(ctx, "{}", 2, SQLITE_STATIC); @@ -200925,19 +210955,37 @@ static void jsonObjectFinal(sqlite3_context *ctx){ /**************************************************************************** ** The json_each virtual table ****************************************************************************/ +typedef struct JsonParent JsonParent; +struct JsonParent { + u32 iHead; /* Start of object or array */ + u32 iValue; /* Start of the value */ + u32 iEnd; /* First byte past the end */ + u32 nPath; /* Length of path */ + i64 iKey; /* Key for JSONB_ARRAY */ +}; + typedef struct JsonEachCursor JsonEachCursor; struct JsonEachCursor { sqlite3_vtab_cursor base; /* Base class - must be first */ u32 iRowid; /* The rowid */ - u32 iBegin; /* The first node of the scan */ - u32 i; /* Index in sParse.aNode[] of current row */ + u32 i; /* Index in sParse.aBlob[] of current row */ u32 iEnd; /* EOF when i equals or exceeds this value */ - u8 eType; /* Type of top-level element */ + u32 nRoot; /* Size of the root path in bytes */ + u8 eType; /* Type of the container for element i */ u8 bRecursive; /* True for json_tree(). False for json_each() */ - char *zJson; /* Input JSON */ - char *zRoot; /* Path by which to filter zJson */ + u32 nParent; /* Current nesting depth */ + u32 nParentAlloc; /* Space allocated for aParent[] */ + JsonParent *aParent; /* Parent elements of i */ + sqlite3 *db; /* Database connection */ + JsonString path; /* Current path */ JsonParse sParse; /* Parse of the input JSON */ }; +typedef struct JsonEachConnection JsonEachConnection; +struct JsonEachConnection { + sqlite3_vtab base; /* Base class - must be first */ + sqlite3 *db; /* Database connection */ +}; + /* Constructor for the json_each virtual table */ static int jsonEachConnect( @@ -200947,7 +210995,7 @@ static int jsonEachConnect( sqlite3_vtab **ppVtab, char **pzErr ){ - sqlite3_vtab *pNew; + JsonEachConnection *pNew; int rc; /* Column numbers */ @@ -200973,28 +211021,32 @@ static int jsonEachConnect( "CREATE TABLE x(key,value,type,atom,id,parent,fullkey,path," "json HIDDEN,root HIDDEN)"); if( rc==SQLITE_OK ){ - pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) ); + pNew = (JsonEachConnection*)sqlite3DbMallocZero(db, sizeof(*pNew)); + *ppVtab = (sqlite3_vtab*)pNew; if( pNew==0 ) return SQLITE_NOMEM; - memset(pNew, 0, sizeof(*pNew)); sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS); + pNew->db = db; } return rc; } /* destructor for json_each virtual table */ static int jsonEachDisconnect(sqlite3_vtab *pVtab){ - sqlite3_free(pVtab); + JsonEachConnection *p = (JsonEachConnection*)pVtab; + sqlite3DbFree(p->db, pVtab); return SQLITE_OK; } /* constructor for a JsonEachCursor object for json_each(). */ static int jsonEachOpenEach(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + JsonEachConnection *pVtab = (JsonEachConnection*)p; JsonEachCursor *pCur; UNUSED_PARAMETER(p); - pCur = sqlite3_malloc( sizeof(*pCur) ); + pCur = sqlite3DbMallocZero(pVtab->db, sizeof(*pCur)); if( pCur==0 ) return SQLITE_NOMEM; - memset(pCur, 0, sizeof(*pCur)); + pCur->db = pVtab->db; + jsonStringZero(&pCur->path); *ppCursor = &pCur->base; return SQLITE_OK; } @@ -201012,22 +211064,24 @@ static int jsonEachOpenTree(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ /* Reset a JsonEachCursor back to its original state. Free any memory ** held. */ static void jsonEachCursorReset(JsonEachCursor *p){ - sqlite3_free(p->zJson); - sqlite3_free(p->zRoot); jsonParseReset(&p->sParse); + jsonStringReset(&p->path); + sqlite3DbFree(p->db, p->aParent); p->iRowid = 0; p->i = 0; + p->aParent = 0; + p->nParent = 0; + p->nParentAlloc = 0; p->iEnd = 0; p->eType = 0; - p->zJson = 0; - p->zRoot = 0; } /* Destructor for a jsonEachCursor object */ static int jsonEachClose(sqlite3_vtab_cursor *cur){ JsonEachCursor *p = (JsonEachCursor*)cur; jsonEachCursorReset(p); - sqlite3_free(cur); + + sqlite3DbFree(p->db, cur); return SQLITE_OK; } @@ -201038,198 +211092,233 @@ static int jsonEachEof(sqlite3_vtab_cursor *cur){ return p->i >= p->iEnd; } -/* Advance the cursor to the next element for json_tree() */ -static int jsonEachNext(sqlite3_vtab_cursor *cur){ - JsonEachCursor *p = (JsonEachCursor*)cur; - if( p->bRecursive ){ - if( p->sParse.aNode[p->i].jnFlags & JNODE_LABEL ) p->i++; - p->i++; - p->iRowid++; - if( p->iiEnd ){ - u32 iUp = p->sParse.aUp[p->i]; - JsonNode *pUp = &p->sParse.aNode[iUp]; - p->eType = pUp->eType; - if( pUp->eType==JSON_ARRAY ){ - assert( pUp->eU==0 || pUp->eU==3 ); - testcase( pUp->eU==3 ); - VVA( pUp->eU = 3 ); - if( iUp==p->i-1 ){ - pUp->u.iKey = 0; - }else{ - pUp->u.iKey++; +/* +** If the cursor is currently pointing at the label of a object entry, +** then return the index of the value. For all other cases, return the +** current pointer position, which is the value. +*/ +static int jsonSkipLabel(JsonEachCursor *p){ + if( p->eType==JSONB_OBJECT ){ + u32 sz = 0; + u32 n = jsonbPayloadSize(&p->sParse, p->i, &sz); + return p->i + n + sz; + }else{ + return p->i; + } +} + +/* +** Append the path name for the current element. +*/ +static void jsonAppendPathName(JsonEachCursor *p){ + assert( p->nParent>0 ); + assert( p->eType==JSONB_ARRAY || p->eType==JSONB_OBJECT ); + if( p->eType==JSONB_ARRAY ){ + jsonPrintf(30, &p->path, "[%lld]", p->aParent[p->nParent-1].iKey); + }else{ + u32 n, sz = 0, k, i; + const char *z; + int needQuote = 0; + n = jsonbPayloadSize(&p->sParse, p->i, &sz); + k = p->i + n; + z = (const char*)&p->sParse.aBlob[k]; + if( sz==0 || !sqlite3Isalpha(z[0]) ){ + needQuote = 1; + }else{ + for(i=0; ieType ){ - case JSON_ARRAY: { - p->i += jsonNodeSize(&p->sParse.aNode[p->i]); - p->iRowid++; - break; - } - case JSON_OBJECT: { - p->i += 1 + jsonNodeSize(&p->sParse.aNode[p->i+1]); - p->iRowid++; - break; - } - default: { - p->i = p->iEnd; - break; - } + if( needQuote ){ + jsonPrintf(sz+4,&p->path,".\"%.*s\"", sz, z); + }else{ + jsonPrintf(sz+2,&p->path,".%.*s", sz, z); } } - return SQLITE_OK; } -/* Append an object label to the JSON Path being constructed -** in pStr. -*/ -static void jsonAppendObjectPathElement( - JsonString *pStr, - JsonNode *pNode -){ - int jj, nn; - const char *z; - assert( pNode->eType==JSON_STRING ); - assert( pNode->jnFlags & JNODE_LABEL ); - assert( pNode->eU==1 ); - z = pNode->u.zJContent; - nn = pNode->n; - assert( nn>=2 ); - assert( z[0]=='"' ); - assert( z[nn-1]=='"' ); - if( nn>2 && sqlite3Isalpha(z[1]) ){ - for(jj=2; jjbRecursive ){ + u8 x; + u8 levelChange = 0; + u32 n, sz = 0; + u32 i = jsonSkipLabel(p); + x = p->sParse.aBlob[i] & 0x0f; + n = jsonbPayloadSize(&p->sParse, i, &sz); + if( x==JSONB_OBJECT || x==JSONB_ARRAY ){ + JsonParent *pParent; + if( p->nParent>=p->nParentAlloc ){ + JsonParent *pNew; + u64 nNew; + nNew = p->nParentAlloc*2 + 3; + pNew = sqlite3DbRealloc(p->db, p->aParent, sizeof(JsonParent)*nNew); + if( pNew==0 ) return SQLITE_NOMEM; + p->nParentAlloc = (u32)nNew; + p->aParent = pNew; + } + levelChange = 1; + pParent = &p->aParent[p->nParent]; + pParent->iHead = p->i; + pParent->iValue = i; + pParent->iEnd = i + n + sz; + pParent->iKey = -1; + pParent->nPath = (u32)p->path.nUsed; + if( p->eType && p->nParent ){ + jsonAppendPathName(p); + if( p->path.eErr ) rc = SQLITE_NOMEM; + } + p->nParent++; + p->i = i + n; + }else{ + p->i = i + n + sz; + } + while( p->nParent>0 && p->i >= p->aParent[p->nParent-1].iEnd ){ + p->nParent--; + p->path.nUsed = p->aParent[p->nParent].nPath; + levelChange = 1; + } + if( levelChange ){ + if( p->nParent>0 ){ + JsonParent *pParent = &p->aParent[p->nParent-1]; + u32 iVal = pParent->iValue; + p->eType = p->sParse.aBlob[iVal] & 0x0f; + }else{ + p->eType = 0; + } } + }else{ + u32 n, sz = 0; + u32 i = jsonSkipLabel(p); + n = jsonbPayloadSize(&p->sParse, i, &sz); + p->i = i + n + sz; + } + if( p->eType==JSONB_ARRAY && p->nParent ){ + p->aParent[p->nParent-1].iKey++; } - jsonPrintf(nn+2, pStr, ".%.*s", nn, z); + p->iRowid++; + return rc; } -/* Append the name of the path for element i to pStr +/* Length of the path for rowid==0 in bRecursive mode. */ -static void jsonEachComputePath( - JsonEachCursor *p, /* The cursor */ - JsonString *pStr, /* Write the path here */ - u32 i /* Path to this element */ -){ - JsonNode *pNode, *pUp; - u32 iUp; - if( i==0 ){ - jsonAppendChar(pStr, '$'); - return; - } - iUp = p->sParse.aUp[i]; - jsonEachComputePath(p, pStr, iUp); - pNode = &p->sParse.aNode[i]; - pUp = &p->sParse.aNode[iUp]; - if( pUp->eType==JSON_ARRAY ){ - assert( pUp->eU==3 || (pUp->eU==0 && pUp->u.iKey==0) ); - testcase( pUp->eU==0 ); - jsonPrintf(30, pStr, "[%d]", pUp->u.iKey); - }else{ - assert( pUp->eType==JSON_OBJECT ); - if( (pNode->jnFlags & JNODE_LABEL)==0 ) pNode--; - jsonAppendObjectPathElement(pStr, pNode); +static int jsonEachPathLength(JsonEachCursor *p){ + u32 n = p->path.nUsed; + char *z = p->path.zBuf; + if( p->iRowid==0 && p->bRecursive && n>=2 ){ + while( n>1 ){ + n--; + if( z[n]=='[' || z[n]=='.' ){ + u32 x, sz = 0; + char cSaved = z[n]; + z[n] = 0; + assert( p->sParse.eEdit==0 ); + x = jsonLookupStep(&p->sParse, 0, z+1, 0); + z[n] = cSaved; + if( JSON_LOOKUP_ISERROR(x) ) continue; + if( x + jsonbPayloadSize(&p->sParse, x, &sz) == p->i ) break; + } + } } + return n; } /* Return the value of a column */ static int jsonEachColumn( sqlite3_vtab_cursor *cur, /* The cursor */ sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ - int i /* Which column to return */ + int iColumn /* Which column to return */ ){ JsonEachCursor *p = (JsonEachCursor*)cur; - JsonNode *pThis = &p->sParse.aNode[p->i]; - switch( i ){ + switch( iColumn ){ case JEACH_KEY: { - if( p->i==0 ) break; - if( p->eType==JSON_OBJECT ){ - jsonReturn(pThis, ctx, 0); - }else if( p->eType==JSON_ARRAY ){ - u32 iKey; - if( p->bRecursive ){ - if( p->iRowid==0 ) break; - assert( p->sParse.aNode[p->sParse.aUp[p->i]].eU==3 ); - iKey = p->sParse.aNode[p->sParse.aUp[p->i]].u.iKey; + if( p->nParent==0 ){ + u32 n, j; + if( p->nRoot==1 ) break; + j = jsonEachPathLength(p); + n = p->nRoot - j; + if( n==0 ){ + break; + }else if( p->path.zBuf[j]=='[' ){ + i64 x; + sqlite3Atoi64(&p->path.zBuf[j+1], &x, n-1, SQLITE_UTF8); + sqlite3_result_int64(ctx, x); + }else if( p->path.zBuf[j+1]=='"' ){ + sqlite3_result_text(ctx, &p->path.zBuf[j+2], n-3, SQLITE_TRANSIENT); }else{ - iKey = p->iRowid; + sqlite3_result_text(ctx, &p->path.zBuf[j+1], n-1, SQLITE_TRANSIENT); } - sqlite3_result_int64(ctx, (sqlite3_int64)iKey); + break; + } + if( p->eType==JSONB_OBJECT ){ + jsonReturnFromBlob(&p->sParse, p->i, ctx, 1); + }else{ + assert( p->eType==JSONB_ARRAY ); + sqlite3_result_int64(ctx, p->aParent[p->nParent-1].iKey); } break; } case JEACH_VALUE: { - if( pThis->jnFlags & JNODE_LABEL ) pThis++; - jsonReturn(pThis, ctx, 0); + u32 i = jsonSkipLabel(p); + jsonReturnFromBlob(&p->sParse, i, ctx, 1); + if( (p->sParse.aBlob[i] & 0x0f)>=JSONB_ARRAY ){ + sqlite3_result_subtype(ctx, JSON_SUBTYPE); + } break; } case JEACH_TYPE: { - if( pThis->jnFlags & JNODE_LABEL ) pThis++; - sqlite3_result_text(ctx, jsonType[pThis->eType], -1, SQLITE_STATIC); + u32 i = jsonSkipLabel(p); + u8 eType = p->sParse.aBlob[i] & 0x0f; + sqlite3_result_text(ctx, jsonbType[eType], -1, SQLITE_STATIC); break; } case JEACH_ATOM: { - if( pThis->jnFlags & JNODE_LABEL ) pThis++; - if( pThis->eType>=JSON_ARRAY ) break; - jsonReturn(pThis, ctx, 0); + u32 i = jsonSkipLabel(p); + if( (p->sParse.aBlob[i] & 0x0f)sParse, i, ctx, 1); + } break; } case JEACH_ID: { - sqlite3_result_int64(ctx, - (sqlite3_int64)p->i + ((pThis->jnFlags & JNODE_LABEL)!=0)); + sqlite3_result_int64(ctx, (sqlite3_int64)p->i); break; } case JEACH_PARENT: { - if( p->i>p->iBegin && p->bRecursive ){ - sqlite3_result_int64(ctx, (sqlite3_int64)p->sParse.aUp[p->i]); + if( p->nParent>0 && p->bRecursive ){ + sqlite3_result_int64(ctx, p->aParent[p->nParent-1].iHead); } break; } case JEACH_FULLKEY: { - JsonString x; - jsonInit(&x, ctx); - if( p->bRecursive ){ - jsonEachComputePath(p, &x, p->i); - }else{ - if( p->zRoot ){ - jsonAppendRaw(&x, p->zRoot, (int)strlen(p->zRoot)); - }else{ - jsonAppendChar(&x, '$'); - } - if( p->eType==JSON_ARRAY ){ - jsonPrintf(30, &x, "[%d]", p->iRowid); - }else if( p->eType==JSON_OBJECT ){ - jsonAppendObjectPathElement(&x, pThis); - } - } - jsonResult(&x); + u64 nBase = p->path.nUsed; + if( p->nParent ) jsonAppendPathName(p); + sqlite3_result_text64(ctx, p->path.zBuf, p->path.nUsed, + SQLITE_TRANSIENT, SQLITE_UTF8); + p->path.nUsed = nBase; break; } case JEACH_PATH: { - if( p->bRecursive ){ - JsonString x; - jsonInit(&x, ctx); - jsonEachComputePath(p, &x, p->sParse.aUp[p->i]); - jsonResult(&x); - break; - } - /* For json_each() path and root are the same so fall through - ** into the root case */ - /* no break */ deliberate_fall_through + u32 n = jsonEachPathLength(p); + sqlite3_result_text64(ctx, p->path.zBuf, n, + SQLITE_TRANSIENT, SQLITE_UTF8); + break; } default: { - const char *zRoot = p->zRoot; - if( zRoot==0 ) zRoot = "$"; - sqlite3_result_text(ctx, zRoot, -1, SQLITE_STATIC); + sqlite3_result_text(ctx, p->path.zBuf, p->nRoot, SQLITE_STATIC); break; } case JEACH_JSON: { - assert( i==JEACH_JSON ); - sqlite3_result_text(ctx, p->sParse.zJson, -1, SQLITE_STATIC); + if( p->sParse.zJson==0 ){ + sqlite3_result_blob(ctx, p->sParse.aBlob, p->sParse.nBlob, + SQLITE_TRANSIENT); + }else{ + sqlite3_result_text(ctx, p->sParse.zJson, -1, SQLITE_TRANSIENT); + } break; } } @@ -201320,78 +211409,97 @@ static int jsonEachFilter( int argc, sqlite3_value **argv ){ JsonEachCursor *p = (JsonEachCursor*)cur; - const char *z; const char *zRoot = 0; - sqlite3_int64 n; + u32 i, n, sz; UNUSED_PARAMETER(idxStr); UNUSED_PARAMETER(argc); jsonEachCursorReset(p); if( idxNum==0 ) return SQLITE_OK; - z = (const char*)sqlite3_value_text(argv[0]); - if( z==0 ) return SQLITE_OK; - n = sqlite3_value_bytes(argv[0]); - p->zJson = sqlite3_malloc64( n+1 ); - if( p->zJson==0 ) return SQLITE_NOMEM; - memcpy(p->zJson, z, (size_t)n+1); - if( jsonParse(&p->sParse, 0, p->zJson) ){ - int rc = SQLITE_NOMEM; - if( p->sParse.oom==0 ){ - sqlite3_free(cur->pVtab->zErrMsg); - cur->pVtab->zErrMsg = sqlite3_mprintf("malformed JSON"); - if( cur->pVtab->zErrMsg ) rc = SQLITE_ERROR; + memset(&p->sParse, 0, sizeof(p->sParse)); + p->sParse.nJPRef = 1; + p->sParse.db = p->db; + if( jsonFuncArgMightBeBinary(argv[0]) ){ + p->sParse.nBlob = sqlite3_value_bytes(argv[0]); + p->sParse.aBlob = (u8*)sqlite3_value_blob(argv[0]); + }else{ + p->sParse.zJson = (char*)sqlite3_value_text(argv[0]); + p->sParse.nJson = sqlite3_value_bytes(argv[0]); + if( p->sParse.zJson==0 ){ + p->i = p->iEnd = 0; + return SQLITE_OK; } - jsonEachCursorReset(p); - return rc; - }else if( p->bRecursive && jsonParseFindParents(&p->sParse) ){ - jsonEachCursorReset(p); - return SQLITE_NOMEM; - }else{ - JsonNode *pNode = 0; - if( idxNum==3 ){ - const char *zErr = 0; - zRoot = (const char*)sqlite3_value_text(argv[1]); - if( zRoot==0 ) return SQLITE_OK; - n = sqlite3_value_bytes(argv[1]); - p->zRoot = sqlite3_malloc64( n+1 ); - if( p->zRoot==0 ) return SQLITE_NOMEM; - memcpy(p->zRoot, zRoot, (size_t)n+1); - if( zRoot[0]!='$' ){ - zErr = zRoot; - }else{ - pNode = jsonLookupStep(&p->sParse, 0, p->zRoot+1, 0, &zErr); + if( jsonConvertTextToBlob(&p->sParse, 0) ){ + if( p->sParse.oom ){ + return SQLITE_NOMEM; } - if( zErr ){ + goto json_each_malformed_input; + } + } + if( idxNum==3 ){ + zRoot = (const char*)sqlite3_value_text(argv[1]); + if( zRoot==0 ) return SQLITE_OK; + if( zRoot[0]!='$' ){ + sqlite3_free(cur->pVtab->zErrMsg); + cur->pVtab->zErrMsg = jsonBadPathError(0, zRoot); + jsonEachCursorReset(p); + return cur->pVtab->zErrMsg ? SQLITE_ERROR : SQLITE_NOMEM; + } + p->nRoot = sqlite3Strlen30(zRoot); + if( zRoot[1]==0 ){ + i = p->i = 0; + p->eType = 0; + }else{ + i = jsonLookupStep(&p->sParse, 0, zRoot+1, 0); + if( JSON_LOOKUP_ISERROR(i) ){ + if( i==JSON_LOOKUP_NOTFOUND ){ + p->i = 0; + p->eType = 0; + p->iEnd = 0; + return SQLITE_OK; + } sqlite3_free(cur->pVtab->zErrMsg); - cur->pVtab->zErrMsg = jsonPathSyntaxError(zErr); + cur->pVtab->zErrMsg = jsonBadPathError(0, zRoot); jsonEachCursorReset(p); return cur->pVtab->zErrMsg ? SQLITE_ERROR : SQLITE_NOMEM; - }else if( pNode==0 ){ - return SQLITE_OK; } - }else{ - pNode = p->sParse.aNode; - } - p->iBegin = p->i = (int)(pNode - p->sParse.aNode); - p->eType = pNode->eType; - if( p->eType>=JSON_ARRAY ){ - assert( pNode->eU==0 ); - VVA( pNode->eU = 3 ); - pNode->u.iKey = 0; - p->iEnd = p->i + pNode->n + 1; - if( p->bRecursive ){ - p->eType = p->sParse.aNode[p->sParse.aUp[p->i]].eType; - if( p->i>0 && (p->sParse.aNode[p->i-1].jnFlags & JNODE_LABEL)!=0 ){ - p->i--; - } + if( p->sParse.iLabel ){ + p->i = p->sParse.iLabel; + p->eType = JSONB_OBJECT; }else{ - p->i++; - } - }else{ - p->iEnd = p->i+1; - } + p->i = i; + p->eType = JSONB_ARRAY; + } + } + jsonAppendRaw(&p->path, zRoot, p->nRoot); + }else{ + i = p->i = 0; + p->eType = 0; + p->nRoot = 1; + jsonAppendRaw(&p->path, "$", 1); + } + p->nParent = 0; + n = jsonbPayloadSize(&p->sParse, i, &sz); + p->iEnd = i+n+sz; + if( (p->sParse.aBlob[i] & 0x0f)>=JSONB_ARRAY && !p->bRecursive ){ + p->i = i + n; + p->eType = p->sParse.aBlob[i] & 0x0f; + p->aParent = sqlite3DbMallocZero(p->db, sizeof(JsonParent)); + if( p->aParent==0 ) return SQLITE_NOMEM; + p->nParent = 1; + p->nParentAlloc = 1; + p->aParent[0].iKey = 0; + p->aParent[0].iEnd = p->iEnd; + p->aParent[0].iHead = p->i; + p->aParent[0].iValue = i; } return SQLITE_OK; + +json_each_malformed_input: + sqlite3_free(cur->pVtab->zErrMsg); + cur->pVtab->zErrMsg = sqlite3_mprintf("malformed JSON"); + jsonEachCursorReset(p); + return cur->pVtab->zErrMsg ? SQLITE_ERROR : SQLITE_NOMEM; } /* The methods of the json_each virtual table */ @@ -201419,7 +211527,8 @@ static sqlite3_module jsonEachModule = { 0, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ - 0 /* xShadowName */ + 0, /* xShadowName */ + 0 /* xIntegrity */ }; /* The methods of the json_tree virtual table. */ @@ -201447,7 +211556,8 @@ static sqlite3_module jsonTreeModule = { 0, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ - 0 /* xShadowName */ + 0, /* xShadowName */ + 0 /* xIntegrity */ }; #endif /* SQLITE_OMIT_VIRTUALTABLE */ #endif /* !defined(SQLITE_OMIT_JSON) */ @@ -201458,33 +211568,59 @@ static sqlite3_module jsonTreeModule = { SQLITE_PRIVATE void sqlite3RegisterJsonFunctions(void){ #ifndef SQLITE_OMIT_JSON static FuncDef aJsonFunc[] = { - JFUNCTION(json, 1, 0, jsonRemoveFunc), - JFUNCTION(json_array, -1, 0, jsonArrayFunc), - JFUNCTION(json_array_length, 1, 0, jsonArrayLengthFunc), - JFUNCTION(json_array_length, 2, 0, jsonArrayLengthFunc), - JFUNCTION(json_extract, -1, 0, jsonExtractFunc), - JFUNCTION(->, 2, JSON_JSON, jsonExtractFunc), - JFUNCTION(->>, 2, JSON_SQL, jsonExtractFunc), - JFUNCTION(json_insert, -1, 0, jsonSetFunc), - JFUNCTION(json_object, -1, 0, jsonObjectFunc), - JFUNCTION(json_patch, 2, 0, jsonPatchFunc), - JFUNCTION(json_quote, 1, 0, jsonQuoteFunc), - JFUNCTION(json_remove, -1, 0, jsonRemoveFunc), - JFUNCTION(json_replace, -1, 0, jsonReplaceFunc), - JFUNCTION(json_set, -1, JSON_ISSET, jsonSetFunc), - JFUNCTION(json_type, 1, 0, jsonTypeFunc), - JFUNCTION(json_type, 2, 0, jsonTypeFunc), - JFUNCTION(json_valid, 1, 0, jsonValidFunc), + /* sqlite3_result_subtype() ----, ,--- sqlite3_value_subtype() */ + /* | | */ + /* Uses cache ------, | | ,---- Returns JSONB */ + /* | | | | */ + /* Number of arguments ---, | | | | ,--- Flags */ + /* | | | | | | */ + JFUNCTION(json, 1,1,1, 0,0,0, jsonRemoveFunc), + JFUNCTION(jsonb, 1,1,0, 0,1,0, jsonRemoveFunc), + JFUNCTION(json_array, -1,0,1, 1,0,0, jsonArrayFunc), + JFUNCTION(jsonb_array, -1,0,1, 1,1,0, jsonArrayFunc), + JFUNCTION(json_array_length, 1,1,0, 0,0,0, jsonArrayLengthFunc), + JFUNCTION(json_array_length, 2,1,0, 0,0,0, jsonArrayLengthFunc), + JFUNCTION(json_error_position,1,1,0, 0,0,0, jsonErrorFunc), + JFUNCTION(json_extract, -1,1,1, 0,0,0, jsonExtractFunc), + JFUNCTION(jsonb_extract, -1,1,0, 0,1,0, jsonExtractFunc), + JFUNCTION(->, 2,1,1, 0,0,JSON_JSON, jsonExtractFunc), + JFUNCTION(->>, 2,1,0, 0,0,JSON_SQL, jsonExtractFunc), + JFUNCTION(json_insert, -1,1,1, 1,0,0, jsonSetFunc), + JFUNCTION(jsonb_insert, -1,1,0, 1,1,0, jsonSetFunc), + JFUNCTION(json_object, -1,0,1, 1,0,0, jsonObjectFunc), + JFUNCTION(jsonb_object, -1,0,1, 1,1,0, jsonObjectFunc), + JFUNCTION(json_patch, 2,1,1, 0,0,0, jsonPatchFunc), + JFUNCTION(jsonb_patch, 2,1,0, 0,1,0, jsonPatchFunc), + JFUNCTION(json_pretty, 1,1,0, 0,0,0, jsonPrettyFunc), + JFUNCTION(json_pretty, 2,1,0, 0,0,0, jsonPrettyFunc), + JFUNCTION(json_quote, 1,0,1, 1,0,0, jsonQuoteFunc), + JFUNCTION(json_remove, -1,1,1, 0,0,0, jsonRemoveFunc), + JFUNCTION(jsonb_remove, -1,1,0, 0,1,0, jsonRemoveFunc), + JFUNCTION(json_replace, -1,1,1, 1,0,0, jsonReplaceFunc), + JFUNCTION(jsonb_replace, -1,1,0, 1,1,0, jsonReplaceFunc), + JFUNCTION(json_set, -1,1,1, 1,0,JSON_ISSET, jsonSetFunc), + JFUNCTION(jsonb_set, -1,1,0, 1,1,JSON_ISSET, jsonSetFunc), + JFUNCTION(json_type, 1,1,0, 0,0,0, jsonTypeFunc), + JFUNCTION(json_type, 2,1,0, 0,0,0, jsonTypeFunc), + JFUNCTION(json_valid, 1,1,0, 0,0,0, jsonValidFunc), + JFUNCTION(json_valid, 2,1,0, 0,0,0, jsonValidFunc), #if SQLITE_DEBUG - JFUNCTION(json_parse, 1, 0, jsonParseFunc), - JFUNCTION(json_test1, 1, 0, jsonTest1Func), + JFUNCTION(json_parse, 1,1,0, 0,0,0, jsonParseFunc), #endif WAGGREGATE(json_group_array, 1, 0, 0, jsonArrayStep, jsonArrayFinal, jsonArrayValue, jsonGroupInverse, - SQLITE_SUBTYPE|SQLITE_UTF8|SQLITE_DETERMINISTIC), + SQLITE_SUBTYPE|SQLITE_RESULT_SUBTYPE|SQLITE_UTF8| + SQLITE_DETERMINISTIC), + WAGGREGATE(jsonb_group_array, 1, JSON_BLOB, 0, + jsonArrayStep, jsonArrayFinal, jsonArrayValue, jsonGroupInverse, + SQLITE_SUBTYPE|SQLITE_RESULT_SUBTYPE|SQLITE_UTF8|SQLITE_DETERMINISTIC), WAGGREGATE(json_group_object, 2, 0, 0, jsonObjectStep, jsonObjectFinal, jsonObjectValue, jsonGroupInverse, - SQLITE_SUBTYPE|SQLITE_UTF8|SQLITE_DETERMINISTIC) + SQLITE_SUBTYPE|SQLITE_RESULT_SUBTYPE|SQLITE_UTF8|SQLITE_DETERMINISTIC), + WAGGREGATE(jsonb_group_object,2, JSON_BLOB, 0, + jsonObjectStep, jsonObjectFinal, jsonObjectValue, jsonGroupInverse, + SQLITE_SUBTYPE|SQLITE_RESULT_SUBTYPE|SQLITE_UTF8| + SQLITE_DETERMINISTIC) }; sqlite3InsertBuiltinFuncs(aJsonFunc, ArraySize(aJsonFunc)); #endif @@ -201611,6 +211747,11 @@ typedef unsigned int u32; #endif #endif /* !defined(SQLITE_AMALGAMATION) */ +/* Macro to check for 4-byte alignment. Only used inside of assert() */ +#ifdef SQLITE_DEBUG +# define FOUR_BYTE_ALIGNED(X) ((((char*)(X) - (char*)0) & 3)==0) +#endif + /* #include */ /* #include */ /* #include */ @@ -201676,6 +211817,7 @@ struct Rtree { int iDepth; /* Current depth of the r-tree structure */ char *zDb; /* Name of database containing r-tree table */ char *zName; /* Name of r-tree table */ + char *zNodeName; /* Name of the %_node table */ u32 nBusy; /* Current number of users of this structure */ i64 nRowEst; /* Estimated number of rows in this table */ u32 nCursor; /* Number of open cursors */ @@ -201688,7 +211830,6 @@ struct Rtree { ** headed by the node (leaf nodes have RtreeNode.iNode==0). */ RtreeNode *pDeleted; - int iReinsertHeight; /* Height of sub-trees Reinsert() has run on */ /* Blob I/O on xxx_node */ sqlite3_blob *pNodeBlob; @@ -201985,17 +212126,23 @@ struct RtreeMatchArg { ** -DSQLITE_RUNTIME_BYTEORDER=1 is set, then byte-order is determined ** at run-time. */ -#ifndef SQLITE_BYTEORDER -#if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ - defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ - defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ - defined(__arm__) -# define SQLITE_BYTEORDER 1234 -#elif defined(sparc) || defined(__ppc__) -# define SQLITE_BYTEORDER 4321 -#else -# define SQLITE_BYTEORDER 0 /* 0 means "unknown at compile-time" */ -#endif +#ifndef SQLITE_BYTEORDER /* Replicate changes at tag-20230904a */ +# if defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_BIG_ENDIAN__ +# define SQLITE_BYTEORDER 4321 +# elif defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__ +# define SQLITE_BYTEORDER 1234 +# elif defined(__BIG_ENDIAN__) && __BIG_ENDIAN__==1 +# define SQLITE_BYTEORDER 4321 +# elif defined(i386) || defined(__i386__) || defined(_M_IX86) || \ + defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ + defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ + defined(__ARMEL__) || defined(__AARCH64EL__) || defined(_M_ARM64) +# define SQLITE_BYTEORDER 1234 +# elif defined(sparc) || defined(__ARMEB__) || defined(__AARCH64EB__) +# define SQLITE_BYTEORDER 4321 +# else +# define SQLITE_BYTEORDER 0 +# endif #endif @@ -202016,7 +212163,7 @@ static int readInt16(u8 *p){ return (p[0]<<8) + p[1]; } static void readCoord(u8 *p, RtreeCoord *pCoord){ - assert( (((sqlite3_uint64)p)&3)==0 ); /* p is always 4-byte aligned */ + assert( FOUR_BYTE_ALIGNED(p) ); #if SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 pCoord->u = _byteswap_ulong(*(u32*)p); #elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 @@ -202070,7 +212217,7 @@ static void writeInt16(u8 *p, int i){ } static int writeCoord(u8 *p, RtreeCoord *pCoord){ u32 i; - assert( (((sqlite3_uint64)p)&3)==0 ); /* p is always 4-byte aligned */ + assert( FOUR_BYTE_ALIGNED(p) ); assert( sizeof(RtreeCoord)==4 ); assert( sizeof(u32)==4 ); #if SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 @@ -202198,11 +212345,9 @@ static RtreeNode *nodeNew(Rtree *pRtree, RtreeNode *pParent){ ** Clear the Rtree.pNodeBlob object */ static void nodeBlobReset(Rtree *pRtree){ - if( pRtree->pNodeBlob && pRtree->inWrTrans==0 && pRtree->nCursor==0 ){ - sqlite3_blob *pBlob = pRtree->pNodeBlob; - pRtree->pNodeBlob = 0; - sqlite3_blob_close(pBlob); - } + sqlite3_blob *pBlob = pRtree->pNodeBlob; + pRtree->pNodeBlob = 0; + sqlite3_blob_close(pBlob); } /* @@ -202221,7 +212366,7 @@ static int nodeAcquire( ** increase its reference count and return it. */ if( (pNode = nodeHashLookup(pRtree, iNode))!=0 ){ - if( pParent && pParent!=pNode->pParent ){ + if( pParent && ALWAYS(pParent!=pNode->pParent) ){ RTREE_IS_CORRUPT(pRtree); return SQLITE_CORRUPT_VTAB; } @@ -202241,14 +212386,11 @@ static int nodeAcquire( } } if( pRtree->pNodeBlob==0 ){ - char *zTab = sqlite3_mprintf("%s_node", pRtree->zName); - if( zTab==0 ) return SQLITE_NOMEM; - rc = sqlite3_blob_open(pRtree->db, pRtree->zDb, zTab, "data", iNode, 0, + rc = sqlite3_blob_open(pRtree->db, pRtree->zDb, pRtree->zNodeName, + "data", iNode, 0, &pRtree->pNodeBlob); - sqlite3_free(zTab); } if( rc ){ - nodeBlobReset(pRtree); *ppNode = 0; /* If unable to open an sqlite3_blob on the desired row, that can only ** be because the shadow tables hold erroneous data. */ @@ -202308,6 +212450,7 @@ static int nodeAcquire( } *ppNode = pNode; }else{ + nodeBlobReset(pRtree); if( pNode ){ pRtree->nNodeRef--; sqlite3_free(pNode); @@ -202452,6 +212595,7 @@ static void nodeGetCoord( int iCoord, /* Which coordinate to extract */ RtreeCoord *pCoord /* OUT: Space to write result to */ ){ + assert( iCellzData[12 + pRtree->nBytesPerCell*iCell + 4*iCoord], pCoord); } @@ -202641,7 +212785,9 @@ static int rtreeClose(sqlite3_vtab_cursor *cur){ sqlite3_finalize(pCsr->pReadAux); sqlite3_free(pCsr); pRtree->nCursor--; - nodeBlobReset(pRtree); + if( pRtree->nCursor==0 && pRtree->inWrTrans==0 ){ + nodeBlobReset(pRtree); + } return SQLITE_OK; } @@ -202798,7 +212944,7 @@ static void rtreeNonleafConstraint( assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE || p->op==RTREE_GT || p->op==RTREE_EQ || p->op==RTREE_TRUE || p->op==RTREE_FALSE ); - assert( (((sqlite3_uint64)pCellData)&3)==0 ); /* 4-byte aligned */ + assert( FOUR_BYTE_ALIGNED(pCellData) ); switch( p->op ){ case RTREE_TRUE: return; /* Always satisfied */ case RTREE_FALSE: break; /* Never satisfied */ @@ -202851,7 +212997,7 @@ static void rtreeLeafConstraint( || p->op==RTREE_GT || p->op==RTREE_EQ || p->op==RTREE_TRUE || p->op==RTREE_FALSE ); pCellData += 8 + p->iCoord*4; - assert( (((sqlite3_uint64)pCellData)&3)==0 ); /* 4-byte aligned */ + assert( FOUR_BYTE_ALIGNED(pCellData) ); RTREE_DECODE_COORD(eInt, pCellData, xN); switch( p->op ){ case RTREE_TRUE: return; /* Always satisfied */ @@ -203226,7 +213372,11 @@ static int rtreeRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *pRowid){ int rc = SQLITE_OK; RtreeNode *pNode = rtreeNodeOfFirstSearchPoint(pCsr, &rc); if( rc==SQLITE_OK && ALWAYS(p) ){ - *pRowid = nodeGetRowid(RTREE_OF_CURSOR(pCsr), pNode, p->iCell); + if( p->iCell>=NCELL(pNode) ){ + rc = SQLITE_ABORT; + }else{ + *pRowid = nodeGetRowid(RTREE_OF_CURSOR(pCsr), pNode, p->iCell); + } } return rc; } @@ -203244,6 +213394,7 @@ static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ if( rc ) return rc; if( NEVER(p==0) ) return SQLITE_OK; + if( p->iCell>=NCELL(pNode) ) return SQLITE_ABORT; if( i==0 ){ sqlite3_result_int64(ctx, nodeGetRowid(pRtree, pNode, p->iCell)); }else if( i<=pRtree->nDim2 ){ @@ -203341,6 +213492,8 @@ static int deserializeGeometry(sqlite3_value *pValue, RtreeConstraint *pCons){ return SQLITE_OK; } +SQLITE_PRIVATE int sqlite3IntFloatCompare(i64,double); + /* ** Rtree virtual table module xFilter method. */ @@ -203370,7 +213523,8 @@ static int rtreeFilter( i64 iNode = 0; int eType = sqlite3_value_numeric_type(argv[0]); if( eType==SQLITE_INTEGER - || (eType==SQLITE_FLOAT && sqlite3_value_double(argv[0])==iRowid) + || (eType==SQLITE_FLOAT + && 0==sqlite3IntFloatCompare(iRowid,sqlite3_value_double(argv[0]))) ){ rc = findLeafNode(pRtree, iRowid, &pLeaf, &iNode); }else{ @@ -203421,7 +213575,20 @@ static int rtreeFilter( p->pInfo->nCoord = pRtree->nDim2; p->pInfo->anQueue = pCsr->anQueue; p->pInfo->mxLevel = pRtree->iDepth + 1; - }else if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){ + }else if( eType==SQLITE_INTEGER ){ + sqlite3_int64 iVal = sqlite3_value_int64(argv[ii]); +#ifdef SQLITE_RTREE_INT_ONLY + p->u.rValue = iVal; +#else + p->u.rValue = (double)iVal; + if( iVal>=((sqlite3_int64)1)<<48 + || iVal<=-(((sqlite3_int64)1)<<48) + ){ + if( p->op==RTREE_LT ) p->op = RTREE_LE; + if( p->op==RTREE_GT ) p->op = RTREE_GE; + } +#endif + }else if( eType==SQLITE_FLOAT ){ #ifdef SQLITE_RTREE_INT_ONLY p->u.rValue = sqlite3_value_int64(argv[ii]); #else @@ -203552,11 +213719,12 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ || p->op==SQLITE_INDEX_CONSTRAINT_MATCH) ){ u8 op; + u8 doOmit = 1; switch( p->op ){ - case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break; - case SQLITE_INDEX_CONSTRAINT_GT: op = RTREE_GT; break; + case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; doOmit = 0; break; + case SQLITE_INDEX_CONSTRAINT_GT: op = RTREE_GT; doOmit = 0; break; case SQLITE_INDEX_CONSTRAINT_LE: op = RTREE_LE; break; - case SQLITE_INDEX_CONSTRAINT_LT: op = RTREE_LT; break; + case SQLITE_INDEX_CONSTRAINT_LT: op = RTREE_LT; doOmit = 0; break; case SQLITE_INDEX_CONSTRAINT_GE: op = RTREE_GE; break; case SQLITE_INDEX_CONSTRAINT_MATCH: op = RTREE_MATCH; break; default: op = 0; break; @@ -203565,15 +213733,19 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ zIdxStr[iIdx++] = op; zIdxStr[iIdx++] = (char)(p->iColumn - 1 + '0'); pIdxInfo->aConstraintUsage[ii].argvIndex = (iIdx/2); - pIdxInfo->aConstraintUsage[ii].omit = 1; + pIdxInfo->aConstraintUsage[ii].omit = doOmit; } } } pIdxInfo->idxNum = 2; pIdxInfo->needToFreeIdxStr = 1; - if( iIdx>0 && 0==(pIdxInfo->idxStr = sqlite3_mprintf("%s", zIdxStr)) ){ - return SQLITE_NOMEM; + if( iIdx>0 ){ + pIdxInfo->idxStr = sqlite3_malloc( iIdx+1 ); + if( pIdxInfo->idxStr==0 ){ + return SQLITE_NOMEM; + } + memcpy(pIdxInfo->idxStr, zIdxStr, iIdx+1); } nRow = pRtree->nRowEst >> (iIdx/2); @@ -203652,31 +213824,22 @@ static void cellUnion(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){ */ static int cellContains(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){ int ii; - int isInt = (pRtree->eCoordType==RTREE_COORD_INT32); - for(ii=0; iinDim2; ii+=2){ - RtreeCoord *a1 = &p1->aCoord[ii]; - RtreeCoord *a2 = &p2->aCoord[ii]; - if( (!isInt && (a2[0].fa1[1].f)) - || ( isInt && (a2[0].ia1[1].i)) - ){ - return 0; + if( pRtree->eCoordType==RTREE_COORD_INT32 ){ + for(ii=0; iinDim2; ii+=2){ + RtreeCoord *a1 = &p1->aCoord[ii]; + RtreeCoord *a2 = &p2->aCoord[ii]; + if( a2[0].ia1[1].i ) return 0; + } + }else{ + for(ii=0; iinDim2; ii+=2){ + RtreeCoord *a1 = &p1->aCoord[ii]; + RtreeCoord *a2 = &p2->aCoord[ii]; + if( a2[0].fa1[1].f ) return 0; } } return 1; } -/* -** Return the amount cell p would grow by if it were unioned with pCell. -*/ -static RtreeDValue cellGrowth(Rtree *pRtree, RtreeCell *p, RtreeCell *pCell){ - RtreeDValue area; - RtreeCell cell; - memcpy(&cell, p, sizeof(RtreeCell)); - area = cellArea(pRtree, &cell); - cellUnion(pRtree, &cell, pCell); - return (cellArea(pRtree, &cell)-area); -} - static RtreeDValue cellOverlap( Rtree *pRtree, RtreeCell *p, @@ -203723,38 +213886,52 @@ static int ChooseLeaf( for(ii=0; rc==SQLITE_OK && ii<(pRtree->iDepth-iHeight); ii++){ int iCell; sqlite3_int64 iBest = 0; - + int bFound = 0; RtreeDValue fMinGrowth = RTREE_ZERO; RtreeDValue fMinArea = RTREE_ZERO; - int nCell = NCELL(pNode); - RtreeCell cell; RtreeNode *pChild = 0; - RtreeCell *aCell = 0; - - /* Select the child node which will be enlarged the least if pCell - ** is inserted into it. Resolve ties by choosing the entry with - ** the smallest area. + /* First check to see if there is are any cells in pNode that completely + ** contains pCell. If two or more cells in pNode completely contain pCell + ** then pick the smallest. */ for(iCell=0; iCell1 ){ - int iLeft = 0; - int iRight = 0; - - int nLeft = nIdx/2; - int nRight = nIdx-nLeft; - int *aLeft = aIdx; - int *aRight = &aIdx[nLeft]; - - SortByDistance(aLeft, nLeft, aDistance, aSpare); - SortByDistance(aRight, nRight, aDistance, aSpare); - - memcpy(aSpare, aLeft, sizeof(int)*nLeft); - aLeft = aSpare; - - while( iLeftnDim; iDim++){ - aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2]); - aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2+1]); - } - } - for(iDim=0; iDimnDim; iDim++){ - aCenterCoord[iDim] = (aCenterCoord[iDim]/(nCell*(RtreeDValue)2)); - } - - for(ii=0; iinDim; iDim++){ - RtreeDValue coord = (DCOORD(aCell[ii].aCoord[iDim*2+1]) - - DCOORD(aCell[ii].aCoord[iDim*2])); - aDistance[ii] += (coord-aCenterCoord[iDim])*(coord-aCenterCoord[iDim]); - } - } - - SortByDistance(aOrder, nCell, aDistance, aSpare); - nodeZero(pRtree, pNode); - - for(ii=0; rc==SQLITE_OK && ii<(nCell-(RTREE_MINCELLS(pRtree)+1)); ii++){ - RtreeCell *p = &aCell[aOrder[ii]]; - nodeInsertCell(pRtree, pNode, p); - if( p->iRowid==pCell->iRowid ){ - if( iHeight==0 ){ - rc = rowidWrite(pRtree, p->iRowid, pNode->iNode); - }else{ - rc = parentWrite(pRtree, p->iRowid, pNode->iNode); - } - } - } - if( rc==SQLITE_OK ){ - rc = fixBoundingBox(pRtree, pNode); - } - for(; rc==SQLITE_OK && iiiNode currently contains - ** the height of the sub-tree headed by the cell. - */ - RtreeNode *pInsert; - RtreeCell *p = &aCell[aOrder[ii]]; - rc = ChooseLeaf(pRtree, p, iHeight, &pInsert); - if( rc==SQLITE_OK ){ - int rc2; - rc = rtreeInsertCell(pRtree, pInsert, p, iHeight); - rc2 = nodeRelease(pRtree, pInsert); - if( rc==SQLITE_OK ){ - rc = rc2; - } - } - } - - sqlite3_free(aCell); - return rc; -} - /* ** Insert cell pCell into node pNode. Node pNode is the head of a ** subtree iHeight high (leaf nodes have iHeight==0). @@ -204503,12 +214508,7 @@ static int rtreeInsertCell( } } if( nodeInsertCell(pRtree, pNode, pCell) ){ - if( iHeight<=pRtree->iReinsertHeight || pNode->iNode==1){ - rc = SplitNode(pRtree, pNode, pCell, iHeight); - }else{ - pRtree->iReinsertHeight = iHeight; - rc = Reinsert(pRtree, pNode, pCell, iHeight); - } + rc = SplitNode(pRtree, pNode, pCell, iHeight); }else{ rc = AdjustTree(pRtree, pNode, pCell); if( ALWAYS(rc==SQLITE_OK) ){ @@ -204851,7 +214851,6 @@ static int rtreeUpdate( } if( rc==SQLITE_OK ){ int rc2; - pRtree->iReinsertHeight = -1; rc = rtreeInsertCell(pRtree, pLeaf, &cell, 0); rc2 = nodeRelease(pRtree, pLeaf); if( rc==SQLITE_OK ){ @@ -204881,7 +214880,7 @@ static int rtreeUpdate( static int rtreeBeginTransaction(sqlite3_vtab *pVtab){ Rtree *pRtree = (Rtree *)pVtab; assert( pRtree->inWrTrans==0 ); - pRtree->inWrTrans++; + pRtree->inWrTrans = 1; return SQLITE_OK; } @@ -204895,6 +214894,9 @@ static int rtreeEndTransaction(sqlite3_vtab *pVtab){ nodeBlobReset(pRtree); return SQLITE_OK; } +static int rtreeRollback(sqlite3_vtab *pVtab){ + return rtreeEndTransaction(pVtab); +} /* ** The xRename method for rtree module virtual tables. @@ -204992,8 +214994,11 @@ static int rtreeShadowName(const char *zName){ return 0; } +/* Forward declaration */ +static int rtreeIntegrity(sqlite3_vtab*, const char*, const char*, int, char**); + static sqlite3_module rtreeModule = { - 3, /* iVersion */ + 4, /* iVersion */ rtreeCreate, /* xCreate - create a table */ rtreeConnect, /* xConnect - connect to an existing table */ rtreeBestIndex, /* xBestIndex - Determine search strategy */ @@ -205010,13 +215015,14 @@ static sqlite3_module rtreeModule = { rtreeBeginTransaction, /* xBegin - begin transaction */ rtreeEndTransaction, /* xSync - sync transaction */ rtreeEndTransaction, /* xCommit - commit transaction */ - rtreeEndTransaction, /* xRollback - rollback transaction */ + rtreeRollback, /* xRollback - rollback transaction */ 0, /* xFindFunction - function overloading */ rtreeRename, /* xRename - rename the table */ rtreeSavepoint, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ - rtreeShadowName /* xShadowName */ + rtreeShadowName, /* xShadowName */ + rtreeIntegrity /* xIntegrity */ }; static int rtreeSqlInit( @@ -205109,7 +215115,7 @@ static int rtreeSqlInit( } sqlite3_free(zSql); } - if( pRtree->nAux ){ + if( pRtree->nAux && rc!=SQLITE_NOMEM ){ pRtree->zReadAuxSql = sqlite3_mprintf( "SELECT * FROM \"%w\".\"%w_rowid\" WHERE rowid=?1", zDb, zPrefix); @@ -205272,22 +215278,27 @@ static int rtreeInit( } sqlite3_vtab_config(db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1); + sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS); + /* Allocate the sqlite3_vtab structure */ nDb = (int)strlen(argv[1]); nName = (int)strlen(argv[2]); - pRtree = (Rtree *)sqlite3_malloc64(sizeof(Rtree)+nDb+nName+2); + pRtree = (Rtree *)sqlite3_malloc64(sizeof(Rtree)+nDb+nName*2+8); if( !pRtree ){ return SQLITE_NOMEM; } - memset(pRtree, 0, sizeof(Rtree)+nDb+nName+2); + memset(pRtree, 0, sizeof(Rtree)+nDb+nName*2+8); pRtree->nBusy = 1; pRtree->base.pModule = &rtreeModule; pRtree->zDb = (char *)&pRtree[1]; pRtree->zName = &pRtree->zDb[nDb+1]; + pRtree->zNodeName = &pRtree->zName[nName+1]; pRtree->eCoordType = (u8)eCoordType; memcpy(pRtree->zDb, argv[1], nDb); memcpy(pRtree->zName, argv[2], nName); + memcpy(pRtree->zNodeName, argv[2], nName); + memcpy(&pRtree->zNodeName[nName], "_node", 6); /* Create/Connect to the underlying relational database schema. If @@ -205784,7 +215795,6 @@ static int rtreeCheckTable( ){ RtreeCheck check; /* Common context for various routines */ sqlite3_stmt *pStmt = 0; /* Used to find column count of rtree table */ - int bEnd = 0; /* True if transaction should be closed */ int nAux = 0; /* Number of extra columns. */ /* Initialize the context object */ @@ -205793,24 +215803,14 @@ static int rtreeCheckTable( check.zDb = zDb; check.zTab = zTab; - /* If there is not already an open transaction, open one now. This is - ** to ensure that the queries run as part of this integrity-check operate - ** on a consistent snapshot. */ - if( sqlite3_get_autocommit(db) ){ - check.rc = sqlite3_exec(db, "BEGIN", 0, 0, 0); - bEnd = 1; - } - /* Find the number of auxiliary columns */ - if( check.rc==SQLITE_OK ){ - pStmt = rtreeCheckPrepare(&check, "SELECT * FROM %Q.'%q_rowid'", zDb, zTab); - if( pStmt ){ - nAux = sqlite3_column_count(pStmt) - 2; - sqlite3_finalize(pStmt); - }else - if( check.rc!=SQLITE_NOMEM ){ - check.rc = SQLITE_OK; - } + pStmt = rtreeCheckPrepare(&check, "SELECT * FROM %Q.'%q_rowid'", zDb, zTab); + if( pStmt ){ + nAux = sqlite3_column_count(pStmt) - 2; + sqlite3_finalize(pStmt); + }else + if( check.rc!=SQLITE_NOMEM ){ + check.rc = SQLITE_OK; } /* Find number of dimensions in the rtree table. */ @@ -205841,15 +215841,35 @@ static int rtreeCheckTable( sqlite3_finalize(check.aCheckMapping[0]); sqlite3_finalize(check.aCheckMapping[1]); - /* If one was opened, close the transaction */ - if( bEnd ){ - int rc = sqlite3_exec(db, "END", 0, 0, 0); - if( check.rc==SQLITE_OK ) check.rc = rc; - } *pzReport = check.zReport; return check.rc; } +/* +** Implementation of the xIntegrity method for Rtree. +*/ +static int rtreeIntegrity( + sqlite3_vtab *pVtab, /* The virtual table to check */ + const char *zSchema, /* Schema in which the virtual table lives */ + const char *zName, /* Name of the virtual table */ + int isQuick, /* True for a quick_check */ + char **pzErr /* Write results here */ +){ + Rtree *pRtree = (Rtree*)pVtab; + int rc; + assert( pzErr!=0 && *pzErr==0 ); + UNUSED_PARAMETER(zSchema); + UNUSED_PARAMETER(zName); + UNUSED_PARAMETER(isQuick); + rc = rtreeCheckTable(pRtree->db, pRtree->zDb, pRtree->zName, pzErr); + if( rc==SQLITE_OK && *pzErr ){ + *pzErr = sqlite3_mprintf("In RTree %s.%s:\n%z", + pRtree->zDb, pRtree->zName, *pzErr); + if( (*pzErr)==0 ) rc = SQLITE_NOMEM; + } + return rc; +} + /* ** Usage: ** @@ -207171,24 +217191,28 @@ static int geopolyInit( (void)pAux; sqlite3_vtab_config(db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1); + sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS); /* Allocate the sqlite3_vtab structure */ nDb = strlen(argv[1]); nName = strlen(argv[2]); - pRtree = (Rtree *)sqlite3_malloc64(sizeof(Rtree)+nDb+nName+2); + pRtree = (Rtree *)sqlite3_malloc64(sizeof(Rtree)+nDb+nName*2+8); if( !pRtree ){ return SQLITE_NOMEM; } - memset(pRtree, 0, sizeof(Rtree)+nDb+nName+2); + memset(pRtree, 0, sizeof(Rtree)+nDb+nName*2+8); pRtree->nBusy = 1; pRtree->base.pModule = &rtreeModule; pRtree->zDb = (char *)&pRtree[1]; pRtree->zName = &pRtree->zDb[nDb+1]; + pRtree->zNodeName = &pRtree->zName[nName+1]; pRtree->eCoordType = RTREE_COORD_REAL32; pRtree->nDim = 2; pRtree->nDim2 = 4; memcpy(pRtree->zDb, argv[1], nDb); memcpy(pRtree->zName, argv[2], nName); + memcpy(pRtree->zNodeName, argv[2], nName); + memcpy(&pRtree->zNodeName[nName], "_node", 6); /* Create/Connect to the underlying relational database schema. If @@ -207602,7 +217626,6 @@ static int geopolyUpdate( } if( rc==SQLITE_OK ){ int rc2; - pRtree->iReinsertHeight = -1; rc = rtreeInsertCell(pRtree, pLeaf, &cell, 0); rc2 = nodeRelease(pRtree, pLeaf); if( rc==SQLITE_OK ){ @@ -207699,7 +217722,8 @@ static sqlite3_module geopolyModule = { rtreeSavepoint, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ - rtreeShadowName /* xShadowName */ + rtreeShadowName, /* xShadowName */ + rtreeIntegrity /* xIntegrity */ }; static int sqlite3_geopoly_init(sqlite3 *db){ @@ -208410,7 +218434,7 @@ static void icuLoadCollation( UCollator *pUCollator; /* ICU library collation object */ int rc; /* Return code from sqlite3_create_collation_x() */ - assert(nArg==2); + assert(nArg==2 || nArg==3); (void)nArg; /* Unused parameter */ zLocale = (const char *)sqlite3_value_text(apArg[0]); zName = (const char *)sqlite3_value_text(apArg[1]); @@ -208425,7 +218449,39 @@ static void icuLoadCollation( return; } assert(p); - + if(nArg==3){ + const char *zOption = (const char*)sqlite3_value_text(apArg[2]); + static const struct { + const char *zName; + UColAttributeValue val; + } aStrength[] = { + { "PRIMARY", UCOL_PRIMARY }, + { "SECONDARY", UCOL_SECONDARY }, + { "TERTIARY", UCOL_TERTIARY }, + { "DEFAULT", UCOL_DEFAULT_STRENGTH }, + { "QUARTERNARY", UCOL_QUATERNARY }, + { "IDENTICAL", UCOL_IDENTICAL }, + }; + unsigned int i; + for(i=0; i=sizeof(aStrength)/sizeof(aStrength[0]) ){ + sqlite3_str *pStr = sqlite3_str_new(sqlite3_context_db_handle(p)); + sqlite3_str_appendf(pStr, + "unknown collation strength \"%s\" - should be one of:", + zOption); + for(i=0; ipTblIter, &p->zErrmsg); pIter->zTbl = 0; + pIter->zDataTbl = 0; }else{ pIter->zTbl = (const char*)sqlite3_column_text(pIter->pTblIter, 0); pIter->zDataTbl = (const char*)sqlite3_column_text(pIter->pTblIter,1); @@ -211665,13 +221746,13 @@ static char *rbuObjIterGetIndexWhere(sqlite3rbu *p, RbuObjIter *pIter){ else if( c==')' ){ nParen--; if( nParen==0 ){ - int nSpan = &zSql[i] - pIter->aIdxCol[iIdxCol].zSpan; + int nSpan = (int)(&zSql[i] - pIter->aIdxCol[iIdxCol].zSpan); pIter->aIdxCol[iIdxCol++].nSpan = nSpan; i++; break; } }else if( c==',' && nParen==1 ){ - int nSpan = &zSql[i] - pIter->aIdxCol[iIdxCol].zSpan; + int nSpan = (int)(&zSql[i] - pIter->aIdxCol[iIdxCol].zSpan); pIter->aIdxCol[iIdxCol++].nSpan = nSpan; pIter->aIdxCol[iIdxCol].zSpan = &zSql[i+1]; }else if( c=='"' || c=='\'' || c=='`' ){ @@ -212361,6 +222442,8 @@ static void rbuFileSuffix3(const char *zBase, char *z){ for(i=sz-1; i>0 && z[i]!='/' && z[i]!='.'; i--){} if( z[i]=='.' && sz>i+4 ) memmove(&z[i+1], &z[sz-3], 4); } +#else + UNUSED_PARAMETER2(zBase,z); #endif } @@ -212378,7 +222461,7 @@ static i64 rbuShmChecksum(sqlite3rbu *p){ u32 volatile *ptr; p->rc = pDb->pMethods->xShmMap(pDb, 0, 32*1024, 0, (void volatile**)&ptr); if( p->rc==SQLITE_OK ){ - iRet = ((i64)ptr[10] << 32) + ptr[11]; + iRet = (i64)(((u64)ptr[10] << 32) + ptr[11]); } } return iRet; @@ -212540,6 +222623,11 @@ static void rbuCheckpointFrame(sqlite3rbu *p, RbuFrame *pFrame){ p->rc = pDb->pMethods->xWrite(pDb, p->aBuf, p->pgsz, iOff); } +/* +** This value is copied from the definition of ZIPVFS_CTRL_FILE_POINTER +** in zipvfs.h. +*/ +#define RBU_ZIPVFS_CTRL_FILE_POINTER 230439 /* ** Take an EXCLUSIVE lock on the database file. Return SQLITE_OK if @@ -212548,9 +222636,20 @@ static void rbuCheckpointFrame(sqlite3rbu *p, RbuFrame *pFrame){ static int rbuLockDatabase(sqlite3 *db){ int rc = SQLITE_OK; sqlite3_file *fd = 0; - sqlite3_file_control(db, "main", SQLITE_FCNTL_FILE_POINTER, &fd); - if( fd->pMethods ){ + sqlite3_file_control(db, "main", RBU_ZIPVFS_CTRL_FILE_POINTER, &fd); + if( fd ){ + sqlite3_file_control(db, "main", SQLITE_FCNTL_FILE_POINTER, &fd); + rc = fd->pMethods->xLock(fd, SQLITE_LOCK_SHARED); + if( rc==SQLITE_OK ){ + rc = fd->pMethods->xUnlock(fd, SQLITE_LOCK_NONE); + } + sqlite3_file_control(db, "main", RBU_ZIPVFS_CTRL_FILE_POINTER, &fd); + }else{ + sqlite3_file_control(db, "main", SQLITE_FCNTL_FILE_POINTER, &fd); + } + + if( rc==SQLITE_OK && fd->pMethods ){ rc = fd->pMethods->xLock(fd, SQLITE_LOCK_SHARED); if( rc==SQLITE_OK ){ rc = fd->pMethods->xLock(fd, SQLITE_LOCK_EXCLUSIVE); @@ -212929,7 +223028,7 @@ static void rbuSaveState(sqlite3rbu *p, int eStage){ "(%d, %Q), " "(%d, %Q), " "(%d, %d), " - "(%d, %d), " + "(%d, %lld), " "(%d, %lld), " "(%d, %lld), " "(%d, %lld), " @@ -213287,6 +223386,7 @@ static void rbuIndexCntFunc( sqlite3 *db = (rbuIsVacuum(p) ? p->dbRbu : p->dbMain); assert( nVal==1 ); + UNUSED_PARAMETER(nVal); rc = prepareFreeAndCollectError(db, &pStmt, &zErrmsg, sqlite3_mprintf("SELECT count(*) FROM sqlite_schema " @@ -213562,7 +223662,7 @@ SQLITE_API sqlite3rbu *sqlite3rbu_vacuum( ){ if( zTarget==0 ){ return rbuMisuseError(); } if( zState ){ - int n = strlen(zState); + size_t n = strlen(zState); if( n>=7 && 0==memcmp("-vactmp", &zState[n-7], 7) ){ return rbuMisuseError(); } @@ -213779,6 +223879,7 @@ SQLITE_API int sqlite3rbu_savestate(sqlite3rbu *p){ */ static int xDefaultRename(void *pArg, const char *zOld, const char *zNew){ int rc = SQLITE_OK; + UNUSED_PARAMETER(pArg); #if defined(_WIN32_WCE) { LPWSTR zWideOld; @@ -214683,6 +224784,9 @@ static int rbuVfsCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){ ** No-op. */ static int rbuVfsGetLastError(sqlite3_vfs *pVfs, int a, char *b){ + UNUSED_PARAMETER(pVfs); + UNUSED_PARAMETER(a); + UNUSED_PARAMETER(b); return 0; } @@ -215081,6 +225185,7 @@ static int statBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ pIdxInfo->orderByConsumed = 1; pIdxInfo->idxNum |= 0x08; } + pIdxInfo->idxFlags |= SQLITE_INDEX_SCAN_HEX; return SQLITE_OK; } @@ -215697,7 +225802,8 @@ SQLITE_PRIVATE int sqlite3DbstatRegister(sqlite3 *db){ 0, /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ - 0 /* xShadowName */ + 0, /* xShadowName */ + 0 /* xIntegrity */ }; return sqlite3_create_module(db, "dbstat", &dbstat_module, 0); } @@ -215737,7 +225843,13 @@ SQLITE_PRIVATE int sqlite3DbstatRegister(sqlite3 *db){ return SQLITE_OK; } ** ** The data field of sqlite_dbpage table can be updated. The new ** value must be a BLOB which is the correct page size, otherwise the -** update fails. Rows may not be deleted or inserted. +** update fails. INSERT operations also work, and operate as if they +** where REPLACE. The size of the database can be extended by INSERT-ing +** new pages on the end. +** +** Rows may not be deleted. However, doing an INSERT to page number N +** with NULL page data causes the N-th page and all subsequent pages to be +** deleted and the database to be truncated. */ /* #include "sqliteInt.h" ** Requires access to internal data structures ** */ @@ -215760,6 +225872,8 @@ struct DbpageCursor { struct DbpageTable { sqlite3_vtab base; /* Base class. Must be first */ sqlite3 *db; /* The database */ + int iDbTrunc; /* Database to truncate */ + Pgno pgnoTrunc; /* Size to truncate to */ }; /* Columns */ @@ -215768,7 +225882,6 @@ struct DbpageTable { #define DBPAGE_COLUMN_SCHEMA 2 - /* ** Connect to or create a dbpagevfs virtual table. */ @@ -215787,6 +225900,7 @@ static int dbpageConnect( (void)pzErr; sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY); + sqlite3_vtab_config(db, SQLITE_VTAB_USES_ALL_SCHEMAS); rc = sqlite3_declare_vtab(db, "CREATE TABLE x(pgno INTEGER PRIMARY KEY, data BLOB, schema HIDDEN)"); if( rc==SQLITE_OK ){ @@ -215870,7 +225984,6 @@ static int dbpageBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ ){ pIdxInfo->orderByConsumed = 1; } - sqlite3VtabUsesAllSchemas(pIdxInfo); return SQLITE_OK; } @@ -216030,11 +226143,11 @@ static int dbpageUpdate( DbPage *pDbPage = 0; int rc = SQLITE_OK; char *zErr = 0; - const char *zSchema; int iDb; Btree *pBt; Pager *pPager; int szPage; + int isInsert; (void)pRowid; if( pTab->db->flags & SQLITE_Defensive ){ @@ -216045,21 +226158,29 @@ static int dbpageUpdate( zErr = "cannot delete"; goto update_fail; } - pgno = sqlite3_value_int(argv[0]); - if( sqlite3_value_type(argv[0])==SQLITE_NULL - || (Pgno)sqlite3_value_int(argv[1])!=pgno - ){ - zErr = "cannot insert"; - goto update_fail; + if( sqlite3_value_type(argv[0])==SQLITE_NULL ){ + pgno = (Pgno)sqlite3_value_int(argv[2]); + isInsert = 1; + }else{ + pgno = sqlite3_value_int(argv[0]); + if( (Pgno)sqlite3_value_int(argv[1])!=pgno ){ + zErr = "cannot insert"; + goto update_fail; + } + isInsert = 0; } - zSchema = (const char*)sqlite3_value_text(argv[4]); - iDb = ALWAYS(zSchema) ? sqlite3FindDbName(pTab->db, zSchema) : -1; - if( NEVER(iDb<0) ){ - zErr = "no such schema"; - goto update_fail; + if( sqlite3_value_type(argv[4])==SQLITE_NULL ){ + iDb = 0; + }else{ + const char *zSchema = (const char*)sqlite3_value_text(argv[4]); + iDb = sqlite3FindDbName(pTab->db, zSchema); + if( iDb<0 ){ + zErr = "no such schema"; + goto update_fail; + } } pBt = pTab->db->aDb[iDb].pBt; - if( NEVER(pgno<1) || NEVER(pBt==0) || NEVER(pgno>sqlite3BtreeLastPage(pBt)) ){ + if( pgno<1 || NEVER(pBt==0) ){ zErr = "bad page number"; goto update_fail; } @@ -216067,18 +226188,25 @@ static int dbpageUpdate( if( sqlite3_value_type(argv[3])!=SQLITE_BLOB || sqlite3_value_bytes(argv[3])!=szPage ){ - zErr = "bad page value"; - goto update_fail; + if( sqlite3_value_type(argv[3])==SQLITE_NULL && isInsert && pgno>1 ){ + /* "INSERT INTO dbpage($PGNO,NULL)" causes page number $PGNO and + ** all subsequent pages to be deleted. */ + pTab->iDbTrunc = iDb; + pgno--; + pTab->pgnoTrunc = pgno; + }else{ + zErr = "bad page value"; + goto update_fail; + } } pPager = sqlite3BtreePager(pBt); rc = sqlite3PagerGet(pPager, pgno, (DbPage**)&pDbPage, 0); if( rc==SQLITE_OK ){ const void *pData = sqlite3_value_blob(argv[3]); - assert( pData!=0 || pTab->db->mallocFailed ); - if( pData - && (rc = sqlite3PagerWrite(pDbPage))==SQLITE_OK - ){ - memcpy(sqlite3PagerGetData(pDbPage), pData, szPage); + if( (rc = sqlite3PagerWrite(pDbPage))==SQLITE_OK && pData ){ + unsigned char *aPage = sqlite3PagerGetData(pDbPage); + memcpy(aPage, pData, szPage); + pTab->pgnoTrunc = 0; } } sqlite3PagerUnref(pDbPage); @@ -216102,9 +226230,31 @@ static int dbpageBegin(sqlite3_vtab *pVtab){ Btree *pBt = db->aDb[i].pBt; if( pBt ) (void)sqlite3BtreeBeginTrans(pBt, 1, 0); } + pTab->pgnoTrunc = 0; return SQLITE_OK; } +/* Invoke sqlite3PagerTruncate() as necessary, just prior to COMMIT +*/ +static int dbpageSync(sqlite3_vtab *pVtab){ + DbpageTable *pTab = (DbpageTable *)pVtab; + if( pTab->pgnoTrunc>0 ){ + Btree *pBt = pTab->db->aDb[pTab->iDbTrunc].pBt; + Pager *pPager = sqlite3BtreePager(pBt); + sqlite3PagerTruncateImage(pPager, pTab->pgnoTrunc); + } + pTab->pgnoTrunc = 0; + return SQLITE_OK; +} + +/* Cancel any pending truncate. +*/ +static int dbpageRollbackTo(sqlite3_vtab *pVtab, int notUsed1){ + DbpageTable *pTab = (DbpageTable *)pVtab; + pTab->pgnoTrunc = 0; + (void)notUsed1; + return SQLITE_OK; +} /* ** Invoke this routine to register the "dbpage" virtual table module @@ -216126,15 +226276,16 @@ SQLITE_PRIVATE int sqlite3DbpageRegister(sqlite3 *db){ dbpageRowid, /* xRowid - read data */ dbpageUpdate, /* xUpdate */ dbpageBegin, /* xBegin */ - 0, /* xSync */ + dbpageSync, /* xSync */ 0, /* xCommit */ 0, /* xRollback */ 0, /* xFindMethod */ 0, /* xRename */ 0, /* xSavepoint */ 0, /* xRelease */ - 0, /* xRollbackTo */ - 0 /* xShadowName */ + dbpageRollbackTo, /* xRollbackTo */ + 0, /* xShadowName */ + 0 /* xIntegrity */ }; return sqlite3_create_module(db, "sqlite_dbpage", &dbpage_module, 0); } @@ -216171,6 +226322,8 @@ typedef struct SessionInput SessionInput; # endif #endif +#define SESSIONS_ROWID "_rowid_" + static int sessions_strm_chunk_size = SESSIONS_STRM_CHUNK_SIZE; typedef struct SessionHook SessionHook; @@ -216192,6 +226345,7 @@ struct sqlite3_session { int bEnable; /* True if currently recording */ int bIndirect; /* True if all changes are indirect */ int bAutoAttach; /* True to auto-attach tables */ + int bImplicitPK; /* True to handle tables with implicit PK */ int rc; /* Non-zero if an error has occurred */ void *pFilterCtx; /* First argument to pass to xTableFilter */ int (*xTableFilter)(void *pCtx, const char *zTab); @@ -216217,6 +226371,10 @@ struct SessionBuffer { ** input data. Input data may be supplied either as a single large buffer ** (e.g. sqlite3changeset_start()) or using a stream function (e.g. ** sqlite3changeset_start_strm()). +** +** bNoDiscard: +** If true, then the only time data is discarded is as a result of explicit +** sessionDiscardData() calls. Not within every sessionInputBuffer() call. */ struct SessionInput { int bNoDiscard; /* If true, do not discard in InputBuffer() */ @@ -216262,17 +226420,32 @@ struct sqlite3_changeset_iter { ** The data associated with each hash-table entry is a structure containing ** a subset of the initial values that the modified row contained at the ** start of the session. Or no initial values if the row was inserted. +** +** pDfltStmt: +** This is only used by the sqlite3changegroup_xxx() APIs, not by +** regular sqlite3_session objects. It is a SELECT statement that +** selects the default value for each table column. For example, +** if the table is +** +** CREATE TABLE xx(a DEFAULT 1, b, c DEFAULT 'abc') +** +** then this variable is the compiled version of: +** +** SELECT 1, NULL, 'abc' */ struct SessionTable { SessionTable *pNext; char *zName; /* Local name of table */ int nCol; /* Number of columns in table zName */ int bStat1; /* True if this is sqlite_stat1 */ + int bRowid; /* True if this table uses rowid for PK */ const char **azCol; /* Column names */ + const char **azDflt; /* Default value expressions */ u8 *abPK; /* Array of primary key flags */ int nEntry; /* Total number of entries in hash table */ int nChange; /* Size of apChange[] array */ SessionChange **apChange; /* Hash table buckets */ + sqlite3_stmt *pDfltStmt; }; /* @@ -216441,6 +226614,7 @@ struct SessionTable { struct SessionChange { u8 op; /* One of UPDATE, DELETE, INSERT */ u8 bIndirect; /* True if this change is "indirect" */ + u16 nRecordField; /* Number of fields in aRecord[] */ int nMaxSize; /* Max size of eventual changeset record */ int nRecord; /* Number of bytes in buffer aRecord[] */ u8 *aRecord; /* Buffer containing old.* record */ @@ -216466,7 +226640,7 @@ static int sessionVarintLen(int iVal){ ** Read a varint value from aBuf[] into *piVal. Return the number of ** bytes read. */ -static int sessionVarintGet(u8 *aBuf, int *piVal){ +static int sessionVarintGet(const u8 *aBuf, int *piVal){ return getVarint32(aBuf, *piVal); } @@ -216660,6 +226834,7 @@ static unsigned int sessionHashAppendType(unsigned int h, int eType){ */ static int sessionPreupdateHash( sqlite3_session *pSession, /* Session object that owns pTab */ + i64 iRowid, SessionTable *pTab, /* Session table handle */ int bNew, /* True to hash the new.* PK */ int *piHash, /* OUT: Hash value */ @@ -216668,48 +226843,53 @@ static int sessionPreupdateHash( unsigned int h = 0; /* Hash value to return */ int i; /* Used to iterate through columns */ - assert( *pbNullPK==0 ); - assert( pTab->nCol==pSession->hook.xCount(pSession->hook.pCtx) ); - for(i=0; inCol; i++){ - if( pTab->abPK[i] ){ - int rc; - int eType; - sqlite3_value *pVal; - - if( bNew ){ - rc = pSession->hook.xNew(pSession->hook.pCtx, i, &pVal); - }else{ - rc = pSession->hook.xOld(pSession->hook.pCtx, i, &pVal); - } - if( rc!=SQLITE_OK ) return rc; + if( pTab->bRowid ){ + assert( pTab->nCol-1==pSession->hook.xCount(pSession->hook.pCtx) ); + h = sessionHashAppendI64(h, iRowid); + }else{ + assert( *pbNullPK==0 ); + assert( pTab->nCol==pSession->hook.xCount(pSession->hook.pCtx) ); + for(i=0; inCol; i++){ + if( pTab->abPK[i] ){ + int rc; + int eType; + sqlite3_value *pVal; - eType = sqlite3_value_type(pVal); - h = sessionHashAppendType(h, eType); - if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){ - i64 iVal; - if( eType==SQLITE_INTEGER ){ - iVal = sqlite3_value_int64(pVal); + if( bNew ){ + rc = pSession->hook.xNew(pSession->hook.pCtx, i, &pVal); }else{ - double rVal = sqlite3_value_double(pVal); - assert( sizeof(iVal)==8 && sizeof(rVal)==8 ); - memcpy(&iVal, &rVal, 8); + rc = pSession->hook.xOld(pSession->hook.pCtx, i, &pVal); } - h = sessionHashAppendI64(h, iVal); - }else if( eType==SQLITE_TEXT || eType==SQLITE_BLOB ){ - const u8 *z; - int n; - if( eType==SQLITE_TEXT ){ - z = (const u8 *)sqlite3_value_text(pVal); + if( rc!=SQLITE_OK ) return rc; + + eType = sqlite3_value_type(pVal); + h = sessionHashAppendType(h, eType); + if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){ + i64 iVal; + if( eType==SQLITE_INTEGER ){ + iVal = sqlite3_value_int64(pVal); + }else{ + double rVal = sqlite3_value_double(pVal); + assert( sizeof(iVal)==8 && sizeof(rVal)==8 ); + memcpy(&iVal, &rVal, 8); + } + h = sessionHashAppendI64(h, iVal); + }else if( eType==SQLITE_TEXT || eType==SQLITE_BLOB ){ + const u8 *z; + int n; + if( eType==SQLITE_TEXT ){ + z = (const u8 *)sqlite3_value_text(pVal); + }else{ + z = (const u8 *)sqlite3_value_blob(pVal); + } + n = sqlite3_value_bytes(pVal); + if( !z && (eType!=SQLITE_BLOB || n>0) ) return SQLITE_NOMEM; + h = sessionHashAppendBlob(h, n, z); }else{ - z = (const u8 *)sqlite3_value_blob(pVal); + assert( eType==SQLITE_NULL ); + assert( pTab->bStat1==0 || i!=1 ); + *pbNullPK = 1; } - n = sqlite3_value_bytes(pVal); - if( !z && (eType!=SQLITE_BLOB || n>0) ) return SQLITE_NOMEM; - h = sessionHashAppendBlob(h, n, z); - }else{ - assert( eType==SQLITE_NULL ); - assert( pTab->bStat1==0 || i!=1 ); - *pbNullPK = 1; } } } @@ -216723,9 +226903,11 @@ static int sessionPreupdateHash( ** Return the number of bytes of space occupied by the value (including ** the type byte). */ -static int sessionSerialLen(u8 *a){ - int e = *a; +static int sessionSerialLen(const u8 *a){ + int e; int n; + assert( a!=0 ); + e = *a; if( e==0 || e==0xFF ) return 1; if( e==SQLITE_NULL ) return 1; if( e==SQLITE_INTEGER || e==SQLITE_FLOAT ) return 9; @@ -216992,6 +227174,7 @@ static int sessionMergeUpdate( */ static int sessionPreupdateEqual( sqlite3_session *pSession, /* Session object that owns SessionTable */ + i64 iRowid, /* Rowid value if pTab->bRowid */ SessionTable *pTab, /* Table associated with change */ SessionChange *pChange, /* Change to compare to */ int op /* Current pre-update operation */ @@ -216999,6 +227182,11 @@ static int sessionPreupdateEqual( int iCol; /* Used to iterate through columns */ u8 *a = pChange->aRecord; /* Cursor used to scan change record */ + if( pTab->bRowid ){ + if( a[0]!=SQLITE_INTEGER ) return 0; + return sessionGetI64(&a[1])==iRowid; + } + assert( op==SQLITE_INSERT || op==SQLITE_UPDATE || op==SQLITE_DELETE ); for(iCol=0; iColnCol; iCol++){ if( !pTab->abPK[iCol] ){ @@ -217021,6 +227209,7 @@ static int sessionPreupdateEqual( rc = pSession->hook.xOld(pSession->hook.pCtx, iCol, &pVal); } assert( rc==SQLITE_OK ); + (void)rc; /* Suppress warning about unused variable */ if( sqlite3_value_type(pVal)!=eType ) return 0; /* A SessionChange object never has a NULL value in a PK column */ @@ -217123,13 +227312,14 @@ static int sessionGrowHash( ** ** For example, if the table is declared as: ** -** CREATE TABLE tbl1(w, x, y, z, PRIMARY KEY(w, z)); +** CREATE TABLE tbl1(w, x DEFAULT 'abc', y, z, PRIMARY KEY(w, z)); ** -** Then the four output variables are populated as follows: +** Then the five output variables are populated as follows: ** ** *pnCol = 4 ** *pzTab = "tbl1" ** *pazCol = {"w", "x", "y", "z"} +** *pazDflt = {NULL, 'abc', NULL, NULL} ** *pabPK = {1, 0, 0, 1} ** ** All returned buffers are part of the same single allocation, which must @@ -217143,7 +227333,9 @@ static int sessionTableInfo( int *pnCol, /* OUT: number of columns */ const char **pzTab, /* OUT: Copy of zThis */ const char ***pazCol, /* OUT: Array of column names for table */ - u8 **pabPK /* OUT: Array of booleans - true for PK col */ + const char ***pazDflt, /* OUT: Array of default value expressions */ + u8 **pabPK, /* OUT: Array of booleans - true for PK col */ + int *pbRowid /* OUT: True if only PK is a rowid */ ){ char *zPragma; sqlite3_stmt *pStmt; @@ -217154,10 +227346,18 @@ static int sessionTableInfo( int i; u8 *pAlloc = 0; char **azCol = 0; + char **azDflt = 0; u8 *abPK = 0; + int bRowid = 0; /* Set to true to use rowid as PK */ assert( pazCol && pabPK ); + *pazCol = 0; + *pabPK = 0; + *pnCol = 0; + if( pzTab ) *pzTab = 0; + if( pazDflt ) *pazDflt = 0; + nThis = sqlite3Strlen30(zThis); if( nThis==12 && 0==sqlite3_stricmp("sqlite_stat1", zThis) ){ rc = sqlite3_table_column_metadata(db, zDb, zThis, 0, 0, 0, 0, 0, 0); @@ -217171,50 +227371,47 @@ static int sessionTableInfo( }else if( rc==SQLITE_ERROR ){ zPragma = sqlite3_mprintf(""); }else{ - *pazCol = 0; - *pabPK = 0; - *pnCol = 0; - if( pzTab ) *pzTab = 0; return rc; } }else{ zPragma = sqlite3_mprintf("PRAGMA '%q'.table_info('%q')", zDb, zThis); } if( !zPragma ){ - *pazCol = 0; - *pabPK = 0; - *pnCol = 0; - if( pzTab ) *pzTab = 0; return SQLITE_NOMEM; } rc = sqlite3_prepare_v2(db, zPragma, -1, &pStmt, 0); sqlite3_free(zPragma); if( rc!=SQLITE_OK ){ - *pazCol = 0; - *pabPK = 0; - *pnCol = 0; - if( pzTab ) *pzTab = 0; return rc; } nByte = nThis + 1; + bRowid = (pbRowid!=0); while( SQLITE_ROW==sqlite3_step(pStmt) ){ - nByte += sqlite3_column_bytes(pStmt, 1); + nByte += sqlite3_column_bytes(pStmt, 1); /* name */ + nByte += sqlite3_column_bytes(pStmt, 4); /* dflt_value */ nDbCol++; + if( sqlite3_column_int(pStmt, 5) ) bRowid = 0; /* pk */ } + if( nDbCol==0 ) bRowid = 0; + nDbCol += bRowid; + nByte += strlen(SESSIONS_ROWID); rc = sqlite3_reset(pStmt); if( rc==SQLITE_OK ){ - nByte += nDbCol * (sizeof(const char *) + sizeof(u8) + 1); + nByte += nDbCol * (sizeof(const char *)*2 + sizeof(u8) + 1 + 1); pAlloc = sessionMalloc64(pSession, nByte); if( pAlloc==0 ){ rc = SQLITE_NOMEM; + }else{ + memset(pAlloc, 0, nByte); } } if( rc==SQLITE_OK ){ azCol = (char **)pAlloc; - pAlloc = (u8 *)&azCol[nDbCol]; + azDflt = (char**)&azCol[nDbCol]; + pAlloc = (u8 *)&azDflt[nDbCol]; abPK = (u8 *)pAlloc; pAlloc = &abPK[nDbCol]; if( pzTab ){ @@ -217224,43 +227421,57 @@ static int sessionTableInfo( } i = 0; + if( bRowid ){ + size_t nName = strlen(SESSIONS_ROWID); + memcpy(pAlloc, SESSIONS_ROWID, nName+1); + azCol[i] = (char*)pAlloc; + pAlloc += nName+1; + abPK[i] = 1; + i++; + } while( SQLITE_ROW==sqlite3_step(pStmt) ){ int nName = sqlite3_column_bytes(pStmt, 1); + int nDflt = sqlite3_column_bytes(pStmt, 4); const unsigned char *zName = sqlite3_column_text(pStmt, 1); + const unsigned char *zDflt = sqlite3_column_text(pStmt, 4); + if( zName==0 ) break; memcpy(pAlloc, zName, nName+1); azCol[i] = (char *)pAlloc; pAlloc += nName+1; + if( zDflt ){ + memcpy(pAlloc, zDflt, nDflt+1); + azDflt[i] = (char *)pAlloc; + pAlloc += nDflt+1; + }else{ + azDflt[i] = 0; + } abPK[i] = sqlite3_column_int(pStmt, 5); i++; } rc = sqlite3_reset(pStmt); - } /* If successful, populate the output variables. Otherwise, zero them and ** free any allocation made. An error code will be returned in this case. */ if( rc==SQLITE_OK ){ - *pazCol = (const char **)azCol; + *pazCol = (const char**)azCol; + if( pazDflt ) *pazDflt = (const char**)azDflt; *pabPK = abPK; *pnCol = nDbCol; }else{ - *pazCol = 0; - *pabPK = 0; - *pnCol = 0; - if( pzTab ) *pzTab = 0; sessionFree(pSession, azCol); } + if( pbRowid ) *pbRowid = bRowid; sqlite3_finalize(pStmt); return rc; } /* -** This function is only called from within a pre-update handler for a -** write to table pTab, part of session pSession. If this is the first -** write to this table, initalize the SessionTable.nCol, azCol[] and -** abPK[] arrays accordingly. +** This function is called to initialize the SessionTable.nCol, azCol[] +** abPK[] and azDflt[] members of SessionTable object pTab. If these +** fields are already initilialized, this function is a no-op. ** ** If an error occurs, an error code is stored in sqlite3_session.rc and ** non-zero returned. Or, if no error occurs but the table has no primary @@ -217268,14 +227479,22 @@ static int sessionTableInfo( ** indicate that updates on this table should be ignored. SessionTable.abPK ** is set to NULL in this case. */ -static int sessionInitTable(sqlite3_session *pSession, SessionTable *pTab){ +static int sessionInitTable( + sqlite3_session *pSession, /* Optional session handle */ + SessionTable *pTab, /* Table object to initialize */ + sqlite3 *db, /* Database handle to read schema from */ + const char *zDb /* Name of db - "main", "temp" etc. */ +){ + int rc = SQLITE_OK; + if( pTab->nCol==0 ){ u8 *abPK; assert( pTab->azCol==0 || pTab->abPK==0 ); - pSession->rc = sessionTableInfo(pSession, pSession->db, pSession->zDb, - pTab->zName, &pTab->nCol, 0, &pTab->azCol, &abPK + rc = sessionTableInfo(pSession, db, zDb, + pTab->zName, &pTab->nCol, 0, &pTab->azCol, &pTab->azDflt, &abPK, + ((pSession==0 || pSession->bImplicitPK) ? &pTab->bRowid : 0) ); - if( pSession->rc==SQLITE_OK ){ + if( rc==SQLITE_OK ){ int i; for(i=0; inCol; i++){ if( abPK[i] ){ @@ -217287,14 +227506,321 @@ static int sessionInitTable(sqlite3_session *pSession, SessionTable *pTab){ pTab->bStat1 = 1; } - if( pSession->bEnableSize ){ + if( pSession && pSession->bEnableSize ){ pSession->nMaxChangesetSize += ( 1 + sessionVarintLen(pTab->nCol) + pTab->nCol + strlen(pTab->zName)+1 ); } } } - return (pSession->rc || pTab->abPK==0); + + if( pSession ){ + pSession->rc = rc; + return (rc || pTab->abPK==0); + } + return rc; +} + +/* +** Re-initialize table object pTab. +*/ +static int sessionReinitTable(sqlite3_session *pSession, SessionTable *pTab){ + int nCol = 0; + const char **azCol = 0; + const char **azDflt = 0; + u8 *abPK = 0; + int bRowid = 0; + + assert( pSession->rc==SQLITE_OK ); + + pSession->rc = sessionTableInfo(pSession, pSession->db, pSession->zDb, + pTab->zName, &nCol, 0, &azCol, &azDflt, &abPK, + (pSession->bImplicitPK ? &bRowid : 0) + ); + if( pSession->rc==SQLITE_OK ){ + if( pTab->nCol>nCol || pTab->bRowid!=bRowid ){ + pSession->rc = SQLITE_SCHEMA; + }else{ + int ii; + int nOldCol = pTab->nCol; + for(ii=0; iinCol ){ + if( pTab->abPK[ii]!=abPK[ii] ){ + pSession->rc = SQLITE_SCHEMA; + } + }else if( abPK[ii] ){ + pSession->rc = SQLITE_SCHEMA; + } + } + + if( pSession->rc==SQLITE_OK ){ + const char **a = pTab->azCol; + pTab->azCol = azCol; + pTab->nCol = nCol; + pTab->azDflt = azDflt; + pTab->abPK = abPK; + azCol = a; + } + if( pSession->bEnableSize ){ + pSession->nMaxChangesetSize += (nCol - nOldCol); + pSession->nMaxChangesetSize += sessionVarintLen(nCol); + pSession->nMaxChangesetSize -= sessionVarintLen(nOldCol); + } + } + } + + sqlite3_free((char*)azCol); + return pSession->rc; +} + +/* +** Session-change object (*pp) contains an old.* record with fewer than +** nCol fields. This function updates it with the default values for +** the missing fields. +*/ +static void sessionUpdateOneChange( + sqlite3_session *pSession, /* For memory accounting */ + int *pRc, /* IN/OUT: Error code */ + SessionChange **pp, /* IN/OUT: Change object to update */ + int nCol, /* Number of columns now in table */ + sqlite3_stmt *pDflt /* SELECT */ +){ + SessionChange *pOld = *pp; + + while( pOld->nRecordFieldnRecordField; + int eType = sqlite3_column_type(pDflt, iField); + switch( eType ){ + case SQLITE_NULL: + nIncr = 1; + break; + case SQLITE_INTEGER: + case SQLITE_FLOAT: + nIncr = 9; + break; + default: { + int n = sqlite3_column_bytes(pDflt, iField); + nIncr = 1 + sessionVarintLen(n) + n; + assert( eType==SQLITE_TEXT || eType==SQLITE_BLOB ); + break; + } + } + + nByte = nIncr + (sizeof(SessionChange) + pOld->nRecord); + pNew = sessionMalloc64(pSession, nByte); + if( pNew==0 ){ + *pRc = SQLITE_NOMEM; + return; + }else{ + memcpy(pNew, pOld, sizeof(SessionChange)); + pNew->aRecord = (u8*)&pNew[1]; + memcpy(pNew->aRecord, pOld->aRecord, pOld->nRecord); + pNew->aRecord[pNew->nRecord++] = (u8)eType; + switch( eType ){ + case SQLITE_INTEGER: { + i64 iVal = sqlite3_column_int64(pDflt, iField); + sessionPutI64(&pNew->aRecord[pNew->nRecord], iVal); + pNew->nRecord += 8; + break; + } + + case SQLITE_FLOAT: { + double rVal = sqlite3_column_double(pDflt, iField); + i64 iVal = 0; + memcpy(&iVal, &rVal, sizeof(rVal)); + sessionPutI64(&pNew->aRecord[pNew->nRecord], iVal); + pNew->nRecord += 8; + break; + } + + case SQLITE_TEXT: { + int n = sqlite3_column_bytes(pDflt, iField); + const char *z = (const char*)sqlite3_column_text(pDflt, iField); + pNew->nRecord += sessionVarintPut(&pNew->aRecord[pNew->nRecord], n); + memcpy(&pNew->aRecord[pNew->nRecord], z, n); + pNew->nRecord += n; + break; + } + + case SQLITE_BLOB: { + int n = sqlite3_column_bytes(pDflt, iField); + const u8 *z = (const u8*)sqlite3_column_blob(pDflt, iField); + pNew->nRecord += sessionVarintPut(&pNew->aRecord[pNew->nRecord], n); + memcpy(&pNew->aRecord[pNew->nRecord], z, n); + pNew->nRecord += n; + break; + } + + default: + assert( eType==SQLITE_NULL ); + break; + } + + sessionFree(pSession, pOld); + *pp = pOld = pNew; + pNew->nRecordField++; + pNew->nMaxSize += nIncr; + if( pSession ){ + pSession->nMaxChangesetSize += nIncr; + } + } + } +} + +/* +** Ensure that there is room in the buffer to append nByte bytes of data. +** If not, use sqlite3_realloc() to grow the buffer so that there is. +** +** If successful, return zero. Otherwise, if an OOM condition is encountered, +** set *pRc to SQLITE_NOMEM and return non-zero. +*/ +static int sessionBufferGrow(SessionBuffer *p, i64 nByte, int *pRc){ +#define SESSION_MAX_BUFFER_SZ (0x7FFFFF00 - 1) + i64 nReq = p->nBuf + nByte; + if( *pRc==SQLITE_OK && nReq>p->nAlloc ){ + u8 *aNew; + i64 nNew = p->nAlloc ? p->nAlloc : 128; + + do { + nNew = nNew*2; + }while( nNewSESSION_MAX_BUFFER_SZ ){ + nNew = SESSION_MAX_BUFFER_SZ; + if( nNewaBuf, nNew); + if( 0==aNew ){ + *pRc = SQLITE_NOMEM; + }else{ + p->aBuf = aNew; + p->nAlloc = nNew; + } + } + return (*pRc!=SQLITE_OK); +} + + +/* +** This function is a no-op if *pRc is other than SQLITE_OK when it is +** called. Otherwise, append a string to the buffer. All bytes in the string +** up to (but not including) the nul-terminator are written to the buffer. +** +** If an OOM condition is encountered, set *pRc to SQLITE_NOMEM before +** returning. +*/ +static void sessionAppendStr( + SessionBuffer *p, + const char *zStr, + int *pRc +){ + int nStr = sqlite3Strlen30(zStr); + if( 0==sessionBufferGrow(p, nStr+1, pRc) ){ + memcpy(&p->aBuf[p->nBuf], zStr, nStr); + p->nBuf += nStr; + p->aBuf[p->nBuf] = 0x00; + } +} + +/* +** Format a string using printf() style formatting and then append it to the +** buffer using sessionAppendString(). +*/ +static void sessionAppendPrintf( + SessionBuffer *p, /* Buffer to append to */ + int *pRc, + const char *zFmt, + ... +){ + if( *pRc==SQLITE_OK ){ + char *zApp = 0; + va_list ap; + va_start(ap, zFmt); + zApp = sqlite3_vmprintf(zFmt, ap); + if( zApp==0 ){ + *pRc = SQLITE_NOMEM; + }else{ + sessionAppendStr(p, zApp, pRc); + } + va_end(ap); + sqlite3_free(zApp); + } +} + +/* +** Prepare a statement against database handle db that SELECTs a single +** row containing the default values for each column in table pTab. For +** example, if pTab is declared as: +** +** CREATE TABLE pTab(a PRIMARY KEY, b DEFAULT 123, c DEFAULT 'abcd'); +** +** Then this function prepares and returns the SQL statement: +** +** SELECT NULL, 123, 'abcd'; +*/ +static int sessionPrepareDfltStmt( + sqlite3 *db, /* Database handle */ + SessionTable *pTab, /* Table to prepare statement for */ + sqlite3_stmt **ppStmt /* OUT: Statement handle */ +){ + SessionBuffer sql = {0,0,0}; + int rc = SQLITE_OK; + const char *zSep = " "; + int ii = 0; + + *ppStmt = 0; + sessionAppendPrintf(&sql, &rc, "SELECT"); + for(ii=0; iinCol; ii++){ + const char *zDflt = pTab->azDflt[ii] ? pTab->azDflt[ii] : "NULL"; + sessionAppendPrintf(&sql, &rc, "%s%s", zSep, zDflt); + zSep = ", "; + } + if( rc==SQLITE_OK ){ + rc = sqlite3_prepare_v2(db, (const char*)sql.aBuf, -1, ppStmt, 0); + } + sqlite3_free(sql.aBuf); + + return rc; +} + +/* +** Table pTab has one or more existing change-records with old.* records +** with fewer than pTab->nCol columns. This function updates all such +** change-records with the default values for the missing columns. +*/ +static int sessionUpdateChanges(sqlite3_session *pSession, SessionTable *pTab){ + sqlite3_stmt *pStmt = 0; + int rc = pSession->rc; + + rc = sessionPrepareDfltStmt(pSession->db, pTab, &pStmt); + if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + int ii = 0; + SessionChange **pp = 0; + for(ii=0; iinChange; ii++){ + for(pp=&pTab->apChange[ii]; *pp; pp=&((*pp)->pNext)){ + if( (*pp)->nRecordField!=pTab->nCol ){ + sessionUpdateOneChange(pSession, &rc, pp, pTab->nCol, pStmt); + } + } + } + } + + pSession->rc = rc; + rc = sqlite3_finalize(pStmt); + if( pSession->rc==SQLITE_OK ) pSession->rc = rc; + return pSession->rc; } /* @@ -217345,6 +227871,7 @@ static int sessionUpdateMaxSize( ){ i64 nNew = 2; if( pC->op==SQLITE_INSERT ){ + if( pTab->bRowid ) nNew += 9; if( op!=SQLITE_DELETE ){ int ii; for(ii=0; iinCol; ii++){ @@ -217361,12 +227888,16 @@ static int sessionUpdateMaxSize( }else{ int ii; u8 *pCsr = pC->aRecord; - for(ii=0; iinCol; ii++){ + if( pTab->bRowid ){ + nNew += 9 + 1; + pCsr += 9; + } + for(ii=pTab->bRowid; iinCol; ii++){ int bChanged = 1; int nOld = 0; int eType; sqlite3_value *p = 0; - pSession->hook.xNew(pSession->hook.pCtx, ii, &p); + pSession->hook.xNew(pSession->hook.pCtx, ii-pTab->bRowid, &p); if( p==0 ){ return SQLITE_NOMEM; } @@ -217445,22 +227976,29 @@ static int sessionUpdateMaxSize( */ static void sessionPreupdateOneChange( int op, /* One of SQLITE_UPDATE, INSERT, DELETE */ + i64 iRowid, sqlite3_session *pSession, /* Session object pTab is attached to */ SessionTable *pTab /* Table that change applies to */ ){ int iHash; int bNull = 0; int rc = SQLITE_OK; + int nExpect = 0; SessionStat1Ctx stat1 = {{0,0,0,0,0},0}; if( pSession->rc ) return; /* Load table details if required */ - if( sessionInitTable(pSession, pTab) ) return; + if( sessionInitTable(pSession, pTab, pSession->db, pSession->zDb) ) return; /* Check the number of columns in this xPreUpdate call matches the ** number of columns in the table. */ - if( pTab->nCol!=pSession->hook.xCount(pSession->hook.pCtx) ){ + nExpect = pSession->hook.xCount(pSession->hook.pCtx); + if( (pTab->nCol-pTab->bRowid)nCol-pTab->bRowid)!=nExpect ){ pSession->rc = SQLITE_SCHEMA; return; } @@ -217493,14 +228031,16 @@ static void sessionPreupdateOneChange( /* Calculate the hash-key for this change. If the primary key of the row ** includes a NULL value, exit early. Such changes are ignored by the ** session module. */ - rc = sessionPreupdateHash(pSession, pTab, op==SQLITE_INSERT, &iHash, &bNull); + rc = sessionPreupdateHash( + pSession, iRowid, pTab, op==SQLITE_INSERT, &iHash, &bNull + ); if( rc!=SQLITE_OK ) goto error_out; if( bNull==0 ){ /* Search the hash table for an existing record for this row. */ SessionChange *pC; for(pC=pTab->apChange[iHash]; pC; pC=pC->pNext){ - if( sessionPreupdateEqual(pSession, pTab, pC, op) ) break; + if( sessionPreupdateEqual(pSession, iRowid, pTab, pC, op) ) break; } if( pC==0 ){ @@ -217515,24 +228055,30 @@ static void sessionPreupdateOneChange( /* Figure out how large an allocation is required */ nByte = sizeof(SessionChange); - for(i=0; inCol; i++){ + for(i=0; i<(pTab->nCol-pTab->bRowid); i++){ sqlite3_value *p = 0; if( op!=SQLITE_INSERT ){ - TESTONLY(int trc = ) pSession->hook.xOld(pSession->hook.pCtx, i, &p); - assert( trc==SQLITE_OK ); + /* This may fail if the column has a non-NULL default and was added + ** using ALTER TABLE ADD COLUMN after this record was created. */ + rc = pSession->hook.xOld(pSession->hook.pCtx, i, &p); }else if( pTab->abPK[i] ){ TESTONLY(int trc = ) pSession->hook.xNew(pSession->hook.pCtx, i, &p); assert( trc==SQLITE_OK ); } - /* This may fail if SQLite value p contains a utf-16 string that must - ** be converted to utf-8 and an OOM error occurs while doing so. */ - rc = sessionSerializeValue(0, p, &nByte); + if( rc==SQLITE_OK ){ + /* This may fail if SQLite value p contains a utf-16 string that must + ** be converted to utf-8 and an OOM error occurs while doing so. */ + rc = sessionSerializeValue(0, p, &nByte); + } if( rc!=SQLITE_OK ) goto error_out; } + if( pTab->bRowid ){ + nByte += 9; /* Size of rowid field - an integer */ + } /* Allocate the change object */ - pC = (SessionChange *)sessionMalloc64(pSession, nByte); + pC = (SessionChange*)sessionMalloc64(pSession, nByte); if( !pC ){ rc = SQLITE_NOMEM; goto error_out; @@ -217546,7 +228092,12 @@ static void sessionPreupdateOneChange( ** required values and encodings have already been cached in memory. ** It is not possible for an OOM to occur in this block. */ nByte = 0; - for(i=0; inCol; i++){ + if( pTab->bRowid ){ + pC->aRecord[0] = SQLITE_INTEGER; + sessionPutI64(&pC->aRecord[1], iRowid); + nByte = 9; + } + for(i=0; i<(pTab->nCol-pTab->bRowid); i++){ sqlite3_value *p = 0; if( op!=SQLITE_INSERT ){ pSession->hook.xOld(pSession->hook.pCtx, i, &p); @@ -217560,6 +228111,7 @@ static void sessionPreupdateOneChange( if( pSession->bIndirect || pSession->hook.xDepth(pSession->hook.pCtx) ){ pC->bIndirect = 1; } + pC->nRecordField = pTab->nCol; pC->nRecord = nByte; pC->op = op; pC->pNext = pTab->apChange[iHash]; @@ -217661,9 +228213,10 @@ static void xPreUpdate( pSession->rc = sessionFindTable(pSession, zName, &pTab); if( pTab ){ assert( pSession->rc==SQLITE_OK ); - sessionPreupdateOneChange(op, pSession, pTab); + assert( op==SQLITE_UPDATE || iKey1==iKey2 ); + sessionPreupdateOneChange(op, iKey1, pSession, pTab); if( op==SQLITE_UPDATE ){ - sessionPreupdateOneChange(SQLITE_INSERT, pSession, pTab); + sessionPreupdateOneChange(SQLITE_INSERT, iKey2, pSession, pTab); } } } @@ -217702,6 +228255,7 @@ static void sessionPreupdateHooks( typedef struct SessionDiffCtx SessionDiffCtx; struct SessionDiffCtx { sqlite3_stmt *pStmt; + int bRowid; int nOldOff; }; @@ -217710,17 +228264,17 @@ struct SessionDiffCtx { */ static int sessionDiffOld(void *pCtx, int iVal, sqlite3_value **ppVal){ SessionDiffCtx *p = (SessionDiffCtx*)pCtx; - *ppVal = sqlite3_column_value(p->pStmt, iVal+p->nOldOff); + *ppVal = sqlite3_column_value(p->pStmt, iVal+p->nOldOff+p->bRowid); return SQLITE_OK; } static int sessionDiffNew(void *pCtx, int iVal, sqlite3_value **ppVal){ SessionDiffCtx *p = (SessionDiffCtx*)pCtx; - *ppVal = sqlite3_column_value(p->pStmt, iVal); + *ppVal = sqlite3_column_value(p->pStmt, iVal+p->bRowid); return SQLITE_OK; } static int sessionDiffCount(void *pCtx){ SessionDiffCtx *p = (SessionDiffCtx*)pCtx; - return p->nOldOff ? p->nOldOff : sqlite3_column_count(p->pStmt); + return (p->nOldOff ? p->nOldOff : sqlite3_column_count(p->pStmt)) - p->bRowid; } static int sessionDiffDepth(void *pCtx){ (void)pCtx; @@ -217799,14 +228353,16 @@ static char *sessionExprCompareOther( static char *sessionSelectFindNew( const char *zDb1, /* Pick rows in this db only */ const char *zDb2, /* But not in this one */ + int bRowid, const char *zTbl, /* Table name */ const char *zExpr ){ + const char *zSel = (bRowid ? SESSIONS_ROWID ", *" : "*"); char *zRet = sqlite3_mprintf( - "SELECT * FROM \"%w\".\"%w\" WHERE NOT EXISTS (" + "SELECT %s FROM \"%w\".\"%w\" WHERE NOT EXISTS (" " SELECT 1 FROM \"%w\".\"%w\" WHERE %s" ")", - zDb1, zTbl, zDb2, zTbl, zExpr + zSel, zDb1, zTbl, zDb2, zTbl, zExpr ); return zRet; } @@ -217820,7 +228376,9 @@ static int sessionDiffFindNew( char *zExpr ){ int rc = SQLITE_OK; - char *zStmt = sessionSelectFindNew(zDb1, zDb2, pTab->zName,zExpr); + char *zStmt = sessionSelectFindNew( + zDb1, zDb2, pTab->bRowid, pTab->zName, zExpr + ); if( zStmt==0 ){ rc = SQLITE_NOMEM; @@ -217831,8 +228389,10 @@ static int sessionDiffFindNew( SessionDiffCtx *pDiffCtx = (SessionDiffCtx*)pSession->hook.pCtx; pDiffCtx->pStmt = pStmt; pDiffCtx->nOldOff = 0; + pDiffCtx->bRowid = pTab->bRowid; while( SQLITE_ROW==sqlite3_step(pStmt) ){ - sessionPreupdateOneChange(op, pSession, pTab); + i64 iRowid = (pTab->bRowid ? sqlite3_column_int64(pStmt, 0) : 0); + sessionPreupdateOneChange(op, iRowid, pSession, pTab); } rc = sqlite3_finalize(pStmt); } @@ -217842,6 +228402,27 @@ static int sessionDiffFindNew( return rc; } +/* +** Return a comma-separated list of the fully-qualified (with both database +** and table name) column names from table pTab. e.g. +** +** "main"."t1"."a", "main"."t1"."b", "main"."t1"."c" +*/ +static char *sessionAllCols( + const char *zDb, + SessionTable *pTab +){ + int ii; + char *zRet = 0; + for(ii=0; iinCol; ii++){ + zRet = sqlite3_mprintf("%z%s\"%w\".\"%w\".\"%w\"", + zRet, (zRet ? ", " : ""), zDb, pTab->zName, pTab->azCol[ii] + ); + if( !zRet ) break; + } + return zRet; +} + static int sessionDiffFindModified( sqlite3_session *pSession, SessionTable *pTab, @@ -217856,11 +228437,13 @@ static int sessionDiffFindModified( if( zExpr2==0 ){ rc = SQLITE_NOMEM; }else{ + char *z1 = sessionAllCols(pSession->zDb, pTab); + char *z2 = sessionAllCols(zFrom, pTab); char *zStmt = sqlite3_mprintf( - "SELECT * FROM \"%w\".\"%w\", \"%w\".\"%w\" WHERE %s AND (%z)", - pSession->zDb, pTab->zName, zFrom, pTab->zName, zExpr, zExpr2 + "SELECT %s,%s FROM \"%w\".\"%w\", \"%w\".\"%w\" WHERE %s AND (%z)", + z1, z2, pSession->zDb, pTab->zName, zFrom, pTab->zName, zExpr, zExpr2 ); - if( zStmt==0 ){ + if( zStmt==0 || z1==0 || z2==0 ){ rc = SQLITE_NOMEM; }else{ sqlite3_stmt *pStmt; @@ -217871,12 +228454,15 @@ static int sessionDiffFindModified( pDiffCtx->pStmt = pStmt; pDiffCtx->nOldOff = pTab->nCol; while( SQLITE_ROW==sqlite3_step(pStmt) ){ - sessionPreupdateOneChange(SQLITE_UPDATE, pSession, pTab); + i64 iRowid = (pTab->bRowid ? sqlite3_column_int64(pStmt, 0) : 0); + sessionPreupdateOneChange(SQLITE_UPDATE, iRowid, pSession, pTab); } rc = sqlite3_finalize(pStmt); } - sqlite3_free(zStmt); } + sqlite3_free(zStmt); + sqlite3_free(z1); + sqlite3_free(z2); } return rc; @@ -217905,7 +228491,7 @@ SQLITE_API int sqlite3session_diff( /* Locate and if necessary initialize the target table object */ rc = sessionFindTable(pSession, zTbl, &pTo); if( pTo==0 ) goto diff_out; - if( sessionInitTable(pSession, pTo) ){ + if( sessionInitTable(pSession, pTo, pSession->db, pSession->zDb) ){ rc = pSession->rc; goto diff_out; } @@ -217915,9 +228501,12 @@ SQLITE_API int sqlite3session_diff( int bHasPk = 0; int bMismatch = 0; int nCol; /* Columns in zFrom.zTbl */ + int bRowid = 0; u8 *abPK; const char **azCol = 0; - rc = sessionTableInfo(0, db, zFrom, zTbl, &nCol, 0, &azCol, &abPK); + rc = sessionTableInfo(0, db, zFrom, zTbl, &nCol, 0, &azCol, 0, &abPK, + pSession->bImplicitPK ? &bRowid : 0 + ); if( rc==SQLITE_OK ){ if( pTo->nCol!=nCol ){ bMismatch = 1; @@ -218030,6 +228619,7 @@ static void sessionDeleteTable(sqlite3_session *pSession, SessionTable *pList){ sessionFree(pSession, p); } } + sqlite3_finalize(pTab->pDfltStmt); sessionFree(pSession, (char*)pTab->azCol); /* cast works around VC++ bug */ sessionFree(pSession, pTab->apChange); sessionFree(pSession, pTab); @@ -218062,9 +228652,7 @@ SQLITE_API void sqlite3session_delete(sqlite3_session *pSession){ ** associated hash-tables. */ sessionDeleteTable(pSession, pSession->pTable); - /* Assert that all allocations have been freed and then free the - ** session object itself. */ - assert( pSession->nMalloc==0 ); + /* Free the session object. */ sqlite3_free(pSession); } @@ -218135,48 +228723,6 @@ SQLITE_API int sqlite3session_attach( return rc; } -/* -** Ensure that there is room in the buffer to append nByte bytes of data. -** If not, use sqlite3_realloc() to grow the buffer so that there is. -** -** If successful, return zero. Otherwise, if an OOM condition is encountered, -** set *pRc to SQLITE_NOMEM and return non-zero. -*/ -static int sessionBufferGrow(SessionBuffer *p, i64 nByte, int *pRc){ -#define SESSION_MAX_BUFFER_SZ (0x7FFFFF00 - 1) - i64 nReq = p->nBuf + nByte; - if( *pRc==SQLITE_OK && nReq>p->nAlloc ){ - u8 *aNew; - i64 nNew = p->nAlloc ? p->nAlloc : 128; - - do { - nNew = nNew*2; - }while( nNewSESSION_MAX_BUFFER_SZ ){ - nNew = SESSION_MAX_BUFFER_SZ; - if( nNewaBuf, nNew); - if( 0==aNew ){ - *pRc = SQLITE_NOMEM; - }else{ - p->aBuf = aNew; - p->nAlloc = nNew; - } - } - return (*pRc!=SQLITE_OK); -} - /* ** Append the value passed as the second argument to the buffer passed ** as the first. @@ -218245,26 +228791,6 @@ static void sessionAppendBlob( } } -/* -** This function is a no-op if *pRc is other than SQLITE_OK when it is -** called. Otherwise, append a string to the buffer. All bytes in the string -** up to (but not including) the nul-terminator are written to the buffer. -** -** If an OOM condition is encountered, set *pRc to SQLITE_NOMEM before -** returning. -*/ -static void sessionAppendStr( - SessionBuffer *p, - const char *zStr, - int *pRc -){ - int nStr = sqlite3Strlen30(zStr); - if( 0==sessionBufferGrow(p, nStr, pRc) ){ - memcpy(&p->aBuf[p->nBuf], zStr, nStr); - p->nBuf += nStr; - } -} - /* ** This function is a no-op if *pRc is other than SQLITE_OK when it is ** called. Otherwise, append the string representation of integer iVal @@ -218297,7 +228823,7 @@ static void sessionAppendIdent( const char *zStr, /* String to quote, escape and append */ int *pRc /* IN/OUT: Error code */ ){ - int nStr = sqlite3Strlen30(zStr)*2 + 2 + 1; + int nStr = sqlite3Strlen30(zStr)*2 + 2 + 2; if( 0==sessionBufferGrow(p, nStr, pRc) ){ char *zOut = (char *)&p->aBuf[p->nBuf]; const char *zIn = zStr; @@ -218308,6 +228834,7 @@ static void sessionAppendIdent( } *zOut++ = '"'; p->nBuf = (int)((u8 *)zOut - p->aBuf); + p->aBuf[p->nBuf] = 0x00; } } @@ -218443,7 +228970,7 @@ static int sessionAppendUpdate( /* If at least one field has been modified, this is not a no-op. */ if( bChanged ) bNoop = 0; - /* Add a field to the old.* record. This is omitted if this modules is + /* Add a field to the old.* record. This is omitted if this module is ** currently generating a patchset. */ if( bPatchset==0 ){ if( bChanged || abPK[i] ){ @@ -218532,12 +229059,20 @@ static int sessionAppendDelete( ** Formulate and prepare a SELECT statement to retrieve a row from table ** zTab in database zDb based on its primary key. i.e. ** -** SELECT * FROM zDb.zTab WHERE pk1 = ? AND pk2 = ? AND ... +** SELECT *, FROM zDb.zTab WHERE (pk1, pk2,...) IS (?1, ?2,...) +** +** where is: +** +** 1 AND (?A OR ?1 IS ) AND ... +** +** for each non-pk . */ static int sessionSelectStmt( sqlite3 *db, /* Database handle */ + int bIgnoreNoop, const char *zDb, /* Database name */ const char *zTab, /* Table name */ + int bRowid, int nCol, /* Number of columns in table */ const char **azCol, /* Names of table columns */ u8 *abPK, /* PRIMARY KEY array */ @@ -218545,8 +229080,50 @@ static int sessionSelectStmt( ){ int rc = SQLITE_OK; char *zSql = 0; + const char *zSep = ""; + const char *zCols = bRowid ? SESSIONS_ROWID ", *" : "*"; int nSql = -1; + int i; + + SessionBuffer nooptest = {0, 0, 0}; + SessionBuffer pkfield = {0, 0, 0}; + SessionBuffer pkvar = {0, 0, 0}; + + sessionAppendStr(&nooptest, ", 1", &rc); + + if( 0==sqlite3_stricmp("sqlite_stat1", zTab) ){ + sessionAppendStr(&nooptest, " AND (?6 OR ?3 IS stat)", &rc); + sessionAppendStr(&pkfield, "tbl, idx", &rc); + sessionAppendStr(&pkvar, + "?1, (CASE WHEN ?2=X'' THEN NULL ELSE ?2 END)", &rc + ); + zCols = "tbl, ?2, stat"; + }else{ + for(i=0; ipTable; rc==SQLITE_OK && pTab; pTab=pTab->pNext){ if( pTab->nEntry ){ const char *zName = pTab->zName; - int nCol = 0; /* Number of columns in table */ - u8 *abPK = 0; /* Primary key array */ - const char **azCol = 0; /* Table columns */ int i; /* Used to iterate through hash buckets */ sqlite3_stmt *pSel = 0; /* SELECT statement to query table pTab */ int nRewind = buf.nBuf; /* Initial size of write buffer */ int nNoop; /* Size of buffer after writing tbl header */ + int nOldCol = pTab->nCol; /* Check the table schema is still Ok. */ - rc = sessionTableInfo(0, db, pSession->zDb, zName, &nCol, 0,&azCol,&abPK); - if( !rc && (pTab->nCol!=nCol || memcmp(abPK, pTab->abPK, nCol)) ){ - rc = SQLITE_SCHEMA; + rc = sessionReinitTable(pSession, pTab); + if( rc==SQLITE_OK && pTab->nCol!=nOldCol ){ + rc = sessionUpdateChanges(pSession, pTab); } /* Write a table header */ @@ -218738,8 +229316,9 @@ static int sessionGenerateChangeset( /* Build and compile a statement to execute: */ if( rc==SQLITE_OK ){ - rc = sessionSelectStmt( - db, pSession->zDb, zName, nCol, azCol, abPK, &pSel); + rc = sessionSelectStmt(db, 0, pSession->zDb, + zName, pTab->bRowid, pTab->nCol, pTab->azCol, pTab->abPK, &pSel + ); } nNoop = buf.nBuf; @@ -218747,22 +229326,22 @@ static int sessionGenerateChangeset( SessionChange *p; /* Used to iterate through changes */ for(p=pTab->apChange[i]; rc==SQLITE_OK && p; p=p->pNext){ - rc = sessionSelectBind(pSel, nCol, abPK, p); + rc = sessionSelectBind(pSel, pTab->nCol, pTab->abPK, p); if( rc!=SQLITE_OK ) continue; if( sqlite3_step(pSel)==SQLITE_ROW ){ if( p->op==SQLITE_INSERT ){ int iCol; sessionAppendByte(&buf, SQLITE_INSERT, &rc); sessionAppendByte(&buf, p->bIndirect, &rc); - for(iCol=0; iColnCol; iCol++){ sessionAppendCol(&buf, pSel, iCol, &rc); } }else{ - assert( abPK!=0 ); /* Because sessionSelectStmt() returned ok */ - rc = sessionAppendUpdate(&buf, bPatchset, pSel, p, abPK); + assert( pTab->abPK!=0 ); + rc = sessionAppendUpdate(&buf, bPatchset, pSel, p, pTab->abPK); } }else if( p->op!=SQLITE_INSERT ){ - rc = sessionAppendDelete(&buf, bPatchset, p, nCol, abPK); + rc = sessionAppendDelete(&buf, bPatchset, p, pTab->nCol,pTab->abPK); } if( rc==SQLITE_OK ){ rc = sqlite3_reset(pSel); @@ -218787,7 +229366,6 @@ static int sessionGenerateChangeset( if( buf.nBuf==nNoop ){ buf.nBuf = nRewind; } - sqlite3_free((char*)azCol); /* cast works around VC++ bug */ } } @@ -218822,7 +229400,7 @@ SQLITE_API int sqlite3session_changeset( int rc; if( pnChangeset==0 || ppChangeset==0 ) return SQLITE_MISUSE; - rc = sessionGenerateChangeset(pSession, 0, 0, 0, pnChangeset,ppChangeset); + rc = sessionGenerateChangeset(pSession, 0, 0, 0, pnChangeset, ppChangeset); assert( rc || pnChangeset==0 || pSession->bEnableSize==0 || *pnChangeset<=pSession->nMaxChangesetSize ); @@ -218940,6 +229518,19 @@ SQLITE_API int sqlite3session_object_config(sqlite3_session *pSession, int op, v break; } + case SQLITE_SESSION_OBJCONFIG_ROWID: { + int iArg = *(int*)pArg; + if( iArg>=0 ){ + if( pSession->pTable ){ + rc = SQLITE_MISUSE; + }else{ + pSession->bImplicitPK = (iArg!=0); + } + } + *(int*)pArg = pSession->bImplicitPK; + break; + } + default: rc = SQLITE_MISUSE; } @@ -219198,15 +229789,19 @@ static int sessionReadRecord( } } if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){ - sqlite3_int64 v = sessionGetI64(aVal); - if( eType==SQLITE_INTEGER ){ - sqlite3VdbeMemSetInt64(apOut[i], v); + if( (pIn->nData-pIn->iNext)<8 ){ + rc = SQLITE_CORRUPT_BKPT; }else{ - double d; - memcpy(&d, &v, 8); - sqlite3VdbeMemSetDouble(apOut[i], d); + sqlite3_int64 v = sessionGetI64(aVal); + if( eType==SQLITE_INTEGER ){ + sqlite3VdbeMemSetInt64(apOut[i], v); + }else{ + double d; + memcpy(&d, &v, 8); + sqlite3VdbeMemSetDouble(apOut[i], d); + } + pIn->iNext += 8; } - pIn->iNext += 8; } } } @@ -219394,14 +229989,14 @@ static int sessionChangesetNextOne( p->rc = sessionInputBuffer(&p->in, 2); if( p->rc!=SQLITE_OK ) return p->rc; + sessionDiscardData(&p->in); + p->in.iCurrent = p->in.iNext; + /* If the iterator is already at the end of the changeset, return DONE. */ if( p->in.iNext>=p->in.nData ){ return SQLITE_DONE; } - sessionDiscardData(&p->in); - p->in.iCurrent = p->in.iNext; - op = p->in.aData[p->in.iNext++]; while( op=='T' || op=='P' ){ if( pbNew ) *pbNew = 1; @@ -219928,6 +230523,8 @@ struct SessionApplyCtx { SessionBuffer rebase; /* Rebase information (if any) here */ u8 bRebaseStarted; /* If table header is already in rebase */ u8 bRebase; /* True to collect rebase information */ + u8 bIgnoreNoop; /* True to ignore no-op conflicts */ + int bRowid; }; /* Number of prepared UPDATE statements to cache. */ @@ -220178,8 +230775,10 @@ static int sessionSelectRow( const char *zTab, /* Table name */ SessionApplyCtx *p /* Session changeset-apply context */ ){ - return sessionSelectStmt( - db, "main", zTab, p->nCol, p->azCol, p->abPK, &p->pSelect); + /* TODO */ + return sessionSelectStmt(db, p->bIgnoreNoop, + "main", zTab, p->bRowid, p->nCol, p->azCol, p->abPK, &p->pSelect + ); } /* @@ -220338,20 +230937,33 @@ static int sessionBindRow( */ static int sessionSeekToRow( sqlite3_changeset_iter *pIter, /* Changeset iterator */ - u8 *abPK, /* Primary key flags array */ - sqlite3_stmt *pSelect /* SELECT statement from sessionSelectRow() */ + SessionApplyCtx *p ){ + sqlite3_stmt *pSelect = p->pSelect; int rc; /* Return code */ int nCol; /* Number of columns in table */ int op; /* Changset operation (SQLITE_UPDATE etc.) */ const char *zDummy; /* Unused */ + sqlite3_clear_bindings(pSelect); sqlite3changeset_op(pIter, &zDummy, &nCol, &op, 0); rc = sessionBindRow(pIter, op==SQLITE_INSERT ? sqlite3changeset_new : sqlite3changeset_old, - nCol, abPK, pSelect + nCol, p->abPK, pSelect ); + if( op!=SQLITE_DELETE && p->bIgnoreNoop ){ + int ii; + for(ii=0; rc==SQLITE_OK && iiabPK[ii]==0 ){ + sqlite3_value *pVal = 0; + sqlite3changeset_new(pIter, ii, &pVal); + sqlite3_bind_int(pSelect, ii+1+nCol, (pVal==0)); + if( pVal ) rc = sessionBindValue(pSelect, ii+1, pVal); + } + } + } + if( rc==SQLITE_OK ){ rc = sqlite3_step(pSelect); if( rc!=SQLITE_ROW ) rc = sqlite3_reset(pSelect); @@ -220466,16 +231078,22 @@ static int sessionConflictHandler( /* Bind the new.* PRIMARY KEY values to the SELECT statement. */ if( pbReplace ){ - rc = sessionSeekToRow(pIter, p->abPK, p->pSelect); + rc = sessionSeekToRow(pIter, p); }else{ rc = SQLITE_OK; } if( rc==SQLITE_ROW ){ /* There exists another row with the new.* primary key. */ - pIter->pConflict = p->pSelect; - res = xConflict(pCtx, eType, pIter); - pIter->pConflict = 0; + if( p->bIgnoreNoop + && sqlite3_column_int(p->pSelect, sqlite3_column_count(p->pSelect)-1) + ){ + res = SQLITE_CHANGESET_OMIT; + }else{ + pIter->pConflict = p->pSelect; + res = xConflict(pCtx, eType, pIter); + pIter->pConflict = 0; + } rc = sqlite3_reset(p->pSelect); }else if( rc==SQLITE_OK ){ if( p->bDeferConstraints && eType==SQLITE_CHANGESET_CONFLICT ){ @@ -220583,7 +231201,7 @@ static int sessionApplyOneOp( sqlite3_step(p->pDelete); rc = sqlite3_reset(p->pDelete); - if( rc==SQLITE_OK && sqlite3_changes(p->db)==0 ){ + if( rc==SQLITE_OK && sqlite3_changes(p->db)==0 && p->bIgnoreNoop==0 ){ rc = sessionConflictHandler( SQLITE_CHANGESET_DATA, p, pIter, xConflict, pCtx, pbRetry ); @@ -220640,7 +231258,7 @@ static int sessionApplyOneOp( /* Check if there is a conflicting row. For sqlite_stat1, this needs ** to be done using a SELECT, as there is no PRIMARY KEY in the ** database schema to throw an exception if a duplicate is inserted. */ - rc = sessionSeekToRow(pIter, p->abPK, p->pSelect); + rc = sessionSeekToRow(pIter, p); if( rc==SQLITE_ROW ){ rc = SQLITE_CONSTRAINT; sqlite3_reset(p->pSelect); @@ -220810,14 +231428,21 @@ static int sessionChangesetApply( int nTab = 0; /* Result of sqlite3Strlen30(zTab) */ SessionApplyCtx sApply; /* changeset_apply() context object */ int bPatchset; + u64 savedFlag = db->flags & SQLITE_FkNoAction; assert( xConflict!=0 ); + sqlite3_mutex_enter(sqlite3_db_mutex(db)); + if( flags & SQLITE_CHANGESETAPPLY_FKNOACTION ){ + db->flags |= ((u64)SQLITE_FkNoAction); + db->aDb[0].pSchema->schema_cookie -= 32; + } + pIter->in.bNoDiscard = 1; memset(&sApply, 0, sizeof(sApply)); sApply.bRebase = (ppRebase && pnRebase); sApply.bInvertConstraints = !!(flags & SQLITE_CHANGESETAPPLY_INVERT); - sqlite3_mutex_enter(sqlite3_db_mutex(db)); + sApply.bIgnoreNoop = !!(flags & SQLITE_CHANGESETAPPLY_IGNORENOOP); if( (flags & SQLITE_CHANGESETAPPLY_NOSAVEPOINT)==0 ){ rc = sqlite3_exec(db, "SAVEPOINT changeset_apply", 0, 0, 0); } @@ -220854,6 +231479,7 @@ static int sessionChangesetApply( sApply.bStat1 = 0; sApply.bDeferConstraints = 1; sApply.bRebaseStarted = 0; + sApply.bRowid = 0; memset(&sApply.constraints, 0, sizeof(SessionBuffer)); /* If an xFilter() callback was specified, invoke it now. If the @@ -220873,8 +231499,8 @@ static int sessionChangesetApply( int i; sqlite3changeset_pk(pIter, &abPK, 0); - rc = sessionTableInfo(0, - db, "main", zNew, &sApply.nCol, &zTab, &sApply.azCol, &sApply.abPK + rc = sessionTableInfo(0, db, "main", zNew, + &sApply.nCol, &zTab, &sApply.azCol, 0, &sApply.abPK, &sApply.bRowid ); if( rc!=SQLITE_OK ) break; for(i=0; iflags & SQLITE_FkNoAction ); + db->flags &= ~((u64)SQLITE_FkNoAction); + db->aDb[0].pSchema->schema_cookie -= 32; + } sqlite3_mutex_leave(sqlite3_db_mutex(db)); return rc; } @@ -221006,11 +231638,13 @@ SQLITE_API int sqlite3changeset_apply_v2( sqlite3_changeset_iter *pIter; /* Iterator to skip through changeset */ int bInv = !!(flags & SQLITE_CHANGESETAPPLY_INVERT); int rc = sessionChangesetStart(&pIter, 0, 0, nChangeset, pChangeset, bInv, 1); + if( rc==SQLITE_OK ){ rc = sessionChangesetApply( db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase, flags ); } + return rc; } @@ -221098,6 +231732,10 @@ struct sqlite3_changegroup { int rc; /* Error code */ int bPatch; /* True to accumulate patchsets */ SessionTable *pList; /* List of tables in current patch */ + SessionBuffer rec; + + sqlite3 *db; /* Configured by changegroup_schema() */ + char *zDb; /* Configured by changegroup_schema() */ }; /* @@ -221118,6 +231756,7 @@ static int sessionChangeMerge( ){ SessionChange *pNew = 0; int rc = SQLITE_OK; + assert( aRec!=0 ); if( !pExist ){ pNew = (SessionChange *)sqlite3_malloc64(sizeof(SessionChange) + nRec); @@ -221284,84 +231923,242 @@ static int sessionChangeMerge( } /* -** Add all changes in the changeset traversed by the iterator passed as -** the first argument to the changegroup hash tables. +** Check if a changeset entry with nCol columns and the PK array passed +** as the final argument to this function is compatible with SessionTable +** pTab. If so, return 1. Otherwise, if they are incompatible in some way, +** return 0. */ -static int sessionChangesetToHash( - sqlite3_changeset_iter *pIter, /* Iterator to read from */ - sqlite3_changegroup *pGrp, /* Changegroup object to add changeset to */ - int bRebase /* True if hash table is for rebasing */ +static int sessionChangesetCheckCompat( + SessionTable *pTab, + int nCol, + u8 *abPK ){ - u8 *aRec; - int nRec; - int rc = SQLITE_OK; - SessionTable *pTab = 0; - - while( SQLITE_ROW==sessionChangesetNext(pIter, &aRec, &nRec, 0) ){ - const char *zNew; - int nCol; - int op; - int iHash; - int bIndirect; - SessionChange *pChange; - SessionChange *pExist = 0; - SessionChange **pp; - - if( pGrp->pList==0 ){ - pGrp->bPatch = pIter->bPatchset; - }else if( pIter->bPatchset!=pGrp->bPatch ){ - rc = SQLITE_ERROR; - break; + if( pTab->azCol && nColnCol ){ + int ii; + for(ii=0; iinCol; ii++){ + u8 bPK = (ii < nCol) ? abPK[ii] : 0; + if( pTab->abPK[ii]!=bPK ) return 0; } + return 1; + } + return (pTab->nCol==nCol && 0==memcmp(abPK, pTab->abPK, nCol)); +} - sqlite3changeset_op(pIter, &zNew, &nCol, &op, &bIndirect); - if( !pTab || sqlite3_stricmp(zNew, pTab->zName) ){ - /* Search the list for a matching table */ - int nNew = (int)strlen(zNew); - u8 *abPK; +static int sessionChangesetExtendRecord( + sqlite3_changegroup *pGrp, + SessionTable *pTab, + int nCol, + int op, + const u8 *aRec, + int nRec, + SessionBuffer *pOut +){ + int rc = SQLITE_OK; + int ii = 0; + + assert( pTab->azCol ); + assert( nColnCol ); - sqlite3changeset_pk(pIter, &abPK, 0); - for(pTab = pGrp->pList; pTab; pTab=pTab->pNext){ - if( 0==sqlite3_strnicmp(pTab->zName, zNew, nNew+1) ) break; + pOut->nBuf = 0; + if( op==SQLITE_INSERT || (op==SQLITE_DELETE && pGrp->bPatch==0) ){ + /* Append the missing default column values to the record. */ + sessionAppendBlob(pOut, aRec, nRec, &rc); + if( rc==SQLITE_OK && pTab->pDfltStmt==0 ){ + rc = sessionPrepareDfltStmt(pGrp->db, pTab, &pTab->pDfltStmt); + if( rc==SQLITE_OK && SQLITE_ROW!=sqlite3_step(pTab->pDfltStmt) ){ + rc = sqlite3_errcode(pGrp->db); } - if( !pTab ){ - SessionTable **ppTab; + } + for(ii=nCol; rc==SQLITE_OK && iinCol; ii++){ + int eType = sqlite3_column_type(pTab->pDfltStmt, ii); + sessionAppendByte(pOut, eType, &rc); + switch( eType ){ + case SQLITE_FLOAT: + case SQLITE_INTEGER: { + i64 iVal; + if( eType==SQLITE_INTEGER ){ + iVal = sqlite3_column_int64(pTab->pDfltStmt, ii); + }else{ + double rVal = sqlite3_column_int64(pTab->pDfltStmt, ii); + memcpy(&iVal, &rVal, sizeof(i64)); + } + if( SQLITE_OK==sessionBufferGrow(pOut, 8, &rc) ){ + sessionPutI64(&pOut->aBuf[pOut->nBuf], iVal); + pOut->nBuf += 8; + } + break; + } - pTab = sqlite3_malloc64(sizeof(SessionTable) + nCol + nNew+1); - if( !pTab ){ - rc = SQLITE_NOMEM; + case SQLITE_BLOB: + case SQLITE_TEXT: { + int n = sqlite3_column_bytes(pTab->pDfltStmt, ii); + sessionAppendVarint(pOut, n, &rc); + if( eType==SQLITE_TEXT ){ + const u8 *z = (const u8*)sqlite3_column_text(pTab->pDfltStmt, ii); + sessionAppendBlob(pOut, z, n, &rc); + }else{ + const u8 *z = (const u8*)sqlite3_column_blob(pTab->pDfltStmt, ii); + sessionAppendBlob(pOut, z, n, &rc); + } break; } - memset(pTab, 0, sizeof(SessionTable)); - pTab->nCol = nCol; - pTab->abPK = (u8*)&pTab[1]; - memcpy(pTab->abPK, abPK, nCol); - pTab->zName = (char*)&pTab->abPK[nCol]; - memcpy(pTab->zName, zNew, nNew+1); - - /* The new object must be linked on to the end of the list, not - ** simply added to the start of it. This is to ensure that the - ** tables within the output of sqlite3changegroup_output() are in - ** the right order. */ - for(ppTab=&pGrp->pList; *ppTab; ppTab=&(*ppTab)->pNext); - *ppTab = pTab; - }else if( pTab->nCol!=nCol || memcmp(pTab->abPK, abPK, nCol) ){ - rc = SQLITE_SCHEMA; - break; + + default: + assert( eType==SQLITE_NULL ); + break; + } + } + }else if( op==SQLITE_UPDATE ){ + /* Append missing "undefined" entries to the old.* record. And, if this + ** is an UPDATE, to the new.* record as well. */ + int iOff = 0; + if( pGrp->bPatch==0 ){ + for(ii=0; iinCol-nCol); ii++){ + sessionAppendByte(pOut, 0x00, &rc); } } - if( sessionGrowHash(0, pIter->bPatchset, pTab) ){ - rc = SQLITE_NOMEM; - break; + sessionAppendBlob(pOut, &aRec[iOff], nRec-iOff, &rc); + for(ii=0; ii<(pTab->nCol-nCol); ii++){ + sessionAppendByte(pOut, 0x00, &rc); + } + }else{ + assert( op==SQLITE_DELETE && pGrp->bPatch ); + sessionAppendBlob(pOut, aRec, nRec, &rc); + } + + return rc; +} + +/* +** Locate or create a SessionTable object that may be used to add the +** change currently pointed to by iterator pIter to changegroup pGrp. +** If successful, set output variable (*ppTab) to point to the table +** object and return SQLITE_OK. Otherwise, if some error occurs, return +** an SQLite error code and leave (*ppTab) set to NULL. +*/ +static int sessionChangesetFindTable( + sqlite3_changegroup *pGrp, + const char *zTab, + sqlite3_changeset_iter *pIter, + SessionTable **ppTab +){ + int rc = SQLITE_OK; + SessionTable *pTab = 0; + int nTab = (int)strlen(zTab); + u8 *abPK = 0; + int nCol = 0; + + *ppTab = 0; + sqlite3changeset_pk(pIter, &abPK, &nCol); + + /* Search the list for an existing table */ + for(pTab = pGrp->pList; pTab; pTab=pTab->pNext){ + if( 0==sqlite3_strnicmp(pTab->zName, zTab, nTab+1) ) break; + } + + /* If one was not found above, create a new table now */ + if( !pTab ){ + SessionTable **ppNew; + + pTab = sqlite3_malloc64(sizeof(SessionTable) + nCol + nTab+1); + if( !pTab ){ + return SQLITE_NOMEM; } + memset(pTab, 0, sizeof(SessionTable)); + pTab->nCol = nCol; + pTab->abPK = (u8*)&pTab[1]; + memcpy(pTab->abPK, abPK, nCol); + pTab->zName = (char*)&pTab->abPK[nCol]; + memcpy(pTab->zName, zTab, nTab+1); + + if( pGrp->db ){ + pTab->nCol = 0; + rc = sessionInitTable(0, pTab, pGrp->db, pGrp->zDb); + if( rc ){ + assert( pTab->azCol==0 ); + sqlite3_free(pTab); + return rc; + } + } + + /* The new object must be linked on to the end of the list, not + ** simply added to the start of it. This is to ensure that the + ** tables within the output of sqlite3changegroup_output() are in + ** the right order. */ + for(ppNew=&pGrp->pList; *ppNew; ppNew=&(*ppNew)->pNext); + *ppNew = pTab; + } + + /* Check that the table is compatible. */ + if( !sessionChangesetCheckCompat(pTab, nCol, abPK) ){ + rc = SQLITE_SCHEMA; + } + + *ppTab = pTab; + return rc; +} + +/* +** Add the change currently indicated by iterator pIter to the hash table +** belonging to changegroup pGrp. +*/ +static int sessionOneChangeToHash( + sqlite3_changegroup *pGrp, + sqlite3_changeset_iter *pIter, + int bRebase +){ + int rc = SQLITE_OK; + int nCol = 0; + int op = 0; + int iHash = 0; + int bIndirect = 0; + SessionChange *pChange = 0; + SessionChange *pExist = 0; + SessionChange **pp = 0; + SessionTable *pTab = 0; + u8 *aRec = &pIter->in.aData[pIter->in.iCurrent + 2]; + int nRec = (pIter->in.iNext - pIter->in.iCurrent) - 2; + + assert( nRec>0 ); + + /* Ensure that only changesets, or only patchsets, but not a mixture + ** of both, are being combined. It is an error to try to combine a + ** changeset and a patchset. */ + if( pGrp->pList==0 ){ + pGrp->bPatch = pIter->bPatchset; + }else if( pIter->bPatchset!=pGrp->bPatch ){ + rc = SQLITE_ERROR; + } + + if( rc==SQLITE_OK ){ + const char *zTab = 0; + sqlite3changeset_op(pIter, &zTab, &nCol, &op, &bIndirect); + rc = sessionChangesetFindTable(pGrp, zTab, pIter, &pTab); + } + + if( rc==SQLITE_OK && nColnCol ){ + SessionBuffer *pBuf = &pGrp->rec; + rc = sessionChangesetExtendRecord(pGrp, pTab, nCol, op, aRec, nRec, pBuf); + aRec = pBuf->aBuf; + nRec = pBuf->nBuf; + assert( pGrp->db ); + } + + if( rc==SQLITE_OK && sessionGrowHash(0, pIter->bPatchset, pTab) ){ + rc = SQLITE_NOMEM; + } + + if( rc==SQLITE_OK ){ + /* Search for existing entry. If found, remove it from the hash table. + ** Code below may link it back in. */ iHash = sessionChangeHash( pTab, (pIter->bPatchset && op==SQLITE_DELETE), aRec, pTab->nChange ); - - /* Search for existing entry. If found, remove it from the hash table. - ** Code below may link it back in. - */ for(pp=&pTab->apChange[iHash]; *pp; pp=&(*pp)->pNext){ int bPkOnly1 = 0; int bPkOnly2 = 0; @@ -221376,16 +232173,40 @@ static int sessionChangesetToHash( break; } } + } + if( rc==SQLITE_OK ){ rc = sessionChangeMerge(pTab, bRebase, pIter->bPatchset, pExist, op, bIndirect, aRec, nRec, &pChange ); - if( rc ) break; - if( pChange ){ - pChange->pNext = pTab->apChange[iHash]; - pTab->apChange[iHash] = pChange; - pTab->nEntry++; - } + } + if( rc==SQLITE_OK && pChange ){ + pChange->pNext = pTab->apChange[iHash]; + pTab->apChange[iHash] = pChange; + pTab->nEntry++; + } + + if( rc==SQLITE_OK ) rc = pIter->rc; + return rc; +} + +/* +** Add all changes in the changeset traversed by the iterator passed as +** the first argument to the changegroup hash tables. +*/ +static int sessionChangesetToHash( + sqlite3_changeset_iter *pIter, /* Iterator to read from */ + sqlite3_changegroup *pGrp, /* Changegroup object to add changeset to */ + int bRebase /* True if hash table is for rebasing */ +){ + u8 *aRec; + int nRec; + int rc = SQLITE_OK; + + pIter->in.bNoDiscard = 1; + while( SQLITE_ROW==(sessionChangesetNext(pIter, &aRec, &nRec, 0)) ){ + rc = sessionOneChangeToHash(pGrp, pIter, bRebase); + if( rc!=SQLITE_OK ) break; } if( rc==SQLITE_OK ) rc = pIter->rc; @@ -221474,6 +232295,31 @@ SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp){ return rc; } +/* +** Provide a database schema to the changegroup object. +*/ +SQLITE_API int sqlite3changegroup_schema( + sqlite3_changegroup *pGrp, + sqlite3 *db, + const char *zDb +){ + int rc = SQLITE_OK; + + if( pGrp->pList || pGrp->db ){ + /* Cannot add a schema after one or more calls to sqlite3changegroup_add(), + ** or after sqlite3changegroup_schema() has already been called. */ + rc = SQLITE_MISUSE; + }else{ + pGrp->zDb = sqlite3_mprintf("%s", zDb); + if( pGrp->zDb==0 ){ + rc = SQLITE_NOMEM; + }else{ + pGrp->db = db; + } + } + return rc; +} + /* ** Add the changeset currently stored in buffer pData, size nData bytes, ** to changeset-group p. @@ -221490,6 +232336,23 @@ SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup *pGrp, int nData, void return rc; } +/* +** Add a single change to a changeset-group. +*/ +SQLITE_API int sqlite3changegroup_add_change( + sqlite3_changegroup *pGrp, + sqlite3_changeset_iter *pIter +){ + if( pIter->in.iCurrent==pIter->in.iNext + || pIter->rc!=SQLITE_OK + || pIter->bInvert + ){ + /* Iterator does not point to any valid entry or is an INVERT iterator. */ + return SQLITE_ERROR; + } + return sessionOneChangeToHash(pGrp, pIter, 0); +} + /* ** Obtain a buffer containing a changeset representing the concatenation ** of all changesets added to the group so far. @@ -221537,7 +232400,9 @@ SQLITE_API int sqlite3changegroup_output_strm( */ SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup *pGrp){ if( pGrp ){ + sqlite3_free(pGrp->zDb); sessionDeleteTable(0, pGrp->pList); + sqlite3_free(pGrp->rec.aBuf); sqlite3_free(pGrp); } } @@ -221939,6 +232804,7 @@ SQLITE_API int sqlite3rebaser_rebase_strm( SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p){ if( p ){ sessionDeleteTable(0, p->grp.pList); + sqlite3_free(p->grp.rec.aBuf); sqlite3_free(p); } } @@ -221969,7 +232835,27 @@ SQLITE_API int sqlite3session_config(int op, void *pArg){ /************** End of sqlite3session.c **************************************/ /************** Begin file fts5.c ********************************************/ - +/* +** This, the "fts5.c" source file, is a composite file that is itself +** assembled from the following files: +** +** fts5.h +** fts5Int.h +** fts5parse.h <--- Generated from fts5parse.y by Lemon +** fts5parse.c <--- Generated from fts5parse.y by Lemon +** fts5_aux.c +** fts5_buffer.c +** fts5_config.c +** fts5_expr.c +** fts5_hash.c +** fts5_index.c +** fts5_main.c +** fts5_storage.c +** fts5_tokenize.c +** fts5_unicode2.c +** fts5_varint.c +** fts5_vocab.c +*/ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5) #if !defined(NDEBUG) && !defined(SQLITE_DEBUG) @@ -221979,6 +232865,12 @@ SQLITE_API int sqlite3session_config(int op, void *pArg){ # undef NDEBUG #endif +#ifdef HAVE_STDINT_H +/* #include */ +#endif +#ifdef HAVE_INTTYPES_H +/* #include */ +#endif /* ** 2014 May 31 ** @@ -222036,8 +232928,8 @@ struct Fts5PhraseIter { ** EXTENSION API FUNCTIONS ** ** xUserData(pFts): -** Return a copy of the context pointer the extension function was -** registered with. +** Return a copy of the pUserData pointer passed to the xCreateFunction() +** API when the extension function was registered. ** ** xColumnTotalSize(pFts, iCol, pnToken): ** If parameter iCol is less than zero, set output variable *pnToken @@ -222069,8 +232961,11 @@ struct Fts5PhraseIter { ** created with the "columnsize=0" option. ** ** xColumnText: -** This function attempts to retrieve the text of column iCol of the -** current document. If successful, (*pz) is set to point to a buffer +** If parameter iCol is less than zero, or greater than or equal to the +** number of columns in the table, SQLITE_RANGE is returned. +** +** Otherwise, this function attempts to retrieve the text of column iCol of +** the current document. If successful, (*pz) is set to point to a buffer ** containing the text in utf-8 encoding, (*pn) is set to the size in bytes ** (not characters) of the buffer and SQLITE_OK is returned. Otherwise, ** if an error occurs, an SQLite error code is returned and the final values @@ -222080,8 +232975,10 @@ struct Fts5PhraseIter { ** Returns the number of phrases in the current query expression. ** ** xPhraseSize: -** Returns the number of tokens in phrase iPhrase of the query. Phrases -** are numbered starting from zero. +** If parameter iCol is less than zero, or greater than or equal to the +** number of phrases in the current query, as returned by xPhraseCount, +** 0 is returned. Otherwise, this function returns the number of tokens in +** phrase iPhrase of the query. Phrases are numbered starting from zero. ** ** xInstCount: ** Set *pnInst to the total number of occurrences of all phrases within @@ -222097,12 +232994,13 @@ struct Fts5PhraseIter { ** Query for the details of phrase match iIdx within the current row. ** Phrase matches are numbered starting from zero, so the iIdx argument ** should be greater than or equal to zero and smaller than the value -** output by xInstCount(). +** output by xInstCount(). If iIdx is less than zero or greater than +** or equal to the value returned by xInstCount(), SQLITE_RANGE is returned. ** -** Usually, output parameter *piPhrase is set to the phrase number, *piCol +** Otherwise, output parameter *piPhrase is set to the phrase number, *piCol ** to the column in which it occurs and *piOff the token offset of the -** first token of the phrase. Returns SQLITE_OK if successful, or an error -** code (i.e. SQLITE_NOMEM) if an error occurs. +** first token of the phrase. SQLITE_OK is returned if successful, or an +** error code (i.e. SQLITE_NOMEM) if an error occurs. ** ** This API can be quite slow if used with an FTS5 table created with the ** "detail=none" or "detail=column" option. @@ -222128,6 +233026,10 @@ struct Fts5PhraseIter { ** Invoking Api.xUserData() returns a copy of the pointer passed as ** the third argument to pUserData. ** +** If parameter iPhrase is less than zero, or greater than or equal to +** the number of phrases in the query, as returned by xPhraseCount(), +** this function returns SQLITE_RANGE. +** ** If the callback function returns any value other than SQLITE_OK, the ** query is abandoned and the xQueryPhrase function returns immediately. ** If the returned value is SQLITE_DONE, xQueryPhrase returns SQLITE_OK. @@ -222209,6 +233111,10 @@ struct Fts5PhraseIter { ** (i.e. if it is a contentless table), then this API always iterates ** through an empty set (all calls to xPhraseFirst() set iCol to -1). ** +** In all cases, matches are visited in (column ASC, offset ASC) order. +** i.e. all those in column 0, sorted by offset, followed by those in +** column 1, etc. +** ** xPhraseNext() ** See xPhraseFirst above. ** @@ -222242,9 +233148,65 @@ struct Fts5PhraseIter { ** ** xPhraseNextColumn() ** See xPhraseFirstColumn above. +** +** xQueryToken(pFts5, iPhrase, iToken, ppToken, pnToken) +** This is used to access token iToken of phrase iPhrase of the current +** query. Before returning, output parameter *ppToken is set to point +** to a buffer containing the requested token, and *pnToken to the +** size of this buffer in bytes. +** +** If iPhrase or iToken are less than zero, or if iPhrase is greater than +** or equal to the number of phrases in the query as reported by +** xPhraseCount(), or if iToken is equal to or greater than the number of +** tokens in the phrase, SQLITE_RANGE is returned and *ppToken and *pnToken + are both zeroed. +** +** The output text is not a copy of the query text that specified the +** token. It is the output of the tokenizer module. For tokendata=1 +** tables, this includes any embedded 0x00 and trailing data. +** +** xInstToken(pFts5, iIdx, iToken, ppToken, pnToken) +** This is used to access token iToken of phrase hit iIdx within the +** current row. If iIdx is less than zero or greater than or equal to the +** value returned by xInstCount(), SQLITE_RANGE is returned. Otherwise, +** output variable (*ppToken) is set to point to a buffer containing the +** matching document token, and (*pnToken) to the size of that buffer in +** bytes. This API is not available if the specified token matches a +** prefix query term. In that case both output variables are always set +** to 0. +** +** The output text is not a copy of the document text that was tokenized. +** It is the output of the tokenizer module. For tokendata=1 tables, this +** includes any embedded 0x00 and trailing data. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. +** +** xColumnLocale(pFts5, iIdx, pzLocale, pnLocale) +** If parameter iCol is less than zero, or greater than or equal to the +** number of columns in the table, SQLITE_RANGE is returned. +** +** Otherwise, this function attempts to retrieve the locale associated +** with column iCol of the current row. Usually, there is no associated +** locale, and output parameters (*pzLocale) and (*pnLocale) are set +** to NULL and 0, respectively. However, if the fts5_locale() function +** was used to associate a locale with the value when it was inserted +** into the fts5 table, then (*pzLocale) is set to point to a nul-terminated +** buffer containing the name of the locale in utf-8 encoding. (*pnLocale) +** is set to the size in bytes of the buffer, not including the +** nul-terminator. +** +** If successful, SQLITE_OK is returned. Or, if an error occurs, an +** SQLite error code is returned. The final value of the output parameters +** is undefined in this case. +** +** xTokenize_v2: +** Tokenize text using the tokenizer belonging to the FTS5 table. This +** API is the same as the xTokenize() API, except that it allows a tokenizer +** locale to be specified. */ struct Fts5ExtensionApi { - int iVersion; /* Currently always set to 3 */ + int iVersion; /* Currently always set to 4 */ void *(*xUserData)(Fts5Context*); @@ -222279,6 +233241,22 @@ struct Fts5ExtensionApi { int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*); void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol); + + /* Below this point are iVersion>=3 only */ + int (*xQueryToken)(Fts5Context*, + int iPhrase, int iToken, + const char **ppToken, int *pnToken + ); + int (*xInstToken)(Fts5Context*, int iIdx, int iToken, const char**, int*); + + /* Below this point are iVersion>=4 only */ + int (*xColumnLocale)(Fts5Context*, int iCol, const char **pz, int *pn); + int (*xTokenize_v2)(Fts5Context*, + const char *pText, int nText, /* Text to tokenize */ + const char *pLocale, int nLocale, /* Locale to pass to tokenizer */ + void *pCtx, /* Context passed to xToken() */ + int (*xToken)(void*, int, const char*, int, int, int) /* Callback */ + ); }; /* @@ -222299,7 +233277,7 @@ struct Fts5ExtensionApi { ** A tokenizer instance is required to actually tokenize text. ** ** The first argument passed to this function is a copy of the (void*) -** pointer provided by the application when the fts5_tokenizer object +** pointer provided by the application when the fts5_tokenizer_v2 object ** was registered with FTS5 (the third argument to xCreateTokenizer()). ** The second and third arguments are an array of nul-terminated strings ** containing the tokenizer arguments, if any, specified following the @@ -222323,7 +233301,7 @@ struct Fts5ExtensionApi { ** argument passed to this function is a pointer to an Fts5Tokenizer object ** returned by an earlier call to xCreate(). ** -** The second argument indicates the reason that FTS5 is requesting +** The third argument indicates the reason that FTS5 is requesting ** tokenization of the supplied text. This is always one of the following ** four values: ** @@ -222347,6 +233325,13 @@ struct Fts5ExtensionApi { ** on a columnsize=0 database. ** ** +** The sixth and seventh arguments passed to xTokenize() - pLocale and +** nLocale - are a pointer to a buffer containing the locale to use for +** tokenization (e.g. "en_US") and its size in bytes, respectively. The +** pLocale buffer is not nul-terminated. pLocale may be passed NULL (in +** which case nLocale is always 0) to indicate that the tokenizer should +** use its default locale. +** ** For each token in the input string, the supplied callback xToken() must ** be invoked. The first argument to it should be a copy of the pointer ** passed as the second argument to xTokenize(). The third and fourth @@ -222370,6 +233355,30 @@ struct Fts5ExtensionApi { ** may abandon the tokenization and return any error code other than ** SQLITE_OK or SQLITE_DONE. ** +** If the tokenizer is registered using an fts5_tokenizer_v2 object, +** then the xTokenize() method has two additional arguments - pLocale +** and nLocale. These specify the locale that the tokenizer should use +** for the current request. If pLocale and nLocale are both 0, then the +** tokenizer should use its default locale. Otherwise, pLocale points to +** an nLocale byte buffer containing the name of the locale to use as utf-8 +** text. pLocale is not nul-terminated. +** +** FTS5_TOKENIZER +** +** There is also an fts5_tokenizer object. This is an older, deprecated, +** version of fts5_tokenizer_v2. It is similar except that: +** +**
        +**
      • There is no "iVersion" field, and +**
      • The xTokenize() method does not take a locale argument. +**
      +** +** Legacy fts5_tokenizer tokenizers must be registered using the +** legacy xCreateTokenizer() function, instead of xCreateTokenizer_v2(). +** +** Tokenizer implementations registered using either API may be retrieved +** using both xFindTokenizer() and xFindTokenizer_v2(). +** ** SYNONYM SUPPORT ** ** Custom tokenizers may also support synonyms. Consider a case in which a @@ -222473,11 +233482,38 @@ struct Fts5ExtensionApi { ** as separate queries of the FTS index are required for each synonym. ** ** When using methods (2) or (3), it is important that the tokenizer only -** provide synonyms when tokenizing document text (method (2)) or query -** text (method (3)), not both. Doing so will not cause any errors, but is +** provide synonyms when tokenizing document text (method (3)) or query +** text (method (2)), not both. Doing so will not cause any errors, but is ** inefficient. */ typedef struct Fts5Tokenizer Fts5Tokenizer; +typedef struct fts5_tokenizer_v2 fts5_tokenizer_v2; +struct fts5_tokenizer_v2 { + int iVersion; /* Currently always 2 */ + + int (*xCreate)(void*, const char **azArg, int nArg, Fts5Tokenizer **ppOut); + void (*xDelete)(Fts5Tokenizer*); + int (*xTokenize)(Fts5Tokenizer*, + void *pCtx, + int flags, /* Mask of FTS5_TOKENIZE_* flags */ + const char *pText, int nText, + const char *pLocale, int nLocale, + int (*xToken)( + void *pCtx, /* Copy of 2nd argument to xTokenize() */ + int tflags, /* Mask of FTS5_TOKEN_* flags */ + const char *pToken, /* Pointer to buffer containing token */ + int nToken, /* Size of token in bytes */ + int iStart, /* Byte offset of token within input text */ + int iEnd /* Byte offset of end of token within input text */ + ) + ); +}; + +/* +** New code should use the fts5_tokenizer_v2 type to define tokenizer +** implementations. The following type is included for legacy applications +** that still use it. +*/ typedef struct fts5_tokenizer fts5_tokenizer; struct fts5_tokenizer { int (*xCreate)(void*, const char **azArg, int nArg, Fts5Tokenizer **ppOut); @@ -222497,6 +233533,7 @@ struct fts5_tokenizer { ); }; + /* Flags that may be passed as the third argument to xTokenize() */ #define FTS5_TOKENIZE_QUERY 0x0001 #define FTS5_TOKENIZE_PREFIX 0x0002 @@ -222516,13 +233553,13 @@ struct fts5_tokenizer { */ typedef struct fts5_api fts5_api; struct fts5_api { - int iVersion; /* Currently always set to 2 */ + int iVersion; /* Currently always set to 3 */ /* Create a new tokenizer */ int (*xCreateTokenizer)( fts5_api *pApi, const char *zName, - void *pContext, + void *pUserData, fts5_tokenizer *pTokenizer, void (*xDestroy)(void*) ); @@ -222531,7 +233568,7 @@ struct fts5_api { int (*xFindTokenizer)( fts5_api *pApi, const char *zName, - void **ppContext, + void **ppUserData, fts5_tokenizer *pTokenizer ); @@ -222539,10 +233576,29 @@ struct fts5_api { int (*xCreateFunction)( fts5_api *pApi, const char *zName, - void *pContext, + void *pUserData, fts5_extension_function xFunction, void (*xDestroy)(void*) ); + + /* APIs below this point are only available if iVersion>=3 */ + + /* Create a new tokenizer */ + int (*xCreateTokenizer_v2)( + fts5_api *pApi, + const char *zName, + void *pUserData, + fts5_tokenizer_v2 *pTokenizer, + void (*xDestroy)(void*) + ); + + /* Find an existing tokenizer */ + int (*xFindTokenizer_v2)( + fts5_api *pApi, + const char *zName, + void **ppUserData, + fts5_tokenizer_v2 **ppTokenizer + ); }; /* @@ -222616,6 +233672,22 @@ typedef sqlite3_uint64 u64; # define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) # define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) +/* The uptr type is an unsigned integer large enough to hold a pointer +*/ +#if defined(HAVE_STDINT_H) + typedef uintptr_t uptr; +#elif SQLITE_PTRSIZE==4 + typedef u32 uptr; +#else + typedef u64 uptr; +#endif + +#ifdef SQLITE_4_BYTE_ALIGNED_MALLOC +# define EIGHT_BYTE_ALIGNMENT(X) ((((uptr)(X) - (uptr)0)&3)==0) +#else +# define EIGHT_BYTE_ALIGNMENT(X) ((((uptr)(X) - (uptr)0)&7)==0) +#endif + #endif /* Truncate very long tokens to this many bytes. Hard limit is @@ -222699,6 +233771,18 @@ struct Fts5Colset { */ typedef struct Fts5Config Fts5Config; +typedef struct Fts5TokenizerConfig Fts5TokenizerConfig; + +struct Fts5TokenizerConfig { + Fts5Tokenizer *pTok; + fts5_tokenizer_v2 *pApi2; + fts5_tokenizer *pApi1; + const char **azArg; + int nArg; + int ePattern; /* FTS_PATTERN_XXX constant */ + const char *pLocale; /* Current locale to use */ + int nLocale; /* Size of pLocale in bytes */ +}; /* ** An instance of the following structure encodes all information that can @@ -222711,6 +233795,10 @@ typedef struct Fts5Config Fts5Config; ** attempt to merge together. A value of 1 sets the object to use the ** compile time default. Zero disables auto-merge altogether. ** +** bContentlessDelete: +** True if the contentless_delete option was present in the CREATE +** VIRTUAL TABLE statement. +** ** zContent: ** ** zContentRowid: @@ -222734,9 +233822,12 @@ typedef struct Fts5Config Fts5Config; ** ** INSERT INTO tbl(tbl, rank) VALUES('prefix-index', $bPrefixIndex); ** +** bLocale: +** Set to true if locale=1 was specified when the table was created. */ struct Fts5Config { sqlite3 *db; /* Database handle */ + Fts5Global *pGlobal; /* Global fts5 object for handle db */ char *zDb; /* Database holding FTS index (e.g. "main") */ char *zName; /* Name of FTS index */ int nCol; /* Number of columns */ @@ -222745,17 +233836,21 @@ struct Fts5Config { int nPrefix; /* Number of prefix indexes */ int *aPrefix; /* Sizes in bytes of nPrefix prefix indexes */ int eContent; /* An FTS5_CONTENT value */ + int bContentlessDelete; /* "contentless_delete=" option (dflt==0) */ + int bContentlessUnindexed; /* "contentless_unindexed=" option (dflt=0) */ char *zContent; /* content table */ char *zContentRowid; /* "content_rowid=" option value */ int bColumnsize; /* "columnsize=" option value (dflt==1) */ + int bTokendata; /* "tokendata=" option value (dflt==0) */ + int bLocale; /* "locale=" option value (dflt==0) */ int eDetail; /* FTS5_DETAIL_XXX value */ char *zContentExprlist; - Fts5Tokenizer *pTok; - fts5_tokenizer *pTokApi; + Fts5TokenizerConfig t; int bLock; /* True when table is preparing statement */ - int ePattern; /* FTS_PATTERN_XXX constant */ + /* Values loaded from the %_config table */ + int iVersion; /* fts5 file format 'version' */ int iCookie; /* Incremented when %_config is modified */ int pgsz; /* Approximate page size used in %_data */ int nAutomerge; /* 'automerge' setting */ @@ -222764,6 +233859,8 @@ struct Fts5Config { int nHashSize; /* Bytes of memory for in-memory hash */ char *zRank; /* Name of rank function */ char *zRankArgs; /* Arguments to rank function */ + int bSecureDelete; /* 'secure-delete' */ + int nDeleteMerge; /* 'deletemerge' */ /* If non-NULL, points to sqlite3_vtab.base.zErrmsg. Often NULL. */ char **pzErrmsg; @@ -222773,12 +233870,16 @@ struct Fts5Config { #endif }; -/* Current expected value of %_config table 'version' field */ -#define FTS5_CURRENT_VERSION 4 +/* Current expected value of %_config table 'version' field. And +** the expected version if the 'secure-delete' option has ever been +** set on the table. */ +#define FTS5_CURRENT_VERSION 4 +#define FTS5_CURRENT_VERSION_SECUREDELETE 5 -#define FTS5_CONTENT_NORMAL 0 -#define FTS5_CONTENT_NONE 1 -#define FTS5_CONTENT_EXTERNAL 2 +#define FTS5_CONTENT_NORMAL 0 +#define FTS5_CONTENT_NONE 1 +#define FTS5_CONTENT_EXTERNAL 2 +#define FTS5_CONTENT_UNINDEXED 3 #define FTS5_DETAIL_FULL 0 #define FTS5_DETAIL_NONE 1 @@ -222813,6 +233914,8 @@ static int sqlite3Fts5ConfigSetValue(Fts5Config*, const char*, sqlite3_value*, i static int sqlite3Fts5ConfigParseRank(const char*, char**, char**); +static void sqlite3Fts5ConfigErrmsg(Fts5Config *pConfig, const char *zFmt, ...); + /* ** End of interface to code in fts5_config.c. **************************************************************************/ @@ -222857,7 +233960,7 @@ static char *sqlite3Fts5Mprintf(int *pRc, const char *zFmt, ...); static void sqlite3Fts5Put32(u8*, int); static int sqlite3Fts5Get32(const u8*); -#define FTS5_POS2COLUMN(iPos) (int)(iPos >> 32) +#define FTS5_POS2COLUMN(iPos) (int)((iPos >> 32) & 0x7FFFFFFF) #define FTS5_POS2OFFSET(iPos) (int)(iPos & 0x7FFFFFFF) typedef struct Fts5PoslistReader Fts5PoslistReader; @@ -222930,16 +234033,19 @@ struct Fts5IndexIter { /* ** Values used as part of the flags argument passed to IndexQuery(). */ -#define FTS5INDEX_QUERY_PREFIX 0x0001 /* Prefix query */ -#define FTS5INDEX_QUERY_DESC 0x0002 /* Docs in descending rowid order */ -#define FTS5INDEX_QUERY_TEST_NOIDX 0x0004 /* Do not use prefix index */ -#define FTS5INDEX_QUERY_SCAN 0x0008 /* Scan query (fts5vocab) */ +#define FTS5INDEX_QUERY_PREFIX 0x0001 /* Prefix query */ +#define FTS5INDEX_QUERY_DESC 0x0002 /* Docs in descending rowid order */ +#define FTS5INDEX_QUERY_TEST_NOIDX 0x0004 /* Do not use prefix index */ +#define FTS5INDEX_QUERY_SCAN 0x0008 /* Scan query (fts5vocab) */ /* The following are used internally by the fts5_index.c module. They are ** defined here only to make it easier to avoid clashes with the flags ** above. */ -#define FTS5INDEX_QUERY_SKIPEMPTY 0x0010 -#define FTS5INDEX_QUERY_NOOUTPUT 0x0020 +#define FTS5INDEX_QUERY_SKIPEMPTY 0x0010 +#define FTS5INDEX_QUERY_NOOUTPUT 0x0020 +#define FTS5INDEX_QUERY_SKIPHASH 0x0040 +#define FTS5INDEX_QUERY_NOTOKENDATA 0x0080 +#define FTS5INDEX_QUERY_SCANONETERM 0x0100 /* ** Create/destroy an Fts5Index object. @@ -223008,6 +234114,10 @@ static void *sqlite3Fts5StructureRef(Fts5Index*); static void sqlite3Fts5StructureRelease(void*); static int sqlite3Fts5StructureTest(Fts5Index*, void*); +/* +** Used by xInstToken(): +*/ +static int sqlite3Fts5IterToken(Fts5IndexIter*, i64, int, int, const char**, int*); /* ** Insert or remove data to or from the index. Each time a document is @@ -223082,6 +234192,16 @@ static int sqlite3Fts5IndexReset(Fts5Index *p); static int sqlite3Fts5IndexLoadConfig(Fts5Index *p); +static int sqlite3Fts5IndexGetOrigin(Fts5Index *p, i64 *piOrigin); +static int sqlite3Fts5IndexContentlessDelete(Fts5Index *p, i64 iOrigin, i64 iRowid); + +static void sqlite3Fts5IndexIterClearTokendata(Fts5IndexIter*); + +/* Used to populate hash tables for xInstToken in detail=none/column mode. */ +static int sqlite3Fts5IndexIterWriteTokendata( + Fts5IndexIter*, const char*, int, i64 iRowid, int iCol, int iOff +); + /* ** End of interface to code in fts5_index.c. **************************************************************************/ @@ -223094,7 +234214,7 @@ static int sqlite3Fts5GetVarintLen(u32 iVal); static u8 sqlite3Fts5GetVarint(const unsigned char*, u64*); static int sqlite3Fts5PutVarint(unsigned char *p, u64 v); -#define fts5GetVarint32(a,b) sqlite3Fts5GetVarint32(a,(u32*)&b) +#define fts5GetVarint32(a,b) sqlite3Fts5GetVarint32(a,(u32*)&(b)) #define fts5GetVarint sqlite3Fts5GetVarint #define fts5FastGetVarint32(a, iOff, nVal) { \ @@ -223125,18 +234245,20 @@ struct Fts5Table { Fts5Index *pIndex; /* Full-text index */ }; -static int sqlite3Fts5GetTokenizer( - Fts5Global*, - const char **azArg, - int nArg, - Fts5Config*, - char **pzErr -); +static int sqlite3Fts5LoadTokenizer(Fts5Config *pConfig); static Fts5Table *sqlite3Fts5TableFromCsrid(Fts5Global*, i64); static int sqlite3Fts5FlushToDisk(Fts5Table*); +static void sqlite3Fts5ClearLocale(Fts5Config *pConfig); +static void sqlite3Fts5SetLocale(Fts5Config *pConfig, const char *pLoc, int nLoc); + +static int sqlite3Fts5IsLocaleValue(Fts5Config *pConfig, sqlite3_value *pVal); +static int sqlite3Fts5DecodeLocaleValue(sqlite3_value *pVal, + const char **ppText, int *pnText, const char **ppLoc, int *pnLoc +); + /* ** End of interface to code in fts5.c. **************************************************************************/ @@ -223166,6 +234288,11 @@ static int sqlite3Fts5HashWrite( */ static void sqlite3Fts5HashClear(Fts5Hash*); +/* +** Return true if the hash is empty, false otherwise. +*/ +static int sqlite3Fts5HashIsEmpty(Fts5Hash*); + static int sqlite3Fts5HashQuery( Fts5Hash*, /* Hash table to query */ int nPre, @@ -223182,11 +234309,13 @@ static void sqlite3Fts5HashScanNext(Fts5Hash*); static int sqlite3Fts5HashScanEof(Fts5Hash*); static void sqlite3Fts5HashScanEntry(Fts5Hash *, const char **pzTerm, /* OUT: term (nul-terminated) */ + int *pnTerm, /* OUT: Size of term in bytes */ const u8 **ppDoclist, /* OUT: pointer to doclist */ int *pnDoclist /* OUT: size of doclist in bytes */ ); + /* ** End of interface to code in fts5_hash.c. **************************************************************************/ @@ -223209,8 +234338,8 @@ static int sqlite3Fts5StorageRename(Fts5Storage*, const char *zName); static int sqlite3Fts5DropAll(Fts5Config*); static int sqlite3Fts5CreateTable(Fts5Config*, const char*, const char*, int, char **); -static int sqlite3Fts5StorageDelete(Fts5Storage *p, i64, sqlite3_value**); -static int sqlite3Fts5StorageContentInsert(Fts5Storage *p, sqlite3_value**, i64*); +static int sqlite3Fts5StorageDelete(Fts5Storage *p, i64, sqlite3_value**, int); +static int sqlite3Fts5StorageContentInsert(Fts5Storage *p, int, sqlite3_value**, i64*); static int sqlite3Fts5StorageIndexInsert(Fts5Storage *p, sqlite3_value**, i64); static int sqlite3Fts5StorageIntegrity(Fts5Storage *p, int iArg); @@ -223235,6 +234364,9 @@ static int sqlite3Fts5StorageOptimize(Fts5Storage *p); static int sqlite3Fts5StorageMerge(Fts5Storage *p, int nMerge); static int sqlite3Fts5StorageReset(Fts5Storage *p); +static void sqlite3Fts5StorageReleaseDeleteRow(Fts5Storage*); +static int sqlite3Fts5StorageFindDeleteRow(Fts5Storage *p, i64 iDel); + /* ** End of interface to code in fts5_storage.c. **************************************************************************/ @@ -223307,6 +234439,10 @@ static int sqlite3Fts5ExprClonePhrase(Fts5Expr*, int, Fts5Expr**); static int sqlite3Fts5ExprPhraseCollist(Fts5Expr *, int, const u8 **, int *); +static int sqlite3Fts5ExprQueryToken(Fts5Expr*, int, int, const char**, int*); +static int sqlite3Fts5ExprInstToken(Fts5Expr*, i64, int, int, int, int, const char**, int*); +static void sqlite3Fts5ExprClearTokens(Fts5Expr*); + /******************************************* ** The fts5_expr.c API above this point is used by the other hand-written ** C code in this module. The interfaces below this point are called by @@ -223383,6 +234519,7 @@ static int sqlite3Fts5TokenizerPattern( int (*xCreate)(void*, const char**, int, Fts5Tokenizer**), Fts5Tokenizer *pTok ); +static int sqlite3Fts5TokenizerPreload(Fts5TokenizerConfig*); /* ** End of interface to code in fts5_tokenizer.c. **************************************************************************/ @@ -223430,7 +234567,8 @@ static void sqlite3Fts5UnicodeAscii(u8*, u8*); #define FTS5_STAR 15 /* This file is automatically generated by Lemon from input grammar -** source file "fts5parse.y". */ +** source file "fts5parse.y". +*/ /* ** 2000-05-29 ** @@ -223542,6 +234680,9 @@ static void sqlite3Fts5UnicodeAscii(u8*, u8*); ** sqlite3Fts5ParserARG_STORE Code to store %extra_argument into fts5yypParser ** sqlite3Fts5ParserARG_FETCH Code to extract %extra_argument from fts5yypParser ** sqlite3Fts5ParserCTX_* As sqlite3Fts5ParserARG_ except for %extra_context +** fts5YYREALLOC Name of the realloc() function to use +** fts5YYFREE Name of the free() function to use +** fts5YYDYNSTACK True if stack space should be extended on heap ** fts5YYERRORSYMBOL is the code number of the error symbol. If not ** defined, then do no error processing. ** fts5YYNSTATE the combined number of states. @@ -223555,6 +234696,8 @@ static void sqlite3Fts5UnicodeAscii(u8*, u8*); ** fts5YY_NO_ACTION The fts5yy_action[] code for no-op ** fts5YY_MIN_REDUCE Minimum value for reduce actions ** fts5YY_MAX_REDUCE Maximum value for reduce actions +** fts5YY_MIN_DSTRCTR Minimum symbol value that has a destructor +** fts5YY_MAX_DSTRCTR Maximum symbol value that has a destructor */ #ifndef INTERFACE # define INTERFACE 1 @@ -223581,6 +234724,9 @@ typedef union { #define sqlite3Fts5ParserARG_PARAM ,pParse #define sqlite3Fts5ParserARG_FETCH Fts5Parse *pParse=fts5yypParser->pParse; #define sqlite3Fts5ParserARG_STORE fts5yypParser->pParse=pParse; +#define fts5YYREALLOC realloc +#define fts5YYFREE free +#define fts5YYDYNSTACK 0 #define sqlite3Fts5ParserCTX_SDECL #define sqlite3Fts5ParserCTX_PDECL #define sqlite3Fts5ParserCTX_PARAM @@ -223598,6 +234744,8 @@ typedef union { #define fts5YY_NO_ACTION 82 #define fts5YY_MIN_REDUCE 83 #define fts5YY_MAX_REDUCE 110 +#define fts5YY_MIN_DSTRCTR 16 +#define fts5YY_MAX_DSTRCTR 24 /************* End control #defines *******************************************/ #define fts5YY_NLOOKAHEAD ((int)(sizeof(fts5yy_lookahead)/sizeof(fts5yy_lookahead[0]))) @@ -223613,6 +234761,22 @@ typedef union { # define fts5yytestcase(X) #endif +/* Macro to determine if stack space has the ability to grow using +** heap memory. +*/ +#if fts5YYSTACKDEPTH<=0 || fts5YYDYNSTACK +# define fts5YYGROWABLESTACK 1 +#else +# define fts5YYGROWABLESTACK 0 +#endif + +/* Guarantee a minimum number of initial stack slots. +*/ +#if fts5YYSTACKDEPTH<=0 +# undef fts5YYSTACKDEPTH +# define fts5YYSTACKDEPTH 2 /* Need a minimum stack size */ +#endif + /* Next are the tables used to determine what action to take based on the ** current state and lookahead token. These tables are used to implement @@ -223773,14 +234937,9 @@ struct fts5yyParser { #endif sqlite3Fts5ParserARG_SDECL /* A place to hold %extra_argument */ sqlite3Fts5ParserCTX_SDECL /* A place to hold %extra_context */ -#if fts5YYSTACKDEPTH<=0 - int fts5yystksz; /* Current side of the stack */ - fts5yyStackEntry *fts5yystack; /* The parser's stack */ - fts5yyStackEntry fts5yystk0; /* First stack entry */ -#else - fts5yyStackEntry fts5yystack[fts5YYSTACKDEPTH]; /* The parser's stack */ - fts5yyStackEntry *fts5yystackEnd; /* Last entry in the stack */ -#endif + fts5yyStackEntry *fts5yystackEnd; /* Last entry in the stack */ + fts5yyStackEntry *fts5yystack; /* The parser stack */ + fts5yyStackEntry fts5yystk0[fts5YYSTACKDEPTH]; /* Initial stack space */ }; typedef struct fts5yyParser fts5yyParser; @@ -223887,37 +235046,45 @@ static const char *const fts5yyRuleName[] = { #endif /* NDEBUG */ -#if fts5YYSTACKDEPTH<=0 +#if fts5YYGROWABLESTACK /* ** Try to increase the size of the parser stack. Return the number ** of errors. Return 0 on success. */ static int fts5yyGrowStack(fts5yyParser *p){ + int oldSize = 1 + (int)(p->fts5yystackEnd - p->fts5yystack); int newSize; int idx; fts5yyStackEntry *pNew; - newSize = p->fts5yystksz*2 + 100; - idx = p->fts5yytos ? (int)(p->fts5yytos - p->fts5yystack) : 0; - if( p->fts5yystack==&p->fts5yystk0 ){ - pNew = malloc(newSize*sizeof(pNew[0])); - if( pNew ) pNew[0] = p->fts5yystk0; + newSize = oldSize*2 + 100; + idx = (int)(p->fts5yytos - p->fts5yystack); + if( p->fts5yystack==p->fts5yystk0 ){ + pNew = fts5YYREALLOC(0, newSize*sizeof(pNew[0])); + if( pNew==0 ) return 1; + memcpy(pNew, p->fts5yystack, oldSize*sizeof(pNew[0])); }else{ - pNew = realloc(p->fts5yystack, newSize*sizeof(pNew[0])); + pNew = fts5YYREALLOC(p->fts5yystack, newSize*sizeof(pNew[0])); + if( pNew==0 ) return 1; } - if( pNew ){ - p->fts5yystack = pNew; - p->fts5yytos = &p->fts5yystack[idx]; + p->fts5yystack = pNew; + p->fts5yytos = &p->fts5yystack[idx]; #ifndef NDEBUG - if( fts5yyTraceFILE ){ - fprintf(fts5yyTraceFILE,"%sStack grows from %d to %d entries.\n", - fts5yyTracePrompt, p->fts5yystksz, newSize); - } -#endif - p->fts5yystksz = newSize; + if( fts5yyTraceFILE ){ + fprintf(fts5yyTraceFILE,"%sStack grows from %d to %d entries.\n", + fts5yyTracePrompt, oldSize, newSize); } - return pNew==0; +#endif + p->fts5yystackEnd = &p->fts5yystack[newSize-1]; + return 0; } +#endif /* fts5YYGROWABLESTACK */ + +#if !fts5YYGROWABLESTACK +/* For builds that do no have a growable stack, fts5yyGrowStack always +** returns an error. +*/ +# define fts5yyGrowStack(X) 1 #endif /* Datatype of the argument to the memory allocated passed as the @@ -223937,24 +235104,14 @@ static void sqlite3Fts5ParserInit(void *fts5yypRawParser sqlite3Fts5ParserCTX_PD #ifdef fts5YYTRACKMAXSTACKDEPTH fts5yypParser->fts5yyhwm = 0; #endif -#if fts5YYSTACKDEPTH<=0 - fts5yypParser->fts5yytos = NULL; - fts5yypParser->fts5yystack = NULL; - fts5yypParser->fts5yystksz = 0; - if( fts5yyGrowStack(fts5yypParser) ){ - fts5yypParser->fts5yystack = &fts5yypParser->fts5yystk0; - fts5yypParser->fts5yystksz = 1; - } -#endif + fts5yypParser->fts5yystack = fts5yypParser->fts5yystk0; + fts5yypParser->fts5yystackEnd = &fts5yypParser->fts5yystack[fts5YYSTACKDEPTH-1]; #ifndef fts5YYNOERRORRECOVERY fts5yypParser->fts5yyerrcnt = -1; #endif fts5yypParser->fts5yytos = fts5yypParser->fts5yystack; fts5yypParser->fts5yystack[0].stateno = 0; fts5yypParser->fts5yystack[0].major = 0; -#if fts5YYSTACKDEPTH>0 - fts5yypParser->fts5yystackEnd = &fts5yypParser->fts5yystack[fts5YYSTACKDEPTH-1]; -#endif } #ifndef sqlite3Fts5Parser_ENGINEALWAYSONSTACK @@ -224068,9 +235225,26 @@ static void fts5yy_pop_parser_stack(fts5yyParser *pParser){ */ static void sqlite3Fts5ParserFinalize(void *p){ fts5yyParser *pParser = (fts5yyParser*)p; - while( pParser->fts5yytos>pParser->fts5yystack ) fts5yy_pop_parser_stack(pParser); -#if fts5YYSTACKDEPTH<=0 - if( pParser->fts5yystack!=&pParser->fts5yystk0 ) free(pParser->fts5yystack); + + /* In-lined version of calling fts5yy_pop_parser_stack() for each + ** element left in the stack */ + fts5yyStackEntry *fts5yytos = pParser->fts5yytos; + while( fts5yytos>pParser->fts5yystack ){ +#ifndef NDEBUG + if( fts5yyTraceFILE ){ + fprintf(fts5yyTraceFILE,"%sPopping %s\n", + fts5yyTracePrompt, + fts5yyTokenName[fts5yytos->major]); + } +#endif + if( fts5yytos->major>=fts5YY_MIN_DSTRCTR ){ + fts5yy_destructor(pParser, fts5yytos->major, &fts5yytos->minor); + } + fts5yytos--; + } + +#if fts5YYGROWABLESTACK + if( pParser->fts5yystack!=pParser->fts5yystk0 ) fts5YYFREE(pParser->fts5yystack); #endif } @@ -224297,25 +235471,19 @@ static void fts5yy_shift( assert( fts5yypParser->fts5yyhwm == (int)(fts5yypParser->fts5yytos - fts5yypParser->fts5yystack) ); } #endif -#if fts5YYSTACKDEPTH>0 - if( fts5yypParser->fts5yytos>fts5yypParser->fts5yystackEnd ){ - fts5yypParser->fts5yytos--; - fts5yyStackOverflow(fts5yypParser); - return; - } -#else - if( fts5yypParser->fts5yytos>=&fts5yypParser->fts5yystack[fts5yypParser->fts5yystksz] ){ + fts5yytos = fts5yypParser->fts5yytos; + if( fts5yytos>fts5yypParser->fts5yystackEnd ){ if( fts5yyGrowStack(fts5yypParser) ){ fts5yypParser->fts5yytos--; fts5yyStackOverflow(fts5yypParser); return; } + fts5yytos = fts5yypParser->fts5yytos; + assert( fts5yytos <= fts5yypParser->fts5yystackEnd ); } -#endif if( fts5yyNewState > fts5YY_MAX_SHIFT ){ fts5yyNewState += fts5YY_MIN_REDUCE - fts5YY_MIN_SHIFTREDUCE; } - fts5yytos = fts5yypParser->fts5yytos; fts5yytos->stateno = fts5yyNewState; fts5yytos->major = fts5yyMajor; fts5yytos->minor.fts5yy0 = fts5yyMinor; @@ -224752,19 +235920,12 @@ static void sqlite3Fts5Parser( (int)(fts5yypParser->fts5yytos - fts5yypParser->fts5yystack)); } #endif -#if fts5YYSTACKDEPTH>0 if( fts5yypParser->fts5yytos>=fts5yypParser->fts5yystackEnd ){ - fts5yyStackOverflow(fts5yypParser); - break; - } -#else - if( fts5yypParser->fts5yytos>=&fts5yypParser->fts5yystack[fts5yypParser->fts5yystksz-1] ){ if( fts5yyGrowStack(fts5yypParser) ){ fts5yyStackOverflow(fts5yypParser); break; } } -#endif } fts5yyact = fts5yy_reduce(fts5yypParser,fts5yyruleno,fts5yymajor,fts5yyminor sqlite3Fts5ParserCTX_PARAM); }else if( fts5yyact <= fts5YY_MAX_SHIFTREDUCE ){ @@ -225020,15 +236181,19 @@ static int fts5CInstIterInit( */ typedef struct HighlightContext HighlightContext; struct HighlightContext { - CInstIter iter; /* Coalesced Instance Iterator */ - int iPos; /* Current token offset in zIn[] */ + /* Constant parameters to fts5HighlightCb() */ int iRangeStart; /* First token to include */ int iRangeEnd; /* If non-zero, last token to include */ const char *zOpen; /* Opening highlight */ const char *zClose; /* Closing highlight */ const char *zIn; /* Input text */ int nIn; /* Size of input text in bytes */ - int iOff; /* Current offset within zIn[] */ + + /* Variables modified by fts5HighlightCb() */ + CInstIter iter; /* Coalesced Instance Iterator */ + int iPos; /* Current token offset in zIn[] */ + int iOff; /* Have copied up to this offset in zIn[] */ + int bOpen; /* True if highlight is open */ char *zOut; /* Output value */ }; @@ -225061,8 +236226,8 @@ static int fts5HighlightCb( int tflags, /* Mask of FTS5_TOKEN_* flags */ const char *pToken, /* Buffer containing token */ int nToken, /* Size of token in bytes */ - int iStartOff, /* Start offset of token */ - int iEndOff /* End offset of token */ + int iStartOff, /* Start byte offset of token */ + int iEndOff /* End byte offset of token */ ){ HighlightContext *p = (HighlightContext*)pContext; int rc = SQLITE_OK; @@ -225073,40 +236238,66 @@ static int fts5HighlightCb( if( tflags & FTS5_TOKEN_COLOCATED ) return SQLITE_OK; iPos = p->iPos++; - if( p->iRangeEnd>0 ){ + if( p->iRangeEnd>=0 ){ if( iPosiRangeStart || iPos>p->iRangeEnd ) return SQLITE_OK; if( p->iRangeStart && iPos==p->iRangeStart ) p->iOff = iStartOff; } - if( iPos==p->iter.iStart ){ + /* If the parenthesis is open, and this token is not part of the current + ** phrase, and the starting byte offset of this token is past the point + ** that has currently been copied into the output buffer, close the + ** parenthesis. */ + if( p->bOpen + && (iPos<=p->iter.iStart || p->iter.iStart<0) + && iStartOff>p->iOff + ){ + fts5HighlightAppend(&rc, p, p->zClose, -1); + p->bOpen = 0; + } + + /* If this is the start of a new phrase, and the highlight is not open: + ** + ** * copy text from the input up to the start of the phrase, and + ** * open the highlight. + */ + if( iPos==p->iter.iStart && p->bOpen==0 ){ fts5HighlightAppend(&rc, p, &p->zIn[p->iOff], iStartOff - p->iOff); fts5HighlightAppend(&rc, p, p->zOpen, -1); p->iOff = iStartOff; + p->bOpen = 1; } if( iPos==p->iter.iEnd ){ - if( p->iRangeEnd && p->iter.iStartiRangeStart ){ + if( p->bOpen==0 ){ + assert( p->iRangeEnd>=0 ); fts5HighlightAppend(&rc, p, p->zOpen, -1); + p->bOpen = 1; } fts5HighlightAppend(&rc, p, &p->zIn[p->iOff], iEndOff - p->iOff); - fts5HighlightAppend(&rc, p, p->zClose, -1); p->iOff = iEndOff; + if( rc==SQLITE_OK ){ rc = fts5CInstIterNext(&p->iter); } } - if( p->iRangeEnd>0 && iPos==p->iRangeEnd ){ - fts5HighlightAppend(&rc, p, &p->zIn[p->iOff], iEndOff - p->iOff); - p->iOff = iEndOff; - if( iPos>=p->iter.iStart && iPositer.iEnd ){ + if( iPos==p->iRangeEnd ){ + if( p->bOpen ){ + if( p->iter.iStart>=0 && iPos>=p->iter.iStart ){ + fts5HighlightAppend(&rc, p, &p->zIn[p->iOff], iEndOff - p->iOff); + p->iOff = iEndOff; + } fts5HighlightAppend(&rc, p, p->zClose, -1); + p->bOpen = 0; } + fts5HighlightAppend(&rc, p, &p->zIn[p->iOff], iEndOff - p->iOff); + p->iOff = iEndOff; } return rc; } + /* ** Implementation of highlight() function. */ @@ -225131,15 +236322,28 @@ static void fts5HighlightFunction( memset(&ctx, 0, sizeof(HighlightContext)); ctx.zOpen = (const char*)sqlite3_value_text(apVal[1]); ctx.zClose = (const char*)sqlite3_value_text(apVal[2]); + ctx.iRangeEnd = -1; rc = pApi->xColumnText(pFts, iCol, &ctx.zIn, &ctx.nIn); - - if( ctx.zIn ){ + if( rc==SQLITE_RANGE ){ + sqlite3_result_text(pCtx, "", -1, SQLITE_STATIC); + rc = SQLITE_OK; + }else if( ctx.zIn ){ + const char *pLoc = 0; /* Locale of column iCol */ + int nLoc = 0; /* Size of pLoc in bytes */ if( rc==SQLITE_OK ){ rc = fts5CInstIterInit(pApi, pFts, iCol, &ctx.iter); } if( rc==SQLITE_OK ){ - rc = pApi->xTokenize(pFts, ctx.zIn, ctx.nIn, (void*)&ctx,fts5HighlightCb); + rc = pApi->xColumnLocale(pFts, iCol, &pLoc, &nLoc); + } + if( rc==SQLITE_OK ){ + rc = pApi->xTokenize_v2( + pFts, ctx.zIn, ctx.nIn, pLoc, nLoc, (void*)&ctx, fts5HighlightCb + ); + } + if( ctx.bOpen ){ + fts5HighlightAppend(&rc, &ctx, ctx.zClose, -1); } fts5HighlightAppend(&rc, &ctx, &ctx.zIn[ctx.iOff], ctx.nIn - ctx.iOff); @@ -225316,6 +236520,7 @@ static void fts5SnippetFunction( iCol = sqlite3_value_int(apVal[0]); ctx.zOpen = fts5ValueToText(apVal[1]); ctx.zClose = fts5ValueToText(apVal[2]); + ctx.iRangeEnd = -1; zEllips = fts5ValueToText(apVal[3]); nToken = sqlite3_value_int(apVal[4]); @@ -225332,6 +236537,8 @@ static void fts5SnippetFunction( memset(&sFinder, 0, sizeof(Fts5SFinder)); for(i=0; ixColumnText(pFts, i, &sFinder.zDoc, &nDoc); if( rc!=SQLITE_OK ) break; - rc = pApi->xTokenize(pFts, - sFinder.zDoc, nDoc, (void*)&sFinder,fts5SentenceFinderCb + rc = pApi->xColumnLocale(pFts, i, &pLoc, &nLoc); + if( rc!=SQLITE_OK ) break; + rc = pApi->xTokenize_v2(pFts, + sFinder.zDoc, nDoc, pLoc, nLoc, (void*)&sFinder, fts5SentenceFinderCb ); if( rc!=SQLITE_OK ) break; rc = pApi->xColumnSize(pFts, i, &nDocsize); @@ -225398,6 +236607,9 @@ static void fts5SnippetFunction( rc = pApi->xColumnSize(pFts, iBestCol, &nColSize); } if( ctx.zIn ){ + const char *pLoc = 0; /* Locale of column iBestCol */ + int nLoc = 0; /* Bytes in pLoc */ + if( rc==SQLITE_OK ){ rc = fts5CInstIterInit(pApi, pFts, iBestCol, &ctx.iter); } @@ -225416,7 +236628,15 @@ static void fts5SnippetFunction( } if( rc==SQLITE_OK ){ - rc = pApi->xTokenize(pFts, ctx.zIn, ctx.nIn, (void*)&ctx,fts5HighlightCb); + rc = pApi->xColumnLocale(pFts, iBestCol, &pLoc, &nLoc); + } + if( rc==SQLITE_OK ){ + rc = pApi->xTokenize_v2( + pFts, ctx.zIn, ctx.nIn, pLoc, nLoc, (void*)&ctx,fts5HighlightCb + ); + } + if( ctx.bOpen ){ + fts5HighlightAppend(&rc, &ctx, ctx.zClose, -1); } if( ctx.iRangeEnd>=(nColSize-1) ){ fts5HighlightAppend(&rc, &ctx, &ctx.zIn[ctx.iOff], ctx.nIn - ctx.iOff); @@ -225597,6 +236817,53 @@ static void fts5Bm25Function( } } +/* +** Implementation of fts5_get_locale() function. +*/ +static void fts5GetLocaleFunction( + const Fts5ExtensionApi *pApi, /* API offered by current FTS version */ + Fts5Context *pFts, /* First arg to pass to pApi functions */ + sqlite3_context *pCtx, /* Context for returning result/error */ + int nVal, /* Number of values in apVal[] array */ + sqlite3_value **apVal /* Array of trailing arguments */ +){ + int iCol = 0; + int eType = 0; + int rc = SQLITE_OK; + const char *zLocale = 0; + int nLocale = 0; + + /* xColumnLocale() must be available */ + assert( pApi->iVersion>=4 ); + + if( nVal!=1 ){ + const char *z = "wrong number of arguments to function fts5_get_locale()"; + sqlite3_result_error(pCtx, z, -1); + return; + } + + eType = sqlite3_value_numeric_type(apVal[0]); + if( eType!=SQLITE_INTEGER ){ + const char *z = "non-integer argument passed to function fts5_get_locale()"; + sqlite3_result_error(pCtx, z, -1); + return; + } + + iCol = sqlite3_value_int(apVal[0]); + if( iCol<0 || iCol>=pApi->xColumnCount(pFts) ){ + sqlite3_result_error_code(pCtx, SQLITE_RANGE); + return; + } + + rc = pApi->xColumnLocale(pFts, iCol, &zLocale, &nLocale); + if( rc!=SQLITE_OK ){ + sqlite3_result_error_code(pCtx, rc); + return; + } + + sqlite3_result_text(pCtx, zLocale, nLocale, SQLITE_TRANSIENT); +} + static int sqlite3Fts5AuxInit(fts5_api *pApi){ struct Builtin { const char *zFunc; /* Function name (nul-terminated) */ @@ -225604,9 +236871,10 @@ static int sqlite3Fts5AuxInit(fts5_api *pApi){ fts5_extension_function xFunc;/* Callback function */ void (*xDestroy)(void*); /* Destructor function */ } aBuiltin [] = { - { "snippet", 0, fts5SnippetFunction, 0 }, - { "highlight", 0, fts5HighlightFunction, 0 }, - { "bm25", 0, fts5Bm25Function, 0 }, + { "snippet", 0, fts5SnippetFunction, 0 }, + { "highlight", 0, fts5HighlightFunction, 0 }, + { "bm25", 0, fts5Bm25Function, 0 }, + { "fts5_get_locale", 0, fts5GetLocaleFunction, 0 }, }; int rc = SQLITE_OK; /* Return code */ int i; /* To iterate through builtin functions */ @@ -225693,6 +236961,7 @@ static void sqlite3Fts5BufferAppendBlob( ){ if( nData ){ if( fts5BufferGrow(pRc, pBuf, nData) ) return; + assert( pBuf->p!=0 ); memcpy(&pBuf->p[pBuf->n], pData, nData); pBuf->n += nData; } @@ -225794,6 +237063,7 @@ static int sqlite3Fts5PoslistNext64( i64 *piOff /* IN/OUT: Current offset */ ){ int i = *pi; + assert( a!=0 || i==0 ); if( i>=n ){ /* EOF */ *piOff = -1; @@ -225801,6 +237071,7 @@ static int sqlite3Fts5PoslistNext64( }else{ i64 iOff = *piOff; u32 iVal; + assert( a!=0 ); fts5FastGetVarint32(a, i, iVal); if( iVal<=1 ){ if( iVal==0 ){ @@ -226056,6 +237327,8 @@ static void sqlite3Fts5TermsetFree(Fts5Termset *p){ #define FTS5_DEFAULT_CRISISMERGE 16 #define FTS5_DEFAULT_HASHSIZE (1024*1024) +#define FTS5_DEFAULT_DELETE_AUTOMERGE 10 /* default 10% */ + /* Maximum allowed page size */ #define FTS5_MAX_PAGE_SIZE (64*1024) @@ -226266,7 +237539,6 @@ static int fts5ConfigSetEnum( ** eventually free any such error message using sqlite3_free(). */ static int fts5ConfigParseSpecial( - Fts5Global *pGlobal, Fts5Config *pConfig, /* Configuration object to update */ const char *zCmd, /* Special command to parse */ const char *zArg, /* Argument to parse */ @@ -226274,6 +237546,7 @@ static int fts5ConfigParseSpecial( ){ int rc = SQLITE_OK; int nCmd = (int)strlen(zCmd); + if( sqlite3_strnicmp("prefix", zCmd, nCmd)==0 ){ const int nByte = sizeof(int) * FTS5_MAX_PREFIX_INDEXES; const char *p; @@ -226330,12 +237603,11 @@ static int fts5ConfigParseSpecial( if( sqlite3_strnicmp("tokenize", zCmd, nCmd)==0 ){ const char *p = (const char*)zArg; sqlite3_int64 nArg = strlen(zArg) + 1; - char **azArg = sqlite3Fts5MallocZero(&rc, sizeof(char*) * nArg); - char *pDel = sqlite3Fts5MallocZero(&rc, nArg * 2); - char *pSpace = pDel; + char **azArg = sqlite3Fts5MallocZero(&rc, (sizeof(char*) + 2) * nArg); - if( azArg && pSpace ){ - if( pConfig->pTok ){ + if( azArg ){ + char *pSpace = (char*)&azArg[nArg]; + if( pConfig->t.azArg ){ *pzErr = sqlite3_mprintf("multiple tokenize=... directives"); rc = SQLITE_ERROR; }else{ @@ -226358,16 +237630,14 @@ static int fts5ConfigParseSpecial( *pzErr = sqlite3_mprintf("parse error in tokenize directive"); rc = SQLITE_ERROR; }else{ - rc = sqlite3Fts5GetTokenizer(pGlobal, - (const char**)azArg, (int)nArg, pConfig, - pzErr - ); + pConfig->t.azArg = (const char**)azArg; + pConfig->t.nArg = nArg; + azArg = 0; } } } - sqlite3_free(azArg); - sqlite3_free(pDel); + return rc; } @@ -226386,6 +237656,26 @@ static int fts5ConfigParseSpecial( return rc; } + if( sqlite3_strnicmp("contentless_delete", zCmd, nCmd)==0 ){ + if( (zArg[0]!='0' && zArg[0]!='1') || zArg[1]!='\0' ){ + *pzErr = sqlite3_mprintf("malformed contentless_delete=... directive"); + rc = SQLITE_ERROR; + }else{ + pConfig->bContentlessDelete = (zArg[0]=='1'); + } + return rc; + } + + if( sqlite3_strnicmp("contentless_unindexed", zCmd, nCmd)==0 ){ + if( (zArg[0]!='0' && zArg[0]!='1') || zArg[1]!='\0' ){ + *pzErr = sqlite3_mprintf("malformed contentless_delete=... directive"); + rc = SQLITE_ERROR; + }else{ + pConfig->bContentlessUnindexed = (zArg[0]=='1'); + } + return rc; + } + if( sqlite3_strnicmp("content_rowid", zCmd, nCmd)==0 ){ if( pConfig->zContentRowid ){ *pzErr = sqlite3_mprintf("multiple content_rowid=... directives"); @@ -226406,6 +237696,16 @@ static int fts5ConfigParseSpecial( return rc; } + if( sqlite3_strnicmp("locale", zCmd, nCmd)==0 ){ + if( (zArg[0]!='0' && zArg[0]!='1') || zArg[1]!='\0' ){ + *pzErr = sqlite3_mprintf("malformed locale=... directive"); + rc = SQLITE_ERROR; + }else{ + pConfig->bLocale = (zArg[0]=='1'); + } + return rc; + } + if( sqlite3_strnicmp("detail", zCmd, nCmd)==0 ){ const Fts5Enum aDetail[] = { { "none", FTS5_DETAIL_NONE }, @@ -226420,20 +237720,20 @@ static int fts5ConfigParseSpecial( return rc; } + if( sqlite3_strnicmp("tokendata", zCmd, nCmd)==0 ){ + if( (zArg[0]!='0' && zArg[0]!='1') || zArg[1]!='\0' ){ + *pzErr = sqlite3_mprintf("malformed tokendata=... directive"); + rc = SQLITE_ERROR; + }else{ + pConfig->bTokendata = (zArg[0]=='1'); + } + return rc; + } + *pzErr = sqlite3_mprintf("unrecognized option: \"%.*s\"", nCmd, zCmd); return SQLITE_ERROR; } -/* -** Allocate an instance of the default tokenizer ("simple") at -** Fts5Config.pTokenizer. Return SQLITE_OK if successful, or an SQLite error -** code if an error occurs. -*/ -static int fts5ConfigDefaultTokenizer(Fts5Global *pGlobal, Fts5Config *pConfig){ - assert( pConfig->pTok==0 && pConfig->pTokApi==0 ); - return sqlite3Fts5GetTokenizer(pGlobal, 0, 0, pConfig, 0); -} - /* ** Gobble up the first bareword or quoted word from the input buffer zIn. ** Return a pointer to the character immediately following the last in @@ -226493,7 +237793,8 @@ static int fts5ConfigParseColumn( Fts5Config *p, char *zCol, char *zArg, - char **pzErr + char **pzErr, + int *pbUnindexed ){ int rc = SQLITE_OK; if( 0==sqlite3_stricmp(zCol, FTS5_RANK_NAME) @@ -226504,6 +237805,7 @@ static int fts5ConfigParseColumn( }else if( zArg ){ if( 0==sqlite3_stricmp(zArg, "unindexed") ){ p->abUnindexed[p->nCol] = 1; + *pbUnindexed = 1; }else{ *pzErr = sqlite3_mprintf("unrecognized column option: %s", zArg); rc = SQLITE_ERROR; @@ -226524,11 +237826,26 @@ static int fts5ConfigMakeExprlist(Fts5Config *p){ sqlite3Fts5BufferAppendPrintf(&rc, &buf, "T.%Q", p->zContentRowid); if( p->eContent!=FTS5_CONTENT_NONE ){ + assert( p->eContent==FTS5_CONTENT_EXTERNAL + || p->eContent==FTS5_CONTENT_NORMAL + || p->eContent==FTS5_CONTENT_UNINDEXED + ); for(i=0; inCol; i++){ if( p->eContent==FTS5_CONTENT_EXTERNAL ){ sqlite3Fts5BufferAppendPrintf(&rc, &buf, ", T.%Q", p->azCol[i]); - }else{ + }else if( p->eContent==FTS5_CONTENT_NORMAL || p->abUnindexed[i] ){ sqlite3Fts5BufferAppendPrintf(&rc, &buf, ", T.c%d", i); + }else{ + sqlite3Fts5BufferAppendPrintf(&rc, &buf, ", NULL"); + } + } + } + if( p->eContent==FTS5_CONTENT_NORMAL && p->bLocale ){ + for(i=0; inCol; i++){ + if( p->abUnindexed[i]==0 ){ + sqlite3Fts5BufferAppendPrintf(&rc, &buf, ", T.l%d", i); + }else{ + sqlite3Fts5BufferAppendPrintf(&rc, &buf, ", NULL"); } } } @@ -226562,10 +237879,12 @@ static int sqlite3Fts5ConfigParse( Fts5Config *pRet; /* New object to return */ int i; sqlite3_int64 nByte; + int bUnindexed = 0; /* True if there are one or more UNINDEXED */ *ppOut = pRet = (Fts5Config*)sqlite3_malloc(sizeof(Fts5Config)); if( pRet==0 ) return SQLITE_NOMEM; memset(pRet, 0, sizeof(Fts5Config)); + pRet->pGlobal = pGlobal; pRet->db = db; pRet->iCookie = -1; @@ -226584,6 +237903,7 @@ static int sqlite3Fts5ConfigParse( rc = SQLITE_ERROR; } + assert( (pRet->abUnindexed && pRet->azCol) || rc!=SQLITE_OK ); for(i=3; rc==SQLITE_OK && ipTok==0 ){ - rc = fts5ConfigDefaultTokenizer(pGlobal, pRet); + /* We only allow contentless_delete=1 if the table is indeed contentless. */ + if( rc==SQLITE_OK + && pRet->bContentlessDelete + && pRet->eContent!=FTS5_CONTENT_NONE + ){ + *pzErr = sqlite3_mprintf( + "contentless_delete=1 requires a contentless table" + ); + rc = SQLITE_ERROR; + } + + /* We only allow contentless_delete=1 if columnsize=0 is not present. + ** + ** This restriction may be removed at some point. + */ + if( rc==SQLITE_OK && pRet->bContentlessDelete && pRet->bColumnsize==0 ){ + *pzErr = sqlite3_mprintf( + "contentless_delete=1 is incompatible with columnsize=0" + ); + rc = SQLITE_ERROR; + } + + /* We only allow contentless_unindexed=1 if the table is actually a + ** contentless one. + */ + if( rc==SQLITE_OK + && pRet->bContentlessUnindexed + && pRet->eContent!=FTS5_CONTENT_NONE + ){ + *pzErr = sqlite3_mprintf( + "contentless_unindexed=1 requires a contentless table" + ); + rc = SQLITE_ERROR; } /* If no zContent option was specified, fill in the default values. */ @@ -226644,6 +237992,9 @@ static int sqlite3Fts5ConfigParse( ); if( pRet->eContent==FTS5_CONTENT_NORMAL ){ zTail = "content"; + }else if( bUnindexed && pRet->bContentlessUnindexed ){ + pRet->eContent = FTS5_CONTENT_UNINDEXED; + zTail = "content"; }else if( pRet->bColumnsize ){ zTail = "docsize"; } @@ -226677,9 +238028,14 @@ static int sqlite3Fts5ConfigParse( static void sqlite3Fts5ConfigFree(Fts5Config *pConfig){ if( pConfig ){ int i; - if( pConfig->pTok ){ - pConfig->pTokApi->xDelete(pConfig->pTok); + if( pConfig->t.pTok ){ + if( pConfig->t.pApi1 ){ + pConfig->t.pApi1->xDelete(pConfig->t.pTok); + }else{ + pConfig->t.pApi2->xDelete(pConfig->t.pTok); + } } + sqlite3_free((char*)pConfig->t.azArg); sqlite3_free(pConfig->zDb); sqlite3_free(pConfig->zName); for(i=0; inCol; i++){ @@ -226754,10 +238110,24 @@ static int sqlite3Fts5Tokenize( void *pCtx, /* Context passed to xToken() */ int (*xToken)(void*, int, const char*, int, int, int) /* Callback */ ){ - if( pText==0 ) return SQLITE_OK; - return pConfig->pTokApi->xTokenize( - pConfig->pTok, pCtx, flags, pText, nText, xToken - ); + int rc = SQLITE_OK; + if( pText ){ + if( pConfig->t.pTok==0 ){ + rc = sqlite3Fts5LoadTokenizer(pConfig); + } + if( rc==SQLITE_OK ){ + if( pConfig->t.pApi1 ){ + rc = pConfig->t.pApi1->xTokenize( + pConfig->t.pTok, pCtx, flags, pText, nText, xToken + ); + }else{ + rc = pConfig->t.pApi2->xTokenize(pConfig->t.pTok, pCtx, flags, + pText, nText, pConfig->t.pLocale, pConfig->t.nLocale, xToken + ); + } + } + } + return rc; } /* @@ -226923,6 +238293,18 @@ static int sqlite3Fts5ConfigSetValue( } } + else if( 0==sqlite3_stricmp(zKey, "deletemerge") ){ + int nVal = -1; + if( SQLITE_INTEGER==sqlite3_value_numeric_type(pVal) ){ + nVal = sqlite3_value_int(pVal); + }else{ + *pbBadkey = 1; + } + if( nVal<0 ) nVal = FTS5_DEFAULT_DELETE_AUTOMERGE; + if( nVal>100 ) nVal = 0; + pConfig->nDeleteMerge = nVal; + } + else if( 0==sqlite3_stricmp(zKey, "rank") ){ const char *zIn = (const char*)sqlite3_value_text(pVal); char *zRank; @@ -226937,6 +238319,18 @@ static int sqlite3Fts5ConfigSetValue( rc = SQLITE_OK; *pbBadkey = 1; } + } + + else if( 0==sqlite3_stricmp(zKey, "secure-delete") ){ + int bVal = -1; + if( SQLITE_INTEGER==sqlite3_value_numeric_type(pVal) ){ + bVal = sqlite3_value_int(pVal); + } + if( bVal<0 ){ + *pbBadkey = 1; + }else{ + pConfig->bSecureDelete = (bVal ? 1 : 0); + } }else{ *pbBadkey = 1; } @@ -226959,6 +238353,7 @@ static int sqlite3Fts5ConfigLoad(Fts5Config *pConfig, int iCookie){ pConfig->nUsermerge = FTS5_DEFAULT_USERMERGE; pConfig->nCrisisMerge = FTS5_DEFAULT_CRISISMERGE; pConfig->nHashSize = FTS5_DEFAULT_HASHSIZE; + pConfig->nDeleteMerge = FTS5_DEFAULT_DELETE_AUTOMERGE; zSql = sqlite3Fts5Mprintf(&rc, zSelect, pConfig->zDb, pConfig->zName); if( zSql ){ @@ -226981,15 +238376,17 @@ static int sqlite3Fts5ConfigLoad(Fts5Config *pConfig, int iCookie){ rc = sqlite3_finalize(p); } - if( rc==SQLITE_OK && iVersion!=FTS5_CURRENT_VERSION ){ + if( rc==SQLITE_OK + && iVersion!=FTS5_CURRENT_VERSION + && iVersion!=FTS5_CURRENT_VERSION_SECUREDELETE + ){ rc = SQLITE_ERROR; - if( pConfig->pzErrmsg ){ - assert( 0==*pConfig->pzErrmsg ); - *pConfig->pzErrmsg = sqlite3_mprintf( - "invalid fts5 file format (found %d, expected %d) - run 'rebuild'", - iVersion, FTS5_CURRENT_VERSION - ); - } + sqlite3Fts5ConfigErrmsg(pConfig, "invalid fts5 file format " + "(found %d, expected %d or %d) - run 'rebuild'", + iVersion, FTS5_CURRENT_VERSION, FTS5_CURRENT_VERSION_SECUREDELETE + ); + }else{ + pConfig->iVersion = iVersion; } if( rc==SQLITE_OK ){ @@ -226998,6 +238395,29 @@ static int sqlite3Fts5ConfigLoad(Fts5Config *pConfig, int iCookie){ return rc; } +/* +** Set (*pConfig->pzErrmsg) to point to an sqlite3_malloc()ed buffer +** containing the error message created using printf() style formatting +** string zFmt and its trailing arguments. +*/ +static void sqlite3Fts5ConfigErrmsg(Fts5Config *pConfig, const char *zFmt, ...){ + va_list ap; /* ... printf arguments */ + char *zMsg = 0; + + va_start(ap, zFmt); + zMsg = sqlite3_vmprintf(zFmt, ap); + if( pConfig->pzErrmsg ){ + assert( *pConfig->pzErrmsg==0 ); + *pConfig->pzErrmsg = zMsg; + }else{ + sqlite3_free(zMsg); + } + + va_end(ap); +} + + + /* ** 2014 May 31 ** @@ -227017,6 +238437,10 @@ static int sqlite3Fts5ConfigLoad(Fts5Config *pConfig, int iCookie){ /* #include "fts5Int.h" */ /* #include "fts5parse.h" */ +#ifndef SQLITE_FTS5_MAX_EXPR_DEPTH +# define SQLITE_FTS5_MAX_EXPR_DEPTH 256 +#endif + /* ** All token types in the generated fts5parse.h file are greater than 0. */ @@ -227050,18 +238474,28 @@ struct Fts5Expr { /* ** eType: -** Expression node type. Always one of: +** Expression node type. Usually one of: ** ** FTS5_AND (nChild, apChild valid) ** FTS5_OR (nChild, apChild valid) ** FTS5_NOT (nChild, apChild valid) ** FTS5_STRING (pNear valid) ** FTS5_TERM (pNear valid) +** +** An expression node with eType==0 may also exist. It always matches zero +** rows. This is created when a phrase containing no tokens is parsed. +** e.g. "". +** +** iHeight: +** Distance from this node to furthest leaf. This is always 0 for nodes +** of type FTS5_STRING and FTS5_TERM. For all other nodes it is one +** greater than the largest child value. */ struct Fts5ExprNode { int eType; /* Node type */ int bEof; /* True at EOF */ int bNomatch; /* True if entry is not a match */ + int iHeight; /* Distance to tree leaf nodes */ /* Next method for this node. */ int (*xNext)(Fts5Expr*, Fts5ExprNode*, int, i64); @@ -227090,7 +238524,9 @@ struct Fts5ExprNode { struct Fts5ExprTerm { u8 bPrefix; /* True for a prefix term */ u8 bFirst; /* True if token must be first in column */ - char *zTerm; /* nul-terminated term */ + char *pTerm; /* Term data */ + int nQueryTerm; /* Effective size of term in bytes */ + int nFullTerm; /* Size of term in bytes incl. tokendata */ Fts5IndexIter *pIter; /* Iterator for this term */ Fts5ExprTerm *pSynonym; /* Pointer to first in list of synonyms */ }; @@ -227131,6 +238567,31 @@ struct Fts5Parse { int bPhraseToAnd; /* Convert "a+b" to "a AND b" */ }; +/* +** Check that the Fts5ExprNode.iHeight variables are set correctly in +** the expression tree passed as the only argument. +*/ +#ifndef NDEBUG +static void assert_expr_depth_ok(int rc, Fts5ExprNode *p){ + if( rc==SQLITE_OK ){ + if( p->eType==FTS5_TERM || p->eType==FTS5_STRING || p->eType==0 ){ + assert( p->iHeight==0 ); + }else{ + int ii; + int iMaxChild = 0; + for(ii=0; iinChild; ii++){ + Fts5ExprNode *pChild = p->apChild[ii]; + iMaxChild = MAX(iMaxChild, pChild->iHeight); + assert_expr_depth_ok(SQLITE_OK, pChild); + } + assert( p->iHeight==iMaxChild+1 ); + } + } +} +#else +# define assert_expr_depth_ok(rc, p) +#endif + static void sqlite3Fts5ParseError(Fts5Parse *pParse, const char *zFmt, ...){ va_list ap; va_start(ap, zFmt); @@ -227245,9 +238706,12 @@ static int sqlite3Fts5ExprNew( }while( sParse.rc==SQLITE_OK && t!=FTS5_EOF ); sqlite3Fts5ParserFree(pEngine, fts5ParseFree); + assert( sParse.pExpr || sParse.rc!=SQLITE_OK ); + assert_expr_depth_ok(sParse.rc, sParse.pExpr); + /* If the LHS of the MATCH expression was a user column, apply the ** implicit column-filter. */ - if( iColnCol && sParse.pExpr && sParse.rc==SQLITE_OK ){ + if( sParse.rc==SQLITE_OK && iColnCol ){ int n = sizeof(Fts5Colset); Fts5Colset *pColset = (Fts5Colset*)sqlite3Fts5MallocZero(&sParse.rc, n); if( pColset ){ @@ -227264,15 +238728,7 @@ static int sqlite3Fts5ExprNew( sParse.rc = SQLITE_NOMEM; sqlite3Fts5ParseNodeFree(sParse.pExpr); }else{ - if( !sParse.pExpr ){ - const int nByte = sizeof(Fts5ExprNode); - pNew->pRoot = (Fts5ExprNode*)sqlite3Fts5MallocZero(&sParse.rc, nByte); - if( pNew->pRoot ){ - pNew->pRoot->bEof = 1; - } - }else{ - pNew->pRoot = sParse.pExpr; - } + pNew->pRoot = sParse.pExpr; pNew->pIndex = 0; pNew->pConfig = pConfig; pNew->apExprPhrase = sParse.apPhrase; @@ -227285,7 +238741,11 @@ static int sqlite3Fts5ExprNew( } sqlite3_free(sParse.apPhrase); - *pzErr = sParse.zErr; + if( 0==*pzErr ){ + *pzErr = sParse.zErr; + }else{ + sqlite3_free(sParse.zErr); + } return sParse.rc; } @@ -227407,7 +238867,7 @@ static int sqlite3Fts5ExprAnd(Fts5Expr **pp1, Fts5Expr *p2){ Fts5Parse sParse; memset(&sParse, 0, sizeof(sParse)); - if( *pp1 ){ + if( *pp1 && p2 ){ Fts5Expr *p1 = *pp1; int nPhrase = p1->nPhrase + p2->nPhrase; @@ -227432,7 +238892,7 @@ static int sqlite3Fts5ExprAnd(Fts5Expr **pp1, Fts5Expr *p2){ } sqlite3_free(p2->apExprPhrase); sqlite3_free(p2); - }else{ + }else if( p2 ){ *pp1 = p2; } @@ -227930,7 +239390,7 @@ static int fts5ExprNearInitAll( p->pIter = 0; } rc = sqlite3Fts5IndexQuery( - pExpr->pIndex, p->zTerm, (int)strlen(p->zTerm), + pExpr->pIndex, p->pTerm, p->nQueryTerm, (pTerm->bPrefix ? FTS5INDEX_QUERY_PREFIX : 0) | (pExpr->bDesc ? FTS5INDEX_QUERY_DESC : 0), pNear->pColset, @@ -228086,7 +239546,7 @@ static int fts5ExprNodeTest_STRING( } }else{ Fts5IndexIter *pIter = pPhrase->aTerm[j].pIter; - if( pIter->iRowid==iLast || pIter->bEof ) continue; + if( pIter->iRowid==iLast ) continue; bMatch = 0; if( fts5ExprAdvanceto(pIter, bDesc, &iLast, &rc, &pNode->bEof) ){ return rc; @@ -228567,7 +240027,7 @@ static void fts5ExprPhraseFree(Fts5ExprPhrase *pPhrase){ Fts5ExprTerm *pSyn; Fts5ExprTerm *pNext; Fts5ExprTerm *pTerm = &pPhrase->aTerm[i]; - sqlite3_free(pTerm->zTerm); + sqlite3_free(pTerm->pTerm); sqlite3Fts5IterClose(pTerm->pIter); for(pSyn=pTerm->pSynonym; pSyn; pSyn=pNext){ pNext = pSyn->pSynonym; @@ -228608,9 +240068,6 @@ static Fts5ExprNearset *sqlite3Fts5ParseNearset( Fts5ExprNearset *pRet = 0; if( pParse->rc==SQLITE_OK ){ - if( pPhrase==0 ){ - return pNear; - } if( pNear==0 ){ sqlite3_int64 nByte; nByte = sizeof(Fts5ExprNearset) + SZALLOC * sizeof(Fts5ExprPhrase*); @@ -228665,6 +240122,7 @@ static Fts5ExprNearset *sqlite3Fts5ParseNearset( typedef struct TokenCtx TokenCtx; struct TokenCtx { Fts5ExprPhrase *pPhrase; + Fts5Config *pConfig; int rc; }; @@ -228698,8 +240156,12 @@ static int fts5ParseTokenize( rc = SQLITE_NOMEM; }else{ memset(pSyn, 0, (size_t)nByte); - pSyn->zTerm = ((char*)pSyn) + sizeof(Fts5ExprTerm) + sizeof(Fts5Buffer); - memcpy(pSyn->zTerm, pToken, nToken); + pSyn->pTerm = ((char*)pSyn) + sizeof(Fts5ExprTerm) + sizeof(Fts5Buffer); + pSyn->nFullTerm = pSyn->nQueryTerm = nToken; + if( pCtx->pConfig->bTokendata ){ + pSyn->nQueryTerm = (int)strlen(pSyn->pTerm); + } + memcpy(pSyn->pTerm, pToken, nToken); pSyn->pSynonym = pPhrase->aTerm[pPhrase->nTerm-1].pSynonym; pPhrase->aTerm[pPhrase->nTerm-1].pSynonym = pSyn; } @@ -228724,7 +240186,11 @@ static int fts5ParseTokenize( if( rc==SQLITE_OK ){ pTerm = &pPhrase->aTerm[pPhrase->nTerm++]; memset(pTerm, 0, sizeof(Fts5ExprTerm)); - pTerm->zTerm = sqlite3Fts5Strndup(&rc, pToken, nToken); + pTerm->pTerm = sqlite3Fts5Strndup(&rc, pToken, nToken); + pTerm->nFullTerm = pTerm->nQueryTerm = nToken; + if( pCtx->pConfig->bTokendata && rc==SQLITE_OK ){ + pTerm->nQueryTerm = (int)strlen(pTerm->pTerm); + } } } @@ -228791,6 +240257,7 @@ static Fts5ExprPhrase *sqlite3Fts5ParseTerm( memset(&sCtx, 0, sizeof(TokenCtx)); sCtx.pPhrase = pAppend; + sCtx.pConfig = pConfig; rc = fts5ParseStringFromToken(pToken, &z); if( rc==SQLITE_OK ){ @@ -228822,6 +240289,7 @@ static Fts5ExprPhrase *sqlite3Fts5ParseTerm( }else if( sCtx.pPhrase->nTerm ){ sCtx.pPhrase->aTerm[sCtx.pPhrase->nTerm-1].bPrefix = (u8)bPrefix; } + assert( pParse->apPhrase!=0 ); pParse->apPhrase[pParse->nPhrase-1] = sCtx.pPhrase; } @@ -228838,12 +240306,15 @@ static int sqlite3Fts5ExprClonePhrase( Fts5Expr **ppNew ){ int rc = SQLITE_OK; /* Return code */ - Fts5ExprPhrase *pOrig; /* The phrase extracted from pExpr */ + Fts5ExprPhrase *pOrig = 0; /* The phrase extracted from pExpr */ Fts5Expr *pNew = 0; /* Expression to return via *ppNew */ - TokenCtx sCtx = {0,0}; /* Context object for fts5ParseTokenize */ - - pOrig = pExpr->apExprPhrase[iPhrase]; - pNew = (Fts5Expr*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5Expr)); + TokenCtx sCtx = {0,0,0}; /* Context object for fts5ParseTokenize */ + if( !pExpr || iPhrase<0 || iPhrase>=pExpr->nPhrase ){ + rc = SQLITE_RANGE; + }else{ + pOrig = pExpr->apExprPhrase[iPhrase]; + pNew = (Fts5Expr*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5Expr)); + } if( rc==SQLITE_OK ){ pNew->apExprPhrase = (Fts5ExprPhrase**)sqlite3Fts5MallocZero(&rc, sizeof(Fts5ExprPhrase*)); @@ -228856,7 +240327,7 @@ static int sqlite3Fts5ExprClonePhrase( pNew->pRoot->pNear = (Fts5ExprNearset*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5ExprNearset) + sizeof(Fts5ExprPhrase*)); } - if( rc==SQLITE_OK ){ + if( rc==SQLITE_OK && ALWAYS(pOrig!=0) ){ Fts5Colset *pColsetOrig = pOrig->pNode->pNear->pColset; if( pColsetOrig ){ sqlite3_int64 nByte; @@ -228870,26 +240341,27 @@ static int sqlite3Fts5ExprClonePhrase( } } - if( pOrig->nTerm ){ - int i; /* Used to iterate through phrase terms */ - for(i=0; rc==SQLITE_OK && inTerm; i++){ - int tflags = 0; - Fts5ExprTerm *p; - for(p=&pOrig->aTerm[i]; p && rc==SQLITE_OK; p=p->pSynonym){ - const char *zTerm = p->zTerm; - rc = fts5ParseTokenize((void*)&sCtx, tflags, zTerm, (int)strlen(zTerm), - 0, 0); - tflags = FTS5_TOKEN_COLOCATED; - } - if( rc==SQLITE_OK ){ - sCtx.pPhrase->aTerm[i].bPrefix = pOrig->aTerm[i].bPrefix; - sCtx.pPhrase->aTerm[i].bFirst = pOrig->aTerm[i].bFirst; + if( rc==SQLITE_OK ){ + if( pOrig->nTerm ){ + int i; /* Used to iterate through phrase terms */ + sCtx.pConfig = pExpr->pConfig; + for(i=0; rc==SQLITE_OK && inTerm; i++){ + int tflags = 0; + Fts5ExprTerm *p; + for(p=&pOrig->aTerm[i]; p && rc==SQLITE_OK; p=p->pSynonym){ + rc = fts5ParseTokenize((void*)&sCtx,tflags,p->pTerm,p->nFullTerm,0,0); + tflags = FTS5_TOKEN_COLOCATED; + } + if( rc==SQLITE_OK ){ + sCtx.pPhrase->aTerm[i].bPrefix = pOrig->aTerm[i].bPrefix; + sCtx.pPhrase->aTerm[i].bFirst = pOrig->aTerm[i].bFirst; + } } + }else{ + /* This happens when parsing a token or quoted phrase that contains + ** no token characters at all. (e.g ... MATCH '""'). */ + sCtx.pPhrase = sqlite3Fts5MallocZero(&rc, sizeof(Fts5ExprPhrase)); } - }else{ - /* This happens when parsing a token or quoted phrase that contains - ** no token characters at all. (e.g ... MATCH '""'). */ - sCtx.pPhrase = sqlite3Fts5MallocZero(&rc, sizeof(Fts5ExprPhrase)); } if( rc==SQLITE_OK && ALWAYS(sCtx.pPhrase) ){ @@ -229205,7 +240677,11 @@ static void fts5ExprAssignXNext(Fts5ExprNode *pNode){ } } +/* +** Add pSub as a child of p. +*/ static void fts5ExprAddChildren(Fts5ExprNode *p, Fts5ExprNode *pSub){ + int ii = p->nChild; if( p->eType!=FTS5_NOT && pSub->eType==p->eType ){ int nByte = sizeof(Fts5ExprNode*) * pSub->nChild; memcpy(&p->apChild[p->nChild], pSub->apChild, nByte); @@ -229214,6 +240690,9 @@ static void fts5ExprAddChildren(Fts5ExprNode *p, Fts5ExprNode *pSub){ }else{ p->apChild[p->nChild++] = pSub; } + for( ; iinChild; ii++){ + p->iHeight = MAX(p->iHeight, p->apChild[ii]->iHeight + 1); + } } /* @@ -229244,6 +240723,7 @@ static Fts5ExprNode *fts5ParsePhraseToAnd( if( pRet ){ pRet->eType = FTS5_AND; pRet->nChild = nTerm; + pRet->iHeight = 1; fts5ExprAssignXNext(pRet); pParse->nPhrase--; for(ii=0; iiapPhrase[0]->aTerm[ii]; + Fts5ExprTerm *pTo = &pPhrase->aTerm[0]; pParse->apPhrase[pParse->nPhrase++] = pPhrase; pPhrase->nTerm = 1; - pPhrase->aTerm[0].zTerm = sqlite3Fts5Strndup( - &pParse->rc, pNear->apPhrase[0]->aTerm[ii].zTerm, -1 - ); + pTo->pTerm = sqlite3Fts5Strndup(&pParse->rc, p->pTerm, p->nFullTerm); + pTo->nQueryTerm = p->nQueryTerm; + pTo->nFullTerm = p->nFullTerm; pRet->apChild[ii] = sqlite3Fts5ParseNode(pParse, FTS5_STRING, 0, 0, sqlite3Fts5ParseNearset(pParse, 0, pPhrase) ); @@ -229342,13 +240824,25 @@ static Fts5ExprNode *sqlite3Fts5ParseNode( "fts5: %s queries are not supported (detail!=full)", pNear->nPhrase==1 ? "phrase": "NEAR" ); - sqlite3_free(pRet); + sqlite3Fts5ParseNodeFree(pRet); pRet = 0; + pNear = 0; + assert( pLeft==0 && pRight==0 ); } } }else{ + assert( pNear==0 ); fts5ExprAddChildren(pRet, pLeft); fts5ExprAddChildren(pRet, pRight); + pLeft = pRight = 0; + if( pRet->iHeight>SQLITE_FTS5_MAX_EXPR_DEPTH ){ + sqlite3Fts5ParseError(pParse, + "fts5 expression tree is too large (maximum depth %d)", + SQLITE_FTS5_MAX_EXPR_DEPTH + ); + sqlite3Fts5ParseNodeFree(pRet); + pRet = 0; + } } } } @@ -229384,6 +240878,7 @@ static Fts5ExprNode *sqlite3Fts5ParseImplicitAnd( assert( pRight->eType==FTS5_STRING || pRight->eType==FTS5_TERM || pRight->eType==FTS5_EOF + || (pRight->eType==FTS5_AND && pParse->bPhraseToAnd) ); if( pLeft->eType==FTS5_AND ){ @@ -229397,6 +240892,8 @@ static Fts5ExprNode *sqlite3Fts5ParseImplicitAnd( ); if( pRight->eType==FTS5_EOF ){ + assert( pParse->apPhrase!=0 ); + assert( pParse->nPhrase>0 ); assert( pParse->apPhrase[pParse->nPhrase-1]==pRight->pNear->apPhrase[0] ); sqlite3Fts5ParseNodeFree(pRight); pRet = pLeft; @@ -229427,7 +240924,7 @@ static Fts5ExprNode *sqlite3Fts5ParseImplicitAnd( return pRet; } -#ifdef SQLITE_TEST +#if defined(SQLITE_TEST) || defined(SQLITE_FTS5_DEBUG) static char *fts5ExprTermPrint(Fts5ExprTerm *pTerm){ sqlite3_int64 nByte = 0; Fts5ExprTerm *p; @@ -229435,16 +240932,17 @@ static char *fts5ExprTermPrint(Fts5ExprTerm *pTerm){ /* Determine the maximum amount of space required. */ for(p=pTerm; p; p=p->pSynonym){ - nByte += (int)strlen(pTerm->zTerm) * 2 + 3 + 2; + nByte += pTerm->nQueryTerm * 2 + 3 + 2; } zQuoted = sqlite3_malloc64(nByte); if( zQuoted ){ int i = 0; for(p=pTerm; p; p=p->pSynonym){ - char *zIn = p->zTerm; + char *zIn = p->pTerm; + char *zEnd = &zIn[p->nQueryTerm]; zQuoted[i++] = '"'; - while( *zIn ){ + while( zInnTerm; iTerm++){ - char *zTerm = pPhrase->aTerm[iTerm].zTerm; - zRet = fts5PrintfAppend(zRet, "%s%s", iTerm==0?"":" ", zTerm); + Fts5ExprTerm *p = &pPhrase->aTerm[iTerm]; + zRet = fts5PrintfAppend(zRet, "%s%.*s", iTerm==0?"":" ", + p->nQueryTerm, p->pTerm + ); if( pPhrase->aTerm[iTerm].bPrefix ){ zRet = fts5PrintfAppend(zRet, "*"); } @@ -229533,6 +241033,8 @@ static char *fts5ExprPrintTcl( if( zRet==0 ) return 0; } + }else if( pExpr->eType==0 ){ + zRet = sqlite3_mprintf("{}"); }else{ char const *zOp = 0; int i; @@ -229794,14 +241296,14 @@ static void fts5ExprFold( sqlite3_result_int(pCtx, sqlite3Fts5UnicodeFold(iCode, bRemoveDiacritics)); } } -#endif /* ifdef SQLITE_TEST */ +#endif /* if SQLITE_TEST || SQLITE_FTS5_DEBUG */ /* ** This is called during initialization to register the fts5_expr() scalar ** UDF with the SQLite handle passed as the only argument. */ static int sqlite3Fts5ExprInit(Fts5Global *pGlobal, sqlite3 *db){ -#ifdef SQLITE_TEST +#if defined(SQLITE_TEST) || defined(SQLITE_FTS5_DEBUG) struct Fts5ExprFunc { const char *z; void (*x)(sqlite3_context*,int,sqlite3_value**); @@ -229922,6 +241424,17 @@ static int fts5ExprColsetTest(Fts5Colset *pColset, int iCol){ return 0; } +/* +** pToken is a buffer nToken bytes in size that may or may not contain +** an embedded 0x00 byte. If it does, return the number of bytes in +** the buffer before the 0x00. If it does not, return nToken. +*/ +static int fts5QueryTerm(const char *pToken, int nToken){ + int ii; + for(ii=0; iipExpr; int i; + int nQuery = nToken; + i64 iRowid = pExpr->pRoot->iRowid; UNUSED_PARAM2(iUnused1, iUnused2); - if( nToken>FTS5_MAX_TOKEN_SIZE ) nToken = FTS5_MAX_TOKEN_SIZE; + if( nQuery>FTS5_MAX_TOKEN_SIZE ) nQuery = FTS5_MAX_TOKEN_SIZE; + if( pExpr->pConfig->bTokendata ){ + nQuery = fts5QueryTerm(pToken, nQuery); + } if( (tflags & FTS5_TOKEN_COLOCATED)==0 ) p->iOff++; for(i=0; inPhrase; i++){ - Fts5ExprTerm *pTerm; + Fts5ExprTerm *pT; if( p->aPopulator[i].bOk==0 ) continue; - for(pTerm=&pExpr->apExprPhrase[i]->aTerm[0]; pTerm; pTerm=pTerm->pSynonym){ - int nTerm = (int)strlen(pTerm->zTerm); - if( (nTerm==nToken || (nTermbPrefix)) - && memcmp(pTerm->zTerm, pToken, nTerm)==0 + for(pT=&pExpr->apExprPhrase[i]->aTerm[0]; pT; pT=pT->pSynonym){ + if( (pT->nQueryTerm==nQuery || (pT->nQueryTermbPrefix)) + && memcmp(pT->pTerm, pToken, pT->nQueryTerm)==0 ){ int rc = sqlite3Fts5PoslistWriterAppend( &pExpr->apExprPhrase[i]->poslist, &p->aPopulator[i].writer, p->iOff ); + if( rc==SQLITE_OK && pExpr->pConfig->bTokendata && !pT->bPrefix ){ + int iCol = p->iOff>>32; + int iTokOff = p->iOff & 0x7FFFFFFF; + rc = sqlite3Fts5IndexIterWriteTokendata( + pT->pIter, pToken, nToken, iRowid, iCol, iTokOff + ); + } if( rc ) return rc; break; } @@ -230002,6 +241526,7 @@ static int fts5ExprCheckPoslists(Fts5ExprNode *pNode, i64 iRowid){ pNode->iRowid = iRowid; pNode->bEof = 0; switch( pNode->eType ){ + case 0: case FTS5_TERM: case FTS5_STRING: return (pNode->pNear->apPhrase[0]->poslist.n>0); @@ -230084,6 +241609,83 @@ static int sqlite3Fts5ExprPhraseCollist( return rc; } +/* +** Does the work of the fts5_api.xQueryToken() API method. +*/ +static int sqlite3Fts5ExprQueryToken( + Fts5Expr *pExpr, + int iPhrase, + int iToken, + const char **ppOut, + int *pnOut +){ + Fts5ExprPhrase *pPhrase = 0; + + if( iPhrase<0 || iPhrase>=pExpr->nPhrase ){ + return SQLITE_RANGE; + } + pPhrase = pExpr->apExprPhrase[iPhrase]; + if( iToken<0 || iToken>=pPhrase->nTerm ){ + return SQLITE_RANGE; + } + + *ppOut = pPhrase->aTerm[iToken].pTerm; + *pnOut = pPhrase->aTerm[iToken].nFullTerm; + return SQLITE_OK; +} + +/* +** Does the work of the fts5_api.xInstToken() API method. +*/ +static int sqlite3Fts5ExprInstToken( + Fts5Expr *pExpr, + i64 iRowid, + int iPhrase, + int iCol, + int iOff, + int iToken, + const char **ppOut, + int *pnOut +){ + Fts5ExprPhrase *pPhrase = 0; + Fts5ExprTerm *pTerm = 0; + int rc = SQLITE_OK; + + if( iPhrase<0 || iPhrase>=pExpr->nPhrase ){ + return SQLITE_RANGE; + } + pPhrase = pExpr->apExprPhrase[iPhrase]; + if( iToken<0 || iToken>=pPhrase->nTerm ){ + return SQLITE_RANGE; + } + pTerm = &pPhrase->aTerm[iToken]; + if( pTerm->bPrefix==0 ){ + if( pExpr->pConfig->bTokendata ){ + rc = sqlite3Fts5IterToken( + pTerm->pIter, iRowid, iCol, iOff+iToken, ppOut, pnOut + ); + }else{ + *ppOut = pTerm->pTerm; + *pnOut = pTerm->nFullTerm; + } + } + return rc; +} + +/* +** Clear the token mappings for all Fts5IndexIter objects mannaged by +** the expression passed as the only argument. +*/ +static void sqlite3Fts5ExprClearTokens(Fts5Expr *pExpr){ + int ii; + for(ii=0; iinPhrase; ii++){ + Fts5ExprTerm *pT; + for(pT=&pExpr->apExprPhrase[ii]->aTerm[0]; pT; pT=pT->pSynonym){ + sqlite3Fts5IndexIterClearTokendata(pT->pIter); + } + } +} + /* ** 2014 August 11 ** @@ -230122,10 +241724,15 @@ struct Fts5Hash { /* ** Each entry in the hash table is represented by an object of the -** following type. Each object, its key (a nul-terminated string) and -** its current data are stored in a single memory allocation. The -** key immediately follows the object in memory. The position list -** data immediately follows the key data in memory. +** following type. Each object, its key, and its current data are stored +** in a single memory allocation. The key immediately follows the object +** in memory. The position list data immediately follows the key data +** in memory. +** +** The key is Fts5HashEntry.nKey bytes in size. It consists of a single +** byte identifying the index (either the main term index or a prefix-index), +** followed by the term data. For example: "0token". There is no +** nul-terminator - in this case nKey=6. ** ** The data that follows the key is in a similar, but not identical format ** to the doclist data stored in the database. It is: @@ -230260,8 +241867,7 @@ static int fts5HashResize(Fts5Hash *pHash){ unsigned int iHash; Fts5HashEntry *p = apOld[i]; apOld[i] = p->pHashNext; - iHash = fts5HashKey(nNew, (u8*)fts5EntryKey(p), - (int)strlen(fts5EntryKey(p))); + iHash = fts5HashKey(nNew, (u8*)fts5EntryKey(p), p->nKey); p->pHashNext = apNew[iHash]; apNew[iHash] = p; } @@ -230345,7 +241951,7 @@ static int sqlite3Fts5HashWrite( for(p=pHash->aSlot[iHash]; p; p=p->pHashNext){ char *zKey = fts5EntryKey(p); if( zKey[0]==bByte - && p->nKey==nToken + && p->nKey==nToken+1 && memcmp(&zKey[1], pToken, nToken)==0 ){ break; @@ -230375,9 +241981,9 @@ static int sqlite3Fts5HashWrite( zKey[0] = bByte; memcpy(&zKey[1], pToken, nToken); assert( iHash==fts5HashKey(pHash->nSlot, (u8*)zKey, nToken+1) ); - p->nKey = nToken; + p->nKey = nToken+1; zKey[nToken+1] = '\0'; - p->nData = nToken+1 + 1 + sizeof(Fts5HashEntry); + p->nData = nToken+1 + sizeof(Fts5HashEntry); p->pHashNext = pHash->aSlot[iHash]; pHash->aSlot[iHash] = p; pHash->nEntry++; @@ -230494,12 +242100,17 @@ static Fts5HashEntry *fts5HashEntryMerge( *ppOut = p1; p1 = 0; }else{ - int i = 0; char *zKey1 = fts5EntryKey(p1); char *zKey2 = fts5EntryKey(p2); - while( zKey1[i]==zKey2[i] ) i++; + int nMin = MIN(p1->nKey, p2->nKey); - if( ((u8)zKey1[i])>((u8)zKey2[i]) ){ + int cmp = memcmp(zKey1, zKey2, nMin); + if( cmp==0 ){ + cmp = p1->nKey - p2->nKey; + } + assert( cmp!=0 ); + + if( cmp>0 ){ /* p2 is smaller */ *ppOut = p2; ppOut = &p2->pScanNext; @@ -230518,10 +242129,8 @@ static Fts5HashEntry *fts5HashEntryMerge( } /* -** Extract all tokens from hash table iHash and link them into a list -** in sorted order. The hash table is cleared before returning. It is -** the responsibility of the caller to free the elements of the returned -** list. +** Link all tokens from hash table iHash into a list in sorted order. The +** tokens are not removed from the hash table. */ static int fts5HashEntrySort( Fts5Hash *pHash, @@ -230543,7 +242152,7 @@ static int fts5HashEntrySort( Fts5HashEntry *pIter; for(pIter=pHash->aSlot[iSlot]; pIter; pIter=pIter->pHashNext){ if( pTerm==0 - || (pIter->nKey+1>=nTerm && 0==memcmp(fts5EntryKey(pIter), pTerm, nTerm)) + || (pIter->nKey>=nTerm && 0==memcmp(fts5EntryKey(pIter), pTerm, nTerm)) ){ Fts5HashEntry *pEntry = pIter; pEntry->pScanNext = 0; @@ -230561,7 +242170,6 @@ static int fts5HashEntrySort( pList = fts5HashEntryMerge(pList, ap[i]); } - pHash->nEntry = 0; sqlite3_free(ap); *ppSorted = pList; return SQLITE_OK; @@ -230583,12 +242191,11 @@ static int sqlite3Fts5HashQuery( for(p=pHash->aSlot[iHash]; p; p=p->pHashNext){ zKey = fts5EntryKey(p); - assert( p->nKey+1==(int)strlen(zKey) ); - if( nTerm==p->nKey+1 && memcmp(zKey, pTerm, nTerm)==0 ) break; + if( nTerm==p->nKey && memcmp(zKey, pTerm, nTerm)==0 ) break; } if( p ){ - int nHashPre = sizeof(Fts5HashEntry) + nTerm + 1; + int nHashPre = sizeof(Fts5HashEntry) + nTerm; int nList = p->nData - nHashPre; u8 *pRet = (u8*)(*ppOut = sqlite3_malloc64(nPre + nList + 10)); if( pRet ){ @@ -230615,6 +242222,28 @@ static int sqlite3Fts5HashScanInit( return fts5HashEntrySort(p, pTerm, nTerm, &p->pScan); } +#ifdef SQLITE_DEBUG +static int fts5HashCount(Fts5Hash *pHash){ + int nEntry = 0; + int ii; + for(ii=0; iinSlot; ii++){ + Fts5HashEntry *p = 0; + for(p=pHash->aSlot[ii]; p; p=p->pHashNext){ + nEntry++; + } + } + return nEntry; +} +#endif + +/* +** Return true if the hash table is empty, false otherwise. +*/ +static int sqlite3Fts5HashIsEmpty(Fts5Hash *pHash){ + assert( pHash->nEntry==fts5HashCount(pHash) ); + return pHash->nEntry==0; +} + static void sqlite3Fts5HashScanNext(Fts5Hash *p){ assert( !sqlite3Fts5HashScanEof(p) ); p->pScan = p->pScan->pScanNext; @@ -230627,19 +242256,22 @@ static int sqlite3Fts5HashScanEof(Fts5Hash *p){ static void sqlite3Fts5HashScanEntry( Fts5Hash *pHash, const char **pzTerm, /* OUT: term (nul-terminated) */ + int *pnTerm, /* OUT: Size of term in bytes */ const u8 **ppDoclist, /* OUT: pointer to doclist */ int *pnDoclist /* OUT: size of doclist in bytes */ ){ Fts5HashEntry *p; if( (p = pHash->pScan) ){ char *zKey = fts5EntryKey(p); - int nTerm = (int)strlen(zKey); + int nTerm = p->nKey; fts5HashAddPoslistSize(pHash, p, 0); *pzTerm = zKey; - *ppDoclist = (const u8*)&zKey[nTerm+1]; - *pnDoclist = p->nData - (sizeof(Fts5HashEntry) + nTerm + 1); + *pnTerm = nTerm; + *ppDoclist = (const u8*)&zKey[nTerm]; + *pnDoclist = p->nData - (sizeof(Fts5HashEntry) + nTerm); }else{ *pzTerm = 0; + *pnTerm = 0; *ppDoclist = 0; *pnDoclist = 0; } @@ -230703,6 +242335,24 @@ static void sqlite3Fts5HashScanEntry( #define FTS5_MAX_LEVEL 64 +/* +** There are two versions of the format used for the structure record: +** +** 1. the legacy format, that may be read by all fts5 versions, and +** +** 2. the V2 format, which is used by contentless_delete=1 databases. +** +** Both begin with a 4-byte "configuration cookie" value. Then, a legacy +** format structure record contains a varint - the number of levels in +** the structure. Whereas a V2 structure record contains the constant +** 4 bytes [0xff 0x00 0x00 0x01]. This is unambiguous as the value of a +** varint has to be at least 16256 to begin with "0xFF". And the default +** maximum number of levels is 64. +** +** See below for more on structure record formats. +*/ +#define FTS5_STRUCTURE_V2 "\xFF\x00\x00\x01" + /* ** Details: ** @@ -230710,7 +242360,7 @@ static void sqlite3Fts5HashScanEntry( ** ** CREATE TABLE %_data(id INTEGER PRIMARY KEY, block BLOB); ** -** , contains the following 5 types of records. See the comments surrounding +** , contains the following 6 types of records. See the comments surrounding ** the FTS5_*_ROWID macros below for a description of how %_data rowids are ** assigned to each fo them. ** @@ -230719,12 +242369,12 @@ static void sqlite3Fts5HashScanEntry( ** The set of segments that make up an index - the index structure - are ** recorded in a single record within the %_data table. The record consists ** of a single 32-bit configuration cookie value followed by a list of -** SQLite varints. If the FTS table features more than one index (because -** there are one or more prefix indexes), it is guaranteed that all share -** the same cookie value. +** SQLite varints. ** -** Immediately following the configuration cookie, the record begins with -** three varints: +** If the structure record is a V2 record, the configuration cookie is +** followed by the following 4 bytes: [0xFF 0x00 0x00 0x01]. +** +** Next, the record continues with three varints: ** ** + number of levels, ** + total number of segments on all levels, @@ -230739,6 +242389,12 @@ static void sqlite3Fts5HashScanEntry( ** + first leaf page number (often 1, always greater than 0) ** + final leaf page number ** +** Then, for V2 structures only: +** +** + lower origin counter value, +** + upper origin counter value, +** + the number of tombstone hash pages. +** ** 2. The Averages Record: ** ** A single record within the %_data table. The data is a list of varints. @@ -230854,6 +242510,38 @@ static void sqlite3Fts5HashScanEntry( ** * A list of delta-encoded varints - the first rowid on each subsequent ** child page. ** +** 6. Tombstone Hash Page +** +** These records are only ever present in contentless_delete=1 tables. +** There are zero or more of these associated with each segment. They +** are used to store the tombstone rowids for rows contained in the +** associated segments. +** +** The set of nHashPg tombstone hash pages associated with a single +** segment together form a single hash table containing tombstone rowids. +** To find the page of the hash on which a key might be stored: +** +** iPg = (rowid % nHashPg) +** +** Then, within page iPg, which has nSlot slots: +** +** iSlot = (rowid / nHashPg) % nSlot +** +** Each tombstone hash page begins with an 8 byte header: +** +** 1-byte: Key-size (the size in bytes of each slot). Either 4 or 8. +** 1-byte: rowid-0-tombstone flag. This flag is only valid on the +** first tombstone hash page for each segment (iPg=0). If set, +** the hash table contains rowid 0. If clear, it does not. +** Rowid 0 is handled specially. +** 2-bytes: unused. +** 4-bytes: Big-endian integer containing number of entries on page. +** +** Following this are nSlot 4 or 8 byte slots (depending on the key-size +** in the first byte of the page header). The number of slots may be +** determined based on the size of the page record and the key-size: +** +** nSlot = (nByte - 8) / key-size */ /* @@ -230887,6 +242575,7 @@ static void sqlite3Fts5HashScanEntry( #define FTS5_SEGMENT_ROWID(segid, pgno) fts5_dri(segid, 0, 0, pgno) #define FTS5_DLIDX_ROWID(segid, height, pgno) fts5_dri(segid, 1, height, pgno) +#define FTS5_TOMBSTONE_ROWID(segid,ipg) fts5_dri(segid+(1<<16), 0, 0, ipg) #ifdef SQLITE_DEBUG static int sqlite3Fts5Corrupt() { return SQLITE_CORRUPT_VTAB; } @@ -230913,6 +242602,9 @@ typedef struct Fts5SegWriter Fts5SegWriter; typedef struct Fts5Structure Fts5Structure; typedef struct Fts5StructureLevel Fts5StructureLevel; typedef struct Fts5StructureSegment Fts5StructureSegment; +typedef struct Fts5TokenDataIter Fts5TokenDataIter; +typedef struct Fts5TokenDataMap Fts5TokenDataMap; +typedef struct Fts5TombstoneArray Fts5TombstoneArray; struct Fts5Data { u8 *p; /* Pointer to buffer containing record */ @@ -230922,6 +242614,12 @@ struct Fts5Data { /* ** One object per %_data table. +** +** nContentlessDelete: +** The number of contentless delete operations since the most recent +** call to fts5IndexFlush() or fts5IndexDiscardData(). This is tracked +** so that extra auto-merge work can be done by fts5IndexFlush() to +** account for the delete operations. */ struct Fts5Index { Fts5Config *pConfig; /* Virtual table configuration */ @@ -230936,9 +242634,12 @@ struct Fts5Index { int nPendingData; /* Current bytes of pending data */ i64 iWriteRowid; /* Rowid for current doc being written */ int bDelete; /* Current write is a delete */ + int nContentlessDelete; /* Number of contentless delete ops */ + int nPendingRow; /* Number of INSERT in hash table */ /* Error state. */ int rc; /* Current error code */ + int flushRc; /* State used by the fts5DataXXX() functions. */ sqlite3_blob *pReader; /* RO incr-blob open on %_data table */ @@ -230947,8 +242648,11 @@ struct Fts5Index { sqlite3_stmt *pIdxWriter; /* "INSERT ... %_idx VALUES(?,?,?,?)" */ sqlite3_stmt *pIdxDeleter; /* "DELETE FROM %_idx WHERE segid=?" */ sqlite3_stmt *pIdxSelect; + sqlite3_stmt *pIdxNextSelect; int nRead; /* Total number of blocks read */ + sqlite3_stmt *pDeleteFromIdx; + sqlite3_stmt *pDataVersion; i64 iStructVersion; /* data_version when pStruct read */ Fts5Structure *pStruct; /* Current db structure (or NULL) */ @@ -230968,11 +242672,23 @@ struct Fts5DoclistIter { ** The contents of the "structure" record for each index are represented ** using an Fts5Structure record in memory. Which uses instances of the ** other Fts5StructureXXX types as components. +** +** nOriginCntr: +** This value is set to non-zero for structure records created for +** contentlessdelete=1 tables only. In that case it represents the +** origin value to apply to the next top-level segment created. */ struct Fts5StructureSegment { int iSegid; /* Segment id */ int pgnoFirst; /* First leaf page number in segment */ int pgnoLast; /* Last leaf page number in segment */ + + /* contentlessdelete=1 tables only: */ + u64 iOrigin1; + u64 iOrigin2; + int nPgTombstone; /* Number of tombstone hash table pages */ + u64 nEntryTombstone; /* Number of tombstone entries that "count" */ + u64 nEntry; /* Number of rows in this segment */ }; struct Fts5StructureLevel { int nMerge; /* Number of segments in incr-merge */ @@ -230982,6 +242698,7 @@ struct Fts5StructureLevel { struct Fts5Structure { int nRef; /* Object reference count */ u64 nWriteCounter; /* Total leaves written to level 0 */ + u64 nOriginCntr; /* Origin value for next top-level segment */ int nSegment; /* Total segments in this structure */ int nLevel; /* Number of levels in this index */ Fts5StructureLevel aLevel[1]; /* Array of nLevel level objects */ @@ -231041,9 +242758,6 @@ struct Fts5CResult { ** iLeafOffset: ** Byte offset within the current leaf that is the first byte of the ** position list data (one byte passed the position-list size field). -** rowid field of the current entry. Usually this is the size field of the -** position list data. The exception is if the rowid for the current entry -** is the last thing on the leaf page. ** ** pLeaf: ** Buffer containing current leaf page data. Set to NULL at EOF. @@ -231073,6 +242787,13 @@ struct Fts5CResult { ** ** iTermIdx: ** Index of current term on iTermLeafPgno. +** +** apTombstone/nTombstone: +** These are used for contentless_delete=1 tables only. When the cursor +** is first allocated, the apTombstone[] array is allocated so that it +** is large enough for all tombstones hash pages associated with the +** segment. The pages themselves are loaded lazily from the database as +** they are required. */ struct Fts5SegIter { Fts5StructureSegment *pSeg; /* Segment to iterate through */ @@ -231081,6 +242802,7 @@ struct Fts5SegIter { Fts5Data *pLeaf; /* Current leaf data */ Fts5Data *pNextLeaf; /* Leaf page (iLeafPgno+1) */ i64 iLeafOffset; /* Byte offset within current leaf */ + Fts5TombstoneArray *pTombArray; /* Array of tombstone pages */ /* Next method */ void (*xNext)(Fts5Index*, Fts5SegIter*, int*); @@ -231107,6 +242829,15 @@ struct Fts5SegIter { u8 bDel; /* True if the delete flag is set */ }; +/* +** Array of tombstone pages. Reference counted. +*/ +struct Fts5TombstoneArray { + int nRef; /* Number of pointers to this object */ + int nTombstone; + Fts5Data *apTombstone[1]; /* Array of tombstone pages */ +}; + /* ** Argument is a pointer to an Fts5Data structure that contains a ** leaf page. @@ -231151,9 +242882,16 @@ struct Fts5SegIter { ** poslist: ** Used by sqlite3Fts5IterPoslist() when the poslist needs to be buffered. ** There is no way to tell if this is populated or not. +** +** pColset: +** If not NULL, points to an object containing a set of column indices. +** Only matches that occur in one of these columns will be returned. +** The Fts5Iter does not own the Fts5Colset object, and so it is not +** freed when the iterator is closed - it is owned by the upper layer. */ struct Fts5Iter { Fts5IndexIter base; /* Base class containing output vars */ + Fts5TokenDataIter *pTokenDataIter; Fts5Index *pIndex; /* Index that owns this iterator */ Fts5Buffer poslist; /* Buffer containing current poslist */ @@ -231171,7 +242909,6 @@ struct Fts5Iter { Fts5SegIter aSeg[1]; /* Array of segment iterators */ }; - /* ** An instance of the following type is used to iterate through the contents ** of a doclist-index record. @@ -231210,6 +242947,60 @@ static u16 fts5GetU16(const u8 *aIn){ return ((u16)aIn[0] << 8) + aIn[1]; } +/* +** The only argument points to a buffer at least 8 bytes in size. This +** function interprets the first 8 bytes of the buffer as a 64-bit big-endian +** unsigned integer and returns the result. +*/ +static u64 fts5GetU64(u8 *a){ + return ((u64)a[0] << 56) + + ((u64)a[1] << 48) + + ((u64)a[2] << 40) + + ((u64)a[3] << 32) + + ((u64)a[4] << 24) + + ((u64)a[5] << 16) + + ((u64)a[6] << 8) + + ((u64)a[7] << 0); +} + +/* +** The only argument points to a buffer at least 4 bytes in size. This +** function interprets the first 4 bytes of the buffer as a 32-bit big-endian +** unsigned integer and returns the result. +*/ +static u32 fts5GetU32(const u8 *a){ + return ((u32)a[0] << 24) + + ((u32)a[1] << 16) + + ((u32)a[2] << 8) + + ((u32)a[3] << 0); +} + +/* +** Write iVal, formated as a 64-bit big-endian unsigned integer, to the +** buffer indicated by the first argument. +*/ +static void fts5PutU64(u8 *a, u64 iVal){ + a[0] = ((iVal >> 56) & 0xFF); + a[1] = ((iVal >> 48) & 0xFF); + a[2] = ((iVal >> 40) & 0xFF); + a[3] = ((iVal >> 32) & 0xFF); + a[4] = ((iVal >> 24) & 0xFF); + a[5] = ((iVal >> 16) & 0xFF); + a[6] = ((iVal >> 8) & 0xFF); + a[7] = ((iVal >> 0) & 0xFF); +} + +/* +** Write iVal, formated as a 32-bit big-endian unsigned integer, to the +** buffer indicated by the first argument. +*/ +static void fts5PutU32(u8 *a, u32 iVal){ + a[0] = ((iVal >> 24) & 0xFF); + a[1] = ((iVal >> 16) & 0xFF); + a[2] = ((iVal >> 8) & 0xFF); + a[3] = ((iVal >> 0) & 0xFF); +} + /* ** Allocate and return a buffer at least nByte bytes in size. ** @@ -231319,11 +243110,12 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ if( rc==SQLITE_OK ){ u8 *aOut = 0; /* Read blob data into this buffer */ int nByte = sqlite3_blob_bytes(p->pReader); - sqlite3_int64 nAlloc = sizeof(Fts5Data) + nByte + FTS5_DATA_PADDING; + int szData = (sizeof(Fts5Data) + 7) & ~7; + sqlite3_int64 nAlloc = szData + nByte + FTS5_DATA_PADDING; pRet = (Fts5Data*)sqlite3_malloc64(nAlloc); if( pRet ){ pRet->nn = nByte; - aOut = pRet->p = (u8*)&pRet[1]; + aOut = pRet->p = (u8*)pRet + szData; }else{ rc = SQLITE_NOMEM; } @@ -231346,6 +243138,7 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ } assert( (pRet==0)==(p->rc!=SQLITE_OK) ); + assert( pRet==0 || EIGHT_BYTE_ALIGNMENT( pRet->p ) ); return pRet; } @@ -231437,10 +243230,17 @@ static void fts5DataDelete(Fts5Index *p, i64 iFirst, i64 iLast){ /* ** Remove all records associated with segment iSegid. */ -static void fts5DataRemoveSegment(Fts5Index *p, int iSegid){ +static void fts5DataRemoveSegment(Fts5Index *p, Fts5StructureSegment *pSeg){ + int iSegid = pSeg->iSegid; i64 iFirst = FTS5_SEGMENT_ROWID(iSegid, 0); i64 iLast = FTS5_SEGMENT_ROWID(iSegid+1, 0)-1; fts5DataDelete(p, iFirst, iLast); + + if( pSeg->nPgTombstone ){ + i64 iTomb1 = FTS5_TOMBSTONE_ROWID(iSegid, 0); + i64 iTomb2 = FTS5_TOMBSTONE_ROWID(iSegid, pSeg->nPgTombstone-1); + fts5DataDelete(p, iTomb1, iTomb2); + } if( p->pIdxDeleter==0 ){ Fts5Config *pConfig = p->pConfig; fts5IndexPrepareStmt(p, &p->pIdxDeleter, sqlite3_mprintf( @@ -231551,11 +243351,19 @@ static int fts5StructureDecode( int nSegment = 0; sqlite3_int64 nByte; /* Bytes of space to allocate at pRet */ Fts5Structure *pRet = 0; /* Structure object to return */ + int bStructureV2 = 0; /* True for FTS5_STRUCTURE_V2 */ + u64 nOriginCntr = 0; /* Largest origin value seen so far */ /* Grab the cookie value */ if( piCookie ) *piCookie = sqlite3Fts5Get32(pData); i = 4; + /* Check if this is a V2 structure record. Set bStructureV2 if it is. */ + if( 0==memcmp(&pData[i], FTS5_STRUCTURE_V2, 4) ){ + i += 4; + bStructureV2 = 1; + } + /* Read the total number of levels and segments from the start of the ** structure record. */ i += fts5GetVarint32(&pData[i], nLevel); @@ -231602,9 +243410,18 @@ static int fts5StructureDecode( rc = FTS5_CORRUPT; break; } + assert( pSeg!=0 ); i += fts5GetVarint32(&pData[i], pSeg->iSegid); i += fts5GetVarint32(&pData[i], pSeg->pgnoFirst); i += fts5GetVarint32(&pData[i], pSeg->pgnoLast); + if( bStructureV2 ){ + i += fts5GetVarint(&pData[i], &pSeg->iOrigin1); + i += fts5GetVarint(&pData[i], &pSeg->iOrigin2); + i += fts5GetVarint32(&pData[i], pSeg->nPgTombstone); + i += fts5GetVarint(&pData[i], &pSeg->nEntryTombstone); + i += fts5GetVarint(&pData[i], &pSeg->nEntry); + nOriginCntr = MAX(nOriginCntr, pSeg->iOrigin2); + } if( pSeg->pgnoLastpgnoFirst ){ rc = FTS5_CORRUPT; break; @@ -231615,6 +243432,9 @@ static int fts5StructureDecode( } } if( nSegment!=0 && rc==SQLITE_OK ) rc = FTS5_CORRUPT; + if( bStructureV2 ){ + pRet->nOriginCntr = nOriginCntr+1; + } if( rc!=SQLITE_OK ){ fts5StructureRelease(pRet); @@ -231632,6 +243452,7 @@ static int fts5StructureDecode( */ static void fts5StructureAddLevel(int *pRc, Fts5Structure **ppStruct){ fts5StructureMakeWritable(pRc, ppStruct); + assert( (ppStruct!=0 && (*ppStruct)!=0) || (*pRc)!=SQLITE_OK ); if( *pRc==SQLITE_OK ){ Fts5Structure *pStruct = *ppStruct; int nLevel = pStruct->nLevel; @@ -231826,6 +243647,7 @@ static void fts5StructureWrite(Fts5Index *p, Fts5Structure *pStruct){ Fts5Buffer buf; /* Buffer to serialize record into */ int iLvl; /* Used to iterate through levels */ int iCookie; /* Cookie value to store */ + int nHdr = (pStruct->nOriginCntr>0 ? (4+4+9+9+9) : (4+9+9)); assert( pStruct->nSegment==fts5StructureCountSegments(pStruct) ); memset(&buf, 0, sizeof(Fts5Buffer)); @@ -231834,9 +243656,12 @@ static void fts5StructureWrite(Fts5Index *p, Fts5Structure *pStruct){ iCookie = p->pConfig->iCookie; if( iCookie<0 ) iCookie = 0; - if( 0==sqlite3Fts5BufferSize(&p->rc, &buf, 4+9+9+9) ){ + if( 0==sqlite3Fts5BufferSize(&p->rc, &buf, nHdr) ){ sqlite3Fts5Put32(buf.p, iCookie); buf.n = 4; + if( pStruct->nOriginCntr>0 ){ + fts5BufferSafeAppendBlob(&buf, FTS5_STRUCTURE_V2, 4); + } fts5BufferSafeAppendVarint(&buf, pStruct->nLevel); fts5BufferSafeAppendVarint(&buf, pStruct->nSegment); fts5BufferSafeAppendVarint(&buf, (i64)pStruct->nWriteCounter); @@ -231850,9 +243675,17 @@ static void fts5StructureWrite(Fts5Index *p, Fts5Structure *pStruct){ assert( pLvl->nMerge<=pLvl->nSeg ); for(iSeg=0; iSegnSeg; iSeg++){ - fts5BufferAppendVarint(&p->rc, &buf, pLvl->aSeg[iSeg].iSegid); - fts5BufferAppendVarint(&p->rc, &buf, pLvl->aSeg[iSeg].pgnoFirst); - fts5BufferAppendVarint(&p->rc, &buf, pLvl->aSeg[iSeg].pgnoLast); + Fts5StructureSegment *pSeg = &pLvl->aSeg[iSeg]; + fts5BufferAppendVarint(&p->rc, &buf, pSeg->iSegid); + fts5BufferAppendVarint(&p->rc, &buf, pSeg->pgnoFirst); + fts5BufferAppendVarint(&p->rc, &buf, pSeg->pgnoLast); + if( pStruct->nOriginCntr>0 ){ + fts5BufferAppendVarint(&p->rc, &buf, pSeg->iOrigin1); + fts5BufferAppendVarint(&p->rc, &buf, pSeg->iOrigin2); + fts5BufferAppendVarint(&p->rc, &buf, pSeg->nPgTombstone); + fts5BufferAppendVarint(&p->rc, &buf, pSeg->nEntryTombstone); + fts5BufferAppendVarint(&p->rc, &buf, pSeg->nEntry); + } } } @@ -231995,9 +243828,9 @@ static int fts5DlidxLvlNext(Fts5DlidxLvl *pLvl){ } if( iOffnn ){ - i64 iVal; + u64 iVal; pLvl->iLeafPgno += (iOff - pLvl->iOff) + 1; - iOff += fts5GetVarint(&pData->p[iOff], (u64*)&iVal); + iOff += fts5GetVarint(&pData->p[iOff], &iVal); pLvl->iRowid += iVal; pLvl->iOff = iOff; }else{ @@ -232090,42 +243923,25 @@ static int fts5DlidxLvlPrev(Fts5DlidxLvl *pLvl){ pLvl->bEof = 1; }else{ u8 *a = pLvl->pData->p; - i64 iVal; - int iLimit; - int ii; - int nZero = 0; - - /* Currently iOff points to the first byte of a varint. This block - ** decrements iOff until it points to the first byte of the previous - ** varint. Taking care not to read any memory locations that occur - ** before the buffer in memory. */ - iLimit = (iOff>9 ? iOff-9 : 0); - for(iOff--; iOff>iLimit; iOff--){ - if( (a[iOff-1] & 0x80)==0 ) break; - } - - fts5GetVarint(&a[iOff], (u64*)&iVal); - pLvl->iRowid -= iVal; - pLvl->iLeafPgno--; - - /* Skip backwards past any 0x00 varints. */ - for(ii=iOff-1; ii>=pLvl->iFirstOff && a[ii]==0x00; ii--){ - nZero++; - } - if( ii>=pLvl->iFirstOff && (a[ii] & 0x80) ){ - /* The byte immediately before the last 0x00 byte has the 0x80 bit - ** set. So the last 0x00 is only a varint 0 if there are 8 more 0x80 - ** bytes before a[ii]. */ - int bZero = 0; /* True if last 0x00 counts */ - if( (ii-8)>=pLvl->iFirstOff ){ - int j; - for(j=1; j<=8 && (a[ii-j] & 0x80); j++); - bZero = (j>8); + + pLvl->iOff = 0; + fts5DlidxLvlNext(pLvl); + while( 1 ){ + int nZero = 0; + int ii = pLvl->iOff; + u64 delta = 0; + + while( a[ii]==0 ){ + nZero++; + ii++; } - if( bZero==0 ) nZero--; + ii += sqlite3Fts5GetVarint(&a[ii], &delta); + + if( ii>=iOff ) break; + pLvl->iLeafPgno += nZero+1; + pLvl->iRowid += delta; + pLvl->iOff = ii; } - pLvl->iLeafPgno -= nZero; - pLvl->iOff = iOff - nZero; } return pLvl->bEof; @@ -232321,7 +244137,7 @@ static void fts5SegIterLoadRowid(Fts5Index *p, Fts5SegIter *pIter){ i64 iOff = pIter->iLeafOffset; ASSERT_SZLEAF_OK(pIter->pLeaf); - if( iOff>=pIter->pLeaf->szLeaf ){ + while( iOff>=pIter->pLeaf->szLeaf ){ fts5SegIterNextPage(p, pIter); if( pIter->pLeaf==0 ){ if( p->rc==SQLITE_OK ) p->rc = FTS5_CORRUPT; @@ -232392,6 +244208,25 @@ static void fts5SegIterSetNext(Fts5Index *p, Fts5SegIter *pIter){ } } +/* +** Allocate a tombstone hash page array object (pIter->pTombArray) for +** the iterator passed as the second argument. If an OOM error occurs, +** leave an error in the Fts5Index object. +*/ +static void fts5SegIterAllocTombstone(Fts5Index *p, Fts5SegIter *pIter){ + const int nTomb = pIter->pSeg->nPgTombstone; + if( nTomb>0 ){ + int nByte = nTomb * sizeof(Fts5Data*) + sizeof(Fts5TombstoneArray); + Fts5TombstoneArray *pNew; + pNew = (Fts5TombstoneArray*)sqlite3Fts5MallocZero(&p->rc, nByte); + if( pNew ){ + pNew->nTombstone = nTomb; + pNew->nRef = 1; + pIter->pTombArray = pNew; + } + } +} + /* ** Initialize the iterator object pIter to iterate through the entries in ** segment pSeg. The iterator is left pointing to the first entry when @@ -232420,10 +244255,12 @@ static void fts5SegIterInit( fts5SegIterSetNext(p, pIter); pIter->pSeg = pSeg; pIter->iLeafPgno = pSeg->pgnoFirst-1; - fts5SegIterNextPage(p, pIter); + do { + fts5SegIterNextPage(p, pIter); + }while( p->rc==SQLITE_OK && pIter->pLeaf && pIter->pLeaf->nn==4 ); } - if( p->rc==SQLITE_OK ){ + if( p->rc==SQLITE_OK && pIter->pLeaf ){ pIter->iLeafOffset = 4; assert( pIter->pLeaf!=0 ); assert_nc( pIter->pLeaf->nn>4 ); @@ -232431,6 +244268,7 @@ static void fts5SegIterInit( pIter->iPgidxOff = pIter->pLeaf->szLeaf+1; fts5SegIterLoadTerm(p, pIter, 0); fts5SegIterLoadNPos(p, pIter); + fts5SegIterAllocTombstone(p, pIter); } } @@ -232617,7 +244455,7 @@ static void fts5SegIterNext_None( iOff = pIter->iLeafOffset; /* Next entry is on the next page */ - if( pIter->pSeg && iOff>=pIter->pLeaf->szLeaf ){ + while( pIter->pSeg && iOff>=pIter->pLeaf->szLeaf ){ fts5SegIterNextPage(p, pIter); if( p->rc || pIter->pLeaf==0 ) return; pIter->iRowid = 0; @@ -232626,7 +244464,7 @@ static void fts5SegIterNext_None( if( iOffiEndofDoclist ){ /* Next entry is on the current page */ - i64 iDelta; + u64 iDelta; iOff += sqlite3Fts5GetVarint(&pIter->pLeaf->p[iOff], (u64*)&iDelta); pIter->iLeafOffset = iOff; pIter->iRowid += iDelta; @@ -232641,15 +244479,16 @@ static void fts5SegIterNext_None( }else{ const u8 *pList = 0; const char *zTerm = 0; + int nTerm = 0; int nList; sqlite3Fts5HashScanNext(p->pHash); - sqlite3Fts5HashScanEntry(p->pHash, &zTerm, &pList, &nList); + sqlite3Fts5HashScanEntry(p->pHash, &zTerm, &nTerm, &pList, &nList); if( pList==0 ) goto next_none_eof; pIter->pLeaf->p = (u8*)pList; pIter->pLeaf->nn = nList; pIter->pLeaf->szLeaf = nList; pIter->iEndofDoclist = nList; - sqlite3Fts5BufferSet(&p->rc,&pIter->term, (int)strlen(zTerm), (u8*)zTerm); + sqlite3Fts5BufferSet(&p->rc,&pIter->term, nTerm, (u8*)zTerm); pIter->iLeafOffset = fts5GetVarint(pList, (u64*)&pIter->iRowid); } @@ -232715,11 +244554,12 @@ static void fts5SegIterNext( }else if( pIter->pSeg==0 ){ const u8 *pList = 0; const char *zTerm = 0; + int nTerm = 0; int nList = 0; assert( (pIter->flags & FTS5_SEGITER_ONETERM) || pbNewTerm ); if( 0==(pIter->flags & FTS5_SEGITER_ONETERM) ){ sqlite3Fts5HashScanNext(p->pHash); - sqlite3Fts5HashScanEntry(p->pHash, &zTerm, &pList, &nList); + sqlite3Fts5HashScanEntry(p->pHash, &zTerm, &nTerm, &pList, &nList); } if( pList==0 ){ fts5DataRelease(pIter->pLeaf); @@ -232729,8 +244569,7 @@ static void fts5SegIterNext( pIter->pLeaf->nn = nList; pIter->pLeaf->szLeaf = nList; pIter->iEndofDoclist = nList+1; - sqlite3Fts5BufferSet(&p->rc, &pIter->term, (int)strlen(zTerm), - (u8*)zTerm); + sqlite3Fts5BufferSet(&p->rc, &pIter->term, nTerm, (u8*)zTerm); pIter->iLeafOffset = fts5GetVarint(pList, (u64*)&pIter->iRowid); *pbNewTerm = 1; } @@ -232810,7 +244649,7 @@ static void fts5SegIterReverse(Fts5Index *p, Fts5SegIter *pIter){ Fts5Data *pLast = 0; int pgnoLast = 0; - if( pDlidx ){ + if( pDlidx && p->pConfig->iVersion==FTS5_CURRENT_VERSION ){ int iSegid = pIter->pSeg->iSegid; pgnoLast = fts5DlidxIterPgno(pDlidx); pLast = fts5LeafRead(p, FTS5_SEGMENT_ROWID(iSegid, pgnoLast)); @@ -233116,7 +244955,7 @@ static void fts5SegIterSeekInit( fts5LeafSeek(p, bGe, pIter, pTerm, nTerm); } - if( p->rc==SQLITE_OK && bGe==0 ){ + if( p->rc==SQLITE_OK && (bGe==0 || (flags & FTS5INDEX_QUERY_SCANONETERM)) ){ pIter->flags |= FTS5_SEGITER_ONETERM; if( pIter->pLeaf ){ if( flags & FTS5INDEX_QUERY_DESC ){ @@ -233132,6 +244971,9 @@ static void fts5SegIterSeekInit( } fts5SegIterSetNext(p, pIter); + if( 0==(flags & FTS5INDEX_QUERY_SCANONETERM) ){ + fts5SegIterAllocTombstone(p, pIter); + } /* Either: ** @@ -233148,6 +244990,79 @@ static void fts5SegIterSeekInit( ); } + +/* +** SQL used by fts5SegIterNextInit() to find the page to open. +*/ +static sqlite3_stmt *fts5IdxNextStmt(Fts5Index *p){ + if( p->pIdxNextSelect==0 ){ + Fts5Config *pConfig = p->pConfig; + fts5IndexPrepareStmt(p, &p->pIdxNextSelect, sqlite3_mprintf( + "SELECT pgno FROM '%q'.'%q_idx' WHERE " + "segid=? AND term>? ORDER BY term ASC LIMIT 1", + pConfig->zDb, pConfig->zName + )); + + } + return p->pIdxNextSelect; +} + +/* +** This is similar to fts5SegIterSeekInit(), except that it initializes +** the segment iterator to point to the first term following the page +** with pToken/nToken on it. +*/ +static void fts5SegIterNextInit( + Fts5Index *p, + const char *pTerm, int nTerm, + Fts5StructureSegment *pSeg, /* Description of segment */ + Fts5SegIter *pIter /* Object to populate */ +){ + int iPg = -1; /* Page of segment to open */ + int bDlidx = 0; + sqlite3_stmt *pSel = 0; /* SELECT to find iPg */ + + pSel = fts5IdxNextStmt(p); + if( pSel ){ + assert( p->rc==SQLITE_OK ); + sqlite3_bind_int(pSel, 1, pSeg->iSegid); + sqlite3_bind_blob(pSel, 2, pTerm, nTerm, SQLITE_STATIC); + + if( sqlite3_step(pSel)==SQLITE_ROW ){ + i64 val = sqlite3_column_int64(pSel, 0); + iPg = (int)(val>>1); + bDlidx = (val & 0x0001); + } + p->rc = sqlite3_reset(pSel); + sqlite3_bind_null(pSel, 2); + if( p->rc ) return; + } + + memset(pIter, 0, sizeof(*pIter)); + pIter->pSeg = pSeg; + pIter->flags |= FTS5_SEGITER_ONETERM; + if( iPg>=0 ){ + pIter->iLeafPgno = iPg - 1; + fts5SegIterNextPage(p, pIter); + fts5SegIterSetNext(p, pIter); + } + if( pIter->pLeaf ){ + const u8 *a = pIter->pLeaf->p; + int iTermOff = 0; + + pIter->iPgidxOff = pIter->pLeaf->szLeaf; + pIter->iPgidxOff += fts5GetVarint32(&a[pIter->iPgidxOff], iTermOff); + pIter->iLeafOffset = iTermOff; + fts5SegIterLoadTerm(p, pIter, 0); + fts5SegIterLoadNPos(p, pIter); + if( bDlidx ) fts5SegIterLoadDlidx(p, pIter); + + assert( p->rc!=SQLITE_OK || + fts5BufferCompareBlob(&pIter->term, (const u8*)pTerm, nTerm)>0 + ); + } +} + /* ** Initialize the object pIter to point to term pTerm/nTerm within the ** in-memory hash table. If there is no such term in the hash-table, the @@ -233174,14 +245089,21 @@ static void fts5SegIterHashInit( const u8 *pList = 0; p->rc = sqlite3Fts5HashScanInit(p->pHash, (const char*)pTerm, nTerm); - sqlite3Fts5HashScanEntry(p->pHash, (const char**)&z, &pList, &nList); - n = (z ? (int)strlen((const char*)z) : 0); + sqlite3Fts5HashScanEntry(p->pHash, (const char**)&z, &n, &pList, &nList); if( pList ){ pLeaf = fts5IdxMalloc(p, sizeof(Fts5Data)); if( pLeaf ){ pLeaf->p = (u8*)pList; } } + + /* The call to sqlite3Fts5HashScanInit() causes the hash table to + ** fill the size field of all existing position lists. This means they + ** can no longer be appended to. Since the only scenario in which they + ** can be appended to is if the previous operation on this table was + ** a DELETE, by clearing the Fts5Index.bDelete flag we can avoid this + ** possibility altogether. */ + p->bDelete = 0; }else{ p->rc = sqlite3Fts5HashQuery(p->pHash, sizeof(Fts5Data), (const char*)pTerm, nTerm, (void**)&pLeaf, &nList @@ -233212,6 +245134,37 @@ static void fts5SegIterHashInit( fts5SegIterSetNext(p, pIter); } +/* +** Array ap[] contains n elements. Release each of these elements using +** fts5DataRelease(). Then free the array itself using sqlite3_free(). +*/ +static void fts5IndexFreeArray(Fts5Data **ap, int n){ + if( ap ){ + int ii; + for(ii=0; iinRef--; + if( p->nRef<=0 ){ + int ii; + for(ii=0; iinTombstone; ii++){ + fts5DataRelease(p->apTombstone[ii]); + } + sqlite3_free(p); + } + } +} + /* ** Zero the iterator passed as the only argument. */ @@ -233219,6 +245172,7 @@ static void fts5SegIterClear(Fts5SegIter *pIter){ fts5BufferFree(&pIter->term); fts5DataRelease(pIter->pLeaf); fts5DataRelease(pIter->pNextLeaf); + fts5TombstoneArrayDelete(pIter->pTombArray); fts5DlidxIterFree(pIter->pDlidx); sqlite3_free(pIter->aRowidOffset); memset(pIter, 0, sizeof(Fts5SegIter)); @@ -233352,7 +245306,6 @@ static int fts5MultiIterDoCompare(Fts5Iter *pIter, int iOut){ assert_nc( i2!=0 ); pRes->bTermEq = 1; if( p1->iRowid==p2->iRowid ){ - p1->bDel = p2->bDel; return i2; } res = ((p1->iRowid > p2->iRowid)==pIter->bRev) ? -1 : +1; @@ -233371,7 +245324,8 @@ static int fts5MultiIterDoCompare(Fts5Iter *pIter, int iOut){ /* ** Move the seg-iter so that it points to the first rowid on page iLeafPgno. -** It is an error if leaf iLeafPgno does not exist or contains no rowids. +** It is an error if leaf iLeafPgno does not exist. Unless the db is +** a 'secure-delete' db, if it contains no rowids then this is also an error. */ static void fts5SegIterGotoPage( Fts5Index *p, /* FTS5 backend object */ @@ -233386,21 +245340,23 @@ static void fts5SegIterGotoPage( fts5DataRelease(pIter->pNextLeaf); pIter->pNextLeaf = 0; pIter->iLeafPgno = iLeafPgno-1; - fts5SegIterNextPage(p, pIter); - assert( p->rc!=SQLITE_OK || pIter->iLeafPgno==iLeafPgno ); - if( p->rc==SQLITE_OK && ALWAYS(pIter->pLeaf!=0) ){ + while( p->rc==SQLITE_OK ){ int iOff; - u8 *a = pIter->pLeaf->p; - int n = pIter->pLeaf->szLeaf; - + fts5SegIterNextPage(p, pIter); + if( pIter->pLeaf==0 ) break; iOff = fts5LeafFirstRowidOff(pIter->pLeaf); - if( iOff<4 || iOff>=n ){ - p->rc = FTS5_CORRUPT; - }else{ - iOff += fts5GetVarint(&a[iOff], (u64*)&pIter->iRowid); - pIter->iLeafOffset = iOff; - fts5SegIterLoadNPos(p, pIter); + if( iOff>0 ){ + u8 *a = pIter->pLeaf->p; + int n = pIter->pLeaf->szLeaf; + if( iOff<4 || iOff>=n ){ + p->rc = FTS5_CORRUPT; + }else{ + iOff += fts5GetVarint(&a[iOff], (u64*)&pIter->iRowid); + pIter->iLeafOffset = iOff; + fts5SegIterLoadNPos(p, pIter); + } + break; } } } @@ -233461,7 +245417,6 @@ static void fts5SegIterNextFrom( }while( p->rc==SQLITE_OK ); } - /* ** Free the iterator object passed as the second argument. */ @@ -233553,6 +245508,85 @@ static void fts5MultiIterSetEof(Fts5Iter *pIter){ pIter->iSwitchRowid = pSeg->iRowid; } +/* +** The argument to this macro must be an Fts5Data structure containing a +** tombstone hash page. This macro returns the key-size of the hash-page. +*/ +#define TOMBSTONE_KEYSIZE(pPg) (pPg->p[0]==4 ? 4 : 8) + +#define TOMBSTONE_NSLOT(pPg) \ + ((pPg->nn > 16) ? ((pPg->nn-8) / TOMBSTONE_KEYSIZE(pPg)) : 1) + +/* +** Query a single tombstone hash table for rowid iRowid. Return true if +** it is found or false otherwise. The tombstone hash table is one of +** nHashTable tables. +*/ +static int fts5IndexTombstoneQuery( + Fts5Data *pHash, /* Hash table page to query */ + int nHashTable, /* Number of pages attached to segment */ + u64 iRowid /* Rowid to query hash for */ +){ + const int szKey = TOMBSTONE_KEYSIZE(pHash); + const int nSlot = TOMBSTONE_NSLOT(pHash); + int iSlot = (iRowid / nHashTable) % nSlot; + int nCollide = nSlot; + + if( iRowid==0 ){ + return pHash->p[1]; + }else if( szKey==4 ){ + u32 *aSlot = (u32*)&pHash->p[8]; + while( aSlot[iSlot] ){ + if( fts5GetU32((u8*)&aSlot[iSlot])==iRowid ) return 1; + if( nCollide--==0 ) break; + iSlot = (iSlot+1)%nSlot; + } + }else{ + u64 *aSlot = (u64*)&pHash->p[8]; + while( aSlot[iSlot] ){ + if( fts5GetU64((u8*)&aSlot[iSlot])==iRowid ) return 1; + if( nCollide--==0 ) break; + iSlot = (iSlot+1)%nSlot; + } + } + + return 0; +} + +/* +** Return true if the iterator passed as the only argument points +** to an segment entry for which there is a tombstone. Return false +** if there is no tombstone or if the iterator is already at EOF. +*/ +static int fts5MultiIterIsDeleted(Fts5Iter *pIter){ + int iFirst = pIter->aFirst[1].iFirst; + Fts5SegIter *pSeg = &pIter->aSeg[iFirst]; + Fts5TombstoneArray *pArray = pSeg->pTombArray; + + if( pSeg->pLeaf && pArray ){ + /* Figure out which page the rowid might be present on. */ + int iPg = ((u64)pSeg->iRowid) % pArray->nTombstone; + assert( iPg>=0 ); + + /* If tombstone hash page iPg has not yet been loaded from the + ** database, load it now. */ + if( pArray->apTombstone[iPg]==0 ){ + pArray->apTombstone[iPg] = fts5DataRead(pIter->pIndex, + FTS5_TOMBSTONE_ROWID(pSeg->pSeg->iSegid, iPg) + ); + if( pArray->apTombstone[iPg]==0 ) return 0; + } + + return fts5IndexTombstoneQuery( + pArray->apTombstone[iPg], + pArray->nTombstone, + pSeg->iRowid + ); + } + + return 0; +} + /* ** Move the iterator to the next entry. ** @@ -233590,7 +245624,9 @@ static void fts5MultiIterNext( fts5AssertMultiIterSetup(p, pIter); assert( pSeg==&pIter->aSeg[pIter->aFirst[1].iFirst] && pSeg->pLeaf ); - if( pIter->bSkipEmpty==0 || pSeg->nPos ){ + if( (pIter->bSkipEmpty==0 || pSeg->nPos) + && 0==fts5MultiIterIsDeleted(pIter) + ){ pIter->xSetOutputs(pIter, pSeg); return; } @@ -233622,7 +245658,9 @@ static void fts5MultiIterNext2( } fts5AssertMultiIterSetup(p, pIter); - }while( fts5MultiIterIsEmpty(p, pIter) ); + }while( (fts5MultiIterIsEmpty(p, pIter) || fts5MultiIterIsDeleted(pIter)) + && (p->rc==SQLITE_OK) + ); } } @@ -233635,7 +245673,7 @@ static Fts5Iter *fts5MultiIterAlloc( int nSeg ){ Fts5Iter *pNew; - int nSlot; /* Power of two >= nSeg */ + i64 nSlot; /* Power of two >= nSeg */ for(nSlot=2; nSlotnSeg-1; iIter>0; iIter--){ + int iEq; + if( (iEq = fts5MultiIterDoCompare(pIter, iIter)) ){ + Fts5SegIter *pSeg = &pIter->aSeg[iEq]; + if( p->rc==SQLITE_OK ) pSeg->xNext(p, pSeg, 0); + fts5MultiIterAdvanced(p, pIter, iEq, iIter); + } + } + fts5MultiIterSetEof(pIter); + fts5AssertMultiIterSetup(p, pIter); + + if( (pIter->bSkipEmpty && fts5MultiIterIsEmpty(p, pIter)) + || fts5MultiIterIsDeleted(pIter) + ){ + fts5MultiIterNext(p, pIter, 0, 0); + }else if( pIter->base.bEof==0 ){ + Fts5SegIter *pSeg = &pIter->aSeg[pIter->aFirst[1].iFirst]; + pIter->xSetOutputs(pIter, pSeg); + } +} /* ** Allocate a new Fts5Iter object. @@ -234115,7 +246179,7 @@ static void fts5MultiIterNew( if( iLevel<0 ){ assert( pStruct->nSegment==fts5StructureCountSegments(pStruct) ); nSeg = pStruct->nSegment; - nSeg += (p->pHash ? 1 : 0); + nSeg += (p->pHash && 0==(flags & FTS5INDEX_QUERY_SKIPHASH)); }else{ nSeg = MIN(pStruct->aLevel[iLevel].nSeg, nSegment); } @@ -234136,7 +246200,7 @@ static void fts5MultiIterNew( if( p->rc==SQLITE_OK ){ if( iLevel<0 ){ Fts5StructureLevel *pEnd = &pStruct->aLevel[pStruct->nLevel]; - if( p->pHash ){ + if( p->pHash && 0==(flags & FTS5INDEX_QUERY_SKIPHASH) ){ /* Add a segment iterator for the current contents of the hash table. */ Fts5SegIter *pIter = &pNew->aSeg[iIter++]; fts5SegIterHashInit(p, pTerm, nTerm, flags, pIter); @@ -234161,29 +246225,12 @@ static void fts5MultiIterNew( assert( iIter==nSeg ); } - /* If the above was successful, each component iterators now points + /* If the above was successful, each component iterator now points ** to the first entry in its segment. In this case initialize the ** aFirst[] array. Or, if an error has occurred, free the iterator ** object and set the output variable to NULL. */ if( p->rc==SQLITE_OK ){ - for(iIter=pNew->nSeg-1; iIter>0; iIter--){ - int iEq; - if( (iEq = fts5MultiIterDoCompare(pNew, iIter)) ){ - Fts5SegIter *pSeg = &pNew->aSeg[iEq]; - if( p->rc==SQLITE_OK ) pSeg->xNext(p, pSeg, 0); - fts5MultiIterAdvanced(p, pNew, iEq, iIter); - } - } - fts5MultiIterSetEof(pNew); - fts5AssertMultiIterSetup(p, pNew); - - if( pNew->bSkipEmpty && fts5MultiIterIsEmpty(p, pNew) ){ - fts5MultiIterNext(p, pNew, 0, 0); - }else if( pNew->base.bEof==0 ){ - Fts5SegIter *pSeg = &pNew->aSeg[pNew->aFirst[1].iFirst]; - pNew->xSetOutputs(pNew, pSeg); - } - + fts5MultiIterFinishSetup(p, pNew); }else{ fts5MultiIterFree(pNew); *ppOut = 0; @@ -234208,7 +246255,6 @@ static void fts5MultiIterNew2( pNew = fts5MultiIterAlloc(p, 2); if( pNew ){ Fts5SegIter *pIter = &pNew->aSeg[1]; - pIter->flags = FTS5_SEGITER_ONETERM; if( pData->szLeaf>0 ){ pIter->pLeaf = pData; @@ -234355,7 +246401,10 @@ static void fts5IndexDiscardData(Fts5Index *p){ if( p->pHash ){ sqlite3Fts5HashClear(p->pHash); p->nPendingData = 0; + p->nPendingRow = 0; + p->flushRc = SQLITE_OK; } + p->nContentlessDelete = 0; } /* @@ -234569,7 +246618,7 @@ static void fts5WriteDlidxAppend( } if( pDlidx->bPrevValid ){ - iVal = iRowid - pDlidx->iPrev; + iVal = (u64)iRowid - (u64)pDlidx->iPrev; }else{ i64 iPgno = (i==0 ? pWriter->writer.pgno : pDlidx[-1].pgno); assert( pDlidx->buf.n==0 ); @@ -234756,7 +246805,7 @@ static void fts5WriteAppendPoslistData( const u8 *a = aData; int n = nData; - assert( p->pConfig->pgsz>0 ); + assert( p->pConfig->pgsz>0 || p->rc!=SQLITE_OK ); while( p->rc==SQLITE_OK && (pPage->buf.n + pPage->pgidx.n + n)>=p->pConfig->pgsz ){ @@ -234891,7 +246940,7 @@ static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){ fts5BufferAppendBlob(&p->rc, &buf, sizeof(aHdr), aHdr); fts5BufferAppendVarint(&p->rc, &buf, pSeg->term.n); fts5BufferAppendBlob(&p->rc, &buf, pSeg->term.n, pSeg->term.p); - fts5BufferAppendBlob(&p->rc, &buf, pData->szLeaf-iOff,&pData->p[iOff]); + fts5BufferAppendBlob(&p->rc, &buf,pData->szLeaf-iOff,&pData->p[iOff]); if( p->rc==SQLITE_OK ){ /* Set the szLeaf field */ fts5PutU16(&buf.p[2], (u16)buf.n); @@ -234992,6 +247041,12 @@ static void fts5IndexMergeLevel( /* Read input from all segments in the input level */ nInput = pLvl->nSeg; + + /* Set the range of origins that will go into the output segment. */ + if( pStruct->nOriginCntr>0 ){ + pSeg->iOrigin1 = pLvl->aSeg[0].iOrigin1; + pSeg->iOrigin2 = pLvl->aSeg[pLvl->nSeg-1].iOrigin2; + } } bOldest = (pLvlOut->nSeg==1 && pStruct->nLevel==iLvl+2); @@ -235051,8 +247106,11 @@ static void fts5IndexMergeLevel( int i; /* Remove the redundant segments from the %_data table */ + assert( pSeg->nEntry==0 ); for(i=0; iaSeg[i].iSegid); + Fts5StructureSegment *pOld = &pLvl->aSeg[i]; + pSeg->nEntry += (pOld->nEntry - pOld->nEntryTombstone); + fts5DataRemoveSegment(p, pOld); } /* Remove the redundant segments from the input level */ @@ -235078,6 +247136,48 @@ static void fts5IndexMergeLevel( if( pnRem ) *pnRem -= writer.nLeafWritten; } +/* +** If this is not a contentless_delete=1 table, or if the 'deletemerge' +** configuration option is set to 0, then this function always returns -1. +** Otherwise, it searches the structure object passed as the second argument +** for a level suitable for merging due to having a large number of +** tombstones in the tombstone hash. If one is found, its index is returned. +** Otherwise, if there is no suitable level, -1. +*/ +static int fts5IndexFindDeleteMerge(Fts5Index *p, Fts5Structure *pStruct){ + Fts5Config *pConfig = p->pConfig; + int iRet = -1; + if( pConfig->bContentlessDelete && pConfig->nDeleteMerge>0 ){ + int ii; + int nBest = 0; + + for(ii=0; iinLevel; ii++){ + Fts5StructureLevel *pLvl = &pStruct->aLevel[ii]; + i64 nEntry = 0; + i64 nTomb = 0; + int iSeg; + for(iSeg=0; iSegnSeg; iSeg++){ + nEntry += pLvl->aSeg[iSeg].nEntry; + nTomb += pLvl->aSeg[iSeg].nEntryTombstone; + } + assert_nc( nEntry>0 || pLvl->nSeg==0 ); + if( nEntry>0 ){ + int nPercent = (nTomb * 100) / nEntry; + if( nPercent>=pConfig->nDeleteMerge && nPercent>nBest ){ + iRet = ii; + nBest = nPercent; + } + } + + /* If pLvl is already the input level to an ongoing merge, look no + ** further for a merge candidate. The caller should be allowed to + ** continue merging from pLvl first. */ + if( pLvl->nMerge ) break; + } + } + return iRet; +} + /* ** Do up to nPg pages of automerge work on the index. ** @@ -235097,14 +247197,15 @@ static int fts5IndexMerge( int iBestLvl = 0; /* Level offering the most input segments */ int nBest = 0; /* Number of input segments on best level */ - /* Set iBestLvl to the level to read input segments from. */ + /* Set iBestLvl to the level to read input segments from. Or to -1 if + ** there is no level suitable to merge segments from. */ assert( pStruct->nLevel>0 ); for(iLvl=0; iLvlnLevel; iLvl++){ Fts5StructureLevel *pLvl = &pStruct->aLevel[iLvl]; if( pLvl->nMerge ){ if( pLvl->nMerge>nBest ){ iBestLvl = iLvl; - nBest = pLvl->nMerge; + nBest = nMin; } break; } @@ -235113,22 +247214,18 @@ static int fts5IndexMerge( iBestLvl = iLvl; } } - - /* If nBest is still 0, then the index must be empty. */ -#ifdef SQLITE_DEBUG - for(iLvl=0; nBest==0 && iLvlnLevel; iLvl++){ - assert( pStruct->aLevel[iLvl].nSeg==0 ); + if( nBestaLevel[iBestLvl].nMerge==0 ){ - break; - } + if( iBestLvl<0 ) break; bRet = 1; fts5IndexMergeLevel(p, &pStruct, iBestLvl, &nRem); if( p->rc==SQLITE_OK && pStruct->aLevel[iBestLvl].nMerge==0 ){ fts5StructurePromote(p, iBestLvl+1, pStruct); } + + if( nMin==1 ) nMin = 2; } *ppStruct = pStruct; return bRet; @@ -235169,16 +247266,16 @@ static void fts5IndexCrisismerge( ){ const int nCrisis = p->pConfig->nCrisisMerge; Fts5Structure *pStruct = *ppStruct; - int iLvl = 0; - - assert( p->rc!=SQLITE_OK || pStruct->nLevel>0 ); - while( p->rc==SQLITE_OK && pStruct->aLevel[iLvl].nSeg>=nCrisis ){ - fts5IndexMergeLevel(p, &pStruct, iLvl, 0); - assert( p->rc!=SQLITE_OK || pStruct->nLevel>(iLvl+1) ); - fts5StructurePromote(p, iLvl+1, pStruct); - iLvl++; + if( pStruct && pStruct->nLevel>0 ){ + int iLvl = 0; + while( p->rc==SQLITE_OK && pStruct->aLevel[iLvl].nSeg>=nCrisis ){ + fts5IndexMergeLevel(p, &pStruct, iLvl, 0); + assert( p->rc!=SQLITE_OK || pStruct->nLevel>(iLvl+1) ); + fts5StructurePromote(p, iLvl+1, pStruct); + iLvl++; + } + *ppStruct = pStruct; } - *ppStruct = pStruct; } static int fts5IndexReturn(Fts5Index *p){ @@ -235212,6 +247309,469 @@ static int fts5PoslistPrefix(const u8 *aBuf, int nMax){ return ret; } +/* +** Execute the SQL statement: +** +** DELETE FROM %_idx WHERE (segid, (pgno/2)) = ($iSegid, $iPgno); +** +** This is used when a secure-delete operation removes the last term +** from a segment leaf page. In that case the %_idx entry is removed +** too. This is done to ensure that if all instances of a token are +** removed from an fts5 database in secure-delete mode, no trace of +** the token itself remains in the database. +*/ +static void fts5SecureDeleteIdxEntry( + Fts5Index *p, /* FTS5 backend object */ + int iSegid, /* Id of segment to delete entry for */ + int iPgno /* Page number within segment */ +){ + if( iPgno!=1 ){ + assert( p->pConfig->iVersion==FTS5_CURRENT_VERSION_SECUREDELETE ); + if( p->pDeleteFromIdx==0 ){ + fts5IndexPrepareStmt(p, &p->pDeleteFromIdx, sqlite3_mprintf( + "DELETE FROM '%q'.'%q_idx' WHERE (segid, (pgno/2)) = (?1, ?2)", + p->pConfig->zDb, p->pConfig->zName + )); + } + if( p->rc==SQLITE_OK ){ + sqlite3_bind_int(p->pDeleteFromIdx, 1, iSegid); + sqlite3_bind_int(p->pDeleteFromIdx, 2, iPgno); + sqlite3_step(p->pDeleteFromIdx); + p->rc = sqlite3_reset(p->pDeleteFromIdx); + } + } +} + +/* +** This is called when a secure-delete operation removes a position-list +** that overflows onto segment page iPgno of segment pSeg. This function +** rewrites node iPgno, and possibly one or more of its right-hand peers, +** to remove this portion of the position list. +** +** Output variable (*pbLastInDoclist) is set to true if the position-list +** removed is followed by a new term or the end-of-segment, or false if +** it is followed by another rowid/position list. +*/ +static void fts5SecureDeleteOverflow( + Fts5Index *p, + Fts5StructureSegment *pSeg, + int iPgno, + int *pbLastInDoclist +){ + const int bDetailNone = (p->pConfig->eDetail==FTS5_DETAIL_NONE); + int pgno; + Fts5Data *pLeaf = 0; + assert( iPgno!=1 ); + + *pbLastInDoclist = 1; + for(pgno=iPgno; p->rc==SQLITE_OK && pgno<=pSeg->pgnoLast; pgno++){ + i64 iRowid = FTS5_SEGMENT_ROWID(pSeg->iSegid, pgno); + int iNext = 0; + u8 *aPg = 0; + + pLeaf = fts5DataRead(p, iRowid); + if( pLeaf==0 ) break; + aPg = pLeaf->p; + + iNext = fts5GetU16(&aPg[0]); + if( iNext!=0 ){ + *pbLastInDoclist = 0; + } + if( iNext==0 && pLeaf->szLeaf!=pLeaf->nn ){ + fts5GetVarint32(&aPg[pLeaf->szLeaf], iNext); + } + + if( iNext==0 ){ + /* The page contains no terms or rowids. Replace it with an empty + ** page and move on to the right-hand peer. */ + const u8 aEmpty[] = {0x00, 0x00, 0x00, 0x04}; + assert_nc( bDetailNone==0 || pLeaf->nn==4 ); + if( bDetailNone==0 ) fts5DataWrite(p, iRowid, aEmpty, sizeof(aEmpty)); + fts5DataRelease(pLeaf); + pLeaf = 0; + }else if( bDetailNone ){ + break; + }else if( iNext>=pLeaf->szLeaf || pLeaf->nnszLeaf || iNext<4 ){ + p->rc = FTS5_CORRUPT; + break; + }else{ + int nShift = iNext - 4; + int nPg; + + int nIdx = 0; + u8 *aIdx = 0; + + /* Unless the current page footer is 0 bytes in size (in which case + ** the new page footer will be as well), allocate and populate a + ** buffer containing the new page footer. Set stack variables aIdx + ** and nIdx accordingly. */ + if( pLeaf->nn>pLeaf->szLeaf ){ + int iFirst = 0; + int i1 = pLeaf->szLeaf; + int i2 = 0; + + i1 += fts5GetVarint32(&aPg[i1], iFirst); + if( iFirstrc = FTS5_CORRUPT; + break; + } + aIdx = sqlite3Fts5MallocZero(&p->rc, (pLeaf->nn-pLeaf->szLeaf)+2); + if( aIdx==0 ) break; + i2 = sqlite3Fts5PutVarint(aIdx, iFirst-nShift); + if( i1nn ){ + memcpy(&aIdx[i2], &aPg[i1], pLeaf->nn-i1); + i2 += (pLeaf->nn-i1); + } + nIdx = i2; + } + + /* Modify the contents of buffer aPg[]. Set nPg to the new size + ** in bytes. The new page is always smaller than the old. */ + nPg = pLeaf->szLeaf - nShift; + memmove(&aPg[4], &aPg[4+nShift], nPg-4); + fts5PutU16(&aPg[2], nPg); + if( fts5GetU16(&aPg[0]) ) fts5PutU16(&aPg[0], 4); + if( nIdx>0 ){ + memcpy(&aPg[nPg], aIdx, nIdx); + nPg += nIdx; + } + sqlite3_free(aIdx); + + /* Write the new page to disk and exit the loop */ + assert( nPg>4 || fts5GetU16(aPg)==0 ); + fts5DataWrite(p, iRowid, aPg, nPg); + break; + } + } + fts5DataRelease(pLeaf); +} + +/* +** Completely remove the entry that pSeg currently points to from +** the database. +*/ +static void fts5DoSecureDelete( + Fts5Index *p, + Fts5SegIter *pSeg +){ + const int bDetailNone = (p->pConfig->eDetail==FTS5_DETAIL_NONE); + int iSegid = pSeg->pSeg->iSegid; + u8 *aPg = pSeg->pLeaf->p; + int nPg = pSeg->pLeaf->nn; + int iPgIdx = pSeg->pLeaf->szLeaf; + + u64 iDelta = 0; + int iNextOff = 0; + int iOff = 0; + int nIdx = 0; + u8 *aIdx = 0; + int bLastInDoclist = 0; + int iIdx = 0; + int iStart = 0; + int iDelKeyOff = 0; /* Offset of deleted key, if any */ + + nIdx = nPg-iPgIdx; + aIdx = sqlite3Fts5MallocZero(&p->rc, nIdx+16); + if( p->rc ) return; + memcpy(aIdx, &aPg[iPgIdx], nIdx); + + /* At this point segment iterator pSeg points to the entry + ** this function should remove from the b-tree segment. + ** + ** In detail=full or detail=column mode, pSeg->iLeafOffset is the + ** offset of the first byte in the position-list for the entry to + ** remove. Immediately before this comes two varints that will also + ** need to be removed: + ** + ** + the rowid or delta rowid value for the entry, and + ** + the size of the position list in bytes. + ** + ** Or, in detail=none mode, there is a single varint prior to + ** pSeg->iLeafOffset - the rowid or delta rowid value. + ** + ** This block sets the following variables: + ** + ** iStart: + ** The offset of the first byte of the rowid or delta-rowid + ** value for the doclist entry being removed. + ** + ** iDelta: + ** The value of the rowid or delta-rowid value for the doclist + ** entry being removed. + ** + ** iNextOff: + ** The offset of the next entry following the position list + ** for the one being removed. If the position list for this + ** entry overflows onto the next leaf page, this value will be + ** greater than pLeaf->szLeaf. + */ + { + int iSOP; /* Start-Of-Position-list */ + if( pSeg->iLeafPgno==pSeg->iTermLeafPgno ){ + iStart = pSeg->iTermLeafOffset; + }else{ + iStart = fts5GetU16(&aPg[0]); + } + + iSOP = iStart + fts5GetVarint(&aPg[iStart], &iDelta); + assert_nc( iSOP<=pSeg->iLeafOffset ); + + if( bDetailNone ){ + while( iSOPiLeafOffset ){ + if( aPg[iSOP]==0x00 ) iSOP++; + if( aPg[iSOP]==0x00 ) iSOP++; + iStart = iSOP; + iSOP = iStart + fts5GetVarint(&aPg[iStart], &iDelta); + } + + iNextOff = iSOP; + if( iNextOffiEndofDoclist && aPg[iNextOff]==0x00 ) iNextOff++; + if( iNextOffiEndofDoclist && aPg[iNextOff]==0x00 ) iNextOff++; + + }else{ + int nPos = 0; + iSOP += fts5GetVarint32(&aPg[iSOP], nPos); + while( iSOPiLeafOffset ){ + iStart = iSOP + (nPos/2); + iSOP = iStart + fts5GetVarint(&aPg[iStart], &iDelta); + iSOP += fts5GetVarint32(&aPg[iSOP], nPos); + } + assert_nc( iSOP==pSeg->iLeafOffset ); + iNextOff = pSeg->iLeafOffset + pSeg->nPos; + } + } + + iOff = iStart; + + /* If the position-list for the entry being removed flows over past + ** the end of this page, delete the portion of the position-list on the + ** next page and beyond. + ** + ** Set variable bLastInDoclist to true if this entry happens + ** to be the last rowid in the doclist for its term. */ + if( iNextOff>=iPgIdx ){ + int pgno = pSeg->iLeafPgno+1; + fts5SecureDeleteOverflow(p, pSeg->pSeg, pgno, &bLastInDoclist); + iNextOff = iPgIdx; + } + + if( pSeg->bDel==0 ){ + if( iNextOff!=iPgIdx ){ + /* Loop through the page-footer. If iNextOff (offset of the + ** entry following the one we are removing) is equal to the + ** offset of a key on this page, then the entry is the last + ** in its doclist. */ + int iKeyOff = 0; + for(iIdx=0; iIdxbDel ){ + iOff += sqlite3Fts5PutVarint(&aPg[iOff], iDelta); + aPg[iOff++] = 0x01; + }else if( bLastInDoclist==0 ){ + if( iNextOff!=iPgIdx ){ + u64 iNextDelta = 0; + iNextOff += fts5GetVarint(&aPg[iNextOff], &iNextDelta); + iOff += sqlite3Fts5PutVarint(&aPg[iOff], iDelta + iNextDelta); + } + }else if( + pSeg->iLeafPgno==pSeg->iTermLeafPgno + && iStart==pSeg->iTermLeafOffset + ){ + /* The entry being removed was the only position list in its + ** doclist. Therefore the term needs to be removed as well. */ + int iKey = 0; + int iKeyOff = 0; + + /* Set iKeyOff to the offset of the term that will be removed - the + ** last offset in the footer that is not greater than iStart. */ + for(iIdx=0; iIdx(u32)iStart ) break; + iKeyOff += iVal; + } + assert_nc( iKey>=1 ); + + /* Set iDelKeyOff to the value of the footer entry to remove from + ** the page. */ + iDelKeyOff = iOff = iKeyOff; + + if( iNextOff!=iPgIdx ){ + /* This is the only position-list associated with the term, and there + ** is another term following it on this page. So the subsequent term + ** needs to be moved to replace the term associated with the entry + ** being removed. */ + int nPrefix = 0; + int nSuffix = 0; + int nPrefix2 = 0; + int nSuffix2 = 0; + + iDelKeyOff = iNextOff; + iNextOff += fts5GetVarint32(&aPg[iNextOff], nPrefix2); + iNextOff += fts5GetVarint32(&aPg[iNextOff], nSuffix2); + + if( iKey!=1 ){ + iKeyOff += fts5GetVarint32(&aPg[iKeyOff], nPrefix); + } + iKeyOff += fts5GetVarint32(&aPg[iKeyOff], nSuffix); + + nPrefix = MIN(nPrefix, nPrefix2); + nSuffix = (nPrefix2 + nSuffix2) - nPrefix; + + if( (iKeyOff+nSuffix)>iPgIdx || (iNextOff+nSuffix2)>iPgIdx ){ + p->rc = FTS5_CORRUPT; + }else{ + if( iKey!=1 ){ + iOff += sqlite3Fts5PutVarint(&aPg[iOff], nPrefix); + } + iOff += sqlite3Fts5PutVarint(&aPg[iOff], nSuffix); + if( nPrefix2>pSeg->term.n ){ + p->rc = FTS5_CORRUPT; + }else if( nPrefix2>nPrefix ){ + memcpy(&aPg[iOff], &pSeg->term.p[nPrefix], nPrefix2-nPrefix); + iOff += (nPrefix2-nPrefix); + } + memmove(&aPg[iOff], &aPg[iNextOff], nSuffix2); + iOff += nSuffix2; + iNextOff += nSuffix2; + } + } + }else if( iStart==4 ){ + int iPgno; + + assert_nc( pSeg->iLeafPgno>pSeg->iTermLeafPgno ); + /* The entry being removed may be the only position list in + ** its doclist. */ + for(iPgno=pSeg->iLeafPgno-1; iPgno>pSeg->iTermLeafPgno; iPgno-- ){ + Fts5Data *pPg = fts5DataRead(p, FTS5_SEGMENT_ROWID(iSegid, iPgno)); + int bEmpty = (pPg && pPg->nn==4); + fts5DataRelease(pPg); + if( bEmpty==0 ) break; + } + + if( iPgno==pSeg->iTermLeafPgno ){ + i64 iId = FTS5_SEGMENT_ROWID(iSegid, pSeg->iTermLeafPgno); + Fts5Data *pTerm = fts5DataRead(p, iId); + if( pTerm && pTerm->szLeaf==pSeg->iTermLeafOffset ){ + u8 *aTermIdx = &pTerm->p[pTerm->szLeaf]; + int nTermIdx = pTerm->nn - pTerm->szLeaf; + int iTermIdx = 0; + int iTermOff = 0; + + while( 1 ){ + u32 iVal = 0; + int nByte = fts5GetVarint32(&aTermIdx[iTermIdx], iVal); + iTermOff += iVal; + if( (iTermIdx+nByte)>=nTermIdx ) break; + iTermIdx += nByte; + } + nTermIdx = iTermIdx; + + memmove(&pTerm->p[iTermOff], &pTerm->p[pTerm->szLeaf], nTermIdx); + fts5PutU16(&pTerm->p[2], iTermOff); + + fts5DataWrite(p, iId, pTerm->p, iTermOff+nTermIdx); + if( nTermIdx==0 ){ + fts5SecureDeleteIdxEntry(p, iSegid, pSeg->iTermLeafPgno); + } + } + fts5DataRelease(pTerm); + } + } + + /* Assuming no error has occurred, this block does final edits to the + ** leaf page before writing it back to disk. Input variables are: + ** + ** nPg: Total initial size of leaf page. + ** iPgIdx: Initial offset of page footer. + ** + ** iOff: Offset to move data to + ** iNextOff: Offset to move data from + */ + if( p->rc==SQLITE_OK ){ + const int nMove = nPg - iNextOff; /* Number of bytes to move */ + int nShift = iNextOff - iOff; /* Distance to move them */ + + int iPrevKeyOut = 0; + int iKeyIn = 0; + + memmove(&aPg[iOff], &aPg[iNextOff], nMove); + iPgIdx -= nShift; + nPg = iPgIdx; + fts5PutU16(&aPg[2], iPgIdx); + + for(iIdx=0; iIdxiOff ? nShift : 0)); + nPg += sqlite3Fts5PutVarint(&aPg[nPg], iKeyOut - iPrevKeyOut); + iPrevKeyOut = iKeyOut; + } + } + + if( iPgIdx==nPg && nIdx>0 && pSeg->iLeafPgno!=1 ){ + fts5SecureDeleteIdxEntry(p, iSegid, pSeg->iLeafPgno); + } + + assert_nc( nPg>4 || fts5GetU16(aPg)==0 ); + fts5DataWrite(p, FTS5_SEGMENT_ROWID(iSegid,pSeg->iLeafPgno), aPg, nPg); + } + sqlite3_free(aIdx); +} + +/* +** This is called as part of flushing a delete to disk in 'secure-delete' +** mode. It edits the segments within the database described by argument +** pStruct to remove the entries for term zTerm, rowid iRowid. +*/ +static void fts5FlushSecureDelete( + Fts5Index *p, + Fts5Structure *pStruct, + const char *zTerm, + int nTerm, + i64 iRowid +){ + const int f = FTS5INDEX_QUERY_SKIPHASH; + Fts5Iter *pIter = 0; /* Used to find term instance */ + + fts5MultiIterNew(p, pStruct, f, 0, (const u8*)zTerm, nTerm, -1, 0, &pIter); + if( fts5MultiIterEof(p, pIter)==0 ){ + i64 iThis = fts5MultiIterRowid(pIter); + if( iThisrc==SQLITE_OK + && fts5MultiIterEof(p, pIter)==0 + && iRowid==fts5MultiIterRowid(pIter) + ){ + Fts5SegIter *pSeg = &pIter->aSeg[pIter->aFirst[1].iFirst]; + fts5DoSecureDelete(p, pSeg); + } + } + + fts5MultiIterFree(pIter); +} + + /* ** Flush the contents of in-memory hash table iHash to a new level-0 ** segment on disk. Also update the corresponding structure record. @@ -235228,143 +247788,197 @@ static void fts5FlushOneHash(Fts5Index *p){ /* Obtain a reference to the index structure and allocate a new segment-id ** for the new level-0 segment. */ pStruct = fts5StructureRead(p); - iSegid = fts5AllocateSegid(p, pStruct); fts5StructureInvalidate(p); - if( iSegid ){ - const int pgsz = p->pConfig->pgsz; - int eDetail = p->pConfig->eDetail; - Fts5StructureSegment *pSeg; /* New segment within pStruct */ - Fts5Buffer *pBuf; /* Buffer in which to assemble leaf page */ - Fts5Buffer *pPgidx; /* Buffer in which to assemble pgidx */ + if( sqlite3Fts5HashIsEmpty(pHash)==0 ){ + iSegid = fts5AllocateSegid(p, pStruct); + if( iSegid ){ + const int pgsz = p->pConfig->pgsz; + int eDetail = p->pConfig->eDetail; + int bSecureDelete = p->pConfig->bSecureDelete; + Fts5StructureSegment *pSeg; /* New segment within pStruct */ + Fts5Buffer *pBuf; /* Buffer in which to assemble leaf page */ + Fts5Buffer *pPgidx; /* Buffer in which to assemble pgidx */ + + Fts5SegWriter writer; + fts5WriteInit(p, &writer, iSegid); + + pBuf = &writer.writer.buf; + pPgidx = &writer.writer.pgidx; + + /* fts5WriteInit() should have initialized the buffers to (most likely) + ** the maximum space required. */ + assert( p->rc || pBuf->nSpace>=(pgsz + FTS5_DATA_PADDING) ); + assert( p->rc || pPgidx->nSpace>=(pgsz + FTS5_DATA_PADDING) ); + + /* Begin scanning through hash table entries. This loop runs once for each + ** term/doclist currently stored within the hash table. */ + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3Fts5HashScanInit(pHash, 0, 0); + } + while( p->rc==SQLITE_OK && 0==sqlite3Fts5HashScanEof(pHash) ){ + const char *zTerm; /* Buffer containing term */ + int nTerm; /* Size of zTerm in bytes */ + const u8 *pDoclist; /* Pointer to doclist for this term */ + int nDoclist; /* Size of doclist in bytes */ - Fts5SegWriter writer; - fts5WriteInit(p, &writer, iSegid); + /* Get the term and doclist for this entry. */ + sqlite3Fts5HashScanEntry(pHash, &zTerm, &nTerm, &pDoclist, &nDoclist); + if( bSecureDelete==0 ){ + fts5WriteAppendTerm(p, &writer, nTerm, (const u8*)zTerm); + if( p->rc!=SQLITE_OK ) break; + assert( writer.bFirstRowidInPage==0 ); + } - pBuf = &writer.writer.buf; - pPgidx = &writer.writer.pgidx; + if( !bSecureDelete && pgsz>=(pBuf->n + pPgidx->n + nDoclist + 1) ){ + /* The entire doclist will fit on the current leaf. */ + fts5BufferSafeAppendBlob(pBuf, pDoclist, nDoclist); + }else{ + int bTermWritten = !bSecureDelete; + i64 iRowid = 0; + i64 iPrev = 0; + int iOff = 0; + + /* The entire doclist will not fit on this leaf. The following + ** loop iterates through the poslists that make up the current + ** doclist. */ + while( p->rc==SQLITE_OK && iOffrc!=SQLITE_OK || pDoclist[iOff]==0x01 ){ + iOff++; + continue; + } + } + } - /* fts5WriteInit() should have initialized the buffers to (most likely) - ** the maximum space required. */ - assert( p->rc || pBuf->nSpace>=(pgsz + FTS5_DATA_PADDING) ); - assert( p->rc || pPgidx->nSpace>=(pgsz + FTS5_DATA_PADDING) ); + if( p->rc==SQLITE_OK && bTermWritten==0 ){ + fts5WriteAppendTerm(p, &writer, nTerm, (const u8*)zTerm); + bTermWritten = 1; + assert( p->rc!=SQLITE_OK || writer.bFirstRowidInPage==0 ); + } - /* Begin scanning through hash table entries. This loop runs once for each - ** term/doclist currently stored within the hash table. */ - if( p->rc==SQLITE_OK ){ - p->rc = sqlite3Fts5HashScanInit(pHash, 0, 0); - } - while( p->rc==SQLITE_OK && 0==sqlite3Fts5HashScanEof(pHash) ){ - const char *zTerm; /* Buffer containing term */ - const u8 *pDoclist; /* Pointer to doclist for this term */ - int nDoclist; /* Size of doclist in bytes */ - - /* Write the term for this entry to disk. */ - sqlite3Fts5HashScanEntry(pHash, &zTerm, &pDoclist, &nDoclist); - fts5WriteAppendTerm(p, &writer, (int)strlen(zTerm), (const u8*)zTerm); - if( p->rc!=SQLITE_OK ) break; - - assert( writer.bFirstRowidInPage==0 ); - if( pgsz>=(pBuf->n + pPgidx->n + nDoclist + 1) ){ - /* The entire doclist will fit on the current leaf. */ - fts5BufferSafeAppendBlob(pBuf, pDoclist, nDoclist); - }else{ - i64 iRowid = 0; - u64 iDelta = 0; - int iOff = 0; - - /* The entire doclist will not fit on this leaf. The following - ** loop iterates through the poslists that make up the current - ** doclist. */ - while( p->rc==SQLITE_OK && iOffp[0], (u16)pBuf->n); /* first rowid on page */ - pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iRowid); - writer.bFirstRowidInPage = 0; - fts5WriteDlidxAppend(p, &writer, iRowid); + if( writer.bFirstRowidInPage ){ + fts5PutU16(&pBuf->p[0], (u16)pBuf->n); /* first rowid on page */ + pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iRowid); + writer.bFirstRowidInPage = 0; + fts5WriteDlidxAppend(p, &writer, iRowid); + }else{ + u64 iRowidDelta = (u64)iRowid - (u64)iPrev; + pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iRowidDelta); + } if( p->rc!=SQLITE_OK ) break; - }else{ - pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iDelta); - } - assert( pBuf->n<=pBuf->nSpace ); + assert( pBuf->n<=pBuf->nSpace ); + iPrev = iRowid; - if( eDetail==FTS5_DETAIL_NONE ){ - if( iOffp[pBuf->n++] = 0; - iOff++; + if( eDetail==FTS5_DETAIL_NONE ){ if( iOffp[pBuf->n++] = 0; iOff++; + if( iOffp[pBuf->n++] = 0; + iOff++; + } + } + if( (pBuf->n + pPgidx->n)>=pgsz ){ + fts5WriteFlushLeaf(p, &writer); } - } - if( (pBuf->n + pPgidx->n)>=pgsz ){ - fts5WriteFlushLeaf(p, &writer); - } - }else{ - int bDummy; - int nPos; - int nCopy = fts5GetPoslistSize(&pDoclist[iOff], &nPos, &bDummy); - nCopy += nPos; - if( (pBuf->n + pPgidx->n + nCopy) <= pgsz ){ - /* The entire poslist will fit on the current leaf. So copy - ** it in one go. */ - fts5BufferSafeAppendBlob(pBuf, &pDoclist[iOff], nCopy); }else{ - /* The entire poslist will not fit on this leaf. So it needs - ** to be broken into sections. The only qualification being - ** that each varint must be stored contiguously. */ - const u8 *pPoslist = &pDoclist[iOff]; - int iPos = 0; - while( p->rc==SQLITE_OK ){ - int nSpace = pgsz - pBuf->n - pPgidx->n; - int n = 0; - if( (nCopy - iPos)<=nSpace ){ - n = nCopy - iPos; - }else{ - n = fts5PoslistPrefix(&pPoslist[iPos], nSpace); - } - assert( n>0 ); - fts5BufferSafeAppendBlob(pBuf, &pPoslist[iPos], n); - iPos += n; - if( (pBuf->n + pPgidx->n)>=pgsz ){ - fts5WriteFlushLeaf(p, &writer); + int bDel = 0; + int nPos = 0; + int nCopy = fts5GetPoslistSize(&pDoclist[iOff], &nPos, &bDel); + if( bDel && bSecureDelete ){ + fts5BufferAppendVarint(&p->rc, pBuf, nPos*2); + iOff += nCopy; + nCopy = nPos; + }else{ + nCopy += nPos; + } + if( (pBuf->n + pPgidx->n + nCopy) <= pgsz ){ + /* The entire poslist will fit on the current leaf. So copy + ** it in one go. */ + fts5BufferSafeAppendBlob(pBuf, &pDoclist[iOff], nCopy); + }else{ + /* The entire poslist will not fit on this leaf. So it needs + ** to be broken into sections. The only qualification being + ** that each varint must be stored contiguously. */ + const u8 *pPoslist = &pDoclist[iOff]; + int iPos = 0; + while( p->rc==SQLITE_OK ){ + int nSpace = pgsz - pBuf->n - pPgidx->n; + int n = 0; + if( (nCopy - iPos)<=nSpace ){ + n = nCopy - iPos; + }else{ + n = fts5PoslistPrefix(&pPoslist[iPos], nSpace); + } + assert( n>0 ); + fts5BufferSafeAppendBlob(pBuf, &pPoslist[iPos], n); + iPos += n; + if( (pBuf->n + pPgidx->n)>=pgsz ){ + fts5WriteFlushLeaf(p, &writer); + } + if( iPos>=nCopy ) break; } - if( iPos>=nCopy ) break; } + iOff += nCopy; } - iOff += nCopy; } } - } - /* TODO2: Doclist terminator written here. */ - /* pBuf->p[pBuf->n++] = '\0'; */ - assert( pBuf->n<=pBuf->nSpace ); - if( p->rc==SQLITE_OK ) sqlite3Fts5HashScanNext(pHash); - } - sqlite3Fts5HashClear(pHash); - fts5WriteFinish(p, &writer, &pgnoLast); + /* TODO2: Doclist terminator written here. */ + /* pBuf->p[pBuf->n++] = '\0'; */ + assert( pBuf->n<=pBuf->nSpace ); + if( p->rc==SQLITE_OK ) sqlite3Fts5HashScanNext(pHash); + } + fts5WriteFinish(p, &writer, &pgnoLast); - /* Update the Fts5Structure. It is written back to the database by the - ** fts5StructureRelease() call below. */ - if( pStruct->nLevel==0 ){ - fts5StructureAddLevel(&p->rc, &pStruct); - } - fts5StructureExtendLevel(&p->rc, pStruct, 0, 1, 0); - if( p->rc==SQLITE_OK ){ - pSeg = &pStruct->aLevel[0].aSeg[ pStruct->aLevel[0].nSeg++ ]; - pSeg->iSegid = iSegid; - pSeg->pgnoFirst = 1; - pSeg->pgnoLast = pgnoLast; - pStruct->nSegment++; + assert( p->rc!=SQLITE_OK || bSecureDelete || pgnoLast>0 ); + if( pgnoLast>0 ){ + /* Update the Fts5Structure. It is written back to the database by the + ** fts5StructureRelease() call below. */ + if( pStruct->nLevel==0 ){ + fts5StructureAddLevel(&p->rc, &pStruct); + } + fts5StructureExtendLevel(&p->rc, pStruct, 0, 1, 0); + if( p->rc==SQLITE_OK ){ + pSeg = &pStruct->aLevel[0].aSeg[ pStruct->aLevel[0].nSeg++ ]; + pSeg->iSegid = iSegid; + pSeg->pgnoFirst = 1; + pSeg->pgnoLast = pgnoLast; + if( pStruct->nOriginCntr>0 ){ + pSeg->iOrigin1 = pStruct->nOriginCntr; + pSeg->iOrigin2 = pStruct->nOriginCntr; + pSeg->nEntry = p->nPendingRow; + pStruct->nOriginCntr++; + } + pStruct->nSegment++; + } + fts5StructurePromote(p, 0, pStruct); + } } - fts5StructurePromote(p, 0, pStruct); } - fts5IndexAutomerge(p, &pStruct, pgnoLast); + fts5IndexAutomerge(p, &pStruct, pgnoLast + p->nContentlessDelete); fts5IndexCrisismerge(p, &pStruct); fts5StructureWrite(p, pStruct); fts5StructureRelease(pStruct); @@ -235375,10 +247989,21 @@ static void fts5FlushOneHash(Fts5Index *p){ */ static void fts5IndexFlush(Fts5Index *p){ /* Unless it is empty, flush the hash table to disk */ - if( p->nPendingData ){ + if( p->flushRc ){ + p->rc = p->flushRc; + return; + } + if( p->nPendingData || p->nContentlessDelete ){ assert( p->pHash ); - p->nPendingData = 0; fts5FlushOneHash(p); + if( p->rc==SQLITE_OK ){ + sqlite3Fts5HashClear(p->pHash); + p->nPendingData = 0; + p->nPendingRow = 0; + p->nContentlessDelete = 0; + }else if( p->nPendingData || p->nContentlessDelete ){ + p->flushRc = p->rc; + } } } @@ -235394,17 +248019,22 @@ static Fts5Structure *fts5IndexOptimizeStruct( /* Figure out if this structure requires optimization. A structure does ** not require optimization if either: ** - ** + it consists of fewer than two segments, or - ** + all segments are on the same level, or - ** + all segments except one are currently inputs to a merge operation. + ** 1. it consists of fewer than two segments, or + ** 2. all segments are on the same level, or + ** 3. all segments except one are currently inputs to a merge operation. ** - ** In the first case, return NULL. In the second, increment the ref-count - ** on *pStruct and return a copy of the pointer to it. + ** In the first case, if there are no tombstone hash pages, return NULL. In + ** the second, increment the ref-count on *pStruct and return a copy of the + ** pointer to it. */ - if( nSeg<2 ) return 0; + if( nSeg==0 ) return 0; for(i=0; inLevel; i++){ int nThis = pStruct->aLevel[i].nSeg; - if( nThis==nSeg || (nThis==nSeg-1 && pStruct->aLevel[i].nMerge==nThis) ){ + int nMerge = pStruct->aLevel[i].nMerge; + if( nThis>0 && (nThis==nSeg || (nThis==nSeg-1 && nMerge==nThis)) ){ + if( nSeg==1 && nThis==1 && pStruct->aLevel[i].aSeg[0].nPgTombstone==0 ){ + return 0; + } fts5StructureRef(pStruct); return pStruct; } @@ -235420,6 +248050,7 @@ static Fts5Structure *fts5IndexOptimizeStruct( pNew->nLevel = MIN(pStruct->nLevel+1, FTS5_MAX_LEVEL); pNew->nRef = 1; pNew->nWriteCounter = pStruct->nWriteCounter; + pNew->nOriginCntr = pStruct->nOriginCntr; pLvl = &pNew->aLevel[pNew->nLevel-1]; pLvl->aSeg = (Fts5StructureSegment*)sqlite3Fts5MallocZero(&p->rc, nByte); if( pLvl->aSeg ){ @@ -235450,7 +248081,9 @@ static int sqlite3Fts5IndexOptimize(Fts5Index *p){ assert( p->rc==SQLITE_OK ); fts5IndexFlush(p); + assert( p->rc!=SQLITE_OK || p->nContentlessDelete==0 ); pStruct = fts5StructureRead(p); + assert( p->rc!=SQLITE_OK || pStruct!=0 ); fts5StructureInvalidate(p); if( pStruct ){ @@ -235479,7 +248112,10 @@ static int sqlite3Fts5IndexOptimize(Fts5Index *p){ ** INSERT command. */ static int sqlite3Fts5IndexMerge(Fts5Index *p, int nMerge){ - Fts5Structure *pStruct = fts5StructureRead(p); + Fts5Structure *pStruct = 0; + + fts5IndexFlush(p); + pStruct = fts5StructureRead(p); if( pStruct ){ int nMin = p->pConfig->nUsermerge; fts5StructureInvalidate(p); @@ -235487,7 +248123,7 @@ static int sqlite3Fts5IndexMerge(Fts5Index *p, int nMerge){ Fts5Structure *pNew = fts5IndexOptimizeStruct(p, pStruct); fts5StructureRelease(pStruct); pStruct = pNew; - nMin = 2; + nMin = 1; nMerge = nMerge*-1; } if( pStruct && pStruct->nLevel ){ @@ -235853,7 +248489,7 @@ static void fts5SetupPrefixIter( u8 *pToken, /* Buffer containing prefix to match */ int nToken, /* Size of buffer pToken in bytes */ Fts5Colset *pColset, /* Restrict matches to these columns */ - Fts5Iter **ppIter /* OUT: New iterator */ + Fts5Iter **ppIter /* OUT: New iterator */ ){ Fts5Structure *pStruct; Fts5Buffer *aBuf; @@ -235874,8 +248510,9 @@ static void fts5SetupPrefixIter( aBuf = (Fts5Buffer*)fts5IdxMalloc(p, sizeof(Fts5Buffer)*nBuf); pStruct = fts5StructureRead(p); + assert( p->rc!=SQLITE_OK || (aBuf && pStruct) ); - if( aBuf && pStruct ){ + if( p->rc==SQLITE_OK ){ const int flags = FTS5INDEX_QUERY_SCAN | FTS5INDEX_QUERY_SKIPEMPTY | FTS5INDEX_QUERY_NOOUTPUT; @@ -235887,6 +248524,12 @@ static void fts5SetupPrefixIter( int bNewTerm = 1; memset(&doclist, 0, sizeof(doclist)); + + /* If iIdx is non-zero, then it is the number of a prefix-index for + ** prefixes 1 character longer than the prefix being queried for. That + ** index contains all the doclists required, except for the one + ** corresponding to the prefix itself. That one is extracted from the + ** main term index here. */ if( iIdx!=0 ){ int dummy = 0; const int f2 = FTS5INDEX_QUERY_SKIPEMPTY|FTS5INDEX_QUERY_NOOUTPUT; @@ -235910,6 +248553,7 @@ static void fts5SetupPrefixIter( pToken[0] = FTS5_MAIN_PREFIX + iIdx; fts5MultiIterNew(p, pStruct, flags, pColset, pToken, nToken, -1, 0, &p1); fts5IterSetOutputCb(&p->rc, p1); + for( /* no-op */ ; fts5MultiIterEof(p, p1)==0; fts5MultiIterNext2(p, p1, &bNewTerm) @@ -235925,7 +248569,6 @@ static void fts5SetupPrefixIter( } if( p1->base.nData==0 ) continue; - if( p1->base.iRowid<=iLastRowid && doclist.n>0 ){ for(i=0; p->rc==SQLITE_OK && doclist.n; i++){ int i1 = i*nMerge; @@ -235964,7 +248607,7 @@ static void fts5SetupPrefixIter( } fts5MultiIterFree(p1); - pData = fts5IdxMalloc(p, sizeof(Fts5Data)+doclist.n+FTS5_DATA_ZERO_PADDING); + pData = fts5IdxMalloc(p, sizeof(*pData)+doclist.n+FTS5_DATA_ZERO_PADDING); if( pData ){ pData->p = (u8*)&pData[1]; pData->nn = pData->szLeaf = doclist.n; @@ -236001,6 +248644,9 @@ static int sqlite3Fts5IndexBeginWrite(Fts5Index *p, int bDelete, i64 iRowid){ p->iWriteRowid = iRowid; p->bDelete = bDelete; + if( bDelete==0 ){ + p->nPendingRow++; + } return fts5IndexReturn(p); } @@ -236038,6 +248684,9 @@ static int sqlite3Fts5IndexReinit(Fts5Index *p){ fts5StructureInvalidate(p); fts5IndexDiscardData(p); memset(&s, 0, sizeof(Fts5Structure)); + if( p->pConfig->bContentlessDelete ){ + s.nOriginCntr = 1; + } fts5DataWrite(p, FTS5_AVERAGES_ROWID, (const u8*)"", 0); fts5StructureWrite(p, &s); return fts5IndexReturn(p); @@ -236101,7 +248750,9 @@ static int sqlite3Fts5IndexClose(Fts5Index *p){ sqlite3_finalize(p->pIdxWriter); sqlite3_finalize(p->pIdxDeleter); sqlite3_finalize(p->pIdxSelect); + sqlite3_finalize(p->pIdxNextSelect); sqlite3_finalize(p->pDataVersion); + sqlite3_finalize(p->pDeleteFromIdx); sqlite3Fts5HashFree(p->pHash); sqlite3_free(p->zDataTbl); sqlite3_free(p); @@ -236195,6 +248846,457 @@ static int sqlite3Fts5IndexWrite( return rc; } +/* +** pToken points to a buffer of size nToken bytes containing a search +** term, including the index number at the start, used on a tokendata=1 +** table. This function returns true if the term in buffer pBuf matches +** token pToken/nToken. +*/ +static int fts5IsTokendataPrefix( + Fts5Buffer *pBuf, + const u8 *pToken, + int nToken +){ + return ( + pBuf->n>=nToken + && 0==memcmp(pBuf->p, pToken, nToken) + && (pBuf->n==nToken || pBuf->p[nToken]==0x00) + ); +} + +/* +** Ensure the segment-iterator passed as the only argument points to EOF. +*/ +static void fts5SegIterSetEOF(Fts5SegIter *pSeg){ + fts5DataRelease(pSeg->pLeaf); + pSeg->pLeaf = 0; +} + +/* +** Usually, a tokendata=1 iterator (struct Fts5TokenDataIter) accumulates an +** array of these for each row it visits. Or, for an iterator used by an +** "ORDER BY rank" query, it accumulates an array of these for the entire +** query. +** +** Each instance in the array indicates the iterator (and therefore term) +** associated with position iPos of rowid iRowid. This is used by the +** xInstToken() API. +*/ +struct Fts5TokenDataMap { + i64 iRowid; /* Row this token is located in */ + i64 iPos; /* Position of token */ + int iIter; /* Iterator token was read from */ +}; + +/* +** An object used to supplement Fts5Iter for tokendata=1 iterators. +*/ +struct Fts5TokenDataIter { + int nIter; + int nIterAlloc; + + int nMap; + int nMapAlloc; + Fts5TokenDataMap *aMap; + + Fts5PoslistReader *aPoslistReader; + int *aPoslistToIter; + Fts5Iter *apIter[1]; +}; + +/* +** This function appends iterator pAppend to Fts5TokenDataIter pIn and +** returns the result. +*/ +static Fts5TokenDataIter *fts5AppendTokendataIter( + Fts5Index *p, /* Index object (for error code) */ + Fts5TokenDataIter *pIn, /* Current Fts5TokenDataIter struct */ + Fts5Iter *pAppend /* Append this iterator */ +){ + Fts5TokenDataIter *pRet = pIn; + + if( p->rc==SQLITE_OK ){ + if( pIn==0 || pIn->nIter==pIn->nIterAlloc ){ + int nAlloc = pIn ? pIn->nIterAlloc*2 : 16; + int nByte = nAlloc * sizeof(Fts5Iter*) + sizeof(Fts5TokenDataIter); + Fts5TokenDataIter *pNew = (Fts5TokenDataIter*)sqlite3_realloc(pIn, nByte); + + if( pNew==0 ){ + p->rc = SQLITE_NOMEM; + }else{ + if( pIn==0 ) memset(pNew, 0, nByte); + pRet = pNew; + pNew->nIterAlloc = nAlloc; + } + } + } + if( p->rc ){ + sqlite3Fts5IterClose((Fts5IndexIter*)pAppend); + }else{ + pRet->apIter[pRet->nIter++] = pAppend; + } + assert( pRet==0 || pRet->nIter<=pRet->nIterAlloc ); + + return pRet; +} + +/* +** Delete an Fts5TokenDataIter structure and its contents. +*/ +static void fts5TokendataIterDelete(Fts5TokenDataIter *pSet){ + if( pSet ){ + int ii; + for(ii=0; iinIter; ii++){ + fts5MultiIterFree(pSet->apIter[ii]); + } + sqlite3_free(pSet->aPoslistReader); + sqlite3_free(pSet->aMap); + sqlite3_free(pSet); + } +} + +/* +** Append a mapping to the token-map belonging to object pT. +*/ +static void fts5TokendataIterAppendMap( + Fts5Index *p, + Fts5TokenDataIter *pT, + int iIter, + i64 iRowid, + i64 iPos +){ + if( p->rc==SQLITE_OK ){ + if( pT->nMap==pT->nMapAlloc ){ + int nNew = pT->nMapAlloc ? pT->nMapAlloc*2 : 64; + int nByte = nNew * sizeof(Fts5TokenDataMap); + Fts5TokenDataMap *aNew; + + aNew = (Fts5TokenDataMap*)sqlite3_realloc(pT->aMap, nByte); + if( aNew==0 ){ + p->rc = SQLITE_NOMEM; + return; + } + + pT->aMap = aNew; + pT->nMapAlloc = nNew; + } + + pT->aMap[pT->nMap].iRowid = iRowid; + pT->aMap[pT->nMap].iPos = iPos; + pT->aMap[pT->nMap].iIter = iIter; + pT->nMap++; + } +} + +/* +** The iterator passed as the only argument must be a tokendata=1 iterator +** (pIter->pTokenDataIter!=0). This function sets the iterator output +** variables (pIter->base.*) according to the contents of the current +** row. +*/ +static void fts5IterSetOutputsTokendata(Fts5Iter *pIter){ + int ii; + int nHit = 0; + i64 iRowid = SMALLEST_INT64; + int iMin = 0; + + Fts5TokenDataIter *pT = pIter->pTokenDataIter; + + pIter->base.nData = 0; + pIter->base.pData = 0; + + for(ii=0; iinIter; ii++){ + Fts5Iter *p = pT->apIter[ii]; + if( p->base.bEof==0 ){ + if( nHit==0 || p->base.iRowidbase.iRowid; + nHit = 1; + pIter->base.pData = p->base.pData; + pIter->base.nData = p->base.nData; + iMin = ii; + }else if( p->base.iRowid==iRowid ){ + nHit++; + } + } + } + + if( nHit==0 ){ + pIter->base.bEof = 1; + }else{ + int eDetail = pIter->pIndex->pConfig->eDetail; + pIter->base.bEof = 0; + pIter->base.iRowid = iRowid; + + if( nHit==1 && eDetail==FTS5_DETAIL_FULL ){ + fts5TokendataIterAppendMap(pIter->pIndex, pT, iMin, iRowid, -1); + }else + if( nHit>1 && eDetail!=FTS5_DETAIL_NONE ){ + int nReader = 0; + int nByte = 0; + i64 iPrev = 0; + + /* Allocate array of iterators if they are not already allocated. */ + if( pT->aPoslistReader==0 ){ + pT->aPoslistReader = (Fts5PoslistReader*)sqlite3Fts5MallocZero( + &pIter->pIndex->rc, + pT->nIter * (sizeof(Fts5PoslistReader) + sizeof(int)) + ); + if( pT->aPoslistReader==0 ) return; + pT->aPoslistToIter = (int*)&pT->aPoslistReader[pT->nIter]; + } + + /* Populate an iterator for each poslist that will be merged */ + for(ii=0; iinIter; ii++){ + Fts5Iter *p = pT->apIter[ii]; + if( iRowid==p->base.iRowid ){ + pT->aPoslistToIter[nReader] = ii; + sqlite3Fts5PoslistReaderInit( + p->base.pData, p->base.nData, &pT->aPoslistReader[nReader++] + ); + nByte += p->base.nData; + } + } + + /* Ensure the output buffer is large enough */ + if( fts5BufferGrow(&pIter->pIndex->rc, &pIter->poslist, nByte+nHit*10) ){ + return; + } + + /* Ensure the token-mapping is large enough */ + if( eDetail==FTS5_DETAIL_FULL && pT->nMapAlloc<(pT->nMap + nByte) ){ + int nNew = (pT->nMapAlloc + nByte) * 2; + Fts5TokenDataMap *aNew = (Fts5TokenDataMap*)sqlite3_realloc( + pT->aMap, nNew*sizeof(Fts5TokenDataMap) + ); + if( aNew==0 ){ + pIter->pIndex->rc = SQLITE_NOMEM; + return; + } + pT->aMap = aNew; + pT->nMapAlloc = nNew; + } + + pIter->poslist.n = 0; + + while( 1 ){ + i64 iMinPos = LARGEST_INT64; + + /* Find smallest position */ + iMin = 0; + for(ii=0; iiaPoslistReader[ii]; + if( pReader->bEof==0 ){ + if( pReader->iPosiPos; + iMin = ii; + } + } + } + + /* If all readers were at EOF, break out of the loop. */ + if( iMinPos==LARGEST_INT64 ) break; + + sqlite3Fts5PoslistSafeAppend(&pIter->poslist, &iPrev, iMinPos); + sqlite3Fts5PoslistReaderNext(&pT->aPoslistReader[iMin]); + + if( eDetail==FTS5_DETAIL_FULL ){ + pT->aMap[pT->nMap].iPos = iMinPos; + pT->aMap[pT->nMap].iIter = pT->aPoslistToIter[iMin]; + pT->aMap[pT->nMap].iRowid = iRowid; + pT->nMap++; + } + } + + pIter->base.pData = pIter->poslist.p; + pIter->base.nData = pIter->poslist.n; + } + } +} + +/* +** The iterator passed as the only argument must be a tokendata=1 iterator +** (pIter->pTokenDataIter!=0). This function advances the iterator. If +** argument bFrom is false, then the iterator is advanced to the next +** entry. Or, if bFrom is true, it is advanced to the first entry with +** a rowid of iFrom or greater. +*/ +static void fts5TokendataIterNext(Fts5Iter *pIter, int bFrom, i64 iFrom){ + int ii; + Fts5TokenDataIter *pT = pIter->pTokenDataIter; + Fts5Index *pIndex = pIter->pIndex; + + for(ii=0; iinIter; ii++){ + Fts5Iter *p = pT->apIter[ii]; + if( p->base.bEof==0 + && (p->base.iRowid==pIter->base.iRowid || (bFrom && p->base.iRowidbase.bEof==0 + && p->base.iRowidrc==SQLITE_OK + ){ + fts5MultiIterNext(pIndex, p, 0, 0); + } + } + } + + if( pIndex->rc==SQLITE_OK ){ + fts5IterSetOutputsTokendata(pIter); + } +} + +/* +** If the segment-iterator passed as the first argument is at EOF, then +** set pIter->term to a copy of buffer pTerm. +*/ +static void fts5TokendataSetTermIfEof(Fts5Iter *pIter, Fts5Buffer *pTerm){ + if( pIter && pIter->aSeg[0].pLeaf==0 ){ + fts5BufferSet(&pIter->pIndex->rc, &pIter->aSeg[0].term, pTerm->n, pTerm->p); + } +} + +/* +** This function sets up an iterator to use for a non-prefix query on a +** tokendata=1 table. +*/ +static Fts5Iter *fts5SetupTokendataIter( + Fts5Index *p, /* FTS index to query */ + const u8 *pToken, /* Buffer containing query term */ + int nToken, /* Size of buffer pToken in bytes */ + Fts5Colset *pColset /* Colset to filter on */ +){ + Fts5Iter *pRet = 0; + Fts5TokenDataIter *pSet = 0; + Fts5Structure *pStruct = 0; + const int flags = FTS5INDEX_QUERY_SCANONETERM | FTS5INDEX_QUERY_SCAN; + + Fts5Buffer bSeek = {0, 0, 0}; + Fts5Buffer *pSmall = 0; + + fts5IndexFlush(p); + pStruct = fts5StructureRead(p); + + while( p->rc==SQLITE_OK ){ + Fts5Iter *pPrev = pSet ? pSet->apIter[pSet->nIter-1] : 0; + Fts5Iter *pNew = 0; + Fts5SegIter *pNewIter = 0; + Fts5SegIter *pPrevIter = 0; + + int iLvl, iSeg, ii; + + pNew = fts5MultiIterAlloc(p, pStruct->nSegment); + if( pSmall ){ + fts5BufferSet(&p->rc, &bSeek, pSmall->n, pSmall->p); + fts5BufferAppendBlob(&p->rc, &bSeek, 1, (const u8*)"\0"); + }else{ + fts5BufferSet(&p->rc, &bSeek, nToken, pToken); + } + if( p->rc ){ + sqlite3Fts5IterClose((Fts5IndexIter*)pNew); + break; + } + + pNewIter = &pNew->aSeg[0]; + pPrevIter = (pPrev ? &pPrev->aSeg[0] : 0); + for(iLvl=0; iLvlnLevel; iLvl++){ + for(iSeg=pStruct->aLevel[iLvl].nSeg-1; iSeg>=0; iSeg--){ + Fts5StructureSegment *pSeg = &pStruct->aLevel[iLvl].aSeg[iSeg]; + int bDone = 0; + + if( pPrevIter ){ + if( fts5BufferCompare(pSmall, &pPrevIter->term) ){ + memcpy(pNewIter, pPrevIter, sizeof(Fts5SegIter)); + memset(pPrevIter, 0, sizeof(Fts5SegIter)); + bDone = 1; + }else if( pPrevIter->iEndofDoclist>pPrevIter->pLeaf->szLeaf ){ + fts5SegIterNextInit(p,(const char*)bSeek.p,bSeek.n-1,pSeg,pNewIter); + bDone = 1; + } + } + + if( bDone==0 ){ + fts5SegIterSeekInit(p, bSeek.p, bSeek.n, flags, pSeg, pNewIter); + } + + if( pPrevIter ){ + if( pPrevIter->pTombArray ){ + pNewIter->pTombArray = pPrevIter->pTombArray; + pNewIter->pTombArray->nRef++; + } + }else{ + fts5SegIterAllocTombstone(p, pNewIter); + } + + pNewIter++; + if( pPrevIter ) pPrevIter++; + if( p->rc ) break; + } + } + fts5TokendataSetTermIfEof(pPrev, pSmall); + + pNew->bSkipEmpty = 1; + pNew->pColset = pColset; + fts5IterSetOutputCb(&p->rc, pNew); + + /* Loop through all segments in the new iterator. Find the smallest + ** term that any segment-iterator points to. Iterator pNew will be + ** used for this term. Also, set any iterator that points to a term that + ** does not match pToken/nToken to point to EOF */ + pSmall = 0; + for(ii=0; iinSeg; ii++){ + Fts5SegIter *pII = &pNew->aSeg[ii]; + if( 0==fts5IsTokendataPrefix(&pII->term, pToken, nToken) ){ + fts5SegIterSetEOF(pII); + } + if( pII->pLeaf && (!pSmall || fts5BufferCompare(pSmall, &pII->term)>0) ){ + pSmall = &pII->term; + } + } + + /* If pSmall is still NULL at this point, then the new iterator does + ** not point to any terms that match the query. So delete it and break + ** out of the loop - all required iterators have been collected. */ + if( pSmall==0 ){ + sqlite3Fts5IterClose((Fts5IndexIter*)pNew); + break; + } + + /* Append this iterator to the set and continue. */ + pSet = fts5AppendTokendataIter(p, pSet, pNew); + } + + if( p->rc==SQLITE_OK && pSet ){ + int ii; + for(ii=0; iinIter; ii++){ + Fts5Iter *pIter = pSet->apIter[ii]; + int iSeg; + for(iSeg=0; iSegnSeg; iSeg++){ + pIter->aSeg[iSeg].flags |= FTS5_SEGITER_ONETERM; + } + fts5MultiIterFinishSetup(p, pIter); + } + } + + if( p->rc==SQLITE_OK ){ + pRet = fts5MultiIterAlloc(p, 0); + } + if( pRet ){ + pRet->pTokenDataIter = pSet; + if( pSet ){ + fts5IterSetOutputsTokendata(pRet); + }else{ + pRet->base.bEof = 1; + } + }else{ + fts5TokendataIterDelete(pSet); + } + + fts5StructureRelease(pStruct); + fts5BufferFree(&bSeek); + return pRet; +} + + /* ** Open a new iterator to iterate though all rowid that match the ** specified token or token prefix. @@ -236216,8 +249318,13 @@ static int sqlite3Fts5IndexQuery( if( sqlite3Fts5BufferSize(&p->rc, &buf, nToken+1)==0 ){ int iIdx = 0; /* Index to search */ int iPrefixIdx = 0; /* +1 prefix index */ + int bTokendata = pConfig->bTokendata; if( nToken>0 ) memcpy(&buf.p[1], pToken, nToken); + if( flags & (FTS5INDEX_QUERY_NOTOKENDATA|FTS5INDEX_QUERY_SCAN) ){ + bTokendata = 0; + } + /* Figure out which index to search and set iIdx accordingly. If this ** is a prefix query for which there is no prefix index, set iIdx to ** greater than pConfig->nPrefix to indicate that the query will be @@ -236243,7 +249350,10 @@ static int sqlite3Fts5IndexQuery( } } - if( iIdx<=pConfig->nPrefix ){ + if( bTokendata && iIdx==0 ){ + buf.p[0] = '0'; + pRet = fts5SetupTokendataIter(p, buf.p, nToken+1, pColset); + }else if( iIdx<=pConfig->nPrefix ){ /* Straight index lookup */ Fts5Structure *pStruct = fts5StructureRead(p); buf.p[0] = (u8)(FTS5_MAIN_PREFIX + iIdx); @@ -236290,7 +249400,11 @@ static int sqlite3Fts5IndexQuery( static int sqlite3Fts5IterNext(Fts5IndexIter *pIndexIter){ Fts5Iter *pIter = (Fts5Iter*)pIndexIter; assert( pIter->pIndex->rc==SQLITE_OK ); - fts5MultiIterNext(pIter->pIndex, pIter, 0, 0); + if( pIter->pTokenDataIter ){ + fts5TokendataIterNext(pIter, 0, 0); + }else{ + fts5MultiIterNext(pIter->pIndex, pIter, 0, 0); + } return fts5IndexReturn(pIter->pIndex); } @@ -236323,7 +249437,11 @@ static int sqlite3Fts5IterNextScan(Fts5IndexIter *pIndexIter){ */ static int sqlite3Fts5IterNextFrom(Fts5IndexIter *pIndexIter, i64 iMatch){ Fts5Iter *pIter = (Fts5Iter*)pIndexIter; - fts5MultiIterNextFrom(pIter->pIndex, pIter, iMatch); + if( pIter->pTokenDataIter ){ + fts5TokendataIterNext(pIter, 1, iMatch); + }else{ + fts5MultiIterNextFrom(pIter->pIndex, pIter, iMatch); + } return fts5IndexReturn(pIter->pIndex); } @@ -236338,6 +249456,99 @@ static const char *sqlite3Fts5IterTerm(Fts5IndexIter *pIndexIter, int *pn){ return (z ? &z[1] : 0); } +/* +** This is used by xInstToken() to access the token at offset iOff, column +** iCol of row iRowid. The token is returned via output variables *ppOut +** and *pnOut. The iterator passed as the first argument must be a tokendata=1 +** iterator (pIter->pTokenDataIter!=0). +*/ +static int sqlite3Fts5IterToken( + Fts5IndexIter *pIndexIter, + i64 iRowid, + int iCol, + int iOff, + const char **ppOut, int *pnOut +){ + Fts5Iter *pIter = (Fts5Iter*)pIndexIter; + Fts5TokenDataIter *pT = pIter->pTokenDataIter; + Fts5TokenDataMap *aMap = pT->aMap; + i64 iPos = (((i64)iCol)<<32) + iOff; + + int i1 = 0; + int i2 = pT->nMap; + int iTest = 0; + + while( i2>i1 ){ + iTest = (i1 + i2) / 2; + + if( aMap[iTest].iRowidiRowid ){ + i2 = iTest; + }else{ + if( aMap[iTest].iPosiPos ){ + i2 = iTest; + }else{ + break; + } + } + } + + if( i2>i1 ){ + Fts5Iter *pMap = pT->apIter[aMap[iTest].iIter]; + *ppOut = (const char*)pMap->aSeg[0].term.p+1; + *pnOut = pMap->aSeg[0].term.n-1; + } + + return SQLITE_OK; +} + +/* +** Clear any existing entries from the token-map associated with the +** iterator passed as the only argument. +*/ +static void sqlite3Fts5IndexIterClearTokendata(Fts5IndexIter *pIndexIter){ + Fts5Iter *pIter = (Fts5Iter*)pIndexIter; + if( pIter && pIter->pTokenDataIter ){ + pIter->pTokenDataIter->nMap = 0; + } +} + +/* +** Set a token-mapping for the iterator passed as the first argument. This +** is used in detail=column or detail=none mode when a token is requested +** using the xInstToken() API. In this case the caller tokenizers the +** current row and configures the token-mapping via multiple calls to this +** function. +*/ +static int sqlite3Fts5IndexIterWriteTokendata( + Fts5IndexIter *pIndexIter, + const char *pToken, int nToken, + i64 iRowid, int iCol, int iOff +){ + Fts5Iter *pIter = (Fts5Iter*)pIndexIter; + Fts5TokenDataIter *pT = pIter->pTokenDataIter; + Fts5Index *p = pIter->pIndex; + int ii; + + assert( p->pConfig->eDetail!=FTS5_DETAIL_FULL ); + assert( pIter->pTokenDataIter ); + + for(ii=0; iinIter; ii++){ + Fts5Buffer *pTerm = &pT->apIter[ii]->aSeg[0].term; + if( nToken==pTerm->n-1 && memcmp(pToken, pTerm->p+1, nToken)==0 ) break; + } + if( iinIter ){ + fts5TokendataIterAppendMap(p, pT, ii, iRowid, (((i64)iCol)<<32) + iOff); + } + return fts5IndexReturn(p); +} + /* ** Close an iterator opened by an earlier call to sqlite3Fts5IndexQuery(). */ @@ -236345,6 +249556,7 @@ static void sqlite3Fts5IterClose(Fts5IndexIter *pIndexIter){ if( pIndexIter ){ Fts5Iter *pIter = (Fts5Iter*)pIndexIter; Fts5Index *pIndex = pIter->pIndex; + fts5TokendataIterDelete(pIter->pTokenDataIter); fts5MultiIterFree(pIter); sqlite3Fts5IndexCloseReader(pIndex); } @@ -236428,6 +249640,347 @@ static int sqlite3Fts5IndexLoadConfig(Fts5Index *p){ return fts5IndexReturn(p); } +/* +** Retrieve the origin value that will be used for the segment currently +** being accumulated in the in-memory hash table when it is flushed to +** disk. If successful, SQLITE_OK is returned and (*piOrigin) set to +** the queried value. Or, if an error occurs, an error code is returned +** and the final value of (*piOrigin) is undefined. +*/ +static int sqlite3Fts5IndexGetOrigin(Fts5Index *p, i64 *piOrigin){ + Fts5Structure *pStruct; + pStruct = fts5StructureRead(p); + if( pStruct ){ + *piOrigin = pStruct->nOriginCntr; + fts5StructureRelease(pStruct); + } + return fts5IndexReturn(p); +} + +/* +** Buffer pPg contains a page of a tombstone hash table - one of nPg pages +** associated with the same segment. This function adds rowid iRowid to +** the hash table. The caller is required to guarantee that there is at +** least one free slot on the page. +** +** If parameter bForce is false and the hash table is deemed to be full +** (more than half of the slots are occupied), then non-zero is returned +** and iRowid not inserted. Or, if bForce is true or if the hash table page +** is not full, iRowid is inserted and zero returned. +*/ +static int fts5IndexTombstoneAddToPage( + Fts5Data *pPg, + int bForce, + int nPg, + u64 iRowid +){ + const int szKey = TOMBSTONE_KEYSIZE(pPg); + const int nSlot = TOMBSTONE_NSLOT(pPg); + const int nElem = fts5GetU32(&pPg->p[4]); + int iSlot = (iRowid / nPg) % nSlot; + int nCollide = nSlot; + + if( szKey==4 && iRowid>0xFFFFFFFF ) return 2; + if( iRowid==0 ){ + pPg->p[1] = 0x01; + return 0; + } + + if( bForce==0 && nElem>=(nSlot/2) ){ + return 1; + } + + fts5PutU32(&pPg->p[4], nElem+1); + if( szKey==4 ){ + u32 *aSlot = (u32*)&pPg->p[8]; + while( aSlot[iSlot] ){ + iSlot = (iSlot + 1) % nSlot; + if( nCollide--==0 ) return 0; + } + fts5PutU32((u8*)&aSlot[iSlot], (u32)iRowid); + }else{ + u64 *aSlot = (u64*)&pPg->p[8]; + while( aSlot[iSlot] ){ + iSlot = (iSlot + 1) % nSlot; + if( nCollide--==0 ) return 0; + } + fts5PutU64((u8*)&aSlot[iSlot], iRowid); + } + + return 0; +} + +/* +** This function attempts to build a new hash containing all the keys +** currently in the tombstone hash table for segment pSeg. The new +** hash will be stored in the nOut buffers passed in array apOut[]. +** All pages of the new hash use key-size szKey (4 or 8). +** +** Return 0 if the hash is successfully rebuilt into the nOut pages. +** Or non-zero if it is not (because one page became overfull). In this +** case the caller should retry with a larger nOut parameter. +** +** Parameter pData1 is page iPg1 of the hash table being rebuilt. +*/ +static int fts5IndexTombstoneRehash( + Fts5Index *p, + Fts5StructureSegment *pSeg, /* Segment to rebuild hash of */ + Fts5Data *pData1, /* One page of current hash - or NULL */ + int iPg1, /* Which page of the current hash is pData1 */ + int szKey, /* 4 or 8, the keysize */ + int nOut, /* Number of output pages */ + Fts5Data **apOut /* Array of output hash pages */ +){ + int ii; + int res = 0; + + /* Initialize the headers of all the output pages */ + for(ii=0; iip[0] = szKey; + fts5PutU32(&apOut[ii]->p[4], 0); + } + + /* Loop through the current pages of the hash table. */ + for(ii=0; res==0 && iinPgTombstone; ii++){ + Fts5Data *pData = 0; /* Page ii of the current hash table */ + Fts5Data *pFree = 0; /* Free this at the end of the loop */ + + if( iPg1==ii ){ + pData = pData1; + }else{ + pFree = pData = fts5DataRead(p, FTS5_TOMBSTONE_ROWID(pSeg->iSegid, ii)); + } + + if( pData ){ + int szKeyIn = TOMBSTONE_KEYSIZE(pData); + int nSlotIn = (pData->nn - 8) / szKeyIn; + int iIn; + for(iIn=0; iInp[8]; + if( aSlot[iIn] ) iVal = fts5GetU32((u8*)&aSlot[iIn]); + }else{ + u64 *aSlot = (u64*)&pData->p[8]; + if( aSlot[iIn] ) iVal = fts5GetU64((u8*)&aSlot[iIn]); + } + + /* If iVal is not 0 at this point, insert it into the new hash table */ + if( iVal ){ + Fts5Data *pPg = apOut[(iVal % nOut)]; + res = fts5IndexTombstoneAddToPage(pPg, 0, nOut, iVal); + if( res ) break; + } + } + + /* If this is page 0 of the old hash, copy the rowid-0-flag from the + ** old hash to the new. */ + if( ii==0 ){ + apOut[0]->p[1] = pData->p[1]; + } + } + fts5DataRelease(pFree); + } + + return res; +} + +/* +** This is called to rebuild the hash table belonging to segment pSeg. +** If parameter pData1 is not NULL, then one page of the existing hash table +** has already been loaded - pData1, which is page iPg1. The key-size for +** the new hash table is szKey (4 or 8). +** +** If successful, the new hash table is not written to disk. Instead, +** output parameter (*pnOut) is set to the number of pages in the new +** hash table, and (*papOut) to point to an array of buffers containing +** the new page data. +** +** If an error occurs, an error code is left in the Fts5Index object and +** both output parameters set to 0 before returning. +*/ +static void fts5IndexTombstoneRebuild( + Fts5Index *p, + Fts5StructureSegment *pSeg, /* Segment to rebuild hash of */ + Fts5Data *pData1, /* One page of current hash - or NULL */ + int iPg1, /* Which page of the current hash is pData1 */ + int szKey, /* 4 or 8, the keysize */ + int *pnOut, /* OUT: Number of output pages */ + Fts5Data ***papOut /* OUT: Output hash pages */ +){ + const int MINSLOT = 32; + int nSlotPerPage = MAX(MINSLOT, (p->pConfig->pgsz - 8) / szKey); + int nSlot = 0; /* Number of slots in each output page */ + int nOut = 0; + + /* Figure out how many output pages (nOut) and how many slots per + ** page (nSlot). There are three possibilities: + ** + ** 1. The hash table does not yet exist. In this case the new hash + ** table will consist of a single page with MINSLOT slots. + ** + ** 2. The hash table exists but is currently a single page. In this + ** case an attempt is made to grow the page to accommodate the new + ** entry. The page is allowed to grow up to nSlotPerPage (see above) + ** slots. + ** + ** 3. The hash table already consists of more than one page, or of + ** a single page already so large that it cannot be grown. In this + ** case the new hash consists of (nPg*2+1) pages of nSlotPerPage + ** slots each, where nPg is the current number of pages in the + ** hash table. + */ + if( pSeg->nPgTombstone==0 ){ + /* Case 1. */ + nOut = 1; + nSlot = MINSLOT; + }else if( pSeg->nPgTombstone==1 ){ + /* Case 2. */ + int nElem = (int)fts5GetU32(&pData1->p[4]); + assert( pData1 && iPg1==0 ); + nOut = 1; + nSlot = MAX(nElem*4, MINSLOT); + if( nSlot>nSlotPerPage ) nOut = 0; + } + if( nOut==0 ){ + /* Case 3. */ + nOut = (pSeg->nPgTombstone * 2 + 1); + nSlot = nSlotPerPage; + } + + /* Allocate the required array and output pages */ + while( 1 ){ + int res = 0; + int ii = 0; + int szPage = 0; + Fts5Data **apOut = 0; + + /* Allocate space for the new hash table */ + assert( nSlot>=MINSLOT ); + apOut = (Fts5Data**)sqlite3Fts5MallocZero(&p->rc, sizeof(Fts5Data*) * nOut); + szPage = 8 + nSlot*szKey; + for(ii=0; iirc, + sizeof(Fts5Data)+szPage + ); + if( pNew ){ + pNew->nn = szPage; + pNew->p = (u8*)&pNew[1]; + apOut[ii] = pNew; + } + } + + /* Rebuild the hash table. */ + if( p->rc==SQLITE_OK ){ + res = fts5IndexTombstoneRehash(p, pSeg, pData1, iPg1, szKey, nOut, apOut); + } + if( res==0 ){ + if( p->rc ){ + fts5IndexFreeArray(apOut, nOut); + apOut = 0; + nOut = 0; + } + *pnOut = nOut; + *papOut = apOut; + break; + } + + /* If control flows to here, it was not possible to rebuild the hash + ** table. Free all buffers and then try again with more pages. */ + assert( p->rc==SQLITE_OK ); + fts5IndexFreeArray(apOut, nOut); + nSlot = nSlotPerPage; + nOut = nOut*2 + 1; + } +} + + +/* +** Add a tombstone for rowid iRowid to segment pSeg. +*/ +static void fts5IndexTombstoneAdd( + Fts5Index *p, + Fts5StructureSegment *pSeg, + u64 iRowid +){ + Fts5Data *pPg = 0; + int iPg = -1; + int szKey = 0; + int nHash = 0; + Fts5Data **apHash = 0; + + p->nContentlessDelete++; + + if( pSeg->nPgTombstone>0 ){ + iPg = iRowid % pSeg->nPgTombstone; + pPg = fts5DataRead(p, FTS5_TOMBSTONE_ROWID(pSeg->iSegid,iPg)); + if( pPg==0 ){ + assert( p->rc!=SQLITE_OK ); + return; + } + + if( 0==fts5IndexTombstoneAddToPage(pPg, 0, pSeg->nPgTombstone, iRowid) ){ + fts5DataWrite(p, FTS5_TOMBSTONE_ROWID(pSeg->iSegid,iPg), pPg->p, pPg->nn); + fts5DataRelease(pPg); + return; + } + } + + /* Have to rebuild the hash table. First figure out the key-size (4 or 8). */ + szKey = pPg ? TOMBSTONE_KEYSIZE(pPg) : 4; + if( iRowid>0xFFFFFFFF ) szKey = 8; + + /* Rebuild the hash table */ + fts5IndexTombstoneRebuild(p, pSeg, pPg, iPg, szKey, &nHash, &apHash); + assert( p->rc==SQLITE_OK || (nHash==0 && apHash==0) ); + + /* If all has succeeded, write the new rowid into one of the new hash + ** table pages, then write them all out to disk. */ + if( nHash ){ + int ii = 0; + fts5IndexTombstoneAddToPage(apHash[iRowid % nHash], 1, nHash, iRowid); + for(ii=0; iiiSegid, ii); + fts5DataWrite(p, iTombstoneRowid, apHash[ii]->p, apHash[ii]->nn); + } + pSeg->nPgTombstone = nHash; + fts5StructureWrite(p, p->pStruct); + } + + fts5DataRelease(pPg); + fts5IndexFreeArray(apHash, nHash); +} + +/* +** Add iRowid to the tombstone list of the segment or segments that contain +** rows from origin iOrigin. Return SQLITE_OK if successful, or an SQLite +** error code otherwise. +*/ +static int sqlite3Fts5IndexContentlessDelete(Fts5Index *p, i64 iOrigin, i64 iRowid){ + Fts5Structure *pStruct; + pStruct = fts5StructureRead(p); + if( pStruct ){ + int bFound = 0; /* True after pSeg->nEntryTombstone incr. */ + int iLvl; + for(iLvl=pStruct->nLevel-1; iLvl>=0; iLvl--){ + int iSeg; + for(iSeg=pStruct->aLevel[iLvl].nSeg-1; iSeg>=0; iSeg--){ + Fts5StructureSegment *pSeg = &pStruct->aLevel[iLvl].aSeg[iSeg]; + if( pSeg->iOrigin1<=(u64)iOrigin && pSeg->iOrigin2>=(u64)iOrigin ){ + if( bFound==0 ){ + pSeg->nEntryTombstone++; + bFound = 1; + } + fts5IndexTombstoneAdd(p, pSeg, iRowid); + } + } + } + fts5StructureRelease(pStruct); + } + return fts5IndexReturn(p); +} /************************************************************************* ************************************************************************** @@ -236511,7 +250064,9 @@ static int fts5QueryCksum( int eDetail = p->pConfig->eDetail; u64 cksum = *pCksum; Fts5IndexIter *pIter = 0; - int rc = sqlite3Fts5IndexQuery(p, z, n, flags, 0, &pIter); + int rc = sqlite3Fts5IndexQuery( + p, z, n, (flags | FTS5INDEX_QUERY_NOTOKENDATA), 0, &pIter + ); while( rc==SQLITE_OK && ALWAYS(pIter!=0) && 0==sqlite3Fts5IterEof(pIter) ){ i64 rowid = pIter->iRowid; @@ -236678,7 +250233,7 @@ static void fts5IndexIntegrityCheckEmpty( } static void fts5IntegrityCheckPgidx(Fts5Index *p, Fts5Data *pLeaf){ - int iTermOff = 0; + i64 iTermOff = 0; int ii; Fts5Buffer buf1 = {0,0,0}; @@ -236687,7 +250242,7 @@ static void fts5IntegrityCheckPgidx(Fts5Index *p, Fts5Data *pLeaf){ ii = pLeaf->szLeaf; while( iinn && p->rc==SQLITE_OK ){ int res; - int iOff; + i64 iOff; int nIncr; ii += fts5GetVarint32(&pLeaf->p[ii], nIncr); @@ -236732,6 +250287,7 @@ static void fts5IndexIntegrityCheckSegment( Fts5StructureSegment *pSeg /* Segment to check internal consistency */ ){ Fts5Config *pConfig = p->pConfig; + int bSecureDelete = (pConfig->iVersion==FTS5_CURRENT_VERSION_SECUREDELETE); sqlite3_stmt *pStmt = 0; int rc2; int iIdxPrevLeaf = pSeg->pgnoFirst-1; @@ -236767,7 +250323,19 @@ static void fts5IndexIntegrityCheckSegment( ** is also a rowid pointer within the leaf page header, it points to a ** location before the term. */ if( pLeaf->nn<=pLeaf->szLeaf ){ - p->rc = FTS5_CORRUPT; + + if( nIdxTerm==0 + && pConfig->iVersion==FTS5_CURRENT_VERSION_SECUREDELETE + && pLeaf->nn==pLeaf->szLeaf + && pLeaf->nn==4 + ){ + /* special case - the very first page in a segment keeps its %_idx + ** entry even if all the terms are removed from it by secure-delete + ** operations. */ + }else{ + p->rc = FTS5_CORRUPT; + } + }else{ int iOff; /* Offset of first term on leaf */ int iRowidOff; /* Offset of first rowid on leaf */ @@ -236831,9 +250399,12 @@ static void fts5IndexIntegrityCheckSegment( ASSERT_SZLEAF_OK(pLeaf); if( iRowidOff>=pLeaf->szLeaf ){ p->rc = FTS5_CORRUPT; - }else{ + }else if( bSecureDelete==0 || iRowidOff>0 ){ + i64 iDlRowid = fts5DlidxIterRowid(pDlidx); fts5GetVarint(&pLeaf->p[iRowidOff], (u64*)&iRowid); - if( iRowid!=fts5DlidxIterRowid(pDlidx) ) p->rc = FTS5_CORRUPT; + if( iRowidrc = FTS5_CORRUPT; + } } fts5DataRelease(pLeaf); } @@ -236963,13 +250534,14 @@ static int sqlite3Fts5IndexIntegrityCheck(Fts5Index *p, u64 cksum, int bUseCksum ** function only. */ -#ifdef SQLITE_TEST +#if defined(SQLITE_TEST) || defined(SQLITE_FTS5_DEBUG) /* ** Decode a segment-data rowid from the %_data table. This function is ** the opposite of macro FTS5_SEGMENT_ROWID(). */ static void fts5DecodeRowid( i64 iRowid, /* Rowid from %_data table */ + int *pbTombstone, /* OUT: Tombstone hash flag */ int *piSegid, /* OUT: Segment id */ int *pbDlidx, /* OUT: Dlidx flag */ int *piHeight, /* OUT: Height */ @@ -236985,13 +250557,16 @@ static void fts5DecodeRowid( iRowid >>= FTS5_DATA_DLI_B; *piSegid = (int)(iRowid & (((i64)1 << FTS5_DATA_ID_B) - 1)); + iRowid >>= FTS5_DATA_ID_B; + + *pbTombstone = (int)(iRowid & 0x0001); } -#endif /* SQLITE_TEST */ +#endif /* SQLITE_TEST || SQLITE_FTS5_DEBUG */ -#ifdef SQLITE_TEST +#if defined(SQLITE_TEST) || defined(SQLITE_FTS5_DEBUG) static void fts5DebugRowid(int *pRc, Fts5Buffer *pBuf, i64 iKey){ - int iSegid, iHeight, iPgno, bDlidx; /* Rowid compenents */ - fts5DecodeRowid(iKey, &iSegid, &bDlidx, &iHeight, &iPgno); + int iSegid, iHeight, iPgno, bDlidx, bTomb; /* Rowid compenents */ + fts5DecodeRowid(iKey, &bTomb, &iSegid, &bDlidx, &iHeight, &iPgno); if( iSegid==0 ){ if( iKey==FTS5_AVERAGES_ROWID ){ @@ -237001,14 +250576,16 @@ static void fts5DebugRowid(int *pRc, Fts5Buffer *pBuf, i64 iKey){ } } else{ - sqlite3Fts5BufferAppendPrintf(pRc, pBuf, "{%ssegid=%d h=%d pgno=%d}", - bDlidx ? "dlidx " : "", iSegid, iHeight, iPgno + sqlite3Fts5BufferAppendPrintf(pRc, pBuf, "{%s%ssegid=%d h=%d pgno=%d}", + bDlidx ? "dlidx " : "", + bTomb ? "tombstone " : "", + iSegid, iHeight, iPgno ); } } -#endif /* SQLITE_TEST */ +#endif /* SQLITE_TEST || SQLITE_FTS5_DEBUG */ -#ifdef SQLITE_TEST +#if defined(SQLITE_TEST) || defined(SQLITE_FTS5_DEBUG) static void fts5DebugStructure( int *pRc, /* IN/OUT: error code */ Fts5Buffer *pBuf, @@ -237023,16 +250600,22 @@ static void fts5DebugStructure( ); for(iSeg=0; iSegnSeg; iSeg++){ Fts5StructureSegment *pSeg = &pLvl->aSeg[iSeg]; - sqlite3Fts5BufferAppendPrintf(pRc, pBuf, " {id=%d leaves=%d..%d}", + sqlite3Fts5BufferAppendPrintf(pRc, pBuf, " {id=%d leaves=%d..%d", pSeg->iSegid, pSeg->pgnoFirst, pSeg->pgnoLast ); + if( pSeg->iOrigin1>0 ){ + sqlite3Fts5BufferAppendPrintf(pRc, pBuf, " origin=%lld..%lld", + pSeg->iOrigin1, pSeg->iOrigin2 + ); + } + sqlite3Fts5BufferAppendPrintf(pRc, pBuf, "}"); } sqlite3Fts5BufferAppendPrintf(pRc, pBuf, "}"); } } -#endif /* SQLITE_TEST */ +#endif /* SQLITE_TEST || SQLITE_FTS5_DEBUG */ -#ifdef SQLITE_TEST +#if defined(SQLITE_TEST) || defined(SQLITE_FTS5_DEBUG) /* ** This is part of the fts5_decode() debugging aid. ** @@ -237057,9 +250640,9 @@ static void fts5DecodeStructure( fts5DebugStructure(pRc, pBuf, p); fts5StructureRelease(p); } -#endif /* SQLITE_TEST */ +#endif /* SQLITE_TEST || SQLITE_FTS5_DEBUG */ -#ifdef SQLITE_TEST +#if defined(SQLITE_TEST) || defined(SQLITE_FTS5_DEBUG) /* ** This is part of the fts5_decode() debugging aid. ** @@ -237082,9 +250665,9 @@ static void fts5DecodeAverages( zSpace = " "; } } -#endif /* SQLITE_TEST */ +#endif /* SQLITE_TEST || SQLITE_FTS5_DEBUG */ -#ifdef SQLITE_TEST +#if defined(SQLITE_TEST) || defined(SQLITE_FTS5_DEBUG) /* ** Buffer (a/n) is assumed to contain a list of serialized varints. Read ** each varint and append its string representation to buffer pBuf. Return @@ -237101,9 +250684,9 @@ static int fts5DecodePoslist(int *pRc, Fts5Buffer *pBuf, const u8 *a, int n){ } return iOff; } -#endif /* SQLITE_TEST */ +#endif /* SQLITE_TEST || SQLITE_FTS5_DEBUG */ -#ifdef SQLITE_TEST +#if defined(SQLITE_TEST) || defined(SQLITE_FTS5_DEBUG) /* ** The start of buffer (a/n) contains the start of a doclist. The doclist ** may or may not finish within the buffer. This function appends a text @@ -237136,9 +250719,9 @@ static int fts5DecodeDoclist(int *pRc, Fts5Buffer *pBuf, const u8 *a, int n){ return iOff; } -#endif /* SQLITE_TEST */ +#endif /* SQLITE_TEST || SQLITE_FTS5_DEBUG */ -#ifdef SQLITE_TEST +#if defined(SQLITE_TEST) || defined(SQLITE_FTS5_DEBUG) /* ** This function is part of the fts5_decode() debugging function. It is ** only ever used with detail=none tables. @@ -237179,9 +250762,27 @@ static void fts5DecodeRowidList( sqlite3Fts5BufferAppendPrintf(pRc, pBuf, " %lld%s", iRowid, zApp); } } -#endif /* SQLITE_TEST */ +#endif /* SQLITE_TEST || SQLITE_FTS5_DEBUG */ -#ifdef SQLITE_TEST +#if defined(SQLITE_TEST) || defined(SQLITE_FTS5_DEBUG) +static void fts5BufferAppendTerm(int *pRc, Fts5Buffer *pBuf, Fts5Buffer *pTerm){ + int ii; + fts5BufferGrow(pRc, pBuf, pTerm->n*2 + 1); + if( *pRc==SQLITE_OK ){ + for(ii=0; iin; ii++){ + if( pTerm->p[ii]==0x00 ){ + pBuf->p[pBuf->n++] = '\\'; + pBuf->p[pBuf->n++] = '0'; + }else{ + pBuf->p[pBuf->n++] = pTerm->p[ii]; + } + } + pBuf->p[pBuf->n] = 0x00; + } +} +#endif /* SQLITE_TEST || SQLITE_FTS5_DEBUG */ + +#if defined(SQLITE_TEST) || defined(SQLITE_FTS5_DEBUG) /* ** The implementation of user-defined scalar function fts5_decode(). */ @@ -237192,6 +250793,7 @@ static void fts5DecodeFunction( ){ i64 iRowid; /* Rowid for record being decoded */ int iSegid,iHeight,iPgno,bDlidx;/* Rowid components */ + int bTomb; const u8 *aBlob; int n; /* Record to decode */ u8 *a = 0; Fts5Buffer s; /* Build up text to return here */ @@ -237214,7 +250816,7 @@ static void fts5DecodeFunction( if( a==0 ) goto decode_out; if( n>0 ) memcpy(a, aBlob, n); - fts5DecodeRowid(iRowid, &iSegid, &bDlidx, &iHeight, &iPgno); + fts5DecodeRowid(iRowid, &bTomb, &iSegid, &bDlidx, &iHeight, &iPgno); fts5DebugRowid(&rc, &s, iRowid); if( bDlidx ){ @@ -237233,6 +250835,28 @@ static void fts5DecodeFunction( " %d(%lld)", lvl.iLeafPgno, lvl.iRowid ); } + }else if( bTomb ){ + u32 nElem = fts5GetU32(&a[4]); + int szKey = (aBlob[0]==4 || aBlob[0]==8) ? aBlob[0] : 8; + int nSlot = (n - 8) / szKey; + int ii; + sqlite3Fts5BufferAppendPrintf(&rc, &s, " nElem=%d", (int)nElem); + if( aBlob[1] ){ + sqlite3Fts5BufferAppendPrintf(&rc, &s, " 0"); + } + for(ii=0; iiestimatedCost = (double)100; + pIdxInfo->estimatedRows = 100; + pIdxInfo->idxNum = 0; + for(i=0, p=pIdxInfo->aConstraint; inConstraint; i++, p++){ + if( p->usable==0 ) continue; + if( p->op==SQLITE_INDEX_CONSTRAINT_EQ && p->iColumn==11 ){ + rc = SQLITE_OK; + pIdxInfo->aConstraintUsage[i].omit = 1; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + break; + } + } + return rc; +} + +/* +** This method is the destructor for bytecodevtab objects. +*/ +static int fts5structDisconnectMethod(sqlite3_vtab *pVtab){ + Fts5StructVtab *p = (Fts5StructVtab*)pVtab; + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Constructor for a new bytecodevtab_cursor object. +*/ +static int fts5structOpenMethod(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCsr){ + int rc = SQLITE_OK; + Fts5StructVcsr *pNew = 0; + + pNew = sqlite3Fts5MallocZero(&rc, sizeof(*pNew)); + *ppCsr = (sqlite3_vtab_cursor*)pNew; + + return SQLITE_OK; +} + +/* +** Destructor for a bytecodevtab_cursor. +*/ +static int fts5structCloseMethod(sqlite3_vtab_cursor *cur){ + Fts5StructVcsr *pCsr = (Fts5StructVcsr*)cur; + fts5StructureRelease(pCsr->pStruct); + sqlite3_free(pCsr); + return SQLITE_OK; +} + + +/* +** Advance a bytecodevtab_cursor to its next row of output. +*/ +static int fts5structNextMethod(sqlite3_vtab_cursor *cur){ + Fts5StructVcsr *pCsr = (Fts5StructVcsr*)cur; + Fts5Structure *p = pCsr->pStruct; + + assert( pCsr->pStruct ); + pCsr->iSeg++; + pCsr->iRowid++; + while( pCsr->iLevelnLevel && pCsr->iSeg>=p->aLevel[pCsr->iLevel].nSeg ){ + pCsr->iLevel++; + pCsr->iSeg = 0; + } + if( pCsr->iLevel>=p->nLevel ){ + fts5StructureRelease(pCsr->pStruct); + pCsr->pStruct = 0; + } + return SQLITE_OK; +} + +/* +** Return TRUE if the cursor has been moved off of the last +** row of output. +*/ +static int fts5structEofMethod(sqlite3_vtab_cursor *cur){ + Fts5StructVcsr *pCsr = (Fts5StructVcsr*)cur; + return pCsr->pStruct==0; +} + +static int fts5structRowidMethod( + sqlite3_vtab_cursor *cur, + sqlite_int64 *piRowid +){ + Fts5StructVcsr *pCsr = (Fts5StructVcsr*)cur; + *piRowid = pCsr->iRowid; + return SQLITE_OK; +} + +/* +** Return values of columns for the row at which the bytecodevtab_cursor +** is currently pointing. +*/ +static int fts5structColumnMethod( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int i /* Which column to return */ +){ + Fts5StructVcsr *pCsr = (Fts5StructVcsr*)cur; + Fts5Structure *p = pCsr->pStruct; + Fts5StructureSegment *pSeg = &p->aLevel[pCsr->iLevel].aSeg[pCsr->iSeg]; + + switch( i ){ + case 0: /* level */ + sqlite3_result_int(ctx, pCsr->iLevel); + break; + case 1: /* segment */ + sqlite3_result_int(ctx, pCsr->iSeg); + break; + case 2: /* merge */ + sqlite3_result_int(ctx, pCsr->iSeg < p->aLevel[pCsr->iLevel].nMerge); + break; + case 3: /* segid */ + sqlite3_result_int(ctx, pSeg->iSegid); + break; + case 4: /* leaf1 */ + sqlite3_result_int(ctx, pSeg->pgnoFirst); + break; + case 5: /* leaf2 */ + sqlite3_result_int(ctx, pSeg->pgnoLast); + break; + case 6: /* origin1 */ + sqlite3_result_int64(ctx, pSeg->iOrigin1); + break; + case 7: /* origin2 */ + sqlite3_result_int64(ctx, pSeg->iOrigin2); + break; + case 8: /* npgtombstone */ + sqlite3_result_int(ctx, pSeg->nPgTombstone); + break; + case 9: /* nentrytombstone */ + sqlite3_result_int64(ctx, pSeg->nEntryTombstone); + break; + case 10: /* nentry */ + sqlite3_result_int64(ctx, pSeg->nEntry); + break; + } + return SQLITE_OK; +} + +/* +** Initialize a cursor. +** +** idxNum==0 means show all subprograms +** idxNum==1 means show only the main bytecode and omit subprograms. +*/ +static int fts5structFilterMethod( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + Fts5StructVcsr *pCsr = (Fts5StructVcsr *)pVtabCursor; + int rc = SQLITE_OK; + + const u8 *aBlob = 0; + int nBlob = 0; + + assert( argc==1 ); + fts5StructureRelease(pCsr->pStruct); + pCsr->pStruct = 0; + + nBlob = sqlite3_value_bytes(argv[0]); + aBlob = (const u8*)sqlite3_value_blob(argv[0]); + rc = fts5StructureDecode(aBlob, nBlob, 0, &pCsr->pStruct); + if( rc==SQLITE_OK ){ + pCsr->iLevel = 0; + pCsr->iRowid = 0; + pCsr->iSeg = -1; + rc = fts5structNextMethod(pVtabCursor); + } + + return rc; +} + +#endif /* SQLITE_TEST || SQLITE_FTS5_DEBUG */ /* ** This is called as part of registering the FTS5 module with database @@ -237437,7 +251290,7 @@ static void fts5RowidFunction( ** SQLite error code is returned instead. */ static int sqlite3Fts5IndexInit(sqlite3 *db){ -#ifdef SQLITE_TEST +#if defined(SQLITE_TEST) || defined(SQLITE_FTS5_DEBUG) int rc = sqlite3_create_function( db, "fts5_decode", 2, SQLITE_UTF8, 0, fts5DecodeFunction, 0, 0 ); @@ -237454,6 +251307,37 @@ static int sqlite3Fts5IndexInit(sqlite3 *db){ db, "fts5_rowid", -1, SQLITE_UTF8, 0, fts5RowidFunction, 0, 0 ); } + + if( rc==SQLITE_OK ){ + static const sqlite3_module fts5structure_module = { + 0, /* iVersion */ + 0, /* xCreate */ + fts5structConnectMethod, /* xConnect */ + fts5structBestIndexMethod, /* xBestIndex */ + fts5structDisconnectMethod, /* xDisconnect */ + 0, /* xDestroy */ + fts5structOpenMethod, /* xOpen */ + fts5structCloseMethod, /* xClose */ + fts5structFilterMethod, /* xFilter */ + fts5structNextMethod, /* xNext */ + fts5structEofMethod, /* xEof */ + fts5structColumnMethod, /* xColumn */ + fts5structRowidMethod, /* xRowid */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindFunction */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + 0, /* xShadowName */ + 0 /* xIntegrity */ + }; + rc = sqlite3_create_module(db, "fts5_structure", &fts5structure_module, 0); + } return rc; #else return SQLITE_OK; @@ -237555,8 +251439,17 @@ struct Fts5Global { Fts5TokenizerModule *pTok; /* First in list of all tokenizer modules */ Fts5TokenizerModule *pDfltTok; /* Default tokenizer module */ Fts5Cursor *pCsr; /* First in list of all open cursors */ + u32 aLocaleHdr[4]; }; +/* +** Size of header on fts5_locale() values. And macro to access a buffer +** containing a copy of the header from an Fts5Config pointer. +*/ +#define FTS5_LOCALE_HDR_SIZE ((int)sizeof( ((Fts5Global*)0)->aLocaleHdr )) +#define FTS5_LOCALE_HDR(pConfig) ((const u8*)(pConfig->pGlobal->aLocaleHdr)) + + /* ** Each auxiliary function registered with the FTS5 module is represented ** by an object of the following type. All such objects are stored as part @@ -237575,11 +251468,28 @@ struct Fts5Auxiliary { ** Each tokenizer module registered with the FTS5 module is represented ** by an object of the following type. All such objects are stored as part ** of the Fts5Global.pTok list. +** +** bV2Native: +** True if the tokenizer was registered using xCreateTokenizer_v2(), false +** for xCreateTokenizer(). If this variable is true, then x2 is populated +** with the routines as supplied by the caller and x1 contains synthesized +** wrapper routines. In this case the user-data pointer passed to +** x1.xCreate should be a pointer to the Fts5TokenizerModule structure, +** not a copy of pUserData. +** +** Of course, if bV2Native is false, then x1 contains the real routines and +** x2 the synthesized ones. In this case a pointer to the Fts5TokenizerModule +** object should be passed to x2.xCreate. +** +** The synthesized wrapper routines are necessary for xFindTokenizer(_v2) +** calls. */ struct Fts5TokenizerModule { char *zName; /* Name of tokenizer */ void *pUserData; /* User pointer passed to xCreate() */ - fts5_tokenizer x; /* Tokenizer functions */ + int bV2Native; /* True if v2 native tokenizer */ + fts5_tokenizer x1; /* Tokenizer functions */ + fts5_tokenizer_v2 x2; /* V2 tokenizer functions */ void (*xDestroy)(void*); /* Destructor function */ Fts5TokenizerModule *pNext; /* Next registered tokenizer module */ }; @@ -237589,6 +251499,8 @@ struct Fts5FullTable { Fts5Storage *pStorage; /* Document store */ Fts5Global *pGlobal; /* Global (connection wide) data */ Fts5Cursor *pSortCsr; /* Sort data from this cursor */ + int iSavepoint; /* Successful xSavepoint()+1 */ + #ifdef SQLITE_DEBUG struct Fts5TransactionState ts; #endif @@ -237665,7 +251577,7 @@ struct Fts5Cursor { Fts5Auxiliary *pAux; /* Currently executing extension function */ Fts5Auxdata *pAuxdata; /* First in linked list of saved aux-data */ - /* Cache used by auxiliary functions xInst() and xInstCount() */ + /* Cache used by auxiliary API functions xInst() and xInstCount() */ Fts5PoslistReader *aInstIter; /* One for each phrase */ int nInstAlloc; /* Size of aInst[] array (entries / 3) */ int nInstCount; /* Number of phrase instances */ @@ -237776,10 +251688,16 @@ static void fts5CheckTransactionState(Fts5FullTable *p, int op, int iSavepoint){ #endif /* -** Return true if pTab is a contentless table. +** Return true if pTab is a contentless table. If parameter bIncludeUnindexed +** is true, this includes contentless tables that store UNINDEXED columns +** only. */ -static int fts5IsContentless(Fts5FullTable *pTab){ - return pTab->p.pConfig->eContent==FTS5_CONTENT_NONE; +static int fts5IsContentless(Fts5FullTable *pTab, int bIncludeUnindexed){ + int eContent = pTab->p.pConfig->eContent; + return ( + eContent==FTS5_CONTENT_NONE + || (bIncludeUnindexed && eContent==FTS5_CONTENT_UNINDEXED) + ); } /* @@ -237847,8 +251765,12 @@ static int fts5InitVtab( assert( (rc==SQLITE_OK && *pzErr==0) || pConfig==0 ); } if( rc==SQLITE_OK ){ + pConfig->pzErrmsg = pzErr; pTab->p.pConfig = pConfig; pTab->pGlobal = pGlobal; + if( bCreate || sqlite3Fts5TokenizerPreload(&pConfig->t) ){ + rc = sqlite3Fts5LoadTokenizer(pConfig); + } } /* Open the index sub-system */ @@ -237870,13 +251792,17 @@ static int fts5InitVtab( /* Load the initial configuration */ if( rc==SQLITE_OK ){ - assert( pConfig->pzErrmsg==0 ); - pConfig->pzErrmsg = pzErr; - rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex); - sqlite3Fts5IndexRollback(pTab->p.pIndex); - pConfig->pzErrmsg = 0; + rc = sqlite3Fts5ConfigLoad(pTab->p.pConfig, pTab->p.pConfig->iCookie-1); } + if( rc==SQLITE_OK && pConfig->eContent==FTS5_CONTENT_NORMAL ){ + rc = sqlite3_vtab_config(db, SQLITE_VTAB_CONSTRAINT_SUPPORT, (int)1); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS); + } + + if( pConfig ) pConfig->pzErrmsg = 0; if( rc!=SQLITE_OK ){ fts5FreeVtab(pTab); pTab = 0; @@ -237944,10 +251870,10 @@ static int fts5UsePatternMatch( ){ assert( FTS5_PATTERN_GLOB==SQLITE_INDEX_CONSTRAINT_GLOB ); assert( FTS5_PATTERN_LIKE==SQLITE_INDEX_CONSTRAINT_LIKE ); - if( pConfig->ePattern==FTS5_PATTERN_GLOB && p->op==FTS5_PATTERN_GLOB ){ + if( pConfig->t.ePattern==FTS5_PATTERN_GLOB && p->op==FTS5_PATTERN_GLOB ){ return 1; } - if( pConfig->ePattern==FTS5_PATTERN_LIKE + if( pConfig->t.ePattern==FTS5_PATTERN_LIKE && (p->op==FTS5_PATTERN_LIKE || p->op==FTS5_PATTERN_GLOB) ){ return 1; @@ -237994,10 +251920,10 @@ static int fts5UsePatternMatch( ** This function ensures that there is at most one "r" or "=". And that if ** there exists an "=" then there is no "<" or ">". ** -** Costs are assigned as follows: +** If an unusable MATCH operator is present in the WHERE clause, then +** SQLITE_CONSTRAINT is returned. ** -** a) If an unusable MATCH operator is present in the WHERE clause, the -** cost is unconditionally set to 1e50 (a really big number). +** Costs are assigned as follows: ** ** a) If a MATCH operator is present, the cost depends on the other ** constraints also present. As follows: @@ -238030,7 +251956,7 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ int bSeenEq = 0; int bSeenGt = 0; int bSeenLt = 0; - int bSeenMatch = 0; + int nSeenMatch = 0; int bSeenRank = 0; @@ -238061,18 +251987,15 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ /* A MATCH operator or equivalent */ if( p->usable==0 || iCol<0 ){ /* As there exists an unusable MATCH constraint this is an - ** unusable plan. Set a prohibitively high cost. */ - pInfo->estimatedCost = 1e50; - assert( iIdxStr < pInfo->nConstraint*6 + 1 ); - idxStr[iIdxStr] = 0; - return SQLITE_OK; + ** unusable plan. Return SQLITE_CONSTRAINT. */ + return SQLITE_CONSTRAINT; }else{ if( iCol==nCol+1 ){ if( bSeenRank ) continue; idxStr[iIdxStr++] = 'r'; bSeenRank = 1; - }else if( iCol>=0 ){ - bSeenMatch = 1; + }else{ + nSeenMatch++; idxStr[iIdxStr++] = 'M'; sqlite3_snprintf(6, &idxStr[iIdxStr], "%d", iCol); idxStr += strlen(&idxStr[iIdxStr]); @@ -238089,6 +252012,7 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ idxStr += strlen(&idxStr[iIdxStr]); pInfo->aConstraintUsage[i].argvIndex = ++iCons; assert( idxStr[iIdxStr]=='\0' ); + nSeenMatch++; }else if( bSeenEq==0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ && iCol<0 ){ idxStr[iIdxStr++] = '='; bSeenEq = 1; @@ -238119,12 +252043,15 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ } idxStr[iIdxStr] = '\0'; - /* Set idxFlags flags for the ORDER BY clause */ + /* Set idxFlags flags for the ORDER BY clause + ** + ** Note that tokendata=1 tables cannot currently handle "ORDER BY rowid DESC". + */ if( pInfo->nOrderBy==1 ){ int iSort = pInfo->aOrderBy[0].iColumn; - if( iSort==(pConfig->nCol+1) && bSeenMatch ){ + if( iSort==(pConfig->nCol+1) && nSeenMatch>0 ){ idxFlags |= FTS5_BI_ORDER_RANK; - }else if( iSort==-1 ){ + }else if( iSort==-1 && (!pInfo->aOrderBy[0].desc || !pConfig->bTokendata) ){ idxFlags |= FTS5_BI_ORDER_ROWID; } if( BitFlagTest(idxFlags, FTS5_BI_ORDER_RANK|FTS5_BI_ORDER_ROWID) ){ @@ -238137,14 +252064,17 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ /* Calculate the estimated cost based on the flags set in idxFlags. */ if( bSeenEq ){ - pInfo->estimatedCost = bSeenMatch ? 100.0 : 10.0; - if( bSeenMatch==0 ) fts5SetUniqueFlag(pInfo); + pInfo->estimatedCost = nSeenMatch ? 1000.0 : 10.0; + if( nSeenMatch==0 ) fts5SetUniqueFlag(pInfo); }else if( bSeenLt && bSeenGt ){ - pInfo->estimatedCost = bSeenMatch ? 500.0 : 250000.0; + pInfo->estimatedCost = nSeenMatch ? 5000.0 : 250000.0; }else if( bSeenLt || bSeenGt ){ - pInfo->estimatedCost = bSeenMatch ? 750.0 : 750000.0; + pInfo->estimatedCost = nSeenMatch ? 7500.0 : 750000.0; }else{ - pInfo->estimatedCost = bSeenMatch ? 1000.0 : 1000000.0; + pInfo->estimatedCost = nSeenMatch ? 10000.0 : 1000000.0; + } + for(i=1; iestimatedCost *= 0.4; } pInfo->idxNum = idxFlags; @@ -238376,6 +252306,16 @@ static int fts5NextMethod(sqlite3_vtab_cursor *pCursor){ ); assert( !CsrFlagTest(pCsr, FTS5CSR_EOF) ); + /* If this cursor uses FTS5_PLAN_MATCH and this is a tokendata=1 table, + ** clear any token mappings accumulated at the fts5_index.c level. In + ** other cases, specifically FTS5_PLAN_SOURCE and FTS5_PLAN_SORTED_MATCH, + ** we need to retain the mappings for the entire query. */ + if( pCsr->ePlan==FTS5_PLAN_MATCH + && ((Fts5Table*)pCursor->pVtab)->pConfig->bTokendata + ){ + sqlite3Fts5ExprClearTokens(pCsr->pExpr); + } + if( pCsr->ePlan<3 ){ int bSkip = 0; if( (rc = fts5CursorReseek(pCsr, &bSkip)) || bSkip ) return rc; @@ -238410,6 +252350,7 @@ static int fts5NextMethod(sqlite3_vtab_cursor *pCursor){ } }else{ rc = SQLITE_OK; + CsrFlagSet(pCsr, FTS5CSR_REQUIRE_DOCSIZE); } break; } @@ -238439,7 +252380,7 @@ static int fts5PrepareStatement( rc = sqlite3_prepare_v3(pConfig->db, zSql, -1, SQLITE_PREPARE_PERSISTENT, &pRet, 0); if( rc!=SQLITE_OK ){ - *pConfig->pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(pConfig->db)); + sqlite3Fts5ConfigErrmsg(pConfig, "%s", sqlite3_errmsg(pConfig->db)); } sqlite3_free(zSql); } @@ -238663,6 +252604,145 @@ static i64 fts5GetRowidLimit(sqlite3_value *pVal, i64 iDefault){ return iDefault; } +/* +** Set the error message on the virtual table passed as the first argument. +*/ +static void fts5SetVtabError(Fts5FullTable *p, const char *zFormat, ...){ + va_list ap; /* ... printf arguments */ + va_start(ap, zFormat); + sqlite3_free(p->p.base.zErrMsg); + p->p.base.zErrMsg = sqlite3_vmprintf(zFormat, ap); + va_end(ap); +} + +/* +** Arrange for subsequent calls to sqlite3Fts5Tokenize() to use the locale +** specified by pLocale/nLocale. The buffer indicated by pLocale must remain +** valid until after the final call to sqlite3Fts5Tokenize() that will use +** the locale. +*/ +static void sqlite3Fts5SetLocale( + Fts5Config *pConfig, + const char *zLocale, + int nLocale +){ + Fts5TokenizerConfig *pT = &pConfig->t; + pT->pLocale = zLocale; + pT->nLocale = nLocale; +} + +/* +** Clear any locale configured by an earlier call to sqlite3Fts5SetLocale(). +*/ +static void sqlite3Fts5ClearLocale(Fts5Config *pConfig){ + sqlite3Fts5SetLocale(pConfig, 0, 0); +} + +/* +** Return true if the value passed as the only argument is an +** fts5_locale() value. +*/ +static int sqlite3Fts5IsLocaleValue(Fts5Config *pConfig, sqlite3_value *pVal){ + int ret = 0; + if( sqlite3_value_type(pVal)==SQLITE_BLOB ){ + /* Call sqlite3_value_bytes() after sqlite3_value_blob() in this case. + ** If the blob was created using zeroblob(), then sqlite3_value_blob() + ** may call malloc(). If this malloc() fails, then the values returned + ** by both value_blob() and value_bytes() will be 0. If value_bytes() were + ** called first, then the NULL pointer returned by value_blob() might + ** be dereferenced. */ + const u8 *pBlob = sqlite3_value_blob(pVal); + int nBlob = sqlite3_value_bytes(pVal); + if( nBlob>FTS5_LOCALE_HDR_SIZE + && 0==memcmp(pBlob, FTS5_LOCALE_HDR(pConfig), FTS5_LOCALE_HDR_SIZE) + ){ + ret = 1; + } + } + return ret; +} + +/* +** Value pVal is guaranteed to be an fts5_locale() value, according to +** sqlite3Fts5IsLocaleValue(). This function extracts the text and locale +** from the value and returns them separately. +** +** If successful, SQLITE_OK is returned and (*ppText) and (*ppLoc) set +** to point to buffers containing the text and locale, as utf-8, +** respectively. In this case output parameters (*pnText) and (*pnLoc) are +** set to the sizes in bytes of these two buffers. +** +** Or, if an error occurs, then an SQLite error code is returned. The final +** value of the four output parameters is undefined in this case. +*/ +static int sqlite3Fts5DecodeLocaleValue( + sqlite3_value *pVal, + const char **ppText, + int *pnText, + const char **ppLoc, + int *pnLoc +){ + const char *p = sqlite3_value_blob(pVal); + int n = sqlite3_value_bytes(pVal); + int nLoc = 0; + + assert( sqlite3_value_type(pVal)==SQLITE_BLOB ); + assert( n>FTS5_LOCALE_HDR_SIZE ); + + for(nLoc=FTS5_LOCALE_HDR_SIZE; p[nLoc]; nLoc++){ + if( nLoc==(n-1) ){ + return SQLITE_MISMATCH; + } + } + *ppLoc = &p[FTS5_LOCALE_HDR_SIZE]; + *pnLoc = nLoc - FTS5_LOCALE_HDR_SIZE; + + *ppText = &p[nLoc+1]; + *pnText = n - nLoc - 1; + return SQLITE_OK; +} + +/* +** Argument pVal is the text of a full-text search expression. It may or +** may not have been wrapped by fts5_locale(). This function extracts +** the text of the expression, and sets output variable (*pzText) to +** point to a nul-terminated buffer containing the expression. +** +** If pVal was an fts5_locale() value, then sqlite3Fts5SetLocale() is called +** to set the tokenizer to use the specified locale. +** +** If output variable (*pbFreeAndReset) is set to true, then the caller +** is required to (a) call sqlite3Fts5ClearLocale() to reset the tokenizer +** locale, and (b) call sqlite3_free() to free (*pzText). +*/ +static int fts5ExtractExprText( + Fts5Config *pConfig, /* Fts5 configuration */ + sqlite3_value *pVal, /* Value to extract expression text from */ + char **pzText, /* OUT: nul-terminated buffer of text */ + int *pbFreeAndReset /* OUT: Free (*pzText) and clear locale */ +){ + int rc = SQLITE_OK; + + if( sqlite3Fts5IsLocaleValue(pConfig, pVal) ){ + const char *pText = 0; + int nText = 0; + const char *pLoc = 0; + int nLoc = 0; + rc = sqlite3Fts5DecodeLocaleValue(pVal, &pText, &nText, &pLoc, &nLoc); + *pzText = sqlite3Fts5Mprintf(&rc, "%.*s", nText, pText); + if( rc==SQLITE_OK ){ + sqlite3Fts5SetLocale(pConfig, pLoc, nLoc); + } + *pbFreeAndReset = 1; + }else{ + *pzText = (char*)sqlite3_value_text(pVal); + *pbFreeAndReset = 0; + } + + return rc; +} + + /* ** This is the xFilter interface for the virtual table. See ** the virtual table xFilter method documentation for additional @@ -238697,13 +252777,7 @@ static int fts5FilterMethod( int iIdxStr = 0; Fts5Expr *pExpr = 0; - if( pConfig->bLock ){ - pTab->p.base.zErrMsg = sqlite3_mprintf( - "recursively defined fts5 content table" - ); - return SQLITE_ERROR; - } - + assert( pConfig->bLock==0 ); if( pCsr->ePlan ){ fts5FreeCursorComponents(pCsr); memset(&pCsr->ePlan, 0, sizeof(Fts5Cursor) - ((u8*)&pCsr->ePlan-(u8*)pCsr)); @@ -238727,8 +252801,14 @@ static int fts5FilterMethod( pRank = apVal[i]; break; case 'M': { - const char *zText = (const char*)sqlite3_value_text(apVal[i]); + char *zText = 0; + int bFreeAndReset = 0; + int bInternal = 0; + + rc = fts5ExtractExprText(pConfig, apVal[i], &zText, &bFreeAndReset); + if( rc!=SQLITE_OK ) goto filter_out; if( zText==0 ) zText = ""; + iCol = 0; do{ iCol = iCol*10 + (idxStr[iIdxStr]-'0'); @@ -238740,7 +252820,7 @@ static int fts5FilterMethod( ** indicates that the MATCH expression is not a full text query, ** but a request for an internal parameter. */ rc = fts5SpecialMatch(pTab, pCsr, &zText[1]); - goto filter_out; + bInternal = 1; }else{ char **pzErr = &pTab->p.base.zErrMsg; rc = sqlite3Fts5ExprNew(pConfig, 0, iCol, zText, &pExpr, pzErr); @@ -238748,9 +252828,15 @@ static int fts5FilterMethod( rc = sqlite3Fts5ExprAnd(&pCsr->pExpr, pExpr); pExpr = 0; } - if( rc!=SQLITE_OK ) goto filter_out; } + if( bFreeAndReset ){ + sqlite3_free(zText); + sqlite3Fts5ClearLocale(pConfig); + } + + if( bInternal || rc!=SQLITE_OK ) goto filter_out; + break; } case 'L': @@ -238801,6 +252887,9 @@ static int fts5FilterMethod( pCsr->iFirstRowid = fts5GetRowidLimit(pRowidGe, SMALLEST_INT64); } + rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex); + if( rc!=SQLITE_OK ) goto filter_out; + if( pTab->pSortCsr ){ /* If pSortCsr is non-NULL, then this call is being made as part of ** processing for a "... MATCH ORDER BY rank" query (ePlan is @@ -238823,6 +252912,7 @@ static int fts5FilterMethod( pCsr->pExpr = pTab->pSortCsr->pExpr; rc = fts5CursorFirst(pTab, pCsr, bDesc); }else if( pCsr->pExpr ){ + assert( rc==SQLITE_OK ); rc = fts5CursorParseRank(pConfig, pCsr, pRank); if( rc==SQLITE_OK ){ if( bOrderByRank ){ @@ -238834,9 +252924,7 @@ static int fts5FilterMethod( } } }else if( pConfig->zContent==0 ){ - *pConfig->pzErrmsg = sqlite3_mprintf( - "%s: table does not support scanning", pConfig->zName - ); + fts5SetVtabError(pTab,"%s: table does not support scanning",pConfig->zName); rc = SQLITE_ERROR; }else{ /* This is either a full-table scan (ePlan==FTS5_PLAN_SCAN) or a lookup @@ -238879,9 +252967,13 @@ static i64 fts5CursorRowid(Fts5Cursor *pCsr){ assert( pCsr->ePlan==FTS5_PLAN_MATCH || pCsr->ePlan==FTS5_PLAN_SORTED_MATCH || pCsr->ePlan==FTS5_PLAN_SOURCE + || pCsr->ePlan==FTS5_PLAN_SCAN + || pCsr->ePlan==FTS5_PLAN_ROWID ); if( pCsr->pSorter ){ return pCsr->pSorter->iRowid; + }else if( pCsr->ePlan>=FTS5_PLAN_SCAN ){ + return sqlite3_column_int64(pCsr->pStmt, 0); }else{ return sqlite3Fts5ExprRowid(pCsr->pExpr); } @@ -238898,25 +252990,16 @@ static int fts5RowidMethod(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ int ePlan = pCsr->ePlan; assert( CsrFlagTest(pCsr, FTS5CSR_EOF)==0 ); - switch( ePlan ){ - case FTS5_PLAN_SPECIAL: - *pRowid = 0; - break; - - case FTS5_PLAN_SOURCE: - case FTS5_PLAN_MATCH: - case FTS5_PLAN_SORTED_MATCH: - *pRowid = fts5CursorRowid(pCsr); - break; - - default: - *pRowid = sqlite3_column_int64(pCsr->pStmt, 0); - break; + if( ePlan==FTS5_PLAN_SPECIAL ){ + *pRowid = 0; + }else{ + *pRowid = fts5CursorRowid(pCsr); } return SQLITE_OK; } + /* ** If the cursor requires seeking (bSeekRequired flag is set), seek it. ** Return SQLITE_OK if no error occurs, or an SQLite error code otherwise. @@ -238953,8 +253036,13 @@ static int fts5SeekCursor(Fts5Cursor *pCsr, int bErrormsg){ rc = sqlite3_reset(pCsr->pStmt); if( rc==SQLITE_OK ){ rc = FTS5_CORRUPT; + fts5SetVtabError((Fts5FullTable*)pTab, + "fts5: missing row %lld from content table %s", + fts5CursorRowid(pCsr), + pTab->pConfig->zContent + ); }else if( pTab->pConfig->pzErrmsg ){ - *pTab->pConfig->pzErrmsg = sqlite3_mprintf( + fts5SetVtabError((Fts5FullTable*)pTab, "%s", sqlite3_errmsg(pTab->pConfig->db) ); } @@ -238963,14 +253051,6 @@ static int fts5SeekCursor(Fts5Cursor *pCsr, int bErrormsg){ return rc; } -static void fts5SetVtabError(Fts5FullTable *p, const char *zFormat, ...){ - va_list ap; /* ... printf arguments */ - va_start(ap, zFormat); - assert( p->p.base.zErrMsg==0 ); - p->p.base.zErrMsg = sqlite3_vmprintf(zFormat, ap); - va_end(ap); -} - /* ** This function is called to handle an FTS INSERT command. In other words, ** an INSERT statement of the form: @@ -238994,6 +253074,7 @@ static int fts5SpecialInsert( Fts5Config *pConfig = pTab->p.pConfig; int rc = SQLITE_OK; int bError = 0; + int bLoadConfig = 0; if( 0==sqlite3_stricmp("delete-all", zCmd) ){ if( pConfig->eContent==FTS5_CONTENT_NORMAL ){ @@ -239005,8 +253086,9 @@ static int fts5SpecialInsert( }else{ rc = sqlite3Fts5StorageDeleteAll(pTab->pStorage); } + bLoadConfig = 1; }else if( 0==sqlite3_stricmp("rebuild", zCmd) ){ - if( pConfig->eContent==FTS5_CONTENT_NONE ){ + if( fts5IsContentless(pTab, 1) ){ fts5SetVtabError(pTab, "'rebuild' may not be used with a contentless fts5 table" ); @@ -239014,6 +253096,7 @@ static int fts5SpecialInsert( }else{ rc = sqlite3Fts5StorageRebuild(pTab->pStorage); } + bLoadConfig = 1; }else if( 0==sqlite3_stricmp("optimize", zCmd) ){ rc = sqlite3Fts5StorageOptimize(pTab->pStorage); }else if( 0==sqlite3_stricmp("merge", zCmd) ){ @@ -239026,8 +253109,13 @@ static int fts5SpecialInsert( }else if( 0==sqlite3_stricmp("prefix-index", zCmd) ){ pConfig->bPrefixIndex = sqlite3_value_int(pVal); #endif + }else if( 0==sqlite3_stricmp("flush", zCmd) ){ + rc = sqlite3Fts5FlushToDisk(&pTab->p); }else{ - rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex); + rc = sqlite3Fts5FlushToDisk(&pTab->p); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex); + } if( rc==SQLITE_OK ){ rc = sqlite3Fts5ConfigSetValue(pTab->p.pConfig, zCmd, pVal, &bError); } @@ -239039,6 +253127,12 @@ static int fts5SpecialInsert( } } } + + if( rc==SQLITE_OK && bLoadConfig ){ + pTab->p.pConfig->iCookie--; + rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex); + } + return rc; } @@ -239050,7 +253144,7 @@ static int fts5SpecialDelete( int eType1 = sqlite3_value_type(apVal[1]); if( eType1==SQLITE_INTEGER ){ sqlite3_int64 iDel = sqlite3_value_int64(apVal[1]); - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iDel, &apVal[2]); + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iDel, &apVal[2], 0); } return rc; } @@ -239063,7 +253157,7 @@ static void fts5StorageInsert( ){ int rc = *pRc; if( rc==SQLITE_OK ){ - rc = sqlite3Fts5StorageContentInsert(pTab->pStorage, apVal, piRowid); + rc = sqlite3Fts5StorageContentInsert(pTab->pStorage, 0, apVal, piRowid); } if( rc==SQLITE_OK ){ rc = sqlite3Fts5StorageIndexInsert(pTab->pStorage, apVal, *piRowid); @@ -239071,6 +253165,67 @@ static void fts5StorageInsert( *pRc = rc; } +/* +** +** This function is called when the user attempts an UPDATE on a contentless +** table. Parameter bRowidModified is true if the UPDATE statement modifies +** the rowid value. Parameter apVal[] contains the new values for each user +** defined column of the fts5 table. pConfig is the configuration object of the +** table being updated (guaranteed to be contentless). The contentless_delete=1 +** and contentless_unindexed=1 options may or may not be set. +** +** This function returns SQLITE_OK if the UPDATE can go ahead, or an SQLite +** error code if it cannot. In this case an error message is also loaded into +** pConfig. Output parameter (*pbContent) is set to true if the caller should +** update the %_content table only - not the FTS index or any other shadow +** table. This occurs when an UPDATE modifies only UNINDEXED columns of the +** table. +** +** An UPDATE may proceed if: +** +** * The only columns modified are UNINDEXED columns, or +** +** * The contentless_delete=1 option was specified and all of the indexed +** columns (not a subset) have been modified. +*/ +static int fts5ContentlessUpdate( + Fts5Config *pConfig, + sqlite3_value **apVal, + int bRowidModified, + int *pbContent +){ + int ii; + int bSeenIndex = 0; /* Have seen modified indexed column */ + int bSeenIndexNC = 0; /* Have seen unmodified indexed column */ + int rc = SQLITE_OK; + + for(ii=0; iinCol; ii++){ + if( pConfig->abUnindexed[ii]==0 ){ + if( sqlite3_value_nochange(apVal[ii]) ){ + bSeenIndexNC++; + }else{ + bSeenIndex++; + } + } + } + + if( bSeenIndex==0 && bRowidModified==0 ){ + *pbContent = 1; + }else{ + if( bSeenIndexNC || pConfig->bContentlessDelete==0 ){ + rc = SQLITE_ERROR; + sqlite3Fts5ConfigErrmsg(pConfig, + (pConfig->bContentlessDelete ? + "%s a subset of columns on fts5 contentless-delete table: %s" : + "%s contentless fts5 table: %s") + , "cannot UPDATE", pConfig->zName + ); + } + } + + return rc; +} + /* ** This function is the implementation of the xUpdate callback used by ** FTS3 virtual tables. It is invoked by SQLite each time a row is to be @@ -239095,6 +253250,7 @@ static int fts5UpdateMethod( Fts5Config *pConfig = pTab->p.pConfig; int eType0; /* value_type() of apVal[0] */ int rc = SQLITE_OK; /* Return code */ + int bUpdateOrDelete = 0; /* A transaction must be open when this is called. */ assert( pTab->ts.eState==1 || pTab->ts.eState==2 ); @@ -239105,6 +253261,11 @@ static int fts5UpdateMethod( || sqlite3_value_type(apVal[0])==SQLITE_NULL ); assert( pTab->p.pConfig->pzErrmsg==0 ); + if( pConfig->pgsz==0 ){ + rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex); + if( rc!=SQLITE_OK ) return rc; + } + pTab->p.pConfig->pzErrmsg = &pTab->p.base.zErrMsg; /* Put any active cursors into REQUIRE_SEEK state. */ @@ -239119,7 +253280,15 @@ static int fts5UpdateMethod( if( pConfig->eContent!=FTS5_CONTENT_NORMAL && 0==sqlite3_stricmp("delete", z) ){ - rc = fts5SpecialDelete(pTab, apVal); + if( pConfig->bContentlessDelete ){ + fts5SetVtabError(pTab, + "'delete' may not be used with a contentless_delete=1 table" + ); + rc = SQLITE_ERROR; + }else{ + rc = fts5SpecialDelete(pTab, apVal); + bUpdateOrDelete = 1; + } }else{ rc = fts5SpecialInsert(pTab, z, apVal[2 + pConfig->nCol + 1]); } @@ -239136,74 +253305,128 @@ static int fts5UpdateMethod( ** Cases 3 and 4 may violate the rowid constraint. */ int eConflict = SQLITE_ABORT; - if( pConfig->eContent==FTS5_CONTENT_NORMAL ){ + if( pConfig->eContent==FTS5_CONTENT_NORMAL || pConfig->bContentlessDelete ){ eConflict = sqlite3_vtab_on_conflict(pConfig->db); } assert( eType0==SQLITE_INTEGER || eType0==SQLITE_NULL ); assert( nArg!=1 || eType0==SQLITE_INTEGER ); - /* Filter out attempts to run UPDATE or DELETE on contentless tables. - ** This is not suported. */ - if( eType0==SQLITE_INTEGER && fts5IsContentless(pTab) ){ - pTab->p.base.zErrMsg = sqlite3_mprintf( - "cannot %s contentless fts5 table: %s", - (nArg>1 ? "UPDATE" : "DELETE from"), pConfig->zName - ); - rc = SQLITE_ERROR; - } - /* DELETE */ - else if( nArg==1 ){ - i64 iDel = sqlite3_value_int64(apVal[0]); /* Rowid to delete */ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iDel, 0); + if( nArg==1 ){ + /* It is only possible to DELETE from a contentless table if the + ** contentless_delete=1 flag is set. */ + if( fts5IsContentless(pTab, 1) && pConfig->bContentlessDelete==0 ){ + fts5SetVtabError(pTab, + "cannot DELETE from contentless fts5 table: %s", pConfig->zName + ); + rc = SQLITE_ERROR; + }else{ + i64 iDel = sqlite3_value_int64(apVal[0]); /* Rowid to delete */ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iDel, 0, 0); + bUpdateOrDelete = 1; + } } /* INSERT or UPDATE */ else{ int eType1 = sqlite3_value_numeric_type(apVal[1]); - if( eType1!=SQLITE_INTEGER && eType1!=SQLITE_NULL ){ - rc = SQLITE_MISMATCH; + /* It is an error to write an fts5_locale() value to a table without + ** the locale=1 option. */ + if( pConfig->bLocale==0 ){ + int ii; + for(ii=0; iinCol; ii++){ + sqlite3_value *pVal = apVal[ii+2]; + if( sqlite3Fts5IsLocaleValue(pConfig, pVal) ){ + fts5SetVtabError(pTab, "fts5_locale() requires locale=1"); + rc = SQLITE_MISMATCH; + goto update_out; + } + } } - else if( eType0!=SQLITE_INTEGER ){ - /* If this is a REPLACE, first remove the current entry (if any) */ + if( eType0!=SQLITE_INTEGER ){ + /* An INSERT statement. If the conflict-mode is REPLACE, first remove + ** the current entry (if any). */ if( eConflict==SQLITE_REPLACE && eType1==SQLITE_INTEGER ){ i64 iNew = sqlite3_value_int64(apVal[1]); /* Rowid to delete */ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0, 0); + bUpdateOrDelete = 1; } fts5StorageInsert(&rc, pTab, apVal, pRowid); } /* UPDATE */ else{ + Fts5Storage *pStorage = pTab->pStorage; i64 iOld = sqlite3_value_int64(apVal[0]); /* Old rowid */ i64 iNew = sqlite3_value_int64(apVal[1]); /* New rowid */ - if( eType1==SQLITE_INTEGER && iOld!=iNew ){ + int bContent = 0; /* Content only update */ + + /* If this is a contentless table (including contentless_unindexed=1 + ** tables), check if the UPDATE may proceed. */ + if( fts5IsContentless(pTab, 1) ){ + rc = fts5ContentlessUpdate(pConfig, &apVal[2], iOld!=iNew, &bContent); + if( rc!=SQLITE_OK ) goto update_out; + } + + if( eType1!=SQLITE_INTEGER ){ + rc = SQLITE_MISMATCH; + }else if( iOld!=iNew ){ + assert( bContent==0 ); if( eConflict==SQLITE_REPLACE ){ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + rc = sqlite3Fts5StorageDelete(pStorage, iOld, 0, 1); if( rc==SQLITE_OK ){ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); + rc = sqlite3Fts5StorageDelete(pStorage, iNew, 0, 0); } fts5StorageInsert(&rc, pTab, apVal, pRowid); }else{ - rc = sqlite3Fts5StorageContentInsert(pTab->pStorage, apVal, pRowid); + rc = sqlite3Fts5StorageFindDeleteRow(pStorage, iOld); if( rc==SQLITE_OK ){ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + rc = sqlite3Fts5StorageContentInsert(pStorage, 0, apVal, pRowid); } if( rc==SQLITE_OK ){ - rc = sqlite3Fts5StorageIndexInsert(pTab->pStorage, apVal,*pRowid); + rc = sqlite3Fts5StorageDelete(pStorage, iOld, 0, 0); } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageIndexInsert(pStorage, apVal, *pRowid); + } + } + }else if( bContent ){ + /* This occurs when an UPDATE on a contentless table affects *only* + ** UNINDEXED columns. This is a no-op for contentless_unindexed=0 + ** tables, or a write to the %_content table only for =1 tables. */ + assert( fts5IsContentless(pTab, 1) ); + rc = sqlite3Fts5StorageFindDeleteRow(pStorage, iOld); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageContentInsert(pStorage, 1, apVal, pRowid); } }else{ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + rc = sqlite3Fts5StorageDelete(pStorage, iOld, 0, 1); fts5StorageInsert(&rc, pTab, apVal, pRowid); } + bUpdateOrDelete = 1; + sqlite3Fts5StorageReleaseDeleteRow(pStorage); } + + } + } + + if( rc==SQLITE_OK + && bUpdateOrDelete + && pConfig->bSecureDelete + && pConfig->iVersion==FTS5_CURRENT_VERSION + ){ + rc = sqlite3Fts5StorageConfigValue( + pTab->pStorage, "version", 0, FTS5_CURRENT_VERSION_SECUREDELETE + ); + if( rc==SQLITE_OK ){ + pConfig->iVersion = FTS5_CURRENT_VERSION_SECUREDELETE; } } + update_out: pTab->p.pConfig->pzErrmsg = 0; return rc; } @@ -239216,8 +253439,7 @@ static int fts5SyncMethod(sqlite3_vtab *pVtab){ Fts5FullTable *pTab = (Fts5FullTable*)pVtab; fts5CheckTransactionState(pTab, FTS5_SYNC, 0); pTab->p.pConfig->pzErrmsg = &pTab->p.base.zErrMsg; - fts5TripCursors(pTab); - rc = sqlite3Fts5StorageSync(pTab->pStorage); + rc = sqlite3Fts5FlushToDisk(&pTab->p); pTab->p.pConfig->pzErrmsg = 0; return rc; } @@ -239226,9 +253448,11 @@ static int fts5SyncMethod(sqlite3_vtab *pVtab){ ** Implementation of xBegin() method. */ static int fts5BeginMethod(sqlite3_vtab *pVtab){ - fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_BEGIN, 0); - fts5NewTransaction((Fts5FullTable*)pVtab); - return SQLITE_OK; + int rc = fts5NewTransaction((Fts5FullTable*)pVtab); + if( rc==SQLITE_OK ){ + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_BEGIN, 0); + } + return rc; } /* @@ -239282,17 +253506,40 @@ static int fts5ApiRowCount(Fts5Context *pCtx, i64 *pnRow){ return sqlite3Fts5StorageRowCount(pTab->pStorage, pnRow); } -static int fts5ApiTokenize( +/* +** Implementation of xTokenize_v2() API. +*/ +static int fts5ApiTokenize_v2( Fts5Context *pCtx, const char *pText, int nText, + const char *pLoc, int nLoc, void *pUserData, int (*xToken)(void*, int, const char*, int, int, int) ){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); - return sqlite3Fts5Tokenize( - pTab->pConfig, FTS5_TOKENIZE_AUX, pText, nText, pUserData, xToken + int rc = SQLITE_OK; + + sqlite3Fts5SetLocale(pTab->pConfig, pLoc, nLoc); + rc = sqlite3Fts5Tokenize(pTab->pConfig, + FTS5_TOKENIZE_AUX, pText, nText, pUserData, xToken ); + sqlite3Fts5SetLocale(pTab->pConfig, 0, 0); + + return rc; +} + +/* +** Implementation of xTokenize() API. This is just xTokenize_v2() with NULL/0 +** passed as the locale. +*/ +static int fts5ApiTokenize( + Fts5Context *pCtx, + const char *pText, int nText, + void *pUserData, + int (*xToken)(void*, int, const char*, int, int, int) +){ + return fts5ApiTokenize_v2(pCtx, pText, nText, 0, 0, pUserData, xToken); } static int fts5ApiPhraseCount(Fts5Context *pCtx){ @@ -239305,6 +253552,49 @@ static int fts5ApiPhraseSize(Fts5Context *pCtx, int iPhrase){ return sqlite3Fts5ExprPhraseSize(pCsr->pExpr, iPhrase); } +/* +** Argument pStmt is an SQL statement of the type used by Fts5Cursor. This +** function extracts the text value of column iCol of the current row. +** Additionally, if there is an associated locale, it invokes +** sqlite3Fts5SetLocale() to configure the tokenizer. In all cases the caller +** should invoke sqlite3Fts5ClearLocale() to clear the locale at some point +** after this function returns. +** +** If successful, (*ppText) is set to point to a buffer containing the text +** value as utf-8 and SQLITE_OK returned. (*pnText) is set to the size of that +** buffer in bytes. It is not guaranteed to be nul-terminated. If an error +** occurs, an SQLite error code is returned. The final values of the two +** output parameters are undefined in this case. +*/ +static int fts5TextFromStmt( + Fts5Config *pConfig, + sqlite3_stmt *pStmt, + int iCol, + const char **ppText, + int *pnText +){ + sqlite3_value *pVal = sqlite3_column_value(pStmt, iCol+1); + const char *pLoc = 0; + int nLoc = 0; + int rc = SQLITE_OK; + + if( pConfig->bLocale + && pConfig->eContent==FTS5_CONTENT_EXTERNAL + && sqlite3Fts5IsLocaleValue(pConfig, pVal) + ){ + rc = sqlite3Fts5DecodeLocaleValue(pVal, ppText, pnText, &pLoc, &nLoc); + }else{ + *ppText = (const char*)sqlite3_value_text(pVal); + *pnText = sqlite3_value_bytes(pVal); + if( pConfig->bLocale && pConfig->eContent==FTS5_CONTENT_NORMAL ){ + pLoc = (const char*)sqlite3_column_text(pStmt, iCol+1+pConfig->nCol); + nLoc = sqlite3_column_bytes(pStmt, iCol+1+pConfig->nCol); + } + } + sqlite3Fts5SetLocale(pConfig, pLoc, nLoc); + return rc; +} + static int fts5ApiColumnText( Fts5Context *pCtx, int iCol, @@ -239313,46 +253603,69 @@ static int fts5ApiColumnText( ){ int rc = SQLITE_OK; Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - if( fts5IsContentless((Fts5FullTable*)(pCsr->base.pVtab)) - || pCsr->ePlan==FTS5_PLAN_SPECIAL - ){ + Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + + assert( pCsr->ePlan!=FTS5_PLAN_SPECIAL ); + if( iCol<0 || iCol>=pTab->pConfig->nCol ){ + rc = SQLITE_RANGE; + }else if( fts5IsContentless((Fts5FullTable*)(pCsr->base.pVtab), 0) ){ *pz = 0; *pn = 0; }else{ rc = fts5SeekCursor(pCsr, 0); if( rc==SQLITE_OK ){ - *pz = (const char*)sqlite3_column_text(pCsr->pStmt, iCol+1); - *pn = sqlite3_column_bytes(pCsr->pStmt, iCol+1); + rc = fts5TextFromStmt(pTab->pConfig, pCsr->pStmt, iCol, pz, pn); + sqlite3Fts5ClearLocale(pTab->pConfig); } } return rc; } +/* +** This is called by various API functions - xInst, xPhraseFirst, +** xPhraseFirstColumn etc. - to obtain the position list for phrase iPhrase +** of the current row. This function works for both detail=full tables (in +** which case the position-list was read from the fts index) or for other +** detail= modes if the row content is available. +*/ static int fts5CsrPoslist( - Fts5Cursor *pCsr, - int iPhrase, - const u8 **pa, - int *pn + Fts5Cursor *pCsr, /* Fts5 cursor object */ + int iPhrase, /* Phrase to find position list for */ + const u8 **pa, /* OUT: Pointer to position list buffer */ + int *pn /* OUT: Size of (*pa) in bytes */ ){ Fts5Config *pConfig = ((Fts5Table*)(pCsr->base.pVtab))->pConfig; int rc = SQLITE_OK; int bLive = (pCsr->pSorter==0); - if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_POSLIST) ){ - + if( iPhrase<0 || iPhrase>=sqlite3Fts5ExprPhraseCount(pCsr->pExpr) ){ + rc = SQLITE_RANGE; + }else if( pConfig->eDetail!=FTS5_DETAIL_FULL + && fts5IsContentless((Fts5FullTable*)pCsr->base.pVtab, 1) + ){ + *pa = 0; + *pn = 0; + return SQLITE_OK; + }else if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_POSLIST) ){ if( pConfig->eDetail!=FTS5_DETAIL_FULL ){ Fts5PoslistPopulator *aPopulator; int i; + aPopulator = sqlite3Fts5ExprClearPoslists(pCsr->pExpr, bLive); if( aPopulator==0 ) rc = SQLITE_NOMEM; + if( rc==SQLITE_OK ){ + rc = fts5SeekCursor(pCsr, 0); + } for(i=0; inCol && rc==SQLITE_OK; i++){ - int n; const char *z; - rc = fts5ApiColumnText((Fts5Context*)pCsr, i, &z, &n); + const char *z = 0; + int n = 0; + rc = fts5TextFromStmt(pConfig, pCsr->pStmt, i, &z, &n); if( rc==SQLITE_OK ){ rc = sqlite3Fts5ExprPopulatePoslists( pConfig, pCsr->pExpr, aPopulator, i, z, n ); } + sqlite3Fts5ClearLocale(pConfig); } sqlite3_free(aPopulator); @@ -239363,13 +253676,18 @@ static int fts5CsrPoslist( CsrFlagClear(pCsr, FTS5CSR_REQUIRE_POSLIST); } - if( pCsr->pSorter && pConfig->eDetail==FTS5_DETAIL_FULL ){ - Fts5Sorter *pSorter = pCsr->pSorter; - int i1 = (iPhrase==0 ? 0 : pSorter->aIdx[iPhrase-1]); - *pn = pSorter->aIdx[iPhrase] - i1; - *pa = &pSorter->aPoslist[i1]; + if( rc==SQLITE_OK ){ + if( pCsr->pSorter && pConfig->eDetail==FTS5_DETAIL_FULL ){ + Fts5Sorter *pSorter = pCsr->pSorter; + int i1 = (iPhrase==0 ? 0 : pSorter->aIdx[iPhrase-1]); + *pn = pSorter->aIdx[iPhrase] - i1; + *pa = &pSorter->aPoslist[i1]; + }else{ + *pn = sqlite3Fts5ExprPoslist(pCsr->pExpr, iPhrase, pa); + } }else{ - *pn = sqlite3Fts5ExprPoslist(pCsr->pExpr, iPhrase, pa); + *pa = 0; + *pn = 0; } return rc; @@ -239440,7 +253758,8 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ aInst[0] = iBest; aInst[1] = FTS5_POS2COLUMN(aIter[iBest].iPos); aInst[2] = FTS5_POS2OFFSET(aIter[iBest].iPos); - if( aInst[1]<0 || aInst[1]>=nCol ){ + assert( aInst[1]>=0 ); + if( aInst[1]>=nCol ){ rc = FTS5_CORRUPT; break; } @@ -239478,12 +253797,6 @@ static int fts5ApiInst( ){ if( iIdx<0 || iIdx>=pCsr->nInstCount ){ rc = SQLITE_RANGE; -#if 0 - }else if( fts5IsOffsetless((Fts5Table*)pCsr->base.pVtab) ){ - *piPhrase = pCsr->aInst[iIdx*3]; - *piCol = pCsr->aInst[iIdx*3 + 2]; - *piOff = -1; -#endif }else{ *piPhrase = pCsr->aInst[iIdx*3]; *piCol = pCsr->aInst[iIdx*3 + 1]; @@ -239524,7 +253837,7 @@ static int fts5ApiColumnSize(Fts5Context *pCtx, int iCol, int *pnToken){ if( pConfig->bColumnsize ){ i64 iRowid = fts5CursorRowid(pCsr); rc = sqlite3Fts5StorageDocsize(pTab->pStorage, iRowid, pCsr->aColumnSize); - }else if( pConfig->zContent==0 ){ + }else if( !pConfig->zContent || pConfig->eContent==FTS5_CONTENT_UNINDEXED ){ int i; for(i=0; inCol; i++){ if( pConfig->abUnindexed[i]==0 ){ @@ -239533,17 +253846,19 @@ static int fts5ApiColumnSize(Fts5Context *pCtx, int iCol, int *pnToken){ } }else{ int i; + rc = fts5SeekCursor(pCsr, 0); for(i=0; rc==SQLITE_OK && inCol; i++){ if( pConfig->abUnindexed[i]==0 ){ - const char *z; int n; - void *p = (void*)(&pCsr->aColumnSize[i]); + const char *z = 0; + int n = 0; pCsr->aColumnSize[i] = 0; - rc = fts5ApiColumnText(pCtx, i, &z, &n); + rc = fts5TextFromStmt(pConfig, pCsr->pStmt, i, &z, &n); if( rc==SQLITE_OK ){ - rc = sqlite3Fts5Tokenize( - pConfig, FTS5_TOKENIZE_AUX, z, n, p, fts5ColumnSizeCb + rc = sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_AUX, + z, n, (void*)&pCsr->aColumnSize[i], fts5ColumnSizeCb ); } + sqlite3Fts5ClearLocale(pConfig); } } } @@ -239623,11 +253938,10 @@ static void *fts5ApiGetAuxdata(Fts5Context *pCtx, int bClear){ } static void fts5ApiPhraseNext( - Fts5Context *pUnused, + Fts5Context *pCtx, Fts5PhraseIter *pIter, int *piCol, int *piOff ){ - UNUSED_PARAM(pUnused); if( pIter->a>=pIter->b ){ *piCol = -1; *piOff = -1; @@ -239635,8 +253949,12 @@ static void fts5ApiPhraseNext( int iVal; pIter->a += fts5GetVarint32(pIter->a, iVal); if( iVal==1 ){ + /* Avoid returning a (*piCol) value that is too large for the table, + ** even if the position-list is corrupt. The caller might not be + ** expecting it. */ + int nCol = ((Fts5Table*)(((Fts5Cursor*)pCtx)->base.pVtab))->pConfig->nCol; pIter->a += fts5GetVarint32(pIter->a, iVal); - *piCol = iVal; + *piCol = (iVal>=nCol ? nCol-1 : iVal); *piOff = 0; pIter->a += fts5GetVarint32(pIter->a, iVal); } @@ -239738,13 +254056,96 @@ static int fts5ApiPhraseFirstColumn( return rc; } +/* +** xQueryToken() API implemenetation. +*/ +static int fts5ApiQueryToken( + Fts5Context* pCtx, + int iPhrase, + int iToken, + const char **ppOut, + int *pnOut +){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + return sqlite3Fts5ExprQueryToken(pCsr->pExpr, iPhrase, iToken, ppOut, pnOut); +} + +/* +** xInstToken() API implemenetation. +*/ +static int fts5ApiInstToken( + Fts5Context *pCtx, + int iIdx, + int iToken, + const char **ppOut, int *pnOut +){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + int rc = SQLITE_OK; + if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_INST)==0 + || SQLITE_OK==(rc = fts5CacheInstArray(pCsr)) + ){ + if( iIdx<0 || iIdx>=pCsr->nInstCount ){ + rc = SQLITE_RANGE; + }else{ + int iPhrase = pCsr->aInst[iIdx*3]; + int iCol = pCsr->aInst[iIdx*3 + 1]; + int iOff = pCsr->aInst[iIdx*3 + 2]; + i64 iRowid = fts5CursorRowid(pCsr); + rc = sqlite3Fts5ExprInstToken( + pCsr->pExpr, iRowid, iPhrase, iCol, iOff, iToken, ppOut, pnOut + ); + } + } + return rc; +} + static int fts5ApiQueryPhrase(Fts5Context*, int, void*, int(*)(const Fts5ExtensionApi*, Fts5Context*, void*) ); +/* +** The xColumnLocale() API. +*/ +static int fts5ApiColumnLocale( + Fts5Context *pCtx, + int iCol, + const char **pzLocale, + int *pnLocale +){ + int rc = SQLITE_OK; + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + Fts5Config *pConfig = ((Fts5Table*)(pCsr->base.pVtab))->pConfig; + + *pzLocale = 0; + *pnLocale = 0; + + assert( pCsr->ePlan!=FTS5_PLAN_SPECIAL ); + if( iCol<0 || iCol>=pConfig->nCol ){ + rc = SQLITE_RANGE; + }else if( + pConfig->abUnindexed[iCol]==0 + && 0==fts5IsContentless((Fts5FullTable*)pCsr->base.pVtab, 1) + && pConfig->bLocale + ){ + rc = fts5SeekCursor(pCsr, 0); + if( rc==SQLITE_OK ){ + const char *zDummy = 0; + int nDummy = 0; + rc = fts5TextFromStmt(pConfig, pCsr->pStmt, iCol, &zDummy, &nDummy); + if( rc==SQLITE_OK ){ + *pzLocale = pConfig->t.pLocale; + *pnLocale = pConfig->t.nLocale; + } + sqlite3Fts5ClearLocale(pConfig); + } + } + + return rc; +} + static const Fts5ExtensionApi sFts5Api = { - 2, /* iVersion */ + 4, /* iVersion */ fts5ApiUserData, fts5ApiColumnCount, fts5ApiRowCount, @@ -239764,6 +254165,10 @@ static const Fts5ExtensionApi sFts5Api = { fts5ApiPhraseNext, fts5ApiPhraseFirstColumn, fts5ApiPhraseNextColumn, + fts5ApiQueryToken, + fts5ApiInstToken, + fts5ApiColumnLocale, + fts5ApiTokenize_v2 }; /* @@ -239814,6 +254219,7 @@ static void fts5ApiInvoke( sqlite3_value **argv ){ assert( pCsr->pAux==0 ); + assert( pCsr->ePlan!=FTS5_PLAN_SPECIAL ); pCsr->pAux = pAux; pAux->xFunc(&sFts5Api, (Fts5Context*)pCsr, context, argc, argv); pCsr->pAux = 0; @@ -239827,6 +254233,21 @@ static Fts5Cursor *fts5CursorFromCsrid(Fts5Global *pGlobal, i64 iCsrId){ return pCsr; } +/* +** Parameter zFmt is a printf() style formatting string. This function +** formats it using the trailing arguments and returns the result as +** an error message to the context passed as the first argument. +*/ +static void fts5ResultError(sqlite3_context *pCtx, const char *zFmt, ...){ + char *zErr = 0; + va_list ap; + va_start(ap, zFmt); + zErr = sqlite3_vmprintf(zFmt, ap); + sqlite3_result_error(pCtx, zErr, -1); + sqlite3_free(zErr); + va_end(ap); +} + static void fts5ApiCallback( sqlite3_context *context, int argc, @@ -239842,12 +254263,13 @@ static void fts5ApiCallback( iCsrId = sqlite3_value_int64(argv[0]); pCsr = fts5CursorFromCsrid(pAux->pGlobal, iCsrId); - if( pCsr==0 || pCsr->ePlan==0 ){ - char *zErr = sqlite3_mprintf("no such cursor: %lld", iCsrId); - sqlite3_result_error(context, zErr, -1); - sqlite3_free(zErr); + if( pCsr==0 || (pCsr->ePlan==0 || pCsr->ePlan==FTS5_PLAN_SPECIAL) ){ + fts5ResultError(context, "no such cursor: %lld", iCsrId); }else{ + sqlite3_vtab *pTab = pCsr->base.pVtab; fts5ApiInvoke(pAux, pCsr, context, argc-1, &argv[1]); + sqlite3_free(pTab->zErrMsg); + pTab->zErrMsg = 0; } } @@ -239965,8 +254387,8 @@ static int fts5ColumnMethod( ** auxiliary function. */ sqlite3_result_int64(pCtx, pCsr->iCsrId); }else if( iCol==pConfig->nCol+1 ){ - /* The value of the "rank" column. */ + if( pCsr->ePlan==FTS5_PLAN_SOURCE ){ fts5PoslistBlob(pCtx, pCsr); }else if( @@ -239977,14 +254399,32 @@ static int fts5ColumnMethod( fts5ApiInvoke(pCsr->pRank, pCsr, pCtx, pCsr->nRankArg, pCsr->apRankArg); } } - }else if( !fts5IsContentless(pTab) ){ - pConfig->pzErrmsg = &pTab->p.base.zErrMsg; - rc = fts5SeekCursor(pCsr, 1); - if( rc==SQLITE_OK ){ - sqlite3_result_value(pCtx, sqlite3_column_value(pCsr->pStmt, iCol+1)); + }else{ + if( !sqlite3_vtab_nochange(pCtx) && pConfig->eContent!=FTS5_CONTENT_NONE ){ + pConfig->pzErrmsg = &pTab->p.base.zErrMsg; + rc = fts5SeekCursor(pCsr, 1); + if( rc==SQLITE_OK ){ + sqlite3_value *pVal = sqlite3_column_value(pCsr->pStmt, iCol+1); + if( pConfig->bLocale + && pConfig->eContent==FTS5_CONTENT_EXTERNAL + && sqlite3Fts5IsLocaleValue(pConfig, pVal) + ){ + const char *z = 0; + int n = 0; + rc = fts5TextFromStmt(pConfig, pCsr->pStmt, iCol, &z, &n); + if( rc==SQLITE_OK ){ + sqlite3_result_text(pCtx, z, n, SQLITE_TRANSIENT); + } + sqlite3Fts5ClearLocale(pConfig); + }else{ + sqlite3_result_value(pCtx, pVal); + } + } + + pConfig->pzErrmsg = 0; } - pConfig->pzErrmsg = 0; } + return rc; } @@ -240022,8 +254462,10 @@ static int fts5RenameMethod( sqlite3_vtab *pVtab, /* Virtual table handle */ const char *zName /* New name of table */ ){ + int rc; Fts5FullTable *pTab = (Fts5FullTable*)pVtab; - return sqlite3Fts5StorageRename(pTab->pStorage, zName); + rc = sqlite3Fts5StorageRename(pTab->pStorage, zName); + return rc; } static int sqlite3Fts5FlushToDisk(Fts5Table *pTab){ @@ -240037,9 +254479,15 @@ static int sqlite3Fts5FlushToDisk(Fts5Table *pTab){ ** Flush the contents of the pending-terms table to disk. */ static int fts5SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ - UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ - fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_SAVEPOINT, iSavepoint); - return sqlite3Fts5FlushToDisk((Fts5Table*)pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; + int rc = SQLITE_OK; + + fts5CheckTransactionState(pTab, FTS5_SAVEPOINT, iSavepoint); + rc = sqlite3Fts5FlushToDisk((Fts5Table*)pVtab); + if( rc==SQLITE_OK ){ + pTab->iSavepoint = iSavepoint+1; + } + return rc; } /* @@ -240048,9 +254496,16 @@ static int fts5SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ ** This is a no-op. */ static int fts5ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ - UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ - fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_RELEASE, iSavepoint); - return sqlite3Fts5FlushToDisk((Fts5Table*)pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; + int rc = SQLITE_OK; + fts5CheckTransactionState(pTab, FTS5_RELEASE, iSavepoint); + if( (iSavepoint+1)iSavepoint ){ + rc = sqlite3Fts5FlushToDisk(&pTab->p); + if( rc==SQLITE_OK ){ + pTab->iSavepoint = iSavepoint; + } + } + return rc; } /* @@ -240060,10 +254515,14 @@ static int fts5ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ */ static int fts5RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ Fts5FullTable *pTab = (Fts5FullTable*)pVtab; - UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ + int rc = SQLITE_OK; fts5CheckTransactionState(pTab, FTS5_ROLLBACKTO, iSavepoint); fts5TripCursors(pTab); - return sqlite3Fts5StorageRollback(pTab->pStorage); + if( (iSavepoint+1)<=pTab->iSavepoint ){ + pTab->p.pConfig->pgsz = 0; + rc = sqlite3Fts5StorageRollback(pTab->pStorage); + } + return rc; } /* @@ -240105,47 +254564,210 @@ static int fts5CreateAux( } /* -** Register a new tokenizer. This is the implementation of the -** fts5_api.xCreateTokenizer() method. +** This function is used by xCreateTokenizer_v2() and xCreateTokenizer(). +** It allocates and partially populates a new Fts5TokenizerModule object. +** The new object is already linked into the Fts5Global context before +** returning. +** +** If successful, SQLITE_OK is returned and a pointer to the new +** Fts5TokenizerModule object returned via output parameter (*ppNew). All +** that is required is for the caller to fill in the methods in +** Fts5TokenizerModule.x1 and x2, and to set Fts5TokenizerModule.bV2Native +** as appropriate. +** +** If an error occurs, an SQLite error code is returned and the final value +** of (*ppNew) undefined. */ -static int fts5CreateTokenizer( - fts5_api *pApi, /* Global context (one per db handle) */ +static int fts5NewTokenizerModule( + Fts5Global *pGlobal, /* Global context (one per db handle) */ const char *zName, /* Name of new function */ void *pUserData, /* User data for aux. function */ - fts5_tokenizer *pTokenizer, /* Tokenizer implementation */ - void(*xDestroy)(void*) /* Destructor for pUserData */ + void(*xDestroy)(void*), /* Destructor for pUserData */ + Fts5TokenizerModule **ppNew ){ - Fts5Global *pGlobal = (Fts5Global*)pApi; - Fts5TokenizerModule *pNew; - sqlite3_int64 nName; /* Size of zName and its \0 terminator */ - sqlite3_int64 nByte; /* Bytes of space to allocate */ int rc = SQLITE_OK; + Fts5TokenizerModule *pNew; + sqlite3_int64 nName; /* Size of zName and its \0 terminator */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ nName = strlen(zName) + 1; nByte = sizeof(Fts5TokenizerModule) + nName; - pNew = (Fts5TokenizerModule*)sqlite3_malloc64(nByte); + *ppNew = pNew = (Fts5TokenizerModule*)sqlite3Fts5MallocZero(&rc, nByte); if( pNew ){ - memset(pNew, 0, (size_t)nByte); pNew->zName = (char*)&pNew[1]; memcpy(pNew->zName, zName, nName); pNew->pUserData = pUserData; - pNew->x = *pTokenizer; pNew->xDestroy = xDestroy; pNew->pNext = pGlobal->pTok; pGlobal->pTok = pNew; if( pNew->pNext==0 ){ pGlobal->pDfltTok = pNew; } + } + + return rc; +} + +/* +** An instance of this type is used as the Fts5Tokenizer object for +** wrapper tokenizers - those that provide access to a v1 tokenizer via +** the fts5_tokenizer_v2 API, and those that provide access to a v2 tokenizer +** via the fts5_tokenizer API. +*/ +typedef struct Fts5VtoVTokenizer Fts5VtoVTokenizer; +struct Fts5VtoVTokenizer { + int bV2Native; /* True if v2 native tokenizer */ + fts5_tokenizer x1; /* Tokenizer functions */ + fts5_tokenizer_v2 x2; /* V2 tokenizer functions */ + Fts5Tokenizer *pReal; +}; + +/* +** Create a wrapper tokenizer. The context argument pCtx points to the +** Fts5TokenizerModule object. +*/ +static int fts5VtoVCreate( + void *pCtx, + const char **azArg, + int nArg, + Fts5Tokenizer **ppOut +){ + Fts5TokenizerModule *pMod = (Fts5TokenizerModule*)pCtx; + Fts5VtoVTokenizer *pNew = 0; + int rc = SQLITE_OK; + + pNew = (Fts5VtoVTokenizer*)sqlite3Fts5MallocZero(&rc, sizeof(*pNew)); + if( rc==SQLITE_OK ){ + pNew->x1 = pMod->x1; + pNew->x2 = pMod->x2; + pNew->bV2Native = pMod->bV2Native; + if( pMod->bV2Native ){ + rc = pMod->x2.xCreate(pMod->pUserData, azArg, nArg, &pNew->pReal); + }else{ + rc = pMod->x1.xCreate(pMod->pUserData, azArg, nArg, &pNew->pReal); + } + if( rc!=SQLITE_OK ){ + sqlite3_free(pNew); + pNew = 0; + } + } + + *ppOut = (Fts5Tokenizer*)pNew; + return rc; +} + +/* +** Delete an Fts5VtoVTokenizer wrapper tokenizer. +*/ +static void fts5VtoVDelete(Fts5Tokenizer *pTok){ + Fts5VtoVTokenizer *p = (Fts5VtoVTokenizer*)pTok; + if( p ){ + if( p->bV2Native ){ + p->x2.xDelete(p->pReal); + }else{ + p->x1.xDelete(p->pReal); + } + sqlite3_free(p); + } +} + + +/* +** xTokenizer method for a wrapper tokenizer that offers the v1 interface +** (no support for locales). +*/ +static int fts5V1toV2Tokenize( + Fts5Tokenizer *pTok, + void *pCtx, int flags, + const char *pText, int nText, + int (*xToken)(void*, int, const char*, int, int, int) +){ + Fts5VtoVTokenizer *p = (Fts5VtoVTokenizer*)pTok; + assert( p->bV2Native ); + return p->x2.xTokenize(p->pReal, pCtx, flags, pText, nText, 0, 0, xToken); +} + +/* +** xTokenizer method for a wrapper tokenizer that offers the v2 interface +** (with locale support). +*/ +static int fts5V2toV1Tokenize( + Fts5Tokenizer *pTok, + void *pCtx, int flags, + const char *pText, int nText, + const char *pLocale, int nLocale, + int (*xToken)(void*, int, const char*, int, int, int) +){ + Fts5VtoVTokenizer *p = (Fts5VtoVTokenizer*)pTok; + assert( p->bV2Native==0 ); + UNUSED_PARAM2(pLocale,nLocale); + return p->x1.xTokenize(p->pReal, pCtx, flags, pText, nText, xToken); +} + +/* +** Register a new tokenizer. This is the implementation of the +** fts5_api.xCreateTokenizer_v2() method. +*/ +static int fts5CreateTokenizer_v2( + fts5_api *pApi, /* Global context (one per db handle) */ + const char *zName, /* Name of new function */ + void *pUserData, /* User data for aux. function */ + fts5_tokenizer_v2 *pTokenizer, /* Tokenizer implementation */ + void(*xDestroy)(void*) /* Destructor for pUserData */ +){ + Fts5Global *pGlobal = (Fts5Global*)pApi; + int rc = SQLITE_OK; + + if( pTokenizer->iVersion>2 ){ + rc = SQLITE_ERROR; }else{ - rc = SQLITE_NOMEM; + Fts5TokenizerModule *pNew = 0; + rc = fts5NewTokenizerModule(pGlobal, zName, pUserData, xDestroy, &pNew); + if( pNew ){ + pNew->x2 = *pTokenizer; + pNew->bV2Native = 1; + pNew->x1.xCreate = fts5VtoVCreate; + pNew->x1.xTokenize = fts5V1toV2Tokenize; + pNew->x1.xDelete = fts5VtoVDelete; + } } return rc; } +/* +** The fts5_api.xCreateTokenizer() method. +*/ +static int fts5CreateTokenizer( + fts5_api *pApi, /* Global context (one per db handle) */ + const char *zName, /* Name of new function */ + void *pUserData, /* User data for aux. function */ + fts5_tokenizer *pTokenizer, /* Tokenizer implementation */ + void(*xDestroy)(void*) /* Destructor for pUserData */ +){ + Fts5TokenizerModule *pNew = 0; + int rc = SQLITE_OK; + + rc = fts5NewTokenizerModule( + (Fts5Global*)pApi, zName, pUserData, xDestroy, &pNew + ); + if( pNew ){ + pNew->x1 = *pTokenizer; + pNew->x2.xCreate = fts5VtoVCreate; + pNew->x2.xTokenize = fts5V2toV1Tokenize; + pNew->x2.xDelete = fts5VtoVDelete; + } + return rc; +} + +/* +** Search the global context passed as the first argument for a tokenizer +** module named zName. If found, return a pointer to the Fts5TokenizerModule +** object. Otherwise, return NULL. +*/ static Fts5TokenizerModule *fts5LocateTokenizer( - Fts5Global *pGlobal, - const char *zName + Fts5Global *pGlobal, /* Global (one per db handle) object */ + const char *zName /* Name of tokenizer module to find */ ){ Fts5TokenizerModule *pMod = 0; @@ -240160,6 +254782,36 @@ static Fts5TokenizerModule *fts5LocateTokenizer( return pMod; } +/* +** Find a tokenizer. This is the implementation of the +** fts5_api.xFindTokenizer_v2() method. +*/ +static int fts5FindTokenizer_v2( + fts5_api *pApi, /* Global context (one per db handle) */ + const char *zName, /* Name of tokenizer */ + void **ppUserData, + fts5_tokenizer_v2 **ppTokenizer /* Populate this object */ +){ + int rc = SQLITE_OK; + Fts5TokenizerModule *pMod; + + pMod = fts5LocateTokenizer((Fts5Global*)pApi, zName); + if( pMod ){ + if( pMod->bV2Native ){ + *ppUserData = pMod->pUserData; + }else{ + *ppUserData = (void*)pMod; + } + *ppTokenizer = &pMod->x2; + }else{ + *ppTokenizer = 0; + *ppUserData = 0; + rc = SQLITE_ERROR; + } + + return rc; +} + /* ** Find a tokenizer. This is the implementation of the ** fts5_api.xFindTokenizer() method. @@ -240175,53 +254827,75 @@ static int fts5FindTokenizer( pMod = fts5LocateTokenizer((Fts5Global*)pApi, zName); if( pMod ){ - *pTokenizer = pMod->x; - *ppUserData = pMod->pUserData; + if( pMod->bV2Native==0 ){ + *ppUserData = pMod->pUserData; + }else{ + *ppUserData = (void*)pMod; + } + *pTokenizer = pMod->x1; }else{ - memset(pTokenizer, 0, sizeof(fts5_tokenizer)); + memset(pTokenizer, 0, sizeof(*pTokenizer)); + *ppUserData = 0; rc = SQLITE_ERROR; } return rc; } -static int sqlite3Fts5GetTokenizer( - Fts5Global *pGlobal, - const char **azArg, - int nArg, - Fts5Config *pConfig, - char **pzErr -){ - Fts5TokenizerModule *pMod; +/* +** Attempt to instantiate the tokenizer. +*/ +static int sqlite3Fts5LoadTokenizer(Fts5Config *pConfig){ + const char **azArg = pConfig->t.azArg; + const int nArg = pConfig->t.nArg; + Fts5TokenizerModule *pMod = 0; int rc = SQLITE_OK; - pMod = fts5LocateTokenizer(pGlobal, nArg==0 ? 0 : azArg[0]); + pMod = fts5LocateTokenizer(pConfig->pGlobal, nArg==0 ? 0 : azArg[0]); if( pMod==0 ){ assert( nArg>0 ); rc = SQLITE_ERROR; - *pzErr = sqlite3_mprintf("no such tokenizer: %s", azArg[0]); + sqlite3Fts5ConfigErrmsg(pConfig, "no such tokenizer: %s", azArg[0]); }else{ - rc = pMod->x.xCreate( - pMod->pUserData, (azArg?&azArg[1]:0), (nArg?nArg-1:0), &pConfig->pTok + int (*xCreate)(void*, const char**, int, Fts5Tokenizer**) = 0; + if( pMod->bV2Native ){ + xCreate = pMod->x2.xCreate; + pConfig->t.pApi2 = &pMod->x2; + }else{ + pConfig->t.pApi1 = &pMod->x1; + xCreate = pMod->x1.xCreate; + } + + rc = xCreate(pMod->pUserData, + (azArg?&azArg[1]:0), (nArg?nArg-1:0), &pConfig->t.pTok ); - pConfig->pTokApi = &pMod->x; + if( rc!=SQLITE_OK ){ - if( pzErr ) *pzErr = sqlite3_mprintf("error in tokenizer constructor"); - }else{ - pConfig->ePattern = sqlite3Fts5TokenizerPattern( - pMod->x.xCreate, pConfig->pTok + if( rc!=SQLITE_NOMEM ){ + sqlite3Fts5ConfigErrmsg(pConfig, "error in tokenizer constructor"); + } + }else if( pMod->bV2Native==0 ){ + pConfig->t.ePattern = sqlite3Fts5TokenizerPattern( + pMod->x1.xCreate, pConfig->t.pTok ); } } if( rc!=SQLITE_OK ){ - pConfig->pTokApi = 0; - pConfig->pTok = 0; + pConfig->t.pApi1 = 0; + pConfig->t.pApi2 = 0; + pConfig->t.pTok = 0; } return rc; } + +/* +** xDestroy callback passed to sqlite3_create_module(). This is invoked +** when the db handle is being closed. Free memory associated with +** tokenizers and aux functions registered with this db handle. +*/ static void fts5ModuleDestroy(void *pCtx){ Fts5TokenizerModule *pTok, *pNextTok; Fts5Auxiliary *pAux, *pNextAux; @@ -240242,6 +254916,10 @@ static void fts5ModuleDestroy(void *pCtx){ sqlite3_free(pGlobal); } +/* +** Implementation of the fts5() function used by clients to obtain the +** API pointer. +*/ static void fts5Fts5Func( sqlite3_context *pCtx, /* Function call context */ int nArg, /* Number of args */ @@ -240265,7 +254943,68 @@ static void fts5SourceIdFunc( ){ assert( nArg==0 ); UNUSED_PARAM2(nArg, apUnused); - sqlite3_result_text(pCtx, "fts5: 2023-03-22 11:56:21 0d1fc92f94cb6b76bffe3ec34d69cffde2924203304e8ffc4155597af0c191da", -1, SQLITE_TRANSIENT); + sqlite3_result_text(pCtx, "fts5: 2024-12-07 20:39:59 2aabe05e2e8cae4847a802ee2daddc1d7413d8fc560254d93ee3e72c14685b6c", -1, SQLITE_TRANSIENT); +} + +/* +** Implementation of fts5_locale(LOCALE, TEXT) function. +** +** If parameter LOCALE is NULL, or a zero-length string, then a copy of +** TEXT is returned. Otherwise, both LOCALE and TEXT are interpreted as +** text, and the value returned is a blob consisting of: +** +** * The 4 bytes 0x00, 0xE0, 0xB2, 0xEb (FTS5_LOCALE_HEADER). +** * The LOCALE, as utf-8 text, followed by +** * 0x00, followed by +** * The TEXT, as utf-8 text. +** +** There is no final nul-terminator following the TEXT value. +*/ +static void fts5LocaleFunc( + sqlite3_context *pCtx, /* Function call context */ + int nArg, /* Number of args */ + sqlite3_value **apArg /* Function arguments */ +){ + const char *zLocale = 0; + int nLocale = 0; + const char *zText = 0; + int nText = 0; + + assert( nArg==2 ); + UNUSED_PARAM(nArg); + + zLocale = (const char*)sqlite3_value_text(apArg[0]); + nLocale = sqlite3_value_bytes(apArg[0]); + + zText = (const char*)sqlite3_value_text(apArg[1]); + nText = sqlite3_value_bytes(apArg[1]); + + if( zLocale==0 || zLocale[0]=='\0' ){ + sqlite3_result_text(pCtx, zText, nText, SQLITE_TRANSIENT); + }else{ + Fts5Global *p = (Fts5Global*)sqlite3_user_data(pCtx); + u8 *pBlob = 0; + u8 *pCsr = 0; + int nBlob = 0; + + nBlob = FTS5_LOCALE_HDR_SIZE + nLocale + 1 + nText; + pBlob = (u8*)sqlite3_malloc(nBlob); + if( pBlob==0 ){ + sqlite3_result_error_nomem(pCtx); + return; + } + + pCsr = pBlob; + memcpy(pCsr, (const u8*)p->aLocaleHdr, FTS5_LOCALE_HDR_SIZE); + pCsr += FTS5_LOCALE_HDR_SIZE; + memcpy(pCsr, zLocale, nLocale); + pCsr += nLocale; + (*pCsr++) = 0x00; + if( zText ) memcpy(pCsr, zText, nText); + assert( &pCsr[nText]==&pBlob[nBlob] ); + + sqlite3_result_blob(pCtx, pBlob, nBlob, sqlite3_free); + } } /* @@ -240283,9 +255022,47 @@ static int fts5ShadowName(const char *zName){ return 0; } +/* +** Run an integrity check on the FTS5 data structures. Return a string +** if anything is found amiss. Return a NULL pointer if everything is +** OK. +*/ +static int fts5IntegrityMethod( + sqlite3_vtab *pVtab, /* the FTS5 virtual table to check */ + const char *zSchema, /* Name of schema in which this table lives */ + const char *zTabname, /* Name of the table itself */ + int isQuick, /* True if this is a quick-check */ + char **pzErr /* Write error message here */ +){ + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; + int rc; + + assert( pzErr!=0 && *pzErr==0 ); + UNUSED_PARAM(isQuick); + assert( pTab->p.pConfig->pzErrmsg==0 ); + pTab->p.pConfig->pzErrmsg = pzErr; + rc = sqlite3Fts5StorageIntegrity(pTab->pStorage, 0); + if( *pzErr==0 && rc!=SQLITE_OK ){ + if( (rc&0xff)==SQLITE_CORRUPT ){ + *pzErr = sqlite3_mprintf("malformed inverted index for FTS5 table %s.%s", + zSchema, zTabname); + rc = (*pzErr) ? SQLITE_OK : SQLITE_NOMEM; + }else{ + *pzErr = sqlite3_mprintf("unable to validate the inverted index for" + " FTS5 table %s.%s: %s", + zSchema, zTabname, sqlite3_errstr(rc)); + } + } + + sqlite3Fts5IndexCloseReader(pTab->p.pIndex); + pTab->p.pConfig->pzErrmsg = 0; + + return rc; +} + static int fts5Init(sqlite3 *db){ static const sqlite3_module fts5Mod = { - /* iVersion */ 3, + /* iVersion */ 4, /* xCreate */ fts5CreateMethod, /* xConnect */ fts5ConnectMethod, /* xBestIndex */ fts5BestIndexMethod, @@ -240308,7 +255085,8 @@ static int fts5Init(sqlite3 *db){ /* xSavepoint */ fts5SavepointMethod, /* xRelease */ fts5ReleaseMethod, /* xRollbackTo */ fts5RollbackToMethod, - /* xShadowName */ fts5ShadowName + /* xShadowName */ fts5ShadowName, + /* xIntegrity */ fts5IntegrityMethod }; int rc; @@ -240321,10 +255099,22 @@ static int fts5Init(sqlite3 *db){ void *p = (void*)pGlobal; memset(pGlobal, 0, sizeof(Fts5Global)); pGlobal->db = db; - pGlobal->api.iVersion = 2; + pGlobal->api.iVersion = 3; pGlobal->api.xCreateFunction = fts5CreateAux; pGlobal->api.xCreateTokenizer = fts5CreateTokenizer; pGlobal->api.xFindTokenizer = fts5FindTokenizer; + pGlobal->api.xCreateTokenizer_v2 = fts5CreateTokenizer_v2; + pGlobal->api.xFindTokenizer_v2 = fts5FindTokenizer_v2; + + /* Initialize pGlobal->aLocaleHdr[] to a 128-bit pseudo-random vector. + ** The constants below were generated randomly. */ + sqlite3_randomness(sizeof(pGlobal->aLocaleHdr), pGlobal->aLocaleHdr); + pGlobal->aLocaleHdr[0] ^= 0xF924976D; + pGlobal->aLocaleHdr[1] ^= 0x16596E13; + pGlobal->aLocaleHdr[2] ^= 0x7C80BEAA; + pGlobal->aLocaleHdr[3] ^= 0x9B03A67F; + assert( sizeof(pGlobal->aLocaleHdr)==16 ); + rc = sqlite3_create_module_v2(db, "fts5", &fts5Mod, p, fts5ModuleDestroy); if( rc==SQLITE_OK ) rc = sqlite3Fts5IndexInit(db); if( rc==SQLITE_OK ) rc = sqlite3Fts5ExprInit(pGlobal, db); @@ -240343,6 +255133,13 @@ static int fts5Init(sqlite3 *db){ p, fts5SourceIdFunc, 0, 0 ); } + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function( + db, "fts5_locale", 2, + SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_RESULT_SUBTYPE, + p, fts5LocaleFunc, 0, 0 + ); + } } /* If SQLITE_FTS5_ENABLE_TEST_MI is defined, assume that the file @@ -240417,13 +255214,40 @@ SQLITE_PRIVATE int sqlite3Fts5Init(sqlite3 *db){ /* #include "fts5Int.h" */ +/* +** pSavedRow: +** SQL statement FTS5_STMT_LOOKUP2 is a copy of FTS5_STMT_LOOKUP, it +** does a by-rowid lookup to retrieve a single row from the %_content +** table or equivalent external-content table/view. +** +** However, FTS5_STMT_LOOKUP2 is only used when retrieving the original +** values for a row being UPDATEd. In that case, the SQL statement is +** not reset and pSavedRow is set to point at it. This is so that the +** insert operation that follows the delete may access the original +** row values for any new values for which sqlite3_value_nochange() returns +** true. i.e. if the user executes: +** +** CREATE VIRTUAL TABLE ft USING fts5(a, b, c, locale=1); +** ... +** UPDATE fts SET a=?, b=? WHERE rowid=?; +** +** then the value passed to the xUpdate() method of this table as the +** new.c value is an sqlite3_value_nochange() value. So in this case it +** must be read from the saved row stored in Fts5Storage.pSavedRow. +** +** This is necessary - using sqlite3_value_nochange() instead of just having +** SQLite pass the original value back via xUpdate() - so as not to discard +** any locale information associated with such values. +** +*/ struct Fts5Storage { Fts5Config *pConfig; Fts5Index *pIndex; int bTotalsValid; /* True if nTotalRow/aTotalSize[] are valid */ i64 nTotalRow; /* Total number of rows in FTS table */ i64 *aTotalSize; /* Total sizes of each column */ - sqlite3_stmt *aStmt[11]; + sqlite3_stmt *pSavedRow; + sqlite3_stmt *aStmt[12]; }; @@ -240437,14 +255261,15 @@ struct Fts5Storage { # error "FTS5_STMT_LOOKUP mismatch" #endif -#define FTS5_STMT_INSERT_CONTENT 3 -#define FTS5_STMT_REPLACE_CONTENT 4 -#define FTS5_STMT_DELETE_CONTENT 5 -#define FTS5_STMT_REPLACE_DOCSIZE 6 -#define FTS5_STMT_DELETE_DOCSIZE 7 -#define FTS5_STMT_LOOKUP_DOCSIZE 8 -#define FTS5_STMT_REPLACE_CONFIG 9 -#define FTS5_STMT_SCAN 10 +#define FTS5_STMT_LOOKUP2 3 +#define FTS5_STMT_INSERT_CONTENT 4 +#define FTS5_STMT_REPLACE_CONTENT 5 +#define FTS5_STMT_DELETE_CONTENT 6 +#define FTS5_STMT_REPLACE_DOCSIZE 7 +#define FTS5_STMT_DELETE_DOCSIZE 8 +#define FTS5_STMT_LOOKUP_DOCSIZE 9 +#define FTS5_STMT_REPLACE_CONFIG 10 +#define FTS5_STMT_SCAN 11 /* ** Prepare the two insert statements - Fts5Storage.pInsertContent and @@ -240474,14 +255299,15 @@ static int fts5StorageGetStmt( "SELECT %s FROM %s T WHERE T.%Q >= ? AND T.%Q <= ? ORDER BY T.%Q ASC", "SELECT %s FROM %s T WHERE T.%Q <= ? AND T.%Q >= ? ORDER BY T.%Q DESC", "SELECT %s FROM %s T WHERE T.%Q=?", /* LOOKUP */ + "SELECT %s FROM %s T WHERE T.%Q=?", /* LOOKUP2 */ "INSERT INTO %Q.'%q_content' VALUES(%s)", /* INSERT_CONTENT */ "REPLACE INTO %Q.'%q_content' VALUES(%s)", /* REPLACE_CONTENT */ "DELETE FROM %Q.'%q_content' WHERE id=?", /* DELETE_CONTENT */ - "REPLACE INTO %Q.'%q_docsize' VALUES(?,?)", /* REPLACE_DOCSIZE */ + "REPLACE INTO %Q.'%q_docsize' VALUES(?,?%s)", /* REPLACE_DOCSIZE */ "DELETE FROM %Q.'%q_docsize' WHERE id=?", /* DELETE_DOCSIZE */ - "SELECT sz FROM %Q.'%q_docsize' WHERE id=?", /* LOOKUP_DOCSIZE */ + "SELECT sz%s FROM %Q.'%q_docsize' WHERE id=?", /* LOOKUP_DOCSIZE */ "REPLACE INTO %Q.'%q_config' VALUES(?,?)", /* REPLACE_CONFIG */ "SELECT %s FROM %s AS T", /* SCAN */ @@ -240489,6 +255315,8 @@ static int fts5StorageGetStmt( Fts5Config *pC = p->pConfig; char *zSql = 0; + assert( ArraySize(azStmt)==ArraySize(p->aStmt) ); + switch( eStmt ){ case FTS5_STMT_SCAN: zSql = sqlite3_mprintf(azStmt[eStmt], @@ -240505,6 +255333,7 @@ static int fts5StorageGetStmt( break; case FTS5_STMT_LOOKUP: + case FTS5_STMT_LOOKUP2: zSql = sqlite3_mprintf(azStmt[eStmt], pC->zContentExprlist, pC->zContent, pC->zContentRowid ); @@ -240512,23 +255341,51 @@ static int fts5StorageGetStmt( case FTS5_STMT_INSERT_CONTENT: case FTS5_STMT_REPLACE_CONTENT: { - int nCol = pC->nCol + 1; - char *zBind; + char *zBind = 0; int i; - zBind = sqlite3_malloc64(1 + nCol*2); - if( zBind ){ - for(i=0; ieContent==FTS5_CONTENT_NORMAL + || pC->eContent==FTS5_CONTENT_UNINDEXED + ); + + /* Add bindings for the "c*" columns - those that store the actual + ** table content. If eContent==NORMAL, then there is one binding + ** for each column. Or, if eContent==UNINDEXED, then there are only + ** bindings for the UNINDEXED columns. */ + for(i=0; rc==SQLITE_OK && i<(pC->nCol+1); i++){ + if( !i || pC->eContent==FTS5_CONTENT_NORMAL || pC->abUnindexed[i-1] ){ + zBind = sqlite3Fts5Mprintf(&rc, "%z%s?%d", zBind, zBind?",":"",i+1); } - zBind[i*2-1] = '\0'; - zSql = sqlite3_mprintf(azStmt[eStmt], pC->zDb, pC->zName, zBind); - sqlite3_free(zBind); } + + /* Add bindings for any "l*" columns. Only non-UNINDEXED columns + ** require these. */ + if( pC->bLocale && pC->eContent==FTS5_CONTENT_NORMAL ){ + for(i=0; rc==SQLITE_OK && inCol; i++){ + if( pC->abUnindexed[i]==0 ){ + zBind = sqlite3Fts5Mprintf(&rc, "%z,?%d", zBind, pC->nCol+i+2); + } + } + } + + zSql = sqlite3Fts5Mprintf(&rc, azStmt[eStmt], pC->zDb, pC->zName,zBind); + sqlite3_free(zBind); break; } + case FTS5_STMT_REPLACE_DOCSIZE: + zSql = sqlite3_mprintf(azStmt[eStmt], pC->zDb, pC->zName, + (pC->bContentlessDelete ? ",?" : "") + ); + break; + + case FTS5_STMT_LOOKUP_DOCSIZE: + zSql = sqlite3_mprintf(azStmt[eStmt], + (pC->bContentlessDelete ? ",origin" : ""), + pC->zDb, pC->zName + ); + break; + default: zSql = sqlite3_mprintf(azStmt[eStmt], pC->zDb, pC->zName); break; @@ -240538,7 +255395,7 @@ static int fts5StorageGetStmt( rc = SQLITE_NOMEM; }else{ int f = SQLITE_PREPARE_PERSISTENT; - if( eStmt>FTS5_STMT_LOOKUP ) f |= SQLITE_PREPARE_NO_VTAB; + if( eStmt>FTS5_STMT_LOOKUP2 ) f |= SQLITE_PREPARE_NO_VTAB; p->pConfig->bLock++; rc = sqlite3_prepare_v3(pC->db, zSql, -1, f, &p->aStmt[eStmt], 0); p->pConfig->bLock--; @@ -240698,9 +255555,11 @@ static int sqlite3Fts5StorageOpen( p->pIndex = pIndex; if( bCreate ){ - if( pConfig->eContent==FTS5_CONTENT_NORMAL ){ + if( pConfig->eContent==FTS5_CONTENT_NORMAL + || pConfig->eContent==FTS5_CONTENT_UNINDEXED + ){ int nDefn = 32 + pConfig->nCol*10; - char *zDefn = sqlite3_malloc64(32 + (sqlite3_int64)pConfig->nCol * 10); + char *zDefn = sqlite3_malloc64(32 + (sqlite3_int64)pConfig->nCol * 20); if( zDefn==0 ){ rc = SQLITE_NOMEM; }else{ @@ -240709,8 +255568,20 @@ static int sqlite3Fts5StorageOpen( sqlite3_snprintf(nDefn, zDefn, "id INTEGER PRIMARY KEY"); iOff = (int)strlen(zDefn); for(i=0; inCol; i++){ - sqlite3_snprintf(nDefn-iOff, &zDefn[iOff], ", c%d", i); - iOff += (int)strlen(&zDefn[iOff]); + if( pConfig->eContent==FTS5_CONTENT_NORMAL + || pConfig->abUnindexed[i] + ){ + sqlite3_snprintf(nDefn-iOff, &zDefn[iOff], ", c%d", i); + iOff += (int)strlen(&zDefn[iOff]); + } + } + if( pConfig->bLocale ){ + for(i=0; inCol; i++){ + if( pConfig->abUnindexed[i]==0 ){ + sqlite3_snprintf(nDefn-iOff, &zDefn[iOff], ", l%d", i); + iOff += (int)strlen(&zDefn[iOff]); + } + } } rc = sqlite3Fts5CreateTable(pConfig, "content", zDefn, 0, pzErr); } @@ -240718,9 +255589,11 @@ static int sqlite3Fts5StorageOpen( } if( rc==SQLITE_OK && pConfig->bColumnsize ){ - rc = sqlite3Fts5CreateTable( - pConfig, "docsize", "id INTEGER PRIMARY KEY, sz BLOB", 0, pzErr - ); + const char *zCols = "id INTEGER PRIMARY KEY, sz BLOB"; + if( pConfig->bContentlessDelete ){ + zCols = "id INTEGER PRIMARY KEY, sz BLOB, origin INTEGER"; + } + rc = sqlite3Fts5CreateTable(pConfig, "docsize", zCols, 0, pzErr); } if( rc==SQLITE_OK ){ rc = sqlite3Fts5CreateTable( @@ -240785,57 +255658,115 @@ static int fts5StorageInsertCallback( return sqlite3Fts5IndexWrite(pIdx, pCtx->iCol, pCtx->szCol-1, pToken, nToken); } +/* +** This function is used as part of an UPDATE statement that modifies the +** rowid of a row. In that case, this function is called first to set +** Fts5Storage.pSavedRow to point to a statement that may be used to +** access the original values of the row being deleted - iDel. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +** It is not considered an error if row iDel does not exist. In this case +** pSavedRow is not set and SQLITE_OK returned. +*/ +static int sqlite3Fts5StorageFindDeleteRow(Fts5Storage *p, i64 iDel){ + int rc = SQLITE_OK; + sqlite3_stmt *pSeek = 0; + + assert( p->pSavedRow==0 ); + rc = fts5StorageGetStmt(p, FTS5_STMT_LOOKUP+1, &pSeek, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pSeek, 1, iDel); + if( sqlite3_step(pSeek)!=SQLITE_ROW ){ + rc = sqlite3_reset(pSeek); + }else{ + p->pSavedRow = pSeek; + } + } + + return rc; +} + /* ** If a row with rowid iDel is present in the %_content table, add the ** delete-markers to the FTS index necessary to delete it. Do not actually ** remove the %_content row at this time though. +** +** If parameter bSaveRow is true, then Fts5Storage.pSavedRow is left +** pointing to a statement (FTS5_STMT_LOOKUP2) that may be used to access +** the original values of the row being deleted. This is used by UPDATE +** statements. */ static int fts5StorageDeleteFromIndex( Fts5Storage *p, i64 iDel, - sqlite3_value **apVal + sqlite3_value **apVal, + int bSaveRow /* True to set pSavedRow */ ){ Fts5Config *pConfig = p->pConfig; sqlite3_stmt *pSeek = 0; /* SELECT to read row iDel from %_data */ - int rc; /* Return code */ + int rc = SQLITE_OK; /* Return code */ int rc2; /* sqlite3_reset() return code */ int iCol; Fts5InsertCtx ctx; + assert( bSaveRow==0 || apVal==0 ); + assert( bSaveRow==0 || bSaveRow==1 ); + assert( FTS5_STMT_LOOKUP2==FTS5_STMT_LOOKUP+1 ); + if( apVal==0 ){ - rc = fts5StorageGetStmt(p, FTS5_STMT_LOOKUP, &pSeek, 0); - if( rc!=SQLITE_OK ) return rc; - sqlite3_bind_int64(pSeek, 1, iDel); - if( sqlite3_step(pSeek)!=SQLITE_ROW ){ - return sqlite3_reset(pSeek); + if( p->pSavedRow && bSaveRow ){ + pSeek = p->pSavedRow; + p->pSavedRow = 0; + }else{ + rc = fts5StorageGetStmt(p, FTS5_STMT_LOOKUP+bSaveRow, &pSeek, 0); + if( rc!=SQLITE_OK ) return rc; + sqlite3_bind_int64(pSeek, 1, iDel); + if( sqlite3_step(pSeek)!=SQLITE_ROW ){ + return sqlite3_reset(pSeek); + } } } ctx.pStorage = p; ctx.iCol = -1; - rc = sqlite3Fts5IndexBeginWrite(p->pIndex, 1, iDel); for(iCol=1; rc==SQLITE_OK && iCol<=pConfig->nCol; iCol++){ if( pConfig->abUnindexed[iCol-1]==0 ){ - const char *zText; - int nText; + sqlite3_value *pVal = 0; + const char *pText = 0; + int nText = 0; + const char *pLoc = 0; + int nLoc = 0; + assert( pSeek==0 || apVal==0 ); assert( pSeek!=0 || apVal!=0 ); if( pSeek ){ - zText = (const char*)sqlite3_column_text(pSeek, iCol); - nText = sqlite3_column_bytes(pSeek, iCol); - }else if( ALWAYS(apVal) ){ - zText = (const char*)sqlite3_value_text(apVal[iCol-1]); - nText = sqlite3_value_bytes(apVal[iCol-1]); + pVal = sqlite3_column_value(pSeek, iCol); }else{ - continue; + pVal = apVal[iCol-1]; } - ctx.szCol = 0; - rc = sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_DOCUMENT, - zText, nText, (void*)&ctx, fts5StorageInsertCallback - ); - p->aTotalSize[iCol-1] -= (i64)ctx.szCol; - if( p->aTotalSize[iCol-1]<0 ){ - rc = FTS5_CORRUPT; + + if( pConfig->bLocale && sqlite3Fts5IsLocaleValue(pConfig, pVal) ){ + rc = sqlite3Fts5DecodeLocaleValue(pVal, &pText, &nText, &pLoc, &nLoc); + }else{ + pText = (const char*)sqlite3_value_text(pVal); + nText = sqlite3_value_bytes(pVal); + if( pConfig->bLocale && pSeek ){ + pLoc = (const char*)sqlite3_column_text(pSeek, iCol + pConfig->nCol); + nLoc = sqlite3_column_bytes(pSeek, iCol + pConfig->nCol); + } + } + + if( rc==SQLITE_OK ){ + sqlite3Fts5SetLocale(pConfig, pLoc, nLoc); + ctx.szCol = 0; + rc = sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_DOCUMENT, + pText, nText, (void*)&ctx, fts5StorageInsertCallback + ); + p->aTotalSize[iCol-1] -= (i64)ctx.szCol; + if( rc==SQLITE_OK && p->aTotalSize[iCol-1]<0 ){ + rc = FTS5_CORRUPT; + } + sqlite3Fts5ClearLocale(pConfig); } } } @@ -240845,11 +255776,62 @@ static int fts5StorageDeleteFromIndex( p->nTotalRow--; } - rc2 = sqlite3_reset(pSeek); - if( rc==SQLITE_OK ) rc = rc2; + if( rc==SQLITE_OK && bSaveRow ){ + assert( p->pSavedRow==0 ); + p->pSavedRow = pSeek; + }else{ + rc2 = sqlite3_reset(pSeek); + if( rc==SQLITE_OK ) rc = rc2; + } return rc; } +/* +** Reset any saved statement pSavedRow. Zero pSavedRow as well. This +** should be called by the xUpdate() method of the fts5 table before +** returning from any operation that may have set Fts5Storage.pSavedRow. +*/ +static void sqlite3Fts5StorageReleaseDeleteRow(Fts5Storage *pStorage){ + assert( pStorage->pSavedRow==0 + || pStorage->pSavedRow==pStorage->aStmt[FTS5_STMT_LOOKUP2] + ); + sqlite3_reset(pStorage->pSavedRow); + pStorage->pSavedRow = 0; +} + +/* +** This function is called to process a DELETE on a contentless_delete=1 +** table. It adds the tombstone required to delete the entry with rowid +** iDel. If successful, SQLITE_OK is returned. Or, if an error occurs, +** an SQLite error code. +*/ +static int fts5StorageContentlessDelete(Fts5Storage *p, i64 iDel){ + i64 iOrigin = 0; + sqlite3_stmt *pLookup = 0; + int rc = SQLITE_OK; + + assert( p->pConfig->bContentlessDelete ); + assert( p->pConfig->eContent==FTS5_CONTENT_NONE + || p->pConfig->eContent==FTS5_CONTENT_UNINDEXED + ); + + /* Look up the origin of the document in the %_docsize table. Store + ** this in stack variable iOrigin. */ + rc = fts5StorageGetStmt(p, FTS5_STMT_LOOKUP_DOCSIZE, &pLookup, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pLookup, 1, iDel); + if( SQLITE_ROW==sqlite3_step(pLookup) ){ + iOrigin = sqlite3_column_int64(pLookup, 1); + } + rc = sqlite3_reset(pLookup); + } + + if( rc==SQLITE_OK && iOrigin!=0 ){ + rc = sqlite3Fts5IndexContentlessDelete(p->pIndex, iOrigin, iDel); + } + + return rc; +} /* ** Insert a record into the %_docsize table. Specifically, do: @@ -240870,6 +255852,13 @@ static int fts5StorageInsertDocsize( rc = fts5StorageGetStmt(p, FTS5_STMT_REPLACE_DOCSIZE, &pReplace, 0); if( rc==SQLITE_OK ){ sqlite3_bind_int64(pReplace, 1, iRowid); + if( p->pConfig->bContentlessDelete ){ + i64 iOrigin = 0; + rc = sqlite3Fts5IndexGetOrigin(p->pIndex, &iOrigin); + sqlite3_bind_int64(pReplace, 3, iOrigin); + } + } + if( rc==SQLITE_OK ){ sqlite3_bind_blob(pReplace, 2, pBuf->p, pBuf->n, SQLITE_STATIC); sqlite3_step(pReplace); rc = sqlite3_reset(pReplace); @@ -240927,7 +255916,12 @@ static int fts5StorageSaveTotals(Fts5Storage *p){ /* ** Remove a row from the FTS table. */ -static int sqlite3Fts5StorageDelete(Fts5Storage *p, i64 iDel, sqlite3_value **apVal){ +static int sqlite3Fts5StorageDelete( + Fts5Storage *p, /* Storage object */ + i64 iDel, /* Rowid to delete from table */ + sqlite3_value **apVal, /* Optional - values to remove from index */ + int bSaveRow /* If true, set pSavedRow for deleted row */ +){ Fts5Config *pConfig = p->pConfig; int rc; sqlite3_stmt *pDel = 0; @@ -240937,7 +255931,21 @@ static int sqlite3Fts5StorageDelete(Fts5Storage *p, i64 iDel, sqlite3_value **ap /* Delete the index records */ if( rc==SQLITE_OK ){ - rc = fts5StorageDeleteFromIndex(p, iDel, apVal); + rc = sqlite3Fts5IndexBeginWrite(p->pIndex, 1, iDel); + } + + if( rc==SQLITE_OK ){ + if( p->pConfig->bContentlessDelete ){ + rc = fts5StorageContentlessDelete(p, iDel); + if( rc==SQLITE_OK + && bSaveRow + && p->pConfig->eContent==FTS5_CONTENT_UNINDEXED + ){ + rc = sqlite3Fts5StorageFindDeleteRow(p, iDel); + } + }else{ + rc = fts5StorageDeleteFromIndex(p, iDel, apVal, bSaveRow); + } } /* Delete the %_docsize record */ @@ -240951,7 +255959,9 @@ static int sqlite3Fts5StorageDelete(Fts5Storage *p, i64 iDel, sqlite3_value **ap } /* Delete the %_content record */ - if( pConfig->eContent==FTS5_CONTENT_NORMAL ){ + if( pConfig->eContent==FTS5_CONTENT_NORMAL + || pConfig->eContent==FTS5_CONTENT_UNINDEXED + ){ if( rc==SQLITE_OK ){ rc = fts5StorageGetStmt(p, FTS5_STMT_DELETE_CONTENT, &pDel, 0); } @@ -240983,8 +255993,13 @@ static int sqlite3Fts5StorageDeleteAll(Fts5Storage *p){ ); if( rc==SQLITE_OK && pConfig->bColumnsize ){ rc = fts5ExecPrintf(pConfig->db, 0, - "DELETE FROM %Q.'%q_docsize';", - pConfig->zDb, pConfig->zName + "DELETE FROM %Q.'%q_docsize';", pConfig->zDb, pConfig->zName + ); + } + + if( rc==SQLITE_OK && pConfig->eContent==FTS5_CONTENT_UNINDEXED ){ + rc = fts5ExecPrintf(pConfig->db, 0, + "DELETE FROM %Q.'%q_content';", pConfig->zDb, pConfig->zName ); } @@ -241014,7 +256029,7 @@ static int sqlite3Fts5StorageRebuild(Fts5Storage *p){ } if( rc==SQLITE_OK ){ - rc = fts5StorageGetStmt(p, FTS5_STMT_SCAN, &pScan, 0); + rc = fts5StorageGetStmt(p, FTS5_STMT_SCAN, &pScan, pConfig->pzErrmsg); } while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pScan) ){ @@ -241025,14 +256040,36 @@ static int sqlite3Fts5StorageRebuild(Fts5Storage *p){ for(ctx.iCol=0; rc==SQLITE_OK && ctx.iColnCol; ctx.iCol++){ ctx.szCol = 0; if( pConfig->abUnindexed[ctx.iCol]==0 ){ - const char *zText = (const char*)sqlite3_column_text(pScan, ctx.iCol+1); - int nText = sqlite3_column_bytes(pScan, ctx.iCol+1); - rc = sqlite3Fts5Tokenize(pConfig, - FTS5_TOKENIZE_DOCUMENT, - zText, nText, - (void*)&ctx, - fts5StorageInsertCallback - ); + int nText = 0; /* Size of pText in bytes */ + const char *pText = 0; /* Pointer to buffer containing text value */ + int nLoc = 0; /* Size of pLoc in bytes */ + const char *pLoc = 0; /* Pointer to buffer containing text value */ + + sqlite3_value *pVal = sqlite3_column_value(pScan, ctx.iCol+1); + if( pConfig->eContent==FTS5_CONTENT_EXTERNAL + && sqlite3Fts5IsLocaleValue(pConfig, pVal) + ){ + rc = sqlite3Fts5DecodeLocaleValue(pVal, &pText, &nText, &pLoc, &nLoc); + }else{ + pText = (const char*)sqlite3_value_text(pVal); + nText = sqlite3_value_bytes(pVal); + if( pConfig->bLocale ){ + int iCol = ctx.iCol + 1 + pConfig->nCol; + pLoc = (const char*)sqlite3_column_text(pScan, iCol); + nLoc = sqlite3_column_bytes(pScan, iCol); + } + } + + if( rc==SQLITE_OK ){ + sqlite3Fts5SetLocale(pConfig, pLoc, nLoc); + rc = sqlite3Fts5Tokenize(pConfig, + FTS5_TOKENIZE_DOCUMENT, + pText, nText, + (void*)&ctx, + fts5StorageInsertCallback + ); + sqlite3Fts5ClearLocale(pConfig); + } } sqlite3Fts5BufferAppendVarint(&rc, &buf, ctx.szCol); p->aTotalSize[ctx.iCol] += (i64)ctx.szCol; @@ -241098,6 +256135,7 @@ static int fts5StorageNewRowid(Fts5Storage *p, i64 *piRowid){ */ static int sqlite3Fts5StorageContentInsert( Fts5Storage *p, + int bReplace, /* True to use REPLACE instead of INSERT */ sqlite3_value **apVal, i64 *piRowid ){ @@ -241105,7 +256143,9 @@ static int sqlite3Fts5StorageContentInsert( int rc = SQLITE_OK; /* Insert the new row into the %_content table. */ - if( pConfig->eContent!=FTS5_CONTENT_NORMAL ){ + if( pConfig->eContent!=FTS5_CONTENT_NORMAL + && pConfig->eContent!=FTS5_CONTENT_UNINDEXED + ){ if( sqlite3_value_type(apVal[1])==SQLITE_INTEGER ){ *piRowid = sqlite3_value_int64(apVal[1]); }else{ @@ -241114,9 +256154,52 @@ static int sqlite3Fts5StorageContentInsert( }else{ sqlite3_stmt *pInsert = 0; /* Statement to write %_content table */ int i; /* Counter variable */ - rc = fts5StorageGetStmt(p, FTS5_STMT_INSERT_CONTENT, &pInsert, 0); - for(i=1; rc==SQLITE_OK && i<=pConfig->nCol+1; i++){ - rc = sqlite3_bind_value(pInsert, i, apVal[i]); + + assert( FTS5_STMT_INSERT_CONTENT+1==FTS5_STMT_REPLACE_CONTENT ); + assert( bReplace==0 || bReplace==1 ); + rc = fts5StorageGetStmt(p, FTS5_STMT_INSERT_CONTENT+bReplace, &pInsert, 0); + if( pInsert ) sqlite3_clear_bindings(pInsert); + + /* Bind the rowid value */ + sqlite3_bind_value(pInsert, 1, apVal[1]); + + /* Loop through values for user-defined columns. i=2 is the leftmost + ** user-defined column. As is column 1 of pSavedRow. */ + for(i=2; rc==SQLITE_OK && i<=pConfig->nCol+1; i++){ + int bUnindexed = pConfig->abUnindexed[i-2]; + if( pConfig->eContent==FTS5_CONTENT_NORMAL || bUnindexed ){ + sqlite3_value *pVal = apVal[i]; + + if( sqlite3_value_nochange(pVal) && p->pSavedRow ){ + /* This is an UPDATE statement, and user-defined column (i-2) was not + ** modified. Retrieve the value from Fts5Storage.pSavedRow. */ + pVal = sqlite3_column_value(p->pSavedRow, i-1); + if( pConfig->bLocale && bUnindexed==0 ){ + sqlite3_bind_value(pInsert, pConfig->nCol + i, + sqlite3_column_value(p->pSavedRow, pConfig->nCol + i - 1) + ); + } + }else if( sqlite3Fts5IsLocaleValue(pConfig, pVal) ){ + const char *pText = 0; + const char *pLoc = 0; + int nText = 0; + int nLoc = 0; + assert( pConfig->bLocale ); + + rc = sqlite3Fts5DecodeLocaleValue(pVal, &pText, &nText, &pLoc, &nLoc); + if( rc==SQLITE_OK ){ + sqlite3_bind_text(pInsert, i, pText, nText, SQLITE_TRANSIENT); + if( bUnindexed==0 ){ + int iLoc = pConfig->nCol + i; + sqlite3_bind_text(pInsert, iLoc, pLoc, nLoc, SQLITE_TRANSIENT); + } + } + + continue; + } + + rc = sqlite3_bind_value(pInsert, i, pVal); + } } if( rc==SQLITE_OK ){ sqlite3_step(pInsert); @@ -241151,14 +256234,38 @@ static int sqlite3Fts5StorageIndexInsert( for(ctx.iCol=0; rc==SQLITE_OK && ctx.iColnCol; ctx.iCol++){ ctx.szCol = 0; if( pConfig->abUnindexed[ctx.iCol]==0 ){ - const char *zText = (const char*)sqlite3_value_text(apVal[ctx.iCol+2]); - int nText = sqlite3_value_bytes(apVal[ctx.iCol+2]); - rc = sqlite3Fts5Tokenize(pConfig, - FTS5_TOKENIZE_DOCUMENT, - zText, nText, - (void*)&ctx, - fts5StorageInsertCallback - ); + int nText = 0; /* Size of pText in bytes */ + const char *pText = 0; /* Pointer to buffer containing text value */ + int nLoc = 0; /* Size of pText in bytes */ + const char *pLoc = 0; /* Pointer to buffer containing text value */ + + sqlite3_value *pVal = apVal[ctx.iCol+2]; + if( p->pSavedRow && sqlite3_value_nochange(pVal) ){ + pVal = sqlite3_column_value(p->pSavedRow, ctx.iCol+1); + if( pConfig->eContent==FTS5_CONTENT_NORMAL && pConfig->bLocale ){ + int iCol = ctx.iCol + 1 + pConfig->nCol; + pLoc = (const char*)sqlite3_column_text(p->pSavedRow, iCol); + nLoc = sqlite3_column_bytes(p->pSavedRow, iCol); + } + }else{ + pVal = apVal[ctx.iCol+2]; + } + + if( pConfig->bLocale && sqlite3Fts5IsLocaleValue(pConfig, pVal) ){ + rc = sqlite3Fts5DecodeLocaleValue(pVal, &pText, &nText, &pLoc, &nLoc); + }else{ + pText = (const char*)sqlite3_value_text(pVal); + nText = sqlite3_value_bytes(pVal); + } + + if( rc==SQLITE_OK ){ + sqlite3Fts5SetLocale(pConfig, pLoc, nLoc); + rc = sqlite3Fts5Tokenize(pConfig, + FTS5_TOKENIZE_DOCUMENT, pText, nText, (void*)&ctx, + fts5StorageInsertCallback + ); + sqlite3Fts5ClearLocale(pConfig); + } } sqlite3Fts5BufferAppendVarint(&rc, &buf, ctx.szCol); p->aTotalSize[ctx.iCol] += (i64)ctx.szCol; @@ -241322,29 +256429,61 @@ static int sqlite3Fts5StorageIntegrity(Fts5Storage *p, int iArg){ rc = sqlite3Fts5TermsetNew(&ctx.pTermset); } for(i=0; rc==SQLITE_OK && inCol; i++){ - if( pConfig->abUnindexed[i] ) continue; - ctx.iCol = i; - ctx.szCol = 0; - if( pConfig->eDetail==FTS5_DETAIL_COLUMNS ){ - rc = sqlite3Fts5TermsetNew(&ctx.pTermset); - } - if( rc==SQLITE_OK ){ - const char *zText = (const char*)sqlite3_column_text(pScan, i+1); - int nText = sqlite3_column_bytes(pScan, i+1); - rc = sqlite3Fts5Tokenize(pConfig, - FTS5_TOKENIZE_DOCUMENT, - zText, nText, - (void*)&ctx, - fts5StorageIntegrityCallback - ); - } - if( rc==SQLITE_OK && pConfig->bColumnsize && ctx.szCol!=aColSize[i] ){ - rc = FTS5_CORRUPT; - } - aTotalSize[i] += ctx.szCol; - if( pConfig->eDetail==FTS5_DETAIL_COLUMNS ){ - sqlite3Fts5TermsetFree(ctx.pTermset); - ctx.pTermset = 0; + if( pConfig->abUnindexed[i]==0 ){ + const char *pText = 0; + int nText = 0; + const char *pLoc = 0; + int nLoc = 0; + sqlite3_value *pVal = sqlite3_column_value(pScan, i+1); + + if( pConfig->eContent==FTS5_CONTENT_EXTERNAL + && sqlite3Fts5IsLocaleValue(pConfig, pVal) + ){ + rc = sqlite3Fts5DecodeLocaleValue( + pVal, &pText, &nText, &pLoc, &nLoc + ); + }else{ + if( pConfig->eContent==FTS5_CONTENT_NORMAL && pConfig->bLocale ){ + int iCol = i + 1 + pConfig->nCol; + pLoc = (const char*)sqlite3_column_text(pScan, iCol); + nLoc = sqlite3_column_bytes(pScan, iCol); + } + pText = (const char*)sqlite3_value_text(pVal); + nText = sqlite3_value_bytes(pVal); + } + + ctx.iCol = i; + ctx.szCol = 0; + + if( rc==SQLITE_OK && pConfig->eDetail==FTS5_DETAIL_COLUMNS ){ + rc = sqlite3Fts5TermsetNew(&ctx.pTermset); + } + + if( rc==SQLITE_OK ){ + sqlite3Fts5SetLocale(pConfig, pLoc, nLoc); + rc = sqlite3Fts5Tokenize(pConfig, + FTS5_TOKENIZE_DOCUMENT, + pText, nText, + (void*)&ctx, + fts5StorageIntegrityCallback + ); + sqlite3Fts5ClearLocale(pConfig); + } + + /* If this is not a columnsize=0 database, check that the number + ** of tokens in the value matches the aColSize[] value read from + ** the %_docsize table. */ + if( rc==SQLITE_OK + && pConfig->bColumnsize + && ctx.szCol!=aColSize[i] + ){ + rc = FTS5_CORRUPT; + } + aTotalSize[i] += ctx.szCol; + if( pConfig->eDetail==FTS5_DETAIL_COLUMNS ){ + sqlite3Fts5TermsetFree(ctx.pTermset); + ctx.pTermset = 0; + } } } sqlite3Fts5TermsetFree(ctx.pTermset); @@ -241525,7 +256664,9 @@ static int sqlite3Fts5StorageSync(Fts5Storage *p){ i64 iLastRowid = sqlite3_last_insert_rowid(p->pConfig->db); if( p->bTotalsValid ){ rc = fts5StorageSaveTotals(p); - p->bTotalsValid = 0; + if( rc==SQLITE_OK ){ + p->bTotalsValid = 0; + } } if( rc==SQLITE_OK ){ rc = sqlite3Fts5IndexSync(p->pIndex); @@ -241768,7 +256909,7 @@ static const unsigned char sqlite3Utf8Trans1[] = { c = *(zIn++); \ if( c>=0xc0 ){ \ c = sqlite3Utf8Trans1[c-0xc0]; \ - while( zIn!=zTerm && (*zIn & 0xc0)==0x80 ){ \ + while( zIn=0xc0 ){ \ + while( (((unsigned char)*zIn) & 0xc0)==0x80 ){ zIn++; } \ + } \ +} + typedef struct Unicode61Tokenizer Unicode61Tokenizer; struct Unicode61Tokenizer { unsigned char aTokenChar[128]; /* ASCII range token characters */ @@ -241950,7 +257097,6 @@ static int fts5UnicodeCreate( zCat = azArg[i+1]; } } - if( rc==SQLITE_OK ){ rc = unicodeSetCategories(p, zCat); } @@ -241980,7 +257126,6 @@ static int fts5UnicodeCreate( rc = SQLITE_ERROR; } } - }else{ rc = SQLITE_NOMEM; } @@ -242119,7 +257264,7 @@ static int fts5UnicodeTokenize( typedef struct PorterTokenizer PorterTokenizer; struct PorterTokenizer { - fts5_tokenizer tokenizer; /* Parent tokenizer module */ + fts5_tokenizer_v2 tokenizer_v2; /* Parent tokenizer module */ Fts5Tokenizer *pTokenizer; /* Parent tokenizer instance */ char aBuf[FTS5_PORTER_MAX_TOKEN + 64]; }; @@ -242131,7 +257276,7 @@ static void fts5PorterDelete(Fts5Tokenizer *pTok){ if( pTok ){ PorterTokenizer *p = (PorterTokenizer*)pTok; if( p->pTokenizer ){ - p->tokenizer.xDelete(p->pTokenizer); + p->tokenizer_v2.xDelete(p->pTokenizer); } sqlite3_free(p); } @@ -242150,6 +257295,7 @@ static int fts5PorterCreate( PorterTokenizer *pRet; void *pUserdata = 0; const char *zBase = "unicode61"; + fts5_tokenizer_v2 *pV2 = 0; if( nArg>0 ){ zBase = azArg[0]; @@ -242158,14 +257304,15 @@ static int fts5PorterCreate( pRet = (PorterTokenizer*)sqlite3_malloc(sizeof(PorterTokenizer)); if( pRet ){ memset(pRet, 0, sizeof(PorterTokenizer)); - rc = pApi->xFindTokenizer(pApi, zBase, &pUserdata, &pRet->tokenizer); + rc = pApi->xFindTokenizer_v2(pApi, zBase, &pUserdata, &pV2); }else{ rc = SQLITE_NOMEM; } if( rc==SQLITE_OK ){ int nArg2 = (nArg>0 ? nArg-1 : 0); - const char **azArg2 = (nArg2 ? &azArg[1] : 0); - rc = pRet->tokenizer.xCreate(pUserdata, azArg2, nArg2, &pRet->pTokenizer); + const char **az2 = (nArg2 ? &azArg[1] : 0); + memcpy(&pRet->tokenizer_v2, pV2, sizeof(fts5_tokenizer_v2)); + rc = pRet->tokenizer_v2.xCreate(pUserdata, az2, nArg2, &pRet->pTokenizer); } if( rc!=SQLITE_OK ){ @@ -242816,6 +257963,7 @@ static int fts5PorterTokenize( void *pCtx, int flags, const char *pText, int nText, + const char *pLoc, int nLoc, int (*xToken)(void*, int, const char*, int nToken, int iStart, int iEnd) ){ PorterTokenizer *p = (PorterTokenizer*)pTokenizer; @@ -242823,8 +257971,8 @@ static int fts5PorterTokenize( sCtx.xToken = xToken; sCtx.pCtx = pCtx; sCtx.aBuf = p->aBuf; - return p->tokenizer.xTokenize( - p->pTokenizer, (void*)&sCtx, flags, pText, nText, fts5PorterCb + return p->tokenizer_v2.xTokenize( + p->pTokenizer, (void*)&sCtx, flags, pText, nText, pLoc, nLoc, fts5PorterCb ); } @@ -242834,6 +257982,7 @@ static int fts5PorterTokenize( typedef struct TrigramTokenizer TrigramTokenizer; struct TrigramTokenizer { int bFold; /* True to fold to lower-case */ + int iFoldParam; /* Parameter to pass to Fts5UnicodeFold() */ }; /* @@ -242853,28 +258002,46 @@ static int fts5TriCreate( Fts5Tokenizer **ppOut ){ int rc = SQLITE_OK; - TrigramTokenizer *pNew = (TrigramTokenizer*)sqlite3_malloc(sizeof(*pNew)); + TrigramTokenizer *pNew = 0; UNUSED_PARAM(pUnused); - if( pNew==0 ){ - rc = SQLITE_NOMEM; + if( nArg%2 ){ + rc = SQLITE_ERROR; }else{ int i; - pNew->bFold = 1; - for(i=0; rc==SQLITE_OK && ibFold = 1; + pNew->iFoldParam = 0; + + for(i=0; rc==SQLITE_OK && ibFold = (zArg[0]=='0'); + } + }else if( 0==sqlite3_stricmp(azArg[i], "remove_diacritics") ){ + if( (zArg[0]!='0' && zArg[0]!='1' && zArg[0]!='2') || zArg[1] ){ + rc = SQLITE_ERROR; + }else{ + pNew->iFoldParam = (zArg[0]!='0') ? 2 : 0; + } }else{ - pNew->bFold = (zArg[0]=='0'); + rc = SQLITE_ERROR; } - }else{ + } + + if( pNew->iFoldParam!=0 && pNew->bFold==0 ){ rc = SQLITE_ERROR; } - } - if( rc!=SQLITE_OK ){ - fts5TriDelete((Fts5Tokenizer*)pNew); - pNew = 0; + + if( rc!=SQLITE_OK ){ + fts5TriDelete((Fts5Tokenizer*)pNew); + pNew = 0; + } } } *ppOut = (Fts5Tokenizer*)pNew; @@ -242894,40 +258061,62 @@ static int fts5TriTokenize( TrigramTokenizer *p = (TrigramTokenizer*)pTok; int rc = SQLITE_OK; char aBuf[32]; + char *zOut = aBuf; + int ii; const unsigned char *zIn = (const unsigned char*)pText; const unsigned char *zEof = &zIn[nText]; u32 iCode; + int aStart[3]; /* Input offset of each character in aBuf[] */ UNUSED_PARAM(unusedFlags); - while( 1 ){ - char *zOut = aBuf; - int iStart = zIn - (const unsigned char*)pText; - const unsigned char *zNext; - - READ_UTF8(zIn, zEof, iCode); - if( iCode==0 ) break; - zNext = zIn; - if( zInbFold ) iCode = sqlite3Fts5UnicodeFold(iCode, 0); - WRITE_UTF8(zOut, iCode); + + /* Populate aBuf[] with the characters for the first trigram. */ + for(ii=0; ii<3; ii++){ + do { + aStart[ii] = zIn - (const unsigned char*)pText; READ_UTF8(zIn, zEof, iCode); - if( iCode==0 ) break; - }else{ - break; - } - if( zInbFold ) iCode = sqlite3Fts5UnicodeFold(iCode, 0); - WRITE_UTF8(zOut, iCode); + if( iCode==0 ) return SQLITE_OK; + if( p->bFold ) iCode = sqlite3Fts5UnicodeFold(iCode, p->iFoldParam); + }while( iCode==0 ); + WRITE_UTF8(zOut, iCode); + } + + /* At the start of each iteration of this loop: + ** + ** aBuf: Contains 3 characters. The 3 characters of the next trigram. + ** zOut: Points to the byte following the last character in aBuf. + ** aStart[3]: Contains the byte offset in the input text corresponding + ** to the start of each of the three characters in the buffer. + */ + assert( zIn<=zEof ); + while( 1 ){ + int iNext; /* Start of character following current tri */ + const char *z1; + + /* Read characters from the input up until the first non-diacritic */ + do { + iNext = zIn - (const unsigned char*)pText; READ_UTF8(zIn, zEof, iCode); if( iCode==0 ) break; - if( p->bFold ) iCode = sqlite3Fts5UnicodeFold(iCode, 0); - WRITE_UTF8(zOut, iCode); - }else{ - break; - } - rc = xToken(pCtx, 0, aBuf, zOut-aBuf, iStart, iStart + zOut-aBuf); - if( rc!=SQLITE_OK ) break; - zIn = zNext; + if( p->bFold ) iCode = sqlite3Fts5UnicodeFold(iCode, p->iFoldParam); + }while( iCode==0 ); + + /* Pass the current trigram back to fts5 */ + rc = xToken(pCtx, 0, aBuf, zOut-aBuf, aStart[0], iNext); + if( iCode==0 || rc!=SQLITE_OK ) break; + + /* Remove the first character from buffer aBuf[]. Append the character + ** with codepoint iCode. */ + z1 = aBuf; + FTS5_SKIP_UTF8(z1); + memmove(aBuf, z1, zOut - z1); + zOut -= (z1 - aBuf); + WRITE_UTF8(zOut, iCode); + + /* Update the aStart[] array */ + aStart[0] = aStart[1]; + aStart[1] = aStart[2]; + aStart[2] = iNext; } return rc; @@ -242950,11 +258139,23 @@ static int sqlite3Fts5TokenizerPattern( ){ if( xCreate==fts5TriCreate ){ TrigramTokenizer *p = (TrigramTokenizer*)pTok; - return p->bFold ? FTS5_PATTERN_LIKE : FTS5_PATTERN_GLOB; + if( p->iFoldParam==0 ){ + return p->bFold ? FTS5_PATTERN_LIKE : FTS5_PATTERN_GLOB; + } } return FTS5_PATTERN_NONE; } +/* +** Return true if the tokenizer described by p->azArg[] is the trigram +** tokenizer. This tokenizer needs to be loaded before xBestIndex is +** called for the first time in order to correctly handle LIKE/GLOB. +*/ +static int sqlite3Fts5TokenizerPreload(Fts5TokenizerConfig *p){ + return (p->nArg>=1 && 0==sqlite3_stricmp(p->azArg[0], "trigram")); +} + + /* ** Register all built-in tokenizers with FTS5. */ @@ -242965,7 +258166,6 @@ static int sqlite3Fts5TokenizerInit(fts5_api *pApi){ } aBuiltin[] = { { "unicode61", {fts5UnicodeCreate, fts5UnicodeDelete, fts5UnicodeTokenize}}, { "ascii", {fts5AsciiCreate, fts5AsciiDelete, fts5AsciiTokenize }}, - { "porter", {fts5PorterCreate, fts5PorterDelete, fts5PorterTokenize }}, { "trigram", {fts5TriCreate, fts5TriDelete, fts5TriTokenize}}, }; @@ -242980,7 +258180,20 @@ static int sqlite3Fts5TokenizerInit(fts5_api *pApi){ 0 ); } - + if( rc==SQLITE_OK ){ + fts5_tokenizer_v2 sPorter = { + 2, + fts5PorterCreate, + fts5PorterDelete, + fts5PorterTokenize + }; + rc = pApi->xCreateTokenizer_v2(pApi, + "porter", + (void*)pApi, + &sPorter, + 0 + ); + } return rc; } @@ -243350,6 +258563,9 @@ static int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){ default: return 1; } break; + + default: + return 1; } return 0; } @@ -244174,6 +259390,7 @@ struct Fts5VocabCursor { int nLeTerm; /* Size of zLeTerm in bytes */ char *zLeTerm; /* (term <= $zLeTerm) paramater, or NULL */ + int colUsed; /* Copy of sqlite3_index_info.colUsed */ /* These are used by 'col' tables only */ int iCol; @@ -244200,9 +259417,11 @@ struct Fts5VocabCursor { /* ** Bits for the mask used as the idxNum value by xBestIndex/xFilter. */ -#define FTS5_VOCAB_TERM_EQ 0x01 -#define FTS5_VOCAB_TERM_GE 0x02 -#define FTS5_VOCAB_TERM_LE 0x04 +#define FTS5_VOCAB_TERM_EQ 0x0100 +#define FTS5_VOCAB_TERM_GE 0x0200 +#define FTS5_VOCAB_TERM_LE 0x0400 + +#define FTS5_VOCAB_COLUSED_MASK 0xFF /* @@ -244379,11 +259598,13 @@ static int fts5VocabBestIndexMethod( int iTermEq = -1; int iTermGe = -1; int iTermLe = -1; - int idxNum = 0; + int idxNum = (int)pInfo->colUsed; int nArg = 0; UNUSED_PARAM(pUnused); + assert( (pInfo->colUsed & FTS5_VOCAB_COLUSED_MASK)==pInfo->colUsed ); + for(i=0; inConstraint; i++){ struct sqlite3_index_constraint *p = &pInfo->aConstraint[i]; if( p->usable==0 ) continue; @@ -244475,7 +259696,7 @@ static int fts5VocabOpenMethod( if( rc==SQLITE_OK ){ pVTab->zErrMsg = sqlite3_mprintf( "no such fts5 table: %s.%s", pTab->zFts5Db, pTab->zFts5Tbl - ); + ); rc = SQLITE_ERROR; } }else{ @@ -244635,9 +259856,19 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ switch( pTab->eType ){ case FTS5_VOCAB_ROW: - if( eDetail==FTS5_DETAIL_FULL ){ - while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff, &iPos) ){ - pCsr->aCnt[0]++; + /* Do not bother counting the number of instances if the "cnt" + ** column is not being read (according to colUsed). */ + if( eDetail==FTS5_DETAIL_FULL && (pCsr->colUsed & 0x04) ){ + while( iPosaCnt[] */ + pCsr->aCnt[0]++; + } } } pCsr->aDoc[0]++; @@ -244735,11 +259966,12 @@ static int fts5VocabFilterMethod( if( idxNum & FTS5_VOCAB_TERM_EQ ) pEq = apVal[iVal++]; if( idxNum & FTS5_VOCAB_TERM_GE ) pGe = apVal[iVal++]; if( idxNum & FTS5_VOCAB_TERM_LE ) pLe = apVal[iVal++]; + pCsr->colUsed = (idxNum & FTS5_VOCAB_COLUSED_MASK); if( pEq ){ zTerm = (const char *)sqlite3_value_text(pEq); nTerm = sqlite3_value_bytes(pEq); - f = 0; + f = FTS5INDEX_QUERY_NOTOKENDATA; }else{ if( pGe ){ zTerm = (const char *)sqlite3_value_text(pGe); @@ -244893,7 +260125,8 @@ static int sqlite3Fts5VocabInit(Fts5Global *pGlobal, sqlite3 *db){ /* xSavepoint */ 0, /* xRelease */ 0, /* xRollbackTo */ 0, - /* xShadowName */ 0 + /* xShadowName */ 0, + /* xIntegrity */ 0 }; void *p = (void*)pGlobal; @@ -244901,7 +260134,7 @@ static int sqlite3Fts5VocabInit(Fts5Global *pGlobal, sqlite3 *db){ } - +/* Here ends the fts5.c composite file. */ #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5) */ /************** End of fts5.c ************************************************/ @@ -245222,6 +260455,7 @@ static sqlite3_module stmtModule = { 0, /* xRelease */ 0, /* xRollbackTo */ 0, /* xShadowName */ + 0 /* xIntegrity */ }; #endif /* SQLITE_OMIT_VIRTUALTABLE */ diff --git a/graalpython/com.oracle.graal.python.cext/modules/_sqlite/sqlite/sqlite3.h b/graalpython/com.oracle.graal.python.cext/modules/_sqlite/sqlite/sqlite3.h index 9be49b1688..d8ce1482a3 100644 --- a/graalpython/com.oracle.graal.python.cext/modules/_sqlite/sqlite/sqlite3.h +++ b/graalpython/com.oracle.graal.python.cext/modules/_sqlite/sqlite/sqlite3.h @@ -146,9 +146,9 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.41.2" -#define SQLITE_VERSION_NUMBER 3041002 -#define SQLITE_SOURCE_ID "2023-03-22 11:56:21 0d1fc92f94cb6b76bffe3ec34d69cffde2924203304e8ffc4155597af0c191da" +#define SQLITE_VERSION "3.47.2" +#define SQLITE_VERSION_NUMBER 3047002 +#define SQLITE_SOURCE_ID "2024-12-07 20:39:59 2aabe05e2e8cae4847a802ee2daddc1d7413d8fc560254d93ee3e72c14685b6c" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -182,10 +182,7 @@ extern "C" { ** ** See also: [sqlite_version()] and [sqlite_source_id()]. */ -/* -* GraalPy change: avoid unresolved symbol "sqlite3_version" -*/ -// SQLITE_API SQLITE_EXTERN const char sqlite3_version[]; +SQLITE_API SQLITE_EXTERN const char sqlite3_version[]; SQLITE_API const char *sqlite3_libversion(void); SQLITE_API const char *sqlite3_sourceid(void); SQLITE_API int sqlite3_libversion_number(void); @@ -423,6 +420,8 @@ typedef int (*sqlite3_callback)(void*,int,char**, char**); ** the 1st parameter to sqlite3_exec() while sqlite3_exec() is running. **
    4. The application must not modify the SQL statement text passed into ** the 2nd parameter of sqlite3_exec() while sqlite3_exec() is running. +**
    5. The application must not dereference the arrays or string pointers +** passed as the 3rd and 4th callback parameters after it returns. ** */ SQLITE_API int sqlite3_exec( @@ -531,6 +530,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8)) #define SQLITE_IOERR_DATA (SQLITE_IOERR | (32<<8)) #define SQLITE_IOERR_CORRUPTFS (SQLITE_IOERR | (33<<8)) +#define SQLITE_IOERR_IN_PAGE (SQLITE_IOERR | (34<<8)) #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) #define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8)) #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) @@ -652,6 +652,13 @@ SQLITE_API int sqlite3_exec( ** filesystem supports doing multiple write operations atomically when those ** write operations are bracketed by [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] and ** [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]. +** +** The SQLITE_IOCAP_SUBPAGE_READ property means that it is ok to read +** from the database file in amounts that are not a multiple of the +** page size and that do not begin at a page boundary. Without this +** property, SQLite is careful to only do full-page reads and write +** on aligned pages, with the one exception that it will do a sub-page +** read of the first page to access the database header. */ #define SQLITE_IOCAP_ATOMIC 0x00000001 #define SQLITE_IOCAP_ATOMIC512 0x00000002 @@ -668,6 +675,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 #define SQLITE_IOCAP_IMMUTABLE 0x00002000 #define SQLITE_IOCAP_BATCH_ATOMIC 0x00004000 +#define SQLITE_IOCAP_SUBPAGE_READ 0x00008000 /* ** CAPI3REF: File Locking Levels @@ -764,16 +772,16 @@ struct sqlite3_file { ** ** xLock() upgrades the database file lock. In other words, xLock() moves the ** database file lock in the direction NONE toward EXCLUSIVE. The argument to -** xLock() is always on of SHARED, RESERVED, PENDING, or EXCLUSIVE, never +** xLock() is always one of SHARED, RESERVED, PENDING, or EXCLUSIVE, never ** SQLITE_LOCK_NONE. If the database file lock is already at or above the ** requested lock, then the call to xLock() is a no-op. ** xUnlock() downgrades the database file lock to either SHARED or NONE. -* If the lock is already at or below the requested lock state, then the call +** If the lock is already at or below the requested lock state, then the call ** to xUnlock() is a no-op. ** The xCheckReservedLock() method checks whether any database connection, ** either in this process or in some other process, is holding a RESERVED, -** PENDING, or EXCLUSIVE lock on the file. It returns true -** if such a lock exists and false otherwise. +** PENDING, or EXCLUSIVE lock on the file. It returns, via its output +** pointer parameter, true if such a lock exists and false otherwise. ** ** The xFileControl() method is a generic interface that allows custom ** VFS implementations to directly control an open file using the @@ -814,6 +822,7 @@ struct sqlite3_file { **
    6. [SQLITE_IOCAP_POWERSAFE_OVERWRITE] **
    7. [SQLITE_IOCAP_IMMUTABLE] **
    8. [SQLITE_IOCAP_BATCH_ATOMIC] +**
    9. [SQLITE_IOCAP_SUBPAGE_READ] ** ** ** The SQLITE_IOCAP_ATOMIC property means that all writes of @@ -1193,7 +1202,7 @@ struct sqlite3_io_methods { ** by clients within the current process, only within other processes. ** **
    10. [[SQLITE_FCNTL_CKSM_FILE]] -** The [SQLITE_FCNTL_CKSM_FILE] opcode is for use interally by the +** The [SQLITE_FCNTL_CKSM_FILE] opcode is for use internally by the ** [checksum VFS shim] only. ** **
    11. [[SQLITE_FCNTL_RESET_CACHE]] @@ -1658,20 +1667,23 @@ SQLITE_API int sqlite3_os_end(void); ** must ensure that no other SQLite interfaces are invoked by other ** threads while sqlite3_config() is running. ** -** The sqlite3_config() interface -** may only be invoked prior to library initialization using -** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. -** ^If sqlite3_config() is called after [sqlite3_initialize()] and before -** [sqlite3_shutdown()] then it will return SQLITE_MISUSE. -** Note, however, that ^sqlite3_config() can be called as part of the -** implementation of an application-defined [sqlite3_os_init()]. -** ** The first argument to sqlite3_config() is an integer ** [configuration option] that determines ** what property of SQLite is to be configured. Subsequent arguments ** vary depending on the [configuration option] ** in the first argument. ** +** For most configuration options, the sqlite3_config() interface +** may only be invoked prior to library initialization using +** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. +** The exceptional configuration options that may be invoked at any time +** are called "anytime configuration options". +** ^If sqlite3_config() is called after [sqlite3_initialize()] and before +** [sqlite3_shutdown()] with a first argument that is not an anytime +** configuration option, then the sqlite3_config() call will return SQLITE_MISUSE. +** Note, however, that ^sqlite3_config() can be called as part of the +** implementation of an application-defined [sqlite3_os_init()]. +** ** ^When a configuration option is set, sqlite3_config() returns [SQLITE_OK]. ** ^If the option is unknown or SQLite is unable to set the option ** then this routine returns a non-zero [error code]. @@ -1779,6 +1791,23 @@ struct sqlite3_mem_methods { ** These constants are the available integer configuration options that ** can be passed as the first argument to the [sqlite3_config()] interface. ** +** Most of the configuration options for sqlite3_config() +** will only work if invoked prior to [sqlite3_initialize()] or after +** [sqlite3_shutdown()]. The few exceptions to this rule are called +** "anytime configuration options". +** ^Calling [sqlite3_config()] with a first argument that is not an +** anytime configuration option in between calls to [sqlite3_initialize()] and +** [sqlite3_shutdown()] is a no-op that returns SQLITE_MISUSE. +** +** The set of anytime configuration options can change (by insertions +** and/or deletions) from one release of SQLite to the next. +** As of SQLite version 3.42.0, the complete set of anytime configuration +** options is: +**
        +**
      • SQLITE_CONFIG_LOG +**
      • SQLITE_CONFIG_PCACHE_HDRSZ +**
      +** ** New configuration options may be added in future releases of SQLite. ** Existing configuration options might be discontinued. Applications ** should check the return code from [sqlite3_config()] to make sure that @@ -2109,7 +2138,7 @@ struct sqlite3_mem_methods { ** is stored in each sorted record and the required column values loaded ** from the database as records are returned in sorted order. The default ** value for this option is to never use this optimization. Specifying a -** negative value for this option restores the default behaviour. +** negative value for this option restores the default behavior. ** This option is only available if SQLite is compiled with the ** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option. ** @@ -2123,30 +2152,46 @@ struct sqlite3_mem_methods { ** configuration setting is never used, then the default maximum is determined ** by the [SQLITE_MEMDB_DEFAULT_MAXSIZE] compile-time option. If that ** compile-time option is not set, then the default maximum is 1073741824. +** +** [[SQLITE_CONFIG_ROWID_IN_VIEW]] +**
      SQLITE_CONFIG_ROWID_IN_VIEW +**
      The SQLITE_CONFIG_ROWID_IN_VIEW option enables or disables the ability +** for VIEWs to have a ROWID. The capability can only be enabled if SQLite is +** compiled with -DSQLITE_ALLOW_ROWID_IN_VIEW, in which case the capability +** defaults to on. This configuration option queries the current setting or +** changes the setting to off or on. The argument is a pointer to an integer. +** If that integer initially holds a value of 1, then the ability for VIEWs to +** have ROWIDs is activated. If the integer initially holds zero, then the +** ability is deactivated. Any other initial value for the integer leaves the +** setting unchanged. After changes, if any, the integer is written with +** a 1 or 0, if the ability for VIEWs to have ROWIDs is on or off. If SQLite +** is compiled without -DSQLITE_ALLOW_ROWID_IN_VIEW (which is the usual and +** recommended case) then the integer is always filled with zero, regardless +** if its initial value. ** */ -#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ -#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */ -#define SQLITE_CONFIG_SERIALIZED 3 /* nil */ -#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */ -#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */ -#define SQLITE_CONFIG_SCRATCH 6 /* No longer used */ -#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */ -#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */ -#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ -#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */ -#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ -/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ -#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ -#define SQLITE_CONFIG_PCACHE 14 /* no-op */ -#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */ -#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */ -#define SQLITE_CONFIG_URI 17 /* int */ -#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */ -#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */ +#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ +#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */ +#define SQLITE_CONFIG_SERIALIZED 3 /* nil */ +#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_SCRATCH 6 /* No longer used */ +#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */ +#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */ +#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ +#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */ +#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ +/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ +#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ +#define SQLITE_CONFIG_PCACHE 14 /* no-op */ +#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */ +#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */ +#define SQLITE_CONFIG_URI 17 /* int */ +#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */ +#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */ #define SQLITE_CONFIG_COVERING_INDEX_SCAN 20 /* int */ -#define SQLITE_CONFIG_SQLLOG 21 /* xSqllog, void* */ -#define SQLITE_CONFIG_MMAP_SIZE 22 /* sqlite3_int64, sqlite3_int64 */ +#define SQLITE_CONFIG_SQLLOG 21 /* xSqllog, void* */ +#define SQLITE_CONFIG_MMAP_SIZE 22 /* sqlite3_int64, sqlite3_int64 */ #define SQLITE_CONFIG_WIN32_HEAPSIZE 23 /* int nByte */ #define SQLITE_CONFIG_PCACHE_HDRSZ 24 /* int *psz */ #define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */ @@ -2154,6 +2199,7 @@ struct sqlite3_mem_methods { #define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */ #define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */ #define SQLITE_CONFIG_MEMDB_MAXSIZE 29 /* sqlite3_int64 */ +#define SQLITE_CONFIG_ROWID_IN_VIEW 30 /* int* */ /* ** CAPI3REF: Database Connection Configuration Options @@ -2284,7 +2330,7 @@ struct sqlite3_mem_methods { ** database handle, SQLite checks if this will mean that there are now no ** connections at all to the database. If so, it performs a checkpoint ** operation before closing the connection. This option may be used to -** override this behaviour. The first parameter passed to this operation +** override this behavior. The first parameter passed to this operation ** is an integer - positive to disable checkpoints-on-close, or zero (the ** default) to enable them, and negative to leave the setting unchanged. ** The second parameter is a pointer to an integer @@ -2381,7 +2427,7 @@ struct sqlite3_mem_methods { **
      ** ** [[SQLITE_DBCONFIG_DQS_DML]] -**
      SQLITE_DBCONFIG_DQS_DML +**
      SQLITE_DBCONFIG_DQS_DML
      **
      The SQLITE_DBCONFIG_DQS_DML option activates or deactivates ** the legacy [double-quoted string literal] misfeature for DML statements ** only, that is DELETE, INSERT, SELECT, and UPDATE statements. The @@ -2390,7 +2436,7 @@ struct sqlite3_mem_methods { **
      ** ** [[SQLITE_DBCONFIG_DQS_DDL]] -**
      SQLITE_DBCONFIG_DQS_DDL +**
      SQLITE_DBCONFIG_DQS_DDL
      **
      The SQLITE_DBCONFIG_DQS option activates or deactivates ** the legacy [double-quoted string literal] misfeature for DDL statements, ** such as CREATE TABLE and CREATE INDEX. The @@ -2399,7 +2445,7 @@ struct sqlite3_mem_methods { **
      ** ** [[SQLITE_DBCONFIG_TRUSTED_SCHEMA]] -**
      SQLITE_DBCONFIG_TRUSTED_SCHEMA +**
      SQLITE_DBCONFIG_TRUSTED_SCHEMA
      **
      The SQLITE_DBCONFIG_TRUSTED_SCHEMA option tells SQLite to ** assume that database schemas are untainted by malicious content. ** When the SQLITE_DBCONFIG_TRUSTED_SCHEMA option is disabled, SQLite @@ -2419,7 +2465,7 @@ struct sqlite3_mem_methods { **
      ** ** [[SQLITE_DBCONFIG_LEGACY_FILE_FORMAT]] -**
      SQLITE_DBCONFIG_LEGACY_FILE_FORMAT +**
      SQLITE_DBCONFIG_LEGACY_FILE_FORMAT
      **
      The SQLITE_DBCONFIG_LEGACY_FILE_FORMAT option activates or deactivates ** the legacy file format flag. When activated, this flag causes all newly ** created database file to have a schema format version number (the 4-byte @@ -2428,7 +2474,7 @@ struct sqlite3_mem_methods { ** any SQLite version back to 3.0.0 ([dateof:3.0.0]). Without this setting, ** newly created databases are generally not understandable by SQLite versions ** prior to 3.3.0 ([dateof:3.3.0]). As these words are written, there -** is now scarcely any need to generated database files that are compatible +** is now scarcely any need to generate database files that are compatible ** all the way back to version 3.0.0, and so this setting is of little ** practical use, but is provided so that SQLite can continue to claim the ** ability to generate new database files that are compatible with version @@ -2437,8 +2483,40 @@ struct sqlite3_mem_methods { ** the [VACUUM] command will fail with an obscure error when attempting to ** process a table with generated columns and a descending index. This is ** not considered a bug since SQLite versions 3.3.0 and earlier do not support -** either generated columns or decending indexes. +** either generated columns or descending indexes. **
      +** +** [[SQLITE_DBCONFIG_STMT_SCANSTATUS]] +**
      SQLITE_DBCONFIG_STMT_SCANSTATUS
      +**
      The SQLITE_DBCONFIG_STMT_SCANSTATUS option is only useful in +** SQLITE_ENABLE_STMT_SCANSTATUS builds. In this case, it sets or clears +** a flag that enables collection of the sqlite3_stmt_scanstatus_v2() +** statistics. For statistics to be collected, the flag must be set on +** the database handle both when the SQL statement is prepared and when it +** is stepped. The flag is set (collection of statistics is enabled) +** by default. This option takes two arguments: an integer and a pointer to +** an integer.. The first argument is 1, 0, or -1 to enable, disable, or +** leave unchanged the statement scanstatus option. If the second argument +** is not NULL, then the value of the statement scanstatus setting after +** processing the first argument is written into the integer that the second +** argument points to. +**
      +** +** [[SQLITE_DBCONFIG_REVERSE_SCANORDER]] +**
      SQLITE_DBCONFIG_REVERSE_SCANORDER
      +**
      The SQLITE_DBCONFIG_REVERSE_SCANORDER option changes the default order +** in which tables and indexes are scanned so that the scans start at the end +** and work toward the beginning rather than starting at the beginning and +** working toward the end. Setting SQLITE_DBCONFIG_REVERSE_SCANORDER is the +** same as setting [PRAGMA reverse_unordered_selects]. This option takes +** two arguments which are an integer and a pointer to an integer. The first +** argument is 1, 0, or -1 to enable, disable, or leave unchanged the +** reverse scan order flag, respectively. If the second argument is not NULL, +** then 0 or 1 is written into the integer that the second argument points to +** depending on if the reverse scan order flag is set after processing the +** first argument. +**
      +** ** */ #define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ @@ -2459,7 +2537,9 @@ struct sqlite3_mem_methods { #define SQLITE_DBCONFIG_ENABLE_VIEW 1015 /* int int* */ #define SQLITE_DBCONFIG_LEGACY_FILE_FORMAT 1016 /* int int* */ #define SQLITE_DBCONFIG_TRUSTED_SCHEMA 1017 /* int int* */ -#define SQLITE_DBCONFIG_MAX 1017 /* Largest DBCONFIG */ +#define SQLITE_DBCONFIG_STMT_SCANSTATUS 1018 /* int int* */ +#define SQLITE_DBCONFIG_REVERSE_SCANORDER 1019 /* int int* */ +#define SQLITE_DBCONFIG_MAX 1019 /* Largest DBCONFIG */ /* ** CAPI3REF: Enable Or Disable Extended Result Codes @@ -2684,6 +2764,7 @@ SQLITE_API sqlite3_int64 sqlite3_total_changes64(sqlite3*); ** ** ^The [sqlite3_is_interrupted(D)] interface can be used to determine whether ** or not an interrupt is currently in effect for [database connection] D. +** It returns 1 if an interrupt is currently in effect, or 0 otherwise. */ SQLITE_API void sqlite3_interrupt(sqlite3*); SQLITE_API int sqlite3_is_interrupted(sqlite3*); @@ -3233,8 +3314,8 @@ SQLITE_API int sqlite3_set_authorizer( #define SQLITE_RECURSIVE 33 /* NULL NULL */ /* -** CAPI3REF: Tracing And Profiling Functions -** METHOD: sqlite3 +** CAPI3REF: Deprecated Tracing And Profiling Functions +** DEPRECATED ** ** These routines are deprecated. Use the [sqlite3_trace_v2()] interface ** instead of the routines described here. @@ -3337,8 +3418,10 @@ SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*, ** M argument should be the bitwise OR-ed combination of ** zero or more [SQLITE_TRACE] constants. ** -** ^Each call to either sqlite3_trace() or sqlite3_trace_v2() overrides -** (cancels) any prior calls to sqlite3_trace() or sqlite3_trace_v2(). +** ^Each call to either sqlite3_trace(D,X,P) or sqlite3_trace_v2(D,M,X,P) +** overrides (cancels) all prior calls to sqlite3_trace(D,X,P) or +** sqlite3_trace_v2(D,M,X,P) for the [database connection] D. Each +** database connection may have at most one trace callback. ** ** ^The X callback is invoked whenever any of the events identified by ** mask M occur. ^The integer return value from the callback is currently @@ -3496,8 +3579,8 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** ** [[OPEN_EXRESCODE]] ^(
      [SQLITE_OPEN_EXRESCODE]
      **
      The database connection comes up in "extended result code mode". -** In other words, the database behaves has if -** [sqlite3_extended_result_codes(db,1)] where called on the database +** In other words, the database behaves as if +** [sqlite3_extended_result_codes(db,1)] were called on the database ** connection as soon as the connection is created. In addition to setting ** the extended result code mode, this flag also causes [sqlite3_open_v2()] ** to return an extended result code.
      @@ -3707,7 +3790,7 @@ SQLITE_API int sqlite3_open_v2( ** as F) must be one of: **
        **
      • A database filename pointer created by the SQLite core and -** passed into the xOpen() method of a VFS implemention, or +** passed into the xOpen() method of a VFS implementation, or **
      • A filename obtained from [sqlite3_db_filename()], or **
      • A new filename constructed using [sqlite3_create_filename()]. **
      @@ -3820,7 +3903,7 @@ SQLITE_API sqlite3_file *sqlite3_database_file_object(const char*); /* ** CAPI3REF: Create and Destroy VFS Filenames ** -** These interfces are provided for use by [VFS shim] implementations and +** These interfaces are provided for use by [VFS shim] implementations and ** are not useful outside of that context. ** ** The sqlite3_create_filename(D,J,W,N,P) allocates memory to hold a version of @@ -3899,14 +3982,17 @@ SQLITE_API void sqlite3_free_filename(sqlite3_filename); ** ** ** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language -** text that describes the error, as either UTF-8 or UTF-16 respectively. +** text that describes the error, as either UTF-8 or UTF-16 respectively, +** or NULL if no error message is available. +** (See how SQLite handles [invalid UTF] for exceptions to this rule.) ** ^(Memory to hold the error message string is managed internally. ** The application does not need to worry about freeing the result. ** However, the error string might be overwritten or deallocated by ** subsequent calls to other SQLite interface functions.)^ ** -** ^The sqlite3_errstr() interface returns the English-language text -** that describes the [result code], as UTF-8. +** ^The sqlite3_errstr(E) interface returns the English-language text +** that describes the [result code] E, as UTF-8, or NULL if E is not an +** result code for which a text error message is available. ** ^(Memory to hold the error message string is managed internally ** and must not be freed by the application)^. ** @@ -4145,13 +4231,17 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** and sqlite3_prepare16_v3() use UTF-16. ** ** ^If the nByte argument is negative, then zSql is read up to the -** first zero terminator. ^If nByte is positive, then it is the -** number of bytes read from zSql. ^If nByte is zero, then no prepared +** first zero terminator. ^If nByte is positive, then it is the maximum +** number of bytes read from zSql. When nByte is positive, zSql is read +** up to the first zero terminator or until the nByte bytes have been read, +** whichever comes first. ^If nByte is zero, then no prepared ** statement is generated. ** If the caller knows that the supplied string is nul-terminated, then ** there is a small performance advantage to passing an nByte parameter that ** is the number of bytes in the input string including ** the nul-terminator. +** Note that nByte measure the length of the input in bytes, not +** characters, even for the UTF-16 interfaces. ** ** ^If pzTail is not NULL then *pzTail is made to point to the first byte ** past the end of the first SQL statement in zSql. These routines only @@ -4367,6 +4457,41 @@ SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); */ SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt); +/* +** CAPI3REF: Change The EXPLAIN Setting For A Prepared Statement +** METHOD: sqlite3_stmt +** +** The sqlite3_stmt_explain(S,E) interface changes the EXPLAIN +** setting for [prepared statement] S. If E is zero, then S becomes +** a normal prepared statement. If E is 1, then S behaves as if +** its SQL text began with "[EXPLAIN]". If E is 2, then S behaves as if +** its SQL text began with "[EXPLAIN QUERY PLAN]". +** +** Calling sqlite3_stmt_explain(S,E) might cause S to be reprepared. +** SQLite tries to avoid a reprepare, but a reprepare might be necessary +** on the first transition into EXPLAIN or EXPLAIN QUERY PLAN mode. +** +** Because of the potential need to reprepare, a call to +** sqlite3_stmt_explain(S,E) will fail with SQLITE_ERROR if S cannot be +** reprepared because it was created using [sqlite3_prepare()] instead of +** the newer [sqlite3_prepare_v2()] or [sqlite3_prepare_v3()] interfaces and +** hence has no saved SQL text with which to reprepare. +** +** Changing the explain setting for a prepared statement does not change +** the original SQL text for the statement. Hence, if the SQL text originally +** began with EXPLAIN or EXPLAIN QUERY PLAN, but sqlite3_stmt_explain(S,0) +** is called to convert the statement into an ordinary statement, the EXPLAIN +** or EXPLAIN QUERY PLAN keywords will still appear in the sqlite3_sql(S) +** output, even though the statement now acts like a normal SQL statement. +** +** This routine returns SQLITE_OK if the explain mode is successfully +** changed, or an error code if the explain mode could not be changed. +** The explain mode cannot be changed while a statement is active. +** Hence, it is good practice to call [sqlite3_reset(S)] +** immediately prior to calling sqlite3_stmt_explain(S,E). +*/ +SQLITE_API int sqlite3_stmt_explain(sqlite3_stmt *pStmt, int eMode); + /* ** CAPI3REF: Determine If A Prepared Statement Has Been Reset ** METHOD: sqlite3_stmt @@ -4530,7 +4655,7 @@ typedef struct sqlite3_context sqlite3_context; ** with it may be passed. ^It is called to dispose of the BLOB or string even ** if the call to the bind API fails, except the destructor is not called if ** the third parameter is a NULL pointer or the fourth parameter is negative. -** ^ (2) The special constant, [SQLITE_STATIC], may be passsed to indicate that +** ^ (2) The special constant, [SQLITE_STATIC], may be passed to indicate that ** the application remains responsible for disposing of the object. ^In this ** case, the object and the provided pointer to it must remain valid until ** either the prepared statement is finalized or the same SQL parameter is @@ -5209,20 +5334,33 @@ SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); ** ^The [sqlite3_reset(S)] interface resets the [prepared statement] S ** back to the beginning of its program. ** -** ^If the most recent call to [sqlite3_step(S)] for the -** [prepared statement] S returned [SQLITE_ROW] or [SQLITE_DONE], -** or if [sqlite3_step(S)] has never before been called on S, -** then [sqlite3_reset(S)] returns [SQLITE_OK]. +** ^The return code from [sqlite3_reset(S)] indicates whether or not +** the previous evaluation of prepared statement S completed successfully. +** ^If [sqlite3_step(S)] has never before been called on S or if +** [sqlite3_step(S)] has not been called since the previous call +** to [sqlite3_reset(S)], then [sqlite3_reset(S)] will return +** [SQLITE_OK]. ** ** ^If the most recent call to [sqlite3_step(S)] for the ** [prepared statement] S indicated an error, then ** [sqlite3_reset(S)] returns an appropriate [error code]. +** ^The [sqlite3_reset(S)] interface might also return an [error code] +** if there were no prior errors but the process of resetting +** the prepared statement caused a new error. ^For example, if an +** [INSERT] statement with a [RETURNING] clause is only stepped one time, +** that one call to [sqlite3_step(S)] might return SQLITE_ROW but +** the overall statement might still fail and the [sqlite3_reset(S)] call +** might return SQLITE_BUSY if locking constraints prevent the +** database change from committing. Therefore, it is important that +** applications check the return code from [sqlite3_reset(S)] even if +** no prior call to [sqlite3_step(S)] indicated a problem. ** ** ^The [sqlite3_reset(S)] interface does not change the values ** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S. */ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); + /* ** CAPI3REF: Create Or Redefine SQL Functions ** KEYWORDS: {function creation routines} @@ -5433,7 +5571,7 @@ SQLITE_API int sqlite3_create_window_function( ** [application-defined SQL function] ** that has side-effects or that could potentially leak sensitive information. ** This will prevent attacks in which an application is tricked -** into using a database file that has had its schema surreptiously +** into using a database file that has had its schema surreptitiously ** modified to invoke the application-defined function in ways that are ** harmful. **

      @@ -5469,13 +5607,36 @@ SQLITE_API int sqlite3_create_window_function( ** ** ** [[SQLITE_SUBTYPE]]

      SQLITE_SUBTYPE
      -** The SQLITE_SUBTYPE flag indicates to SQLite that a function may call +** The SQLITE_SUBTYPE flag indicates to SQLite that a function might call ** [sqlite3_value_subtype()] to inspect the sub-types of its arguments. -** Specifying this flag makes no difference for scalar or aggregate user -** functions. However, if it is not specified for a user-defined window -** function, then any sub-types belonging to arguments passed to the window -** function may be discarded before the window function is called (i.e. -** sqlite3_value_subtype() will always return 0). +** This flag instructs SQLite to omit some corner-case optimizations that +** might disrupt the operation of the [sqlite3_value_subtype()] function, +** causing it to return zero rather than the correct subtype(). +** All SQL functions that invoke [sqlite3_value_subtype()] should have this +** property. If the SQLITE_SUBTYPE property is omitted, then the return +** value from [sqlite3_value_subtype()] might sometimes be zero even though +** a non-zero subtype was specified by the function argument expression. +** +** [[SQLITE_RESULT_SUBTYPE]]
      SQLITE_RESULT_SUBTYPE
      +** The SQLITE_RESULT_SUBTYPE flag indicates to SQLite that a function might call +** [sqlite3_result_subtype()] to cause a sub-type to be associated with its +** result. +** Every function that invokes [sqlite3_result_subtype()] should have this +** property. If it does not, then the call to [sqlite3_result_subtype()] +** might become a no-op if the function is used as term in an +** [expression index]. On the other hand, SQL functions that never invoke +** [sqlite3_result_subtype()] should avoid setting this property, as the +** purpose of this property is to disable certain optimizations that are +** incompatible with subtypes. +** +** [[SQLITE_SELFORDER1]]
      SQLITE_SELFORDER1
      +** The SQLITE_SELFORDER1 flag indicates that the function is an aggregate +** that internally orders the values provided to the first argument. The +** ordered-set aggregate SQL notation with a single ORDER BY term can be +** used to invoke this function. If the ordered-set aggregate notation is +** used on a function that lacks this flag, then an error is raised. Note +** that the ordered-set aggregate syntax is only available if SQLite is +** built using the -DSQLITE_ENABLE_ORDERED_SET_AGGREGATES compile-time option. **
      ** */ @@ -5483,6 +5644,8 @@ SQLITE_API int sqlite3_create_window_function( #define SQLITE_DIRECTONLY 0x000080000 #define SQLITE_SUBTYPE 0x000100000 #define SQLITE_INNOCUOUS 0x000200000 +#define SQLITE_RESULT_SUBTYPE 0x001000000 +#define SQLITE_SELFORDER1 0x002000000 /* ** CAPI3REF: Deprecated Functions @@ -5679,6 +5842,12 @@ SQLITE_API int sqlite3_value_encoding(sqlite3_value*); ** information can be used to pass a limited amount of context from ** one SQL function to another. Use the [sqlite3_result_subtype()] ** routine to set the subtype for the return value of an SQL function. +** +** Every [application-defined SQL function] that invokes this interface +** should include the [SQLITE_SUBTYPE] property in the text +** encoding argument when the function is [sqlite3_create_function|registered]. +** If the [SQLITE_SUBTYPE] property is omitted, then sqlite3_value_subtype() +** might return zero instead of the upstream subtype in some corner cases. */ SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*); @@ -5777,48 +5946,56 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); ** METHOD: sqlite3_context ** ** These functions may be used by (non-aggregate) SQL functions to -** associate metadata with argument values. If the same value is passed to -** multiple invocations of the same SQL function during query execution, under -** some circumstances the associated metadata may be preserved. An example -** of where this might be useful is in a regular-expression matching -** function. The compiled version of the regular expression can be stored as -** metadata associated with the pattern string. +** associate auxiliary data with argument values. If the same argument +** value is passed to multiple invocations of the same SQL function during +** query execution, under some circumstances the associated auxiliary data +** might be preserved. An example of where this might be useful is in a +** regular-expression matching function. The compiled version of the regular +** expression can be stored as auxiliary data associated with the pattern string. ** Then as long as the pattern string remains the same, ** the compiled regular expression can be reused on multiple ** invocations of the same function. ** -** ^The sqlite3_get_auxdata(C,N) interface returns a pointer to the metadata +** ^The sqlite3_get_auxdata(C,N) interface returns a pointer to the auxiliary data ** associated by the sqlite3_set_auxdata(C,N,P,X) function with the Nth argument ** value to the application-defined function. ^N is zero for the left-most -** function argument. ^If there is no metadata +** function argument. ^If there is no auxiliary data ** associated with the function argument, the sqlite3_get_auxdata(C,N) interface ** returns a NULL pointer. ** -** ^The sqlite3_set_auxdata(C,N,P,X) interface saves P as metadata for the N-th -** argument of the application-defined function. ^Subsequent +** ^The sqlite3_set_auxdata(C,N,P,X) interface saves P as auxiliary data for the +** N-th argument of the application-defined function. ^Subsequent ** calls to sqlite3_get_auxdata(C,N) return P from the most recent -** sqlite3_set_auxdata(C,N,P,X) call if the metadata is still valid or -** NULL if the metadata has been discarded. +** sqlite3_set_auxdata(C,N,P,X) call if the auxiliary data is still valid or +** NULL if the auxiliary data has been discarded. ** ^After each call to sqlite3_set_auxdata(C,N,P,X) where X is not NULL, ** SQLite will invoke the destructor function X with parameter P exactly -** once, when the metadata is discarded. -** SQLite is free to discard the metadata at any time, including:
        +** once, when the auxiliary data is discarded. +** SQLite is free to discard the auxiliary data at any time, including:
          **
        • ^(when the corresponding function parameter changes)^, or **
        • ^(when [sqlite3_reset()] or [sqlite3_finalize()] is called for the ** SQL statement)^, or **
        • ^(when sqlite3_set_auxdata() is invoked again on the same ** parameter)^, or **
        • ^(during the original sqlite3_set_auxdata() call when a memory -** allocation error occurs.)^
        +** allocation error occurs.)^ +**
      • ^(during the original sqlite3_set_auxdata() call if the function +** is evaluated during query planning instead of during query execution, +** as sometimes happens with [SQLITE_ENABLE_STAT4].)^
      ** -** Note the last bullet in particular. The destructor X in +** Note the last two bullets in particular. The destructor X in ** sqlite3_set_auxdata(C,N,P,X) might be called immediately, before the ** sqlite3_set_auxdata() interface even returns. Hence sqlite3_set_auxdata() ** should be called near the end of the function implementation and the ** function implementation should not make any use of P after -** sqlite3_set_auxdata() has been called. -** -** ^(In practice, metadata is preserved between function calls for +** sqlite3_set_auxdata() has been called. Furthermore, a call to +** sqlite3_get_auxdata() that occurs immediately after a corresponding call +** to sqlite3_set_auxdata() might still return NULL if an out-of-memory +** condition occurred during the sqlite3_set_auxdata() call or if the +** function is being evaluated during query planning rather than during +** query execution. +** +** ^(In practice, auxiliary data is preserved between function calls for ** function parameters that are compile-time constants, including literal ** values and [parameters] and expressions composed from the same.)^ ** @@ -5828,10 +6005,67 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); ** ** These routines must be called from the same thread in which ** the SQL function is running. +** +** See also: [sqlite3_get_clientdata()] and [sqlite3_set_clientdata()]. */ SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N); SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*)); +/* +** CAPI3REF: Database Connection Client Data +** METHOD: sqlite3 +** +** These functions are used to associate one or more named pointers +** with a [database connection]. +** A call to sqlite3_set_clientdata(D,N,P,X) causes the pointer P +** to be attached to [database connection] D using name N. Subsequent +** calls to sqlite3_get_clientdata(D,N) will return a copy of pointer P +** or a NULL pointer if there were no prior calls to +** sqlite3_set_clientdata() with the same values of D and N. +** Names are compared using strcmp() and are thus case sensitive. +** +** If P and X are both non-NULL, then the destructor X is invoked with +** argument P on the first of the following occurrences: +**
        +**
      • An out-of-memory error occurs during the call to +** sqlite3_set_clientdata() which attempts to register pointer P. +**
      • A subsequent call to sqlite3_set_clientdata(D,N,P,X) is made +** with the same D and N parameters. +**
      • The database connection closes. SQLite does not make any guarantees +** about the order in which destructors are called, only that all +** destructors will be called exactly once at some point during the +** database connection closing process. +**
      +** +** SQLite does not do anything with client data other than invoke +** destructors on the client data at the appropriate time. The intended +** use for client data is to provide a mechanism for wrapper libraries +** to store additional information about an SQLite database connection. +** +** There is no limit (other than available memory) on the number of different +** client data pointers (with different names) that can be attached to a +** single database connection. However, the implementation is optimized +** for the case of having only one or two different client data names. +** Applications and wrapper libraries are discouraged from using more than +** one client data name each. +** +** There is no way to enumerate the client data pointers +** associated with a database connection. The N parameter can be thought +** of as a secret key such that only code that knows the secret key is able +** to access the associated data. +** +** Security Warning: These interfaces should not be exposed in scripting +** languages or in other circumstances where it might be possible for an +** an attacker to invoke them. Any agent that can invoke these interfaces +** can probably also take control of the process. +** +** Database connection client data is only available for SQLite +** version 3.44.0 ([dateof:3.44.0]) and later. +** +** See also: [sqlite3_set_auxdata()] and [sqlite3_get_auxdata()]. +*/ +SQLITE_API void *sqlite3_get_clientdata(sqlite3*,const char*); +SQLITE_API int sqlite3_set_clientdata(sqlite3*, const char*, void*, void(*)(void*)); /* ** CAPI3REF: Constants Defining Special Destructor Behavior @@ -6033,6 +6267,20 @@ SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context*, sqlite3_uint64 n); ** higher order bits are discarded. ** The number of subtype bytes preserved by SQLite might increase ** in future releases of SQLite. +** +** Every [application-defined SQL function] that invokes this interface +** should include the [SQLITE_RESULT_SUBTYPE] property in its +** text encoding argument when the SQL function is +** [sqlite3_create_function|registered]. If the [SQLITE_RESULT_SUBTYPE] +** property is omitted from the function that invokes sqlite3_result_subtype(), +** then in some cases the sqlite3_result_subtype() might fail to set +** the result subtype. +** +** If SQLite is compiled with -DSQLITE_STRICT_SUBTYPE=1, then any +** SQL function that invokes the sqlite3_result_subtype() interface +** and that does not have the SQLITE_RESULT_SUBTYPE property will raise +** an error. Future versions of SQLite might enable -DSQLITE_STRICT_SUBTYPE=1 +** by default. */ SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int); @@ -6204,6 +6452,13 @@ SQLITE_API void sqlite3_activate_cerod( ** of the default VFS is not implemented correctly, or not implemented at ** all, then the behavior of sqlite3_sleep() may deviate from the description ** in the previous paragraphs. +** +** If a negative argument is passed to sqlite3_sleep() the results vary by +** VFS and operating system. Some system treat a negative argument as an +** instruction to sleep forever. Others understand it to mean do not sleep +** at all. ^In SQLite version 3.42.0 and later, a negative +** argument passed into sqlite3_sleep() is changed to zero before it is relayed +** down into the xSleep method of the VFS. */ SQLITE_API int sqlite3_sleep(int); @@ -6457,7 +6712,7 @@ SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName); SQLITE_API int sqlite3_txn_state(sqlite3*,const char *zSchema); /* -** CAPI3REF: Allowed return values from [sqlite3_txn_state()] +** CAPI3REF: Allowed return values from sqlite3_txn_state() ** KEYWORDS: {transaction state} ** ** These constants define the current transaction state of a database file. @@ -6589,7 +6844,7 @@ SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); ** ^Each call to the sqlite3_autovacuum_pages() interface overrides all ** previous invocations for that database connection. ^If the callback ** argument (C) to sqlite3_autovacuum_pages(D,C,P,X) is a NULL pointer, -** then the autovacuum steps callback is cancelled. The return value +** then the autovacuum steps callback is canceled. The return value ** from sqlite3_autovacuum_pages() is normally SQLITE_OK, but might ** be some other error code if something goes wrong. The current ** implementation will only return SQLITE_OK or SQLITE_MISUSE, but other @@ -6655,6 +6910,12 @@ SQLITE_API int sqlite3_autovacuum_pages( ** The exceptions defined in this paragraph might change in a future ** release of SQLite. ** +** Whether the update hook is invoked before or after the +** corresponding change is currently unspecified and may differ +** depending on the type of change. Do not rely on the order of the +** hook call with regards to the final result of the operation which +** triggers the hook. +** ** The update hook implementation must not do anything that will modify ** the database connection that invoked the update hook. Any actions ** to modify the database connection must be deferred until after the @@ -7108,6 +7369,10 @@ struct sqlite3_module { /* The methods above are in versions 1 and 2 of the sqlite_module object. ** Those below are for version 3 and greater. */ int (*xShadowName)(const char*); + /* The methods above are in versions 1 through 3 of the sqlite_module object. + ** Those below are for version 4 and greater. */ + int (*xIntegrity)(sqlite3_vtab *pVTab, const char *zSchema, + const char *zTabName, int mFlags, char **pzErr); }; /* @@ -7185,9 +7450,11 @@ struct sqlite3_module { ** will be returned by the strategy. ** ** The xBestIndex method may optionally populate the idxFlags field with a -** mask of SQLITE_INDEX_SCAN_* flags. Currently there is only one such flag - -** SQLITE_INDEX_SCAN_UNIQUE. If the xBestIndex method sets this flag, SQLite -** assumes that the strategy may visit at most one row. +** mask of SQLITE_INDEX_SCAN_* flags. One such flag is +** [SQLITE_INDEX_SCAN_HEX], which if set causes the [EXPLAIN QUERY PLAN] +** output to show the idxNum has hex instead of as decimal. Another flag is +** SQLITE_INDEX_SCAN_UNIQUE, which if set indicates that the query plan will +** return at most one row. ** ** Additionally, if xBestIndex sets the SQLITE_INDEX_SCAN_UNIQUE flag, then ** SQLite also assumes that if a call to the xUpdate() method is made as @@ -7251,7 +7518,9 @@ struct sqlite3_index_info { ** [sqlite3_index_info].idxFlags field to some combination of ** these bits. */ -#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */ +#define SQLITE_INDEX_SCAN_UNIQUE 0x00000001 /* Scan visits at most 1 row */ +#define SQLITE_INDEX_SCAN_HEX 0x00000002 /* Display idxNum as hex */ + /* in EXPLAIN QUERY PLAN */ /* ** CAPI3REF: Virtual Table Constraint Operator Codes @@ -7595,7 +7864,7 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); ** code is returned and the transaction rolled back. ** ** Calling this function with an argument that is not a NULL pointer or an -** open blob handle results in undefined behaviour. ^Calling this routine +** open blob handle results in undefined behavior. ^Calling this routine ** with a null pointer (such as would be returned by a failed call to ** [sqlite3_blob_open()]) is a harmless no-op. ^Otherwise, if this function ** is passed a valid open blob handle, the values returned by the @@ -7822,18 +8091,20 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); ** ** ^(Some systems (for example, Windows 95) do not support the operation ** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() -** will always return SQLITE_BUSY. The SQLite core only ever uses -** sqlite3_mutex_try() as an optimization so this is acceptable -** behavior.)^ +** will always return SQLITE_BUSY. In most cases the SQLite core only uses +** sqlite3_mutex_try() as an optimization, so this is acceptable +** behavior. The exceptions are unix builds that set the +** SQLITE_ENABLE_SETLK_TIMEOUT build option. In that case a working +** sqlite3_mutex_try() is required.)^ ** ** ^The sqlite3_mutex_leave() routine exits a mutex that was ** previously entered by the same thread. The behavior ** is undefined if the mutex is not currently entered by the ** calling thread or is not currently allocated. ** -** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or -** sqlite3_mutex_leave() is a NULL pointer, then all three routines -** behave as no-ops. +** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), +** sqlite3_mutex_leave(), or sqlite3_mutex_free() is a NULL pointer, +** then any of the four routines behaves as a no-op. ** ** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. */ @@ -8075,6 +8346,7 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_PRNG_SAVE 5 #define SQLITE_TESTCTRL_PRNG_RESTORE 6 #define SQLITE_TESTCTRL_PRNG_RESET 7 /* NOT USED */ +#define SQLITE_TESTCTRL_FK_NO_ACTION 7 #define SQLITE_TESTCTRL_BITVEC_TEST 8 #define SQLITE_TESTCTRL_FAULT_INSTALL 9 #define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 @@ -8082,8 +8354,10 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_ASSERT 12 #define SQLITE_TESTCTRL_ALWAYS 13 #define SQLITE_TESTCTRL_RESERVE 14 /* NOT USED */ +#define SQLITE_TESTCTRL_JSON_SELFCHECK 14 #define SQLITE_TESTCTRL_OPTIMIZATIONS 15 #define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */ +#define SQLITE_TESTCTRL_GETOPT 16 #define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */ #define SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 17 #define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 @@ -8103,7 +8377,8 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_TRACEFLAGS 31 #define SQLITE_TESTCTRL_TUNE 32 #define SQLITE_TESTCTRL_LOGEST 33 -#define SQLITE_TESTCTRL_LAST 33 /* Largest TESTCTRL */ +#define SQLITE_TESTCTRL_USELONGDOUBLE 34 /* NOT USED */ +#define SQLITE_TESTCTRL_LAST 34 /* Largest TESTCTRL */ /* ** CAPI3REF: SQL Keyword Checking @@ -8116,7 +8391,7 @@ SQLITE_API int sqlite3_test_control(int op, ...); ** The sqlite3_keyword_count() interface returns the number of distinct ** keywords understood by SQLite. ** -** The sqlite3_keyword_name(N,Z,L) interface finds the N-th keyword and +** The sqlite3_keyword_name(N,Z,L) interface finds the 0-based N-th keyword and ** makes *Z point to that keyword expressed as UTF8 and writes the number ** of bytes in the keyword into *L. The string that *Z points to is not ** zero-terminated. The sqlite3_keyword_name(N,Z,L) routine returns @@ -9078,6 +9353,16 @@ typedef struct sqlite3_backup sqlite3_backup; ** APIs are not strictly speaking threadsafe. If they are invoked at the ** same time as another thread is invoking sqlite3_backup_step() it is ** possible that they return invalid values. +** +** Alternatives To Using The Backup API +** +** Other techniques for safely creating a consistent backup of an SQLite +** database include: +** +**
        +**
      • The [VACUUM INTO] command. +**
      • The [sqlite3_rsync] utility program. +**
      */ SQLITE_API sqlite3_backup *sqlite3_backup_init( sqlite3 *pDest, /* Destination database handle */ @@ -9559,7 +9844,7 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); ** [[SQLITE_VTAB_DIRECTONLY]]
      SQLITE_VTAB_DIRECTONLY
      **
      Calls of the form ** [sqlite3_vtab_config](db,SQLITE_VTAB_DIRECTONLY) from within the -** the [xConnect] or [xCreate] methods of a [virtual table] implmentation +** the [xConnect] or [xCreate] methods of a [virtual table] implementation ** prohibits that virtual table from being used from within triggers and ** views. **
      @@ -9567,18 +9852,28 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); ** [[SQLITE_VTAB_INNOCUOUS]]
      SQLITE_VTAB_INNOCUOUS
      **
      Calls of the form ** [sqlite3_vtab_config](db,SQLITE_VTAB_INNOCUOUS) from within the -** the [xConnect] or [xCreate] methods of a [virtual table] implmentation +** the [xConnect] or [xCreate] methods of a [virtual table] implementation ** identify that virtual table as being safe to use from within triggers ** and views. Conceptually, the SQLITE_VTAB_INNOCUOUS tag means that the ** virtual table can do no serious harm even if it is controlled by a ** malicious hacker. Developers should avoid setting the SQLITE_VTAB_INNOCUOUS ** flag unless absolutely necessary. **
      +** +** [[SQLITE_VTAB_USES_ALL_SCHEMAS]]
      SQLITE_VTAB_USES_ALL_SCHEMAS
      +**
      Calls of the form +** [sqlite3_vtab_config](db,SQLITE_VTAB_USES_ALL_SCHEMA) from within the +** the [xConnect] or [xCreate] methods of a [virtual table] implementation +** instruct the query planner to begin at least a read transaction on +** all schemas ("main", "temp", and any ATTACH-ed databases) whenever the +** virtual table is used. +**
      ** */ #define SQLITE_VTAB_CONSTRAINT_SUPPORT 1 #define SQLITE_VTAB_INNOCUOUS 2 #define SQLITE_VTAB_DIRECTONLY 3 +#define SQLITE_VTAB_USES_ALL_SCHEMAS 4 /* ** CAPI3REF: Determine The Virtual Table Conflict Policy @@ -9685,24 +9980,45 @@ SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info*,int); **
    12. ** ^(If the sqlite3_vtab_distinct() interface returns 2, that means ** that the query planner does not need the rows returned in any particular -** order, as long as rows with the same values in all "aOrderBy" columns -** are adjacent.)^ ^(Furthermore, only a single row for each particular -** combination of values in the columns identified by the "aOrderBy" field -** needs to be returned.)^ ^It is always ok for two or more rows with the same -** values in all "aOrderBy" columns to be returned, as long as all such rows -** are adjacent. ^The virtual table may, if it chooses, omit extra rows -** that have the same value for all columns identified by "aOrderBy". -** ^However omitting the extra rows is optional. +** order, as long as rows with the same values in all columns identified +** by "aOrderBy" are adjacent.)^ ^(Furthermore, when two or more rows +** contain the same values for all columns identified by "colUsed", all but +** one such row may optionally be omitted from the result.)^ +** The virtual table is not required to omit rows that are duplicates +** over the "colUsed" columns, but if the virtual table can do that without +** too much extra effort, it could potentially help the query to run faster. ** This mode is used for a DISTINCT query. **

    13. -** ^(If the sqlite3_vtab_distinct() interface returns 3, that means -** that the query planner needs only distinct rows but it does need the -** rows to be sorted.)^ ^The virtual table implementation is free to omit -** rows that are identical in all aOrderBy columns, if it wants to, but -** it is not required to omit any rows. This mode is used for queries +** ^(If the sqlite3_vtab_distinct() interface returns 3, that means the +** virtual table must return rows in the order defined by "aOrderBy" as +** if the sqlite3_vtab_distinct() interface had returned 0. However if +** two or more rows in the result have the same values for all columns +** identified by "colUsed", then all but one such row may optionally be +** omitted.)^ Like when the return value is 2, the virtual table +** is not required to omit rows that are duplicates over the "colUsed" +** columns, but if the virtual table can do that without +** too much extra effort, it could potentially help the query to run faster. +** This mode is used for queries ** that have both DISTINCT and ORDER BY clauses. ** ** +**

      The following table summarizes the conditions under which the +** virtual table is allowed to set the "orderByConsumed" flag based on +** the value returned by sqlite3_vtab_distinct(). This table is a +** restatement of the previous four paragraphs: +** +**

    14. +** +**
      sqlite3_vtab_distinct() return value +** Rows are returned in aOrderBy order +** Rows with the same value in all aOrderBy columns are adjacent +** Duplicates over all colUsed columns may be omitted +**
      0yesyesno +**
      1noyesno +**
      2noyesyes +**
      3yesyesyes +**
      +** ** ^For the purposes of comparing virtual table output values to see if the ** values are same value for sorting purposes, two NULL values are considered ** to be the same. In other words, the comparison operator is "IS" @@ -9739,7 +10055,7 @@ SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info*); ** communicated to the xBestIndex method as a ** [SQLITE_INDEX_CONSTRAINT_EQ] constraint.)^ If xBestIndex wants to use ** this constraint, it must set the corresponding -** aConstraintUsage[].argvIndex to a postive integer. ^(Then, under +** aConstraintUsage[].argvIndex to a positive integer. ^(Then, under ** the usual mode of handling IN operators, SQLite generates [bytecode] ** that invokes the [xFilter|xFilter() method] once for each value ** on the right-hand side of the IN operator.)^ Thus the virtual table @@ -10168,7 +10484,7 @@ SQLITE_API int sqlite3_db_cacheflush(sqlite3*); ** When the [sqlite3_blob_write()] API is used to update a blob column, ** the pre-update hook is invoked with SQLITE_DELETE. This is because the ** in this case the new values are not available. In this case, when a -** callback made with op==SQLITE_DELETE is actuall a write using the +** callback made with op==SQLITE_DELETE is actually a write using the ** sqlite3_blob_write() API, the [sqlite3_preupdate_blobwrite()] returns ** the index of the column being written. In other cases, where the ** pre-update hook is being invoked for some other reason, including a @@ -10246,6 +10562,14 @@ typedef struct sqlite3_snapshot { ** If there is not already a read-transaction open on schema S when ** this function is called, one is opened automatically. ** +** If a read-transaction is opened by this function, then it is guaranteed +** that the returned snapshot object may not be invalidated by a database +** writer or checkpointer until after the read-transaction is closed. This +** is not guaranteed if a read-transaction is already open when this +** function is called. In that case, any subsequent write or checkpoint +** operation on the database may invalidate the returned snapshot handle, +** even while the read-transaction remains open. +** ** The following must be true for this function to succeed. If any of ** the following statements are false when sqlite3_snapshot_get() is ** called, SQLITE_ERROR is returned. The final value of *P is undefined @@ -10429,6 +10753,13 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const c ** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy ** of the database exists. ** +** After the call, if the SQLITE_SERIALIZE_NOCOPY bit had been set, +** the returned buffer content will remain accessible and unchanged +** until either the next write operation on the connection or when +** the connection is closed, and applications must not modify the +** buffer. If the bit had been clear, the returned buffer will not +** be accessed by SQLite after the call. +** ** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the ** SQLITE_SERIALIZE_NOCOPY bit is omitted from argument F if a memory ** allocation error occurs. @@ -10477,6 +10808,9 @@ SQLITE_API unsigned char *sqlite3_serialize( ** SQLite will try to increase the buffer size using sqlite3_realloc64() ** if writes on the database cause it to grow larger than M bytes. ** +** Applications must not modify the buffer P or invalidate it before +** the database connection D is closed. +** ** The sqlite3_deserialize() interface will fail with SQLITE_BUSY if the ** database is currently in a read transaction or is involved in a backup ** operation. @@ -10485,6 +10819,13 @@ SQLITE_API unsigned char *sqlite3_serialize( ** S argument to sqlite3_deserialize(D,S,P,N,M,F) is "temp" then the ** function returns SQLITE_ERROR. ** +** The deserialized database should not be in [WAL mode]. If the database +** is in WAL mode, then any attempt to use the database file will result +** in an [SQLITE_CANTOPEN] error. The application can set the +** [file format version numbers] (bytes 18 and 19) of the input database P +** to 0x01 prior to invoking sqlite3_deserialize(D,S,P,N,M,F) to force the +** database file into rollback mode and work around this limitation. +** ** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the ** SQLITE_DESERIALIZE_FREEONCLOSE bit is set in argument F, then ** [sqlite3_free()] is invoked on argument P prior to returning. @@ -10537,8 +10878,6 @@ SQLITE_API int sqlite3_deserialize( #if defined(__wasi__) # undef SQLITE_WASI # define SQLITE_WASI 1 -# undef SQLITE_OMIT_WAL -# define SQLITE_OMIT_WAL 1/* because it requires shared memory APIs */ # ifndef SQLITE_OMIT_LOAD_EXTENSION # define SQLITE_OMIT_LOAD_EXTENSION # endif @@ -10753,16 +11092,20 @@ SQLITE_API int sqlite3session_create( SQLITE_API void sqlite3session_delete(sqlite3_session *pSession); /* -** CAPIREF: Conigure a Session Object +** CAPI3REF: Configure a Session Object ** METHOD: sqlite3_session ** ** This method is used to configure a session object after it has been -** created. At present the only valid value for the second parameter is -** [SQLITE_SESSION_OBJCONFIG_SIZE]. +** created. At present the only valid values for the second parameter are +** [SQLITE_SESSION_OBJCONFIG_SIZE] and [SQLITE_SESSION_OBJCONFIG_ROWID]. ** -** Arguments for sqlite3session_object_config() +*/ +SQLITE_API int sqlite3session_object_config(sqlite3_session*, int op, void *pArg); + +/* +** CAPI3REF: Options for sqlite3session_object_config ** -** The following values may passed as the the 4th parameter to +** The following values may passed as the the 2nd parameter to ** sqlite3session_object_config(). ** **
      SQLITE_SESSION_OBJCONFIG_SIZE
      @@ -10778,12 +11121,21 @@ SQLITE_API void sqlite3session_delete(sqlite3_session *pSession); ** ** It is an error (SQLITE_MISUSE) to attempt to modify this setting after ** the first table has been attached to the session object. +** +**
      SQLITE_SESSION_OBJCONFIG_ROWID
      +** This option is used to set, clear or query the flag that enables +** collection of data for tables with no explicit PRIMARY KEY. +** +** Normally, tables with no explicit PRIMARY KEY are simply ignored +** by the sessions module. However, if this flag is set, it behaves +** as if such tables have a column "_rowid_ INTEGER PRIMARY KEY" inserted +** as their leftmost columns. +** +** It is an error (SQLITE_MISUSE) to attempt to modify this setting after +** the first table has been attached to the session object. */ -SQLITE_API int sqlite3session_object_config(sqlite3_session*, int op, void *pArg); - -/* -*/ -#define SQLITE_SESSION_OBJCONFIG_SIZE 1 +#define SQLITE_SESSION_OBJCONFIG_SIZE 1 +#define SQLITE_SESSION_OBJCONFIG_ROWID 2 /* ** CAPI3REF: Enable Or Disable A Session Object @@ -11544,6 +11896,18 @@ SQLITE_API int sqlite3changeset_concat( ); +/* +** CAPI3REF: Upgrade the Schema of a Changeset/Patchset +*/ +SQLITE_API int sqlite3changeset_upgrade( + sqlite3 *db, + const char *zDb, + int nIn, const void *pIn, /* Input changeset */ + int *pnOut, void **ppOut /* OUT: Inverse of input */ +); + + + /* ** CAPI3REF: Changegroup Handle ** @@ -11590,6 +11954,38 @@ typedef struct sqlite3_changegroup sqlite3_changegroup; */ SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); +/* +** CAPI3REF: Add a Schema to a Changegroup +** METHOD: sqlite3_changegroup_schema +** +** This method may be used to optionally enforce the rule that the changesets +** added to the changegroup handle must match the schema of database zDb +** ("main", "temp", or the name of an attached database). If +** sqlite3changegroup_add() is called to add a changeset that is not compatible +** with the configured schema, SQLITE_SCHEMA is returned and the changegroup +** object is left in an undefined state. +** +** A changeset schema is considered compatible with the database schema in +** the same way as for sqlite3changeset_apply(). Specifically, for each +** table in the changeset, there exists a database table with: +** +**
        +**
      • The name identified by the changeset, and +**
      • at least as many columns as recorded in the changeset, and +**
      • the primary key columns in the same position as recorded in +** the changeset. +**
      +** +** The output of the changegroup object always has the same schema as the +** database nominated using this function. In cases where changesets passed +** to sqlite3changegroup_add() have fewer columns than the corresponding table +** in the database schema, these are filled in using the default column +** values from the database schema. This makes it possible to combined +** changesets that have different numbers of columns for a single table +** within a changegroup, provided that they are otherwise compatible. +*/ +SQLITE_API int sqlite3changegroup_schema(sqlite3_changegroup*, sqlite3*, const char *zDb); + /* ** CAPI3REF: Add A Changeset To A Changegroup ** METHOD: sqlite3_changegroup @@ -11658,16 +12054,45 @@ SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); ** If the new changeset contains changes to a table that is already present ** in the changegroup, then the number of columns and the position of the ** primary key columns for the table must be consistent. If this is not the -** case, this function fails with SQLITE_SCHEMA. If the input changeset -** appears to be corrupt and the corruption is detected, SQLITE_CORRUPT is -** returned. Or, if an out-of-memory condition occurs during processing, this -** function returns SQLITE_NOMEM. In all cases, if an error occurs the state -** of the final contents of the changegroup is undefined. +** case, this function fails with SQLITE_SCHEMA. Except, if the changegroup +** object has been configured with a database schema using the +** sqlite3changegroup_schema() API, then it is possible to combine changesets +** with different numbers of columns for a single table, provided that +** they are otherwise compatible. +** +** If the input changeset appears to be corrupt and the corruption is +** detected, SQLITE_CORRUPT is returned. Or, if an out-of-memory condition +** occurs during processing, this function returns SQLITE_NOMEM. ** -** If no error occurs, SQLITE_OK is returned. +** In all cases, if an error occurs the state of the final contents of the +** changegroup is undefined. If no error occurs, SQLITE_OK is returned. */ SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pData); +/* +** CAPI3REF: Add A Single Change To A Changegroup +** METHOD: sqlite3_changegroup +** +** This function adds the single change currently indicated by the iterator +** passed as the second argument to the changegroup object. The rules for +** adding the change are just as described for [sqlite3changegroup_add()]. +** +** If the change is successfully added to the changegroup, SQLITE_OK is +** returned. Otherwise, an SQLite error code is returned. +** +** The iterator must point to a valid entry when this function is called. +** If it does not, SQLITE_ERROR is returned and no change is added to the +** changegroup. Additionally, the iterator must not have been opened with +** the SQLITE_CHANGESETAPPLY_INVERT flag. In this case SQLITE_ERROR is also +** returned. +*/ +SQLITE_API int sqlite3changegroup_add_change( + sqlite3_changegroup*, + sqlite3_changeset_iter* +); + + + /* ** CAPI3REF: Obtain A Composite Changeset From A Changegroup ** METHOD: sqlite3_changegroup @@ -11916,9 +12341,30 @@ SQLITE_API int sqlite3changeset_apply_v2( ** Invert the changeset before applying it. This is equivalent to inverting ** a changeset using sqlite3changeset_invert() before applying it. It is ** an error to specify this flag with a patchset. +** +**
      SQLITE_CHANGESETAPPLY_IGNORENOOP
      +** Do not invoke the conflict handler callback for any changes that +** would not actually modify the database even if they were applied. +** Specifically, this means that the conflict handler is not invoked +** for: +**
        +**
      • a delete change if the row being deleted cannot be found, +**
      • an update change if the modified fields are already set to +** their new values in the conflicting row, or +**
      • an insert change if all fields of the conflicting row match +** the row being inserted. +**
      +** +**
      SQLITE_CHANGESETAPPLY_FKNOACTION
      +** If this flag it set, then all foreign key constraints in the target +** database behave as if they were declared with "ON UPDATE NO ACTION ON +** DELETE NO ACTION", even if they are actually CASCADE, RESTRICT, SET NULL +** or SET DEFAULT. */ #define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001 #define SQLITE_CHANGESETAPPLY_INVERT 0x0002 +#define SQLITE_CHANGESETAPPLY_IGNORENOOP 0x0004 +#define SQLITE_CHANGESETAPPLY_FKNOACTION 0x0008 /* ** CAPI3REF: Constants Passed To The Conflict Handler @@ -12451,8 +12897,8 @@ struct Fts5PhraseIter { ** EXTENSION API FUNCTIONS ** ** xUserData(pFts): -** Return a copy of the context pointer the extension function was -** registered with. +** Return a copy of the pUserData pointer passed to the xCreateFunction() +** API when the extension function was registered. ** ** xColumnTotalSize(pFts, iCol, pnToken): ** If parameter iCol is less than zero, set output variable *pnToken @@ -12484,8 +12930,11 @@ struct Fts5PhraseIter { ** created with the "columnsize=0" option. ** ** xColumnText: -** This function attempts to retrieve the text of column iCol of the -** current document. If successful, (*pz) is set to point to a buffer +** If parameter iCol is less than zero, or greater than or equal to the +** number of columns in the table, SQLITE_RANGE is returned. +** +** Otherwise, this function attempts to retrieve the text of column iCol of +** the current document. If successful, (*pz) is set to point to a buffer ** containing the text in utf-8 encoding, (*pn) is set to the size in bytes ** (not characters) of the buffer and SQLITE_OK is returned. Otherwise, ** if an error occurs, an SQLite error code is returned and the final values @@ -12495,8 +12944,10 @@ struct Fts5PhraseIter { ** Returns the number of phrases in the current query expression. ** ** xPhraseSize: -** Returns the number of tokens in phrase iPhrase of the query. Phrases -** are numbered starting from zero. +** If parameter iCol is less than zero, or greater than or equal to the +** number of phrases in the current query, as returned by xPhraseCount, +** 0 is returned. Otherwise, this function returns the number of tokens in +** phrase iPhrase of the query. Phrases are numbered starting from zero. ** ** xInstCount: ** Set *pnInst to the total number of occurrences of all phrases within @@ -12512,12 +12963,13 @@ struct Fts5PhraseIter { ** Query for the details of phrase match iIdx within the current row. ** Phrase matches are numbered starting from zero, so the iIdx argument ** should be greater than or equal to zero and smaller than the value -** output by xInstCount(). +** output by xInstCount(). If iIdx is less than zero or greater than +** or equal to the value returned by xInstCount(), SQLITE_RANGE is returned. ** -** Usually, output parameter *piPhrase is set to the phrase number, *piCol +** Otherwise, output parameter *piPhrase is set to the phrase number, *piCol ** to the column in which it occurs and *piOff the token offset of the -** first token of the phrase. Returns SQLITE_OK if successful, or an error -** code (i.e. SQLITE_NOMEM) if an error occurs. +** first token of the phrase. SQLITE_OK is returned if successful, or an +** error code (i.e. SQLITE_NOMEM) if an error occurs. ** ** This API can be quite slow if used with an FTS5 table created with the ** "detail=none" or "detail=column" option. @@ -12543,6 +12995,10 @@ struct Fts5PhraseIter { ** Invoking Api.xUserData() returns a copy of the pointer passed as ** the third argument to pUserData. ** +** If parameter iPhrase is less than zero, or greater than or equal to +** the number of phrases in the query, as returned by xPhraseCount(), +** this function returns SQLITE_RANGE. +** ** If the callback function returns any value other than SQLITE_OK, the ** query is abandoned and the xQueryPhrase function returns immediately. ** If the returned value is SQLITE_DONE, xQueryPhrase returns SQLITE_OK. @@ -12624,6 +13080,10 @@ struct Fts5PhraseIter { ** (i.e. if it is a contentless table), then this API always iterates ** through an empty set (all calls to xPhraseFirst() set iCol to -1). ** +** In all cases, matches are visited in (column ASC, offset ASC) order. +** i.e. all those in column 0, sorted by offset, followed by those in +** column 1, etc. +** ** xPhraseNext() ** See xPhraseFirst above. ** @@ -12657,9 +13117,65 @@ struct Fts5PhraseIter { ** ** xPhraseNextColumn() ** See xPhraseFirstColumn above. +** +** xQueryToken(pFts5, iPhrase, iToken, ppToken, pnToken) +** This is used to access token iToken of phrase iPhrase of the current +** query. Before returning, output parameter *ppToken is set to point +** to a buffer containing the requested token, and *pnToken to the +** size of this buffer in bytes. +** +** If iPhrase or iToken are less than zero, or if iPhrase is greater than +** or equal to the number of phrases in the query as reported by +** xPhraseCount(), or if iToken is equal to or greater than the number of +** tokens in the phrase, SQLITE_RANGE is returned and *ppToken and *pnToken + are both zeroed. +** +** The output text is not a copy of the query text that specified the +** token. It is the output of the tokenizer module. For tokendata=1 +** tables, this includes any embedded 0x00 and trailing data. +** +** xInstToken(pFts5, iIdx, iToken, ppToken, pnToken) +** This is used to access token iToken of phrase hit iIdx within the +** current row. If iIdx is less than zero or greater than or equal to the +** value returned by xInstCount(), SQLITE_RANGE is returned. Otherwise, +** output variable (*ppToken) is set to point to a buffer containing the +** matching document token, and (*pnToken) to the size of that buffer in +** bytes. This API is not available if the specified token matches a +** prefix query term. In that case both output variables are always set +** to 0. +** +** The output text is not a copy of the document text that was tokenized. +** It is the output of the tokenizer module. For tokendata=1 tables, this +** includes any embedded 0x00 and trailing data. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. +** +** xColumnLocale(pFts5, iIdx, pzLocale, pnLocale) +** If parameter iCol is less than zero, or greater than or equal to the +** number of columns in the table, SQLITE_RANGE is returned. +** +** Otherwise, this function attempts to retrieve the locale associated +** with column iCol of the current row. Usually, there is no associated +** locale, and output parameters (*pzLocale) and (*pnLocale) are set +** to NULL and 0, respectively. However, if the fts5_locale() function +** was used to associate a locale with the value when it was inserted +** into the fts5 table, then (*pzLocale) is set to point to a nul-terminated +** buffer containing the name of the locale in utf-8 encoding. (*pnLocale) +** is set to the size in bytes of the buffer, not including the +** nul-terminator. +** +** If successful, SQLITE_OK is returned. Or, if an error occurs, an +** SQLite error code is returned. The final value of the output parameters +** is undefined in this case. +** +** xTokenize_v2: +** Tokenize text using the tokenizer belonging to the FTS5 table. This +** API is the same as the xTokenize() API, except that it allows a tokenizer +** locale to be specified. */ struct Fts5ExtensionApi { - int iVersion; /* Currently always set to 3 */ + int iVersion; /* Currently always set to 4 */ void *(*xUserData)(Fts5Context*); @@ -12694,6 +13210,22 @@ struct Fts5ExtensionApi { int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*); void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol); + + /* Below this point are iVersion>=3 only */ + int (*xQueryToken)(Fts5Context*, + int iPhrase, int iToken, + const char **ppToken, int *pnToken + ); + int (*xInstToken)(Fts5Context*, int iIdx, int iToken, const char**, int*); + + /* Below this point are iVersion>=4 only */ + int (*xColumnLocale)(Fts5Context*, int iCol, const char **pz, int *pn); + int (*xTokenize_v2)(Fts5Context*, + const char *pText, int nText, /* Text to tokenize */ + const char *pLocale, int nLocale, /* Locale to pass to tokenizer */ + void *pCtx, /* Context passed to xToken() */ + int (*xToken)(void*, int, const char*, int, int, int) /* Callback */ + ); }; /* @@ -12714,7 +13246,7 @@ struct Fts5ExtensionApi { ** A tokenizer instance is required to actually tokenize text. ** ** The first argument passed to this function is a copy of the (void*) -** pointer provided by the application when the fts5_tokenizer object +** pointer provided by the application when the fts5_tokenizer_v2 object ** was registered with FTS5 (the third argument to xCreateTokenizer()). ** The second and third arguments are an array of nul-terminated strings ** containing the tokenizer arguments, if any, specified following the @@ -12738,7 +13270,7 @@ struct Fts5ExtensionApi { ** argument passed to this function is a pointer to an Fts5Tokenizer object ** returned by an earlier call to xCreate(). ** -** The second argument indicates the reason that FTS5 is requesting +** The third argument indicates the reason that FTS5 is requesting ** tokenization of the supplied text. This is always one of the following ** four values: ** @@ -12762,6 +13294,13 @@ struct Fts5ExtensionApi { ** on a columnsize=0 database. ** ** +** The sixth and seventh arguments passed to xTokenize() - pLocale and +** nLocale - are a pointer to a buffer containing the locale to use for +** tokenization (e.g. "en_US") and its size in bytes, respectively. The +** pLocale buffer is not nul-terminated. pLocale may be passed NULL (in +** which case nLocale is always 0) to indicate that the tokenizer should +** use its default locale. +** ** For each token in the input string, the supplied callback xToken() must ** be invoked. The first argument to it should be a copy of the pointer ** passed as the second argument to xTokenize(). The third and fourth @@ -12785,6 +13324,30 @@ struct Fts5ExtensionApi { ** may abandon the tokenization and return any error code other than ** SQLITE_OK or SQLITE_DONE. ** +** If the tokenizer is registered using an fts5_tokenizer_v2 object, +** then the xTokenize() method has two additional arguments - pLocale +** and nLocale. These specify the locale that the tokenizer should use +** for the current request. If pLocale and nLocale are both 0, then the +** tokenizer should use its default locale. Otherwise, pLocale points to +** an nLocale byte buffer containing the name of the locale to use as utf-8 +** text. pLocale is not nul-terminated. +** +** FTS5_TOKENIZER +** +** There is also an fts5_tokenizer object. This is an older, deprecated, +** version of fts5_tokenizer_v2. It is similar except that: +** +**
        +**
      • There is no "iVersion" field, and +**
      • The xTokenize() method does not take a locale argument. +**
      +** +** Legacy fts5_tokenizer tokenizers must be registered using the +** legacy xCreateTokenizer() function, instead of xCreateTokenizer_v2(). +** +** Tokenizer implementations registered using either API may be retrieved +** using both xFindTokenizer() and xFindTokenizer_v2(). +** ** SYNONYM SUPPORT ** ** Custom tokenizers may also support synonyms. Consider a case in which a @@ -12888,11 +13451,38 @@ struct Fts5ExtensionApi { ** as separate queries of the FTS index are required for each synonym. ** ** When using methods (2) or (3), it is important that the tokenizer only -** provide synonyms when tokenizing document text (method (2)) or query -** text (method (3)), not both. Doing so will not cause any errors, but is +** provide synonyms when tokenizing document text (method (3)) or query +** text (method (2)), not both. Doing so will not cause any errors, but is ** inefficient. */ typedef struct Fts5Tokenizer Fts5Tokenizer; +typedef struct fts5_tokenizer_v2 fts5_tokenizer_v2; +struct fts5_tokenizer_v2 { + int iVersion; /* Currently always 2 */ + + int (*xCreate)(void*, const char **azArg, int nArg, Fts5Tokenizer **ppOut); + void (*xDelete)(Fts5Tokenizer*); + int (*xTokenize)(Fts5Tokenizer*, + void *pCtx, + int flags, /* Mask of FTS5_TOKENIZE_* flags */ + const char *pText, int nText, + const char *pLocale, int nLocale, + int (*xToken)( + void *pCtx, /* Copy of 2nd argument to xTokenize() */ + int tflags, /* Mask of FTS5_TOKEN_* flags */ + const char *pToken, /* Pointer to buffer containing token */ + int nToken, /* Size of token in bytes */ + int iStart, /* Byte offset of token within input text */ + int iEnd /* Byte offset of end of token within input text */ + ) + ); +}; + +/* +** New code should use the fts5_tokenizer_v2 type to define tokenizer +** implementations. The following type is included for legacy applications +** that still use it. +*/ typedef struct fts5_tokenizer fts5_tokenizer; struct fts5_tokenizer { int (*xCreate)(void*, const char **azArg, int nArg, Fts5Tokenizer **ppOut); @@ -12912,6 +13502,7 @@ struct fts5_tokenizer { ); }; + /* Flags that may be passed as the third argument to xTokenize() */ #define FTS5_TOKENIZE_QUERY 0x0001 #define FTS5_TOKENIZE_PREFIX 0x0002 @@ -12931,13 +13522,13 @@ struct fts5_tokenizer { */ typedef struct fts5_api fts5_api; struct fts5_api { - int iVersion; /* Currently always set to 2 */ + int iVersion; /* Currently always set to 3 */ /* Create a new tokenizer */ int (*xCreateTokenizer)( fts5_api *pApi, const char *zName, - void *pContext, + void *pUserData, fts5_tokenizer *pTokenizer, void (*xDestroy)(void*) ); @@ -12946,7 +13537,7 @@ struct fts5_api { int (*xFindTokenizer)( fts5_api *pApi, const char *zName, - void **ppContext, + void **ppUserData, fts5_tokenizer *pTokenizer ); @@ -12954,10 +13545,29 @@ struct fts5_api { int (*xCreateFunction)( fts5_api *pApi, const char *zName, - void *pContext, + void *pUserData, fts5_extension_function xFunction, void (*xDestroy)(void*) ); + + /* APIs below this point are only available if iVersion>=3 */ + + /* Create a new tokenizer */ + int (*xCreateTokenizer_v2)( + fts5_api *pApi, + const char *zName, + void *pUserData, + fts5_tokenizer_v2 *pTokenizer, + void (*xDestroy)(void*) + ); + + /* Find an existing tokenizer */ + int (*xFindTokenizer_v2)( + fts5_api *pApi, + const char *zName, + void **ppUserData, + fts5_tokenizer_v2 **ppTokenizer + ); }; /* diff --git a/graalpython/com.oracle.graal.python.cext/modules/clinic/_bz2module.c.h b/graalpython/com.oracle.graal.python.cext/modules/clinic/_bz2module.c.h index fa350849cf..7d5a54a92a 100644 --- a/graalpython/com.oracle.graal.python.cext/modules/clinic/_bz2module.c.h +++ b/graalpython/com.oracle.graal.python.cext/modules/clinic/_bz2module.c.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2019, 2023, Oracle and/or its affiliates. +/* Copyright (c) 2019, 2024, Oracle and/or its affiliates. * Copyright (C) 1996-2020 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 diff --git a/graalpython/com.oracle.graal.python.cext/modules/clinic/_testmultiphase.c.h b/graalpython/com.oracle.graal.python.cext/modules/clinic/_testmultiphase.c.h index 930615fce3..b28d171735 100644 --- a/graalpython/com.oracle.graal.python.cext/modules/clinic/_testmultiphase.c.h +++ b/graalpython/com.oracle.graal.python.cext/modules/clinic/_testmultiphase.c.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2022, 2023, Oracle and/or its affiliates. +/* Copyright (c) 2022, 2024, Oracle and/or its affiliates. * Copyright (C) 1996-2022 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 diff --git a/graalpython/com.oracle.graal.python.cext/modules/clinic/pyexpat.c.h b/graalpython/com.oracle.graal.python.cext/modules/clinic/pyexpat.c.h index b6fbf8a0d1..104aba0cf0 100644 --- a/graalpython/com.oracle.graal.python.cext/modules/clinic/pyexpat.c.h +++ b/graalpython/com.oracle.graal.python.cext/modules/clinic/pyexpat.c.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2021, 2023, Oracle and/or its affiliates. +/* Copyright (c) 2021, 2024, Oracle and/or its affiliates. * Copyright (C) 1996-2021 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 diff --git a/graalpython/com.oracle.graal.python.cext/src/abstract.c b/graalpython/com.oracle.graal.python.cext/src/abstract.c index 018341a899..52f1a1fd6d 100644 --- a/graalpython/com.oracle.graal.python.cext/src/abstract.c +++ b/graalpython/com.oracle.graal.python.cext/src/abstract.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Oracle and/or its affiliates. +/* Copyright (c) 2024, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2024 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -7,8 +7,8 @@ #include "Python.h" #include "capi.h" // GraalPy change -#if 0 // GraalPy change #include "pycore_abstract.h" // _PyIndex_Check() +#if 0 // GraalPy change #include "pycore_call.h" // _PyObject_CallNoArgs() #include "pycore_ceval.h" // _Py_EnterRecursiveCallTstate() #include "pycore_object.h" // _Py_CheckSlotResult() @@ -22,37 +22,6 @@ #include // offsetof() -// GraalPy-specific -typedef enum e_binop { - ADD=0, SUB, MUL, TRUEDIV, LSHIFT, RSHIFT, OR, AND, XOR, FLOORDIV, MOD, - INPLACE_OFFSET, MATRIX_MUL -} BinOp; - -// GraalPy-specific -typedef enum e_unaryop { - POS=0, NEG, INVERT -} UnaryOp; - -// GraalPy-specific -static PyObject * -do_unaryop(PyObject *v, UnaryOp unaryop) -{ - return GraalPyTruffleNumber_UnaryOp(v, (int) unaryop); -} - -// GraalPy-specific -MUST_INLINE static PyObject * -do_binop(PyObject *v, PyObject *w, BinOp binop) -{ - return GraalPyTruffleNumber_BinOp(v, w, (int) binop); -} - -// GraalPy-specific -MUST_INLINE static PyObject * -do_inplace_binop(PyObject *v, PyObject *w, BinOp binop) -{ - return GraalPyTruffleNumber_InPlaceBinOp(v, w, (int) binop); -} /* Shorthands to return certain errors */ @@ -875,6 +844,7 @@ PyObject_Format(PyObject *obj, PyObject *format_spec) Py_XDECREF(empty); return result; } +#endif // GraalPy /* Operations on numbers */ int @@ -885,7 +855,6 @@ PyNumber_Check(PyObject *o) PyNumberMethods *nb = Py_TYPE(o)->tp_as_number; return nb && (nb->nb_index || nb->nb_int || nb->nb_float || PyComplex_Check(o)); } -#endif // GraalPy /* Binary operators */ @@ -983,7 +952,7 @@ binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name) if (result == Py_NotImplemented) { Py_DECREF(result); - if (op_slot == NB_SLOT(nb_rshift) && + if (op_slot == (int)NB_SLOT(nb_rshift) && PyCFunction_CheckExact(v) && strcmp(((PyCFunctionObject *)v)->m_ml->ml_name, "print") == 0) { @@ -1103,13 +1072,16 @@ ternary_op(PyObject *v, return NULL; } +// GraalPy change: upcall when both managed to save on doing multiple upcalls #define BINARY_FUNC(func, op, op_name) \ PyObject * \ func(PyObject *v, PyObject *w) { \ + if (points_to_py_handle_space(v) && points_to_py_handle_space(w)) { \ + return GraalPyTruffle##func(v, w); \ + } \ return binary_op(v, w, NB_SLOT(op), op_name); \ } -#if 0 // GraalPy BINARY_FUNC(PyNumber_Or, nb_or, "|") BINARY_FUNC(PyNumber_Xor, nb_xor, "^") BINARY_FUNC(PyNumber_And, nb_and, "&") @@ -1117,16 +1089,30 @@ BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<") BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>") BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-") BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()") -#endif // GraalPy change PyObject * PyNumber_Add(PyObject *v, PyObject *w) { - // GraalPy change: different implementation - return do_binop(v, w, ADD); + // GraalPy change: upcall when both managed to save on doing multiple upcalls + if (points_to_py_handle_space(v) && points_to_py_handle_space(w)) { + return GraalPyTrufflePyNumber_Add(v, w); + } + PyObject *result = BINARY_OP1(v, w, NB_SLOT(nb_add), "+"); + if (result != Py_NotImplemented) { + return result; + } + Py_DECREF(result); + + PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence; + if (m && m->sq_concat) { + result = (*m->sq_concat)(v, w); + assert(_Py_CheckSlotResult(v, "+", result != NULL)); + return result; + } + + return binop_type_error(v, w, "+"); } -#if 0 // GraalPy change static PyObject * sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n) { @@ -1145,47 +1131,77 @@ sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n) assert(_Py_CheckSlotResult(seq, "*", res != NULL)); return res; } -#endif // GraalPy change PyObject * PyNumber_Multiply(PyObject *v, PyObject *w) { - // GraalPy change: different implementation - return do_binop(v, w, MUL); + // GraalPy change: upcall when both managed to save on doing multiple upcalls + if (points_to_py_handle_space(v) && points_to_py_handle_space(w)) { + return GraalPyTrufflePyNumber_Multiply(v, w); + } + PyObject *result = BINARY_OP1(v, w, NB_SLOT(nb_multiply), "*"); + if (result == Py_NotImplemented) { + PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence; + PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence; + Py_DECREF(result); + if (mv && mv->sq_repeat) { + return sequence_repeat(mv->sq_repeat, v, w); + } + else if (mw && mw->sq_repeat) { + return sequence_repeat(mw->sq_repeat, w, v); + } + result = binop_type_error(v, w, "*"); + } + return result; } PyObject * PyNumber_MatrixMultiply(PyObject *v, PyObject *w) { - // GraalPy change: different implementation - return do_binop(v, w, MATRIX_MUL); + // GraalPy change: upcall when both managed to save on doing multiple upcalls + if (points_to_py_handle_space(v) && points_to_py_handle_space(w)) { + return GraalPyTrufflePyNumber_MatrixMultiply(v, w); + } + return binary_op(v, w, NB_SLOT(nb_matrix_multiply), "@"); } PyObject * PyNumber_FloorDivide(PyObject *v, PyObject *w) { - // GraalPy change: different implementation - return do_binop(v, w, FLOORDIV); + // GraalPy change: upcall when both managed to save on doing multiple upcalls + if (points_to_py_handle_space(v) && points_to_py_handle_space(w)) { + return GraalPyTrufflePyNumber_FloorDivide(v, w); + } + return binary_op(v, w, NB_SLOT(nb_floor_divide), "//"); } PyObject * PyNumber_TrueDivide(PyObject *v, PyObject *w) { - // GraalPy change: different implementation - return do_binop(v, w, TRUEDIV); + // GraalPy change: upcall when both managed to save on doing multiple upcalls + if (points_to_py_handle_space(v) && points_to_py_handle_space(w)) { + return GraalPyTrufflePyNumber_TrueDivide(v, w); + } + return binary_op(v, w, NB_SLOT(nb_true_divide), "/"); } PyObject * PyNumber_Remainder(PyObject *v, PyObject *w) { - // GraalPy change: different implementation - return do_binop(v, w, MOD); + // GraalPy change: upcall when both managed to save on doing multiple upcalls + if (points_to_py_handle_space(v) && points_to_py_handle_space(w)) { + return GraalPyTrufflePyNumber_Remainder(v, w); + } + return binary_op(v, w, NB_SLOT(nb_remainder), "%"); } -#if 0 // GraalPy change PyObject * PyNumber_Power(PyObject *v, PyObject *w, PyObject *z) { + // GraalPy change: upcall when both managed to save on doing multiple upcalls + if (points_to_py_handle_space(v) && points_to_py_handle_space(w)) { + return GraalPyTrufflePyNumber_Power(v, w, z); + } return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()"); } @@ -1273,9 +1289,13 @@ ternary_iop(PyObject *v, PyObject *w, PyObject *z, const int iop_slot, const int return ternary_op(v, w, z, op_slot, op_name); } +// GraalPy change: upcall when v is managed to avoid multiple upcalls #define INPLACE_BINOP(func, iop, op, op_name) \ PyObject * \ func(PyObject *v, PyObject *w) { \ + if (points_to_py_handle_space(v)) { \ + return GraalPyTruffle##func(v, w); \ + } \ return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \ } @@ -1289,26 +1309,74 @@ INPLACE_BINOP(PyNumber_InPlaceMatrixMultiply, nb_inplace_matrix_multiply, nb_mat INPLACE_BINOP(PyNumber_InPlaceFloorDivide, nb_inplace_floor_divide, nb_floor_divide, "//=") INPLACE_BINOP(PyNumber_InPlaceTrueDivide, nb_inplace_true_divide, nb_true_divide, "/=") INPLACE_BINOP(PyNumber_InPlaceRemainder, nb_inplace_remainder, nb_remainder, "%=") -#endif // GraalPy change PyObject * PyNumber_InPlaceAdd(PyObject *v, PyObject *w) { - // GraalPy change: different implementation - return do_inplace_binop(v, w, ADD); + // GraalPy change: upcall when v is managed to avoid multiple upcalls + if (points_to_py_handle_space(v)) { + return GraalPyTrufflePyNumber_InPlaceAdd(v, w); + } + PyObject *result = BINARY_IOP1(v, w, NB_SLOT(nb_inplace_add), + NB_SLOT(nb_add), "+="); + if (result == Py_NotImplemented) { + PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence; + Py_DECREF(result); + if (m != NULL) { + binaryfunc func = m->sq_inplace_concat; + if (func == NULL) + func = m->sq_concat; + if (func != NULL) { + result = func(v, w); + assert(_Py_CheckSlotResult(v, "+=", result != NULL)); + return result; + } + } + result = binop_type_error(v, w, "+="); + } + return result; } PyObject * PyNumber_InPlaceMultiply(PyObject *v, PyObject *w) { - // GraalPy change: different implementation - return do_inplace_binop(v, w, MUL); + // GraalPy change: upcall when v is managed to avoid multiple upcalls + if (points_to_py_handle_space(v)) { + return GraalPyTrufflePyNumber_InPlaceMultiply(v, w); + } + PyObject *result = BINARY_IOP1(v, w, NB_SLOT(nb_inplace_multiply), + NB_SLOT(nb_multiply), "*="); + if (result == Py_NotImplemented) { + ssizeargfunc f = NULL; + PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence; + PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence; + Py_DECREF(result); + if (mv != NULL) { + f = mv->sq_inplace_repeat; + if (f == NULL) + f = mv->sq_repeat; + if (f != NULL) + return sequence_repeat(f, v, w); + } + else if (mw != NULL) { + /* Note that the right hand operand should not be + * mutated in this case so sq_inplace_repeat is not + * used. */ + if (mw->sq_repeat) + return sequence_repeat(mw->sq_repeat, w, v); + } + result = binop_type_error(v, w, "*="); + } + return result; } -# if 0 // GraalPy change PyObject * PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z) { + // GraalPy change: upcall when v is managed to avoid multiple upcalls + if (points_to_py_handle_space(v)) { + return GraalPyTrufflePyNumber_InPlacePower(v, w, z); + } return ternary_iop(v, w, z, NB_SLOT(nb_inplace_power), NB_SLOT(nb_power), "**="); } @@ -1318,33 +1386,60 @@ _PyNumber_InPlacePowerNoMod(PyObject *lhs, PyObject *rhs) { return PyNumber_InPlacePower(lhs, rhs, Py_None); } -#endif // GraalPy change - /* Unary operators and functions */ PyObject * PyNumber_Negative(PyObject *o) { - // GraalPy change: different implementation - return do_unaryop(o, NEG); + if (o == NULL) { + return null_error(); + } + + PyNumberMethods *m = Py_TYPE(o)->tp_as_number; + if (m && m->nb_negative) { + PyObject *res = (*m->nb_negative)(o); + assert(_Py_CheckSlotResult(o, "__neg__", res != NULL)); + return res; + } + + return type_error("bad operand type for unary -: '%.200s'", o); } PyObject * PyNumber_Positive(PyObject *o) { - // GraalPy change: different implementation - return do_unaryop(o, POS); + if (o == NULL) { + return null_error(); + } + + PyNumberMethods *m = Py_TYPE(o)->tp_as_number; + if (m && m->nb_positive) { + PyObject *res = (*m->nb_positive)(o); + assert(_Py_CheckSlotResult(o, "__pos__", res != NULL)); + return res; + } + + return type_error("bad operand type for unary +: '%.200s'", o); } PyObject * PyNumber_Invert(PyObject *o) { - // GraalPy change: different implementation - return do_unaryop(o, INVERT); + if (o == NULL) { + return null_error(); + } + + PyNumberMethods *m = Py_TYPE(o)->tp_as_number; + if (m && m->nb_invert) { + PyObject *res = (*m->nb_invert)(o); + assert(_Py_CheckSlotResult(o, "__invert__", res != NULL)); + return res; + } + + return type_error("bad operand type for unary ~: '%.200s'", o); } -# if 0 // GraalPy change PyObject * PyNumber_Absolute(PyObject *o) { @@ -1370,6 +1465,7 @@ PyIndex_Check(PyObject *obj) } +#if 0 // GraalPy change /* Return a Python int from the object item. Can return an instance of int subclass. Raise TypeError if the result is not an int @@ -2344,7 +2440,6 @@ PyMapping_GetItemString(PyObject *o, const char *key) return GraalPyTruffleObject_GetItemString(o, key); } -#if 0 // GraalPy change int PyMapping_SetItemString(PyObject *o, const char *key, PyObject *value) { @@ -2392,6 +2487,7 @@ PyMapping_HasKey(PyObject *o, PyObject *key) return 0; } +#if 0 // GraalPy change /* This function is quite similar to PySequence_Fast(), but specialized to be a helper for PyMapping_Keys(), PyMapping_Items() and PyMapping_Values(). */ @@ -2964,103 +3060,6 @@ _Py_FreeCharPArray(char *const array[]) } #endif // GraalPy change -// GraalPy note: The following functions are declared in CPython via macros, so we declare them separate here -PyObject * -PyNumber_Subtract(PyObject *v, PyObject *w) -{ - return do_binop(v, w, SUB); -} - -PyObject * -PyNumber_Lshift(PyObject *v, PyObject *w) -{ - return do_binop(v, w, LSHIFT); -} - -PyObject * -PyNumber_Rshift(PyObject *v, PyObject *w) -{ - return do_binop(v, w, RSHIFT); -} - -PyObject * -PyNumber_Or(PyObject *v, PyObject *w) -{ - return do_binop(v, w, OR); -} - -PyObject * -PyNumber_And(PyObject *v, PyObject *w) -{ - return do_binop(v, w, AND); -} - -PyObject * -PyNumber_Xor(PyObject *v, PyObject *w) -{ - return do_binop(v, w, XOR); -} - -PyObject * -PyNumber_InPlaceSubtract(PyObject *v, PyObject *w) -{ - return do_inplace_binop(v, w, SUB); -} - -PyObject * -PyNumber_InPlaceMatrixMultiply(PyObject *v, PyObject *w) -{ - return do_inplace_binop(v, w, MATRIX_MUL); -} - -PyObject * -PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w) -{ - return do_inplace_binop(v, w, FLOORDIV); -} - -PyObject * -PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w) -{ - return do_inplace_binop(v, w, TRUEDIV); -} - -PyObject* -PyNumber_InPlaceRemainder(PyObject *v, PyObject *w) -{ - return do_inplace_binop(v, w, MOD); -} - -PyObject* -PyNumber_InPlaceLshift(PyObject *v, PyObject *w) -{ - return do_inplace_binop(v, w, LSHIFT); -} - -PyObject* -PyNumber_InPlaceRshift(PyObject *v, PyObject *w) -{ - return do_inplace_binop(v, w, RSHIFT); -} - -PyObject* -PyNumber_InPlaceAnd(PyObject *v, PyObject *w) -{ - return do_inplace_binop(v, w, AND); -} - -PyObject* -PyNumber_InPlaceXor(PyObject *v, PyObject *w) -{ - return do_inplace_binop(v, w, XOR); -} - -PyObject* -PyNumber_InPlaceOr(PyObject *v, PyObject *w) -{ - return do_inplace_binop(v, w, OR); -} - // GraalPy additions PyObject ** PyTruffleSequence_Fast_ITEMS(PyObject *o) @@ -3075,6 +3074,6 @@ PyTruffleSequence_Fast_ITEMS(PyObject *o) PyObject* PyTruffleSequence_ITEM(PyObject* obj, Py_ssize_t index) { - PySequenceMethods* methods = Py_TYPE(obj)->tp_as_sequence; - return methods->sq_item(obj, index); + PySequenceMethods* methods = Py_TYPE(obj)->tp_as_sequence; + return methods->sq_item(obj, index); } diff --git a/graalpython/com.oracle.graal.python.cext/src/bytesobject.c b/graalpython/com.oracle.graal.python.cext/src/bytesobject.c index 5e18cba0a6..c3ff5c70ce 100644 --- a/graalpython/com.oracle.graal.python.cext/src/bytesobject.c +++ b/graalpython/com.oracle.graal.python.cext/src/bytesobject.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Oracle and/or its affiliates. +/* Copyright (c) 2024, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2024 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -166,7 +166,7 @@ PyBytes_FromFormatV(const char *format, va_list vargs) (__buffer)[(__pos)++] = (__spec);\ } while(0) - for(int i=0; i < sizeof(buffer); i++) { + for(int i=0; i < (int)sizeof(buffer); i++) { buffer[i] = '\0'; } diff --git a/graalpython/com.oracle.graal.python.cext/src/call.c b/graalpython/com.oracle.graal.python.cext/src/call.c index edcdbe0aa0..bd837d6827 100644 --- a/graalpython/com.oracle.graal.python.cext/src/call.c +++ b/graalpython/com.oracle.graal.python.cext/src/call.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2023, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2023, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2022 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -87,7 +87,6 @@ _Py_CheckFunctionResult(PyThreadState *tstate, PyObject *callable, } -#if 0 // GraalPy change int _Py_CheckSlotResult(PyObject *obj, const char *slot_name, int success) { @@ -110,7 +109,6 @@ _Py_CheckSlotResult(PyObject *obj, const char *slot_name, int success) } return 1; } -#endif // GraalPy change /* --- Core PyObject call functions ------------------------------- */ diff --git a/graalpython/com.oracle.graal.python.cext/src/capi.c b/graalpython/com.oracle.graal.python.cext/src/capi.c index a73d733237..a06f7173a1 100644 --- a/graalpython/com.oracle.graal.python.cext/src/capi.c +++ b/graalpython/com.oracle.graal.python.cext/src/capi.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,13 +43,7 @@ #include #include -#define ASSERTIONS - -#ifdef GRAALVM_PYTHON_LLVM_MANAGED -int points_to_py_handle_space(void* ptr) { - return polyglot_is_value(ptr); -} -#endif +#include "pycore_gc.h" // _PyGC_InitState typedef struct arrayobject { PyObject_VAR_HEAD @@ -196,11 +190,13 @@ PyTypeObject GLOBAL_NAME = {\ 0, /* tp_is_gc */\ }; +#define PY_TRUFFLE_TYPE_EXTERN(GLOBAL_NAME, NAME) #define PY_TRUFFLE_TYPE_UNIMPLEMENTED(GLOBAL_NAME) PyTypeObject GLOBAL_NAME; PY_TYPE_OBJECTS #undef PY_TRUFFLE_TYPE_GENERIC +#undef PY_TRUFFLE_TYPE_EXTERN #undef PY_TRUFFLE_TYPE_UNIMPLEMENTED @@ -223,9 +219,11 @@ static void initialize_builtin_types_and_structs() { PyTruffle_Log(PY_TRUFFLE_LOG_FINE, "initialize_builtin_types_and_structs..."); static int64_t builtin_types[] = { #define PY_TRUFFLE_TYPE_GENERIC(GLOBAL_NAME, __TYPE_NAME__, a, b, c, d, e, f, g) &GLOBAL_NAME, __TYPE_NAME__, +#define PY_TRUFFLE_TYPE_EXTERN(GLOBAL_NAME, __TYPE_NAME__) &GLOBAL_NAME, __TYPE_NAME__, #define PY_TRUFFLE_TYPE_UNIMPLEMENTED(GLOBAL_NAME) // empty PY_TYPE_OBJECTS #undef PY_TRUFFLE_TYPE_GENERIC +#undef PY_TRUFFLE_TYPE_EXTERN #undef PY_TRUFFLE_TYPE_UNIMPLEMENTED NULL, NULL }; @@ -240,7 +238,11 @@ static void initialize_builtin_types_and_structs() { int mmap_getbuffer(PyObject *self, Py_buffer *view, int flags) { // TODO(fa) readonly flag - return PyBuffer_FillInfo(view, (PyObject*)self, GraalPyTruffle_GetMMapData(self), PyObject_Size((PyObject *)self), 0, flags); + char* data = GraalPyTruffle_GetMMapData(self); + if (!data) { + return -1; + } + return PyBuffer_FillInfo(view, (PyObject*)self, data, PyObject_Size((PyObject *)self), 0, flags); } PyAPI_FUNC(void) mmap_init_bufferprotocol(PyObject* mmap_type) { @@ -260,7 +262,7 @@ static int cdata_getbuffer(PyObject* type, Py_buffer* view, int flags) { } static void cdata_releasebuffer(PyObject* obj, Py_buffer* view) { - return GraalPyTruffleCData_ReleaseBuffer(obj, view); + GraalPyTruffleCData_ReleaseBuffer(obj, view); } PyAPI_FUNC(void) PyTruffleCData_InitBufferProtocol(PyObject* type) { @@ -278,15 +280,18 @@ PyObject* _Py_EllipsisObjectReference; PyObject* _Py_NoneStructReference; PyObject* _Py_NotImplementedStructReference; -#ifndef GRAALVM_PYTHON_LLVM_MANAGED +/* + * This holds the thread-local reference to the PythonThreadState on the + * managed side. If additional contexts used the C API with the same Python + * library, we have to either update when switching contexts, or before each + * downcall, or just leave this NULL at all times and incur an upcall in the + * getter. + */ THREAD_LOCAL PyThreadState *tstate_current = NULL; -#endif /* GRAALVM_PYTHON_LLVM_MANAGED */ static void initialize_globals() { -#ifndef GRAALVM_PYTHON_LLVM_MANAGED // store the thread state into a thread local variable tstate_current = GraalPyTruffleThreadState_Get(&tstate_current); -#endif /* GRAALVM_PYTHON_LLVM_MANAGED */ _Py_NoneStructReference = GraalPyTruffle_None(); _Py_NotImplementedStructReference = GraalPyTruffle_NotImplemented(); _Py_EllipsisObjectReference = GraalPyTruffle_Ellipsis(); @@ -348,96 +353,27 @@ static void initialize_bufferprocs() { picklebuf_as_buffer.bf_releasebuffer = empty_releasebuf, PyPickleBuffer_Type.tp_as_buffer = &picklebuf_as_buffer; GraalPy_set_PyTypeObject_tp_as_buffer(&PyPickleBuffer_Type, &picklebuf_as_buffer); + +} + + +static int dummy_traverse(PyObject *self, visitproc f, void *i) {return 0;} + +static void initialize_gc_types_related_slots() { + _PyExc_Exception.tp_traverse = &dummy_traverse; + _PyWeakref_RefType.tp_free = &GraalPyObject_GC_Del; } int is_builtin_type(PyTypeObject *tp) { #define PY_TRUFFLE_TYPE_GENERIC(GLOBAL_NAME, __TYPE_NAME__, a, b, c, d, e, f, g) (tp == &GLOBAL_NAME) || +#define PY_TRUFFLE_TYPE_EXTERN(GLOBAL_NAME, __TYPE_NAME__) PY_TRUFFLE_TYPE_GENERIC(GLOBAL_NAME, __TYPE_NAME__, 0, 0, 0, 0, 0, 0, 0) #define PY_TRUFFLE_TYPE_UNIMPLEMENTED(GLOBAL_NAME) // empty return PY_TYPE_OBJECTS 0; #undef PY_TRUFFLE_TYPE_GENERIC +#undef PY_TRUFFLE_TYPE_EXTERN #undef PY_TRUFFLE_TYPE_UNIMPLEMENTED } -PyAPI_FUNC(int64_t) get_methods_flags(PyTypeObject *cls) { - if (cls == NULL) { - return 0; - } - - int64_t flags = 0; - PyNumberMethods* number = cls->tp_as_number; - if (number != NULL) { -#define COMPUTE_FLAGS(NAME, BIT_IDX) flags |= ((number->NAME != NULL) * BIT_IDX); - COMPUTE_FLAGS(nb_subtract, NB_SUBTRACT) - COMPUTE_FLAGS(nb_multiply, NB_MULTIPLY) - COMPUTE_FLAGS(nb_remainder, NB_REMAINDER) - COMPUTE_FLAGS(nb_divmod, NB_DIVMOD) - COMPUTE_FLAGS(nb_power, NB_POWER) - COMPUTE_FLAGS(nb_negative, NB_NEGATIVE) - COMPUTE_FLAGS(nb_positive, NB_POSITIVE) - COMPUTE_FLAGS(nb_absolute, NB_ABSOLUTE) - COMPUTE_FLAGS(nb_bool, NB_BOOL) - COMPUTE_FLAGS(nb_invert, NB_INVERT) - COMPUTE_FLAGS(nb_lshift, NB_LSHIFT) - COMPUTE_FLAGS(nb_rshift, NB_RSHIFT) - COMPUTE_FLAGS(nb_and, NB_AND) - COMPUTE_FLAGS(nb_xor, NB_XOR) - COMPUTE_FLAGS(nb_or, NB_OR) - COMPUTE_FLAGS(nb_int, NB_INT) - COMPUTE_FLAGS(nb_float, NB_FLOAT) - COMPUTE_FLAGS(nb_inplace_add, NB_INPLACE_ADD) - COMPUTE_FLAGS(nb_inplace_subtract, NB_INPLACE_SUBTRACT) - COMPUTE_FLAGS(nb_inplace_multiply, NB_INPLACE_MULTIPLY) - COMPUTE_FLAGS(nb_inplace_remainder, NB_INPLACE_REMAINDER) - COMPUTE_FLAGS(nb_inplace_power, NB_INPLACE_POWER) - COMPUTE_FLAGS(nb_inplace_lshift, NB_INPLACE_LSHIFT) - COMPUTE_FLAGS(nb_inplace_rshift, NB_INPLACE_RSHIFT) - COMPUTE_FLAGS(nb_inplace_and, NB_INPLACE_AND) - COMPUTE_FLAGS(nb_inplace_xor, NB_INPLACE_XOR) - COMPUTE_FLAGS(nb_inplace_or, NB_INPLACE_OR) - COMPUTE_FLAGS(nb_floor_divide, NB_FLOOR_DIVIDE) - COMPUTE_FLAGS(nb_true_divide, NB_TRUE_DIVIDE) - COMPUTE_FLAGS(nb_inplace_floor_divide, NB_INPLACE_FLOOR_DIVIDE) - COMPUTE_FLAGS(nb_inplace_true_divide, NB_INPLACE_TRUE_DIVIDE) - COMPUTE_FLAGS(nb_index, NB_INDEX) - COMPUTE_FLAGS(nb_matrix_multiply, NB_MATRIX_MULTIPLY) - COMPUTE_FLAGS(nb_inplace_matrix_multiply, NB_INPLACE_MATRIX_MULTIPLY) -#undef COMPUTE_FLAGS - } - - PySequenceMethods *sequence = cls->tp_as_sequence; - if (sequence != NULL) { -#define COMPUTE_FLAGS(NAME, BIT_IDX) flags |= ((sequence->NAME != NULL) * BIT_IDX); - COMPUTE_FLAGS(sq_length, SQ_LENGTH) - COMPUTE_FLAGS(sq_repeat, SQ_REPEAT) - COMPUTE_FLAGS(sq_item, SQ_ITEM) - COMPUTE_FLAGS(sq_ass_item, SQ_ASS_ITEM) - COMPUTE_FLAGS(sq_contains, SQ_CONTAINS) - COMPUTE_FLAGS(sq_inplace_concat, SQ_INPLACE_CONCAT) - COMPUTE_FLAGS(sq_inplace_repeat, SQ_INPLACE_REPEAT) -#undef COMPUTE_FLAGS - } - - PyMappingMethods *mapping = cls->tp_as_mapping; - if (mapping != NULL) { -#define COMPUTE_FLAGS(NAME, BIT_IDX) flags |= ((mapping->NAME != NULL) * BIT_IDX); - COMPUTE_FLAGS(mp_length, MP_LENGTH) - COMPUTE_FLAGS(mp_subscript, MP_SUBSCRIPT) - COMPUTE_FLAGS(mp_ass_subscript, MP_ASS_SUBSCRIPT) -#undef COMPUTE_FLAGS - } - - PyAsyncMethods *async = cls->tp_as_async; - if (async != NULL) { -#define COMPUTE_FLAGS(NAME, BIT_IDX) flags |= ((async->NAME != NULL) * BIT_IDX); - COMPUTE_FLAGS(am_await, AM_AWAIT) - COMPUTE_FLAGS(am_aiter, AM_AITER) - COMPUTE_FLAGS(am_anext, AM_ANEXT) - COMPUTE_FLAGS(am_send, AM_SEND) -#undef COMPUTE_FLAGS - } - return flags; -} - // not quite as in CPython, this assumes that x is already a double. The rest of // the implementation is in the Float constructor in Java PyAPI_FUNC(PyObject*) float_subtype_new(PyTypeObject *type, double x) { @@ -460,25 +396,32 @@ PyAPI_FUNC(void) PyTruffle_DECREF(PyObject* obj) { Py_DECREF(obj); } -/** to be used from Java code only; calls DECREF */ -PyAPI_FUNC(Py_ssize_t) PyTruffle_SUBREF(intptr_t ptr, Py_ssize_t value) { - PyObject* obj = (PyObject*) ptr; // avoid type attachment at the interop boundary -#ifdef ASSERTIONS - if (obj->ob_refcnt & 0xFFFFFFFF00000000L) { - char buf[1024]; - sprintf(buf, "suspicious refcnt value during managed adjustment for %p (%zd 0x%zx - %zd)\n", obj, obj->ob_refcnt, obj->ob_refcnt, value); - Py_FatalError(buf); - } - if ((obj->ob_refcnt - value) < 0) { - char buf[1024]; - sprintf(buf, "refcnt below zero during managed adjustment for %p (%zd 0x%zx - %zd)\n", obj, obj->ob_refcnt, obj->ob_refcnt, value); - Py_FatalError(buf); - } -// printf("refcnt value during managed adjustment for %p (%zd 0x%zx - %zd)\n", obj, obj->ob_refcnt, obj->ob_refcnt, value); -#endif // ASSERTIONS +/** to be used from Java code only; calls '_Py_Dealloc' */ +PyAPI_FUNC(Py_ssize_t) +PyTruffle_SUBREF(intptr_t ptr, Py_ssize_t value) +{ + PyObject *obj = (PyObject*)ptr; // avoid type attachment at the interop boundary +#ifndef NDEBUG + if (obj->ob_refcnt & 0xFFFFFFFF00000000L) { + char buf[1024]; + sprintf(buf, + "suspicious refcnt value during managed adjustment for %p (%zd 0x%zx - %zd)\n", + obj, obj->ob_refcnt, obj->ob_refcnt, value); + Py_FatalError(buf); + } + if ((obj->ob_refcnt - value) < 0) { + char buf[1024]; + sprintf(buf, + "refcnt below zero during managed adjustment for %p (%zd 0x%zx - %zd)\n", + obj, obj->ob_refcnt, obj->ob_refcnt, value); + Py_FatalError(buf); + } +#endif // NDEBUG Py_ssize_t new_value = ((obj->ob_refcnt) -= value); if (new_value == 0) { + PyTruffle_Log(PY_TRUFFLE_LOG_FINER, "%s: _Py_Dealloc(0x%zx)", + __func__, obj); _Py_Dealloc(obj); } #ifdef Py_REF_DEBUG @@ -489,30 +432,38 @@ PyAPI_FUNC(Py_ssize_t) PyTruffle_SUBREF(intptr_t ptr, Py_ssize_t value) { return new_value; } -/** to be used from Java code only; calls DECREF */ -PyAPI_FUNC(Py_ssize_t) PyTruffle_bulk_DEALLOC(intptr_t ptrArray[], int64_t len) { - - for (int i = 0; i < len; i++) { - PyObject *obj = (PyObject*) ptrArray[i]; +/** to be used from Java code only; calls '_Py_Dealloc' */ +PyAPI_FUNC(Py_ssize_t) +PyTruffle_bulk_DEALLOC(intptr_t ptrArray[], int64_t len) +{ + for (int i = 0; i < len; i++) { + PyObject *obj = (PyObject*)ptrArray[i]; + PyTruffle_Log(PY_TRUFFLE_LOG_FINER, "%s: _Py_Dealloc(0x%zx)", + __func__, obj); _Py_Dealloc(obj); } return 0; } /** to be used from Java code only and only at exit; calls _Py_Dealloc */ -PyAPI_FUNC(Py_ssize_t) PyTruffle_shutdown_bulk_DEALLOC(intptr_t ptrArray[], int64_t len) { - /* some objects depends on others which might get deallocated in the process - of an earlier deallocation of the other object. To avoid double deallocations, - we, temporarly, make all objects immortal artificially */ - for (int i = 0; i < len; i++) { - PyObject *obj = (PyObject*) ptrArray[i]; +PyAPI_FUNC(Py_ssize_t) +PyTruffle_shutdown_bulk_DEALLOC(intptr_t ptrArray[], int64_t len) +{ + /* some objects depends on others which might get deallocated in the + process of an earlier deallocation of the other object. To avoid double + deallocations, we, temporarily, make all objects immortal artificially */ + for (int i = 0; i < len; i++) { + PyObject *obj = (PyObject*)ptrArray[i]; obj->ob_refcnt = 999999999; // object.h:_Py_IMMORTAL_REFCNT } - for (int i = 0; i < len; i++) { - PyObject *obj = (PyObject*) ptrArray[i]; + for (int i = 0; i < len; i++) { + PyObject *obj = (PyObject*)ptrArray[i]; if (Py_TYPE(obj)->tp_dealloc != object_dealloc) { - /* we don't need to care about objects with default deallocation process */ + /* we don't need to care about objects with default deallocation + process */ obj->ob_refcnt = 0; + PyTruffle_Log(PY_TRUFFLE_LOG_FINER, "%s: _Py_Dealloc(0x%zx)", + __func__, obj); _Py_Dealloc(obj); } } @@ -546,6 +497,44 @@ PyAPI_FUNC(void) PyTruffle_ObjectArrayRelease(PyObject** array, int32_t size) { } } +#if defined(__APPLE__) && defined(__MACH__) +#include +#elif defined(_WIN32) +#include +#include "psapi.h" +#endif + +PyAPI_FUNC(size_t) PyTruffle_GetCurrentRSS() { + size_t rss = 0; +#if defined(__APPLE__) && defined(__MACH__) + // MacOS + struct mach_task_basic_info info; + mach_msg_type_number_t infoCount = MACH_TASK_BASIC_INFO_COUNT; + if (task_info(mach_task_self(), MACH_TASK_BASIC_INFO, (task_info_t) &info, &infoCount) == KERN_SUCCESS) { + rss = (size_t)info.resident_size; + } + +#elif defined(__linux__) || defined(__gnu_linux__) + // Linux + FILE* fp = NULL; + if ((fp = fopen( "/proc/self/statm", "r" )) != NULL) { + if (fscanf(fp, "%*s%ld", (long *) &rss)) { + rss *= (uint64_t) sysconf( _SC_PAGESIZE); + } + fclose(fp); + } + +#elif defined(_WIN32) + // Windows + PROCESS_MEMORY_COUNTERS pmc; + if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc))) { + rss = pmc.WorkingSetSize; + } +#endif + return rss / (1024 * 1024 /* bytes -> megabytes*/); +} + + #define ReadMember(object, offset, T) ((T*)(((char*)object) + offset))[0] PyAPI_FUNC(int) ReadShortMember(void* object, Py_ssize_t offset) { @@ -671,12 +660,7 @@ PyAPI_FUNC(int) WriteStringMember(void* object, Py_ssize_t offset, char* value) PyAPI_FUNC(int) WriteStringInPlaceMember(void* object, Py_ssize_t offset, char* value) { char *addr = (char*) (((char*) object) + offset); - size_t n; -// if (polyglot_has_array_elements(value)) { -// n = polyglot_get_array_size(value); -// } else { - n = strlen(value); -// } + size_t n = strlen(value); memcpy(addr, value, n); return 0; } @@ -778,11 +762,11 @@ PyAPI_FUNC(void*) truffle_ptr_convert(size_t value) { } PyAPI_FUNC(void*) truffle_ptr_add(void* x, Py_ssize_t y) { - return x + y; + return (char *)x + y; } PyAPI_FUNC(void) truffle_memcpy_bytes(void *dest, size_t dest_offset, void *src, size_t src_offset, size_t len) { - memcpy(dest + dest_offset, src + src_offset, len); + memcpy((char *)dest + dest_offset, (char *)src + src_offset, len); } PyAPI_FUNC(void*) truffle_calloc(size_t count, size_t elsize) { @@ -817,7 +801,7 @@ PyAPI_FUNC(int) tuffle_check_basesize_for_getstate(PyTypeObject* type, int slot_ if (type->tp_weaklistoffset) basicsize += sizeof(PyObject *); if (slot_num) - basicsize += sizeof(PyObject *) * PyList_GET_SIZE(slot_num); + basicsize += sizeof(PyObject *) * slot_num; return type->tp_basicsize > basicsize; } @@ -843,6 +827,10 @@ PyAPI_FUNC(int) truffle_no_op_clear(PyObject* o) { return 0; } +PyAPI_FUNC(int) truffle_no_op_traverse(PyObject *self, visitproc visit, void *arg) { + return 0; +} + // defined in 'exceptions.c' void initialize_exceptions(); // defined in 'pyhash.c' @@ -850,16 +838,69 @@ void initialize_hashes(); // defined in 'floatobject.c' void _PyFloat_InitState(PyInterpreterState* state); +/* + * This is used to allow Truffle to enter/leave the context on native threads + * that were not created by NFI/Truffle/Java and thus not previously attached + * to the context. See e.g. PyGILState_Ensure. This is used by some C + * extensions to allow calling Python APIs from natively created threads. This + * poses a problem if multiple contexts use the same library, since we cannot + * know which context should be entered. CPython has the same problem (see + * https://docs.python.org/3/c-api/init.html#bugs-and-caveats), in particular + * the following quote: + * + * Furthermore, extensions (such as ctypes) using these APIs to allow calling + * of Python code from non-Python created threads will probably be broken + * when using sub-interpreters. + * + * If we try to use the same libpython for multiple contexts, we can only + * behave in a similar (likely broken) way as CPython: natively created threads + * that use the PyGIL_* APIs to allow calling into Python will attach to the + * first interpreter that initialized the C API (and thus set the + * TRUFFLE_CONTEXT pointer) only. + */ Py_LOCAL_SYMBOL TruffleContext* TRUFFLE_CONTEXT; -Py_LOCAL_SYMBOL int32_t graalpy_finalizing; -PyAPI_FUNC(void) initialize_graal_capi(TruffleEnv* env, void **builtin_closures) { +/* + * This is only set during VM shutdown, so on the native side can only be used + * to guard things that do not work during VM shutdown, not to guard things + * that do not work during context shutdown! (This means that it would be safe + * to share this global across multiple contexts.) + */ +Py_LOCAL_SYMBOL int8_t *_graalpy_finalizing = NULL; + +PyAPI_FUNC(void) initialize_graal_capi(TruffleEnv* env, void **builtin_closures, GCState *gc) { clock_t t = clock(); if (env) { TRUFFLE_CONTEXT = (*env)->getTruffleContext(env); } + _PyGC_InitState(gc); + + /* + * Initializing all these global fields with pointers to different contexts + * could be ok even if all contexts share this library and its globals. + * Each native stub is allocated using the AllocateNode and filled by each + * context. The long value of the stub pointer is then given an index via + * nativeStubLookupReserve, and the index is stored both in the stub for + * fast access from native as well as in the PythonObjectReference which + * wraps the stub on the managed side. The table is per context. Given that + * C API initialisation is deterministic and we initialise only with + * quasi-immortal objects, those indices are never repurposed for other + * objects. So, while later contexts override the pointers for those global + * objects with pointers to their own stubs, the index stored in those + * stubs are the same across all contexts, and thus mapping to + * context-specific objects works as intended. It'd a bit dodgy that the + * ob_refcnt fields of those objects would show whacky behaviour. Maybe we + * could just assert that everything stored during initialisation of the + * GraalPy C API has IMMORTAL_REFCNT and that all stub indices actually + * match. The only real problem would be if the last context exists and + * actually frees the stub memory. We would have to VM-globally delay + * freeing the "latest" stubs, but that's no big deal, we would simply keep + * a reference to the "latest" handle stub table globally. When it changes + * and the associated context already exited, we can free it now, when + * context exits and its table is the "latest", we delay freeing it. + */ initialize_builtins(builtin_closures); PyTruffle_Log(PY_TRUFFLE_LOG_FINE, "initialize_builtins: %fs", ((double) (clock() - t)) / CLOCKS_PER_SEC); Py_Truffle_Options = GraalPyTruffle_Native_Options(); @@ -870,6 +911,7 @@ PyAPI_FUNC(void) initialize_graal_capi(TruffleEnv* env, void **builtin_closures) initialize_exceptions(); initialize_hashes(); initialize_bufferprocs(); + initialize_gc_types_related_slots(); _PyFloat_InitState(NULL); // TODO: initialize during cext initialization doesn't work at the moment @@ -880,48 +922,20 @@ PyAPI_FUNC(void) initialize_graal_capi(TruffleEnv* env, void **builtin_closures) /* * This function is called from Java during C API initialization to get the - * pointer `graalpy_finalizing`. + * pointer `_graalpy_finalizing`. */ -PyAPI_FUNC(int32_t *) GraalPy_get_finalize_capi_pointer() { - return &graalpy_finalizing; -} - -#if ((__linux__ && __GNU_LIBRARY__) || __APPLE__) - -#include -#include -#include - -static void print_c_stacktrace() { - size_t max_stack_size = 16; - void* stack = calloc(sizeof(void*), max_stack_size); - if (stack == NULL) { - return; - } - - size_t stack_size = backtrace(stack, max_stack_size); - char** symbols = backtrace_symbols(stack, stack_size); - if (symbols == NULL) { - free(stack); - return; - } - - for (size_t i = 0; i < stack_size; i++) { - printf ("%s\n", symbols[i]); - } -} - -#else - -static void print_c_stacktrace() { - // other platforms are not supported +PyAPI_FUNC(int8_t *) GraalPy_get_finalize_capi_pointer() { + assert(!_graalpy_finalizing); + // We actually leak this memory on purpose. On the Java side, this is + // written to in a VM shutdown hook. Once such a hook is registered it + // sticks around, so we're leaking those hooks anyway. 1 byte more to leak + // does not strike me (timfel) as significant. + _graalpy_finalizing = (int8_t *)calloc(1, sizeof(int8_t)); + return _graalpy_finalizing; } -#endif - static void unimplemented(const char* name) { printf("Function not implemented in GraalPy: %s\n", name); - printf("Native stacktrace:\n"); print_c_stacktrace(); } diff --git a/graalpython/com.oracle.graal.python.cext/src/capi.h b/graalpython/com.oracle.graal.python.cext/src/capi.h index c2ef0e289a..b9ae1a05d5 100644 --- a/graalpython/com.oracle.graal.python.cext/src/capi.h +++ b/graalpython/com.oracle.graal.python.cext/src/capi.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -81,10 +81,7 @@ #include "pycore_fileutils.h" #include "bytesobject.h" #include "pycore_global_objects.h" // _PY_NSMALLPOSINTS - -#ifdef GRAALVM_PYTHON_LLVM_MANAGED -#include -#endif +#include "pycore_gc.h" // PyGC_Head #define SRC_CS "utf-8" @@ -95,9 +92,11 @@ #define PY_TRUFFLE_LOG_FINE 0x8 #define PY_TRUFFLE_LOG_FINER 0x10 #define PY_TRUFFLE_LOG_FINEST 0x20 -#define PY_TRUFFLE_DEBUG_CAPI 0x30 +#define PY_TRUFFLE_DEBUG_CAPI 0x40 +#define PY_TRUFFLE_PYTHON_GC 0x80 typedef struct mmap_object mmap_object; +typedef struct _gc_runtime_state GCState; // originally in 'gcmodule.c' /* Private types are defined here because we need to declare the type cast. */ @@ -129,6 +128,21 @@ typedef struct { double ob_fval; } GraalPyFloatObject; +/* GraalPy GC support */ + +typedef struct _cycle_node { + PyObject *item; + struct _cycle_node *next; +} GraalPyGC_CycleNode; + +typedef struct { + GraalPyGC_CycleNode *head; + int32_t n; + PyGC_Head *reachable; +} GraalPyGC_Cycle; + +typedef struct gc_generation GCGeneration; + // {{start CAPI_BUILTINS}} #include "capi.gen.h" @@ -141,44 +155,89 @@ CAPI_BUILTINS PyAPI_DATA(uint32_t) Py_Truffle_Options; -#ifndef GRAALVM_PYTHON_LLVM_MANAGED extern THREAD_LOCAL Py_LOCAL_SYMBOL PyThreadState *tstate_current; -#endif /* GRAALVM_PYTHON_LLVM_MANAGED */ -extern Py_LOCAL_SYMBOL int graalpy_finalizing; +extern Py_LOCAL_SYMBOL int8_t *_graalpy_finalizing; +#define graalpy_finalizing (_graalpy_finalizing != NULL && *_graalpy_finalizing) + +#if (__linux__ && __GNU_LIBRARY__) +#include +#include +#include +#include +static void print_c_stacktrace() { + fprintf(stderr, "Native stacktrace:\n"); + intptr_t stack[16]; + size_t stack_size = backtrace((void *)stack, sizeof(stack) / sizeof(stack[0])); + backtrace_symbols_fd((void *)stack, stack_size, STDERR_FILENO); + fflush(stderr); +} + +static void attach_gdb() { + pid_t my_pid = getpid(); + char pathname = "/bin/sh"; + char gdbcmd[28] = {'\0'}; + snprintf(gdbcmd, sizeof(gdbcmd) - 1, "gdb -p %u", my_pid); + char *argv[4]; + argv[0] = pathname; + argv[1] = "-c"; + argv[2] = gdbcmd; + argv[3] = NULL; + if (fork() == 0) { + execv(pathname, argv); + } else { + // give gdb time to attach + sleep(5); + } +} +#else +static void print_c_stacktrace() { + // not supported +} + +static void attach_gdb() { + // not supported +} +#endif /* Flags definitions representing global (debug) options. */ static MUST_INLINE int PyTruffle_Trace_Memory() { - return Py_Truffle_Options & PY_TRUFFLE_TRACE_MEM; + return Py_Truffle_Options & PY_TRUFFLE_TRACE_MEM; } static MUST_INLINE int PyTruffle_Log_Info() { - return Py_Truffle_Options & PY_TRUFFLE_LOG_INFO; + return Py_Truffle_Options & PY_TRUFFLE_LOG_INFO; } static MUST_INLINE int PyTruffle_Log_Config() { - return Py_Truffle_Options & PY_TRUFFLE_LOG_CONFIG; + return Py_Truffle_Options & PY_TRUFFLE_LOG_CONFIG; } static MUST_INLINE int PyTruffle_Log_Fine() { - return Py_Truffle_Options & PY_TRUFFLE_LOG_FINE; + return Py_Truffle_Options & PY_TRUFFLE_LOG_FINE; } static MUST_INLINE int PyTruffle_Log_Finer() { - return Py_Truffle_Options & PY_TRUFFLE_LOG_FINER; + return Py_Truffle_Options & PY_TRUFFLE_LOG_FINER; } static MUST_INLINE int PyTruffle_Log_Finest() { - return Py_Truffle_Options & PY_TRUFFLE_LOG_FINEST; + return Py_Truffle_Options & PY_TRUFFLE_LOG_FINEST; } static MUST_INLINE int PyTruffle_Debug_CAPI() { - return Py_Truffle_Options & PY_TRUFFLE_DEBUG_CAPI; + return Py_Truffle_Options & PY_TRUFFLE_DEBUG_CAPI; +} + +static MUST_INLINE int PyTruffle_PythonGC() { + return Py_Truffle_Options & PY_TRUFFLE_PYTHON_GC; } -static void PyTruffle_Log(int level, const char* format, ... ) { - if (Py_Truffle_Options & level) { - char buffer[1024]; - va_list args; - va_start(args, format); - vsprintf(buffer,format, args); - GraalPyTruffle_LogString(level, buffer); - va_end(args); - } +static void +PyTruffle_Log(int level, const char *format, ...) +{ + if (Py_Truffle_Options & level) { + char buffer[1024]; + va_list args; + va_start(args, format); + vsprintf(buffer, format, args); + GraalPyTruffle_LogString(level, buffer); + va_end(args); + } } Py_LOCAL_SYMBOL int is_builtin_type(PyTypeObject *tp); @@ -232,6 +291,8 @@ Py_LOCAL_SYMBOL int is_builtin_type(PyTypeObject *tp); #define JWRAPPER_DESCR_DELETE 46 #define JWRAPPER_DELATTRO 47 #define JWRAPPER_SSIZE_ARG 48 +#define JWRAPPER_VISITPROC 49 +#define JWRAPPER_TRAVERSEPROC 50 static inline int get_method_flags_wrapper(int flags) { @@ -257,6 +318,8 @@ static inline int get_method_flags_wrapper(int flags) { // looked up by NFI, so exported PyAPI_FUNC(void) register_native_slots(PyTypeObject* managed_class, PyGetSetDef* getsets, PyMemberDef* members); +PyAPI_FUNC(void) GraalPyObject_GC_Del(void *op); + // export the SizeT arg parse functions, because we use them in contrast to cpython on windows for core modules that we link dynamically PyAPI_FUNC(int) _PyArg_Parse_SizeT(PyObject *, const char *, ...); PyAPI_FUNC(int) _PyArg_ParseTuple_SizeT(PyObject *, const char *, ...); @@ -266,86 +329,83 @@ PyAPI_FUNC(int) _PyArg_VaParse_SizeT(PyObject *, const char *, va_list); PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *, PyObject *, const char *, char **, va_list); -extern size_t PyTruffle_AllocatedMemory; -extern size_t PyTruffle_MaxNativeMemory; -extern size_t PyTruffle_NativeMemoryGCBarrier; /* * alphabetical but: according to CPython's '_PyTypes_Init': first * PyBaseObject_Type, then PyType_Type, ... */ #define PY_TYPE_OBJECTS \ -PY_TRUFFLE_TYPE_WITH_ALLOC(PyBaseObject_Type, "object", &PyType_Type, sizeof(PyObject), PyType_GenericAlloc, object_dealloc, PyObject_Del) \ -PY_TRUFFLE_TYPE_GENERIC(PyType_Type, "type", &PyType_Type, sizeof(PyHeapTypeObject), sizeof(PyMemberDef), PyType_GenericAlloc, object_dealloc, PyObject_GC_Del, 0) \ -PY_TRUFFLE_TYPE(PyCFunction_Type, "builtin_function_or_method", &PyType_Type, sizeof(PyCFunctionObject)) \ -PY_TRUFFLE_TYPE(_PyBytesIOBuffer_Type, "_BytesIOBuffer", &PyType_Type, 0) \ -PY_TRUFFLE_TYPE(_PyExc_BaseException, "BaseException", &PyType_Type, sizeof(PyBaseExceptionObject)) \ -PY_TRUFFLE_TYPE(_PyExc_Exception, "Exception", &PyType_Type, sizeof(PyBaseExceptionObject)) \ -PY_TRUFFLE_TYPE(_PyExc_StopIteration, "StopIteration", &PyType_Type, sizeof(PyStopIterationObject)) \ -PY_TRUFFLE_TYPE(_PyNamespace_Type, "SimpleNamespace", &PyType_Type, sizeof(_PyNamespaceObject)) \ -PY_TRUFFLE_TYPE(_PyNone_Type, "NoneType", &PyType_Type, 0) \ -PY_TRUFFLE_TYPE(_PyNotImplemented_Type, "NotImplementedType", &PyType_Type, 0) \ -PY_TRUFFLE_TYPE(_PyWeakref_CallableProxyType, "_weakref.CallableProxyType", &PyType_Type, sizeof(PyWeakReference)) \ -PY_TRUFFLE_TYPE(_PyWeakref_ProxyType, "_weakref.ProxyType", &PyType_Type, sizeof(PyWeakReference)) \ -PY_TRUFFLE_TYPE(_PyWeakref_RefType, "_weakref.ReferenceType", &PyType_Type, sizeof(PyWeakReference)) \ -PY_TRUFFLE_TYPE(Arraytype, "array", &PyType_Type, sizeof(arrayobject)) \ -PY_TRUFFLE_TYPE(mmap_object_type, "mmap.mmap", &PyType_Type, 0) \ -PY_TRUFFLE_TYPE(PyArrayIter_Type, "arrayiterator", &PyType_Type, sizeof(arrayiterobject)) \ -PY_TRUFFLE_TYPE(PyAsyncGen_Type, "async_generator", &PyType_Type, sizeof(PyAsyncGenObject)) \ -PY_TRUFFLE_TYPE_WITH_ITEMSIZE(PyLong_Type, "int", &PyType_Type, offsetof(PyLongObject, ob_digit), sizeof(PyObject *)) \ -PY_TRUFFLE_TYPE(PyBool_Type, "bool", &PyType_Type, sizeof(struct _longobject)) \ -PY_TRUFFLE_TYPE(PyByteArray_Type, "bytearray", &PyType_Type, sizeof(PyByteArrayObject)) \ -PY_TRUFFLE_TYPE_WITH_ITEMSIZE(PyBytes_Type, "bytes", &PyType_Type, PyBytesObject_SIZE, sizeof(char)) \ -PY_TRUFFLE_TYPE_WITH_ALLOC(PyCapsule_Type, "capsule", &PyType_Type, sizeof(PyCapsule), PyType_GenericAlloc, capsule_dealloc, PyObject_Del) \ -PY_TRUFFLE_TYPE(PyCell_Type, "cell", &PyType_Type, sizeof(PyCellObject)) \ -PY_TRUFFLE_TYPE(PyCMethod_Type, "builtin_method", &PyCFunction_Type, sizeof(PyCFunctionObject)) \ -PY_TRUFFLE_TYPE(PyCode_Type, "code", &PyType_Type, sizeof(PyTypeObject)) \ -PY_TRUFFLE_TYPE(PyComplex_Type, "complex", &PyType_Type, sizeof(PyComplexObject)) \ -PY_TRUFFLE_TYPE(PyDict_Type, "dict", &PyType_Type, sizeof(PyDictObject)) \ -PY_TRUFFLE_TYPE(PyDictProxy_Type, "mappingproxy", &PyType_Type, sizeof(mappingproxyobject)) \ -PY_TRUFFLE_TYPE(PyEllipsis_Type, "ellipsis", &PyType_Type, 0) \ -PY_TRUFFLE_TYPE(PyFloat_Type, "float", &PyType_Type, sizeof(PyFloatObject)) \ -PY_TRUFFLE_TYPE_WITH_ITEMSIZE(PyFrame_Type, "frame", &PyType_Type, sizeof(PyTypeObject), sizeof(PyObject *)) \ -PY_TRUFFLE_TYPE(PyFrozenSet_Type, "frozenset", &PyType_Type, sizeof(PySetObject)) \ -PY_TRUFFLE_TYPE(PyFunction_Type, "function", &PyType_Type, sizeof(PyFunctionObject)) \ -PY_TRUFFLE_TYPE(PyGen_Type, "generator", &PyType_Type, sizeof(PyGenObject)) \ -PY_TRUFFLE_TYPE(PyGetSetDescr_Type, "getset_descriptor", &PyType_Type, sizeof(PyGetSetDescrObject)) \ -PY_TRUFFLE_TYPE(PyInstanceMethod_Type, "instancemethod", &PyType_Type, sizeof(PyInstanceMethodObject)) \ -PY_TRUFFLE_TYPE(PyList_Type, "list", &PyType_Type, sizeof(PyListObject)) \ -PY_TRUFFLE_TYPE(PyMap_Type, "map", &PyType_Type, sizeof(mapobject)) \ -PY_TRUFFLE_TYPE(PyMemberDescr_Type, "member_descriptor", &PyType_Type, sizeof(PyMemberDescrObject)) \ -PY_TRUFFLE_TYPE_WITH_ITEMSIZE(PyMemoryView_Type, "memoryview", &PyType_Type, offsetof(PyMemoryViewObject, ob_array), sizeof(Py_ssize_t)) \ -PY_TRUFFLE_TYPE(PyMethod_Type, "method", &PyType_Type, sizeof(PyMethodObject)) \ -PY_TRUFFLE_TYPE(PyMethodDescr_Type, "method_descriptor", &PyType_Type, sizeof(PyMethodDescrObject)) \ -PY_TRUFFLE_TYPE(PyModule_Type, "module", &PyType_Type, sizeof(PyModuleObject)) \ -PY_TRUFFLE_TYPE(PyModuleDef_Type, "moduledef", &PyType_Type, sizeof(struct PyModuleDef)) \ -PY_TRUFFLE_TYPE(PyProperty_Type, "property", &PyType_Type, sizeof(propertyobject)) \ -PY_TRUFFLE_TYPE(PyRange_Type, "range", &PyType_Type, sizeof(rangeobject)) \ -PY_TRUFFLE_TYPE(PySet_Type, "set", &PyType_Type, sizeof(PySetObject)) \ -PY_TRUFFLE_TYPE(PySlice_Type, "slice", &PyType_Type, sizeof(PySliceObject)) \ -PY_TRUFFLE_TYPE(PyStaticMethod_Type, "staticmethod", &PyType_Type, sizeof(PyObject)) \ -PY_TRUFFLE_TYPE(PySuper_Type, "super", &PyType_Type, sizeof(superobject)) \ -PY_TRUFFLE_TYPE(PyTraceBack_Type, "traceback", &PyType_Type, sizeof(PyTypeObject)) \ -PY_TRUFFLE_TYPE_GENERIC(PyTuple_Type, "tuple", &PyType_Type, sizeof(PyTupleObject) - sizeof(PyObject *), sizeof(PyObject *), PyTruffle_Tuple_Alloc, (destructor)PyTruffle_Tuple_Dealloc, 0, 0) \ -PY_TRUFFLE_TYPE_GENERIC(PyUnicode_Type, "str", &PyType_Type, sizeof(PyUnicodeObject), 0, NULL, unicode_dealloc, PyObject_Del, 0) \ +PY_TRUFFLE_TYPE_WITH_ALLOC(PyBaseObject_Type, "object", &PyType_Type, sizeof(PyObject), PyType_GenericAlloc, object_dealloc, PyObject_Del) \ +PY_TRUFFLE_TYPE_EXTERN(PyType_Type, "type" ) \ +PY_TRUFFLE_TYPE(PyCFunction_Type, "builtin_function_or_method", &PyType_Type, sizeof(PyCFunctionObject)) \ +PY_TRUFFLE_TYPE(_PyBytesIOBuffer_Type, "_BytesIOBuffer", &PyType_Type, 0) \ +PY_TRUFFLE_TYPE(_PyExc_BaseException, "BaseException", &PyType_Type, sizeof(PyBaseExceptionObject)) \ +PY_TRUFFLE_TYPE(_PyExc_Exception, "Exception", &PyType_Type, sizeof(PyBaseExceptionObject)) \ +PY_TRUFFLE_TYPE(_PyExc_StopIteration, "StopIteration", &PyType_Type, sizeof(PyStopIterationObject)) \ +PY_TRUFFLE_TYPE(_PyNamespace_Type, "SimpleNamespace", &PyType_Type, sizeof(_PyNamespaceObject)) \ +PY_TRUFFLE_TYPE(_PyNone_Type, "NoneType", &PyType_Type, 0) \ +PY_TRUFFLE_TYPE(_PyNotImplemented_Type, "NotImplementedType", &PyType_Type, 0) \ +PY_TRUFFLE_TYPE(_PyWeakref_CallableProxyType, "_weakref.CallableProxyType", &PyType_Type, sizeof(PyWeakReference)) \ +PY_TRUFFLE_TYPE(_PyWeakref_ProxyType, "_weakref.ProxyType", &PyType_Type, sizeof(PyWeakReference)) \ +PY_TRUFFLE_TYPE(_PyWeakref_RefType, "_weakref.ReferenceType", &PyType_Type, sizeof(PyWeakReference)) \ +PY_TRUFFLE_TYPE(Arraytype, "array", &PyType_Type, sizeof(arrayobject)) \ +PY_TRUFFLE_TYPE(mmap_object_type, "mmap.mmap", &PyType_Type, 0) \ +PY_TRUFFLE_TYPE(PyArrayIter_Type, "arrayiterator", &PyType_Type, sizeof(arrayiterobject)) \ +PY_TRUFFLE_TYPE(PyAsyncGen_Type, "async_generator", &PyType_Type, sizeof(PyAsyncGenObject)) \ +PY_TRUFFLE_TYPE_WITH_ITEMSIZE(PyLong_Type, "int", &PyType_Type, offsetof(PyLongObject, ob_digit), sizeof(PyObject *)) \ +PY_TRUFFLE_TYPE(PyBool_Type, "bool", &PyType_Type, sizeof(struct _longobject)) \ +PY_TRUFFLE_TYPE(PyByteArray_Type, "bytearray", &PyType_Type, sizeof(PyByteArrayObject)) \ +PY_TRUFFLE_TYPE_WITH_ITEMSIZE(PyBytes_Type, "bytes", &PyType_Type, PyBytesObject_SIZE, sizeof(char)) \ +PY_TRUFFLE_TYPE_WITH_ALLOC(PyCapsule_Type, "PyCapsule", &PyType_Type, sizeof(PyCapsule), PyType_GenericAlloc, capsule_dealloc, PyObject_Del) \ +PY_TRUFFLE_TYPE(PyCell_Type, "cell", &PyType_Type, sizeof(PyCellObject)) \ +PY_TRUFFLE_TYPE(PyCMethod_Type, "builtin_method", &PyCFunction_Type, sizeof(PyCFunctionObject)) \ +PY_TRUFFLE_TYPE(PyCode_Type, "code", &PyType_Type, sizeof(PyTypeObject)) \ +PY_TRUFFLE_TYPE(PyComplex_Type, "complex", &PyType_Type, sizeof(PyComplexObject)) \ +PY_TRUFFLE_TYPE_EXTERN(PyDict_Type, "dict" ) \ +PY_TRUFFLE_TYPE(PyDictProxy_Type, "mappingproxy", &PyType_Type, sizeof(mappingproxyobject)) \ +PY_TRUFFLE_TYPE(PyEllipsis_Type, "ellipsis", &PyType_Type, 0) \ +PY_TRUFFLE_TYPE(PyFloat_Type, "float", &PyType_Type, sizeof(PyFloatObject)) \ +PY_TRUFFLE_TYPE_WITH_ITEMSIZE(PyFrame_Type, "frame", &PyType_Type, sizeof(PyTypeObject), sizeof(PyObject *)) \ +PY_TRUFFLE_TYPE(PyFrozenSet_Type, "frozenset", &PyType_Type, sizeof(PySetObject)) \ +PY_TRUFFLE_TYPE(PyFunction_Type, "function", &PyType_Type, sizeof(PyFunctionObject)) \ +PY_TRUFFLE_TYPE(PyGen_Type, "generator", &PyType_Type, sizeof(PyGenObject)) \ +PY_TRUFFLE_TYPE(PyGetSetDescr_Type, "getset_descriptor", &PyType_Type, sizeof(PyGetSetDescrObject)) \ +PY_TRUFFLE_TYPE(PyInstanceMethod_Type, "instancemethod", &PyType_Type, sizeof(PyInstanceMethodObject)) \ +PY_TRUFFLE_TYPE_EXTERN(PyList_Type, "list" ) \ +PY_TRUFFLE_TYPE(PyMap_Type, "map", &PyType_Type, sizeof(mapobject)) \ +PY_TRUFFLE_TYPE(PyMemberDescr_Type, "member_descriptor", &PyType_Type, sizeof(PyMemberDescrObject)) \ +PY_TRUFFLE_TYPE_WITH_ITEMSIZE(PyMemoryView_Type, "memoryview", &PyType_Type, offsetof(PyMemoryViewObject, ob_array), sizeof(Py_ssize_t)) \ +PY_TRUFFLE_TYPE(PyMethod_Type, "method", &PyType_Type, sizeof(PyMethodObject)) \ +PY_TRUFFLE_TYPE(PyMethodDescr_Type, "method_descriptor", &PyType_Type, sizeof(PyMethodDescrObject)) \ +PY_TRUFFLE_TYPE_EXTERN(PyModule_Type, "module" ) \ +PY_TRUFFLE_TYPE(PyModuleDef_Type, "moduledef", &PyType_Type, sizeof(struct PyModuleDef)) \ +PY_TRUFFLE_TYPE(PyProperty_Type, "property", &PyType_Type, sizeof(propertyobject)) \ +PY_TRUFFLE_TYPE(PyRange_Type, "range", &PyType_Type, sizeof(rangeobject)) \ +PY_TRUFFLE_TYPE(PySet_Type, "set", &PyType_Type, sizeof(PySetObject)) \ +PY_TRUFFLE_TYPE_EXTERN(PySlice_Type, "slice" ) \ +PY_TRUFFLE_TYPE(PyStaticMethod_Type, "staticmethod", &PyType_Type, sizeof(PyObject)) \ +PY_TRUFFLE_TYPE(PySuper_Type, "super", &PyType_Type, sizeof(superobject)) \ +PY_TRUFFLE_TYPE(PyTraceBack_Type, "traceback", &PyType_Type, sizeof(PyTypeObject)) \ +PY_TRUFFLE_TYPE_EXTERN(PyTuple_Type, "tuple" ) \ +PY_TRUFFLE_TYPE_GENERIC(PyUnicode_Type, "str", &PyType_Type, sizeof(PyUnicodeObject), 0, NULL, unicode_dealloc, PyObject_Del, 0) \ /* NOTE: we use the same Python type (namely 'PBuiltinFunction') for 'wrapper_descriptor' as for 'method_descriptor'; so the flags must be the same! */ \ -PY_TRUFFLE_TYPE(PyWrapperDescr_Type, "wrapper_descriptor", &PyType_Type, sizeof(PyWrapperDescrObject)) \ -PY_TRUFFLE_TYPE(PyZip_Type, "zip", &PyType_Type, sizeof(zipobject)) \ -PY_TRUFFLE_TYPE(PyReversed_Type, "reversed", &PyType_Type, sizeof(PyObject)) \ -PY_TRUFFLE_TYPE(cycle_type, "cycle", &PyType_Type, sizeof(PyObject)) \ -PY_TRUFFLE_TYPE(PySeqIter_Type, "iterator", &PyType_Type, sizeof(PyObject)) \ -PY_TRUFFLE_TYPE(PyEnum_Type, "enumerate", &PyType_Type, sizeof(PyObject)) \ -PY_TRUFFLE_TYPE(PyCSimpleType, "PyCSimpleType", &PyType_Type, sizeof(PyObject)) \ -PY_TRUFFLE_TYPE(PyCData_Type, "_CData", &PyType_Type, sizeof(PyObject)) \ -PY_TRUFFLE_TYPE(Simple_Type, "_SimpleCData", &PyType_Type, sizeof(PyObject)) \ -PY_TRUFFLE_TYPE(PyCStructType_Type, "PyCStructType", &PyType_Type, sizeof(PyObject)) \ -PY_TRUFFLE_TYPE(UnionType_Type, "_ctypes.UnionType", &PyType_Type, sizeof(PyObject)) \ -PY_TRUFFLE_TYPE(PyCPointerType_Type, "PyCPointerType", &PyType_Type, sizeof(PyObject)) \ -PY_TRUFFLE_TYPE(PyCArrayType_Type, "PyCArrayType", &PyType_Type, sizeof(PyObject)) \ -PY_TRUFFLE_TYPE(PyCoro_Type, "coroutine", &PyType_Type, sizeof(PyCoroObject)) \ -PY_TRUFFLE_TYPE(Py_GenericAliasType, "types.GenericAlias", &PyType_Type, sizeof(PyObject)) \ +PY_TRUFFLE_TYPE(PyWrapperDescr_Type, "wrapper_descriptor", &PyType_Type, sizeof(PyWrapperDescrObject)) \ +PY_TRUFFLE_TYPE(PyZip_Type, "zip", &PyType_Type, sizeof(zipobject)) \ +PY_TRUFFLE_TYPE(PyReversed_Type, "reversed", &PyType_Type, sizeof(PyObject)) \ +PY_TRUFFLE_TYPE(cycle_type, "cycle", &PyType_Type, sizeof(PyObject)) \ +PY_TRUFFLE_TYPE(PySeqIter_Type, "iterator", &PyType_Type, sizeof(PyObject)) \ +PY_TRUFFLE_TYPE(PyEnum_Type, "enumerate", &PyType_Type, sizeof(PyObject)) \ +PY_TRUFFLE_TYPE(PyCSimpleType, "PyCSimpleType", &PyType_Type, sizeof(PyObject)) \ +PY_TRUFFLE_TYPE(PyCData_Type, "_CData", &PyType_Type, sizeof(PyObject)) \ +PY_TRUFFLE_TYPE(Simple_Type, "_SimpleCData", &PyType_Type, sizeof(PyObject)) \ +PY_TRUFFLE_TYPE(PyCStructType_Type, "PyCStructType", &PyType_Type, sizeof(PyObject)) \ +PY_TRUFFLE_TYPE(UnionType_Type, "_ctypes.UnionType", &PyType_Type, sizeof(PyObject)) \ +PY_TRUFFLE_TYPE(PyCPointerType_Type, "PyCPointerType", &PyType_Type, sizeof(PyObject)) \ +PY_TRUFFLE_TYPE(PyCArrayType_Type, "PyCArrayType", &PyType_Type, sizeof(PyObject)) \ +PY_TRUFFLE_TYPE(PyCoro_Type, "coroutine", &PyType_Type, sizeof(PyCoroObject)) \ +PY_TRUFFLE_TYPE(Py_GenericAliasType, "types.GenericAlias", &PyType_Type, sizeof(PyObject)) \ /* PyPickleBufferObject (PyObject_HEAD + Py_buffer + PyObject*) is defined within Objects/picklebufobject.c, so its not exposed. */ \ -PY_TRUFFLE_TYPE(PyPickleBuffer_Type, "_pickle.PickleBuffer", &PyType_Type, sizeof(PyPickleBufferObject)) \ +PY_TRUFFLE_TYPE(PyPickleBuffer_Type, "_pickle.PickleBuffer", &PyType_Type, sizeof(PyPickleBufferObject)) \ PY_TRUFFLE_TYPE_UNIMPLEMENTED(_PyAIterWrapper_Type) \ PY_TRUFFLE_TYPE_UNIMPLEMENTED(_PyAsyncGenASend_Type) \ PY_TRUFFLE_TYPE_UNIMPLEMENTED(_PyAsyncGenAThrow_Type) \ diff --git a/graalpython/com.oracle.graal.python.cext/src/datetime.c b/graalpython/com.oracle.graal.python.cext/src/datetime.c index 530e7e5323..82cf92e72f 100644 --- a/graalpython/com.oracle.graal.python.cext/src/datetime.c +++ b/graalpython/com.oracle.graal.python.cext/src/datetime.c @@ -739,7 +739,11 @@ static PyObject * time_alloc(PyTypeObject *type, Py_ssize_t aware) { size_t size = aware ? sizeof(PyDateTime_Time) : sizeof(_PyDateTime_BaseTime); - PyObject *self = (PyObject *)PyObject_Malloc(size); + /* GraalPy change: use PyObject_Calloc instead of PyObject_Malloc such that + * memory is zeroed because we don't initialized the object anywhere else. + * CPython does initialization in 'time_new'. + */ + PyObject *self = (PyObject *)PyObject_Calloc(1, size); if (self == NULL) { return PyErr_NoMemory(); } @@ -751,7 +755,8 @@ static PyObject * datetime_alloc(PyTypeObject *type, Py_ssize_t aware) { size_t size = aware ? sizeof(PyDateTime_DateTime) : sizeof(_PyDateTime_BaseDateTime); - PyObject *self = (PyObject *)PyObject_Malloc(size); + // GraalPy change: PyObject_Calloc instead of PyObject_Malloc (see above) + PyObject *self = (PyObject *)PyObject_Calloc(1, size); if (self == NULL) { return PyErr_NoMemory(); } @@ -2878,7 +2883,6 @@ static PyNumberMethods delta_as_number = { }; #endif // GraalPy change -// GraalPy change: nulled slots static PyTypeObject PyDateTime_DeltaType = { PyVarObject_HEAD_INIT(NULL, 0) "datetime.timedelta", /* tp_name */ @@ -2889,25 +2893,25 @@ static PyTypeObject PyDateTime_DeltaType = { 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ + 0, /* tp_repr */ // GraalPy change: nulled + 0, /* tp_as_number */ // GraalPy change: nulled 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ - 0, /* tp_hash */ + 0, /* tp_hash */ // GraalPy change: nulled 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ + 0, /* tp_str */ // GraalPy change: nulled + 0, /* tp_getattro */ // GraalPy change: nulled 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - 0, /* tp_doc */ + 0, /* tp_doc */ // GraalPy change: nulled 0, /* tp_traverse */ 0, /* tp_clear */ - 0, /* tp_richcompare */ + 0, /* tp_richcompare */ // GraalPy change: nulled 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - 0, /* tp_methods */ + 0, /* tp_methods */ // GraalPy change: nulled delta_members, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ @@ -2917,7 +2921,7 @@ static PyTypeObject PyDateTime_DeltaType = { 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ - 0, /* tp_new */ + 0, /* tp_new */ // GraalPy change: nulled 0, /* tp_free */ }; @@ -3780,25 +3784,25 @@ static PyTypeObject PyDateTime_DateType = { 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ + 0, /* tp_repr */ // GraalPy change: nulled + 0, /* tp_as_number */ // GraalPy change: nulled 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)date_hash, /* tp_hash */ 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ + 0, /* tp_str */ // GraalPy change: nulled + 0, /* tp_getattro */ // GraalPy change: nulled 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - 0, /* tp_doc */ + 0, /* tp_doc */ // GraalPy change: nulled 0, /* tp_traverse */ 0, /* tp_clear */ - 0, /* tp_richcompare */ + 0, /* tp_richcompare */ // GraalPy change: nulled 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - 0, /* tp_methods */ + 0, /* tp_methods */ // GraalPy change: nulled 0, /* tp_members */ date_getset, /* tp_getset */ 0, /* tp_base */ @@ -3808,7 +3812,7 @@ static PyTypeObject PyDateTime_DateType = { 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ - 0, /* tp_new */ + 0, /* tp_new */ // GraalPy change: nulled 0, /* tp_free */ }; @@ -4016,18 +4020,18 @@ static PyTypeObject PyDateTime_TZInfoType = { 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ - 0, /* tp_getattro */ + 0, /* tp_getattro */ // GraalPy change: nulled 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - 0, /* tp_doc */ + 0, /* tp_doc */ // GraalPy change: nulled 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - 0, /* tp_methods */ + 0, /* tp_methods */ // GraalPy change: nulled 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ @@ -4037,7 +4041,7 @@ static PyTypeObject PyDateTime_TZInfoType = { 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ - 0, /* tp_new */ + 0, /* tp_new */ // GraalPy change: nulled 0, /* tp_free */ }; @@ -4512,6 +4516,7 @@ time_new(PyTypeObject *type, PyObject *args, PyObject *kw) } return self; } +#endif // GraalPy change /* * Destructor. @@ -4526,6 +4531,7 @@ time_dealloc(PyDateTime_Time *self) Py_TYPE(self)->tp_free((PyObject *)self); } +#if 0 // GraalPy change /* * Indirect access to tzinfo methods. */ @@ -4992,36 +4998,35 @@ All arguments are optional. tzinfo may be None, or an instance of\n\ a tzinfo subclass. The remaining arguments may be ints.\n"); #endif // GraalPy change -// GraalPy change: null the slots static PyTypeObject PyDateTime_TimeType = { PyVarObject_HEAD_INIT(NULL, 0) "datetime.time", /* tp_name */ sizeof(PyDateTime_Time), /* tp_basicsize */ 0, /* tp_itemsize */ - 0, /* tp_dealloc */ + (destructor)time_dealloc, /* tp_dealloc */ 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ - 0, /* tp_repr */ + 0, /* tp_repr */ // GraalPy change: nulled 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ - 0, /* tp_hash */ + 0, /* tp_hash */ // GraalPy change: nulled 0, /* tp_call */ - 0, /* tp_str */ + 0, /* tp_str */ // GraalPy change: nulled PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - 0, /* tp_doc */ + 0, /* tp_doc */ // GraalPy change: nulled 0, /* tp_traverse */ 0, /* tp_clear */ - 0, /* tp_richcompare */ + 0, /* tp_richcompare */ // GraalPy change: nulled 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - 0, /* tp_methods */ + 0, /* tp_methods */ // GraalPy change: nulled 0, /* tp_members */ time_getset, /* tp_getset */ 0, /* tp_base */ @@ -5031,7 +5036,7 @@ static PyTypeObject PyDateTime_TimeType = { 0, /* tp_dictoffset */ 0, /* tp_init */ time_alloc, /* tp_alloc */ - 0, /* tp_new */ + 0, /* tp_new */ // GraalPy change: nulled 0, /* tp_free */ }; @@ -5813,6 +5818,7 @@ datetime_fromisoformat(PyObject *cls, PyObject *dtstr) return NULL; } +#endif // GraalPy change /* * Destructor. @@ -5827,6 +5833,7 @@ datetime_dealloc(PyDateTime_DateTime *self) Py_TYPE(self)->tp_free((PyObject *)self); } +#if 0 // GraalPy change /* * Indirect access to tzinfo methods. */ @@ -6920,36 +6927,35 @@ static PyNumberMethods datetime_as_number = { }; #endif// GraalPy change -// GraalPy change: null the slots static PyTypeObject PyDateTime_DateTimeType = { PyVarObject_HEAD_INIT(NULL, 0) "datetime.datetime", /* tp_name */ sizeof(PyDateTime_DateTime), /* tp_basicsize */ 0, /* tp_itemsize */ - 0, /* tp_dealloc */ + (destructor)datetime_dealloc, /* tp_dealloc */ 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ - 0, /* tp_repr */ - 0, /* tp_as_number */ + 0, /* tp_repr */ // GraalPy change: nulled + 0, /* tp_as_number */ // GraalPy change: nulled 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ - 0, /* tp_hash */ + 0, /* tp_hash */ // GraalPy change: nulled 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ + 0, /* tp_str */ // GraalPy change: nulled + 0, /* tp_getattro */ // GraalPy change: nulled 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - 0, /* tp_doc */ + 0, /* tp_doc */ // GraalPy change: nulled 0, /* tp_traverse */ 0, /* tp_clear */ - 0, /* tp_richcompare */ + 0, /* tp_richcompare */ // GraalPy change: nulled 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - 0, /* tp_methods */ + 0, /* tp_methods */ // GraalPy change: nulled 0, /* tp_members */ datetime_getset, /* tp_getset */ &PyDateTime_DateType, /* tp_base */ @@ -6959,7 +6965,7 @@ static PyTypeObject PyDateTime_DateTimeType = { 0, /* tp_dictoffset */ 0, /* tp_init */ datetime_alloc, /* tp_alloc */ - 0, /* tp_new */ + 0, /* tp_new */ // GraalPy change: nulled 0, /* tp_free */ }; diff --git a/graalpython/com.oracle.graal.python.cext/src/dictobject.c b/graalpython/com.oracle.graal.python.cext/src/dictobject.c index 3ee5fe4b2c..55cff6820b 100644 --- a/graalpython/com.oracle.graal.python.cext/src/dictobject.c +++ b/graalpython/com.oracle.graal.python.cext/src/dictobject.c @@ -124,8 +124,10 @@ As a consequence of this, split keys have a maximum size of 16. #include "pycore_call.h" // _PyObject_CallNoArgs() #include "pycore_code.h" // stats #include "pycore_dict.h" // PyDictKeysObject +#endif // GraalPy change #include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() #include "pycore_object.h" // _PyObject_GC_TRACK() +#if 0 // GraalPy change #include "pycore_pyerrors.h" // _PyErr_Fetch() #include "pycore_pystate.h" // _PyThreadState_GET() #include "stringlib/eq.h" // unicode_eq() @@ -1120,10 +1122,12 @@ _PyDict_HasOnlyStringKeys(PyObject *dict) } \ } \ } while(0) +#endif // GraalPy change void _PyDict_MaybeUntrack(PyObject *op) { +#if 0 // GraalPy change PyDictObject *mp; PyObject *value; Py_ssize_t i, numentries; @@ -1131,6 +1135,10 @@ _PyDict_MaybeUntrack(PyObject *op) if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op)) return; + // GraalPy change: do an upcall to consider all dict elements + if (!GraalPyTruffleDict_MaybeUntrack(op)) + return; + mp = (PyDictObject *) op; numentries = mp->ma_keys->dk_nentries; if (_PyDict_HasSplitTable(mp)) { @@ -1164,8 +1172,10 @@ _PyDict_MaybeUntrack(PyObject *op) } } _PyObject_GC_UNTRACK(op); +#endif // GraalPy change } +#if 0 // GraalPy change /* Internal function to find slot for an item from its hash when it is known that the key is not present in the dict. @@ -3494,10 +3504,22 @@ dict_popitem_impl(PyDictObject *self) ASSERT_CONSISTENT(self); return res; } +#endif // GraalPy change static int dict_traverse(PyObject *op, visitproc visit, void *arg) { + /* In GraalPy, we must generally not traverse objects with a managed storage + * because if they have references to a native object, the Python GC would + * incorrectly decref/incref reachable objects. This is because we refer to + * native objects through a managed wrapper and we only add MANAGED_REFCNT + * when we create teh wrapper and we don't incref per reference. + * For example, assume this dict would reference a native object 'n' eleven + * times. When we create the wrapper for 'n', we would add MANAGED_REFCNT to + * the refcnt. During a GC, 'n' would be visited eleven times such that the + * refcnt could fall below 0. + */ +#if 0 // GraalPy change: different implementation PyDictObject *mp = (PyDictObject *)op; PyDictKeysObject *keys = mp->ma_keys; Py_ssize_t i, n = keys->dk_nentries; @@ -3524,6 +3546,7 @@ dict_traverse(PyObject *op, visitproc visit, void *arg) } } } +#endif // GraalPy change return 0; } @@ -3534,6 +3557,7 @@ dict_tp_clear(PyObject *op) return 0; } +#if 0 // GraalPy change static PyObject *dictiter_new(PyDictObject *, PyTypeObject *); Py_ssize_t @@ -3805,38 +3829,39 @@ PyDoc_STRVAR(dictionary_doc, " d[k] = v\n" "dict(**kwargs) -> new dictionary initialized with the name=value pairs\n" " in the keyword argument list. For example: dict(one=1, two=2)"); +#endif // GraalPy change PyTypeObject PyDict_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "dict", sizeof(PyDictObject), 0, - (destructor)dict_dealloc, /* tp_dealloc */ + 0, /* tp_dealloc */ // GraalPy change: nulled 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ - (reprfunc)dict_repr, /* tp_repr */ - &dict_as_number, /* tp_as_number */ - &dict_as_sequence, /* tp_as_sequence */ - &dict_as_mapping, /* tp_as_mapping */ + 0, /* tp_repr */ // GraalPy change: nulled + 0, /* tp_as_number */ // GraalPy change: nulled + 0, /* tp_as_sequence */ // GraalPy change: nulled + 0, /* tp_as_mapping */ // GraalPy change: nulled PyObject_HashNotImplemented, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ + 0, /* tp_getattro */ // GraalPy change: nulled 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS | _Py_TPFLAGS_MATCH_SELF | Py_TPFLAGS_MAPPING, /* tp_flags */ - dictionary_doc, /* tp_doc */ + 0, /* tp_doc */ // GraalPy change: nulled dict_traverse, /* tp_traverse */ dict_tp_clear, /* tp_clear */ - dict_richcompare, /* tp_richcompare */ + 0, /* tp_richcompare */ // GraalPy change: nulled 0, /* tp_weaklistoffset */ - (getiterfunc)dict_iter, /* tp_iter */ + 0, /* tp_iter */ 0, /* tp_iternext */ - mapp_methods, /* tp_methods */ + 0, /* tp_methods */ // GraalPy change: nulled 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ @@ -3844,13 +3869,14 @@ PyTypeObject PyDict_Type = { 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ - dict_init, /* tp_init */ - _PyType_AllocNoTrack, /* tp_alloc */ - dict_new, /* tp_new */ - PyObject_GC_Del, /* tp_free */ + 0, /* tp_init */ // GraalPy change: nulled + 0, /* tp_alloc */ // GraalPy change: nulled + 0, /* tp_new */ // GraalPy change: nulled + GraalPyObject_GC_Del, /* tp_free */ // GraalPy change: different function +#if 0 // GraalPy change .tp_vectorcall = dict_vectorcall, -}; #endif // GraalPy change +}; /* For backward compatibility with old dictionary interface */ diff --git a/graalpython/com.oracle.graal.python.cext/src/floatobject.c b/graalpython/com.oracle.graal.python.cext/src/floatobject.c index 5fb3dfdd5f..d7342b4bc1 100644 --- a/graalpython/com.oracle.graal.python.cext/src/floatobject.c +++ b/graalpython/com.oracle.graal.python.cext/src/floatobject.c @@ -301,7 +301,6 @@ PyFloat_AsDouble(PyObject *op) { // GraalPy change: read from native object stub or upcall for managed if (points_to_py_handle_space(op)) { -#ifndef GRAALVM_PYTHON_LLVM_MANAGED if (PyFloat_Check(op)) { double val = ((GraalPyFloatObject*) pointer_to_stub(op))->ob_fval; #ifndef NDEBUG @@ -311,7 +310,6 @@ PyFloat_AsDouble(PyObject *op) #endif return val; } -#endif /* GRAALVM_PYTHON_LLVM_MANAGED */ return GraalPyTruffleFloat_AsDouble(op); } diff --git a/graalpython/com.oracle.graal.python.cext/src/gcmodule.c b/graalpython/com.oracle.graal.python.cext/src/gcmodule.c index 1d26df3515..3d0ede7b82 100644 --- a/graalpython/com.oracle.graal.python.cext/src/gcmodule.c +++ b/graalpython/com.oracle.graal.python.cext/src/gcmodule.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Oracle and/or its affiliates. +/* Copyright (c) 2024, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2024 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -37,11 +37,42 @@ #endif // GraalPy change #include "pycore_object.h" #include "pycore_pyerrors.h" -#if 0 // GraalPy change #include "pycore_pystate.h" // _PyThreadState_GET() #include "pydtrace.h" +static inline int +call_traverse(traverseproc traverse, PyObject *op, visitproc visit, void *arg) +{ + if (!traverse) { + PyTruffle_Log(PY_TRUFFLE_LOG_FINE, + "type '%.100s' is a GC type but tp_traverse is NULL", + Py_TYPE((op))->tp_name); + return 0; + } else { + if (_PyObject_IsFreed(op)) { + PyTruffle_Log(PY_TRUFFLE_LOG_FINE, + "we tried to call tp_traverse on a freed object at %p (ctx %p)!", + op, arg); + return 0; + } + if (_PyObject_IsFreed((PyObject *)Py_TYPE(op))) { + PyTruffle_Log(PY_TRUFFLE_LOG_FINE, + "we tried to call tp_traverse on an object at %p with a freed type at %p (ctx %p)!", + op, Py_TYPE(op), arg); + return 0; + } + return traverse(op, (visitproc)visit, arg); + } + +} + +#define CALL_TRAVERSE(traverse, op, visit_fun, ctx) ((void) call_traverse((traverse), (op), (visitproc)(visit_fun), (ctx))) + +#define is_managed points_to_py_handle_space + +#if 0 // GraalPy change typedef struct _gc_runtime_state GCState; +#endif // GraalPy change /*[clinic input] module gc @@ -56,6 +87,8 @@ module gc #define GC_NEXT _PyGCHead_NEXT #define GC_PREV _PyGCHead_PREV +#define UNTAG _PyGCHead_UNTAG + // update_refs() set this bit for all objects in current generation. // subtract_refs() and move_unreachable() uses this to distinguish // visited object is in GCing or not. @@ -86,32 +119,32 @@ module gc static inline int gc_is_collecting(PyGC_Head *g) { - return (g->_gc_prev & PREV_MASK_COLLECTING) != 0; + return (UNTAG(g)->_gc_prev & PREV_MASK_COLLECTING) != 0; } static inline void gc_clear_collecting(PyGC_Head *g) { - g->_gc_prev &= ~PREV_MASK_COLLECTING; + UNTAG(g)->_gc_prev &= ~PREV_MASK_COLLECTING; } static inline Py_ssize_t gc_get_refs(PyGC_Head *g) { - return (Py_ssize_t)(g->_gc_prev >> _PyGC_PREV_SHIFT); + return (Py_ssize_t)(UNTAG(g)->_gc_prev >> _PyGC_PREV_SHIFT); } static inline void gc_set_refs(PyGC_Head *g, Py_ssize_t refs) { - g->_gc_prev = (g->_gc_prev & ~_PyGC_PREV_MASK) + UNTAG(g)->_gc_prev = (UNTAG(g)->_gc_prev & ~_PyGC_PREV_MASK) | ((uintptr_t)(refs) << _PyGC_PREV_SHIFT); } static inline void gc_reset_refs(PyGC_Head *g, Py_ssize_t refs) { - g->_gc_prev = (g->_gc_prev & _PyGC_PREV_MASK_FINALIZED) + UNTAG(g)->_gc_prev = (UNTAG(g)->_gc_prev & _PyGC_PREV_MASK_FINALIZED) | PREV_MASK_COLLECTING | ((uintptr_t)(refs) << _PyGC_PREV_SHIFT); } @@ -122,7 +155,7 @@ gc_decref(PyGC_Head *g) _PyObject_ASSERT_WITH_MSG(FROM_GC(g), gc_get_refs(g) > 0, "refcount is too small"); - g->_gc_prev -= 1 << _PyGC_PREV_SHIFT; + UNTAG(g)->_gc_prev -= 1 << _PyGC_PREV_SHIFT; } /* set for debugging information */ @@ -137,11 +170,20 @@ gc_decref(PyGC_Head *g) #define GEN_HEAD(gcstate, n) (&(gcstate)->generations[n].head) +// GraalPy change +static inline GCState * +graalpy_get_gc_state(PyThreadState *tstate) +{ + return tstate->gc; +} + + static GCState * get_gc_state(void) { - PyInterpreterState *interp = _PyInterpreterState_GET(); - return &interp->gc; + // GraalPy change: different implementation + PyThreadState *tstate = _PyThreadState_GET(); + return graalpy_get_gc_state(tstate); } @@ -165,6 +207,7 @@ _PyGC_InitState(GCState *gcstate) } +#if 0 // GraalPy change PyStatus _PyGC_Init(PyInterpreterState *interp) { @@ -182,6 +225,7 @@ _PyGC_Init(PyInterpreterState *interp) return _PyStatus_OK(); } +#endif // GraalPy change /* @@ -242,21 +286,21 @@ gc_list_init(PyGC_Head *list) { // List header must not have flags. // We can assign pointer by simple cast. - list->_gc_prev = (uintptr_t)list; - list->_gc_next = (uintptr_t)list; + UNTAG(list)->_gc_prev = (uintptr_t)list; + UNTAG(list)->_gc_next = (uintptr_t)list; } static inline int gc_list_is_empty(PyGC_Head *list) { - return (list->_gc_next == (uintptr_t)list); + return (UNTAG(list)->_gc_next == (uintptr_t)list); } /* Append `node` to `list`. */ static inline void gc_list_append(PyGC_Head *node, PyGC_Head *list) { - PyGC_Head *last = (PyGC_Head *)list->_gc_prev; + PyGC_Head *last = (PyGC_Head *)UNTAG(list)->_gc_prev; // last <-> node _PyGCHead_SET_PREV(node, last); @@ -264,7 +308,7 @@ gc_list_append(PyGC_Head *node, PyGC_Head *list) // node <-> list _PyGCHead_SET_NEXT(node, list); - list->_gc_prev = (uintptr_t)node; + UNTAG(list)->_gc_prev = (uintptr_t)node; } /* Remove `node` from the gc list it's currently in. */ @@ -277,7 +321,7 @@ gc_list_remove(PyGC_Head *node) _PyGCHead_SET_NEXT(prev, next); _PyGCHead_SET_PREV(next, prev); - node->_gc_next = 0; /* object is not currently tracked */ + UNTAG(node)->_gc_next = 0; /* object is not currently tracked */ } /* Move `node` from the gc list it's currently in (which is not explicitly @@ -295,10 +339,10 @@ gc_list_move(PyGC_Head *node, PyGC_Head *list) /* Relink at end of new list. */ // list must not have flags. So we can skip macros. - PyGC_Head *to_prev = (PyGC_Head*)list->_gc_prev; + PyGC_Head *to_prev = (PyGC_Head*)UNTAG(list)->_gc_prev; _PyGCHead_SET_PREV(node, to_prev); _PyGCHead_SET_NEXT(to_prev, node); - list->_gc_prev = (uintptr_t)node; + UNTAG(list)->_gc_prev = (uintptr_t)node; _PyGCHead_SET_NEXT(node, list); } @@ -381,8 +425,8 @@ enum flagstates {collecting_clear_unreachable_clear, static void validate_list(PyGC_Head *head, enum flagstates flags) { - assert((head->_gc_prev & PREV_MASK_COLLECTING) == 0); - assert((head->_gc_next & NEXT_MASK_UNREACHABLE) == 0); + assert((UNTAG(head)->_gc_prev & PREV_MASK_COLLECTING) == 0); + assert((UNTAG(head)->_gc_next & NEXT_MASK_UNREACHABLE) == 0); uintptr_t prev_value = 0, next_value = 0; switch (flags) { case collecting_clear_unreachable_clear: @@ -404,11 +448,11 @@ validate_list(PyGC_Head *head, enum flagstates flags) PyGC_Head *gc = GC_NEXT(head); while (gc != head) { PyGC_Head *trueprev = GC_PREV(gc); - PyGC_Head *truenext = (PyGC_Head *)(gc->_gc_next & ~NEXT_MASK_UNREACHABLE); + PyGC_Head *truenext = (PyGC_Head *)(UNTAG(gc)->_gc_next & ~NEXT_MASK_UNREACHABLE); assert(truenext != NULL); assert(trueprev == prev); - assert((gc->_gc_prev & PREV_MASK_COLLECTING) == prev_value); - assert((gc->_gc_next & NEXT_MASK_UNREACHABLE) == next_value); + assert((UNTAG(gc)->_gc_prev & PREV_MASK_COLLECTING) == prev_value); + assert((UNTAG(gc)->_gc_next & NEXT_MASK_UNREACHABLE) == next_value); prev = gc; gc = truenext; } @@ -420,6 +464,205 @@ validate_list(PyGC_Head *head, enum flagstates flags) /*** end of list stuff ***/ +/* GraalPy change: additions start */ + +static int +visit_reachable(PyObject *op, PyGC_Head *reachable); + +/* A traversal callback for move_unreachable. + * + * This function is only used to traverse the referents of an object that was + * moved from 'unreachable' to 'young' because it was made reachable due to a + * weak candidate (a managed object). Therefore, we know that the caller of this + * function is part of a reference cycle. So, if the visited object is a managed + * object, we need to push this native reference into Java. + */ +static int +visit_collect_managed_referents(PyObject *op, GraalPyGC_Cycle *cycle) +{ + // We're only interested in objects in the generation being collected. + if (!_PyObject_IS_GC(op)) { + return 0; + } + + // capture references to objects (to replicate them in Java) + GraalPyGC_CycleNode *n = (GraalPyGC_CycleNode *)malloc(sizeof(GraalPyGC_CycleNode)); + if (n == NULL) { + return -1; + } + n->item = op; + n->next = cycle->head; + cycle->head = n; + cycle->n++; + + return visit_reachable(op, cycle->reachable); +} + +/* Traverses the references of the given object and if it has references to + * managed objects that have 'gc_refs <= MANAGED_REFCNT', all native references + * will be pushed to Java. + */ +static int +push_native_references_to_managed(PyObject *op, GraalPyGC_Cycle *cycle) +{ + GraalPyGC_CycleNode *n; + GraalPyGC_CycleNode *next; + + // avoid costly upcalls + if (cycle->n > 0) { + int dead = 0; + // Some managed handles can be already collected if the GC is already cleaning the cycle + for (n = cycle->head; n != NULL; n = n->next) { + if (points_to_py_handle_space(n->item)) { + GraalPyObject* obj = (GraalPyObject*)pointer_to_stub(n->item); + if (obj->handle_table_index == 0) { + dead = 1; + break; + } + } + } + if (!dead) { + GraalPyTruffleObject_ReplicateNativeReferences(op, cycle->head, cycle->n); + } + } + + // destroy list + for (n = cycle->head; n != NULL; n = next) { + assert (_PyObject_IS_GC(n->item)); + // rescue 'next' + next = n->next; + // free current node + free(n); + } + cycle->head = NULL; + return 0; +} + +static int +visit_weak_reachable(PyObject *op, PyGC_Head *reachable) +{ + if (!_PyObject_IS_GC(op)) { + return 0; + } + + PyGC_Head *gc = AS_GC(op); + + /* 'visit_reachable' tests at this point for 'gc_is_collecting(gc)'. + * In this case, we don't because for weak candidates, we already + * cleared the flag to avoid that 'visit_reachable' is moving them + * back into 'young' list in the previous phase. However, + * 'NEXT_MASK_UNREACHABLE' is set. + */ + + // It would be a logic error elsewhere if the collecting flag were set on + // an untracked object. + assert(UNTAG(gc)->_gc_next != 0); + + /* Note: one could expect that we need to test + * 'gc_get_refs(gc) == MANAGED_REFCNT' but that's no longer true because in + * the previous phase (i.e. 'move_unreachable') when we move the object into + * list 'weak_candidates', we already relink _gc_prev which is also used to + * store gc_refs. So, we solely need to rely on flag NEXT_MASK_UNREACHABLE. + * Recall that this flag indicates if the node is currently in 'unreachable' + * or in 'weak_candidates'. The node cannot be in 'unreachable' because then + * it would have been moved to 'reachable' already in phase + * 'move_unreachable'. + */ + if (UNTAG(gc)->_gc_next & NEXT_MASK_UNREACHABLE) { + _PyObject_ASSERT_WITH_MSG(op, Py_REFCNT(op) > MANAGED_REFCNT, "refcount is too small"); + + /* This object must be in 'weak_candidates' and will be made weak if it + * remains there. However, this visit function is only called if the + * owner of the reference is reachable from managed and strongly + * reachable from native. In this situation, we need to rescure the weak + * candidate. This is best explained by an example. Assume 'n0' is a + * native object and 'm0' is a managed object. + * + * Java/native => n0 =ht=> m0 + * + * In this example, we will replicate the reference 'n0 =ht=> m0' to + * Java into the appropriate 'PythonAbstractNativeObject' wrapper. If + * the Java reference disappears (i.e. the wrapper dies), replicated + * reference is lost. Now, 'n0' is still strongly reachable from native + * and if 'm0' would then only be weakly referenced, we end up with a + * dangling pointer. + */ + // Manually unlink gc from unreachable list because the list functions + // don't work right in the presence of NEXT_MASK_UNREACHABLE flags. + PyGC_Head *prev = GC_PREV(gc); + PyGC_Head *next = (PyGC_Head*)(UNTAG(gc)->_gc_next & ~NEXT_MASK_UNREACHABLE); + _PyObject_ASSERT(FROM_GC(prev), + UNTAG(prev)->_gc_next & NEXT_MASK_UNREACHABLE); + _PyObject_ASSERT(FROM_GC(next), + UNTAG(next)->_gc_next & NEXT_MASK_UNREACHABLE); + UNTAG(prev)->_gc_next = UNTAG(gc)->_gc_next; // copy NEXT_MASK_UNREACHABLE + _PyGCHead_SET_PREV(next, prev); + + gc_list_append(gc, reachable); + } + return 0; +} + +static int +visit_strong_reachable(PyObject *op, void *unused) +{ + if (!is_managed(op) || !_PyObject_IS_GC(op)) { + return 0; + } + + if (!_PyObject_GC_IS_TRACKED(op)) { + _PyObject_GC_TRACK(op); + } + GraalPyTruffle_NotifyRefCount(op, Py_REFCNT(op)); + return 0; +} + +/* Performs an upcall to test if the given object is referenced from managed + * code. + */ +static inline int +is_referenced_from_managed(PyGC_Head *gc) +{ + return is_managed(gc) || GraalPyTruffle_IsReferencedFromManaged(FROM_GC(gc)); +} + +/* Breaks a reference cycle that involves managed objects. This is done by + * making the handle table reference of the managed object weak. + * + * This is necessary because if a native object references a managed object, the + * reference count of the native object stub will be increased such that it is + * larger than MANAGED_REFCNT and the corresponding handle table reference will + * be strong. It is then impossible to collect the managed object because we + * don't know if it is only referenced from native objects (via the handle + * table) or if there is another reference somewhere in the interpreter from + * managed code. + * + * Making the handle table reference weak is dangerous. This is best explained + * by an example: Assume we have a managed list 'l' and a native object 'n' + * in a reference cycle: + * + * l -> n -> l + * + * This is how it is implemented: + * + * handle_table -> (ptr(l), l) + * l -> n -> ptr(l) + * + * If managed code still references 'l', it can indirectly access 'n' and create + * a strong reference to it. This would make 'l' again reachable via the handle + * table but since it only weakly references 'l', the list may be collected by + * the Java GC leading to dangling pointer. + * + * We solve this by "transferring" the last collection to the Java GC. More + * specifically, we determine the objects of a reference cycle and store them in + * a Java array that is then referenced from each wrapper of native objects in + * the reference cycle. Therefore, if a native object of the cycle is then again + * used in managed code, it will keep all objects of the cycle alive. + * + * see `GraalPyTruffleObject_ReplicateNativeReferences` + */ + +/* GraalPy change: additions end */ /* Set all gc_refs = ob_refcnt. After this, gc_refs is > 0 and * PREV_MASK_COLLECTING bit is set for all objects in containers. @@ -484,9 +727,8 @@ subtract_refs(PyGC_Head *containers) for (; gc != containers; gc = GC_NEXT(gc)) { PyObject *op = FROM_GC(gc); traverse = Py_TYPE(op)->tp_traverse; - (void) traverse(op, - (visitproc)visit_decref, - op); + // GraalPy change + CALL_TRAVERSE(traverse, op, visit_decref, op); } } @@ -510,9 +752,10 @@ visit_reachable(PyObject *op, PyGC_Head *reachable) } // It would be a logic error elsewhere if the collecting flag were set on // an untracked object. - assert(gc->_gc_next != 0); + assert(UNTAG(gc)->_gc_next != 0); - if (gc->_gc_next & NEXT_MASK_UNREACHABLE) { + const Py_ssize_t gc_refs_reset = is_managed(gc) ? MANAGED_REFCNT + 1 : 1; // GraalPy change + if (UNTAG(gc)->_gc_next & NEXT_MASK_UNREACHABLE) { /* This had gc_refs = 0 when move_unreachable got * to it, but turns out it's reachable after all. * Move it back to move_unreachable's 'young' list, @@ -522,24 +765,27 @@ visit_reachable(PyObject *op, PyGC_Head *reachable) // Manually unlink gc from unreachable list because the list functions // don't work right in the presence of NEXT_MASK_UNREACHABLE flags. PyGC_Head *prev = GC_PREV(gc); - PyGC_Head *next = (PyGC_Head*)(gc->_gc_next & ~NEXT_MASK_UNREACHABLE); + PyGC_Head *next = (PyGC_Head*)(UNTAG(gc)->_gc_next & ~NEXT_MASK_UNREACHABLE); _PyObject_ASSERT(FROM_GC(prev), - prev->_gc_next & NEXT_MASK_UNREACHABLE); + UNTAG(prev)->_gc_next & NEXT_MASK_UNREACHABLE); _PyObject_ASSERT(FROM_GC(next), - next->_gc_next & NEXT_MASK_UNREACHABLE); - prev->_gc_next = gc->_gc_next; // copy NEXT_MASK_UNREACHABLE + UNTAG(next)->_gc_next & NEXT_MASK_UNREACHABLE); + UNTAG(prev)->_gc_next = UNTAG(gc)->_gc_next; // copy NEXT_MASK_UNREACHABLE _PyGCHead_SET_PREV(next, prev); gc_list_append(gc, reachable); - gc_set_refs(gc, 1); + gc_set_refs(gc, gc_refs_reset); // GraalPy change: 1->gc_refs_reset } - else if (gc_refs == 0) { + else if (gc_refs == 0 || + // GraalPy change: the additional condition, managed objects with MANAGED_REFCNT + // may be still reachanble from managed, we must not declare them unreachable + (gc_refs == MANAGED_REFCNT && is_managed(gc))) { /* This is in move_unreachable's 'young' list, but * the traversal hasn't yet gotten to it. All * we need to do is tell move_unreachable that it's * reachable. */ - gc_set_refs(gc, 1); + gc_set_refs(gc, gc_refs_reset); // GraalPy change: 1->gc_refs_reset } /* Else there's nothing to do. * If gc_refs > 0, it must be in move_unreachable's 'young' @@ -551,6 +797,23 @@ visit_reachable(PyObject *op, PyGC_Head *reachable) return 0; } +static inline void +gc_list_move_with_mask_unreachable(PyGC_Head *prev, PyGC_Head *gc, PyGC_Head *target_list) +{ + // Move gc to unreachable. + // No need to gc->next->prev = prev because it is single linked. + UNTAG(prev)->_gc_next = UNTAG(gc)->_gc_next; + + // We can't use gc_list_append() here because we use + // NEXT_MASK_UNREACHABLE here. + PyGC_Head *last = GC_PREV(target_list); + + UNTAG(last)->_gc_next = (NEXT_MASK_UNREACHABLE | (uintptr_t)gc); + _PyGCHead_SET_PREV(gc, last); + UNTAG(gc)->_gc_next = (NEXT_MASK_UNREACHABLE | (uintptr_t)target_list); + UNTAG(target_list)->_gc_prev = (uintptr_t)gc; +} + /* Move the unreachable objects from young to unreachable. After this, * all objects in young don't have PREV_MASK_COLLECTING flag and * unreachable have the flag. @@ -564,11 +827,16 @@ visit_reachable(PyObject *op, PyGC_Head *reachable) * So we can not gc_list_* functions for unreachable until we remove the flag. */ static void -move_unreachable(PyGC_Head *young, PyGC_Head *unreachable) +move_unreachable(PyGC_Head *young, PyGC_Head *unreachable, + PyGC_Head *weak_candidates /* GraalPy change */) { // previous elem in the young list, used for restore gc_prev. PyGC_Head *prev = young; PyGC_Head *gc = GC_NEXT(young); + Py_ssize_t gc_refcnt; + GraalPyGC_Cycle cycle = { NULL, 0, young }; + + assert (young != weak_candidates); /* Invariants: all objects "to the left" of us in young are reachable * (directly or indirectly) from outside the young list as it was at entry. @@ -580,7 +848,8 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable) */ while (gc != young) { - if (gc_get_refs(gc)) { + gc_refcnt = gc_get_refs(gc); + if (gc_refcnt) { /* gc is definitely reachable from outside the * original 'young'. Mark it as such, and traverse * its pointers to find any other objects that may @@ -589,20 +858,51 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable) * so we have to wait until it returns to determine * the next object to visit. */ + PyObject *op = FROM_GC(gc); traverseproc traverse = Py_TYPE(op)->tp_traverse; _PyObject_ASSERT_WITH_MSG(op, gc_get_refs(gc) > 0, "refcount is too small"); // NOTE: visit_reachable may change gc->_gc_next when // young->_gc_prev == gc. Don't do gc = GC_NEXT(gc) before! - (void) traverse(op, - (visitproc)visit_reachable, - (void *)young); - // relink gc_prev to prev element. - _PyGCHead_SET_PREV(gc, prev); + if (PyTruffle_PythonGC()) { + // GraalPy change: this branch, else branch is original CPython code + cycle.head = NULL; + cycle.n = 0; + assert (cycle.reachable == weak_candidates ); + /* visit_collect_managed_referents is visit_reachable + capture the references into "cycle" */ + CALL_TRAVERSE(traverse, op, visit_collect_managed_referents, (void *)&cycle); + + /* replicate any native reference to managed objects to Java */ + push_native_references_to_managed(op, &cycle); + } else { + CALL_TRAVERSE(traverse, op, visit_reachable, (void *)young); + } + // gc is not COLLECTING state after here. gc_clear_collecting(gc); - prev = gc; + + if (gc_refcnt == MANAGED_REFCNT && is_managed(gc) && + Py_REFCNT(op) > MANAGED_REFCNT) { + // The refcount fell to MANAGED_REFCNT, we have a managed object that was + // part of a cycle and is no longer referenced from native space. + + // Assertion is enough because if Python GC is disabled, we will + // never track managed objects. + assert (PyTruffle_PythonGC()); + /* Move gc to weak_candidates *AND* set NEXT_MASK_UNREACHABLE. + * However, since we clear PREV_MASK_COLLECTING, it won't be + * moved back to 'young' by 'visit_reachable'. + */ + // gc_list_move(gc, weak_candidates); + gc_list_move_with_mask_unreachable(prev, gc, weak_candidates); + } + else { + // relink gc_prev to prev element. + _PyGCHead_SET_PREV(gc, prev); + + prev = gc; + } } else { /* This *may* be unreachable. To make progress, @@ -613,28 +913,81 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable) * young if that's so, and we'll see it again. */ // Move gc to unreachable. - // No need to gc->next->prev = prev because it is single linked. - prev->_gc_next = gc->_gc_next; - // We can't use gc_list_append() here because we use - // NEXT_MASK_UNREACHABLE here. - PyGC_Head *last = GC_PREV(unreachable); // NOTE: Since all objects in unreachable set has // NEXT_MASK_UNREACHABLE flag, we set it unconditionally. // But this may pollute the unreachable list head's 'next' pointer // too. That's semantically senseless but expedient here - the // damage is repaired when this function ends. - last->_gc_next = (NEXT_MASK_UNREACHABLE | (uintptr_t)gc); - _PyGCHead_SET_PREV(gc, last); - gc->_gc_next = (NEXT_MASK_UNREACHABLE | (uintptr_t)unreachable); - unreachable->_gc_prev = (uintptr_t)gc; + gc_list_move_with_mask_unreachable(prev, gc, unreachable); } - gc = (PyGC_Head*)prev->_gc_next; + gc = (PyGC_Head*)UNTAG(prev)->_gc_next; } // young->_gc_prev must be last element remained in the list. - young->_gc_prev = (uintptr_t)prev; + UNTAG(young)->_gc_prev = (uintptr_t)prev; // don't let the pollution of the list head's next pointer leak - unreachable->_gc_next &= ~NEXT_MASK_UNREACHABLE; + UNTAG(unreachable)->_gc_next &= ~NEXT_MASK_UNREACHABLE; + // the pollution of the weak_candidates list head's next pointer is fixed in + // 'move_weak_reachable' +} + +/* GraalPy change: added 'move_weak_reachable' */ +static void +move_weak_reachable(PyGC_Head *young, PyGC_Head *weak_candidates) +{ + // previous elem in the young list, used for restore gc_prev. + PyGC_Head *prev = young; + PyGC_Head *gc = GC_NEXT(young); + + assert (young != weak_candidates); + /* This phase is only necessary if managed objects take part in the Python + * GC. The caller must already check this option. + */ + assert (PyTruffle_PythonGC()); + + /* Invariants: all objects "to the left" of us in young are reachable + * (directly or indirectly) from outside the young list as it was at entry. + * + * All other objects from the original young "to the left" of us are in + * unreachable now, and have NEXT_MASK_UNREACHABLE. All objects to the + * left of us in 'young' now have been scanned, and no objects here + * or to the right have been scanned yet. + */ + + while (gc != young) { + Py_ssize_t gc_refcnt = gc_get_refs(gc); + + assert(gc_is_collecting(gc)); + + /* This phase is done after 'move_unreachable' and so all object + * remaining in 'young' must have a non-zero gc_refcnt. + */ + assert(gc_refcnt); + /* If gc_refcnt s not MANAGED_REFCNT, then we know that this object is + * referenced from native (e.g. stored in a global field). In case that + * 'gc_refcnt == MANAGED_REFCNT' we don't know if the object is only + * referenced from managed or has many referenced from native. We need + * to disambiguate by doing an upcall an check if there is a wrapper. + * If not, then we also know that there are several references from + * native. + */ + if (gc_refcnt > 0 && (gc_refcnt > MANAGED_REFCNT || !is_referenced_from_managed(gc))) { + PyObject* op = FROM_GC(gc); + traverseproc traverse = Py_TYPE(op)->tp_traverse; + CALL_TRAVERSE(traverse, op, visit_weak_reachable, (void *)young); + } + + // relink gc_prev to prev element. + _PyGCHead_SET_PREV(gc, prev); + // gc is not COLLECTING state after here. + gc_clear_collecting(gc); + + prev = gc; + gc = (PyGC_Head*)UNTAG(prev)->_gc_next; + } + // young->_gc_prev must be last element remained in the list. + UNTAG(young)->_gc_prev = (uintptr_t)prev; + UNTAG(weak_candidates)->_gc_next &= ~NEXT_MASK_UNREACHABLE; } static void @@ -666,6 +1019,22 @@ untrack_dicts(PyGC_Head *head) } } +/* Try to untrack all currently tracked dictionaries */ +static inline void +commit_weak_candidate(PyGC_Head *weak_candidates) +{ + // avoid upcalls for empty lists + if (!gc_list_is_empty(weak_candidates)) { + /* This call will overwrite '_gc_prev' and '_gc_next' with zero which + * essentially untracks all objects. The list 'weak_candidates' is no + * longer used after that but just to be sure, we re-init it to have a + * valid head. + */ + GraalPyTruffleObject_GC_EnsureWeak(weak_candidates); + gc_list_init(weak_candidates); + } +} + /* Return true if object has a pre-PEP 442 finalization method. */ static int has_legacy_finalizer(PyObject *op) @@ -682,7 +1051,7 @@ static void move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers) { PyGC_Head *gc, *next; - assert((unreachable->_gc_next & NEXT_MASK_UNREACHABLE) == 0); + assert((UNTAG(unreachable)->_gc_next & NEXT_MASK_UNREACHABLE) == 0); /* March over unreachable. Move objects with finalizers into * `finalizers`. @@ -690,9 +1059,9 @@ move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers) for (gc = GC_NEXT(unreachable); gc != unreachable; gc = next) { PyObject *op = FROM_GC(gc); - _PyObject_ASSERT(op, gc->_gc_next & NEXT_MASK_UNREACHABLE); - gc->_gc_next &= ~NEXT_MASK_UNREACHABLE; - next = (PyGC_Head*)gc->_gc_next; + _PyObject_ASSERT(op, UNTAG(gc)->_gc_next & NEXT_MASK_UNREACHABLE); + UNTAG(gc)->_gc_next &= ~NEXT_MASK_UNREACHABLE; + next = (PyGC_Head*)UNTAG(gc)->_gc_next; if (has_legacy_finalizer(op)) { gc_clear_collecting(gc); @@ -708,11 +1077,11 @@ clear_unreachable_mask(PyGC_Head *unreachable) assert(((uintptr_t)unreachable & NEXT_MASK_UNREACHABLE) == 0); PyGC_Head *gc, *next; - assert((unreachable->_gc_next & NEXT_MASK_UNREACHABLE) == 0); + assert((UNTAG(unreachable)->_gc_next & NEXT_MASK_UNREACHABLE) == 0); for (gc = GC_NEXT(unreachable); gc != unreachable; gc = next) { - _PyObject_ASSERT((PyObject*)FROM_GC(gc), gc->_gc_next & NEXT_MASK_UNREACHABLE); - gc->_gc_next &= ~NEXT_MASK_UNREACHABLE; - next = (PyGC_Head*)gc->_gc_next; + _PyObject_ASSERT((PyObject*)FROM_GC(gc), UNTAG(gc)->_gc_next & NEXT_MASK_UNREACHABLE); + UNTAG(gc)->_gc_next &= ~NEXT_MASK_UNREACHABLE; + next = (PyGC_Head*)UNTAG(gc)->_gc_next; } validate_list(unreachable, collecting_set_unreachable_clear); } @@ -742,9 +1111,8 @@ move_legacy_finalizer_reachable(PyGC_Head *finalizers) for (; gc != finalizers; gc = GC_NEXT(gc)) { /* Note that the finalizers list may grow during this. */ traverse = Py_TYPE(FROM_GC(gc))->tp_traverse; - (void) traverse(FROM_GC(gc), - (visitproc)visit_move, - (void *)finalizers); + // GraalPy change + CALL_TRAVERSE(traverse, FROM_GC(gc), visit_move, (void *)finalizers); } } @@ -1043,12 +1411,14 @@ delete_garbage(PyThreadState *tstate, GCState *gcstate, static void clear_freelists(PyInterpreterState *interp) { +#if 0 // GraalPy change _PyTuple_ClearFreeList(interp); _PyFloat_ClearFreeList(interp); _PyList_ClearFreeList(interp); _PyDict_ClearFreeList(interp); _PyAsyncGen_ClearFreeLists(interp); _PyContext_ClearFreeList(interp); +#endif // GraalPy change } // Show stats for objects in each generations @@ -1099,6 +1469,9 @@ by a call to 'move_legacy_finalizers'), the 'unreachable' list is not a normal list and we can not use most gc_list_* functions for it. */ static inline void deduce_unreachable(PyGC_Head *base, PyGC_Head *unreachable) { + /* GraalPy change: managed objects; candidates for a weak reference */ + PyGC_Head weak_candidates; + validate_list(base, collecting_clear_unreachable_clear); /* Using ob_refcnt and gc_refs, calculate which objects in the * container set are reachable from outside the set (i.e., have a @@ -1144,9 +1517,33 @@ deduce_unreachable(PyGC_Head *base, PyGC_Head *unreachable) { * worth complicating the code to speed just a little. */ gc_list_init(unreachable); - move_unreachable(base, unreachable); // gc_prev is pointer again + gc_list_init(&weak_candidates); + move_unreachable(base, unreachable, &weak_candidates); // gc_prev is pointer again validate_list(base, collecting_clear_unreachable_clear); + validate_list(&weak_candidates, collecting_clear_unreachable_clear); validate_list(unreachable, collecting_set_unreachable_set); + + /* GraalPy change: process weak_candidates to break reference cycles with + * managed objects + */ + + /* We now have replicated all native references to Java. This means that any + * native object that is part of a reference cycle and this cycle involves + * a managed object is now referenced from managed. */ + + /* Make handle table references of all objects in 'weak_candidates' weak. + * This *MUST NOT* be done before native references to managed objects are + * replicated in Java. Otherwise, we might end up with dangling pointers. */ + if (PyTruffle_PythonGC()) { + /* The replication of native references to Java may have updated + * reference counts. We now need the updated ones in order to correctly + * process 'weak_candidates'. + */ + update_refs(base); // gc_prev is used for gc_refs + subtract_refs(base); + move_weak_reachable(base, &weak_candidates); + commit_weak_candidate(&weak_candidates); + } } /* Handle objects that may have resurrected after a call to 'finalize_garbage', moving @@ -1196,8 +1593,14 @@ gc_collect_main(PyThreadState *tstate, int generation, PyGC_Head unreachable; /* non-problematic unreachable trash */ PyGC_Head finalizers; /* objects with, & reachable from, __del__ */ PyGC_Head *gc; - _PyTime_t t1 = 0; /* initialize to prevent a compiler warning */ - GCState *gcstate = &tstate->interp->gc; + // GraalPy change: t1 usage commented out + // _PyTime_t t1 = 0; /* initialize to prevent a compiler warning */ + GCState *gcstate = graalpy_get_gc_state(tstate); // GraalPy change + + if (GraalPyTruffle_DisableReferneceQueuePolling()) { + // reference queue polling is currently active; cannot proceed + return m + n; + } // gc_collect_main() must not be called before _PyGC_Init // or after _PyGC_Fini() @@ -1207,7 +1610,8 @@ gc_collect_main(PyThreadState *tstate, int generation, if (gcstate->debug & DEBUG_STATS) { PySys_WriteStderr("gc: collecting generation %d...\n", generation); show_stats_each_generations(gcstate); - t1 = _PyTime_GetPerfCounter(); + // GraalPy change + // t1 = _PyTime_GetPerfCounter(); } if (PyDTrace_GC_START_ENABLED()) @@ -1303,7 +1707,9 @@ gc_collect_main(PyThreadState *tstate, int generation, debug_cycle("uncollectable", FROM_GC(gc)); } if (gcstate->debug & DEBUG_STATS) { - double d = _PyTime_AsSecondsDouble(_PyTime_GetPerfCounter() - t1); + // GraalPy change + // double d = _PyTime_AsSecondsDouble(_PyTime_GetPerfCounter() - t1); + double d = 0.0; PySys_WriteStderr( "gc: done, %zd unreachable, %zd uncollectable, %.4fs elapsed\n", n+m, n, d); @@ -1348,6 +1754,8 @@ gc_collect_main(PyThreadState *tstate, int generation, PyDTrace_GC_DONE(n + m); } + GraalPyTruffle_EnableReferneceQueuePolling(); + assert(!_PyErr_Occurred(tstate)); return n + m; } @@ -1363,7 +1771,7 @@ invoke_gc_callback(PyThreadState *tstate, const char *phase, assert(!_PyErr_Occurred(tstate)); /* we may get called very early */ - GCState *gcstate = &tstate->interp->gc; + GCState *gcstate = graalpy_get_gc_state(tstate); // GraalPy change if (gcstate->callbacks == NULL) { return; } @@ -1415,7 +1823,7 @@ gc_collect_with_callback(PyThreadState *tstate, int generation) static Py_ssize_t gc_collect_generations(PyThreadState *tstate) { - GCState *gcstate = &tstate->interp->gc; + GCState *gcstate = graalpy_get_gc_state(tstate); // GraalPy change /* Find the oldest generation (highest numbered) where the count * exceeds the threshold. Objects in the that generation and * generations younger than it will be collected. */ @@ -1468,6 +1876,7 @@ gc_collect_generations(PyThreadState *tstate) return n; } +#if 0 // GraalPy change #include "clinic/gcmodule.c.h" /*[clinic input] @@ -1510,6 +1919,7 @@ gc_isenabled_impl(PyObject *module) { return PyGC_IsEnabled(); } +#endif // GraalPy change /*[clinic input] gc.collect -> Py_ssize_t @@ -1536,7 +1946,7 @@ gc_collect_impl(PyObject *module, int generation) return -1; } - GCState *gcstate = &tstate->interp->gc; + GCState *gcstate = graalpy_get_gc_state(tstate); // GraalPy change Py_ssize_t n; if (gcstate->collecting) { /* already collecting, don't do anything */ @@ -1550,6 +1960,7 @@ gc_collect_impl(PyObject *module, int generation) return n; } +#if 0 // GraalPy change /*[clinic input] gc.set_debug @@ -2045,6 +2456,7 @@ PyInit_gc(void) { return PyModuleDef_Init(&gcmodule); } +#endif // GraalPy change /* C API for controlling the state of the garbage collector */ int @@ -2077,7 +2489,7 @@ Py_ssize_t PyGC_Collect(void) { PyThreadState *tstate = _PyThreadState_GET(); - GCState *gcstate = &tstate->interp->gc; + GCState *gcstate = graalpy_get_gc_state(tstate); // GraalPy change if (!gcstate->enabled) { return 0; @@ -2100,7 +2512,8 @@ PyGC_Collect(void) return n; } -Py_ssize_t +// GraalPy change: exported sym because called from Java +PyAPI_FUNC(Py_ssize_t) _PyGC_CollectNoFail(PyThreadState *tstate) { /* Ideally, this function is only called on interpreter shutdown, @@ -2109,7 +2522,7 @@ _PyGC_CollectNoFail(PyThreadState *tstate) during interpreter shutdown (and then never finish it). See http://bugs.python.org/issue8713#msg195178 for an example. */ - GCState *gcstate = &tstate->interp->gc; + GCState *gcstate = graalpy_get_gc_state(tstate); // GraalPy change if (gcstate->collecting) { return 0; } @@ -2121,6 +2534,7 @@ _PyGC_CollectNoFail(PyThreadState *tstate) return n; } +#if 0 // GraalPy change void _PyGC_DumpShutdownStats(PyInterpreterState *interp) { @@ -2157,6 +2571,7 @@ _PyGC_DumpShutdownStats(PyInterpreterState *interp) } } } +#endif // GraalPy change static void @@ -2176,6 +2591,7 @@ gc_fini_untrack(PyGC_Head *list) } +#if 0 // GraalPy change void _PyGC_Fini(PyInterpreterState *interp) { @@ -2195,6 +2611,7 @@ _PyGC_Fini(PyInterpreterState *interp) } } } +#endif // GraalPy change /* for debugging */ void @@ -2216,7 +2633,6 @@ visit_validate(PyObject *op, void *parent_raw) return 0; } #endif -#endif // GraalPy change /* extension modules might be compiled with GC support so these @@ -2225,22 +2641,42 @@ visit_validate(PyObject *op, void *parent_raw) void PyObject_GC_Track(void *op_raw) { - // GraalPy change: different implementation + // GraalPy change if (PyTruffle_Trace_Memory()) { GraalPyTruffleObject_GC_Track(op_raw); } + PyObject *op = _PyObject_CAST(op_raw); + if (_PyObject_GC_IS_TRACKED(op)) { + _PyObject_ASSERT_FAILED_MSG(op, + "object already tracked " + "by the garbage collector"); + } + _PyObject_GC_TRACK(op); + +#ifdef Py_DEBUG + /* Check that the object is valid: validate objects traversed + by tp_traverse() */ + traverseproc traverse = Py_TYPE(op)->tp_traverse; + (void)traverse(op, visit_validate, op); +#endif } void PyObject_GC_UnTrack(void *op_raw) { - // GraalPy change: different implementation + // GraalPy change if (PyTruffle_Trace_Memory()) { GraalPyTruffleObject_GC_UnTrack(op_raw); } + PyObject *op = _PyObject_CAST(op_raw); + /* Obscure: the Py_TRASHCAN mechanism requires that we be able to + * call PyObject_GC_UnTrack twice on an object. + */ + if (_PyObject_GC_IS_TRACKED(op)) { + _PyObject_GC_UNTRACK(op); + } } -#if 0 // GraalPy change int PyObject_IS_GC(PyObject *obj) { @@ -2254,9 +2690,9 @@ _PyObject_GC_Link(PyObject *op) assert(((uintptr_t)g & (sizeof(uintptr_t)-1)) == 0); // g must be correctly aligned PyThreadState *tstate = _PyThreadState_GET(); - GCState *gcstate = &tstate->interp->gc; - g->_gc_next = 0; - g->_gc_prev = 0; + GCState *gcstate = graalpy_get_gc_state(tstate); // GraalPy change + UNTAG(g)->_gc_next = 0; + UNTAG(g)->_gc_prev = 0; gcstate->generations[0].count++; /* number of allocated GC objects */ if (gcstate->generations[0].count > gcstate->generations[0].threshold && gcstate->enabled && @@ -2282,29 +2718,47 @@ gc_alloc(size_t basicsize, size_t presize) if (mem == NULL) { return _PyErr_NoMemory(tstate); } - ((PyObject **)mem)[0] = NULL; - ((PyObject **)mem)[1] = NULL; + // GraalPy change: different header layout + // ((PyObject **)mem)[0] = NULL; + // ((PyObject **)mem)[1] = NULL; + memset(mem, '\0', presize); PyObject *op = (PyObject *)(mem + presize); _PyObject_GC_Link(op); return op; } -#endif // GraalPy change PyObject * _PyObject_GC_New(PyTypeObject *tp) { - // GraalPy change: different implementation - return _PyObject_New(tp); + size_t presize = _PyType_PreHeaderSize(tp); + PyObject *op = gc_alloc(_PyObject_SIZE(tp), presize); + if (op == NULL) { + return NULL; + } + _PyObject_Init(op, tp); + return op; } PyVarObject * _PyObject_GC_NewVar(PyTypeObject *tp, Py_ssize_t nitems) { - // GraalPy change: different implementation - return _PyObject_NewVar(tp, nitems); + size_t size; + PyVarObject *op; + + if (nitems < 0) { + PyErr_BadInternalCall(); + return NULL; + } + size_t presize = _PyType_PreHeaderSize(tp); + size = _PyObject_VAR_SIZE(tp, nitems); + op = (PyVarObject *)gc_alloc(size, presize); + if (op == NULL) { + return NULL; + } + _PyObject_InitVar(op, tp, nitems); + return op; } -#if 0 // GraalPy change PyVarObject * _PyObject_GC_Resize(PyVarObject *op, Py_ssize_t nitems) { @@ -2322,17 +2776,29 @@ _PyObject_GC_Resize(PyVarObject *op, Py_ssize_t nitems) Py_SET_SIZE(op, nitems); return op; } -#endif // GraalPy change void PyObject_GC_Del(void *op) { - // GraalPy change: different implementation - size_t presize = _PyType_PreHeaderSize(((PyObject *)op)->ob_type); + size_t presize = _PyType_PreHeaderSize(Py_TYPE(op)); // GraalPy change + PyGC_Head *g = AS_GC(op); + if (_PyObject_GC_IS_TRACKED(op)) { +#ifdef Py_DEBUG + if (PyErr_WarnExplicitFormat(PyExc_ResourceWarning, "gc", 0, + "gc", NULL, "Object of type %s is not untracked before destruction", + ((PyObject*)op)->ob_type->tp_name)) { + PyErr_WriteUnraisable(NULL); + } +#endif + gc_list_remove(g); + } + GCState *gcstate = get_gc_state(); + if (gcstate->generations[0].count > 0) { + gcstate->generations[0].count--; + } PyObject_Free(((char *)op)-presize); } -#if 0 // GraalPy change int PyObject_GC_IsTracked(PyObject* obj) { @@ -2350,4 +2816,30 @@ PyObject_GC_IsFinalized(PyObject *obj) } return 0; } -#endif // GraalPy change + + +void +GraalPyObject_GC_Del(void *op) +{ + if (is_managed(op)) { + GraalPyTruffleObject_GC_Del(op); + } else { + PyObject_GC_Del(op); + } +} + +/* Exposes 'gc_collect_impl' such that we can call it from Java. */ +PyAPI_FUNC(Py_ssize_t) +GraalPyGC_Collect(int generation) +{ + return gc_collect_impl(NULL, generation); +} + +PyAPI_FUNC(void) +_GraalPyObject_GC_NotifyOwnershipTransfer(PyObject *op) +{ + if (!is_managed(op) && _PyObject_IS_GC(op) && _PyObject_GC_IS_TRACKED(op)) { + traverseproc traverse = Py_TYPE(op)->tp_traverse; + CALL_TRAVERSE(traverse, op, visit_strong_reachable, NULL); + } +} diff --git a/graalpython/com.oracle.graal.python.cext/src/listobject.c b/graalpython/com.oracle.graal.python.cext/src/listobject.c index 2b599ccb86..93a6f56920 100644 --- a/graalpython/com.oracle.graal.python.cext/src/listobject.c +++ b/graalpython/com.oracle.graal.python.cext/src/listobject.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,9 +40,100 @@ */ #include "capi.h" +static int +_list_clear(PyListObject *a) +{ + int64_t i; + PyObject **item; + + /* Because XDECREF can recursively invoke operations on + this list, we make it empty first. */ + i = GraalPyTruffleList_TryGetItems((PyObject *)a, &item); + if (i > 0) { + assert(item != NULL); + while (--i >= 0) { + Py_XDECREF(item[i]); + } + /* CPython calls 'PyMem_Free(item)' here but in our case, this will be + done by the NativeStorageReference. Since we already set the length + to zero, the items won't be decref'd again. */ + } + /* Never fails; the return value can be ignored. + Note that there is no guarantee that the list is actually empty + at this point, because XDECREF may have populated it again! */ + return 0; +} + +static int +list_traverse(PyListObject *o, visitproc visit, void *arg) +{ + int64_t size, i; + PyObject **ob_item; + + /* In GraalPy, we only traverse the list if it has a native storage (which + * is indicated by 'size > 0'). We don't traverse managed storages. For an + * explanation, see 'dictobject.c: dict_traverse'. + */ + if (points_to_py_handle_space(o)) { + size = GraalPyTruffleList_TryGetItems((PyObject *)o, &ob_item); + } else { + size = Py_SIZE(o); + ob_item = o->ob_item; + } + + for (i = size; --i >= 0; ) + Py_VISIT(ob_item[i]); + return 0; +} + +PyTypeObject PyList_Type = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + "list", + sizeof(PyListObject), + 0, + 0, /* tp_dealloc */ // GraalPy change: nulled + 0, /* tp_vectorcall_offset */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_as_async */ + 0, /* tp_repr */ // GraalPy change: nulled + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ // GraalPy change: nulled + 0, /* tp_as_mapping */ // GraalPy change: nulled + PyObject_HashNotImplemented, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ // GraalPy change: nulled + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS | + _Py_TPFLAGS_MATCH_SELF | Py_TPFLAGS_SEQUENCE, /* tp_flags */ + 0, /* tp_doc */ // GraalPy change: nulled + (traverseproc)list_traverse, /* tp_traverse */ + (inquiry)_list_clear, /* tp_clear */ + 0, /* tp_richcompare */ // GraalPy change: nulled + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ // GraalPy change: nulled + 0, /* tp_iternext */ + 0, /* tp_methods */ // GraalPy change: nulled + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ // GraalPy change: nulled + PyType_GenericAlloc, /* tp_alloc */ + PyType_GenericNew, /* tp_new */ + GraalPyObject_GC_Del, /* tp_free */ // GraalPy change: different function + .tp_vectorcall = 0, // GraalPy change: nulled +}; + // alias for internal function, currently used in PyO3 -void _PyList_SET_ITEM(PyObject* a, Py_ssize_t b, PyObject* c) { - return PyList_SET_ITEM(a, b, c); +PyAPI_FUNC(void) _PyList_SET_ITEM(PyObject* a, Py_ssize_t b, PyObject* c) { + PyList_SET_ITEM(a, b, c); } static inline int diff --git a/graalpython/com.oracle.graal.python.cext/src/longobject.c b/graalpython/com.oracle.graal.python.cext/src/longobject.c index 4482ae8922..c211991c0a 100644 --- a/graalpython/com.oracle.graal.python.cext/src/longobject.c +++ b/graalpython/com.oracle.graal.python.cext/src/longobject.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2018, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2018, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2017 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -888,7 +888,7 @@ PyLong_FromVoidPtr(void *p) { // GraalPy change: different implementation // directly do the upcall to avoid a cast to primitive and reference counting - return ((PyObject* (*)(void*))GraalPyLong_FromUnsignedLongLong)(p); + return GraalPyLong_FromUnsignedLongLong((uint64_t)p); } #if 0 // GraalPy change @@ -1904,100 +1904,99 @@ long_from_binary_base(const char **str, int base, PyLongObject **res) PyObject * PyLong_FromString(const char *str, char **pend, int base) { - // GraalPy change: different implementation - int negative = 0, error_if_nonzero = 0; + int sign = 1, error_if_nonzero = 0; + const char *start, *orig_str = str; + PyObject *z = NULL; + PyObject *strobj; + Py_ssize_t slen; + if ((base != 0 && base < 2) || base > 36) { PyErr_SetString(PyExc_ValueError, "int() arg 2 must be >= 2 and <= 36"); return NULL; } - while (*str != '\0' && Py_ISSPACE(Py_CHARMASK(*str))) { + while (*str != '\0' && Py_ISSPACE(*str)) { str++; } if (*str == '+') { ++str; - } else if (*str == '-') { + } + else if (*str == '-') { ++str; - negative = 1; + sign = -1; } if (base == 0) { if (str[0] != '0') { base = 10; - } else if (str[1] == 'x' || str[1] == 'X') { + } + else if (str[1] == 'x' || str[1] == 'X') { base = 16; - str += 2; - } else if (str[1] == 'o' || str[1] == 'O') { + } + else if (str[1] == 'o' || str[1] == 'O') { base = 8; - str += 2; - } else if (str[1] == 'b' || str[1] == 'B') { + } + else if (str[1] == 'b' || str[1] == 'B') { base = 2; - str += 2; - } else { + } + else { /* "old" (C-style) octal literal, now invalid. it might still be zero though */ error_if_nonzero = 1; base = 10; } } - - char* numberStart = str; - int overflow = 0; - int digits = 0; - char prev; - long value; - while (1) { + if (str[0] == '0' && + ((base == 16 && (str[1] == 'x' || str[1] == 'X')) || + (base == 8 && (str[1] == 'o' || str[1] == 'O')) || + (base == 2 && (str[1] == 'b' || str[1] == 'B')))) { + str += 2; + /* One underscore allowed here. */ if (*str == '_') { - if (prev == '_') { - goto error; - } - } else { - unsigned char digit = _PyLong_DigitValue[Py_CHARMASK(*str)]; - if (digit >= base) { + ++str; + } + } + + // GraalPy change: remove the CPython code below and upcall quickly. Only + // optimization we do is to check if this may be a small-ish integer. There + // is a small integer cache and if we're lucky we can just return from + // that. + // In base 2, up to 8 digits may be a small integer, in base 36 8 digits + // still fit easily in 64 bits + for (int i = 0; i < 8; i++) { + char c = str[i]; + if (c == '\0') { + int errsv = errno; + char *endptr; + long long result = strtoll(str, &endptr, base); + if (error_if_nonzero && result != 0) { + // let upcall handle the error reporting + base = 0; break; } - long new_value = value * base - digit; - if (new_value > value) { - // overflow - overflow = 1; + // POSIX.1-2008: strtoll must not set errno on success, and set + // *endptr to str when no conversion is performed + if (errno == 0 && str != endptr) { + while (*endptr && Py_ISSPACE(*endptr)) { + endptr++; + } + if (*endptr == '\0') { + z = PyLong_FromLongLong(sign < 0 ? -result : result); + } } - value = new_value; + errno = errsv; + break; + } else if (!(isascii(c) && isalnum(c))) { + // cannot be a base 2 to 36 digit + break; } - prev = *str; - ++str; - ++digits; - } - - if (prev == '_') { - /* Trailing underscore not allowed. */ - goto error; - } - while (*str != '\0' && Py_ISSPACE(Py_CHARMASK(*str))) { - str++; - } - if (pend != NULL) { - *pend = str; } - if (value == LONG_MIN && !negative) { - overflow = 1; - } - - if (overflow || (error_if_nonzero && value != 0)) { - if (error_if_nonzero) { - base = 0; + if (!z) { + z = GraalPyTruffleLong_FromString((char *)orig_str, base); + if (z) { + // TODO: we should probably set the **pend out argument } - PyObject* string = PyUnicode_FromStringAndSize(numberStart, digits); - PyObject* result = GraalPyTruffleLong_FromString(string, base, negative); - Py_DecRef(string); - return result; - } else { - return PyLong_FromLong(negative ? value : -value); } - - error: - PyErr_Format(PyExc_ValueError, - "invalid literal for int() with base %d: %.200R", - base, PyUnicode_FromString(str)); - return NULL; + return z; } #if 0 // GraalPy change diff --git a/graalpython/com.oracle.graal.python.cext/src/moduleobject.c b/graalpython/com.oracle.graal.python.cext/src/moduleobject.c index 50193b0ba2..c9e19fdaff 100644 --- a/graalpython/com.oracle.graal.python.cext/src/moduleobject.c +++ b/graalpython/com.oracle.graal.python.cext/src/moduleobject.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2022, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2022, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2022 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -258,7 +258,6 @@ _PyModule_CreateInitialized(PyModuleDef* module, int module_api_version) return (PyObject*)m; } -#if 0 // GraalPy change PyObject * PyModule_FromDefAndSpec2(PyModuleDef* def, PyObject *spec, int module_api_version) { @@ -340,8 +339,12 @@ PyModule_FromDefAndSpec2(PyModuleDef* def, PyObject *spec, int module_api_versio } if (PyModule_Check(m)) { - ((PyModuleObject*)m)->md_state = NULL; - ((PyModuleObject*)m)->md_def = def; + // GraalPy change: avoid direct struct access + GraalPy_set_PyModuleObject_md_state((PyModuleObject *)m, NULL); + GraalPy_set_PyModuleObject_md_def((PyModuleObject *)m, def); + // End of GraalPy change, CPython code was next two lines + // ((PyModuleObject*)m)->md_state = NULL; + // ((PyModuleObject*)m)->md_def = def; } else { if (def->m_size > 0 || def->m_traverse || def->m_clear || def->m_free) { PyErr_Format( @@ -361,10 +364,16 @@ PyModule_FromDefAndSpec2(PyModuleDef* def, PyObject *spec, int module_api_versio } if (def->m_methods != NULL) { - ret = _add_methods_to_object(m, nameobj, def->m_methods); - if (ret != 0) { - goto error; + // GraalPy change: use PyModule_AddFunctions instead of _add_methods_to_object + if (PyModule_AddFunctions(m, def->m_methods) != 0) { + Py_DECREF(m); + return NULL; } + // End of GraalPy change, original code below + // ret = _add_methods_to_object(m, nameobj, def->m_methods); + // if (ret != 0) { + // goto error; + // } } if (def->m_doc != NULL) { @@ -397,16 +406,27 @@ PyModule_ExecDef(PyObject *module, PyModuleDef *def) if (def->m_size >= 0) { PyModuleObject *md = (PyModuleObject*)module; - if (md->md_state == NULL) { - /* Always set a state pointer; this serves as a marker to skip - * multiple initialization (importlib.reload() is no-op) */ - md->md_state = PyMem_Malloc(def->m_size); - if (!md->md_state) { + // GraalPy change: avoid direct struct access + if (GraalPy_get_PyModuleObject_md_state(md) == NULL) { + void* md_state = PyMem_Malloc(def->m_size); + if (!md_state) { PyErr_NoMemory(); return -1; } - memset(md->md_state, 0, def->m_size); + memset(md_state, 0, def->m_size); + GraalPy_set_PyModuleObject_md_state(md, md_state); } + // End GraalPy change, original code below + // if (md->md_state == NULL) { + // /* Always set a state pointer; this serves as a marker to skip + // * multiple initialization (importlib.reload() is no-op) */ + // md->md_state = PyMem_Malloc(def->m_size); + // if (!md->md_state) { + // PyErr_NoMemory(); + // return -1; + // } + // memset(md->md_state, 0, def->m_size); + // } } if (def->m_slots == NULL) { @@ -447,7 +467,6 @@ PyModule_ExecDef(PyObject *module, PyModuleDef *def) } return 0; } -#endif // GraalPy change int PyModule_AddFunctions(PyObject *m, PyMethodDef *functions) @@ -555,6 +574,7 @@ PyModule_GetFilenameObject(PyObject *m) Py_INCREF(fileobj); return fileobj; } +#endif // GraalPy change const char * PyModule_GetFilename(PyObject *m) @@ -568,7 +588,6 @@ PyModule_GetFilename(PyObject *m) Py_DECREF(fileobj); /* module dict has still a reference */ return utf8; } -#endif // GraalPy change PyModuleDef* PyModule_GetDef(PyObject* m) @@ -828,10 +847,15 @@ module_getattro(PyModuleObject *m, PyObject *name) "module has no attribute '%U'", name); return NULL; } +#endif // GraalPy change static int module_traverse(PyModuleObject *m, visitproc visit, void *arg) { + // GraalPy change + if (points_to_py_handle_space(m)) { + return GraalPyTruffleModule_Traverse((PyObject *)m, visit, arg); + } /* bpo-39824: Don't call m_traverse() if m_size > 0 and md_state=NULL */ if (m->md_def && m->md_def->m_traverse && (m->md_def->m_size <= 0 || m->md_state != NULL)) @@ -847,6 +871,10 @@ module_traverse(PyModuleObject *m, visitproc visit, void *arg) static int module_clear(PyModuleObject *m) { + // GraalPy change: managed objects don't need to be cleared + if (points_to_py_handle_space(m)) { + return 0; + } /* bpo-39824: Don't call m_clear() if m_size > 0 and md_state=NULL */ if (m->md_def && m->md_def->m_clear && (m->md_def->m_size <= 0 || m->md_state != NULL)) @@ -865,6 +893,7 @@ module_clear(PyModuleObject *m) return 0; } +#if 0 // GraalPy change static PyObject * module_dir(PyObject *self, PyObject *args) { @@ -962,47 +991,47 @@ static PyGetSetDef module_getsets[] = { {"__annotations__", (getter)module_get_annotations, (setter)module_set_annotations}, {NULL} }; +#endif // GraalPy change PyTypeObject PyModule_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "module", /* tp_name */ sizeof(PyModuleObject), /* tp_basicsize */ 0, /* tp_itemsize */ - (destructor)module_dealloc, /* tp_dealloc */ + 0, /* tp_dealloc */ // GraalPy change: nulled 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ - (reprfunc)module_repr, /* tp_repr */ + 0, /* tp_repr */ // GraalPy change: nulled 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ - (getattrofunc)module_getattro, /* tp_getattro */ - PyObject_GenericSetAttr, /* tp_setattro */ + 0, /* tp_getattro */ // GraalPy change: nulled + 0, /* tp_setattro */ // GraalPy change: nulled 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, /* tp_flags */ - module___init____doc__, /* tp_doc */ + 0, /* tp_doc */ // GraalPy change: nulled (traverseproc)module_traverse, /* tp_traverse */ (inquiry)module_clear, /* tp_clear */ 0, /* tp_richcompare */ - offsetof(PyModuleObject, md_weaklist), /* tp_weaklistoffset */ + 0, /* tp_weaklistoffset */ // GraalPy change: nulled 0, /* tp_iter */ 0, /* tp_iternext */ - module_methods, /* tp_methods */ - module_members, /* tp_members */ - module_getsets, /* tp_getset */ + 0, /* tp_methods */ // GraalPy change: nulled + 0, /* tp_members */ // GraalPy change: nulled + 0, /* tp_getset */ // GraalPy change: nulled 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ - offsetof(PyModuleObject, md_dict), /* tp_dictoffset */ - module___init__, /* tp_init */ + 0, /* tp_dictoffset */ // GraalPy change: nulled + 0, /* tp_init */ // GraalPy change: nulled 0, /* tp_alloc */ - new_module, /* tp_new */ - PyObject_GC_Del, /* tp_free */ + 0, /* tp_new */ // GraalPy change: nulled + GraalPyObject_GC_Del, /* tp_free */ // GraalPy change: different function }; -#endif // GraalPy change diff --git a/graalpython/com.oracle.graal.python.cext/src/object.c b/graalpython/com.oracle.graal.python.cext/src/object.c index 877e1c8bb6..b514e8ded1 100644 --- a/graalpython/com.oracle.graal.python.cext/src/object.c +++ b/graalpython/com.oracle.graal.python.cext/src/object.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2018, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2018, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2022 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -156,8 +156,12 @@ _Py_IncRef(PyObject *o) if (refcnt != IMMORTAL_REFCNT) { Py_SET_REFCNT(o, refcnt + 1); - if (points_to_py_handle_space(o) && refcnt == MANAGED_REFCNT) { - GraalPyTruffle_NotifyRefCount(o, refcnt + 1); + if (refcnt == MANAGED_REFCNT) { + if (points_to_py_handle_space(o)) { + GraalPyTruffle_NotifyRefCount(o, refcnt + 1); + } else if (_PyObject_IS_GC(o)) { + _GraalPyObject_GC_NotifyOwnershipTransfer(o); + } } } } @@ -368,7 +372,6 @@ PyObject_Print(PyObject *op, FILE *fp, int flags) return ret; } -#if 0 // GraalPy change /* For debugging convenience. Set a breakpoint here and call it from your DLL */ void _Py_BreakPoint(void) @@ -385,9 +388,14 @@ _Py_BreakPoint(void) int _PyObject_IsFreed(PyObject *op) { + if (points_to_py_handle_space(op)) { + return Graal_PyTruffleObject_IsFreed(op); + } +#if 0 // GraalPy change if (_PyMem_IsPtrFreed(op) || _PyMem_IsPtrFreed(Py_TYPE(op))) { return 1; } +#endif /* ignore op->ob_ref: its value can have be modified by Py_INCREF() and Py_DECREF(). */ #ifdef Py_TRACE_REFS @@ -401,11 +409,14 @@ _PyObject_IsFreed(PyObject *op) return 0; } - /* For debugging convenience. See Misc/gdbinit for some useful gdb hooks */ void _PyObject_Dump(PyObject* op) { + if (points_to_py_handle_space(op)) { + Graal_PyTruffleObject_Dump(op); + return; + } if (_PyObject_IsFreed(op)) { /* It seems like the object memory has been freed: don't access it to prevent a segmentation fault. */ @@ -444,6 +455,7 @@ _PyObject_Dump(PyObject* op) fflush(stderr); } +#if 0 // GraalPy change PyObject * PyObject_Repr(PyObject *v) { @@ -2272,6 +2284,7 @@ Py_ReprLeave(PyObject *obj) /* ignore exceptions because there is no way to report them. */ PyErr_Restore(error_type, error_value, error_traceback); } +#endif // GraalPy change /* Trashcan support. */ @@ -2389,6 +2402,10 @@ _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg, fprintf(stderr, "\n"); fflush(stderr); + // Begin GraalPy change + print_c_stacktrace(); + // End GraalPy change + if (_PyObject_IsFreed(obj)) { /* It seems like the object memory has been freed: don't access it to prevent a segmentation fault. */ @@ -2396,6 +2413,7 @@ _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg, fflush(stderr); } else { +#if 0 // GraalPy change /* Display the traceback where the object has been allocated. Do it before dumping repr(obj), since repr() is more likely to crash than dumping the traceback. */ @@ -2409,6 +2427,7 @@ _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg, } _PyMem_DumpTraceback(fileno(stderr), ptr); +#endif // GraalPy change /* This might succeed or fail, but we're about to abort, so at least try to provide any extra info we can: */ _PyObject_Dump(obj); @@ -2419,7 +2438,6 @@ _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg, Py_FatalError("_PyObject_AssertFailed"); } -#endif // GraalPy change void @@ -2501,7 +2519,12 @@ Py_XNewRef(PyObject *obj) // for the stable ABI. int Py_Is(PyObject *x, PyObject *y) { +#if 0 // GraalPy change return (x == y); +#else + return (x == y) || + (points_to_py_handle_space(x) && points_to_py_handle_space(y) && GraalPyTruffle_Is(x, y)); +#endif } int Py_IsNone(PyObject *x) @@ -2521,9 +2544,6 @@ int Py_IsFalse(PyObject *x) // GraalPy additions Py_ssize_t PyTruffle_REFCNT(PyObject *obj) { -#ifdef GRAALVM_PYTHON_LLVM_MANAGED - return IMMORTAL_REFCNT; -#else /* GRAALVM_PYTHON_LLVM_MANAGED */ Py_ssize_t res; if (points_to_py_handle_space(obj)) { @@ -2540,16 +2560,14 @@ Py_ssize_t PyTruffle_REFCNT(PyObject *obj) { res = obj->ob_refcnt; } return res; -#endif /* GRAALVM_PYTHON_LLVM_MANAGED */ } // alias, currently used in PyO3 -Py_ssize_t _Py_REFCNT(PyObject *obj) { +PyAPI_FUNC(Py_ssize_t) _Py_REFCNT(PyObject *obj) { return PyTruffle_REFCNT(obj); } void PyTruffle_SET_REFCNT(PyObject* obj, Py_ssize_t cnt) { -#ifndef GRAALVM_PYTHON_LLVM_MANAGED PyObject *dest; if (points_to_py_handle_space(obj)) { @@ -2566,13 +2584,9 @@ void PyTruffle_SET_REFCNT(PyObject* obj, Py_ssize_t cnt) { dest = obj; } dest->ob_refcnt = cnt; -#endif /* GRAALVM_PYTHON_LLVM_MANAGED */ } PyTypeObject* PyTruffle_TYPE(PyObject *a) { -#ifdef GRAALVM_PYTHON_LLVM_MANAGED - return PyObject_ob_type(a); -#else /* GRAALVM_PYTHON_LLVM_MANAGED */ PyTypeObject *res; if (points_to_py_handle_space(a)) { @@ -2589,19 +2603,15 @@ PyTypeObject* PyTruffle_TYPE(PyObject *a) { res = a->ob_type; } return res; -#endif /* GRAALVM_PYTHON_LLVM_MANAGED */ } // alias, currently used in PyO3 -PyTypeObject* _Py_TYPE(PyObject *obj) { +PyAPI_FUNC(PyTypeObject*) _Py_TYPE(PyObject *obj) { return PyTruffle_TYPE(obj); } Py_ssize_t PyTruffle_SIZE(PyObject *ob) { PyVarObject* a = (PyVarObject*)ob; -#ifdef GRAALVM_PYTHON_LLVM_MANAGED - return PyVarObject_ob_size(a); -#else /* GRAALVM_PYTHON_LLVM_MANAGED */ Py_ssize_t res; if (points_to_py_handle_space(a)) { @@ -2629,37 +2639,45 @@ Py_ssize_t PyTruffle_SIZE(PyObject *ob) { res = a->ob_size; } return res; -#endif /* GRAALVM_PYTHON_LLVM_MANAGED */ } // alias, currently used in PyO3 -Py_ssize_t _Py_SIZE(PyObject *obj) { +PyAPI_FUNC(Py_ssize_t) _Py_SIZE(PyObject *obj) { return PyTruffle_SIZE(obj); } -void PyTruffle_SET_TYPE(PyObject *a, PyTypeObject *b) { - if (points_to_py_handle_space(a)) { - printf("changing the type of an object is not supported\n"); - } else { - a->ob_type = b; - } +void +PyTruffle_SET_TYPE(PyObject *a, PyTypeObject *b) +{ + if (points_to_py_handle_space(a)) { + PyTruffle_Log(PY_TRUFFLE_LOG_INFO, + "changing the type of an object is not supported\n"); + } else { + a->ob_type = b; + } } -void PyTruffle_SET_SIZE(PyVarObject *a, Py_ssize_t b) { - if (points_to_py_handle_space(a)) { - Graal_PyTruffle_SET_SIZE(a, b); - } else { - a->ob_size = b; - } + +void +PyTruffle_SET_SIZE(PyVarObject *a, Py_ssize_t b) +{ + if (points_to_py_handle_space(a)) { + Graal_PyTruffle_SET_SIZE(a, b); + } else { + a->ob_size = b; + } } -#define DEFERRED_NOTIFY_SIZE 16 +#define DEFERRED_NOTIFY_SIZE 1 +#if DEFERRED_NOTIFY_SIZE > 1 static PyObject *deferred_notify_ops[DEFERRED_NOTIFY_SIZE]; static int deferred_notify_cur = 0; +#endif static inline void _decref_notify(const PyObject *op, const Py_ssize_t updated_refcnt) { if (points_to_py_handle_space(op) && updated_refcnt <= MANAGED_REFCNT) { +#if DEFERRED_NOTIFY_SIZE > 1 if (PyTruffle_Debug_CAPI() && updated_refcnt < MANAGED_REFCNT) { Py_FatalError("Refcount of native stub fell below MANAGED_REFCNT"); } @@ -2669,6 +2687,10 @@ _decref_notify(const PyObject *op, const Py_ssize_t updated_refcnt) deferred_notify_cur = 0; GraalPyTruffle_BulkNotifyRefCount(deferred_notify_ops, DEFERRED_NOTIFY_SIZE); } +#else + PyObject *nonConstOp = (PyObject *)op; + GraalPyTruffle_BulkNotifyRefCount(&nonConstOp, 1); +#endif } } diff --git a/graalpython/com.oracle.graal.python.cext/src/obmalloc.c b/graalpython/com.oracle.graal.python.cext/src/obmalloc.c index 2c5a81fa84..559347aec6 100644 --- a/graalpython/com.oracle.graal.python.cext/src/obmalloc.c +++ b/graalpython/com.oracle.graal.python.cext/src/obmalloc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,12 +41,6 @@ #include "capi.h" #include "pycore_pymem.h" -struct _PyTraceMalloc_Config _Py_tracemalloc_config = { - .initialized = 0, - .tracing = 0, - .max_nframe = 1 -}; - /* * This header needs to be 16 bytes long to ensure that allocations will still be aligned to 16 byte boundaries. * (necessary for aligned vector instruction access) @@ -62,168 +56,462 @@ typedef struct { /* Get the object given the GC head */ #define FROM_MEM_HEAD(g) ((void *)(((mem_head_t *)g)+1)) -size_t PyTruffle_AllocatedMemory = 0; -size_t PyTruffle_MaxNativeMemory = 0; -size_t PyTruffle_NativeMemoryGCBarrier = 0; #define MAX_COLLECTION_RETRIES (7) #define COLLECTION_DELAY_INCREMENT (50) -void PyTruffle_InitializeNativeMemorySize() { - PyTruffle_AllocatedMemory = 0; - PyTruffle_MaxNativeMemory = GraalPyTruffle_GetMaxNativeMemory(); - PyTruffle_NativeMemoryGCBarrier = GraalPyTruffle_GetInitialNativeMemory(); +/* Forward declaration */ +static void* _GraalPyMem_RawMalloc(void *ctx, size_t size); +static void* _GraalPyMem_RawCalloc(void *ctx, size_t nelem, size_t elsize); +static void _GraalPyMem_RawFree(void *ctx, void *p); +static void* _GraalPyMem_RawRealloc(void *ctx, void *ptr, size_t size); + +typedef struct { + size_t allocated_memory; + size_t max_native_memory; + size_t native_memory_gc_barrier; +} GraalPyMem_t; + +static GraalPyMem_t _GraalPyMem_State = { 0, 0, 0 }; + +/* bpo-35053: Declare tracemalloc configuration here rather than + Modules/_tracemalloc.c because _tracemalloc can be compiled as dynamic + library, whereas _Py_NewReference() requires it. */ +struct _PyTraceMalloc_Config _Py_tracemalloc_config = _PyTraceMalloc_Config_INIT; + + +static void * +_PyMem_RawMalloc(void *ctx, size_t size) +{ + /* PyMem_RawMalloc(0) means malloc(1). Some systems would return NULL + for malloc(0), which would be treated as an error. Some platforms would + return a pointer with no memory behind it, which would break pymalloc. + To solve these problems, allocate an extra byte. */ + if (size == 0) + size = 1; + return malloc(size); } -int PyTruffle_AllocMemory(size_t size) { - // memory management - while ((PyTruffle_AllocatedMemory + size) > PyTruffle_NativeMemoryGCBarrier) { - if (PyTruffle_MaxNativeMemory == 0) { - PyTruffle_InitializeNativeMemorySize(); - continue; - } - PyTruffle_Log(PY_TRUFFLE_LOG_CONFIG, "PyTruffle_AllocMemory: exceeding PyTruffle_NativeMemoryGCBarrier (%lu) with allocation of size %lu, current PyTruffle_AllocatedMemory: %lu\n", PyTruffle_NativeMemoryGCBarrier, size, PyTruffle_AllocatedMemory); - - size_t delay = 0; - for (int iteration = 0; iteration < MAX_COLLECTION_RETRIES; iteration++) { - GraalPyTruffle_TriggerGC(delay); - delay += COLLECTION_DELAY_INCREMENT; - if ((PyTruffle_AllocatedMemory + size) <= PyTruffle_NativeMemoryGCBarrier) { - PyTruffle_AllocatedMemory += size; - return 0; - } - } - if (PyTruffle_NativeMemoryGCBarrier < PyTruffle_MaxNativeMemory) { - PyTruffle_NativeMemoryGCBarrier *= 2; - if (PyTruffle_NativeMemoryGCBarrier > PyTruffle_MaxNativeMemory) { - PyTruffle_NativeMemoryGCBarrier = PyTruffle_MaxNativeMemory; - } - PyTruffle_Log(PY_TRUFFLE_LOG_CONFIG, "PyTruffle_AllocMemory: enlarging PyTruffle_NativeMemoryGCBarrier to %lu\n", PyTruffle_NativeMemoryGCBarrier); - } else { - PyTruffle_Log(PY_TRUFFLE_LOG_INFO, "PyTruffle_AllocMemory: native memory exhausted while allocating %lu bytes\n", size); - return 1; - } - } - PyTruffle_AllocatedMemory += size; - return 0; -} - -void PyTruffle_FreeMemory(size_t size) { - if (PyTruffle_AllocatedMemory < size) { - PyTruffle_Log(PY_TRUFFLE_LOG_INFO, "PyTruffle_FreeMemory: freed memory size (%lu) is larger than allocated memory size (%lu)\n", size, PyTruffle_AllocatedMemory); - PyTruffle_AllocatedMemory = size; +static void * +_PyMem_RawCalloc(void *ctx, size_t nelem, size_t elsize) +{ + /* PyMem_RawCalloc(0, 0) means calloc(1, 1). Some systems would return NULL + for calloc(0, 0), which would be treated as an error. Some platforms + would return a pointer with no memory behind it, which would break + pymalloc. To solve these problems, allocate an extra byte. */ + if (nelem == 0 || elsize == 0) { + nelem = 1; + elsize = 1; } - PyTruffle_AllocatedMemory -= size; -} - -/* This is our version of 'PyObject_Free' which is also able to free Sulong handles. */ -MUST_INLINE static -void _PyObject_Free(void* ptr) { - if (ptr == NULL) { - return; - } - if(points_to_py_handle_space(ptr)) { - GraalPyTruffle_Object_Free(ptr); - } else { - mem_head_t* ptr_with_head = AS_MEM_HEAD(ptr); - PyTruffle_FreeMemory(ptr_with_head->size); - free(ptr_with_head); - } -} - -void* PyObject_Malloc(size_t size) { - if (PyTruffle_AllocMemory(size)) { - return NULL; - } - mem_head_t* ptr_with_head = malloc(size + sizeof(mem_head_t)); - void* ptr = FROM_MEM_HEAD(ptr_with_head); - ptr_with_head->size = size; - return ptr; + return calloc(nelem, elsize); +} + +static void * +_PyMem_RawRealloc(void *ctx, void *ptr, size_t size) +{ + if (size == 0) + size = 1; + return realloc(ptr, size); } -void PyObject_Free(void* ptr) { - _PyObject_Free(ptr); +static void +_PyMem_RawFree(void *ctx, void *ptr) +{ + free(ptr); } -void* PyObject_Realloc(void *ptr, size_t new_size) { - return PyMem_RawRealloc(ptr, new_size); +#if 0 // GraalPy change +#ifdef MS_WINDOWS +static void * +_PyObject_ArenaVirtualAlloc(void *ctx, size_t size) +{ + return VirtualAlloc(NULL, size, + MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); } -void* PyMem_Malloc(size_t size) { - if (size > (size_t)PY_SSIZE_T_MAX) { +static void +_PyObject_ArenaVirtualFree(void *ctx, void *ptr, size_t size) +{ + VirtualFree(ptr, 0, MEM_RELEASE); +} + +#elif defined(ARENAS_USE_MMAP) +static void * +_PyObject_ArenaMmap(void *ctx, size_t size) +{ + void *ptr; + ptr = mmap(NULL, size, PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + if (ptr == MAP_FAILED) return NULL; - } - if (PyTruffle_AllocMemory(size)) { - return NULL; - } - mem_head_t* ptr_with_head = malloc(size + sizeof(mem_head_t)); - void* ptr = FROM_MEM_HEAD(ptr_with_head); - ptr_with_head->size = size; + assert(ptr != NULL); return ptr; } -void* PyMem_Calloc(size_t nelem, size_t elsize) { - if (elsize != 0 && nelem > (size_t)PY_SSIZE_T_MAX / elsize) { +static void +_PyObject_ArenaMunmap(void *ctx, void *ptr, size_t size) +{ + munmap(ptr, size); +} + +#else +static void * +_PyObject_ArenaMalloc(void *ctx, size_t size) +{ + return malloc(size); +} + +static void +_PyObject_ArenaFree(void *ctx, void *ptr, size_t size) +{ + free(ptr); +} +#endif +#endif // GraalPy change + +#define GRAAL_ALLOC {&_GraalPyMem_State, _GraalPyMem_RawMalloc, _GraalPyMem_RawCalloc, _GraalPyMem_RawRealloc, _GraalPyMem_RawFree} +#define MALLOC_ALLOC {NULL, _PyMem_RawMalloc, _PyMem_RawCalloc, _PyMem_RawRealloc, _PyMem_RawFree} +#ifdef WITH_PYMALLOC +# define PYMALLOC_ALLOC {NULL, _PyObject_Malloc, _PyObject_Calloc, _PyObject_Realloc, _PyObject_Free} +#endif + +#define PYRAW_ALLOC GRAAL_ALLOC // GraalPy change +#ifdef WITH_PYMALLOC +# define PYOBJ_ALLOC PYMALLOC_ALLOC +#else +# define PYOBJ_ALLOC GRAAL_ALLOC // GraalPy change +#endif +#define PYMEM_ALLOC PYOBJ_ALLOC + +#if 0 // GraalPy change +typedef struct { + /* We tag each block with an API ID in order to tag API violations */ + char api_id; + PyMemAllocatorEx alloc; +} debug_alloc_api_t; +static struct { + debug_alloc_api_t raw; + debug_alloc_api_t mem; + debug_alloc_api_t obj; +} _PyMem_Debug = { + {'r', PYRAW_ALLOC}, + {'m', PYMEM_ALLOC}, + {'o', PYOBJ_ALLOC} + }; + +#define PYDBGRAW_ALLOC \ + {&_PyMem_Debug.raw, _PyMem_DebugRawMalloc, _PyMem_DebugRawCalloc, _PyMem_DebugRawRealloc, _PyMem_DebugRawFree} +#define PYDBGMEM_ALLOC \ + {&_PyMem_Debug.mem, _PyMem_DebugMalloc, _PyMem_DebugCalloc, _PyMem_DebugRealloc, _PyMem_DebugFree} +#define PYDBGOBJ_ALLOC \ + {&_PyMem_Debug.obj, _PyMem_DebugMalloc, _PyMem_DebugCalloc, _PyMem_DebugRealloc, _PyMem_DebugFree} +#endif // GraalPy change + +#ifdef Py_DEBUG +static PyMemAllocatorEx _PyMem_Raw = PYDBGRAW_ALLOC; +static PyMemAllocatorEx _PyMem = PYDBGMEM_ALLOC; +static PyMemAllocatorEx _PyObject = PYDBGOBJ_ALLOC; +#else +static PyMemAllocatorEx _PyMem_Raw = PYRAW_ALLOC; +static PyMemAllocatorEx _PyMem = PYMEM_ALLOC; +static PyMemAllocatorEx _PyObject = PYOBJ_ALLOC; +#endif + +void * +PyObject_Malloc(size_t size) +{ + /* see PyMem_RawMalloc() */ + if (size > (size_t)PY_SSIZE_T_MAX) return NULL; - } - return PyMem_RawCalloc(nelem, elsize); +#if 0 // GraalPy change + OBJECT_STAT_INC_COND(allocations512, size < 512); + OBJECT_STAT_INC_COND(allocations4k, size >= 512 && size < 4094); + OBJECT_STAT_INC_COND(allocations_big, size >= 4094); + OBJECT_STAT_INC(allocations); +#endif // GraalPy change + return _PyObject.malloc(_PyObject.ctx, size); } -void* PyMem_RawMalloc(size_t size) { - if (PyTruffle_AllocMemory(size)) { - return NULL; - } - mem_head_t* ptr_with_head = malloc((size == 0 ? 1 : size) + sizeof(mem_head_t)); - void* ptr = FROM_MEM_HEAD(ptr_with_head); - ptr_with_head->size = size; - return ptr; +void * +PyObject_Calloc(size_t nelem, size_t elsize) +{ + /* see PyMem_RawMalloc() */ + if (elsize != 0 && nelem > (size_t)PY_SSIZE_T_MAX / elsize) + return NULL; +#if 0 // GraalPy change + OBJECT_STAT_INC_COND(allocations512, elsize < 512); + OBJECT_STAT_INC_COND(allocations4k, elsize >= 512 && elsize < 4094); + OBJECT_STAT_INC_COND(allocations_big, elsize >= 4094); + OBJECT_STAT_INC(allocations); +#endif // GraalPy change + return _PyObject.calloc(_PyObject.ctx, nelem, elsize); } -void* PyMem_RawCalloc(size_t nelem, size_t elsize) { - size_t n = (nelem == 0 || elsize == 0) ? 1 : nelem; - if (PyTruffle_AllocMemory(n * elsize)) { - return NULL; - } - size_t total = n * elsize + sizeof(mem_head_t); - mem_head_t* ptr_with_head = (mem_head_t*) malloc(total); - memset(ptr_with_head, 0, total); - void* ptr = FROM_MEM_HEAD(ptr_with_head); - return ptr; +void * +PyObject_Realloc(void *ptr, size_t new_size) +{ + /* see PyMem_RawMalloc() */ + if (new_size > (size_t)PY_SSIZE_T_MAX) + return NULL; + return _PyObject.realloc(_PyObject.ctx, ptr, new_size); } -void* PyMem_RawRealloc(void *ptr, size_t new_size) { - mem_head_t* old; - size_t old_size; +void +PyObject_Free(void *ptr) +{ +#if 0 // GraalPy change + OBJECT_STAT_INC(frees); +#endif // GraalPy change + _PyObject.free(_PyObject.ctx, ptr); +} - if (ptr != NULL) { - old = AS_MEM_HEAD(ptr); - old_size = old->size; - } else { - old = NULL; - old_size = 0; - } +void * +PyMem_Malloc(size_t size) +{ + /* see PyMem_RawMalloc() */ + if (size > (size_t)PY_SSIZE_T_MAX) + return NULL; +#if 0 // GraalPy change + OBJECT_STAT_INC_COND(allocations512, size < 512); + OBJECT_STAT_INC_COND(allocations4k, size >= 512 && size < 4094); + OBJECT_STAT_INC_COND(allocations_big, size >= 4094); + OBJECT_STAT_INC(allocations); +#endif // GraalPy change + return _PyMem.malloc(_PyMem.ctx, size); +} - // account for the difference in size - if (old_size >= new_size) { - PyTruffle_FreeMemory(old_size - new_size); - } else { - if (PyTruffle_AllocMemory(new_size - old_size)) { - return NULL; +void * +PyMem_Calloc(size_t nelem, size_t elsize) +{ + /* see PyMem_RawMalloc() */ + if (elsize != 0 && nelem > (size_t)PY_SSIZE_T_MAX / elsize) + return NULL; +#if 0 // GraalPy change + OBJECT_STAT_INC_COND(allocations512, elsize < 512); + OBJECT_STAT_INC_COND(allocations4k, elsize >= 512 && elsize < 4094); + OBJECT_STAT_INC_COND(allocations_big, elsize >= 4094); + OBJECT_STAT_INC(allocations); +#endif // GraalPy change + return _PyMem.calloc(_PyMem.ctx, nelem, elsize); +} + +void * +PyMem_Realloc(void *ptr, size_t new_size) +{ + /* see PyMem_RawMalloc() */ + if (new_size > (size_t)PY_SSIZE_T_MAX) + return NULL; + return _PyMem.realloc(_PyMem.ctx, ptr, new_size); +} + +void +PyMem_Free(void *ptr) +{ +#if 0 // GraalPy change + OBJECT_STAT_INC(frees); +#endif // GraalPy change + _PyMem.free(_PyMem.ctx, ptr); +} + +void * +PyMem_RawMalloc(size_t size) +{ + /* + * Limit ourselves to PY_SSIZE_T_MAX bytes to prevent security holes. + * Most python internals blindly use a signed Py_ssize_t to track + * things without checking for overflows or negatives. + * As size_t is unsigned, checking for size < 0 is not required. + */ + if (size > (size_t)PY_SSIZE_T_MAX) + return NULL; + return _PyMem_Raw.malloc(_PyMem_Raw.ctx, size); +} + +void * +PyMem_RawCalloc(size_t nelem, size_t elsize) +{ + /* see PyMem_RawMalloc() */ + if (elsize != 0 && nelem > (size_t)PY_SSIZE_T_MAX / elsize) + return NULL; + return _PyMem_Raw.calloc(_PyMem_Raw.ctx, nelem, elsize); +} + +void* +PyMem_RawRealloc(void *ptr, size_t new_size) +{ + /* see PyMem_RawMalloc() */ + if (new_size > (size_t)PY_SSIZE_T_MAX) + return NULL; + return _PyMem_Raw.realloc(_PyMem_Raw.ctx, ptr, new_size); +} + +void PyMem_RawFree(void *ptr) +{ + _PyMem_Raw.free(_PyMem_Raw.ctx, ptr); +} + +/*============================================================================*/ +/* GraalPy off-heap memory allocator. + + When C extensions use Python's memory management API to allocate native + memory for objects, GraalPy's GC does not see those allocations because + native memory is not movable and therefore in an off-heap region. + This is problematic if an application allocates only few objects that have + large amounts of off-heap memory attached. In such cases, the GC does not + see any memory pressure and may therefore not collect the objects with + associated native memory. + + We therefore track off-heap allocations and count the allocated bytes. In + order to correctly account for free'd memory, we prepend a header that stores + the allocated size. The layout looks as follows: + + | header | payload | + | sizeof(mem_head_t) | size | +*/ + +static int +_GraalPyMem_PrepareAlloc(GraalPyMem_t *state, size_t size) +{ + // memory management + while ((state->allocated_memory + size) > state->native_memory_gc_barrier) { + if (state->max_native_memory == 0) { + state->allocated_memory = 0; + state->max_native_memory = GraalPyTruffle_GetMaxNativeMemory(); + state->native_memory_gc_barrier = GraalPyTruffle_GetInitialNativeMemory(); + continue; + } + PyTruffle_Log(PY_TRUFFLE_LOG_CONFIG, + "%s: exceeding native_memory_gc_barrier (%lu) with allocation of size %lu, current allocated_memory: %lu\n", + __func__, state->native_memory_gc_barrier, size, state->allocated_memory); + + size_t delay = 0; + for (int iteration = 0; iteration < MAX_COLLECTION_RETRIES; + iteration++) { + GraalPyTruffle_TriggerGC(delay); + delay += COLLECTION_DELAY_INCREMENT; + if ((state->allocated_memory + size) + <= state->native_memory_gc_barrier) { + state->allocated_memory += size; + return 0; + } + } + if (state->native_memory_gc_barrier < state->max_native_memory) { + state->native_memory_gc_barrier *= 2; + if (state->native_memory_gc_barrier > state->max_native_memory) { + state->native_memory_gc_barrier = state->max_native_memory; + } + PyTruffle_Log(PY_TRUFFLE_LOG_CONFIG, + "%s: enlarging native_memory_gc_barrier to %lu\n", + __func__, state->native_memory_gc_barrier); + } + else { + PyTruffle_Log(PY_TRUFFLE_LOG_INFO, + "%s: native memory exhausted while allocating %lu bytes\n", + __func__, size); + return 1; } } + state->allocated_memory += size; + return 0; +} - mem_head_t* ptr_with_head = (mem_head_t*) realloc(old, new_size + sizeof(mem_head_t)); - ptr_with_head->size = new_size; +static void * +_GraalPyMem_RawMalloc(void *ctx, size_t size) +{ + assert(ctx != NULL); + /* PyMem_RawMalloc(0) means malloc(1). Some systems would return NULL + for malloc(0), which would be treated as an error. Some platforms would + return a pointer with no memory behind it, which would break pymalloc. + To solve these problems, allocate an extra byte. */ + if (size == 0) + size = 1; + if (_GraalPyMem_PrepareAlloc((GraalPyMem_t*) ctx, size)) { + return NULL; + } + mem_head_t *ptr_with_head = (mem_head_t *)malloc(size + sizeof(mem_head_t)); + ptr_with_head->size = size; return FROM_MEM_HEAD(ptr_with_head); } -void * PyMem_Realloc(void *ptr, size_t new_size) { - return PyMem_RawRealloc(ptr, new_size); +static void * +_GraalPyMem_RawCalloc(void *ctx, size_t nelem, size_t elsize) +{ + assert(ctx != NULL); + /* Ensure that the multiplication 'nelem * elsize' does not overflow. */ + if (elsize != 0 && nelem > (size_t)PY_SSIZE_T_MAX / elsize) + return NULL; + /* PyMem_RawCalloc(0, 0) means calloc(1, 1). Some systems would return NULL + for calloc(0, 0), which would be treated as an error. Some platforms + would return a pointer with no memory behind it, which would break + pymalloc. To solve these problems, allocate an extra byte. */ + if (nelem == 0 || elsize == 0) { + nelem = 1; + elsize = 1; + } + size_t nbytes = nelem * elsize; + if (_GraalPyMem_PrepareAlloc((GraalPyMem_t*) ctx, nbytes)) { + return NULL; + } + /* We cannot use 'calloc' because we need to allocate following layout: + [ mem_head_t ] [ e_0 ] [ e_1 ] [ e_2 ] ... [ n_nelem ] */ + size_t total = nbytes + sizeof(mem_head_t); + mem_head_t *ptr_with_head = (mem_head_t *)malloc(total); + memset(ptr_with_head, 0, total); + ptr_with_head->size = nbytes; + return FROM_MEM_HEAD(ptr_with_head); } -void PyMem_RawFree(void *ptr) { - _PyObject_Free(ptr); +static void* +_GraalPyMem_RawRealloc(void *ctx, void *ptr, size_t size) +{ + assert(ctx != NULL); + assert(!points_to_py_handle_space(ptr)); + GraalPyMem_t *state = (GraalPyMem_t*) ctx; + mem_head_t *old; + size_t old_size; + if (size == 0) + size = 1; + + if (ptr != NULL) { + old = AS_MEM_HEAD(ptr); + old_size = old->size; + } else { + old = NULL; + old_size = 0; + } + + // account for the difference in size + if (old_size >= size) { + /* In case of "shrinking", just subtract the counter but don't trigger + the Java GC. */ + state->allocated_memory -= size; + } else if (_GraalPyMem_PrepareAlloc(state, size - old_size)) { + return NULL; + } + + mem_head_t *ptr_with_head = (mem_head_t *)realloc(old, + size + sizeof(mem_head_t)); + ptr_with_head->size = size; + return FROM_MEM_HEAD(ptr_with_head); } -void PyMem_Free(void *ptr) { - _PyObject_Free(ptr); +static void +_GraalPyMem_RawFree(void *ctx, void *ptr) +{ + assert(ctx != NULL); + assert(!points_to_py_handle_space(ptr)); + /* Free is sometimes called on NULL pointers which is valid because libc's + * 'free' would just do nothing. */ + if (ptr == NULL) + return; + GraalPyMem_t *state = (GraalPyMem_t *)ctx; + mem_head_t *ptr_with_head = AS_MEM_HEAD(ptr); + const size_t size = ptr_with_head->size; + if (state->allocated_memory < size) { + PyTruffle_Log(PY_TRUFFLE_LOG_INFO, + "%s: freed memory size (%lu) is larger than allocated memory size (%lu)\n", + __func__, size, state->allocated_memory); + state->allocated_memory = size; + } + state->allocated_memory -= size; + free(ptr_with_head); } diff --git a/graalpython/com.oracle.graal.python.cext/src/pystate.c b/graalpython/com.oracle.graal.python.cext/src/pystate.c index d0a7c66e02..e5f23cd6a8 100644 --- a/graalpython/com.oracle.graal.python.cext/src/pystate.c +++ b/graalpython/com.oracle.graal.python.cext/src/pystate.c @@ -46,16 +46,12 @@ extern TruffleContext* TRUFFLE_CONTEXT; static inline PyThreadState * _get_thread_state() { -#ifndef GRAALVM_PYTHON_LLVM_MANAGED PyThreadState *ts = tstate_current; if (UNLIKELY(ts == NULL)) { ts = GraalPyTruffleThreadState_Get(&tstate_current); tstate_current = ts; } return ts; -#else /* GRAALVM_PYTHON_LLVM_MANAGED */ - return GraalPyTruffleThreadState_Get(NULL); -#endif /* GRAALVM_PYTHON_LLVM_MANAGED */ } PyThreadState * @@ -185,15 +181,16 @@ PyGILState_Release(PyGILState_STATE oldstate) if (TRUFFLE_CONTEXT) { graalpy_gilstate_counter--; if (graalpy_gilstate_counter == 0 && graalpy_attached_thread) { + GraalPyTruffleBeforeThreadDetach(); (*TRUFFLE_CONTEXT)->detachCurrentThread(TRUFFLE_CONTEXT); graalpy_attached_thread = 0; -#ifndef GRAALVM_PYTHON_LLVM_MANAGED /* - * The thread state on the Java-side can get garbage collected after the thread is detached, - * so we need to make sure to fetch a fresh pointer the next time we attach. + * The thread state on the Java-side is cleared in GraalPyTruffleBeforeThreadDetach. + * As part of that the tstate_current pointer should have been set to NULL to make + * sure to fetch a fresh pointer the next time we attach. Just to be sure, we clear + * it here too: */ tstate_current = NULL; -#endif /* GRAALVM_PYTHON_LLVM_MANAGED */ } } } diff --git a/graalpython/com.oracle.graal.python.cext/src/sliceobject.c b/graalpython/com.oracle.graal.python.cext/src/sliceobject.c index 1c9a446f10..1ec50edc16 100644 --- a/graalpython/com.oracle.graal.python.cext/src/sliceobject.c +++ b/graalpython/com.oracle.graal.python.cext/src/sliceobject.c @@ -340,23 +340,16 @@ PyDoc_STRVAR(slice_doc, slice(start, stop[, step])\n\ \n\ Create a slice object. This is used for extended slicing (e.g. a[0:10:2])."); +#endif // GraalPy change static void slice_dealloc(PySliceObject *r) { - PyInterpreterState *interp = _PyInterpreterState_GET(); - _PyObject_GC_UNTRACK(r); - Py_DECREF(r->step); - Py_DECREF(r->start); - Py_DECREF(r->stop); - if (interp->slice_cache == NULL) { - interp->slice_cache = r; - } - else { - PyObject_GC_Del(r); - } + // GraalPy change: different implementation + GraalPyObject_GC_Del(r); } +#if 0 // GraalPy change static PyObject * slice_repr(PySliceObject *r) { @@ -632,13 +625,12 @@ slice_richcompare(PyObject *v, PyObject *w, int op) Py_DECREF(t2); return res; } +#endif // GraalPy change static int slice_traverse(PySliceObject *v, visitproc visit, void *arg) { - Py_VISIT(v->start); - Py_VISIT(v->stop); - Py_VISIT(v->step); + // GraalPy change: different implementation; nothing to do return 0; } @@ -652,7 +644,7 @@ PyTypeObject PySlice_Type = { 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ - (reprfunc)slice_repr, /* tp_repr */ + 0, /* tp_repr */ // GraalPy change: nulled 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ @@ -663,15 +655,15 @@ PyTypeObject PySlice_Type = { 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - slice_doc, /* tp_doc */ + 0, /* tp_doc */ // GraalPy change: nulled (traverseproc)slice_traverse, /* tp_traverse */ 0, /* tp_clear */ - slice_richcompare, /* tp_richcompare */ + 0, /* tp_richcompare */ // GraalPy change: nulled 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - slice_methods, /* tp_methods */ - slice_members, /* tp_members */ + 0, /* tp_methods */ // GraalPy change: nulled + 0, /* tp_members */ // GraalPy change: nulled 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ @@ -680,9 +672,8 @@ PyTypeObject PySlice_Type = { 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ - slice_new, /* tp_new */ + 0, /* tp_new */ // GraalPy change: nulled }; -#endif // GraalPy change // GraalPy additions diff --git a/graalpython/com.oracle.graal.python.cext/src/structseq.c b/graalpython/com.oracle.graal.python.cext/src/structseq.c index 2858e8d7ea..b6bff24c4c 100644 --- a/graalpython/com.oracle.graal.python.cext/src/structseq.c +++ b/graalpython/com.oracle.graal.python.cext/src/structseq.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2024, Oracle and/or its affiliates. +/* Copyright (c) 2024, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2022 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -385,6 +385,7 @@ static PyMethodDef structseq_methods[] = { {"__reduce__", (PyCFunction)structseq_reduce, METH_NOARGS, NULL}, {NULL, NULL} }; +#endif // GraalPy change static Py_ssize_t count_members(PyStructSequence_Desc *desc, Py_ssize_t *n_unnamed_members) { @@ -399,6 +400,7 @@ count_members(PyStructSequence_Desc *desc, Py_ssize_t *n_unnamed_members) { return i; } +#if 0 // GraalPy change static int initialize_structseq_dict(PyStructSequence_Desc *desc, PyObject* dict, Py_ssize_t n_members, Py_ssize_t n_unnamed_members) { @@ -455,6 +457,7 @@ initialize_structseq_dict(PyStructSequence_Desc *desc, PyObject* dict, Py_DECREF(keys); return -1; } +#endif // GraalPy change static void initialize_members(PyStructSequence_Desc *desc, PyMemberDef* members, @@ -478,7 +481,6 @@ initialize_members(PyStructSequence_Desc *desc, PyMemberDef* members, } members[k].name = NULL; } -#endif // GraalPy change int @@ -518,7 +520,6 @@ _PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc, type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | tp_flags; type->tp_traverse = (traverseproc) structseq_traverse; -#if 0 // GraalPy change: initialize members in an upcall later n_members = count_members(desc, &n_unnamed_members); members = PyMem_NEW(PyMemberDef, n_members - n_unnamed_members + 1); if (members == NULL) { @@ -527,9 +528,6 @@ _PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc, } initialize_members(desc, members, n_members); type->tp_members = members; -#else // GraalPy change - type->tp_members = NULL; -#endif // GraalPy change if (PyType_Ready(type) < 0) { // GraalPy change: not initialized diff --git a/graalpython/com.oracle.graal.python.cext/src/sysmodule.c b/graalpython/com.oracle.graal.python.cext/src/sysmodule.c index 14234a3319..c015672a80 100644 --- a/graalpython/com.oracle.graal.python.cext/src/sysmodule.c +++ b/graalpython/com.oracle.graal.python.cext/src/sysmodule.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,3 +44,64 @@ int PySys_Audit(const char *event, const char *argFormat, ...) { // ignore for now return 0; } + +static void +sys_write(int key, FILE *fp, const char *format, va_list va) +{ + char buffer[1001]; + int written; + + written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va); + if (GraalPyTruffleSys_WriteStd(key, buffer) != 0) { + fputs(buffer, fp); + } + if (written < 0 || (size_t)written >= sizeof(buffer)) { + const char *truncated = "... truncated"; + if (GraalPyTruffleSys_WriteStd(key, truncated) != 0) + fputs(truncated, fp); + } +} + +void +PySys_WriteStdout(const char *format, ...) +{ + va_list va; + + va_start(va, format); + // GraalPy change: different implementation + sys_write(0, stdout, format, va); + va_end(va); +} + +void +PySys_WriteStderr(const char *format, ...) +{ + va_list va; + + va_start(va, format); + // GraalPy change: different implementation + sys_write(1, stdout, format, va); + va_end(va); +} + +void +PySys_FormatStdout(const char *format, ...) +{ + va_list va; + + va_start(va, format); + // GraalPy change: different implementation + GraalPyTruffleSys_FormatStd(0, format, &va); + va_end(va); +} + +void +PySys_FormatStderr(const char *format, ...) +{ + va_list va; + + va_start(va, format); + // GraalPy change: different implementation + GraalPyTruffleSys_FormatStd(1, format, &va); + va_end(va); +} diff --git a/graalpython/com.oracle.graal.python.cext/src/tracemalloc.c b/graalpython/com.oracle.graal.python.cext/src/tracemalloc.c new file mode 100644 index 0000000000..79438b0c87 --- /dev/null +++ b/graalpython/com.oracle.graal.python.cext/src/tracemalloc.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#include "capi.h" + +int +PyTraceMalloc_Track(unsigned int domain, uintptr_t ptr, + size_t size) +{ + if (PyTruffle_Trace_Memory()) { + GraalPyTruffleTraceMalloc_Track(domain, ptr, size); + } + + return 0; +} + + +int +PyTraceMalloc_Untrack(unsigned int domain, uintptr_t ptr) +{ + if (PyTruffle_Trace_Memory()) { + GraalPyTruffleTraceMalloc_Untrack(domain, ptr); + } + + return 0; +} diff --git a/graalpython/com.oracle.graal.python.cext/src/tupleobject.c b/graalpython/com.oracle.graal.python.cext/src/tupleobject.c index 67b71df6f9..659c6b5d4a 100644 --- a/graalpython/com.oracle.graal.python.cext/src/tupleobject.c +++ b/graalpython/com.oracle.graal.python.cext/src/tupleobject.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2018, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2018, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2022 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -10,11 +10,16 @@ #include "Python.h" #if 0 // GraalPy change #include "pycore_abstract.h" // _PyIndex_Check() +#endif // GraalPy change #include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() +#if 0 // GraalPy change #include "pycore_initconfig.h" // _PyStatus_OK() #endif // GraalPy change #include "pycore_object.h" // _PyObject_GC_TRACK(), _Py_FatalRefcountError() +// GraalPy change +void PyTruffle_Tuple_Dealloc(PyTupleObject* self); + #if 0 // GraalPy change /*[clinic input] class tuple "PyTupleObject *" "&PyTuple_Type" @@ -107,9 +112,6 @@ PyTuple_Size(PyObject *op) PyObject * PyTuple_GetItem(PyObject *op, Py_ssize_t i) { // GraalPy change: different implementation -#ifdef GRAALVM_PYTHON_LLVM_MANAGED - return GraalPyTruffleTuple_GetItem(op, i); -#else /* GRAALVM_PYTHON_LLVM_MANAGED */ if (!PyTuple_Check(op)) { PyErr_BadInternalCall(); return NULL; @@ -132,7 +134,6 @@ PyTuple_GetItem(PyObject *op, Py_ssize_t i) { } assert(ob_item != NULL); return ob_item[i]; -#endif /* GRAALVM_PYTHON_LLVM_MANAGED */ } int @@ -157,13 +158,16 @@ PyTuple_SetItem(PyObject *op, Py_ssize_t i, PyObject *newitem) return 0; } -#if 0 // GraalPy change void _PyTuple_MaybeUntrack(PyObject *op) { PyTupleObject *t; Py_ssize_t i, n; + // GraalPy change + if (points_to_py_handle_space(op)) + return; + if (!PyTuple_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op)) return; t = (PyTupleObject *) op; @@ -180,8 +184,6 @@ _PyTuple_MaybeUntrack(PyObject *op) _PyObject_GC_UNTRACK(op); } -#endif // GraalPy change - NO_INLINE // GraalPy change: disallow bitcode inlining PyObject * PyTuple_Pack(Py_ssize_t n, ...) @@ -638,17 +640,40 @@ tuple_count(PyTupleObject *self, PyObject *value) } return PyLong_FromSsize_t(count); } +#endif // GraalPy change static int tupletraverse(PyTupleObject *o, visitproc visit, void *arg) { - Py_ssize_t i; + // GraalPy change: different implementation + Py_ssize_t size, i; + PyObject **ob_item; + + if (points_to_py_handle_space(o)) { + /* If the managed tuple already uses a native storage, then + * 'GraalPyVarObject.ob_item' will not be NULL and we can do the whole + * traversal in native. Otherwise, we do an upcall. + */ + GraalPyVarObject *go = (GraalPyVarObject *)pointer_to_stub(o); + size = go->ob_size; + ob_item = go->ob_item; + } else { + ob_item = o->ob_item; + size = Py_SIZE(o); + } - for (i = Py_SIZE(o); --i >= 0; ) - Py_VISIT(o->ob_item[i]); + /* In GraalPy, we only traverse the tuple if it has a native storage (which + * is indicated by 'ob_item != NULL'). We don't traverse managed storages. + * For an explanation, see 'dictobject.c: dict_traverse'. + */ + if (ob_item != NULL) { + for (i = size; --i >= 0; ) + Py_VISIT(ob_item[i]); + } return 0; } +#if 0 // GraalPy change static PyObject * tuplerichcompare(PyObject *v, PyObject *w, int op) { @@ -884,38 +909,39 @@ static PyMappingMethods tuple_as_mapping = { }; static PyObject *tuple_iter(PyObject *seq); +#endif // GraalPy change PyTypeObject PyTuple_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "tuple", sizeof(PyTupleObject) - sizeof(PyObject *), sizeof(PyObject *), - (destructor)tupledealloc, /* tp_dealloc */ + (destructor)PyTruffle_Tuple_Dealloc, /* tp_dealloc */ // GraalPy change: different function 0, /* tp_vectorcall_offset */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ - (reprfunc)tuplerepr, /* tp_repr */ + 0, /* tp_repr */ // GraalPy change: nulled 0, /* tp_as_number */ - &tuple_as_sequence, /* tp_as_sequence */ - &tuple_as_mapping, /* tp_as_mapping */ - (hashfunc)tuplehash, /* tp_hash */ + 0, /* tp_as_sequence */ // GraalPy change: nulled + 0, /* tp_as_mapping */ // GraalPy change: nulled + 0, /* tp_hash */ // GraalPy change: nulled 0, /* tp_call */ 0, /* tp_str */ - PyObject_GenericGetAttr, /* tp_getattro */ + 0, /* tp_getattro */ // GraalPy change: nulled 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TUPLE_SUBCLASS | _Py_TPFLAGS_MATCH_SELF | Py_TPFLAGS_SEQUENCE, /* tp_flags */ - tuple_new__doc__, /* tp_doc */ + 0, /* tp_doc */ // GraalPy change: nulled (traverseproc)tupletraverse, /* tp_traverse */ 0, /* tp_clear */ - tuplerichcompare, /* tp_richcompare */ + 0, /* tp_richcompare */ // GraalPy change: nulled 0, /* tp_weaklistoffset */ - tuple_iter, /* tp_iter */ + 0, /* tp_iter */ // GraalPy change: nulled 0, /* tp_iternext */ - tuple_methods, /* tp_methods */ + 0, /* tp_methods */ // GraalPy change: nulled 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ @@ -924,12 +950,15 @@ PyTypeObject PyTuple_Type = { 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ - 0, /* tp_alloc */ - tuple_new, /* tp_new */ - PyObject_GC_Del, /* tp_free */ + PyTruffle_Tuple_Alloc, /* tp_alloc */ // GraalPy change + 0, /* tp_new */ // GraalPy change: nulled + GraalPyObject_GC_Del, /* tp_free */ // GraalPy change: different function +#if 0 // GraalPy change .tp_vectorcall = tuple_vectorcall, +#endif // GraalPy change }; + /* The following function breaks the notion that tuples are immutable: it changes the size of a tuple. We get away with this only if there is only one module referencing the object. You can also think of it @@ -947,7 +976,8 @@ _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)) { + // GraalPy change: ignore refcnt + /* (Py_SIZE(v) != 0 && Py_REFCNT(v) != 1) */ 0) { *pv = 0; Py_XDECREF(v); PyErr_BadInternalCall(); @@ -960,7 +990,9 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize) } if (newsize == 0) { Py_DECREF(v); - *pv = tuple_get_empty(); + // GraalPy change: no empty tuple singleton + // *pv = tuple_get_empty(); + *pv = PyTuple_New(0); return 0; } if (oldsize == 0) { @@ -974,6 +1006,19 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize) return *pv == NULL ? -1 : 0; } + // Begin GraalPy change + if (points_to_py_handle_space(v)) { + GraalPyVarObject *o = (GraalPyVarObject *)pointer_to_stub(v); + PyObject** new_items = GraalPyTruffleTuple_Resize((PyObject *)v, newsize, o->ob_item); + if (new_items == NULL && o->ob_item != NULL) { + *pv = NULL; + return -1; + } + o->ob_size = newsize; + o->ob_item = new_items; + return 0; + } + // End GraalPy change /* XXX UNREF/NEWREF interface should be more symmetrical */ #ifdef Py_REF_DEBUG _Py_RefTotal--; @@ -1004,6 +1049,7 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize) return 0; } +#if 0 // GraalPy change PyStatus _PyTuple_InitTypes(PyInterpreterState *interp) @@ -1346,6 +1392,11 @@ PyObject* PyTruffle_Tuple_Alloc(PyTypeObject* type, Py_ssize_t nitems) { } void PyTruffle_Tuple_Dealloc(PyTupleObject* self) { + PyObject_GC_UnTrack(self); + if (points_to_py_handle_space(self)) { + return; + } + Py_TRASHCAN_BEGIN(self, PyTruffle_Tuple_Dealloc) Py_ssize_t len = PyTuple_GET_SIZE(self); if (len > 0) { Py_ssize_t i = len; @@ -1354,14 +1405,12 @@ void PyTruffle_Tuple_Dealloc(PyTupleObject* self) { } } Py_TYPE(self)->tp_free((PyObject *)self); + Py_TRASHCAN_END } PyObject ** PyTruffleTuple_GetItems(PyObject *op) { -#ifdef GRAALVM_PYTHON_LLVM_MANAGED - return GraalPy_get_PyTupleObject_ob_item((PyTupleObject*) op); -#else /* GRAALVM_PYTHON_LLVM_MANAGED */ PyObject **ob_item; if (points_to_py_handle_space(op)) { GraalPyVarObject *ptr = (GraalPyVarObject *) pointer_to_stub(op); @@ -1377,7 +1426,6 @@ PyTruffleTuple_GetItems(PyObject *op) } assert(ob_item != NULL); return ob_item; -#endif /* GRAALVM_PYTHON_LLVM_MANAGED */ } /* @@ -1386,9 +1434,15 @@ PyTruffleTuple_GetItems(PyObject *op) */ PyObject* _PyTuple_GET_ITEM(PyObject* a, Py_ssize_t b) { -#ifdef GRAALVM_PYTHON_LLVM_MANAGED - return GraalPyTruffleTuple_GetItem(a, b); -#else /* GRAALVM_PYTHON_LLVM_MANAGED */ - return PyTruffleTuple_GetItems(a)[b]; -#endif /* GRAALVM_PYTHON_LLVM_MANAGED */ + PyObject **ob_item = PyTruffleTuple_GetItems(a); + if (ob_item) { + return ob_item[b]; + } + return NULL; // an exception has happend during transtion +} + +#undef PyTuple_SET_ITEM +// Export PyTuple_SET_ITEM as regular API function to use in PyO3 and others +void PyTuple_SET_ITEM(PyObject* op, Py_ssize_t index, PyObject* value) { + PyTruffleTuple_GetItems(op)[index] = value; } diff --git a/graalpython/com.oracle.graal.python.cext/src/typeobject.c b/graalpython/com.oracle.graal.python.cext/src/typeobject.c index 53b43b8b72..65737e0ddc 100644 --- a/graalpython/com.oracle.graal.python.cext/src/typeobject.c +++ b/graalpython/com.oracle.graal.python.cext/src/typeobject.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2018, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2018, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2022 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -303,17 +303,50 @@ _PyTypes_Fini(PyInterpreterState *interp) clear_slotdefs(); } } -#endif // GraalPy change void PyType_Modified(PyTypeObject *type) { - // GraalPy change: different implementation - GraalPyTruffle_Type_Modified(type, type->tp_name, type->tp_mro); + /* Invalidate any cached data for the specified type and all + subclasses. This function is called after the base + classes, mro, or attributes of the type are altered. + + Invariants: + + - before Py_TPFLAGS_VALID_VERSION_TAG can be set on a type, + it must first be set on all super types. + + This function clears the Py_TPFLAGS_VALID_VERSION_TAG of a + type (so it must first clear it on all subclasses). The + tp_version_tag value is meaningless unless this flag is set. + We don't assign new version tags eagerly, but only as + needed. + */ + if (!_PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) { + return; + } + + PyObject *subclasses = type->tp_subclasses; + if (subclasses != NULL) { + assert(PyDict_CheckExact(subclasses)); + + Py_ssize_t i = 0; + PyObject *ref; + while (PyDict_Next(subclasses, &i, NULL, &ref)) { + assert(PyWeakref_CheckRef(ref)); + PyObject *obj = PyWeakref_GET_OBJECT(ref); + if (obj == Py_None) { + continue; + } + PyType_Modified(_PyType_CAST(obj)); + } + } + + type->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; + type->tp_version_tag = 0; /* 0 is not a valid version tag */ } -#if 0 // GraalPy change static void type_mro_modified(PyTypeObject *type, PyObject *bases) { /* @@ -1124,8 +1157,11 @@ _PyType_AllocNoTrack(PyTypeObject *type, Py_ssize_t nitems) } obj = (PyObject *)(alloc + presize); if (presize) { - // GraalPy change: different header layout, no GC link - ((PyObject **)alloc)[0] = NULL; + // GraalPy change: different header layout + // ((PyObject **)alloc)[0] = NULL; + // ((PyObject **)alloc)[1] = NULL; + memset(alloc, '\0', presize); + _PyObject_GC_Link(obj); } memset(obj, '\0', size); @@ -1160,13 +1196,15 @@ PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds) /* Helpers for subtyping */ -#if 0 // GraalPy change static int traverse_slots(PyTypeObject *type, PyObject *self, visitproc visit, void *arg) { Py_ssize_t i, n; PyMemberDef *mp; + // GraalPy change: managed types don't have native slot attributes + assert (!points_to_py_handle_space(self)); + n = Py_SIZE(type); mp = _PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type); for (i = 0; i < n; i++, mp++) { @@ -1183,12 +1221,20 @@ traverse_slots(PyTypeObject *type, PyObject *self, visitproc visit, void *arg) return 0; } -static int +/* GraalPy change: replaced 'static' with 'PyAPI_FUNC' because we lookup the + * symbol in Java to use it if a type receives 'toNative'. + */ +PyAPI_FUNC(int) subtype_traverse(PyObject *self, visitproc visit, void *arg) { PyTypeObject *type, *base; traverseproc basetraverse; + // GraalPy change: don't traverse managed objects + if (points_to_py_handle_space(self)) { + return 0; + } + /* Find the nearest base with a different tp_traverse, and traverse slots while we're at it */ type = Py_TYPE(self); @@ -1203,13 +1249,15 @@ subtype_traverse(PyObject *self, visitproc visit, void *arg) assert(base); } - if (type->tp_flags & Py_TPFLAGS_MANAGED_DICT) { - assert(type->tp_dictoffset); - int err = _PyObject_VisitInstanceAttributes(self, visit, arg); - if (err) { - return err; +#if 0 // GraalPy change: we don't have inlined managed dict values + if (type->tp_flags & Py_TPFLAGS_MANAGED_DICT) { + assert(type->tp_dictoffset); + int err = _PyObject_VisitInstanceAttributes(self, visit, arg); + if (err) { + return err; + } } - } +#endif // GraalPy change if (type->tp_dictoffset != base->tp_dictoffset) { PyObject **dictptr = _PyObject_DictPointer(self); @@ -1233,6 +1281,7 @@ subtype_traverse(PyObject *self, visitproc visit, void *arg) return 0; } +#if 0 // GraalPy change static void clear_slots(PyTypeObject *type, PyObject *self) { @@ -1550,9 +1599,6 @@ PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b) } else if (is_builtin_type(a) && !is_builtin_type(b)) { return 0; } -#ifdef GRAALVM_PYTHON_LLVM_MANAGED - return GraalPyTruffleType_IsSubtype(a, b); -#else /* GRAALVM_PYTHON_LLVM_MANAGED */ PyObject *mro; mro = a->tp_mro; @@ -1571,7 +1617,6 @@ PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b) else /* a is not completely initialized yet; follow tp_base */ return type_is_subtype_base_chain(a, b); -#endif /* GRAALVM_PYTHON_LLVM_MANAGED */ } /* Routines to do a method lookup in the type without looking in the @@ -4069,7 +4114,6 @@ type_setattro(PyTypeObject *type, PyObject *name, PyObject *value) extern void _PyDictKeys_DecRef(PyDictKeysObject *keys); - static void type_dealloc_common(PyTypeObject *type) { @@ -4109,6 +4153,7 @@ _PyStaticType_Dealloc(PyTypeObject *type) type->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; type->tp_version_tag = 0; } +#endif // GraalPy change static void @@ -4119,11 +4164,18 @@ type_dealloc(PyTypeObject *type) _PyObject_GC_UNTRACK(type); +#if 0 // GraalPy change type_dealloc_common(type); +#endif // GraalPy change // PyObject_ClearWeakRefs() raises an exception if Py_REFCNT() != 0 assert(Py_REFCNT(type) == 0); + /* TODO(fa): clear weakrefs will do an upcall with an object that has + * refcnt==0 which is currently a problem for GraalPy. + */ +#if 0 // GraalPy change PyObject_ClearWeakRefs((PyObject *)type); +#endif // GraalPy change Py_XDECREF(type->tp_base); Py_XDECREF(type->tp_dict); @@ -4141,15 +4193,18 @@ type_dealloc(PyTypeObject *type) Py_XDECREF(et->ht_name); Py_XDECREF(et->ht_qualname); Py_XDECREF(et->ht_slots); +#if 0 // GraalPy change if (et->ht_cached_keys) { _PyDictKeys_DecRef(et->ht_cached_keys); } +#endif // GraalPy change Py_XDECREF(et->ht_module); PyMem_Free(et->_ht_tpname); Py_TYPE(type)->tp_free((PyObject *)type); } +#if 0 // GraalPy change PyObject* _PyType_GetSubclasses(PyTypeObject *self) { @@ -4330,6 +4385,7 @@ static PyMethodDef type_methods[] = { PyDoc_STRVAR(type_doc, "type(object) -> the object's type\n" "type(name, bases, dict, **kwds) -> a new type"); +#endif // GraalPy change static int type_traverse(PyTypeObject *type, visitproc visit, void *arg) @@ -4363,6 +4419,11 @@ type_traverse(PyTypeObject *type, visitproc visit, void *arg) static int type_clear(PyTypeObject *type) { + /* Our 'type_clear' is empty because when mirroring types to native, we + * never increase the refcount of the objects since the managed PythonClass + * holds a reference to the appropriate object already. This means, we must + * not clear those fields in native code. + */ /* Because of type_is_gc(), the collector only calls this for heaptypes. */ _PyObject_ASSERT((PyObject *)type, type->tp_flags & Py_TPFLAGS_HEAPTYPE); @@ -4410,13 +4471,20 @@ type_clear(PyTypeObject *type) static int type_is_gc(PyTypeObject *type) { - return type->tp_flags & Py_TPFLAGS_HEAPTYPE; + /* GraalPy change: immortal types (these are usually managed types that + * received toNative) do not participate in Python GC. Usually, we would + * just test for 'points_to_py_handle_space' but this is not applicable for + * 'PyTypeObject' because there we really allocate and fill a native + * mirror. */ + return type->tp_flags & Py_TPFLAGS_HEAPTYPE && Py_REFCNT(type) != IMMORTAL_REFCNT; } +#if 0 // GraalPy change static PyNumberMethods type_as_number = { .nb_or = _Py_union_type_or, // Add __or__ function }; +#endif // GraalPy change PyTypeObject PyType_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) @@ -4424,47 +4492,55 @@ PyTypeObject PyType_Type = { sizeof(PyHeapTypeObject), /* tp_basicsize */ sizeof(PyMemberDef), /* tp_itemsize */ (destructor)type_dealloc, /* tp_dealloc */ - offsetof(PyTypeObject, tp_vectorcall), /* tp_vectorcall_offset */ + 0, /* tp_vectorcall_offset */ // GraalPy change: nulled 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_as_async */ - (reprfunc)type_repr, /* tp_repr */ - &type_as_number, /* tp_as_number */ + 0, /* tp_repr */ // GraalPy change: nulled + 0, /* tp_as_number */ // GraalPy change: nulled 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ - (ternaryfunc)type_call, /* tp_call */ + 0, /* tp_call */ // GraalPy change: nulled 0, /* tp_str */ - (getattrofunc)type_getattro, /* tp_getattro */ - (setattrofunc)type_setattro, /* tp_setattro */ + 0, /* tp_getattro */ // GraalPy change: nulled + 0, /* tp_setattro */ // GraalPy change: nulled 0, /* tp_as_buffer */ +#if 0 // GraalPy change: removed 'Py_TPFLAGS_HAVE_VECTORCALL' Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TYPE_SUBCLASS | Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ - type_doc, /* tp_doc */ +#else + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | + Py_TPFLAGS_BASETYPE | + Py_TPFLAGS_TYPE_SUBCLASS, /* tp_flags */ +#endif // GraalPy change + 0, /* tp_doc */ // GraalPy change: nulled (traverseproc)type_traverse, /* tp_traverse */ (inquiry)type_clear, /* tp_clear */ 0, /* tp_richcompare */ - offsetof(PyTypeObject, tp_weaklist), /* tp_weaklistoffset */ + 0, /* tp_weaklistoffset */ // GraalPy change: nulled 0, /* tp_iter */ 0, /* tp_iternext */ - type_methods, /* tp_methods */ - type_members, /* tp_members */ - type_getsets, /* tp_getset */ + 0, /* tp_methods */ // GraalPy change: nulled + 0, /* tp_members */ // GraalPy change: nulled + 0, /* tp_getset */ // GraalPy change: nulled 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ - offsetof(PyTypeObject, tp_dict), /* tp_dictoffset */ - type_init, /* tp_init */ - 0, /* tp_alloc */ - type_new, /* tp_new */ - PyObject_GC_Del, /* tp_free */ + 0, /* tp_dictoffset */ // GraalPy change: nulled + 0, /* tp_init */ // GraalPy change: nulled + PyType_GenericAlloc, /* tp_alloc */ // GraalPy change: added 'PyType_GenericAlloc' + 0, /* tp_new */ // GraalPy change: nulled + GraalPyObject_GC_Del, /* tp_free */ // GraalPy change: different function (inquiry)type_is_gc, /* tp_is_gc */ +#if 0 // GraalPy change .tp_vectorcall = type_vectorcall, +#endif // GraalPy change }; - +#if 0 // GraalPy change /* The base type of all types (eventually)... except itself. */ /* You may wonder why object.__new__() only complains about arguments @@ -6283,9 +6359,6 @@ type_ready_inherit(PyTypeObject *type) if (!(type->tp_alloc)) { type->tp_alloc = PyType_GenericAlloc; } - if (!(type->tp_new)) { - type->tp_new = PyType_GenericNew; - } return 0; } @@ -6512,9 +6585,9 @@ PyType_Ready(PyTypeObject *type) type->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE; } - /* GraalPy change: Types are often just static mem; so register them to be able to rule out invalid accesses. */ + // GraalPy change if (PyTruffle_Trace_Memory()) { - GraalPyTruffle_Trace_Type(type, type->tp_name != NULL); + GraalPyTruffle_Trace_Type(type); } /* GraalPy change: IMPORTANT: This is a Truffle-specific statement. Since the refcnt for the type is currently 0 and @@ -6532,9 +6605,6 @@ PyType_Ready(PyTypeObject *type) type->tp_flags = (type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY; assert(_PyType_CheckConsistency(type)); - // GraalPy change: it may be that the type was used uninitialized - GraalPyTruffle_Type_Modified(type, type->tp_name, NULL); - // GraalPy change: for reason, see first call to Py_INCREF in this function Py_DECREF(type); return 0; @@ -9286,13 +9356,8 @@ static int type_ready_graalpy_slot_conv(PyTypeObject* cls) { ADD_SLOT_CONV("__delattr__", cls->tp_setattro, -3, JWRAPPER_DELATTRO); ADD_SLOT_CONV("__clear__", cls->tp_clear, -1, JWRAPPER_INQUIRY); - /* IMPORTANT NOTE: If the class already provides 'tp_richcompare' but this is the default - 'object.__truffle_richcompare__' function, then we need to break a recursive cycle since - the default function dispatches to the individual comparison functions which would in - this case again invoke 'object.__truffle_richcompare__'. */ richcmpfunc richcompare = cls->tp_richcompare; - if (richcompare && richcompare != PyBaseObject_Type.tp_richcompare) { - ADD_SLOT_CONV("__compare__", richcompare, -3, JWRAPPER_RICHCMP); + if (richcompare) { ADD_SLOT_CONV("__lt__", richcompare, -2, JWRAPPER_LT); ADD_SLOT_CONV("__le__", richcompare, -2, JWRAPPER_LE); ADD_SLOT_CONV("__eq__", richcompare, -2, JWRAPPER_EQ); diff --git a/graalpython/com.oracle.graal.python.cext/src/unicodeobject.c b/graalpython/com.oracle.graal.python.cext/src/unicodeobject.c index f67a50bb23..2ab9336131 100644 --- a/graalpython/com.oracle.graal.python.cext/src/unicodeobject.c +++ b/graalpython/com.oracle.graal.python.cext/src/unicodeobject.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2018, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2018, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2020 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -1381,7 +1381,6 @@ PyUnicode_New(Py_ssize_t size, Py_UCS4 maxchar) { // GraalPy change: different implementation /* add one to size for the null character */ - int is_ascii = 0; if (maxchar < 128) { /* We intentionally use 'size' (which is one element less than the allocated array) * because interop users should not see the null character. */ @@ -1723,6 +1722,11 @@ unicode_dealloc(PyObject *unicode) } #endif + // GraalPy change + if (points_to_py_handle_space(unicode)) { + return; + } + #if 0 // GraalPy change switch (PyUnicode_CHECK_INTERNED(unicode)) { case SSTATE_NOT_INTERNED: @@ -6215,16 +6219,17 @@ _PyUnicode_DecodeRawUnicodeEscapeStateful(const char *s, Py_XDECREF(exc); return NULL; } - +#endif // GraalPy change PyObject * PyUnicode_DecodeRawUnicodeEscape(const char *s, Py_ssize_t size, const char *errors) { - return _PyUnicode_DecodeRawUnicodeEscapeStateful(s, size, errors, NULL); + return PyUnicode_Decode(s, size, "raw_unicode_escape", errors); + // return _PyUnicode_DecodeRawUnicodeEscapeStateful(s, size, errors, NULL); } - +#if 0 // GraalPy change PyObject * PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode) { diff --git a/graalpython/com.oracle.graal.python.frozen/freeze_modules.py b/graalpython/com.oracle.graal.python.frozen/freeze_modules.py index 0eea044960..f31ce5be5b 100644 --- a/graalpython/com.oracle.graal.python.frozen/freeze_modules.py +++ b/graalpython/com.oracle.graal.python.frozen/freeze_modules.py @@ -1,4 +1,4 @@ -# Copyright (c) 2021, 2024, Oracle and/or its affiliates. +# Copyright (c) 2021, 2025, Oracle and/or its affiliates. # Copyright (C) 1996-2020 Python Software Foundation # # Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -6,16 +6,15 @@ """Freeze specified modules """ -from collections import namedtuple +import argparse import marshal -import os import ntpath +import os import posixpath -import sys -import argparse import shutil - +import sys from _sha256 import sha256 +from collections import namedtuple FROZEN_ONLY = os.path.join(os.path.dirname(__file__), "flag.py") @@ -103,15 +102,18 @@ def add_graalpython_core(): lib_graalpython = os.path.join(os.path.dirname(__file__), "..", "lib-graalpython") l = [] + l.append("polyglot.arrow : polyglot.arrow = " + os.path.join(lib_graalpython, "modules/_polyglot_arrow.py")) for name in [ "modules/_sysconfigdata", + "modules/_polyglot", + "modules/_polyglot_datetime", + "modules/_polyglot_time", ]: modname = os.path.basename(name) modpath = os.path.join(lib_graalpython, f"{name}.py") l.append(f"{modname} : {modname} = {modpath}") for name in [ "__graalpython__", - "_interop_behavior", "_sre", "_sysconfig", "_weakref", @@ -119,7 +121,7 @@ def add_graalpython_core(): "java", "pip_hook", "unicodedata", - "sulong_support", + "_nt", ]: modname = f"graalpy.{os.path.basename(name)}" modpath = os.path.join(lib_graalpython, f"{name}.py") @@ -154,7 +156,7 @@ def relpath_for_posix_display(path, base): ####################################### # specs -def parse_frozen_specs(): +def parse_frozen_specs(suffix): seen = {} for section, specs in FROZEN: parsed = _parse_specs(specs, section, seen) @@ -163,7 +165,7 @@ def parse_frozen_specs(): try: source = seen[frozenid] except KeyError: - source = FrozenSource.from_id(frozenid, pyfile) + source = FrozenSource.from_id(frozenid, suffix, pyfile) seen[frozenid] = source else: assert not pyfile or pyfile == source.pyfile, item @@ -271,11 +273,11 @@ def iter_subs(): class FrozenSource(namedtuple('FrozenSource', 'id pyfile frozenfile deepfreezefile')): @classmethod - def from_id(cls, frozenid, pyfile=None): + def from_id(cls, frozenid, suffix, pyfile=None): if not pyfile: pyfile = os.path.join(STDLIB_DIR, *frozenid.split('.')) + '.py' #assert os.path.exists(pyfile), (frozenid, pyfile) - frozenfile = resolve_frozen_file(frozenid, FROZEN_MODULES_DIR) + frozenfile = resolve_frozen_file(frozenid, FROZEN_MODULES_DIR, suffix) return cls(frozenid, pyfile, frozenfile, STDLIB_DIR) @classmethod @@ -311,7 +313,7 @@ def isbootstrap(self): return self.id in BOOTSTRAP -def resolve_frozen_file(frozenid, destdir): +def resolve_frozen_file(frozenid, destdir, suffix): """Return the filename corresponding to the given frozen ID. For stdlib modules the ID will always be the full name @@ -324,7 +326,7 @@ def resolve_frozen_file(frozenid, destdir): raise ValueError(f'unsupported frozenid {frozenid!r}') # We use a consistent naming convention for all frozen modules. frozen_symbol = FrozenSource.resolve_symbol(frozenid) - frozenfile = f"Frozen{frozen_symbol}.bin" + frozenfile = f"Frozen{frozen_symbol}.{suffix}" if not destdir: return frozenfile @@ -496,7 +498,7 @@ def lower_camel_case(str): # write frozen files FROZEN_MODULES_HEADER = """/* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -589,19 +591,27 @@ def write_frozen_module_file(file, modules): if os.path.exists(file): with open(file, "r", encoding="utf-8", newline=os.linesep) as f: content = f.read() + if os.linesep != "\n": + if content.replace(os.linesep, "\n") == content: + # Windows file has Unix line endings + linesep = "\n" + else: + linesep = os.linesep + else: + linesep = "\n" stat_result = os.stat(file) atime, mtime = stat_result.st_atime, stat_result.st_mtime else: content = None os.makedirs(os.path.dirname(file), exist_ok=True) - with open(file, "w", encoding="utf-8", newline=os.linesep) as out_file: + with open(file, "w", encoding="utf-8", newline=linesep) as out_file: out_file.write(FROZEN_MODULES_HEADER) out_file.write("\n\n") write_frozen_modules_map(out_file, modules) out_file.write("\n") write_frozen_lookup(out_file, modules) out_file.write("}\n") - with open(file, "r", encoding="utf-8", newline=os.linesep) as f: + with open(file, "r", encoding="utf-8", newline=linesep) as f: new_content = f.read() if new_content == content: # set mtime to the old one, if we didn't change anything @@ -634,11 +644,17 @@ def main(): STDLIB_DIR = os.path.abspath(parsed_args.python_lib) FROZEN_MODULES_DIR = os.path.abspath(parsed_args.binary_dir) + if __graalpython__.is_bytecode_dsl_interpreter: + suffix = "bin_dsl" + assert os.path.isdir(parsed_args.binary_dir), "Frozen modules for the DSL should be built after the manual bytecode interpreter." + else: + suffix = "bin" + shutil.rmtree(parsed_args.binary_dir, ignore_errors=True) + os.makedirs(parsed_args.binary_dir) + # create module specs - modules = list(parse_frozen_specs()) + modules = list(parse_frozen_specs(suffix)) - shutil.rmtree(parsed_args.binary_dir, ignore_errors=True) - os.makedirs(parsed_args.binary_dir) # write frozen module binary files containing the byte code and class files # used for importing the binary files for src in _iter_sources(modules): diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/CMakeLists.txt b/graalpython/com.oracle.graal.python.hpy.llvm/CMakeLists.txt deleted file mode 100644 index d679836753..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/CMakeLists.txt +++ /dev/null @@ -1,141 +0,0 @@ -# -# Copyright (c) 2023, Oracle and/or its affiliates. -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, are -# permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this list of -# conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, this list of -# conditions and the following disclaimer in the documentation and/or other materials provided -# with the distribution. -# 3. Neither the name of the copyright holder nor the names of its contributors may be used to -# endorse or promote products derived from this software without specific prior written -# permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS -# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. -# -cmake_minimum_required(VERSION 3.22) -project(com.oracle.graal.python.hpy.llvm) - -function(require_var var) - if (NOT DEFINED ${var}) - message(FATAL_ERROR "${var} needs to be set") - endif() -endfunction() - -require_var(LLVM_MODE) - -# default to CMake's source dir if not explicitly provided -if(NOT DEFINED SRC_DIR) - set(SRC_DIR "${CMAKE_SOURCE_DIR}") -endif() - -set(TARGET_LIB "hpy-${LLVM_MODE}") - -# don't install into the system but into the MX project's output dir -set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}) - -require_var(GRAALVM_HPY_INCLUDE_DIR) -require_var(GRAALVM_PYTHON_INCLUDE_DIR) -require_var(TRUFFLE_H_INC) - -set(HPY_SRC "${SRC_DIR}/src") -set(HPY_INC "${SRC_DIR}/include") - -# using glob patterns is not recommended: https://cmake.org/cmake/help/latest/command/file.html#glob -set(SRC_FILES ${HPY_SRC}/hpy.c - ${HPY_SRC}/hpynative.h -) - -set(HPY_HEADERS ${HPY_INC}/hpy/autogen_hpyslot.h - ${HPY_INC}/hpy/version.h - ${HPY_INC}/hpy/hpytype.h - ${HPY_INC}/hpy/universal/hpyfunc_trampolines.h - ${HPY_INC}/hpy/universal/autogen_trampolines.h - ${HPY_INC}/hpy/universal/misc_trampolines.h - ${HPY_INC}/hpy/universal/autogen_ctx.h - ${HPY_INC}/hpy/universal/autogen_hpyfunc_trampolines.h - ${HPY_INC}/hpy/hpydef.h - ${HPY_INC}/hpy/runtime/argparse.h - ${HPY_INC}/hpy/runtime/ctx_type.h - ${HPY_INC}/hpy/runtime/buildvalue.h - ${HPY_INC}/hpy/runtime/ctx_funcs.h - ${HPY_INC}/hpy/runtime/structseq.h - ${HPY_INC}/hpy/runtime/helpers.h - ${HPY_INC}/hpy/inline_helpers.h - ${HPY_INC}/hpy/cpython/hpyfunc_trampolines.h - ${HPY_INC}/hpy/cpython/misc.h - ${HPY_INC}/hpy/cpython/autogen_api_impl.h - ${HPY_INC}/hpy/cpython/autogen_hpyfunc_trampolines.h - ${HPY_INC}/hpy/macros.h - ${HPY_INC}/hpy/hpymodule.h - ${HPY_INC}/hpy/autogen_hpyfunc_declare.h - ${HPY_INC}/hpy/cpy_types.h - ${HPY_INC}/hpy/hpyfunc.h - ${HPY_INC}/hpy.h -) - -add_library(${TARGET_LIB} SHARED) - -target_sources(${TARGET_LIB} PRIVATE ${SRC_FILES} ${HPY_HEADERS}) -target_include_directories(${TARGET_LIB} PRIVATE - "${GRAALVM_HPY_INCLUDE_DIR}" - "${GRAALVM_PYTHON_INCLUDE_DIR}" - "${TRUFFLE_H_INC}" -) - -target_compile_definitions(${TARGET_LIB} PRIVATE - HPY_ABI_HYBRID - NDEBUG - GRAALVM_PYTHON_LLVM - Py_BUILD_CORE -) - -if(WIN32) - require_var(GRAALVM_LLVM_LIB_DIR) - target_link_directories(${TARGET_LIB} PRIVATE ${GRAALVM_LLVM_LIB_DIR}) - target_link_libraries(${TARGET_LIB} PRIVATE graalvm-llvm) - # Following defines are for 'Python.h'. Since HPy includes it, we need them. - target_compile_definitions(${TARGET_LIB} PRIVATE - MS_WINDOWS - Py_ENABLE_SHARED - HAVE_DECLSPEC_DLL - ) -endif() - -if(MSVC) - target_compile_options(${TARGET_LIB} PRIVATE /Z7 /O2 /WX) -else() - if(NOT WIN32) - target_compile_options(${TARGET_LIB} PRIVATE - -Werror - ) - endif() - target_compile_options(${TARGET_LIB} PRIVATE - -Wno-int-to-pointer-cast - -Wno-int-conversion - -Wno-void-pointer-to-int-cast - -Wno-incompatible-pointer-types-discards-qualifiers - -Wno-pointer-type-mismatch - -Wno-braced-scalar-init - -Wno-deprecated-declarations - ) -endif() - -if(APPLE) - target_link_options(${TARGET_LIB} PRIVATE -undefined dynamic_lookup) -endif() - -install(TARGETS ${TARGET_LIB} DESTINATION bin) diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/cpy_types.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/cpy_types.h deleted file mode 100644 index fd2efc7ad8..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/cpy_types.h +++ /dev/null @@ -1,73 +0,0 @@ -/* MIT License - * - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef HPY_UNIVERSAL_CPY_TYPES_H -#define HPY_UNIVERSAL_CPY_TYPES_H - -/* ~~~~~~~~~~~~~~~~ CPython legacy types ~~~~~~~~~~~~~~~~ */ - -/* These are the types which are needed to implement legacy features such as - .legacy_slots, .legacy_methods, HPy_FromPyObject, HPy_AsPyObject, etc. - - In cpython and hybrid ABI mode we can #include Python.h and use the "real" - types. - - In universal ABI mode, legacy features cannot be used, but we still need - the corresponding C types to use in the HPy declarations. Note that we use - only forward declarations, meaning that it will actually be impossible to - instantiate any of these struct. -*/ - -#ifdef HPY_ABI_UNIVERSAL - -typedef struct FORBIDDEN_cpy_PyObject cpy_PyObject; -typedef struct FORBIDDEN_PyMethodDef cpy_PyMethodDef; -typedef struct FORBIDDEN_PyModuleDef cpy_PyModuleDef; -typedef struct FORBIDDEN_bufferinfo cpy_Py_buffer; - -// declare the following API functions as _HPY_LEGACY, which triggers an -// #error if they are used -HPyAPI_FUNC _HPY_LEGACY cpy_PyObject *HPy_AsPyObject(HPyContext *ctx, HPy h); -HPyAPI_FUNC _HPY_LEGACY HPy HPy_FromPyObject(HPyContext *ctx, cpy_PyObject *obj); - -#else - -// Python.h has already been included by the main hpy.h -typedef PyObject cpy_PyObject; -typedef PyMethodDef cpy_PyMethodDef; -typedef PyModuleDef cpy_PyModuleDef; -typedef Py_buffer cpy_Py_buffer; - -#endif /* HPY_ABI_UNIVERSAL */ - - -typedef cpy_PyObject *(*cpy_PyCFunction)(cpy_PyObject *, cpy_PyObject *const *, HPy_ssize_t); -typedef int (*cpy_visitproc)(cpy_PyObject *, void *); -typedef cpy_PyObject *(*cpy_getter)(cpy_PyObject *, void *); -typedef int (*cpy_setter)(cpy_PyObject *, cpy_PyObject *, void *); -typedef void (*cpy_PyCapsule_Destructor)(cpy_PyObject *); -typedef cpy_PyObject *(*cpy_vectorcallfunc)(cpy_PyObject *callable, cpy_PyObject *const *args, - size_t nargsf, cpy_PyObject *kwnames); - -#endif /* HPY_UNIVERSAL_CPY_TYPES_H */ diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/cpython/autogen_ctx.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/cpython/autogen_ctx.h deleted file mode 100644 index a8d028f081..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/cpython/autogen_ctx.h +++ /dev/null @@ -1,122 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* - DO NOT EDIT THIS FILE! - - This file is automatically generated by hpy.tools.autogen.ctx.cpython_autogen_ctx_h - See also hpy.tools.autogen and hpy/tools/public_api.h - - Run this to regenerate: - make autogen - -*/ - -struct _HPyContext_s { - const char *name; - int abi_version; - HPy h_None; - HPy h_True; - HPy h_False; - HPy h_NotImplemented; - HPy h_Ellipsis; - HPy h_BaseException; - HPy h_Exception; - HPy h_StopAsyncIteration; - HPy h_StopIteration; - HPy h_GeneratorExit; - HPy h_ArithmeticError; - HPy h_LookupError; - HPy h_AssertionError; - HPy h_AttributeError; - HPy h_BufferError; - HPy h_EOFError; - HPy h_FloatingPointError; - HPy h_OSError; - HPy h_ImportError; - HPy h_ModuleNotFoundError; - HPy h_IndexError; - HPy h_KeyError; - HPy h_KeyboardInterrupt; - HPy h_MemoryError; - HPy h_NameError; - HPy h_OverflowError; - HPy h_RuntimeError; - HPy h_RecursionError; - HPy h_NotImplementedError; - HPy h_SyntaxError; - HPy h_IndentationError; - HPy h_TabError; - HPy h_ReferenceError; - HPy h_SystemError; - HPy h_SystemExit; - HPy h_TypeError; - HPy h_UnboundLocalError; - HPy h_UnicodeError; - HPy h_UnicodeEncodeError; - HPy h_UnicodeDecodeError; - HPy h_UnicodeTranslateError; - HPy h_ValueError; - HPy h_ZeroDivisionError; - HPy h_BlockingIOError; - HPy h_BrokenPipeError; - HPy h_ChildProcessError; - HPy h_ConnectionError; - HPy h_ConnectionAbortedError; - HPy h_ConnectionRefusedError; - HPy h_ConnectionResetError; - HPy h_FileExistsError; - HPy h_FileNotFoundError; - HPy h_InterruptedError; - HPy h_IsADirectoryError; - HPy h_NotADirectoryError; - HPy h_PermissionError; - HPy h_ProcessLookupError; - HPy h_TimeoutError; - HPy h_Warning; - HPy h_UserWarning; - HPy h_DeprecationWarning; - HPy h_PendingDeprecationWarning; - HPy h_SyntaxWarning; - HPy h_RuntimeWarning; - HPy h_FutureWarning; - HPy h_ImportWarning; - HPy h_UnicodeWarning; - HPy h_BytesWarning; - HPy h_ResourceWarning; - HPy h_BaseObjectType; - HPy h_TypeType; - HPy h_BoolType; - HPy h_LongType; - HPy h_FloatType; - HPy h_UnicodeType; - HPy h_TupleType; - HPy h_ListType; - HPy h_ComplexType; - HPy h_BytesType; - HPy h_MemoryViewType; - HPy h_CapsuleType; - HPy h_SliceType; - HPy h_Builtins; -}; diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/cpython/autogen_hpyfunc_trampolines.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/cpython/autogen_hpyfunc_trampolines.h deleted file mode 100644 index df91efee3a..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/cpython/autogen_hpyfunc_trampolines.h +++ /dev/null @@ -1,227 +0,0 @@ -/* MIT License - * - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - - -/* - DO NOT EDIT THIS FILE! - - This file is automatically generated by hpy.tools.autogen.hpyfunc.autogen_cpython_hpyfunc_trampoline_h - See also hpy.tools.autogen and hpy/tools/public_api.h - - Run this to regenerate: - make autogen - -*/ - -typedef HPy (*_HPyCFunction_NOARGS)(HPyContext *, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_NOARGS(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *self) \ - { \ - _HPyCFunction_NOARGS func = (_HPyCFunction_NOARGS)IMPL; \ - return _h2py(func(_HPyGetContext(), _py2h(self))); \ - } -typedef HPy (*_HPyCFunction_O)(HPyContext *, HPy, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_O(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *self, cpy_PyObject *arg) \ - { \ - _HPyCFunction_O func = (_HPyCFunction_O)IMPL; \ - return _h2py(func(_HPyGetContext(), _py2h(self), _py2h(arg))); \ - } -typedef HPy (*_HPyCFunction_UNARYFUNC)(HPyContext *, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_UNARYFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0) \ - { \ - _HPyCFunction_UNARYFUNC func = (_HPyCFunction_UNARYFUNC)IMPL; \ - return _h2py(func(_HPyGetContext(), _py2h(arg0))); \ - } -typedef HPy (*_HPyCFunction_BINARYFUNC)(HPyContext *, HPy, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_BINARYFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0, cpy_PyObject *arg1) \ - { \ - _HPyCFunction_BINARYFUNC func = (_HPyCFunction_BINARYFUNC)IMPL; \ - return _h2py(func(_HPyGetContext(), _py2h(arg0), _py2h(arg1))); \ - } -typedef HPy (*_HPyCFunction_TERNARYFUNC)(HPyContext *, HPy, HPy, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_TERNARYFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0, cpy_PyObject *arg1, cpy_PyObject *arg2) \ - { \ - _HPyCFunction_TERNARYFUNC func = (_HPyCFunction_TERNARYFUNC)IMPL; \ - return _h2py(func(_HPyGetContext(), _py2h(arg0), _py2h(arg1), _py2h(arg2))); \ - } -typedef int (*_HPyCFunction_INQUIRY)(HPyContext *, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_INQUIRY(SYM, IMPL) \ - static int SYM(cpy_PyObject *arg0) \ - { \ - _HPyCFunction_INQUIRY func = (_HPyCFunction_INQUIRY)IMPL; \ - return (func(_HPyGetContext(), _py2h(arg0))); \ - } -typedef HPy_ssize_t (*_HPyCFunction_LENFUNC)(HPyContext *, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_LENFUNC(SYM, IMPL) \ - static HPy_ssize_t SYM(cpy_PyObject *arg0) \ - { \ - _HPyCFunction_LENFUNC func = (_HPyCFunction_LENFUNC)IMPL; \ - return (func(_HPyGetContext(), _py2h(arg0))); \ - } -typedef HPy (*_HPyCFunction_SSIZEARGFUNC)(HPyContext *, HPy, HPy_ssize_t); -#define _HPyFunc_TRAMPOLINE_HPyFunc_SSIZEARGFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0, HPy_ssize_t arg1) \ - { \ - _HPyCFunction_SSIZEARGFUNC func = (_HPyCFunction_SSIZEARGFUNC)IMPL; \ - return _h2py(func(_HPyGetContext(), _py2h(arg0), (arg1))); \ - } -typedef HPy (*_HPyCFunction_SSIZESSIZEARGFUNC)(HPyContext *, HPy, HPy_ssize_t, HPy_ssize_t); -#define _HPyFunc_TRAMPOLINE_HPyFunc_SSIZESSIZEARGFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0, HPy_ssize_t arg1, HPy_ssize_t arg2) \ - { \ - _HPyCFunction_SSIZESSIZEARGFUNC func = (_HPyCFunction_SSIZESSIZEARGFUNC)IMPL; \ - return _h2py(func(_HPyGetContext(), _py2h(arg0), (arg1), (arg2))); \ - } -typedef int (*_HPyCFunction_SSIZEOBJARGPROC)(HPyContext *, HPy, HPy_ssize_t, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_SSIZEOBJARGPROC(SYM, IMPL) \ - static int SYM(cpy_PyObject *arg0, HPy_ssize_t arg1, cpy_PyObject *arg2) \ - { \ - _HPyCFunction_SSIZEOBJARGPROC func = (_HPyCFunction_SSIZEOBJARGPROC)IMPL; \ - return (func(_HPyGetContext(), _py2h(arg0), (arg1), _py2h(arg2))); \ - } -typedef int (*_HPyCFunction_SSIZESSIZEOBJARGPROC)(HPyContext *, HPy, HPy_ssize_t, HPy_ssize_t, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_SSIZESSIZEOBJARGPROC(SYM, IMPL) \ - static int SYM(cpy_PyObject *arg0, HPy_ssize_t arg1, HPy_ssize_t arg2, cpy_PyObject *arg3) \ - { \ - _HPyCFunction_SSIZESSIZEOBJARGPROC func = (_HPyCFunction_SSIZESSIZEOBJARGPROC)IMPL; \ - return (func(_HPyGetContext(), _py2h(arg0), (arg1), (arg2), _py2h(arg3))); \ - } -typedef int (*_HPyCFunction_OBJOBJARGPROC)(HPyContext *, HPy, HPy, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_OBJOBJARGPROC(SYM, IMPL) \ - static int SYM(cpy_PyObject *arg0, cpy_PyObject *arg1, cpy_PyObject *arg2) \ - { \ - _HPyCFunction_OBJOBJARGPROC func = (_HPyCFunction_OBJOBJARGPROC)IMPL; \ - return (func(_HPyGetContext(), _py2h(arg0), _py2h(arg1), _py2h(arg2))); \ - } -typedef void (*_HPyCFunction_FREEFUNC)(HPyContext *, void *); -#define _HPyFunc_TRAMPOLINE_HPyFunc_FREEFUNC(SYM, IMPL) \ - static void SYM(void *arg0) \ - { \ - _HPyCFunction_FREEFUNC func = (_HPyCFunction_FREEFUNC)IMPL; \ - func(_HPyGetContext(), (arg0)); \ - return; \ - } -typedef HPy (*_HPyCFunction_GETATTRFUNC)(HPyContext *, HPy, char *); -#define _HPyFunc_TRAMPOLINE_HPyFunc_GETATTRFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0, char *arg1) \ - { \ - _HPyCFunction_GETATTRFUNC func = (_HPyCFunction_GETATTRFUNC)IMPL; \ - return _h2py(func(_HPyGetContext(), _py2h(arg0), (arg1))); \ - } -typedef HPy (*_HPyCFunction_GETATTROFUNC)(HPyContext *, HPy, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_GETATTROFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0, cpy_PyObject *arg1) \ - { \ - _HPyCFunction_GETATTROFUNC func = (_HPyCFunction_GETATTROFUNC)IMPL; \ - return _h2py(func(_HPyGetContext(), _py2h(arg0), _py2h(arg1))); \ - } -typedef int (*_HPyCFunction_SETATTRFUNC)(HPyContext *, HPy, char *, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_SETATTRFUNC(SYM, IMPL) \ - static int SYM(cpy_PyObject *arg0, char *arg1, cpy_PyObject *arg2) \ - { \ - _HPyCFunction_SETATTRFUNC func = (_HPyCFunction_SETATTRFUNC)IMPL; \ - return (func(_HPyGetContext(), _py2h(arg0), (arg1), _py2h(arg2))); \ - } -typedef int (*_HPyCFunction_SETATTROFUNC)(HPyContext *, HPy, HPy, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_SETATTROFUNC(SYM, IMPL) \ - static int SYM(cpy_PyObject *arg0, cpy_PyObject *arg1, cpy_PyObject *arg2) \ - { \ - _HPyCFunction_SETATTROFUNC func = (_HPyCFunction_SETATTROFUNC)IMPL; \ - return (func(_HPyGetContext(), _py2h(arg0), _py2h(arg1), _py2h(arg2))); \ - } -typedef HPy (*_HPyCFunction_REPRFUNC)(HPyContext *, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_REPRFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0) \ - { \ - _HPyCFunction_REPRFUNC func = (_HPyCFunction_REPRFUNC)IMPL; \ - return _h2py(func(_HPyGetContext(), _py2h(arg0))); \ - } -typedef HPy_hash_t (*_HPyCFunction_HASHFUNC)(HPyContext *, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_HASHFUNC(SYM, IMPL) \ - static HPy_hash_t SYM(cpy_PyObject *arg0) \ - { \ - _HPyCFunction_HASHFUNC func = (_HPyCFunction_HASHFUNC)IMPL; \ - return (func(_HPyGetContext(), _py2h(arg0))); \ - } -typedef HPy (*_HPyCFunction_GETITERFUNC)(HPyContext *, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_GETITERFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0) \ - { \ - _HPyCFunction_GETITERFUNC func = (_HPyCFunction_GETITERFUNC)IMPL; \ - return _h2py(func(_HPyGetContext(), _py2h(arg0))); \ - } -typedef HPy (*_HPyCFunction_ITERNEXTFUNC)(HPyContext *, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_ITERNEXTFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0) \ - { \ - _HPyCFunction_ITERNEXTFUNC func = (_HPyCFunction_ITERNEXTFUNC)IMPL; \ - return _h2py(func(_HPyGetContext(), _py2h(arg0))); \ - } -typedef HPy (*_HPyCFunction_DESCRGETFUNC)(HPyContext *, HPy, HPy, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_DESCRGETFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0, cpy_PyObject *arg1, cpy_PyObject *arg2) \ - { \ - _HPyCFunction_DESCRGETFUNC func = (_HPyCFunction_DESCRGETFUNC)IMPL; \ - return _h2py(func(_HPyGetContext(), _py2h(arg0), _py2h(arg1), _py2h(arg2))); \ - } -typedef int (*_HPyCFunction_DESCRSETFUNC)(HPyContext *, HPy, HPy, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_DESCRSETFUNC(SYM, IMPL) \ - static int SYM(cpy_PyObject *arg0, cpy_PyObject *arg1, cpy_PyObject *arg2) \ - { \ - _HPyCFunction_DESCRSETFUNC func = (_HPyCFunction_DESCRSETFUNC)IMPL; \ - return (func(_HPyGetContext(), _py2h(arg0), _py2h(arg1), _py2h(arg2))); \ - } -typedef HPy (*_HPyCFunction_GETTER)(HPyContext *, HPy, void *); -#define _HPyFunc_TRAMPOLINE_HPyFunc_GETTER(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0, void *arg1) \ - { \ - _HPyCFunction_GETTER func = (_HPyCFunction_GETTER)IMPL; \ - return _h2py(func(_HPyGetContext(), _py2h(arg0), (arg1))); \ - } -typedef int (*_HPyCFunction_SETTER)(HPyContext *, HPy, HPy, void *); -#define _HPyFunc_TRAMPOLINE_HPyFunc_SETTER(SYM, IMPL) \ - static int SYM(cpy_PyObject *arg0, cpy_PyObject *arg1, void *arg2) \ - { \ - _HPyCFunction_SETTER func = (_HPyCFunction_SETTER)IMPL; \ - return (func(_HPyGetContext(), _py2h(arg0), _py2h(arg1), (arg2))); \ - } -typedef int (*_HPyCFunction_OBJOBJPROC)(HPyContext *, HPy, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_OBJOBJPROC(SYM, IMPL) \ - static int SYM(cpy_PyObject *arg0, cpy_PyObject *arg1) \ - { \ - _HPyCFunction_OBJOBJPROC func = (_HPyCFunction_OBJOBJPROC)IMPL; \ - return (func(_HPyGetContext(), _py2h(arg0), _py2h(arg1))); \ - } -typedef void (*_HPyCFunction_DESTRUCTOR)(HPyContext *, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_DESTRUCTOR(SYM, IMPL) \ - static void SYM(cpy_PyObject *arg0) \ - { \ - _HPyCFunction_DESTRUCTOR func = (_HPyCFunction_DESTRUCTOR)IMPL; \ - func(_HPyGetContext(), _py2h(arg0)); \ - return; \ - } diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/cpython/hpyfunc_trampolines.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/cpython/hpyfunc_trampolines.h deleted file mode 100644 index d026df297c..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/cpython/hpyfunc_trampolines.h +++ /dev/null @@ -1,148 +0,0 @@ -/* MIT License - * - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef HPY_CPYTHON_HPYFUNC_TRAMPOLINES_H -#define HPY_CPYTHON_HPYFUNC_TRAMPOLINES_H - -/* This is a GraalPy-specific accessor function for a tuple object's items - array. There is no public header for that symbol, so we define it ad-hoc. */ -extern PyObject** (*GraalPy_get_PyTupleObject_ob_item)(PyTupleObject*); - -typedef HPy (*_HPyCFunction_VARARGS)(HPyContext*, HPy, const HPy *, size_t); -#define _HPyFunc_TRAMPOLINE_HPyFunc_VARARGS(SYM, IMPL) \ - static PyObject* \ - SYM(PyObject *self, PyObject *const *args, Py_ssize_t nargs) \ - { \ - _HPyCFunction_VARARGS func = (_HPyCFunction_VARARGS)IMPL; \ - return _h2py(func(_HPyGetContext(), \ - _py2h(self), _arr_py2h(args), nargs)); \ - } - -typedef HPy (*_HPyCFunction_KEYWORDS)(HPyContext*, HPy, const HPy *, size_t, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_KEYWORDS(SYM, IMPL) \ - static PyObject * \ - SYM(PyObject *self, PyObject *const *args, size_t nargsf, \ - PyObject *kwnames) \ - { \ - _HPyCFunction_KEYWORDS func = (_HPyCFunction_KEYWORDS)IMPL; \ - /* We also use HPyFunc_KEYWORDS for HPy_tp_call which is */ \ - /* called via vectorcall and so nargsf may have the flag set */ \ - return _h2py(func(_HPyGetContext(), _py2h(self), _arr_py2h(args), \ - PyVectorcall_NARGS(nargsf), _py2h(kwnames))); \ - } - -typedef int (*_HPyCFunction_INITPROC)(HPyContext*, HPy, const HPy *, HPy_ssize_t, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_INITPROC(SYM, IMPL) \ - static int \ - SYM(PyObject *self, PyObject *args, PyObject *kw) \ - { \ - /* get the tuple elements as an array of "PyObject *", which */ \ - /* is equivalent to an array of "HPy" with enough casting... */ \ - PyObject *const *items = GraalPy_get_PyTupleObject_ob_item((PyTupleObject *)args); \ - Py_ssize_t nargs = PyTuple_GET_SIZE(args); \ - _HPyCFunction_INITPROC func = (_HPyCFunction_INITPROC)IMPL; \ - return func(_HPyGetContext(), _py2h(self), \ - _arr_py2h(items), nargs, _py2h(kw)); \ - } - -typedef HPy (*_HPyCFunction_NEWFUNC)(HPyContext*, HPy, const HPy *, HPy_ssize_t, HPy); -#define _HPyFunc_TRAMPOLINE_HPyFunc_NEWFUNC(SYM, IMPL) \ - static PyObject * \ - SYM(PyObject *self, PyObject *args, PyObject *kw) \ - { \ - /* get the tuple elements as an array of "PyObject *", which */ \ - /* is equivalent to an array of "HPy" with enough casting... */ \ - PyObject *const *items = GraalPy_get_PyTupleObject_ob_item((PyTupleObject *)args); \ - Py_ssize_t nargs = PyTuple_GET_SIZE(args); \ - _HPyCFunction_NEWFUNC func = (_HPyCFunction_NEWFUNC)IMPL; \ - return _h2py(func(_HPyGetContext(), _py2h(self), \ - _arr_py2h(items), nargs, _py2h(kw))); \ - } - -/* special case: the HPy_tp_destroy slot doesn't map to any CPython slot. - Instead, it is called from our own tp_dealloc: see also - hpytype_dealloc(). */ -#define _HPyFunc_TRAMPOLINE_HPyFunc_DESTROYFUNC(SYM, IMPL) \ - static void SYM(void) { abort(); } - -/* this needs to be written manually because HPy has a different type for - "op": HPy_RichCmpOp instead of int */ -typedef HPy (*_HPyCFunction_RICHCMPFUNC)(HPyContext *, HPy, HPy, int); -#define _HPyFunc_TRAMPOLINE_HPyFunc_RICHCMPFUNC(SYM, IMPL) \ - static cpy_PyObject * \ - SYM(PyObject *self, PyObject *obj, int op) \ - { \ - _HPyCFunction_RICHCMPFUNC func = (_HPyCFunction_RICHCMPFUNC)IMPL; \ - return _h2py(func(_HPyGetContext(), _py2h(self), _py2h(obj), op)); \ - } - -/* With the cpython ABI, Py_buffer and HPy_buffer are ABI-compatible. - * Even though casting between them is technically undefined behavior, it - * should always work. That way, we avoid a costly allocation and copy. */ -typedef int (*_HPyCFunction_GETBUFFERPROC)(HPyContext *, HPy, HPy_buffer *, int); -#define _HPyFunc_TRAMPOLINE_HPyFunc_GETBUFFERPROC(SYM, IMPL) \ - static int SYM(PyObject *arg0, Py_buffer *arg1, int arg2) \ - { \ - _HPyCFunction_GETBUFFERPROC func = (_HPyCFunction_GETBUFFERPROC)IMPL; \ - return (func(_HPyGetContext(), _py2h(arg0), (HPy_buffer*)arg1, arg2)); \ - } - -typedef int (*_HPyCFunction_RELEASEBUFFERPROC)(HPyContext *, HPy, HPy_buffer *); -#define _HPyFunc_TRAMPOLINE_HPyFunc_RELEASEBUFFERPROC(SYM, IMPL) \ - static void SYM(PyObject *arg0, Py_buffer *arg1) \ - { \ - _HPyCFunction_RELEASEBUFFERPROC func = (_HPyCFunction_RELEASEBUFFERPROC)IMPL; \ - func(_HPyGetContext(), _py2h(arg0), (HPy_buffer*)arg1); \ - return; \ - } - - -#define _HPyFunc_TRAMPOLINE_HPyFunc_TRAVERSEPROC(SYM, IMPL) \ - static int SYM(cpy_PyObject *self, cpy_visitproc visit, void *arg) \ - { \ - return call_traverseproc_from_trampoline((HPyFunc_traverseproc)IMPL, self, \ - visit, arg); \ - } - -#define HPyCapsule_DESTRUCTOR_TRAMPOLINE(SYM, IMPL) \ - static void SYM(PyObject *capsule) \ - { \ - const char *name = PyCapsule_GetName(capsule); \ - IMPL(name, PyCapsule_GetPointer(capsule, name), \ - PyCapsule_GetContext(capsule)); \ - } - -extern void -_HPyModule_CheckCreateSlotResult(cpy_PyObject **result); - -#define _HPyFunc_TRAMPOLINE_HPyFunc_MOD_CREATE(SYM, IMPL) \ - static cpy_PyObject* SYM(cpy_PyObject *spec, cpy_PyModuleDef *def) \ - { \ - (void) def; /* avoid 'unused' warning */ \ - cpy_PyObject* result = _h2py(IMPL(_HPyGetContext(), _py2h(spec))); \ - _HPyModule_CheckCreateSlotResult(&result); \ - return result; \ - } - -#endif // HPY_CPYTHON_HPYFUNC_TRAMPOLINES_H diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/forbid_python_h/Python.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/forbid_python_h/Python.h deleted file mode 100644 index f71e69c6d2..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/forbid_python_h/Python.h +++ /dev/null @@ -1,30 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -// sanity check -#ifndef HPY_ABI_UNIVERSAL -# error "Internal HPy error, something is wrong with your build system. The directory hpy/forbid_python_h has been added to the include_dirs but the target ABI does not seems to be 'universal'" -#endif - -#error "It is forbidden to #include when targeting the HPy Universal ABI" diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/hpyexports.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/hpyexports.h deleted file mode 100644 index f627b7d361..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/hpyexports.h +++ /dev/null @@ -1,37 +0,0 @@ -/* MIT License - * - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef HPy_EXPORTS_H -#define HPy_EXPORTS_H - -// Copied from Python's exports.h -#ifndef HPy_EXPORTED_SYMBOL - #if defined(_WIN32) || defined(__CYGWIN__) - #define HPy_EXPORTED_SYMBOL __declspec(dllexport) - #else - #define HPy_EXPORTED_SYMBOL __attribute__ ((visibility ("default"))) - #endif -#endif - -#endif /* HPy_EXPORTS_H */ diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/macros.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/macros.h deleted file mode 100644 index fc1df4e60b..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/macros.h +++ /dev/null @@ -1,94 +0,0 @@ -/* MIT License - * - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* We define HPy_New as a macro around _HPy_New to suppress a - warning. Usually, we expected it to be called this way: - - PointObject *p; - HPy h = HPy_New(ctx, cls, &p); - - If we call _HPy_New directly, we get a warning because we are implicitly - casting a PointObject** into a void**. The following macro explicitly - casts the third argument to a void**. -*/ - -#define HPy_New(ctx, cls, data) (_HPy_New( \ - (ctx), \ - (cls), \ - ((void**)data) \ - )) - -/* Rich comparison opcodes */ -typedef enum { - HPy_LT = 0, - HPy_LE = 1, - HPy_EQ = 2, - HPy_NE = 3, - HPy_GT = 4, - HPy_GE = 5, -} HPy_RichCmpOp; - -// this needs to be a macro because val1 and val2 can be of arbitrary types -#define HPy_RETURN_RICHCOMPARE(ctx, val1, val2, op) \ - do { \ - bool result; \ - switch (op) { \ - case HPy_EQ: result = ((val1) == (val2)); break; \ - case HPy_NE: result = ((val1) != (val2)); break; \ - case HPy_LT: result = ((val1) < (val2)); break; \ - case HPy_GT: result = ((val1) > (val2)); break; \ - case HPy_LE: result = ((val1) <= (val2)); break; \ - case HPy_GE: result = ((val1) >= (val2)); break; \ - default: \ - HPy_FatalError(ctx, "Invalid value for HPy_RichCmpOp"); \ - } \ - if (result) \ - return HPy_Dup(ctx, ctx->h_True); \ - return HPy_Dup(ctx, ctx->h_False); \ - } while (0) - - -#if !defined(SIZEOF_PID_T) || SIZEOF_PID_T == SIZEOF_INT - #define _HPy_PARSE_PID "i" - #define HPyLong_FromPid HPyLong_FromLong - #define HPyLong_AsPid HPyLong_AsLong -#elif SIZEOF_PID_T == SIZEOF_LONG - #define _HPy_PARSE_PID "l" - #define HPyLong_FromPid HPyLong_FromLong - #define HPyLong_AsPid HPyLong_AsLong -#elif defined(SIZEOF_LONG_LONG) && SIZEOF_PID_T == SIZEOF_LONG_LONG - #define _HPy_PARSE_PID "L" - #define HPyLong_FromPid HPyLong_FromLongLong - #define HPyLong_AsPid HPyLong_AsLongLong -#else -#error "sizeof(pid_t) is neither sizeof(int), sizeof(long) or sizeof(long long)" -#endif /* SIZEOF_PID_T */ - -#define HPy_BEGIN_LEAVE_PYTHON(context) { \ - HPyThreadState _token; \ - _token = HPy_LeavePythonExecution(context); - -#define HPy_END_LEAVE_PYTHON(context) \ - HPy_ReenterPythonExecution(context, _token); \ - } diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/runtime/argparse.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/runtime/argparse.h deleted file mode 100644 index 927d87db96..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/runtime/argparse.h +++ /dev/null @@ -1,50 +0,0 @@ -/* MIT License - * - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef HPY_COMMON_RUNTIME_ARGPARSE_H -#define HPY_COMMON_RUNTIME_ARGPARSE_H -#ifdef __cplusplus -extern "C" { -#endif - -#include "hpy.h" - -HPyAPI_HELPER int -HPyArg_Parse(HPyContext *ctx, HPyTracker *ht, const HPy *args, - size_t nargs, const char *fmt, ...); - -HPyAPI_HELPER int -HPyArg_ParseKeywords(HPyContext *ctx, HPyTracker *ht, const HPy *args, - size_t nargs, HPy kwnames, const char *fmt, - const char *keywords[], ...); - -HPyAPI_HELPER int -HPyArg_ParseKeywordsDict(HPyContext *ctx, HPyTracker *ht, const HPy *args, - HPy_ssize_t nargs, HPy kw, const char *fmt, - const char *keywords[], ...); - -#ifdef __cplusplus -} -#endif -#endif /* HPY_COMMON_RUNTIME_ARGPARSE_H */ diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/runtime/buildvalue.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/runtime/buildvalue.h deleted file mode 100644 index 78fda36b64..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/runtime/buildvalue.h +++ /dev/null @@ -1,33 +0,0 @@ -/* MIT License - * - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef HPY_COMMON_RUNTIME_BUILDVALUE_H -#define HPY_COMMON_RUNTIME_BUILDVALUE_H - -#include "hpy.h" - -HPyAPI_HELPER HPy -HPy_BuildValue(HPyContext *ctx, const char *fmt, ...); - -#endif /* HPY_COMMON_RUNTIME_BUILDVALUE_H */ diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/runtime/ctx_module.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/runtime/ctx_module.h deleted file mode 100644 index 079e772b0f..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/runtime/ctx_module.h +++ /dev/null @@ -1,49 +0,0 @@ -/* MIT License - * - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef HPY_COMMON_RUNTIME_CTX_MODULE_H -#define HPY_COMMON_RUNTIME_CTX_MODULE_H - -#include -#include "hpy.h" - -// Helper functions for CPython implementation (both CPython ABI and -// HPy universal module impl for CPython) - -/** Converts HPy module definition to CPython module definition for multiphase - * initialization */ -_HPy_HIDDEN PyModuleDef* -_HPyModuleDef_CreatePyModuleDef(HPyModuleDef *hpydef); - -/** Converts HPy module definition to PyObject that wraps CPython module - * definition for multiphase initialization */ -_HPy_HIDDEN PyObject* -_HPyModuleDef_AsPyInit(HPyModuleDef *hpydef); - -/** Implements the extra HPy specific validation that should be applied to the - * result of the HPy_mod_create slot. */ -_HPy_HIDDEN void -_HPyModule_CheckCreateSlotResult(PyObject **result); - -#endif //HPY_COMMON_RUNTIME_CTX_MODULE_H diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/runtime/ctx_type.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/runtime/ctx_type.h deleted file mode 100644 index 90d7e08c08..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/runtime/ctx_type.h +++ /dev/null @@ -1,40 +0,0 @@ -/* MIT License - * - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef HPY_COMMON_RUNTIME_CTX_TYPE_H -#define HPY_COMMON_RUNTIME_CTX_TYPE_H - -#include -#include "hpy.h" -#include "hpy/hpytype.h" - -_HPy_HIDDEN PyMethodDef *create_method_defs(HPyDef *hpydefs[], - PyMethodDef *legacy_methods); - -_HPy_HIDDEN int call_traverseproc_from_trampoline(HPyFunc_traverseproc tp_traverse, - PyObject *self, - cpy_visitproc cpy_visit, - void *cpy_arg); - -#endif /* HPY_COMMON_RUNTIME_CTX_TYPE_H */ diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/runtime/format.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/runtime/format.h deleted file mode 100644 index b04b5d12b9..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/runtime/format.h +++ /dev/null @@ -1,42 +0,0 @@ -/* MIT License - * - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/** - * String formatting helpers. These functions are not part of HPy ABI. The implementation will be linked into HPy extensions. - */ -#ifndef HPY_COMMON_RUNTIME_FORMAT_H -#define HPY_COMMON_RUNTIME_FORMAT_H - -#include "hpy.h" - -HPyAPI_HELPER HPy -HPyUnicode_FromFormat(HPyContext *ctx, const char *fmt, ...); - -HPyAPI_HELPER HPy -HPyUnicode_FromFormatV(HPyContext *ctx, const char *format, va_list vargs); - -HPyAPI_HELPER HPy -HPyErr_Format(HPyContext *ctx, HPy h_type, const char *fmt, ...); - -#endif /* HPY_COMMON_RUNTIME_FORMAT_H */ diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/runtime/helpers.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/runtime/helpers.h deleted file mode 100644 index 7cfd833a40..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/runtime/helpers.h +++ /dev/null @@ -1,39 +0,0 @@ -/* MIT License - * - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef HPY_COMMON_RUNTIME_HELPERS_H -#define HPY_COMMON_RUNTIME_HELPERS_H - -#include "hpy.h" -#include "hpy/hpytype.h" - -HPyAPI_HELPER int -HPyHelpers_AddType(HPyContext *ctx, HPy obj, const char *name, - HPyType_Spec *hpyspec, HPyType_SpecParam *params); - -HPyAPI_HELPER int -HPyHelpers_PackArgsAndKeywords(HPyContext *ctx, const HPy *args, size_t nargs, - HPy kwnames, HPy *out_args_tuple, HPy *out_kwd); - -#endif /* HPY_COMMON_RUNTIME_HELPERS_H */ diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/universal/autogen_ctx.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/universal/autogen_ctx.h deleted file mode 100644 index ef205ad4bd..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/universal/autogen_ctx.h +++ /dev/null @@ -1,335 +0,0 @@ -/* MIT License - * - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - - -/* - DO NOT EDIT THIS FILE! - - This file is automatically generated by hpy.tools.autogen.ctx.autogen_ctx_h - See also hpy.tools.autogen and hpy/tools/public_api.h - - Run this to regenerate: - make autogen - -*/ - -typedef HPy* _HPyPtr; -typedef const HPy* _ConstHPyPtr; -typedef HPyField* _HPyFieldPtr; -typedef HPy _HPyConst; -typedef HPyGlobal* _HPyGlobalPtr; - -#ifdef GRAALVM_PYTHON_LLVM -#define HPy void* -#define HPyListBuilder void* -#define HPyTupleBuilder void* -#define HPyTracker void* -#define HPyField void* -#define HPyThreadState void* -#define HPyGlobal void* -#define _HPyCapsule_key int32_t -#define HPy_SourceKind int32_t -#endif - - -struct _HPyContext_s { - const char *name; // used just to make debugging and testing easier - void *_private; // used by implementations to store custom data - int abi_version; - _HPyConst h_None; - _HPyConst h_True; - _HPyConst h_False; - _HPyConst h_NotImplemented; - _HPyConst h_Ellipsis; - _HPyConst h_BaseException; - _HPyConst h_Exception; - _HPyConst h_StopAsyncIteration; - _HPyConst h_StopIteration; - _HPyConst h_GeneratorExit; - _HPyConst h_ArithmeticError; - _HPyConst h_LookupError; - _HPyConst h_AssertionError; - _HPyConst h_AttributeError; - _HPyConst h_BufferError; - _HPyConst h_EOFError; - _HPyConst h_FloatingPointError; - _HPyConst h_OSError; - _HPyConst h_ImportError; - _HPyConst h_ModuleNotFoundError; - _HPyConst h_IndexError; - _HPyConst h_KeyError; - _HPyConst h_KeyboardInterrupt; - _HPyConst h_MemoryError; - _HPyConst h_NameError; - _HPyConst h_OverflowError; - _HPyConst h_RuntimeError; - _HPyConst h_RecursionError; - _HPyConst h_NotImplementedError; - _HPyConst h_SyntaxError; - _HPyConst h_IndentationError; - _HPyConst h_TabError; - _HPyConst h_ReferenceError; - _HPyConst h_SystemError; - _HPyConst h_SystemExit; - _HPyConst h_TypeError; - _HPyConst h_UnboundLocalError; - _HPyConst h_UnicodeError; - _HPyConst h_UnicodeEncodeError; - _HPyConst h_UnicodeDecodeError; - _HPyConst h_UnicodeTranslateError; - _HPyConst h_ValueError; - _HPyConst h_ZeroDivisionError; - _HPyConst h_BlockingIOError; - _HPyConst h_BrokenPipeError; - _HPyConst h_ChildProcessError; - _HPyConst h_ConnectionError; - _HPyConst h_ConnectionAbortedError; - _HPyConst h_ConnectionRefusedError; - _HPyConst h_ConnectionResetError; - _HPyConst h_FileExistsError; - _HPyConst h_FileNotFoundError; - _HPyConst h_InterruptedError; - _HPyConst h_IsADirectoryError; - _HPyConst h_NotADirectoryError; - _HPyConst h_PermissionError; - _HPyConst h_ProcessLookupError; - _HPyConst h_TimeoutError; - _HPyConst h_Warning; - _HPyConst h_UserWarning; - _HPyConst h_DeprecationWarning; - _HPyConst h_PendingDeprecationWarning; - _HPyConst h_SyntaxWarning; - _HPyConst h_RuntimeWarning; - _HPyConst h_FutureWarning; - _HPyConst h_ImportWarning; - _HPyConst h_UnicodeWarning; - _HPyConst h_BytesWarning; - _HPyConst h_ResourceWarning; - _HPyConst h_BaseObjectType; - _HPyConst h_TypeType; - _HPyConst h_BoolType; - _HPyConst h_LongType; - _HPyConst h_FloatType; - _HPyConst h_UnicodeType; - _HPyConst h_TupleType; - _HPyConst h_ListType; - HPy (*ctx_Dup)(HPyContext *ctx, HPy h); - void (*ctx_Close)(HPyContext *ctx, HPy h); - HPy (*ctx_Long_FromInt32_t)(HPyContext *ctx, int32_t value); - HPy (*ctx_Long_FromUInt32_t)(HPyContext *ctx, uint32_t value); - HPy (*ctx_Long_FromInt64_t)(HPyContext *ctx, int64_t v); - HPy (*ctx_Long_FromUInt64_t)(HPyContext *ctx, uint64_t v); - HPy (*ctx_Long_FromSize_t)(HPyContext *ctx, size_t value); - HPy (*ctx_Long_FromSsize_t)(HPyContext *ctx, HPy_ssize_t value); - int32_t (*ctx_Long_AsInt32_t)(HPyContext *ctx, HPy h); - uint32_t (*ctx_Long_AsUInt32_t)(HPyContext *ctx, HPy h); - uint32_t (*ctx_Long_AsUInt32_tMask)(HPyContext *ctx, HPy h); - int64_t (*ctx_Long_AsInt64_t)(HPyContext *ctx, HPy h); - uint64_t (*ctx_Long_AsUInt64_t)(HPyContext *ctx, HPy h); - uint64_t (*ctx_Long_AsUInt64_tMask)(HPyContext *ctx, HPy h); - size_t (*ctx_Long_AsSize_t)(HPyContext *ctx, HPy h); - HPy_ssize_t (*ctx_Long_AsSsize_t)(HPyContext *ctx, HPy h); - void *(*ctx_Long_AsVoidPtr)(HPyContext *ctx, HPy h); - double (*ctx_Long_AsDouble)(HPyContext *ctx, HPy h); - HPy (*ctx_Float_FromDouble)(HPyContext *ctx, double v); - double (*ctx_Float_AsDouble)(HPyContext *ctx, HPy h); - HPy (*ctx_Bool_FromBool)(HPyContext *ctx, bool v); - HPy_ssize_t (*ctx_Length)(HPyContext *ctx, HPy h); - int (*ctx_Number_Check)(HPyContext *ctx, HPy h); - HPy (*ctx_Add)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_Subtract)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_Multiply)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_MatrixMultiply)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_FloorDivide)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_TrueDivide)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_Remainder)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_Divmod)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_Power)(HPyContext *ctx, HPy h1, HPy h2, HPy h3); - HPy (*ctx_Negative)(HPyContext *ctx, HPy h1); - HPy (*ctx_Positive)(HPyContext *ctx, HPy h1); - HPy (*ctx_Absolute)(HPyContext *ctx, HPy h1); - HPy (*ctx_Invert)(HPyContext *ctx, HPy h1); - HPy (*ctx_Lshift)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_Rshift)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_And)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_Xor)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_Or)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_Index)(HPyContext *ctx, HPy h1); - HPy (*ctx_Long)(HPyContext *ctx, HPy h1); - HPy (*ctx_Float)(HPyContext *ctx, HPy h1); - HPy (*ctx_InPlaceAdd)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_InPlaceSubtract)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_InPlaceMultiply)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_InPlaceMatrixMultiply)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_InPlaceFloorDivide)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_InPlaceTrueDivide)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_InPlaceRemainder)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_InPlacePower)(HPyContext *ctx, HPy h1, HPy h2, HPy h3); - HPy (*ctx_InPlaceLshift)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_InPlaceRshift)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_InPlaceAnd)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_InPlaceXor)(HPyContext *ctx, HPy h1, HPy h2); - HPy (*ctx_InPlaceOr)(HPyContext *ctx, HPy h1, HPy h2); - int (*ctx_Callable_Check)(HPyContext *ctx, HPy h); - HPy (*ctx_CallTupleDict)(HPyContext *ctx, HPy callable, HPy args, HPy kw); - void (*ctx_FatalError)(HPyContext *ctx, const char *message); - void (*ctx_Err_SetString)(HPyContext *ctx, HPy h_type, const char *utf8_message); - void (*ctx_Err_SetObject)(HPyContext *ctx, HPy h_type, HPy h_value); - HPy (*ctx_Err_SetFromErrnoWithFilename)(HPyContext *ctx, HPy h_type, const char *filename_fsencoded); - void (*ctx_Err_SetFromErrnoWithFilenameObjects)(HPyContext *ctx, HPy h_type, HPy filename1, HPy filename2); - int (*ctx_Err_Occurred)(HPyContext *ctx); - int (*ctx_Err_ExceptionMatches)(HPyContext *ctx, HPy exc); - void (*ctx_Err_NoMemory)(HPyContext *ctx); - void (*ctx_Err_Clear)(HPyContext *ctx); - HPy (*ctx_Err_NewException)(HPyContext *ctx, const char *utf8_name, HPy base, HPy dict); - HPy (*ctx_Err_NewExceptionWithDoc)(HPyContext *ctx, const char *utf8_name, const char *utf8_doc, HPy base, HPy dict); - int (*ctx_Err_WarnEx)(HPyContext *ctx, HPy category, const char *utf8_message, HPy_ssize_t stack_level); - void (*ctx_Err_WriteUnraisable)(HPyContext *ctx, HPy obj); - int (*ctx_IsTrue)(HPyContext *ctx, HPy h); - HPy (*ctx_Type_FromSpec)(HPyContext *ctx, HPyType_Spec *spec, HPyType_SpecParam *params); - HPy (*ctx_Type_GenericNew)(HPyContext *ctx, HPy type, _ConstHPyPtr args, HPy_ssize_t nargs, HPy kw); - HPy (*ctx_GetAttr)(HPyContext *ctx, HPy obj, HPy name); - HPy (*ctx_GetAttr_s)(HPyContext *ctx, HPy obj, const char *utf8_name); - int (*ctx_HasAttr)(HPyContext *ctx, HPy obj, HPy name); - int (*ctx_HasAttr_s)(HPyContext *ctx, HPy obj, const char *utf8_name); - int (*ctx_SetAttr)(HPyContext *ctx, HPy obj, HPy name, HPy value); - int (*ctx_SetAttr_s)(HPyContext *ctx, HPy obj, const char *utf8_name, HPy value); - HPy (*ctx_GetItem)(HPyContext *ctx, HPy obj, HPy key); - HPy (*ctx_GetItem_i)(HPyContext *ctx, HPy obj, HPy_ssize_t idx); - HPy (*ctx_GetItem_s)(HPyContext *ctx, HPy obj, const char *utf8_key); - int (*ctx_Contains)(HPyContext *ctx, HPy container, HPy key); - int (*ctx_SetItem)(HPyContext *ctx, HPy obj, HPy key, HPy value); - int (*ctx_SetItem_i)(HPyContext *ctx, HPy obj, HPy_ssize_t idx, HPy value); - int (*ctx_SetItem_s)(HPyContext *ctx, HPy obj, const char *utf8_key, HPy value); - HPy (*ctx_Type)(HPyContext *ctx, HPy obj); - int (*ctx_TypeCheck)(HPyContext *ctx, HPy obj, HPy type); - int (*ctx_Is)(HPyContext *ctx, HPy obj, HPy other); - void *(*ctx_AsStruct_Object)(HPyContext *ctx, HPy h); - void *(*ctx_AsStruct_Legacy)(HPyContext *ctx, HPy h); - HPy (*ctx_New)(HPyContext *ctx, HPy h_type, void **data); - HPy (*ctx_Repr)(HPyContext *ctx, HPy obj); - HPy (*ctx_Str)(HPyContext *ctx, HPy obj); - HPy (*ctx_ASCII)(HPyContext *ctx, HPy obj); - HPy (*ctx_Bytes)(HPyContext *ctx, HPy obj); - HPy (*ctx_RichCompare)(HPyContext *ctx, HPy v, HPy w, int op); - int (*ctx_RichCompareBool)(HPyContext *ctx, HPy v, HPy w, int op); - HPy_hash_t (*ctx_Hash)(HPyContext *ctx, HPy obj); - int (*ctx_Bytes_Check)(HPyContext *ctx, HPy h); - HPy_ssize_t (*ctx_Bytes_Size)(HPyContext *ctx, HPy h); - HPy_ssize_t (*ctx_Bytes_GET_SIZE)(HPyContext *ctx, HPy h); - const char *(*ctx_Bytes_AsString)(HPyContext *ctx, HPy h); - const char *(*ctx_Bytes_AS_STRING)(HPyContext *ctx, HPy h); - HPy (*ctx_Bytes_FromString)(HPyContext *ctx, const char *bytes); - HPy (*ctx_Bytes_FromStringAndSize)(HPyContext *ctx, const char *bytes, HPy_ssize_t len); - HPy (*ctx_Unicode_FromString)(HPyContext *ctx, const char *utf8); - int (*ctx_Unicode_Check)(HPyContext *ctx, HPy h); - HPy (*ctx_Unicode_AsASCIIString)(HPyContext *ctx, HPy h); - HPy (*ctx_Unicode_AsLatin1String)(HPyContext *ctx, HPy h); - HPy (*ctx_Unicode_AsUTF8String)(HPyContext *ctx, HPy h); - const char *(*ctx_Unicode_AsUTF8AndSize)(HPyContext *ctx, HPy h, HPy_ssize_t *size); - HPy (*ctx_Unicode_FromWideChar)(HPyContext *ctx, const wchar_t *w, HPy_ssize_t size); - HPy (*ctx_Unicode_DecodeFSDefault)(HPyContext *ctx, const char *v); - HPy (*ctx_Unicode_DecodeFSDefaultAndSize)(HPyContext *ctx, const char *v, HPy_ssize_t size); - HPy (*ctx_Unicode_EncodeFSDefault)(HPyContext *ctx, HPy h); - HPy_UCS4 (*ctx_Unicode_ReadChar)(HPyContext *ctx, HPy h, HPy_ssize_t index); - HPy (*ctx_Unicode_DecodeASCII)(HPyContext *ctx, const char *ascii, HPy_ssize_t size, const char *errors); - HPy (*ctx_Unicode_DecodeLatin1)(HPyContext *ctx, const char *latin1, HPy_ssize_t size, const char *errors); - int (*ctx_List_Check)(HPyContext *ctx, HPy h); - HPy (*ctx_List_New)(HPyContext *ctx, HPy_ssize_t len); - int (*ctx_List_Append)(HPyContext *ctx, HPy h_list, HPy h_item); - int (*ctx_Dict_Check)(HPyContext *ctx, HPy h); - HPy (*ctx_Dict_New)(HPyContext *ctx); - int (*ctx_Tuple_Check)(HPyContext *ctx, HPy h); - HPy (*ctx_Tuple_FromArray)(HPyContext *ctx, _HPyPtr items, HPy_ssize_t n); - HPy (*ctx_Import_ImportModule)(HPyContext *ctx, const char *utf8_name); - HPy (*ctx_FromPyObject)(HPyContext *ctx, cpy_PyObject *obj); - cpy_PyObject *(*ctx_AsPyObject)(HPyContext *ctx, HPy h); - void (*ctx_CallRealFunctionFromTrampoline)(HPyContext *ctx, HPyFunc_Signature sig, HPyCFunction func, void *args); - HPyListBuilder (*ctx_ListBuilder_New)(HPyContext *ctx, HPy_ssize_t size); - void (*ctx_ListBuilder_Set)(HPyContext *ctx, HPyListBuilder builder, HPy_ssize_t index, HPy h_item); - HPy (*ctx_ListBuilder_Build)(HPyContext *ctx, HPyListBuilder builder); - void (*ctx_ListBuilder_Cancel)(HPyContext *ctx, HPyListBuilder builder); - HPyTupleBuilder (*ctx_TupleBuilder_New)(HPyContext *ctx, HPy_ssize_t size); - void (*ctx_TupleBuilder_Set)(HPyContext *ctx, HPyTupleBuilder builder, HPy_ssize_t index, HPy h_item); - HPy (*ctx_TupleBuilder_Build)(HPyContext *ctx, HPyTupleBuilder builder); - void (*ctx_TupleBuilder_Cancel)(HPyContext *ctx, HPyTupleBuilder builder); - HPyTracker (*ctx_Tracker_New)(HPyContext *ctx, HPy_ssize_t size); - int (*ctx_Tracker_Add)(HPyContext *ctx, HPyTracker ht, HPy h); - void (*ctx_Tracker_ForgetAll)(HPyContext *ctx, HPyTracker ht); - void (*ctx_Tracker_Close)(HPyContext *ctx, HPyTracker ht); - void (*ctx_Field_Store)(HPyContext *ctx, HPy target_object, _HPyFieldPtr target_field, HPy h); - HPy (*ctx_Field_Load)(HPyContext *ctx, HPy source_object, HPyField source_field); - void (*ctx_ReenterPythonExecution)(HPyContext *ctx, HPyThreadState state); - HPyThreadState (*ctx_LeavePythonExecution)(HPyContext *ctx); - void (*ctx_Global_Store)(HPyContext *ctx, _HPyGlobalPtr global, HPy h); - HPy (*ctx_Global_Load)(HPyContext *ctx, HPyGlobal global); - void (*ctx_Dump)(HPyContext *ctx, HPy h); - void *(*ctx_AsStruct_Type)(HPyContext *ctx, HPy h); - void *(*ctx_AsStruct_Long)(HPyContext *ctx, HPy h); - void *(*ctx_AsStruct_Float)(HPyContext *ctx, HPy h); - void *(*ctx_AsStruct_Unicode)(HPyContext *ctx, HPy h); - void *(*ctx_AsStruct_Tuple)(HPyContext *ctx, HPy h); - void *(*ctx_AsStruct_List)(HPyContext *ctx, HPy h); - HPyType_BuiltinShape (*ctx_Type_GetBuiltinShape)(HPyContext *ctx, HPy h_type); - int (*ctx_DelItem)(HPyContext *ctx, HPy obj, HPy key); - int (*ctx_DelItem_i)(HPyContext *ctx, HPy obj, HPy_ssize_t idx); - int (*ctx_DelItem_s)(HPyContext *ctx, HPy obj, const char *utf8_key); - _HPyConst h_ComplexType; - _HPyConst h_BytesType; - _HPyConst h_MemoryViewType; - _HPyConst h_CapsuleType; - _HPyConst h_SliceType; - _HPyConst h_Builtins; - HPy (*ctx_Capsule_New)(HPyContext *ctx, void *pointer, const char *utf8_name, HPyCapsule_Destructor *destructor); - void *(*ctx_Capsule_Get)(HPyContext *ctx, HPy capsule, _HPyCapsule_key key, const char *utf8_name); - int (*ctx_Capsule_IsValid)(HPyContext *ctx, HPy capsule, const char *utf8_name); - int (*ctx_Capsule_Set)(HPyContext *ctx, HPy capsule, _HPyCapsule_key key, void *value); - HPy (*ctx_Compile_s)(HPyContext *ctx, const char *utf8_source, const char *utf8_filename, HPy_SourceKind kind); - HPy (*ctx_EvalCode)(HPyContext *ctx, HPy code, HPy globals, HPy locals); - HPy (*ctx_ContextVar_New)(HPyContext *ctx, const char *name, HPy default_value); - int32_t (*ctx_ContextVar_Get)(HPyContext *ctx, HPy context_var, HPy default_value, _HPyPtr result); - HPy (*ctx_ContextVar_Set)(HPyContext *ctx, HPy context_var, HPy value); - const char *(*ctx_Type_GetName)(HPyContext *ctx, HPy type); - int (*ctx_Type_IsSubtype)(HPyContext *ctx, HPy sub, HPy type); - HPy (*ctx_Unicode_FromEncodedObject)(HPyContext *ctx, HPy obj, const char *encoding, const char *errors); - HPy (*ctx_Unicode_Substring)(HPyContext *ctx, HPy str, HPy_ssize_t start, HPy_ssize_t end); - HPy (*ctx_Dict_Keys)(HPyContext *ctx, HPy h); - HPy (*ctx_Dict_Copy)(HPyContext *ctx, HPy h); - int (*ctx_Slice_Unpack)(HPyContext *ctx, HPy slice, HPy_ssize_t *start, HPy_ssize_t *stop, HPy_ssize_t *step); - int (*ctx_SetCallFunction)(HPyContext *ctx, HPy h, HPyCallFunction *func); - HPy (*ctx_Call)(HPyContext *ctx, HPy callable, _ConstHPyPtr args, size_t nargs, HPy kwnames); - HPy (*ctx_CallMethod)(HPyContext *ctx, HPy name, _ConstHPyPtr args, size_t nargs, HPy kwnames); -}; - -#ifdef GRAALVM_PYTHON_LLVM -#undef HPy -#undef HPyListBuilder -#undef HPyTupleBuilder -#undef HPyTracker -#undef HPyField -#undef HPyThreadState -#undef HPyGlobal -#undef _HPyCapsule_key -#undef HPy_SourceKind -#endif diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/universal/autogen_hpyfunc_trampolines.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/universal/autogen_hpyfunc_trampolines.h deleted file mode 100644 index d873b50f2a..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/universal/autogen_hpyfunc_trampolines.h +++ /dev/null @@ -1,440 +0,0 @@ -/* MIT License - * - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - - -/* - DO NOT EDIT THIS FILE! - - This file is automatically generated by hpy.tools.autogen.hpyfunc.autogen_hpyfunc_trampoline_h - See also hpy.tools.autogen and hpy/tools/public_api.h - - Run this to regenerate: - make autogen - -*/ - -typedef struct { - cpy_PyObject *self; - cpy_PyObject * result; -} _HPyFunc_args_NOARGS; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_NOARGS(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *self) \ - { \ - _HPyFunc_args_NOARGS a = { self }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_NOARGS, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *self; - cpy_PyObject *arg; - cpy_PyObject * result; -} _HPyFunc_args_O; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_O(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *self, cpy_PyObject *arg) \ - { \ - _HPyFunc_args_O a = { self, arg }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_O, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - cpy_PyObject * result; -} _HPyFunc_args_UNARYFUNC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_UNARYFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0) \ - { \ - _HPyFunc_args_UNARYFUNC a = { arg0 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_UNARYFUNC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - cpy_PyObject *arg1; - cpy_PyObject * result; -} _HPyFunc_args_BINARYFUNC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_BINARYFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0, cpy_PyObject *arg1) \ - { \ - _HPyFunc_args_BINARYFUNC a = { arg0, arg1 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_BINARYFUNC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - cpy_PyObject *arg1; - cpy_PyObject *arg2; - cpy_PyObject * result; -} _HPyFunc_args_TERNARYFUNC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_TERNARYFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0, cpy_PyObject *arg1, cpy_PyObject *arg2) \ - { \ - _HPyFunc_args_TERNARYFUNC a = { arg0, arg1, arg2 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_TERNARYFUNC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - int result; -} _HPyFunc_args_INQUIRY; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_INQUIRY(SYM, IMPL) \ - static int SYM(cpy_PyObject *arg0) \ - { \ - _HPyFunc_args_INQUIRY a = { arg0 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_INQUIRY, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - HPy_ssize_t result; -} _HPyFunc_args_LENFUNC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_LENFUNC(SYM, IMPL) \ - static HPy_ssize_t SYM(cpy_PyObject *arg0) \ - { \ - _HPyFunc_args_LENFUNC a = { arg0 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_LENFUNC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - HPy_ssize_t arg1; - cpy_PyObject * result; -} _HPyFunc_args_SSIZEARGFUNC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_SSIZEARGFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0, HPy_ssize_t arg1) \ - { \ - _HPyFunc_args_SSIZEARGFUNC a = { arg0, arg1 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_SSIZEARGFUNC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - HPy_ssize_t arg1; - HPy_ssize_t arg2; - cpy_PyObject * result; -} _HPyFunc_args_SSIZESSIZEARGFUNC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_SSIZESSIZEARGFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0, HPy_ssize_t arg1, HPy_ssize_t arg2) \ - { \ - _HPyFunc_args_SSIZESSIZEARGFUNC a = { arg0, arg1, arg2 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_SSIZESSIZEARGFUNC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - HPy_ssize_t arg1; - cpy_PyObject *arg2; - int result; -} _HPyFunc_args_SSIZEOBJARGPROC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_SSIZEOBJARGPROC(SYM, IMPL) \ - static int SYM(cpy_PyObject *arg0, HPy_ssize_t arg1, cpy_PyObject *arg2) \ - { \ - _HPyFunc_args_SSIZEOBJARGPROC a = { arg0, arg1, arg2 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_SSIZEOBJARGPROC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - HPy_ssize_t arg1; - HPy_ssize_t arg2; - cpy_PyObject *arg3; - int result; -} _HPyFunc_args_SSIZESSIZEOBJARGPROC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_SSIZESSIZEOBJARGPROC(SYM, IMPL) \ - static int SYM(cpy_PyObject *arg0, HPy_ssize_t arg1, HPy_ssize_t arg2, cpy_PyObject *arg3) \ - { \ - _HPyFunc_args_SSIZESSIZEOBJARGPROC a = { arg0, arg1, arg2, arg3 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_SSIZESSIZEOBJARGPROC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - cpy_PyObject *arg1; - cpy_PyObject *arg2; - int result; -} _HPyFunc_args_OBJOBJARGPROC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_OBJOBJARGPROC(SYM, IMPL) \ - static int SYM(cpy_PyObject *arg0, cpy_PyObject *arg1, cpy_PyObject *arg2) \ - { \ - _HPyFunc_args_OBJOBJARGPROC a = { arg0, arg1, arg2 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_OBJOBJARGPROC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - void *arg0; -} _HPyFunc_args_FREEFUNC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_FREEFUNC(SYM, IMPL) \ - static void SYM(void *arg0) \ - { \ - _HPyFunc_args_FREEFUNC a = { arg0 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_FREEFUNC, (HPyCFunction)IMPL, &a); \ - return; \ - } - -typedef struct { - cpy_PyObject *arg0; - char *arg1; - cpy_PyObject * result; -} _HPyFunc_args_GETATTRFUNC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_GETATTRFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0, char *arg1) \ - { \ - _HPyFunc_args_GETATTRFUNC a = { arg0, arg1 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_GETATTRFUNC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - cpy_PyObject *arg1; - cpy_PyObject * result; -} _HPyFunc_args_GETATTROFUNC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_GETATTROFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0, cpy_PyObject *arg1) \ - { \ - _HPyFunc_args_GETATTROFUNC a = { arg0, arg1 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_GETATTROFUNC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - char *arg1; - cpy_PyObject *arg2; - int result; -} _HPyFunc_args_SETATTRFUNC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_SETATTRFUNC(SYM, IMPL) \ - static int SYM(cpy_PyObject *arg0, char *arg1, cpy_PyObject *arg2) \ - { \ - _HPyFunc_args_SETATTRFUNC a = { arg0, arg1, arg2 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_SETATTRFUNC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - cpy_PyObject *arg1; - cpy_PyObject *arg2; - int result; -} _HPyFunc_args_SETATTROFUNC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_SETATTROFUNC(SYM, IMPL) \ - static int SYM(cpy_PyObject *arg0, cpy_PyObject *arg1, cpy_PyObject *arg2) \ - { \ - _HPyFunc_args_SETATTROFUNC a = { arg0, arg1, arg2 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_SETATTROFUNC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - cpy_PyObject * result; -} _HPyFunc_args_REPRFUNC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_REPRFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0) \ - { \ - _HPyFunc_args_REPRFUNC a = { arg0 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_REPRFUNC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - HPy_hash_t result; -} _HPyFunc_args_HASHFUNC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_HASHFUNC(SYM, IMPL) \ - static HPy_hash_t SYM(cpy_PyObject *arg0) \ - { \ - _HPyFunc_args_HASHFUNC a = { arg0 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_HASHFUNC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - cpy_PyObject * result; -} _HPyFunc_args_GETITERFUNC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_GETITERFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0) \ - { \ - _HPyFunc_args_GETITERFUNC a = { arg0 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_GETITERFUNC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - cpy_PyObject * result; -} _HPyFunc_args_ITERNEXTFUNC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_ITERNEXTFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0) \ - { \ - _HPyFunc_args_ITERNEXTFUNC a = { arg0 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_ITERNEXTFUNC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - cpy_PyObject *arg1; - cpy_PyObject *arg2; - cpy_PyObject * result; -} _HPyFunc_args_DESCRGETFUNC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_DESCRGETFUNC(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0, cpy_PyObject *arg1, cpy_PyObject *arg2) \ - { \ - _HPyFunc_args_DESCRGETFUNC a = { arg0, arg1, arg2 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_DESCRGETFUNC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - cpy_PyObject *arg1; - cpy_PyObject *arg2; - int result; -} _HPyFunc_args_DESCRSETFUNC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_DESCRSETFUNC(SYM, IMPL) \ - static int SYM(cpy_PyObject *arg0, cpy_PyObject *arg1, cpy_PyObject *arg2) \ - { \ - _HPyFunc_args_DESCRSETFUNC a = { arg0, arg1, arg2 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_DESCRSETFUNC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - void *arg1; - cpy_PyObject * result; -} _HPyFunc_args_GETTER; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_GETTER(SYM, IMPL) \ - static cpy_PyObject *SYM(cpy_PyObject *arg0, void *arg1) \ - { \ - _HPyFunc_args_GETTER a = { arg0, arg1 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_GETTER, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - cpy_PyObject *arg1; - void *arg2; - int result; -} _HPyFunc_args_SETTER; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_SETTER(SYM, IMPL) \ - static int SYM(cpy_PyObject *arg0, cpy_PyObject *arg1, void *arg2) \ - { \ - _HPyFunc_args_SETTER a = { arg0, arg1, arg2 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_SETTER, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; - cpy_PyObject *arg1; - int result; -} _HPyFunc_args_OBJOBJPROC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_OBJOBJPROC(SYM, IMPL) \ - static int SYM(cpy_PyObject *arg0, cpy_PyObject *arg1) \ - { \ - _HPyFunc_args_OBJOBJPROC a = { arg0, arg1 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_OBJOBJPROC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *arg0; -} _HPyFunc_args_DESTRUCTOR; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_DESTRUCTOR(SYM, IMPL) \ - static void SYM(cpy_PyObject *arg0) \ - { \ - _HPyFunc_args_DESTRUCTOR a = { arg0 }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_DESTRUCTOR, (HPyCFunction)IMPL, &a); \ - return; \ - } - diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/universal/autogen_trampolines.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/universal/autogen_trampolines.h deleted file mode 100644 index 186fd8386b..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/universal/autogen_trampolines.h +++ /dev/null @@ -1,1158 +0,0 @@ -/* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - - -/* - DO NOT EDIT THIS FILE! - - This file is automatically generated by hpy.tools.autogen.graalpy.autogen_llvm_trampolines_h - See also hpy.tools.autogen and hpy/tools/public_api.h - - Run this to regenerate: - make autogen - -*/ - -#ifdef GRAALVM_PYTHON_LLVM -#define UNWRAP(_h) ((_h)._i) -#define WRAP(_ptr) ((HPy){(_ptr)}) -#define UNWRAP_TUPLE_BUILDER(_h) ((_h)._tup) -#define WRAP_TUPLE_BUILDER(_ptr) ((HPyTupleBuilder){(_ptr)}) -#define UNWRAP_LIST_BUILDER(_h) ((_h)._lst) -#define WRAP_LIST_BUILDER(_ptr) ((HPyListBuilder){(_ptr)}) -#define UNWRAP_TRACKER(_h) ((_h)._i) -#define WRAP_TRACKER(_ptr) ((HPyTracker){(_ptr)}) -#define UNWRAP_THREADSTATE(_ts) ((_ts)._i) -#define WRAP_THREADSTATE(_ptr) ((HPyThreadState){(_ptr)}) -#define UNWRAP_FIELD(_h) ((_h)._i) -#define WRAP_FIELD(_ptr) ((HPyField){(_ptr)}) -#define UNWRAP_GLOBAL(_h) ((_h)._i) -#define WRAP_GLOBAL(_ptr) ((HPyGlobal){(_ptr)}) -#define UNWRAP_SOURCE_KIND(_h) ((int)(_h)) -#else -#define UNWRAP(_h) _h -#define WRAP(_ptr) _ptr -#define UNWRAP_TUPLE_BUILDER(_h) _h -#define WRAP_TUPLE_BUILDER(_ptr) _ptr -#define UNWRAP_LIST_BUILDER(_h) _h -#define WRAP_LIST_BUILDER(_ptr) _ptr -#define UNWRAP_TRACKER(_h) _h -#define WRAP_TRACKER(_ptr) _ptr -#define UNWRAP_THREADSTATE(_ts) _ts -#define WRAP_THREADSTATE(_data) _data -#define UNWRAP_FIELD(_h) _h -#define WRAP_FIELD(_ptr) _ptr -#define UNWRAP_GLOBAL(_h) _h -#define WRAP_GLOBAL(_ptr) _ptr -#define UNWRAP_SOURCE_KIND(_h) _h -#endif -HPyAPI_FUNC -HPy HPy_Dup(HPyContext *ctx, HPy h) -{ - return WRAP(ctx->ctx_Dup((ctx), UNWRAP(h))); -} - -HPyAPI_FUNC -void HPy_Close(HPyContext *ctx, HPy h) -{ - ctx->ctx_Close((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -HPy HPyLong_FromInt32_t(HPyContext *ctx, int32_t value) -{ - return WRAP(ctx->ctx_Long_FromInt32_t((ctx), (value))); -} - -HPyAPI_FUNC -HPy HPyLong_FromUInt32_t(HPyContext *ctx, uint32_t value) -{ - return WRAP(ctx->ctx_Long_FromUInt32_t((ctx), (value))); -} - -HPyAPI_FUNC -HPy HPyLong_FromInt64_t(HPyContext *ctx, int64_t v) -{ - return WRAP(ctx->ctx_Long_FromInt64_t((ctx), (v))); -} - -HPyAPI_FUNC -HPy HPyLong_FromUInt64_t(HPyContext *ctx, uint64_t v) -{ - return WRAP(ctx->ctx_Long_FromUInt64_t((ctx), (v))); -} - -HPyAPI_FUNC -HPy HPyLong_FromSize_t(HPyContext *ctx, size_t value) -{ - return WRAP(ctx->ctx_Long_FromSize_t((ctx), (value))); -} - -HPyAPI_FUNC -HPy HPyLong_FromSsize_t(HPyContext *ctx, HPy_ssize_t value) -{ - return WRAP(ctx->ctx_Long_FromSsize_t((ctx), (value))); -} - -HPyAPI_FUNC -int32_t HPyLong_AsInt32_t(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Long_AsInt32_t((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -uint32_t HPyLong_AsUInt32_t(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Long_AsUInt32_t((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -uint32_t HPyLong_AsUInt32_tMask(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Long_AsUInt32_tMask((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -int64_t HPyLong_AsInt64_t(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Long_AsInt64_t((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -uint64_t HPyLong_AsUInt64_t(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Long_AsUInt64_t((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -uint64_t HPyLong_AsUInt64_tMask(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Long_AsUInt64_tMask((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -size_t HPyLong_AsSize_t(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Long_AsSize_t((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -HPy_ssize_t HPyLong_AsSsize_t(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Long_AsSsize_t((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -void *HPyLong_AsVoidPtr(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Long_AsVoidPtr((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -double HPyLong_AsDouble(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Long_AsDouble((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -HPy HPyFloat_FromDouble(HPyContext *ctx, double v) -{ - return WRAP(ctx->ctx_Float_FromDouble((ctx), (v))); -} - -HPyAPI_FUNC -double HPyFloat_AsDouble(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Float_AsDouble((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -HPy HPyBool_FromBool(HPyContext *ctx, bool v) -{ - return WRAP(ctx->ctx_Bool_FromBool((ctx), (v))); -} - -HPyAPI_FUNC -HPy_ssize_t HPy_Length(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Length((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -int HPyNumber_Check(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Number_Check((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -HPy HPy_Add(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_Add((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_Subtract(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_Subtract((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_Multiply(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_Multiply((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_MatrixMultiply(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_MatrixMultiply((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_FloorDivide(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_FloorDivide((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_TrueDivide(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_TrueDivide((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_Remainder(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_Remainder((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_Divmod(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_Divmod((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_Power(HPyContext *ctx, HPy h1, HPy h2, HPy h3) -{ - return WRAP(ctx->ctx_Power((ctx), UNWRAP(h1), UNWRAP(h2), UNWRAP(h3))); -} - -HPyAPI_FUNC -HPy HPy_Negative(HPyContext *ctx, HPy h1) -{ - return WRAP(ctx->ctx_Negative((ctx), UNWRAP(h1))); -} - -HPyAPI_FUNC -HPy HPy_Positive(HPyContext *ctx, HPy h1) -{ - return WRAP(ctx->ctx_Positive((ctx), UNWRAP(h1))); -} - -HPyAPI_FUNC -HPy HPy_Absolute(HPyContext *ctx, HPy h1) -{ - return WRAP(ctx->ctx_Absolute((ctx), UNWRAP(h1))); -} - -HPyAPI_FUNC -HPy HPy_Invert(HPyContext *ctx, HPy h1) -{ - return WRAP(ctx->ctx_Invert((ctx), UNWRAP(h1))); -} - -HPyAPI_FUNC -HPy HPy_Lshift(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_Lshift((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_Rshift(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_Rshift((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_And(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_And((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_Xor(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_Xor((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_Or(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_Or((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_Index(HPyContext *ctx, HPy h1) -{ - return WRAP(ctx->ctx_Index((ctx), UNWRAP(h1))); -} - -HPyAPI_FUNC -HPy HPy_Long(HPyContext *ctx, HPy h1) -{ - return WRAP(ctx->ctx_Long((ctx), UNWRAP(h1))); -} - -HPyAPI_FUNC -HPy HPy_Float(HPyContext *ctx, HPy h1) -{ - return WRAP(ctx->ctx_Float((ctx), UNWRAP(h1))); -} - -HPyAPI_FUNC -HPy HPy_InPlaceAdd(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_InPlaceAdd((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_InPlaceSubtract(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_InPlaceSubtract((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_InPlaceMultiply(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_InPlaceMultiply((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_InPlaceMatrixMultiply(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_InPlaceMatrixMultiply((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_InPlaceFloorDivide(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_InPlaceFloorDivide((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_InPlaceTrueDivide(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_InPlaceTrueDivide((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_InPlaceRemainder(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_InPlaceRemainder((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_InPlacePower(HPyContext *ctx, HPy h1, HPy h2, HPy h3) -{ - return WRAP(ctx->ctx_InPlacePower((ctx), UNWRAP(h1), UNWRAP(h2), UNWRAP(h3))); -} - -HPyAPI_FUNC -HPy HPy_InPlaceLshift(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_InPlaceLshift((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_InPlaceRshift(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_InPlaceRshift((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_InPlaceAnd(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_InPlaceAnd((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_InPlaceXor(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_InPlaceXor((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -HPy HPy_InPlaceOr(HPyContext *ctx, HPy h1, HPy h2) -{ - return WRAP(ctx->ctx_InPlaceOr((ctx), UNWRAP(h1), UNWRAP(h2))); -} - -HPyAPI_FUNC -int HPyCallable_Check(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Callable_Check((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -HPy HPy_CallTupleDict(HPyContext *ctx, HPy callable, HPy args, HPy kw) -{ - return WRAP(ctx->ctx_CallTupleDict((ctx), UNWRAP(callable), UNWRAP(args), UNWRAP(kw))); -} - -HPyAPI_FUNC -HPy HPy_Call(HPyContext *ctx, HPy callable, const HPy *args, size_t nargs, HPy kwnames) -{ - return WRAP(ctx->ctx_Call((ctx), UNWRAP(callable), (args), (nargs), UNWRAP(kwnames))); -} - -HPyAPI_FUNC -HPy HPy_CallMethod(HPyContext *ctx, HPy name, const HPy *args, size_t nargs, HPy kwnames) -{ - return WRAP(ctx->ctx_CallMethod((ctx), UNWRAP(name), (args), (nargs), UNWRAP(kwnames))); -} - -HPyAPI_FUNC -HPy HPyErr_SetString(HPyContext *ctx, HPy h_type, const char *utf8_message) -{ - ctx->ctx_Err_SetString((ctx), UNWRAP(h_type), (utf8_message)); -return HPy_NULL; -} - -HPyAPI_FUNC -HPy HPyErr_SetObject(HPyContext *ctx, HPy h_type, HPy h_value) -{ - ctx->ctx_Err_SetObject((ctx), UNWRAP(h_type), UNWRAP(h_value)); -return HPy_NULL; -} - -HPyAPI_FUNC -HPy HPyErr_SetFromErrnoWithFilename(HPyContext *ctx, HPy h_type, const char *filename_fsencoded) -{ - return WRAP(ctx->ctx_Err_SetFromErrnoWithFilename((ctx), UNWRAP(h_type), (filename_fsencoded))); -} - -HPyAPI_FUNC -HPy HPyErr_SetFromErrnoWithFilenameObjects(HPyContext *ctx, HPy h_type, HPy filename1, HPy filename2) -{ - ctx->ctx_Err_SetFromErrnoWithFilenameObjects((ctx), UNWRAP(h_type), UNWRAP(filename1), UNWRAP(filename2)); -return HPy_NULL; -} - -HPyAPI_FUNC -int HPyErr_Occurred(HPyContext *ctx) -{ - return ctx->ctx_Err_Occurred((ctx)); -} - -HPyAPI_FUNC -int HPyErr_ExceptionMatches(HPyContext *ctx, HPy exc) -{ - return ctx->ctx_Err_ExceptionMatches((ctx), UNWRAP(exc)); -} - -HPyAPI_FUNC -HPy HPyErr_NoMemory(HPyContext *ctx) -{ - ctx->ctx_Err_NoMemory((ctx)); -return HPy_NULL; -} - -HPyAPI_FUNC -void HPyErr_Clear(HPyContext *ctx) -{ - ctx->ctx_Err_Clear((ctx)); -} - -HPyAPI_FUNC -HPy HPyErr_NewException(HPyContext *ctx, const char *utf8_name, HPy base, HPy dict) -{ - return WRAP(ctx->ctx_Err_NewException((ctx), (utf8_name), UNWRAP(base), UNWRAP(dict))); -} - -HPyAPI_FUNC -HPy HPyErr_NewExceptionWithDoc(HPyContext *ctx, const char *utf8_name, const char *utf8_doc, HPy base, HPy dict) -{ - return WRAP(ctx->ctx_Err_NewExceptionWithDoc((ctx), (utf8_name), (utf8_doc), UNWRAP(base), UNWRAP(dict))); -} - -HPyAPI_FUNC -int HPyErr_WarnEx(HPyContext *ctx, HPy category, const char *utf8_message, HPy_ssize_t stack_level) -{ - return ctx->ctx_Err_WarnEx((ctx), UNWRAP(category), (utf8_message), (stack_level)); -} - -HPyAPI_FUNC -void HPyErr_WriteUnraisable(HPyContext *ctx, HPy obj) -{ - ctx->ctx_Err_WriteUnraisable((ctx), UNWRAP(obj)); -} - -HPyAPI_FUNC -int HPy_IsTrue(HPyContext *ctx, HPy h) -{ - return ctx->ctx_IsTrue((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -HPy HPyType_FromSpec(HPyContext *ctx, HPyType_Spec *spec, HPyType_SpecParam *params) -{ - return WRAP(ctx->ctx_Type_FromSpec((ctx), (spec), (params))); -} - -HPyAPI_FUNC -HPy HPyType_GenericNew(HPyContext *ctx, HPy type, const HPy *args, HPy_ssize_t nargs, HPy kw) -{ - return WRAP(ctx->ctx_Type_GenericNew((ctx), UNWRAP(type), (args), (nargs), UNWRAP(kw))); -} - -HPyAPI_FUNC -HPy HPy_GetAttr(HPyContext *ctx, HPy obj, HPy name) -{ - return WRAP(ctx->ctx_GetAttr((ctx), UNWRAP(obj), UNWRAP(name))); -} - -HPyAPI_FUNC -HPy HPy_GetAttr_s(HPyContext *ctx, HPy obj, const char *utf8_name) -{ - return WRAP(ctx->ctx_GetAttr_s((ctx), UNWRAP(obj), (utf8_name))); -} - -HPyAPI_FUNC -int HPy_HasAttr(HPyContext *ctx, HPy obj, HPy name) -{ - return ctx->ctx_HasAttr((ctx), UNWRAP(obj), UNWRAP(name)); -} - -HPyAPI_FUNC -int HPy_HasAttr_s(HPyContext *ctx, HPy obj, const char *utf8_name) -{ - return ctx->ctx_HasAttr_s((ctx), UNWRAP(obj), (utf8_name)); -} - -HPyAPI_FUNC -int HPy_SetAttr(HPyContext *ctx, HPy obj, HPy name, HPy value) -{ - return ctx->ctx_SetAttr((ctx), UNWRAP(obj), UNWRAP(name), UNWRAP(value)); -} - -HPyAPI_FUNC -int HPy_SetAttr_s(HPyContext *ctx, HPy obj, const char *utf8_name, HPy value) -{ - return ctx->ctx_SetAttr_s((ctx), UNWRAP(obj), (utf8_name), UNWRAP(value)); -} - -HPyAPI_FUNC -HPy HPy_GetItem(HPyContext *ctx, HPy obj, HPy key) -{ - return WRAP(ctx->ctx_GetItem((ctx), UNWRAP(obj), UNWRAP(key))); -} - -HPyAPI_FUNC -HPy HPy_GetItem_i(HPyContext *ctx, HPy obj, HPy_ssize_t idx) -{ - return WRAP(ctx->ctx_GetItem_i((ctx), UNWRAP(obj), (idx))); -} - -HPyAPI_FUNC -HPy HPy_GetItem_s(HPyContext *ctx, HPy obj, const char *utf8_key) -{ - return WRAP(ctx->ctx_GetItem_s((ctx), UNWRAP(obj), (utf8_key))); -} - -HPyAPI_FUNC -int HPy_Contains(HPyContext *ctx, HPy container, HPy key) -{ - return ctx->ctx_Contains((ctx), UNWRAP(container), UNWRAP(key)); -} - -HPyAPI_FUNC -int HPy_SetItem(HPyContext *ctx, HPy obj, HPy key, HPy value) -{ - return ctx->ctx_SetItem((ctx), UNWRAP(obj), UNWRAP(key), UNWRAP(value)); -} - -HPyAPI_FUNC -int HPy_SetItem_i(HPyContext *ctx, HPy obj, HPy_ssize_t idx, HPy value) -{ - return ctx->ctx_SetItem_i((ctx), UNWRAP(obj), (idx), UNWRAP(value)); -} - -HPyAPI_FUNC -int HPy_SetItem_s(HPyContext *ctx, HPy obj, const char *utf8_key, HPy value) -{ - return ctx->ctx_SetItem_s((ctx), UNWRAP(obj), (utf8_key), UNWRAP(value)); -} - -HPyAPI_FUNC -int HPy_DelItem(HPyContext *ctx, HPy obj, HPy key) -{ - return ctx->ctx_DelItem((ctx), UNWRAP(obj), UNWRAP(key)); -} - -HPyAPI_FUNC -int HPy_DelItem_i(HPyContext *ctx, HPy obj, HPy_ssize_t idx) -{ - return ctx->ctx_DelItem_i((ctx), UNWRAP(obj), (idx)); -} - -HPyAPI_FUNC -int HPy_DelItem_s(HPyContext *ctx, HPy obj, const char *utf8_key) -{ - return ctx->ctx_DelItem_s((ctx), UNWRAP(obj), (utf8_key)); -} - -HPyAPI_FUNC -HPy HPy_Type(HPyContext *ctx, HPy obj) -{ - return WRAP(ctx->ctx_Type((ctx), UNWRAP(obj))); -} - -HPyAPI_FUNC -int HPy_TypeCheck(HPyContext *ctx, HPy obj, HPy type) -{ - return ctx->ctx_TypeCheck((ctx), UNWRAP(obj), UNWRAP(type)); -} - -HPyAPI_FUNC -const char *HPyType_GetName(HPyContext *ctx, HPy type) -{ - return ctx->ctx_Type_GetName((ctx), UNWRAP(type)); -} - -HPyAPI_FUNC -int HPyType_IsSubtype(HPyContext *ctx, HPy sub, HPy type) -{ - return ctx->ctx_Type_IsSubtype((ctx), UNWRAP(sub), UNWRAP(type)); -} - -HPyAPI_FUNC -int HPy_Is(HPyContext *ctx, HPy obj, HPy other) -{ - return ctx->ctx_Is((ctx), UNWRAP(obj), UNWRAP(other)); -} - -HPyAPI_FUNC -void *_HPy_AsStruct_Object(HPyContext *ctx, HPy h) -{ - return ctx->ctx_AsStruct_Object((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -void *_HPy_AsStruct_Legacy(HPyContext *ctx, HPy h) -{ - return ctx->ctx_AsStruct_Legacy((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -void *_HPy_AsStruct_Type(HPyContext *ctx, HPy h) -{ - return ctx->ctx_AsStruct_Type((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -void *_HPy_AsStruct_Long(HPyContext *ctx, HPy h) -{ - return ctx->ctx_AsStruct_Long((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -void *_HPy_AsStruct_Float(HPyContext *ctx, HPy h) -{ - return ctx->ctx_AsStruct_Float((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -void *_HPy_AsStruct_Unicode(HPyContext *ctx, HPy h) -{ - return ctx->ctx_AsStruct_Unicode((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -void *_HPy_AsStruct_Tuple(HPyContext *ctx, HPy h) -{ - return ctx->ctx_AsStruct_Tuple((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -void *_HPy_AsStruct_List(HPyContext *ctx, HPy h) -{ - return ctx->ctx_AsStruct_List((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -HPyType_BuiltinShape _HPyType_GetBuiltinShape(HPyContext *ctx, HPy h_type) -{ - return ctx->ctx_Type_GetBuiltinShape((ctx), UNWRAP(h_type)); -} - -HPyAPI_FUNC -HPy HPy_Repr(HPyContext *ctx, HPy obj) -{ - return WRAP(ctx->ctx_Repr((ctx), UNWRAP(obj))); -} - -HPyAPI_FUNC -HPy HPy_Str(HPyContext *ctx, HPy obj) -{ - return WRAP(ctx->ctx_Str((ctx), UNWRAP(obj))); -} - -HPyAPI_FUNC -HPy HPy_ASCII(HPyContext *ctx, HPy obj) -{ - return WRAP(ctx->ctx_ASCII((ctx), UNWRAP(obj))); -} - -HPyAPI_FUNC -HPy HPy_Bytes(HPyContext *ctx, HPy obj) -{ - return WRAP(ctx->ctx_Bytes((ctx), UNWRAP(obj))); -} - -HPyAPI_FUNC -HPy HPy_RichCompare(HPyContext *ctx, HPy v, HPy w, int op) -{ - return WRAP(ctx->ctx_RichCompare((ctx), UNWRAP(v), UNWRAP(w), (op))); -} - -HPyAPI_FUNC -int HPy_RichCompareBool(HPyContext *ctx, HPy v, HPy w, int op) -{ - return ctx->ctx_RichCompareBool((ctx), UNWRAP(v), UNWRAP(w), (op)); -} - -HPyAPI_FUNC -HPy_hash_t HPy_Hash(HPyContext *ctx, HPy obj) -{ - return ctx->ctx_Hash((ctx), UNWRAP(obj)); -} - -HPyAPI_FUNC -int HPyBytes_Check(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Bytes_Check((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -HPy_ssize_t HPyBytes_Size(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Bytes_Size((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -HPy_ssize_t HPyBytes_GET_SIZE(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Bytes_GET_SIZE((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -const char *HPyBytes_AsString(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Bytes_AsString((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -const char *HPyBytes_AS_STRING(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Bytes_AS_STRING((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -HPy HPyBytes_FromString(HPyContext *ctx, const char *bytes) -{ - return WRAP(ctx->ctx_Bytes_FromString((ctx), (bytes))); -} - -HPyAPI_FUNC -HPy HPyBytes_FromStringAndSize(HPyContext *ctx, const char *bytes, HPy_ssize_t len) -{ - return WRAP(ctx->ctx_Bytes_FromStringAndSize((ctx), (bytes), (len))); -} - -HPyAPI_FUNC -HPy HPyUnicode_FromString(HPyContext *ctx, const char *utf8) -{ - return WRAP(ctx->ctx_Unicode_FromString((ctx), (utf8))); -} - -HPyAPI_FUNC -int HPyUnicode_Check(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Unicode_Check((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -HPy HPyUnicode_AsASCIIString(HPyContext *ctx, HPy h) -{ - return WRAP(ctx->ctx_Unicode_AsASCIIString((ctx), UNWRAP(h))); -} - -HPyAPI_FUNC -HPy HPyUnicode_AsLatin1String(HPyContext *ctx, HPy h) -{ - return WRAP(ctx->ctx_Unicode_AsLatin1String((ctx), UNWRAP(h))); -} - -HPyAPI_FUNC -HPy HPyUnicode_AsUTF8String(HPyContext *ctx, HPy h) -{ - return WRAP(ctx->ctx_Unicode_AsUTF8String((ctx), UNWRAP(h))); -} - -HPyAPI_FUNC -const char *HPyUnicode_AsUTF8AndSize(HPyContext *ctx, HPy h, HPy_ssize_t *size) -{ - return ctx->ctx_Unicode_AsUTF8AndSize((ctx), UNWRAP(h), (size)); -} - -HPyAPI_FUNC -HPy HPyUnicode_FromWideChar(HPyContext *ctx, const wchar_t *w, HPy_ssize_t size) -{ - return WRAP(ctx->ctx_Unicode_FromWideChar((ctx), (w), (size))); -} - -HPyAPI_FUNC -HPy HPyUnicode_DecodeFSDefault(HPyContext *ctx, const char *v) -{ - return WRAP(ctx->ctx_Unicode_DecodeFSDefault((ctx), (v))); -} - -HPyAPI_FUNC -HPy HPyUnicode_DecodeFSDefaultAndSize(HPyContext *ctx, const char *v, HPy_ssize_t size) -{ - return WRAP(ctx->ctx_Unicode_DecodeFSDefaultAndSize((ctx), (v), (size))); -} - -HPyAPI_FUNC -HPy HPyUnicode_EncodeFSDefault(HPyContext *ctx, HPy h) -{ - return WRAP(ctx->ctx_Unicode_EncodeFSDefault((ctx), UNWRAP(h))); -} - -HPyAPI_FUNC -HPy_UCS4 HPyUnicode_ReadChar(HPyContext *ctx, HPy h, HPy_ssize_t index) -{ - return ctx->ctx_Unicode_ReadChar((ctx), UNWRAP(h), (index)); -} - -HPyAPI_FUNC -HPy HPyUnicode_DecodeASCII(HPyContext *ctx, const char *ascii, HPy_ssize_t size, const char *errors) -{ - return WRAP(ctx->ctx_Unicode_DecodeASCII((ctx), (ascii), (size), (errors))); -} - -HPyAPI_FUNC -HPy HPyUnicode_DecodeLatin1(HPyContext *ctx, const char *latin1, HPy_ssize_t size, const char *errors) -{ - return WRAP(ctx->ctx_Unicode_DecodeLatin1((ctx), (latin1), (size), (errors))); -} - -HPyAPI_FUNC -HPy HPyUnicode_FromEncodedObject(HPyContext *ctx, HPy obj, const char *encoding, const char *errors) -{ - return WRAP(ctx->ctx_Unicode_FromEncodedObject((ctx), UNWRAP(obj), (encoding), (errors))); -} - -HPyAPI_FUNC -HPy HPyUnicode_Substring(HPyContext *ctx, HPy str, HPy_ssize_t start, HPy_ssize_t end) -{ - return WRAP(ctx->ctx_Unicode_Substring((ctx), UNWRAP(str), (start), (end))); -} - -HPyAPI_FUNC -int HPyList_Check(HPyContext *ctx, HPy h) -{ - return ctx->ctx_List_Check((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -HPy HPyList_New(HPyContext *ctx, HPy_ssize_t len) -{ - return WRAP(ctx->ctx_List_New((ctx), (len))); -} - -HPyAPI_FUNC -int HPyList_Append(HPyContext *ctx, HPy h_list, HPy h_item) -{ - return ctx->ctx_List_Append((ctx), UNWRAP(h_list), UNWRAP(h_item)); -} - -HPyAPI_FUNC -int HPyDict_Check(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Dict_Check((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -HPy HPyDict_New(HPyContext *ctx) -{ - return WRAP(ctx->ctx_Dict_New((ctx))); -} - -HPyAPI_FUNC -HPy HPyDict_Keys(HPyContext *ctx, HPy h) -{ - return WRAP(ctx->ctx_Dict_Keys((ctx), UNWRAP(h))); -} - -HPyAPI_FUNC -HPy HPyDict_Copy(HPyContext *ctx, HPy h) -{ - return WRAP(ctx->ctx_Dict_Copy((ctx), UNWRAP(h))); -} - -HPyAPI_FUNC -int HPyTuple_Check(HPyContext *ctx, HPy h) -{ - return ctx->ctx_Tuple_Check((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -HPy HPyTuple_FromArray(HPyContext *ctx, HPy items[], HPy_ssize_t n) -{ - return WRAP(ctx->ctx_Tuple_FromArray((ctx), (items), (n))); -} - -HPyAPI_FUNC -int HPySlice_Unpack(HPyContext *ctx, HPy slice, HPy_ssize_t *start, HPy_ssize_t *stop, HPy_ssize_t *step) -{ - return ctx->ctx_Slice_Unpack((ctx), UNWRAP(slice), (start), (stop), (step)); -} - -HPyAPI_FUNC -HPy HPyImport_ImportModule(HPyContext *ctx, const char *utf8_name) -{ - return WRAP(ctx->ctx_Import_ImportModule((ctx), (utf8_name))); -} - -HPyAPI_FUNC -HPy HPyCapsule_New(HPyContext *ctx, void *pointer, const char *utf8_name, HPyCapsule_Destructor *destructor) -{ - return WRAP(ctx->ctx_Capsule_New((ctx), (pointer), (utf8_name), (destructor))); -} - -HPyAPI_FUNC -void *HPyCapsule_Get(HPyContext *ctx, HPy capsule, _HPyCapsule_key key, const char *utf8_name) -{ - return ctx->ctx_Capsule_Get((ctx), UNWRAP(capsule), (key), (utf8_name)); -} - -HPyAPI_FUNC -int HPyCapsule_IsValid(HPyContext *ctx, HPy capsule, const char *utf8_name) -{ - return ctx->ctx_Capsule_IsValid((ctx), UNWRAP(capsule), (utf8_name)); -} - -HPyAPI_FUNC -int HPyCapsule_Set(HPyContext *ctx, HPy capsule, _HPyCapsule_key key, void *value) -{ - return ctx->ctx_Capsule_Set((ctx), UNWRAP(capsule), (key), (value)); -} - -HPyAPI_FUNC -HPy HPy_FromPyObject(HPyContext *ctx, cpy_PyObject *obj) -{ - return WRAP(ctx->ctx_FromPyObject((ctx), (obj))); -} - -HPyAPI_FUNC -cpy_PyObject *HPy_AsPyObject(HPyContext *ctx, HPy h) -{ - return ctx->ctx_AsPyObject((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -void _HPy_CallRealFunctionFromTrampoline(HPyContext *ctx, HPyFunc_Signature sig, HPyCFunction func, void *args) -{ - ctx->ctx_CallRealFunctionFromTrampoline((ctx), (sig), (func), (args)); -} - -HPyAPI_FUNC -HPyListBuilder HPyListBuilder_New(HPyContext *ctx, HPy_ssize_t size) -{ - return WRAP_LIST_BUILDER(ctx->ctx_ListBuilder_New((ctx), (size))); -} - -HPyAPI_FUNC -void HPyListBuilder_Set(HPyContext *ctx, HPyListBuilder builder, HPy_ssize_t index, HPy h_item) -{ - ctx->ctx_ListBuilder_Set((ctx), UNWRAP_LIST_BUILDER(builder), (index), UNWRAP(h_item)); -} - -HPyAPI_FUNC -HPy HPyListBuilder_Build(HPyContext *ctx, HPyListBuilder builder) -{ - return WRAP(ctx->ctx_ListBuilder_Build((ctx), UNWRAP_LIST_BUILDER(builder))); -} - -HPyAPI_FUNC -void HPyListBuilder_Cancel(HPyContext *ctx, HPyListBuilder builder) -{ - ctx->ctx_ListBuilder_Cancel((ctx), UNWRAP_LIST_BUILDER(builder)); -} - -HPyAPI_FUNC -HPyTupleBuilder HPyTupleBuilder_New(HPyContext *ctx, HPy_ssize_t size) -{ - return WRAP_TUPLE_BUILDER(ctx->ctx_TupleBuilder_New((ctx), (size))); -} - -HPyAPI_FUNC -void HPyTupleBuilder_Set(HPyContext *ctx, HPyTupleBuilder builder, HPy_ssize_t index, HPy h_item) -{ - ctx->ctx_TupleBuilder_Set((ctx), UNWRAP_TUPLE_BUILDER(builder), (index), UNWRAP(h_item)); -} - -HPyAPI_FUNC -HPy HPyTupleBuilder_Build(HPyContext *ctx, HPyTupleBuilder builder) -{ - return WRAP(ctx->ctx_TupleBuilder_Build((ctx), UNWRAP_TUPLE_BUILDER(builder))); -} - -HPyAPI_FUNC -void HPyTupleBuilder_Cancel(HPyContext *ctx, HPyTupleBuilder builder) -{ - ctx->ctx_TupleBuilder_Cancel((ctx), UNWRAP_TUPLE_BUILDER(builder)); -} - -HPyAPI_FUNC -HPyTracker HPyTracker_New(HPyContext *ctx, HPy_ssize_t size) -{ - return WRAP_TRACKER(ctx->ctx_Tracker_New((ctx), (size))); -} - -HPyAPI_FUNC -int HPyTracker_Add(HPyContext *ctx, HPyTracker ht, HPy h) -{ - return ctx->ctx_Tracker_Add((ctx), UNWRAP_TRACKER(ht), UNWRAP(h)); -} - -HPyAPI_FUNC -void HPyTracker_ForgetAll(HPyContext *ctx, HPyTracker ht) -{ - ctx->ctx_Tracker_ForgetAll((ctx), UNWRAP_TRACKER(ht)); -} - -HPyAPI_FUNC -void HPyTracker_Close(HPyContext *ctx, HPyTracker ht) -{ - ctx->ctx_Tracker_Close((ctx), UNWRAP_TRACKER(ht)); -} - -HPyAPI_FUNC -void HPyField_Store(HPyContext *ctx, HPy target_object, HPyField *target_field, HPy h) -{ - ctx->ctx_Field_Store((ctx), UNWRAP(target_object), (target_field), UNWRAP(h)); -} - -HPyAPI_FUNC -HPy HPyField_Load(HPyContext *ctx, HPy source_object, HPyField source_field) -{ - return WRAP(ctx->ctx_Field_Load((ctx), UNWRAP(source_object), UNWRAP_FIELD(source_field))); -} - -HPyAPI_FUNC -void HPy_ReenterPythonExecution(HPyContext *ctx, HPyThreadState state) -{ - ctx->ctx_ReenterPythonExecution((ctx), UNWRAP_THREADSTATE(state)); -} - -HPyAPI_FUNC -HPyThreadState HPy_LeavePythonExecution(HPyContext *ctx) -{ - return WRAP_THREADSTATE(ctx->ctx_LeavePythonExecution((ctx))); -} - -HPyAPI_FUNC -void HPyGlobal_Store(HPyContext *ctx, HPyGlobal *global, HPy h) -{ - ctx->ctx_Global_Store((ctx), (global), UNWRAP(h)); -} - -HPyAPI_FUNC -HPy HPyGlobal_Load(HPyContext *ctx, HPyGlobal global) -{ - return WRAP(ctx->ctx_Global_Load((ctx), UNWRAP_GLOBAL(global))); -} - -HPyAPI_FUNC -void _HPy_Dump(HPyContext *ctx, HPy h) -{ - ctx->ctx_Dump((ctx), UNWRAP(h)); -} - -HPyAPI_FUNC -HPy HPy_Compile_s(HPyContext *ctx, const char *utf8_source, const char *utf8_filename, HPy_SourceKind kind) -{ - return WRAP(ctx->ctx_Compile_s((ctx), (utf8_source), (utf8_filename), UNWRAP_SOURCE_KIND(kind))); -} - -HPyAPI_FUNC -HPy HPy_EvalCode(HPyContext *ctx, HPy code, HPy globals, HPy locals) -{ - return WRAP(ctx->ctx_EvalCode((ctx), UNWRAP(code), UNWRAP(globals), UNWRAP(locals))); -} - -HPyAPI_FUNC -HPy HPyContextVar_New(HPyContext *ctx, const char *name, HPy default_value) -{ - return WRAP(ctx->ctx_ContextVar_New((ctx), (name), UNWRAP(default_value))); -} - -HPyAPI_FUNC -int32_t HPyContextVar_Get(HPyContext *ctx, HPy context_var, HPy default_value, HPy *result) -{ - return ctx->ctx_ContextVar_Get((ctx), UNWRAP(context_var), UNWRAP(default_value), (result)); -} - -HPyAPI_FUNC -HPy HPyContextVar_Set(HPyContext *ctx, HPy context_var, HPy value) -{ - return WRAP(ctx->ctx_ContextVar_Set((ctx), UNWRAP(context_var), UNWRAP(value))); -} - -HPyAPI_FUNC -int HPy_SetCallFunction(HPyContext *ctx, HPy h, HPyCallFunction *func) -{ - return ctx->ctx_SetCallFunction((ctx), UNWRAP(h), (func)); -} - diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/universal/hpyfunc_trampolines.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/universal/hpyfunc_trampolines.h deleted file mode 100644 index f06419b5d8..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/universal/hpyfunc_trampolines.h +++ /dev/null @@ -1,201 +0,0 @@ -/* MIT License - * - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef HPY_UNIVERSAL_HPYFUNC_TRAMPOLINES_H -#define HPY_UNIVERSAL_HPYFUNC_TRAMPOLINES_H - -/* This file should be autogenerated */ - -typedef struct { - cpy_PyObject *self; - cpy_PyObject *const *args; - HPy_ssize_t nargs; - cpy_PyObject *result; -} _HPyFunc_args_VARARGS; - -typedef struct { - cpy_PyObject *self; - cpy_PyObject *const *args; - /* We also use HPyFunc_KEYWORDS for HPy_tp_call which will be called as - vectorcall function from CPython. Therefore, 'nargsf' may also have bit - 'PY_VECTORCALL_ARGUMENTS_OFFSET' set. */ - size_t nargsf; - cpy_PyObject *kwnames; - cpy_PyObject *result; -} _HPyFunc_args_KEYWORDS; - -typedef struct { - cpy_PyObject *self; - cpy_PyObject *args; - cpy_PyObject *kw; - int result; -} _HPyFunc_args_INITPROC; - -typedef struct { - cpy_PyObject *self; - cpy_PyObject *args; - cpy_PyObject *kw; - cpy_PyObject *result; -} _HPyFunc_args_NEWFUNC; - -typedef struct { - cpy_PyObject *arg0; - cpy_PyObject *arg1; - HPy_RichCmpOp arg2; - cpy_PyObject * result; -} _HPyFunc_args_RICHCMPFUNC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_VARARGS(SYM, IMPL) \ - static cpy_PyObject * \ - SYM(cpy_PyObject *self, cpy_PyObject *const *args, HPy_ssize_t nargs) \ - { \ - _HPyFunc_args_VARARGS a = { self, args, nargs }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_VARARGS, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -#define _HPyFunc_TRAMPOLINE_HPyFunc_KEYWORDS(SYM, IMPL) \ - static cpy_PyObject * \ - SYM(cpy_PyObject *self, cpy_PyObject *const *args, size_t nargs, \ - cpy_PyObject *kwnames) \ - { \ - _HPyFunc_args_KEYWORDS a = { self, args, nargs, kwnames }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_KEYWORDS, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -#define _HPyFunc_TRAMPOLINE_HPyFunc_INITPROC(SYM, IMPL) \ - static int \ - SYM(cpy_PyObject *self, cpy_PyObject *args, cpy_PyObject *kw) \ - { \ - _HPyFunc_args_INITPROC a = { self, args, kw }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_INITPROC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -#define _HPyFunc_TRAMPOLINE_HPyFunc_NEWFUNC(SYM, IMPL) \ - static cpy_PyObject * \ - SYM(cpy_PyObject *self, cpy_PyObject *args, cpy_PyObject *kw) \ - { \ - _HPyFunc_args_NEWFUNC a = { self, args, kw }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_NEWFUNC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -/* special case: the HPy_tp_destroy slot doesn't map to any CPython slot. - Instead, it is called from our own tp_dealloc: see also - hpytype_dealloc(). */ -#define _HPyFunc_TRAMPOLINE_HPyFunc_DESTROYFUNC(SYM, IMPL) \ - static void SYM(void) { abort(); } - - -/* this needs to be written manually because HPy has a different type for - "op": HPy_RichCmpOp instead of int */ -#define _HPyFunc_TRAMPOLINE_HPyFunc_RICHCMPFUNC(SYM, IMPL) \ - static cpy_PyObject * \ - SYM(cpy_PyObject *self, cpy_PyObject *obj, int op) \ - { \ - _HPyFunc_args_RICHCMPFUNC a = { self, obj, (HPy_RichCmpOp)op }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_RICHCMPFUNC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *self; - cpy_Py_buffer *view; - int flags; - int result; -} _HPyFunc_args_GETBUFFERPROC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_GETBUFFERPROC(SYM, IMPL) \ - static int SYM(cpy_PyObject *self, cpy_Py_buffer *view, int flags) \ - { \ - _HPyFunc_args_GETBUFFERPROC a = {self, view, flags}; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_GETBUFFERPROC, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -typedef struct { - cpy_PyObject *self; - cpy_Py_buffer *view; -} _HPyFunc_args_RELEASEBUFFERPROC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_RELEASEBUFFERPROC(SYM, IMPL) \ - static void SYM(cpy_PyObject *self, cpy_Py_buffer *view) \ - { \ - _HPyFunc_args_RELEASEBUFFERPROC a = {self, view}; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_RELEASEBUFFERPROC, \ - (HPyCFunction)IMPL, &a); \ - return; \ - } - - -typedef struct { - cpy_PyObject *self; - cpy_visitproc visit; - void *arg; - int result; -} _HPyFunc_args_TRAVERSEPROC; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_TRAVERSEPROC(SYM, IMPL) \ - static int SYM(cpy_PyObject *self, cpy_visitproc visit, void *arg) \ - { \ - _HPyFunc_args_TRAVERSEPROC a = { self, visit, arg }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_TRAVERSEPROC, \ - (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - -#define HPyCapsule_DESTRUCTOR_TRAMPOLINE(SYM, IMPL) \ - static void SYM(cpy_PyObject *capsule) \ - { \ - _HPy_CallRealFunctionFromTrampoline(_ctx_for_trampolines, \ - HPyFunc_CAPSULE_DESTRUCTOR, (HPyCFunction)IMPL, capsule); \ - } - -typedef struct { - cpy_PyObject *spec; - cpy_PyObject *result; -} _HPyFunc_args_MOD_CREATE; - -#define _HPyFunc_TRAMPOLINE_HPyFunc_MOD_CREATE(SYM, IMPL) \ - static cpy_PyObject* SYM(cpy_PyObject *spec, cpy_PyModuleDef *def) \ - { \ - (void) def; /* avoid 'unused' warning */ \ - _HPyFunc_args_UNARYFUNC a = { spec }; \ - _HPy_CallRealFunctionFromTrampoline( \ - _ctx_for_trampolines, HPyFunc_MOD_CREATE, (HPyCFunction)IMPL, &a); \ - return a.result; \ - } - - -#endif // HPY_UNIVERSAL_HPYFUNC_TRAMPOLINES_H diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/universal/misc_trampolines.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/universal/misc_trampolines.h deleted file mode 100644 index 159e3d01a1..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/universal/misc_trampolines.h +++ /dev/null @@ -1,121 +0,0 @@ -/* MIT License - * - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef HPY_MISC_TRAMPOLINES_H -#define HPY_MISC_TRAMPOLINES_H - -#ifdef GRAALVM_PYTHON_LLVM -#define UNWRAP(_h) ((_h)._i) -#define WRAP(_ptr) ((HPy){(_ptr)}) -#else -#define UNWRAP(_h) _h -#define WRAP(_ptr) _ptr -#endif - -static inline HPy _HPy_New(HPyContext *ctx, HPy h_type, void **data) { - /* Performance hack: the autogenerated version of this trampoline would - simply forward data to ctx_New. - - Suppose you call HPy_New this way: - PointObject *point; - HPy h = HPy_New(ctx, cls, &point); - - If you pass "data" to ctx->New, the C compiler must assume that anybody - could write a different value at any time into this local variable - because a pointer to it escaped. With this hack, it's no longer the - case: what escaped is the address of data_result instead and that local - variable disappears since this function is likely inlined. - - See https://github.com/pyhandle/hpy/pull/22#pullrequestreview-413365845 - */ - void *data_result; - HPy h = WRAP(ctx->ctx_New(ctx, UNWRAP(h_type), &data_result)); - *data = data_result; - return h; -} - -static inline _HPy_NO_RETURN void -HPy_FatalError(HPyContext *ctx, const char *message) { - ctx->ctx_FatalError(ctx, message); - /* note: the following abort() is unreachable, but needed because the - _HPy_NO_RETURN doesn't seem to be sufficient. I think that what - occurs is that this function is inlined, after which gcc forgets - that it couldn't return. Having abort() inlined fixes that. */ - abort(); -} - -static inline void * -HPyCapsule_GetPointer(HPyContext *ctx, HPy capsule, const char *name) -{ - return ctx->ctx_Capsule_Get( - ctx, UNWRAP(capsule), HPyCapsule_key_Pointer, name); -} - -static inline const char * -HPyCapsule_GetName(HPyContext *ctx, HPy capsule) -{ - return (const char *) ctx->ctx_Capsule_Get( - ctx, UNWRAP(capsule), HPyCapsule_key_Name, NULL); -} - -static inline void * -HPyCapsule_GetContext(HPyContext *ctx, HPy capsule) -{ - return ctx->ctx_Capsule_Get( - ctx, UNWRAP(capsule), HPyCapsule_key_Context, NULL); -} - -static inline int -HPyCapsule_SetPointer(HPyContext *ctx, HPy capsule, void *pointer) -{ - return ctx->ctx_Capsule_Set( - ctx, UNWRAP(capsule), HPyCapsule_key_Pointer, pointer); -} - -static inline int -HPyCapsule_SetName(HPyContext *ctx, HPy capsule, const char *name) -{ - return ctx->ctx_Capsule_Set( - ctx, UNWRAP(capsule), HPyCapsule_key_Name, (void *) name); -} - -static inline int -HPyCapsule_SetContext(HPyContext *ctx, HPy capsule, void *context) -{ - return ctx->ctx_Capsule_Set( - ctx, UNWRAP(capsule), HPyCapsule_key_Context, context); -} - -static inline int -HPyCapsule_SetDestructor(HPyContext *ctx, HPy capsule, - HPyCapsule_Destructor *destructor) -{ - return ctx->ctx_Capsule_Set( - ctx, UNWRAP(capsule), HPyCapsule_key_Destructor, (void *) destructor); -} - -#undef UNWRAP -#undef WRAP - -#endif /* HPY_MISC_TRAMPOLINES_H */ diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/version.h b/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/version.h deleted file mode 100644 index eb57b14570..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/include/hpy/version.h +++ /dev/null @@ -1,27 +0,0 @@ -/* MIT License - * - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -// automatically generated by setup.py:get_scm_config() -#define HPY_VERSION "0.9.0" -#define HPY_GIT_REVISION "f6114734" diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/src/autogen_c_access.h b/graalpython/com.oracle.graal.python.hpy.llvm/src/autogen_c_access.h deleted file mode 100644 index f345a3209b..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/src/autogen_c_access.h +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - - -/* - DO NOT EDIT THIS FILE! - - This file is automatically generated by hpy.tools.autogen.graalpy.autogen_c_access - See also hpy.tools.autogen and hpy/tools/public_api.h - - Run this to regenerate: - make autogen - -*/ - -#ifndef _AUTOGEN_C_ACCESS_H -#define _AUTOGEN_C_ACCESS_H -#include - -#include "Python.h" -#include "structmember.h" - -static int fill_c_type_sizes(int32_t *ctype_sizes) -{ - ctype_sizes[0] = (int32_t) sizeof(HPyContext*); - ctype_sizes[1] = (int32_t) 0; - ctype_sizes[2] = (int32_t) sizeof(void*); - ctype_sizes[3] = (int32_t) sizeof(void**); - ctype_sizes[4] = (int32_t) sizeof(bool); - ctype_sizes[5] = (int32_t) sizeof(int); - ctype_sizes[6] = (int32_t) sizeof(unsigned int); - ctype_sizes[7] = (int32_t) sizeof(long); - ctype_sizes[8] = (int32_t) sizeof(unsigned long); - ctype_sizes[9] = (int32_t) sizeof(int8_t); - ctype_sizes[10] = (int32_t) sizeof(uint8_t); - ctype_sizes[11] = (int32_t) sizeof(int16_t); - ctype_sizes[12] = (int32_t) sizeof(uint16_t); - ctype_sizes[13] = (int32_t) sizeof(int32_t); - ctype_sizes[14] = (int32_t) sizeof(uint32_t); - ctype_sizes[15] = (int32_t) sizeof(float); - ctype_sizes[16] = (int32_t) sizeof(double); - ctype_sizes[17] = (int32_t) sizeof(int64_t); - ctype_sizes[18] = (int32_t) sizeof(uint64_t); - ctype_sizes[19] = (int32_t) sizeof(HPy); - ctype_sizes[20] = (int32_t) sizeof(HPy*); - ctype_sizes[21] = (int32_t) sizeof(const HPy*); - ctype_sizes[22] = (int32_t) sizeof(wchar_t*); - ctype_sizes[23] = (int32_t) sizeof(const wchar_t*); - ctype_sizes[24] = (int32_t) sizeof(char*); - ctype_sizes[25] = (int32_t) sizeof(const char*); - ctype_sizes[26] = (int32_t) sizeof(void*); - ctype_sizes[27] = (int32_t) sizeof(void**); - ctype_sizes[28] = (int32_t) sizeof(HPyTracker); - ctype_sizes[29] = (int32_t) sizeof(size_t); - ctype_sizes[30] = (int32_t) sizeof(HPy_ssize_t); - ctype_sizes[31] = (int32_t) sizeof(HPy_ssize_t*); - ctype_sizes[32] = (int32_t) sizeof(HPy_hash_t); - ctype_sizes[33] = (int32_t) sizeof(HPy_UCS4); - ctype_sizes[34] = (int32_t) sizeof(HPyTupleBuilder); - ctype_sizes[35] = (int32_t) sizeof(HPyListBuilder); - ctype_sizes[36] = (int32_t) sizeof(cpy_PyObject*); - ctype_sizes[37] = (int32_t) sizeof(cpy_PyMethodDef*); - ctype_sizes[38] = (int32_t) sizeof(HPyModuleDef*); - ctype_sizes[39] = (int32_t) sizeof(HPyType_Spec*); - ctype_sizes[40] = (int32_t) sizeof(HPyType_SpecParam); - ctype_sizes[41] = (int32_t) sizeof(HPyType_SpecParam*); - ctype_sizes[42] = (int32_t) sizeof(HPyDef*); - ctype_sizes[43] = (int32_t) sizeof(HPyThreadState); - ctype_sizes[44] = (int32_t) sizeof(HPyField); - ctype_sizes[45] = (int32_t) sizeof(HPyField*); - ctype_sizes[46] = (int32_t) sizeof(HPyGlobal); - ctype_sizes[47] = (int32_t) sizeof(HPyGlobal*); - ctype_sizes[48] = (int32_t) sizeof(HPyCapsule_Destructor*); - ctype_sizes[49] = (int32_t) sizeof(_HPyCapsule_key); - ctype_sizes[50] = (int32_t) sizeof(HPyType_BuiltinShape); - ctype_sizes[51] = (int32_t) sizeof(HPy_SourceKind); - ctype_sizes[52] = (int32_t) sizeof(HPyCallFunction*); - ctype_sizes[53] = (int32_t) sizeof(PyType_Slot); - ctype_sizes[54] = (int32_t) sizeof(PyType_Slot*); - ctype_sizes[55] = (int32_t) sizeof(HPyFunc_Signature); - ctype_sizes[56] = (int32_t) sizeof(HPyMember_FieldType); - ctype_sizes[57] = (int32_t) sizeof(HPySlot_Slot); - ctype_sizes[58] = (int32_t) sizeof(PyMemberDef); - ctype_sizes[59] = (int32_t) sizeof(HPy_buffer); - ctype_sizes[60] = (int32_t) sizeof(PyGetSetDef); - return 0; -}; - -static int fill_c_field_offsets(int32_t *cfield_offsets) -{ - cfield_offsets[0] = (int32_t) offsetof(HPyType_SpecParam, kind); - cfield_offsets[1] = (int32_t) offsetof(HPyType_SpecParam, object); - cfield_offsets[2] = (int32_t) offsetof(HPyType_Spec, name); - cfield_offsets[3] = (int32_t) offsetof(HPyType_Spec, basicsize); - cfield_offsets[4] = (int32_t) offsetof(HPyType_Spec, itemsize); - cfield_offsets[5] = (int32_t) offsetof(HPyType_Spec, flags); - cfield_offsets[6] = (int32_t) offsetof(HPyType_Spec, builtin_shape); - cfield_offsets[7] = (int32_t) offsetof(HPyType_Spec, legacy_slots); - cfield_offsets[8] = (int32_t) offsetof(HPyType_Spec, defines); - cfield_offsets[9] = (int32_t) offsetof(HPyType_Spec, doc); - cfield_offsets[10] = (int32_t) offsetof(HPyDef, kind); - cfield_offsets[11] = (int32_t) offsetof(HPyDef, meth.name); - cfield_offsets[12] = (int32_t) offsetof(HPyDef, meth.impl); - cfield_offsets[13] = (int32_t) offsetof(HPyDef, meth.signature); - cfield_offsets[14] = (int32_t) offsetof(HPyDef, meth.doc); - cfield_offsets[15] = (int32_t) offsetof(HPyDef, member.name); - cfield_offsets[16] = (int32_t) offsetof(HPyDef, member.type); - cfield_offsets[17] = (int32_t) offsetof(HPyDef, member.offset); - cfield_offsets[18] = (int32_t) offsetof(HPyDef, member.readonly); - cfield_offsets[19] = (int32_t) offsetof(HPyDef, member.doc); - cfield_offsets[20] = (int32_t) offsetof(HPyDef, getset.name); - cfield_offsets[21] = (int32_t) offsetof(HPyDef, getset.getter_impl); - cfield_offsets[22] = (int32_t) offsetof(HPyDef, getset.setter_impl); - cfield_offsets[23] = (int32_t) offsetof(HPyDef, getset.doc); - cfield_offsets[24] = (int32_t) offsetof(HPyDef, getset.closure); - cfield_offsets[25] = (int32_t) offsetof(HPyDef, slot.slot); - cfield_offsets[26] = (int32_t) offsetof(HPyDef, slot.impl); - cfield_offsets[27] = (int32_t) offsetof(PyType_Slot, slot); - cfield_offsets[28] = (int32_t) offsetof(PyType_Slot, pfunc); - cfield_offsets[29] = (int32_t) offsetof(HPyCapsule_Destructor, cpy_trampoline); - cfield_offsets[30] = (int32_t) offsetof(HPyCapsule_Destructor, impl); - cfield_offsets[31] = (int32_t) offsetof(HPyCallFunction, impl); - cfield_offsets[32] = (int32_t) offsetof(HPyModuleDef, doc); - cfield_offsets[33] = (int32_t) offsetof(HPyModuleDef, size); - cfield_offsets[34] = (int32_t) offsetof(HPyModuleDef, legacy_methods); - cfield_offsets[35] = (int32_t) offsetof(HPyModuleDef, defines); - cfield_offsets[36] = (int32_t) offsetof(HPyModuleDef, globals); - cfield_offsets[37] = (int32_t) offsetof(PyGetSetDef, name); - cfield_offsets[38] = (int32_t) offsetof(PyGetSetDef, get); - cfield_offsets[39] = (int32_t) offsetof(PyGetSetDef, set); - cfield_offsets[40] = (int32_t) offsetof(PyGetSetDef, doc); - cfield_offsets[41] = (int32_t) offsetof(PyGetSetDef, closure); - cfield_offsets[42] = (int32_t) offsetof(PyMemberDef, name); - cfield_offsets[43] = (int32_t) offsetof(PyMemberDef, type); - cfield_offsets[44] = (int32_t) offsetof(PyMemberDef, offset); - cfield_offsets[45] = (int32_t) offsetof(PyMemberDef, flags); - cfield_offsets[46] = (int32_t) offsetof(PyMemberDef, doc); - cfield_offsets[47] = (int32_t) offsetof(HPy_buffer, buf); - cfield_offsets[48] = (int32_t) offsetof(HPy_buffer, obj); - cfield_offsets[49] = (int32_t) offsetof(HPy_buffer, len); - cfield_offsets[50] = (int32_t) offsetof(HPy_buffer, itemsize); - cfield_offsets[51] = (int32_t) offsetof(HPy_buffer, readonly); - cfield_offsets[52] = (int32_t) offsetof(HPy_buffer, ndim); - cfield_offsets[53] = (int32_t) offsetof(HPy_buffer, format); - cfield_offsets[54] = (int32_t) offsetof(HPy_buffer, shape); - cfield_offsets[55] = (int32_t) offsetof(HPy_buffer, strides); - cfield_offsets[56] = (int32_t) offsetof(HPy_buffer, suboffsets); - cfield_offsets[57] = (int32_t) offsetof(HPy_buffer, internal); - return 0; -}; - -#endif - diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/src/hpy.c b/graalpython/com.oracle.graal.python.hpy.llvm/src/hpy.c deleted file mode 100644 index 6e2e4e92e0..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/src/hpy.c +++ /dev/null @@ -1,1357 +0,0 @@ -/* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -#include "hpy.h" -#include "structmember.h" -#include -#include - -#include -#include -#include - -#include "autogen_c_access.h" - - -#define SRC_CS "utf-8" -#define UNWRAP(_h) ((_h)._i) -#define WRAP(_ptr) ((HPy){(_ptr)}) - -/* References to the managed HPy contexts (Java objects). */ -static HPyContext *g_universal_ctx; - -typedef HPyDef* HPyDefPtr; -typedef PyMemberDef cpy_PyMemberDef; -typedef PyGetSetDef cpy_PyGetSetDef; -typedef PyType_Slot cpy_PyTypeSlot; -typedef void* VoidPtr; - -POLYGLOT_DECLARE_TYPE(VoidPtr); -POLYGLOT_DECLARE_TYPE(HPy) -POLYGLOT_DECLARE_TYPE(HPyContext) -POLYGLOT_DECLARE_TYPE(int8_t) - -int Py_EXPORTED_SYMBOL graal_hpy_init(HPyContext *context, void *initObject, int32_t *c_type_sizes, int32_t *c_field_offsets) { - // save context in global for NFI upcalls - g_universal_ctx = context; - - // register the native type of HPy - polyglot_invoke(initObject, "setHPyContextNativeType", polyglot_HPyContext_typeid()); - polyglot_invoke(initObject, "setHPyNativeType", polyglot_HPy_typeid()); - polyglot_invoke(initObject, "setHPyArrayNativeType", polyglot_array_typeid(polyglot_HPy_typeid(), 0)); - - if (fill_c_type_sizes(c_type_sizes)) { - return 1; - } - if (fill_c_field_offsets(c_field_offsets)) { - return 1; - } - - return 0; -} - -void *graal_hpy_get_element_ptr(void *base, int64_t offset) { - return base + offset; -} - -void* graal_hpy_calloc(size_t count, size_t eltsize) { - return calloc(count, eltsize); -} - -void graal_hpy_free(void *ptr) { - free(ptr); -} - -void* graal_hpy_get_field_i(HPyField *hf) { - return hf->_i; -} - -void graal_hpy_set_field_i(HPyField *hf, void* i) { - hf->_i = i; -} - -void* graal_hpy_get_global_i(HPyGlobal *hg) { - return hg->_i; -} - -void graal_hpy_set_global_i(HPyGlobal *hg, void* i) { - hg->_i = i; -} - -void* graal_hpy_from_string(const char *ptr) { - return polyglot_from_string(ptr, SRC_CS); -} - -int graal_hpy_get_errno() { - return errno; -} - -char *graal_hpy_get_strerror(int i) { - if (i != 0) { - return strerror(i); - } - return "Error"; -} - -uint64_t graal_hpy_strlen(const char *ptr) { - return strlen(ptr); -} - -void* graal_hpy_from_HPy_array(void *arr, uint64_t len) { - /* - * We attach type 'VoidPtr arr[len]' instead of 'HPy arr[len]' because that - * saves the additional read of member '_i' if we would use - */ - return polyglot_from_VoidPtr_array(arr, len); -} - -void* graal_hpy_from_i8_array(void *arr, uint64_t len) { - return polyglot_from_i8_array(arr, len); -} - -/* - * Casts a 'wchar_t*' array to an 'int8_t*' array and also associates the proper length. - * The length is determined using 'wcslen' if 'len == -1'. - */ -int8_t* graal_hpy_i8_from_wchar_array(wchar_t *arr, uint64_t len) { - if (len == -1) { - len = (uint64_t) (wcslen(arr) * sizeof(wchar_t)); - } - return polyglot_from_i8_array((int8_t *) arr, len); -} - -/* - * Transforms a Java handle array to native. - * TODO(fa): This currently uses a workaround because Sulong does not fully - * support passing structs via interop. Therefore, we pretend to have 'void *' - * array and convert to handle using 'HPy_FromVoidP'. - */ -void* graal_hpy_array_to_native(VoidPtr *source, uint64_t len) { - uint64_t i; - HPy *dest = (HPy *)malloc(len*sizeof(HPy)); - for (i=0; i < len; i++) { - dest[i] = HPy_FromVoidP(source[i]); - } - return polyglot_from_HPy_array(dest, len); -} - -HPy_buffer* graal_hpy_buffer_to_native(void* buf, HPy obj, HPy_ssize_t len, HPy_ssize_t item_size, int readonly, int ndim, - int64_t format_ptr, int64_t shape_ptr, int64_t strides_ptr, int64_t suboffsets_ptr, void *internal) { - HPy_buffer *hpy_buffer = (HPy_buffer *) malloc(sizeof(HPy_buffer)); - hpy_buffer->buf = buf; - hpy_buffer->obj = obj; - hpy_buffer->len = len; - hpy_buffer->itemsize = item_size; - hpy_buffer->readonly = readonly; - hpy_buffer->ndim = ndim; - hpy_buffer->format = (char *)format_ptr; - hpy_buffer->shape = (HPy_ssize_t *)shape_ptr; - hpy_buffer->strides = (HPy_ssize_t *)strides_ptr; - hpy_buffer->suboffsets = (HPy_ssize_t *)suboffsets_ptr; - hpy_buffer->internal = internal; - return hpy_buffer; -} - -#define PRIMITIVE_ARRAY_TO_NATIVE(__jtype__, __ctype__, __polyglot_type__, __element_cast__) \ - void* graal_hpy_##__jtype__##_array_to_native(const void* jarray, int64_t len) { \ - int64_t i; \ - int64_t size = len + 1; \ - __ctype__* carr = (__ctype__*) malloc(size * sizeof(__ctype__)); \ - carr[len] = (__ctype__)0; \ - for (i=0; i < len; i++) { \ - carr[i] = __element_cast__(polyglot_get_array_element(jarray, i)); \ - } \ - return polyglot_from_##__polyglot_type__##_array(carr, len); \ - } \ - -PRIMITIVE_ARRAY_TO_NATIVE(byte, int8_t, i8, polyglot_as_i8); -PRIMITIVE_ARRAY_TO_NATIVE(int, int32_t, i32, polyglot_as_i32); -PRIMITIVE_ARRAY_TO_NATIVE(long, int64_t, i64, polyglot_as_i64); -PRIMITIVE_ARRAY_TO_NATIVE(double, double, double, polyglot_as_double); -PRIMITIVE_ARRAY_TO_NATIVE(pointer, VoidPtr, VoidPtr, (VoidPtr)); - -/*****************************************************************************/ -/* getter for reading native members */ -/*****************************************************************************/ - -#define ReadMember(object, offset, T) ((T*)(((char*)object) + offset))[0] - -bool graal_hpy_read_bool(void* object, HPy_ssize_t offset) { - return ReadMember(object, offset, bool); -} - -uint8_t graal_hpy_read_ui8(void* object, HPy_ssize_t offset) { - return ReadMember(object, offset, uint8_t); -} - -int8_t graal_hpy_read_i8(void* object, HPy_ssize_t offset) { - return ReadMember(object, offset, int8_t); -} - -int16_t graal_hpy_read_i16(void* object, HPy_ssize_t offset) { - return ReadMember(object, offset, int16_t); -} - -uint16_t graal_hpy_read_ui16(void* object, HPy_ssize_t offset) { - return ReadMember(object, offset, uint16_t); -} - -int32_t graal_hpy_read_i32(void* object, HPy_ssize_t offset) { - return ReadMember(object, offset, int32_t); -} - -uint32_t graal_hpy_read_ui32(void* object, HPy_ssize_t offset) { - return ReadMember(object, offset, uint32_t); -} - -int64_t graal_hpy_read_i64(void* object, HPy_ssize_t offset) { - return ReadMember(object, offset, int64_t); -} - -uint64_t graal_hpy_read_ui64(void* object, HPy_ssize_t offset) { - return ReadMember(object, offset, uint64_t); -} - -int graal_hpy_read_i(void* object, HPy_ssize_t offset) { - return ReadMember(object, offset, int); -} - -unsigned int graal_hpy_read_ui(void* object, HPy_ssize_t offset) { - return ReadMember(object, offset, unsigned int); -} - -long graal_hpy_read_l(void* object, HPy_ssize_t offset) { - return ReadMember(object, offset, long); -} - -unsigned long graal_hpy_read_ul(void* object, HPy_ssize_t offset) { - return ReadMember(object, offset, unsigned long); -} - -double graal_hpy_read_f(void* object, HPy_ssize_t offset) { - return ReadMember(object, offset, float); -} - -double graal_hpy_read_d(void* object, HPy_ssize_t offset) { - return ReadMember(object, offset, double); -} - -void* graal_hpy_read_ptr(void* object, HPy_ssize_t offset) { - return ReadMember(object, offset, void*); -} - -void* graal_hpy_read_HPy(void* object, HPy_ssize_t offset) { - return UNWRAP_FIELD(ReadMember(object, offset, HPy)); -} - -void* graal_hpy_read_HPyField(void* object, HPy_ssize_t offset) { - return UNWRAP_FIELD(ReadMember(object, offset, HPyField)); -} - -HPy_ssize_t graal_hpy_read_HPy_ssize_t(void* object, HPy_ssize_t offset) { - return ReadMember(object, offset, HPy_ssize_t); -} - -#undef ReadMember - -/*****************************************************************************/ -/* setter for writing native members */ -/*****************************************************************************/ - -#define WriteMember(object, offset, value, T) *(T*)(((char*)object) + offset) = (value) - -void graal_hpy_write_bool(void* object, HPy_ssize_t offset, bool value) { - WriteMember(object, offset, value, bool); -} - -void graal_hpy_write_i8(void* object, HPy_ssize_t offset, int8_t value) { - WriteMember(object, offset, value, int8_t); -} - -void graal_hpy_write_ui8(void* object, HPy_ssize_t offset, uint8_t value) { - WriteMember(object, offset, value, uint8_t); -} - -void graal_hpy_write_i16(void* object, HPy_ssize_t offset, int16_t value) { - WriteMember(object, offset, value, int16_t); -} - -void graal_hpy_write_ui16(void* object, HPy_ssize_t offset, uint16_t value) { - WriteMember(object, offset, value, uint16_t); -} - -void graal_hpy_write_i32(void* object, HPy_ssize_t offset, int32_t value) { - WriteMember(object, offset, value, int32_t); -} - -void graal_hpy_write_ui32(void* object, HPy_ssize_t offset, uint32_t value) { - WriteMember(object, offset, value, uint32_t); -} - -void graal_hpy_write_i64(void* object, HPy_ssize_t offset, int64_t value) { - WriteMember(object, offset, value, int64_t); -} - -void graal_hpy_write_ui64(void* object, HPy_ssize_t offset, uint64_t value) { - WriteMember(object, offset, value, uint64_t); -} - -void graal_hpy_write_i(void* object, HPy_ssize_t offset, int value) { - WriteMember(object, offset, (value), int); -} - -void graal_hpy_write_l(void* object, HPy_ssize_t offset, long value) { - WriteMember(object, offset, (value), long); -} - -void graal_hpy_write_f(void* object, HPy_ssize_t offset, float value) { - WriteMember(object, offset, (value), float); -} - -void graal_hpy_write_d(void* object, HPy_ssize_t offset, double value) { - WriteMember(object, offset, (value), double); -} - -void graal_hpy_write_HPy(void* object, HPy_ssize_t offset, void* value) { - WriteMember(object, offset, WRAP(value), HPy); -} - -void graal_hpy_write_HPyField(void* object, HPy_ssize_t offset, void* value) { - WriteMember(object, offset, WRAP_FIELD(value), HPyField); -} - -void graal_hpy_write_ui(void* object, HPy_ssize_t offset, unsigned int value) { - WriteMember(object, offset, value, unsigned int); -} - -void graal_hpy_write_ul(void* object, HPy_ssize_t offset, unsigned long value) { - WriteMember(object, offset, value, unsigned long); -} - -void graal_hpy_write_HPy_ssize_t(void* object, HPy_ssize_t offset, HPy_ssize_t value) { - WriteMember(object, offset, value, HPy_ssize_t); -} - -void graal_hpy_write_ptr(void* object, HPy_ssize_t offset, void* value) { - WriteMember(object, offset, value, void*); -} - -#undef WriteMember - -typedef void (*destroyfunc)(void*); -/* to be used from Java code only */ -int graal_hpy_bulk_free(uint64_t ptrArray[], int64_t len) -{ - int64_t i; - uint64_t obj; - destroyfunc func; - - for (i = 0; i < len; i += 2) { - obj = ptrArray[i]; - func = (destroyfunc) ptrArray[i + 1]; - if (obj) { - if (func != NULL) { - func((void*) obj); - } - free((void*) obj); - } - } - return 0; -} - -/*****************************************************************************/ -/* HPy context helper functions */ -/*****************************************************************************/ - - -#define HPyAPI_STORAGE _HPy_HIDDEN -#define _HPy_IMPL_NAME(name) ctx_##name -#define _HPy_IMPL_NAME_NOPREFIX(name) ctx_##name -#define _py2h(_x) HPy_NULL -#define _h2py(_x) NULL - -typedef HPy* _HPyPtr; -typedef HPyField* _HPyFieldPtr; -typedef HPy _HPyConst; -typedef HPyGlobal* _HPyGlobalPtr; - -#define HPy void* -#define HPyListBuilder void* -#define HPyTupleBuilder void* -#define HPyTracker void* -#define HPyField void* -#define HPyThreadState void* -#define HPyGlobal void* -#define _HPyCapsule_key int32_t - -#define SELECT_CTX(__ctx__) (g_universal_ctx) - -#define UPCALL_HPY(__name__, __ctx__, ...) polyglot_invoke(SELECT_CTX(__ctx__), #__name__, (__ctx__), __VA_ARGS__) -#define UPCALL_HPY0(__name__, __ctx__) polyglot_invoke(SELECT_CTX(__ctx__), #__name__, (__ctx__)) -#define UPCALL_CHARPTR(__name__, __ctx__, ...) ((char*)polyglot_invoke(SELECT_CTX(__ctx__), #__name__, (__ctx__), __VA_ARGS__)) -#define UPCALL_VOID(__name__, __ctx__, ...) (void)polyglot_invoke(SELECT_CTX(__ctx__), #__name__, (__ctx__), __VA_ARGS__) -#define UPCALL_VOID0(__name__, __ctx__) ((void)polyglot_invoke(SELECT_CTX(__ctx__), #__name__, (__ctx__))) -#define UPCALL_DOUBLE(__name__, __ctx__, ...) polyglot_as_double(polyglot_invoke(SELECT_CTX(__ctx__), #__name__, (__ctx__), __VA_ARGS__)) -#define UPCALL_I64(__name__, __ctx__, ...) polyglot_as_i64(polyglot_invoke(SELECT_CTX(__ctx__), #__name__, (__ctx__), __VA_ARGS__)) -#define UPCALL_I32(__name__, __ctx__, ...) polyglot_as_i32(polyglot_invoke(SELECT_CTX(__ctx__), #__name__, (__ctx__), __VA_ARGS__)) - - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Module_Create)(HPyContext *ctx, HPyModuleDef *hpydef) -{ - return UPCALL_HPY(ctx_Module_Create, ctx, hpydef); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Dup)(HPyContext *ctx, HPy h) -{ - return UPCALL_HPY(ctx_Dup, ctx, h); -} - -HPyAPI_STORAGE void _HPy_IMPL_NAME(Close)(HPyContext *ctx, HPy h) -{ - UPCALL_VOID(ctx_Close, ctx, h); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Long_FromLong)(HPyContext *ctx, long v) -{ - return UPCALL_HPY(ctx_Long_FromLong, ctx, v); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Long_FromUnsignedLong)(HPyContext *ctx, unsigned long v) -{ - return UPCALL_HPY(ctx_Long_FromUnsignedLong, ctx, v); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Long_FromLongLong)(HPyContext *ctx, long long v) -{ - return UPCALL_HPY(ctx_Long_FromLongLong, ctx, v); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Long_FromUnsignedLongLong)(HPyContext *ctx, unsigned long long v) -{ - return UPCALL_HPY(ctx_Long_FromUnsignedLongLong, ctx, v); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Long_FromSize_t)(HPyContext *ctx, size_t v) -{ - return UPCALL_HPY(ctx_Long_FromSize_t, ctx, v); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Long_FromSsize_t)(HPyContext *ctx, HPy_ssize_t v) -{ - return UPCALL_HPY(ctx_Long_FromSsize_t, ctx, v); -} - -HPyAPI_STORAGE long _HPy_IMPL_NAME(Long_AsLong)(HPyContext *ctx, HPy h) -{ - return (long) UPCALL_I64(ctx_Long_AsLong, ctx, h); -} - -HPyAPI_STORAGE unsigned long _HPy_IMPL_NAME(Long_AsUnsignedLong)(HPyContext *ctx, HPy h) -{ - return (unsigned long) UPCALL_I64(ctx_Long_AsUnsignedLong, ctx, h); -} - -HPyAPI_STORAGE unsigned long _HPy_IMPL_NAME(Long_AsUnsignedLongMask)(HPyContext *ctx, HPy h) -{ - return (unsigned long) UPCALL_I64(ctx_Long_AsUnsignedLongMask, ctx, h); -} - -HPyAPI_STORAGE long long _HPy_IMPL_NAME(Long_AsLongLong)(HPyContext *ctx, HPy h) -{ - return (long long) UPCALL_I64(ctx_Long_AsLongLong, ctx, h); -} - -HPyAPI_STORAGE unsigned long long _HPy_IMPL_NAME(Long_AsUnsignedLongLong)(HPyContext *ctx, HPy h) -{ - return (unsigned long long) UPCALL_I64(ctx_Long_AsUnsignedLongLong, ctx, h); -} - -HPyAPI_STORAGE unsigned long long _HPy_IMPL_NAME(Long_AsUnsignedLongLongMask)(HPyContext *ctx, HPy h) -{ - return (unsigned long long) UPCALL_I64(ctx_Long_AsUnsignedLongLongMask, ctx, h); -} - -HPyAPI_STORAGE size_t _HPy_IMPL_NAME(Long_AsSize_t)(HPyContext *ctx, HPy h) -{ - return (size_t) UPCALL_I64(ctx_Long_AsSize_t, ctx, h); -} - -HPyAPI_STORAGE HPy_ssize_t _HPy_IMPL_NAME(Long_AsSsize_t)(HPyContext *ctx, HPy h) -{ - return (HPy_ssize_t) UPCALL_I64(ctx_Long_AsSsize_t, ctx, h); -} - -HPyAPI_STORAGE void* _HPy_IMPL_NAME(Long_AsVoidPtr)(HPyContext *ctx, HPy h) { - return (void *) UPCALL_I64(ctx_Long_AsVoidPtr, ctx, h); -} - -HPyAPI_STORAGE double _HPy_IMPL_NAME(Long_AsDouble)(HPyContext *ctx, HPy h) { - return UPCALL_DOUBLE(ctx_Long_AsDouble, ctx, h); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Float_FromDouble)(HPyContext *ctx, double v) -{ - return UPCALL_HPY(ctx_Float_FromDouble, ctx, v); -} - -HPyAPI_STORAGE double _HPy_IMPL_NAME(Float_AsDouble)(HPyContext *ctx, HPy h) -{ - return UPCALL_DOUBLE(ctx_Float_AsDouble, ctx, h); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Bool_FromLong)(HPyContext *ctx, long v) -{ - return UPCALL_HPY(ctx_Bool_FromLong, ctx, v); -} - -HPyAPI_STORAGE HPy_ssize_t _HPy_IMPL_NAME_NOPREFIX(Length)(HPyContext *ctx, HPy h) -{ - return (HPy_ssize_t) UPCALL_I64(ctx_Length, ctx, h); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(Number_Check)(HPyContext *ctx, HPy h) -{ - return (int) UPCALL_I32(ctx_Number_Check, ctx, h); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Add)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_Add, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Subtract)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_Subtract, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Multiply)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_Multiply, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(MatrixMultiply)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_MatrixMultiply, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(FloorDivide)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_FloorDivide, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(TrueDivide)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_TrueDivide, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Remainder)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_Remainder, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Divmod)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_Divmod, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Power)(HPyContext *ctx, HPy h1, HPy h2, HPy h3) -{ - return UPCALL_HPY(ctx_Power, ctx, h1, h2, h3); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Negative)(HPyContext *ctx, HPy h1) -{ - return UPCALL_HPY(ctx_Negative, ctx, h1); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Positive)(HPyContext *ctx, HPy h1) -{ - return UPCALL_HPY(ctx_Positive, ctx, h1); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Absolute)(HPyContext *ctx, HPy h1) -{ - return UPCALL_HPY(ctx_Absolute, ctx, h1); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Invert)(HPyContext *ctx, HPy h1) -{ - return UPCALL_HPY(ctx_Invert, ctx, h1); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Lshift)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_Lshift, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Rshift)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_Rshift, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(And)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_And, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Xor)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_Xor, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Or)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_Or, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Index)(HPyContext *ctx, HPy h1) -{ - return UPCALL_HPY(ctx_Index, ctx, h1); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Long)(HPyContext *ctx, HPy h1) -{ - return UPCALL_HPY(ctx_Long, ctx, h1); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Float)(HPyContext *ctx, HPy h1) -{ - return UPCALL_HPY(ctx_Float, ctx, h1); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(InPlaceAdd)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_InPlaceAdd, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(InPlaceSubtract)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_InPlaceSubtract, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(InPlaceMultiply)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_InPlaceMultiply, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(InPlaceMatrixMultiply)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_InPlaceMatrixMultiply, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(InPlaceFloorDivide)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_InPlaceFloorDivide, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(InPlaceTrueDivide)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_InPlaceTrueDivide, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(InPlaceRemainder)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_InPlaceRemainder, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(InPlacePower)(HPyContext *ctx, HPy h1, HPy h2, HPy h3) -{ - return UPCALL_HPY(ctx_InPlacePower, ctx, h1, h2, h3); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(InPlaceLshift)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_InPlaceLshift, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(InPlaceRshift)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_InPlaceRshift, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(InPlaceAnd)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_InPlaceAnd, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(InPlaceXor)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_InPlaceXor, ctx, h1, h2); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(InPlaceOr)(HPyContext *ctx, HPy h1, HPy h2) -{ - return UPCALL_HPY(ctx_InPlaceOr, ctx, h1, h2); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(Callable_Check)(HPyContext *ctx, HPy h) -{ - return (int) UPCALL_I32(ctx_Callable_Check, ctx, h); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(CallTupleDict)(HPyContext *ctx, HPy callable, HPy args, HPy kw) -{ - return UPCALL_HPY(ctx_CallTupleDict, ctx, callable, args, kw); -} - -HPyAPI_STORAGE void _HPy_IMPL_NAME(Err_SetString)(HPyContext *ctx, HPy h_type, const char *message) -{ - UPCALL_VOID(ctx_Err_SetString, ctx, h_type, message); -} - -HPyAPI_STORAGE void _HPy_IMPL_NAME(Err_SetObject)(HPyContext *ctx, HPy h_type, HPy h_value) -{ - UPCALL_VOID(ctx_Err_SetObject, ctx, h_type, h_value); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Err_SetFromErrnoWithFilename)(HPyContext *ctx, HPy h_type, const char *filename_fsencoded) { - return UPCALL_HPY(ctx_Err_SetFromErrnoWithFilename, ctx, h_type, filename_fsencoded); -} - -HPyAPI_STORAGE void _HPy_IMPL_NAME(Err_SetFromErrnoWithFilenameObjects)(HPyContext *ctx, HPy h_type, HPy filename1, HPy filename2) { - UPCALL_VOID(ctx_Err_SetFromErrnoWithFilenameObjects, ctx, h_type, filename1, filename2); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(Err_Occurred)(HPyContext *ctx) -{ - return (int) polyglot_as_i32(UPCALL_HPY0(ctx_Err_Occurred, ctx)); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(Err_ExceptionMatches)(HPyContext *ctx, HPy exc) { - return (int) UPCALL_I32(ctx_Err_ExceptionMatches, ctx, exc); -} - -HPyAPI_STORAGE void _HPy_IMPL_NAME(Err_NoMemory)(HPyContext *ctx) -{ - UPCALL_VOID0(ctx_Err_NoMemory, ctx); -} - -HPyAPI_STORAGE void _HPy_IMPL_NAME(Err_Clear)(HPyContext *ctx) -{ - UPCALL_VOID0(ctx_Err_Clear, ctx); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Err_NewException)(HPyContext *ctx, const char *name, HPy base, HPy dict) { - return UPCALL_HPY(ctx_Err_NewException, ctx, name, base, dict); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Err_NewExceptionWithDoc)(HPyContext *ctx, const char *name, const char *doc, HPy base, HPy dict) { - return UPCALL_HPY(ctx_Err_NewExceptionWithDoc, ctx, name, doc, base, dict); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(Err_WarnEx)(HPyContext *ctx, HPy category, const char *message, HPy_ssize_t stack_level) { - return (int) UPCALL_I32(ctx_Err_WarnEx, ctx, category, message, stack_level); -} - -HPyAPI_STORAGE void _HPy_IMPL_NAME(Err_WriteUnraisable)(HPyContext *ctx, HPy obj) { - UPCALL_VOID(ctx_Err_WriteUnraisable, ctx, obj); -} - -HPyAPI_STORAGE void _HPy_IMPL_NAME(FatalError)(HPyContext *ctx, const char *msg) { - UPCALL_VOID(ctx_FatalError, ctx, msg); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME_NOPREFIX(IsTrue)(HPyContext *ctx, HPy h) -{ - return UPCALL_HPY(ctx_IsTrue, ctx, h); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Type_FromSpec)(HPyContext *ctx, HPyType_Spec *spec, HPyType_SpecParam *params) -{ - return UPCALL_HPY(ctx_Type_FromSpec, ctx, spec, params); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Type_GenericNew)(HPyContext *ctx, HPy type, _HPyPtr args, HPy_ssize_t nargs, HPy kw) -{ - return UPCALL_HPY(ctx_Type_GenericNew, ctx, type, args, nargs, kw); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(GetAttr)(HPyContext *ctx, HPy obj, HPy name) -{ - return UPCALL_HPY(ctx_GetAttr, ctx, obj, name); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(GetAttr_s)(HPyContext *ctx, HPy obj, const char *name) -{ - return UPCALL_HPY(ctx_GetAttr_s, ctx, obj, name); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME_NOPREFIX(HasAttr)(HPyContext *ctx, HPy obj, HPy name) -{ - return (int) UPCALL_I32(ctx_HasAttr, ctx, obj, name); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME_NOPREFIX(HasAttr_s)(HPyContext *ctx, HPy obj, const char *name) -{ - return (int) UPCALL_I32(ctx_HasAttr_s, ctx, obj, name); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME_NOPREFIX(SetAttr)(HPyContext *ctx, HPy obj, HPy name, HPy value) -{ - return (int) UPCALL_I32(ctx_SetAttr, ctx, obj, name, value); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME_NOPREFIX(SetAttr_s)(HPyContext *ctx, HPy obj, const char *name, HPy value) -{ - return (int) UPCALL_I32(ctx_SetAttr_s, ctx, obj, name, value); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(GetItem)(HPyContext *ctx, HPy obj, HPy key) -{ - return UPCALL_HPY(ctx_GetItem, ctx, obj, key); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(GetItem_i)(HPyContext *ctx, HPy obj, HPy_ssize_t idx) -{ - return UPCALL_HPY(ctx_GetItem_i, ctx, obj, idx); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(GetItem_s)(HPyContext *ctx, HPy obj, const char *key) -{ - return UPCALL_HPY(ctx_GetItem_s, ctx, obj, key); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME_NOPREFIX(Contains)(HPyContext *ctx, HPy container, HPy key) { - return (int) UPCALL_I32(ctx_Contains, ctx, container, key); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME_NOPREFIX(SetItem)(HPyContext *ctx, HPy obj, HPy key, HPy value) -{ - return UPCALL_HPY(ctx_SetItem, ctx, obj, key, value); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME_NOPREFIX(SetItem_i)(HPyContext *ctx, HPy obj, HPy_ssize_t idx, HPy value) -{ - return UPCALL_HPY(ctx_SetItem_i, ctx, obj, idx, value); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME_NOPREFIX(SetItem_s)(HPyContext *ctx, HPy obj, const char *key, HPy value) -{ - return UPCALL_HPY(ctx_SetItem_s, ctx, obj, key, value); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Type)(HPyContext *ctx, HPy obj) -{ - return UPCALL_HPY(ctx_Type, ctx, obj); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME_NOPREFIX(TypeCheck)(HPyContext *ctx, HPy obj, HPy type) -{ - return (int) UPCALL_I32(ctx_TypeCheck, ctx, obj, type); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME_NOPREFIX(TypeCheck_g)(HPyContext *ctx, HPy obj, HPyGlobal type) -{ - return (int) UPCALL_I32(ctx_TypeCheck_g, ctx, obj, type); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME_NOPREFIX(Is)(HPyContext *ctx, HPy obj, HPy other) -{ - return (int) UPCALL_I32(ctx_Is, ctx, obj, other); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME_NOPREFIX(Is_g)(HPyContext *ctx, HPy obj, HPyGlobal other) -{ - return (int) UPCALL_I32(ctx_Is_g, ctx, obj, other); -} - -HPyAPI_STORAGE void *_HPy_IMPL_NAME_NOPREFIX(AsStruct)(HPyContext *ctx, HPy obj) -{ - return UPCALL_HPY(ctx_AsStruct, ctx, obj); -} - -HPyAPI_STORAGE void *_HPy_IMPL_NAME_NOPREFIX(AsStructLegacy)(HPyContext *ctx, HPy obj) -{ - return UPCALL_HPY(ctx_AsStructLegacy, ctx, obj); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(New)(HPyContext *ctx, HPy h_type, void **data) -{ - return UPCALL_HPY(ctx_New, ctx, h_type, data); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Repr)(HPyContext *ctx, HPy obj) -{ - return UPCALL_HPY(ctx_Repr, ctx, obj); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Str)(HPyContext *ctx, HPy obj) -{ - return UPCALL_HPY(ctx_Str, ctx, obj); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(ASCII)(HPyContext *ctx, HPy obj) -{ - return UPCALL_HPY(ctx_ASCII, ctx, obj); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(Bytes)(HPyContext *ctx, HPy obj) -{ - return UPCALL_HPY(ctx_Bytes, ctx, obj); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(RichCompare)(HPyContext *ctx, HPy v, HPy w, int op) -{ - return UPCALL_HPY(ctx_RichCompare, ctx, v, w, op); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME_NOPREFIX(RichCompareBool)(HPyContext *ctx, HPy v, HPy w, int op) -{ - return (int) UPCALL_I32(ctx_RichCompareBool, ctx, v, w, op); -} - -HPyAPI_STORAGE HPy_hash_t _HPy_IMPL_NAME_NOPREFIX(Hash)(HPyContext *ctx, HPy obj) -{ - return (HPy_hash_t) UPCALL_I64(ctx_Hash, ctx, obj); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(Bytes_Check)(HPyContext *ctx, HPy h) -{ - return (int) UPCALL_I32(ctx_Bytes_Check, ctx, h); -} - -HPyAPI_STORAGE HPy_ssize_t _HPy_IMPL_NAME(Bytes_Size)(HPyContext *ctx, HPy h) -{ - return (HPy_ssize_t) UPCALL_I64(ctx_Bytes_Size, ctx, h); -} - -HPyAPI_STORAGE HPy_ssize_t _HPy_IMPL_NAME(Bytes_GET_SIZE)(HPyContext *ctx, HPy h) -{ - return (HPy_ssize_t) UPCALL_I64(ctx_Bytes_GET_SIZE, ctx, h); -} - -HPyAPI_STORAGE char *_HPy_IMPL_NAME(Bytes_AsString)(HPyContext *ctx, HPy h) -{ - return UPCALL_CHARPTR(ctx_Bytes_AsString, ctx, h); -} - -HPyAPI_STORAGE char *_HPy_IMPL_NAME(Bytes_AS_STRING)(HPyContext *ctx, HPy h) -{ - return UPCALL_CHARPTR(ctx_Bytes_AS_STRING, ctx, h); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Bytes_FromString)(HPyContext *ctx, const char *v) -{ - return UPCALL_HPY(ctx_Bytes_FromString, ctx, v); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Bytes_FromStringAndSize)(HPyContext *ctx, const char *v, HPy_ssize_t len) -{ - return UPCALL_HPY(ctx_Bytes_FromStringAndSize, ctx, v, len); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_FromString)(HPyContext *ctx, const char *utf8) -{ - return UPCALL_HPY(ctx_Unicode_FromString, ctx, utf8); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(Unicode_Check)(HPyContext *ctx, HPy h) -{ - return (int) UPCALL_I32(ctx_Unicode_Check, ctx, h); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_AsASCIIString)(HPyContext *ctx, HPy h) { - return UPCALL_HPY(ctx_Unicode_AsASCIIString, ctx, h); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_AsLatin1String)(HPyContext *ctx, HPy h) { - return UPCALL_HPY(ctx_Unicode_AsLatin1String, ctx, h); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_AsUTF8String)(HPyContext *ctx, HPy h) -{ - return UPCALL_HPY(ctx_Unicode_AsUTF8String, ctx, h); -} - -HPyAPI_STORAGE const char *_HPy_IMPL_NAME(Unicode_AsUTF8AndSize)(HPyContext *ctx, HPy h, HPy_ssize_t *size) { - return UPCALL_CHARPTR(ctx_Unicode_AsUTF8AndSize, ctx, h, size); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_FromWideChar)(HPyContext *ctx, const wchar_t *w, HPy_ssize_t size) -{ - return UPCALL_HPY(ctx_Unicode_FromWideChar, ctx, w, size); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_DecodeFSDefault)(HPyContext *ctx, const char *v) -{ - return UPCALL_HPY(ctx_Unicode_DecodeFSDefault, ctx, v); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_DecodeFSDefaultAndSize)(HPyContext *ctx, const char *v, HPy_ssize_t size) { - return UPCALL_HPY(ctx_Unicode_DecodeFSDefaultAndSize, ctx, v, size); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_EncodeFSDefault)(HPyContext *ctx, HPy h) { - return UPCALL_HPY(ctx_Unicode_EncodeFSDefault, ctx, h); -} - -HPyAPI_STORAGE uint32_t _HPy_IMPL_NAME(Unicode_ReadChar)(HPyContext *ctx, HPy h, HPy_ssize_t index) { - return (uint32_t) UPCALL_I32(ctx_Unicode_ReadChar, ctx, h, index); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_DecodeLatin1)(HPyContext *ctx, const char *s, HPy_ssize_t size, const char *errors) { - return UPCALL_HPY(ctx_Unicode_DecodeLatin1, ctx, s, size, errors ); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_DecodeASCII)(HPyContext *ctx, const char *s, HPy_ssize_t size, const char *errors) { - return UPCALL_HPY(ctx_Unicode_DecodeASCII, ctx, s, size, errors ); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(List_Check)(HPyContext *ctx, HPy h) -{ - return (int) UPCALL_I32(ctx_List_Check, ctx, h); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(List_New)(HPyContext *ctx, HPy_ssize_t len) -{ - return UPCALL_HPY(ctx_List_New, ctx, len); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(List_Append)(HPyContext *ctx, HPy h_list, HPy h_item) -{ - return (int) UPCALL_I32(ctx_List_Append, ctx, h_list, h_item); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(Dict_Check)(HPyContext *ctx, HPy h) -{ - return (int) UPCALL_I32(ctx_Dict_Check, ctx, h); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Dict_New)(HPyContext *ctx) -{ - return UPCALL_HPY0(ctx_Dict_New, ctx); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(Tuple_Check)(HPyContext *ctx, HPy h) -{ - return (int) UPCALL_I32(ctx_Tuple_Check, ctx, h); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Tuple_FromArray)(HPyContext *ctx, _HPyPtr items, HPy_ssize_t n) -{ - return UPCALL_HPY(ctx_Tuple_FromArray, ctx, items, n); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Import_ImportModule)(HPyContext *ctx, const char *name) -{ - return UPCALL_HPY(ctx_Import_ImportModule, ctx, name); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME_NOPREFIX(FromPyObject)(HPyContext *ctx, cpy_PyObject *obj) -{ - /* Although, this operation is not supported for in ABI compatibility mode, we still - need to implement the callback properly because it might still be a valid path - in other modes. */ - return UPCALL_HPY(ctx_FromPyObject, ctx, obj); -} - -HPyAPI_STORAGE cpy_PyObject *_HPy_IMPL_NAME_NOPREFIX(AsPyObject)(HPyContext *ctx, HPy h) -{ - return (cpy_PyObject *) UPCALL_CHARPTR(ctx_AsPyObject, ctx, h); -} - -HPyAPI_STORAGE HPyListBuilder _HPy_IMPL_NAME(ListBuilder_New)(HPyContext *ctx, HPy_ssize_t initial_size) { - return UPCALL_HPY(ctx_ListBuilder_New, ctx, initial_size); -} - -HPyAPI_STORAGE void _HPy_IMPL_NAME(ListBuilder_Set)(HPyContext *ctx, HPyListBuilder builder, HPy_ssize_t index, HPy h_item) { - UPCALL_VOID(ctx_ListBuilder_Set, ctx, builder, index, h_item); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(ListBuilder_Build)(HPyContext *ctx, HPyListBuilder builder) { - return UPCALL_HPY(ctx_ListBuilder_Build, ctx, builder); -} - -HPyAPI_STORAGE void _HPy_IMPL_NAME(ListBuilder_Cancel)(HPyContext *ctx, HPyListBuilder builder) { - UPCALL_VOID(ctx_ListBuilder_Cancel, ctx, builder); -} - -HPyAPI_STORAGE HPyTupleBuilder _HPy_IMPL_NAME(TupleBuilder_New)(HPyContext *ctx, HPy_ssize_t initial_size) { - return UPCALL_HPY(ctx_TupleBuilder_New, ctx, initial_size); -} - -HPyAPI_STORAGE void _HPy_IMPL_NAME(TupleBuilder_Set)(HPyContext *ctx, HPyTupleBuilder builder, HPy_ssize_t index, HPy h_item) { - UPCALL_VOID(ctx_TupleBuilder_Set, ctx, builder, index, h_item); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(TupleBuilder_Build)(HPyContext *ctx, HPyTupleBuilder builder) { - return UPCALL_HPY(ctx_TupleBuilder_Build, ctx, builder); -} - -HPyAPI_STORAGE void _HPy_IMPL_NAME(TupleBuilder_Cancel)(HPyContext *ctx, HPyTupleBuilder builder) { - UPCALL_VOID(ctx_TupleBuilder_Cancel, ctx, builder); -} - -HPyAPI_STORAGE HPyTracker _HPy_IMPL_NAME(Tracker_New)(HPyContext *ctx, HPy_ssize_t size) { - return UPCALL_HPY(ctx_Tracker_New, ctx, size); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(Tracker_Add)(HPyContext *ctx, HPyTracker ht, HPy h) { - return (int) UPCALL_I32(ctx_Tracker_Add, ctx, ht, h); -} - -HPyAPI_STORAGE void _HPy_IMPL_NAME(Tracker_ForgetAll)(HPyContext *ctx, HPyTracker ht) { - UPCALL_VOID(ctx_Tracker_ForgetAll, ctx, ht); -} - -HPyAPI_STORAGE void _HPy_IMPL_NAME(Tracker_Close)(HPyContext *ctx, HPyTracker ht) { - UPCALL_VOID(ctx_Tracker_Close, ctx, ht); -} - -HPyAPI_STORAGE void _HPy_IMPL_NAME(Field_Store)(HPyContext *ctx, HPy target_object, _HPyFieldPtr target_field, HPy h) { - UPCALL_VOID(ctx_Field_Store, ctx, target_object, target_field, h); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Field_Load)(HPyContext *ctx, HPy source_object, HPyField source_field) { - return UPCALL_HPY(ctx_Field_Load, ctx, source_object, source_field); -} - -HPyAPI_STORAGE HPyThreadState _HPy_IMPL_NAME(LeavePythonExecution)(HPyContext *ctx) { - return UPCALL_HPY0(ctx_LeavePythonExecution, ctx); -} - -HPyAPI_STORAGE void _HPy_IMPL_NAME(ReenterPythonExecution)(HPyContext *ctx, HPyThreadState state) { - UPCALL_VOID(ctx_ReenterPythonExecution, ctx, state); -} - -HPyAPI_STORAGE void _HPy_IMPL_NAME(Global_Store)(HPyContext *ctx, _HPyGlobalPtr global, HPy h) { - UPCALL_VOID(ctx_Global_Store, ctx, global, h); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Global_Load)(HPyContext *ctx, HPyGlobal global) { - return UPCALL_HPY(ctx_Global_Load, ctx, global); -} - -HPyAPI_STORAGE void _HPy_IMPL_NAME(Dump)(HPyContext *ctx, HPy h) { - UPCALL_VOID(ctx_Dump, ctx, h); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(MaybeGetAttr_s)(HPyContext *ctx, HPy obj, const char *name) { - return UPCALL_HPY(ctx_MaybeGetAttr_s, ctx, obj, name); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(SetType)(HPyContext *ctx, HPy obj, HPy type) { - return (int) UPCALL_I32(ctx_SetType, ctx, obj, type); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(Type_IsSubtype)(HPyContext *ctx, HPy sub, HPy type) { - return (int) UPCALL_I32(ctx_Type_IsSubtype, ctx, sub, type); -} - -HPyAPI_STORAGE const char* _HPy_IMPL_NAME(Type_GetName)(HPyContext *ctx, HPy type) { - return UPCALL_CHARPTR(ctx_Type_GetName, ctx, type); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_FromEncodedObject)(HPyContext *ctx, HPy obj, const char *encoding, const char *errors) { - return UPCALL_HPY(ctx_Unicode_FromEncodedObject, ctx, obj, encoding, errors); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_InternFromString)(HPyContext *ctx, const char *str) { - return UPCALL_HPY(ctx_Unicode_InternFromString, ctx, str); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_Substring)(HPyContext *ctx, HPy obj, HPy_ssize_t start, HPy_ssize_t end) { - return UPCALL_HPY(ctx_Unicode_Substring, ctx, obj, start, end); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Dict_Keys)(HPyContext *ctx, HPy h) { - return UPCALL_HPY(ctx_Dict_Keys, ctx, h); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Dict_GetItem)(HPyContext *ctx, HPy op, HPy key) { - return UPCALL_HPY(ctx_Dict_GetItem, ctx, op, key); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(ContextVar_New)(HPyContext *ctx, const char *name, HPy default_value) { - return UPCALL_HPY(ctx_ContextVar_New, ctx, name, default_value); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(ContextVar_Get)(HPyContext *ctx, HPy context_var, HPy default_value, _HPyPtr result) { - return (int) UPCALL_I32(ctx_ContextVar_Get, ctx, context_var, default_value, result); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(ContextVar_Set)(HPyContext *ctx, HPy context_var, HPy value) { - return UPCALL_HPY(ctx_ContextVar_Set, ctx, context_var, value); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Capsule_New)(HPyContext *ctx, void *pointer, const char *name, HPyCapsule_Destructor destructor) { - return UPCALL_HPY(ctx_Capsule_New, ctx, pointer, name, destructor); -} - -HPyAPI_STORAGE void *_HPy_IMPL_NAME(Capsule_Get)(HPyContext *ctx, HPy capsule, _HPyCapsule_key key, const char *name) { - return UPCALL_HPY(ctx_Capsule_Get, ctx, capsule, (int32_t)key, name); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(Capsule_IsValid)(HPyContext *ctx, HPy capsule, const char *name) { - return (int) UPCALL_I32(ctx_Capsule_IsValid, ctx, capsule, name); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(Capsule_Set)(HPyContext *ctx, HPy capsule, _HPyCapsule_key key, void *value) { - return (int) UPCALL_I32(ctx_Capsule_Set, ctx, capsule, (int32_t)key, value); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(Type_CheckSlot)(HPyContext *ctx, HPy type, HPyDef *expected) { - return (int) UPCALL_I32(ctx_Type_CheckSlot, ctx, type, expected); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(Sequence_Check)(HPyContext *ctx, HPy obj) { - return (int) UPCALL_I32(ctx_Sequence_Check, ctx, obj); -} - -HPyAPI_STORAGE int _HPy_IMPL_NAME(Slice_Unpack)(HPyContext *ctx, HPy slice, HPy_ssize_t *start, HPy_ssize_t *stop, HPy_ssize_t *step) { - return (int) UPCALL_I32(ctx_Slice_Unpack, ctx, slice, start, stop, step); -} - -HPyAPI_STORAGE HPy _HPy_IMPL_NAME(SeqIter_New)(HPyContext *ctx, HPy seq) { - return UPCALL_HPY(ctx_SeqIter_New, ctx, seq); -} - -#undef HPy -#undef HPyListBuilder -#undef HPyTupleBuilder -#undef HPyTracker -#undef HPyField -#undef HPyThreadState -#undef HPyGlobal -#undef _HPyCapsule_key - -#undef _HPy_IMPL_NAME_NOPREFIX -#undef _HPy_IMPL_NAME - -#include "hpynative.h" - -/* Allocate a native HPy context structure and fill it. */ -HPyContext *graal_hpy_context_to_native(HPyContext *managed_context) { - GraalHPyContext *full_native_context = (GraalHPyContext *) malloc(sizeof(GraalHPyContext)); - - HPyContext *native_context = graal_native_context_get_hpy_context(full_native_context); - -#define COPY(__member) native_context->__member = managed_context->__member - COPY(name); - COPY(abi_version); - COPY(h_None); - COPY(h_True); - COPY(h_False); - COPY(h_NotImplemented); - COPY(h_Ellipsis); - COPY(h_BaseException); - COPY(h_Exception); - COPY(h_StopAsyncIteration); - COPY(h_StopIteration); - COPY(h_GeneratorExit); - COPY(h_ArithmeticError); - COPY(h_LookupError); - COPY(h_AssertionError); - COPY(h_AttributeError); - COPY(h_BufferError); - COPY(h_EOFError); - COPY(h_FloatingPointError); - COPY(h_OSError); - COPY(h_ImportError); - COPY(h_ModuleNotFoundError); - COPY(h_IndexError); - COPY(h_KeyError); - COPY(h_KeyboardInterrupt); - COPY(h_MemoryError); - COPY(h_NameError); - COPY(h_OverflowError); - COPY(h_RuntimeError); - COPY(h_RecursionError); - COPY(h_NotImplementedError); - COPY(h_SyntaxError); - COPY(h_IndentationError); - COPY(h_TabError); - COPY(h_ReferenceError); - COPY(h_SystemError); - COPY(h_SystemExit); - COPY(h_TypeError); - COPY(h_UnboundLocalError); - COPY(h_UnicodeError); - COPY(h_UnicodeEncodeError); - COPY(h_UnicodeDecodeError); - COPY(h_UnicodeTranslateError); - COPY(h_ValueError); - COPY(h_ZeroDivisionError); - COPY(h_BlockingIOError); - COPY(h_BrokenPipeError); - COPY(h_ChildProcessError); - COPY(h_ConnectionError); - COPY(h_ConnectionAbortedError); - COPY(h_ConnectionRefusedError); - COPY(h_ConnectionResetError); - COPY(h_FileExistsError); - COPY(h_FileNotFoundError); - COPY(h_InterruptedError); - COPY(h_IsADirectoryError); - COPY(h_NotADirectoryError); - COPY(h_PermissionError); - COPY(h_ProcessLookupError); - COPY(h_TimeoutError); - COPY(h_Warning); - COPY(h_UserWarning); - COPY(h_DeprecationWarning); - COPY(h_PendingDeprecationWarning); - COPY(h_SyntaxWarning); - COPY(h_RuntimeWarning); - COPY(h_FutureWarning); - COPY(h_ImportWarning); - COPY(h_UnicodeWarning); - COPY(h_BytesWarning); - COPY(h_ResourceWarning); - COPY(h_BaseObjectType); - COPY(h_TypeType); - COPY(h_BoolType); - COPY(h_LongType); - COPY(h_FloatType); - COPY(h_UnicodeType); - COPY(h_TupleType); - COPY(h_ListType); - COPY(h_ComplexType); - COPY(h_BytesType); - COPY(h_MemoryViewType); - COPY(h_CapsuleType); - COPY(h_SliceType); -#undef COPY - - return native_context; -} - -#undef WRAP -#undef UNWRAP diff --git a/graalpython/com.oracle.graal.python.hpy.llvm/src/hpynative.h b/graalpython/com.oracle.graal.python.hpy.llvm/src/hpynative.h deleted file mode 100644 index decae94d0c..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.llvm/src/hpynative.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef HPY_HPYNATIVE_H_ -#define HPY_HPYNATIVE_H_ - -#include - -#include "hpy.h" - -typedef struct { - void *jni_backend; - void *jni_context; - - /* embed HPy context */ - HPyContext hpy_context; -} GraalHPyContext; - -#if defined(_MSC_VER) && !defined(__clang__) -#define MUST_INLINE static inline -#else -#define MUST_INLINE __attribute__((always_inline)) static inline -#endif - -MUST_INLINE HPyContext *graal_native_context_get_hpy_context(GraalHPyContext *native_context) { - return &(native_context->hpy_context); -} - -MUST_INLINE GraalHPyContext *graal_hpy_context_get_native_context(HPyContext *hpy_context) { - return (GraalHPyContext *)(((char *)hpy_context) - offsetof(GraalHPyContext, hpy_context)); -} - -#endif /* HPY_HPYNATIVE_H_ */ diff --git a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/__init__.py b/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/__init__.py deleted file mode 100644 index f8907d5ea7..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -# MIT License -# -# Copyright (c) 2020, 2023, Oracle and/or its affiliates. -# Copyright (c) 2019 pyhandle -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - diff --git a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/check_py27_compat.py b/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/check_py27_compat.py deleted file mode 100644 index 3c15890655..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/check_py27_compat.py +++ /dev/null @@ -1,113 +0,0 @@ -# MIT License -# -# Copyright (c) 2020, 2023, Oracle and/or its affiliates. -# Copyright (c) 2019 pyhandle -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -""" -Some of the files in this repo are used also by PyPy tests, which run on -python2.7. - -This script tries to import all of them: it does not check any behavior, just -that they are importable and thus are not using any py3-specific syntax. - -This script assumes that pathlib and pytest are installed (because the modules -try to import them). -""" - -from __future__ import print_function -import sys -import traceback -import py - -ROOT = py.path.local(__file__).join('..', '..') -TEST_DIRS = [ROOT / 'test', ROOT / 'test' / 'debug'] - -# PyPy does NOT import these files using py2 -PY3_ONLY = ['test_support.py', - 'test_handles_invalid.py', - 'test_handles_leak.py', - 'test_builder_invalid.py'] - -def try_import(name): - try: - if isinstance(name, py.path.local): - print('Trying to import %s... ' % ROOT.bestrelpath(name), end='') - name.pyimport() - else: - print('Trying to import %s... ' % name, end='') - __import__(name) - except: - print('ERROR!') - print() - traceback.print_exc(file=sys.stdout) - print() - return False - else: - print('OK') - return True - -def try_import_hpy_devel(): - """ - To import hpy.devel we need to create an empty hpy/__init__.py, because - python2.7 does not support namespace packages. - - Return the number of failed imports. - """ - failed = 0 - init_py = ROOT.join('hpy', '__init__.py') - assert init_py.check(exists=False) - try: - init_py.write('') # create an empty __init__.py - if not try_import('hpy.devel'): - failed += 1 - finally: - init_py.remove() - return failed - -def try_import_tests(dirs): - failed = 0 - for d in dirs: - for t in d.listdir('test_*.py'): - if t.basename in PY3_ONLY: - continue - if not try_import(t): - failed += 1 - return failed - - -def main(): - if sys.version_info[:2] != (2, 7): - print('ERROR: this script should be run on top of python 2.7') - sys.exit(1) - - sys.path.insert(0, str(ROOT)) - failed = 0 - failed += try_import_hpy_devel() - failed += try_import_tests(TEST_DIRS) - print() - if failed == 0: - print('Everything ok!') - else: - print('%d failed imports :(' % failed) - sys.exit(1) - -if __name__ == '__main__': - main() diff --git a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/conftest.py b/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/conftest.py deleted file mode 100644 index 916169e287..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/conftest.py +++ /dev/null @@ -1,152 +0,0 @@ -# MIT License -# -# Copyright (c) 2020, 2023, Oracle and/or its affiliates. -# Copyright (c) 2019 pyhandle -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import os -import sys -import pytest -from .support import ExtensionCompiler, DefaultExtensionTemplate,\ - PythonSubprocessRunner, HPyDebugCapture, make_hpy_abi_fixture -from hpy.debug.leakdetector import LeakDetector -from pathlib import Path - -IS_VALGRIND_RUN = False -def pytest_addoption(parser): - parser.addoption( - "--compiler-v", action="https://github.com/store_true", - help="Print to stdout the commands used to invoke the compiler") - parser.addoption( - "--subprocess-v", action="https://github.com/store_true", - help="Print to stdout the stdout and stderr of Python subprocesses " - "executed via run_python_subprocess") - parser.addoption( - "--dump-dir", - help="Enables dump mode and specifies where to write generated test " - "sources. This will then only generate the sources and skip " - "evaluation of the tests.") - parser.addoption( - '--reuse-venv', action="https://github.com/store_true", - help="Development only: reuse the venv for test_distutils.py instead of " - "creating a new one for every test") - - -@pytest.hookimpl(trylast=True) -def pytest_configure(config): - global IS_VALGRIND_RUN - IS_VALGRIND_RUN = config.pluginmanager.hasplugin('valgrind_checker') - config.addinivalue_line( - "markers", "syncgc: Mark tests that rely on a synchronous GC." - ) - config.addinivalue_line( - "markers", "tp_traverse: Mark tests that rely tp_traverse being called." - ) - - -def pytest_runtest_setup(item): - if (sys.implementation.name in ["graalpy", "pypy"] and - "syncgc" in [mark.name for mark in item.iter_markers()]): - pytest.skip(f"cannot run syncgc test on {sys.implementation.name}") - if (sys.implementation.name in ["graalpy"] and - "tp_traverse" in [mark.name for mark in item.iter_markers()]): - pytest.skip(f"{sys.implementation.name} does not call tp_traverse") - - -# this is the default set of hpy_abi for all the tests. Individual files and -# classes can override it. -SELECTED_ABI_MODE = os.environ.get("TEST_HPY_ABI", None) -if SELECTED_ABI_MODE: - hpy_abi = make_hpy_abi_fixture([SELECTED_ABI_MODE]) -else: - hpy_abi = make_hpy_abi_fixture('default') - - -@pytest.fixture(scope='session') -def hpy_devel(request): - from hpy.devel import HPyDevel - return HPyDevel() - -@pytest.fixture -def leakdetector(hpy_abi): - """ - Automatically detect leaks when the hpy_abi == 'debug' - """ - if 'debug' in hpy_abi: - with LeakDetector() as ld: - yield ld - else: - yield None - -@pytest.fixture -def ExtensionTemplate(): - return DefaultExtensionTemplate - -@pytest.fixture -def compiler(request, tmpdir, hpy_devel, hpy_abi, ExtensionTemplate): - compiler_verbose = request.config.getoption('--compiler-v') - dump_dir = request.config.getoption('--dump-dir') - if dump_dir: - # Test-specific dump dir in format: dump_dir/[mod_][cls_]func - qname_parts = [] - if request.module: - qname_parts.append(request.module.__name__) - if request.cls: - qname_parts.append(request.cls.__name__) - qname_parts.append(request.function.__name__) - test_dump_dir = "_".join(qname_parts).replace(".", "_") - dump_dir = Path(dump_dir).joinpath(test_dump_dir) - dump_dir.mkdir(parents=True, exist_ok=True) - return ExtensionCompiler(tmpdir, hpy_devel, hpy_abi, - compiler_verbose=compiler_verbose, - dump_dir=dump_dir, - ExtensionTemplate=ExtensionTemplate) - - -@pytest.fixture() -def skip_cpython_abi(hpy_abi): - # skip all tests in this class for CPython ABI mode - if hpy_abi == 'cpython': - pytest.skip() - - -@pytest.fixture(scope="session") -def fatal_exit_code(request): - import sys - return { - "linux": -6, # SIGABRT - # See https://bugs.python.org/issue36116#msg336782 -- the - # return code from abort on Windows 8+ is a stack buffer overrun. - # :| - "win32": 0xC0000409, # STATUS_STACK_BUFFER_OVERRUN - }.get(sys.platform, -6) - - -@pytest.fixture -def python_subprocess(request, hpy_abi): - verbose = request.config.getoption('--subprocess-v') - yield PythonSubprocessRunner(verbose, hpy_abi) - - -@pytest.fixture() -def hpy_debug_capture(request, hpy_abi): - assert hpy_abi == 'debug' - with HPyDebugCapture() as reporter: - yield reporter diff --git a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/debug/test_context_reuse.py b/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/debug/test_context_reuse.py deleted file mode 100644 index d6b6881adc..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/debug/test_context_reuse.py +++ /dev/null @@ -1,128 +0,0 @@ -# MIT License -# -# Copyright (c) 2023, 2023, Oracle and/or its affiliates. -# Copyright (c) 2019 pyhandle -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import pytest -from hpytest.support import HPyTest - -pytestmark = pytest.mark.skipif(not HPyTest.supports_debug_mode(), reason="debug mode not supported") - -@pytest.fixture -def hpy_abi(): - return "debug" - - -def test_reuse_context_from_global_variable(compiler, python_subprocess): - mod = compiler.compile_module(""" - #include - - HPyContext *keep; - - HPyDef_METH(f, "f", HPyFunc_NOARGS) - static HPy f_impl(HPyContext *ctx, HPy self) - { - // We wrongly save the context to a global variable - keep = ctx; - return HPy_Dup(ctx, ctx->h_None); - } - - HPyDef_METH(g, "g", HPyFunc_NOARGS) - static HPy g_impl(HPyContext *ctx, HPy self) - { - HPy t = HPy_Dup(ctx, ctx->h_True); - // just checking if the correct context works - if (!HPy_TypeCheck(ctx, t, ctx->h_BoolType)) { - // if the correct context gives us bogus result, - // this will make the test fail - HPy_Close(ctx, t); - return HPy_Dup(ctx, ctx->h_None); - } - HPy_Close(ctx, t); - fprintf(stdout, "Heavy Marmelade\\n"); - fflush(stdout); - // Here we wrongly use "keep" instead of "ctx" - return HPy_Dup(keep, ctx->h_None); - } - - HPyDef_METH(bounce, "bounce", HPyFunc_O) - static HPy bounce_impl(HPyContext *ctx, HPy self, HPy trampoline) - { - fprintf(stdout, "Bouncing...\\n"); - fflush(stdout); - return HPy_CallTupleDict(ctx, trampoline, HPy_NULL, HPy_NULL); - } - - HPyDef_METH(keep_and_bounce, "keep_and_bounce", HPyFunc_O) - static HPy keep_and_bounce_impl(HPyContext *ctx, HPy self, HPy trampoline) - { - fprintf(stdout, "Bouncing differently...\\n"); - fflush(stdout); - keep = ctx; - return HPy_CallTupleDict(ctx, trampoline, HPy_NULL, HPy_NULL); - } - - @EXPORT(f) - @EXPORT(g) - @EXPORT(bounce) - @EXPORT(keep_and_bounce) - @INIT - """) - - code = "mod.f(); mod.g()" - result = python_subprocess.run(mod, code) - assert result.returncode != 0 - assert b"Error: Wrong HPy Context!" in result.stderr - assert result.stdout == b"Heavy Marmelade\n" - - code = "mod.f(); mod.bounce(lambda: mod.g())" - result = python_subprocess.run(mod, code) - assert result.returncode != 0 - assert b"Error: Wrong HPy Context!" in result.stderr - assert result.stdout == b"Bouncing...\nHeavy Marmelade\n" - - # checks the situation when the context cache runs out, - # and we start reusing cached contexts - code = "mod.f(); bounce_cnt = {};\n" \ - "def trampoline():\n" \ - " global bounce_cnt\n" \ - " bounce_cnt -= 1\n" \ - " return mod.bounce(trampoline) if bounce_cnt > 0 else mod.g()\n" \ - "mod.bounce(trampoline)" - - # With the reference HPy debug context implementation if we happen to run - # the usage of 'keep' on the same recycled context as when we saved 'keep', - # then ctx == keep, and it will not fail. - # To keep the test implementation agnostic, we just stress test it with - # different numbers and check that it either crashes with the right error - # or it does not crash and gives the correct result. - HPY_DEBUG_CTX_CACHE_SIZE = 16 - for size in range(HPY_DEBUG_CTX_CACHE_SIZE-1, HPY_DEBUG_CTX_CACHE_SIZE+2): - result = python_subprocess.run(mod, code.format(size)) - assert result.stdout == (b"Bouncing...\n" * size) + b"Heavy Marmelade\n" - if result.returncode != 0: - assert b"Error: Wrong HPy Context!" in result.stderr - - code = 'mod.keep_and_bounce(lambda: mod.g())' - result = python_subprocess.run(mod, code) - assert result.returncode != 0 - assert b"Error: Wrong HPy Context!" in result.stderr - assert result.stdout == b"Bouncing differently...\n" + b"Heavy Marmelade\n" diff --git a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/debug/test_handles_invalid.py b/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/debug/test_handles_invalid.py deleted file mode 100644 index b05ac61bf9..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/debug/test_handles_invalid.py +++ /dev/null @@ -1,250 +0,0 @@ -# Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# The Universal Permissive License (UPL), Version 1.0 -# -# Subject to the condition set forth below, permission is hereby granted to any -# person obtaining a copy of this software, associated documentation and/or -# data (collectively the "Software"), free of charge and under any and all -# copyright rights in the Software, and any and all patent rights owned or -# freely licensable by each licensor hereunder covering either (i) the -# unmodified Software as contributed to or provided by such licensor, or (ii) -# the Larger Works (as defined below), to deal in both -# -# (a) the Software, and -# -# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if -# one is included with the Software each a "Larger Work" to which the Software -# is contributed by such licensors), -# -# without restriction, including without limitation the rights to copy, create -# derivative works of, display, perform, and distribute the Software and make, -# use, sell, offer for sale, import, export, have made, and have sold the -# Software and the Larger Work(s), and to sublicense the foregoing rights on -# either these or other terms. -# -# This license is subject to the following condition: -# -# The above copyright notice and either this complete permission notice or at a -# minimum a reference to the UPL must be included in all copies or substantial -# portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import pytest -from hpy.debug.leakdetector import LeakDetector -from hpytest.support import SUPPORTS_SYS_EXECUTABLE, IS_PYTHON_DEBUG_BUILD, GRAALPYTHON, HPyTest -from hpytest.conftest import IS_VALGRIND_RUN - -pytestmark = pytest.mark.skipif(not HPyTest.supports_debug_mode(), reason="debug mode not supported") - -@pytest.fixture -def hpy_abi(): - with LeakDetector(): - yield "debug" - - -def test_no_invalid_handle(compiler, hpy_debug_capture): - # Basic sanity check that valid code does not trigger any error reports - mod = compiler.make_module(""" - HPyDef_METH(f, "f", HPyFunc_O) - static HPy f_impl(HPyContext *ctx, HPy self, HPy arg) - { - HPy x = HPyLong_FromLong(ctx, 42); - HPy y = HPyLong_FromLong(ctx, 2); - HPy arg_dup = HPy_Dup(ctx, arg); - HPy_Close(ctx, y); - HPy b = HPy_Dup(ctx, x); - HPy_Close(ctx, x); - HPy_Close(ctx, arg_dup); - return b; - } - - @EXPORT(f) - @INIT - """) - assert mod.f("hello") == 42 - assert mod.f("world") == 42 - assert hpy_debug_capture.invalid_handles_count == 0 - - -def test_cant_use_closed_handle(compiler, hpy_debug_capture): - mod = compiler.make_module(""" - HPyDef_METH(f, "f", HPyFunc_O, .doc="double close") - static HPy f_impl(HPyContext *ctx, HPy self, HPy arg) - { - HPy h = HPy_Dup(ctx, arg); - HPy_Close(ctx, h); - HPy_Close(ctx, h); // double close - return HPy_Dup(ctx, ctx->h_None); - } - - HPyDef_METH(g, "g", HPyFunc_O, .doc="use after close") - static HPy g_impl(HPyContext *ctx, HPy self, HPy arg) - { - HPy h = HPy_Dup(ctx, arg); - HPy_Close(ctx, h); - return HPy_Repr(ctx, h); - } - - HPyDef_METH(h, "h", HPyFunc_O, .doc="closing argument") - static HPy h_impl(HPyContext *ctx, HPy self, HPy arg) - { - // Argument is implicitly closed by the caller - HPy_Close(ctx, arg); - return HPy_Dup(ctx, ctx->h_None); - } - - HPyDef_METH(f_noargs, "f_noargs", HPyFunc_NOARGS, .doc="returns arg w/o dupping it") - static HPy f_noargs_impl(HPyContext *ctx, HPy self) - { - // should be: return HPy_Dup(ctx, self); - return self; - } - - HPyDef_METH(f0, "f0", HPyFunc_O, .doc="returns arg w/o dupping it") - static HPy f0_impl(HPyContext *ctx, HPy self, HPy arg) - { - // should be: return HPy_Dup(ctx, arg); - return arg; - } - - HPyDef_METH(f_varargs, "f_varargs", HPyFunc_VARARGS, .doc="returns arg w/o dupping it") - static HPy f_varargs_impl(HPyContext *ctx, HPy self, const HPy *args, size_t nargs) - { - // should be: return HPy_Dup(ctx, args[0]); - return args[0]; - } - - @EXPORT(f) - @EXPORT(g) - @EXPORT(f0) - @EXPORT(f_noargs) - @EXPORT(f_varargs) - @EXPORT(h) - @INIT - """) - mod.f('foo') # double close - assert hpy_debug_capture.invalid_handles_count == 1 - mod.g('bar') # use-after-close - assert hpy_debug_capture.invalid_handles_count == 2 - if not IS_PYTHON_DEBUG_BUILD and not IS_VALGRIND_RUN: - # CPython debug build can also catch these errors, so we cannot trigger - # them when running on debug builds - mod.f0('foo') - assert hpy_debug_capture.invalid_handles_count == 3 - mod.f_noargs() - assert hpy_debug_capture.invalid_handles_count == 4 - mod.f_varargs('foo', 'bar') - assert hpy_debug_capture.invalid_handles_count == 5 - if not GRAALPYTHON: - # GraalPython does not support this test because of the strict - # separation between universal adn debug context. The debug context - # still correctly detects the invalid handle access but later, the - # runtime will still try to close the argument handle and there is - # no means to propagate that information to the handle owner. - # Hence, an assertion will fail. - mod.h('baz') - assert hpy_debug_capture.invalid_handles_count == 6 - - -@pytest.mark.xfail(reason="graalpython does not prevent reuse of leaked handles for other handles and thus cannot always catch this") -def test_keeping_and_reusing_argument_handle(compiler, hpy_debug_capture): - mod = compiler.make_module(""" - HPy keep; - - HPyDef_METH(f, "f", HPyFunc_O) - static HPy f_impl(HPyContext *ctx, HPy self, HPy arg) - { - keep = arg; - return HPy_Dup(ctx, ctx->h_None); - } - - HPyDef_METH(g, "g", HPyFunc_NOARGS) - static HPy g_impl(HPyContext *ctx, HPy self) - { - HPy_ssize_t len = HPy_Length(ctx, keep); - return HPyLong_FromSsize_t(ctx, len); - } - - @EXPORT(f) - @EXPORT(g) - @INIT - """) - s = "hello leaks!" - mod.f(s) - assert hpy_debug_capture.invalid_handles_count == 0 - assert mod.g() == len(s) - assert hpy_debug_capture.invalid_handles_count == 1 - - -def test_return_ctx_constant_without_dup(compiler, python_subprocess, fatal_exit_code): - # Since this puts the context->h_None into an inconsistent state, we run - # this test in a subprocess and check fatal error instead - if not SUPPORTS_SYS_EXECUTABLE: - pytest.skip("no sys.executable") - - mod = compiler.compile_module(""" - HPyDef_METH(f, "f", HPyFunc_NOARGS) - static HPy f_impl(HPyContext *ctx, HPy self) - { - return ctx->h_None; - } - - @EXPORT(f) - @INIT - """) - result = python_subprocess.run(mod, "mod.f();") - assert result.returncode == fatal_exit_code - assert b"Invalid usage of already closed handle" in result.stderr - - -def test_close_ctx_constant(compiler, python_subprocess, fatal_exit_code): - # Since this puts the context->h_True into an inconsistent state, we run - # this test in a subprocess and check fatal error instead - if not SUPPORTS_SYS_EXECUTABLE: - pytest.skip("no sys.executable") - - mod = compiler.compile_module(""" - HPyDef_METH(f, "f", HPyFunc_NOARGS) - static HPy f_impl(HPyContext *ctx, HPy self) - { - HPy_Close(ctx, ctx->h_True); - return HPy_Dup(ctx, ctx->h_False); - } - - @EXPORT(f) - @INIT - """) - result = python_subprocess.run(mod, "mod.f();") - assert result.returncode == fatal_exit_code - assert b"Invalid usage of already closed handle" in result.stderr - - -@pytest.mark.xfail(reason="set_handle_stack_trace_limit not implemented yet") -def test_invalid_handle_crashes_python_if_no_hook(compiler, python_subprocess, fatal_exit_code): - if not SUPPORTS_SYS_EXECUTABLE: - pytest.skip("no sys.executable") - - mod = compiler.compile_module(""" - HPyDef_METH(f, "f", HPyFunc_O, .doc="double close") - static HPy f_impl(HPyContext *ctx, HPy self, HPy arg) - { - HPy h = HPy_Dup(ctx, arg); - HPy_Close(ctx, h); - HPy_Close(ctx, h); // double close - return HPy_Dup(ctx, ctx->h_None); - } - - @EXPORT(f) - @INIT - """) - result = python_subprocess.run(mod, "mod.f(42);") - assert result.returncode == fatal_exit_code - assert b"Invalid usage of already closed handle" in result.stderr diff --git a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/hpy_devel/test_abitag.py b/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/hpy_devel/test_abitag.py deleted file mode 100644 index 1daedcbcfe..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/hpy_devel/test_abitag.py +++ /dev/null @@ -1,48 +0,0 @@ -# MIT License -# -# Copyright (c) 2023, 2023, Oracle and/or its affiliates. -# Copyright (c) 2019 pyhandle -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from hpy.devel.abitag import parse_ext_suffix, get_hpy_ext_suffix, HPY_ABI_TAG - -def test_parse_ext_suffix_ext(): - _, ext = parse_ext_suffix('.cpython-310-x86_64-linux-gnu.so') - assert ext == 'so' - -def test_parse_ext_suffix_abi_tag(): - def abi_tag(suffix): - tag, ext = parse_ext_suffix(suffix) - return tag - - assert abi_tag('.cpython-38-x86_64-linux-gnu.so') == 'cp38' - assert abi_tag('.cpython-38d-x86_64-linux-gnu.so') == 'cp38d' - assert abi_tag('.cpython-310-x86_64-linux-gnu.so') == 'cp310' - assert abi_tag('.cpython-310d-x86_64-linux-gnu.so') == 'cp310d' - assert abi_tag('.cpython-310-darwin.so') == 'cp310' - assert abi_tag('.cp310-win_amd64.pyd') == 'cp310' - assert abi_tag('.pypy38-pp73-x86_64-linux-gnu.so') == 'pypy38-pp73' - assert abi_tag('.graalpy-38-native-x86_64-darwin.dylib') == 'graalpy-38-native' - -def test_get_hpy_ext_suffix(): - get = get_hpy_ext_suffix - hpy0 = HPY_ABI_TAG - assert get('universal', '.cpython-38-x86_64-linux-gnu.so') == f'.{hpy0}.so' - assert get('hybrid', '.cpython-38-x86_64-linux-gnu.so') == f'.{hpy0}-cp38.so' diff --git a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_capsule_legacy.py b/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_capsule_legacy.py deleted file mode 100644 index 364baa3f13..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_capsule_legacy.py +++ /dev/null @@ -1,109 +0,0 @@ -# MIT License -# -# Copyright (c) 2023, 2023, Oracle and/or its affiliates. -# Copyright (c) 2019 pyhandle -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import pytest -from .support import HPyTest, make_hpy_abi_fixture -from .test_capsule import CapsuleTemplate - -hpy_abi = make_hpy_abi_fixture('with hybrid') - -class TestHPyCapsuleLegacy(HPyTest): - - ExtensionTemplate = CapsuleTemplate - - def test_legacy_capsule_compat(self): - import pytest - mod = self.make_module(""" - @DEFINE_strdup - - #include - #include - - static int dummy = 123; - - static void legacy_destructor(PyObject *capsule) - { - /* We need to use C lib 'free' because the string was - created with 'strdup0'. */ - free((void *) PyCapsule_GetName(capsule)); - } - - HPyDef_METH(Create_pycapsule, "create_pycapsule", HPyFunc_O) - static HPy Create_pycapsule_impl(HPyContext *ctx, HPy self, HPy arg) - { - HPy_ssize_t n; - const char *name = HPyUnicode_AsUTF8AndSize(ctx, arg, &n); - char *name_copy = strdup0(name); - if (name_copy == NULL) { - HPyErr_SetString(ctx, ctx->h_MemoryError, "out of memory"); - return HPy_NULL; - } - PyObject *legacy_caps = PyCapsule_New(&dummy, (const char *) name_copy, - legacy_destructor); - HPy res = HPy_FromPyObject(ctx, legacy_caps); - Py_DECREF(legacy_caps); - return res; - } - - HPyDef_METH(Capsule_get, "get", HPyFunc_O) - static HPy Capsule_get_impl(HPyContext *ctx, HPy self, HPy arg) - { - HPy res = HPy_NULL; - HPy h_value = HPy_NULL; - int *ptr = NULL; - - const char *name = HPyCapsule_GetName(ctx, arg); - if (name == NULL && HPyErr_Occurred(ctx)) { - return HPy_NULL; - } - HPy h_name = HPyUnicode_FromString(ctx, name); - if (HPy_IsNull(h_name)) { - goto finish; - } - - ptr = (int *) HPyCapsule_GetPointer(ctx, arg, name); - if (ptr == NULL && HPyErr_Occurred(ctx)) { - goto finish; - } - - h_value = HPyLong_FromLong(ctx, *ptr); - if (HPy_IsNull(h_value)) { - goto finish; - } - - res = HPyTuple_Pack(ctx, 2, h_name, h_value); - - finish: - HPy_Close(ctx, h_name); - HPy_Close(ctx, h_value); - return res; - } - - @EXPORT(Create_pycapsule) - @EXPORT(Capsule_get) - - @INIT - """) - name = "legacy_capsule" - p = mod.create_pycapsule(name) - assert mod.get(p) == (name, 123) diff --git a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_contextvar.py b/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_contextvar.py deleted file mode 100644 index 88558b7ee3..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_contextvar.py +++ /dev/null @@ -1,75 +0,0 @@ -# MIT License -# -# Copyright (c) 2023, 2023, Oracle and/or its affiliates. -# Copyright (c) 2019 pyhandle -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -""" -NOTE: this tests are also meant to be run as PyPy "applevel" tests. - -This means that global imports will NOT be visible inside the test -functions. In particular, you have to "import pytest" inside the test in order -to be able to use e.g. pytest.raises (which on PyPy will be implemented by a -"fake pytest module") -""" -from .support import HPyTest - - -class TestHPyContextVar(HPyTest): - - def test_basics(self): - mod = self.make_module(""" - HPyDef_METH(new_ctxv, "new_ctxv", HPyFunc_NOARGS) - static HPy new_ctxv_impl(HPyContext *ctx, HPy self) - { - return HPyContextVar_New(ctx, "test_contextvar", HPy_NULL); - } - - HPyDef_METH(set_ctxv, "set_ctxv", HPyFunc_VARARGS) - static HPy set_ctxv_impl(HPyContext *ctx, HPy self, const HPy *args, size_t nargs) - { - HPy obj, val; - if (!HPyArg_Parse(ctx, NULL, args, nargs, "OO", &obj, &val)) - return HPy_NULL; - return HPyContextVar_Set(ctx, obj, val); - } - HPyDef_METH(get_ctxv, "get_ctxv", HPyFunc_VARARGS) - static HPy get_ctxv_impl(HPyContext *ctx, HPy self, const HPy *args, size_t nargs) - { - HPy obj, def=HPy_NULL, val; - if (!HPyArg_Parse(ctx, NULL, args, nargs, "O|O", &obj, &def)) - return HPy_NULL; - if (HPyContextVar_Get(ctx, obj, def, &val) < 0) { - return HPy_NULL; - } - return val; - } - - - @EXPORT(new_ctxv) - @EXPORT(get_ctxv) - @EXPORT(set_ctxv) - @INIT - """) - var = mod.new_ctxv() - tok = mod.set_ctxv(var, 4) - assert tok.var is var - four = mod.get_ctxv(var) - assert four == 4 diff --git a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_eval.py b/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_eval.py deleted file mode 100644 index d019012245..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_eval.py +++ /dev/null @@ -1,110 +0,0 @@ -# MIT License -# -# Copyright (c) 2023, 2023, Oracle and/or its affiliates. -# Copyright (c) 2019 pyhandle -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from textwrap import dedent -from .support import HPyTest - -class TestEval(HPyTest): - def test_compile(self): - import pytest - mod = self.make_module(""" - HPyDef_METH(f, "f", HPyFunc_VARARGS) - static HPy f_impl(HPyContext *ctx, HPy self, const HPy *args, size_t nargs) - { - const char *source, *filename; - HPy_SourceKind src_kind; - int src_kind_i; - if (!HPyArg_Parse(ctx, NULL, args, nargs, "ssi", &source, &filename, &src_kind_i)) - return HPy_NULL; - - switch (src_kind_i) - { - case 0: src_kind = HPy_SourceKind_Expr; break; - case 1: src_kind = HPy_SourceKind_File; break; - case 2: src_kind = HPy_SourceKind_Single; break; - default: - // just pass through for testing - src_kind = (HPy_SourceKind) src_kind_i; - } - return HPy_Compile_s(ctx, source, filename, src_kind); - } - @EXPORT(f) - @INIT - """) - c0 = mod.f("1 + 2", "hello0.py", 0) - assert c0 - assert c0.co_filename == "hello0.py" - assert eval(c0) == 3 - - c1 = mod.f(dedent(""" - a = 1 - b = 2 - def add(x, y): - return x + y - res = add(a, b) - """), "hello1.py", 1) - globals1 = dict() - locals1 = dict() - assert eval(c1, globals1, locals1) is None - assert "add" in locals1, "was: %r" % locals1 - assert locals1["a"] == 1 - assert locals1["b"] == 2 - assert locals1["res"] == 3 - - c2 = mod.f("x = 1 + 2", "hello2.py", 2) - locals2 = dict() - assert eval(c2, dict(), locals2) is None - assert locals2["x"] == 3 - - with pytest.raises(SyntaxError): - mod.f("1 +.", "hello1.c", 0) - - with pytest.raises(SystemError): - mod.f("1+2", "hello.c", 777) - - def test_eval_code(self): - import pytest - mod = self.make_module(""" - HPyDef_METH(f, "f", HPyFunc_VARARGS) - static HPy f_impl(HPyContext *ctx, HPy self, const HPy *args, size_t nargs) - { - if (nargs != 3) { - HPyErr_SetString(ctx, ctx->h_TypeError, "expected exactly 3 args"); - return HPy_NULL; - } - return HPy_EvalCode(ctx, args[0], args[1], args[2]); - } - @EXPORT(f) - @INIT - """) - c0 = compile("a + b", "hello.py", "eval") - assert mod.f(c0, dict(), dict(a=2, b=3)) == 5 - - locals1 = dict(a=10, b=20) - c1 = compile("x = a + b", "hello.py", "exec") - assert mod.f(c1, dict(), locals1) is None - assert locals1['x'] == 30 - - c0 = compile("raise ValueError", "hello.py", "exec") - with pytest.raises(ValueError): - mod.f(c0, dict(__builtins__=__builtins__), dict()) diff --git a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_hpyglobal.py b/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_hpyglobal.py deleted file mode 100644 index b5d43ee628..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_hpyglobal.py +++ /dev/null @@ -1,123 +0,0 @@ -# Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# The Universal Permissive License (UPL), Version 1.0 -# -# Subject to the condition set forth below, permission is hereby granted to any -# person obtaining a copy of this software, associated documentation and/or -# data (collectively the "Software"), free of charge and under any and all -# copyright rights in the Software, and any and all patent rights owned or -# freely licensable by each licensor hereunder covering either (i) the -# unmodified Software as contributed to or provided by such licensor, or (ii) -# the Larger Works (as defined below), to deal in both -# -# (a) the Software, and -# -# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if -# one is included with the Software each a "Larger Work" to which the Software -# is contributed by such licensors), -# -# without restriction, including without limitation the rights to copy, create -# derivative works of, display, perform, and distribute the Software and make, -# use, sell, offer for sale, import, export, have made, and have sold the -# Software and the Larger Work(s), and to sublicense the foregoing rights on -# either these or other terms. -# -# This license is subject to the following condition: -# -# The above copyright notice and either this complete permission notice or at a -# minimum a reference to the UPL must be included in all copies or substantial -# portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -""" -NOTE: this tests are also meant to be run as PyPy "applevel" tests. - -This means that global imports will NOT be visible inside the test -functions. In particular, you have to "import pytest" inside the test in order -to be able to use e.g. pytest.raises (which on PyPy will be implemented by a -"fake pytest module") -""" -from .support import HPyTest - - -class TestHPyGlobal(HPyTest): - - def test_basics(self): - mod = self.make_module(""" - HPyGlobal myglobal; - - HPyDef_METH(setg, "setg", HPyFunc_O) - static HPy setg_impl(HPyContext *ctx, HPy self, HPy arg) - { - HPyGlobal_Store(ctx, &myglobal, arg); - return HPy_Dup(ctx, ctx->h_None); - } - - HPyDef_METH(getg, "getg", HPyFunc_NOARGS) - static HPy getg_impl(HPyContext *ctx, HPy self) - { - return HPyGlobal_Load(ctx, myglobal); - } - - @EXPORT(setg) - @EXPORT(getg) - @EXPORT_GLOBAL(myglobal) - @INIT - """) - obj = {'hello': 'world'} - assert mod.setg(obj) is None - assert mod.getg() is obj - - def test_twoglobals(self): - mod = self.make_module(""" - HPyGlobal myglobal1; - HPyGlobal myglobal2; - - HPyDef_METH(setg1, "setg1", HPyFunc_O) - static HPy setg1_impl(HPyContext *ctx, HPy self, HPy arg) - { - HPyGlobal_Store(ctx, &myglobal1, arg); - return HPy_Dup(ctx, ctx->h_None); - } - - HPyDef_METH(setg2, "setg2", HPyFunc_O) - static HPy setg2_impl(HPyContext *ctx, HPy self, HPy arg) - { - HPyGlobal_Store(ctx, &myglobal2, arg); - return HPy_Dup(ctx, ctx->h_None); - } - - HPyDef_METH(getg1, "getg1", HPyFunc_NOARGS) - static HPy getg1_impl(HPyContext *ctx, HPy self) - { - return HPyGlobal_Load(ctx, myglobal1); - } - - HPyDef_METH(getg2, "getg2", HPyFunc_NOARGS) - static HPy getg2_impl(HPyContext *ctx, HPy self) - { - return HPyGlobal_Load(ctx, myglobal2); - } - - @EXPORT(setg1) - @EXPORT(setg2) - @EXPORT(getg1) - @EXPORT(getg2) - @EXPORT_GLOBAL(myglobal1) - @EXPORT_GLOBAL(myglobal2) - @INIT - """) - obj1 = {'hello': 'world'} - obj2 = {'foo': 'bar'} - assert mod.setg1(obj1) is None - assert mod.setg2(obj2) is None - assert mod.getg1() is obj1 - assert mod.getg2() is obj2 diff --git a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_hpyimport.py b/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_hpyimport.py deleted file mode 100644 index bf9b2edb55..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_hpyimport.py +++ /dev/null @@ -1,47 +0,0 @@ -# MIT License -# -# Copyright (c) 2021, 2024, Oracle and/or its affiliates. -# Copyright (c) 2019 pyhandle -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from .support import HPyTest - -class TestImport(HPyTest): - - def test_ImportModule(self): - import pytest - import sys - mod = self.make_module(""" - HPyDef_METH(f, "f", HPyFunc_O) - static HPy f_impl(HPyContext *ctx, HPy self, HPy h_name) - { - // we use bytes because ATM we don't have HPyUnicode_AsUTF8 or similar - const char *name = HPyBytes_AsString(ctx, h_name); - if (name == NULL) - return HPy_NULL; - return HPyImport_ImportModule(ctx, name); - } - @EXPORT(f) - @INIT - """) - sys2 = mod.f(b'sys') - assert sys is sys2 - with pytest.raises(ImportError): - mod.f(b'This is the name of a module which does not exist, hopefully') diff --git a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_hpylist.py b/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_hpylist.py deleted file mode 100644 index 1c3eaa1d96..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_hpylist.py +++ /dev/null @@ -1,100 +0,0 @@ -# MIT License -# -# Copyright (c) 2020, 2023, Oracle and/or its affiliates. -# Copyright (c) 2019 pyhandle -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from .support import HPyTest - -class TestList(HPyTest): - - def test_Check(self): - mod = self.make_module(""" - HPyDef_METH(f, "f", HPyFunc_O) - static HPy f_impl(HPyContext *ctx, HPy self, HPy arg) - { - if (HPyList_Check(ctx, arg)) - return HPy_Dup(ctx, ctx->h_True); - return HPy_Dup(ctx, ctx->h_False); - } - @EXPORT(f) - @INIT - """) - class MyList(list): - pass - - assert mod.f([]) is True - assert mod.f('hello') is False - assert mod.f(MyList()) is True - - def test_New(self): - mod = self.make_module(""" - HPyDef_METH(f, "f", HPyFunc_NOARGS) - static HPy f_impl(HPyContext *ctx, HPy self) - { - return HPyList_New(ctx, 0); - } - @EXPORT(f) - @INIT - """) - assert mod.f() == [] - - def test_Append(self): - mod = self.make_module(""" - HPyDef_METH(f, "f", HPyFunc_O) - static HPy f_impl(HPyContext *ctx, HPy self, HPy arg) - { - HPy list = HPyList_New(ctx, 0); - if (HPy_IsNull(list)) - return HPy_NULL; - if (HPyList_Append(ctx, list, arg) == -1) - return HPy_NULL; - if (HPyList_Append(ctx, list, arg) == -1) - return HPy_NULL; - return list; - } - @EXPORT(f) - @INIT - """) - assert mod.f(42) == [42, 42] - - def test_ListBuilder(self): - mod = self.make_module(""" - HPyDef_METH(f, "f", HPyFunc_O) - static HPy f_impl(HPyContext *ctx, HPy h_self, HPy h_arg) - { - HPyListBuilder builder = HPyListBuilder_New(ctx, 3); - HPyListBuilder_Set(ctx, builder, 0, h_arg); - HPyListBuilder_Set(ctx, builder, 1, ctx->h_True); - HPy h_num = HPyLong_FromLong(ctx, -42); - if (HPy_IsNull(h_num)) - { - HPyListBuilder_Cancel(ctx, builder); - return HPy_NULL; - } - HPyListBuilder_Set(ctx, builder, 2, h_num); - HPy_Close(ctx, h_num); - HPy h_list = HPyListBuilder_Build(ctx, builder); - return h_list; - } - @EXPORT(f) - @INIT - """) - assert mod.f("xy") == ["xy", True, -42] diff --git a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_hpytuple.py b/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_hpytuple.py deleted file mode 100644 index 90c366822b..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_hpytuple.py +++ /dev/null @@ -1,104 +0,0 @@ -# MIT License -# -# Copyright (c) 2020, 2023, Oracle and/or its affiliates. -# Copyright (c) 2019 pyhandle -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from .support import HPyTest - -class TestTuple(HPyTest): - - def test_Check(self): - mod = self.make_module(""" - HPyDef_METH(f, "f", HPyFunc_O) - static HPy f_impl(HPyContext *ctx, HPy self, HPy arg) - { - if (HPyTuple_Check(ctx, arg)) - return HPy_Dup(ctx, ctx->h_True); - return HPy_Dup(ctx, ctx->h_False); - } - @EXPORT(f) - @INIT - """) - class MyTuple(tuple): - pass - - assert mod.f(()) is True - assert mod.f([]) is False - assert mod.f(MyTuple()) is True - - def test_FromArray(self): - mod = self.make_module(""" - HPyDef_METH(f, "f", HPyFunc_O) - static HPy f_impl(HPyContext *ctx, HPy self, HPy arg) - { - HPy x = HPyLong_FromLong(ctx, 42); - if (HPy_IsNull(x)) - return HPy_NULL; - HPy items[] = {self, arg, x}; - HPy res = HPyTuple_FromArray(ctx, items, 3); - HPy_Close(ctx, x); - return res; - } - @EXPORT(f) - @INIT - """) - assert mod.f('hello') == (mod, 'hello', 42) - - def test_Pack(self): - mod = self.make_module(""" - HPyDef_METH(f, "f", HPyFunc_O) - static HPy f_impl(HPyContext *ctx, HPy self, HPy arg) - { - HPy x = HPyLong_FromLong(ctx, 42); - if (HPy_IsNull(x)) - return HPy_NULL; - HPy result = HPyTuple_Pack(ctx, 3, self, arg, x); - HPy_Close(ctx, x); - return result; - } - @EXPORT(f) - @INIT - """) - assert mod.f('hello') == (mod, 'hello', 42) - - def test_TupleBuilder(self): - mod = self.make_module(""" - HPyDef_METH(f, "f", HPyFunc_O) - static HPy f_impl(HPyContext *ctx, HPy h_self, HPy h_arg) - { - HPyTupleBuilder builder = HPyTupleBuilder_New(ctx, 3); - HPyTupleBuilder_Set(ctx, builder, 0, h_arg); - HPyTupleBuilder_Set(ctx, builder, 1, ctx->h_True); - HPy h_num = HPyLong_FromLong(ctx, -42); - if (HPy_IsNull(h_num)) - { - HPyTupleBuilder_Cancel(ctx, builder); - return HPy_NULL; - } - HPyTupleBuilder_Set(ctx, builder, 2, h_num); - HPy_Close(ctx, h_num); - HPy h_tuple = HPyTupleBuilder_Build(ctx, builder); - return h_tuple; - } - @EXPORT(f) - @INIT - """) - assert mod.f("xy") == ("xy", True, -42) diff --git a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_importing.py b/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_importing.py deleted file mode 100644 index 0085dac5a8..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_importing.py +++ /dev/null @@ -1,78 +0,0 @@ -# MIT License -# -# Copyright (c) 2020, 2023, Oracle and/or its affiliates. -# Copyright (c) 2019 pyhandle -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import pytest -from .support import HPyTest -from hpy.devel.abitag import get_hpy_ext_suffix - -@pytest.fixture(params=['cpython', 'universal', 'hybrid'] + (['debug'] if HPyTest.supports_debug_mode() else [])) -def hpy_abi(request): - abi = request.param - yield abi - - -class TestImporting(HPyTest): - - def full_import(self, name, mod_filename): - import importlib - import sys - import os - if name in sys.modules: - raise ValueError( - "Test module {!r} already present in sys.modules".format(name)) - importlib.invalidate_caches() - mod_dir = os.path.dirname(mod_filename) - sys.path.insert(0, mod_dir) - try: - module = importlib.import_module(name) - assert sys.modules[name] is module - finally: - # assert that the module import didn't change the sys.path entry - # that was added above, then remove the entry. - assert sys.path[0] == mod_dir - del sys.path[0] - if name in sys.modules: - del sys.modules[name] - return module - - def test_importing_attributes(self, hpy_abi, tmpdir): - import pytest - if not self.supports_ordinary_make_module_imports(): - pytest.skip() - mod = self.make_module(""" - @INIT - """, name='mytest') - mod = self.full_import(mod.__name__, mod.__file__) - assert mod.__name__ == 'mytest' - assert mod.__package__ == '' - assert mod.__doc__ == 'some test for hpy' - assert mod.__loader__.name == 'mytest' - assert mod.__spec__.loader is mod.__loader__ - assert mod.__spec__.name == 'mytest' - assert mod.__file__ - - if hpy_abi == 'debug': - hpy_abi = 'universal' - ext_suffix = get_hpy_ext_suffix(hpy_abi) - assert repr(mod) == ''.format( - repr(str(tmpdir.join('mytest' + ext_suffix)))) diff --git a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_legacy_forbidden.py b/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_legacy_forbidden.py deleted file mode 100644 index 5ff6f91976..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_legacy_forbidden.py +++ /dev/null @@ -1,102 +0,0 @@ -# MIT License -# -# Copyright (c) 2023, 2023, Oracle and/or its affiliates. -# Copyright (c) 2019 pyhandle -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - - -""" -In this file we check that if we use legacy features in universal mode, we -get the expected compile time errors -""" - -import sys -import pytest -from .support import HPyTest, make_hpy_abi_fixture, ONLY_LINUX - -# this is not strictly correct, we should check whether the actual compiler -# is GCC. But for the CI and most cases, it's enough to assume that if we are -# on linux we are using GCC. -# -# We need this because some of the nice compilation errors (such as the ones -# causes by _HPY_LEGACY) are triggered only by gcc. Would be nice to have them -# also for other compilers -ONLY_GCC = ONLY_LINUX - -pytestmark = pytest.mark.skip("capfd not working properly on GraalPy") - -class TestLegacyForbidden(HPyTest): - - hpy_abi = make_hpy_abi_fixture(['universal'], class_fixture=True) - - LEGACY_ERROR = "Cannot use legacy functions when targeting the HPy Universal ABI" - - def test_expect_make_error(self): - src = """ - #error "this is a compile time error" - """ - self.expect_make_error(src, "this is a compile time error") - - @pytest.mark.skip("different include dir order on GraalPy") - def test_Python_h_forbidden(self, capfd): - src = """ - #include - @INIT - """ - self.expect_make_error(src, - "It is forbidden to #include " - "when targeting the HPy Universal ABI") - - @ONLY_GCC - def test_HPy_AsPyObject(self, capfd): - # NOTE: in this test we don't include Python.h. We want to test that - # we get a nice compile-time error by just calling HPy_AsPyObject. - # that's why we use "cpy_PyObject" (which is available because defined - # by hpy.h) - src = """ - HPyDef_METH(f, "f", HPyFunc_NOARGS) - static HPy f_impl(HPyContext *ctx, HPy self) - { - cpy_PyObject *pyobj = HPy_AsPyObject(ctx, self); - (void)pyobj; // silence the warning about unused variable - return HPy_NULL; - } - @EXPORT(f) - @INIT - """ - self.expect_make_error(src, self.LEGACY_ERROR) - - @ONLY_GCC - def test_HPy_FromPyObject(self, capfd): - # NOTE: in this test we don't include Python.h. We want to test that - # we get a nice compile-time error by just calling HPy_AsPyObject. - # that's why we use "cpy_PyObject" (which is available because defined - # by hpy.h) - src = """ - HPyDef_METH(f, "f", HPyFunc_NOARGS) - static HPy f_impl(HPyContext *ctx, HPy self) - { - cpy_PyObject *pyobj = NULL; - return HPy_FromPyObject(ctx, pyobj); - } - @EXPORT(f) - @INIT - """ - self.expect_make_error(src, self.LEGACY_ERROR) diff --git a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_number.py b/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_number.py deleted file mode 100644 index 347bd6d675..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_number.py +++ /dev/null @@ -1,270 +0,0 @@ -# MIT License -# -# Copyright (c) 2020, 2023, Oracle and/or its affiliates. -# Copyright (c) 2019 pyhandle -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from .support import HPyTest - - -class TestNumber(HPyTest): - - def test_bool_from_bool_and_long(self): - import pytest - mod = self.make_module(""" - HPyDef_METH(from_bool, "from_bool", HPyFunc_O) - static HPy from_bool_impl(HPyContext *ctx, HPy self, HPy arg) - { - int32_t x = HPyLong_AsInt32_t(ctx, arg); - if (x == -1 && HPyErr_Occurred(ctx)) - return HPy_NULL; - if (x != 0 && x != 1) { - HPyErr_SetString(ctx, ctx->h_ValueError, - "value must be 0 or 1"); - return HPy_NULL; - } - return HPyBool_FromBool(ctx, (x ? true : false)); - } - - HPyDef_METH(from_long, "from_long", HPyFunc_O) - static HPy from_long_impl(HPyContext *ctx, HPy self, HPy arg) - { - long x = HPyLong_AsLong(ctx, arg); - if (x == -1 && HPyErr_Occurred(ctx)) - return HPy_NULL; - return HPyBool_FromLong(ctx, x); - } - @EXPORT(from_bool) - @EXPORT(from_long) - @INIT - """) - assert mod.from_bool(0) is False - assert mod.from_bool(1) is True - with pytest.raises(ValueError): - mod.from_bool(2) - assert mod.from_long(0) is False - assert mod.from_long(42) is True - - def test_unary(self): - import pytest - import operator - ops = ( - ('Negative', operator.neg), - ('Positive', operator.pos), - ('Absolute', abs), - ('Invert', operator.invert), - ('Index', operator.index), - ('Long', int), - ('Float', float), - ) - template = """ - HPyDef_METH(f_{c_name}, "f_{c_name}", HPyFunc_O) - static HPy f_{c_name}_impl(HPyContext *ctx, HPy self, HPy arg) - {{ - return HPy_{c_name}(ctx, arg); - }} - @EXPORT(f_{c_name}) - """ - code = [] - for c_name, _ in ops: - code.append(template.format(c_name=c_name)) - code.append('@INIT') - mod = self.make_module('\n'.join(code), name='unary_ops') - for c_name, op in ops: - c_op = getattr(mod, 'f_%s' % c_name) - assert c_op(-5) == op(-5) - assert c_op(6) == op(6) - try: - res = op(4.75) - except Exception as e: - with pytest.raises(e.__class__): - c_op(4.75) - else: - assert c_op(4.75) == res - - def test_binary(self): - import operator - ops = ( - ('Add', operator.add), - ('Subtract', operator.sub), - ('Multiply', operator.mul), - ('FloorDivide', operator.floordiv), - ('TrueDivide', operator.truediv), - ('Remainder', operator.mod), - ('Divmod', divmod), - ('Lshift', operator.lshift), - ('Rshift', operator.rshift), - ('And', operator.and_), - ('Xor', operator.xor), - ('Or', operator.or_), - ) - template = """ - HPyDef_METH(f_{c_name}, "f_{c_name}", HPyFunc_VARARGS) - static HPy f_{c_name}_impl(HPyContext *ctx, HPy self, - const HPy *args, size_t nargs) - {{ - HPy a, b; - if (!HPyArg_Parse(ctx, NULL, args, nargs, "OO", &a, &b)) - return HPy_NULL; - return HPy_{c_name}(ctx, a, b); - }} - @EXPORT(f_{c_name}) - """ - code = [] - for c_name, _ in ops: - code.append(template.format(c_name=c_name)) - code.append('@INIT') - mod = self.make_module('\n'.join(code), name='binary_ops') - for c_name, op in ops: - c_op = getattr(mod, 'f_%s' % c_name) - assert c_op(5, 4) == op(5, 4) - assert c_op(6, 3) == op(6, 3) - - def test_power(self): - mod = self.make_module(""" - HPyDef_METH(f, "f", HPyFunc_VARARGS) - static HPy f_impl(HPyContext *ctx, HPy self, - const HPy *args, size_t nargs) - { - HPy a, b, c; - if (!HPyArg_Parse(ctx, NULL, args, nargs, "OOO", &a, &b, &c)) - return HPy_NULL; - return HPy_Power(ctx, a, b, c); - } - @EXPORT(f) - @INIT - """) - assert mod.f(4, 5, None) == 4 ** 5 - assert mod.f(4, 5, 7) == pow(4, 5, 7) - - def test_matmul(self): - class Mat: - def __matmul__(self, other): - return ('matmul', self, other) - m1 = Mat() - m2 = Mat() - mod = self.make_module(""" - HPyDef_METH(f, "f", HPyFunc_VARARGS) - static HPy f_impl(HPyContext *ctx, HPy self, - const HPy *args, size_t nargs) - { - HPy a, b; - if (!HPyArg_Parse(ctx, NULL, args, nargs, "OO", &a, &b)) - return HPy_NULL; - return HPy_MatrixMultiply(ctx, a, b); - } - @EXPORT(f) - @INIT - """) - assert mod.f(m1, m2) == m1.__matmul__(m2) - - def test_inplace_binary(self): - import operator - for c_name, py_name in [ - ('Add', '__iadd__'), - ('Subtract', '__isub__'), - ('Multiply', '__imul__'), - ('FloorDivide', '__ifloordiv__'), - ('TrueDivide', '__itruediv__'), - ('Remainder', '__imod__'), - ('Lshift', '__ilshift__'), - ('Rshift', '__irshift__'), - ('And', '__iand__'), - ('Xor', '__ixor__'), - ('Or', '__ior__'), - ]: - mod = self.make_module(""" - HPyDef_METH(f, "f", HPyFunc_VARARGS) - static HPy f_impl(HPyContext *ctx, HPy self, - const HPy *args, size_t nargs) - { - HPy a, b; - if (!HPyArg_Parse(ctx, NULL, args, nargs, "OO", &a, &b)) - return HPy_NULL; - return HPy_InPlace%s(ctx, a, b); - } - @EXPORT(f) - @INIT - """ % (c_name,), name='number_'+c_name) - class A: - def mymethod(self, b): - return (py_name, b) - setattr(A, py_name, A.mymethod) - assert mod.f(A(), 12.34) == A().mymethod(12.34) - - def test_inplace_power(self): - mod = self.make_module(""" - HPyDef_METH(f, "f", HPyFunc_VARARGS) - static HPy f_impl(HPyContext *ctx, HPy self, - const HPy *args, size_t nargs) - { - HPy a, b, c; - if (!HPyArg_Parse(ctx, NULL, args, nargs, "OOO", &a, &b, &c)) - return HPy_NULL; - return HPy_InPlacePower(ctx, a, b, c); - } - @EXPORT(f) - @INIT - """) - class A: - def __ipow__(self, b): - return ('ipow', b) - # the behavior of PyNumber_InPlacePower is weird: if __ipow__ is - # defined, the 3rd arg is always ignored, even if the doc say the - # opposite - assert mod.f(A(), 5, None) == A().__ipow__(5) - assert mod.f(A(), 7, 'hello') == A().__ipow__(7) - assert mod.f(4, 5, 7) == pow(4, 5, 7) - - def test_inplace_matmul(self): - class Mat: - def __imatmul__(self, other): - return ('imatmul', self, other) - m1 = Mat() - m2 = Mat() - mod = self.make_module(""" - HPyDef_METH(f, "f", HPyFunc_VARARGS) - static HPy f_impl(HPyContext *ctx, HPy self, - const HPy *args, size_t nargs) - { - HPy a, b; - if (!HPyArg_Parse(ctx, NULL, args, nargs, "OO", &a, &b)) - return HPy_NULL; - return HPy_InPlaceMatrixMultiply(ctx, a, b); - } - @EXPORT(f) - @INIT - """) - assert mod.f(m1, m2) == m1.__imatmul__(m2) - - def test_number_check(self): - mod = self.make_module(""" - HPyDef_METH(f, "f", HPyFunc_O) - static HPy f_impl(HPyContext *ctx, HPy self, HPy arg) - { - int cond = HPyNumber_Check(ctx, arg); - return HPyLong_FromLong(ctx, cond); - } - @EXPORT(f) - @INIT - """) - assert mod.f("foo") == 0 - assert mod.f(42) == 1 - assert mod.f(42.1) == 1 diff --git a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_support.py b/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_support.py deleted file mode 100644 index 09745b1793..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/test_support.py +++ /dev/null @@ -1,73 +0,0 @@ -# MIT License -# -# Copyright (c) 2020, 2023, Oracle and/or its affiliates. -# Copyright (c) 2019 pyhandle -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import pytest -from pathlib import Path -from . import support - - -def expand_template(template, name): - return support.DefaultExtensionTemplate(template, name).expand() - - -def test_expand_template(): - expanded = expand_template(""" - @EXPORT(f) - @EXPORT(g) - some more C stuff - @INIT - """, name='mytest') - defines_table = ['&f,', '&g,'] - defines = '\n '.join(defines_table) - init_code = support.DefaultExtensionTemplate.INIT_TEMPLATE % { - 'defines': defines, - 'legacy_methods': 'NULL', - 'name': 'mytest', - 'init_types': '', - 'globals_defs': '', - 'globals_field': '', - } - assert expanded.rstrip() == f"""#include - -some more C stuff -{init_code} -""".rstrip() - - -TEST_DIR = Path(__file__).parent - - -def test_source_dump(tmpdir): - import pytest - test_file = 'test_00_basic' - parts = ['TestBasic', 'test_noop_function'] - rc = pytest.main(['--dump-dir=' + str(tmpdir), '::'.join([str(TEST_DIR.joinpath(test_file + ".py"))] + parts)]) - assert rc == 0 - expected_dir = '_'.join([test_file] + parts) - print("expected_dir = " + expected_dir) - test_dump_dir = None - for child in Path(tmpdir).iterdir(): - if expected_dir in str(child): - test_dump_dir = Path(child) - assert test_dump_dir and test_dump_dir.exists() - assert test_dump_dir.joinpath('mytest.c').exists() diff --git a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/trace/test_trace.py b/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/trace/test_trace.py deleted file mode 100644 index 675f68d16c..0000000000 --- a/graalpython/com.oracle.graal.python.hpy.test/src/hpytest/trace/test_trace.py +++ /dev/null @@ -1,153 +0,0 @@ -# MIT License -# -# Copyright (c) 2023, Oracle and/or its affiliates. -# Copyright (c) 2019 pyhandle -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import pytest -from hpytest.support import HPyTest -from hpy.trace import get_call_counts, get_durations, set_trace_functions - -pytestmark = pytest.mark.skipif(not HPyTest.supports_trace_mode(), reason="trace mode not supported") - -@pytest.fixture -def hpy_abi(): - return "trace" - - -def get_call_counter(): - from collections import Counter - return Counter(get_call_counts()) - - -def _assert_unchanged_except(expected, actual, *ignore): - import pytest - for x in expected.keys(): - if x not in ignore and actual[x] != expected[x]: - pytest.fail("%s unexpectedly changed (expected %d but was %d)." % - (x, expected[x], actual[x])) - - -def test_get_call_counts(compiler): - import pytest - mod = compiler.make_module(""" - HPyDef_METH(f, "f", HPyFunc_VARARGS) - static HPy f_impl(HPyContext *ctx, HPy self, const HPy *args, size_t nargs) - { - if (nargs != 2) { - HPyErr_SetString(ctx, ctx->h_TypeError, "expected exactly two args"); - return HPy_NULL; - } - return HPy_Add(ctx, args[0], args[1]); - } - - @EXPORT(f) - @INIT - """) - # Don't rely on absolute call count numbers since the module setup could - # already do some API calls we don't expect. - call_counter_0 = get_call_counter() - - assert mod.f(1, 2) == 3 - assert get_call_counter() - call_counter_0 == {"ctx_Add": 1} - assert mod.f(10, 20) == 30 - assert get_call_counter() - call_counter_0 == {"ctx_Add": 2} - with pytest.raises(TypeError): - mod.f(1, 2, 3) - assert get_call_counter() - call_counter_0 == {"ctx_Add": 2, "ctx_Err_SetString": 1} - - -def test_get_durations(compiler): - import time - mod = compiler.make_module(""" - HPyDef_METH(f, "f", HPyFunc_O) - static HPy f_impl(HPyContext *ctx, HPy self, HPy arg) - { - if (!HPyCallable_Check(ctx, arg)) { - HPyErr_SetString(ctx, ctx->h_TypeError, "expected callable"); - return HPy_NULL; - } - return HPy_CallTupleDict(ctx, arg, HPy_NULL, HPy_NULL); - } - - @EXPORT(f) - @INIT - """) - # Don't rely on absolute durations numbers since the module setup could - # already do some API calls we don't expect. - durations0 = get_durations().copy() - - def callback(): - time.sleep(0.3) - return 123 - - assert mod.f(callback) == 123 - assert get_durations()["ctx_CallTupleDict"] >= durations0["ctx_CallTupleDict"] + 3e5 - _assert_unchanged_except(durations0, get_durations(), "ctx_CallTupleDict", "ctx_Callable_Check") - - -def test_trace_funcs(compiler): - import pytest - mod = compiler.make_module(""" - HPyDef_METH(f, "f", HPyFunc_VARARGS) - static HPy f_impl(HPyContext *ctx, HPy self, const HPy *args, size_t nargs) - { - if (nargs != 2) { - HPyErr_SetString(ctx, ctx->h_TypeError, "expected exactly two args"); - return HPy_NULL; - } - return HPy_Add(ctx, args[0], args[1]); - } - - @EXPORT(f) - @INIT - """) - on_enter_cnt = 0 - on_exit_cnt = 0 - - def on_enter(name): - assert name == "ctx_Add" - nonlocal on_enter_cnt - on_enter_cnt += 1 - - def on_exit(name): - assert name == "ctx_Add" - nonlocal on_exit_cnt - on_exit_cnt += 1 - - set_trace_functions(on_enter) - assert on_enter_cnt == 0 - assert on_exit_cnt == 0 - assert mod.f(1, 2) == 3 - assert on_enter_cnt == 1 - assert on_exit_cnt == 0 - # on_enter should stay untouched - set_trace_functions(on_exit=on_exit) - assert mod.f(2, 3) == 5 - assert on_enter_cnt == 2 - assert on_exit_cnt == 1 - # clear on_enter func - set_trace_functions(on_enter=None) - assert mod.f(2, 3) == 5 - assert on_enter_cnt == 2 - assert on_exit_cnt == 2 - - with pytest.raises(TypeError): - set_trace_functions(1) diff --git a/graalpython/com.oracle.graal.python.jni/src/autogen_ctx_call_jni.c b/graalpython/com.oracle.graal.python.jni/src/autogen_ctx_call_jni.c deleted file mode 100644 index a718db4a96..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/autogen_ctx_call_jni.c +++ /dev/null @@ -1,647 +0,0 @@ -/* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - - -/* - DO NOT EDIT THIS FILE! - - This file is automatically generated by hpy.tools.autogen.graalpy.autogen_ctx_call_jni - See also hpy.tools.autogen and hpy/tools/public_api.h - - Run this to regenerate: - make autogen - -*/ - -#include "hpy_jni.h" -#include "com_oracle_graal_python_builtins_objects_cext_hpy_jni_GraalHPyJNITrampolines.h" - -#define TRAMPOLINE(name) Java_com_oracle_graal_python_builtins_objects_cext_hpy_jni_GraalHPyJNITrampolines_ ## name - -/******************************************************************* - * UNIVERSAL MODE TRAMPOLINES * - ******************************************************************/ - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeModuleInit)(JNIEnv *env, jclass clazz, jlong target) -{ - return (jlong) (((HPyModuleDef *(*)(void)) target)()); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeNoargs)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong self) -{ - HPyFunc_noargs f = (HPyFunc_noargs)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(self))); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeO)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong self, jlong arg) -{ - HPyFunc_o f = (HPyFunc_o)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(self), _jlong2h(arg))); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeVarargs)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong self, jlong args, jlong nargs) -{ - HPyFunc_varargs f = (HPyFunc_varargs)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(self), (const HPy *) args, (size_t) nargs)); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeKeywords)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong self, jlong args, jlong nargs, jlong kwnames) -{ - HPyFunc_keywords f = (HPyFunc_keywords)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(self), (const HPy *) args, (size_t) nargs, _jlong2h(kwnames))); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeUnaryfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyFunc_unaryfunc f = (HPyFunc_unaryfunc)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(arg0))); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeBinaryfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1) -{ - HPyFunc_binaryfunc f = (HPyFunc_binaryfunc)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(arg0), _jlong2h(arg1))); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeTernaryfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyFunc_ternaryfunc f = (HPyFunc_ternaryfunc)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(arg0), _jlong2h(arg1), _jlong2h(arg2))); -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeInquiry)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyFunc_inquiry f = (HPyFunc_inquiry)target; - return (jint) f((HPyContext *)ctx, _jlong2h(arg0)); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeLenfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyFunc_lenfunc f = (HPyFunc_lenfunc)target; - return (jlong) f((HPyContext *)ctx, _jlong2h(arg0)); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeSsizeargfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1) -{ - HPyFunc_ssizeargfunc f = (HPyFunc_ssizeargfunc)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(arg0), (HPy_ssize_t) arg1)); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeSsizessizeargfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyFunc_ssizessizeargfunc f = (HPyFunc_ssizessizeargfunc)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(arg0), (HPy_ssize_t) arg1, (HPy_ssize_t) arg2)); -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeSsizeobjargproc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyFunc_ssizeobjargproc f = (HPyFunc_ssizeobjargproc)target; - return (jint) f((HPyContext *)ctx, _jlong2h(arg0), (HPy_ssize_t) arg1, _jlong2h(arg2)); -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeSsizessizeobjargproc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2, jlong arg3) -{ - HPyFunc_ssizessizeobjargproc f = (HPyFunc_ssizessizeobjargproc)target; - return (jint) f((HPyContext *)ctx, _jlong2h(arg0), (HPy_ssize_t) arg1, (HPy_ssize_t) arg2, _jlong2h(arg3)); -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeObjobjargproc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyFunc_objobjargproc f = (HPyFunc_objobjargproc)target; - return (jint) f((HPyContext *)ctx, _jlong2h(arg0), _jlong2h(arg1), _jlong2h(arg2)); -} - -JNIEXPORT void JNICALL TRAMPOLINE(executeFreefunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyFunc_freefunc f = (HPyFunc_freefunc)target; - f((HPyContext *)ctx, (void *) arg0); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeGetattrfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1) -{ - HPyFunc_getattrfunc f = (HPyFunc_getattrfunc)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(arg0), (char *) arg1)); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeGetattrofunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1) -{ - HPyFunc_getattrofunc f = (HPyFunc_getattrofunc)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(arg0), _jlong2h(arg1))); -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeSetattrfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyFunc_setattrfunc f = (HPyFunc_setattrfunc)target; - return (jint) f((HPyContext *)ctx, _jlong2h(arg0), (char *) arg1, _jlong2h(arg2)); -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeSetattrofunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyFunc_setattrofunc f = (HPyFunc_setattrofunc)target; - return (jint) f((HPyContext *)ctx, _jlong2h(arg0), _jlong2h(arg1), _jlong2h(arg2)); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeReprfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyFunc_reprfunc f = (HPyFunc_reprfunc)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(arg0))); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeHashfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyFunc_hashfunc f = (HPyFunc_hashfunc)target; - return (jlong) f((HPyContext *)ctx, _jlong2h(arg0)); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeRichcmpfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyFunc_richcmpfunc f = (HPyFunc_richcmpfunc)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(arg0), _jlong2h(arg1), (HPy_RichCmpOp) arg2)); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeGetiterfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyFunc_getiterfunc f = (HPyFunc_getiterfunc)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(arg0))); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeIternextfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyFunc_iternextfunc f = (HPyFunc_iternextfunc)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(arg0))); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDescrgetfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyFunc_descrgetfunc f = (HPyFunc_descrgetfunc)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(arg0), _jlong2h(arg1), _jlong2h(arg2))); -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeDescrsetfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyFunc_descrsetfunc f = (HPyFunc_descrsetfunc)target; - return (jint) f((HPyContext *)ctx, _jlong2h(arg0), _jlong2h(arg1), _jlong2h(arg2)); -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeInitproc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong self, jlong args, jlong nargs, jlong kw) -{ - HPyFunc_initproc f = (HPyFunc_initproc)target; - return (jint) f((HPyContext *)ctx, _jlong2h(self), (const HPy *) args, (HPy_ssize_t) nargs, _jlong2h(kw)); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeNewfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong type, jlong args, jlong nargs, jlong kw) -{ - HPyFunc_newfunc f = (HPyFunc_newfunc)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(type), (const HPy *) args, (HPy_ssize_t) nargs, _jlong2h(kw))); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeGetter)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1) -{ - HPyFunc_getter f = (HPyFunc_getter)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(arg0), (void *) arg1)); -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeSetter)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyFunc_setter f = (HPyFunc_setter)target; - return (jint) f((HPyContext *)ctx, _jlong2h(arg0), _jlong2h(arg1), (void *) arg2); -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeObjobjproc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1) -{ - HPyFunc_objobjproc f = (HPyFunc_objobjproc)target; - return (jint) f((HPyContext *)ctx, _jlong2h(arg0), _jlong2h(arg1)); -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeGetbufferproc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jint arg2) -{ - HPyFunc_getbufferproc f = (HPyFunc_getbufferproc)target; - return (jint) f((HPyContext *)ctx, _jlong2h(arg0), (HPy_buffer *) arg1, (int) arg2); -} - -JNIEXPORT void JNICALL TRAMPOLINE(executeReleasebufferproc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1) -{ - HPyFunc_releasebufferproc f = (HPyFunc_releasebufferproc)target; - f((HPyContext *)ctx, _jlong2h(arg0), (HPy_buffer *) arg1); -} - -JNIEXPORT void JNICALL TRAMPOLINE(executeDestructor)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyFunc_destructor f = (HPyFunc_destructor)target; - f((HPyContext *)ctx, _jlong2h(arg0)); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeModcreate)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyFunc_mod_create f = (HPyFunc_mod_create)target; - return _h2jlong(f((HPyContext *)ctx, _jlong2h(arg0))); -} - - -/******************************************************************* - * DEBUG MODE TRAMPOLINES * - ******************************************************************/ - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugNoargs)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong self) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_noargs f = (HPyFunc_noargs)target; - DHPy dh_self = _jlong2dh(dctx, self); - DHPy dh_result = f(dctx, dh_self); - DHPy_close_and_check(dctx, dh_self); - return from_dh(dctx, dh_result); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugO)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong self, jlong arg) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_o f = (HPyFunc_o)target; - DHPy dh_self = _jlong2dh(dctx, self); - DHPy dh_arg = _jlong2dh(dctx, arg); - DHPy dh_result = f(dctx, dh_self, dh_arg); - DHPy_close_and_check(dctx, dh_self); - DHPy_close_and_check(dctx, dh_arg); - return from_dh(dctx, dh_result); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugVarargs)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong self, jlong args, jlong nargs) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_varargs f = (HPyFunc_varargs)target; - DHPy dh_self = _jlong2dh(dctx, self); - _ARR_JLONG2DH(dctx, dh_args, args, nargs) - DHPy dh_result = f(dctx, dh_self, dh_args, (size_t)nargs); - _ARR_DH_CLOSE(dctx, dh_args, nargs) - DHPy_close_and_check(dctx, dh_self); - return from_dh(dctx, dh_result); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugUnaryfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_unaryfunc f = (HPyFunc_unaryfunc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_result = f(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg0); - return from_dh(dctx, dh_result); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugBinaryfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_binaryfunc f = (HPyFunc_binaryfunc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_arg1 = _jlong2dh(dctx, arg1); - DHPy dh_result = f(dctx, dh_arg0, dh_arg1); - DHPy_close_and_check(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg1); - return from_dh(dctx, dh_result); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugTernaryfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_ternaryfunc f = (HPyFunc_ternaryfunc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_arg1 = _jlong2dh(dctx, arg1); - DHPy dh_arg2 = _jlong2dh(dctx, arg2); - DHPy dh_result = f(dctx, dh_arg0, dh_arg1, dh_arg2); - DHPy_close_and_check(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg1); - DHPy_close_and_check(dctx, dh_arg2); - return from_dh(dctx, dh_result); -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeDebugInquiry)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_inquiry f = (HPyFunc_inquiry)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - jint result = (jint) f(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg0); - return result; -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugLenfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_lenfunc f = (HPyFunc_lenfunc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - jlong result = (jlong) f(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg0); - return result; -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugSsizeargfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_ssizeargfunc f = (HPyFunc_ssizeargfunc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_result = f(dctx, dh_arg0, (HPy_ssize_t)arg1); - DHPy_close_and_check(dctx, dh_arg0); - return from_dh(dctx, dh_result); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugSsizessizeargfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_ssizessizeargfunc f = (HPyFunc_ssizessizeargfunc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_result = f(dctx, dh_arg0, (HPy_ssize_t)arg1, (HPy_ssize_t)arg2); - DHPy_close_and_check(dctx, dh_arg0); - return from_dh(dctx, dh_result); -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeDebugSsizeobjargproc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_ssizeobjargproc f = (HPyFunc_ssizeobjargproc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_arg2 = _jlong2dh(dctx, arg2); - jint result = (jint) f(dctx, dh_arg0, (HPy_ssize_t)arg1, dh_arg2); - DHPy_close_and_check(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg2); - return result; -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeDebugSsizessizeobjargproc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2, jlong arg3) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_ssizessizeobjargproc f = (HPyFunc_ssizessizeobjargproc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_arg3 = _jlong2dh(dctx, arg3); - jint result = (jint) f(dctx, dh_arg0, (HPy_ssize_t)arg1, (HPy_ssize_t)arg2, dh_arg3); - DHPy_close_and_check(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg3); - return result; -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeDebugObjobjargproc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_objobjargproc f = (HPyFunc_objobjargproc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_arg1 = _jlong2dh(dctx, arg1); - DHPy dh_arg2 = _jlong2dh(dctx, arg2); - jint result = (jint) f(dctx, dh_arg0, dh_arg1, dh_arg2); - DHPy_close_and_check(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg1); - DHPy_close_and_check(dctx, dh_arg2); - return result; -} - -JNIEXPORT void JNICALL TRAMPOLINE(executeDebugFreefunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_freefunc f = (HPyFunc_freefunc)target; - f(dctx, (void *)arg0); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugGetattrfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_getattrfunc f = (HPyFunc_getattrfunc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_result = f(dctx, dh_arg0, (char *)arg1); - DHPy_close_and_check(dctx, dh_arg0); - return from_dh(dctx, dh_result); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugGetattrofunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_getattrofunc f = (HPyFunc_getattrofunc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_arg1 = _jlong2dh(dctx, arg1); - DHPy dh_result = f(dctx, dh_arg0, dh_arg1); - DHPy_close_and_check(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg1); - return from_dh(dctx, dh_result); -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeDebugSetattrfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_setattrfunc f = (HPyFunc_setattrfunc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_arg2 = _jlong2dh(dctx, arg2); - jint result = (jint) f(dctx, dh_arg0, (char *)arg1, dh_arg2); - DHPy_close_and_check(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg2); - return result; -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeDebugSetattrofunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_setattrofunc f = (HPyFunc_setattrofunc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_arg1 = _jlong2dh(dctx, arg1); - DHPy dh_arg2 = _jlong2dh(dctx, arg2); - jint result = (jint) f(dctx, dh_arg0, dh_arg1, dh_arg2); - DHPy_close_and_check(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg1); - DHPy_close_and_check(dctx, dh_arg2); - return result; -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugReprfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_reprfunc f = (HPyFunc_reprfunc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_result = f(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg0); - return from_dh(dctx, dh_result); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugHashfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_hashfunc f = (HPyFunc_hashfunc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - jlong result = (jlong) f(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg0); - return result; -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugRichcmpfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_richcmpfunc f = (HPyFunc_richcmpfunc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_arg1 = _jlong2dh(dctx, arg1); - DHPy dh_result = f(dctx, dh_arg0, dh_arg1, (HPy_RichCmpOp)arg2); - DHPy_close_and_check(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg1); - return from_dh(dctx, dh_result); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugGetiterfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_getiterfunc f = (HPyFunc_getiterfunc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_result = f(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg0); - return from_dh(dctx, dh_result); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugIternextfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_iternextfunc f = (HPyFunc_iternextfunc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_result = f(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg0); - return from_dh(dctx, dh_result); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugDescrgetfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_descrgetfunc f = (HPyFunc_descrgetfunc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_arg1 = _jlong2dh(dctx, arg1); - DHPy dh_arg2 = _jlong2dh(dctx, arg2); - DHPy dh_result = f(dctx, dh_arg0, dh_arg1, dh_arg2); - DHPy_close_and_check(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg1); - DHPy_close_and_check(dctx, dh_arg2); - return from_dh(dctx, dh_result); -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeDebugDescrsetfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_descrsetfunc f = (HPyFunc_descrsetfunc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_arg1 = _jlong2dh(dctx, arg1); - DHPy dh_arg2 = _jlong2dh(dctx, arg2); - jint result = (jint) f(dctx, dh_arg0, dh_arg1, dh_arg2); - DHPy_close_and_check(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg1); - DHPy_close_and_check(dctx, dh_arg2); - return result; -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeDebugInitproc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong self, jlong args, jlong nargs, jlong kw) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_initproc f = (HPyFunc_initproc)target; - DHPy dh_self = _jlong2dh(dctx, self); - DHPy dh_kw = _jlong2dh(dctx, kw); - _ARR_JLONG2DH(dctx, dh_args, args, nargs) - jint result = (jint) f(dctx, dh_self, dh_args, (HPy_ssize_t)nargs, dh_kw); - _ARR_DH_CLOSE(dctx, dh_args, nargs) - DHPy_close_and_check(dctx, dh_self); - DHPy_close_and_check(dctx, dh_kw); - return result; -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugNewfunc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong type, jlong args, jlong nargs, jlong kw) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_newfunc f = (HPyFunc_newfunc)target; - DHPy dh_type = _jlong2dh(dctx, type); - DHPy dh_kw = _jlong2dh(dctx, kw); - _ARR_JLONG2DH(dctx, dh_args, args, nargs) - DHPy dh_result = f(dctx, dh_type, dh_args, (HPy_ssize_t)nargs, dh_kw); - _ARR_DH_CLOSE(dctx, dh_args, nargs) - DHPy_close_and_check(dctx, dh_type); - DHPy_close_and_check(dctx, dh_kw); - return from_dh(dctx, dh_result); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugGetter)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_getter f = (HPyFunc_getter)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_result = f(dctx, dh_arg0, (void *)arg1); - DHPy_close_and_check(dctx, dh_arg0); - return from_dh(dctx, dh_result); -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeDebugSetter)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1, jlong arg2) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_setter f = (HPyFunc_setter)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_arg1 = _jlong2dh(dctx, arg1); - jint result = (jint) f(dctx, dh_arg0, dh_arg1, (void *)arg2); - DHPy_close_and_check(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg1); - return result; -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeDebugObjobjproc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0, jlong arg1) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_objobjproc f = (HPyFunc_objobjproc)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_arg1 = _jlong2dh(dctx, arg1); - jint result = (jint) f(dctx, dh_arg0, dh_arg1); - DHPy_close_and_check(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg1); - return result; -} - -JNIEXPORT void JNICALL TRAMPOLINE(executeDebugDestructor)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_destructor f = (HPyFunc_destructor)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - f(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg0); -} - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugModcreate)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg0) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_mod_create f = (HPyFunc_mod_create)target; - DHPy dh_arg0 = _jlong2dh(dctx, arg0); - DHPy dh_result = f(dctx, dh_arg0); - DHPy_close_and_check(dctx, dh_arg0); - return from_dh(dctx, dh_result); -} - -#undef TRAMPOLINE diff --git a/graalpython/com.oracle.graal.python.jni/src/autogen_ctx_init_jni.h b/graalpython/com.oracle.graal.python.jni/src/autogen_ctx_init_jni.h deleted file mode 100644 index 80305c6288..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/autogen_ctx_init_jni.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - - -/* - DO NOT EDIT THIS FILE! - - This file is automatically generated by hpy.tools.autogen.graalpy.autogen_ctx_init_jni_h - See also hpy.tools.autogen and hpy/tools/public_api.h - - Run this to regenerate: - make autogen - -*/ - -_HPy_HIDDEN int init_autogen_jni_ctx(JNIEnv *env, jclass clazz, HPyContext *ctx, jlongArray jctx_handles); -_HPy_HIDDEN extern jmethodID jniMethod_ctx_Unicode_FromWideChar; -_HPy_HIDDEN HPy ctx_Unicode_FromWideChar_jni(HPyContext *ctx, const wchar_t *w, HPy_ssize_t size); -_HPy_HIDDEN extern jmethodID jniMethod_ctx_ListBuilder_New; -_HPy_HIDDEN HPyListBuilder ctx_ListBuilder_New_jni(HPyContext *ctx, HPy_ssize_t size); -_HPy_HIDDEN extern jmethodID jniMethod_ctx_ListBuilder_Set; -_HPy_HIDDEN void ctx_ListBuilder_Set_jni(HPyContext *ctx, HPyListBuilder builder, HPy_ssize_t index, HPy h_item); -_HPy_HIDDEN extern jmethodID jniMethod_ctx_ListBuilder_Build; -_HPy_HIDDEN HPy ctx_ListBuilder_Build_jni(HPyContext *ctx, HPyListBuilder builder); -_HPy_HIDDEN extern jmethodID jniMethod_ctx_ListBuilder_Cancel; -_HPy_HIDDEN void ctx_ListBuilder_Cancel_jni(HPyContext *ctx, HPyListBuilder builder); -_HPy_HIDDEN extern jmethodID jniMethod_ctx_TupleBuilder_New; -_HPy_HIDDEN HPyTupleBuilder ctx_TupleBuilder_New_jni(HPyContext *ctx, HPy_ssize_t size); -_HPy_HIDDEN extern jmethodID jniMethod_ctx_TupleBuilder_Set; -_HPy_HIDDEN void ctx_TupleBuilder_Set_jni(HPyContext *ctx, HPyTupleBuilder builder, HPy_ssize_t index, HPy h_item); -_HPy_HIDDEN extern jmethodID jniMethod_ctx_TupleBuilder_Build; -_HPy_HIDDEN HPy ctx_TupleBuilder_Build_jni(HPyContext *ctx, HPyTupleBuilder builder); -_HPy_HIDDEN extern jmethodID jniMethod_ctx_TupleBuilder_Cancel; -_HPy_HIDDEN void ctx_TupleBuilder_Cancel_jni(HPyContext *ctx, HPyTupleBuilder builder); -_HPy_HIDDEN extern jmethodID jniMethod_ctx_Global_Load; -_HPy_HIDDEN HPy ctx_Global_Load_jni(HPyContext *ctx, HPyGlobal global); - diff --git a/graalpython/com.oracle.graal.python.jni/src/autogen_wrappers_jni.c b/graalpython/com.oracle.graal.python.jni/src/autogen_wrappers_jni.c deleted file mode 100644 index 949f71b8c6..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/autogen_wrappers_jni.c +++ /dev/null @@ -1,2282 +0,0 @@ -/* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - - -/* - DO NOT EDIT THIS FILE! - - This file is automatically generated by hpy.tools.autogen.graalpy.autogen_wrappers_jni - See also hpy.tools.autogen and hpy/tools/public_api.h - - Run this to regenerate: - make autogen - -*/ - -#include "hpy_jni.h" -#include "hpynative.h" -#include "hpy_log.h" -#include "com_oracle_graal_python_builtins_objects_cext_hpy_jni_GraalHPyJNIContext.h" -#include "autogen_ctx_init_jni.h" - -#define TRAMPOLINE(FUN_NAME) Java_com_oracle_graal_python_builtins_objects_cext_hpy_jni_GraalHPyJNIContext_ ## FUN_NAME - -static jmethodID jniMethod_ctx_Dup; -static HPy ctx_Dup_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Close; -static void ctx_Close_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Long_FromInt32_t; -static HPy ctx_Long_FromInt32_t_jni(HPyContext *ctx, int32_t value); -static jmethodID jniMethod_ctx_Long_FromUInt32_t; -static HPy ctx_Long_FromUInt32_t_jni(HPyContext *ctx, uint32_t value); -static jmethodID jniMethod_ctx_Long_FromInt64_t; -static HPy ctx_Long_FromInt64_t_jni(HPyContext *ctx, int64_t v); -static jmethodID jniMethod_ctx_Long_FromUInt64_t; -static HPy ctx_Long_FromUInt64_t_jni(HPyContext *ctx, uint64_t v); -static jmethodID jniMethod_ctx_Long_FromSize_t; -static HPy ctx_Long_FromSize_t_jni(HPyContext *ctx, size_t value); -static jmethodID jniMethod_ctx_Long_FromSsize_t; -static HPy ctx_Long_FromSsize_t_jni(HPyContext *ctx, HPy_ssize_t value); -static jmethodID jniMethod_ctx_Long_AsInt32_t; -static int32_t ctx_Long_AsInt32_t_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Long_AsUInt32_t; -static uint32_t ctx_Long_AsUInt32_t_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Long_AsUInt32_tMask; -static uint32_t ctx_Long_AsUInt32_tMask_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Long_AsInt64_t; -static int64_t ctx_Long_AsInt64_t_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Long_AsUInt64_t; -static uint64_t ctx_Long_AsUInt64_t_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Long_AsUInt64_tMask; -static uint64_t ctx_Long_AsUInt64_tMask_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Long_AsSize_t; -static size_t ctx_Long_AsSize_t_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Long_AsSsize_t; -static HPy_ssize_t ctx_Long_AsSsize_t_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Long_AsVoidPtr; -static void *ctx_Long_AsVoidPtr_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Long_AsDouble; -static double ctx_Long_AsDouble_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Float_FromDouble; -static HPy ctx_Float_FromDouble_jni(HPyContext *ctx, double v); -static jmethodID jniMethod_ctx_Float_AsDouble; -static double ctx_Float_AsDouble_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Bool_FromBool; -static HPy ctx_Bool_FromBool_jni(HPyContext *ctx, bool v); -static jmethodID jniMethod_ctx_Length; -static HPy_ssize_t ctx_Length_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Number_Check; -static int ctx_Number_Check_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Add; -static HPy ctx_Add_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_Subtract; -static HPy ctx_Subtract_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_Multiply; -static HPy ctx_Multiply_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_MatrixMultiply; -static HPy ctx_MatrixMultiply_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_FloorDivide; -static HPy ctx_FloorDivide_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_TrueDivide; -static HPy ctx_TrueDivide_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_Remainder; -static HPy ctx_Remainder_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_Divmod; -static HPy ctx_Divmod_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_Power; -static HPy ctx_Power_jni(HPyContext *ctx, HPy h1, HPy h2, HPy h3); -static jmethodID jniMethod_ctx_Negative; -static HPy ctx_Negative_jni(HPyContext *ctx, HPy h1); -static jmethodID jniMethod_ctx_Positive; -static HPy ctx_Positive_jni(HPyContext *ctx, HPy h1); -static jmethodID jniMethod_ctx_Absolute; -static HPy ctx_Absolute_jni(HPyContext *ctx, HPy h1); -static jmethodID jniMethod_ctx_Invert; -static HPy ctx_Invert_jni(HPyContext *ctx, HPy h1); -static jmethodID jniMethod_ctx_Lshift; -static HPy ctx_Lshift_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_Rshift; -static HPy ctx_Rshift_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_And; -static HPy ctx_And_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_Xor; -static HPy ctx_Xor_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_Or; -static HPy ctx_Or_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_Index; -static HPy ctx_Index_jni(HPyContext *ctx, HPy h1); -static jmethodID jniMethod_ctx_Long; -static HPy ctx_Long_jni(HPyContext *ctx, HPy h1); -static jmethodID jniMethod_ctx_Float; -static HPy ctx_Float_jni(HPyContext *ctx, HPy h1); -static jmethodID jniMethod_ctx_InPlaceAdd; -static HPy ctx_InPlaceAdd_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_InPlaceSubtract; -static HPy ctx_InPlaceSubtract_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_InPlaceMultiply; -static HPy ctx_InPlaceMultiply_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_InPlaceMatrixMultiply; -static HPy ctx_InPlaceMatrixMultiply_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_InPlaceFloorDivide; -static HPy ctx_InPlaceFloorDivide_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_InPlaceTrueDivide; -static HPy ctx_InPlaceTrueDivide_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_InPlaceRemainder; -static HPy ctx_InPlaceRemainder_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_InPlacePower; -static HPy ctx_InPlacePower_jni(HPyContext *ctx, HPy h1, HPy h2, HPy h3); -static jmethodID jniMethod_ctx_InPlaceLshift; -static HPy ctx_InPlaceLshift_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_InPlaceRshift; -static HPy ctx_InPlaceRshift_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_InPlaceAnd; -static HPy ctx_InPlaceAnd_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_InPlaceXor; -static HPy ctx_InPlaceXor_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_InPlaceOr; -static HPy ctx_InPlaceOr_jni(HPyContext *ctx, HPy h1, HPy h2); -static jmethodID jniMethod_ctx_Callable_Check; -static int ctx_Callable_Check_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_CallTupleDict; -static HPy ctx_CallTupleDict_jni(HPyContext *ctx, HPy callable, HPy args, HPy kw); -static jmethodID jniMethod_ctx_Call; -static HPy ctx_Call_jni(HPyContext *ctx, HPy callable, const HPy *args, size_t nargs, HPy kwnames); -static jmethodID jniMethod_ctx_CallMethod; -static HPy ctx_CallMethod_jni(HPyContext *ctx, HPy name, const HPy *args, size_t nargs, HPy kwnames); -static jmethodID jniMethod_ctx_FatalError; -static void ctx_FatalError_jni(HPyContext *ctx, const char *message); -static jmethodID jniMethod_ctx_Err_SetString; -static void ctx_Err_SetString_jni(HPyContext *ctx, HPy h_type, const char *utf8_message); -static jmethodID jniMethod_ctx_Err_SetObject; -static void ctx_Err_SetObject_jni(HPyContext *ctx, HPy h_type, HPy h_value); -static jmethodID jniMethod_ctx_Err_SetFromErrnoWithFilename; -static HPy ctx_Err_SetFromErrnoWithFilename_jni(HPyContext *ctx, HPy h_type, const char *filename_fsencoded); -static jmethodID jniMethod_ctx_Err_SetFromErrnoWithFilenameObjects; -static void ctx_Err_SetFromErrnoWithFilenameObjects_jni(HPyContext *ctx, HPy h_type, HPy filename1, HPy filename2); -static jmethodID jniMethod_ctx_Err_Occurred; -static int ctx_Err_Occurred_jni(HPyContext *ctx); -static jmethodID jniMethod_ctx_Err_ExceptionMatches; -static int ctx_Err_ExceptionMatches_jni(HPyContext *ctx, HPy exc); -static jmethodID jniMethod_ctx_Err_NoMemory; -static void ctx_Err_NoMemory_jni(HPyContext *ctx); -static jmethodID jniMethod_ctx_Err_Clear; -static void ctx_Err_Clear_jni(HPyContext *ctx); -static jmethodID jniMethod_ctx_Err_NewException; -static HPy ctx_Err_NewException_jni(HPyContext *ctx, const char *utf8_name, HPy base, HPy dict); -static jmethodID jniMethod_ctx_Err_NewExceptionWithDoc; -static HPy ctx_Err_NewExceptionWithDoc_jni(HPyContext *ctx, const char *utf8_name, const char *utf8_doc, HPy base, HPy dict); -static jmethodID jniMethod_ctx_Err_WarnEx; -static int ctx_Err_WarnEx_jni(HPyContext *ctx, HPy category, const char *utf8_message, HPy_ssize_t stack_level); -static jmethodID jniMethod_ctx_Err_WriteUnraisable; -static void ctx_Err_WriteUnraisable_jni(HPyContext *ctx, HPy obj); -static jmethodID jniMethod_ctx_IsTrue; -static int ctx_IsTrue_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Type_FromSpec; -static HPy ctx_Type_FromSpec_jni(HPyContext *ctx, HPyType_Spec *spec, HPyType_SpecParam *params); -static jmethodID jniMethod_ctx_Type_GenericNew; -static HPy ctx_Type_GenericNew_jni(HPyContext *ctx, HPy type, const HPy *args, HPy_ssize_t nargs, HPy kw); -static jmethodID jniMethod_ctx_GetAttr; -static HPy ctx_GetAttr_jni(HPyContext *ctx, HPy obj, HPy name); -static jmethodID jniMethod_ctx_HasAttr; -static int ctx_HasAttr_jni(HPyContext *ctx, HPy obj, HPy name); -static jmethodID jniMethod_ctx_HasAttr_s; -static int ctx_HasAttr_s_jni(HPyContext *ctx, HPy obj, const char *utf8_name); -static jmethodID jniMethod_ctx_SetAttr; -static int ctx_SetAttr_jni(HPyContext *ctx, HPy obj, HPy name, HPy value); -static jmethodID jniMethod_ctx_SetAttr_s; -static int ctx_SetAttr_s_jni(HPyContext *ctx, HPy obj, const char *utf8_name, HPy value); -static jmethodID jniMethod_ctx_GetItem; -static HPy ctx_GetItem_jni(HPyContext *ctx, HPy obj, HPy key); -static jmethodID jniMethod_ctx_GetItem_i; -static HPy ctx_GetItem_i_jni(HPyContext *ctx, HPy obj, HPy_ssize_t idx); -static jmethodID jniMethod_ctx_Contains; -static int ctx_Contains_jni(HPyContext *ctx, HPy container, HPy key); -static jmethodID jniMethod_ctx_SetItem; -static int ctx_SetItem_jni(HPyContext *ctx, HPy obj, HPy key, HPy value); -static jmethodID jniMethod_ctx_SetItem_i; -static int ctx_SetItem_i_jni(HPyContext *ctx, HPy obj, HPy_ssize_t idx, HPy value); -static jmethodID jniMethod_ctx_DelItem; -static int ctx_DelItem_jni(HPyContext *ctx, HPy obj, HPy key); -static jmethodID jniMethod_ctx_DelItem_i; -static int ctx_DelItem_i_jni(HPyContext *ctx, HPy obj, HPy_ssize_t idx); -static jmethodID jniMethod_ctx_DelItem_s; -static int ctx_DelItem_s_jni(HPyContext *ctx, HPy obj, const char *utf8_key); -static jmethodID jniMethod_ctx_Type; -static HPy ctx_Type_jni(HPyContext *ctx, HPy obj); -static jmethodID jniMethod_ctx_TypeCheck; -static int ctx_TypeCheck_jni(HPyContext *ctx, HPy obj, HPy type); -static jmethodID jniMethod_ctx_Type_GetName; -static const char *ctx_Type_GetName_jni(HPyContext *ctx, HPy type); -static jmethodID jniMethod_ctx_Type_IsSubtype; -static int ctx_Type_IsSubtype_jni(HPyContext *ctx, HPy sub, HPy type); -static jmethodID jniMethod_ctx_Is; -static int ctx_Is_jni(HPyContext *ctx, HPy obj, HPy other); -static jmethodID jniMethod_ctx_AsStruct_Object; -static void *ctx_AsStruct_Object_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_AsStruct_Legacy; -static void *ctx_AsStruct_Legacy_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_AsStruct_Type; -static void *ctx_AsStruct_Type_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_AsStruct_Long; -static void *ctx_AsStruct_Long_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_AsStruct_Float; -static void *ctx_AsStruct_Float_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_AsStruct_Unicode; -static void *ctx_AsStruct_Unicode_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_AsStruct_Tuple; -static void *ctx_AsStruct_Tuple_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_AsStruct_List; -static void *ctx_AsStruct_List_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Type_GetBuiltinShape; -static HPyType_BuiltinShape ctx_Type_GetBuiltinShape_jni(HPyContext *ctx, HPy h_type); -static jmethodID jniMethod_ctx_New; -static HPy ctx_New_jni(HPyContext *ctx, HPy h_type, void **data); -static jmethodID jniMethod_ctx_Repr; -static HPy ctx_Repr_jni(HPyContext *ctx, HPy obj); -static jmethodID jniMethod_ctx_Str; -static HPy ctx_Str_jni(HPyContext *ctx, HPy obj); -static jmethodID jniMethod_ctx_ASCII; -static HPy ctx_ASCII_jni(HPyContext *ctx, HPy obj); -static jmethodID jniMethod_ctx_Bytes; -static HPy ctx_Bytes_jni(HPyContext *ctx, HPy obj); -static jmethodID jniMethod_ctx_RichCompare; -static HPy ctx_RichCompare_jni(HPyContext *ctx, HPy v, HPy w, int op); -static jmethodID jniMethod_ctx_RichCompareBool; -static int ctx_RichCompareBool_jni(HPyContext *ctx, HPy v, HPy w, int op); -static jmethodID jniMethod_ctx_Hash; -static HPy_hash_t ctx_Hash_jni(HPyContext *ctx, HPy obj); -static jmethodID jniMethod_ctx_Bytes_Check; -static int ctx_Bytes_Check_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Bytes_Size; -static HPy_ssize_t ctx_Bytes_Size_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Bytes_GET_SIZE; -static HPy_ssize_t ctx_Bytes_GET_SIZE_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Bytes_AsString; -static const char *ctx_Bytes_AsString_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Bytes_AS_STRING; -static const char *ctx_Bytes_AS_STRING_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Bytes_FromString; -static HPy ctx_Bytes_FromString_jni(HPyContext *ctx, const char *bytes); -static jmethodID jniMethod_ctx_Bytes_FromStringAndSize; -static HPy ctx_Bytes_FromStringAndSize_jni(HPyContext *ctx, const char *bytes, HPy_ssize_t len); -static jmethodID jniMethod_ctx_Unicode_FromString; -static HPy ctx_Unicode_FromString_jni(HPyContext *ctx, const char *utf8); -static jmethodID jniMethod_ctx_Unicode_Check; -static int ctx_Unicode_Check_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Unicode_AsASCIIString; -static HPy ctx_Unicode_AsASCIIString_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Unicode_AsLatin1String; -static HPy ctx_Unicode_AsLatin1String_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Unicode_AsUTF8String; -static HPy ctx_Unicode_AsUTF8String_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Unicode_AsUTF8AndSize; -static const char *ctx_Unicode_AsUTF8AndSize_jni(HPyContext *ctx, HPy h, HPy_ssize_t *size); -_HPy_HIDDEN jmethodID jniMethod_ctx_Unicode_FromWideChar; -static jmethodID jniMethod_ctx_Unicode_DecodeFSDefault; -static HPy ctx_Unicode_DecodeFSDefault_jni(HPyContext *ctx, const char *v); -static jmethodID jniMethod_ctx_Unicode_DecodeFSDefaultAndSize; -static HPy ctx_Unicode_DecodeFSDefaultAndSize_jni(HPyContext *ctx, const char *v, HPy_ssize_t size); -static jmethodID jniMethod_ctx_Unicode_EncodeFSDefault; -static HPy ctx_Unicode_EncodeFSDefault_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Unicode_ReadChar; -static HPy_UCS4 ctx_Unicode_ReadChar_jni(HPyContext *ctx, HPy h, HPy_ssize_t index); -static jmethodID jniMethod_ctx_Unicode_DecodeASCII; -static HPy ctx_Unicode_DecodeASCII_jni(HPyContext *ctx, const char *ascii, HPy_ssize_t size, const char *errors); -static jmethodID jniMethod_ctx_Unicode_DecodeLatin1; -static HPy ctx_Unicode_DecodeLatin1_jni(HPyContext *ctx, const char *latin1, HPy_ssize_t size, const char *errors); -static jmethodID jniMethod_ctx_Unicode_FromEncodedObject; -static HPy ctx_Unicode_FromEncodedObject_jni(HPyContext *ctx, HPy obj, const char *encoding, const char *errors); -static jmethodID jniMethod_ctx_Unicode_Substring; -static HPy ctx_Unicode_Substring_jni(HPyContext *ctx, HPy str, HPy_ssize_t start, HPy_ssize_t end); -static jmethodID jniMethod_ctx_List_Check; -static int ctx_List_Check_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_List_New; -static HPy ctx_List_New_jni(HPyContext *ctx, HPy_ssize_t len); -static jmethodID jniMethod_ctx_List_Append; -static int ctx_List_Append_jni(HPyContext *ctx, HPy h_list, HPy h_item); -static jmethodID jniMethod_ctx_Dict_Check; -static int ctx_Dict_Check_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Dict_New; -static HPy ctx_Dict_New_jni(HPyContext *ctx); -static jmethodID jniMethod_ctx_Dict_Keys; -static HPy ctx_Dict_Keys_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Dict_Copy; -static HPy ctx_Dict_Copy_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Tuple_Check; -static int ctx_Tuple_Check_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Slice_Unpack; -static int ctx_Slice_Unpack_jni(HPyContext *ctx, HPy slice, HPy_ssize_t *start, HPy_ssize_t *stop, HPy_ssize_t *step); -static jmethodID jniMethod_ctx_Import_ImportModule; -static HPy ctx_Import_ImportModule_jni(HPyContext *ctx, const char *utf8_name); -static jmethodID jniMethod_ctx_Capsule_New; -static HPy ctx_Capsule_New_jni(HPyContext *ctx, void *pointer, const char *utf8_name, HPyCapsule_Destructor *destructor); -static jmethodID jniMethod_ctx_Capsule_Get; -static void *ctx_Capsule_Get_jni(HPyContext *ctx, HPy capsule, _HPyCapsule_key key, const char *utf8_name); -static jmethodID jniMethod_ctx_Capsule_IsValid; -static int ctx_Capsule_IsValid_jni(HPyContext *ctx, HPy capsule, const char *utf8_name); -static jmethodID jniMethod_ctx_Capsule_Set; -static int ctx_Capsule_Set_jni(HPyContext *ctx, HPy capsule, _HPyCapsule_key key, void *value); -static jmethodID jniMethod_ctx_FromPyObject; -static HPy ctx_FromPyObject_jni(HPyContext *ctx, cpy_PyObject *obj); -static jmethodID jniMethod_ctx_AsPyObject; -static cpy_PyObject *ctx_AsPyObject_jni(HPyContext *ctx, HPy h); -_HPy_HIDDEN jmethodID jniMethod_ctx_ListBuilder_New; -_HPy_HIDDEN jmethodID jniMethod_ctx_ListBuilder_Set; -_HPy_HIDDEN jmethodID jniMethod_ctx_ListBuilder_Build; -_HPy_HIDDEN jmethodID jniMethod_ctx_ListBuilder_Cancel; -_HPy_HIDDEN jmethodID jniMethod_ctx_TupleBuilder_New; -_HPy_HIDDEN jmethodID jniMethod_ctx_TupleBuilder_Set; -_HPy_HIDDEN jmethodID jniMethod_ctx_TupleBuilder_Build; -_HPy_HIDDEN jmethodID jniMethod_ctx_TupleBuilder_Cancel; -static jmethodID jniMethod_ctx_Field_Load; -static HPy ctx_Field_Load_jni(HPyContext *ctx, HPy source_object, HPyField source_field); -static jmethodID jniMethod_ctx_ReenterPythonExecution; -static void ctx_ReenterPythonExecution_jni(HPyContext *ctx, HPyThreadState state); -static jmethodID jniMethod_ctx_LeavePythonExecution; -static HPyThreadState ctx_LeavePythonExecution_jni(HPyContext *ctx); -_HPy_HIDDEN jmethodID jniMethod_ctx_Global_Load; -static jmethodID jniMethod_ctx_Dump; -static void ctx_Dump_jni(HPyContext *ctx, HPy h); -static jmethodID jniMethod_ctx_Compile_s; -static HPy ctx_Compile_s_jni(HPyContext *ctx, const char *utf8_source, const char *utf8_filename, HPy_SourceKind kind); -static jmethodID jniMethod_ctx_EvalCode; -static HPy ctx_EvalCode_jni(HPyContext *ctx, HPy code, HPy globals, HPy locals); -static jmethodID jniMethod_ctx_ContextVar_New; -static HPy ctx_ContextVar_New_jni(HPyContext *ctx, const char *name, HPy default_value); -static jmethodID jniMethod_ctx_ContextVar_Set; -static HPy ctx_ContextVar_Set_jni(HPyContext *ctx, HPy context_var, HPy value); -static jmethodID jniMethod_ctx_SetCallFunction; -static int ctx_SetCallFunction_jni(HPyContext *ctx, HPy h, HPyCallFunction *func); - -_HPy_HIDDEN int init_autogen_jni_ctx(JNIEnv *env, jclass clazz, HPyContext *ctx, jlongArray jctx_handles) -{ - - jlong *ctx_handles = (*env)->GetPrimitiveArrayCritical(env, jctx_handles, NULL); - if (ctx_handles == NULL) { - LOGS("ERROR: Could not access Java context handle array elements\n"); - return 1; - } - ctx->h_None = _jlong2h(ctx_handles[0]); - ctx->h_True = _jlong2h(ctx_handles[1]); - ctx->h_False = _jlong2h(ctx_handles[2]); - ctx->h_NotImplemented = _jlong2h(ctx_handles[3]); - ctx->h_Ellipsis = _jlong2h(ctx_handles[4]); - ctx->h_BaseException = _jlong2h(ctx_handles[5]); - ctx->h_Exception = _jlong2h(ctx_handles[6]); - ctx->h_StopAsyncIteration = _jlong2h(ctx_handles[7]); - ctx->h_StopIteration = _jlong2h(ctx_handles[8]); - ctx->h_GeneratorExit = _jlong2h(ctx_handles[9]); - ctx->h_ArithmeticError = _jlong2h(ctx_handles[10]); - ctx->h_LookupError = _jlong2h(ctx_handles[11]); - ctx->h_AssertionError = _jlong2h(ctx_handles[12]); - ctx->h_AttributeError = _jlong2h(ctx_handles[13]); - ctx->h_BufferError = _jlong2h(ctx_handles[14]); - ctx->h_EOFError = _jlong2h(ctx_handles[15]); - ctx->h_FloatingPointError = _jlong2h(ctx_handles[16]); - ctx->h_OSError = _jlong2h(ctx_handles[17]); - ctx->h_ImportError = _jlong2h(ctx_handles[18]); - ctx->h_ModuleNotFoundError = _jlong2h(ctx_handles[19]); - ctx->h_IndexError = _jlong2h(ctx_handles[20]); - ctx->h_KeyError = _jlong2h(ctx_handles[21]); - ctx->h_KeyboardInterrupt = _jlong2h(ctx_handles[22]); - ctx->h_MemoryError = _jlong2h(ctx_handles[23]); - ctx->h_NameError = _jlong2h(ctx_handles[24]); - ctx->h_OverflowError = _jlong2h(ctx_handles[25]); - ctx->h_RuntimeError = _jlong2h(ctx_handles[26]); - ctx->h_RecursionError = _jlong2h(ctx_handles[27]); - ctx->h_NotImplementedError = _jlong2h(ctx_handles[28]); - ctx->h_SyntaxError = _jlong2h(ctx_handles[29]); - ctx->h_IndentationError = _jlong2h(ctx_handles[30]); - ctx->h_TabError = _jlong2h(ctx_handles[31]); - ctx->h_ReferenceError = _jlong2h(ctx_handles[32]); - ctx->h_SystemError = _jlong2h(ctx_handles[33]); - ctx->h_SystemExit = _jlong2h(ctx_handles[34]); - ctx->h_TypeError = _jlong2h(ctx_handles[35]); - ctx->h_UnboundLocalError = _jlong2h(ctx_handles[36]); - ctx->h_UnicodeError = _jlong2h(ctx_handles[37]); - ctx->h_UnicodeEncodeError = _jlong2h(ctx_handles[38]); - ctx->h_UnicodeDecodeError = _jlong2h(ctx_handles[39]); - ctx->h_UnicodeTranslateError = _jlong2h(ctx_handles[40]); - ctx->h_ValueError = _jlong2h(ctx_handles[41]); - ctx->h_ZeroDivisionError = _jlong2h(ctx_handles[42]); - ctx->h_BlockingIOError = _jlong2h(ctx_handles[43]); - ctx->h_BrokenPipeError = _jlong2h(ctx_handles[44]); - ctx->h_ChildProcessError = _jlong2h(ctx_handles[45]); - ctx->h_ConnectionError = _jlong2h(ctx_handles[46]); - ctx->h_ConnectionAbortedError = _jlong2h(ctx_handles[47]); - ctx->h_ConnectionRefusedError = _jlong2h(ctx_handles[48]); - ctx->h_ConnectionResetError = _jlong2h(ctx_handles[49]); - ctx->h_FileExistsError = _jlong2h(ctx_handles[50]); - ctx->h_FileNotFoundError = _jlong2h(ctx_handles[51]); - ctx->h_InterruptedError = _jlong2h(ctx_handles[52]); - ctx->h_IsADirectoryError = _jlong2h(ctx_handles[53]); - ctx->h_NotADirectoryError = _jlong2h(ctx_handles[54]); - ctx->h_PermissionError = _jlong2h(ctx_handles[55]); - ctx->h_ProcessLookupError = _jlong2h(ctx_handles[56]); - ctx->h_TimeoutError = _jlong2h(ctx_handles[57]); - ctx->h_Warning = _jlong2h(ctx_handles[58]); - ctx->h_UserWarning = _jlong2h(ctx_handles[59]); - ctx->h_DeprecationWarning = _jlong2h(ctx_handles[60]); - ctx->h_PendingDeprecationWarning = _jlong2h(ctx_handles[61]); - ctx->h_SyntaxWarning = _jlong2h(ctx_handles[62]); - ctx->h_RuntimeWarning = _jlong2h(ctx_handles[63]); - ctx->h_FutureWarning = _jlong2h(ctx_handles[64]); - ctx->h_ImportWarning = _jlong2h(ctx_handles[65]); - ctx->h_UnicodeWarning = _jlong2h(ctx_handles[66]); - ctx->h_BytesWarning = _jlong2h(ctx_handles[67]); - ctx->h_ResourceWarning = _jlong2h(ctx_handles[68]); - ctx->h_BaseObjectType = _jlong2h(ctx_handles[69]); - ctx->h_TypeType = _jlong2h(ctx_handles[70]); - ctx->h_BoolType = _jlong2h(ctx_handles[71]); - ctx->h_LongType = _jlong2h(ctx_handles[72]); - ctx->h_FloatType = _jlong2h(ctx_handles[73]); - ctx->h_UnicodeType = _jlong2h(ctx_handles[74]); - ctx->h_TupleType = _jlong2h(ctx_handles[75]); - ctx->h_ListType = _jlong2h(ctx_handles[76]); - ctx->h_ComplexType = _jlong2h(ctx_handles[238]); - ctx->h_BytesType = _jlong2h(ctx_handles[239]); - ctx->h_MemoryViewType = _jlong2h(ctx_handles[240]); - ctx->h_CapsuleType = _jlong2h(ctx_handles[241]); - ctx->h_SliceType = _jlong2h(ctx_handles[242]); - ctx->h_Builtins = _jlong2h(ctx_handles[243]); - (*env)->ReleasePrimitiveArrayCritical(env, jctx_handles, ctx_handles, JNI_ABORT); - - jniMethod_ctx_Dup = (*env)->GetMethodID(env, clazz, "ctxDup", "(J)J"); - if (jniMethod_ctx_Dup == NULL) { - LOGS("ERROR: Java method ctxDup not found found !\n"); - return 1; - } - ctx->ctx_Dup = &ctx_Dup_jni; - jniMethod_ctx_Close = (*env)->GetMethodID(env, clazz, "ctxClose", "(J)V"); - if (jniMethod_ctx_Close == NULL) { - LOGS("ERROR: Java method ctxClose not found found !\n"); - return 1; - } - ctx->ctx_Close = &ctx_Close_jni; - jniMethod_ctx_Long_FromInt32_t = (*env)->GetMethodID(env, clazz, "ctxLongFromInt32t", "(I)J"); - if (jniMethod_ctx_Long_FromInt32_t == NULL) { - LOGS("ERROR: Java method ctxLongFromInt32t not found found !\n"); - return 1; - } - ctx->ctx_Long_FromInt32_t = &ctx_Long_FromInt32_t_jni; - jniMethod_ctx_Long_FromUInt32_t = (*env)->GetMethodID(env, clazz, "ctxLongFromUInt32t", "(I)J"); - if (jniMethod_ctx_Long_FromUInt32_t == NULL) { - LOGS("ERROR: Java method ctxLongFromUInt32t not found found !\n"); - return 1; - } - ctx->ctx_Long_FromUInt32_t = &ctx_Long_FromUInt32_t_jni; - jniMethod_ctx_Long_FromInt64_t = (*env)->GetMethodID(env, clazz, "ctxLongFromInt64t", "(J)J"); - if (jniMethod_ctx_Long_FromInt64_t == NULL) { - LOGS("ERROR: Java method ctxLongFromInt64t not found found !\n"); - return 1; - } - ctx->ctx_Long_FromInt64_t = &ctx_Long_FromInt64_t_jni; - jniMethod_ctx_Long_FromUInt64_t = (*env)->GetMethodID(env, clazz, "ctxLongFromUInt64t", "(J)J"); - if (jniMethod_ctx_Long_FromUInt64_t == NULL) { - LOGS("ERROR: Java method ctxLongFromUInt64t not found found !\n"); - return 1; - } - ctx->ctx_Long_FromUInt64_t = &ctx_Long_FromUInt64_t_jni; - jniMethod_ctx_Long_FromSize_t = (*env)->GetMethodID(env, clazz, "ctxLongFromSizet", "(J)J"); - if (jniMethod_ctx_Long_FromSize_t == NULL) { - LOGS("ERROR: Java method ctxLongFromSizet not found found !\n"); - return 1; - } - ctx->ctx_Long_FromSize_t = &ctx_Long_FromSize_t_jni; - jniMethod_ctx_Long_FromSsize_t = (*env)->GetMethodID(env, clazz, "ctxLongFromSsizet", "(J)J"); - if (jniMethod_ctx_Long_FromSsize_t == NULL) { - LOGS("ERROR: Java method ctxLongFromSsizet not found found !\n"); - return 1; - } - ctx->ctx_Long_FromSsize_t = &ctx_Long_FromSsize_t_jni; - jniMethod_ctx_Long_AsInt32_t = (*env)->GetMethodID(env, clazz, "ctxLongAsInt32t", "(J)I"); - if (jniMethod_ctx_Long_AsInt32_t == NULL) { - LOGS("ERROR: Java method ctxLongAsInt32t not found found !\n"); - return 1; - } - ctx->ctx_Long_AsInt32_t = &ctx_Long_AsInt32_t_jni; - jniMethod_ctx_Long_AsUInt32_t = (*env)->GetMethodID(env, clazz, "ctxLongAsUInt32t", "(J)I"); - if (jniMethod_ctx_Long_AsUInt32_t == NULL) { - LOGS("ERROR: Java method ctxLongAsUInt32t not found found !\n"); - return 1; - } - ctx->ctx_Long_AsUInt32_t = &ctx_Long_AsUInt32_t_jni; - jniMethod_ctx_Long_AsUInt32_tMask = (*env)->GetMethodID(env, clazz, "ctxLongAsUInt32tMask", "(J)I"); - if (jniMethod_ctx_Long_AsUInt32_tMask == NULL) { - LOGS("ERROR: Java method ctxLongAsUInt32tMask not found found !\n"); - return 1; - } - ctx->ctx_Long_AsUInt32_tMask = &ctx_Long_AsUInt32_tMask_jni; - jniMethod_ctx_Long_AsInt64_t = (*env)->GetMethodID(env, clazz, "ctxLongAsInt64t", "(J)J"); - if (jniMethod_ctx_Long_AsInt64_t == NULL) { - LOGS("ERROR: Java method ctxLongAsInt64t not found found !\n"); - return 1; - } - ctx->ctx_Long_AsInt64_t = &ctx_Long_AsInt64_t_jni; - jniMethod_ctx_Long_AsUInt64_t = (*env)->GetMethodID(env, clazz, "ctxLongAsUInt64t", "(J)J"); - if (jniMethod_ctx_Long_AsUInt64_t == NULL) { - LOGS("ERROR: Java method ctxLongAsUInt64t not found found !\n"); - return 1; - } - ctx->ctx_Long_AsUInt64_t = &ctx_Long_AsUInt64_t_jni; - jniMethod_ctx_Long_AsUInt64_tMask = (*env)->GetMethodID(env, clazz, "ctxLongAsUInt64tMask", "(J)J"); - if (jniMethod_ctx_Long_AsUInt64_tMask == NULL) { - LOGS("ERROR: Java method ctxLongAsUInt64tMask not found found !\n"); - return 1; - } - ctx->ctx_Long_AsUInt64_tMask = &ctx_Long_AsUInt64_tMask_jni; - jniMethod_ctx_Long_AsSize_t = (*env)->GetMethodID(env, clazz, "ctxLongAsSizet", "(J)J"); - if (jniMethod_ctx_Long_AsSize_t == NULL) { - LOGS("ERROR: Java method ctxLongAsSizet not found found !\n"); - return 1; - } - ctx->ctx_Long_AsSize_t = &ctx_Long_AsSize_t_jni; - jniMethod_ctx_Long_AsSsize_t = (*env)->GetMethodID(env, clazz, "ctxLongAsSsizet", "(J)J"); - if (jniMethod_ctx_Long_AsSsize_t == NULL) { - LOGS("ERROR: Java method ctxLongAsSsizet not found found !\n"); - return 1; - } - ctx->ctx_Long_AsSsize_t = &ctx_Long_AsSsize_t_jni; - jniMethod_ctx_Long_AsVoidPtr = (*env)->GetMethodID(env, clazz, "ctxLongAsVoidPtr", "(J)J"); - if (jniMethod_ctx_Long_AsVoidPtr == NULL) { - LOGS("ERROR: Java method ctxLongAsVoidPtr not found found !\n"); - return 1; - } - ctx->ctx_Long_AsVoidPtr = &ctx_Long_AsVoidPtr_jni; - jniMethod_ctx_Long_AsDouble = (*env)->GetMethodID(env, clazz, "ctxLongAsDouble", "(J)D"); - if (jniMethod_ctx_Long_AsDouble == NULL) { - LOGS("ERROR: Java method ctxLongAsDouble not found found !\n"); - return 1; - } - ctx->ctx_Long_AsDouble = &ctx_Long_AsDouble_jni; - jniMethod_ctx_Float_FromDouble = (*env)->GetMethodID(env, clazz, "ctxFloatFromDouble", "(D)J"); - if (jniMethod_ctx_Float_FromDouble == NULL) { - LOGS("ERROR: Java method ctxFloatFromDouble not found found !\n"); - return 1; - } - ctx->ctx_Float_FromDouble = &ctx_Float_FromDouble_jni; - jniMethod_ctx_Float_AsDouble = (*env)->GetMethodID(env, clazz, "ctxFloatAsDouble", "(J)D"); - if (jniMethod_ctx_Float_AsDouble == NULL) { - LOGS("ERROR: Java method ctxFloatAsDouble not found found !\n"); - return 1; - } - ctx->ctx_Float_AsDouble = &ctx_Float_AsDouble_jni; - jniMethod_ctx_Bool_FromBool = (*env)->GetMethodID(env, clazz, "ctxBoolFromBool", "(Z)J"); - if (jniMethod_ctx_Bool_FromBool == NULL) { - LOGS("ERROR: Java method ctxBoolFromBool not found found !\n"); - return 1; - } - ctx->ctx_Bool_FromBool = &ctx_Bool_FromBool_jni; - jniMethod_ctx_Length = (*env)->GetMethodID(env, clazz, "ctxLength", "(J)J"); - if (jniMethod_ctx_Length == NULL) { - LOGS("ERROR: Java method ctxLength not found found !\n"); - return 1; - } - ctx->ctx_Length = &ctx_Length_jni; - jniMethod_ctx_Number_Check = (*env)->GetMethodID(env, clazz, "ctxNumberCheck", "(J)I"); - if (jniMethod_ctx_Number_Check == NULL) { - LOGS("ERROR: Java method ctxNumberCheck not found found !\n"); - return 1; - } - ctx->ctx_Number_Check = &ctx_Number_Check_jni; - jniMethod_ctx_Add = (*env)->GetMethodID(env, clazz, "ctxAdd", "(JJ)J"); - if (jniMethod_ctx_Add == NULL) { - LOGS("ERROR: Java method ctxAdd not found found !\n"); - return 1; - } - ctx->ctx_Add = &ctx_Add_jni; - jniMethod_ctx_Subtract = (*env)->GetMethodID(env, clazz, "ctxSubtract", "(JJ)J"); - if (jniMethod_ctx_Subtract == NULL) { - LOGS("ERROR: Java method ctxSubtract not found found !\n"); - return 1; - } - ctx->ctx_Subtract = &ctx_Subtract_jni; - jniMethod_ctx_Multiply = (*env)->GetMethodID(env, clazz, "ctxMultiply", "(JJ)J"); - if (jniMethod_ctx_Multiply == NULL) { - LOGS("ERROR: Java method ctxMultiply not found found !\n"); - return 1; - } - ctx->ctx_Multiply = &ctx_Multiply_jni; - jniMethod_ctx_MatrixMultiply = (*env)->GetMethodID(env, clazz, "ctxMatrixMultiply", "(JJ)J"); - if (jniMethod_ctx_MatrixMultiply == NULL) { - LOGS("ERROR: Java method ctxMatrixMultiply not found found !\n"); - return 1; - } - ctx->ctx_MatrixMultiply = &ctx_MatrixMultiply_jni; - jniMethod_ctx_FloorDivide = (*env)->GetMethodID(env, clazz, "ctxFloorDivide", "(JJ)J"); - if (jniMethod_ctx_FloorDivide == NULL) { - LOGS("ERROR: Java method ctxFloorDivide not found found !\n"); - return 1; - } - ctx->ctx_FloorDivide = &ctx_FloorDivide_jni; - jniMethod_ctx_TrueDivide = (*env)->GetMethodID(env, clazz, "ctxTrueDivide", "(JJ)J"); - if (jniMethod_ctx_TrueDivide == NULL) { - LOGS("ERROR: Java method ctxTrueDivide not found found !\n"); - return 1; - } - ctx->ctx_TrueDivide = &ctx_TrueDivide_jni; - jniMethod_ctx_Remainder = (*env)->GetMethodID(env, clazz, "ctxRemainder", "(JJ)J"); - if (jniMethod_ctx_Remainder == NULL) { - LOGS("ERROR: Java method ctxRemainder not found found !\n"); - return 1; - } - ctx->ctx_Remainder = &ctx_Remainder_jni; - jniMethod_ctx_Divmod = (*env)->GetMethodID(env, clazz, "ctxDivmod", "(JJ)J"); - if (jniMethod_ctx_Divmod == NULL) { - LOGS("ERROR: Java method ctxDivmod not found found !\n"); - return 1; - } - ctx->ctx_Divmod = &ctx_Divmod_jni; - jniMethod_ctx_Power = (*env)->GetMethodID(env, clazz, "ctxPower", "(JJJ)J"); - if (jniMethod_ctx_Power == NULL) { - LOGS("ERROR: Java method ctxPower not found found !\n"); - return 1; - } - ctx->ctx_Power = &ctx_Power_jni; - jniMethod_ctx_Negative = (*env)->GetMethodID(env, clazz, "ctxNegative", "(J)J"); - if (jniMethod_ctx_Negative == NULL) { - LOGS("ERROR: Java method ctxNegative not found found !\n"); - return 1; - } - ctx->ctx_Negative = &ctx_Negative_jni; - jniMethod_ctx_Positive = (*env)->GetMethodID(env, clazz, "ctxPositive", "(J)J"); - if (jniMethod_ctx_Positive == NULL) { - LOGS("ERROR: Java method ctxPositive not found found !\n"); - return 1; - } - ctx->ctx_Positive = &ctx_Positive_jni; - jniMethod_ctx_Absolute = (*env)->GetMethodID(env, clazz, "ctxAbsolute", "(J)J"); - if (jniMethod_ctx_Absolute == NULL) { - LOGS("ERROR: Java method ctxAbsolute not found found !\n"); - return 1; - } - ctx->ctx_Absolute = &ctx_Absolute_jni; - jniMethod_ctx_Invert = (*env)->GetMethodID(env, clazz, "ctxInvert", "(J)J"); - if (jniMethod_ctx_Invert == NULL) { - LOGS("ERROR: Java method ctxInvert not found found !\n"); - return 1; - } - ctx->ctx_Invert = &ctx_Invert_jni; - jniMethod_ctx_Lshift = (*env)->GetMethodID(env, clazz, "ctxLshift", "(JJ)J"); - if (jniMethod_ctx_Lshift == NULL) { - LOGS("ERROR: Java method ctxLshift not found found !\n"); - return 1; - } - ctx->ctx_Lshift = &ctx_Lshift_jni; - jniMethod_ctx_Rshift = (*env)->GetMethodID(env, clazz, "ctxRshift", "(JJ)J"); - if (jniMethod_ctx_Rshift == NULL) { - LOGS("ERROR: Java method ctxRshift not found found !\n"); - return 1; - } - ctx->ctx_Rshift = &ctx_Rshift_jni; - jniMethod_ctx_And = (*env)->GetMethodID(env, clazz, "ctxAnd", "(JJ)J"); - if (jniMethod_ctx_And == NULL) { - LOGS("ERROR: Java method ctxAnd not found found !\n"); - return 1; - } - ctx->ctx_And = &ctx_And_jni; - jniMethod_ctx_Xor = (*env)->GetMethodID(env, clazz, "ctxXor", "(JJ)J"); - if (jniMethod_ctx_Xor == NULL) { - LOGS("ERROR: Java method ctxXor not found found !\n"); - return 1; - } - ctx->ctx_Xor = &ctx_Xor_jni; - jniMethod_ctx_Or = (*env)->GetMethodID(env, clazz, "ctxOr", "(JJ)J"); - if (jniMethod_ctx_Or == NULL) { - LOGS("ERROR: Java method ctxOr not found found !\n"); - return 1; - } - ctx->ctx_Or = &ctx_Or_jni; - jniMethod_ctx_Index = (*env)->GetMethodID(env, clazz, "ctxIndex", "(J)J"); - if (jniMethod_ctx_Index == NULL) { - LOGS("ERROR: Java method ctxIndex not found found !\n"); - return 1; - } - ctx->ctx_Index = &ctx_Index_jni; - jniMethod_ctx_Long = (*env)->GetMethodID(env, clazz, "ctxLong", "(J)J"); - if (jniMethod_ctx_Long == NULL) { - LOGS("ERROR: Java method ctxLong not found found !\n"); - return 1; - } - ctx->ctx_Long = &ctx_Long_jni; - jniMethod_ctx_Float = (*env)->GetMethodID(env, clazz, "ctxFloat", "(J)J"); - if (jniMethod_ctx_Float == NULL) { - LOGS("ERROR: Java method ctxFloat not found found !\n"); - return 1; - } - ctx->ctx_Float = &ctx_Float_jni; - jniMethod_ctx_InPlaceAdd = (*env)->GetMethodID(env, clazz, "ctxInPlaceAdd", "(JJ)J"); - if (jniMethod_ctx_InPlaceAdd == NULL) { - LOGS("ERROR: Java method ctxInPlaceAdd not found found !\n"); - return 1; - } - ctx->ctx_InPlaceAdd = &ctx_InPlaceAdd_jni; - jniMethod_ctx_InPlaceSubtract = (*env)->GetMethodID(env, clazz, "ctxInPlaceSubtract", "(JJ)J"); - if (jniMethod_ctx_InPlaceSubtract == NULL) { - LOGS("ERROR: Java method ctxInPlaceSubtract not found found !\n"); - return 1; - } - ctx->ctx_InPlaceSubtract = &ctx_InPlaceSubtract_jni; - jniMethod_ctx_InPlaceMultiply = (*env)->GetMethodID(env, clazz, "ctxInPlaceMultiply", "(JJ)J"); - if (jniMethod_ctx_InPlaceMultiply == NULL) { - LOGS("ERROR: Java method ctxInPlaceMultiply not found found !\n"); - return 1; - } - ctx->ctx_InPlaceMultiply = &ctx_InPlaceMultiply_jni; - jniMethod_ctx_InPlaceMatrixMultiply = (*env)->GetMethodID(env, clazz, "ctxInPlaceMatrixMultiply", "(JJ)J"); - if (jniMethod_ctx_InPlaceMatrixMultiply == NULL) { - LOGS("ERROR: Java method ctxInPlaceMatrixMultiply not found found !\n"); - return 1; - } - ctx->ctx_InPlaceMatrixMultiply = &ctx_InPlaceMatrixMultiply_jni; - jniMethod_ctx_InPlaceFloorDivide = (*env)->GetMethodID(env, clazz, "ctxInPlaceFloorDivide", "(JJ)J"); - if (jniMethod_ctx_InPlaceFloorDivide == NULL) { - LOGS("ERROR: Java method ctxInPlaceFloorDivide not found found !\n"); - return 1; - } - ctx->ctx_InPlaceFloorDivide = &ctx_InPlaceFloorDivide_jni; - jniMethod_ctx_InPlaceTrueDivide = (*env)->GetMethodID(env, clazz, "ctxInPlaceTrueDivide", "(JJ)J"); - if (jniMethod_ctx_InPlaceTrueDivide == NULL) { - LOGS("ERROR: Java method ctxInPlaceTrueDivide not found found !\n"); - return 1; - } - ctx->ctx_InPlaceTrueDivide = &ctx_InPlaceTrueDivide_jni; - jniMethod_ctx_InPlaceRemainder = (*env)->GetMethodID(env, clazz, "ctxInPlaceRemainder", "(JJ)J"); - if (jniMethod_ctx_InPlaceRemainder == NULL) { - LOGS("ERROR: Java method ctxInPlaceRemainder not found found !\n"); - return 1; - } - ctx->ctx_InPlaceRemainder = &ctx_InPlaceRemainder_jni; - jniMethod_ctx_InPlacePower = (*env)->GetMethodID(env, clazz, "ctxInPlacePower", "(JJJ)J"); - if (jniMethod_ctx_InPlacePower == NULL) { - LOGS("ERROR: Java method ctxInPlacePower not found found !\n"); - return 1; - } - ctx->ctx_InPlacePower = &ctx_InPlacePower_jni; - jniMethod_ctx_InPlaceLshift = (*env)->GetMethodID(env, clazz, "ctxInPlaceLshift", "(JJ)J"); - if (jniMethod_ctx_InPlaceLshift == NULL) { - LOGS("ERROR: Java method ctxInPlaceLshift not found found !\n"); - return 1; - } - ctx->ctx_InPlaceLshift = &ctx_InPlaceLshift_jni; - jniMethod_ctx_InPlaceRshift = (*env)->GetMethodID(env, clazz, "ctxInPlaceRshift", "(JJ)J"); - if (jniMethod_ctx_InPlaceRshift == NULL) { - LOGS("ERROR: Java method ctxInPlaceRshift not found found !\n"); - return 1; - } - ctx->ctx_InPlaceRshift = &ctx_InPlaceRshift_jni; - jniMethod_ctx_InPlaceAnd = (*env)->GetMethodID(env, clazz, "ctxInPlaceAnd", "(JJ)J"); - if (jniMethod_ctx_InPlaceAnd == NULL) { - LOGS("ERROR: Java method ctxInPlaceAnd not found found !\n"); - return 1; - } - ctx->ctx_InPlaceAnd = &ctx_InPlaceAnd_jni; - jniMethod_ctx_InPlaceXor = (*env)->GetMethodID(env, clazz, "ctxInPlaceXor", "(JJ)J"); - if (jniMethod_ctx_InPlaceXor == NULL) { - LOGS("ERROR: Java method ctxInPlaceXor not found found !\n"); - return 1; - } - ctx->ctx_InPlaceXor = &ctx_InPlaceXor_jni; - jniMethod_ctx_InPlaceOr = (*env)->GetMethodID(env, clazz, "ctxInPlaceOr", "(JJ)J"); - if (jniMethod_ctx_InPlaceOr == NULL) { - LOGS("ERROR: Java method ctxInPlaceOr not found found !\n"); - return 1; - } - ctx->ctx_InPlaceOr = &ctx_InPlaceOr_jni; - jniMethod_ctx_Callable_Check = (*env)->GetMethodID(env, clazz, "ctxCallableCheck", "(J)I"); - if (jniMethod_ctx_Callable_Check == NULL) { - LOGS("ERROR: Java method ctxCallableCheck not found found !\n"); - return 1; - } - ctx->ctx_Callable_Check = &ctx_Callable_Check_jni; - jniMethod_ctx_CallTupleDict = (*env)->GetMethodID(env, clazz, "ctxCallTupleDict", "(JJJ)J"); - if (jniMethod_ctx_CallTupleDict == NULL) { - LOGS("ERROR: Java method ctxCallTupleDict not found found !\n"); - return 1; - } - ctx->ctx_CallTupleDict = &ctx_CallTupleDict_jni; - jniMethod_ctx_Call = (*env)->GetMethodID(env, clazz, "ctxCall", "(JJJJ)J"); - if (jniMethod_ctx_Call == NULL) { - LOGS("ERROR: Java method ctxCall not found found !\n"); - return 1; - } - ctx->ctx_Call = &ctx_Call_jni; - jniMethod_ctx_CallMethod = (*env)->GetMethodID(env, clazz, "ctxCallMethod", "(JJJJ)J"); - if (jniMethod_ctx_CallMethod == NULL) { - LOGS("ERROR: Java method ctxCallMethod not found found !\n"); - return 1; - } - ctx->ctx_CallMethod = &ctx_CallMethod_jni; - jniMethod_ctx_FatalError = (*env)->GetMethodID(env, clazz, "ctxFatalError", "(J)V"); - if (jniMethod_ctx_FatalError == NULL) { - LOGS("ERROR: Java method ctxFatalError not found found !\n"); - return 1; - } - ctx->ctx_FatalError = &ctx_FatalError_jni; - jniMethod_ctx_Err_SetString = (*env)->GetMethodID(env, clazz, "ctxErrSetString", "(JJ)V"); - if (jniMethod_ctx_Err_SetString == NULL) { - LOGS("ERROR: Java method ctxErrSetString not found found !\n"); - return 1; - } - ctx->ctx_Err_SetString = &ctx_Err_SetString_jni; - jniMethod_ctx_Err_SetObject = (*env)->GetMethodID(env, clazz, "ctxErrSetObject", "(JJ)V"); - if (jniMethod_ctx_Err_SetObject == NULL) { - LOGS("ERROR: Java method ctxErrSetObject not found found !\n"); - return 1; - } - ctx->ctx_Err_SetObject = &ctx_Err_SetObject_jni; - jniMethod_ctx_Err_SetFromErrnoWithFilename = (*env)->GetMethodID(env, clazz, "ctxErrSetFromErrnoWithFilename", "(JJ)J"); - if (jniMethod_ctx_Err_SetFromErrnoWithFilename == NULL) { - LOGS("ERROR: Java method ctxErrSetFromErrnoWithFilename not found found !\n"); - return 1; - } - ctx->ctx_Err_SetFromErrnoWithFilename = &ctx_Err_SetFromErrnoWithFilename_jni; - jniMethod_ctx_Err_SetFromErrnoWithFilenameObjects = (*env)->GetMethodID(env, clazz, "ctxErrSetFromErrnoWithFilenameObjects", "(JJJ)V"); - if (jniMethod_ctx_Err_SetFromErrnoWithFilenameObjects == NULL) { - LOGS("ERROR: Java method ctxErrSetFromErrnoWithFilenameObjects not found found !\n"); - return 1; - } - ctx->ctx_Err_SetFromErrnoWithFilenameObjects = &ctx_Err_SetFromErrnoWithFilenameObjects_jni; - jniMethod_ctx_Err_Occurred = (*env)->GetMethodID(env, clazz, "ctxErrOccurred", "()I"); - if (jniMethod_ctx_Err_Occurred == NULL) { - LOGS("ERROR: Java method ctxErrOccurred not found found !\n"); - return 1; - } - ctx->ctx_Err_Occurred = &ctx_Err_Occurred_jni; - jniMethod_ctx_Err_ExceptionMatches = (*env)->GetMethodID(env, clazz, "ctxErrExceptionMatches", "(J)I"); - if (jniMethod_ctx_Err_ExceptionMatches == NULL) { - LOGS("ERROR: Java method ctxErrExceptionMatches not found found !\n"); - return 1; - } - ctx->ctx_Err_ExceptionMatches = &ctx_Err_ExceptionMatches_jni; - jniMethod_ctx_Err_NoMemory = (*env)->GetMethodID(env, clazz, "ctxErrNoMemory", "()V"); - if (jniMethod_ctx_Err_NoMemory == NULL) { - LOGS("ERROR: Java method ctxErrNoMemory not found found !\n"); - return 1; - } - ctx->ctx_Err_NoMemory = &ctx_Err_NoMemory_jni; - jniMethod_ctx_Err_Clear = (*env)->GetMethodID(env, clazz, "ctxErrClear", "()V"); - if (jniMethod_ctx_Err_Clear == NULL) { - LOGS("ERROR: Java method ctxErrClear not found found !\n"); - return 1; - } - ctx->ctx_Err_Clear = &ctx_Err_Clear_jni; - jniMethod_ctx_Err_NewException = (*env)->GetMethodID(env, clazz, "ctxErrNewException", "(JJJ)J"); - if (jniMethod_ctx_Err_NewException == NULL) { - LOGS("ERROR: Java method ctxErrNewException not found found !\n"); - return 1; - } - ctx->ctx_Err_NewException = &ctx_Err_NewException_jni; - jniMethod_ctx_Err_NewExceptionWithDoc = (*env)->GetMethodID(env, clazz, "ctxErrNewExceptionWithDoc", "(JJJJ)J"); - if (jniMethod_ctx_Err_NewExceptionWithDoc == NULL) { - LOGS("ERROR: Java method ctxErrNewExceptionWithDoc not found found !\n"); - return 1; - } - ctx->ctx_Err_NewExceptionWithDoc = &ctx_Err_NewExceptionWithDoc_jni; - jniMethod_ctx_Err_WarnEx = (*env)->GetMethodID(env, clazz, "ctxErrWarnEx", "(JJJ)I"); - if (jniMethod_ctx_Err_WarnEx == NULL) { - LOGS("ERROR: Java method ctxErrWarnEx not found found !\n"); - return 1; - } - ctx->ctx_Err_WarnEx = &ctx_Err_WarnEx_jni; - jniMethod_ctx_Err_WriteUnraisable = (*env)->GetMethodID(env, clazz, "ctxErrWriteUnraisable", "(J)V"); - if (jniMethod_ctx_Err_WriteUnraisable == NULL) { - LOGS("ERROR: Java method ctxErrWriteUnraisable not found found !\n"); - return 1; - } - ctx->ctx_Err_WriteUnraisable = &ctx_Err_WriteUnraisable_jni; - jniMethod_ctx_IsTrue = (*env)->GetMethodID(env, clazz, "ctxIsTrue", "(J)I"); - if (jniMethod_ctx_IsTrue == NULL) { - LOGS("ERROR: Java method ctxIsTrue not found found !\n"); - return 1; - } - ctx->ctx_IsTrue = &ctx_IsTrue_jni; - jniMethod_ctx_Type_FromSpec = (*env)->GetMethodID(env, clazz, "ctxTypeFromSpec", "(JJ)J"); - if (jniMethod_ctx_Type_FromSpec == NULL) { - LOGS("ERROR: Java method ctxTypeFromSpec not found found !\n"); - return 1; - } - ctx->ctx_Type_FromSpec = &ctx_Type_FromSpec_jni; - jniMethod_ctx_Type_GenericNew = (*env)->GetMethodID(env, clazz, "ctxTypeGenericNew", "(JJJJ)J"); - if (jniMethod_ctx_Type_GenericNew == NULL) { - LOGS("ERROR: Java method ctxTypeGenericNew not found found !\n"); - return 1; - } - ctx->ctx_Type_GenericNew = &ctx_Type_GenericNew_jni; - jniMethod_ctx_GetAttr = (*env)->GetMethodID(env, clazz, "ctxGetAttr", "(JJ)J"); - if (jniMethod_ctx_GetAttr == NULL) { - LOGS("ERROR: Java method ctxGetAttr not found found !\n"); - return 1; - } - ctx->ctx_GetAttr = &ctx_GetAttr_jni; - jniMethod_ctx_HasAttr = (*env)->GetMethodID(env, clazz, "ctxHasAttr", "(JJ)I"); - if (jniMethod_ctx_HasAttr == NULL) { - LOGS("ERROR: Java method ctxHasAttr not found found !\n"); - return 1; - } - ctx->ctx_HasAttr = &ctx_HasAttr_jni; - jniMethod_ctx_HasAttr_s = (*env)->GetMethodID(env, clazz, "ctxHasAttrs", "(JJ)I"); - if (jniMethod_ctx_HasAttr_s == NULL) { - LOGS("ERROR: Java method ctxHasAttrs not found found !\n"); - return 1; - } - ctx->ctx_HasAttr_s = &ctx_HasAttr_s_jni; - jniMethod_ctx_SetAttr = (*env)->GetMethodID(env, clazz, "ctxSetAttr", "(JJJ)I"); - if (jniMethod_ctx_SetAttr == NULL) { - LOGS("ERROR: Java method ctxSetAttr not found found !\n"); - return 1; - } - ctx->ctx_SetAttr = &ctx_SetAttr_jni; - jniMethod_ctx_SetAttr_s = (*env)->GetMethodID(env, clazz, "ctxSetAttrs", "(JJJ)I"); - if (jniMethod_ctx_SetAttr_s == NULL) { - LOGS("ERROR: Java method ctxSetAttrs not found found !\n"); - return 1; - } - ctx->ctx_SetAttr_s = &ctx_SetAttr_s_jni; - jniMethod_ctx_GetItem = (*env)->GetMethodID(env, clazz, "ctxGetItem", "(JJ)J"); - if (jniMethod_ctx_GetItem == NULL) { - LOGS("ERROR: Java method ctxGetItem not found found !\n"); - return 1; - } - ctx->ctx_GetItem = &ctx_GetItem_jni; - jniMethod_ctx_GetItem_i = (*env)->GetMethodID(env, clazz, "ctxGetItemi", "(JJ)J"); - if (jniMethod_ctx_GetItem_i == NULL) { - LOGS("ERROR: Java method ctxGetItemi not found found !\n"); - return 1; - } - ctx->ctx_GetItem_i = &ctx_GetItem_i_jni; - jniMethod_ctx_Contains = (*env)->GetMethodID(env, clazz, "ctxContains", "(JJ)I"); - if (jniMethod_ctx_Contains == NULL) { - LOGS("ERROR: Java method ctxContains not found found !\n"); - return 1; - } - ctx->ctx_Contains = &ctx_Contains_jni; - jniMethod_ctx_SetItem = (*env)->GetMethodID(env, clazz, "ctxSetItem", "(JJJ)I"); - if (jniMethod_ctx_SetItem == NULL) { - LOGS("ERROR: Java method ctxSetItem not found found !\n"); - return 1; - } - ctx->ctx_SetItem = &ctx_SetItem_jni; - jniMethod_ctx_SetItem_i = (*env)->GetMethodID(env, clazz, "ctxSetItemi", "(JJJ)I"); - if (jniMethod_ctx_SetItem_i == NULL) { - LOGS("ERROR: Java method ctxSetItemi not found found !\n"); - return 1; - } - ctx->ctx_SetItem_i = &ctx_SetItem_i_jni; - jniMethod_ctx_DelItem = (*env)->GetMethodID(env, clazz, "ctxDelItem", "(JJ)I"); - if (jniMethod_ctx_DelItem == NULL) { - LOGS("ERROR: Java method ctxDelItem not found found !\n"); - return 1; - } - ctx->ctx_DelItem = &ctx_DelItem_jni; - jniMethod_ctx_DelItem_i = (*env)->GetMethodID(env, clazz, "ctxDelItemi", "(JJ)I"); - if (jniMethod_ctx_DelItem_i == NULL) { - LOGS("ERROR: Java method ctxDelItemi not found found !\n"); - return 1; - } - ctx->ctx_DelItem_i = &ctx_DelItem_i_jni; - jniMethod_ctx_DelItem_s = (*env)->GetMethodID(env, clazz, "ctxDelItems", "(JJ)I"); - if (jniMethod_ctx_DelItem_s == NULL) { - LOGS("ERROR: Java method ctxDelItems not found found !\n"); - return 1; - } - ctx->ctx_DelItem_s = &ctx_DelItem_s_jni; - jniMethod_ctx_Type = (*env)->GetMethodID(env, clazz, "ctxType", "(J)J"); - if (jniMethod_ctx_Type == NULL) { - LOGS("ERROR: Java method ctxType not found found !\n"); - return 1; - } - ctx->ctx_Type = &ctx_Type_jni; - jniMethod_ctx_TypeCheck = (*env)->GetMethodID(env, clazz, "ctxTypeCheck", "(JJ)I"); - if (jniMethod_ctx_TypeCheck == NULL) { - LOGS("ERROR: Java method ctxTypeCheck not found found !\n"); - return 1; - } - ctx->ctx_TypeCheck = &ctx_TypeCheck_jni; - jniMethod_ctx_Type_GetName = (*env)->GetMethodID(env, clazz, "ctxTypeGetName", "(J)J"); - if (jniMethod_ctx_Type_GetName == NULL) { - LOGS("ERROR: Java method ctxTypeGetName not found found !\n"); - return 1; - } - ctx->ctx_Type_GetName = &ctx_Type_GetName_jni; - jniMethod_ctx_Type_IsSubtype = (*env)->GetMethodID(env, clazz, "ctxTypeIsSubtype", "(JJ)I"); - if (jniMethod_ctx_Type_IsSubtype == NULL) { - LOGS("ERROR: Java method ctxTypeIsSubtype not found found !\n"); - return 1; - } - ctx->ctx_Type_IsSubtype = &ctx_Type_IsSubtype_jni; - jniMethod_ctx_Is = (*env)->GetMethodID(env, clazz, "ctxIs", "(JJ)I"); - if (jniMethod_ctx_Is == NULL) { - LOGS("ERROR: Java method ctxIs not found found !\n"); - return 1; - } - ctx->ctx_Is = &ctx_Is_jni; - jniMethod_ctx_AsStruct_Object = (*env)->GetMethodID(env, clazz, "ctxAsStructObject", "(J)J"); - if (jniMethod_ctx_AsStruct_Object == NULL) { - LOGS("ERROR: Java method ctxAsStructObject not found found !\n"); - return 1; - } - ctx->ctx_AsStruct_Object = &ctx_AsStruct_Object_jni; - jniMethod_ctx_AsStruct_Legacy = (*env)->GetMethodID(env, clazz, "ctxAsStructLegacy", "(J)J"); - if (jniMethod_ctx_AsStruct_Legacy == NULL) { - LOGS("ERROR: Java method ctxAsStructLegacy not found found !\n"); - return 1; - } - ctx->ctx_AsStruct_Legacy = &ctx_AsStruct_Legacy_jni; - jniMethod_ctx_AsStruct_Type = (*env)->GetMethodID(env, clazz, "ctxAsStructType", "(J)J"); - if (jniMethod_ctx_AsStruct_Type == NULL) { - LOGS("ERROR: Java method ctxAsStructType not found found !\n"); - return 1; - } - ctx->ctx_AsStruct_Type = &ctx_AsStruct_Type_jni; - jniMethod_ctx_AsStruct_Long = (*env)->GetMethodID(env, clazz, "ctxAsStructLong", "(J)J"); - if (jniMethod_ctx_AsStruct_Long == NULL) { - LOGS("ERROR: Java method ctxAsStructLong not found found !\n"); - return 1; - } - ctx->ctx_AsStruct_Long = &ctx_AsStruct_Long_jni; - jniMethod_ctx_AsStruct_Float = (*env)->GetMethodID(env, clazz, "ctxAsStructFloat", "(J)J"); - if (jniMethod_ctx_AsStruct_Float == NULL) { - LOGS("ERROR: Java method ctxAsStructFloat not found found !\n"); - return 1; - } - ctx->ctx_AsStruct_Float = &ctx_AsStruct_Float_jni; - jniMethod_ctx_AsStruct_Unicode = (*env)->GetMethodID(env, clazz, "ctxAsStructUnicode", "(J)J"); - if (jniMethod_ctx_AsStruct_Unicode == NULL) { - LOGS("ERROR: Java method ctxAsStructUnicode not found found !\n"); - return 1; - } - ctx->ctx_AsStruct_Unicode = &ctx_AsStruct_Unicode_jni; - jniMethod_ctx_AsStruct_Tuple = (*env)->GetMethodID(env, clazz, "ctxAsStructTuple", "(J)J"); - if (jniMethod_ctx_AsStruct_Tuple == NULL) { - LOGS("ERROR: Java method ctxAsStructTuple not found found !\n"); - return 1; - } - ctx->ctx_AsStruct_Tuple = &ctx_AsStruct_Tuple_jni; - jniMethod_ctx_AsStruct_List = (*env)->GetMethodID(env, clazz, "ctxAsStructList", "(J)J"); - if (jniMethod_ctx_AsStruct_List == NULL) { - LOGS("ERROR: Java method ctxAsStructList not found found !\n"); - return 1; - } - ctx->ctx_AsStruct_List = &ctx_AsStruct_List_jni; - jniMethod_ctx_Type_GetBuiltinShape = (*env)->GetMethodID(env, clazz, "ctxTypeGetBuiltinShape", "(J)I"); - if (jniMethod_ctx_Type_GetBuiltinShape == NULL) { - LOGS("ERROR: Java method ctxTypeGetBuiltinShape not found found !\n"); - return 1; - } - ctx->ctx_Type_GetBuiltinShape = &ctx_Type_GetBuiltinShape_jni; - jniMethod_ctx_New = (*env)->GetMethodID(env, clazz, "ctxNew", "(JJ)J"); - if (jniMethod_ctx_New == NULL) { - LOGS("ERROR: Java method ctxNew not found found !\n"); - return 1; - } - ctx->ctx_New = &ctx_New_jni; - jniMethod_ctx_Repr = (*env)->GetMethodID(env, clazz, "ctxRepr", "(J)J"); - if (jniMethod_ctx_Repr == NULL) { - LOGS("ERROR: Java method ctxRepr not found found !\n"); - return 1; - } - ctx->ctx_Repr = &ctx_Repr_jni; - jniMethod_ctx_Str = (*env)->GetMethodID(env, clazz, "ctxStr", "(J)J"); - if (jniMethod_ctx_Str == NULL) { - LOGS("ERROR: Java method ctxStr not found found !\n"); - return 1; - } - ctx->ctx_Str = &ctx_Str_jni; - jniMethod_ctx_ASCII = (*env)->GetMethodID(env, clazz, "ctxASCII", "(J)J"); - if (jniMethod_ctx_ASCII == NULL) { - LOGS("ERROR: Java method ctxASCII not found found !\n"); - return 1; - } - ctx->ctx_ASCII = &ctx_ASCII_jni; - jniMethod_ctx_Bytes = (*env)->GetMethodID(env, clazz, "ctxBytes", "(J)J"); - if (jniMethod_ctx_Bytes == NULL) { - LOGS("ERROR: Java method ctxBytes not found found !\n"); - return 1; - } - ctx->ctx_Bytes = &ctx_Bytes_jni; - jniMethod_ctx_RichCompare = (*env)->GetMethodID(env, clazz, "ctxRichCompare", "(JJI)J"); - if (jniMethod_ctx_RichCompare == NULL) { - LOGS("ERROR: Java method ctxRichCompare not found found !\n"); - return 1; - } - ctx->ctx_RichCompare = &ctx_RichCompare_jni; - jniMethod_ctx_RichCompareBool = (*env)->GetMethodID(env, clazz, "ctxRichCompareBool", "(JJI)I"); - if (jniMethod_ctx_RichCompareBool == NULL) { - LOGS("ERROR: Java method ctxRichCompareBool not found found !\n"); - return 1; - } - ctx->ctx_RichCompareBool = &ctx_RichCompareBool_jni; - jniMethod_ctx_Hash = (*env)->GetMethodID(env, clazz, "ctxHash", "(J)J"); - if (jniMethod_ctx_Hash == NULL) { - LOGS("ERROR: Java method ctxHash not found found !\n"); - return 1; - } - ctx->ctx_Hash = &ctx_Hash_jni; - jniMethod_ctx_Bytes_Check = (*env)->GetMethodID(env, clazz, "ctxBytesCheck", "(J)I"); - if (jniMethod_ctx_Bytes_Check == NULL) { - LOGS("ERROR: Java method ctxBytesCheck not found found !\n"); - return 1; - } - ctx->ctx_Bytes_Check = &ctx_Bytes_Check_jni; - jniMethod_ctx_Bytes_Size = (*env)->GetMethodID(env, clazz, "ctxBytesSize", "(J)J"); - if (jniMethod_ctx_Bytes_Size == NULL) { - LOGS("ERROR: Java method ctxBytesSize not found found !\n"); - return 1; - } - ctx->ctx_Bytes_Size = &ctx_Bytes_Size_jni; - jniMethod_ctx_Bytes_GET_SIZE = (*env)->GetMethodID(env, clazz, "ctxBytesGETSIZE", "(J)J"); - if (jniMethod_ctx_Bytes_GET_SIZE == NULL) { - LOGS("ERROR: Java method ctxBytesGETSIZE not found found !\n"); - return 1; - } - ctx->ctx_Bytes_GET_SIZE = &ctx_Bytes_GET_SIZE_jni; - jniMethod_ctx_Bytes_AsString = (*env)->GetMethodID(env, clazz, "ctxBytesAsString", "(J)J"); - if (jniMethod_ctx_Bytes_AsString == NULL) { - LOGS("ERROR: Java method ctxBytesAsString not found found !\n"); - return 1; - } - ctx->ctx_Bytes_AsString = &ctx_Bytes_AsString_jni; - jniMethod_ctx_Bytes_AS_STRING = (*env)->GetMethodID(env, clazz, "ctxBytesASSTRING", "(J)J"); - if (jniMethod_ctx_Bytes_AS_STRING == NULL) { - LOGS("ERROR: Java method ctxBytesASSTRING not found found !\n"); - return 1; - } - ctx->ctx_Bytes_AS_STRING = &ctx_Bytes_AS_STRING_jni; - jniMethod_ctx_Bytes_FromString = (*env)->GetMethodID(env, clazz, "ctxBytesFromString", "(J)J"); - if (jniMethod_ctx_Bytes_FromString == NULL) { - LOGS("ERROR: Java method ctxBytesFromString not found found !\n"); - return 1; - } - ctx->ctx_Bytes_FromString = &ctx_Bytes_FromString_jni; - jniMethod_ctx_Bytes_FromStringAndSize = (*env)->GetMethodID(env, clazz, "ctxBytesFromStringAndSize", "(JJ)J"); - if (jniMethod_ctx_Bytes_FromStringAndSize == NULL) { - LOGS("ERROR: Java method ctxBytesFromStringAndSize not found found !\n"); - return 1; - } - ctx->ctx_Bytes_FromStringAndSize = &ctx_Bytes_FromStringAndSize_jni; - jniMethod_ctx_Unicode_FromString = (*env)->GetMethodID(env, clazz, "ctxUnicodeFromString", "(J)J"); - if (jniMethod_ctx_Unicode_FromString == NULL) { - LOGS("ERROR: Java method ctxUnicodeFromString not found found !\n"); - return 1; - } - ctx->ctx_Unicode_FromString = &ctx_Unicode_FromString_jni; - jniMethod_ctx_Unicode_Check = (*env)->GetMethodID(env, clazz, "ctxUnicodeCheck", "(J)I"); - if (jniMethod_ctx_Unicode_Check == NULL) { - LOGS("ERROR: Java method ctxUnicodeCheck not found found !\n"); - return 1; - } - ctx->ctx_Unicode_Check = &ctx_Unicode_Check_jni; - jniMethod_ctx_Unicode_AsASCIIString = (*env)->GetMethodID(env, clazz, "ctxUnicodeAsASCIIString", "(J)J"); - if (jniMethod_ctx_Unicode_AsASCIIString == NULL) { - LOGS("ERROR: Java method ctxUnicodeAsASCIIString not found found !\n"); - return 1; - } - ctx->ctx_Unicode_AsASCIIString = &ctx_Unicode_AsASCIIString_jni; - jniMethod_ctx_Unicode_AsLatin1String = (*env)->GetMethodID(env, clazz, "ctxUnicodeAsLatin1String", "(J)J"); - if (jniMethod_ctx_Unicode_AsLatin1String == NULL) { - LOGS("ERROR: Java method ctxUnicodeAsLatin1String not found found !\n"); - return 1; - } - ctx->ctx_Unicode_AsLatin1String = &ctx_Unicode_AsLatin1String_jni; - jniMethod_ctx_Unicode_AsUTF8String = (*env)->GetMethodID(env, clazz, "ctxUnicodeAsUTF8String", "(J)J"); - if (jniMethod_ctx_Unicode_AsUTF8String == NULL) { - LOGS("ERROR: Java method ctxUnicodeAsUTF8String not found found !\n"); - return 1; - } - ctx->ctx_Unicode_AsUTF8String = &ctx_Unicode_AsUTF8String_jni; - jniMethod_ctx_Unicode_AsUTF8AndSize = (*env)->GetMethodID(env, clazz, "ctxUnicodeAsUTF8AndSize", "(JJ)J"); - if (jniMethod_ctx_Unicode_AsUTF8AndSize == NULL) { - LOGS("ERROR: Java method ctxUnicodeAsUTF8AndSize not found found !\n"); - return 1; - } - ctx->ctx_Unicode_AsUTF8AndSize = &ctx_Unicode_AsUTF8AndSize_jni; - jniMethod_ctx_Unicode_FromWideChar = (*env)->GetMethodID(env, clazz, "ctxUnicodeFromWideChar", "(JJ)J"); - if (jniMethod_ctx_Unicode_FromWideChar == NULL) { - LOGS("ERROR: Java method ctxUnicodeFromWideChar not found found !\n"); - return 1; - } - ctx->ctx_Unicode_FromWideChar = &ctx_Unicode_FromWideChar_jni; - jniMethod_ctx_Unicode_DecodeFSDefault = (*env)->GetMethodID(env, clazz, "ctxUnicodeDecodeFSDefault", "(J)J"); - if (jniMethod_ctx_Unicode_DecodeFSDefault == NULL) { - LOGS("ERROR: Java method ctxUnicodeDecodeFSDefault not found found !\n"); - return 1; - } - ctx->ctx_Unicode_DecodeFSDefault = &ctx_Unicode_DecodeFSDefault_jni; - jniMethod_ctx_Unicode_DecodeFSDefaultAndSize = (*env)->GetMethodID(env, clazz, "ctxUnicodeDecodeFSDefaultAndSize", "(JJ)J"); - if (jniMethod_ctx_Unicode_DecodeFSDefaultAndSize == NULL) { - LOGS("ERROR: Java method ctxUnicodeDecodeFSDefaultAndSize not found found !\n"); - return 1; - } - ctx->ctx_Unicode_DecodeFSDefaultAndSize = &ctx_Unicode_DecodeFSDefaultAndSize_jni; - jniMethod_ctx_Unicode_EncodeFSDefault = (*env)->GetMethodID(env, clazz, "ctxUnicodeEncodeFSDefault", "(J)J"); - if (jniMethod_ctx_Unicode_EncodeFSDefault == NULL) { - LOGS("ERROR: Java method ctxUnicodeEncodeFSDefault not found found !\n"); - return 1; - } - ctx->ctx_Unicode_EncodeFSDefault = &ctx_Unicode_EncodeFSDefault_jni; - jniMethod_ctx_Unicode_ReadChar = (*env)->GetMethodID(env, clazz, "ctxUnicodeReadChar", "(JJ)I"); - if (jniMethod_ctx_Unicode_ReadChar == NULL) { - LOGS("ERROR: Java method ctxUnicodeReadChar not found found !\n"); - return 1; - } - ctx->ctx_Unicode_ReadChar = &ctx_Unicode_ReadChar_jni; - jniMethod_ctx_Unicode_DecodeASCII = (*env)->GetMethodID(env, clazz, "ctxUnicodeDecodeASCII", "(JJJ)J"); - if (jniMethod_ctx_Unicode_DecodeASCII == NULL) { - LOGS("ERROR: Java method ctxUnicodeDecodeASCII not found found !\n"); - return 1; - } - ctx->ctx_Unicode_DecodeASCII = &ctx_Unicode_DecodeASCII_jni; - jniMethod_ctx_Unicode_DecodeLatin1 = (*env)->GetMethodID(env, clazz, "ctxUnicodeDecodeLatin1", "(JJJ)J"); - if (jniMethod_ctx_Unicode_DecodeLatin1 == NULL) { - LOGS("ERROR: Java method ctxUnicodeDecodeLatin1 not found found !\n"); - return 1; - } - ctx->ctx_Unicode_DecodeLatin1 = &ctx_Unicode_DecodeLatin1_jni; - jniMethod_ctx_Unicode_FromEncodedObject = (*env)->GetMethodID(env, clazz, "ctxUnicodeFromEncodedObject", "(JJJ)J"); - if (jniMethod_ctx_Unicode_FromEncodedObject == NULL) { - LOGS("ERROR: Java method ctxUnicodeFromEncodedObject not found found !\n"); - return 1; - } - ctx->ctx_Unicode_FromEncodedObject = &ctx_Unicode_FromEncodedObject_jni; - jniMethod_ctx_Unicode_Substring = (*env)->GetMethodID(env, clazz, "ctxUnicodeSubstring", "(JJJ)J"); - if (jniMethod_ctx_Unicode_Substring == NULL) { - LOGS("ERROR: Java method ctxUnicodeSubstring not found found !\n"); - return 1; - } - ctx->ctx_Unicode_Substring = &ctx_Unicode_Substring_jni; - jniMethod_ctx_List_Check = (*env)->GetMethodID(env, clazz, "ctxListCheck", "(J)I"); - if (jniMethod_ctx_List_Check == NULL) { - LOGS("ERROR: Java method ctxListCheck not found found !\n"); - return 1; - } - ctx->ctx_List_Check = &ctx_List_Check_jni; - jniMethod_ctx_List_New = (*env)->GetMethodID(env, clazz, "ctxListNew", "(J)J"); - if (jniMethod_ctx_List_New == NULL) { - LOGS("ERROR: Java method ctxListNew not found found !\n"); - return 1; - } - ctx->ctx_List_New = &ctx_List_New_jni; - jniMethod_ctx_List_Append = (*env)->GetMethodID(env, clazz, "ctxListAppend", "(JJ)I"); - if (jniMethod_ctx_List_Append == NULL) { - LOGS("ERROR: Java method ctxListAppend not found found !\n"); - return 1; - } - ctx->ctx_List_Append = &ctx_List_Append_jni; - jniMethod_ctx_Dict_Check = (*env)->GetMethodID(env, clazz, "ctxDictCheck", "(J)I"); - if (jniMethod_ctx_Dict_Check == NULL) { - LOGS("ERROR: Java method ctxDictCheck not found found !\n"); - return 1; - } - ctx->ctx_Dict_Check = &ctx_Dict_Check_jni; - jniMethod_ctx_Dict_New = (*env)->GetMethodID(env, clazz, "ctxDictNew", "()J"); - if (jniMethod_ctx_Dict_New == NULL) { - LOGS("ERROR: Java method ctxDictNew not found found !\n"); - return 1; - } - ctx->ctx_Dict_New = &ctx_Dict_New_jni; - jniMethod_ctx_Dict_Keys = (*env)->GetMethodID(env, clazz, "ctxDictKeys", "(J)J"); - if (jniMethod_ctx_Dict_Keys == NULL) { - LOGS("ERROR: Java method ctxDictKeys not found found !\n"); - return 1; - } - ctx->ctx_Dict_Keys = &ctx_Dict_Keys_jni; - jniMethod_ctx_Dict_Copy = (*env)->GetMethodID(env, clazz, "ctxDictCopy", "(J)J"); - if (jniMethod_ctx_Dict_Copy == NULL) { - LOGS("ERROR: Java method ctxDictCopy not found found !\n"); - return 1; - } - ctx->ctx_Dict_Copy = &ctx_Dict_Copy_jni; - jniMethod_ctx_Tuple_Check = (*env)->GetMethodID(env, clazz, "ctxTupleCheck", "(J)I"); - if (jniMethod_ctx_Tuple_Check == NULL) { - LOGS("ERROR: Java method ctxTupleCheck not found found !\n"); - return 1; - } - ctx->ctx_Tuple_Check = &ctx_Tuple_Check_jni; - jniMethod_ctx_Slice_Unpack = (*env)->GetMethodID(env, clazz, "ctxSliceUnpack", "(JJJJ)I"); - if (jniMethod_ctx_Slice_Unpack == NULL) { - LOGS("ERROR: Java method ctxSliceUnpack not found found !\n"); - return 1; - } - ctx->ctx_Slice_Unpack = &ctx_Slice_Unpack_jni; - jniMethod_ctx_Import_ImportModule = (*env)->GetMethodID(env, clazz, "ctxImportImportModule", "(J)J"); - if (jniMethod_ctx_Import_ImportModule == NULL) { - LOGS("ERROR: Java method ctxImportImportModule not found found !\n"); - return 1; - } - ctx->ctx_Import_ImportModule = &ctx_Import_ImportModule_jni; - jniMethod_ctx_Capsule_New = (*env)->GetMethodID(env, clazz, "ctxCapsuleNew", "(JJJ)J"); - if (jniMethod_ctx_Capsule_New == NULL) { - LOGS("ERROR: Java method ctxCapsuleNew not found found !\n"); - return 1; - } - ctx->ctx_Capsule_New = &ctx_Capsule_New_jni; - jniMethod_ctx_Capsule_Get = (*env)->GetMethodID(env, clazz, "ctxCapsuleGet", "(JIJ)J"); - if (jniMethod_ctx_Capsule_Get == NULL) { - LOGS("ERROR: Java method ctxCapsuleGet not found found !\n"); - return 1; - } - ctx->ctx_Capsule_Get = &ctx_Capsule_Get_jni; - jniMethod_ctx_Capsule_IsValid = (*env)->GetMethodID(env, clazz, "ctxCapsuleIsValid", "(JJ)I"); - if (jniMethod_ctx_Capsule_IsValid == NULL) { - LOGS("ERROR: Java method ctxCapsuleIsValid not found found !\n"); - return 1; - } - ctx->ctx_Capsule_IsValid = &ctx_Capsule_IsValid_jni; - jniMethod_ctx_Capsule_Set = (*env)->GetMethodID(env, clazz, "ctxCapsuleSet", "(JIJ)I"); - if (jniMethod_ctx_Capsule_Set == NULL) { - LOGS("ERROR: Java method ctxCapsuleSet not found found !\n"); - return 1; - } - ctx->ctx_Capsule_Set = &ctx_Capsule_Set_jni; - jniMethod_ctx_FromPyObject = (*env)->GetMethodID(env, clazz, "ctxFromPyObject", "(J)J"); - if (jniMethod_ctx_FromPyObject == NULL) { - LOGS("ERROR: Java method ctxFromPyObject not found found !\n"); - return 1; - } - ctx->ctx_FromPyObject = &ctx_FromPyObject_jni; - jniMethod_ctx_AsPyObject = (*env)->GetMethodID(env, clazz, "ctxAsPyObject", "(J)J"); - if (jniMethod_ctx_AsPyObject == NULL) { - LOGS("ERROR: Java method ctxAsPyObject not found found !\n"); - return 1; - } - ctx->ctx_AsPyObject = &ctx_AsPyObject_jni; - jniMethod_ctx_ListBuilder_New = (*env)->GetMethodID(env, clazz, "ctxListBuilderNew", "(J)J"); - if (jniMethod_ctx_ListBuilder_New == NULL) { - LOGS("ERROR: Java method ctxListBuilderNew not found found !\n"); - return 1; - } - ctx->ctx_ListBuilder_New = &ctx_ListBuilder_New_jni; - jniMethod_ctx_ListBuilder_Set = (*env)->GetMethodID(env, clazz, "ctxListBuilderSet", "(JJJ)V"); - if (jniMethod_ctx_ListBuilder_Set == NULL) { - LOGS("ERROR: Java method ctxListBuilderSet not found found !\n"); - return 1; - } - ctx->ctx_ListBuilder_Set = &ctx_ListBuilder_Set_jni; - jniMethod_ctx_ListBuilder_Build = (*env)->GetMethodID(env, clazz, "ctxListBuilderBuild", "(J)J"); - if (jniMethod_ctx_ListBuilder_Build == NULL) { - LOGS("ERROR: Java method ctxListBuilderBuild not found found !\n"); - return 1; - } - ctx->ctx_ListBuilder_Build = &ctx_ListBuilder_Build_jni; - jniMethod_ctx_ListBuilder_Cancel = (*env)->GetMethodID(env, clazz, "ctxListBuilderCancel", "(J)V"); - if (jniMethod_ctx_ListBuilder_Cancel == NULL) { - LOGS("ERROR: Java method ctxListBuilderCancel not found found !\n"); - return 1; - } - ctx->ctx_ListBuilder_Cancel = &ctx_ListBuilder_Cancel_jni; - jniMethod_ctx_TupleBuilder_New = (*env)->GetMethodID(env, clazz, "ctxTupleBuilderNew", "(J)J"); - if (jniMethod_ctx_TupleBuilder_New == NULL) { - LOGS("ERROR: Java method ctxTupleBuilderNew not found found !\n"); - return 1; - } - ctx->ctx_TupleBuilder_New = &ctx_TupleBuilder_New_jni; - jniMethod_ctx_TupleBuilder_Set = (*env)->GetMethodID(env, clazz, "ctxTupleBuilderSet", "(JJJ)V"); - if (jniMethod_ctx_TupleBuilder_Set == NULL) { - LOGS("ERROR: Java method ctxTupleBuilderSet not found found !\n"); - return 1; - } - ctx->ctx_TupleBuilder_Set = &ctx_TupleBuilder_Set_jni; - jniMethod_ctx_TupleBuilder_Build = (*env)->GetMethodID(env, clazz, "ctxTupleBuilderBuild", "(J)J"); - if (jniMethod_ctx_TupleBuilder_Build == NULL) { - LOGS("ERROR: Java method ctxTupleBuilderBuild not found found !\n"); - return 1; - } - ctx->ctx_TupleBuilder_Build = &ctx_TupleBuilder_Build_jni; - jniMethod_ctx_TupleBuilder_Cancel = (*env)->GetMethodID(env, clazz, "ctxTupleBuilderCancel", "(J)V"); - if (jniMethod_ctx_TupleBuilder_Cancel == NULL) { - LOGS("ERROR: Java method ctxTupleBuilderCancel not found found !\n"); - return 1; - } - ctx->ctx_TupleBuilder_Cancel = &ctx_TupleBuilder_Cancel_jni; - jniMethod_ctx_Field_Load = (*env)->GetMethodID(env, clazz, "ctxFieldLoad", "(JJ)J"); - if (jniMethod_ctx_Field_Load == NULL) { - LOGS("ERROR: Java method ctxFieldLoad not found found !\n"); - return 1; - } - ctx->ctx_Field_Load = &ctx_Field_Load_jni; - jniMethod_ctx_ReenterPythonExecution = (*env)->GetMethodID(env, clazz, "ctxReenterPythonExecution", "(J)V"); - if (jniMethod_ctx_ReenterPythonExecution == NULL) { - LOGS("ERROR: Java method ctxReenterPythonExecution not found found !\n"); - return 1; - } - ctx->ctx_ReenterPythonExecution = &ctx_ReenterPythonExecution_jni; - jniMethod_ctx_LeavePythonExecution = (*env)->GetMethodID(env, clazz, "ctxLeavePythonExecution", "()J"); - if (jniMethod_ctx_LeavePythonExecution == NULL) { - LOGS("ERROR: Java method ctxLeavePythonExecution not found found !\n"); - return 1; - } - ctx->ctx_LeavePythonExecution = &ctx_LeavePythonExecution_jni; - jniMethod_ctx_Global_Load = (*env)->GetMethodID(env, clazz, "ctxGlobalLoad", "(J)J"); - if (jniMethod_ctx_Global_Load == NULL) { - LOGS("ERROR: Java method ctxGlobalLoad not found found !\n"); - return 1; - } - ctx->ctx_Global_Load = &ctx_Global_Load_jni; - jniMethod_ctx_Dump = (*env)->GetMethodID(env, clazz, "ctxDump", "(J)V"); - if (jniMethod_ctx_Dump == NULL) { - LOGS("ERROR: Java method ctxDump not found found !\n"); - return 1; - } - ctx->ctx_Dump = &ctx_Dump_jni; - jniMethod_ctx_Compile_s = (*env)->GetMethodID(env, clazz, "ctxCompiles", "(JJI)J"); - if (jniMethod_ctx_Compile_s == NULL) { - LOGS("ERROR: Java method ctxCompiles not found found !\n"); - return 1; - } - ctx->ctx_Compile_s = &ctx_Compile_s_jni; - jniMethod_ctx_EvalCode = (*env)->GetMethodID(env, clazz, "ctxEvalCode", "(JJJ)J"); - if (jniMethod_ctx_EvalCode == NULL) { - LOGS("ERROR: Java method ctxEvalCode not found found !\n"); - return 1; - } - ctx->ctx_EvalCode = &ctx_EvalCode_jni; - jniMethod_ctx_ContextVar_New = (*env)->GetMethodID(env, clazz, "ctxContextVarNew", "(JJ)J"); - if (jniMethod_ctx_ContextVar_New == NULL) { - LOGS("ERROR: Java method ctxContextVarNew not found found !\n"); - return 1; - } - ctx->ctx_ContextVar_New = &ctx_ContextVar_New_jni; - jniMethod_ctx_ContextVar_Set = (*env)->GetMethodID(env, clazz, "ctxContextVarSet", "(JJ)J"); - if (jniMethod_ctx_ContextVar_Set == NULL) { - LOGS("ERROR: Java method ctxContextVarSet not found found !\n"); - return 1; - } - ctx->ctx_ContextVar_Set = &ctx_ContextVar_Set_jni; - jniMethod_ctx_SetCallFunction = (*env)->GetMethodID(env, clazz, "ctxSetCallFunction", "(JJ)I"); - if (jniMethod_ctx_SetCallFunction == NULL) { - LOGS("ERROR: Java method ctxSetCallFunction not found found !\n"); - return 1; - } - ctx->ctx_SetCallFunction = &ctx_SetCallFunction_jni; - return 0; -} - -static HPy ctx_Dup_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Dup, HPY_UP(h)); -} - -static void ctx_Close_jni(HPyContext *ctx, HPy h) -{ - DO_UPCALL_VOID(CONTEXT_INSTANCE(ctx), ctx_Close, HPY_UP(h)); -} - -static HPy ctx_Long_FromInt32_t_jni(HPyContext *ctx, int32_t value) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Long_FromInt32_t, INT32_UP(value)); -} - -static HPy ctx_Long_FromUInt32_t_jni(HPyContext *ctx, uint32_t value) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Long_FromUInt32_t, UINT32_UP(value)); -} - -static HPy ctx_Long_FromInt64_t_jni(HPyContext *ctx, int64_t v) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Long_FromInt64_t, LONG_UP(v)); -} - -static HPy ctx_Long_FromUInt64_t_jni(HPyContext *ctx, uint64_t v) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Long_FromUInt64_t, LONG_UP(v)); -} - -static HPy ctx_Long_FromSize_t_jni(HPyContext *ctx, size_t value) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Long_FromSize_t, LONG_UP(value)); -} - -static HPy ctx_Long_FromSsize_t_jni(HPyContext *ctx, HPy_ssize_t value) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Long_FromSsize_t, SIZE_T_UP(value)); -} - -static int32_t ctx_Long_AsInt32_t_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_INT32_T(CONTEXT_INSTANCE(ctx), ctx_Long_AsInt32_t, HPY_UP(h)); -} - -static uint32_t ctx_Long_AsUInt32_t_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_UINT32_T(CONTEXT_INSTANCE(ctx), ctx_Long_AsUInt32_t, HPY_UP(h)); -} - -static uint32_t ctx_Long_AsUInt32_tMask_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_UINT32_T(CONTEXT_INSTANCE(ctx), ctx_Long_AsUInt32_tMask, HPY_UP(h)); -} - -static int64_t ctx_Long_AsInt64_t_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_INT64_T(CONTEXT_INSTANCE(ctx), ctx_Long_AsInt64_t, HPY_UP(h)); -} - -static uint64_t ctx_Long_AsUInt64_t_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_UINT64_T(CONTEXT_INSTANCE(ctx), ctx_Long_AsUInt64_t, HPY_UP(h)); -} - -static uint64_t ctx_Long_AsUInt64_tMask_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_UINT64_T(CONTEXT_INSTANCE(ctx), ctx_Long_AsUInt64_tMask, HPY_UP(h)); -} - -static size_t ctx_Long_AsSize_t_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_SIZE_T(CONTEXT_INSTANCE(ctx), ctx_Long_AsSize_t, HPY_UP(h)); -} - -static HPy_ssize_t ctx_Long_AsSsize_t_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_HPY_SSIZE_T(CONTEXT_INSTANCE(ctx), ctx_Long_AsSsize_t, HPY_UP(h)); -} - -static void *ctx_Long_AsVoidPtr_jni(HPyContext *ctx, HPy h) -{ - return (void *)DO_UPCALL_PTR(CONTEXT_INSTANCE(ctx), ctx_Long_AsVoidPtr, HPY_UP(h)); -} - -static double ctx_Long_AsDouble_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_DOUBLE(CONTEXT_INSTANCE(ctx), ctx_Long_AsDouble, HPY_UP(h)); -} - -static HPy ctx_Float_FromDouble_jni(HPyContext *ctx, double v) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Float_FromDouble, DOUBLE_UP(v)); -} - -static double ctx_Float_AsDouble_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_DOUBLE(CONTEXT_INSTANCE(ctx), ctx_Float_AsDouble, HPY_UP(h)); -} - -static HPy ctx_Bool_FromBool_jni(HPyContext *ctx, bool v) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Bool_FromBool, LONG_UP(v)); -} - -static HPy_ssize_t ctx_Length_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_HPY_SSIZE_T(CONTEXT_INSTANCE(ctx), ctx_Length, HPY_UP(h)); -} - -static int ctx_Number_Check_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_Number_Check, HPY_UP(h)); -} - -static HPy ctx_Add_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Add, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_Subtract_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Subtract, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_Multiply_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Multiply, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_MatrixMultiply_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_MatrixMultiply, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_FloorDivide_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_FloorDivide, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_TrueDivide_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_TrueDivide, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_Remainder_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Remainder, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_Divmod_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Divmod, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_Power_jni(HPyContext *ctx, HPy h1, HPy h2, HPy h3) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Power, HPY_UP(h1), HPY_UP(h2), HPY_UP(h3)); -} - -static HPy ctx_Negative_jni(HPyContext *ctx, HPy h1) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Negative, HPY_UP(h1)); -} - -static HPy ctx_Positive_jni(HPyContext *ctx, HPy h1) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Positive, HPY_UP(h1)); -} - -static HPy ctx_Absolute_jni(HPyContext *ctx, HPy h1) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Absolute, HPY_UP(h1)); -} - -static HPy ctx_Invert_jni(HPyContext *ctx, HPy h1) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Invert, HPY_UP(h1)); -} - -static HPy ctx_Lshift_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Lshift, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_Rshift_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Rshift, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_And_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_And, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_Xor_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Xor, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_Or_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Or, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_Index_jni(HPyContext *ctx, HPy h1) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Index, HPY_UP(h1)); -} - -static HPy ctx_Long_jni(HPyContext *ctx, HPy h1) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Long, HPY_UP(h1)); -} - -static HPy ctx_Float_jni(HPyContext *ctx, HPy h1) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Float, HPY_UP(h1)); -} - -static HPy ctx_InPlaceAdd_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_InPlaceAdd, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_InPlaceSubtract_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_InPlaceSubtract, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_InPlaceMultiply_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_InPlaceMultiply, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_InPlaceMatrixMultiply_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_InPlaceMatrixMultiply, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_InPlaceFloorDivide_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_InPlaceFloorDivide, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_InPlaceTrueDivide_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_InPlaceTrueDivide, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_InPlaceRemainder_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_InPlaceRemainder, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_InPlacePower_jni(HPyContext *ctx, HPy h1, HPy h2, HPy h3) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_InPlacePower, HPY_UP(h1), HPY_UP(h2), HPY_UP(h3)); -} - -static HPy ctx_InPlaceLshift_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_InPlaceLshift, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_InPlaceRshift_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_InPlaceRshift, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_InPlaceAnd_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_InPlaceAnd, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_InPlaceXor_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_InPlaceXor, HPY_UP(h1), HPY_UP(h2)); -} - -static HPy ctx_InPlaceOr_jni(HPyContext *ctx, HPy h1, HPy h2) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_InPlaceOr, HPY_UP(h1), HPY_UP(h2)); -} - -static int ctx_Callable_Check_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_Callable_Check, HPY_UP(h)); -} - -static HPy ctx_CallTupleDict_jni(HPyContext *ctx, HPy callable, HPy args, HPy kw) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_CallTupleDict, HPY_UP(callable), HPY_UP(args), HPY_UP(kw)); -} - -static HPy ctx_Call_jni(HPyContext *ctx, HPy callable, const HPy *args, size_t nargs, HPy kwnames) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Call, HPY_UP(callable), PTR_UP(args), LONG_UP(nargs), HPY_UP(kwnames)); -} - -static HPy ctx_CallMethod_jni(HPyContext *ctx, HPy name, const HPy *args, size_t nargs, HPy kwnames) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_CallMethod, HPY_UP(name), PTR_UP(args), LONG_UP(nargs), HPY_UP(kwnames)); -} - -static void ctx_FatalError_jni(HPyContext *ctx, const char *message) -{ - DO_UPCALL_VOID(CONTEXT_INSTANCE(ctx), ctx_FatalError, PTR_UP(message)); -} - -static void ctx_Err_SetString_jni(HPyContext *ctx, HPy h_type, const char *utf8_message) -{ - DO_UPCALL_VOID(CONTEXT_INSTANCE(ctx), ctx_Err_SetString, HPY_UP(h_type), PTR_UP(utf8_message)); -} - -static void ctx_Err_SetObject_jni(HPyContext *ctx, HPy h_type, HPy h_value) -{ - DO_UPCALL_VOID(CONTEXT_INSTANCE(ctx), ctx_Err_SetObject, HPY_UP(h_type), HPY_UP(h_value)); -} - -static HPy ctx_Err_SetFromErrnoWithFilename_jni(HPyContext *ctx, HPy h_type, const char *filename_fsencoded) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Err_SetFromErrnoWithFilename, HPY_UP(h_type), PTR_UP(filename_fsencoded)); -} - -static void ctx_Err_SetFromErrnoWithFilenameObjects_jni(HPyContext *ctx, HPy h_type, HPy filename1, HPy filename2) -{ - DO_UPCALL_VOID(CONTEXT_INSTANCE(ctx), ctx_Err_SetFromErrnoWithFilenameObjects, HPY_UP(h_type), HPY_UP(filename1), HPY_UP(filename2)); -} - -static int ctx_Err_Occurred_jni(HPyContext *ctx) -{ - return DO_UPCALL_INT0(CONTEXT_INSTANCE(ctx), ctx_Err_Occurred); -} - -static int ctx_Err_ExceptionMatches_jni(HPyContext *ctx, HPy exc) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_Err_ExceptionMatches, HPY_UP(exc)); -} - -static void ctx_Err_NoMemory_jni(HPyContext *ctx) -{ - DO_UPCALL_VOID0(CONTEXT_INSTANCE(ctx), ctx_Err_NoMemory); -} - -static void ctx_Err_Clear_jni(HPyContext *ctx) -{ - DO_UPCALL_VOID0(CONTEXT_INSTANCE(ctx), ctx_Err_Clear); -} - -static HPy ctx_Err_NewException_jni(HPyContext *ctx, const char *utf8_name, HPy base, HPy dict) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Err_NewException, PTR_UP(utf8_name), HPY_UP(base), HPY_UP(dict)); -} - -static HPy ctx_Err_NewExceptionWithDoc_jni(HPyContext *ctx, const char *utf8_name, const char *utf8_doc, HPy base, HPy dict) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Err_NewExceptionWithDoc, PTR_UP(utf8_name), PTR_UP(utf8_doc), HPY_UP(base), HPY_UP(dict)); -} - -static int ctx_Err_WarnEx_jni(HPyContext *ctx, HPy category, const char *utf8_message, HPy_ssize_t stack_level) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_Err_WarnEx, HPY_UP(category), PTR_UP(utf8_message), SIZE_T_UP(stack_level)); -} - -static void ctx_Err_WriteUnraisable_jni(HPyContext *ctx, HPy obj) -{ - DO_UPCALL_VOID(CONTEXT_INSTANCE(ctx), ctx_Err_WriteUnraisable, HPY_UP(obj)); -} - -static int ctx_IsTrue_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_IsTrue, HPY_UP(h)); -} - -static HPy ctx_Type_FromSpec_jni(HPyContext *ctx, HPyType_Spec *spec, HPyType_SpecParam *params) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Type_FromSpec, PTR_UP(spec), PTR_UP(params)); -} - -static HPy ctx_Type_GenericNew_jni(HPyContext *ctx, HPy type, const HPy *args, HPy_ssize_t nargs, HPy kw) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Type_GenericNew, HPY_UP(type), PTR_UP(args), SIZE_T_UP(nargs), HPY_UP(kw)); -} - -static HPy ctx_GetAttr_jni(HPyContext *ctx, HPy obj, HPy name) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_GetAttr, HPY_UP(obj), HPY_UP(name)); -} - -static int ctx_HasAttr_jni(HPyContext *ctx, HPy obj, HPy name) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_HasAttr, HPY_UP(obj), HPY_UP(name)); -} - -static int ctx_HasAttr_s_jni(HPyContext *ctx, HPy obj, const char *utf8_name) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_HasAttr_s, HPY_UP(obj), PTR_UP(utf8_name)); -} - -static int ctx_SetAttr_jni(HPyContext *ctx, HPy obj, HPy name, HPy value) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_SetAttr, HPY_UP(obj), HPY_UP(name), HPY_UP(value)); -} - -static int ctx_SetAttr_s_jni(HPyContext *ctx, HPy obj, const char *utf8_name, HPy value) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_SetAttr_s, HPY_UP(obj), PTR_UP(utf8_name), HPY_UP(value)); -} - -static HPy ctx_GetItem_jni(HPyContext *ctx, HPy obj, HPy key) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_GetItem, HPY_UP(obj), HPY_UP(key)); -} - -static HPy ctx_GetItem_i_jni(HPyContext *ctx, HPy obj, HPy_ssize_t idx) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_GetItem_i, HPY_UP(obj), SIZE_T_UP(idx)); -} - -static int ctx_Contains_jni(HPyContext *ctx, HPy container, HPy key) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_Contains, HPY_UP(container), HPY_UP(key)); -} - -static int ctx_SetItem_jni(HPyContext *ctx, HPy obj, HPy key, HPy value) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_SetItem, HPY_UP(obj), HPY_UP(key), HPY_UP(value)); -} - -static int ctx_SetItem_i_jni(HPyContext *ctx, HPy obj, HPy_ssize_t idx, HPy value) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_SetItem_i, HPY_UP(obj), SIZE_T_UP(idx), HPY_UP(value)); -} - -static int ctx_DelItem_jni(HPyContext *ctx, HPy obj, HPy key) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_DelItem, HPY_UP(obj), HPY_UP(key)); -} - -static int ctx_DelItem_i_jni(HPyContext *ctx, HPy obj, HPy_ssize_t idx) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_DelItem_i, HPY_UP(obj), SIZE_T_UP(idx)); -} - -static int ctx_DelItem_s_jni(HPyContext *ctx, HPy obj, const char *utf8_key) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_DelItem_s, HPY_UP(obj), PTR_UP(utf8_key)); -} - -static HPy ctx_Type_jni(HPyContext *ctx, HPy obj) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Type, HPY_UP(obj)); -} - -static int ctx_TypeCheck_jni(HPyContext *ctx, HPy obj, HPy type) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_TypeCheck, HPY_UP(obj), HPY_UP(type)); -} - -static const char *ctx_Type_GetName_jni(HPyContext *ctx, HPy type) -{ - return (const char *)DO_UPCALL_PTR(CONTEXT_INSTANCE(ctx), ctx_Type_GetName, HPY_UP(type)); -} - -static int ctx_Type_IsSubtype_jni(HPyContext *ctx, HPy sub, HPy type) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_Type_IsSubtype, HPY_UP(sub), HPY_UP(type)); -} - -static int ctx_Is_jni(HPyContext *ctx, HPy obj, HPy other) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_Is, HPY_UP(obj), HPY_UP(other)); -} - -static void *ctx_AsStruct_Object_jni(HPyContext *ctx, HPy h) -{ - return (void *)DO_UPCALL_PTR(CONTEXT_INSTANCE(ctx), ctx_AsStruct_Object, HPY_UP(h)); -} - -static void *ctx_AsStruct_Legacy_jni(HPyContext *ctx, HPy h) -{ - return (void *)DO_UPCALL_PTR(CONTEXT_INSTANCE(ctx), ctx_AsStruct_Legacy, HPY_UP(h)); -} - -static void *ctx_AsStruct_Type_jni(HPyContext *ctx, HPy h) -{ - return (void *)DO_UPCALL_PTR(CONTEXT_INSTANCE(ctx), ctx_AsStruct_Type, HPY_UP(h)); -} - -static void *ctx_AsStruct_Long_jni(HPyContext *ctx, HPy h) -{ - return (void *)DO_UPCALL_PTR(CONTEXT_INSTANCE(ctx), ctx_AsStruct_Long, HPY_UP(h)); -} - -static void *ctx_AsStruct_Float_jni(HPyContext *ctx, HPy h) -{ - return (void *)DO_UPCALL_PTR(CONTEXT_INSTANCE(ctx), ctx_AsStruct_Float, HPY_UP(h)); -} - -static void *ctx_AsStruct_Unicode_jni(HPyContext *ctx, HPy h) -{ - return (void *)DO_UPCALL_PTR(CONTEXT_INSTANCE(ctx), ctx_AsStruct_Unicode, HPY_UP(h)); -} - -static void *ctx_AsStruct_Tuple_jni(HPyContext *ctx, HPy h) -{ - return (void *)DO_UPCALL_PTR(CONTEXT_INSTANCE(ctx), ctx_AsStruct_Tuple, HPY_UP(h)); -} - -static void *ctx_AsStruct_List_jni(HPyContext *ctx, HPy h) -{ - return (void *)DO_UPCALL_PTR(CONTEXT_INSTANCE(ctx), ctx_AsStruct_List, HPY_UP(h)); -} - -static HPyType_BuiltinShape ctx_Type_GetBuiltinShape_jni(HPyContext *ctx, HPy h_type) -{ - return DO_UPCALL_HPYTYPE_BUILTINSHAPE(CONTEXT_INSTANCE(ctx), ctx_Type_GetBuiltinShape, HPY_UP(h_type)); -} - -static HPy ctx_New_jni(HPyContext *ctx, HPy h_type, void **data) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_New, HPY_UP(h_type), PTR_UP(data)); -} - -static HPy ctx_Repr_jni(HPyContext *ctx, HPy obj) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Repr, HPY_UP(obj)); -} - -static HPy ctx_Str_jni(HPyContext *ctx, HPy obj) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Str, HPY_UP(obj)); -} - -static HPy ctx_ASCII_jni(HPyContext *ctx, HPy obj) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_ASCII, HPY_UP(obj)); -} - -static HPy ctx_Bytes_jni(HPyContext *ctx, HPy obj) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Bytes, HPY_UP(obj)); -} - -static HPy ctx_RichCompare_jni(HPyContext *ctx, HPy v, HPy w, int op) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_RichCompare, HPY_UP(v), HPY_UP(w), INT_UP(op)); -} - -static int ctx_RichCompareBool_jni(HPyContext *ctx, HPy v, HPy w, int op) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_RichCompareBool, HPY_UP(v), HPY_UP(w), INT_UP(op)); -} - -static HPy_hash_t ctx_Hash_jni(HPyContext *ctx, HPy obj) -{ - return DO_UPCALL_HPY_HASH_T(CONTEXT_INSTANCE(ctx), ctx_Hash, HPY_UP(obj)); -} - -static int ctx_Bytes_Check_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_Bytes_Check, HPY_UP(h)); -} - -static HPy_ssize_t ctx_Bytes_Size_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_HPY_SSIZE_T(CONTEXT_INSTANCE(ctx), ctx_Bytes_Size, HPY_UP(h)); -} - -static HPy_ssize_t ctx_Bytes_GET_SIZE_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_HPY_SSIZE_T(CONTEXT_INSTANCE(ctx), ctx_Bytes_GET_SIZE, HPY_UP(h)); -} - -static const char *ctx_Bytes_AsString_jni(HPyContext *ctx, HPy h) -{ - return (const char *)DO_UPCALL_PTR(CONTEXT_INSTANCE(ctx), ctx_Bytes_AsString, HPY_UP(h)); -} - -static const char *ctx_Bytes_AS_STRING_jni(HPyContext *ctx, HPy h) -{ - return (const char *)DO_UPCALL_PTR(CONTEXT_INSTANCE(ctx), ctx_Bytes_AS_STRING, HPY_UP(h)); -} - -static HPy ctx_Bytes_FromString_jni(HPyContext *ctx, const char *bytes) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Bytes_FromString, PTR_UP(bytes)); -} - -static HPy ctx_Bytes_FromStringAndSize_jni(HPyContext *ctx, const char *bytes, HPy_ssize_t len) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Bytes_FromStringAndSize, PTR_UP(bytes), SIZE_T_UP(len)); -} - -static HPy ctx_Unicode_FromString_jni(HPyContext *ctx, const char *utf8) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Unicode_FromString, PTR_UP(utf8)); -} - -static int ctx_Unicode_Check_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_Unicode_Check, HPY_UP(h)); -} - -static HPy ctx_Unicode_AsASCIIString_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Unicode_AsASCIIString, HPY_UP(h)); -} - -static HPy ctx_Unicode_AsLatin1String_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Unicode_AsLatin1String, HPY_UP(h)); -} - -static HPy ctx_Unicode_AsUTF8String_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Unicode_AsUTF8String, HPY_UP(h)); -} - -static const char *ctx_Unicode_AsUTF8AndSize_jni(HPyContext *ctx, HPy h, HPy_ssize_t *size) -{ - return (const char *)DO_UPCALL_PTR(CONTEXT_INSTANCE(ctx), ctx_Unicode_AsUTF8AndSize, HPY_UP(h), PTR_UP(size)); -} - -static HPy ctx_Unicode_DecodeFSDefault_jni(HPyContext *ctx, const char *v) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Unicode_DecodeFSDefault, PTR_UP(v)); -} - -static HPy ctx_Unicode_DecodeFSDefaultAndSize_jni(HPyContext *ctx, const char *v, HPy_ssize_t size) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Unicode_DecodeFSDefaultAndSize, PTR_UP(v), SIZE_T_UP(size)); -} - -static HPy ctx_Unicode_EncodeFSDefault_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Unicode_EncodeFSDefault, HPY_UP(h)); -} - -static HPy_UCS4 ctx_Unicode_ReadChar_jni(HPyContext *ctx, HPy h, HPy_ssize_t index) -{ - return DO_UPCALL_HPY_UCS4(CONTEXT_INSTANCE(ctx), ctx_Unicode_ReadChar, HPY_UP(h), SIZE_T_UP(index)); -} - -static HPy ctx_Unicode_DecodeASCII_jni(HPyContext *ctx, const char *ascii, HPy_ssize_t size, const char *errors) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Unicode_DecodeASCII, PTR_UP(ascii), SIZE_T_UP(size), PTR_UP(errors)); -} - -static HPy ctx_Unicode_DecodeLatin1_jni(HPyContext *ctx, const char *latin1, HPy_ssize_t size, const char *errors) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Unicode_DecodeLatin1, PTR_UP(latin1), SIZE_T_UP(size), PTR_UP(errors)); -} - -static HPy ctx_Unicode_FromEncodedObject_jni(HPyContext *ctx, HPy obj, const char *encoding, const char *errors) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Unicode_FromEncodedObject, HPY_UP(obj), PTR_UP(encoding), PTR_UP(errors)); -} - -static HPy ctx_Unicode_Substring_jni(HPyContext *ctx, HPy str, HPy_ssize_t start, HPy_ssize_t end) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Unicode_Substring, HPY_UP(str), SIZE_T_UP(start), SIZE_T_UP(end)); -} - -static int ctx_List_Check_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_List_Check, HPY_UP(h)); -} - -static HPy ctx_List_New_jni(HPyContext *ctx, HPy_ssize_t len) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_List_New, SIZE_T_UP(len)); -} - -static int ctx_List_Append_jni(HPyContext *ctx, HPy h_list, HPy h_item) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_List_Append, HPY_UP(h_list), HPY_UP(h_item)); -} - -static int ctx_Dict_Check_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_Dict_Check, HPY_UP(h)); -} - -static HPy ctx_Dict_New_jni(HPyContext *ctx) -{ - return DO_UPCALL_HPY0(CONTEXT_INSTANCE(ctx), ctx_Dict_New); -} - -static HPy ctx_Dict_Keys_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Dict_Keys, HPY_UP(h)); -} - -static HPy ctx_Dict_Copy_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Dict_Copy, HPY_UP(h)); -} - -static int ctx_Tuple_Check_jni(HPyContext *ctx, HPy h) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_Tuple_Check, HPY_UP(h)); -} - -static int ctx_Slice_Unpack_jni(HPyContext *ctx, HPy slice, HPy_ssize_t *start, HPy_ssize_t *stop, HPy_ssize_t *step) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_Slice_Unpack, HPY_UP(slice), PTR_UP(start), PTR_UP(stop), PTR_UP(step)); -} - -static HPy ctx_Import_ImportModule_jni(HPyContext *ctx, const char *utf8_name) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Import_ImportModule, PTR_UP(utf8_name)); -} - -static HPy ctx_Capsule_New_jni(HPyContext *ctx, void *pointer, const char *utf8_name, HPyCapsule_Destructor *destructor) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Capsule_New, PTR_UP(pointer), PTR_UP(utf8_name), PTR_UP(destructor)); -} - -static void *ctx_Capsule_Get_jni(HPyContext *ctx, HPy capsule, _HPyCapsule_key key, const char *utf8_name) -{ - return (void *)DO_UPCALL_PTR(CONTEXT_INSTANCE(ctx), ctx_Capsule_Get, HPY_UP(capsule), INT_UP(key), PTR_UP(utf8_name)); -} - -static int ctx_Capsule_IsValid_jni(HPyContext *ctx, HPy capsule, const char *utf8_name) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_Capsule_IsValid, HPY_UP(capsule), PTR_UP(utf8_name)); -} - -static int ctx_Capsule_Set_jni(HPyContext *ctx, HPy capsule, _HPyCapsule_key key, void *value) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_Capsule_Set, HPY_UP(capsule), INT_UP(key), PTR_UP(value)); -} - -static HPy ctx_FromPyObject_jni(HPyContext *ctx, cpy_PyObject *obj) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_FromPyObject, PTR_UP(obj)); -} - -static cpy_PyObject *ctx_AsPyObject_jni(HPyContext *ctx, HPy h) -{ - return (cpy_PyObject *)DO_UPCALL_PTR(CONTEXT_INSTANCE(ctx), ctx_AsPyObject, HPY_UP(h)); -} - -static HPy ctx_Field_Load_jni(HPyContext *ctx, HPy source_object, HPyField source_field) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Field_Load, HPY_UP(source_object), HPY_FIELD_UP(source_field)); -} - -static void ctx_ReenterPythonExecution_jni(HPyContext *ctx, HPyThreadState state) -{ - DO_UPCALL_VOID(CONTEXT_INSTANCE(ctx), ctx_ReenterPythonExecution, HPY_THREAD_STATE_UP(state)); -} - -static HPyThreadState ctx_LeavePythonExecution_jni(HPyContext *ctx) -{ - return DO_UPCALL_HPYTHREADSTATE0(CONTEXT_INSTANCE(ctx), ctx_LeavePythonExecution); -} - -static void ctx_Dump_jni(HPyContext *ctx, HPy h) -{ - DO_UPCALL_VOID(CONTEXT_INSTANCE(ctx), ctx_Dump, HPY_UP(h)); -} - -static HPy ctx_Compile_s_jni(HPyContext *ctx, const char *utf8_source, const char *utf8_filename, HPy_SourceKind kind) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Compile_s, PTR_UP(utf8_source), PTR_UP(utf8_filename), INT_UP(kind)); -} - -static HPy ctx_EvalCode_jni(HPyContext *ctx, HPy code, HPy globals, HPy locals) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_EvalCode, HPY_UP(code), HPY_UP(globals), HPY_UP(locals)); -} - -static HPy ctx_ContextVar_New_jni(HPyContext *ctx, const char *name, HPy default_value) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_ContextVar_New, PTR_UP(name), HPY_UP(default_value)); -} - -static HPy ctx_ContextVar_Set_jni(HPyContext *ctx, HPy context_var, HPy value) -{ - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_ContextVar_Set, HPY_UP(context_var), HPY_UP(value)); -} - -static int ctx_SetCallFunction_jni(HPyContext *ctx, HPy h, HPyCallFunction *func) -{ - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctx_SetCallFunction, HPY_UP(h), PTR_UP(func)); -} - diff --git a/graalpython/com.oracle.graal.python.jni/src/ctx_builder.c b/graalpython/com.oracle.graal.python.jni/src/ctx_builder.c deleted file mode 100644 index 0cdc74a7b7..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/ctx_builder.c +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* - * Native implementation of HPyTupleBuilder. - * This is written in a way that we could also use the internal functions - * 'builder_*' to implement HPyListBuilder. - */ - - -#include "hpy_jni.h" - -typedef struct { - HPy_ssize_t capacity; // allocated handles - HPy handles[0]; -} _HPyBuilder_s; - -static inline _HPyBuilder_s *_ht2hb(HPyTupleBuilder ht) { - return (_HPyBuilder_s *) (ht)._tup; -} - -static inline HPyTupleBuilder _hb2ht(_HPyBuilder_s *hp) { - return (HPyTupleBuilder) {(intptr_t) (hp)}; -} - -static inline _HPyBuilder_s *_hl2hb(HPyListBuilder ht) { - return (_HPyBuilder_s *) (ht)._lst; -} - -static inline HPyListBuilder _hb2hl(_HPyBuilder_s *hp) { - return (HPyListBuilder) {(intptr_t) (hp)}; -} - -static inline _HPyBuilder_s *builder_new(HPy_ssize_t size) { - _HPyBuilder_s *hb = calloc(1, sizeof(_HPyBuilder_s) + size * sizeof(HPy)); - if (hb == NULL) { - /* delay the MemoryError */ - /* note: it's done this way so that the caller doesn't need to - check if HPyTupleBuilder_New() or every HPyTupleBuilder_Set() - raised. If there is a rare error like a MemoryError somewhere, - further calls to the HPyTupleBuilder are ignored. The final - HPyTupleBuilder_Build() will re-raise the MemoryError and so - it's enough for the caller to check at that point. */ - } else { - hb->capacity = size; - } - return hb; -} -static inline void builder_set(HPyContext *ctx, _HPyBuilder_s *hb, HPy_ssize_t index, HPy h_item) -{ - if (hb != NULL) { - assert(index >= 0 && index < hb->capacity); - assert(HPy_IsNull(hb->handles[index])); - hb->handles[index] = HPy_Dup(ctx, h_item); - } -} - -static inline void builder_cancel(HPyContext *ctx, _HPyBuilder_s *hb) -{ - if (hb == NULL) { - // we don't report the memory error here: the builder - // is being cancelled (so the result of the builder is not being used) - // and likely it's being cancelled during the handling of another error - return; - } - for (HPy_ssize_t i = 0; i < hb->capacity; i++) { - HPy_Close(ctx, hb->handles[i]); - } - free(hb); -} - -_HPy_HIDDEN HPyTupleBuilder -ctx_TupleBuilder_New_jni(HPyContext *ctx, HPy_ssize_t size) -{ - return _hb2ht(builder_new(size)); -} - -_HPy_HIDDEN void -ctx_TupleBuilder_Set_jni(HPyContext *ctx, HPyTupleBuilder builder, - HPy_ssize_t index, HPy h_item) -{ - builder_set(ctx, _ht2hb(builder), index, h_item); -} - -_HPy_HIDDEN HPy -ctx_TupleBuilder_Build_jni(HPyContext *ctx, HPyTupleBuilder builder) -{ - _HPyBuilder_s *hb = _ht2hb(builder); - if (hb == NULL) { - HPyErr_NoMemory(ctx); - return HPy_NULL; - } - HPy res = upcallSequenceFromArray(ctx, hb->handles, hb->capacity, JNI_TRUE, JNI_FALSE); - free(hb); - return res; -} - -_HPy_HIDDEN void -ctx_TupleBuilder_Cancel_jni(HPyContext *ctx, HPyTupleBuilder builder) -{ - builder_cancel(ctx, _ht2hb(builder)); -} - -_HPy_HIDDEN HPyListBuilder -ctx_ListBuilder_New_jni(HPyContext *ctx, HPy_ssize_t size) -{ - return _hb2hl(builder_new(size)); -} - -_HPy_HIDDEN void -ctx_ListBuilder_Set_jni(HPyContext *ctx, HPyListBuilder builder, - HPy_ssize_t index, HPy h_item) -{ - builder_set(ctx, _hl2hb(builder), index, h_item); -} - -_HPy_HIDDEN HPy -ctx_ListBuilder_Build_jni(HPyContext *ctx, HPyListBuilder builder) -{ - _HPyBuilder_s *hb = _hl2hb(builder); - if (hb == NULL) { - HPyErr_NoMemory(ctx); - return HPy_NULL; - } - HPy res = upcallSequenceFromArray(ctx, hb->handles, hb->capacity, JNI_TRUE, JNI_TRUE); - free(hb); - return res; -} - -_HPy_HIDDEN void -ctx_ListBuilder_Cancel_jni(HPyContext *ctx, HPyListBuilder builder) -{ - builder_cancel(ctx, _hl2hb(builder)); -} diff --git a/graalpython/com.oracle.graal.python.jni/src/ctx_call_jni.c b/graalpython/com.oracle.graal.python.jni/src/ctx_call_jni.c deleted file mode 100644 index 9c07c5aa12..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/ctx_call_jni.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#include "hpy_jni.h" -#include "com_oracle_graal_python_builtins_objects_cext_hpy_jni_GraalHPyJNITrampolines.h" - -#define TRAMPOLINE(name) Java_com_oracle_graal_python_builtins_objects_cext_hpy_jni_GraalHPyJNITrampolines_ ## name - - -/******************************************************************* - * MANUAL TRAMPOLINES * - *******************************************************************/ - -JNIEXPORT jlong JNICALL TRAMPOLINE(executeDebugKeywords)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong self, jlong args, jlong nargs, jlong kwnames) -{ - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_keywords f = (HPyFunc_keywords)target; - DHPy dh_self = _jlong2dh(dctx, self); - UHPy uh_kwnames = _jlong2h(kwnames); - DHPy dh_kwnames; - HPy_ssize_t n_kwnames; - if (!HPy_IsNull(uh_kwnames)) - { - n_kwnames = HPy_Length(get_info(dctx)->uctx, uh_kwnames); - dh_kwnames = DHPy_open(dctx, uh_kwnames); - } - else - { - n_kwnames = 0; - dh_kwnames = HPy_NULL; - } - assert(nargs >= 0); - assert(n_kwnames >= 0); - jlong nargs_with_kw = nargs + n_kwnames; - _ARR_JLONG2DH(dctx, dh_args, args, nargs_with_kw) - DHPy dh_result = f(dctx, dh_self, dh_args, (size_t)nargs, dh_kwnames); - _ARR_DH_CLOSE(dctx, dh_args, nargs_with_kw) - DHPy_close_and_check(dctx, dh_self); - DHPy_close_and_check(dctx, dh_kwnames); - return from_dh(dctx, dh_result); -} - -JNIEXPORT jint JNICALL TRAMPOLINE(executeDebugGetbufferproc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg1, jlong arg2, jint arg3) { - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_getbufferproc f = (HPyFunc_getbufferproc) target; - DHPy_buffer dbuffer; - DHPy dh_arg1 = _jlong2dh(dctx, arg1); - jint result = f(dctx, dh_arg1, &dbuffer, (int) arg3); - DHPy_close_and_check(dctx, dh_arg1); - _buffer_d2u(dctx, &dbuffer, (UHPy_buffer *) arg2); - DHPy_close(dctx, dbuffer.obj); - return result; -} - -JNIEXPORT void JNICALL TRAMPOLINE(executeDebugReleasebufferproc)(JNIEnv *env, jclass clazz, jlong target, jlong ctx, jlong arg1, jlong arg2) { - HPyContext *dctx = (HPyContext *) ctx; - HPyFunc_releasebufferproc f = (HPyFunc_releasebufferproc) target; - DHPy_buffer dbuf; - _buffer_u2d(dctx, (UHPy_buffer *) arg2, &dbuf); - DHPy dh_arg1 = _jlong2dh(dctx, arg1); - f(dctx, dh_arg1, &dbuf); - DHPy_close_and_check(dctx, dh_arg1); - // TODO(fa): should we use DHPy_close_and_check ? - DHPy_close(dctx, dbuf.obj); -} - -JNIEXPORT void JNICALL TRAMPOLINE(executeDestroyfunc)(JNIEnv *env, jclass clazz, jlong target, jlong dataptr) -{ - HPyFunc_destroyfunc f = (HPyFunc_destroyfunc)target; - f((void *)dataptr); -} - -#undef TRAMPOLINE diff --git a/graalpython/com.oracle.graal.python.jni/src/ctx_tracker.c b/graalpython/com.oracle.graal.python.jni/src/ctx_tracker.c deleted file mode 100644 index 047bcd3643..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/ctx_tracker.c +++ /dev/null @@ -1,171 +0,0 @@ -/* MIT License - * - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/** - * A manager for HPy handles, allowing handles to be tracked - * and closed as a group. - * - * Note:: - * Calling HPyTracker_New(ctx, n) will ensure that at least n handles - * can be tracked without a call to HPyTracker_Add failing. - * - * If a call to HPyTracker_Add fails, the tracker still guarantees that - * the handle passed to it has been tracked (internally it does this by - * maintaining space for one more handle). - * - * After HPyTracker_Add fails, HPyTracker_Close should be called without - * any further calls to HPyTracker_Add. Calling HPyTracker_Close will close - * all the tracked handles, including the handled passed to the failed call - * to HPyTracker_Add. - * - * Example usage (inside an HPyDef_METH function):: - * - * long i; - * HPy key, value; - * HPyTracker ht; - * - * ht = HPyTracker_New(ctx, 0); // track the key-value pairs - * if (HPy_IsNull(ht)) - * return HPy_NULL; - * - * HPy dict = HPyDict_New(ctx); - * if (HPy_IsNull(dict)) - * goto error; - * - * for (i=0; i<5; i++) { - * key = HPyLong_FromLong(ctx, i); - * if (HPy_IsNull(key)) - * goto error; - * if (HPyTracker_Add(ctx, ht, key) < 0) - * goto error; - * value = HPyLong_FromLong(ctx, i * i); - * if (HPy_IsNull(value)) { - * goto error; - * } - * if (HPyTracker_Add(ctx, ht, value) < 0) - * goto error; - * result = HPy_SetItem(ctx, dict, key, value); - * if (result < 0) - * goto error; - * } - * - * success: - * HPyTracker_Close(ctx, ht); - * return dict; - * - * error: - * HPyTracker_Close(ctx, ht); - * HPy_Close(ctx, dict); - * // HPyErr will already have been set by the error that occurred. - * return HPy_NULL; - */ - -#include "hpy_jni.h" - -static const HPy_ssize_t HPYTRACKER_INITIAL_CAPACITY = 5; - -_HPy_HIDDEN HPyTracker -ctx_Tracker_New_jni(HPyContext *ctx, HPy_ssize_t capacity) -{ - _HPyTracker_s *hp; - if (capacity == 0) { - capacity = HPYTRACKER_INITIAL_CAPACITY; - } - capacity++; // always reserve space for an extra handle, see the docs - - hp = (_HPyTracker_s*)malloc(sizeof(_HPyTracker_s)); - if (hp == NULL) { - HPyErr_NoMemory(ctx); - return _hp2ht(0); - } - hp->handles = (HPy*)calloc(capacity, sizeof(HPy)); - if (hp->handles == NULL) { - free(hp); - HPyErr_NoMemory(ctx); - return _hp2ht(0); - } - hp->capacity = capacity; - hp->length = 0; - return _hp2ht(hp); -} - -static int -tracker_resize(HPyContext *ctx, _HPyTracker_s *hp, HPy_ssize_t capacity) -{ - HPy *new_handles; - capacity++; - - if (capacity <= hp->length) { - // refuse a resize that would either 1) lose handles or 2) not leave - // space for one new handle - HPyErr_SetString(ctx, ctx->h_ValueError, "HPyTracker resize would lose handles"); - return -1; - } - new_handles = (HPy*)realloc(hp->handles, capacity * sizeof(HPy)); - if (new_handles == NULL) { - HPyErr_NoMemory(ctx); - return -1; - } - hp->capacity = capacity; - hp->handles = new_handles; - return 0; -} - -_HPy_HIDDEN int -raw_Tracker_Add(HPyContext *ctx, HPyTracker ht, HPy h) -{ - _HPyTracker_s *hp = _ht2hp(ht); - hp->handles[hp->length++] = h; - if (hp->capacity <= hp->length) { - if (tracker_resize(ctx, hp, hp->capacity * 2 - 1) < 0) - return -1; - } - return 0; -} - -_HPy_HIDDEN int -ctx_Tracker_Add_jni(HPyContext *ctx, HPyTracker ht, HPy h) -{ - uint64_t bits = toBits(h); - if (!isBoxedHandle(bits) || bits < IMMUTABLE_HANDLES) { - return 0; - } - return raw_Tracker_Add(ctx, ht, h); -} - -_HPy_HIDDEN void -ctx_Tracker_ForgetAll_jni(HPyContext *ctx, HPyTracker ht) -{ - _HPyTracker_s *hp = _ht2hp(ht); - hp->length = 0; -} - -_HPy_HIDDEN void -ctx_Tracker_Close_jni(HPyContext *ctx, HPyTracker ht) -{ - _HPyTracker_s *hp = _ht2hp(ht); - upcallBulkClose(ctx, hp->handles, hp->length); - free(hp->handles); - free(hp); -} diff --git a/graalpython/com.oracle.graal.python.jni/src/debug/debug_ctx_not_cpython.c b/graalpython/com.oracle.graal.python.jni/src/debug/debug_ctx_not_cpython.c deleted file mode 100644 index a1a5815413..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/debug/debug_ctx_not_cpython.c +++ /dev/null @@ -1,40 +0,0 @@ -/* MIT License - * - * Copyright (c) 2022, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -// This is for non-CPython implementations! -// -// If you want to bundle the debug mode into your own version of -// hpy.universal, make sure to compile this file and NOT debug_ctx_cpython.c - -#include "debug_internal.h" - -void debug_ctx_CallRealFunctionFromTrampoline(HPyContext *dctx, - HPyFunc_Signature sig, - void *func, void *args) -{ - HPyContext *uctx = get_info(dctx)->uctx; - HPy_FatalError(uctx, - "Something is very wrong! _HPy_CallRealFunctionFromTrampoline() " - "should be used only by the CPython version of hpy.universal"); -} diff --git a/graalpython/com.oracle.graal.python.jni/src/debug/debug_ctx_tracker.c b/graalpython/com.oracle.graal.python.jni/src/debug/debug_ctx_tracker.c deleted file mode 100644 index e635238c1f..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/debug/debug_ctx_tracker.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#include "debug_internal.h" -#include "../hpy_jni.h" - -/* ~~~ debug mode implementation of HPyTracker ~~~ - - This is a bit special and it's worth explaining what is going on. - - The HPyTracker functions need their own debug mode implementation because - the debug mode needs to be aware of when a DHPy is closed, for the same - reason for why we need debug_ctx_Close. - - So, in theory here we should have our own implementation of a - DebugHPyTracker which manages a growable list of handles, and which calls - debug_ctx_Close at the end. But, we ALREADY have the logic available, it's - implemented in ctx_tracker.c. - - So, we can share some functions but note that the tracker will not store - universal handles but debug handles. - - Since we already have some special (and faster) implementation for - 'ctx_Tracker_Add' and 'ctx_Tracker_Close', we need to have a separate debug - mode implementation for them. -*/ - -HPyTracker debug_ctx_Tracker_New(HPyContext *dctx, HPy_ssize_t size) -{ - return ctx_Tracker_New_jni(dctx, size); -} - -_HPy_HIDDEN int -debug_ctx_Tracker_Add(HPyContext *dctx, HPyTracker ht, DHPy h) -{ - return raw_Tracker_Add(dctx, ht, h); -} - -void debug_ctx_Tracker_ForgetAll(HPyContext *dctx, HPyTracker ht) -{ - ctx_Tracker_ForgetAll_jni(dctx, ht); -} - -_HPy_HIDDEN void -debug_ctx_Tracker_Close(HPyContext *ctx, HPyTracker ht) -{ - _HPyTracker_s *hp = _ht2hp(ht); - HPy_ssize_t i; - for (i=0; ilength; i++) { - HPy_Close(ctx, hp->handles[i]); - } - free(hp->handles); - free(hp); -} diff --git a/graalpython/com.oracle.graal.python.jni/src/debug/dhqueue.c b/graalpython/com.oracle.graal.python.jni/src/debug/dhqueue.c deleted file mode 100644 index e6875aabca..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/debug/dhqueue.c +++ /dev/null @@ -1,145 +0,0 @@ -/* MIT License - * - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#include "debug_internal.h" - -// TODO: we need to make DHQueue thread-safe if we want to use the same -// context in multiple threads -void DHQueue_init(DHQueue *q) { - q->head = NULL; - q->tail = NULL; - q->size = 0; -} - -void DHQueue_append(DHQueue *q, DHQueueNode *h) { - if (q->head == NULL) { - h->prev = NULL; - h->next = NULL; - q->head = h; - q->tail = h; - } else { - h->next = NULL; - h->prev = q->tail; - q->tail->next = h; - q->tail = h; - } - q->size++; -} - -DHQueueNode *DHQueue_popfront(DHQueue *q) -{ - assert(q->size > 0); - assert(q->head != NULL); - DHQueueNode *head = q->head; - if (q->size == 1) { - q->head = NULL; - q->tail = NULL; - q->size = 0; - } - else { - q->head = head->next; - q->head->prev = NULL; - q->size--; - } - // the following is not strictly necessary, but it makes thing much easier - // to debug in case of bugs - head->next = NULL; - head->prev = NULL; - return head; -} - -void DHQueue_remove(DHQueue *q, DHQueueNode *h) -{ -#ifndef NDEBUG - // if we are debugging, let's check that h is effectively in the queue - DHQueueNode *it = q->head; - bool found = false; - while(it != NULL) { - if (it == h) { - found = true; - break; - } - it = it->next; - } - assert(found); -#endif - if (q->size == 1) { - q->head = NULL; - q->tail = NULL; - } else if (h == q->head) { - assert(h->prev == NULL); - q->head = h->next; - q->head->prev = NULL; - } else if (h == q->tail) { - assert(h->next == NULL); - q->tail = h->prev; - q->tail->next = NULL; - } - else { - h->prev->next = h->next; - h->next->prev = h->prev; - } - q->size--; - h->next = NULL; - h->prev = NULL; -} - - -#ifndef NDEBUG -static void linked_item_sanity_check(DHQueueNode *h) -{ - if (h == NULL) - return; - if (h->next != NULL) - assert(h->next->prev == h); - if (h->prev != NULL) - assert(h->prev->next == h); -} -#endif - -void DHQueue_sanity_check(DHQueue *q) -{ -#ifndef NDEBUG - if (q->head == NULL || q->tail == NULL) { - assert(q->head == NULL); - assert(q->tail == NULL); - assert(q->size == 0); - } - else { - assert(q->head->prev == NULL); - assert(q->tail->next == NULL); - assert(q->size > 0); - DHQueueNode *h = q->head; - HPy_ssize_t size = 0; - while(h != NULL) { - linked_item_sanity_check(h); - if (h->next == NULL) - assert(h == q->tail); - h = h->next; - size++; - } - assert(q->size == size); - } -#endif -} diff --git a/graalpython/com.oracle.graal.python.jni/src/debug/hpy_debug.h b/graalpython/com.oracle.graal.python.jni/src/debug/hpy_debug.h deleted file mode 100644 index aab3701176..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/debug/hpy_debug.h +++ /dev/null @@ -1,81 +0,0 @@ -/* MIT License - * - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef HPY_DEBUG_H -#define HPY_DEBUG_H - -#include "hpy.h" - -/* - This is the main public API for the debug mode, and it's meant to be used - by hpy.universal implementations (including but not limited to the - CPython's version of hpy.universal which is included in this repo). - - The idea is that for every uctx there is a corresponding unique dctx which - wraps it. - - If you call hpy_debug_get_ctx twice on the same uctx, you get the same - result. - - IMPLEMENTATION NOTE: at the moment of writing, the only known user of the - debug mode is CPython's hpy.universal: in that module, the uctx is a - statically allocated singleton, so for simplicity of implementation - currently we do the same inside debug_ctx.c, with a sanity check to ensure - that we don't call hpy_debug_get_ctx with different uctxs. But this is a - limitation of the current implementation and users should not rely on it. It - is likely that we will need to change it in the future, e.g. if we want to - have per-subinterpreter uctxs. -*/ - -HPyContext * hpy_debug_get_ctx(HPyContext *uctx); -int hpy_debug_ctx_init(HPyContext *dctx, HPyContext *uctx); -void hpy_debug_set_ctx(HPyContext *dctx); - -// convert between debug and universal handles. These are basically -// the same as DHPy_open and DHPy_unwrap but with a different name -// because this is the public-facing API and DHPy/UHPy are only internal -// implementation details. -HPy hpy_debug_open_handle(HPyContext *dctx, HPy uh); -HPy hpy_debug_unwrap_handle(HPyContext *dctx, HPy dh); -void hpy_debug_close_handle(HPyContext *dctx, HPy dh); - -// this is the HPy init function created by HPy_MODINIT. In CPython's version -// of hpy.universal the code is embedded inside the extension, so we can call -// this function directly instead of dlopen it. This is similar to what -// CPython does for its own built-in modules. But we must use the same -// signature as HPy_MODINIT - -#ifdef ___cplusplus -extern "C" -#endif -HPy_EXPORTED_SYMBOL -HPyModuleDef* HPyInit__debug(); - -#ifdef ___cplusplus -extern "C" -#endif -HPy_EXPORTED_SYMBOL -void HPyInitGlobalContext__debug(HPyContext *ctx); - -#endif /* HPY_DEBUG_H */ diff --git a/graalpython/com.oracle.graal.python.jni/src/debug/include/hpy_debug.h b/graalpython/com.oracle.graal.python.jni/src/debug/include/hpy_debug.h deleted file mode 100644 index 858cf5960b..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/debug/include/hpy_debug.h +++ /dev/null @@ -1,81 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef HPY_DEBUG_H -#define HPY_DEBUG_H - -#include "hpy.h" - -/* - This is the main public API for the debug mode, and it's meant to be used - by hpy.universal implementations (including but not limited to the - CPython's version of hpy.universal which is included in this repo). - - The idea is that for every uctx there is a corresponding unique dctx which - wraps it. - - If you call hpy_debug_get_ctx twice on the same uctx, you get the same - result. - - IMPLEMENTATION NOTE: at the moment of writing, the only known user of the - debug mode is CPython's hpy.universal: in that module, the uctx is a - statically allocated singleton, so for simplicity of implementation - currently we do the same inside debug_ctx.c, with a sanity check to ensure - that we don't call hpy_debug_get_ctx with different uctxs. But this is a - limitation of the current implementation and users should not rely on it. It - is likely that we will need to change it in the future, e.g. if we want to - have per-subinterpreter uctxs. -*/ - -HPyContext * hpy_debug_get_ctx(HPyContext *uctx); -int hpy_debug_ctx_init(HPyContext *dctx, HPyContext *uctx); -void hpy_debug_set_ctx(HPyContext *dctx); - -// convert between debug and universal handles. These are basically -// the same as DHPy_open and DHPy_unwrap but with a different name -// because this is the public-facing API and DHPy/UHPy are only internal -// implementation details. -HPy hpy_debug_open_handle(HPyContext *dctx, HPy uh); -HPy hpy_debug_unwrap_handle(HPyContext *dctx, HPy dh); -void hpy_debug_close_handle(HPyContext *dctx, HPy dh); - -// this is the HPy init function created by HPy_MODINIT. In CPython's version -// of hpy.universal the code is embedded inside the extension, so we can call -// this function directly instead of dlopen it. This is similar to what -// CPython does for its own built-in modules. But we must use the same -// signature as HPy_MODINIT - -#ifdef ___cplusplus -extern "C" -#endif -HPy_EXPORTED_SYMBOL -HPyModuleDef* HPyInit__debug(); - -#ifdef ___cplusplus -extern "C" -#endif -HPy_EXPORTED_SYMBOL -void HPyInitGlobalContext__debug(HPyContext *ctx); - -#endif /* HPY_DEBUG_H */ diff --git a/graalpython/com.oracle.graal.python.jni/src/debug/memprotect.c b/graalpython/com.oracle.graal.python.jni/src/debug/memprotect.c deleted file mode 100644 index 909372b125..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/debug/memprotect.c +++ /dev/null @@ -1,118 +0,0 @@ -/* MIT License - * - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#include "debug_internal.h" - -// Implements OS dependent abstraction of memory protection - -#ifdef _HPY_DEBUG_MEM_PROTECT_USEMMAP - -#ifndef _WIN32 - -// On UNIX systems we use mmap and mprotect - -#include -#include - -void *raw_data_copy(const void* data, HPy_ssize_t size, bool write_protect) { - void* new_ptr; - new_ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if (new_ptr == NULL) - return NULL; - memcpy(new_ptr, data, size); - if (write_protect) { - mprotect(new_ptr, size, PROT_READ); - } - return new_ptr; -} - -void raw_data_protect(void* data, HPy_ssize_t size) { - mprotect(data, size, PROT_NONE); -} - -int raw_data_free(void *data, HPy_ssize_t size) { - return munmap(data, size); -} - -#else - -// On Windows systems we use VirtualAlloc and VirtualProtect - -#include -#include - -void *raw_data_copy(const void* data, HPy_ssize_t size, bool write_protect) { - void* new_ptr; - DWORD old; - new_ptr = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); - if (new_ptr == NULL) - return NULL; - memcpy(new_ptr, data, size); - if (write_protect) { - VirtualProtect(new_ptr, size, PAGE_READONLY, &old); - } - return new_ptr; -} - -void raw_data_protect(void* data, HPy_ssize_t size) { - DWORD old; - VirtualProtect(data, size, PAGE_NOACCESS, &old); -} - -int raw_data_free(void *data, HPy_ssize_t size) { - return !VirtualFree(data, 0, MEM_RELEASE); -} - -#endif /* _WIN32 */ - -#else - -// Generic fallback that should work for any OS with decent C compiler: copy -// the memory and then override it with garbage to "protect" it from reading. - -#include -#include - -void *raw_data_copy(const void* data, HPy_ssize_t size, bool write_protect) { - void *new_data = malloc(size); - memcpy(new_data, data, size); - return new_data; -} - -void raw_data_protect(void* data, HPy_ssize_t size) { - // Override the data with some garbage in hope that the program will - // eventually crash or give incorrect result if it reads the garbage - char poison[] = {0xBA, 0xD0, 0xDA, 0x7A}; - for (HPy_ssize_t dataIdx = 0, poisonIdx = 0; dataIdx < size; ++dataIdx) { - ((char*)data)[dataIdx] = poison[poisonIdx]; - poisonIdx = (poisonIdx + 1) % sizeof(poison); - } -} - -int raw_data_free(void *data, HPy_ssize_t size) { - free(data); - return 0; -} - -#endif diff --git a/graalpython/com.oracle.graal.python.jni/src/debug/stacktrace.c b/graalpython/com.oracle.graal.python.jni/src/debug/stacktrace.c deleted file mode 100644 index 17e2c7f20d..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/debug/stacktrace.c +++ /dev/null @@ -1,118 +0,0 @@ -/* MIT License - * - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#include "debug_internal.h" - -#if ((__linux__ && __GNU_LIBRARY__) || __APPLE__) - -// Basic implementation that uses backtrace from glibc - -#include -#include -#include - -static inline int max_s(size_t a, size_t b) { - return a > b ? a : b; -} - -void create_stacktrace(char **target, HPy_ssize_t max_frames_count) { - const size_t skip_frames = 2; - size_t max_stack_size = (size_t) max_frames_count; - void* stack = calloc(sizeof(void*), max_stack_size); - if (stack == NULL) { - *target = NULL; - return; - } - - size_t stack_size = backtrace(stack, max_stack_size); - if (stack_size <= skip_frames) { - *target = NULL; - free(stack); - return; - } - - char** symbols = backtrace_symbols(stack, stack_size); - if (symbols == NULL) { - *target = NULL; - free(stack); - return; - } - - size_t buffer_size = 1024; - size_t buffer_index = 0; - char *buffer = malloc(buffer_size); - if (buffer == NULL) { - *target = NULL; - free(symbols); - free(stack); - return; - } - - size_t i; - for (i = skip_frames; i < stack_size; ++i) { - size_t current_len = strlen(symbols[i]); - size_t required_buffer_size = buffer_index + current_len + 1; - if (required_buffer_size > buffer_size) { - buffer_size = max_s(buffer_size * 2, required_buffer_size); - char *new_buffer = realloc(buffer, buffer_size); - if (new_buffer == NULL) { - // allocation failed, we can still provide at least part of - // the stack trace that is currently in the buffer - break; - } - buffer = new_buffer; - } - memcpy(buffer + buffer_index, symbols[i], current_len); - buffer[buffer_index + current_len] = '\n'; - buffer_index = required_buffer_size; - } - - // override the last '\n' to '\0' - assert(stack_size - skip_frames > 0); - assert(buffer[buffer_index - 1] == '\n'); - buffer[buffer_index - 1] = '\0'; - char *shorter_buffer = realloc(buffer, buffer_index); - if (shorter_buffer != NULL) { - buffer = shorter_buffer; - } - *target = buffer; - - free(symbols); - free(stack); -} - -#else - -#include - -void create_stacktrace(char **target, HPy_ssize_t max_frames_count) { - const char msg[] = - "Current HPy build does not support getting C stack traces.\n" - "At the moment this is only supported on Linux with glibc" - " and macOS."; - *target = malloc(sizeof(msg)); - memcpy(*target, msg, sizeof(msg)); -} - -#endif diff --git a/graalpython/com.oracle.graal.python.jni/src/hpy_jni.c b/graalpython/com.oracle.graal.python.jni/src/hpy_jni.c deleted file mode 100644 index 23a79fc5fb..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/hpy_jni.c +++ /dev/null @@ -1,539 +0,0 @@ -/* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#include "hpy_jni.h" -#include "hpy_log.h" -#include "hpy_native_cache.h" -#include "hpy_trace.h" - -#include -#include -#include -#include -#include -#include - -//************************* -// JNI upcalls - -#include "com_oracle_graal_python_builtins_objects_cext_hpy_jni_GraalHPyJNIContext.h" -#include "hpynative.h" - -#include "autogen_ctx_init_jni.h" -#include "autogen_c_access.h" - -/* definitions for HPyTracker */ -#include "hpy/runtime/ctx_funcs.h" - -#define JNI_HELPER(NAME) Java_com_oracle_graal_python_builtins_objects_cext_hpy_jni_GraalHPyJNIContext_ ## NAME - -_HPy_HIDDEN JNIEnv* jniEnv; - -#define ALL_FIELDS \ - FIELD(hpyHandleTable, CLASS_HPYCONTEXT, SIG_JOBJECTARRAY) \ - FIELD(hpyGlobalsTable, CLASS_HPYCONTEXT, SIG_JOBJECTARRAY) \ - FIELD(nextHandle, CLASS_HPYCONTEXT, SIG_INT) - -#define FIELD(name, clazz, jniSig) static jfieldID jniField_ ## name; -ALL_FIELDS -#undef FIELD - -/* - * This macro specifies custom JNI upcalls. - * Add entries if you want to have (a) an additional upcall that does not - * correspond to an official HPy context function, or (b) if an upcall has a - * different signature then the public one. - */ -#define CUSTOM_UPCALLS \ - UPCALL(ctxGetItems, SIG_HPY SIG_JSTRING, SIG_HPY) \ - UPCALL(ctxSetItems, SIG_HPY SIG_JSTRING SIG_HPY, SIG_INT) \ - UPCALL(ctxGetAttrs, SIG_HPY SIG_JSTRING, SIG_HPY) \ - UPCALL(ctxFieldStore, SIG_HPY SIG_HPYFIELD SIG_HPY, SIG_PTR) \ - UPCALL(ctxGlobalStore, SIG_HPY SIG_HPYGLOBAL, SIG_PTR) \ - UPCALL(ctxContextVarGet, SIG_HPY SIG_HPY SIG_HPY, SIG_HPY) \ - UPCALL(ctxBulkClose, SIG_PTR SIG_INT, SIG_VOID) \ - UPCALL(ctxUnicodeFromJCharArray, SIG_JCHARARRAY, SIG_HPY) \ - UPCALL(ctxSequenceFromArray, SIG_JLONGARRAY SIG_BOOL SIG_BOOL, SIG_HPY) - - -#define UPCALL(name, jniSigArgs, jniSigRet) static jmethodID jniMethod_ ## name; -CUSTOM_UPCALLS -#undef UPCALL - -static jmethodID jniMethod_hpy_debug_get_context; -static jmethodID jniMethod_hpy_trace_get_context; - - -#define MAX_UNCLOSED_HANDLES 32 -static int32_t unclosedHandleTop = 0; -static HPy unclosedHandles[MAX_UNCLOSED_HANDLES]; - -static inline jsize get_handle_table_size(HPyContext *ctx) { - uint64_t size = HANDLE_TABLE_SIZE(ctx->_private); - assert((jsize)size == size); - return (jsize)size; -} - -static uint64_t get_hpy_handle_for_object(HPyContext *ctx, jobject hpyContext, jobject element, bool update_native_cache) { - /* TODO(fa): for now, we fall back to the upcall */ - if (update_native_cache) { - return 0; - } - - jobjectArray hpy_handles = (jobjectArray)(*jniEnv)->GetObjectField(jniEnv, hpyContext, jniField_hpyHandleTable); - if (hpy_handles == NULL) { - LOGS("hpy handle table is NULL") - return 0; - } - - /* try to reuse a closed handle from our native list */ - jsize next_handle; - if (unclosedHandleTop > 0) { - uint64_t recycled = toBits(unclosedHandles[--unclosedHandleTop]); - LOG("%llu", (unsigned long long)recycled) - assert(recycled < INT32_MAX); - next_handle = (jsize) recycled; - } else { - next_handle = (*jniEnv)->GetIntField(jniEnv, hpyContext, jniField_nextHandle); - LOG("%d", next_handle) - jsize s = get_handle_table_size(ctx); - if (next_handle >= s) { - return 0; - } - (*jniEnv)->SetIntField(jniEnv, hpyContext, jniField_nextHandle, next_handle+1); - } - (*jniEnv)->SetObjectArrayElement(jniEnv, hpy_handles, next_handle, element); - (*jniEnv)->DeleteLocalRef(jniEnv, hpy_handles); - /* TODO(fa): update native data pointer cache here (if specified) */ - return boxHandle(next_handle); -} - -static jobject get_object_for_hpy_global(jobject hpyContext, uint64_t bits) { - jobject hpy_globals = (*jniEnv)->GetObjectField(jniEnv, hpyContext, jniField_hpyGlobalsTable); - if (hpy_globals == NULL) { - LOGS("hpy globals is NULL") - return NULL; - } - jobject element = (*jniEnv)->GetObjectArrayElement(jniEnv, (jobjectArray)hpy_globals, (jsize)unboxHandle(bits)); - (*jniEnv)->DeleteLocalRef(jniEnv, hpy_globals); - if (element == NULL) { - LOGS("globals element is NULL") - return NULL; - } - return element; -} - -#define MAX_UNICODE 0x10ffff - -_HPy_HIDDEN HPy ctx_Unicode_FromWideChar_jni(HPyContext *ctx, const wchar_t *u, HPy_ssize_t size) { - if (u == NULL && size != 0) { - return HPy_NULL; - } - - if (sizeof(wchar_t) != sizeof(uint32_t)) { - HPyErr_SetString(ctx, ctx->h_SystemError, "unsupported size of type wchar_t"); - return HPy_NULL; - } - - if (size == -1) { - size = wcslen(u); - } - - if (size > INT32_MAX) { - HPyErr_SetString(ctx, ctx->h_SystemError, "wchar_t array is too large"); - return HPy_NULL; - } - - uint32_t maxchar = 0; - wchar_t ch; - HPy_ssize_t i; - for (i = 0; i < size; i++) { - ch = u[i]; - if (ch > maxchar) { - maxchar = ch; - if (maxchar > MAX_UNICODE) { - HPyErr_SetString(ctx, ctx->h_ValueError, "character is not in range [U+0000; U+10ffff]"); - return HPy_NULL; - } - } - } - - if (maxchar < UINT16_MAX) { - jarray jCharArray = (*jniEnv)->NewCharArray(jniEnv, (jsize) size); - jchar *content = (*jniEnv)->GetPrimitiveArrayCritical(jniEnv, jCharArray, 0); - HPy_ssize_t i; - for (i = 0; i < size; i++) { - content[i] = (jchar) u[i]; - } - (*jniEnv)->ReleasePrimitiveArrayCritical(jniEnv, jCharArray, content, 0); - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctxUnicodeFromJCharArray, jCharArray); - } else { - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Unicode_FromWideChar, PTR_UP(u), SIZE_T_UP(size)); - } -} - -_HPy_HIDDEN HPy ctx_Global_Load_jni(HPyContext *ctx, HPyGlobal global) { - uint64_t bits = toBits(global); - if (bits && isBoxedHandle(bits)) { - jobject hpyContext = graal_hpy_context_get_native_context(ctx)->jni_context; - jobject element = get_object_for_hpy_global(hpyContext, bits); - if (element == NULL) { - return HPy_NULL; - } - - uint64_t new_handle = get_hpy_handle_for_object(ctx, hpyContext, element, false); - (*jniEnv)->DeleteLocalRef(jniEnv, element); - if (new_handle) { - load_global_native_data_pointer(ctx, bits, new_handle); - return toPtr(new_handle); - } - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctx_Global_Load, bits); - } else { - return toPtr(bits); - } -} - -static void ctx_Global_Store_jni(HPyContext *ctx, HPyGlobal *h, HPy v) { - h->_i = DO_UPCALL_INTPTR_T(CONTEXT_INSTANCE(ctx), ctxGlobalStore, HPY_GLOBAL_UP(*h), HPY_UP(v)); -} - -static void ctx_Field_Store_jni(HPyContext *ctx, HPy owner, HPyField *field, HPy value) { - field->_i = DO_UPCALL_INTPTR_T(CONTEXT_INSTANCE(ctx), ctxFieldStore, HPY_UP(owner), HPY_FIELD_UP(*field), HPY_UP(value)); -} - -static const char* getBoxedPrimitiveName(uint64_t bits) { - assert(!isBoxedHandle(bits)); - if (isBoxedInt(bits)) { - return "int"; - } - assert(isBoxedDouble(bits)); - return "float"; -} - -static int ctx_SetItem_s_jni(HPyContext *ctx, HPy target, const char *name, HPy value) { - uint64_t bits = toBits(target); - if (!isBoxedHandle(bits)) { - const size_t buffer_size = 128; -#ifdef _MSC_VER - char *message = (char *)alloca(buffer_size); -#else - char message[buffer_size]; -#endif - snprintf(message, buffer_size, - "'%s' object does not support item assignment", getBoxedPrimitiveName(bits)); - HPyErr_SetString(ctx, ctx->h_TypeError, message); - return -1; - } - jstring jname = (*jniEnv)->NewStringUTF(jniEnv, name); - return DO_UPCALL_INT(CONTEXT_INSTANCE(ctx), ctxSetItems, target, jname, value); -} - -static HPy ctx_GetItem_s_jni(HPyContext *ctx, HPy target, const char *name) { - uint64_t bits = toBits(target); - if (!isBoxedHandle(bits)) { - const size_t buffer_size = 128; -#ifdef _MSC_VER - char *message = (char *)alloca(buffer_size); -#else - char message[buffer_size]; -#endif - snprintf(message, buffer_size, - "'%s' object is not subscriptable", getBoxedPrimitiveName(bits)); - return HPyErr_SetString(ctx, ctx->h_TypeError, message); - } - jstring jname = (*jniEnv)->NewStringUTF(jniEnv, name); - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctxGetItems, target, jname); -} - -static HPy ctx_GetAttr_s_jni(HPyContext *ctx, HPy target, const char *name) { - jstring jname = (*jniEnv)->NewStringUTF(jniEnv, name); - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctxGetAttrs, target, jname); -} - -static int ctx_ContextVar_Get_jni(HPyContext *ctx, HPy var, HPy def, HPy *result) { - /* This uses 'h_Ellipsis' as an error marker assuming that it is rather uncertain that this will be a valid return - value. If 'h_Ellipsis' is returned, this indicates an error and we explicitly check for an error then. */ - HPy err_marker = ctx->h_Ellipsis; - HPy r = DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctxContextVarGet, HPY_UP(var), HPY_UP(def), HPY_UP(err_marker)); - if (toBits(r) == toBits(err_marker) && HPyErr_Occurred(ctx)) { - return -1; - } - *result = r; - return 0; -} - -_HPy_HIDDEN HPy upcallSequenceFromArray(HPyContext *ctx, HPy *items, HPy_ssize_t nitems, bool steal, bool create_list) { - jarray jLongArray = (*jniEnv)->NewLongArray(jniEnv, (jsize) nitems); - (*jniEnv)->SetLongArrayRegion(jniEnv, jLongArray, 0, (jsize) nitems, (const jlong *)items); - return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), ctxSequenceFromArray, jLongArray, (jboolean) steal, (jboolean) create_list); -} - -static HPy ctx_Tuple_FromArray_jni(HPyContext *ctx, HPy *items, HPy_ssize_t nitems) { - return upcallSequenceFromArray(ctx, items, nitems, false, JNI_FALSE); -} - -_HPy_HIDDEN void upcallBulkClose(HPyContext *ctx, HPy *items, HPy_ssize_t nitems) { - DO_UPCALL_VOID(CONTEXT_INSTANCE(ctx), ctxBulkClose, items, nitems); -} - -/* Initialize the jmethodID pointers for all the context functions implemented via JNI. */ -JNIEXPORT jlong JNICALL JNI_HELPER(initJNI)(JNIEnv *env, jclass clazz, jobject jbackend, jobject jctx, jlongArray jctx_handles, jintArray ctype_sizes, jintArray cfield_offsets) { - LOG("%s", "hpy_jni.c:initJNI\n"); - int res; - GraalHPyContext *graal_hpy_context = (GraalHPyContext *) calloc(1, sizeof(GraalHPyContext)); - HPyContext *ctx = graal_native_context_get_hpy_context(graal_hpy_context); - ctx->name = "HPy Universal ABI (GraalVM backend, JNI)"; - graal_hpy_context->jni_backend = (*env)->NewGlobalRef(env, jbackend); - graal_hpy_context->jni_context = (*env)->NewGlobalRef(env, jctx); - jniEnv = env; - - if (init_autogen_jni_ctx(env, clazz, ctx, jctx_handles)) { - return PTR_UP(NULL); - } - - assert(sizeof(int32_t) == sizeof(jint)); - int32_t *ctype_sizes_data = (*env)->GetPrimitiveArrayCritical(env, ctype_sizes, 0); - res = fill_c_type_sizes(ctype_sizes_data); - (*env)->ReleasePrimitiveArrayCritical(env, ctype_sizes, ctype_sizes_data, 0); - if (res) { - return PTR_UP(NULL); - } - int32_t *cfield_offsets_data = (*env)->GetPrimitiveArrayCritical(env, cfield_offsets, 0); - res = fill_c_field_offsets(cfield_offsets_data); - (*env)->ReleasePrimitiveArrayCritical(env, cfield_offsets, cfield_offsets_data, 0); - if (res) { - return PTR_UP(NULL); - } - - /* The HPyTracker is backend-specific. For JNI, we stay in native since there is no benefit for - doing an upcall. */ - ctx->ctx_Tracker_New = ctx_Tracker_New_jni; - ctx->ctx_Tracker_Add = ctx_Tracker_Add_jni; - ctx->ctx_Tracker_ForgetAll = ctx_Tracker_ForgetAll_jni; - ctx->ctx_Tracker_Close = ctx_Tracker_Close_jni; - - ctx->ctx_Unicode_FromWideChar = ctx_Unicode_FromWideChar_jni; - - ctx->ctx_Tuple_FromArray = ctx_Tuple_FromArray_jni; - - ctx->ctx_Global_Load = ctx_Global_Load_jni; - ctx->ctx_Global_Store = ctx_Global_Store_jni; - ctx->ctx_Field_Store = ctx_Field_Store_jni; - - ctx->ctx_SetItem_s = ctx_SetItem_s_jni; - ctx->ctx_GetItem_s = ctx_GetItem_s_jni; - - ctx->ctx_ContextVar_Get = ctx_ContextVar_Get_jni; - ctx->ctx_GetAttr_s = ctx_GetAttr_s_jni; - - assert(clazz != NULL); - - jclass jctx_class = (*env)->GetObjectClass(env, jctx); - if (jctx_class == NULL) { - LOGS("ERROR: could not get class of Java HPy context object"); - return PTR_UP(NULL); - } - -#define CLASS_HPYCONTEXT jctx_class - -#define SIG_HPY "J" -#define SIG_HPYGLOBAL "J" -#define SIG_HPYFIELD "J" -#define SIG_PTR "J" -#define SIG_VOID "V" -#define SIG_INT "I" -#define SIG_BOOL "Z" -#define SIG_JSTRING "Ljava/lang/String;" -#define SIG_JCHARARRAY "[C" -#define SIG_JLONGARRAY "[J" -#define SIG_JOBJECTARRAY "[Ljava/lang/Object;" - -#define FIELD(name, clazz, jniSig) \ - jniField_ ## name = (*env)->GetFieldID(env, clazz, #name, jniSig); \ - if (jniField_ ## name == NULL) { \ - LOGS("ERROR: jni field " #name " not found found !\n"); \ - return PTR_UP(NULL); \ - } - -ALL_FIELDS -#undef FIELD - -#define UPCALL(name, jniSigArgs, jniSigRet) \ - jniMethod_ ## name = (*env)->GetMethodID(env, clazz, #name, "(" jniSigArgs ")" jniSigRet); \ - if (jniMethod_ ## name == NULL) { \ - LOGS("ERROR: jni method " #name " not found found !\n"); \ - return PTR_UP(NULL); \ - } - -CUSTOM_UPCALLS -#undef UPCALL - - jniMethod_hpy_debug_get_context = (*env)->GetMethodID(env, clazz, "getHPyDebugContext", "()" SIG_PTR); - if (jniMethod_hpy_debug_get_context == NULL) { - LOGS("ERROR: jni method getHPyDebugContext not found found !\n"); - return PTR_UP(NULL); - } - - jniMethod_hpy_trace_get_context = (*env)->GetMethodID(env, clazz, "getHPyTraceContext", "()" SIG_PTR); - if (jniMethod_hpy_trace_get_context == NULL) { - LOGS("ERROR: jni method getHPyTraceContext not found found !\n"); - return PTR_UP(NULL); - } - - return PTR_UP(ctx); -} - -JNIEXPORT jint JNICALL JNI_HELPER(finalizeJNIContext)(JNIEnv *env, jclass clazz, jlong ctx) { - LOG("%s", "hpy_jni.c:finalizeJNIContext\n"); - // assert(info->magic_number == HPY_TRACE_MAGIC); - GraalHPyContext *native_ctx = graal_hpy_context_get_native_context((HPyContext *) ctx); - (*env)->DeleteGlobalRef(env, (jobject) native_ctx->jni_backend); - (*env)->DeleteGlobalRef(env, (jobject) native_ctx->jni_context); - free((void *)native_ctx); - return 0; -} - -JNIEXPORT jlong JNICALL JNI_HELPER(initJNIDebugContext)(JNIEnv *env, jclass clazz, jlong uctxPointer) { - LOG("%s", "hpy_jni.c:initJNIDebugContext\n"); - HPyContext *uctx = (HPyContext *) uctxPointer; - - HPyContext *dctx = (HPyContext *) malloc(sizeof(HPyContext)); - dctx->name = "HPy Debug Mode ABI"; - dctx->_private = NULL; - dctx->abi_version = HPY_ABI_VERSION; - - hpy_debug_ctx_init(dctx, uctx); - return PTR_UP(dctx); -} - -JNIEXPORT jint JNICALL JNI_HELPER(finalizeJNIDebugContext)(JNIEnv *env, jclass clazz, jlong dctxPointer) { - LOG("%s", "hpy_jni.c:finalizeJNIDebugContext\n"); - HPyContext *dctx = (HPyContext *) dctxPointer; - hpy_debug_ctx_free(dctx); - free(dctx); - return 0; -} - -JNIEXPORT jlong JNICALL JNI_HELPER(initJNIDebugModule)(JNIEnv *env, jclass clazz, jlong uctxPointer) { - LOG("%s", "hpy_jni.c:initJNIDebugModule\n"); - return PTR_UP(HPyInit__debug()); -} - -JNIEXPORT jlong JNICALL JNI_HELPER(initJNITraceContext)(JNIEnv *env, jclass clazz, jlong uctxPointer) { - LOG("%s", "hpy_jni.c:initJNITraceContext\n"); - HPyContext *uctx = (HPyContext *) uctxPointer; - - HPyContext *tctx = (HPyContext *) malloc(sizeof(HPyContext)); - tctx->name = "HPy Trace Mode ABI"; - tctx->_private = NULL; - tctx->abi_version = HPY_ABI_VERSION; - - hpy_trace_ctx_init(tctx, uctx); - return PTR_UP(tctx); -} - -JNIEXPORT jint JNICALL JNI_HELPER(finalizeJNITraceContext)(JNIEnv *env, jclass clazz, jlong tctxPointer) { - LOG("%s", "hpy_jni.c:finalizeJNITraceContext\n"); - HPyContext *tctx = (HPyContext *) tctxPointer; - hpy_trace_ctx_free(tctx); - free(tctx); - return 0; -} - -JNIEXPORT jlong JNICALL JNI_HELPER(initJNITraceModule)(JNIEnv *env, jclass clazz, jlong uctxPointer) { - LOG("%s", "hpy_jni.c:initJNITraceModule\n"); - return PTR_UP(HPyInit__trace()); -} - -JNIEXPORT void JNICALL JNI_HELPER(bulkFreeNativeSpace)(JNIEnv *env, jclass clazz, jlongArray nativeSpacePtrs, jlongArray destroyFuncPtrs, jint n) { - jlong *native_space_ptrs_data = (*env)->GetLongArrayElements(env, nativeSpacePtrs, 0); - jlong *destroy_func_ptrs_data = (*env)->GetLongArrayElements(env, destroyFuncPtrs, 0); - for (jint i=0; i < n; i++) - { - HPyFunc_destroyfunc destroy_func = (HPyFunc_destroyfunc) destroy_func_ptrs_data[i]; - destroy_func((void *)native_space_ptrs_data[i]); - } - (*jniEnv)->ReleaseLongArrayElements(env, nativeSpacePtrs, native_space_ptrs_data, JNI_ABORT); - (*jniEnv)->ReleaseLongArrayElements(env, destroyFuncPtrs, destroy_func_ptrs_data, JNI_ABORT); -} - -JNIEXPORT jint JNICALL JNI_HELPER(strcmp)(JNIEnv *env, jclass clazz, jlong s1, jlong s2) { - return (jint) strcmp((const char *)s1, (const char *)s2); -} - -JNIEXPORT jint JNICALL JNI_HELPER(initJNINativeFastPaths)(JNIEnv *env, jclass clazz, jlong uctxPointer) { - init_native_fast_paths((HPyContext *) uctxPointer); - return 0; -} - -JNIEXPORT jint JNICALL JNI_HELPER(setNativeSpaceFunction)(JNIEnv *env, jclass clazz, jlong uctxPointer, jlong cachePtr) { - LOG("%ld %ld", uctxPointer, cachePtr); - HPyContext *ctx = (HPyContext *) uctxPointer; - ctx->_private = (void *) cachePtr; - return 0; -} - -JNIEXPORT jint JNICALL JNI_HELPER(getErrno)(JNIEnv *env, jclass clazz) { - return (jint) errno; -} - -JNIEXPORT jlong JNICALL JNI_HELPER(getStrerror)(JNIEnv *env, jclass clazz, jint i) { - return PTR_UP(strerror(i)); -} - -HPyContext * hpy_debug_get_ctx(HPyContext *uctx) -{ - HPyContext *dctx = (HPyContext *) DO_UPCALL_PTR_NOARGS(CONTEXT_INSTANCE(uctx), hpy_debug_get_context); - if (uctx == dctx) { - HPy_FatalError(uctx, "hpy_debug_get_ctx: expected an universal ctx, got a debug ctx"); - } - return dctx; -} - -HPyContext * hpy_trace_get_ctx(HPyContext *uctx) -{ - HPyContext *tctx = (HPyContext *) DO_UPCALL_PTR_NOARGS(CONTEXT_INSTANCE(uctx), hpy_trace_get_context); - if (uctx == tctx) { - HPy_FatalError(uctx, "hpy_trace_get_ctx: expected an universal ctx, " - "got a trace ctx"); - } - return tctx; -} diff --git a/graalpython/com.oracle.graal.python.jni/src/hpy_jni.h b/graalpython/com.oracle.graal.python.jni/src/hpy_jni.h deleted file mode 100644 index 585ce6c554..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/hpy_jni.h +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef SRC_HPY_JNI_H_ -#define SRC_HPY_JNI_H_ - -#include -#include -#include - -#if defined(_MSC_VER) -# include /* for alloca() */ -#endif - -#include "debug_internal.h" -#include "hpy_native_fast_paths.h" - -#define DO_UPCALL_JINT(jni_ctx, name, ...) (*jniEnv)->CallIntMethod(jniEnv, (jni_ctx), jniMethod_ ## name, __VA_ARGS__) -#define DO_UPCALL_JLONG(jni_ctx, name, ...) (*jniEnv)->CallLongMethod(jniEnv, (jni_ctx), jniMethod_ ## name, __VA_ARGS__) -#define DO_UPCALL_HPY_NOARGS(jni_ctx, name) ((HPy){(HPy_ssize_t)(*jniEnv)->CallLongMethod(jniEnv, (jni_ctx), jniMethod_ ## name)}) -#define DO_UPCALL_HPY(jni_ctx, name, ...) ((HPy){(HPy_ssize_t)(*jniEnv)->CallLongMethod(jniEnv, (jni_ctx), jniMethod_ ## name, __VA_ARGS__)}) -#define DO_UPCALL_HPY0(jni_ctx, name) ((HPy){(HPy_ssize_t)(*jniEnv)->CallLongMethod(jniEnv, (jni_ctx), jniMethod_ ## name)}) -#define DO_UPCALL_HPYTRACKER(jni_ctx, name, ...) ((HPyTracker){(*jniEnv)->CallLongMethod(jniEnv, (jni_ctx), jniMethod_ ## name, __VA_ARGS__)}) -#define DO_UPCALL_HPYTHREADSTATE0(jni_ctx, name) ((HPyThreadState){(*jniEnv)->CallLongMethod(jniEnv, (jni_ctx), jniMethod_ ## name)}) -#define DO_UPCALL_HPYLISTBUILDER(jni_ctx, name, ...) ((HPyListBuilder){(*jniEnv)->CallLongMethod(jniEnv, (jni_ctx), jniMethod_ ## name, __VA_ARGS__)}) -#define DO_UPCALL_PTR(jni_ctx, name, ...) (void*) (*jniEnv)->CallLongMethod(jniEnv, (jni_ctx), jniMethod_ ## name, __VA_ARGS__) -#define DO_UPCALL_PTR_NOARGS(jni_ctx, name) (void*) (*jniEnv)->CallLongMethod(jniEnv, (jni_ctx), jniMethod_ ## name) -#define DO_UPCALL_INTPTR_T(jni_ctx, name, ...) (intptr_t) (*jniEnv)->CallLongMethod(jniEnv, (jni_ctx), jniMethod_ ## name, __VA_ARGS__) -#define DO_UPCALL_SIZE_T(jni_ctx, name, ...) (HPy_ssize_t) (*jniEnv)->CallLongMethod(jniEnv, (jni_ctx), jniMethod_ ## name, __VA_ARGS__) -#define DO_UPCALL_INT0(jni_ctx, name, ...) (int) (*jniEnv)->CallIntMethod(jniEnv, (jni_ctx), jniMethod_ ## name) -#define DO_UPCALL_DOUBLE(jni_ctx, name, ...) (double) (*jniEnv)->CallDoubleMethod(jniEnv, (jni_ctx), jniMethod_ ## name, __VA_ARGS__) -#define DO_UPCALL_VOID(jni_ctx, name, ...) (*jniEnv)->CallVoidMethod(jniEnv, (jni_ctx), jniMethod_ ## name, __VA_ARGS__) -#define DO_UPCALL_VOID0(jni_ctx, name) (*jniEnv)->CallVoidMethod(jniEnv, (jni_ctx), jniMethod_ ## name) -#define DO_UPCALL_HPY_SSIZE_T (HPy_ssize_t) DO_UPCALL_JLONG -#define DO_UPCALL_HPY_HASH_T (HPy_hash_t) DO_UPCALL_JLONG -#define DO_UPCALL_HPY_UCS4 (HPy_UCS4) DO_UPCALL_JINT -#define DO_UPCALL_HPYTYPE_BUILTINSHAPE (HPyType_BuiltinShape) DO_UPCALL_JINT -#define DO_UPCALL_INT (int) DO_UPCALL_JINT -#define DO_UPCALL_INT32_T (int32_t) DO_UPCALL_JINT -#define DO_UPCALL_UINT32_T (uint32_t) DO_UPCALL_JINT -#define DO_UPCALL_INT64_T (int64_t) DO_UPCALL_JLONG -#define DO_UPCALL_UINT64_T (uint64_t) DO_UPCALL_JLONG - -#define HPY_UP(_h) ((jlong)((_h)._i)) -#define PTR_UP(_h) ((jlong)_h) -#define INT_UP(_h) ((jint)_h) -#define INT32_UP(_h) ((jint)_h) -#define UINT32_UP(_h) ((jint)_h) -#define LONG_UP(_h) ((jlong)_h) -#define DOUBLE_UP(_h) ((jdouble)_h) -#define SIZE_T_UP(_h) ((jlong)_h) -#define HPY_TRACKER_UP(_h) ((jlong)((_h)._i)) -#define HPY_LIST_BUILDER_UP(_h) ((jlong)((_h)._lst)) -#define HPY_THREAD_STATE_UP(_h) ((jlong)((_h)._i)) -#define HPY_GLOBAL_UP(_h) ((jlong)((_h)._i)) -#define HPY_FIELD_UP(_h) ((jlong)((_h)._i)) - -static inline HPy _jlong2h(jlong obj) { - return (HPy){(HPy_ssize_t)obj}; -} - -static inline jlong _h2jlong(HPy h) { - return (jlong)(h._i); -} - -static inline DHPy _jlong2dh(HPyContext *dctx, jlong obj) -{ - return DHPy_open(dctx, _jlong2h(obj)); -} - -static inline jlong _dh2jlong(HPyContext *dctx, DHPy dh) -{ - return _h2jlong(DHPy_unwrap(dctx, dh)); -} - -static inline jlong from_dh(HPyContext *dctx, DHPy dh_result) -{ - jlong result = _dh2jlong(dctx, dh_result); - DHPy_close(dctx, dh_result); - return result; -} - -#define _ARR_JLONG2DH(DCTX, DST, ARGS, NARGS) \ - DHPy *DST = (DHPy *)alloca((NARGS) * sizeof(DHPy)); \ - for (HPy_ssize_t i = 0; i < (NARGS); i++) { \ - DST[i] = _jlong2dh(DCTX, ((jlong *)(ARGS))[i]); \ - } \ - -#define _ARR_DH_CLOSE(DCTX, DH_ARR, NARGS) \ - for (HPy_ssize_t i = 0; i < (NARGS); i++) { \ - DHPy_close_and_check((DCTX), (DH_ARR)[i]); \ - } \ - -/* just for better readability */ -typedef HPy_buffer DHPy_buffer; -typedef HPy_buffer UHPy_buffer; - -/* Copies everything from 'src' to 'dest' and unwraps the 'obj' debug handle. */ -static inline void -_buffer_d2u(HPyContext *dctx, const DHPy_buffer *src, UHPy_buffer *dest) -{ - dest->buf = src->buf; - dest->obj = DHPy_unwrap(dctx, src->obj); - dest->len = src->len; - dest->itemsize = src->itemsize; - dest->readonly = src->readonly; - dest->ndim = src->ndim; - dest->format = src->format; - dest->shape = src->shape; - dest->strides = src->strides; - dest->suboffsets = src->suboffsets; - dest->internal = src->internal; -} - -/* Copies everything from 'src' to 'dest' and opens a debug handle for 'obj'. */ -static inline void -_buffer_u2d(HPyContext *dctx, const UHPy_buffer *src, DHPy_buffer *dest) -{ - dest->buf = src->buf; - dest->obj = DHPy_open(dctx, src->obj); - dest->len = src->len; - dest->itemsize = src->itemsize; - dest->readonly = src->readonly; - dest->ndim = src->ndim; - dest->format = src->format; - dest->shape = src->shape; - dest->strides = src->strides; - dest->suboffsets = src->suboffsets; - dest->internal = src->internal; -} - -#define CONTEXT_INSTANCE(_hpy_ctx) ((jobject)(graal_hpy_context_get_native_context(_hpy_ctx)->jni_backend)) - -_HPy_HIDDEN extern JNIEnv* jniEnv; - -_HPy_HIDDEN HPy upcallSequenceFromArray(HPyContext *ctx, HPy *items, HPy_ssize_t nitems, bool steal, bool create_list); - -_HPy_HIDDEN void upcallBulkClose(HPyContext *ctx, HPy *items, HPy_ssize_t nitems); - -_HPy_HIDDEN HPyTracker ctx_Tracker_New_jni(HPyContext *ctx, HPy_ssize_t capacity); - -/* Very much like 'augment_Tracker_Add' but doesn't do special handling for - boxed values and immutable handles */ -_HPy_HIDDEN int raw_Tracker_Add(HPyContext *ctx, HPyTracker ht, HPy h); - -_HPy_HIDDEN int ctx_Tracker_Add_jni(HPyContext *ctx, HPyTracker ht, HPy h); - -_HPy_HIDDEN void ctx_Tracker_ForgetAll_jni(HPyContext *ctx, HPyTracker ht); - -_HPy_HIDDEN void ctx_Tracker_Close_jni(HPyContext *ctx, HPyTracker ht); - -_HPy_HIDDEN int hpy_debug_ctx_init(HPyContext *dctx, HPyContext *uctx); - -_HPy_HIDDEN void hpy_debug_ctx_free(HPyContext *dctx); - -#endif /* SRC_HPY_JNI_H_ */ diff --git a/graalpython/com.oracle.graal.python.jni/src/hpy_log.h b/graalpython/com.oracle.graal.python.jni/src/hpy_log.h deleted file mode 100644 index f6cf73a214..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/hpy_log.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef SRC_HPY_LOG_H_ -#define SRC_HPY_LOG_H_ - -#ifndef NDEBUG -#include -#define LOG(FORMAT, ...) do { printf("%-15s (%s:%d): %s " FORMAT "\n", __FUNCTION__, __FILE__, __LINE__, #__VA_ARGS__, __VA_ARGS__); fflush(stdout); } while(0); -#define LOGS(FORMAT) do { printf("%-15s (%s:%d): " FORMAT "\n", __FUNCTION__, __FILE__, __LINE__); fflush(stdout); } while(0); -#else -#define LOG(FORMAT, ...) -#define LOGS(FORMAT) -#endif - -#endif /* SRC_HPY_LOG_H_ */ diff --git a/graalpython/com.oracle.graal.python.jni/src/hpy_native_cache.h b/graalpython/com.oracle.graal.python.jni/src/hpy_native_cache.h deleted file mode 100644 index d91f717a6f..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/hpy_native_cache.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* - * HPy native cache implementation. - * Currently, the native cache is an array of uint64_t values. - * Layout: - * ----------------------------------------------------------------------- - * | n | hptr_0 | hptr_1 | ... | hptr_n | gptr_0 | gptr_1 | ... | gptr_m | - * ----------------------------------------------------------------------- - * 'n' is the current size of the handle table. - * 'hptr_0' is the native data pointer of the object associated with HPy handle 0. - * 'gptr_0' is the native data pointer of the object associated with HPy global 0. - */ - - -#ifndef SRC_HPY_NATIVE_CACHE_H_ -#define SRC_HPY_NATIVE_CACHE_H_ - -#include "hpy_native_fast_paths.h" -#include "hpy_log.h" - -#define HANDLE_MIRROR_OFFSET 1 -#define HANDLE_DATAPTR_INDEX(bits) (HANDLE_MIRROR_OFFSET + unboxHandle(bits)) -#define GLOBAL_DATAPTR_INDEX(n_ht, bits) (HANDLE_MIRROR_OFFSET + n_ht + unboxHandle(bits)) -#define HANDLE_TABLE_SIZE(cache_ptr) (((uint64_t *)cache_ptr)[0]) - -/* - * Get the native data pointer of an object denoted by a handle from the native - * cache. - */ -static inline void * -get_handle_native_data_pointer(HPyContext *ctx, uint64_t bits) { - void** space = (void**)ctx->_private; - return space[HANDLE_DATAPTR_INDEX(bits)]; -} - - -/* - * Get the native data pointer of an object denoted by an HPyGlobal from the - * native cache. - */ -static inline void * -get_global_native_data_pointer(HPyContext *ctx, uint64_t bits) { - void** space = (void**)ctx->_private; - return space[GLOBAL_DATAPTR_INDEX(HANDLE_TABLE_SIZE(space), bits)]; -} - -/* - * Load the native data pointer of an object denoted by an HPyGlobal into the - * native cache. - */ -static inline void -load_global_native_data_pointer(HPyContext *ctx, uint64_t g_bits, uint64_t h_bits) { - void** space = (void**)ctx->_private; - uint64_t n_handle_table = (uint64_t)space[0]; - void *g_data_ptr = space[GLOBAL_DATAPTR_INDEX(n_handle_table, g_bits)]; - LOG("%llu %llu %p", (unsigned long long)g_bits, (unsigned long long)h_bits, g_data_ptr) - space[HANDLE_DATAPTR_INDEX(h_bits)] = g_data_ptr; -} - -#endif /* SRC_HPY_NATIVE_CACHE_H_ */ diff --git a/graalpython/com.oracle.graal.python.jni/src/hpy_native_fast_paths.c b/graalpython/com.oracle.graal.python.jni/src/hpy_native_fast_paths.c deleted file mode 100644 index 4bff9d56fb..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/hpy_native_fast_paths.c +++ /dev/null @@ -1,599 +0,0 @@ -/* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#include "hpy_jni.h" -#include "hpy_log.h" -#include "hpy_native_fast_paths.h" -#include "hpy_native_cache.h" - -#include -#include - -#define MAX_UNCLOSED_HANDLES 32 -static int32_t unclosedHandleTop = 0; -static HPy unclosedHandles[MAX_UNCLOSED_HANDLES]; - -//************************* -// BOXING - -static_assert(sizeof(uint64_t) == sizeof(double), "Assumption necessary for NaN boxing to work"); - -static inline double unboxDouble(uint64_t value) { - double result; - uint64_t unboxed = value - NAN_BOXING_BASE; - memcpy(&result, &unboxed, sizeof(double)); - return result; -} - -static inline uint64_t boxDouble(double value) { - // assumes that value doesn't contain non-standard silent NaNs - uint64_t unboxed; - memcpy(&unboxed, &value, sizeof(double)); - return unboxed + NAN_BOXING_BASE; -} - -//************************* -// direct fast paths that handle certain calls on the native side: - -static void *(*original_AsStruct_Object)(HPyContext *ctx, HPy h); -static HPy (*original_Dup)(HPyContext *ctx, HPy h); -static HPy (*original_Long)(HPyContext *ctx, HPy h); -static HPy (*original_Float_FromDouble)(HPyContext *ctx, double v); -static double (*original_Float_AsDouble)(HPyContext *ctx, HPy h); -static int32_t (*original_Long_AsInt32_t)(HPyContext *ctx, HPy h); -static int64_t (*original_Long_AsInt64_t)(HPyContext *ctx, HPy h); -static uint32_t (*original_Long_AsUInt32_t)(HPyContext *ctx, HPy h); -static size_t (*original_Long_AsSize_t)(HPyContext *ctx, HPy h); -static HPy_ssize_t (*original_Long_AsSsize_t)(HPyContext *ctx, HPy h); -static double (*original_Long_AsDouble)(HPyContext *ctx, HPy h); -static HPy (*original_Long_FromInt32_t)(HPyContext *ctx, int32_t l); -static HPy (*original_Long_FromUInt32_t)(HPyContext *ctx, uint32_t l); -static HPy (*original_Long_FromInt64_t)(HPyContext *ctx, int64_t l); -static HPy (*original_Long_FromUInt64_t)(HPyContext *ctx, uint64_t l); -static HPy (*original_Long_FromSsize_t)(HPyContext *ctx, HPy_ssize_t l); -static HPy (*original_Long_FromSize_t)(HPyContext *ctx, size_t l); -static int (*original_List_Check)(HPyContext *ctx, HPy h); -static int (*original_Number_Check)(HPyContext *ctx, HPy h); -static int (*original_TypeCheck)(HPyContext *ctx, HPy h, HPy type); -static void (*original_Close)(HPyContext *ctx, HPy h); -static void (*original_Global_Store)(HPyContext *ctx, HPyGlobal *global, HPy h); -static HPy (*original_Global_Load)(HPyContext *ctx, HPyGlobal global); -static void (*original_Field_Store)(HPyContext *ctx, HPy target_object, HPyField *target_field, HPy h); -static HPy (*original_Field_Load)(HPyContext *ctx, HPy source_object, HPyField source_field); -static int (*original_Is)(HPyContext *ctx, HPy a, HPy b); -static int (*original_IsTrue)(HPyContext *ctx, HPy h); -static HPy (*original_Type)(HPyContext *ctx, HPy obj); -static HPy (*original_Add)(HPyContext *ctx, HPy h1, HPy h2); -static HPy (*original_Subtract)(HPyContext *ctx, HPy h1, HPy h2); -static HPy (*original_Multiply)(HPyContext *ctx, HPy h1, HPy h2); -static HPy (*original_FloorDivide)(HPyContext *ctx, HPy h1, HPy h2); -static HPy (*original_TrueDivide)(HPyContext *ctx, HPy h1, HPy h2); -static HPy (*original_RichCompare)(HPyContext *ctx, HPy v, HPy w, int op); -static int (*original_RichCompareBool)(HPyContext *ctx, HPy v, HPy w, int op); - -static int augment_Is(HPyContext *ctx, HPy a, HPy b) { - uint64_t bitsA = toBits(a); - uint64_t bitsB = toBits(b); - if (bitsA == bitsB) { - return 1; - } else if (isBoxedHandle(bitsA) && isBoxedHandle(bitsB)) { - // This code assumes that objects pointed by a handle <= SINGLETON_HANDLES_MAX - // always get that same handle - uint64_t unboxedA = unboxHandle(bitsA); - uint64_t unboxedB = unboxHandle(bitsB); - if (unboxedA <= SINGLETON_HANDLES_MAX) { - return 0; - } else if (unboxedB <= SINGLETON_HANDLES_MAX) { - return 0; - } - // This code assumes that space[x] != NULL <=> objects pointed by x has native struct - void *dataA = get_handle_native_data_pointer(ctx, unboxedA); - void *dataB = get_handle_native_data_pointer(ctx, unboxedB); - if (dataA == NULL && dataB == NULL) { - return original_Is(ctx, a, b); - } - return dataA == dataB; - } else { - return 0; - } -} - -static int augment_IsTrue(HPyContext *ctx, HPy h) { - uint64_t bits = toBits(h); - if (isBoxedInt(bits)) { - return unboxInt(bits) != 0; - } else if (isBoxedDouble(bits)) { - return unboxDouble(bits) != 0.0; - } else if (augment_Is(ctx, ctx->h_None, h)) { - return 0; - } - return original_IsTrue(ctx, h); -} - -static void *augment_AsStruct_Object(HPyContext *ctx, HPy h) { - uint64_t bits = toBits(h); - if (isBoxedHandle(bits)) { - return get_handle_native_data_pointer(ctx, bits); - } else { - return NULL; - } -} - -static HPy augment_Long(HPyContext *ctx, HPy h) { - uint64_t bits = toBits(h); - if (isBoxedInt(bits)) { - return h; - } else if (isBoxedDouble(bits)) { - double v = unboxDouble(bits); - return toPtr(boxInt((int) v)); - } - return original_Long(ctx, h); -} - -static HPy augment_Float_FromDouble(HPyContext *ctx, double v) { - return toPtr(boxDouble(v)); -} - -static double augment_Float_AsDouble(HPyContext *ctx, HPy h) { - uint64_t bits = toBits(h); - if (isBoxedDouble(bits)) { - return unboxDouble(bits); - } else if (isBoxedInt(bits)) { - return unboxInt(bits); - } else { - return original_Float_AsDouble(ctx, h); - } -} - -static int32_t augment_Long_AsInt32_t(HPyContext *ctx, HPy h) { - uint64_t bits = toBits(h); - if (isBoxedInt(bits)) { - return unboxInt(bits); - } else { - return original_Long_AsInt32_t(ctx, h); - } -} - -static int64_t augment_Long_AsInt64_t(HPyContext *ctx, HPy h) { - uint64_t bits = toBits(h); - if (isBoxedInt(bits)) { - return unboxInt(bits); - } else { - return original_Long_AsInt64_t(ctx, h); - } -} - -static uint32_t augment_Long_AsUInt32_t(HPyContext *ctx, HPy h) { - uint64_t bits = toBits(h); - if (isBoxedInt(bits)) { - int32_t unboxed = unboxInt(bits); - if (unboxed >= 0) { - return unboxed; - } - } - return original_Long_AsUInt32_t(ctx, h); -} - -static HPy_ssize_t augment_Long_AsSsize_t(HPyContext *ctx, HPy h) { - uint64_t bits = toBits(h); - if (isBoxedInt(bits)) { - int32_t unboxed = unboxInt(bits); - if (unboxed >= 0) { - return unboxed; - } - } - return original_Long_AsSsize_t(ctx, h); -} - -static size_t augment_Long_AsSize_t(HPyContext *ctx, HPy h) { - uint64_t bits = toBits(h); - if (isBoxedInt(bits)) { - int32_t unboxed = unboxInt(bits); - if (unboxed >= 0) { - return unboxed; - } - } - return original_Long_AsSize_t(ctx, h); -} - -static double augment_Long_AsDouble(HPyContext *ctx, HPy h) { - uint64_t bits = toBits(h); - if (isBoxedInt(bits)) { - return unboxInt(bits); - } else { - return original_Long_AsDouble(ctx, h); - } -} - -static HPy augment_Long_FromInt32_t(HPyContext *ctx, int32_t l) { - return toPtr(boxInt(l)); -} - -static HPy augment_Long_FromUInt32_t(HPyContext *ctx, uint32_t l) { - if (isBoxableUnsignedInt(l)) { - return toPtr(boxInt((int32_t) l)); - } else { - return original_Long_FromUInt32_t(ctx, l); - } -} - -static HPy augment_Long_FromInt64_t(HPyContext *ctx, int64_t l) { - if (isBoxableInt(l)) { - return toPtr(boxInt((int32_t) l)); - } else { - return original_Long_FromInt64_t(ctx, l); - } -} - -static HPy augment_Long_FromUInt64_t(HPyContext *ctx, uint64_t l) { - if (isBoxableUnsignedInt(l)) { - return toPtr(boxInt((int32_t) l)); - } else { - return original_Long_FromUInt64_t(ctx, l); - } -} - -static HPy augment_Long_FromSsize_t(HPyContext *ctx, HPy_ssize_t l) { - if (isBoxableInt(l)) { - return toPtr(boxInt((int32_t) l)); - } else { - return original_Long_FromSsize_t(ctx, l); - } -} - -static HPy augment_Long_FromSize_t(HPyContext *ctx, size_t l) { - if (isBoxableUnsignedInt(l)) { - return toPtr(boxInt((int32_t) l)); - } else { - return original_Long_FromSize_t(ctx, l); - } -} - -static void augment_Close(HPyContext *ctx, HPy h) { - uint64_t bits = toBits(h); - if (!bits) { - return; - } else if (isBoxedHandle(bits)) { - if (bits < IMMUTABLE_HANDLES) { - return; - } - if (unclosedHandleTop < MAX_UNCLOSED_HANDLES) { - unclosedHandles[unclosedHandleTop++] = h; - } else { - upcallBulkClose(ctx, unclosedHandles, unclosedHandleTop); - memset(unclosedHandles, 0, sizeof(uint64_t) * unclosedHandleTop); - unclosedHandleTop = 0; - } - } -} - -static HPy augment_Dup(HPyContext *ctx, HPy h) { - uint64_t bits = toBits(h); - if (isBoxedHandle(bits)) { - if (bits < IMMUTABLE_HANDLES) { - return h; - } - return original_Dup(ctx, h); - } else { - return h; - } -} - -static int augment_Number_Check(HPyContext *ctx, HPy obj) { - uint64_t bits = toBits(obj); - if (isBoxedDouble(bits) || isBoxedInt(bits)) { - return true; - } else { - return original_Number_Check(ctx, obj); - } -} - -static int augment_TypeCheck(HPyContext *ctx, HPy obj, HPy type) { - uint64_t bits = toBits(obj); - if (isBoxedInt(bits)) { - return toBits(type) == toBits(ctx->h_LongType) || toBits(type) == toBits(ctx->h_BaseObjectType); - } else if (isBoxedDouble(bits)) { - return toBits(type) == toBits(ctx->h_FloatType) || toBits(type) == toBits(ctx->h_BaseObjectType); - } - return original_TypeCheck(ctx, obj, type); -} - -static int augment_List_Check(HPyContext *ctx, HPy obj) { - uint64_t bits = toBits(obj); - if (isBoxedHandle(bits)) { - return original_List_Check(ctx, obj); - } else { - return false; - } -} - -HPy augment_Global_Load(HPyContext *ctx, HPyGlobal global) { - uint64_t bits = toBits(global); - if (bits && isBoxedHandle(bits)) { - return original_Global_Load(ctx, global); - } else { - return toPtr(bits); - } -} - -void augment_Global_Store(HPyContext *ctx, HPyGlobal *global, HPy h) { - uint64_t bits = toBits(h); - if (bits && isBoxedHandle(bits)) { - original_Global_Store(ctx, global, h); - } else { - global->_i = h._i; - } -} - -HPy augment_Field_Load(HPyContext *ctx, HPy source_object, HPyField source_field) { - uint64_t bits = toBits(source_field); - if (bits && isBoxedHandle(bits)) { - return original_Field_Load(ctx, source_object, source_field); - } else { - return toPtr(bits); - } -} - -void augment_Field_Store(HPyContext *ctx, HPy target_object, HPyField *target_field, HPy h) { - uint64_t bits = toBits(h); - if (bits && isBoxedHandle(bits)) { - original_Field_Store(ctx, target_object, target_field, h); - } else { - target_field->_i = h._i; - } -} - -HPy augment_Type(HPyContext *ctx, HPy obj) { - uint64_t bits = toBits(obj); - if (isBoxedInt(bits)) { - return augment_Dup(ctx, ctx->h_LongType); - } else if (isBoxedDouble(bits)) - return augment_Dup(ctx, ctx->h_FloatType); - if (bits && isBoxedHandle(bits)) { - return original_Type(ctx, obj); - } else { - return toPtr(bits); - } -} - -#define GENERATE_AUGMENTED_BINOP(NAME, OP) \ - static HPy augment_##NAME(HPyContext *ctx, HPy h1, HPy h2) { \ - uint64_t bits1 = toBits(h1); \ - uint64_t bits2 = toBits(h2); \ - if (isBoxedInt(bits1) && isBoxedInt(bits2)) { \ - int64_t i1 = (int64_t) unboxInt(bits1); \ - int64_t i2 = (int64_t) unboxInt(bits2); \ - return augment_Long_FromInt64_t(ctx, i1 OP i2); \ - } else if (isBoxedInt(bits1) && isBoxedDouble(bits2)) { \ - int32_t i1 = unboxInt(bits1); \ - double f2 = unboxDouble(bits2); \ - return augment_Float_FromDouble(ctx, i1 OP f2); \ - } else if (isBoxedDouble(bits1) && isBoxedInt(bits2)) { \ - double f1 = unboxDouble(bits1); \ - int32_t i2 = unboxInt(bits2); \ - return augment_Float_FromDouble(ctx, f1 OP i2); \ - } else if (isBoxedDouble(bits1) && isBoxedDouble(bits2)) { \ - double f1 = unboxDouble(bits1); \ - double f2 = unboxDouble(bits2); \ - return augment_Float_FromDouble(ctx, f1 OP f2); \ - } \ - return original_##NAME(ctx, h1, h2); \ - } - -GENERATE_AUGMENTED_BINOP(Add, +) -GENERATE_AUGMENTED_BINOP(Subtract, -) -GENERATE_AUGMENTED_BINOP(Multiply, *) - -static HPy augment_FloorDivide(HPyContext *ctx, HPy h1, HPy h2) { - uint64_t bits1 = toBits(h1); - uint64_t bits2 = toBits(h2); - if (isBoxedInt(bits1) && isBoxedInt(bits2)) { - int32_t i1 = unboxInt(bits1); - int32_t i2 = unboxInt(bits2); - if (i2 == 0) { - HPyErr_SetString(ctx, ctx->h_ZeroDivisionError, "division by zero"); - return HPy_NULL; - } - return augment_Long_FromInt64_t(ctx, i1 / i2); - } - return original_FloorDivide(ctx, h1, h2); -} - -static HPy augment_TrueDivide(HPyContext *ctx, HPy h1, HPy h2) { - uint64_t bits1 = toBits(h1); - uint64_t bits2 = toBits(h2); - if (isBoxedInt(bits1) && isBoxedInt(bits2)) { - int32_t i2 = unboxInt(bits2); - if (i2 == 0) { - goto div_by_zero; - } - double f1 = (double) unboxInt(bits1); - return augment_Float_FromDouble(ctx, f1 / i2); - } else if (isBoxedInt(bits1) && isBoxedDouble(bits2)) { - int32_t i1 = unboxInt(bits1); - double f2 = unboxDouble(bits2); - if (f2 == 0.0) { - goto div_by_zero; - } - return augment_Float_FromDouble(ctx, i1 / f2); - } else if (isBoxedDouble(bits1) && isBoxedInt(bits2)) { - double f1 = unboxDouble(bits1); - int32_t i2 = unboxInt(bits2); - if (i2 == 0) { - goto div_by_zero; - } - return augment_Float_FromDouble(ctx, f1 / i2); - } else if (isBoxedDouble(bits1) && isBoxedDouble(bits2)) { - double f1 = unboxDouble(bits1); - double f2 = unboxDouble(bits2); - if (f2 == 0.0) { - goto div_by_zero; - } - return augment_Float_FromDouble(ctx, f1 / f2); - } - return original_TrueDivide(ctx, h1, h2); -div_by_zero: - HPyErr_SetString(ctx, ctx->h_ZeroDivisionError, "division by zero"); - return HPy_NULL; -} - -#define HPy_RETURN_RICHCOMPARE_BOOL(ctx, val1, val2, op) \ - do { \ - int result; \ - switch (op) { \ - case HPy_EQ: result = ((val1) == (val2)); break; \ - case HPy_NE: result = ((val1) != (val2)); break; \ - case HPy_LT: result = ((val1) < (val2)); break; \ - case HPy_GT: result = ((val1) > (val2)); break; \ - case HPy_LE: result = ((val1) <= (val2)); break; \ - case HPy_GE: result = ((val1) >= (val2)); break; \ - default: \ - HPy_FatalError(ctx, "Invalid value for HPy_RichCmpOp"); \ - } \ - return result; \ - } while (0) - -static inline int richcompare_boxed_values(HPyContext *ctx, uint64_t vbits, uint64_t wbits, int op) { - if (isBoxedInt(vbits)) { - if (isBoxedInt(wbits)) { - HPy_RETURN_RICHCOMPARE_BOOL(ctx, unboxInt(vbits), unboxInt(wbits), op); - } else { - assert(isBoxedDouble(wbits)); - HPy_RETURN_RICHCOMPARE_BOOL(ctx, unboxInt(vbits), unboxDouble(wbits), op); - } - } else { - assert(isBoxedDouble(vbits)); - if (isBoxedInt(wbits)) { - HPy_RETURN_RICHCOMPARE_BOOL(ctx, unboxDouble(vbits), unboxInt(wbits), op); - } else { - assert(isBoxedDouble(wbits)); - HPy_RETURN_RICHCOMPARE_BOOL(ctx, unboxDouble(vbits), unboxDouble(wbits), op); - } - } -} - -static HPy augment_RichCompare(HPyContext *ctx, HPy v, HPy w, int op) { - uint64_t vbits = toBits(v); - uint64_t wbits = toBits(w); - int result; - if (!isBoxedHandle(vbits) && !isBoxedHandle(wbits)) { - result = richcompare_boxed_values(ctx, vbits, wbits, op); - if (result) - return HPy_Dup(ctx, ctx->h_True); - return HPy_Dup(ctx, ctx->h_False); - } - return original_RichCompare(ctx, v, w, op); -} - -static int augment_RichCompareBool(HPyContext *ctx, HPy v, HPy w, int op) { - uint64_t vbits = toBits(v); - uint64_t wbits = toBits(w); - if (!isBoxedHandle(vbits) && !isBoxedHandle(wbits)) { - return richcompare_boxed_values(ctx, vbits, wbits, op); - } - return original_RichCompareBool(ctx, v, w, op); -} - -void init_native_fast_paths(HPyContext *context) { - LOG("%p", context); - -#define AUGMENT(name) \ - original_ ## name = context->ctx_ ## name; \ - context->ctx_ ## name = augment_ ## name; - - AUGMENT(Float_FromDouble); - AUGMENT(Float_AsDouble); - - AUGMENT(Long); - AUGMENT(Long_AsInt32_t); - AUGMENT(Long_AsInt64_t); - AUGMENT(Long_AsUInt32_t); - AUGMENT(Long_AsDouble); - AUGMENT(Long_AsSsize_t); - AUGMENT(Long_AsSize_t); - AUGMENT(Long_FromInt32_t); - AUGMENT(Long_FromUInt32_t); - AUGMENT(Long_FromInt64_t); - AUGMENT(Long_FromUInt64_t); - AUGMENT(Long_FromSsize_t); - AUGMENT(Long_FromSize_t); - - AUGMENT(Dup); - AUGMENT(Close); - - AUGMENT(AsStruct_Object); - context->ctx_AsStruct_Legacy = augment_AsStruct_Object; - context->ctx_AsStruct_Float = augment_AsStruct_Object; - context->ctx_AsStruct_List = augment_AsStruct_Object; - context->ctx_AsStruct_Long = augment_AsStruct_Object; - context->ctx_AsStruct_Type = augment_AsStruct_Object; - context->ctx_AsStruct_Unicode = augment_AsStruct_Object; - context->ctx_AsStruct_Tuple = augment_AsStruct_Object; - - - AUGMENT(Number_Check); - - AUGMENT(TypeCheck); - - AUGMENT(List_Check); - - AUGMENT(Global_Load); - AUGMENT(Global_Store); - - AUGMENT(Field_Load); - AUGMENT(Field_Store); - - AUGMENT(Is); - AUGMENT(IsTrue); - - AUGMENT(Type); - - AUGMENT(Add); - AUGMENT(Subtract); - AUGMENT(Multiply); - AUGMENT(FloorDivide); - AUGMENT(TrueDivide); - - AUGMENT(RichCompare); - AUGMENT(RichCompareBool); - -#undef AUGMENT -} diff --git a/graalpython/com.oracle.graal.python.jni/src/hpy_native_fast_paths.h b/graalpython/com.oracle.graal.python.jni/src/hpy_native_fast_paths.h deleted file mode 100644 index 7fb7582366..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/hpy_native_fast_paths.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - - -#ifndef HPY_NATIVE_FAST_PATHS_H_ -#define HPY_NATIVE_FAST_PATHS_H_ - -//************************* -// BOXING - -#define NAN_BOXING_BASE (0x0007000000000000llu) -#define NAN_BOXING_MASK (0xFFFF000000000000llu) -#define NAN_BOXING_INT (0x0001000000000000llu) -#define NAN_BOXING_INT_MASK (0x00000000FFFFFFFFllu) -#define NAN_BOXING_MAX_HANDLE (0x000000007FFFFFFFllu) -#define IMMUTABLE_HANDLES (0x0000000000000100llu) - -// Some singleton Python objects are guaranteed to be always represented by -// those handles, so that we do not have to upcall to unambiguously check if -// a handle represents one of those -#define SINGLETON_HANDLES_MAX (3) - -#define isBoxedDouble(value) ((value) >= NAN_BOXING_BASE) -#define isBoxedHandle(value) ((value) <= NAN_BOXING_MAX_HANDLE) -#define isBoxedInt(value) (((value) & NAN_BOXING_MASK) == NAN_BOXING_INT) - -#define unboxHandle(value) (value) -#define boxHandle(handle) (handle) - -#define isBoxableInt(value) (INT32_MIN < (value) && (value) < INT32_MAX) -#define isBoxableUnsignedInt(value) ((value) < INT32_MAX) -#define unboxInt(value) ((int32_t) ((value) - NAN_BOXING_INT)) -#define boxInt(value) ((((uint64_t) (value)) & NAN_BOXING_INT_MASK) + NAN_BOXING_INT) - -#define toBits(ptr) ((uint64_t) ((ptr)._i)) -#define toPtr(ptr) ((HPy) { (HPy_ssize_t) (ptr) }) - -//************************* -// native HPyTracker implementation - -typedef struct { - HPy_ssize_t capacity; // allocated handles - HPy_ssize_t length; // used handles - HPy *handles; -} _HPyTracker_s; - -static inline _HPyTracker_s *_ht2hp(HPyTracker ht) { - return (_HPyTracker_s *) (ht)._i; -} -static inline HPyTracker _hp2ht(_HPyTracker_s *hp) { - return (HPyTracker) {(HPy_ssize_t) (hp)}; -} - -void init_native_fast_paths(HPyContext *context); - -#endif /* HPY_NATIVE_FAST_PATHS_H_ */ diff --git a/graalpython/com.oracle.graal.python.jni/src/trace/_tracemod.c b/graalpython/com.oracle.graal.python.jni/src/trace/_tracemod.c deleted file mode 100644 index e52bb5a464..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/trace/_tracemod.c +++ /dev/null @@ -1,275 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -// Python-level interface for the _trace module. Written in HPy itself, the -// idea is that it should be reusable by other implementations - -// NOTE: hpy.trace._trace is loaded using the UNIVERSAL ctx. To make it -// clearer, we will use "uctx" and "tctx" to distinguish them. - -#include "hpy.h" -#include "trace_internal.h" - -#ifndef _WIN32 -#include -#define MAX_SEC (LLONG_MAX / FREQ_NSEC) -#endif - -HPY_MOD_EMBEDDABLE(_trace) - -static inline int is_empty(const char *s) -{ - return s[0] == '\0'; -} - -#ifdef _WIN32 -static inline HPy win_time_to_ns(HPyContext *uctx, const LONGLONG to_ns, _HPyTime_t t) -{ - return HPyLong_FromLongLong(uctx, t.QuadPart * to_ns); -} - -#else -static inline HPy posix_time_to_ns(HPyContext *uctx, HPy *s_to_ns, _HPyTime_t t) -{ - /* Fast-path: If we can fit into a signed 64-bit integer, then do the - computation in C. This is the case if we can do 't.tv_sec * FREQ_SEC' - (i.e. converting seconds to nanoseconds) and add 'tv.tv_nsec' without - overflowing. */ - if (t.tv_sec < MAX_SEC) { - return HPyLong_FromLongLong(uctx, (long long)t.tv_sec * FREQ_NSEC + - (long long)t.tv_nsec); - } else { - /* Slow-path: do the computation with an (unbound) Python long */ - if (HPy_IsNull(*s_to_ns)) { - *s_to_ns = HPyLong_FromLongLong(uctx, FREQ_NSEC); - } - - HPy h_tv_sec = HPyLong_FromLongLong(uctx, t.tv_sec); - HPy h_tv_sec_as_ns = HPy_Multiply(uctx, h_tv_sec, *s_to_ns); - HPy_Close(uctx, h_tv_sec); - - HPy tv_nsec = HPyLong_FromLong(uctx, t.tv_nsec); - HPy res = HPy_Add(uctx, h_tv_sec_as_ns, tv_nsec); - HPy_Close(uctx, h_tv_sec_as_ns); - HPy_Close(uctx, tv_nsec); - - return res; - } -} -#endif - -HPyDef_METH(get_durations, "get_durations", HPyFunc_NOARGS) -static HPy get_durations_impl(HPyContext *uctx, HPy self) -{ - HPyContext *tctx = hpy_trace_get_ctx(uctx); - HPyTraceInfo *info = get_info(tctx); - HPyTracker ht = HPyTracker_New(uctx, hpy_trace_get_nfunc()); - -#ifdef _WIN32 - const LONGLONG to_ns = FREQ_NSEC / info->counter_freq.QuadPart; -#else - HPy s_to_ns = HPy_NULL; -#endif - HPy res = HPyDict_New(uctx); - const char *func_name; - for (int i=0; (func_name = hpy_trace_get_func_name(i)); i++) - { - /* skip empty names; those indices denote a context handle */ - if (!is_empty(func_name)) - { -#ifdef _WIN32 - HPy value = win_time_to_ns(uctx, to_ns, info->durations[i]); -#else - HPy value = posix_time_to_ns(uctx, &s_to_ns, info->durations[i]); -#endif - HPyTracker_Add(uctx, ht, value); - if (HPy_IsNull(value)) - goto fail; - if (HPy_SetItem_s(uctx, res, func_name, value) < 0) - goto fail; - } - } -#ifndef _WIN32 - HPy_Close(uctx, s_to_ns); -#endif - HPyTracker_Close(uctx, ht); - return res; -fail: - HPy_Close(uctx, res); - HPyTracker_Close(uctx, ht); - return HPy_NULL; -} - -HPyDef_METH(get_call_counts, "get_call_counts", HPyFunc_NOARGS) -static HPy get_call_counts_impl(HPyContext *uctx, HPy self) -{ - HPyContext *tctx = hpy_trace_get_ctx(uctx); - HPyTraceInfo *info = get_info(tctx); - HPyTracker ht = HPyTracker_New(uctx, hpy_trace_get_nfunc()); - HPy res = HPyDict_New(uctx); - const char *func_name; - for (int i=0; (func_name = hpy_trace_get_func_name(i)); i++) - { - /* skip empty names; those indices denote a context handle */ - if (!is_empty(func_name)) - { - HPy value = HPyLong_FromUnsignedLongLong(uctx, - (unsigned long long)info->call_counts[i]); - HPyTracker_Add(uctx, ht, value); - if (HPy_IsNull(value)) - goto fail; - if (HPy_SetItem_s(uctx, res, func_name, value) < 0) - goto fail; - } - } - HPyTracker_Close(uctx, ht); - return res; -fail: - HPy_Close(uctx, res); - HPyTracker_Close(uctx, ht); - return HPy_NULL; -} - -static int check_and_set_func(HPyContext *uctx, HPy arg, HPy *out) -{ - if (HPy_IsNull(arg)) { - // not provided -> do not change value - return 0; - } else if (HPy_Is(uctx, arg, uctx->h_None)) { - // None -> clear function - *out = HPy_NULL; - return 0; - } else if (!HPyCallable_Check(uctx, arg)) { - // not null, not None, not callable -> error - HPyErr_SetString(uctx, uctx->h_TypeError, "Expected a callable object or None"); - return -1; - } - // a callable -> set function - *out = HPy_Dup(uctx, arg); - return 0; -} - -static const char *set_trace_funcs_kwlist[] = { "on_enter", "on_exit", NULL }; - -static int -get_optional_arg(HPyContext *ctx, const HPy *args, size_t nargs, HPy kwnames, - HPy_ssize_t i, const char *kwname, HPy *out) -{ - HPy_ssize_t nkw, j; - HPy h_kwname, h_item; - // if given as positional arg - if (i < (HPy_ssize_t) nargs) { - *out = args[i]; - return 0; - } - - if (HPy_IsNull(kwnames)) { - return 0; - } - - nkw = HPy_Length(ctx, kwnames); - if (nkw < 0) { - return -1; - } - h_kwname = HPyUnicode_FromString(ctx, kwname); - if (HPy_IsNull(h_kwname)) { - return -1; - } - for (j=0; j < nkw; j++) { - h_item = HPy_GetItem_i(ctx, kwnames, j); - if (HPy_IsNull(h_item)) { - HPy_Close(ctx, h_kwname); - return -1; - } - if (HPy_RichCompareBool(ctx, h_kwname, h_item, HPy_EQ)) { - HPy_Close(ctx, h_kwname); - HPy_Close(ctx, h_item); - *out = args[nargs + j]; - return 0; - } - HPy_Close(ctx, h_item); - } - return 0; -} - -HPyDef_METH(set_trace_functions, "set_trace_functions", HPyFunc_KEYWORDS, - .doc="Set the functions to call if an HPy API is entered/exited.") -static HPy set_trace_functions_impl(HPyContext *uctx, HPy self, const HPy *args, - size_t nargs, HPy kwnames) -{ - HPy h_on_enter = HPy_NULL; - HPy h_on_exit = HPy_NULL; - HPyContext *dctx = hpy_trace_get_ctx(uctx); - HPyTraceInfo *info = get_info(dctx); - - // GraalPy change: avoid usage of HPyArg_ParseKeywords - if (get_optional_arg(uctx, args, nargs, kwnames, 0, - set_trace_funcs_kwlist[0], &h_on_enter) < 0 - || get_optional_arg(uctx, args, nargs, kwnames, 1, - set_trace_funcs_kwlist[1], &h_on_exit) < 0) - { - return HPy_NULL; - } - - int r = check_and_set_func(uctx, h_on_enter, &info->on_enter_func) < 0 || - check_and_set_func(uctx, h_on_exit, &info->on_exit_func) < 0; - if (r) { - return HPy_NULL; - } - return HPy_Dup(uctx, uctx->h_None); -} - -HPyDef_METH(get_frequency, "get_frequency", HPyFunc_NOARGS, - .doc="Resolution of the used clock in Hertz.") -static HPy get_frequency_impl(HPyContext *uctx, HPy self) -{ - HPyContext *tctx = hpy_trace_get_ctx(uctx); - HPyTraceInfo *info = get_info(tctx); -#ifdef _WIN32 - long long f = (long long) info->counter_freq.QuadPart; -#else - long long f = (long long) info->counter_freq.tv_sec + - (long long)info->counter_freq.tv_nsec * FREQ_NSEC; -#endif - return HPyLong_FromLongLong(uctx, f); -} - - -/* ~~~~~~ definition of the module hpy.trace._trace ~~~~~~~ */ - -static HPyDef *module_defines[] = { - &get_durations, - &get_call_counts, - &set_trace_functions, - &get_frequency, - NULL -}; - -static HPyModuleDef moduledef = { - .doc = "HPy trace mode", - .size = 0, - .defines = module_defines -}; - -HPy_MODINIT(_trace, moduledef) diff --git a/graalpython/com.oracle.graal.python.jni/src/trace/hpy_trace.h b/graalpython/com.oracle.graal.python.jni/src/trace/hpy_trace.h deleted file mode 100644 index 70d6320239..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/trace/hpy_trace.h +++ /dev/null @@ -1,66 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef HPY_TRACE_H -#define HPY_TRACE_H - -#include "hpy.h" - -/* - This is the main public API for the trace mode, and it's meant to be used - by hpy.universal implementations (including but not limited to the - CPython's version of hpy.universal which is included in this repo). - - The idea is that for every uctx there is a corresponding unique tctx which - wraps it. - - If you call hpy_trace_get_ctx twice on the same uctx, you get the same - result. -*/ - -HPyContext * hpy_trace_get_ctx(HPyContext *uctx); -int hpy_trace_ctx_init(HPyContext *tctx, HPyContext *uctx); -int hpy_trace_ctx_free(HPyContext *tctx); -int hpy_trace_get_nfunc(void); -const char * hpy_trace_get_func_name(int idx); - -// this is the HPy init function created by HPy_MODINIT. In CPython's version -// of hpy.universal the code is embedded inside the extension, so we can call -// this function directly instead of dlopen it. This is similar to what -// CPython does for its own built-in modules. But we must use the same -// signature as HPy_MODINIT - -#ifdef ___cplusplus -extern "C" -#endif -HPy_EXPORTED_SYMBOL -HPyModuleDef* HPyInit__trace(); - -#ifdef ___cplusplus -extern "C" -#endif -HPy_EXPORTED_SYMBOL -void HPyInitGlobalContext__trace(HPyContext *ctx); - -#endif /* HPY_TRACE_H */ diff --git a/graalpython/com.oracle.graal.python.jni/src/trace/include/hpy_trace.h b/graalpython/com.oracle.graal.python.jni/src/trace/include/hpy_trace.h deleted file mode 100644 index 70d6320239..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/trace/include/hpy_trace.h +++ /dev/null @@ -1,66 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef HPY_TRACE_H -#define HPY_TRACE_H - -#include "hpy.h" - -/* - This is the main public API for the trace mode, and it's meant to be used - by hpy.universal implementations (including but not limited to the - CPython's version of hpy.universal which is included in this repo). - - The idea is that for every uctx there is a corresponding unique tctx which - wraps it. - - If you call hpy_trace_get_ctx twice on the same uctx, you get the same - result. -*/ - -HPyContext * hpy_trace_get_ctx(HPyContext *uctx); -int hpy_trace_ctx_init(HPyContext *tctx, HPyContext *uctx); -int hpy_trace_ctx_free(HPyContext *tctx); -int hpy_trace_get_nfunc(void); -const char * hpy_trace_get_func_name(int idx); - -// this is the HPy init function created by HPy_MODINIT. In CPython's version -// of hpy.universal the code is embedded inside the extension, so we can call -// this function directly instead of dlopen it. This is similar to what -// CPython does for its own built-in modules. But we must use the same -// signature as HPy_MODINIT - -#ifdef ___cplusplus -extern "C" -#endif -HPy_EXPORTED_SYMBOL -HPyModuleDef* HPyInit__trace(); - -#ifdef ___cplusplus -extern "C" -#endif -HPy_EXPORTED_SYMBOL -void HPyInitGlobalContext__trace(HPyContext *ctx); - -#endif /* HPY_TRACE_H */ diff --git a/graalpython/com.oracle.graal.python.jni/src/trace/trace_internal.h b/graalpython/com.oracle.graal.python.jni/src/trace/trace_internal.h deleted file mode 100644 index 30c3da6d85..0000000000 --- a/graalpython/com.oracle.graal.python.jni/src/trace/trace_internal.h +++ /dev/null @@ -1,96 +0,0 @@ -/* MIT License - * - * Copyright (c) 2023, 2023, Oracle and/or its affiliates. - * Copyright (c) 2019 pyhandle - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* Internal header for all the files in hpy/debug/src. The public API is in - include/hpy_debug.h -*/ -#ifndef HPY_TRACE_INTERNAL_H -#define HPY_TRACE_INTERNAL_H - -#include -#ifdef _WIN32 -#include -#else -#include -#endif -#include "hpy.h" -#include "hpy_trace.h" - - -#define HPY_TRACE_MAGIC 0xF00BAA5 - -// frequency of nanosecond resolution -#define FREQ_NSEC 1000000000L - -/* === HPyTraceInfo === */ - -#ifdef _WIN32 -typedef LARGE_INTEGER _HPyTime_t; -typedef BOOL _HPyClockStatus_t; -#else -typedef struct timespec _HPyTime_t; -typedef int _HPyClockStatus_t; -#endif - -typedef struct { - long magic_number; // used just for sanity checks - HPyContext *uctx; - /* frequency of the used performance counter */ - _HPyTime_t counter_freq; -#ifdef _WIN32 - /* to_ns = FREQ_NS / counter_freq */ - int64_t to_ns; -#endif - /* call count of the corresponding HPy API function */ - uint64_t *call_counts; - /* durations spent in the corresponding HPy API function */ - _HPyTime_t *durations; - HPy on_enter_func; - HPy on_exit_func; -} HPyTraceInfo; - - -static inline HPyTraceInfo *get_info(HPyContext *tctx) -{ - HPyTraceInfo *info = (HPyTraceInfo*)tctx->_private; - assert(info->magic_number == HPY_TRACE_MAGIC); // sanity check - return info; -} - -/* Get the current value of the monotonic clock. This is a platform-dependent - operation. */ -static inline _HPyClockStatus_t get_monotonic_clock(_HPyTime_t *t) -{ -#ifdef _WIN32 - return (int)QueryPerformanceCounter(t); -#else - return clock_gettime(CLOCK_MONOTONIC_RAW, t); -#endif -} - -HPyTraceInfo *hpy_trace_on_enter(HPyContext *tctx, int id); -void hpy_trace_on_exit(HPyTraceInfo *info, int id, _HPyClockStatus_t r0, - _HPyClockStatus_t r1, _HPyTime_t *_ts_start, _HPyTime_t *_ts_end); - -#endif /* HPY_TRACE_INTERNAL_H */ diff --git a/graalpython/com.oracle.graal.python.pegparser.generator/asdl/asdl_java.py b/graalpython/com.oracle.graal.python.pegparser.generator/asdl/asdl_java.py index 77b684f9d4..0b1c8e852f 100755 --- a/graalpython/com.oracle.graal.python.pegparser.generator/asdl/asdl_java.py +++ b/graalpython/com.oracle.graal.python.pegparser.generator/asdl/asdl_java.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -44,7 +44,6 @@ from asdl import java_file from asdl import model - SST_PACKAGE = 'com.oracle.graal.python.pegparser.sst' AST_PACKAGE = 'com.oracle.graal.python.builtins.modules.ast' @@ -285,7 +284,7 @@ def visit_abstract_class(self, c: model.AbstractClass, emitter: java_file.Emitte def visit_concrete_class(self, c: model.ConcreteClass, emitter: java_file.Emitter): with emitter.define(f'public Object visit({c.full_name} node)', '@Override'): - emitter.println(f'PythonObject o = factory.createPythonObject(state.{c.name.cls_field});') + emitter.println(f'PythonObject o = createPythonObject(state.{c.name.cls_field});') for f in c.fields: self.visit(f, emitter) if c.outer_has_attributes or c.attributes: @@ -338,6 +337,7 @@ def visit_module(self, module: model.Module): @staticmethod def emit_imports(module, emitter): emitter.println() + emitter.println('import com.oracle.truffle.api.nodes.Node;') emitter.println('import com.oracle.graal.python.builtins.objects.PNone;') emitter.println('import com.oracle.graal.python.pegparser.sst.ConstantValue;') top_level_class_names = [t.name.java for t in module.types] @@ -346,8 +346,8 @@ def emit_imports(module, emitter): emitter.println('import com.oracle.graal.python.pegparser.tokenizer.SourceRange;') def emit_constructor(self, emitter: java_file.Emitter): - with emitter.define(f'{self.CLASS_NAME}({AstStateGenerator.CLASS_NAME} state)'): - emitter.println('super(state);') + with emitter.define(f'{self.CLASS_NAME}(Node node, {AstStateGenerator.CLASS_NAME} state)'): + emitter.println('super(node, state);') @staticmethod def visit_enum(c: model.Enum, emitter: java_file.Emitter): diff --git a/graalpython/com.oracle.graal.python.pegparser.generator/asdl/java_file.py b/graalpython/com.oracle.graal.python.pegparser.generator/asdl/java_file.py index 8119ee2fa9..8c37571e8b 100644 --- a/graalpython/com.oracle.graal.python.pegparser.generator/asdl/java_file.py +++ b/graalpython/com.oracle.graal.python.pegparser.generator/asdl/java_file.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -42,7 +42,7 @@ from typing import Optional HEADER = """/* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser.test/src/com/oracle/graal/python/pegparser/test/LambdaInFunctionTests.java b/graalpython/com.oracle.graal.python.pegparser.test/src/com/oracle/graal/python/pegparser/test/LambdaInFunctionTests.java index 270463582c..9734ede0f0 100644 --- a/graalpython/com.oracle.graal.python.pegparser.test/src/com/oracle/graal/python/pegparser/test/LambdaInFunctionTests.java +++ b/graalpython/com.oracle.graal.python.pegparser.test/src/com/oracle/graal/python/pegparser/test/LambdaInFunctionTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser.test/src/com/oracle/graal/python/pegparser/test/YieldStatementTests.java b/graalpython/com.oracle.graal.python.pegparser.test/src/com/oracle/graal/python/pegparser/test/YieldStatementTests.java index 4c8f52b4bf..974894ae9d 100644 --- a/graalpython/com.oracle.graal.python.pegparser.test/src/com/oracle/graal/python/pegparser/test/YieldStatementTests.java +++ b/graalpython/com.oracle.graal.python.pegparser.test/src/com/oracle/graal/python/pegparser/test/YieldStatementTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/AbstractParser.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/AbstractParser.java index e7ae80ab58..9aeab9237d 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/AbstractParser.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/AbstractParser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -52,6 +52,8 @@ import java.util.List; import java.util.function.Supplier; +import org.graalvm.shadowed.com.ibm.icu.text.Normalizer2; + import com.oracle.graal.python.pegparser.sst.ArgTy; import com.oracle.graal.python.pegparser.sst.CmpOpTy; import com.oracle.graal.python.pegparser.sst.ComprehensionTy; @@ -350,7 +352,7 @@ public Token getLastNonWhitespaceToken() { public ExprTy.Name name_token() { Token t = expect(Token.Kind.NAME); if (t != null) { - return factory.createVariable(getText(t), t.sourceRange); + return name_from_token(t); } else { return null; } @@ -504,6 +506,13 @@ public ExprTy.Name name_from_token(Token t) { return null; } String id = getText(t); + for (int i = 0; i < id.length(); i++) { + if (id.charAt(i) > 0xff) { + // If the identifier is not ASCII, normalize it according to PEP 3131 + id = Normalizer2.getNFKCInstance().normalize(id); + break; + } + } return factory.createVariable(id, t.sourceRange); } diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/scope/Scope.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/scope/Scope.java index d0c299cd24..07cde10a2f 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/scope/Scope.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/scope/Scope.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -229,11 +229,15 @@ public boolean isNested() { } public HashMap getSymbolsByType(EnumSet expectedFlags, int start) { + return getSymbolsByType(expectedFlags, EnumSet.noneOf(DefUse.class), start); + } + + public HashMap getSymbolsByType(EnumSet expectedFlags, EnumSet unexpectedFlags, int start) { int i = start; HashMap mapping = new HashMap<>(); for (String key : getSortedSymbols()) { EnumSet keyFlags = getUseOfName(key); - if (!Collections.disjoint(expectedFlags, keyFlags)) { + if (!Collections.disjoint(expectedFlags, keyFlags) && Collections.disjoint(unexpectedFlags, keyFlags)) { mapping.put(key, i++); } } diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/scope/ScopeEnvironment.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/scope/ScopeEnvironment.java index 2005dd65e2..bf816b5b0e 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/scope/ScopeEnvironment.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/scope/ScopeEnvironment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -98,6 +98,7 @@ public class ScopeEnvironment { final HashMap blocks = new HashMap<>(); final ErrorCallback errorCallback; final EnumSet futureFeatures; + final HashMap parents = new HashMap<>(); public static ScopeEnvironment analyze(ModTy moduleNode, ErrorCallback errorCallback, EnumSet futureFeatures) { return new ScopeEnvironment(moduleNode, errorCallback, futureFeatures); @@ -128,6 +129,14 @@ public Scope lookupScope(SSTNode node) { return blocks.get(node); } + public Scope lookupParent(Scope scope) { + return parents.get(scope); + } + + public Scope getTopScope() { + return topScope; + } + private void analyzeBlock(Scope scope, HashSet bound, HashSet free, HashSet global) { HashSet local = new HashSet<>(); HashMap scopes = new HashMap<>(); @@ -328,6 +337,7 @@ private void enterBlock(String name, Scope.ScopeType type, SSTNode ast) { if (type == Scope.ScopeType.Annotation) { return; } + env.parents.put(scope, prev); if (prev != null) { prev.children.add(scope); } diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/AliasTy.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/AliasTy.java index cfd2343286..a492e85003 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/AliasTy.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/AliasTy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ArgTy.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ArgTy.java index 0ace1cb17e..07c350cef1 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ArgTy.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ArgTy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ArgumentsTy.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ArgumentsTy.java index 1d783c4a0f..f73083ec50 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ArgumentsTy.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ArgumentsTy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/BoolOpTy.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/BoolOpTy.java index 0717d0a435..e62e44bcb0 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/BoolOpTy.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/BoolOpTy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/CmpOpTy.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/CmpOpTy.java index 1b881e99a0..2f154eb844 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/CmpOpTy.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/CmpOpTy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ComprehensionTy.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ComprehensionTy.java index 4beed845a8..f42a5e1427 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ComprehensionTy.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ComprehensionTy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ExceptHandlerTy.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ExceptHandlerTy.java index 9efab27d5d..6c0aa13c2f 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ExceptHandlerTy.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ExceptHandlerTy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ExprContextTy.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ExprContextTy.java index a4b09cfdfb..e6f4f850b1 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ExprContextTy.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ExprContextTy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ExprTy.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ExprTy.java index 4612ccb74c..1fb5d88c9d 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ExprTy.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ExprTy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/KeywordTy.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/KeywordTy.java index ef64367a15..32aeca4faf 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/KeywordTy.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/KeywordTy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/MatchCaseTy.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/MatchCaseTy.java index 1a883ad89d..f7f80b4fd7 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/MatchCaseTy.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/MatchCaseTy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ModTy.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ModTy.java index a0bd22ed37..6ea70dcabe 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ModTy.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/ModTy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/OperatorTy.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/OperatorTy.java index 43d5c410fa..15222bba8b 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/OperatorTy.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/OperatorTy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/PatternTy.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/PatternTy.java index 1dcbb13df8..4b6ff77335 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/PatternTy.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/PatternTy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/SSTreeVisitor.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/SSTreeVisitor.java index 8b22fd364b..9a48161b32 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/SSTreeVisitor.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/SSTreeVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/StmtTy.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/StmtTy.java index 02b3cdcf05..ac67e6076c 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/StmtTy.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/StmtTy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/TypeIgnoreTy.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/TypeIgnoreTy.java index a66076b4ac..c5952df203 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/TypeIgnoreTy.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/TypeIgnoreTy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/UnaryOpTy.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/UnaryOpTy.java index b3805a57b9..03b2e2d6a6 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/UnaryOpTy.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/UnaryOpTy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/WithItemTy.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/WithItemTy.java index 69665b12cb..7a102ea40f 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/WithItemTy.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/sst/WithItemTy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/tokenizer/Tokenizer.java b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/tokenizer/Tokenizer.java index 678cf0a537..d05779be5d 100644 --- a/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/tokenizer/Tokenizer.java +++ b/graalpython/com.oracle.graal.python.pegparser/src/com/oracle/graal/python/pegparser/tokenizer/Tokenizer.java @@ -1,4 +1,4 @@ -/* Copyright (c) 2021, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2021, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2021 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -566,7 +566,7 @@ private static String verifyIdentifier(String tokenString) { if (cp != '_' && !UCharacter.hasBinaryProperty(cp, UProperty.XID_START)) { invalid = 0; } - for (int i = 1; i < invalid;) { + for (int i = Character.charCount(cp); i < invalid;) { cp = tokenString.codePointAt(i); if (!UCharacter.hasBinaryProperty(cp, UProperty.XID_CONTINUE)) { invalid = i; diff --git a/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/ArgumentClinicProcessor.java b/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/ArgumentClinicProcessor.java index cdcfabead9..2bc7b0bbe9 100644 --- a/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/ArgumentClinicProcessor.java +++ b/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/ArgumentClinicProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -83,6 +83,7 @@ public class ArgumentClinicProcessor extends AbstractProcessor { private static final boolean LOGGING = false; private static final String BuiltinAnnotationClass = "com.oracle.graal.python.builtins.Builtin"; + private static final String SlotSignatureAnnotationClass = "com.oracle.graal.python.annotations.Slot.SlotSignature"; private static final String BuiltinsAnnotationClass = "com.oracle.graal.python.builtins.Builtins"; private static final String BUILTINS_BASE_CLASSES_PACKAGE = "com.oracle.graal.python.nodes.function.builtins"; @@ -358,7 +359,11 @@ private static BuiltinAnnotation getBuiltinAnnotation(TypeElement type) throws P Stream parameterNames = null; Stream keywordOnlyNames = null; int minNumOfPositionalArgs = -1; + boolean takesVarArgs = false; AnnotationMirror annot = findAnnotationMirror(type, BuiltinAnnotationClass); + if (annot == null) { + annot = findAnnotationMirror(type, SlotSignatureAnnotationClass); + } if (annot == null) { annot = findAnnotationMirror(type, BuiltinsAnnotationClass); if (annot != null) { @@ -392,18 +397,22 @@ private static BuiltinAnnotation getBuiltinAnnotation(TypeElement type) throws P builtinName = (String) item.getValue().getValue(); } else if (item.getKey().getSimpleName().toString().equals("minNumOfPositionalArgs")) { minNumOfPositionalArgs = (int) item.getValue().getValue(); + } else if (item.getKey().getSimpleName().toString().equals("takesVarArgs")) { + takesVarArgs = (boolean) item.getValue().getValue(); } } } if ((parameterNames == null && keywordOnlyNames == null) || builtinName == null) { throw error(type, "In order to use Argument Clinic, the Builtin annotation must contain 'name' and 'parameterNames' and/or 'keywordOnlyNames' fields."); } + if (parameterNames == null) { + parameterNames = Stream.of(); + } + if (takesVarArgs) { + parameterNames = Stream.concat(parameterNames, Stream.of("*args")); + } if (keywordOnlyNames != null) { - if (parameterNames == null) { - parameterNames = keywordOnlyNames; - } else { - parameterNames = Stream.concat(parameterNames, keywordOnlyNames); - } + parameterNames = Stream.concat(parameterNames, keywordOnlyNames); } return new BuiltinAnnotation(builtinName, parameterNames.toArray(String[]::new), minNumOfPositionalArgs); } diff --git a/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/CApiBuiltinsProcessor.java b/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/CApiBuiltinsProcessor.java index f8635ea096..976ef3488b 100644 --- a/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/CApiBuiltinsProcessor.java +++ b/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/CApiBuiltinsProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -69,7 +69,7 @@ import javax.lang.model.type.DeclaredType; import javax.lang.model.type.TypeMirror; import javax.lang.model.util.AbstractAnnotationValueVisitor14; -import javax.lang.model.util.ElementFilter; +import javax.tools.Diagnostic.Kind; import javax.tools.StandardLocation; import com.oracle.graal.python.annotations.CApiConstants; @@ -121,8 +121,8 @@ public synchronized void init(ProcessingEnvironment pe) { try { this.trees = Trees.instance(pe); } catch (Throwable t) { - // ECJ does not support this, so we skip the some processing of C API builtins - pe.getMessager().printWarning("The compiler does not support source tree parsing during annotation processing. Regeneration of Python C API builtins will be incorrect."); + // ECJ does not support this, so we skip the processing of C API builtins + pe.getMessager().printMessage(Kind.NOTE, "The compiler does not support source tree parsing during annotation processing. Regeneration of Python C API builtins will be incorrect."); this.trees = null; } } @@ -560,10 +560,8 @@ private void updateResource(String name, List javaBuiltins, Lis /** * Generates the builtin specification in capi.h, which includes only the builtins implemented * in Java code. Additionally, it generates helpers for all "Py_get_" and "Py_set_" builtins. - * - * @param methodFlags */ - private void generateCApiHeader(List javaBuiltins, Map methodFlags) throws IOException { + private void generateCApiHeader(List javaBuiltins) throws IOException { List lines = new ArrayList<>(); lines.add("#define CAPI_BUILTINS \\"); int id = 0; @@ -602,12 +600,6 @@ private void generateCApiHeader(List javaBuiltins, Map a.getValue().compareTo(b.getValue())).forEach(e -> lines.add("#define " + e.getKey() + " " + e.getValue())); updateResource("capi.gen.h", javaBuiltins, lines); } @@ -861,7 +853,6 @@ public boolean process(Set annotations, RoundEnvironment List constants = new ArrayList<>(); List fields = new ArrayList<>(); List structs = new ArrayList<>(); - Map methodFlags = new HashMap<>(); for (var el : re.getElementsAnnotatedWith(CApiConstants.class)) { if (el.getKind() == ElementKind.ENUM) { for (var enumBit : el.getEnclosedElements()) { @@ -869,13 +860,6 @@ public boolean process(Set annotations, RoundEnvironment constants.add(enumBit.getSimpleName().toString()); } } - } else if (el.getKind() == ElementKind.CLASS) { - for (VariableElement field : ElementFilter.fieldsIn(el.getEnclosedElements())) { - Object constantValue = field.getConstantValue(); - if (constantValue instanceof Long longValue) { - methodFlags.put(field.getSimpleName().toString(), longValue); - } - } } else { processingEnv.getMessager().printError(CApiConstants.class.getSimpleName() + " is only applicable for enums.", el); } @@ -910,7 +894,7 @@ public boolean process(Set annotations, RoundEnvironment if (trees != null) { // needs jdk.compiler generateCApiSource(allBuiltins, constants, fields, structs); - generateCApiHeader(javaBuiltins, methodFlags); + generateCApiHeader(javaBuiltins); } generateBuiltinRegistry(javaBuiltins); generateCApiAsserts(allBuiltins); diff --git a/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/ConverterFactory.java b/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/ConverterFactory.java index defc6ddde2..8303cd0f78 100644 --- a/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/ConverterFactory.java +++ b/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/ConverterFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -210,7 +210,8 @@ public static ConverterFactory[] getForClass(TypeElement conversionClass) throws private static ConverterFactory[] forBuiltin(Elements elementUtils, String className) throws ProcessingError { TypeElement type = elementUtils.getTypeElement(CLINIC_PACKAGE + "." + className); if (type == null) { - throw new ProcessingError(null, "Unable to find built-in argument clinic conversion node " + CLINIC_PACKAGE + "." + className); + throw new ProcessingError(null, "Unable to find built-in argument clinic conversion node " + CLINIC_PACKAGE + "." + className + + ". This may be also a sign that Truffle DSL annotation processor failed to process this class."); } return getForClass(type); } diff --git a/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/SlotsMapping.java b/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/SlotsMapping.java index 506bebd187..d9a12cbd5f 100644 --- a/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/SlotsMapping.java +++ b/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/SlotsMapping.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -52,78 +52,151 @@ private static String getSuffix(boolean isComplex) { static String getSlotBaseClass(Slot s) { return switch (s.value()) { case nb_bool -> "TpSlotInquiry.TpSlotInquiryBuiltin"; - case nb_add, nb_multiply -> "TpSlotBinaryOp.TpSlotBinaryOpBuiltin"; + case nb_index, nb_int, nb_float, nb_absolute, nb_positive, nb_negative, nb_invert, + tp_iter, tp_str, tp_repr, am_aiter, am_anext, am_await -> + "TpSlotUnaryFunc.TpSlotUnaryFuncBuiltin"; + case nb_add, nb_subtract, nb_multiply, nb_remainder, nb_divmod, nb_lshift, nb_rshift, nb_and, nb_xor, nb_or, + nb_floor_divide, nb_true_divide, nb_matrix_multiply -> + "TpSlotBinaryOp.TpSlotBinaryOpBuiltin"; + case nb_inplace_add, nb_inplace_subtract, nb_inplace_multiply, nb_inplace_remainder, + nb_inplace_lshift, nb_inplace_rshift, nb_inplace_and, nb_inplace_xor, nb_inplace_or, + nb_inplace_floor_divide, nb_inplace_true_divide, nb_inplace_matrix_multiply, + sq_inplace_concat -> + "TpSlotBinaryOp.TpSlotBinaryIOpBuiltin"; + case nb_power -> "TpSlotNbPower.TpSlotNbPowerBuiltin"; + case nb_inplace_power -> null; // No builtin implementations case sq_concat -> "TpSlotBinaryFunc.TpSlotSqConcat"; case sq_length, mp_length -> "TpSlotLen.TpSlotLenBuiltin" + getSuffix(s.isComplex()); - case sq_item, sq_repeat -> "TpSlotSizeArgFun.TpSlotSizeArgFunBuiltin"; + case sq_item, sq_repeat, sq_inplace_repeat -> "TpSlotSizeArgFun.TpSlotSizeArgFunBuiltin"; + case sq_ass_item -> "TpSlotSqAssItem.TpSlotSqAssItemBuiltin"; + case sq_contains -> "TpSlotSqContains.TpSlotSqContainsBuiltin"; case mp_subscript -> "TpSlotBinaryFunc.TpSlotMpSubscript"; + case mp_ass_subscript -> "TpSlotMpAssSubscript.TpSlotMpAssSubscriptBuiltin"; case tp_getattro -> "TpSlotGetAttr.TpSlotGetAttrBuiltin"; + case tp_richcompare -> "TpSlotRichCompare.TpSlotRichCmpBuiltin" + getSuffix(s.isComplex()); case tp_descr_get -> "TpSlotDescrGet.TpSlotDescrGetBuiltin" + getSuffix(s.isComplex()); case tp_descr_set -> "TpSlotDescrSet.TpSlotDescrSetBuiltin"; case tp_setattro -> "TpSlotSetAttr.TpSlotSetAttrBuiltin"; + case tp_iternext -> "TpSlotIterNext.TpSlotIterNextBuiltin"; + case tp_hash -> "TpSlotHashFun.TpSlotHashBuiltin"; + case tp_init, tp_call -> "TpSlotVarargs.TpSlotVarargsBuiltin"; + case tp_new -> "TpSlotVarargs.TpSlotNewBuiltin"; }; } static String getSlotNodeBaseClass(Slot s) { return switch (s.value()) { + case tp_richcompare -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare.RichCmpBuiltinNode"; case tp_descr_get -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode"; case nb_bool -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.NbBoolBuiltinNode"; - case nb_add, nb_multiply -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode"; + case nb_index, nb_int, nb_float, nb_absolute, nb_positive, nb_negative, nb_invert, + tp_iter, tp_iternext, tp_str, tp_repr, am_aiter, am_await, am_anext -> + "com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode"; + case nb_add, nb_subtract, nb_multiply, nb_remainder, nb_divmod, nb_lshift, nb_rshift, nb_and, nb_xor, nb_or, + nb_floor_divide, nb_true_divide, nb_matrix_multiply -> + "com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode"; + case nb_power, nb_inplace_power -> "com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode"; case sq_concat -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.SqConcatBuiltinNode"; + case nb_inplace_add, nb_inplace_subtract, nb_inplace_multiply, nb_inplace_remainder, + nb_inplace_lshift, nb_inplace_rshift, nb_inplace_and, nb_inplace_xor, nb_inplace_or, + nb_inplace_floor_divide, nb_inplace_true_divide, nb_inplace_matrix_multiply, + sq_inplace_concat -> + "com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode"; case sq_length, mp_length -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode"; case sq_item -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqItemBuiltinNode"; - case sq_repeat -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqRepeatBuiltinNode"; + case sq_ass_item -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqAssItem.SqAssItemBuiltinNode"; + case sq_repeat, sq_inplace_repeat -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqRepeatBuiltinNode"; + case sq_contains -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqContains.SqContainsBuiltinNode"; case mp_subscript -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.MpSubscriptBuiltinNode"; + case mp_ass_subscript -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotMpAssSubscript.MpAssSubscriptBuiltinNode"; case tp_getattro -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotGetAttr.GetAttrBuiltinNode"; case tp_descr_set -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrSet.DescrSetBuiltinNode"; case tp_setattro -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotSetAttr.SetAttrBuiltinNode"; + case tp_hash -> "com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.HashBuiltinNode"; + case tp_init, tp_new, tp_call -> "com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode"; }; } static String getUncachedExecuteSignature(SlotKind s) { return switch (s) { case nb_bool -> "boolean executeUncached(Object self)"; + case tp_richcompare -> "Object executeUncached(Object self, Object obj, com.oracle.graal.python.lib.RichCmpOp op)"; case tp_descr_get -> "Object executeUncached(Object self, Object obj, Object type)"; case sq_length, mp_length -> "int executeUncached(Object self)"; - case tp_getattro, tp_descr_set, tp_setattro, sq_item, mp_subscript, nb_add, sq_concat, sq_repeat, nb_multiply -> - throw new AssertionError("Should not reach here: should be always complex"); + default -> throw new AssertionError("Should not reach here: should be always complex"); }; } static boolean supportsComplex(SlotKind s) { return switch (s) { case nb_bool -> false; - case sq_length, mp_length, tp_getattro, tp_descr_get, tp_descr_set, - tp_setattro, sq_item, mp_subscript, nb_add, sq_concat, - sq_repeat, nb_multiply -> - true; + default -> true; }; } static boolean supportsSimple(SlotKind s) { return switch (s) { - case nb_bool, sq_length, mp_length, tp_descr_get -> true; - case tp_getattro, tp_descr_set, tp_setattro, sq_item, mp_subscript, - nb_add, sq_concat, sq_repeat, nb_multiply -> - false; + case nb_bool, sq_length, mp_length, tp_descr_get, tp_richcompare -> true; + default -> false; }; } static String getUncachedExecuteCall(SlotKind s) { return switch (s) { case nb_bool -> "executeBool(null, self)"; + case tp_richcompare -> "execute(null, self, obj, op)"; case sq_length, mp_length -> "executeInt(null, self)"; case tp_descr_get -> "execute(null, self, obj, type)"; - case tp_getattro, tp_descr_set, tp_setattro, sq_item, mp_subscript, - nb_add, sq_concat, nb_multiply, sq_repeat -> - throw new AssertionError("Should not reach here: should be always complex"); + default -> throw new AssertionError("Should not reach here: should be always complex"); }; } public static String getExtraCtorArgs(TpSlotData slot) { return switch (slot.slot().value()) { + case nb_index -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___INDEX__"; + case nb_int -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___INT__"; + case nb_float -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOAT__"; + case nb_absolute -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___ABS__"; + case nb_positive -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___POS__"; + case nb_negative -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___NEG__"; + case nb_invert -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___INVERT__"; case nb_add -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___ADD__"; + case nb_subtract -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___SUB__"; case nb_multiply -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___MUL__"; + case nb_remainder -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___MOD__"; + case nb_divmod -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___DIVMOD__"; + case nb_lshift -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___LSHIFT__"; + case nb_rshift -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___RSHIFT__"; + case nb_and -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___AND__"; + case nb_xor -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___XOR__"; + case nb_or -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___OR__"; + case nb_floor_divide -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOORDIV__"; + case nb_true_divide -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___TRUEDIV__"; + case nb_matrix_multiply -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___MATMUL__"; + case nb_inplace_add -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___IADD__"; + case nb_inplace_subtract -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___ISUB__"; + case nb_inplace_multiply -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___IMUL__"; + case nb_inplace_remainder -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___IMOD__"; + case nb_inplace_lshift -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___ILSHIFT__"; + case nb_inplace_rshift -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___IRSHIFT__"; + case nb_inplace_and -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___IAND__"; + case nb_inplace_xor -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___IXOR__"; + case nb_inplace_or -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___IOR__"; + case nb_inplace_floor_divide -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___IFLOORDIV__"; + case nb_inplace_true_divide -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___ITRUEDIV__"; + case nb_inplace_matrix_multiply -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___IMATMUL__"; + case sq_item -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___GETITEM__"; + case sq_repeat -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___MUL__"; + case sq_inplace_concat -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___IADD__"; + case sq_inplace_repeat -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___IMUL__"; + case tp_iter -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__"; + case tp_str -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__"; + case tp_repr -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__"; + case tp_init -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__"; + case tp_call -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__"; + case am_await -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___AWAIT__"; + case am_aiter -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___AITER__"; + case am_anext -> ", com.oracle.graal.python.nodes.SpecialMethodNames.J___ANEXT__"; default -> ""; }; } diff --git a/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/SlotsProcessor.java b/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/SlotsProcessor.java index 885f2ab22f..5e5abd6ea0 100644 --- a/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/SlotsProcessor.java +++ b/graalpython/com.oracle.graal.python.processor/src/com/oracle/graal/python/processor/SlotsProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -63,6 +63,7 @@ import javax.tools.Diagnostic.Kind; import javax.tools.JavaFileObject; +import com.oracle.graal.python.annotations.HashNotImplemented; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.annotations.Slot.Slots; @@ -72,11 +73,27 @@ public class SlotsProcessor extends AbstractProcessor { private static final boolean LOGGING = false; public record TpSlotData(Slot slot, TypeElement enclosingType, TypeElement slotNodeType) { + public boolean isHashNotImplemented() { + return slotNodeType == null; + } + + public static TpSlotData createHashNotImplemented(TypeElement enclosingType) { + return new TpSlotData(null, enclosingType, null); + } + + public String builderCall() { + if (isHashNotImplemented()) { + return ".set(TpSlots.TpSlotMeta.TP_HASH, com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.HASH_NOT_IMPLEMENTED)"; + } + return String.format(".set(TpSlots.TpSlotMeta.%s, %s.INSTANCE)", // + slot.value().name().toUpperCase(Locale.ROOT), // + getSlotImplName(slot.value())); + } } @Override public Set getSupportedAnnotationTypes() { - return Set.of(Slot.class.getName()); + return Set.of(Slot.class.getName(), HashNotImplemented.class.getName()); } @Override @@ -109,7 +126,14 @@ private void doProcess(RoundEnvironment roundEnv) throws IOException, Processing private void validate(HashMap> enclosingTypes) throws ProcessingError { var typeCache = new TypeCache(processingEnv); for (Entry> enclosingType : enclosingTypes.entrySet()) { + boolean seenHashNotImplemented = false; + boolean seenHash = false; for (TpSlotData slot : enclosingType.getValue()) { + if (slot.isHashNotImplemented()) { + seenHashNotImplemented = true; + continue; + } + seenHash |= slot.slot.value() == SlotKind.tp_hash; if (slot.slot.isComplex()) { if (!SlotsMapping.supportsComplex(slot.slot().value())) { throw error(slot.slotNodeType, "Slot does not support complex builtins. The support can be added."); @@ -125,14 +149,22 @@ private void validate(HashMap> enclosingTypes) thro throw error(slot.slotNodeType, "Slot does not inherit from expected base class '%s'", baseName); } } + if (seenHash && seenHashNotImplemented) { + throw error(enclosingType.getKey(), "Annotation %s cannot be use when there is also %s(tp_hash). Remove one or the other.", + HashNotImplemented.class.getSimpleName(), + Slot.class.getSimpleName()); + } } } @SuppressWarnings("try") private void writeCode(HashMap> enclosingTypes) throws IOException { - for (Entry> enclosingType : enclosingTypes.entrySet()) { - String pkgName = getPackage(enclosingType.getKey()); - String className = enclosingType.getKey().getSimpleName() + "SlotsGen"; + for (Entry> enclosingTypeAndSlots : enclosingTypes.entrySet()) { + Set slots = enclosingTypeAndSlots.getValue(); + TypeElement enclosingType = enclosingTypeAndSlots.getKey(); + + String pkgName = getPackage(enclosingType); + String className = enclosingType.getSimpleName() + "SlotsGen"; String sourceFile = pkgName + "." + className; log("Generating file '%s'", sourceFile); @@ -146,10 +178,10 @@ private void writeCode(HashMap> enclosingTypes) thr w.writeLn(); w.writeLn("public class %s {", className); try (Block i = w.newIndent()) { - for (TpSlotData slot : enclosingType.getValue()) { + for (TpSlotData slot : slots) { writeSlot(w, slot); } - writeSlotsStaticField(w, enclosingType.getValue()); + writeSlotsStaticField(w, enclosingType, slots); } w.writeLn("}"); } @@ -168,6 +200,9 @@ private void writeImports(CodeWriter w) throws IOException { @SuppressWarnings("try") private void writeSlot(CodeWriter w, TpSlotData slot) throws IOException { + if (slot.isHashNotImplemented()) { + return; + } log("Writing slot node %s", slot.slotNodeType); String slotImplName = getSlotImplName(slot.slot.value()); String genericArg = ""; @@ -202,13 +237,11 @@ private void writeSlot(CodeWriter w, TpSlotData slot) throws IOException { } @SuppressWarnings("try") - private static void writeSlotsStaticField(CodeWriter w, Set slots) throws IOException { + private static void writeSlotsStaticField(CodeWriter w, TypeElement enclosingType, Set slots) throws IOException { w.writeLn("static final TpSlots SLOTS = TpSlots.newBuilder()"); try (Block i3 = w.newIndent()) { String defs = slots.stream().// - map(s -> String.format(".set(TpSlots.TpSlotMeta.%s, %s.INSTANCE)", // - s.slot.value().name().toUpperCase(Locale.ROOT), // - getSlotImplName(s.slot.value()))).// + map(TpSlotData::builderCall).// collect(Collectors.joining("\n")); w.writeLn("%s.", defs); w.writeLn("build();"); @@ -237,6 +270,12 @@ private HashMap> collectEnclosingTypes(RoundEnviron tpSlotDataSet.add(new TpSlotData(slotAnnotation, enclosingType, type)); } } + elements = new HashSet<>(roundEnv.getElementsAnnotatedWithAny(Set.of(HashNotImplemented.class))); + for (Element element : elements) { + TypeElement typeElement = (TypeElement) element; + enclosingTypes.computeIfAbsent(typeElement, key -> new HashSet<>()).// + add(TpSlotData.createHashNotImplemented(typeElement)); + } return enclosingTypes; } diff --git a/graalpython/com.oracle.graal.python.resources/src/com/oracle/graal/python/resources/PythonResource.java b/graalpython/com.oracle.graal.python.resources/src/com/oracle/graal/python/resources/PythonResource.java index a5cc28dcd9..5cbc89262a 100644 --- a/graalpython/com.oracle.graal.python.resources/src/com/oracle/graal/python/resources/PythonResource.java +++ b/graalpython/com.oracle.graal.python.resources/src/com/oracle/graal/python/resources/PythonResource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,11 +40,17 @@ */ package com.oracle.graal.python.resources; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.file.InvalidPathException; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.function.Predicate; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.InternalResource; @@ -69,6 +75,7 @@ public final class PythonResource implements InternalResource { private static final int VERSION_BASE = '!'; static { + // See static ctor of PythonLanguage try (InputStream is = PythonResource.class.getResourceAsStream("/graalpy_versions")) { PYTHON_MAJOR = is.read() - VERSION_BASE; PYTHON_MINOR = is.read() - VERSION_BASE; @@ -99,20 +106,106 @@ public final class PythonResource implements InternalResource { public void unpackFiles(Env env, Path targetDirectory) throws IOException { OS os = env.getOS(); Path osArch = Path.of(os.toString()).resolve(env.getCPUArchitecture().toString()); + ResourcesFilter filter = new ResourcesFilter(); if (os.equals(OS.WINDOWS)) { - env.unpackResourceFiles(BASE_PATH.resolve(LIBPYTHON_FILES), targetDirectory.resolve("Lib"), BASE_PATH.resolve(LIBPYTHON)); - env.unpackResourceFiles(BASE_PATH.resolve(LIBGRAALPY_FILES), targetDirectory.resolve("lib-graalpython"), BASE_PATH.resolve(LIBGRAALPY)); - env.unpackResourceFiles(BASE_PATH.resolve(INCLUDE_FILES), targetDirectory.resolve("Include"), BASE_PATH.resolve(INCLUDE)); + env.unpackResourceFiles(BASE_PATH.resolve(LIBPYTHON_FILES), targetDirectory.resolve("Lib"), BASE_PATH.resolve(LIBPYTHON), filter); + env.unpackResourceFiles(BASE_PATH.resolve(LIBGRAALPY_FILES), targetDirectory.resolve("lib-graalpython"), BASE_PATH.resolve(LIBGRAALPY), filter); + env.unpackResourceFiles(BASE_PATH.resolve(INCLUDE_FILES), targetDirectory.resolve("Include"), BASE_PATH.resolve(INCLUDE), filter); } else { String pythonMajMin = "python" + PYTHON_MAJOR + "." + PYTHON_MINOR; - env.unpackResourceFiles(BASE_PATH.resolve(LIBPYTHON_FILES), targetDirectory.resolve("lib").resolve(pythonMajMin), BASE_PATH.resolve(LIBPYTHON)); - env.unpackResourceFiles(BASE_PATH.resolve(LIBGRAALPY_FILES), targetDirectory.resolve("lib").resolve("graalpy" + GRAALVM_MAJOR + "." + GRAALVM_MINOR), BASE_PATH.resolve(LIBGRAALPY)); - env.unpackResourceFiles(BASE_PATH.resolve(INCLUDE_FILES), targetDirectory.resolve("include").resolve(pythonMajMin), BASE_PATH.resolve(INCLUDE)); + env.unpackResourceFiles(BASE_PATH.resolve(LIBPYTHON_FILES), targetDirectory.resolve("lib").resolve(pythonMajMin), BASE_PATH.resolve(LIBPYTHON), filter); + env.unpackResourceFiles(BASE_PATH.resolve(LIBGRAALPY_FILES), targetDirectory.resolve("lib").resolve("graalpy" + GRAALVM_MAJOR + "." + GRAALVM_MINOR), BASE_PATH.resolve(LIBGRAALPY), + filter); + env.unpackResourceFiles(BASE_PATH.resolve(INCLUDE_FILES), targetDirectory.resolve("include").resolve(pythonMajMin), BASE_PATH.resolve(INCLUDE), filter); } // ni files are in the same place on all platforms - env.unpackResourceFiles(BASE_PATH.resolve(NI_FILES), targetDirectory, BASE_PATH); + env.unpackResourceFiles(BASE_PATH.resolve(NI_FILES), targetDirectory, BASE_PATH, filter); // native files already have the correct structure - env.unpackResourceFiles(BASE_PATH.resolve(osArch).resolve(NATIVE_FILES), targetDirectory, BASE_PATH.resolve(osArch)); + env.unpackResourceFiles(BASE_PATH.resolve(osArch).resolve(NATIVE_FILES), targetDirectory, BASE_PATH.resolve(osArch), filter); + + if (filter.log) { + System.out.println("unpacked python resources:"); + System.out.println("include pattern: '" + filter.include + "'"); + System.out.println("exclude pattern: '" + filter.exclude + "'"); + listFiles("included files:", filter.included); + listFiles("excluded files:", filter.excluded); + } + } + + private static void listFiles(String header, List l) { + if (!l.isEmpty()) { + Collections.sort(l); + System.out.println(header); + for (String s : l) { + System.out.println("\t" + s); + } + } + } + + private static class ResourcesFilter implements Predicate { + + private final boolean log; + private final Pattern includePattern; + private final Pattern excludePattern; + private final String exclude; + private final String include; + private final List excluded; + private final List included; + private static final String INCLUDE_PROP = "org.graalvm.python.resources.include"; + private static final String EXCLUDE_PROP = "org.graalvm.python.resources.exclude"; + + private static final String LOG_PROP = "org.graalvm.python.resources.exclude"; + + private ResourcesFilter() { + include = getProperty(INCLUDE_PROP); + exclude = getProperty(EXCLUDE_PROP); + log = Boolean.parseBoolean(getProperty(LOG_PROP)); + includePattern = include != null ? compile(include, INCLUDE_PROP) : null; + excludePattern = exclude != null ? compile(exclude, EXCLUDE_PROP) : null; + included = log ? new ArrayList<>() : null; + excluded = log ? new ArrayList<>() : null; + } + + private static Pattern compile(String re, String property) { + try { + return Pattern.compile(re); + } catch (PatternSyntaxException pse) { + throw new IllegalArgumentException("could not compile regex pattern '" + re + "' provided by system property '" + property + "'", pse); + } + } + + @Override + public boolean test(Path path) { + String absolutePath = path.toAbsolutePath().toString(); + if (File.separator.equals("\\")) { + absolutePath = absolutePath.replaceAll("\\\\", "/"); + } + if ((includePattern != null && !includePattern.matcher(absolutePath).matches()) || + (excludePattern != null && excludePattern.matcher(absolutePath).matches())) { + if (log) { + excluded.add(absolutePath); + } + return false; + } else { + if (log) { + included.add(absolutePath); + } + return true; + } + } + + private static String getProperty(String prop) { + String s = System.getProperty(prop); + if (s != null) { + if (s.isEmpty()) { + s = null; + } else if (s.startsWith("\"") && s.endsWith("\"")) { + // native-gradle-plugin sends system properties wrapped in " + s = s.substring(1, s.length() - 1); + } + } + return s; + } } @Override diff --git a/graalpython/com.oracle.graal.python.shell/src/com/oracle/graal/python/shell/GraalPythonMain.java b/graalpython/com.oracle.graal.python.shell/src/com/oracle/graal/python/shell/GraalPythonMain.java index 476477c74d..81600f12e3 100644 --- a/graalpython/com.oracle.graal.python.shell/src/com/oracle/graal/python/shell/GraalPythonMain.java +++ b/graalpython/com.oracle.graal.python.shell/src/com/oracle/graal/python/shell/GraalPythonMain.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -43,11 +43,11 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; -import java.util.ListIterator; import java.util.Map; import java.util.Set; import java.util.UUID; import java.util.function.Function; +import java.util.function.Predicate; import org.graalvm.launcher.AbstractLanguageLauncher; import org.graalvm.nativeimage.ImageInfo; @@ -57,13 +57,11 @@ import org.graalvm.polyglot.Context.Builder; import org.graalvm.polyglot.Engine; import org.graalvm.polyglot.PolyglotException; -import org.graalvm.polyglot.PolyglotException.StackFrame; import org.graalvm.polyglot.Source; -import org.graalvm.polyglot.SourceSection; import org.graalvm.polyglot.Value; import org.graalvm.shadowed.org.jline.reader.UserInterruptException; -public class GraalPythonMain extends AbstractLanguageLauncher { +public final class GraalPythonMain extends AbstractLanguageLauncher { private static final boolean IS_WINDOWS = System.getProperty("os.name") != null && System.getProperty("os.name").toLowerCase().contains("windows"); @@ -180,6 +178,7 @@ protected List preprocessArguments(List givenArgs, Map argumentIterator = arguments.iterator(); argumentIterator.hasNext();) { String arg = argumentIterator.next(); origArgs.add(arg); @@ -279,6 +278,9 @@ protected List preprocessArguments(List givenArgs, Map preprocessArguments(List givenArgs, Map preprocessArguments(List givenArgs, Map preprocessArguments(List givenArgs, Map isExecutable, String envPath) { + private String calculateProgramFullPath(String program, Predicate isExecutable, String envPath) { Path programPath = Paths.get(program); // If this is an absolute path, we are already fine. if (programPath.isAbsolute()) { + if (IS_WINDOWS) { + String resolvedProgramNameWithExtension = getProgramNameWithExtension(isExecutable, program); + if (resolvedProgramNameWithExtension != null) { + return resolvedProgramNameWithExtension; + } + } return program; } @@ -549,26 +565,15 @@ private String calculateProgramFullPath(String program, Function i = path.indexOf(File.pathSeparatorChar, previous); int end = i == -1 ? path.length() : i; Path resolvedProgramName = Paths.get(path.substring(previous, end)).resolve(programPath); - if (isExecutable.apply(resolvedProgramName)) { + if (isExecutable.test(resolvedProgramName)) { return resolvedProgramName.toString(); } // On windows, the program name may be without the extension if (IS_WINDOWS) { - String pathExtEnvvar = getEnv("PATHEXT"); - if (pathExtEnvvar != null) { - // default extensions are defined - String resolvedStr = resolvedProgramName.toString(); - if (resolvedStr.length() <= 3 || resolvedStr.charAt(resolvedStr.length() - 4) != '.') { - // program has no file extension - String[] pathExts = pathExtEnvvar.toLowerCase().split(";"); - for (String pathExt : pathExts) { - resolvedProgramName = Path.of(resolvedStr + pathExt); - if (isExecutable.apply(resolvedProgramName)) { - return resolvedProgramName.toString(); - } - } - } + String resolvedProgramNameWithExtension = getProgramNameWithExtension(isExecutable, resolvedProgramName.toString()); + if (resolvedProgramNameWithExtension != null) { + return resolvedProgramNameWithExtension; } } @@ -594,6 +599,28 @@ private String calculateProgramFullPath(String program, Function return programPath.toAbsolutePath().toString(); } + private static String getProgramNameWithExtension(Predicate isExecutable, String programStr) { + if (isExecutable.test(Path.of(programStr))) { + return programStr; + } + if (programStr.length() <= 3 || programStr.charAt(programStr.length() - 4) != '.') { + // program has no file extension + Path programNameWithExtension = null; + String pathExtEnvvar = getEnv("PATHEXT"); + if (pathExtEnvvar != null) { + // default extensions are defined + String[] pathExts = pathExtEnvvar.toLowerCase().split(";"); + for (String pathExt : pathExts) { + programNameWithExtension = Path.of(programStr + pathExt); + if (isExecutable.test(programNameWithExtension)) { + return programNameWithExtension.toString(); + } + } + } + } + return null; + } + private String[] getExecutableList() { String launcherExecName = getLauncherExecName(); if (launcherExecName != null) { @@ -601,7 +628,7 @@ private String[] getExecutableList() { } // This should only be reached if this main is directly executed via Java. - if (!ImageInfo.inImageCode()) { + if (!isAOT()) { StringBuilder sb = new StringBuilder(); ArrayList exec_list = new ArrayList<>(); sb.append(System.getProperty("java.home")).append(File.separator).append("bin").append(File.separator).append("java"); @@ -723,15 +750,6 @@ protected void launch(Builder contextBuilder) { } } - if (isLLVMToolchainLauncher()) { - if (!hasContextOptionSetViaCommandLine("UseSystemToolchain")) { - contextBuilder.option("python.UseSystemToolchain", "false"); - } - if (!hasContextOptionSetViaCommandLine("NativeModules")) { - contextBuilder.option("python.NativeModules", "false"); - } - } - if (relaunchArgs != null) { Iterator it = origArgs.iterator(); while (it.hasNext()) { @@ -756,16 +774,12 @@ protected void launch(Builder contextBuilder) { contextBuilder.option("python.IntMaxStrDigits", Integer.toString(intMaxStrDigits)); } contextBuilder.option("python.DontWriteBytecodeFlag", Boolean.toString(dontWriteBytecode)); - if (verboseFlag) { - contextBuilder.option("log.python.level", "INFO"); - } contextBuilder.option("python.QuietFlag", Boolean.toString(quietFlag)); contextBuilder.option("python.NoUserSiteFlag", Boolean.toString(noUserSite)); contextBuilder.option("python.NoSiteFlag", Boolean.toString(noSite)); if (!noSite) { contextBuilder.option("python.ForceImportSite", "true"); } - contextBuilder.option("python.SetupLLVMLibraryPaths", "true"); contextBuilder.option("python.IgnoreEnvironmentFlag", Boolean.toString(ignoreEnv)); contextBuilder.option("python.UnbufferedIO", Boolean.toString(unbufferedIO)); @@ -820,10 +834,10 @@ protected void launch(Builder contextBuilder) { evalNonInteractive(context, consoleHandler); rc = 0; } catch (PolyglotException e) { - if (!e.isExit()) { - printPythonLikeStackTrace(e); - } else { + if (e.isExit()) { rc = e.getExitStatus(); + } else { + throw e; } } catch (NoSuchFileException e) { printFileNotFoundException(e); @@ -833,15 +847,40 @@ protected void launch(Builder contextBuilder) { inspectFlag = false; rc = readEvalPrint(context, consoleHandler); } + } catch (RuntimeException e) { + if (e.getMessage() != null && e.getMessage().contains("did not complete all polyglot threads")) { + // Python may end up with stuck threads and code would legitimately expect those to + // simply die with the process. In an embedding (or CPython subinterpreters) this + // is a problem, so Truffle throws an IllegalStateException when closing the + // context if that occurs. But here we have a launcher and usually we do not care + // about this problem during exit. For an example and some discussion, see + // https://discuss.python.org/t/getting-rid-of-daemon-threads/68836/14 where NJS + // brings up getaddrinfo which may just block in native for an arbitrary amount of + // time and prevent us from shutting down the thread. + if (!verboseFlag) { + tryToResetConsoleHandler(consoleHandler); + System.exit(rc); + } + } else { + throw e; + } } catch (IOException e) { rc = 1; e.printStackTrace(); } finally { - consoleHandler.setContext(null); + tryToResetConsoleHandler(consoleHandler); } System.exit(rc); } + private static void tryToResetConsoleHandler(ConsoleHandler consoleHandler) { + try { + consoleHandler.setContext(null); + } catch (Throwable e) { + // pass + } + } + private static boolean getBoolEnv(String var) { return getEnv(var) != null; } @@ -910,54 +949,70 @@ private void findAndApplyVenvCfg(Builder contextBuilder, String executable) { continue; } String name = parts[0].trim(); - if (name.equals("home")) { - try { - Path homeProperty = Paths.get(parts[1].trim()); - Path graalpyHome = homeProperty; - /* - * (tfel): According to PEP 405, the home key is the directory of the Python - * executable from which this virtual environment was created, that is, it - * usually ends with "/bin" on a Unix system. On Windows, the base Python - * should be in the top-level directory or under "\Scripts". To support - * running from Maven artifacts where we don't have a working executable, we - * patched our shipped venv module to set the home path without a "/bin" or - * "\\Scripts" suffix, so we explicitly check for those two subfolder cases - * and otherwise assume the home key is directly pointing to the Python - * home. - */ - if (graalpyHome.endsWith("bin") || graalpyHome.endsWith("Scripts")) { - graalpyHome = graalpyHome.getParent(); - } - contextBuilder.option("python.PythonHome", graalpyHome.toString()); - /* - * First try to resolve symlinked executables, since that may be more - * accurate than assuming the executable in 'home'. - */ - Path baseExecutable = null; + switch (name) { + case "home": try { - Path realPath = executablePath.toRealPath(); - if (!realPath.equals(executablePath.toAbsolutePath())) { - baseExecutable = realPath; + Path homeProperty = Paths.get(parts[1].trim()); + Path graalpyHome = homeProperty; + /* + * (tfel): According to PEP 405, the home key is the directory of the + * Python executable from which this virtual environment was created, + * that is, it usually ends with "/bin" on a Unix system. On Windows, + * the base Python should be in the top-level directory or under + * "\Scripts". To support running from Maven artifacts where we don't + * have a working executable, we patched our shipped venv module to set + * the home path without a "/bin" or "\\Scripts" suffix, so we + * explicitly check for those two subfolder cases and otherwise assume + * the home key is directly pointing to the Python home. + */ + if (graalpyHome.endsWith("bin") || graalpyHome.endsWith("Scripts")) { + graalpyHome = graalpyHome.getParent(); } - } catch (IOException ex) { - // Ignore - } - if (baseExecutable == null) { - baseExecutable = homeProperty.resolve(executablePath.getFileName()); - } - if (Files.exists(baseExecutable)) { - contextBuilder.option("python.BaseExecutable", baseExecutable.toString()); + contextBuilder.option("python.PythonHome", graalpyHome.toString()); /* - * This is needed to support the legacy GraalVM layout where the - * executable is a symlink into the 'languages' directory. + * First try to resolve symlinked executables, since that may be more + * accurate than assuming the executable in 'home'. */ - contextBuilder.option("python.PythonHome", baseExecutable.getParent().getParent().toString()); + Path baseExecutable = null; + try { + Path realPath = executablePath.toRealPath(); + if (!realPath.equals(executablePath.toAbsolutePath())) { + baseExecutable = realPath; + } + } catch (IOException ex) { + // Ignore + } + if (baseExecutable == null) { + baseExecutable = homeProperty.resolve(executablePath.getFileName()); + } + if (Files.exists(baseExecutable)) { + contextBuilder.option("python.BaseExecutable", baseExecutable.toString()); + /* + * This is needed to support the legacy GraalVM layout where the + * executable is a symlink into the 'languages' directory. + */ + contextBuilder.option("python.PythonHome", baseExecutable.getParent().getParent().toString()); + } + } catch (NullPointerException | InvalidPathException ex) { + // NullPointerException covers the possible null result of getParent() + warn("Could not set PYTHONHOME according to the pyvenv.cfg file."); } - } catch (NullPointerException | InvalidPathException ex) { - // NullPointerException covers the possible null result of getParent() - warn("Could not set PYTHONHOME according to the pyvenv.cfg file."); - } - break; + break; + case "venvlauncher_command": + if (!hasContextOptionSetViaCommandLine("VenvlauncherCommand")) { + contextBuilder.option("python.VenvlauncherCommand", parts[1].trim()); + } + break; + case "base-prefix": + if (!hasContextOptionSetViaCommandLine("SysBasePrefix")) { + contextBuilder.option("python.SysBasePrefix", parts[1].trim()); + } + break; + case "base-executable": + if (!hasContextOptionSetViaCommandLine("BaseExecutable")) { + contextBuilder.option("python.BaseExecutable", parts[1].trim()); + } + break; } } } catch (IOException ex) { @@ -1007,41 +1062,6 @@ private static void printFileNotFoundException(NoSuchFileException e) { System.err.println(GraalPythonMain.class.getCanonicalName() + ": can't open file '" + e.getFile() + "': " + reason); } - private static void printPythonLikeStackTrace(PolyglotException e) { - // If we're running through the launcher and an exception escapes to here, - // we didn't go through the Python code to print it. That may be because - // it's an exception from another language. In this case, we still would - // like to print it like a Python exception. - ArrayList stack = new ArrayList<>(); - for (StackFrame frame : e.getPolyglotStackTrace()) { - if (frame.isGuestFrame()) { - StringBuilder sb = new StringBuilder(); - SourceSection sourceSection = frame.getSourceLocation(); - String rootName = frame.getRootName(); - if (sourceSection != null) { - sb.append(" "); - String path = sourceSection.getSource().getPath(); - if (path != null) { - sb.append("File "); - } - sb.append('"'); - sb.append(sourceSection.getSource().getName()); - sb.append("\", line "); - sb.append(sourceSection.getStartLine()); - sb.append(", in "); - sb.append(rootName); - stack.add(sb.toString()); - } - } - } - System.err.println("Traceback (most recent call last):"); - ListIterator listIterator = stack.listIterator(stack.size()); - while (listIterator.hasPrevious()) { - System.err.println(listIterator.previous()); - } - System.err.println(e.getMessage()); - } - private void evalNonInteractive(Context context, ConsoleHandler consoleHandler) throws IOException { // We need to setup the terminal even when not running the REPL because code may request // input from the terminal. @@ -1064,9 +1084,6 @@ protected String getLanguageId() { @Override protected void printHelp(OptionCategory maxCategory) { - if (isLLVMToolchainLauncher()) { - System.out.println("GraalPy launcher to use LLVM toolchain and Sulong execution of native extensions.\n"); - } System.out.println("usage: python [option] ... (-c cmd | file) [arg] ...\n" + "Options and arguments (and corresponding environment variables):\n" + "-B : this disables writing .py[co] files on import\n" + @@ -1132,14 +1149,7 @@ protected void printHelp(OptionCategory maxCategory) { " All following arguments are passed to the compiler.\n" + "-LD : run the linker used for generating GraalPython C extensions.\n" + " All following arguments are passed to the linker.\n" + - "\nEnvironment variables specific to the Graal Python launcher:\n" + - "SULONG_LIBRARY_PATH: Specifies the library path for Sulong.\n" + - " This is required when starting subprocesses of python.\n" : "")); - } - - private boolean isLLVMToolchainLauncher() { - String exeName = getResolvedExecutableName(); - return exeName != null && exeName.endsWith("-lt"); + "\nEnvironment variables specific to the Graal Python launcher:\n" : "")); } @Override @@ -1253,17 +1263,15 @@ private int readEvalPrint(Context context, ConsoleHandler consoleHandler) { if (e.isExit()) { // usually from quit throw new ExitException(e.getExitStatus()); - } else if (e.isHostException()) { - // we continue the repl even though the system may be broken - lastStatus = 1; - System.out.println(e.getMessage()); } else if (e.isInternalError()) { - System.err.println("An internal error occurred:"); - printPythonLikeStackTrace(e); - - // we continue the repl even though the system may be broken + /* + * The stacktrace should have been printed above by + * TopLevelExceptionHandler. We continue the repl even though the + * system may be broken + */ + System.err.println("An internal error occurred, continue at your own risk"); lastStatus = 1; - } else if (e.isGuestException()) { + } else { // drop through to continue REPL and remember last eval was an error lastStatus = 1; } @@ -1371,12 +1379,11 @@ private void subExec(List args, List subProcessDefs) { } protected String getResolvedExecutableName() { - // Note that with thin launchers, both graalpy and graalpy-managed are actual executables - // that load and start GraalPy from a shared library + // Note that with thin launchers, graalpy is an actual executable + // that loads and starts GraalPy from a shared library if (ImageInfo.inImageRuntimeCode()) { // This is the fastest, most straightforward way to get the name of the actual - // executable, i.e., with symlinks resolved all the way down to either graalpy or - // graalpy-managed. + // executable, i.e., with symlinks resolved all the way down to graalpy String executableName = ProcessProperties.getExecutableName(); if (executableName != null) { return executableName; diff --git a/graalpython/com.oracle.graal.python.tck/src/com/oracle/graal/python/tck/PythonProvider.java b/graalpython/com.oracle.graal.python.tck/src/com/oracle/graal/python/tck/PythonProvider.java index 5b3588fdb7..0fdeb22170 100644 --- a/graalpython/com.oracle.graal.python.tck/src/com/oracle/graal/python/tck/PythonProvider.java +++ b/graalpython/com.oracle.graal.python.tck/src/com/oracle/graal/python/tck/PythonProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -78,6 +78,7 @@ import org.graalvm.polyglot.tck.ResultVerifier; import org.graalvm.polyglot.tck.Snippet; import org.graalvm.polyglot.tck.TypeDescriptor; +import org.junit.Assert; public class PythonProvider implements LanguageProvider { @@ -226,28 +227,37 @@ public Collection createValueConstructors(Context context) { public Collection createExpressions(Context context) { List snippets = new ArrayList<>(); + TypeDescriptor numeric = union(BOOLEAN, NUMBER); + TypeDescriptor numericArray = array(numeric); + // @formatter:off - addExpressionSnippet(context, snippets, "+", "lambda x, y: x + y", NUMBER, new NonPrimitiveNumberParameterThrows(AddVerifier.INSTANCE), union(BOOLEAN, NUMBER), union(BOOLEAN, NUMBER)); - addExpressionSnippet(context, snippets, "+", "lambda x, y: x + y", union(STRING, array(ANY)), AddVerifier.INSTANCE, union(BOOLEAN, NUMBER), union(STRING, array(ANY))); - addExpressionSnippet(context, snippets, "+", "lambda x, y: x + y", union(STRING, array(ANY)), AddVerifier.INSTANCE, union(STRING, array(ANY)), union(BOOLEAN, NUMBER)); + addExpressionSnippet(context, snippets, "+", "lambda x, y: x + y", NUMBER, new NonPrimitiveNumberParameterThrows(AddVerifier.INSTANCE), numeric, numeric); + addExpressionSnippet(context, snippets, "+", "lambda x, y: x + y", union(STRING, array(ANY)), AddVerifier.INSTANCE, numeric, union(STRING, array(ANY))); + addExpressionSnippet(context, snippets, "+", "lambda x, y: x + y", union(STRING, array(ANY)), AddVerifier.INSTANCE, union(STRING, array(ANY)), numeric); addExpressionSnippet(context, snippets, "+", "lambda x, y: x + y", union(STRING, array(ANY)), AddVerifier.INSTANCE, union(STRING, array(ANY)), union(STRING, array(ANY))); - addExpressionSnippet(context, snippets, "*", "lambda x, y: x * y", NUMBER, new NonPrimitiveNumberParameterThrows(MulVerifier.INSTANCE), union(BOOLEAN, NUMBER), union(BOOLEAN, NUMBER)); - addExpressionSnippet(context, snippets, "*", "lambda x, y: x * y", union(STRING, array(ANY)), MulVerifier.INSTANCE, union(BOOLEAN, NUMBER), union(STRING, array(ANY))); - addExpressionSnippet(context, snippets, "*", "lambda x, y: x * y", union(STRING, array(ANY)), MulVerifier.INSTANCE, union(STRING, array(ANY)), union(BOOLEAN, NUMBER)); + + addExpressionSnippet(context, snippets, "*", "lambda x, y: x * y", NUMBER, new NonPrimitiveNumberParameterThrows(MulVerifier.INSTANCE), numeric, numeric); + addExpressionSnippet(context, snippets, "*", "lambda x, y: x * y", union(STRING, array(ANY)), MulVerifier.INSTANCE, numeric, union(STRING, array(ANY))); + addExpressionSnippet(context, snippets, "*", "lambda x, y: x * y", union(STRING, array(ANY)), MulVerifier.INSTANCE, union(STRING, array(ANY)), numeric); addExpressionSnippet(context, snippets, "*", "lambda x, y: x * y", union(STRING, array(ANY)), MulVerifier.INSTANCE, union(STRING, array(ANY)), union(STRING, array(ANY))); - addExpressionSnippet(context, snippets, "-", "lambda x, y: x - y", NUMBER, NonPrimitiveNumberParameterThrows.INSTANCE, union(BOOLEAN, NUMBER), union(BOOLEAN, NUMBER)); + addExpressionSnippet(context, snippets, "-", "lambda x, y: x - y", NUMBER, NonPrimitiveNumberParameterThrows.INSTANCE, numeric, numeric); - addExpressionSnippet(context, snippets, "/", "lambda x, y: x / y", NUMBER, new NonPrimitiveNumberParameterThrows(PDivByZeroVerifier.INSTANCE), union(BOOLEAN, NUMBER), union(BOOLEAN, NUMBER)); + addExpressionSnippet(context, snippets, "/", "lambda x, y: x / y", NUMBER, new NonPrimitiveNumberParameterThrows(PDivByZeroVerifier.INSTANCE), numeric, numeric); addExpressionSnippet(context, snippets, "list-from-foreign", "lambda x: list(x)", array(ANY), union(STRING, iterable(ANY), iterator(ANY), array(ANY), hash(ANY, ANY))); addExpressionSnippet(context, snippets, "==", "lambda x, y: x == y", BOOLEAN, ANY, ANY); addExpressionSnippet(context, snippets, "!=", "lambda x, y: x != y", BOOLEAN, ANY, ANY); - addExpressionSnippet(context, snippets, ">", "lambda x, y: x > y", BOOLEAN, NonPrimitiveNumberParameterThrows.INSTANCE, union(BOOLEAN, NUMBER), union(BOOLEAN, NUMBER)); - addExpressionSnippet(context, snippets, ">=", "lambda x, y: x >= y", BOOLEAN, NonPrimitiveNumberParameterThrows.INSTANCE, union(BOOLEAN, NUMBER), union(BOOLEAN, NUMBER)); - addExpressionSnippet(context, snippets, "<", "lambda x, y: x < y", BOOLEAN, NonPrimitiveNumberParameterThrows.INSTANCE, union(BOOLEAN, NUMBER), union(BOOLEAN, NUMBER)); - addExpressionSnippet(context, snippets, "<=", "lambda x, y: x <= y", BOOLEAN, NonPrimitiveNumberParameterThrows.INSTANCE, union(BOOLEAN, NUMBER), union(BOOLEAN, NUMBER)); + + addExpressionSnippet(context, snippets, ">", "lambda x, y: x > y", BOOLEAN, NonPrimitiveNumberParameterThrows.INSTANCE, numeric, numeric); + addExpressionSnippet(context, snippets, ">", "lambda x, y: x > y", BOOLEAN, ExpectTypeErrorForDifferentPythonSequenceTypes.INSTANCE, numericArray, numericArray); + addExpressionSnippet(context, snippets, ">=", "lambda x, y: x >= y", BOOLEAN, NonPrimitiveNumberParameterThrows.INSTANCE, numeric, numeric); + addExpressionSnippet(context, snippets, ">=", "lambda x, y: x >= y", BOOLEAN, ExpectTypeErrorForDifferentPythonSequenceTypes.INSTANCE, numericArray, numericArray); + addExpressionSnippet(context, snippets, "<", "lambda x, y: x < y", BOOLEAN, NonPrimitiveNumberParameterThrows.INSTANCE, numeric, numeric); + addExpressionSnippet(context, snippets, "<", "lambda x, y: x < y", BOOLEAN, ExpectTypeErrorForDifferentPythonSequenceTypes.INSTANCE, numericArray, numericArray); + addExpressionSnippet(context, snippets, "<=", "lambda x, y: x <= y", BOOLEAN, NonPrimitiveNumberParameterThrows.INSTANCE, numeric, numeric); + addExpressionSnippet(context, snippets, "<=", "lambda x, y: x <= y", BOOLEAN, ExpectTypeErrorForDifferentPythonSequenceTypes.INSTANCE, numericArray, numericArray); addExpressionSnippet(context, snippets, "isinstance", "lambda x, y: isinstance(x, y)", BOOLEAN, ANY, META_OBJECT); addExpressionSnippet(context, snippets, "issubclass", "lambda x, y: issubclass(x, y)", BOOLEAN, META_OBJECT, META_OBJECT); @@ -360,6 +370,35 @@ private static Source createSource(String resourceName) throws IOException { private abstract static class PResultVerifier implements ResultVerifier { } + private static class ExpectTypeErrorForDifferentPythonSequenceTypes extends PResultVerifier { + + public void accept(SnippetRun snippetRun) throws PolyglotException { + List parameters = snippetRun.getParameters(); + assert parameters.size() == 2; + + Value a = parameters.get(0); + Value b = parameters.get(1); + + // If both parameter values are Python sequences, then ignore if they have different + // types. E.g. ignore '(1,2) < [3,4]'. + if (a.hasArrayElements() && b.hasArrayElements() && isPythonObject(a) && isPythonObject(b) && !a.getMetaObject().equals(b.getMetaObject())) { + // Expect TypeError + var exception = snippetRun.getException(); + assert exception != null; + Assert.assertEquals("TypeError", exception.getGuestObject().getMetaObject().getMetaQualifiedName()); + } else { + ResultVerifier.getDefaultResultVerifier().accept(snippetRun); + } + } + + private static boolean isPythonObject(Value value) { + var metaObject = value.getMetaObject(); + return metaObject.hasMember("__mro__"); + } + + private static final ExpectTypeErrorForDifferentPythonSequenceTypes INSTANCE = new ExpectTypeErrorForDifferentPythonSequenceTypes(); + } + /** * Only accepts exact matches of types. */ @@ -378,16 +417,16 @@ public void accept(SnippetRun snippetRun) throws PolyglotException { if (par0.getMetaObject() == par1.getMetaObject()) { assert snippetRun.getException() == null; TypeDescriptor resultType = TypeDescriptor.forValue(snippetRun.getResult()); - assert array(ANY).isAssignable(resultType); + assert array(ANY).isAssignable(resultType) : resultType; } } else if (par0.isString() && par1.isString()) { assert snippetRun.getException() == null; TypeDescriptor resultType = TypeDescriptor.forValue(snippetRun.getResult()); - assert STRING.isAssignable(resultType); + assert STRING.isAssignable(resultType) : resultType; } else if ((par0.isNumber() || par0.isBoolean()) && (par1.isNumber() || par1.isBoolean())) { assert snippetRun.getException() == null; TypeDescriptor resultType = TypeDescriptor.forValue(snippetRun.getResult()); - assert NUMBER.isAssignable(resultType); + assert NUMBER.isAssignable(resultType) : resultType; } else { assert snippetRun.getException() != null; TypeDescriptor argType = union(STRING, BOOLEAN, NUMBER, array(ANY)); @@ -426,17 +465,17 @@ public void accept(SnippetRun snippetRun) throws PolyglotException { // string * number => string assert snippetRun.getException() == null; TypeDescriptor resultType = TypeDescriptor.forValue(snippetRun.getResult()); - assert STRING.isAssignable(resultType); + assert STRING.isAssignable(resultType) : resultType; } else if ((par0.isNumber() || par0.isBoolean()) && (par1.isNumber() || par1.isBoolean())) { - // number * number has greater precendence than array * number + // number * number has greater precedence than array * number assert snippetRun.getException() == null; TypeDescriptor resultType = TypeDescriptor.forValue(snippetRun.getResult()); - assert NUMBER.isAssignable(resultType) : resultType.toString(); + assert NUMBER.isAssignable(resultType) : resultType; } else if (isArrayMul(par0, par1) || isArrayMul(par1, par0)) { // array * number => array assert snippetRun.getException() == null; TypeDescriptor resultType = TypeDescriptor.forValue(snippetRun.getResult()); - assert array(ANY).isAssignable(resultType); + assert array(ANY).isAssignable(resultType) : resultType; } else { assert snippetRun.getException() != null; TypeDescriptor argType = union(STRING, BOOLEAN, NUMBER, array(ANY)); @@ -461,34 +500,34 @@ public void accept(SnippetRun snippetRun) throws PolyglotException { List parameters = snippetRun.getParameters(); assert parameters.size() == 2; - Value par0 = parameters.get(0); - Value par1 = parameters.get(1); + Value self = parameters.get(0); + Value index = parameters.get(1); long len = -1; - if (par0.hasArrayElements()) { - len = par0.getArraySize(); - } else if (par0.isString()) { - len = par0.asString().length(); + if (self.isString()) { + len = self.asString().length(); + } else if (self.hasArrayElements()) { + len = self.getArraySize(); } if (len >= 0) { int idx; - if (par1.isBoolean()) { - idx = par1.asBoolean() ? 1 : 0; - } else if (par1.isNumber() && par1.fitsInInt()) { - idx = par1.asInt(); + if (index.isBoolean()) { + idx = index.asBoolean() ? 1 : 0; + } else if (index.isNumber() && index.fitsInInt()) { + idx = index.asInt(); } else { - assert snippetRun.getException() != null; + assert snippetRun.getException() != null : snippetRun.getResult(); return; } - if ((idx >= 0 && len > idx) || (idx < 0 && idx + len >= 0 && len > idx + len)) { - assert snippetRun.getException() == null : snippetRun.getException().toString(); + if ((idx >= 0 && idx < len) || (idx < 0 && idx + len >= 0 && idx + len < len)) { + assert snippetRun.getException() == null : snippetRun.getException(); } else { - assert snippetRun.getException() != null; + assert snippetRun.getException() != null : snippetRun.getResult(); } - } else if (par0.hasHashEntries()) { - if (par1.getMetaObject() != null) { - String metaName = par1.getMetaObject().getMetaQualifiedName(); + } else if (self.hasHashEntries()) { + if (index.getMetaObject() != null) { + String metaName = index.getMetaObject().getMetaQualifiedName(); for (String s : UNHASHABLE_TYPES) { if (metaName.equals(s)) { // those don't work, but that's expected @@ -497,11 +536,11 @@ public void accept(SnippetRun snippetRun) throws PolyglotException { } } } - Value v = par0.getHashValueOrDefault(par1, PythonProvider.class.getName()); + Value v = self.getHashValueOrDefault(index, PythonProvider.class.getName()); if (v.isString() && v.asString().equals(PythonProvider.class.getName())) { - assert snippetRun.getException() != null; + assert snippetRun.getException() != null : snippetRun.getResult(); } else { - assert snippetRun.getException() == null : snippetRun.getException().toString(); + assert snippetRun.getException() == null : snippetRun.getException(); } } else { // argument type error, rethrow diff --git a/graalpython/com.oracle.graal.python.test.integration/pom.xml b/graalpython/com.oracle.graal.python.test.integration/pom.xml index c3a98c4f02..2fbed1cd15 100644 --- a/graalpython/com.oracle.graal.python.test.integration/pom.xml +++ b/graalpython/com.oracle.graal.python.test.integration/pom.xml @@ -64,7 +64,7 @@ Additionally, one can change the polyglot artifacts version with 17 17 UTF-8 - 24.2.0 + 25.0.0 @@ -165,23 +165,15 @@ Additionally, one can change the polyglot artifacts version with runtime pom - - - org.graalvm.polyglot - llvm-community - ${com.oracle.graal.python.test.polyglot.version} - runtime - pom - org.graalvm.python python-embedding ${com.oracle.graal.python.test.polyglot.version} - + junit junit - 4.12 + 4.13.2 diff --git a/graalpython/lib-graalpython/modules/hpy.egg-info/dependency_links.txt b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/SomeFile similarity index 100% rename from graalpython/lib-graalpython/modules/hpy.egg-info/dependency_links.txt rename to graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/SomeFile diff --git a/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/dir1/extractme b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/dir1/extractme new file mode 100644 index 0000000000..e69de29bb2 diff --git a/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/dir1/file2 b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/dir1/file2 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/extractme b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/extractme new file mode 100644 index 0000000000..1294840905 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/extractme @@ -0,0 +1,2 @@ +text1 +text2 diff --git a/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/file1 b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/file1 new file mode 100644 index 0000000000..1294840905 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/file1 @@ -0,0 +1,2 @@ +text1 +text2 diff --git a/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/fileslist.txt b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/fileslist.txt new file mode 100644 index 0000000000..d0f772d97a --- /dev/null +++ b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/fileslist.txt @@ -0,0 +1,24 @@ +/GRAALPY-VFS/com.oracle.graal.python.test/integration/ +/GRAALPY-VFS/com.oracle.graal.python.test/integration/dir1/ +/GRAALPY-VFS/com.oracle.graal.python.test/integration/dir1/extractme +/GRAALPY-VFS/com.oracle.graal.python.test/integration/dir1/file2 +/GRAALPY-VFS/com.oracle.graal.python.test/integration/emptydir/ +/GRAALPY-VFS/com.oracle.graal.python.test/integration/file1 +/GRAALPY-VFS/com.oracle.graal.python.test/integration/extractme +/GRAALPY-VFS/com.oracle.graal.python.test/integration/fileslist.txt +/GRAALPY-VFS/com.oracle.graal.python.test/integration/SomeFile +/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/ +/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg/ +/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg/file.tso +/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/ +/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/file1.tso +/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/file2.tso +/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/dir/ +/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/dir/file1.tso +/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/dir/file2.tso +/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/dir/nofilterfile +/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/dir/dir/ +/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/dir/dir/file1.tso +/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/dir/dir/file2.tso +/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg-nolibs/ +/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg-nolibs/file.tso diff --git a/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg-nolibs/file.tso b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg-nolibs/file.tso new file mode 100644 index 0000000000..e69de29bb2 diff --git a/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/dir/dir/file1.tso b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/dir/dir/file1.tso new file mode 100644 index 0000000000..e69de29bb2 diff --git a/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/dir/dir/file2.tso b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/dir/dir/file2.tso new file mode 100644 index 0000000000..e69de29bb2 diff --git a/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/dir/file1.tso b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/dir/file1.tso new file mode 100644 index 0000000000..e69de29bb2 diff --git a/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/dir/file2.tso b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/dir/file2.tso new file mode 100644 index 0000000000..e69de29bb2 diff --git a/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/dir/nofilterfile b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/dir/nofilterfile new file mode 100644 index 0000000000..e69de29bb2 diff --git a/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/file1.tso b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/file1.tso new file mode 100644 index 0000000000..e69de29bb2 diff --git a/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/file2.tso b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg.libs/file2.tso new file mode 100644 index 0000000000..e69de29bb2 diff --git a/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg/file.tso b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/com.oracle.graal.python.test/integration/site-packages/testpkg/file.tso new file mode 100644 index 0000000000..e69de29bb2 diff --git a/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/foo/fileslist.txt b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/foo/fileslist.txt new file mode 100644 index 0000000000..cc28d6d16a --- /dev/null +++ b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/foo/fileslist.txt @@ -0,0 +1,3 @@ +/GRAALPY-VFS/foo/ +/GRAALPY-VFS/foo/otherdir/ +/GRAALPY-VFS/foo/otherdir/hello.txt diff --git a/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/foo/otherdir/hello.txt b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/foo/otherdir/hello.txt new file mode 100644 index 0000000000..04fea06420 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test.integration/src/GRAALPY-VFS/foo/otherdir/hello.txt @@ -0,0 +1 @@ +world \ No newline at end of file diff --git a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/PythonTests.java b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/PythonTests.java index 6918914dff..d33806d8c6 100644 --- a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/PythonTests.java +++ b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/PythonTests.java @@ -28,6 +28,7 @@ import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.io.ByteArrayOutputStream; import java.io.File; @@ -38,6 +39,7 @@ import java.io.PrintStream; import java.util.Collections; import java.util.Map; +import java.util.function.Consumer; import org.graalvm.polyglot.Context; import org.graalvm.polyglot.Engine; @@ -134,6 +136,13 @@ public static void assertPrints(String expected, Source code) { assertEquals(expected.replaceAll(" at 0x[0-9a-f]*>", " at 0xabcd>"), result.replaceAll(" at 0x[0-9a-f]*>", " at 0xabcd>")); } + public static void assertPrintsToStdErr(String expected, String code) { + final ByteArrayOutputStream byteArray = new ByteArrayOutputStream(); + PythonTests.runScript(new String[0], code, System.out, byteArray); + String result = byteArray.toString().replaceAll("\r\n", "\n"); + assertEquals(expected.replaceAll(" at 0x[0-9a-f]*>", " at 0xabcd>"), result.replaceAll(" at 0x[0-9a-f]*>", " at 0xabcd>")); + } + public static Value eval(String code) { final ByteArrayOutputStream byteArray = new ByteArrayOutputStream(); final PrintStream printStream = new PrintStream(byteArray); @@ -218,16 +227,24 @@ public static Value runScript(Map options, String[] args, String } public static void runThrowableScript(String[] args, String source, OutputStream out, OutputStream err) { - try { - enterContext(args); - context.eval(createSource(source)); - } catch (PolyglotException t) { + runThrowableScript(args, source, out, err, e -> { try { Value printExc = context.eval(PRINT_EXC_TO_STDERR); - printExc.execute(t.getGuestObject()); + printExc.execute(e.getGuestObject()); } catch (Throwable ex) { throw new RuntimeException("Error while printing the PolyglotException message to stderr.", ex); } + }); + } + + public static void runThrowableScript(String[] args, String source, OutputStream out, OutputStream err, + Consumer exceptionHandler) { + try { + enterContext(args); + context.eval(createSource(source)); + fail("The eval() should throw"); + } catch (PolyglotException t) { + exceptionHandler.accept(t); } finally { flush(out, err); closeContext(); diff --git a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/Utils.java b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/Utils.java index f87f4ef3a1..e47f5fa149 100644 --- a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/Utils.java +++ b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/Utils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,8 +40,29 @@ */ package com.oracle.graal.python.test.integration; +import java.lang.management.ManagementFactory; +import java.lang.management.ThreadInfo; +import java.lang.management.ThreadMXBean; import java.util.Locale; public class Utils { public static final boolean IS_WINDOWS = System.getProperty("os.name").toLowerCase(Locale.ROOT).contains("windows"); + + public static String getThreadDump() { + ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); + ThreadInfo[] threads = threadMXBean.getThreadInfo(threadMXBean.getAllThreadIds(), 100); + final String line = "=====================================\n"; + StringBuilder sb = new StringBuilder(line); + for (ThreadInfo thread : threads) { + if (thread != null) { + sb.append("-------\n"); + sb.append(thread.getThreadName()).append('\n'); + sb.append("Thread state:").append(thread.getThreadState()).append('\n'); + for (StackTraceElement element : thread.getStackTrace()) { + sb.append(" ").append(element).append('\n'); + } + } + } + return sb.append(line).toString(); + } } diff --git a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/advanced/MultiContextTest.java b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/advanced/MultiContextTest.java index 43bafe8f65..83b09a06c0 100644 --- a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/advanced/MultiContextTest.java +++ b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/advanced/MultiContextTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -57,22 +57,6 @@ public void testSharingWithMemoryview() { } } - @Test - public void testSharingWithCpythonSre() { - // With the default value of NativeModules=true, this test is going to use the NFI C API - // backend for the first context, but then it is going to use the Sulong backend for - // consecutive contexts (as long as this is the only test that executes native code, - // which it seems to be). This is why we need "sulong:SULONG_NATIVE" among the - // dependencies for GRAALPYTHON_UNIT_TESTS distribution, and - // org.graalvm.polyglot:llvm-community dependency in the pom.xml - Engine engine = Engine.newBuilder().build(); - for (int i = 0; i < 10; i++) { - try (Context context = newContext(engine)) { - context.eval("python", "import _cpython_sre\nassert _cpython_sre.ascii_tolower(88) == 120\n"); - } - } - } - @Test public void testTryCatch() { Engine engine = Engine.newBuilder().build(); diff --git a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/advanced/NativeExtTest.java b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/advanced/NativeExtTest.java new file mode 100644 index 0000000000..53df2d3ed9 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/advanced/NativeExtTest.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.test.integration.advanced; + +import java.util.concurrent.CountDownLatch; + +import org.graalvm.polyglot.Context; +import org.graalvm.polyglot.Engine; +import org.graalvm.polyglot.PolyglotException; +import org.junit.Assert; +import org.junit.Assume; +import org.junit.BeforeClass; +import org.junit.Test; + +/** + * This should be the only test using native extensions. We must test everything in one long test, + * because we cannot create multiple contexts that would load native extensions. + */ +public class NativeExtTest { + @BeforeClass + public static void setUpClass() { + Assume.assumeFalse(System.getProperty("os.name").toLowerCase().contains("mac")); + } + + @Test + public void testSharingErrorWithCpythonSre() throws InterruptedException { + // The first context is the one that will use native extensions + Engine engine = Engine.newBuilder().build(); + Context cextContext = newContext(engine).option("python.IsolateNativeModules", "true").build(); + try { + cextContext.eval("python", "import _cpython_sre\nassert _cpython_sre.ascii_tolower(88) == 120\n"); + + // Check that second context that tries to load native extension fails without + // IsolateNativeModules + try (Context secondCtx = newContext(engine).build()) { + try { + secondCtx.eval("python", "import _cpython_sre\nassert _cpython_sre.ascii_tolower(88) == 120\n"); + } catch (PolyglotException ex) { + Assert.assertTrue(ex.getMessage(), ex.getMessage().contains("Option python.IsolateNativeModules is set to 'false' and a second GraalPy context attempted")); + } + } + + // To test cancellation we are going to spawn some Python threads... + ShutdownTest.asyncStartPythonThreadsThatSleep(cextContext); + + // A java thread that attaches to GraalPy and finishes before the cancellation + CountDownLatch latch = new CountDownLatch(1); + new Thread(() -> { + cextContext.eval("python", "import _cpython_sre\nassert _cpython_sre.ascii_tolower(88) == 120\n"); + latch.countDown(); + }).start(); + latch.await(); + + // A java thread that attaches to GraalPy and sleeps forever in Java + CountDownLatch latch2 = new CountDownLatch(1); + new Thread(() -> { + cextContext.eval("python", "import _cpython_sre\nassert _cpython_sre.ascii_tolower(88) == 120\n"); + latch2.countDown(); + try { + Thread.sleep(100000000); + } catch (InterruptedException e) { + // expected + } + }).start(); + latch2.await(); + + } finally { + cextContext.close(true); + } + } + + private static Context.Builder newContext(Engine engine) { + return Context.newBuilder().allowExperimentalOptions(true).allowAllAccess(true).engine(engine); + } +} diff --git a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/advanced/ShutdownTest.java b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/advanced/ShutdownTest.java new file mode 100644 index 0000000000..e687192b92 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/advanced/ShutdownTest.java @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.test.integration.advanced; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +import org.graalvm.polyglot.Context; +import org.graalvm.polyglot.PolyglotException; +import org.junit.Assert; +import org.junit.Assume; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.oracle.graal.python.test.integration.PythonTests; + +// See also NativeExtTest +public class ShutdownTest extends PythonTests { + @BeforeClass + public static void setUpClass() { + Assume.assumeFalse(System.getProperty("os.name").toLowerCase().contains("mac")); + } + + @Test + public void testCloseWithBackgroundThreadsRunningSucceeds() { + Context context = createContext(); + try { + loadNativeExtension(context); + asyncStartPythonThreadsThatSleep(context); + } finally { + context.close(true); + } + } + + @Test + public void testCloseFromAnotherThreadThrowsCancelledEx() { + Context context = createContext(); + PolyglotException thrownEx = null; + try { + loadNativeExtension(context); + asyncStartPythonThreadsThatSleep(context); + CountDownLatch latch = new CountDownLatch(1); + new Thread(() -> { + try { + latch.await(); + Thread.sleep(10); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + // close from another thread + context.close(true); + }).start(); + countDownLatchAndSleepInPython(context, latch); + } catch (PolyglotException ex) { + thrownEx = ex; + } finally { + context.close(true); + Assert.assertNotNull("PolyglotException was not thrown upon cancellation ", thrownEx); + Assert.assertTrue(thrownEx.toString(), thrownEx.isCancelled()); + } + } + + @Test + public void testJavaThreadGetsCancelledException() throws InterruptedException { + Context context = createContext(); + AtomicReference thrownEx = new AtomicReference<>(); + CountDownLatch gotException = new CountDownLatch(1); + try { + asyncStartPythonThreadsThatSleep(context); + CountDownLatch latch = new CountDownLatch(1); + new Thread(() -> { + try { + // this thread will get stuck sleeping in python + countDownLatchAndSleepInPython(context, latch); + } catch (PolyglotException ex) { + thrownEx.set(ex); + gotException.countDown(); + } + }).start(); + try { + loadNativeExtension(context); + latch.await(); + Thread.sleep(10); // make sure the other thread really starts sleeping + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } finally { + context.close(true); + } + Assert.assertTrue("other thread did not get any exception in time limit", gotException.await(2, TimeUnit.SECONDS)); + Assert.assertNotNull("PolyglotException was not thrown upon cancellation ", thrownEx.get()); + Assert.assertTrue(thrownEx.toString(), thrownEx.get().isCancelled()); + } + + @Test + public void testJavaThreadNotExecutingPythonAnymore() throws InterruptedException { + Context context = createContext(); + var javaThreadDone = new CountDownLatch(1); + var javaThreadCanEnd = new CountDownLatch(1); + var javaThread = new Thread(() -> { + Assert.assertEquals(42, context.eval("python", "42").asInt()); + javaThreadDone.countDown(); + try { + javaThreadCanEnd.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + }); + AtomicReference uncaughtEx = new AtomicReference<>(); + javaThread.setUncaughtExceptionHandler((t, e) -> uncaughtEx.set(e)); + try { + javaThread.start(); + loadNativeExtension(context); + javaThreadDone.await(); + } finally { + // we can close although the Java thread is still running + context.close(true); + } + javaThreadCanEnd.countDown(); + javaThread.join(); + Assert.assertNull(uncaughtEx.get()); + } + + private static Context createContext() { + return Context.newBuilder().allowExperimentalOptions(true).allowAllAccess(true).option("python.IsolateNativeModules", "true").build(); + } + + private static void loadNativeExtension(Context context) { + context.eval("python", "import _cpython_sre\nassert _cpython_sre.ascii_tolower(88) == 120\n"); + } + + public static void asyncStartPythonThreadsThatSleep(Context context) { + for (int i = 0; i < 10; i++) { + context.eval("python", "import threading; import time; threading.Thread(target=lambda: time.sleep(10000)).start()"); + } + } + + private static void countDownLatchAndSleepInPython(Context context, CountDownLatch latch) { + context.eval("python", "def run(latch): import time; latch.countDown(); time.sleep(100000)"); + context.getBindings("python").getMember("run").execute(latch); + } +} diff --git a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/builtin/BaseExceptionTest.java b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/builtin/BaseExceptionTest.java index a2fde527e3..ac258f0158 100644 --- a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/builtin/BaseExceptionTest.java +++ b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/builtin/BaseExceptionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/engine/SharedEngineMultithreadingBenchmarkTest.java b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/engine/SharedEngineMultithreadingBenchmarkTest.java index 3c70a77024..3d709be875 100644 --- a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/engine/SharedEngineMultithreadingBenchmarkTest.java +++ b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/engine/SharedEngineMultithreadingBenchmarkTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,14 +45,21 @@ import org.graalvm.polyglot.Engine; import org.graalvm.polyglot.Source; +import org.junit.Assume; +import org.junit.BeforeClass; import org.junit.Test; import com.oracle.graal.python.test.integration.PythonTests; public class SharedEngineMultithreadingBenchmarkTest extends SharedEngineMultithreadingTestBase { + @BeforeClass + public static void setUpClass() { + Assume.assumeFalse(System.getProperty("os.name").toLowerCase().contains("mac")); + } + @Test public void testRichardsInParallelInMultipleContexts() throws Throwable { - try (Engine engine = Engine.newBuilder().allowExperimentalOptions(true).option("python.NativeModules", "false").build()) { + try (Engine engine = Engine.newBuilder().allowExperimentalOptions(true).option("python.IsolateNativeModules", "true").build()) { Source richardsSource = PythonTests.getScriptSource("richards3.py"); Task[] tasks = new Task[THREADS_COUNT]; for (int taskIdx = 0; taskIdx < tasks.length; taskIdx++) { diff --git a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/engine/SharedEngineMultithreadingTestBase.java b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/engine/SharedEngineMultithreadingTestBase.java index a19d8f55b8..da1e4d03f9 100644 --- a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/engine/SharedEngineMultithreadingTestBase.java +++ b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/engine/SharedEngineMultithreadingTestBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -50,6 +50,7 @@ import java.util.concurrent.Future; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.function.Consumer; import org.graalvm.polyglot.Context; @@ -58,6 +59,7 @@ import com.oracle.graal.python.test.integration.CleanupRule; import com.oracle.graal.python.test.integration.PythonTests; +import com.oracle.graal.python.test.integration.Utils; /** * Base class for tests that run in multiple context with a shared engine and in parallel. @@ -67,6 +69,7 @@ public class SharedEngineMultithreadingTestBase extends PythonTests { protected static final int RUNS_COUNT_FACTOR = Integer.getInteger("com.oracle.graal.python.test.SharedEngineMultithreadingRunCountFactor", 4); protected static final int THREADS_COUNT = Runtime.getRuntime().availableProcessors(); private static final boolean LOG = false; + private static final int TIMEOUT = 20; @Rule public CleanupRule cleanup = new CleanupRule(); @@ -112,8 +115,18 @@ protected static void submitAndWaitAll(ExecutorService service, Task[] tasks) th } }); } + boolean wasTimeout = false; for (Future future : futures) { - future.get(); + try { + // Under coverage, some of these tests are very slow + future.get(TIMEOUT, TimeUnit.MINUTES); + } catch (TimeoutException e) { + wasTimeout = true; + } + } + if (wasTimeout) { + System.err.println(Utils.getThreadDump()); + throw new AssertionError("One of the tasks did not finish in " + TIMEOUT + " minutes"); } log("All %d futures finished...", tasks.length); } diff --git a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/generator/GeneratorTests.java b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/generator/GeneratorTests.java index 4eaf2fd873..689376fde4 100644 --- a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/generator/GeneratorTests.java +++ b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/generator/GeneratorTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -72,7 +72,7 @@ public void desugared() { } @Test - public void testYieldFrom() { + public void testYieldFromSimple() { String source = "def gen1():\n" + " yield 1\n" + " yield 2\n" + @@ -83,4 +83,119 @@ public void testYieldFrom() { "print(list(gen2()))\n"; assertPrints("[1, 2]\n", source); } + + @Test + public void testYieldFromIterable() { + // yield from should extract an iterator from a non-generator argument + String source = "class Foo:\n" + + " def __init__(self, wrapped):\n" + + " self.wrapped = wrapped\n" + + " def __iter__(self):\n" + + " return iter(self.wrapped)\n" + + "def gen():\n" + + " foo = Foo([1,2,3])\n" + + " yield from foo\n" + + "\n" + + "print(list(gen()))\n"; + assertPrints("[1, 2, 3]\n", source); + } + + @Test + public void testYieldFromReturn() { + String source = "def gen1():\n" + + " yield 1\n" + + " yield 2\n" + + " return 3\n" + + "\n" + + "def gen2():\n" + + " final = yield from gen1()\n" + + " yield final\n" + + "\n" + + "print(list(gen2()))\n"; + assertPrints("[1, 2, 3]\n", source); + } + + @Test + public void testYieldFromSend() { + String source = "def gen1(x):\n" + + " yield (yield (yield x))\n" + + "\n" + + "def gen2():\n" + + " yield from gen1(2)\n" + + " yield 8\n" + + "\n" + + "gen = gen2()\n" + + "print(gen.send(None))\n" + + "print(gen.send(4))\n" + + "print(gen.send(6))\n" + + "print(gen.send(42))\n"; + assertPrints("2\n4\n6\n8\n", source); + } + + @Test + public void testYieldFromThrowCaught() { + String source = "def gen1():\n" + + " try:\n" + + " x = 1\n" + + " while True:\n" + + " x = yield x\n" + + " except ValueError:\n" + + " yield 42\n" + + "\n" + + "def gen2():\n" + + " yield from gen1()\n" + + "\n" + + "gen = gen2()\n" + + "print(gen.send(None))\n" + + "print(gen.send(2))\n" + + "print(gen.send(3))\n" + + "print(gen.throw(ValueError))\n"; + assertPrints("1\n2\n3\n42\n", source); + } + + @Test + public void testYieldFromThrowUncaught() { + String source = "def gen1():\n" + + " x = 1\n" + + " while True:\n" + + " x = yield x\n" + + "\n" + + "def gen2():\n" + + " yield from gen1()\n" + + "\n" + + "gen = gen2()\n" + + "print(gen.send(None))\n" + + "print(gen.send(2))\n" + + "print(gen.send(3))\n" + + "try:\n" + + " gen.throw(ValueError)\n" + + " print('error')\n" + + "except ValueError:\n" + + " print('success')\n"; + assertPrints("1\n2\n3\nsuccess\n", source); + } + + @Test + public void testYieldFromClose() { + String source = "def gen1():\n" + + " x = 1\n" + + " try:\n" + + " while True:\n" + + " x = yield x\n" + + " except GeneratorExit:\n" + + " print('gen1 exit')\n" + + "\n" + + "def gen2():\n" + + " try:\n" + + " yield from gen1()\n" + + " except GeneratorExit:\n" + + " print('gen2 exit')\n" + + "\n" + + "gen = gen2()\n" + + "print(gen.send(None))\n" + + "print(gen.send(2))\n" + + "print(gen.send(3))\n" + + "gen.close()\n"; + assertPrints("1\n2\n3\ngen1 exit\ngen2 exit\n", source); + } } diff --git a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/grammar/AsyncTests.java b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/grammar/AsyncTests.java new file mode 100644 index 0000000000..6653b44e2c --- /dev/null +++ b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/grammar/AsyncTests.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.test.integration.grammar; + +import static com.oracle.graal.python.test.integration.PythonTests.assertPrints; +import static com.oracle.graal.python.test.integration.Utils.IS_WINDOWS; +import static org.junit.Assume.assumeFalse; + +import org.junit.Test; + +public class AsyncTests { + @Test + public void nativeCoroutine() { + assumeFalse(IS_WINDOWS); + assumeFalse("TODO: not implemented PGenerator.getYieldFrom(PGenerator.java:204)", Boolean.getBoolean("python.EnableBytecodeDSLInterpreter")); + String source = "import asyncio\n" + + "async def foo():\n" + + " return 42\n" + + "async def main():\n" + + " print(await foo())\n" + + "asyncio.run(main())"; + assertPrints("42\n", source); + } + + @Test + public void asyncWith() { + assumeFalse(IS_WINDOWS); + assumeFalse("TODO: not implemented PGenerator.getYieldFrom(PGenerator.java:204)", Boolean.getBoolean("python.EnableBytecodeDSLInterpreter")); + String source = "import asyncio\n" + + "class AsyncContextManager:\n" + + " async def __aenter__(self):\n" + + " await asyncio.sleep(0.01)\n" + + " print(\"entered\")\n" + + " async def __aexit__(self, exc_type, exc_value, traceback):\n" + + " await asyncio.sleep(0.01)\n" + + " if exc_type:\n" + + " print(\"exited exceptionally\")\n" + + " else:\n" + + " print(\"exited normally\")\n" + + " return True\n" + + "async def main(shouldRaise):\n" + + " async with AsyncContextManager():\n" + + " print(\"inside\")\n" + + " if shouldRaise:\n" + + " raise ValueError\n" + + "asyncio.run(main(%s))"; + assertPrints("entered\ninside\nexited normally\n", String.format(source, "False")); + assertPrints("entered\ninside\nexited exceptionally\n", String.format(source, "True")); + } + + @Test + public void asyncWithExceptional() { + assumeFalse(IS_WINDOWS); + assumeFalse("TODO: not implemented PGenerator.getYieldFrom(PGenerator.java:204)", Boolean.getBoolean("python.EnableBytecodeDSLInterpreter")); + String source = "import asyncio\n" + + "class AsyncContextManager:\n" + + " async def __aenter__(self):\n" + + " await asyncio.sleep(0.01)\n" + + " print(\"entered\")\n" + + " async def __aexit__(self, exc_type, exc_value, traceback):\n" + + " await asyncio.sleep(0.01)\n" + + " print(\"exited\")\n" + + " return False\n" + // don't handle exception + "async def main(shouldRaise):\n" + + " async with AsyncContextManager():\n" + + " print(\"inside\")\n" + + " if shouldRaise:\n" + + " raise ValueError\n" + + "try:\n" + + " asyncio.run(main(%s))\n" + + "except ValueError:\n" + + " print(\"rethrew\")\n"; + assertPrints("entered\ninside\nexited\n", String.format(source, "False")); + assertPrints("entered\ninside\nexited\nrethrew\n", String.format(source, "True")); + } +} diff --git a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/grammar/ClassTests.java b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/grammar/ClassTests.java index 2e279ae577..4818da0cde 100644 --- a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/grammar/ClassTests.java +++ b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/grammar/ClassTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -205,4 +205,21 @@ public void multipleInheritance() { assertPrints("common\n", source); } + @Test + public void classDecorator() { + String source = "def wrapper(cls):\n" + // + " orig_init = cls.__init__\n" + // + " def new_init(self):\n" + // + " print('wrapper')\n" + // + " orig_init(self)\n" + // + " cls.__init__ = new_init\n" + // + " return cls\n" + // + "@wrapper\n" + // + "class Foo:\n" + // + " def __init__(self):\n" + // + " print('Foo')\n" + // + "Foo()\n"; + assertPrints("wrapper\nFoo\n", source); + } + } diff --git a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/grammar/TryTests.java b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/grammar/TryTests.java index 697baf7341..3c4642f998 100644 --- a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/grammar/TryTests.java +++ b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/grammar/TryTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -290,4 +290,49 @@ public void testExceptionState6() { "print(repr(sys.exc_info()[1]))\n"; assertPrints("None\nNone\n", source); } + + @Test + public void testNamedExceptionDeleted() { + String source = "ex = 42\n" + + "try:\n" + + " raise NameError\n" + + "except BaseException as ex:\n" + + " pass\n" + + "try:\n" + + " print(ex)\n" + + " print(\"expected NameError\")\n" + + "except NameError:\n" + + " print(\"hit NameError\")\n"; + assertPrints("hit NameError\n", source); + } + + @Test + public void testNamedExceptionNotDeleted() { + String source = "ex = 42\n" + + "try:\n" + + " print(\"nothing thrown\")\n" + + "except BaseException as ex:\n" + + " pass\n" + + "try:\n" + + " print(ex)\n" + + "except NameError:\n" + + " print(\"hit unexpected NameError\")\n"; + assertPrints("nothing thrown\n42\n", source); + } + + @Test + public void testNamedExceptionDeletedByHandler() { + String source = "ex = 42\n" + + "try:\n" + + " raise NameError\n" + + "except BaseException as ex:\n" + + " print(\"deleting exception\")\n" + + " del ex\n" + + "try:\n" + + " print(ex)\n" + + " print(\"expected NameError\")\n" + + "except NameError:\n" + + " print(\"hit NameError\")\n"; + assertPrints("deleting exception\nhit NameError\n", source); + } } diff --git a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/interop/ArgumentsTest.java b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/interop/ArgumentsTest.java new file mode 100644 index 0000000000..0dd7070214 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/interop/ArgumentsTest.java @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.test.integration.interop; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.graalvm.polyglot.Context; +import org.graalvm.polyglot.Source; +import org.graalvm.polyglot.Value; + +import com.oracle.graal.python.test.integration.PythonTests; +import java.io.ByteArrayOutputStream; + +import org.graalvm.python.embedding.KeywordArguments; +import org.graalvm.python.embedding.PositionalArguments; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ArgumentsTest extends PythonTests { + + private ByteArrayOutputStream out; + private Context context; + private ByteArrayOutputStream err; + + @Before + public void setUpTest() { + out = new ByteArrayOutputStream(); + err = new ByteArrayOutputStream(); + Context.Builder builder = Context.newBuilder(); + builder.allowExperimentalOptions(true); + builder.allowAllAccess(true); + builder.out(out); + builder.err(err); + context = builder.build(); + } + + @After + public void tearDown() { + context.close(); + } + + public interface TestPositionalArgsLong { + long fn(PositionalArguments args); + } + + @Test + public void testPositionalArgsLength() { + String source = """ + def fn (*args)->int: + return len(args) + """; + + TestPositionalArgsLong module = context.eval(Source.create("python", source)).as(TestPositionalArgsLong.class); + assertEquals(1, module.fn(PositionalArguments.of(22))); + assertEquals(2, module.fn(PositionalArguments.of(1, null))); + assertEquals(2, module.fn(PositionalArguments.of(null, 2))); + assertEquals(5, module.fn(PositionalArguments.of(1, 2, 3, 4, 5))); + assertEquals(0, module.fn(PositionalArguments.of())); + + assertEquals(1, module.fn(PositionalArguments.from(List.of(2)))); + assertEquals(2, module.fn(PositionalArguments.from(List.of(2, 3)))); + + assertEquals(3, module.fn(PositionalArguments.of(new Object[]{2, 3, 4}))); + assertEquals(1, module.fn(PositionalArguments.of(new Object[]{null}))); + } + + @Test + public void testPositionalArgsWithNoneValue() { + String source = """ + def fn (*args): + result = 0; + for arg in args: + if arg is None: + result = result + 1; + return result + """; + + TestPositionalArgsLong module = context.eval(Source.create("python", source)).as(TestPositionalArgsLong.class); + assertEquals(0, module.fn(PositionalArguments.of(22))); + assertEquals(1, module.fn(PositionalArguments.of(1, null))); + assertEquals(1, module.fn(PositionalArguments.of(null, 2))); + assertEquals(3, module.fn(PositionalArguments.of(null, null, null))); + assertEquals(1, module.fn(PositionalArguments.of(new Object[]{null}))); + + Value none = context.eval(Source.create("python", "a = None")).getMember("a"); + assertEquals(1, module.fn(PositionalArguments.of(none))); + assertEquals(3, module.fn(PositionalArguments.of(none, null, none))); + assertEquals(2, module.fn(PositionalArguments.of(new Object[]{none, null}))); + } + + public interface TestPositionalArgs01 { + String fn(Object a, Object b, PositionalArguments args); + } + + @Test + public void testPositionalArgs01() { + String source = """ + def fn (a, b, *args): + result = str(a) + str(b); + for arg in args: + result = result + str(arg); + return result + """; + TestPositionalArgs01 module = context.eval(Source.create("python", source)).as(TestPositionalArgs01.class); + assertEquals("12", module.fn(1, 2, PositionalArguments.of())); + assertEquals("123", module.fn(1, 2, PositionalArguments.of(3))); + assertEquals("123Ahoj", module.fn(1, 2, PositionalArguments.of(3, "Ahoj"))); + assertEquals("123AhojTrue", module.fn(1, 2, PositionalArguments.of(3, "Ahoj", true))); + assertEquals("123AhojTrueNone", module.fn(1, 2, PositionalArguments.of(3, "Ahoj", true, null))); + } + + public interface TestPositionalArgs02 { + String fn(Object a); + + String fn(Object a, PositionalArguments args); + + String fn(PositionalArguments args); + + String fn(Object a, Object b); + + String fn(Object a, Object b, PositionalArguments args); + } + + @Test + public void testPositionalArgs02() { + String source = """ + def fn (a, b="correct", *args): + result = str(a) + str(b) + for arg in args: + result = result + str(arg) + return result + """; + TestPositionalArgs02 module = context.eval(Source.create("python", source)).as(TestPositionalArgs02.class); + assertEquals("1correct", module.fn(1)); + assertEquals("12", module.fn(1, 2)); + assertEquals("1only one", module.fn(1, PositionalArguments.of("only one"))); + assertEquals("1only oneand two", module.fn(1, PositionalArguments.of("only one", "and two"))); + assertEquals("12", module.fn(1, 2, PositionalArguments.of())); + assertEquals("123", module.fn(1, 2, PositionalArguments.of(3))); + assertEquals("123Ahoj", module.fn(1, 2, PositionalArguments.of(3, "Ahoj"))); + assertEquals("123AhojTrue", module.fn(1, 2, PositionalArguments.of(3, "Ahoj", true))); + assertEquals("123AhojTrueNone", module.fn(1, 2, PositionalArguments.of(3, "Ahoj", true, null))); + } + + public interface TestKeywordArgs01 { + String fn(); + + String fn(KeywordArguments kwArgs); + } + + @Test + public void testKeywordArgs01() { + String source = """ + def fn (**kwArgs): + result = '' + for key, value in kwArgs.items(): + result = result + f'[{key}:{str(value)}],' + return result + """; + TestKeywordArgs01 module = context.eval(Source.create("python", source)).as(TestKeywordArgs01.class); + assertEquals("", module.fn()); + assertEquals("", module.fn(KeywordArguments.from(new HashMap<>()))); + assertEquals("[jedna:1],", module.fn(KeywordArguments.of("jedna", 1))); + + Value none = context.eval(Source.create("python", "a = None")).getMember("a"); + Map keyArgs = new HashMap<>(); + keyArgs.put("jedna", 1); + keyArgs.put("true", true); + keyArgs.put("null", none); + + String result = module.fn(KeywordArguments.from(keyArgs)); + assertTrue(result.contains("[true:True],")); + assertTrue(result.contains("[jedna:1],")); + assertTrue(result.contains("[null:None],")); + } +} diff --git a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/interop/JavaInteropTest.java b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/interop/JavaInteropTest.java index bd7e4b8a5c..d78d531adb 100644 --- a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/interop/JavaInteropTest.java +++ b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/interop/JavaInteropTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -50,6 +50,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.math.BigInteger; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -67,6 +68,7 @@ import org.graalvm.polyglot.proxy.ProxyHashMap; import org.graalvm.polyglot.proxy.ProxyObject; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -93,6 +95,7 @@ public void setUpTest() { Builder builder = Context.newBuilder(); builder.allowExperimentalOptions(true); builder.allowAllAccess(true); + builder.option("engine.WarnInterpreterOnly", "false"); builder.out(out); builder.err(err); context = builder.build(); @@ -197,6 +200,24 @@ public void truffleMethodExport() { assertTrue(main.canExecute()); } + // From https://github.com/oracle/graalpython/issues/298 + @Test + public void testHostException() { + try { + context.eval(createSource("import java; java.math.BigInteger.ONE.divide(java.math.BigInteger.ZERO)")); + fail(); + } catch (PolyglotException e) { + Assert.assertTrue(e.isHostException()); + Assert.assertTrue(e.asHostException() instanceof ArithmeticException); + Assert.assertTrue(e.getMessage(), e.getMessage().contains("divide by zero")); + } + + String outString = out.toString(StandardCharsets.UTF_8); + String errString = err.toString(StandardCharsets.UTF_8); + Assert.assertTrue(outString, outString.isEmpty()); + Assert.assertTrue(errString, errString.isEmpty()); + } + @Test public void javaArraySet() { String source = "import java\n" + @@ -475,7 +496,7 @@ def foo(obj): foo.execute(ProxyObject.fromMap(m)); } - public class JavaObject { + public static class JavaObject { public byte byteValue = 1; public short shortValue = 2; public int intValue = 3; @@ -542,7 +563,7 @@ public void accessJavaObjectFields() throws IOException { "5.0 \n" + "6.0 \n" + "True \n" + - "c \n", out.toString("UTF-8")); + "c \n", out.toString("UTF-8")); } @Test @@ -569,7 +590,7 @@ public void accessJavaObjectGetters() throws IOException { "5.0 \n" + "6.0 \n" + "True \n" + - "c \n", out.toString("UTF-8")); + "c \n", out.toString("UTF-8")); } @Test @@ -584,7 +605,7 @@ public void javaStringsAndPythonStrings() throws IOException { Map source = Map.of("source", "foo"); context.getBindings("python").getMember("enrich").execute(source); assertEquals("" + - "\n" + + "\n" + "True\n" + "True\n", out.toString("UTF-8")); } @@ -818,6 +839,46 @@ class Bar(Foo): assertEquals(object.getMetaSimpleName(), "object"); assertFalse(object.hasMetaParents()); } + + public static class MyFunction implements java.util.function.Function { + public String __text_signature__ = "(string) -> str"; + + @Override + public String apply(String s) { + return s; + } + } + + public static class MyFunctionWithCustomName implements java.util.function.Function { + public String __text_signature__ = "(string) -> str"; + public String __name__ = "myfunc"; + + @Override + public String apply(String s) { + return s; + } + } + + public static class MyFunctionWithIncorrectSignature implements java.util.function.Function { + public String __text_signature__ = "[I;java.lang.String;"; + + @Override + public String apply(String s) { + return s; + } + } + + @Test + public void javaExecutablesAsPythonFunctions() { + Value inspectSignature = context.eval("python", "import inspect; inspect.signature"); + assertEquals("", inspectSignature.execute(new MyFunction()).toString()); + + Value signature = context.eval("python", "lambda f: f.__text_signature__"); + assertEquals(new MyFunctionWithIncorrectSignature().__text_signature__, signature.execute(new MyFunctionWithIncorrectSignature()).asString()); + + Value name = context.eval("python", "lambda f: f.__name__"); + assertEquals(new MyFunctionWithCustomName().__name__, name.execute(new MyFunctionWithCustomName()).asString()); + } } @RunWith(Parameterized.class) diff --git a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/module/PosixTest.java b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/module/PosixTest.java index b4145d31a2..5a3f1f6fd3 100644 --- a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/module/PosixTest.java +++ b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/module/PosixTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -25,9 +25,9 @@ */ package com.oracle.graal.python.test.integration.module; -import static com.oracle.graal.python.test.integration.PythonTests.assertLastLineError; import static com.oracle.graal.python.test.integration.PythonTests.assertLastLineErrorContains; import static com.oracle.graal.python.test.integration.PythonTests.assertPrints; +import static com.oracle.graal.python.test.integration.PythonTests.assertPrintsToStdErr; import static com.oracle.graal.python.test.integration.Utils.IS_WINDOWS; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -177,7 +177,7 @@ public void stdout() { @Test public void stderr() { assumeFalse(IS_WINDOWS); - assertLastLineError("error\n", "import sys; sys.stderr.write('error\\n')"); + assertPrintsToStdErr("error\n", "import sys; sys.stderr.write('error\\n')"); } @Test @@ -189,7 +189,7 @@ public void printToStdout() { @Test public void printToStderr() { assumeFalse(IS_WINDOWS); - assertLastLineError("1-2...", "import sys; print('1', '2', sep='-', file=sys.stderr, end='...', flush=True)"); + assertPrintsToStdErr("1-2...", "import sys; print('1', '2', sep='-', file=sys.stderr, end='...', flush=True)"); } @Test diff --git a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/runtime/ProfileTests.java b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/runtime/ProfileTests.java index 6824b52b61..279ca064df 100644 --- a/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/runtime/ProfileTests.java +++ b/graalpython/com.oracle.graal.python.test.integration/src/com/oracle/graal/python/test/integration/runtime/ProfileTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,6 +44,7 @@ import java.io.PrintStream; import org.junit.Assert; +import org.junit.Assume; import org.junit.Test; import com.oracle.graal.python.test.integration.PythonTests; @@ -67,6 +68,7 @@ public void profileYield() { @Test public void profileException() { + Assume.assumeFalse("TODO: wrong stacktrace", Boolean.getBoolean("python.EnableBytecodeDSLInterpreter")); String source = "import sys\n" + "def f(frame, event, arg): print(frame, event, arg)\n" + "sys.setprofile(f)\n" + diff --git a/graalpython/com.oracle.graal.python.test.integration/src/org.graalvm.python.vfs/dir1/extractme b/graalpython/com.oracle.graal.python.test.integration/src/org.graalvm.python.vfs/dir1/extractme new file mode 100644 index 0000000000..e69de29bb2 diff --git a/graalpython/com.oracle.graal.python.test.integration/src/org.graalvm.python.vfs/extractme b/graalpython/com.oracle.graal.python.test.integration/src/org.graalvm.python.vfs/extractme new file mode 100644 index 0000000000..1294840905 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test.integration/src/org.graalvm.python.vfs/extractme @@ -0,0 +1,2 @@ +text1 +text2 diff --git a/graalpython/com.oracle.graal.python.test.integration/src/org.graalvm.python.vfs/fileslist.txt b/graalpython/com.oracle.graal.python.test.integration/src/org.graalvm.python.vfs/fileslist.txt index 7848dc3b12..b011dbc8b4 100644 --- a/graalpython/com.oracle.graal.python.test.integration/src/org.graalvm.python.vfs/fileslist.txt +++ b/graalpython/com.oracle.graal.python.test.integration/src/org.graalvm.python.vfs/fileslist.txt @@ -1,9 +1,10 @@ /org.graalvm.python.vfs/ /org.graalvm.python.vfs/dir1/ -/org.graalvm.python.vfs/dir1/dir2/ +/org.graalvm.python.vfs/dir1/extractme /org.graalvm.python.vfs/dir1/file2 /org.graalvm.python.vfs/emptydir/ /org.graalvm.python.vfs/file1 +/org.graalvm.python.vfs/extractme /org.graalvm.python.vfs/fileslist.txt /org.graalvm.python.vfs/SomeFile /org.graalvm.python.vfs/site-packages/ diff --git a/graalpython/com.oracle.graal.python.test.integration/src/org/graalvm/python/embedding/test/integration/GraalPyResourcesTests.java b/graalpython/com.oracle.graal.python.test.integration/src/org/graalvm/python/embedding/test/integration/GraalPyResourcesTests.java new file mode 100644 index 0000000000..615ef8e11a --- /dev/null +++ b/graalpython/com.oracle.graal.python.test.integration/src/org/graalvm/python/embedding/test/integration/GraalPyResourcesTests.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package org.graalvm.python.embedding.test.integration; + +import org.graalvm.polyglot.Engine; +import org.graalvm.python.embedding.GraalPyResources; +import org.graalvm.python.embedding.VirtualFileSystem; +import org.junit.Test; + +import java.nio.file.Path; + +public class GraalPyResourcesTests { + + @Test + public void sharedEngine() { + // simply check if we are able to create a context with a shared engine + Engine sharedEngine = Engine.newBuilder().build(); + GraalPyResources.contextBuilder().engine(sharedEngine).build().close(); + GraalPyResources.contextBuilder().engine(sharedEngine).build().close(); + GraalPyResources.contextBuilder(Path.of("test")).engine(sharedEngine).build().close(); + GraalPyResources.contextBuilder(VirtualFileSystem.newBuilder().build()).engine(sharedEngine).build().close(); + } +} diff --git a/graalpython/com.oracle.graal.python.test.integration/src/org/graalvm/python/embedding/test/integration/VirtualFileSystemIntegrationTest.java b/graalpython/com.oracle.graal.python.test.integration/src/org/graalvm/python/embedding/test/integration/VirtualFileSystemIntegrationTest.java new file mode 100644 index 0000000000..6860e2ba0b --- /dev/null +++ b/graalpython/com.oracle.graal.python.test.integration/src/org/graalvm/python/embedding/test/integration/VirtualFileSystemIntegrationTest.java @@ -0,0 +1,734 @@ +/* + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.graalvm.python.embedding.test.integration; + +import static com.oracle.graal.python.test.integration.Utils.IS_WINDOWS; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.file.Files; +import java.nio.file.InvalidPathException; +import java.nio.file.Path; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.ThreadFactory; +import java.util.function.Function; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.graalvm.polyglot.Context; +import org.graalvm.polyglot.Context.Builder; +import org.graalvm.polyglot.HostAccess; +import org.graalvm.polyglot.PolyglotException; +import org.graalvm.polyglot.Value; +import org.graalvm.polyglot.io.IOAccess; +import org.graalvm.python.embedding.GraalPyResources; +import org.graalvm.python.embedding.VirtualFileSystem; +import org.junit.Assert; +import org.junit.Assume; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +public class VirtualFileSystemIntegrationTest { + + static final String VFS_UNIX_MOUNT_POINT = "/test_mount_point"; + static final String VFS_WIN_MOUNT_POINT = "X:\\test_win_mount_point"; + static final String VFS_MOUNT_POINT = IS_WINDOWS ? VFS_WIN_MOUNT_POINT : VFS_UNIX_MOUNT_POINT; + + static final String PYTHON = "python"; + static final String USE_DEFAULT_VFS_DIR = "--default--"; + + private final String resourceDirectory; + + /** + * We run most of the tests with two identical filesystems in different locations. + */ + @Parameters + public static Collection vfsDirectories() { + // null stands for the "default" + return List.of(USE_DEFAULT_VFS_DIR, "GRAALPY-VFS/com.oracle.graal.python.test/integration"); + } + + @SuppressWarnings("StringEquality") + private boolean useDefaultResourcesDir() { + return resourceDirectory == USE_DEFAULT_VFS_DIR; + } + + // For tests that do not use the parameter + private void assumeDefaultResourcesDir() { + Assume.assumeTrue(useDefaultResourcesDir()); + } + + private VirtualFileSystem createVirtualFileSystem() { + if (useDefaultResourcesDir()) { + return VirtualFileSystem.create(); + } + return VirtualFileSystem.newBuilder().resourceDirectory(resourceDirectory).build(); + } + + private Context.Builder newContextBuilder() { + if (useDefaultResourcesDir()) { + return GraalPyResources.contextBuilder(); + } + return GraalPyResources.contextBuilder(createVirtualFileSystem()); + } + + private VirtualFileSystem.Builder newVirtualFileSystemBuilder() { + VirtualFileSystem.Builder builder = VirtualFileSystem.newBuilder(); + if (!useDefaultResourcesDir()) { + builder.resourceDirectory(resourceDirectory); + } + return builder; + } + + public VirtualFileSystemIntegrationTest(String resourceDirectory) { + this.resourceDirectory = resourceDirectory; + Logger logger = Logger.getLogger(VirtualFileSystem.class.getName()); + for (Handler handler : logger.getHandlers()) { + handler.setLevel(Level.FINE); + } + logger.setLevel(Level.FINE); + } + + @Test + public void defaultValues() throws IOException { + try (VirtualFileSystem fs = createVirtualFileSystem(); VirtualFileSystem fs2 = createVirtualFileSystem()) { + assertEquals(fs.getMountPoint(), fs2.getMountPoint()); + assertEquals(IS_WINDOWS ? "X:\\graalpy_vfs" : "/graalpy_vfs", fs.getMountPoint()); + } + } + + @Test + public void mountPoints() throws IOException { + try (VirtualFileSystem vfs = newVirtualFileSystemBuilder().// + unixMountPoint(VFS_UNIX_MOUNT_POINT).// + windowsMountPoint(VFS_WIN_MOUNT_POINT).build()) { + assertEquals(VFS_MOUNT_POINT, vfs.getMountPoint()); + } + + String multiPathUnixMountPoint = "/test/mount/point"; + String multiPathWinMountPoint = "X:\\test\\win\\mount\\point"; + VirtualFileSystem vfs = newVirtualFileSystemBuilder().// + unixMountPoint(multiPathUnixMountPoint).// + windowsMountPoint(multiPathWinMountPoint).// + resourceLoadingClass(VirtualFileSystemIntegrationTest.class).build(); + try (Context ctx = addTestOptions(GraalPyResources.contextBuilder(vfs)).build()) { + ctx.eval(PYTHON, "from os import listdir; listdir('" + (IS_WINDOWS ? multiPathWinMountPoint.replace("\\", "\\\\") : multiPathUnixMountPoint) + "')"); + } + } + + private static void checkExtractedFile(Path extractedFile, String[] expectedContens) throws IOException { + assertTrue(Files.exists(extractedFile)); + List lines = Files.readAllLines(extractedFile); + if (expectedContens != null) { + assertEquals("expected " + expectedContens.length + " lines in extracted file '" + extractedFile + "'", expectedContens.length, lines.size()); + for (String line : expectedContens) { + assertTrue("expected line '" + line + "' in file '" + extractedFile + "' with contents:\n" + expectedContens, lines.contains(line)); + } + } else { + assertEquals("extracted file '" + extractedFile + "' expected to be empty, but had " + lines.size() + " lines", 0, lines.size()); + } + } + + private static void checkException(Class exType, Callable c) { + checkException(exType, c, null); + } + + private static void checkException(Class exType, Callable c, String msg) { + boolean gotEx = false; + try { + c.call(); + } catch (Exception e) { + assertEquals(e.getClass(), exType); + gotEx = true; + } + assertTrue(msg != null ? msg : "expected " + exType.getName(), gotEx); + } + + @Test + public void fsOperations() { + try (Context ctx = createContext(null, null)) { + fsOperations(ctx, "/test_mount_point/"); + } + try (Context ctx = createContext(null, b -> b.currentWorkingDirectory(Path.of(VFS_MOUNT_POINT)))) { + fsOperations(ctx, ""); + } + } + + @Test + @Ignore // GR-61545 + public void parallelFsOperations() throws ExecutionException, InterruptedException { + int threadsCount = Runtime.getRuntime().availableProcessors(); + CountDownLatch latch = new CountDownLatch(threadsCount); + ExecutorService executorService = Executors.newFixedThreadPool(threadsCount, new ThreadFactory() { + private int index; + + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "vfs-tests-thread-pool-thread-" + index++); + } + }); + + try (Context ctx = createContext(null, null)) { + Future[] tasks = new Future[threadsCount]; + for (int i = 0; i < threadsCount; i++) { + tasks[i] = executorService.submit(() -> { + latch.countDown(); + try { + latch.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + fsOperations(ctx, "/test_mount_point/"); + }); + } + + for (int i = 0; i < threadsCount; i++) { + tasks[i].get(); + } + } + } + + public void fsOperations(Context ctx, String pathPrefix) { + + // os.path.exists + eval(ctx, "import os; assert os.path.exists('/test_mount_point')", pathPrefix); + eval(ctx, "import os; assert os.path.exists('{pathPrefix}.')", pathPrefix); + eval(ctx, "import os; assert os.path.exists('{pathPrefix}file1')", pathPrefix); + eval(ctx, "import os; assert os.path.exists('{pathPrefix}dir1')", pathPrefix); + eval(ctx, "import os; assert os.path.exists('{pathPrefix}dir1/')", pathPrefix); + eval(ctx, "import os; assert os.path.exists('{pathPrefix}emptydir')", pathPrefix); + eval(ctx, "import os; assert os.path.exists('{pathPrefix}emptydir/')", pathPrefix); + eval(ctx, "import os; assert os.path.exists('{pathPrefix}dir1/file2')", pathPrefix); + eval(ctx, "import os; assert not os.path.exists('{pathPrefix}doesnotexist')", pathPrefix); + eval(ctx, "import os; assert not os.path.exists('{pathPrefix}doesnotexist/')", pathPrefix); + + // pathlib.exists + eval(ctx, "from pathlib import Path; assert Path('{pathPrefix}').exists()", pathPrefix); + eval(ctx, "from pathlib import Path; assert Path('{pathPrefix}file1').exists()", pathPrefix); + eval(ctx, "from pathlib import Path; assert Path('{pathPrefix}dir1').exists()", pathPrefix); + eval(ctx, "from pathlib import Path; assert Path('{pathPrefix}dir1/').exists()", pathPrefix); + eval(ctx, "from pathlib import Path; assert Path('{pathPrefix}emptydir').exists()", pathPrefix); + eval(ctx, "from pathlib import Path; assert Path('{pathPrefix}emptydir/').exists()", pathPrefix); + eval(ctx, "from pathlib import Path; assert not Path('{pathPrefix}doesnotexist').exists()", pathPrefix); + eval(ctx, "from pathlib import Path; assert not Path('{pathPrefix}doesnotexist/').exists()", pathPrefix); + + // path.isfile|isdir + + eval(ctx, "import os; assert os.path.isfile('{pathPrefix}file1')", pathPrefix); + eval(ctx, "import os; assert not os.path.isfile('{pathPrefix}dir1')", pathPrefix); + eval(ctx, "import os; assert not os.path.isfile('{pathPrefix}dir1/')", pathPrefix); + + eval(ctx, "import os; assert not os.path.isfile('/test_mount_point')", pathPrefix); + eval(ctx, "import os; assert os.path.isdir('/test_mount_point')", pathPrefix); + eval(ctx, "import os; assert not os.path.isdir('{pathPrefix}file1')", pathPrefix); + eval(ctx, "import os; assert os.path.isdir('{pathPrefix}dir1')", pathPrefix); + eval(ctx, "import os; assert os.path.isdir('{pathPrefix}dir1/')", pathPrefix); + + // pathlib.is_file|is_dir + + eval(ctx, "from pathlib import Path; assert not Path('/test_mount_point').is_file()", pathPrefix); + eval(ctx, "from pathlib import Path; assert Path('{pathPrefix}file1').is_file()", pathPrefix); + eval(ctx, "from pathlib import Path; assert not Path('{pathPrefix}dir1').is_file()", pathPrefix); + eval(ctx, "from pathlib import Path; assert not Path('{pathPrefix}dir1/').is_file()", pathPrefix); + + eval(ctx, "from pathlib import Path; assert Path('/test_mount_point').is_dir()", pathPrefix); + eval(ctx, "from pathlib import Path; assert not Path('{pathPrefix}file1').is_dir()", pathPrefix); + eval(ctx, "from pathlib import Path; assert Path('{pathPrefix}dir1').is_dir()", pathPrefix); + eval(ctx, "from pathlib import Path; assert Path('{pathPrefix}dir1/').is_dir()", pathPrefix); + + // delete os.remove|rmdir + + eval(ctx, """ + import os + try: + os.remove('{pathPrefix}doesnotexist') + except OSError: + pass + else: + assert False + """, pathPrefix); + eval(ctx, """ + import os + try: + os.remove('{pathPrefix}file1') + except OSError: + pass + else: + assert False + """, pathPrefix); + eval(ctx, """ + import os + try: + os.rmdir('{pathPrefix}file1') + except OSError: + pass + else: + assert False + """, pathPrefix); + eval(ctx, """ + import os + try: + os.remove('{pathPrefix}dir1') + except OSError: + pass + else: + assert False + """, pathPrefix); + eval(ctx, """ + import os + try: + os.rmdir('{pathPrefix}dir1') + except OSError: + pass + else: + assert False + """, pathPrefix); + eval(ctx, """ + import os + try: + os.rmdir('{pathPrefix}emptydir') + except OSError: + pass + else: + assert False + """, pathPrefix); + + // delete pathlib.unlink|rmdir + + eval(ctx, """ + from pathlib import Path + try: + Path('{pathPrefix}doesnotexist').unlink() + except OSError: + pass + else: + assert False + """, pathPrefix); + eval(ctx, """ + from pathlib import Path + try: + Path('{pathPrefix}file').unlink() + except OSError: + pass + else: + assert False + """, pathPrefix); + eval(ctx, """ + from pathlib import Path + try: + Path('{pathPrefix}file1').rmdir() + except OSError: + pass + else: + assert False + """, pathPrefix); + eval(ctx, """ + from pathlib import Path + try: + Path('{pathPrefix}dir1').unlink() + except OSError: + pass + else: + assert False + """, pathPrefix); + eval(ctx, """ + from pathlib import Path + try: + Path('{pathPrefix}dir1').rmdir() + except OSError: + pass + else: + assert False + """, pathPrefix); + eval(ctx, """ + from pathlib import Path + try: + Path('{pathPrefix}emptydir').rmdir() + except OSError: + pass + else: + assert False + """, pathPrefix); + + // delete shutil.rmtree + + eval(ctx, """ + import shutil + try: + shutil.rmtree('{pathPrefix}dir1') + except OSError: + pass + else: + assert False + """, pathPrefix); + eval(ctx, """ + import shutil + try: + shutil.rmtree('{pathPrefix}emptydir') + except OSError: + pass + else: + assert False + """, pathPrefix); + + // os.listdir + + eval(ctx, """ + from os import listdir + try: + f = listdir('{pathPrefix}doesnotexist') + except FileNotFoundError: + pass + except Error: + assert False, 'expected FileNotFoundError' + f = listdir('{pathPrefix}emptydir') + assert len(f) == 0, 'expected no files' + + f = listdir('/test_mount_point/') + assert len(f) == 7, 'expected 7 files, got ' + str(len(f)) + + assert 'dir1' in f, 'does not contain "dir1"' + assert 'emptydir' in f, 'does not contain "emptydir"' + assert 'file1' in f, 'does not contain "file1"' + assert 'fileslist.txt' in f, 'does not contain "fileslist.txt"' + + f = listdir('{pathPrefix}dir1') + if len(f) != 2: + print('files in {pathPrefix}dir1:') + for ff in f: + print(ff) + assert False, 'expected 3 got ' + str(len(f)) + assert 'file2' in f, 'does not contain "file2"' + assert 'extractme' in f, 'does not contain "extractme"' + """, pathPrefix); + + // os.walk + + eval(ctx, """ + from os import walk + i = 0 + for r, d, f in walk('{pathPrefix}doesnotexist'): + i = i + 1 + assert i == 0 + + for r, d, f in walk('{pathPrefix}emptydir'): + i = i + 1 + assert r == '{pathPrefix}emptydir', 'expected {pathPrefix}emptydir, got' + r + assert len(d) == 0, 'expected no dirs in emptydir' + assert len(f) == 0, 'expected no files in emptydir' + assert i == 1 + + roots = set() + dirs = set() + files = set() + for r, d, f in walk('/test_mount_point'): + roots.add(r) + for ff in f: + files.add(r + "/" + ff) + for dd in d: + dirs.add(r + "/" + dd) + + assert len(roots) == 9, 'expected 10 roots, got ' + str(len(roots)) + assert len(files) == 15, 'expected 15 files, got ' + str(len(files)) + assert len(dirs) == 8, 'expected 8 dirs, got ' + str(len(dirs)) + """, pathPrefix); + + // read file + + eval(ctx, """ + with open("{pathPrefix}file1", "r") as f: + l = f.readlines() + assert len(l) == 2, 'expect 2 lines, got ' + len(l) + assert l[0].startswith("text1"), f'expected "text1", got "{l[0]}"' + assert l[1].startswith("text2"), f'expected "text2", got "{l[1]}"' + + with open("{pathPrefix}dir1/file2", "r") as f: + l = f.readlines() + assert len(l) == 0, 'expect 0 lines from empty file, got ' + str(len(l)) + """, pathPrefix); + + // write file + eval(ctx, """ + try: + f = open("{pathPrefix}file1", "w") + except OSError: + pass + else: + assert False + """, pathPrefix); + } + + @Test + public void osChdir() { + try (Context ctx = createContext(null, null)) { + // os.path.exists + eval(ctx, """ + import os + assert not os.path.exists('file1') + os.chdir('/test_mount_point') + assert os.path.exists('file1') + """); + } + } + + @Test + public void fsOperationsCaseInsensitive() { + try (Context ctx = createContext(b -> b.caseInsensitive(true), null)) { + eval(ctx, """ + import os + assert os.path.exists('/test_mount_point/SomeFile') + assert os.path.exists('/test_mount_point/someFile') + assert os.path.exists('/test_mount_point/somefile') + assert not os.path.exists('/test_mount_point/somefile1') + """); + } + } + + private static void eval(Context ctx, String s, String pathPrefix) { + eval(ctx, s.replace("{pathPrefix}", pathPrefix)); + } + + private static void eval(Context ctx, String s) { + String src = patchMountPoint(s); + ctx.eval(PYTHON, src); + } + + private static String patchMountPoint(String src) { + if (IS_WINDOWS) { + return src.replace(VFS_UNIX_MOUNT_POINT, "X:\\\\test_win_mount_point"); + } + return src; + } + + public Context createContext(Function vfsBuilderFunction, Function ctxBuilderFunction) { + VirtualFileSystem.Builder builder = newVirtualFileSystemBuilder().// + unixMountPoint(VFS_MOUNT_POINT).// + windowsMountPoint(VFS_WIN_MOUNT_POINT).// + extractFilter(p -> p.getFileName().toString().endsWith(".tso")).// + resourceLoadingClass(VirtualFileSystemIntegrationTest.class); + if (vfsBuilderFunction != null) { + builder = vfsBuilderFunction.apply(builder); + } + VirtualFileSystem fs = builder.build(); + Context.Builder ctxBuilder = addTestOptions(GraalPyResources.contextBuilder(fs)); + if (ctxBuilderFunction != null) { + ctxBuilder = ctxBuilderFunction.apply(ctxBuilder); + } + return ctxBuilder.build(); + } + + @Test + public void vfsBuilderTest() { + try (Context context = addTestOptions(newContextBuilder()).allowAllAccess(true).allowHostAccess(HostAccess.ALL).build()) { + context.eval(PYTHON, "import java; java.type('java.lang.String')"); + } + + try (Context context = addTestOptions(newContextBuilder()).allowAllAccess(false).allowHostAccess(HostAccess.NONE).build()) { + context.eval(PYTHON, """ + import java + try: + java.type('java.lang.String'); + except NotImplementedError: + pass + else: + assert False, 'expected NotImplementedError' + """); + } + VirtualFileSystem fs = newVirtualFileSystemBuilder().// + unixMountPoint(VFS_MOUNT_POINT).// + windowsMountPoint(VFS_WIN_MOUNT_POINT).// + resourceLoadingClass(VirtualFileSystemIntegrationTest.class).build(); + try (Context context = addTestOptions(GraalPyResources.contextBuilder(fs)).build()) { + context.eval(PYTHON, patchMountPoint("from os import listdir; listdir('/test_mount_point')")); + } + + try (Context context = newContextBuilder().build()) { + context.eval(PYTHON, "from os import listdir; listdir('.')"); + } + try (Context context = addTestOptions(newContextBuilder()).allowIO(IOAccess.NONE).build()) { + boolean gotPE = false; + try { + context.eval(PYTHON, "from os import listdir; listdir('.')"); + } catch (PolyglotException pe) { + gotPE = true; + } + assert gotPE : "expected PolyglotException"; + } + } + + @Test + public void externalResourcesBuilderTest() throws IOException { + Path resourcesDir = Files.createTempDirectory("vfs-test-resources"); + try (VirtualFileSystem fs = newVirtualFileSystemBuilder().// + resourceLoadingClass(VirtualFileSystemIntegrationTest.class).build()) { + // extract VFS + GraalPyResources.extractVirtualFileSystemResources(fs, resourcesDir); + } + // check extracted contents + InputStream stream = VirtualFileSystemIntegrationTest.class.getResourceAsStream("/org.graalvm.python.vfs/fileslist.txt"); + BufferedReader br = new BufferedReader(new InputStreamReader(stream)); + String line; + while ((line = br.readLine()) != null) { + line = line.substring("/org.graalvm.python.vfs/".length()); + if (line.length() == 0) { + continue; + } + Path extractedFile = resourcesDir.resolve(line); + assert Files.exists(extractedFile); + if (line.endsWith("/")) { + assert Files.isDirectory(extractedFile); + } + } + checkExtractedFile(resourcesDir.resolve(Path.of("file1")), new String[]{"text1", "text2"}); + + // create context with extracted resource dir and check if we can see the extracted file + try (Context context = addTestOptions(GraalPyResources.contextBuilder(resourcesDir)).build()) { + context.eval("python", "import os; assert os.path.exists('" + resourcesDir.resolve("file1").toString().replace("\\", "\\\\") + "')"); + } + } + + @Test + public void vfsMountPointTest() { + assumeDefaultResourcesDir(); + if (IS_WINDOWS) { + checkException(IllegalArgumentException.class, () -> VirtualFileSystem.newBuilder().windowsMountPoint("test")); + checkException(IllegalArgumentException.class, () -> VirtualFileSystem.newBuilder().windowsMountPoint("test\\")); + checkException(IllegalArgumentException.class, () -> VirtualFileSystem.newBuilder().windowsMountPoint("\\test\\")); + checkException(IllegalArgumentException.class, () -> VirtualFileSystem.newBuilder().windowsMountPoint("\\test")); + checkException(IllegalArgumentException.class, () -> VirtualFileSystem.newBuilder().windowsMountPoint("X:\\test\\")); + checkException(InvalidPathException.class, () -> VirtualFileSystem.newBuilder().windowsMountPoint("X:\\test|test")); + } else { + checkException(IllegalArgumentException.class, () -> VirtualFileSystem.newBuilder().unixMountPoint("test")); + checkException(IllegalArgumentException.class, () -> VirtualFileSystem.newBuilder().unixMountPoint("test/")); + checkException(IllegalArgumentException.class, () -> VirtualFileSystem.newBuilder().unixMountPoint("/test/")); + checkException(IllegalArgumentException.class, () -> VirtualFileSystem.newBuilder().unixMountPoint("X:\\test")); + checkException(InvalidPathException.class, () -> VirtualFileSystem.newBuilder().unixMountPoint("/test/\0")); + } + } + + @SuppressWarnings("unchecked") + @Test + public void pythonPathsTest() throws IOException { + String defaultMountPoint; + try (VirtualFileSystem vfs = createVirtualFileSystem()) { + defaultMountPoint = vfs.getMountPoint(); + } + + String getPathsSource = "import sys; [sys.path, sys.executable]"; + try (Context ctx = newContextBuilder().build()) { + Value paths = ctx.eval("python", getPathsSource); + + assertEquals(IS_WINDOWS ? "X:\\graalpy_vfs" : "/graalpy_vfs", defaultMountPoint); + checkPaths(paths.as(List.class), defaultMountPoint); + } + + try (Context ctx = newContextBuilder().build()) { + Value paths = ctx.eval("python", getPathsSource); + checkPaths(paths.as(List.class), defaultMountPoint); + } + VirtualFileSystem vfs = newVirtualFileSystemBuilder().// + unixMountPoint(VFS_UNIX_MOUNT_POINT).// + windowsMountPoint(VFS_WIN_MOUNT_POINT).build(); + assertEquals(VFS_MOUNT_POINT, vfs.getMountPoint()); + try (Context ctx = GraalPyResources.contextBuilder(vfs).build()) { + Value paths = ctx.eval("python", getPathsSource); + checkPaths(paths.as(List.class), vfs.getMountPoint()); + } + Path resourcesDir = Files.createTempDirectory("python-resources"); + + try (Context ctx = GraalPyResources.contextBuilder(resourcesDir).build()) { + Value paths = ctx.eval("python", getPathsSource); + checkPaths(paths.as(List.class), resourcesDir.toString()); + } + } + + @SuppressWarnings("unchecked") + private static void checkPaths(List l, String pathPrefix) { + // option python.PythonPath + assertTrue(((List) l.get(0)).contains(pathPrefix + File.separator + "src")); + // option python.Executable + assertEquals(l.get(1), pathPrefix + (IS_WINDOWS ? "\\venv\\Scripts\\python.exe" : "/venv/bin/python")); + } + + private static Builder addTestOptions(Builder builder) { + return builder.option("engine.WarnInterpreterOnly", "false"); + } + + @Test + public void testAnotherVfs() throws IOException { + assumeDefaultResourcesDir(); + try (var vfs = VirtualFileSystem.newBuilder().resourceDirectory("GRAALPY-VFS/foo").build()) { + try (Context ctx = GraalPyResources.contextBuilder(vfs).build()) { + eval(ctx, """ + def test(mount_point): + import os + assert not os.path.exists('hello.txt') + print(os.path.join(mount_point, 'otherdir')) + os.chdir(os.path.join(mount_point, 'otherdir')) + assert os.path.exists('hello.txt') + with open('hello.txt', 'r') as f: + return f.read() + """); + Value test = ctx.getBindings("python").getMember("test"); + Value result = test.execute(vfs.getMountPoint()); + Assert.assertEquals("world", result.asString()); + } + } + } +} diff --git a/graalpython/com.oracle.graal.python.test.integration/src/org/graalvm/python/embedding/utils/test/VirtualFileSystemTest.java b/graalpython/com.oracle.graal.python.test.integration/src/org/graalvm/python/embedding/utils/test/VirtualFileSystemTest.java deleted file mode 100644 index 09010e2922..0000000000 --- a/graalpython/com.oracle.graal.python.test.integration/src/org/graalvm/python/embedding/utils/test/VirtualFileSystemTest.java +++ /dev/null @@ -1,522 +0,0 @@ -/* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package org.graalvm.python.embedding.utils.test; - -import static com.oracle.graal.python.test.integration.Utils.IS_WINDOWS; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.List; -import java.util.function.Function; - -import org.graalvm.polyglot.Context; -import org.graalvm.polyglot.HostAccess; -import org.graalvm.polyglot.PolyglotException; -import org.graalvm.polyglot.io.FileSystem; -import org.graalvm.polyglot.io.IOAccess; -import org.graalvm.python.embedding.utils.GraalPyResources; -import org.graalvm.python.embedding.utils.VirtualFileSystem; -import org.junit.Test; - -public class VirtualFileSystemTest { - - static final String VFS_UNIX_MOUNT_POINT = "/test_mount_point"; - static final String VFS_WIN_MOUNT_POINT = "X:\\test_win_mount_point"; - static final String VFS_MOUNT_POINT = IS_WINDOWS ? VFS_WIN_MOUNT_POINT : VFS_UNIX_MOUNT_POINT; - - static final String PYTHON = "python"; - - @Test - public void defaultValues() throws Exception { - VirtualFileSystem fs = VirtualFileSystem.create(); - VirtualFileSystem fs2 = VirtualFileSystem.create(); - - assertEquals(fs.getMountPoint(), fs2.getMountPoint()); - - assertEquals(IS_WINDOWS ? "X:\\graalpy_vfs" : "/graalpy_vfs", fs.getMountPoint()); - } - - @Test - public void mountPoints() throws Exception { - VirtualFileSystem fs = VirtualFileSystem.newBuilder().// - unixMountPoint(VFS_MOUNT_POINT).// - windowsMountPoint(VFS_WIN_MOUNT_POINT).build(); - - assertEquals(VFS_MOUNT_POINT, fs.getMountPoint()); - } - - @Test - public void toRealPath() throws Exception { - FileSystem fs = VirtualFileSystem.newBuilder().// - unixMountPoint(VFS_MOUNT_POINT).// - windowsMountPoint(VFS_WIN_MOUNT_POINT).// - extractFilter(p -> p.getFileName().toString().equals("file1")).// - resourceLoadingClass(VirtualFileSystemTest.class).build(); - // check regular resource dir - assertEquals("dir1", fs.toRealPath(Path.of("dir1")).toString()); - assertEquals(VFS_MOUNT_POINT + File.separator + "dir1", fs.toRealPath(Path.of(VFS_MOUNT_POINT + File.separator + "dir1")).toString()); - // check regular resource file - assertEquals("SomeFile", fs.toRealPath(Path.of("SomeFile")).toString()); - assertEquals(VFS_MOUNT_POINT + File.separator + "SomeFile", fs.toRealPath(Path.of(VFS_MOUNT_POINT + File.separator + "SomeFile")).toString()); - // check to be extracted file - checkExtractedFile(fs.toRealPath(Path.of("file1")), new String[]{"text1", "text2"}); - checkExtractedFile(fs.toRealPath(Path.of(VFS_MOUNT_POINT + File.separator + "file1")), new String[]{"text1", "text2"}); - } - - @Test - public void toAbsolutePath() throws Exception { - FileSystem fs = VirtualFileSystem.newBuilder().// - unixMountPoint(VFS_MOUNT_POINT).// - windowsMountPoint(VFS_WIN_MOUNT_POINT).// - extractFilter(p -> p.getFileName().toString().equals("file1") || p.getFileName().toString().equals("file2")).// - resourceLoadingClass(VirtualFileSystemTest.class).build(); - // check regular resource dir - assertEquals(VFS_MOUNT_POINT + File.separator + "dir1", fs.toAbsolutePath(Path.of("dir1")).toString()); - assertEquals(VFS_MOUNT_POINT + File.separator + "dir1", fs.toAbsolutePath(Path.of(VFS_MOUNT_POINT + File.separator + "dir1")).toString()); - // check regular resource file - assertEquals(VFS_MOUNT_POINT + File.separator + "SomeFile", fs.toAbsolutePath(Path.of("SomeFile")).toString()); - assertEquals(VFS_MOUNT_POINT + File.separator + "SomeFile", fs.toAbsolutePath(Path.of(VFS_MOUNT_POINT + File.separator + "SomeFile")).toString()); - // check to be extracted file - checkExtractedFile(fs.toAbsolutePath(Path.of("file1")), new String[]{"text1", "text2"}); - checkExtractedFile(fs.toAbsolutePath(Path.of(VFS_MOUNT_POINT + File.separator + "file1")), new String[]{"text1", "text2"}); - checkExtractedFile(fs.toAbsolutePath(Path.of("dir1/file2")), null); - checkExtractedFile(fs.toAbsolutePath(Path.of(VFS_MOUNT_POINT + File.separator + "dir1/file2")), null); - } - - @Test - public void libsExtract() throws Exception { - FileSystem fs = VirtualFileSystem.newBuilder().// - unixMountPoint(VFS_MOUNT_POINT).// - windowsMountPoint(VFS_WIN_MOUNT_POINT).// - extractFilter(p -> p.getFileName().toString().endsWith(".tso")).// - resourceLoadingClass(VirtualFileSystemTest.class).build(); - Path p = fs.toAbsolutePath(Path.of("site-packages/testpkg/file.tso")); - checkExtractedFile(p, null); - Path extractedRoot = p.getParent().getParent().getParent(); - - checkExtractedFile(extractedRoot.resolve("site-packages/testpkg.libs/file1.tso"), null); - checkExtractedFile(extractedRoot.resolve("site-packages/testpkg.libs/file2.tso"), null); - checkExtractedFile(extractedRoot.resolve("site-packages/testpkg.libs/dir/file1.tso"), null); - checkExtractedFile(extractedRoot.resolve("site-packages/testpkg.libs/dir/file2.tso"), null); - checkExtractedFile(extractedRoot.resolve("site-packages/testpkg.libs/dir/nofilterfile"), null); - checkExtractedFile(extractedRoot.resolve("site-packages/testpkg.libs/dir/dir/file1.tso"), null); - checkExtractedFile(extractedRoot.resolve("site-packages/testpkg.libs/dir/dir/file2.tso"), null); - - p = fs.toAbsolutePath(Path.of("site-packages/testpkg-nolibs/file.tso")); - checkExtractedFile(p, null); - } - - private static void checkExtractedFile(Path extractedFile, String[] expectedContens) throws IOException { - assertTrue(Files.exists(extractedFile)); - List lines = Files.readAllLines(extractedFile); - if (expectedContens != null) { - assertEquals("expected " + expectedContens.length + " lines in extracted file '" + extractedFile + "'", expectedContens.length, lines.size()); - for (String line : expectedContens) { - assertTrue("expected line '" + line + "' in file '" + extractedFile + "' with contents:\n" + expectedContens, lines.contains(line)); - } - } else { - assertEquals("extracted file '" + extractedFile + "' expected to be empty, but had " + lines.size() + " lines", 0, lines.size()); - } - } - - @Test - public void fsOperations() { - - // os.path.exists - - eval("import os; assert os.path.exists('/test_mount_point/file1')"); - eval("import os; assert os.path.exists('/test_mount_point/dir1')"); - eval("import os; assert os.path.exists('/test_mount_point/dir1/')"); - eval("import os; assert os.path.exists('/test_mount_point/emptydir')"); - eval("import os; assert os.path.exists('/test_mount_point/emptydir/')"); - eval("import os; assert os.path.exists('/test_mount_point/dir1/file2')"); - eval("import os; assert not os.path.exists('/test_mount_point/doesnotexist')"); - eval("import os; assert not os.path.exists('/test_mount_point/doesnotexist/')"); - - // pathlib.exists - - eval("from pathlib import Path; assert Path('/test_mount_point/file1').exists()"); - eval("from pathlib import Path; assert Path('/test_mount_point/dir1').exists()"); - eval("from pathlib import Path; assert Path('/test_mount_point/dir1/').exists()"); - eval("from pathlib import Path; assert Path('/test_mount_point/emptydir').exists()"); - eval("from pathlib import Path; assert Path('/test_mount_point/emptydir/').exists()"); - eval("from pathlib import Path; assert not Path('/test_mount_point/doesnotexist').exists()"); - eval("from pathlib import Path; assert not Path('/test_mount_point/doesnotexist/').exists()"); - - // path.isfile|isdir - - eval("import os; assert os.path.isfile('/test_mount_point/file1')"); - eval("import os; assert not os.path.isfile('/test_mount_point/dir1')"); - eval("import os; assert not os.path.isfile('/test_mount_point/dir1/')"); - - eval("import os; assert not os.path.isdir('/test_mount_point/file1')"); - eval("import os; assert os.path.isdir('/test_mount_point/dir1')"); - eval("import os; assert os.path.isdir('/test_mount_point/dir1/')"); - - // pathlib.is_file|is_dir - - eval("from pathlib import Path; assert Path('/test_mount_point/file1').is_file()"); - eval("from pathlib import Path; assert not Path('/test_mount_point/dir1').is_file()"); - eval("from pathlib import Path; assert not Path('/test_mount_point/dir1/').is_file()"); - - eval("from pathlib import Path; assert not Path('/test_mount_point/file1').is_dir()"); - eval("from pathlib import Path; assert Path('/test_mount_point/dir1').is_dir()"); - eval("from pathlib import Path; assert Path('/test_mount_point/dir1/').is_dir()"); - - // delete os.remove|rmdir - - eval(""" - import os - try: - os.remove('/test_mount_point/doesnotexist') - except OSError: - pass - """); - eval(""" - import os - try: - os.remove('/test_mount_point/file1') - except OSError: - pass - """); - eval(""" - import os - try: - os.rmdir('/test_mount_point/file1') - except OSError: - pass - """); - eval(""" - import os - try: - os.remove('/test_mount_point/dir1') - except OSError: - pass - """); - eval(""" - import os - try: - os.rmdir('/test_mount_point/dir1') - except OSError: - pass - """); - eval(""" - import os - try: - os.rmdir('/test_mount_point/emptydir') - except OSError: - pass - """); - - // delete pathlib.unlink|rmdir - - eval(""" - from pathlib import Path - try: - Path('/test_mount_point/doesnotexist').unlink() - except OSError: - pass - """); - eval(""" - from pathlib import Path - try: - Path('/test_mount_point/file').unlink() - except OSError: - pass - """); - eval(""" - from pathlib import Path - try: - Path('/test_mount_point/file1').rmdir() - except OSError: - pass - """); - eval(""" - from pathlib import Path - try: - Path('/test_mount_point/dir1').unlink() - except OSError: - pass - """); - eval(""" - from pathlib import Path - try: - Path('/test_mount_point/dir1').rmdir() - except OSError: - pass - """); - eval(""" - from pathlib import Path - try: - Path('/test_mount_point/emptydir').rmdir() - except OSError: - pass - """); - - // delete shutil.rmtree - - eval(""" - import shutil - try: - shutil.rmtree('/test_mount_point/dir1') - except OSError: - pass - """); - eval(""" - import shutil - try: - shutil.rmtree('/test_mount_point/emptydir') - except OSError: - pass - """); - - // os.listdir - - eval(""" - from os import listdir - try: - f = listdir('/test_mount_point/doesnotexist') - except FileNotFoundError: - pass - except Error: - assert False, 'expected FileNotFoundError' - - f = listdir('/test_mount_point/emptydir') - assert len(f) == 0, 'expected no files' - - f = listdir('/test_mount_point/') - assert len(f) == 6, 'expected 6 files, got ' + str(len(f)) - - assert 'dir1' in f, 'does not contain "dir1"' - assert 'emptydir' in f, 'does not contain "emptydir"' - assert 'file1' in f, 'does not contain "file1"' - assert 'fileslist.txt' in f, 'does not contain "fileslist.txt"' - - f = listdir('/test_mount_point/dir1') - if len(f) != 2: - print('files in /test_mount_point/dir1:') - for ff in f: - print(ff) - assert False, 'expected 2 got ' + str(len(f)) - assert 'dir2' in f, 'does not contain "dir2"' - assert 'file2' in f, 'does not contain "file2"' - """); - - // os.walk - - eval(""" - from os import walk - i = 0 - for r, d, f in walk('/test_mount_point/doesnotexist'): - i = i + 1 - assert i == 0 - - for r, d, f in walk('/test_mount_point/emptydir'): - i = i + 1 - assert r == '/test_mount_point/emptydir', 'expected /test_mount_point/emptydir, got' + r - assert len(d) == 0, 'expected no dirs in emptydir' - assert len(f) == 0, 'expected no files in emptydir' - assert i == 1 - - roots = set() - dirs = set() - files = set() - for r, d, f in walk('/test_mount_point/'): - roots.add(r) - for ff in f: - files.add(r + "/" + ff) - for dd in d: - dirs.add(r + "/" + dd) - - assert len(roots) == 10, 'expected 10 roots, got ' + str(len(roots)) - assert len(files) == 13, 'expected 13 files, got ' + str(len(files)) - assert len(dirs) == 9, 'expected 9 dirs, got ' + str(len(dirs)) - """); - - // read file - - eval(""" - with open("/test_mount_point/file1", "r") as f: - l = f.readlines() - assert len(l) == 2, 'expect 2 lines, got ' + len(l) - assert l[0] == "text1\\n", 'expected "text1", got ' + l[0] - assert l[1] == "text2\\n", 'expected "text2", got ' + l[1] - - with open("/test_mount_point/dir1/file2", "r") as f: - l = f.readlines() - assert len(l) == 0, 'expect 0 lines from empty file, got ' + str(len(l)) - """); - - // write file - eval(""" - try: - f = open("/test_mount_point/file1", "w") - except OSError: - pass - """); - } - - @Test - public void fsOperationsCaseInsensitive() { - eval(""" - import os - assert os.path.exists('/test_mount_point/SomeFile') - assert os.path.exists('/test_mount_point/someFile') - assert os.path.exists('/test_mount_point/somefile') - assert not os.path.exists('/test_mount_point/somefile1') - """, b -> b.caseInsensitive(true)); - } - - private void eval(String s) { - eval(s, null); - } - - private void eval(String s, Function builderFunction) { - String src = patchMountPoint(s); - - getContext(builderFunction).eval(PYTHON, src); - } - - private static String patchMountPoint(String src) { - if (IS_WINDOWS) { - return src.replace(VFS_UNIX_MOUNT_POINT, "X:\\\\test_win_mount_point"); - } - return src; - } - - private Context cachedContext; - - public Context getContext(Function builderFunction) { - if (builderFunction == null && cachedContext != null) { - return cachedContext; - } - VirtualFileSystem.Builder builder = VirtualFileSystem.newBuilder().// - unixMountPoint(VFS_MOUNT_POINT).// - windowsMountPoint(VFS_WIN_MOUNT_POINT).// - extractFilter(p -> p.getFileName().toString().endsWith(".tso")).// - resourceLoadingClass(VirtualFileSystemTest.class); - if (builderFunction != null) { - builder = builderFunction.apply(builder); - } - VirtualFileSystem fs = builder.build(); - Context context = GraalPyResources.contextBuilder(fs).build(); - if (builderFunction == null) { - cachedContext = context; - } - return context; - } - - @Test - public void vfsBuilderTest() { - Context context = GraalPyResources.contextBuilder().allowAllAccess(true).allowHostAccess(HostAccess.ALL).build(); - context.eval(PYTHON, "import java; java.type('java.lang.String')"); - - context = GraalPyResources.contextBuilder().allowAllAccess(false).allowHostAccess(HostAccess.NONE).build(); - context.eval(PYTHON, """ - import java - try: - java.type('java.lang.String'); - except NotImplementedError: - pass - else: - assert False, 'expected NotImplementedError' - """); - - VirtualFileSystem fs = VirtualFileSystem.newBuilder().// - unixMountPoint(VFS_MOUNT_POINT).// - windowsMountPoint(VFS_WIN_MOUNT_POINT).// - resourceLoadingClass(VirtualFileSystemTest.class).build(); - context = GraalPyResources.contextBuilder(fs).build(); - context.eval(PYTHON, patchMountPoint("from os import listdir; listdir('/test_mount_point')")); - - context = GraalPyResources.createContext(); - context.eval(PYTHON, "from os import listdir; listdir('.')"); - - context = GraalPyResources.contextBuilder().allowIO(IOAccess.NONE).build(); - boolean gotPE = false; - try { - context.eval(PYTHON, "from os import listdir; listdir('.')"); - } catch (PolyglotException pe) { - gotPE = true; - } - assert gotPE : "expected PolyglotException"; - } - - @Test - public void externalResourcesBuilderTest() throws IOException { - VirtualFileSystem fs = VirtualFileSystem.newBuilder().resourceLoadingClass(VirtualFileSystemTest.class).build(); - Path resourcesDir = Files.createTempDirectory("vfs-test-resources"); - - // extract VFS - GraalPyResources.extractVirtualFileSystemResources(fs, resourcesDir); - - // check extracted contents - InputStream stream = VirtualFileSystemTest.class.getResourceAsStream("/org.graalvm.python.vfs/fileslist.txt"); - BufferedReader br = new BufferedReader(new InputStreamReader(stream)); - String line; - while ((line = br.readLine()) != null) { - line = line.substring("/org.graalvm.python.vfs/".length()); - if (line.length() == 0) { - continue; - } - Path extractedFile = resourcesDir.resolve(line); - assert Files.exists(extractedFile); - if (line.endsWith("/")) { - assert Files.isDirectory(extractedFile); - } - } - checkExtractedFile(resourcesDir.resolve(Path.of("file1")), new String[]{"text1", "text2"}); - - // create context with extracted resource dir and check if we can see the extracted file - try (Context context = GraalPyResources.contextBuilder(resourcesDir).build()) { - context.eval("python", "import os; assert os.path.exists('" + resourcesDir.resolve("file1").toString().replace("\\", "\\\\") + "')"); - } - } - -} diff --git a/graalpython/com.oracle.graal.python.test/src/META-INF/services/com.oracle.graal.python.builtins.PythonBuiltins b/graalpython/com.oracle.graal.python.test/src/META-INF/services/com.oracle.graal.python.builtins.PythonBuiltins deleted file mode 100644 index 32134f782e..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/META-INF/services/com.oracle.graal.python.builtins.PythonBuiltins +++ /dev/null @@ -1 +0,0 @@ -com.oracle.graal.python.test.advanced.CustomModule diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/advanced/CustomBuiltinsTest.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/advanced/CustomBuiltinsTest.java deleted file mode 100644 index c6970a1416..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/advanced/CustomBuiltinsTest.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.test.advanced; - -import org.junit.Test; - -import com.oracle.graal.python.test.PythonTests; - -public class CustomBuiltinsTest extends PythonTests { - @Test - public void testCustomBuiltinModule() { - assertPrints("success\n", "import CustomModule; print(CustomModule.success)"); - } -} diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/advanced/CustomModule.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/advanced/CustomModule.java deleted file mode 100644 index cc0aaa6ad0..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/advanced/CustomModule.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.test.advanced; - -import java.util.ArrayList; -import java.util.List; - -import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.truffle.api.dsl.NodeFactory; - -@CoreFunctions(defineModule = "CustomModule") -public class CustomModule extends PythonBuiltins { - - @Override - protected List> getNodeFactories() { - return new ArrayList<>(); - } - - @Override - public void initialize(Python3Core core) { - super.initialize(core); - this.addBuiltinConstant("success", "success"); - } -} diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/advanced/LeakTest.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/advanced/LeakTest.java index 76163436a0..2110a7dfc3 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/advanced/LeakTest.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/advanced/LeakTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,8 +43,6 @@ import java.io.IOException; import java.io.OutputStream; import java.lang.management.ManagementFactory; -import java.lang.management.ThreadInfo; -import java.lang.management.ThreadMXBean; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -69,6 +67,7 @@ import org.netbeans.lib.profiler.heap.Instance; import org.netbeans.lib.profiler.heap.JavaClass; +import com.oracle.graal.python.test.integration.Utils; import com.sun.management.HotSpotDiagnosticMXBean; public class LeakTest extends AbstractLanguageLauncher { @@ -127,7 +126,7 @@ private void dumpAndAnalyze() { } MBeanServer server = doFullGC(); - String threadDump = getThreadDump(); + String threadDump = Utils.getThreadDump(); Path dumpFile = dumpHeap(server, keepDump); boolean fail = checkForLeaks(dumpFile); if (fail) { @@ -138,24 +137,6 @@ private void dumpAndAnalyze() { } } - private String getThreadDump() { - ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); - ThreadInfo[] threads = threadMXBean.getThreadInfo(threadMXBean.getAllThreadIds(), 100); - final String line = "=====================================\n"; - StringBuilder sb = new StringBuilder(line); - for (ThreadInfo thread : threads) { - if (thread != null) { - sb.append("-------\n"); - sb.append(thread.getThreadName()).append('\n'); - sb.append("Thread state:").append(thread.getThreadState()).append('\n'); - for (StackTraceElement element : thread.getStackTrace()) { - sb.append(" ").append(element).append('\n'); - } - } - } - return sb.append(line).toString(); - } - private boolean checkForLeaks(Path dumpFile) { boolean fail = false; try { diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/MethodFlagsTest.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/MethodFlagsTest.java deleted file mode 100644 index 3a0590fd81..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/MethodFlagsTest.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.test.builtin; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.method.PDecoratedMethod; -import com.oracle.graal.python.builtins.objects.type.MethodsFlags; -import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode; -import com.oracle.graal.python.test.PythonTests; -import com.oracle.truffle.api.strings.TruffleString; - -public class MethodFlagsTest { - @Before - public void setUp() { - PythonTests.enterContext(); - } - - @After - public void tearDown() { - PythonTests.closeContext(); - } - - private static void assertMethodConsistentWithFlag(PythonBuiltinClassType clazz, long flags, TruffleString methodName) { - Object method = LookupAttributeInMRONode.Dynamic.getUncached().execute(clazz, methodName); - if (method instanceof PDecoratedMethod) { - // Ignore classmethods - method = PNone.NO_VALUE; - } - if ((clazz.getMethodsFlags() & flags) != 0) { - assertNotEquals( - String.format("%s has no method %s even though it sets corresponding method flags;", clazz.name(), methodName), - PNone.NO_VALUE, method); - } else { - assertEquals( - String.format("%s has method %s but it doesn't set the corresponding method flag;", clazz.name(), methodName), - PNone.NO_VALUE, method); - } - } - - @Test - public void testMethodFlagsConsistency() { - for (PythonBuiltinClassType clazz : PythonBuiltinClassType.VALUES) { - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_SUBTRACT, SpecialMethodNames.T___SUB__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_MULTIPLY | MethodsFlags.SQ_REPEAT, SpecialMethodNames.T___MUL__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_REMAINDER, SpecialMethodNames.T___MOD__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_DIVMOD, SpecialMethodNames.T___DIVMOD__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_POWER, SpecialMethodNames.T___POW__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_NEGATIVE, SpecialMethodNames.T___NEG__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_POSITIVE, SpecialMethodNames.T___POS__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_ABSOLUTE, SpecialMethodNames.T___ABS__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_BOOL, SpecialMethodNames.T___BOOL__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_INVERT, SpecialMethodNames.T___INVERT__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_LSHIFT, SpecialMethodNames.T___LSHIFT__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_RSHIFT, SpecialMethodNames.T___RSHIFT__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_AND, SpecialMethodNames.T___AND__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_XOR, SpecialMethodNames.T___XOR__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_OR, SpecialMethodNames.T___OR__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_INT, SpecialMethodNames.T___INT__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_FLOAT, SpecialMethodNames.T___FLOAT__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_INPLACE_ADD | MethodsFlags.SQ_INPLACE_CONCAT, SpecialMethodNames.T___IADD__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_INPLACE_SUBTRACT, SpecialMethodNames.T___ISUB__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_INPLACE_MULTIPLY | MethodsFlags.SQ_INPLACE_REPEAT, SpecialMethodNames.T___IMUL__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_INPLACE_REMAINDER, SpecialMethodNames.T___IMOD__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_INPLACE_POWER, SpecialMethodNames.T___IPOW__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_INPLACE_LSHIFT, SpecialMethodNames.T___ILSHIFT__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_INPLACE_RSHIFT, SpecialMethodNames.T___IRSHIFT__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_INPLACE_AND, SpecialMethodNames.T___IAND__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_INPLACE_XOR, SpecialMethodNames.T___IXOR__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_INPLACE_OR, SpecialMethodNames.T___IOR__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_FLOOR_DIVIDE, SpecialMethodNames.T___FLOORDIV__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_TRUE_DIVIDE, SpecialMethodNames.T___TRUEDIV__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_INPLACE_FLOOR_DIVIDE, SpecialMethodNames.T___IFLOORDIV__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_INPLACE_TRUE_DIVIDE, SpecialMethodNames.T___ITRUEDIV__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_INDEX, SpecialMethodNames.T___INDEX__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_MATRIX_MULTIPLY, SpecialMethodNames.T___MATMUL__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.NB_INPLACE_MATRIX_MULTIPLY, SpecialMethodNames.T___IMATMUL__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.SQ_ITEM | MethodsFlags.MP_SUBSCRIPT, SpecialMethodNames.T___GETITEM__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.SQ_ASS_ITEM | MethodsFlags.MP_ASS_SUBSCRIPT, SpecialMethodNames.T___SETITEM__); - assertMethodConsistentWithFlag(clazz, MethodsFlags.SQ_CONTAINS, SpecialMethodNames.T___CONTAINS__); - } - } -} diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/ClinicTests.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/ClinicTests.java index 3c86947570..5d82ba2115 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/ClinicTests.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/ClinicTests.java @@ -60,7 +60,13 @@ import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.function.PArguments; +import com.oracle.graal.python.builtins.objects.function.PKeyword; +import com.oracle.graal.python.nodes.argument.ReadArgumentNode; +import com.oracle.graal.python.nodes.argument.ReadIndexedArgumentNode; +import com.oracle.graal.python.nodes.argument.ReadVarArgsNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentCastNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; @@ -180,6 +186,42 @@ public void testCustomConvertor() { assertEquals(T_DONE, callTarget.call(T_A_INPUT, T_B_INPUT)); } + @Builtin(name = "my_vararg_builtin", parameterNames = {"x", "a"}, takesVarArgs = true, keywordOnlyNames = {"b"}) + @ArgumentClinic(name = "a", conversion = ClinicConversion.Int) + @ArgumentClinic(name = "b", conversion = ClinicConversion.Int, defaultValue = "7") + public abstract static class MyVarArgBuiltinWithDefaultValues extends PythonClinicBuiltinNode { + @Override + protected ArgumentClinicProvider getArgumentClinic() { + return ClinicTestsClinicProviders.MyVarArgBuiltinWithDefaultValuesClinicProviderGen.INSTANCE; + } + + @Specialization + Object doDefaults(Object x, int a, Object[] varArgs, int b) { + assertEquals("abc", x); + assertEquals(42, a); + assertEquals(1, varArgs.length); + assertEquals(7, b); + return varArgs[0]; + } + } + + @Test + public void testVarArgDefaultValues() { + CallTarget callTarget = createCallTarget(ClinicTestsFactory.MyVarArgBuiltinWithDefaultValuesNodeGen.create( + new ReadArgumentNode[]{ + ReadIndexedArgumentNode.create(0), + ReadIndexedArgumentNode.create(1), + ReadVarArgsNode.create(true), + ReadIndexedArgumentNode.create(2) + })); + Object[] scope_w = PArguments.create(2); + scope_w[PArguments.USER_ARGUMENTS_OFFSET] = "abc"; + scope_w[PArguments.USER_ARGUMENTS_OFFSET + 1] = 42; + PArguments.setVariableArguments(scope_w, 666); + PArguments.setKeywordArguments(scope_w, new PKeyword[]{new PKeyword(tsLiteral("b"), PNone.NO_VALUE)}); + assertEquals(666, callTarget.call(scope_w)); + } + private static CallTarget createCallTarget(PythonBinaryClinicBuiltinNode node) { return new BinaryBuiltinRoot(node).getCallTarget(); } @@ -207,4 +249,23 @@ public Object execute(VirtualFrame frame) { } } } + + private static CallTarget createCallTarget(PythonClinicBuiltinNode node) { + return new BuiltinRoot(node).getCallTarget(); + } + + private static final class BuiltinRoot extends RootNode { + @Child PythonClinicBuiltinNode node; + + BuiltinRoot(PythonClinicBuiltinNode node) { + super(null); + this.node = node; + } + + @Override + public Object execute(VirtualFrame frame) { + return node.execute(frame); + } + } + } diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/ConversionNodeTests.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/ConversionNodeTests.java index 6243451026..2f710639c4 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/ConversionNodeTests.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/ConversionNodeTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,11 +46,10 @@ import org.junit.function.ThrowingRunnable; import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.objects.exception.PBaseException; import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.builtins.objects.function.Signature; import com.oracle.graal.python.nodes.PRootNode; -import com.oracle.graal.python.nodes.call.CallTargetInvokeNode; +import com.oracle.graal.python.nodes.call.CallDispatchers; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentCastNode; import com.oracle.graal.python.runtime.ExecutionContext.CalleeContext; import com.oracle.graal.python.runtime.ExecutionContext.IndirectCalleeContext; @@ -58,15 +57,16 @@ import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonContext.PythonThreadState; import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.frame.VirtualFrame; public class ConversionNodeTests { - static final Signature SIGNATURE = new Signature(-1, false, -1, false, tsArray("arg"), null); + static final Signature SIGNATURE = new Signature(-1, false, -1, tsArray("arg"), null); protected static Object call(Object arg, ArgumentCastNode castNode) { - PythonLanguage language = PythonLanguage.get(castNode); final PythonContext pythonContext = PythonContext.get(castNode); + PythonLanguage language = pythonContext.getLanguage(castNode); RootCallTarget callTarget = new PRootNode(language) { @Child private CalleeContext calleeContext = CalleeContext.create(); @@ -97,27 +97,26 @@ public boolean isPythonInternal() { }.getCallTarget(); try { Object[] arguments = PArguments.create(1); - PArguments.setGlobals(arguments, pythonContext.factory().createDict()); + PArguments.setGlobals(arguments, PFactory.createDict(language)); PArguments.setException(arguments, PException.NO_EXCEPTION); PArguments.setArgument(arguments, 0, arg); PythonThreadState threadState = pythonContext.getThreadState(language); Object state = IndirectCalleeContext.enter(threadState, arguments, callTarget); try { - return CallTargetInvokeNode.invokeUncached(callTarget, arguments); + return CallDispatchers.SimpleIndirectInvokeNode.executeUncached(callTarget, arguments); } finally { IndirectCalleeContext.exit(threadState, state); } } catch (PException e) { // materialize PException's error message since we are leaving Python - if (e.getUnreifiedException() instanceof PBaseException managedException) { - e.setMessage(managedException.getFormattedMessage()); - } + e.materializeMessage(); throw e; } } protected void expectPythonMessage(String expectedMessage, ThrowingRunnable runnable) { PException exception = Assert.assertThrows(PException.class, runnable); + exception.materializeMessage(); Assert.assertEquals(expectedMessage, exception.getMessage()); } } diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/DirFdConversionNodeTests.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/DirFdConversionNodeTests.java index c50c407a1d..df5386d0be 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/DirFdConversionNodeTests.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/DirFdConversionNodeTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -52,10 +52,11 @@ import org.junit.Before; import org.junit.Test; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.PosixModuleBuiltinsFactory; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.test.PythonTests; public class DirFdConversionNodeTests extends ConversionNodeTests { @@ -108,20 +109,20 @@ public void longTooSmall() { @Test public void pintFitsInt() { - Assert.assertEquals(42, call(factory().createInt(BigInteger.valueOf(42)))); + Assert.assertEquals(42, call(PFactory.createInt(PythonLanguage.get(null), BigInteger.valueOf(42)))); } @Test public void pintTooBig() { expectPythonMessage("OverflowError: fd is greater than maximum", () -> { - call(factory().createInt(BigInteger.ONE.shiftLeft(100))); + call(PFactory.createInt(PythonLanguage.get(null), BigInteger.ONE.shiftLeft(100))); }); } @Test public void pintTooSmall() { expectPythonMessage("OverflowError: fd is less than minimum", () -> { - call(factory().createInt(BigInteger.ONE.shiftLeft(100).negate())); + call(PFactory.createInt(PythonLanguage.get(null), BigInteger.ONE.shiftLeft(100).negate())); }); } @@ -162,10 +163,6 @@ protected static int call(Object arg) { return (int) result; } - private static PythonObjectFactory factory() { - return PythonObjectFactory.getUncached(); - } - private static Object evalValue(String source) { return PythonContext.get(null).getEnv().asGuestValue(Context.getCurrent().eval("python", source)); } diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/FileDescriptorConversionNodeTests.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/FileDescriptorConversionNodeTests.java index fcd75590d8..eeac46c197 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/FileDescriptorConversionNodeTests.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/FileDescriptorConversionNodeTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -52,10 +52,11 @@ import org.junit.Before; import org.junit.Test; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.PosixModuleBuiltinsFactory; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.test.PythonTests; public class FileDescriptorConversionNodeTests extends ConversionNodeTests { @@ -110,20 +111,20 @@ public void longTooSmall() { @Test public void pintFitsInt() { - Assert.assertEquals(42, call(factory().createInt(BigInteger.valueOf(42)))); + Assert.assertEquals(42, call(PFactory.createInt(PythonLanguage.get(null), BigInteger.valueOf(42)))); } @Test public void pintTooBig() { expectPythonMessage("OverflowError: Python int too large to convert to Java int", () -> { - call(factory().createInt(BigInteger.ONE.shiftLeft(100))); + call(PFactory.createInt(PythonLanguage.get(null), BigInteger.ONE.shiftLeft(100))); }); } @Test public void pintTooSmall() { expectPythonMessage("OverflowError: Python int too large to convert to Java int", () -> { - call(factory().createInt(BigInteger.ONE.shiftLeft(100).negate())); + call(PFactory.createInt(PythonLanguage.get(null), BigInteger.ONE.shiftLeft(100).negate())); }); } @@ -166,10 +167,6 @@ protected static int call(Object arg) { return (int) result; } - private static PythonObjectFactory factory() { - return PythonObjectFactory.getUncached(); - } - private static Object evalValue(String source) { return PythonContext.get(null).getEnv().asGuestValue(Context.getCurrent().eval("python", source)); } diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/PathConversionNodeTests.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/PathConversionNodeTests.java index 4e11a6859f..e42ef940fd 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/PathConversionNodeTests.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/modules/PathConversionNodeTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -59,6 +59,7 @@ import org.junit.runners.Parameterized.Parameter; import org.junit.runners.Parameterized.Parameters; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins.PosixFd; import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins.PosixPath; import com.oracle.graal.python.builtins.modules.PosixModuleBuiltinsFactory; @@ -67,7 +68,7 @@ import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.runtime.PosixSupportLibrary.Buffer; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.test.PythonTests; import com.oracle.graal.python.util.Function; import com.oracle.truffle.api.strings.TruffleString; @@ -123,7 +124,7 @@ public void noValueForbiddenWithoutFd() { @Test public void string() { Assert.assertEquals("abc", callAndExpectPath(false, false, T_ABC, false)); - Assert.assertEquals("abc", callAndExpectPath(false, false, factory().createString(T_ABC), false)); + Assert.assertEquals("abc", callAndExpectPath(false, false, PFactory.createString(PythonLanguage.get(null), T_ABC), false)); } @Test @@ -135,16 +136,16 @@ public void stringWithZero() { @Test public void bytes() { - Assert.assertEquals("abc", callAndExpectPath(false, false, factory().createBytes("abc".getBytes()), true)); - Assert.assertEquals("abc", callAndExpectPath(false, true, factory().createBytes("abc".getBytes()), true)); - Assert.assertEquals("abc", callAndExpectPath(true, false, factory().createBytes("abc".getBytes()), true)); - Assert.assertEquals("abc", callAndExpectPath(true, true, factory().createBytes("abc".getBytes()), true)); + Assert.assertEquals("abc", callAndExpectPath(false, false, PFactory.createBytes(PythonLanguage.get(null), "abc".getBytes()), true)); + Assert.assertEquals("abc", callAndExpectPath(false, true, PFactory.createBytes(PythonLanguage.get(null), "abc".getBytes()), true)); + Assert.assertEquals("abc", callAndExpectPath(true, false, PFactory.createBytes(PythonLanguage.get(null), "abc".getBytes()), true)); + Assert.assertEquals("abc", callAndExpectPath(true, true, PFactory.createBytes(PythonLanguage.get(null), "abc".getBytes()), true)); } @Test public void bytesWithZero() { expectPythonMessage("ValueError: fun: embedded null character in arg", () -> { - call(false, false, factory().createBytes("a\0c".getBytes())); + call(false, false, PFactory.createBytes(PythonLanguage.get(null), "a\0c".getBytes())); }); } @@ -221,27 +222,27 @@ public void longForbidden() { @Test public void pintFitsInt() { - Assert.assertEquals(42, callAndExpectFd(factory().createInt(BigInteger.valueOf(42)))); + Assert.assertEquals(42, callAndExpectFd(PFactory.createInt(PythonLanguage.get(null), BigInteger.valueOf(42)))); } @Test public void pintTooBig() { expectPythonMessage("OverflowError: fd is greater than maximum", () -> { - call(false, true, factory().createInt(BigInteger.ONE.shiftLeft(100))); + call(false, true, PFactory.createInt(PythonLanguage.get(null), BigInteger.ONE.shiftLeft(100))); }); } @Test public void pintTooSmall() { expectPythonMessage("OverflowError: fd is less than minimum", () -> { - call(false, true, factory().createInt(BigInteger.ONE.shiftLeft(100).negate())); + call(false, true, PFactory.createInt(PythonLanguage.get(null), BigInteger.ONE.shiftLeft(100).negate())); }); } @Test public void pintForbidden() { expectPythonMessage("TypeError: fun: arg should be string, bytes, os.PathLike or None, not int", () -> { - call(true, false, factory().createInt(BigInteger.valueOf(42))); + call(true, false, PFactory.createInt(PythonLanguage.get(null), BigInteger.valueOf(42))); }); } @@ -386,10 +387,6 @@ protected static Object call(boolean nullable, boolean allowFd, Object arg) { return call(arg, PosixModuleBuiltinsFactory.PathConversionNodeGen.create("fun", "arg", nullable, allowFd)); } - private static PythonObjectFactory factory() { - return PythonObjectFactory.getUncached(); - } - private static Object evalValue(String source) { return PythonContext.get(null).getEnv().asGuestValue(Context.getCurrent().eval("python", source)); } diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/objects/TpSlotsTests.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/objects/TpSlotsTests.java index 72754ddb3f..15edba3d06 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/objects/TpSlotsTests.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/objects/TpSlotsTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -147,6 +147,7 @@ private static boolean getGroup(TpSlots slots, TpSlotGroup group) { case AS_NUMBER -> slots.has_as_number(); case AS_SEQUENCE -> slots.has_as_sequence(); case AS_MAPPING -> slots.has_as_mapping(); + case AS_ASYNC -> slots.has_as_async(); }; } } diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/objects/cext/CExtContextTest.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/objects/cext/CExtContextTest.java index d5d6adcf6d..ea13747810 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/objects/cext/CExtContextTest.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/objects/cext/CExtContextTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -80,8 +80,8 @@ public void testGetBaseName() { } private static class TestCExtContext extends CExtContext { - public TestCExtContext(PythonContext context, Object llvmLibrary) { - super(context, llvmLibrary, false); + public TestCExtContext(PythonContext context, Object library) { + super(context, library); } public static TruffleString getBN(TruffleString s) { diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/objects/dict/PDictTest.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/objects/dict/PDictTest.java index 7219973429..30450f9d61 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/objects/dict/PDictTest.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/builtin/objects/dict/PDictTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -48,11 +48,12 @@ import org.junit.Before; import org.junit.Test; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.common.EconomicMapStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageDelItem; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageLen; import com.oracle.graal.python.builtins.objects.dict.PDict; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.test.PythonTests; import com.oracle.truffle.api.strings.TruffleString; @@ -82,7 +83,7 @@ static int length(PDict dict) { @Test public void economicMapStorageTransition() { - PDict dict = PythonObjectFactory.getUncached().createDict(); + PDict dict = PFactory.createDict(PythonLanguage.get(null)); dict.setItem(ts("key1"), 42); dict.setItem(11, ts("abc")); assertTrue(dict.getDictStorage() instanceof EconomicMapStorage); @@ -91,7 +92,7 @@ public void economicMapStorageTransition() { @Test public void economicMapStorageSet() { - PDict dict = PythonObjectFactory.getUncached().createDict(); + PDict dict = PFactory.createDict(PythonLanguage.get(null)); dict.setItem(11, ts("abc")); assertTrue(dict.getDictStorage() instanceof EconomicMapStorage); @@ -103,7 +104,7 @@ public void economicMapStorageSet() { @Test public void economicMapStorageDel() { - PDict dict = PythonObjectFactory.getUncached().createDict(); + PDict dict = PFactory.createDict(PythonLanguage.get(null)); dict.setItem(11, ts("abc")); dict.setItem(ts("key1"), 42); dict.setItem(ts("key2"), 24); diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/compiler/CompilerTests.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/compiler/CompilerTests.java index a48efd2999..8759293c4a 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/compiler/CompilerTests.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/compiler/CompilerTests.java @@ -51,6 +51,8 @@ import org.hamcrest.CoreMatchers; import org.hamcrest.MatcherAssert; import org.junit.Assert; +import org.junit.Assume; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestName; @@ -64,6 +66,7 @@ import com.oracle.graal.python.pegparser.Parser; import com.oracle.graal.python.pegparser.sst.ModTy; import com.oracle.graal.python.pegparser.tokenizer.SourceRange; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.test.GraalPythonEnvVars; import com.oracle.graal.python.test.PythonTests; @@ -71,6 +74,13 @@ public class CompilerTests extends PythonTests { public CompilerTests() { } + @Before + public void beforeTest() { + // These tests are coupled to the manual bytecode interpreter. They shouldn't run if we're + // using the Bytecode DSL interpreter. + Assume.assumeFalse(PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER); + } + @Rule public TestName name = new TestName(); @Test diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/datatype/PRangeTests.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/datatype/PRangeTests.java index 29ef1d1168..9968028bd0 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/datatype/PRangeTests.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/datatype/PRangeTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -33,11 +33,11 @@ import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.range.PIntRange; import com.oracle.graal.python.builtins.objects.range.PRange; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyObjectGetIter; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.nodes.PGuards; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.test.PythonTests; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; @@ -64,24 +64,20 @@ public void doInsert(Node child) { public void loopWithOnlyStop() throws UnexpectedResultException { PythonTests.enterContext(); try { - PythonObjectFactory factory = PythonObjectFactory.getUncached(); - PRange range = factory.createIntRange(10); + PythonLanguage language = PythonLanguage.get(null); + PRange range = PFactory.createIntRange(language, 10); int index = 0; - TestRoot testRoot = new TestRoot(PythonLanguage.get(factory)); Object iter = PyObjectGetIter.executeUncached(range); - GetNextNode next = GetNextNode.create(); - testRoot.doInsert(next); - IsBuiltinObjectProfile errorProfile = IsBuiltinObjectProfile.getUncached(); while (true) { try { - int item = next.executeInt(null, iter); + Object next = PyIterNextNode.executeUncached(iter); + int item = PGuards.expectInteger(next); assertEquals(index, item); - } catch (PException e) { - e.expectStopIteration(null, errorProfile); + index++; + } catch (IteratorExhausted e) { break; } - index++; } } finally { PythonTests.closeContext(); @@ -92,24 +88,20 @@ public void loopWithOnlyStop() throws UnexpectedResultException { public void loopWithStep() throws UnexpectedResultException { PythonTests.enterContext(); try { - PythonObjectFactory factory = PythonObjectFactory.getUncached(); - PRange range = PythonObjectFactory.getUncached().createIntRange(0, 10, 2, 5); + PythonLanguage language = PythonLanguage.get(null); + PRange range = PFactory.createIntRange(language, 0, 10, 2, 5); int index = 0; - TestRoot testRoot = new TestRoot(PythonLanguage.get(factory)); Object iter = PyObjectGetIter.executeUncached(range); - GetNextNode next = GetNextNode.create(); - testRoot.doInsert(next); - IsBuiltinObjectProfile errorProfile = IsBuiltinObjectProfile.getUncached(); while (true) { try { - int item = next.executeInt(null, iter); + Object next = PyIterNextNode.executeUncached(iter); + int item = PGuards.expectInteger(next); assertEquals(index, item); - } catch (PException e) { - e.expectStopIteration(null, errorProfile); + index += 2; + } catch (IteratorExhausted e) { break; } - index += 2; } } finally { PythonTests.closeContext(); @@ -120,7 +112,7 @@ public void loopWithStep() throws UnexpectedResultException { public void getItem() { PythonTests.enterContext(); try { - PIntRange range = PythonObjectFactory.getUncached().createIntRange(10); + PIntRange range = PFactory.createIntRange(PythonLanguage.get(null), 10); assertEquals(3, range.getIntItemNormalized(3)); } finally { PythonTests.closeContext(); diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/debug/PythonDebugTest.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/debug/PythonDebugTest.java index a791938d00..e18a7f9ae5 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/debug/PythonDebugTest.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/debug/PythonDebugTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -59,6 +59,7 @@ import org.graalvm.polyglot.Context.Builder; import org.graalvm.polyglot.Source; import org.junit.After; +import org.junit.Assume; import org.junit.Before; import org.junit.Test; @@ -92,6 +93,7 @@ public void dispose() { @Test public void testSteppingAsExpected() throws Throwable { + Assume.assumeFalse("TODO: debugger tests are broken on Bytecode DSL", Boolean.getBoolean("python.EnableBytecodeDSLInterpreter")); // test that various elements step as expected, including generators, statement level atomic // expressions, and roots final Source source = Source.newBuilder("python", "" + @@ -184,6 +186,7 @@ public void testSteppingAsExpected() throws Throwable { @Test public void testException() throws Throwable { + Assume.assumeFalse("TODO: debugger tests are broken on Bytecode DSL", Boolean.getBoolean("python.EnableBytecodeDSLInterpreter")); final Source source = Source.newBuilder("python", "" + "try:\n" + " 1 / 0\n" + @@ -207,6 +210,7 @@ public void testException() throws Throwable { @Test public void testInlineEvaluation() throws Throwable { + Assume.assumeFalse("TODO: debugger tests are broken on Bytecode DSL", Boolean.getBoolean("python.EnableBytecodeDSLInterpreter")); final Source source = Source.newBuilder("python", "" + "y = 4\n" + "def foo(x):\n" + @@ -241,6 +245,7 @@ public void testInlineEvaluation() throws Throwable { @Test @SuppressWarnings("try") public void testBreakpointBuiltin() throws Throwable { + Assume.assumeFalse("TODO: debugger tests are broken on Bytecode DSL", Boolean.getBoolean("python.EnableBytecodeDSLInterpreter")); final Source source = Source.newBuilder("python", "" + "def foo():\n" + " a = 1\n" + @@ -262,6 +267,7 @@ public void testBreakpointBuiltin() throws Throwable { @Test public void testConditionalBreakpointInFunction() throws Throwable { + Assume.assumeFalse("TODO: debugger tests are broken on Bytecode DSL", Boolean.getBoolean("python.EnableBytecodeDSLInterpreter")); final Source source = Source.newBuilder("python", "" + "def fun():\n" + " def prod(n):\n" + @@ -307,6 +313,7 @@ public void testConditionalBreakpointInFunction() throws Throwable { @Test public void testConditionalBreakpointGlobal() throws Throwable { + Assume.assumeFalse("TODO: debugger tests are broken on Bytecode DSL", Boolean.getBoolean("python.EnableBytecodeDSLInterpreter")); final Source source = Source.newBuilder("python", "" + "values = []\n" + "for i in range(0, 10):\n" + @@ -330,6 +337,7 @@ public void testConditionalBreakpointGlobal() throws Throwable { @Test public void testReenterArgumentsAndValues() throws Throwable { + Assume.assumeFalse("TODO: debugger tests are broken on Bytecode DSL", Boolean.getBoolean("python.EnableBytecodeDSLInterpreter")); // Test that after a re-enter, arguments are kept and variables are cleared. final Source source = Source.newBuilder("python", "" + "def main():\n" + @@ -384,6 +392,7 @@ public void testReenterArgumentsAndValues() throws Throwable { @Test @SuppressWarnings("deprecation") public void testGettersSetters() throws Throwable { + Assume.assumeFalse("TODO: debugger tests are broken on Bytecode DSL", Boolean.getBoolean("python.EnableBytecodeDSLInterpreter")); final Source source = Source.newBuilder("python", "" + "class GetterOnly:\n" + " def __get__(self):\n" + @@ -453,6 +462,7 @@ public void testGettersSetters() throws Throwable { @Test public void testInspectJavaArray() throws Throwable { + Assume.assumeFalse("TODO: debugger tests are broken on Bytecode DSL", Boolean.getBoolean("python.EnableBytecodeDSLInterpreter")); final Source source = Source.newBuilder("python", "" + "import java\n" + "a_int = java.type('int[]')(3)\n" + @@ -498,6 +508,7 @@ public void testInspectJavaArray() throws Throwable { @Test public void testSourceFileURI() throws Throwable { + Assume.assumeFalse("TODO: debugger tests are broken on Bytecode DSL", Boolean.getBoolean("python.EnableBytecodeDSLInterpreter")); if (System.getProperty("os.name").toLowerCase().contains("mac")) { // on the mac machines we run with symlinked directories and such and it's annoying to // cater for that diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/interop/ArgsKwArgsTest.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/interop/ArgsKwArgsTest.java new file mode 100644 index 0000000000..ed09b646df --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/interop/ArgsKwArgsTest.java @@ -0,0 +1,293 @@ +/* + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.test.interop; + +import com.oracle.graal.python.test.PythonTests; +import org.graalvm.polyglot.Context; +import org.graalvm.polyglot.PolyglotException; +import org.graalvm.polyglot.Value; +import org.graalvm.python.embedding.KeywordArguments; +import org.graalvm.python.embedding.PositionalArguments; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; + +public class ArgsKwArgsTest extends PythonTests { + private Context context; + + @Before + public void setUpTest() { + Context.Builder builder = Context.newBuilder(); + builder.allowExperimentalOptions(true); + builder.allowAllAccess(true); + context = builder.build(); + } + + @After + public void tearDown() { + context.close(); + } + + private Value run(String evalString) { + return context.eval("python", evalString); + } + + @Test + public void testPositionalArgs01() { + // @formatter:off + Value module = run(""" + def sum(*args): + result = 0 + for arg in args: + result = result + arg + return result; + """ + ); + + assertEquals(0, module.invokeMember("sum").asInt()); + assertEquals(22, module.invokeMember("sum", 22).asInt()); + assertEquals(60, module.invokeMember("sum", 10, 20, 30).asInt()); + assertEquals(6, module.invokeMember("sum", PositionalArguments.of(1, 2, 3)).asInt()); + + assertEquals(0, module.invokeMember("sum", PositionalArguments.of()).asInt()); + assertEquals(0, module.invokeMember("sum", KeywordArguments.from(Map.of())).asInt()); + + PolyglotException pe = assertThrows(PolyglotException.class, () -> { + assertEquals(0, module.invokeMember("sum", KeywordArguments.of("one", 1)).asInt()); + }); + assertEquals("TypeError: sum() got an unexpected keyword argument 'one'", pe.getMessage()); + + } + + @Test + public void testPositionalArgs02() { + // @formatter:off + Value module = run(""" + def text(a, *args): + result = f'{a=},' + index = 0 + for arg in args: + result = result + f'args[{index}]={arg},' + index += 1 + return result; + """ + ); + + assertEquals("a=0,", module.invokeMember("text", 0).asString()); + assertEquals("a=22,args[0]=33,", module.invokeMember("text", 22, 33).asString()); + assertEquals("a='hello',args[0]=ahoj,args[1]=cau,", module.invokeMember("text", "hello", "ahoj", "cau").asString()); + assertEquals("a='6',args[0]=1,args[1]=2,args[2]=3,", module.invokeMember("text", "6", PositionalArguments.of(1, 2, 3)).asString()); + assertEquals("a=1,args[0]=2,args[1]=3,", module.invokeMember("text", PositionalArguments.of(1, 2, 3)).asString()); + assertEquals("a=1,", module.invokeMember("text", PositionalArguments.of(1)).asString()); + + assertEquals("a=1,", module.invokeMember("text", KeywordArguments.of("a", 1)).asString()); + + PolyglotException pe = assertThrows(PolyglotException.class, () -> { + module.invokeMember("text", KeywordArguments.of("a", 1, "b", 2)); + }); + assertEquals("TypeError: text() got an unexpected keyword argument 'b'", pe.getMessage()); + } + + @Test + public void testPositionalArgs03() { + // @formatter:off + Value module = run(""" + def text(a,b=44, *args): + result = f'{a=},{b=},' + index = 0 + for arg in args: + result = result + f'args[{index}]={arg},' + index += 1 + return result; + """ + ); + + assertEquals("a=0,b=44,", module.invokeMember("text", 0).asString()); + assertEquals("a=22,b=33,", module.invokeMember("text", 22, 33).asString()); + assertEquals("a='hello',b='ahoj',args[0]=cau,", module.invokeMember("text", "hello", "ahoj", "cau").asString()); + assertEquals("a='6',b=1,args[0]=2,args[1]=3,", module.invokeMember("text", "6", PositionalArguments.of(1, 2, 3)).asString()); + assertEquals("a=1,b=44,", module.invokeMember("text", PositionalArguments.of(1)).asString()); + assertEquals("a=1,b=2,", module.invokeMember("text", PositionalArguments.of(1, 2)).asString()); + assertEquals("a=1,b=2,args[0]=3,", module.invokeMember("text", PositionalArguments.of(1, 2, 3)).asString()); + assertEquals("a='a',b='b',args[0]=1,args[1]=2,args[2]=3,", module.invokeMember("text", "a", "b", PositionalArguments.of(1, 2, 3)).asString()); + } + + private static String assertAllKeysInText(String text, Map kwArgs) { + String rest = text; + for (Map.Entry entry : kwArgs.entrySet()) { + String key = entry.getKey(); + Object val = entry.getValue(); + String keyVal = "[" + key + ":" + val.toString() + "],"; + assertTrue("The string \"" + keyVal + "\" was not found in \"" + text + "\"", text.contains(keyVal)); + rest = rest.replace(keyVal, ""); + } + return rest; + } + + @Test + public void testKwArgs01() { + // @formatter:off + Value module = run(""" + def text(**kwArgs): + result = '' + for key, value in kwArgs.items(): + result = result + f'[{key}:{str(value)}],' + return result + """ + ); + + assertEquals("", module.invokeMember("text").asString()); + assertEquals("", module.invokeMember("text", KeywordArguments.from(Map.of())).asString()); + + Map kwargsMap = Map.of("key1", 1); + String remaining = assertAllKeysInText(module.invokeMember("text", KeywordArguments.from(kwargsMap)).asString(), kwargsMap); + assertTrue(remaining.isEmpty()); + + kwargsMap = Map.of("key1", 1, "key2", 22); + remaining = assertAllKeysInText(module.invokeMember("text", KeywordArguments.from(kwargsMap)).asString(), kwargsMap); + assertTrue(remaining.isEmpty()); + + assertTrue(module.invokeMember("text", PositionalArguments.of()).asString().isEmpty()); + + PolyglotException pe = assertThrows(PolyglotException.class, () -> { + module.invokeMember("text", PositionalArguments.of(44)).asString(); + }); + assertEquals("TypeError: text() takes 0 positional arguments but 1 was given", pe.getMessage()); + } + + @Test + public void testKwArgs02() { + // @formatter:off + Value module = run(""" + def text(*,named1, **kwArgs): + result = f'[named1:{str(named1)}],' + for key, value in kwArgs.items(): + result = result + f'[{key}:{str(value)}],' + return result + """ + ); + + Map kwargsMap = Map.of("named1", 1); + String remaining = assertAllKeysInText(module.invokeMember("text", KeywordArguments.from(kwargsMap)).asString(), kwargsMap); + assertTrue(remaining.isEmpty()); + + kwargsMap = Map.of("named1", 1, "named2", 2); + remaining = assertAllKeysInText(module.invokeMember("text", KeywordArguments.from(kwargsMap)).asString(), kwargsMap); + assertTrue(remaining.isEmpty()); + + PolyglotException pe = assertThrows(PolyglotException.class, () -> { + module.invokeMember("text").asString(); + }); + assertEquals("TypeError: text() missing 1 required keyword-only argument: 'named1'", pe.getMessage()); + + pe = assertThrows(PolyglotException.class, () -> { + module.invokeMember("text", KeywordArguments.from(Map.of())).asString(); + }); + assertEquals("TypeError: text() missing 1 required keyword-only argument: 'named1'", pe.getMessage()); + + pe = assertThrows(PolyglotException.class, () -> { + module.invokeMember("text", KeywordArguments.of("named2", 10)).asString(); + }); + assertEquals("TypeError: text() missing 1 required keyword-only argument: 'named1'", pe.getMessage()); + + pe = assertThrows(PolyglotException.class, () -> { + module.invokeMember("text", PositionalArguments.of()).asString(); + }); + assertEquals("TypeError: text() missing 1 required keyword-only argument: 'named1'", pe.getMessage()); + + pe = assertThrows(PolyglotException.class, () -> { + module.invokeMember("text", PositionalArguments.of(10)).asString(); + }); + assertEquals("TypeError: text() takes 0 positional arguments but 1 was given", pe.getMessage()); + } + + @Test + public void testKwArgs03() { + // @formatter:off + Value module = run(""" + def text(*,named1, named2=44, **kwArgs): + result = f'[named1:{str(named1)}],[named2:{str(named2)}],' + for key, value in kwArgs.items(): + result = result + f'[{key}:{str(value)}],' + return result + """ + ); + + Map kwargsMap = Map.of("named1", 1); + String remaining = assertAllKeysInText(module.invokeMember("text", KeywordArguments.from(kwargsMap)).asString(), kwargsMap); + assertEquals("[named2:44],", remaining); + + kwargsMap = Map.of("named1", 1, "named2", 2); + remaining = assertAllKeysInText(module.invokeMember("text", KeywordArguments.from(kwargsMap)).asString(), kwargsMap); + assertTrue(remaining.isEmpty()); + } + + @Test + public void testKwArgs04() { + // @formatter:off + Value module = run(""" + def text(*,named1, named2=44): + result = f'[named1:{str(named1)}],[named2:{str(named2)}],' + return result + """ + ); + + Map kwargsMap = Map.of("named1", 1); + String remaining = module.invokeMember("text", KeywordArguments.from(kwargsMap)).asString(); + assertEquals("[named1:1],[named2:44],", remaining); + + kwargsMap = Map.of("named1", 1, "named2", 2); + remaining = module.invokeMember("text", KeywordArguments.from(kwargsMap)).asString(); + assertEquals("[named1:1],[named2:2],", remaining); + + PolyglotException pe = assertThrows(PolyglotException.class, () -> { + module.invokeMember("text", + module.invokeMember("text", KeywordArguments.of("named1", 1, "named2", 2, "named3", 3))).asString(); + }); + assertEquals("TypeError: text() got an unexpected keyword argument 'named3'", pe.getMessage()); + } +} diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/nodes/MemMoveNodeTests.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/nodes/MemMoveNodeTests.java index 81d36099ae..bd47cccece 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/nodes/MemMoveNodeTests.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/nodes/MemMoveNodeTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -54,18 +54,27 @@ import com.oracle.truffle.api.nodes.RootNode; import org.junit.After; import org.junit.Assert; +import org.junit.Assume; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; +import java.util.Map; + public class MemMoveNodeTests { private GilNode.UncachedAcquire gil; + @BeforeClass + public static void setUpClass() { + Assume.assumeFalse(System.getProperty("os.name").toLowerCase().contains("mac")); + } + @Before public void setUp() { - PythonTests.enterContext(); + PythonTests.enterContext(Map.of("python.IsolateNativeModules", "true"), new String[0]); this.gil = GilNode.uncachedAcquire(); - CApiContext.ensureCapiWasLoaded(); + CApiContext.ensureCapiWasLoaded("internal"); } @After diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/nodes/util/CastToJavaUnsignedLongNodeTests.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/nodes/util/CastToJavaUnsignedLongNodeTests.java index 97524bb859..7be63c54d2 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/nodes/util/CastToJavaUnsignedLongNodeTests.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/nodes/util/CastToJavaUnsignedLongNodeTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -50,17 +50,16 @@ import org.junit.Before; import org.junit.Test; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.util.CastToJavaUnsignedLongNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.test.PythonTests; public class CastToJavaUnsignedLongNodeTests { - private static PythonObjectFactory factory = PythonObjectFactory.getUncached(); - @Before public void setUp() { PythonTests.enterContext(); @@ -127,11 +126,11 @@ public void nonInteger() { } private static PInt makePInt(long l) { - return factory.createInt(BigInteger.valueOf(l)); + return PFactory.createInt(PythonLanguage.get(null), BigInteger.valueOf(l)); } private static PInt makePInt(String hexString) { - return factory.createInt(new BigInteger(hexString, 16)); + return PFactory.createInt(PythonLanguage.get(null), new BigInteger(hexString, 16)); } private static void expect(PythonBuiltinClassType errorType, Runnable test) { diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/objects/ObjectHashMapTests.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/objects/ObjectHashMapTests.java index 7642257689..fe98a5a63f 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/objects/ObjectHashMapTests.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/objects/ObjectHashMapTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -67,9 +67,10 @@ import com.oracle.graal.python.builtins.objects.common.ObjectHashMap; import com.oracle.graal.python.builtins.objects.common.ObjectHashMap.MapCursor; import com.oracle.graal.python.builtins.objects.common.ObjectHashMap.PopNode; +import com.oracle.graal.python.builtins.objects.common.ObjectHashMap.PutUnsafeNode; import com.oracle.graal.python.lib.PyObjectHashNode; import com.oracle.graal.python.lib.PyObjectRichCompareBool; -import com.oracle.graal.python.lib.PyObjectRichCompareBool.Comparison; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.nodes.Node; @@ -86,9 +87,9 @@ public static final class DictKey implements TruffleObject { } } - private static final class EqNodeStub extends PyObjectRichCompareBool.EqNode { + private static final class EqNodeStub extends PyObjectRichCompareBool { @Override - protected boolean execute(Frame frame, Node inliningTarget, Object a, Object b, Comparison cmp) { + public boolean execute(Frame frame, Node inliningTarget, Object a, Object b, RichCmpOp cmp) { // Sanity check: we do not use any other keys in the tests assert a instanceof Long || a instanceof DictKey; assert b instanceof Long || b instanceof DictKey; @@ -100,7 +101,7 @@ protected boolean execute(Frame frame, Node inliningTarget, Object a, Object b, @Test public void testCollisionsByPuttingManyKeysWithSameHash() { - ObjectHashMap map = new ObjectHashMap(); + ObjectHashMap map = new ObjectHashMap(true); LinkedHashMap expected = new LinkedHashMap<>(); for (int i = 0; i < 100; i++) { DictKey key = new DictKey(42); @@ -126,7 +127,7 @@ public void testCollisionsByPuttingManyKeysWithSameHash() { @Test public void testCollisionsByPuttingAndRemovingTheSameKey() { - ObjectHashMap map = new ObjectHashMap(); + ObjectHashMap map = new ObjectHashMap(true); LinkedHashMap expected = new LinkedHashMap<>(); DictKey key = new DictKey(42); for (int i = 0; i < 100; i++) { @@ -143,7 +144,7 @@ public void testCollisionsByPuttingAndRemovingTheSameKey() { @Test public void testCollisionsByPuttingAndRemovingTheSameKeys() { - ObjectHashMap map = new ObjectHashMap(); + ObjectHashMap map = new ObjectHashMap(true); LinkedHashMap expected = new LinkedHashMap<>(); DictKey[] keys = new DictKey[]{new DictKey(42), new DictKey(1)}; for (int i = 0; i < 100; i++) { @@ -162,7 +163,7 @@ public void testCollisionsByPuttingAndRemovingTheSameKeys() { @Test public void testLongHashMapStressTest() { - ObjectHashMap map = new ObjectHashMap(); + ObjectHashMap map = new ObjectHashMap(true); // put/remove many random (with fixed seed) keys, check consistency against LinkedHashMap testBasics(map); @@ -373,7 +374,7 @@ private static void remove(ObjectHashMap map, Object key, long hash) { private static void put(ObjectHashMap map, Object key, long hash, Object value) { InlinedCountingConditionProfile uncachedCounting = InlinedCountingConditionProfile.getUncached(); - ObjectHashMap.PutNode.doPutWithRestart(null, null, map, key, hash, value, + PutUnsafeNode.doPutWithRestart(null, null, map, key, hash, value, InlinedBranchProfile.getUncached(), uncachedCounting, uncachedCounting, uncachedCounting, uncachedCounting, InlinedBranchProfile.getUncached(), InlinedBranchProfile.getUncached(), new EqNodeStub()); diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/runtime/PythonModuleTests.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/runtime/PythonModuleTests.java index d702d04fbf..ead733eca1 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/runtime/PythonModuleTests.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/runtime/PythonModuleTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2022, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -47,6 +47,7 @@ import com.oracle.graal.python.nodes.SpecialMethodNames; import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.test.PythonTests; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.RootNode; @@ -91,7 +92,7 @@ public void tearDown() { @Test public void pythonModuleTest() { - PythonModule module = context.factory().createPythonModule(tsLiteral("testModule")); + PythonModule module = PFactory.createPythonModule(context.getLanguage(), tsLiteral("testModule")); assertEquals("testModule", module.getAttribute(T___NAME__).toString()); assertEquals("None", module.getAttribute(T___DOC__).toString()); assertEquals("None", module.getAttribute(T___PACKAGE__).toString()); diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/shell/TestPathResolution.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/shell/TestPathResolution.java index 31076b3d99..54c2b236c8 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/shell/TestPathResolution.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/shell/TestPathResolution.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,7 +43,7 @@ import java.lang.reflect.Method; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.function.Function; +import java.util.function.Predicate; import org.junit.Assert; import org.junit.Before; @@ -57,11 +57,11 @@ public class TestPathResolution { @Before public void setup() throws NoSuchMethodException { // Use reflection to avoid exposing the method in public API - calculateProgramFullPathMethod = GraalPythonMain.class.getDeclaredMethod("calculateProgramFullPath", String.class, Function.class, String.class); + calculateProgramFullPathMethod = GraalPythonMain.class.getDeclaredMethod("calculateProgramFullPath", String.class, Predicate.class, String.class); calculateProgramFullPathMethod.setAccessible(true); } - public String calculateProgramFullPath(String executable, Function isExecutable, String path) { + public String calculateProgramFullPath(String executable, Predicate isExecutable, String path) { try { return (String) calculateProgramFullPathMethod.invoke(new GraalPythonMain(), executable, isExecutable, path); } catch (Throwable e) { diff --git a/graalpython/com.oracle.graal.python.test/src/compare_unittests.py b/graalpython/com.oracle.graal.python.test/src/compare_unittests.py deleted file mode 100644 index bc44263b19..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/compare_unittests.py +++ /dev/null @@ -1,98 +0,0 @@ -# Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# The Universal Permissive License (UPL), Version 1.0 -# -# Subject to the condition set forth below, permission is hereby granted to any -# person obtaining a copy of this software, associated documentation and/or -# data (collectively the "Software"), free of charge and under any and all -# copyright rights in the Software, and any and all patent rights owned or -# freely licensable by each licensor hereunder covering either (i) the -# unmodified Software as contributed to or provided by such licensor, or (ii) -# the Larger Works (as defined below), to deal in both -# -# (a) the Software, and -# -# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if -# one is included with the Software each a "Larger Work" to which the Software -# is contributed by such licensors), -# -# without restriction, including without limitation the rights to copy, create -# derivative works of, display, perform, and distribute the Software and make, -# use, sell, offer for sale, import, export, have made, and have sold the -# Software and the Larger Work(s), and to sublicense the foregoing rights on -# either these or other terms. -# -# This license is subject to the following condition: -# -# The above copyright notice and either this complete permission notice or at a -# minimum a reference to the UPL must be included in all copies or substantial -# portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import sys -import csv -import argparse - -def read_file(filename): - with open(filename) as csvfile: - return {x["unittest"]:x for x in csv.DictReader(csvfile) if x["unittest"] != "TOTAL"} - -# ---------------------------------------------------------------------------------------------------------------------- -# -# main tool -# -# ---------------------------------------------------------------------------------------------------------------------- -def main(prog, args): - parser = argparse.ArgumentParser(prog=prog, - description="Compare the result of two runs of the standard python unittests based on their csv reports.") - parser.add_argument("-v", "--verbose", help="Verbose output.", action="https://github.com/store_true") - parser.add_argument("csvfile1", help="first input csv file") - parser.add_argument("csvfile2", help="first input csv file") - - global flags - flags = parser.parse_args(args=args) - print("comparing {} and {}".format(flags.csvfile1, flags.csvfile2)) - - raw1 = read_file(flags.csvfile1) - raw2 = read_file(flags.csvfile2) - print("number of entries: {} / {}".format(len(raw1.keys()), len(raw2.keys()))) - - result = [] - missing_tests = [] - new_tests = [] - for name, data in raw1.items(): - other_data = raw2.get(name) - if other_data: - result.append({'name':name, 'old_passing':int(data['num_passes']), 'new_passing':int(other_data['num_passes'])}) - else: - missing_tests.append(name) - - for name in raw2.keys(): - if not raw1.get(name): - new_tests.append(name) - - def custom(a): - return (a['new_passing'] - a['old_passing']) * 1000000 + a['old_passing'] - - result = sorted(result, key=custom) - - RED = u"\u001b[31m" - GREEN = u"\u001b[32m" - RESET = u"\u001b[0m" - - for entry in result: - delta = entry['new_passing'] - entry['old_passing'] - if delta != 0: - print("%s%30s: %d (from %d to %d passing tests)" % (GREEN if delta > 0 else RED, entry['name'], delta, entry['old_passing'], entry['new_passing'])) - print(RESET) - -if __name__ == "__main__": - main(sys.argv[0], sys.argv[1:]) diff --git a/graalpython/com.oracle.graal.python.test/src/graalpytest.py b/graalpython/com.oracle.graal.python.test/src/graalpytest.py deleted file mode 100644 index 61fc8ecc45..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/graalpytest.py +++ /dev/null @@ -1,953 +0,0 @@ -# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# The Universal Permissive License (UPL), Version 1.0 -# -# Subject to the condition set forth below, permission is hereby granted to any -# person obtaining a copy of this software, associated documentation and/or -# data (collectively the "Software"), free of charge and under any and all -# copyright rights in the Software, and any and all patent rights owned or -# freely licensable by each licensor hereunder covering either (i) the -# unmodified Software as contributed to or provided by such licensor, or (ii) -# the Larger Works (as defined below), to deal in both -# -# (a) the Software, and -# -# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if -# one is included with the Software each a "Larger Work" to which the Software -# is contributed by such licensors), -# -# without restriction, including without limitation the rights to copy, create -# derivative works of, display, perform, and distribute the Software and make, -# use, sell, offer for sale, import, export, have made, and have sold the -# Software and the Larger Work(s), and to sublicense the foregoing rights on -# either these or other terms. -# -# This license is subject to the following condition: -# -# The above copyright notice and either this complete permission notice or at a -# minimum a reference to the UPL must be included in all copies or substantial -# portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -#!/usr/bin/env mx python -import os -from os.path import dirname, join -import os.path as ospath -import _io -import sys -import time -import _thread -import collections -import tempfile - - -# A list of tests that cannot run in parallel with other tests -SERIAL_TESTS = [ - # test_compileall tries to recompile the whole PYTHONPATH, which makes it interfere with any test that - # creates temporary py files - 'test_compileall', - # test_import tests various behaviors related to __pycache__ directory, - # it can interfere with other tests that generate code - 'test_import', - 'test_imp', - 'test_subprocess', - 'test_posix', - 'test_os', - 'test_io', - 'test_fileio', - 'test_imaplib', - "test_ftplib", - 'test_multiprocessing_spawn', - 'test_multiprocessing_graalpy', - # trying to avoid transient issues there, not sure about the reason - 'test_unittest', - 'test_glob', - 'test_logging', - # test_int contains a denial-of-service prevention test that requires to finish within a certain time. - # We are actually fast enough but the parallel execution overhead can cause transient failures. - 'test_int', -] - -# A list of tests with minor transient issues, which can be retried once -TRANSIENTS = [ - 'test_multiprocessing_spawn', - 'test_weakref', - 'test_ssl', - 'test_threading', - 'test_asyncio', -] - -os = sys.modules.get("posix", sys.modules.get("nt", None)) -if os is None: - raise ImportError("posix or nt module is required in builtin modules") - - -def getenv(strname, strdefault=""): - """ - Deal with difference between nt.environ and posix.environ - """ - default = object() - strvalue = os.environ.get(strname, default) - if strvalue is not default: - return strvalue - bytesvalue = os.environ.get(strname.encode(), default) - if bytesvalue is not default: - return bytesvalue.decode() - return strdefault - - -FAIL = '\033[91m' -RETRY = '\033[93m' -ENDC = '\033[0m' -BOLD = '\033[1m' - -class SkipTest(BaseException): - pass - -_fixture_scopes = {"session": {}, "module": {}, "function": {}} -_fixture_marks = [] -_itertools_module = None -_request_class = collections.namedtuple("request", "param config") -_loaded_conftest = {} -_created_tmp_dirs = [] - -class RequestConfig: - def getoption(self, name): - return False - - -class Fixture: - def __init__(self, fun, **kwargs): - self.fun = fun - co = fun.__code__ - self.requests_context = "request" in co.co_varnames[:co.co_argcount] - self.params = kwargs.get("params", []) - self._values = None - - def eval(self, test_class_instance): - values = [] - if self.params: - for param in self.params: - values.extend(self._call_fixture_func(test_class_instance, _request_class(param=param, config=RequestConfig()))) - else: - values.extend(self._call_fixture_func(test_class_instance, _request_class(param=None, config=RequestConfig()))) - self._values = values - return values - - def _call_fixture_func(self, test_class_instance, request): - co = self.fun.__code__ - fixture_args = [] - start = 1 if self.requests_context else 0 - has_self = False - if co.co_argcount > start: - arg_names = co.co_varnames[start:co.co_argcount] - has_self = arg_names and arg_names[0] == "self" - if has_self: - arg_names = arg_names[1:] - fixture_args = get_fixture_values(test_class_instance, arg_names) - results = [] - fixed_args = ((test_class_instance, ) if has_self else tuple()) + ((request, ) if self.requests_context else tuple()) - if fixture_args: - for arg_vec in fixture_args: - args = fixed_args + arg_vec - results.append(self.fun(*args)) - else: - results.append(self.fun(*fixed_args)) - return results - - def values(self): - return self._values - - def name(self): - return self.fun.__name__ - - -class GraalPyTempdir: - def __init__(self, path): - assert isinstance(path, str) - self._path = path - - def __fspath__(self): - return self._path - - def __str__(self): - return self._path - - def join(self, *args): - res = ospath.join(self._path, *args) - return GraalPyTempdir(res) - - def write(self, data, mode='w', ensure=False): - with open(self._path, mode) as f: - f.write(data) - - -def eval_fixture(name, test_class_instance): - """ - Evaluate a fixtures with default scope (=function). - """ - # TODO remove special handling - if name == "tmpdir": - tmp_dir = tempfile.mkdtemp() - global _created_tmp_dirs - _created_tmp_dirs.append(tmp_dir) - return [GraalPyTempdir(tmp_dir)] - - fixture = _fixture_scopes["function"].get(name) - if fixture: - assert name == fixture.name() - return fixture.eval(test_class_instance) - raise ValueError("unknown fixture " + name) - - -def eval_scope(scope): - """ - Evaluate fixtures in the given scope. - """ - for name, f in _fixture_scopes[scope].items(): - assert name == f.name() - f.eval(None) - - -def is_existing_fixture(name): - """ - Search in all scopes if there is a fixture with the given name. - """ - for scope in _fixture_scopes.values(): - if scope.get(name): - return True - return False - - -def get_fixture_values(test_class_instance, names): - """ - Computes a list of argument vectors for the given fixture names. - It's a list because of parameterized fixtures that cause a cartesian product of all fixture values. - """ - result_vector = [] - for fixture_name in names: - for scope_name, scope in _fixture_scopes.items(): - # fixtures in higher scope are already eval'd - if scope_name == "session" or scope_name == "module": - fixture = scope.get(fixture_name) - if fixture: - # evaluate fixtures on demand (could be that we loaded it after the e.g. the session was started) - fvals = fixture.values() - if not fvals: - fvals = fixture.eval(None) - result_vector.append(fvals) - # will break only the inner loop - break - elif scope_name == "function": - result_vector.append(eval_fixture(fixture_name, test_class_instance)) - # will break only the inner loop - break - else: - raise ValueError("unknown scope {}".format(scope_name)) - global _itertools_module - if not _itertools_module: - import itertools as _itertools_module - return list(_itertools_module.product(*result_vector)) - -_skipped_marker = object() - -class Mark: - @staticmethod - def usefixtures(*args): - global _fixture_marks - _fixture_marks += args - def decorator(obj): - return obj - return decorator - - @staticmethod - def xfail(cond, *args, **kwargs): - def xfail_decorator(obj): - if cond: - def foo(self): - pass - foo.__name__ = obj.__name__ - return foo - return obj - return xfail_decorator - -def _pytest_fixture_maker(*args, **kwargs): - def _fixture_decorator(fun): - scope = kwargs.get("scope", "function") - fixture = Fixture(fun, **kwargs) - _fixture_scopes[scope][fixture.name()] = fixture - return fun - - if len(args) == 1 and callable(args[0]): - return _fixture_decorator(args[0]) - return _fixture_decorator - -def _pytest_skip(): - raise SkipTest - -_pytest_module = type(os)("pytest") -_pytest_module.mark = Mark() -_pytest_module.fixture = _pytest_fixture_maker -_pytest_module.raises = lambda x: TestCase.assertRaisesRegex(x, None) -_pytest_module.skip = _pytest_skip -sys.modules["pytest"] = _pytest_module - -verbose = False -reportfile = None - -def _cleanup_tempdirs(): - import shutil - # remove all created temp dirs - global _created_tmp_dirs, verbose - if verbose: - print("Cleaning temp dirs: {!r}".format(_created_tmp_dirs)) - for tmp_dir in _created_tmp_dirs: - shutil.rmtree(tmp_dir, ignore_errors=True) - _created_tmp_dirs = [] - - -print_lock = _thread.RLock() -class ThreadPool(): - cnt_lock = _thread.RLock() - cnt = 0 - if getenv("ENABLE_THREADED_GRAALPYTEST") == "true": - maxcnt = min(os.cpu_count(), 16) - sleep = time.sleep - start_new_thread = _thread.start_new_thread - print("Running with %d threads" % maxcnt) - else: - sleep = lambda x: x - start_new_thread = lambda f, args: f(*args) - maxcnt = 1 - print("Running single threaded") - - @classmethod - def start(self, function): - self.acquire_token() - def runner(): - try: - function() - finally: - self.release_token() - self.start_new_thread(runner, ()) - - @classmethod - def acquire_token(self): - while True: - with self.cnt_lock: - if self.cnt < self.maxcnt: - self.cnt += 1 - break - self.sleep(0.1) - - @classmethod - def release_token(self): - with self.cnt_lock: - self.cnt -= 1 - - @classmethod - def shutdown(self): - self.sleep(0.1) - while self.cnt > 0: - self.sleep(0.1) - - -def dump_truffle_ast(func): - try: - print(__dump_truffle_ast__(func)) - except: - pass - - -fail_fast = getenv("GRAALPYTEST_FAIL_FAST") == "true" -exitting = False - - -class TestCase(object): - def __init__(self): - self.exceptions = [] - self.passed = 0 - self.failed = 0 - self.skipped_n = 0 - - def get_useful_frame(self, tb): - from traceback import extract_tb - frame_summaries = extract_tb(tb) - frame_summaries.reverse() - for summary in frame_summaries: - # Skip frame summary entries that refer to this file. These summaries will mostly be there because of the - # assert functions and their location is not interesting. - if summary[0] != __file__: - return summary - - - def run_safely(self, func, print_immediately=False): - if verbose: - with print_lock: - if sys.platform == 'win32': - print(u"\n\t> ", func.__qualname__, " ", end="", flush=True) - else: - print(u"\n\t\u21B3 ", func.__qualname__, " ", end="", flush=True) - - if func.__code__ is Mark.xfail(func).__code__: - return _skipped_marker - - # insert fixture params - co = func.__code__ - fixture_args = [] - if co.co_argcount > 0: - arg_names = co.co_varnames[:co.co_argcount] - if arg_names and arg_names[0] == "self": - arg_names = arg_names[1:] - fixture_args = get_fixture_values(self, arg_names) - - get_fixture_values(self, _fixture_marks) - - try: - if fixture_args: - for arg_vec in fixture_args: - func(*arg_vec) - else: - func() - except KeyboardInterrupt: - raise - except BaseException as e: - if isinstance(e, SkipTest): - return _skipped_marker - else: - if print_immediately: - print("Exception during setup occurred: %s\n" % e) - code = func.__code__ - _, _, tb = sys.exc_info() - try: - filename, line, func, text = self.get_useful_frame(tb) - self.exceptions.append( - ("In test '%s': %s:%d (%s)" % (code.co_filename, filename, line, func), e) - ) - except BaseException: - self.exceptions.append( - ("%s:%d (%s)" % (code.co_filename, code.co_firstlineno, func), e) - ) - return False - else: - return True - - def run_test(self, func): - if "test_main" in str(func): - pass - elif not hasattr(func, "__call__"): - pass - else: - def do_run(): - if hasattr(self, "setUp"): - if not self.run_safely(self.setUp, print_immediately=True): - self.failure(func, 0) - return - start = time.monotonic() - r = self.run_safely(func) - end = time.monotonic() - start - if hasattr(self, "tearDown"): - if not self.run_safely(self.tearDown): - self.failure(func, end) - with print_lock: - if r is _skipped_marker: - self.skipped(func) - elif r: - self.success(func, end) - else: - transient_marker = [name for name in TRANSIENTS if name in func.__qualname__] - if transient_marker: - if verbose: - print("[%.3fs]" % end, end=" ") - print(RETRY, BOLD, "Transient %s matched" % transient_marker[0], ENDC, sep="", end=" ") - else: - print("T", end="", flush=True) - try: - TRANSIENTS.remove(transient_marker[0]) - except: - print("!ERROR! TRANSIENT %s matches more than one test!" % transient_marker[0]) - # transient markers may match more than one test. they shouldn't, but - # in case they do, this is racy and we don't want to fail here - pass - do_run() - else: - self.failure(func, end) - if fail_fast: - global exitting - if not exitting: - exitting = True - if verbose: - print(FAIL, BOLD) - print("\nFailing fast since GRAALPYTEST_FAIL_FAST is set ...") - if verbose: - print(ENDC) - return - force_serial_execution = any(name in func.__qualname__ for name in SERIAL_TESTS) - if force_serial_execution: - ThreadPool.shutdown() - ThreadPool.start(do_run) - if force_serial_execution: - ThreadPool.shutdown() - - def success(self, func, time): - self.passed += 1 - if verbose: - print("[%.3fs]" % time, end=" ") - print(".", end="", flush=True) - if reportfile: - reportfile.append({ - "name": f"{func.__module__}.{func.__qualname__}", - "status": "PASSED", - "duration": int(time * 1000), - }) - - def failure(self, func, time): - self.failed += 1 - fail_msg = FAIL + BOLD + "F" + ENDC if verbose else "F" - if verbose: - print("[%.3fs]" % time, end=" ") - print(fail_msg, end="", flush=True) - if reportfile: - reportfile.append({ - "name": f"{func.__module__}.{func.__qualname__}", - "status": "FAILED", - "duration": int(time * 1000), - }) - - def skipped(self, func): - self.skipped_n += 1 - print("s ", end="", flush=True) - if reportfile: - reportfile.append({ - "name": f"{func.__module__}.{func.__qualname__}", - "status": "IGNORED", - "duration": 0, - }) - - def assertIsInstance(self, value, cls): - assert isinstance(value, cls), "Expected %r to be instance of %r" % (value, cls) - - def assertTrue(self, value, msg=""): - assert value, msg - - def assertFalse(self, value, msg=""): - assert not value, msg - - def assertIsNone(self, value, msg=""): - if not msg: - msg = "Expected '%r' to be None" % value - assert value is None, msg - - def assertIsNotNone(self, value, msg=""): - if not msg: - msg = "Expected '%r' to not be None" % value - assert value is not None, msg - - def assertIs(self, actual, expected, msg=""): - if not msg: - msg = "Expected '%r' to be '%r'" % (actual, expected) - assert actual is expected, msg - - def assertIsNot(self, actual, expected, msg=""): - if not msg: - msg = "Expected '%r' not to be '%r'" % (actual, expected) - assert actual is not expected, msg - - def assertEqual(self, expected, actual, msg=None): - if not msg: - msg = "Expected '%r' to be equal to '%r'" % (actual, expected) - assert expected == actual, msg - - def assertNotEqual(self, expected, actual, msg=None): - if not msg: - msg = "Expected '%r' to not be equal to '%r'" % (actual, expected) - assert expected != actual, msg - - def assertAlmostEqual(self, expected, actual, msg=None): - self.assertEqual(round(expected, 2), round(actual, 2), msg) - - def assertGreater(self, expected, actual, msg=None): - if not msg: - msg = "Expected '%r' to be greater than '%r'" % (actual, expected) - assert expected > actual, msg - - def assertGreaterEqual(self, expected, actual, msg=None): - if not msg: - msg = "Expected '%r' to be greater than or equal to '%r'" % (actual, expected) - assert expected >= actual, msg - - def assertSequenceEqual(self, expected, actual, msg=None): - if not msg: - msg = "Expected '%r' to be equal to '%r'" % (actual, expected) - assert len(expected) == len(actual), msg - actual_iter = iter(actual) - for expected_value in expected: - assert expected_value == next(actual_iter), msg - - def assertIsInstance(self, obj, cls, msg=None): - """Same as self.assertTrue(isinstance(obj, cls)), with a nicer - default message.""" - if not isinstance(obj, cls): - message = msg - if msg is None: - message = '%s is not an instance of %r' % (obj, cls) - assert False, message - - def fail(self, msg): - assert False, msg - - def skip(self): - raise SkipTest - - def assertRaises(self, exc_type, function=None, *args, **kwargs): - return self.assertRaisesRegex(exc_type, None, function, *args, **kwargs) - - class assertRaisesRegex(): - def __init__(self, exc_type, exc_regex, function=None, *args, **kwargs): - import re - function = function - if function is None: - self.exc_type = exc_type - self.exc_regex = exc_regex - else: - try: - function(*args, **kwargs) - except exc_type as exc: - if exc_regex: - assert re.search(exc_regex, str(exc)), "%s does not match %s" % (exc_regex, exc) - else: - assert False, "expected '%r' to raise '%r'" % (function, exc_type) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc, traceback): - self.type = exc_type - self.value = exc - self.tb = traceback - if not exc_type: - assert False, "expected '%r' to be raised" % self.exc_type - else: - if isinstance(self.exc_type, tuple): - for _exc_type in self.exc_type: - if self._match_exc(_exc_type, exc_type, exc): - return True - elif self._match_exc(self.exc_type, exc_type, exc): - return True - - def _match_exc(self, expected_exc_type, actual_exc_type, actual_exc): - import re - if expected_exc_type in actual_exc_type.mro(): - self.exception = actual_exc - if self.exc_regex: - assert re.search(self.exc_regex, str(actual_exc)), "%s does not match %s" % (self.exc_regex, actual_exc) - return True - - - def assertIn(self, expected, in_str, msg=""): - if not msg: - msg = "Expected '%r' to be in '%r'" % (expected, in_str) - assert expected in in_str, msg - - @classmethod - def run(cls, items=None): - instance = cls() - if items is None: - items = [] - for typ in cls.mro(): - if typ is TestCase: - break - items += typ.__dict__.items() - if hasattr(instance, "setUpClass"): - if not instance.run_safely(instance.setUpClass, print_immediately=True): - return instance - for k, v in items: - if exitting: - break - if k.startswith("test"): - testfn = getattr(instance, k, v) - if patterns: - import fnmatch - name = getattr(testfn, '__qualname__', k) - if not any(fnmatch.fnmatch(name, p) for p in patterns): - continue - instance.run_test(testfn) - if hasattr(instance, "tearDownClass"): - instance.run_safely(instance.tearDownClass) - return instance - - @staticmethod - def runClass(cls): - if TestCase in cls.mro(): - return cls.run() - class ThisTestCase(cls, TestCase): pass - return ThisTestCase.run() - - -class TestRunner(object): - - def __init__(self, paths): - self.testfiles = TestRunner.find_testfiles(paths[:]) - self.exceptions = [] - self.passed = 0 - self.failed = 0 - self.skipped_n = 0 - - @staticmethod - def find_testfiles(paths): - testfiles = [] - while paths: - path = paths.pop() - if path.endswith(".py") and path.rpartition("/")[2].startswith("test_"): - testfiles.append(path) - else: - try: - paths += [(path + f if path.endswith("/") else "%s/%s" % (path, f)) for f in os.listdir(path)] - except OSError: - pass - return testfiles - - @staticmethod - def find_conftest(test_module_path): - test_module_dir = dirname(test_module_path) - if "conftest.py" in os.listdir(test_module_dir): - return join(test_module_dir, "conftest.py") - return None - - def load_module(self, path): - path = path.replace("\\", "/") - name = path.rpartition("/")[2].partition(".")[0].replace('.py', '') - directory = path.rpartition("/")[0] - pkg = [] - while directory and any(f.endswith("__init__.py") for f in os.listdir(directory)): - directory, slash, postfix = directory.replace("\\", "/").rpartition("/") - pkg.insert(0, postfix) - if pkg: - sys.path.insert(0, directory) - try: - test_module = __import__(".".join(pkg + [name])) - for p in pkg[1:]: - test_module = getattr(test_module, p) - test_module = getattr(test_module, name) - except KeyboardInterrupt: - raise - except BaseException as e: - from traceback import extract_tb - filename, line, func, text = extract_tb(e.__traceback__)[-1] - self.exceptions.append( - ("In test '%s': Exception occurred in %s:%d" % (path, filename, line), e) - ) - else: - return test_module - finally: - sys.path.pop(0) - else: - test_module = type(sys)(name, path) - try: - with _io.FileIO(path, "r") as f: - test_module.__file__ = path - exec(compile(f.readall(), path, "exec"), test_module.__dict__) - except KeyboardInterrupt: - raise - except BaseException as e: - self.exceptions.append((path, e)) - else: - return test_module - - def test_modules(self): - for testfile in self.testfiles: - yield self.load_module(testfile) - - def load_conftest(self, testfile): - self.load_module(testfile) - - def trim_traceback(self, tb): - if tb and tb.tb_frame.f_code is TestCase.run_safely.__code__: - return tb.tb_next - return tb - - def run(self): - # eval session scope - eval_scope("session") - - testcases = [] - for module in self.test_modules(): - if module is None: - continue - # eval module scope - eval_scope("module") - - # load conftest if exists - conftest = TestRunner.find_conftest(module.__file__) - if conftest and not conftest in _loaded_conftest: - self.load_conftest(conftest) - - if verbose: - if sys.platform == 'win32': - print(u"\n> ", module.__name__, end="") - else: - print(u"\n\u25B9 ", module.__name__, end="") - # some tests can modify the global scope leading to a RuntimeError: test_scope.test_nesting_plus_free_ref_to_global - module_dict = dict(module.__dict__) - for k, v in module_dict.items(): - if exitting: - break - if (k.startswith("Test") or k.endswith("Test") or k.endswith("Tests")) and isinstance(v, type): - testcases.append(TestCase.runClass(v)) - else: - testcases.append(TestCase.run(items=[(k, v)])) - if verbose: - with print_lock: - print() - ThreadPool.shutdown() - for testcase in testcases: - self.exceptions += testcase.exceptions - self.passed += testcase.passed - self.failed += testcase.failed - self.skipped_n += testcase.skipped_n - - print("\n\nRan %d tests (%d passes, %d failures, %d skipped)" % (self.passed + self.failed, self.passed, self.failed, self.skipped_n)) - for e in self.exceptions: - msg, exc = e - print(msg) - try: - import traceback - traceback.print_exception(type(exc), exc, self.trim_traceback(exc.__traceback__)) - print() - except Exception: - pass - - if self.exceptions or self.failed: - _cleanup_tempdirs() - os._exit(1) - - -def skipIf(boolean, *args, **kwargs): - return skipUnless(not boolean, *args, **kwargs) - - -def skipUnless(boolean, msg=""): - if not boolean: - def decorator(f): - def wrapper(*args, **kwargs): - pass - return wrapper - else: - def decorator(f): - return f - return decorator - - -class TextTestResult : - "Just a dummy to satisfy the unittest.support import" - pass - - -class TestSuite: - pass - -def removeAttr(cls, attr): - if(cls is object): - return - if hasattr(cls, attr): - try: - delattr(cls, attr) - except AttributeError as e: - pass - for b in cls.__bases__: - removeAttr(b, attr) - -def skip_deselected_test_functions(globals): - """ - If TAGGED_UNITTEST_PARTIAL is set, this skips tests as appropriate. - """ - envvar = getenv("TAGGED_UNITTEST_PARTIAL", "") - if "/" not in envvar: - return - import types - batch, total = (int(x) for x in envvar.split("/")) - test_functions = [] - for g in globals.values(): - if isinstance(g, types.FunctionType) and g.__name__.startswith("test_"): - test_functions.append((globals, g)) - elif isinstance(g, type) and issubclass(g, TestCase): - for f in (getattr(g, n) for n in dir(g)): - if isinstance(f, types.FunctionType) and f.__name__.startswith("test_"): - test_functions.append((g, f)) - for idx, (owner, test_func) in enumerate(test_functions): - if idx % total != batch - 1: - n = test_func.__name__ - if isinstance(owner, type): - removeAttr(owner, n) - else: - del owner[n] - - -if __name__ == "__main__": - sys.modules["unittest"] = sys.modules["__main__"] - - if sys.implementation.name == 'graalpy' and getenv("GRAALPYTEST_ALLOW_NO_JAVA_ASSERTIONS") != "true": - if not __graalpython__.java_assert(): - sys.exit("Java assertions are not enabled, refusing to run. Set GRAALPYTEST_ALLOW_NO_JAVA_ASSERTIONS=true to disable this check") - - patterns = [] - argv = sys.argv[:] - idx = 0 - while idx < len(argv): - if argv[idx].startswith("--report"): - argv.pop(idx) - try: - import json - except Exception: - print("--report needs working json module") - raise - try: - reportfile = [argv.pop(idx),] - except Exception: - print("--report needs argument path to the json output") - raise - elif argv[idx] == "-k": - argv.pop(idx) - try: - pattern = argv.pop(idx) - if '*' not in pattern: - pattern = '*' + pattern + '*' - patterns.append(pattern) - except IndexError: - print("-k needs an argument") - else: - idx += 1 - - if len(argv) > 1 and argv[1] == "-v": - verbose = True - paths = argv[2:] - else: - verbose = False - paths = argv[1:] - paths = [p.replace("\\", "/") for p in paths] - - python_paths = set() - for pth in paths: - module_path = pth - if pth.endswith('.py'): - module_path = pth.rsplit('/', 1)[0] - python_paths.add(module_path) - - for pth in python_paths: - sys.path.append(pth) - - try: - TestRunner(paths).run() - finally: - if reportfile: - with open(reportfile[0], 'w') as f: - json.dump(reportfile[1:], f) - _cleanup_tempdirs() diff --git a/graalpython/com.oracle.graal.python.test/src/org/graalvm/python/embedding/cext/test/MultiContextCExtTest.java b/graalpython/com.oracle.graal.python.test/src/org/graalvm/python/embedding/cext/test/MultiContextCExtTest.java new file mode 100644 index 0000000000..7a02e794e3 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/org/graalvm/python/embedding/cext/test/MultiContextCExtTest.java @@ -0,0 +1,275 @@ +/* + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.graalvm.python.embedding.cext.test; + +import static org.graalvm.python.embedding.test.EmbeddingTestUtils.createVenv; +import static org.graalvm.python.embedding.test.EmbeddingTestUtils.deleteDirOnShutdown; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.logging.Handler; +import java.util.logging.LogRecord; + +import org.graalvm.polyglot.Context; +import org.graalvm.polyglot.Engine; +import org.graalvm.polyglot.PolyglotException; +import org.graalvm.polyglot.Source; +import org.graalvm.python.embedding.tools.exec.BuildToolLog; +import org.graalvm.python.embedding.tools.vfs.VFSUtils; +import org.junit.Assume; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.oracle.graal.python.runtime.PythonOptions; + +public class MultiContextCExtTest { + @BeforeClass + public static void setUpClass() { + Assume.assumeFalse(System.getProperty("os.name").toLowerCase().contains("mac")); + } + + static final class TestLog extends Handler implements BuildToolLog { + final StringBuilder logCharSequence = new StringBuilder(); + final StringBuilder logThrowable = new StringBuilder(); + final StringBuilder stderr = new StringBuilder(); + final StringBuilder stdout = new StringBuilder(); + final StringBuilder info = new StringBuilder(); + final StringBuilder warn = new StringBuilder(); + final StringBuilder debug = new StringBuilder(); + final StringBuilder truffleLog = new StringBuilder(); + + static void println(CharSequence... args) { + if (isVerbose()) { + System.out.println(String.join(" ", args)); + } + } + + @Override + public void warning(String txt, Throwable t) { + println("[warning]", txt); + println("[throwable]", t.getMessage()); + logThrowable.append(txt).append(t.getMessage()); + } + + @Override + public void error(String s) { + println("[err]", s); + stderr.append(s); + } + + @Override + public void debug(String s) { + println("[debug]", s); + debug.append(s); + } + + @Override + public void subProcessErr(String err) { + println("[err]", err); + stderr.append(err); + } + + @Override + public void subProcessOut(String out) { + println("[out]", out); + stdout.append(out); + } + + @Override + public void info(String s) { + println("[info]", s); + info.append(s); + } + + @Override + public void warning(String s) { + println("[warning]", s); + warn.append(s); + } + + @Override + public boolean isDebugEnabled() { + return true; + } + + @Override + public boolean isWarningEnabled() { + return true; + } + + @Override + public boolean isInfoEnabled() { + return true; + } + + @Override + public boolean isErrorEnabled() { + return true; + } + + @Override + public boolean isSubprocessOutEnabled() { + return true; + } + + @Override + public void publish(LogRecord record) { + var msg = String.format("[%s] %s: %s", record.getLoggerName(), record.getLevel().getName(), String.format(record.getMessage(), record.getParameters())); + println(msg); + truffleLog.append(msg); + } + + @Override + public void flush() { + } + + @Override + public void close() { + } + } + + @Test + public void testCreatingVenvForMulticontext() throws IOException, VFSUtils.PackagesChangedException { + Assume.assumeFalse(PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER); + var log = new TestLog(); + Path tmpdir = Files.createTempDirectory("MultiContextCExtTest"); + Path venvDir = tmpdir.resolve("venv"); + deleteDirOnShutdown(tmpdir); + + String pythonNative; + String exe; + if (System.getProperty("os.name").toLowerCase().contains("win")) { + pythonNative = "python-native.dll"; + createVenv(venvDir, "0.1", log, "delvewheel==1.9.0"); + + exe = venvDir.resolve("Scripts").resolve("python.exe").toString().replace('\\', '/'); + } else if (System.getProperty("os.name").toLowerCase().contains("mac")) { + pythonNative = "libpython-native.dylib"; + createVenv(venvDir, "0.1", log); + + exe = venvDir.resolve("bin").resolve("python").toString(); + } else { + pythonNative = "libpython-native.so"; + createVenv(venvDir, "0.1", log, "patchelf"); + + exe = venvDir.resolve("bin").resolve("python").toString(); + } + + var engine = Engine.newBuilder("python").logHandler(log).build(); + var builder = Context.newBuilder().engine(engine).allowAllAccess(true).option("python.Sha3ModuleBackend", "native").option("python.ForceImportSite", "true").option("python.Executable", + exe).option("log.python.level", "CONFIG"); + var contexts = new ArrayList(); + try { + Context c0, c1, c2, c3, c4, c5; + contexts.add(c0 = builder.build()); + c0.initialize("python"); + c0.eval("python", String.format("__graalpython__.replicate_extensions_in_venv('%s', 2)", venvDir.toString().replace('\\', '/'))); + + assertTrue("created a copy of the capi", Files.list(venvDir).anyMatch((p) -> p.getFileName().toString().startsWith(pythonNative) && p.getFileName().toString().endsWith(".dup0"))); + assertTrue("created another copy of the capi", Files.list(venvDir).anyMatch((p) -> p.getFileName().toString().startsWith(pythonNative) && p.getFileName().toString().endsWith(".dup1"))); + assertFalse("created no more copies of the capi", Files.list(venvDir).anyMatch((p) -> p.getFileName().toString().startsWith(pythonNative) && p.getFileName().toString().endsWith(".dup2"))); + + builder.option("python.IsolateNativeModules", "true"); + contexts.add(c1 = builder.build()); + contexts.add(c2 = builder.build()); + contexts.add(c3 = builder.build()); + contexts.add(c4 = builder.build()); + builder.option("python.Executable", ""); + contexts.add(c5 = builder.build()); + c0.initialize("python"); + c1.initialize("python"); + c2.initialize("python"); + c3.initialize("python"); + c4.initialize("python"); + c5.initialize("python"); + var code = Source.create("python", "import _sha3; _sha3.implementation"); + // First one works + var r1 = c1.eval(code); + assertEquals("tiny_sha3", r1.asString()); + assertFalse("created no more copies of the capi", Files.list(venvDir).anyMatch((p) -> p.getFileName().toString().startsWith(pythonNative) && p.getFileName().toString().endsWith(".dup2"))); + // Second one works because of isolation + var r2 = c2.eval(code); + assertEquals("tiny_sha3", r2.asString()); + c2.eval("python", "import _sha3; _sha3.implementation = '12'"); + r2 = c2.eval(code); + assertEquals("12", r2.asString()); + // first context is unaffected + r1 = c1.eval(code); + assertEquals("tiny_sha3", r1.asString()); + assertFalse("created no more copies of the capi", Files.list(venvDir).anyMatch((p) -> p.getFileName().toString().startsWith(pythonNative) && p.getFileName().toString().endsWith(".dup2"))); + // Third one works and triggers a dynamic relocation + c3.eval(code); + assertTrue("created another copy of the capi", Files.list(venvDir).anyMatch((p) -> p.getFileName().toString().startsWith(pythonNative) && p.getFileName().toString().endsWith(".dup2"))); + // Fourth one does not work because we changed the sys.prefix + c4.eval("python", "import sys; sys.prefix = 12"); + try { + c4.eval(code); + fail("should not reach here"); + } catch (PolyglotException e) { + assertTrue("We rely on sys.prefix", e.getMessage().contains("sys.prefix must be a str")); + } + // Fifth works even without a venv + c5.eval(code); + // Using a context without isolation in the same process does not work + try { + c0.eval(code); + fail("should not reach here"); + } catch (PolyglotException e) { + assertTrue("needs IsolateNativeModules", e.getMessage().contains("cannot use native module")); + } + } finally { + for (var c : contexts) { + c.close(true); + } + } + } + + private static boolean isVerbose() { + return Boolean.getBoolean("com.oracle.graal.python.test.verbose"); + } +} diff --git a/graalpython/com.oracle.graal.python.test/src/org/graalvm/python/embedding/test/EmbeddingTestUtils.java b/graalpython/com.oracle.graal.python.test/src/org/graalvm/python/embedding/test/EmbeddingTestUtils.java new file mode 100644 index 0000000000..36819a68b0 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/org/graalvm/python/embedding/test/EmbeddingTestUtils.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.graalvm.python.embedding.test; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Set; + +import org.graalvm.python.embedding.tools.exec.BuildToolLog; +import org.graalvm.python.embedding.tools.vfs.VFSUtils; +import org.graalvm.python.embedding.tools.vfs.VFSUtils.Launcher; + +public final class EmbeddingTestUtils { + private EmbeddingTestUtils() { + } + + public static void createVenv(Path venvDir, String graalPyVersion, BuildToolLog log, String... packages) throws IOException, VFSUtils.PackagesChangedException { + createVenv(venvDir, graalPyVersion, log, null, null, packages); + } + + public static void createVenv(Path venvDir, String graalPyVersion, BuildToolLog log, Path lockFile, String missingLockFileWarning, String... packages) + throws IOException, VFSUtils.PackagesChangedException { + try { + info(log, "<<<<<< create test venv %s <<<<<<", venvDir); + + Launcher launcher = createLauncher(venvDir); + if (lockFile != null) { + VFSUtils.createVenv(venvDir, Arrays.asList(packages), lockFile, missingLockFileWarning, launcher, graalPyVersion, log); + } else { + VFSUtils.createVenv(venvDir, Arrays.asList(packages), launcher, graalPyVersion, log); + } + } catch (RuntimeException e) { + System.err.println(getClasspath()); + throw e; + } finally { + info(log, ">>>>>> create test venv %s >>>>>>", venvDir); + } + } + + private static void info(BuildToolLog log, String txt, Object... args) { + if (log.isInfoEnabled()) { + log.info(String.format(txt, args)); + } + } + + public static Launcher createLauncher(Path venvDir) { + return new Launcher(venvDir.getParent().resolve(VFSUtils.LAUNCHER_NAME)) { + @Override + public Set computeClassPath() { + return getClasspath(); + } + }; + } + + public static void deleteDirOnShutdown(Path tmpdir) { + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + delete(tmpdir); + } catch (IOException e) { + } + })); + } + + public static void delete(Path dir) throws IOException { + try (var fs = Files.walk(dir)) { + fs.sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete); + } + } + + private static Set getClasspath() { + var sb = new ArrayList(); + var modPath = System.getProperty("jdk.module.path"); + if (modPath != null) { + sb.add(modPath); + } + var classPath = System.getProperty("java.class.path"); + if (classPath != null) { + sb.add(classPath); + } + var cp = String.join(File.pathSeparator, sb); + return Set.copyOf(Arrays.stream(cp.split(File.pathSeparator)).toList()); + } +} diff --git a/graalpython/com.oracle.graal.python.test/src/org/graalvm/python/embedding/test/VirtualFileSystemTest.java b/graalpython/com.oracle.graal.python.test/src/org/graalvm/python/embedding/test/VirtualFileSystemTest.java new file mode 100644 index 0000000000..d4225c11d6 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/org/graalvm/python/embedding/test/VirtualFileSystemTest.java @@ -0,0 +1,1216 @@ +/* + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.graalvm.python.embedding.test; + +import org.graalvm.polyglot.io.FileSystem; +import org.graalvm.python.embedding.VirtualFileSystem; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.net.URI; +import java.nio.ByteBuffer; +import java.nio.channels.NonWritableChannelException; +import java.nio.channels.SeekableByteChannel; +import java.nio.file.AccessMode; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.NoSuchFileException; +import java.nio.file.NotDirectoryException; +import java.nio.file.NotLinkException; +import java.nio.file.OpenOption; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.nio.file.StandardOpenOption; +import java.nio.file.attribute.FileAttribute; +import java.nio.file.attribute.FileTime; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.BiFunction; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.stream.Stream; + +import static com.oracle.graal.python.test.integration.Utils.IS_WINDOWS; +import static org.graalvm.python.embedding.VirtualFileSystem.HostIO.NONE; +import static org.graalvm.python.embedding.VirtualFileSystem.HostIO.READ; +import static org.graalvm.python.embedding.VirtualFileSystem.HostIO.READ_WRITE; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +public class VirtualFileSystemTest { + + private static String MOUNT_POINT_NAME = "test_mount_point"; + static final String VFS_UNIX_MOUNT_POINT = "/test_mount_point"; + static final String VFS_WIN_MOUNT_POINT = "X:\\test_mount_point"; + static final String VFS_MOUNT_POINT = IS_WINDOWS ? VFS_WIN_MOUNT_POINT : VFS_UNIX_MOUNT_POINT; + + private static final Path VFS_ROOT_PATH = Path.of(VFS_MOUNT_POINT); + + private FileSystem rwHostIOVFS; + private FileSystem rHostIOVFS; + private FileSystem noHostIOVFS; + + private FileSystem getDelegatingFS(VirtualFileSystem vfs) throws NoSuchFieldException, IllegalAccessException { + Field f = vfs.getClass().getDeclaredField("impl"); + f.setAccessible(true); + toBeClosed.add((AutoCloseable) f.get(vfs)); + f = vfs.getClass().getDeclaredField("delegatingFileSystem"); + f.setAccessible(true); + return (FileSystem) f.get(vfs); + } + + public VirtualFileSystemTest() { + Logger logger = Logger.getLogger(VirtualFileSystem.class.getName()); + for (Handler handler : logger.getHandlers()) { + handler.setLevel(Level.FINE); + } + logger.setLevel(Level.FINE); + } + + private List toBeClosed = new ArrayList<>(); + + @Before + public void initFS() throws Exception { + rwHostIOVFS = getDelegatingFS(VirtualFileSystem.newBuilder().// + allowHostIO(READ_WRITE).// + unixMountPoint(VFS_UNIX_MOUNT_POINT).// + windowsMountPoint(VFS_WIN_MOUNT_POINT).// + extractFilter(p -> p.getFileName().toString().endsWith("extractme")).// + resourceLoadingClass(VirtualFileSystemTest.class).build()); + rHostIOVFS = getDelegatingFS(VirtualFileSystem.newBuilder().// + allowHostIO(READ).// + unixMountPoint(VFS_UNIX_MOUNT_POINT).// + windowsMountPoint(VFS_WIN_MOUNT_POINT).// + extractFilter(p -> p.getFileName().toString().endsWith("extractme")).// + resourceLoadingClass(VirtualFileSystemTest.class).build()); + noHostIOVFS = getDelegatingFS(VirtualFileSystem.newBuilder().// + allowHostIO(NONE).// + unixMountPoint(VFS_UNIX_MOUNT_POINT).// + windowsMountPoint(VFS_WIN_MOUNT_POINT).// + extractFilter(p -> p.getFileName().toString().endsWith("extractme")).// + resourceLoadingClass(VirtualFileSystemTest.class).build()); + } + + @After + public void close() throws Exception { + Iterator it = toBeClosed.iterator(); + while (it.hasNext()) { + it.next().close(); + it.remove(); + } + } + + @Test + public void toRealPath() throws Exception { + // from VFS + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + checkException(NullPointerException.class, () -> fs.toRealPath(null)); + toRealPathVFS(fs, VFS_MOUNT_POINT); + withCWD(fs, VFS_ROOT_PATH, (fst) -> toRealPathVFS(fst, "")); + } + + // from real FS + final Path realFSDir = Files.createTempDirectory("graalpy.vfs.test"); + final Path realFSPath = realFSDir.resolve("extractme"); + realFSPath.toFile().createNewFile(); + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS}) { + assertTrue(Files.isSameFile(realFSPath, fs.toRealPath(realFSPath))); + withCWD(fs, realFSDir, (fst) -> assertTrue(Files.isSameFile(realFSPath, fst.toRealPath(Path.of("..", realFSPath.getParent().getFileName().toString(), "extractme"))))); + if (!IS_WINDOWS) { + withCWD(fs, VFS_ROOT_PATH, (fst) -> assertTrue(Files.isSameFile(realFSPath, fst.toRealPath(Path.of("..", realFSPath.toString()))))); + } + } + checkException(SecurityException.class, () -> noHostIOVFS.toRealPath(realFSPath), "expected error for no host io fs"); + } + + private static void toRealPathVFS(FileSystem fs, String pathPrefix) throws IOException { + assertEquals(Path.of(VFS_MOUNT_POINT, "dir1"), fs.toRealPath(Path.of(pathPrefix, "dir1"))); + assertEquals(Path.of(VFS_MOUNT_POINT, "SomeFile"), fs.toRealPath(Path.of(pathPrefix, "SomeFile"))); + assertEquals(Path.of(VFS_MOUNT_POINT, "does-not-exist"), fs.toRealPath(Path.of(pathPrefix, "does-not-exist"))); + assertEquals(Path.of(VFS_MOUNT_POINT, "extractme"), fs.toRealPath(Path.of(pathPrefix, "extractme"), LinkOption.NOFOLLOW_LINKS)); + checkExtractedFile(fs.toRealPath(Path.of(pathPrefix, "extractme")), new String[]{"text1", "text2"}); + checkException(NoSuchFileException.class, () -> fs.toRealPath(Path.of(pathPrefix, "does-not-exist", "extractme"))); + } + + @Test + public void toAbsolutePath() throws Exception { + // VFS + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + checkException(NullPointerException.class, () -> fs.toAbsolutePath(null)); + + assertEquals(Path.of(VFS_MOUNT_POINT, "dir1"), fs.toAbsolutePath(Path.of(VFS_MOUNT_POINT, "dir1"))); + assertEquals(Path.of(VFS_MOUNT_POINT, "SomeFile"), fs.toAbsolutePath(Path.of(VFS_MOUNT_POINT, "SomeFile"))); + + if (fs == noHostIOVFS) { + // cwd is by default set to VFS_ROOT/src + assertEquals(Path.of(VFS_MOUNT_POINT, "src", "dir1"), fs.toAbsolutePath(Path.of("dir1"))); + assertEquals(Path.of(VFS_MOUNT_POINT, "src", "SomeFile"), fs.toAbsolutePath(Path.of("SomeFile"))); + assertEquals(Path.of(VFS_MOUNT_POINT, "src", "does-not-exist", "extractme"), fs.toAbsolutePath(Path.of("does-not-exist", "extractme"))); + } else { + // without cwd set, the real FS absolute path is returned given by jdk cwd + assertEquals(Path.of("dir1").toAbsolutePath(), fs.toAbsolutePath(Path.of("dir1"))); + assertEquals(Path.of("SomeFile").toAbsolutePath(), fs.toAbsolutePath(Path.of("SomeFile"))); + assertEquals(Path.of("does-not-exist", "extractme").toAbsolutePath(), fs.toAbsolutePath(Path.of("does-not-exist", "extractme"))); + } + + withCWD(fs, VFS_ROOT_PATH, (fst) -> { + assertEquals(Path.of(VFS_MOUNT_POINT, "extractme"), fst.toAbsolutePath(Path.of("extractme"))); + assertEquals(Path.of(VFS_MOUNT_POINT, "does-not-exist", "extractme"), fst.toAbsolutePath(Path.of("does-not-exist", "extractme"))); + }); + } + + // real FS + Path realFSDir = Files.createTempDirectory("graalpy.vfs.test"); + Path realFSDirDir = realFSDir.resolve("dir"); + Files.createDirectories(realFSDirDir); + Path realFSPath = realFSDir.resolve("extractme"); + realFSPath.toFile().createNewFile(); + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS}) { + // assertEquals(Path.of("extractme").toAbsolutePath(), + // fs.toAbsolutePath(Path.of("extractme"))); + Path p = fs.toAbsolutePath(Path.of("extractme")); + assertTrue(p.isAbsolute()); + assertEquals(Path.of("extractme").toAbsolutePath().normalize(), p.normalize()); + + // absolute path starting with VFS, pointing to real FS + // /VFS_ROOT/../real/fs/path/ + if (!IS_WINDOWS) { + p = Path.of(VFS_MOUNT_POINT, "..", realFSPath.toString()); + assertEquals(p, fs.toAbsolutePath(p)); + } + + // absolute path starting with real FS, pointing to VFS + // /real/fs/path/../../../VFS_MOUNT_POINT + // XXX return same abs path ??? + p = Path.of(fromPathToFSRoot(realFSDir).toString(), MOUNT_POINT_NAME); + assertEquals(p, fs.toAbsolutePath(p)); + // /real/fs/path/../../../VFS_MOUNT_POINT/../VFS_MOUNT_POINT + p = Path.of(fromPathToFSRoot(realFSDir).toString(), MOUNT_POINT_NAME, "..", MOUNT_POINT_NAME); + assertEquals(p, fs.toAbsolutePath(p)); + + // no CWD set, so relative path starting in real FS, pointing to VFS + // ../../../VFS_ROOT + Path cwd = Path.of(".").toAbsolutePath(); + if (!IS_WINDOWS) { + p = fs.toAbsolutePath(Path.of(dotdot(cwd.getNameCount()).toString(), MOUNT_POINT_NAME)); + assertTrue(p.isAbsolute()); + assertEquals(VFS_ROOT_PATH, p.normalize()); + + // ../../../VFS_ROOT/../real/fs/path + p = fs.toAbsolutePath(Path.of(dotdot(cwd.getNameCount()).toString(), MOUNT_POINT_NAME, "..", realFSPath.toString())); + assertTrue(p.isAbsolute()); + assertEquals(realFSPath, p.normalize()); + + // CWD is VFS_ROOT, relative path pointing to real FS + // ../real/fs/path + withCWD(fs, VFS_ROOT_PATH, (fst) -> { + Path pp = fst.toAbsolutePath(Path.of("..", realFSPath.toString())); + assertTrue(pp.isAbsolute()); + assertEquals(realFSPath, pp.normalize()); + }); + + // CWD is real FS, relative path pointing to VFS + // real/fs/path/../../ + withCWD(fs, realFSPath.getParent(), (fst) -> { + Path pp = fst.toAbsolutePath(Path.of("dir", dotdot(realFSDirDir.getNameCount()), MOUNT_POINT_NAME)); + assertTrue(pp.isAbsolute()); + assertEquals(VFS_ROOT_PATH, pp.normalize()); + }); + + // CWD is real FS, relative path pointing through VFS to real FS + // real/fs/path/../../../VFS + withCWD(fs, realFSPath.getParent(), + (fst) -> { + Path pp = fst.toAbsolutePath(Path.of("dir", dotdot(realFSDirDir.getNameCount()), MOUNT_POINT_NAME, "..", realFSPath.toString())); + assertTrue(pp.isAbsolute()); + assertEquals(realFSPath, pp.normalize()); + }); + } + + // CWD is VFS_ROOT, relative path pointing through real FS back to VFS + // ../some/path/../../VFS_ROOT_PATH + withCWD(fs, VFS_ROOT_PATH, (fst) -> { + Path pp = fst.toAbsolutePath(Path.of("..", "some", "path", "..", "..", MOUNT_POINT_NAME)); + assertTrue(pp.isAbsolute()); + assertEquals(VFS_ROOT_PATH, pp.normalize()); + }); + + assertEquals(Path.of("extractme").toAbsolutePath(), fs.toAbsolutePath(Path.of("extractme"))); + + withCWD(fs, realFSPath.getParent(), (fst) -> assertEquals(realFSPath, fst.toAbsolutePath(realFSPath.getFileName()))); + } + + // noHostIOVFS sets default CDW to /VFS_MOUNT_POINT/src + assertEquals(realFSPath, noHostIOVFS.toAbsolutePath(realFSPath)); + assertEquals(Path.of(VFS_MOUNT_POINT, "src", "extractme"), noHostIOVFS.toAbsolutePath(Path.of("extractme"))); + + // absolute path starting with real FS, pointing to VFS + // /real/fs/path/../../../VFS_ROOT + Path p = Path.of(realFSDir.toString(), dotdot(realFSDir.getNameCount()), MOUNT_POINT_NAME); + assertEquals(p, noHostIOVFS.toAbsolutePath(p)); + + // no CWD set, relative path starting in real FS, pointing to VFS + // ../../../VFS_ROOT + Path defaultCWD = Path.of(".").toAbsolutePath(); + p = Path.of(dotdot(defaultCWD.getNameCount()), MOUNT_POINT_NAME); + assertEquals(Path.of(VFS_MOUNT_POINT, "src", p.toString()), noHostIOVFS.toAbsolutePath(p)); + } + + @Test + public void parseStringPath() throws Exception { + parsePath(VirtualFileSystemTest::parseStringPath); + } + + @Test + public void parseURIPath() throws Exception { + parsePath(VirtualFileSystemTest::parseURIPath); + + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + checkException(NullPointerException.class, () -> fs.parsePath((URI) null)); + checkException(NullPointerException.class, () -> fs.parsePath((String) null)); + checkException(UnsupportedOperationException.class, () -> fs.parsePath(URI.create("http://testvfs.org/")), "only file uri is supported"); + } + } + + public void parsePath(BiFunction parsePath) throws Exception { + // from VFS + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + // check regular resource dir + assertEquals(VFS_ROOT_PATH.resolve("dir1"), parsePath.apply(fs, VFS_MOUNT_POINT + File.separator + "dir1")); + // check regular resource file + assertEquals(VFS_ROOT_PATH.resolve("SomeFile"), parsePath.apply(fs, VFS_MOUNT_POINT + File.separator + "SomeFile")); + // check to be extracted file + Path p = parsePath.apply(fs, VFS_MOUNT_POINT + File.separator + "extractme"); + // wasn't extracted => we do not expect the path to exist on real FS + assertFalse(Files.exists(p)); + assertEquals(VFS_ROOT_PATH.resolve("extractme"), p); + p = parsePath.apply(fs, VFS_MOUNT_POINT + File.separator + "dir1" + File.separator + "extractme"); + assertFalse(Files.exists(p)); + assertEquals(VFS_ROOT_PATH.resolve("dir1" + File.separator + "extractme"), p); + p = parsePath.apply(fs, VFS_MOUNT_POINT + File.separator + "does-not-exist" + File.separator + "extractme"); + assertFalse(Files.exists(p)); + assertEquals(VFS_ROOT_PATH.resolve("does-not-exist" + File.separator + "extractme"), p); + } + + // from real FS + Path realFSPath = Files.createTempDirectory("graalpy.vfs.test").resolve("extractme"); + realFSPath.toFile().createNewFile(); + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + assertEquals(realFSPath, parsePath.apply(fs, realFSPath.toString())); + } + } + + private static Path parseStringPath(FileSystem fs, String p) { + return fs.parsePath(p); + } + + private static Path parseURIPath(FileSystem fs, String p) { + if (IS_WINDOWS) { + return fs.parsePath(URI.create("file:///" + p.replace('\\', '/'))); + } else { + return fs.parsePath(URI.create("file://" + p)); + } + } + + @Test + public void checkAccess() throws Exception { + // from VFS + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + checkException(NullPointerException.class, () -> fs.checkAccess(null, null)); + checkException(NullPointerException.class, () -> fs.checkAccess(VFS_ROOT_PATH.resolve("dir1"), null)); + + checkAccessVFS(fs, VFS_MOUNT_POINT); + withCWD(fs, VFS_ROOT_PATH, (fst) -> checkAccessVFS(fs, "")); + } + + // from real FS + Path realFSPath = Files.createTempDirectory("graalpy.vfs.test").resolve("extractme"); + realFSPath.toFile().createNewFile(); + + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS}) { + fs.checkAccess(realFSPath, Set.of(AccessMode.READ)); + withCWD(fs, realFSPath.getParent(), (fst) -> fst.checkAccess(realFSPath.getFileName(), Set.of(AccessMode.READ))); + if (!IS_WINDOWS) { + withCWD(fs, VFS_ROOT_PATH, (fst) -> fst.checkAccess(Path.of("..", realFSPath.toString()), Set.of(AccessMode.READ))); + } + } + checkException(SecurityException.class, () -> noHostIOVFS.checkAccess(realFSPath, Set.of(AccessMode.READ)), "expected error for no host io fs"); + } + + private static void checkAccessVFS(FileSystem fs, String pathPrefix) throws IOException { + // check regular resource dir + fs.checkAccess(Path.of(pathPrefix, "dir1"), Set.of(AccessMode.READ)); + // check regular resource file + fs.checkAccess(Path.of(pathPrefix, "SomeFile"), Set.of(AccessMode.READ)); + + // check to be extracted file + fs.checkAccess(Path.of(pathPrefix, "extractme"), Set.of(AccessMode.READ), LinkOption.NOFOLLOW_LINKS); + checkException(SecurityException.class, () -> fs.checkAccess(Path.of(pathPrefix, "extractme"), Set.of(AccessMode.WRITE), LinkOption.NOFOLLOW_LINKS)); + fs.checkAccess(Path.of(pathPrefix, "extractme"), Set.of(AccessMode.READ)); + // even though extracted -> FS is read-only and we are limiting the access to read-only also + // for extracted files + checkException(IOException.class, () -> fs.checkAccess(Path.of(pathPrefix, "extractme"), Set.of(AccessMode.WRITE))); + + checkException(NoSuchFileException.class, () -> fs.checkAccess(Path.of(pathPrefix, "does-not-exits", "extractme"), Set.of(AccessMode.READ), LinkOption.NOFOLLOW_LINKS)); + checkException(NoSuchFileException.class, () -> fs.checkAccess(Path.of(pathPrefix, "does-not-exits", "extractme"), Set.of(AccessMode.READ))); + + checkException(SecurityException.class, () -> fs.checkAccess(Path.of(pathPrefix, "SomeFile"), Set.of(AccessMode.WRITE)), "write access should not be possible with VFS"); + checkException(SecurityException.class, () -> fs.checkAccess(Path.of(pathPrefix, "does-not-exist"), Set.of(AccessMode.WRITE)), "execute access should not be possible with VFS"); + checkException(SecurityException.class, () -> fs.checkAccess(Path.of(pathPrefix, "SomeFile"), Set.of(AccessMode.EXECUTE)), "execute access should not be possible with VFS"); + checkException(SecurityException.class, () -> fs.checkAccess(Path.of(pathPrefix, "does-not-exist"), Set.of(AccessMode.EXECUTE)), "execute access should not be possible with VFS"); + + checkException(NoSuchFileException.class, () -> fs.checkAccess(Path.of(pathPrefix, "does-not-exits"), Set.of(AccessMode.READ)), + "should not be able to access a file which does not exist in VFS"); + checkException(NoSuchFileException.class, () -> fs.checkAccess(Path.of(pathPrefix, "does-not-exits", "extractme"), Set.of(AccessMode.READ)), + "should not be able to access a file which does not exist in VFS"); + } + + @Test + public void createDirectory() throws Exception { + // from VFS + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + Path path = VFS_ROOT_PATH.resolve("new-dir"); + checkException(NullPointerException.class, () -> fs.createDirectory(null)); + checkException(SecurityException.class, () -> fs.createDirectory(path)); + + withCWD(fs, VFS_ROOT_PATH, (fst) -> checkException(SecurityException.class, () -> fst.createDirectory(Path.of("new-dir")), "should not be able to create a directory in VFS")); + } + + // from real FS + Path newDir = Files.createTempDirectory("graalpy.vfs.test").resolve("newdir"); + assertFalse(Files.exists(newDir)); + checkException(SecurityException.class, () -> noHostIOVFS.createDirectory(newDir), "expected error for no host io fs"); + assertFalse(Files.exists(newDir)); + + checkException(SecurityException.class, () -> rHostIOVFS.createDirectory(newDir), "should not be able to create a directory in a read-only FS"); + assertFalse(Files.exists(newDir)); + + rwHostIOVFS.createDirectory(newDir); + assertTrue(Files.exists(newDir)); + withCWD(rwHostIOVFS, newDir.getParent(), (fs) -> { + Path newDir2 = newDir.getParent().resolve("newdir2"); + assertFalse(Files.exists(newDir2)); + fs.createDirectory(newDir2.getFileName()); + assertTrue(Files.exists(newDir2)); + }); + if (!IS_WINDOWS) { + withCWD(rwHostIOVFS, VFS_ROOT_PATH, (fs) -> { + Path newDir3 = newDir.getParent().resolve("newdir3"); + assertFalse(Files.exists(newDir3)); + fs.createDirectory(Path.of("..", newDir3.toString())); + assertTrue(Files.exists(newDir3)); + }); + } + } + + @Test + public void delete() throws Exception { + // VFS + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + checkException(NullPointerException.class, () -> fs.delete(null)); + + deleteVFS(fs, VFS_MOUNT_POINT); + withCWD(fs, VFS_ROOT_PATH, (fst) -> deleteVFS(fs, "")); + } + + // real FS + Path realFSPath = Files.createTempDirectory("graalpy.vfs.test").resolve("extractme"); + Files.createFile(realFSPath); + assertTrue(Files.exists(realFSPath)); + + checkException(SecurityException.class, () -> noHostIOVFS.delete(realFSPath), "expected error for no host io fs"); + assertTrue(Files.exists(realFSPath)); + + checkException(SecurityException.class, () -> rHostIOVFS.delete(realFSPath), "should not be able to delete in a read-only FS"); + assertTrue(Files.exists(realFSPath)); + + // Files.createFile(realFSPath); + assertTrue(Files.exists(realFSPath)); + rwHostIOVFS.delete(realFSPath); + assertFalse(Files.exists(realFSPath)); + + Files.createFile(realFSPath); + assertTrue(Files.exists(realFSPath)); + withCWD(rwHostIOVFS, realFSPath.getParent(), (fs) -> rwHostIOVFS.delete(realFSPath.getFileName())); + assertFalse(Files.exists(realFSPath)); + + if (!IS_WINDOWS) { + Files.createFile(realFSPath); + assertTrue(Files.exists(realFSPath)); + withCWD(rwHostIOVFS, VFS_ROOT_PATH, (fs) -> rwHostIOVFS.delete(Path.of("..", realFSPath.toString()))); + assertFalse(Files.exists(realFSPath)); + } + } + + private static void deleteVFS(FileSystem fs, String pathPrefix) { + checkException(SecurityException.class, () -> fs.delete(Path.of(pathPrefix, "file1")), "should not be able to delete in VFS"); + checkException(SecurityException.class, () -> fs.delete(Path.of(pathPrefix, "dir1")), "should not be able to delete in VFS"); + checkException(SecurityException.class, () -> fs.delete(Path.of(pathPrefix, "extractme")), "should not be able to delete in VFS"); + } + + @Test + @SuppressWarnings("unchecked") + public void newByteChannel() throws Exception { + // from VFS + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + + checkException(NullPointerException.class, () -> fs.newByteChannel(null, (Set) null, (FileAttribute) null)); + checkException(NullPointerException.class, () -> fs.newByteChannel(null, null)); + checkException(NullPointerException.class, () -> fs.newByteChannel(VFS_ROOT_PATH.resolve("file1"), null)); + checkException(NullPointerException.class, () -> fs.newByteChannel(VFS_ROOT_PATH.resolve("file1"), Set.of(StandardOpenOption.READ), (FileAttribute[]) null)); + + newByteChannelVFS(fs, VFS_MOUNT_POINT); + withCWD(fs, VFS_ROOT_PATH, (fst) -> newByteChannelVFS(fst, "")); + + checkException(NullPointerException.class, () -> fs.newByteChannel(Path.of(VFS_MOUNT_POINT, "does-not-exist"), null)); + withCWD(fs, VFS_ROOT_PATH, (fst) -> checkException(NullPointerException.class, () -> fst.newByteChannel(Path.of("does-not-exist"), null))); + checkException(NullPointerException.class, () -> fs.newByteChannel(Path.of(VFS_MOUNT_POINT, "does-not-exist", "extractme"), null)); + withCWD(fs, VFS_ROOT_PATH, (fst) -> checkException(NullPointerException.class, () -> fst.newByteChannel(Path.of("does-not-exist", "extractme"), null))); + } + + // from real FS + Path realFSPath = Files.createTempDirectory("graalpy.vfs.test").resolve("extractme"); + Files.createFile(realFSPath); + checkException(SecurityException.class, () -> rHostIOVFS.newByteChannel(realFSPath, Set.of(StandardOpenOption.WRITE)), "cant write into a read-only host FS"); + try (SeekableByteChannel ch = rwHostIOVFS.newByteChannel(realFSPath, Set.of(StandardOpenOption.WRITE))) { + ch.write(ByteBuffer.wrap("text".getBytes())); + } + assertTrue(Files.exists(realFSPath)); + + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS}) { + newByteChannelRealFS(fs, realFSPath, "text"); + withCWD(fs, realFSPath.getParent(), (fst) -> newByteChannelRealFS(fs, realFSPath.getFileName(), "text")); + if (!IS_WINDOWS) { + withCWD(fs, VFS_ROOT_PATH, (fst) -> newByteChannelRealFS(fs, Path.of("..", realFSPath.toString()), "text")); + } + } + } + + private static void newByteChannelVFS(FileSystem fs, String pathPrefix) throws IOException { + Path file1 = Path.of(pathPrefix, "file1"); + Path extractable = Path.of(pathPrefix, "extractme"); + for (StandardOpenOption o : new StandardOpenOption[]{StandardOpenOption.WRITE, StandardOpenOption.READ}) { + if (o == StandardOpenOption.READ) { + newByteChannelVFS(fs, file1, Set.of(o)); + newByteChannelVFS(fs, file1, Set.of(o, LinkOption.NOFOLLOW_LINKS)); + newByteChannelVFS(fs, extractable, Set.of(o)); + checkException(IOException.class, () -> fs.newByteChannel(extractable, Set.of(o, LinkOption.NOFOLLOW_LINKS))); + } else { + checkCanOnlyRead(fs, file1, o); + checkCanOnlyRead(fs, extractable, o); + } + } + checkCanOnlyRead(fs, file1, StandardOpenOption.READ, StandardOpenOption.WRITE); + checkCanOnlyRead(fs, extractable, StandardOpenOption.READ, StandardOpenOption.WRITE); + } + + private static void newByteChannelVFS(FileSystem fs, Path path, Set options) throws IOException { + try (SeekableByteChannel bch = fs.newByteChannel(path, options)) { + ByteBuffer buffer = ByteBuffer.allocate(1024); + bch.read(buffer); + String s = new String(buffer.array()); + String[] ss = s.split(System.lineSeparator()); + assertTrue(ss.length >= 2); + assertEquals("text1", ss[0]); + assertEquals("text2", ss[1]); + checkException(NonWritableChannelException.class, () -> bch.write(buffer), "should not be able to write to VFS"); + checkException(NonWritableChannelException.class, () -> bch.truncate(0), "should not be able to write to VFS"); + } + } + + private static void newByteChannelRealFS(FileSystem fs, Path path, String expectedText) throws IOException { + try (SeekableByteChannel bch = fs.newByteChannel(path, Set.of(StandardOpenOption.READ))) { + ByteBuffer buffer = ByteBuffer.allocate(expectedText.length()); + bch.read(buffer); + String s = new String(buffer.array()); + String[] ss = s.split(System.lineSeparator()); + assertTrue(ss.length >= 1); + assertEquals(expectedText, ss[0]); + } + } + + private static void checkCanOnlyRead(FileSystem fs, Path path, StandardOpenOption... options) { + checkException(SecurityException.class, () -> fs.newByteChannel(path, Set.of(options)), "should only be able to read from VFS"); + } + + @Test + public void newDirectoryStream() throws Exception { + // from VFS + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + checkException(NullPointerException.class, () -> fs.newDirectoryStream(null, null)); + checkException(NullPointerException.class, () -> fs.newDirectoryStream(VFS_ROOT_PATH.resolve("dir1"), null)); + checkException(NotDirectoryException.class, () -> fs.newDirectoryStream(VFS_ROOT_PATH.resolve("file1"), (p) -> true)); + + newDirectoryStreamVFS(fs, VFS_MOUNT_POINT); + withCWD(fs, VFS_ROOT_PATH, (fst) -> newDirectoryStreamVFS(fst, "")); + } + + // from real FS + Path realFSDir = Files.createTempDirectory("graalpy.vfs.test"); + Path realFSFile = realFSDir.resolve("extractme"); + Files.createFile(realFSFile); + for (FileSystem fs : new FileSystem[]{rHostIOVFS, rwHostIOVFS}) { + checkException(NotDirectoryException.class, () -> fs.newDirectoryStream(realFSFile, (p) -> true)); + newDirectoryStreamRealFS(fs, realFSDir, realFSFile); + withCWD(fs, realFSDir.getParent(), (fst) -> newDirectoryStreamRealFS(fs, realFSDir.getFileName(), realFSFile)); + if (!IS_WINDOWS) { + withCWD(fs, VFS_ROOT_PATH, (fst) -> newDirectoryStreamRealFS(fs, Path.of("..", realFSDir.toString()), realFSFile)); + // from real fs to VFS + withCWD(fs, realFSDir, (fst) -> newDirectoryStreamVFS(fs, Path.of(dotdot(realFSDir.getNameCount()), VFS_MOUNT_POINT).toString())); + // from VFS to real FS + withCWD(fs, VFS_ROOT_PATH, (fst) -> newDirectoryStreamRealFS(fs, Path.of("..", realFSDir.toString()), realFSFile)); + } + } + checkException(SecurityException.class, () -> noHostIOVFS.newDirectoryStream(realFSDir, null), "expected error for no host io fs"); + } + + private static void newDirectoryStreamVFS(FileSystem fs, String pathPrefix) throws Exception { + DirectoryStream ds = fs.newDirectoryStream(Path.of(pathPrefix, "dir1"), (p) -> true); + Set s = new HashSet<>(); + Iterator it = ds.iterator(); + while (it.hasNext()) { + Path p = it.next(); + s.add(p.toString()); + } + assertEquals(2, s.size()); + String prefix = pathPrefix.isEmpty() ? "" : pathPrefix + File.separator; + assertTrue(s.contains(prefix + "dir1" + File.separator + "extractme")); + assertTrue(s.contains(prefix + "dir1" + File.separator + "file2")); + + ds = fs.newDirectoryStream(Path.of(pathPrefix, "dir1"), (p) -> false); + assertFalse(ds.iterator().hasNext()); + + checkException(NotDirectoryException.class, () -> fs.newDirectoryStream(Path.of(pathPrefix, "file1"), (p) -> true), ""); + checkException(NoSuchFileException.class, () -> fs.newDirectoryStream(Path.of(pathPrefix, "does-not-exist"), (p) -> true), ""); + } + + private static void newDirectoryStreamRealFS(FileSystem fs, Path dir, Path file) throws Exception { + DirectoryStream ds = fs.newDirectoryStream(dir, (p) -> true); + Iterator it = ds.iterator(); + Path pp = it.next(); + assertEquals(dir.resolve(file.getFileName()), pp); + assertFalse(it.hasNext()); + ds = fs.newDirectoryStream(dir, (p) -> false); + it = ds.iterator(); + assertFalse(it.hasNext()); + } + + @Test + public void readAttributes() throws Exception { + // from VFS + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + checkException(NullPointerException.class, () -> fs.readAttributes(null, "creationTime")); + readAttributesVFS(fs, VFS_MOUNT_POINT); + withCWD(fs, VFS_ROOT_PATH, (fst) -> readAttributesVFS(fst, "")); + } + + // from real FS + Path realFSPath = Files.createTempDirectory("graalpy.vfs.test").resolve("extractme"); + Files.createFile(realFSPath); + for (FileSystem fs : new FileSystem[]{rHostIOVFS, rwHostIOVFS}) { + assertTrue(((FileTime) fs.readAttributes(realFSPath, "creationTime").get("creationTime")).toMillis() > 0); + withCWD(fs, realFSPath.getParent(), (fst) -> assertTrue(((FileTime) fs.readAttributes(realFSPath.getFileName(), "creationTime").get("creationTime")).toMillis() > 0)); + if (!IS_WINDOWS) { + withCWD(fs, VFS_ROOT_PATH, (fst) -> assertTrue(((FileTime) fs.readAttributes(Path.of("..", realFSPath.toString()), "creationTime").get("creationTime")).toMillis() > 0)); + } + + } + checkException(SecurityException.class, () -> noHostIOVFS.readAttributes(realFSPath, "creationTime"), "expected error for no host io fs"); + } + + private static void readAttributesVFS(FileSystem fs, String pathPrefix) throws IOException { + Map attrs = fs.readAttributes(Path.of(pathPrefix, "dir1"), "creationTime"); + assertEquals(FileTime.fromMillis(0), attrs.get("creationTime")); + + attrs = fs.readAttributes(Path.of(pathPrefix, "extractme"), "creationTime,isSymbolicLink,isRegularFile", LinkOption.NOFOLLOW_LINKS); + assertEquals(FileTime.fromMillis(0), attrs.get("creationTime")); + assertTrue((Boolean) attrs.get("isSymbolicLink")); + assertFalse((Boolean) attrs.get("isRegularFile")); // + + attrs = fs.readAttributes(Path.of(pathPrefix, "extractme"), "creationTime,isSymbolicLink,isRegularFile"); + assertNotEquals(FileTime.fromMillis(0), attrs.get("creationTime")); + assertFalse((Boolean) attrs.get("isSymbolicLink")); + assertTrue((Boolean) attrs.get("isRegularFile")); + + checkException(NoSuchFileException.class, () -> fs.readAttributes(Path.of(pathPrefix, "does-not-exist", "extractme"), "creationTime", LinkOption.NOFOLLOW_LINKS)); + checkException(NoSuchFileException.class, () -> fs.readAttributes(Path.of(pathPrefix, "does-not-exist", "extractme"), "creationTime")); + + checkException(NoSuchFileException.class, () -> fs.readAttributes(Path.of(pathPrefix, "does-not-exist"), "creationTime"), ""); + checkException(UnsupportedOperationException.class, () -> fs.readAttributes(Path.of(pathPrefix, "file1"), "unix:creationTime"), ""); + } + + @Test + public void libsExtract() throws Exception { + try (VirtualFileSystem vfs = VirtualFileSystem.newBuilder().// + unixMountPoint(VFS_MOUNT_POINT).// + windowsMountPoint(VFS_WIN_MOUNT_POINT).// + extractFilter(p -> p.getFileName().toString().endsWith(".tso")).// + resourceLoadingClass(VirtualFileSystemTest.class).build()) { + FileSystem fs = getDelegatingFS(vfs); + Path p = fs.toRealPath(VFS_ROOT_PATH.resolve("site-packages/testpkg/file.tso")); + checkExtractedFile(p, null); + Path extractedRoot = p.getParent().getParent().getParent(); + + checkExtractedFile(extractedRoot.resolve("site-packages/testpkg.libs/file1.tso"), null); + checkExtractedFile(extractedRoot.resolve("site-packages/testpkg.libs/file2.tso"), null); + checkExtractedFile(extractedRoot.resolve("site-packages/testpkg.libs/dir/file1.tso"), null); + checkExtractedFile(extractedRoot.resolve("site-packages/testpkg.libs/dir/file2.tso"), null); + checkExtractedFile(extractedRoot.resolve("site-packages/testpkg.libs/dir/nofilterfile"), null); + checkExtractedFile(extractedRoot.resolve("site-packages/testpkg.libs/dir/dir/file1.tso"), null); + checkExtractedFile(extractedRoot.resolve("site-packages/testpkg.libs/dir/dir/file2.tso"), null); + + p = fs.toRealPath(VFS_ROOT_PATH.resolve("site-packages/testpkg-nolibs/file.tso")); + checkExtractedFile(p, null); + } + } + + private static void checkExtractedFile(Path extractedFile, String[] expectedContens) throws IOException { + assertTrue(Files.exists(extractedFile)); + List lines = Files.readAllLines(extractedFile); + if (expectedContens != null) { + assertEquals("expected " + expectedContens.length + " lines in extracted file '" + extractedFile + "'", expectedContens.length, lines.size()); + for (String line : expectedContens) { + assertTrue("expected line '" + line + "' in file '" + extractedFile + "' with contents:\n" + expectedContens, lines.contains(line)); + } + } else { + assertEquals("extracted file '" + extractedFile + "' expected to be empty, but had " + lines.size() + " lines", 0, lines.size()); + } + } + + @Test + public void noExtractFilter() throws Exception { + try (VirtualFileSystem vfs = VirtualFileSystem.newBuilder().// + unixMountPoint(VFS_MOUNT_POINT).// + windowsMountPoint(VFS_WIN_MOUNT_POINT).// + extractFilter(null).// + resourceLoadingClass(VirtualFileSystemTest.class).build()) { + FileSystem fs = getDelegatingFS(vfs); + assertEquals(23, checkNotExtracted(fs, VFS_ROOT_PATH)); + } + } + + /** + * Check that all listed files have paths from VFS and do not get extracted if touched by + * toRealPath. + * + * @return amount of all listed files + */ + private static int checkNotExtracted(FileSystem fs, Path dir) throws IOException { + DirectoryStream ds = fs.newDirectoryStream(dir, (p) -> true); + Iterator it = ds.iterator(); + int c = 0; + while (it.hasNext()) { + c++; + Path p = it.next(); + assertTrue(p.toString().startsWith(VFS_MOUNT_POINT)); + assertTrue(fs.toRealPath(p).startsWith(VFS_MOUNT_POINT)); + fs.readAttributes(p, "isDirectory"); + if (Boolean.TRUE.equals((fs.readAttributes(p, "isDirectory").get("isDirectory")))) { + c += checkNotExtracted(fs, p); + } + } + return c; + } + + private interface ExceptionCall { + void call() throws Exception; + } + + private static void checkException(Class exType, ExceptionCall c) { + checkException(exType, c, null); + } + + private static void checkException(Class exType, ExceptionCall c, String msg) { + boolean gotEx = false; + try { + c.call(); + } catch (Exception e) { + if (!exType.isAssignableFrom(e.getClass())) { + e.printStackTrace(); + assertEquals(exType, e.getClass()); + } + gotEx = true; + } + assertTrue(msg != null ? msg : "expected " + exType.getName(), gotEx); + } + + @Test + public void currentWorkingDirectory() throws Exception { + Path realFSDir = Files.createTempDirectory("graalpy.vfs.test"); + Path realFSFile = realFSDir.resolve("extractme"); + Files.createFile(realFSFile); + + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + checkException(NullPointerException.class, () -> fs.setCurrentWorkingDirectory(null), "expected NPE"); + checkException(IllegalArgumentException.class, () -> fs.setCurrentWorkingDirectory(Path.of("dir"))); + + checkException(IllegalArgumentException.class, () -> fs.setCurrentWorkingDirectory(VFS_ROOT_PATH.resolve("file1"))); + + Object oldCwd = getCwd(fs); + try { + Path nonExistingDir = VFS_ROOT_PATH.resolve("does-not-exist"); + fs.setCurrentWorkingDirectory(nonExistingDir); + assertEquals(VFS_ROOT_PATH.resolve("does-not-exist").resolve("dir"), fs.toAbsolutePath(Path.of("dir"))); + + Path vfsDir = VFS_ROOT_PATH.resolve("dir1"); + fs.setCurrentWorkingDirectory(vfsDir); + assertEquals(vfsDir, fs.toAbsolutePath(Path.of("dir")).getParent()); + + if (fs == noHostIOVFS) { + checkException(SecurityException.class, () -> fs.setCurrentWorkingDirectory(realFSFile)); + } else { + checkException(IllegalArgumentException.class, () -> fs.setCurrentWorkingDirectory(realFSFile)); + + nonExistingDir = realFSDir.resolve("does-not-exist"); + fs.setCurrentWorkingDirectory(nonExistingDir); + assertEquals(nonExistingDir, fs.toAbsolutePath(Path.of("dir")).getParent()); + + fs.setCurrentWorkingDirectory(realFSDir); + assertEquals(realFSDir, fs.toAbsolutePath(Path.of("dir")).getParent()); + } + } finally { + resetCWD(fs, oldCwd); + } + } + } + + @Test + public void getTempDirectory() { + assertTrue(Files.exists(rwHostIOVFS.getTempDirectory())); + checkException(SecurityException.class, () -> rHostIOVFS.getTempDirectory()); + checkException(SecurityException.class, () -> noHostIOVFS.getTempDirectory()); + } + + @Test + public void getMimeType() throws Exception { + Path realFSPath = Files.createTempDirectory("graalpy.vfs.test").resolve("extractme"); + Files.createFile(realFSPath); + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + checkException(NullPointerException.class, () -> fs.getMimeType(null)); + Assert.assertNull(fs.getMimeType(VFS_ROOT_PATH)); + fs.getMimeType(realFSPath); + if (!IS_WINDOWS) { + // whatever the return value, just check it does not fail + withCWD(fs, VFS_ROOT_PATH, (fst) -> fst.getMimeType(Path.of("..", realFSPath.toString()))); + } + } + } + + @Test + public void getEncoding() throws Exception { + Path realFSPath = Files.createTempDirectory("graalpy.vfs.test").resolve("extractme"); + Files.createFile(realFSPath); + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + checkException(NullPointerException.class, () -> fs.getEncoding(null)); + Assert.assertNull(fs.getEncoding(VFS_ROOT_PATH)); + fs.getEncoding(realFSPath); + if (!IS_WINDOWS) { + // whatever the return value, just check it does not fail + withCWD(fs, VFS_ROOT_PATH, (fst) -> fst.getEncoding(Path.of("..", realFSPath.toString()))); + } + } + } + + @Test + public void setAttribute() throws Exception { + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + checkException(NullPointerException.class, () -> fs.setAttribute(null, null, null)); + checkException(SecurityException.class, () -> fs.setAttribute(VFS_ROOT_PATH, null, null)); + } + Path realFSPath = Files.createTempDirectory("graalpy.vfs.test").resolve("extractme"); + Files.createFile(realFSPath); + checkException(SecurityException.class, () -> rHostIOVFS.setAttribute(realFSPath, "creationTime", FileTime.fromMillis(42))); + checkException(SecurityException.class, () -> noHostIOVFS.setAttribute(realFSPath, "creationTime", FileTime.fromMillis(42))); + + // just check it does not fail for real FS paths + rwHostIOVFS.setAttribute(realFSPath, "creationTime", FileTime.fromMillis(42)); + if (!IS_WINDOWS) { + withCWD(rwHostIOVFS, VFS_ROOT_PATH, (fst) -> fst.setAttribute(Path.of("..", realFSPath.toString()), "creationTime", FileTime.fromMillis(43))); + } + } + + @Test + public void isSameFile() throws Exception { + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + assertFalse(fs.isSameFile(Path.of(VFS_MOUNT_POINT, "src"), Path.of(VFS_MOUNT_POINT, "file1"))); + withCWD(fs, VFS_ROOT_PATH, (fst) -> assertTrue(fst.isSameFile(Path.of("src"), Path.of("src", "..", "src")))); + } + Path realFSDir = Files.createTempDirectory("graalpy.vfs.test"); + Path realFSFile1 = realFSDir.resolve("file1"); + Files.createFile(realFSFile1); + Path realFSFile2 = realFSDir.resolve("file2"); + Files.createFile(realFSFile2); + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + assertFalse(fs.isSameFile(realFSDir, VFS_ROOT_PATH)); + assertFalse(fs.isSameFile(VFS_ROOT_PATH, realFSDir)); + if (fs == noHostIOVFS) { + if (!IS_WINDOWS) { + withCWD(fs, VFS_ROOT_PATH, (fst) -> checkException(SecurityException.class, () -> fst.isSameFile(realFSDir, Path.of("..", realFSDir.toString())))); + } + } else { + if (!IS_WINDOWS) { + withCWD(fs, VFS_ROOT_PATH, (fst) -> assertTrue(fst.isSameFile(realFSDir, Path.of("..", realFSDir.toString())))); + } + withCWD(fs, realFSDir, (fst) -> assertTrue(fs.isSameFile(realFSFile1.getFileName(), realFSFile1.getFileName()))); + withCWD(fs, realFSDir, (fst) -> assertFalse(fs.isSameFile(realFSFile1.getFileName(), realFSFile2.getFileName()))); + } + } + } + + @Test + public void createLink() throws Exception { + Path realFSDir = Files.createTempDirectory("graalpy.vfs.test"); + Path realFSFile = realFSDir.resolve("extractme"); + Files.createFile(realFSFile); + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + checkException(NullPointerException.class, () -> fs.createLink(null, null)); + checkException(NullPointerException.class, () -> fs.createLink(VFS_ROOT_PATH, null)); + + // IOException: Cross file system linking is not supported. + checkException(IOException.class, () -> fs.createLink(VFS_ROOT_PATH.resolve("link1"), realFSFile)); + checkException(IOException.class, () -> fs.createLink(realFSDir.resolve("link"), VFS_ROOT_PATH.resolve("file1"))); + + checkException(SecurityException.class, () -> fs.createLink(VFS_ROOT_PATH, VFS_ROOT_PATH.resolve("link"))); + } + Path link = realFSDir.resolve("link1"); + assertFalse(Files.exists(link)); + rwHostIOVFS.createLink(link, realFSFile); + assertTrue(Files.exists(link)); + Path link2 = realFSDir.resolve("link2"); + assertFalse(Files.exists(link2)); + if (!IS_WINDOWS) { + withCWD(rwHostIOVFS, VFS_ROOT_PATH, (fs) -> rwHostIOVFS.createLink(Path.of("..", link2.toString()), Path.of("..", realFSFile.toString()))); + assertTrue(Files.exists(link2)); + } + + checkException(SecurityException.class, () -> rHostIOVFS.createLink(realFSDir.resolve("link3"), realFSFile)); + checkException(SecurityException.class, () -> noHostIOVFS.createLink(realFSDir.resolve("link4"), realFSFile)); + } + + @Test + public void createAndReadSymbolicLink() throws Exception { + Path realFSDir = Files.createTempDirectory("graalpy.vfs.test"); + Path realFSLinkTarget = realFSDir.resolve("linkTarget"); + Files.createFile(realFSLinkTarget); + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + checkException(NullPointerException.class, () -> fs.createSymbolicLink(null, null)); + checkException(NullPointerException.class, () -> fs.readSymbolicLink(null)); + + // IOException: Cross file system linking is not supported. + checkException(IOException.class, () -> fs.createSymbolicLink(realFSDir.resolve("symlink2"), VFS_ROOT_PATH)); + checkException(IOException.class, () -> fs.createSymbolicLink(VFS_ROOT_PATH.resolve("link1"), realFSLinkTarget)); + + checkException(SecurityException.class, () -> fs.createSymbolicLink(VFS_ROOT_PATH, VFS_ROOT_PATH.resolve("link"))); + } + checkException(SecurityException.class, () -> rHostIOVFS.createSymbolicLink(realFSDir.resolve("link2"), realFSLinkTarget)); + checkException(SecurityException.class, () -> noHostIOVFS.createSymbolicLink(realFSDir.resolve("link3"), realFSLinkTarget)); + + Path symlink = realFSDir.resolve("symlink1"); + assertFalse(Files.exists(symlink)); + rwHostIOVFS.createSymbolicLink(symlink, realFSLinkTarget); + checkSymlink(realFSDir, realFSLinkTarget, symlink); + + if (!IS_WINDOWS) { + Files.delete(symlink); + assertFalse(Files.exists(symlink)); + withCWD(rwHostIOVFS, VFS_ROOT_PATH, (fst) -> fst.createSymbolicLink(Path.of("..", symlink.toString()), realFSLinkTarget)); + checkSymlink(realFSDir, realFSLinkTarget, symlink); + } + } + + private void checkSymlink(Path dir, Path target, Path symlink) throws Exception { + assertTrue(Files.exists(symlink)); + checkException(SecurityException.class, () -> noHostIOVFS.readSymbolicLink(symlink)); + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS}) { + assertEquals(target, fs.readSymbolicLink(symlink)); + if (!IS_WINDOWS) { + withCWD(fs, VFS_ROOT_PATH, (fst) -> assertEquals(target, fst.readSymbolicLink(Path.of("..", symlink.toString())))); + withCWD(fs, dir, (fst) -> assertEquals(target, fst.readSymbolicLink(Path.of(dotdot(dir.getNameCount()), "..", VFS_MOUNT_POINT, "..", symlink.toString())))); + } + } + } + + @Test + public void readSymbolicLink() throws Exception { + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + readSymbolicLink(fs, VFS_MOUNT_POINT); + withCWD(fs, VFS_ROOT_PATH, (fst) -> readSymbolicLink(fst, "")); + } + } + + private static void readSymbolicLink(FileSystem fs, String vfsPrefix) throws IOException { + checkException(NotLinkException.class, () -> fs.readSymbolicLink(Path.of(vfsPrefix, "file1"))); + checkException(NoSuchFileException.class, () -> fs.readSymbolicLink(Path.of(vfsPrefix, "does-not-exist"))); + checkExtractedFile(fs.readSymbolicLink(Path.of(vfsPrefix, "extractme")), new String[]{"text1", "text2"}); + } + + @Test + public void move() throws Exception { + Path realFSDir = Files.createTempDirectory("graalpy.vfs.test"); + Path realFSSource = realFSDir.resolve("movesource"); + Files.createFile(realFSSource); + Path realFSTarget = realFSDir.resolve("movetarget"); + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + checkException(NullPointerException.class, () -> fs.move(null, null)); + checkException(NullPointerException.class, () -> fs.move(VFS_ROOT_PATH, null)); + + checkException(SecurityException.class, () -> fs.move(VFS_ROOT_PATH.resolve("file1"), realFSTarget)); + Files.deleteIfExists(realFSTarget); // cleanup, move is nonatomic + + if (fs == noHostIOVFS) { + checkException(SecurityException.class, () -> fs.move(realFSSource, VFS_ROOT_PATH)); + } else { + checkException(IOException.class, () -> fs.move(realFSSource, VFS_ROOT_PATH)); + } + + checkException(SecurityException.class, () -> fs.move(realFSSource, VFS_ROOT_PATH, StandardCopyOption.REPLACE_EXISTING)); + checkException(SecurityException.class, () -> fs.move(realFSSource, VFS_ROOT_PATH.resolve("movetarget"))); + + checkException(SecurityException.class, () -> fs.move(VFS_ROOT_PATH.resolve("file1"), VFS_ROOT_PATH.resolve("file2"))); + } + + try (SeekableByteChannel ch = rwHostIOVFS.newByteChannel(realFSSource, Set.of(StandardOpenOption.WRITE))) { + ch.write(ByteBuffer.wrap("moved text".getBytes())); + } + assertTrue(Files.exists(realFSSource)); + assertFalse(Files.exists(realFSTarget)); + rwHostIOVFS.move(realFSSource, realFSTarget); + assertFalse(Files.exists(realFSSource)); + assertTrue(Files.exists(realFSTarget)); + newByteChannelRealFS(rwHostIOVFS, realFSTarget, "moved text"); + + Path realFSSource2 = realFSTarget; + Path realFSTarget2 = realFSSource; + assertTrue(Files.exists(realFSSource2)); + assertFalse(Files.exists(realFSTarget2)); + + if (!IS_WINDOWS) { + withCWD(rwHostIOVFS, VFS_ROOT_PATH, (fs) -> fs.move(Path.of("..", realFSSource2.toString()), Path.of("..", realFSTarget2.toString()))); + assertFalse(Files.exists(realFSSource2)); + assertTrue(Files.exists(realFSTarget2)); + newByteChannelRealFS(rwHostIOVFS, realFSSource, "moved text"); + } + + Class exCls = IS_WINDOWS ? SecurityException.class : IOException.class; + checkException(exCls, () -> rHostIOVFS.move(realFSSource2, realFSTarget2)); + checkException(SecurityException.class, () -> noHostIOVFS.move(realFSSource2, realFSTarget2)); + } + + @Test + public void copy() throws Exception { + Path realFSDir = Files.createTempDirectory("graalpy.vfs.test"); + Path realFSSource = realFSDir.resolve("copysource"); + Path realFSTarget = realFSDir.resolve("target"); + Files.createFile(realFSSource); + assertTrue(Files.exists(realFSSource)); + for (FileSystem fs : new FileSystem[]{rwHostIOVFS, rHostIOVFS, noHostIOVFS}) { + checkException(NullPointerException.class, () -> fs.copy(null, null)); + checkException(NullPointerException.class, () -> fs.copy(VFS_ROOT_PATH, null)); + checkException(SecurityException.class, () -> fs.copy(VFS_ROOT_PATH.resolve("file1"), VFS_ROOT_PATH.resolve("file2"))); + checkException(SecurityException.class, () -> fs.copy(realFSSource, VFS_ROOT_PATH.resolve("file2"))); + checkException(SecurityException.class, () -> fs.copy(VFS_ROOT_PATH.resolve("file1"), VFS_ROOT_PATH.resolve("file2"))); + } + + Files.delete(realFSSource); + checkException(NoSuchFileException.class, () -> rHostIOVFS.copy(realFSSource, realFSTarget)); + checkException(SecurityException.class, () -> noHostIOVFS.copy(realFSSource, realFSTarget)); + + Files.createFile(realFSSource); + try (SeekableByteChannel ch = rwHostIOVFS.newByteChannel(realFSSource, Set.of(StandardOpenOption.WRITE))) { + ch.write(ByteBuffer.wrap("copied text".getBytes())); + } + assertTrue(Files.exists(realFSSource)); + + rwHostIOVFS.copy(realFSSource, realFSTarget); + assertTrue(Files.exists(realFSSource)); + assertTrue(Files.exists(realFSTarget)); + newByteChannelRealFS(rwHostIOVFS, realFSTarget, "copied text"); + + if (!IS_WINDOWS) { + Files.delete(realFSTarget); + assertFalse(Files.exists(realFSTarget)); + withCWD(rwHostIOVFS, VFS_ROOT_PATH, (fs) -> fs.copy(Path.of("..", realFSSource.toString()), Path.of("..", realFSTarget.toString()))); + assertTrue(Files.exists(realFSTarget)); + newByteChannelRealFS(rwHostIOVFS, realFSTarget, "copied text"); + } + + Files.delete(realFSTarget); + assertFalse(Files.exists(realFSTarget)); + rwHostIOVFS.copy(VFS_ROOT_PATH.resolve("file1"), realFSTarget); + assertTrue(Files.exists(realFSTarget)); + newByteChannelRealFS(rwHostIOVFS, realFSTarget, "text1"); + + Files.delete(realFSTarget); + assertFalse(Files.exists(realFSTarget)); + withCWD(rwHostIOVFS, VFS_ROOT_PATH, (fs) -> fs.copy(Path.of("file1"), realFSTarget)); + assertTrue(Files.exists(realFSTarget)); + newByteChannelRealFS(rwHostIOVFS, realFSTarget, "text1"); + + if (!IS_WINDOWS) { + Files.delete(realFSTarget); + assertFalse(Files.exists(realFSTarget)); + withCWD(rwHostIOVFS, realFSDir, (fs) -> fs.copy(Path.of(dotdot(realFSDir.getNameCount()), VFS_MOUNT_POINT, "file1"), realFSTarget)); + assertTrue(Files.exists(realFSTarget)); + newByteChannelRealFS(rwHostIOVFS, realFSTarget, "text1"); + } + + Files.delete(realFSTarget); + assertFalse(Files.exists(realFSTarget)); + // NoSuchFileException: no such file or directory: '/test_mount_point/does-no-exist' + checkException(NoSuchFileException.class, () -> rwHostIOVFS.copy(VFS_ROOT_PATH.resolve("does-no-exist"), realFSTarget)); + assertFalse(Files.exists(realFSTarget)); + + // read only + + // SecurityException: Operation is not allowed for: realFSPath + checkException(SecurityException.class, () -> rHostIOVFS.copy(VFS_ROOT_PATH.resolve("file1"), realFSTarget)); + assertFalse(Files.exists(realFSTarget)); + + // no host IO + if (!IS_WINDOWS) { + withCWD(rwHostIOVFS, VFS_ROOT_PATH, (fs) -> fs.copy(Path.of("file1"), Path.of("..", realFSTarget.toString()))); + assertTrue(Files.exists(realFSTarget)); + newByteChannelRealFS(rwHostIOVFS, realFSTarget, "text1"); + } + + } + + @Test + public void testImpl() throws Exception { + Set ignored = Set.of( + "isSameFile", + "getSeparator", + "getPathSeparator"); + Set implementedMethods = new HashSet<>(); + Class vfsClass; + try (VirtualFileSystem vfs = VirtualFileSystem.create()) { + Field fs = vfs.getClass().getDeclaredField("impl"); + fs.setAccessible(true); + vfsClass = fs.get(vfs).getClass(); + + for (Method m : vfsClass.getDeclaredMethods()) { + if (Modifier.isPublic(m.getModifiers()) && !Modifier.isStatic(m.getModifiers())) { + implementedMethods.add(m.getName()); + } + } + } + + List notImplemented = new ArrayList<>(); + for (Method m : FileSystem.class.getDeclaredMethods()) { + if (Modifier.isPublic(m.getModifiers()) && !Modifier.isStatic(m.getModifiers())) { + if (ignored.contains(m.getName())) { + continue; + } + if (!implementedMethods.contains(m.getName())) { + notImplemented.add(m.getName()); + } + } + } + + if (!notImplemented.isEmpty()) { + fail(vfsClass.getName() + " is missing implemention for " + notImplemented); + } + } + + private static String fromPathToFSRoot(Path p) { + String ret = Path.of(p.toString(), dotdot(p.getNameCount())).toString(); + assert ret.contains(".."); + return ret; + } + + private static String dotdot(int n) { + String ret = Path.of(".", Stream.generate(() -> "..").limit(n).toArray(String[]::new)).toString(); + if (ret.startsWith(".")) { + ret = ret.substring(2, ret.length()); + } + return ret; + } + + private interface FSCall { + void call(FileSystem fs) throws Exception; + } + + private static void withCWD(FileSystem fs, Path cwd, FSCall c) throws Exception { + Object prevCwd = getCwd(fs); + fs.setCurrentWorkingDirectory(cwd); + try { + c.call(fs); + } finally { + resetCWD(fs, prevCwd); + } + } + + private static Object getCwd(FileSystem fs) throws IllegalAccessException, NoSuchFieldException { + // need to know if CompositeFileSystem.currentWorkingDirectory is set to null, + // because initial CWD is null and in such case CompositeFileSystem: + // - falls back on jdk CWD + // - and also behaves differently as when CWD is set to a non 'null' value + Field f = fs.getClass().getDeclaredField("currentWorkingDirectory"); + f.setAccessible(true); + return f.get(fs); + } + + private static void resetCWD(FileSystem fs, Object oldCwd) throws NoSuchFieldException, IllegalAccessException { + // calling fs.setCurrentWorkingDirectory(null) is not possible, so use reflection instead + // see also getCwd() + Field f = fs.getClass().getDeclaredField("currentWorkingDirectory"); + f.setAccessible(true); + f.set(fs, oldCwd); + } + +} diff --git a/graalpython/com.oracle.graal.python.test/src/org/graalvm/python/embedding/vfs/test/VFSUtilsTest.java b/graalpython/com.oracle.graal.python.test/src/org/graalvm/python/embedding/vfs/test/VFSUtilsTest.java new file mode 100644 index 0000000000..d8554d8a00 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/org/graalvm/python/embedding/vfs/test/VFSUtilsTest.java @@ -0,0 +1,745 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.graalvm.python.embedding.vfs.test; + +import org.graalvm.python.embedding.test.EmbeddingTestUtils; +import org.graalvm.python.embedding.tools.exec.BuildToolLog; +import org.graalvm.python.embedding.tools.vfs.VFSUtils; +import org.graalvm.python.embedding.tools.vfs.VFSUtils.PackagesChangedException; +import org.junit.Test; + +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static org.graalvm.python.embedding.test.EmbeddingTestUtils.createLauncher; +import static org.graalvm.python.embedding.test.EmbeddingTestUtils.delete; +import static org.graalvm.python.embedding.test.EmbeddingTestUtils.deleteDirOnShutdown; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +public class VFSUtilsTest { + + private static final String GRAALPY_VERSION_PREFIX; + private static final String INPUT_PACKAGES_PREFIX; + + static { + try { + Field f = VFSUtils.class.getDeclaredField("GRAALPY_VERSION_PREFIX"); + f.setAccessible(true); + GRAALPY_VERSION_PREFIX = (String) f.get(VFSUtils.class); + f = VFSUtils.class.getDeclaredField("INPUT_PACKAGES_PREFIX"); + f.setAccessible(true); + INPUT_PACKAGES_PREFIX = (String) f.get(VFSUtils.class); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + private static final String PACKAGE_WAS_REMOVED = "A package with transitive dependencies was removed since last install, setting up a clean venv"; + private static final String LOCK_FILE_HEADER = "generated by graalpy tests\nwith a two line header"; + private static final String MISSING_LOCK_FILE_WARNING = "missing lock file"; + private static final CharSequence STALE_VENV = "Stale GraalPy virtual environment, updating to"; + + private static final class TestLog implements BuildToolLog { + private final StringBuilder output = new StringBuilder(); + + private void addLine(String s) { + this.output.append('\n').append(s); + } + + private void clearOutput() { + output.delete(0, output.length()); + } + + public void subProcessOut(String s) { + println("[subout] ", s); + addLine(s.toString()); + } + + public void subProcessErr(String s) { + println("[suberr] ", s); + addLine(s.toString()); + } + + public void info(String s) { + println("[info] ", s); + addLine(s); + } + + public void warning(String s) { + println("[warn] ", s); + addLine(s); + } + + public void warning(String s, Throwable t) { + println("[warn] ", s); + t.printStackTrace(); + addLine(s); + } + + public void error(String s) { + println("[err] ", s); + addLine(s); + } + + @Override + public void debug(String s) { + println("[debug] ", s); + addLine(s); + } + + @Override + public boolean isWarningEnabled() { + return true; + } + + @Override + public boolean isInfoEnabled() { + return true; + } + + @Override + public boolean isErrorEnabled() { + return true; + } + + @Override + public boolean isSubprocessOutEnabled() { + return true; + } + + @Override + public boolean isDebugEnabled() { + return isVerbose(); + } + + public String getOutput() { + return output.toString(); + } + + static void println(String... args) { + if (isVerbose()) { + System.out.println(String.join(" ", args)); + } + } + + private static boolean isVerbose() { + return Boolean.getBoolean("com.oracle.graal.python.test.verbose"); + } + } + + /** + * tests scenarios without lock file logic available, but not used + * + * - packages declared only in plugin config - lock file path is provided, but does not exist + */ + @Test + public void withPackagesOnlyFromPluginConfig() throws IOException, PackagesChangedException { + TestLog log = new TestLog(); + Path tmpDir = Files.createTempDirectory("withPackagesOnlyFromPluginConfig"); + Path venvDir = tmpDir.resolve("venv"); + deleteDirOnShutdown(tmpDir); + + // test with a not existing lock file path + // the maven and gradle plugins always send the default lock file path, no matter if the + // file exists or not + Path lockFile = tmpDir.resolve("lockFile.txt"); + Path contents = venvDir.resolve("contents"); + + // no packages, lock file file does not exist - does nothing + log.clearOutput(); + createVenv(venvDir, "0.1", log, lockFile); + assertFalse(Files.exists(venvDir)); + checkVenvCreate(log.getOutput(), false); + assertFalse(log.getOutput().contains("pip install")); + + log.clearOutput(); + + // install packages + log.clearOutput(); + createVenv(venvDir, "0.1", log, lockFile, "hello-world", "tiny-tiny"); + assertTrue(Files.exists(venvDir)); + checkVenvCreate(log.getOutput(), true); + assertTrue(log.getOutput().contains("pip install")); + assertTrue(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + checkInstalledPackages(venvDir.resolve("installed.txt"), "hello-world", "tiny-tiny"); + checkVenvContentsFile(contents, "0.1", "hello-world", "tiny-tiny"); + + // install packages again, assert that venv wasn't created again and packages weren't + // installed + log.clearOutput(); + createVenv(venvDir, "0.1", log, lockFile, "hello-world", "tiny-tiny"); + assertTrue(Files.exists(venvDir)); + checkVenvCreate(log.getOutput(), false); + assertFalse(log.getOutput().contains("pip install")); + assertFalse(log.getOutput().contains("hello-world")); + assertFalse(log.getOutput().contains("tiny-tiny")); + assertTrue(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + checkInstalledPackages(venvDir.resolve("installed.txt"), "hello-world", "tiny-tiny"); + checkVenvContentsFile(contents, "0.1", "hello-world", "tiny-tiny"); + + // remove tiny-tiny, assert that venv was deleted and created anew as we don't know if there + // were any transitive deps left + log.clearOutput(); + createVenv(venvDir, "0.1", log, lockFile, "hello-world"); + assertTrue(Files.exists(venvDir)); + checkVenvCreate(log.getOutput(), true); + assertTrue(log.getOutput().contains(PACKAGE_WAS_REMOVED)); + assertTrue(log.getOutput().contains("pip install")); + assertTrue(log.getOutput().contains("hello-world")); + assertFalse(log.getOutput().contains("tiny-tiny")); + assertTrue(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + checkInstalledPackages(venvDir.resolve("installed.txt"), "hello-world"); + checkVenvContentsFile(contents, "0.1", "hello-world"); + + // install only hello-world again, assert that venv wasn't created and + // packages weren't installed + log.clearOutput(); + createVenv(venvDir, "0.1", log, lockFile, "hello-world==0.2"); + assertTrue(Files.exists(venvDir)); + checkVenvCreate(log.getOutput(), false); + assertTrue(log.getOutput().contains("pip install")); + assertTrue(log.getOutput().contains("pip uninstall")); + assertTrue(log.getOutput().contains("hello-world")); + assertFalse(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + checkInstalledPackages(venvDir.resolve("installed.txt"), "hello-world"); + checkVenvContentsFile(contents, "0.1", "hello-world==0.2"); + } + + /** + * tests scenarios without lock file logic - e.g. when called from jbang + * + * - packages declared only in plugin config - and lock file path is not provided + */ + @Test + public void withoutLockFile() throws IOException, PackagesChangedException { + TestLog log = new TestLog(); + Path tmpDir = Files.createTempDirectory("withoutLockFile"); + Path venvDir = tmpDir.resolve("venv"); + Path contents = venvDir.resolve("contents"); + deleteDirOnShutdown(tmpDir); + + createVenv(venvDir, "0.1", log); + assertFalse(Files.exists(venvDir)); + checkVenvCreate(log.getOutput(), false); + assertFalse(log.getOutput().contains("pip install")); + assertFalse(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + log.clearOutput(); + + createVenv(venvDir, "0.1", log, "hello-world==0.1"); + assertTrue(Files.exists(venvDir)); + checkVenvCreate(log.getOutput(), true); + assertFalse(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + checkInstalledPackages(venvDir.resolve("installed.txt"), "hello-world"); + checkVenvContentsFile(contents, "0.1", "hello-world==0.1"); + log.clearOutput(); + + createVenv(venvDir, "0.1", log, "hello-world==0.1", "tiny-tiny"); + assertTrue(Files.exists(venvDir)); + checkVenvCreate(log.getOutput(), false); + assertFalse(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + checkInstalledPackages(venvDir.resolve("installed.txt"), "hello-world", "tiny-tiny"); + checkVenvContentsFile(contents, "0.1", "hello-world==0.1", "tiny-tiny"); + log.clearOutput(); + + createVenv(venvDir, "0.1", log, "hello-world==0.1"); + assertTrue(Files.exists(venvDir)); + checkVenvCreate(log.getOutput(), true); + assertFalse(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + checkInstalledPackages(venvDir.resolve("installed.txt"), "hello-world"); + checkVenvContentsFile(contents, "0.1", "hello-world==0.1"); + log.clearOutput(); + } + + @Test + public void lockFile() throws IOException { + TestLog log = new TestLog(); + Path tmpDir = Files.createTempDirectory("emptyLockFile"); + Path venvDir = tmpDir.resolve("venv"); + deleteDirOnShutdown(tmpDir); + + Path lockFile = tmpDir.resolve("graalpy.lock"); + + Files.createFile(lockFile); + + createWithLockFile(venvDir, lockFile, log); + + List validLockFileHeader = createLockFileHeader("0.1", "pkg"); + + List lockFileList; + int headerLineCount = LOCK_FILE_HEADER.split("\n").length; + + // bogus graalPyVersion line + int graalpVersionLineIdx = headerLineCount; + lockFileList = new ArrayList<>(validLockFileHeader); + lockFileList.set(graalpVersionLineIdx, "test"); + createWithLockFile(venvDir, lockFile, log, lockFileList); + + // empty graalPyVersion line + lockFileList = new ArrayList<>(validLockFileHeader); + lockFileList.set(graalpVersionLineIdx, GRAALPY_VERSION_PREFIX); + createWithLockFile(venvDir, lockFile, log, lockFileList); + lockFileList = new ArrayList<>(validLockFileHeader); + lockFileList.set(graalpVersionLineIdx, GRAALPY_VERSION_PREFIX + " "); + createWithLockFile(venvDir, lockFile, log, lockFileList); + + // bogus input packages line + lockFileList = new ArrayList<>(validLockFileHeader); + lockFileList.set(3, "test"); + createWithLockFile(venvDir, lockFile, log, lockFileList); + + // empty input packages line + lockFileList = new ArrayList<>(validLockFileHeader); + lockFileList.set(3, INPUT_PACKAGES_PREFIX); + createWithLockFile(venvDir, lockFile, log, lockFileList); + lockFileList = new ArrayList<>(validLockFileHeader); + lockFileList.set(3, INPUT_PACKAGES_PREFIX + " "); + createWithLockFile(venvDir, lockFile, log, lockFileList); + } + + private static void createWithLockFile(Path venvDir, Path lockFile, TestLog log, List lines) throws IOException { + createWithLockFile(venvDir, lockFile, log, lines.toArray(new String[lines.size()])); + } + + private static void createWithLockFile(Path venvDir, Path lockFile, TestLog log, String... lines) throws IOException { + Files.write(lockFile, new ArrayList<>(Arrays.asList(lines)), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); + checkException(IOException.class, () -> createVenv(venvDir, "0.1", log, lockFile), "Cannot read the lock file from "); + assertFalse(Files.exists(venvDir)); + checkVenvCreate(log.getOutput(), false); + assertFalse(log.getOutput().contains("pip install")); + log.clearOutput(); + } + + private static void lock(Path venvDir, Path lockFile, TestLog log, String... packages) throws IOException { + VFSUtils.lockPackages(venvDir, Arrays.asList(packages), lockFile, LOCK_FILE_HEADER, createLauncher(venvDir), "0.1", log); + } + + private static List createLockFileHeader(String graalPyVersion, String... packages) { + List lines = new ArrayList<>(); + for (String s : LOCK_FILE_HEADER.split("\n")) { + lines.add("# " + s); + } + lines.add(GRAALPY_VERSION_PREFIX + graalPyVersion); + lines.add(INPUT_PACKAGES_PREFIX + String.join(",", packages)); + return lines; + } + + @Test + public void installAndLock() throws IOException, PackagesChangedException { + TestLog log = new TestLog(); + Path tmpDir = Files.createTempDirectory("installAndLock"); + Path venvDir = tmpDir.resolve("venv"); + Path contents = venvDir.resolve("contents"); + deleteDirOnShutdown(tmpDir); + + Path lockFile = tmpDir.resolve("graalpy.lock"); + + // install request from plugin config, it pulls in transitive pkgs, and + // we get the missing lock file warning + createVenv(venvDir, "0.1", log, lockFile, "requests"); + assertTrue(Files.exists(venvDir)); + checkVenvCreate(log.getOutput(), true); + checkInstalledPackages(venvDir.resolve("installed.txt"), "requests", "charset-normalizer", "idna", "urllib3", "certifi"); + checkVenvContentsFile(contents, "0.1", "requests"); + assertTrue(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + log.clearOutput(); + + // lock without version + lock(venvDir, lockFile, log, "requests"); + assertTrue(Files.exists(lockFile)); + assertFalse(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + // lock with version + Files.delete(lockFile); + lock(venvDir, lockFile, log, "requests==2.32.2"); + checkLockFile(lockFile, new String[]{"requests==2.32.2"}, "requests==2.32.2", "charset-normalizer", "idna", "urllib3", "certifi"); + checkVenvContentsFile(contents, "0.1", "requests==2.32.2"); + assertFalse(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + log.clearOutput(); + + // reinstall without exact version declared - fails + checkException(PackagesChangedException.class, () -> createVenv(venvDir, "0.1", log, lockFile, "requests")); + checkVenvCreate(log.getOutput(), false); + assertFalse(log.getOutput().contains("pip install")); + checkInstalledPackages(venvDir.resolve("installed.txt"), "requests==2.32.2", "charset-normalizer", "idna", "urllib3", "certifi"); + checkVenvContentsFile(contents, "0.1", "requests==2.32.2"); + assertFalse(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + log.clearOutput(); + + // reinstall again - no more warning + delete(venvDir); + createVenv(venvDir, "0.1", log, lockFile, "requests==2.32.2"); + assertTrue(Files.exists(venvDir)); + checkVenvCreate(log.getOutput(), true); + checkInstalledPackages(venvDir.resolve("installed.txt"), "requests==2.32.2", "charset-normalizer", "idna", "urllib3", "certifi"); + checkVenvContentsFile(contents, "0.1", "requests==2.32.2"); + assertFalse(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + log.clearOutput(); + + // reinstall with lower version - ok + Files.delete(lockFile); + createVenv(venvDir, "0.1", log, lockFile, "requests==2.32.1"); + // we changed version from 2.32.2 to 2.32.1, we do not know if the prev version did not + // leave + // any transitive deps, so the venv is deleted and created again + checkVenvCreate(log.getOutput(), true); + assertTrue(log.getOutput().contains("pip install")); + checkInstalledPackages(venvDir.resolve("installed.txt"), "requests==2.32.1", "charset-normalizer", "idna", "urllib3", "certifi"); + checkVenvContentsFile(contents, "0.1", "requests==2.32.1"); + assertTrue(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + log.clearOutput(); + // lock + lock(venvDir, lockFile, log, "requests==2.32.1"); + checkLockFile(lockFile, new String[]{"requests==2.32.1"}, "requests==2.32.1", "charset-normalizer", "idna", "urllib3", "certifi"); + checkInstalledPackages(venvDir.resolve("installed.txt"), "requests==2.32.1", "charset-normalizer", "idna", "urllib3", "certifi"); + assertFalse(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + log.clearOutput(); + + // add tiny-tiny - fails because inconsistent with lock file + assert Files.exists(lockFile); + checkException(PackagesChangedException.class, () -> createVenv(venvDir, "0.1", log, lockFile, "requests==2.32.1", "tiny-tiny==0.2")); + checkVenvCreate(log.getOutput(), false); + assertFalse(log.getOutput().contains("pip install")); + checkInstalledPackages(venvDir.resolve("installed.txt"), "requests==2.32.1", "charset-normalizer", "idna", "urllib3", "certifi"); + checkVenvContentsFile(contents, "0.1", "requests==2.32.1"); + assertFalse(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + log.clearOutput(); + + // delete lock and try again tiny-tiny - now ok + Files.delete(lockFile); + createVenv(venvDir, "0.1", log, lockFile, "requests==2.32.1", "tiny-tiny==0.2"); + checkVenvCreate(log.getOutput(), false); + assertTrue(log.getOutput().contains("pip install")); + checkInstalledPackages(venvDir.resolve("installed.txt"), "requests==2.32.1", "tiny-tiny==0.2", "charset-normalizer", "idna", "urllib3", "certifi"); + checkVenvContentsFile(contents, "0.1", "requests==2.32.1", "tiny-tiny==0.2"); + assertTrue(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + log.clearOutput(); + // lock + lock(venvDir, lockFile, log, "requests==2.32.1", "tiny-tiny==0.2"); + checkLockFile(lockFile, new String[]{"requests==2.32.1", "tiny-tiny==0.2"}, "requests==2.32.1", "tiny-tiny==0.2", "charset-normalizer", "idna", "urllib3", "certifi"); + checkInstalledPackages(venvDir.resolve("installed.txt"), "requests==2.32.1", "tiny-tiny==0.2", "charset-normalizer", "idna", "urllib3", "certifi"); + assertFalse(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + log.clearOutput(); + + // install again - OK + createVenv(venvDir, "0.1", log, lockFile, "requests==2.32.1", "tiny-tiny==0.2"); + checkVenvCreate(log.getOutput(), false); + assertFalse(log.getOutput().contains("pip install")); + checkInstalledPackages(venvDir.resolve("installed.txt"), "requests==2.32.1", "tiny-tiny==0.2", "charset-normalizer", "idna", "urllib3", "certifi"); + checkVenvContentsFile(contents, "0.1", "requests==2.32.1", "tiny-tiny==0.2"); + assertFalse(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + log.clearOutput(); + + // update in declared packages requests version back to 2.32.2 - fails + checkException(PackagesChangedException.class, () -> createVenv(venvDir, "0.1", log, lockFile, "requests==2.32.2", "tiny-tiny==0.2")); + checkVenvCreate(log.getOutput(), false); + assertFalse(log.getOutput().contains("pip install")); + checkInstalledPackages(venvDir.resolve("installed.txt"), "requests==2.32.1", "tiny-tiny==0.2", "charset-normalizer", "idna", "urllib3", "certifi"); + checkVenvContentsFile(contents, "0.1", "requests==2.32.1", "tiny-tiny==0.2"); + assertFalse(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + log.clearOutput(); + + // delete lock and try again new hello-world version - now ok + Files.delete(lockFile); + createVenv(venvDir, "0.1", log, lockFile, "requests==2.32.2", "tiny-tiny==0.2"); + // we changed version from 2.32.2 to 2.32.1, we do not know if the prev version did not + // leave + // any transitive deps, so the venv is deleted and created again + checkVenvCreate(log.getOutput(), true); + assertTrue(log.getOutput().contains("pip install")); + checkInstalledPackages(venvDir.resolve("installed.txt"), "requests==2.32.2", "tiny-tiny==0.2", "charset-normalizer", "idna", "urllib3", "certifi"); + checkVenvContentsFile(contents, "0.1", "requests==2.32.2", "tiny-tiny==0.2"); + assertTrue(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + log.clearOutput(); + // lock with new requests version + lock(venvDir, lockFile, log, "requests==2.32.2", "tiny-tiny==0.2"); + checkInstalledPackages(venvDir.resolve("installed.txt"), "requests==2.32.2", "tiny-tiny==0.2", "charset-normalizer", "idna", "urllib3", "certifi"); + checkLockFile(lockFile, new String[]{"requests==2.32.2", "tiny-tiny==0.2"}, "requests==2.32.2", "tiny-tiny==0.2", "charset-normalizer", "idna", "urllib3", "certifi"); + assertFalse(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + log.clearOutput(); + + // install again - OK + createVenv(venvDir, "0.1", log, lockFile, "requests==2.32.2", "tiny-tiny==0.2"); + checkVenvCreate(log.getOutput(), false); + assertFalse(log.getOutput().contains("pip install")); + checkInstalledPackages(venvDir.resolve("installed.txt"), "requests==2.32.2", "tiny-tiny==0.2", "charset-normalizer", "idna", "urllib3", "certifi"); + checkLockFile(lockFile, new String[]{"requests==2.32.2", "tiny-tiny==0.2"}, "requests==2.32.2", "tiny-tiny==0.2", "charset-normalizer", "idna", "urllib3", "certifi"); + checkVenvContentsFile(contents, "0.1", "requests==2.32.2", "tiny-tiny==0.2"); + assertFalse(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + log.clearOutput(); + + // remove requests from packages list - fails because it is still in lock + checkException(PackagesChangedException.class, () -> createVenv(venvDir, "0.1", log, lockFile, "tiny-tiny==0.2")); + checkVenvCreate(log.getOutput(), false); + assertFalse(log.getOutput().contains("pip install")); + log.clearOutput(); + // lock only with tiny-tiny + lock(venvDir, lockFile, log, "tiny-tiny==0.2"); + checkVenvCreate(log.getOutput(), true); + checkLockFile(lockFile, new String[]{"tiny-tiny==0.2"}, "tiny-tiny==0.2"); + // requests transitive deps are gone as well + checkInstalledPackages(venvDir.resolve("installed.txt"), "tiny-tiny==0.2"); + checkVenvContentsFile(contents, "0.1", "tiny-tiny==0.2"); + assertFalse(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + log.clearOutput(); + // try again + createVenv(venvDir, "0.1", log, lockFile, "tiny-tiny==0.2"); + checkVenvCreate(log.getOutput(), false); + assertFalse(log.getOutput().contains("pip install")); + assertTrue(log.getOutput().contains("Virtual environment is up to date with lock file")); + log.clearOutput(); + + // reinstall with new graalpy version + createVenv(venvDir, "0.2", log, lockFile, "tiny-tiny==0.2"); + checkVenvCreate(log.getOutput(), true); + assertTrue(log.getOutput().contains(STALE_VENV)); + assertTrue(log.getOutput().contains("pip install -r")); // lock file is used + checkInstalledPackages(venvDir.resolve("installed.txt"), "tiny-tiny==0.2"); + checkVenvContentsFile(contents, "0.2", "tiny-tiny==0.2"); + assertFalse(log.getOutput().contains(MISSING_LOCK_FILE_WARNING)); + log.clearOutput(); + } + + @Test + public void packageRemoved() throws InvocationTargetException, NoSuchMethodException, IllegalAccessException, IOException { + Path tmpDir = Files.createTempDirectory("packageRemoved"); + deleteDirOnShutdown(tmpDir); + + assertFalse(callPackageRemoved(Collections.emptyList(), Collections.emptyList(), Collections.emptyList())); + assertFalse(callPackageRemoved(Arrays.asList("pkg1"), Collections.emptyList(), Collections.emptyList())); + assertFalse(callPackageRemoved(Arrays.asList("pkg1"), Arrays.asList("pkg1"), Arrays.asList("pkg1==1"))); + assertFalse(callPackageRemoved(Arrays.asList("pkg1", "pkg2"), Arrays.asList("pkg1"), Arrays.asList("pkg1==1"))); + assertFalse(callPackageRemoved(Arrays.asList("pkg1", "pkg2"), Arrays.asList("pkg1", "pkg2"), Arrays.asList("pkg1==1", "pkg2==1"))); + + assertFalse(callPackageRemoved(Arrays.asList("pkg1=="), Arrays.asList("pkg1=="), Arrays.asList("pkg1==1"))); + assertFalse(callPackageRemoved(Arrays.asList("==pkg1"), Arrays.asList("==pkg1"), Arrays.asList("pkg1==1"))); + assertFalse(callPackageRemoved(Arrays.asList("pkg1==1"), Arrays.asList("pkg1"), Arrays.asList("pkg1==1"))); + assertFalse(callPackageRemoved(Arrays.asList("pkg1"), Arrays.asList("pkg1"), Arrays.asList("pkg1==1"))); + + assertTrue(callPackageRemoved(Collections.emptyList(), Arrays.asList("pkg"), Arrays.asList("pkg==1"))); + assertTrue(callPackageRemoved(Arrays.asList("pkg2"), Arrays.asList("pkg1"), Arrays.asList("pkg1==1"))); + assertTrue(callPackageRemoved(Arrays.asList("pkg1"), Arrays.asList("pkg1", "pkg2"), Arrays.asList("pkg1==1", "pkg2==1"))); + + assertTrue(callPackageRemoved(Arrays.asList("pkg1"), Arrays.asList("pkg1=="), Arrays.asList("pkg1==1"))); + assertTrue(callPackageRemoved(Arrays.asList("pkg1=="), Arrays.asList("pkg1"), Arrays.asList("pkg1==1"))); + assertTrue(callPackageRemoved(Arrays.asList("==pkg1"), Arrays.asList("pkg1"), Arrays.asList("pkg1==1"))); + + assertTrue(callPackageRemoved(Arrays.asList("pkg1==2"), Arrays.asList("pkg1==1"), Arrays.asList("pkg1==1"))); + assertTrue(callPackageRemoved(Arrays.asList("pkg1==2"), Arrays.asList("pkg1==1", "pkg2==1"), Arrays.asList("pkg1==1", "pkg2==1"))); + assertTrue(callPackageRemoved(Arrays.asList("pkg1==2"), Arrays.asList("pkg1", "pkg2"), Arrays.asList("pkg1==1", "pkg2==1"))); + } + + @Test + public void venvContentsFormat() throws IOException, PackagesChangedException { + TestLog log = new TestLog(); + Path tmpDir = Files.createTempDirectory("installAndLock"); + Path venvDir = tmpDir.resolve("venv"); + Path contents = venvDir.resolve("contents"); + deleteDirOnShutdown(tmpDir); + + Path lockFile = tmpDir.resolve("graalpy.lock"); + + // 1a.) create venv + createVenv(venvDir, "24.2.0", log, lockFile, "hello-world", "tiny-tiny"); + assertTrue(Files.exists(venvDir)); + checkVenvCreate(log.getOutput(), true); + checkVenvContentsFile(contents, "24.2.0", "hello-world", "tiny-tiny"); + log.clearOutput(); + // 1b.) and patch venv contents with format as if from graalpy < 25.0.0 + // first line is version, all following lines are packages + Files.write(contents, Arrays.asList("24.2.0", "hello-world", "tiny-tiny"), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); + + // 2.) now again, all we are interested in, is that + // - no error appears due to previous version contents format + // - and contents are back as expected + createVenv(venvDir, "25.0.0", log, lockFile, "hello-world", "tiny-tiny"); + assertTrue(Files.exists(venvDir)); + checkVenvCreate(log.getOutput(), true); + checkVenvContentsFile(contents, "25.0.0", "hello-world", "tiny-tiny"); + } + + @Test + public void differentPlatform() throws IOException, PackagesChangedException { + TestLog log = new TestLog(); + Path tmpDir = Files.createTempDirectory("installAndLock"); + Path venvDir = tmpDir.resolve("venv"); + Path contents = venvDir.resolve("contents"); + deleteDirOnShutdown(tmpDir); + + Path lockFile = tmpDir.resolve("graalpy.lock"); + + // 1a.) create venv + createVenv(venvDir, "0.1", log, lockFile, "hello-world"); + assertTrue(Files.exists(venvDir)); + checkVenvCreate(log.getOutput(), true); + checkVenvContentsFile(contents, "0.1", "hello-world"); + log.clearOutput(); + // 1b.) and patch venv contents with different platform + List lines = Files.readAllLines(contents).stream().map(l -> l.startsWith("platform=") ? "platform=bogus" : l).collect(Collectors.toList()); + Files.write(contents, lines, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); + + // 2.) now again - venv is removed and newly created + createVenv(venvDir, "0.1", log, lockFile, "hello-world"); + assertTrue(Files.exists(venvDir)); + checkVenvCreate(log.getOutput(), true); + checkVenvContentsFile(contents, "0.1", "hello-world"); + assertTrue(log.getOutput().contains("Reinstalling GraalPy venv created on")); + } + + private static boolean callPackageRemoved(List packages, List contents, List installed) + throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Method m = VFSUtils.class.getDeclaredMethod("removedFromPluginPackages", List.class, List.class, List.class); + m.setAccessible(true); + return (boolean) m.invoke(VFSUtils.class, packages, contents, installed); + } + + private interface ExceptionCall { + void call() throws Exception; + } + + private static void checkException(Class cls, ExceptionCall c) { + checkException(cls, c, null); + } + + private static void checkException(Class cls, ExceptionCall c, String msg) { + try { + c.call(); + } catch (Exception e) { + if (e instanceof InvocationTargetException) { + assertEquals(cls, e.getCause().getClass()); + } else { + assertEquals(cls, e.getClass()); + } + if (msg != null) { + assertTrue(e.getMessage().contains(msg)); + } + } + } + + private static void checkVenvCreate(String output, boolean b) { + if (b) { + assertTrue(output.contains("-m venv")); + assertTrue(output.contains("-m ensurepip")); + } else { + assertFalse(output.contains("-m venv")); + assertFalse(output.contains("-m ensurepip")); + } + } + + private static void checkInstalledPackages(Path instaledFile, String... packages) throws IOException { + assertTrue(Files.exists(instaledFile)); + checkPackages(instaledFile, Files.readAllLines(instaledFile), packages); + } + + private static void checkLockFile(Path lockFile, String[] inputPackages, String... installedPackages) throws IOException { + assertTrue(Files.exists(lockFile)); + List lines = Files.readAllLines(lockFile); + List header = createLockFileHeader("0.1", inputPackages); + assertTrue(lines.size() >= header.size()); + for (int i = 0; i < header.size(); i++) { + assertEquals(header.get(i), lines.get(i)); + } + checkPackages(lockFile, lines, installedPackages); + } + + private static void checkPackages(Path file, List linesArg, String... packages) { + List lines = linesArg.stream().filter(line -> !line.trim().startsWith("#") && !line.trim().isEmpty()).toList(); + assertEquals(packages.length, lines.size()); + for (String pkg : packages) { + boolean found = false; + String pkgDef = pkg.indexOf("==") >= 0 ? pkg : pkg + "=="; + for (String line : lines) { + assert line.contains("=="); + if (line.startsWith(pkgDef)) { + found = true; + break; + } + } + if (!found) { + fail("file " + file + " does not contain package " + pkg); + } + } + } + + private static void createVenv(Path venvDir, String graalPyVersion, TestLog log, String... packages) throws IOException, PackagesChangedException { + EmbeddingTestUtils.createVenv(venvDir, graalPyVersion, log, packages); + } + + private static void createVenv(Path venvDir, String graalPyVersion, TestLog log, Path lockFile, String... packages) throws IOException, PackagesChangedException { + EmbeddingTestUtils.createVenv(venvDir, graalPyVersion, log, lockFile, MISSING_LOCK_FILE_WARNING, packages); + } + + private static void checkVenvContentsFile(Path contents, String graalPyVersion, String... packages) throws IOException { + assertTrue(Files.exists(contents)); + List lines = Files.readAllLines(contents); + + Map m = lines.stream().collect(Collectors.toMap( + l -> { + int idx = l.indexOf("="); + return l.substring(0, idx); + }, l -> { + int idx = l.indexOf("="); + return l.substring(idx + 1); + })); + + assertEquals(graalPyVersion, m.get("version")); + assertTrue(m.get("platform").contains(System.getProperty("os.name"))); + assertTrue(m.get("platform").contains(System.getProperty("os.arch"))); + List pkgs = m.get("input_packages") != null ? Arrays.asList(m.get("input_packages").split(",")) : Collections.emptyList(); + assertEquals(packages.length, pkgs.size()); + if (!pkgs.containsAll(Arrays.asList(packages))) { + fail(String.format("expected %s to contain all from %s", pkgs, Arrays.asList(packages))); + } + } +} diff --git a/graalpython/com.oracle.graal.python.test/src/python_unittests.py b/graalpython/com.oracle.graal.python.test/src/python_unittests.py deleted file mode 100644 index 16a88bd53a..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/python_unittests.py +++ /dev/null @@ -1,1079 +0,0 @@ -# Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# The Universal Permissive License (UPL), Version 1.0 -# -# Subject to the condition set forth below, permission is hereby granted to any -# person obtaining a copy of this software, associated documentation and/or -# data (collectively the "Software"), free of charge and under any and all -# copyright rights in the Software, and any and all patent rights owned or -# freely licensable by each licensor hereunder covering either (i) the -# unmodified Software as contributed to or provided by such licensor, or (ii) -# the Larger Works (as defined below), to deal in both -# -# (a) the Software, and -# -# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if -# one is included with the Software each a "Larger Work" to which the Software -# is contributed by such licensors), -# -# without restriction, including without limitation the rights to copy, create -# derivative works of, display, perform, and distribute the Software and make, -# use, sell, offer for sale, import, export, have made, and have sold the -# Software and the Larger Work(s), and to sublicense the foregoing rights on -# either these or other terms. -# -# This license is subject to the following condition: -# -# The above copyright notice and either this complete permission notice or at a -# minimum a reference to the UPL must be included in all copies or substantial -# portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import csv -import gzip -import os -import signal -import re -import html -import time -import subprocess -from collections import defaultdict -from json import dumps -from multiprocessing import Pool, TimeoutError -from pprint import pformat - - -import argparse -import sys -from time import gmtime, strftime - -# global CLI flags -flags = None - -# constants -PATH_UNITTESTS = "graalpython/lib-python/3/test/" - -_BASE_NAME = "unittests" -TXT_RESULTS_NAME = "{}.txt.gz".format(_BASE_NAME) -CSV_RESULTS_NAME = "{}.csv".format(_BASE_NAME) -HTML_RESULTS_NAME = "{}.html".format(_BASE_NAME) -LATEST_HTML_NAME = "latest.html" - -TIMEOUT_LINE = "\nTEST TIMED OUT WITH GRAAL PYTHON RUNNER" - -HR = "".join(['-' for _ in range(120)]) - -PTRN_ERROR = re.compile(r'^(?P[A-Z][a-z][a-zA-Z]+):(?P.*)$') -PTRN_UNITTEST = re.compile(r'^#### running: (?Pgraalpython/lib-python/3/test/(?P[\w.]+)).*$', re.DOTALL) -PTRN_NUM_TESTS = re.compile(r'^Ran (?P\d+) test.*$') -PTRN_FAILED = re.compile( - r'^FAILED \((failures=(?P\d+))?(, )?(errors=(?P\d+))?(, )?(skipped=(?P\d+))?\)$') -PTRN_OK = re.compile( - r'^OK \((failures=(?P\d+))?(, )?(errors=(?P\d+))?(, )?(skipped=(?P\d+))?\)$') -PTRN_JAVA_EXCEPTION = re.compile(r'^(?Pcom\.oracle\.[^:]*):(?P.*)') -PTRN_MODULE_NOT_FOUND = re.compile(r'.*ModuleNotFound: \'(?P.*)\'\..*', re.DOTALL) -PTRN_IMPORT_ERROR = re.compile(r".*cannot import name \'(?P.*)\'.*", re.DOTALL) -PTRN_REMOTE_HOST = re.compile(r"(?P[^@]+)@(?P[^:]+):(?P.+)") -PTRN_VALID_CSV_NAME = re.compile(r"unittests-\d{4}-\d{2}-\d{2}.csv") -PTRN_TEST_STATUS_INDIVIDUAL = re.compile(r"(?Ptest[\w_]+ \(.+?\)) ... (?P.+)") -PTRN_TEST_STATUS_ERROR = re.compile(r"(?P.+): (?Ptest[\w_]+ \(.+?\))") - -TEST_TYPES = tuple(sorted(('array','buffer','code','frame','long','memoryview','unicode','exceptions', - 'baseexception','range','builtin','bytes','thread','property','class','dictviews', - 'sys','imp','rlcompleter','types','coroutines','dictcomps','int_literal','mmap', - 'module','numeric_tower','syntax','traceback','typechecks','int','keyword','raise', - 'descr','generators','list','complex','tuple','enumerate','super','float', - 'bool','fstring','dict','iter','string','scope','with','set'))) - -TEST_APP_SCRIPTING = tuple(sorted(('test_json','csv','io','memoryio','bufio','fileio','file','fileinput','tempfile', - 'pickle','pickletester','pickle','picklebuffer','pickletools','codecs','functools', - 'itertools','math','operator','zlib','zipimport_support','zipfile','zipimport','re', - 'zipapp','gzip','bz2','builtin'))) - -TEST_SERVER_SCRIPTING_DS = tuple(sorted(('sqlite3','asyncio','marshal','select','crypt','ssl','uuid','multiprocessing', - 'fork','forkserver','main_handling','spawn','socket','socket','socketserver', - 'signal','mmap','resource','thread','dummy_thread','threading','threading_local', - 'threadsignals','dummy_threading','threadedtempfile','thread','hashlib', - 'pyexpat','locale','_locale','locale','c_locale_coercion','struct') + TEST_APP_SCRIPTING)) - - -USE_CASE_GROUPS = { - 'Python Language and Built-in Types': TEST_TYPES, - 'Application Scripting': TEST_APP_SCRIPTING, - 'Server-Side Scripting and Data Science': TEST_SERVER_SCRIPTING_DS - } - -# ---------------------------------------------------------------------------------------------------------------------- -# -# logging utils -# -# ---------------------------------------------------------------------------------------------------------------------- -def log(msg, *args, **kwargs): - print(msg.format(*args, **kwargs)) - - -def debug(msg, *args, **kwargs): - if flags.verbose: - log(msg, args, kwargs) - - -def file_name(name, current_date_time): - idx = name.index('.') - if idx > 0: - return '{}-{}{}'.format(name[:idx], current_date_time, name[idx:]) - return '{}-{}'.format(name, current_date_time) - -def get_tail(output, count=15): - lines = output.split("\n") - start = max(0, len(lines) - count) - return '\n'.join(lines[start:]) - -TIMEOUT = 60 * 20 # 20 mins per unittest wait time max ... - -# ---------------------------------------------------------------------------------------------------------------------- -# -# exec utils -# -# ---------------------------------------------------------------------------------------------------------------------- -def _run_cmd(cmd, timeout=TIMEOUT, capture_on_failure=True): - if isinstance(cmd, str): - cmd = cmd.split(" ") - assert isinstance(cmd, (list, tuple)) - - cmd_string = ' '.join(cmd) - log("[EXEC] starting '{}' ...".format(cmd_string)) - - expired = False - - start_time = time.monotonic() - # os.setsid is used to create a process group, to be able to call os.killpg upon timeout - proc = subprocess.Popen(cmd, preexec_fn=os.setsid, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - try: - output = proc.communicate(timeout=timeout)[0] - except subprocess.TimeoutExpired as e: - delta = time.monotonic() - start_time - os.killpg(proc.pid, signal.SIGKILL) - output = proc.communicate()[0] - msg = "TimeoutExpired: {:.3f}s".format(delta) - tail = get_tail(output.decode('utf-8', 'ignore')) - log("[ERR] timeout '{}' after {:.3f}s, killing process group {}, last lines of output:\n{}\n{}", cmd_string, delta, proc.pid, tail, HR) - expired = True - else: - delta = time.monotonic() - start_time - log("[EXEC] finished '{}' with exit code {} in {:.3f}s", cmd_string, proc.returncode, delta) - msg = "Finished: {:.3f}s".format(delta) - - output = output.decode("utf-8", "ignore") - if expired: - output += TIMEOUT_LINE - return proc.returncode == 0, output, msg - - -def scp(results_file_path, destination_path, destination_name=None): - dst_path = destination_name if destination_name else os.path.basename(results_file_path) - remote_dst = os.path.join(destination_path, dst_path) - cmd = ['scp', results_file_path, remote_dst] - return _run_cmd(cmd)[0] - - -def _run_unittest(test_path, timeout, with_cpython=False): - if with_cpython: - exe = os.environ.get("PYTHON3_HOME", None) - if exe: - exe = os.path.join(exe, "python") - else: - exe = "python3" - cmd = [exe, test_path, "-v"] - else: - cmd = ["mx", "python3", "--python.CatchAllExceptions=true", test_path, "-v"] - _, output, msg = _run_cmd(cmd, timeout) - output = ''' -############################################################## -#### running: {} -{} -{} -'''.format(test_path, output, msg) - return output - - - -def run_unittests(unittests, timeout, with_cpython=False): - assert isinstance(unittests, (list, tuple)) - num_unittests = len(unittests) - log("[EXEC] running {} unittests ... ", num_unittests) - log("[EXEC] timeout per unittest: {} seconds", timeout) - - start_time = time.monotonic() - pool = Pool(processes=(os.cpu_count() // 4) or 1) # to account for hyperthreading and some additional overhead - - out = [] - def callback(result): - out.append(result) - log("[PROGRESS] {} / {}: \t {:.1f}%", len(out), num_unittests, len(out) * 100 / num_unittests) - - # schedule all unittest runs - for ut in unittests: - pool.apply_async(_run_unittest, args=(ut, timeout, with_cpython), callback=callback) - - pool.close() - pool.join() - pool.terminate() - log("[STATS] processed {} unittests in {:.3f}s", num_unittests, time.monotonic() - start_time) - return out - - -def get_unittests(base_tests_path, limit=None, sort=True, skip_tests=None): - def _sorter(iterable): - return sorted(iterable) if sort else iterable - unittests = [os.path.join(base_tests_path, name) - for name in _sorter(os.listdir(base_tests_path)) - if name.startswith("test_")] - if skip_tests: - log("[INFO] skipping unittests: {}", skip_tests) - cnt = len(unittests) - unittests = [t for t in unittests if t not in skip_tests] - log("[INFO] running {} of {} unittests", len(unittests), cnt) - return unittests[:limit] if limit else unittests - - -def get_remote_host(scp_path): - match = re.match(PTRN_REMOTE_HOST, scp_path) - return match.group('user'), match.group('host'), match.group('path') - - -def ssh_ls(scp_path): - user, host, path = get_remote_host(scp_path) - cmd = ['ssh', '{}@{}'.format(user, host), 'ls', '-1', path] - return [f for f in _run_cmd(cmd)[1].splitlines() if f] - - -def read_csv(path): - rows = [] - with open(path, "r") as CSV_FILE: - reader = csv.reader(CSV_FILE) - headers = next(reader)[1:] - for row in reader: - rows.append(row) - return rows - - -class TestStatus(object): - ERROR = 'error' - FAIL = 'fail' - SKIPPED = 'skipped' - OK = 'ok' - - -# ---------------------------------------------------------------------------------------------------------------------- -# -# result (output processing) -# -# ---------------------------------------------------------------------------------------------------------------------- -class StatEntry(object): - def __init__(self): - self.num_tests = -1 - # reported stats - self._num_errors = -1 - self._num_fails = -1 - self._num_skipped = -1 - # tracked stats - self._tracked = False - - def _reset(self): - self._num_fails = 0 - self._num_errors = 0 - self._num_skipped = 0 - - def all_ok(self): - self._reset() - - @property - def num_errors(self): - return self._num_errors - - @num_errors.setter - def num_errors(self, value): - if not self._tracked: - self._num_errors = value - - @property - def num_fails(self): - return self._num_fails - - @num_fails.setter - def num_fails(self, value): - if not self._tracked: - self._num_fails = value - - @property - def num_skipped(self): - return self._num_skipped - - @num_skipped.setter - def num_skipped(self, value): - if not self._tracked: - self._num_skipped = value - - @property - def num_passes(self): - if self.num_tests > 0: - return self.num_tests - (self._num_fails + self._num_errors + self._num_skipped) - return -1 - - def update(self, test_detailed_stats): - if len(test_detailed_stats) > 0: - self._tracked = True - self._reset() - for test, stats in test_detailed_stats.items(): - stats = {s.lower() for s in stats} - if TestStatus.ERROR in stats: - self._num_errors += 1 - elif TestStatus.FAIL in stats: - self._num_fails += 1 - else: - for s in stats: - if s.startswith(TestStatus.SKIPPED): - self._num_skipped += 1 - break - - -def process_output(output_lines): - if isinstance(output_lines, str): - output_lines = output_lines.split("\n") - - current_unittest_path = None - unittests = [] - # stats tracked per unittest - unittest_tests = defaultdict(list) - error_messages = defaultdict(dict) - java_exceptions = defaultdict(set) - stats = defaultdict(StatEntry) - - for line in output_lines: - match = re.match(PTRN_UNITTEST, line) - if match: - current_unittest_path = match.group('unittest_path') - unittest = match.group('unittest') - unittests.append(unittest) - unittest_tests.clear() - continue - - # extract python reported python error messages - match = re.match(PTRN_ERROR, line) - if match: - error_message = (match.group('error'), match.group('message')) - if not error_message[0] == 'Directory' and not error_message[0] == 'Components': - error_message_dict = error_messages[unittests[-1]] - d = error_message_dict.get(error_message) - if not d: - d = 0 - error_message_dict[error_message] = d + 1 - continue - - # extract java exceptions - match = re.match(PTRN_JAVA_EXCEPTION, line) - if match: - java_exceptions[unittests[-1]].add((match.group('exception'), match.group('message'))) - continue - - # stats - # tracking stats - match = re.match(PTRN_TEST_STATUS_INDIVIDUAL, line) - if not match: - match = re.match(PTRN_TEST_STATUS_ERROR, line) - if match: - name = match.group('name') - status = match.group('status') - unittest_tests[name].append(status) - continue - - if line.strip() == 'OK': - stats[unittests[-1]].all_ok() - continue - - match = re.match(PTRN_OK, line) - if match: - fails = match.group('failures') - errs = match.group('errors') - skipped = match.group('skipped') - - stats[unittests[-1]].num_fails = int(fails) if fails else 0 - stats[unittests[-1]].num_errors = int(errs) if errs else 0 - stats[unittests[-1]].num_skipped = int(skipped) if skipped else 0 - continue - - match = re.match(PTRN_NUM_TESTS, line) - if match: - stats[unittests[-1]].num_tests = int(match.group('num_tests')) - stats[unittests[-1]].update(unittest_tests) - unittest_tests.clear() - continue - - match = re.match(PTRN_FAILED, line) - if match: - fails = match.group('failures') - errs = match.group('errors') - skipped = match.group('skipped') - if not fails and not errs and not skipped: - continue - - stats[unittests[-1]].num_fails = int(fails) if fails else 0 - stats[unittests[-1]].num_errors = int(errs) if errs else 0 - stats[unittests[-1]].num_skipped = int(skipped) if skipped else 0 - continue - - if line.strip() == TIMEOUT_LINE.strip(): - if current_unittest_path is None or len(unittests) == 0: - # we timed out here before even running something - continue - ran_tests = {} - fails = 0 - errs = 0 - ok = 0 - skip = 0 - for test,status in unittest_tests.items(): - status = " ".join(status).lower() - ran_tests[test.strip()] = status - if "skipped" in status: - skip += 1 - elif "fail" in status: - fails += 1 - elif "ok" in status: - ok += 1 - else: - errs += 1 - - tagfile = ".".join([os.path.splitext(unittests[-1])[0], "txt"]) - prefix = os.path.splitext(current_unittest_path)[0].replace("/", ".") - import glob - candidates = glob.glob("**/" + tagfile, recursive=True) - for candidate in candidates: - with open(candidate) as f: - for tagline in f.readlines(): - tagline = tagline.replace(prefix, "__main__") # account different runner for tagged and this - tagline = tagline.replace("*", "").strip() - tstcls, tst = tagline.rsplit(".", 1) - test = "{} ({})".format(tst, tstcls) - if test not in ran_tests: - ran_tests[test] = "ok" - # count the tagged test we didn't get to as an additional passing test - ok += 1 - else: - status = ran_tests[test] - if "error" in status or "fail" in status: - # interesting: it's tagged but failed here - log("{} did not pass here but is tagged as passing", test) - - stats[unittests[-1]].num_tests = ok + fails + errs + skip - stats[unittests[-1]].num_fails = fails - stats[unittests[-1]].num_errors = errs - stats[unittests[-1]].num_skipped = skip - unittest_tests.clear() - continue - - return unittests, error_messages, java_exceptions, stats - - -# ---------------------------------------------------------------------------------------------------------------------- -# -# python error processing -# -# ---------------------------------------------------------------------------------------------------------------------- -def process_errors(unittests, error_messages, err=None, msg_processor=None): - if isinstance(err, str): - err = {err,} - - def _err_filter(item): - if not err: - return True - return item[0] in err - - def _processor(msg): - if not msg_processor: - return msg - return msg_processor(msg) - - missing_modules = defaultdict(lambda: 0) - for ut in unittests: - errors = error_messages[ut] - for name in map(_processor, (msg for err, msg in filter(_err_filter, errors))): - missing_modules[name] = missing_modules[name] + 1 - - return missing_modules - - -def get_missing_module(msg): - match = re.match(PTRN_MODULE_NOT_FOUND, msg) - return match.group('module') if match else None - - -def get_cannot_import_module(msg): - match = re.match(PTRN_IMPORT_ERROR, msg) - return match.group('module') if match else None - - -# ---------------------------------------------------------------------------------------------------------------------- -# -# csv reporting -# -# ---------------------------------------------------------------------------------------------------------------------- -class Col(object): - UNITTEST = 'unittest' - NUM_TESTS = 'num_tests' - NUM_FAILS = 'num_fails' - NUM_ERRORS = 'num_errors' - NUM_SKIPPED = 'num_skipped' - NUM_PASSES = 'num_passes' - PYTHON_ERRORS = 'python_errors' - CPY_NUM_TESTS = 'cpy_num_tests' - CPY_NUM_FAILS = 'cpy_num_fails' - CPY_NUM_ERRORS = 'cpy_num_errors' - CPY_NUM_SKIPPED = 'cpy_num_skipped' - CPY_NUM_PASSES = 'cpy_num_passes' - - -CSV_HEADER = [ - Col.UNITTEST, - Col.NUM_TESTS, - Col.NUM_FAILS, - Col.NUM_ERRORS, - Col.NUM_SKIPPED, - Col.NUM_PASSES, - Col.CPY_NUM_TESTS, - Col.CPY_NUM_FAILS, - Col.CPY_NUM_ERRORS, - Col.CPY_NUM_SKIPPED, - Col.CPY_NUM_PASSES, - Col.PYTHON_ERRORS -] - - -class Stat(object): - # unittest level aggregates - UT_TOTAL = "ut_total" # all the unittests - UT_RUNS = 'ut_runs' # all unittests which could run - UT_PASS = 'ut_pass' # all unittests which pass - UT_PERCENT_RUNS = "ut_percent_runs" # all unittests which could run even with failures (percent) - UT_PERCENT_PASS = "ut_percent_pass" # all unittests which could run with no failures (percent) - # test level aggregates - TEST_RUNS = "test_runs" # total number of tests that could be loaded and run even with failures - TEST_PASS = "test_pass" # number of tests which ran - TEST_PERCENT_PASS = "test_percent_pass" # percentage of tests which pass from all running tests (all unittests) - - -def save_as_txt(report_path, results): - with gzip.open(report_path, 'wb') as TXT: - output = '\n'.join(results) - TXT.write(bytes(output, 'utf-8')) - return output - - -def save_as_csv(report_path, unittests, error_messages, java_exceptions, stats, cpy_stats=None): - rows = [] - with open(report_path, 'w') as CSV: - totals = { - Col.NUM_TESTS: 0, - Col.NUM_FAILS: 0, - Col.NUM_ERRORS: 0, - Col.NUM_SKIPPED: 0, - Col.NUM_PASSES: 0, - } - total_not_run_at_all = 0 - total_pass_all = 0 - - for unittest in unittests: - unittest_stats = stats[unittest] - cpy_unittest_stats = cpy_stats[unittest] if cpy_stats else None - unittest_errmsg = error_messages[unittest] - if not unittest_errmsg: - unittest_errmsg = java_exceptions[unittest] - if not unittest_errmsg: - unittest_errmsg = {} - - rows.append({ - Col.UNITTEST: unittest, - # graalpython stats - Col.NUM_TESTS: unittest_stats.num_tests, - Col.NUM_FAILS: unittest_stats.num_fails, - Col.NUM_ERRORS: unittest_stats.num_errors, - Col.NUM_SKIPPED: unittest_stats.num_skipped, - Col.NUM_PASSES: unittest_stats.num_passes, - # cpython stats - Col.CPY_NUM_TESTS: cpy_unittest_stats.num_tests if cpy_unittest_stats else None, - Col.CPY_NUM_FAILS: cpy_unittest_stats.num_fails if cpy_unittest_stats else None, - Col.CPY_NUM_ERRORS: cpy_unittest_stats.num_errors if cpy_unittest_stats else None, - Col.CPY_NUM_SKIPPED: cpy_unittest_stats.num_skipped if cpy_unittest_stats else None, - Col.CPY_NUM_PASSES: cpy_unittest_stats.num_passes if cpy_unittest_stats else None, - # errors - Col.PYTHON_ERRORS: dumps(list(unittest_errmsg.items())), - }) - - # update totals that ran in some way - if unittest_stats.num_tests > 0: - totals[Col.NUM_TESTS] += unittest_stats.num_tests - totals[Col.NUM_FAILS] += unittest_stats.num_fails - totals[Col.NUM_ERRORS] += unittest_stats.num_errors - totals[Col.NUM_SKIPPED] += unittest_stats.num_skipped - totals[Col.NUM_PASSES] += unittest_stats.num_passes - if unittest_stats.num_tests == unittest_stats.num_passes: - total_pass_all += 1 - else: - total_not_run_at_all += 1 - - # unittest stats - totals[Stat.UT_TOTAL] = len(unittests) - totals[Stat.UT_RUNS] = len(unittests) - total_not_run_at_all - totals[Stat.UT_PASS] = total_pass_all - ut_total_f = float(totals[Stat.UT_TOTAL]) - totals[Stat.UT_PERCENT_RUNS] = float(totals[Stat.UT_RUNS]) / ut_total_f * 100.0 if ut_total_f > 0.0 else 0.0 - totals[Stat.UT_PERCENT_PASS] = float(totals[Stat.UT_PASS]) / ut_total_f * 100.0 if ut_total_f > 0.0 else 0.0 - # test stats - totals[Stat.TEST_RUNS] = totals[Col.NUM_TESTS] - totals[Stat.TEST_PASS] = totals[Col.NUM_PASSES] - totals[Stat.TEST_PERCENT_PASS] = float(totals[Stat.TEST_PASS]) / float(totals[Stat.TEST_RUNS]) * 100.0 \ - if totals[Stat.TEST_RUNS] else 0 - - writer = csv.DictWriter(CSV, fieldnames=CSV_HEADER) - writer.writeheader() - for row in rows: - writer.writerow(row) - writer.writerow({ - Col.UNITTEST: 'TOTAL', - Col.NUM_TESTS: totals[Col.NUM_TESTS], - Col.NUM_FAILS: totals[Col.NUM_FAILS], - Col.NUM_ERRORS: totals[Col.NUM_ERRORS], - Col.NUM_SKIPPED: totals[Col.NUM_SKIPPED], - Col.NUM_PASSES: totals[Col.NUM_PASSES], - Col.PYTHON_ERRORS: 'Could run {0}/{1} unittests ({2:.2f}%). Unittests which pass completely: {3:.2f}%. ' - 'Of the ones which ran, could run: {4}/{5} tests ({6:.2f}%)'.format( - totals[Stat.UT_RUNS], totals[Stat.UT_TOTAL], - totals[Stat.UT_PERCENT_RUNS], totals[Stat.UT_PERCENT_PASS], - totals[Stat.TEST_PASS], totals[Stat.TEST_PASS], - totals[Stat.TEST_PERCENT_PASS]) - }) - - return rows, totals - - -HTML_TEMPLATE = ''' - - - - - - - - {title} - - - - - - - - - - - {content} - - - - {scripts} - - -''' - - -def save_as_html(report_name, rows, totals, missing_modules, cannot_import_modules, java_issues, current_date): - def grid(*components): - def _fmt(cmp): - if isinstance(cmp, tuple): - return '
      {}
      '.format(cmp[1], cmp[0]) - return '
      {}
      '.format(cmp) - return ''' -
      -
      - {} -
      -
      - '''.format('\n'.join([_fmt(cmp) for cmp in components])) - - def progress_bar(value, color='success'): - return ''' -
      -
      - {value:.2f}% Complete -
      -
      - '''.format(color=color, value=value) - - def fluid_div(title, div_content): - return ''' -
      -
      -
      -

      {title}

      -
      - {content} -
      -
      - '''.format(title=title, content=div_content) - - def ul(title, items): - return fluid_div(title, '
        {}
      '.format('\n'.join([ - '
    15. {}
    16. '.format(itm) for itm in items - ]))) - - def table(tid, tcols, trows): - _thead = ''' - -   - {columns} - - '''.format(columns='\n'.join(['{}'.format(c) for c in tcols])) - - def format_val(row, k): - value = row[k] - if k == Col.PYTHON_ERRORS: - return "(click to expand)" - elif k == Col.UNITTEST: - _class = "text-info" - elif k == Col.NUM_PASSES and value > 0: - _class = "text-success" - elif k in [Col.NUM_ERRORS, Col.NUM_FAILS] and value > 0: - _class = "text-danger" - elif k == Col.NUM_SKIPPED and value > 0: - _class = "text-warning" - elif k == Col.NUM_TESTS: - _class = "text-dark" - else: - _class = "text-danger" if value and value < 0 else "text-muted" - return '{}'.format(_class, value) - - _tbody = '\n'.join([ - '{i}{vals}'.format( - errors = html.escape(row[Col.PYTHON_ERRORS], quote=True), # put the errors data into a data attribute - cls='info' if i % 2 == 0 else '', i=i, - vals=' '.join(['{}'.format(format_val(row, k)) for k in tcols])) - for i, row in enumerate(trows)]) - - _table = ''' - - {thead}{tbody} -
      - '''.format(tid=tid, tclass='', thead=_thead, tbody=_tbody) - - return fluid_div('cPython unittests run statistics', _table) - - scripts = ''' - - - - ''' - - missing_modules_info = ul('missing modules', [ - '{} imported by {} unittests'.format(name, cnt) - for cnt, name in sorted(((cnt, name) for name, cnt in missing_modules.items()), reverse=True) - ]) - - cannot_import_modules_info = ul('modules which could not be imported', [ - '{} could not be imported by {} unittests'.format(name, cnt) - for cnt, name in sorted(((cnt, name) for name, cnt in cannot_import_modules.items()), reverse=True) - ]) - - java_issues_info = ul('Java issues', [ - '{} caused by {} unittests'.format(name, cnt) - for cnt, name in sorted(((cnt, name) for name, cnt in java_issues.items()), reverse=True) - ]) - - modules_dnf = ul('Unittests that did not finish', [ - '{}'.format(r[Col.UNITTEST]) - for r in rows if r[Col.NUM_ERRORS] == -1 - ]) - - usecase_scores = dict() - for usecase_name, usecase_modules in USE_CASE_GROUPS.items(): - score_sum = 0 - for m in usecase_modules: - for r in rows: - if ("test_" + m + ".py") == r[Col.UNITTEST]: - if r[Col.NUM_PASSES] > 0 and r[Col.NUM_TESTS] > 0: - score_sum += r[Col.NUM_PASSES] / r[Col.NUM_TESTS] - usecase_scores[usecase_name] = score_sum / len(usecase_modules) - - - use_case_stats_info = ul("Summary per Use Case", - [ grid((progress_bar(avg_score * 100, color="info"), 3), '{}'.format(usecase_name)) + - grid(", ".join(USE_CASE_GROUPS[usecase_name])) for usecase_name, avg_score in usecase_scores.items()]) - - total_stats_info = ul("Summary", [ - grid('# total unittests: {}'.format(totals[Stat.UT_TOTAL])), - grid((progress_bar(totals[Stat.UT_PERCENT_RUNS], color="info"), 3), - '# unittest which run: {}'.format(totals[Stat.UT_RUNS])), - grid((progress_bar(totals[Stat.UT_PERCENT_PASS], color="success"), 3), - '# unittest which pass: {}'.format(totals[Stat.UT_PASS])), - grid('# tests which run: {}'.format(totals[Stat.TEST_RUNS])), - grid((progress_bar(totals[Stat.TEST_PERCENT_PASS], color="info"), 3), - '# tests which pass: {}'.format(totals[Stat.TEST_PASS])), - ]) - - table_stats = table('stats', CSV_HEADER, rows) - - content = '
      '.join([use_case_stats_info, - total_stats_info, - table_stats, - missing_modules_info, - cannot_import_modules_info, - java_issues_info, - modules_dnf]) - - report = HTML_TEMPLATE.format( - title='GraalPython Unittests Stats', - bootstrap_version='3.3.7', - bootstrap_css_integrity='sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u', - bootstrap_theme_css_integrity='sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp', - bootstrap_js_integrity='sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa', - fontawesome_version='4.7.0', - jquery_version='3.2.1', - datatables_version='1.10.15', - navbar_links='', - scripts=scripts.format(table_id='stats', datatables_version='1.10.15'), - content=content, - current_date_time=current_date) - - with open(report_name, 'w') as HTML: - HTML.write(report) - -def generate_latest(output_name, html_report_path): - contents = ''' - - - - -''' - with open(output_name, 'w') as HTML: - HTML.write(contents) - -# ---------------------------------------------------------------------------------------------------------------------- -# -# main tool -# -# ---------------------------------------------------------------------------------------------------------------------- -def main(prog, args): - parser = argparse.ArgumentParser(prog=prog, - description="Run the standard python unittests.") - parser.add_argument("-v", "--verbose", help="Verbose output.", action="https://github.com/store_true") - parser.add_argument("-n", "--no_cpython", help="Do not run the tests with cpython (for comparison).", - action="https://github.com/store_true") - parser.add_argument("-l", "--limit", help="Limit the number of unittests to run.", default=None, type=int) - parser.add_argument("-t", "--tests_path", help="Unittests path.", default=PATH_UNITTESTS) - parser.add_argument("-T", "--timeout", help="Timeout per unittest run (seconds).", default=TIMEOUT, type=int) - parser.add_argument("-o", "--only_tests", help="Run only these unittests (comma sep values).", default=None) - parser.add_argument("-s", "--skip_tests", help="Run all unittests except (comma sep values)." - "the only_tets option takes precedence", default=None) - parser.add_argument("-r", "--regression_running_tests", help="Regression threshold for running tests.", type=float, - default=None) - parser.add_argument("--no_latest", help="Don't generate latest.html file.", action="https://github.com/store_true") - parser.add_argument("-g", "--gate", help="Run in gate mode (Skip cpython runs; Do not upload results; " - "Detect regressions).", action="https://github.com/store_true") - parser.add_argument("path", help="Path to store the csv output and logs to.", nargs='?', default=None) - - global flags - flags = parser.parse_args(args=args) - - current_date = strftime("%Y-%m-%d", gmtime()) - - log("[INFO] current date : {}", current_date) - log("[INFO] unittests path : {}", flags.tests_path) - if flags.path: - log("[INFO] results (save) path : {}", flags.path) - else: - log("[INFO] results will not be saved remotely") - - if flags.gate: - log("[INFO] running in gate mode") - if not flags.regression_running_tests: - log("[WARNING] --regression_running_tests not set while in gate mode. " - "Regression detection will not be performed") - - def _fmt(t): - t = t.strip() - return os.path.join(flags.tests_path, t if t.endswith(".py") else t + ".py") - - if flags.only_tests: - only_tests = set([_fmt(test) for test in flags.only_tests.split(",")]) - unittests = [t for t in get_unittests(flags.tests_path) if t in only_tests] - else: - skip_tests = set([_fmt(test) for test in flags.skip_tests.split(",")]) if flags.skip_tests else None - unittests = get_unittests(flags.tests_path, limit=flags.limit, skip_tests=skip_tests) - - # get cpython stats - if not flags.gate and not flags.no_cpython: - log(HR) - log("[INFO] get cpython stats") - cpy_results = run_unittests(unittests, 60 * 5, with_cpython=True) - cpy_stats = process_output('\n'.join(cpy_results))[-1] - # handle the timeout - timeout = flags.timeout if flags.timeout else None - else: - cpy_stats = None - # handle the timeout - timeout = flags.timeout if flags.timeout else 60 * 5 # 5 minutes if no value specified (in gate mode only) - - # get graalpython stats - log(HR) - log("[INFO] get graalpython stats") - results = run_unittests(unittests, timeout, with_cpython=False) - txt_report_path = file_name(TXT_RESULTS_NAME, current_date) - output = save_as_txt(txt_report_path, results) - - unittests, error_messages, java_exceptions, stats = process_output(output) - - csv_report_path = file_name(CSV_RESULTS_NAME, current_date) - rows, totals = save_as_csv(csv_report_path, unittests, error_messages, java_exceptions, stats, cpy_stats=cpy_stats) - - log("[INFO] totals: {!r}", totals) - - missing_modules = process_errors(unittests, error_messages, 'ModuleNotFoundError', - msg_processor=get_missing_module) - log("[MISSING MODULES] \n{}", pformat(dict(missing_modules))) - - cannot_import_modules = process_errors(unittests, error_messages, err='ImportError', - msg_processor=get_cannot_import_module) - log("[CANNOT IMPORT MODULES] \n{}", pformat(dict(cannot_import_modules))) - - java_issues = process_errors(unittests, java_exceptions) - log("[JAVA ISSUES] \n{}", pformat(dict(java_issues))) - - html_report_path = file_name(HTML_RESULTS_NAME, current_date) - if not flags.gate: - save_as_html(html_report_path, rows, totals, missing_modules, cannot_import_modules, java_issues, current_date) - - if not flags.gate and flags.path: - log("[SAVE] saving results to {} ... ", flags.path) - scp(txt_report_path, flags.path) - scp(csv_report_path, flags.path) - scp(html_report_path, flags.path) - if not flags.no_latest: - generate_latest(LATEST_HTML_NAME, html_report_path) - scp(LATEST_HTML_NAME, flags.path) - - gate_failed = False - if flags.gate and flags.regression_running_tests: - log("[REGRESSION] detecting regression, acceptance threshold = {}%".format( - flags.regression_running_tests * 100)) - csv_files = sorted(f for f in ssh_ls(flags.path) if PTRN_VALID_CSV_NAME.match(f)) - last_csv = csv_files[-1] - # log('\n'.join(csv_files)) - # read the remote csv and extract stats - log("[REGRESSION] comparing against: {}".format(last_csv)) - scp('{}/{}'.format(flags.path, last_csv), '.', destination_name=last_csv) - rows = read_csv(last_csv) - prev_totals = { - Col.NUM_TESTS: int(rows[-1][1]), - Col.NUM_FAILS: int(rows[-1][2]), - Col.NUM_ERRORS: int(rows[-1][3]), - Col.NUM_SKIPPED: int(rows[-1][4]), - Col.NUM_PASSES: int(rows[-1][5]), - } - log("[INFO] previous totals (from {}): {!r}", last_csv, prev_totals) - if float(totals[Col.NUM_TESTS]) < float(prev_totals[Col.NUM_TESTS]) * (1.0 - flags.regression_running_tests): - log("[REGRESSION] REGRESSION DETECTED, passed {} tests vs {} from {}".format( - totals[Col.NUM_TESTS], prev_totals[Col.NUM_TESTS], last_csv)) - gate_failed = True - else: - log("[REGRESSION] no regression detected") - - log("[DONE]") - if flags.gate and gate_failed: - exit(1) - - -if __name__ == "__main__": - main(sys.argv[0], sys.argv[1:]) diff --git a/graalpython/com.oracle.graal.python.test/src/runner.py b/graalpython/com.oracle.graal.python.test/src/runner.py new file mode 100644 index 0000000000..0feda7a8b9 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/runner.py @@ -0,0 +1,1526 @@ +# Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# The Universal Permissive License (UPL), Version 1.0 +# +# Subject to the condition set forth below, permission is hereby granted to any +# person obtaining a copy of this software, associated documentation and/or +# data (collectively the "Software"), free of charge and under any and all +# copyright rights in the Software, and any and all patent rights owned or +# freely licensable by each licensor hereunder covering either (i) the +# unmodified Software as contributed to or provided by such licensor, or (ii) +# the Larger Works (as defined below), to deal in both +# +# (a) the Software, and +# +# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +# one is included with the Software each a "Larger Work" to which the Software +# is contributed by such licensors), +# +# without restriction, including without limitation the rights to copy, create +# derivative works of, display, perform, and distribute the Software and make, +# use, sell, offer for sale, import, export, have made, and have sold the +# Software and the Larger Work(s), and to sublicense the foregoing rights on +# either these or other terms. +# +# This license is subject to the following condition: +# +# The above copyright notice and either this complete permission notice or at a +# minimum a reference to the UPL must be included in all copies or substantial +# portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +import argparse +import concurrent.futures +import enum +import fnmatch +import json +import math +import os +import pickle +import platform +import re +import select +import shlex +import signal +import socket +import subprocess +import sys +import tempfile +import threading +import time +import tomllib +import traceback +import typing +import unittest +import unittest.loader +from abc import abstractmethod +from collections import defaultdict +from dataclasses import dataclass, field +from functools import lru_cache +from pathlib import Path +from textwrap import dedent + +DIR = Path(__file__).parent.resolve() +GRAALPYTHON_DIR = DIR.parent.parent.resolve() +UNIT_TEST_ROOT = (DIR / 'tests').resolve() +TAGGED_TEST_ROOT = (GRAALPYTHON_DIR / 'lib-python' / '3' / 'test').resolve() +IS_GRAALPY = sys.implementation.name == 'graalpy' + +PLATFORM_KEYS = {sys.platform, platform.machine(), sys.implementation.name} +if IS_GRAALPY: + # noinspection PyUnresolvedReferences + PLATFORM_KEYS.add('native_image' if __graalpython__.is_native else 'jvm') + +CURRENT_PLATFORM = f'{sys.platform}-{platform.machine()}' +CURRENT_PLATFORM_KEYS = frozenset({CURRENT_PLATFORM}) + + +class Logger: + report_incomplete = sys.stdout.isatty() + + def __init__(self): + self.lock = threading.RLock() + self.incomplete_line = None + + def log(self, msg='', incomplete=False): + if incomplete and not self.report_incomplete: + return + with self.lock: + end = ('' if incomplete else None) + if self.report_incomplete and self.incomplete_line: + first_line, newline, rest = msg.partition('\n') + pad = len(self.incomplete_line) + print(f"\r{first_line:{pad}}{newline}{rest}", file=sys.stderr, end=end, flush=True) + else: + print(msg, file=sys.stderr, end=end, flush=True) + self.incomplete_line = msg if incomplete else None + + +logger = Logger() +log = logger.log + + +class TestStatus(enum.StrEnum): + SUCCESS = "ok" + FAILURE = "FAIL" + ERROR = "ERROR" + SKIPPED = "skipped" + EXPECTED_FAILURE = "expected failure" + UNEXPECTED_SUCCESS = "unexpected success" + + +SUCCESSFUL_STATES = TestStatus.SUCCESS, TestStatus.SKIPPED, TestStatus.EXPECTED_FAILURE +FAILED_STATES = TestStatus.FAILURE, TestStatus.ERROR, TestStatus.UNEXPECTED_SUCCESS + + +@dataclass(repr=False, frozen=True) +class TestId: + test_file: Path + test_name: str + + def __repr__(self): + return f'{self.test_file}::{self.test_name}' + + def normalized(self): + return TestId(self.test_file.resolve(), self.test_name) + + @classmethod + def from_str(cls, s: str): + test_file, _, test_id = s.partition('::') + if test_id is None: + raise ValueError(f"Invalid test ID {s}") + return cls(Path(test_file), test_id) + + @classmethod + def from_test_case(cls, test_file: Path, test: unittest.TestCase): + test_id = test.id() + if type(test).__module__ == 'unittest.suite' and type(test).__name__ == '_ErrorHolder': + if match := re.match(r'(\S+) \(([^)]+)\)', test_id): + action = match.group(1) + class_name = match.group(2) + if 'Module' in action: + test_id = f'<{action}>' + else: + test_id = f'{class_name}.<{action}>' + elif type(test).id is not unittest.TestCase.id and type(test) is not unittest.FunctionTestCase: + # Qualify doctests so that we know what they are + test_id = f'{type(test).__qualname__}.{test_id}' + return cls(test_file, test_id) + + +@dataclass(frozen=True) +class TestSpecifier: + test_file: Path + test_name: str | None + + def __repr__(self): + if self.test_name is None: + return str(self.test_file) + return f'{self.test_file}::{self.test_name}' + + def with_test_file(self, test_file: Path): + return TestSpecifier(test_file, self.test_name) + + @classmethod + def from_str(cls, s: str): + test_file, _, test_id = s.partition('::') + return cls(Path(test_file), test_id or None) + + def match(self, test_id: TestId): + # Globs in path are expanded when processing specifiers + if self.test_file != test_id.test_file: + return False + if self.test_name is None: + return True + if '*' in self.test_name: + pattern = re.escape(self.test_name).replace(r'\*', '.*') + r'($|\..*)' + return re.match(pattern, test_id.test_name) + return self.test_name == test_id.test_name or test_id.test_name.startswith(self.test_name + '.') + + +@dataclass +class TestResult: + test_id: TestId + status: TestStatus + param: str | None = None + output: str = '' + duration: float = 0.0 + + +def format_exception(exc): + tb = exc.__traceback__ + while tb and '__unittest' in tb.tb_frame.f_globals: + tb = tb.tb_next + exc.__traceback__ = tb + return ''.join(traceback.format_exception(exc)) + + +def out_tell(): + try: + return os.lseek(1, 0, os.SEEK_CUR) + except OSError: + return 0 + + +T = typing.TypeVar('T') + + +def partition_list(l: list[T], fn: typing.Callable[[T], bool]): + a = [] + b = [] + for item in l: + (a if fn(item) else b).append(item) + return a, b + + +class AbstractResult(unittest.TestResult): + def __init__(self, test_suite: 'TestSuite'): + super().__init__() + self.test_suite = test_suite + self.start_time = None + + def test_id(self, test): + return TestId.from_test_case(self.test_suite.test_file.path, test) + + def startTest(self, test): + self.start_time = time.time() + + @abstractmethod + def report_result(self, result: TestResult): + pass + + def make_result(self, test, status: TestStatus, **kwargs): + duration = 0.0 + if self.start_time: + duration = time.time() - self.start_time + return TestResult(status=status, test_id=self.test_id(test), duration=duration, **kwargs) + + def addSuccess(self, test): + super().addSuccess(test) + self.report_result(self.make_result(test, status=TestStatus.SUCCESS)) + + def addFailure(self, test, err): + super().addFailure(test, err) + self.report_result(self.make_result(test, status=TestStatus.FAILURE, param=format_exception(err[1]))) + + def addError(self, test, err): + super().addError(test, err) + self.report_result(self.make_result(test, status=TestStatus.ERROR, param=format_exception(err[1]))) + + def addSkip(self, test, reason): + super().addSkip(test, reason) + self.report_result(self.make_result(test, status=TestStatus.SKIPPED, param=reason)) + + def addExpectedFailure(self, test, err): + super().addExpectedFailure(test, err) + self.report_result(self.make_result(test, status=TestStatus.EXPECTED_FAILURE, param=format_exception(err[1]))) + + def addUnexpectedSuccess(self, test): + super().addUnexpectedSuccess(test) + self.report_result(self.make_result(test, status=TestStatus.UNEXPECTED_SUCCESS)) + + +class DirectResult(AbstractResult): + def __init__(self, test_suite: 'TestSuite', test_runner: 'TestRunner'): + super().__init__(test_suite) + self.runner = test_runner + + def report_result(self, result: TestResult): + self.runner.report_result(result) + + def startTest(self, test): + super().startTest(test) + self.runner.report_start(self.test_id(test)) + + +class AbstractRemoteResult(AbstractResult): + @abstractmethod + def emit(self, **data): + pass + + def report_result(self, result: TestResult): + self.emit( + event='testResult', + status=result.status, + test=result.test_id, + param=result.param, + out_pos=out_tell(), + duration=result.duration, + ) + + def startTest(self, test): + super().startTest(test) + self.emit( + event='testStarted', + test=self.test_id(test), + out_pos=out_tell(), + ) + + +class ConnectionResult(AbstractRemoteResult): + def __init__(self, test_suite: 'TestSuite', conn): + super().__init__(test_suite) + self.conn = conn + + def emit(self, **data): + self.conn.send(data) + + +class SimpleResult(AbstractRemoteResult): + def __init__(self, test_suite: 'TestSuite', data: list[dict]): + super().__init__(test_suite) + self.data = data + + def emit(self, **data): + self.data.append(data) + + +def test_path_to_module(test_file: 'TestFile'): + path = test_file.path.resolve().relative_to(test_file.config.rootdir) + return str(path).removesuffix('.py').replace(os.sep, '.') + + +class TestRunner: + def __init__(self, *, failfast: bool, report_durations: int | None): + self.failfast = failfast + self.report_durations = report_durations + self.results: list[TestResult] = [] + self.total_duration = 0.0 + + @staticmethod + def report_start(test_id: TestId): + log(f"{test_id} ... ", incomplete=True) + + def report_result(self, result: TestResult): + self.results.append(result) + message = f"{result.test_id} ... {result.status}" + if result.status == TestStatus.SKIPPED and result.param: + message = f"{message} {result.param!r}" + else: + message = f"{message} ({result.duration:.2f}s)" + log(message) + + def tests_failed(self): + return any(result.status in FAILED_STATES for result in self.results) + + def display_summary(self): + counts = defaultdict(int) + for result in self.results: + counts[result.status] += 1 + + log() + + if self.results and self.report_durations: + slowest_tests = sorted(self.results, key=lambda r: r.duration, reverse=True) + if self.report_durations > 0: + slowest_tests = slowest_tests[:self.report_durations] + log("Slowest test durations:") + for result in slowest_tests: + log(f"- {result.test_id}: {result.duration:.2f}s") + log() + + for result in self.results: + fail_type = None + match result.status: + case TestStatus.ERROR: + fail_type = 'ERROR' + case TestStatus.FAILURE: + fail_type = 'FAIL' + case TestStatus.UNEXPECTED_SUCCESS: + fail_type = 'UNEXPECTED SUCCESS' + if fail_type: + log("======================================================================") + log(f"{fail_type}: {result.test_id}") + log("----------------------------------------------------------------------") + if result.param: + log(result.param.rstrip('\n')) + if result.output: + log("------------------------- captured output ----------------------------") + log(result.output.rstrip('\n')) + log() + + items = [] + + def add_item(status, name): + if counts[status]: + items.append(f"{name}={counts[status]}") + + add_item(TestStatus.SUCCESS, "passed") + add_item(TestStatus.FAILURE, "failures") + add_item(TestStatus.ERROR, "errors") + add_item(TestStatus.SKIPPED, "skipped") + add_item(TestStatus.EXPECTED_FAILURE, "expected failures") + add_item(TestStatus.UNEXPECTED_SUCCESS, "unexpected successes") + + total = sum(counts.values()) + + log(f"Ran {total} tests in {self.total_duration:.2f}s") + log() + summary = ", ".join(items) + overall_status = 'FAILED' if self.tests_failed() else 'OK' + if summary: + log(f"{overall_status} ({summary})") + else: + log(overall_status) + + if self.failfast and self.tests_failed(): + log("\nWARNING: Did not execute all tests because 'failfast' mode is on") + + def run_tests(self, tests: list['TestSuite']): + start_time = time.time() + for test_suite in tests: + result = DirectResult(test_suite, self) + result.failfast = self.failfast + test_suite.run(result) + self.total_duration = time.time() - start_time + self.display_summary() + + def generate_mx_report(self, path: str): + report_data = [] + for result in self.results: + # Skip synthetic results for failed class setups and such + if '<' in result.test_id.test_name: + continue + match result.status: + case TestStatus.SUCCESS | TestStatus.EXPECTED_FAILURE: + status = 'PASSED' + case TestStatus.SKIPPED: + status = 'IGNORED' + case _: + status = 'FAILED' + report_data.append({ + 'name': str(result.test_id).replace('\\', '/'), + 'status': status, + 'duration': result.duration, + }) + with open(path, 'w') as f: + # noinspection PyTypeChecker + json.dump(report_data, f) + + def generate_tags(self, append=False): + by_file = defaultdict(list) + for result in self.results: + by_file[result.test_id.test_file].append(result) + for test_file, results in by_file.items(): + test_file = configure_test_file(test_file) + update_tags( + test_file, + results, + tag_platform=CURRENT_PLATFORM, + untag_failed=(not append), + untag_skipped=(not append), + untag_missing=(not append), + ) + + +def update_tags(test_file: 'TestFile', results: list[TestResult], tag_platform: str, + untag_failed=False, untag_skipped=False, untag_missing=False): + current = read_tags(test_file, allow_exclusions=True) + exclusions, current = partition_list(current, lambda t: isinstance(t, TagExclusion)) + status_by_id = {r.test_id.normalized(): r.status for r in results} + tag_by_id = {} + for tag in current: + if untag_missing and tag.test_id not in status_by_id: + tag = tag.without_key(tag_platform) + if tag: + tag_by_id[tag.test_id] = tag + + for test_id, status in status_by_id.items(): + if tag := tag_by_id.get(test_id): + if status == TestStatus.SUCCESS: + tag_by_id[test_id] = tag.with_key(tag_platform) + elif (untag_skipped and status == TestStatus.SKIPPED + or untag_failed and status == TestStatus.FAILURE): + tag = tag.without_key(tag_platform) + if tag: + tag_by_id[test_id] = tag + else: + del tag_by_id[test_id] + elif status == TestStatus.SUCCESS: + tag_by_id[test_id] = Tag.for_key(test_id, tag_platform) + + for exclusion in exclusions: + tag_by_id.pop(exclusion.test_id, None) + + tags = set(tag_by_id.values()) | set(exclusions) + write_tags(test_file, tags) + + +def write_tags(test_file: 'TestFile', tags: typing.Iterable['Tag']): + tag_file = test_file.get_tag_file() + if not tag_file: + log(f"WARNING: no tag directory for test file {test_file}") + return + if not tags: + tag_file.unlink(missing_ok=True) + return + with open(tag_file, 'w') as f: + for tag in sorted(tags, key=lambda t: t.test_id.test_name): + f.write(f'{tag}\n') + + +def interrupt_process(process: subprocess.Popen): + if hasattr(signal, 'SIGINT'): + try: + process.send_signal(signal.SIGINT) + process.wait(3) + return + except (OSError, subprocess.TimeoutExpired): + pass + process.terminate() + try: + process.wait(3) + except subprocess.TimeoutExpired: + process.kill() + + +class ParallelTestRunner(TestRunner): + def __init__(self, *, num_processes, subprocess_args, separate_workers, timeout_factor, **kwargs): + super().__init__(**kwargs) + self.num_processes = num_processes + self.subprocess_args = subprocess_args + self.separate_workers = separate_workers + self.timeout_factor = timeout_factor + self.stop_event = threading.Event() + self.crashes = [] + self.default_test_timeout = 600 + + def report_result(self, result: TestResult): + if self.failfast and result.status in FAILED_STATES: + self.stop_event.set() + super().report_result(result) + + def tests_failed(self): + return super().tests_failed() or bool(self.crashes) + + def partition_tests_into_processes(self, suites: list['TestSuite']) -> list[list['Test']]: + if self.separate_workers: + per_file_suites = suites + unpartitioned = [] + else: + per_file_suites, unpartitioned = partition_list( + suites, + lambda suite: suite.test_file.config.new_worker_per_file, + ) + partitions = [suite.collected_tests for suite in per_file_suites] + per_partition = int(math.ceil(len(unpartitioned) / max(1, self.num_processes))) + while unpartitioned: + partitions.append([test for suite in unpartitioned[:per_partition] for test in suite.collected_tests]) + unpartitioned = unpartitioned[per_partition:] + return partitions + + def run_tests(self, tests: list['TestSuite']): + serial_suites, parallel_suites = partition_list( + tests, + lambda suite: suite.test_file.test_config.serial, + ) + parallel_partitions = self.partition_tests_into_processes(parallel_suites) + serial_partitions = self.partition_tests_into_processes(serial_suites) + + start_time = time.time() + if parallel_partitions: + num_processes = max(1, min(self.num_processes, len(parallel_partitions))) + with concurrent.futures.ThreadPoolExecutor(num_processes) as executor: + self.run_partitions_in_subprocesses(executor, parallel_partitions) + if serial_partitions: + with concurrent.futures.ThreadPoolExecutor(1) as executor: + self.run_partitions_in_subprocesses(executor, serial_partitions) + + self.total_duration = time.time() - start_time + self.display_summary() + + if self.crashes: + for crash in self.crashes: + log('Internal error, test worker crashed outside of tests:') + log(crash) + + def run_partitions_in_subprocesses(self, executor, partitions: list[list['Test']]): + workers = [SubprocessWorker(self, partition) for i, partition in enumerate(partitions)] + futures = [executor.submit(worker.run_in_subprocess_and_watch) for worker in workers] + + def dump_worker_status(): + with logger.lock: + log("=" * 80) + log("Dumping test worker status:") + for i, partition in enumerate(partitions): + not_started = 0 + if futures[i].running(): + log(f"Worker on {workers[i].thread}: {workers[i].get_status()}") + elif not futures[i].done(): + not_started += len(partition) + if not_started: + log(f"There are {not_started} tests not assigned to any worker") + log("=" * 80) + + try: + def sigterm_handler(_signum, _frame): + dump_worker_status() + # noinspection PyUnresolvedReferences,PyProtectedMember + os._exit(1) + + prev_sigterm = signal.signal(signal.SIGTERM, sigterm_handler) + except Exception: + prev_sigterm = None + + try: + try: + concurrent.futures.wait(futures) + for future in futures: + future.result() + except KeyboardInterrupt: + log("Received keyboard interrupt, stopping") + dump_worker_status() + self.stop_event.set() + concurrent.futures.wait(futures) + sys.exit(1) + finally: + if prev_sigterm: + signal.signal(signal.SIGTERM, prev_sigterm) + + +class SubprocessWorker: + def __init__(self, runner: ParallelTestRunner, tests: list['Test']): + self.runner = runner + self.stop_event = runner.stop_event + self.lock = threading.RLock() + self.remaining_test_ids = [test.test_id for test in tests] + self.tests_by_id = {test.test_id: test for test in tests} + self.out_file: typing.TextIO | None = None + self.last_started_test_id: TestId | None = None + self.last_started_time: float | None = None + self.last_out_pos = 0 + self.last_test_id_for_blame: TestId | None = None + self.process: subprocess.Popen | None = None + self.thread = None + + def process_event(self, event): + test_id = event['test'] + match event['event']: + case 'testStarted': + try: + self.remaining_test_ids.remove(test_id) + except ValueError: + # It executed something we didn't ask for. Not sure why this happens + log(f'WARNING: unexpected test started {test_id}') + self.runner.report_start(test_id) + with self.lock: + self.last_started_test_id = test_id + self.last_started_time = time.time() + self.last_out_pos = event['out_pos'] + case 'testResult': + status = event['status'] + out_end = event['out_pos'] + test_output = '' + if self.last_out_pos != out_end: + self.out_file.seek(self.last_out_pos) + test_output = self.out_file.read(out_end - self.last_out_pos) + result = TestResult( + test_id=test_id, + status=status, + param=event.get('param'), + output=test_output, + duration=event.get('duration'), + ) + self.runner.report_result(result) + with self.lock: + self.last_started_test_id = None + self.last_started_time = time.time() # Starts timeout for the following teardown/setup + self.last_test_id_for_blame = test_id + self.last_out_pos = event['out_pos'] + if test_id.test_name.endswith('>'): + class_name = test_id.test_name[:test_id.test_name.find('<')].rstrip('.') + specifier = TestSpecifier(test_id.test_file, class_name or None) + self.remaining_test_ids = [ + test for test in self.remaining_test_ids if not specifier.match(test) + ] + + def get_status(self): + with self.lock: + if not self.process: + process_status = "not started" + elif self.process.poll() is not None: + process_status = f"exitted with code {self.process.returncode}" + else: + process_status = "running" + + last_test_id = self.get_test_to_blame() + if last_test_id is not None: + if last_test_id is not self.last_started_test_id: + last_test_id = f'{last_test_id} (approximate)' + duration = time.time() - self.last_started_time + test_status = f"executing {last_test_id} for {duration:.2f}s" + else: + test_status = "no current test" + remaining = len(self.remaining_test_ids) + return f"test: {test_status}; remaining: {remaining}; process status: {process_status}" + + def get_test_to_blame(self): + if self.last_started_test_id: + return self.last_started_test_id + # XXX unittest doesn't report module/class setups/teardowns, so if a test hard crashes or times out during + # those, we can't tell which one is to blame. So we make a combined result for both as a last resort + next_test_id = self.remaining_test_ids[0] if self.remaining_test_ids else None + if self.last_test_id_for_blame is None: + return TestId(next_test_id.test_file, f' {next_test_id}') + if next_test_id is None: + return TestId(self.last_test_id_for_blame.test_file, f' {self.last_test_id_for_blame}') + return TestId( + Path(''), + f' {self.last_test_id_for_blame} {next_test_id}', + ) + + def run_in_subprocess_and_watch(self): + self.thread = threading.current_thread() + with ( + tempfile.TemporaryDirectory(prefix='graalpytest-') as tmp_dir, + socket.create_server(('0.0.0.0', 0)) as server, + ): + tmp_dir = Path(tmp_dir) + + port = server.getsockname()[1] + assert port + + retries = 3 + + while self.remaining_test_ids and not self.stop_event.is_set(): + last_remaining_count = len(self.remaining_test_ids) + with open(tmp_dir / 'out', 'w+') as self.out_file: + self.last_out_pos = 0 + self.last_started_time = time.time() + cmd = [ + sys.executable, + '-u', + *self.runner.subprocess_args, + __file__, + 'worker', + '--port', str(port), + ] + if self.runner.failfast: + cmd.append('--failfast') + + self.process = None + try: + self.process = subprocess.Popen(cmd, stdout=self.out_file, stderr=self.out_file) + server.settimeout(180.0) + sock = server.accept()[0] + except (TimeoutError, OSError): + if self.process: + interrupt_process(self.process) + retries -= 1 + if retries: + continue + sys.exit("Worker failed to start/connect to runner multiple times") + + with sock: + conn = Connection(sock) + + conn.send([TestSpecifier(t.test_file, t.test_name) for t in self.remaining_test_ids]) + + timed_out = None + + try: + while True: + while conn.poll(0.1): + event = conn.recv() + self.process_event(event) + if self.stop_event.is_set(): + interrupt_process(self.process) + break + if self.last_started_test_id: + last_started_test = self.tests_by_id.get(self.last_started_test_id) + timeout = ( + last_started_test.test_file.test_config.per_test_timeout + or self.runner.default_test_timeout + ) + else: + timeout = self.runner.default_test_timeout + timeout *= self.runner.timeout_factor + if time.time() - self.last_started_time >= timeout: + interrupt_process(self.process) + timed_out = timeout + break + except (ConnectionClosed, OSError): + # The socket closed or got connection reset, that's normal if the worker exitted or crashed + pass + try: + self.process.wait(self.runner.default_test_timeout) + except subprocess.TimeoutExpired: + log("Warning: Worker didn't shutdown in a timely manner, interrupting it") + interrupt_process(self.process) + + returncode = self.process.wait() + + if self.stop_event.is_set(): + return + + if returncode != 0 or timed_out is not None: + self.out_file.seek(self.last_out_pos) + output = self.out_file.read() + if timed_out is not None: + message = f"Timed out in {timed_out}s" + elif returncode >= 0: + message = f"Test process exitted with code {returncode}" + else: + try: + signal_name = signal.Signals(-returncode).name + except ValueError: + signal_name = str(-returncode) + message = f"Test process killed by signal {signal_name}" + blame_id = self.get_test_to_blame() + self.runner.report_result(TestResult( + test_id=blame_id, + status=TestStatus.ERROR, + param=message, + output=output, + duration=(time.time() - self.last_started_time), + )) + if blame_id is not self.last_started_test_id: + # If we're here, it means we didn't know exactly which test we were executing, we were + # somewhere in between + if self.last_test_id_for_blame: + # Retry the same test again, if it crashes again, we would get into the else branch + self.last_started_test_id = None + self.last_test_id_for_blame = None + continue + else: + # The current test caused the crash for sure, continue with the next + if self.remaining_test_ids: + del self.remaining_test_ids[0] + self.last_started_test_id = None + if last_remaining_count == len(self.remaining_test_ids): + log(f"Worker is not making progress, remaining: {self.remaining_test_ids}") + + +def platform_keys_match(items: typing.Iterable[str]): + return any(all(key in PLATFORM_KEYS for key in item.split('-')) for item in items) + + +@dataclass +class TestFileConfig: + serial: bool | None = None + partial_splits: bool | None = None + per_test_timeout: float | None = None + exclude: bool = False + + @classmethod + def from_dict(cls, config: dict): + return cls( + serial=config.get('serial', cls.serial), + partial_splits=config.get('partial_splits_individual_tests', cls.partial_splits), + per_test_timeout=config.get('per_test_timeout', cls.per_test_timeout), + exclude=platform_keys_match(config.get('exclude_on', ())), + ) + + def combine(self, other: 'TestFileConfig'): + return TestFileConfig( + serial=(self.serial if other.serial is None else other.serial), + partial_splits=(self.partial_splits if other.partial_splits is None else other.partial_splits), + per_test_timeout=(self.per_test_timeout if other.per_test_timeout is None else other.per_test_timeout), + exclude=self.exclude or other.exclude, + ) + + +class TestFileRule: + def __init__(self, rule: dict): + selector = [name.removesuffix('.py') for name in rule['selector']] + globs, exact_matches = partition_list(selector, lambda x: '*' in x) + self.exact_matches = frozenset(exact_matches) + self.globs = [re.compile(fnmatch.translate(glob)) for glob in globs] + self.test_config = TestFileConfig.from_dict(rule) + + def matches(self, name): + return name in self.exact_matches or any(glob.match(name) for glob in self.globs) + + +@dataclass +class Config: + configdir: Path = Path('.').resolve() + rootdir: Path = Path('.').resolve() + tags_dir: Path | None = None + run_top_level_functions: bool = False + new_worker_per_file: bool = False + rules: list[TestFileRule] = field(default_factory=list) + + @classmethod + @lru_cache + def parse_config(cls, config_path: Path): + with open(config_path, 'rb') as f: + config_dict = tomllib.load(f) + settings = config_dict.get('settings', {}) + rules = [TestFileRule(rule) for rule in config_dict.get('test_rules', ())] + tags_dir = None + if config_tags_dir := settings.get('tags_dir'): + tags_dir = (config_path.parent / config_tags_dir).resolve() + # Temporary hack for Bytecode DSL development in master branch: + if IS_GRAALPY and __graalpython__.is_bytecode_dsl_interpreter and tags_dir: + new_tags_dir = (config_path.parent / (config_tags_dir + '_bytecode_dsl')).resolve() + if new_tags_dir.exists(): + tags_dir = new_tags_dir + return cls( + configdir=config_path.parent.resolve(), + rootdir=config_path.parent.parent.resolve(), + tags_dir=tags_dir, + run_top_level_functions=settings.get('run_top_level_functions', cls.run_top_level_functions), + new_worker_per_file=settings.get('new_worker_per_file', cls.new_worker_per_file), + rules=rules, + ) + + +@dataclass(frozen=True) +class TestFile: + path: Path + name: str + config: Config + test_config: TestFileConfig + + def __str__(self): + return str(self.path) + + def __eq__(self, other): + return self.path == other.path + + def get_tag_file(self): + if self.config.tags_dir: + return self.config.tags_dir / (self.name.removesuffix('.py') + '.txt') + + +def configure_test_file(path: Path) -> TestFile: + config = config_for_file(path) + resolved = path.resolve().relative_to(config.configdir) + name = str(resolved).replace(os.sep, '/').removesuffix('.py') + test_config = TestFileConfig() + for rule in config.rules: + if rule.matches(name): + test_config = test_config.combine(rule.test_config) + return TestFile( + path=path, + name=name, + config=config, + test_config=test_config + ) + + +@lru_cache +def config_for_dir(path: Path) -> Config: + while path.is_dir(): + config_path = path / 'conftest.toml' + if config_path.exists(): + return Config.parse_config(config_path) + if path.parent == path: + break + path = path.parent + return Config() + + +def config_for_file(test_file: Path) -> Config: + path = test_file if test_file.is_dir() else test_file.parent + return config_for_dir(path) + + +@dataclass +class TestSuite: + test_file: TestFile + pythonpath: list[str] + test_suite: unittest.TestSuite + collected_tests: list['Test'] + + def run(self, result): + saved_path = sys.path[:] + sys.path[:] = self.pythonpath + try: + self.test_suite.run(result) + finally: + sys.path[:] = saved_path + + +@dataclass +class Test: + test_id: TestId + test_file: TestFile + + def __str__(self): + return repr(self.test_id) + + +def filter_tree(test_file: TestFile, test_suite: unittest.TestSuite, specifiers: list[TestSpecifier], + tagged_ids: list[TestId] | None): + keep_tests = [] + collected_tests = [] + for test in test_suite: + # When test loading fails, unittest just creates an instance of _FailedTest + if exception := getattr(test, '_exception', None): + raise exception + if type(test).__module__ == 'unittest.loader' and type(test).__name__ == 'ModuleSkipped': + skipped_test, reason = test().skipped[0] + log(f"Test module {skipped_test.id().removeprefix('unittest.loader.ModuleSkipped.')} skipped: {reason}") + return + if hasattr(test, '__iter__'): + sub_collected = filter_tree(test_file, test, specifiers, tagged_ids) + if sub_collected: + keep_tests.append(test) + collected_tests += sub_collected + else: + test_id = TestId.from_test_case(test_file.path, test) + if any(s.match(test_id) for s in specifiers): + if tagged_ids is None or test_id.normalized() in tagged_ids: + keep_tests.append(test) + collected_tests.append(Test(test_id, test_file)) + test_suite._tests = keep_tests + return collected_tests + + +def expand_specifier_paths(specifiers: list[TestSpecifier]) -> list[TestSpecifier]: + expanded_specifiers = [] + for specifier in specifiers: + str_path = str(specifier.test_file) + if '*' in str_path: + paths = list(Path('.').glob(str_path)) + else: + paths = [specifier.test_file] + expanded_paths = [] + for path in paths: + if not path.exists(): + with_suffix = path.parent / f'{path.name}.py' + if with_suffix.exists(): + path = with_suffix + else: + sys.exit(f"Test path {path} doesn't exist") + config = config_for_dir(path) + if path.is_dir(): + if config.tags_dir: + if path.parent.absolute() == config.rootdir.absolute(): + expanded_paths += path.glob('test_*.py') + expanded_paths += (p.parent for p in path.glob('test_*/__init__.py')) + else: + if (path / '__init__.py').exists(): + expanded_paths.append(path) + else: + expanded_paths += path.rglob("test*.py") + else: + if config.tags_dir and path.name == '__init__.py': + path = path.parent + expanded_paths.append(path) + expanded_paths.sort() + for path in expanded_paths: + expanded_specifiers.append(specifier.with_test_file(path)) + return expanded_specifiers + + +def collect_module(test_file: TestFile, specifiers: list[TestSpecifier], use_tags=False, + partial=None) -> TestSuite | None: + config = test_file.config + saved_path = sys.path[:] + sys.path.insert(0, str(config.rootdir)) + try: + loader = TopLevelFunctionLoader() if config.run_top_level_functions else unittest.TestLoader() + tagged_ids = None + if use_tags and config.tags_dir: + tagged_ids = [tag.test_id for tag in read_tags(test_file) if platform_keys_match(tag.keys)] + if not tagged_ids: + return None + test_module = test_path_to_module(test_file) + try: + test_suite = loader.loadTestsFromName(test_module) + except unittest.SkipTest as e: + log(f"Test file {test_file} skipped: {e}") + return + collected_tests = filter_tree(test_file, test_suite, specifiers, tagged_ids) + if partial and test_file.test_config.partial_splits: + selected, total = partial + collected_tests = collected_tests[selected::total] + if collected_tests: + return TestSuite(test_file, sys.path[:], test_suite, collected_tests) + finally: + sys.path[:] = saved_path + + +def path_for_comparison(p: Path): + p = p.resolve() + return p.parent / p.name.removesuffix('.py') + + +def collect(all_specifiers: list[TestSpecifier], *, use_tags=False, ignore=None, partial=None, + continue_on_errors=False, no_excludes=False) -> list[TestSuite]: + to_run = [] + all_specifiers = expand_specifier_paths(all_specifiers) + test_files = [] + test_paths = set() + for specifier in all_specifiers: + if specifier.test_file in test_paths: + continue + test_paths.add(specifier.test_file) + if not specifier.test_file.exists(): + sys.exit(f"File does not exist: {specifier.test_file}") + test_files.append(configure_test_file(specifier.test_file)) + if ignore: + ignore = [path_for_comparison(i) for i in ignore] + test_files = [ + test_file for test_file in test_files + if not any(path_for_comparison(test_file.path).is_relative_to(i) for i in ignore) + ] + if not no_excludes: + excluded, test_files = partition_list(test_files, lambda f: f.test_config.exclude) + for file in excluded: + log(f"Test file {file} is excluded on this platform/configuration, use --no-excludes to overrride") + if partial: + selected, total = partial + to_split = [] + partial_files = [] + # Always keep files that are split per-test + for test_file in test_files: + if test_file.test_config.partial_splits: + partial_files.append(test_file) + else: + to_split.append(test_file) + partial_files += to_split[selected::total] + test_files = [f for f in test_files if f in partial_files] + for test_file in test_files: + specifiers = [s for s in all_specifiers if s.test_file == test_file.path] + try: + collected = collect_module(test_file, specifiers, use_tags=use_tags, partial=partial) + except Exception as e: + if continue_on_errors: + log(f"WARNING: Failed to collect {test_file}:\n{format_exception(e)}") + continue + raise e + if collected: + to_run.append(collected) + return to_run + + +@dataclass(frozen=True) +class Tag: + test_id: TestId + keys: frozenset[str] + + @classmethod + def for_key(cls, test_id, key): + return Tag(test_id, frozenset({key})) + + def with_key(self, key: str): + return Tag(self.test_id, self.keys | {key}) + + def without_key(self, key: str): + if key not in self.keys: + return self + keys = self.keys - {key} + if keys: + return Tag(self.test_id, keys) + + def __str__(self): + return f'{self.test_id.test_name} @ {",".join(sorted(self.keys))}' + + +@dataclass(frozen=True) +class TagExclusion(Tag): + comment: str | None + + def __str__(self): + s = f'!{self.test_id.test_name}' + if self.keys: + s += f' @ {",".join(sorted(self.keys))}' + if self.comment: + s = f'{self.comment}{s}' + return s + + +def read_tags(test_file: TestFile, allow_exclusions=False) -> list[Tag]: + # To make them easily comparable + test_path = test_file.path.resolve() + tag_file = test_file.get_tag_file() + tags = [] + if tag_file.exists(): + with open(tag_file) as f: + comment = None + for line in f: + if line.startswith('#'): + if comment: + comment += line + else: + comment = line + continue + test, _, keys = line.partition('@') + test = test.strip() + keys = keys.strip() + if test.startswith('!'): + if allow_exclusions: + test = test.removeprefix('!') + tags.append(TagExclusion( + TestId(test_path, test), + frozenset(keys.split(',')) if keys else frozenset(), + comment, + )) + else: + if not keys: + log(f'WARNING: invalid tag {test}: missing platform keys') + tags.append(Tag( + TestId(test_path, test), + frozenset(keys.split(',')), + )) + comment = None + return tags + + +class TopLevelFunctionLoader(unittest.loader.TestLoader): + def loadTestsFromModule(self, module, *, pattern=None): + test_suite = super().loadTestsFromModule(module, pattern=pattern) + for name, obj in vars(module).items(): + if name.startswith('test_') and callable(obj): + test_suite.addTest(unittest.FunctionTestCase(obj)) + return test_suite + + +class ConnectionClosed(Exception): + pass + + +class Connection: + def __init__(self, sock): + self.socket = sock + + def send(self, obj): + data = pickle.dumps(obj) + header = len(data).to_bytes(8, byteorder='big') + self.socket.sendall(header) + self.socket.sendall(data) + + def _recv(self, size): + data = b'' + while len(data) < size: + read = self.socket.recv(size - len(data)) + if not read: + return data + data += read + return data + + def recv(self): + size = int.from_bytes(self._recv(8), byteorder='big') + if not size: + raise ConnectionClosed + data = self._recv(size) + return pickle.loads(data) + + def poll(self, timeout=None): + rlist, wlist, xlist = select.select([self.socket], [], [], timeout) + return bool(rlist) + + +def main_worker(args): + with socket.create_connection(('localhost', args.port)) as sock: + conn = Connection(sock) + + tests = conn.recv() + + for test_suite in collect(tests, no_excludes=True): + result = ConnectionResult(test_suite, conn) + result.failfast = args.failfast + test_suite.run(result) + + +def main_merge_tags(args): + with open(args.report_path) as f: + report = json.load(f) + status_map = { + 'PASSED': TestStatus.SUCCESS, + 'FAILED': TestStatus.FAILURE, + 'IGNORED': TestStatus.SKIPPED, + } + all_results = [ + TestResult( + test_id=TestId.from_str(result['name']), + status=status_map[result['status']], + ) + for result in report + if '<' not in result['name'] + ] + by_file = defaultdict(list) + for result in all_results: + by_file[result.test_id.test_file].append(result) + for test_file, results in by_file.items(): + test_file = configure_test_file(test_file) + update_tags( + test_file, + results, + tag_platform=args.platform, + untag_failed=False, + untag_skipped=True, + untag_missing=True, + ) + + +def get_bool_env(name: str): + return os.environ.get(name, '').lower() in ('true', '1') + + +def main(): + is_mx_graalpytest = get_bool_env('MX_GRAALPYTEST') + parent_parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter) + subparsers = parent_parser.add_subparsers() + + # run command declaration + run_parser = subparsers.add_parser( + 'run', + prog=('mx graalpytest' if is_mx_graalpytest else None), + help="Run GraalPy unittests or CPython unittest with tagging", + ) + run_parser.set_defaults(main=main_run) + if is_mx_graalpytest: + # mx graalpytest takes this option, but it forwards --help here, so pretend we take it + run_parser.add_argument('--python', help="Run tests with given Python binary") + run_parser.add_argument('--svm', action='https://github.com/store_true', help="Use SVM standalone") + run_parser.add_argument( + '-t', '--tagged', action='https://github.com/store_true', + help="Interpret test file names relative to tagged test directory", + ) + run_parser.add_argument( + '-n', '--num-processes', type=int, + help="Run tests in N subprocess workers. Adds crash recovery, output capture and timeout handling", + ) + run_parser.add_argument( + '--separate-workers', action='https://github.com/store_true', + help="Create a new worker process for each test file (when -n is specified). Default for tagged unit tests", + ) + run_parser.add_argument( + '--ignore', type=Path, action='https://github.com/append', default=[], + help="Ignore path during collection (multi-allowed)", + ) + run_parser.add_argument( + '--no-excludes', action='https://github.com/store_true', + help="Don't apply configuration exclusions", + ) + run_parser.add_argument( + '-f', '--failfast', action='https://github.com/store_true', + help="Exit immediately after the first failure", + ) + run_parser.add_argument( + '--all', action='https://github.com/store_true', + help="Run tests that are normally not enabled due to tags. Implies --tagged", + ) + run_parser.add_argument( + '--retag', dest='retag_mode', action='https://github.com/store_const', const='replace', + help="Run tests and regenerate tags based on the results. Implies --all, --tagged and -n", + ) + run_parser.add_argument( + '--retag-append', dest='retag_mode', action='https://github.com/store_const', const='append', + help="Like --retag, but doesn't remove existing tags. Useful for regtagging subsets of tests", + ) + run_parser.add_argument( + '--collect-only', action='https://github.com/store_true', + help="Print found tests IDs without running tests", + ) + run_parser.add_argument( + '--continue-on-collection-errors', action='https://github.com/store_true', + help="Collection errors are not fatal", + ) + run_parser.add_argument( + '--durations', type=int, default=0, + help="Show durations of N slowest tests (-1 to show all)", + ) + run_parser.add_argument( + '--mx-report', + help="Produce a json report file in format expected by mx_gate.make_test_report", + ) + run_parser.add_argument( + '--untag-unmatched', action='https://github.com/store_true', + help="Remove tests that were not collected from tags. Useful for pruning removed tests", + ) + run_parser.add_argument( + '--timeout-factor', type=float, default=1.0, + help="Multiply all timeouts by this number", + ) + run_parser.add_argument( + '--exit-success-on-failures', action='https://github.com/store_true', + help=dedent( + """\ + Exit successfully regardless of the test results. Useful to distinguish test failures + from runner crashes in jobs like retagger or coverage where failures are expected. + """ + ), + ) + run_parser.add_argument( + '--subprocess-args', + type=shlex.split, + default=[ + "--vm.ea", + "--experimental-options=true", + "--python.EnableDebuggingBuiltins", + ] if IS_GRAALPY else [], + help="Interpreter arguments to pass for subprocess invocation (when using -n)", + ) + run_parser.add_argument( + 'tests', nargs='+', type=TestSpecifier.from_str, + help=dedent( + """\ + List of test specifiers. A specifier can be: + - A test file name. It will be looked up in our unittests or, if you pass --tagged, in tagged tests. Example: test_int + - A test file path. Example: graalpython/lib-python/3/test/test_int.py. Note you do not need to pass --tagged to refer to a tagged test by path + - A test directory name or path. Example: cpyext + - A test file name/path with a selector for a specific test. Example: test_int::tests.test_int.ToBytesTests.test_WrongTypes + - A test file name/path with a selector for multiple tests. Example: test_int::tests.test_int.ToBytesTests + - You can use wildcards in tests paths and selectors. Example: 'test_int::test_create*' + + Tip: the test IDs printed in test results directly work as specifiers here. + """ + ), + ) + + # worker command declaration + worker_parser = subparsers.add_parser('worker', help="Internal command for subprocess workers") + worker_parser.set_defaults(main=main_worker) + worker_parser.add_argument('--port', type=int) + worker_parser.add_argument('--failfast', action='https://github.com/store_true') + + # merge-tags-from-report command declaration + merge_tags_parser = subparsers.add_parser('merge-tags-from-report', help="Merge tags from automated retagger") + merge_tags_parser.set_defaults(main=main_merge_tags) + merge_tags_parser.add_argument('platform') + merge_tags_parser.add_argument('report_path') + + # run the appropriate command + args = parent_parser.parse_args() + args.main(args) + + +def main_run(args): + if args.retag_mode: + args.all = True + args.tagged = True + args.num_processes = args.num_processes or 1 + + if args.all: + args.tagged = True + + if get_bool_env('GRAALPYTEST_FAIL_FAST'): + args.failfast = True + + if IS_GRAALPY: + if not get_bool_env('GRAALPYTEST_ALLOW_NO_JAVA_ASSERTIONS'): + # noinspection PyUnresolvedReferences + if not __graalpython__.java_assert(): + sys.exit( + "Java assertions are not enabled, refusing to run. Add --vm.ea to your invocation. Set GRAALPYTEST_ALLOW_NO_JAVA_ASSERTIONS=true to disable this check\n") + # noinspection PyUnresolvedReferences + if not hasattr(__graalpython__, 'tdebug'): + sys.exit("Needs to be run with --experimental-options --python.EnableDebuggingBuiltins\n") + + implicit_root = Path(os.path.relpath(TAGGED_TEST_ROOT if args.tagged else UNIT_TEST_ROOT)) + for i, test in enumerate(args.tests): + if not test.test_file.is_absolute() and not test.test_file.resolve().is_relative_to(GRAALPYTHON_DIR): + args.tests[i] = test.with_test_file(implicit_root / test.test_file) + for i, ignore in enumerate(args.ignore): + ignore_path = Path(ignore) + if not ignore_path.is_absolute() and not ignore_path.resolve().is_relative_to(GRAALPYTHON_DIR): + args.ignore[i] = implicit_root / ignore_path + + partial = None + if partial_env := os.environ.get('TAGGED_UNITTEST_PARTIAL'): + selected_str, total_str = partial_env.split('/', 1) + partial = int(selected_str) - 1, int(total_str) + + tests = collect( + args.tests, + use_tags=(not args.all), + ignore=args.ignore, + partial=partial, + continue_on_errors=args.continue_on_collection_errors, + no_excludes=args.no_excludes, + ) + if args.collect_only: + for test_suite in tests: + for test in test_suite.collected_tests: + print(test) + return + + log(f"Collected {sum(len(test_suite.collected_tests) for test_suite in tests)} tests") + + if not tests: + sys.exit("No tests matched\n") + + if args.untag_unmatched: + for test_suite in tests: + test_file = test_suite.test_file + tags = read_tags(test_file) + if tags: + filtered_tags = [] + for tag in tags: + if not any(tag.test_id.test_name == test.test_id.test_name for test in test_suite.collected_tests): + log(f"Removing tag for {test_file}::{tag.test_id.test_name}") + else: + filtered_tags.append(tag) + write_tags(test_file, filtered_tags) + return + + runner_args = dict( + failfast=args.failfast, + report_durations=args.durations, + ) + if not args.num_processes: + runner = TestRunner(**runner_args) + else: + runner = ParallelTestRunner( + **runner_args, + num_processes=args.num_processes, + subprocess_args=args.subprocess_args, + separate_workers=args.separate_workers, + timeout_factor=args.timeout_factor, + ) + + runner.run_tests(tests) + if args.mx_report: + runner.generate_mx_report(args.mx_report) + if args.retag_mode: + runner.generate_tags(append=(args.retag_mode == 'append')) + return + if runner.tests_failed() and not args.exit_success_on_failures: + sys.exit(1) + + +if __name__ == '__main__': + main() diff --git a/graalpython/com.oracle.graal.python.test/src/tests/conftest.toml b/graalpython/com.oracle.graal.python.test/src/tests/conftest.toml new file mode 100644 index 0000000000..b8cdc367d6 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/conftest.toml @@ -0,0 +1,58 @@ +[settings] +run_top_level_functions = true + +[[test_rules]] +selector = [ + "standalone/test_jbang_integration.py", + "standalone/test_standalone.py"] +per_test_timeout = 2400 +partial_splits_individual_tests = true + +[[test_rules]] +selector = [ + "standalone/test_gradle_plugin.py", + "standalone/test_maven_plugin.py"] +per_test_timeout = 5400 +partial_splits_individual_tests = true + +[[test_rules]] +# Windows support is still experimental, so we exclude some unittests +# on Windows for now. If you add unittests and cannot get them to work +# on Windows, yet, add their files here. +exclude_on = ['win32'] +selector = [ + "test_multiprocessing_graalpy.py", # import _winapi + "test_patched_pip.py", + "test_pathlib.py", + "test_posix.py", # import posix + "test_pyio.py", # pyio imports msvcrt + "test_signal.py", + "test_structseq.py", # import posix + "cpyext/test_member.py", # Too many assumptions about long size + "cpyext/test_memoryview.py", # Failure in test_memoryview_read_0dim + "cpyext/test_shutdown.py", # Uses gcc-specific attribute + "cpyext/test_wiki.py", # Assumptions about long size +] + +[[test_rules]] +exclude_on = ['native-image'] +selector = [ + "test_interop.py", + "test_register_interop_behavior.py", + "test_jarray.py", + "test_ssl_java_integration.py", +] + +[[test_rules]] +exclude_on = ['jvm'] +selector = [ + # These test would work on JVM too, but they are prohibitively slow due to a large amount of subprocesses + "test_patched_pip.py", +] + +[[test_rules]] +per_test_timeout = 1200 +selector = [ + "test_venv.py", + "test_patched_pip.py", +] diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/__init__.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/__init__.py index f65c192cb3..12e142b5c4 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/__init__.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -36,6 +36,7 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +import textwrap from importlib import invalidate_caches import gc @@ -53,9 +54,6 @@ GRAALPYTHON = sys.implementation.name == "graalpy" -IS_MANAGED_LAUNCHER = not GRAALPYTHON or __graalpython__.is_managed_launcher() - - def assert_raises(err, fn, *args, **kwargs): raised = False try: @@ -551,7 +549,7 @@ def CPyExtType(name, code='', **kwargs): # We set tp_base later, because MSVC doesn't see the usual &PySomething_Type expressions as constants if tp_base := kwargs.get('tp_base'): kwargs['set_base_code'] = f'{name}Type.tp_base = {tp_base};' - mod_template = """ + mod_template = textwrap.dedent(""" static PyModuleDef {name}module = {{ PyModuleDef_HEAD_INIT, "{name}", @@ -578,7 +576,7 @@ def CPyExtType(name, code='', **kwargs): PyModule_AddObject(m, "{name}", (PyObject *)&{name}Type); return m; }} - """ + """) type_decl = CPyExtTypeDecl(name, code, **kwargs) kwargs["name"] = name @@ -591,7 +589,7 @@ def CPyExtType(name, code='', **kwargs): def CPyExtTypeDecl(name, code='', **kwargs): - template = """ + template = textwrap.dedent(""" #include "Python.h" /* structmember.h is not included by default in Python.h */ #include "structmember.h" @@ -651,19 +649,22 @@ def CPyExtTypeDecl(name, code='', **kwargs): }}; static PySequenceMethods {name}_sequence_methods = {{ - {sq_length}, /* sq_length */ - {sq_concat}, /* sq_concat */ - 0, /* sq_repeat */ - {sq_item}, /* sq_item */ - 0, /* sq_slice */ - {sq_ass_item}, /* sq_ass_item */ - 0, /* sq_ass_slice */ - {sq_contains}, /* sq_contains */ + {sq_length}, /* sq_length */ + {sq_concat}, /* sq_concat */ + {sq_repeat}, /* sq_repeat */ + {sq_item}, /* sq_item */ + 0, /* was_sq_slice */ + {sq_ass_item}, /* sq_ass_item */ + 0, /* was_sq_ass_slice */ + {sq_contains}, /* sq_contains */ + {sq_inplace_concat}, /* sq_inplace_concat */ + {sq_inplace_repeat}, /* sq_inplace_repeat */ }}; static PyMappingMethods {name}_mapping_methods = {{ {mp_length}, /* mp_length */ {mp_subscript}, /* mp_subscript */ + {mp_ass_subscript}, /* mp_subscript */ }}; static struct PyMethodDef {name}_methods[] = {{ @@ -721,16 +722,15 @@ def CPyExtTypeDecl(name, code='', **kwargs): {tp_alloc}, /* tp_alloc */ {tp_new}, /* tp_new */ {tp_free}, /* tp_free */ - }}; - """ + }};""") kwargs["name"] = name - kwargs["code"] = code + kwargs["code"] = textwrap.dedent(code) kwargs.setdefault("tp_name", f"{name}.{name}") kwargs.setdefault("tp_itemsize", "0") kwargs.setdefault("tp_new", "PyType_GenericNew") kwargs.setdefault("tp_alloc", "PyType_GenericAlloc") - kwargs.setdefault("tp_free", "PyObject_Del") + # IMPORTANT: do not set 'tp_free' kwargs.setdefault("tp_flags", "Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE") kwargs.setdefault("cmembers", "") kwargs.setdefault("includes", "") @@ -743,7 +743,7 @@ def CPyExtHeapType(name, bases=(object), code='', slots=None, **kwargs): :param bases: tuple of baseclasses to be used for PyType_FromSpecWithBases :param slots: array of slots as strings in format "{Py_sq_length, &my_sq_len}" ''' - template = """ + template = textwrap.dedent(""" #include "Python.h" /* structmember.h is not included by default in Python.h */ #include "structmember.h" @@ -763,13 +763,11 @@ def CPyExtHeapType(name, bases=(object), code='', slots=None, **kwargs): {code} - PyType_Slot slots[] = {{ - {slots} - }}; - - PyType_Spec spec = {{ "{name}", sizeof({name}Object), 0, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, slots }}; - static PyObject* create(PyObject* unused, PyObject* bases) {{ + PyType_Slot slots[] = {{ + {slots} + }}; + PyType_Spec spec = {{ "{name}", sizeof({name}Object), 0, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, slots }}; {ready_code} PyObject* type = PyType_FromSpecWithBases(&spec, bases); if (type == NULL) @@ -800,7 +798,7 @@ def CPyExtHeapType(name, bases=(object), code='', slots=None, **kwargs): return NULL; return m; }} - """ + """) kwargs["name"] = name kwargs["code"] = code kwargs["slots"] = '{0}' if slots is None else ',\n'.join(slots + ['{0}']) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/module_with_exiting_functions.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/module_with_exiting_functions.py new file mode 100644 index 0000000000..99b5e47fd4 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/module_with_exiting_functions.py @@ -0,0 +1,68 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# The Universal Permissive License (UPL), Version 1.0 +# +# Subject to the condition set forth below, permission is hereby granted to any +# person obtaining a copy of this software, associated documentation and/or +# data (collectively the "Software"), free of charge and under any and all +# copyright rights in the Software, and any and all patent rights owned or +# freely licensable by each licensor hereunder covering either (i) the +# unmodified Software as contributed to or provided by such licensor, or (ii) +# the Larger Works (as defined below), to deal in both +# +# (a) the Software, and +# +# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +# one is included with the Software each a "Larger Work" to which the Software +# is contributed by such licensors), +# +# without restriction, including without limitation the rights to copy, create +# derivative works of, display, perform, and distribute the Software and make, +# use, sell, offer for sale, import, export, have made, and have sold the +# Software and the Larger Work(s), and to sublicense the foregoing rights on +# either these or other terms. +# +# This license is subject to the following condition: +# +# The above copyright notice and either this complete permission notice or at a +# minimum a reference to the UPL must be included in all copies or substantial +# portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import sys +import time + +from tests.cpyext import CPyExtType + + +ExitObject = CPyExtType( + "ExitObjext", + """ + static PyObject *test_FatalError(PyObject *self, PyObject *arg) { + Py_FatalError(PyUnicode_AsUTF8(arg)); + return NULL; + } + + static PyObject* test_assert_failure(PyObject *self, PyObject *arg) { + _PyObject_AssertFailed(arg, "0", PyUnicode_AsUTF8(arg), "filename", 0, "function"); + return NULL; + } + + """, + tp_methods=''' + {"Py_FatalError", (PyCFunction)test_FatalError, METH_O, NULL}, + {"_PyObject_ASSERT_WITH_MSG", (PyCFunction)test_assert_failure, METH_O, NULL} + ''' + ) + + +if __name__ == "__main__": + getattr(ExitObject(), sys.argv[1])(sys.argv[2]) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_abstract.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_abstract.py index fe855632b4..73cb07e16a 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_abstract.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_abstract.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -39,15 +39,14 @@ import array import collections -import sys import mmap +import os +import sys +import unittest +from unittest import skipIf from . import CPyExtTestCase, CPyExtFunction, CPyExtType, unhandled_error_compare -__dir__ = __file__.rpartition("/")[0] - -from .test_modsupport import MySeq - def _safe_check(v, type_check): try: @@ -426,7 +425,7 @@ def _size_and_check_args(): (DictSubclassWithSequenceMethods(),), ) -class TestAbstractWithNative(object): +class TestAbstractWithNative(unittest.TestCase): def test_sequence_check(self): TestSequenceCheck = CPyExtType("TestSequenceCheck", """ @@ -1479,6 +1478,49 @@ def _reference_delslice(args): cmpfunc=unhandled_error_compare ) + test_PyMapping_SetItemString = CPyExtFunction( + _reference_setitem, + lambda: ( + ({'a': 1}, 'a', 2), + ), + code=''' PyObject* wrap_PyMapping_SetItemString(PyObject* mapping, char* key, PyObject* value) { + if (PyMapping_SetItemString(mapping, key, value) < 0) { + return NULL; + } + return mapping; + } + ''', + resultspec="O", + argspec='OsO', + arguments=["PyObject* mapping", "char* key", "PyObject* value"], + callfunction="wrap_PyMapping_SetItemString", + cmpfunc=unhandled_error_compare + ) + + test_PyMapping_HasKey = CPyExtFunction( + lambda args: int(args[1] in args[0]), + lambda: ( + ({'a': 1}, 'a'), + ({'a': 1}, 'b'), + ), + resultspec="i", + argspec='OO', + arguments=["PyObject* mapping", "PyObject* key"], + cmpfunc=unhandled_error_compare + ) + + test_PyMapping_HasKeyString = CPyExtFunction( + lambda args: int(args[1] in args[0]), + lambda: ( + ({'a': 1}, 'a'), + ({'a': 1}, 'b'), + ), + resultspec="i", + argspec='Os', + arguments=["PyObject* mapping", "char* keyStr"], + cmpfunc=unhandled_error_compare + ) + test_PyMapping_Check = CPyExtFunction( _reference_mapping_check, _size_and_check_args, diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_bool.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_bool.py index 895020eb86..0574540ceb 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_bool.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_bool.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -39,8 +39,6 @@ from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare -__dir__ = __file__.rpartition("/")[0] - class DummyNonInt(): pass @@ -49,7 +47,7 @@ class DummyNonInt(): class TestPyBool(CPyExtTestCase): # (tfel): This test actually checks that the wrapped booleans that are - # stored as sulong globals are singletons + # stored as native globals are singletons test_PyBools_areSingleton = CPyExtFunction( lambda args: 1, lambda: ( diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_bytes.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_bytes.py index da23418b95..aabb6d6016 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_bytes.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_bytes.py @@ -41,8 +41,6 @@ from . import CPyExtTestCase, CPyExtFunction, CPyExtFunctionOutVars, unhandled_error_compare, CPyExtType, \ is_native_object -__dir__ = __file__.rpartition("/")[0] - def _reference_from_string_n(args): arg_str = args[0] @@ -710,4 +708,4 @@ class ArrManagedSubclass(ByteArraySubclass): assert type(b) == ArrManagedSubclass # TODO: if TypeNode.GetNameNode is equivalent to _PyType_Name, it should transform tp_name "abc.xzy" to "xyz" # assert repr(b) == "ArrManagedSubclass(b'hello')", repr(b) - self._verify_bytearray(b) \ No newline at end of file + self._verify_bytearray(b) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_capsule.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_capsule.py index 0b2a61a1f4..1cb6422c1e 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_capsule.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_capsule.py @@ -42,8 +42,6 @@ from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare, CPyExtType -__dir__ = __file__.rpartition("/")[0] - class TestPyCapsule(CPyExtTestCase): test_PyCapsule_CheckExact = CPyExtFunction( @@ -80,6 +78,43 @@ class TestPyCapsule(CPyExtTestCase): cmpfunc=unhandled_error_compare ) + test_PyCapsule_GetName = CPyExtFunction( + lambda args: True, + lambda: ( + ("hello",), + ), + # Test that the returned name is pointer-identical, pybind11 relies on that + code='''int wrap_PyCapsule_Check(char * name) { + PyObject* capsule = PyCapsule_New((void *)1, name, NULL); + return PyCapsule_GetName(capsule) == name; + } + ''', + resultspec="i", + argspec='s', + arguments=["char* name"], + callfunction="wrap_PyCapsule_Check", + cmpfunc=unhandled_error_compare + ) + + test_PyCapsule_SetName = CPyExtFunction( + lambda args: True, + lambda: ( + ("hello",), + ), + # Test that the returned name is pointer-identical, pybind11 relies on that + code='''int wrap_PyCapsule_Check(char * name) { + PyObject* capsule = PyCapsule_New((void *)1, NULL, NULL); + PyCapsule_SetName(capsule, name); + return PyCapsule_GetName(capsule) == name; + } + ''', + resultspec="i", + argspec='s', + arguments=["char* name"], + callfunction="wrap_PyCapsule_Check", + cmpfunc=unhandled_error_compare + ) + test_PyCapsule_GetContext = CPyExtFunction( lambda args: True, lambda: ( diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_ceval.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_ceval.py index d37bb3583e..b3a785697b 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_ceval.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_ceval.py @@ -39,8 +39,6 @@ from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare, CPyExtType -__dir__ = __file__.rpartition("/")[0] - class TestCeval(CPyExtTestCase): test_Py_EnterLeaveRecursiveCall = CPyExtFunction( diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_classobject.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_classobject.py index c523e956aa..ab854a9e3a 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_classobject.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_classobject.py @@ -41,8 +41,6 @@ from . import CPyExtTestCase, CPyExtFunction, CPyExtType, assert_raises, CPyExtHeapType -__dir__ = __file__.rpartition("/")[0] - class DummyClass(): def foo(self): diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_codeobject.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_codeobject.py index 89312700ed..a1962cbb30 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_codeobject.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_codeobject.py @@ -42,8 +42,6 @@ from . import CPyExtTestCase, CPyExtFunction -__dir__ = __file__.rpartition("/")[0] - def example_generator(): # Some random code to make sure we excercise the bytecode index translation diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_complex.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_complex.py index 100406d66c..5d3bf05964 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_complex.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_complex.py @@ -37,11 +37,10 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. import operator +import unittest from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare, CPyExtType, is_native_object -__dir__ = __file__.rpartition("/")[0] - def _float_compare(x, y): @@ -202,7 +201,7 @@ class TestPyComplex(CPyExtTestCase): ) -class TestNativeComplex: +class TestNativeComplex(unittest.TestCase): def test_builtins_on_subclass(self): for t in [NativeComplexSubclass, ManagedNativeComplexSubclass]: c = t(2, 3) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_cpython_sre.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_cpython_sre.py index 909ae9a98f..c76f796438 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_cpython_sre.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_cpython_sre.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -38,11 +38,12 @@ # SOFTWARE. import sys +import unittest GRAALPYTHON = sys.implementation.name == "graalpy" -class TestSRE: +class TestSRE(unittest.TestCase): def test_sre_import(self): if GRAALPYTHON: diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_ctypes.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_ctypes.py index a04aaa826e..be89b8ce89 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_ctypes.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_ctypes.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -37,6 +37,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. import ctypes +import os.path import struct import sys @@ -115,9 +116,6 @@ class TestCDataBuffer(CPyExtTestCase): def test_buffer(self): - if sys.implementation.name == 'graalpy' and __graalpython__.get_platform_id() == 'managed': - # TODO we don't support converting ctypes arrays to native memory in managed - return int_format = struct.Struct(">i") inner_type = ctypes.c_int.__ctype_be__ * 2 outer_type = inner_type * 2 @@ -129,3 +127,126 @@ def test_buffer(self): assert buffer.format.startswith(b'>') assert struct.Struct(buffer.format).size == int_format.size assert buffer.shape == (2, 2) + +# TODO: GR-60735, we cannot support this without NFI struct by value support +def ignore_test_custom_libs(): + # 16B: returned in registers on System V AMD64 ABI + class MySmallStruct1(ctypes.Structure): + _fields_ = [("num", ctypes.c_int64), ("str", ctypes.c_char_p)] + + # 16B incl. 3B padding: not returned in registers on System V AMD64 ABI because of multiple fields + class MySmallStruct2(ctypes.Structure): + _fields_ = [("num", ctypes.c_int32), ("str", ctypes.c_char_p), ("end", ctypes.c_int8)] + + class MyLargeStruct(ctypes.Structure): + _fields_ = [("str", ctypes.c_char_p), + ("num1", ctypes.c_int32), + ("num2", ctypes.c_int64), + ("num3", ctypes.c_double), + ("num4", ctypes.c_int16), + ("num5", ctypes.c_int8), + ("num6", ctypes.c_int32), + ("num7", ctypes.c_int32)] + + from distutils.ccompiler import new_compiler + import tempfile + + cc = new_compiler() + with tempfile.TemporaryDirectory() as tmp_dir: + original_cwd = os.getcwd() + try: + os.chdir(tmp_dir) + print(tmp_dir) + with open('src.c', 'x') as f: + f.write(""" + #include + + typedef struct { + int32_t num; + const char *data; + } MySmallStruct1; + + MySmallStruct1 get_small_struct1() { + MySmallStruct1 s = {42, "hello world"}; + return s; + } + + typedef struct { + int32_t num; + const char *data; + int8_t end; + } MySmallStruct2; + + MySmallStruct2 get_small_struct2() { + MySmallStruct2 s = {42, "hello world", 42}; + return s; + } + + typedef struct { + const char *data; + int32_t num1; + int64_t num2; + double num3; + int16_t num4; + int8_t num5; + int32_t num6; + int32_t num7; + } MyLargeStruct; + + MyLargeStruct get_large_struct() { + MyLargeStruct s = {"hello world", 42, 42, 42, 42, 42, 42, 42}; + return s; + } + """) + cc.compile(['src.c']) + cc.link_shared_lib(['src.o'], 'myshlib') + + ctypes_lib = ctypes.CDLL(os.path.join(tmp_dir, 'libmyshlib.so')) + + ctypes_lib.get_small_struct1.argtypes = [] + ctypes_lib.get_small_struct1.restype = MySmallStruct1 + result = ctypes_lib.get_small_struct1() + assert result.num == 42, result.num + + ctypes_lib.get_small_struct2.argtypes = [] + ctypes_lib.get_small_struct2.restype = MySmallStruct2 + result = ctypes_lib.get_small_struct2() + assert result.num == 42, result.num + assert result.end == 42, result.end + + ctypes_lib.get_large_struct.argtypes = [] + ctypes_lib.get_large_struct.restype = MyLargeStruct + result = ctypes_lib.get_large_struct() + assert result.num1 == 42 + assert result.num2 == 42 + assert result.num3 == 42 + assert result.num4 == 42 + assert result.num5 == 42 + assert result.num6 == 42 + assert result.num7 == 42 + finally: + os.chdir(original_cwd) + + +def test_void_p(): + assert ctypes.c_void_p(True).value == ctypes.c_void_p(1).value + assert ctypes.c_void_p(False).value == ctypes.c_void_p(0).value + assert ctypes.c_void_p(2**128 - 1).value == ctypes.c_void_p(2**64 - 1).value + try: + ctypes.c_void_p(2**128 - 1) + except TypeError as e: + assert "cannot be converted to pointer" in str(e) + + +def test_meson_windows_detect_native_arch() -> str: + if sys.platform != 'win32': + return + process_arch = ctypes.c_ushort() + native_arch = ctypes.c_ushort() + kernel32 = ctypes.windll.kernel32 + process = ctypes.c_void_p(kernel32.GetCurrentProcess()) + try: + if kernel32.IsWow64Process2(process, ctypes.byref(process_arch), ctypes.byref(native_arch)): + assert native_arch.value == 0x8664, "only amd64 supported by GraalPy on Windows" + except AttributeError as e: + assert "Unknown identifier: IsWow64Process2" in str(e) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_datetime.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_datetime.py index 28053c4251..a53d3a7977 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_datetime.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_datetime.py @@ -37,10 +37,9 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. import datetime +import unittest -from . import CPyExtType, CPyExtTestCase, CPyExtFunction, unhandled_error_compare, is_native_object, IS_MANAGED_LAUNCHER - -__dir__ = __file__.rpartition("/")[0] +from . import CPyExtType, CPyExtTestCase, CPyExtFunction, unhandled_error_compare, is_native_object def create_datetime_subclass(typename): @@ -306,7 +305,7 @@ class TestPyDateTime(CPyExtTestCase): ) -class TestDateTime(object): +class TestDateTime(unittest.TestCase): def test_date_type(self): TestDate = CPyExtType("TestDate", @@ -614,30 +613,28 @@ def test_write_and_invoke_member(self): assert tester.getDate() == "foo" -# GR-47546: Native subclasses of managed types don't work in managed mode -if not IS_MANAGED_LAUNCHER: - class TestNativeSubclasses: - def test_time(self): - for t in (NativeTimeSubclass, ManagedNativeTimeSubclass): - x = t(hour=6) - assert is_native_object(x) - assert x.hour == 6 - - def test_date(self): - for t in (NativeDateSubclass, ManagedNativeDateSubclass): - x = t(1992, 4, 11) - assert is_native_object(x) - assert x.day == 11 - - def test_datetime(self): - for t in (NativeDateTimeSubclass, ManagedNativeDateTimeSubclass): - x = t(1992, 4, 11, hour=13) - assert is_native_object(x) - assert x.day == 11 - assert x.hour == 13 - - def test_timedelta(self): - for t in (NativeDeltaSubclass, ManagedNativeDeltaSubclass): - x = t(hours=6) - assert is_native_object(x) - assert x.seconds == 21600 +class TestNativeSubclasses(unittest.TestCase): + def test_time(self): + for t in (NativeTimeSubclass, ManagedNativeTimeSubclass): + x = t(hour=6) + assert is_native_object(x) + assert x.hour == 6 + + def test_date(self): + for t in (NativeDateSubclass, ManagedNativeDateSubclass): + x = t(1992, 4, 11) + assert is_native_object(x) + assert x.day == 11 + + def test_datetime(self): + for t in (NativeDateTimeSubclass, ManagedNativeDateTimeSubclass): + x = t(1992, 4, 11, hour=13) + assert is_native_object(x) + assert x.day == 11 + assert x.hour == 13 + + def test_timedelta(self): + for t in (NativeDeltaSubclass, ManagedNativeDeltaSubclass): + x = t(hours=6) + assert is_native_object(x) + assert x.seconds == 21600 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_descr.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_descr.py index 8aa05c6153..c2dfa75f63 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_descr.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_descr.py @@ -36,9 +36,9 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +import unittest -from . import CPyExtType, CPyExtTestCase, CPyExtFunction, unhandled_error_compare -__dir__ = __file__.rpartition("/")[0] +from . import CPyExtType, CPyExtTestCase, CPyExtFunction, unhandled_error_compare def _reference_classmethod(args): @@ -46,7 +46,7 @@ def _reference_classmethod(args): return classmethod(args[0])() raise TypeError -class TestDescrObject(object): +class TestDescrObject(unittest.TestCase): def test_new_classmethod(self): @@ -329,3 +329,18 @@ class TestDescr(CPyExtTestCase): callfunction="wrap_PyDescr_NewClassMethod", cmpfunc=unhandled_error_compare ) + + +def test_class_assignment_managed_subclass(): + class IntermediateType(CPyExtType("BaseForAssignment")): + def __repr__(self): + return "intermediate" + + class ChildType(IntermediateType): + def __repr__(self): + return "child" + + o = ChildType() + assert repr(o) == "child" + o.__class__ = IntermediateType + assert repr(o) == "intermediate" diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_dict.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_dict.py index 4c2fcd3f71..17bd48ff22 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_dict.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_dict.py @@ -39,8 +39,6 @@ from . import CPyExtTestCase, CPyExtFunction, CPyExtFunctionOutVars, unhandled_error_compare -__dir__ = __file__.rpartition("/")[0] - def _reference_get_item(args): try: diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_err.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_err.py index bdab829d9d..5832b644c9 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_err.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_err.py @@ -38,13 +38,12 @@ # SOFTWARE. import sys +import unittest import warnings from . import CPyExtTestCase, CPyExtFunction, CPyExtFunctionVoid, unhandled_error_compare, \ CPyExtType, is_native_object -__dir__ = __file__.rpartition("/")[0] - def _reference_setstring(args): raise args[0](args[1]) @@ -659,7 +658,7 @@ def raise_native_exception(): raise ExceptionSubclass(1) -class TestNativeExceptionSubclass: +class TestNativeExceptionSubclass(unittest.TestCase): def test_init(self): e = ExceptionSubclass(1, 2, 3) assert is_native_object(e) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_exceptionobject.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_exceptionobject.py index 3523aa93f3..03f6d4e95d 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_exceptionobject.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_exceptionobject.py @@ -38,12 +38,10 @@ # SOFTWARE. import sys +import unittest from . import CPyExtType, CPyExtTestCase, CPyExtFunction -__dir__ = __file__.rpartition("/")[0] - - try: raise TypeError except TypeError as e: @@ -51,7 +49,7 @@ exception_with_traceback = e -class TestExceptionobject(object): +class TestExceptionobject(unittest.TestCase): def test_exc_info(self): TestExcInfo = CPyExtType("TestExcInfo", """ @@ -226,7 +224,7 @@ class TestExceptionobjectFunctions(CPyExtTestCase): ) -class TestExceptionObjectAccessors(object): +class TestExceptionObjectAccessors(unittest.TestCase): def test_PyException_GetCause(self): TestGetCause = CPyExtType("TestGetCause", """ diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_fatal_exit.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_fatal_exit.py new file mode 100644 index 0000000000..0a27547b92 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_fatal_exit.py @@ -0,0 +1,72 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# The Universal Permissive License (UPL), Version 1.0 +# +# Subject to the condition set forth below, permission is hereby granted to any +# person obtaining a copy of this software, associated documentation and/or +# data (collectively the "Software"), free of charge and under any and all +# copyright rights in the Software, and any and all patent rights owned or +# freely licensable by each licensor hereunder covering either (i) the +# unmodified Software as contributed to or provided by such licensor, or (ii) +# the Larger Works (as defined below), to deal in both +# +# (a) the Software, and +# +# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +# one is included with the Software each a "Larger Work" to which the Software +# is contributed by such licensors), +# +# without restriction, including without limitation the rights to copy, create +# derivative works of, display, perform, and distribute the Software and make, +# use, sell, offer for sale, import, export, have made, and have sold the +# Software and the Larger Work(s), and to sublicense the foregoing rights on +# either these or other terms. +# +# This license is subject to the following condition: +# +# The above copyright notice and either this complete permission notice or at a +# minimum a reference to the UPL must be included in all copies or substantial +# portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import os +import signal +import subprocess +from pathlib import Path + +import sys + + +def call_in_subprocess(method, argument): + dir = Path(__file__).parent + module_path = dir / 'module_with_exiting_functions.py' + env = dict(os.environ) + env['PYTHONPATH'] = str(dir.parent.parent) + args = [sys.executable] + if sys.implementation.name == 'graalpy': + args += ['--experimental-options', '--python.EnableDebuggingBuiltins'] + args += [str(module_path), method, argument] + return subprocess.run(args, env=env, capture_output=True, text=True) + + +def test_fatal_error(): + proc = call_in_subprocess("Py_FatalError", "my fatal error") + assert proc.returncode != 0 + assert "my fatal error" in proc.stderr, proc.stderr + + +def test_assert_failed(): + proc = call_in_subprocess("_PyObject_ASSERT_WITH_MSG", "some assert failed") + assert proc.returncode != 0 + assert "some assert failed" in proc.stderr, proc.stderr + assert "refcount" in proc.stderr, proc.stderr + assert "object type" in proc.stderr, proc.stderr + assert "object type name" in proc.stderr, proc.stderr diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_file.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_file.py index 0035c532f1..a6531c9ca9 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_file.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_file.py @@ -37,11 +37,9 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare - -__dir__ = __file__.rpartition("/")[0] +import tempfile -import tempfile +from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare tmp_write_file = None diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_float.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_float.py index 7e8939610f..d05f53d74d 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_float.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_float.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -37,12 +37,11 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. import math +import unittest from . import CPyExtType, CPyExtTestCase, CPyExtFunction, CPyExtFunctionOutVars, unhandled_error_compare, \ is_native_object -__dir__ = __file__.rpartition("/")[0] - def _float_compare(x, y): def isNan(x): @@ -90,7 +89,6 @@ def __float__(self): class TestPyFloat(CPyExtTestCase): - test_PyFloat_AsDouble = CPyExtFunctionOutVars( lambda args: True, lambda: ( @@ -194,7 +192,7 @@ class TestPyFloat(CPyExtTestCase): ) -class TestPyOSDouble: +class TestPyOSDouble(unittest.TestCase): def test_PyOS_double_to_string(self): TestPyOS_Double_To_String = CPyExtType( "TestPyOS_Double_To_String", @@ -234,7 +232,7 @@ def test_PyOS_string_to_double(self): assert tester.PyOS_string_to_double_test('150.604459') == float(150.604459) -class TestNativeFloatSubclass: +class TestNativeFloatSubclass(unittest.TestCase): def test_create(self): f = NativeFloatSubclass(1.0) assert is_native_object(f) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_functions.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_functions.py index 745eb57273..337ace6d7e 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_functions.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_functions.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -37,12 +37,13 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -import array +import os import sys +import unittest -from . import CPyExtType, CPyExtTestCase, CPyExtFunction, unhandled_error_compare, IS_MANAGED_LAUNCHER, CPyExtHeapType +from . import CPyExtType, CPyExtTestCase, CPyExtFunction, unhandled_error_compare, CPyExtHeapType -__dir__ = __file__.rpartition("/")[0] +DIR = os.path.dirname(__file__) class CallableIter: @@ -315,9 +316,9 @@ def forgiving_set_item(args): resultspec="i", ) - if not IS_MANAGED_LAUNCHER: + if sys.implementation.name != 'graalpy' or __graalpython__.posix_module_backend() != 'java': __PyObject_AsFileDescriptor_FD0 = open(1, buffering=0, mode="wb") - __PyObject_AsFileDescriptor_FD1 = open("%s/As_FileDescriptor_Testfile" % __dir__, buffering=0, mode="wb") + __PyObject_AsFileDescriptor_FD1 = open("%s/As_FileDescriptor_Testfile" % DIR, buffering=0, mode="wb") test_PyObject_AsFileDescriptor = CPyExtFunction( lambda arg: arg if isinstance(arg, int) else arg.fileno(), lambda: ( @@ -561,7 +562,7 @@ def _ref_hash_not_implemented(args): # test PyMethodDef is same # test calling m_meth -class TestPyCFunction: +class TestPyCFunction(unittest.TestCase): def test_PyMethodDef(self): TestPyMethodDef = CPyExtType( "TestPyMethodDef", diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_gc.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_gc.py index 5f72960999..f4844f1a77 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_gc.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_gc.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -38,14 +38,15 @@ # SOFTWARE. import gc +import os import sys import time +import unittest +from unittest import skipIf from . import CPyExtType -__dir__ = __file__.rpartition("/")[0] - -GRAALPYTHON_NATIVE = sys.implementation.name == 'graalpy' and __graalpython__.get_platform_id() == 'native' +GRAALPY = sys.implementation.name == 'graalpy' # typedef PyObject * (*unaryfunc)(PyObject *); # typedef PyObject * (*binaryfunc)(PyObject *, PyObject *); @@ -119,10 +120,10 @@ tp_methods='{"getCounters", (PyCFunction)getCounters, METH_NOARGS | METH_STATIC, ""}, {"resetCounters", (PyCFunction)resetCounters, METH_NOARGS | METH_STATIC, ""}', ) -class TestGC1(): +class TestGC1(unittest.TestCase): def test_native_class(self): - if GRAALPYTHON_NATIVE: + if GRAALPY: gc.enable() GCTestClass.resetCounters() a = GCTestClass.getCounters() @@ -175,3 +176,724 @@ def test_native_class(self): # arguments=("PyObject* o", ), # callfunction="wrap_simple", # ) + +ID_OBJ0 = 0 +ID_OBJ1 = 1 +ID_OBJ2 = 0 +ID_OBJ3 = 1 +ID_OBJ4 = 2 +ID_OBJ5 = 3 +ID_OBJ6 = 4 +ID_OBJ7 = 5 +ID_OBJ8 = 6 +ID_OBJ9 = 7 +ID_OBJ10 = 8 +ID_OBJ11 = 9 +ID_OBJ12 = 10 +ID_OBJ13 = 11 +ID_OBJ14 = 12 + +# don't rely on deterministic Java GC behavior by default on GraalPy +RELY_ON_GC = os.environ.get("RELY_ON_GC", not GRAALPY) + +if GRAALPY and RELY_ON_GC: + import warnings + warnings.warn("Relying on deterministic Java GC behavior. " + "Tests may fail if the Java GC doesn't run at a certain program point or doesn't collect objects " + "as we expect.") + +if GRAALPY: + get_handle_table_id = __graalpython__.get_handle_table_id + def assert_is_strong(x): assert __graalpython__.is_strong_handle_table_ref(x) + def assert_is_weak(x): assert not __graalpython__.is_strong_handle_table_ref(x) +else: + # just that the test is compatible with CPython + def get_handle_table_id(object): return -1 + def assert_is_strong(x): pass + def assert_is_weak(x): pass + +class TestGCRefCycles(unittest.TestCase): + def _trigger_gc(self): + gc.collect() + for i in range(4 if GRAALPY and RELY_ON_GC else 1): + time.sleep(0.25) + gc.collect() + + def test_cycle_with_native_objects(self): + TestCycle0 = CPyExtType("TestCycle0", + ''' + #define N 16 + static int freed[N]; + static PyObject *global_objs[N]; + + #ifdef DEBUG + #define log printf + #else + #define log(...) + #endif + + static int tc0_init(TestCycle0Object* self, PyObject* args, PyObject *kwargs) { + if (!PyArg_ParseTuple(args, "i", &self->idx)) { + return -1; + } + if (self->idx < 0 || self->idx >= N) { + PyErr_Format(PyExc_ValueError, "invalid index; must be between 0 and %d", N); + return -1; + } + freed[self->idx] = 0; + return 0; + } + + static void tc0_clear(TestCycle0Object* self) { + log("clear of %d called\\n", self->idx); + Py_CLEAR(self->other); + } + + static void tc0_dealloc(TestCycle0Object* self) { + log("dealloc of %d called\\n", self->idx); + PyObject_GC_UnTrack(self); + tc0_clear(self); + freed[self->idx] = 1; + PyObject_GC_Del(self); + } + + static int tc0_traverse(TestCycle0Object* self, visitproc visit, void* arg) { + log("traverse of %d called -- refcnt = %zd\\n", self->idx, Py_REFCNT(self)); + if (self->other) { + Py_VISIT(self->other); + } + return 0; + } + + static PyObject* tc0_set_obj(TestCycle0Object* self, PyObject* arg) { + self->other = Py_NewRef(arg); + return Py_NewRef(Py_None); + } + + static PyObject* tc0_get_obj(TestCycle0Object* self) { + return Py_NewRef(self->other); + } + + static PyObject* tc0_is_freed(PyObject* unused, PyObject* idx) { + long l = PyLong_AsLong(idx); + if (l < 0 || l >= N) { + PyErr_Format(PyExc_ValueError, "invalid index; must be between 0 and %d", N); + return NULL; + } + return PyBool_FromLong(freed[l]); + } + + static PyObject* tc0_set_global_obj(PyObject* unused, PyObject* args) { + size_t i; + PyObject *arg; + if (!PyArg_ParseTuple(args, "nO", &i, &arg)) { + return NULL; + } + if (i < 0 || i >= N) { + PyErr_Format(PyExc_ValueError, "invalid index; must be between 0 and %d", N); + return NULL; + } + Py_XSETREF(global_objs[i], Py_NewRef(arg)); + return Py_NewRef(Py_None); + } + ''', + includes='#include ', + cmembers="""int idx; + PyObject *other;""", + tp_init='(initproc)tc0_init', + tp_methods=""" + {"set_obj", (PyCFunction)tc0_set_obj, METH_O, ""}, + {"set_global_obj", (PyCFunction)tc0_set_global_obj, METH_VARARGS | METH_CLASS, ""}, + {"get_obj", (PyCFunction)tc0_get_obj, METH_NOARGS, ""}, + {"is_freed", (PyCFunction)tc0_is_freed, METH_O | METH_CLASS, ""} + """, + tp_flags='Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC', + tp_traverse='(traverseproc)tc0_traverse', + tp_clear='(inquiry)tc0_clear', + tp_dealloc='(destructor)tc0_dealloc', + ) + + if RELY_ON_GC: + def assert_is_alive(id): + assert not TestCycle0.is_freed(id) + def assert_is_freed(id): + assert TestCycle0.is_freed(id) + else: + def assert_is_alive(id): pass + def assert_is_freed(id): pass + + obj0 = TestCycle0(ID_OBJ0) + obj1 = TestCycle0(ID_OBJ1) + + # establish cycle: obj0 -> obj1 -> obj0 + obj0.set_obj(obj1) + obj1.set_obj(obj0) + + assert_is_alive(ID_OBJ0) + assert_is_alive(ID_OBJ1) + + del obj1 + ####################################### GC ####################################### + self._trigger_gc() + ################################################################################## + assert_is_alive(ID_OBJ0) + assert_is_alive(ID_OBJ1) + + del obj0 + ####################################### GC ####################################### + self._trigger_gc() + ################################################################################## + assert_is_freed(ID_OBJ0) + assert_is_freed(ID_OBJ1) + + obj2 = TestCycle0(ID_OBJ2) + obj3 = TestCycle0(ID_OBJ3) + obj4 = TestCycle0(ID_OBJ4) + obj5 = TestCycle0(ID_OBJ5) + obj6 = TestCycle0(ID_OBJ6) + obj7 = TestCycle0(ID_OBJ7) + obj8 = TestCycle0(ID_OBJ8) + obj9 = TestCycle0(ID_OBJ9) + obj10 = TestCycle0(ID_OBJ10) + obj11 = TestCycle0(ID_OBJ11) + obj14 = TestCycle0(ID_OBJ14) + + # Legend + # '=>' + # A strong reference without handle table indirection. Possible cases: + # 1. native_object => native_object + # 2. managed_object => managed_object + # 2. managed_object => native_object + # + # '=ht=>' + # A strong reference through the handle table. So, this can only be a reference from a native to a managed + # object. + # + # '=ht->' + # Similar as above (a native object references a managed object) but the handle table only has a weak + # Java reference to the managed object. From the native object's point of view, the reference is still strong + # and it will do a decref on clear/dealloc. + # + # + # The phases "update_refs", "subtract_refs", and "move_unreachable" refer to the corresponding C functions + # (see C function "deduce_unreachable"). + # + # The reference count values in the comments are the 'gc_refs' (which is stored in 'PyGC_Head._gc_prev' during a + # GC run) and not 'ob_refcnt'. + # The values are the expected value *AFTER* the corresponding phase. + + # establish cycle: obj2 => obj3 =ht=> l => obj2 + # update_refs: 10 1 11 + # subtract_refs: 10 0 10 + # move_unreachable: 10 0 10 + # update_refs: 10 11 11 + # subtract_refs: 10 10 10 + # commit_weak_cand: obj2 => obj3 =ht-> l => obj2 + obj2.set_obj(obj3) + l = [obj2] + obj3.set_obj(l) + htid_l = get_handle_table_id(l) + + # establish cycle: obj4 => obj5 =ht=> l1 => obj6 => obj4 + # update_refs: 1 1 10 11 + # subtract_refs: 0 0 10 11 + # move_unreachable: 1 1 10 11 + # commit_weak_cand: obj4 => obj5 =ht-> l1 => obj6 => obj4 + + # establish cycle: obj4 => obj5 =ht=> l1 => obj4 + # update_refs: 10 1 11 + # subtract_refs: 10 0 10 + # move_unreachable: 10 1 10 + # update_refs: 10 11 11 + # subtract_refs: 10 10 10 + # commit_weak_cand: obj4 => obj5 =ht-> l1 => obj4 + obj4.set_obj(obj5) + l1 = [obj4] + obj5.set_obj(l1) + htid_l1 = get_handle_table_id(l1) + + # establish cycle: obj6 => obj7 =ht=> d0 => obj6 + obj6.set_obj(obj7) + d0 = {0: obj6} + obj7.set_obj(d0) + htid_d0 = get_handle_table_id(d0) + + # J-> obj9 -> obj8 -> ["hello"] + obj8.set_obj(["hello"]) + obj9.set_obj(obj8) + del obj8 + + # N => obj10 =ht=> l2 + # update_refs: 1 11 + # subtract_refs: 1 10 + # move_unreachable: 1 10 + # update_refs: 1 11 + # subtract_refs: 1 10 + # commit_weak_cand: N => obj10 =ht=> l2 + l2 = ["hello"] + obj10.set_obj(l2) + TestCycle0.set_global_obj(0, obj10) + htid_l2 = get_handle_table_id(l2) + del obj10, l2 + + # J/N => obj11 =ht=> l3 + # update_refs: 11 11 + # subtract_refs: 11 10 + # move_unreachable: 11 10 + # update_refs: 11 11 + # subtract_refs: 11 10 + # commit_weak_cand: J/N => obj11 =ht=> l3 + l3 = ["hello"] + obj11.set_obj(l3) + TestCycle0.set_global_obj(1, obj11) + htid_l3 = get_handle_table_id(l3) + del l3 + # difference to previous situation: obj11 is still reachable from Java + + # J => obj14 =ht=> l3 + # update_refs: 10 11 + # subtract_refs: 10 10 + # move_unreachable: 10 10 + # update_refs: 10 11 + # subtract_refs: 10 10 + # commit_weak_cand: J/N => obj11 =ht=> l3 + l4 = ["world"] + obj14.set_obj(l4) + htid_l4 = get_handle_table_id(l4) + del l4 + + # everything should still be alive + assert_is_alive(ID_OBJ2) + assert_is_alive(ID_OBJ3) + assert_is_alive(ID_OBJ4) + assert_is_alive(ID_OBJ5) + assert_is_alive(ID_OBJ6) + assert_is_alive(ID_OBJ7) + assert_is_alive(ID_OBJ8) + assert_is_alive(ID_OBJ9) + assert_is_alive(ID_OBJ10) + assert_is_alive(ID_OBJ11) + assert_is_alive(ID_OBJ14) + assert_is_strong(htid_l) + assert_is_strong(htid_l1) + assert_is_strong(htid_l2) + assert_is_strong(htid_l3) + assert_is_strong(htid_l4) + assert_is_strong(htid_d0) + + del obj2, l, obj3 + del obj4, obj5 + del obj6, d0, obj7 + + ####################################### GC ####################################### + self._trigger_gc() + ################################################################################## + + # Delete Java ref after GC. This will provoke the situation where 'PythonAbstractNativeObject' of obj11 will + # die after references where potentially replicated. This tests if dangling pointers appear for the managed + # referent. + del obj11 + + assert_is_freed(ID_OBJ2) + assert_is_freed(ID_OBJ3) + assert_is_freed(ID_OBJ6) + assert_is_freed(ID_OBJ7) + # because l1 is still alive + assert_is_alive(ID_OBJ4) + assert_is_alive(ID_OBJ5) + assert_is_alive(ID_OBJ8) + assert_is_alive(ID_OBJ9) + assert_is_alive(ID_OBJ10) + assert_is_alive(ID_OBJ14) + assert_is_strong(htid_l2) + assert_is_strong(htid_l3) + assert_is_strong(htid_l) + assert_is_strong(htid_l1) + assert_is_strong(htid_l4) + assert_is_strong(htid_d0) + + rescued_obj4 = l1[0] + del l1 + + TestCycle0.set_global_obj(2, obj14) + del obj14 + ####################################### GC ####################################### + self._trigger_gc() + ################################################################################## + # still reachable + assert_is_alive(ID_OBJ4) + assert_is_alive(ID_OBJ5) + assert_is_alive(ID_OBJ14) + assert rescued_obj4.get_obj().get_obj()[0] is rescued_obj4 + assert_is_strong(htid_l4) + + del rescued_obj4 + + # establish cycles: obj12 =ht=> l2 => obj13 =ht=> l3 => obj12 ;; l2 -> obj13 =ht=> l3 => l2 + # update_refs: 10 11 10 11 + # subtract_refs: 10 10 10 10 + # move_unreachable: 10 10 10 10 + # commit_weak_cand: obj12 =ht-> l2 => obj13 =ht-> l3 => obj12 ;; l2 -> obj13 =ht-> l3 => l2 + obj12 = TestCycle0(ID_OBJ12) + obj13 = TestCycle0(ID_OBJ13) + l2 = [obj13] + l3 = [obj12, l2] + obj12.set_obj(l2) + obj13.set_obj(l3) + htid_l2 = get_handle_table_id(l2) + htid_l3 = get_handle_table_id(l3) + + assert_is_alive(ID_OBJ12) + assert_is_alive(ID_OBJ13) + assert_is_strong(htid_l2) + assert_is_strong(htid_l3) + + del obj12, obj13, l2, l3 + + ####################################### GC ####################################### + self._trigger_gc() + ################################################################################## + + assert_is_freed(ID_OBJ4) + assert_is_freed(ID_OBJ5) + assert_is_freed(ID_OBJ12) + assert_is_freed(ID_OBJ13) + assert_is_strong(htid_l2) + assert_is_strong(htid_l3) + + + def test_cycle_with_lists(self): + TestCycle = CPyExtType("TestCycle", + ''' + #define N 2 + static int freed[N]; + + static void tc_dealloc(TestCycleObject* self) { + freed[self->idx] = 1; + PyObject_Free(self); + } + + static int tc_check_index(long l) { + if (l < 0 || l >= N) { + PyErr_Format(PyExc_ValueError, "invalid index; must be between 0 and %d", N); + return -1; + } + return 0; + } + + static int tc_init(TestCycleObject* self, PyObject* args, PyObject *kwargs) { + long l; + if (!PyArg_ParseTuple(args, "l", &l)) { + return -1; + } + if (tc_check_index(l) < 0) { + return -1; + } + self->idx = l; + freed[l] = 0; + return 0; + } + + static PyObject* tc_set_list_item(PyObject* class, PyObject* arg) { + long l = PyLong_AsLong(arg); + if (tc_check_index(l) < 0) { + return NULL; + } + PyObject *container0 = PyList_New(2); + PyObject *container1 = PyList_New(1); + TestCycleObject *obj = PyObject_New(TestCycleObject, (PyTypeObject *)class); + obj->idx = l; + freed[l] = 0; + PyList_SET_ITEM(container0, 0, container1); + PyList_SET_ITEM(container0, 1, obj); + PyList_SET_ITEM(container1, 0, container0); + return Py_BuildValue("(OO)", container0, container1); + } + + static PyObject* tc_is_freed(PyObject* unused, PyObject* idx) { + long l = PyLong_AsLong(idx); + if (tc_check_index(l) < 0) { + return NULL; + } + return PyBool_FromLong(freed[l]); + } + ''', + cmembers="int idx;", + tp_init='(initproc)tc_init', + tp_methods=""" + {"set_list_item", (PyCFunction)tc_set_list_item, METH_O | METH_CLASS, ""}, + {"is_freed", (PyCFunction)tc_is_freed, METH_O | METH_CLASS, ""} + """, + tp_flags='Py_TPFLAGS_DEFAULT', + tp_dealloc='(destructor)tc_dealloc', + ) + if RELY_ON_GC: + def assert_is_alive(id): + assert not TestCycle.is_freed(id) + def assert_is_freed(id): + assert TestCycle.is_freed(id) + else: + def assert_is_alive(id): pass + def assert_is_freed(id): pass + + l0, l1 = TestCycle.set_list_item(0) + htid_l0 = get_handle_table_id(l0) + htid_l1 = get_handle_table_id(l1) + + ml0, ml1 = list(), list() + ml0.append(ml1) + ml0.append(TestCycle(1)) + ml1.append(ml0) + + assert_is_alive(0) + assert_is_alive(1) + assert_is_strong(htid_l0) + assert_is_strong(htid_l1) + assert l0[0] is l1 + assert l1[0] is l0 + assert ml0[0] is ml1 + assert ml1[0] is ml0 + + del l0, l1, ml0, ml1 + self._trigger_gc() + assert_is_freed(0) + assert_is_freed(1) + assert_is_strong(htid_l0) + assert_is_strong(htid_l1) + + def test_module_globals(self): + self._trigger_gc() + GCTestModuleGlobal = CPyExtType("GCTestModuleGlobal", + ''' + struct struct_GC_Test_C + { + PyObject_HEAD + PyObject *_test_list_c; + }; + + struct struct_GC_Test_B + { + struct struct_GC_Test_C base; + }; + + struct struct_GC_Test_A + { + PyObject_HEAD + struct struct_GC_Test_B *_test_b; + }; + + struct struct_GC_Test_G + { + PyObject_HEAD + struct struct_GC_Test_A *_test_a; + }; + + static struct struct_GC_Test_G *__GC_Test_Global__ = 0; + static PyTypeObject *pytype_GC_Test_G = 0; + static PyTypeObject *pytype_GC_Test_A = 0; + static PyTypeObject *pytype_GC_Test_B = 0; + static PyTypeObject *pytype_GC_Test_C = 0; + + static PyObject *tp_new_GC_Test_G(PyTypeObject *t, PyObject *a, PyObject *k) { + struct struct_GC_Test_G *p; + PyObject *o = (*t->tp_alloc)(t, 0); + p = ((struct struct_GC_Test_G *)o); + p->_test_a = ((struct struct_GC_Test_A *)Py_None); + Py_INCREF(Py_None); + return o; + } + + static int tp_traverse_GC_Test_G(PyObject *o, visitproc v, void *a) { + struct struct_GC_Test_G *p = (struct struct_GC_Test_G *)o; + if (p->_test_a) + return (*v)(((PyObject *)p->_test_a), a); + return 0; + } + + static PyObject *tp_new_GC_Test_A(PyTypeObject *t, PyObject *a, PyObject *k) { + PyObject *o = (*t->tp_alloc)(t, 0); + PyObject *t1 = PyObject_CallNoArgs(((PyObject *)pytype_GC_Test_B)); + ((struct struct_GC_Test_A *)o)->_test_b = ((struct struct_GC_Test_B *)t1); + return o; + } + + static int tp_traverse_GC_Test_A(PyObject *o, visitproc v, void *a) { + struct struct_GC_Test_A *p = (struct struct_GC_Test_A *)o; + if (p->_test_b) + return (*v)(((PyObject *)p->_test_b), a); + return 0; + } + + static PyObject *tp_new_GC_Test_C(PyTypeObject *t, PyObject *a, PyObject *k) { + struct struct_GC_Test_C *p; + PyObject *o = (*t->tp_alloc)(t, 0); + p = ((struct struct_GC_Test_C *)o); + p->_test_list_c = ((PyObject *)Py_None); + Py_INCREF(Py_None); + return o; + } + + static int tp_traverse_GC_Test_C(PyObject *o, visitproc v, void *a) { + struct struct_GC_Test_C *p = (struct struct_GC_Test_C *)o; + if (p->_test_list_c) + return (*v)(p->_test_list_c, a); + return 0; + } + + static PyObject *tp_new_GC_Test_B(PyTypeObject *t, PyObject *a, PyObject *k) { + struct struct_GC_Test_B *p; + PyObject *o = tp_new_GC_Test_C(t, a, k); + p = ((struct struct_GC_Test_B *)o); + return o; + } + + static struct struct_GC_Test_A *GC_Test_G_getGCTestA(struct struct_GC_Test_G *self) { + PyObject *t3 = NULL; + if (((PyObject *)self->_test_a) == Py_None) + { + t3 = PyObject_CallNoArgs(((PyObject *)pytype_GC_Test_A)); + Py_DECREF(((PyObject *)self->_test_a)); + self->_test_a = ((struct struct_GC_Test_A *)t3); + } + + Py_INCREF(((PyObject *)self->_test_a)); + return self->_test_a; + } + + static PyObject *GC_Test_B_clear(struct struct_GC_Test_B *self) { + PyObject *py_slice = PySlice_New(Py_None, Py_None, Py_None); + PyObject_DelItem(self->base._test_list_c, py_slice); + Py_INCREF(Py_None); + return Py_None; + } + + static int GC_Test_A_prepare(struct struct_GC_Test_A *self) { + PyObject *t1 = GC_Test_B_clear(self->_test_b); + Py_DECREF(t1); + return 0; + } + + static int GC_Test_A_cleanup(struct struct_GC_Test_A *self) { + PyObject *t1 = GC_Test_B_clear(self->_test_b); + Py_DECREF(t1); + return 0; + } + + static int GC_Test_C__init__(PyObject *self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *list_c = PyTuple_GET_ITEM(__pyx_args, 0); + Py_INCREF(list_c); + Py_DECREF(((struct struct_GC_Test_C *)self)->_test_list_c); + // printf("list_c: %p\\n", list_c); + ((struct struct_GC_Test_C *)self)->_test_list_c = list_c; + return 0; + } + + static int GC_Test_B__init__(PyObject *self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *t1 = NULL; + PyObject *t2 = PyObject_GetAttrString((PyObject *)pytype_GC_Test_C, "__init__"); + PyObject *t3 = PyList_New(0); + PyObject *t6 = PyTuple_New(2); + Py_INCREF(self); + PyTuple_SET_ITEM(t6, 0, self); + PyTuple_SET_ITEM(t6, 1, t3); + t1 = PyObject_Call(t2, t6, NULL); + Py_DECREF(t6); + Py_DECREF(t2); + Py_DECREF(t1); + return 0; + } + + + static PyObject *GC_Test_Global(PyObject *self, PyObject *unused) { + struct struct_GC_Test_A *__pyx_v_A = 0; + __pyx_v_A = GC_Test_G_getGCTestA(__GC_Test_Global__); + GC_Test_A_prepare(__pyx_v_A); + GC_Test_A_cleanup(__pyx_v_A); + Py_INCREF(Py_None); + Py_XDECREF((PyObject *)__pyx_v_A); + return Py_None; + } + + PyTypeObject spec_GC_Test_C = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_name = "GC_Test_C", + .tp_basicsize = sizeof(struct struct_GC_Test_C), + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + .tp_traverse = tp_traverse_GC_Test_C, + .tp_init = GC_Test_C__init__, + .tp_new = tp_new_GC_Test_C, + }; + + PyTypeObject spec_GC_Test_B = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_name = "GC_Test_B", + .tp_basicsize = sizeof(struct struct_GC_Test_B), + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + .tp_traverse = tp_traverse_GC_Test_C, + .tp_init = GC_Test_B__init__, + .tp_new = tp_new_GC_Test_B, + .tp_base = &spec_GC_Test_C, + }; + + PyTypeObject spec_GC_Test_A = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_name = "GC_Test_A", + .tp_basicsize = sizeof(struct struct_GC_Test_A), + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + .tp_traverse = tp_traverse_GC_Test_A, + .tp_new = tp_new_GC_Test_A, + }; + + PyTypeObject spec_GC_Test_G = { + PyVarObject_HEAD_INIT(NULL, 0) + .tp_name = "GC_Test_G", + .tp_basicsize = sizeof(struct struct_GC_Test_G), + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, + .tp_traverse = tp_traverse_GC_Test_G, + .tp_new = tp_new_GC_Test_G, + }; + + ''', + tp_methods='''{"GC_Test_Global", (PyCFunction)GC_Test_Global, METH_NOARGS | METH_CLASS, ""}''', + ready_code=''' + + if (PyType_Ready(&spec_GC_Test_G) < 0) + return NULL; + pytype_GC_Test_G = &spec_GC_Test_G; + + if (PyType_Ready(&spec_GC_Test_A) < 0) + return NULL; + pytype_GC_Test_A = &spec_GC_Test_A; + + if (PyType_Ready(&spec_GC_Test_C) < 0) + return NULL; + pytype_GC_Test_C = &spec_GC_Test_C; + + if (PyType_Ready(&spec_GC_Test_B) < 0) + return NULL; + pytype_GC_Test_B = &spec_GC_Test_B; + + __GC_Test_Global__ = (struct struct_GC_Test_G *)PyObject_CallNoArgs(((PyObject *)pytype_GC_Test_G)); + ''', + ) + + GCTestModuleGlobal.GC_Test_Global() + ####################################### GC ####################################### + self._trigger_gc() + ################################################################################## + GCTestModuleGlobal.GC_Test_Global() + ####################################### GC ####################################### + self._trigger_gc() + ################################################################################## + GCTestModuleGlobal.GC_Test_Global() + ####################################### GC ####################################### + self._trigger_gc() + ################################################################################## + GCTestModuleGlobal.GC_Test_Global() + ####################################### GC ####################################### + self._trigger_gc() + ################################################################################## + +@skipIf(not GRAALPY, "Internal GraalPy RSS function") +def test_current_rss_monitor(): + assert __graalpython__.get_current_rss() > 0 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_indexed_slots.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_indexed_slots.py index 82de4390e7..1a2c5e50aa 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_indexed_slots.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_indexed_slots.py @@ -38,7 +38,6 @@ # SOFTWARE. from . import CPyExtTestCase, CPyExtHeapType -__dir__ = __file__.rpartition("/")[0] class BaseWithSlots: diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_interop_behavior.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_interop_behavior.py index a74a03fcf5..ef43aa7cf6 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_interop_behavior.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_interop_behavior.py @@ -38,16 +38,16 @@ # SOFTWARE. import sys -from unittest import skipIf -from . import CPyExtType +from unittest import skipIf, TestCase +from . import CPyExtType if sys.implementation.name == "graalpy": import polyglot from __graalpython__ import is_native is_windows = sys.platform == "win32" - class TestPyStructNumericSequenceTypes(object): + class TestPyStructNumericSequenceTypes(TestCase): @skipIf(is_native, "not supported in native mode") def test_interop_assertions(self): @@ -131,6 +131,34 @@ def test_native_object_interop_behavior_extension(self): # print("Error : ", e) assert False + @skipIf(is_native, "not supported in native mode") + def test_decorator_usage(self): + class MyType(object): + data = 100000000000 + + t = MyType() + with self.assertRaises(ValueError): + # Fail, because argument is not a type + @polyglot.interop_behavior(t) + class MyTypeBehavior: + @staticmethod + def is_number(_): + return True + + with self.assertRaises(ValueError): + # Fail, because method decorated + @polyglot.interop_behavior(MyType) + def is_number(_): + return True + + # multiple decorator and custom CPyExtType should work + @polyglot.interop_behavior(CPyExtType("dummy", "")) + @polyglot.interop_behavior(MyType) + class MyTypeBehavior: + @staticmethod + def is_number(_): + return True + @skipIf(is_windows, "GR-51663: fails on windows") def test_native_sequence_interop(self): MySequenceNativeType = CPyExtType("MySequenceNativeType", diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_list.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_list.py index b4647b1058..74f3e0a587 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_list.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_list.py @@ -41,8 +41,6 @@ from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare -__dir__ = __file__.rpartition("/")[0] - def _reference_new_list(args): n = args[0] diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_long.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_long.py index c1a83220f3..01f1b92911 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_long.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_long.py @@ -40,7 +40,6 @@ from . import CPyExtTestCase, CPyExtFunction, CPyExtFunctionOutVars, unhandled_error_compare -__dir__ = __file__.rpartition("/")[0] int_bits = struct.calcsize('i') * 8 max_int = 2 ** (int_bits - 1) - 1 @@ -302,7 +301,6 @@ class TestPyLong(CPyExtTestCase): lambda args: True, lambda: ((None,),), code="""PyObject* PyLong_FromAndToVoidPtrAllocated(PyObject* none) { - unsigned long l = 0; void* unwrappedPtr; PyObject* result; void* dummyPtr = malloc(sizeof(size_t)); @@ -311,7 +309,7 @@ class TestPyLong(CPyExtTestCase): if (r < 0) { return Py_None; } - l = PyLong_AsUnsignedLong(obj); + unsigned long long l = PyLong_AsUnsignedLongLong(obj); unwrappedPtr = (void*)l; result = unwrappedPtr == dummyPtr ? Py_True : Py_False; free(dummyPtr); @@ -472,3 +470,16 @@ class TestPyLong(CPyExtTestCase): arguments=["const char* bytes", "Py_ssize_t size", "int little_endian", "int is_signed"], cmpfunc=unhandled_error_compare, ) + + test__PyLong_NumBits = CPyExtFunction( + lambda args: args[0].bit_length(), + lambda: ( + (1,), + (1230948701328090743,), + (-1230948701328090743,), + ), + resultspec="n", + argspec="O", + arguments=["PyObject* obj"], + cmpfunc=unhandled_error_compare, + ) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_member.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_member.py index 143d525a70..c2c1c2a708 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_member.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_member.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -36,11 +36,10 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +import unittest from . import CPyExtType, assert_raises -__dir__ = __file__.rpartition("/")[0] - def _reference_classmethod(args): if isinstance(args[0], type(list.append)): @@ -83,7 +82,7 @@ def _get_c_type(ptype): return "unsigned " + ptype[1:].lower() return ptype.lower() -class TestMethod(object): +class TestMethod(unittest.TestCase): def test_member(self): TestMember = CPyExtType( diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_memoryview.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_memoryview.py index 1f07f9c81a..c4d3ac3e99 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_memoryview.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_memoryview.py @@ -40,11 +40,10 @@ import itertools import struct import sys +import unittest from . import CPyExtTestCase, CPyExtFunction, CPyExtType, unhandled_error_compare_with_message, unhandled_error_compare -__dir__ = __file__.rpartition("/")[0] - indices = (-2, 2, 10) # indices = (-2, 0, 1, 2, 10) slices = list(itertools.starmap(slice, itertools.product(indices, indices, indices))) @@ -443,7 +442,7 @@ class TestPyMemoryView(CPyExtTestCase): ) -class TestObject(object): +class TestObject(unittest.TestCase): def test_memoryview_fromobject_multidim(self): TestType = CPyExtType( "TestMemoryViewMultidim", diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_method.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_method.py index 45bded8cd4..559175a1b8 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_method.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_method.py @@ -37,11 +37,10 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. import types +import unittest from . import CPyExtType, CPyExtTestCase, unhandled_error_compare, CPyExtFunction, assert_raises -__dir__ = __file__.rpartition("/")[0] - def _reference_classmethod(args): if isinstance(args[0], type(list.append)): @@ -49,7 +48,7 @@ def _reference_classmethod(args): raise TypeError -class TestMethod(object): +class TestMethod(unittest.TestCase): def test_methods(self): TestMethods = CPyExtType( diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_misc.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_misc.py index 0ccd0afcab..8ab72ded57 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_misc.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_misc.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -41,10 +41,9 @@ import os import pathlib import sys +import unittest -from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare - -__dir__ = __file__.rpartition("/")[0] +from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare, CPyExtType __global_builtins_dict = builtins.__dict__ @@ -176,36 +175,6 @@ class TestMisc(CPyExtTestCase): cmpfunc=unhandled_error_compare ) - test_PyTruffle_Intrinsic_Pmovmskb = CPyExtFunction( - lambda args: True, - lambda: ( - (0xffffcafebabe, 0xefffdeadbeef), - ), - code=""" -#ifndef __aarch64__ - #include -#endif - PyObject* PyTruffle_Intrinsic_Pmovmskb(PyObject* arg0, PyObject* arg1) { -#ifdef __aarch64__ - return Py_True; -#else - int r; - int64_t a = (int64_t) PyLong_AsSsize_t(arg0); - int64_t b = (int64_t) PyLong_AsSsize_t(arg1); - __m128i zero = _mm_setzero_si128(); - __m128i v = _mm_set_epi64(_m_from_int64(b), _m_from_int64(a)); - v = _mm_cmpeq_epi8(v, zero); - r = _mm_movemask_epi8(v); - return (r == 0 || r == 49344) ? Py_True : Py_False; -#endif - } - """, - resultspec="O", - argspec="OO", - arguments=["PyObject* arg0", "PyObject* arg1"], - cmpfunc=unhandled_error_compare - ) - ignored_test_PointerEquality_Primitive = CPyExtFunction( lambda args: True, lambda: ( @@ -371,3 +340,46 @@ class TestMisc(CPyExtTestCase): arguments=["PyObject* value"], cmpfunc=unhandled_error_compare ) + + +@unittest.skipUnless(sys.implementation.name == 'graalpy', "GraalPy-only") +def test_graalpy_version(): + tester = CPyExtType( + "VersionTester", + code=''' + static PyObject* get_version_str(PyObject* unused) { + return PyUnicode_FromString(GRAALPY_VERSION); + } + static PyObject* get_version_num(PyObject* unused) { + return PyLong_FromLong(GRAALPY_VERSION_NUM); + } + ''', + tp_methods=''' + {"get_version_str", (PyCFunction)get_version_str, METH_NOARGS | METH_STATIC, ""}, + {"get_version_num", (PyCFunction)get_version_num, METH_NOARGS | METH_STATIC, ""} + ''', + ) + version = sys.implementation.version + assert tester.get_version_str() == f'{version.major}.{version.minor}.{version.micro}' + assert tester.get_version_num() == sys.implementation.hexversion + # This is an anti-backport trap. The commit that changed the hexversion format should not be backported because + # existing projects might already contain tests for the next feature release in the old format (pybind11 does) + assert version.major >= 25 + + +def test_unicode_docstring(): + class ClassWithDoc: + """This class has a doc 🙂""" + + tester = CPyExtType( + "DocstringTester", + code=''' + static PyObject* get_doc(PyObject* unused, PyObject* type) { + return PyUnicode_FromString(((PyTypeObject*)type)->tp_doc); + } + ''', + tp_methods=''' + {"get_doc", (PyCFunction)get_doc, METH_O | METH_STATIC, ""} + ''', + ) + assert tester.get_doc(ClassWithDoc) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_mixed_inheritance.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_mixed_inheritance.py index 8ab5505369..b6df7f3a75 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_mixed_inheritance.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_mixed_inheritance.py @@ -37,14 +37,12 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -import sys +import unittest -from . import CPyExtType, CPyExtTestCase, CPyExtFunction, GRAALPYTHON, unhandled_error_compare +from . import CPyExtType -__dir__ = __file__.rpartition("/")[0] - -class TestMixedInheritanceDict: +class TestMixedInheritanceDict(unittest.TestCase): def test_base_type(self): _A = CPyExtType("_A", '''static PyObject* _A_new(PyTypeObject* cls, PyObject* a, PyObject* b) { diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_mmap.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_mmap.py index 32c022b93b..af156b4aa3 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_mmap.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_mmap.py @@ -38,12 +38,11 @@ # SOFTWARE. import mmap +import sys import tempfile from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare -__dir__ = __file__.rpartition("/")[0] - def create_and_map_file(): tmp = tempfile.mktemp(prefix="pymmap_") @@ -51,12 +50,19 @@ def create_and_map_file(): f.write("hello, world") f = open(tmp, "r") return mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) - + + +def _reference_buffer(args): + if sys.implementation.name == 'graalpy' and __graalpython__.posix_module_backend() == 'java': + # Cannot get mmap pointer under emulated backend + raise OSError + return b"hello, world" + class TestPyMmap(CPyExtTestCase): test_buffer = CPyExtFunction( - lambda args: b"hello, world", + _reference_buffer, lambda: ( (create_and_map_file(),), ), @@ -65,7 +71,7 @@ class TestPyMmap(CPyExtTestCase): Py_buffer buf; Py_ssize_t len, i; char* data = NULL; - if (PyObject_GetBuffer(mmapObj, &buf, PyBUF_SIMPLE)) { + if (PyObject_GetBuffer(mmapObj, &buf, PyBUF_SIMPLE) < 0) { return NULL; } len = buf.len; @@ -85,7 +91,7 @@ class TestPyMmap(CPyExtTestCase): # Exercises conversion to native and copying from the actual mmap pointer test_buffer_memcpy = CPyExtFunction( - lambda args: b"hello, world", + _reference_buffer, lambda: ( (create_and_map_file(),), ), diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_modsupport.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_modsupport.py index e272b185f2..ca2c5aeea2 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_modsupport.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_modsupport.py @@ -41,7 +41,6 @@ from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare -__dir__ = __file__.rpartition("/")[0] ModuleType = type(sys) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_module.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_module.py index c64051c744..e0a89a85bf 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_module.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_module.py @@ -1,4 +1,4 @@ -# Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -41,7 +41,6 @@ from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare -__dir__ = __file__.rpartition("/")[0] ModuleType = type(sys) @@ -55,6 +54,22 @@ def _reference_add_object(args): args[0].__dict__[args[1]] = args[2] return 0 + +def _reference_get_filename(args): + if not isinstance(args[0], ModuleType): + raise TypeError + file = getattr(args[0], '__file__', None) + if isinstance(file, str): + return file + raise SystemError + + +module_with_file = ModuleType("module") +module_with_file.__file__ = 'file.py' +module_with_broken_file = ModuleType("module") +module_with_broken_file.__file__ = 1 + + class TestPyModule(CPyExtTestCase): test_PyModule_Check = CPyExtFunction( @@ -176,3 +191,31 @@ class TestPyModule(CPyExtTestCase): arguments=["PyObject* m", "const char* k", "PyObject* v"], cmpfunc=unhandled_error_compare ) + + test_PyModule_GetFilenameObject = CPyExtFunction( + _reference_get_filename, + lambda: ( + (module_with_file,), + (module_with_broken_file,), + (ModuleType("no-file"),), + (1,), + ), + resultspec="O", + argspec='O', + arguments=["PyObject* m"], + cmpfunc=unhandled_error_compare + ) + + test_PyModule_GetFilename = CPyExtFunction( + _reference_get_filename, + lambda: ( + (module_with_file,), + (module_with_broken_file,), + (ModuleType("no-file"),), + (1,), + ), + resultspec="s", + argspec='O', + arguments=["PyObject* m"], + cmpfunc=unhandled_error_compare + ) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_object.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_object.py index 859d514856..f85ca7d266 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_object.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_object.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -38,11 +38,11 @@ # SOFTWARE. import sys +import unittest from unittest import skipIf from . import CPyExtType, CPyExtTestCase, CPyExtFunction, unhandled_error_compare, assert_raises -__dir__ = __file__.rpartition("/")[0] is_windows = sys.platform == "win32" @@ -83,7 +83,7 @@ def __getattribute__(self, key): return object.__getattribute__(self, key) -class TestObject(object): +class TestObject(unittest.TestCase): def test_add(self): TestAdd = CPyExtType("TestAdd", """ @@ -886,7 +886,33 @@ class Foo(TpBasicsize2Type, TpBasicsize3Type): assert foo.get_value(i) == vvv, "Failed" vvv += 1 - def test_new_inherited_from_dominant_base(self): + def test_tp_new_bug_to_bug_compatibility(self): + # msimacek: `update_one_slot` in CPython has a bug regarding unwrappping `tp_new` slots from wrapper methods. + # See the comments in `TpSlots.updateSlots` method for the mechanism. + # This test checks various corner cases arising from that. They don't all use C ext, but I'd like to keep + # all the cases in one place + class X: + pass + + class Y(int): + def __new__(cls, value): + raise AssertionError + + class Z(Y): + pass + + X.__new__ = int.__new__ + Z.__new__ = int.__new__ + + # X() runs object.__new__, ignoring the reassignment + x = X() + assert isinstance(x, X) + # Z() runs int.__new__. It also ignored the reassignment, but since tp_new was and still is set to slot_tp_new, + # it will do the call through dict, which ends up doing the right thing in this case + z = Z(1) + assert isinstance(z, int) + + # The bug can also manifest in multiple-inheritance. A variant of this case appears in pandas DominantBase = CPyExtType( 'DominantBase', ''' @@ -904,8 +930,8 @@ def test_new_inherited_from_dominant_base(self): class Subclass(WeakBase, DominantBase): pass - # In CPython 3.10, Subclass.__new__ is WeakBase.__new__, but Subclass.tp_new is DominantBase.tp_new - + # In CPython, Subclass.__new__ is WeakBase.__new__, but Subclass.tp_new is DominantBase.tp_new + assert Subclass.__new__.__self__ is WeakBase assert Subclass() is Ellipsis def test_descrget(self): @@ -1431,7 +1457,7 @@ def test_take_ownership(self): obj.clear_value() assert value == (1, 2, 3, "hello", "world", dummy) - @skipIf(is_windows) # GR-52900 + @skipIf(is_windows, reason="GR-52900") def test_async_slots(self): import asyncio, types, functools TestTpAsync = CPyExtType("TestTpAsync", @@ -1617,7 +1643,7 @@ def __hash__(self): ) -class TestPickleNative: +class TestPickleNative(unittest.TestCase): def test_pickle_native(self): import pickle TestPicklable = CPyExtType("TestPicklable", "") diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_object_dict.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_object_dict.py index f590247b96..46cf8048d3 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_object_dict.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_object_dict.py @@ -36,6 +36,7 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +import unittest from tests.cpyext import CPyExtType, CPyExtHeapType, assert_raises @@ -87,7 +88,7 @@ class NativeSubtypeWithAddedDict(NativeTypeWithoutDict): pass -class TestObjectDict: +class TestObjectDict(unittest.TestCase): @staticmethod def assert_has_no_dict(obj): assert_raises(AttributeError, setattr, obj, 'foo', 1) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_pystate.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_pystate.py index 8f8d1da261..319cbd9019 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_pystate.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_pystate.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -40,8 +40,6 @@ from . import CPyExtTestCase, CPyExtFunction, CPyExtType -__dir__ = __file__.rpartition("/")[0] - class TestPystate(CPyExtTestCase): test_PyThreadState_GetDict = CPyExtFunction( @@ -70,3 +68,47 @@ def test_PyThreadState_GetFrame(self): tp_methods='{"get_frame", (PyCFunction)get_frame, METH_NOARGS | METH_STATIC, NULL}', ) assert Tester.get_frame() is sys._getframe(0) + + # This seems to get the native extensions into some inconsistent state on GraalPy, giving: + # refcnt below zero during managed adjustment for 0000aaae18fca780 (9 0000000000000009 - 10) + def test_SetAsyncExc(self): + SetAsyncExcCaller = CPyExtType( + "SetAsyncExcCaller", + """ + static PyObject* trigger_ex(PyObject *cls, PyObject *args) { + long thread_id; + PyObject *ex; + if (!PyArg_ParseTuple(args, "lO", &thread_id, &ex)) { + return NULL; + } + PyThreadState_SetAsyncExc(thread_id, ex); + return PyLong_FromLong(42); + } + """, + tp_methods='{"trigger_ex", (PyCFunction)trigger_ex, METH_VARARGS | METH_STATIC, ""}', + ) + + import threading + start = threading.Barrier(2, timeout=20) + + caught_ex = None + def other_thread(): + try: + start.wait() # ensure we are in the try, before raising + r = 0 + for i in range(1, 1000000000): + for j in range(i, 1000000000): + r += j / i + except Exception as e: + nonlocal caught_ex + caught_ex = e + + + t = threading.Thread(target=other_thread) + t.start() + + start.wait() + SetAsyncExcCaller.trigger_ex(t.ident, Exception("test my message")) + t.join() + + assert "test my message" in str(caught_ex), str(caught_ex) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_pythonrun.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_pythonrun.py index b929e6f766..a4343b7a37 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_pythonrun.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_pythonrun.py @@ -39,8 +39,6 @@ from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare, CPyExtType -__dir__ = __file__.rpartition("/")[0] - class TestPythonRun(CPyExtTestCase): diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_set.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_set.py index e5722ac6dc..3b5333d1fd 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_set.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_set.py @@ -39,8 +39,6 @@ from . import CPyExtTestCase, CPyExtFunction, CPyExtFunctionOutVars, unhandled_error_compare -__dir__ = __file__.rpartition("/")[0] - def _reference_contains(args): if not (isinstance(args[0], set) or isinstance(args[0], frozenset)): diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_shutdown.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_shutdown.py index 88ba72a09c..111d06fb28 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_shutdown.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_shutdown.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -50,7 +50,9 @@ ENV['PYTHONPATH'] = str(DIR.parent.parent) ARGS = [] if sys.implementation.name == 'graalpy': - ARGS = ['--python.EnableDebuggingBuiltins'] + ARGS = ['--experimental-options', '--python.EnableDebuggingBuiltins'] + if not __graalpython__.is_native and __graalpython__.is_bytecode_dsl_interpreter: + ARGS += ['--vm.Dpython.EnableBytecodeDSLInterpreter=true'] COMMAND = [sys.executable, *ARGS, str(MODULE_PATH)] diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_slice.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_slice.py index 87b25f4550..5a1f046731 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_slice.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_slice.py @@ -39,9 +39,6 @@ from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare -__dir__ = __file__.rpartition("/")[0] - - class TestPySlice(CPyExtTestCase): diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_structseq.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_structseq.py index 5db1fb7a31..4d65183658 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_structseq.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_structseq.py @@ -1,4 +1,4 @@ -# Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -36,19 +36,19 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +import unittest from . import CPyExtType, CPyExtTestCase, CPyExtFunction, unhandled_error_compare -__dir__ = __file__.rpartition("/")[0] - -class TestPyStructSequenceTypes(object): +class TestPyStructSequenceTypes(unittest.TestCase): def test_properties(self): TestPyStructSequence = CPyExtType("TestPyStructSequence", """ static PyStructSequence_Field typeinfo_fields[] = { {"element0", "The first element."}, {"element1", "The second element."}, + {"element2", "The third element."}, {NULL, NULL,} }; @@ -70,11 +70,18 @@ def test_properties(self): ) assert TestPyStructSequence.__doc__ == "Information about some custom struct type" - tester = TestPyStructSequence(("hello", "world")) + tester = TestPyStructSequence(("hello", "world"), {"element2": 1}) assert hasattr(tester, "element0") assert hasattr(tester, "element1") assert tester.element0 == "hello" assert tester.element1 == "world" + assert tester.element2 == 1 + assert len(tester) == 2 + assert tuple(tester) == ("hello", "world") + assert repr(tester) == "TestPyStructSequenceTypes.TestPyStructSequence(element0='hello', element1='world')" + assert tester.__repr__() == "TestPyStructSequenceTypes.TestPyStructSequence(element0='hello', element1='world')" + assert tester.__reduce__() == (TestPyStructSequence, (('hello', 'world'), {'element2': 1})) + assert tester.__reduce__.__qualname__ == "TestPyStructSequence.__reduce__" def test_structseq_newtype(self): TestPyStructSequenceNewType = CPyExtType("TestPyStructSequenceNewType", """ diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_sys.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_sys.py index 9d05e550d4..ea5c0d2b95 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_sys.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_sys.py @@ -41,7 +41,6 @@ from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare -__dir__ = __file__.rpartition("/")[0] def _reference_get_object(args): try: diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_thread.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_thread.py index 002e474a48..bd314eb931 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_thread.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_thread.py @@ -37,11 +37,11 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. import threading +import unittest +import sys from . import CPyExtTestCase, CPyExtFunction, unhandled_error_compare, CPyExtType -__dir__ = __file__.rpartition("/")[0] - class TestPyThread(CPyExtTestCase): @@ -82,27 +82,27 @@ class TestPyThread(CPyExtTestCase): ) -class TestNativeThread: +@unittest.skipIf(sys.platform == 'win32', "Needs pthread") +class TestNativeThread(unittest.TestCase): def test_register_new_thread(self): TestThread = CPyExtType( name="TestThread", includes="#include ", code=r''' - void* thread_entrypoint(void* arg) { + void test_attach_detach(PyObject *callable) { // This check is important not just to check that the function works without the thread attached, // but also because the thread attaching logic in it can break the following PyGILState_Ensure call if (PyGILState_Check()) { PyErr_SetString(PyExc_RuntimeError, "Thread shouldn't be holding the GIL at this point"); PyErr_WriteUnraisable(NULL); - return NULL; + return; } - PyObject* callable = (PyObject*)arg; PyGILState_STATE gstate; gstate = PyGILState_Ensure(); if (!PyGILState_Check()) { PyErr_SetString(PyExc_RuntimeError, "GIL not acquired"); PyErr_WriteUnraisable(NULL); - return NULL; + return; } if (!PyObject_CallNoArgs(callable)) { PyErr_WriteUnraisable(callable); @@ -114,8 +114,12 @@ def test_register_new_thread(self): if (PyGILState_Check()) { PyErr_SetString(PyExc_RuntimeError, "GIL not released"); PyErr_WriteUnraisable(NULL); - return NULL; } + } + void* thread_entrypoint(void* arg) { + test_attach_detach((PyObject*)arg); + test_attach_detach((PyObject*)arg); + test_attach_detach((PyObject*)arg); return NULL; } PyObject* run_in_thread(PyObject* self, PyObject* callable) { diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_tp_slots.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_tp_slots.py index 932c54b5f9..fddd7ca153 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_tp_slots.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_tp_slots.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -36,8 +36,19 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +import itertools import sys + +import operator from . import CPyExtType, CPyExtHeapType, compile_module_from_string, assert_raises, compile_module_from_file +from .test_indexed_slots import cmembers + + +def get_delegate(o): + if hasattr(o, 'delegate'): + return get_delegate(o.delegate) + return o + SlotsGetter = CPyExtType("SlotsGetter", """ @@ -284,14 +295,14 @@ def test_concat_vs_add(): x = SqAdd() assert x + x is x - # TODO: assert _operator.concat(x, x) is x when _operator.concat is implemented + assert operator.concat(x, x) is x assert x.__add__(x) is x class SqAddManaged(SqAdd): pass x = SqAddManaged() assert x + x is x assert x.__add__(x) is x - # TODO: assert _operator.concat(x, x) is x when _operator.concat is implemented + assert operator.concat(x, x) is x SqAddAndNbAdd = CPyExtHeapType("SqAddAndNbAdd", slots= [ @@ -305,7 +316,313 @@ class SqAddManaged(SqAdd): pass x = SqAddAndNbAdd() y = SqAddAndNbAdd() assert x + y is y - # TODO: assert _operator.concat(x, x) is x when _operator.concat is implemented + assert operator.concat(x, y) is x + + SqAddAndNbAddNoImplemented = CPyExtHeapType("SqAddAndNbAddNoImplemented", + slots= [ + '{Py_sq_concat, &concat}', + '{Py_nb_add, &myadd}', + ], + code= + 'PyObject* concat(PyObject* a, PyObject *b) { Py_INCREF(a); return a; }' + + 'PyObject* myadd(PyObject* a, PyObject *b) { Py_RETURN_NOTIMPLEMENTED; }') + x = SqAddAndNbAddNoImplemented() + assert x + 1 is x + + +def test_inplace_fallback(): + WithSlot = CPyExtHeapType( + "NbAdd1", + slots=[ + '{Py_nb_add, &nb_add}', + ], + code=''' + PyObject* nb_add(PyObject* a, PyObject *b) { return PyUnicode_FromString("add1"); } + ''', + ) + WithInplaceSlot = CPyExtHeapType( + "NbInplaceAdd1", + slots=[ + '{Py_nb_add, &nb_add}', + '{Py_nb_inplace_add, &nb_inplace_add}', + ], + code=''' + PyObject* nb_add(PyObject* a, PyObject *b) { return PyUnicode_FromString("add2"); } + PyObject* nb_inplace_add(PyObject* a, PyObject *b) { return PyUnicode_FromString("inplace_add"); } + ''', + ) + x = WithSlot() + y = WithInplaceSlot() + x += y + assert x == "add1" + x = WithSlot() + y += x + assert y == "inplace_add" + x = object() + y = WithInplaceSlot() + x += y + assert x == "add2" + + +def test_sq_inplace_concat_vs_nb_inplace_add(): + SqInplaceConcat = CPyExtHeapType( + "SqInplaceConcat", + slots=[ + '{Py_sq_concat, &concat}', + '{Py_sq_inplace_concat, &inplace_concat}', + ], + code=''' + PyObject* concat(PyObject* a, PyObject *b) { return PyUnicode_FromString("concat"); } + PyObject* inplace_concat(PyObject* a, PyObject *b) { return PyUnicode_FromString("inplace_concat"); } + ''', + ) + x = SqInplaceConcat() + x += 1 + assert x == "inplace_concat" + x = SqInplaceConcat() + assert operator.iconcat(x, []) == "inplace_concat" + + SqInplaceConcatAndNbInplaceAdd = CPyExtHeapType( + "SqInplaceConcatAndNbInplaceAdd", + slots=['{Py_sq_inplace_concat, &inplace_concat}', '{Py_nb_inplace_add, &inplace_add}'], + code=''' + PyObject* inplace_concat(PyObject* a, PyObject *b) { return PyUnicode_FromString("inplace_concat"); } + PyObject* inplace_add(PyObject* a, PyObject *b) { return PyUnicode_FromString("inplace_add"); } + ''', + ) + + x = SqInplaceConcatAndNbInplaceAdd() + x += 1 + assert x == "inplace_add" + x = SqInplaceConcatAndNbInplaceAdd() + assert operator.iconcat(x, 1) == "inplace_concat" + + SqInplaceConcatAndNbInplaceAddNotImplemented = CPyExtHeapType( + "InplaceConcatAddNotImpl", + slots=['{Py_sq_inplace_concat, &inplace_concat}', '{Py_nb_inplace_add, &inplace_add}'], + code=''' + PyObject* inplace_concat(PyObject* a, PyObject *b) { return PyUnicode_FromString("inplace_concat"); } + PyObject* inplace_add(PyObject* a, PyObject *b) { Py_RETURN_NOTIMPLEMENTED; } + ''', + ) + + x = SqInplaceConcatAndNbInplaceAddNotImplemented() + x += 1 + assert x == "inplace_concat" + + class InplaceConcatSubclass(SqInplaceConcat): + pass + + x = InplaceConcatSubclass() + assert operator.iconcat(x, 1) == "inplace_concat" + + SqConcat = CPyExtHeapType( + "SqConcat", + slots=['{Py_sq_concat, &concat}'], + code='PyObject* concat(PyObject* a, PyObject *b) { return PyUnicode_FromString("concat"); }', + ) + + x = SqConcat() + x += 1 + assert x == "concat" + x = SqConcat() + assert operator.iconcat(x, 1) == "concat" + + NbInplaceAdd = CPyExtHeapType( + "NbInplaceAdd", + slots=['{Py_nb_inplace_add, &inplace_add}'], + code='PyObject* inplace_add(PyObject* a, PyObject *b) { return PyUnicode_FromString("inplace_add"); }', + ) + + x = NbInplaceAdd() + assert_raises(TypeError, operator.iconcat, x, 1) + assert_raises(TypeError, operator.iconcat, x, []) + + SequenceWithNbInplaceAdd = CPyExtHeapType( + "SequenceWithNbInplaceAdd", + slots=['{Py_nb_inplace_add, &inplace_add}', '{Py_sq_item, &item}'], + code=''' + PyObject* inplace_add(PyObject* a, PyObject *b) { return PyUnicode_FromString("inplace_add"); } + PyObject* item(PyObject* a, PyObject *b) { return PyUnicode_FromString("item"); } + ''', + ) + + x = SequenceWithNbInplaceAdd() + assert_raises(TypeError, operator.iconcat, x, 1) + assert operator.iconcat(x, []) == "inplace_add" + +CallRepeatHelper = CPyExtType( + "CallRepeatHelper", + code=''' + PyObject* call_repeat(PyObject* unused, PyObject* args) { + PyObject* obj; + Py_ssize_t times; + if (!PyArg_ParseTuple(args, "On", &obj, ×)) + return NULL; + return PySequence_Repeat(obj, times); + } + PyObject* call_inplace_repeat(PyObject* unused, PyObject* args) { + PyObject* obj; + Py_ssize_t times; + if (!PyArg_ParseTuple(args, "On", &obj, ×)) + return NULL; + return PySequence_InPlaceRepeat(obj, times); + } + ''', + tp_methods=''' + {"PySequence_Repeat", (PyCFunction)call_repeat, METH_VARARGS | METH_STATIC, ""}, + {"PySequence_InPlaceRepeat", (PyCFunction)call_inplace_repeat, METH_VARARGS | METH_STATIC, ""} + ''' +) + + +def test_repeat_vs_multiply(): + SqRepeat = CPyExtHeapType( + "SqRepeat", + slots=['{Py_sq_repeat, &repeat}'], + code='PyObject* repeat(PyObject* a, Py_ssize_t times) { return PyUnicode_FromString("repeat"); }', + ) + + x = SqRepeat() + assert x * 2 == "repeat" + assert 2 * x == "repeat" + assert CallRepeatHelper.PySequence_Repeat(x, 2) == "repeat" + assert x.__mul__(2) == "repeat" + assert x.__rmul__(2) == "repeat" + assert_raises(TypeError, operator.mul, x, x) + + class SqRepeatManaged(SqRepeat): pass + + x = SqRepeatManaged() + assert x * 2 == "repeat" + assert 2 * x == "repeat" + assert CallRepeatHelper.PySequence_Repeat(x, 2) == "repeat" + assert x.__mul__(2) == "repeat" + assert x.__rmul__(2) == "repeat" + assert_raises(TypeError, operator.mul, x, x) + + SqRepeatAndNbMultiply = CPyExtHeapType( + "SqRepeatAndNbMultiply", + slots=[ + '{Py_sq_repeat, &repeat}', + '{Py_nb_multiply, &mymultiply}', + ], + code=''' + PyObject* repeat(PyObject* a, Py_ssize_t times) { return PyUnicode_FromString("repeat"); } + PyObject* mymultiply(PyObject* a, PyObject *b) { return PyUnicode_FromString("multiply"); } + ''', + ) + + x = SqRepeatAndNbMultiply() + assert x * 2 == "multiply" + assert 2 * x == "multiply" + assert CallRepeatHelper.PySequence_Repeat(x, 2) == "repeat" + + SqRepeatAndNbMultiplyNoImplemented = CPyExtHeapType( + "RepeatAndMulNotImpl", + slots=[ + '{Py_sq_repeat, &repeat}', + '{Py_nb_multiply, &mymultiply}', + ], + code=''' + PyObject* repeat(PyObject* a, Py_ssize_t times) { return PyUnicode_FromString("repeat"); } + PyObject* mymultiply(PyObject* a, PyObject *b) { Py_RETURN_NOTIMPLEMENTED; } + ''', + ) + x = SqRepeatAndNbMultiplyNoImplemented() + assert x * 2 == "repeat" + + +def test_sq_inplace_repeat_vs_nb_inplace_multiply(): + SqInplaceRepeat = CPyExtHeapType( + "SqInplaceRepeat", + slots=[ + '{Py_sq_repeat, &repeat}', + '{Py_sq_inplace_repeat, &inplace_repeat}' + ], + code=''' + PyObject* repeat(PyObject* a, PyObject *b) { return PyUnicode_FromString("repeat"); } + PyObject* inplace_repeat(PyObject* a, Py_ssize_t times) { return PyUnicode_FromString("inplace_repeat"); } + ''', + ) + x = SqInplaceRepeat() + x *= 1 + assert x == "inplace_repeat" + x = SqInplaceRepeat() + assert CallRepeatHelper.PySequence_InPlaceRepeat(x, 1) == "inplace_repeat" + + x = 1 + x *= SqInplaceRepeat() + assert x == "repeat" + + SqInplaceRepeatAndNbInplaceMultiply = CPyExtHeapType( + "SqInplaceRepeatAndNbInMul", + slots=['{Py_sq_inplace_repeat, &inplace_repeat}', '{Py_nb_inplace_multiply, &inplace_multiply}'], + code=''' + PyObject* inplace_repeat(PyObject* a, Py_ssize_t times) { return PyUnicode_FromString("inplace_repeat"); } + PyObject* inplace_multiply(PyObject* a, PyObject* b) { return PyUnicode_FromString("inplace_multiply"); } + ''', + ) + + x = SqInplaceRepeatAndNbInplaceMultiply() + x *= 1 + assert x == "inplace_multiply" + x = SqInplaceRepeatAndNbInplaceMultiply() + assert CallRepeatHelper.PySequence_InPlaceRepeat(x, 1) == "inplace_repeat" + + SqInplaceRepeatAndNbInplaceMultiplyNotImplemented = CPyExtHeapType( + "InplaceRepeatAndMulNotImpl", + slots=['{Py_sq_inplace_repeat, &inplace_repeat}', '{Py_nb_inplace_multiply, &inplace_multiply}'], + code=''' + PyObject* inplace_repeat(PyObject* a, Py_ssize_t times) { return PyUnicode_FromString("inplace_repeat"); } + PyObject* inplace_multiply(PyObject* a, PyObject *b) { Py_RETURN_NOTIMPLEMENTED; } + ''', + ) + + x = SqInplaceRepeatAndNbInplaceMultiplyNotImplemented() + x *= 1 + assert x == "inplace_repeat" + + class InplaceRepeatSubclass(SqInplaceRepeat): + pass + + x = InplaceRepeatSubclass() + assert CallRepeatHelper.PySequence_InPlaceRepeat(x, 1) == "inplace_repeat" + + SqRepeat = CPyExtHeapType( + "SqRepeat2", + slots=['{Py_sq_repeat, &repeat}'], + code='PyObject* repeat(PyObject* a, PyObject *b) { return PyUnicode_FromString("repeat"); }', + ) + + x = SqRepeat() + x *= 1 + assert x == "repeat" + x = SqRepeat() + assert CallRepeatHelper.PySequence_InPlaceRepeat(x, 1) == "repeat" + + NbInplaceMultiply = CPyExtHeapType( + "NbInplaceMultiply", + slots=['{Py_nb_inplace_multiply, &inplace_multiply}'], + code='PyObject* inplace_multiply(PyObject* a, PyObject *b) { return PyUnicode_FromString("inplace_multiply"); }', + ) + + x = NbInplaceMultiply() + assert_raises(TypeError, CallRepeatHelper.PySequence_InPlaceRepeat, x, 1) + assert_raises(TypeError, CallRepeatHelper.PySequence_InPlaceRepeat, x, []) + + SequenceWithNbInplaceMultiply = CPyExtHeapType( + "SequenceWithNbInplaceMultiply", + slots=['{Py_nb_inplace_multiply, &inplace_multiply}', '{Py_sq_item, &item}'], + code=''' + PyObject* inplace_multiply(PyObject* a, PyObject *b) { return PyUnicode_FromString("inplace_multiply"); } + PyObject* item(PyObject* a, PyObject *b) { return PyUnicode_FromString("item"); } + ''', + ) + + x = SequenceWithNbInplaceMultiply() + assert_raises(TypeError, CallRepeatHelper.PySequence_InPlaceRepeat, x, []) + assert CallRepeatHelper.PySequence_InPlaceRepeat(x, 1) == "inplace_multiply" def test_incompatible_slots_assignment(): @@ -495,8 +812,8 @@ class InheritsHash(TypeWithHash): def assert_has_no_hash(obj): assert_raises(TypeError, hash, obj) - assert type(obj).__hash__ is None - assert TypeWithoutHash.has_hash_not_implemented(obj) + assert type(obj).__hash__ is None, f"{type(obj).__hash__=}, {TypeWithoutHash.has_hash_not_implemented(obj)=}" + assert TypeWithoutHash.has_hash_not_implemented(obj), f"{type(obj).__hash__=}, {TypeWithoutHash.has_hash_not_implemented(obj)=}" assert_has_no_hash(TypeWithoutHash()) @@ -522,13 +839,27 @@ class DisablesHash2(TypeWithHash): assert_has_no_hash(DisablesHash2()) - # TODO GR-55196 - # TypeWithoutHashExplicit = CPyExtType( - # "TypeWithoutHashExplicit", - # tp_hash='PyObject_HashNotImplemented', - # ) - # - # assert_has_no_hash(TypeWithoutHashExplicit()) + TypeWithoutHashExplicit = CPyExtType( + "TypeWithoutHashExplicit", + tp_hash='PyObject_HashNotImplemented', + code = ''' + // static hashfunc myglobal = PyObject_HashNotImplemented; + // typedef struct { hashfunc x; } _mystruct_t; + // static _mystruct_t mystruct = { PyObject_HashNotImplemented }; + ''', + ready_code = ''' + // printf("TypeWithoutHashExplicitType.tp_hash=%p, PyObject_HashNotImplemented=%p, myglobal=%p, mystruct.x=%p\\n", TypeWithoutHashExplicitType.tp_hash, &PyObject_HashNotImplemented, myglobal, mystruct.x); + // printf("TypeWithoutHashExplicitType.tp_as_mapping=%p, TypeWithoutHashExplicit_mapping_methods=%p\\n", TypeWithoutHashExplicitType.tp_as_mapping, &TypeWithoutHashExplicit_mapping_methods); + // printf("offsetof(PyTypeObject, tp_hash)=%p, tp_as_mapping=%p\\n", offsetof(PyTypeObject, tp_hash), offsetof(PyTypeObject, tp_as_mapping)); + // For some reason MSVC initializes tp_hash to some different pointer that also seems to point to PyObject_HashNotImplemented (some dynamic linking issue?) + // This happens on both CPython 3.11 and GraalPy. The printouts above can help debug the issue in the future. + #if defined(_MSC_VER) + TypeWithoutHashExplicitType.tp_hash=PyObject_HashNotImplemented; + #endif + ''' + ) + + assert_has_no_hash(TypeWithoutHashExplicit()) def test_attr_update(): @@ -598,4 +929,823 @@ def __get__(self,obj,objtype=None): return "dummy" def __setattr__(self,name,value): return None assert 3 * Managed1() == 3 - assert Managed1() * 3 == "__mul__result: 3" \ No newline at end of file + assert Managed1() * 3 == "__mul__result: 3" + + +def test_PyType_Modified_doesnt_change_slots(): + TypeWithSqItemAndMpSubscr = CPyExtType( + "TypeWithSqItemAndMpSubscr", + code=''' + static PyObject* sq_item(PyObject* self, Py_ssize_t index) { + return PyUnicode_FromString("sq_item"); + } + static PyObject* mp_subscript(PyObject* self, PyObject* index) { + return PyUnicode_FromString("mp_subscript"); + } + static PyObject* call_PySequence_GetItem(PyObject* self, PyObject* index) { + Py_ssize_t i = PyLong_AsSsize_t(index); + if (i == -1 && PyErr_Occurred()) + return NULL; + return PySequence_GetItem(self, i); + } + ''', + sq_item="sq_item", + mp_subscript="mp_subscript", + tp_methods='{"call_PySequence_GetItem", (PyCFunction)call_PySequence_GetItem, METH_O, ""}', + post_ready_code="PyType_Modified(&TypeWithSqItemAndMpSubscrType);" + ) + tester = TypeWithSqItemAndMpSubscr() + assert tester[1] == 'mp_subscript' + assert tester.call_PySequence_GetItem(1) == 'sq_item' + + +class DelegateSlot: + def __set_name__(self, owner, name): + self.name = name + + def __get__(self, obj, objtype=None): + return getattr(obj.delegate, self.name) + + +class DelegateInplaceSlot(DelegateSlot): + def __get__(self, obj, objtype=None): + method = getattr(obj.delegate, self.name, None) + if method is None: + method = getattr(obj.delegate, self.name.replace('__i', '__')) + + def wrapper(*args): + self.delegate = method(*args) + return self + + return wrapper + + +native_slot_proxy_template = ''' +static PyObject* get_delegate(PyObject* self) { + return ((ProxyObject*)self)->delegate; +} +static void set_delegate(PyObject* self, PyObject* delegate) { + Py_XSETREF(((ProxyObject*)self)->delegate, delegate); +} +static PyObject* proxy_tp_new(PyTypeObject* type, PyObject* args, PyObject* kwargs) { + PyObject* delegate; + if (!PyArg_UnpackTuple(args, "NativeSlotProxy", 0, 1, &delegate)) + return NULL; + ProxyObject* obj = (ProxyObject*)type->tp_alloc(type, 0); + if (!obj) + return NULL; + obj->delegate = Py_NewRef(delegate); // leaked + return (PyObject*)obj; +} +''' + + +def test_nb_slot_calls(): + slots = [ + ('proxy_nb_binary_slot', 'nb_add'), + ('proxy_nb_binary_slot', 'nb_subtract'), + ('proxy_nb_binary_slot', 'nb_multiply'), + ('proxy_nb_binary_slot', 'nb_remainder'), + ('proxy_nb_binary_slot', 'nb_divmod'), + ('proxy_nb_ternary_slot', 'nb_power'), + ('proxy_nb_unary_slot', 'nb_negative'), + ('proxy_nb_unary_slot', 'nb_positive'), + ('proxy_nb_unary_slot', 'nb_absolute'), + ('proxy_nb_inquiry_slot', 'nb_bool'), + ('proxy_nb_unary_slot', 'nb_invert'), + ('proxy_nb_binary_slot', 'nb_lshift'), + ('proxy_nb_binary_slot', 'nb_rshift'), + ('proxy_nb_binary_slot', 'nb_and'), + ('proxy_nb_binary_slot', 'nb_xor'), + ('proxy_nb_binary_slot', 'nb_or'), + ('proxy_nb_unary_slot', 'nb_int'), + ('proxy_nb_unary_slot', 'nb_float'), + ('proxy_nb_binary_inplace_slot', 'nb_inplace_add'), + ('proxy_nb_binary_inplace_slot', 'nb_inplace_subtract'), + ('proxy_nb_binary_inplace_slot', 'nb_inplace_multiply'), + ('proxy_nb_binary_inplace_slot', 'nb_inplace_remainder'), + ('proxy_nb_ternary_inplace_slot', 'nb_inplace_power'), + ('proxy_nb_binary_inplace_slot', 'nb_inplace_lshift'), + ('proxy_nb_binary_inplace_slot', 'nb_inplace_rshift'), + ('proxy_nb_binary_inplace_slot', 'nb_inplace_and'), + ('proxy_nb_binary_inplace_slot', 'nb_inplace_xor'), + ('proxy_nb_binary_inplace_slot', 'nb_inplace_or'), + ('proxy_nb_binary_slot', 'nb_floor_divide'), + ('proxy_nb_binary_slot', 'nb_true_divide'), + ('proxy_nb_binary_inplace_slot', 'nb_inplace_floor_divide'), + ('proxy_nb_binary_inplace_slot', 'nb_inplace_true_divide'), + ('proxy_nb_unary_slot', 'nb_index'), + ('proxy_nb_binary_slot', 'nb_matrix_multiply'), + ('proxy_nb_binary_inplace_slot', 'nb_inplace_matrix_multiply'), + ] + NativeNbSlotProxy = CPyExtType( + name='NativeNbSlotProxy', + cmembers='PyObject* delegate;', + code=r''' + typedef NativeNbSlotProxyObject ProxyObject; + ''' + native_slot_proxy_template + r''' + static PyTypeObject NativeNbSlotProxyType; + #define proxy_nb_unary_slot(slot) \ + static PyObject* proxy_##slot(PyObject *a) { \ + PyObject* delegate = get_delegate(a); \ + return Py_TYPE(delegate)->tp_as_number->slot(delegate); \ + } + #define proxy_nb_inquiry_slot(slot) \ + static int proxy_##slot(PyObject *a) { \ + PyObject* delegate = get_delegate(a); \ + return Py_TYPE(delegate)->tp_as_number->slot(delegate); \ + } + #define proxy_nb_binary_slot(slot) \ + static PyObject* proxy_##slot(PyObject *a, PyObject *b) { \ + if (Py_TYPE(a) == &NativeNbSlotProxyType) { \ + PyObject* delegate = get_delegate(a); \ + return Py_TYPE(delegate)->tp_as_number->slot(delegate, b); \ + } else { \ + PyObject* delegate = get_delegate(b); \ + return Py_TYPE(delegate)->tp_as_number->slot(a, delegate); \ + } \ + } + #define proxy_nb_binary_inplace_slot(slot) \ + static PyObject* proxy_##slot(PyObject *self, PyObject *other) { \ + PyObject* delegate = get_delegate(self); \ + PyObject* result = Py_TYPE(delegate)->tp_as_number->slot(delegate, other); \ + if (!result) \ + return NULL; \ + set_delegate(self, result); \ + return Py_NewRef(self); \ + } + #define proxy_nb_ternary_slot(slot) \ + static PyObject* proxy_##slot(PyObject *a, PyObject *b, PyObject* c) { \ + if (Py_TYPE(a) == &NativeNbSlotProxyType) { \ + PyObject* delegate = get_delegate(a); \ + return Py_TYPE(delegate)->tp_as_number->slot(delegate, b, c); \ + } else if (Py_TYPE(b) == &NativeNbSlotProxyType) { \ + PyObject* delegate = get_delegate(b); \ + return Py_TYPE(delegate)->tp_as_number->slot(a, delegate, c); \ + } else { \ + PyObject* delegate = get_delegate(c); \ + return Py_TYPE(delegate)->tp_as_number->slot(a, b, delegate); \ + } \ + } + #define proxy_nb_ternary_inplace_slot(slot) \ + static PyObject* proxy_##slot(PyObject *self, PyObject *b, PyObject* c) { \ + PyObject* delegate = get_delegate(self); \ + PyObject* result = Py_TYPE(delegate)->tp_as_number->slot(delegate, b, c); \ + if (!result) \ + return NULL; \ + set_delegate(self, result); \ + return Py_NewRef(self); \ + } + ''' + '\n'.join(f'{macro}({slot})' for macro, slot in slots), + tp_new='proxy_tp_new', + tp_members='{"delegate", T_OBJECT, offsetof(ProxyObject, delegate), 0, NULL}', + **{slot: f'proxy_{slot}' for _, slot in slots}, + ) + + class PureSlotProxy: + def __init__(self, delegate): + self.delegate = delegate + + __add__ = DelegateSlot() + __radd__ = DelegateSlot() + __iadd__ = DelegateInplaceSlot() + __sub__ = DelegateSlot() + __rsub__ = DelegateSlot() + __isub__ = DelegateInplaceSlot() + __mul__ = DelegateSlot() + __rmul__ = DelegateSlot() + __imul__ = DelegateInplaceSlot() + __mod__ = DelegateSlot() + __rmod__ = DelegateSlot() + __imod__ = DelegateInplaceSlot() + __floordiv__ = DelegateSlot() + __rfloordiv__ = DelegateSlot() + __ifloordiv__ = DelegateInplaceSlot() + __truediv__ = DelegateSlot() + __rtruediv__ = DelegateSlot() + __itruediv__ = DelegateInplaceSlot() + __divmod__ = DelegateSlot() + __rdivmod__ = DelegateSlot() + __pow__ = DelegateSlot() + __rpow__ = DelegateSlot() + __ipow__ = DelegateInplaceSlot() + __pos__ = DelegateSlot() + __neg__ = DelegateSlot() + __abs__ = DelegateSlot() + __bool__ = DelegateSlot() + __invert__ = DelegateSlot() + __index__ = DelegateSlot() + __int__ = DelegateSlot() + __float__ = DelegateSlot() + __lshift__ = DelegateSlot() + __rlshift__ = DelegateSlot() + __ilshift__ = DelegateInplaceSlot() + __rshift__ = DelegateSlot() + __rrshift__ = DelegateSlot() + __irshift__ = DelegateInplaceSlot() + __and__ = DelegateSlot() + __rand__ = DelegateSlot() + __iand__ = DelegateInplaceSlot() + __or__ = DelegateSlot() + __ror__ = DelegateSlot() + __ior__ = DelegateInplaceSlot() + __xor__ = DelegateSlot() + __rxor__ = DelegateSlot() + __ixor__ = DelegateInplaceSlot() + __matmul__ = DelegateSlot() + __rmatmul__ = DelegateSlot() + __imatmul__ = DelegateInplaceSlot() + + class ObjWithMatmul: + def __matmul__(self, other): + return "@" + + def __rmatmul__(self, other): + return "@" + + for obj in [NativeNbSlotProxy(3), NativeNbSlotProxy(PureSlotProxy(3))]: + assert obj + 2 == 5 + assert 2 + obj == 5 + assert obj - 2 == 1 + assert 2 - obj == -1 + assert obj * 2 == 6 + assert 2 * obj == 6 + assert obj % 2 == 1 + assert 2 % obj == 2 + assert divmod(obj, 2) == (1, 1) + assert divmod(2, obj) == (0, 2) + assert obj ** 2 == 9 + assert 2 ** obj == 8 + assert pow(obj, 2, 2) == 1 + if isinstance(obj.delegate, int): # pow doesn't call __rpow__ + assert pow(2, obj, 2) == 0 + assert pow(2, 2, obj) == 1 + assert -obj == -3 + assert +obj == 3 + assert abs(obj) == 3 + assert bool(obj) + assert ~obj == -4 + assert obj << 2 == 12 + assert 2 << obj == 16 + assert obj >> 2 == 0 + assert 2 >> obj == 0 + assert obj & 2 == 2 + assert 2 & obj == 2 + assert obj | 2 == 3 + assert 2 | obj == 3 + assert obj ^ 2 == 1 + assert 2 ^ obj == 1 + assert int(obj) == 3 + assert float(obj) == 3.0 + assert operator.index(obj) == 3 + assert obj // 2 == 1 + assert 2 // obj == 0 + assert obj / 2 == 1.5 + assert 2 / obj == 2 / 3 + + obj = NativeNbSlotProxy(ObjWithMatmul()) + assert obj @ 1 == '@' + assert 1 @ obj == '@' + + obj = NativeNbSlotProxy(PureSlotProxy(3)) + obj += 2 + assert obj.delegate.delegate == 5 + obj = NativeNbSlotProxy(PureSlotProxy(3)) + obj -= 2 + assert obj.delegate.delegate == 1 + obj = NativeNbSlotProxy(PureSlotProxy(3)) + obj *= 2 + assert obj.delegate.delegate == 6 + obj = NativeNbSlotProxy(PureSlotProxy(3)) + obj %= 2 + assert obj.delegate.delegate == 1 + obj = NativeNbSlotProxy(PureSlotProxy(3)) + obj **= 2 + assert obj.delegate.delegate == 9 + obj = NativeNbSlotProxy(PureSlotProxy(3)) + obj <<= 2 + assert obj.delegate.delegate == 12 + obj = NativeNbSlotProxy(PureSlotProxy(3)) + obj >>= 2 + assert obj.delegate.delegate == 0 + obj = NativeNbSlotProxy(PureSlotProxy(3)) + obj &= 2 + assert obj.delegate.delegate == 2 + obj = NativeNbSlotProxy(PureSlotProxy(3)) + obj |= 2 + assert obj.delegate.delegate == 3 + obj = NativeNbSlotProxy(PureSlotProxy(3)) + obj ^= 2 + assert obj.delegate.delegate == 1 + obj = NativeNbSlotProxy(PureSlotProxy(3)) + obj //= 2 + assert obj.delegate.delegate == 1 + obj = NativeNbSlotProxy(PureSlotProxy(3)) + obj /= 2 + assert obj.delegate.delegate == 1.5 + obj = NativeNbSlotProxy(PureSlotProxy(ObjWithMatmul())) + obj @= 1 + assert obj.delegate.delegate == '@' + + +def test_sq_slot_calls(): + NativeSqSlotProxy = CPyExtType( + name='NativeSqSlotProxy', + cmembers='PyObject* delegate;', + code=r''' + typedef NativeSqSlotProxyObject ProxyObject; + ''' + native_slot_proxy_template + r''' + static Py_ssize_t proxy_sq_length(PyObject* self) { + PyObject* delegate = get_delegate(self); + return Py_TYPE(delegate)->tp_as_sequence->sq_length(delegate); + } + static PyObject* proxy_sq_item(PyObject* self, Py_ssize_t item) { + PyObject* delegate = get_delegate(self); + return Py_TYPE(delegate)->tp_as_sequence->sq_item(delegate, item); + } + static int proxy_sq_ass_item(PyObject* self, Py_ssize_t item, PyObject* value) { + PyObject* delegate = get_delegate(self); + return Py_TYPE(delegate)->tp_as_sequence->sq_ass_item(delegate, item, value); + } + static int proxy_sq_contains(PyObject* self, PyObject* item) { + PyObject* delegate = get_delegate(self); + return Py_TYPE(delegate)->tp_as_sequence->sq_contains(delegate, item); + } + static PyObject* proxy_sq_concat(PyObject* self, PyObject* item) { + PyObject* delegate = get_delegate(self); + return Py_TYPE(delegate)->tp_as_sequence->sq_concat(delegate, item); + } + static PyObject* proxy_sq_inplace_concat(PyObject* self, PyObject* item) { + PyObject* delegate = get_delegate(self); + PyObject* result = Py_TYPE(delegate)->tp_as_sequence->sq_inplace_concat(delegate, item); + if (!result) + return NULL; + set_delegate(self, result); + return Py_NewRef(self); + } + static PyObject* proxy_sq_repeat(PyObject* self, Py_ssize_t times) { + PyObject* delegate = get_delegate(self); + return Py_TYPE(delegate)->tp_as_sequence->sq_repeat(delegate, times); + } + static PyObject* proxy_sq_inplace_repeat(PyObject* self, Py_ssize_t times) { + PyObject* delegate = get_delegate(self); + PyObject* result = Py_TYPE(delegate)->tp_as_sequence->sq_inplace_repeat(delegate, times); + if (!result) + return NULL; + set_delegate(self, result); + return Py_NewRef(self); + } + ''', + tp_new='proxy_tp_new', + tp_members='{"delegate", T_OBJECT, offsetof(ProxyObject, delegate), 0, NULL}', + sq_length='proxy_sq_length', + sq_item='proxy_sq_item', + sq_ass_item='proxy_sq_ass_item', + sq_contains='proxy_sq_contains', + sq_concat='proxy_sq_concat', + sq_inplace_concat='proxy_sq_inplace_concat', + sq_repeat='proxy_sq_repeat', + sq_inplace_repeat='proxy_sq_inplace_repeat', + ) + + class PureSlotProxy: + def __init__(self, delegate): + self.delegate = delegate + + __len__ = DelegateSlot() + __getitem__ = DelegateSlot() + __setitem__ = DelegateSlot() + __delitem__ = DelegateSlot() + __contains__ = DelegateSlot() + + for obj in [NativeSqSlotProxy([1]), NativeSqSlotProxy(PureSlotProxy([1]))]: + assert len(obj) == 1 + assert bool(obj) + assert 1 in obj + assert 2 not in obj + + assert obj[0] == 1 + assert_raises(IndexError, operator.getitem, obj, 1) + assert_raises(IndexError, operator.getitem, obj, 1 << 65) + assert_raises(TypeError, operator.getitem, obj, "a") + + assert_raises(IndexError, operator.setitem, obj, 1, 3) + assert_raises(IndexError, operator.setitem, obj, 1 << 65, 3) + assert_raises(TypeError, operator.setitem, obj, "a", 3) + assert_raises(TypeError, operator.setitem, obj, slice(0), 3) + assert get_delegate(obj) == [1] + obj[0] = 2 + assert get_delegate(obj) == [2] + + assert_raises(IndexError, operator.delitem, obj, 1) + assert_raises(IndexError, operator.delitem, obj, 1 << 65) + assert_raises(TypeError, operator.delitem, obj, "a") + assert_raises(TypeError, operator.delitem, obj, slice(0)) + assert get_delegate(obj) == [2] + del obj[0] + assert get_delegate(obj) == [] + assert not bool(obj) + + obj = NativeSqSlotProxy([1]) + assert obj + [2] == [1, 2] + obj += [2] + assert obj.delegate == [1, 2] + obj = NativeSqSlotProxy([1]) + assert obj * 2 == [1, 1] + obj *= 2 + assert obj.delegate == [1, 1] + obj = NativeSqSlotProxy([1]) + assert_raises(TypeError, operator.mul, obj, "a") + assert_raises(OverflowError, operator.mul, obj, 1 << 65) + try: + obj *= "a" + except TypeError: + pass + else: + assert False + try: + obj *= 1 << 65 + except OverflowError: + pass + else: + assert False + assert get_delegate(obj) == [1] + + +def test_mp_slot_calls(): + NativeMpSlotProxy = CPyExtType( + name='NativeMpSlotProxy', + cmembers='PyObject* delegate;', + code=r''' + typedef NativeMpSlotProxyObject ProxyObject; + ''' + native_slot_proxy_template + r''' + static Py_ssize_t proxy_mp_length(PyObject* self) { + PyObject* delegate = get_delegate(self); + return Py_TYPE(delegate)->tp_as_mapping->mp_length(delegate); + } + static PyObject* proxy_mp_subscript(PyObject* self, PyObject* item) { + PyObject* delegate = get_delegate(self); + return Py_TYPE(delegate)->tp_as_mapping->mp_subscript(delegate, item); + } + static int proxy_mp_ass_subscript(PyObject* self, PyObject* item, PyObject* value) { + PyObject* delegate = get_delegate(self); + return Py_TYPE(delegate)->tp_as_mapping->mp_ass_subscript(delegate, item, value); + } + ''', + tp_new='proxy_tp_new', + tp_members='{"delegate", T_OBJECT, offsetof(ProxyObject, delegate), 0, NULL}', + mp_length='proxy_mp_length', + mp_subscript='proxy_mp_subscript', + mp_ass_subscript='proxy_mp_ass_subscript', + ) + + class PureSlotProxy: + def __init__(self, delegate): + self.delegate = delegate + + __len__ = DelegateSlot() + __getitem__ = DelegateSlot() + __setitem__ = DelegateSlot() + __delitem__ = DelegateSlot() + __contains__ = DelegateSlot() + + for obj in [NativeMpSlotProxy({'a': 1}), NativeMpSlotProxy(PureSlotProxy({'a': 1}))]: + assert len(obj) == 1 + assert bool(obj) + + assert obj['a'] == 1 + assert_raises(KeyError, operator.getitem, obj, 'b') + obj['b'] = 2 + assert get_delegate(obj) == {'a': 1, 'b': 2} + + assert_raises(KeyError, operator.delitem, obj, 'c') + del obj['b'] + assert get_delegate(obj) == {'a': 1} + del obj['a'] + assert not bool(obj) + + +def test_tp_iter_iternext_calls(): + NativeSlotProxy = CPyExtType( + name='TpIterSlotProxy', + cmembers='PyObject* delegate;', + code=r''' + typedef TpIterSlotProxyObject ProxyObject; + ''' + native_slot_proxy_template + r''' + static PyObject* proxy_tp_iter(PyObject* self) { + PyObject* delegate = get_delegate(self); + return Py_TYPE(delegate)->tp_iter(delegate); + } + static PyObject* proxy_tp_iternext(PyObject* self) { + PyObject* delegate = get_delegate(self); + return Py_TYPE(delegate)->tp_iternext(delegate); + } + ''', + tp_new='proxy_tp_new', + tp_members='{"delegate", T_OBJECT, offsetof(ProxyObject, delegate), 0, NULL}', + tp_iter='proxy_tp_iter', + tp_iternext='proxy_tp_iternext', + ) + + class PureSlotProxy: + def __init__(self, delegate): + self.delegate = delegate + + __iter__ = DelegateSlot() + __next__ = DelegateSlot() + + for obj in [NativeSlotProxy([1]), NativeSlotProxy(PureSlotProxy([1]))]: + assert isinstance(iter(obj), type(iter([]))) + + for obj in [NativeSlotProxy(iter([1])), NativeSlotProxy(PureSlotProxy(iter([1])))]: + assert next(obj) == 1 + assert_raises(StopIteration, next, obj) + + +def test_tp_iternext_not_implemented(): + class ManagedTypeWithVanishingNext: + def __next__(self): + del type(self).__next__ + return True + + NativeTypeWithVanishingNext = CPyExtHeapType( + name='TypeWithVanishingNext', + code=r''' + static PyObject* tp_iternext(TypeWithVanishingNextObject* self) { + if (PyObject_DelAttrString((PyObject*)Py_TYPE(self), "__next__") < 0) + return NULL; + Py_RETURN_TRUE; + } + ''', + slots=['{Py_tp_iternext, tp_iternext}'], + ) + + tester = CPyExtType( + 'IterableTester', + r''' + PyObject* iter_check(PyObject* unused, PyObject* obj) { + return PyBool_FromLong(PyIter_Check(obj)); + } + PyObject* not_impl_check(PyObject* unused, PyObject* obj) { + return PyBool_FromLong(Py_TYPE(obj)->tp_iternext == _PyObject_NextNotImplemented); + } + ''', + tp_methods=''' + {"PyIter_Check", iter_check, METH_O | METH_STATIC, ""}, + {"has_not_implemented_iternext", not_impl_check, METH_O | METH_STATIC, ""} + ''', + ) + + for TypeWithVanishingNext in (ManagedTypeWithVanishingNext, NativeTypeWithVanishingNext): + + class Iterable: + def __iter__(self): + return TypeWithVanishingNext() + + try: + # We need to use a builtin that stores the iterator inside without rechecking it + i = itertools.takewhile(lambda x: x, Iterable()) + assert next(i) is True + next(i) + except TypeError as e: + # We need to check the message, because it's not the one from `next`, but from _PyObject_NextNotImplemented + assert str(e).endswith("is not iterable") + else: + assert False + + i = TypeWithVanishingNext() + try: + next(i) + except TypeError as e: + # Different message, now from `next` directly + assert str(e).endswith("is not an iterator") + + assert not tester.PyIter_Check(i) + assert tester.has_not_implemented_iternext(i) + + NativeTypeWithNotImplementedNext = CPyExtHeapType( + name='TypeWithNotImplNext', + slots=['{Py_tp_iternext, _PyObject_NextNotImplemented}'], + ) + i = NativeTypeWithNotImplementedNext() + assert not tester.PyIter_Check(i) + assert tester.has_not_implemented_iternext(i) + try: + next(i) + except TypeError as e: + assert str(e).endswith("is not an iterator") + + +def test_tp_str_repr_calls(): + NativeSlotProxy = CPyExtType( + name='TpStrSlotProxy', + cmembers='PyObject* delegate;', + code=r''' + typedef TpStrSlotProxyObject ProxyObject; + ''' + native_slot_proxy_template + r''' + static PyObject* proxy_tp_str(PyObject* self) { + PyObject* delegate = get_delegate(self); + return Py_TYPE(delegate)->tp_str(delegate); + } + static PyObject* proxy_tp_repr(PyObject* self) { + PyObject* delegate = get_delegate(self); + return Py_TYPE(delegate)->tp_repr(delegate); + } + ''', + tp_new='proxy_tp_new', + tp_members='{"delegate", T_OBJECT, offsetof(ProxyObject, delegate), 0, NULL}', + tp_str='proxy_tp_str', + tp_repr='proxy_tp_repr', + ) + + class PureSlotProxy: + def __init__(self, delegate): + self.delegate = delegate + + __str__ = DelegateSlot() + __repr__ = DelegateSlot() + + for obj in [NativeSlotProxy("a\nb"), NativeSlotProxy(PureSlotProxy("a\nb"))]: + assert str(obj) == "a\nb" + assert repr(obj) == repr("a\nb") + + +def test_tp_init_calls(): + NativeSlotProxy = CPyExtType( + name='TpInitSlotProxy', + cmembers='PyObject* delegate;', + code=r''' + typedef TpInitSlotProxyObject ProxyObject; + ''' + native_slot_proxy_template + r''' + int proxy_tp_init(PyObject* self, PyObject* args, PyObject* kwargs) { + PyObject* delegate = get_delegate(self); + return Py_TYPE(delegate)->tp_init(delegate, args, kwargs); + } + ''', + tp_new='proxy_tp_new', + tp_members='{"delegate", T_OBJECT, offsetof(ProxyObject, delegate), 0, NULL}', + tp_init='proxy_tp_init', + ) + + class PureSlotProxy: + def __new__(cls, delegate): + self = object.__new__(cls) + self.delegate = delegate + return self + + def __init__(self, delegate, *args, **kwargs): + self.delegate.__init__(*args, **kwargs) + + obj = NativeSlotProxy([1]) + # Empty because list.__init__ will first clear the storage, which will also clear the argument + assert obj.delegate == [] + assert obj.__init__({2}) is None + assert obj.delegate == [2] + assert_raises(TypeError, NativeSlotProxy, ([1],), {'a': 1}) + + obj = NativeSlotProxy(PureSlotProxy([1])) + assert obj.delegate.delegate == [] + + +def test_tp_new_calls(): + TpNewTester = CPyExtType( + name='TpNewTester', + code=r''' + PyObject* call_tp_new(PyObject* ignored, PyObject* args, PyObject* kwargs) { + PyTypeObject* cls = (PyTypeObject*)PyTuple_GET_ITEM(args, 0); + args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args)); + if (!args) + return NULL; + PyObject* res = cls->tp_new(cls, args, kwargs); + Py_DECREF(args); + return res; + } + ''', + tp_methods='{"call_tp_new", (PyCFunction)call_tp_new, METH_VARARGS | METH_KEYWORDS | METH_STATIC, NULL}', + ) + assert TpNewTester.call_tp_new(str, 1) == "1" + assert TpNewTester.call_tp_new(str, 'skål'.encode('utf-8'), 'ascii', errors='replace') == "sk��l" + + +def test_disallow_instantiation(): + UninstantiableType = CPyExtType( + name='UninstantiableType', + tp_flags='Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION', + ) + assert_raises(TypeError, UninstantiableType) + + +def test_tp_call_calls(): + NativeSlotProxy = CPyExtType( + name='TpCallSlotProxy', + cmembers='PyObject* delegate;', + code=r''' + typedef TpCallSlotProxyObject ProxyObject; + ''' + native_slot_proxy_template + r''' + PyObject* proxy_tp_call(PyObject* self, PyObject* args, PyObject* kwargs) { + PyObject* delegate = get_delegate(self); + return Py_TYPE(delegate)->tp_call(delegate, args, kwargs); + } + ''', + tp_new='proxy_tp_new', + tp_members='{"delegate", T_OBJECT, offsetof(ProxyObject, delegate), 0, NULL}', + tp_call='proxy_tp_call', + ) + + class PureSlotProxy: + def __new__(cls, delegate): + self = object.__new__(cls) + self.delegate = delegate + return self + + def __call__(self, *args, **kwargs): + return self.delegate(*args, **kwargs) + + for obj in [NativeSlotProxy(len), PureSlotProxy(NativeSlotProxy(len))]: + assert obj([1, 2, 3]) == 3 + assert obj.__call__([1, 2, 3]) == 3 + assert_raises(TypeError, obj) + assert_raises(TypeError, obj, 1, 2) + assert_raises(TypeError, obj, obj=[]) + + for obj in [NativeSlotProxy(dict), PureSlotProxy(NativeSlotProxy(dict))]: + assert obj(a=1) == {'a': 1} + assert obj.__call__({'b': 2}, a=1) == {'a': 1, 'b': 2} + + +def test_richcmp(): + MyNativeIntSubType = CPyExtType("MyNativeIntSubTypeForRichCmpTest", + ready_code = "MyNativeIntSubTypeForRichCmpTestType.tp_new = PyLong_Type.tp_new;", + tp_base='&PyLong_Type', + struct_base='PyLongObject base;') + assert MyNativeIntSubType(42) == 42 + assert MyNativeIntSubType(42) == MyNativeIntSubType(42) + + RichCmpMockType = CPyExtType("RichCmpMock", + cmembers="int results[Py_GE+1];", + code=''' + static PyTypeObject RichCmpMockType; + + static PyObject* set_values(PyObject* self, PyObject* values) { + RichCmpMockObject* richCmp = (RichCmpMockObject*) self; + for (int i = 0; i <= Py_GE; i++) { + richCmp->results[i] = (int) PyLong_AsLong(PyTuple_GET_ITEM(values, i)); + } + Py_RETURN_NONE; + } + + static PyObject *custom_type_richcmp(PyObject *v, PyObject *w, int op) { + if (!PyObject_TypeCheck(v, &RichCmpMockType)) Py_RETURN_NOTIMPLEMENTED; + RichCmpMockObject* richCmp = (RichCmpMockObject*) v; + if (richCmp->results[op] == 0) { + Py_RETURN_FALSE; + } else if (richCmp->results[op] == 1) { + Py_RETURN_TRUE; + } else { + Py_RETURN_NOTIMPLEMENTED; + } + }; + ''', + tp_methods='{"set_values", (PyCFunction)set_values, METH_O, NULL}', + tp_richcompare='custom_type_richcmp') + + def create_mock(lt=-1, le=-1, eq=-1, ne=-1, gt=-1, ge=-1): + mock = RichCmpMockType() + mock.set_values(tuple([lt, le, eq, ne, gt, ge])) + return mock + + def expect_type_error(code): + try: + code() + except TypeError as e: + assert "not supported between instances " in str(e) + + def test_cmp(op_lambda, rop_lambda, op_name, rop_name): + assert op_lambda(create_mock(**{op_name: 1}), "whatever") + assert op_lambda(create_mock(**{op_name: 1}), create_mock(**{rop_name: 0, op_name: 0})) + assert not op_lambda(create_mock(**{op_name: 0}), "whatever") + expect_type_error(lambda: op_lambda(create_mock(), "whatever")) + + if rop_lambda: + assert rop_lambda("whatever", create_mock(**{op_name: 1})) + assert rop_lambda(create_mock(), create_mock(**{op_name: 1})) + assert not rop_lambda(create_mock(**{rop_name: 0}), create_mock(**{op_name: 1})) + + import operator + test_cmp(operator.lt, operator.gt, "lt", "gt") + test_cmp(operator.le, operator.ge, "le", "ge") + test_cmp(operator.gt, operator.lt, "gt", "lt") + test_cmp(operator.ge, operator.le, "ge", "le") + test_cmp(operator.eq, operator.ne, "eq", "ne") + test_cmp(operator.ne, None, "ne", "eq") + + test_cmp(lambda a,b: a.__lt__(b), lambda a,b: a.__gt__(b), "lt", "gt") + test_cmp(lambda a,b: a.__le__(b), lambda a,b: a.__ge__(b), "le", "ge") + test_cmp(lambda a,b: a.__gt__(b), lambda a,b: a.__lt__(b), "gt", "lt") + test_cmp(lambda a,b: a.__ge__(b), lambda a,b: a.__le__(b), "ge", "le") + test_cmp(lambda a,b: a.__eq__(b), lambda a,b: a.__ne__(b), "eq", "ne") + test_cmp(lambda a,b: a.__ne__(b), None, "ne", "eq") + + assert create_mock(ne=1) == create_mock(eq=1) + assert create_mock(ne=1, eq=0) != create_mock(ne=0, eq=1) + assert not create_mock(ne=1, eq=0) == create_mock(ne=0, eq=1) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_traceback.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_traceback.py index 15afbe5951..7d254c3f65 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_traceback.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_traceback.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -38,11 +38,12 @@ # SOFTWARE. import sys +import unittest from tests.cpyext import CPyExtType -class TestTraceback: +class TestTraceback(unittest.TestCase): def test_PyTraceBack_Here(self): Tester = CPyExtType( "TracebackTester1", diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_tuple.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_tuple.py index 3306d0cb89..8442ad72a9 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_tuple.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_tuple.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -41,8 +41,6 @@ from . import CPyExtTestCase, CPyExtFunction, CPyExtFunctionOutVars, unhandled_error_compare, CPyExtType, \ is_native_object -__dir__ = __file__.rpartition("/")[0] - def _reference_getslice(args): t = args[0] @@ -69,6 +67,13 @@ def _reference_setitem(args): return tuple(t) +def _reference_resize(args): + original = args[0] + newsize = args[1] + return original[:newsize] + (None,) * (newsize - len(original)) + return tuple(result) + + class MyStr(str): def __init__(self, s): @@ -153,14 +158,30 @@ class TestPyTuple(CPyExtTestCase): ((1, 2, 3), -1, []), ((1, 2, 3), 3, str), ), - code="""PyObject* wrap_PyTuple_SetItem(PyObject* original, Py_ssize_t index, PyObject* value) { + code=""" + PyObject* wrap_PyTuple_SetItem(PyObject* original, Py_ssize_t index, PyObject* value) { Py_ssize_t size = PyTuple_Size(original); if (size < 0) return NULL; PyObject* tuple = PyTuple_New(size); if (!tuple) return NULL; - for (int i = 0; i < size; i++) { + for (int i = 0; i < size / 2; i++) { + PyObject* item = PyTuple_GetItem(original, i); + if (!item) { + Py_DECREF(tuple); + return NULL; + } + Py_INCREF(item); + PyTuple_SET_ITEM(tuple, i, item); + } + + #ifdef GRAALVM_PYTHON + // test that we also have it as API function on GraalPy + #undef PyTuple_SET_ITEM + #endif + + for (int i = size / 2; i < size; i++) { PyObject* item = PyTuple_GetItem(original, i); if (!item) { Py_DECREF(tuple); @@ -169,6 +190,7 @@ class TestPyTuple(CPyExtTestCase): Py_INCREF(item); PyTuple_SET_ITEM(tuple, i, item); } + Py_INCREF(value); if (PyTuple_SetItem(tuple, index, value) < 0) { Py_DECREF(tuple); @@ -244,6 +266,35 @@ class TestPyTuple(CPyExtTestCase): cmpfunc=unhandled_error_compare ) + # _PyTuple_Resize + test_PyTuple_Resize = CPyExtFunction( + _reference_resize, + lambda: ( + ((1, 2, 3), 1), + ((), 1), + ((1, 2, 3), 5), + ), + code=""" + PyObject* wrap_PyTuple_Resize(PyObject* original, int newsize) { + int size = PyTuple_Size(original); + PyObject *freshTuple = PyTuple_New(size); + for (int i = 0; i < size; ++i) { + PyTuple_SET_ITEM(freshTuple, i, Py_NewRef(PyTuple_GetItem(original, i))); + } + _PyTuple_Resize(&freshTuple, newsize); + for (int i = size; i < newsize; i++) { + PyTuple_SET_ITEM(freshTuple, i, Py_NewRef(Py_None)); + } + return freshTuple; + } + """, + resultspec="O", + argspec='Oi', + arguments=["PyObject* original", "Py_ssize_t newsize"], + callfunction="wrap_PyTuple_Resize", + cmpfunc=unhandled_error_compare, + ) + class TestNativeSubclass(unittest.TestCase): def _verify(self, t): @@ -275,4 +326,4 @@ class ManagedSubclass(TupleSubclass): t = ManagedSubclass(1, 2, 3) assert is_native_object(t) assert type(t) == ManagedSubclass - self._verify(t) \ No newline at end of file + self._verify(t) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_unicode.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_unicode.py index 759f70817e..1d2c98c134 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_unicode.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_unicode.py @@ -40,12 +40,11 @@ import locale import re import sys +import unittest from . import CPyExtType, CPyExtTestCase, CPyExtFunction, unhandled_error_compare, GRAALPYTHON, CPyExtFunctionOutVars, \ is_native_object -__dir__ = __file__.rpartition("/")[0] - def _reference_fromobject(args): if isinstance(args[0], str): @@ -466,6 +465,7 @@ class TestPyUnicode(CPyExtTestCase): _reference_intern, gen_intern_args, code="""PyObject* wrap_PyUnicode_InternInPlace(PyObject* s) { + Py_INCREF(s); // We must own the argument to PyUnicode_InternInPlace PyObject *result = s; PyUnicode_InternInPlace(&result); return result; @@ -946,6 +946,19 @@ class TestPyUnicode(CPyExtTestCase): cmpfunc=unhandled_error_compare ) + test_PyUnicode_EncodeLocale = CPyExtFunction( + # We don't want to make tests dependent on the current locale, so just test that ascii works + lambda args: args[0].encode('ascii', args[1]), + lambda: ( + ("hello", "strict"), + (UnicodeSubclass("asdf"), "strict"), + ), + resultspec="O", + argspec='Os', + arguments=["PyObject* str", "const char* errors"], + cmpfunc=unhandled_error_compare + ) + test_PyUnicode_AsUnicodeEscapeString = CPyExtFunction( _reference_as_unicode_escape_string, lambda: ( @@ -1132,8 +1145,18 @@ class TestPyUnicode(CPyExtTestCase): cmpfunc=unhandled_error_compare, ) + test_PyUnicodeDecodeError_Create = CPyExtFunction( + lambda args: UnicodeDecodeError(*args), + lambda: ( + ("utf-8", b"asdf", 1, 2, "some reason"), + ), + resultspec="O", + argspec="sy#nns", + arguments=["const char* encoding", "const char* object", "Py_ssize_t length", "Py_ssize_t start", "Py_ssize_t end", "const char* reason"] + ) + -class TestUnicodeObject(object): +class TestUnicodeObject(unittest.TestCase): def test_intern(self): TestIntern = CPyExtType( "TestIntern", @@ -1168,7 +1191,7 @@ def test_intern(self): assert tester.check_is_same_str_ptr(s2) -class TestNativeUnicodeSubclass: +class TestNativeUnicodeSubclass(unittest.TestCase): def test_builtins(self): s = UnicodeSubclass("asdf") assert is_native_object(s) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_weakref.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_weakref.py index 564ed51c11..a4ffb3f1bc 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_weakref.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_weakref.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -37,12 +37,12 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -import sys +import gc +import time +import unittest import weakref -from . import CPyExtType, CPyExtTestCase, CPyExtFunction, GRAALPYTHON, unhandled_error_compare, assert_raises - -__dir__ = __file__.rpartition("/")[0] +from . import CPyExtFunction, CPyExtType, assert_raises TestWeakRefHelper = CPyExtType( 'TestWeakRefHelper', @@ -63,7 +63,7 @@ ) helper = TestWeakRefHelper() -class TestWeakRef(object): +class TestWeakRef(unittest.TestCase): def test_simple(self): class Foo: @@ -97,3 +97,47 @@ class Bar(clazz): x = Bar() y = weakref.ref(x) assert type(y) == weakref.ReferenceType + + def clear_ref_arguments(): + class Foo(): + pass + f = Foo() + log = [] + wr = weakref.ref(f, lambda wr: log.append("cb called")) + return ((f, wr, log),) + + def clear_ref_equivalent(args): + # Ignore args. There is no clearref in python, so + # the equivalent is a weakref that never had a callback + # in the first place + class Foo(): + pass + f = Foo() + return weakref.ref(f), [] + + def compare_cleared_weakref(cresult, presult): + cwr, clog = cresult + pwr, plog = presult + for i in range(3): + gc.collect() + time.sleep(1) + assert cwr() is None + assert pwr() is None + assert not clog + assert not plog + return True + + test_PyWeakref_ClearRef = CPyExtFunction( + clear_ref_equivalent, + clear_ref_arguments, + code=""" + PyObject* wrap_PyWeakref_ClearRef(PyObject *o, PyObject* weakref, PyObject* log) { + _PyWeakref_ClearRef((PyWeakReference *)weakref); + return Py_BuildValue("OO", weakref, log); + } + """, + argspec='OOO', + arguments=["PyObject* o", "PyObject* weakref", "PyObject* log"], + callfunction="wrap_PyWeakref_ClearRef", + cmpfunc=compare_cleared_weakref, + ) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/list_tests.py b/graalpython/com.oracle.graal.python.test/src/tests/list_tests.py index d549c8e4f2..70011322a4 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/list_tests.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/list_tests.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Copyright (c) 2018, 2024, Oracle and/or its affiliates. # Copyright (C) 1996-2017 Python Software Foundation # # Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -7,10 +7,10 @@ """ import sys -import os from functools import cmp_to_key -import seq_tests -#from test import support + +from tests import seq_tests + class CommonTest(seq_tests.CommonTest): diff --git a/graalpython/com.oracle.graal.python.test/src/tests/run_cpython_test.py b/graalpython/com.oracle.graal.python.test/src/tests/run_cpython_test.py deleted file mode 100644 index 079f041cbb..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/tests/run_cpython_test.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# The Universal Permissive License (UPL), Version 1.0 -# -# Subject to the condition set forth below, permission is hereby granted to any -# person obtaining a copy of this software, associated documentation and/or -# data (collectively the "Software"), free of charge and under any and all -# copyright rights in the Software, and any and all patent rights owned or -# freely licensable by each licensor hereunder covering either (i) the -# unmodified Software as contributed to or provided by such licensor, or (ii) -# the Larger Works (as defined below), to deal in both -# -# (a) the Software, and -# -# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if -# one is included with the Software each a "Larger Work" to which the Software -# is contributed by such licensors), -# -# without restriction, including without limitation the rights to copy, create -# derivative works of, display, perform, and distribute the Software and make, -# use, sell, offer for sale, import, export, have made, and have sold the -# Software and the Larger Work(s), and to sublicense the foregoing rights on -# either these or other terms. -# -# This license is subject to the following condition: -# -# The above copyright notice and either this complete permission notice or at a -# minimum a reference to the UPL must be included in all copies or substantial -# portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -import os -import sys -import unittest - -sys.path.insert(0, os.getcwd()) - - -class TestLoader(unittest.TestLoader): - - def loadTestsFromModule(self, module, pattern=None): - suite = super().loadTestsFromModule(module, pattern=pattern) - return suite - - -# We would normmally just pass the loader to the main, but there are tests for the framework itself (test_unittest) -# that interact weirdly with non-default loaders -if __name__ == '__main__': - unittest.defaultTestLoader = TestLoader() - unittest.main(module=None, testLoader=unittest.defaultTestLoader) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/check_home_pom.xml b/graalpython/com.oracle.graal.python.test/src/tests/standalone/check_home_pom.xml index 37b5a27ec3..b8ae79cddc 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/standalone/check_home_pom.xml +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/check_home_pom.xml @@ -72,14 +72,14 @@ SOFTWARE. ${env.GRAALPY_VERSION} - - - process-graalpy-resources + + + diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/check_packages_pom.xml b/graalpython/com.oracle.graal.python.test/src/tests/standalone/check_packages_pom.xml index fd3468edcc..9e380b16be 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/standalone/check_packages_pom.xml +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/check_packages_pom.xml @@ -72,16 +72,16 @@ SOFTWARE. ${env.GRAALPY_VERSION} - - - - - process-graalpy-resources + + + + + diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/check_plugin_configuration.xml b/graalpython/com.oracle.graal.python.test/src/tests/standalone/check_plugin_configuration.xml new file mode 100644 index 0000000000..90d0557729 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/check_plugin_configuration.xml @@ -0,0 +1,88 @@ + + + + 4.0.0 + + org.apache.maven.plugin.my.unit + project-check-packages + 1.0-SNAPSHOT + jar + Test MyMojo + + + + org.graalvm.polyglot + python-community + ${env.GRAALPY_VERSION} + pom + + + org.graalvm.python + python-launcher + ${env.GRAALPY_VERSION} + + + + + + + org.graalvm.python + graalpy-maven-plugin + ${env.GRAALPY_VERSION} + + + + process-graalpy-resources + + + + termcolor + + + + + + + + diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/gradle/build/build.gradle b/graalpython/com.oracle.graal.python.test/src/tests/standalone/gradle/build/build.gradle index ac804e7fcb..c9b31ffe75 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/standalone/gradle/build/build.gradle +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/gradle/build/build.gradle @@ -1,6 +1,6 @@ plugins { id "application" - id 'org.graalvm.python' version '24.2.0' + id 'org.graalvm.python' version '25.0.0' id "org.graalvm.buildtools.native" version "0.10.2" } @@ -12,10 +12,6 @@ application { mainClass = "org.example.GraalPy" } -dependencies { - implementation("org.graalvm.python:python-community:24.2.0") -} - run { enableAssertions = true } diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/gradle/build/build.gradle.kts b/graalpython/com.oracle.graal.python.test/src/tests/standalone/gradle/build/build.gradle.kts index 119e1482b1..ee72dfe3de 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/standalone/gradle/build/build.gradle.kts +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/gradle/build/build.gradle.kts @@ -1,6 +1,6 @@ plugins { application - id("org.graalvm.python") version "24.2.0" + id("org.graalvm.python") version "25.0.0" id("org.graalvm.buildtools.native") version "0.10.2" } @@ -17,6 +17,3 @@ val r = tasks.run.get() r.enableAssertions = true r.outputs.upToDateWhen {false} -dependencies { - implementation("org.graalvm.python:python-community:24.2.0") -} diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/gradle/gradle-test-project/gradle.properties b/graalpython/com.oracle.graal.python.test/src/tests/standalone/gradle/gradle-test-project/gradle.properties new file mode 100644 index 0000000000..aa2e5b1235 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/gradle/gradle-test-project/gradle.properties @@ -0,0 +1,2 @@ +# the jdk used to run the gradle demon has to be <= 22 +org.gradle.java.home={GRADLE_JAVA_HOME} \ No newline at end of file diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/gradle/gradle-test-project/src/main/java/org/example/GraalPy.j b/graalpython/com.oracle.graal.python.test/src/tests/standalone/gradle/gradle-test-project/src/main/java/org/example/GraalPy.j index 6b778e2804..77fb53af19 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/standalone/gradle/gradle-test-project/src/main/java/org/example/GraalPy.j +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/gradle/gradle-test-project/src/main/java/org/example/GraalPy.j @@ -46,7 +46,7 @@ import org.graalvm.polyglot.Source; import org.graalvm.polyglot.Value; import java.io.IOException; -import org.graalvm.python.embedding.utils.GraalPyResources; +import org.graalvm.python.embedding.GraalPyResources; public class GraalPy { private static final String PYTHON = "python"; diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/jbang/EmptyPIPComments.j b/graalpython/com.oracle.graal.python.test/src/tests/standalone/jbang/EmptyPIPComments.j new file mode 100644 index 0000000000..098695dccb --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/jbang/EmptyPIPComments.j @@ -0,0 +1,13 @@ +///usr/bin/env jbang "$0" "$@" ; exit $? + +//DEPS org.graalvm.python:jbang:${env.GRAALPY_VERSION:25.0.0} +//PIP +// one blank after PIP +//PIP +// three blanks after PIP +//PIP + +public class EmptyPIPComments { + public static void main(String[] args) { + } +} \ No newline at end of file diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/jbang/EmptyPythonResourceComment.j b/graalpython/com.oracle.graal.python.test/src/tests/standalone/jbang/EmptyPythonResourceComment.j new file mode 100644 index 0000000000..89f5758c5e --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/jbang/EmptyPythonResourceComment.j @@ -0,0 +1,9 @@ +///usr/bin/env jbang "$0" "$@" ; exit $? + +//DEPS org.graalvm.python:jbang:${env.GRAALPY_VERSION:25.0.0} +//PYTHON_RESOURCES_DIRECTORY + +public class EmptyPythonResourceComment { + public static void main(String[] args) { + } +} \ No newline at end of file diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/jbang/EmptyPythonResourceCommentWithBlanks.j b/graalpython/com.oracle.graal.python.test/src/tests/standalone/jbang/EmptyPythonResourceCommentWithBlanks.j new file mode 100644 index 0000000000..fcb93bdc33 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/jbang/EmptyPythonResourceCommentWithBlanks.j @@ -0,0 +1,10 @@ +///usr/bin/env jbang "$0" "$@" ; exit $? + +//DEPS org.graalvm.python:jbang:${env.GRAALPY_VERSION:25.0.0} +// resource dir with blanks +//PYTHON_RESOURCES_DIRECTORY + +public class EmptyPythonResourceCommentWithBlanks { + public static void main(String[] args) { + } +} \ No newline at end of file diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/jbang/NoPackagesResourcesDir.j b/graalpython/com.oracle.graal.python.test/src/tests/standalone/jbang/NoPackagesResourcesDir.j new file mode 100644 index 0000000000..c2255aca6c --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/jbang/NoPackagesResourcesDir.j @@ -0,0 +1,9 @@ +///usr/bin/env jbang "$0" "$@" ; exit $? + +//DEPS org.graalvm.python:jbang:${env.GRAALPY_VERSION:25.0.0} +//PYTHON_RESOURCES_DIRECTORY python-resources + +public class NoPackagesResourcesDir { + public static void main(String[] args) { + } +} \ No newline at end of file diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/jbang/TwoPythonResourceComments.j b/graalpython/com.oracle.graal.python.test/src/tests/standalone/jbang/TwoPythonResourceComments.j new file mode 100644 index 0000000000..3bd4381f51 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/jbang/TwoPythonResourceComments.j @@ -0,0 +1,10 @@ +///usr/bin/env jbang "$0" "$@" ; exit $? + +//DEPS org.graalvm.python:jbang:${env.GRAALPY_VERSION:25.0.0} +//PYTHON_RESOURCES_DIRECTORY +//PYTHON_RESOURCES_DIRECTORY + +public class TwoPythonResourceComments { + public static void main(String[] args) { + } +} \ No newline at end of file diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/merged_vfs_ujson_pom.xml b/graalpython/com.oracle.graal.python.test/src/tests/standalone/merged_vfs_ujson_pom.xml new file mode 100644 index 0000000000..c45ba8b6f4 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/merged_vfs_ujson_pom.xml @@ -0,0 +1,128 @@ + + + + 4.0.0 + + org.graalvm.python.tests + app2 + 1.0-SNAPSHOT + jar + Test MyMojo + + + + junit + junit + 3.8.1 + test + + + org.graalvm.python + python-community + ${env.GRAALPY_VERSION} + pom + + + org.graalvm.python + python-embedding + ${env.GRAALPY_VERSION} + + + org.graalvm.python.tests + app1 + 1.0-SNAPSHOT + + + + + + + org.graalvm.python + graalpy-maven-plugin + ${env.GRAALPY_VERSION} + + + + process-graalpy-resources + + + + + + ujson==5.10.0 + + + + + + + + + native + + + + org.graalvm.buildtools + native-maven-plugin + 0.9.28 + true + + + build-native + + compile-no-fork + + package + + + + false + app2.GraalPy + + + + + + + diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/namespaced_venv.xml b/graalpython/com.oracle.graal.python.test/src/tests/standalone/namespaced_venv.xml new file mode 100644 index 0000000000..a2f2da594f --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/namespaced_venv.xml @@ -0,0 +1,95 @@ + + + + 4.0.0 + + org.graalvm.python.tests + app1 + 1.0-SNAPSHOT + jar + Test MyMojo + + + + junit + junit + 3.8.1 + test + + + org.graalvm.python + python-community + ${env.GRAALPY_VERSION} + pom + + + org.graalvm.python + python-embedding + ${env.GRAALPY_VERSION} + + + + + + + org.graalvm.python + graalpy-maven-plugin + ${env.GRAALPY_VERSION} + + + + process-graalpy-resources + + + + + GRAALPY-VFS/${project.groupId}/${project.artifactId} + + termcolor + + + + + + diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/namespaced_venv_user.xml b/graalpython/com.oracle.graal.python.test/src/tests/standalone/namespaced_venv_user.xml new file mode 100644 index 0000000000..01426f0457 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/namespaced_venv_user.xml @@ -0,0 +1,126 @@ + + + + 4.0.0 + + org.graalvm.python.tests + app2 + 1.0-SNAPSHOT + jar + Test MyMojo + + + + junit + junit + 3.8.1 + test + + + org.graalvm.python + python-community + ${env.GRAALPY_VERSION} + pom + + + org.graalvm.python + python-embedding + ${env.GRAALPY_VERSION} + + + org.graalvm.python.tests + app1 + 1.0-SNAPSHOT + + + + + + org.graalvm.python + graalpy-maven-plugin + ${env.GRAALPY_VERSION} + + + + process-graalpy-resources + + + + + + termcolor + + + + + + + + native + + + + org.graalvm.buildtools + native-maven-plugin + 0.9.28 + true + + + build-native + + compile-no-fork + + package + + + + false + app2.GraalPy + + + + + + + diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/native-image.properties b/graalpython/com.oracle.graal.python.test/src/tests/standalone/native-image.properties new file mode 100644 index 0000000000..65092f3e54 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/native-image.properties @@ -0,0 +1,3 @@ +# some test gates have only 16Gb and +# native image then allocates only 8Gb which isn't enough +Args = -J-Xms12g \ No newline at end of file diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/prepare_venv_old_ujson_pom.xml b/graalpython/com.oracle.graal.python.test/src/tests/standalone/prepare_venv_old_ujson_pom.xml new file mode 100644 index 0000000000..0d134ae7fb --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/prepare_venv_old_ujson_pom.xml @@ -0,0 +1,95 @@ + + + + 4.0.0 + + org.graalvm.python.tests + app1 + 1.0-SNAPSHOT + jar + Test MyMojo + + + + junit + junit + 3.8.1 + test + + + org.graalvm.python + python-community + ${env.GRAALPY_VERSION} + pom + + + org.graalvm.python + python-embedding + ${env.GRAALPY_VERSION} + + + + + + + org.graalvm.python + graalpy-maven-plugin + ${env.GRAALPY_VERSION} + + + + process-graalpy-resources + + + + + + ujson==5.9.0 + termcolor + + + + + + diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/prepare_venv_termcolor_pom.xml b/graalpython/com.oracle.graal.python.test/src/tests/standalone/prepare_venv_termcolor_pom.xml new file mode 100644 index 0000000000..57e479b69d --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/prepare_venv_termcolor_pom.xml @@ -0,0 +1,94 @@ + + + + 4.0.0 + + org.graalvm.python.tests + app1 + 1.0-SNAPSHOT + jar + Test MyMojo + + + + junit + junit + 3.8.1 + test + + + org.graalvm.python + python-community + ${env.GRAALPY_VERSION} + pom + + + org.graalvm.python + python-embedding + ${env.GRAALPY_VERSION} + + + + + + + org.graalvm.python + graalpy-maven-plugin + ${env.GRAALPY_VERSION} + + + + process-graalpy-resources + + + + + + termcolor + + + + + + diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/test_gradle_plugin.py b/graalpython/com.oracle.graal.python.test/src/tests/standalone/test_gradle_plugin.py new file mode 100644 index 0000000000..be30a2d94b --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/test_gradle_plugin.py @@ -0,0 +1,938 @@ +# Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# The Universal Permissive License (UPL), Version 1.0 +# +# Subject to the condition set forth below, permission is hereby granted to any +# person obtaining a copy of this software, associated documentation and/or +# data (collectively the "Software"), free of charge and under any and all +# copyright rights in the Software, and any and all patent rights owned or +# freely licensable by each licensor hereunder covering either (i) the +# unmodified Software as contributed to or provided by such licensor, or (ii) +# the Larger Works (as defined below), to deal in both +# +# (a) the Software, and +# +# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +# one is included with the Software each a "Larger Work" to which the Software +# is contributed by such licensors), +# +# without restriction, including without limitation the rights to copy, create +# derivative works of, display, perform, and distribute the Software and make, +# use, sell, offer for sale, import, export, have made, and have sold the +# Software and the Larger Work(s), and to sublicense the foregoing rights on +# either these or other terms. +# +# This license is subject to the following condition: +# +# The above copyright notice and either this complete permission notice or at a +# minimum a reference to the UPL must be included in all copies or substantial +# portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import os +import shutil +import sys +import textwrap +import unittest + +from tests.standalone import util +from tests.standalone.util import TemporaryTestDirectory, Logger + +MISSING_FILE_WARNING = "The list of installed Python packages does not match the packages specified in the graalpy-maven-plugin configuration" +PACKAGES_CHANGED_ERROR = "packages and their version constraints in graalpy-maven-plugin configuration are different then previously used to generate the lock file" +VENV_UPTODATE = "Virtual environment is up to date with lock file, skipping install" + +def append(file, txt): + with open(file, "a") as f: + f.write(txt) + +def _community_as_property(community): + return 'community = true' if community else '' + +class GradlePluginTestBase(util.BuildToolTestBase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.test_prj_path = os.path.join(os.path.dirname(__file__), "gradle", "gradle-test-project") + + def target_dir_name_sufix(self, target_dir): + pass + + def copy_build_files(self, target_dir): + pass + + def empty_plugin(self, community): + pass + + def packages_termcolor(self, community): + pass + + def packages_termcolor_ujson(self, community): + pass + + def packages_termcolor_resource_dir(self, resources_dir): + pass + + def graalpy_python_home_includes(self, community): + pass + + def empty_packages(self): + pass + + def native_image_with_include(self): + pass + + def native_image_with_bogus_include(self): + pass + + def native_image_with_exlude_email(self): + pass + + def lock_packages_config(self, community, pkgs, lock_file): + pass + + def generate_app(self, target_dir): + shutil.copytree(self.test_prj_path, target_dir) + for root, dirs, files in os.walk(target_dir): + for file in files: + if file.endswith(".j"): + shutil.move(os.path.join(root, file), os.path.join(root, file[0:len(file)- 1] + "java")) + + util.override_gradle_properties_file(target_dir) + self.copy_build_files(target_dir) + + # at the moment the gradle demon does not run with jdk <= 22 + gradle_java_home = self.env.get("GRADLE_JAVA_HOME") + assert gradle_java_home, "in order to run standalone gradle tests, the 'GRADLE_JAVA_HOME' env var has to be set to a jdk <= 22" + util.replace_in_file(os.path.join(target_dir, "gradle.properties"), "{GRADLE_JAVA_HOME}", gradle_java_home.replace("\\", "\\\\")) + + meta_inf_native_image_dir = os.path.join(target_dir, "src", "main", "resources", "META-INF", "native-image") + os.makedirs(meta_inf_native_image_dir, exist_ok=True) + shutil.copy(os.path.join(os.path.dirname(__file__), "native-image.properties"), os.path.join(meta_inf_native_image_dir, "native-image.properties")) + + def check_filelist(self, target_dir, log): + fl_path = os.path.join(target_dir, "build", "resources", "main", util.DEFAULT_VFS_PREFIX, "fileslist.txt") + with open(fl_path) as f: + lines = f.readlines() + + log.log_block("filelist.txt", ''.join(lines)) + assert "/" + util.DEFAULT_VFS_PREFIX + "/\n" in lines, log + + def check_gradle_generated_app(self, community): + with TemporaryTestDirectory() as tmpdir: + target_dir = os.path.join(str(tmpdir), "generated_app_gradle" + self.target_dir_name_sufix()) + self.generate_app(target_dir) + build_file = os.path.join(target_dir, self.build_file_name) + append(build_file, self.packages_termcolor(community)) + + log = Logger() + + # build + gradlew_cmd = util.get_gradle_wrapper(target_dir, self.env, verbose=False) + + cmd = gradlew_cmd + ["build"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, logger=log) + util.check_ouput("BUILD SUCCESS", out, logger=log) + util.check_ouput("Virtual filesystem is deployed to default resources directory", out, logger=log) + util.check_ouput("This can cause conflicts if used with other Java libraries that also deploy GraalPy virtual filesystem", out, logger=log) + self.check_filelist(target_dir, log) + + gradlew_cmd = util.get_gradle_wrapper(target_dir, self.env) + + cmd = gradlew_cmd + ["nativeCompile"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, logger=log) + util.check_ouput("BUILD SUCCESS", out, logger=log) + self.check_filelist(target_dir, log) + + # execute and check native image + cmd = [os.path.join(target_dir, "build", "native", "nativeCompile", "graalpy-gradle-test-project")] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, logger=log) + util.check_ouput("hello java", out, logger=log) + self.check_filelist(target_dir, log) + + # import struct from python file triggers extract of native extension files in VirtualFileSystem + hello_src = os.path.join(target_dir, "src", "main", "resources", "org.graalvm.python.vfs", "src", "hello.py") + with open(hello_src) as f: + contents = f.read() + with open(hello_src, 'w') as f: + f.write("import struct\n" + contents) + + # rebuild and exec + cmd = gradlew_cmd + ["build", "run"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, logger=log) + util.check_ouput("BUILD SUCCESS", out, logger=log) + util.check_ouput("hello java", out, logger=log) + self.check_filelist(target_dir, log) + + #GR-51132 - NoClassDefFoundError when running polyglot app in java mode + util.check_ouput("java.lang.NoClassDefFoundError", out, False, logger=log) + + # move app to another folder + # this will break launcher symlinks, but should be able to recover from that + target_dir2 = os.path.join(str(tmpdir), "generated_app_gradle.2" + self.target_dir_name_sufix()) + os.rename(target_dir, target_dir2) + # adding new dep triggers launcher without venv regen + self.copy_build_files(target_dir2) + build_file2 = os.path.join(target_dir2, self.build_file_name) + append(build_file2, self.packages_termcolor_ujson(community)) + + gradlew_cmd2 = util.get_gradle_wrapper(target_dir2, self.env) + cmd = gradlew_cmd2 + ["build", "run"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir2, logger=log) + util.check_ouput("BUILD SUCCESS", out, logger=log) + util.check_ouput("hello java", out, logger=log) + self.check_filelist(target_dir2, log) + + @unittest.skipUnless(util.is_maven_plugin_test_enabled, "ENABLE_MAVEN_PLUGIN_UNITTESTS is not true") + def check_lock_packages(self, community): + with util.TemporaryTestDirectory() as tmpdir: + + target_dir = os.path.join(str(tmpdir), "lock_packages" + self.target_dir_name_sufix()) + self.generate_app(target_dir) + build_file = os.path.join(target_dir, self.build_file_name) + + gradlew_cmd = util.get_gradle_wrapper(target_dir, self.env) + + # start with requests package without version + append(build_file, self.lock_packages_config(pkgs=["requests"], lock_file="test-graalpy.lock", community=True)) + + # build + cmd = gradlew_cmd + ["build"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("pip install", out) + util.check_ouput("BUILD SUCCESS", out) + util.check_ouput(MISSING_FILE_WARNING, out, contains=True) + assert not os.path.exists(os.path.join(target_dir, "test-graalpy.lock")) + + # lock without version + cmd = gradlew_cmd + ["graalpyLockPackages"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out, contains=True) + util.check_ouput(MISSING_FILE_WARNING, out, contains=False) + assert os.path.exists(os.path.join(target_dir, "test-graalpy.lock")) + os.remove(os.path.join(target_dir, "test-graalpy.lock")) + + # lock with correct version + log = Logger() + self.copy_build_files(target_dir) + append(build_file, self.lock_packages_config(pkgs=["requests==2.32.3"], lock_file="test-graalpy.lock", community=True)) + cmd = gradlew_cmd + ["graalpyLockPackages"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out, contains=True) + util.check_ouput(MISSING_FILE_WARNING, out, contains=False) + assert os.path.exists(os.path.join(target_dir, "test-graalpy.lock")) + + # add termcolor and build - fails as it is not part of lock file + log = Logger() + self.copy_build_files(target_dir) + append(build_file, self.lock_packages_config(pkgs=["requests==2.32.3", "termcolor==2.2"], lock_file="test-graalpy.lock", community=True)) + cmd = gradlew_cmd + ["build"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out, contains=False) + util.check_ouput(PACKAGES_CHANGED_ERROR, out) + util.check_ouput(MISSING_FILE_WARNING, out, contains=False) + assert os.path.exists(os.path.join(target_dir, "test-graalpy.lock")) + + # lock with termcolor + log = Logger() + cmd = gradlew_cmd + ["graalpyLockPackages"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out, contains=True) + util.check_ouput(MISSING_FILE_WARNING, out, contains=False) + assert os.path.exists(os.path.join(target_dir, "test-graalpy.lock")) + + # should be able to import requests if installed + util.replace_in_file(os.path.join(target_dir, "src", "main", "java", "org", "example", "GraalPy.java"), + "import hello", + "import requests; import hello") + + # rebuild with lock and exec + cmd = gradlew_cmd + ["build", "run"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out) + util.check_ouput(VENV_UPTODATE, out) + util.check_ouput("hello java", out) + util.check_ouput(MISSING_FILE_WARNING, out, contains=False) + + # run with no packages, only lock file + self.copy_build_files(target_dir) + append(build_file, self.empty_packages()) + + # stop using lock file field and test with default value {project_root}/graalpy.lock + shutil.move(os.path.join(target_dir, "test-graalpy.lock"), os.path.join(target_dir, "graalpy.lock")) + + # clean and rebuild fails + cmd = gradlew_cmd + ["clean", "build", "run"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out, contains=False) + util.check_ouput(MISSING_FILE_WARNING, out, contains=False) + + def check_gradle_generated_app_external_resources(self): + with TemporaryTestDirectory() as tmpdir: + target_dir = os.path.join(str(tmpdir), "generated_gradle_app_external_resources" + self.target_dir_name_sufix()) + self.generate_app(target_dir) + build_file = os.path.join(target_dir, self.build_file_name) + + # patch project to use external directory for resources + resources_dir = os.path.join(target_dir, "python-resources") + os.makedirs(resources_dir, exist_ok=True) + src_dir = os.path.join(resources_dir, "src") + os.makedirs(src_dir, exist_ok=True) + # copy hello.py + shutil.copyfile(os.path.join(target_dir, "src", "main", "resources", "org.graalvm.python.vfs", "src", "hello.py"), os.path.join(src_dir, "hello.py")) + # remove all resources, we also want to check if the gradle plugin can deal with no user resources + shutil.rmtree(os.path.join(target_dir, "src", "main", "resources")) + # patch GraalPy.java + util.replace_in_file(os.path.join(target_dir, "src", "main", "java", "org", "example", "GraalPy.java"), + "package org.example;", + "package org.example;\nimport java.nio.file.Path;") + util.replace_in_file(os.path.join(target_dir, "src", "main", "java", "org", "example", "GraalPy.java"), + "GraalPyResources.createContext()", + "GraalPyResources.contextBuilder(Path.of(\"" + (resources_dir if "win32" != sys.platform else resources_dir.replace("\\", "\\\\")) + "\")).build()") + + # patch build.gradle + append(build_file, self.packages_termcolor_resource_dir(resources_dir)) + + # build + gradle_cmd = util.get_gradle_wrapper(target_dir, self.env) + + cmd = gradle_cmd + ["clean", "build"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out) + + # check java exec + cmd = gradle_cmd + ["run"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("hello java", out) + + # prepare for native build + meta_inf = os.path.join(target_dir, "src", "main", "resources", "META-INF", "native-image") + os.makedirs(meta_inf, exist_ok=True) + shutil.copyfile(os.path.join(self.test_prj_path, "src", "main", "resources", "META-INF", "native-image", "proxy-config.json"), os.path.join(meta_inf, "proxy-config.json")) + + cmd = gradle_cmd + ["nativeCompile"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out) + + # execute and check native image + cmd = [os.path.join(target_dir, "build", "native", "nativeCompile", "graalpy-gradle-test-project")] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("hello java", out) + + def check_gradle_fail_with_mismatching_graalpy_dep(self): + pass # TODO: once the CI job builds enterprise + + def check_tagfile(self, home, expected, log=''): + with open(os.path.join(home, "tagfile")) as f: + lines = f.readlines() + assert lines == expected, "expected tagfile " + str(expected) + ", but got " + str(lines) + log + + def check_gradle_check_home_warning(self, community): + with TemporaryTestDirectory() as tmpdir: + target_dir = os.path.join(str(tmpdir), "check_home_test_warning" + self.target_dir_name_sufix()) + self.generate_app(target_dir) + + build_file = os.path.join(target_dir, self.build_file_name) + + gradle_cmd = util.get_gradle_wrapper(target_dir, self.env) + process_resources_cmd = gradle_cmd + ["--stacktrace", "graalPyInstallPackages"] + + # 1. process-resources with no pythonHome config - no warning printed + log = Logger() + append(build_file, self.empty_plugin(community)) + out, return_code = util.run_cmd(process_resources_cmd, self.env, cwd=target_dir, logger=log) + util.check_ouput("BUILD SUCCESS", out, logger=log) + util.check_ouput("the python language home is always available", out, contains=False, logger=log) + + # 2. process-resources with pythonHome includes and excludes - warning printed + log = Logger() + self.copy_build_files(target_dir) + append(build_file, self.graalpy_python_home_includes(community)) + out, return_code = util.run_cmd(process_resources_cmd, self.env, cwd=target_dir, logger=log) + util.check_ouput("BUILD SUCCESS", out, logger=log) + util.check_ouput("the python language home is always available", out, contains=True, logger=log) + + def check_gradle_check_home(self, community): + with TemporaryTestDirectory() as tmpdir: + target_dir = os.path.join(str(tmpdir), "check_home_test" + self.target_dir_name_sufix()) + self.generate_app(target_dir) + build_file = os.path.join(target_dir, self.build_file_name) + + gradle_cmd = util.get_gradle_wrapper(target_dir, self.env) + + # 1. native image with include all + log = Logger() + append(build_file, self.packages_termcolor(community)) + append(build_file, self.native_image_with_include()) + cmd = gradle_cmd + ["--stacktrace", "build", "nativeCompile"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, logger=log) + util.check_ouput("BUILD SUCCESS", out, logger=log) + + cmd = [os.path.join(target_dir, "build", "native", "nativeCompile", "graalpy-gradle-test-project")] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, logger=log) + util.check_ouput("hello java", out, logger=log) + + # 2. native image with bogus include -> nothing included, graalpy won't even start + log = Logger() + self.copy_build_files(target_dir) + append(build_file, self.packages_termcolor(community)) + append(build_file, self.native_image_with_bogus_include()) + + cmd = gradle_cmd + ["--stacktrace", "build", "nativeCompile"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, logger=log) + util.check_ouput("BUILD SUCCESS", out, logger=log) + + cmd = [os.path.join(target_dir, "build", "native", "nativeCompile", "graalpy-gradle-test-project")] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, logger=log) + util.check_ouput("could not determine Graal.Python's core path", out, logger=log) + + # 3. native image with excluded email package -> graalpy starts but no module named 'email' + log = Logger() + self.copy_build_files(target_dir) + append(build_file, self.packages_termcolor(community)) + append(build_file, self.native_image_with_bogus_include()) + util.replace_in_file(os.path.join(target_dir, "src", "main", "java", "org", "example", "GraalPy.java"), + "import hello", + "import email; import hello") + + cmd = gradle_cmd + ["--stacktrace", "build", "nativeCompile"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, logger=log) + util.check_ouput("BUILD SUCCESS", out, logger=log) + + cmd = [os.path.join(target_dir, "build", "native", "nativeCompile", "graalpy-gradle-test-project")] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, logger=log) + util.check_ouput("No module named 'email'", out, logger=log) + + + def check_gradle_empty_packages(self): + with TemporaryTestDirectory() as tmpdir: + target_dir = os.path.join(str(tmpdir), "empty_packages_test" + self.target_dir_name_sufix()) + self.generate_app(target_dir) + build_file = os.path.join(target_dir, self.build_file_name) + + append(build_file, self.empty_packages()) + + gradle_cmd = util.get_gradle_wrapper(target_dir, self.env) + cmd = gradle_cmd + ["graalPyInstallPackages"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out) + assert return_code == 0, out + + cmd = gradle_cmd + ["graalpyLockPackages"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out, contains=False) + util.check_ouput("In order to run the graalPyLockPackages task there have to be python packages declared in the graalpy-gradle-plugin configuration.", out) + assert not os.path.exists(os.path.join(target_dir, "graalpy.lock")) + + + def check_gradle_python_resources_dir_deprecation(self): + with TemporaryTestDirectory() as tmpdir: + target_dir = os.path.join(str(tmpdir), "py_res_dir_deprecation_test" + self.target_dir_name_sufix()) + self.generate_app(target_dir) + build_file = os.path.join(target_dir, self.build_file_name) + + resources_dir = os.path.join(target_dir, "python-resources") + os.makedirs(resources_dir, exist_ok=True) + + resources_dir = resources_dir if 'win32' != sys.platform else resources_dir.replace("\\", "\\\\") + append(build_file, f''' + graalPy {{ + community = true + pythonResourcesDirectory = file("{resources_dir}") + }} + ''') + + gradle_cmd = util.get_gradle_wrapper(target_dir, self.env) + cmd = gradle_cmd + ["graalPyInstallPackages"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("Property 'pythonResourcesDirectory' is deprecated and will be removed. Use property 'externalDirectory' instead.", out) + assert return_code == 0, out + + + def check_gradle_python_resources_dir_and_external_dir_error(self): + with TemporaryTestDirectory() as tmpdir: + target_dir = os.path.join(str(tmpdir), "py_res_dir_external_dir_err" + self.target_dir_name_sufix()) + self.generate_app(target_dir) + build_file = os.path.join(target_dir, self.build_file_name) + + resources_dir = os.path.join(target_dir, "python-resources") + os.makedirs(resources_dir, exist_ok=True) + + resources_dir = resources_dir if 'win32' != sys.platform else resources_dir.replace("\\", "\\\\") + append(build_file, f''' + graalPy {{ + community = true + pythonResourcesDirectory = file("{resources_dir}") + externalDirectory = file("{resources_dir}") + }} + ''') + + gradle_cmd = util.get_gradle_wrapper(target_dir, self.env) + cmd = gradle_cmd + ["graalPyInstallPackages"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("Cannot set both 'externalDirectory' and 'resourceDirectory' at the same time", out) + assert return_code != 0, out + + + def app1_with_namespaced_vfs(self): + pass + + + def app2_using_app1(self): + pass + + + def check_gradle_namespaced_vfs(self): + with TemporaryTestDirectory() as tmpdir: + app1_dir = os.path.join(str(tmpdir), "check_ns_app1" + self.target_dir_name_sufix()) + app2_dir = os.path.join(str(tmpdir), "check_ns_app2" + self.target_dir_name_sufix()) + self.generate_app(app1_dir) + self.generate_app(app2_dir) + app1_build_file = os.path.join(app1_dir, self.build_file_name) + app2_build_file = os.path.join(app2_dir, self.build_file_name) + + # Rename app1 package to "com.example" + new_package_dir = os.path.join(app1_dir, "src", "main", "java", "com") + os.mkdir(new_package_dir) + shutil.move(os.path.join(app1_dir, "src", "main", "java", "org", "example"), new_package_dir) + for j_file in ['GraalPy.java', 'Hello.java']: + util.replace_in_file(os.path.join(new_package_dir, "example", j_file), "package org.example;", "package com.example;") + + # Update native image config for app1 package + meta_inf = os.path.join(app1_dir, "src", "main", "resources", "META-INF", "native-image") + with open(os.path.join(meta_inf, 'proxy-config.json'), 'w') as f: + f.write('[ ["com.example.Hello"] ]') + + append(app1_build_file, self.app1_with_namespaced_vfs()) + append(app2_build_file, self.app2_using_app1()) + + util.replace_main_body(os.path.join(app2_dir, 'src', 'main', 'java', 'org', 'example', 'GraalPy.java'), + ''' + org.graalvm.python.embedding.VirtualFileSystem vfs = + org.graalvm.python.embedding.VirtualFileSystem.newBuilder() + .resourceDirectory("GRAALPY-VFS/org.graalvm.python.tests/gradleapp1") + .build(); + try (Context context1 = GraalPyResources.createContext(); + Context context2 = GraalPyResources.contextBuilder(vfs).build()) { + int index = 0; + for (Context ctx: new Context[] {context1, context2}) { + ctx.eval("python", "import hello"); + Value pyHelloClass = ctx.getPolyglotBindings().getMember("PyHello"); + Value pyHello = pyHelloClass.newInstance(); + Hello hello = pyHello.as(Hello.class); + System.out.print("" + index++ + ": "); + hello.hello("java"); + } + } + ''') + + util.replace_in_file(os.path.join(app2_dir, "src", "main", "resources", "org.graalvm.python.vfs", "src", "hello.py"), + 'colored("hello "', 'colored("Hi there "') + + vfs_parent_dir = os.path.join(app1_dir, "src", "main", "resources", "GRAALPY-VFS", "org.graalvm.python.tests") + os.makedirs(vfs_parent_dir) + shutil.move(os.path.join(app1_dir, "src", "main", "resources", "org.graalvm.python.vfs"), os.path.join(vfs_parent_dir, "gradleapp1")) + + app1_gradle_cmd = util.get_gradle_wrapper(app1_dir, self.env) + out, return_code = util.run_cmd(app1_gradle_cmd + ['publishToMavenLocal'], self.env, cwd=app1_dir) + util.check_ouput("Virtual filesystem is deployed to default resources directory", out, contains=False) + util.check_ouput("This can cause conflicts if used with other Java libraries that also deploy GraalPy virtual filesystem", out, contains=False) + assert return_code == 0, out + + app2_gradle_cmd = util.get_gradle_wrapper(app2_dir, self.env) + out, return_code = util.run_cmd(app2_gradle_cmd + ['run'], self.env, cwd=app2_dir) + util.check_ouput("0: Hi there java", out) + util.check_ouput("1: hello java", out) + assert return_code == 0, out + + out, return_code = util.run_cmd(app2_gradle_cmd + ['nativeCompile'], self.env, cwd=app2_dir) + assert return_code == 0, out + + out, return_code = util.run_cmd([os.path.join(app2_dir, 'build', 'native', 'nativeCompile', 'graalpy-gradle-test-project')], self.env, cwd=app2_dir) + util.check_ouput("0: Hi there java", out) + util.check_ouput("1: hello java", out) + assert return_code == 0, out + + +class GradlePluginGroovyTest(GradlePluginTestBase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.build_file_name = "build.gradle" + cls.settings_file_name = "settings.gradle" + + @unittest.skipUnless(util.is_gradle_plugin_test_enabled, "ENABLE_GRADLE_PLUGIN_UNITTESTS is not true") + def test_gradle_generated_app(self): + self.check_gradle_generated_app(community=True) + + @unittest.skipUnless(util.is_gradle_plugin_test_enabled, "ENABLE_GRADLE_PLUGIN_UNITTESTS is not true") + def test_gradle_lock_packages(self): + self.check_lock_packages(community=True) + + @unittest.skipUnless(util.is_gradle_plugin_test_enabled, "ENABLE_GRADLE_PLUGIN_UNITTESTS is not true") + def test_gradle_generated_app_external_resources(self): + self.check_gradle_generated_app_external_resources() + + @unittest.skipUnless(util.is_gradle_plugin_test_enabled, "ENABLE_GRADLE_PLUGIN_UNITTESTS is not true") + def test_gradle_check_home_warning(self): + self.check_gradle_check_home_warning(community=True) + + @unittest.skipUnless(util.is_gradle_plugin_long_running_test_enabled, "ENABLE_GRADLE_PLUGIN_LONG_RUNNING_UNITTESTS is not true") + def test_gradle_check_home(self): + self.check_gradle_check_home(community=True) + + @unittest.skipUnless(util.is_gradle_plugin_test_enabled, "ENABLE_GRADLE_PLUGIN_UNITTESTS is not true") + def test_gradle_empty_packages(self): + self.check_gradle_empty_packages() + + @unittest.skipUnless(util.is_gradle_plugin_test_enabled, "ENABLE_GRADLE_PLUGIN_UNITTESTS is not true") + def test_gradle_namespaced_vfs(self): + self.check_gradle_namespaced_vfs() + + @unittest.skipUnless(util.is_gradle_plugin_test_enabled, "ENABLE_GRADLE_PLUGIN_UNITTESTS is not true") + def test_gradle_python_resources_dir_deprecation(self): + self.check_gradle_python_resources_dir_deprecation() + + @unittest.skipUnless(util.is_gradle_plugin_test_enabled, "ENABLE_GRADLE_PLUGIN_UNITTESTS is not true") + def test_gradle_python_resources_dir_and_external_dir_error(self): + self.check_gradle_python_resources_dir_and_external_dir_error() + + def target_dir_name_sufix(self): + return "_groovy" + + def copy_build_files(self, target_dir): + build_file = os.path.join(target_dir, self.build_file_name) + shutil.copyfile(os.path.join(os.path.dirname(__file__), "gradle", "build", self.build_file_name), build_file) + settings_file = os.path.join(target_dir, self.settings_file_name) + shutil.copyfile(os.path.join(os.path.dirname(__file__), "gradle", "build", self.settings_file_name), settings_file) + if custom_repos := os.environ.get("MAVEN_REPO_OVERRIDE"): + mvn_repos = "" + for idx, custom_repo in enumerate(custom_repos.split(",")): + mvn_repos += f"maven {{ url \"{custom_repo}\" }}\n " + util.replace_in_file(build_file, + "repositories {", f"repositories {{\n mavenLocal()\n {mvn_repos}") + util.replace_in_file(settings_file, + "repositories {", f"repositories {{\n {mvn_repos}") + + def empty_plugin(self, community): + return f"graalPy {{ {_community_as_property(community)} }}" + + def packages_termcolor(self, community): + return textwrap.dedent(f""" + graalPy {{ + packages = ["termcolor"] + {_community_as_property(community)} + }} + """) + + def lock_packages_config(self, community, pkgs, lock_file=None): + lf = f"graalPyLockFile = file(\"{lock_file}\")" if lock_file else "" + packages = "packages = [\"" + "\",\"".join(pkgs) + "\"]" + return textwrap.dedent(f""" + graalPy {{ + {packages} + {lf} + {_community_as_property(community)} + }} + """) + + def packages_termcolor_ujson(self, community): + return textwrap.dedent(f""" + graalPy {{ + packages = ["termcolor", "ujson"] + {_community_as_property(community)} + }} + """) + + def packages_termcolor_resource_dir(self, resources_dir): + resources_dir = resources_dir if 'win32' != sys.platform else resources_dir.replace("\\", "\\\\") + return textwrap.dedent(f""" + graalPy {{ + packages = ["termcolor"] + externalDirectory = file("{resources_dir}") + community = true + }} + """) + + def graalpy_python_home_includes(self, community): + return textwrap.dedent(f""" + graalPy {{ + pythonHome {{ + includes = [".*"] + }} + {_community_as_property(community)} + }} + """) + + def empty_packages(self): + return textwrap.dedent(""" + graalPy { + packages = [] + community = true + } + """) + + def native_image_with_include(self): + return textwrap.dedent(""" + graalvmNative { + binaries { + main { + systemProperties = ['org.graalvm.python.resources.include': '.*', 'org.graalvm.python.resources.log': 'true'] + } + } + } + """) + def native_image_with_bogus_include(self): + return textwrap.dedent(""" + graalvmNative { + binaries { + main { + systemProperties = ['org.graalvm.python.resources.include': 'bogus-include', 'org.graalvm.python.resources.log': 'true'] + } + } + } + """) + + def native_image_with_exclude_email(self): + return textwrap.dedent(""" + graalvmNative { + binaries { + main { + systemProperties = ['org.graalvm.python.resources.include': '.*', 'org.graalvm.python.resources.exclude': '.*/email/.*', 'org.graalvm.python.resources.log': 'true'] + } + } + } + """) + + def app1_with_namespaced_vfs(self): + return ''' + graalPy { + community = true + resourceDirectory = "GRAALPY-VFS/org.graalvm.python.tests/gradleapp1" + packages = ["termcolor"] + } + apply plugin: 'maven-publish' + publishing { + publications { + mavenJava(MavenPublication) { + from components.java + groupId = 'org.graalvm.python.tests' + artifactId = 'gradleapp1' + version = '1.0.0-SNAPSHOT' + } + } + repositories { mavenLocal() } + } + ''' + + + def app2_using_app1(self): + return ''' + graalPy { + community = true + packages = ["termcolor"] + } + repositories { mavenLocal() } + dependencies { + implementation 'org.graalvm.python.tests:gradleapp1:1.0.0-SNAPSHOT' + } + ''' + +class GradlePluginKotlinTest(GradlePluginTestBase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.build_file_name = "build.gradle.kts" + cls.settings_file_name = "settings.gradle.kts" + + @unittest.skipUnless(util.is_gradle_plugin_long_running_test_enabled, "ENABLE_GRADLE_PLUGIN_LONG_RUNNING_UNITTESTS is not true") + def test_gradle_generated_app(self): + self.check_gradle_generated_app(community=True) + + @unittest.skipUnless(util.is_gradle_plugin_test_enabled, "ENABLE_GRADLE_PLUGIN_UNITTESTS is not true") + def test_gradle_lock_packages(self): + self.check_lock_packages(community=True) + + @unittest.skipUnless(util.is_gradle_plugin_long_running_test_enabled, "ENABLE_GRADLE_PLUGIN_LONG_RUNNING_UNITTESTS is not true") + def test_gradle_generated_app_external_resources(self): + self.check_gradle_generated_app_external_resources() + + @unittest.skipUnless(util.is_gradle_plugin_test_enabled, "ENABLE_GRADLE_PLUGIN_UNITTESTS is not true") + def test_gradle_check_home_warning(self): + self.check_gradle_check_home_warning(community=True) + + @unittest.skipUnless(util.is_gradle_plugin_long_running_test_enabled, "ENABLE_GRADLE_PLUGIN_LONG_RUNNING_UNITTESTS is not true") + def test_gradle_check_home(self): + self.check_gradle_check_home(community=True) + + @unittest.skipUnless(util.is_gradle_plugin_test_enabled, "ENABLE_GRADLE_PLUGIN_UNITTESTS is not true") + def test_gradle_empty_packages(self): + self.check_gradle_empty_packages() + + @unittest.skipUnless(util.is_gradle_plugin_long_running_test_enabled, "ENABLE_GRADLE_PLUGIN_LONG_RUNNING_UNITTESTS is not true") + def test_gradle_namespaced_vfs(self): + self.check_gradle_namespaced_vfs() + + @unittest.skipUnless(util.is_gradle_plugin_test_enabled, "ENABLE_GRADLE_PLUGIN_UNITTESTS is not true") + def test_gradle_python_resources_dir_deprecation(self): + self.check_gradle_python_resources_dir_deprecation() + + @unittest.skipUnless(util.is_gradle_plugin_test_enabled, "ENABLE_GRADLE_PLUGIN_UNITTESTS is not true") + def test_gradle_python_resources_dir_and_external_dir_error(self): + self.check_gradle_python_resources_dir_and_external_dir_error() + + def target_dir_name_sufix(self): + return "_kotlin" + + def copy_build_files(self, target_dir): + build_file = os.path.join(target_dir, self.build_file_name) + shutil.copyfile(os.path.join(os.path.dirname(__file__), "gradle", "build", self.build_file_name), build_file) + settings_file = os.path.join(target_dir, self.settings_file_name) + shutil.copyfile(os.path.join(os.path.dirname(__file__), "gradle", "build", self.settings_file_name), settings_file) + if custom_repos := os.environ.get("MAVEN_REPO_OVERRIDE"): + mvn_repos = "" + for idx, custom_repo in enumerate(custom_repos.split(",")): + mvn_repos += f"maven(url=\"{custom_repo}\")\n " + + util.replace_in_file(build_file, "repositories {", f"repositories {{\n mavenLocal()\n {mvn_repos}") + util.replace_in_file(settings_file, "repositories {", f"repositories {{\n {mvn_repos}") + + def empty_plugin(self, community): + return f"graalPy {{ {_community_as_property(community) } }}" + + def lock_packages_config(self, community, pkgs, lock_file=None): + lf = f"graalPyLockFile = file(\"{lock_file}\")" if lock_file else "" + packages = "" + for p in pkgs: + packages += f" packages.add(\"{p}\")\n" + return textwrap.dedent(f""" + graalPy {{ + {packages} + {lf} + {_community_as_property(community)} + }} + """) + + def packages_termcolor(self, community): + return textwrap.dedent(f""" + graalPy {{ + packages.add("termcolor") + {_community_as_property(community)} + }} + """) + + def packages_termcolor_ujson(self, community): + return textwrap.dedent(f""" + graalPy {{ + packages.add("termcolor") + packages.add("ujson") + {_community_as_property(community)} + }} + """) + + def packages_termcolor_resource_dir(self, resources_dir): + resources_dir = resources_dir if 'win32' != sys.platform else resources_dir.replace("\\", "\\\\") + return textwrap.dedent(f""" + graalPy {{ + packages.add("termcolor") + externalDirectory = file("{resources_dir}") + community = true + }} + """) + + def graalpy_python_home_includes(self, community): + return textwrap.dedent(f""" + graalPy {{ + pythonHome {{ + includes.add(".*__init__.py") + }} + {_community_as_property(community)} + }} + """) + + def empty_packages(self): + return textwrap.dedent(""" + graalPy { + packages + community = true + } + """) + + def native_image_with_include(self): + return textwrap.dedent(""" + graalvmNative { + binaries { + named("main") { + systemProperties.putAll(mapOf("org.graalvm.python.resources.include" to ".*", "org.graalvm.python.resources.log" to "true")) + } + } + } + """) + def native_image_with_bogus_include(self): + return textwrap.dedent(""" + graalvmNative { + binaries { + named("main") { + systemProperties.putAll(mapOf("org.graalvm.python.resources.include" to "bogus-include", "org.graalvm.python.resources.log" to "true")) + } + } + } + """) + + def native_image_with_exclude_email(self): + return textwrap.dedent(""" + graalvmNative { + binaries { + named("main") { + systemProperties.putAll(mapOf("org.graalvm.python.resources.include" to ".*", "org.graalvm.python.resources.include" to ".*/email/.*", "org.graalvm.python.resources.log" to "true")) + } + } + } + """) + + def app1_with_namespaced_vfs(self): + return ''' + graalPy { + community = true + resourceDirectory = "GRAALPY-VFS/org.graalvm.python.tests/gradleapp1" + packages.add("termcolor") + } + group = "org.graalvm.python.tests" + version = "1.0.0-SNAPSHOT" + apply(plugin = "maven-publish") + configure { + publications { + create("mavenJava") { + // Use the components of the Java plugin (i.e., the compiled code and resources) + from(components["java"]) + artifactId = "gradleapp1kt" + } + } + repositories { + mavenLocal() + } + } + ''' + + + def app2_using_app1(self): + return ''' + graalPy { + community = true + packages.add("termcolor") + } + repositories { mavenLocal() } + dependencies { + implementation("org.graalvm.python.tests:gradleapp1kt:1.0.0-SNAPSHOT") + } + ''' diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/test_jbang_integration.py b/graalpython/com.oracle.graal.python.test/src/tests/standalone/test_jbang_integration.py index 5d61f508be..03e164bef5 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/standalone/test_jbang_integration.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/test_jbang_integration.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -40,15 +40,17 @@ import json import os import shutil -import sys import subprocess +import sys import tempfile +import time import unittest +from tests.standalone import util + is_enabled = 'ENABLE_JBANG_INTEGRATION_UNITTESTS' in os.environ and os.environ['ENABLE_JBANG_INTEGRATION_UNITTESTS'] == "true" MAVEN_REPO_LOCAL_URL = os.environ.get('org.graalvm.maven.downloader.repository') GRAAL_VERSION = os.environ.get('org.graalvm.maven.downloader.version') -CATALOG_ALIAS = "tested_catalog" # whole folder will be deleted after the tests finished WORK_DIR = os.path.join(tempfile.gettempdir(),tempfile.mkdtemp()) @@ -69,16 +71,17 @@ def run_cmd(cmd, env=ENV, cwd=None): class TestJBangIntegration(unittest.TestCase): - def setUpClass(self): + @classmethod + def setUpClass(cls): if not is_enabled: return - self.ensureProxy() - self.ensureLocalMavenRepo() - self.clearCache() - self.catalog_file = self.getCatalogFile() - self.registerCatalog(self.catalog_file) + cls.ensureProxy() + cls.ensureLocalMavenRepo() + cls.clearCache() + cls.catalog_file = cls.getCatalogFile() - def tearDownClass(self): + @classmethod + def tearDownClass(cls): if not is_enabled: return try: @@ -95,7 +98,8 @@ def tearDown(self): except Exception as e: print(f"The test run correctly but problem during removing workdir: {e}") - def ensureProxy(self): + @staticmethod + def ensureProxy(): java_tools = os.environ.get('JAVA_TOOL_OPTIONS') if java_tools is None: java_tools = "" @@ -112,15 +116,18 @@ def ensureProxy(self): if len(java_tools) > 0: os.environ['JAVA_TOOL_OPTIONS'] = java_tools - def ensureLocalMavenRepo(self): + @staticmethod + def ensureLocalMavenRepo(): if MAVEN_REPO_LOCAL_URL is None: - self.fail("'org.graalvm.maven.downloader.repository' is not defined") + raise RuntimeError("'org.graalvm.maven.downloader.repository' is not defined") - def clearCache(self): - command = [JBANG_CMD, "cache", "clear"] - out, result = run_cmd(command) + @staticmethod + def clearCache(): + command = [JBANG_CMD, "cache", "--verbose", "clear"] + run_cmd(command) - def getCatalogFile(self): + @staticmethod + def getCatalogFile(): catalog_dir = os.path.dirname(os.path.abspath(__file__)) for _ in range(5): catalog_dir = os.path.dirname(catalog_dir) @@ -159,21 +166,29 @@ def addLocalMavenRepo(self, file): else: self.fail(f"Not found any dependecies in: {file}") - def registerCatalog(self, catalog_file): - # we need to be sure that the current dir is not dir, where is the catalog defined - os.chdir(WORK_DIR) - # find if the catalog is not registered - command = [JBANG_CMD, "catalog", "list"] - out, result = run_cmd(command) - if result == 0: - if CATALOG_ALIAS not in out: - # registering our catalog - command = [JBANG_CMD, "catalog", "add", "--name", CATALOG_ALIAS, catalog_file] - out, result = run_cmd(command) - if result != 0: - self.fail(f"Problem during registering catalog: {out}") - else: - self.fail(f"Problem during registering catalog: {out}") + def prepare_hello_example(self, work_dir): + hello_java_file = os.path.join(work_dir, "hello.java") + self.prepare_template(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../../../../graalpy-jbang/examples/hello.java"), hello_java_file) + return hello_java_file + + def prepare_template(self, template, target): + shutil.copyfile(template, target) + self.addLocalMavenRepo(target) + + @unittest.skipUnless(is_enabled, "ENABLE_JBANG_INTEGRATION_UNITTESTS is not true") + def test_register_catalog(self): + alias = "graalpy_test_catalog_" + str(int(time.time())) + + # jbang checks catalog file sanity when adding + command = [JBANG_CMD, "catalog", "add", "--verbose", "--name", alias, self.catalog_file] + out, result = run_cmd(command, cwd=WORK_DIR) + if result != 0: + self.fail(f"Problem during registering catalog") + + command = [JBANG_CMD, "catalog", "remove", "--verbose", alias] + out, result = run_cmd(command, cwd=WORK_DIR) + if result != 0: + self.fail(f"Problem during removing catalog") @unittest.skipUnless(is_enabled, "ENABLE_JBANG_INTEGRATION_UNITTESTS is not true") def test_catalog(self): @@ -193,47 +208,43 @@ def test_graalpy_template(self): template_name = "graalpy" test_file = "graalpy_test.java" work_dir = self.tmpdir - os.chdir(work_dir) - command = [JBANG_CMD, "--verbose", "init", f"--template={template_name}@{CATALOG_ALIAS}" , test_file] - out, result = run_cmd(command) + command = [JBANG_CMD, "--verbose", "init", f"--template={template_name}@{self.catalog_file}" , test_file] + out, result = run_cmd(command, cwd=work_dir) self.assertTrue(result == 0, f"Creating template {template_name} failed") # add local maven repo to the deps test_file_path = os.path.join(work_dir, test_file) self.addLocalMavenRepo(test_file_path) - tested_code = "print (f\'This is test text and result is {123456789 * 1000}\')" - expected_text = "This is test text and result is 123456789000" + tested_code = "from termcolor import colored; print(colored('hello java', 'red', attrs=['reverse', 'blink']))" command = [JBANG_CMD, "--verbose", test_file_path, tested_code] - out, result = run_cmd(command) + out, result = run_cmd(command, cwd=work_dir) self.assertTrue(result == 0, f"Execution failed with code {result}\n command: {command}\n stdout: {out}\n") - self.assertTrue(expected_text in out, f"Expected text:\n{expected_text}\nbut in stdout was:\n{out}") + self.assertTrue("Successfully installed termcolor" in out, f"Expected text:\nSuccessfully installed termcolor\nbut in stdout was:\n{out}") + self.assertTrue("hello java" in out, f"Expected text:\nhello java\nbut in stdout was:\n{out}") @unittest.skipUnless(is_enabled, "ENABLE_JBANG_INTEGRATION_UNITTESTS is not true") @unittest.skipUnless('win32' not in sys.platform, "Currently the jbang native image on Win gate fails.") def test_graalpy_template_native(self): - self.skip() # GR-58222 - template_name = "graalpy" test_file = "graalpy_test.java" work_dir = self.tmpdir - os.chdir(work_dir) - command = [JBANG_CMD, "--verbose", "init", f"--template={template_name}@{CATALOG_ALIAS}" , test_file] - out, result = run_cmd(command) + command = [JBANG_CMD, "--verbose", "init", f"--template={template_name}@{self.catalog_file}" , test_file] + out, result = run_cmd(command, cwd=work_dir) self.assertTrue(result == 0, f"Creating template {template_name} failed") test_file_path = os.path.join(work_dir, test_file) self.addLocalMavenRepo(test_file_path) - tested_code = "print (f\'This is test text and result is {147258369 * 1000}\')" - expected_text = "This is test text and result is 147258369000" + tested_code = "from termcolor import colored; print(colored('hello java', 'red', attrs=['reverse', 'blink']))" command = [JBANG_CMD, "--verbose", "--native", test_file_path, tested_code] - out, result = run_cmd(command) + out, result = run_cmd(command, cwd=work_dir) self.assertTrue(result == 0, f"Execution failed with code {result}\n command: {command}\n stdout: {out}") - self.assertTrue(expected_text in out, f"Expected text:\n{expected_text}\nbut in stdout was:\n{out}") + self.assertTrue("Successfully installed termcolor" in out, f"Expected text:\nSuccessfully installed termcolor") + self.assertTrue("hello java" in out, f"Expected text:\nhello java\nbut in stdout was:\n{out}") @unittest.skipUnless(is_enabled, "ENABLE_JBANG_INTEGRATION_UNITTESTS is not true") @@ -241,20 +252,166 @@ def test_graalpy_local_repo_template(self): template_name = "graalpy_local_repo" test_file = "graalpy_test_local_repo.java" work_dir = self.tmpdir - os.chdir(work_dir) - command = [JBANG_CMD, "--verbose", "init", f"--template={template_name}@{CATALOG_ALIAS}", f"-Dpath_to_local_repo={MAVEN_REPO_LOCAL_URL}", test_file] - out, result = run_cmd(command) + command = [JBANG_CMD, "--verbose", "init", f"--template={template_name}@{self.catalog_file}", f"-Dpath_to_local_repo={MAVEN_REPO_LOCAL_URL}", test_file] + out, result = run_cmd(command, cwd=work_dir) self.assertTrue(result == 0, f"Creating template {template_name} failed") test_file_path = os.path.join(work_dir, test_file) - tested_code = "print (f\'This is test text and result is {987654321 * 1000}\')" - expected_text = "This is test text and result is 987654321000" + tested_code = "from termcolor import colored; print(colored('hello java', 'red', attrs=['reverse', 'blink']))" command = [JBANG_CMD, "--verbose", test_file_path, tested_code] - out, result = run_cmd(command) + out, result = run_cmd(command, cwd=work_dir) + + self.assertTrue(result == 0, f"Execution failed with code {result}\n command: {command}\n stdout: {out}") + self.assertTrue("Successfully installed termcolor" in out, f"Expected text:\nSuccessfully installed termcolor") + self.assertTrue("hello java" in out, f"Expected text:\nhello java\nbut in stdout was:\n{out}") + + @unittest.skipUnless(is_enabled, "ENABLE_JBANG_INTEGRATION_UNITTESTS is not true") + def test_hello_example(self): + work_dir = self.tmpdir + hello_java_file = self.prepare_hello_example(work_dir) + + tested_code = "print('hello java')" + command = [JBANG_CMD, "--verbose", hello_java_file, tested_code] + out, result = run_cmd(command, cwd=work_dir) + + self.assertTrue(result == 0, f"Execution failed with code {result}\n command: {command}\n stdout: {out}") + self.assertTrue("Successfully installed termcolor" in out, f"Expected text:\nSuccessfully installed termcolor") + self.assertTrue("hello java" in out, f"Expected text:\nhello java\nbut in stdout was:\n{out}") + + if not 'win32' in sys.platform: + command = [JBANG_CMD, "--verbose", "--native", hello_java_file, tested_code] + out, result = run_cmd(command, cwd=work_dir) + + self.assertTrue(result == 0, f"Execution failed with code {result}\n command: {command}\n stdout: {out}") + self.assertTrue("Successfully installed termcolor" in out, f"Expected text:\nSuccessfully installed termcolor") + self.assertTrue("hello java" in out, f"Expected text:\nhello java\nbut in stdout was:\n{out}") + + @unittest.skipUnless(is_enabled, "ENABLE_JBANG_INTEGRATION_UNITTESTS is not true") + def test_external_dir(self): + work_dir = self.tmpdir + hello_java_file = self.prepare_hello_example(work_dir) + + # patch hello.java file to use external dir for resources + resources_dir = os.path.join(work_dir, "python-resources") + src_dir = os.path.join(resources_dir, "src") + os.makedirs(src_dir, exist_ok=True) + with open(os.path.join(src_dir, "hello.py"), "w", encoding="utf-8") as f: + f.writelines(""" +from termcolor import colored +def hello(): + print(print(colored('hello java', 'red', attrs=['reverse', 'blink']))) + """) + util.replace_in_file(hello_java_file, + "//PIP termcolor==2.2", + f"//PIP termcolor==2.2\n//PYTHON_RESOURCES_DIRECTORY {resources_dir}") + rd = resources_dir.replace("\\", "\\\\") + util.replace_in_file(hello_java_file, + "GraalPyResources.createContext()", + f"GraalPyResources.contextBuilder(java.nio.file.Path.of(\"{rd}\")).build()") + + tested_code = "import hello; hello.hello()" + command = [JBANG_CMD, "--verbose", hello_java_file, tested_code] + out, result = run_cmd(command, cwd=work_dir) + + self.assertTrue(result == 0, f"Execution failed with code {result}\n command: {command}\n stdout: {out}") + self.assertTrue("Successfully installed termcolor" in out, f"Expected text:\nSuccessfully installed termcolor") + self.assertTrue("hello java" in out, f"Expected text:\nhello java\nbut in stdout was:\n{out}") + + # add ujson to PIP comment + util.replace_in_file(hello_java_file, + "//PIP termcolor==2.2", + "//PIP termcolor==2.2 ujson") + tested_code = "import hello; hello.hello()" + command = [JBANG_CMD, "--verbose", hello_java_file, tested_code] + out, result = run_cmd(command, cwd=work_dir) + + self.assertTrue(result == 0, f"Execution failed with code {result}\n command: {command}\n stdout: {out}") + self.assertTrue("Successfully installed ujson" in out, f"Expected text:\nSuccessfully installed ujson") + self.assertFalse("Successfully installed termcolor" in out, f"Did not expect text:\nSuccessfully installed termcolor") + self.assertTrue("hello java" in out, f"Expected text:\nhello java\nbut in stdout was:\n{out}") + + # remove ujson from PIP comment + util.replace_in_file(hello_java_file, + "//PIP termcolor==2.2 ujson", + "//PIP termcolor==2.2\n") + tested_code = "import hello; hello.hello()" + command = [JBANG_CMD, "--verbose", hello_java_file, tested_code] + out, result = run_cmd(command, cwd=work_dir) + + self.assertTrue(result == 0, f"Execution failed with code {result}\n command: {command}\n stdout: {out}") + self.assertFalse("ujson" in out, f"Did not expect text:\n ujson") + self.assertTrue("Successfully installed termcolor" in out, f"Did not expect text:\nSuccessfully installed termcolor") + self.assertTrue("hello java" in out, f"Expected text:\nhello java\nbut in stdout was:\n{out}") + + # add ujson in additional PIP comment + util.replace_in_file(hello_java_file, + "//PIP termcolor==2.2", + "//PIP termcolor==2.2\n//PIP ujson") + tested_code = "import hello; hello.hello()" + command = [JBANG_CMD, "--verbose", hello_java_file, tested_code] + out, result = run_cmd(command, cwd=work_dir) + + self.assertTrue(result == 0, f"Execution failed with code {result}\n command: {command}\n stdout: {out}") + self.assertTrue("Successfully installed ujson" in out, f"Expected text:\nSuccessfully installed ujson") + self.assertFalse("Successfully installed termcolor" in out, f"Did not expect text:\nSuccessfully installed termcolor") + self.assertTrue("hello java" in out, f"Expected text:\nhello java\nbut in stdout was:\n{out}") + + if not 'win32' in sys.platform: + command = [JBANG_CMD, "--verbose", "--native", hello_java_file, tested_code] + out, result = run_cmd(command, cwd=work_dir) + + self.assertTrue(result == 0, f"Execution failed with code {result}\n command: {command}\n stdout: {out}") + self.assertFalse("Successfully installed termcolor" in out, f"Did not expect text:\nSuccessfully installed termcolor") + self.assertFalse("Successfully installed ujson" in out, f"Did not expect text:\nSuccessfully installed ujson") + self.assertTrue("hello java" in out, f"Expected text:\nhello java\nbut in stdout was:\n{out}") + + def check_empty_comments(self, work_dir, java_file): + command = [JBANG_CMD, "--verbose", java_file] + out, result = run_cmd(command, cwd=work_dir) + self.assertTrue(result == 0, f"Execution failed with code {result}\n command: {command}\n stdout: {out}") + self.assertFalse("[graalpy jbang integration]" in out, f"Did not expect text:\n[graalpy jbang integration]") + @unittest.skipUnless(is_enabled, "ENABLE_JBANG_INTEGRATION_UNITTESTS is not true") + def test_malformed_tag_formats(self): + jbang_templates_dir = os.path.join(os.path.dirname(__file__), "jbang") + work_dir = self.tmpdir + + java_file = os.path.join(work_dir, "EmptyPIPComments.java") + self.prepare_template(os.path.join(jbang_templates_dir, "EmptyPIPComments.j"), java_file) + self.check_empty_comments(work_dir, java_file) + + java_file = os.path.join(work_dir, "EmptyPythonResourceComment.java") + self.prepare_template(os.path.join(jbang_templates_dir, "EmptyPythonResourceComment.j"), java_file) + self.check_empty_comments(work_dir, java_file) + + java_file = os.path.join(work_dir, "EmptyPythonResourceCommentWithBlanks.java") + self.prepare_template(os.path.join(jbang_templates_dir, "EmptyPythonResourceCommentWithBlanks.j"), java_file) + self.check_empty_comments(work_dir, java_file) + + @unittest.skipUnless(is_enabled, "ENABLE_JBANG_INTEGRATION_UNITTESTS is not true") + def test_no_pkgs_but_resource_dir(self): + jbang_templates_dir = os.path.join(os.path.dirname(__file__), "jbang") + work_dir = self.tmpdir + + java_file = os.path.join(work_dir, "NoPackagesResourcesDir.java") + self.prepare_template(os.path.join(jbang_templates_dir, "NoPackagesResourcesDir.j"), java_file) + command = [JBANG_CMD, "--verbose", java_file] + out, result = run_cmd(command, cwd=work_dir) self.assertTrue(result == 0, f"Execution failed with code {result}\n command: {command}\n stdout: {out}") - self.assertTrue(expected_text in out, f"Expected text:\n{expected_text}\nbut in stdout was:\n{out}") + self.assertFalse("[graalpy jbang integration] python packages" in out, f"Did not expect text:\n[graalpy jbang integration] python packages") + self.assertTrue("[graalpy jbang integration] python resources directory: python-resources" in out, f"Expected text:\n[graalpy jbang integration] python resources directory: python-resources") + self.assertFalse("-m ensurepip" in out) + self.assertFalse("pip install" in out) + @unittest.skipUnless(is_enabled, "ENABLE_JBANG_INTEGRATION_UNITTESTS is not true") + def test_two_resource_dirs(self): + jbang_templates_dir = os.path.join(os.path.dirname(__file__), "jbang") + work_dir = self.tmpdir -unittest.skip_deselected_test_functions(globals()) + java_file = os.path.join(work_dir, "TwoPythonResourceComments.java") + self.prepare_template(os.path.join(jbang_templates_dir, "TwoPythonResourceComments.j"), java_file) + command = [JBANG_CMD, "--verbose", java_file] + out, result = run_cmd(command, cwd=work_dir) + self.assertTrue(result == 1, f"Execution failed with code {result}\n command: {command}\n stdout: {out}") + self.assertTrue("only one //PYTHON_RESOURCES_DIRECTORY comment is allowed" in out, f"Expected text:\nonly one //PYTHON_RESOURCES_DIRECTORY comment is allowed") diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/test_maven_plugin.py b/graalpython/com.oracle.graal.python.test/src/tests/standalone/test_maven_plugin.py new file mode 100644 index 0000000000..3b7dc1068b --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/test_maven_plugin.py @@ -0,0 +1,716 @@ +# Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# The Universal Permissive License (UPL), Version 1.0 +# +# Subject to the condition set forth below, permission is hereby granted to any +# person obtaining a copy of this software, associated documentation and/or +# data (collectively the "Software"), free of charge and under any and all +# copyright rights in the Software, and any and all patent rights owned or +# freely licensable by each licensor hereunder covering either (i) the +# unmodified Software as contributed to or provided by such licensor, or (ii) +# the Larger Works (as defined below), to deal in both +# +# (a) the Software, and +# +# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +# one is included with the Software each a "Larger Work" to which the Software +# is contributed by such licensors), +# +# without restriction, including without limitation the rights to copy, create +# derivative works of, display, perform, and distribute the Software and make, +# use, sell, offer for sale, import, export, have made, and have sold the +# Software and the Larger Work(s), and to sublicense the foregoing rights on +# either these or other terms. +# +# This license is subject to the following condition: +# +# The above copyright notice and either this complete permission notice or at a +# minimum a reference to the UPL must be included in all copies or substantial +# portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import os +import pathlib +import re +import shutil +import sys +import textwrap +import unittest + +from tests.standalone import util +from tests.standalone.util import TemporaryTestDirectory, Logger + +MISSING_FILE_WARNING = "The list of installed Python packages does not match the packages specified in the graalpy-maven-plugin configuration." +PACKAGES_CHANGED_ERROR = "but packages and their version constraints in graalpy-maven-plugin configuration are different then previously used to generate the lock file" +VENV_UPTODATE = "Virtual environment is up to date with lock file, skipping install" + +class MavenPluginTest(util.BuildToolTestBase): + + def generate_app(self, tmpdir, target_dir, target_name, pom_template=None, group_id="archetype.it", package="it.pkg"): + cmd = util.GLOBAL_MVN_CMD + [ + "archetype:generate", + "-B", + f"-DarchetypeGroupId={self.archetypeGroupId}", + f"-DarchetypeArtifactId={self.archetypeArtifactId}", + f"-DarchetypeVersion={self.graalvmVersion}", + f"-DartifactId={target_name}", + f"-DgroupId={group_id}", + f"-Dpackage={package}", + "-Dversion=0.1-SNAPSHOT", + ] + out, return_code = util.run_cmd(cmd, self.env, cwd=str(tmpdir)) + util.check_ouput("BUILD SUCCESS", out) + + if pom_template: + shutil.copyfile(pom_template, os.path.join(target_dir, "pom.xml")) + + util.patch_pom_repositories(os.path.join(target_dir, "pom.xml")) + + mvnw_dir = os.path.join(os.path.dirname(__file__), "mvnw") + shutil.copy(os.path.join(mvnw_dir, "mvnw"), os.path.join(target_dir, "mvnw")) + shutil.copy(os.path.join(mvnw_dir, "mvnw.cmd"), os.path.join(target_dir, "mvnw.cmd")) + shutil.copytree(os.path.join(mvnw_dir, ".mvn"), os.path.join(target_dir, ".mvn")) + util.override_maven_properties_file(target_dir) + + meta_inf_native_image_dir = os.path.join(target_dir, "src", "main", "resources", "META-INF", "native-image") + os.makedirs(meta_inf_native_image_dir, exist_ok=True) + shutil.copy(os.path.join(os.path.dirname(__file__), "native-image.properties"), os.path.join(meta_inf_native_image_dir, "native-image.properties")) + + def check_generated_app(self, use_default_vfs_path): + with util.TemporaryTestDirectory() as tmpdir: + target_name = "generated_app_test" + if use_default_vfs_path: + target_name += "_default_vfs_path" + + target_dir = os.path.join(str(tmpdir), target_name) + self.generate_app(tmpdir, target_dir, target_name) + + vfs_prefix = os.path.join('GRAALPY-VFS', 'archetype.it', target_name) + graalpy_main_src = os.path.join(target_dir, "src", "main", "java", "it", "pkg", "GraalPy.java") + if use_default_vfs_path: + util.replace_in_file(os.path.join(target_dir, "pom.xml"), + "GRAALPY-VFS/${project.groupId}/${project.artifactId}", "") + util.replace_in_file(graalpy_main_src, + '.resourceDirectory("GRAALPY-VFS/archetype.it/generated_app_test_default_vfs_path")', "") + resources_dir = os.path.join(target_dir, 'src', 'main', 'resources') + shutil.move(os.path.join(resources_dir, vfs_prefix), os.path.join(resources_dir, util.DEFAULT_VFS_PREFIX)) + vfs_prefix = util.DEFAULT_VFS_PREFIX + + mvnw_cmd = util.get_mvn_wrapper(target_dir, self.env) + + # build + cmd = mvnw_cmd + ["package", "-Pnative", "-DmainClass=it.pkg.GraalPy"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out) + util.check_ouput("Virtual filesystem is deployed to default resources directory", out, contains=use_default_vfs_path) + util.check_ouput("This can cause conflicts if used with other Java libraries that also deploy GraalPy virtual filesystem.", out, contains=use_default_vfs_path) + + # check fileslist.txt + fl_path = os.path.join(target_dir, "target", "classes", vfs_prefix, "fileslist.txt") + with open(fl_path) as f: + lines = f.readlines() + vfs_prefix_in_res = vfs_prefix.replace("\\", "/") + assert "/" + vfs_prefix_in_res + "/\n" in lines, "'/" + vfs_prefix_in_res + "/' not found in: \n\n" + ''.join(lines) + + # execute and check native image + cmd = [os.path.join(target_dir, "target", target_name)] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("hello java", out) + + # 2.) check java build and exec + # run with java asserts on + if self.env.get("MAVEN_OPTS"): + self.env["MAVEN_OPTS"] = self.env.get("MAVEN_OPTS") + " -ea -esa" + else: + self.env["MAVEN_OPTS"] = "-ea -esa" + + # import struct from python file triggers extract of native extension files in VirtualFileSystem + hello_src = os.path.join(target_dir, "src", "main", "resources", vfs_prefix, "src", "hello.py") + with open(hello_src) as f: + contents = f.read() + with open(hello_src, 'w') as f: + f.write("import struct\n" + contents) + + # rebuild and exec + cmd = mvnw_cmd + ["package", "exec:java", "-Dexec.mainClass=it.pkg.GraalPy"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out) + util.check_ouput("hello java", out) + + #GR-51132 - NoClassDefFoundError when running polyglot app in java mode + util.check_ouput("java.lang.NoClassDefFoundError", out, False) + + # move app to another folder + # this will break launcher symlinks, but should be able to recover from that + target_dir2 = os.path.join(str(tmpdir), target_name + ".2") + os.rename(target_dir, target_dir2) + mvnw_cmd2 = util.get_mvn_wrapper(target_dir2, self.env) + # adding new dep triggers launcher without venv regen + util.replace_in_file(os.path.join(target_dir2, "pom.xml"), "", "\nujson\n") + cmd = mvnw_cmd2 + ["package", "exec:java", "-Dexec.mainClass=it.pkg.GraalPy"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir2) + util.check_ouput("BUILD SUCCESS", out) + util.check_ouput("Deleting GraalPy venv due to changed launcher path", out) + util.check_ouput("hello java", out) + util.check_ouput("not compatible with the current platform", out, contains=False) + + # create fake native files and patch contents file in venv + # to trigger native extension built on different platform warning + venv_dir = os.path.join(target_dir2, "target", "classes", "org.graalvm.python.vfs" if use_default_vfs_path else vfs_prefix, "venv") + for suffix in [".so", ".dylib", ".dll"]: + with open(os.path.join(venv_dir, "nativefile" + suffix), "w") as file: + file.write("test") + cmd = mvnw_cmd2 + ["package"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir2) + util.check_ouput("BUILD SUCCESS", out) + + util.replace_in_file(os.path.join(venv_dir, "contents"), "platform=", "platform=test") + cmd = mvnw_cmd2 + ["exec:java", "-Dexec.mainClass=it.pkg.GraalPy"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir2) + util.check_ouput("BUILD SUCCESS", out) + util.check_ouput("hello java", out) + util.check_ouput("not compatible with the current platform", out) + + @unittest.skipUnless(util.is_maven_plugin_test_enabled, "ENABLE_MAVEN_PLUGIN_UNITTESTS is not true") + def test_generated_app(self): + self.check_generated_app(use_default_vfs_path=False) + + @unittest.skipUnless(util.is_maven_plugin_long_running_test_enabled, "ENABLE_MAVEN_PLUGIN_LONG_RUNNING_UNITTESTS is not true") + def test_generated_app_with_default_vfs_path(self): + self.check_generated_app(use_default_vfs_path=True) + + @unittest.skipUnless(util.is_maven_plugin_test_enabled, "ENABLE_MAVEN_PLUGIN_UNITTESTS is not true") + def test_lock_file(self): + with util.TemporaryTestDirectory() as tmpdir: + + target_name = "test_lock_file" + target_dir = os.path.join(str(tmpdir), target_name) + self.generate_app(tmpdir, target_dir, target_name) + + mvnw_cmd = util.get_mvn_wrapper(target_dir, self.env) + # run with java asserts on + if self.env.get("MAVEN_OPTS"): + self.env["MAVEN_OPTS"] = self.env.get("MAVEN_OPTS") + " -ea -esa" + else: + self.env["MAVEN_OPTS"] = "-ea -esa" + + # start with requests package without version + util.replace_in_file(os.path.join(target_dir, "pom.xml"), "termcolor==2.2", "requests") + + # build + cmd = mvnw_cmd + ["package", "-DgraalPyLockFile=test-graalpy.lock"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("pip install", out) + util.check_ouput("BUILD SUCCESS", out) + util.check_ouput(MISSING_FILE_WARNING, out, contains=True) + assert not os.path.exists(os.path.join(target_dir, "test-graalpy.lock")) + + # freeze without version + cmd = mvnw_cmd + ["org.graalvm.python:graalpy-maven-plugin:lock-packages", "-DgraalPyLockFile=test-graalpy.lock"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out, contains=True) + util.check_ouput(MISSING_FILE_WARNING, out, contains=False) + assert os.path.exists(os.path.join(target_dir, "test-graalpy.lock")) + os.remove(os.path.join(target_dir, "test-graalpy.lock")) + + # freeze with correct version + util.replace_in_file(os.path.join(target_dir, "pom.xml"), "requests", "requests==2.32.3") + cmd = mvnw_cmd + ["org.graalvm.python:graalpy-maven-plugin:lock-packages", "-DgraalPyLockFile=test-graalpy.lock"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out, contains=True) + util.check_ouput(MISSING_FILE_WARNING, out, contains=False) + assert os.path.exists(os.path.join(target_dir, "test-graalpy.lock")) + + # add termcolor and build - fails as it is not part of lock file + util.replace_in_file(os.path.join(target_dir, "pom.xml"), "", "termcolor==2.2\n") + cmd = mvnw_cmd + ["package", "-DgraalPyLockFile=test-graalpy.lock"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out, contains=False) + util.check_ouput(PACKAGES_CHANGED_ERROR, out) + util.check_ouput(MISSING_FILE_WARNING, out, contains=False) + assert os.path.exists(os.path.join(target_dir, "test-graalpy.lock")) + + # freeze with termcolor + # stop using lock file system property but test also with field in pom.xml + util.replace_in_file(os.path.join(target_dir, "pom.xml"), "", "\ntest-graalpy.lock") + cmd = mvnw_cmd + ["org.graalvm.python:graalpy-maven-plugin:lock-packages"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out, contains=True) + util.check_ouput(MISSING_FILE_WARNING, out, contains=False) + assert os.path.exists(os.path.join(target_dir, "test-graalpy.lock")) + + # should be able to import requests if installed + util.replace_in_file(os.path.join(target_dir, "src", "main", "java", "it", "pkg", "GraalPy.java"), + "import hello", + "import requests; import hello") + + # rebuild with lock file and exec + cmd = mvnw_cmd + ["package", "exec:java", "-Dexec.mainClass=it.pkg.GraalPy"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out) + util.check_ouput(VENV_UPTODATE, out) + util.check_ouput("hello java", out) + util.check_ouput(MISSING_FILE_WARNING, out, contains=False) + + # disable packages config in pom - run with no packages, only lock file + util.replace_in_file(os.path.join(target_dir, "pom.xml"), "", "") + + # clean and rebuild fails + cmd = mvnw_cmd + ["clean", "package"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out, contains=False) + util.check_ouput(MISSING_FILE_WARNING, out, contains=False) + + @unittest.skipUnless(util.is_maven_plugin_test_enabled, "ENABLE_MAVEN_PLUGIN_UNITTESTS is not true") + def test_generated_app_external_resources(self): + with util.TemporaryTestDirectory() as tmpdir: + target_name = "generated_app_ext_resources_test" + target_dir = os.path.join(str(tmpdir), target_name) + self.generate_app(tmpdir, target_dir, target_name) + + # patch project to use external directory for resources + resources_dir = os.path.join(target_dir, "python-resources") + os.makedirs(resources_dir, exist_ok=True) + src_dir = os.path.join(resources_dir, "src") + os.makedirs(src_dir, exist_ok=True) + # copy hello.py + gen_vfs_prefix = os.path.join('GRAALPY-VFS', 'archetype.it', target_name) + shutil.copyfile(os.path.join(target_dir, "src", "main", "resources", gen_vfs_prefix, "src", "hello.py"), os.path.join(src_dir, "hello.py")) + shutil.rmtree(os.path.join(target_dir, "src", "main", "resources", gen_vfs_prefix)) + # patch GraalPy.java + util.replace_in_file(os.path.join(target_dir, "src", "main", "java", "it", "pkg", "GraalPy.java"), + "package it.pkg;", + "package it.pkg;\nimport java.nio.file.Path;") + util.replace_in_file(os.path.join(target_dir, "src", "main", "java", "it", "pkg", "GraalPy.java"), + f'VirtualFileSystem vfs = VirtualFileSystem.newBuilder().resourceDirectory("GRAALPY-VFS/archetype.it/{target_name}").build();', "") + util.replace_in_file(os.path.join(target_dir, "src", "main", "java", "it", "pkg", "GraalPy.java"), + "GraalPyResources.contextBuilder(vfs).build()", + "GraalPyResources.contextBuilder(Path.of(\"" + (resources_dir if "win32" != sys.platform else resources_dir.replace("\\", "\\\\")) + "\")).build()") + + # patch pom.xml + util.replace_in_file(os.path.join(target_dir, "pom.xml"), + "", + "${project.basedir}/python-resources\n") + + mvnw_cmd = util.get_mvn_wrapper(target_dir, self.env) + + # build + cmd = mvnw_cmd + ["package", "-Pnative", "-DmainClass=it.pkg.GraalPy"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out) + + # execute and check native image + cmd = [os.path.join(target_dir, "target", target_name)] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("hello java", out) + + # 2.) check java build and exec + # run with java asserts on + if self.env.get("MAVEN_OPTS"): + self.env["MAVEN_OPTS"] = self.env.get("MAVEN_OPTS") + " -ea -esa" + else: + self.env["MAVEN_OPTS"] = "-ea -esa" + + # build and exec + cmd = mvnw_cmd + ["package", "exec:java", "-Dexec.mainClass=it.pkg.GraalPy"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out) + util.check_ouput("hello java", out) + + @unittest.skipUnless(util.is_maven_plugin_test_enabled, "ENABLE_MAVEN_PLUGIN_UNITTESTS is not true") + def test_fail_without_graalpy_dep(self): + with util.TemporaryTestDirectory() as tmpdir: + target_name = "fail_without_graalpy_dep_test" + target_dir = os.path.join(str(tmpdir), target_name) + pom_template = os.path.join(os.path.dirname(__file__), "fail_without_graalpy_dep_pom.xml") + self.generate_app(tmpdir, target_dir, target_name, pom_template) + + mvnw_cmd = util.get_mvn_wrapper(target_dir, self.env) + + cmd = mvnw_cmd + ["process-resources"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("Missing GraalPy dependency. Please add to your pom either org.graalvm.polyglot:python-community or org.graalvm.polyglot:python", out) + + @unittest.skipUnless(util.is_maven_plugin_test_enabled, "ENABLE_MAVEN_PLUGIN_UNITTESTS is not true") + def test_check_home_warning(self): + with util.TemporaryTestDirectory() as tmpdir: + target_name = "check_home_warning_test" + target_dir = os.path.join(str(tmpdir), target_name) + pom_template = os.path.join(os.path.dirname(__file__), "check_home_pom.xml") + self.generate_app(tmpdir, target_dir, target_name, pom_template) + + mvnw_cmd = util.get_mvn_wrapper(target_dir, self.env) + + # 1. process-resources with no pythonHome config - no warning printed + process_resources_cmd = mvnw_cmd + ["process-resources"] + out, return_code = util.run_cmd(process_resources_cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out) + util.check_ouput("the python language home is always available", out, contains=False) + + # 2. process-resources with pythonHome - warning printed + shutil.copyfile(pom_template, os.path.join(target_dir, "pom.xml")) + util.patch_pom_repositories(os.path.join(target_dir, "pom.xml")) + util.replace_in_file(os.path.join(target_dir, "pom.xml"), "", "") + out, return_code = util.run_cmd(process_resources_cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out) + util.check_ouput("the python language home is always available", out, contains=True) + + @unittest.skipUnless(util.is_maven_plugin_long_running_test_enabled, "ENABLE_MAVEN_PLUGIN_LONG_RUNNING_UNITTESTS is not true") + def test_check_home(self): + with TemporaryTestDirectory() as tmpdir: + target_name = "check_home_test" + target_dir = os.path.join(str(tmpdir), target_name) + self.generate_app(tmpdir, target_dir, target_name) + + mvnw_cmd = util.get_mvn_wrapper(target_dir, self.env) + + # 1. native image with include all + log = Logger() + util.replace_in_file(os.path.join(target_dir, "pom.xml"), "false", + textwrap.dedent(""" + .* + true + + false""")) + + cmd = mvnw_cmd + ["package", "-Pnative"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, logger=log) + util.check_ouput("BUILD SUCCESS", out) + + cmd = [os.path.join(target_dir, "target", target_name)] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, logger=log) + util.check_ouput("hello java", out, logger=log) + + # 2. native image with bogus include -> nothing included, graalpy won't even start + log = Logger() + bogus_include = "bogus-include" + util.replace_in_file(os.path.join(target_dir, "pom.xml"), + ".*", + bogus_include) + + cmd = mvnw_cmd + ["package", "-Pnative"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, logger=log) + util.check_ouput("BUILD SUCCESS", out) + + cmd = [os.path.join(target_dir, "target", target_name)] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, logger=log) + util.check_ouput("could not determine Graal.Python's core path", out, logger=log) + + # 3. native image with excluded email package -> graalpy starts but no module named 'email' + log = Logger() + util.replace_in_file(os.path.join(target_dir, "pom.xml"), bogus_include, + textwrap.dedent(f""".* + .*/email/.* + true""")) + util.replace_in_file(os.path.join(target_dir, "src", "main", "java", "it", "pkg", "GraalPy.java"), + "import hello", + "import email; import hello") + + cmd = mvnw_cmd + ["package", "-Pnative"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, logger=log) + util.check_ouput("BUILD SUCCESS", out) + + cmd = [os.path.join(target_dir, "target", target_name)] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, logger=log) + util.check_ouput("No module named 'email'", out, logger=log) + + @unittest.skipUnless(util.is_maven_plugin_test_enabled, "ENABLE_MAVEN_PLUGIN_UNITTESTS is not true") + def test_empty_packages(self): + with util.TemporaryTestDirectory() as tmpdir: + target_name = "empty_packages_test" + target_dir = os.path.join(str(tmpdir), target_name) + pom_template = os.path.join(os.path.dirname(__file__), "check_packages_pom.xml") + self.generate_app(tmpdir, target_dir, target_name, pom_template) + + mvnw_cmd = util.get_mvn_wrapper(target_dir, self.env) + + cmd = mvnw_cmd + ["process-resources"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out) + + cmd = mvnw_cmd + ["-X", "org.graalvm.python:graalpy-maven-plugin:lock-packages"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out, contains=False) + util.check_ouput("In order to run the lock-packages goal there have to be python packages declared in the graalpy-maven-plugin configuration", out) + assert not os.path.exists(os.path.join(target_dir, "graalpy.lock")) + + util.replace_in_file(os.path.join(target_dir, "pom.xml"), "", " ") + + cmd = mvnw_cmd + ["process-resources"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out) + + cmd = mvnw_cmd + ["org.graalvm.python:graalpy-maven-plugin:lock-packages"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out, contains=False) + util.check_ouput("In order to run the lock-packages goal there have to be python packages declared in the graalpy-maven-plugin configuration", out) + assert not os.path.exists(os.path.join(target_dir, "graalpy.lock")) + + @unittest.skipUnless(util.is_maven_plugin_test_enabled, "ENABLE_MAVEN_PLUGIN_UNITTESTS is not true") + def test_python_resources_dir_deprecation(self): + with util.TemporaryTestDirectory() as tmpdir: + target_name = "python_res_dir_deprecation_test" + target_dir = os.path.join(str(tmpdir), target_name) + self.generate_app(tmpdir, target_dir, target_name) + + resources_dir = os.path.join(target_dir, "python-resources") + os.makedirs(resources_dir, exist_ok=True) + + util.replace_in_file(os.path.join(target_dir, "pom.xml"), "org.graalvm.polyglot", "org.graalvm.python") + + util.replace_in_file(os.path.join(target_dir, "pom.xml"), "", + "${project.basedir}/python-resources" + "") + + mvnw_cmd = util.get_mvn_wrapper(target_dir, self.env) + + cmd = mvnw_cmd + ["package"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + assert return_code == 0 + util.check_ouput("Option is deprecated and will be removed. Use instead", out) + util.check_ouput("BUILD SUCCESS", out) + assert os.path.exists(os.path.join(resources_dir, 'venv')) + + + @unittest.skipUnless(util.is_maven_plugin_test_enabled, "ENABLE_MAVEN_PLUGIN_UNITTESTS is not true") + def test_python_resources_dir_and_external_dir_error(self): + with util.TemporaryTestDirectory() as tmpdir: + target_name = "python_res_dir_deprecation_test" + target_dir = os.path.join(str(tmpdir), target_name) + self.generate_app(tmpdir, target_dir, target_name) + + resources_dir = os.path.join(target_dir, "python-resources") + os.makedirs(resources_dir, exist_ok=True) + + util.replace_in_file(os.path.join(target_dir, "pom.xml"), "org.graalvm.polyglot", "org.graalvm.python") + + util.replace_in_file(os.path.join(target_dir, "pom.xml"), "", + "${project.basedir}/python-resources" + "${project.basedir}/python-resources" + "") + + mvnw_cmd = util.get_mvn_wrapper(target_dir, self.env) + + cmd = mvnw_cmd + ["package"] + out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) + assert return_code != 0 + util.check_ouput("Cannot use and at the same time", out) + + + @unittest.skipUnless(util.is_maven_plugin_test_enabled, "ENABLE_MAVEN_PLUGIN_UNITTESTS is not true") + def test_java_home_change(self): + with util.TemporaryTestDirectory() as tmpdir: + target_name = "check_home_warning_test" + target_dir = os.path.join(str(tmpdir), target_name) + self.generate_app(tmpdir, target_dir, target_name) + + mvnw_cmd = util.get_mvn_wrapper(target_dir, self.env) + + # build the app + process_resources_cmd = mvnw_cmd + ["package"] + out, return_code = util.run_cmd(process_resources_cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out) + + # update the generated launcher, so that it looks like it's been generated with different Java path + pyenvcfg = os.path.join(target_dir, 'target', 'pyvenv.cfg') + if os.path.exists(pyenvcfg): + util.replace_in_file(pyenvcfg, os.environ['JAVA_HOME'], '/bogus/java/home') + else: + util.replace_in_file(os.path.join(target_dir, 'target', 'graalpy.sh'), os.environ['JAVA_HOME'], '/bogus/java/home') + + util.replace_in_file(os.path.join(target_dir, 'pom.xml'), 'termcolor==2.2', 'termcolor==2') + process_resources_cmd = mvnw_cmd + ["package"] + out, return_code = util.run_cmd(process_resources_cmd, self.env, cwd=target_dir) + util.check_ouput("BUILD SUCCESS", out) + + + # Creates two Java apps from given pom templates, the dependencies between them + # must be configured in the pom template(s) + def _prepare_multi_project(self, tmpdir, app1_pom_template_name, app2_pom_template_name): + app1_dir = os.path.join(str(tmpdir), "app1") + pom_template = os.path.join(os.path.dirname(__file__), app1_pom_template_name) + self.generate_app(tmpdir, app1_dir, "app1", pom_template, group_id="org.graalvm.python.tests", package="app1") + + app2_dir = os.path.join(str(tmpdir), "app2") + pom_template = os.path.join(os.path.dirname(__file__), app2_pom_template_name) + self.generate_app(tmpdir, app2_dir, "app2", pom_template, group_id="org.graalvm.python.tests", package="app2") + + app1_mvnw_cmd = util.get_mvn_wrapper(app1_dir, self.env) + app2_mvnw_cmd = util.get_mvn_wrapper(app2_dir, self.env) + + for (app_dir, pkg) in [(app1_dir, "app1"), (app2_dir, "app2")]: + graalpy_main_src = os.path.join(app_dir, "src", "main", "java", pkg, "GraalPy.java") + util.replace_in_file(graalpy_main_src, + f'.resourceDirectory("GRAALPY-VFS/org.graalvm.python.tests/{pkg}")', "") + vfs_prefix = os.path.join('GRAALPY-VFS', 'org.graalvm.python.tests', pkg) + resources_dir = os.path.join(app_dir, 'src', 'main', 'resources') + shutil.move(os.path.join(resources_dir, vfs_prefix), os.path.join(resources_dir, util.DEFAULT_VFS_PREFIX)) + + return app1_dir, app1_mvnw_cmd, app2_dir, app2_mvnw_cmd + + @unittest.skipUnless(util.is_maven_plugin_long_running_test_enabled, "ENABLE_MAVEN_PLUGIN_LONG_RUNNING_UNITTESTS is not true") + def test_multiple_merged_vfs(self): + with util.TemporaryTestDirectory() as tmpdir: + # Setup: app2 depends on app1 + # app1 depends on termcolor and in it user script hello.py it calls termcolor + # app2 depends on ujson, calls app1's hello script and ujson directly + app1_dir, app1_mvnw_cmd, app2_dir, app2_mvnw_cmd = \ + self._prepare_multi_project(tmpdir, + "prepare_venv_termcolor_pom.xml", + "merged_vfs_ujson_pom.xml") + + out, return_code = util.run_cmd(app1_mvnw_cmd + ['package', 'install'], self.env, cwd=app1_dir) + util.check_ouput("BUILD SUCCESS", out) + + out, return_code = util.run_cmd(app2_mvnw_cmd + ['package'], self.env, cwd=app2_dir) + util.check_ouput("BUILD SUCCESS", out) + + # Using app2 "as is" gives error + cmd = app2_mvnw_cmd + ["package", "exec:java", "-Dexec.mainClass=app2.GraalPy"] + out, return_code = util.run_cmd(cmd, self.env, cwd=app2_dir) + util.check_ouput("Found multiple embedded virtual filesystem instances", out) + assert return_code != 0 + + app1_jar_url_regex = re.compile(r"jar:file:.*/org/graalvm/python/tests/app1/1\.0-SNAPSHOT/app1-1\.0-SNAPSHOT\.jar!/") + found = app1_jar_url_regex.findall(out) + if not found: + raise AssertionError(f"Cannot find app1 URL in the output") + app1_jar_url = found.pop() + + # Allow multiple VFS => error: duplicate entries + cmd = app2_mvnw_cmd + ["-Dorg.graalvm.python.vfs.allow_multiple=true", "clean", "package", "exec:java", "-Dexec.mainClass=app2.GraalPy"] + out, return_code = util.run_cmd(cmd, self.env, cwd=app2_dir) + util.check_ouput("There are duplicate entries", out) + assert return_code != 0 + + # Select app1 VFS => works + cmd = app2_mvnw_cmd + [f"-Dorg.graalvm.python.vfs.root_url={app1_jar_url}", + "clean", "package", "exec:java", "-Dexec.mainClass=app2.GraalPy"] + out, return_code = util.run_cmd(cmd, self.env, cwd=app2_dir) + util.check_ouput("hello java", out) + assert return_code == 0 + + # Select app2 VFS => termcolor not found + app2_uri = pathlib.Path(app2_dir).resolve().as_uri() + app2_uri = app2_uri[len("file://"):] + if not app2_uri.endswith('/'): + app2_uri += '/' + cmd = app2_mvnw_cmd + [f"-Dorg.graalvm.python.vfs.root_url=file:{app2_uri}target/classes/org.graalvm.python.vfs/", + "clean", "package", "exec:java", "-Dexec.mainClass=app2.GraalPy"] + out, return_code = util.run_cmd(cmd, self.env, cwd=app2_dir) + util.check_ouput("No module named 'termcolor'", out) + assert return_code != 0 + + # Remove hello.py from app2 => now it should all work + # The app calls termcolor (from app1 package), also add call to ujson (from app2 package) + os.remove(os.path.join(app2_dir, "src", "main", "resources", "org.graalvm.python.vfs", "src", "hello.py")) + util.replace_in_file(os.path.join(app2_dir, "src", "main", "java", "app2", "GraalPy.java"), + 'hello.hello("java");', + ''' + hello.hello("java"); + context.eval("python", "import ujson; print(ujson.dumps([{'key': 'value'}, 81, True]))"); + ''') + + cmd = app2_mvnw_cmd + ["-Dorg.graalvm.python.vfs.allow_multiple=true", "clean", "package", "exec:java", "-Dexec.mainClass=app2.GraalPy"] + out, return_code = util.run_cmd(cmd, self.env, cwd=app2_dir) + util.check_ouput('[{"key":"value"},81,true]', out) + util.check_ouput("hello java", out) + assert return_code == 0 + + cmd = app2_mvnw_cmd + ["-Pnative", "package"] + out, return_code = util.run_cmd(cmd, self.env, cwd=app2_dir) + assert return_code == 0, out + + out, return_code = util.run_cmd([os.path.join(app2_dir, "target", "app2"), "-Dorg.graalvm.python.vfs.allow_multiple=true"], self.env, cwd=app2_dir) + util.check_ouput('[{"key":"value"},81,true]', out) + util.check_ouput("hello java", out) + assert return_code == 0, out + + @unittest.skipUnless(util.is_maven_plugin_test_enabled, "ENABLE_MAVEN_PLUGIN_UNITTESTS is not true") + def test_multiple_vfs_incompat_libs_error(self): + with util.TemporaryTestDirectory() as tmpdir: + app1_dir, app1_mvnw_cmd, app2_dir, app2_mvnw_cmd = \ + self._prepare_multi_project(tmpdir, + "prepare_venv_old_ujson_pom.xml", + "merged_vfs_ujson_pom.xml") + + out, return_code = util.run_cmd(app1_mvnw_cmd + ['package', 'install'], self.env, cwd=app1_dir) + util.check_ouput("BUILD SUCCESS", out) + + out, return_code = util.run_cmd(app2_mvnw_cmd + ['package'], self.env, cwd=app2_dir) + util.check_ouput("BUILD SUCCESS", out) + + # Allow multiple VFS sources + os.remove(os.path.join(app2_dir, "src", "main", "resources", "org.graalvm.python.vfs", "src", "hello.py")) + + cmd = app2_mvnw_cmd + ["-Dorg.graalvm.python.vfs.allow_multiple=true", "clean", "package", "exec:java", "-Dexec.mainClass=app2.GraalPy"] + out, return_code = util.run_cmd(cmd, self.env, cwd=app2_dir) + util.check_ouput("Package 'ujson' is installed in different versions", out) + util.check_ouput("5.10.0", out) + util.check_ouput("5.9.0", out) + assert return_code != 0 + + + @unittest.skipUnless(util.is_maven_plugin_test_enabled, "ENABLE_MAVEN_PLUGIN_UNITTESTS is not true") + def test_multiple_namespaced_vfs(self): + with util.TemporaryTestDirectory() as tmpdir: + # Setup: app2 with default vfs location depends on app1, which has namespaced vfs + # We should be able to load and execute the "hello.py" script from both libraries within one Java app + app1_dir, app1_mvnw_cmd, app2_dir, app2_mvnw_cmd = \ + self._prepare_multi_project(tmpdir, + "namespaced_venv.xml", + "namespaced_venv_user.xml") + + util.replace_main_body(os.path.join(app2_dir, "src", "main", "java", "app2", "GraalPy.java"), + """ + org.graalvm.python.embedding.VirtualFileSystem vfs = + org.graalvm.python.embedding.VirtualFileSystem.newBuilder() + .resourceDirectory("GRAALPY-VFS/org.graalvm.python.tests/app1") + .build(); + try (Context context1 = GraalPyResources.createContext(); + Context context2 = GraalPyResources.contextBuilder(vfs).build()) { + int index = 0; + for (Context ctx: new Context[] {context1, context2}) { + ctx.eval("python", "import hello"); + Value pyHelloClass = ctx.getPolyglotBindings().getMember("PyHello"); + Value pyHello = pyHelloClass.newInstance(); + Hello hello = pyHello.as(Hello.class); + System.out.print("" + index++ + ": "); + hello.hello("java"); + } + } + """) + + util.replace_in_file(os.path.join(app2_dir, "src", "main", "resources", "org.graalvm.python.vfs", "src", "hello.py"), + 'colored("hello "', 'colored("Hi there "') + + vfs_parent_dir = os.path.join(app1_dir, "src", "main", "resources", "GRAALPY-VFS", "org.graalvm.python.tests") + os.makedirs(vfs_parent_dir, exist_ok=True) + shutil.move(os.path.join(app1_dir, "src", "main", "resources", "org.graalvm.python.vfs"), os.path.join(vfs_parent_dir, "app1")) + + out, return_code = util.run_cmd(app1_mvnw_cmd + ['package', 'install'], self.env, cwd=app1_dir) + util.check_ouput("BUILD SUCCESS", out) + + cmd = app2_mvnw_cmd + ["package", "exec:java", "-Dexec.mainClass=app2.GraalPy"] + out, return_code = util.run_cmd(cmd, self.env, cwd=app2_dir) + util.check_ouput("0: Hi there java", out) + util.check_ouput("1: hello java", out) + assert return_code == 0, out + + cmd = app2_mvnw_cmd + ["-Pnative", "package"] + out, return_code = util.run_cmd(cmd, self.env, cwd=app2_dir) + assert return_code == 0, out + + out, return_code = util.run_cmd(os.path.join(app2_dir, "target", "app2"), self.env, cwd=app2_dir) + util.check_ouput("0: Hi there java", out) + util.check_ouput("1: hello java", out) + assert return_code == 0, out \ No newline at end of file diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/test_standalone.py b/graalpython/com.oracle.graal.python.test/src/tests/standalone/test_standalone.py index 310faf32da..827792754e 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/standalone/test_standalone.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/test_standalone.py @@ -38,898 +38,12 @@ # SOFTWARE. import os -import subprocess import tempfile import unittest -import urllib.parse -import shutil -import util -import sys -is_enabled = 'ENABLE_STANDALONE_UNITTESTS' in os.environ and os.environ['ENABLE_STANDALONE_UNITTESTS'] == "true" -is_gradle_enabled = 'ENABLE_GRADLE_STANDALONE_UNITTESTS' in os.environ and os.environ['ENABLE_GRADLE_STANDALONE_UNITTESTS'] == "true" - -GLOBAL_MVN_CMD = [shutil.which('mvn'), "--batch-mode"] -VFS_PREFIX = "org.graalvm.python.vfs" - -GRAALPY_EMPTY = "graalPy {}" - -GRAALPY_EMPTY_HOME = """ -graalPy { - pythonHome { } -} -""" - -def get_gp(): - graalpy = util.get_gp() - - java_home = os.environ["JAVA_HOME"] - ni = util.get_executable(os.path.join(java_home, "bin", "native-image")) - jc = util.get_executable(os.path.join(java_home, "bin", "javac")) - - if not os.path.isfile(jc) or not os.path.isfile(ni): - print( - "Standalone module tests require a GraalVM JDK.", - "Please point the JAVA_HOME environment variables properly.", - f"JAVA_HOME={java_home}", - "native-image exists: " + str(os.path.exists(ni)), - "javac exists: " + str(os.path.exists(jc)), - sep="\n", - ) - assert False - - print("Running tests for standalone module:") - print(" graalpy_home:", graalpy_home) - print(" graalpy :", graalpy) - print(" java_home :", java_home) - - return graalpy - -def replace_in_file(file, str, replace_str): - with open(file, "r") as f: - contents = f.read() - assert str in contents - with open(file, "w") as f: - f.write(contents.replace(str, replace_str)) - -def patch_properties_file(properties_file, distribution_url_override): - if distribution_url_override: - new_lines = [] - with(open(properties_file)) as f: - while line := f.readline(): - line.strip() - if not line.startswith("#") and "distributionUrl" in line: - new_lines.append(f"distributionUrl={distribution_url_override}\n") - else: - new_lines.append(line) - with(open(properties_file, "w")) as f: - f.writelines(new_lines) - -class PolyglotAppTestBase(unittest.TestCase): - def setUpClass(self): - if not is_enabled and not is_gradle_enabled: - return - - self.env = os.environ.copy() - self.env["PYLAUNCHER_DEBUG"] = "1" - - self.archetypeGroupId = "org.graalvm.python" - self.archetypeArtifactId = "graalpy-archetype-polyglot-app" - self.pluginArtifactId = "graalpy-maven-plugin" - self.graalvmVersion = util.get_graalvm_version() - - for custom_repo in os.environ.get("MAVEN_REPO_OVERRIDE", "").split(","): - url = urllib.parse.urlparse(custom_repo) - if url.scheme == "file": - jar = os.path.join( - url.path, - self.archetypeGroupId.replace(".", os.path.sep), - self.archetypeArtifactId, - self.graalvmVersion, - f"{self.archetypeArtifactId}-{self.graalvmVersion}.jar", - ) - pom = os.path.join( - url.path, - self.archetypeGroupId.replace(".", os.path.sep), - self.archetypeArtifactId, - self.graalvmVersion, - f"{self.archetypeArtifactId}-{self.graalvmVersion}.pom", - ) - cmd = GLOBAL_MVN_CMD + [ - "install:install-file", - f"-Dfile={jar}", - f"-DgroupId={self.archetypeGroupId}", - f"-DartifactId={self.archetypeArtifactId}", - f"-Dversion={self.graalvmVersion}", - "-Dpackaging=jar", - f"-DpomFile={pom}", - "-DcreateChecksum=true", - ] - out, return_code = util.run_cmd(cmd, self.env) - assert return_code == 0 - - jar = os.path.join( - url.path, - self.archetypeGroupId.replace(".", os.path.sep), - self.pluginArtifactId, - self.graalvmVersion, - f"{self.pluginArtifactId}-{self.graalvmVersion}.jar", - ) - - pom = os.path.join( - url.path, - self.archetypeGroupId.replace(".", os.path.sep), - self.pluginArtifactId, - self.graalvmVersion, - f"{self.pluginArtifactId}-{self.graalvmVersion}.pom", - ) - - cmd = GLOBAL_MVN_CMD + [ - "install:install-file", - f"-Dfile={jar}", - f"-DgroupId={self.archetypeGroupId}", - f"-DartifactId={self.pluginArtifactId}", - f"-Dversion={self.graalvmVersion}", - "-Dpackaging=jar", - f"-DpomFile={pom}", - "-DcreateChecksum=true", - ] - out, return_code = util.run_cmd(cmd, self.env) - assert return_code == 0 - break - -def append(file, txt): - with open(file, "a") as f: - f.write(txt) - -class PolyglotAppGradleTestBase(PolyglotAppTestBase): - def setUpClass(self): - super().setUpClass() - self.test_prj_path = os.path.join(os.path.dirname(__file__), "gradle", "gradle-test-project") - - def target_dir_name_sufix(self, target_dir): - pass - - def copy_build_files(self, target_dir): - pass - - def packages_termcolor(self, build_file): - pass - - def packages_termcolor_ujson(self): - pass - - def packages_termcolor_resource_dir(self, resources_dir): - pass - - def empty_home_includes(self): - pass - - def home_includes(self): - pass - - def empty_packages(self): - pass - - def generate_app(self, target_dir): - shutil.copytree(self.test_prj_path, target_dir) - for root, dirs, files in os.walk(target_dir): - for file in files: - if file.endswith(".j"): - shutil.move(os.path.join(root, file), os.path.join(root, file[0:len(file)- 1] + "java")) - - patch_properties_file(os.path.join(target_dir, "gradle", "wrapper", "gradle-wrapper.properties"), self.env.get("GRADLE_DISTRIBUTION_URL_OVERRIDE")) - - self.copy_build_files(target_dir) - - @unittest.skipUnless(is_gradle_enabled, "ENABLE_GRADLE_STANDALONE_UNITTESTS is not true") - def test_gradle_generated_app(self): - with tempfile.TemporaryDirectory() as tmpdir: - target_dir = os.path.join(str(tmpdir), "generated_app_gradle" + self.target_dir_name_sufix()) - self.generate_app(target_dir) - build_file = os.path.join(target_dir, self.build_file_name) - append(build_file, self.packages_termcolor()) - - gradlew_cmd = util.get_gradle_wrapper(target_dir, self.env) - - # build - cmd = gradlew_cmd + ["build"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, gradle = True) - util.check_ouput("BUILD SUCCESS", out) - - cmd = gradlew_cmd + ["nativeCompile"] - # gradle needs jdk <= 22, but it looks like the 'gradle nativeCompile' cmd does not complain if higher, - # which is fine, because we need to build the native binary with a graalvm build - # and the one we have set in JAVA_HOME is at least jdk24 - # => run without gradle = True - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) - util.check_ouput("BUILD SUCCESS", out) - - # check fileslist.txt - fl_path = os.path.join(target_dir, "build", "resources", "main", VFS_PREFIX, "fileslist.txt") - with open(fl_path) as f: - lines = f.readlines() - assert "/" + VFS_PREFIX + "/\n" in lines, "unexpected output from " + str(cmd) - assert "/" + VFS_PREFIX + "/home/\n" in lines, "unexpected output from " + str(cmd) - assert "/" + VFS_PREFIX + "/home/lib-graalpython/\n" in lines, "unexpected output from " + str(cmd) - assert "/" + VFS_PREFIX + "/home/lib-python/\n" in lines, "unexpected output from " + str(cmd) - - # execute and check native image - cmd = [os.path.join(target_dir, "build", "native", "nativeCompile", "graalpy-gradle-test-project")] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) - util.check_ouput("hello java", out) - - # import struct from python file triggers extract of native extension files in VirtualFileSystem - hello_src = os.path.join(target_dir, "src", "main", "resources", "org.graalvm.python.vfs", "src", "hello.py") - contents = open(hello_src, 'r').read() - with open(hello_src, 'w') as f: - f.write("import struct\n" + contents) - - # rebuild and exec - cmd = gradlew_cmd + ["build", "run"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, gradle = True) - util.check_ouput("BUILD SUCCESS", out) - util.check_ouput("hello java", out) - - #GR-51132 - NoClassDefFoundError when running polyglot app in java mode - util.check_ouput("java.lang.NoClassDefFoundError", out, False) - - @unittest.skipUnless(is_gradle_enabled, "ENABLE_GRADLE_STANDALONE_UNITTESTS is not true") - def test_gradle_generated_app_external_resources(self): - with tempfile.TemporaryDirectory() as tmpdir: - target_dir = os.path.join(str(tmpdir), "generated_gradle_app_external_resources" + self.target_dir_name_sufix()) - self.generate_app(target_dir) - build_file = os.path.join(target_dir, self.build_file_name) - - # patch project to use external directory for resources - resources_dir = os.path.join(target_dir, "python-resources") - os.makedirs(resources_dir, exist_ok=True) - src_dir = os.path.join(resources_dir, "src") - os.makedirs(src_dir, exist_ok=True) - # copy hello.py - shutil.copyfile(os.path.join(target_dir, "src", "main", "resources", "org.graalvm.python.vfs", "src", "hello.py"), os.path.join(src_dir, "hello.py")) - shutil.rmtree(os.path.join(target_dir, "src", "main", "resources", "org.graalvm.python.vfs")) - # patch GraalPy.java - replace_in_file(os.path.join(target_dir, "src", "main", "java", "org", "example", "GraalPy.java"), - "package org.example;", - "package org.example;\nimport java.nio.file.Path;") - replace_in_file(os.path.join(target_dir, "src", "main", "java", "org", "example", "GraalPy.java"), - "GraalPyResources.createContext()", - "GraalPyResources.contextBuilder(Path.of(\"python-resources\")).build()") - - # patch build.gradle - append(build_file, self.packages_termcolor_resource_dir(resources_dir)) - - # build - gradle_cmd = util.get_gradle_wrapper(target_dir, self.env) - - cmd = gradle_cmd + ["clean", "build"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, gradle = True) - util.check_ouput("BUILD SUCCESS", out) - - # gradle needs jdk <= 22, but it looks like the 'gradle nativeCompile' cmd does not complain if higher, - # which is fine, because we need to build the native binary with a graalvm build - # and the one we have set in JAVA_HOME is at least jdk24 - # => run without gradle = True - cmd = gradle_cmd + ["nativeCompile"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) - util.check_ouput("BUILD SUCCESS", out) - - # execute and check native image - cmd = [os.path.join(target_dir, "build", "native", "nativeCompile", "graalpy-gradle-test-project")] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) - util.check_ouput("hello java", out) - - # 2.) check java build and exec - cmd = gradle_cmd + ["run"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, gradle = True) - util.check_ouput("BUILD SUCCESS", out) - util.check_ouput("hello java", out) - - @unittest.skipUnless(is_gradle_enabled, "ENABLE_GRADLE_STANDALONE_UNITTESTS is not true") - def test_gradle_fail_without_graalpy_dep(self): - with tempfile.TemporaryDirectory() as tmpdir: - target_dir = os.path.join(str(tmpdir), "gradle_fail_without_graalpy_dep" + self.target_dir_name_sufix()) - self.generate_app(target_dir) - build_file = os.path.join(target_dir, self.build_file_name) - append(build_file, GRAALPY_EMPTY) - - gradle_cmd = util.get_gradle_wrapper(target_dir, self.env) - - replace_in_file(build_file, - "implementation(\"org.graalvm.python:python-community:24.2.0\")", - "// implementation(\"org.graalvm.python:python-community:24.2.0\")") - - cmd = gradle_cmd + ["graalPyResources"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, gradle = True) - util.check_ouput("Missing GraalPy dependency. Please add to your build.gradle either org.graalvm.polyglot:python-community or org.graalvm.polyglot:python", out) - - @unittest.skipUnless(is_gradle_enabled, "ENABLE_GRADLE_STANDALONE_UNITTESTS is not true") - def test_gradle_gen_launcher_and_venv(self): - with tempfile.TemporaryDirectory() as tmpdir: - target_dir = os.path.join(str(tmpdir), "gradle_gen_launcher_and_venv" + self.target_dir_name_sufix()) - self.generate_app(target_dir) - - build_file = os.path.join(target_dir, self.build_file_name) - - gradle_cmd = util.get_gradle_wrapper(target_dir, self.env) - - append(build_file, self.packages_termcolor_ujson()) - - cmd = gradle_cmd + ["graalPyResources"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, gradle = True) - util.check_ouput("-m venv", out) - util.check_ouput("-m ensurepip",out) - util.check_ouput("ujson", out) - util.check_ouput("termcolor", out) - - # run again and assert that we do not regenerate the venv - cmd = gradle_cmd + ["graalPyResources"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, gradle = True) - util.check_ouput("-m venv", out, False) - util.check_ouput("-m ensurepip", out, False) - util.check_ouput("ujson", out, False) - util.check_ouput("termcolor", out, False) - - # remove ujson pkg from plugin config and check if unistalled - self.copy_build_files(target_dir) - append(build_file, self.packages_termcolor()) - - cmd = gradle_cmd + ["graalPyResources"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, gradle = True) - util.check_ouput("-m venv", out, False) - util.check_ouput("-m ensurepip", out, False) - util.check_ouput("Uninstalling ujson", out) - util.check_ouput("termcolor", out, False) - - def check_tagfile(self, home, expected): - with open(os.path.join(home, "tagfile")) as f: - lines = f.readlines() - assert lines == expected, "expected tagfile " + str(expected) + ", but got " + str(lines) - - @unittest.skipUnless(is_gradle_enabled, "ENABLE_GRADLE_STANDALONE_UNITTESTS is not true") - def test_gradle_check_home(self): - with tempfile.TemporaryDirectory() as tmpdir: - target_dir = os.path.join(str(tmpdir), "check_home_test" + self.target_dir_name_sufix()) - self.generate_app(target_dir) - - build_file_template = os.path.join(os.path.dirname(__file__), "gradle", "build", self.build_file_name) - build_file = os.path.join(target_dir, self.build_file_name) - - gradle_cmd = util.get_gradle_wrapper(target_dir, self.env) - process_resources_cmd = gradle_cmd + ["graalPyResources"] - - # 1. process-resources with no pythonHome config - out, return_code = util.run_cmd(process_resources_cmd, self.env, cwd=target_dir, gradle = True) - util.check_ouput("BUILD SUCCESS", out) - util.check_ouput("Copying std lib to ", out) - - home_dir = os.path.join(target_dir, "build", "generated", "graalpy", "resources", VFS_PREFIX, "home") - assert os.path.exists(home_dir) - assert os.path.exists(os.path.join(home_dir, "lib-graalpython")) - assert os.path.isdir(os.path.join(home_dir, "lib-graalpython")) - assert os.path.exists(os.path.join(home_dir, "lib-python")) - assert os.path.isdir(os.path.join(home_dir, "lib-python")) - assert os.path.exists(os.path.join(home_dir, "tagfile")) - assert os.path.isfile(os.path.join(home_dir, "tagfile")) - self.check_tagfile(home_dir, [f'{self.graalvmVersion}\n', 'include:.*\n']) - - # 2. process-resources with empty pythonHome - self.copy_build_files(target_dir) - append(build_file, GRAALPY_EMPTY_HOME) - out, return_code = util.run_cmd(process_resources_cmd, self.env, cwd=target_dir, gradle = True) - util.check_ouput("BUILD SUCCESS", out) - util.check_ouput("Copying std lib to ", out, False) - self.check_tagfile(home_dir, [f'{self.graalvmVersion}\n', 'include:.*\n']) - - # 3. process-resources with empty pythonHome includes and excludes - self.copy_build_files(target_dir) - append(build_file, self.empty_home_includes()) - out, return_code = util.run_cmd(process_resources_cmd, self.env, cwd=target_dir, gradle = True) - util.check_ouput("BUILD SUCCESS", out) - util.check_ouput("Copying std lib to ", out, False) - self.check_tagfile(home_dir, [f'{self.graalvmVersion}\n', 'include:.*\n']) - - # 4. process-resources with pythonHome includes and excludes - self.copy_build_files(target_dir) - append(build_file, self.home_includes()) - out, return_code = util.run_cmd(process_resources_cmd, self.env, cwd=target_dir, gradle = True) - util.check_ouput("BUILD SUCCESS", out) - util.check_ouput("Deleting GraalPy home due to changed includes or excludes", out) - util.check_ouput("Copying std lib to ", out) - self.check_tagfile(home_dir, [f'{self.graalvmVersion}\n', 'include:.*__init__.py\n', 'exclude:.*html/__init__.py\n']) - - # 5. check fileslist.txt - # XXX build vs graalPyVFSFilesList task? - out, return_code = util.run_cmd(gradle_cmd + ["build"], self.env, cwd=target_dir, gradle = True) - util.check_ouput("BUILD SUCCESS", out) - fl_path = os.path.join(target_dir, "build", "resources", "main", VFS_PREFIX, "fileslist.txt") - with open(fl_path) as f: - for line in f: - line = f.readline() - # string \n - line = line[:len(line)-1] - if line.endswith("tagfile"): - continue - if not line.startswith("/" + VFS_PREFIX + "/home/") or line.endswith("/"): - continue - assert line.endswith("/__init__.py"), f"expected line to end with /__init__.py, but was '{line}'" - assert not line.endswith("html/__init__.py"), f"expected line to end with html/__init__.py, but was '{line}''" - - @unittest.skipUnless(is_gradle_enabled, "ENABLE_GRADLE_STANDALONE_UNITTESTS is not true") - def test_gradle_empty_packages(self): - with tempfile.TemporaryDirectory() as tmpdir: - target_dir = os.path.join(str(tmpdir), "empty_packages_test" + self.target_dir_name_sufix()) - self.generate_app(target_dir) - build_file = os.path.join(target_dir, self.build_file_name) - - append(build_file, self.empty_packages()) +from tests.standalone import util - gradle_cmd = util.get_gradle_wrapper(target_dir, self.env) - cmd = gradle_cmd + ["graalPyResources"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir, gradle = True) - util.check_ouput("BUILD SUCCESS", out) - -def print_file(file): - print("\n====", file, " ==========================================================================") - with open(file) as f: - while line := f.readline(): - if line.endswith("\n"): - line = line[:len(line) - 1] - print(line) - print("\n========================================================================================") - -class PolyglotAppGradleGroovyTest(PolyglotAppGradleTestBase): - - def setUpClass(self): - super().setUpClass() - self.build_file_name = "build.gradle" - self.settings_file_name = "settings.gradle" - - def target_dir_name_sufix(self): - return "_groovy" - - def copy_build_files(self, target_dir): - build_file = os.path.join(target_dir, self.build_file_name) - shutil.copyfile(os.path.join(os.path.dirname(__file__), "gradle", "build", self.build_file_name), build_file) - settings_file = os.path.join(target_dir, self.settings_file_name) - shutil.copyfile(os.path.join(os.path.dirname(__file__), "gradle", "build", self.settings_file_name), settings_file) - if custom_repos := os.environ.get("MAVEN_REPO_OVERRIDE"): - mvn_repos = "" - for idx, custom_repo in enumerate(custom_repos.split(",")): - mvn_repos += f"maven {{ url \"{custom_repo}\" }}\n " - replace_in_file(build_file, - "repositories {", f"repositories {{\n mavenLocal()\n {mvn_repos}") - replace_in_file(settings_file, - "repositories {", f"repositories {{\n {mvn_repos}") - - #print_file(build_file) - #print_file(settings_file) - - def packages_termcolor(self): - return """ -graalPy { - packages = ["termcolor"] -} -""" - - def packages_termcolor_ujson(self): - return """ -graalPy { - packages = ["termcolor", "ujson"] -} -""" - - def packages_termcolor_resource_dir(self, resources_dir): - resources_dir = resources_dir if 'win32' != sys.platform else resources_dir.replace("\\", "\\\\") - return f""" -graalPy {{ - packages = ["termcolor"] - pythonResourcesDirectory = file("{resources_dir}") -}} -""" - - def home_includes(self): - return """ -graalPy { - pythonHome { - includes = [".*__init__.py"] - excludes = [".*html/__init__.py"] - } -} -""" - - def empty_home_includes(self): - return """ -graalPy { - pythonHome { - includes = [] - excludes = [] - } -} -""" - - def empty_packages(self): - return """ -graalPy { - packages = [] -} -""" - -class PolyglotAppGradleKotlinTest(PolyglotAppGradleTestBase): - - def setUpClass(self): - super().setUpClass() - self.build_file_name = "build.gradle.kts" - self.settings_file_name = "settings.gradle.kts" - - def target_dir_name_sufix(self): - return "_kotlin" - - def copy_build_files(self, target_dir): - build_file = os.path.join(target_dir, self.build_file_name) - shutil.copyfile(os.path.join(os.path.dirname(__file__), "gradle", "build", self.build_file_name), build_file) - settings_file = os.path.join(target_dir, self.settings_file_name) - shutil.copyfile(os.path.join(os.path.dirname(__file__), "gradle", "build", self.settings_file_name), settings_file) - if custom_repos := os.environ.get("MAVEN_REPO_OVERRIDE"): - mvn_repos = "" - for idx, custom_repo in enumerate(custom_repos.split(",")): - mvn_repos += f"maven(url=\"{custom_repo}\")\n " - - replace_in_file(build_file, "repositories {", f"repositories {{\n mavenLocal()\n {mvn_repos}") - replace_in_file(settings_file, "repositories {", f"repositories {{\n {mvn_repos}") - - #print_file(build_file) - #print_file(settings_file) - - def packages_termcolor(self): - return """ -graalPy { - packages.add("termcolor") -} -""" - - def packages_termcolor_ujson(self): - return """ -graalPy { - packages.add("termcolor") - packages.add("ujson") -} -""" - - def packages_termcolor_resource_dir(self, resources_dir): - resources_dir = resources_dir if 'win32' != sys.platform else resources_dir.replace("\\", "\\\\") - return f""" -graalPy {{ - packages.add("termcolor") - pythonResourcesDirectory = file("{resources_dir}") -}} -""" - - def home_includes(self): - return """ -graalPy { - pythonHome { - includes.add(".*__init__.py") - excludes.add(".*html/__init__.py") - } -} -""" - - def empty_home_includes(self): - return """ -graalPy { - pythonHome { - includes - excludes - } -} -""" - - def empty_packages(self): - return """ -graalPy { - packages -} -""" - -class PolyglotAppTest(PolyglotAppTestBase): - - def generate_app(self, tmpdir, target_dir, target_name, pom_template=None): - cmd = GLOBAL_MVN_CMD + [ - "archetype:generate", - "-B", - f"-DarchetypeGroupId={self.archetypeGroupId}", - f"-DarchetypeArtifactId={self.archetypeArtifactId}", - f"-DarchetypeVersion={self.graalvmVersion}", - f"-DartifactId={target_name}", - "-DgroupId=archetype.it", - "-Dpackage=it.pkg", - "-Dversion=0.1-SNAPSHOT", - ] - out, return_code = util.run_cmd(cmd, self.env, cwd=str(tmpdir)) - util.check_ouput("BUILD SUCCESS", out) - - if pom_template: - shutil.copyfile(pom_template, os.path.join(target_dir, "pom.xml")) - - util.patch_pom_repositories(os.path.join(target_dir, "pom.xml")) - - mvnw_dir = os.path.join(os.path.dirname(__file__), "mvnw") - shutil.copy(os.path.join(mvnw_dir, "mvnw"), os.path.join(target_dir, "mvnw")) - shutil.copy(os.path.join(mvnw_dir, "mvnw.cmd"), os.path.join(target_dir, "mvnw.cmd")) - shutil.copytree(os.path.join(mvnw_dir, ".mvn"), os.path.join(target_dir, ".mvn")) - patch_properties_file(os.path.join(target_dir, ".mvn", "wrapper", "maven-wrapper.properties"), self.env.get("MAVEN_DISTRIBUTION_URL_OVERRIDE")) - - @unittest.skipUnless(is_enabled, "ENABLE_STANDALONE_UNITTESTS is not true") - def test_generated_app(self): - with tempfile.TemporaryDirectory() as tmpdir: - target_name = "generated_app_test" - target_dir = os.path.join(str(tmpdir), target_name) - self.generate_app(tmpdir, target_dir, target_name) - - mvnw_cmd = util.get_mvn_wrapper(target_dir, self.env) - - # build - cmd = mvnw_cmd + ["package", "-Pnative", "-DmainClass=it.pkg.GraalPy"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) - util.check_ouput("BUILD SUCCESS", out) - - # check fileslist.txt - fl_path = os.path.join(target_dir, "target", "classes", VFS_PREFIX, "fileslist.txt") - with open(fl_path) as f: - lines = f.readlines() - assert "/" + VFS_PREFIX + "/\n" in lines, "unexpected output from " + str(cmd) - assert "/" + VFS_PREFIX + "/home/\n" in lines, "unexpected output from " + str(cmd) - assert "/" + VFS_PREFIX + "/home/lib-graalpython/\n" in lines, "unexpected output from " + str(cmd) - assert "/" + VFS_PREFIX + "/home/lib-python/\n" in lines, "unexpected output from " + str(cmd) - - # execute and check native image - cmd = [os.path.join(target_dir, "target", target_name)] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) - util.check_ouput("hello java", out) - - # 2.) check java build and exec - # run with java asserts on - if self.env.get("MAVEN_OPTS"): - self.env["MAVEN_OPTS"] = self.env.get("MAVEN_OPTS") + " -ea -esa" - else: - self.env["MAVEN_OPTS"] = "-ea -esa" - - # import struct from python file triggers extract of native extension files in VirtualFileSystem - hello_src = os.path.join(target_dir, "src", "main", "resources", "org.graalvm.python.vfs", "src", "hello.py") - contents = open(hello_src, 'r').read() - with open(hello_src, 'w') as f: - f.write("import struct\n" + contents) - - # rebuild and exec - cmd = mvnw_cmd + ["package", "exec:java", "-Dexec.mainClass=it.pkg.GraalPy"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) - util.check_ouput("BUILD SUCCESS", out) - util.check_ouput("hello java", out) - - #GR-51132 - NoClassDefFoundError when running polyglot app in java mode - util.check_ouput("java.lang.NoClassDefFoundError", out, False) - - @unittest.skipUnless(is_enabled, "ENABLE_STANDALONE_UNITTESTS is not true") - def test_generated_app_external_resources(self): - with tempfile.TemporaryDirectory() as tmpdir: - target_name = "generated_app_ext_resources_test" - target_dir = os.path.join(str(tmpdir), target_name) - self.generate_app(tmpdir, target_dir, target_name) - - # patch project to use external directory for resources - resources_dir = os.path.join(target_dir, "python-resources") - os.makedirs(resources_dir, exist_ok=True) - src_dir = os.path.join(resources_dir, "src") - os.makedirs(src_dir, exist_ok=True) - # copy hello.py - shutil.copyfile(os.path.join(target_dir, "src", "main", "resources", "org.graalvm.python.vfs", "src", "hello.py"), os.path.join(src_dir, "hello.py")) - shutil.rmtree(os.path.join(target_dir, "src", "main", "resources", "org.graalvm.python.vfs")) - # patch GraalPy.java - replace_in_file(os.path.join(target_dir, "src", "main", "java", "it", "pkg", "GraalPy.java"), - "package it.pkg;", - "package it.pkg;\nimport java.nio.file.Path;") - replace_in_file(os.path.join(target_dir, "src", "main", "java", "it", "pkg", "GraalPy.java"), - "GraalPyResources.createContext()", - "GraalPyResources.contextBuilder(Path.of(\"python-resources\")).build()") - - # patch pom.xml - replace_in_file(os.path.join(target_dir, "pom.xml"), - "", - "${project.basedir}/python-resources\n") - - mvnw_cmd = util.get_mvn_wrapper(target_dir, self.env) - - # build - cmd = mvnw_cmd + ["package", "-Pnative", "-DmainClass=it.pkg.GraalPy"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) - util.check_ouput("BUILD SUCCESS", out) - - # execute and check native image - cmd = [os.path.join(target_dir, "target", target_name)] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) - util.check_ouput("hello java", out) - - # 2.) check java build and exec - # run with java asserts on - if self.env.get("MAVEN_OPTS"): - self.env["MAVEN_OPTS"] = self.env.get("MAVEN_OPTS") + " -ea -esa" - else: - self.env["MAVEN_OPTS"] = "-ea -esa" - - # build and exec - cmd = mvnw_cmd + ["package", "exec:java", "-Dexec.mainClass=it.pkg.GraalPy"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) - util.check_ouput("BUILD SUCCESS", out) - util.check_ouput("hello java", out) - - @unittest.skipUnless(is_enabled, "ENABLE_STANDALONE_UNITTESTS is not true") - def test_fail_without_graalpy_dep(self): - with tempfile.TemporaryDirectory() as tmpdir: - target_name = "fail_without_graalpy_dep_test" - target_dir = os.path.join(str(tmpdir), target_name) - pom_template = os.path.join(os.path.dirname(__file__), "fail_without_graalpy_dep_pom.xml") - self.generate_app(tmpdir, target_dir, target_name, pom_template) - - mvnw_cmd = util.get_mvn_wrapper(target_dir, self.env) - - cmd = mvnw_cmd + ["process-resources"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) - util.check_ouput("Missing GraalPy dependency. Please add to your pom either org.graalvm.polyglot:python-community or org.graalvm.polyglot:python", out) - - @unittest.skipUnless(is_enabled, "ENABLE_STANDALONE_UNITTESTS is not true") - def test_gen_launcher_and_venv(self): - with tempfile.TemporaryDirectory() as tmpdir: - target_name = "gen_launcher_and_venv_test" - target_dir = os.path.join(str(tmpdir), target_name) - pom_template = os.path.join(os.path.dirname(__file__), "prepare_venv_pom.xml") - self.generate_app(tmpdir, target_dir, target_name, pom_template) - - mvnw_cmd = util.get_mvn_wrapper(target_dir, self.env) - - cmd = mvnw_cmd + ["process-resources"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) - util.check_ouput("-m venv", out) - util.check_ouput("-m ensurepip",out) - util.check_ouput("ujson", out) - util.check_ouput("termcolor", out) - - # run again and assert that we do not regenerate the venv - cmd = mvnw_cmd + ["process-resources"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) - util.check_ouput("-m venv", out, False) - util.check_ouput("-m ensurepip", out, False) - util.check_ouput("ujson", out, False) - util.check_ouput("termcolor", out, False) - - # remove ujson pkg from plugin config and check if unistalled - replace_in_file(os.path.join(target_dir, "pom.xml"), "ujson", "") - - cmd = mvnw_cmd + ["process-resources"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) - util.check_ouput("-m venv", out, False) - util.check_ouput("-m ensurepip", out, False) - util.check_ouput("Uninstalling ujson", out) - util.check_ouput("termcolor", out, False) - - def check_tagfile(self, target_dir, expected): - with open(os.path.join(target_dir, "target", "classes", VFS_PREFIX, "home", "tagfile")) as f: - lines = f.readlines() - assert lines == expected, "expected tagfile " + str(expected) + ", but got " + str(lines) - - @unittest.skipUnless(is_enabled, "ENABLE_STANDALONE_UNITTESTS is not true") - def test_check_home(self): - with tempfile.TemporaryDirectory() as tmpdir: - target_name = "check_home_test" - target_dir = os.path.join(str(tmpdir), target_name) - pom_template = os.path.join(os.path.dirname(__file__), "check_home_pom.xml") - self.generate_app(tmpdir, target_dir, target_name, pom_template) - - mvnw_cmd = util.get_mvn_wrapper(target_dir, self.env) - - # 1. process-resources with no pythonHome config - process_resources_cmd = mvnw_cmd + ["process-resources"] - out, return_code = util.run_cmd(process_resources_cmd, self.env, cwd=target_dir) - util.check_ouput("BUILD SUCCESS", out) - util.check_ouput("Copying std lib to ", out) - - home_dir = os.path.join(target_dir, "target", "classes", VFS_PREFIX, "home") - assert os.path.exists(home_dir) - assert os.path.exists(os.path.join(home_dir, "lib-graalpython")) - assert os.path.isdir(os.path.join(home_dir, "lib-graalpython")) - assert os.path.exists(os.path.join(home_dir, "lib-python")) - assert os.path.isdir(os.path.join(home_dir, "lib-python")) - assert os.path.exists(os.path.join(home_dir, "tagfile")) - assert os.path.isfile(os.path.join(home_dir, "tagfile")) - self.check_tagfile(target_dir, [f'{self.graalvmVersion}\n', 'include:.*\n']) - - # 2. process-resources with empty pythonHome includes and excludes - shutil.copyfile(pom_template, os.path.join(target_dir, "pom.xml")) - util.patch_pom_repositories(os.path.join(target_dir, "pom.xml")) - replace_in_file(os.path.join(target_dir, "pom.xml"), "", "") - out, return_code = util.run_cmd(process_resources_cmd, self.env, cwd=target_dir) - util.check_ouput("BUILD SUCCESS", out) - util.check_ouput("Copying std lib to ", out, False) - self.check_tagfile(target_dir, [f'{self.graalvmVersion}\n', 'include:.*\n']) - - shutil.copyfile(pom_template, os.path.join(target_dir, "pom.xml")) - util.patch_pom_repositories(os.path.join(target_dir, "pom.xml")) - replace_in_file(os.path.join(target_dir, "pom.xml"), "", "") - out, return_code = util.run_cmd(process_resources_cmd, self.env, cwd=target_dir) - util.check_ouput("BUILD SUCCESS", out) - util.check_ouput("Copying std lib to ", out, False) - self.check_tagfile(target_dir, [f'{self.graalvmVersion}\n', 'include:.*\n']) - - shutil.copyfile(pom_template, os.path.join(target_dir, "pom.xml")) - util.patch_pom_repositories(os.path.join(target_dir, "pom.xml")) - home_tag = """ - - - - - - - - - - - """ - replace_in_file(os.path.join(target_dir, "pom.xml"), "", home_tag + "") - out, return_code = util.run_cmd(process_resources_cmd, self.env, cwd=target_dir) - util.check_ouput("BUILD SUCCESS", out) - util.check_ouput("Copying std lib to ", out, False) - self.check_tagfile(target_dir, [f'{self.graalvmVersion}\n', 'include:.*\n']) - - # 3. process-resources with pythonHome includes and excludes - home_tag = """ - - - .*__init__\.py - - - .*html/__init__\.py - - - """ - replace_in_file(os.path.join(target_dir, "pom.xml"), "", home_tag + "") - out, return_code = util.run_cmd(process_resources_cmd, self.env, cwd=target_dir) - util.check_ouput("BUILD SUCCESS", out) - util.check_ouput("Deleting GraalPy home due to changed includes or excludes", out) - util.check_ouput("Copying std lib to ", out) - self.check_tagfile(target_dir, [f'{self.graalvmVersion}\n', 'include:.*__init__\\.py\n', 'exclude:.*html/__init__\\.py\n']) - - # 4. check fileslist.txt - fl_path = os.path.join(target_dir, "target", "classes", VFS_PREFIX, "fileslist.txt") - with open(fl_path) as f: - for line in f: - line = f.readline() - # string \n - line = line[:len(line)-1] - if not line.startswith("/" + VFS_PREFIX + "/home/") or line.endswith("/"): - continue - assert line.endswith("/__init__.py") - assert not line.endswith("html/__init__.py") - - @unittest.skipUnless(is_enabled, "ENABLE_STANDALONE_UNITTESTS is not true") - def test_empty_packages(self): - with tempfile.TemporaryDirectory() as tmpdir: - target_name = "empty_packages_test" - target_dir = os.path.join(str(tmpdir), target_name) - pom_template = os.path.join(os.path.dirname(__file__), "check_packages_pom.xml") - self.generate_app(tmpdir, target_dir, target_name, pom_template) - - mvnw_cmd = util.get_mvn_wrapper(target_dir, self.env) - - cmd = mvnw_cmd + ["process-resources"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) - util.check_ouput("BUILD SUCCESS", out) - - replace_in_file(os.path.join(target_dir, "pom.xml"), "", " ") - - cmd = mvnw_cmd + ["process-resources"] - out, return_code = util.run_cmd(cmd, self.env, cwd=target_dir) - util.check_ouput("BUILD SUCCESS", out) +is_enabled = 'ENABLE_STANDALONE_UNITTESTS' in os.environ and os.environ['ENABLE_STANDALONE_UNITTESTS'] == "true" @unittest.skipUnless(is_enabled, "ENABLE_STANDALONE_UNITTESTS is not true") def test_native_executable_one_file(): @@ -949,8 +63,9 @@ def test_native_executable_one_file(): target_file = os.path.join(tmpdir, "hello") cmd = [graalpy, "-m", "standalone", "--verbose", "native", "-ce", "-m", source_file, "-o", target_file] - out, return_code = util.run_cmd(cmd, env) + out, return_code = util.run_cmd(cmd, env, print_out=True) util.check_ouput("Bundling Python resources into", out) + util.check_ouput("Finished generating 'hello' in", out) cmd = [target_file, "arg1", "arg2"] out, return_code = util.run_cmd(cmd, env) @@ -986,6 +101,7 @@ def test_native_executable_venv_and_one_file(): cmd = [graalpy, "-m", "standalone", "--verbose", "native", "-ce", "-Os", "-m", source_file, "--venv", venv_dir, "-o", target_file] out, return_code = util.run_cmd(cmd, env) util.check_ouput("Bundling Python resources into", out) + util.check_ouput("Finished generating 'hello' in", out) cmd = [target_file] out, return_code = util.run_cmd(cmd, env) @@ -1019,9 +135,8 @@ def test_native_executable_module(): cmd = [graalpy, "-m", "standalone", "--verbose", "native", "-ce", "-Os", "-m", module_dir, "-o", target_file] out, return_code = util.run_cmd(cmd, env) util.check_ouput("Bundling Python resources into", out) + util.check_ouput("Finished generating 'hello' in", out) cmd = [target_file] out, return_code = util.run_cmd(cmd, env) util.check_ouput("hello standalone world", out) - -unittest.skip_deselected_test_functions(globals()) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/standalone/util.py b/graalpython/com.oracle.graal.python.test/src/tests/standalone/util.py index ab6ff02970..dddc90bb01 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/standalone/util.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/standalone/util.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -41,42 +41,175 @@ import shutil import subprocess import sys +import unittest +import urllib.parse +import tempfile +from abc import ABC, abstractmethod +from typing import Optional MAVEN_VERSION = "3.9.8" +GLOBAL_MVN_CMD = [shutil.which('mvn'), "--batch-mode"] + GRADLE_VERSION = "8.9" -def run_cmd(cmd, env, cwd=None, print_out=False, gradle=False): +DEFAULT_VFS_PREFIX = "org.graalvm.python.vfs" + +is_maven_plugin_test_enabled = 'ENABLE_MAVEN_PLUGIN_UNITTESTS' in os.environ and os.environ['ENABLE_MAVEN_PLUGIN_UNITTESTS'] == "true" +is_maven_plugin_long_running_test_enabled = 'ENABLE_MAVEN_PLUGIN_LONG_RUNNING_UNITTESTS' in os.environ and os.environ['ENABLE_MAVEN_PLUGIN_LONG_RUNNING_UNITTESTS'] == "true" +is_gradle_plugin_test_enabled = 'ENABLE_GRADLE_PLUGIN_UNITTESTS' in os.environ and os.environ['ENABLE_GRADLE_PLUGIN_UNITTESTS'] == "true" +is_gradle_plugin_long_running_test_enabled = 'ENABLE_GRADLE_PLUGIN_LONG_RUNNING_UNITTESTS' in os.environ and os.environ['ENABLE_GRADLE_PLUGIN_LONG_RUNNING_UNITTESTS'] == "true" + +class TemporaryTestDirectory(): + def __init__(self): + if 'GRAALPY_UNITTESTS_TMPDIR_NO_CLEAN' in os.environ: + self.ctx = None + self.name = tempfile.mkdtemp() + print(f"Running test in {self.name}") + else: + self.ctx = tempfile.TemporaryDirectory() + self.name = self.ctx.name + + def __enter__(self): + return self.name + + def __exit__(self, exc_type, exc_val, exc_tb): + if self.ctx: + self.ctx.__exit__(exc_type, exc_val, exc_tb) + +class LoggerBase(ABC): + def log_block(self, name, text): + self.log("=" * 80) + self.log(f"==> {name}:") + self.log(text) + self.log("=" * 80) + + @abstractmethod + def log(self, msg, newline=True): + pass + +class Logger(LoggerBase): + def __init__(self): + self.data = '' + + def log(self, msg, newline=True): + self.data += msg + ('\n' if newline else '') + + def __str__(self): + two_lines = ("=" * 80 + "\n") * 2 + return two_lines + "Test execution log:\n" + self.data + "\n" + two_lines + +class NullLogger(LoggerBase): + def log(self, msg, newline=True): + pass + +class StdOutLogger(LoggerBase): + def __init__(self, delegate:LoggerBase): + self.delegate = delegate + + def log(self, msg, newline=True): + print(msg) + self.delegate.log(msg, newline=newline) + + +class BuildToolTestBase(unittest.TestCase): + @classmethod + def setUpClass(cls): + if (not is_maven_plugin_test_enabled and not is_gradle_plugin_test_enabled + and not is_maven_plugin_long_running_test_enabled and not is_gradle_plugin_long_running_test_enabled): + return + + cls.env = os.environ.copy() + cls.env["PYLAUNCHER_DEBUG"] = "1" + + cls.archetypeGroupId = "org.graalvm.python" + cls.archetypeArtifactId = "graalpy-archetype-polyglot-app" + cls.pluginArtifactId = "graalpy-maven-plugin" + cls.graalvmVersion = get_graalvm_version() + + for custom_repo in os.environ.get("MAVEN_REPO_OVERRIDE", "").split(","): + url = urllib.parse.urlparse(custom_repo) + if url.scheme == "file": + jar = os.path.join( + urllib.parse.unquote(url.path), + cls.archetypeGroupId.replace(".", os.path.sep), + cls.archetypeArtifactId, + cls.graalvmVersion, + f"{cls.archetypeArtifactId}-{cls.graalvmVersion}.jar", + ) + pom = os.path.join( + urllib.parse.unquote(url.path), + cls.archetypeGroupId.replace(".", os.path.sep), + cls.archetypeArtifactId, + cls.graalvmVersion, + f"{cls.archetypeArtifactId}-{cls.graalvmVersion}.pom", + ) + cmd = GLOBAL_MVN_CMD + [ + "install:install-file", + f"-Dfile={jar}", + f"-DgroupId={cls.archetypeGroupId}", + f"-DartifactId={cls.archetypeArtifactId}", + f"-Dversion={cls.graalvmVersion}", + "-Dpackaging=jar", + f"-DpomFile={pom}", + "-DcreateChecksum=true", + ] + out, return_code = run_cmd(cmd, cls.env) + assert return_code == 0, out + + jar = os.path.join( + urllib.parse.unquote(url.path), + cls.archetypeGroupId.replace(".", os.path.sep), + cls.pluginArtifactId, + cls.graalvmVersion, + f"{cls.pluginArtifactId}-{cls.graalvmVersion}.jar", + ) + + pom = os.path.join( + urllib.parse.unquote(url.path), + cls.archetypeGroupId.replace(".", os.path.sep), + cls.pluginArtifactId, + cls.graalvmVersion, + f"{cls.pluginArtifactId}-{cls.graalvmVersion}.pom", + ) + + cmd = GLOBAL_MVN_CMD + [ + "install:install-file", + f"-Dfile={jar}", + f"-DgroupId={cls.archetypeGroupId}", + f"-DartifactId={cls.pluginArtifactId}", + f"-Dversion={cls.graalvmVersion}", + "-Dpackaging=jar", + f"-DpomFile={pom}", + "-DcreateChecksum=true", + ] + out, return_code = run_cmd(cmd, cls.env) + assert return_code == 0, out + break + +def run_cmd(cmd, env, cwd=None, print_out=False, logger:LoggerBase=NullLogger()): + if print_out: + logger = StdOutLogger(logger) out = [] out.append(f"Executing:\n {cmd=}\n") - prev_java_home = None - if gradle: - gradle_java_home = env.get("GRADLE_JAVA_HOME") - assert gradle_java_home, "in order to run standalone gradle tests, the 'GRADLE_JAVA_HOME' env var has to be set to a jdk <= 22" - prev_java_home = env["JAVA_HOME"] - env["JAVA_HOME"] = env["GRADLE_JAVA_HOME"] - try: - process = subprocess.Popen(cmd, env=env, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, text=True, errors='backslashreplace') - if print_out: - print("============== output =============") - for line in iter(process.stdout.readline, ""): - out.append(line) - if print_out: - print(line, end="") - if print_out: - print("\n========== end of output ==========") - return "".join(out), process.wait() - finally: - if prev_java_home: - env["JAVA_HOME"] = prev_java_home - -def check_ouput(txt, out, contains=True): + logger.log(f"Executing command: {' '.join(cmd)}") + process = subprocess.Popen(cmd, env=env, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, text=True, errors='backslashreplace') + for line in iter(process.stdout.readline, ""): + out.append(line) + out_str = "".join(out) + logger.log_block("output", out_str) + return out_str, process.wait() + +def check_ouput(txt, out, contains=True, logger: Optional[LoggerBase] =None): + # if logger is passed, we assume that it already contains the output if contains and txt not in out: - print_output(out, f"expected '{txt}' in output") - assert False + if not logger: + print_output(out, f"expected '{txt}' in output") + assert False, f"expected '{txt}' in output. \n{logger}" elif not contains and txt in out: - print_output(out, f"did not expect '{txt}' in output") - assert False + if not logger: + print_output(out, f"did not expect '{txt}' in output") + assert False, f"did not expect '{txt}' in output. {logger}" def print_output(out, err_msg=None): print("============== output =============") @@ -94,12 +227,15 @@ def get_mvn_wrapper(project_dir, env): check_ouput(MAVEN_VERSION, out) return mvn_cmd -def get_gradle_wrapper(project_dir, env): +def get_gradle_wrapper(project_dir, env, verbose=True): gradle_cmd = [os.path.abspath(os.path.join(project_dir, "gradlew" if 'win32' != sys.platform else "gradlew.bat"))] cmd = gradle_cmd + ["--version"] out, return_code = run_cmd(cmd, env, cwd=project_dir) check_ouput(GRADLE_VERSION, out) - return gradle_cmd + if verbose: + return gradle_cmd + ["-i"] + else: + return gradle_cmd def get_gp(): if "PYTHON_STANDALONE_HOME" not in os.environ: @@ -122,7 +258,8 @@ def print_missing_graalpy_msg(graalpy_home=None): sep="\n") def get_graalvm_version(): - graalvmVersion, _ = run_cmd([get_gp(), "-c", "print(__graalpython__.get_graalvm_version(), end='')"], os.environ.copy()) + if not (graalvmVersion := os.environ.get("GRAAL_VERSION")): + graalvmVersion, _ = run_cmd([get_gp(), "-c", "print(__graalpython__.get_graalvm_version(), end='')"], os.environ.copy()) # when JLine is cannot detect a terminal, it prints logging info graalvmVersion = graalvmVersion.split("\n")[-1] # we never test -dev versions here, we always pretend to use release versions @@ -183,4 +320,34 @@ def patch_pom_repositories(pom): """ + '\n'.join(pluginRepos) + """ - """)) \ No newline at end of file + """)) + +def replace_in_file(file, str, replace_str): + with open(file, "r") as f: + contents = f.read() + assert str in contents, f"cannot find '{str}' in file '{file}' with contents:\n {contents}\n------" + with open(file, "w") as f: + f.write(contents.replace(str, replace_str)) + + +def replace_main_body(filename, new_main_body): + with open(filename, "r") as f: + lines = f.readlines() + with open(filename, "w") as f: + for l in lines: + f.write(l) + if 'public static void main(String[] args) {' in l: + break + f.write(new_main_body) + f.write(' }\n') + f.write('}\n') + + +def override_gradle_properties_file(gradle_project_root): + if override_file:=os.environ.get('GRADLE_PROPERTIES_OVERRIDE'): + shutil.copy(override_file, os.path.join(gradle_project_root, "gradle", "wrapper", "gradle-wrapper.properties")) + + +def override_maven_properties_file(maven_project_root): + if override_file:=os.environ.get('MAVEN_PROPERTIES_OVERRIDE'): + shutil.copy(override_file, os.path.join(maven_project_root, ".mvn", "wrapper", "maven-wrapper.properties")) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test__class__.py b/graalpython/com.oracle.graal.python.test/src/tests/test__class__.py index b388a318d3..c90d28344d 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test__class__.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test__class__.py @@ -48,7 +48,8 @@ def find_code_object(t): class BasicTests(unittest.TestCase): - def tearDownClass(self): + @classmethod + def tearDownClass(cls): nonlocal __class__ __class__ = BasicTests diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_annotations.py b/graalpython/com.oracle.graal.python.test/src/tests/test_annotations.py index 3a9fd16e58..3ae5d55356 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_annotations.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_annotations.py @@ -1,4 +1,4 @@ -# Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -38,7 +38,7 @@ # SOFTWARE. def test_module_with(): - import annotations.withannotations as m + import tests.annotations.withannotations as m a = m.__annotations__ assert int == a['j'] @@ -46,7 +46,7 @@ def test_module_with(): def test_function_withouth(): - import annotations.annotatedFunctions as m + import tests.annotations.annotatedFunctions as m assert len(m.noAnnotation1.__annotations__) == 0 assert len(m.noAnnotation2.__annotations__) == 0 @@ -54,7 +54,7 @@ def test_function_withouth(): assert len(m.noAnnotation4.__annotations__) == 0 def test_function_with(): - import annotations.annotatedFunctions as m + import tests.annotations.annotatedFunctions as m assert len(m.withAnnotation1.__annotations__) == 1 assert int == m.withAnnotation1.__annotations__['j'] @@ -71,26 +71,26 @@ def test_function_with(): assert len(m.withAnnotation3.__annotations__) == 3 def test_wrongTypeInFunction(): - import annotations.annotatedFunctions as m + import tests.annotations.annotatedFunctions as m assert m.wrongTypeInside() == 0 assert len(m.wrongTypeInside.__annotations__) == 0 def test_decoratedMethod(): - import annotations.annotatedClasses as m + import tests.annotations.annotatedClasses as m assert len(m.DecoratedMethodClass.method.__annotations__) == 1, "__annotations__ attribute was not found" assert int == m.DecoratedMethodClass.method.__annotations__['index'] def test_decoratedClassMethod(): - import annotations.annotatedClasses as m + import tests.annotations.annotatedClasses as m assert len(m.ClsWithClassMethod.method.__annotations__) == 1, "__annotations__ attribute was not found" assert str == m.ClsWithClassMethod.method.__annotations__['string'] def test_addAnnotation(): - import annotations.annotatedFunctions as m + import tests.annotations.annotatedFunctions as m assert hasattr(m.addAnnotation, '__annotations__') assert len(m.addAnnotation.__annotations__) == 1 @@ -100,7 +100,7 @@ def test_addAnnotation(): assert 10 == m.addAnnotation.__annotations__['myKey'] def test_annotatedAssignments(): - import annotations.annotatedAssignments as m + import tests.annotations.annotatedAssignments as m assert m.slice_no_assign_count == 4 assert m.slice_assign_count == 4 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_ast.py b/graalpython/com.oracle.graal.python.test/src/tests/test_ast.py index e00a48affb..c925dce6bc 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_ast.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_ast.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -181,6 +181,9 @@ def test_unparse_bytes_constant_kind(self): exec(compile(tree, '', 'exec'), vars) self.assertEqual("u'abc'", vars['f'].__annotations__['x']) + def test_parse_unicode(self): + self.assertEqual(ast.parse("𝕦𝕟𝕚𝕔𝕠𝕕𝕖").body[0].value.id, 'unicode') + if __name__ == '__main__': unittest.main() diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_binary_arithmetic.py b/graalpython/com.oracle.graal.python.test/src/tests/test_binary_arithmetic.py index ab2510dd49..c4e64727dc 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_binary_arithmetic.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_binary_arithmetic.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2023, Oracle and/or its affiliates. +# Copyright (c) 2018, 2024, Oracle and/or its affiliates. # Copyright (c) 2013, Regents of the University of California # # All rights reserved. @@ -321,10 +321,8 @@ def __pow__(self, power): else: assert False - if sys.version_info.minor >= 8: - # for some reason this hangs CPython on the CI even if it's just parsed - from pow_tests import test_pow - test_pow() + from tests.pow_tests import test_pow + test_pow() # Needs to run multiple times to invoke the cached node too def call_rpow(x): diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_code.py b/graalpython/com.oracle.graal.python.test/src/tests/test_code.py index 7f6eb939bc..6409395af3 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_code.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_code.py @@ -36,6 +36,7 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +import os def a_function(): @@ -75,11 +76,11 @@ def test_name(): def test_filename(): - assert a_function.__code__.co_filename.rpartition("/")[2] == "test_code.py" + assert a_function.__code__.co_filename.rpartition(os.sep)[2] == "test_code.py" def test_firstlineno(): - assert a_function.__code__.co_firstlineno == 41 + assert a_function.__code__.co_firstlineno == 42 def test_code_attributes(): @@ -94,7 +95,7 @@ def test_code_attributes(): assert set(code.co_varnames) == {'arg_l', 'kwarg_case', 'kwarg_other', 'loc_1', 'loc_3', 'inner_func'} assert code.co_filename.endswith("test_code.py") assert code.co_name == "my_func" - assert code.co_firstlineno == 51 + assert code.co_firstlineno == 52 assert set(code.co_freevars) == {'values'} assert set(code.co_cellvars) == {'kwarg_other', 'loc_2'} @@ -144,20 +145,25 @@ def test_code_copy(): def test_module_code(): - m = __import__('package.moduleA') - with open(m.__file__, 'r') as MODULE: - source = MODULE.read() - code = compile(source, m.__file__, 'exec') - assert code.co_argcount == 0 - assert code.co_kwonlyargcount == 0 - assert code.co_nlocals == 0 - assert {'PACKAGE DOC', 'after importing moduleY'}.issubset(set(code.co_consts)) - assert set(code.co_varnames) == set() - assert code.co_filename.endswith("__init__.py") - assert code.co_name.startswith("= l(1) + assert (l(0) >= l(1)) == False + assert l(2) > l(1) + assert (l(1) > l(1)) == False + + assert l(1,2,1).count(1) == 2 + + al = l(1,2,3,4) + del al[3] + assert al == [1,2,3] + del al[0] + assert al == [2,3] + al = l(1,2,3,4) + del al[1:3] + assert al == [1,4] + + al.__init__() + assert al == [] + al.__init__([1, 2]) + assert al == [1, 2], al + al.__init__((i for i in [3,4])) + assert al == [3, 4] + al.__init__("ab") + assert al == ["a", "b"] + + al.__init__([1, 2]) + copy = al.copy() + assert copy == [1, 2] + assert type(copy) == list, type(copy) + + al = l(1,2,3) + al.insert(1, 7) + assert al == [1,7,2,3] + al.insert(-1, 8) + assert al == [1,7,2,8,3], al + + # Ensure al.remove() is list.remove and not ArrayList#remove + self.assertEqual(list.remove.__get__(al), al.remove) + # Use values which would throw if ArrayList#remove is used + al.remove(8) + al.remove(7) + assert al == [1,2,3] + + assert al.pop() == 3 + assert al == [1,2] + assert al.pop(0) == 1 + assert al == [2] + + al = l(1,2,3) + assert 2 in al + assert (42 in al) == False + + assert al.index(3) == 2 + self.assertRaises(ValueError, lambda: al.index(42)) + assert al.index(2, 0, 2) == 1 + self.assertRaises(ValueError, lambda: al.index(2, 0, 1)) + + al = l(4,1,3,2) + al.sort() # to avoid conflict with ArrayList#sort + assert al == [1,2,3,4] + + assert l(1,2) * 0 == [] + assert l(1,2) * 3 == [1,2,1,2,1,2] + assert 3 * l(1,2) == [1,2,1,2,1,2] + al = l(1,2) + al *= 3 + assert al == [1,2,1,2,1,2] + + al = l(1,2,3) + r = list(reversed(al)) + assert r == [3,2,1], r + assert [e for e in reversed(al)] == [3,2,1] + assert [e for e in al] == [1,2,3] + + # AssertionError: "descriptor requires a 'dict' object but received a 'ForeignDict'" does not match "object.__new__(ForeignDict) is not safe, use ForeignDict.__new__()" + @unittest.skipIf(os.environ.get('BYTECODE_DSL_INTERPRETER'), "TODO: bug in comment above") + def test_java_map(self): + from java.util import HashMap + h = HashMap() + h[1] = 2 + + assert isinstance(h, dict) + assert dict in type(h).mro() + self.assertEqual([polyglot.ForeignDict, dict, polyglot.ForeignObject, object], type(h).mro()) + assert repr(h) == repr({1: 2}) + assert str(h) == str({1: 2}), str(h) + assert h + + assert h[1] == 2 + with self.assertRaisesRegex(KeyError, '42'): + h[42] + + assert len(h) == 1 + + self.assertEqual([1], [k for k in h]) + + del h[1] + assert not h + assert len(h) == 0 + + h[1] = 2 + assert h.pop(1) == 2 + assert h.pop(42, 43) == 43 + + h[1] = 2 + assert h.setdefault(3, 4) == 4 + assert h.setdefault(1, 42) == 2 + self.assertEqual('{1: 2, 3: 4}', repr(h)) + + h.clear() + assert not h + assert len(h) == 0 + self.assertEqual('{}', repr(h)) + + h[1] = 2 + assert 1 in h + assert 2 not in h + + assert h == {1: 2} + assert {1: 2} == h + assert not (h == {}) + assert not ({} == h) + + assert h != {} + assert {} != h + assert not (h != {1: 2}) + assert not ({1: 2} != h) + + self.assertRaises(TypeError, lambda: h < {}) + self.assertRaises(TypeError, lambda: {} < h) + self.assertRaises(TypeError, lambda: h <= {}) + self.assertRaises(TypeError, lambda: {} <= h) + self.assertRaises(TypeError, lambda: h >= {}) + self.assertRaises(TypeError, lambda: {} >= h) + self.assertRaises(TypeError, lambda: h > {}) + self.assertRaises(TypeError, lambda: {} > h) + + assert (h | {3: 4}) == {1: 2, 3: 4} + assert type(h | {3: 4}) == dict + assert ({-1: 0} | h) == {-1: 0, 1: 2} + + h |= {3: 4} + assert h == {1: 2, 3: 4} + h |= {1: 42, 3: 5} + assert h == {1: 42, 3: 5} + + with self.assertRaisesRegex(TypeError, 'foreign object cannot be iterated in reverse'): + reversed(h) + + copy = h.copy() + assert copy is not h + assert copy == h + assert h == copy + + assert h.get(1) == 42 + assert h.get(1, "missing") == 42 + assert h.get(14, "missing") == "missing" + assert h.get(14) == None + + h.clear() + h |= {1: 2, 3: 4} + + self.assertEqual([1, 3], list(h.keys())) + self.assertEqual([2, 4], list(h.values())) + self.assertEqual([(1, 2), (3, 4)], list(h.items())) + + with self.assertRaisesRegex(TypeError, 'foreign object cannot be iterated in reverse'): + h.popitem() + + h.clear() + h.update({ 5: 6, 7: 8 }) + assert h == { 5: 6, 7: 8 } + h.update({ 5: 66 }) + assert h == { 5: 66, 7: 8 } + h.update(h) + assert h == { 5: 66, 7: 8 } + d = {} + d.update(h) + assert d == { 5: 66, 7: 8 }, d + + h.clear() + h.__init__({1: 2, 3: 4}) + assert h == {1: 2, 3: 4} + h.__init__({3: 42, 5: 6}) + assert h == {1: 2, 3: 42, 5: 6} + + d = {} + d.__init__(a=1, b=2) + assert d == {'a': 1, 'b': 2} + + h.clear() + h.__init__(a=1, b=2) + assert h == {'a': 1, 'b': 2} + + # Because it tries to call ForeignDict.__call__, but ForeignDict is not executable/instantiable, + # so it resolves to type.__call__, which cannot create a ForeignDict + self.assertRaises(TypeError, lambda: type(h).fromkeys(['a', 'b'], 42)) + + def test_java_iterator(self): + from java.util import ArrayList, LinkedHashSet + + s = LinkedHashSet() # not hasArrayElements() and not hasHashEntries() + s.add(1) + s.add(2) + itr1 = s.iterator() + itr2 = iter(s) + + l = ArrayList() + l.extend([1, 2]) + itr3 = l.iterator() # call Java iterator(), iter(l) would call list.__iter__() and return a Python iterator + + for itr in [itr1, itr2, itr3]: + iterator_type = type(iter([])) + assert isinstance(itr, iterator_type) + assert iterator_type in type(itr).mro() + self.assertEqual([polyglot.ForeignIterator, iterator_type, polyglot.ForeignObject, object], type(itr).mro()) + assert ' wrap("A") + assert wrap("A") < "B" + assert "B" > wrap("A") + + assert s[0] == "a" + assert s[1] == "b" + assert s[-2] == "a" + assert s[-1] == "b" + + assert s[0:2] == "ab" + assert wrap("abcd")[1:3] == "bc" + + assert type(hash(s)) == int + + assert s * 3 == "ababab" + assert 3 * s == "ababab" + + assert wrap("%03d") % 42 == "042" + + assert [e for e in s] == ['a', 'b'] + + assert len(s) == 2 + + assert s.capitalize() == "Ab" + assert wrap("AbC").casefold() == "abc" + assert s.center(4) == " ab " + assert s.count(wrap("a")) == 1 + assert s.encode() == b'ab' + assert wrap("é").encode(wrap('ISO-8859-1')) == b'\xe9' + assert s.endswith(wrap("b")) + assert wrap("\t").expandtabs(tabsize=2) == " " + assert s.find(wrap("b")) == 1 + assert wrap(">{}<").format(s) == ">ab<" + assert wrap("{x}").format_map({wrap("x"): wrap("42")}) == "42" + assert s.index(wrap("b")) == 1 + assert s.isalnum() + assert s.isalpha() + assert s.isascii() + assert not s.isdecimal() + assert not s.isdigit() + assert s.isidentifier() + assert s.islower() + assert not s.isnumeric() + assert s.isprintable() + assert not s.isspace() + assert not s.istitle() + assert not s.isupper() + assert wrap(",").join([s, "cd"]) == "ab,cd" + assert s.ljust(3) == "ab " + assert wrap("AB").lower() == "ab" + assert wrap(" a ").lstrip() == "a " + assert wrap("ab,cd,ef").partition(wrap(",")) == ("ab", ",", "cd,ef") + assert s.removeprefix(wrap("a")) == "b" + assert s.removesuffix(wrap("b")) == "a" + assert wrap("aba").replace(wrap("a"), wrap("z")) == "zbz" + assert s.rfind(wrap("a")) == 0 + assert s.rindex(wrap("a")) == 0 + assert s.rjust(3) == " ab" + assert wrap("ab,cd,ef").rpartition(wrap(",")) == ("ab,cd", ",", "ef") + assert wrap("ab,cd,ef").rsplit(wrap(","), 1) == ["ab,cd", "ef"] + assert wrap(" a ").rstrip() == " a" + assert wrap("ab,cd,ef").split(wrap(","), 1) == ["ab", "cd,ef"] + assert wrap("ab\ncd").splitlines() == ["ab", "cd"] + assert s.startswith("a") + assert wrap(" a ").strip() == "a" + assert wrap("Ab").swapcase() == "aB" + assert wrap("a title").title() == "A Title" + assert s.translate({ ord("a"): wrap("ZZ") }) == "ZZb" + assert s.upper() == "AB" + assert s.zfill(5) == "000ab" + + def test_foreign_number_list(self): + from java.util import ArrayList + # Like c(42) in R + n = __graalpython__.foreign_number_list(42) + + assert isinstance(n, list) + assert list in type(n).mro() + self.assertEqual(type(n).mro(), [polyglot.ForeignNumberList, polyglot.ForeignNumber, polyglot.ForeignList, list, polyglot.ForeignObject, object]) + assert repr(n) == '42', repr(n) + assert str(n) == '42', str(n) + assert n + + a = __graalpython__.foreign_number_list(2) + b = __graalpython__.foreign_number_list(3) + assert a + b == 5 + assert a - b == -1 + assert a * b == 6 + assert a / b == (2 / 3) + assert a // b == 0 + + l = ArrayList() + l.extend([1, 2, 3]) + + with self.assertRaisesRegex(TypeError, "'<' not supported between instances of 'ForeignList' and 'int'"): + assert l < 4 + with self.assertRaisesRegex(TypeError, "'<' not supported between instances of 'int' and 'ForeignList'"): + assert 4 < l + + assert l < n + assert n > l + + l[0] = 100 + assert not l < n + assert not n > l + assert l > n + assert n < l + + def test_foreign_number(self): + def wrap(obj): + return __graalpython__.foreign_wrapper(obj) + + def assertValueAndType(actual, expected): + self.assertEqual(expected, actual) + self.assertEqual(type(expected), type(actual)) + + n = wrap(42) + self.assertEqual(type(n).mro(), [polyglot.ForeignNumber, polyglot.ForeignObject, object]) + assert repr(n) == '42', repr(n) + assert str(n) == '42', str(n) + assert n + + assert wrap(2) + wrap(3) == 5 + assert wrap(2) - wrap(3) == -1 + assert wrap(2) * wrap(3) == 6 + assert wrap(7) / wrap(2) == 3.5 + assert wrap(7) // wrap(2) == 3 + assert wrap(8) % wrap(3) == 2 + assert wrap(2) ** wrap(3) == 8 + assert wrap(1) << wrap(3) == 8 + assert wrap(8) >> wrap(2) == 2 + + # 1 and not 1.0 is unfortunate but interop does not give us a way to know if a non-primitive/wrapped 3.0 is integral or floating point + assertValueAndType(wrap(3.0) // wrap(2.0), 1) + assertValueAndType(wrap(3.0) // 2.0, 1.0) + assertValueAndType(3.0 // wrap(2.0), 1.0) + + assertValueAndType(wrap(3) - 2.0, 1.0) + assertValueAndType(3.0 - wrap(2), 1.0) + + assert wrap(0b1110) & wrap(0b0111) == 0b0110 + assert wrap(0b1110) | wrap(0b0111) == 0b1111 + assert wrap(0b1110) ^ wrap(0b0111) == 0b1001 + + assert wrap((1 << 65) - 2) & wrap(0b111) == 0b110 + assert wrap((1 << 65) - 2) | wrap(0b111) == ((1 << 65) - 1) + assert wrap((1 << 65) - 2) ^ wrap(0b1) == ((1 << 65) - 1) + + assert wrap(42).as_integer_ratio() == (42, 1) + assert wrap(0b1010).bit_count() == 2 + assert wrap(0b1010).bit_length() == 4 + assert wrap(42).conjugate() == 42 + assert wrap(42).is_integer() + assert wrap(42.0).is_integer() + assert not wrap(42.5).is_integer() + assert wrap(42.0).to_bytes() == b"*" + + assert ~wrap(42) == -43 + assert -wrap(42) == -42 + assert +wrap(42) == 42 + + assertValueAndType(abs(wrap(-2)), 2) + assertValueAndType(float(wrap(2)), 2.0) + assertValueAndType(int(wrap(2.3)), 2) + assertValueAndType(math.floor(wrap(2.3)), 2) + assertValueAndType(math.ceil(wrap(2.3)), 3) + assertValueAndType(math.trunc(wrap(-2.3)), -2) + assertValueAndType(round(wrap(2.3)), 2) + + missing_int_methods = set(dir(int)) - set(dir(type(wrap(1)))) + missing_int_methods = [m for m in missing_int_methods if m.startswith('_') and m != '__getnewargs__'] + self.assertEqual([], missing_int_methods) + + missing_float_methods = set(dir(float)) - set(dir(type(wrap(1.2)))) + missing_float_methods = [m for m in missing_float_methods if m.startswith('_') and m not in ('__getnewargs__', '__getformat__')] + self.assertEqual([], missing_float_methods) + + def test_foreign_boolean(self): + def wrap(obj): + return __graalpython__.foreign_wrapper(obj) + + def assertValueAndType(actual, expected): + self.assertEqual(expected, actual) + self.assertEqual(type(expected), type(actual)) + + self.assertEqual(type(wrap(True)).mro(), [polyglot.ForeignBoolean, polyglot.ForeignNumber, polyglot.ForeignObject, object]) + assert repr(wrap(True)) == 'True' + assert repr(wrap(False)) == 'False' + assert str(wrap(True)) == 'True' + assert str(wrap(False)) == 'False' + assert wrap(True) + assert not wrap(False) + + assert bool(wrap(True)) is True + assert bool(wrap(False)) is False + + assertValueAndType(wrap(True) + wrap(2), 3) + assertValueAndType(wrap(False) + wrap(2), 2) + assertValueAndType(wrap(2) + wrap(True), 3) + assertValueAndType(wrap(2) + wrap(False), 2) + + assertValueAndType(wrap(True) - wrap(2), -1) + assertValueAndType(wrap(2) - wrap(True), 1) + + assert wrap(True) & wrap(True) is True + assert wrap(True) & wrap(False) is False + + assert wrap(True) | wrap(False) is True + assert wrap(False) | wrap(False) is False + + assert wrap(True) ^ wrap(False) is True + assert wrap(False) ^ wrap(False) is False + + assertValueAndType(~wrap(True), -2) + assertValueAndType(~wrap(False), -1) + + assertValueAndType(float(wrap(True)), 1.0) + assertValueAndType(int(wrap(True)), 1) + + missing_bool_methods = set(dir(bool)) - set(dir(type(wrap(True)))) + missing_bool_methods = [m for m in missing_bool_methods if m.startswith('_') and m != '__getnewargs__'] + self.assertEqual([], missing_bool_methods) + + def test_foreign_repl(self): from java.util.logging import LogRecord from java.util.logging import Level @@ -669,13 +1409,13 @@ def test_foreign_repl(): assert repr(Integer).startswith(' l2 # actually comparing 42 > 11 + assert l1 == [42] + assert l2 == [11] + + + class X: + def __eq__(self,other) : + l1.clear() + return False + + l1 = [X()] + l2 = [0] + assert l1 < l2 # l1 cleared -> is smaller than l2 + assert l1 == [] + assert l2 == [0] + if __name__ == '__main__': unittest.main() diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_memoryview.py b/graalpython/com.oracle.graal.python.test/src/tests/test_memoryview.py index cc61681919..3621dfde2e 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_memoryview.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_memoryview.py @@ -1,10 +1,13 @@ -# Copyright (c) 2018, 2022, Oracle and/or its affiliates. +# Copyright (c) 2018, 2024, Oracle and/or its affiliates. # Copyright (C) 1996-2017 Python Software Foundation # # Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 import sys -import pytest +import unittest + +from tests.util import assert_raises + def test_subscript(): v = memoryview(b'abcefg') @@ -165,9 +168,8 @@ def test_pack(): memoryview(b).cast('?')[0] = False assert b == b'\x00' +@unittest.skipUnless(sys.implementation.name == 'graalpy', "GraalPy-specific test") def test_read_after_resize(): - if sys.implementation.name != "graalpy": - return # CPython prevents resizing of acquired buffers at all to avoid a segfault # We don't want to impose locking on managed objects because we cannot automatically # release the lock by reference counting. Check that we don't hard crash when @@ -176,13 +178,13 @@ def test_read_after_resize(): m = memoryview(b) assert m[1] == ord('2') b.clear() - with pytest.raises(IndexError): - print(m[1]) - with pytest.raises(IndexError): + assert_raises(IndexError, lambda: m[1]) + assert_raises(IndexError, lambda: m.tobytes()) + def assign(): m[1] = 3 - with pytest.raises(IndexError): - print(m.tobytes()) + assert_raises(IndexError, assign) +@unittest.skipIf(sys.implementation.name == 'graalpy' and sys.platform == 'win32', "TODO fails on windows") def test_mmap(): import mmap m = mmap.mmap(-1, 1) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_multiprocessing.py b/graalpython/com.oracle.graal.python.test/src/tests/test_multiprocessing.py index f85a2c35b2..0bdcf368f9 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_multiprocessing.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_multiprocessing.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -39,15 +39,22 @@ import multiprocessing import sys +import unittest -def test_array_read(): - # TODO multiprocessing.Array doesn't work on emulated backend - if sys.implementation.name == 'graalpy' and __graalpython__.posix_module_backend() == 'java': - return - # This used to be buggy due to wrong usage of memoryview offsets when two objects were allocated in the same block - # Don't remove the unused value on the next line - # noinspection PyUnusedLocal - num = multiprocessing.Value('d', 0.0) - arr = multiprocessing.Array('i', range(10)) - assert arr[1] == 1 +class MultiprocessingTest(unittest.TestCase): + @classmethod + def tearDownClass(cls): + import multiprocessing.resource_tracker + multiprocessing.resource_tracker._resource_tracker._stop() + + @unittest.skipIf( + sys.implementation.name == 'graalpy' and __graalpython__.posix_module_backend() == 'java', + reason="TODO multiprocessing.Array doesn't work on emulated backend", + ) + def test_array_read(self): + # This used to be buggy due to wrong usage of memoryview offsets when two objects were allocated in the same block + # Don't remove the unused value on the next line + multiprocessing.Value('d', 0.0) + arr = multiprocessing.Array('i', range(10)) + self.assertEqual(arr[1], 1) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_parser.py b/graalpython/com.oracle.graal.python.test/src/tests/test_parser.py index 7d523404e8..ebf0768c2c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_parser.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_parser.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -268,6 +268,14 @@ def test_invalid_return_statement(): assert_raise_syntax_error("return 10", "'return' outside function") assert_raise_syntax_error("class A: return 10\n", "'return' outside function") +def test_outside_of_loop_errors(): + assert_raise_syntax_error("break", "'break' outside loop") + # TODO: parser gives invalid syntax for this one, but should be: "'break' outside loop" + assert_raise_syntax_error("def bar(): break", "") + assert_raise_syntax_error("continue", "'continue' not properly in loop") + # TODO: parser gives invalid syntax for this one, but should be: "'continue' not properly in loop" + assert_raise_syntax_error("def foo(): continue", "") + def test_mangled_class_property(): class P: diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_patched_pip.py b/graalpython/com.oracle.graal.python.test/src/tests/test_patched_pip.py index 226d2925f8..8264dd42d8 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_patched_pip.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_patched_pip.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -42,8 +42,12 @@ import subprocess import sys import tempfile +import threading import unittest +from http.server import HTTPServer, SimpleHTTPRequestHandler from pathlib import Path +from urllib.parse import urljoin +from urllib.request import pathname2url SETUP_PY_TEMPLATE = ''' from setuptools import setup, find_packages @@ -79,25 +83,27 @@ class PipPatchingTest(unittest.TestCase): installed from source or binary distribution. """ - def setUpClass(self): - self.venv_dir = Path(tempfile.mkdtemp()).resolve() - subprocess.check_output([sys.executable, "-m", "venv", str(self.venv_dir)]) - self.venv_python = str(self.venv_dir / 'bin' / 'python') - subprocess.check_output([self.venv_python, '-m', 'pip', 'install', 'wheel']) - self.venv_template_dir = f'{self.venv_dir}.template' - self.venv_dir.rename(self.venv_template_dir) - self.build_dir = Path(tempfile.mkdtemp()).resolve() - self.package_cache = {} - - def tearDownClass(self): - shutil.rmtree(self.venv_template_dir, ignore_errors=True) - shutil.rmtree(self.build_dir, ignore_errors=True) + @classmethod + def setUpClass(cls): + cls.venv_dir = Path(tempfile.mkdtemp()).resolve() + subprocess.check_output([sys.executable, "-m", "venv", str(cls.venv_dir)]) + cls.venv_python = str(cls.venv_dir / 'bin' / 'python') + subprocess.check_output([cls.venv_python, '-m', 'pip', 'install', 'wheel']) + cls.venv_template_dir = f'{cls.venv_dir}.template' + cls.venv_dir.rename(cls.venv_template_dir) + cls.build_dir = Path(tempfile.mkdtemp()).resolve() + cls.package_cache = {} + + @classmethod + def tearDownClass(cls): + shutil.rmtree(cls.venv_template_dir, ignore_errors=True) + shutil.rmtree(cls.build_dir, ignore_errors=True) def setUp(self): shutil.copytree(self.venv_template_dir, self.venv_dir, symlinks=True) self.patch_dir = Path(tempfile.mkdtemp()).resolve() self.pip_env = os.environ.copy() - self.pip_env['PIPLOADER_PATCHES_BASE_DIRS'] = str(self.patch_dir) + self.pip_env['PIP_GRAALPY_PATCHES_URL'] = str(self.patch_dir) self.index_dir = Path(tempfile.mkdtemp()).resolve() def tearDown(self): @@ -106,18 +112,16 @@ def tearDown(self): shutil.rmtree(self.index_dir, ignore_errors=True) def prepare_config(self, name, rules): - package_dir = self.patch_dir / name - package_dir.mkdir(exist_ok=True) toml_lines = [] for rule in rules: - toml_lines.append('[[rules]]') + toml_lines.append(f'[[{name}.rules]]') for k, v in rule.items(): if not k.startswith('$'): toml_lines.append(f'{k} = {v!r}') if patch := rule.get('patch'): - with open(package_dir / patch, 'w') as f: + with open(self.patch_dir / patch, 'w') as f: f.write(PATCH_TEMPLATE.format(rule.get('$patch-text', 'Patched'))) - with open(package_dir / 'metadata.toml', 'w') as f: + with open(self.patch_dir / 'metadata.toml', 'w') as f: f.write('\n'.join(toml_lines)) def build_package(self, name, version): @@ -147,27 +151,37 @@ def add_package_to_index(self, name, version, dist_type): package = self.build_package(name, version)[dist_type] shutil.copy(package, self.index_dir) - def run_venv_pip_install(self, package, extra_env=None): + def run_venv_pip_install(self, package, extra_env=None, assert_stderr_matches=None): env = self.pip_env.copy() if extra_env: env.update(extra_env) - out = subprocess.check_output([ - self.venv_python, - '--experimental-options', '--python.EnableDebuggingBuiltins=true', - '-m', 'pip', 'install', '--force-reinstall', - '--find-links', self.index_dir, '--no-index', '--no-cache-dir', - package], - env=env, universal_newlines=True) - assert 'Applying GraalPy patch failed for' not in out - return re.findall(r'Successfully installed (\S+)', out) + proc = subprocess.run( + [ + str(self.venv_dir / 'bin' / 'pip'), + '--isolated', + 'install', + '--force-reinstall', + '--find-links', self.index_dir, + '--no-index', + '--no-cache-dir', + package, + ], + check=True, + capture_output=True, + env=env, + universal_newlines=True, + ) + print(proc.stderr) + assert 'Applying GraalPy patch failed for' not in proc.stderr + if assert_stderr_matches: + assert re.search(assert_stderr_matches, proc.stderr), \ + f"Didn't match expected stderr.\nExpected (regex): {assert_stderr_matches}\nActual:{proc.stderr}" + return re.findall(r'Successfully installed (\S+)', proc.stdout) def run_test_fun(self): code = "import patched_package; print(patched_package.test_fun())" return subprocess.check_output([self.venv_python, '-c', code], universal_newlines=True).strip() - def test_pip_launcher(self): - subprocess.check_output([str(self.venv_dir / 'bin' / 'pip'), 'install', '--help']) - def test_wheel_unpatched_version(self): self.add_package_to_index('foo', '1.0.0', 'wheel') self.prepare_config('foo', [{ @@ -388,3 +402,62 @@ def test_name_with_dashes(self): }]) assert self.run_venv_pip_install('package-with-dashes') == ['package-with-dashes-1.0.0'] assert self.run_test_fun() == "Patched" + + def check_installing_with_patch_repo(self, url_or_path: str, *, graalpy_version=None, should_be_skipped=False, + assert_stderr_matches=None): + self.pip_env['PIP_GRAALPY_PATCHES_URL'] = url_or_path + if graalpy_version: + self.pip_env['TEST_PIP_GRAALPY_VERSION'] = graalpy_version + self.add_package_to_index('foo', '1.1.0', 'wheel') + self.prepare_config('foo', [{'patch': 'foo.patch'}]) + assert self.run_venv_pip_install('foo', assert_stderr_matches=assert_stderr_matches) == ['foo-1.1.0'] + assert self.run_test_fun() == ("Unpatched" if should_be_skipped else "Patched") + + def test_broken_patches_path(self): + self.check_installing_with_patch_repo( + '/tmp/not-there', + should_be_skipped=True, + assert_stderr_matches="WARNING: Failed to load GraalPy patch repository", + ) + + def test_patches_file_url(https://github.com/self): + self.check_installing_with_patch_repo(urljoin('file:', pathname2url(https://github.com/str(self.patch_dir.absolute())))) + + @unittest.skipIf( + __graalpython__.posix_module_backend() == 'java', + "Server doesn't work properly under Java posix backend" + ) + def test_patches_http_url(https://github.com/self): + patch_dir = self.patch_dir + + class Handler(SimpleHTTPRequestHandler): + def __init__(self, *args, **kwargs): + super().__init__(*args, directory=str(patch_dir), **kwargs) + + try: + with HTTPServer(('localhost', 0), Handler) as server: + thread = threading.Thread(target=server.serve_forever) + thread.start() + try: + self.check_installing_with_patch_repo(f'http://localhost:{server.server_port}') + finally: + server.shutdown() + finally: + thread.join() + + def test_patches_repo_version_resolution(self): + patch_dir_parent = self.patch_dir + graalpy_version = '1.3.2' + self.patch_dir = patch_dir_parent / graalpy_version + self.patch_dir.mkdir() + self.check_installing_with_patch_repo(str(patch_dir_parent / ''), graalpy_version=graalpy_version) + + def test_patches_repo_version_resolution_dev(self): + patch_dir_parent = self.patch_dir + self.patch_dir = patch_dir_parent / '1.3.2-dev' + self.patch_dir.mkdir() + self.check_installing_with_patch_repo( + str(patch_dir_parent / ''), + graalpy_version='1.3.2-dev', + should_be_skipped=True, + ) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_patmat.py b/graalpython/com.oracle.graal.python.test/src/tests/test_patmat.py index 5e1bf6c4a4..d1b6efe2a1 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_patmat.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_patmat.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -36,11 +36,11 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. - +import os import sys, ast, unittest +import inspect -@unittest.skipIf(sys.version_info.minor < 10, "Requires Python 3.10+") def test_guard(): def f(x, g): match x: @@ -62,7 +62,6 @@ def f(x): assert f(1) == 42 assert f(2) == 0 -@unittest.skipIf(sys.version_info.minor < 10, "Requires Python 3.10+") def test_complex_as_binary_op(): src = """ def f(a): @@ -87,7 +86,6 @@ def f(a): assert f(6+3j) == "match add" assert f(-2-3j) == "match sub" -@unittest.skipIf(sys.version_info.minor < 10, "Requires Python 3.10+") def test_long_mapping(): def f(x): match d: @@ -123,3 +121,145 @@ def test(name): assert test('attr1') == {'dyn_match': 1, 'attr2': 2, 'attr3': 3} assert test('attr2') == {'dyn_match': 2, 'attr1': 1, 'attr3': 3} + +def test_multiple_or_pattern_basic(): + match 0: + case 0 | 1 | 2 | 3 | 4 | 5 as x: + assert x == 0 + + match 3: + case ((0 | 1 | 2) as x) | ((3 | 4 | 5) as x): + assert x == 3 + +def test_sequence_pattern(): + match (1, 2): + case (3, 2): + assert False + + match (1, (2, 2)): + case (3, (2, 2)): + assert False + + match (1, 2): + case (3, q): + assert False + + +def test_multiple_or_pattern_advanced(): + match 4: + case (0 as z) | (1 as z) | (2 as z) | (4 as z) | (77 as z): + assert z == 4 + + match 42: + case (0 as z) | (1 as z): + assert z == 1 + case x: + assert x == 42 + + match 2: + case (0 as z) | (1 as z) | (2 as z): + assert z == 2 + case _: + assert False + + match 1: + case (0 as z) | (1 as z) | (2 as z): + assert z == 1 + case _: + assert False + + match 0: + case (0 as z) | (1 as z) | (2 as z): + assert z == 0 + case _: + assert False + + match (1, 2): + case (w, 2) | (2, w): + assert w == 1 + + +def test_multiple_or_pattern_creates_locals(): + match (1, 2): + case (a, 1) | (a, 2): + assert a == 1 + assert a == 1 + + match [1, 2]: + case [a1, 1] | [a1, 2]: + assert a1 == 1 + assert a1 == 1 + + match (1, 2, 2, 3, 2): + case (1, a, b, 4, c) | (1, a, b, 3, c) | (1, a, b, 2, c): + assert a == 2 + assert b == 2 + assert c == 2 + assert a == 2 + assert b == 2 + assert c == 2 + + match (1, 3, 4, 9): + case ((d, e, f, 7) | (d, e, f, 8) | (d, e, f, 6) | (d, e, f, 9)): + assert d == 1 + assert e == 3 + assert f == 4 + assert d == 1 + assert e == 3 + assert f == 4 + + match (1,2,3,4,5,6,7): + case (0,q,w,e,r,t,y) | (q,w,e,r,t,y,7): + assert q == 1 + assert w == 2 + assert e == 3 + assert r == 4 + assert t == 5 + assert y == 6 + assert q == 1 + assert w == 2 + assert e == 3 + assert r == 4 + assert t == 5 + assert y == 6 + + +class TestErrors(unittest.TestCase): + def assert_syntax_error(self, code: str): + with self.assertRaises(SyntaxError): + compile(inspect.cleandoc(code), "", "exec") + + def test_alternative_patterns_bind_different_names_0(self): + self.assert_syntax_error(""" + match ...: + case "a" | a: + pass + """) + + def test_alternative_patterns_bind_different_names_1(self): + self.assert_syntax_error(""" + match ...: + case [a, [b] | [c] | [d]]: + pass + """) + + def test_multiple_or_same_name(self): + self.assert_syntax_error(""" + match 0: + case x | x: + pass + """) + + def test_multiple_or_wildcard(self): + self.assert_syntax_error(""" + match 0: + case * | 1: + pass + """) + + def test_unbound_local_variable(self): + with self.assertRaises(UnboundLocalError): + match (1, 3): + case (a, 1) | (a, 2): + pass + assert a == 1 \ No newline at end of file diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_pdb.py b/graalpython/com.oracle.graal.python.test/src/tests/test_pdb.py index ec6014757b..f66661927d 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_pdb.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_pdb.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -37,8 +37,10 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +import os import doctest import sys +import unittest # Copied from test_doctest @@ -68,6 +70,7 @@ def __exit__(self, *exc): sys.settrace(self.orig_trace) +@unittest.skipIf(os.environ.get('BYTECODE_DSL_INTERPRETER'), "TODO: FrameSlotTypeException with reparsing") def doctest_pdb_locals(): """ Test that locals get synced after breakpoint @@ -98,6 +101,7 @@ def doctest_pdb_locals(): """ +@unittest.skipIf(os.environ.get('BYTECODE_DSL_INTERPRETER'), "TODO: FrameSlotTypeException with reparsing") def doctest_pdb_locals_generator(): """ Test that locals get synced after breakpoint in a generator @@ -128,6 +132,7 @@ def doctest_pdb_locals_generator(): """ +@unittest.skipIf(os.environ.get('BYTECODE_DSL_INTERPRETER'), "TODO: FrameSlotTypeException with reparsing") def doctest_pdb_locals_sync_back(): """ Test that locals set by debugger get propagated back into the frame. @@ -153,5 +158,6 @@ def doctest_pdb_locals_sync_back(): """ +@unittest.skipIf(os.environ.get('BYTECODE_DSL_INTERPRETER'), "TODO: FrameSlotTypeException with reparsing") def test_run_doctests(): doctest.testmod(sys.modules[__name__], raise_on_error=True) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_posix.py b/graalpython/com.oracle.graal.python.test/src/tests/test_posix.py index 934c2edcdb..b84ffd29b8 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_posix.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_posix.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -879,7 +879,6 @@ def test_sysconf_names(self): self.assertIn('SC_CLK_TCK', os.sysconf_names) def test_sysconf(self): - self.assertGreaterEqual(os.sysconf('SC_CLK_TCK'), 0) with self.assertRaisesRegex(TypeError, 'strings or integers'): os.sysconf(object()) with self.assertRaisesRegex(ValueError, 'unrecognized'): @@ -892,6 +891,17 @@ def test_sysconf(self): else: assert False + # constants taken from POSIX where defined + self.assertGreaterEqual(os.sysconf('SC_ARG_MAX'), 4096) + self.assertGreaterEqual(os.sysconf('SC_CHILD_MAX'), 25) + self.assertGreaterEqual(os.sysconf('SC_LOGIN_NAME_MAX'), 9) + self.assertGreaterEqual(os.sysconf('SC_CLK_TCK'), 0) + self.assertGreaterEqual(os.sysconf('SC_OPEN_MAX'), 20) + self.assertGreaterEqual(os.sysconf('SC_PAGESIZE'), 1) + os.sysconf('SC_SEM_NSEMS_MAX') # returns -1 on my linux box, just check it's there + self.assertGreaterEqual(os.sysconf('SC_PHYS_PAGES'), 1) + self.assertGreaterEqual(os.sysconf('SC_NPROCESSORS_CONF'), 1) + if __name__ == '__main__': unittest.main() diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_random.py b/graalpython/com.oracle.graal.python.test/src/tests/test_random.py index a4aae37c4b..776a407e31 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_random.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_random.py @@ -3,14 +3,13 @@ # # Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 -import unittest import random import time +import unittest -class TestBasicOps: - def __init__(self): - super().__init__() +class TestBasicOps(unittest.TestCase): + def setUp(self): self.gen = random.Random() def randomlist(self, n): @@ -136,11 +135,6 @@ def test_sample_on_dicts(self): self.assertRaises(TypeError, self.gen.sample, dict.fromkeys('abcdef'), 2) def test_choices(self): - import sys - return # TODO: re-enable once we update again - if sys.version_info.minor < 7: - return - choices = self.gen.choices data = ['red', 'green', 'blue', 'yellow'] str_data = 'abcd' diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_register_interop_behavior.py b/graalpython/com.oracle.graal.python.test/src/tests/test_register_interop_behavior.py new file mode 100644 index 0000000000..732e5abdeb --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_register_interop_behavior.py @@ -0,0 +1,459 @@ +# Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# The Universal Permissive License (UPL), Version 1.0 +# +# Subject to the condition set forth below, permission is hereby granted to any +# person obtaining a copy of this software, associated documentation and/or +# data (collectively the "Software"), free of charge and under any and all +# copyright rights in the Software, and any and all patent rights owned or +# freely licensable by each licensor hereunder covering either (i) the +# unmodified Software as contributed to or provided by such licensor, or (ii) +# the Larger Works (as defined below), to deal in both +# +# (a) the Software, and +# +# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +# one is included with the Software each a "Larger Work" to which the Software +# is contributed by such licensors), +# +# without restriction, including without limitation the rights to copy, create +# derivative works of, display, perform, and distribute the Software and make, +# use, sell, offer for sale, import, export, have made, and have sold the +# Software and the Larger Work(s), and to sublicense the foregoing rights on +# either these or other terms. +# +# This license is subject to the following condition: +# +# The above copyright notice and either this complete permission notice or at a +# minimum a reference to the UPL must be included in all copies or substantial +# portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +import sys +import unittest + +EXECUTE_TESTS = sys.implementation.name == "graalpy" and not __graalpython__.is_native + +if EXECUTE_TESTS: + import polyglot + import java + import __graalpython__ + + from java.util import ArrayList + + + class TestBasicInteropRegistryBehavior(unittest.TestCase): + def tearDown(self): + __graalpython__.clear_interop_type_registry() + + def test_java_interop_assertions(self): + """ + Test if registering java class and calling it works + """ + import java + + class jList: + def custom_append(self, element): + self.add(element) + + # Overwrite default list behavior + def __len__(self): + return 42 + + def __getitem__(self, item): + return 42 + + polyglot.register_interop_type(ArrayList, jList) + l = ArrayList() + self.assertIsInstance(l, jList) + + l.custom_append(1) + self.assertEqual(len(l), 42) + self.assertEqual(l.size(), 1) + self.assertEqual(l[0], 42) + self.assertEqual(l.get(0), 1) + + def test_java_interop_decorator_assertions(self): + """ + Test if registering with the decorator function works + """ + import java + + @polyglot.interop_type(ArrayList) + class jList: + pass + + l = ArrayList() + self.assertIsInstance(l, jList) + + def test_java_interop_overwrite_assertions(self): + """ + Test if method overwriting works + """ + + class jList: + def name(self): + return "jList" + + class jList2: + def name(self): + return "jList2" + + l = ArrayList() + + polyglot.register_interop_type(ArrayList, jList) + with self.assertRaises(KeyError): + polyglot.register_interop_type(ArrayList, jList) + + self.assertIsInstance(l, jList) + self.assertEqual(l.name(), "jList") + + with self.assertRaises(AttributeError): + polyglot.register_interop_type(ArrayList, jList2) + + self.assertEqual(l.name(), "jList") + + polyglot.register_interop_type(ArrayList, jList2, allow_method_overwrites=True) + self.assertIsInstance(l, jList) + self.assertIsInstance(l, jList2) + self.assertEqual(l.name(), "jList2") + self.assertEqual(type(l).mro()[1:3], [jList2, jList]) + + # Test if overwrite flag works in decorator function too + @polyglot.interop_type(ArrayList) + class jList3: + def dec_name(self): + return "jList3" + + self.assertIsInstance(l, jList) + self.assertIsInstance(l, jList2) + self.assertIsInstance(l, jList3) + self.assertEqual(l.name(), "jList2") + self.assertEqual(l.dec_name(), "jList3") + + with self.assertRaises(AttributeError): + @polyglot.interop_type(ArrayList) + class jList4: + def dec_name(self): + return "jList4" + + self.assertEqual(l.dec_name(), "jList3") + + @polyglot.interop_type(ArrayList, allow_method_overwrites=True) + class jList4: + def dec_name(self): + return "jList4" + + self.assertIsInstance(l, jList) + self.assertIsInstance(l, jList2) + self.assertIsInstance(l, jList3) + self.assertIsInstance(l, jList4) + self.assertEqual(l.name(), "jList2") + self.assertEqual(l.dec_name(), "jList4") + self.assertEqual(type(l).mro()[1:5], [jList4, jList3, jList2, jList]) + + def test_multiple_decorator(self): + @polyglot.interop_type(java.util.LinkedList) + @polyglot.interop_type(ArrayList) + class jList: + def name(self): + return "python list" + + l_list = java.util.LinkedList() + a_list = ArrayList() + + self.assertEqual(l_list.name(), "python list") + self.assertEqual(a_list.name(), "python list") + + from java.io import BufferedReader + from java.io import StringReader + from java.io import Reader + from java.lang import AutoCloseable + + test_string = """Lorem + ipsum + dolor + sit + amet, + consectetur + adipiscing + elit. + """ + + + class TestInterfaceMerge(unittest.TestCase): + + def setUp(self): + @polyglot.interop_type(BufferedReader) + class JBufferedReader: + def __next__(self): + line = self.readLine() + if line: + return line + raise StopIteration + + def __iter__(self): + return self + + @polyglot.interop_type(Reader) + class JReader: + def __enter__(self): + return self + + @polyglot.interop_type(AutoCloseable) + class JClosable: + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + + def tearDown(self): + __graalpython__.clear_interop_type_registry() + + def test_interface_merge_working(self): + with BufferedReader(StringReader(test_string)) as reader: + assert type(reader).__name__ == "Java_java.io.BufferedReader_generated" + result = "" + for line in reader: + result += line + "\n" + + # remove last linebreak + result = result[:-1] + self.assertEqual(test_string, result) + + def test_build_cache_invalidation_after_new_register(self): + reader = BufferedReader(StringReader(test_string)) + readerClass = type(reader) + self.assertEqual(readerClass.__name__, "Java_java.io.BufferedReader_generated") + self.assertEqual(readerClass, type(reader)) + + import abc + polyglot.register_interop_type(java.util.List, abc.ABC, allow_methods_overwrite=True) + # new registrations clears the generated class cache + # every class has to be regenerated, hence this is a new class instance + self.assertNotEqual(readerClass, type(reader)) + + # first element can't be the same, it's the class itself + # The rest of the mro is the same though, because BufferedReader doesn't inherit from java.util.List + # So the behavior of reader doesn't change + self.assertEqual(readerClass.mro()[1:], type(reader).mro()[1:]) + self.assertEqual(type(reader).__name__, "Java_java.io.BufferedReader_generated") + + def test_build_cache_invalidation_after_delete(self): + reader = BufferedReader(StringReader(test_string)) + readerClass = type(reader) + self.assertEqual(readerClass.__name__, "Java_java.io.BufferedReader_generated") + + __graalpython__.clear_interop_type_registry() + self.assertEqual(type(reader).__name__, "ForeignObject") + + + from java.lang import Object + from java.lang import StringBuilder + + + class TestMultipleRegistries(unittest.TestCase): + + def tearDown(self): + __graalpython__.clear_interop_type_registry() + + def test_second_registered_class(self): + @polyglot.interop_type(Object) + class Dummy: + def test(self): + return 1 + + test = Object() + self.assertEqual(test.test(), 1) + self.assertIsInstance(test, Dummy) + with self.assertRaises(AttributeError): + test.test2() + + @polyglot.interop_type(Object) + class Dummy2: + def test2(self): + return 2 + + self.assertEqual(test.test(), 1) + self.assertEqual(test.test2(), 2) + self.assertIsInstance(test, Dummy) + self.assertIsInstance(test, Dummy2) + + def test_error_when_same_method(self): + @polyglot.interop_type(Object) + class ClassOne: + someAttribute = "" + + def method(self): + pass + + with self.assertRaises(AttributeError): + @polyglot.interop_type(Object) + class ClassTwo: + someAttribute = "" + + def method(self): + pass + + def test_mro_update_after_double_registration(self): + @polyglot.interop_type(StringBuilder) + class DummyStringBuilder: + def content(self): + return self.toString() + + @polyglot.interop_type(Object) + class DummyObject: + def name(self): + return self.toString() + + test_string = StringBuilder("lorem ipsum") + self.assertIn(DummyStringBuilder, type(test_string).mro()) + self.assertIn(DummyObject, type(test_string).mro()) + self.assertEqual(test_string.name(), test_string.content()) + + @polyglot.interop_type(Object) + class BetterDummyObject: + def better_name(self): + return "better_" + self.toString() + + self.assertIn(BetterDummyObject, type(test_string).mro()) + self.assertEqual("better_lorem ipsum", test_string.better_name()) + + def test_mro_with_multiple_inheritance(self): + object = Object() + + class D: + pass + + @polyglot.interop_type(Object) + class C(D): + pass + + self.assertEqual(type(object).mro()[1:3], [C, D]) + + class B: + pass + + @polyglot.interop_type(Object) + class A(B): + pass + + self.assertEqual(type(object).mro()[1:5], [A, B, C, D]) + + def test_registrations_for_object_effect_common_java_objects(self): + object = Object() + + @polyglot.interop_type(Object) + class B: + pass + + @polyglot.interop_type(Object) + class A: + pass + + self.assertEqual(type(object).mro()[1:3], [A, B]) + self.assertEqual(type(ArrayList()).mro()[1:3], [A, B]) + self.assertEqual(type(java.util.HashMap()).mro()[1:3], [A, B]) + self.assertEqual(type(StringReader("test")).mro()[1:3], [A, B]) + + def test_class_change_after_registration(self): + class B: + pass + + @polyglot.interop_type(Object) + class A(B): + def name(self): + return "A" + + object = Object() + self.assertEqual(object.name(), "A") + with self.assertRaises(AttributeError): + object.foo() + + B.foo = lambda x: "bar" + self.assertEqual(object.foo(), "bar") + + def test_classes_registered_with_same_super_class(self): + object = Object() + + class Super: + def name(self): + return "super" + + @polyglot.interop_type(Object) + class A(Super): + def name(self): + return "A" + + self.assertEqual(type(object).mro()[1:3], [A, Super]) + self.assertEqual(object.name(), "A") + + with self.assertRaises(AttributeError): + # B overwrites method name in A, hence it should fail + @polyglot.interop_type(Object) + class B(Super): + def name(self): + return "B" + + @polyglot.interop_type(Object, allow_method_overwrites=True) + class B(Super): + def name(self): + return "B" + + self.assertEqual(type(object).mro()[1:4], [B, A, Super]) + self.assertEqual(object.name(), "B") + + def test_register_super_and_sub_class(self): + object = Object() + + @polyglot.interop_type(Object) + class Super: + def name(self): + return "super" + + self.assertEqual(object.name(), "super") + + with self.assertRaises(AttributeError): + # A overwrites method name in Super, hence it should fail + @polyglot.interop_type(Object) + class A(Super): + def name(self): + return "A" + + @polyglot.interop_type(Object, allow_method_overwrites=True) + class A(Super): + def name(self): + return "A" + + self.assertEqual(object.name(), "A") + self.assertEqual(type(object).mro()[1:3], [A, Super]) + + def test_register_sub_class_first(self): + class Super: + pass + + class A(Super): + pass + + polyglot.register_interop_type(Object, A) + polyglot.register_interop_type(Object, Super) + + object = Object() + with self.assertRaises(TypeError) as typeError: + # MRO cannot be constructed, because the registration order requires the super class Super + # before the child class A in the MRO + print(object) + + # Testing the wrapped error message + self.assertIn("cannot create the python class for", str(typeError.exception)) + cause_message = str(typeError.exception.__cause__) + # sanitize cause message, it contains line breaks + cause_message = cause_message.replace("\n", " ") + self.assertIn("Cannot create a consistent method resolution order", cause_message) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_repl.py b/graalpython/com.oracle.graal.python.test/src/tests/test_repl.py index e1ef5ef43f..457f206f0f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_repl.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_repl.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -38,8 +38,10 @@ # SOFTWARE. import sys +import platform +import unittest -if sys.platform != 'win32' and (sys.implementation.name != 'graalpy' or not __graalpython__.is_managed_launcher()): +if (sys.platform != 'win32' and (sys.platform != 'linux' or platform.machine() != 'aarch64')) and (sys.implementation.name != 'graalpy' or __graalpython__.posix_module_backend() != 'java'): import os import re import select @@ -48,7 +50,23 @@ import termios from textwrap import dedent + # The terminal tests can be flaky + def autoretry(fn): + def decorated(*args, **kwargs): + retries = 3 + while retries: + try: + fn(*args, **kwargs) + return + except Exception: + retries -= 1 + print("Retrying test") + continue + fn(*args, **kwargs) + return decorated + + @autoretry def validate_repl(stdin, python_args=(), ignore_preamble=True): env = os.environ.copy() env['TERM'] = 'ansi' @@ -81,8 +99,8 @@ def validate_repl(stdin, python_args=(), ignore_preamble=True): rlist, _, _ = select.select([pty_parent], [], [], 60) assert pty_parent in rlist, f"Timed out waiting for REPL output. Output: {whole_out}{out}" out += os.read(pty_parent, 1024).decode('utf-8') - out = out.replace('\r\n', '\n') out = re.sub(r'\x1b\[(?:\?2004[hl]|\d+[A-G])', '', out) + out = out.replace('\r\n', '\n') if out == '>>> ' or out.endswith(('\n>>> ', '\n... ')): prompt = out[:3] actual = out[:-5] @@ -151,6 +169,7 @@ def test_continuation(): ''')) + @unittest.skipIf(os.environ.get('BYTECODE_DSL_INTERPRETER'), "TODO: vs in traceback") def test_exceptions(): validate_repl(dedent("""\ >>> 1 / 0 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_select.py b/graalpython/com.oracle.graal.python.test/src/tests/test_select.py index f26e1a6934..ef3bc9b662 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_select.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_select.py @@ -1,4 +1,4 @@ -# Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -39,7 +39,6 @@ import os import select -import sys import tempfile import unittest @@ -89,9 +88,13 @@ def fileno(self): os.close(os.open(TEST_FILENAME_FULL_PATH, os.O_WRONLY | os.O_CREAT)) with open(TEST_FILENAME_FULL_PATH, 'r') as f: - stdout_fd = sys.__stdout__.fileno() - # stdout is not ready for reading, but the file should be, - # we should get back both objects and in the right order - fds = [F(f.fileno()), F(stdout_fd), F(f.fileno())] - res = select.select(fds, [], [], 1) - assert res == ([fds[0], fds[2]], [], []) + r_pipe, w_pipe = os.pipe() + try: + # the pipe is not ready for reading, but the file should be, + # we should get back both objects and in the right order + fds = [F(f.fileno()), F(r_pipe), F(f.fileno())] + res = select.select(fds, [], [], 1) + assert res == ([fds[0], fds[2]], [], []) + finally: + os.close(r_pipe) + os.close(w_pipe) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_signal.py b/graalpython/com.oracle.graal.python.test/src/tests/test_signal.py index 187f53b1c0..c46b265b5b 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_signal.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_signal.py @@ -83,8 +83,8 @@ def handler(signum, frame): def test_interrupt(): - if sys.implementation.name == 'graalpy' and __graalpython__.is_managed_launcher(): - # The keyboard interrupt handling works under managed, but sending SIGINT does not + if sys.implementation.name == 'graalpy' and __graalpython__.posix_module_backend() == 'java': + # Sending SIGINT does not work when using the Java backend for posix return proc = subprocess.Popen( [sys.executable, '-c', 'import time; print("s", flush=True); time.sleep(60)'], diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_slice.py b/graalpython/com.oracle.graal.python.test/src/tests/test_slice.py index acc0cbe28b..7ce131a8d4 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_slice.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_slice.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2022, Oracle and/or its affiliates. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. # Copyright (c) 2013, Regents of the University of California # # All rights reserved. @@ -202,3 +202,35 @@ def test_slice_eq(): assert slice(None, 12345, 10) == slice(None, 12345, 10) assert slice(1, 10000, 10) != slice(None, 10000, 10) assert slice(2, 10000, 10) != slice(2, 10000, 1) + +def test_slice_cmp(): + assert slice(1,2) < slice(2,3,1) + assert slice(2,3,1) > slice(1,2) + assert slice(1,2) <= slice(2,3,1) + assert slice(2,3,1) >= slice(1,2) + assert slice(1, 1, 1.1) < slice(1, 1, 1.2) + assert slice(1, 2.5, 1.1) > slice(1, 0.5, 1.2) + assert slice(1.25, 2.5, 1.1) < slice(42.5, 0.5, 1.2) + assert slice(1, None, 1.1) < slice(1, None, 42.5) + assert slice(1, None, 25.5) > slice(1, None, 1.14) + + try: + slice(1,2) < slice(1,2,1) + except TypeError as e: + assert "'<' not supported between instances of 'NoneType' and 'int'" in str(e) + else: + assert False + + class MyC: + def __eq__(self, other): return False + def __lt__(self, other): return True + def __gt__(self, other): return False + def __le__(self, other): return True + + assert slice(1, MyC()) < slice(1, MyC()) + assert not slice(1, MyC()) > slice(1, MyC()) + assert slice(1, MyC()) <= slice(1, MyC()) + assert slice(1, MyC()) >= slice(1, MyC()) + + interned = slice(1, MyC()) + assert not (interned < interned) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_sqlite3.py b/graalpython/com.oracle.graal.python.test/src/tests/test_sqlite3.py index 93d0909bce..09f0b074d2 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_sqlite3.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_sqlite3.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -37,23 +37,15 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -try: - import __graalpython__ - managed_launcher = __graalpython__.is_managed_launcher() -except ImportError: - managed_launcher = False - def test_basic_functionality(): """ This is a basic test to ensure that the module can be imported. The main sqlite3 test suite will be silently skipped if the "_sqlite3" module is not available. """ - if not managed_launcher: - import sqlite3 - import _sqlite3 - conn = sqlite3.connect(':memory:') - rows = conn.execute("select sqlite_version()") - assert len(next(rows)[0]) >= 5 - conn.close() - + import sqlite3 + import _sqlite3 + conn = sqlite3.connect(':memory:') + rows = conn.execute("select sqlite_version()") + assert len(next(rows)[0]) >= 5 + conn.close() diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_ssl_java_integration.py b/graalpython/com.oracle.graal.python.test/src/tests/test_ssl_java_integration.py index 6582d17f04..38da878874 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_ssl_java_integration.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_ssl_java_integration.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -52,7 +52,7 @@ def test_load_default_verify_keystore(): curdir = os.path.abspath(os.path.dirname(__file__)) src = dedent(f"""\ import ssl, sys, os - sys.path.append('{curdir}') + sys.path.append(r'{curdir}') from test_ssl import data_file, check_handshake server_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) server_context.load_cert_chain(data_file('signed_cert.pem')) @@ -63,4 +63,9 @@ def test_load_default_verify_keystore(): """) env = os.environ.copy() env['JAVA_TOOL_OPTIONS'] = f"-Djavax.net.ssl.trustStore={curdir}/ssldata/signing_keystore.jks" - subprocess.run([sys.executable, '-c', src], env=env, check=True) + + args = [] + if __graalpython__.is_bytecode_dsl_interpreter: + args += ['--vm.Dpython.EnableBytecodeDSLInterpreter=true'] + + subprocess.run([sys.executable, *args, '-c', src], env=env, check=True) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_startup.py b/graalpython/com.oracle.graal.python.test/src/tests/test_startup.py new file mode 100644 index 0000000000..b17986a53c --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_startup.py @@ -0,0 +1,90 @@ +# Copyright (c) 2025, 2025, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# The Universal Permissive License (UPL), Version 1.0 +# +# Subject to the condition set forth below, permission is hereby granted to any +# person obtaining a copy of this software, associated documentation and/or +# data (collectively the "Software"), free of charge and under any and all +# copyright rights in the Software, and any and all patent rights owned or +# freely licensable by each licensor hereunder covering either (i) the +# unmodified Software as contributed to or provided by such licensor, or (ii) +# the Larger Works (as defined below), to deal in both +# +# (a) the Software, and +# +# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +# one is included with the Software each a "Larger Work" to which the Software +# is contributed by such licensors), +# +# without restriction, including without limitation the rights to copy, create +# derivative works of, display, perform, and distribute the Software and make, +# use, sell, offer for sale, import, export, have made, and have sold the +# Software and the Larger Work(s), and to sublicense the foregoing rights on +# either these or other terms. +# +# This license is subject to the following condition: +# +# The above copyright notice and either this complete permission notice or at a +# minimum a reference to the UPL must be included in all copies or substantial +# portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import unittest +import sys +import re +import subprocess +import platform + +# Both lists should remain as small as possible to avoid adding overhead to startup +expected_nosite_startup_modules = [ + '_frozen_importlib', + '_frozen_importlib_external', + 'builtins', + '__graalpython__', + '_weakref', + 'unicodedata', + '_sre', + '_sysconfig', + 'java', + 'pip_hook', +] + (['_nt'] if platform.system() == 'Windows' else []) + +expected_full_startup_modules = expected_nosite_startup_modules + [ + '_abc', + 'types', + '_weakrefset', + '_py_abc', + 'abc', + 'stat', + '_collections_abc', + 'genericpath', + *(['_winapi', 'ntpath'] if platform.system() == 'Windows' else ['posixpath']), + 'os', + '_sitebuiltins', + '_io', + 'io', + 'site', +] + +class StartupTests(unittest.TestCase): + @unittest.skipUnless(sys.implementation.name == 'graalpy', "GraalPy-specific test") + def test_startup_nosite(self): + result = subprocess.check_output([sys.executable, '--log.level=FINE', '-S', '-v', '-c', 'print("Hello")'], stderr=subprocess.STDOUT, text=True) + assert 'Hello' in result + imports = re.findall("import '(\S+)'", result) + self.assertEqual(expected_nosite_startup_modules, imports) + + @unittest.skipUnless(sys.implementation.name == 'graalpy', "GraalPy-specific test") + def test_startup_full(self): + result = subprocess.check_output([sys.executable, '--log.level=FINE', '-s', '-v', '-c', 'print("Hello")'], stderr=subprocess.STDOUT, text=True) + assert 'Hello' in result + imports = re.findall("import '(\S+)'", result) + self.assertEqual(expected_full_startup_modules, imports) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_string.py b/graalpython/com.oracle.graal.python.test/src/tests/test_string.py index 641f3f8f49..1eda246689 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_string.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_string.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2024, Oracle and/or its affiliates. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. # Copyright (C) 1996-2017 Python Software Foundation # # Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -1195,3 +1195,12 @@ class S(str): pass def test_literal_with_nonbmp_and_escapes(): # Check that escape processing didn't accidentally break the emoji into surrogates assert len("\\🤗\\") == 3 + + +def test_str_from_mmap(): + import mmap + size = len("GraalPy") + with mmap.mmap(-1, size) as mm: + mm.write(b"GraalPy") + mm.seek(0) + assert str(mm, encoding='utf-8') == 'GraalPy' diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_struct.py b/graalpython/com.oracle.graal.python.test/src/tests/test_struct.py index 7f401948a8..4fde738440 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_struct.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_struct.py @@ -179,10 +179,12 @@ def test_pack_large_long(): assert struct.unpack(fmt, b'\xff' * struct.calcsize(fmt)) == (-1,) for fmt in ('L', 'Q'): - assert struct.pack(fmt, 0) == b'\x00' * struct.calcsize(fmt) - assert struct.unpack(fmt, b'\x00' * struct.calcsize(fmt)) == (0,) - assert struct.pack(fmt, 18446744073709551615) == b'\xff\xff\xff\xff\xff\xff\xff\xff' - assert struct.unpack(fmt, b'\xff\xff\xff\xff\xff\xff\xff\xff') == (18446744073709551615,) + size = struct.calcsize(fmt) + assert struct.pack(fmt, 0) == b'\x00' * size + assert struct.unpack(fmt, b'\x00' * size) == (0,) + maxval = (1 << (size * 8)) - 1 + assert struct.pack(fmt, maxval) == b'\xff' * size + assert struct.unpack(fmt, b'\xff' * size) == (maxval,) def test_pack_into(): diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_structseq.py b/graalpython/com.oracle.graal.python.test/src/tests/test_structseq.py index 927b471c34..fe8d6e43b8 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_structseq.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_structseq.py @@ -1,4 +1,4 @@ -# Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_subprocess.py b/graalpython/com.oracle.graal.python.test/src/tests/test_subprocess.py index 07b3bd67e0..f52e0beef5 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_subprocess.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_subprocess.py @@ -3,6 +3,7 @@ # # Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 import unittest +import sys def test_os_pipe(): @@ -15,7 +16,8 @@ def test_os_pipe(): class TestSubprocess(unittest.TestCase): - def setUpClass(self): + @classmethod + def setUpClass(cls): global subprocess, io, sys import subprocess, io, sys @@ -88,6 +90,7 @@ def test_kill(self): assert True p.wait() + @unittest.skipIf(sys.platform == 'win32', "Posix-specific") def test_waitpid(self): import os p = subprocess.Popen([sys.executable, "-c", "import time; time.sleep(2); 42"]) @@ -97,12 +100,14 @@ def test_waitpid(self): p.kill() p.wait() + @unittest.skipIf(sys.platform == 'win32', "Posix-specific") def test_waitpid_group_child(self): import os p = subprocess.Popen([sys.executable, "-c", "import time; time.sleep(0.1); 42"]) res = os.waitpid(0, 0) assert res[1] == 0, res + @unittest.skipIf(sys.platform == 'win32', "Posix-specific") def test_waitpid_any_child(self): import os p = subprocess.Popen([sys.executable, "-c", "import time; time.sleep(0.1); 42"]) @@ -137,8 +142,9 @@ def test_java_asserts(self): result = subprocess.run([sys.executable, "-c", "import __graalpython__; not __graalpython__.java_assert()"]) assert result.returncode == 0 + @unittest.skipUnless(sys.implementation.name == 'graalpy', "GraalPy-specific test") + @unittest.skipIf(sys.platform == 'win32', "TODO the cmd replacement breaks the test") def test_graal_python_args(self): - import sys if sys.implementation.name == "graalpy": import subprocess diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_sum.py b/graalpython/com.oracle.graal.python.test/src/tests/test_sum.py index 4e71f08ae8..f46869c541 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_sum.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_sum.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -76,3 +76,39 @@ def test_iterator(): def test_basics(): assert sum([[1, 2], [3, 4]], []) == [1, 2, 3, 4] assert_raises(TypeError, sum, [1,2,3], None) + + +def test_specializations(): + # test sumIntIterator + assert sum([1, 2, 3]) == 6 + assert sum([1, 2, 3], 2) == 8 + assert sum([1, 2 ** 64, 3]) == 2 ** 64 + 4 + assert sum([2 ** 30, 2 ** 30]) == 2 ** 31 + # test sumLongIterator + assert sum([2 ** 32, 2 ** 32]) == 2 ** 33 + assert sum([2 ** 31, -(2 ** 30)]) == 2 ** 30 + assert sum([2 ** 62, 2 ** 62]) == 2 ** 63 + # test sumDoubleIterator + assert sum([1.0, 2.0, 3.1]) == 6.1 + assert sum([2.1], 1.0) == 3.1 + assert sum([2.1], 1) == 3.1 + assert sum([], 2.1) == 2.1 + l = [2.0] + del l[0] # To obtain an empty list with double storage + assert sum(l, 1) == 1 + assert type(sum(l, 1)) is int + # sumGeneric + l = ["a", 1, 2] + del l[0] # To obtain a list of integers with object storage + assert sum(l) == 3 + assert sum(l, 1) == 4 + l = ["a", 1.0, 2.1] + del l[0] # To obtain a list of doubles with object storage + assert sum(l) == 3.1 + assert sum(l, 1) == 4.1 + assert sum([1, 2.1]) == 3.1 + assert sum([1, 2.1], 1) == 4.1 + assert sum([2.1, 1]) == 3.1 + assert sum([2.1, 1], 1.0) == 4.1 + assert sum([], 1) == 1 + assert type(sum([], 1)) is int diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_sys_settrace.py b/graalpython/com.oracle.graal.python.test/src/tests/test_sys_settrace.py index 1216780454..dab08b66ac 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_sys_settrace.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_sys_settrace.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -37,6 +37,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +import os import unittest import difflib import sys @@ -160,6 +161,7 @@ def test_case(self): return test_case +@unittest.skipIf(os.environ.get('BYTECODE_DSL_INTERPRETER'), "TODO: FrameSlotTypeException with reparsing") class TraceTests(unittest.TestCase): def trace(self, frame, event, arg): code = frame.f_code diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_tagged_unittests.py b/graalpython/com.oracle.graal.python.test/src/tests/test_tagged_unittests.py deleted file mode 100644 index 2052777956..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_tagged_unittests.py +++ /dev/null @@ -1,357 +0,0 @@ -# Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# The Universal Permissive License (UPL), Version 1.0 -# -# Subject to the condition set forth below, permission is hereby granted to any -# person obtaining a copy of this software, associated documentation and/or -# data (collectively the "Software"), free of charge and under any and all -# copyright rights in the Software, and any and all patent rights owned or -# freely licensable by each licensor hereunder covering either (i) the -# unmodified Software as contributed to or provided by such licensor, or (ii) -# the Larger Works (as defined below), to deal in both -# -# (a) the Software, and -# -# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if -# one is included with the Software each a "Larger Work" to which the Software -# is contributed by such licensors), -# -# without restriction, including without limitation the rights to copy, create -# derivative works of, display, perform, and distribute the Software and make, -# use, sell, offer for sale, import, export, have made, and have sold the -# Software and the Larger Work(s), and to sublicense the foregoing rights on -# either these or other terms. -# -# This license is subject to the following condition: -# -# The above copyright notice and either this complete permission notice or at a -# minimum a reference to the UPL must be included in all copies or substantial -# portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -import test - -import glob -import os -import shlex -import subprocess -import sys -from itertools import zip_longest - -if os.environ.get("ENABLE_CPYTHON_TAGGED_UNITTESTS") == "true" or __name__ == "__main__": - TAGS_DIR = os.path.join(os.path.dirname(__file__), "unittest_tags") -else: - TAGS_DIR = "null" - -RUN_TIMEOUT = 90 * 60 -RETAG_TIMEOUT = 20 * 60 -RUNNER = os.path.join(os.path.dirname(__file__), "run_cpython_test.py") -LINE = "=" * 80 - -# some CI platforms are more unstable then others when it comes to tests -# involving many files, sockets, or threads. We skip some tests on some -# platforms -SKIPLIST = ( - ("darwin", None, "test_smtplib"), - ("darwin", None, "test_imaplib"), - (None, "arm", "test_smtplib"), - (None, "aarch64", "test_imaplib"), - (None, "arm", "test_multiprocessing_spawn"), - (None, "arm", "test_multiprocessing_graalpy"), - (None, "aarch64", "test_multiprocessing_spawn"), - (None, "aarch64", "test_multiprocessing_graalpy"), -) - - -def grouper(iterable, n): - args = [iter(iterable)] * n - return zip_longest(*args, fillvalue=None) - - -def working_selectors(tagfile): - if os.path.exists(tagfile): - with open(tagfile) as f: - return [line.strip() for line in f if line] - else: - return None - - -def collect_working_tests(): - working_tests = [] - glob_pattern = os.path.join(TAGS_DIR, "*.txt") - for arg in sys.argv: - if arg.startswith("--tagfile="): - glob_pattern = os.path.join(TAGS_DIR, arg.partition("=")[2]) - sys.argv.remove(arg) - break - for tagfile in glob.glob(glob_pattern): - test = os.path.splitext(os.path.basename(tagfile))[0] - working_tests.append((test, working_selectors(tagfile))) - return sorted(working_tests) - - -def make_test_function(working_test): - testmod = working_test[0].rpartition(".")[2] - - def test_tagged(): - max_patterns = 250 - for working_test_group in grouper(working_test[1], max_patterns): - cmd = [sys.executable] - if "--inspect" in sys.argv: - cmd.append("--inspect") - if "-debug-java" in sys.argv: - cmd.append("-debug-java") - cmd += [RUNNER, '-v'] - for testpattern in working_test_group: - if testpattern: - cmd.extend(["-k", testpattern]) - print("Running test:", working_test[0]) - testfile = os.path.join(os.path.dirname(test.__file__), "%s.py" % testmod) - if not os.path.isfile(testfile): - testfile = os.path.join(os.path.dirname(test.__file__), "%s/__init__.py" % testmod) - cmd.append(testfile) - if os.environ.get("ENABLE_THREADED_GRAALPYTEST") == "true": - run_serialize_out(cmd) - else: - rcode = run_with_timeout(cmd, timeout=RUN_TIMEOUT).returncode - if rcode: - raise subprocess.CalledProcessError(rcode, cmd) - print(working_test[0], "was finished.") - - def run_serialize_out(cmd): - result = run_with_timeout(cmd, timeout=RUN_TIMEOUT, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - append_out = "-v" in sys.argv - if result.returncode == 124: - message = f"{working_test[0]} timed out after {RUN_TIMEOUT}s.\n" - append_out = True - elif result.returncode: - message = f"{working_test[0]} failed with exit code {result.returncode}.\n" - append_out = True - else: - message = f"{working_test[0]} was finished\n" - if append_out: - message += LINE + "\n" - message += "output:\n" - message += result.stdout.decode('utf-8') - message += LINE + "\n" - print(message) - if result.returncode: - if result.returncode == 124: - raise subprocess.TimeoutExpired(cmd=cmd, timeout=RUN_TIMEOUT) - raise subprocess.CalledProcessError(result.returncode, cmd) - - if testmod.startswith('test_'): - test_tagged.__name__ = testmod - else: - test_tagged.__name__ = 'test_' + testmod - return test_tagged - - -def make_tests_class(): - import unittest - - global TestTaggedUnittests - - class TestTaggedUnittests(unittest.TestCase): - pass - - partial = os.environ.get('TAGGED_UNITTEST_PARTIAL') - if partial: - selected_str, total_str = partial.split('/', 1) - selected = int(selected_str) - 1 - total = int(total_str) - else: - selected = 0 - total = 1 - assert selected < total - - working_tests = collect_working_tests() - selection = os.environ.get('TAGGED_UNITTEST_SELECTION') - if not selection: - working_tests = working_tests[selected::total] - else: - if selection.startswith("~"): - deselection = set(s.strip() for s in selection[1:].split(",")) - working_tests = [x for x in working_tests[selected::total] if x[0] not in deselection] - else: - selection = set(s.strip() for s in selection.split(",")) - working_tests = [x for x in working_tests if x[0] in selection] - - this_os = sys.platform - this_machine = os.uname().machine if hasattr(os, "uname") else "" - for idx, working_test in enumerate(working_tests): - if os.environ.get("CI", None) and any( - (os is None or os in this_os) - and (machine is None or machine in this_machine) - and test == working_test[0] - for os, machine, test in SKIPLIST - ): - print("Skipping test from skiplist for this platform:", working_test[0]) - continue - fn = make_test_function(working_test) - fn.__name__ = "%s[%d/%d]" % (fn.__name__, idx + 1, len(working_tests)) - fn.__qualname__ = "%s.%s" % (TestTaggedUnittests.__name__, fn.__name__) - setattr(TestTaggedUnittests, fn.__name__, staticmethod(fn)) - - -# This function has a unittest in test_tagger -def parse_unittest_output(output): - # The whole reason for this function's complexity is that we want to consume arbitrary - # warnings after the '...' part without accidentally consuming the next test result - import re - re_test_result = re.compile(r"""\b(test\S*) \((\S+\1)\)(?:\n.*?)?? \.\.\. """, re.MULTILINE | re.DOTALL) - re_test_status = re.compile(r"""\b(ok|skipped (?:'[^']*'|"[^"]*")|FAIL|ERROR)$""", re.MULTILINE | re.DOTALL) - pos = 0 - current_result = None - while True: - result_match = re_test_result.search(output, pos) - status_match = re_test_status.search(output, pos) - if current_result and status_match and (not result_match or status_match.start() < result_match.start()): - yield current_result.group(2), status_match.group(1) - current_result = None - pos = status_match.end() - elif result_match: - current_result = result_match - pos = result_match.end() - else: - return - - -def run_with_timeout(cmd, *, timeout, **kwargs): - p = subprocess.getstatusoutput("which timeout" if sys.platform != 'darwin' else "which gtimeout") - if p[0] != 0: - print("Cannot find the 'timeout' GNU tool. Do you have coreutils installed?") - else: - timeout_cmd = p[1].strip() - # signal nr. 2 is SIGINT; this has better chances to print a Python traceback - cmd = [timeout_cmd, "-s", "2", "-k", "10", str(timeout)] + cmd - return subprocess.run(cmd, **kwargs) - - -def main(): - executable = sys.executable.split(" ") # HACK: our sys.executable on Java is a cmdline - kwargs = {"stdout": subprocess.PIPE, "stderr": subprocess.PIPE, "text": True, "check": False} - - glob_pattern = os.path.join(os.path.dirname(test.__file__), "test_*.py") - retag = False - maxrepeats = 4 - timeout = None - for arg in sys.argv[1:]: - if arg == "--retag": - retag = True - elif arg.startswith("--maxrepeats="): - maxrepeats = int(arg.partition("=")[2]) - elif arg.startswith("--timeout="): - timeout = int(arg.partition("=")[2]) - elif arg == "--help": - print(sys.argv[0] + " [--retag] [--maxrepeats=n] [glob]") - else: - if not (arg.endswith(".py") or arg.endswith("*")): - arg += ".py" - glob_pattern = os.path.join(os.path.dirname(test.__file__), arg) - - if not timeout: - timeout = RETAG_TIMEOUT if retag else RUN_TIMEOUT - testfiles = glob.glob(glob_pattern) - testfiles += glob.glob(glob_pattern.replace(".py", "/__init__.py")) - - for idx, testfile in enumerate(testfiles): - for repeat in range(maxrepeats): - # we always do this multiple times, because sometimes the tagging - # doesn't quite work e.g. we create a tags file that'll still fail - # when we use it. Thus, when we run this multiple times, we'll just - # use the tags and if it fails in the last run, we assume something - # sad is happening and delete the tags file to skip the tests - # entirely - if testfile.endswith("__init__.py"): - testfile_stem = os.path.basename(os.path.dirname(testfile)) - else: - testfile_stem = os.path.splitext(os.path.basename(testfile))[0] - testmod = "test." + testfile_stem - cmd = list(executable) - if repeat == 0: - # Allow catching Java exceptions in the first iteration only, so that subsequent iterations - # (there will be one even if everything succeeds) filter out possible false-passes caused by - # the tests catching all exceptions somewhere - cmd += ['--experimental-options', '--python.CatchAllExceptions'] - cmd += [RUNNER, "-v"] - tagfile = os.path.join(TAGS_DIR, testfile_stem + ".txt") - if retag and repeat == 0: - test_selectors = [] - else: - test_selectors = working_selectors(tagfile) - - if test_selectors is None: - # there's no tagfile for this, so it's not working at all (or - # shouldn't be tried). - continue - - print("[%d/%d, Try %d] Testing %s" % (idx + 1, len(testfiles), repeat + 1, testmod)) - for selector in test_selectors: - cmd += ["-k", selector] - cmd.append(testfile) - - print(shlex.join(cmd)) - p = run_with_timeout(cmd, timeout=timeout, errors='backslashreplace', **kwargs) - print("*stdout*") - print(p.stdout) - print("*stderr*") - print(p.stderr) - - if p.returncode == 124: - print( - f"\nTimed out\nYou can try to increase the current timeout {timeout}s by using --timeout=NNN") - - passing_tests = set() - failing_tests = set() - - # n.b.: we add a '*' in the front, so that unittests doesn't add - # its own asterisks, because now this is already a pattern - for testname, result in parse_unittest_output(p.stderr): - # We consider skipped tests as passing in order to avoid a situation where a Linux run - # untags a Darwin-only test and vice versa - pattern = f"*{testname}" - if result == 'ok' or result.startswith('skipped'): - passing_tests.add(pattern) - else: - failing_tests.add(pattern) - - with open(tagfile, "w") as f: - for passing_test in sorted(passing_tests - failing_tests): - f.write(passing_test) - f.write("\n") - if not passing_tests: - os.unlink(tagfile) - print("No successful tests detected") - break - - if p.returncode == 0: - if repeat == 0 and maxrepeats > 1: - print(f"Suite succeeded with {len(passing_tests)} tests, retrying to confirm tags are correct") - continue - print(f"Suite succeeded with {len(passing_tests)} tests") - break - else: - print(f"Suite failed, retrying with {len(passing_tests)} tests") - - else: - # we tried the last time and failed, so our tags don't work for - # some reason - print("The suite failed even in the last attempt, untagging completely") - try: - os.unlink(tagfile) - except Exception: - pass - - -if __name__ == '__main__': - main() -else: - make_tests_class() diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_tagger.py b/graalpython/com.oracle.graal.python.test/src/tests/test_tagger.py deleted file mode 100644 index cb1fee18d3..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_tagger.py +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# The Universal Permissive License (UPL), Version 1.0 -# -# Subject to the condition set forth below, permission is hereby granted to any -# person obtaining a copy of this software, associated documentation and/or -# data (collectively the "Software"), free of charge and under any and all -# copyright rights in the Software, and any and all patent rights owned or -# freely licensable by each licensor hereunder covering either (i) the -# unmodified Software as contributed to or provided by such licensor, or (ii) -# the Larger Works (as defined below), to deal in both -# -# (a) the Software, and -# -# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if -# one is included with the Software each a "Larger Work" to which the Software -# is contributed by such licensors), -# -# without restriction, including without limitation the rights to copy, create -# derivative works of, display, perform, and distribute the Software and make, -# use, sell, offer for sale, import, export, have made, and have sold the -# Software and the Larger Work(s), and to sublicense the foregoing rights on -# either these or other terms. -# -# This license is subject to the following condition: -# -# The above copyright notice and either this complete permission notice or at a -# minimum a reference to the UPL must be included in all copies or substantial -# portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -# test for the output parsing in test_tagged_unittests -from . import test_tagged_unittests - -data = """ -test_1 (module.test_1) ... ok -test2 (module.test2) ... FAIL -random output -test_2 (module.test_2) ... skipped 'requires Windows' -test_3 (module.test_3) ... skipped 'some -multiline reason' -some unrelated output -test_x (module.test_x) -Some docstring that -spans -multiple -lines ... ERROR -test_y (module.test_y) -Some docstring ... Some warning -ok -unrelated stuff -test_z (module.test_z) ... ok -testA (module.testA) ... test_B (module.test_B) ... ok -test_T (module.test_T) ... the test printed ok somewhere -skipped 'foo' -test_foo (module.test_foo) ... test_bar (module.test_bar) ... null -""" - -expected = [ - ('module.test_1', 'ok'), - ('module.test2', 'FAIL'), - ('module.test_2', "skipped 'requires Windows'"), - ('module.test_3', "skipped 'some\nmultiline reason'"), - ('module.test_x', 'ERROR'), - ('module.test_y', 'ok'), - ('module.test_z', 'ok'), - ('module.test_B', 'ok'), - ('module.test_T', "skipped 'foo'"), -] - - -def test_re(): - parsed = list(test_tagged_unittests.parse_unittest_output(data)) - assert parsed == expected, parsed diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_threading.py b/graalpython/com.oracle.graal.python.test/src/tests/test_threading.py new file mode 100644 index 0000000000..854a14d7d2 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_threading.py @@ -0,0 +1,62 @@ +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# The Universal Permissive License (UPL), Version 1.0 +# +# Subject to the condition set forth below, permission is hereby granted to any +# person obtaining a copy of this software, associated documentation and/or +# data (collectively the "Software"), free of charge and under any and all +# copyright rights in the Software, and any and all patent rights owned or +# freely licensable by each licensor hereunder covering either (i) the +# unmodified Software as contributed to or provided by such licensor, or (ii) +# the Larger Works (as defined below), to deal in both +# +# (a) the Software, and +# +# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +# one is included with the Software each a "Larger Work" to which the Software +# is contributed by such licensors), +# +# without restriction, including without limitation the rights to copy, create +# derivative works of, display, perform, and distribute the Software and make, +# use, sell, offer for sale, import, export, have made, and have sold the +# Software and the Larger Work(s), and to sublicense the foregoing rights on +# either these or other terms. +# +# This license is subject to the following condition: +# +# The above copyright notice and either this complete permission notice or at a +# minimum a reference to the UPL must be included in all copies or substantial +# portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +def test_stuck_thread(): + import sys + import subprocess + + if sys.implementation.name == 'graalpy' and __graalpython__.posix_module_backend() == 'java': + return + if sys.platform == 'win32': + return + + output = subprocess.check_output( + [ + sys.executable, + '-c', + """ +import threading +import select +threading.Thread(target=lambda: select.select([2], [], [])).start() +del threading._shutdown + """ + ] + ) + assert not output, "No output expected" diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_traceback.py b/graalpython/com.oracle.graal.python.test/src/tests/test_traceback.py index b5c6c086f9..2bb294e41e 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_traceback.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_traceback.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -36,8 +36,9 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. - +import os import sys +import unittest def assert_raises(err, fn, *args, **kwargs): @@ -103,6 +104,7 @@ def test(): ) +@unittest.skipIf(os.environ.get('BYTECODE_DSL_INTERPRETER'), "TODO: correct generator tracebacks") def test_basic_traceback_generator(): def foo(): yield 1 @@ -139,6 +141,7 @@ def reraise(): ) +@unittest.skipIf(os.environ.get('BYTECODE_DSL_INTERPRETER'), "TODO: bug in comment above") def test_reraise_direct_generator(): def reraise(): try: @@ -398,6 +401,7 @@ def reraise_from_finally(): ) +@unittest.skipIf(os.environ.get('BYTECODE_DSL_INTERPRETER'), "TODO: bug in comment above") def test_finally_generator(): def test(): try: @@ -422,6 +426,7 @@ def test(): ) +@unittest.skipIf(os.environ.get('BYTECODE_DSL_INTERPRETER'), "TODO: bug in comment above") def test_reraise_from_finally_generator(): def reraise_from_finally(): try: @@ -486,6 +491,7 @@ def test(): ) +@unittest.skipIf(os.environ.get('BYTECODE_DSL_INTERPRETER'), "TODO: correct generator tracebacks") def test_generator_throw_existing(): try: raise OverflowError @@ -508,6 +514,7 @@ def test(): ) +@unittest.skipIf(os.environ.get('BYTECODE_DSL_INTERPRETER'), "TODO: correct generator tracebacks") def test_generator_throw_with_traceback(): try: raise NameError diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_tuple.py b/graalpython/com.oracle.graal.python.test/src/tests/test_tuple.py index fa98f257dd..4f0094f8b5 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_tuple.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_tuple.py @@ -4,8 +4,8 @@ # Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 import sys -import seq_tests -from compare import CompareTest +from tests import seq_tests +from tests.compare import CompareTest class TupleTest(seq_tests.CommonTest): diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_venv.py b/graalpython/com.oracle.graal.python.test/src/tests/test_venv.py index 8744fed75f..6fed074ce1 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_venv.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_venv.py @@ -1,4 +1,4 @@ -# Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # The Universal Permissive License (UPL), Version 1.0 @@ -42,20 +42,22 @@ import subprocess import sys import tempfile - +import unittest BINDIR = 'bin' if sys.platform != 'win32' else 'Scripts' EXESUF = '' if sys.platform != 'win32' else '.exe' -class VenvTest(): - def setUpClass(self): - self.env_dir = os.path.realpath(tempfile.mkdtemp()) - self.env_dir2 = os.path.realpath(tempfile.mkdtemp()) +class VenvTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.env_dir = os.path.realpath(tempfile.mkdtemp()) + cls.env_dir2 = os.path.realpath(tempfile.mkdtemp()) - def tearDownClass(self): - shutil.rmtree(self.env_dir) - shutil.rmtree(self.env_dir2) + @classmethod + def tearDownClass(cls): + shutil.rmtree(cls.env_dir) + shutil.rmtree(cls.env_dir2) def test_venv_launcher(self): if sys.platform != "win32": @@ -81,6 +83,7 @@ def test_venv_launcher(self): assert f"Hello {tmpfile}" in out, out assert f'Original "{sys.executable}"' in out, out + @unittest.skipIf(os.environ.get('BYTECODE_DSL_INTERPRETER'), "TODO: issue with passing Bytecode DSL flag to subprocesses") def test_create_and_use_basic_venv(self): run = None run_output = '' @@ -95,6 +98,7 @@ def test_create_and_use_basic_venv(self): if sys.platform != 'win32': assert self.env_dir in run, run + @unittest.skipIf(os.environ.get('BYTECODE_DSL_INTERPRETER'), "TODO: issue with passing Bytecode DSL flag to subprocesses") def test_create_and_use_venv_with_pip(self): run = None msg = '' diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_with-test-2.py b/graalpython/com.oracle.graal.python.test/src/tests/test_with-test-2.py index 5718c57a68..3cbd4fb81f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_with-test-2.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_with-test-2.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Copyright (c) 2018, 2024, Oracle and/or its affiliates. # Copyright (c) 2013, Regents of the University of California # # All rights reserved. @@ -23,8 +23,10 @@ # OF THE POSSIBILITY OF SUCH DAMAGE. # Gulfem & Qunaibit 03/02/2014 # With Statement (As name as Tuple) +import unittest -class GrammarTest(object): + +class GrammarTest(unittest.TestCase): def test_with_statement(self): class manager(object): def __enter__(self): diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_yield_from.py b/graalpython/com.oracle.graal.python.test/src/tests/test_yield_from.py index f57f6aa8c3..0b0799923b 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_yield_from.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_yield_from.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Copyright (c) 2018, 2025, Oracle and/or its affiliates. # Copyright (C) 1996-2017 Python Software Foundation # # Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -12,6 +12,7 @@ import unittest import sys +import os class TestPEP380Operation(unittest.TestCase): """ @@ -975,6 +976,7 @@ def g(): # for stack in spam(eggs(gen())): # self.assertTrue('spam' in stack and 'eggs' in stack) + @unittest.skipIf(os.environ.get('BYTECODE_DSL_INTERPRETER'), "TODO: bug in comment above") def test_custom_iterator_return(self): # See issue #15568 class MyIter: diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_zipimport.py b/graalpython/com.oracle.graal.python.test/src/tests/test_zipimport.py index 01177206d8..4d2ffd3273 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_zipimport.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_zipimport.py @@ -29,28 +29,31 @@ def get_file(): EGG_ABS_PATH = os.path.abspath(EGG_PATH); GR15813_PATH = os.path.join(DIR_PATH, GR15813_FILE_NAME) -class ZipImportBaseTestCase(unittest.TestCase): +class ZipImportBaseTestCase: - def setUpClass(self): + @classmethod + def setUpClass(cls): zipimport._zip_directory_cache.clear() - self.path = sys.path[:] - self.meta_path = sys.meta_path[:] - self.path_hooks = sys.path_hooks[:] + cls.path = sys.path[:] + cls.meta_path = sys.meta_path[:] + cls.path_hooks = sys.path_hooks[:] sys.path_importer_cache.clear() - self.modules_before = import_helper.modules_setup() + cls.modules_before = import_helper.modules_setup() - def tearDownClass(self): - sys.path[:] = self.path - sys.meta_path[:] = self.meta_path - sys.path_hooks[:] = self.path_hooks + @classmethod + def tearDownClass(cls): + sys.path[:] = cls.path + sys.meta_path[:] = cls.meta_path + sys.path_hooks[:] = cls.path_hooks sys.path_importer_cache.clear() - import_helper.modules_cleanup(*self.modules_before) + import_helper.modules_cleanup(*cls.modules_before) -class BasicZipImportTests(ZipImportBaseTestCase): +class BasicZipImportTests(ZipImportBaseTestCase, unittest.TestCase): - def setUpClass(self): - ZipImportBaseTestCase.setUpClass(self) - self.z = zipimport.zipimporter(ZIP_PATH) + @classmethod + def setUpClass(cls): + ZipImportBaseTestCase.setUpClass() + cls.z = zipimport.zipimporter(ZIP_PATH) def test_zipimporter_attribute(self): self.assertTrue(self.z.prefix == "") @@ -58,8 +61,8 @@ def test_zipimporter_attribute(self): self.assertTrue(type(self.z._files) is dict) self.assertTrue(self.z._files["MyTestModule.py"] is not None) self.assertTrue(self.z._files["empty.txt"] is not None) - self.assertTrue(self.z._files["packageA/moduleC.py"] is not None) - self.assertTrue(self.z._files["cesta/moduleA.py"] is not None) + self.assertTrue(self.z._files[os.path.join("packageA", "moduleC.py")] is not None) + self.assertTrue(self.z._files[os.path.join("cesta", "moduleA.py")] is not None) def test_create_zipimport_from_string(self): zipimport._zip_directory_cache.clear() @@ -69,48 +72,48 @@ def test_create_zipimport_from_string(self): def test_zipimporter_find_module(self): self.assertTrue(self.z is self.z.find_module("MyTestModule")) self.assertTrue(self.z is self.z.find_module("packageA")) - self.assertTrue(self.z is self.z.find_module("packageA/moduleC")) + self.assertTrue(self.z is self.z.find_module(os.path.join("packageA", "moduleC"))) self.assertTrue(None is self.z.find_module("packageA.moduleC")) - self.assertTrue(self.z is self.z.find_module("cesta/moduleA")) + self.assertTrue(self.z is self.z.find_module(os.path.join("cesta", "moduleA"))) def test_zipimporter_get_code(self): self.assertTrue(self.z.get_code("MyTestModule").co_filename.endswith("MyTestModule.py")) - self.assertTrue(self.z.get_code("packageA").co_filename.endswith("packageA/__init__.py")) - self.assertTrue(self.z.get_code("packageA/moduleC").co_filename.endswith("packageA/moduleC.py")) - self.assertTrue(self.z.get_code("cesta/moduleA").co_filename.endswith("cesta/moduleA.py")) + self.assertTrue(self.z.get_code("packageA").co_filename.endswith(os.path.join("packageA", "__init__.py"))) + self.assertTrue(self.z.get_code(os.path.join("packageA", "moduleC")).co_filename.endswith(os.path.join("packageA", "moduleC.py"))) + self.assertTrue(self.z.get_code(os.path.join("cesta", "moduleA")).co_filename.endswith(os.path.join("cesta", "moduleA.py"))) self.assertRaises(ZipImportError, self.z.get_code, "wrongname") self.assertRaises(ZipImportError, self.z.get_code, "") def test_zipimporter_get_data(self): self.assertTrue(type(self.z.get_data("MyTestModule.py")) is bytes) - self.assertTrue(type(self.z.get_data("packageA/moduleC.py")) is bytes) - self.assertTrue(type(self.z.get_data("cesta/moduleA.py")) is bytes) + self.assertTrue(type(self.z.get_data(os.path.join("packageA", "moduleC.py"))) is bytes) + self.assertTrue(type(self.z.get_data(os.path.join("cesta", "moduleA.py"))) is bytes) self.assertRaises(OSError, self.z.get_data, "") self.assertRaises(OSError, self.z.get_data, "MyTestModule") self.assertRaises(OSError, self.z.get_data, "packageA") - self.assertTrue(type(self.z.get_data(ZIP_ABS_PATH + "/MyTestModule.py")) is bytes) - self.assertTrue(type(self.z.get_data(ZIP_ABS_PATH + "/packageA/moduleC.py")) is bytes) - self.assertTrue(type(self.z.get_data(ZIP_ABS_PATH + "/cesta/moduleA.py")) is bytes) - self.assertTrue(type(self.z.get_data(ZIP_ABS_PATH + "/read.me")) is bytes) + self.assertTrue(type(self.z.get_data(os.path.join(ZIP_ABS_PATH, "MyTestModule.py"))) is bytes) + self.assertTrue(type(self.z.get_data(os.path.join(ZIP_ABS_PATH, "packageA", "moduleC.py"))) is bytes) + self.assertTrue(type(self.z.get_data(os.path.join(ZIP_ABS_PATH, "cesta", "moduleA.py"))) is bytes) + self.assertTrue(type(self.z.get_data(os.path.join(ZIP_ABS_PATH, "read.me"))) is bytes) self.assertTrue(type(self.z.get_data("empty.txt")) is bytes) - self.assertRaises(OSError, self.z.get_data, "/empty.txt") + self.assertRaises(OSError, self.z.get_data, os.sep + "empty.txt") def test_zipimporter_get_filename(self): - self.assertEqual(self.z.get_filename("packageA"), ZIP_ABS_PATH + "/packageA/__init__.py") - self.assertEqual(self.z.get_filename("MyTestModule"), ZIP_ABS_PATH + "/MyTestModule.py") + self.assertEqual(self.z.get_filename("packageA"), os.path.join(ZIP_ABS_PATH, "packageA", "__init__.py")) + self.assertEqual(self.z.get_filename("MyTestModule"), os.path.join(ZIP_ABS_PATH, "MyTestModule.py")) self.assertRaises(ZipImportError, self.z.get_filename, "empty.txt") self.assertRaises(ZipImportError, self.z.get_filename, "empty") def test_zipimporter_get_source(self): self.assertTrue(type(self.z.get_source("MyTestModule")) is str) self.assertTrue(type(self.z.get_source("packageA")) is str) - self.assertTrue(type(self.z.get_source("packageA/moduleC")) is str) + self.assertTrue(type(self.z.get_source(os.path.join("packageA", "moduleC"))) is str) self.assertRaises(ZipImportError, self.z.get_source, "packageA.moduleC") def test_zipimporter_is_package(self): self.assertTrue(self.z.is_package("packageA")) self.assertFalse(self.z.is_package("MyTestModule")) - self.assertFalse(self.z.is_package("packageA/moduleC")) + self.assertFalse(self.z.is_package(os.path.join("packageA", "moduleC"))) self.assertRaises(ZipImportError, self.z.is_package, "empty") self.assertRaises(ZipImportError, self.z.is_package, "cesta") self.assertRaises(ZipImportError, self.z.is_package, "packageA.moduleC") @@ -118,52 +121,56 @@ def test_zipimporter_is_package(self): def test_zipimporter_load_module(self): self.assertTrue(self.z.load_module("MyTestModule").__loader__ is self.z) self.assertTrue(self.z.load_module("packageA").__loader__ is self.z) - self.assertTrue(self.z.load_module("packageA/moduleC").__loader__ is self.z) - self.assertTrue(self.z.load_module("cesta/moduleA").__loader__ is self.z) + self.assertTrue(self.z.load_module(os.path.join("packageA", "moduleC")).__loader__ is self.z) + self.assertTrue(self.z.load_module(os.path.join("cesta", "moduleA")).__loader__ is self.z) self.assertRaises(ZipImportError, self.z.load_module, "packageA.moduleC") -class ZipImportWithPrefixTests(ZipImportBaseTestCase): +class ZipImportWithPrefixTests(ZipImportBaseTestCase, unittest.TestCase): - def setUpClass(self): - ZipImportBaseTestCase.setUpClass(self) - self.z = zipimport.zipimporter(ZIP_PATH + "/cesta") + @classmethod + def setUpClass(cls): + ZipImportBaseTestCase.setUpClass() + cls.z = zipimport.zipimporter(os.path.join(ZIP_PATH, "cesta")) - def tearDownClass(self): + @classmethod + def tearDownClass(cls): zipimport._zip_directory_cache.clear() def test_zipimporter_with_prefix_attribute(self): - self.assertTrue(self.z.prefix == "cesta/") + self.assertTrue(self.z.prefix == "cesta" + os.sep) self.assertTrue(self.z.archive == ZIP_ABS_PATH) self.assertTrue(type(self.z._files) is dict) self.assertTrue(self.z._files["MyTestModule.py"] is not None) self.assertTrue(self.z._files["empty.txt"] is not None) - self.assertTrue(self.z._files["packageA/moduleC.py"] is not None) - self.assertTrue(self.z._files["cesta/moduleA.py"] is not None) + self.assertTrue(self.z._files[os.path.join("packageA", "moduleC.py")] is not None) + self.assertTrue(self.z._files[os.path.join("cesta", "moduleA.py")] is not None) def test_zipimporter_with_prefix_find_module(self): self.assertTrue(None is self.z.find_module("MyTestModule")) self.assertTrue(None is self.z.find_module("packageA")) - self.assertTrue(None is self.z.find_module("packageA/moduleC")) + self.assertTrue(None is self.z.find_module(os.path.join("packageA", "moduleC"))) self.assertTrue(None is self.z.find_module("packageA.moduleC")) self.assertTrue(self.z is self.z.find_module("moduleA")) -class ImportTests(ZipImportBaseTestCase): +class ImportTests(ZipImportBaseTestCase, unittest.TestCase): - def setUpClass(self): - ZipImportBaseTestCase.setUpClass(self) + @classmethod + def setUpClass(cls): + ZipImportBaseTestCase.setUpClass() sys.path.insert(0, ZIP_PATH) def test_module_import(self): m = importlib.import_module("MyTestModule") - self.assertTrue (m.get_file() == ZIP_ABS_PATH + "/MyTestModule.py") + self.assertTrue (m.get_file() == os.path.join(ZIP_ABS_PATH, "MyTestModule.py")) p = importlib.import_module("packageA.moduleC") - self.assertTrue (p.get_file() == ZIP_ABS_PATH + "/packageA/moduleC.py") + self.assertTrue (p.get_file() == os.path.join(ZIP_ABS_PATH, "packageA", "moduleC.py")) -class BasicEggImportTests(ZipImportBaseTestCase): +class BasicEggImportTests(ZipImportBaseTestCase, unittest.TestCase): - def setUpClass(self): - ZipImportBaseTestCase.setUpClass(self) - self.z = zipimport.zipimporter(EGG_PATH) + @classmethod + def setUpClass(cls): + ZipImportBaseTestCase.setUpClass() + cls.z = zipimport.zipimporter(EGG_PATH) def test_zipimporter_egg(self): self.assertTrue(self.z.prefix == "") @@ -182,12 +189,13 @@ def test_egg_get_readme(self): self.assertTrue(type(data) is bytes) self.assertEqual(bytes(b'Pokus\n'), data) -class GR15813ImportTests(ZipImportBaseTestCase): +class GR15813ImportTests(ZipImportBaseTestCase, unittest.TestCase): # don't edit the zip file !!! - def setUpClass(self): - ZipImportBaseTestCase.setUpClass(self) - self.z = zipimport.zipimporter(GR15813_PATH) + @classmethod + def setUpClass(cls): + ZipImportBaseTestCase.setUpClass() + cls.z = zipimport.zipimporter(GR15813_PATH) def test_zipimporter_gr_18813(self): self.assertTrue(self.z.prefix == "") diff --git a/graalpython/com.oracle.graal.python.test/src/tests/test_zlib.py b/graalpython/com.oracle.graal.python.test/src/tests/test_zlib.py index 5c98c57d10..7b12ab9d81 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/test_zlib.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/test_zlib.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018, 2022, Oracle and/or its affiliates. +# Copyright (c) 2018, 2024, Oracle and/or its affiliates. # Copyright (C) 1996-2017 Python Software Foundation # # Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -74,7 +74,6 @@ def test_same_as_binascii_crc32(self): self.assertEqual(binascii.crc32(b'spam'), zlib.crc32(b'spam')) self.assertEqual(binascii.crc32(b'spam', 0x80000000), zlib.crc32(b'spam', 0x80000000)) - @unittest.skipIf(sys.version_info.minor < 8) def test_index(self): self.assertEqual(zlib.crc32(b'ahoj', MyIndexObject(10)), 3299199656) self.assertEqual(zlib.adler32(b'ahoj', MyIndexObject(10)), 69992876) diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test___all__.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test___all__.txt index a629412fde..648a092a22 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test___all__.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test___all__.txt @@ -1 +1 @@ -*graalpython.lib-python.3.test.test___all__.AllTest.test_all +test.test___all__.AllTest.test_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test__locale.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test__locale.txt index d438edbdca..219162ce5b 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test__locale.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test__locale.txt @@ -1,4 +1,2 @@ -*graalpython.lib-python.3.test.test__locale._LocaleTests.test_float_parsing -*graalpython.lib-python.3.test.test__locale._LocaleTests.test_lc_numeric_basic -*graalpython.lib-python.3.test.test__locale._LocaleTests.test_lc_numeric_localeconv -*graalpython.lib-python.3.test.test__locale._LocaleTests.test_lc_numeric_nl_langinfo +test.test__locale._LocaleTests.test_float_parsing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test__locale._LocaleTests.test_lc_numeric_localeconv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test__osx_support.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test__osx_support.txt index 2dbca34c48..37c00666eb 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test__osx_support.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test__osx_support.txt @@ -1,16 +1,16 @@ -*graalpython.lib-python.3.test.test__osx_support.Test_OSXSupport.test__check_for_unavailable_sdk -*graalpython.lib-python.3.test.test__osx_support.Test_OSXSupport.test__check_for_unavailable_sdk_alternate -*graalpython.lib-python.3.test.test__osx_support.Test_OSXSupport.test__find_appropriate_compiler -*graalpython.lib-python.3.test.test__osx_support.Test_OSXSupport.test__find_build_tool -*graalpython.lib-python.3.test.test__osx_support.Test_OSXSupport.test__find_executable -*graalpython.lib-python.3.test.test__osx_support.Test_OSXSupport.test__get_system_version -*graalpython.lib-python.3.test.test__osx_support.Test_OSXSupport.test__override_all_archs -*graalpython.lib-python.3.test.test__osx_support.Test_OSXSupport.test__read_output -*graalpython.lib-python.3.test.test__osx_support.Test_OSXSupport.test__remove_original_values -*graalpython.lib-python.3.test.test__osx_support.Test_OSXSupport.test__remove_universal_flags -*graalpython.lib-python.3.test.test__osx_support.Test_OSXSupport.test__remove_universal_flags_alternate -*graalpython.lib-python.3.test.test__osx_support.Test_OSXSupport.test__remove_unsupported_archs -*graalpython.lib-python.3.test.test__osx_support.Test_OSXSupport.test__save_modified_value -*graalpython.lib-python.3.test.test__osx_support.Test_OSXSupport.test__save_modified_value_unchanged -*graalpython.lib-python.3.test.test__osx_support.Test_OSXSupport.test__supports_universal_builds -*graalpython.lib-python.3.test.test__osx_support.Test_OSXSupport.test_get_platform_osx +test.test__osx_support.Test_OSXSupport.test__check_for_unavailable_sdk @ darwin-arm64,darwin-x86_64 +test.test__osx_support.Test_OSXSupport.test__check_for_unavailable_sdk_alternate @ darwin-arm64,darwin-x86_64 +test.test__osx_support.Test_OSXSupport.test__find_appropriate_compiler @ darwin-arm64,darwin-x86_64 +test.test__osx_support.Test_OSXSupport.test__find_build_tool @ darwin-arm64,darwin-x86_64 +test.test__osx_support.Test_OSXSupport.test__find_executable @ darwin-arm64,darwin-x86_64 +test.test__osx_support.Test_OSXSupport.test__get_system_version @ darwin-arm64,darwin-x86_64 +test.test__osx_support.Test_OSXSupport.test__override_all_archs @ darwin-arm64,darwin-x86_64 +test.test__osx_support.Test_OSXSupport.test__read_output @ darwin-arm64,darwin-x86_64 +test.test__osx_support.Test_OSXSupport.test__remove_original_values @ darwin-arm64,darwin-x86_64 +test.test__osx_support.Test_OSXSupport.test__remove_universal_flags @ darwin-arm64,darwin-x86_64 +test.test__osx_support.Test_OSXSupport.test__remove_universal_flags_alternate @ darwin-arm64,darwin-x86_64 +test.test__osx_support.Test_OSXSupport.test__remove_unsupported_archs @ darwin-arm64,darwin-x86_64 +test.test__osx_support.Test_OSXSupport.test__save_modified_value @ darwin-arm64,darwin-x86_64 +test.test__osx_support.Test_OSXSupport.test__save_modified_value_unchanged @ darwin-arm64,darwin-x86_64 +test.test__osx_support.Test_OSXSupport.test__supports_universal_builds @ darwin-arm64,darwin-x86_64 +test.test__osx_support.Test_OSXSupport.test_get_platform_osx @ darwin-arm64,darwin-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_abc.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_abc.txt index f4d18398bd..fa8eee67bc 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_abc.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_abc.txt @@ -1,36 +1,36 @@ -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_ABC_has___slots__ -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_ABC_helper -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_abstractclassmethod_basics -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_abstractmethod_basics -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_abstractmethod_integration -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_abstractproperty_basics -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_abstractstaticmethod_basics -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_all_new_methods_are_called -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_customdescriptors_with_abstractmethod -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_descriptors_with_abstractmethod -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_isinstance_invalidation -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_issubclass_bad_arguments -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_metaclass_abc -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_object_new_with_many_abstractmethods -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_object_new_with_one_abstractmethod -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_register_as_class_deco -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_register_non_class -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_registration_basics -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_registration_builtins -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_registration_edge_cases -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_registration_transitiveness -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_subclasshook -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_tricky_new_works -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_update_as_decorator -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_update_del -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_update_del_implementation -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_update_implementation -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_update_layered_implementation -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_update_multi_inheritance -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_update_new_abstractmethods -*graalpython.lib-python.3.test.test_abc.test_factory..TestABC.test_update_non_abc -*graalpython.lib-python.3.test.test_abc.test_factory..TestABCWithInitSubclass.test_positional_only_and_kwonlyargs_with_init_subclass -*graalpython.lib-python.3.test.test_abc.test_factory..TestABCWithInitSubclass.test_works_with_init_subclass -*graalpython.lib-python.3.test.test_abc.test_factory..TestLegacyAPI.test_abstractclassmethod_basics -*graalpython.lib-python.3.test.test_abc.test_factory..TestLegacyAPI.test_abstractproperty_basics -*graalpython.lib-python.3.test.test_abc.test_factory..TestLegacyAPI.test_abstractstaticmethod_basics +test.test_abc.test_factory..TestABC.test_ABC_has___slots__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_ABC_helper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_abstractclassmethod_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_abstractmethod_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_abstractmethod_integration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_abstractproperty_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_abstractstaticmethod_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_all_new_methods_are_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_customdescriptors_with_abstractmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_descriptors_with_abstractmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_isinstance_invalidation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_issubclass_bad_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_metaclass_abc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_object_new_with_many_abstractmethods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_object_new_with_one_abstractmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_register_as_class_deco @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_register_non_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_registration_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_registration_builtins @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_registration_edge_cases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_registration_transitiveness @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_subclasshook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_tricky_new_works @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_update_as_decorator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_update_del @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_update_del_implementation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_update_implementation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_update_layered_implementation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_update_multi_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_update_new_abstractmethods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABC.test_update_non_abc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABCWithInitSubclass.test_positional_only_and_kwonlyargs_with_init_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestABCWithInitSubclass.test_works_with_init_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestLegacyAPI.test_abstractclassmethod_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestLegacyAPI.test_abstractproperty_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_abc.test_factory..TestLegacyAPI.test_abstractstaticmethod_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_abstract_numbers.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_abstract_numbers.txt index e0f0bca19d..07e522983e 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_abstract_numbers.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_abstract_numbers.txt @@ -1,3 +1,3 @@ -*graalpython.lib-python.3.test.test_abstract_numbers.TestNumbers.test_complex -*graalpython.lib-python.3.test.test_abstract_numbers.TestNumbers.test_float -*graalpython.lib-python.3.test.test_abstract_numbers.TestNumbers.test_int +test.test_abstract_numbers.TestNumbers.test_complex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_abstract_numbers.TestNumbers.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_abstract_numbers.TestNumbers.test_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_argparse.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_argparse.txt index 46a0e29d7a..1b45bf37aa 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_argparse.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_argparse.txt @@ -1,1706 +1,1706 @@ -*graalpython.lib-python.3.test.test_argparse.StdStreamTest.test_skip_invalid_stderr -*graalpython.lib-python.3.test.test_argparse.StdStreamTest.test_skip_invalid_stdout -*graalpython.lib-python.3.test.test_argparse.TestActionExtend.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestActionExtend.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestActionExtend.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestActionExtend.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestActionExtend.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestActionExtend.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestActionExtend.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestActionExtend.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestActionExtend.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestActionExtend.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestActionExtend.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestActionExtend.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestActionRegistration.test -*graalpython.lib-python.3.test.test_argparse.TestActionUserDefined.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestActionUserDefined.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestActionUserDefined.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestActionUserDefined.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestActionUserDefined.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestActionUserDefined.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestActionUserDefined.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestActionUserDefined.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestActionUserDefined.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestActionUserDefined.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestActionUserDefined.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestActionUserDefined.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestActionsReturned.test_dest -*graalpython.lib-python.3.test.test_argparse.TestActionsReturned.test_misc -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_1_metavar_length0 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_1_metavar_length1 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_1_metavar_length2 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_1_metavar_length3 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_1_metavar_string -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_2_metavar_length0 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_2_metavar_length1 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_2_metavar_length2 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_2_metavar_length3 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_2_metavar_string -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_3_metavar_length0 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_3_metavar_length1 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_3_metavar_length2 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_3_metavar_length3 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_3_metavar_string -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_None_metavar_length0 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_None_metavar_length1 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_None_metavar_length2 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_None_metavar_length3 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_None_metavar_string -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_oneormore_metavar_length0 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_oneormore_metavar_length1 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_oneormore_metavar_length2 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_oneormore_metavar_length3 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_oneormore_metavar_string -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_optional_metavar_length0 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_optional_metavar_length1 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_optional_metavar_length2 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_optional_metavar_length3 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_optional_metavar_string -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_parser_metavar_length0 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_parser_metavar_length1 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_parser_metavar_length2 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_parser_metavar_length3 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_parser_metavar_string -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_remainder_metavar_length0 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_remainder_metavar_length1 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_remainder_metavar_length2 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_remainder_metavar_length3 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_remainder_metavar_string -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_zeroormore_metavar_length0 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_zeroormore_metavar_length1 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_zeroormore_metavar_length2 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_zeroormore_metavar_length3 -*graalpython.lib-python.3.test.test_argparse.TestAddArgumentMetavar.test_nargs_zeroormore_metavar_string -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_alias_help -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_alias_invocation -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_dest -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_error_alias_invocation -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_help -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_help_alternate_prefix_chars -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_help_blank -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_help_extra_prefix_chars -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_help_non_breaking_spaces -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_optional_subparsers -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_parse_args -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_parse_args_failures -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_parse_known_args -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_parser_command_help -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_required_subparsers_default -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_required_subparsers_no_destination_error -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_required_subparsers_via_attribute -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_required_subparsers_via_kwarg -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_subparser1_help -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_subparser2_help -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_subparser_title_help -*graalpython.lib-python.3.test.test_argparse.TestAddSubparsers.test_wrong_argument_subparsers_no_destination_error -*graalpython.lib-python.3.test.test_argparse.TestArgumentError.test_argument_error -*graalpython.lib-python.3.test.test_argparse.TestArgumentTypeError.test_argument_type_error -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFile.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFile.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFile.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFile.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFile.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFile.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFile.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFile.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFile.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFile.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFile.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFile.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFileConverter.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFileConverter.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFileConverter.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFileConverter.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFileConverter.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFileConverter.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFileConverter.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFileConverter.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFileConverter.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFileConverter.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFileConverter.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestArgumentsFromFileConverter.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalAction.test_const -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalAction.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalAction.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalAction.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalAction.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalAction.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalAction.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalAction.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalAction.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalAction.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalAction.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalAction.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalAction.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalActionRequired.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalActionRequired.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalActionRequired.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalActionRequired.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalActionRequired.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalActionRequired.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalActionRequired.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalActionRequired.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalActionRequired.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalActionRequired.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalActionRequired.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestBooleanOptionalActionRequired.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestConflictHandling.test_bad_type -*graalpython.lib-python.3.test.test_argparse.TestConflictHandling.test_conflict_error -*graalpython.lib-python.3.test.test_argparse.TestConflictHandling.test_resolve_error -*graalpython.lib-python.3.test.test_argparse.TestConflictHandling.test_subparser_conflict -*graalpython.lib-python.3.test.test_argparse.TestConstActionsMissingConstKwarg.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestConstActionsMissingConstKwarg.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestConstActionsMissingConstKwarg.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestConstActionsMissingConstKwarg.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestConstActionsMissingConstKwarg.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestConstActionsMissingConstKwarg.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestConstActionsMissingConstKwarg.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestConstActionsMissingConstKwarg.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestConstActionsMissingConstKwarg.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestConstActionsMissingConstKwarg.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestConstActionsMissingConstKwarg.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestConstActionsMissingConstKwarg.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestDefaultSuppress.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestDefaultSuppress.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestDefaultSuppress.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestDefaultSuppress.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestDefaultSuppress.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestDefaultSuppress.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestDefaultSuppress.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestDefaultSuppress.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestDefaultSuppress.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestDefaultSuppress.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestDefaultSuppress.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestDefaultSuppress.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestEmptyAndSpaceContainingArguments.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestEmptyAndSpaceContainingArguments.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestEmptyAndSpaceContainingArguments.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestEmptyAndSpaceContainingArguments.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestEmptyAndSpaceContainingArguments.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestEmptyAndSpaceContainingArguments.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestEmptyAndSpaceContainingArguments.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestEmptyAndSpaceContainingArguments.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestEmptyAndSpaceContainingArguments.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestEmptyAndSpaceContainingArguments.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestEmptyAndSpaceContainingArguments.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestEmptyAndSpaceContainingArguments.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestEncoding.test_argparse_module_encoding -*graalpython.lib-python.3.test.test_argparse.TestEncoding.test_test_argparse_module_encoding -*graalpython.lib-python.3.test.test_argparse.TestExitOnError.test_exit_on_error_with_bad_args -*graalpython.lib-python.3.test.test_argparse.TestExitOnError.test_exit_on_error_with_good_args -*graalpython.lib-python.3.test.test_argparse.TestFileTypeDefaults.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeDefaults.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeDefaults.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeDefaults.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeDefaults.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeDefaults.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeDefaults.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeDefaults.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeDefaults.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeDefaults.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeDefaults.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeDefaults.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeMissingInitialization.test -*graalpython.lib-python.3.test.test_argparse.TestFileTypeOpenArgs.test_open_args -*graalpython.lib-python.3.test.test_argparse.TestFileTypeR.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeR.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeR.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeR.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeR.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeR.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeR.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeR.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeR.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeR.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeR.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeR.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeRB.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeRB.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeRB.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeRB.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeRB.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeRB.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeRB.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeRB.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeRB.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeRB.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeRB.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeRB.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeRepr.test_r -*graalpython.lib-python.3.test.test_argparse.TestFileTypeRepr.test_r_1_replace -*graalpython.lib-python.3.test.test_argparse.TestFileTypeRepr.test_r_latin -*graalpython.lib-python.3.test.test_argparse.TestFileTypeRepr.test_w_big5_ignore -*graalpython.lib-python.3.test.test_argparse.TestFileTypeRepr.test_wb_1 -*graalpython.lib-python.3.test.test_argparse.TestFileTypeW.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeW.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeW.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeW.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeW.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeW.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeW.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeW.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeW.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeW.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeW.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeW.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeWB.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeWB.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeWB.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeWB.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeWB.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeWB.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeWB.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeWB.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeWB.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeWB.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeWB.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeWB.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeX.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeX.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeX.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeX.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeX.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeX.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeX.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeX.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeX.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeX.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeX.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeX.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeXB.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeXB.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeXB.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeXB.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeXB.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeXB.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeXB.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeXB.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeXB.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeXB.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeXB.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestFileTypeXB.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestGetDefault.test_get_default -*graalpython.lib-python.3.test.test_argparse.TestHelpAlternatePrefixChars.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpAlternatePrefixChars.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpAlternatePrefixChars.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpAlternatePrefixChars.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpAlternatePrefixChars.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpAlternatePrefixChars.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpArgumentDefaults.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpArgumentDefaults.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpArgumentDefaults.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpArgumentDefaults.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpArgumentDefaults.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpArgumentDefaults.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpBiggerOptionalGroups.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpBiggerOptionalGroups.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpBiggerOptionalGroups.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpBiggerOptionalGroups.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpBiggerOptionalGroups.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpBiggerOptionalGroups.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpBiggerOptionals.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpBiggerOptionals.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpBiggerOptionals.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpBiggerOptionals.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpBiggerOptionals.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpBiggerOptionals.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpBiggerPositionals.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpBiggerPositionals.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpBiggerPositionals.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpBiggerPositionals.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpBiggerPositionals.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpBiggerPositionals.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpMetavarTypeFormatter.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpMetavarTypeFormatter.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpMetavarTypeFormatter.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpMetavarTypeFormatter.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpMetavarTypeFormatter.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpMetavarTypeFormatter.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpNoHelpOptional.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpNoHelpOptional.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpNoHelpOptional.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpNoHelpOptional.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpNoHelpOptional.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpNoHelpOptional.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpNone.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpNone.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpNone.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpNone.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpNone.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpNone.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpOnlyUserGroups.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpOnlyUserGroups.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpOnlyUserGroups.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpOnlyUserGroups.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpOnlyUserGroups.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpOnlyUserGroups.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpRawDescription.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpRawDescription.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpRawDescription.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpRawDescription.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpRawDescription.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpRawDescription.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpRawText.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpRawText.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpRawText.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpRawText.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpRawText.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpRawText.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpReformatting.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpReformatting.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpReformatting.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpReformatting.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpReformatting.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpReformatting.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpRequiredOptional.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpRequiredOptional.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpRequiredOptional.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpRequiredOptional.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpRequiredOptional.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpRequiredOptional.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpSubparsersOrdering.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpSubparsersOrdering.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpSubparsersOrdering.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpSubparsersOrdering.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpSubparsersOrdering.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpSubparsersOrdering.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpSubparsersWithHelpOrdering.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpSubparsersWithHelpOrdering.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpSubparsersWithHelpOrdering.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpSubparsersWithHelpOrdering.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpSubparsersWithHelpOrdering.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpSubparsersWithHelpOrdering.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressOptional.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressOptional.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressOptional.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressOptional.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressOptional.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressOptional.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressOptionalGroup.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressOptionalGroup.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressOptionalGroup.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressOptionalGroup.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressOptionalGroup.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressOptionalGroup.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressPositional.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressPositional.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressPositional.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressPositional.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressPositional.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressPositional.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressUsage.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressUsage.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressUsage.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressUsage.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressUsage.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpSuppressUsage.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpTupleMetavar.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpTupleMetavar.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpTupleMetavar.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpTupleMetavar.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpTupleMetavar.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpTupleMetavar.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsage.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsage.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsage.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsage.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsage.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsage.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageLongProg.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageLongProg.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageLongProg.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageLongProg.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageLongProg.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageLongProg.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageLongProgOptionsWrap.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageLongProgOptionsWrap.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageLongProgOptionsWrap.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageLongProgOptionsWrap.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageLongProgOptionsWrap.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageLongProgOptionsWrap.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageLongProgPositionalsWrap.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageLongProgPositionalsWrap.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageLongProgPositionalsWrap.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageLongProgPositionalsWrap.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageLongProgPositionalsWrap.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageLongProgPositionalsWrap.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageOptionalsOnlyWrap.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageOptionalsOnlyWrap.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageOptionalsOnlyWrap.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageOptionalsOnlyWrap.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageOptionalsOnlyWrap.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageOptionalsOnlyWrap.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageOptionalsPositionalsWrap.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageOptionalsPositionalsWrap.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageOptionalsPositionalsWrap.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageOptionalsPositionalsWrap.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageOptionalsPositionalsWrap.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageOptionalsPositionalsWrap.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageOptionalsWrap.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageOptionalsWrap.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageOptionalsWrap.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageOptionalsWrap.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageOptionalsWrap.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageOptionalsWrap.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsagePositionalsOnlyWrap.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsagePositionalsOnlyWrap.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsagePositionalsOnlyWrap.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsagePositionalsOnlyWrap.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsagePositionalsOnlyWrap.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsagePositionalsOnlyWrap.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsagePositionalsWrap.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsagePositionalsWrap.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsagePositionalsWrap.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsagePositionalsWrap.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsagePositionalsWrap.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsagePositionalsWrap.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageWithParentheses.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageWithParentheses.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageWithParentheses.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageWithParentheses.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageWithParentheses.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpUsageWithParentheses.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpVariableExpansion.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpVariableExpansion.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpVariableExpansion.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpVariableExpansion.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpVariableExpansion.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpVariableExpansion.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpVariableExpansionNoArguments.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpVariableExpansionNoArguments.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpVariableExpansionNoArguments.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpVariableExpansionNoArguments.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpVariableExpansionNoArguments.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpVariableExpansionNoArguments.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpVariableExpansionUsageSupplied.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpVariableExpansionUsageSupplied.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpVariableExpansionUsageSupplied.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpVariableExpansionUsageSupplied.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpVariableExpansionUsageSupplied.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpVariableExpansionUsageSupplied.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpVersionAction.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpVersionAction.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpVersionAction.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpVersionAction.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpVersionAction.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpVersionAction.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpVersionActionSuppress.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpVersionActionSuppress.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpVersionActionSuppress.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpVersionActionSuppress.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpVersionActionSuppress.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpVersionActionSuppress.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpWrappingLongNames.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpWrappingLongNames.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpWrappingLongNames.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpWrappingLongNames.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpWrappingLongNames.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpWrappingLongNames.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpWrappingShortNames.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestHelpWrappingShortNames.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpWrappingShortNames.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestHelpWrappingShortNames.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestHelpWrappingShortNames.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestHelpWrappingShortNames.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestImportStar.test -*graalpython.lib-python.3.test.test_argparse.TestImportStar.test_all_exports_everything_but_modules -*graalpython.lib-python.3.test.test_argparse.TestIntermixedArgs.test_basic -*graalpython.lib-python.3.test.test_argparse.TestIntermixedArgs.test_exclusive -*graalpython.lib-python.3.test.test_argparse.TestIntermixedArgs.test_exclusive_incompatible -*graalpython.lib-python.3.test.test_argparse.TestIntermixedArgs.test_remainder -*graalpython.lib-python.3.test.test_argparse.TestIntermixedMessageContentError.test_missing_argument_name_in_message -*graalpython.lib-python.3.test.test_argparse.TestInvalidArgumentConstructors.test_invalid_action -*graalpython.lib-python.3.test.test_argparse.TestInvalidArgumentConstructors.test_invalid_keyword_arguments -*graalpython.lib-python.3.test.test_argparse.TestInvalidArgumentConstructors.test_invalid_option_strings -*graalpython.lib-python.3.test.test_argparse.TestInvalidArgumentConstructors.test_invalid_type -*graalpython.lib-python.3.test.test_argparse.TestInvalidArgumentConstructors.test_missing_destination -*graalpython.lib-python.3.test.test_argparse.TestInvalidArgumentConstructors.test_more_than_one_argument_actions -*graalpython.lib-python.3.test.test_argparse.TestInvalidArgumentConstructors.test_multiple_dest -*graalpython.lib-python.3.test.test_argparse.TestInvalidArgumentConstructors.test_no_argument_actions -*graalpython.lib-python.3.test.test_argparse.TestInvalidArgumentConstructors.test_no_argument_no_const_actions -*graalpython.lib-python.3.test.test_argparse.TestInvalidArgumentConstructors.test_parsers_action_missing_params -*graalpython.lib-python.3.test.test_argparse.TestInvalidArgumentConstructors.test_required_const_actions -*graalpython.lib-python.3.test.test_argparse.TestInvalidArgumentConstructors.test_required_positional -*graalpython.lib-python.3.test.test_argparse.TestInvalidArgumentConstructors.test_user_defined_action -*graalpython.lib-python.3.test.test_argparse.TestInvalidNargs.test_nargs_alphabetic -*graalpython.lib-python.3.test.test_argparse.TestInvalidNargs.test_nargs_zero -*graalpython.lib-python.3.test.test_argparse.TestMessageContentError.test_missing_argument_name_in_message -*graalpython.lib-python.3.test.test_argparse.TestMessageContentError.test_optional_optional_not_in_message -*graalpython.lib-python.3.test.test_argparse.TestMessageContentError.test_optional_positional_not_in_message -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_failures_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_failures_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_help_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_help_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_successes_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_successes_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_usage_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_usage_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_failures_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_failures_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_help_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_help_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_successes_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_successes_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_usage_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_usage_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveGroupErrors.test_empty_group -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveGroupErrors.test_help -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveGroupErrors.test_invalid_add_argument -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveGroupErrors.test_invalid_add_argument_group -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveGroupErrorsParent.test_empty_group -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveGroupErrorsParent.test_help -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveGroupErrorsParent.test_invalid_add_argument -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveGroupErrorsParent.test_invalid_add_argument_group -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveInGroup.test_failures_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveInGroup.test_failures_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveInGroup.test_help_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveInGroup.test_help_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveInGroup.test_successes_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveInGroup.test_successes_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveInGroup.test_usage_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveInGroup.test_usage_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveLong.test_failures_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveLong.test_failures_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveLong.test_help_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveLong.test_help_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveLong.test_successes_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveLong.test_successes_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveLong.test_usage_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveLong.test_usage_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveLongParent.test_failures_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveLongParent.test_failures_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveLongParent.test_help_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveLongParent.test_help_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveLongParent.test_successes_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveLongParent.test_successes_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveLongParent.test_usage_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveLongParent.test_usage_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveManySuppressed.test_failures_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveManySuppressed.test_failures_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveManySuppressed.test_help_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveManySuppressed.test_help_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveManySuppressed.test_successes_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveManySuppressed.test_successes_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveManySuppressed.test_usage_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveManySuppressed.test_usage_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_failures_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_failures_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_help_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_help_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_successes_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_successes_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_usage_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_usage_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveNested.test_help_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveNested.test_help_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveNested.test_usage_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveNested.test_usage_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_failures_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_failures_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_help_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_help_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_successes_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_successes_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_usage_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_usage_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_failures_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_failures_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_help_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_help_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_successes_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_successes_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_usage_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_usage_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_failures_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_failures_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_help_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_help_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_successes_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_successes_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_usage_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_usage_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_failures_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_failures_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_help_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_help_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_successes_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_successes_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_usage_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_usage_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_failures_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_failures_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_help_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_help_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_successes_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_successes_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_usage_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_usage_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_failures_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_failures_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_help_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_help_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_successes_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_successes_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_usage_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_usage_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveSimple.test_failures_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveSimple.test_failures_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveSimple.test_help_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveSimple.test_help_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveSimple.test_successes_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveSimple.test_successes_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveSimple.test_usage_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveSimple.test_usage_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveSimpleParent.test_failures_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveSimpleParent.test_failures_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveSimpleParent.test_help_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveSimpleParent.test_help_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveSimpleParent.test_successes_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveSimpleParent.test_successes_when_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveSimpleParent.test_usage_when_not_required -*graalpython.lib-python.3.test.test_argparse.TestMutuallyExclusiveSimpleParent.test_usage_when_required -*graalpython.lib-python.3.test.test_argparse.TestNamespace.test_constructor -*graalpython.lib-python.3.test.test_argparse.TestNamespace.test_equality -*graalpython.lib-python.3.test.test_argparse.TestNamespace.test_equality_returns_notimplemented -*graalpython.lib-python.3.test.test_argparse.TestNamespaceContainsSimple.test_empty -*graalpython.lib-python.3.test.test_argparse.TestNamespaceContainsSimple.test_non_empty -*graalpython.lib-python.3.test.test_argparse.TestNargsRemainder.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestNargsRemainder.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestNargsRemainder.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestNargsRemainder.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestNargsRemainder.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestNargsRemainder.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestNargsRemainder.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestNargsRemainder.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestNargsRemainder.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestNargsRemainder.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestNargsRemainder.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestNargsRemainder.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestNargsZeroOrMore.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestNargsZeroOrMore.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestNargsZeroOrMore.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestNargsZeroOrMore.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestNargsZeroOrMore.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestNargsZeroOrMore.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestNargsZeroOrMore.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestNargsZeroOrMore.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestNargsZeroOrMore.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestNargsZeroOrMore.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestNargsZeroOrMore.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestNargsZeroOrMore.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionLike.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionLike.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionLike.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionLike.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionLike.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionLike.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionLike.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionLike.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionLike.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionLike.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionLike.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionLike.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppend.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppend.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppend.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppend.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppend.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppend.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppend.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppend.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppend.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppend.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppend.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppend.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConst.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConst.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConst.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConst.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConst.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConst.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConst.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConst.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConst.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConst.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConst.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConst.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendWithDefault.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendWithDefault.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendWithDefault.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendWithDefault.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendWithDefault.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendWithDefault.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendWithDefault.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendWithDefault.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendWithDefault.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendWithDefault.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendWithDefault.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionAppendWithDefault.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionCount.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionCount.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionCount.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionCount.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionCount.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionCount.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionCount.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionCount.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionCount.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionCount.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionCount.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionCount.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStore.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStore.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStore.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStore.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStore.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStore.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStore.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStore.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStore.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStore.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStore.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStore.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreConst.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreConst.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreConst.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreConst.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreConst.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreConst.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreConst.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreConst.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreConst.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreConst.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreConst.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreConst.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreFalse.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreFalse.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreFalse.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreFalse.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreFalse.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreFalse.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreFalse.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreFalse.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreFalse.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreFalse.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreFalse.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreFalse.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreTrue.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreTrue.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreTrue.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreTrue.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreTrue.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreTrue.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreTrue.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreTrue.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreTrue.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreTrue.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreTrue.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsActionStoreTrue.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAllowLongAbbreviation.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAllowLongAbbreviation.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAllowLongAbbreviation.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAllowLongAbbreviation.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAllowLongAbbreviation.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAllowLongAbbreviation.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAllowLongAbbreviation.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAllowLongAbbreviation.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAllowLongAbbreviation.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAllowLongAbbreviation.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAllowLongAbbreviation.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAllowLongAbbreviation.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixChars.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixChars.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixChars.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixChars.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixChars.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixChars.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixChars.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixChars.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixChars.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixChars.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixChars.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixChars.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsChoices.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsChoices.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsChoices.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsChoices.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsChoices.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsChoices.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsChoices.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsChoices.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsChoices.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsChoices.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsChoices.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsChoices.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDefault.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDefault.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDefault.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDefault.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDefault.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDefault.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDefault.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDefault.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDefault.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDefault.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDefault.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDefault.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDest.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDest.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDest.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDest.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDest.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDest.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDest.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDest.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDest.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDest.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDest.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDest.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDash.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDash.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDash.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDash.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDash.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDash.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDash.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDash.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDash.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDash.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDash.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDash.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsHelpVersionActions.test_alternate_help_version -*graalpython.lib-python.3.test.test_argparse.TestOptionalsHelpVersionActions.test_help_version_extra_arguments -*graalpython.lib-python.3.test.test_argparse.TestOptionalsHelpVersionActions.test_no_help -*graalpython.lib-python.3.test.test_argparse.TestOptionalsHelpVersionActions.test_version -*graalpython.lib-python.3.test.test_argparse.TestOptionalsHelpVersionActions.test_version_action -*graalpython.lib-python.3.test.test_argparse.TestOptionalsHelpVersionActions.test_version_format -*graalpython.lib-python.3.test.test_argparse.TestOptionalsHelpVersionActions.test_version_no_help -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs1.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs1.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs1.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs1.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs1.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs1.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs1.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs1.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs1.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs1.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs1.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs1.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs3.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs3.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs3.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs3.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs3.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs3.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs3.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs3.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs3.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs3.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs3.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargs3.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsDefault.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsDefault.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsDefault.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsDefault.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsDefault.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsDefault.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsDefault.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsDefault.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsDefault.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsDefault.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsDefault.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsDefault.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOneOrMore.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOneOrMore.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOneOrMore.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOneOrMore.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOneOrMore.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOneOrMore.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOneOrMore.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOneOrMore.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOneOrMore.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOneOrMore.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOneOrMore.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOneOrMore.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOptional.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOptional.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOptional.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOptional.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOptional.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOptional.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOptional.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOptional.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOptional.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOptional.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOptional.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsOptional.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsZeroOrMore.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsZeroOrMore.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsZeroOrMore.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsZeroOrMore.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsZeroOrMore.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsZeroOrMore.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsZeroOrMore.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsZeroOrMore.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsZeroOrMore.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsZeroOrMore.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsZeroOrMore.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNargsZeroOrMore.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumeric.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumeric.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumeric.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumeric.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumeric.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumeric.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumeric.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumeric.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumeric.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumeric.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumeric.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumeric.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumericAndPositionals.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumericAndPositionals.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumericAndPositionals.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumericAndPositionals.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumericAndPositionals.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumericAndPositionals.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumericAndPositionals.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumericAndPositionals.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumericAndPositionals.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumericAndPositionals.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumericAndPositionals.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsNumericAndPositionals.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsRequired.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsRequired.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsRequired.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsRequired.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsRequired.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsRequired.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsRequired.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsRequired.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsRequired.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsRequired.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsRequired.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsRequired.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsShortLong.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsShortLong.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsShortLong.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsShortLong.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsShortLong.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsShortLong.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsShortLong.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsShortLong.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsShortLong.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsShortLong.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsShortLong.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsShortLong.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDash.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDash.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDash.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDash.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDash.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDash.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDash.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDash.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDash.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDash.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDash.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDash.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashAmbiguous.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashAmbiguous.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashAmbiguous.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashAmbiguous.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashAmbiguous.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashAmbiguous.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashAmbiguous.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashAmbiguous.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashAmbiguous.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashAmbiguous.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashAmbiguous.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashAmbiguous.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashCombined.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashCombined.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashCombined.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashCombined.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashCombined.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashCombined.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashCombined.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashCombined.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashCombined.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashCombined.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashCombined.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashCombined.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashLong.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashLong.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashLong.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashLong.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashLong.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashLong.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashLong.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashLong.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashLong.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashLong.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashLong.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashLong.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDoubleDash.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDoubleDash.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDoubleDash.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDoubleDash.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDoubleDash.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDoubleDash.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDoubleDash.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDoubleDash.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDoubleDash.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDoubleDash.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDoubleDash.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestOptionalsSingleDoubleDash.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestParentParsers.test_conflicting_parents -*graalpython.lib-python.3.test.test_argparse.TestParentParsers.test_conflicting_parents_mutex -*graalpython.lib-python.3.test.test_argparse.TestParentParsers.test_groups_parents -*graalpython.lib-python.3.test.test_argparse.TestParentParsers.test_multiple_parents -*graalpython.lib-python.3.test.test_argparse.TestParentParsers.test_multiple_parents_mutex -*graalpython.lib-python.3.test.test_argparse.TestParentParsers.test_parent_help -*graalpython.lib-python.3.test.test_argparse.TestParentParsers.test_same_argument_name_parents -*graalpython.lib-python.3.test.test_argparse.TestParentParsers.test_single_granparent_mutex -*graalpython.lib-python.3.test.test_argparse.TestParentParsers.test_single_parent -*graalpython.lib-python.3.test.test_argparse.TestParentParsers.test_single_parent_mutex -*graalpython.lib-python.3.test.test_argparse.TestParentParsers.test_subparser_parents -*graalpython.lib-python.3.test.test_argparse.TestParentParsers.test_subparser_parents_mutex -*graalpython.lib-python.3.test.test_argparse.TestParseKnownArgs.test_arguments_list -*graalpython.lib-python.3.test.test_argparse.TestParseKnownArgs.test_arguments_list_positional -*graalpython.lib-python.3.test.test_argparse.TestParseKnownArgs.test_arguments_tuple -*graalpython.lib-python.3.test.test_argparse.TestParseKnownArgs.test_arguments_tuple_positional -*graalpython.lib-python.3.test.test_argparse.TestParseKnownArgs.test_mixed -*graalpython.lib-python.3.test.test_argparse.TestParseKnownArgs.test_optionals -*graalpython.lib-python.3.test.test_argparse.TestParserDefault42.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefault42.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefault42.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefault42.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefault42.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefault42.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefault42.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefault42.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefault42.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefault42.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefault42.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefault42.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefaultSuppress.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefaultSuppress.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefaultSuppress.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefaultSuppress.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefaultSuppress.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefaultSuppress.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefaultSuppress.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefaultSuppress.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefaultSuppress.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefaultSuppress.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefaultSuppress.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestParserDefaultSuppress.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsActionAppend.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsActionAppend.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsActionAppend.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsActionAppend.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsActionAppend.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsActionAppend.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsActionAppend.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsActionAppend.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsActionAppend.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsActionAppend.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsActionAppend.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsActionAppend.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesInt.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesInt.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesInt.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesInt.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesInt.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesInt.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesInt.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesInt.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesInt.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesInt.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesInt.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesInt.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesString.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesString.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesString.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesString.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesString.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesString.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesString.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesString.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesString.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesString.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesString.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsChoicesString.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsGroups.test_group_first -*graalpython.lib-python.3.test.test_argparse.TestPositionalsGroups.test_interleaved_groups -*graalpython.lib-python.3.test.test_argparse.TestPositionalsGroups.test_nongroup_first -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs1.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs1.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs1.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs1.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs1.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs1.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs1.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs1.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs1.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs1.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs1.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs1.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2None.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2None.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2None.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2None.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2None.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2None.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2None.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2None.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2None.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2None.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2None.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2None.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2OneOrMore.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2OneOrMore.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2OneOrMore.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2OneOrMore.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2OneOrMore.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2OneOrMore.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2OneOrMore.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2OneOrMore.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2OneOrMore.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2OneOrMore.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2OneOrMore.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2OneOrMore.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2Optional.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2Optional.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2Optional.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2Optional.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2Optional.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2Optional.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2Optional.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2Optional.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2Optional.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2Optional.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2Optional.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2Optional.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone1.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone1.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone1.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone1.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone1.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone1.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone1.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone1.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone1.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone1.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone1.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNone1.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneNone.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneNone.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneNone.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneNone.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneNone.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneNone.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneNone.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneNone.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneNone.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneNone.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneNone.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneNone.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional1.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional1.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional1.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional1.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional1.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional1.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional1.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional1.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional1.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional1.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional1.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneOptional1.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore1.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore1.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore1.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore1.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore1.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore1.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore1.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore1.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore1.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore1.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore1.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMore1.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional1.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional1.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional1.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional1.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional1.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional1.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional1.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional1.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional1.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional1.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional1.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptional1.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalDefault.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalDefault.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalDefault.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalDefault.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalDefault.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalDefault.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalDefault.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalDefault.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalDefault.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalDefault.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalDefault.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalDefault.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalNone.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalNone.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalNone.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalNone.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalNone.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalNone.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalNone.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalNone.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalNone.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalNone.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalNone.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalNone.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOptional.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOptional.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOptional.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOptional.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOptional.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOptional.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOptional.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOptional.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOptional.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOptional.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOptional.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalOptional.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore1.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore1.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore1.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore1.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore1.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore1.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore1.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore1.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore1.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore1.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore1.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMore1.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPrefixCharacterOnlyArguments.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPrefixCharacterOnlyArguments.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPrefixCharacterOnlyArguments.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPrefixCharacterOnlyArguments.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPrefixCharacterOnlyArguments.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPrefixCharacterOnlyArguments.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPrefixCharacterOnlyArguments.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPrefixCharacterOnlyArguments.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPrefixCharacterOnlyArguments.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestPrefixCharacterOnlyArguments.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestPrefixCharacterOnlyArguments.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestPrefixCharacterOnlyArguments.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestSetDefaults.test_set_defaults_no_args -*graalpython.lib-python.3.test.test_argparse.TestSetDefaults.test_set_defaults_on_parent_and_subparser -*graalpython.lib-python.3.test.test_argparse.TestSetDefaults.test_set_defaults_parents -*graalpython.lib-python.3.test.test_argparse.TestSetDefaults.test_set_defaults_same_as_add_argument -*graalpython.lib-python.3.test.test_argparse.TestSetDefaults.test_set_defaults_same_as_add_argument_group -*graalpython.lib-python.3.test.test_argparse.TestSetDefaults.test_set_defaults_subparsers -*graalpython.lib-python.3.test.test_argparse.TestSetDefaults.test_set_defaults_with_args -*graalpython.lib-python.3.test.test_argparse.TestShortColumns.test_format_help -*graalpython.lib-python.3.test.test_argparse.TestShortColumns.test_format_usage -*graalpython.lib-python.3.test.test_argparse.TestShortColumns.test_print_file_help -*graalpython.lib-python.3.test.test_argparse.TestShortColumns.test_print_file_usage -*graalpython.lib-python.3.test.test_argparse.TestShortColumns.test_print_help -*graalpython.lib-python.3.test.test_argparse.TestShortColumns.test_print_usage -*graalpython.lib-python.3.test.test_argparse.TestStrings.test_argument -*graalpython.lib-python.3.test.test_argparse.TestStrings.test_namespace -*graalpython.lib-python.3.test.test_argparse.TestStrings.test_namespace_kwargs_and_starkwargs_notidentifier -*graalpython.lib-python.3.test.test_argparse.TestStrings.test_namespace_starkwargs_identifier -*graalpython.lib-python.3.test.test_argparse.TestStrings.test_namespace_starkwargs_notidentifier -*graalpython.lib-python.3.test.test_argparse.TestStrings.test_optional -*graalpython.lib-python.3.test.test_argparse.TestStrings.test_parser -*graalpython.lib-python.3.test.test_argparse.TestTypeCallable.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestTypeCallable.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestTypeCallable.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestTypeCallable.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestTypeCallable.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestTypeCallable.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestTypeCallable.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestTypeCallable.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestTypeCallable.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestTypeCallable.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestTypeCallable.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestTypeCallable.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestTypeClassicClass.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestTypeClassicClass.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestTypeClassicClass.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestTypeClassicClass.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestTypeClassicClass.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestTypeClassicClass.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestTypeClassicClass.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestTypeClassicClass.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestTypeClassicClass.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestTypeClassicClass.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestTypeClassicClass.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestTypeClassicClass.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestTypeFunctionCallOnlyOnce.test_type_function_call_only_once -*graalpython.lib-python.3.test.test_argparse.TestTypeFunctionCalledOnDefault.test_issue_15906 -*graalpython.lib-python.3.test.test_argparse.TestTypeFunctionCalledOnDefault.test_no_double_type_conversion_of_default -*graalpython.lib-python.3.test.test_argparse.TestTypeFunctionCalledOnDefault.test_type_function_call_with_non_string_default -*graalpython.lib-python.3.test.test_argparse.TestTypeFunctionCalledOnDefault.test_type_function_call_with_string_default -*graalpython.lib-python.3.test.test_argparse.TestTypeRegistration.test -*graalpython.lib-python.3.test.test_argparse.TestTypeUserDefined.test_failures_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestTypeUserDefined.test_failures_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestTypeUserDefined.test_failures_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestTypeUserDefined.test_failures_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestTypeUserDefined.test_failures_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestTypeUserDefined.test_failures_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestTypeUserDefined.test_successes_many_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestTypeUserDefined.test_successes_many_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestTypeUserDefined.test_successes_no_groups_listargs -*graalpython.lib-python.3.test.test_argparse.TestTypeUserDefined.test_successes_no_groups_sysargs -*graalpython.lib-python.3.test.test_argparse.TestTypeUserDefined.test_successes_one_group_listargs -*graalpython.lib-python.3.test.test_argparse.TestTypeUserDefined.test_successes_one_group_sysargs -*graalpython.lib-python.3.test.test_argparse.TestWrappingMetavar.test_help_with_metavar +test.test_argparse.StdStreamTest.test_skip_invalid_stderr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.StdStreamTest.test_skip_invalid_stdout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionExtend.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionExtend.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionExtend.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionExtend.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionExtend.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionExtend.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionExtend.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionExtend.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionExtend.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionExtend.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionExtend.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionExtend.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionRegistration.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionUserDefined.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionUserDefined.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionUserDefined.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionUserDefined.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionUserDefined.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionUserDefined.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionUserDefined.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionUserDefined.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionUserDefined.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionUserDefined.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionUserDefined.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionUserDefined.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionsReturned.test_dest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestActionsReturned.test_misc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_1_metavar_length0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_1_metavar_length1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_1_metavar_length2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_1_metavar_length3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_1_metavar_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_2_metavar_length0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_2_metavar_length1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_2_metavar_length2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_2_metavar_length3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_2_metavar_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_3_metavar_length0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_3_metavar_length1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_3_metavar_length2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_3_metavar_length3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_3_metavar_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_None_metavar_length0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_None_metavar_length1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_None_metavar_length2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_None_metavar_length3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_None_metavar_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_oneormore_metavar_length0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_oneormore_metavar_length1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_oneormore_metavar_length2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_oneormore_metavar_length3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_oneormore_metavar_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_optional_metavar_length0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_optional_metavar_length1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_optional_metavar_length2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_optional_metavar_length3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_optional_metavar_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_parser_metavar_length0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_parser_metavar_length1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_parser_metavar_length2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_parser_metavar_length3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_parser_metavar_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_remainder_metavar_length0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_remainder_metavar_length1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_remainder_metavar_length2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_remainder_metavar_length3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_remainder_metavar_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_zeroormore_metavar_length0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_zeroormore_metavar_length1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_zeroormore_metavar_length2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_zeroormore_metavar_length3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_zeroormore_metavar_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_alias_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_alias_invocation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_dest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_error_alias_invocation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_help_alternate_prefix_chars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_help_blank @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_help_extra_prefix_chars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_help_non_breaking_spaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_optional_subparsers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_parse_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_parse_args_failures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_parse_known_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_parser_command_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_required_subparsers_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_required_subparsers_no_destination_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_required_subparsers_via_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_required_subparsers_via_kwarg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_subparser1_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_subparser2_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_subparser_title_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestAddSubparsers.test_wrong_argument_subparsers_no_destination_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestArgumentError.test_argument_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestArgumentTypeError.test_argument_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestArgumentsFromFile.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestBooleanOptionalAction.test_const @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalAction.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalAction.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalAction.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalAction.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalAction.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalAction.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalAction.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalAction.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalAction.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalAction.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalAction.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalAction.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalActionRequired.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalActionRequired.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalActionRequired.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalActionRequired.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalActionRequired.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalActionRequired.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalActionRequired.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalActionRequired.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalActionRequired.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalActionRequired.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalActionRequired.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestBooleanOptionalActionRequired.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestConflictHandling.test_bad_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestConflictHandling.test_conflict_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestConflictHandling.test_resolve_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestConflictHandling.test_subparser_conflict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDefaultSuppress.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDefaultSuppress.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDefaultSuppress.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDefaultSuppress.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDefaultSuppress.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDefaultSuppress.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDefaultSuppress.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDefaultSuppress.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDefaultSuppress.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDefaultSuppress.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDefaultSuppress.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDefaultSuppress.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestEncoding.test_argparse_module_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestEncoding.test_test_argparse_module_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestExitOnError.test_exit_on_error_with_bad_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestExitOnError.test_exit_on_error_with_good_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestFileTypeDefaults.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeMissingInitialization.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestFileTypeOpenArgs.test_open_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestFileTypeR.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeR.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeR.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeR.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeR.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeR.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeR.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeR.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeR.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeR.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeR.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeR.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeRB.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeRB.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeRB.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeRB.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeRB.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeRB.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeRB.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeRB.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeRB.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeRB.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeRB.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeRB.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeRepr.test_r @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestFileTypeRepr.test_r_1_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestFileTypeRepr.test_r_latin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestFileTypeRepr.test_w_big5_ignore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestFileTypeRepr.test_wb_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestFileTypeW.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeW.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeW.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeW.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeW.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeW.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeW.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeW.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeW.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeW.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeW.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeW.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeWB.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeWB.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeWB.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeWB.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeWB.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeWB.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeWB.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeWB.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeWB.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeWB.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeWB.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeWB.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeX.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeX.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeX.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeX.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeX.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeX.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeX.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeX.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeX.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeX.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeX.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeX.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeXB.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeXB.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeXB.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeXB.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeXB.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeXB.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeXB.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeXB.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeXB.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeXB.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeXB.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestFileTypeXB.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_argparse.TestGetDefault.test_get_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpAlternatePrefixChars.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpAlternatePrefixChars.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpAlternatePrefixChars.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpAlternatePrefixChars.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpAlternatePrefixChars.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpAlternatePrefixChars.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpArgumentDefaults.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpArgumentDefaults.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpArgumentDefaults.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpArgumentDefaults.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpArgumentDefaults.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpArgumentDefaults.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpBiggerOptionalGroups.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpBiggerOptionalGroups.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpBiggerOptionalGroups.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpBiggerOptionalGroups.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpBiggerOptionalGroups.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpBiggerOptionalGroups.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpBiggerOptionals.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpBiggerOptionals.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpBiggerOptionals.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpBiggerOptionals.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpBiggerOptionals.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpBiggerOptionals.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpBiggerPositionals.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpBiggerPositionals.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpBiggerPositionals.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpBiggerPositionals.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpBiggerPositionals.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpBiggerPositionals.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpMetavarTypeFormatter.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpMetavarTypeFormatter.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpMetavarTypeFormatter.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpMetavarTypeFormatter.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpMetavarTypeFormatter.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpMetavarTypeFormatter.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpNoHelpOptional.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpNoHelpOptional.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpNoHelpOptional.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpNoHelpOptional.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpNoHelpOptional.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpNoHelpOptional.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpNone.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpNone.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpNone.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpNone.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpNone.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpNone.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpOnlyUserGroups.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpOnlyUserGroups.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpOnlyUserGroups.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpOnlyUserGroups.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpOnlyUserGroups.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpOnlyUserGroups.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpRawDescription.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpRawDescription.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpRawDescription.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpRawDescription.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpRawDescription.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpRawDescription.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpRawText.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpRawText.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpRawText.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpRawText.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpRawText.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpRawText.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpReformatting.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpReformatting.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpReformatting.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpReformatting.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpReformatting.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpReformatting.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpRequiredOptional.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpRequiredOptional.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpRequiredOptional.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpRequiredOptional.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpRequiredOptional.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpRequiredOptional.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSubparsersOrdering.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSubparsersOrdering.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSubparsersOrdering.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSubparsersOrdering.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSubparsersOrdering.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSubparsersOrdering.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSubparsersWithHelpOrdering.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSubparsersWithHelpOrdering.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSubparsersWithHelpOrdering.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSubparsersWithHelpOrdering.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSubparsersWithHelpOrdering.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSubparsersWithHelpOrdering.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressOptional.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressOptional.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressOptional.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressOptional.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressOptional.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressOptional.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressOptionalGroup.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressOptionalGroup.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressOptionalGroup.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressOptionalGroup.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressOptionalGroup.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressOptionalGroup.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressPositional.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressPositional.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressPositional.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressPositional.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressPositional.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressPositional.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressUsage.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressUsage.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressUsage.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressUsage.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressUsage.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpSuppressUsage.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpTupleMetavar.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpTupleMetavar.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpTupleMetavar.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpTupleMetavar.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpTupleMetavar.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpTupleMetavar.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsage.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsage.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsage.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsage.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsage.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsage.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageLongProg.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageLongProg.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageLongProg.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageLongProg.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageLongProg.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageLongProg.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageLongProgOptionsWrap.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageLongProgOptionsWrap.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageLongProgOptionsWrap.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageLongProgOptionsWrap.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageLongProgOptionsWrap.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageLongProgOptionsWrap.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageLongProgPositionalsWrap.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageLongProgPositionalsWrap.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageLongProgPositionalsWrap.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageLongProgPositionalsWrap.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageLongProgPositionalsWrap.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageLongProgPositionalsWrap.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageOptionalsOnlyWrap.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageOptionalsOnlyWrap.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageOptionalsOnlyWrap.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageOptionalsOnlyWrap.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageOptionalsOnlyWrap.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageOptionalsOnlyWrap.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageOptionalsPositionalsWrap.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageOptionalsPositionalsWrap.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageOptionalsPositionalsWrap.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageOptionalsPositionalsWrap.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageOptionalsPositionalsWrap.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageOptionalsPositionalsWrap.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageOptionalsWrap.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageOptionalsWrap.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageOptionalsWrap.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageOptionalsWrap.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageOptionalsWrap.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageOptionalsWrap.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsagePositionalsOnlyWrap.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsagePositionalsOnlyWrap.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsagePositionalsOnlyWrap.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsagePositionalsOnlyWrap.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsagePositionalsOnlyWrap.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsagePositionalsOnlyWrap.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsagePositionalsWrap.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsagePositionalsWrap.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsagePositionalsWrap.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsagePositionalsWrap.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsagePositionalsWrap.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsagePositionalsWrap.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageWithParentheses.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageWithParentheses.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageWithParentheses.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageWithParentheses.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageWithParentheses.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpUsageWithParentheses.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVariableExpansion.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVariableExpansion.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVariableExpansion.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVariableExpansion.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVariableExpansion.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVariableExpansion.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVariableExpansionNoArguments.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVariableExpansionNoArguments.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVariableExpansionNoArguments.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVariableExpansionNoArguments.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVariableExpansionNoArguments.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVariableExpansionNoArguments.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVariableExpansionUsageSupplied.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVariableExpansionUsageSupplied.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVariableExpansionUsageSupplied.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVariableExpansionUsageSupplied.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVariableExpansionUsageSupplied.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVariableExpansionUsageSupplied.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVersionAction.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVersionAction.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVersionAction.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVersionAction.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVersionAction.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVersionAction.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVersionActionSuppress.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVersionActionSuppress.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVersionActionSuppress.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVersionActionSuppress.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVersionActionSuppress.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpVersionActionSuppress.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpWrappingLongNames.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpWrappingLongNames.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpWrappingLongNames.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpWrappingLongNames.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpWrappingLongNames.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpWrappingLongNames.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpWrappingShortNames.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpWrappingShortNames.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpWrappingShortNames.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpWrappingShortNames.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpWrappingShortNames.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestHelpWrappingShortNames.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestImportStar.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestImportStar.test_all_exports_everything_but_modules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestIntermixedArgs.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestIntermixedArgs.test_exclusive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestIntermixedArgs.test_exclusive_incompatible @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestIntermixedArgs.test_remainder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestIntermixedMessageContentError.test_missing_argument_name_in_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestInvalidArgumentConstructors.test_invalid_action @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestInvalidArgumentConstructors.test_invalid_keyword_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestInvalidArgumentConstructors.test_invalid_option_strings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestInvalidArgumentConstructors.test_invalid_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestInvalidArgumentConstructors.test_missing_destination @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestInvalidArgumentConstructors.test_more_than_one_argument_actions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestInvalidArgumentConstructors.test_multiple_dest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestInvalidArgumentConstructors.test_no_argument_actions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestInvalidArgumentConstructors.test_no_argument_no_const_actions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestInvalidArgumentConstructors.test_parsers_action_missing_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestInvalidArgumentConstructors.test_required_const_actions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestInvalidArgumentConstructors.test_required_positional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestInvalidArgumentConstructors.test_user_defined_action @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestInvalidNargs.test_nargs_alphabetic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestInvalidNargs.test_nargs_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMessageContentError.test_missing_argument_name_in_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMessageContentError.test_optional_optional_not_in_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMessageContentError.test_optional_positional_not_in_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_failures_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_failures_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_help_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_help_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_successes_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_successes_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_usage_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_usage_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_failures_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_failures_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_help_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_help_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_successes_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_successes_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_usage_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_usage_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveGroupErrors.test_empty_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveGroupErrors.test_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveGroupErrors.test_invalid_add_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveGroupErrors.test_invalid_add_argument_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveGroupErrorsParent.test_empty_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveGroupErrorsParent.test_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveGroupErrorsParent.test_invalid_add_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveGroupErrorsParent.test_invalid_add_argument_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveInGroup.test_failures_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveInGroup.test_failures_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveInGroup.test_help_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveInGroup.test_help_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveInGroup.test_successes_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveInGroup.test_successes_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveInGroup.test_usage_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveInGroup.test_usage_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveLong.test_failures_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveLong.test_failures_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveLong.test_help_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveLong.test_help_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveLong.test_successes_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveLong.test_successes_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveLong.test_usage_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveLong.test_usage_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveLongParent.test_failures_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveLongParent.test_failures_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveLongParent.test_help_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveLongParent.test_help_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveLongParent.test_successes_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveLongParent.test_successes_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveLongParent.test_usage_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveLongParent.test_usage_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveManySuppressed.test_failures_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveManySuppressed.test_failures_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveManySuppressed.test_help_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveManySuppressed.test_help_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveManySuppressed.test_successes_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveManySuppressed.test_successes_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveManySuppressed.test_usage_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveManySuppressed.test_usage_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_failures_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_failures_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_help_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_help_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_successes_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_successes_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_usage_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_usage_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveNested.test_help_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveNested.test_help_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveNested.test_usage_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveNested.test_usage_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_failures_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_failures_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_help_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_help_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_successes_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_successes_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_usage_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_usage_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_failures_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_failures_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_help_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_help_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_successes_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_successes_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_usage_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_usage_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_failures_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_failures_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_help_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_help_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_successes_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_successes_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_usage_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_usage_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_failures_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_failures_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_help_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_help_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_successes_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_successes_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_usage_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_usage_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_failures_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_failures_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_help_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_help_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_successes_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_successes_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_usage_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_usage_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_failures_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_failures_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_help_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_help_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_successes_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_successes_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_usage_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_usage_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveSimple.test_failures_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveSimple.test_failures_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveSimple.test_help_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveSimple.test_help_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveSimple.test_successes_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveSimple.test_successes_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveSimple.test_usage_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveSimple.test_usage_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveSimpleParent.test_failures_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveSimpleParent.test_failures_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveSimpleParent.test_help_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveSimpleParent.test_help_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveSimpleParent.test_successes_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveSimpleParent.test_successes_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveSimpleParent.test_usage_when_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestMutuallyExclusiveSimpleParent.test_usage_when_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNamespace.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNamespace.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNamespace.test_equality_returns_notimplemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNamespaceContainsSimple.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNamespaceContainsSimple.test_non_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsRemainder.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsRemainder.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsRemainder.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsRemainder.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsRemainder.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsRemainder.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsRemainder.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsRemainder.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsRemainder.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsRemainder.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsRemainder.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsRemainder.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsZeroOrMore.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsZeroOrMore.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsZeroOrMore.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsZeroOrMore.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsZeroOrMore.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsZeroOrMore.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsZeroOrMore.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsZeroOrMore.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsZeroOrMore.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsZeroOrMore.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsZeroOrMore.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestNargsZeroOrMore.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionLike.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionLike.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionLike.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionLike.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionLike.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionLike.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionLike.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionLike.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionLike.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionLike.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionLike.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionLike.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppend.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppend.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppend.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppend.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppend.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppend.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppend.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppend.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppend.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppend.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppend.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppend.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConst.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConst.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConst.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConst.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConst.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConst.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConst.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConst.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConst.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConst.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConst.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConst.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionCount.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionCount.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionCount.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionCount.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionCount.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionCount.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionCount.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionCount.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionCount.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionCount.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionCount.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionCount.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStore.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStore.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStore.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStore.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStore.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStore.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStore.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStore.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStore.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStore.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStore.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStore.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreConst.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreConst.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreConst.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreConst.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreConst.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreConst.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreConst.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreConst.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreConst.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreConst.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreConst.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreConst.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreFalse.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreFalse.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreFalse.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreFalse.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreFalse.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreFalse.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreFalse.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreFalse.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreFalse.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreFalse.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreFalse.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreFalse.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreTrue.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreTrue.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreTrue.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreTrue.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreTrue.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreTrue.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreTrue.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreTrue.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreTrue.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreTrue.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreTrue.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsActionStoreTrue.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsChoices.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsChoices.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsChoices.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsChoices.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsChoices.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsChoices.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsChoices.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsChoices.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsChoices.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsChoices.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsChoices.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsChoices.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDefault.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDefault.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDefault.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDefault.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDefault.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDefault.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDefault.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDefault.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDefault.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDefault.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDefault.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDefault.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDest.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDest.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDest.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDest.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDest.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDest.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDest.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDest.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDest.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDest.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDest.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDest.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDash.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDash.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDash.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDash.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDash.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDash.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDash.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDash.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDash.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDash.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDash.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDash.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsHelpVersionActions.test_alternate_help_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsHelpVersionActions.test_help_version_extra_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsHelpVersionActions.test_no_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsHelpVersionActions.test_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsHelpVersionActions.test_version_action @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsHelpVersionActions.test_version_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsHelpVersionActions.test_version_no_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs1.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs1.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs1.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs1.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs1.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs1.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs1.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs1.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs1.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs1.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs1.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs1.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs3.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs3.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs3.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs3.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs3.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs3.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs3.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs3.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs3.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs3.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs3.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargs3.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsDefault.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsDefault.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsDefault.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsDefault.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsDefault.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsDefault.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsDefault.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsDefault.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsDefault.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsDefault.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsDefault.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsDefault.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOptional.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOptional.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOptional.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOptional.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOptional.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOptional.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOptional.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOptional.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOptional.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOptional.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOptional.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsOptional.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumeric.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumeric.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumeric.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumeric.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumeric.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumeric.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumeric.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumeric.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumeric.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumeric.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumeric.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumeric.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsRequired.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsRequired.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsRequired.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsRequired.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsRequired.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsRequired.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsRequired.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsRequired.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsRequired.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsRequired.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsRequired.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsRequired.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsShortLong.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsShortLong.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsShortLong.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsShortLong.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsShortLong.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsShortLong.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsShortLong.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsShortLong.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsShortLong.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsShortLong.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsShortLong.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsShortLong.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDash.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDash.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDash.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDash.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDash.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDash.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDash.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDash.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDash.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDash.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDash.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDash.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashCombined.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashCombined.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashCombined.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashCombined.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashCombined.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashCombined.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashCombined.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashCombined.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashCombined.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashCombined.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashCombined.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashCombined.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashLong.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashLong.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashLong.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashLong.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashLong.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashLong.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashLong.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashLong.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashLong.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashLong.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashLong.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashLong.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParentParsers.test_conflicting_parents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParentParsers.test_conflicting_parents_mutex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParentParsers.test_groups_parents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParentParsers.test_multiple_parents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParentParsers.test_multiple_parents_mutex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParentParsers.test_parent_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParentParsers.test_same_argument_name_parents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParentParsers.test_single_granparent_mutex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParentParsers.test_single_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParentParsers.test_single_parent_mutex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParentParsers.test_subparser_parents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParentParsers.test_subparser_parents_mutex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParseKnownArgs.test_arguments_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParseKnownArgs.test_arguments_list_positional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParseKnownArgs.test_arguments_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParseKnownArgs.test_arguments_tuple_positional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParseKnownArgs.test_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParseKnownArgs.test_optionals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefault42.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefault42.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefault42.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefault42.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefault42.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefault42.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefault42.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefault42.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefault42.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefault42.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefault42.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefault42.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefaultSuppress.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefaultSuppress.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefaultSuppress.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefaultSuppress.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefaultSuppress.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefaultSuppress.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefaultSuppress.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefaultSuppress.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefaultSuppress.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefaultSuppress.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefaultSuppress.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestParserDefaultSuppress.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsActionAppend.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsActionAppend.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsActionAppend.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsActionAppend.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsActionAppend.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsActionAppend.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsActionAppend.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsActionAppend.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsActionAppend.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsActionAppend.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsActionAppend.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsActionAppend.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesInt.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesInt.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesInt.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesInt.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesInt.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesInt.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesInt.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesInt.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesInt.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesInt.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesInt.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesInt.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesString.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesString.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesString.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesString.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesString.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesString.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesString.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesString.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesString.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesString.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesString.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsChoicesString.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsGroups.test_group_first @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsGroups.test_interleaved_groups @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsGroups.test_nongroup_first @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs1.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs1.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs1.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs1.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs1.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs1.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs1.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs1.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs1.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs1.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs1.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs1.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2None.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2None.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2None.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2None.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2None.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2None.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2None.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2None.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2None.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2None.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2None.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2None.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2Optional.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2Optional.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2Optional.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2Optional.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2Optional.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2Optional.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2Optional.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2Optional.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2Optional.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2Optional.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2Optional.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2Optional.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone1.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone1.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone1.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone1.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone1.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone1.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone1.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone1.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone1.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone1.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone1.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNone1.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneNone.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneNone.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneNone.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneNone.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneNone.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneNone.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneNone.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneNone.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneNone.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneNone.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneNone.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneNone.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional1.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional1.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional1.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional1.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional1.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional1.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional1.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional1.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional1.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional1.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional1.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptional1.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestSetDefaults.test_set_defaults_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestSetDefaults.test_set_defaults_on_parent_and_subparser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestSetDefaults.test_set_defaults_parents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestSetDefaults.test_set_defaults_same_as_add_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestSetDefaults.test_set_defaults_same_as_add_argument_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestSetDefaults.test_set_defaults_subparsers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestSetDefaults.test_set_defaults_with_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestShortColumns.test_format_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestShortColumns.test_format_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestShortColumns.test_print_file_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestShortColumns.test_print_file_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestShortColumns.test_print_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestShortColumns.test_print_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestStrings.test_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestStrings.test_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestStrings.test_namespace_kwargs_and_starkwargs_notidentifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestStrings.test_namespace_starkwargs_identifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestStrings.test_namespace_starkwargs_notidentifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestStrings.test_optional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestStrings.test_parser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeCallable.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeCallable.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeCallable.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeCallable.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeCallable.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeCallable.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeCallable.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeCallable.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeCallable.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeCallable.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeCallable.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeCallable.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeClassicClass.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeClassicClass.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeClassicClass.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeClassicClass.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeClassicClass.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeClassicClass.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeClassicClass.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeClassicClass.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeClassicClass.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeClassicClass.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeClassicClass.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeClassicClass.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeFunctionCallOnlyOnce.test_type_function_call_only_once @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeFunctionCalledOnDefault.test_issue_15906 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeFunctionCalledOnDefault.test_no_double_type_conversion_of_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeFunctionCalledOnDefault.test_type_function_call_with_non_string_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeFunctionCalledOnDefault.test_type_function_call_with_string_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeRegistration.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeUserDefined.test_failures_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeUserDefined.test_failures_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeUserDefined.test_failures_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeUserDefined.test_failures_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeUserDefined.test_failures_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeUserDefined.test_failures_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeUserDefined.test_successes_many_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeUserDefined.test_successes_many_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeUserDefined.test_successes_no_groups_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeUserDefined.test_successes_no_groups_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeUserDefined.test_successes_one_group_listargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestTypeUserDefined.test_successes_one_group_sysargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_argparse.TestWrappingMetavar.test_help_with_metavar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_array.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_array.txt index 6a81f8e06f..ef66af99c9 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_array.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_array.txt @@ -1,798 +1,731 @@ -*graalpython.lib-python.3.test.test_array.ArrayReconstructorTest.test_error -*graalpython.lib-python.3.test.test_array.ArrayReconstructorTest.test_numbers -*graalpython.lib-python.3.test.test_array.ArrayReconstructorTest.test_unicode -*graalpython.lib-python.3.test.test_array.ByteTest.test_add -*graalpython.lib-python.3.test.test_array.ByteTest.test_assignment -*graalpython.lib-python.3.test.test_array.ByteTest.test_buffer -*graalpython.lib-python.3.test.test_array.ByteTest.test_buffer_info -*graalpython.lib-python.3.test.test_array.ByteTest.test_bug_782369 -*graalpython.lib-python.3.test.test_array.ByteTest.test_byteswap -*graalpython.lib-python.3.test.test_array.ByteTest.test_cmp -*graalpython.lib-python.3.test.test_array.ByteTest.test_constructor -*graalpython.lib-python.3.test.test_array.ByteTest.test_constructor_with_iterable_argument -*graalpython.lib-python.3.test.test_array.ByteTest.test_copy -*graalpython.lib-python.3.test.test_array.ByteTest.test_count -*graalpython.lib-python.3.test.test_array.ByteTest.test_coveritertraverse -*graalpython.lib-python.3.test.test_array.ByteTest.test_create_from_bytes -*graalpython.lib-python.3.test.test_array.ByteTest.test_deepcopy -*graalpython.lib-python.3.test.test_array.ByteTest.test_delitem -*graalpython.lib-python.3.test.test_array.ByteTest.test_delslice -*graalpython.lib-python.3.test.test_array.ByteTest.test_exhausted_iterator -*graalpython.lib-python.3.test.test_array.ByteTest.test_exhausted_reverse_iterator -*graalpython.lib-python.3.test.test_array.ByteTest.test_extend -*graalpython.lib-python.3.test.test_array.ByteTest.test_extended_getslice -*graalpython.lib-python.3.test.test_array.ByteTest.test_extended_set_del_slice -*graalpython.lib-python.3.test.test_array.ByteTest.test_extslice -*graalpython.lib-python.3.test.test_array.ByteTest.test_filewrite -*graalpython.lib-python.3.test.test_array.ByteTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_array.ByteTest.test_fromarray -*graalpython.lib-python.3.test.test_array.ByteTest.test_frombytearray -*graalpython.lib-python.3.test.test_array.ByteTest.test_fromfile_ioerror -*graalpython.lib-python.3.test.test_array.ByteTest.test_getitem -*graalpython.lib-python.3.test.test_array.ByteTest.test_getslice -*graalpython.lib-python.3.test.test_array.ByteTest.test_iadd -*graalpython.lib-python.3.test.test_array.ByteTest.test_imul -*graalpython.lib-python.3.test.test_array.ByteTest.test_index -*graalpython.lib-python.3.test.test_array.ByteTest.test_initialize_with_unicode -*graalpython.lib-python.3.test.test_array.ByteTest.test_insert -*graalpython.lib-python.3.test.test_array.ByteTest.test_iterationcontains -*graalpython.lib-python.3.test.test_array.ByteTest.test_iterator_pickle -*graalpython.lib-python.3.test.test_array.ByteTest.test_len -*graalpython.lib-python.3.test.test_array.ByteTest.test_mul -*graalpython.lib-python.3.test.test_array.ByteTest.test_obsolete_write_lock -*graalpython.lib-python.3.test.test_array.ByteTest.test_overflow -*graalpython.lib-python.3.test.test_array.ByteTest.test_pickle -*graalpython.lib-python.3.test.test_array.ByteTest.test_pickle_for_empty_array -*graalpython.lib-python.3.test.test_array.ByteTest.test_pop -*graalpython.lib-python.3.test.test_array.ByteTest.test_reduce_ex -*graalpython.lib-python.3.test.test_array.ByteTest.test_remove -*graalpython.lib-python.3.test.test_array.ByteTest.test_repr -*graalpython.lib-python.3.test.test_array.ByteTest.test_reverse -*graalpython.lib-python.3.test.test_array.ByteTest.test_reverse_iterator -*graalpython.lib-python.3.test.test_array.ByteTest.test_setitem -*graalpython.lib-python.3.test.test_array.ByteTest.test_setslice -*graalpython.lib-python.3.test.test_array.ByteTest.test_sizeof_with_buffer -*graalpython.lib-python.3.test.test_array.ByteTest.test_sizeof_without_buffer -*graalpython.lib-python.3.test.test_array.ByteTest.test_str -*graalpython.lib-python.3.test.test_array.ByteTest.test_subclass_with_kwargs -*graalpython.lib-python.3.test.test_array.ByteTest.test_subclassing -*graalpython.lib-python.3.test.test_array.ByteTest.test_tofrombytes -*graalpython.lib-python.3.test.test_array.ByteTest.test_tofromfile -*graalpython.lib-python.3.test.test_array.ByteTest.test_tofromlist -*graalpython.lib-python.3.test.test_array.ByteTest.test_type_error -*graalpython.lib-python.3.test.test_array.ByteTest.test_weakref -*graalpython.lib-python.3.test.test_array.DoubleTest.test_add -*graalpython.lib-python.3.test.test_array.DoubleTest.test_alloc_overflow -*graalpython.lib-python.3.test.test_array.DoubleTest.test_assignment -*graalpython.lib-python.3.test.test_array.DoubleTest.test_buffer -*graalpython.lib-python.3.test.test_array.DoubleTest.test_buffer_info -*graalpython.lib-python.3.test.test_array.DoubleTest.test_bug_782369 -*graalpython.lib-python.3.test.test_array.DoubleTest.test_byteswap -*graalpython.lib-python.3.test.test_array.DoubleTest.test_cmp -*graalpython.lib-python.3.test.test_array.DoubleTest.test_constructor -*graalpython.lib-python.3.test.test_array.DoubleTest.test_constructor_with_iterable_argument -*graalpython.lib-python.3.test.test_array.DoubleTest.test_copy -*graalpython.lib-python.3.test.test_array.DoubleTest.test_count -*graalpython.lib-python.3.test.test_array.DoubleTest.test_coveritertraverse -*graalpython.lib-python.3.test.test_array.DoubleTest.test_create_from_bytes -*graalpython.lib-python.3.test.test_array.DoubleTest.test_deepcopy -*graalpython.lib-python.3.test.test_array.DoubleTest.test_delitem -*graalpython.lib-python.3.test.test_array.DoubleTest.test_delslice -*graalpython.lib-python.3.test.test_array.DoubleTest.test_exhausted_iterator -*graalpython.lib-python.3.test.test_array.DoubleTest.test_exhausted_reverse_iterator -*graalpython.lib-python.3.test.test_array.DoubleTest.test_extend -*graalpython.lib-python.3.test.test_array.DoubleTest.test_extended_getslice -*graalpython.lib-python.3.test.test_array.DoubleTest.test_extended_set_del_slice -*graalpython.lib-python.3.test.test_array.DoubleTest.test_extslice -*graalpython.lib-python.3.test.test_array.DoubleTest.test_filewrite -*graalpython.lib-python.3.test.test_array.DoubleTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_array.DoubleTest.test_fromarray -*graalpython.lib-python.3.test.test_array.DoubleTest.test_frombytearray -*graalpython.lib-python.3.test.test_array.DoubleTest.test_fromfile_ioerror -*graalpython.lib-python.3.test.test_array.DoubleTest.test_getitem -*graalpython.lib-python.3.test.test_array.DoubleTest.test_getslice -*graalpython.lib-python.3.test.test_array.DoubleTest.test_iadd -*graalpython.lib-python.3.test.test_array.DoubleTest.test_imul -*graalpython.lib-python.3.test.test_array.DoubleTest.test_index -*graalpython.lib-python.3.test.test_array.DoubleTest.test_initialize_with_unicode -*graalpython.lib-python.3.test.test_array.DoubleTest.test_insert -*graalpython.lib-python.3.test.test_array.DoubleTest.test_iterationcontains -*graalpython.lib-python.3.test.test_array.DoubleTest.test_iterator_pickle -*graalpython.lib-python.3.test.test_array.DoubleTest.test_len -*graalpython.lib-python.3.test.test_array.DoubleTest.test_mul -*graalpython.lib-python.3.test.test_array.DoubleTest.test_nan -*graalpython.lib-python.3.test.test_array.DoubleTest.test_obsolete_write_lock -*graalpython.lib-python.3.test.test_array.DoubleTest.test_pickle -*graalpython.lib-python.3.test.test_array.DoubleTest.test_pickle_for_empty_array -*graalpython.lib-python.3.test.test_array.DoubleTest.test_pop -*graalpython.lib-python.3.test.test_array.DoubleTest.test_reduce_ex -*graalpython.lib-python.3.test.test_array.DoubleTest.test_remove -*graalpython.lib-python.3.test.test_array.DoubleTest.test_repr -*graalpython.lib-python.3.test.test_array.DoubleTest.test_reverse -*graalpython.lib-python.3.test.test_array.DoubleTest.test_reverse_iterator -*graalpython.lib-python.3.test.test_array.DoubleTest.test_setitem -*graalpython.lib-python.3.test.test_array.DoubleTest.test_setslice -*graalpython.lib-python.3.test.test_array.DoubleTest.test_sizeof_with_buffer -*graalpython.lib-python.3.test.test_array.DoubleTest.test_sizeof_without_buffer -*graalpython.lib-python.3.test.test_array.DoubleTest.test_str -*graalpython.lib-python.3.test.test_array.DoubleTest.test_subclass_with_kwargs -*graalpython.lib-python.3.test.test_array.DoubleTest.test_subclassing -*graalpython.lib-python.3.test.test_array.DoubleTest.test_tofrombytes -*graalpython.lib-python.3.test.test_array.DoubleTest.test_tofromfile -*graalpython.lib-python.3.test.test_array.DoubleTest.test_tofromlist -*graalpython.lib-python.3.test.test_array.DoubleTest.test_weakref -*graalpython.lib-python.3.test.test_array.FloatTest.test_add -*graalpython.lib-python.3.test.test_array.FloatTest.test_assignment -*graalpython.lib-python.3.test.test_array.FloatTest.test_buffer -*graalpython.lib-python.3.test.test_array.FloatTest.test_buffer_info -*graalpython.lib-python.3.test.test_array.FloatTest.test_bug_782369 -*graalpython.lib-python.3.test.test_array.FloatTest.test_byteswap -*graalpython.lib-python.3.test.test_array.FloatTest.test_cmp -*graalpython.lib-python.3.test.test_array.FloatTest.test_constructor -*graalpython.lib-python.3.test.test_array.FloatTest.test_constructor_with_iterable_argument -*graalpython.lib-python.3.test.test_array.FloatTest.test_copy -*graalpython.lib-python.3.test.test_array.FloatTest.test_count -*graalpython.lib-python.3.test.test_array.FloatTest.test_coveritertraverse -*graalpython.lib-python.3.test.test_array.FloatTest.test_create_from_bytes -*graalpython.lib-python.3.test.test_array.FloatTest.test_deepcopy -*graalpython.lib-python.3.test.test_array.FloatTest.test_delitem -*graalpython.lib-python.3.test.test_array.FloatTest.test_delslice -*graalpython.lib-python.3.test.test_array.FloatTest.test_exhausted_iterator -*graalpython.lib-python.3.test.test_array.FloatTest.test_exhausted_reverse_iterator -*graalpython.lib-python.3.test.test_array.FloatTest.test_extend -*graalpython.lib-python.3.test.test_array.FloatTest.test_extended_getslice -*graalpython.lib-python.3.test.test_array.FloatTest.test_extended_set_del_slice -*graalpython.lib-python.3.test.test_array.FloatTest.test_extslice -*graalpython.lib-python.3.test.test_array.FloatTest.test_filewrite -*graalpython.lib-python.3.test.test_array.FloatTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_array.FloatTest.test_fromarray -*graalpython.lib-python.3.test.test_array.FloatTest.test_frombytearray -*graalpython.lib-python.3.test.test_array.FloatTest.test_fromfile_ioerror -*graalpython.lib-python.3.test.test_array.FloatTest.test_getitem -*graalpython.lib-python.3.test.test_array.FloatTest.test_getslice -*graalpython.lib-python.3.test.test_array.FloatTest.test_iadd -*graalpython.lib-python.3.test.test_array.FloatTest.test_imul -*graalpython.lib-python.3.test.test_array.FloatTest.test_index -*graalpython.lib-python.3.test.test_array.FloatTest.test_initialize_with_unicode -*graalpython.lib-python.3.test.test_array.FloatTest.test_insert -*graalpython.lib-python.3.test.test_array.FloatTest.test_iterationcontains -*graalpython.lib-python.3.test.test_array.FloatTest.test_iterator_pickle -*graalpython.lib-python.3.test.test_array.FloatTest.test_len -*graalpython.lib-python.3.test.test_array.FloatTest.test_mul -*graalpython.lib-python.3.test.test_array.FloatTest.test_nan -*graalpython.lib-python.3.test.test_array.FloatTest.test_obsolete_write_lock -*graalpython.lib-python.3.test.test_array.FloatTest.test_pickle -*graalpython.lib-python.3.test.test_array.FloatTest.test_pickle_for_empty_array -*graalpython.lib-python.3.test.test_array.FloatTest.test_pop -*graalpython.lib-python.3.test.test_array.FloatTest.test_reduce_ex -*graalpython.lib-python.3.test.test_array.FloatTest.test_remove -*graalpython.lib-python.3.test.test_array.FloatTest.test_repr -*graalpython.lib-python.3.test.test_array.FloatTest.test_reverse -*graalpython.lib-python.3.test.test_array.FloatTest.test_reverse_iterator -*graalpython.lib-python.3.test.test_array.FloatTest.test_setitem -*graalpython.lib-python.3.test.test_array.FloatTest.test_setslice -*graalpython.lib-python.3.test.test_array.FloatTest.test_sizeof_with_buffer -*graalpython.lib-python.3.test.test_array.FloatTest.test_sizeof_without_buffer -*graalpython.lib-python.3.test.test_array.FloatTest.test_str -*graalpython.lib-python.3.test.test_array.FloatTest.test_subclass_with_kwargs -*graalpython.lib-python.3.test.test_array.FloatTest.test_subclassing -*graalpython.lib-python.3.test.test_array.FloatTest.test_tofrombytes -*graalpython.lib-python.3.test.test_array.FloatTest.test_tofromfile -*graalpython.lib-python.3.test.test_array.FloatTest.test_tofromlist -*graalpython.lib-python.3.test.test_array.FloatTest.test_weakref -*graalpython.lib-python.3.test.test_array.IntTest.test_add -*graalpython.lib-python.3.test.test_array.IntTest.test_assignment -*graalpython.lib-python.3.test.test_array.IntTest.test_buffer -*graalpython.lib-python.3.test.test_array.IntTest.test_buffer_info -*graalpython.lib-python.3.test.test_array.IntTest.test_bug_782369 -*graalpython.lib-python.3.test.test_array.IntTest.test_byteswap -*graalpython.lib-python.3.test.test_array.IntTest.test_cmp -*graalpython.lib-python.3.test.test_array.IntTest.test_constructor -*graalpython.lib-python.3.test.test_array.IntTest.test_constructor_with_iterable_argument -*graalpython.lib-python.3.test.test_array.IntTest.test_copy -*graalpython.lib-python.3.test.test_array.IntTest.test_count -*graalpython.lib-python.3.test.test_array.IntTest.test_coveritertraverse -*graalpython.lib-python.3.test.test_array.IntTest.test_create_from_bytes -*graalpython.lib-python.3.test.test_array.IntTest.test_deepcopy -*graalpython.lib-python.3.test.test_array.IntTest.test_delitem -*graalpython.lib-python.3.test.test_array.IntTest.test_delslice -*graalpython.lib-python.3.test.test_array.IntTest.test_exhausted_iterator -*graalpython.lib-python.3.test.test_array.IntTest.test_exhausted_reverse_iterator -*graalpython.lib-python.3.test.test_array.IntTest.test_extend -*graalpython.lib-python.3.test.test_array.IntTest.test_extended_getslice -*graalpython.lib-python.3.test.test_array.IntTest.test_extended_set_del_slice -*graalpython.lib-python.3.test.test_array.IntTest.test_extslice -*graalpython.lib-python.3.test.test_array.IntTest.test_filewrite -*graalpython.lib-python.3.test.test_array.IntTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_array.IntTest.test_fromarray -*graalpython.lib-python.3.test.test_array.IntTest.test_frombytearray -*graalpython.lib-python.3.test.test_array.IntTest.test_fromfile_ioerror -*graalpython.lib-python.3.test.test_array.IntTest.test_getitem -*graalpython.lib-python.3.test.test_array.IntTest.test_getslice -*graalpython.lib-python.3.test.test_array.IntTest.test_iadd -*graalpython.lib-python.3.test.test_array.IntTest.test_imul -*graalpython.lib-python.3.test.test_array.IntTest.test_index -*graalpython.lib-python.3.test.test_array.IntTest.test_initialize_with_unicode -*graalpython.lib-python.3.test.test_array.IntTest.test_insert -*graalpython.lib-python.3.test.test_array.IntTest.test_iterationcontains -*graalpython.lib-python.3.test.test_array.IntTest.test_iterator_pickle -*graalpython.lib-python.3.test.test_array.IntTest.test_len -*graalpython.lib-python.3.test.test_array.IntTest.test_mul -*graalpython.lib-python.3.test.test_array.IntTest.test_obsolete_write_lock -*graalpython.lib-python.3.test.test_array.IntTest.test_overflow -*graalpython.lib-python.3.test.test_array.IntTest.test_pickle -*graalpython.lib-python.3.test.test_array.IntTest.test_pickle_for_empty_array -*graalpython.lib-python.3.test.test_array.IntTest.test_pop -*graalpython.lib-python.3.test.test_array.IntTest.test_reduce_ex -*graalpython.lib-python.3.test.test_array.IntTest.test_remove -*graalpython.lib-python.3.test.test_array.IntTest.test_repr -*graalpython.lib-python.3.test.test_array.IntTest.test_reverse -*graalpython.lib-python.3.test.test_array.IntTest.test_reverse_iterator -*graalpython.lib-python.3.test.test_array.IntTest.test_setitem -*graalpython.lib-python.3.test.test_array.IntTest.test_setslice -*graalpython.lib-python.3.test.test_array.IntTest.test_sizeof_with_buffer -*graalpython.lib-python.3.test.test_array.IntTest.test_sizeof_without_buffer -*graalpython.lib-python.3.test.test_array.IntTest.test_str -*graalpython.lib-python.3.test.test_array.IntTest.test_subclass_with_kwargs -*graalpython.lib-python.3.test.test_array.IntTest.test_subclassing -*graalpython.lib-python.3.test.test_array.IntTest.test_tofrombytes -*graalpython.lib-python.3.test.test_array.IntTest.test_tofromfile -*graalpython.lib-python.3.test.test_array.IntTest.test_tofromlist -*graalpython.lib-python.3.test.test_array.IntTest.test_type_error -*graalpython.lib-python.3.test.test_array.IntTest.test_weakref -*graalpython.lib-python.3.test.test_array.LargeArrayTest.test_access -*graalpython.lib-python.3.test.test_array.LargeArrayTest.test_append -*graalpython.lib-python.3.test.test_array.LargeArrayTest.test_count -*graalpython.lib-python.3.test.test_array.LargeArrayTest.test_example_data -*graalpython.lib-python.3.test.test_array.LargeArrayTest.test_extend -*graalpython.lib-python.3.test.test_array.LargeArrayTest.test_frombytes -*graalpython.lib-python.3.test.test_array.LargeArrayTest.test_fromlist -*graalpython.lib-python.3.test.test_array.LargeArrayTest.test_index -*graalpython.lib-python.3.test.test_array.LargeArrayTest.test_insert -*graalpython.lib-python.3.test.test_array.LargeArrayTest.test_pop -*graalpython.lib-python.3.test.test_array.LargeArrayTest.test_remove -*graalpython.lib-python.3.test.test_array.LargeArrayTest.test_reverse -*graalpython.lib-python.3.test.test_array.LargeArrayTest.test_slice -*graalpython.lib-python.3.test.test_array.LargeArrayTest.test_tolist -*graalpython.lib-python.3.test.test_array.LongLongTest.test_add -*graalpython.lib-python.3.test.test_array.LongLongTest.test_assignment -*graalpython.lib-python.3.test.test_array.LongLongTest.test_buffer -*graalpython.lib-python.3.test.test_array.LongLongTest.test_buffer_info -*graalpython.lib-python.3.test.test_array.LongLongTest.test_bug_782369 -*graalpython.lib-python.3.test.test_array.LongLongTest.test_byteswap -*graalpython.lib-python.3.test.test_array.LongLongTest.test_cmp -*graalpython.lib-python.3.test.test_array.LongLongTest.test_constructor -*graalpython.lib-python.3.test.test_array.LongLongTest.test_constructor_with_iterable_argument -*graalpython.lib-python.3.test.test_array.LongLongTest.test_copy -*graalpython.lib-python.3.test.test_array.LongLongTest.test_count -*graalpython.lib-python.3.test.test_array.LongLongTest.test_coveritertraverse -*graalpython.lib-python.3.test.test_array.LongLongTest.test_create_from_bytes -*graalpython.lib-python.3.test.test_array.LongLongTest.test_deepcopy -*graalpython.lib-python.3.test.test_array.LongLongTest.test_delitem -*graalpython.lib-python.3.test.test_array.LongLongTest.test_delslice -*graalpython.lib-python.3.test.test_array.LongLongTest.test_exhausted_iterator -*graalpython.lib-python.3.test.test_array.LongLongTest.test_exhausted_reverse_iterator -*graalpython.lib-python.3.test.test_array.LongLongTest.test_extend -*graalpython.lib-python.3.test.test_array.LongLongTest.test_extended_getslice -*graalpython.lib-python.3.test.test_array.LongLongTest.test_extended_set_del_slice -*graalpython.lib-python.3.test.test_array.LongLongTest.test_extslice -*graalpython.lib-python.3.test.test_array.LongLongTest.test_filewrite -*graalpython.lib-python.3.test.test_array.LongLongTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_array.LongLongTest.test_fromarray -*graalpython.lib-python.3.test.test_array.LongLongTest.test_frombytearray -*graalpython.lib-python.3.test.test_array.LongLongTest.test_fromfile_ioerror -*graalpython.lib-python.3.test.test_array.LongLongTest.test_getitem -*graalpython.lib-python.3.test.test_array.LongLongTest.test_getslice -*graalpython.lib-python.3.test.test_array.LongLongTest.test_iadd -*graalpython.lib-python.3.test.test_array.LongLongTest.test_imul -*graalpython.lib-python.3.test.test_array.LongLongTest.test_index -*graalpython.lib-python.3.test.test_array.LongLongTest.test_initialize_with_unicode -*graalpython.lib-python.3.test.test_array.LongLongTest.test_insert -*graalpython.lib-python.3.test.test_array.LongLongTest.test_iterationcontains -*graalpython.lib-python.3.test.test_array.LongLongTest.test_iterator_pickle -*graalpython.lib-python.3.test.test_array.LongLongTest.test_len -*graalpython.lib-python.3.test.test_array.LongLongTest.test_mul -*graalpython.lib-python.3.test.test_array.LongLongTest.test_obsolete_write_lock -*graalpython.lib-python.3.test.test_array.LongLongTest.test_overflow -*graalpython.lib-python.3.test.test_array.LongLongTest.test_pickle -*graalpython.lib-python.3.test.test_array.LongLongTest.test_pickle_for_empty_array -*graalpython.lib-python.3.test.test_array.LongLongTest.test_pop -*graalpython.lib-python.3.test.test_array.LongLongTest.test_reduce_ex -*graalpython.lib-python.3.test.test_array.LongLongTest.test_remove -*graalpython.lib-python.3.test.test_array.LongLongTest.test_repr -*graalpython.lib-python.3.test.test_array.LongLongTest.test_reverse -*graalpython.lib-python.3.test.test_array.LongLongTest.test_reverse_iterator -*graalpython.lib-python.3.test.test_array.LongLongTest.test_setitem -*graalpython.lib-python.3.test.test_array.LongLongTest.test_setslice -*graalpython.lib-python.3.test.test_array.LongLongTest.test_sizeof_with_buffer -*graalpython.lib-python.3.test.test_array.LongLongTest.test_sizeof_without_buffer -*graalpython.lib-python.3.test.test_array.LongLongTest.test_str -*graalpython.lib-python.3.test.test_array.LongLongTest.test_subclass_with_kwargs -*graalpython.lib-python.3.test.test_array.LongLongTest.test_subclassing -*graalpython.lib-python.3.test.test_array.LongLongTest.test_tofrombytes -*graalpython.lib-python.3.test.test_array.LongLongTest.test_tofromfile -*graalpython.lib-python.3.test.test_array.LongLongTest.test_tofromlist -*graalpython.lib-python.3.test.test_array.LongLongTest.test_type_error -*graalpython.lib-python.3.test.test_array.LongLongTest.test_weakref -*graalpython.lib-python.3.test.test_array.LongTest.test_add -*graalpython.lib-python.3.test.test_array.LongTest.test_assignment -*graalpython.lib-python.3.test.test_array.LongTest.test_buffer -*graalpython.lib-python.3.test.test_array.LongTest.test_buffer_info -*graalpython.lib-python.3.test.test_array.LongTest.test_bug_782369 -*graalpython.lib-python.3.test.test_array.LongTest.test_byteswap -*graalpython.lib-python.3.test.test_array.LongTest.test_cmp -*graalpython.lib-python.3.test.test_array.LongTest.test_constructor -*graalpython.lib-python.3.test.test_array.LongTest.test_constructor_with_iterable_argument -*graalpython.lib-python.3.test.test_array.LongTest.test_copy -*graalpython.lib-python.3.test.test_array.LongTest.test_count -*graalpython.lib-python.3.test.test_array.LongTest.test_coveritertraverse -*graalpython.lib-python.3.test.test_array.LongTest.test_create_from_bytes -*graalpython.lib-python.3.test.test_array.LongTest.test_deepcopy -*graalpython.lib-python.3.test.test_array.LongTest.test_delitem -*graalpython.lib-python.3.test.test_array.LongTest.test_delslice -*graalpython.lib-python.3.test.test_array.LongTest.test_exhausted_iterator -*graalpython.lib-python.3.test.test_array.LongTest.test_exhausted_reverse_iterator -*graalpython.lib-python.3.test.test_array.LongTest.test_extend -*graalpython.lib-python.3.test.test_array.LongTest.test_extended_getslice -*graalpython.lib-python.3.test.test_array.LongTest.test_extended_set_del_slice -*graalpython.lib-python.3.test.test_array.LongTest.test_extslice -*graalpython.lib-python.3.test.test_array.LongTest.test_filewrite -*graalpython.lib-python.3.test.test_array.LongTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_array.LongTest.test_fromarray -*graalpython.lib-python.3.test.test_array.LongTest.test_frombytearray -*graalpython.lib-python.3.test.test_array.LongTest.test_fromfile_ioerror -*graalpython.lib-python.3.test.test_array.LongTest.test_getitem -*graalpython.lib-python.3.test.test_array.LongTest.test_getslice -*graalpython.lib-python.3.test.test_array.LongTest.test_iadd -*graalpython.lib-python.3.test.test_array.LongTest.test_imul -*graalpython.lib-python.3.test.test_array.LongTest.test_index -*graalpython.lib-python.3.test.test_array.LongTest.test_initialize_with_unicode -*graalpython.lib-python.3.test.test_array.LongTest.test_insert -*graalpython.lib-python.3.test.test_array.LongTest.test_iterationcontains -*graalpython.lib-python.3.test.test_array.LongTest.test_iterator_pickle -*graalpython.lib-python.3.test.test_array.LongTest.test_len -*graalpython.lib-python.3.test.test_array.LongTest.test_mul -*graalpython.lib-python.3.test.test_array.LongTest.test_obsolete_write_lock -*graalpython.lib-python.3.test.test_array.LongTest.test_overflow -*graalpython.lib-python.3.test.test_array.LongTest.test_pickle -*graalpython.lib-python.3.test.test_array.LongTest.test_pickle_for_empty_array -*graalpython.lib-python.3.test.test_array.LongTest.test_pop -*graalpython.lib-python.3.test.test_array.LongTest.test_reduce_ex -*graalpython.lib-python.3.test.test_array.LongTest.test_remove -*graalpython.lib-python.3.test.test_array.LongTest.test_repr -*graalpython.lib-python.3.test.test_array.LongTest.test_reverse -*graalpython.lib-python.3.test.test_array.LongTest.test_reverse_iterator -*graalpython.lib-python.3.test.test_array.LongTest.test_setitem -*graalpython.lib-python.3.test.test_array.LongTest.test_setslice -*graalpython.lib-python.3.test.test_array.LongTest.test_sizeof_with_buffer -*graalpython.lib-python.3.test.test_array.LongTest.test_sizeof_without_buffer -*graalpython.lib-python.3.test.test_array.LongTest.test_str -*graalpython.lib-python.3.test.test_array.LongTest.test_subclass_with_kwargs -*graalpython.lib-python.3.test.test_array.LongTest.test_subclassing -*graalpython.lib-python.3.test.test_array.LongTest.test_tofrombytes -*graalpython.lib-python.3.test.test_array.LongTest.test_tofromfile -*graalpython.lib-python.3.test.test_array.LongTest.test_tofromlist -*graalpython.lib-python.3.test.test_array.LongTest.test_type_error -*graalpython.lib-python.3.test.test_array.LongTest.test_weakref -*graalpython.lib-python.3.test.test_array.MiscTest.test_disallow_instantiation -*graalpython.lib-python.3.test.test_array.MiscTest.test_empty -*graalpython.lib-python.3.test.test_array.MiscTest.test_immutable -*graalpython.lib-python.3.test.test_array.ShortTest.test_add -*graalpython.lib-python.3.test.test_array.ShortTest.test_assignment -*graalpython.lib-python.3.test.test_array.ShortTest.test_buffer -*graalpython.lib-python.3.test.test_array.ShortTest.test_buffer_info -*graalpython.lib-python.3.test.test_array.ShortTest.test_bug_782369 -*graalpython.lib-python.3.test.test_array.ShortTest.test_byteswap -*graalpython.lib-python.3.test.test_array.ShortTest.test_cmp -*graalpython.lib-python.3.test.test_array.ShortTest.test_constructor -*graalpython.lib-python.3.test.test_array.ShortTest.test_constructor_with_iterable_argument -*graalpython.lib-python.3.test.test_array.ShortTest.test_copy -*graalpython.lib-python.3.test.test_array.ShortTest.test_count -*graalpython.lib-python.3.test.test_array.ShortTest.test_coveritertraverse -*graalpython.lib-python.3.test.test_array.ShortTest.test_create_from_bytes -*graalpython.lib-python.3.test.test_array.ShortTest.test_deepcopy -*graalpython.lib-python.3.test.test_array.ShortTest.test_delitem -*graalpython.lib-python.3.test.test_array.ShortTest.test_delslice -*graalpython.lib-python.3.test.test_array.ShortTest.test_exhausted_iterator -*graalpython.lib-python.3.test.test_array.ShortTest.test_exhausted_reverse_iterator -*graalpython.lib-python.3.test.test_array.ShortTest.test_extend -*graalpython.lib-python.3.test.test_array.ShortTest.test_extended_getslice -*graalpython.lib-python.3.test.test_array.ShortTest.test_extended_set_del_slice -*graalpython.lib-python.3.test.test_array.ShortTest.test_extslice -*graalpython.lib-python.3.test.test_array.ShortTest.test_filewrite -*graalpython.lib-python.3.test.test_array.ShortTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_array.ShortTest.test_fromarray -*graalpython.lib-python.3.test.test_array.ShortTest.test_frombytearray -*graalpython.lib-python.3.test.test_array.ShortTest.test_fromfile_ioerror -*graalpython.lib-python.3.test.test_array.ShortTest.test_getitem -*graalpython.lib-python.3.test.test_array.ShortTest.test_getslice -*graalpython.lib-python.3.test.test_array.ShortTest.test_iadd -*graalpython.lib-python.3.test.test_array.ShortTest.test_imul -*graalpython.lib-python.3.test.test_array.ShortTest.test_index -*graalpython.lib-python.3.test.test_array.ShortTest.test_initialize_with_unicode -*graalpython.lib-python.3.test.test_array.ShortTest.test_insert -*graalpython.lib-python.3.test.test_array.ShortTest.test_iterationcontains -*graalpython.lib-python.3.test.test_array.ShortTest.test_iterator_pickle -*graalpython.lib-python.3.test.test_array.ShortTest.test_len -*graalpython.lib-python.3.test.test_array.ShortTest.test_mul -*graalpython.lib-python.3.test.test_array.ShortTest.test_obsolete_write_lock -*graalpython.lib-python.3.test.test_array.ShortTest.test_overflow -*graalpython.lib-python.3.test.test_array.ShortTest.test_pickle -*graalpython.lib-python.3.test.test_array.ShortTest.test_pickle_for_empty_array -*graalpython.lib-python.3.test.test_array.ShortTest.test_pop -*graalpython.lib-python.3.test.test_array.ShortTest.test_reduce_ex -*graalpython.lib-python.3.test.test_array.ShortTest.test_remove -*graalpython.lib-python.3.test.test_array.ShortTest.test_repr -*graalpython.lib-python.3.test.test_array.ShortTest.test_reverse -*graalpython.lib-python.3.test.test_array.ShortTest.test_reverse_iterator -*graalpython.lib-python.3.test.test_array.ShortTest.test_setitem -*graalpython.lib-python.3.test.test_array.ShortTest.test_setslice -*graalpython.lib-python.3.test.test_array.ShortTest.test_sizeof_with_buffer -*graalpython.lib-python.3.test.test_array.ShortTest.test_sizeof_without_buffer -*graalpython.lib-python.3.test.test_array.ShortTest.test_str -*graalpython.lib-python.3.test.test_array.ShortTest.test_subclass_with_kwargs -*graalpython.lib-python.3.test.test_array.ShortTest.test_subclassing -*graalpython.lib-python.3.test.test_array.ShortTest.test_tofrombytes -*graalpython.lib-python.3.test.test_array.ShortTest.test_tofromfile -*graalpython.lib-python.3.test.test_array.ShortTest.test_tofromlist -*graalpython.lib-python.3.test.test_array.ShortTest.test_type_error -*graalpython.lib-python.3.test.test_array.ShortTest.test_weakref -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_add -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_buffer -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_buffer_info -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_bug_782369 -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_byteswap -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_cmp -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_constructor -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_constructor_with_iterable_argument -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_copy -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_count -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_coveritertraverse -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_create_from_bytes -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_deepcopy -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_delitem -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_exhausted_iterator -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_exhausted_reverse_iterator -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_extend -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_extended_getslice -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_extended_set_del_slice -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_filewrite -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_fromarray -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_fromfile_ioerror -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_getitem -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_getslice -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_iadd -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_imul -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_index -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_initialize_with_unicode -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_insert -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_issue17223 -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_iterator_pickle -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_len -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_mul -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_obsolete_write_lock -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_pickle -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_pickle_for_empty_array -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_pop -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_reduce_ex -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_remove -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_repr -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_reverse -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_reverse_iterator -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_setitem -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_setslice -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_sizeof_with_buffer -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_sizeof_without_buffer -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_str -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_subclass_with_kwargs -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_tofrombytes -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_tofromfile -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_tofromlist -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_unicode -*graalpython.lib-python.3.test.test_array.UnicodeTest.test_weakref -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_add -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_assignment -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_buffer -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_buffer_info -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_bug_782369 -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_bytes_extend -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_byteswap -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_cmp -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_constructor -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_constructor_with_iterable_argument -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_copy -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_count -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_coveritertraverse -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_create_from_bytes -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_deepcopy -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_delitem -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_delslice -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_exhausted_iterator -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_exhausted_reverse_iterator -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_extend -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_extended_getslice -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_extended_set_del_slice -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_extslice -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_filewrite -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_fromarray -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_frombytearray -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_fromfile_ioerror -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_getitem -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_getslice -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_iadd -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_imul -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_index -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_initialize_with_unicode -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_insert -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_iterationcontains -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_iterator_pickle -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_len -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_mul -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_obsolete_write_lock -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_overflow -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_pickle -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_pickle_for_empty_array -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_pop -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_reduce_ex -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_remove -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_repr -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_reverse -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_reverse_iterator -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_setitem -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_setslice -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_sizeof_with_buffer -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_sizeof_without_buffer -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_str -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_subclass_with_kwargs -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_subclassing -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_tofrombytes -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_tofromfile -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_tofromlist -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_type_error -*graalpython.lib-python.3.test.test_array.UnsignedByteTest.test_weakref -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_add -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_assignment -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_buffer -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_buffer_info -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_bug_782369 -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_bytes_extend -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_byteswap -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_cmp -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_constructor -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_constructor_with_iterable_argument -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_copy -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_count -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_coveritertraverse -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_create_from_bytes -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_deepcopy -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_delitem -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_delslice -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_exhausted_iterator -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_exhausted_reverse_iterator -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_extend -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_extended_getslice -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_extended_set_del_slice -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_extslice -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_filewrite -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_fromarray -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_frombytearray -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_fromfile_ioerror -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_getitem -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_getslice -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_iadd -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_imul -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_index -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_initialize_with_unicode -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_insert -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_iterationcontains -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_iterator_pickle -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_len -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_mul -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_obsolete_write_lock -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_overflow -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_pickle -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_pickle_for_empty_array -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_pop -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_reduce_ex -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_remove -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_repr -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_reverse -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_reverse_iterator -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_setitem -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_setslice -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_sizeof_with_buffer -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_sizeof_without_buffer -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_str -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_subclass_with_kwargs -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_subclassing -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_tofrombytes -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_tofromfile -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_tofromlist -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_type_error -*graalpython.lib-python.3.test.test_array.UnsignedIntTest.test_weakref -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_add -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_assignment -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_buffer -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_buffer_info -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_bug_782369 -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_bytes_extend -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_byteswap -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_cmp -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_constructor -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_constructor_with_iterable_argument -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_copy -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_count -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_coveritertraverse -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_create_from_bytes -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_deepcopy -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_delitem -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_delslice -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_exhausted_iterator -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_exhausted_reverse_iterator -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_extend -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_extended_getslice -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_extended_set_del_slice -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_extslice -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_filewrite -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_fromarray -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_frombytearray -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_fromfile_ioerror -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_getitem -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_getslice -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_iadd -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_imul -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_index -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_initialize_with_unicode -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_insert -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_iterationcontains -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_iterator_pickle -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_len -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_mul -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_obsolete_write_lock -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_overflow -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_pickle -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_pickle_for_empty_array -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_pop -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_reduce_ex -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_remove -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_repr -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_reverse -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_reverse_iterator -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_setitem -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_setslice -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_sizeof_with_buffer -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_sizeof_without_buffer -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_str -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_subclass_with_kwargs -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_subclassing -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_tofrombytes -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_tofromfile -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_tofromlist -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_type_error -*graalpython.lib-python.3.test.test_array.UnsignedLongLongTest.test_weakref -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_add -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_assignment -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_buffer -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_buffer_info -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_bug_782369 -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_bytes_extend -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_byteswap -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_cmp -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_constructor -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_constructor_with_iterable_argument -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_copy -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_count -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_coveritertraverse -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_create_from_bytes -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_deepcopy -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_delitem -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_delslice -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_exhausted_iterator -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_exhausted_reverse_iterator -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_extend -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_extended_getslice -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_extended_set_del_slice -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_extslice -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_filewrite -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_fromarray -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_frombytearray -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_fromfile_ioerror -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_getitem -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_getslice -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_iadd -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_imul -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_index -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_initialize_with_unicode -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_insert -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_iterationcontains -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_iterator_pickle -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_len -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_mul -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_obsolete_write_lock -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_overflow -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_pickle -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_pickle_for_empty_array -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_pop -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_reduce_ex -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_remove -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_repr -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_reverse -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_reverse_iterator -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_setitem -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_setslice -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_sizeof_with_buffer -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_sizeof_without_buffer -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_str -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_subclass_with_kwargs -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_subclassing -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_tofrombytes -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_tofromfile -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_tofromlist -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_type_error -*graalpython.lib-python.3.test.test_array.UnsignedLongTest.test_weakref -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_add -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_assignment -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_buffer -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_buffer_info -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_bug_782369 -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_bytes_extend -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_byteswap -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_cmp -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_constructor -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_constructor_with_iterable_argument -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_copy -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_count -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_coveritertraverse -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_create_from_bytes -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_deepcopy -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_delitem -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_delslice -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_exhausted_iterator -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_exhausted_reverse_iterator -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_extend -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_extended_getslice -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_extended_set_del_slice -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_extslice -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_filewrite -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_fromarray -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_frombytearray -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_fromfile_ioerror -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_getitem -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_getslice -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_iadd -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_imul -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_index -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_initialize_with_unicode -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_insert -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_iterationcontains -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_iterator_pickle -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_len -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_mul -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_obsolete_write_lock -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_overflow -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_pickle -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_pickle_for_empty_array -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_pop -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_reduce_ex -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_remove -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_repr -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_reverse -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_reverse_iterator -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_setitem -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_setslice -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_sizeof_with_buffer -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_sizeof_without_buffer -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_str -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_subclass_with_kwargs -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_subclassing -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_tofrombytes -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_tofromfile -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_tofromlist -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_type_error -*graalpython.lib-python.3.test.test_array.UnsignedShortTest.test_weakref +test.test_array.ArrayReconstructorTest.test_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ArrayReconstructorTest.test_numbers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ArrayReconstructorTest.test_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_buffer_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_bug_782369 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_byteswap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_constructor_with_iterable_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_coveritertraverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_create_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_delslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_exhausted_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_exhausted_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_extended_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_extended_set_del_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_extslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_filewrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_fromarray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_frombytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_fromfile_ioerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_iadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_imul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_initialize_with_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_iterationcontains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_iterator_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_pickle_for_empty_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_setslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_subclass_with_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_tofrombytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_tofromfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_tofromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ByteTest.test_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_alloc_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_buffer_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_bug_782369 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_byteswap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_constructor_with_iterable_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_coveritertraverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_create_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_delslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_exhausted_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_exhausted_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_extended_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_extended_set_del_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_extslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_filewrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_fromarray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_frombytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_fromfile_ioerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_iadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_imul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_initialize_with_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_iterationcontains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_iterator_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_pickle_for_empty_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_setslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_subclass_with_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_tofrombytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_tofromfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.DoubleTest.test_tofromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_buffer_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_bug_782369 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_byteswap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_constructor_with_iterable_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_coveritertraverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_create_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_delslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_exhausted_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_exhausted_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_extended_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_extended_set_del_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_extslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_filewrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_fromarray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_frombytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_fromfile_ioerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_iadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_imul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_initialize_with_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_iterationcontains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_iterator_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_pickle_for_empty_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_setslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_subclass_with_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_tofrombytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_tofromfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.FloatTest.test_tofromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_buffer_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_bug_782369 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_byteswap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_constructor_with_iterable_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_coveritertraverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_create_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_delslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_exhausted_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_exhausted_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_extended_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_extended_set_del_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_extslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_filewrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_fromarray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_frombytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_fromfile_ioerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_iadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_imul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_initialize_with_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_iterationcontains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_iterator_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_pickle_for_empty_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_setslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_subclass_with_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_tofrombytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_tofromfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_tofromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.IntTest.test_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LargeArrayTest.test_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LargeArrayTest.test_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LargeArrayTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LargeArrayTest.test_example_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LargeArrayTest.test_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LargeArrayTest.test_frombytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LargeArrayTest.test_fromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LargeArrayTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LargeArrayTest.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LargeArrayTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LargeArrayTest.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LargeArrayTest.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LargeArrayTest.test_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LargeArrayTest.test_tolist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_buffer_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_bug_782369 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_byteswap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_constructor_with_iterable_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_coveritertraverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_create_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_delslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_exhausted_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_exhausted_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_extended_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_extended_set_del_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_extslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_filewrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_fromarray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_frombytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_fromfile_ioerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_iadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_imul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_initialize_with_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_iterationcontains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_iterator_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_pickle_for_empty_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_setslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_subclass_with_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_tofrombytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_tofromfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_tofromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongLongTest.test_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_buffer_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_bug_782369 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_byteswap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_constructor_with_iterable_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_coveritertraverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_create_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_delslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_exhausted_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_exhausted_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_extended_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_extended_set_del_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_extslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_filewrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_fromarray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_frombytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_fromfile_ioerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_iadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_imul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_initialize_with_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_iterationcontains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_iterator_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_pickle_for_empty_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_setslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_subclass_with_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_tofrombytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_tofromfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_tofromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.LongTest.test_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.MiscTest.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_buffer_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_bug_782369 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_byteswap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_constructor_with_iterable_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_coveritertraverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_create_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_delslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_exhausted_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_exhausted_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_extended_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_extended_set_del_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_extslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_filewrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_fromarray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_frombytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_fromfile_ioerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_iadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_imul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_initialize_with_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_iterationcontains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_iterator_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_pickle_for_empty_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_setslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_subclass_with_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_tofrombytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_tofromfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_tofromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.ShortTest.test_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_buffer_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_bug_782369 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_byteswap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_constructor_with_iterable_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_coveritertraverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_create_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_exhausted_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_exhausted_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_extended_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_extended_set_del_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_filewrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_fromarray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_fromfile_ioerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_iadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_imul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_initialize_with_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_issue17223 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_iterator_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_pickle_for_empty_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_setslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_subclass_with_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_tofrombytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_tofromfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_tofromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnicodeTest.test_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_buffer_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_bug_782369 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_bytes_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_byteswap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_constructor_with_iterable_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_coveritertraverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_create_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_delslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_exhausted_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_exhausted_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_extended_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_extended_set_del_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_extslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_filewrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_fromarray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_frombytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_fromfile_ioerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_iadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_imul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_initialize_with_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_iterationcontains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_iterator_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_pickle_for_empty_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_setslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_subclass_with_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_tofrombytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_tofromfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_tofromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedByteTest.test_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_buffer_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_bug_782369 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_bytes_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_byteswap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_constructor_with_iterable_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_coveritertraverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_create_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_delslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_exhausted_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_exhausted_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_extended_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_extended_set_del_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_extslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_filewrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_fromarray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_frombytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_fromfile_ioerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_iadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_imul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_initialize_with_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_iterationcontains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_iterator_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_pickle_for_empty_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_setslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_subclass_with_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_tofrombytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_tofromfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_tofromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedIntTest.test_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_buffer_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_bug_782369 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_bytes_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_byteswap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_constructor_with_iterable_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_coveritertraverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_create_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_delslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_exhausted_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_exhausted_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_extended_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_extended_set_del_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_extslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_filewrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_fromarray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_frombytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_fromfile_ioerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_iadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_imul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_initialize_with_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_iterationcontains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_iterator_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_pickle_for_empty_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_setslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_subclass_with_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_tofrombytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_tofromfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_tofromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongLongTest.test_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_buffer_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_bug_782369 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_bytes_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_byteswap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_constructor_with_iterable_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_coveritertraverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_create_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_delslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_exhausted_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_exhausted_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_extended_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_extended_set_del_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_extslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_filewrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_fromarray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_frombytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_fromfile_ioerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_iadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_imul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_initialize_with_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_iterationcontains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_iterator_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_pickle_for_empty_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_setslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_subclass_with_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_tofrombytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_tofromfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_tofromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedLongTest.test_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_buffer_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_bug_782369 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_bytes_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_byteswap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_constructor_with_iterable_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_coveritertraverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_create_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_delslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_exhausted_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_exhausted_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_extended_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_extended_set_del_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_extslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_filewrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_fromarray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_frombytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_fromfile_ioerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_iadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_imul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_initialize_with_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_iterationcontains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_iterator_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_pickle_for_empty_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_reverse_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_setslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_subclass_with_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_tofrombytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_tofromfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_tofromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_array.UnsignedShortTest.test_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ast.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ast.txt index 7196af2958..793af7c58c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ast.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ast.txt @@ -1,142 +1,136 @@ -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_bad_integer -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_copy_location -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_dump -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_dump_incomplete -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_dump_indent -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_elif_stmt_start_position -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_elif_stmt_start_position_with_else -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_fix_missing_locations -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_get_docstring -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_get_docstring_none -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_increment_lineno -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_increment_lineno_on_module -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_iter_child_nodes -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_iter_fields -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_level_as_none -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_literal_eval -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_literal_eval_complex -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_literal_eval_malformed_dict_nodes -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_literal_eval_malformed_lineno -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_literal_eval_syntax_errors -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_literal_eval_trailing_ws -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_multi_line_docstring_col_offset_and_lineno_issue16806 -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_parse -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_parse_in_error -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_recursion_direct -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_recursion_indirect -*graalpython.lib-python.3.test.test_ast.ASTHelpers_Test.test_starred_expr_end_position_within_call -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_assert -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_assign -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_attribute -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_augassign -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_boolop -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_call -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_classdef -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_compare -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_delete -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_dict -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_dictcomp -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_expr -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_for -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_funcdef -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_generatorexp -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_global -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_if -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_ifexp -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_import -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_importfrom -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_lambda -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_list -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_listcomp -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_match_validation_pattern -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_module -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_nameconstant -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_nonlocal -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_num -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_raise -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_set -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_setcomp -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_starred -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_subscript -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_try -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_try_star -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_tuple -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_unaryop -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_while -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_with -*graalpython.lib-python.3.test.test_ast.ASTValidatorTests.test_yield -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_AST_objects -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_alias -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_arguments -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_assignment_expression_feature_version -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_ast_asdl_signature -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_ast_recursion_limit -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_ast_validation -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_base_classes -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_classattrs -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_constant_as_name -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_debug_f_string_feature_version -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_empty_yield_from -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_field_attr_existence -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_field_attr_writable -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_from_import -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_invalid_constant -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_invalid_identifier -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_invalid_identitifer -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_invalid_sum -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_isinstance -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_issue18374_binop_col_offset -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_issue31592 -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_issue39579_dotted_name_end_col_offset -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_issue40614_feature_version -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_module -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_no_fields -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_nodeclasses -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_non_interned_future_from_ast -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_none_checks -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_null_bytes -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_parenthesized_with_feature_version -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_pickling -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_positional_only_feature_version -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_precedence_enum -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_realtype -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_slice -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_snippets -*graalpython.lib-python.3.test.test_ast.AST_Tests.test_subclasses -*graalpython.lib-python.3.test.test_ast.ConstantTests.test_assign_to_constant -*graalpython.lib-python.3.test.test_ast.ConstantTests.test_get_docstring -*graalpython.lib-python.3.test.test_ast.ConstantTests.test_literal_eval -*graalpython.lib-python.3.test.test_ast.ConstantTests.test_load_const -*graalpython.lib-python.3.test.test_ast.ConstantTests.test_string_kind -*graalpython.lib-python.3.test.test_ast.ConstantTests.test_validation -*graalpython.lib-python.3.test.test_ast.ConstantTests.test_values -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_attribute_spaces -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_binop -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_boolop -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_call -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_call_noargs -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_class_def -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_class_kw -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_comprehensions -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_continued_str -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_displays -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_fstring -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_fstring_multi_line -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_func_def -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_import_from_multi_line -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_lambda -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_multi_line_str -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_redundant_parenthesis -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_slices -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_source_segment_endings -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_source_segment_missing_info -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_source_segment_multi -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_source_segment_tabs -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_suites -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_trailers_with_redundant_parenthesis -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_tuples -*graalpython.lib-python.3.test.test_ast.EndPositionTests.test_yield_await -*graalpython.lib-python.3.test.test_ast.ModuleStateTests.test_reload_module -*graalpython.lib-python.3.test.test_ast.ModuleStateTests.test_subinterpreter -*graalpython.lib-python.3.test.test_ast.ModuleStateTests.test_sys_modules -*graalpython.lib-python.3.test.test_ast.NodeVisitorTests.test_old_constant_nodes +test.test_ast.ASTHelpers_Test.test_bad_integer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_copy_location @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_dump @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_dump_incomplete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_dump_indent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_elif_stmt_start_position @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_elif_stmt_start_position_with_else @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_fix_missing_locations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_get_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_get_docstring_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_increment_lineno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_increment_lineno_on_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_iter_child_nodes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_iter_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_level_as_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_literal_eval @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_literal_eval_complex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_literal_eval_malformed_dict_nodes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_literal_eval_malformed_lineno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_literal_eval_syntax_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_literal_eval_trailing_ws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_multi_line_docstring_col_offset_and_lineno_issue16806 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_parse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_parse_in_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_recursion_direct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_recursion_indirect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTHelpers_Test.test_starred_expr_end_position_within_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_assert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_assign @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_augassign @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_boolop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_classdef @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_delete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_dictcomp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_expr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_funcdef @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_generatorexp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_global @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_if @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_ifexp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_importfrom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_lambda @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_listcomp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_match_validation_pattern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_nameconstant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_nonlocal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_num @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_setcomp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_starred @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_try @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_try_star @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_unaryop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_while @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ASTValidatorTests.test_yield @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_AST_garbage_collection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_AST_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_alias @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_assignment_expression_feature_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_ast_asdl_signature @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_ast_validation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_base_classes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_classattrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_compilation_of_ast_nodes_with_default_end_position_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_constant_as_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_debug_f_string_feature_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_empty_yield_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_field_attr_existence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_field_attr_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_from_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_invalid_constant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_invalid_identifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_invalid_sum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_isinstance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_issue18374_binop_col_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_issue39579_dotted_name_end_col_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_no_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_nodeclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_non_interned_future_from_ast @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_none_checks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_null_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_parenthesized_with_feature_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_positional_only_feature_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_precedence_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_realtype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_snippets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.AST_Tests.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ConstantTests.test_assign_to_constant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ConstantTests.test_get_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ConstantTests.test_literal_eval @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ConstantTests.test_string_kind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ConstantTests.test_validation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.ConstantTests.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_attribute_spaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_binop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_boolop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_call_noargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_class_def @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_class_kw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_comprehensions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_continued_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_displays @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_fstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_fstring_multi_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_func_def @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_import_from_multi_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_lambda @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_multi_line_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_redundant_parenthesis @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_slices @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_source_segment_endings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_source_segment_missing_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_source_segment_multi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_source_segment_tabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_suites @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_trailers_with_redundant_parenthesis @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_tuples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.EndPositionTests.test_yield_await @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ast.NodeVisitorTests.test_old_constant_nodes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_asyncgen.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_asyncgen.txt index 3481735ee5..e808fd4886 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_asyncgen.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_asyncgen.txt @@ -1,46 +1,49 @@ -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_aiter_bad_args -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_aiter_idempotent -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_anext_bad_args -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_aclose_after_exhaustion -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_aclose_compatible_with_get_stack -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_aclose_twice_with_different_coros -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_aiter -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_aiter_class -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_01 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_02 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_03 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_aclose_10 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_aclose_11 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_anext_04 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_anext_05 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_anext_06 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_anext_stopiteration -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_anext_tuple -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_asend_01 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_asend_03 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_athrow_01 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_athrow_02 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_athrow_03 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_athrow_stopiteration -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_athrow_tuple -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_shutdown_01 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_shutdown_02 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_shutdown_exception_01 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_await_same_aclose_coro_twice -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_await_same_anext_coro_twice -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_expression_01 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenAsyncioTest.test_asyncgen_nonstarted_hooks_are_cancellable -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenSyntaxTest.test_async_gen_syntax_01 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenSyntaxTest.test_async_gen_syntax_02 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenSyntaxTest.test_async_gen_syntax_03 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenSyntaxTest.test_async_gen_syntax_04 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenSyntaxTest.test_async_gen_syntax_05 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenTest.test_async_gen_exception_03 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenTest.test_async_gen_exception_04 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenTest.test_async_gen_exception_05 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenTest.test_async_gen_exception_07 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenTest.test_async_gen_exception_08 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenTest.test_async_gen_exception_09 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenTest.test_async_gen_exception_11 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenTest.test_async_gen_iteration_01 -*graalpython.lib-python.3.test.test_asyncgen.AsyncGenTest.test_async_gen_iteration_02 +test.test_asyncgen.AsyncGenAsyncioTest.test_aiter_bad_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_aiter_idempotent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_anext_bad_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_anext_return_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_anext_return_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_aclose_after_exhaustion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_aclose_compatible_with_get_stack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_aclose_twice_with_different_coros @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_aiter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_aiter_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_01 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_02 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_03 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_aclose_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_aclose_11 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_anext_04 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_anext_05 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_anext_06 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_anext_stopiteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_anext_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_asend_01 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_asend_02 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_asend_03 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_athrow_01 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_athrow_02 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_athrow_03 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_athrow_stopiteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_athrow_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_shutdown_01 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_shutdown_02 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_asyncio_shutdown_exception_01 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_await_same_aclose_coro_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_await_same_anext_coro_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_async_gen_expression_01 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenAsyncioTest.test_asyncgen_nonstarted_hooks_are_cancellable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncgen.AsyncGenSyntaxTest.test_async_gen_syntax_01 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncgen.AsyncGenSyntaxTest.test_async_gen_syntax_02 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncgen.AsyncGenSyntaxTest.test_async_gen_syntax_03 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncgen.AsyncGenSyntaxTest.test_async_gen_syntax_04 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncgen.AsyncGenSyntaxTest.test_async_gen_syntax_05 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncgen.AsyncGenTest.test_async_gen_exception_03 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncgen.AsyncGenTest.test_async_gen_exception_04 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncgen.AsyncGenTest.test_async_gen_exception_05 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncgen.AsyncGenTest.test_async_gen_exception_07 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncgen.AsyncGenTest.test_async_gen_exception_08 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncgen.AsyncGenTest.test_async_gen_exception_09 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncgen.AsyncGenTest.test_async_gen_exception_11 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncgen.AsyncGenTest.test_async_gen_iteration_01 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncgen.AsyncGenTest.test_async_gen_iteration_02 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_asynchat.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_asynchat.txt index c6be28fb54..ff4e471f56 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_asynchat.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_asynchat.txt @@ -1,25 +1,25 @@ -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat.test_close_when_done -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat.test_empty_line -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat.test_line_terminator1 -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat.test_line_terminator2 -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat.test_line_terminator3 -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat.test_none_terminator -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat.test_numeric_terminator1 -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat.test_numeric_terminator2 -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat.test_push -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat.test_simple_producer -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat.test_string_producer -*graalpython.lib-python.3.test.test_asynchat.TestAsynchatMocked.test_blockingioerror -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat_WithPoll.test_close_when_done -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat_WithPoll.test_empty_line -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat_WithPoll.test_line_terminator1 -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat_WithPoll.test_line_terminator2 -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat_WithPoll.test_line_terminator3 -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat_WithPoll.test_none_terminator -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat_WithPoll.test_numeric_terminator1 -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat_WithPoll.test_numeric_terminator2 -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat_WithPoll.test_push -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat_WithPoll.test_simple_producer -*graalpython.lib-python.3.test.test_asynchat.TestAsynchat_WithPoll.test_string_producer -*graalpython.lib-python.3.test.test_asynchat.TestHelperFunctions.test_find_prefix_at_end -*graalpython.lib-python.3.test.test_asynchat.TestNotConnected.test_disallow_negative_terminator +test.test_asynchat.TestAsynchat.test_close_when_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat.test_empty_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat.test_line_terminator1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat.test_line_terminator2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat.test_line_terminator3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat.test_none_terminator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat.test_numeric_terminator1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat.test_numeric_terminator2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat.test_push @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat.test_simple_producer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat.test_string_producer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchatMocked.test_blockingioerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asynchat.TestAsynchat_WithPoll.test_close_when_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_empty_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_line_terminator1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_line_terminator2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_line_terminator3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_none_terminator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_numeric_terminator1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_numeric_terminator2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_push @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_simple_producer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_string_producer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asynchat.TestHelperFunctions.test_find_prefix_at_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asynchat.TestNotConnected.test_disallow_negative_terminator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_asyncio.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_asyncio.txt index 0024679532..be43c5a205 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_asyncio.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_asyncio.txt @@ -1,1701 +1,1220 @@ -*test.test_asyncio.test_base_events.BaseEventLoopTests.test__add_callback_cancelled_handle -*test.test_asyncio.test_base_events.BaseEventLoopTests.test__add_callback_handle -*test.test_asyncio.test_base_events.BaseEventLoopTests.test__run_once -*test.test_asyncio.test_base_events.BaseEventLoopTests.test__run_once_cancelled_event_cleanup -*test.test_asyncio.test_base_events.BaseEventLoopTests.test__run_once_schedule_handle -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_call_later -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_call_later_negative_delays -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_call_soon -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_call_soon_non_callable -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_check_thread -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_close -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_create_named_task_with_custom_factory -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_create_named_task_with_default_factory -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_create_task -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_create_task_error_closes_coro -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_default_exc_handler_broken -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_default_exc_handler_callback -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_not_implemented -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_forever_keyboard_interrupt -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_forever_pre_stopped -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_once -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_until_complete_baseexception -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_until_complete_loop -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_until_complete_loop_orphan_future_close_loop -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_until_complete_type_error -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_debug -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_default_executor -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_default_executor_deprecation_warnings -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_default_executor_error -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_exc_handler_broken -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_exc_handler_custom -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_exc_handler_invalid -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_task_factory -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_task_factory_invalid -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_single_selecter_event_callback_after_stopping -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_subprocess_exec_invalid_args -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_subprocess_shell_invalid_args -*test.test_asyncio.test_base_events.BaseEventLoopTests.test_time_and_call_at -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_accept_connection_exception -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_accept_connection_retry -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_call_coroutine -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_bluetooth -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_connect_err -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_host_port_sock -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_ip_addr -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_multiple -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_multiple_errors -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_multiple_errors_local_addr -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_no_getaddrinfo -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_no_host_port_sock -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_no_inet_pton -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_no_local_addr -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_no_ssl_server_hostname_errors -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_service_name -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_ssl_server_hostname_default -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_ssl_server_hostname_errors -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_ssl_timeout_for_plain_socket -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_timeout -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_wrong_sock -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_addr_error -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_allow_broadcast -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_cant_bind -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_connect_err -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_existing_sock_unix -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_ip_addr -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_no_addrinfo -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_no_matching_family -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_noaddr_nofamily -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_nosoreuseport -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_reuse_address_error -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_reuse_address_warning -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_setblk_err -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_sock -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_sock_sockopts -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_sock_unix -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_socket_err -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_sockopts -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_wrong_sock -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_cant_bind -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_empty_host -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_host_port_sock -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_ipv6 -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_no_getaddrinfo -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_no_host_port_sock -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_nosoreuseport -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_soreuseport_only_defined -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_ssl_timeout_for_plain_socket -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_stream_bittype -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_wrong_sock -*test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_getnameinfo -*test.test_asyncio.test_base_events.BaseEventTests.test_ipaddr_info -*test.test_asyncio.test_base_events.BaseEventTests.test_ipaddr_info_no_inet_pton -*test.test_asyncio.test_base_events.BaseEventTests.test_port_parameter_types -*test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test__sock_sendfile_native_failure -*test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_blocking_socket -*test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_negative_count -*test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_negative_offset -*test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_nonbinary_file -*test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_nonstream_socket -*test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_notint_count -*test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_notint_offset -*test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_sock_sendfile_fallback -*test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_sock_sendfile_fallback_offset_and_count -*test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_sock_sendfile_no_fallback -*test.test_asyncio.test_base_events.RunningLoopTests.test_running_loop_within_a_loop -*test.test_asyncio.test_base_events.TestSelectorUtils.test_set_nodelay -*test.test_asyncio.test_buffered_proto.BufferedProtocolProactorTests.test_buffered_proto_create_connection -*test.test_asyncio.test_buffered_proto.BufferedProtocolSelectorTests.test_buffered_proto_create_connection -*test.test_asyncio.test_context.DecimalContextTest.test_asyncio_task_decimal_context -*test.test_asyncio.test_events.AbstractEventLoopTests.test_not_implemented -*test.test_asyncio.test_events.AbstractEventLoopTests.test_not_implemented_async -*test.test_asyncio.test_events.HandleTests.test_callback_with_exception -*test.test_asyncio.test_events.HandleTests.test_coroutine_like_object_debug_formatting -*test.test_asyncio.test_events.HandleTests.test_handle -*test.test_asyncio.test_events.HandleTests.test_handle_repr -*test.test_asyncio.test_events.HandleTests.test_handle_repr_debug -*test.test_asyncio.test_events.HandleTests.test_handle_source_traceback -*test.test_asyncio.test_events.HandleTests.test_handle_weakref -*test.test_asyncio.test_events.PolicyTests.test_event_loop_policy -*test.test_asyncio.test_events.PolicyTests.test_get_event_loop -*test.test_asyncio.test_events.PolicyTests.test_get_event_loop_after_set_none -*test.test_asyncio.test_events.PolicyTests.test_get_event_loop_calls_set_event_loop -*test.test_asyncio.test_events.PolicyTests.test_get_event_loop_policy -*test.test_asyncio.test_events.PolicyTests.test_get_event_loop_thread -*test.test_asyncio.test_events.PolicyTests.test_new_event_loop -*test.test_asyncio.test_events.PolicyTests.test_set_event_loop -*test.test_asyncio.test_events.PolicyTests.test_set_event_loop_policy -*test.test_asyncio.test_events.SelectEventLoopTests.test_add_fds_after_closing -*test.test_asyncio.test_events.SelectEventLoopTests.test_bidirectional_pty -*test.test_asyncio.test_events.SelectEventLoopTests.test_call_later -*test.test_asyncio.test_events.SelectEventLoopTests.test_call_soon -*test.test_asyncio.test_events.SelectEventLoopTests.test_call_soon_threadsafe -*test.test_asyncio.test_events.SelectEventLoopTests.test_call_soon_threadsafe_same_thread -*test.test_asyncio.test_events.SelectEventLoopTests.test_close -*test.test_asyncio.test_events.SelectEventLoopTests.test_close_running_event_loop -*test.test_asyncio.test_events.SelectEventLoopTests.test_connect_accepted_socket -*test.test_asyncio.test_events.SelectEventLoopTests.test_connect_accepted_socket_ssl_timeout_for_plain_socket -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_connection -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_connection_local_addr -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_connection_local_addr_in_use -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_connection_local_addr_nomatch_family -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_connection_local_addr_skip_different_family -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_datagram_endpoint -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_datagram_endpoint_ipv6 -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_datagram_endpoint_sock -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_server -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_server_addr_in_use -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_server_dual_stack -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_server_multiple_hosts_ipv4 -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_server_multiple_hosts_ipv6 -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_server_reuse_port -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_server_sock -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_server_ssl_verified -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_server_ssl_verify_failed -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_ssl_unix_connection -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_unix_connection -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_unix_server -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_unix_server_path_socket_error -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_unix_server_ssl -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_unix_server_ssl_verified -*test.test_asyncio.test_events.SelectEventLoopTests.test_create_unix_server_ssl_verify_failed -*test.test_asyncio.test_events.SelectEventLoopTests.test_internal_fds -*test.test_asyncio.test_events.SelectEventLoopTests.test_prompt_cancellation -*test.test_asyncio.test_events.SelectEventLoopTests.test_read_pipe -*test.test_asyncio.test_events.SelectEventLoopTests.test_read_pty_output -*test.test_asyncio.test_events.SelectEventLoopTests.test_reader_callback -*test.test_asyncio.test_events.SelectEventLoopTests.test_remove_fds_after_closing -*test.test_asyncio.test_events.SelectEventLoopTests.test_run_in_executor -*test.test_asyncio.test_events.SelectEventLoopTests.test_run_in_executor_cancel -*test.test_asyncio.test_events.SelectEventLoopTests.test_run_until_complete -*test.test_asyncio.test_events.SelectEventLoopTests.test_run_until_complete_stopped -*test.test_asyncio.test_events.SelectEventLoopTests.test_server_close -*test.test_asyncio.test_events.SelectEventLoopTests.test_ssl_connect_accepted_socket -*test.test_asyncio.test_events.TestAbstractServer.test_close -*test.test_asyncio.test_events.TestAbstractServer.test_get_loop -*test.test_asyncio.test_events.TestAbstractServer.test_wait_closed -*test.test_asyncio.test_events.TimerTests.test_hash -*test.test_asyncio.test_events.TimerTests.test_timer -*test.test_asyncio.test_events.TimerTests.test_timer_comparison -*test.test_asyncio.test_events.TimerTests.test_timer_repr -*test.test_asyncio.test_events.TimerTests.test_timer_repr_debug -*test.test_asyncio.test_events.TimerTests.test_when -*test.test_asyncio.test_futures.CFutureDoneCallbackTests.test_callbacks_invoked_on_set_exception -*test.test_asyncio.test_futures.CFutureDoneCallbackTests.test_callbacks_invoked_on_set_result -*test.test_asyncio.test_futures.CFutureDoneCallbackTests.test_callbacks_remove_first_and_second_callback -*test.test_asyncio.test_futures.CFutureDoneCallbackTests.test_callbacks_remove_first_callback -*test.test_asyncio.test_futures.CFutureDoneCallbackTests.test_callbacks_remove_third_callback -*test.test_asyncio.test_futures.CFutureDoneCallbackTests.test_remove_done_callback -*test.test_asyncio.test_futures.CFutureDoneCallbackTests.test_remove_done_callbacks_list_mutation -*test.test_asyncio.test_futures.CFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_1 -*test.test_asyncio.test_futures.CFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_2 -*test.test_asyncio.test_futures.CFutureInheritanceTests.test_inherit_without_calling_super_init -*test.test_asyncio.test_futures.CFutureTests.test_cancel -*test.test_asyncio.test_futures.CFutureTests.test_constructor_positional -*test.test_asyncio.test_futures.CFutureTests.test_constructor_use_global_loop -*test.test_asyncio.test_futures.CFutureTests.test_constructor_use_running_loop -*test.test_asyncio.test_futures.CFutureTests.test_constructor_without_loop -*test.test_asyncio.test_futures.CFutureTests.test_copy_state -*test.test_asyncio.test_futures.CFutureTests.test_exception -*test.test_asyncio.test_futures.CFutureTests.test_exception_class -*test.test_asyncio.test_futures.CFutureTests.test_future_cancel_message_getter -*test.test_asyncio.test_futures.CFutureTests.test_future_cancel_message_setter -*test.test_asyncio.test_futures.CFutureTests.test_future_del_collect -*test.test_asyncio.test_futures.CFutureTests.test_future_del_segfault -*test.test_asyncio.test_futures.CFutureTests.test_future_exception_never_retrieved -*test.test_asyncio.test_futures.CFutureTests.test_future_exception_never_retrieved_debug -*test.test_asyncio.test_futures.CFutureTests.test_future_iter_throw -*test.test_asyncio.test_futures.CFutureTests.test_future_repr -*test.test_asyncio.test_futures.CFutureTests.test_future_source_traceback -*test.test_asyncio.test_futures.CFutureTests.test_future_stop_iteration_args -*test.test_asyncio.test_futures.CFutureTests.test_generic_alias -*test.test_asyncio.test_futures.CFutureTests.test_initial_state -*test.test_asyncio.test_futures.CFutureTests.test_isfuture -*test.test_asyncio.test_futures.CFutureTests.test_iter -*test.test_asyncio.test_futures.CFutureTests.test_log_traceback -*test.test_asyncio.test_futures.CFutureTests.test_result -*test.test_asyncio.test_futures.CFutureTests.test_set_result_unless_cancelled -*test.test_asyncio.test_futures.CFutureTests.test_tb_logger_abandoned -*test.test_asyncio.test_futures.CFutureTests.test_tb_logger_exception_result_retrieved -*test.test_asyncio.test_futures.CFutureTests.test_tb_logger_exception_retrieved -*test.test_asyncio.test_futures.CFutureTests.test_tb_logger_exception_unretrieved -*test.test_asyncio.test_futures.CFutureTests.test_tb_logger_not_called_after_cancel -*test.test_asyncio.test_futures.CFutureTests.test_tb_logger_result_retrieved -*test.test_asyncio.test_futures.CFutureTests.test_tb_logger_result_unretrieved -*test.test_asyncio.test_futures.CFutureTests.test_uninitialized -*test.test_asyncio.test_futures.CFutureTests.test_wrap_future -*test.test_asyncio.test_futures.CFutureTests.test_wrap_future_cancel -*test.test_asyncio.test_futures.CFutureTests.test_wrap_future_cancel2 -*test.test_asyncio.test_futures.CFutureTests.test_wrap_future_future -*test.test_asyncio.test_futures.CFutureTests.test_wrap_future_use_global_loop -*test.test_asyncio.test_futures.CFutureTests.test_wrap_future_use_running_loop -*test.test_asyncio.test_futures.CFutureTests.test_wrap_future_without_loop -*test.test_asyncio.test_futures.CFutureTests.test_yield_from_twice -*test.test_asyncio.test_futures.CSubFutureDoneCallbackTests.test_callbacks_invoked_on_set_exception -*test.test_asyncio.test_futures.CSubFutureDoneCallbackTests.test_callbacks_invoked_on_set_result -*test.test_asyncio.test_futures.CSubFutureDoneCallbackTests.test_callbacks_remove_first_and_second_callback -*test.test_asyncio.test_futures.CSubFutureDoneCallbackTests.test_callbacks_remove_first_callback -*test.test_asyncio.test_futures.CSubFutureDoneCallbackTests.test_callbacks_remove_third_callback -*test.test_asyncio.test_futures.CSubFutureDoneCallbackTests.test_remove_done_callback -*test.test_asyncio.test_futures.CSubFutureDoneCallbackTests.test_remove_done_callbacks_list_mutation -*test.test_asyncio.test_futures.CSubFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_1 -*test.test_asyncio.test_futures.CSubFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_2 -*test.test_asyncio.test_futures.CSubFutureTests.test_cancel -*test.test_asyncio.test_futures.CSubFutureTests.test_constructor_positional -*test.test_asyncio.test_futures.CSubFutureTests.test_constructor_use_global_loop -*test.test_asyncio.test_futures.CSubFutureTests.test_constructor_use_running_loop -*test.test_asyncio.test_futures.CSubFutureTests.test_constructor_without_loop -*test.test_asyncio.test_futures.CSubFutureTests.test_copy_state -*test.test_asyncio.test_futures.CSubFutureTests.test_exception -*test.test_asyncio.test_futures.CSubFutureTests.test_exception_class -*test.test_asyncio.test_futures.CSubFutureTests.test_future_cancel_message_getter -*test.test_asyncio.test_futures.CSubFutureTests.test_future_cancel_message_setter -*test.test_asyncio.test_futures.CSubFutureTests.test_future_del_collect -*test.test_asyncio.test_futures.CSubFutureTests.test_future_exception_never_retrieved -*test.test_asyncio.test_futures.CSubFutureTests.test_future_exception_never_retrieved_debug -*test.test_asyncio.test_futures.CSubFutureTests.test_future_iter_throw -*test.test_asyncio.test_futures.CSubFutureTests.test_future_repr -*test.test_asyncio.test_futures.CSubFutureTests.test_future_source_traceback -*test.test_asyncio.test_futures.CSubFutureTests.test_future_stop_iteration_args -*test.test_asyncio.test_futures.CSubFutureTests.test_generic_alias -*test.test_asyncio.test_futures.CSubFutureTests.test_initial_state -*test.test_asyncio.test_futures.CSubFutureTests.test_isfuture -*test.test_asyncio.test_futures.CSubFutureTests.test_iter -*test.test_asyncio.test_futures.CSubFutureTests.test_log_traceback -*test.test_asyncio.test_futures.CSubFutureTests.test_result -*test.test_asyncio.test_futures.CSubFutureTests.test_set_result_unless_cancelled -*test.test_asyncio.test_futures.CSubFutureTests.test_tb_logger_abandoned -*test.test_asyncio.test_futures.CSubFutureTests.test_tb_logger_exception_result_retrieved -*test.test_asyncio.test_futures.CSubFutureTests.test_tb_logger_exception_retrieved -*test.test_asyncio.test_futures.CSubFutureTests.test_tb_logger_exception_unretrieved -*test.test_asyncio.test_futures.CSubFutureTests.test_tb_logger_not_called_after_cancel -*test.test_asyncio.test_futures.CSubFutureTests.test_tb_logger_result_retrieved -*test.test_asyncio.test_futures.CSubFutureTests.test_tb_logger_result_unretrieved -*test.test_asyncio.test_futures.CSubFutureTests.test_uninitialized -*test.test_asyncio.test_futures.CSubFutureTests.test_wrap_future -*test.test_asyncio.test_futures.CSubFutureTests.test_wrap_future_cancel -*test.test_asyncio.test_futures.CSubFutureTests.test_wrap_future_cancel2 -*test.test_asyncio.test_futures.CSubFutureTests.test_wrap_future_future -*test.test_asyncio.test_futures.CSubFutureTests.test_wrap_future_use_global_loop -*test.test_asyncio.test_futures.CSubFutureTests.test_wrap_future_use_running_loop -*test.test_asyncio.test_futures.CSubFutureTests.test_wrap_future_without_loop -*test.test_asyncio.test_futures.CSubFutureTests.test_yield_from_twice -*test.test_asyncio.test_futures.DuckTests.test_ensure_future -*test.test_asyncio.test_futures.DuckTests.test_wrap_future -*test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_callbacks_invoked_on_set_exception -*test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_callbacks_invoked_on_set_result -*test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_callbacks_remove_first_and_second_callback -*test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_callbacks_remove_first_callback -*test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_callbacks_remove_third_callback -*test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_remove_done_callback -*test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_remove_done_callbacks_list_mutation -*test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_1 -*test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_2 -*test.test_asyncio.test_futures.PyFutureInheritanceTests.test_inherit_without_calling_super_init -*test.test_asyncio.test_futures.PyFutureTests.test_cancel -*test.test_asyncio.test_futures.PyFutureTests.test_constructor_positional -*test.test_asyncio.test_futures.PyFutureTests.test_copy_state -*test.test_asyncio.test_futures.PyFutureTests.test_exception -*test.test_asyncio.test_futures.PyFutureTests.test_exception_class -*test.test_asyncio.test_futures.PyFutureTests.test_future_cancel_message_getter -*test.test_asyncio.test_futures.PyFutureTests.test_future_cancel_message_setter -*test.test_asyncio.test_futures.PyFutureTests.test_future_del_collect -*test.test_asyncio.test_futures.PyFutureTests.test_future_iter_throw -*test.test_asyncio.test_futures.PyFutureTests.test_future_repr -*test.test_asyncio.test_futures.PyFutureTests.test_future_source_traceback -*test.test_asyncio.test_futures.PyFutureTests.test_future_stop_iteration_args -*test.test_asyncio.test_futures.PyFutureTests.test_generic_alias -*test.test_asyncio.test_futures.PyFutureTests.test_initial_state -*test.test_asyncio.test_futures.PyFutureTests.test_isfuture -*test.test_asyncio.test_futures.PyFutureTests.test_iter -*test.test_asyncio.test_futures.PyFutureTests.test_log_traceback -*test.test_asyncio.test_futures.PyFutureTests.test_result -*test.test_asyncio.test_futures.PyFutureTests.test_set_result_unless_cancelled -*test.test_asyncio.test_futures.PyFutureTests.test_tb_logger_abandoned -*test.test_asyncio.test_futures.PyFutureTests.test_tb_logger_exception_result_retrieved -*test.test_asyncio.test_futures.PyFutureTests.test_tb_logger_exception_retrieved -*test.test_asyncio.test_futures.PyFutureTests.test_tb_logger_not_called_after_cancel -*test.test_asyncio.test_futures.PyFutureTests.test_tb_logger_result_retrieved -*test.test_asyncio.test_futures.PyFutureTests.test_tb_logger_result_unretrieved -*test.test_asyncio.test_futures.PyFutureTests.test_uninitialized -*test.test_asyncio.test_futures.PyFutureTests.test_wrap_future -*test.test_asyncio.test_futures.PyFutureTests.test_wrap_future_cancel -*test.test_asyncio.test_futures.PyFutureTests.test_wrap_future_cancel2 -*test.test_asyncio.test_futures.PyFutureTests.test_wrap_future_future -*test.test_asyncio.test_futures.PyFutureTests.test_yield_from_twice -*test.test_asyncio.test_futures2.FutureReprTests.test_recursive_repr_for_pending_tasks -*test.test_asyncio.test_locks.ConditionTests.test_ambiguous_loops -*test.test_asyncio.test_locks.ConditionTests.test_context_manager -*test.test_asyncio.test_locks.ConditionTests.test_explicit_lock -*test.test_asyncio.test_locks.ConditionTests.test_notify -*test.test_asyncio.test_locks.ConditionTests.test_notify_all -*test.test_asyncio.test_locks.ConditionTests.test_notify_all_unacquired -*test.test_asyncio.test_locks.ConditionTests.test_notify_unacquired -*test.test_asyncio.test_locks.ConditionTests.test_repr -*test.test_asyncio.test_locks.ConditionTests.test_timeout_in_block -*test.test_asyncio.test_locks.ConditionTests.test_wait -*test.test_asyncio.test_locks.ConditionTests.test_wait_cancel -*test.test_asyncio.test_locks.ConditionTests.test_wait_cancel_after_notify -*test.test_asyncio.test_locks.ConditionTests.test_wait_cancel_contested -*test.test_asyncio.test_locks.ConditionTests.test_wait_for -*test.test_asyncio.test_locks.ConditionTests.test_wait_for_unacquired -*test.test_asyncio.test_locks.ConditionTests.test_wait_unacquired -*test.test_asyncio.test_locks.EventTests.test_clear -*test.test_asyncio.test_locks.EventTests.test_clear_with_waiters -*test.test_asyncio.test_locks.EventTests.test_repr -*test.test_asyncio.test_locks.EventTests.test_wait -*test.test_asyncio.test_locks.EventTests.test_wait_cancel -*test.test_asyncio.test_locks.EventTests.test_wait_on_set -*test.test_asyncio.test_locks.LockTests.test_acquire -*test.test_asyncio.test_locks.LockTests.test_acquire_cancel -*test.test_asyncio.test_locks.LockTests.test_cancel_race -*test.test_asyncio.test_locks.LockTests.test_cancel_release_race -*test.test_asyncio.test_locks.LockTests.test_context_manager -*test.test_asyncio.test_locks.LockTests.test_finished_waiter_cancelled -*test.test_asyncio.test_locks.LockTests.test_lock -*test.test_asyncio.test_locks.LockTests.test_lock_by_with_statement -*test.test_asyncio.test_locks.LockTests.test_lock_doesnt_accept_loop_parameter -*test.test_asyncio.test_locks.LockTests.test_release_no_waiters -*test.test_asyncio.test_locks.LockTests.test_release_not_acquired -*test.test_asyncio.test_locks.LockTests.test_repr -*test.test_asyncio.test_locks.SemaphoreTests.test_acquire -*test.test_asyncio.test_locks.SemaphoreTests.test_acquire_cancel -*test.test_asyncio.test_locks.SemaphoreTests.test_acquire_cancel_before_awoken -*test.test_asyncio.test_locks.SemaphoreTests.test_acquire_fifo_order -*test.test_asyncio.test_locks.SemaphoreTests.test_acquire_hang -*test.test_asyncio.test_locks.SemaphoreTests.test_initial_value_zero -*test.test_asyncio.test_locks.SemaphoreTests.test_release_no_waiters -*test.test_asyncio.test_locks.SemaphoreTests.test_release_not_acquired -*test.test_asyncio.test_locks.SemaphoreTests.test_repr -*test.test_asyncio.test_locks.SemaphoreTests.test_semaphore -*test.test_asyncio.test_locks.SemaphoreTests.test_semaphore_value -*test.test_asyncio.test_pep492.CoroutineTests.test_async_def_coroutines -*test.test_asyncio.test_pep492.CoroutineTests.test_double_await -*test.test_asyncio.test_pep492.CoroutineTests.test_function_returning_awaitable -*test.test_asyncio.test_pep492.CoroutineTests.test_iscoroutine -*test.test_asyncio.test_pep492.CoroutineTests.test_iscoroutinefunction -*test.test_asyncio.test_pep492.LockTests.test_context_manager_async_with -*test.test_asyncio.test_pep492.LockTests.test_context_manager_with_await -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_close -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_close_self_pipe -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_create_server -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_create_server_cancel -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_ctor -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_datagram_loop_reading -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_datagram_loop_reading_aborted -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_datagram_loop_reading_data -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_datagram_loop_reading_no_data -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_datagram_loop_writing -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_datagram_loop_writing_aborted -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_loop_self_reading -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_loop_self_reading_exception -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_loop_self_reading_fut -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_make_datagram_transport -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_make_socket_transport -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_process_events -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_stop_serving -*test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_write_to_self -*test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test__loop_writing_closing -*test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test__loop_writing_error_received -*test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test__loop_writing_error_received_connection -*test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test__loop_writing_exception -*test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_fatal_error_connected -*test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto -*test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_buffer -*test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_buffer_bytearray -*test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_buffer_memoryview -*test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_bytearray -*test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_closing -*test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_connected_addr -*test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_error_received -*test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_error_received_connected -*test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_exception -*test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_memoryview -*test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_no_data -*test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_str -*test.test_asyncio.test_proactor_events.ProactorEventLoopUnixSockSendfileTests.test_sock_sendfile_iobuffer -*test.test_asyncio.test_proactor_events.ProactorEventLoopUnixSockSendfileTests.test_sock_sendfile_not_a_file -*test.test_asyncio.test_proactor_events.ProactorEventLoopUnixSockSendfileTests.test_sock_sendfile_not_regular_file -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_abort -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_call_connection_lost -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_close -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_close_buffer -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_close_invalid_sockobj -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_close_write_fut -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_ctor -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_dont_pause_writing -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_fatal_error -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_fatal_error_2 -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_force_close -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_force_close_idempotent -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_aborted -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_aborted_closing -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_aborted_is_fatal -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_conn_reset_lost -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_data -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_exception -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_no_data -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_writing -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_writing_closing -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_writing_err -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_writing_force_close -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_writing_stop -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_pause_resume_reading -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_pause_resume_writing -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_pause_writing_2write -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_pause_writing_3write -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_eof -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_eof_buffer -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_eof_buffer_write_pipe -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_eof_duplex_pipe -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_eof_write_pipe -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_more -*test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_no_data -*test.test_asyncio.test_protocols.ProtocolsAbsTests.test_base_protocol -*test.test_asyncio.test_protocols.ProtocolsAbsTests.test_buffered_protocol -*test.test_asyncio.test_protocols.ProtocolsAbsTests.test_datagram_protocol -*test.test_asyncio.test_protocols.ProtocolsAbsTests.test_protocol -*test.test_asyncio.test_protocols.ProtocolsAbsTests.test_subprocess_protocol -*test.test_asyncio.test_queues.LifoQueueJoinTests.test_format -*test.test_asyncio.test_queues.LifoQueueJoinTests.test_join_empty_queue -*test.test_asyncio.test_queues.LifoQueueJoinTests.test_task_done -*test.test_asyncio.test_queues.LifoQueueJoinTests.test_task_done_underflow -*test.test_asyncio.test_queues.LifoQueueTests.test_order -*test.test_asyncio.test_queues.PriorityQueueJoinTests.test_format -*test.test_asyncio.test_queues.PriorityQueueJoinTests.test_join_empty_queue -*test.test_asyncio.test_queues.PriorityQueueJoinTests.test_task_done -*test.test_asyncio.test_queues.PriorityQueueJoinTests.test_task_done_underflow -*test.test_asyncio.test_queues.PriorityQueueTests.test_order -*test.test_asyncio.test_queues.QueueBasicTests.test_empty -*test.test_asyncio.test_queues.QueueBasicTests.test_full -*test.test_asyncio.test_queues.QueueBasicTests.test_generic_alias -*test.test_asyncio.test_queues.QueueBasicTests.test_maxsize -*test.test_asyncio.test_queues.QueueBasicTests.test_order -*test.test_asyncio.test_queues.QueueBasicTests.test_repr -*test.test_asyncio.test_queues.QueueBasicTests.test_str -*test.test_asyncio.test_queues.QueueGetTests.test_blocking_get -*test.test_asyncio.test_queues.QueueGetTests.test_blocking_get_wait -*test.test_asyncio.test_queues.QueueGetTests.test_cancelled_getters_not_being_held_in_self_getters -*test.test_asyncio.test_queues.QueueGetTests.test_get_cancelled -*test.test_asyncio.test_queues.QueueGetTests.test_get_cancelled_race -*test.test_asyncio.test_queues.QueueGetTests.test_get_with_putters -*test.test_asyncio.test_queues.QueueGetTests.test_get_with_waiting_putters -*test.test_asyncio.test_queues.QueueGetTests.test_nonblocking_get -*test.test_asyncio.test_queues.QueueGetTests.test_nonblocking_get_exception -*test.test_asyncio.test_queues.QueueJoinTests.test_format -*test.test_asyncio.test_queues.QueueJoinTests.test_join_empty_queue -*test.test_asyncio.test_queues.QueueJoinTests.test_task_done -*test.test_asyncio.test_queues.QueueJoinTests.test_task_done_underflow -*test.test_asyncio.test_queues.QueuePutTests.test_blocking_put -*test.test_asyncio.test_queues.QueuePutTests.test_blocking_put_wait -*test.test_asyncio.test_queues.QueuePutTests.test_cancelled_put_silence_value_error_exception -*test.test_asyncio.test_queues.QueuePutTests.test_cancelled_puts_not_being_held_in_self_putters -*test.test_asyncio.test_queues.QueuePutTests.test_float_maxsize -*test.test_asyncio.test_queues.QueuePutTests.test_get_cancel_drop_many_pending_readers -*test.test_asyncio.test_queues.QueuePutTests.test_get_cancel_drop_one_pending_reader -*test.test_asyncio.test_queues.QueuePutTests.test_nonblocking_put -*test.test_asyncio.test_queues.QueuePutTests.test_nonblocking_put_exception -*test.test_asyncio.test_queues.QueuePutTests.test_put_cancel_drop -*test.test_asyncio.test_queues.QueuePutTests.test_put_cancelled -*test.test_asyncio.test_queues.QueuePutTests.test_put_cancelled_race -*test.test_asyncio.test_queues.QueuePutTests.test_put_with_waiting_getters -*test.test_asyncio.test_runners.RunTests.test_asyncio_run_cancels_hanging_tasks -*test.test_asyncio.test_runners.RunTests.test_asyncio_run_debug -*test.test_asyncio.test_runners.RunTests.test_asyncio_run_from_running_loop -*test.test_asyncio.test_runners.RunTests.test_asyncio_run_only_coro -*test.test_asyncio.test_runners.RunTests.test_asyncio_run_raises -*test.test_asyncio.test_runners.RunTests.test_asyncio_run_reports_hanging_tasks_errors -*test.test_asyncio.test_runners.RunTests.test_asyncio_run_return -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_accept_connection_multiple -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_add_reader -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_add_reader_existing -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_add_reader_existing_writer -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_add_writer -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_add_writer_existing -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_close -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_close_no_selector -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_make_socket_transport -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_make_ssl_transport -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_make_ssl_transport_without_ssl_error -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_process_events_read -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_process_events_read_cancelled -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_process_events_write -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_process_events_write_cancelled -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_read_from_self_exception -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_read_from_self_tryagain -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_remove_reader -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_remove_reader_read_write -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_remove_reader_unknown -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_remove_writer -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_remove_writer_read_write -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_remove_writer_unknown -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_write_to_self_exception -*test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_write_to_self_tryagain -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_fatal_error_connected -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_fatal_error_connected_custom_error -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_read_ready -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_read_ready_err -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_read_ready_oserr -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_read_ready_tryagain -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_buffer -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_buffer_bytearray -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_buffer_memoryview -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_bytearray -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_closing -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_connected_addr -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_error_received -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_error_received_connected -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_exception -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_memoryview -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_no_data -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready_closing -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready_error_received -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready_error_received_connection -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready_exception -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready_no_data -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready_tryagain -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_str -*test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_tryagain -*test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_buffer_updated_error -*test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_ctor -*test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_get_buffer_error -*test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_get_buffer_zerosized -*test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_proto_type_switch -*test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_eof_received_error -*test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready -*test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready_conn_reset -*test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready_eof -*test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready_eof_keep_open -*test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready_err -*test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready_tryagain -*test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready_tryagain_interrupted -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_ctor -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_ctor_with_waiter -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_data_received_error -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_pause_resume_reading -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_eof_received_error -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready_conn_reset -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready_eof -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready_eof_keep_open -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready_err -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready_tryagain -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready_tryagain_interrupted -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_transport_close_remove_writer -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_buffer -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_bytearray -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_closing -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_eof -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_eof_after_close -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_eof_buffer -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_exception -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_memoryview -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_no_data -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_partial -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_partial_bytearray -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_partial_memoryview -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_partial_none -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready_closing -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready_exception -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready_no_data -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready_partial -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready_partial_none -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready_tryagain -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_str -*test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_tryagain -*test.test_asyncio.test_selector_events.SelectorTransportTests.test__add_reader -*test.test_asyncio.test_selector_events.SelectorTransportTests.test_abort -*test.test_asyncio.test_selector_events.SelectorTransportTests.test_close -*test.test_asyncio.test_selector_events.SelectorTransportTests.test_close_write_buffer -*test.test_asyncio.test_selector_events.SelectorTransportTests.test_connection_lost -*test.test_asyncio.test_selector_events.SelectorTransportTests.test_ctor -*test.test_asyncio.test_selector_events.SelectorTransportTests.test_fatal_error -*test.test_asyncio.test_selector_events.SelectorTransportTests.test_fatal_error_custom_exception -*test.test_asyncio.test_selector_events.SelectorTransportTests.test_force_close -*test.test_asyncio.test_server.ProactorStartServerTests.test_start_server_1 -*test.test_asyncio.test_server.SelectorStartServerTests.test_start_unix_server_1 -*test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_cancel_sock_accept -*test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_create_connection_sock -*test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_huge_content -*test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_huge_content_recvinto -*test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_sock_accept -*test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_sock_client_connect_racing -*test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_sock_client_fail -*test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_sock_client_ops -*test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_sock_client_racing -*test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_unix_sock_client_ops -*test.test_asyncio.test_streams.StreamTests.test_IncompleteReadError_pickleable -*test.test_asyncio.test_streams.StreamTests.test_LimitOverrunError_pickleable -*test.test_asyncio.test_streams.StreamTests.test___repr__ -*test.test_asyncio.test_streams.StreamTests.test___repr__data -*test.test_asyncio.test_streams.StreamTests.test___repr__eof -*test.test_asyncio.test_streams.StreamTests.test___repr__exception -*test.test_asyncio.test_streams.StreamTests.test___repr__nondefault_limit -*test.test_asyncio.test_streams.StreamTests.test___repr__transport -*test.test_asyncio.test_streams.StreamTests.test___repr__waiter -*test.test_asyncio.test_streams.StreamTests.test_async_writer_api -*test.test_asyncio.test_streams.StreamTests.test_async_writer_api_exception_after_close -*test.test_asyncio.test_streams.StreamTests.test_at_eof -*test.test_asyncio.test_streams.StreamTests.test_drain_raises -*test.test_asyncio.test_streams.StreamTests.test_eof_feed_when_closing_writer -*test.test_asyncio.test_streams.StreamTests.test_exception -*test.test_asyncio.test_streams.StreamTests.test_exception_cancel -*test.test_asyncio.test_streams.StreamTests.test_exception_waiter -*test.test_asyncio.test_streams.StreamTests.test_feed_empty_data -*test.test_asyncio.test_streams.StreamTests.test_feed_nonempty_data -*test.test_asyncio.test_streams.StreamTests.test_invalid_limit -*test.test_asyncio.test_streams.StreamTests.test_open_connection -*test.test_asyncio.test_streams.StreamTests.test_open_connection_error -*test.test_asyncio.test_streams.StreamTests.test_open_connection_no_loop_ssl -*test.test_asyncio.test_streams.StreamTests.test_open_unix_connection -*test.test_asyncio.test_streams.StreamTests.test_open_unix_connection_error -*test.test_asyncio.test_streams.StreamTests.test_open_unix_connection_no_loop_ssl -*test.test_asyncio.test_streams.StreamTests.test_read -*test.test_asyncio.test_streams.StreamTests.test_read_eof -*test.test_asyncio.test_streams.StreamTests.test_read_exception -*test.test_asyncio.test_streams.StreamTests.test_read_limit -*test.test_asyncio.test_streams.StreamTests.test_read_line_breaks -*test.test_asyncio.test_streams.StreamTests.test_read_until_eof -*test.test_asyncio.test_streams.StreamTests.test_read_zero -*test.test_asyncio.test_streams.StreamTests.test_readexactly -*test.test_asyncio.test_streams.StreamTests.test_readexactly_eof -*test.test_asyncio.test_streams.StreamTests.test_readexactly_exception -*test.test_asyncio.test_streams.StreamTests.test_readexactly_limit -*test.test_asyncio.test_streams.StreamTests.test_readexactly_zero_or_less -*test.test_asyncio.test_streams.StreamTests.test_readline -*test.test_asyncio.test_streams.StreamTests.test_readline_empty_eof -*test.test_asyncio.test_streams.StreamTests.test_readline_eof -*test.test_asyncio.test_streams.StreamTests.test_readline_exception -*test.test_asyncio.test_streams.StreamTests.test_readline_limit -*test.test_asyncio.test_streams.StreamTests.test_readline_limit_with_existing_data -*test.test_asyncio.test_streams.StreamTests.test_readline_nolimit_nowait -*test.test_asyncio.test_streams.StreamTests.test_readline_read_byte_count -*test.test_asyncio.test_streams.StreamTests.test_readuntil_eof -*test.test_asyncio.test_streams.StreamTests.test_readuntil_limit_found_sep -*test.test_asyncio.test_streams.StreamTests.test_readuntil_multi_chunks -*test.test_asyncio.test_streams.StreamTests.test_readuntil_multi_chunks_1 -*test.test_asyncio.test_streams.StreamTests.test_readuntil_separator -*test.test_asyncio.test_streams.StreamTests.test_start_unix_server -*test.test_asyncio.test_streams.StreamTests.test_wait_closed_on_close -*test.test_asyncio.test_streams.StreamTests.test_wait_closed_on_close_with_unread_data -*test.test_asyncio.test_tasks.CCurrentLoopTests.test_current_task_no_running_loop -*test.test_asyncio.test_tasks.CCurrentLoopTests.test_current_task_no_running_loop_implicit -*test.test_asyncio.test_tasks.CCurrentLoopTests.test_current_task_with_implicit_loop -*test.test_asyncio.test_tasks.CIntrospectionTests.test__enter_task -*test.test_asyncio.test_tasks.CIntrospectionTests.test__enter_task_failure -*test.test_asyncio.test_tasks.CIntrospectionTests.test__leave_task -*test.test_asyncio.test_tasks.CIntrospectionTests.test__leave_task_failure1 -*test.test_asyncio.test_tasks.CIntrospectionTests.test__leave_task_failure2 -*test.test_asyncio.test_tasks.CIntrospectionTests.test__register_task_1 -*test.test_asyncio.test_tasks.CIntrospectionTests.test__register_task_2 -*test.test_asyncio.test_tasks.CIntrospectionTests.test__register_task_3 -*test.test_asyncio.test_tasks.CIntrospectionTests.test__unregister_task -*test.test_asyncio.test_tasks.CIntrospectionTests.test__unregister_task_not_registered -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_as_completed -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_as_completed_concurrent -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_as_completed_coroutine_use_global_loop -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_as_completed_coroutine_use_running_loop -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_as_completed_coroutine_without_loop -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_as_completed_duplicate_coroutines -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_as_completed_invalid_args -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_as_completed_reverse_wait -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_as_completed_with_timeout -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_as_completed_with_unused_timeout -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_bare_create_named_task -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_bare_create_task -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_baseexception_during_cancel -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_cancel -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_cancel_at_end -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_cancel_awaited_task -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_cancel_both_task_and_inner_future -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_cancel_current_task -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_cancel_gather_1 -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_cancel_gather_2 -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_cancel_inner_future -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_cancel_task_catching -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_cancel_task_ignoring -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_cancel_traceback_for_future_exception -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_cancel_traceback_for_future_result -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_cancel_with_message_before_starting_task -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_cancel_with_message_then_future_exception -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_cancel_with_message_then_future_result -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_cancel_yield -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_context_1 -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_context_2 -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_context_3 -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_coroutine_never_yielded -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_coroutine_non_gen_function -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_coroutine_non_gen_function_return_future -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_corowrapper_mocks_generator -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_corowrapper_throw -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_corowrapper_weakref -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_create_task_with_async_function -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_create_task_with_asynclike_function -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_create_task_with_noncoroutine -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_create_task_with_oldstyle_coroutine -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_current_task -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_current_task_with_interleaving_tasks -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_ensure_future_awaitable -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_ensure_future_coroutine -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_ensure_future_coroutine_2 -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_ensure_future_error_msg -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_ensure_future_future -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_ensure_future_neither -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_ensure_future_task -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_error_in_call_soon -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_exception_chaining_after_await -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_exception_chaining_after_await_with_context_cycle -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_exception_traceback -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_gather_shield -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_generic_alias -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_get_coro -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_get_stack -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_iscoroutinefunction -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_log_destroyed_pending_task -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_log_traceback -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_other_loop_future -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_return_coroutine_from_coroutine -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_shield_cancel_inner -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_shield_cancel_outer -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_shield_coroutine_use_global_loop -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_shield_coroutine_use_running_loop -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_shield_coroutine_without_loop -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_shield_effect -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_shield_exception -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_shield_gather -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_shield_result -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_shield_shortcut -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_sleep -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_sleep_cancel -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_step_result -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_step_result_future -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_stop_while_run_in_complete -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_task_awaits_on_itself -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_task_basics -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_task_cancel_message_getter -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_task_cancel_message_setter -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_task_cancel_sleeping_task -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_task_cancel_waiter_future -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_task_class -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_task_del_collect -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_task_repr -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_task_repr_autogenerated -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_task_repr_coro_decorator -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_task_repr_name_not_str -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_task_repr_partial_corowrapper -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_task_repr_wait_for -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_task_set_methods -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_task_source_traceback -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_tb_logger_not_called_after_cancel -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_wait -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_wait_concurrent_complete -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_wait_duplicate_coroutines -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_wait_errors -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_wait_first_completed -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_wait_first_exception -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_wait_first_exception_in_wait -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_wait_invalid_args -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_wait_really_done -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_wait_with_exception -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_wait_with_iterator_of_tasks -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_wait_with_timeout -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_yield_from_corowrapper -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_yield_from_corowrapper_send -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_yield_future_passes_cancel -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_yield_vs_yield_from -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_yield_vs_yield_from_generator -*test.test_asyncio.test_tasks.CTaskSubclass_PyFuture_Tests.test_yield_wait_does_not_shield_cancel -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_as_completed -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_as_completed_concurrent -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_as_completed_coroutine_use_global_loop -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_as_completed_coroutine_use_running_loop -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_as_completed_coroutine_without_loop -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_as_completed_duplicate_coroutines -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_as_completed_invalid_args -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_as_completed_reverse_wait -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_as_completed_with_timeout -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_as_completed_with_unused_timeout -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_bare_create_named_task -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_bare_create_task -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_baseexception_during_cancel -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_cancel -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_cancel_at_end -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_cancel_awaited_task -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_cancel_both_task_and_inner_future -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_cancel_current_task -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_cancel_gather_1 -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_cancel_gather_2 -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_cancel_inner_future -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_cancel_task_catching -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_cancel_task_ignoring -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_cancel_traceback_for_future_exception -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_cancel_traceback_for_future_result -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_cancel_with_message_before_starting_task -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_cancel_with_message_then_future_exception -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_cancel_with_message_then_future_result -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_cancel_yield -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_context_1 -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_context_2 -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_context_3 -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_coroutine_never_yielded -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_coroutine_non_gen_function -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_coroutine_non_gen_function_return_future -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_corowrapper_mocks_generator -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_corowrapper_throw -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_corowrapper_weakref -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_create_task_with_async_function -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_create_task_with_asynclike_function -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_create_task_with_noncoroutine -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_create_task_with_oldstyle_coroutine -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_current_task -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_current_task_with_interleaving_tasks -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_ensure_future_awaitable -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_ensure_future_coroutine -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_ensure_future_coroutine_2 -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_ensure_future_error_msg -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_ensure_future_future -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_ensure_future_neither -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_ensure_future_task -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_error_in_call_soon -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_exception_chaining_after_await -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_exception_chaining_after_await_with_context_cycle -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_exception_traceback -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_gather_shield -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_generic_alias -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_get_coro -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_get_stack -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_iscoroutinefunction -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_log_destroyed_pending_task -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_log_traceback -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_other_loop_future -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_return_coroutine_from_coroutine -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_shield_cancel_inner -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_shield_cancel_outer -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_shield_coroutine_use_global_loop -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_shield_coroutine_use_running_loop -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_shield_coroutine_without_loop -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_shield_effect -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_shield_exception -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_shield_gather -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_shield_result -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_shield_shortcut -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_sleep -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_sleep_cancel -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_step_result -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_step_result_future -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_stop_while_run_in_complete -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_task_awaits_on_itself -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_task_basics -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_task_cancel_message_getter -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_task_cancel_message_setter -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_task_cancel_sleeping_task -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_task_cancel_waiter_future -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_task_class -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_task_del_collect -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_task_repr -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_task_repr_autogenerated -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_task_repr_coro_decorator -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_task_repr_name_not_str -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_task_repr_partial_corowrapper -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_task_repr_wait_for -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_task_set_methods -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_task_source_traceback -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_tb_logger_not_called_after_cancel -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_wait -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_wait_concurrent_complete -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_wait_duplicate_coroutines -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_wait_errors -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_wait_first_completed -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_wait_first_exception -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_wait_first_exception_in_wait -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_wait_invalid_args -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_wait_really_done -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_wait_with_exception -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_wait_with_iterator_of_tasks -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_wait_with_timeout -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_yield_from_corowrapper -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_yield_from_corowrapper_send -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_yield_future_passes_cancel -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_yield_vs_yield_from -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_yield_vs_yield_from_generator -*test.test_asyncio.test_tasks.CTask_CFuture_SubclassTests.test_yield_wait_does_not_shield_cancel -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_as_completed -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_as_completed_concurrent -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_as_completed_coroutine_use_global_loop -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_as_completed_coroutine_use_running_loop -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_as_completed_coroutine_without_loop -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_as_completed_duplicate_coroutines -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_as_completed_invalid_args -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_as_completed_reverse_wait -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_as_completed_with_timeout -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_as_completed_with_unused_timeout -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_bare_create_named_task -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_bare_create_task -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_baseexception_during_cancel -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_cancel -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_cancel_at_end -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_cancel_awaited_task -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_cancel_both_task_and_inner_future -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_cancel_current_task -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_cancel_gather_1 -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_cancel_gather_2 -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_cancel_inner_future -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_cancel_task_catching -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_cancel_task_ignoring -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_cancel_traceback_for_future_exception -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_cancel_traceback_for_future_result -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_cancel_with_message_before_starting_task -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_cancel_with_message_then_future_exception -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_cancel_with_message_then_future_result -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_cancel_yield -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_context_1 -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_context_2 -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_context_3 -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_coroutine_never_yielded -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_coroutine_non_gen_function -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_coroutine_non_gen_function_return_future -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_corowrapper_mocks_generator -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_corowrapper_throw -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_corowrapper_weakref -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_create_task_with_async_function -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_create_task_with_asynclike_function -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_create_task_with_noncoroutine -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_create_task_with_oldstyle_coroutine -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_current_task -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_current_task_with_interleaving_tasks -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_del__log_destroy_pending_segfault -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_ensure_future_awaitable -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_ensure_future_coroutine -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_ensure_future_coroutine_2 -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_ensure_future_error_msg -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_ensure_future_future -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_ensure_future_neither -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_ensure_future_task -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_error_in_call_soon -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_exception_chaining_after_await -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_exception_chaining_after_await_with_context_cycle -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_exception_traceback -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_gather_shield -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_generic_alias -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_get_coro -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_get_stack -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_iscoroutinefunction -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_log_destroyed_pending_task -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_log_traceback -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_other_loop_future -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_refleaks_in_task___init__ -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_return_coroutine_from_coroutine -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_set_exception_causes_invalid_state -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_set_result_causes_invalid_state -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_shield_cancel_inner -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_shield_cancel_outer -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_shield_coroutine_use_global_loop -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_shield_coroutine_use_running_loop -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_shield_coroutine_without_loop -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_shield_effect -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_shield_exception -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_shield_gather -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_shield_result -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_shield_shortcut -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_sleep -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_sleep_cancel -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_step_result -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_step_result_future -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_stop_while_run_in_complete -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_task_awaits_on_itself -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_task_basics -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_task_cancel_message_getter -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_task_cancel_message_setter -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_task_cancel_sleeping_task -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_task_cancel_waiter_future -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_task_class -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_task_del_collect -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_task_repr -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_task_repr_autogenerated -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_task_repr_coro_decorator -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_task_repr_name_not_str -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_task_repr_partial_corowrapper -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_task_repr_wait_for -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_task_set_methods -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_task_source_traceback -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_tb_logger_not_called_after_cancel -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_wait -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_wait_concurrent_complete -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_wait_duplicate_coroutines -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_wait_errors -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_wait_first_completed -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_wait_first_exception -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_wait_first_exception_in_wait -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_wait_invalid_args -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_wait_really_done -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_wait_with_exception -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_wait_with_iterator_of_tasks -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_wait_with_timeout -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_yield_from_corowrapper -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_yield_from_corowrapper_send -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_yield_future_passes_cancel -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_yield_vs_yield_from -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_yield_vs_yield_from_generator -*test.test_asyncio.test_tasks.CTask_CFuture_Tests.test_yield_wait_does_not_shield_cancel -*test.test_asyncio.test_tasks.CTask_Future_Tests.test_foobar -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_as_completed -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_as_completed_concurrent -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_as_completed_coroutine_use_global_loop -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_as_completed_coroutine_use_running_loop -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_as_completed_coroutine_without_loop -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_as_completed_duplicate_coroutines -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_as_completed_invalid_args -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_as_completed_reverse_wait -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_as_completed_with_timeout -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_as_completed_with_unused_timeout -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_bare_create_named_task -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_bare_create_task -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_baseexception_during_cancel -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_cancel -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_cancel_at_end -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_cancel_awaited_task -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_cancel_both_task_and_inner_future -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_cancel_current_task -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_cancel_gather_1 -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_cancel_gather_2 -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_cancel_inner_future -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_cancel_task_catching -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_cancel_task_ignoring -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_cancel_traceback_for_future_exception -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_cancel_traceback_for_future_result -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_cancel_with_message_before_starting_task -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_cancel_with_message_then_future_exception -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_cancel_with_message_then_future_result -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_cancel_yield -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_context_1 -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_context_2 -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_context_3 -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_coroutine_never_yielded -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_coroutine_non_gen_function -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_coroutine_non_gen_function_return_future -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_corowrapper_mocks_generator -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_corowrapper_throw -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_corowrapper_weakref -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_create_task_with_async_function -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_create_task_with_asynclike_function -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_create_task_with_noncoroutine -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_create_task_with_oldstyle_coroutine -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_current_task -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_current_task_with_interleaving_tasks -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_ensure_future_awaitable -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_ensure_future_coroutine -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_ensure_future_coroutine_2 -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_ensure_future_error_msg -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_ensure_future_future -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_ensure_future_neither -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_ensure_future_task -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_error_in_call_soon -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_exception_chaining_after_await -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_exception_chaining_after_await_with_context_cycle -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_exception_traceback -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_gather_shield -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_generic_alias -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_get_coro -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_get_stack -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_iscoroutinefunction -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_log_destroyed_pending_task -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_log_traceback -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_other_loop_future -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_return_coroutine_from_coroutine -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_shield_cancel_inner -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_shield_cancel_outer -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_shield_coroutine_use_global_loop -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_shield_coroutine_use_running_loop -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_shield_coroutine_without_loop -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_shield_effect -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_shield_exception -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_shield_gather -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_shield_result -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_shield_shortcut -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_sleep -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_sleep_cancel -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_step_result -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_step_result_future -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_stop_while_run_in_complete -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_task_awaits_on_itself -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_task_basics -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_task_cancel_message_getter -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_task_cancel_message_setter -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_task_cancel_sleeping_task -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_task_cancel_waiter_future -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_task_class -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_task_del_collect -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_task_repr -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_task_repr_autogenerated -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_task_repr_coro_decorator -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_task_repr_name_not_str -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_task_repr_partial_corowrapper -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_task_repr_wait_for -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_task_set_methods -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_task_source_traceback -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_tb_logger_not_called_after_cancel -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_wait -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_wait_concurrent_complete -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_wait_duplicate_coroutines -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_wait_errors -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_wait_first_completed -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_wait_first_exception -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_wait_first_exception_in_wait -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_wait_invalid_args -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_wait_really_done -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_wait_with_exception -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_wait_with_iterator_of_tasks -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_wait_with_timeout -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_yield_from_corowrapper -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_yield_from_corowrapper_send -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_yield_future_passes_cancel -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_yield_vs_yield_from -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_yield_vs_yield_from_generator -*test.test_asyncio.test_tasks.CTask_PyFuture_Tests.test_yield_wait_does_not_shield_cancel -*test.test_asyncio.test_tasks.CompatibilityTests.test_debug_mode_interop -*test.test_asyncio.test_tasks.CompatibilityTests.test_yield_from_awaitable -*test.test_asyncio.test_tasks.CoroutineGatherTests.test_cancellation_broadcast -*test.test_asyncio.test_tasks.FutureGatherTests.test_constructor_heterogenous_futures -*test.test_asyncio.test_tasks.FutureGatherTests.test_constructor_homogenous_futures -*test.test_asyncio.test_tasks.FutureGatherTests.test_one_cancellation -*test.test_asyncio.test_tasks.FutureGatherTests.test_one_exception -*test.test_asyncio.test_tasks.FutureGatherTests.test_result_exception_one_cancellation -*test.test_asyncio.test_tasks.FutureGatherTests.test_result_exception_success -*test.test_asyncio.test_tasks.FutureGatherTests.test_return_exceptions -*test.test_asyncio.test_tasks.FutureGatherTests.test_success -*test.test_asyncio.test_tasks.GenericTaskTests.test_asyncio_module_compiled -*test.test_asyncio.test_tasks.GenericTaskTests.test_future_subclass -*test.test_asyncio.test_tasks.PyCurrentLoopTests.test_current_task_no_running_loop -*test.test_asyncio.test_tasks.PyCurrentLoopTests.test_current_task_with_implicit_loop -*test.test_asyncio.test_tasks.PyIntrospectionTests.test__enter_task -*test.test_asyncio.test_tasks.PyIntrospectionTests.test__enter_task_failure -*test.test_asyncio.test_tasks.PyIntrospectionTests.test__leave_task -*test.test_asyncio.test_tasks.PyIntrospectionTests.test__leave_task_failure1 -*test.test_asyncio.test_tasks.PyIntrospectionTests.test__leave_task_failure2 -*test.test_asyncio.test_tasks.PyIntrospectionTests.test__register_task_1 -*test.test_asyncio.test_tasks.PyIntrospectionTests.test__register_task_2 -*test.test_asyncio.test_tasks.PyIntrospectionTests.test__register_task_3 -*test.test_asyncio.test_tasks.PyIntrospectionTests.test__unregister_task -*test.test_asyncio.test_tasks.PyIntrospectionTests.test__unregister_task_not_registered -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_as_completed -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_as_completed_concurrent -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_as_completed_coroutine_use_global_loop -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_as_completed_coroutine_use_running_loop -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_as_completed_coroutine_without_loop -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_as_completed_duplicate_coroutines -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_as_completed_invalid_args -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_as_completed_reverse_wait -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_as_completed_with_timeout -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_as_completed_with_unused_timeout -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_bare_create_named_task -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_bare_create_task -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_baseexception_during_cancel -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_cancel -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_cancel_at_end -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_cancel_awaited_task -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_cancel_both_task_and_inner_future -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_cancel_current_task -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_cancel_gather_1 -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_cancel_gather_2 -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_cancel_inner_future -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_cancel_task_catching -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_cancel_task_ignoring -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_cancel_traceback_for_future_exception -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_cancel_traceback_for_future_result -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_cancel_with_message_before_starting_task -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_cancel_with_message_then_future_exception -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_cancel_with_message_then_future_result -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_cancel_yield -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_context_1 -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_context_2 -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_context_3 -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_coroutine_never_yielded -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_coroutine_non_gen_function -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_coroutine_non_gen_function_return_future -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_corowrapper_mocks_generator -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_corowrapper_throw -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_corowrapper_weakref -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_create_task_with_async_function -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_create_task_with_asynclike_function -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_create_task_with_noncoroutine -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_create_task_with_oldstyle_coroutine -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_current_task -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_current_task_with_interleaving_tasks -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_ensure_future_awaitable -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_ensure_future_coroutine -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_ensure_future_coroutine_2 -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_ensure_future_error_msg -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_ensure_future_future -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_ensure_future_neither -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_ensure_future_task -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_error_in_call_soon -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_exception_chaining_after_await -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_exception_chaining_after_await_with_context_cycle -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_exception_traceback -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_gather_shield -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_generic_alias -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_get_coro -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_get_stack -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_iscoroutinefunction -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_log_destroyed_pending_task -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_log_traceback -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_other_loop_future -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_return_coroutine_from_coroutine -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_shield_cancel_inner -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_shield_cancel_outer -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_shield_coroutine_use_global_loop -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_shield_coroutine_use_running_loop -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_shield_coroutine_without_loop -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_shield_effect -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_shield_exception -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_shield_gather -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_shield_result -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_shield_shortcut -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_sleep -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_sleep_cancel -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_step_result -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_step_result_future -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_stop_while_run_in_complete -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_task_awaits_on_itself -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_task_basics -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_task_cancel_message_getter -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_task_cancel_message_setter -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_task_cancel_sleeping_task -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_task_cancel_waiter_future -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_task_class -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_task_del_collect -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_task_repr -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_task_repr_autogenerated -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_task_repr_coro_decorator -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_task_repr_name_not_str -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_task_repr_partial_corowrapper -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_task_repr_wait_for -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_task_set_methods -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_task_source_traceback -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_tb_logger_not_called_after_cancel -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_wait -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_wait_concurrent_complete -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_wait_duplicate_coroutines -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_wait_errors -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_wait_first_completed -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_wait_first_exception -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_wait_first_exception_in_wait -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_wait_invalid_args -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_wait_really_done -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_wait_with_exception -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_wait_with_iterator_of_tasks -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_wait_with_timeout -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_yield_from_corowrapper -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_yield_from_corowrapper_send -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_yield_future_passes_cancel -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_yield_vs_yield_from -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_yield_vs_yield_from_generator -*test.test_asyncio.test_tasks.PyTask_CFutureSubclass_Tests.test_yield_wait_does_not_shield_cancel -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_as_completed -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_as_completed_concurrent -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_as_completed_coroutine_use_global_loop -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_as_completed_coroutine_use_running_loop -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_as_completed_coroutine_without_loop -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_as_completed_duplicate_coroutines -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_as_completed_invalid_args -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_as_completed_reverse_wait -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_as_completed_with_timeout -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_as_completed_with_unused_timeout -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_bare_create_named_task -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_bare_create_task -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_baseexception_during_cancel -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_cancel -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_cancel_at_end -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_cancel_awaited_task -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_cancel_both_task_and_inner_future -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_cancel_current_task -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_cancel_gather_1 -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_cancel_gather_2 -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_cancel_inner_future -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_cancel_task_catching -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_cancel_task_ignoring -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_cancel_traceback_for_future_exception -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_cancel_traceback_for_future_result -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_cancel_with_message_before_starting_task -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_cancel_with_message_then_future_exception -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_cancel_with_message_then_future_result -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_cancel_yield -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_context_1 -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_context_2 -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_context_3 -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_coroutine_never_yielded -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_coroutine_non_gen_function -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_coroutine_non_gen_function_return_future -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_corowrapper_mocks_generator -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_corowrapper_throw -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_corowrapper_weakref -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_create_task_with_async_function -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_create_task_with_asynclike_function -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_create_task_with_noncoroutine -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_create_task_with_oldstyle_coroutine -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_current_task -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_current_task_with_interleaving_tasks -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_ensure_future_awaitable -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_ensure_future_coroutine -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_ensure_future_coroutine_2 -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_ensure_future_error_msg -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_ensure_future_future -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_ensure_future_neither -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_ensure_future_task -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_error_in_call_soon -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_exception_chaining_after_await -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_exception_chaining_after_await_with_context_cycle -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_exception_traceback -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_gather_shield -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_generic_alias -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_get_coro -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_get_stack -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_iscoroutinefunction -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_log_destroyed_pending_task -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_log_traceback -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_other_loop_future -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_return_coroutine_from_coroutine -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_shield_cancel_inner -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_shield_cancel_outer -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_shield_coroutine_use_global_loop -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_shield_coroutine_use_running_loop -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_shield_coroutine_without_loop -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_shield_effect -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_shield_exception -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_shield_gather -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_shield_result -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_shield_shortcut -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_sleep -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_sleep_cancel -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_step_result -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_step_result_future -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_stop_while_run_in_complete -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_task_awaits_on_itself -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_task_basics -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_task_cancel_message_getter -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_task_cancel_message_setter -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_task_cancel_sleeping_task -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_task_cancel_waiter_future -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_task_class -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_task_del_collect -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_task_repr -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_task_repr_autogenerated -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_task_repr_coro_decorator -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_task_repr_name_not_str -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_task_repr_partial_corowrapper -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_task_repr_wait_for -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_task_set_methods -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_task_source_traceback -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_tb_logger_not_called_after_cancel -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_wait -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_wait_concurrent_complete -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_wait_duplicate_coroutines -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_wait_errors -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_wait_first_completed -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_wait_first_exception -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_wait_first_exception_in_wait -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_wait_invalid_args -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_wait_really_done -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_wait_with_exception -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_wait_with_iterator_of_tasks -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_wait_with_timeout -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_yield_from_corowrapper -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_yield_from_corowrapper_send -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_yield_future_passes_cancel -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_yield_vs_yield_from -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_yield_vs_yield_from_generator -*test.test_asyncio.test_tasks.PyTask_CFuture_Tests.test_yield_wait_does_not_shield_cancel -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_as_completed_invalid_args -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_bare_create_named_task -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_bare_create_task -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_baseexception_during_cancel -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_at_end -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_awaited_task -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_both_task_and_inner_future -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_current_task -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_inner_future -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_task_catching -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_task_ignoring -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_traceback_for_future_exception -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_with_message_before_starting_task -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_with_message_then_future_exception -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_with_message_then_future_result -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_yield -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_context_1 -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_context_2 -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_context_3 -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_coroutine_non_gen_function -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_coroutine_non_gen_function_return_future -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_corowrapper_mocks_generator -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_corowrapper_throw -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_corowrapper_weakref -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_create_task_with_async_function -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_create_task_with_asynclike_function -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_create_task_with_noncoroutine -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_create_task_with_oldstyle_coroutine -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_current_task -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_current_task_with_interleaving_tasks -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_ensure_future_awaitable -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_ensure_future_error_msg -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_ensure_future_future -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_ensure_future_neither -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_ensure_future_task -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_exception_chaining_after_await -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_exception_chaining_after_await_with_context_cycle -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_exception_traceback -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_gather_shield -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_generic_alias -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_get_coro -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_iscoroutinefunction -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_log_traceback -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_other_loop_future -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_return_coroutine_from_coroutine -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_cancel_inner -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_cancel_outer -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_exception -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_gather -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_result -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_shortcut -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_sleep -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_sleep_cancel -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_step_result -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_step_result_future -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_stop_while_run_in_complete -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_subclasses_ctask_cfuture -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_awaits_on_itself -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_basics -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_cancel_message_getter -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_cancel_message_setter -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_cancel_sleeping_task -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_cancel_waiter_future -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_class -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_del_collect -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_repr_autogenerated -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_repr_name_not_str -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_repr_wait_for -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_set_methods -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_tb_logger_not_called_after_cancel -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_concurrent_complete -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_duplicate_coroutines -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_errors -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_first_completed -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_first_exception -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_first_exception_in_wait -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_invalid_args -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_really_done -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_with_exception -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_with_iterator_of_tasks -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_with_timeout -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_yield_from_corowrapper -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_yield_from_corowrapper_send -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_yield_future_passes_cancel -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_yield_vs_yield_from -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_yield_vs_yield_from_generator -*test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_yield_wait_does_not_shield_cancel -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_as_completed_invalid_args -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_bare_create_named_task -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_bare_create_task -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_baseexception_during_cancel -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_at_end -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_awaited_task -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_both_task_and_inner_future -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_current_task -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_inner_future -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_task_catching -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_task_ignoring -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_traceback_for_future_exception -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_with_message_before_starting_task -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_with_message_then_future_exception -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_with_message_then_future_result -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_yield -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_context_1 -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_context_2 -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_context_3 -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_coroutine_non_gen_function -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_coroutine_non_gen_function_return_future -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_corowrapper_mocks_generator -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_corowrapper_throw -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_corowrapper_weakref -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_create_task_with_async_function -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_create_task_with_asynclike_function -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_create_task_with_noncoroutine -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_create_task_with_oldstyle_coroutine -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_current_task -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_current_task_with_interleaving_tasks -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_ensure_future_awaitable -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_ensure_future_error_msg -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_ensure_future_future -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_ensure_future_neither -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_ensure_future_task -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_exception_chaining_after_await -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_exception_chaining_after_await_with_context_cycle -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_exception_traceback -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_gather_shield -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_generic_alias -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_get_coro -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_iscoroutinefunction -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_log_traceback -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_other_loop_future -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_return_coroutine_from_coroutine -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_set_exception_causes_invalid_state -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_set_result_causes_invalid_state -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_cancel_inner -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_cancel_outer -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_exception -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_gather -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_result -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_shortcut -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_sleep -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_sleep_cancel -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_step_result -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_step_result_future -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_stop_while_run_in_complete -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_awaits_on_itself -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_basics -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_cancel_message_getter -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_cancel_message_setter -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_cancel_sleeping_task -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_cancel_waiter_future -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_class -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_del_collect -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_repr_autogenerated -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_repr_name_not_str -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_repr_wait_for -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_set_methods -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_source_traceback -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_tb_logger_not_called_after_cancel -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_concurrent_complete -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_duplicate_coroutines -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_errors -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_first_completed -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_first_exception -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_first_exception_in_wait -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_invalid_args -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_really_done -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_with_exception -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_with_iterator_of_tasks -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_with_timeout -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_yield_from_corowrapper -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_yield_from_corowrapper_send -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_yield_future_passes_cancel -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_yield_vs_yield_from -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_yield_vs_yield_from_generator -*test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_yield_wait_does_not_shield_cancel -*test.test_asyncio.test_tasks.RunCoroutineThreadsafeTests.test_run_coroutine_threadsafe -*test.test_asyncio.test_tasks.RunCoroutineThreadsafeTests.test_run_coroutine_threadsafe_task_cancelled -*test.test_asyncio.test_tasks.RunCoroutineThreadsafeTests.test_run_coroutine_threadsafe_with_exception -*test.test_asyncio.test_tasks.RunCoroutineThreadsafeTests.test_run_coroutine_threadsafe_with_timeout -*test.test_asyncio.test_tasks.SleepTests.test_sleep_zero -*test.test_asyncio.test_tasks.WaitTests.test_coro_is_deprecated_in_wait -*test.test_asyncio.test_threads.ToThreadTests.test_to_thread -*test.test_asyncio.test_threads.ToThreadTests.test_to_thread_args_kwargs -*test.test_asyncio.test_threads.ToThreadTests.test_to_thread_contextvars -*test.test_asyncio.test_threads.ToThreadTests.test_to_thread_exception -*test.test_asyncio.test_threads.ToThreadTests.test_to_thread_once -*test.test_asyncio.test_transports.TransportTests.test_ctor_extra_is_none -*test.test_asyncio.test_transports.TransportTests.test_dgram_not_implemented -*test.test_asyncio.test_transports.TransportTests.test_flowcontrol_mixin_set_write_limits -*test.test_asyncio.test_transports.TransportTests.test_get_extra_info -*test.test_asyncio.test_transports.TransportTests.test_not_implemented -*test.test_asyncio.test_transports.TransportTests.test_subprocess_transport_not_implemented -*test.test_asyncio.test_transports.TransportTests.test_writelines -*test.test_asyncio.test_unix_events.AbstractChildWatcherTests.test_not_implemented -*test.test_asyncio.test_unix_events.BaseChildWatcherTests.test_not_implemented -*test.test_asyncio.test_unix_events.PolicyTests.test_get_child_watcher_after_set -*test.test_asyncio.test_unix_events.PolicyTests.test_get_child_watcher_thread -*test.test_asyncio.test_unix_events.PolicyTests.test_get_default_child_watcher -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSockSendfileTests.test_sock_sendfile_blocking_error -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSockSendfileTests.test_sock_sendfile_cancel1 -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSockSendfileTests.test_sock_sendfile_cancel2 -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSockSendfileTests.test_sock_sendfile_exception -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSockSendfileTests.test_sock_sendfile_iobuffer -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSockSendfileTests.test_sock_sendfile_not_a_file -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSockSendfileTests.test_sock_sendfile_not_available -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSockSendfileTests.test_sock_sendfile_not_regular_file -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSockSendfileTests.test_sock_sendfile_os_error_first_call -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSockSendfileTests.test_sock_sendfile_os_error_next_call -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_nopath_nosock -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_nossl_serverhost -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_path_inetsock -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_path_sock -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_pathlib -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_ssl_noserverhost -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_ssl_timeout_with_plain_sock -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_bind_error -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_existing_path_nonsock -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_existing_path_sock -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_nopath_nosock -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_path_dgram -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_path_inetsock -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_path_stream_bittype -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_pathlib -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_ssl_bool -*test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_ssl_timeout_with_plain_sock -*test.test_asyncio.test_unix_events.TestFunctional.test_add_reader_invalid_argument -*test.test_asyncio.test_unix_events.TestFunctional.test_add_reader_or_writer_transport_fd -*test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__call_connection_lost -*test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__call_connection_lost_with_err -*test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__close -*test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__read_ready -*test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__read_ready_blocked -*test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__read_ready_eof -*test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__read_ready_error -*test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_close -*test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_close_already_closing -*test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_ctor -*test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_pause_reading -*test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_pause_reading_on_closed_pipe -*test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_pause_reading_on_paused_pipe -*test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_resume_reading -*test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_resume_reading_on_closed_pipe -*test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_resume_reading_on_paused_pipe -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__call_connection_lost -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__call_connection_lost_with_err -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__read_ready -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__write_ready -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__write_ready_again -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__write_ready_closing -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__write_ready_empty -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__write_ready_err -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__write_ready_partial -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_abort -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_can_write_eof -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_close -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_close_closing -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_ctor -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_again -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_buffer -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_close -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_eof -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_eof_pending -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_err -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_no_data -*test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_partial -*test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_asyncio_wait_for_cancelled -*test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_asyncio_wait_for_timeout -*test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_cancel_blocking_wait_for -*test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_cancel_wait_for -*test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for -*test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_cancellation_race_condition -*test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_race_condition -*test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_reraises_exception_during_cancellation -*test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_self_cancellation -*test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_timeout_less_then_0_or_0 -*test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_timeout_less_then_0_or_0_coroutine_do_not_started -*test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_timeout_less_then_0_or_0_future_done -*test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_waits_for_task_cancellation -*test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_waits_for_task_cancellation_w_timeout_0 -*unittest.loader.ModuleSkipped.test.test_asyncio.test_subprocess -*unittest.loader.ModuleSkipped.test.test_asyncio.test_windows_events -*unittest.loader.ModuleSkipped.test.test_asyncio.test_windows_utils +test.test_asyncio.test_base_events.BaseEventLoopTests.test__add_callback_cancelled_handle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test__add_callback_handle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test__run_once @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test__run_once_cancelled_event_cleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test__run_once_schedule_handle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_call_later @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_call_later_negative_delays @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_call_soon @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_call_soon_non_callable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_check_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_create_named_task_with_custom_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_create_named_task_with_default_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_create_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_create_task_error_closes_coro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_default_exc_handler_broken @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_default_exc_handler_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_not_implemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_forever_keyboard_interrupt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_forever_pre_stopped @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_once @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_until_complete_baseexception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_until_complete_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_until_complete_loop_orphan_future_close_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_until_complete_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_debug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_default_executor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_default_executor_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_exc_handler_broken @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_exc_handler_custom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_exc_handler_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_task_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_task_factory_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_single_selecter_event_callback_after_stopping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_subprocess_exec_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_subprocess_shell_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_time_and_call_at @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_accept_connection_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_accept_connection_retry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_call_coroutine @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_bluetooth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_connect_err @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_host_port_sock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_ip_addr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_multiple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_multiple_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_multiple_errors_local_addr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_no_getaddrinfo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_no_host_port_sock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_no_inet_pton @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_no_local_addr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_no_ssl_server_hostname_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_service_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_ssl_server_hostname_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_ssl_server_hostname_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_ssl_timeout_for_plain_socket @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_wrong_sock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_addr_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_allow_broadcast @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_cant_bind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_connect_err @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_ip_addr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_no_addrinfo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_no_matching_family @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_noaddr_nofamily @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_nosoreuseport @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_setblk_err @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_sock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_sock_sockopts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_socket_err @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_sockopts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_wrong_sock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_cant_bind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_empty_host @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_host_port_sock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_ipv6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_no_getaddrinfo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_no_host_port_sock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_nosoreuseport @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_soreuseport_only_defined @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_ssl_timeout_for_plain_socket @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_wrong_sock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_getnameinfo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventTests.test_ipaddr_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventTests.test_ipaddr_info_no_inet_pton @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseEventTests.test_port_parameter_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test__sock_sendfile_native_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_blocking_socket @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_negative_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_negative_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_nonbinary_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_nonstream_socket @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_notint_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_notint_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_sock_sendfile_fallback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_sock_sendfile_fallback_offset_and_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_sock_sendfile_no_fallback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.RunningLoopTests.test_running_loop_within_a_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_base_events.TestSelectorUtils.test_set_nodelay @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_buffered_proto.BufferedProtocolSelectorTests.test_buffered_proto_create_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_context.DecimalContextTest.test_asyncio_task_decimal_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.AbstractEventLoopTests.test_not_implemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.AbstractEventLoopTests.test_not_implemented_async @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.HandleTests.test_callback_with_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.HandleTests.test_coroutine_like_object_debug_formatting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.HandleTests.test_handle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.HandleTests.test_handle_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.HandleTests.test_handle_repr_debug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.HandleTests.test_handle_source_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.HandleTests.test_handle_weakref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.PolicyTests.test_event_loop_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.PolicyTests.test_get_event_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.PolicyTests.test_get_event_loop_after_set_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.PolicyTests.test_get_event_loop_calls_set_event_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.PolicyTests.test_get_event_loop_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.PolicyTests.test_get_event_loop_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.PolicyTests.test_new_event_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.PolicyTests.test_set_event_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.PolicyTests.test_set_event_loop_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_add_fds_after_closing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_bidirectional_pty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_call_later @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_call_soon @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_call_soon_threadsafe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_call_soon_threadsafe_same_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_close_running_event_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_connect_accepted_socket @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_connect_accepted_socket_ssl_timeout_for_plain_socket @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_create_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_create_connection_local_addr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_create_connection_local_addr_in_use @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_create_connection_local_addr_nomatch_family @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_create_connection_local_addr_skip_different_family @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_create_datagram_endpoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_create_datagram_endpoint_ipv6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_create_datagram_endpoint_sock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_create_server @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_create_server_addr_in_use @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_create_server_dual_stack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_create_server_multiple_hosts_ipv4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_create_server_multiple_hosts_ipv6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_create_server_reuse_port @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_create_server_sock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_create_server_ssl_verified @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_create_server_ssl_verify_failed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_internal_fds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_prompt_cancellation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_read_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_read_pty_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_reader_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_remove_fds_after_closing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_run_in_executor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_run_in_executor_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_run_until_complete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_run_until_complete_stopped @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_server_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_ssl_connect_accepted_socket @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +# Timeouts +!test.test_asyncio.test_events.SelectEventLoopTests.test_subprocess_close_after_finish +test.test_asyncio.test_events.SelectEventLoopTests.test_subprocess_exec_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +# Timeouts +!test.test_asyncio.test_events.SelectEventLoopTests.test_subprocess_exitcode @ darwin-arm64,darwin-x86_64 +!test.test_asyncio.test_events.SelectEventLoopTests.test_subprocess_shell @ darwin-arm64,darwin-x86_64,linux-aarch64 +test.test_asyncio.test_events.SelectEventLoopTests.test_subprocess_shell_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +# Timeouts +!test.test_asyncio.test_events.SelectEventLoopTests.test_subprocess_wait_no_same_group @ darwin-arm64,linux-aarch64 +test.test_asyncio.test_events.SelectEventLoopTests.test_timeout_rounding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_unclosed_pipe_transport @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_write_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_write_pipe_disconnect_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_write_pty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_writer_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.TestAbstractServer.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.TestAbstractServer.test_get_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.TestAbstractServer.test_wait_closed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.TestCGetEventLoop.test_get_event_loop_new_process @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.TestCGetEventLoop.test_get_event_loop_returns_running_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.TestCGetEventLoop.test_get_event_loop_returns_running_loop2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.TestPyGetEventLoop.test_get_event_loop_new_process @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.TestPyGetEventLoop.test_get_event_loop_returns_running_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.TestPyGetEventLoop.test_get_event_loop_returns_running_loop2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.TestServer.test_get_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.TimerTests.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.TimerTests.test_timer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.TimerTests.test_timer_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.TimerTests.test_timer_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.TimerTests.test_timer_repr_debug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_events.TimerTests.test_when @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.DuckTests.test_ensure_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.DuckTests.test_wrap_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_callbacks_invoked_on_set_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_callbacks_invoked_on_set_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_callbacks_remove_first_and_second_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_callbacks_remove_first_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_callbacks_remove_third_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_remove_done_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_remove_done_callbacks_list_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_remove_done_callbacks_list_mutation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureInheritanceTests.test_inherit_without_calling_super_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_constructor_positional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_constructor_use_global_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_constructor_use_running_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_constructor_without_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_copy_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_exception_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_future_cancel_message_getter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_future_cancel_message_setter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_future_del_collect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_future_iter_throw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_future_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_future_source_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_future_stop_iteration_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_generic_alias @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_initial_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_isfuture @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_log_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_set_result_unless_cancelled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_tb_logger_abandoned @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_tb_logger_exception_result_retrieved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_tb_logger_exception_retrieved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_tb_logger_not_called_after_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_tb_logger_result_retrieved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_tb_logger_result_unretrieved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_uninitialized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_wrap_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_wrap_future_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_wrap_future_cancel2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_wrap_future_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_wrap_future_use_global_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_wrap_future_use_running_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_wrap_future_without_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_yield_from_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_futures2.FutureReprTests.test_recursive_repr_for_pending_tasks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_abort_barrier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_abort_barrier_when_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_abort_barrier_when_exception_then_resetting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_abort_barrier_when_tasks_half_draining_half_blocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_barrier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_barrier_parties @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_blocking_tasks_while_draining @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_draining_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_filling_one_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_filling_one_task_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_filling_task_by_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_filling_tasks_cancel_one @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_filling_tasks_check_return_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_filling_tasks_wait_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_reset_barrier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_reset_barrier_when_tasks_half_draining @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_reset_barrier_when_tasks_half_draining_half_blocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_reset_barrier_while_tasks_draining @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_reset_barrier_while_tasks_waiting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.BarrierTests.test_reset_barrier_while_tasks_waiting_and_waiting_again @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.ConditionTests.test_ambiguous_loops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.ConditionTests.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.ConditionTests.test_explicit_lock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.ConditionTests.test_notify @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.ConditionTests.test_notify_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.ConditionTests.test_notify_all_unacquired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.ConditionTests.test_notify_unacquired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.ConditionTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.ConditionTests.test_timeout_in_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.ConditionTests.test_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.ConditionTests.test_wait_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.ConditionTests.test_wait_cancel_after_notify @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.ConditionTests.test_wait_cancel_contested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.ConditionTests.test_wait_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.ConditionTests.test_wait_for_unacquired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.ConditionTests.test_wait_unacquired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.EventTests.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.EventTests.test_clear_with_waiters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.EventTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.EventTests.test_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.EventTests.test_wait_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.EventTests.test_wait_on_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.LockTests.test_acquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.LockTests.test_acquire_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.LockTests.test_cancel_race @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.LockTests.test_cancel_release_race @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.LockTests.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.LockTests.test_finished_waiter_cancelled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.LockTests.test_lock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.LockTests.test_lock_by_with_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.LockTests.test_lock_doesnt_accept_loop_parameter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.LockTests.test_release_no_waiters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.LockTests.test_release_not_acquired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.LockTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.SemaphoreTests.test_acquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.SemaphoreTests.test_acquire_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.SemaphoreTests.test_acquire_cancel_before_awoken @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.SemaphoreTests.test_acquire_fifo_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.SemaphoreTests.test_acquire_fifo_order_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.SemaphoreTests.test_acquire_fifo_order_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.SemaphoreTests.test_acquire_hang @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.SemaphoreTests.test_acquire_no_hang @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.SemaphoreTests.test_initial_value_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.SemaphoreTests.test_release_no_waiters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.SemaphoreTests.test_release_not_acquired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.SemaphoreTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.SemaphoreTests.test_semaphore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_locks.SemaphoreTests.test_semaphore_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_pep492.CoroutineTests.test_async_def_coroutines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_pep492.CoroutineTests.test_double_await @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_pep492.CoroutineTests.test_iscoroutine @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_pep492.CoroutineTests.test_iscoroutinefunction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_pep492.CoroutineTests.test_task_print_stack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_pep492.CoroutineTests.test_types_coroutine @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_pep492.LockTests.test_context_manager_async_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_pep492.LockTests.test_context_manager_with_await @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_pep492.StreamReaderTests.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_close_self_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_create_server @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_create_server_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_ctor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_datagram_loop_reading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_datagram_loop_reading_aborted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_datagram_loop_reading_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_datagram_loop_reading_no_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_datagram_loop_writing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_datagram_loop_writing_aborted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_loop_self_reading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_loop_self_reading_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_loop_self_reading_fut @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_make_datagram_transport @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_make_socket_transport @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_process_events @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_stop_serving @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_write_to_self @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test__loop_writing_closing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test__loop_writing_error_received @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test__loop_writing_error_received_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test__loop_writing_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_fatal_error_connected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_buffer_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_buffer_memoryview @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_closing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_connected_addr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_error_received @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_error_received_connected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_memoryview @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_no_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_abort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_call_connection_lost @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_close_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_close_invalid_sockobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_close_protocol_connection_lost_once @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_close_write_fut @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_ctor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_dont_pause_writing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_fatal_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_fatal_error_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_force_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_force_close_idempotent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_force_close_protocol_connection_lost_once @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_aborted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_aborted_closing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_aborted_is_fatal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_conn_reset_lost @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_no_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_writing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_writing_closing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_writing_err @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_writing_force_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_writing_stop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_pause_reading_connection_made @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_pause_resume_reading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_pause_resume_writing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_pause_writing_2write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_pause_writing_3write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_eof_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_eof_buffer_write_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_eof_duplex_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_eof_write_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_more @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_no_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_protocols.ProtocolsAbsTests.test_base_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_protocols.ProtocolsAbsTests.test_buffered_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_protocols.ProtocolsAbsTests.test_datagram_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_protocols.ProtocolsAbsTests.test_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_protocols.ProtocolsAbsTests.test_subprocess_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.LifoQueueJoinTests.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.LifoQueueJoinTests.test_join_empty_queue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.LifoQueueJoinTests.test_task_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.LifoQueueJoinTests.test_task_done_underflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.LifoQueueTests.test_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.PriorityQueueJoinTests.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.PriorityQueueJoinTests.test_join_empty_queue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.PriorityQueueJoinTests.test_task_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.PriorityQueueJoinTests.test_task_done_underflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.PriorityQueueTests.test_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueBasicTests.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueBasicTests.test_full @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueBasicTests.test_generic_alias @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueBasicTests.test_maxsize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueBasicTests.test_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueBasicTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueBasicTests.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueGetTests.test_blocking_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueGetTests.test_blocking_get_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueGetTests.test_cancelled_getters_not_being_held_in_self_getters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueGetTests.test_get_cancelled_race @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueGetTests.test_get_with_putters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueGetTests.test_get_with_waiting_putters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueGetTests.test_nonblocking_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueGetTests.test_nonblocking_get_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueGetTests.test_why_are_getters_waiting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueJoinTests.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueJoinTests.test_join_empty_queue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueJoinTests.test_task_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueueJoinTests.test_task_done_underflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueuePutTests.test_blocking_put @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueuePutTests.test_blocking_put_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueuePutTests.test_cancelled_put_silence_value_error_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueuePutTests.test_cancelled_puts_not_being_held_in_self_putters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueuePutTests.test_float_maxsize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueuePutTests.test_get_cancel_drop_many_pending_readers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueuePutTests.test_get_cancel_drop_one_pending_reader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueuePutTests.test_nonblocking_put @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueuePutTests.test_nonblocking_put_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueuePutTests.test_put_cancel_drop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueuePutTests.test_put_cancelled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueuePutTests.test_put_cancelled_race @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueuePutTests.test_put_with_waiting_getters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_queues.QueuePutTests.test_why_are_putters_waiting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunTests.test_asyncio_run_cancels_hanging_tasks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunTests.test_asyncio_run_closes_gens_after_hanging_tasks_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunTests.test_asyncio_run_debug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunTests.test_asyncio_run_from_running_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunTests.test_asyncio_run_only_coro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunTests.test_asyncio_run_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunTests.test_asyncio_run_reports_hanging_tasks_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunTests.test_asyncio_run_return @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunTests.test_asyncio_run_set_event_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_custom_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_debug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_double_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_explicit_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_interrupt_cancelled_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_non_debug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_run @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_run_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_run_keeps_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_run_non_coro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_second_with_block_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_set_event_loop_called_once @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_signal_install_not_supported_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_accept_connection_multiple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_add_reader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_add_reader_existing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_add_reader_existing_writer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_add_writer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_add_writer_existing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_close_no_selector @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_make_socket_transport @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_make_ssl_transport_without_ssl_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_process_events_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_process_events_read_cancelled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_process_events_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_process_events_write_cancelled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_read_from_self_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_read_from_self_tryagain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_remove_reader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_remove_reader_read_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_remove_reader_unknown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_remove_writer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_remove_writer_read_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_remove_writer_unknown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_sock_connect_resolve_using_socket_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_write_to_self_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_write_to_self_tryagain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_fatal_error_connected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_fatal_error_connected_custom_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_read_ready @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_read_ready_err @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_read_ready_oserr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_read_ready_tryagain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_buffer_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_buffer_memoryview @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_closing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_connected_addr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_error_received @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_error_received_connected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_memoryview @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_no_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready_closing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready_error_received @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready_error_received_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready_no_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready_tryagain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_tryagain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_buffer_updated_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_ctor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_get_buffer_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_get_buffer_zerosized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_proto_type_switch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_eof_received_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready_conn_reset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready_eof_keep_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready_err @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready_tryagain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready_tryagain_interrupted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_ctor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_ctor_with_waiter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_data_received_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_pause_reading_connection_made @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_pause_resume_reading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_eof_received_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready_conn_reset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready_eof_keep_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready_err @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready_tryagain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready_tryagain_interrupted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_transport_close_remove_writer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_closing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_eof_after_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_eof_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_memoryview @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_no_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_partial_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_partial_memoryview @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_partial_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready_closing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready_no_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready_partial_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready_tryagain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_tryagain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorTransportTests.test__add_reader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorTransportTests.test_abort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorTransportTests.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorTransportTests.test_close_write_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorTransportTests.test_connection_lost @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorTransportTests.test_ctor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorTransportTests.test_fatal_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorTransportTests.test_fatal_error_custom_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_selector_events.SelectorTransportTests.test_force_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sendfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sendfile_close_peer_after_receiving @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sendfile_close_peer_in_the_middle_of_receiving @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sendfile_fallback_close_peer_in_the_middle_of_receiving @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sendfile_for_closing_transp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sendfile_force_fallback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sendfile_force_unsupported_native @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sendfile_no_fallback_for_fallback_transport @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sendfile_not_supported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sendfile_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sendfile_pre_and_post_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sendfile_ssl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sendfile_ssl_close_peer_after_receiving @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sendfile_ssl_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sendfile_ssl_pre_and_post_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sock_sendfile_mix_with_regular_send @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sock_sendfile_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sock_sendfile_with_offset_and_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sendfile.SelectEventLoopTests.test_sock_sendfile_zero_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_server.SelectorStartServerTests.test_start_server_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_server.SelectorStartServerTests.test_start_unix_server_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_cancel_sock_accept @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_create_connection_sock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_huge_content @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_huge_content_recvinto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_recvfrom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_recvfrom_into @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_sendto_blocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_sock_accept @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_sock_client_connect_racing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_sock_client_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_sock_client_ops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_sock_client_racing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_unix_sock_client_ops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_ssl.TestSSL.test_connect_accepted_socket @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_ssl.TestSSL.test_connect_timeout_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_ssl.TestSSL.test_create_connection_ssl_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_ssl.TestSSL.test_create_connection_ssl_failed_certificate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_ssl.TestSSL.test_create_connection_ssl_slow_handshake @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_ssl.TestSSL.test_create_server_ssl_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_ssl.TestSSL.test_create_server_ssl_over_ssl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_ssl.TestSSL.test_flush_before_shutdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_ssl.TestSSL.test_shutdown_cleanly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +# transiently fails +!test.test_asyncio.test_ssl.TestSSL.test_shutdown_timeout_handler_leak +test.test_asyncio.test_ssl.TestSSL.test_shutdown_timeout_handler_not_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_ssl.TestSSL.test_ssl_connect_accepted_socket @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_ssl.TestSSL.test_ssl_handshake_connection_lost @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_ssl.TestSSL.test_ssl_handshake_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_ssl.TestSSL.test_start_tls_client_buf_proto_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_ssl.TestSSL.test_start_tls_client_reg_proto_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_ssl.TestSSL.test_start_tls_server_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_ssl.TestSSL.test_start_tls_slow_client_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SelectorStartTLSTests.test_buf_feed_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SelectorStartTLSTests.test_create_connection_memory_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SelectorStartTLSTests.test_create_connection_ssl_failed_certificate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SelectorStartTLSTests.test_create_connection_ssl_slow_handshake @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SelectorStartTLSTests.test_handshake_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SelectorStartTLSTests.test_start_tls_client_buf_proto_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SelectorStartTLSTests.test_start_tls_client_reg_proto_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SelectorStartTLSTests.test_start_tls_server_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SelectorStartTLSTests.test_start_tls_slow_client_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SelectorStartTLSTests.test_start_tls_wrong_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_close_during_handshake @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_connection_lost @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_data_received_after_closing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_eof_received_waiter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_fatal_error_no_name_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_get_extra_info_on_closed_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_handshake_timeout_negative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_handshake_timeout_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_set_new_app_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_write_after_closing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_IncompleteReadError_pickleable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_LimitOverrunError_pickleable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test___repr__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test___repr__data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test___repr__eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test___repr__exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test___repr__nondefault_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test___repr__transport @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test___repr__waiter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_async_writer_api @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_async_writer_api_exception_after_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_at_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_drain_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_eof_feed_when_closing_writer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_exception_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_exception_waiter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_feed_empty_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_feed_nonempty_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_invalid_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_loop_is_closed_resource_warnings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_multiple_drain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_open_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_open_connection_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_open_connection_no_loop_ssl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_open_unix_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_open_unix_connection_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_open_unix_connection_no_loop_ssl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_read_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_read_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_read_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_read_line_breaks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_read_until_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_read_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_readexactly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_readexactly_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_readexactly_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_readexactly_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_readexactly_zero_or_less @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_readline_empty_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_readline_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_readline_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_readline_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_readline_limit_with_existing_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_readline_nolimit_nowait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_readline_read_byte_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_readuntil_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_readuntil_limit_found_sep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_readuntil_multi_chunks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_readuntil_multi_chunks_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_readuntil_separator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_start_server @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_start_tls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_start_unix_server @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_streamreader_constructor_use_global_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_streamreader_constructor_use_running_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_streamreader_constructor_without_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_streamreaderprotocol_constructor_use_global_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_streamreaderprotocol_constructor_use_running_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_streamreaderprotocol_constructor_without_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_unhandled_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_wait_closed_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_wait_closed_on_close_with_unread_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.GenericWatcherTests.test_create_subprocess_fails_with_inactive_watcher @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessFastWatcherTests.test_close_dont_kill_finished @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessFastWatcherTests.test_create_subprocess_exec_text_mode_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessFastWatcherTests.test_create_subprocess_shell_text_mode_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessFastWatcherTests.test_popen_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessFastWatcherTests.test_popen_error_with_stdin_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessFastWatcherTests.test_read_stdout_after_process_exit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessSafeWatcherTests.test_close_dont_kill_finished @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessSafeWatcherTests.test_create_subprocess_exec_text_mode_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessSafeWatcherTests.test_create_subprocess_shell_text_mode_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessSafeWatcherTests.test_popen_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessSafeWatcherTests.test_popen_error_with_stdin_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessSafeWatcherTests.test_read_stdout_after_process_exit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +# Transiently times out GR-52666 +!test.test_asyncio.test_subprocess.SubprocessSafeWatcherTests.test_shell @ darwin-x86_64,linux-aarch64,linux-x86_64 +!test.test_asyncio.test_subprocess.SubprocessSafeWatcherTests.test_start_new_session +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_cancel_make_subprocess_transport_exec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_cancel_post_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_cancel_process_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_close_dont_kill_finished @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_close_kill_running @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_communicate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_communicate_ignore_broken_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_create_subprocess_exec_text_mode_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_create_subprocess_exec_with_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_create_subprocess_shell_text_mode_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_devnull_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_devnull_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_devnull_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_devstdin_input @ linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_empty_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_kill @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_kill_issue43884 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_pause_reading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_popen_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_popen_error_with_stdin_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_read_stdout_after_process_exit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_shell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_start_new_session @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_stdin_broken_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_stdin_not_inheritable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_stdin_stdout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_subprocess_communicate_stdout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessThreadedWatcherTests.test_terminate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessTransportTests.test_proc_exited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessTransportTests.test_subprocess_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_cancel_children_on_child_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_cancellation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_01 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_02 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_03 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_04 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_07 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_08 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_09 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_11 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_12 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_13 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_14 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_15 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_16 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_17 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_18 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_19 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_20 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_20a @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_21a @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_22 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_23 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_24 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_25 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_finished @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_no_create_task_after_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_not_entered @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_task_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_task_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_taskgroups.TestTaskGroup.test_taskgroup_without_parent_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__enter_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__enter_task_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__leave_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__leave_task_failure1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__leave_task_failure2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__register_task_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__register_task_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__register_task_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__unregister_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__unregister_task_not_registered @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_cancellation_broadcast @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_constructor_use_global_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_constructor_use_running_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_constructor_without_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_duplicate_coroutines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_exception_marking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_issue46672 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_one_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_result_exception_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_return_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_constructor_empty_sequence_use_global_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_constructor_empty_sequence_use_running_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_constructor_empty_sequence_without_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_constructor_heterogenous_futures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_constructor_homogenous_futures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_one_cancellation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_one_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_result_exception_one_cancellation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_result_exception_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_return_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.GenericTaskTests.test_future_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyCurrentLoopTests.test_current_task_no_running_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyCurrentLoopTests.test_current_task_no_running_loop_implicit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyCurrentLoopTests.test_current_task_with_implicit_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__enter_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__enter_task_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__leave_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__leave_task_failure1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__leave_task_failure2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__register_task_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__register_task_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__register_task_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__unregister_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__unregister_task_not_registered @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_as_completed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_as_completed_concurrent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_as_completed_coroutine_use_running_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_as_completed_coroutine_without_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_as_completed_duplicate_coroutines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_as_completed_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_as_completed_reverse_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_as_completed_with_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_as_completed_with_unused_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_bare_create_named_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_bare_create_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_baseexception_during_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_at_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_awaited_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_both_task_and_inner_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_current_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_gather_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_gather_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_inner_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_task_catching @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_task_ignoring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_traceback_for_future_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_traceback_for_future_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_with_message_before_starting_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_with_message_then_future_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_with_message_then_future_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancel_yield @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancellation_exception_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_cancelling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_context_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_context_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_context_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_context_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_context_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_context_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_coroutine_non_gen_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_coroutine_non_gen_function_return_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_create_task_with_async_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_create_task_with_asynclike_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_create_task_with_noncoroutine @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_current_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_current_task_with_interleaving_tasks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_ensure_future_awaitable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_ensure_future_coroutine @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_ensure_future_error_msg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_ensure_future_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_ensure_future_neither @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_ensure_future_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_exception_chaining_after_await @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_exception_chaining_after_await_with_context_cycle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_exception_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_gather_shield @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_generic_alias @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_get_coro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_iscoroutinefunction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_log_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_other_loop_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_cancel_inner @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_cancel_outer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_coroutine_use_global_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_coroutine_use_running_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_coroutine_without_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_effect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_gather @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_shortcut @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_sleep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_sleep_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_step_result_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_stop_while_run_in_complete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_subclasses_ctask_cfuture @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_awaits_on_itself @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_cancel_message_getter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_cancel_message_setter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_cancel_sleeping_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_cancel_waiter_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_del_collect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_repr_autogenerated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_repr_name_not_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_repr_wait_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_set_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_tb_logger_not_called_after_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_uncancel_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_uncancel_structured_blocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_concurrent_complete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_duplicate_coroutines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_first_completed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_first_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_first_exception_in_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_really_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_with_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_with_iterator_of_tasks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_wait_with_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_yield_future_passes_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_yield_wait_does_not_shield_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_as_completed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_as_completed_concurrent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_as_completed_coroutine_use_running_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_as_completed_coroutine_without_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_as_completed_duplicate_coroutines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_as_completed_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_as_completed_reverse_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_as_completed_with_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_as_completed_with_unused_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_bare_create_named_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_bare_create_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_baseexception_during_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_at_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_awaited_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_both_task_and_inner_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_current_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_gather_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_gather_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_inner_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_task_catching @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_task_ignoring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_traceback_for_future_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_traceback_for_future_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_with_message_before_starting_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_with_message_then_future_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_with_message_then_future_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancel_yield @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancellation_exception_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_cancelling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_context_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_context_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_context_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_context_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_context_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_context_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_coroutine_non_gen_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_coroutine_non_gen_function_return_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_create_task_with_async_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_create_task_with_asynclike_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_create_task_with_noncoroutine @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_current_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_current_task_with_interleaving_tasks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_ensure_future_awaitable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_ensure_future_coroutine @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_ensure_future_error_msg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_ensure_future_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_ensure_future_neither @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_ensure_future_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_exception_chaining_after_await @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_exception_chaining_after_await_with_context_cycle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_exception_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_gather_shield @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_generic_alias @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_get_coro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_iscoroutinefunction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_log_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_other_loop_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_set_exception_causes_invalid_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_set_result_causes_invalid_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_cancel_inner @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_cancel_outer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_coroutine_use_global_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_coroutine_use_running_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_coroutine_without_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_effect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_gather @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_shortcut @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_sleep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_sleep_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_step_result_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_stop_while_run_in_complete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_awaits_on_itself @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_cancel_message_getter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_cancel_message_setter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_cancel_sleeping_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_cancel_waiter_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_del_collect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_repr_autogenerated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_repr_name_not_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_repr_wait_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_set_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_source_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_tb_logger_not_called_after_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_uncancel_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_uncancel_structured_blocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_concurrent_complete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_duplicate_coroutines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_first_completed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_first_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_first_exception_in_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_really_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_with_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_with_iterator_of_tasks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_wait_with_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_yield_future_passes_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_yield_wait_does_not_shield_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.RunCoroutineThreadsafeTests.test_run_coroutine_threadsafe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.RunCoroutineThreadsafeTests.test_run_coroutine_threadsafe_task_cancelled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.RunCoroutineThreadsafeTests.test_run_coroutine_threadsafe_task_factory_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.RunCoroutineThreadsafeTests.test_run_coroutine_threadsafe_with_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.RunCoroutineThreadsafeTests.test_run_coroutine_threadsafe_with_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_tasks.SleepTests.test_sleep_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_threads.ToThreadTests.test_to_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_threads.ToThreadTests.test_to_thread_args_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_threads.ToThreadTests.test_to_thread_concurrent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_threads.ToThreadTests.test_to_thread_contextvars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_threads.ToThreadTests.test_to_thread_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_threads.ToThreadTests.test_to_thread_once @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_cancel_in_timeout_after_cancellation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_foreign_cancel_doesnt_timeout_if_not_expired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_foreign_exception_on_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_foreign_exception_passed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_nested_timeout_in_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_nested_timeouts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_nested_timeouts_concurrent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_nested_timeouts_loop_busy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_outer_task_is_not_cancelled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_repr_active @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_repr_disabled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_repr_expired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_repr_finished @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_reschedule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_timeout_after_cancellation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_timeout_at_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_timeout_at_disabled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_timeout_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_timeout_disabled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_timeout_exception_cause @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_timeout_expired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_timeout_expiring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_timeout_finished @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_timeout_in_the_past_sleep_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_timeout_not_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_timeout_not_entered @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_timeout_without_task @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_timeout_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_timeout_zero_sleep_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_waiter_cancelled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_transports.TransportTests.test_ctor_extra_is_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_transports.TransportTests.test_dgram_not_implemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_transports.TransportTests.test_flowcontrol_mixin_set_write_limits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_transports.TransportTests.test_get_extra_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_transports.TransportTests.test_not_implemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_transports.TransportTests.test_subprocess_transport_not_implemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_transports.TransportTests.test_writelines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.AbstractChildWatcherTests.test_not_implemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.BaseChildWatcherTests.test_not_implemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_create_watcher @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_remove_child_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_set_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_set_loop_race_condition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld_child_reaped_elsewhere @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld_race_condition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld_remove_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld_replace_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld_two_children @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld_two_children_terminating_together @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld_unhandled_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld_unknown_pid_during_registration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld_unknown_status @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.PolicyTests.test_child_watcher_replace_mainloop_existing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.PolicyTests.test_get_child_watcher_after_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.PolicyTests.test_get_child_watcher_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.PolicyTests.test_get_default_child_watcher @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_create_watcher @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_remove_child_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_set_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_set_loop_race_condition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld_child_reaped_elsewhere @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld_race_condition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld_remove_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld_replace_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld_two_children @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld_two_children_terminating_together @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld_unhandled_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld_unknown_pid_during_registration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld_unknown_status @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_add_signal_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_add_signal_handler_coroutine_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_add_signal_handler_install_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_add_signal_handler_install_error2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_add_signal_handler_install_error3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_add_signal_handler_setup_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_check_signal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_close_on_finalizing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_handle_signal_cancelled_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_handle_signal_no_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_remove_signal_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_remove_signal_handler_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_remove_signal_handler_cleanup_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_remove_signal_handler_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_remove_signal_handler_error2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_nopath_nosock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_nossl_serverhost @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_path_inetsock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_path_sock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_pathlib @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_ssl_noserverhost @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_ssl_timeout_with_plain_sock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_bind_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_existing_path_nonsock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_existing_path_sock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_nopath_nosock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_path_dgram @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_path_inetsock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_pathlib @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_ssl_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_ssl_timeout_with_plain_sock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.TestFunctional.test_add_reader_invalid_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.TestFunctional.test_add_reader_or_writer_transport_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__call_connection_lost @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__call_connection_lost_with_err @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__read_ready @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__read_ready_blocked @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__read_ready_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__read_ready_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_close_already_closing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_ctor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_pause_reading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_pause_reading_on_closed_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_pause_reading_on_paused_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_resume_reading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_resume_reading_on_closed_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_resume_reading_on_paused_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__call_connection_lost @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__call_connection_lost_with_err @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__read_ready @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__write_ready @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__write_ready_again @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__write_ready_closing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__write_ready_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__write_ready_err @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__write_ready_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_abort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_can_write_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_close_closing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_ctor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_again @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_eof_pending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_err @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_no_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_asyncio_wait_for_cancelled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_asyncio_wait_for_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_cancel_blocking_wait_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_cancel_wait_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_blocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_cancellation_race_condition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_race_condition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_reraises_exception_during_cancellation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_self_cancellation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_timeout_less_then_0_or_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_timeout_less_then_0_or_0_coroutine_do_not_started @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_timeout_less_then_0_or_0_future_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_waits_for_task_cancellation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncio.test_waitfor.AsyncioWaitForTest.test_wait_for_waits_for_task_cancellation_w_timeout_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_asyncore.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_asyncore.txt index adb48dcb17..decd8a4231 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_asyncore.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_asyncore.txt @@ -1,98 +1,51 @@ -*graalpython.lib-python.3.test.test_asyncore.DispatcherTests.test_basic -*graalpython.lib-python.3.test.test_asyncore.DispatcherTests.test_log -*graalpython.lib-python.3.test.test_asyncore.DispatcherTests.test_log_info -*graalpython.lib-python.3.test.test_asyncore.DispatcherTests.test_repr -*graalpython.lib-python.3.test.test_asyncore.DispatcherTests.test_strerror -*graalpython.lib-python.3.test.test_asyncore.DispatcherTests.test_unhandled -*graalpython.lib-python.3.test.test_asyncore.DispatcherWithSendTests.test_send -*graalpython.lib-python.3.test.test_asyncore.FileWrapperTest.test_close_twice -*graalpython.lib-python.3.test.test_asyncore.FileWrapperTest.test_dispatcher -*graalpython.lib-python.3.test.test_asyncore.FileWrapperTest.test_recv -*graalpython.lib-python.3.test.test_asyncore.FileWrapperTest.test_send -*graalpython.lib-python.3.test.test_asyncore.HelperFunctionTests.test_closeall -*graalpython.lib-python.3.test.test_asyncore.HelperFunctionTests.test_closeall_default -*graalpython.lib-python.3.test.test_asyncore.HelperFunctionTests.test_compact_traceback -*graalpython.lib-python.3.test.test_asyncore.HelperFunctionTests.test_readwrite -*graalpython.lib-python.3.test.test_asyncore.HelperFunctionTests.test_readwriteexc -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Poll.test_bind -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Poll.test_connection_attributes -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Poll.test_create_socket -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Poll.test_handle_accept -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Poll.test_handle_accepted -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Poll.test_handle_close -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Poll.test_handle_close_after_conn_broken -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Poll.test_handle_connect -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Poll.test_handle_error -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Poll.test_handle_expt -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Poll.test_handle_read -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Poll.test_handle_write -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Poll.test_quick_connect -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Poll.test_set_reuse_addr -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Select.test_bind -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Select.test_connection_attributes -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Select.test_create_socket -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Select.test_handle_accept -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Select.test_handle_accepted -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Select.test_handle_close -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Select.test_handle_close_after_conn_broken -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Select.test_handle_connect -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Select.test_handle_error -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Select.test_handle_read -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Select.test_handle_write -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Select.test_quick_connect -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv4Select.test_set_reuse_addr -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Poll.test_bind -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Poll.test_connection_attributes -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Poll.test_create_socket -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Poll.test_handle_accept -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Poll.test_handle_accepted -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Poll.test_handle_close -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Poll.test_handle_close_after_conn_broken -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Poll.test_handle_connect -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Poll.test_handle_error -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Poll.test_handle_expt -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Poll.test_handle_read -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Poll.test_handle_write -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Poll.test_quick_connect -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Poll.test_set_reuse_addr -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Select.test_bind -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Select.test_connection_attributes -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Select.test_create_socket -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Select.test_handle_accept -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Select.test_handle_accepted -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Select.test_handle_close -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Select.test_handle_close_after_conn_broken -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Select.test_handle_connect -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Select.test_handle_error -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Select.test_handle_read -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Select.test_handle_write -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Select.test_quick_connect -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseIPv6Select.test_set_reuse_addr -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsPoll.test_bind -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsPoll.test_connection_attributes -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsPoll.test_create_socket -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsPoll.test_handle_accept -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsPoll.test_handle_accepted -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsPoll.test_handle_close -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsPoll.test_handle_close_after_conn_broken -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsPoll.test_handle_connect -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsPoll.test_handle_error -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsPoll.test_handle_expt -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsPoll.test_handle_read -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsPoll.test_handle_write -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsPoll.test_quick_connect -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsPoll.test_set_reuse_addr -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_bind -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_connection_attributes -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_create_socket -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_accept -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_accepted -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_close -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_close_after_conn_broken -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_connect -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_error -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_expt -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_read -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_write -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_quick_connect -*graalpython.lib-python.3.test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_set_reuse_addr +test.test_asyncore.DispatcherTests.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncore.DispatcherTests.test_log @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncore.DispatcherTests.test_log_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncore.DispatcherTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncore.DispatcherTests.test_strerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncore.DispatcherTests.test_unhandled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncore.DispatcherWithSendTests.test_send @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.FileWrapperTest.test_close_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.FileWrapperTest.test_dispatcher @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.FileWrapperTest.test_recv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.FileWrapperTest.test_send @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.HelperFunctionTests.test_closeall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncore.HelperFunctionTests.test_closeall_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncore.HelperFunctionTests.test_compact_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncore.HelperFunctionTests.test_readwriteexc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_asyncore.TestAPI_UseIPv4Select.test_bind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_connection_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_create_socket @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_handle_accept @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_handle_accepted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_handle_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_handle_close_after_conn_broken @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_handle_connect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_handle_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_handle_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_handle_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_quick_connect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_set_reuse_addr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_bind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_connection_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_create_socket @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_handle_accept @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_handle_accepted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_handle_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_handle_close_after_conn_broken @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_handle_connect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_handle_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_handle_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_handle_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_quick_connect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_set_reuse_addr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_connection_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_create_socket @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_accept @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_accepted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_close_after_conn_broken @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_connect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_atexit.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_atexit.txt index ca95e9d9c8..b84d3d650c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_atexit.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_atexit.txt @@ -1,16 +1 @@ -*graalpython.lib-python.3.test.test_atexit.FunctionalTest.test_shutdown -*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_args -*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_badargs -*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_bound_methods -*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_clear -*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_exit -*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_order -*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_print_tracebacks -*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_raise -*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_raise_unnormalized -*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_shutdown -*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_stress -*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_unregister -*graalpython.lib-python.3.test.test_atexit.SubinterpreterTest.test_callback_on_subinterpreter_teardown -*graalpython.lib-python.3.test.test_atexit.SubinterpreterTest.test_callbacks_leak -*graalpython.lib-python.3.test.test_atexit.SubinterpreterTest.test_callbacks_leak_refcycle +test.test_atexit.FunctionalTest.test_shutdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_audit.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_audit.txt deleted file mode 100644 index ce3bc03929..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_audit.txt +++ /dev/null @@ -1,2 +0,0 @@ -*graalpython.lib-python.3.test.test_audit.AuditTest.test_syslog -*graalpython.lib-python.3.test.test_audit.AuditTest.test_winreg diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_augassign.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_augassign.txt index 44ce8dd997..e44851bb2a 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_augassign.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_augassign.txt @@ -1,7 +1,7 @@ -*graalpython.lib-python.3.test.test_augassign.AugAssignTest.testBasic -*graalpython.lib-python.3.test.test_augassign.AugAssignTest.testCustomMethods1 -*graalpython.lib-python.3.test.test_augassign.AugAssignTest.testCustomMethods2 -*graalpython.lib-python.3.test.test_augassign.AugAssignTest.testInDict -*graalpython.lib-python.3.test.test_augassign.AugAssignTest.testInList -*graalpython.lib-python.3.test.test_augassign.AugAssignTest.testSequences -*graalpython.lib-python.3.test.test_augassign.AugAssignTest.test_with_unpacking +test.test_augassign.AugAssignTest.testBasic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_augassign.AugAssignTest.testCustomMethods1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_augassign.AugAssignTest.testCustomMethods2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_augassign.AugAssignTest.testInDict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_augassign.AugAssignTest.testInList @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_augassign.AugAssignTest.testSequences @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_augassign.AugAssignTest.test_with_unpacking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_base64.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_base64.txt index 3962223526..8a0de78885 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_base64.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_base64.txt @@ -1,36 +1,36 @@ -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_ErrorHeritage -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_RFC4648_test_cases -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_a85_padding -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_a85decode -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_a85decode_errors -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_a85encode -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b16decode -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b16encode -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b32decode -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b32decode_casefold -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b32decode_error -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b32encode -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b32hexdecode -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b32hexdecode_error -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b32hexdecode_other_types -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b32hexencode -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b32hexencode_other_types -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b64decode -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b64decode_invalid_chars -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b64decode_padding_error -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b64encode -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b85_padding -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b85decode -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b85decode_errors -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_b85encode -*graalpython.lib-python.3.test.test_base64.BaseXYTestCase.test_decode_nonascii_str -*graalpython.lib-python.3.test.test_base64.LegacyBase64TestCase.test_decode -*graalpython.lib-python.3.test.test_base64.LegacyBase64TestCase.test_decodebytes -*graalpython.lib-python.3.test.test_base64.LegacyBase64TestCase.test_encode -*graalpython.lib-python.3.test.test_base64.LegacyBase64TestCase.test_encodebytes -*graalpython.lib-python.3.test.test_base64.TestMain.test_decode -*graalpython.lib-python.3.test.test_base64.TestMain.test_encode_decode -*graalpython.lib-python.3.test.test_base64.TestMain.test_encode_file -*graalpython.lib-python.3.test.test_base64.TestMain.test_encode_from_stdin -*graalpython.lib-python.3.test.test_base64.TestMain.test_prints_usage_with_help_flag -*graalpython.lib-python.3.test.test_base64.TestMain.test_prints_usage_with_invalid_flag +test.test_base64.BaseXYTestCase.test_ErrorHeritage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_RFC4648_test_cases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_a85_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_a85decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_a85decode_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_a85encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b16decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b16encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b32decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b32decode_casefold @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b32decode_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b32encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b32hexdecode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b32hexdecode_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b32hexdecode_other_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b32hexencode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b32hexencode_other_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b64decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b64decode_invalid_chars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b64decode_padding_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b64encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b85_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b85decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b85decode_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_b85encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.BaseXYTestCase.test_decode_nonascii_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.LegacyBase64TestCase.test_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.LegacyBase64TestCase.test_decodebytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.LegacyBase64TestCase.test_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.LegacyBase64TestCase.test_encodebytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.TestMain.test_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_base64.TestMain.test_encode_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.TestMain.test_encode_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_base64.TestMain.test_encode_from_stdin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_base64.TestMain.test_prints_usage_with_help_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_base64.TestMain.test_prints_usage_with_invalid_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_baseexception.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_baseexception.txt index 15e9091fc9..3306160199 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_baseexception.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_baseexception.txt @@ -1,11 +1,11 @@ -*graalpython.lib-python.3.test.test_baseexception.ExceptionClassTests.test_builtins_new_style -*graalpython.lib-python.3.test.test_baseexception.ExceptionClassTests.test_inheritance -*graalpython.lib-python.3.test.test_baseexception.ExceptionClassTests.test_interface_multi_arg -*graalpython.lib-python.3.test.test_baseexception.ExceptionClassTests.test_interface_no_arg -*graalpython.lib-python.3.test.test_baseexception.ExceptionClassTests.test_interface_single_arg -*graalpython.lib-python.3.test.test_baseexception.ExceptionClassTests.test_setstate_refcount_no_crash -*graalpython.lib-python.3.test.test_baseexception.UsageTests.test_catch_BaseException_instance -*graalpython.lib-python.3.test.test_baseexception.UsageTests.test_catch_non_BaseException -*graalpython.lib-python.3.test.test_baseexception.UsageTests.test_catch_string -*graalpython.lib-python.3.test.test_baseexception.UsageTests.test_raise_new_style_non_exception -*graalpython.lib-python.3.test.test_baseexception.UsageTests.test_raise_string +test.test_baseexception.ExceptionClassTests.test_builtins_new_style @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_baseexception.ExceptionClassTests.test_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_baseexception.ExceptionClassTests.test_interface_multi_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_baseexception.ExceptionClassTests.test_interface_no_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_baseexception.ExceptionClassTests.test_interface_single_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_baseexception.ExceptionClassTests.test_setstate_refcount_no_crash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_baseexception.UsageTests.test_catch_BaseException_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_baseexception.UsageTests.test_catch_non_BaseException @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_baseexception.UsageTests.test_catch_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_baseexception.UsageTests.test_raise_new_style_non_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_baseexception.UsageTests.test_raise_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bdb.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bdb.txt index 2a861121d6..a8ef664f59 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bdb.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bdb.txt @@ -1,30 +1,30 @@ -*graalpython.lib-python.3.test.test_bdb.BreakpointTestCase.test_bp_after_last_statement -*graalpython.lib-python.3.test.test_bdb.BreakpointTestCase.test_bp_condition -*graalpython.lib-python.3.test.test_bdb.BreakpointTestCase.test_bp_exception_on_condition_evaluation -*graalpython.lib-python.3.test.test_bdb.BreakpointTestCase.test_bp_ignore_count -*graalpython.lib-python.3.test.test_bdb.BreakpointTestCase.test_bp_on_non_existent_module -*graalpython.lib-python.3.test.test_bdb.BreakpointTestCase.test_clear_at_no_bp -*graalpython.lib-python.3.test.test_bdb.BreakpointTestCase.test_clear_two_bp_on_same_line -*graalpython.lib-python.3.test.test_bdb.BreakpointTestCase.test_disabled_temporary_bp -*graalpython.lib-python.3.test.test_bdb.BreakpointTestCase.test_ignore_count_on_disabled_bp -*graalpython.lib-python.3.test.test_bdb.BreakpointTestCase.test_load_bps_from_previous_Bdb_instance -*graalpython.lib-python.3.test.test_bdb.BreakpointTestCase.test_temporary_bp -*graalpython.lib-python.3.test.test_bdb.IssuesTestCase.test_step_at_return_with_no_trace_in_caller -*graalpython.lib-python.3.test.test_bdb.RunTestCase.test_run_step -*graalpython.lib-python.3.test.test_bdb.RunTestCase.test_runeval_step -*graalpython.lib-python.3.test.test_bdb.StateTestCase.test_down -*graalpython.lib-python.3.test.test_bdb.StateTestCase.test_next -*graalpython.lib-python.3.test.test_bdb.StateTestCase.test_next_in_caller_frame -*graalpython.lib-python.3.test.test_bdb.StateTestCase.test_next_on_plain_statement -*graalpython.lib-python.3.test.test_bdb.StateTestCase.test_next_over_import -*graalpython.lib-python.3.test.test_bdb.StateTestCase.test_return -*graalpython.lib-python.3.test.test_bdb.StateTestCase.test_return_in_caller_frame -*graalpython.lib-python.3.test.test_bdb.StateTestCase.test_skip -*graalpython.lib-python.3.test.test_bdb.StateTestCase.test_skip_with_no_name_module -*graalpython.lib-python.3.test.test_bdb.StateTestCase.test_step -*graalpython.lib-python.3.test.test_bdb.StateTestCase.test_step_next_on_last_statement -*graalpython.lib-python.3.test.test_bdb.StateTestCase.test_until -*graalpython.lib-python.3.test.test_bdb.StateTestCase.test_until_in_caller_frame -*graalpython.lib-python.3.test.test_bdb.StateTestCase.test_until_with_too_large_count -*graalpython.lib-python.3.test.test_bdb.StateTestCase.test_up -*graalpython.lib-python.3.test.test_bdb.TestRegressions.test_format_stack_entry_no_lineno +test.test_bdb.BreakpointTestCase.test_bp_after_last_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.BreakpointTestCase.test_bp_condition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.BreakpointTestCase.test_bp_exception_on_condition_evaluation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.BreakpointTestCase.test_bp_ignore_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.BreakpointTestCase.test_bp_on_non_existent_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.BreakpointTestCase.test_clear_at_no_bp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.BreakpointTestCase.test_clear_two_bp_on_same_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.BreakpointTestCase.test_disabled_temporary_bp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.BreakpointTestCase.test_ignore_count_on_disabled_bp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.BreakpointTestCase.test_load_bps_from_previous_Bdb_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.BreakpointTestCase.test_temporary_bp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.IssuesTestCase.test_step_at_return_with_no_trace_in_caller @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.RunTestCase.test_run_step @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.RunTestCase.test_runeval_step @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.StateTestCase.test_down @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.StateTestCase.test_next @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.StateTestCase.test_next_in_caller_frame @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.StateTestCase.test_next_on_plain_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.StateTestCase.test_next_over_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.StateTestCase.test_return @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.StateTestCase.test_return_in_caller_frame @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.StateTestCase.test_skip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.StateTestCase.test_skip_with_no_name_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.StateTestCase.test_step @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.StateTestCase.test_step_next_on_last_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.StateTestCase.test_until @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.StateTestCase.test_until_in_caller_frame @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.StateTestCase.test_until_with_too_large_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.StateTestCase.test_up @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bdb.TestRegressions.test_format_stack_entry_no_lineno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bigaddrspace.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bigaddrspace.txt deleted file mode 100644 index f582ea0ce1..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bigaddrspace.txt +++ /dev/null @@ -1,7 +0,0 @@ -*graalpython.lib-python.3.test.test_bigaddrspace.BytesTest.test_concat -*graalpython.lib-python.3.test.test_bigaddrspace.BytesTest.test_optimized_concat -*graalpython.lib-python.3.test.test_bigaddrspace.BytesTest.test_repeat -*graalpython.lib-python.3.test.test_bigaddrspace.StrTest.test_concat -*graalpython.lib-python.3.test.test_bigaddrspace.StrTest.test_optimized_concat -*graalpython.lib-python.3.test.test_bigaddrspace.StrTest.test_repeat -*graalpython.lib-python.3.test.test_bigaddrspace.TestMain.test_main diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bigmem.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bigmem.txt index f1fde9a885..533f1bfb0b 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bigmem.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bigmem.txt @@ -1,161 +1,161 @@ -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_capitalize -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_center -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_compare -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_concat -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_contains -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_count -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_decode -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_endswith -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_expandtabs -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_find -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_index -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_isalnum -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_isalpha -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_isdigit -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_islower -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_isspace -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_istitle -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_isupper -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_join -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_ljust -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_lower -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_lstrip -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_repeat -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_replace -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_rfind -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_rindex -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_rjust -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_rstrip -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_slice_and_getitem -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_split_small -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_splitlines -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_startswith -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_strip -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_swapcase -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_title -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_translate -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_upper -*graalpython.lib-python.3.test.test_bigmem.BytearrayTest.test_zfill -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_capitalize -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_center -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_compare -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_concat -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_contains -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_count -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_decode -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_endswith -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_expandtabs -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_find -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_hash -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_index -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_isalnum -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_isalpha -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_isdigit -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_islower -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_isspace -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_istitle -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_isupper -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_join -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_ljust -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_lower -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_repeat -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_replace -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_rfind -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_rindex -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_rjust -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_slice_and_getitem -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_split_large -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_split_small -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_splitlines -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_startswith -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_strip -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_swapcase -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_title -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_translate -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_upper -*graalpython.lib-python.3.test.test_bigmem.BytesTest.test_zfill -*graalpython.lib-python.3.test.test_bigmem.DictTest.test_dict -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_append -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_compare -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_concat_large -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_concat_small -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_contains -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_count -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_extend_large -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_extend_small -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_hash -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_index -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_index_and_slice -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_inplace_concat_large -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_inplace_concat_small -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_inplace_repeat_large -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_inplace_repeat_small -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_insert -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_pop -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_remove -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_repeat_large -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_repeat_small -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_repr_large -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_repr_small -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_reverse -*graalpython.lib-python.3.test.test_bigmem.ListTest.test_sort -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_capitalize -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_center -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_compare -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_concat -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_contains -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_count -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_encode -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_encode_ascii -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_encode_raw_unicode_escape -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_encode_utf32 -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_encode_utf7 -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_endswith -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_expandtabs -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_find -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_format -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_index -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_isalnum -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_isalpha -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_isdigit -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_islower -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_isspace -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_istitle -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_isupper -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_join -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_ljust -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_lower -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_lstrip -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_repeat -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_replace -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_repr_large -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_repr_small -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_rfind -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_rindex -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_rjust -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_rstrip -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_split_large -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_split_small -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_splitlines -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_startswith -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_strip -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_swapcase -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_title -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_translate -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_unicode_repr -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_unicode_repr_wide -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_upper -*graalpython.lib-python.3.test.test_bigmem.StrTest.test_zfill -*graalpython.lib-python.3.test.test_bigmem.TupleTest.test_compare -*graalpython.lib-python.3.test.test_bigmem.TupleTest.test_concat_large -*graalpython.lib-python.3.test.test_bigmem.TupleTest.test_concat_small -*graalpython.lib-python.3.test.test_bigmem.TupleTest.test_contains -*graalpython.lib-python.3.test.test_bigmem.TupleTest.test_from_2G_generator -*graalpython.lib-python.3.test.test_bigmem.TupleTest.test_from_almost_2G_generator -*graalpython.lib-python.3.test.test_bigmem.TupleTest.test_hash -*graalpython.lib-python.3.test.test_bigmem.TupleTest.test_index_and_slice -*graalpython.lib-python.3.test.test_bigmem.TupleTest.test_repeat_large -*graalpython.lib-python.3.test.test_bigmem.TupleTest.test_repeat_large_2 -*graalpython.lib-python.3.test.test_bigmem.TupleTest.test_repeat_small -*graalpython.lib-python.3.test.test_bigmem.TupleTest.test_repr_large -*graalpython.lib-python.3.test.test_bigmem.TupleTest.test_repr_small +test.test_bigmem.BytearrayTest.test_capitalize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_center @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_concat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_endswith @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_expandtabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_find @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_isalnum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_isalpha @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_isdigit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_islower @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_isspace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_istitle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_isupper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_ljust @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_lower @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_lstrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_rfind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_rindex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_rjust @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_rstrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_slice_and_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_split_small @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_splitlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_startswith @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_strip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_swapcase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_title @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_translate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_upper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytearrayTest.test_zfill @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_capitalize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_center @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_concat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_endswith @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_expandtabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_find @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_isalnum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_isalpha @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_isdigit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_islower @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_isspace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_istitle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_isupper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_ljust @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_lower @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_rfind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_rindex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_rjust @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_slice_and_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_split_large @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_split_small @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_splitlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_startswith @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_strip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_swapcase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_title @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_translate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_upper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.BytesTest.test_zfill @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.DictTest.test_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_concat_large @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_concat_small @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_extend_large @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_extend_small @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_index_and_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_inplace_concat_large @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_inplace_concat_small @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_inplace_repeat_large @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_inplace_repeat_small @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_repeat_large @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_repeat_small @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_repr_large @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_repr_small @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.ListTest.test_sort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_capitalize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_center @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_concat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_encode_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_encode_raw_unicode_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_encode_utf32 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_encode_utf7 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_endswith @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_expandtabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_find @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_isalnum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_isalpha @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_isdigit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_islower @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_isspace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_istitle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_isupper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_ljust @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_lower @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_lstrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_repr_large @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_repr_small @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_rfind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_rindex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_rjust @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_rstrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_split_large @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_split_small @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_splitlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_startswith @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_strip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_swapcase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_title @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_translate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_unicode_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_unicode_repr_wide @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_upper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.StrTest.test_zfill @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.TupleTest.test_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.TupleTest.test_concat_large @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.TupleTest.test_concat_small @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.TupleTest.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.TupleTest.test_from_2G_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.TupleTest.test_from_almost_2G_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.TupleTest.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.TupleTest.test_index_and_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.TupleTest.test_repeat_large @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.TupleTest.test_repeat_large_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.TupleTest.test_repeat_small @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.TupleTest.test_repr_large @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bigmem.TupleTest.test_repr_small @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_binascii.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_binascii.txt index b37942ca91..84b1a54539 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_binascii.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_binascii.txt @@ -1,29 +1,28 @@ -*graalpython.lib-python.3.test.test_binascii.ArrayBinASCIITest.test_b2a_base64_newline -*graalpython.lib-python.3.test.test_binascii.ArrayBinASCIITest.test_base64valid -*graalpython.lib-python.3.test.test_binascii.ArrayBinASCIITest.test_c_contiguity -*graalpython.lib-python.3.test.test_binascii.ArrayBinASCIITest.test_crc32 -*graalpython.lib-python.3.test.test_binascii.ArrayBinASCIITest.test_crc_hqx -*graalpython.lib-python.3.test.test_binascii.ArrayBinASCIITest.test_exceptions -*graalpython.lib-python.3.test.test_binascii.ArrayBinASCIITest.test_hex -*graalpython.lib-python.3.test.test_binascii.BinASCIITest.test_b2a_base64_newline -*graalpython.lib-python.3.test.test_binascii.BinASCIITest.test_base64valid -*graalpython.lib-python.3.test.test_binascii.BinASCIITest.test_c_contiguity -*graalpython.lib-python.3.test.test_binascii.BinASCIITest.test_crc32 -*graalpython.lib-python.3.test.test_binascii.BinASCIITest.test_crc_hqx -*graalpython.lib-python.3.test.test_binascii.BinASCIITest.test_exceptions -*graalpython.lib-python.3.test.test_binascii.BinASCIITest.test_hex -*graalpython.lib-python.3.test.test_binascii.BytearrayBinASCIITest.test_b2a_base64_newline -*graalpython.lib-python.3.test.test_binascii.BytearrayBinASCIITest.test_base64valid -*graalpython.lib-python.3.test.test_binascii.BytearrayBinASCIITest.test_c_contiguity -*graalpython.lib-python.3.test.test_binascii.BytearrayBinASCIITest.test_crc32 -*graalpython.lib-python.3.test.test_binascii.BytearrayBinASCIITest.test_crc_hqx -*graalpython.lib-python.3.test.test_binascii.BytearrayBinASCIITest.test_exceptions -*graalpython.lib-python.3.test.test_binascii.BytearrayBinASCIITest.test_hex -*graalpython.lib-python.3.test.test_binascii.ChecksumBigBufferTestCase.test_big_buffer -*graalpython.lib-python.3.test.test_binascii.MemoryviewBinASCIITest.test_b2a_base64_newline -*graalpython.lib-python.3.test.test_binascii.MemoryviewBinASCIITest.test_base64valid -*graalpython.lib-python.3.test.test_binascii.MemoryviewBinASCIITest.test_c_contiguity -*graalpython.lib-python.3.test.test_binascii.MemoryviewBinASCIITest.test_crc32 -*graalpython.lib-python.3.test.test_binascii.MemoryviewBinASCIITest.test_crc_hqx -*graalpython.lib-python.3.test.test_binascii.MemoryviewBinASCIITest.test_exceptions -*graalpython.lib-python.3.test.test_binascii.MemoryviewBinASCIITest.test_hex +test.test_binascii.ArrayBinASCIITest.test_b2a_base64_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.ArrayBinASCIITest.test_base64valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.ArrayBinASCIITest.test_c_contiguity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.ArrayBinASCIITest.test_crc32 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.ArrayBinASCIITest.test_crc_hqx @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.ArrayBinASCIITest.test_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.ArrayBinASCIITest.test_hex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.BinASCIITest.test_b2a_base64_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.BinASCIITest.test_base64valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.BinASCIITest.test_c_contiguity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.BinASCIITest.test_crc32 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.BinASCIITest.test_crc_hqx @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.BinASCIITest.test_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.BinASCIITest.test_hex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.BytearrayBinASCIITest.test_b2a_base64_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.BytearrayBinASCIITest.test_base64valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.BytearrayBinASCIITest.test_c_contiguity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.BytearrayBinASCIITest.test_crc32 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.BytearrayBinASCIITest.test_crc_hqx @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.BytearrayBinASCIITest.test_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.BytearrayBinASCIITest.test_hex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.MemoryviewBinASCIITest.test_b2a_base64_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.MemoryviewBinASCIITest.test_base64valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.MemoryviewBinASCIITest.test_c_contiguity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.MemoryviewBinASCIITest.test_crc32 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.MemoryviewBinASCIITest.test_crc_hqx @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.MemoryviewBinASCIITest.test_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binascii.MemoryviewBinASCIITest.test_hex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_binop.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_binop.txt index d77b872b1b..76552f2035 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_binop.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_binop.txt @@ -1,12 +1,12 @@ -*graalpython.lib-python.3.test.test_binop.FallbackBlockingTests.test_fallback_ne_blocking -*graalpython.lib-python.3.test.test_binop.FallbackBlockingTests.test_fallback_rmethod_blocking -*graalpython.lib-python.3.test.test_binop.OperationOrderTests.test_comparison_orders -*graalpython.lib-python.3.test.test_binop.RatTestCase.test_add -*graalpython.lib-python.3.test.test_binop.RatTestCase.test_constructor -*graalpython.lib-python.3.test.test_binop.RatTestCase.test_div -*graalpython.lib-python.3.test.test_binop.RatTestCase.test_eq -*graalpython.lib-python.3.test.test_binop.RatTestCase.test_floordiv -*graalpython.lib-python.3.test.test_binop.RatTestCase.test_gcd -*graalpython.lib-python.3.test.test_binop.RatTestCase.test_mul -*graalpython.lib-python.3.test.test_binop.RatTestCase.test_sub -*graalpython.lib-python.3.test.test_binop.RatTestCase.test_true_div +test.test_binop.FallbackBlockingTests.test_fallback_ne_blocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binop.FallbackBlockingTests.test_fallback_rmethod_blocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binop.OperationOrderTests.test_comparison_orders @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binop.RatTestCase.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binop.RatTestCase.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binop.RatTestCase.test_div @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binop.RatTestCase.test_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binop.RatTestCase.test_floordiv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binop.RatTestCase.test_gcd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binop.RatTestCase.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binop.RatTestCase.test_sub @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_binop.RatTestCase.test_true_div @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bisect.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bisect.txt index e758092ddb..4850f42af5 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bisect.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bisect.txt @@ -1,21 +1,21 @@ -*graalpython.lib-python.3.test.test_bisect.TestBisectPython.test_backcompatibility -*graalpython.lib-python.3.test.test_bisect.TestBisectPython.test_insort -*graalpython.lib-python.3.test.test_bisect.TestBisectPython.test_insort_keynotNone -*graalpython.lib-python.3.test.test_bisect.TestBisectPython.test_keyword_args -*graalpython.lib-python.3.test.test_bisect.TestBisectPython.test_large_pyrange -*graalpython.lib-python.3.test.test_bisect.TestBisectPython.test_large_range -*graalpython.lib-python.3.test.test_bisect.TestBisectPython.test_lookups_with_key_function -*graalpython.lib-python.3.test.test_bisect.TestBisectPython.test_negative_lo -*graalpython.lib-python.3.test.test_bisect.TestBisectPython.test_optionalSlicing -*graalpython.lib-python.3.test.test_bisect.TestBisectPython.test_precomputed -*graalpython.lib-python.3.test.test_bisect.TestBisectPython.test_random -*graalpython.lib-python.3.test.test_bisect.TestDocExamplePython.test_colors -*graalpython.lib-python.3.test.test_bisect.TestDocExamplePython.test_grades -*graalpython.lib-python.3.test.test_bisect.TestErrorHandlingPython.test_arg_parsing -*graalpython.lib-python.3.test.test_bisect.TestErrorHandlingPython.test_cmp_err -*graalpython.lib-python.3.test.test_bisect.TestErrorHandlingPython.test_get_only -*graalpython.lib-python.3.test.test_bisect.TestErrorHandlingPython.test_len_only -*graalpython.lib-python.3.test.test_bisect.TestErrorHandlingPython.test_non_sequence -*graalpython.lib-python.3.test.test_bisect.TestInsortPython.test_backcompatibility -*graalpython.lib-python.3.test.test_bisect.TestInsortPython.test_listDerived -*graalpython.lib-python.3.test.test_bisect.TestInsortPython.test_vsBuiltinSort +test.test_bisect.TestBisectPython.test_backcompatibility @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestBisectPython.test_insort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestBisectPython.test_insort_keynotNone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestBisectPython.test_keyword_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestBisectPython.test_large_pyrange @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestBisectPython.test_large_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestBisectPython.test_lookups_with_key_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestBisectPython.test_negative_lo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestBisectPython.test_optionalSlicing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestBisectPython.test_precomputed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestBisectPython.test_random @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestDocExamplePython.test_colors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestDocExamplePython.test_grades @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestErrorHandlingPython.test_arg_parsing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestErrorHandlingPython.test_cmp_err @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestErrorHandlingPython.test_get_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestErrorHandlingPython.test_len_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestErrorHandlingPython.test_non_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestInsortPython.test_backcompatibility @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestInsortPython.test_listDerived @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bisect.TestInsortPython.test_vsBuiltinSort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bool.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bool.txt index cbe54ec5ab..f254c11d18 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bool.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bool.txt @@ -1,32 +1,30 @@ -*graalpython.lib-python.3.test.test_bool.BoolTest.test_blocked -*graalpython.lib-python.3.test.test_bool.BoolTest.test_bool_called_at_least_once -*graalpython.lib-python.3.test.test_bool.BoolTest.test_bool_new -*graalpython.lib-python.3.test.test_bool.BoolTest.test_boolean -*graalpython.lib-python.3.test.test_bool.BoolTest.test_callable -*graalpython.lib-python.3.test.test_bool.BoolTest.test_complex -*graalpython.lib-python.3.test.test_bool.BoolTest.test_contains -*graalpython.lib-python.3.test.test_bool.BoolTest.test_convert -*graalpython.lib-python.3.test.test_bool.BoolTest.test_convert_to_bool -*graalpython.lib-python.3.test.test_bool.BoolTest.test_fileclosed -*graalpython.lib-python.3.test.test_bool.BoolTest.test_float -*graalpython.lib-python.3.test.test_bool.BoolTest.test_format -*graalpython.lib-python.3.test.test_bool.BoolTest.test_from_bytes -*graalpython.lib-python.3.test.test_bool.BoolTest.test_hasattr -*graalpython.lib-python.3.test.test_bool.BoolTest.test_int -*graalpython.lib-python.3.test.test_bool.BoolTest.test_isinstance -*graalpython.lib-python.3.test.test_bool.BoolTest.test_issubclass -*graalpython.lib-python.3.test.test_bool.BoolTest.test_keyword_args -*graalpython.lib-python.3.test.test_bool.BoolTest.test_marshal -*graalpython.lib-python.3.test.test_bool.BoolTest.test_math -*graalpython.lib-python.3.test.test_bool.BoolTest.test_operator -*graalpython.lib-python.3.test.test_bool.BoolTest.test_pickle -*graalpython.lib-python.3.test.test_bool.BoolTest.test_picklevalues -*graalpython.lib-python.3.test.test_bool.BoolTest.test_print -*graalpython.lib-python.3.test.test_bool.BoolTest.test_real_and_imag -*graalpython.lib-python.3.test.test_bool.BoolTest.test_repr -*graalpython.lib-python.3.test.test_bool.BoolTest.test_sane_len -*graalpython.lib-python.3.test.test_bool.BoolTest.test_str -*graalpython.lib-python.3.test.test_bool.BoolTest.test_string -*graalpython.lib-python.3.test.test_bool.BoolTest.test_subclass -*graalpython.lib-python.3.test.test_bool.BoolTest.test_types -*graalpython.lib-python.3.test.test_bool.TestMain.test_main +test.test_bool.BoolTest.test_blocked @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_bool_called_at_least_once @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_bool_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_boolean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_callable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_complex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_convert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_convert_to_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_fileclosed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_hasattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_isinstance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_issubclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_keyword_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_math @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_picklevalues @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_real_and_imag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_sane_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bool.BoolTest.test_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_buffer.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_buffer.txt index d33b575c08..435ba7e603 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_buffer.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_buffer.txt @@ -1,33 +1,37 @@ -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_issue_7385 -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_memoryview_array -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_memoryview_cast -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_memoryview_cast_zero_shape -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_memoryview_cast_zero_strides -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_memoryview_check_released -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_memoryview_compare_multidim_zero_shape -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_memoryview_compare_zero_shape -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_memoryview_getbuffer_undefined -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_memoryview_index -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_memoryview_redirect -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_memoryview_repr -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_memoryview_sequence -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_memoryview_serializing -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_memoryview_sizeof -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_memoryview_tolist -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_ndarray_cmp_contig -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_ndarray_fortran -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_ndarray_hash -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_ndarray_index_invalid -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_ndarray_index_null_strides -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_ndarray_index_scalar -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_ndarray_linked_list -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_ndarray_memoryview_from_buffer -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_ndarray_offset -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_ndarray_random_invalid -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_ndarray_re_export -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_ndarray_slice_zero_shape -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_ndarray_tolist_null_strides -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_ndarray_zero_shape -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_ndarray_zero_strides -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_py_buffer_to_contiguous -*graalpython.lib-python.3.test.test_buffer.TestBufferProtocol.test_pybuffer_size_from_format +test.test_buffer.TestBufferProtocol.test_issue_7385 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_cast @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_cast_zero_shape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_cast_zero_strides @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_check_released @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_compare_multidim_zero_shape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_compare_zero_shape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_getbuffer_undefined @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_redirect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_serializing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_tolist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_cmp_contig @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_fortran @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +# Transient lists differ error GR-49936 +!test.test_buffer.TestBufferProtocol.test_ndarray_index_getitem_multidim @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_index_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_index_null_strides @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_index_scalar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_linked_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_memoryview_from_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_random_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_re_export @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +# Transient lists differ error GR-49936 +!test.test_buffer.TestBufferProtocol.test_ndarray_slice_assign_multidim @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_buffer.TestBufferProtocol.test_ndarray_slice_multidim @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_buffer.TestBufferProtocol.test_ndarray_slice_redundant_suboffsets @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_slice_zero_shape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_tolist_null_strides @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_zero_shape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_zero_strides @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_buffer.TestBufferProtocol.test_py_buffer_to_contiguous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bufio.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bufio.txt index 2e5bc6ef1e..46eee72bb6 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bufio.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bufio.txt @@ -1,4 +1,4 @@ -*graalpython.lib-python.3.test.test_bufio.CBufferSizeTest.test_nullpat -*graalpython.lib-python.3.test.test_bufio.CBufferSizeTest.test_primepat -*graalpython.lib-python.3.test.test_bufio.PyBufferSizeTest.test_nullpat -*graalpython.lib-python.3.test.test_bufio.PyBufferSizeTest.test_primepat +test.test_bufio.CBufferSizeTest.test_nullpat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_bufio.CBufferSizeTest.test_primepat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_bufio.PyBufferSizeTest.test_nullpat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_bufio.PyBufferSizeTest.test_primepat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_builtin.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_builtin.txt index f87b0e1ddf..d9b8acbe4f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_builtin.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_builtin.txt @@ -1,96 +1,87 @@ -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_abs -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_all -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_any -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_ascii -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_bin -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_bug_27936 -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_bytearray_extend_error -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_bytearray_join_with_custom_iterator -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_bytearray_translate -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_callable -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_chr -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_cmp -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_compile_async_generator -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_compile_top_level_await -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_compile_top_level_await_invalid_cases -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_compile_top_level_await_no_coro -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_construct_singletons -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_delattr -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_dir -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_divmod -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_eval -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_exec -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_exec_redirected -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_filter -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_filter_dealloc -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_filter_pickle -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_format -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_general_eval -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_getattr -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_hasattr -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_hash -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_hex -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_id -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_import -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_input -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_isinstance -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_issubclass -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_iter -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_len -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_map -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_map_pickle -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_max -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_min -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_neg -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_next -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_oct -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_open -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_open_default_encoding -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_open_non_inheritable -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_ord -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_pow -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_repr -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_round -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_round_large -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_setattr -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_sum -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_type -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_vars -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_zip -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_zip_bad_iterable -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_zip_pickle -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_zip_pickle_strict -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_zip_pickle_strict_fail -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_zip_result_gc -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_zip_strict -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_zip_strict_error_handling -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_zip_strict_error_handling_stopiteration -*graalpython.lib-python.3.test.test_builtin.BuiltinTest.test_zip_strict_iterators -*graalpython.lib-python.3.test.test_builtin.PtyTests.test_input_no_stdout_fileno -*graalpython.lib-python.3.test.test_builtin.PtyTests.test_input_tty -*graalpython.lib-python.3.test.test_builtin.PtyTests.test_input_tty_non_ascii -*graalpython.lib-python.3.test.test_builtin.PtyTests.test_input_tty_non_ascii_unicode_errors -*graalpython.lib-python.3.test.test_builtin.ShutdownTest.test_cleanup -*graalpython.lib-python.3.test.test_builtin.TestBreakpoint.test_breakpoint -*graalpython.lib-python.3.test.test_builtin.TestBreakpoint.test_breakpoint_with_args_and_keywords -*graalpython.lib-python.3.test.test_builtin.TestBreakpoint.test_breakpoint_with_breakpointhook_reset -*graalpython.lib-python.3.test.test_builtin.TestBreakpoint.test_breakpoint_with_breakpointhook_set -*graalpython.lib-python.3.test.test_builtin.TestBreakpoint.test_breakpoint_with_passthru_error -*graalpython.lib-python.3.test.test_builtin.TestBreakpoint.test_envar_good_path_builtin -*graalpython.lib-python.3.test.test_builtin.TestBreakpoint.test_envar_good_path_empty_string -*graalpython.lib-python.3.test.test_builtin.TestBreakpoint.test_envar_good_path_noop_0 -*graalpython.lib-python.3.test.test_builtin.TestBreakpoint.test_envar_good_path_other -*graalpython.lib-python.3.test.test_builtin.TestBreakpoint.test_envar_ignored_when_hook_is_set -*graalpython.lib-python.3.test.test_builtin.TestBreakpoint.test_envar_unimportable -*graalpython.lib-python.3.test.test_builtin.TestSorted.test_bad_arguments -*graalpython.lib-python.3.test.test_builtin.TestSorted.test_baddecorator -*graalpython.lib-python.3.test.test_builtin.TestSorted.test_basic -*graalpython.lib-python.3.test.test_builtin.TestSorted.test_inputtypes -*graalpython.lib-python.3.test.test_builtin.TestType.test_bad_args -*graalpython.lib-python.3.test.test_builtin.TestType.test_bad_slots -*graalpython.lib-python.3.test.test_builtin.TestType.test_namespace_order -*graalpython.lib-python.3.test.test_builtin.TestType.test_new_type -*graalpython.lib-python.3.test.test_builtin.TestType.test_type_doc -*graalpython.lib-python.3.test.test_builtin.TestType.test_type_name -*graalpython.lib-python.3.test.test_builtin.TestType.test_type_nokwargs -*graalpython.lib-python.3.test.test_builtin.TestType.test_type_qualname +DocTestCase.builtins.zip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_abs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_any @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_bin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_bug_27936 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_bytearray_extend_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_bytearray_join_with_custom_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_bytearray_translate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_callable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_chr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_construct_singletons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_delattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_divmod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_eval @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_exec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_exec_redirected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_filter_dealloc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_filter_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_general_eval @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_getattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_hasattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_hex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_id @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_isinstance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_issubclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_map @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_map_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_max @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_min @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_neg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_next @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_oct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_open_default_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_open_non_inheritable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_ord @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_pow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_round @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_round_large @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_setattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_sum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_vars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_zip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_zip_bad_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_zip_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_zip_pickle_strict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_zip_pickle_strict_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_zip_strict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_zip_strict_error_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_zip_strict_error_handling_stopiteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.BuiltinTest.test_zip_strict_iterators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestBreakpoint.test_breakpoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestBreakpoint.test_breakpoint_with_args_and_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestBreakpoint.test_breakpoint_with_breakpointhook_reset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestBreakpoint.test_breakpoint_with_breakpointhook_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestBreakpoint.test_breakpoint_with_passthru_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestBreakpoint.test_envar_good_path_builtin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestBreakpoint.test_envar_good_path_empty_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestBreakpoint.test_envar_good_path_noop_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestBreakpoint.test_envar_good_path_other @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestBreakpoint.test_envar_ignored_when_hook_is_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestBreakpoint.test_envar_unimportable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestSorted.test_bad_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestSorted.test_baddecorator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestSorted.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestSorted.test_inputtypes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestType.test_bad_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestType.test_bad_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestType.test_namespace_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestType.test_new_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestType.test_type_doc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestType.test_type_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestType.test_type_nokwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_builtin.TestType.test_type_qualname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bytes.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bytes.txt index 5a4e341726..d00e4dc1bc 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bytes.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bytes.txt @@ -1,280 +1,269 @@ -*graalpython.lib-python.3.test.test_bytes.AssortedBytesTest.test_compare -*graalpython.lib-python.3.test.test_bytes.AssortedBytesTest.test_compare_bytes_to_bytearray -*graalpython.lib-python.3.test.test_bytes.AssortedBytesTest.test_doc -*graalpython.lib-python.3.test.test_bytes.AssortedBytesTest.test_format -*graalpython.lib-python.3.test.test_bytes.AssortedBytesTest.test_from_bytearray -*graalpython.lib-python.3.test.test_bytes.AssortedBytesTest.test_literal -*graalpython.lib-python.3.test.test_bytes.AssortedBytesTest.test_repr_str -*graalpython.lib-python.3.test.test_bytes.AssortedBytesTest.test_return_self -*graalpython.lib-python.3.test.test_bytes.AssortedBytesTest.test_rsplit_bytearray -*graalpython.lib-python.3.test.test_bytes.AssortedBytesTest.test_split_bytearray -*graalpython.lib-python.3.test.test_bytes.AssortedBytesTest.test_to_str -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_additional_rsplit -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_additional_split -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_capitalize -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_center -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_count -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_expandtabs -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_find -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_find_periodic_pattern -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_find_shift_table_overflow -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_fixtype -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_index -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_isalnum -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_isalpha -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_isascii -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_isdigit -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_islower -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_isspace -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_istitle -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_isupper -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_ljust -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_lower -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_removeprefix -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_removesuffix -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_replace -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_replace_overflow -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_rfind -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_rindex -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_rjust -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_rsplit -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_split -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_splitlines -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_strip -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_strip_whitespace -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_swapcase -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_title -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_upper -*graalpython.lib-python.3.test.test_bytes.ByteArrayAsStringTest.test_zfill -*graalpython.lib-python.3.test.test_bytes.ByteArraySubclassTest.test_basic -*graalpython.lib-python.3.test.test_bytes.ByteArraySubclassTest.test_copy -*graalpython.lib-python.3.test.test_bytes.ByteArraySubclassTest.test_fromhex -*graalpython.lib-python.3.test.test_bytes.ByteArraySubclassTest.test_init_override -*graalpython.lib-python.3.test.test_bytes.ByteArraySubclassTest.test_join -*graalpython.lib-python.3.test.test_bytes.ByteArraySubclassTest.test_pickle -*graalpython.lib-python.3.test.test_bytes.ByteArraySubclassWithSlotsTest.test_basic -*graalpython.lib-python.3.test.test_bytes.ByteArraySubclassWithSlotsTest.test_copy -*graalpython.lib-python.3.test.test_bytes.ByteArraySubclassWithSlotsTest.test_fromhex -*graalpython.lib-python.3.test.test_bytes.ByteArraySubclassWithSlotsTest.test_join -*graalpython.lib-python.3.test.test_bytes.ByteArraySubclassWithSlotsTest.test_pickle -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_alloc -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_append -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_basics -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_bytearray_api -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_center -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_clear -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_compare -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_compare_to_str -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_concat -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_constructor_exceptions -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_constructor_overflow -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_constructor_type_errors -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_constructor_value_errors -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_contains -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_copied -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_copy -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_count -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_decode -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_del_expand -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_delitem -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_empty_sequence -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_encoding -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_endswith -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_exhausted_iterator -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_extend -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_extended_getslice -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_extended_set_del_slice -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_fifo_overrun -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_find -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_find_etc_raise_correct_error_messages -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_from_buffer -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_from_index -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_from_int -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_from_iterable -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_from_list -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_from_mutating_list -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_from_ssize -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_from_tuple -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_fromhex -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_getitem_error -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_getslice -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_hex -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_hex_separator_basics -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_hex_separator_five_bytes -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_hex_separator_six_bytes -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_iconcat -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_imod -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_index -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_init_alloc -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_insert -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_integer_arguments_out_of_byte_range -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_irepeat -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_irepeat_1char -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_iterator_length_hint -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_iterator_pickling -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_iterator_pickling2 -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_join -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_ljust -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_maketrans -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_mod -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_nohash -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_none_arguments -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_nosort -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_obsolete_write_lock -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_ord -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_partition -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_partition_bytearray_doesnt_share_nullstring -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_partition_int_error -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_partition_string_error -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_pickling -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_pop -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_regexps -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_remove -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_repeat -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_repeat_1char -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_repeat_after_setslice -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_replace -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_replace_int_error -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_resize_forbidden -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_reverse -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_reversed -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_rfind -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_rindex -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_rjust -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_rmod -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_rpartition -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_rsplit_unicodewhitespace -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_setitem -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_setitem_error -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_setslice -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_setslice_extend -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_setslice_trap -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_split_int_error -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_split_string_error -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_split_unicodewhitespace -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_sq_item -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_startswith -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_strip_bytearray -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_strip_int_error -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_strip_string_error -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_translate -*graalpython.lib-python.3.test.test_bytes.ByteArrayTest.test_xjust_int_error -*graalpython.lib-python.3.test.test_bytes.BytearrayPEP3137Test.test_returns_new_copy -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_additional_rsplit -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_additional_split -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_capitalize -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_center -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_count -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_expandtabs -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_find -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_find_periodic_pattern -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_find_shift_table_overflow -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_fixtype -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_index -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_isalnum -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_isalpha -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_isascii -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_isdigit -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_islower -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_isspace -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_istitle -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_isupper -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_ljust -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_lower -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_removeprefix -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_removesuffix -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_replace -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_replace_overflow -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_rfind -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_rindex -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_rjust -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_rsplit -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_split -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_splitlines -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_strip -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_strip_whitespace -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_swapcase -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_title -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_upper -*graalpython.lib-python.3.test.test_bytes.BytesAsStringTest.test_zfill -*graalpython.lib-python.3.test.test_bytes.BytesSubclassTest.test_basic -*graalpython.lib-python.3.test.test_bytes.BytesSubclassTest.test_copy -*graalpython.lib-python.3.test.test_bytes.BytesSubclassTest.test_fromhex -*graalpython.lib-python.3.test.test_bytes.BytesSubclassTest.test_join -*graalpython.lib-python.3.test.test_bytes.BytesSubclassTest.test_pickle -*graalpython.lib-python.3.test.test_bytes.BytesTest.test__bytes__ -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_basics -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_buffer_is_readonly -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_bytes_blocking -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_center -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_compare -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_compare_to_str -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_concat -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_constructor_exceptions -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_constructor_overflow -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_constructor_type_errors -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_constructor_value_errors -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_contains -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_copy -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_count -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_custom -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_decode -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_empty_sequence -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_encoding -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_endswith -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_extended_getslice -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_find -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_find_etc_raise_correct_error_messages -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_from_buffer -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_from_format -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_from_index -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_from_int -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_from_iterable -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_from_list -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_from_mutating_list -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_from_ssize -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_from_tuple -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_fromhex -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_getitem_error -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_getslice -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_hex -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_hex_separator_basics -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_hex_separator_five_bytes -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_hex_separator_six_bytes -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_imod -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_index -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_integer_arguments_out_of_byte_range -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_iterator_pickling -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_join -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_ljust -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_maketrans -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_mod -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_none_arguments -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_ord -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_partition -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_partition_int_error -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_partition_string_error -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_pickling -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_repeat -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_repeat_1char -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_replace -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_replace_int_error -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_reversed -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_rfind -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_rindex -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_rjust -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_rmod -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_rpartition -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_rsplit_unicodewhitespace -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_split_int_error -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_split_string_error -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_split_unicodewhitespace -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_sq_item -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_startswith -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_strip_bytearray -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_strip_int_error -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_strip_string_error -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_translate -*graalpython.lib-python.3.test.test_bytes.BytesTest.test_xjust_int_error +test.test_bytes.AssortedBytesTest.test_compare_bytes_to_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.AssortedBytesTest.test_doc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.AssortedBytesTest.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.AssortedBytesTest.test_from_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.AssortedBytesTest.test_literal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.AssortedBytesTest.test_repr_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.AssortedBytesTest.test_return_self @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.AssortedBytesTest.test_rsplit_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.AssortedBytesTest.test_split_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.AssortedBytesTest.test_to_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_additional_rsplit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_additional_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_capitalize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_center @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_expandtabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_find @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_find_periodic_pattern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_find_shift_table_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_fixtype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_isalnum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_isalpha @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_isascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_isdigit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_islower @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_isspace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_istitle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_isupper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_ljust @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_lower @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_removeprefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_removesuffix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_rfind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_rindex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_rjust @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_rsplit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_splitlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_strip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_strip_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_swapcase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_title @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_upper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayAsStringTest.test_zfill @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArraySubclassTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArraySubclassTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArraySubclassTest.test_fromhex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArraySubclassTest.test_init_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArraySubclassTest.test_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArraySubclassTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArraySubclassWithSlotsTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArraySubclassWithSlotsTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArraySubclassWithSlotsTest.test_fromhex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArraySubclassWithSlotsTest.test_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArraySubclassWithSlotsTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_alloc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_bytearray_api @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_center @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_compare_to_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_concat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_constructor_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_constructor_type_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_constructor_value_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_copied @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_del_expand @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_bytes.ByteArrayTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_empty_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_endswith @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_exhausted_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_extended_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_extended_set_del_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_fifo_overrun @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_find @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_find_etc_raise_correct_error_messages @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_from_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_from_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_from_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_from_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_from_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_from_mutating_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_from_ssize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_from_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_fromhex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_getitem_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_hex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_hex_separator_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_hex_separator_five_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_hex_separator_six_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_iconcat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_imod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_init_alloc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_integer_arguments_out_of_byte_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_irepeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_irepeat_1char @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_iterator_length_hint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_iterator_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_ljust @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_maketrans @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_mod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_nohash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_none_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_nosort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_ord @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_partition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_partition_bytearray_doesnt_share_nullstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_partition_int_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_partition_string_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_regexps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_repeat_1char @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_repeat_after_setslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_replace_int_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_reversed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_rfind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_rindex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_rjust @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_rmod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_rpartition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_rsplit_unicodewhitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_setitem_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_setslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_setslice_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_setslice_trap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_split_int_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_split_string_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_split_unicodewhitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_sq_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_bytes.ByteArrayTest.test_startswith @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_strip_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_strip_int_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_strip_string_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_translate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.ByteArrayTest.test_xjust_int_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytearrayPEP3137Test.test_returns_new_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_additional_rsplit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_additional_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_capitalize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_center @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_expandtabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_find @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_find_periodic_pattern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_find_shift_table_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_fixtype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_isalnum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_isalpha @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_isascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_isdigit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_islower @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_isspace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_istitle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_isupper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_ljust @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_lower @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_removeprefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_removesuffix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_rfind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_rindex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_rjust @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_rsplit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_splitlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_strip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_strip_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_swapcase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_title @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_upper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesAsStringTest.test_zfill @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesSubclassTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesSubclassTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesSubclassTest.test_fromhex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesSubclassTest.test_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesSubclassTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test__bytes__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_buffer_is_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_bytes_blocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_center @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_compare_to_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_concat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_constructor_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_constructor_type_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_constructor_value_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_custom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_empty_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_endswith @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_extended_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_find @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_find_etc_raise_correct_error_messages @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_from_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_from_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_from_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_from_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_from_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_from_mutating_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_from_ssize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_from_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_fromhex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_getitem_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_hex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_hex_separator_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_hex_separator_five_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_hex_separator_six_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_imod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_integer_arguments_out_of_byte_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_iterator_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_ljust @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_maketrans @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_mod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_none_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_ord @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_partition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_partition_int_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_partition_string_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_repeat_1char @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_replace_int_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_reversed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_rfind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_rindex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_rjust @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_rmod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_rpartition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_rsplit_unicodewhitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_split_int_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_split_string_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_split_unicodewhitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_sq_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_bytes.BytesTest.test_startswith @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_strip_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_strip_int_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_strip_string_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_translate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bytes.BytesTest.test_xjust_int_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bz2.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bz2.txt index 67ab325da1..76ccf28cfa 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bz2.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_bz2.txt @@ -1,97 +1,94 @@ -*graalpython.lib-python.3.test.test_bz2.BZ2CompressorTest.testCompress -*graalpython.lib-python.3.test.test_bz2.BZ2CompressorTest.testCompress4G -*graalpython.lib-python.3.test.test_bz2.BZ2CompressorTest.testCompressChunks10 -*graalpython.lib-python.3.test.test_bz2.BZ2CompressorTest.testCompressEmptyString -*graalpython.lib-python.3.test.test_bz2.BZ2CompressorTest.testPickle -*graalpython.lib-python.3.test.test_bz2.BZ2DecompressorTest.testDecompress -*graalpython.lib-python.3.test.test_bz2.BZ2DecompressorTest.testDecompress4G -*graalpython.lib-python.3.test.test_bz2.BZ2DecompressorTest.testDecompressChunks10 -*graalpython.lib-python.3.test.test_bz2.BZ2DecompressorTest.testDecompressUnusedData -*graalpython.lib-python.3.test.test_bz2.BZ2DecompressorTest.testDecompressorChunksMaxsize -*graalpython.lib-python.3.test.test_bz2.BZ2DecompressorTest.testEOFError -*graalpython.lib-python.3.test.test_bz2.BZ2DecompressorTest.testPickle -*graalpython.lib-python.3.test.test_bz2.BZ2DecompressorTest.test_Constructor -*graalpython.lib-python.3.test.test_bz2.BZ2DecompressorTest.test_decompressor_inputbuf_1 -*graalpython.lib-python.3.test.test_bz2.BZ2DecompressorTest.test_decompressor_inputbuf_2 -*graalpython.lib-python.3.test.test_bz2.BZ2DecompressorTest.test_decompressor_inputbuf_3 -*graalpython.lib-python.3.test.test_bz2.BZ2DecompressorTest.test_failure -*graalpython.lib-python.3.test.test_bz2.BZ2DecompressorTest.test_refleaks_in___init__ -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testAppend -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testBadArgs -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testClosedIteratorDeadlock -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testContextProtocol -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testDecompressLimited -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testFileno -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testIterator -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testIteratorMultiStream -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testMixedIterationAndReads -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testMultiStreamOrdering -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testOpenBytesFilename -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testOpenDel -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testOpenNonexistent -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testOpenPathLikeFilename -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testPeek -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testPeekBytesIO -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testRead -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testRead0 -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testRead100 -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testReadBadFile -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testReadBytesIO -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testReadChunk10 -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testReadChunk10MultiStream -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testReadInto -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testReadLine -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testReadLineMultiStream -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testReadLines -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testReadLinesMultiStream -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testReadMonkeyMultiStream -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testReadMultiStream -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testReadMultiStreamTrailingJunk -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testReadTrailingJunk -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testReadable -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testReadlinesNoNewline -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testSeekBackwards -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testSeekBackwardsAcrossStreams -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testSeekBackwardsBytesIO -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testSeekBackwardsFromEnd -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testSeekBackwardsFromEndAcrossStreams -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testSeekForward -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testSeekForwardAcrossStreams -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testSeekForwardBytesIO -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testSeekPostEnd -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testSeekPostEndMultiStream -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testSeekPostEndTwice -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testSeekPostEndTwiceMultiStream -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testSeekPreStart -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testSeekPreStartMultiStream -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testSeekable -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testThreading -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testWritable -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testWrite -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testWriteBytesIO -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testWriteChunks10 -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testWriteLines -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testWriteMethodsOnReadOnlyFile -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.testWriteNonDefaultCompressLevel -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.test_issue44439 -*graalpython.lib-python.3.test.test_bz2.BZ2FileTest.test_read_truncated -*graalpython.lib-python.3.test.test_bz2.CompressDecompressTest.testCompress -*graalpython.lib-python.3.test.test_bz2.CompressDecompressTest.testCompressEmptyString -*graalpython.lib-python.3.test.test_bz2.CompressDecompressTest.testDecompress -*graalpython.lib-python.3.test.test_bz2.CompressDecompressTest.testDecompressBadData -*graalpython.lib-python.3.test.test_bz2.CompressDecompressTest.testDecompressEmpty -*graalpython.lib-python.3.test.test_bz2.CompressDecompressTest.testDecompressIncomplete -*graalpython.lib-python.3.test.test_bz2.CompressDecompressTest.testDecompressMultiStream -*graalpython.lib-python.3.test.test_bz2.CompressDecompressTest.testDecompressMultiStreamTrailingJunk -*graalpython.lib-python.3.test.test_bz2.CompressDecompressTest.testDecompressToEmptyString -*graalpython.lib-python.3.test.test_bz2.CompressDecompressTest.testDecompressTrailingJunk -*graalpython.lib-python.3.test.test_bz2.OpenTest.test_bad_params -*graalpython.lib-python.3.test.test_bz2.OpenTest.test_binary_modes -*graalpython.lib-python.3.test.test_bz2.OpenTest.test_encoding -*graalpython.lib-python.3.test.test_bz2.OpenTest.test_encoding_error_handler -*graalpython.lib-python.3.test.test_bz2.OpenTest.test_fileobj -*graalpython.lib-python.3.test.test_bz2.OpenTest.test_implicit_binary_modes -*graalpython.lib-python.3.test.test_bz2.OpenTest.test_newline -*graalpython.lib-python.3.test.test_bz2.OpenTest.test_text_modes -*graalpython.lib-python.3.test.test_bz2.OpenTest.test_x_mode -*graalpython.lib-python.3.test.test_bz2.TestMain.test_main +test.test_bz2.BZ2CompressorTest.testCompress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2CompressorTest.testCompress4G @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2CompressorTest.testCompressChunks10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2CompressorTest.testCompressEmptyString @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2CompressorTest.testPickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2DecompressorTest.testDecompress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2DecompressorTest.testDecompress4G @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2DecompressorTest.testDecompressChunks10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2DecompressorTest.testDecompressUnusedData @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2DecompressorTest.testDecompressorChunksMaxsize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2DecompressorTest.testEOFError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2DecompressorTest.testPickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2DecompressorTest.test_Constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2DecompressorTest.test_decompressor_inputbuf_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2DecompressorTest.test_decompressor_inputbuf_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2DecompressorTest.test_decompressor_inputbuf_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2DecompressorTest.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testAppend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testBadArgs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testClosedIteratorDeadlock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testContextProtocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testDecompressLimited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testFileno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testIterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testIteratorMultiStream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testMixedIterationAndReads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testMultiStreamOrdering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testOpenBytesFilename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testOpenNonexistent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testOpenPathLikeFilename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testPeek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testPeekBytesIO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testRead0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testRead100 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testReadBadFile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testReadBytesIO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testReadChunk10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testReadChunk10MultiStream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testReadInto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testReadLine @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testReadLineMultiStream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testReadLines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testReadLinesMultiStream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testReadMonkeyMultiStream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testReadMultiStream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testReadMultiStreamTrailingJunk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testReadTrailingJunk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testReadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testReadlinesNoNewline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testSeekBackwards @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testSeekBackwardsAcrossStreams @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testSeekBackwardsBytesIO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testSeekBackwardsFromEnd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testSeekBackwardsFromEndAcrossStreams @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testSeekForward @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testSeekForwardAcrossStreams @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testSeekForwardBytesIO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testSeekPostEnd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testSeekPostEndMultiStream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testSeekPostEndTwice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testSeekPostEndTwiceMultiStream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testSeekPreStart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testSeekPreStartMultiStream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testSeekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testThreading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testWritable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testWrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testWriteBytesIO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testWriteChunks10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testWriteLines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testWriteMethodsOnReadOnlyFile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.testWriteNonDefaultCompressLevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.test_issue44439 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.BZ2FileTest.test_read_truncated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.CompressDecompressTest.testCompress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.CompressDecompressTest.testCompressEmptyString @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.CompressDecompressTest.testDecompress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.CompressDecompressTest.testDecompressBadData @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.CompressDecompressTest.testDecompressEmpty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.CompressDecompressTest.testDecompressIncomplete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.CompressDecompressTest.testDecompressMultiStream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.CompressDecompressTest.testDecompressMultiStreamTrailingJunk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.CompressDecompressTest.testDecompressToEmptyString @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.CompressDecompressTest.testDecompressTrailingJunk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.OpenTest.test_bad_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.OpenTest.test_binary_modes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.OpenTest.test_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_bz2.OpenTest.test_encoding_error_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.OpenTest.test_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.OpenTest.test_implicit_binary_modes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.OpenTest.test_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_bz2.OpenTest.test_text_modes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_bz2.OpenTest.test_x_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_c_locale_coercion.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_c_locale_coercion.txt deleted file mode 100644 index 49d5794793..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_c_locale_coercion.txt +++ /dev/null @@ -1,7 +0,0 @@ -*graalpython.lib-python.3.test.test_c_locale_coercion.LocaleCoercionTests.test_LC_ALL_set_to_C -*graalpython.lib-python.3.test.test_c_locale_coercion.LocaleCoercionTests.test_PYTHONCOERCECLOCALE_not_set -*graalpython.lib-python.3.test.test_c_locale_coercion.LocaleCoercionTests.test_PYTHONCOERCECLOCALE_not_zero -*graalpython.lib-python.3.test.test_c_locale_coercion.LocaleCoercionTests.test_PYTHONCOERCECLOCALE_set_to_one -*graalpython.lib-python.3.test.test_c_locale_coercion.LocaleCoercionTests.test_PYTHONCOERCECLOCALE_set_to_warn -*graalpython.lib-python.3.test.test_c_locale_coercion.LocaleCoercionTests.test_PYTHONCOERCECLOCALE_set_to_zero -*graalpython.lib-python.3.test.test_c_locale_coercion.TestMain.test_main diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_calendar.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_calendar.txt index f43fc4a140..1dc599d3f4 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_calendar.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_calendar.txt @@ -1,71 +1,71 @@ -*graalpython.lib-python.3.test.test_calendar.CalendarTestCase.test_days -*graalpython.lib-python.3.test.test_calendar.CalendarTestCase.test_enumerate_weekdays -*graalpython.lib-python.3.test.test_calendar.CalendarTestCase.test_illegal_weekday_reported -*graalpython.lib-python.3.test.test_calendar.CalendarTestCase.test_isleap -*graalpython.lib-python.3.test.test_calendar.CalendarTestCase.test_itermonthdays -*graalpython.lib-python.3.test.test_calendar.CalendarTestCase.test_itermonthdays2 -*graalpython.lib-python.3.test.test_calendar.CalendarTestCase.test_itermonthdays3 -*graalpython.lib-python.3.test.test_calendar.CalendarTestCase.test_itermonthdays4 -*graalpython.lib-python.3.test.test_calendar.CalendarTestCase.test_iterweekdays -*graalpython.lib-python.3.test.test_calendar.CalendarTestCase.test_locale_calendar_formatweekday -*graalpython.lib-python.3.test.test_calendar.CalendarTestCase.test_locale_calendars -*graalpython.lib-python.3.test.test_calendar.CalendarTestCase.test_locale_html_calendar_custom_css_class_month_name -*graalpython.lib-python.3.test.test_calendar.CalendarTestCase.test_locale_html_calendar_custom_css_class_weekday -*graalpython.lib-python.3.test.test_calendar.CalendarTestCase.test_months -*graalpython.lib-python.3.test.test_calendar.CalendarTestCase.test_setfirstweekday -*graalpython.lib-python.3.test.test_calendar.CommandLineTestCase.test_help -*graalpython.lib-python.3.test.test_calendar.CommandLineTestCase.test_html_output_current_year -*graalpython.lib-python.3.test.test_calendar.CommandLineTestCase.test_html_output_year_css -*graalpython.lib-python.3.test.test_calendar.CommandLineTestCase.test_html_output_year_encoding -*graalpython.lib-python.3.test.test_calendar.CommandLineTestCase.test_illegal_arguments -*graalpython.lib-python.3.test.test_calendar.CommandLineTestCase.test_option_encoding -*graalpython.lib-python.3.test.test_calendar.CommandLineTestCase.test_option_lines -*graalpython.lib-python.3.test.test_calendar.CommandLineTestCase.test_option_locale -*graalpython.lib-python.3.test.test_calendar.CommandLineTestCase.test_option_months -*graalpython.lib-python.3.test.test_calendar.CommandLineTestCase.test_option_spacing -*graalpython.lib-python.3.test.test_calendar.CommandLineTestCase.test_option_type -*graalpython.lib-python.3.test.test_calendar.CommandLineTestCase.test_option_width -*graalpython.lib-python.3.test.test_calendar.CommandLineTestCase.test_output_current_year -*graalpython.lib-python.3.test.test_calendar.CommandLineTestCase.test_output_month -*graalpython.lib-python.3.test.test_calendar.CommandLineTestCase.test_output_year -*graalpython.lib-python.3.test.test_calendar.LeapdaysTestCase.test_no_leapdays -*graalpython.lib-python.3.test.test_calendar.LeapdaysTestCase.test_no_leapdays_upper_boundary -*graalpython.lib-python.3.test.test_calendar.LeapdaysTestCase.test_no_range -*graalpython.lib-python.3.test.test_calendar.LeapdaysTestCase.test_one_leapday_lower_boundary -*graalpython.lib-python.3.test.test_calendar.LeapdaysTestCase.test_several_leapyears_in_range -*graalpython.lib-python.3.test.test_calendar.MiscTestCase.test__all__ -*graalpython.lib-python.3.test.test_calendar.MondayTestCase.test_april -*graalpython.lib-python.3.test.test_calendar.MondayTestCase.test_december -*graalpython.lib-python.3.test.test_calendar.MondayTestCase.test_february -*graalpython.lib-python.3.test.test_calendar.MonthRangeTestCase.test_december -*graalpython.lib-python.3.test.test_calendar.MonthRangeTestCase.test_february_leap -*graalpython.lib-python.3.test.test_calendar.MonthRangeTestCase.test_february_nonleap -*graalpython.lib-python.3.test.test_calendar.MonthRangeTestCase.test_illegal_month_reported -*graalpython.lib-python.3.test.test_calendar.MonthRangeTestCase.test_january -*graalpython.lib-python.3.test.test_calendar.MonthRangeTestCase.test_thirteenth_month -*graalpython.lib-python.3.test.test_calendar.MonthRangeTestCase.test_zeroth_month -*graalpython.lib-python.3.test.test_calendar.OutputTestCase.test_format -*graalpython.lib-python.3.test.test_calendar.OutputTestCase.test_formatmonth -*graalpython.lib-python.3.test.test_calendar.OutputTestCase.test_formatmonthname_with_year -*graalpython.lib-python.3.test.test_calendar.OutputTestCase.test_formatmonthname_without_year -*graalpython.lib-python.3.test.test_calendar.OutputTestCase.test_formatweekheader_long -*graalpython.lib-python.3.test.test_calendar.OutputTestCase.test_formatweekheader_short -*graalpython.lib-python.3.test.test_calendar.OutputTestCase.test_output -*graalpython.lib-python.3.test.test_calendar.OutputTestCase.test_output_htmlcalendar_encoding_ascii -*graalpython.lib-python.3.test.test_calendar.OutputTestCase.test_output_htmlcalendar_encoding_utf8 -*graalpython.lib-python.3.test.test_calendar.OutputTestCase.test_output_textcalendar -*graalpython.lib-python.3.test.test_calendar.OutputTestCase.test_prmonth -*graalpython.lib-python.3.test.test_calendar.OutputTestCase.test_prweek -*graalpython.lib-python.3.test.test_calendar.OutputTestCase.test_pryear -*graalpython.lib-python.3.test.test_calendar.OutputTestCase.test_yeardatescalendar -*graalpython.lib-python.3.test.test_calendar.OutputTestCase.test_yeardayscalendar -*graalpython.lib-python.3.test.test_calendar.SundayTestCase.test_april -*graalpython.lib-python.3.test.test_calendar.SundayTestCase.test_december -*graalpython.lib-python.3.test.test_calendar.SundayTestCase.test_february -*graalpython.lib-python.3.test.test_calendar.TestSubClassingCase.test_format_year -*graalpython.lib-python.3.test.test_calendar.TestSubClassingCase.test_format_year_head -*graalpython.lib-python.3.test.test_calendar.TestSubClassingCase.test_formatmonth -*graalpython.lib-python.3.test.test_calendar.TestSubClassingCase.test_formatmonthname -*graalpython.lib-python.3.test.test_calendar.TestSubClassingCase.test_formatweek -*graalpython.lib-python.3.test.test_calendar.TestSubClassingCase.test_formatweek_head -*graalpython.lib-python.3.test.test_calendar.TimegmTestCase.test_timegm +test.test_calendar.CalendarTestCase.test_days @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CalendarTestCase.test_enumerate_weekdays @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CalendarTestCase.test_illegal_weekday_reported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CalendarTestCase.test_isleap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CalendarTestCase.test_itermonthdays @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CalendarTestCase.test_itermonthdays2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CalendarTestCase.test_itermonthdays3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CalendarTestCase.test_itermonthdays4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CalendarTestCase.test_iterweekdays @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CalendarTestCase.test_locale_calendar_formatweekday @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CalendarTestCase.test_locale_calendars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CalendarTestCase.test_locale_html_calendar_custom_css_class_month_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CalendarTestCase.test_locale_html_calendar_custom_css_class_weekday @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CalendarTestCase.test_months @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CalendarTestCase.test_setfirstweekday @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CommandLineTestCase.test_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CommandLineTestCase.test_html_output_current_year @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CommandLineTestCase.test_html_output_year_css @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CommandLineTestCase.test_html_output_year_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CommandLineTestCase.test_illegal_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CommandLineTestCase.test_option_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CommandLineTestCase.test_option_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_calendar.CommandLineTestCase.test_option_locale @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CommandLineTestCase.test_option_months @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_calendar.CommandLineTestCase.test_option_spacing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CommandLineTestCase.test_option_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_calendar.CommandLineTestCase.test_option_width @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CommandLineTestCase.test_output_current_year @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.CommandLineTestCase.test_output_month @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_calendar.CommandLineTestCase.test_output_year @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_calendar.LeapdaysTestCase.test_no_leapdays @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.LeapdaysTestCase.test_no_leapdays_upper_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.LeapdaysTestCase.test_no_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.LeapdaysTestCase.test_one_leapday_lower_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.LeapdaysTestCase.test_several_leapyears_in_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.MiscTestCase.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.MondayTestCase.test_april @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.MondayTestCase.test_december @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.MondayTestCase.test_february @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.MonthRangeTestCase.test_december @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.MonthRangeTestCase.test_february_leap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.MonthRangeTestCase.test_february_nonleap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.MonthRangeTestCase.test_illegal_month_reported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.MonthRangeTestCase.test_january @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.MonthRangeTestCase.test_thirteenth_month @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.MonthRangeTestCase.test_zeroth_month @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.OutputTestCase.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.OutputTestCase.test_formatmonth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.OutputTestCase.test_formatmonthname_with_year @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.OutputTestCase.test_formatmonthname_without_year @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.OutputTestCase.test_formatweekheader_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.OutputTestCase.test_formatweekheader_short @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.OutputTestCase.test_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.OutputTestCase.test_output_htmlcalendar_encoding_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.OutputTestCase.test_output_htmlcalendar_encoding_utf8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.OutputTestCase.test_output_textcalendar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.OutputTestCase.test_prmonth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.OutputTestCase.test_prweek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.OutputTestCase.test_pryear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.OutputTestCase.test_yeardatescalendar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.OutputTestCase.test_yeardayscalendar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.SundayTestCase.test_april @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.SundayTestCase.test_december @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.SundayTestCase.test_february @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.TestSubClassingCase.test_format_year @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.TestSubClassingCase.test_format_year_head @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.TestSubClassingCase.test_formatmonth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.TestSubClassingCase.test_formatmonthname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.TestSubClassingCase.test_formatweek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.TestSubClassingCase.test_formatweek_head @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_calendar.TimegmTestCase.test_timegm @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_call.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_call.txt index 184f8c2cb8..ac16d198e7 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_call.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_call.txt @@ -1,136 +1,66 @@ -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_oldargs0_0 -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_oldargs0_0_ext -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_oldargs0_0_kw -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_oldargs0_1 -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_oldargs0_1_ext -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_oldargs0_1_kw -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_oldargs0_2 -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_oldargs0_2_ext -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_oldargs0_2_kw -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_oldargs1_0 -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_oldargs1_0_ext -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_oldargs1_0_kw -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_oldargs1_1 -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_oldargs1_1_ext -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_oldargs1_1_kw -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_oldargs1_2 -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_oldargs1_2_ext -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_oldargs1_2_kw -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_varargs0 -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_varargs0_ext -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_varargs1 -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_varargs1_ext -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_varargs1_kw -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_varargs2 -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_varargs2_ext -*graalpython.lib-python.3.test.test_call.CFunctionCalls.test_varargs2_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_oldargs0_1 -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_oldargs0_1_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_oldargs0_2 -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_oldargs0_2_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_oldargs1_0 -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_oldargs1_0_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_oldargs1_1_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_oldargs1_2 -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_oldargs1_2_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs0 -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs10_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs11_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs12_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs13_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs14_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs15_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs16_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs17_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs18_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs19_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs1_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs1max -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs1min -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs2 -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs2_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs2max -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs2min -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs3 -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs3_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs4_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs5_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs6_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs7_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs8_kw -*graalpython.lib-python.3.test.test_call.CFunctionCallsErrorMessages.test_varargs9_kw -*graalpython.lib-python.3.test.test_call.FastCallTests.test_fastcall -*graalpython.lib-python.3.test.test_call.FastCallTests.test_fastcall_clearing_dict -*graalpython.lib-python.3.test.test_call.FastCallTests.test_vectorcall -*graalpython.lib-python.3.test.test_call.FastCallTests.test_vectorcall_dict -*graalpython.lib-python.3.test.test_call.FunctionCalls.test_frames_are_popped_after_failed_calls -*graalpython.lib-python.3.test.test_call.FunctionCalls.test_kwargs_order -*graalpython.lib-python.3.test.test_call.TestCallingConventions.test_fastcall -*graalpython.lib-python.3.test.test_call.TestCallingConventions.test_fastcall_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventions.test_fastcall_keywords -*graalpython.lib-python.3.test.test_call.TestCallingConventions.test_fastcall_keywords_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventions.test_noargs -*graalpython.lib-python.3.test.test_call.TestCallingConventions.test_noargs_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventions.test_o -*graalpython.lib-python.3.test.test_call.TestCallingConventions.test_o_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventions.test_varargs -*graalpython.lib-python.3.test.test_call.TestCallingConventions.test_varargs_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventions.test_varargs_keywords -*graalpython.lib-python.3.test.test_call.TestCallingConventions.test_varargs_keywords_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClass.test_fastcall -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClass.test_fastcall_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClass.test_fastcall_keywords -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClass.test_fastcall_keywords_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClass.test_noargs -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClass.test_noargs_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClass.test_o -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClass.test_o_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClass.test_varargs -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClass.test_varargs_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClass.test_varargs_keywords -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClass.test_varargs_keywords_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClassInstance.test_fastcall -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClassInstance.test_fastcall_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClassInstance.test_fastcall_keywords -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClassInstance.test_fastcall_keywords_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClassInstance.test_noargs -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClassInstance.test_noargs_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClassInstance.test_o -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClassInstance.test_o_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClassInstance.test_varargs -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClassInstance.test_varargs_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClassInstance.test_varargs_keywords -*graalpython.lib-python.3.test.test_call.TestCallingConventionsClassInstance.test_varargs_keywords_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsInstance.test_fastcall -*graalpython.lib-python.3.test.test_call.TestCallingConventionsInstance.test_fastcall_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsInstance.test_fastcall_keywords -*graalpython.lib-python.3.test.test_call.TestCallingConventionsInstance.test_fastcall_keywords_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsInstance.test_noargs -*graalpython.lib-python.3.test.test_call.TestCallingConventionsInstance.test_noargs_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsInstance.test_o -*graalpython.lib-python.3.test.test_call.TestCallingConventionsInstance.test_o_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsInstance.test_varargs -*graalpython.lib-python.3.test.test_call.TestCallingConventionsInstance.test_varargs_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsInstance.test_varargs_keywords -*graalpython.lib-python.3.test.test_call.TestCallingConventionsInstance.test_varargs_keywords_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsStatic.test_fastcall -*graalpython.lib-python.3.test.test_call.TestCallingConventionsStatic.test_fastcall_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsStatic.test_fastcall_keywords -*graalpython.lib-python.3.test.test_call.TestCallingConventionsStatic.test_fastcall_keywords_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsStatic.test_noargs -*graalpython.lib-python.3.test.test_call.TestCallingConventionsStatic.test_noargs_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsStatic.test_o -*graalpython.lib-python.3.test.test_call.TestCallingConventionsStatic.test_o_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsStatic.test_varargs -*graalpython.lib-python.3.test.test_call.TestCallingConventionsStatic.test_varargs_ext -*graalpython.lib-python.3.test.test_call.TestCallingConventionsStatic.test_varargs_keywords -*graalpython.lib-python.3.test.test_call.TestCallingConventionsStatic.test_varargs_keywords_ext -*graalpython.lib-python.3.test.test_call.TestErrorMessagesUseQualifiedName.test_missing_arguments -*graalpython.lib-python.3.test.test_call.TestErrorMessagesUseQualifiedName.test_multiple_values -*graalpython.lib-python.3.test.test_call.TestErrorMessagesUseQualifiedName.test_positional_only_passed_as_keyword -*graalpython.lib-python.3.test.test_call.TestErrorMessagesUseQualifiedName.test_too_many_positional -*graalpython.lib-python.3.test.test_call.TestErrorMessagesUseQualifiedName.test_unexpected_keyword -*graalpython.lib-python.3.test.test_call.TestPEP590.test_method_descriptor_flag -*graalpython.lib-python.3.test.test_call.TestPEP590.test_vectorcall -*graalpython.lib-python.3.test.test_call.TestPEP590.test_vectorcall_flag -*graalpython.lib-python.3.test.test_call.TestPEP590.test_vectorcall_override +test.test_call.FastCallTests.test_fastcall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.FastCallTests.test_fastcall_clearing_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.FastCallTests.test_vectorcall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.FastCallTests.test_vectorcall_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.FunctionCalls.test_frames_are_popped_after_failed_calls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.FunctionCalls.test_kwargs_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventions.test_fastcall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventions.test_fastcall_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventions.test_fastcall_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventions.test_fastcall_keywords_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventions.test_noargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventions.test_noargs_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventions.test_o @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventions.test_o_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventions.test_varargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventions.test_varargs_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventions.test_varargs_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventions.test_varargs_keywords_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClass.test_fastcall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClass.test_fastcall_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClass.test_fastcall_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClass.test_fastcall_keywords_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClass.test_noargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClass.test_noargs_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClass.test_o @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClass.test_o_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClass.test_varargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClass.test_varargs_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClass.test_varargs_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClass.test_varargs_keywords_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_fastcall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_fastcall_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_fastcall_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_fastcall_keywords_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_noargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_noargs_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_o @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_o_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_varargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_varargs_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_varargs_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_varargs_keywords_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_fastcall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_fastcall_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_fastcall_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_fastcall_keywords_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_noargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_noargs_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_o @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_o_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_varargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_varargs_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_varargs_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_varargs_keywords_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_fastcall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_fastcall_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_fastcall_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_fastcall_keywords_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_noargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_noargs_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_o @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_o_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_varargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_varargs_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_varargs_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_varargs_keywords_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_capi.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_capi.txt index 5a81e9a009..215d6591c4 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_capi.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_capi.txt @@ -1,98 +1,152 @@ -*test.test_capi.test_codecs.CAPITest.test_decodeutf8 -*test.test_capi.test_codecs.CAPITest.test_decodeutf8stateful -*test.test_capi.test_eval_code_ex.PyEval_EvalCodeExTests.test_simple -*test.test_capi.test_eval_code_ex.PyEval_EvalCodeExTests.test_with_args -*test.test_capi.test_eval_code_ex.PyEval_EvalCodeExTests.test_with_closure -*test.test_capi.test_eval_code_ex.PyEval_EvalCodeExTests.test_with_default -*test.test_capi.test_eval_code_ex.PyEval_EvalCodeExTests.test_with_kwarg_default -*test.test_capi.test_getargs.Boolean_TestCase.test_p -*test.test_capi.test_getargs.Bytes_TestCase.test_c -*test.test_capi.test_getargs.Bytes_TestCase.test_w_star -*test.test_capi.test_getargs.Bytes_TestCase.test_y_hash -*test.test_capi.test_getargs.Bytes_TestCase.test_y_star -*test.test_capi.test_getargs.Float_TestCase.test_d -*test.test_capi.test_getargs.Float_TestCase.test_f -*test.test_capi.test_getargs.Float_TestCase.test_f_rounding -*test.test_capi.test_getargs.KeywordOnly_TestCase.test_keyword_args -*test.test_capi.test_getargs.KeywordOnly_TestCase.test_mixed_args -*test.test_capi.test_getargs.KeywordOnly_TestCase.test_optional_args -*test.test_capi.test_getargs.KeywordOnly_TestCase.test_positional_args -*test.test_capi.test_getargs.Keywords_TestCase.test_keyword_args -*test.test_capi.test_getargs.Keywords_TestCase.test_kwargs -*test.test_capi.test_getargs.Keywords_TestCase.test_mixed_args -*test.test_capi.test_getargs.Keywords_TestCase.test_optional_args -*test.test_capi.test_getargs.Keywords_TestCase.test_positional_args -*test.test_capi.test_getargs.Object_TestCase.test_S -*test.test_capi.test_getargs.Object_TestCase.test_Y -*test.test_capi.test_getargs.ParseTupleAndKeywords_Test.test_parse_tuple_and_keywords -*test.test_capi.test_getargs.PositionalOnlyAndKeywords_TestCase.test_mixed_args -*test.test_capi.test_getargs.PositionalOnlyAndKeywords_TestCase.test_optional_args -*test.test_capi.test_getargs.PositionalOnlyAndKeywords_TestCase.test_positional_args -*test.test_capi.test_getargs.Test_testcapi.test_L_code -*test.test_capi.test_getargs.Test_testcapi.test_k_code -*test.test_capi.test_getargs.Test_testcapi.test_s_code -*test.test_capi.test_getargs.Tuple_TestCase.test_args -*test.test_capi.test_getargs.Tuple_TestCase.test_tuple -*test.test_capi.test_misc.CAPITest.test_c_type_with_ipow -*test.test_capi.test_misc.CAPITest.test_c_type_with_matrix_multiplication -*test.test_capi.test_misc.CAPITest.test_getitem_with_error -*test.test_capi.test_misc.CAPITest.test_heaptype_with_buffer -*test.test_capi.test_misc.CAPITest.test_heaptype_with_dict -*test.test_capi.test_misc.CAPITest.test_heaptype_with_negative_dict -*test.test_capi.test_misc.CAPITest.test_instancemethod -*test.test_capi.test_misc.CAPITest.test_mapping_keys_values_items -*test.test_capi.test_misc.CAPITest.test_mapping_keys_values_items_bad_arg -*test.test_capi.test_misc.CAPITest.test_memoryview_from_NULL_pointer -*test.test_capi.test_misc.CAPITest.test_negative_refcount -*test.test_capi.test_misc.CAPITest.test_null_type_doc -*test.test_capi.test_misc.CAPITest.test_pynumber_tobase -*test.test_capi.test_misc.CAPITest.test_pyobject_bytes_from_null -*test.test_capi.test_misc.CAPITest.test_pyobject_repr_from_null -*test.test_capi.test_misc.CAPITest.test_pyobject_str_from_null -*test.test_capi.test_misc.CAPITest.test_return_null_without_error -*test.test_capi.test_misc.CAPITest.test_return_result_with_error -*test.test_capi.test_misc.CAPITest.test_subprocess_fork_exec -*test.test_capi.test_misc.PyMemDefaultTests.test_api_misuse -*test.test_capi.test_misc.PyMemDefaultTests.test_buffer_overflow -*test.test_capi.test_misc.PyMemDefaultTests.test_pymem_malloc_without_gil -*test.test_capi.test_misc.PyMemDefaultTests.test_pyobject_forbidden_bytes_is_freed -*test.test_capi.test_misc.PyMemDefaultTests.test_pyobject_freed_is_freed -*test.test_capi.test_misc.PyMemDefaultTests.test_pyobject_malloc_without_gil -*test.test_capi.test_misc.PyMemDefaultTests.test_pyobject_null_is_freed -*test.test_capi.test_misc.PyMemDefaultTests.test_pyobject_uninitialized_is_freed -*test.test_capi.test_misc.PyMemPymallocDebugTests.test_api_misuse -*test.test_capi.test_misc.PyMemPymallocDebugTests.test_buffer_overflow -*test.test_capi.test_misc.PyMemPymallocDebugTests.test_pymem_malloc_without_gil -*test.test_capi.test_misc.PyMemPymallocDebugTests.test_pyobject_forbidden_bytes_is_freed -*test.test_capi.test_misc.PyMemPymallocDebugTests.test_pyobject_freed_is_freed -*test.test_capi.test_misc.PyMemPymallocDebugTests.test_pyobject_malloc_without_gil -*test.test_capi.test_misc.PyMemPymallocDebugTests.test_pyobject_null_is_freed -*test.test_capi.test_misc.PyMemPymallocDebugTests.test_pyobject_uninitialized_is_freed -*test.test_capi.test_misc.Test_testcapi.test_buildvalue_issue38913 -*test.test_capi.test_misc.Test_testcapi.test_config -*test.test_capi.test_misc.Test_testcapi.test_datetime_capi -*test.test_capi.test_misc.Test_testcapi.test_decref_doesnt_leak -*test.test_capi.test_misc.Test_testcapi.test_dict_iteration -*test.test_capi.test_misc.Test_testcapi.test_empty_argparse -*test.test_capi.test_misc.Test_testcapi.test_incref_decref_API -*test.test_capi.test_misc.Test_testcapi.test_incref_doesnt_leak -*test.test_capi.test_misc.Test_testcapi.test_long_api -*test.test_capi.test_misc.Test_testcapi.test_long_as_size_t -*test.test_capi.test_misc.Test_testcapi.test_long_as_unsigned_long_long_mask -*test.test_capi.test_misc.Test_testcapi.test_longlong_api -*test.test_capi.test_misc.Test_testcapi.test_null_strings -*test.test_capi.test_misc.Test_testcapi.test_sizeof_c_types -*test.test_capi.test_misc.Test_testcapi.test_string_from_format -*test.test_capi.test_misc.Test_testcapi.test_structseq_newtype_doesnt_leak -*test.test_capi.test_misc.Test_testcapi.test_with_docstring -*test.test_capi.test_misc.Test_testcapi.test_xdecref_doesnt_leak -*test.test_capi.test_misc.Test_testcapi.test_xincref_doesnt_leak -*test.test_capi.test_structmembers.ReadWriteTests.test_bad_assignments -*test.test_capi.test_structmembers.ReadWriteTests.test_bool -*test.test_capi.test_structmembers.ReadWriteTests.test_byte -*test.test_capi.test_structmembers.ReadWriteTests.test_inplace_string -*test.test_capi.test_structmembers.ReadWriteTests.test_int -*test.test_capi.test_structmembers.ReadWriteTests.test_long -*test.test_capi.test_structmembers.ReadWriteTests.test_longlong -*test.test_capi.test_structmembers.ReadWriteTests.test_py_ssize_t -*test.test_capi.test_structmembers.ReadWriteTests.test_short +test.test_capi.test_codecs.CAPITest.test_decodeutf8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_codecs.CAPITest.test_decodeutf8stateful @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_eval_code_ex.PyEval_EvalCodeExTests.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_eval_code_ex.PyEval_EvalCodeExTests.test_with_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_eval_code_ex.PyEval_EvalCodeExTests.test_with_closure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_eval_code_ex.PyEval_EvalCodeExTests.test_with_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_eval_code_ex.PyEval_EvalCodeExTests.test_with_kwarg_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Boolean_TestCase.test_p @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Bytes_TestCase.test_c @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Bytes_TestCase.test_w_star @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Bytes_TestCase.test_y @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Bytes_TestCase.test_y_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Bytes_TestCase.test_y_star @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Float_TestCase.test_D @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Float_TestCase.test_d @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Float_TestCase.test_f @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Float_TestCase.test_f_rounding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.KeywordOnly_TestCase.test_invalid_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.KeywordOnly_TestCase.test_keyword_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.KeywordOnly_TestCase.test_mixed_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.KeywordOnly_TestCase.test_optional_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.KeywordOnly_TestCase.test_positional_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.KeywordOnly_TestCase.test_required_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.KeywordOnly_TestCase.test_surrogate_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.KeywordOnly_TestCase.test_too_many_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Keywords_TestCase.test_invalid_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Keywords_TestCase.test_keyword_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Keywords_TestCase.test_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Keywords_TestCase.test_mixed_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Keywords_TestCase.test_optional_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Keywords_TestCase.test_positional_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Keywords_TestCase.test_required_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Keywords_TestCase.test_surrogate_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Keywords_TestCase.test_too_many_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.LongLong_TestCase.test_K @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.LongLong_TestCase.test_L @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Object_TestCase.test_S @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Object_TestCase.test_Y @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.ParseTupleAndKeywords_Test.test_bad_use @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.ParseTupleAndKeywords_Test.test_nested_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.ParseTupleAndKeywords_Test.test_parse_tuple_and_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.ParseTupleAndKeywords_Test.test_positional_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.PositionalOnlyAndKeywords_TestCase.test_empty_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.PositionalOnlyAndKeywords_TestCase.test_mixed_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.PositionalOnlyAndKeywords_TestCase.test_optional_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.PositionalOnlyAndKeywords_TestCase.test_positional_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.PositionalOnlyAndKeywords_TestCase.test_required_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Signed_TestCase.test_h @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Signed_TestCase.test_i @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Signed_TestCase.test_l @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Signed_TestCase.test_n @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.SkipitemTest.test_skipitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.SkipitemTest.test_skipitem_with_suffix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.String_TestCase.test_C @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.String_TestCase.test_gh_99240_clear_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.String_TestCase.test_s @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.String_TestCase.test_s_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.String_TestCase.test_s_hash_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.String_TestCase.test_s_star @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.String_TestCase.test_z @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.String_TestCase.test_z_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.String_TestCase.test_z_star @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Test_testcapi.test_L_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Test_testcapi.test_k_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Test_testcapi.test_s_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Tuple_TestCase.test_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Tuple_TestCase.test_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Unsigned_TestCase.test_B @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Unsigned_TestCase.test_H @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Unsigned_TestCase.test_I @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Unsigned_TestCase.test_b @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_getargs.Unsigned_TestCase.test_k @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_c_type_with_ipow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_c_type_with_matrix_multiplication @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_export_symbols @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_getitem_with_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_heaptype_with_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_heaptype_with_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_heaptype_with_negative_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_heaptype_with_setattro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_instancemethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_mapping_has_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_mapping_keys_values_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_mapping_keys_values_items_bad_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_memoryview_from_NULL_pointer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_multiple_inheritance_ctypes_with_weakref_or_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_null_type_doc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_pynumber_tobase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_pyobject_bytes_from_null @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_pyobject_repr_from_null @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_pyobject_str_from_null @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_return_null_without_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_return_result_with_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_sequence_del_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_sequence_set_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_subprocess_fork_exec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.CAPITest.test_sys_getobject @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +# Segfaults most of the time +!test.test_capi.test_misc.CAPITest.test_trashcan_subclass +test.test_capi.test_misc.Test_FrameAPI.test_frame_fback_api @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_FrameAPI.test_frame_getters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_ModuleStateAccess.test_get_module_bad_def @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_ModuleStateAccess.test_get_module_static_in_mro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_ModuleStateAccess.test_subclass_get_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_ModuleStateAccess.test_subclass_get_module_with_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_buildvalue_issue38913 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_config @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_datetime_capi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_decref_doesnt_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_dict_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_empty_argparse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_from_contiguous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_gc_control @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_get_statictype_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_get_type_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_get_type_qualname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_incref_decref_API @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_incref_doesnt_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_lazy_hash_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_list_api @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_long_and_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_long_api @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_long_as_double @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_long_as_size_t @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_long_as_unsigned_long_long_mask @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_long_long_and_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_long_numbits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_longlong_api @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_mapping_has_key_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_py_is_funcs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_py_is_macros @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_pymem_alloc0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_pythread_tss_key_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_set_type_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_sizeof_c_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_string_from_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_string_to_double @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_structseq_newtype_doesnt_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_type_from_ephemeral_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_unicode_compare_with_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_with_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_xdecref_doesnt_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_xincref_doesnt_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_structmembers.ReadWriteTests.test_bad_assignments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_structmembers.ReadWriteTests.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_structmembers.ReadWriteTests.test_byte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_structmembers.ReadWriteTests.test_inplace_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_structmembers.ReadWriteTests.test_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_structmembers.ReadWriteTests.test_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_structmembers.ReadWriteTests.test_longlong @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_structmembers.ReadWriteTests.test_py_ssize_t @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_capi.test_structmembers.ReadWriteTests.test_short @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cgi.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cgi.txt index a1c5f39c38..0476b1b92f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cgi.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cgi.txt @@ -1,23 +1,23 @@ -*graalpython.lib-python.3.test.test_cgi.CgiTests.testQSAndFormData -*graalpython.lib-python.3.test.test_cgi.CgiTests.testQSAndFormDataFile -*graalpython.lib-python.3.test.test_cgi.CgiTests.testQSAndUrlEncode -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_all -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_field_storage_multipart_no_content_length -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_fieldstorage_as_context_manager -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_fieldstorage_invalid -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_fieldstorage_multipart -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_fieldstorage_multipart_leading_whitespace -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_fieldstorage_multipart_maxline -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_fieldstorage_multipart_non_ascii -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_fieldstorage_multipart_w3c -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_fieldstorage_part_content_length -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_fieldstorage_properties -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_fieldstorage_readline -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_log -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_max_num_fields -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_parse_header -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_parse_multipart -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_parse_multipart_invalid_encoding -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_parse_multipart_without_content_length -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_separator -*graalpython.lib-python.3.test.test_cgi.CgiTests.test_strict +test.test_cgi.CgiTests.testQSAndFormData @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.testQSAndFormDataFile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.testQSAndUrlEncode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_field_storage_multipart_no_content_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_fieldstorage_as_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_fieldstorage_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_fieldstorage_multipart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_fieldstorage_multipart_leading_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_fieldstorage_multipart_maxline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_fieldstorage_multipart_non_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_fieldstorage_multipart_w3c @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_fieldstorage_part_content_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_fieldstorage_properties @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_fieldstorage_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_log @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_max_num_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_parse_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_parse_multipart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_parse_multipart_invalid_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_parse_multipart_without_content_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_separator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgi.CgiTests.test_strict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cgitb.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cgitb.txt index 9f54662a8e..b875a115be 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cgitb.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cgitb.txt @@ -1,6 +1,6 @@ -*graalpython.lib-python.3.test.test_cgitb.TestCgitb.test_blanks -*graalpython.lib-python.3.test.test_cgitb.TestCgitb.test_fonts -*graalpython.lib-python.3.test.test_cgitb.TestCgitb.test_html -*graalpython.lib-python.3.test.test_cgitb.TestCgitb.test_syshook_no_logdir_default_format -*graalpython.lib-python.3.test.test_cgitb.TestCgitb.test_syshook_no_logdir_text_format -*graalpython.lib-python.3.test.test_cgitb.TestCgitb.test_text +test.test_cgitb.TestCgitb.test_blanks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgitb.TestCgitb.test_fonts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgitb.TestCgitb.test_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgitb.TestCgitb.test_syshook_no_logdir_default_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgitb.TestCgitb.test_syshook_no_logdir_text_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cgitb.TestCgitb.test_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_charmapcodec.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_charmapcodec.txt index e8b43209f8..089d89c413 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_charmapcodec.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_charmapcodec.txt @@ -1,4 +1,4 @@ -*graalpython.lib-python.3.test.test_charmapcodec.CharmapCodecTest.test_constructorx -*graalpython.lib-python.3.test.test_charmapcodec.CharmapCodecTest.test_constructory -*graalpython.lib-python.3.test.test_charmapcodec.CharmapCodecTest.test_encodex -*graalpython.lib-python.3.test.test_charmapcodec.CharmapCodecTest.test_maptoundefined +test.test_charmapcodec.CharmapCodecTest.test_constructorx @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_charmapcodec.CharmapCodecTest.test_constructory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_charmapcodec.CharmapCodecTest.test_encodex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_charmapcodec.CharmapCodecTest.test_maptoundefined @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_class.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_class.txt index 53d689aefe..e137bef09e 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_class.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_class.txt @@ -1,16 +1,15 @@ -*graalpython.lib-python.3.test.test_class.ClassTests.testBadTypeReturned -*graalpython.lib-python.3.test.test_class.ClassTests.testBinaryOps -*graalpython.lib-python.3.test.test_class.ClassTests.testClassWithExtCall -*graalpython.lib-python.3.test.test_class.ClassTests.testConstructorErrorMessages -*graalpython.lib-python.3.test.test_class.ClassTests.testDel -*graalpython.lib-python.3.test.test_class.ClassTests.testForExceptionsRaisedInInstanceGetattr2 -*graalpython.lib-python.3.test.test_class.ClassTests.testGetSetAndDel -*graalpython.lib-python.3.test.test_class.ClassTests.testHashComparisonOfMethods -*graalpython.lib-python.3.test.test_class.ClassTests.testHashStuff -*graalpython.lib-python.3.test.test_class.ClassTests.testInit -*graalpython.lib-python.3.test.test_class.ClassTests.testListAndDictOps -*graalpython.lib-python.3.test.test_class.ClassTests.testMisc -*graalpython.lib-python.3.test.test_class.ClassTests.testSFBug532646 -*graalpython.lib-python.3.test.test_class.ClassTests.testSetattrNonStringName -*graalpython.lib-python.3.test.test_class.ClassTests.testSetattrWrapperNameIntern -*graalpython.lib-python.3.test.test_class.ClassTests.testUnaryOps +test.test_class.ClassTests.testBadTypeReturned @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_class.ClassTests.testBinaryOps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_class.ClassTests.testClassWithExtCall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_class.ClassTests.testConstructorErrorMessages @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_class.ClassTests.testForExceptionsRaisedInInstanceGetattr2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_class.ClassTests.testGetSetAndDel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_class.ClassTests.testHashComparisonOfMethods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_class.ClassTests.testHashStuff @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_class.ClassTests.testInit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_class.ClassTests.testListAndDictOps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_class.ClassTests.testMisc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_class.ClassTests.testSFBug532646 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_class.ClassTests.testSetattrNonStringName @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_class.ClassTests.testSetattrWrapperNameIntern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_class.ClassTests.testUnaryOps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cmath.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cmath.txt index 32b3570f60..f10de6fdf6 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cmath.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cmath.txt @@ -1,32 +1,31 @@ -*graalpython.lib-python.3.test.test_cmath.CMathTests.testAtanSign -*graalpython.lib-python.3.test.test_cmath.CMathTests.testAtanhSign -*graalpython.lib-python.3.test.test_cmath.CMathTests.testTanhSign -*graalpython.lib-python.3.test.test_cmath.CMathTests.test_abs -*graalpython.lib-python.3.test.test_cmath.CMathTests.test_abs_overflows -*graalpython.lib-python.3.test.test_cmath.CMathTests.test_cmath_matches_math -*graalpython.lib-python.3.test.test_cmath.CMathTests.test_constants -*graalpython.lib-python.3.test.test_cmath.CMathTests.test_infinity_and_nan_constants -*graalpython.lib-python.3.test.test_cmath.CMathTests.test_input_type -*graalpython.lib-python.3.test.test_cmath.CMathTests.test_isfinite -*graalpython.lib-python.3.test.test_cmath.CMathTests.test_isinf -*graalpython.lib-python.3.test.test_cmath.CMathTests.test_isnan -*graalpython.lib-python.3.test.test_cmath.CMathTests.test_phase -*graalpython.lib-python.3.test.test_cmath.CMathTests.test_polar -*graalpython.lib-python.3.test.test_cmath.CMathTests.test_polar_errno -*graalpython.lib-python.3.test.test_cmath.CMathTests.test_rect -*graalpython.lib-python.3.test.test_cmath.CMathTests.test_specific_values -*graalpython.lib-python.3.test.test_cmath.CMathTests.test_user_object -*graalpython.lib-python.3.test.test_cmath.IsCloseTests.test_asymmetry -*graalpython.lib-python.3.test.test_cmath.IsCloseTests.test_complex_near_zero -*graalpython.lib-python.3.test.test_cmath.IsCloseTests.test_complex_values -*graalpython.lib-python.3.test.test_cmath.IsCloseTests.test_decimals -*graalpython.lib-python.3.test.test_cmath.IsCloseTests.test_eight_decimal_places -*graalpython.lib-python.3.test.test_cmath.IsCloseTests.test_fractions -*graalpython.lib-python.3.test.test_cmath.IsCloseTests.test_identical -*graalpython.lib-python.3.test.test_cmath.IsCloseTests.test_identical_infinite -*graalpython.lib-python.3.test.test_cmath.IsCloseTests.test_inf_ninf_nan -*graalpython.lib-python.3.test.test_cmath.IsCloseTests.test_integers -*graalpython.lib-python.3.test.test_cmath.IsCloseTests.test_near_zero -*graalpython.lib-python.3.test.test_cmath.IsCloseTests.test_negative_tolerances -*graalpython.lib-python.3.test.test_cmath.IsCloseTests.test_reject_complex_tolerances -*graalpython.lib-python.3.test.test_cmath.IsCloseTests.test_zero_tolerance +test.test_cmath.CMathTests.testAtanSign @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.CMathTests.testAtanhSign @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.CMathTests.testTanhSign @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.CMathTests.test_abs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.CMathTests.test_abs_overflows @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.CMathTests.test_cmath_matches_math @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.CMathTests.test_constants @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.CMathTests.test_infinity_and_nan_constants @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.CMathTests.test_input_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.CMathTests.test_isfinite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.CMathTests.test_isinf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.CMathTests.test_isnan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.CMathTests.test_phase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.CMathTests.test_polar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.CMathTests.test_rect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.CMathTests.test_specific_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.CMathTests.test_user_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.IsCloseTests.test_asymmetry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.IsCloseTests.test_complex_near_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.IsCloseTests.test_complex_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.IsCloseTests.test_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.IsCloseTests.test_eight_decimal_places @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.IsCloseTests.test_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.IsCloseTests.test_identical @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.IsCloseTests.test_identical_infinite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.IsCloseTests.test_inf_ninf_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.IsCloseTests.test_integers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.IsCloseTests.test_near_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.IsCloseTests.test_negative_tolerances @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.IsCloseTests.test_reject_complex_tolerances @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmath.IsCloseTests.test_zero_tolerance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cmd.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cmd.txt index 5dbbf579d8..d66e6c3d8e 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cmd.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cmd.txt @@ -1,3 +1,3 @@ -*graalpython.lib-python.3.test.test_cmd.TestAlternateInput.test_file_with_missing_final_nl -*graalpython.lib-python.3.test.test_cmd.TestAlternateInput.test_input_reset_at_EOF -*graalpython.lib-python.3.test.test_cmd.TestMain.test_main +DocTestCase.test.test_cmd.samplecmdclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd.TestAlternateInput.test_file_with_missing_final_nl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd.TestAlternateInput.test_input_reset_at_EOF @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cmd_line.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cmd_line.txt index 0ef15f1a0f..9d65f170ce 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cmd_line.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cmd_line.txt @@ -1,25 +1,25 @@ -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_argv0_normalization -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_builtin_input -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_closed_stdout -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_coding -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_del___main__ -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_directories -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_empty_PYTHONPATH_issue16309 -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_help_env -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_isolatedmode -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_large_PYTHONPATH -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_non_ascii -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_optimize -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_osx_android_utf8 -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_output_newline -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_run_code -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_run_module -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_run_module_bug1764407 -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_site_flag -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_stdin_readline -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_unbuffered_input -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_unbuffered_output -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_unmached_quote -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_usage -*graalpython.lib-python.3.test.test_cmd_line.CmdLineTest.test_verbose -*graalpython.lib-python.3.test.test_cmd_line.IgnoreEnvironmentTest.test_ignore_PYTHONPATH +test.test_cmd_line.CmdLineTest.test_argv0_normalization @ win32-AMD64 +test.test_cmd_line.CmdLineTest.test_builtin_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_cmd_line.CmdLineTest.test_closed_stdout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line.CmdLineTest.test_coding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_cmd_line.CmdLineTest.test_del___main__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_cmd_line.CmdLineTest.test_directories @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line.CmdLineTest.test_empty_PYTHONPATH_issue16309 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line.CmdLineTest.test_help_env @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line.CmdLineTest.test_isolatedmode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line.CmdLineTest.test_large_PYTHONPATH @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line.CmdLineTest.test_non_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_cmd_line.CmdLineTest.test_optimize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line.CmdLineTest.test_osx_android_utf8 @ darwin-arm64,darwin-x86_64 +test.test_cmd_line.CmdLineTest.test_output_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_cmd_line.CmdLineTest.test_run_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line.CmdLineTest.test_run_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line.CmdLineTest.test_run_module_bug1764407 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line.CmdLineTest.test_site_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line.CmdLineTest.test_stdin_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_cmd_line.CmdLineTest.test_unbuffered_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line.CmdLineTest.test_unbuffered_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line.CmdLineTest.test_unmached_quote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line.CmdLineTest.test_verbose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line.CmdLineTest.test_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line.IgnoreEnvironmentTest.test_ignore_PYTHONPATH @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cmd_line_script.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cmd_line_script.txt index 4ce4a71bb7..1b2240f5a2 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cmd_line_script.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cmd_line_script.txt @@ -1,16 +1,19 @@ -*graalpython.lib-python.3.test.test_cmd_line_script.CmdLineTest.test_consistent_sys_path_for_direct_execution -*graalpython.lib-python.3.test.test_cmd_line_script.CmdLineTest.test_consistent_sys_path_for_module_execution -*graalpython.lib-python.3.test.test_cmd_line_script.CmdLineTest.test_dash_m_bad_pyc -*graalpython.lib-python.3.test.test_cmd_line_script.CmdLineTest.test_dash_m_error_code_is_one -*graalpython.lib-python.3.test.test_cmd_line_script.CmdLineTest.test_dash_m_errors -*graalpython.lib-python.3.test.test_cmd_line_script.CmdLineTest.test_dash_m_init_traceback -*graalpython.lib-python.3.test.test_cmd_line_script.CmdLineTest.test_dash_m_main_traceback -*graalpython.lib-python.3.test.test_cmd_line_script.CmdLineTest.test_directory_error -*graalpython.lib-python.3.test.test_cmd_line_script.CmdLineTest.test_hint_when_triying_to_import_a_py_file -*graalpython.lib-python.3.test.test_cmd_line_script.CmdLineTest.test_issue20500_exit_with_exception_value -*graalpython.lib-python.3.test.test_cmd_line_script.CmdLineTest.test_issue20884 -*graalpython.lib-python.3.test.test_cmd_line_script.CmdLineTest.test_issue8202_dash_c_file_ignored -*graalpython.lib-python.3.test.test_cmd_line_script.CmdLineTest.test_nonexisting_script -*graalpython.lib-python.3.test.test_cmd_line_script.CmdLineTest.test_package_error -*graalpython.lib-python.3.test.test_cmd_line_script.CmdLineTest.test_package_recursion -*graalpython.lib-python.3.test.test_cmd_line_script.CmdLineTest.test_pep_409_verbiage +test.test_cmd_line_script.CmdLineTest.test_consistent_sys_path_for_direct_execution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line_script.CmdLineTest.test_consistent_sys_path_for_module_execution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line_script.CmdLineTest.test_dash_m_bad_pyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line_script.CmdLineTest.test_dash_m_error_code_is_one @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line_script.CmdLineTest.test_dash_m_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line_script.CmdLineTest.test_dash_m_init_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line_script.CmdLineTest.test_dash_m_main_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line_script.CmdLineTest.test_directory_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line_script.CmdLineTest.test_hint_when_triying_to_import_a_py_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line_script.CmdLineTest.test_issue20500_exit_with_exception_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line_script.CmdLineTest.test_issue20884 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line_script.CmdLineTest.test_issue8202_dash_c_file_ignored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line_script.CmdLineTest.test_non_ascii @ darwin-arm64,darwin-x86_64 +test.test_cmd_line_script.CmdLineTest.test_nonexisting_script @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line_script.CmdLineTest.test_package_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line_script.CmdLineTest.test_package_recursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line_script.CmdLineTest.test_pep_409_verbiage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cmd_line_script.CmdLineTest.test_script_as_dev_fd @ linux-aarch64,linux-x86_64 +test.test_cmd_line_script.CmdLineTest.test_zipfile_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_code.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_code.txt index b560a96d1c..ed337c978a 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_code.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_code.txt @@ -1,13 +1,5 @@ -*graalpython.lib-python.3.test.test_code.CodeConstsTest.test_interned_string -*graalpython.lib-python.3.test.test_code.CodeConstsTest.test_interned_string_default -*graalpython.lib-python.3.test.test_code.CodeConstsTest.test_interned_string_in_frozenset -*graalpython.lib-python.3.test.test_code.CodeConstsTest.test_interned_string_in_tuple -*graalpython.lib-python.3.test.test_code.CodeConstsTest.test_interned_string_with_null -*graalpython.lib-python.3.test.test_code.CodeLocationTest.test_code_new_empty -*graalpython.lib-python.3.test.test_code.CodeTest.test_closure_injection -*graalpython.lib-python.3.test.test_code.CodeTest.test_constructor -*graalpython.lib-python.3.test.test_code.CodeTest.test_newempty -*graalpython.lib-python.3.test.test_code.CodeTest.test_qualname -*graalpython.lib-python.3.test.test_code.CodeTest.test_replace -*graalpython.lib-python.3.test.test_code.CodeTest.test_shrinking_localsplus -*graalpython.lib-python.3.test.test_code.CodeWeakRefTest.test_basic +DocTestCase.test.test_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_code.CodeTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_code.CodeTest.test_qualname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_code.CodeTest.test_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_code.CodeTest.test_shrinking_localsplus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_code_module.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_code_module.txt index 7e7ca2bd99..2256b210e2 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_code_module.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_code_module.txt @@ -1,9 +1,9 @@ -*graalpython.lib-python.3.test.test_code_module.TestInteractiveConsole.test_banner -*graalpython.lib-python.3.test.test_code_module.TestInteractiveConsole.test_cause_tb -*graalpython.lib-python.3.test.test_code_module.TestInteractiveConsole.test_console_stderr -*graalpython.lib-python.3.test.test_code_module.TestInteractiveConsole.test_context_tb -*graalpython.lib-python.3.test.test_code_module.TestInteractiveConsole.test_exit_msg -*graalpython.lib-python.3.test.test_code_module.TestInteractiveConsole.test_ps1 -*graalpython.lib-python.3.test.test_code_module.TestInteractiveConsole.test_ps2 -*graalpython.lib-python.3.test.test_code_module.TestInteractiveConsole.test_syntax_error -*graalpython.lib-python.3.test.test_code_module.TestInteractiveConsole.test_sysexcepthook +test.test_code_module.TestInteractiveConsole.test_banner @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_code_module.TestInteractiveConsole.test_cause_tb @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_code_module.TestInteractiveConsole.test_console_stderr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_code_module.TestInteractiveConsole.test_context_tb @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_code_module.TestInteractiveConsole.test_exit_msg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_code_module.TestInteractiveConsole.test_ps1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_code_module.TestInteractiveConsole.test_ps2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_code_module.TestInteractiveConsole.test_syntax_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_code_module.TestInteractiveConsole.test_sysexcepthook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codeccallbacks.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codeccallbacks.txt index dbdef3b3bf..574f9af75f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codeccallbacks.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codeccallbacks.txt @@ -1,18 +1,18 @@ -*graalpython.lib-python.3.test.test_codeccallbacks.CodecCallbackTest.test_backslashescape -*graalpython.lib-python.3.test.test_codeccallbacks.CodecCallbackTest.test_badandgoodbackslashreplaceexceptions -*graalpython.lib-python.3.test.test_codeccallbacks.CodecCallbackTest.test_badandgoodignoreexceptions -*graalpython.lib-python.3.test.test_codeccallbacks.CodecCallbackTest.test_badandgoodnamereplaceexceptions -*graalpython.lib-python.3.test.test_codeccallbacks.CodecCallbackTest.test_badandgoodreplaceexceptions -*graalpython.lib-python.3.test.test_codeccallbacks.CodecCallbackTest.test_badandgoodstrictexceptions -*graalpython.lib-python.3.test.test_codeccallbacks.CodecCallbackTest.test_badandgoodsurrogateescapeexceptions -*graalpython.lib-python.3.test.test_codeccallbacks.CodecCallbackTest.test_badandgoodsurrogatepassexceptions -*graalpython.lib-python.3.test.test_codeccallbacks.CodecCallbackTest.test_badandgoodxmlcharrefreplaceexceptions -*graalpython.lib-python.3.test.test_codeccallbacks.CodecCallbackTest.test_badlookupcall -*graalpython.lib-python.3.test.test_codeccallbacks.CodecCallbackTest.test_badregistercall -*graalpython.lib-python.3.test.test_codeccallbacks.CodecCallbackTest.test_bug828737 -*graalpython.lib-python.3.test.test_codeccallbacks.CodecCallbackTest.test_charmapencode -*graalpython.lib-python.3.test.test_codeccallbacks.CodecCallbackTest.test_fake_error_class -*graalpython.lib-python.3.test.test_codeccallbacks.CodecCallbackTest.test_lookup -*graalpython.lib-python.3.test.test_codeccallbacks.CodecCallbackTest.test_translatehelper -*graalpython.lib-python.3.test.test_codeccallbacks.CodecCallbackTest.test_unknownhandler -*graalpython.lib-python.3.test.test_codeccallbacks.CodecCallbackTest.test_xmlcharrefreplace +test.test_codeccallbacks.CodecCallbackTest.test_backslashescape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeccallbacks.CodecCallbackTest.test_badandgoodbackslashreplaceexceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeccallbacks.CodecCallbackTest.test_badandgoodignoreexceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeccallbacks.CodecCallbackTest.test_badandgoodnamereplaceexceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeccallbacks.CodecCallbackTest.test_badandgoodreplaceexceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeccallbacks.CodecCallbackTest.test_badandgoodstrictexceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeccallbacks.CodecCallbackTest.test_badandgoodsurrogateescapeexceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeccallbacks.CodecCallbackTest.test_badandgoodsurrogatepassexceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeccallbacks.CodecCallbackTest.test_badandgoodxmlcharrefreplaceexceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeccallbacks.CodecCallbackTest.test_badlookupcall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeccallbacks.CodecCallbackTest.test_badregistercall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeccallbacks.CodecCallbackTest.test_bug828737 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeccallbacks.CodecCallbackTest.test_charmapencode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeccallbacks.CodecCallbackTest.test_fake_error_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeccallbacks.CodecCallbackTest.test_lookup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeccallbacks.CodecCallbackTest.test_translatehelper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeccallbacks.CodecCallbackTest.test_unknownhandler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeccallbacks.CodecCallbackTest.test_xmlcharrefreplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_cn.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_cn.txt index f94b2114cb..e8f20e2baa 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_cn.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_cn.txt @@ -1,21 +1,19 @@ -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GB18030.test_chunkcoding -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GB18030.test_customreplace_encode -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GB18030.test_incrementaldecoder -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GB18030.test_incrementalencoder -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GB18030.test_streamwriter -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GB18030.test_streamwriter_reset_no_pending -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GB18030.test_xmlcharrefreplace -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GB2312.test_chunkcoding -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GB2312.test_errorhandle -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GB2312.test_incrementaldecoder -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GB2312.test_incrementalencoder -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GB2312.test_streamwriter -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GB2312.test_streamwriter_reset_no_pending -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GB2312.test_xmlcharrefreplace -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GBK.test_chunkcoding -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GBK.test_errorhandle -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GBK.test_incrementaldecoder -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GBK.test_incrementalencoder -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GBK.test_streamwriter -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GBK.test_streamwriter_reset_no_pending -*graalpython.lib-python.3.test.test_codecencodings_cn.Test_GBK.test_xmlcharrefreplace +test.test_codecencodings_cn.Test_GB18030.test_chunkcoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_cn.Test_GB18030.test_incrementaldecoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_cn.Test_GB18030.test_incrementalencoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_cn.Test_GB18030.test_streamwriter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_cn.Test_GB18030.test_streamwriter_reset_no_pending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_cn.Test_GB2312.test_chunkcoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_cn.Test_GB2312.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_cn.Test_GB2312.test_incrementaldecoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_cn.Test_GB2312.test_incrementalencoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_cn.Test_GB2312.test_streamwriter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_cn.Test_GB2312.test_streamwriter_reset_no_pending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_cn.Test_GB2312.test_xmlcharrefreplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_cn.Test_GBK.test_chunkcoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_cn.Test_GBK.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_cn.Test_GBK.test_incrementaldecoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_cn.Test_GBK.test_incrementalencoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_cn.Test_GBK.test_streamwriter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_cn.Test_GBK.test_streamwriter_reset_no_pending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_cn.Test_GBK.test_xmlcharrefreplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_hk.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_hk.txt index d0f7569632..821393bea5 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_hk.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_hk.txt @@ -1,2 +1,2 @@ -*graalpython.lib-python.3.test.test_codecencodings_hk.Test_Big5HKSCS.test_streamwriter_reset_no_pending -*graalpython.lib-python.3.test.test_codecencodings_hk.Test_Big5HKSCS.test_xmlcharrefreplace +test.test_codecencodings_hk.Test_Big5HKSCS.test_streamwriter_reset_no_pending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_hk.Test_Big5HKSCS.test_xmlcharrefreplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_iso2022.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_iso2022.txt index 86fc26d34c..25f085d3c6 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_iso2022.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_iso2022.txt @@ -1,9 +1,8 @@ -*graalpython.lib-python.3.test.test_codecencodings_iso2022.Test_ISO2022_JP.test_chunkcoding -*graalpython.lib-python.3.test.test_codecencodings_iso2022.Test_ISO2022_JP.test_streamwriter_reset_no_pending -*graalpython.lib-python.3.test.test_codecencodings_iso2022.Test_ISO2022_JP.test_xmlcharrefreplace -*graalpython.lib-python.3.test.test_codecencodings_iso2022.Test_ISO2022_JP2.test_chunkcoding -*graalpython.lib-python.3.test.test_codecencodings_iso2022.Test_ISO2022_JP2.test_streamwriter_reset_no_pending -*graalpython.lib-python.3.test.test_codecencodings_iso2022.Test_ISO2022_JP2.test_xmlcharrefreplace -*graalpython.lib-python.3.test.test_codecencodings_iso2022.Test_ISO2022_KR.test_chunkcoding -*graalpython.lib-python.3.test.test_codecencodings_iso2022.Test_ISO2022_KR.test_streamwriter_reset_no_pending -*graalpython.lib-python.3.test.test_codecencodings_iso2022.Test_ISO2022_KR.test_xmlcharrefreplace +test.test_codecencodings_iso2022.Test_ISO2022_JP.test_chunkcoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_iso2022.Test_ISO2022_JP.test_streamwriter_reset_no_pending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_iso2022.Test_ISO2022_JP.test_xmlcharrefreplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_iso2022.Test_ISO2022_JP2.test_chunkcoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_iso2022.Test_ISO2022_JP2.test_streamwriter_reset_no_pending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_iso2022.Test_ISO2022_JP2.test_xmlcharrefreplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_iso2022.Test_ISO2022_KR.test_streamwriter_reset_no_pending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_iso2022.Test_ISO2022_KR.test_xmlcharrefreplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_jp.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_jp.txt index 6d007815b0..9082803402 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_jp.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_jp.txt @@ -1,23 +1,23 @@ -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_CP932.test_chunkcoding -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_CP932.test_errorhandle -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_CP932.test_incrementaldecoder -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_CP932.test_incrementalencoder -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_CP932.test_streamwriter -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_CP932.test_streamwriter_reset_no_pending -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_CP932.test_xmlcharrefreplace -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_EUC_JP_COMPAT.test_chunkcoding -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_EUC_JP_COMPAT.test_incrementaldecoder -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_EUC_JP_COMPAT.test_incrementalencoder -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_EUC_JP_COMPAT.test_streamwriter -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_EUC_JP_COMPAT.test_streamwriter_reset_no_pending -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_EUC_JP_COMPAT.test_xmlcharrefreplace -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_SJISX0213.test_chunkcoding -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_SJISX0213.test_incrementaldecoder -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_SJISX0213.test_streamwriter_reset_no_pending -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_SJISX0213.test_xmlcharrefreplace -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_SJIS_COMPAT.test_chunkcoding -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_SJIS_COMPAT.test_incrementaldecoder -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_SJIS_COMPAT.test_incrementalencoder -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_SJIS_COMPAT.test_streamwriter -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_SJIS_COMPAT.test_streamwriter_reset_no_pending -*graalpython.lib-python.3.test.test_codecencodings_jp.Test_SJIS_COMPAT.test_xmlcharrefreplace +test.test_codecencodings_jp.Test_CP932.test_chunkcoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_CP932.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_CP932.test_incrementaldecoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_CP932.test_incrementalencoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_CP932.test_streamwriter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_CP932.test_streamwriter_reset_no_pending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_CP932.test_xmlcharrefreplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_EUC_JP_COMPAT.test_chunkcoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_EUC_JP_COMPAT.test_incrementaldecoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_EUC_JP_COMPAT.test_incrementalencoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_EUC_JP_COMPAT.test_streamwriter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_EUC_JP_COMPAT.test_streamwriter_reset_no_pending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_EUC_JP_COMPAT.test_xmlcharrefreplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_SJISX0213.test_chunkcoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_SJISX0213.test_incrementaldecoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_SJISX0213.test_streamwriter_reset_no_pending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_SJISX0213.test_xmlcharrefreplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_SJIS_COMPAT.test_chunkcoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_SJIS_COMPAT.test_incrementaldecoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_SJIS_COMPAT.test_incrementalencoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_SJIS_COMPAT.test_streamwriter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_SJIS_COMPAT.test_streamwriter_reset_no_pending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_jp.Test_SJIS_COMPAT.test_xmlcharrefreplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_kr.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_kr.txt index da9fd442fd..5537652a12 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_kr.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_kr.txt @@ -1,16 +1,16 @@ -*graalpython.lib-python.3.test.test_codecencodings_kr.Test_CP949.test_chunkcoding -*graalpython.lib-python.3.test.test_codecencodings_kr.Test_CP949.test_errorhandle -*graalpython.lib-python.3.test.test_codecencodings_kr.Test_CP949.test_incrementaldecoder -*graalpython.lib-python.3.test.test_codecencodings_kr.Test_CP949.test_incrementalencoder -*graalpython.lib-python.3.test.test_codecencodings_kr.Test_CP949.test_streamwriter -*graalpython.lib-python.3.test.test_codecencodings_kr.Test_CP949.test_streamwriter_reset_no_pending -*graalpython.lib-python.3.test.test_codecencodings_kr.Test_CP949.test_xmlcharrefreplace -*graalpython.lib-python.3.test.test_codecencodings_kr.Test_EUCKR.test_streamwriter_reset_no_pending -*graalpython.lib-python.3.test.test_codecencodings_kr.Test_EUCKR.test_xmlcharrefreplace -*graalpython.lib-python.3.test.test_codecencodings_kr.Test_JOHAB.test_chunkcoding -*graalpython.lib-python.3.test.test_codecencodings_kr.Test_JOHAB.test_errorhandle -*graalpython.lib-python.3.test.test_codecencodings_kr.Test_JOHAB.test_incrementaldecoder -*graalpython.lib-python.3.test.test_codecencodings_kr.Test_JOHAB.test_incrementalencoder -*graalpython.lib-python.3.test.test_codecencodings_kr.Test_JOHAB.test_streamwriter -*graalpython.lib-python.3.test.test_codecencodings_kr.Test_JOHAB.test_streamwriter_reset_no_pending -*graalpython.lib-python.3.test.test_codecencodings_kr.Test_JOHAB.test_xmlcharrefreplace +test.test_codecencodings_kr.Test_CP949.test_chunkcoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_kr.Test_CP949.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_kr.Test_CP949.test_incrementaldecoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_kr.Test_CP949.test_incrementalencoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_kr.Test_CP949.test_streamwriter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_kr.Test_CP949.test_streamwriter_reset_no_pending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_kr.Test_CP949.test_xmlcharrefreplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_kr.Test_EUCKR.test_streamwriter_reset_no_pending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_kr.Test_EUCKR.test_xmlcharrefreplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_kr.Test_JOHAB.test_chunkcoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_kr.Test_JOHAB.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_kr.Test_JOHAB.test_incrementaldecoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_kr.Test_JOHAB.test_incrementalencoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_kr.Test_JOHAB.test_streamwriter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_kr.Test_JOHAB.test_streamwriter_reset_no_pending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_kr.Test_JOHAB.test_xmlcharrefreplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_tw.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_tw.txt index 0677f8d62e..4f3be2764b 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_tw.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecencodings_tw.txt @@ -1,7 +1,7 @@ -*graalpython.lib-python.3.test.test_codecencodings_tw.Test_Big5.test_chunkcoding -*graalpython.lib-python.3.test.test_codecencodings_tw.Test_Big5.test_errorhandle -*graalpython.lib-python.3.test.test_codecencodings_tw.Test_Big5.test_incrementaldecoder -*graalpython.lib-python.3.test.test_codecencodings_tw.Test_Big5.test_incrementalencoder -*graalpython.lib-python.3.test.test_codecencodings_tw.Test_Big5.test_streamwriter -*graalpython.lib-python.3.test.test_codecencodings_tw.Test_Big5.test_streamwriter_reset_no_pending -*graalpython.lib-python.3.test.test_codecencodings_tw.Test_Big5.test_xmlcharrefreplace +test.test_codecencodings_tw.Test_Big5.test_chunkcoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_tw.Test_Big5.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_tw.Test_Big5.test_incrementaldecoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_tw.Test_Big5.test_incrementalencoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_tw.Test_Big5.test_streamwriter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_tw.Test_Big5.test_streamwriter_reset_no_pending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecencodings_tw.Test_Big5.test_xmlcharrefreplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_cn.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_cn.txt index 812a94e4fc..2be50472f3 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_cn.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_cn.txt @@ -1,7 +1,7 @@ -*graalpython.lib-python.3.test.test_codecmaps_cn.TestGB18030Map.test_errorhandle -*graalpython.lib-python.3.test.test_codecmaps_cn.TestGB18030Map.test_mapping_supplemental -*graalpython.lib-python.3.test.test_codecmaps_cn.TestGB2312Map.test_errorhandle -*graalpython.lib-python.3.test.test_codecmaps_cn.TestGB2312Map.test_mapping_file -*graalpython.lib-python.3.test.test_codecmaps_cn.TestGB2312Map.test_mapping_supplemental -*graalpython.lib-python.3.test.test_codecmaps_cn.TestGBKMap.test_errorhandle -*graalpython.lib-python.3.test.test_codecmaps_cn.TestGBKMap.test_mapping_supplemental +test.test_codecmaps_cn.TestGB18030Map.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_cn.TestGB18030Map.test_mapping_supplemental @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_cn.TestGB2312Map.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_cn.TestGB2312Map.test_mapping_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_cn.TestGB2312Map.test_mapping_supplemental @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_cn.TestGBKMap.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_cn.TestGBKMap.test_mapping_supplemental @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_hk.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_hk.txt index 91092f4ea4..eefc0aae40 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_hk.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_hk.txt @@ -1,3 +1,3 @@ -*graalpython.lib-python.3.test.test_codecmaps_hk.TestBig5HKSCSMap.test_errorhandle -*graalpython.lib-python.3.test.test_codecmaps_hk.TestBig5HKSCSMap.test_mapping_file -*graalpython.lib-python.3.test.test_codecmaps_hk.TestBig5HKSCSMap.test_mapping_supplemental +test.test_codecmaps_hk.TestBig5HKSCSMap.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_hk.TestBig5HKSCSMap.test_mapping_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_hk.TestBig5HKSCSMap.test_mapping_supplemental @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_jp.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_jp.txt index 8e78b5df66..93517574bf 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_jp.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_jp.txt @@ -1,9 +1,9 @@ -*graalpython.lib-python.3.test.test_codecmaps_jp.TestCP932Map.test_errorhandle -*graalpython.lib-python.3.test.test_codecmaps_jp.TestEUCJISX0213Map.test_errorhandle -*graalpython.lib-python.3.test.test_codecmaps_jp.TestEUCJISX0213Map.test_mapping_supplemental -*graalpython.lib-python.3.test.test_codecmaps_jp.TestEUCJPCOMPATMap.test_errorhandle -*graalpython.lib-python.3.test.test_codecmaps_jp.TestEUCJPCOMPATMap.test_mapping_supplemental -*graalpython.lib-python.3.test.test_codecmaps_jp.TestSJISCOMPATMap.test_errorhandle -*graalpython.lib-python.3.test.test_codecmaps_jp.TestSJISCOMPATMap.test_mapping_supplemental -*graalpython.lib-python.3.test.test_codecmaps_jp.TestSJISX0213Map.test_errorhandle -*graalpython.lib-python.3.test.test_codecmaps_jp.TestSJISX0213Map.test_mapping_supplemental +test.test_codecmaps_jp.TestCP932Map.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_jp.TestEUCJISX0213Map.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_jp.TestEUCJISX0213Map.test_mapping_supplemental @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_jp.TestEUCJPCOMPATMap.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_jp.TestEUCJPCOMPATMap.test_mapping_supplemental @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_jp.TestSJISCOMPATMap.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_jp.TestSJISCOMPATMap.test_mapping_supplemental @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_jp.TestSJISX0213Map.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_jp.TestSJISX0213Map.test_mapping_supplemental @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_kr.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_kr.txt index 40b3282beb..7ae59e8833 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_kr.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_kr.txt @@ -1,9 +1,9 @@ -*graalpython.lib-python.3.test.test_codecmaps_kr.TestCP949Map.test_errorhandle -*graalpython.lib-python.3.test.test_codecmaps_kr.TestCP949Map.test_mapping_file -*graalpython.lib-python.3.test.test_codecmaps_kr.TestCP949Map.test_mapping_supplemental -*graalpython.lib-python.3.test.test_codecmaps_kr.TestEUCKRMap.test_errorhandle -*graalpython.lib-python.3.test.test_codecmaps_kr.TestEUCKRMap.test_mapping_file -*graalpython.lib-python.3.test.test_codecmaps_kr.TestEUCKRMap.test_mapping_supplemental -*graalpython.lib-python.3.test.test_codecmaps_kr.TestJOHABMap.test_errorhandle -*graalpython.lib-python.3.test.test_codecmaps_kr.TestJOHABMap.test_mapping_file -*graalpython.lib-python.3.test.test_codecmaps_kr.TestJOHABMap.test_mapping_supplemental +test.test_codecmaps_kr.TestCP949Map.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_kr.TestCP949Map.test_mapping_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_kr.TestCP949Map.test_mapping_supplemental @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_kr.TestEUCKRMap.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_kr.TestEUCKRMap.test_mapping_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_kr.TestEUCKRMap.test_mapping_supplemental @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_kr.TestJOHABMap.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_kr.TestJOHABMap.test_mapping_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_kr.TestJOHABMap.test_mapping_supplemental @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_tw.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_tw.txt index fbe7fdb13c..e28b0abb0c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_tw.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecmaps_tw.txt @@ -1,5 +1,5 @@ -*graalpython.lib-python.3.test.test_codecmaps_tw.TestBIG5Map.test_errorhandle -*graalpython.lib-python.3.test.test_codecmaps_tw.TestBIG5Map.test_mapping_file -*graalpython.lib-python.3.test.test_codecmaps_tw.TestBIG5Map.test_mapping_supplemental -*graalpython.lib-python.3.test.test_codecmaps_tw.TestCP950Map.test_errorhandle -*graalpython.lib-python.3.test.test_codecmaps_tw.TestCP950Map.test_mapping_supplemental +test.test_codecmaps_tw.TestBIG5Map.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_tw.TestBIG5Map.test_mapping_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_tw.TestBIG5Map.test_mapping_supplemental @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_tw.TestCP950Map.test_errorhandle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecmaps_tw.TestCP950Map.test_mapping_supplemental @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecs.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecs.txt index 86a0f39451..1d19fd5ad7 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecs.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codecs.txt @@ -1,204 +1,184 @@ -*graalpython.lib-python.3.test.test_codecs.ASCIITest.test_decode -*graalpython.lib-python.3.test.test_codecs.ASCIITest.test_decode_error -*graalpython.lib-python.3.test.test_codecs.ASCIITest.test_encode -*graalpython.lib-python.3.test.test_codecs.ASCIITest.test_encode_error -*graalpython.lib-python.3.test.test_codecs.ASCIITest.test_encode_surrogateescape_error -*graalpython.lib-python.3.test.test_codecs.BasicUnicodeTest.test_basics_capi -*graalpython.lib-python.3.test.test_codecs.BasicUnicodeTest.test_encoding_map_type_initialized -*graalpython.lib-python.3.test.test_codecs.CharmapTest.test_decode_with_int2int_map -*graalpython.lib-python.3.test.test_codecs.CharmapTest.test_decode_with_int2str_map -*graalpython.lib-python.3.test.test_codecs.CharmapTest.test_decode_with_string_map -*graalpython.lib-python.3.test.test_codecs.CodePageTest.test_code_page_decode_flags -*graalpython.lib-python.3.test.test_codecs.CodePageTest.test_code_page_name -*graalpython.lib-python.3.test.test_codecs.CodePageTest.test_cp1252 -*graalpython.lib-python.3.test.test_codecs.CodePageTest.test_cp932 -*graalpython.lib-python.3.test.test_codecs.CodePageTest.test_cp_utf7 -*graalpython.lib-python.3.test.test_codecs.CodePageTest.test_incremental -*graalpython.lib-python.3.test.test_codecs.CodePageTest.test_invalid_code_page -*graalpython.lib-python.3.test.test_codecs.CodePageTest.test_large_input -*graalpython.lib-python.3.test.test_codecs.CodePageTest.test_large_utf8_input -*graalpython.lib-python.3.test.test_codecs.CodePageTest.test_mbcs_alias -*graalpython.lib-python.3.test.test_codecs.CodePageTest.test_multibyte_encoding -*graalpython.lib-python.3.test.test_codecs.CodecNameNormalizationTest.test_codecs_lookup -*graalpython.lib-python.3.test.test_codecs.CodecNameNormalizationTest.test_encodings_normalize_encoding -*graalpython.lib-python.3.test.test_codecs.CodecsModuleTest.test_all -*graalpython.lib-python.3.test.test_codecs.CodecsModuleTest.test_decode -*graalpython.lib-python.3.test.test_codecs.CodecsModuleTest.test_encode -*graalpython.lib-python.3.test.test_codecs.CodecsModuleTest.test_file_closes_if_lookup_error_raised -*graalpython.lib-python.3.test.test_codecs.CodecsModuleTest.test_getdecoder -*graalpython.lib-python.3.test.test_codecs.CodecsModuleTest.test_getencoder -*graalpython.lib-python.3.test.test_codecs.CodecsModuleTest.test_getreader -*graalpython.lib-python.3.test.test_codecs.CodecsModuleTest.test_getwriter -*graalpython.lib-python.3.test.test_codecs.CodecsModuleTest.test_lookup -*graalpython.lib-python.3.test.test_codecs.CodecsModuleTest.test_lookup_issue1813 -*graalpython.lib-python.3.test.test_codecs.CodecsModuleTest.test_open -*graalpython.lib-python.3.test.test_codecs.CodecsModuleTest.test_register -*graalpython.lib-python.3.test.test_codecs.CodecsModuleTest.test_undefined -*graalpython.lib-python.3.test.test_codecs.CodecsModuleTest.test_unregister -*graalpython.lib-python.3.test.test_codecs.EncodedFileTest.test_basic -*graalpython.lib-python.3.test.test_codecs.EscapeDecodeTest.test_empty -*graalpython.lib-python.3.test.test_codecs.EscapeDecodeTest.test_errors -*graalpython.lib-python.3.test.test_codecs.EscapeDecodeTest.test_raw -*graalpython.lib-python.3.test.test_codecs.EscapeEncodeTest.test_escape_encode -*graalpython.lib-python.3.test.test_codecs.ExceptionChainingTest.test_init_override_is_not_wrapped -*graalpython.lib-python.3.test.test_codecs.ExceptionChainingTest.test_instance_attribute_is_not_wrapped -*graalpython.lib-python.3.test.test_codecs.ExceptionChainingTest.test_multiple_args_is_not_wrapped -*graalpython.lib-python.3.test.test_codecs.ExceptionChainingTest.test_new_override_is_not_wrapped -*graalpython.lib-python.3.test.test_codecs.ExceptionChainingTest.test_non_str_arg_is_not_wrapped -*graalpython.lib-python.3.test.test_codecs.ExceptionChainingTest.test_unflagged_non_text_codec_handling -*graalpython.lib-python.3.test.test_codecs.IDNACodecTest.test_builtin_decode -*graalpython.lib-python.3.test.test_codecs.IDNACodecTest.test_builtin_decode_length_limit -*graalpython.lib-python.3.test.test_codecs.IDNACodecTest.test_builtin_encode -*graalpython.lib-python.3.test.test_codecs.IDNACodecTest.test_errors -*graalpython.lib-python.3.test.test_codecs.IDNACodecTest.test_incremental_decode -*graalpython.lib-python.3.test.test_codecs.IDNACodecTest.test_incremental_encode -*graalpython.lib-python.3.test.test_codecs.IDNACodecTest.test_stream -*graalpython.lib-python.3.test.test_codecs.Latin1Test.test_decode -*graalpython.lib-python.3.test.test_codecs.Latin1Test.test_encode -*graalpython.lib-python.3.test.test_codecs.Latin1Test.test_encode_errors -*graalpython.lib-python.3.test.test_codecs.Latin1Test.test_encode_surrogateescape_error -*graalpython.lib-python.3.test.test_codecs.LocaleCodecTest.test_decode_strict -*graalpython.lib-python.3.test.test_codecs.LocaleCodecTest.test_decode_surrogateescape -*graalpython.lib-python.3.test.test_codecs.LocaleCodecTest.test_decode_surrogatepass -*graalpython.lib-python.3.test.test_codecs.LocaleCodecTest.test_decode_unsupported_error_handler -*graalpython.lib-python.3.test.test_codecs.LocaleCodecTest.test_encode_strict -*graalpython.lib-python.3.test.test_codecs.LocaleCodecTest.test_encode_surrogateescape -*graalpython.lib-python.3.test.test_codecs.LocaleCodecTest.test_encode_surrogatepass -*graalpython.lib-python.3.test.test_codecs.LocaleCodecTest.test_encode_unsupported_error_handler -*graalpython.lib-python.3.test.test_codecs.NameprepTest.test_nameprep -*graalpython.lib-python.3.test.test_codecs.PunycodeTest.test_decode -*graalpython.lib-python.3.test.test_codecs.PunycodeTest.test_decode_invalid -*graalpython.lib-python.3.test.test_codecs.PunycodeTest.test_encode -*graalpython.lib-python.3.test.test_codecs.RawUnicodeEscapeTest.test_bug1098990_a -*graalpython.lib-python.3.test.test_codecs.RawUnicodeEscapeTest.test_bug1098990_b -*graalpython.lib-python.3.test.test_codecs.RawUnicodeEscapeTest.test_bug1175396 -*graalpython.lib-python.3.test.test_codecs.RawUnicodeEscapeTest.test_empty -*graalpython.lib-python.3.test.test_codecs.RawUnicodeEscapeTest.test_escape_encode -*graalpython.lib-python.3.test.test_codecs.RawUnicodeEscapeTest.test_mixed_readline_and_read -*graalpython.lib-python.3.test.test_codecs.RawUnicodeEscapeTest.test_raw_encode -*graalpython.lib-python.3.test.test_codecs.RawUnicodeEscapeTest.test_readlinequeue -*graalpython.lib-python.3.test.test_codecs.Rot13Test.test_decode -*graalpython.lib-python.3.test.test_codecs.Rot13Test.test_encode -*graalpython.lib-python.3.test.test_codecs.Rot13Test.test_incremental_decode -*graalpython.lib-python.3.test.test_codecs.Rot13Test.test_incremental_encode -*graalpython.lib-python.3.test.test_codecs.Rot13UtilTest.test_rot13_func -*graalpython.lib-python.3.test.test_codecs.StreamReaderTest.test_copy -*graalpython.lib-python.3.test.test_codecs.StreamReaderTest.test_pickle -*graalpython.lib-python.3.test.test_codecs.StreamReaderTest.test_readlines -*graalpython.lib-python.3.test.test_codecs.StreamReaderWriterTest.test_copy -*graalpython.lib-python.3.test.test_codecs.StreamReaderWriterTest.test_pickle -*graalpython.lib-python.3.test.test_codecs.StreamRecoderTest.test_seeking_read -*graalpython.lib-python.3.test.test_codecs.StreamRecoderTest.test_seeking_write -*graalpython.lib-python.3.test.test_codecs.StreamWriterTest.test_copy -*graalpython.lib-python.3.test.test_codecs.StreamWriterTest.test_pickle -*graalpython.lib-python.3.test.test_codecs.SurrogateEscapeTest.test_ascii -*graalpython.lib-python.3.test.test_codecs.SurrogateEscapeTest.test_charmap -*graalpython.lib-python.3.test.test_codecs.SurrogateEscapeTest.test_latin1 -*graalpython.lib-python.3.test.test_codecs.SurrogateEscapeTest.test_utf8 -*graalpython.lib-python.3.test.test_codecs.TransformCodecTest.test_aliases -*graalpython.lib-python.3.test.test_codecs.TransformCodecTest.test_quopri_stateless -*graalpython.lib-python.3.test.test_codecs.TransformCodecTest.test_uu_invalid -*graalpython.lib-python.3.test.test_codecs.UTF16BETest.test_bug1098990_a -*graalpython.lib-python.3.test.test_codecs.UTF16BETest.test_bug1098990_b -*graalpython.lib-python.3.test.test_codecs.UTF16BETest.test_bug1175396 -*graalpython.lib-python.3.test.test_codecs.UTF16BETest.test_mixed_readline_and_read -*graalpython.lib-python.3.test.test_codecs.UTF16BETest.test_nonbmp -*graalpython.lib-python.3.test.test_codecs.UTF16BETest.test_partial -*graalpython.lib-python.3.test.test_codecs.UTF16BETest.test_readline -*graalpython.lib-python.3.test.test_codecs.UTF16BETest.test_readlinequeue -*graalpython.lib-python.3.test.test_codecs.UTF16ExTest.test_bad_args -*graalpython.lib-python.3.test.test_codecs.UTF16LETest.test_bug1098990_a -*graalpython.lib-python.3.test.test_codecs.UTF16LETest.test_bug1098990_b -*graalpython.lib-python.3.test.test_codecs.UTF16LETest.test_bug1175396 -*graalpython.lib-python.3.test.test_codecs.UTF16LETest.test_mixed_readline_and_read -*graalpython.lib-python.3.test.test_codecs.UTF16LETest.test_nonbmp -*graalpython.lib-python.3.test.test_codecs.UTF16LETest.test_partial -*graalpython.lib-python.3.test.test_codecs.UTF16LETest.test_readline -*graalpython.lib-python.3.test.test_codecs.UTF16LETest.test_readlinequeue -*graalpython.lib-python.3.test.test_codecs.UTF16Test.test_bug1098990_a -*graalpython.lib-python.3.test.test_codecs.UTF16Test.test_bug1098990_b -*graalpython.lib-python.3.test.test_codecs.UTF16Test.test_bug1175396 -*graalpython.lib-python.3.test.test_codecs.UTF16Test.test_bug691291 -*graalpython.lib-python.3.test.test_codecs.UTF16Test.test_errors -*graalpython.lib-python.3.test.test_codecs.UTF16Test.test_handlers -*graalpython.lib-python.3.test.test_codecs.UTF16Test.test_mixed_readline_and_read -*graalpython.lib-python.3.test.test_codecs.UTF16Test.test_partial -*graalpython.lib-python.3.test.test_codecs.UTF16Test.test_readline -*graalpython.lib-python.3.test.test_codecs.UTF16Test.test_readlinequeue -*graalpython.lib-python.3.test.test_codecs.UTF32BETest.test_bug1098990_a -*graalpython.lib-python.3.test.test_codecs.UTF32BETest.test_bug1098990_b -*graalpython.lib-python.3.test.test_codecs.UTF32BETest.test_bug1175396 -*graalpython.lib-python.3.test.test_codecs.UTF32BETest.test_errors -*graalpython.lib-python.3.test.test_codecs.UTF32BETest.test_issue8941 -*graalpython.lib-python.3.test.test_codecs.UTF32BETest.test_mixed_readline_and_read -*graalpython.lib-python.3.test.test_codecs.UTF32BETest.test_partial -*graalpython.lib-python.3.test.test_codecs.UTF32BETest.test_readline -*graalpython.lib-python.3.test.test_codecs.UTF32BETest.test_readlinequeue -*graalpython.lib-python.3.test.test_codecs.UTF32BETest.test_simple -*graalpython.lib-python.3.test.test_codecs.UTF32LETest.test_bug1098990_a -*graalpython.lib-python.3.test.test_codecs.UTF32LETest.test_bug1098990_b -*graalpython.lib-python.3.test.test_codecs.UTF32LETest.test_bug1175396 -*graalpython.lib-python.3.test.test_codecs.UTF32LETest.test_errors -*graalpython.lib-python.3.test.test_codecs.UTF32LETest.test_issue8941 -*graalpython.lib-python.3.test.test_codecs.UTF32LETest.test_mixed_readline_and_read -*graalpython.lib-python.3.test.test_codecs.UTF32LETest.test_partial -*graalpython.lib-python.3.test.test_codecs.UTF32LETest.test_readline -*graalpython.lib-python.3.test.test_codecs.UTF32LETest.test_readlinequeue -*graalpython.lib-python.3.test.test_codecs.UTF32LETest.test_simple -*graalpython.lib-python.3.test.test_codecs.UTF32Test.test_badbom -*graalpython.lib-python.3.test.test_codecs.UTF32Test.test_bug1098990_a -*graalpython.lib-python.3.test.test_codecs.UTF32Test.test_bug1098990_b -*graalpython.lib-python.3.test.test_codecs.UTF32Test.test_bug1175396 -*graalpython.lib-python.3.test.test_codecs.UTF32Test.test_errors -*graalpython.lib-python.3.test.test_codecs.UTF32Test.test_handlers -*graalpython.lib-python.3.test.test_codecs.UTF32Test.test_issue8941 -*graalpython.lib-python.3.test.test_codecs.UTF32Test.test_mixed_readline_and_read -*graalpython.lib-python.3.test.test_codecs.UTF32Test.test_partial -*graalpython.lib-python.3.test.test_codecs.UTF32Test.test_readline -*graalpython.lib-python.3.test.test_codecs.UTF32Test.test_readlinequeue -*graalpython.lib-python.3.test.test_codecs.UTF7Test.test_ascii -*graalpython.lib-python.3.test.test_codecs.UTF7Test.test_bug1098990_a -*graalpython.lib-python.3.test.test_codecs.UTF7Test.test_bug1098990_b -*graalpython.lib-python.3.test.test_codecs.UTF7Test.test_bug1175396 -*graalpython.lib-python.3.test.test_codecs.UTF7Test.test_mixed_readline_and_read -*graalpython.lib-python.3.test.test_codecs.UTF7Test.test_readlinequeue -*graalpython.lib-python.3.test.test_codecs.UTF8SigTest.test_bom -*graalpython.lib-python.3.test.test_codecs.UTF8SigTest.test_bug1098990_a -*graalpython.lib-python.3.test.test_codecs.UTF8SigTest.test_bug1098990_b -*graalpython.lib-python.3.test.test_codecs.UTF8SigTest.test_bug1175396 -*graalpython.lib-python.3.test.test_codecs.UTF8SigTest.test_bug1601501 -*graalpython.lib-python.3.test.test_codecs.UTF8SigTest.test_decode_error -*graalpython.lib-python.3.test.test_codecs.UTF8SigTest.test_decoder_state -*graalpython.lib-python.3.test.test_codecs.UTF8SigTest.test_incremental_errors -*graalpython.lib-python.3.test.test_codecs.UTF8SigTest.test_incremental_surrogatepass -*graalpython.lib-python.3.test.test_codecs.UTF8SigTest.test_mixed_readline_and_read -*graalpython.lib-python.3.test.test_codecs.UTF8SigTest.test_partial -*graalpython.lib-python.3.test.test_codecs.UTF8SigTest.test_readline -*graalpython.lib-python.3.test.test_codecs.UTF8SigTest.test_readlinequeue -*graalpython.lib-python.3.test.test_codecs.UTF8SigTest.test_stream_bare -*graalpython.lib-python.3.test.test_codecs.UTF8SigTest.test_stream_bom -*graalpython.lib-python.3.test.test_codecs.UTF8Test.test_bug1098990_a -*graalpython.lib-python.3.test.test_codecs.UTF8Test.test_bug1098990_b -*graalpython.lib-python.3.test.test_codecs.UTF8Test.test_bug1175396 -*graalpython.lib-python.3.test.test_codecs.UTF8Test.test_decode_error -*graalpython.lib-python.3.test.test_codecs.UTF8Test.test_decoder_state -*graalpython.lib-python.3.test.test_codecs.UTF8Test.test_incremental_errors -*graalpython.lib-python.3.test.test_codecs.UTF8Test.test_incremental_surrogatepass -*graalpython.lib-python.3.test.test_codecs.UTF8Test.test_mixed_readline_and_read -*graalpython.lib-python.3.test.test_codecs.UTF8Test.test_partial -*graalpython.lib-python.3.test.test_codecs.UTF8Test.test_readline -*graalpython.lib-python.3.test.test_codecs.UTF8Test.test_readlinequeue -*graalpython.lib-python.3.test.test_codecs.UnicodeEscapeTest.test_bug1098990_a -*graalpython.lib-python.3.test.test_codecs.UnicodeEscapeTest.test_bug1098990_b -*graalpython.lib-python.3.test.test_codecs.UnicodeEscapeTest.test_bug1175396 -*graalpython.lib-python.3.test.test_codecs.UnicodeEscapeTest.test_empty -*graalpython.lib-python.3.test.test_codecs.UnicodeEscapeTest.test_escape_encode -*graalpython.lib-python.3.test.test_codecs.UnicodeEscapeTest.test_incremental_surrogatepass -*graalpython.lib-python.3.test.test_codecs.UnicodeEscapeTest.test_mixed_readline_and_read -*graalpython.lib-python.3.test.test_codecs.UnicodeEscapeTest.test_partial -*graalpython.lib-python.3.test.test_codecs.UnicodeEscapeTest.test_raw_decode -*graalpython.lib-python.3.test.test_codecs.UnicodeEscapeTest.test_raw_encode -*graalpython.lib-python.3.test.test_codecs.UnicodeEscapeTest.test_readline -*graalpython.lib-python.3.test.test_codecs.UnicodeEscapeTest.test_readlinequeue -*graalpython.lib-python.3.test.test_codecs.WithStmtTest.test_encodedfile -*graalpython.lib-python.3.test.test_codecs.WithStmtTest.test_streamreaderwriter +test.test_codecs.ASCIITest.test_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.ASCIITest.test_decode_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.ASCIITest.test_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.ASCIITest.test_encode_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.ASCIITest.test_encode_surrogateescape_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.BasicUnicodeTest.test_encoding_map_type_initialized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CharmapTest.test_decode_with_int2int_map @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CharmapTest.test_decode_with_int2str_map @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CharmapTest.test_decode_with_string_map @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CodecNameNormalizationTest.test_codecs_lookup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CodecNameNormalizationTest.test_encodings_normalize_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CodecsModuleTest.test_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CodecsModuleTest.test_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CodecsModuleTest.test_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CodecsModuleTest.test_file_closes_if_lookup_error_raised @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CodecsModuleTest.test_getdecoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CodecsModuleTest.test_getencoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CodecsModuleTest.test_getreader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CodecsModuleTest.test_getwriter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CodecsModuleTest.test_lookup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CodecsModuleTest.test_lookup_issue1813 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CodecsModuleTest.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CodecsModuleTest.test_register @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CodecsModuleTest.test_undefined @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.CodecsModuleTest.test_unregister @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.EncodedFileTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.EscapeDecodeTest.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.EscapeDecodeTest.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.EscapeDecodeTest.test_raw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.EscapeEncodeTest.test_escape_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.ExceptionChainingTest.test_init_override_is_not_wrapped @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.ExceptionChainingTest.test_instance_attribute_is_not_wrapped @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.ExceptionChainingTest.test_multiple_args_is_not_wrapped @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.ExceptionChainingTest.test_new_override_is_not_wrapped @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.ExceptionChainingTest.test_non_str_arg_is_not_wrapped @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.ExceptionChainingTest.test_unflagged_non_text_codec_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.IDNACodecTest.test_builtin_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.IDNACodecTest.test_builtin_decode_length_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.IDNACodecTest.test_builtin_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.IDNACodecTest.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.IDNACodecTest.test_incremental_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.IDNACodecTest.test_incremental_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.IDNACodecTest.test_stream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.Latin1Test.test_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.Latin1Test.test_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.Latin1Test.test_encode_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.Latin1Test.test_encode_surrogateescape_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.NameprepTest.test_nameprep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.PunycodeTest.test_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.PunycodeTest.test_decode_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.PunycodeTest.test_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.RawUnicodeEscapeTest.test_bug1098990_a @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.RawUnicodeEscapeTest.test_bug1098990_b @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.RawUnicodeEscapeTest.test_bug1175396 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.RawUnicodeEscapeTest.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.RawUnicodeEscapeTest.test_escape_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.RawUnicodeEscapeTest.test_mixed_readline_and_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.RawUnicodeEscapeTest.test_raw_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.RawUnicodeEscapeTest.test_readlinequeue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.Rot13Test.test_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.Rot13Test.test_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.Rot13Test.test_incremental_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.Rot13Test.test_incremental_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.Rot13UtilTest.test_rot13_func @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.StreamReaderTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.StreamReaderTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.StreamReaderTest.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.StreamReaderWriterTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.StreamReaderWriterTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.StreamRecoderTest.test_seeking_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.StreamRecoderTest.test_seeking_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.StreamWriterTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.StreamWriterTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.SurrogateEscapeTest.test_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.SurrogateEscapeTest.test_charmap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.SurrogateEscapeTest.test_latin1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.SurrogateEscapeTest.test_utf8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.TransformCodecTest.test_aliases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.TransformCodecTest.test_quopri_stateless @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.TransformCodecTest.test_uu_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16BETest.test_bug1098990_a @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16BETest.test_bug1098990_b @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16BETest.test_bug1175396 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16BETest.test_mixed_readline_and_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16BETest.test_nonbmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16BETest.test_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16BETest.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16BETest.test_readlinequeue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16ExTest.test_bad_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16LETest.test_bug1098990_a @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16LETest.test_bug1098990_b @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16LETest.test_bug1175396 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16LETest.test_mixed_readline_and_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16LETest.test_nonbmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16LETest.test_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16LETest.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16LETest.test_readlinequeue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16Test.test_bug1098990_a @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16Test.test_bug1098990_b @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16Test.test_bug1175396 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16Test.test_bug691291 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16Test.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16Test.test_handlers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16Test.test_mixed_readline_and_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16Test.test_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16Test.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF16Test.test_readlinequeue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32BETest.test_bug1098990_a @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32BETest.test_bug1098990_b @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32BETest.test_bug1175396 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32BETest.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32BETest.test_issue8941 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32BETest.test_mixed_readline_and_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32BETest.test_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32BETest.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32BETest.test_readlinequeue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32BETest.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32LETest.test_bug1098990_a @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32LETest.test_bug1098990_b @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32LETest.test_bug1175396 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32LETest.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32LETest.test_issue8941 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32LETest.test_mixed_readline_and_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32LETest.test_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32LETest.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32LETest.test_readlinequeue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32LETest.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32Test.test_badbom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32Test.test_bug1098990_a @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32Test.test_bug1098990_b @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32Test.test_bug1175396 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32Test.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32Test.test_handlers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32Test.test_issue8941 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32Test.test_mixed_readline_and_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32Test.test_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32Test.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF32Test.test_readlinequeue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF7Test.test_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF7Test.test_bug1098990_a @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF7Test.test_bug1098990_b @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF7Test.test_bug1175396 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF7Test.test_mixed_readline_and_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF7Test.test_readlinequeue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8SigTest.test_bom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8SigTest.test_bug1098990_a @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8SigTest.test_bug1098990_b @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8SigTest.test_bug1175396 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8SigTest.test_bug1601501 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8SigTest.test_decode_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8SigTest.test_decoder_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8SigTest.test_incremental_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8SigTest.test_incremental_surrogatepass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8SigTest.test_mixed_readline_and_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8SigTest.test_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8SigTest.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8SigTest.test_readlinequeue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8SigTest.test_stream_bare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8SigTest.test_stream_bom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8Test.test_bug1098990_a @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8Test.test_bug1098990_b @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8Test.test_bug1175396 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8Test.test_decode_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8Test.test_decoder_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8Test.test_incremental_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8Test.test_incremental_surrogatepass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8Test.test_mixed_readline_and_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8Test.test_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8Test.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UTF8Test.test_readlinequeue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UnicodeEscapeTest.test_bug1098990_a @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UnicodeEscapeTest.test_bug1098990_b @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UnicodeEscapeTest.test_bug1175396 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UnicodeEscapeTest.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UnicodeEscapeTest.test_escape_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UnicodeEscapeTest.test_incremental_surrogatepass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UnicodeEscapeTest.test_mixed_readline_and_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UnicodeEscapeTest.test_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UnicodeEscapeTest.test_raw_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UnicodeEscapeTest.test_raw_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UnicodeEscapeTest.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.UnicodeEscapeTest.test_readlinequeue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.WithStmtTest.test_encodedfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codecs.WithStmtTest.test_streamreaderwriter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codeop.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codeop.txt index fbae626b9e..3cc8472520 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codeop.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_codeop.txt @@ -1,6 +1,6 @@ -*graalpython.lib-python.3.test.test_codeop.CodeopTests.test_filename -*graalpython.lib-python.3.test.test_codeop.CodeopTests.test_invalid -*graalpython.lib-python.3.test.test_codeop.CodeopTests.test_invalid_exec -*graalpython.lib-python.3.test.test_codeop.CodeopTests.test_syntax_errors -*graalpython.lib-python.3.test.test_codeop.CodeopTests.test_valid -*graalpython.lib-python.3.test.test_codeop.CodeopTests.test_warning +test.test_codeop.CodeopTests.test_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeop.CodeopTests.test_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeop.CodeopTests.test_invalid_exec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeop.CodeopTests.test_syntax_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeop.CodeopTests.test_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_codeop.CodeopTests.test_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_collections.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_collections.txt index 14c54f8b0a..dfd45d41bd 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_collections.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_collections.txt @@ -1,94 +1,103 @@ -*graalpython.lib-python.3.test.test_collections.TestChainMap.test_basics -*graalpython.lib-python.3.test.test_collections.TestChainMap.test_bool -*graalpython.lib-python.3.test.test_collections.TestChainMap.test_constructor -*graalpython.lib-python.3.test.test_collections.TestChainMap.test_dict_coercion -*graalpython.lib-python.3.test.test_collections.TestChainMap.test_iter_not_calling_getitem_on_maps -*graalpython.lib-python.3.test.test_collections.TestChainMap.test_missing -*graalpython.lib-python.3.test.test_collections.TestChainMap.test_new_child -*graalpython.lib-python.3.test.test_collections.TestChainMap.test_order_preservation -*graalpython.lib-python.3.test.test_collections.TestChainMap.test_ordering -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_ByteString -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_Mapping -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_MutableMapping -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_MutableMapping_subclass -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_MutableSequence -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_MutableSequence_mixins -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_MutableSet -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_Sequence -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_Sequence_mixins -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_Set -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_Set_from_iterable -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_Set_interoperability_with_real_sets -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_arithmetic_Set -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_equality_Set -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_hash_Set -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_illegal_patma_flags -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_isdisjoint_Set -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_issue16373 -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_issue26915 -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_issue8750 -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_issue_4920 -*graalpython.lib-python.3.test.test_collections.TestCollectionABCs.test_issue_5647 -*graalpython.lib-python.3.test.test_collections.TestCounter.test_basics -*graalpython.lib-python.3.test.test_collections.TestCounter.test_conversions -*graalpython.lib-python.3.test.test_collections.TestCounter.test_copy_subclass -*graalpython.lib-python.3.test.test_collections.TestCounter.test_copying -*graalpython.lib-python.3.test.test_collections.TestCounter.test_eq -*graalpython.lib-python.3.test.test_collections.TestCounter.test_ge -*graalpython.lib-python.3.test.test_collections.TestCounter.test_gt -*graalpython.lib-python.3.test.test_collections.TestCounter.test_helper_function -*graalpython.lib-python.3.test.test_collections.TestCounter.test_init -*graalpython.lib-python.3.test.test_collections.TestCounter.test_inplace_operations -*graalpython.lib-python.3.test.test_collections.TestCounter.test_invariant_for_the_in_operator -*graalpython.lib-python.3.test.test_collections.TestCounter.test_le -*graalpython.lib-python.3.test.test_collections.TestCounter.test_lt -*graalpython.lib-python.3.test.test_collections.TestCounter.test_multiset_operations -*graalpython.lib-python.3.test.test_collections.TestCounter.test_multiset_operations_equivalent_to_set_operations -*graalpython.lib-python.3.test.test_collections.TestCounter.test_order_preservation -*graalpython.lib-python.3.test.test_collections.TestCounter.test_repr_nonsortable -*graalpython.lib-python.3.test.test_collections.TestCounter.test_subtract -*graalpython.lib-python.3.test.test_collections.TestCounter.test_total -*graalpython.lib-python.3.test.test_collections.TestCounter.test_unary -*graalpython.lib-python.3.test.test_collections.TestCounter.test_update -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_copy -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_defaults -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_factory -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_factory_doc_attr -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_field_descriptor -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_field_doc -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_field_doc_reuse -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_field_repr -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_instance -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_keyword_only_arguments -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_match_args -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_module_parameter -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_name_conflicts -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_name_fixer -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_namedtuple_subclass_issue_24931 -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_non_generic_subscript -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_odd_sizes -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_pickle -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_readonly -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_repr -*graalpython.lib-python.3.test.test_collections.TestNamedTuple.test_tupleness -*graalpython.lib-python.3.test.test_collections.TestOneTrickPonyABCs.test_AsyncGenerator -*graalpython.lib-python.3.test.test_collections.TestOneTrickPonyABCs.test_AsyncIterable -*graalpython.lib-python.3.test.test_collections.TestOneTrickPonyABCs.test_AsyncIterator -*graalpython.lib-python.3.test.test_collections.TestOneTrickPonyABCs.test_Awaitable -*graalpython.lib-python.3.test.test_collections.TestOneTrickPonyABCs.test_Callable -*graalpython.lib-python.3.test.test_collections.TestOneTrickPonyABCs.test_Collection -*graalpython.lib-python.3.test.test_collections.TestOneTrickPonyABCs.test_Container -*graalpython.lib-python.3.test.test_collections.TestOneTrickPonyABCs.test_Coroutine -*graalpython.lib-python.3.test.test_collections.TestOneTrickPonyABCs.test_Generator -*graalpython.lib-python.3.test.test_collections.TestOneTrickPonyABCs.test_Hashable -*graalpython.lib-python.3.test.test_collections.TestOneTrickPonyABCs.test_Iterable -*graalpython.lib-python.3.test.test_collections.TestOneTrickPonyABCs.test_Iterator -*graalpython.lib-python.3.test.test_collections.TestOneTrickPonyABCs.test_Reversible -*graalpython.lib-python.3.test.test_collections.TestOneTrickPonyABCs.test_Sized -*graalpython.lib-python.3.test.test_collections.TestOneTrickPonyABCs.test_direct_subclassing -*graalpython.lib-python.3.test.test_collections.TestOneTrickPonyABCs.test_registration -*graalpython.lib-python.3.test.test_collections.TestUserObjects.test_dict_copy -*graalpython.lib-python.3.test.test_collections.TestUserObjects.test_dict_protocol -*graalpython.lib-python.3.test.test_collections.TestUserObjects.test_list_copy -*graalpython.lib-python.3.test.test_collections.TestUserObjects.test_list_protocol -*graalpython.lib-python.3.test.test_collections.TestUserObjects.test_str_protocol +DocTestCase.collections.Counter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.collections.Counter.__add__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.collections.Counter.__and__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.collections.Counter.__iadd__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.collections.Counter.__iand__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.collections.Counter.__init__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.collections.Counter.__ior__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.collections.Counter.__isub__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.collections.Counter.__or__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.collections.Counter.__sub__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.collections.Counter.elements @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.collections.Counter.most_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.collections.Counter.subtract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.collections.Counter.update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.collections.namedtuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestChainMap.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestChainMap.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestChainMap.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestChainMap.test_dict_coercion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestChainMap.test_iter_not_calling_getitem_on_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestChainMap.test_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestChainMap.test_new_child @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestChainMap.test_order_preservation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestChainMap.test_ordering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestChainMap.test_union_operators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_ByteString @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_Mapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_MutableMapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_MutableMapping_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_MutableSequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_MutableSequence_mixins @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_MutableSet @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_Sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_Sequence_mixins @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_Set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_Set_from_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_Set_interoperability_with_real_sets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_arithmetic_Set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_equality_Set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_hash_Set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_illegal_patma_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_isdisjoint_Set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_issue16373 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_issue26915 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_issue8750 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCollectionABCs.test_issue_5647 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_conversions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_copy_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_copying @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_ge @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_gt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_helper_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_inplace_operations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_invariant_for_the_in_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_le @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_lt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_multiset_operations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_multiset_operations_equivalent_to_set_operations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_order_preservation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_repr_nonsortable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_subtract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_total @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_unary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestCounter.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestNamedTuple.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestNamedTuple.test_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestNamedTuple.test_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestNamedTuple.test_factory_doc_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestNamedTuple.test_field_doc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestNamedTuple.test_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestNamedTuple.test_keyword_only_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestNamedTuple.test_match_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestNamedTuple.test_module_parameter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestNamedTuple.test_name_conflicts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestNamedTuple.test_name_fixer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestNamedTuple.test_namedtuple_subclass_issue_24931 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestNamedTuple.test_non_generic_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestNamedTuple.test_odd_sizes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestNamedTuple.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestNamedTuple.test_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestNamedTuple.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestNamedTuple.test_tupleness @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestOneTrickPonyABCs.test_AsyncIterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestOneTrickPonyABCs.test_AsyncIterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestOneTrickPonyABCs.test_Callable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestOneTrickPonyABCs.test_Collection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestOneTrickPonyABCs.test_Container @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestOneTrickPonyABCs.test_Generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestOneTrickPonyABCs.test_Hashable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestOneTrickPonyABCs.test_Iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestOneTrickPonyABCs.test_Iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestOneTrickPonyABCs.test_Reversible @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestOneTrickPonyABCs.test_Sized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestOneTrickPonyABCs.test_direct_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestOneTrickPonyABCs.test_registration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestUserObjects.test_dict_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestUserObjects.test_dict_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestUserObjects.test_list_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestUserObjects.test_list_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_collections.TestUserObjects.test_str_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_colorsys.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_colorsys.txt index d4d4a36368..133fa3847c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_colorsys.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_colorsys.txt @@ -1,7 +1,7 @@ -*graalpython.lib-python.3.test.test_colorsys.ColorsysTest.test_hls_nearwhite -*graalpython.lib-python.3.test.test_colorsys.ColorsysTest.test_hls_roundtrip -*graalpython.lib-python.3.test.test_colorsys.ColorsysTest.test_hls_values -*graalpython.lib-python.3.test.test_colorsys.ColorsysTest.test_hsv_roundtrip -*graalpython.lib-python.3.test.test_colorsys.ColorsysTest.test_hsv_values -*graalpython.lib-python.3.test.test_colorsys.ColorsysTest.test_yiq_roundtrip -*graalpython.lib-python.3.test.test_colorsys.ColorsysTest.test_yiq_values +test.test_colorsys.ColorsysTest.test_hls_nearwhite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_colorsys.ColorsysTest.test_hls_roundtrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_colorsys.ColorsysTest.test_hls_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_colorsys.ColorsysTest.test_hsv_roundtrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_colorsys.ColorsysTest.test_hsv_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_colorsys.ColorsysTest.test_yiq_roundtrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_colorsys.ColorsysTest.test_yiq_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_compare.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_compare.txt index 4bc800ac3f..8691015b02 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_compare.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_compare.txt @@ -1,23 +1,16 @@ -*graalpython.lib-python.3.test.test_compare.ComparisonFullTest.test_bytes -*graalpython.lib-python.3.test.test_compare.ComparisonFullTest.test_comp_classes_different -*graalpython.lib-python.3.test.test_compare.ComparisonFullTest.test_comp_classes_same -*graalpython.lib-python.3.test.test_compare.ComparisonFullTest.test_mappings -*graalpython.lib-python.3.test.test_compare.ComparisonFullTest.test_numbers -*graalpython.lib-python.3.test.test_compare.ComparisonFullTest.test_objects -*graalpython.lib-python.3.test.test_compare.ComparisonFullTest.test_sequences -*graalpython.lib-python.3.test.test_compare.ComparisonFullTest.test_sets -*graalpython.lib-python.3.test.test_compare.ComparisonFullTest.test_str_subclass -*graalpython.lib-python.3.test.test_compare.ComparisonSimpleTest.test_comparisons -*graalpython.lib-python.3.test.test_compare.ComparisonSimpleTest.test_id_comparisons -*graalpython.lib-python.3.test.test_compare.ComparisonSimpleTest.test_issue_1393 -*graalpython.lib-python.3.test.test_compare.ComparisonSimpleTest.test_ne_defaults_to_not_eq -*graalpython.lib-python.3.test.test_compare.ComparisonSimpleTest.test_ne_high_priority -*graalpython.lib-python.3.test.test_compare.ComparisonSimpleTest.test_ne_low_priority -*graalpython.lib-python.3.test.test_compare.ComparisonSimpleTest.test_other_delegation -*graalpython.lib-python.3.test.test_compare.ComparisonTest.test_comparisons -*graalpython.lib-python.3.test.test_compare.ComparisonTest.test_id_comparisons -*graalpython.lib-python.3.test.test_compare.ComparisonTest.test_issue_1393 -*graalpython.lib-python.3.test.test_compare.ComparisonTest.test_ne_defaults_to_not_eq -*graalpython.lib-python.3.test.test_compare.ComparisonTest.test_ne_high_priority -*graalpython.lib-python.3.test.test_compare.ComparisonTest.test_ne_low_priority -*graalpython.lib-python.3.test.test_compare.ComparisonTest.test_other_delegation +test.test_compare.ComparisonFullTest.test_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compare.ComparisonFullTest.test_comp_classes_different @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compare.ComparisonFullTest.test_comp_classes_same @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compare.ComparisonFullTest.test_mappings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compare.ComparisonFullTest.test_numbers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compare.ComparisonFullTest.test_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compare.ComparisonFullTest.test_sequences @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compare.ComparisonFullTest.test_sets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compare.ComparisonFullTest.test_str_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compare.ComparisonSimpleTest.test_comparisons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compare.ComparisonSimpleTest.test_id_comparisons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compare.ComparisonSimpleTest.test_issue_1393 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compare.ComparisonSimpleTest.test_ne_defaults_to_not_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compare.ComparisonSimpleTest.test_ne_high_priority @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compare.ComparisonSimpleTest.test_ne_low_priority @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compare.ComparisonSimpleTest.test_other_delegation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_compile.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_compile.txt index 835db01e7b..2dc4af3211 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_compile.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_compile.txt @@ -1,84 +1,74 @@ -*graalpython.lib-python.3.test.test_compile.TestExpressionStackSize.test_and -*graalpython.lib-python.3.test.test_compile.TestExpressionStackSize.test_and_or -*graalpython.lib-python.3.test.test_compile.TestExpressionStackSize.test_binop -*graalpython.lib-python.3.test.test_compile.TestExpressionStackSize.test_chained_comparison -*graalpython.lib-python.3.test.test_compile.TestExpressionStackSize.test_func_and -*graalpython.lib-python.3.test.test_compile.TestExpressionStackSize.test_if_else -*graalpython.lib-python.3.test.test_compile.TestExpressionStackSize.test_or -*graalpython.lib-python.3.test.test_compile.TestExpressionStackSize.test_stack_3050 -*graalpython.lib-python.3.test.test_compile.TestExpressionStackSize.test_stack_3050_2 -*graalpython.lib-python.3.test.test_compile.TestSourcePositions.test_column_offset_deduplication -*graalpython.lib-python.3.test.test_compile.TestSourcePositions.test_multiline_assert_rewritten_as_method_call -*graalpython.lib-python.3.test.test_compile.TestSourcePositions.test_simple_assignment -*graalpython.lib-python.3.test.test_compile.TestSourcePositions.test_weird_attribute_position_regressions -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_annotation_limit -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_apply_static_swaps -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_apply_static_swaps_2 -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_apply_static_swaps_3 -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_argument_handling -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_argument_order -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_bad_single_statement -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_big_dict_literal -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_compile_filename -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_compiler_recursion_limit -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_dead_blocks_do_not_generate_bytecode -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_dict_evaluation_order -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_duplicate_global_local -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_empty -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_encoding -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_exec_with_general_mapping_for_locals -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_extended_arg -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_float_literals -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_for_distinct_code_objects -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_import -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_indentation -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_lambda_doc -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_leading_newlines -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_line_number_genexp -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_literals_with_leading_zeroes -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_mangling -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_merge_code_attrs -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_merge_constants -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_no_ending_newline -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_none_assignment -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_none_keyword_arg -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_null_terminated -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_other_newlines -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_path_like_objects -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_peephole_opt_unreachable_code_array_access_in_bounds -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_redundant_jump_in_if_else_break -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_same_filename_used -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_sequence_unpacking_error -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_single_statement -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_stack_overflow -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_strip_unused_consts -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_subscripts -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_syntax_error -*graalpython.lib-python.3.test.test_compile.TestSpecifics.test_unary_minus -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_async_for -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_async_for_else -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_async_with -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_for -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_for_break_continue -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_for_break_continue_inside_async_with_block -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_for_break_continue_inside_except_block -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_for_break_continue_inside_finally_block -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_for_break_continue_inside_try_finally_block -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_for_break_continue_inside_with_block -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_for_else -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_if -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_if_else -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_return_inside_async_with_block -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_return_inside_except_block -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_return_inside_finally_block -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_return_inside_try_finally_block -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_return_inside_with_block -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_try_except_as -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_try_except_bare -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_try_except_qualified -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_try_except_star_as -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_try_except_star_finally -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_try_except_star_qualified -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_try_finally -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_while_else -*graalpython.lib-python.3.test.test_compile.TestStackSizeStability.test_with +test.test_compile.TestExpressionStackSize.test_and @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestExpressionStackSize.test_and_or @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestExpressionStackSize.test_binop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestExpressionStackSize.test_chained_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestExpressionStackSize.test_func_and @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestExpressionStackSize.test_if_else @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestExpressionStackSize.test_or @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestExpressionStackSize.test_stack_3050 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestExpressionStackSize.test_stack_3050_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSourcePositions.test_multiline_assert_rewritten_as_method_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSourcePositions.test_simple_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSourcePositions.test_weird_attribute_position_regressions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_annotation_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_apply_static_swaps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_apply_static_swaps_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_apply_static_swaps_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_argument_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_argument_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_bad_single_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_big_dict_literal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_compile_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_dict_evaluation_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_duplicate_global_local @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_exec_with_general_mapping_for_locals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_extended_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compile.TestSpecifics.test_float_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_for_distinct_code_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_indentation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_lambda_doc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_line_number_genexp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_literals_with_leading_zeroes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_mangling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_no_ending_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_none_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_none_keyword_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_null_terminated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_other_newlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_path_like_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_sequence_unpacking_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_single_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_stack_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_subscripts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_syntax_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestSpecifics.test_unary_minus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_async_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_async_for_else @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_async_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_for_break_continue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_for_break_continue_inside_async_with_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_for_break_continue_inside_except_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_for_break_continue_inside_finally_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_for_break_continue_inside_try_finally_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_for_break_continue_inside_with_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_for_else @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_if @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_if_else @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_return_inside_async_with_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_return_inside_except_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_return_inside_finally_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_return_inside_try_finally_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_return_inside_with_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_try_except_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_try_except_bare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_try_except_qualified @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_try_except_star_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_try_except_star_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_try_except_star_qualified @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_try_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_while_else @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_compile.TestStackSizeStability.test_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_compileall.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_compileall.txt index db64f9e789..87f14782e5 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_compileall.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_compileall.txt @@ -1,163 +1,121 @@ -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_compiles_as_much_as_possible -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_d_compile_error -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_d_runtime_error -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_force -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_hardlink -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_hardlink_bad_args -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_ignore_symlink_destination -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_include_bad_file -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_include_file_no_arg -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_include_file_with_arg -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_include_on_stdin -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_invalid_arg_produces_message -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_legacy_paths -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_multiple_dirs -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_multiple_optimization_levels -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_multiple_runs -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_no_args_compiles_path -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_no_args_respects_force_flag -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_no_args_respects_quiet_flag -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_pep3147_paths_normal -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_pyc_invalidation_mode -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_quiet -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_recursion_control -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_recursion_limit -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_regexp -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_silent -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsNoSourceEpoch.test_symlink_loop -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_compiles_as_much_as_possible -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_d_compile_error -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_d_runtime_error -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_force -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_hardlink -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_hardlink_bad_args -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_ignore_symlink_destination -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_include_bad_file -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_include_file_no_arg -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_include_file_with_arg -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_include_on_stdin -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_invalid_arg_produces_message -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_legacy_paths -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_multiple_dirs -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_multiple_optimization_levels -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_multiple_runs -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_no_args_compiles_path -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_no_args_respects_force_flag -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_no_args_respects_quiet_flag -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_pep3147_paths_normal -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_pyc_invalidation_mode -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_quiet -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_recursion_control -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_recursion_limit -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_regexp -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_silent -*graalpython.lib-python.3.test.test_compileall.CommandLineTestsWithSourceEpoch.test_symlink_loop -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_compiles_as_much_as_possible -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_d_compile_error -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_d_runtime_error -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_force -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_include_bad_file -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_include_file_no_arg -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_include_file_with_arg -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_include_on_stdin -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_invalid_arg_produces_message -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_legacy_paths -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_multiple_dirs -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_multiple_runs -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_no_args_compiles_path -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_no_args_respects_force_flag -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_no_args_respects_quiet_flag -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_pep3147_paths_normal -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_pyc_invalidation_mode -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_quiet -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_recursion_control -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_recursion_limit -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_regexp -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsNoSourceEpoch.test_silent -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_compiles_as_much_as_possible -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_d_compile_error -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_d_runtime_error -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_force -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_include_bad_file -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_include_file_no_arg -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_include_file_with_arg -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_include_on_stdin -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_invalid_arg_produces_message -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_legacy_paths -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_multiple_dirs -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_multiple_runs -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_no_args_compiles_path -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_no_args_respects_force_flag -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_no_args_respects_quiet_flag -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_pep3147_paths_normal -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_pyc_invalidation_mode -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_quiet -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_recursion_control -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_recursion_limit -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_regexp -*graalpython.lib-python.3.test.test_compileall.CommmandLineTestsWithSourceEpoch.test_silent -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_dir_maxlevels -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_dir_pathlike -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_dir_pathlike_prependdir -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_dir_pathlike_stripdir -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_file_encoding_fallback -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_file_pathlike -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_file_pathlike_ddir -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_file_pathlike_prependdir -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_file_pathlike_stripdir -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_files -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_missing_multiprocessing -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_one_worker -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_path -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_pool_called -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_workers_cpu_count -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_workers_non_positive -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_ignore_symlink_destination -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_larger_than_32_bit_times -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_magic_number -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_mtime -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_multiple_optimization_levels -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_no_pycache_in_non_package -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_optimize -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_prepend_only -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_strip_prepend_and_ddir -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithSourceEpoch.test_year_2038_mtime_compilation -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_dir_maxlevels -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_dir_pathlike -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_dir_pathlike_prependdir -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_dir_pathlike_stripdir -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_file_encoding_fallback -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_file_pathlike -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_file_pathlike_ddir -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_file_pathlike_prependdir -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_file_pathlike_stripdir -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_files -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_missing_multiprocessing -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_one_worker -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_path -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_pool_called -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_workers_cpu_count -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_workers_non_positive -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_ignore_symlink_destination -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_larger_than_32_bit_times -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_magic_number -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_mtime -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_multiple_optimization_levels -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_no_pycache_in_non_package -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_optimize -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_prepend_only -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_strip_prepend_and_ddir -*graalpython.lib-python.3.test.test_compileall.CompileallTestsWithoutSourceEpoch.test_year_2038_mtime_compilation -*graalpython.lib-python.3.test.test_compileall.EncodingTest.test_error -*graalpython.lib-python.3.test.test_compileall.HardlinkDedupTestsNoSourceEpoch.test_bad_args -*graalpython.lib-python.3.test.test_compileall.HardlinkDedupTestsNoSourceEpoch.test_disabled -*graalpython.lib-python.3.test.test_compileall.HardlinkDedupTestsNoSourceEpoch.test_duplicated_levels -*graalpython.lib-python.3.test.test_compileall.HardlinkDedupTestsNoSourceEpoch.test_hardlink -*graalpython.lib-python.3.test.test_compileall.HardlinkDedupTestsNoSourceEpoch.test_only_two_levels -*graalpython.lib-python.3.test.test_compileall.HardlinkDedupTestsNoSourceEpoch.test_recompilation -*graalpython.lib-python.3.test.test_compileall.HardlinkDedupTestsWithSourceEpoch.test_bad_args -*graalpython.lib-python.3.test.test_compileall.HardlinkDedupTestsWithSourceEpoch.test_disabled -*graalpython.lib-python.3.test.test_compileall.HardlinkDedupTestsWithSourceEpoch.test_duplicated_levels -*graalpython.lib-python.3.test.test_compileall.HardlinkDedupTestsWithSourceEpoch.test_hardlink -*graalpython.lib-python.3.test.test_compileall.HardlinkDedupTestsWithSourceEpoch.test_only_two_levels -*graalpython.lib-python.3.test.test_compileall.HardlinkDedupTestsWithSourceEpoch.test_recompilation +test.test_compileall.CommandLineTestsNoSourceEpoch.test_compiles_as_much_as_possible @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_d_compile_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_d_runtime_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_force @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_hardlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_hardlink_bad_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_ignore_symlink_destination @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_include_bad_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_include_file_no_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_include_file_with_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_include_on_stdin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_invalid_arg_produces_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_legacy_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_multiple_dirs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_multiple_optimization_levels @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_multiple_runs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_no_args_compiles_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_no_args_respects_force_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_no_args_respects_quiet_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_pep3147_paths_normal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_pyc_invalidation_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_quiet @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_recursion_control @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_recursion_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_regexp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_silent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_symlink_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_workers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_workers_available_cores @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_compiles_as_much_as_possible @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_d_compile_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_d_runtime_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_force @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_hardlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_hardlink_bad_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_ignore_symlink_destination @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_include_bad_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_include_file_no_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_include_file_with_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_include_on_stdin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_invalid_arg_produces_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_legacy_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_multiple_dirs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_multiple_optimization_levels @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_multiple_runs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_no_args_compiles_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_no_args_respects_force_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_no_args_respects_quiet_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_pep3147_paths_normal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_pyc_invalidation_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_quiet @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_recursion_control @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_recursion_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_regexp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_silent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_symlink_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_workers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_workers_available_cores @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_dir_maxlevels @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_dir_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_dir_pathlike_prependdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_dir_pathlike_stripdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_file_encoding_fallback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_file_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_file_pathlike_ddir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_file_pathlike_prependdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_file_pathlike_stripdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_missing_multiprocessing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_one_worker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_pool_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_workers_cpu_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_workers_non_positive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_ignore_symlink_destination @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_larger_than_32_bit_times @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_multiple_optimization_levels @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_no_pycache_in_non_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_optimize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_prepend_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_strip_prepend_and_ddir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_year_2038_mtime_compilation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_dir_maxlevels @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_dir_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_dir_pathlike_prependdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_dir_pathlike_stripdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_file_encoding_fallback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_file_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_file_pathlike_ddir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_file_pathlike_prependdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_file_pathlike_stripdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_missing_multiprocessing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_one_worker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_pool_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_workers_cpu_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_workers_non_positive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_ignore_symlink_destination @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_larger_than_32_bit_times @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_magic_number @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_mtime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_multiple_optimization_levels @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_no_pycache_in_non_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_optimize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_prepend_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_strip_prepend_and_ddir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_year_2038_mtime_compilation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.EncodingTest.test_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.HardlinkDedupTestsNoSourceEpoch.test_bad_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.HardlinkDedupTestsNoSourceEpoch.test_disabled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.HardlinkDedupTestsNoSourceEpoch.test_duplicated_levels @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.HardlinkDedupTestsNoSourceEpoch.test_hardlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.HardlinkDedupTestsNoSourceEpoch.test_only_two_levels @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.HardlinkDedupTestsNoSourceEpoch.test_recompilation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.HardlinkDedupTestsWithSourceEpoch.test_bad_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.HardlinkDedupTestsWithSourceEpoch.test_disabled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.HardlinkDedupTestsWithSourceEpoch.test_duplicated_levels @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.HardlinkDedupTestsWithSourceEpoch.test_hardlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.HardlinkDedupTestsWithSourceEpoch.test_only_two_levels @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_compileall.HardlinkDedupTestsWithSourceEpoch.test_recompilation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_complex.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_complex.txt index cf06e79ef9..44c23f4a2d 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_complex.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_complex.txt @@ -1,29 +1,29 @@ -*graalpython.lib-python.3.test.test_complex.ComplexTest.test___complex__ -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_abs -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_boolcontext -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_conjugate -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_constructor -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_constructor_special_numbers -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_divmod -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_divmod_zero_division -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_floordiv -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_floordiv_zero_division -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_format -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_getnewargs -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_hash -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_mod -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_mod_zero_division -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_neg -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_negated_imaginary_literal -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_negative_zero_repr_str -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_overflow -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_plus_minus_0j -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_pow -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_pow_with_small_integer_exponents -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_repr_roundtrip -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_repr_str -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_richcompare -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_richcompare_boundaries -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_truediv -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_truediv_zero_division -*graalpython.lib-python.3.test.test_complex.ComplexTest.test_underscores +test.test_complex.ComplexTest.test___complex__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_abs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_boolcontext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_conjugate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_constructor_special_numbers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_divmod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_divmod_zero_division @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_floordiv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_floordiv_zero_division @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_getnewargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_mod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_mod_zero_division @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_neg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_negated_imaginary_literal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_negative_zero_repr_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_plus_minus_0j @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_pow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_pow_with_small_integer_exponents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_repr_roundtrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_repr_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_richcompare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_richcompare_boundaries @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_truediv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_truediv_zero_division @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_complex.ComplexTest.test_underscores @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_concurrent_futures.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_concurrent_futures.txt index 7b6a6e00a1..cdfa1b0505 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_concurrent_futures.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_concurrent_futures.txt @@ -1,96 +1,118 @@ -*test.test_concurrent_futures.test_as_completed.ProcessPoolForkAsCompletedTest.test_correct_timeout_exception_msg -*test.test_concurrent_futures.test_as_completed.ProcessPoolSpawnAsCompletedTest.test_correct_timeout_exception_msg -*test.test_concurrent_futures.test_as_completed.ProcessPoolSpawnAsCompletedTest.test_duplicate_futures -*test.test_concurrent_futures.test_as_completed.ProcessPoolSpawnAsCompletedTest.test_no_timeout -*test.test_concurrent_futures.test_as_completed.ProcessPoolSpawnAsCompletedTest.test_zero_timeout -*test.test_concurrent_futures.test_as_completed.ThreadPoolAsCompletedTest.test_correct_timeout_exception_msg -*test.test_concurrent_futures.test_as_completed.ThreadPoolAsCompletedTest.test_duplicate_futures -*test.test_concurrent_futures.test_as_completed.ThreadPoolAsCompletedTest.test_no_timeout -*test.test_concurrent_futures.test_as_completed.ThreadPoolAsCompletedTest.test_zero_timeout -*test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_crash_at_task_unpickle -*test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_error_at_task_pickle -*test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_error_at_task_unpickle -*test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_error_during_func_exec_on_worker -*test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_error_during_result_pickle_on_worker -*test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_error_during_result_unpickle_in_result_handler -*test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_exit_at_task_unpickle -*test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_exit_during_func_exec_on_worker -*test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_exit_during_result_pickle_on_worker -*test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_exit_during_result_unpickle_in_result_handler -*test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_shutdown_deadlock_pickle -*test.test_concurrent_futures.test_future.FutureTests.test_cancel -*test.test_concurrent_futures.test_future.FutureTests.test_cancelled -*test.test_concurrent_futures.test_future.FutureTests.test_done -*test.test_concurrent_futures.test_future.FutureTests.test_done_callback_already_cancelled -*test.test_concurrent_futures.test_future.FutureTests.test_done_callback_already_failed -*test.test_concurrent_futures.test_future.FutureTests.test_done_callback_already_successful -*test.test_concurrent_futures.test_future.FutureTests.test_done_callback_raises -*test.test_concurrent_futures.test_future.FutureTests.test_done_callback_raises_already_succeeded -*test.test_concurrent_futures.test_future.FutureTests.test_done_callback_with_cancel -*test.test_concurrent_futures.test_future.FutureTests.test_done_callback_with_exception -*test.test_concurrent_futures.test_future.FutureTests.test_done_callback_with_result -*test.test_concurrent_futures.test_future.FutureTests.test_exception_with_success -*test.test_concurrent_futures.test_future.FutureTests.test_exception_with_timeout -*test.test_concurrent_futures.test_future.FutureTests.test_multiple_set_exception -*test.test_concurrent_futures.test_future.FutureTests.test_multiple_set_result -*test.test_concurrent_futures.test_future.FutureTests.test_repr -*test.test_concurrent_futures.test_future.FutureTests.test_result_with_cancel -*test.test_concurrent_futures.test_future.FutureTests.test_result_with_success -*test.test_concurrent_futures.test_future.FutureTests.test_result_with_timeout -*test.test_concurrent_futures.test_future.FutureTests.test_running -*test.test_concurrent_futures.test_init.ProcessPoolSpawnFailingInitializerTest.test_initializer -*test.test_concurrent_futures.test_init.ProcessPoolSpawnInitializerTest.test_initializer -*test.test_concurrent_futures.test_init.ThreadPoolFailingInitializerTest.test_initializer -*test.test_concurrent_futures.test_init.ThreadPoolInitializerTest.test_initializer -*test.test_concurrent_futures.test_process_pool.ProcessPoolForkProcessPoolExecutorTest.test_idle_process_reuse_multiple -*test.test_concurrent_futures.test_process_pool.ProcessPoolForkProcessPoolExecutorTest.test_idle_process_reuse_one -*test.test_concurrent_futures.test_process_pool.ProcessPoolForkProcessPoolExecutorTest.test_max_workers_negative -*test.test_concurrent_futures.test_process_pool.ProcessPoolForkProcessPoolExecutorTest.test_max_workers_too_large -*test.test_concurrent_futures.test_process_pool.ProcessPoolForkProcessPoolExecutorTest.test_no_stale_references -*test.test_concurrent_futures.test_process_pool.ProcessPoolForkserverProcessPoolExecutorTest.test_max_workers_too_large -*test.test_concurrent_futures.test_process_pool.ProcessPoolForkserverProcessPoolExecutorTest.test_no_stale_references -*test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_idle_process_reuse_multiple -*test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_map -*test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_map_chunksize -*test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_map_exception -*test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_map_timeout -*test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_max_workers_negative -*test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_max_workers_too_large -*test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_no_stale_references -*test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_saturation -*test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_shutdown_race_issue12456 -*test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_submit -*test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_submit_keyword -*test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_traceback -*test.test_concurrent_futures.test_shutdown.ProcessPoolForkProcessPoolShutdownTest.test_hang_gh83386 -*test.test_concurrent_futures.test_shutdown.ProcessPoolForkProcessPoolShutdownTest.test_run_after_shutdown -*test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_cancel_futures -*test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_context_manager_shutdown -*test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_hang_gh83386 -*test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_hang_gh94440 -*test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_hang_issue12364 -*test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_processes_terminate -*test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_run_after_shutdown -*test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_shutdown_no_wait -*test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_cancel_futures -*test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_context_manager_shutdown -*test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_default_workers -*test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_executor_map_current_future_cancel -*test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_map -*test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_map_exception -*test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_map_submits_without_iteration -*test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_map_timeout -*test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_max_workers_negative -*test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_no_stale_references -*test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_saturation -*test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_shutdown_race_issue12456 -*test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_submit -*test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_submit_keyword -*test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_20369 -*test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_all_completed -*test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_first_completed -*test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_first_completed_some_already_completed -*test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_first_exception -*test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_first_exception_one_already_failed -*test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_first_exception_some_already_complete -*test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_timeout +test.test_concurrent_futures.test_as_completed.ProcessPoolForkAsCompletedTest.test_correct_timeout_exception_msg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_as_completed.ProcessPoolSpawnAsCompletedTest.test_correct_timeout_exception_msg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_as_completed.ProcessPoolSpawnAsCompletedTest.test_duplicate_futures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_as_completed.ProcessPoolSpawnAsCompletedTest.test_no_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_as_completed.ProcessPoolSpawnAsCompletedTest.test_zero_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_as_completed.ThreadPoolAsCompletedTest.test_correct_timeout_exception_msg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_as_completed.ThreadPoolAsCompletedTest.test_duplicate_futures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_as_completed.ThreadPoolAsCompletedTest.test_no_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_as_completed.ThreadPoolAsCompletedTest.test_zero_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_crash_at_task_unpickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_error_at_task_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_error_at_task_unpickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_error_during_func_exec_on_worker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_error_during_result_pickle_on_worker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_error_during_result_unpickle_in_result_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_exit_at_task_unpickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_exit_during_func_exec_on_worker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_exit_during_result_pickle_on_worker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_exit_during_result_unpickle_in_result_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_gh105829_should_not_deadlock_if_wakeup_pipe_full @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_shutdown_deadlock_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_cancelled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_done_callback_already_cancelled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_done_callback_already_failed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_done_callback_already_successful @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_done_callback_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_done_callback_raises_already_succeeded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_done_callback_with_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_done_callback_with_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_done_callback_with_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_exception_with_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_exception_with_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_multiple_set_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_multiple_set_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_result_with_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_result_with_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_result_with_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_running @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_init.ProcessPoolSpawnFailingInitializerTest.test_initializer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_init.ProcessPoolSpawnInitializerTest.test_initializer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_init.ThreadPoolFailingInitializerTest.test_initializer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_init.ThreadPoolInitializerTest.test_initializer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolForkProcessPoolExecutorTest.test_max_tasks_per_child @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolForkProcessPoolExecutorTest.test_max_tasks_per_child_defaults_to_spawn_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolForkProcessPoolExecutorTest.test_max_workers_negative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_idle_process_reuse_multiple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +# Transiently ends up with 2 processes +!test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_idle_process_reuse_one @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_killed_child @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_map @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_map_chunksize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_map_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_map_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_max_tasks_early_shutdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_max_tasks_per_child @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_max_tasks_per_child_defaults_to_spawn_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_max_workers_negative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_saturation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_shutdown_race_issue12456 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_submit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_submit_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_shutdown.ProcessPoolForkProcessPoolShutdownTest.test_run_after_shutdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_cancel_futures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_context_manager_shutdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +# Transiently times out GR-52666 +!test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_del_shutdown +!test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_hang_gh94440 +test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_hang_issue12364 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_processes_terminate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_run_after_shutdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_shutdown_no_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +# Transiently times out GR-52666 +!test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_submit_after_interpreter_shutdown @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_cancel_futures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_context_manager_shutdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +!test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_del_shutdown +test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_hang_gh94440 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_hang_issue12364 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_run_after_shutdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_shutdown_no_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_submit_after_interpreter_shutdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +# Transiently times out GR-52666 +!test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_thread_names_assigned @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +!test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_thread_names_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_threads_terminate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_default_workers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_executor_map_current_future_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +!test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_idle_thread_reuse @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_map @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_map_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_map_submits_without_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_map_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_max_workers_negative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_saturation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_shutdown_race_issue12456 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_submit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_submit_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_20369 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_all_completed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_first_completed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_first_completed_some_already_completed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_first_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_first_exception_one_already_failed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_first_exception_some_already_complete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_wait.ThreadPoolWaitTests.test_20369 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_wait.ThreadPoolWaitTests.test_all_completed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_wait.ThreadPoolWaitTests.test_first_completed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_wait.ThreadPoolWaitTests.test_first_completed_some_already_completed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_wait.ThreadPoolWaitTests.test_first_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_wait.ThreadPoolWaitTests.test_first_exception_one_already_failed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_wait.ThreadPoolWaitTests.test_first_exception_some_already_complete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_wait.ThreadPoolWaitTests.test_pending_calls_race @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_concurrent_futures.test_wait.ThreadPoolWaitTests.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_configparser.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_configparser.txt index e747d23da2..0ef8527ae6 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_configparser.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_configparser.txt @@ -1,342 +1,337 @@ -*graalpython.lib-python.3.test.test_configparser.BlatantOverrideConvertersTestCase.test_converters_at_init -*graalpython.lib-python.3.test.test_configparser.BlatantOverrideConvertersTestCase.test_inheritance -*graalpython.lib-python.3.test.test_configparser.BlatantOverrideConvertersTestCase.test_instance_assignment -*graalpython.lib-python.3.test.test_configparser.CompatibleTestCase.test_comment_handling -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_add_section_default -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_basic -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_basic_from_dict -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_boolean -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_case_sensitivity_mapping_access -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_clear -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_default_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_defaults_keyword -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_interpolation -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_interpolation_missing_value -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_invalid_multiline_value -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_items -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_parse_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_popitem -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_query_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_read_returns_file_list -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_read_returns_file_list_with_bytestring_path -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_safe_interpolation -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_set_malformatted_interpolation -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_set_nonstring_types -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_set_string_types -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_setitem -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_weird_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCase.test_write -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_basic -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_basic_from_dict -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_boolean -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_case_sensitivity_basic -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_case_sensitivity_conflicts -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_case_sensitivity_mapping_access -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_clear -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_default_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_endless_loop -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_extended_interpolation -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_invalid_multiline_value -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_other_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_parse_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_popitem -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_query_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_read_returns_file_list -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_read_returns_file_list_with_bytestring_path -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_set_string_types -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_setitem -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_strange_options -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_weird_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_write -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseInvalidInterpolationType.test_error_on_wrong_type_for_interpolation -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_add_section_default -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_basic -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_basic_from_dict -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_boolean -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_case_sensitivity_mapping_access -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_clear -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_default_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_defaults_keyword -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_interpolation -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_interpolation_missing_value -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_invalid_multiline_value -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_items -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_parse_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_popitem -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_query_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_read_returns_file_list -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_read_returns_file_list_with_bytestring_path -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_set_malformatted_interpolation -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_set_nonstring_types -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_set_string_types -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_setitem -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_weird_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_write -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_basic -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_basic_from_dict -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_boolean -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_case_sensitivity_mapping_access -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_clear -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_default_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_empty_case -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_invalid_multiline_value -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_no_interpolation -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_none_as_default_interpolation -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_parse_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_popitem -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_query_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_read_returns_file_list -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_read_returns_file_list_with_bytestring_path -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_set_string_types -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_setitem -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_weird_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoInterpolation.test_write -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_add_section_default -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_basic -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_basic_from_dict -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_boolean -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_case_sensitivity_mapping_access -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_clear -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_default_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_defaults_keyword -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_interpolation -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_interpolation_missing_value -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_invalid_multiline_value -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_items -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_parse_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_popitem -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_query_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_read_returns_file_list -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_read_returns_file_list_with_bytestring_path -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_safe_interpolation -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_set_malformatted_interpolation -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_set_nonstring_types -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_set_string_types -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_setitem -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_weird_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNoValue.test_write -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_add_section_default -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_basic -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_basic_from_dict -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_boolean -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_case_sensitivity_mapping_access -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_clear -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_default_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_defaults_keyword -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_interpolation -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_interpolation_missing_value -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_invalid_multiline_value -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_items -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_parse_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_popitem -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_query_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_read_returns_file_list -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_read_returns_file_list_with_bytestring_path -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_safe_interpolation -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_set_malformatted_interpolation -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_set_nonstring_types -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_set_string_types -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_setitem -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_weird_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_write -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_add_section_default -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_basic -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_basic_from_dict -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_boolean -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_case_sensitivity_mapping_access -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_clear -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_default_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_defaults_keyword -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_interpolation -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_interpolation_missing_value -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_invalid_multiline_value -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_items -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_parse_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_popitem -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_query_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_read_returns_file_list -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_read_returns_file_list_with_bytestring_path -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_safe_interpolation -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_set_malformatted_interpolation -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_set_nonstring_types -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_set_string_types -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_setitem -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_weird_errors -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_write -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseTrickyFile.test_cfgparser_dot_3 -*graalpython.lib-python.3.test.test_configparser.ConfigParserTestCaseTrickyFile.test_unicode_failure -*graalpython.lib-python.3.test.test_configparser.ConvertersTestCase.test_basic -*graalpython.lib-python.3.test.test_configparser.ConvertersTestCase.test_basic_from_dict -*graalpython.lib-python.3.test.test_configparser.ConvertersTestCase.test_boolean -*graalpython.lib-python.3.test.test_configparser.ConvertersTestCase.test_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.ConvertersTestCase.test_case_sensitivity_mapping_access -*graalpython.lib-python.3.test.test_configparser.ConvertersTestCase.test_clear -*graalpython.lib-python.3.test.test_configparser.ConvertersTestCase.test_converters -*graalpython.lib-python.3.test.test_configparser.ConvertersTestCase.test_default_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.ConvertersTestCase.test_invalid_multiline_value -*graalpython.lib-python.3.test.test_configparser.ConvertersTestCase.test_parse_errors -*graalpython.lib-python.3.test.test_configparser.ConvertersTestCase.test_popitem -*graalpython.lib-python.3.test.test_configparser.ConvertersTestCase.test_query_errors -*graalpython.lib-python.3.test.test_configparser.ConvertersTestCase.test_read_returns_file_list -*graalpython.lib-python.3.test.test_configparser.ConvertersTestCase.test_read_returns_file_list_with_bytestring_path -*graalpython.lib-python.3.test.test_configparser.ConvertersTestCase.test_set_string_types -*graalpython.lib-python.3.test.test_configparser.ConvertersTestCase.test_setitem -*graalpython.lib-python.3.test.test_configparser.ConvertersTestCase.test_weird_errors -*graalpython.lib-python.3.test.test_configparser.ConvertersTestCase.test_write -*graalpython.lib-python.3.test.test_configparser.CopyTestCase.test_basic -*graalpython.lib-python.3.test.test_configparser.CopyTestCase.test_basic_from_dict -*graalpython.lib-python.3.test.test_configparser.CopyTestCase.test_boolean -*graalpython.lib-python.3.test.test_configparser.CopyTestCase.test_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.CopyTestCase.test_case_sensitivity_mapping_access -*graalpython.lib-python.3.test.test_configparser.CopyTestCase.test_clear -*graalpython.lib-python.3.test.test_configparser.CopyTestCase.test_default_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.CopyTestCase.test_invalid_multiline_value -*graalpython.lib-python.3.test.test_configparser.CopyTestCase.test_parse_errors -*graalpython.lib-python.3.test.test_configparser.CopyTestCase.test_popitem -*graalpython.lib-python.3.test.test_configparser.CopyTestCase.test_query_errors -*graalpython.lib-python.3.test.test_configparser.CopyTestCase.test_read_returns_file_list -*graalpython.lib-python.3.test.test_configparser.CopyTestCase.test_read_returns_file_list_with_bytestring_path -*graalpython.lib-python.3.test.test_configparser.CopyTestCase.test_set_string_types -*graalpython.lib-python.3.test.test_configparser.CopyTestCase.test_setitem -*graalpython.lib-python.3.test.test_configparser.CopyTestCase.test_weird_errors -*graalpython.lib-python.3.test.test_configparser.CopyTestCase.test_write -*graalpython.lib-python.3.test.test_configparser.CoverageOneHundredTestCase.test_duplicate_option_error -*graalpython.lib-python.3.test.test_configparser.CoverageOneHundredTestCase.test_inconsistent_converters_state -*graalpython.lib-python.3.test.test_configparser.CoverageOneHundredTestCase.test_interpolation_depth_error -*graalpython.lib-python.3.test.test_configparser.CoverageOneHundredTestCase.test_interpolation_validation -*graalpython.lib-python.3.test.test_configparser.CoverageOneHundredTestCase.test_legacyinterpolation_deprecation -*graalpython.lib-python.3.test.test_configparser.CoverageOneHundredTestCase.test_parsing_error -*graalpython.lib-python.3.test.test_configparser.CoverageOneHundredTestCase.test_readfp_deprecation -*graalpython.lib-python.3.test.test_configparser.CoverageOneHundredTestCase.test_safeconfigparser_deprecation -*graalpython.lib-python.3.test.test_configparser.CoverageOneHundredTestCase.test_sectionproxy_repr -*graalpython.lib-python.3.test.test_configparser.ExceptionContextTestCase.test_get_basic_interpolation -*graalpython.lib-python.3.test.test_configparser.ExceptionContextTestCase.test_get_extended_interpolation -*graalpython.lib-python.3.test.test_configparser.ExceptionContextTestCase.test_missing_options -*graalpython.lib-python.3.test.test_configparser.ExceptionContextTestCase.test_missing_section -*graalpython.lib-python.3.test.test_configparser.ExceptionContextTestCase.test_remove_option -*graalpython.lib-python.3.test.test_configparser.ExceptionPicklingTestCase.test_duplicateoptionerror -*graalpython.lib-python.3.test.test_configparser.ExceptionPicklingTestCase.test_duplicatesectionerror -*graalpython.lib-python.3.test.test_configparser.ExceptionPicklingTestCase.test_error -*graalpython.lib-python.3.test.test_configparser.ExceptionPicklingTestCase.test_interpolationdeptherror -*graalpython.lib-python.3.test.test_configparser.ExceptionPicklingTestCase.test_interpolationerror -*graalpython.lib-python.3.test.test_configparser.ExceptionPicklingTestCase.test_interpolationmissingoptionerror -*graalpython.lib-python.3.test.test_configparser.ExceptionPicklingTestCase.test_interpolationsyntaxerror -*graalpython.lib-python.3.test.test_configparser.ExceptionPicklingTestCase.test_missingsectionheadererror -*graalpython.lib-python.3.test.test_configparser.ExceptionPicklingTestCase.test_nooptionerror -*graalpython.lib-python.3.test.test_configparser.ExceptionPicklingTestCase.test_nosectionerror -*graalpython.lib-python.3.test.test_configparser.ExceptionPicklingTestCase.test_parsingerror -*graalpython.lib-python.3.test.test_configparser.InlineCommentStrippingTestCase.test_stripping -*graalpython.lib-python.3.test.test_configparser.Issue7005TestCase.test_none_as_value_stringified -*graalpython.lib-python.3.test.test_configparser.Issue7005TestCase.test_none_as_value_stringified_raw -*graalpython.lib-python.3.test.test_configparser.MiscTestCase.test__all__ -*graalpython.lib-python.3.test.test_configparser.MultilineValuesTestCase.test_basic -*graalpython.lib-python.3.test.test_configparser.MultilineValuesTestCase.test_basic_from_dict -*graalpython.lib-python.3.test.test_configparser.MultilineValuesTestCase.test_boolean -*graalpython.lib-python.3.test.test_configparser.MultilineValuesTestCase.test_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.MultilineValuesTestCase.test_case_sensitivity_mapping_access -*graalpython.lib-python.3.test.test_configparser.MultilineValuesTestCase.test_clear -*graalpython.lib-python.3.test.test_configparser.MultilineValuesTestCase.test_default_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.MultilineValuesTestCase.test_dominating_multiline_values -*graalpython.lib-python.3.test.test_configparser.MultilineValuesTestCase.test_invalid_multiline_value -*graalpython.lib-python.3.test.test_configparser.MultilineValuesTestCase.test_parse_errors -*graalpython.lib-python.3.test.test_configparser.MultilineValuesTestCase.test_popitem -*graalpython.lib-python.3.test.test_configparser.MultilineValuesTestCase.test_query_errors -*graalpython.lib-python.3.test.test_configparser.MultilineValuesTestCase.test_read_returns_file_list -*graalpython.lib-python.3.test.test_configparser.MultilineValuesTestCase.test_read_returns_file_list_with_bytestring_path -*graalpython.lib-python.3.test.test_configparser.MultilineValuesTestCase.test_set_string_types -*graalpython.lib-python.3.test.test_configparser.MultilineValuesTestCase.test_setitem -*graalpython.lib-python.3.test.test_configparser.MultilineValuesTestCase.test_weird_errors -*graalpython.lib-python.3.test.test_configparser.MultilineValuesTestCase.test_write -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_basic -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_basic_from_dict -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_boolean -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_case_sensitivity_mapping_access -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_clear -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_default_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_defaults_keyword -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_interpolation -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_invalid_multiline_value -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_items -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_parse_errors -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_popitem -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_query_errors -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_read_returns_file_list -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_read_returns_file_list_with_bytestring_path -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_set_nonstring_types -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_set_string_types -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_setitem -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_weird_errors -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCase.test_write -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_basic -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_basic_from_dict -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_boolean -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_case_sensitivity_mapping_access -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_clear -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_default_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_defaults_keyword -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_interpolation -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_invalid_multiline_value -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_items -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_parse_errors -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_popitem -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_query_errors -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_read_returns_file_list -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_read_returns_file_list_with_bytestring_path -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_set_nonstring_types -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_set_string_types -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_setitem -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_weird_errors -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_write -*graalpython.lib-python.3.test.test_configparser.RawConfigParserTestSambaConf.test_reading -*graalpython.lib-python.3.test.test_configparser.ReadFileTestCase.test_file -*graalpython.lib-python.3.test.test_configparser.ReadFileTestCase.test_iterable -*graalpython.lib-python.3.test.test_configparser.ReadFileTestCase.test_readline_generator -*graalpython.lib-python.3.test.test_configparser.ReadFileTestCase.test_source_as_bytes -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_basic -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_basic_from_dict -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_boolean -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_case_sensitivity_mapping_access -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_clear -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_default_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_defaults_keyword -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_interpolation -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_invalid_multiline_value -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_items -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_parse_errors -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_popitem -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_query_errors -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_read_returns_file_list -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_read_returns_file_list_with_bytestring_path -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_set_nonstring_types -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_set_string_types -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_setitem -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_sorted -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_weird_errors -*graalpython.lib-python.3.test.test_configparser.SortedTestCase.test_write -*graalpython.lib-python.3.test.test_configparser.StrictTestCase.test_basic -*graalpython.lib-python.3.test.test_configparser.StrictTestCase.test_basic_from_dict -*graalpython.lib-python.3.test.test_configparser.StrictTestCase.test_boolean -*graalpython.lib-python.3.test.test_configparser.StrictTestCase.test_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.StrictTestCase.test_case_sensitivity_mapping_access -*graalpython.lib-python.3.test.test_configparser.StrictTestCase.test_clear -*graalpython.lib-python.3.test.test_configparser.StrictTestCase.test_default_case_sensitivity -*graalpython.lib-python.3.test.test_configparser.StrictTestCase.test_invalid_multiline_value -*graalpython.lib-python.3.test.test_configparser.StrictTestCase.test_parse_errors -*graalpython.lib-python.3.test.test_configparser.StrictTestCase.test_popitem -*graalpython.lib-python.3.test.test_configparser.StrictTestCase.test_query_errors -*graalpython.lib-python.3.test.test_configparser.StrictTestCase.test_read_returns_file_list -*graalpython.lib-python.3.test.test_configparser.StrictTestCase.test_read_returns_file_list_with_bytestring_path -*graalpython.lib-python.3.test.test_configparser.StrictTestCase.test_set_string_types -*graalpython.lib-python.3.test.test_configparser.StrictTestCase.test_setitem -*graalpython.lib-python.3.test.test_configparser.StrictTestCase.test_weird_errors -*graalpython.lib-python.3.test.test_configparser.StrictTestCase.test_write +test.test_configparser.BlatantOverrideConvertersTestCase.test_converters_at_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.BlatantOverrideConvertersTestCase.test_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.BlatantOverrideConvertersTestCase.test_instance_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CompatibleTestCase.test_comment_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_add_section_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_basic_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_boolean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_case_sensitivity_mapping_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_default_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_defaults_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_interpolation_missing_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_invalid_multiline_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_parse_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_query_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_read_returns_file_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_read_returns_file_list_with_bytestring_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_safe_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_set_malformatted_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_set_nonstring_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_set_string_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_weird_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCase.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_basic_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_boolean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_case_sensitivity_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_case_sensitivity_conflicts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_case_sensitivity_mapping_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_default_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_endless_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_extended_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_invalid_multiline_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_other_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_parse_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_query_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_read_returns_file_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_read_returns_file_list_with_bytestring_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_set_string_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_strange_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_weird_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseInvalidInterpolationType.test_error_on_wrong_type_for_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_add_section_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_basic_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_boolean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_case_sensitivity_mapping_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_default_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_defaults_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_interpolation_missing_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_invalid_multiline_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_parse_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_query_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_read_returns_file_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_read_returns_file_list_with_bytestring_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_set_malformatted_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_set_nonstring_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_set_string_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_weird_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_basic_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_boolean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_case_sensitivity_mapping_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_default_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_empty_case @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_invalid_multiline_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_no_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_none_as_default_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_parse_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_query_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_read_returns_file_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_read_returns_file_list_with_bytestring_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_set_string_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_weird_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_add_section_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_basic_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_boolean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_case_sensitivity_mapping_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_default_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_defaults_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_interpolation_missing_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_parse_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_query_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_read_returns_file_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_read_returns_file_list_with_bytestring_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_safe_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_set_malformatted_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_set_nonstring_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_set_string_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_weird_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNoValue.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_add_section_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_basic_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_boolean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_case_sensitivity_mapping_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_default_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_defaults_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_interpolation_missing_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_invalid_multiline_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_parse_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_query_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_read_returns_file_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_read_returns_file_list_with_bytestring_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_safe_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_set_malformatted_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_set_nonstring_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_set_string_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_weird_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_add_section_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_basic_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_boolean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_case_sensitivity_mapping_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_default_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_defaults_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_interpolation_missing_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_invalid_multiline_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_parse_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_query_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_safe_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_set_malformatted_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_set_nonstring_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_set_string_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_weird_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseTrickyFile.test_cfgparser_dot_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConfigParserTestCaseTrickyFile.test_unicode_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConvertersTestCase.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConvertersTestCase.test_basic_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConvertersTestCase.test_boolean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConvertersTestCase.test_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConvertersTestCase.test_case_sensitivity_mapping_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConvertersTestCase.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConvertersTestCase.test_converters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConvertersTestCase.test_default_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConvertersTestCase.test_invalid_multiline_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConvertersTestCase.test_parse_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConvertersTestCase.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConvertersTestCase.test_query_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConvertersTestCase.test_read_returns_file_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConvertersTestCase.test_read_returns_file_list_with_bytestring_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConvertersTestCase.test_set_string_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConvertersTestCase.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConvertersTestCase.test_weird_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ConvertersTestCase.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CopyTestCase.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CopyTestCase.test_basic_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CopyTestCase.test_boolean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CopyTestCase.test_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CopyTestCase.test_case_sensitivity_mapping_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CopyTestCase.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CopyTestCase.test_default_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CopyTestCase.test_invalid_multiline_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CopyTestCase.test_parse_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CopyTestCase.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CopyTestCase.test_query_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CopyTestCase.test_read_returns_file_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CopyTestCase.test_read_returns_file_list_with_bytestring_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CopyTestCase.test_set_string_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CopyTestCase.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CopyTestCase.test_weird_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CopyTestCase.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CoverageOneHundredTestCase.test_duplicate_option_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CoverageOneHundredTestCase.test_inconsistent_converters_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CoverageOneHundredTestCase.test_interpolation_depth_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CoverageOneHundredTestCase.test_interpolation_validation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CoverageOneHundredTestCase.test_legacyinterpolation_deprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CoverageOneHundredTestCase.test_parsing_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CoverageOneHundredTestCase.test_readfp_deprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CoverageOneHundredTestCase.test_safeconfigparser_deprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.CoverageOneHundredTestCase.test_sectionproxy_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ExceptionContextTestCase.test_get_basic_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ExceptionContextTestCase.test_get_extended_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ExceptionContextTestCase.test_missing_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ExceptionContextTestCase.test_missing_section @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ExceptionContextTestCase.test_remove_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ExceptionPicklingTestCase.test_duplicateoptionerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ExceptionPicklingTestCase.test_duplicatesectionerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ExceptionPicklingTestCase.test_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ExceptionPicklingTestCase.test_interpolationdeptherror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ExceptionPicklingTestCase.test_interpolationerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ExceptionPicklingTestCase.test_interpolationmissingoptionerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ExceptionPicklingTestCase.test_interpolationsyntaxerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ExceptionPicklingTestCase.test_missingsectionheadererror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ExceptionPicklingTestCase.test_nooptionerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ExceptionPicklingTestCase.test_nosectionerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ExceptionPicklingTestCase.test_parsingerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.InlineCommentStrippingTestCase.test_stripping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.Issue7005TestCase.test_none_as_value_stringified @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.Issue7005TestCase.test_none_as_value_stringified_raw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MiscTestCase.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MultilineValuesTestCase.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MultilineValuesTestCase.test_basic_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MultilineValuesTestCase.test_boolean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MultilineValuesTestCase.test_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MultilineValuesTestCase.test_case_sensitivity_mapping_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MultilineValuesTestCase.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MultilineValuesTestCase.test_default_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MultilineValuesTestCase.test_dominating_multiline_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MultilineValuesTestCase.test_invalid_multiline_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MultilineValuesTestCase.test_parse_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MultilineValuesTestCase.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MultilineValuesTestCase.test_query_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MultilineValuesTestCase.test_read_returns_file_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MultilineValuesTestCase.test_read_returns_file_list_with_bytestring_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MultilineValuesTestCase.test_set_string_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MultilineValuesTestCase.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MultilineValuesTestCase.test_weird_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.MultilineValuesTestCase.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_basic_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_boolean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_case_sensitivity_mapping_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_default_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_defaults_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_invalid_multiline_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_parse_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_query_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_read_returns_file_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_read_returns_file_list_with_bytestring_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_set_nonstring_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_set_string_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_weird_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCase.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_basic_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_boolean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_case_sensitivity_mapping_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_default_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_defaults_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_invalid_multiline_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_parse_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_query_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_set_nonstring_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_set_string_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_weird_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.RawConfigParserTestSambaConf.test_reading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ReadFileTestCase.test_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ReadFileTestCase.test_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ReadFileTestCase.test_readline_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.ReadFileTestCase.test_source_as_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_basic_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_boolean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_case_sensitivity_mapping_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_default_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_defaults_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_invalid_multiline_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_parse_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_query_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_read_returns_file_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_read_returns_file_list_with_bytestring_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_set_nonstring_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_set_string_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_sorted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_weird_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.SortedTestCase.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.StrictTestCase.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.StrictTestCase.test_basic_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.StrictTestCase.test_boolean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.StrictTestCase.test_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.StrictTestCase.test_case_sensitivity_mapping_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.StrictTestCase.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.StrictTestCase.test_default_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.StrictTestCase.test_invalid_multiline_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.StrictTestCase.test_parse_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.StrictTestCase.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.StrictTestCase.test_query_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.StrictTestCase.test_read_returns_file_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.StrictTestCase.test_read_returns_file_list_with_bytestring_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.StrictTestCase.test_set_string_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.StrictTestCase.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.StrictTestCase.test_weird_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_configparser.StrictTestCase.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_contains.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_contains.txt index d88ce05771..2299b340c4 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_contains.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_contains.txt @@ -1,4 +1,4 @@ -*graalpython.lib-python.3.test.test_contains.TestContains.test_block_fallback -*graalpython.lib-python.3.test.test_contains.TestContains.test_builtin_sequence_types -*graalpython.lib-python.3.test.test_contains.TestContains.test_common_tests -*graalpython.lib-python.3.test.test_contains.TestContains.test_nonreflexive +test.test_contains.TestContains.test_block_fallback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contains.TestContains.test_builtin_sequence_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contains.TestContains.test_common_tests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contains.TestContains.test_nonreflexive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_context.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_context.txt index 4a276ae6ed..a7a57eadb2 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_context.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_context.txt @@ -1,39 +1,15 @@ -*graalpython.lib-python.3.test.test_context.ContextTest.test_context_copy_1 -*graalpython.lib-python.3.test.test_context.ContextTest.test_context_get_context_1 -*graalpython.lib-python.3.test.test_context.ContextTest.test_context_getset_1 -*graalpython.lib-python.3.test.test_context.ContextTest.test_context_getset_2 -*graalpython.lib-python.3.test.test_context.ContextTest.test_context_getset_3 -*graalpython.lib-python.3.test.test_context.ContextTest.test_context_getset_5 -*graalpython.lib-python.3.test.test_context.ContextTest.test_context_run_1 -*graalpython.lib-python.3.test.test_context.ContextTest.test_context_run_2 -*graalpython.lib-python.3.test.test_context.ContextTest.test_context_run_3 -*graalpython.lib-python.3.test.test_context.ContextTest.test_context_run_5 -*graalpython.lib-python.3.test.test_context.ContextTest.test_context_run_6 -*graalpython.lib-python.3.test.test_context.ContextTest.test_context_run_7 -*graalpython.lib-python.3.test.test_context.ContextTest.test_context_subclassing_1 -*graalpython.lib-python.3.test.test_context.ContextTest.test_context_threads_1 -*graalpython.lib-python.3.test.test_context.ContextTest.test_context_typerrors_1 -*graalpython.lib-python.3.test.test_context.ContextTest.test_contextvar_getitem -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_basics_1 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_basics_2 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_basics_3 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_basics_4 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_collision_1 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_collision_3 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_delete_1 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_delete_2 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_delete_3 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_delete_4 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_delete_5 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_eq_1 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_eq_2 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_gc_1 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_gc_2 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_getitem_1 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_in_1 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_items_1 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_items_2 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_items_3 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_keys_1 -*graalpython.lib-python.3.test.test_context.HamtTest.test_hamt_stress -*graalpython.lib-python.3.test.test_context.HamtTest.test_hashkey_helper_1 +test.test_context.ContextTest.test_context_copy_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_context.ContextTest.test_context_get_context_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_context.ContextTest.test_context_getset_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_context.ContextTest.test_context_getset_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_context.ContextTest.test_context_getset_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_context.ContextTest.test_context_getset_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_context.ContextTest.test_context_run_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_context.ContextTest.test_context_run_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_context.ContextTest.test_context_run_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_context.ContextTest.test_context_run_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_context.ContextTest.test_context_run_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_context.ContextTest.test_context_run_7 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_context.ContextTest.test_context_subclassing_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_context.ContextTest.test_context_threads_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_context.ContextTest.test_context_typerrors_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_contextlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_contextlib.txt index e9546be5a5..98bcdda5da 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_contextlib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_contextlib.txt @@ -1,85 +1,85 @@ -*graalpython.lib-python.3.test.test_contextlib.ClosingTestCase.test_closing -*graalpython.lib-python.3.test.test_contextlib.ClosingTestCase.test_closing_error -*graalpython.lib-python.3.test.test_contextlib.ClosingTestCase.test_instance_docs -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_contextmanager_attribs -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_contextmanager_do_not_unchain_non_stopiteration_exceptions -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_contextmanager_doc_attrib -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_contextmanager_except -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_contextmanager_except_pep479 -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_contextmanager_except_stopiter -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_contextmanager_finally -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_contextmanager_no_reraise -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_contextmanager_non_normalised -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_contextmanager_plain -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_contextmanager_traceback -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_contextmanager_trap_no_yield -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_contextmanager_trap_second_yield -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_contextmanager_trap_yield_after_throw -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_contextmanager_wrap_runtimeerror -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_instance_docstring_given_cm_docstring -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_keywords -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_param_errors -*graalpython.lib-python.3.test.test_contextlib.ContextManagerTestCase.test_recursive -*graalpython.lib-python.3.test.test_contextlib.FileContextTestCase.testWithOpen -*graalpython.lib-python.3.test.test_contextlib.LockContextTestCase.testWithBoundedSemaphore -*graalpython.lib-python.3.test.test_contextlib.LockContextTestCase.testWithCondition -*graalpython.lib-python.3.test.test_contextlib.LockContextTestCase.testWithLock -*graalpython.lib-python.3.test.test_contextlib.LockContextTestCase.testWithRLock -*graalpython.lib-python.3.test.test_contextlib.LockContextTestCase.testWithSemaphore -*graalpython.lib-python.3.test.test_contextlib.NullcontextTestCase.test_nullcontext -*graalpython.lib-python.3.test.test_contextlib.TestAbstractContextManager.test_enter -*graalpython.lib-python.3.test.test_contextlib.TestAbstractContextManager.test_exit_is_abstract -*graalpython.lib-python.3.test.test_contextlib.TestAbstractContextManager.test_structural_subclassing -*graalpython.lib-python.3.test.test_contextlib.TestChdir.test_exception -*graalpython.lib-python.3.test.test_contextlib.TestChdir.test_reentrant -*graalpython.lib-python.3.test.test_contextlib.TestChdir.test_simple -*graalpython.lib-python.3.test.test_contextlib.TestContextDecorator.test_contextdecorator -*graalpython.lib-python.3.test.test_contextlib.TestContextDecorator.test_contextdecorator_as_mixin -*graalpython.lib-python.3.test.test_contextlib.TestContextDecorator.test_contextdecorator_with_exception -*graalpython.lib-python.3.test.test_contextlib.TestContextDecorator.test_contextmanager_as_decorator -*graalpython.lib-python.3.test.test_contextlib.TestContextDecorator.test_decorating_method -*graalpython.lib-python.3.test.test_contextlib.TestContextDecorator.test_decorator -*graalpython.lib-python.3.test.test_contextlib.TestContextDecorator.test_decorator_with_exception -*graalpython.lib-python.3.test.test_contextlib.TestContextDecorator.test_instance_docs -*graalpython.lib-python.3.test.test_contextlib.TestContextDecorator.test_typo_enter -*graalpython.lib-python.3.test.test_contextlib.TestContextDecorator.test_typo_exit -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_body_exception_suppress -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_callback -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_close -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_dont_reraise_RuntimeError -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_enter_context -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_enter_context_errors -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_excessive_nesting -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_exit_exception_chaining_reference -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_exit_exception_chaining_suppress -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_exit_exception_non_suppressing -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_exit_exception_traceback -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_exit_exception_with_existing_context -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_exit_raise -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_exit_suppress -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_instance_bypass -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_instance_docs -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_no_resources -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_pop_all -*graalpython.lib-python.3.test.test_contextlib.TestExitStack.test_push -*graalpython.lib-python.3.test.test_contextlib.TestRedirectStderr.test_cm_is_reentrant -*graalpython.lib-python.3.test.test_contextlib.TestRedirectStderr.test_cm_is_reusable -*graalpython.lib-python.3.test.test_contextlib.TestRedirectStderr.test_enter_result_is_target -*graalpython.lib-python.3.test.test_contextlib.TestRedirectStderr.test_instance_docs -*graalpython.lib-python.3.test.test_contextlib.TestRedirectStderr.test_no_redirect_in_init -*graalpython.lib-python.3.test.test_contextlib.TestRedirectStderr.test_redirect_to_string_io -*graalpython.lib-python.3.test.test_contextlib.TestRedirectStdout.test_cm_is_reentrant -*graalpython.lib-python.3.test.test_contextlib.TestRedirectStdout.test_cm_is_reusable -*graalpython.lib-python.3.test.test_contextlib.TestRedirectStdout.test_enter_result_is_target -*graalpython.lib-python.3.test.test_contextlib.TestRedirectStdout.test_instance_docs -*graalpython.lib-python.3.test.test_contextlib.TestRedirectStdout.test_no_redirect_in_init -*graalpython.lib-python.3.test.test_contextlib.TestRedirectStdout.test_redirect_to_string_io -*graalpython.lib-python.3.test.test_contextlib.TestSuppress.test_cm_is_reentrant -*graalpython.lib-python.3.test.test_contextlib.TestSuppress.test_exact_exception -*graalpython.lib-python.3.test.test_contextlib.TestSuppress.test_exception_hierarchy -*graalpython.lib-python.3.test.test_contextlib.TestSuppress.test_instance_docs -*graalpython.lib-python.3.test.test_contextlib.TestSuppress.test_multiple_exception_args -*graalpython.lib-python.3.test.test_contextlib.TestSuppress.test_no_args -*graalpython.lib-python.3.test.test_contextlib.TestSuppress.test_no_exception -*graalpython.lib-python.3.test.test_contextlib.TestSuppress.test_no_result_from_enter -*graalpython.lib-python.3.test.test_contextlib.TestSuppress.test_other_exception +test.test_contextlib.ClosingTestCase.test_closing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ClosingTestCase.test_closing_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ClosingTestCase.test_instance_docs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_attribs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_do_not_unchain_non_stopiteration_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_doc_attrib @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_except @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_except_pep479 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_except_stopiter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_no_reraise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_non_normalised @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_trap_no_yield @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_trap_second_yield @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_trap_yield_after_throw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_wrap_runtimeerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_instance_docstring_given_cm_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_param_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.ContextManagerTestCase.test_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.FileContextTestCase.testWithOpen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.LockContextTestCase.testWithBoundedSemaphore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.LockContextTestCase.testWithCondition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.LockContextTestCase.testWithLock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.LockContextTestCase.testWithRLock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.LockContextTestCase.testWithSemaphore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.NullcontextTestCase.test_nullcontext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestAbstractContextManager.test_enter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestAbstractContextManager.test_exit_is_abstract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestAbstractContextManager.test_structural_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestChdir.test_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestChdir.test_reentrant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestChdir.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestContextDecorator.test_contextdecorator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestContextDecorator.test_contextdecorator_as_mixin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestContextDecorator.test_contextdecorator_with_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestContextDecorator.test_contextmanager_as_decorator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestContextDecorator.test_decorating_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestContextDecorator.test_decorator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestContextDecorator.test_decorator_with_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestContextDecorator.test_instance_docs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestContextDecorator.test_typo_enter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestContextDecorator.test_typo_exit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_body_exception_suppress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_dont_reraise_RuntimeError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_enter_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_enter_context_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_excessive_nesting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_exit_exception_chaining_reference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_exit_exception_chaining_suppress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_exit_exception_non_suppressing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_exit_exception_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_exit_exception_with_existing_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_exit_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_exit_suppress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_instance_bypass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_instance_docs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_no_resources @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_pop_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestExitStack.test_push @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestRedirectStderr.test_cm_is_reentrant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestRedirectStderr.test_cm_is_reusable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestRedirectStderr.test_enter_result_is_target @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestRedirectStderr.test_instance_docs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestRedirectStderr.test_no_redirect_in_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestRedirectStderr.test_redirect_to_string_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestRedirectStdout.test_cm_is_reentrant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestRedirectStdout.test_cm_is_reusable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestRedirectStdout.test_enter_result_is_target @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestRedirectStdout.test_instance_docs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestRedirectStdout.test_no_redirect_in_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestRedirectStdout.test_redirect_to_string_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestSuppress.test_cm_is_reentrant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestSuppress.test_exact_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestSuppress.test_exception_hierarchy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestSuppress.test_instance_docs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestSuppress.test_multiple_exception_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestSuppress.test_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestSuppress.test_no_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestSuppress.test_no_result_from_enter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib.TestSuppress.test_other_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_contextlib_async.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_contextlib_async.txt index e895a1ca32..8bec18e7cd 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_contextlib_async.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_contextlib_async.txt @@ -1,52 +1,51 @@ -*graalpython.lib-python.3.test.test_contextlib_async.AclosingTestCase.test_aclosing -*graalpython.lib-python.3.test.test_contextlib_async.AclosingTestCase.test_aclosing_bpo41229 -*graalpython.lib-python.3.test.test_contextlib_async.AclosingTestCase.test_aclosing_error -*graalpython.lib-python.3.test.test_contextlib_async.AclosingTestCase.test_instance_docs -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_attribs -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_doc_attrib -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_except -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_except_stopiter -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_finally -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_no_reraise -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_non_normalised -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_plain -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_traceback -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_trap_no_yield -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_trap_second_yield -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_trap_yield_after_throw -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_wrap_runtimeerror -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_decorating_method -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_decorator -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_decorator_with_exception -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_instance_docstring_given_cm_docstring -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_keywords -*graalpython.lib-python.3.test.test_contextlib_async.AsyncContextManagerTestCase.test_recursive -*graalpython.lib-python.3.test.test_contextlib_async.TestAbstractAsyncContextManager.test_async_gen_propagates_generator_exit -*graalpython.lib-python.3.test.test_contextlib_async.TestAbstractAsyncContextManager.test_enter -*graalpython.lib-python.3.test.test_contextlib_async.TestAbstractAsyncContextManager.test_exit_is_abstract -*graalpython.lib-python.3.test.test_contextlib_async.TestAbstractAsyncContextManager.test_structural_subclassing -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_async_callback -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_async_enter_context -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_async_push -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_body_exception_suppress -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_callback -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_close -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_dont_reraise_RuntimeError -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_enter_async_context -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_enter_async_context_errors -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_enter_context -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_enter_context_errors -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_excessive_nesting -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_exit_exception_chaining_reference -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_exit_exception_chaining_suppress -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_exit_exception_non_suppressing -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_exit_exception_with_existing_context -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_exit_raise -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_exit_suppress -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_instance_bypass -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_instance_bypass_async -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_instance_docs -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_no_resources -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_pop_all -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncExitStack.test_push -*graalpython.lib-python.3.test.test_contextlib_async.TestAsyncNullcontext.test_async_nullcontext +test.test_contextlib_async.AclosingTestCase.test_aclosing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AclosingTestCase.test_aclosing_bpo41229 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AclosingTestCase.test_aclosing_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AclosingTestCase.test_instance_docs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_attribs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_doc_attrib @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_except @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_except_stopiter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_no_reraise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_non_normalised @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_trap_no_yield @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_trap_second_yield @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_trap_yield_after_throw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_wrap_runtimeerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_decorating_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_decorator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_decorator_with_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_instance_docstring_given_cm_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAbstractAsyncContextManager.test_async_gen_propagates_generator_exit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAbstractAsyncContextManager.test_enter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAbstractAsyncContextManager.test_exit_is_abstract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib_async.TestAbstractAsyncContextManager.test_structural_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_contextlib_async.TestAsyncExitStack.test_async_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_async_push @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_body_exception_suppress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_dont_reraise_RuntimeError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_enter_async_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_enter_async_context_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_enter_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_enter_context_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_excessive_nesting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_exit_exception_chaining_reference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_exit_exception_chaining_suppress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_exit_exception_non_suppressing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_exit_exception_with_existing_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_exit_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_exit_suppress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_instance_bypass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_instance_bypass_async @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_instance_docs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_no_resources @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_pop_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_push @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_contextlib_async.TestAsyncNullcontext.test_async_nullcontext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_copy.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_copy.txt index dba568b9c3..72e3b786a4 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_copy.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_copy.txt @@ -1,73 +1,74 @@ -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_atomic -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_basic -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_bytearray -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_cant -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_copy -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_dict -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_frozenset -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_function -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_inst_copy -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_inst_getinitargs -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_inst_getnewargs -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_inst_getnewargs_ex -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_inst_getstate -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_inst_getstate_setstate -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_inst_setstate -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_inst_vanilla -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_list -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_list_subclass -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_reduce -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_reduce_ex -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_registry -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_set -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_slots -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_tuple -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_tuple_subclass -*graalpython.lib-python.3.test.test_copy.TestCopy.test_copy_weakref -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_atomic -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_basic -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_bound_method -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_cant -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_deepcopy -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_dict -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_dict_subclass -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_dont_memo_immutable -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_empty_tuple -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_function -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_inst_deepcopy -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_inst_getinitargs -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_inst_getnewargs -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_inst_getnewargs_ex -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_inst_getstate -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_inst_getstate_setstate -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_inst_setstate -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_inst_vanilla -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_issubclass -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_keepalive -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_list -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_list_subclass -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_memo -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_range -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_reduce -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_reduce_ex -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_reflexive_dict -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_reflexive_inst -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_reflexive_list -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_reflexive_tuple -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_registry -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_slots -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_tuple -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_tuple_of_immutables -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_tuple_subclass -*graalpython.lib-python.3.test.test_copy.TestCopy.test_deepcopy_weakref -*graalpython.lib-python.3.test.test_copy.TestCopy.test_exceptions -*graalpython.lib-python.3.test.test_copy.TestCopy.test_getstate_exc -*graalpython.lib-python.3.test.test_copy.TestCopy.test_reconstruct_nostate -*graalpython.lib-python.3.test.test_copy.TestCopy.test_reconstruct_reflexive -*graalpython.lib-python.3.test.test_copy.TestCopy.test_reconstruct_state -*graalpython.lib-python.3.test.test_copy.TestCopy.test_reconstruct_state_setstate -*graalpython.lib-python.3.test.test_copy.TestCopy.test_reconstruct_string -*graalpython.lib-python.3.test.test_copy.TestCopy.test_reduce_4tuple -*graalpython.lib-python.3.test.test_copy.TestCopy.test_reduce_5tuple -*graalpython.lib-python.3.test.test_copy.TestCopy.test_reduce_6tuple -*graalpython.lib-python.3.test.test_copy.TestCopy.test_reduce_6tuple_none +test.test_copy.TestCopy.test_copy_atomic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_cant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_frozenset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_inst_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_inst_getinitargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_inst_getnewargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_inst_getnewargs_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_inst_getstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_inst_getstate_setstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_inst_setstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_inst_vanilla @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_list_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_registry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_copy_tuple_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +!test.test_copy.TestCopy.test_copy_weakkeydict @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_copy.TestCopy.test_copy_weakref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_atomic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_bound_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_cant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_dict_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_dont_memo_immutable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_empty_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_inst_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_inst_getinitargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_inst_getnewargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_inst_getnewargs_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_inst_getstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_inst_getstate_setstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_inst_setstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_inst_vanilla @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_issubclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_keepalive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_list_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_memo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_reflexive_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_reflexive_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_reflexive_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_reflexive_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_registry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_tuple_of_immutables @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_deepcopy_tuple_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +!test.test_copy.TestCopy.test_deepcopy_weakkeydict @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_weakref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_getstate_exc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_reconstruct_nostate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_reconstruct_reflexive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_reconstruct_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_reconstruct_state_setstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_reconstruct_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_reduce_4tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_reduce_5tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_reduce_6tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copy.TestCopy.test_reduce_6tuple_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_copyreg.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_copyreg.txt index 8e5f9bc63b..3def04fabc 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_copyreg.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_copyreg.txt @@ -1,6 +1,6 @@ -*graalpython.lib-python.3.test.test_copyreg.CopyRegTestCase.test_bool -*graalpython.lib-python.3.test.test_copyreg.CopyRegTestCase.test_class -*graalpython.lib-python.3.test.test_copyreg.CopyRegTestCase.test_extension_registry -*graalpython.lib-python.3.test.test_copyreg.CopyRegTestCase.test_noncallable_constructor -*graalpython.lib-python.3.test.test_copyreg.CopyRegTestCase.test_noncallable_reduce -*graalpython.lib-python.3.test.test_copyreg.CopyRegTestCase.test_slotnames +test.test_copyreg.CopyRegTestCase.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copyreg.CopyRegTestCase.test_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copyreg.CopyRegTestCase.test_extension_registry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copyreg.CopyRegTestCase.test_noncallable_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copyreg.CopyRegTestCase.test_noncallable_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_copyreg.CopyRegTestCase.test_slotnames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_coroutines.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_coroutines.txt index 820d2e63f7..4e6ab1e6f1 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_coroutines.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_coroutines.txt @@ -1,75 +1,72 @@ -*graalpython.lib-python.3.test.test_coroutines.AsyncBadSyntaxTest.test_badsyntax_2 -*graalpython.lib-python.3.test.test_coroutines.AsyncBadSyntaxTest.test_badsyntax_3 -*graalpython.lib-python.3.test.test_coroutines.AsyncBadSyntaxTest.test_badsyntax_4 -*graalpython.lib-python.3.test.test_coroutines.CAPITest.test_tp_await_1 -*graalpython.lib-python.3.test.test_coroutines.CAPITest.test_tp_await_2 -*graalpython.lib-python.3.test.test_coroutines.CAPITest.test_tp_await_3 -*graalpython.lib-python.3.test.test_coroutines.CoroAsyncIOCompatTest.test_asyncio_1 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_await_1 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_await_10 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_await_11 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_await_12 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_await_13 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_await_14 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_await_15 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_await_16 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_await_2 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_await_3 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_await_4 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_await_5 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_await_6 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_await_7 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_await_8 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_await_9 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_comp_1 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_comp_10 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_comp_2 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_comp_3 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_comp_4 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_comp_4_2 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_comp_5 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_comp_6 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_comp_7 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_comp_8 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_comp_9 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_copy -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_coro_wrapper_send_stop_iterator -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_coro_wrapper_send_tuple -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_cr_await -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_for_1 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_for_11 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_for_3 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_for_4 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_for_6 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_for_7 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_for_8 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_for_assign_raising_stop_async_iteration -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_for_assign_raising_stop_async_iteration_2 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_for_stop_iteration -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_for_tuple -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_func_1 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_func_10 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_func_11 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_func_15 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_func_16 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_func_17 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_func_18 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_func_19 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_func_3 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_func_4 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_func_5 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_func_6 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_func_8 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_gen_1 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_pickle -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_stack_in_coroutine_throw -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_with_1 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_with_10 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_with_12 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_with_2 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_with_3 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_with_4 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_with_5 -*graalpython.lib-python.3.test.test_coroutines.CoroutineTest.test_with_9 -*graalpython.lib-python.3.test.test_coroutines.TokenizerRegrTest.test_oneline_defs -*graalpython.lib-python.3.test.test_coroutines.UnawaitedWarningDuringShutdownTest.test_unawaited_warning_during_shutdown +test.test_coroutines.AsyncBadSyntaxTest.test_badsyntax_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.AsyncBadSyntaxTest.test_badsyntax_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.AsyncBadSyntaxTest.test_badsyntax_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroAsyncIOCompatTest.test_asyncio_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_coroutines.CoroutineTest.test_await_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_await_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_await_11 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_await_12 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_await_13 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_await_14 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_await_15 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_await_16 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_await_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_await_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_await_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_await_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_await_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_await_7 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_await_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_await_9 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_comp_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_comp_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_comp_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_comp_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_comp_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_comp_4_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_comp_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_comp_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_comp_7 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_comp_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_comp_9 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_coro_wrapper_send_stop_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_coro_wrapper_send_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_cr_await @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_for_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_for_11 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_for_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_for_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_for_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_for_7 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_for_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_for_assign_raising_stop_async_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_for_assign_raising_stop_async_iteration_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_for_stop_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_for_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_func_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_func_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_func_11 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_func_15 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_func_16 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_func_17 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_func_18 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_func_19 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_func_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_func_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_func_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_func_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_func_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_gen_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_stack_in_coroutine_throw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_with_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_with_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_with_12 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_with_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_with_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_with_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_with_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.CoroutineTest.test_with_9 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.TokenizerRegrTest.test_oneline_defs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_coroutines.UnawaitedWarningDuringShutdownTest.test_unawaited_warning_during_shutdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cppext.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cppext.txt index 37dabc2c94..a6573d44f1 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cppext.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cppext.txt @@ -1,2 +1,2 @@ -*graalpython.lib-python.3.test.test_cppext.__init__.TestCPPExt.test_build_cpp03 -*graalpython.lib-python.3.test.test_cppext.__init__.TestCPPExt.test_build_cpp11 +test.test_cppext.TestCPPExt.test_build_cpp03 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_cppext.TestCPPExt.test_build_cpp11 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cprofile.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cprofile.txt index 6a2047bc31..966b461977 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cprofile.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cprofile.txt @@ -1,8 +1,10 @@ -*graalpython.lib-python.3.test.test_cprofile.CProfileTest.test_output_file_when_changing_directory -*graalpython.lib-python.3.test.test_cprofile.TestCommandLine.test_sort -*test.test_profile.ProfileTest.test_calling_conventions -*test.test_profile.ProfileTest.test_cprofile -*test.test_profile.ProfileTest.test_output_file_when_changing_directory -*test.test_profile.ProfileTest.test_run -*test.test_profile.ProfileTest.test_run_profile_as_module -*test.test_profile.ProfileTest.test_runctx +test.test_cprofile.CProfileTest.test_output_file_when_changing_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cprofile.CProfileTest.test_run_profile_as_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_cprofile.TestCommandLine.test_sort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_profile.ProfileTest.test_calling_conventions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_profile.ProfileTest.test_cprofile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_profile.ProfileTest.test_output_file_when_changing_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_profile.ProfileTest.test_run @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# This test times out in the gate even though it succeeds locally and in the retagger. Race condition? +!test.test_profile.ProfileTest.test_run_profile_as_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_profile.ProfileTest.test_runctx @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_crashers.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_crashers.txt deleted file mode 100644 index 33cdadc050..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_crashers.txt +++ /dev/null @@ -1 +0,0 @@ -*graalpython.lib-python.3.test.test_crashers.CrasherTest.test_crashers_crash diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_crypt.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_crypt.txt index bce0678922..aa79fed8d3 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_crypt.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_crypt.txt @@ -1,8 +1,6 @@ -*graalpython.lib-python.3.test.test_crypt.CryptTestCase.test_blowfish_rounds -*graalpython.lib-python.3.test.test_crypt.CryptTestCase.test_crypt -*graalpython.lib-python.3.test.test_crypt.CryptTestCase.test_invalid_rounds -*graalpython.lib-python.3.test.test_crypt.CryptTestCase.test_methods -*graalpython.lib-python.3.test.test_crypt.CryptTestCase.test_salt -*graalpython.lib-python.3.test.test_crypt.CryptTestCase.test_saltedcrypt -*graalpython.lib-python.3.test.test_crypt.CryptTestCase.test_sha2_rounds -*graalpython.lib-python.3.test.test_crypt.TestWhyCryptDidNotImport.test_import_failure_message +test.test_crypt.CryptTestCase.test_crypt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_crypt.CryptTestCase.test_invalid_rounds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_crypt.CryptTestCase.test_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_crypt.CryptTestCase.test_salt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_crypt.CryptTestCase.test_saltedcrypt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_crypt.CryptTestCase.test_sha2_rounds @ linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_csv.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_csv.txt index a84ebfc1e5..fc8142201a 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_csv.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_csv.txt @@ -1,118 +1,110 @@ -*graalpython.lib-python.3.test.test_csv.KeyOrderingTest.test_ordered_dict_reader -*graalpython.lib-python.3.test.test_csv.KeyOrderingTest.test_ordering_for_the_dict_reader_and_writer -*graalpython.lib-python.3.test.test_csv.MiscTestCase.test__all__ -*graalpython.lib-python.3.test.test_csv.MiscTestCase.test_disallow_instantiation -*graalpython.lib-python.3.test.test_csv.MiscTestCase.test_subclassable -*graalpython.lib-python.3.test.test_csv.TestArrayWrites.test_char_write -*graalpython.lib-python.3.test.test_csv.TestArrayWrites.test_double_write -*graalpython.lib-python.3.test.test_csv.TestArrayWrites.test_float_write -*graalpython.lib-python.3.test.test_csv.TestArrayWrites.test_int_write -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_blankline -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_dubious_quote -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_empty_fields -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_inline_quote -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_inline_quotes -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_lone_quote -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_newlines -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_null -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_quote_and_quote -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_quote_fieldsep -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_quoted -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_quoted_nl -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_quoted_quote -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_quoted_quotes -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_quotes -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_quotes_and_more -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_simple -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_simple_writer -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_single -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_single_quoted_quote -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_single_writer -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_singlequoted -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_singlequoted_left_empty -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_singlequoted_right_empty -*graalpython.lib-python.3.test.test_csv.TestDialectExcel.test_space_and_quote -*graalpython.lib-python.3.test.test_csv.TestDialectRegistry.test_bad_dialect -*graalpython.lib-python.3.test.test_csv.TestDialectRegistry.test_copy -*graalpython.lib-python.3.test.test_csv.TestDialectRegistry.test_dialect_apply -*graalpython.lib-python.3.test.test_csv.TestDialectRegistry.test_incomplete_dialect -*graalpython.lib-python.3.test.test_csv.TestDialectRegistry.test_pickle -*graalpython.lib-python.3.test.test_csv.TestDialectRegistry.test_register_kwargs -*graalpython.lib-python.3.test.test_csv.TestDialectRegistry.test_register_kwargs_override -*graalpython.lib-python.3.test.test_csv.TestDialectRegistry.test_registry -*graalpython.lib-python.3.test.test_csv.TestDialectRegistry.test_registry_badargs -*graalpython.lib-python.3.test.test_csv.TestDialectRegistry.test_space_dialect -*graalpython.lib-python.3.test.test_csv.TestDialectUnix.test_simple_reader -*graalpython.lib-python.3.test.test_csv.TestDialectUnix.test_simple_writer -*graalpython.lib-python.3.test.test_csv.TestDialectValidity.test_delimiter -*graalpython.lib-python.3.test.test_csv.TestDialectValidity.test_escapechar -*graalpython.lib-python.3.test.test_csv.TestDialectValidity.test_invalid_chars -*graalpython.lib-python.3.test.test_csv.TestDialectValidity.test_lineterminator -*graalpython.lib-python.3.test.test_csv.TestDialectValidity.test_quoting -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_read_dict_fieldnames_chain -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_read_dict_fieldnames_from_file -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_read_dict_fields -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_read_dict_no_fieldnames -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_read_long -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_read_long_with_rest -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_read_long_with_rest_no_fieldnames -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_read_multi -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_read_semi_sep -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_read_short -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_read_with_blanks -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_typo_in_extrasaction_raises_error -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_write_field_not_in_field_names_ignore -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_write_field_not_in_field_names_raise -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_write_fields_not_in_fieldnames -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_write_multiple_dict_rows -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_write_no_fields -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_write_simple_dict -*graalpython.lib-python.3.test.test_csv.TestDictFields.test_writeheader_return_value -*graalpython.lib-python.3.test.test_csv.TestEscapedExcel.test_escape_fieldsep -*graalpython.lib-python.3.test.test_csv.TestEscapedExcel.test_read_escape_fieldsep -*graalpython.lib-python.3.test.test_csv.TestLeaks.test_create_read -*graalpython.lib-python.3.test.test_csv.TestLeaks.test_create_write -*graalpython.lib-python.3.test.test_csv.TestLeaks.test_read -*graalpython.lib-python.3.test.test_csv.TestLeaks.test_write -*graalpython.lib-python.3.test.test_csv.TestQuotedEscapedExcel.test_read_escape_fieldsep -*graalpython.lib-python.3.test.test_csv.TestQuotedEscapedExcel.test_write_escape_fieldsep -*graalpython.lib-python.3.test.test_csv.TestSniffer.test_delimiters -*graalpython.lib-python.3.test.test_csv.TestSniffer.test_doublequote -*graalpython.lib-python.3.test.test_csv.TestSniffer.test_guess_quote_and_delimiter -*graalpython.lib-python.3.test.test_csv.TestSniffer.test_has_header -*graalpython.lib-python.3.test.test_csv.TestSniffer.test_has_header_regex_special_delimiter -*graalpython.lib-python.3.test.test_csv.TestSniffer.test_has_header_strings -*graalpython.lib-python.3.test.test_csv.TestSniffer.test_issue43625 -*graalpython.lib-python.3.test.test_csv.TestSniffer.test_sniff -*graalpython.lib-python.3.test.test_csv.TestUnicode.test_unicode_read -*graalpython.lib-python.3.test.test_csv.TestUnicode.test_unicode_write -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_read_bigfield -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_read_delimiter -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_read_eof -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_read_eol -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_read_escape -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_read_linenum -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_read_nul -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_read_oddinputs -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_read_quoting -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_read_skipinitialspace -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_reader_arg_valid -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_reader_attrs -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_reader_dialect_attrs -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_reader_kw_attrs -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_roundtrip_escaped_unquoted_newlines -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_roundtrip_quoteed_newlines -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_write_arg_valid -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_write_bigfield -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_write_escape -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_write_iterable -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_write_lineterminator -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_write_quoting -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_writer_arg_valid -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_writer_attrs -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_writer_dialect_attrs -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_writer_kw_attrs -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_writerows -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_writerows_errors -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_writerows_legacy_strings -*graalpython.lib-python.3.test.test_csv.Test_Csv.test_writerows_with_none +test.test_csv.KeyOrderingTest.test_ordered_dict_reader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.KeyOrderingTest.test_ordering_for_the_dict_reader_and_writer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.MiscTestCase.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.MiscTestCase.test_subclassable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestArrayWrites.test_char_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestArrayWrites.test_double_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestArrayWrites.test_float_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestArrayWrites.test_int_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_blankline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_dubious_quote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_empty_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_inline_quote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_inline_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_lone_quote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_newlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_null @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_quote_and_quote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_quote_fieldsep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_quoted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_quoted_nl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_quoted_quote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_quoted_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_quotes_and_more @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_simple_writer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_single @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_single_quoted_quote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_single_writer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_singlequoted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_singlequoted_left_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_singlequoted_right_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectExcel.test_space_and_quote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectRegistry.test_bad_dialect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectRegistry.test_dialect_apply @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectRegistry.test_incomplete_dialect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectRegistry.test_register_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectRegistry.test_register_kwargs_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectRegistry.test_registry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectRegistry.test_registry_badargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectRegistry.test_space_dialect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectUnix.test_simple_reader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectUnix.test_simple_writer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectValidity.test_delimiter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectValidity.test_escapechar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectValidity.test_invalid_chars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectValidity.test_lineterminator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDialectValidity.test_quoting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_read_dict_fieldnames_chain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_read_dict_fieldnames_from_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_read_dict_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_read_dict_no_fieldnames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_read_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_read_long_with_rest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_read_long_with_rest_no_fieldnames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_read_multi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_read_semi_sep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_read_short @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_read_with_blanks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_typo_in_extrasaction_raises_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_write_field_not_in_field_names_ignore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_write_field_not_in_field_names_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_write_fields_not_in_fieldnames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_write_multiple_dict_rows @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_write_no_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_write_simple_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestDictFields.test_writeheader_return_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestEscapedExcel.test_escape_fieldsep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestEscapedExcel.test_read_escape_fieldsep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestQuotedEscapedExcel.test_read_escape_fieldsep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestQuotedEscapedExcel.test_write_escape_fieldsep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestSniffer.test_delimiters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestSniffer.test_doublequote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestSniffer.test_guess_quote_and_delimiter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestSniffer.test_has_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestSniffer.test_has_header_regex_special_delimiter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestSniffer.test_has_header_strings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestSniffer.test_issue43625 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestSniffer.test_sniff @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestUnicode.test_unicode_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.TestUnicode.test_unicode_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_read_bigfield @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_read_delimiter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_read_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_read_eol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_read_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_read_linenum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_read_nul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_read_oddinputs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_read_quoting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_read_skipinitialspace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_reader_arg_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_reader_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_reader_dialect_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_reader_kw_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_roundtrip_escaped_unquoted_newlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_roundtrip_quoteed_newlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_write_arg_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_write_bigfield @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_write_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_write_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_write_lineterminator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_write_quoting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_writer_arg_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_writer_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_writer_dialect_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_writer_kw_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_writerows @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_writerows_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_csv.Test_Csv.test_writerows_with_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ctypes.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ctypes.txt index 8ab3e4280b..d57dc4de19 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ctypes.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ctypes.txt @@ -1,348 +1,254 @@ -*ctypes.test.test_anon.AnonTest.test_anon_nonmember -*ctypes.test.test_anon.AnonTest.test_anon_nonseq -*ctypes.test.test_anon.AnonTest.test_issue31490 -*ctypes.test.test_array_in_pointer.Test.test -*ctypes.test.test_array_in_pointer.Test.test_2 -*ctypes.test.test_arrays.ArrayTestCase.test_bad_subclass -*ctypes.test.test_arrays.ArrayTestCase.test_bpo36504_signed_int_overflow -*ctypes.test.test_arrays.ArrayTestCase.test_cache -*ctypes.test.test_arrays.ArrayTestCase.test_classcache -*ctypes.test.test_arrays.ArrayTestCase.test_empty_element_array -*ctypes.test.test_arrays.ArrayTestCase.test_empty_element_struct -*ctypes.test.test_arrays.ArrayTestCase.test_from_address -*ctypes.test.test_arrays.ArrayTestCase.test_large_array -*ctypes.test.test_arrays.ArrayTestCase.test_numeric_arrays -*ctypes.test.test_arrays.ArrayTestCase.test_simple -*ctypes.test.test_arrays.ArrayTestCase.test_subclass -*ctypes.test.test_arrays.ArrayTestCase.test_zero_length -*ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_callbacks -*ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_callbacks_2 -*ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_longlong_callbacks -*ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_pointers -*ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_recursive_as_param -*ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_shorts -*ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_wchar_parm -*ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_callbacks -*ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_callbacks_2 -*ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_longlong_callbacks -*ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_pointers -*ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_recursive_as_param -*ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_shorts -*ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_wchar_parm -*ctypes.test.test_as_parameter.BasicWrapTestCase.test_callbacks -*ctypes.test.test_as_parameter.BasicWrapTestCase.test_callbacks_2 -*ctypes.test.test_as_parameter.BasicWrapTestCase.test_longlong_callbacks -*ctypes.test.test_as_parameter.BasicWrapTestCase.test_pointers -*ctypes.test.test_as_parameter.BasicWrapTestCase.test_recursive_as_param -*ctypes.test.test_as_parameter.BasicWrapTestCase.test_shorts -*ctypes.test.test_as_parameter.BasicWrapTestCase.test_wchar_parm -*ctypes.test.test_bitfields.BitFieldTest.test_c_wchar -*ctypes.test.test_bitfields.BitFieldTest.test_mixed_1 -*ctypes.test.test_bitfields.BitFieldTest.test_mixed_2 -*ctypes.test.test_bitfields.BitFieldTest.test_mixed_3 -*ctypes.test.test_bitfields.BitFieldTest.test_mixed_4 -*ctypes.test.test_bitfields.BitFieldTest.test_multi_bitfields_size -*ctypes.test.test_bitfields.BitFieldTest.test_nonint_types -*ctypes.test.test_bitfields.BitFieldTest.test_single_bitfield_size -*ctypes.test.test_bitfields.BitFieldTest.test_uint32 -*ctypes.test.test_buffers.StringBufferTestCase.test_buffer -*ctypes.test.test_buffers.StringBufferTestCase.test_buffer_interface -*ctypes.test.test_buffers.StringBufferTestCase.test_create_unicode_buffer_non_bmp -*ctypes.test.test_bytes.BytesTest.test_BSTR -*ctypes.test.test_bytes.BytesTest.test_c_char_p -*ctypes.test.test_bytes.BytesTest.test_c_wchar -*ctypes.test.test_bytes.BytesTest.test_c_wchar_p -*ctypes.test.test_bytes.BytesTest.test_struct -*ctypes.test.test_bytes.BytesTest.test_struct_W -*ctypes.test.test_byteswap.Test.test_X -*ctypes.test.test_byteswap.Test.test_endian_double -*ctypes.test.test_byteswap.Test.test_endian_float -*ctypes.test.test_byteswap.Test.test_endian_int -*ctypes.test.test_byteswap.Test.test_endian_longlong -*ctypes.test.test_byteswap.Test.test_endian_other -*ctypes.test.test_byteswap.Test.test_endian_short -*ctypes.test.test_byteswap.Test.test_slots -*ctypes.test.test_byteswap.Test.test_struct_field_alignment -*ctypes.test.test_byteswap.Test.test_struct_fields_1 -*ctypes.test.test_byteswap.Test.test_struct_fields_2 -*ctypes.test.test_byteswap.Test.test_struct_fields_unsupported_byte_order -*ctypes.test.test_byteswap.Test.test_unaligned_native_struct_fields -*ctypes.test.test_byteswap.Test.test_unaligned_nonnative_struct_fields -*ctypes.test.test_byteswap.Test.test_union_fields_unsupported_byte_order -*ctypes.test.test_callbacks.Callbacks.test_char_p -*ctypes.test.test_callbacks.Callbacks.test_issue12483 -*ctypes.test.test_callbacks.Callbacks.test_unsupported_restype_1 -*ctypes.test.test_callbacks.Callbacks.test_unsupported_restype_2 -*ctypes.test.test_callbacks.SampleCallbacksTestCase.test_callback_register_double -*ctypes.test.test_callbacks.SampleCallbacksTestCase.test_callback_register_int -*ctypes.test.test_callbacks.SampleCallbacksTestCase.test_integrate -*ctypes.test.test_callbacks.SampleCallbacksTestCase.test_issue_8959_a -*ctypes.test.test_callbacks.SampleCallbacksTestCase.test_issue_8959_b -*ctypes.test.test_callbacks.StdcallCallbacks.test_byte -*ctypes.test.test_callbacks.StdcallCallbacks.test_char -*ctypes.test.test_callbacks.StdcallCallbacks.test_char_p -*ctypes.test.test_callbacks.StdcallCallbacks.test_double -*ctypes.test.test_callbacks.StdcallCallbacks.test_float -*ctypes.test.test_callbacks.StdcallCallbacks.test_int -*ctypes.test.test_callbacks.StdcallCallbacks.test_issue12483 -*ctypes.test.test_callbacks.StdcallCallbacks.test_issue_7959 -*ctypes.test.test_callbacks.StdcallCallbacks.test_long -*ctypes.test.test_callbacks.StdcallCallbacks.test_longdouble -*ctypes.test.test_callbacks.StdcallCallbacks.test_longlong -*ctypes.test.test_callbacks.StdcallCallbacks.test_pyobject -*ctypes.test.test_callbacks.StdcallCallbacks.test_short -*ctypes.test.test_callbacks.StdcallCallbacks.test_ubyte -*ctypes.test.test_callbacks.StdcallCallbacks.test_uint -*ctypes.test.test_callbacks.StdcallCallbacks.test_ulong -*ctypes.test.test_callbacks.StdcallCallbacks.test_ulonglong -*ctypes.test.test_callbacks.StdcallCallbacks.test_unsupported_restype_1 -*ctypes.test.test_callbacks.StdcallCallbacks.test_unsupported_restype_2 -*ctypes.test.test_callbacks.StdcallCallbacks.test_ushort -*ctypes.test.test_cast.Test.test_address2pointer -*ctypes.test.test_cast.Test.test_array2pointer -*ctypes.test.test_cast.Test.test_bad_type_arg -*ctypes.test.test_cast.Test.test_char_p -*ctypes.test.test_cast.Test.test_other -*ctypes.test.test_cast.Test.test_p2a_objects -*ctypes.test.test_cast.Test.test_wchar_p -*ctypes.test.test_cfuncs.stdcallCFunctions.test_byte -*ctypes.test.test_cfuncs.stdcallCFunctions.test_byte_plus -*ctypes.test.test_cfuncs.stdcallCFunctions.test_callwithresult -*ctypes.test.test_cfuncs.stdcallCFunctions.test_double -*ctypes.test.test_cfuncs.stdcallCFunctions.test_double_plus -*ctypes.test.test_cfuncs.stdcallCFunctions.test_float -*ctypes.test.test_cfuncs.stdcallCFunctions.test_float_plus -*ctypes.test.test_cfuncs.stdcallCFunctions.test_int -*ctypes.test.test_cfuncs.stdcallCFunctions.test_int_plus -*ctypes.test.test_cfuncs.stdcallCFunctions.test_long -*ctypes.test.test_cfuncs.stdcallCFunctions.test_long_plus -*ctypes.test.test_cfuncs.stdcallCFunctions.test_longdouble -*ctypes.test.test_cfuncs.stdcallCFunctions.test_longdouble_plus -*ctypes.test.test_cfuncs.stdcallCFunctions.test_longlong -*ctypes.test.test_cfuncs.stdcallCFunctions.test_longlong_plus -*ctypes.test.test_cfuncs.stdcallCFunctions.test_short -*ctypes.test.test_cfuncs.stdcallCFunctions.test_short_plus -*ctypes.test.test_cfuncs.stdcallCFunctions.test_ubyte -*ctypes.test.test_cfuncs.stdcallCFunctions.test_ubyte_plus -*ctypes.test.test_cfuncs.stdcallCFunctions.test_uint -*ctypes.test.test_cfuncs.stdcallCFunctions.test_uint_plus -*ctypes.test.test_cfuncs.stdcallCFunctions.test_ulong -*ctypes.test.test_cfuncs.stdcallCFunctions.test_ulong_plus -*ctypes.test.test_cfuncs.stdcallCFunctions.test_ulonglong -*ctypes.test.test_cfuncs.stdcallCFunctions.test_ulonglong_plus -*ctypes.test.test_cfuncs.stdcallCFunctions.test_ushort -*ctypes.test.test_cfuncs.stdcallCFunctions.test_ushort_plus -*ctypes.test.test_cfuncs.stdcallCFunctions.test_void -*ctypes.test.test_checkretval.Test.test_oledll -*ctypes.test.test_delattr.TestCase.test_chararray -*ctypes.test.test_delattr.TestCase.test_simple -*ctypes.test.test_errno.Test.test_GetLastError -*ctypes.test.test_find.FindLibraryLinux.test_find_library_with_gcc -*ctypes.test.test_find.FindLibraryLinux.test_find_library_with_ld -*ctypes.test.test_find.FindLibraryLinux.test_find_on_libpath -*ctypes.test.test_find.Test_OpenGL_libs.test_gl -*ctypes.test.test_find.Test_OpenGL_libs.test_gle -*ctypes.test.test_find.Test_OpenGL_libs.test_glu -*ctypes.test.test_find.Test_OpenGL_libs.test_shell_injection -*ctypes.test.test_frombuffer.Test.test_abstract -*ctypes.test.test_frombuffer.Test.test_fortran_contiguous -*ctypes.test.test_frombuffer.Test.test_from_buffer_copy -*ctypes.test.test_frombuffer.Test.test_from_buffer_copy_with_offset -*ctypes.test.test_frombuffer.Test.test_from_buffer_memoryview -*ctypes.test.test_frombuffer.Test.test_from_buffer_with_offset -*ctypes.test.test_funcptr.CFuncPtrTestCase.test_abstract -*ctypes.test.test_funcptr.CFuncPtrTestCase.test_basic -*ctypes.test.test_funcptr.CFuncPtrTestCase.test_dllfunctions -*ctypes.test.test_functions.FunctionTestCase.test_callbacks -*ctypes.test.test_functions.FunctionTestCase.test_callbacks_2 -*ctypes.test.test_functions.FunctionTestCase.test_doubleresult -*ctypes.test.test_functions.FunctionTestCase.test_errors -*ctypes.test.test_functions.FunctionTestCase.test_floatresult -*ctypes.test.test_functions.FunctionTestCase.test_intresult -*ctypes.test.test_functions.FunctionTestCase.test_longlong_callbacks -*ctypes.test.test_functions.FunctionTestCase.test_longlongresult -*ctypes.test.test_functions.FunctionTestCase.test_mro -*ctypes.test.test_functions.FunctionTestCase.test_pointers -*ctypes.test.test_functions.FunctionTestCase.test_shorts -*ctypes.test.test_functions.FunctionTestCase.test_stringresult -*ctypes.test.test_functions.FunctionTestCase.test_struct_return_2H_stdcall -*ctypes.test.test_functions.FunctionTestCase.test_struct_return_8H_stdcall -*ctypes.test.test_functions.FunctionTestCase.test_wchar_parm -*ctypes.test.test_functions.FunctionTestCase.test_wchar_result -*ctypes.test.test_init.InitTest.test_get -*ctypes.test.test_internals.ObjectsTestCase.test_embedded_structs -*ctypes.test.test_internals.ObjectsTestCase.test_ints -*ctypes.test.test_internals.ObjectsTestCase.test_ptr_struct -*ctypes.test.test_internals.ObjectsTestCase.test_simple_struct -*ctypes.test.test_internals.ObjectsTestCase.test_xxx -*ctypes.test.test_keeprefs.ArrayTestCase.test_cint_array -*ctypes.test.test_keeprefs.DeletePointerTestCase.test_X -*ctypes.test.test_keeprefs.PointerTestCase.test_p_cint -*ctypes.test.test_keeprefs.SimpleTestCase.test_ccharp -*ctypes.test.test_keeprefs.SimpleTestCase.test_cint -*ctypes.test.test_keeprefs.StructureTestCase.test_ccharp_struct -*ctypes.test.test_keeprefs.StructureTestCase.test_cint_struct -*ctypes.test.test_keeprefs.StructureTestCase.test_struct_struct -*ctypes.test.test_libc.LibTest.test_qsort -*ctypes.test.test_libc.LibTest.test_sqrt -*ctypes.test.test_loading.LoaderTest.test_1703286_A -*ctypes.test.test_loading.LoaderTest.test_1703286_B -*ctypes.test.test_loading.LoaderTest.test_find -*ctypes.test.test_loading.LoaderTest.test_load -*ctypes.test.test_loading.LoaderTest.test_load_dll_with_flags -*ctypes.test.test_loading.LoaderTest.test_load_library -*ctypes.test.test_loading.LoaderTest.test_load_ordinal_functions -*ctypes.test.test_loading.LoaderTest.test_load_version -*ctypes.test.test_macholib.MachOTest.test_find -*ctypes.test.test_macholib.MachOTest.test_framework_info -*ctypes.test.test_macholib.MachOTest.test_info -*ctypes.test.test_memfunctions.MemFunctionsTest.test_cast -*ctypes.test.test_memfunctions.MemFunctionsTest.test_memmove -*ctypes.test.test_memfunctions.MemFunctionsTest.test_memset -*ctypes.test.test_memfunctions.MemFunctionsTest.test_overflow -*ctypes.test.test_memfunctions.MemFunctionsTest.test_string_at -*ctypes.test.test_memfunctions.MemFunctionsTest.test_wstring_at -*ctypes.test.test_numbers.NumberTestCase.test_bool_from_address -*ctypes.test.test_numbers.NumberTestCase.test_bool_values -*ctypes.test.test_numbers.NumberTestCase.test_byref -*ctypes.test.test_numbers.NumberTestCase.test_char_from_address -*ctypes.test.test_numbers.NumberTestCase.test_default_init -*ctypes.test.test_numbers.NumberTestCase.test_float_from_address -*ctypes.test.test_numbers.NumberTestCase.test_float_overflow -*ctypes.test.test_numbers.NumberTestCase.test_floats -*ctypes.test.test_numbers.NumberTestCase.test_from_param -*ctypes.test.test_numbers.NumberTestCase.test_init -*ctypes.test.test_numbers.NumberTestCase.test_int_from_address -*ctypes.test.test_numbers.NumberTestCase.test_integers -*ctypes.test.test_numbers.NumberTestCase.test_perf -*ctypes.test.test_numbers.NumberTestCase.test_signed_values -*ctypes.test.test_numbers.NumberTestCase.test_sizes -*ctypes.test.test_numbers.NumberTestCase.test_typeerror -*ctypes.test.test_numbers.NumberTestCase.test_valid_ranges -*ctypes.test.test_objects.TestCase.test -*ctypes.test.test_parameters.SimpleTypesTestCase.test_abstract -*ctypes.test.test_parameters.SimpleTypesTestCase.test_array_pointers -*ctypes.test.test_parameters.SimpleTypesTestCase.test_byref_pointer -*ctypes.test.test_parameters.SimpleTypesTestCase.test_byref_pointerpointer -*ctypes.test.test_parameters.SimpleTypesTestCase.test_cstrings -*ctypes.test.test_parameters.SimpleTypesTestCase.test_cw_strings -*ctypes.test.test_parameters.SimpleTypesTestCase.test_from_param_result_refcount -*ctypes.test.test_parameters.SimpleTypesTestCase.test_int_pointers -*ctypes.test.test_parameters.SimpleTypesTestCase.test_issue31311 -*ctypes.test.test_parameters.SimpleTypesTestCase.test_subclasses -*ctypes.test.test_parameters.SimpleTypesTestCase.test_subclasses_c_wchar_p -*ctypes.test.test_pickling.PickleTest_0.test_unpickable -*ctypes.test.test_pickling.PickleTest_0.test_wchar -*ctypes.test.test_pickling.PickleTest_1.test_unpickable -*ctypes.test.test_pickling.PickleTest_1.test_wchar -*ctypes.test.test_pickling.PickleTest_2.test_unpickable -*ctypes.test.test_pickling.PickleTest_2.test_wchar -*ctypes.test.test_pickling.PickleTest_3.test_unpickable -*ctypes.test.test_pickling.PickleTest_3.test_wchar -*ctypes.test.test_pickling.PickleTest_4.test_unpickable -*ctypes.test.test_pickling.PickleTest_4.test_wchar -*ctypes.test.test_pickling.PickleTest_5.test_unpickable -*ctypes.test.test_pickling.PickleTest_5.test_wchar -*ctypes.test.test_pointers.PointersTestCase.test_abstract -*ctypes.test.test_pointers.PointersTestCase.test_basic -*ctypes.test.test_pointers.PointersTestCase.test_basics -*ctypes.test.test_pointers.PointersTestCase.test_bug_1467852 -*ctypes.test.test_pointers.PointersTestCase.test_callbacks_with_pointers -*ctypes.test.test_pointers.PointersTestCase.test_change_pointers -*ctypes.test.test_pointers.PointersTestCase.test_charpp -*ctypes.test.test_pointers.PointersTestCase.test_from_address -*ctypes.test.test_pointers.PointersTestCase.test_pass_pointers -*ctypes.test.test_pointers.PointersTestCase.test_pointer_crash -*ctypes.test.test_pointers.PointersTestCase.test_pointer_type_name -*ctypes.test.test_prototypes.ArrayTest.test -*ctypes.test.test_prototypes.CharPointersTestCase.test_POINTER_c_char_arg -*ctypes.test.test_prototypes.CharPointersTestCase.test_c_char_p_arg -*ctypes.test.test_prototypes.CharPointersTestCase.test_c_void_p_arg -*ctypes.test.test_prototypes.CharPointersTestCase.test_c_void_p_arg_with_c_wchar_p -*ctypes.test.test_prototypes.WCharPointersTestCase.test_POINTER_c_wchar_arg -*ctypes.test.test_prototypes.WCharPointersTestCase.test_c_wchar_p_arg -*ctypes.test.test_python_api.PythonAPITestCase.test_PyBytes_FromStringAndSize -*ctypes.test.test_python_api.PythonAPITestCase.test_PyLong_Long -*ctypes.test.test_python_api.PythonAPITestCase.test_PyObj_FromPtr -*ctypes.test.test_python_api.PythonAPITestCase.test_PyString_FromString -*ctypes.test.test_random_things.call_function_TestCase.test -*ctypes.test.test_refcounts.AnotherLeak.test_callback_py_object_none_return -*ctypes.test.test_refcounts.RefcountTestCase.test_1 -*ctypes.test.test_refcounts.RefcountTestCase.test_refcount -*ctypes.test.test_returnfuncptrs.ReturnFuncPtrTestCase.test_from_dll -*ctypes.test.test_returnfuncptrs.ReturnFuncPtrTestCase.test_from_dll_refcount -*ctypes.test.test_simplesubclasses.Test.test_compare -*ctypes.test.test_simplesubclasses.Test.test_int_struct -*ctypes.test.test_sizes.SizesTestCase.test_16 -*ctypes.test.test_sizes.SizesTestCase.test_32 -*ctypes.test.test_sizes.SizesTestCase.test_64 -*ctypes.test.test_sizes.SizesTestCase.test_8 -*ctypes.test.test_sizes.SizesTestCase.test_size_t -*ctypes.test.test_sizes.SizesTestCase.test_ssize_t -*ctypes.test.test_slicing.SlicesTestCase.test_char_array -*ctypes.test.test_slicing.SlicesTestCase.test_getslice_cint -*ctypes.test.test_slicing.SlicesTestCase.test_setslice_cint -*ctypes.test.test_stringptr.StringPtrTestCase.test__POINTER_c_char -*ctypes.test.test_stringptr.StringPtrTestCase.test__c_char_p -*ctypes.test.test_stringptr.StringPtrTestCase.test_functions -*ctypes.test.test_strings.StringArrayTestCase.test_c_buffer_raw -*ctypes.test.test_strings.StringArrayTestCase.test_c_buffer_value -*ctypes.test.test_strings.StringArrayTestCase.test_param_1 -*ctypes.test.test_strings.StringArrayTestCase.test_param_2 -*ctypes.test.test_strings.StringTestCase.test_basic_strings -*ctypes.test.test_strings.StringTestCase.test_initialized_strings -*ctypes.test.test_strings.StringTestCase.test_perf -*ctypes.test.test_strings.StringTestCase.test_sized_strings -*ctypes.test.test_strings.StringTestCase.test_toolong -*ctypes.test.test_strings.WStringArrayTestCase.test_nonbmp -*ctypes.test.test_strings.WStringTestCase.test_basic_wstrings -*ctypes.test.test_strings.WStringTestCase.test_toolong -*ctypes.test.test_strings.WStringTestCase.test_wchar -*ctypes.test.test_struct_fields.StructFieldsTestCase.test_1_A -*ctypes.test.test_struct_fields.StructFieldsTestCase.test_1_B -*ctypes.test.test_struct_fields.StructFieldsTestCase.test_2 -*ctypes.test.test_struct_fields.StructFieldsTestCase.test_3 -*ctypes.test.test_struct_fields.StructFieldsTestCase.test_4 -*ctypes.test.test_struct_fields.StructFieldsTestCase.test___get__ -*ctypes.test.test_struct_fields.StructFieldsTestCase.test___set__ -*ctypes.test.test_structures.PointerMemberTestCase.test -*ctypes.test.test_structures.PointerMemberTestCase.test_none_to_pointer_fields -*ctypes.test.test_structures.StructureTestCase.test_38368 -*ctypes.test.test_structures.StructureTestCase.test_abstract_class -*ctypes.test.test_structures.StructureTestCase.test_bitfield_by_value -*ctypes.test.test_structures.StructureTestCase.test_conflicting_initializers -*ctypes.test.test_structures.StructureTestCase.test_empty -*ctypes.test.test_structures.StructureTestCase.test_fields -*ctypes.test.test_structures.StructureTestCase.test_huge_field_name -*ctypes.test.test_structures.StructureTestCase.test_initializers -*ctypes.test.test_structures.StructureTestCase.test_invalid_field_types -*ctypes.test.test_structures.StructureTestCase.test_invalid_name -*ctypes.test.test_structures.StructureTestCase.test_keyword_initializers -*ctypes.test.test_structures.StructureTestCase.test_methods -*ctypes.test.test_structures.StructureTestCase.test_packed_c_limits -*ctypes.test.test_structures.StructureTestCase.test_struct_alignment -*ctypes.test.test_structures.StructureTestCase.test_structures_with_wchar -*ctypes.test.test_structures.StructureTestCase.test_subclass_creation -*ctypes.test.test_structures.StructureTestCase.test_union_by_value -*ctypes.test.test_structures.StructureTestCase.test_unions -*ctypes.test.test_structures.TestRecursiveStructure.test_contains_itself -*ctypes.test.test_structures.TestRecursiveStructure.test_vice_versa -*ctypes.test.test_unaligned_structures.TestStructures.test_native -*ctypes.test.test_unaligned_structures.TestStructures.test_swapped -*ctypes.test.test_unicode.StringTestCase.test_buffers -*ctypes.test.test_unicode.StringTestCase.test_embedded_null -*ctypes.test.test_unicode.StringTestCase.test_func -*ctypes.test.test_unicode.StringTestCase.test_wcslen -*ctypes.test.test_unicode.UnicodeTestCase.test_embedded_null -*ctypes.test.test_unicode.UnicodeTestCase.test_wcslen -*ctypes.test.test_values.PythonValuesTestCase.test_undefined -*ctypes.test.test_values.ValuesTestCase.test_undefined -*ctypes.test.test_varsize_struct.VarSizeTest.test_array_invalid_length -*ctypes.test.test_win32.FunctionCallTestCase.test_SEH -*ctypes.test.test_win32.FunctionCallTestCase.test_noargs -*ctypes.test.test_win32.ReturnStructSizesTestCase.test_sizes -*ctypes.test.test_win32.TestWinError.test_winerror -*ctypes.test.test_win32.TestWintypes.test_COMError -*ctypes.test.test_win32.TestWintypes.test_HWND -*ctypes.test.test_win32.TestWintypes.test_PARAM -*ctypes.test.test_wintypes.WinTypesTest.test_variant_bool +ctypes.test.test_anon.AnonTest.test_anon_nonmember @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_anon.AnonTest.test_anon_nonseq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_array_in_pointer.Test.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_array_in_pointer.Test.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_bad_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_bpo36504_signed_int_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_classcache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_empty_element_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_empty_element_struct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_from_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_numeric_arrays @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_zero_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_callbacks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_callbacks_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_longlong_callbacks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_pointers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_recursive_as_param @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_shorts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_wchar_parm @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_callbacks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_callbacks_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_longlong_callbacks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_pointers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_recursive_as_param @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_shorts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_wchar_parm @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.BasicWrapTestCase.test_callbacks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.BasicWrapTestCase.test_callbacks_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.BasicWrapTestCase.test_longlong_callbacks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.BasicWrapTestCase.test_pointers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.BasicWrapTestCase.test_recursive_as_param @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.BasicWrapTestCase.test_shorts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_as_parameter.BasicWrapTestCase.test_wchar_parm @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_bitfields.BitFieldTest.test_c_wchar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_bitfields.BitFieldTest.test_mixed_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_bitfields.BitFieldTest.test_mixed_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_bitfields.BitFieldTest.test_mixed_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_bitfields.BitFieldTest.test_mixed_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_bitfields.BitFieldTest.test_multi_bitfields_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_bitfields.BitFieldTest.test_nonint_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_bitfields.BitFieldTest.test_single_bitfield_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_bitfields.BitFieldTest.test_uint32 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_buffers.StringBufferTestCase.test_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_buffers.StringBufferTestCase.test_buffer_interface @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_buffers.StringBufferTestCase.test_create_unicode_buffer_non_bmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_bytes.BytesTest.test_c_char_p @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_bytes.BytesTest.test_c_wchar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_bytes.BytesTest.test_c_wchar_p @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_bytes.BytesTest.test_struct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_bytes.BytesTest.test_struct_W @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_byteswap.Test.test_endian_double @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_byteswap.Test.test_endian_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_byteswap.Test.test_endian_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_byteswap.Test.test_endian_longlong @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_byteswap.Test.test_endian_other @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_byteswap.Test.test_endian_short @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_byteswap.Test.test_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_byteswap.Test.test_struct_field_alignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_byteswap.Test.test_struct_fields_unsupported_byte_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_byteswap.Test.test_unaligned_native_struct_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_byteswap.Test.test_unaligned_nonnative_struct_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_byteswap.Test.test_union_fields_unsupported_byte_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_callbacks.Callbacks.test_issue12483 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_callbacks.Callbacks.test_unsupported_restype_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_callbacks.Callbacks.test_unsupported_restype_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_callbacks.SampleCallbacksTestCase.test_callback_register_double @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_callbacks.SampleCallbacksTestCase.test_callback_register_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_callbacks.SampleCallbacksTestCase.test_integrate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_callbacks.SampleCallbacksTestCase.test_issue_8959_a @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_cast.Test.test_address2pointer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_cast.Test.test_array2pointer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_cast.Test.test_bad_type_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_cast.Test.test_char_p @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_cast.Test.test_other @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_cast.Test.test_p2a_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_cast.Test.test_wchar_p @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_delattr.TestCase.test_chararray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_delattr.TestCase.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_delattr.TestCase.test_struct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_find.FindLibraryLinux.test_find_library_with_gcc @ linux-aarch64,linux-x86_64 +ctypes.test.test_find.FindLibraryLinux.test_find_library_with_ld @ linux-aarch64,linux-x86_64 +ctypes.test.test_find.FindLibraryLinux.test_find_on_libpath @ linux-aarch64,linux-x86_64 +ctypes.test.test_find.Test_OpenGL_libs.test_gl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_find.Test_OpenGL_libs.test_glu @ darwin-arm64,darwin-x86_64 +ctypes.test.test_find.Test_OpenGL_libs.test_shell_injection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_frombuffer.Test.test_abstract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_frombuffer.Test.test_fortran_contiguous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_frombuffer.Test.test_from_buffer_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_frombuffer.Test.test_from_buffer_copy_with_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_frombuffer.Test.test_from_buffer_memoryview @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_frombuffer.Test.test_from_buffer_with_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_funcptr.CFuncPtrTestCase.test_abstract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_funcptr.CFuncPtrTestCase.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_funcptr.CFuncPtrTestCase.test_dllfunctions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_callbacks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_callbacks_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_doubleresult @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_floatresult @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_intresult @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_longdoubleresult @ darwin-arm64 +ctypes.test.test_functions.FunctionTestCase.test_longlong_callbacks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_longlongresult @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_mro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_pointers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_shorts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_stringresult @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_wchar_parm @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_wchar_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_init.InitTest.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_internals.ObjectsTestCase.test_embedded_structs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_internals.ObjectsTestCase.test_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_internals.ObjectsTestCase.test_ptr_struct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_internals.ObjectsTestCase.test_simple_struct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_internals.ObjectsTestCase.test_xxx @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_keeprefs.ArrayTestCase.test_cint_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_keeprefs.PointerTestCase.test_p_cint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_keeprefs.SimpleTestCase.test_ccharp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_keeprefs.SimpleTestCase.test_cint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_keeprefs.StructureTestCase.test_ccharp_struct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_keeprefs.StructureTestCase.test_cint_struct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_keeprefs.StructureTestCase.test_struct_struct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_libc.LibTest.test_qsort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_libc.LibTest.test_sqrt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_loading.LoaderTest.test_find @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_loading.LoaderTest.test_load @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_loading.LoaderTest.test_load_version @ linux-aarch64,linux-x86_64 +ctypes.test.test_macholib.MachOTest.test_find @ darwin-arm64,darwin-x86_64 +ctypes.test.test_macholib.MachOTest.test_framework_info @ darwin-arm64,darwin-x86_64 +ctypes.test.test_macholib.MachOTest.test_info @ darwin-arm64,darwin-x86_64 +ctypes.test.test_memfunctions.MemFunctionsTest.test_cast @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_memfunctions.MemFunctionsTest.test_memmove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_memfunctions.MemFunctionsTest.test_memset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_memfunctions.MemFunctionsTest.test_wstring_at @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_bool_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_byref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_char_from_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_default_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_float_from_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_float_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_from_param @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_int_from_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_integers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_signed_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_sizes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_typeerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_objects.TestCase.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_parameters.SimpleTypesTestCase.test_abstract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_parameters.SimpleTypesTestCase.test_array_pointers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_parameters.SimpleTypesTestCase.test_byref_pointer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_parameters.SimpleTypesTestCase.test_byref_pointerpointer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_parameters.SimpleTypesTestCase.test_cstrings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_parameters.SimpleTypesTestCase.test_cw_strings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_parameters.SimpleTypesTestCase.test_int_pointers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_parameters.SimpleTypesTestCase.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_parameters.SimpleTypesTestCase.test_subclasses_c_wchar_p @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pickling.PickleTest_0.test_unpickable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pickling.PickleTest_0.test_wchar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pickling.PickleTest_1.test_unpickable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pickling.PickleTest_1.test_wchar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pickling.PickleTest_2.test_unpickable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pickling.PickleTest_2.test_wchar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pickling.PickleTest_3.test_unpickable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pickling.PickleTest_3.test_wchar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pickling.PickleTest_4.test_unpickable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pickling.PickleTest_4.test_wchar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pickling.PickleTest_5.test_unpickable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pickling.PickleTest_5.test_wchar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_abstract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_bug_1467852 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_callbacks_with_pointers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_change_pointers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_charpp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_from_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_pass_pointers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_pointer_crash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_pointer_type_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_prototypes.ArrayTest.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_prototypes.CharPointersTestCase.test_POINTER_c_char_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_prototypes.CharPointersTestCase.test_c_char_p_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_prototypes.CharPointersTestCase.test_c_void_p_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_prototypes.CharPointersTestCase.test_c_void_p_arg_with_c_wchar_p @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_prototypes.WCharPointersTestCase.test_POINTER_c_wchar_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_prototypes.WCharPointersTestCase.test_c_wchar_p_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_python_api.PythonAPITestCase.test_PyBytes_FromStringAndSize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +# Transient, at least on M1 +!ctypes.test.test_python_api.PythonAPITestCase.test_PyOS_snprintf @ linux-aarch64,linux-x86_64 +ctypes.test.test_returnfuncptrs.ReturnFuncPtrTestCase.test_from_dll @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_returnfuncptrs.ReturnFuncPtrTestCase.test_from_dll_refcount @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_simplesubclasses.Test.test_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_simplesubclasses.Test.test_int_struct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_sizes.SizesTestCase.test_16 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_sizes.SizesTestCase.test_32 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_sizes.SizesTestCase.test_64 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_sizes.SizesTestCase.test_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_sizes.SizesTestCase.test_size_t @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_sizes.SizesTestCase.test_ssize_t @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_slicing.SlicesTestCase.test_char_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_slicing.SlicesTestCase.test_getslice_cint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_slicing.SlicesTestCase.test_setslice_cint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_stringptr.StringPtrTestCase.test__c_char_p @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_stringptr.StringPtrTestCase.test_functions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_strings.StringArrayTestCase.test_c_buffer_raw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_strings.StringArrayTestCase.test_c_buffer_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_strings.StringArrayTestCase.test_param_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_strings.StringArrayTestCase.test_param_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_strings.WStringArrayTestCase.test_nonbmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_strings.WStringTestCase.test_wchar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_struct_fields.StructFieldsTestCase.test_1_A @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_struct_fields.StructFieldsTestCase.test_1_B @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_struct_fields.StructFieldsTestCase.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_struct_fields.StructFieldsTestCase.test_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_struct_fields.StructFieldsTestCase.test_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_struct_fields.StructFieldsTestCase.test_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_struct_fields.StructFieldsTestCase.test___get__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_struct_fields.StructFieldsTestCase.test___set__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_structures.PointerMemberTestCase.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_structures.PointerMemberTestCase.test_none_to_pointer_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_38368 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_abstract_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_conflicting_initializers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_huge_field_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_initializers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_invalid_field_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_invalid_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_keyword_initializers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_struct_alignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_structures_with_wchar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_unions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_structures.TestRecursiveStructure.test_contains_itself @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_structures.TestRecursiveStructure.test_vice_versa @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_unaligned_structures.TestStructures.test_native @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_unaligned_structures.TestStructures.test_swapped @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_unicode.StringTestCase.test_buffers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_unicode.StringTestCase.test_embedded_null @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_unicode.StringTestCase.test_func @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_unicode.StringTestCase.test_wcslen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_unicode.UnicodeTestCase.test_embedded_null @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_unicode.UnicodeTestCase.test_wcslen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_values.PythonValuesTestCase.test_undefined @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_values.ValuesTestCase.test_undefined @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_varsize_struct.VarSizeTest.test_array_invalid_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_varsize_struct.VarSizeTest.test_zerosized_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +ctypes.test.test_wintypes.WinTypesTest.test_variant_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dataclasses.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dataclasses.txt index f55af65e6b..630234946f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dataclasses.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dataclasses.txt @@ -1,421 +1,214 @@ -*graalpython.lib-python.3.test.test_dataclasses.TestAbstract.test_abc_implementation -*graalpython.lib-python.3.test.test_dataclasses.TestAbstract.test_maintain_abc -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_0_field_compare -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_1_field_compare -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_alternate_classmethod_constructor -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_class_attrs -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_class_marker -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_class_var -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_class_var_default_factory -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_class_var_frozen -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_class_var_no_default -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_class_var_with_default -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_classvar_default_factory -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_clean_traceback_from_fields_exception -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_compare_subclasses -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_dataclasses_pickleable -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_dataclasses_qualnames -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_dataclassses_pickleable -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_default_factory -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_default_factory_derived -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_default_factory_not_called_if_value_given -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_default_factory_with_no_init -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_deliberately_mutable_defaults -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_disallowed_mutable_defaults -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_dont_include_other_annotations -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_dynamic_class_creation -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_dynamic_class_creation_using_field -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_eq_order -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_field_default -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_field_default_default_factory_error -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_field_metadata_custom_mapping -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_field_metadata_default -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_field_metadata_mapping -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_field_named_BUILTINS_frozen -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_field_named_like_builtin -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_field_named_like_builtin_frozen -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_field_named_object -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_field_named_object_frozen -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_field_named_self -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_field_no_default -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_field_order -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_field_recursive_repr -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_field_repr -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_function_annotations -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_generic_dataclasses -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_generic_dynamic -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_generic_extending -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_hash_field_rules -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_asdict -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_asdict_builtin_containers -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_asdict_builtin_object_containers -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_asdict_copy_values -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_asdict_factory -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_asdict_namedtuple -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_asdict_namedtuple_derived -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_asdict_namedtuple_key -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_asdict_nested -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_asdict_raises_on_classes -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_astuple -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_astuple_builtin_containers -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_astuple_builtin_object_containers -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_astuple_copy_values -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_astuple_factory -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_astuple_namedtuple -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_astuple_nested -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_astuple_raises_on_classes -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_fields_exception -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_helper_fields_with_class_instance -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_init_false_no_default -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_init_in_order -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_init_var -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_init_var_default_factory -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_init_var_inheritance -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_init_var_no_default -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_init_var_preserve_type -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_init_var_with_default -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_intermediate_non_dataclass -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_is_dataclass -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_is_dataclass_genericalias -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_is_dataclass_when_getattr_always_returns -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_items_in_dicts -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_missing_default -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_missing_default_factory -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_missing_repr -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_named_init_params -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_no_fields -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_no_fields_but_member_variable -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_no_options -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_not_in_compare -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_not_in_repr -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_not_other_dataclass -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_not_tuple -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_one_field_no_default -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_overwrite_fields_in_derived_class -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_overwrite_hash -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_post_init -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_post_init_classmethod -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_post_init_staticmethod -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_post_init_super -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_recursive_annotation -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_simple_compare -*graalpython.lib-python.3.test.test_dataclasses.TestCase.test_two_fields_one_default -*graalpython.lib-python.3.test.test_dataclasses.TestDescriptors.test_default_value -*graalpython.lib-python.3.test.test_dataclasses.TestDescriptors.test_init_calls_set -*graalpython.lib-python.3.test.test_dataclasses.TestDescriptors.test_lookup_on_class -*graalpython.lib-python.3.test.test_dataclasses.TestDescriptors.test_lookup_on_instance -*graalpython.lib-python.3.test.test_dataclasses.TestDescriptors.test_no_default_value -*graalpython.lib-python.3.test.test_dataclasses.TestDescriptors.test_non_descriptor -*graalpython.lib-python.3.test.test_dataclasses.TestDescriptors.test_set_name -*graalpython.lib-python.3.test.test_dataclasses.TestDescriptors.test_setting_field_calls_set -*graalpython.lib-python.3.test.test_dataclasses.TestDescriptors.test_setting_uninitialized_descriptor_field -*graalpython.lib-python.3.test.test_dataclasses.TestDocString.test_docstring_list_field -*graalpython.lib-python.3.test.test_dataclasses.TestDocString.test_docstring_list_field_with_default_factory -*graalpython.lib-python.3.test.test_dataclasses.TestDocString.test_docstring_no_fields -*graalpython.lib-python.3.test.test_dataclasses.TestDocString.test_docstring_one_field -*graalpython.lib-python.3.test.test_dataclasses.TestDocString.test_docstring_one_field_with_default -*graalpython.lib-python.3.test.test_dataclasses.TestDocString.test_docstring_one_field_with_default_none -*graalpython.lib-python.3.test.test_dataclasses.TestDocString.test_docstring_three_fields -*graalpython.lib-python.3.test.test_dataclasses.TestDocString.test_docstring_two_fields -*graalpython.lib-python.3.test.test_dataclasses.TestDocString.test_existing_docstring_not_overridden -*graalpython.lib-python.3.test.test_dataclasses.TestEq.test_no_eq -*graalpython.lib-python.3.test.test_dataclasses.TestEq.test_overwriting_eq -*graalpython.lib-python.3.test.test_dataclasses.TestFieldNoAnnotation.test_field_without_annotation -*graalpython.lib-python.3.test.test_dataclasses.TestFieldNoAnnotation.test_field_without_annotation_but_annotation_in_base -*graalpython.lib-python.3.test.test_dataclasses.TestFieldNoAnnotation.test_field_without_annotation_but_annotation_in_base_not_dataclass -*graalpython.lib-python.3.test.test_dataclasses.TestFrozen.test_frozen -*graalpython.lib-python.3.test.test_dataclasses.TestFrozen.test_frozen_hash -*graalpython.lib-python.3.test.test_dataclasses.TestFrozen.test_inherit -*graalpython.lib-python.3.test.test_dataclasses.TestFrozen.test_inherit_from_normal_class -*graalpython.lib-python.3.test.test_dataclasses.TestFrozen.test_inherit_frozen_from_nonfrozen -*graalpython.lib-python.3.test.test_dataclasses.TestFrozen.test_inherit_nonfrozen_from_empty -*graalpython.lib-python.3.test.test_dataclasses.TestFrozen.test_inherit_nonfrozen_from_empty_frozen -*graalpython.lib-python.3.test.test_dataclasses.TestFrozen.test_inherit_nonfrozen_from_frozen -*graalpython.lib-python.3.test.test_dataclasses.TestFrozen.test_non_frozen_normal_derived -*graalpython.lib-python.3.test.test_dataclasses.TestFrozen.test_overwriting_frozen -*graalpython.lib-python.3.test.test_dataclasses.TestHash.test_0_field_hash -*graalpython.lib-python.3.test.test_dataclasses.TestHash.test_1_field_hash -*graalpython.lib-python.3.test.test_dataclasses.TestHash.test_eq_only -*graalpython.lib-python.3.test.test_dataclasses.TestHash.test_hash_no_args -*graalpython.lib-python.3.test.test_dataclasses.TestHash.test_hash_rules -*graalpython.lib-python.3.test.test_dataclasses.TestHash.test_unsafe_hash -*graalpython.lib-python.3.test.test_dataclasses.TestInit.test_base_has_init -*graalpython.lib-python.3.test.test_dataclasses.TestInit.test_inherit_from_protocol -*graalpython.lib-python.3.test.test_dataclasses.TestInit.test_no_init -*graalpython.lib-python.3.test.test_dataclasses.TestInit.test_overwriting_init -*graalpython.lib-python.3.test.test_dataclasses.TestKeywordArgs.test_KW_ONLY -*graalpython.lib-python.3.test.test_dataclasses.TestKeywordArgs.test_KW_ONLY_as_string -*graalpython.lib-python.3.test.test_dataclasses.TestKeywordArgs.test_KW_ONLY_twice -*graalpython.lib-python.3.test.test_dataclasses.TestKeywordArgs.test_defaults -*graalpython.lib-python.3.test.test_dataclasses.TestKeywordArgs.test_field_marked_as_kwonly -*graalpython.lib-python.3.test.test_dataclasses.TestKeywordArgs.test_make_dataclass -*graalpython.lib-python.3.test.test_dataclasses.TestKeywordArgs.test_match_args -*graalpython.lib-python.3.test.test_dataclasses.TestKeywordArgs.test_no_classvar_kwarg -*graalpython.lib-python.3.test.test_dataclasses.TestKeywordArgs.test_post_init -*graalpython.lib-python.3.test.test_dataclasses.TestMakeDataclass.test_base -*graalpython.lib-python.3.test.test_dataclasses.TestMakeDataclass.test_base_dataclass -*graalpython.lib-python.3.test.test_dataclasses.TestMakeDataclass.test_class_var -*graalpython.lib-python.3.test.test_dataclasses.TestMakeDataclass.test_duplicate_field_names -*graalpython.lib-python.3.test.test_dataclasses.TestMakeDataclass.test_funny_class_names_names -*graalpython.lib-python.3.test.test_dataclasses.TestMakeDataclass.test_init_var -*graalpython.lib-python.3.test.test_dataclasses.TestMakeDataclass.test_invalid_type_specification -*graalpython.lib-python.3.test.test_dataclasses.TestMakeDataclass.test_keyword_field_names -*graalpython.lib-python.3.test.test_dataclasses.TestMakeDataclass.test_no_mutate_namespace -*graalpython.lib-python.3.test.test_dataclasses.TestMakeDataclass.test_no_types -*graalpython.lib-python.3.test.test_dataclasses.TestMakeDataclass.test_non_identifier_field_names -*graalpython.lib-python.3.test.test_dataclasses.TestMakeDataclass.test_other_params -*graalpython.lib-python.3.test.test_dataclasses.TestMakeDataclass.test_simple -*graalpython.lib-python.3.test.test_dataclasses.TestMakeDataclass.test_underscore_field_names -*graalpython.lib-python.3.test.test_dataclasses.TestMatchArgs.test_bpo_43764 -*graalpython.lib-python.3.test.test_dataclasses.TestMatchArgs.test_explicit_match_args -*graalpython.lib-python.3.test.test_dataclasses.TestMatchArgs.test_make_dataclasses -*graalpython.lib-python.3.test.test_dataclasses.TestMatchArgs.test_match_args -*graalpython.lib-python.3.test.test_dataclasses.TestMatchArgs.test_match_args_argument -*graalpython.lib-python.3.test.test_dataclasses.TestOrdering.test_functools_total_ordering -*graalpython.lib-python.3.test.test_dataclasses.TestOrdering.test_no_order -*graalpython.lib-python.3.test.test_dataclasses.TestOrdering.test_overwriting_order -*graalpython.lib-python.3.test.test_dataclasses.TestReplace.test -*graalpython.lib-python.3.test.test_dataclasses.TestReplace.test_classvar -*graalpython.lib-python.3.test.test_dataclasses.TestReplace.test_frozen -*graalpython.lib-python.3.test.test_dataclasses.TestReplace.test_initvar_is_specified -*graalpython.lib-python.3.test.test_dataclasses.TestReplace.test_initvar_with_default_value -*graalpython.lib-python.3.test.test_dataclasses.TestReplace.test_invalid_field_name -*graalpython.lib-python.3.test.test_dataclasses.TestReplace.test_invalid_object -*graalpython.lib-python.3.test.test_dataclasses.TestReplace.test_no_init -*graalpython.lib-python.3.test.test_dataclasses.TestReplace.test_recursive_repr -*graalpython.lib-python.3.test.test_dataclasses.TestReplace.test_recursive_repr_indirection -*graalpython.lib-python.3.test.test_dataclasses.TestReplace.test_recursive_repr_indirection_two -*graalpython.lib-python.3.test.test_dataclasses.TestReplace.test_recursive_repr_misc_attrs -*graalpython.lib-python.3.test.test_dataclasses.TestReplace.test_recursive_repr_two_attrs -*graalpython.lib-python.3.test.test_dataclasses.TestRepr.test_no_repr -*graalpython.lib-python.3.test.test_dataclasses.TestRepr.test_overwriting_repr -*graalpython.lib-python.3.test.test_dataclasses.TestRepr.test_repr -*graalpython.lib-python.3.test.test_dataclasses.TestSlots.test_add_slots_when_slots_exists -*graalpython.lib-python.3.test.test_dataclasses.TestSlots.test_derived_added_field -*graalpython.lib-python.3.test.test_dataclasses.TestSlots.test_frozen_pickle -*graalpython.lib-python.3.test.test_dataclasses.TestSlots.test_generated_slots -*graalpython.lib-python.3.test.test_dataclasses.TestSlots.test_generated_slots_value -*graalpython.lib-python.3.test.test_dataclasses.TestSlots.test_returns_new_class -*graalpython.lib-python.3.test.test_dataclasses.TestSlots.test_simple -*graalpython.lib-python.3.test.test_dataclasses.TestSlots.test_slots_with_default_factory_no_init -*graalpython.lib-python.3.test.test_dataclasses.TestSlots.test_slots_with_default_no_init -*graalpython.lib-python.3.test.test_dataclasses.TestStringAnnotations.test_classvar -*graalpython.lib-python.3.test.test_dataclasses.TestStringAnnotations.test_classvar_module_level_import -*graalpython.lib-python.3.test.test_dataclasses.TestStringAnnotations.test_initvar -*graalpython.lib-python.3.test.test_dataclasses.TestStringAnnotations.test_isnt_classvar -*graalpython.lib-python.3.test.test_dataclasses.TestStringAnnotations.test_isnt_initvar -*graalpython.lib-python.3.test.test_dataclasses.TestStringAnnotations.test_text_annotations -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestAbstract.test_abc_implementation -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestAbstract.test_maintain_abc -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_0_field_compare -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_1_field_compare -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_alternate_classmethod_constructor -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_class_attrs -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_class_marker -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_class_var -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_class_var_default_factory -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_class_var_frozen -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_class_var_no_default -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_class_var_with_default -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_classvar_default_factory -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_clean_traceback_from_fields_exception -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_compare_subclasses -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_dataclasses_pickleable -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_dataclasses_qualnames -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_default_factory -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_default_factory_derived -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_default_factory_not_called_if_value_given -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_default_factory_with_no_init -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_deliberately_mutable_defaults -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_disallowed_mutable_defaults -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_dont_include_other_annotations -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_dynamic_class_creation -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_dynamic_class_creation_using_field -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_eq_order -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_field_default -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_field_default_default_factory_error -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_field_metadata_custom_mapping -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_field_metadata_default -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_field_metadata_mapping -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_field_named_BUILTINS_frozen -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_field_named_like_builtin -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_field_named_like_builtin_frozen -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_field_named_object -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_field_named_object_frozen -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_field_named_self -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_field_no_default -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_field_order -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_field_recursive_repr -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_field_repr -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_function_annotations -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_generic_dataclasses -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_generic_dynamic -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_generic_extending -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_hash_field_rules -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_asdict -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_asdict_builtin_containers -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_asdict_builtin_object_containers -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_asdict_copy_values -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_asdict_factory -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_asdict_namedtuple -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_asdict_namedtuple_derived -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_asdict_namedtuple_key -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_asdict_nested -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_asdict_raises_on_classes -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_astuple -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_astuple_builtin_containers -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_astuple_builtin_object_containers -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_astuple_copy_values -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_astuple_factory -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_astuple_namedtuple -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_astuple_nested -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_astuple_raises_on_classes -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_fields_exception -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_helper_fields_with_class_instance -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_init_false_no_default -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_init_in_order -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_init_var -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_init_var_default_factory -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_init_var_inheritance -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_init_var_no_default -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_init_var_preserve_type -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_init_var_with_default -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_intermediate_non_dataclass -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_is_dataclass -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_is_dataclass_genericalias -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_is_dataclass_when_getattr_always_returns -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_items_in_dicts -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_missing_default -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_missing_default_factory -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_missing_repr -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_named_init_params -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_no_fields -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_no_fields_but_member_variable -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_no_options -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_no_unhashable_default -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_not_in_compare -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_not_in_repr -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_not_other_dataclass -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_not_tuple -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_one_field_no_default -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_overwrite_fields_in_derived_class -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_overwrite_hash -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_post_init -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_post_init_classmethod -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_post_init_not_auto_added -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_post_init_staticmethod -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_post_init_super -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_recursive_annotation -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_simple_compare -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestCase.test_two_fields_one_default -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDescriptors.test_default_value -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDescriptors.test_getting_field_calls_get -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDescriptors.test_init_calls_set -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDescriptors.test_lookup_on_class -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDescriptors.test_lookup_on_instance -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDescriptors.test_no_default_value -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDescriptors.test_non_descriptor -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDescriptors.test_set_name -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDescriptors.test_setting_field_calls_set -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDescriptors.test_setting_uninitialized_descriptor_field -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDocString.test_docstring_list_field -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDocString.test_docstring_list_field_with_default_factory -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDocString.test_docstring_no_fields -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDocString.test_docstring_one_field -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDocString.test_docstring_one_field_with_default -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDocString.test_docstring_one_field_with_default_none -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDocString.test_docstring_three_fields -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDocString.test_docstring_two_fields -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestDocString.test_existing_docstring_not_overridden -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestEq.test_no_eq -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestEq.test_overwriting_eq -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestFieldNoAnnotation.test_field_without_annotation -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestFieldNoAnnotation.test_field_without_annotation_but_annotation_in_base -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestFieldNoAnnotation.test_field_without_annotation_but_annotation_in_base_not_dataclass -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestFrozen.test_frozen -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestFrozen.test_frozen_hash -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestFrozen.test_inherit -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestFrozen.test_inherit_from_normal_class -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestFrozen.test_inherit_frozen_from_nonfrozen -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestFrozen.test_inherit_nonfrozen_from_empty -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestFrozen.test_inherit_nonfrozen_from_empty_frozen -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestFrozen.test_inherit_nonfrozen_from_frozen -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestFrozen.test_non_frozen_normal_derived -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestFrozen.test_overwriting_frozen -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestHash.test_0_field_hash -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestHash.test_1_field_hash -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestHash.test_eq_only -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestHash.test_hash_no_args -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestHash.test_hash_rules -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestHash.test_unsafe_hash -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestInit.test_base_has_init -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestInit.test_inherit_from_protocol -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestInit.test_no_init -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestInit.test_overwriting_init -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestKeywordArgs.test_KW_ONLY -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestKeywordArgs.test_KW_ONLY_as_string -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestKeywordArgs.test_KW_ONLY_twice -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestKeywordArgs.test_defaults -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestKeywordArgs.test_field_marked_as_kwonly -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestKeywordArgs.test_make_dataclass -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestKeywordArgs.test_match_args -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestKeywordArgs.test_no_classvar_kwarg -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestKeywordArgs.test_post_init -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMakeDataclass.test_base -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMakeDataclass.test_base_dataclass -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMakeDataclass.test_class_var -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMakeDataclass.test_duplicate_field_names -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMakeDataclass.test_funny_class_names_names -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMakeDataclass.test_init_var -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMakeDataclass.test_invalid_type_specification -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMakeDataclass.test_keyword_field_names -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMakeDataclass.test_no_mutate_namespace -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMakeDataclass.test_no_types -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMakeDataclass.test_non_identifier_field_names -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMakeDataclass.test_other_params -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMakeDataclass.test_simple -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMakeDataclass.test_underscore_field_names -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMatchArgs.test_bpo_43764 -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMatchArgs.test_explicit_match_args -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMatchArgs.test_make_dataclasses -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMatchArgs.test_match_args -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestMatchArgs.test_match_args_argument -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestOrdering.test_functools_total_ordering -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestOrdering.test_no_order -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestOrdering.test_overwriting_order -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestReplace.test -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestReplace.test_classvar -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestReplace.test_frozen -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestReplace.test_initvar_is_specified -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestReplace.test_initvar_with_default_value -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestReplace.test_invalid_field_name -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestReplace.test_invalid_object -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestReplace.test_no_init -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestReplace.test_recursive_repr -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestReplace.test_recursive_repr_indirection -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestReplace.test_recursive_repr_indirection_two -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestReplace.test_recursive_repr_misc_attrs -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestReplace.test_recursive_repr_two_attrs -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestRepr.test_no_repr -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestRepr.test_overwriting_repr -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestRepr.test_repr -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestSlots.test_add_slots_when_slots_exists -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestSlots.test_derived_added_field -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestSlots.test_frozen_pickle -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestSlots.test_frozen_slots_pickle_custom_state -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestSlots.test_generated_slots -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestSlots.test_generated_slots_value -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestSlots.test_returns_new_class -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestSlots.test_simple -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestSlots.test_slots_weakref_base_str -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestSlots.test_slots_weakref_base_tuple -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestSlots.test_slots_with_default_factory_no_init -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestSlots.test_slots_with_default_no_init -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestSlots.test_weakref_slot_make_dataclass -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestSlots.test_weakref_slot_without_slot -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestStringAnnotations.test_classvar -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestStringAnnotations.test_classvar_module_level_import -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestStringAnnotations.test_initvar -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestStringAnnotations.test_isnt_classvar -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestStringAnnotations.test_isnt_initvar -*graalpython.lib-python.3.test.test_dataclasses.__init__.TestStringAnnotations.test_text_annotations +test.test_dataclasses.TestAbstract.test_abc_implementation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestAbstract.test_maintain_abc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_0_field_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_1_field_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_alternate_classmethod_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_class_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_class_marker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_class_var @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_class_var_default_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_class_var_frozen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_class_var_no_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_class_var_with_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_classvar_default_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_clean_traceback_from_fields_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_compare_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_dataclasses_pickleable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_dataclasses_qualnames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_default_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_default_factory_derived @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_default_factory_not_called_if_value_given @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_default_factory_with_no_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_deliberately_mutable_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_disallowed_mutable_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_dont_include_other_annotations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_dynamic_class_creation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_dynamic_class_creation_using_field @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_eq_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_field_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_field_default_default_factory_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_field_metadata_custom_mapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_field_metadata_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_field_metadata_mapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_field_named_BUILTINS_frozen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_field_named_like_builtin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_field_named_like_builtin_frozen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_field_named_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_field_named_object_frozen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_field_named_self @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_field_no_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_field_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_field_recursive_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_field_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_function_annotations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_generic_dataclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_generic_dynamic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_generic_extending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_hash_field_rules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_asdict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_asdict_builtin_containers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_asdict_builtin_object_containers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_asdict_copy_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_asdict_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_asdict_namedtuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_asdict_namedtuple_derived @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_asdict_namedtuple_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_asdict_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_asdict_raises_on_classes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_astuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_astuple_builtin_containers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_astuple_builtin_object_containers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_astuple_copy_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_astuple_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_astuple_namedtuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_astuple_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_astuple_raises_on_classes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_fields_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_helper_fields_with_class_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_init_false_no_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_init_in_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_init_var @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_init_var_default_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_init_var_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_init_var_no_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_init_var_preserve_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_init_var_with_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_intermediate_non_dataclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_is_dataclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_is_dataclass_genericalias @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_is_dataclass_when_getattr_always_returns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_items_in_dicts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_missing_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_missing_default_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_missing_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_named_init_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_no_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_no_fields_but_member_variable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_no_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_no_unhashable_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_not_in_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_not_in_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_not_other_dataclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_not_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_one_field_no_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_overwrite_fields_in_derived_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_overwrite_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_post_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_post_init_classmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_post_init_not_auto_added @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_post_init_staticmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_post_init_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_recursive_annotation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_simple_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestCase.test_two_fields_one_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDescriptors.test_default_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDescriptors.test_getting_field_calls_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDescriptors.test_init_calls_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDescriptors.test_lookup_on_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDescriptors.test_lookup_on_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDescriptors.test_no_default_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDescriptors.test_non_descriptor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDescriptors.test_set_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDescriptors.test_setting_field_calls_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDescriptors.test_setting_uninitialized_descriptor_field @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDocString.test_docstring_list_field @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDocString.test_docstring_list_field_with_default_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDocString.test_docstring_no_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDocString.test_docstring_one_field @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDocString.test_docstring_one_field_with_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDocString.test_docstring_one_field_with_default_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDocString.test_docstring_three_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDocString.test_docstring_two_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestDocString.test_existing_docstring_not_overridden @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestEq.test_no_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestEq.test_overwriting_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestFieldNoAnnotation.test_field_without_annotation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestFieldNoAnnotation.test_field_without_annotation_but_annotation_in_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestFieldNoAnnotation.test_field_without_annotation_but_annotation_in_base_not_dataclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestFrozen.test_frozen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestFrozen.test_frozen_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestFrozen.test_inherit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestFrozen.test_inherit_from_normal_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestFrozen.test_inherit_frozen_from_nonfrozen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestFrozen.test_inherit_nonfrozen_from_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestFrozen.test_inherit_nonfrozen_from_empty_frozen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestFrozen.test_inherit_nonfrozen_from_frozen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestFrozen.test_non_frozen_normal_derived @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestFrozen.test_overwriting_frozen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestHash.test_0_field_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestHash.test_1_field_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestHash.test_eq_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestHash.test_hash_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestHash.test_hash_rules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestHash.test_unsafe_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestInit.test_base_has_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestInit.test_inherit_from_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestInit.test_no_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestInit.test_overwriting_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestKeywordArgs.test_KW_ONLY @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestKeywordArgs.test_KW_ONLY_as_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestKeywordArgs.test_KW_ONLY_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestKeywordArgs.test_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestKeywordArgs.test_field_marked_as_kwonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestKeywordArgs.test_make_dataclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestKeywordArgs.test_match_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestKeywordArgs.test_no_classvar_kwarg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestKeywordArgs.test_post_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMakeDataclass.test_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMakeDataclass.test_base_dataclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMakeDataclass.test_class_var @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMakeDataclass.test_duplicate_field_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMakeDataclass.test_funny_class_names_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMakeDataclass.test_init_var @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMakeDataclass.test_invalid_type_specification @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMakeDataclass.test_keyword_field_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMakeDataclass.test_no_mutate_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMakeDataclass.test_no_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMakeDataclass.test_non_identifier_field_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMakeDataclass.test_other_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMakeDataclass.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMakeDataclass.test_underscore_field_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMatchArgs.test_bpo_43764 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMatchArgs.test_explicit_match_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMatchArgs.test_make_dataclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMatchArgs.test_match_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestMatchArgs.test_match_args_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestOrdering.test_functools_total_ordering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestOrdering.test_no_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestOrdering.test_overwriting_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestReplace.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestReplace.test_classvar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestReplace.test_frozen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestReplace.test_initvar_is_specified @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestReplace.test_initvar_with_default_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestReplace.test_invalid_field_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestReplace.test_invalid_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestReplace.test_no_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestReplace.test_recursive_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestReplace.test_recursive_repr_indirection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestReplace.test_recursive_repr_indirection_two @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestReplace.test_recursive_repr_misc_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestReplace.test_recursive_repr_two_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestRepr.test_no_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestRepr.test_overwriting_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestRepr.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestSlots.test_add_slots_when_slots_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestSlots.test_derived_added_field @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestSlots.test_frozen_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestSlots.test_frozen_slots_pickle_custom_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestSlots.test_generated_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestSlots.test_generated_slots_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestSlots.test_returns_new_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestSlots.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestSlots.test_slots_weakref_base_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestSlots.test_slots_weakref_base_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestSlots.test_slots_with_default_factory_no_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestSlots.test_slots_with_default_no_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestSlots.test_weakref_slot_make_dataclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestSlots.test_weakref_slot_without_slot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestStringAnnotations.test_classvar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestStringAnnotations.test_classvar_module_level_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestStringAnnotations.test_initvar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestStringAnnotations.test_isnt_classvar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestStringAnnotations.test_isnt_initvar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dataclasses.TestStringAnnotations.test_text_annotations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dbm.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dbm.txt index 0733282868..066b79a7ab 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dbm.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dbm.txt @@ -1,25 +1,14 @@ -*graalpython.lib-python.3.test.test_dbm.TestCase-dbm.dumb.test_anydbm_access -*graalpython.lib-python.3.test.test_dbm.TestCase-dbm.dumb.test_anydbm_creation -*graalpython.lib-python.3.test.test_dbm.TestCase-dbm.dumb.test_anydbm_creation_n_file_exists_with_invalid_contents -*graalpython.lib-python.3.test.test_dbm.TestCase-dbm.dumb.test_anydbm_keys -*graalpython.lib-python.3.test.test_dbm.TestCase-dbm.dumb.test_anydbm_modification -*graalpython.lib-python.3.test.test_dbm.TestCase-dbm.dumb.test_anydbm_not_existing -*graalpython.lib-python.3.test.test_dbm.TestCase-dbm.dumb.test_anydbm_read -*graalpython.lib-python.3.test.test_dbm.TestCase-dbm.dumb.test_empty_value -*graalpython.lib-python.3.test.test_dbm.TestCase-dbm.dumb.test_error -*graalpython.lib-python.3.test.test_dbm.TestCase_dumb.test_anydbm_access -*graalpython.lib-python.3.test.test_dbm.TestCase_dumb.test_anydbm_creation -*graalpython.lib-python.3.test.test_dbm.TestCase_dumb.test_anydbm_creation_n_file_exists_with_invalid_contents -*graalpython.lib-python.3.test.test_dbm.TestCase_dumb.test_anydbm_keys -*graalpython.lib-python.3.test.test_dbm.TestCase_dumb.test_anydbm_modification -*graalpython.lib-python.3.test.test_dbm.TestCase_dumb.test_anydbm_not_existing -*graalpython.lib-python.3.test.test_dbm.TestCase_dumb.test_anydbm_read -*graalpython.lib-python.3.test.test_dbm.TestCase_dumb.test_empty_value -*graalpython.lib-python.3.test.test_dbm.TestCase_dumb.test_error -*graalpython.lib-python.3.test.test_dbm.TestCase_dumb.test_keys -*graalpython.lib-python.3.test.test_dbm.TestCase_dumb.test_open_with_bytes -*graalpython.lib-python.3.test.test_dbm.TestCase_dumb.test_open_with_pathlib_path -*graalpython.lib-python.3.test.test_dbm.TestCase_dumb.test_open_with_pathlib_path_bytes -*graalpython.lib-python.3.test.test_dbm.WhichDBTestCase.test_keys -*graalpython.lib-python.3.test.test_dbm.WhichDBTestCase.test_whichdb -*graalpython.lib-python.3.test.test_dbm.WhichDBTestCase.test_whichdb_ndbm +test.test_dbm.TestCase_dumb.test_anydbm_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm.TestCase_dumb.test_anydbm_creation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm.TestCase_dumb.test_anydbm_creation_n_file_exists_with_invalid_contents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm.TestCase_dumb.test_anydbm_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm.TestCase_dumb.test_anydbm_modification @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm.TestCase_dumb.test_anydbm_not_existing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm.TestCase_dumb.test_anydbm_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm.TestCase_dumb.test_empty_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm.TestCase_dumb.test_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm.TestCase_dumb.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm.TestCase_dumb.test_open_with_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm.TestCase_dumb.test_open_with_pathlib_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm.TestCase_dumb.test_open_with_pathlib_path_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm.WhichDBTestCase.test_whichdb @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dbm_dumb.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dbm_dumb.txt index 17418c09b1..92010476f6 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dbm_dumb.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dbm_dumb.txt @@ -1,24 +1,24 @@ -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_check_closed -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_close_twice -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_context_manager -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_create_new -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_dumbdbm_creation -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_dumbdbm_creation_mode -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_dumbdbm_keys -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_dumbdbm_modification -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_dumbdbm_read -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_eval -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_invalid_flag -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_line_endings -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_missing_data -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_missing_index -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_nonascii_filename -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_open_with_bytes_path -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_open_with_pathlib_bytes_path -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_open_with_pathlib_path -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_random -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_readonly_files -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_str_read -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_str_write_contains -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_write_contains -*graalpython.lib-python.3.test.test_dbm_dumb.DumbDBMTestCase.test_write_write_read +test.test_dbm_dumb.DumbDBMTestCase.test_check_closed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_close_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_create_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_dumbdbm_creation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_dumbdbm_creation_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_dumbdbm_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_dumbdbm_modification @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_dumbdbm_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_eval @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_invalid_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_line_endings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_missing_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_missing_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_nonascii_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_open_with_bytes_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_open_with_pathlib_bytes_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_open_with_pathlib_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_random @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_readonly_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_str_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_str_write_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_write_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dbm_dumb.DumbDBMTestCase.test_write_write_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_decimal.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_decimal.txt index 4ee1763765..42758b8fe2 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_decimal.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_decimal.txt @@ -1,502 +1,372 @@ -*graalpython.lib-python.3.test.test_decimal.CArithmeticOperatorsTest.test_addition -*graalpython.lib-python.3.test.test_decimal.CArithmeticOperatorsTest.test_copy_sign -*graalpython.lib-python.3.test.test_decimal.CArithmeticOperatorsTest.test_division -*graalpython.lib-python.3.test.test_decimal.CArithmeticOperatorsTest.test_floor_div_module -*graalpython.lib-python.3.test.test_decimal.CArithmeticOperatorsTest.test_floor_division -*graalpython.lib-python.3.test.test_decimal.CArithmeticOperatorsTest.test_module -*graalpython.lib-python.3.test.test_decimal.CArithmeticOperatorsTest.test_multiplication -*graalpython.lib-python.3.test.test_decimal.CArithmeticOperatorsTest.test_nan_comparisons -*graalpython.lib-python.3.test.test_decimal.CArithmeticOperatorsTest.test_powering -*graalpython.lib-python.3.test.test_decimal.CArithmeticOperatorsTest.test_subtraction -*graalpython.lib-python.3.test.test_decimal.CArithmeticOperatorsTest.test_unary_operators -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test__clamp -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_abs -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_add -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_compare -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_compare_signal -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_compare_total -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_compare_total_mag -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_copy -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_copy_abs -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_copy_decimal -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_copy_negate -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_copy_sign -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_divide -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_divide_int -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_divmod -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_equality_with_other_types -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_exp -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_fma -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_from_legacy_strings -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_is_finite -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_is_infinite -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_is_nan -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_is_normal -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_is_qnan -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_is_signed -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_is_snan -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_is_subnormal -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_is_zero -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_ln -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_log10 -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_logb -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_logical_and -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_logical_invert -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_logical_or -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_logical_xor -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_max -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_max_mag -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_min -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_min_mag -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_minus -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_multiply -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_next_minus -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_next_plus -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_next_toward -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_none_args -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_normalize -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_number_class -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_pickle -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_plus -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_power -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_quantize -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_remainder -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_remainder_near -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_rotate -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_same_quantum -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_scaleb -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_shift -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_sqrt -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_subtract -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_to_eng_string -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_to_integral_exact -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_to_integral_value -*graalpython.lib-python.3.test.test_decimal.CContextAPItests.test_to_sci_string -*graalpython.lib-python.3.test.test_decimal.CContextFlags.test_flag_comparisons -*graalpython.lib-python.3.test.test_decimal.CContextFlags.test_flags_irrelevant -*graalpython.lib-python.3.test.test_decimal.CContextFlags.test_float_comparison -*graalpython.lib-python.3.test.test_decimal.CContextFlags.test_float_operation -*graalpython.lib-python.3.test.test_decimal.CContextFlags.test_float_operation_default -*graalpython.lib-python.3.test.test_decimal.CContextInputValidation.test_invalid_context -*graalpython.lib-python.3.test.test_decimal.CContextSubclassing.test_context_subclassing -*graalpython.lib-python.3.test.test_decimal.CContextWithStatement.test_local_context_kwargs_does_not_overwrite_existing_argument -*graalpython.lib-python.3.test.test_decimal.CContextWithStatement.test_localcontext -*graalpython.lib-python.3.test.test_decimal.CContextWithStatement.test_localcontext_kwargs -*graalpython.lib-python.3.test.test_decimal.CContextWithStatement.test_localcontextarg -*graalpython.lib-python.3.test.test_decimal.CContextWithStatement.test_nested_with_statements -*graalpython.lib-python.3.test.test_decimal.CContextWithStatement.test_with_statements_gc1 -*graalpython.lib-python.3.test.test_decimal.CContextWithStatement.test_with_statements_gc2 -*graalpython.lib-python.3.test.test_decimal.CContextWithStatement.test_with_statements_gc3 -*graalpython.lib-python.3.test.test_decimal.CCoverage.test_adjusted -*graalpython.lib-python.3.test.test_decimal.CCoverage.test_canonical -*graalpython.lib-python.3.test.test_decimal.CCoverage.test_context_repr -*graalpython.lib-python.3.test.test_decimal.CCoverage.test_copy -*graalpython.lib-python.3.test.test_decimal.CCoverage.test_create_decimal -*graalpython.lib-python.3.test.test_decimal.CCoverage.test_divmod -*graalpython.lib-python.3.test.test_decimal.CCoverage.test_implicit_context -*graalpython.lib-python.3.test.test_decimal.CCoverage.test_int -*graalpython.lib-python.3.test.test_decimal.CCoverage.test_power -*graalpython.lib-python.3.test.test_decimal.CCoverage.test_quantize -*graalpython.lib-python.3.test.test_decimal.CCoverage.test_radix -*graalpython.lib-python.3.test.test_decimal.CCoverage.test_rop -*graalpython.lib-python.3.test.test_decimal.CCoverage.test_round -*graalpython.lib-python.3.test.test_decimal.CExplicitConstructionTest.test_explicit_context_create_decimal -*graalpython.lib-python.3.test.test_decimal.CExplicitConstructionTest.test_explicit_context_create_from_float -*graalpython.lib-python.3.test.test_decimal.CExplicitConstructionTest.test_explicit_empty -*graalpython.lib-python.3.test.test_decimal.CExplicitConstructionTest.test_explicit_from_Decimal -*graalpython.lib-python.3.test.test_decimal.CExplicitConstructionTest.test_explicit_from_None -*graalpython.lib-python.3.test.test_decimal.CExplicitConstructionTest.test_explicit_from_bool -*graalpython.lib-python.3.test.test_decimal.CExplicitConstructionTest.test_explicit_from_float -*graalpython.lib-python.3.test.test_decimal.CExplicitConstructionTest.test_explicit_from_int -*graalpython.lib-python.3.test.test_decimal.CExplicitConstructionTest.test_explicit_from_list -*graalpython.lib-python.3.test.test_decimal.CExplicitConstructionTest.test_explicit_from_string -*graalpython.lib-python.3.test.test_decimal.CExplicitConstructionTest.test_explicit_from_tuples -*graalpython.lib-python.3.test.test_decimal.CExplicitConstructionTest.test_from_legacy_strings -*graalpython.lib-python.3.test.test_decimal.CExplicitConstructionTest.test_unicode_digits -*graalpython.lib-python.3.test.test_decimal.CFormatTest.test_decimal_from_float_argument_type -*graalpython.lib-python.3.test.test_decimal.CFormatTest.test_formatting -*graalpython.lib-python.3.test.test_decimal.CFormatTest.test_n_format -*graalpython.lib-python.3.test.test_decimal.CFormatTest.test_negative_zero_bad_format -*graalpython.lib-python.3.test.test_decimal.CFormatTest.test_negative_zero_format_directed_rounding -*graalpython.lib-python.3.test.test_decimal.CFormatTest.test_wide_char_separator_decimal_point -*graalpython.lib-python.3.test.test_decimal.CFunctionality.test_c_context -*graalpython.lib-python.3.test.test_decimal.CFunctionality.test_c_ieee_context -*graalpython.lib-python.3.test.test_decimal.CFunctionality.test_constants -*graalpython.lib-python.3.test.test_decimal.CImplicitConstructionTest.test_implicit_from_Decimal -*graalpython.lib-python.3.test.test_decimal.CImplicitConstructionTest.test_implicit_from_None -*graalpython.lib-python.3.test.test_decimal.CImplicitConstructionTest.test_implicit_from_float -*graalpython.lib-python.3.test.test_decimal.CImplicitConstructionTest.test_implicit_from_int -*graalpython.lib-python.3.test.test_decimal.CImplicitConstructionTest.test_implicit_from_string -*graalpython.lib-python.3.test.test_decimal.CImplicitConstructionTest.test_rop -*graalpython.lib-python.3.test.test_decimal.CPythonAPItests.test_abc -*graalpython.lib-python.3.test.test_decimal.CPythonAPItests.test_complex -*graalpython.lib-python.3.test.test_decimal.CPythonAPItests.test_create_decimal_from_float -*graalpython.lib-python.3.test.test_decimal.CPythonAPItests.test_exception_hierarchy -*graalpython.lib-python.3.test.test_decimal.CPythonAPItests.test_from_float -*graalpython.lib-python.3.test.test_decimal.CPythonAPItests.test_int -*graalpython.lib-python.3.test.test_decimal.CPythonAPItests.test_named_parameters -*graalpython.lib-python.3.test.test_decimal.CPythonAPItests.test_pickle -*graalpython.lib-python.3.test.test_decimal.CPythonAPItests.test_quantize -*graalpython.lib-python.3.test.test_decimal.CPythonAPItests.test_small_ints -*graalpython.lib-python.3.test.test_decimal.CPythonAPItests.test_trunc -*graalpython.lib-python.3.test.test_decimal.CSpecialContexts.test_context_templates -*graalpython.lib-python.3.test.test_decimal.CSpecialContexts.test_default_context -*graalpython.lib-python.3.test.test_decimal.CThreadingTest.test_threading -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_as_integer_ratio -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_as_nonzero -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_as_tuple -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_comparison_operators -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_conversions_from_int -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_copy_and_deepcopy_methods -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_decimal_complex_comparison -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_decimal_float_comparison -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_decimal_fraction_comparison -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_eval_round_trip -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_hash_method -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_hash_method_nan -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_implicit_context -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_min_and_max_methods -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_nan_to_float -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_none_args -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_snan_to_float -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_subclassing -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_tonum_methods -*graalpython.lib-python.3.test.test_decimal.CUsabilityTest.test_tostring_methods -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_bignum -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_c_context_errors -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_c_context_errors_extra -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_c_context_repr -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_c_context_templates -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_c_format -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_c_funcs -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_c_input_restriction -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_c_integral -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_c_round -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_c_signal_dict -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_c_signaldict_segfault -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_c_valid_context -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_c_valid_context_extra -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_exact_conversion -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_from_tuple -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_internal_use_of_overridden_methods -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_invalid_construction -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_invalid_override -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_maxcontext_exact_arith -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_rounding_strings_interned -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_sizeof -*graalpython.lib-python.3.test.test_decimal.CWhitebox.test_va_args_exceptions -*graalpython.lib-python.3.test.test_decimal.CheckAttributes.test_context_attributes -*graalpython.lib-python.3.test.test_decimal.CheckAttributes.test_decimal_attributes -*graalpython.lib-python.3.test.test_decimal.CheckAttributes.test_module_attributes -*graalpython.lib-python.3.test.test_decimal.PyArithmeticOperatorsTest.test_addition -*graalpython.lib-python.3.test.test_decimal.PyArithmeticOperatorsTest.test_copy_sign -*graalpython.lib-python.3.test.test_decimal.PyArithmeticOperatorsTest.test_division -*graalpython.lib-python.3.test.test_decimal.PyArithmeticOperatorsTest.test_floor_div_module -*graalpython.lib-python.3.test.test_decimal.PyArithmeticOperatorsTest.test_floor_division -*graalpython.lib-python.3.test.test_decimal.PyArithmeticOperatorsTest.test_module -*graalpython.lib-python.3.test.test_decimal.PyArithmeticOperatorsTest.test_multiplication -*graalpython.lib-python.3.test.test_decimal.PyArithmeticOperatorsTest.test_nan_comparisons -*graalpython.lib-python.3.test.test_decimal.PyArithmeticOperatorsTest.test_powering -*graalpython.lib-python.3.test.test_decimal.PyArithmeticOperatorsTest.test_subtraction -*graalpython.lib-python.3.test.test_decimal.PyArithmeticOperatorsTest.test_unary_operators -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test__clamp -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_abs -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_add -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_compare -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_compare_signal -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_compare_total -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_compare_total_mag -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_copy -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_copy_abs -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_copy_decimal -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_copy_negate -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_copy_sign -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_divide -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_divide_int -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_divmod -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_equality_with_other_types -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_exp -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_fma -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_from_legacy_strings -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_is_finite -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_is_infinite -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_is_nan -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_is_normal -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_is_qnan -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_is_signed -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_is_snan -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_is_subnormal -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_is_zero -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_ln -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_log10 -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_logb -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_logical_and -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_logical_invert -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_logical_or -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_logical_xor -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_max -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_max_mag -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_min -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_min_mag -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_minus -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_multiply -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_next_minus -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_next_plus -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_next_toward -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_none_args -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_normalize -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_number_class -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_pickle -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_plus -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_power -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_quantize -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_remainder -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_remainder_near -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_rotate -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_same_quantum -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_scaleb -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_shift -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_sqrt -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_subtract -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_to_eng_string -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_to_integral_exact -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_to_integral_value -*graalpython.lib-python.3.test.test_decimal.PyContextAPItests.test_to_sci_string -*graalpython.lib-python.3.test.test_decimal.PyContextFlags.test_flag_comparisons -*graalpython.lib-python.3.test.test_decimal.PyContextFlags.test_flags_irrelevant -*graalpython.lib-python.3.test.test_decimal.PyContextFlags.test_float_comparison -*graalpython.lib-python.3.test.test_decimal.PyContextFlags.test_float_operation -*graalpython.lib-python.3.test.test_decimal.PyContextFlags.test_float_operation_default -*graalpython.lib-python.3.test.test_decimal.PyContextInputValidation.test_invalid_context -*graalpython.lib-python.3.test.test_decimal.PyContextSubclassing.test_context_subclassing -*graalpython.lib-python.3.test.test_decimal.PyContextWithStatement.test_local_context_kwargs_does_not_overwrite_existing_argument -*graalpython.lib-python.3.test.test_decimal.PyContextWithStatement.test_localcontext -*graalpython.lib-python.3.test.test_decimal.PyContextWithStatement.test_localcontext_kwargs -*graalpython.lib-python.3.test.test_decimal.PyContextWithStatement.test_localcontextarg -*graalpython.lib-python.3.test.test_decimal.PyContextWithStatement.test_nested_with_statements -*graalpython.lib-python.3.test.test_decimal.PyContextWithStatement.test_with_statements_gc1 -*graalpython.lib-python.3.test.test_decimal.PyContextWithStatement.test_with_statements_gc2 -*graalpython.lib-python.3.test.test_decimal.PyContextWithStatement.test_with_statements_gc3 -*graalpython.lib-python.3.test.test_decimal.PyCoverage.test_adjusted -*graalpython.lib-python.3.test.test_decimal.PyCoverage.test_canonical -*graalpython.lib-python.3.test.test_decimal.PyCoverage.test_context_repr -*graalpython.lib-python.3.test.test_decimal.PyCoverage.test_copy -*graalpython.lib-python.3.test.test_decimal.PyCoverage.test_create_decimal -*graalpython.lib-python.3.test.test_decimal.PyCoverage.test_divmod -*graalpython.lib-python.3.test.test_decimal.PyCoverage.test_implicit_context -*graalpython.lib-python.3.test.test_decimal.PyCoverage.test_int -*graalpython.lib-python.3.test.test_decimal.PyCoverage.test_power -*graalpython.lib-python.3.test.test_decimal.PyCoverage.test_quantize -*graalpython.lib-python.3.test.test_decimal.PyCoverage.test_radix -*graalpython.lib-python.3.test.test_decimal.PyCoverage.test_rop -*graalpython.lib-python.3.test.test_decimal.PyCoverage.test_round -*graalpython.lib-python.3.test.test_decimal.PyExplicitConstructionTest.test_explicit_context_create_decimal -*graalpython.lib-python.3.test.test_decimal.PyExplicitConstructionTest.test_explicit_context_create_from_float -*graalpython.lib-python.3.test.test_decimal.PyExplicitConstructionTest.test_explicit_empty -*graalpython.lib-python.3.test.test_decimal.PyExplicitConstructionTest.test_explicit_from_Decimal -*graalpython.lib-python.3.test.test_decimal.PyExplicitConstructionTest.test_explicit_from_None -*graalpython.lib-python.3.test.test_decimal.PyExplicitConstructionTest.test_explicit_from_bool -*graalpython.lib-python.3.test.test_decimal.PyExplicitConstructionTest.test_explicit_from_float -*graalpython.lib-python.3.test.test_decimal.PyExplicitConstructionTest.test_explicit_from_int -*graalpython.lib-python.3.test.test_decimal.PyExplicitConstructionTest.test_explicit_from_list -*graalpython.lib-python.3.test.test_decimal.PyExplicitConstructionTest.test_explicit_from_string -*graalpython.lib-python.3.test.test_decimal.PyExplicitConstructionTest.test_explicit_from_tuples -*graalpython.lib-python.3.test.test_decimal.PyExplicitConstructionTest.test_from_legacy_strings -*graalpython.lib-python.3.test.test_decimal.PyExplicitConstructionTest.test_unicode_digits -*graalpython.lib-python.3.test.test_decimal.PyFormatTest.test_decimal_from_float_argument_type -*graalpython.lib-python.3.test.test_decimal.PyFormatTest.test_formatting -*graalpython.lib-python.3.test.test_decimal.PyFormatTest.test_n_format -*graalpython.lib-python.3.test.test_decimal.PyFormatTest.test_negative_zero_bad_format -*graalpython.lib-python.3.test.test_decimal.PyFormatTest.test_negative_zero_format_directed_rounding -*graalpython.lib-python.3.test.test_decimal.PyFormatTest.test_wide_char_separator_decimal_point -*graalpython.lib-python.3.test.test_decimal.PyFunctionality.test_py_alternate_formatting -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_abs -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_add -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_and -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_base -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_clamp -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_class -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_compare -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_comparetotal -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_comparetotmag -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_copy -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_copyabs -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_copynegate -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_copysign -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddAbs -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddAdd -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddAnd -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddBase -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddCanonical -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddClass -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddCompare -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddCompareSig -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddCompareTotal -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddCompareTotalMag -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddCopy -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddCopyAbs -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddCopyNegate -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddCopySign -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddDivide -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddDivideInt -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddEncode -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddFMA -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddInvert -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddLogB -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddMax -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddMaxMag -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddMin -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddMinMag -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddMinus -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddMultiply -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddNextMinus -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddNextPlus -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddNextToward -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddOr -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddPlus -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddQuantize -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddReduce -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddRemainder -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddRemainderNear -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddRotate -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddSameQuantum -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddScaleB -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddShift -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddSubtract -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddToIntegral -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ddXor -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_decDouble -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_decQuad -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_decSingle -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_divide -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_divideint -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqAbs -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqAdd -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqAnd -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqBase -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqCanonical -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqClass -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqCompare -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqCompareSig -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqCompareTotal -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqCompareTotalMag -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqCopy -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqCopyAbs -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqCopyNegate -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqCopySign -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqDivide -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqDivideInt -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqEncode -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqFMA -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqInvert -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqLogB -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqMax -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqMaxMag -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqMin -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqMinMag -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqMinus -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqMultiply -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqNextMinus -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqNextPlus -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqNextToward -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqOr -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqPlus -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqQuantize -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqReduce -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqRemainder -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqRemainderNear -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqRotate -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqSameQuantum -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqScaleB -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqShift -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqSubtract -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqToIntegral -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dqXor -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dsBase -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_dsEncode -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_exp -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_extra -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_fma -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_inexact -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_invert -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_ln -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_log10 -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_logb -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_max -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_maxmag -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_min -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_minmag -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_minus -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_multiply -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_nextminus -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_nextplus -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_nexttoward -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_or -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_plus -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_power -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_powersqrt -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_quantize -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_randomBound32 -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_randoms -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_reduce -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_remainder -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_remainderNear -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_rescale -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_rotate -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_rounding -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_samequantum -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_scaleb -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_shift -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_squareroot -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_subtract -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_testall -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_tointegral -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_tointegralx -*graalpython.lib-python.3.test.test_decimal.PyIBMTestCases.test_xor -*graalpython.lib-python.3.test.test_decimal.PyImplicitConstructionTest.test_implicit_from_Decimal -*graalpython.lib-python.3.test.test_decimal.PyImplicitConstructionTest.test_implicit_from_None -*graalpython.lib-python.3.test.test_decimal.PyImplicitConstructionTest.test_implicit_from_float -*graalpython.lib-python.3.test.test_decimal.PyImplicitConstructionTest.test_implicit_from_int -*graalpython.lib-python.3.test.test_decimal.PyImplicitConstructionTest.test_implicit_from_string -*graalpython.lib-python.3.test.test_decimal.PyImplicitConstructionTest.test_rop -*graalpython.lib-python.3.test.test_decimal.PyPythonAPItests.test_abc -*graalpython.lib-python.3.test.test_decimal.PyPythonAPItests.test_complex -*graalpython.lib-python.3.test.test_decimal.PyPythonAPItests.test_create_decimal_from_float -*graalpython.lib-python.3.test.test_decimal.PyPythonAPItests.test_exception_hierarchy -*graalpython.lib-python.3.test.test_decimal.PyPythonAPItests.test_from_float -*graalpython.lib-python.3.test.test_decimal.PyPythonAPItests.test_int -*graalpython.lib-python.3.test.test_decimal.PyPythonAPItests.test_named_parameters -*graalpython.lib-python.3.test.test_decimal.PyPythonAPItests.test_pickle -*graalpython.lib-python.3.test.test_decimal.PyPythonAPItests.test_quantize -*graalpython.lib-python.3.test.test_decimal.PyPythonAPItests.test_small_ints -*graalpython.lib-python.3.test.test_decimal.PyPythonAPItests.test_trunc -*graalpython.lib-python.3.test.test_decimal.PySpecialContexts.test_context_templates -*graalpython.lib-python.3.test.test_decimal.PySpecialContexts.test_default_context -*graalpython.lib-python.3.test.test_decimal.PyThreadingTest.test_threading -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_as_integer_ratio -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_as_nonzero -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_as_tuple -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_comparison_operators -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_conversions_from_int -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_copy_and_deepcopy_methods -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_decimal_complex_comparison -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_decimal_float_comparison -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_decimal_fraction_comparison -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_eval_round_trip -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_hash_method -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_hash_method_nan -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_implicit_context -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_min_and_max_methods -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_nan_to_float -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_none_args -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_snan_to_float -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_subclassing -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_tonum_methods -*graalpython.lib-python.3.test.test_decimal.PyUsabilityTest.test_tostring_methods -*graalpython.lib-python.3.test.test_decimal.PyWhitebox.test_py__round -*graalpython.lib-python.3.test.test_decimal.PyWhitebox.test_py_decimal_id -*graalpython.lib-python.3.test.test_decimal.PyWhitebox.test_py_exact_power -*graalpython.lib-python.3.test.test_decimal.PyWhitebox.test_py_immutability_operations -*graalpython.lib-python.3.test.test_decimal.PyWhitebox.test_py_rescale -*graalpython.lib-python.3.test.test_decimal.SignatureTest.test_inspect_module -*graalpython.lib-python.3.test.test_decimal.SignatureTest.test_inspect_types +DocTestCase.decimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.abs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.canonical @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.compare_signal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.compare_total @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.copy_abs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.copy_decimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.copy_negate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.copy_sign @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.create_decimal_from_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.divide @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.divide_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.divmod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.exp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.fma @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.is_canonical @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.is_finite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.is_infinite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.is_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.is_normal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.is_qnan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.is_signed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.is_snan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.is_subnormal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.is_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.ln @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.log10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.logb @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.logical_and @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.logical_invert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.logical_or @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.logical_xor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.max @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.max_mag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.min @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.min_mag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.minus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.multiply @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.next_minus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.next_plus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.next_toward @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.normalize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.number_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.plus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.power @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.quantize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.radix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.remainder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.remainder_near @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.rotate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.same_quantum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.scaleb @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.shift @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.sqrt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.subtract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.to_eng_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.to_integral_exact @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Context.to_integral_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Decimal.__new__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Decimal.__round__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Decimal.as_integer_ratio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.Decimal.from_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.decimal.localcontext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyArithmeticOperatorsTest.test_addition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyArithmeticOperatorsTest.test_copy_sign @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyArithmeticOperatorsTest.test_division @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyArithmeticOperatorsTest.test_floor_div_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyArithmeticOperatorsTest.test_floor_division @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyArithmeticOperatorsTest.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyArithmeticOperatorsTest.test_multiplication @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyArithmeticOperatorsTest.test_nan_comparisons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyArithmeticOperatorsTest.test_powering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyArithmeticOperatorsTest.test_subtraction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyArithmeticOperatorsTest.test_unary_operators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test__clamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_abs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_compare_signal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_compare_total @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_compare_total_mag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_copy_abs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_copy_decimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_copy_negate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_copy_sign @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_divide @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_divide_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_divmod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_equality_with_other_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_exp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_fma @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_is_finite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_is_infinite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_is_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_is_normal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_is_qnan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_is_signed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_is_snan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_is_subnormal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_is_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_ln @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_log10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_logb @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_logical_and @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_logical_invert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_logical_or @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_logical_xor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_max @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_max_mag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_min @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_min_mag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_minus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_multiply @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_next_minus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_next_plus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_next_toward @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_none_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_normalize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_number_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_plus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_power @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_quantize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_remainder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_remainder_near @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_rotate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_same_quantum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_scaleb @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_shift @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_sqrt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_subtract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_to_eng_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_to_integral_exact @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_to_integral_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextAPItests.test_to_sci_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextFlags.test_flag_comparisons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextFlags.test_flags_irrelevant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextFlags.test_float_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextFlags.test_float_operation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextFlags.test_float_operation_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextInputValidation.test_invalid_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextSubclassing.test_context_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextWithStatement.test_local_context_kwargs_does_not_overwrite_existing_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextWithStatement.test_localcontext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextWithStatement.test_localcontext_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextWithStatement.test_localcontextarg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextWithStatement.test_nested_with_statements @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextWithStatement.test_with_statements_gc1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextWithStatement.test_with_statements_gc2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyContextWithStatement.test_with_statements_gc3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyCoverage.test_adjusted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyCoverage.test_canonical @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyCoverage.test_context_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyCoverage.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyCoverage.test_create_decimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyCoverage.test_divmod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyCoverage.test_implicit_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyCoverage.test_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyCoverage.test_power @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyCoverage.test_quantize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyCoverage.test_radix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyCoverage.test_rop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyCoverage.test_round @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_context_create_decimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_context_create_from_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_from_Decimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_from_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_from_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_from_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_from_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_from_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_from_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_from_tuples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyExplicitConstructionTest.test_unicode_digits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyFormatTest.test_decimal_from_float_argument_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyFormatTest.test_formatting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyFormatTest.test_n_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyFormatTest.test_negative_zero_bad_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyFormatTest.test_negative_zero_format_directed_rounding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyFormatTest.test_wide_char_separator_decimal_point @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyFunctionality.test_py_alternate_formatting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_abs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_and @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_clamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_comparetotal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_comparetotmag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_copyabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_copynegate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_copysign @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddAbs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddAdd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddAnd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddBase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddCanonical @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddClass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddCompare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddCompareSig @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddCompareTotal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddCompareTotalMag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddCopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddCopyAbs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddCopyNegate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddCopySign @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddDivide @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddDivideInt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddEncode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddFMA @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddInvert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddLogB @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddMax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddMaxMag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddMin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddMinMag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddMinus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddMultiply @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddNextMinus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddNextPlus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddNextToward @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddOr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddPlus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddQuantize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddReduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddRemainder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddRemainderNear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddRotate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddSameQuantum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddScaleB @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddShift @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddSubtract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddToIntegral @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ddXor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_decDouble @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_decQuad @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_decSingle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_divide @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_divideint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqAbs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqAdd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqAnd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqBase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqCanonical @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqClass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqCompare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqCompareSig @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqCompareTotal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqCompareTotalMag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqCopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqCopyAbs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqCopyNegate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqCopySign @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqDivide @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqDivideInt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqEncode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqFMA @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqInvert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqLogB @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqMax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqMaxMag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqMin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqMinMag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqMinus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqMultiply @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqNextMinus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqNextPlus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqNextToward @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqOr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqPlus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqQuantize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqReduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqRemainder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqRemainderNear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqRotate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqSameQuantum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqScaleB @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqShift @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqSubtract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqToIntegral @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dqXor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dsBase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_dsEncode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_exp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_extra @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_fma @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_inexact @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_invert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_ln @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_log10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_logb @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_max @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_maxmag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_min @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_minmag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_minus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_multiply @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_nextminus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_nextplus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_nexttoward @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_or @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_plus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_power @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_powersqrt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_quantize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_randomBound32 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_randoms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_remainder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_remainderNear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_rescale @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_rotate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_rounding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_samequantum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_scaleb @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_shift @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_squareroot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_subtract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_testall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_tointegral @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_tointegralx @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyIBMTestCases.test_xor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyImplicitConstructionTest.test_implicit_from_Decimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyImplicitConstructionTest.test_implicit_from_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyImplicitConstructionTest.test_implicit_from_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyImplicitConstructionTest.test_implicit_from_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyImplicitConstructionTest.test_implicit_from_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyImplicitConstructionTest.test_rop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyPythonAPItests.test_abc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyPythonAPItests.test_complex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyPythonAPItests.test_create_decimal_from_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyPythonAPItests.test_exception_hierarchy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyPythonAPItests.test_from_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyPythonAPItests.test_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyPythonAPItests.test_named_parameters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyPythonAPItests.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyPythonAPItests.test_quantize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyPythonAPItests.test_trunc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PySpecialContexts.test_context_templates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PySpecialContexts.test_default_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyThreadingTest.test_threading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_as_integer_ratio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_as_nonzero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_as_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_comparison_operators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_conversions_from_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_copy_and_deepcopy_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_decimal_complex_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_decimal_float_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_decimal_fraction_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_eval_round_trip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_hash_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_hash_method_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_implicit_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_min_and_max_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_nan_to_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_none_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_snan_to_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_tonum_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyUsabilityTest.test_tostring_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyWhitebox.test_py__round @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyWhitebox.test_py_decimal_id @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyWhitebox.test_py_exact_power @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyWhitebox.test_py_immutability_operations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decimal.PyWhitebox.test_py_rescale @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_decorators.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_decorators.txt index f1ad0942aa..7ea955fe0a 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_decorators.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_decorators.txt @@ -1,17 +1,16 @@ -*graalpython.lib-python.3.test.test_decorators.TestClassDecorators.test_double -*graalpython.lib-python.3.test.test_decorators.TestClassDecorators.test_order -*graalpython.lib-python.3.test.test_decorators.TestClassDecorators.test_simple -*graalpython.lib-python.3.test.test_decorators.TestDecorators.test_argforms -*graalpython.lib-python.3.test.test_decorators.TestDecorators.test_bound_function_inside_classmethod -*graalpython.lib-python.3.test.test_decorators.TestDecorators.test_dbcheck -*graalpython.lib-python.3.test.test_decorators.TestDecorators.test_dotted -*graalpython.lib-python.3.test.test_decorators.TestDecorators.test_double -*graalpython.lib-python.3.test.test_decorators.TestDecorators.test_errors -*graalpython.lib-python.3.test.test_decorators.TestDecorators.test_eval_order -*graalpython.lib-python.3.test.test_decorators.TestDecorators.test_expressions -*graalpython.lib-python.3.test.test_decorators.TestDecorators.test_memoize -*graalpython.lib-python.3.test.test_decorators.TestDecorators.test_order -*graalpython.lib-python.3.test.test_decorators.TestDecorators.test_single -*graalpython.lib-python.3.test.test_decorators.TestDecorators.test_staticmethod -*graalpython.lib-python.3.test.test_decorators.TestDecorators.test_staticmethod_function -*graalpython.lib-python.3.test.test_decorators.TestDecorators.test_wrapped_classmethod_inside_classmethod +test.test_decorators.TestClassDecorators.test_double @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decorators.TestClassDecorators.test_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decorators.TestClassDecorators.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decorators.TestDecorators.test_argforms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decorators.TestDecorators.test_bound_function_inside_classmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decorators.TestDecorators.test_dbcheck @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decorators.TestDecorators.test_dotted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decorators.TestDecorators.test_double @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decorators.TestDecorators.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decorators.TestDecorators.test_eval_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decorators.TestDecorators.test_expressions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decorators.TestDecorators.test_memoize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decorators.TestDecorators.test_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decorators.TestDecorators.test_single @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decorators.TestDecorators.test_staticmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_decorators.TestDecorators.test_wrapped_classmethod_inside_classmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_defaultdict.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_defaultdict.txt index 88b9d6e037..5ac6394f02 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_defaultdict.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_defaultdict.txt @@ -1,10 +1,10 @@ -*graalpython.lib-python.3.test.test_defaultdict.TestDefaultDict.test_basic -*graalpython.lib-python.3.test.test_defaultdict.TestDefaultDict.test_callable_arg -*graalpython.lib-python.3.test.test_defaultdict.TestDefaultDict.test_copy -*graalpython.lib-python.3.test.test_defaultdict.TestDefaultDict.test_deep_copy -*graalpython.lib-python.3.test.test_defaultdict.TestDefaultDict.test_keyerror_without_factory -*graalpython.lib-python.3.test.test_defaultdict.TestDefaultDict.test_missing -*graalpython.lib-python.3.test.test_defaultdict.TestDefaultDict.test_pickling -*graalpython.lib-python.3.test.test_defaultdict.TestDefaultDict.test_repr -*graalpython.lib-python.3.test.test_defaultdict.TestDefaultDict.test_shallow_copy -*graalpython.lib-python.3.test.test_defaultdict.TestDefaultDict.test_union +test.test_defaultdict.TestDefaultDict.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_defaultdict.TestDefaultDict.test_callable_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_defaultdict.TestDefaultDict.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_defaultdict.TestDefaultDict.test_deep_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_defaultdict.TestDefaultDict.test_keyerror_without_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_defaultdict.TestDefaultDict.test_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_defaultdict.TestDefaultDict.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_defaultdict.TestDefaultDict.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_defaultdict.TestDefaultDict.test_shallow_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_defaultdict.TestDefaultDict.test_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_deque.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_deque.txt index 00fd1bb0d6..f6d70e6a70 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_deque.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_deque.txt @@ -1,79 +1,73 @@ -*graalpython.lib-python.3.test.test_deque.TestBasic.test_add -*graalpython.lib-python.3.test.test_deque.TestBasic.test_basics -*graalpython.lib-python.3.test.test_deque.TestBasic.test_big_queue_popleft -*graalpython.lib-python.3.test.test_deque.TestBasic.test_big_queue_popright -*graalpython.lib-python.3.test.test_deque.TestBasic.test_big_stack_left -*graalpython.lib-python.3.test.test_deque.TestBasic.test_big_stack_right -*graalpython.lib-python.3.test.test_deque.TestBasic.test_clear -*graalpython.lib-python.3.test.test_deque.TestBasic.test_comparisons -*graalpython.lib-python.3.test.test_deque.TestBasic.test_contains -*graalpython.lib-python.3.test.test_deque.TestBasic.test_contains_count_stop_crashes -*graalpython.lib-python.3.test.test_deque.TestBasic.test_copy -*graalpython.lib-python.3.test.test_deque.TestBasic.test_copy_method -*graalpython.lib-python.3.test.test_deque.TestBasic.test_count -*graalpython.lib-python.3.test.test_deque.TestBasic.test_deepcopy -*graalpython.lib-python.3.test.test_deque.TestBasic.test_delitem -*graalpython.lib-python.3.test.test_deque.TestBasic.test_extend -*graalpython.lib-python.3.test.test_deque.TestBasic.test_extendleft -*graalpython.lib-python.3.test.test_deque.TestBasic.test_gc_doesnt_blowup -*graalpython.lib-python.3.test.test_deque.TestBasic.test_getitem -*graalpython.lib-python.3.test.test_deque.TestBasic.test_hash -*graalpython.lib-python.3.test.test_deque.TestBasic.test_iadd -*graalpython.lib-python.3.test.test_deque.TestBasic.test_imul -*graalpython.lib-python.3.test.test_deque.TestBasic.test_index -*graalpython.lib-python.3.test.test_deque.TestBasic.test_index_bug_24913 -*graalpython.lib-python.3.test.test_deque.TestBasic.test_init -*graalpython.lib-python.3.test.test_deque.TestBasic.test_insert -*graalpython.lib-python.3.test.test_deque.TestBasic.test_insert_bug_26194 -*graalpython.lib-python.3.test.test_deque.TestBasic.test_iterator_pickle -*graalpython.lib-python.3.test.test_deque.TestBasic.test_len -*graalpython.lib-python.3.test.test_deque.TestBasic.test_long_steadystate_queue_popleft -*graalpython.lib-python.3.test.test_deque.TestBasic.test_long_steadystate_queue_popright -*graalpython.lib-python.3.test.test_deque.TestBasic.test_maxlen -*graalpython.lib-python.3.test.test_deque.TestBasic.test_maxlen_attribute -*graalpython.lib-python.3.test.test_deque.TestBasic.test_maxlen_zero -*graalpython.lib-python.3.test.test_deque.TestBasic.test_mul -*graalpython.lib-python.3.test.test_deque.TestBasic.test_pickle -*graalpython.lib-python.3.test.test_deque.TestBasic.test_pickle_recursive -*graalpython.lib-python.3.test.test_deque.TestBasic.test_print -*graalpython.lib-python.3.test.test_deque.TestBasic.test_remove -*graalpython.lib-python.3.test.test_deque.TestBasic.test_repr -*graalpython.lib-python.3.test.test_deque.TestBasic.test_reverse -*graalpython.lib-python.3.test.test_deque.TestBasic.test_reversed -*graalpython.lib-python.3.test.test_deque.TestBasic.test_reversed_new -*graalpython.lib-python.3.test.test_deque.TestBasic.test_rotate -*graalpython.lib-python.3.test.test_deque.TestBasic.test_roundtrip_iter_init -*graalpython.lib-python.3.test.test_deque.TestBasic.test_setitem -*graalpython.lib-python.3.test.test_deque.TestBasic.test_sizeof -*graalpython.lib-python.3.test.test_deque.TestBasic.test_underflow -*graalpython.lib-python.3.test.test_deque.TestMain.test_main -*graalpython.lib-python.3.test.test_deque.TestSequence.test_addmul -*graalpython.lib-python.3.test.test_deque.TestSequence.test_bigrepeat -*graalpython.lib-python.3.test.test_deque.TestSequence.test_constructors -*graalpython.lib-python.3.test.test_deque.TestSequence.test_contains -*graalpython.lib-python.3.test.test_deque.TestSequence.test_contains_fake -*graalpython.lib-python.3.test.test_deque.TestSequence.test_contains_order -*graalpython.lib-python.3.test.test_deque.TestSequence.test_count -*graalpython.lib-python.3.test.test_deque.TestSequence.test_free_after_iterating -*graalpython.lib-python.3.test.test_deque.TestSequence.test_getitem -*graalpython.lib-python.3.test.test_deque.TestSequence.test_getitemoverwriteiter -*graalpython.lib-python.3.test.test_deque.TestSequence.test_getslice -*graalpython.lib-python.3.test.test_deque.TestSequence.test_iadd -*graalpython.lib-python.3.test.test_deque.TestSequence.test_imul -*graalpython.lib-python.3.test.test_deque.TestSequence.test_index -*graalpython.lib-python.3.test.test_deque.TestSequence.test_len -*graalpython.lib-python.3.test.test_deque.TestSequence.test_minmax -*graalpython.lib-python.3.test.test_deque.TestSequence.test_pickle -*graalpython.lib-python.3.test.test_deque.TestSequence.test_repeat -*graalpython.lib-python.3.test.test_deque.TestSequence.test_subscript -*graalpython.lib-python.3.test.test_deque.TestSequence.test_truth -*graalpython.lib-python.3.test.test_deque.TestSubclass.test_basics -*graalpython.lib-python.3.test.test_deque.TestSubclass.test_bug_31608 -*graalpython.lib-python.3.test.test_deque.TestSubclass.test_copy_pickle -*graalpython.lib-python.3.test.test_deque.TestSubclass.test_pickle_recursive -*graalpython.lib-python.3.test.test_deque.TestSubclass.test_strange_subclass -*graalpython.lib-python.3.test.test_deque.TestSubclass.test_weakref -*graalpython.lib-python.3.test.test_deque.TestSubclassWithKwargs.test_subclass_with_kwargs -*graalpython.lib-python.3.test.test_deque.TestVariousIteratorArgs.test_constructor -*graalpython.lib-python.3.test.test_deque.TestVariousIteratorArgs.test_iter_with_altered_data -*graalpython.lib-python.3.test.test_deque.TestVariousIteratorArgs.test_runtime_error_on_empty_deque +DocTestCase.test.test_deque.__test__.libreftest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_big_queue_popleft @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_big_queue_popright @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_big_stack_left @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_big_stack_right @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_comparisons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_contains_count_stop_crashes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_copy_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_extendleft @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_gc_doesnt_blowup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_iadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_imul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_index_bug_24913 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_insert_bug_26194 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_iterator_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_long_steadystate_queue_popleft @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_long_steadystate_queue_popright @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_maxlen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_maxlen_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_maxlen_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_pickle_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_reversed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_reversed_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_rotate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_roundtrip_iter_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestBasic.test_underflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSequence.test_addmul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSequence.test_constructors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSequence.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSequence.test_contains_fake @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSequence.test_contains_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSequence.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSequence.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSequence.test_getitemoverwriteiter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSequence.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSequence.test_iadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSequence.test_imul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSequence.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSequence.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSequence.test_minmax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSequence.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSequence.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSequence.test_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSequence.test_truth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSubclass.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSubclass.test_copy_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSubclass.test_pickle_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSubclass.test_strange_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestSubclassWithKwargs.test_subclass_with_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestVariousIteratorArgs.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestVariousIteratorArgs.test_iter_with_altered_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_deque.TestVariousIteratorArgs.test_runtime_error_on_empty_deque @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_descr.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_descr.txt index a2fe585e77..0e35caca5c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_descr.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_descr.txt @@ -1,140 +1,133 @@ -*graalpython.lib-python.3.test.test_descr.AAAPTypesLongInitTest.test_pytype_long_ready -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_abstractmethods -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_altmro -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_assign_slice -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_attr_raise_through_property -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_basic_inheritance -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_binary_operator_override -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_bound_method_repr -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_bpo25750 -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_buffer_inheritance -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_builtin_bases -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_builtin_function_or_method -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_carloverre -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_carloverre_multi_inherit_valid -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_classic -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_classic_comparisons -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_classmethods -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_classmethods_in_c -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_compattr -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_consistency_with_epg -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_copy_setstate -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_deepcopy_recursive -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_diamond_inheritance -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_dict_constructors -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_dir -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_doc_descriptor -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_dynamics -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_errors -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_evil_type_name -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_ex5_from_c3_switch -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_file_fault -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_funny_new -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_getattr_hooks -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_hash_inheritance -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_imul_bug -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_init -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_ipow -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_ipow_returns_not_implemented -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_isinst_isclass -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_keyword_arguments -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_keywords -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_load_attr_extended_arg -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_metaclass -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_meth_class_get -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_method_wrapper -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_methods -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_methods_in_c -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_mixing_slot_wrappers -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_module_subclasses -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_monotonicity -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_mro_disagreement -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_multiple_inheritance -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_mutable_bases -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_mutable_bases_catch_mro_conflict -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_mutable_bases_with_failing_mro -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_mutable_names -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_newslots -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_no_ipow -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_not_implemented -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_object_class -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_object_class_assignment_between_heaptypes_and_nonheaptypes -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_object_new -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_object_new_and_init_with_parameters -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_overloading -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_properties -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_properties_doc_attrib -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_properties_plus -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_proxy_call -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_proxy_super -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_python_dicts -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_python_lists -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_qualname -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_qualname_dict -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_recursive_call -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_refleaks_in_classmethod___init__ -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_refleaks_in_staticmethod___init__ -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_repr_as_str -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_repr_with_module_str_subclass -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_rich_comparisons -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_rmul -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_set_and_no_get -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_set_class -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_set_dict -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_set_doc -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_slices -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_slot_shadows_class_variable -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_slots -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_slots_descriptor -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_slots_multiple_inheritance -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_slots_special -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_slots_special2 -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_slots_trash -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_special_method_lookup -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_special_unbound_method_types -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_specials -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_staticmethods -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_staticmethods_in_c -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_str_of_str_subclass -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_str_operations -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_str_subclass_as_dict_key -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_subclass_propagation -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_subclassing_does_not_duplicate_dict_descriptors -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_supers -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_testcapi_no_segfault -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_type___getattribute__ -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_uninitialized_modules -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_unsubclassable_types -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_vicious_descriptor_nonsense -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_weakref_segfault -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_wrapper_segfault -*graalpython.lib-python.3.test.test_descr.ClassPropertiesAndMethods.test_wrong_class_slot_wrapper -*graalpython.lib-python.3.test.test_descr.DictProxyTests.test_dict_type_with_metaclass -*graalpython.lib-python.3.test.test_descr.DictProxyTests.test_iter_items -*graalpython.lib-python.3.test.test_descr.DictProxyTests.test_iter_keys -*graalpython.lib-python.3.test.test_descr.DictProxyTests.test_iter_values -*graalpython.lib-python.3.test.test_descr.DictProxyTests.test_repr -*graalpython.lib-python.3.test.test_descr.MiscTests.test_type_lookup_mro_reference -*graalpython.lib-python.3.test.test_descr.MroTest.test_incomplete_extend -*graalpython.lib-python.3.test.test_descr.MroTest.test_incomplete_set_bases_on_self -*graalpython.lib-python.3.test.test_descr.MroTest.test_incomplete_super -*graalpython.lib-python.3.test.test_descr.MroTest.test_reent_set_bases_on_base -*graalpython.lib-python.3.test.test_descr.MroTest.test_reent_set_bases_on_direct_base -*graalpython.lib-python.3.test.test_descr.MroTest.test_reent_set_bases_tp_base_cycle -*graalpython.lib-python.3.test.test_descr.MroTest.test_tp_subclasses_cycle_error_return_path -*graalpython.lib-python.3.test.test_descr.MroTest.test_tp_subclasses_cycle_in_update_slots -*graalpython.lib-python.3.test.test_descr.OperatorsTest.test_complexes -*graalpython.lib-python.3.test.test_descr.OperatorsTest.test_dicts -*graalpython.lib-python.3.test.test_descr.OperatorsTest.test_explicit_reverse_methods -*graalpython.lib-python.3.test.test_descr.OperatorsTest.test_floats -*graalpython.lib-python.3.test.test_descr.OperatorsTest.test_ints -*graalpython.lib-python.3.test.test_descr.OperatorsTest.test_lists -*graalpython.lib-python.3.test.test_descr.OperatorsTest.test_spam_dicts -*graalpython.lib-python.3.test.test_descr.OperatorsTest.test_spam_lists -*graalpython.lib-python.3.test.test_descr.OperatorsTest.test_wrap_lenfunc_bad_cast -*graalpython.lib-python.3.test.test_descr.PTypesLongInitTest.test_pytype_long_ready -*graalpython.lib-python.3.test.test_descr.PicklingTests.test_issue24097 -*graalpython.lib-python.3.test.test_descr.PicklingTests.test_pickle_slots -*graalpython.lib-python.3.test.test_descr.PicklingTests.test_reduce -*graalpython.lib-python.3.test.test_descr.PicklingTests.test_reduce_copying -*graalpython.lib-python.3.test.test_descr.SharedKeyTests.test_subclasses +test.test_descr.AAAPTypesLongInitTest.test_pytype_long_ready @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_abstractmethods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_altmro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_assign_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_attr_raise_through_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_bad_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_basic_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_binary_operator_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_bound_method_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_bpo25750 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_buffer_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_builtin_bases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_builtin_function_or_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_carloverre @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_carloverre_multi_inherit_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_classic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_classic_comparisons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_classmethods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_compattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_consistency_with_epg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_copy_setstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_deepcopy_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_diamond_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_dict_constructors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_doc_descriptor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_dynamics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_evil_type_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_ex5_from_c3_switch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_file_fault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_funny_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_getattr_hooks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_hash_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_imul_bug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_ipow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_ipow_exception_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_ipow_returns_not_implemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_isinst_isclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_keyword_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_load_attr_extended_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_metaclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_method_wrapper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_mixing_slot_wrappers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_module_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_monotonicity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_mro_disagreement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_multiple_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_mutable_bases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_mutable_bases_catch_mro_conflict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_mutable_bases_with_failing_mro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_mutable_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_newslots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_no_ipow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_not_implemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_object_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_object_class_assignment_between_heaptypes_and_nonheaptypes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_object_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_object_new_and_init_with_parameters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_overloading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_properties @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_properties_doc_attrib @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_properties_plus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_proxy_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_proxy_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_python_dicts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_python_lists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_qualname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_qualname_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_recursive_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_repr_as_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_repr_with_module_str_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_restored_object_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_rich_comparisons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_rmul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_set_and_no_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_set_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_set_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_set_doc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_slices @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_slot_shadows_class_variable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_slots_descriptor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_slots_multiple_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_slots_special @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_slots_special2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_slots_trash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_special_method_lookup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_special_unbound_method_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_specials @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_staticmethods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_str_of_str_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_str_operations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_str_subclass_as_dict_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_subclass_propagation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_subclass_right_op @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_subclassing_does_not_duplicate_dict_descriptors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_supers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_type___getattribute__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_uninitialized_modules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_unsubclassable_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_vicious_descriptor_nonsense @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_weakref_segfault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_wrapper_segfault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.ClassPropertiesAndMethods.test_wrong_class_slot_wrapper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.DictProxyTests.test_dict_type_with_metaclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.DictProxyTests.test_iter_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.DictProxyTests.test_iter_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.DictProxyTests.test_iter_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.DictProxyTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.MiscTests.test_type_lookup_mro_reference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.MroTest.test_incomplete_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.MroTest.test_incomplete_set_bases_on_self @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.MroTest.test_incomplete_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.MroTest.test_reent_set_bases_on_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.MroTest.test_reent_set_bases_on_direct_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.MroTest.test_reent_set_bases_tp_base_cycle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.MroTest.test_tp_subclasses_cycle_error_return_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.MroTest.test_tp_subclasses_cycle_in_update_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.OperatorsTest.test_complexes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.OperatorsTest.test_dicts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.OperatorsTest.test_explicit_reverse_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.OperatorsTest.test_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.OperatorsTest.test_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.OperatorsTest.test_lists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.OperatorsTest.test_wrap_lenfunc_bad_cast @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.PicklingTests.test_issue24097 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.PicklingTests.test_pickle_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.PicklingTests.test_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_descr.PicklingTests.test_reduce_copying @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_descrtut.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_descrtut.txt index 26a3b64854..ac23d042b3 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_descrtut.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_descrtut.txt @@ -1 +1,7 @@ -*graalpython.lib-python.3.test.test_descrtut.TestMain.test_main +DocTestCase.test.test_descrtut.__test__.tut1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_descrtut.__test__.tut2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_descrtut.__test__.tut4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_descrtut.__test__.tut5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_descrtut.__test__.tut6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_descrtut.__test__.tut7 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_descrtut.__test__.tut8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dict.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dict.txt index 036d57ea9d..1f2a49ad28 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dict.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dict.txt @@ -1,105 +1,91 @@ -*graalpython.lib-python.3.test.test_dict.CAPITest.test_getitem_knownhash -*graalpython.lib-python.3.test.test_dict.DictTest.test_bad_key -*graalpython.lib-python.3.test.test_dict.DictTest.test_bool -*graalpython.lib-python.3.test.test_dict.DictTest.test_clear -*graalpython.lib-python.3.test.test_dict.DictTest.test_constructor -*graalpython.lib-python.3.test.test_dict.DictTest.test_container_iterator -*graalpython.lib-python.3.test.test_dict.DictTest.test_contains -*graalpython.lib-python.3.test.test_dict.DictTest.test_copy -*graalpython.lib-python.3.test.test_dict.DictTest.test_copy_fuzz -*graalpython.lib-python.3.test.test_dict.DictTest.test_copy_maintains_tracking -*graalpython.lib-python.3.test.test_dict.DictTest.test_copy_noncompact -*graalpython.lib-python.3.test.test_dict.DictTest.test_dict_contain_use_after_free -*graalpython.lib-python.3.test.test_dict.DictTest.test_dict_copy_order -*graalpython.lib-python.3.test.test_dict.DictTest.test_dict_items_result_gc -*graalpython.lib-python.3.test.test_dict.DictTest.test_dict_items_result_gc_reversed -*graalpython.lib-python.3.test.test_dict.DictTest.test_dictitems_contains_use_after_free -*graalpython.lib-python.3.test.test_dict.DictTest.test_dictview_mixed_set_operations -*graalpython.lib-python.3.test.test_dict.DictTest.test_dictview_set_operations_on_items -*graalpython.lib-python.3.test.test_dict.DictTest.test_dictview_set_operations_on_keys -*graalpython.lib-python.3.test.test_dict.DictTest.test_empty_presized_dict_in_freelist -*graalpython.lib-python.3.test.test_dict.DictTest.test_eq -*graalpython.lib-python.3.test.test_dict.DictTest.test_equal_operator_modifying_operand -*graalpython.lib-python.3.test.test_dict.DictTest.test_errors_in_view_containment_check -*graalpython.lib-python.3.test.test_dict.DictTest.test_fromkeys -*graalpython.lib-python.3.test.test_dict.DictTest.test_fromkeys_operator_modifying_dict_operand -*graalpython.lib-python.3.test.test_dict.DictTest.test_fromkeys_operator_modifying_set_operand -*graalpython.lib-python.3.test.test_dict.DictTest.test_get -*graalpython.lib-python.3.test.test_dict.DictTest.test_getitem -*graalpython.lib-python.3.test.test_dict.DictTest.test_init_use_after_free -*graalpython.lib-python.3.test.test_dict.DictTest.test_instance_dict_getattr_str_subclass -*graalpython.lib-python.3.test.test_dict.DictTest.test_invalid_keyword_arguments -*graalpython.lib-python.3.test.test_dict.DictTest.test_itemiterator_pickling -*graalpython.lib-python.3.test.test_dict.DictTest.test_items -*graalpython.lib-python.3.test.test_dict.DictTest.test_items_symmetric_difference -*graalpython.lib-python.3.test.test_dict.DictTest.test_iterator_pickling -*graalpython.lib-python.3.test.test_dict.DictTest.test_keys -*graalpython.lib-python.3.test.test_dict.DictTest.test_keys_contained -*graalpython.lib-python.3.test.test_dict.DictTest.test_len -*graalpython.lib-python.3.test.test_dict.DictTest.test_literal_constructor -*graalpython.lib-python.3.test.test_dict.DictTest.test_merge_and_mutate -*graalpython.lib-python.3.test.test_dict.DictTest.test_merge_operator -*graalpython.lib-python.3.test.test_dict.DictTest.test_missing -*graalpython.lib-python.3.test.test_dict.DictTest.test_mutating_iteration -*graalpython.lib-python.3.test.test_dict.DictTest.test_mutating_lookup -*graalpython.lib-python.3.test.test_dict.DictTest.test_object_set_item_single_instance_non_str_key -*graalpython.lib-python.3.test.test_dict.DictTest.test_pop -*graalpython.lib-python.3.test.test_dict.DictTest.test_popitem -*graalpython.lib-python.3.test.test_dict.DictTest.test_reentrant_insertion -*graalpython.lib-python.3.test.test_dict.DictTest.test_repr -*graalpython.lib-python.3.test.test_dict.DictTest.test_repr_deep -*graalpython.lib-python.3.test.test_dict.DictTest.test_resize1 -*graalpython.lib-python.3.test.test_dict.DictTest.test_resize2 -*graalpython.lib-python.3.test.test_dict.DictTest.test_reverse_iterator_for_empty_dict -*graalpython.lib-python.3.test.test_dict.DictTest.test_reverse_iterator_for_shared_shared_dicts -*graalpython.lib-python.3.test.test_dict.DictTest.test_reversed -*graalpython.lib-python.3.test.test_dict.DictTest.test_reverseitemiterator_pickling -*graalpython.lib-python.3.test.test_dict.DictTest.test_reverseiterator_pickling -*graalpython.lib-python.3.test.test_dict.DictTest.test_reversevaluesiterator_pickling -*graalpython.lib-python.3.test.test_dict.DictTest.test_setdefault -*graalpython.lib-python.3.test.test_dict.DictTest.test_setitem_atomic_at_resize -*graalpython.lib-python.3.test.test_dict.DictTest.test_splittable_del -*graalpython.lib-python.3.test.test_dict.DictTest.test_splittable_pop -*graalpython.lib-python.3.test.test_dict.DictTest.test_splittable_pop_pending -*graalpython.lib-python.3.test.test_dict.DictTest.test_splittable_popitem -*graalpython.lib-python.3.test.test_dict.DictTest.test_splittable_setattr_after_pop -*graalpython.lib-python.3.test.test_dict.DictTest.test_splittable_setdefault -*graalpython.lib-python.3.test.test_dict.DictTest.test_splittable_update -*graalpython.lib-python.3.test.test_dict.DictTest.test_str_nonstr -*graalpython.lib-python.3.test.test_dict.DictTest.test_string_keys_can_track_values -*graalpython.lib-python.3.test.test_dict.DictTest.test_track_dynamic -*graalpython.lib-python.3.test.test_dict.DictTest.test_track_literals -*graalpython.lib-python.3.test.test_dict.DictTest.test_track_subtypes -*graalpython.lib-python.3.test.test_dict.DictTest.test_tuple_keyerror -*graalpython.lib-python.3.test.test_dict.DictTest.test_update -*graalpython.lib-python.3.test.test_dict.DictTest.test_values -*graalpython.lib-python.3.test.test_dict.DictTest.test_valuesiterator_pickling -*graalpython.lib-python.3.test.test_dict.DictTest.test_views_mapping -*graalpython.lib-python.3.test.test_dict.GeneralMappingTests.test_bool -*graalpython.lib-python.3.test.test_dict.GeneralMappingTests.test_constructor -*graalpython.lib-python.3.test.test_dict.GeneralMappingTests.test_get -*graalpython.lib-python.3.test.test_dict.GeneralMappingTests.test_getitem -*graalpython.lib-python.3.test.test_dict.GeneralMappingTests.test_items -*graalpython.lib-python.3.test.test_dict.GeneralMappingTests.test_keys -*graalpython.lib-python.3.test.test_dict.GeneralMappingTests.test_len -*graalpython.lib-python.3.test.test_dict.GeneralMappingTests.test_pop -*graalpython.lib-python.3.test.test_dict.GeneralMappingTests.test_popitem -*graalpython.lib-python.3.test.test_dict.GeneralMappingTests.test_read -*graalpython.lib-python.3.test.test_dict.GeneralMappingTests.test_setdefault -*graalpython.lib-python.3.test.test_dict.GeneralMappingTests.test_update -*graalpython.lib-python.3.test.test_dict.GeneralMappingTests.test_values -*graalpython.lib-python.3.test.test_dict.GeneralMappingTests.test_write -*graalpython.lib-python.3.test.test_dict.SubclassMappingTests.test_bool -*graalpython.lib-python.3.test.test_dict.SubclassMappingTests.test_constructor -*graalpython.lib-python.3.test.test_dict.SubclassMappingTests.test_get -*graalpython.lib-python.3.test.test_dict.SubclassMappingTests.test_getitem -*graalpython.lib-python.3.test.test_dict.SubclassMappingTests.test_items -*graalpython.lib-python.3.test.test_dict.SubclassMappingTests.test_keys -*graalpython.lib-python.3.test.test_dict.SubclassMappingTests.test_len -*graalpython.lib-python.3.test.test_dict.SubclassMappingTests.test_pop -*graalpython.lib-python.3.test.test_dict.SubclassMappingTests.test_popitem -*graalpython.lib-python.3.test.test_dict.SubclassMappingTests.test_read -*graalpython.lib-python.3.test.test_dict.SubclassMappingTests.test_setdefault -*graalpython.lib-python.3.test.test_dict.SubclassMappingTests.test_update -*graalpython.lib-python.3.test.test_dict.SubclassMappingTests.test_values -*graalpython.lib-python.3.test.test_dict.SubclassMappingTests.test_write +test.test_dict.DictTest.test_bad_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_copy_fuzz @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_copy_maintains_tracking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_copy_noncompact @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_dict_contain_use_after_free @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_dict_copy_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_dictitems_contains_use_after_free @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_dictview_mixed_set_operations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_dictview_set_operations_on_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_dictview_set_operations_on_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_empty_presized_dict_in_freelist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_equal_operator_modifying_operand @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_errors_in_view_containment_check @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_fromkeys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_fromkeys_operator_modifying_dict_operand @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_fromkeys_operator_modifying_set_operand @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_init_use_after_free @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_instance_dict_getattr_str_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_invalid_keyword_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_itemiterator_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_items_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_iterator_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_keys_contained @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_literal_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_merge_and_mutate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_merge_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_mutating_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_mutating_lookup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_object_set_item_single_instance_non_str_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_reentrant_insertion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_repr_deep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_resize1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_resize2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_reverse_iterator_for_empty_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_reverse_iterator_for_shared_shared_dicts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_reversed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_reverseitemiterator_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_reverseiterator_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_reversevaluesiterator_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_setitem_atomic_at_resize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_str_nonstr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_string_keys_can_track_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_tuple_keyerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_valuesiterator_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.DictTest.test_views_mapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.GeneralMappingTests.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.GeneralMappingTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.GeneralMappingTests.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.GeneralMappingTests.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.GeneralMappingTests.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.GeneralMappingTests.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.GeneralMappingTests.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.GeneralMappingTests.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.GeneralMappingTests.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.GeneralMappingTests.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.GeneralMappingTests.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.GeneralMappingTests.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.GeneralMappingTests.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.GeneralMappingTests.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.SubclassMappingTests.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.SubclassMappingTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.SubclassMappingTests.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.SubclassMappingTests.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.SubclassMappingTests.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.SubclassMappingTests.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.SubclassMappingTests.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.SubclassMappingTests.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.SubclassMappingTests.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.SubclassMappingTests.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.SubclassMappingTests.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.SubclassMappingTests.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.SubclassMappingTests.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dict.SubclassMappingTests.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dictcomps.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dictcomps.txt index 0c24744b41..cacf93fc86 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dictcomps.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dictcomps.txt @@ -1,9 +1,9 @@ -*graalpython.lib-python.3.test.test_dictcomps.DictComprehensionTest.test_assignment_idiom_in_comprehensions -*graalpython.lib-python.3.test.test_dictcomps.DictComprehensionTest.test_basics -*graalpython.lib-python.3.test.test_dictcomps.DictComprehensionTest.test_evaluation_order -*graalpython.lib-python.3.test.test_dictcomps.DictComprehensionTest.test_global_visibility -*graalpython.lib-python.3.test.test_dictcomps.DictComprehensionTest.test_illegal_assignment -*graalpython.lib-python.3.test.test_dictcomps.DictComprehensionTest.test_local_visibility -*graalpython.lib-python.3.test.test_dictcomps.DictComprehensionTest.test_scope_isolation -*graalpython.lib-python.3.test.test_dictcomps.DictComprehensionTest.test_scope_isolation_from_global -*graalpython.lib-python.3.test.test_dictcomps.DictComprehensionTest.test_star_expression +test.test_dictcomps.DictComprehensionTest.test_assignment_idiom_in_comprehensions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictcomps.DictComprehensionTest.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictcomps.DictComprehensionTest.test_evaluation_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictcomps.DictComprehensionTest.test_global_visibility @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictcomps.DictComprehensionTest.test_illegal_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictcomps.DictComprehensionTest.test_local_visibility @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictcomps.DictComprehensionTest.test_scope_isolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictcomps.DictComprehensionTest.test_scope_isolation_from_global @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictcomps.DictComprehensionTest.test_star_expression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dictviews.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dictviews.txt index d38b654e29..2e29b3587a 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dictviews.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dictviews.txt @@ -1,16 +1,16 @@ -*graalpython.lib-python.3.test.test_dictviews.DictSetTest.test_abc_registry -*graalpython.lib-python.3.test.test_dictviews.DictSetTest.test_compare_error -*graalpython.lib-python.3.test.test_dictviews.DictSetTest.test_constructors_not_callable -*graalpython.lib-python.3.test.test_dictviews.DictSetTest.test_copy -*graalpython.lib-python.3.test.test_dictviews.DictSetTest.test_deeply_nested_repr -*graalpython.lib-python.3.test.test_dictviews.DictSetTest.test_dict_items -*graalpython.lib-python.3.test.test_dictviews.DictSetTest.test_dict_keys -*graalpython.lib-python.3.test.test_dictviews.DictSetTest.test_dict_mixed_keys_items -*graalpython.lib-python.3.test.test_dictviews.DictSetTest.test_dict_repr -*graalpython.lib-python.3.test.test_dictviews.DictSetTest.test_dict_values -*graalpython.lib-python.3.test.test_dictviews.DictSetTest.test_items_set_operations -*graalpython.lib-python.3.test.test_dictviews.DictSetTest.test_keys_set_operations -*graalpython.lib-python.3.test.test_dictviews.DictSetTest.test_pickle -*graalpython.lib-python.3.test.test_dictviews.DictSetTest.test_recursive_repr -*graalpython.lib-python.3.test.test_dictviews.DictSetTest.test_set_operations_with_iterator -*graalpython.lib-python.3.test.test_dictviews.DictSetTest.test_set_operations_with_noniterable +test.test_dictviews.DictSetTest.test_abc_registry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictviews.DictSetTest.test_compare_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictviews.DictSetTest.test_constructors_not_callable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictviews.DictSetTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictviews.DictSetTest.test_deeply_nested_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictviews.DictSetTest.test_dict_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictviews.DictSetTest.test_dict_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictviews.DictSetTest.test_dict_mixed_keys_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictviews.DictSetTest.test_dict_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictviews.DictSetTest.test_dict_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictviews.DictSetTest.test_items_set_operations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictviews.DictSetTest.test_keys_set_operations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictviews.DictSetTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictviews.DictSetTest.test_recursive_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictviews.DictSetTest.test_set_operations_with_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dictviews.DictSetTest.test_set_operations_with_noniterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_difflib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_difflib.txt index d026b063fe..33ab08dd68 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_difflib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_difflib.txt @@ -1,32 +1,51 @@ -*graalpython.lib-python.3.test.test_difflib.TestAutojunk.test_one_insert_homogenous_sequence -*graalpython.lib-python.3.test.test_difflib.TestBytes.test_byte_content -*graalpython.lib-python.3.test.test_difflib.TestBytes.test_byte_filenames -*graalpython.lib-python.3.test.test_difflib.TestBytes.test_mixed_types_content -*graalpython.lib-python.3.test.test_difflib.TestBytes.test_mixed_types_dates -*graalpython.lib-python.3.test.test_difflib.TestBytes.test_mixed_types_filenames -*graalpython.lib-python.3.test.test_difflib.TestFindLongest.test_default_args -*graalpython.lib-python.3.test.test_difflib.TestFindLongest.test_longest_match_with_popular_chars -*graalpython.lib-python.3.test.test_difflib.TestJunkAPIs.test_is_character_junk_false -*graalpython.lib-python.3.test.test_difflib.TestJunkAPIs.test_is_character_junk_true -*graalpython.lib-python.3.test.test_difflib.TestJunkAPIs.test_is_line_junk_REDOS -*graalpython.lib-python.3.test.test_difflib.TestJunkAPIs.test_is_line_junk_false -*graalpython.lib-python.3.test.test_difflib.TestJunkAPIs.test_is_line_junk_true -*graalpython.lib-python.3.test.test_difflib.TestMain.test_main -*graalpython.lib-python.3.test.test_difflib.TestOutputFormat.test_no_trailing_tab_on_empty_filedate -*graalpython.lib-python.3.test.test_difflib.TestOutputFormat.test_range_format_context -*graalpython.lib-python.3.test.test_difflib.TestOutputFormat.test_range_format_unified -*graalpython.lib-python.3.test.test_difflib.TestOutputFormat.test_tab_delimiter -*graalpython.lib-python.3.test.test_difflib.TestSFbugs.test_added_tab_hint -*graalpython.lib-python.3.test.test_difflib.TestSFbugs.test_comparing_empty_lists -*graalpython.lib-python.3.test.test_difflib.TestSFbugs.test_hint_indented_properly_with_tabs -*graalpython.lib-python.3.test.test_difflib.TestSFbugs.test_matching_blocks_cache -*graalpython.lib-python.3.test.test_difflib.TestSFbugs.test_mdiff_catch_stop_iteration -*graalpython.lib-python.3.test.test_difflib.TestSFbugs.test_ratio_for_null_seqn -*graalpython.lib-python.3.test.test_difflib.TestSFpatches.test_html_diff -*graalpython.lib-python.3.test.test_difflib.TestSFpatches.test_make_file_default_charset -*graalpython.lib-python.3.test.test_difflib.TestSFpatches.test_make_file_iso88591_charset -*graalpython.lib-python.3.test.test_difflib.TestSFpatches.test_make_file_usascii_charset_with_nonascii_input -*graalpython.lib-python.3.test.test_difflib.TestSFpatches.test_recursion_limit -*graalpython.lib-python.3.test.test_difflib.TestWithAscii.test_bjunk -*graalpython.lib-python.3.test.test_difflib.TestWithAscii.test_one_delete -*graalpython.lib-python.3.test.test_difflib.TestWithAscii.test_one_insert +DocTestCase.difflib.Differ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.Differ._fancy_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.Differ._qformat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.Differ.compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.IS_CHARACTER_JUNK @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.IS_LINE_JUNK @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.SequenceMatcher @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.SequenceMatcher.find_longest_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.SequenceMatcher.get_grouped_opcodes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.SequenceMatcher.get_matching_blocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.SequenceMatcher.get_opcodes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.SequenceMatcher.ratio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.SequenceMatcher.set_seq1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.SequenceMatcher.set_seq2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.SequenceMatcher.set_seqs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.context_diff @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.get_close_matches @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.ndiff @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.restore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.difflib.unified_diff @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestAutojunk.test_one_insert_homogenous_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestBytes.test_byte_content @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestBytes.test_byte_filenames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestBytes.test_mixed_types_content @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestBytes.test_mixed_types_dates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestBytes.test_mixed_types_filenames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestFindLongest.test_default_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestFindLongest.test_longest_match_with_popular_chars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestJunkAPIs.test_is_character_junk_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestJunkAPIs.test_is_character_junk_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestJunkAPIs.test_is_line_junk_REDOS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestJunkAPIs.test_is_line_junk_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestJunkAPIs.test_is_line_junk_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestOutputFormat.test_no_trailing_tab_on_empty_filedate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestOutputFormat.test_range_format_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestOutputFormat.test_range_format_unified @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestOutputFormat.test_tab_delimiter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestSFbugs.test_added_tab_hint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestSFbugs.test_comparing_empty_lists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestSFbugs.test_hint_indented_properly_with_tabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestSFbugs.test_matching_blocks_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestSFbugs.test_mdiff_catch_stop_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestSFbugs.test_ratio_for_null_seqn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestSFpatches.test_html_diff @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestSFpatches.test_make_file_default_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestSFpatches.test_make_file_iso88591_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestSFpatches.test_make_file_usascii_charset_with_nonascii_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestSFpatches.test_recursion_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestWithAscii.test_bjunk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestWithAscii.test_one_delete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_difflib.TestWithAscii.test_one_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_distutils.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_distutils.txt index 57031c2c79..68a6b0dc32 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_distutils.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_distutils.txt @@ -1,234 +1,226 @@ -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_check_archive_formats -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_compress_deprecated -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive_bztar -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive_cwd -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive_gztar -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive_owner_group -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive_tar -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive_xztar -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_tarball -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_tarball_bzip2 -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_tarball_extended -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_tarball_gzip -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_tarball_latin1 -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_tarball_xz -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_zipfile -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_zipfile_no_zlib -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_tarfile_root_owner -*distutils.tests.test_archive_util.ArchiveUtilTestCase.test_tarfile_vs_tar -*distutils.tests.test_bdist.BuildTestCase.test_formats -*distutils.tests.test_bdist.BuildTestCase.test_skip_build -*distutils.tests.test_bdist_dumb.BuildDumbTestCase.test_simple_built -*distutils.tests.test_bdist_rpm.BuildRpmTestCase.test_no_optimize_flag -*distutils.tests.test_bdist_rpm.BuildRpmTestCase.test_quiet -*distutils.tests.test_build.BuildTestCase.test_finalize_options -*distutils.tests.test_build_clib.BuildCLibTestCase.test_build_libraries -*distutils.tests.test_build_clib.BuildCLibTestCase.test_check_library_dist -*distutils.tests.test_build_clib.BuildCLibTestCase.test_finalize_options -*distutils.tests.test_build_clib.BuildCLibTestCase.test_get_source_files -*distutils.tests.test_build_clib.BuildCLibTestCase.test_run -*distutils.tests.test_build_ext.BuildExtTestCase.test_build_ext -*distutils.tests.test_build_ext.BuildExtTestCase.test_check_extensions_list -*distutils.tests.test_build_ext.BuildExtTestCase.test_compiler_option -*distutils.tests.test_build_ext.BuildExtTestCase.test_deployment_target_higher_ok -*distutils.tests.test_build_ext.BuildExtTestCase.test_ext_fullpath -*distutils.tests.test_build_ext.BuildExtTestCase.test_finalize_options -*distutils.tests.test_build_ext.BuildExtTestCase.test_get_outputs -*distutils.tests.test_build_ext.BuildExtTestCase.test_get_source_files -*distutils.tests.test_build_ext.BuildExtTestCase.test_optional_extension -*distutils.tests.test_build_ext.BuildExtTestCase.test_solaris_enable_shared -*distutils.tests.test_build_ext.BuildExtTestCase.test_unicode_module_names -*distutils.tests.test_build_ext.BuildExtTestCase.test_user_site -*distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_build_ext -*distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_check_extensions_list -*distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_compiler_option -*distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_deployment_target_higher_ok -*distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_ext_fullpath -*distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_finalize_options -*distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_get_outputs -*distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_get_source_files -*distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_optional_extension -*distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_solaris_enable_shared -*distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_unicode_module_names -*distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_user_site -*distutils.tests.test_build_py.BuildPyTestCase.test_byte_compile -*distutils.tests.test_build_py.BuildPyTestCase.test_byte_compile_optimized -*distutils.tests.test_build_py.BuildPyTestCase.test_dir_in_package_data -*distutils.tests.test_build_py.BuildPyTestCase.test_dont_write_bytecode -*distutils.tests.test_build_py.BuildPyTestCase.test_empty_package_dir -*distutils.tests.test_build_py.BuildPyTestCase.test_package_data -*distutils.tests.test_build_scripts.BuildScriptsTestCase.test_build -*distutils.tests.test_build_scripts.BuildScriptsTestCase.test_default_settings -*distutils.tests.test_build_scripts.BuildScriptsTestCase.test_version_int -*distutils.tests.test_check.CheckTestCase.test_check_all -*distutils.tests.test_check.CheckTestCase.test_check_document -*distutils.tests.test_check.CheckTestCase.test_check_metadata -*distutils.tests.test_check.CheckTestCase.test_check_restructuredtext -*distutils.tests.test_check.CheckTestCase.test_check_restructuredtext_with_syntax_highlight -*distutils.tests.test_clean.cleanTestCase.test_simple_run -*distutils.tests.test_cmd.CommandTestCase.test_debug_print -*distutils.tests.test_cmd.CommandTestCase.test_dump_options -*distutils.tests.test_cmd.CommandTestCase.test_ensure_dirname -*distutils.tests.test_cmd.CommandTestCase.test_ensure_filename -*distutils.tests.test_cmd.CommandTestCase.test_ensure_string -*distutils.tests.test_cmd.CommandTestCase.test_ensure_string_list -*distutils.tests.test_cmd.CommandTestCase.test_make_file -*distutils.tests.test_config.PyPIRCCommandTestCase.test_config_interpolation -*distutils.tests.test_config.PyPIRCCommandTestCase.test_server_empty_registration -*distutils.tests.test_config.PyPIRCCommandTestCase.test_server_registration -*distutils.tests.test_config_cmd.ConfigTestCase.test_clean -*distutils.tests.test_config_cmd.ConfigTestCase.test_dump_file -*distutils.tests.test_config_cmd.ConfigTestCase.test_finalize_options -*distutils.tests.test_config_cmd.ConfigTestCase.test_search_cpp -*distutils.tests.test_core.CoreTestCase.test_debug_mode -*distutils.tests.test_core.CoreTestCase.test_run_setup_defines_subclass -*distutils.tests.test_core.CoreTestCase.test_run_setup_preserves_sys_argv -*distutils.tests.test_core.CoreTestCase.test_run_setup_provides_file -*distutils.tests.test_core.CoreTestCase.test_run_setup_uses_current_dir -*distutils.tests.test_cygwinccompiler.CygwinCCompilerTestCase.test_check_config_h -*distutils.tests.test_cygwinccompiler.CygwinCCompilerTestCase.test_get_msvcr -*distutils.tests.test_cygwinccompiler.CygwinCCompilerTestCase.test_get_versions -*distutils.tests.test_dep_util.DepUtilTestCase.test_newer -*distutils.tests.test_dep_util.DepUtilTestCase.test_newer_group -*distutils.tests.test_dep_util.DepUtilTestCase.test_newer_pairwise -*distutils.tests.test_dir_util.DirUtilTestCase.test_copy_tree_exception_in_listdir -*distutils.tests.test_dir_util.DirUtilTestCase.test_copy_tree_skips_nfs_temp_files -*distutils.tests.test_dir_util.DirUtilTestCase.test_copy_tree_verbosity -*distutils.tests.test_dir_util.DirUtilTestCase.test_create_tree_verbosity -*distutils.tests.test_dir_util.DirUtilTestCase.test_ensure_relative -*distutils.tests.test_dir_util.DirUtilTestCase.test_mkpath_remove_tree_verbosity -*distutils.tests.test_dir_util.DirUtilTestCase.test_mkpath_with_custom_mode -*distutils.tests.test_dist.DistributionTestCase.test_announce -*distutils.tests.test_dist.DistributionTestCase.test_command_packages_cmdline -*distutils.tests.test_dist.DistributionTestCase.test_command_packages_configfile -*distutils.tests.test_dist.DistributionTestCase.test_command_packages_unspecified -*distutils.tests.test_dist.DistributionTestCase.test_empty_options -*distutils.tests.test_dist.DistributionTestCase.test_finalize_options -*distutils.tests.test_dist.DistributionTestCase.test_find_config_files_disable -*distutils.tests.test_dist.DistributionTestCase.test_get_command_packages -*distutils.tests.test_dist.DistributionTestCase.test_venv_install_options -*distutils.tests.test_dist.MetadataTestCase.test_classifier -*distutils.tests.test_dist.MetadataTestCase.test_classifier_invalid_type -*distutils.tests.test_dist.MetadataTestCase.test_custom_pydistutils -*distutils.tests.test_dist.MetadataTestCase.test_download_url -*distutils.tests.test_dist.MetadataTestCase.test_fix_help_options -*distutils.tests.test_dist.MetadataTestCase.test_keywords -*distutils.tests.test_dist.MetadataTestCase.test_keywords_invalid_type -*distutils.tests.test_dist.MetadataTestCase.test_long_description -*distutils.tests.test_dist.MetadataTestCase.test_obsoletes -*distutils.tests.test_dist.MetadataTestCase.test_obsoletes_illegal -*distutils.tests.test_dist.MetadataTestCase.test_obsoletes_to_list -*distutils.tests.test_dist.MetadataTestCase.test_platforms -*distutils.tests.test_dist.MetadataTestCase.test_platforms_invalid_types -*distutils.tests.test_dist.MetadataTestCase.test_provides -*distutils.tests.test_dist.MetadataTestCase.test_provides_illegal -*distutils.tests.test_dist.MetadataTestCase.test_read_metadata -*distutils.tests.test_dist.MetadataTestCase.test_requires -*distutils.tests.test_dist.MetadataTestCase.test_requires_illegal -*distutils.tests.test_dist.MetadataTestCase.test_requires_to_list -*distutils.tests.test_dist.MetadataTestCase.test_show_help -*distutils.tests.test_dist.MetadataTestCase.test_simple_metadata -*distutils.tests.test_extension.ExtensionTestCase.test_extension_init -*distutils.tests.test_extension.ExtensionTestCase.test_read_setup_file -*distutils.tests.test_file_util.FileUtilTestCase.test_copy_file_hard_link -*distutils.tests.test_file_util.FileUtilTestCase.test_copy_file_hard_link_failure -*distutils.tests.test_file_util.FileUtilTestCase.test_move_file_exception_unpacking_rename -*distutils.tests.test_file_util.FileUtilTestCase.test_move_file_exception_unpacking_unlink -*distutils.tests.test_file_util.FileUtilTestCase.test_move_file_verbosity -*distutils.tests.test_filelist.FileListTestCase.test_debug_print -*distutils.tests.test_filelist.FileListTestCase.test_exclude_pattern -*distutils.tests.test_filelist.FileListTestCase.test_glob_to_re -*distutils.tests.test_filelist.FileListTestCase.test_include_pattern -*distutils.tests.test_filelist.FileListTestCase.test_process_template -*distutils.tests.test_filelist.FileListTestCase.test_process_template_line -*distutils.tests.test_filelist.FileListTestCase.test_remove_duplicates -*distutils.tests.test_filelist.FileListTestCase.test_set_allfiles -*distutils.tests.test_filelist.FileListTestCase.test_translate_pattern -*distutils.tests.test_filelist.FindAllTestCase.test_basic_discovery -*distutils.tests.test_filelist.FindAllTestCase.test_missing_symlink -*distutils.tests.test_filelist.FindAllTestCase.test_non_local_discovery -*distutils.tests.test_install.InstallTestCase.test_debug_mode -*distutils.tests.test_install.InstallTestCase.test_finalize_options -*distutils.tests.test_install.InstallTestCase.test_handle_extra_path -*distutils.tests.test_install.InstallTestCase.test_home_installation_scheme -*distutils.tests.test_install.InstallTestCase.test_record -*distutils.tests.test_install.InstallTestCase.test_record_extensions -*distutils.tests.test_install.InstallTestCase.test_user_site -*distutils.tests.test_install_data.InstallDataTestCase.test_simple_run -*distutils.tests.test_install_headers.InstallHeadersTestCase.test_simple_run -*distutils.tests.test_install_lib.InstallLibTestCase.test_byte_compile -*distutils.tests.test_install_lib.InstallLibTestCase.test_dont_write_bytecode -*distutils.tests.test_install_lib.InstallLibTestCase.test_finalize_options -*distutils.tests.test_install_lib.InstallLibTestCase.test_get_inputs -*distutils.tests.test_install_lib.InstallLibTestCase.test_get_outputs -*distutils.tests.test_install_scripts.InstallScriptsTestCase.test_default_settings -*distutils.tests.test_install_scripts.InstallScriptsTestCase.test_installation -*distutils.tests.test_log.TestLog.test_non_ascii -*distutils.tests.test_msvc9compiler.msvc9compilerTestCase.test_no_compiler -*distutils.tests.test_msvc9compiler.msvc9compilerTestCase.test_reg_class -*distutils.tests.test_msvc9compiler.msvc9compilerTestCase.test_remove_entire_manifest -*distutils.tests.test_msvc9compiler.msvc9compilerTestCase.test_remove_visual_c_ref -*distutils.tests.test_msvccompiler.msvccompilerTestCase.test_get_vc2015 -*distutils.tests.test_msvccompiler.msvccompilerTestCase.test_get_vc2017 -*distutils.tests.test_msvccompiler.msvccompilerTestCase.test_get_vc_env_unicode -*distutils.tests.test_msvccompiler.msvccompilerTestCase.test_no_compiler -*distutils.tests.test_register.RegisterTestCase.test_check_metadata_deprecated -*distutils.tests.test_register.RegisterTestCase.test_create_pypirc -*distutils.tests.test_register.RegisterTestCase.test_list_classifiers -*distutils.tests.test_register.RegisterTestCase.test_password_not_in_file -*distutils.tests.test_register.RegisterTestCase.test_password_reset -*distutils.tests.test_register.RegisterTestCase.test_register_invalid_long_description -*distutils.tests.test_register.RegisterTestCase.test_registering -*distutils.tests.test_register.RegisterTestCase.test_show_response -*distutils.tests.test_register.RegisterTestCase.test_strict -*distutils.tests.test_sdist.SDistTestCase.test_add_defaults -*distutils.tests.test_sdist.SDistTestCase.test_check_metadata_deprecated -*distutils.tests.test_sdist.SDistTestCase.test_finalize_options -*distutils.tests.test_sdist.SDistTestCase.test_get_file_list -*distutils.tests.test_sdist.SDistTestCase.test_invalid_template_unknown_command -*distutils.tests.test_sdist.SDistTestCase.test_invalid_template_wrong_arguments -*distutils.tests.test_sdist.SDistTestCase.test_invalid_template_wrong_path -*distutils.tests.test_sdist.SDistTestCase.test_make_distribution -*distutils.tests.test_sdist.SDistTestCase.test_make_distribution_owner_group -*distutils.tests.test_sdist.SDistTestCase.test_manifest_comments -*distutils.tests.test_sdist.SDistTestCase.test_manifest_marker -*distutils.tests.test_sdist.SDistTestCase.test_manual_manifest -*distutils.tests.test_sdist.SDistTestCase.test_metadata_check_option -*distutils.tests.test_sdist.SDistTestCase.test_prune_file_list -*distutils.tests.test_sdist.SDistTestCase.test_show_formats -*distutils.tests.test_spawn.SpawnTestCase.test_find_executable -*distutils.tests.test_spawn.SpawnTestCase.test_spawn -*distutils.tests.test_spawn.SpawnTestCase.test_spawn_missing_exe -*distutils.tests.test_sysconfig.SysconfigTestCase.test_customize_compiler_before_get_config_vars -*distutils.tests.test_sysconfig.SysconfigTestCase.test_get_config_h_filename -*distutils.tests.test_sysconfig.SysconfigTestCase.test_get_config_vars -*distutils.tests.test_sysconfig.SysconfigTestCase.test_get_python_lib -*distutils.tests.test_sysconfig.SysconfigTestCase.test_parse_makefile_base -*distutils.tests.test_sysconfig.SysconfigTestCase.test_parse_makefile_literal_dollar -*distutils.tests.test_sysconfig.SysconfigTestCase.test_srcdir_independent_of_cwd -*distutils.tests.test_sysconfig.SysconfigTestCase.test_sysconfig_compiler_vars -*distutils.tests.test_sysconfig.SysconfigTestCase.test_sysconfig_module -*distutils.tests.test_text_file.TextFileTestCase.test_class -*distutils.tests.test_unixccompiler.UnixCCompilerTestCase.test_osx_cc_overrides_ldshared -*distutils.tests.test_unixccompiler.UnixCCompilerTestCase.test_osx_explicit_ldshared -*distutils.tests.test_unixccompiler.UnixCCompilerTestCase.test_runtime_libdir_option -*distutils.tests.test_upload.uploadTestCase.test_finalize_options -*distutils.tests.test_upload.uploadTestCase.test_saved_password -*distutils.tests.test_upload.uploadTestCase.test_upload -*distutils.tests.test_upload.uploadTestCase.test_upload_correct_cr -*distutils.tests.test_upload.uploadTestCase.test_upload_fails -*distutils.tests.test_upload.uploadTestCase.test_wrong_exception_order -*distutils.tests.test_util.UtilTestCase.test_change_root -*distutils.tests.test_util.UtilTestCase.test_check_environ -*distutils.tests.test_util.UtilTestCase.test_check_environ_getpwuid -*distutils.tests.test_util.UtilTestCase.test_convert_path -*distutils.tests.test_util.UtilTestCase.test_dont_write_bytecode -*distutils.tests.test_util.UtilTestCase.test_get_platform -*distutils.tests.test_util.UtilTestCase.test_grok_environment_error -*distutils.tests.test_util.UtilTestCase.test_rfc822_escape -*distutils.tests.test_util.UtilTestCase.test_split_quoted -*distutils.tests.test_util.UtilTestCase.test_strtobool -*distutils.tests.test_version.VersionTestCase.test_cmp -*distutils.tests.test_version.VersionTestCase.test_cmp_strict -*distutils.tests.test_version.VersionTestCase.test_prerelease +DocTestCase.distutils.versionpredicate.VersionPredicate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.distutils.versionpredicate.split_provision @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_check_archive_formats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_compress_deprecated @ darwin-arm64,darwin-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive_bztar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive_gztar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive_owner_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive_tar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive_xztar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_tarball @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_tarball_bzip2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_tarball_extended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_tarball_gzip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_tarball_latin1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_tarball_xz @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_zipfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_zipfile_no_zlib @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_tarfile_vs_tar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_bdist.BuildTestCase.test_formats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_bdist.BuildTestCase.test_skip_build @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_bdist_dumb.BuildDumbTestCase.test_simple_built @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_bdist_rpm.BuildRpmTestCase.test_no_optimize_flag @ linux-aarch64,linux-x86_64 +distutils.tests.test_bdist_rpm.BuildRpmTestCase.test_quiet @ linux-aarch64,linux-x86_64 +distutils.tests.test_build.BuildTestCase.test_finalize_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_clib.BuildCLibTestCase.test_build_libraries @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_clib.BuildCLibTestCase.test_check_library_dist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_clib.BuildCLibTestCase.test_finalize_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_clib.BuildCLibTestCase.test_get_source_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_clib.BuildCLibTestCase.test_run @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_build_ext.BuildExtTestCase.test_check_extensions_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.BuildExtTestCase.test_compiler_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.BuildExtTestCase.test_deployment_target_default @ darwin-arm64,darwin-x86_64 +distutils.tests.test_build_ext.BuildExtTestCase.test_deployment_target_higher_ok @ darwin-arm64,darwin-x86_64 +distutils.tests.test_build_ext.BuildExtTestCase.test_deployment_target_too_low @ darwin-arm64,darwin-x86_64 +distutils.tests.test_build_ext.BuildExtTestCase.test_ext_fullpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.BuildExtTestCase.test_finalize_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.BuildExtTestCase.test_get_outputs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.BuildExtTestCase.test_get_source_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.BuildExtTestCase.test_optional_extension @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.BuildExtTestCase.test_solaris_enable_shared @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.BuildExtTestCase.test_unicode_module_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.BuildExtTestCase.test_user_site @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_check_extensions_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_compiler_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_deployment_target_default @ darwin-arm64,darwin-x86_64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_deployment_target_higher_ok @ darwin-arm64,darwin-x86_64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_deployment_target_too_low @ darwin-arm64,darwin-x86_64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_ext_fullpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_finalize_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_get_outputs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_get_source_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_optional_extension @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_solaris_enable_shared @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_unicode_module_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_user_site @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_py.BuildPyTestCase.test_byte_compile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_py.BuildPyTestCase.test_byte_compile_optimized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_py.BuildPyTestCase.test_dir_in_package_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_py.BuildPyTestCase.test_dont_write_bytecode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_py.BuildPyTestCase.test_empty_package_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_py.BuildPyTestCase.test_package_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_scripts.BuildScriptsTestCase.test_build @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_scripts.BuildScriptsTestCase.test_default_settings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_build_scripts.BuildScriptsTestCase.test_version_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_check.CheckTestCase.test_check_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_check.CheckTestCase.test_check_metadata @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_clean.cleanTestCase.test_simple_run @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_cmd.CommandTestCase.test_debug_print @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_cmd.CommandTestCase.test_dump_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_cmd.CommandTestCase.test_ensure_dirname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_cmd.CommandTestCase.test_ensure_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_cmd.CommandTestCase.test_ensure_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_cmd.CommandTestCase.test_ensure_string_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_cmd.CommandTestCase.test_make_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_config.PyPIRCCommandTestCase.test_config_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_config.PyPIRCCommandTestCase.test_server_empty_registration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_config.PyPIRCCommandTestCase.test_server_registration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_config_cmd.ConfigTestCase.test_clean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_config_cmd.ConfigTestCase.test_dump_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_config_cmd.ConfigTestCase.test_finalize_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_config_cmd.ConfigTestCase.test_search_cpp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_core.CoreTestCase.test_debug_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_core.CoreTestCase.test_run_setup_defines_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_core.CoreTestCase.test_run_setup_preserves_sys_argv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_core.CoreTestCase.test_run_setup_provides_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_core.CoreTestCase.test_run_setup_uses_current_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_cygwinccompiler.CygwinCCompilerTestCase.test_check_config_h @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_cygwinccompiler.CygwinCCompilerTestCase.test_get_msvcr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_cygwinccompiler.CygwinCCompilerTestCase.test_get_versions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dep_util.DepUtilTestCase.test_newer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dep_util.DepUtilTestCase.test_newer_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dep_util.DepUtilTestCase.test_newer_pairwise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dir_util.DirUtilTestCase.test_copy_tree_exception_in_listdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dir_util.DirUtilTestCase.test_copy_tree_skips_nfs_temp_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dir_util.DirUtilTestCase.test_copy_tree_verbosity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dir_util.DirUtilTestCase.test_create_tree_verbosity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dir_util.DirUtilTestCase.test_ensure_relative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dir_util.DirUtilTestCase.test_mkpath_remove_tree_verbosity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dir_util.DirUtilTestCase.test_mkpath_with_custom_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_dist.DistributionTestCase.test_announce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.DistributionTestCase.test_command_packages_cmdline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.DistributionTestCase.test_command_packages_configfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.DistributionTestCase.test_command_packages_unspecified @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.DistributionTestCase.test_empty_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.DistributionTestCase.test_finalize_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.DistributionTestCase.test_find_config_files_disable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.DistributionTestCase.test_get_command_packages @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.DistributionTestCase.test_venv_install_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_classifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_classifier_invalid_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_custom_pydistutils @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_download_url @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_fix_help_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_keywords_invalid_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_long_description @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_obsoletes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_obsoletes_illegal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_obsoletes_to_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_platforms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_platforms_invalid_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_provides @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_provides_illegal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_read_metadata @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_requires @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_requires_illegal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_requires_to_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_show_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_dist.MetadataTestCase.test_simple_metadata @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_extension.ExtensionTestCase.test_extension_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_extension.ExtensionTestCase.test_read_setup_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_file_util.FileUtilTestCase.test_copy_file_hard_link @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_file_util.FileUtilTestCase.test_copy_file_hard_link_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_file_util.FileUtilTestCase.test_move_file_exception_unpacking_rename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_file_util.FileUtilTestCase.test_move_file_exception_unpacking_unlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_file_util.FileUtilTestCase.test_move_file_verbosity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_filelist.FileListTestCase.test_debug_print @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_filelist.FileListTestCase.test_exclude_pattern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_filelist.FileListTestCase.test_glob_to_re @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_filelist.FileListTestCase.test_include_pattern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_filelist.FileListTestCase.test_process_template @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_filelist.FileListTestCase.test_process_template_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_filelist.FileListTestCase.test_remove_duplicates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_filelist.FileListTestCase.test_set_allfiles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_filelist.FileListTestCase.test_translate_pattern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_filelist.FindAllTestCase.test_basic_discovery @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_filelist.FindAllTestCase.test_missing_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_filelist.FindAllTestCase.test_non_local_discovery @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_install.InstallTestCase.test_debug_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_install.InstallTestCase.test_finalize_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_install.InstallTestCase.test_handle_extra_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_install.InstallTestCase.test_home_installation_scheme @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_install.InstallTestCase.test_record @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_install.InstallTestCase.test_user_site @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_install_data.InstallDataTestCase.test_simple_run @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_install_headers.InstallHeadersTestCase.test_simple_run @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_install_lib.InstallLibTestCase.test_byte_compile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_install_lib.InstallLibTestCase.test_dont_write_bytecode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_install_lib.InstallLibTestCase.test_finalize_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_install_lib.InstallLibTestCase.test_get_inputs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_install_lib.InstallLibTestCase.test_get_outputs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_install_scripts.InstallScriptsTestCase.test_default_settings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_install_scripts.InstallScriptsTestCase.test_installation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_log.TestLog.test_non_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_msvc9compiler.msvc9compilerTestCase.test_no_compiler @ win32-AMD64 +distutils.tests.test_msvc9compiler.msvc9compilerTestCase.test_remove_entire_manifest @ win32-AMD64 +distutils.tests.test_msvc9compiler.msvc9compilerTestCase.test_remove_visual_c_ref @ win32-AMD64 +distutils.tests.test_register.RegisterTestCase.test_check_metadata_deprecated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_register.RegisterTestCase.test_create_pypirc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_register.RegisterTestCase.test_list_classifiers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_register.RegisterTestCase.test_password_not_in_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_register.RegisterTestCase.test_password_reset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_register.RegisterTestCase.test_registering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_register.RegisterTestCase.test_show_response @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_sdist.SDistTestCase.test_add_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_sdist.SDistTestCase.test_check_metadata_deprecated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_sdist.SDistTestCase.test_finalize_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_sdist.SDistTestCase.test_get_file_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_invalid_template_unknown_command @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_sdist.SDistTestCase.test_invalid_template_wrong_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_sdist.SDistTestCase.test_invalid_template_wrong_path @ win32-AMD64 +distutils.tests.test_sdist.SDistTestCase.test_make_distribution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_manifest_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_manifest_marker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_manual_manifest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_metadata_check_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_prune_file_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_sdist.SDistTestCase.test_show_formats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_spawn.SpawnTestCase.test_find_executable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_spawn.SpawnTestCase.test_spawn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_spawn.SpawnTestCase.test_spawn_missing_exe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_customize_compiler_before_get_config_vars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_get_config_h_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_get_config_vars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_get_python_lib @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_parse_makefile_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_parse_makefile_literal_dollar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_srcdir @ win32-AMD64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_srcdir_independent_of_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_sysconfig_compiler_vars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_sysconfig_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_text_file.TextFileTestCase.test_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_unixccompiler.UnixCCompilerTestCase.test_osx_cc_overrides_ldshared @ darwin-arm64,darwin-x86_64 +distutils.tests.test_unixccompiler.UnixCCompilerTestCase.test_osx_explicit_ldshared @ darwin-arm64,darwin-x86_64 +distutils.tests.test_unixccompiler.UnixCCompilerTestCase.test_runtime_libdir_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_upload.uploadTestCase.test_finalize_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_upload.uploadTestCase.test_saved_password @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_upload.uploadTestCase.test_upload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_upload.uploadTestCase.test_upload_correct_cr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_upload.uploadTestCase.test_upload_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_upload.uploadTestCase.test_wrong_exception_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_util.UtilTestCase.test_change_root @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_util.UtilTestCase.test_check_environ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_util.UtilTestCase.test_check_environ_getpwuid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +distutils.tests.test_util.UtilTestCase.test_convert_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_util.UtilTestCase.test_dont_write_bytecode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_util.UtilTestCase.test_get_platform @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_util.UtilTestCase.test_grok_environment_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_util.UtilTestCase.test_rfc822_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_util.UtilTestCase.test_split_quoted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_util.UtilTestCase.test_strtobool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_version.VersionTestCase.test_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_version.VersionTestCase.test_cmp_strict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +distutils.tests.test_version.VersionTestCase.test_prerelease @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_doctest.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_doctest.txt index 2a015e8984..7a0e79daa9 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_doctest.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_doctest.txt @@ -1,2 +1,17 @@ -*graalpython.lib-python.3.test.test_doctest.TestDocTestFinder.test_empty_namespace_package -*graalpython.lib-python.3.test.test_doctest.TestDocTestFinder.test_issue35753 +DocTestCase.doctest.DebugRunner @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.doctest.DocTestCase.debug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.doctest.DocTestRunner @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.doctest._TestClass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.doctest._TestClass.__init__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.doctest._TestClass.get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.doctest._TestClass.square @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.doctest.__test__.blank lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.doctest.__test__.bool-int equivalence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.doctest.__test__.ellipsis @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.doctest.__test__.string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.doctest.__test__.whitespace normalization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.doctest._ellipsis_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.doctest.script_from_examples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.doctest.set_unittest_reportflags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_doctest.TestDocTestFinder.test_empty_namespace_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_doctest.TestDocTestFinder.test_issue35753 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_doctest2.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_doctest2.txt index 97e81915ae..e594b7f762 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_doctest2.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_doctest2.txt @@ -1,2 +1 @@ -*graalpython.lib-python.3.test.test_doctest2.Test.test_testmod -*graalpython.lib-python.3.test.test_doctest2.TestMain.test_main +test.test_doctest2.Test.test_testmod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_docxmlrpc.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_docxmlrpc.txt new file mode 100644 index 0000000000..b486fd14ad --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_docxmlrpc.txt @@ -0,0 +1,9 @@ +test.test_docxmlrpc.DocXMLRPCHTTPGETServer.test_annotations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_docxmlrpc.DocXMLRPCHTTPGETServer.test_autolink_dotted_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_docxmlrpc.DocXMLRPCHTTPGETServer.test_autolinking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_docxmlrpc.DocXMLRPCHTTPGETServer.test_get_css @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_docxmlrpc.DocXMLRPCHTTPGETServer.test_invalid_get_response @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_docxmlrpc.DocXMLRPCHTTPGETServer.test_lambda @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_docxmlrpc.DocXMLRPCHTTPGETServer.test_server_title_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_docxmlrpc.DocXMLRPCHTTPGETServer.test_system_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_docxmlrpc.DocXMLRPCHTTPGETServer.test_valid_get_response @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dtrace.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dtrace.txt index 30d087e77e..55d9dff602 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dtrace.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dtrace.txt @@ -1 +1 @@ -*graalpython.lib-python.3.test.test_dtrace.TestMain.test_main +test.test_dtrace.TestMain.test_main @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dynamic.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dynamic.txt index 9c09418fe9..a2b65c43b1 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dynamic.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dynamic.txt @@ -1,11 +1,11 @@ -*graalpython.lib-python.3.test.test_dynamic.RebindBuiltinsTests.test_cannot_change_globals_or_builtins_with_eval -*graalpython.lib-python.3.test.test_dynamic.RebindBuiltinsTests.test_cannot_change_globals_or_builtins_with_exec -*graalpython.lib-python.3.test.test_dynamic.RebindBuiltinsTests.test_cannot_replace_builtins_dict_between_calls -*graalpython.lib-python.3.test.test_dynamic.RebindBuiltinsTests.test_cannot_replace_builtins_dict_while_active -*graalpython.lib-python.3.test.test_dynamic.RebindBuiltinsTests.test_eval_gives_lambda_custom_globals -*graalpython.lib-python.3.test.test_dynamic.RebindBuiltinsTests.test_globals_shadow_builtins -*graalpython.lib-python.3.test.test_dynamic.RebindBuiltinsTests.test_load_global_specialization_failure_keeps_oparg -*graalpython.lib-python.3.test.test_dynamic.RebindBuiltinsTests.test_modify_builtins -*graalpython.lib-python.3.test.test_dynamic.RebindBuiltinsTests.test_modify_builtins_from_leaf_function -*graalpython.lib-python.3.test.test_dynamic.RebindBuiltinsTests.test_modify_builtins_while_generator_active -*graalpython.lib-python.3.test.test_dynamic.TestTracing.test_after_specialization +test.test_dynamic.RebindBuiltinsTests.test_cannot_change_globals_or_builtins_with_eval @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamic.RebindBuiltinsTests.test_cannot_change_globals_or_builtins_with_exec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamic.RebindBuiltinsTests.test_cannot_replace_builtins_dict_between_calls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamic.RebindBuiltinsTests.test_cannot_replace_builtins_dict_while_active @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamic.RebindBuiltinsTests.test_eval_gives_lambda_custom_globals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamic.RebindBuiltinsTests.test_globals_shadow_builtins @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamic.RebindBuiltinsTests.test_load_global_specialization_failure_keeps_oparg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamic.RebindBuiltinsTests.test_modify_builtins @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamic.RebindBuiltinsTests.test_modify_builtins_from_leaf_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamic.RebindBuiltinsTests.test_modify_builtins_while_generator_active @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamic.TestTracing.test_after_specialization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dynamicclassattribute.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dynamicclassattribute.txt index 5fb7d5b5c3..98b1410a90 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dynamicclassattribute.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_dynamicclassattribute.txt @@ -1,12 +1,11 @@ -*graalpython.lib-python.3.test.test_dynamicclassattribute.PropertySubclassTests.test_docstring_copy -*graalpython.lib-python.3.test.test_dynamicclassattribute.PropertySubclassTests.test_property_new_getter_new_docstring -*graalpython.lib-python.3.test.test_dynamicclassattribute.PropertySubclassTests.test_property_setter_copies_getter_docstring -*graalpython.lib-python.3.test.test_dynamicclassattribute.PropertySubclassTests.test_slots_docstring_copy_exception -*graalpython.lib-python.3.test.test_dynamicclassattribute.PropertyTests.test_abstract_virtual -*graalpython.lib-python.3.test.test_dynamicclassattribute.PropertyTests.test_property___isabstractmethod__descriptor -*graalpython.lib-python.3.test.test_dynamicclassattribute.PropertyTests.test_property_decorator_baseclass -*graalpython.lib-python.3.test.test_dynamicclassattribute.PropertyTests.test_property_decorator_baseclass_doc -*graalpython.lib-python.3.test.test_dynamicclassattribute.PropertyTests.test_property_decorator_doc -*graalpython.lib-python.3.test.test_dynamicclassattribute.PropertyTests.test_property_decorator_subclass -*graalpython.lib-python.3.test.test_dynamicclassattribute.PropertyTests.test_property_decorator_subclass_doc -*graalpython.lib-python.3.test.test_dynamicclassattribute.PropertyTests.test_property_getter_doc_override +test.test_dynamicclassattribute.PropertySubclassTests.test_docstring_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamicclassattribute.PropertySubclassTests.test_property_new_getter_new_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamicclassattribute.PropertySubclassTests.test_property_setter_copies_getter_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamicclassattribute.PropertyTests.test_abstract_virtual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamicclassattribute.PropertyTests.test_property___isabstractmethod__descriptor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamicclassattribute.PropertyTests.test_property_decorator_baseclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamicclassattribute.PropertyTests.test_property_decorator_baseclass_doc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamicclassattribute.PropertyTests.test_property_decorator_doc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamicclassattribute.PropertyTests.test_property_decorator_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamicclassattribute.PropertyTests.test_property_decorator_subclass_doc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_dynamicclassattribute.PropertyTests.test_property_getter_doc_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_email.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_email.txt index ed34d6344a..e1c726fcc5 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_email.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_email.txt @@ -1,1663 +1,1660 @@ -*test.test_email.test__encoded_words.TestDecode.test_b_case_ignored -*test.test_email.test__encoded_words.TestDecode.test_b_invalid_bytes_ignored_with_defect -*test.test_email.test__encoded_words.TestDecode.test_b_invalid_bytes_incorrect_padding -*test.test_email.test__encoded_words.TestDecode.test_b_padding_defect -*test.test_email.test__encoded_words.TestDecode.test_b_undecodable_bytes_ignored_with_defect -*test.test_email.test__encoded_words.TestDecode.test_non_trivial_q -*test.test_email.test__encoded_words.TestDecode.test_nonnull_lang -*test.test_email.test__encoded_words.TestDecode.test_q_case_ignored -*test.test_email.test__encoded_words.TestDecode.test_q_escaped_bytes_preserved -*test.test_email.test__encoded_words.TestDecode.test_q_nonascii -*test.test_email.test__encoded_words.TestDecode.test_simple_b -*test.test_email.test__encoded_words.TestDecode.test_simple_q -*test.test_email.test__encoded_words.TestDecode.test_unknown_8bit_charset -*test.test_email.test__encoded_words.TestDecode.test_unknown_charset -*test.test_email.test__encoded_words.TestDecode.test_wrong_format_input_raises -*test.test_email.test__encoded_words.TestDecodeB.test_invalid_character -*test.test_email.test__encoded_words.TestDecodeB.test_invalid_character_and_bad_padding -*test.test_email.test__encoded_words.TestDecodeB.test_invalid_length -*test.test_email.test__encoded_words.TestDecodeB.test_missing_padding -*test.test_email.test__encoded_words.TestDecodeB.test_simple -*test.test_email.test__encoded_words.TestDecodeQ.test_no_encoded -*test.test_email.test__encoded_words.TestDecodeQ.test_run_of_encoded -*test.test_email.test__encoded_words.TestDecodeQ.test_spaces -*test.test_email.test__encoded_words.TestEncode.test_auto_b_if_enough_unsafe -*test.test_email.test__encoded_words.TestEncode.test_auto_b_if_long_unsafe -*test.test_email.test__encoded_words.TestEncode.test_auto_q -*test.test_email.test__encoded_words.TestEncode.test_auto_q_if_long_mostly_safe -*test.test_email.test__encoded_words.TestEncode.test_auto_q_if_short_mostly_safe -*test.test_email.test__encoded_words.TestEncode.test_b -*test.test_email.test__encoded_words.TestEncode.test_lang -*test.test_email.test__encoded_words.TestEncode.test_q -*test.test_email.test__encoded_words.TestEncode.test_unknown_8bit -*test.test_email.test__encoded_words.TestEncode.test_utf8_default -*test.test_email.test__encoded_words.TestEncodeB.test_padding -*test.test_email.test__encoded_words.TestEncodeB.test_simple -*test.test_email.test__encoded_words.TestEncodeQ.test_all_safe -*test.test_email.test__encoded_words.TestEncodeQ.test_run_of_encodables -*test.test_email.test__encoded_words.TestEncodeQ.test_spaces -*test.test_email.test__header_value_parser.TestFolding.test_address_list_folding_at_commas -*test.test_email.test__header_value_parser.TestFolding.test_address_list_with_unicode_names -*test.test_email.test__header_value_parser.TestFolding.test_address_list_with_unicode_names_in_quotes -*test.test_email.test__header_value_parser.TestFolding.test_ews_combined_before_wrap -*test.test_email.test__header_value_parser.TestFolding.test_long_filename_attachment -*test.test_email.test__header_value_parser.TestFolding.test_one_ew_on_each_of_two_wrapped_lines -*test.test_email.test__header_value_parser.TestFolding.test_overlong_encodeable_is_wrapped -*test.test_email.test__header_value_parser.TestFolding.test_simple_address -*test.test_email.test__header_value_parser.TestFolding.test_simple_unstructured_folded -*test.test_email.test__header_value_parser.TestFolding.test_simple_unstructured_no_folds -*test.test_email.test__header_value_parser.TestFolding.test_split_at_whitespace_after_header_before_long_token -*test.test_email.test__header_value_parser.TestFolding.test_split_at_whitespace_before_long_token -*test.test_email.test__header_value_parser.TestFolding.test_unstructured_with_unicode_no_folds -*test.test_email.test__header_value_parser.TestParser.test__wsp_splitter_one_word -*test.test_email.test__header_value_parser.TestParser.test__wsp_splitter_two_words -*test.test_email.test__header_value_parser.TestParser.test__wsp_splitter_ws_runs -*test.test_email.test__header_value_parser.TestParser.test_encoded_word_inside_quotes -*test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_dot_atom -*test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_ends_at_special -*test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_multiple_domains -*test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_normal -*test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_quoted_strings_in_atom_list -*test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_with_cfws -*test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_with_doamin_literal -*test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_with_qouoted_string_and_cfws -*test.test_email.test__header_value_parser.TestParser.test_get_address_complex -*test.test_email.test__header_value_parser.TestParser.test_get_address_empty_group -*test.test_email.test__header_value_parser.TestParser.test_get_address_ends_at_special -*test.test_email.test__header_value_parser.TestParser.test_get_address_group -*test.test_email.test__header_value_parser.TestParser.test_get_address_invalid_mailbox_invalid -*test.test_email.test__header_value_parser.TestParser.test_get_address_list_CFWS -*test.test_email.test__header_value_parser.TestParser.test_get_address_list_group_and_mailboxes -*test.test_email.test__header_value_parser.TestParser.test_get_address_list_group_empty -*test.test_email.test__header_value_parser.TestParser.test_get_address_list_group_simple -*test.test_email.test__header_value_parser.TestParser.test_get_address_list_mailboxes_complex -*test.test_email.test__header_value_parser.TestParser.test_get_address_list_mailboxes_invalid_addresses -*test.test_email.test__header_value_parser.TestParser.test_get_address_list_mailboxes_simple -*test.test_email.test__header_value_parser.TestParser.test_get_address_list_mailboxes_two_simple -*test.test_email.test__header_value_parser.TestParser.test_get_address_quoted_local_part -*test.test_email.test__header_value_parser.TestParser.test_get_address_quoted_strings_in_atom_list -*test.test_email.test__header_value_parser.TestParser.test_get_address_rfc2047_display_name -*test.test_email.test__header_value_parser.TestParser.test_get_address_simple -*test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_empty -*test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_ends_at_special -*test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_internal_cfws -*test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_missing_closing_angle -*test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_missing_closing_angle_with_cfws -*test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_no_angle_before_special_raises -*test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_no_angle_raise -*test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_no_angle_raises -*test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_obs_route -*test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_qs_and_domain_literal -*test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_qs_only_quotes -*test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_simple -*test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_special_after_angle_raises -*test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_with_cfws -*test.test_email.test__header_value_parser.TestParser.test_get_atext_all_atext -*test.test_email.test__header_value_parser.TestParser.test_get_atext_following_wsp_preserved -*test.test_email.test__header_value_parser.TestParser.test_get_atext_non_printables -*test.test_email.test__header_value_parser.TestParser.test_get_atext_only -*test.test_email.test__header_value_parser.TestParser.test_get_atext_two_words_gets_first -*test.test_email.test__header_value_parser.TestParser.test_get_atext_up_to_special -*test.test_email.test__header_value_parser.TestParser.test_get_atom_atom_ends_at_noncfws -*test.test_email.test__header_value_parser.TestParser.test_get_atom_atom_ends_at_special -*test.test_email.test__header_value_parser.TestParser.test_get_atom_header_ends_in_comment -*test.test_email.test__header_value_parser.TestParser.test_get_atom_no_atom -*test.test_email.test__header_value_parser.TestParser.test_get_atom_no_atom_before_special -*test.test_email.test__header_value_parser.TestParser.test_get_atom_non_printable_in_atext -*test.test_email.test__header_value_parser.TestParser.test_get_atom_non_printable_in_comment -*test.test_email.test__header_value_parser.TestParser.test_get_atom_only -*test.test_email.test__header_value_parser.TestParser.test_get_atom_rfc2047_atom -*test.test_email.test__header_value_parser.TestParser.test_get_atom_with_comments_and_wsp -*test.test_email.test__header_value_parser.TestParser.test_get_atom_with_multiple_comments -*test.test_email.test__header_value_parser.TestParser.test_get_atom_with_wsp -*test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_empty_quotes -*test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_end_dquote_mid_word -*test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_following_wsp_preserved -*test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_missing_endquotes -*test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_multiple_words -*test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_multiple_words_wsp_preserved -*test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_must_start_with_dquote -*test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_no_end_dquote -*test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_non_printables -*test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_only -*test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_only_quotes -*test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_quoted_dquote -*test.test_email.test__header_value_parser.TestParser.test_get_cfws_ends_at_non_leader -*test.test_email.test__header_value_parser.TestParser.test_get_cfws_ends_at_non_printable -*test.test_email.test__header_value_parser.TestParser.test_get_cfws_header_ends_in_comment -*test.test_email.test__header_value_parser.TestParser.test_get_cfws_multiple_nested_comments -*test.test_email.test__header_value_parser.TestParser.test_get_cfws_non_printable_in_comment -*test.test_email.test__header_value_parser.TestParser.test_get_cfws_only_comment -*test.test_email.test__header_value_parser.TestParser.test_get_cfws_only_mixed -*test.test_email.test__header_value_parser.TestParser.test_get_cfws_only_ws -*test.test_email.test__header_value_parser.TestParser.test_get_comment_empty_comment -*test.test_email.test__header_value_parser.TestParser.test_get_comment_end_paren_mid_word -*test.test_email.test__header_value_parser.TestParser.test_get_comment_following_wsp_preserved -*test.test_email.test__header_value_parser.TestParser.test_get_comment_missing_end_of_nesting -*test.test_email.test__header_value_parser.TestParser.test_get_comment_multiple_nesting -*test.test_email.test__header_value_parser.TestParser.test_get_comment_multiple_words -*test.test_email.test__header_value_parser.TestParser.test_get_comment_multiple_words_wsp_preserved -*test.test_email.test__header_value_parser.TestParser.test_get_comment_must_start_with_paren -*test.test_email.test__header_value_parser.TestParser.test_get_comment_nested_comment -*test.test_email.test__header_value_parser.TestParser.test_get_comment_nested_comment_wsp -*test.test_email.test__header_value_parser.TestParser.test_get_comment_no_end_paren -*test.test_email.test__header_value_parser.TestParser.test_get_comment_non_printable -*test.test_email.test__header_value_parser.TestParser.test_get_comment_only -*test.test_email.test__header_value_parser.TestParser.test_get_comment_qs_in_nested_comment -*test.test_email.test__header_value_parser.TestParser.test_get_comment_quoted_parens -*test.test_email.test__header_value_parser.TestParser.test_get_display_name_complex1 -*test.test_email.test__header_value_parser.TestParser.test_get_display_name_complex2 -*test.test_email.test__header_value_parser.TestParser.test_get_display_name_ending_with_obsolete -*test.test_email.test__header_value_parser.TestParser.test_get_display_name_for_invalid_address_field -*test.test_email.test__header_value_parser.TestParser.test_get_display_name_obsolete -*test.test_email.test__header_value_parser.TestParser.test_get_display_name_pharse_must_start_with_word -*test.test_email.test__header_value_parser.TestParser.test_get_display_name_simple -*test.test_email.test__header_value_parser.TestParser.test_get_domain_domain_literal_only -*test.test_email.test__header_value_parser.TestParser.test_get_domain_domain_literal_with_cfws -*test.test_email.test__header_value_parser.TestParser.test_get_domain_domain_literal_with_cfws_ends_at_special -*test.test_email.test__header_value_parser.TestParser.test_get_domain_domain_with_cfws_ends_at_special -*test.test_email.test__header_value_parser.TestParser.test_get_domain_literal_bad_dtext_char_before_special_raises -*test.test_email.test__header_value_parser.TestParser.test_get_domain_literal_no_start_char_before_special_raises -*test.test_email.test__header_value_parser.TestParser.test_get_domain_literal_no_start_char_raises -*test.test_email.test__header_value_parser.TestParser.test_get_domain_literal_only -*test.test_email.test__header_value_parser.TestParser.test_get_domain_literal_with_internal_ws -*test.test_email.test__header_value_parser.TestParser.test_get_domain_literal_with_surrounding_cfws -*test.test_email.test__header_value_parser.TestParser.test_get_domain_no_atom_raises -*test.test_email.test__header_value_parser.TestParser.test_get_domain_no_non_cfws_raises -*test.test_email.test__header_value_parser.TestParser.test_get_domain_obsolete -*test.test_email.test__header_value_parser.TestParser.test_get_domain_regular_domain_only -*test.test_email.test__header_value_parser.TestParser.test_get_domain_with_cfws -*test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_leading_dot_raises -*test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_no_atom_raises -*test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_only -*test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_rfc2047_atom -*test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_space_ends_dot_atom -*test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text -*test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text_lone_atom_is_valid -*test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text_raises_on_leading_dot -*test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text_raises_on_leading_non_atext -*test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text_raises_on_trailing_dot -*test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text_trailing_text_preserved -*test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text_trailing_ws_preserved -*test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_trailing_dot_raises -*test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_two_dots_raises -*test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_with_comments_and_wsp -*test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_with_wsp -*test.test_email.test__header_value_parser.TestParser.test_get_dtext_all_dtext -*test.test_email.test__header_value_parser.TestParser.test_get_dtext_close_bracket_mid_word -*test.test_email.test__header_value_parser.TestParser.test_get_dtext_following_wsp_preserved -*test.test_email.test__header_value_parser.TestParser.test_get_dtext_non_printables -*test.test_email.test__header_value_parser.TestParser.test_get_dtext_only -*test.test_email.test__header_value_parser.TestParser.test_get_dtext_open_bracket_mid_word -*test.test_email.test__header_value_parser.TestParser.test_get_dtext_two_words_gets_first -*test.test_email.test__header_value_parser.TestParser.test_get_dtext_up_to_close_bracket_only -*test.test_email.test__header_value_parser.TestParser.test_get_dtext_up_to_open_bracket_only -*test.test_email.test__header_value_parser.TestParser.test_get_dtext_with_qp -*test.test_email.test__header_value_parser.TestParser.test_get_dtext_wsp_before_close_bracket_preserved -*test.test_email.test__header_value_parser.TestParser.test_get_dtext_wsp_before_open_bracket_preserved -*test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_gets_first -*test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_gets_first_even_if_no_space -*test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_internal_spaces -*test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_invalid_cte -*test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_lang_default_is_blank -*test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_leading_internal_space -*test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_missing_end_raises -*test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_missing_middle_raises -*test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_missing_start_raises -*test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_non_printable_defect -*test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_quopri_utf_escape_follows_cte -*test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_sets_extra_attributes -*test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_valid_ew -*test.test_email.test__header_value_parser.TestParser.test_get_fws_only -*test.test_email.test__header_value_parser.TestParser.test_get_fws_space -*test.test_email.test__header_value_parser.TestParser.test_get_fws_ws_run -*test.test_email.test__header_value_parser.TestParser.test_get_group_cfws_only -*test.test_email.test__header_value_parser.TestParser.test_get_group_empty -*test.test_email.test__header_value_parser.TestParser.test_get_group_list_cfws_only -*test.test_email.test__header_value_parser.TestParser.test_get_group_list_comment_only_invalid -*test.test_email.test__header_value_parser.TestParser.test_get_group_list_mailbox_list -*test.test_email.test__header_value_parser.TestParser.test_get_group_list_obs_group_list -*test.test_email.test__header_value_parser.TestParser.test_get_group_missing_final_semicol -*test.test_email.test__header_value_parser.TestParser.test_get_group_mixed_list -*test.test_email.test__header_value_parser.TestParser.test_get_group_null_addr_spec -*test.test_email.test__header_value_parser.TestParser.test_get_group_one_invalid -*test.test_email.test__header_value_parser.TestParser.test_get_group_single_mailbox -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_complex_obsolete_1 -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_complex_obsolete_invalid -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_double_dot_raises -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_leading_dot -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_leading_dot_after_ws -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_no_part_raises -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_quoted_strings_in_atom_list -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_quoted_with_cfws -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_quoted_with_whitespace -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_simple -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_simple_obsolete -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_simple_quoted -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_special_instead_raises -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_trailing_dot -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_trailing_dot_with_ws -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_unicode_defect -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_valid_and_invalid_qp_in_atom_list -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_with_cfws -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_with_dot -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_with_quoted_dot -*test.test_email.test__header_value_parser.TestParser.test_get_local_part_with_whitespace -*test.test_email.test__header_value_parser.TestParser.test_get_mailbox_addr_spec_only -*test.test_email.test__header_value_parser.TestParser.test_get_mailbox_angle_addr_only -*test.test_email.test__header_value_parser.TestParser.test_get_mailbox_ends_at_special -*test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_empty_list_element -*test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_junk_after_valid_address -*test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_only_empty_elements -*test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_single_addr -*test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_two_complex -*test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_two_name_addr -*test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_two_simple_addr -*test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_unparseable_mailbox_null -*test.test_email.test__header_value_parser.TestParser.test_get_mailbox_name_addr -*test.test_email.test__header_value_parser.TestParser.test_get_mailbox_quoted_strings_in_atom_list -*test.test_email.test__header_value_parser.TestParser.test_get_msg_id_empty -*test.test_email.test__header_value_parser.TestParser.test_get_msg_id_invalid_expected_msg_id_not_found -*test.test_email.test__header_value_parser.TestParser.test_get_msg_id_no_angle_end -*test.test_email.test__header_value_parser.TestParser.test_get_msg_id_no_angle_start -*test.test_email.test__header_value_parser.TestParser.test_get_msg_id_no_id_right_part -*test.test_email.test__header_value_parser.TestParser.test_get_msg_id_non_folding_literal_domain -*test.test_email.test__header_value_parser.TestParser.test_get_msg_id_obsolete_domain_part -*test.test_email.test__header_value_parser.TestParser.test_get_msg_id_obsolete_local -*test.test_email.test__header_value_parser.TestParser.test_get_msg_id_valid -*test.test_email.test__header_value_parser.TestParser.test_get_name_addr_angle_addr_only -*test.test_email.test__header_value_parser.TestParser.test_get_name_addr_atom_name -*test.test_email.test__header_value_parser.TestParser.test_get_name_addr_atom_name_with_cfws -*test.test_email.test__header_value_parser.TestParser.test_get_name_addr_ends_at_special -*test.test_email.test__header_value_parser.TestParser.test_get_name_addr_name_with_cfws_and_dots -*test.test_email.test__header_value_parser.TestParser.test_get_name_addr_no_angle_after_display_name_raises -*test.test_email.test__header_value_parser.TestParser.test_get_name_addr_no_content_before_special_raises -*test.test_email.test__header_value_parser.TestParser.test_get_name_addr_no_content_raises -*test.test_email.test__header_value_parser.TestParser.test_get_name_addr_qs_name -*test.test_email.test__header_value_parser.TestParser.test_get_name_addr_with_route -*test.test_email.test__header_value_parser.TestParser.test_get_obs_route_complex -*test.test_email.test__header_value_parser.TestParser.test_get_obs_route_no_route_before_end_raises -*test.test_email.test__header_value_parser.TestParser.test_get_obs_route_no_route_before_special_raises -*test.test_email.test__header_value_parser.TestParser.test_get_obs_route_no_route_before_special_raises2 -*test.test_email.test__header_value_parser.TestParser.test_get_obs_route_simple -*test.test_email.test__header_value_parser.TestParser.test_get_phrase_complex -*test.test_email.test__header_value_parser.TestParser.test_get_phrase_ending_with_obsolete -*test.test_email.test__header_value_parser.TestParser.test_get_phrase_obsolete -*test.test_email.test__header_value_parser.TestParser.test_get_phrase_pharse_must_start_with_word -*test.test_email.test__header_value_parser.TestParser.test_get_phrase_simple -*test.test_email.test__header_value_parser.TestParser.test_get_qcontent_all_printables -*test.test_email.test__header_value_parser.TestParser.test_get_qcontent_close_paren_mid_word -*test.test_email.test__header_value_parser.TestParser.test_get_qcontent_following_wsp_preserved -*test.test_email.test__header_value_parser.TestParser.test_get_qcontent_non_printables -*test.test_email.test__header_value_parser.TestParser.test_get_qcontent_only -*test.test_email.test__header_value_parser.TestParser.test_get_qcontent_two_words_gets_first -*test.test_email.test__header_value_parser.TestParser.test_get_qcontent_up_to_dquote_only -*test.test_email.test__header_value_parser.TestParser.test_get_qcontent_wsp_before_close_paren_preserved -*test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_all_printables -*test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_close_paren_mid_word -*test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_following_wsp_preserved -*test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_non_printables -*test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_only -*test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_open_paren_mid_word -*test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_two_words_gets_first -*test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_up_to_close_paren_only -*test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_up_to_open_paren_only -*test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_wsp_before_close_paren_preserved -*test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_wsp_before_open_paren_preserved -*test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_header_ends_in_comment -*test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_header_ends_in_qcontent -*test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_internal_ws -*test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_no_quoted_string -*test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_non_printable_in_comment -*test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_non_printable_in_qcontent -*test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_only -*test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_qs_ends_at_noncfws -*test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_with_comments_and_wsp -*test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_with_multiple_comments -*test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_with_wsp -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_ew_with_internal_leading_ws -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_ew_with_internal_ws -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_ew_without_leading_whitespace -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_ew_without_trailing_whitespace -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invaild_ew -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invalid_base64_character -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invalid_base64_character_and_bad_padding -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invalid_base64_length -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invalid_ew -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invalid_ew2 -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invalid_ew_cte -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_leading_and_trailing_whitespace -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_leading_whitespace -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_missing_base64_padding -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_no_whitespace_between_ews -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_normal_phrase -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_normal_phrase_with_whitespace -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_null -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_one_ew_trailing_ws -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_one_valid_ew_no_ws -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_one_valid_ew_trailing_text -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_one_word -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_phrase_with_ew_in_middle_of_text -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_phrase_with_ew_with_leading_ws -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_phrase_with_two_ew -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_phrase_with_two_ew_extra_ws -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_phrase_with_two_ew_trailing_ws -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_trailing_whitespace -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_two_ew_extra_ws_trailing_text -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_undecodable_bytes -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_undecodable_bytes_in_EW -*test.test_email.test__header_value_parser.TestParser.test_get_unstructured_without_trailing_whitespace_hang_case -*test.test_email.test__header_value_parser.TestParser.test_get_word_all_CFWS -*test.test_email.test__header_value_parser.TestParser.test_get_word_atom_yields_atom -*test.test_email.test__header_value_parser.TestParser.test_get_word_ends_at_dot -*test.test_email.test__header_value_parser.TestParser.test_get_word_qs_yields_qs -*test.test_email.test__header_value_parser.TestParser.test_invalid_content_disposition -*test.test_email.test__header_value_parser.TestParser.test_invalid_content_transfer_encoding -*test.test_email.test__header_value_parser.TestParser.test_parse_invalid_message_id -*test.test_email.test__header_value_parser.TestParser.test_parse_message_id_with_remaining -*test.test_email.test__header_value_parser.TestParser.test_parse_valid_message_id -*test.test_email.test__header_value_parser.TestTokens.test_EWWhiteSpaceTerminal -*test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_duplicate_and_missing_split_value -*test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_duplicate_in_split_value -*test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_duplicate_key -*test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_duplicate_key_with_split_value -*test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_duplicate_key_with_split_value_other_order -*test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_duplicate_with_broken_split_value -*test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_extra_dquote -*test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_missing_split_value -*test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_multiple_keys -*test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_simple -*test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_split_value -*test.test_email.test__header_value_parser.Test_parse_mime_version.test_value_RFC_2045_2 -*test.test_email.test__header_value_parser.Test_parse_mime_version.test_value_RFC_2045_3 -*test.test_email.test__header_value_parser.Test_parse_mime_version.test_value_RFC_2045_4 -*test.test_email.test__header_value_parser.Test_parse_mime_version.test_value_empty -*test.test_email.test__header_value_parser.Test_parse_mime_version.test_value_rfc_2045_1 -*test.test_email.test_asian_codecs.TestEmailAsianCodecs.test_japanese_codecs -*test.test_email.test_asian_codecs.TestEmailAsianCodecs.test_payload_encoding -*test.test_email.test_asian_codecs.TestEmailAsianCodecs.test_payload_encoding_utf8 -*test.test_email.test_contentmanager.TestContentManager.test_get_content_key_full_type -*test.test_email.test_contentmanager.TestContentManager.test_get_content_key_maintype_only -*test.test_email.test_contentmanager.TestContentManager.test_get_content_key_null_key -*test.test_email.test_contentmanager.TestContentManager.test_get_content_key_order_full_type -*test.test_email.test_contentmanager.TestContentManager.test_get_content_key_order_maintype_only -*test.test_email.test_contentmanager.TestContentManager.test_get_content_key_order_null_key -*test.test_email.test_contentmanager.TestContentManager.test_get_content_raises_if_unknown_mimetype_and_no_default -*test.test_email.test_contentmanager.TestContentManager.test_set_content_calls_clear_content -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_base_full_path -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_base_name -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_base_qualname -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_base_type -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_full_path -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_name -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_null_key -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_base_full_path -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_base_name -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_base_qualname -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_base_type -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_full_path -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_name -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_null_key -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_qualname -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_str_full_path -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_str_name -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_str_type -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_type -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_qualname -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_str_full_path -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_str_name -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_str_type -*test.test_email.test_contentmanager.TestContentManager.test_set_content_key_type -*test.test_email.test_contentmanager.TestContentManager.test_set_content_raises_if_called_on_multipart -*test.test_email.test_contentmanager.TestContentManager.test_set_content_raises_if_unknown_type_and_no_default -*test.test_email.test_contentmanager.TestRawDataManager.test_cid_receiver_application_octet_stream -*test.test_email.test_contentmanager.TestRawDataManager.test_cid_receiver_image_jpeg -*test.test_email.test_contentmanager.TestRawDataManager.test_cid_receiver_message_external_body -*test.test_email.test_contentmanager.TestRawDataManager.test_cid_receiver_message_rfc822 -*test.test_email.test_contentmanager.TestRawDataManager.test_cid_receiver_text_html -*test.test_email.test_contentmanager.TestRawDataManager.test_cid_receiver_text_plain -*test.test_email.test_contentmanager.TestRawDataManager.test_disposition_inline_receiver_application_octet_stream -*test.test_email.test_contentmanager.TestRawDataManager.test_disposition_inline_receiver_image_jpeg -*test.test_email.test_contentmanager.TestRawDataManager.test_disposition_inline_receiver_message_external_body -*test.test_email.test_contentmanager.TestRawDataManager.test_disposition_inline_receiver_message_rfc822 -*test.test_email.test_contentmanager.TestRawDataManager.test_disposition_inline_receiver_text_html -*test.test_email.test_contentmanager.TestRawDataManager.test_disposition_inline_receiver_text_plain -*test.test_email.test_contentmanager.TestRawDataManager.test_get_message_non_rfc822_or_external_body_yields_bytes -*test.test_email.test_contentmanager.TestRawDataManager.test_get_message_rfc822_and_external_body -*test.test_email.test_contentmanager.TestRawDataManager.test_get_non_text -*test.test_email.test_contentmanager.TestRawDataManager.test_get_non_text_invalid_keyword -*test.test_email.test_contentmanager.TestRawDataManager.test_get_raises_on_multipart -*test.test_email.test_contentmanager.TestRawDataManager.test_get_text_html -*test.test_email.test_contentmanager.TestRawDataManager.test_get_text_invalid_keyword -*test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain -*test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain_bad_utf8_quoted_printable -*test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain_bad_utf8_quoted_printable_ignore_errors -*test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain_latin1 -*test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain_latin1_quoted_printable -*test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain_utf8_base64 -*test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain_utf8_base64_recoverable_bad_CTE_data -*test.test_email.test_contentmanager.TestRawDataManager.test_header_receiver_application_octet_stream -*test.test_email.test_contentmanager.TestRawDataManager.test_header_receiver_image_jpeg -*test.test_email.test_contentmanager.TestRawDataManager.test_header_receiver_message_external_body -*test.test_email.test_contentmanager.TestRawDataManager.test_header_receiver_message_rfc822 -*test.test_email.test_contentmanager.TestRawDataManager.test_header_receiver_text_html -*test.test_email.test_contentmanager.TestRawDataManager.test_header_receiver_text_plain -*test.test_email.test_contentmanager.TestRawDataManager.test_non_ascii_filename_receiver_application_octet_stream -*test.test_email.test_contentmanager.TestRawDataManager.test_non_ascii_filename_receiver_image_jpeg -*test.test_email.test_contentmanager.TestRawDataManager.test_non_ascii_filename_receiver_message_external_body -*test.test_email.test_contentmanager.TestRawDataManager.test_non_ascii_filename_receiver_message_rfc822 -*test.test_email.test_contentmanager.TestRawDataManager.test_non_ascii_filename_receiver_text_html -*test.test_email.test_contentmanager.TestRawDataManager.test_non_ascii_filename_receiver_text_plain -*test.test_email.test_contentmanager.TestRawDataManager.test_params_receiver_application_octet_stream -*test.test_email.test_contentmanager.TestRawDataManager.test_params_receiver_image_jpeg -*test.test_email.test_contentmanager.TestRawDataManager.test_params_receiver_message_external_body -*test.test_email.test_contentmanager.TestRawDataManager.test_params_receiver_message_rfc822 -*test.test_email.test_contentmanager.TestRawDataManager.test_params_receiver_text_html -*test.test_email.test_contentmanager.TestRawDataManager.test_params_receiver_text_plain -*test.test_email.test_contentmanager.TestRawDataManager.test_set_application_octet_stream_with_8bit_cte -*test.test_email.test_contentmanager.TestRawDataManager.test_set_content_bytes_cte_7bit -*test.test_email.test_contentmanager.TestRawDataManager.test_set_disposition_attachment -*test.test_email.test_contentmanager.TestRawDataManager.test_set_disposition_foo -*test.test_email.test_contentmanager.TestRawDataManager.test_set_disposition_inline -*test.test_email.test_contentmanager.TestRawDataManager.test_set_filename -*test.test_email.test_contentmanager.TestRawDataManager.test_set_filename_and_disposition_inline -*test.test_email.test_contentmanager.TestRawDataManager.test_set_headers_from_header_objects -*test.test_email.test_contentmanager.TestRawDataManager.test_set_headers_from_strings -*test.test_email.test_contentmanager.TestRawDataManager.test_set_headers_with_defective_header_header_raises -*test.test_email.test_contentmanager.TestRawDataManager.test_set_headers_with_defective_string_header_raises -*test.test_email.test_contentmanager.TestRawDataManager.test_set_headers_with_invalid_duplicate_header_header_raises -*test.test_email.test_contentmanager.TestRawDataManager.test_set_headers_with_invalid_duplicate_string_header_raises -*test.test_email.test_contentmanager.TestRawDataManager.test_set_image_jpg -*test.test_email.test_contentmanager.TestRawDataManager.test_set_message -*test.test_email.test_contentmanager.TestRawDataManager.test_set_message_invalid_cte_raises -*test.test_email.test_contentmanager.TestRawDataManager.test_set_message_with_non_ascii_and_coercion_to_7bit -*test.test_email.test_contentmanager.TestRawDataManager.test_set_non_ascii_filename -*test.test_email.test_contentmanager.TestRawDataManager.test_set_text_11_lines_long_line_maximal_non_ascii_heuristics -*test.test_email.test_contentmanager.TestRawDataManager.test_set_text_11_lines_long_line_minimal_non_ascii_heuristics -*test.test_email.test_contentmanager.TestRawDataManager.test_set_text_11_lines_maximal_non_ascii_heuristics -*test.test_email.test_contentmanager.TestRawDataManager.test_set_text_charset_latin_1 -*test.test_email.test_contentmanager.TestRawDataManager.test_set_text_html -*test.test_email.test_contentmanager.TestRawDataManager.test_set_text_long_line_maximal_non_ascii_heuristics -*test.test_email.test_contentmanager.TestRawDataManager.test_set_text_long_line_minimal_non_ascii_heuristics -*test.test_email.test_contentmanager.TestRawDataManager.test_set_text_maximal_non_ascii_heuristics -*test.test_email.test_contentmanager.TestRawDataManager.test_set_text_non_ascii_with_charset_ascii_raises -*test.test_email.test_contentmanager.TestRawDataManager.test_set_text_non_ascii_with_cte_7bit_and_charset_ascii_raises -*test.test_email.test_contentmanager.TestRawDataManager.test_set_text_non_ascii_with_cte_7bit_raises -*test.test_email.test_contentmanager.TestRawDataManager.test_set_text_plain -*test.test_email.test_contentmanager.TestRawDataManager.test_set_text_plain_long_line_heuristics -*test.test_email.test_contentmanager.TestRawDataManager.test_set_text_plain_null -*test.test_email.test_contentmanager.TestRawDataManager.test_set_text_short_line_minimal_non_ascii_heuristics -*test.test_email.test_contentmanager.TestRawDataManager.test_set_video_mpeg_with_binary_cte -*test.test_email.test_defect_handling.TestDefectCapture.test_bad_padding_in_base64_payload -*test.test_email.test_defect_handling.TestDefectCapture.test_first_line_is_continuation_header -*test.test_email.test_defect_handling.TestDefectCapture.test_invalid_chars_in_base64_payload -*test.test_email.test_defect_handling.TestDefectCapture.test_invalid_length_of_base64_payload -*test.test_email.test_defect_handling.TestDefectCapture.test_lying_multipart -*test.test_email.test_defect_handling.TestDefectCapture.test_missing_ending_boundary -*test.test_email.test_defect_handling.TestDefectCapture.test_missing_header_body_separator -*test.test_email.test_defect_handling.TestDefectCapture.test_missing_start_boundary -*test.test_email.test_defect_handling.TestDefectCapture.test_multipart_invalid_cte -*test.test_email.test_defect_handling.TestDefectCapture.test_multipart_no_boundary -*test.test_email.test_defect_handling.TestDefectCapture.test_multipart_no_cte_no_defect -*test.test_email.test_defect_handling.TestDefectCapture.test_multipart_valid_cte_no_defect -*test.test_email.test_defect_handling.TestDefectCapture.test_same_boundary_inner_outer -*test.test_email.test_defect_handling.TestDefectDetection.test_bad_padding_in_base64_payload -*test.test_email.test_defect_handling.TestDefectDetection.test_first_line_is_continuation_header -*test.test_email.test_defect_handling.TestDefectDetection.test_invalid_chars_in_base64_payload -*test.test_email.test_defect_handling.TestDefectDetection.test_invalid_length_of_base64_payload -*test.test_email.test_defect_handling.TestDefectDetection.test_lying_multipart -*test.test_email.test_defect_handling.TestDefectDetection.test_missing_ending_boundary -*test.test_email.test_defect_handling.TestDefectDetection.test_missing_header_body_separator -*test.test_email.test_defect_handling.TestDefectDetection.test_missing_start_boundary -*test.test_email.test_defect_handling.TestDefectDetection.test_multipart_invalid_cte -*test.test_email.test_defect_handling.TestDefectDetection.test_multipart_no_boundary -*test.test_email.test_defect_handling.TestDefectDetection.test_multipart_no_cte_no_defect -*test.test_email.test_defect_handling.TestDefectDetection.test_multipart_valid_cte_no_defect -*test.test_email.test_defect_handling.TestDefectDetection.test_same_boundary_inner_outer -*test.test_email.test_defect_handling.TestDefectRaising.test_bad_padding_in_base64_payload -*test.test_email.test_defect_handling.TestDefectRaising.test_first_line_is_continuation_header -*test.test_email.test_defect_handling.TestDefectRaising.test_invalid_chars_in_base64_payload -*test.test_email.test_defect_handling.TestDefectRaising.test_invalid_length_of_base64_payload -*test.test_email.test_defect_handling.TestDefectRaising.test_lying_multipart -*test.test_email.test_defect_handling.TestDefectRaising.test_missing_ending_boundary -*test.test_email.test_defect_handling.TestDefectRaising.test_missing_header_body_separator -*test.test_email.test_defect_handling.TestDefectRaising.test_missing_start_boundary -*test.test_email.test_defect_handling.TestDefectRaising.test_multipart_invalid_cte -*test.test_email.test_defect_handling.TestDefectRaising.test_multipart_no_boundary -*test.test_email.test_defect_handling.TestDefectRaising.test_multipart_no_cte_no_defect -*test.test_email.test_defect_handling.TestDefectRaising.test_multipart_valid_cte_no_defect -*test.test_email.test_defect_handling.TestDefectRaising.test_same_boundary_inner_outer -*test.test_email.test_email.Test8BitBytesHandling.test_8bit_in_base64_body -*test.test_email.test_email.Test8BitBytesHandling.test_8bit_in_quopri_body -*test.test_email.test_email.Test8BitBytesHandling.test_8bit_in_uuencode_body -*test.test_email.test_email.Test8BitBytesHandling.test_8bit_multipart -*test.test_email.test_email.Test8BitBytesHandling.test_bytes_feedparser -*test.test_email.test_email.Test8BitBytesHandling.test_bytes_generator -*test.test_email.test_email.Test8BitBytesHandling.test_bytes_generator_b_encoding_linesep -*test.test_email.test_email.Test8BitBytesHandling.test_bytes_generator_handles_None_body -*test.test_email.test_email.Test8BitBytesHandling.test_bytes_generator_with_unix_from -*test.test_email.test_email.Test8BitBytesHandling.test_crlf_flatten -*test.test_email.test_email.Test8BitBytesHandling.test_decoded_generator_emits_unicode_body -*test.test_email.test_email.Test8BitBytesHandling.test_del_rfc2231_params_with_8bit -*test.test_email.test_email.Test8BitBytesHandling.test_generator_b_encoding_linesep -*test.test_email.test_email.Test8BitBytesHandling.test_generator_handles_8bit -*test.test_email.test_email.Test8BitBytesHandling.test_get_8bit_header -*test.test_email.test_email.Test8BitBytesHandling.test_get_all_with_8bit_headers -*test.test_email.test_email.Test8BitBytesHandling.test_get_content_type_with_8bit -*test.test_email.test_email.Test8BitBytesHandling.test_get_params_with_8bit -*test.test_email.test_email.Test8BitBytesHandling.test_get_payload_with_8bit_cte_header -*test.test_email.test_email.Test8BitBytesHandling.test_get_rfc2231_params_with_8bit -*test.test_email.test_email.Test8BitBytesHandling.test_invalid_8bit_in_non_8bit_cte_uses_replace -*test.test_email.test_email.Test8BitBytesHandling.test_items_with_8bit_headers -*test.test_email.test_email.Test8BitBytesHandling.test_known_8bit_CTE -*test.test_email.test_email.Test8BitBytesHandling.test_message_from_binary_file -*test.test_email.test_email.Test8BitBytesHandling.test_print_8bit_headers -*test.test_email.test_email.Test8BitBytesHandling.test_set_rfc2231_params_with_8bit -*test.test_email.test_email.Test8BitBytesHandling.test_str_generator_should_not_mutate_msg_when_handling_8bit -*test.test_email.test_email.Test8BitBytesHandling.test_string_generator_reencodes_to_quopri_when_appropriate -*test.test_email.test_email.Test8BitBytesHandling.test_unknown_8bit_CTE -*test.test_email.test_email.Test8BitBytesHandling.test_values_with_8bit_headers -*test.test_email.test_email.TestBase64.test_decode -*test.test_email.test_email.TestBase64.test_encode -*test.test_email.test_email.TestBase64.test_header_encode -*test.test_email.test_email.TestBase64.test_len -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_MIME_digest -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_MIME_digest_with_part_headers -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_content_type -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_dsn -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_long_header -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_message_delivery_status -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_message_external_body_idempotent -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_message_signed_idempotent -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_mixed_with_image -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_more_rfc2231_parameters -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_multipart_no_parts -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_multipart_one_part -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_multipart_report -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_nested_multipart_mixeds -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_no_start_boundary -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_parse_text_message -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_parse_untyped_message -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_parser -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_preamble_epilogue -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_rfc2231_charset -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_simple_multipart -*test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_text_plain_in_a_multipart_digest -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_MIME_digest -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_MIME_digest_with_part_headers -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_content_type -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_dsn -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_long_header -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_message_delivery_status -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_message_external_body_idempotent -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_message_signed_idempotent -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_mixed_with_image -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_more_rfc2231_parameters -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_multipart_no_parts -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_multipart_one_part -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_multipart_report -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_nested_multipart_mixeds -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_no_start_boundary -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_parse_text_message -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_parse_untyped_message -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_parser -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_preamble_epilogue -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_rfc2231_charset -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_simple_multipart -*test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_text_plain_in_a_multipart_digest -*test.test_email.test_email.TestCharset.test_body_encode -*test.test_email.test_email.TestCharset.test_codec_encodeable -*test.test_email.test_email.TestCharset.test_unicode_charset_name -*test.test_email.test_email.TestEncoders.test_EncodersEncode_base64 -*test.test_email.test_email.TestEncoders.test_default_cte -*test.test_email.test_email.TestEncoders.test_encode7or8bit -*test.test_email.test_email.TestEncoders.test_encode_empty_payload -*test.test_email.test_email.TestEncoders.test_qp_encode_latin1 -*test.test_email.test_email.TestEncoders.test_qp_encode_non_latin1 -*test.test_email.test_email.TestFeedParsers.test_empty_header_name_handled -*test.test_email.test_email.TestFeedParsers.test_long_lines -*test.test_email.test_email.TestFeedParsers.test_newlines -*test.test_email.test_email.TestFromMangling.test_dont_mangle_from -*test.test_email.test_email.TestFromMangling.test_mangle_from_in_preamble_and_epilog -*test.test_email.test_email.TestFromMangling.test_mangled_from -*test.test_email.test_email.TestFromMangling.test_mangled_from_with_bad_bytes -*test.test_email.test_email.TestFromMangling.test_multipart_with_bad_bytes_in_cte -*test.test_email.test_email.TestHeader.test_bad_8bit_header -*test.test_email.test_email.TestHeader.test_base64_splittable -*test.test_email.test_email.TestHeader.test_broken_base64_header -*test.test_email.test_email.TestHeader.test_empty_header_encode -*test.test_email.test_email.TestHeader.test_encode_preserves_leading_ws_on_value -*test.test_email.test_email.TestHeader.test_encoded_adjacent_nonencoded -*test.test_email.test_email.TestHeader.test_escaped_8bit_header -*test.test_email.test_email.TestHeader.test_explicit_maxlinelen -*test.test_email.test_email.TestHeader.test_flatten_header_with_no_value -*test.test_email.test_email.TestHeader.test_header_ctor_default_args -*test.test_email.test_email.TestHeader.test_header_handles_binary_unknown8bit -*test.test_email.test_email.TestHeader.test_header_needs_no_decoding -*test.test_email.test_email.TestHeader.test_long -*test.test_email.test_email.TestHeader.test_make_header_handles_binary_unknown8bit -*test.test_email.test_email.TestHeader.test_modify_returned_list_does_not_change_header -*test.test_email.test_email.TestHeader.test_multilingual -*test.test_email.test_email.TestHeader.test_quopri_splittable -*test.test_email.test_email.TestHeader.test_shift_jis_charset -*test.test_email.test_email.TestHeader.test_simple -*test.test_email.test_email.TestHeader.test_simple_surprise -*test.test_email.test_email.TestHeader.test_string_charset -*test.test_email.test_email.TestHeader.test_us_ascii_header -*test.test_email.test_email.TestHeader.test_utf8_shortest -*test.test_email.test_email.TestHeader.test_whitespace_header -*test.test_email.test_email.TestHeader.test_whitespace_keeper -*test.test_email.test_email.TestHeaderRegistry.test_HeaderRegistry -*test.test_email.test_email.TestIdempotent.test_MIME_digest -*test.test_email.test_email.TestIdempotent.test_MIME_digest_with_part_headers -*test.test_email.test_email.TestIdempotent.test_content_type -*test.test_email.test_email.TestIdempotent.test_dsn -*test.test_email.test_email.TestIdempotent.test_long_header -*test.test_email.test_email.TestIdempotent.test_message_delivery_status -*test.test_email.test_email.TestIdempotent.test_message_external_body_idempotent -*test.test_email.test_email.TestIdempotent.test_message_signed_idempotent -*test.test_email.test_email.TestIdempotent.test_mixed_with_image -*test.test_email.test_email.TestIdempotent.test_more_rfc2231_parameters -*test.test_email.test_email.TestIdempotent.test_multipart_no_parts -*test.test_email.test_email.TestIdempotent.test_multipart_one_part -*test.test_email.test_email.TestIdempotent.test_multipart_report -*test.test_email.test_email.TestIdempotent.test_nested_multipart_mixeds -*test.test_email.test_email.TestIdempotent.test_no_start_boundary -*test.test_email.test_email.TestIdempotent.test_parse_text_message -*test.test_email.test_email.TestIdempotent.test_parse_untyped_message -*test.test_email.test_email.TestIdempotent.test_parser -*test.test_email.test_email.TestIdempotent.test_preamble_epilogue -*test.test_email.test_email.TestIdempotent.test_rfc2231_charset -*test.test_email.test_email.TestIdempotent.test_simple_multipart -*test.test_email.test_email.TestIdempotent.test_text_plain_in_a_multipart_digest -*test.test_email.test_email.TestIterators.test_body_line_iterator -*test.test_email.test_email.TestIterators.test_pushCR_LF -*test.test_email.test_email.TestIterators.test_push_random -*test.test_email.test_email.TestIterators.test_typed_subpart_iterator -*test.test_email.test_email.TestIterators.test_typed_subpart_iterator_default_type -*test.test_email.test_email.TestLongHeaders.test_another_long_almost_unsplittable_header -*test.test_email.test_email.TestLongHeaders.test_another_long_multiline_header -*test.test_email.test_email.TestLongHeaders.test_header_encode_with_different_output_charset -*test.test_email.test_email.TestLongHeaders.test_header_splitter -*test.test_email.test_email.TestLongHeaders.test_last_split_chunk_does_not_fit -*test.test_email.test_email.TestLongHeaders.test_leading_splittable_in_the_middle_just_before_overlong_last_part -*test.test_email.test_email.TestLongHeaders.test_long_8bit_header -*test.test_email.test_email.TestLongHeaders.test_long_8bit_header_no_charset -*test.test_email.test_email.TestLongHeaders.test_long_field_name -*test.test_email.test_email.TestLongHeaders.test_long_header_encode -*test.test_email.test_email.TestLongHeaders.test_long_header_encode_with_different_output_charset -*test.test_email.test_email.TestLongHeaders.test_long_header_encode_with_tab_continuation -*test.test_email.test_email.TestLongHeaders.test_long_header_encode_with_tab_continuation_is_just_a_hint -*test.test_email.test_email.TestLongHeaders.test_long_header_with_multiple_sequential_split_chars -*test.test_email.test_email.TestLongHeaders.test_long_header_with_whitespace_runs -*test.test_email.test_email.TestLongHeaders.test_long_line_after_append -*test.test_email.test_email.TestLongHeaders.test_long_lines_with_different_header -*test.test_email.test_email.TestLongHeaders.test_long_nonstring -*test.test_email.test_email.TestLongHeaders.test_long_received_header -*test.test_email.test_email.TestLongHeaders.test_long_rfc2047_header_with_embedded_fws -*test.test_email.test_email.TestLongHeaders.test_long_run_with_semi_header_splitter -*test.test_email.test_email.TestLongHeaders.test_long_to_header -*test.test_email.test_email.TestLongHeaders.test_long_unbreakable_lines_with_continuation -*test.test_email.test_email.TestLongHeaders.test_multiline_with_overlong_last_part_followed_by_split_point -*test.test_email.test_email.TestLongHeaders.test_multiline_with_overlong_parts_separated_by_two_split_points -*test.test_email.test_email.TestLongHeaders.test_multiple_splittable_leading_char_followed_by_overlong_unsplittable -*test.test_email.test_email.TestLongHeaders.test_no_semis_header_splitter -*test.test_email.test_email.TestLongHeaders.test_no_split_long_header -*test.test_email.test_email.TestLongHeaders.test_overlong_last_part_followed_by_split_point -*test.test_email.test_email.TestLongHeaders.test_shorter_line_with_append -*test.test_email.test_email.TestLongHeaders.test_split_long_continuation -*test.test_email.test_email.TestLongHeaders.test_splittable_leading_char_followed_by_overlong_unsplittable -*test.test_email.test_email.TestLongHeaders.test_splitter_split_on_punctuation_only_if_fws -*test.test_email.test_email.TestLongHeaders.test_splitter_split_on_punctuation_only_if_fws_with_header -*test.test_email.test_email.TestLongHeaders.test_splitting_first_line_only_is_long -*test.test_email.test_email.TestLongHeaders.test_splitting_multiple_long_lines -*test.test_email.test_email.TestLongHeaders.test_string_headerinst_eq -*test.test_email.test_email.TestLongHeaders.test_trailing_splittable_on_overlong_unsplittable -*test.test_email.test_email.TestLongHeaders.test_trailing_splittable_on_overlong_unsplittable_with_leading_splittable -*test.test_email.test_email.TestMIMEApplication.test_binary_body_with_encode_7or8bit -*test.test_email.test_email.TestMIMEApplication.test_binary_body_with_encode_base64 -*test.test_email.test_email.TestMIMEApplication.test_binary_body_with_encode_noop -*test.test_email.test_email.TestMIMEApplication.test_binary_body_with_encode_quopri -*test.test_email.test_email.TestMIMEApplication.test_binary_body_with_unicode_linend_encode_noop -*test.test_email.test_email.TestMIMEApplication.test_body -*test.test_email.test_email.TestMIMEApplication.test_headers -*test.test_email.test_email.TestMIMEAudio.test_add_header -*test.test_email.test_email.TestMIMEAudio.test_checkSetMinor -*test.test_email.test_email.TestMIMEAudio.test_encoding -*test.test_email.test_email.TestMIMEAudio.test_guess_minor_type -*test.test_email.test_email.TestMIMEImage.test_add_header -*test.test_email.test_email.TestMIMEImage.test_checkSetMinor -*test.test_email.test_email.TestMIMEImage.test_encoding -*test.test_email.test_email.TestMIMEImage.test_guess_minor_type -*test.test_email.test_email.TestMIMEMessage.test_bad_multipart -*test.test_email.test_email.TestMIMEMessage.test_default_multipart_constructor -*test.test_email.test_email.TestMIMEMessage.test_default_type -*test.test_email.test_email.TestMIMEMessage.test_default_type_non_parsed -*test.test_email.test_email.TestMIMEMessage.test_default_type_with_explicit_container_type -*test.test_email.test_email.TestMIMEMessage.test_dsn -*test.test_email.test_email.TestMIMEMessage.test_epilogue -*test.test_email.test_email.TestMIMEMessage.test_generate -*test.test_email.test_email.TestMIMEMessage.test_mime_attachments_in_constructor -*test.test_email.test_email.TestMIMEMessage.test_multipart_custom_policy -*test.test_email.test_email.TestMIMEMessage.test_multipart_default_policy -*test.test_email.test_email.TestMIMEMessage.test_no_nl_preamble -*test.test_email.test_email.TestMIMEMessage.test_parse_message_rfc822 -*test.test_email.test_email.TestMIMEMessage.test_type_error -*test.test_email.test_email.TestMIMEMessage.test_valid_argument -*test.test_email.test_email.TestMIMEText.test_7bit_input -*test.test_email.test_email.TestMIMEText.test_7bit_input_no_charset -*test.test_email.test_email.TestMIMEText.test_charset -*test.test_email.test_email.TestMIMEText.test_payload -*test.test_email.test_email.TestMIMEText.test_types -*test.test_email.test_email.TestMIMEText.test_utf8_input -*test.test_email.test_email.TestMIMEText.test_utf8_input_no_charset -*test.test_email.test_email.TestMessageAPI.test__contains__ -*test.test_email.test_email.TestMessageAPI.test_add_header_with_name_only_param -*test.test_email.test_email.TestMessageAPI.test_add_header_with_no_value -*test.test_email.test_email.TestMessageAPI.test_as_bytes -*test.test_email.test_email.TestMessageAPI.test_as_bytes_policy -*test.test_email.test_email.TestMessageAPI.test_as_string -*test.test_email.test_email.TestMessageAPI.test_as_string_policy -*test.test_email.test_email.TestMessageAPI.test_ascii_add_header -*test.test_email.test_email.TestMessageAPI.test_ascii_add_header_with_tspecial -*test.test_email.test_email.TestMessageAPI.test_attach_when_payload_is_string -*test.test_email.test_email.TestMessageAPI.test_bad_param -*test.test_email.test_email.TestMessageAPI.test_binary_base64_payload -*test.test_email.test_email.TestMessageAPI.test_binary_quopri_payload -*test.test_email.test_email.TestMessageAPI.test_bogus_filename -*test.test_email.test_email.TestMessageAPI.test_broken_unicode_payload -*test.test_email.test_email.TestMessageAPI.test_byte_message_rfc822_only -*test.test_email.test_email.TestMessageAPI.test_decoded_generator -*test.test_email.test_email.TestMessageAPI.test_del_nonexistent_param -*test.test_email.test_email.TestMessageAPI.test_del_param -*test.test_email.test_email.TestMessageAPI.test_del_param_on_nonexistent_header -*test.test_email.test_email.TestMessageAPI.test_del_param_on_other_header -*test.test_email.test_email.TestMessageAPI.test_embedded_header_via_Header_rejected -*test.test_email.test_email.TestMessageAPI.test_embedded_header_via_string_rejected -*test.test_email.test_email.TestMessageAPI.test_field_containment -*test.test_email.test_email.TestMessageAPI.test_get_all -*test.test_email.test_email.TestMessageAPI.test_get_boundary -*test.test_email.test_email.TestMessageAPI.test_get_charsets -*test.test_email.test_email.TestMessageAPI.test_get_content_disposition -*test.test_email.test_email.TestMessageAPI.test_get_content_maintype_error -*test.test_email.test_email.TestMessageAPI.test_get_content_maintype_from_message_explicit -*test.test_email.test_email.TestMessageAPI.test_get_content_maintype_from_message_implicit -*test.test_email.test_email.TestMessageAPI.test_get_content_maintype_from_message_text_plain_explicit -*test.test_email.test_email.TestMessageAPI.test_get_content_maintype_from_message_text_plain_implicit -*test.test_email.test_email.TestMessageAPI.test_get_content_maintype_missing -*test.test_email.test_email.TestMessageAPI.test_get_content_maintype_missing_with_default_type -*test.test_email.test_email.TestMessageAPI.test_get_content_subtype_error -*test.test_email.test_email.TestMessageAPI.test_get_content_subtype_from_message_explicit -*test.test_email.test_email.TestMessageAPI.test_get_content_subtype_from_message_implicit -*test.test_email.test_email.TestMessageAPI.test_get_content_subtype_from_message_text_plain_explicit -*test.test_email.test_email.TestMessageAPI.test_get_content_subtype_from_message_text_plain_implicit -*test.test_email.test_email.TestMessageAPI.test_get_content_subtype_missing -*test.test_email.test_email.TestMessageAPI.test_get_content_subtype_missing_with_default_type -*test.test_email.test_email.TestMessageAPI.test_get_content_type_from_message_explicit -*test.test_email.test_email.TestMessageAPI.test_get_content_type_from_message_implicit -*test.test_email.test_email.TestMessageAPI.test_get_content_type_from_message_text_plain_explicit -*test.test_email.test_email.TestMessageAPI.test_get_content_type_from_message_text_plain_implicit -*test.test_email.test_email.TestMessageAPI.test_get_content_type_missing -*test.test_email.test_email.TestMessageAPI.test_get_content_type_missing_with_default_type -*test.test_email.test_email.TestMessageAPI.test_get_decoded_payload -*test.test_email.test_email.TestMessageAPI.test_get_filename -*test.test_email.test_email.TestMessageAPI.test_get_filename_with_name_parameter -*test.test_email.test_email.TestMessageAPI.test_get_param -*test.test_email.test_email.TestMessageAPI.test_get_param_funky_continuation_lines -*test.test_email.test_email.TestMessageAPI.test_get_param_liberal -*test.test_email.test_email.TestMessageAPI.test_get_param_with_quotes -*test.test_email.test_email.TestMessageAPI.test_get_param_with_semis_in_quotes -*test.test_email.test_email.TestMessageAPI.test_get_params -*test.test_email.test_email.TestMessageAPI.test_get_payload_n_raises_on_non_multipart -*test.test_email.test_email.TestMessageAPI.test_getset_charset -*test.test_email.test_email.TestMessageAPI.test_make_boundary -*test.test_email.test_email.TestMessageAPI.test_message_rfc822_only -*test.test_email.test_email.TestMessageAPI.test_missing_boundary -*test.test_email.test_email.TestMessageAPI.test_missing_filename -*test.test_email.test_email.TestMessageAPI.test_noascii_add_header -*test.test_email.test_email.TestMessageAPI.test_nonascii_add_header_via_triple -*test.test_email.test_email.TestMessageAPI.test_nonascii_add_header_with_tspecial -*test.test_email.test_email.TestMessageAPI.test_nonascii_as_string_without_content_type_and_cte -*test.test_email.test_email.TestMessageAPI.test_nonascii_as_string_without_cte -*test.test_email.test_email.TestMessageAPI.test_questionable_bytes_payload -*test.test_email.test_email.TestMessageAPI.test_replace_header -*test.test_email.test_email.TestMessageAPI.test_set_boundary -*test.test_email.test_email.TestMessageAPI.test_set_charset_from_string -*test.test_email.test_email.TestMessageAPI.test_set_param -*test.test_email.test_email.TestMessageAPI.test_set_payload_to_list -*test.test_email.test_email.TestMessageAPI.test_set_payload_with_8bit_data_and_charset -*test.test_email.test_email.TestMessageAPI.test_set_payload_with_8bit_data_and_charset_body_encoding_none -*test.test_email.test_email.TestMessageAPI.test_set_payload_with_charset -*test.test_email.test_email.TestMessageAPI.test_set_payload_with_non_ascii_and_charset_body_encoding_none -*test.test_email.test_email.TestMessageAPI.test_set_type -*test.test_email.test_email.TestMessageAPI.test_set_type_on_other_header -*test.test_email.test_email.TestMessageAPI.test_unicode_body_defaults_to_utf8_encoding -*test.test_email.test_email.TestMessageAPI.test_unicode_header_defaults_to_utf8_encoding -*test.test_email.test_email.TestMiscellaneous.test_BytesGenerator_linend -*test.test_email.test_email.TestMiscellaneous.test_BytesGenerator_linend_with_non_ascii -*test.test_email.test_email.TestMiscellaneous.test_Generator_linend -*test.test_email.test_email.TestMiscellaneous.test__all__ -*test.test_email.test_email.TestMiscellaneous.test_accepts_any_charset_like_object -*test.test_email.test_email.TestMiscellaneous.test_charset_richcomparisons -*test.test_email.test_email.TestMiscellaneous.test_charsets_case_insensitive -*test.test_email.test_email.TestMiscellaneous.test_custom_message_does_not_require_arguments -*test.test_email.test_email.TestMiscellaneous.test_escape_backslashes -*test.test_email.test_email.TestMiscellaneous.test_escape_dump -*test.test_email.test_email.TestMiscellaneous.test_formataddr_does_not_quote_parens_in_quoted_string -*test.test_email.test_email.TestMiscellaneous.test_formatdate -*test.test_email.test_email.TestMiscellaneous.test_formatdate_localtime -*test.test_email.test_email.TestMiscellaneous.test_formatdate_usegmt -*test.test_email.test_email.TestMiscellaneous.test_get_body_encoding_with_bogus_charset -*test.test_email.test_email.TestMiscellaneous.test_get_body_encoding_with_uppercase_charset -*test.test_email.test_email.TestMiscellaneous.test_getaddresses -*test.test_email.test_email.TestMiscellaneous.test_getaddresses_embedded_comment -*test.test_email.test_email.TestMiscellaneous.test_getaddresses_header_obj -*test.test_email.test_email.TestMiscellaneous.test_getaddresses_nasty -*test.test_email.test_email.TestMiscellaneous.test_invalid_charset_like_object_raises_error -*test.test_email.test_email.TestMiscellaneous.test_make_msgid_collisions -*test.test_email.test_email.TestMiscellaneous.test_make_msgid_default_domain -*test.test_email.test_email.TestMiscellaneous.test_make_msgid_domain -*test.test_email.test_email.TestMiscellaneous.test_make_msgid_idstring -*test.test_email.test_email.TestMiscellaneous.test_message_from_file -*test.test_email.test_email.TestMiscellaneous.test_message_from_file_with_class -*test.test_email.test_email.TestMiscellaneous.test_message_from_string -*test.test_email.test_email.TestMiscellaneous.test_message_from_string_with_class -*test.test_email.test_email.TestMiscellaneous.test_mime_classes_policy_argument -*test.test_email.test_email.TestMiscellaneous.test_mktime_tz -*test.test_email.test_email.TestMiscellaneous.test_multiline_from_comment -*test.test_email.test_email.TestMiscellaneous.test_name_with_dot -*test.test_email.test_email.TestMiscellaneous.test_noquote_dump -*test.test_email.test_email.TestMiscellaneous.test_parseaddr_empty -*test.test_email.test_email.TestMiscellaneous.test_parseaddr_multiple_domains -*test.test_email.test_email.TestMiscellaneous.test_parseaddr_preserves_quoted_pairs_in_addresses -*test.test_email.test_email.TestMiscellaneous.test_parseaddr_preserves_spaces_in_local_part -*test.test_email.test_email.TestMiscellaneous.test_parsedate_acceptable_to_time_functions -*test.test_email.test_email.TestMiscellaneous.test_parsedate_accepts_time_with_dots -*test.test_email.test_email.TestMiscellaneous.test_parsedate_compact -*test.test_email.test_email.TestMiscellaneous.test_parsedate_dot_time_delimiter -*test.test_email.test_email.TestMiscellaneous.test_parsedate_no_dayofweek -*test.test_email.test_email.TestMiscellaneous.test_parsedate_no_seconds -*test.test_email.test_email.TestMiscellaneous.test_parsedate_no_space_before_negative_offset -*test.test_email.test_email.TestMiscellaneous.test_parsedate_no_space_before_positive_offset -*test.test_email.test_email.TestMiscellaneous.test_parsedate_returns_None_for_invalid_strings -*test.test_email.test_email.TestMiscellaneous.test_parsedate_rfc_850 -*test.test_email.test_email.TestMiscellaneous.test_parsedate_y2k -*test.test_email.test_email.TestMiscellaneous.test_partial_falls_inside_message_delivery_status -*test.test_email.test_email.TestMiscellaneous.test_quote_dump -*test.test_email.test_email.TestMiscellaneous.test_quotes_unicode_names -*test.test_email.test_email.TestMiscellaneous.test_unicode_address_raises_error -*test.test_email.test_email.TestMiscellaneous.test_utils_quote_unquote -*test.test_email.test_email.TestMultipart.test_boundary_in_non_multipart -*test.test_email.test_email.TestMultipart.test_boundary_with_leading_space -*test.test_email.test_email.TestMultipart.test_boundary_without_trailing_newline -*test.test_email.test_email.TestMultipart.test_double_boundary -*test.test_email.test_email.TestMultipart.test_empty_multipart_idempotent -*test.test_email.test_email.TestMultipart.test_hierarchy -*test.test_email.test_email.TestMultipart.test_message_external_body -*test.test_email.test_email.TestMultipart.test_mimebase_custom_policy -*test.test_email.test_email.TestMultipart.test_mimebase_default_policy -*test.test_email.test_email.TestMultipart.test_nested_inner_contains_outer_boundary -*test.test_email.test_email.TestMultipart.test_nested_with_same_boundary -*test.test_email.test_email.TestMultipart.test_no_parts_in_a_multipart_with_empty_epilogue -*test.test_email.test_email.TestMultipart.test_no_parts_in_a_multipart_with_none_epilogue -*test.test_email.test_email.TestMultipart.test_one_part_in_a_multipart -*test.test_email.test_email.TestMultipart.test_seq_parts_in_a_multipart_with_empty_epilogue -*test.test_email.test_email.TestMultipart.test_seq_parts_in_a_multipart_with_empty_preamble -*test.test_email.test_email.TestMultipart.test_seq_parts_in_a_multipart_with_nl_epilogue -*test.test_email.test_email.TestMultipart.test_seq_parts_in_a_multipart_with_none_epilogue -*test.test_email.test_email.TestMultipart.test_seq_parts_in_a_multipart_with_none_preamble -*test.test_email.test_email.TestNonConformant.test_first_line_is_continuation_header -*test.test_email.test_email.TestNonConformant.test_invalid_content_type -*test.test_email.test_email.TestNonConformant.test_lying_multipart -*test.test_email.test_email.TestNonConformant.test_missing_header_body_separator -*test.test_email.test_email.TestNonConformant.test_missing_start_boundary -*test.test_email.test_email.TestNonConformant.test_multipart_invalid_cte -*test.test_email.test_email.TestNonConformant.test_multipart_no_boundary -*test.test_email.test_email.TestNonConformant.test_multipart_no_cte_no_defect -*test.test_email.test_email.TestNonConformant.test_multipart_valid_cte_no_defect -*test.test_email.test_email.TestNonConformant.test_no_separating_blank_line -*test.test_email.test_email.TestNonConformant.test_no_start_boundary -*test.test_email.test_email.TestNonConformant.test_parse_missing_minor_type -*test.test_email.test_email.TestNonConformant.test_same_boundary_inner_outer -*test.test_email.test_email.TestNonMultipart.test_attach_raises_exception -*test.test_email.test_email.TestNonMultipart.test_nonmultipart_is_not_multipart -*test.test_email.test_email.TestParsers.test_CRLFLF_at_end_of_part -*test.test_email.test_email.TestParsers.test_bytes_header_parser -*test.test_email.test_email.TestParsers.test_bytes_parser_does_not_close_file -*test.test_email.test_email.TestParsers.test_bytes_parser_on_exception_does_not_close_file -*test.test_email.test_email.TestParsers.test_crlf_flatten -*test.test_email.test_email.TestParsers.test_crlf_separation -*test.test_email.test_email.TestParsers.test_header_parser -*test.test_email.test_email.TestParsers.test_header_parser_multipart_is_valid -*test.test_email.test_email.TestParsers.test_multipart_digest_with_extra_mime_headers -*test.test_email.test_email.TestParsers.test_parser_does_not_close_file -*test.test_email.test_email.TestParsers.test_parser_on_exception_does_not_close_file -*test.test_email.test_email.TestParsers.test_rfc2822_header_syntax -*test.test_email.test_email.TestParsers.test_rfc2822_one_character_header -*test.test_email.test_email.TestParsers.test_rfc2822_space_not_allowed_in_header -*test.test_email.test_email.TestParsers.test_strip_line_feed_and_carriage_return_in_headers -*test.test_email.test_email.TestParsers.test_three_lines -*test.test_email.test_email.TestParsers.test_whitespace_continuation -*test.test_email.test_email.TestParsers.test_whitespace_continuation_last_header -*test.test_email.test_email.TestQuopri.test_body_quopri_len -*test.test_email.test_email.TestQuopri.test_decode_false_quoting -*test.test_email.test_email.TestQuopri.test_decode_lowercase_quoting -*test.test_email.test_email.TestQuopri.test_decode_multiple_spaces -*test.test_email.test_email.TestQuopri.test_decode_null_line_null_word -*test.test_email.test_email.TestQuopri.test_decode_null_word -*test.test_email.test_email.TestQuopri.test_decode_one_line -*test.test_email.test_email.TestQuopri.test_decode_one_line_cr -*test.test_email.test_email.TestQuopri.test_decode_one_line_crnl -*test.test_email.test_email.TestQuopri.test_decode_one_line_lf -*test.test_email.test_email.TestQuopri.test_decode_one_line_nl -*test.test_email.test_email.TestQuopri.test_decode_one_line_one_word -*test.test_email.test_email.TestQuopri.test_decode_one_line_one_word_eol -*test.test_email.test_email.TestQuopri.test_decode_one_line_trailing_spaces -*test.test_email.test_email.TestQuopri.test_decode_one_long_line -*test.test_email.test_email.TestQuopri.test_decode_one_space -*test.test_email.test_email.TestQuopri.test_decode_one_word -*test.test_email.test_email.TestQuopri.test_decode_one_word_eol -*test.test_email.test_email.TestQuopri.test_decode_quoted_word -*test.test_email.test_email.TestQuopri.test_decode_soft_line_break -*test.test_email.test_email.TestQuopri.test_decode_two_lines -*test.test_email.test_email.TestQuopri.test_decode_two_lines_eol -*test.test_email.test_email.TestQuopri.test_decode_two_lines_trailing_spaces -*test.test_email.test_email.TestQuopri.test_decode_uppercase_quoting -*test.test_email.test_email.TestQuopri.test_encode -*test.test_email.test_email.TestQuopri.test_encode_maxlinelen_too_small -*test.test_email.test_email.TestQuopri.test_encode_null -*test.test_email.test_email.TestQuopri.test_encode_null_lines -*test.test_email.test_email.TestQuopri.test_encode_one_line -*test.test_email.test_email.TestQuopri.test_encode_one_line_crlf -*test.test_email.test_email.TestQuopri.test_encode_one_line_eol -*test.test_email.test_email.TestQuopri.test_encode_one_line_eol_after_non_ascii -*test.test_email.test_email.TestQuopri.test_encode_one_line_one_space -*test.test_email.test_email.TestQuopri.test_encode_one_line_trailing_spaces -*test.test_email.test_email.TestQuopri.test_encode_one_line_trailing_tab -*test.test_email.test_email.TestQuopri.test_encode_one_long_line -*test.test_email.test_email.TestQuopri.test_encode_one_long_string -*test.test_email.test_email.TestQuopri.test_encode_one_space -*test.test_email.test_email.TestQuopri.test_encode_one_very_long_line -*test.test_email.test_email.TestQuopri.test_encode_one_word_trailing_spaces -*test.test_email.test_email.TestQuopri.test_encode_one_word_trailing_tab -*test.test_email.test_email.TestQuopri.test_encode_quoted_equals -*test.test_email.test_email.TestQuopri.test_encode_shortest_maxlinelen -*test.test_email.test_email.TestQuopri.test_encode_trailing_space_at_maxlinelen -*test.test_email.test_email.TestQuopri.test_encode_trailing_space_before_maxlinelen -*test.test_email.test_email.TestQuopri.test_encode_trailing_space_beyond_maxlinelen -*test.test_email.test_email.TestQuopri.test_encode_two_lines_one_space -*test.test_email.test_email.TestQuopri.test_encode_whitespace_lines -*test.test_email.test_email.TestQuopri.test_header_decode_non_ascii -*test.test_email.test_email.TestQuopri.test_header_decode_null -*test.test_email.test_email.TestQuopri.test_header_decode_one_word -*test.test_email.test_email.TestQuopri.test_header_decode_re_bug_18380 -*test.test_email.test_email.TestQuopri.test_header_decode_two_lines -*test.test_email.test_email.TestQuopri.test_header_encode_alt_charset -*test.test_email.test_email.TestQuopri.test_header_encode_non_ascii -*test.test_email.test_email.TestQuopri.test_header_encode_null -*test.test_email.test_email.TestQuopri.test_header_encode_one_word -*test.test_email.test_email.TestQuopri.test_header_encode_two_lines -*test.test_email.test_email.TestQuopri.test_header_quopri_len -*test.test_email.test_email.TestQuopri.test_quopri_body_check -*test.test_email.test_email.TestQuopri.test_quopri_header_check -*test.test_email.test_email.TestQuopri.test_quote_unquote_idempotent -*test.test_email.test_email.TestRFC2047.test_multiline_header -*test.test_email.test_email.TestRFC2047.test_rfc2047_B_bad_padding -*test.test_email.test_email.TestRFC2047.test_rfc2047_Q_invalid_digits -*test.test_email.test_email.TestRFC2047.test_rfc2047_missing_whitespace -*test.test_email.test_email.TestRFC2047.test_rfc2047_multiline -*test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_1 -*test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_2 -*test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_3 -*test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_4 -*test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_5a -*test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_5b -*test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_6 -*test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_7 -*test.test_email.test_email.TestRFC2047.test_rfc2047_with_whitespace -*test.test_email.test_email.TestRFC2047.test_whitespace_keeper_unicode -*test.test_email.test_email.TestRFC2047.test_whitespace_keeper_unicode_2 -*test.test_email.test_email.TestRFC2231.test_del_param -*test.test_email.test_email.TestRFC2231.test_get_param -*test.test_email.test_email.TestRFC2231.test_rfc2231_bad_character_in_charset -*test.test_email.test_email.TestRFC2231.test_rfc2231_bad_character_in_encoding -*test.test_email.test_email.TestRFC2231.test_rfc2231_bad_character_in_filename -*test.test_email.test_email.TestRFC2231.test_rfc2231_bad_encoding_in_charset -*test.test_email.test_email.TestRFC2231.test_rfc2231_bad_encoding_in_filename -*test.test_email.test_email.TestRFC2231.test_rfc2231_encoded_then_unencoded_segments -*test.test_email.test_email.TestRFC2231.test_rfc2231_get_content_charset -*test.test_email.test_email.TestRFC2231.test_rfc2231_missing_tick -*test.test_email.test_email.TestRFC2231.test_rfc2231_missing_tick_with_encoded_non_ascii -*test.test_email.test_email.TestRFC2231.test_rfc2231_no_extended_values -*test.test_email.test_email.TestRFC2231.test_rfc2231_no_language_or_charset -*test.test_email.test_email.TestRFC2231.test_rfc2231_no_language_or_charset_in_boundary -*test.test_email.test_email.TestRFC2231.test_rfc2231_no_language_or_charset_in_charset -*test.test_email.test_email.TestRFC2231.test_rfc2231_no_language_or_charset_in_filename -*test.test_email.test_email.TestRFC2231.test_rfc2231_no_language_or_charset_in_filename_encoded -*test.test_email.test_email.TestRFC2231.test_rfc2231_parse_extra_quoting -*test.test_email.test_email.TestRFC2231.test_rfc2231_parse_rfc_quoting -*test.test_email.test_email.TestRFC2231.test_rfc2231_partly_encoded -*test.test_email.test_email.TestRFC2231.test_rfc2231_partly_nonencoded -*test.test_email.test_email.TestRFC2231.test_rfc2231_single_tick_in_filename -*test.test_email.test_email.TestRFC2231.test_rfc2231_single_tick_in_filename_extended -*test.test_email.test_email.TestRFC2231.test_rfc2231_tick_attack -*test.test_email.test_email.TestRFC2231.test_rfc2231_tick_attack_extended -*test.test_email.test_email.TestRFC2231.test_rfc2231_unencoded_then_encoded_segments -*test.test_email.test_email.TestRFC2231.test_rfc2231_unknown_encoding -*test.test_email.test_email.TestRFC2231.test_set_param -*test.test_email.test_email.TestRFC2231.test_set_param_requote -*test.test_email.test_email.TestRFC2231.test_should_not_hang_on_invalid_ew_messages -*test.test_email.test_email.TestSigned.test_long_headers_as_string -*test.test_email.test_email.TestSigned.test_long_headers_as_string_maxheaderlen -*test.test_email.test_email.TestSigned.test_long_headers_flatten -*test.test_email.test_generator.TestBytesGenerator.test_compat32_max_line_length_does_not_fold_when_none -*test.test_email.test_generator.TestBytesGenerator.test_crlf_control_via_policy -*test.test_email.test_generator.TestBytesGenerator.test_cte_type_7bit_handles_unknown_8bit -*test.test_email.test_generator.TestBytesGenerator.test_cte_type_7bit_transforms_8bit_cte -*test.test_email.test_generator.TestBytesGenerator.test_flatten_linesep_overrides_policy -*test.test_email.test_generator.TestBytesGenerator.test_max_line_length_policy_0 -*test.test_email.test_generator.TestBytesGenerator.test_max_line_length_policy_100 -*test.test_email.test_generator.TestBytesGenerator.test_max_line_length_policy_20 -*test.test_email.test_generator.TestBytesGenerator.test_max_line_length_policy_40 -*test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_all_folds_0 -*test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_all_folds_100 -*test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_all_folds_20 -*test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_all_folds_40 -*test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_none_does_not_fold_0 -*test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_none_does_not_fold_100 -*test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_none_does_not_fold_20 -*test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_none_does_not_fold_40 -*test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parameter_0 -*test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parameter_100 -*test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parameter_20 -*test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parameter_40 -*test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parm_overrides_policy_0 -*test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parm_overrides_policy_100 -*test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parm_overrides_policy_20 -*test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parm_overrides_policy_40 -*test.test_email.test_generator.TestBytesGenerator.test_rfc2231_wrapping -*test.test_email.test_generator.TestBytesGenerator.test_rfc2231_wrapping_switches_to_default_len_if_too_narrow -*test.test_email.test_generator.TestBytesGenerator.test_set_mangle_from_via_policy -*test.test_email.test_generator.TestBytesGenerator.test_smtp_policy -*test.test_email.test_generator.TestBytesGenerator.test_smtputf8_policy -*test.test_email.test_generator.TestGenerator.test_compat32_max_line_length_does_not_fold_when_none -*test.test_email.test_generator.TestGenerator.test_crlf_control_via_policy -*test.test_email.test_generator.TestGenerator.test_flatten_linesep_overrides_policy -*test.test_email.test_generator.TestGenerator.test_max_line_length_policy_0 -*test.test_email.test_generator.TestGenerator.test_max_line_length_policy_100 -*test.test_email.test_generator.TestGenerator.test_max_line_length_policy_20 -*test.test_email.test_generator.TestGenerator.test_max_line_length_policy_40 -*test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_all_folds_0 -*test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_all_folds_100 -*test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_all_folds_20 -*test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_all_folds_40 -*test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_none_does_not_fold_0 -*test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_none_does_not_fold_100 -*test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_none_does_not_fold_20 -*test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_none_does_not_fold_40 -*test.test_email.test_generator.TestGenerator.test_maxheaderlen_parameter_0 -*test.test_email.test_generator.TestGenerator.test_maxheaderlen_parameter_100 -*test.test_email.test_generator.TestGenerator.test_maxheaderlen_parameter_20 -*test.test_email.test_generator.TestGenerator.test_maxheaderlen_parameter_40 -*test.test_email.test_generator.TestGenerator.test_maxheaderlen_parm_overrides_policy_0 -*test.test_email.test_generator.TestGenerator.test_maxheaderlen_parm_overrides_policy_100 -*test.test_email.test_generator.TestGenerator.test_maxheaderlen_parm_overrides_policy_20 -*test.test_email.test_generator.TestGenerator.test_maxheaderlen_parm_overrides_policy_40 -*test.test_email.test_generator.TestGenerator.test_rfc2231_wrapping -*test.test_email.test_generator.TestGenerator.test_rfc2231_wrapping_switches_to_default_len_if_too_narrow -*test.test_email.test_generator.TestGenerator.test_set_mangle_from_via_policy -*test.test_email.test_headerregistry.TestAddressAndGroup.test_address_addr_spec_and_domain_raises -*test.test_email.test_headerregistry.TestAddressAndGroup.test_address_addr_spec_and_username_and_domain_raises -*test.test_email.test_headerregistry.TestAddressAndGroup.test_address_addr_spec_and_username_raises -*test.test_email.test_headerregistry.TestAddressAndGroup.test_address_comparison -*test.test_email.test_headerregistry.TestAddressAndGroup.test_address_display_name_ro -*test.test_email.test_headerregistry.TestAddressAndGroup.test_address_domain_ro -*test.test_email.test_headerregistry.TestAddressAndGroup.test_address_from_addr_spec -*test.test_email.test_headerregistry.TestAddressAndGroup.test_address_from_username_domain -*test.test_email.test_headerregistry.TestAddressAndGroup.test_address_username_ro -*test.test_email.test_headerregistry.TestAddressAndGroup.test_address_with_no_display_name -*test.test_email.test_headerregistry.TestAddressAndGroup.test_bad_addr_sepc_raises -*test.test_email.test_headerregistry.TestAddressAndGroup.test_crlf_in_constructor_args_raises -*test.test_email.test_headerregistry.TestAddressAndGroup.test_display_name_blanks_not_quoted -*test.test_email.test_headerregistry.TestAddressAndGroup.test_display_name_only -*test.test_email.test_headerregistry.TestAddressAndGroup.test_display_name_quoting -*test.test_email.test_headerregistry.TestAddressAndGroup.test_domain_only -*test.test_email.test_headerregistry.TestAddressAndGroup.test_empty_group -*test.test_email.test_headerregistry.TestAddressAndGroup.test_empty_group_list -*test.test_email.test_headerregistry.TestAddressAndGroup.test_group_addresses_ro -*test.test_email.test_headerregistry.TestAddressAndGroup.test_group_comparison -*test.test_email.test_headerregistry.TestAddressAndGroup.test_group_display_name_ro -*test.test_email.test_headerregistry.TestAddressAndGroup.test_group_with_addresses -*test.test_email.test_headerregistry.TestAddressAndGroup.test_group_with_addresses_no_display_name -*test.test_email.test_headerregistry.TestAddressAndGroup.test_group_with_one_address_no_display_name -*test.test_email.test_headerregistry.TestAddressAndGroup.test_il8n -*test.test_email.test_headerregistry.TestAddressAndGroup.test_non_ascii_username_in_addr_spec_raises -*test.test_email.test_headerregistry.TestAddressAndGroup.test_null_address -*test.test_email.test_headerregistry.TestAddressAndGroup.test_null_group -*test.test_email.test_headerregistry.TestAddressAndGroup.test_quoting -*test.test_email.test_headerregistry.TestAddressAndGroup.test_set_message_header_from_address -*test.test_email.test_headerregistry.TestAddressAndGroup.test_set_message_header_from_group -*test.test_email.test_headerregistry.TestAddressAndGroup.test_space_in_addr_spec_username_raises -*test.test_email.test_headerregistry.TestAddressAndGroup.test_username_only -*test.test_email.test_headerregistry.TestAddressHeader.test_address_address_only -*test.test_email.test_headerregistry.TestAddressHeader.test_address_empty -*test.test_email.test_headerregistry.TestAddressHeader.test_address_escaped_escapes_in_local_part -*test.test_email.test_headerregistry.TestAddressHeader.test_address_escaped_quoted_strings_in_local_part -*test.test_email.test_headerregistry.TestAddressHeader.test_address_name_and_address -*test.test_email.test_headerregistry.TestAddressHeader.test_address_name_with_dot -*test.test_email.test_headerregistry.TestAddressHeader.test_address_quoted_backslashes_in_name -*test.test_email.test_headerregistry.TestAddressHeader.test_address_quoted_local_part -*test.test_email.test_headerregistry.TestAddressHeader.test_address_quoted_parens_in_name -*test.test_email.test_headerregistry.TestAddressHeader.test_address_quoted_strings_in_local_part -*test.test_email.test_headerregistry.TestAddressHeader.test_address_read_only -*test.test_email.test_headerregistry.TestAddressHeader.test_address_rfc2047_atom_in_phrase_is_decoded -*test.test_email.test_headerregistry.TestAddressHeader.test_address_rfc2047_atom_in_quoted_string_is_decoded -*test.test_email.test_headerregistry.TestAddressHeader.test_address_rfc2047_atom_is_decoded -*test.test_email.test_headerregistry.TestAddressHeader.test_address_spaces_around_dots_in_local_part_removed -*test.test_email.test_headerregistry.TestAddressHeader.test_address_spaces_in_unquoted_local_part_collapsed -*test.test_email.test_headerregistry.TestAddressHeader.test_addresses_read_only -*test.test_email.test_headerregistry.TestAddressHeader.test_addresses_types -*test.test_email.test_headerregistry.TestAddressHeader.test_complex_address_list -*test.test_email.test_headerregistry.TestAddressHeader.test_group_address_only -*test.test_email.test_headerregistry.TestAddressHeader.test_group_empty -*test.test_email.test_headerregistry.TestAddressHeader.test_group_escaped_escapes_in_local_part -*test.test_email.test_headerregistry.TestAddressHeader.test_group_escaped_quoted_strings_in_local_part -*test.test_email.test_headerregistry.TestAddressHeader.test_group_name_and_address -*test.test_email.test_headerregistry.TestAddressHeader.test_group_name_with_dot -*test.test_email.test_headerregistry.TestAddressHeader.test_group_quoted_backslashes_in_name -*test.test_email.test_headerregistry.TestAddressHeader.test_group_quoted_local_part -*test.test_email.test_headerregistry.TestAddressHeader.test_group_quoted_parens_in_name -*test.test_email.test_headerregistry.TestAddressHeader.test_group_quoted_strings_in_local_part -*test.test_email.test_headerregistry.TestAddressHeader.test_group_rfc2047_atom_in_phrase_is_decoded -*test.test_email.test_headerregistry.TestAddressHeader.test_group_rfc2047_atom_in_quoted_string_is_decoded -*test.test_email.test_headerregistry.TestAddressHeader.test_group_rfc2047_atom_is_decoded -*test.test_email.test_headerregistry.TestAddressHeader.test_group_spaces_around_dots_in_local_part_removed -*test.test_email.test_headerregistry.TestAddressHeader.test_group_spaces_in_unquoted_local_part_collapsed -*test.test_email.test_headerregistry.TestAddressHeader.test_groups_read_only -*test.test_email.test_headerregistry.TestAddressHeader.test_groups_types -*test.test_email.test_headerregistry.TestAddressHeader.test_set_from_Address -*test.test_email.test_headerregistry.TestAddressHeader.test_set_from_Address_and_Group_list -*test.test_email.test_headerregistry.TestAddressHeader.test_set_from_Address_list -*test.test_email.test_headerregistry.TestAddressHeader.test_set_from_Group_list -*test.test_email.test_headerregistry.TestAddressHeader.test_simple_address_list -*test.test_email.test_headerregistry.TestBaseHeaderFeatures.test_defects_is_tuple -*test.test_email.test_headerregistry.TestBaseHeaderFeatures.test_defects_read_only -*test.test_email.test_headerregistry.TestBaseHeaderFeatures.test_has_name -*test.test_email.test_headerregistry.TestBaseHeaderFeatures.test_name_read_only -*test.test_email.test_headerregistry.TestBaseHeaderFeatures.test_str -*test.test_email.test_headerregistry.TestBaseHeaderFeatures.test_substr -*test.test_email.test_headerregistry.TestContentDisposition.test_value_RFC_2183_1 -*test.test_email.test_headerregistry.TestContentDisposition.test_value_RFC_2183_2 -*test.test_email.test_headerregistry.TestContentDisposition.test_value_invalid_parameter_value_with_fws_between_ew -*test.test_email.test_headerregistry.TestContentDisposition.test_value_invalid_value -*test.test_email.test_headerregistry.TestContentDisposition.test_value_invalid_value_with_params -*test.test_email.test_headerregistry.TestContentDisposition.test_value_no_value -*test.test_email.test_headerregistry.TestContentDisposition.test_value_parameter_value_with_fws_between_tokens -*test.test_email.test_headerregistry.TestContentTransferEncoding.test_value_RFC_2183_1 -*test.test_email.test_headerregistry.TestContentTransferEncoding.test_value_junk_after_cte -*test.test_email.test_headerregistry.TestContentTransferEncoding.test_value_no_value -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_RFC_2045_1 -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_RFC_2045_2 -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_RFC_2045_3 -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_bad_params -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_capitalized_charset -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_capitalized_charset_param_name_and_comment -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_cfws_in_content_type -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_charset_param -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_double_quotes_inside_quotes -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_junk_text_in_content_type -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_lots_of_mime_params -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_mixed_case_content_type -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_no_slash_in_content_type -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_no_subtype_in_content_type -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_non_ascii_in_params -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_non_ascii_rfc2231_value -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_param_value_with_tspecials -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_param_with_extra_quoted_whitespace -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_quotes_inside_rfc2231_value -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_bad_character_in_charset_parameter_value -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_encoded_charset -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_encoded_no_charset -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_encoded_no_double_quotes -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_encoded_then_unencoded_segments -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_encoded_with_double_quotes -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_folded_segments_correctly_formatted -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_no_language_or_charset -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_nonascii_in_charset_of_charset_parameter_value -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_partly_encoded -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_partly_encoded_2 -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_quoted_unencoded_then_encoded_segments -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_segmented_normal_values -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_single_quote_in_non_encoded_value -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_single_quote_in_value_with_charset_and_lang -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_single_quote_inside_double_quotes -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_unencoded_then_encoded_segments -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_unknown_charset_treated_as_ascii -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_utf8_in_supposedly_ascii_charset_parameter_value -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_semis_inside_quotes -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_single_quotes_inside_quotes -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_spaces_around_param_equals -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_spaces_around_semis -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_spaces_in_content_type -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_too_many_slashes_in_content_type -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_unknown_charset -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_unknown_content_type -*test.test_email.test_headerregistry.TestContentTypeHeader.test_value_unquoted_param_value -*test.test_email.test_headerregistry.TestDateHeader.test_date_header_properties -*test.test_email.test_headerregistry.TestDateHeader.test_datetime_read_only -*test.test_email.test_headerregistry.TestDateHeader.test_invalid_date_format -*test.test_email.test_headerregistry.TestDateHeader.test_invalid_date_value -*test.test_email.test_headerregistry.TestDateHeader.test_no_value_is_defect -*test.test_email.test_headerregistry.TestDateHeader.test_parse_date -*test.test_email.test_headerregistry.TestDateHeader.test_resent_date_header_properties -*test.test_email.test_headerregistry.TestDateHeader.test_set_date_header_from_datetime -*test.test_email.test_headerregistry.TestDateHeader.test_set_from_datetime -*test.test_email.test_headerregistry.TestFolding.test_address_display_names -*test.test_email.test_headerregistry.TestFolding.test_fold_address_list -*test.test_email.test_headerregistry.TestFolding.test_fold_date_header -*test.test_email.test_headerregistry.TestFolding.test_fold_overlong_words_using_RFC2047 -*test.test_email.test_headerregistry.TestFolding.test_fold_unstructured_short -*test.test_email.test_headerregistry.TestFolding.test_fold_unstructured_single_word -*test.test_email.test_headerregistry.TestFolding.test_fold_unstructured_with_commas -*test.test_email.test_headerregistry.TestFolding.test_fold_unstructured_with_overlong_word -*test.test_email.test_headerregistry.TestFolding.test_fold_unstructured_with_slightly_long_word -*test.test_email.test_headerregistry.TestFolding.test_fold_unstructured_with_two_overlong_words -*test.test_email.test_headerregistry.TestFolding.test_long_unstructured -*test.test_email.test_headerregistry.TestFolding.test_message_id_header_is_not_folded -*test.test_email.test_headerregistry.TestFolding.test_short_unstructured -*test.test_email.test_headerregistry.TestFolding.test_unstructured_short_max_line_length -*test.test_email.test_headerregistry.TestHeaderRegistry.test_arbitrary_name_unstructured -*test.test_email.test_headerregistry.TestHeaderRegistry.test_dont_use_default_map -*test.test_email.test_headerregistry.TestHeaderRegistry.test_map_to_type -*test.test_email.test_headerregistry.TestHeaderRegistry.test_name_case_ignored -*test.test_email.test_headerregistry.TestHeaderRegistry.test_override_default_base_class -*test.test_email.test_headerregistry.TestHeaderRegistry.test_override_default_class -*test.test_email.test_headerregistry.TestHeaderRegistry.test_override_default_class_only_overrides_default -*test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_1_1 -*test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_2_1 -*test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_2_x -*test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_RFC_2045_1 -*test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_RFC_2045_2 -*test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_RFC_2045_3 -*test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_RFC_2045_4 -*test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_foo -*test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_leading_trailing_whitespace_ignored -*test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_missing -*test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_non_comment_garbage_after -*test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_non_comment_garbage_before -*test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_non_comment_garbage_inside -*test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_two_periods -*test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_whitespace -*test.test_email.test_headerregistry.TestUnstructuredHeader.test_value_rfc2047_gb2312_base64 -*test.test_email.test_headerregistry.TestUnstructuredHeader.test_value_rfc2047_quopri_with_regular_text -*test.test_email.test_headerregistry.TestUnstructuredHeader.test_value_rfc2047_simple_nonascii_quopri -*test.test_email.test_headerregistry.TestUnstructuredHeader.test_value_rfc2047_simple_quopri -*test.test_email.test_inversion.TestInversion.test_body_base64_text -*test.test_email.test_inversion.TestInversion.test_body_plain_text -*test.test_email.test_inversion.TestInversion.test_body_qp_text -*test.test_email.test_inversion.TestInversion.test_input_header_with_invalid_date -*test.test_email.test_inversion.TestInversion.test_input_header_with_one_space_body -*test.test_email.test_message.Test.test_error_on_setitem_if_max_count_exceeded -*test.test_email.test_message.Test.test_rfc2043_auto_decoded_and_emailmessage_used -*test.test_email.test_message.TestEmailMessage.test_add_alternative_alternative_ -*test.test_email.test_message.TestEmailMessage.test_add_alternative_mixed_raises -*test.test_email.test_message.TestEmailMessage.test_add_alternative_no_content_succeeds -*test.test_email.test_message.TestEmailMessage.test_add_alternative_none_succeeds -*test.test_email.test_message.TestEmailMessage.test_add_alternative_plain_succeeds -*test.test_email.test_message.TestEmailMessage.test_add_alternative_related_succeeds -*test.test_email.test_message.TestEmailMessage.test_add_mixed_alternative_succeeds -*test.test_email.test_message.TestEmailMessage.test_add_mixed_mixed_ -*test.test_email.test_message.TestEmailMessage.test_add_mixed_no_content_succeeds -*test.test_email.test_message.TestEmailMessage.test_add_mixed_none_succeeds -*test.test_email.test_message.TestEmailMessage.test_add_mixed_plain_succeeds -*test.test_email.test_message.TestEmailMessage.test_add_mixed_related_succeeds -*test.test_email.test_message.TestEmailMessage.test_add_related_alternative_raises -*test.test_email.test_message.TestEmailMessage.test_add_related_mixed_raises -*test.test_email.test_message.TestEmailMessage.test_add_related_no_content_succeeds -*test.test_email.test_message.TestEmailMessage.test_add_related_none_succeeds -*test.test_email.test_message.TestEmailMessage.test_add_related_plain_succeeds -*test.test_email.test_message.TestEmailMessage.test_add_related_related_ -*test.test_email.test_message.TestEmailMessage.test_as_string_allows_maxheaderlen -*test.test_email.test_message.TestEmailMessage.test_as_string_unixform -*test.test_email.test_message.TestEmailMessage.test_as_string_uses_max_header_length_by_default -*test.test_email.test_message.TestEmailMessage.test_clear_content_empty_message -*test.test_email.test_message.TestEmailMessage.test_clear_content_html_text_attachment_inline_mixed -*test.test_email.test_message.TestEmailMessage.test_clear_content_html_text_attachment_mixed -*test.test_email.test_message.TestEmailMessage.test_clear_content_message_rfc822 -*test.test_email.test_message.TestEmailMessage.test_clear_content_mime_non_text -*test.test_email.test_message.TestEmailMessage.test_clear_content_mixed_alternative_plain_related -*test.test_email.test_message.TestEmailMessage.test_clear_content_mixed_related_alternative_plain_html -*test.test_email.test_message.TestEmailMessage.test_clear_content_mixed_related_alternative_plain_html_wrong_order -*test.test_email.test_message.TestEmailMessage.test_clear_content_mixed_text_message_rfc822 -*test.test_email.test_message.TestEmailMessage.test_clear_content_non_mime_plain -*test.test_email.test_message.TestEmailMessage.test_clear_content_plain_html_alternative -*test.test_email.test_message.TestEmailMessage.test_clear_content_plain_html_attachment_mixed -*test.test_email.test_message.TestEmailMessage.test_clear_content_plain_html_mixed -*test.test_email.test_message.TestEmailMessage.test_clear_content_related -*test.test_email.test_message.TestEmailMessage.test_clear_content_related_with_start -*test.test_email.test_message.TestEmailMessage.test_clear_empty_message -*test.test_email.test_message.TestEmailMessage.test_clear_html_text_attachment_inline_mixed -*test.test_email.test_message.TestEmailMessage.test_clear_html_text_attachment_mixed -*test.test_email.test_message.TestEmailMessage.test_clear_message_rfc822 -*test.test_email.test_message.TestEmailMessage.test_clear_mime_non_text -*test.test_email.test_message.TestEmailMessage.test_clear_mixed_alternative_plain_related -*test.test_email.test_message.TestEmailMessage.test_clear_mixed_related_alternative_plain_html -*test.test_email.test_message.TestEmailMessage.test_clear_mixed_related_alternative_plain_html_wrong_order -*test.test_email.test_message.TestEmailMessage.test_clear_mixed_text_message_rfc822 -*test.test_email.test_message.TestEmailMessage.test_clear_non_mime_plain -*test.test_email.test_message.TestEmailMessage.test_clear_plain_html_alternative -*test.test_email.test_message.TestEmailMessage.test_clear_plain_html_attachment_mixed -*test.test_email.test_message.TestEmailMessage.test_clear_plain_html_mixed -*test.test_email.test_message.TestEmailMessage.test_clear_related -*test.test_email.test_message.TestEmailMessage.test_clear_related_with_start -*test.test_email.test_message.TestEmailMessage.test_default_content_manager_for_add_comes_from_policy -*test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_1 -*test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_2 -*test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_3 -*test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_4 -*test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_5 -*test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_6 -*test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_7 -*test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_8 -*test.test_email.test_message.TestEmailMessage.test_get_body_empty_message -*test.test_email.test_message.TestEmailMessage.test_get_body_html_text_attachment_inline_mixed -*test.test_email.test_message.TestEmailMessage.test_get_body_html_text_attachment_mixed -*test.test_email.test_message.TestEmailMessage.test_get_body_malformed -*test.test_email.test_message.TestEmailMessage.test_get_body_message_rfc822 -*test.test_email.test_message.TestEmailMessage.test_get_body_mime_non_text -*test.test_email.test_message.TestEmailMessage.test_get_body_mixed_alternative_plain_related -*test.test_email.test_message.TestEmailMessage.test_get_body_mixed_related_alternative_plain_html -*test.test_email.test_message.TestEmailMessage.test_get_body_mixed_related_alternative_plain_html_wrong_order -*test.test_email.test_message.TestEmailMessage.test_get_body_mixed_text_message_rfc822 -*test.test_email.test_message.TestEmailMessage.test_get_body_non_mime_plain -*test.test_email.test_message.TestEmailMessage.test_get_body_plain_html_alternative -*test.test_email.test_message.TestEmailMessage.test_get_body_plain_html_attachment_mixed -*test.test_email.test_message.TestEmailMessage.test_get_body_plain_html_mixed -*test.test_email.test_message.TestEmailMessage.test_get_body_related -*test.test_email.test_message.TestEmailMessage.test_get_body_related_with_start -*test.test_email.test_message.TestEmailMessage.test_get_content_default_cm_comes_from_policy -*test.test_email.test_message.TestEmailMessage.test_get_content_with_cm -*test.test_email.test_message.TestEmailMessage.test_is_attachment -*test.test_email.test_message.TestEmailMessage.test_iter_attachment_empty_message -*test.test_email.test_message.TestEmailMessage.test_iter_attachment_html_text_attachment_inline_mixed -*test.test_email.test_message.TestEmailMessage.test_iter_attachment_html_text_attachment_mixed -*test.test_email.test_message.TestEmailMessage.test_iter_attachment_message_rfc822 -*test.test_email.test_message.TestEmailMessage.test_iter_attachment_mime_non_text -*test.test_email.test_message.TestEmailMessage.test_iter_attachment_mixed_alternative_plain_related -*test.test_email.test_message.TestEmailMessage.test_iter_attachment_mixed_related_alternative_plain_html -*test.test_email.test_message.TestEmailMessage.test_iter_attachment_mixed_related_alternative_plain_html_wrong_order -*test.test_email.test_message.TestEmailMessage.test_iter_attachment_mixed_text_message_rfc822 -*test.test_email.test_message.TestEmailMessage.test_iter_attachment_non_mime_plain -*test.test_email.test_message.TestEmailMessage.test_iter_attachment_plain_html_alternative -*test.test_email.test_message.TestEmailMessage.test_iter_attachment_plain_html_attachment_mixed -*test.test_email.test_message.TestEmailMessage.test_iter_attachment_plain_html_mixed -*test.test_email.test_message.TestEmailMessage.test_iter_attachment_related -*test.test_email.test_message.TestEmailMessage.test_iter_attachment_related_with_start -*test.test_email.test_message.TestEmailMessage.test_iter_attachments_mutation -*test.test_email.test_message.TestEmailMessage.test_iter_parts_empty_message -*test.test_email.test_message.TestEmailMessage.test_iter_parts_html_text_attachment_inline_mixed -*test.test_email.test_message.TestEmailMessage.test_iter_parts_html_text_attachment_mixed -*test.test_email.test_message.TestEmailMessage.test_iter_parts_message_rfc822 -*test.test_email.test_message.TestEmailMessage.test_iter_parts_mime_non_text -*test.test_email.test_message.TestEmailMessage.test_iter_parts_mixed_alternative_plain_related -*test.test_email.test_message.TestEmailMessage.test_iter_parts_mixed_related_alternative_plain_html -*test.test_email.test_message.TestEmailMessage.test_iter_parts_mixed_related_alternative_plain_html_wrong_order -*test.test_email.test_message.TestEmailMessage.test_iter_parts_mixed_text_message_rfc822 -*test.test_email.test_message.TestEmailMessage.test_iter_parts_non_mime_plain -*test.test_email.test_message.TestEmailMessage.test_iter_parts_plain_html_alternative -*test.test_email.test_message.TestEmailMessage.test_iter_parts_plain_html_attachment_mixed -*test.test_email.test_message.TestEmailMessage.test_iter_parts_plain_html_mixed -*test.test_email.test_message.TestEmailMessage.test_iter_parts_related -*test.test_email.test_message.TestEmailMessage.test_iter_parts_related_with_start -*test.test_email.test_message.TestEmailMessage.test_make_alternative_alternative_ -*test.test_email.test_message.TestEmailMessage.test_make_alternative_mixed_raises -*test.test_email.test_message.TestEmailMessage.test_make_alternative_no_content_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_alternative_none_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_alternative_plain_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_alternative_related_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_mixed_alternative_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_mixed_mixed_ -*test.test_email.test_message.TestEmailMessage.test_make_mixed_no_content_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_mixed_none_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_mixed_plain_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_mixed_related_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_related_alternative_raises -*test.test_email.test_message.TestEmailMessage.test_make_related_mixed_raises -*test.test_email.test_message.TestEmailMessage.test_make_related_no_content_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_related_none_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_related_plain_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_related_related_ -*test.test_email.test_message.TestEmailMessage.test_make_with_boundary_alternative_alternative_ -*test.test_email.test_message.TestEmailMessage.test_make_with_boundary_alternative_mixed_raises -*test.test_email.test_message.TestEmailMessage.test_make_with_boundary_alternative_no_content_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_with_boundary_alternative_none_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_with_boundary_alternative_plain_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_with_boundary_alternative_related_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_with_boundary_mixed_alternative_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_with_boundary_mixed_mixed_ -*test.test_email.test_message.TestEmailMessage.test_make_with_boundary_mixed_no_content_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_with_boundary_mixed_none_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_with_boundary_mixed_plain_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_with_boundary_mixed_related_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_with_boundary_related_alternative_raises -*test.test_email.test_message.TestEmailMessage.test_make_with_boundary_related_mixed_raises -*test.test_email.test_message.TestEmailMessage.test_make_with_boundary_related_no_content_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_with_boundary_related_none_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_with_boundary_related_plain_succeeds -*test.test_email.test_message.TestEmailMessage.test_make_with_boundary_related_related_ -*test.test_email.test_message.TestEmailMessage.test_policy_on_part_made_by_make_comes_from_message -*test.test_email.test_message.TestEmailMessage.test_set_content_adds_MIME_Version -*test.test_email.test_message.TestEmailMessage.test_set_content_default_cm_comes_from_policy -*test.test_email.test_message.TestEmailMessage.test_set_content_does_not_duplicate_MIME_Version -*test.test_email.test_message.TestEmailMessage.test_set_content_with_cm -*test.test_email.test_message.TestEmailMessage.test_str_defaults_to_policy_max_line_length -*test.test_email.test_message.TestEmailMessage.test_str_defaults_to_utf8 -*test.test_email.test_message.TestMIMEPart.test_add_alternative_alternative_ -*test.test_email.test_message.TestMIMEPart.test_add_alternative_mixed_raises -*test.test_email.test_message.TestMIMEPart.test_add_alternative_no_content_succeeds -*test.test_email.test_message.TestMIMEPart.test_add_alternative_none_succeeds -*test.test_email.test_message.TestMIMEPart.test_add_alternative_plain_succeeds -*test.test_email.test_message.TestMIMEPart.test_add_alternative_related_succeeds -*test.test_email.test_message.TestMIMEPart.test_add_mixed_alternative_succeeds -*test.test_email.test_message.TestMIMEPart.test_add_mixed_mixed_ -*test.test_email.test_message.TestMIMEPart.test_add_mixed_no_content_succeeds -*test.test_email.test_message.TestMIMEPart.test_add_mixed_none_succeeds -*test.test_email.test_message.TestMIMEPart.test_add_mixed_plain_succeeds -*test.test_email.test_message.TestMIMEPart.test_add_mixed_related_succeeds -*test.test_email.test_message.TestMIMEPart.test_add_related_alternative_raises -*test.test_email.test_message.TestMIMEPart.test_add_related_mixed_raises -*test.test_email.test_message.TestMIMEPart.test_add_related_no_content_succeeds -*test.test_email.test_message.TestMIMEPart.test_add_related_none_succeeds -*test.test_email.test_message.TestMIMEPart.test_add_related_plain_succeeds -*test.test_email.test_message.TestMIMEPart.test_add_related_related_ -*test.test_email.test_message.TestMIMEPart.test_clear_content_empty_message -*test.test_email.test_message.TestMIMEPart.test_clear_content_html_text_attachment_inline_mixed -*test.test_email.test_message.TestMIMEPart.test_clear_content_html_text_attachment_mixed -*test.test_email.test_message.TestMIMEPart.test_clear_content_message_rfc822 -*test.test_email.test_message.TestMIMEPart.test_clear_content_mime_non_text -*test.test_email.test_message.TestMIMEPart.test_clear_content_mixed_alternative_plain_related -*test.test_email.test_message.TestMIMEPart.test_clear_content_mixed_related_alternative_plain_html -*test.test_email.test_message.TestMIMEPart.test_clear_content_mixed_related_alternative_plain_html_wrong_order -*test.test_email.test_message.TestMIMEPart.test_clear_content_mixed_text_message_rfc822 -*test.test_email.test_message.TestMIMEPart.test_clear_content_non_mime_plain -*test.test_email.test_message.TestMIMEPart.test_clear_content_plain_html_alternative -*test.test_email.test_message.TestMIMEPart.test_clear_content_plain_html_attachment_mixed -*test.test_email.test_message.TestMIMEPart.test_clear_content_plain_html_mixed -*test.test_email.test_message.TestMIMEPart.test_clear_content_related -*test.test_email.test_message.TestMIMEPart.test_clear_content_related_with_start -*test.test_email.test_message.TestMIMEPart.test_clear_empty_message -*test.test_email.test_message.TestMIMEPart.test_clear_html_text_attachment_inline_mixed -*test.test_email.test_message.TestMIMEPart.test_clear_html_text_attachment_mixed -*test.test_email.test_message.TestMIMEPart.test_clear_message_rfc822 -*test.test_email.test_message.TestMIMEPart.test_clear_mime_non_text -*test.test_email.test_message.TestMIMEPart.test_clear_mixed_alternative_plain_related -*test.test_email.test_message.TestMIMEPart.test_clear_mixed_related_alternative_plain_html -*test.test_email.test_message.TestMIMEPart.test_clear_mixed_related_alternative_plain_html_wrong_order -*test.test_email.test_message.TestMIMEPart.test_clear_mixed_text_message_rfc822 -*test.test_email.test_message.TestMIMEPart.test_clear_non_mime_plain -*test.test_email.test_message.TestMIMEPart.test_clear_plain_html_alternative -*test.test_email.test_message.TestMIMEPart.test_clear_plain_html_attachment_mixed -*test.test_email.test_message.TestMIMEPart.test_clear_plain_html_mixed -*test.test_email.test_message.TestMIMEPart.test_clear_related -*test.test_email.test_message.TestMIMEPart.test_clear_related_with_start -*test.test_email.test_message.TestMIMEPart.test_default_content_manager_for_add_comes_from_policy -*test.test_email.test_message.TestMIMEPart.test_get_body_empty_message -*test.test_email.test_message.TestMIMEPart.test_get_body_html_text_attachment_inline_mixed -*test.test_email.test_message.TestMIMEPart.test_get_body_html_text_attachment_mixed -*test.test_email.test_message.TestMIMEPart.test_get_body_message_rfc822 -*test.test_email.test_message.TestMIMEPart.test_get_body_mime_non_text -*test.test_email.test_message.TestMIMEPart.test_get_body_mixed_alternative_plain_related -*test.test_email.test_message.TestMIMEPart.test_get_body_mixed_related_alternative_plain_html -*test.test_email.test_message.TestMIMEPart.test_get_body_mixed_related_alternative_plain_html_wrong_order -*test.test_email.test_message.TestMIMEPart.test_get_body_mixed_text_message_rfc822 -*test.test_email.test_message.TestMIMEPart.test_get_body_non_mime_plain -*test.test_email.test_message.TestMIMEPart.test_get_body_plain_html_alternative -*test.test_email.test_message.TestMIMEPart.test_get_body_plain_html_attachment_mixed -*test.test_email.test_message.TestMIMEPart.test_get_body_plain_html_mixed -*test.test_email.test_message.TestMIMEPart.test_get_body_related -*test.test_email.test_message.TestMIMEPart.test_get_body_related_with_start -*test.test_email.test_message.TestMIMEPart.test_get_content_default_cm_comes_from_policy -*test.test_email.test_message.TestMIMEPart.test_get_content_with_cm -*test.test_email.test_message.TestMIMEPart.test_is_attachment -*test.test_email.test_message.TestMIMEPart.test_iter_attachment_empty_message -*test.test_email.test_message.TestMIMEPart.test_iter_attachment_html_text_attachment_inline_mixed -*test.test_email.test_message.TestMIMEPart.test_iter_attachment_html_text_attachment_mixed -*test.test_email.test_message.TestMIMEPart.test_iter_attachment_message_rfc822 -*test.test_email.test_message.TestMIMEPart.test_iter_attachment_mime_non_text -*test.test_email.test_message.TestMIMEPart.test_iter_attachment_mixed_alternative_plain_related -*test.test_email.test_message.TestMIMEPart.test_iter_attachment_mixed_related_alternative_plain_html -*test.test_email.test_message.TestMIMEPart.test_iter_attachment_mixed_related_alternative_plain_html_wrong_order -*test.test_email.test_message.TestMIMEPart.test_iter_attachment_mixed_text_message_rfc822 -*test.test_email.test_message.TestMIMEPart.test_iter_attachment_non_mime_plain -*test.test_email.test_message.TestMIMEPart.test_iter_attachment_plain_html_alternative -*test.test_email.test_message.TestMIMEPart.test_iter_attachment_plain_html_attachment_mixed -*test.test_email.test_message.TestMIMEPart.test_iter_attachment_plain_html_mixed -*test.test_email.test_message.TestMIMEPart.test_iter_attachment_related -*test.test_email.test_message.TestMIMEPart.test_iter_attachment_related_with_start -*test.test_email.test_message.TestMIMEPart.test_iter_attachments_mutation -*test.test_email.test_message.TestMIMEPart.test_iter_parts_empty_message -*test.test_email.test_message.TestMIMEPart.test_iter_parts_html_text_attachment_inline_mixed -*test.test_email.test_message.TestMIMEPart.test_iter_parts_html_text_attachment_mixed -*test.test_email.test_message.TestMIMEPart.test_iter_parts_message_rfc822 -*test.test_email.test_message.TestMIMEPart.test_iter_parts_mime_non_text -*test.test_email.test_message.TestMIMEPart.test_iter_parts_mixed_alternative_plain_related -*test.test_email.test_message.TestMIMEPart.test_iter_parts_mixed_related_alternative_plain_html -*test.test_email.test_message.TestMIMEPart.test_iter_parts_mixed_related_alternative_plain_html_wrong_order -*test.test_email.test_message.TestMIMEPart.test_iter_parts_mixed_text_message_rfc822 -*test.test_email.test_message.TestMIMEPart.test_iter_parts_non_mime_plain -*test.test_email.test_message.TestMIMEPart.test_iter_parts_plain_html_alternative -*test.test_email.test_message.TestMIMEPart.test_iter_parts_plain_html_attachment_mixed -*test.test_email.test_message.TestMIMEPart.test_iter_parts_plain_html_mixed -*test.test_email.test_message.TestMIMEPart.test_iter_parts_related -*test.test_email.test_message.TestMIMEPart.test_iter_parts_related_with_start -*test.test_email.test_message.TestMIMEPart.test_make_alternative_alternative_ -*test.test_email.test_message.TestMIMEPart.test_make_alternative_mixed_raises -*test.test_email.test_message.TestMIMEPart.test_make_alternative_no_content_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_alternative_none_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_alternative_plain_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_alternative_related_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_mixed_alternative_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_mixed_mixed_ -*test.test_email.test_message.TestMIMEPart.test_make_mixed_no_content_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_mixed_none_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_mixed_plain_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_mixed_related_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_related_alternative_raises -*test.test_email.test_message.TestMIMEPart.test_make_related_mixed_raises -*test.test_email.test_message.TestMIMEPart.test_make_related_no_content_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_related_none_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_related_plain_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_related_related_ -*test.test_email.test_message.TestMIMEPart.test_make_with_boundary_alternative_alternative_ -*test.test_email.test_message.TestMIMEPart.test_make_with_boundary_alternative_mixed_raises -*test.test_email.test_message.TestMIMEPart.test_make_with_boundary_alternative_no_content_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_with_boundary_alternative_none_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_with_boundary_alternative_plain_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_with_boundary_alternative_related_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_with_boundary_mixed_alternative_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_with_boundary_mixed_mixed_ -*test.test_email.test_message.TestMIMEPart.test_make_with_boundary_mixed_no_content_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_with_boundary_mixed_none_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_with_boundary_mixed_plain_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_with_boundary_mixed_related_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_with_boundary_related_alternative_raises -*test.test_email.test_message.TestMIMEPart.test_make_with_boundary_related_mixed_raises -*test.test_email.test_message.TestMIMEPart.test_make_with_boundary_related_no_content_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_with_boundary_related_none_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_with_boundary_related_plain_succeeds -*test.test_email.test_message.TestMIMEPart.test_make_with_boundary_related_related_ -*test.test_email.test_message.TestMIMEPart.test_policy_on_part_made_by_make_comes_from_message -*test.test_email.test_message.TestMIMEPart.test_set_content_default_cm_comes_from_policy -*test.test_email.test_message.TestMIMEPart.test_set_content_does_not_add_MIME_Version -*test.test_email.test_message.TestMIMEPart.test_set_content_with_cm -*test.test_email.test_message.TestMIMEPart.test_string_payload_with_multipart_content_type -*test.test_email.test_parser.TestBytesParser.test_custom_message_factory_on_policy -*test.test_email.test_parser.TestBytesParser.test_factory_arg_overrides_policy -*test.test_email.test_parser.TestBytesParser.test_only_split_on_cr_lf -*test.test_email.test_parser.TestCustomMessage.test_custom_message_gets_policy_if_possible_from_file -*test.test_email.test_parser.TestCustomMessage.test_custom_message_gets_policy_if_possible_from_string -*test.test_email.test_parser.TestParser.test_custom_message_factory_on_policy -*test.test_email.test_parser.TestParser.test_factory_arg_overrides_policy -*test.test_email.test_parser.TestParser.test_only_split_on_cr_lf -*test.test_email.test_pickleable.TestPickleCopyHeader.test_deepcopy_date -*test.test_email.test_pickleable.TestPickleCopyHeader.test_deepcopy_from -*test.test_email.test_pickleable.TestPickleCopyHeader.test_deepcopy_subject -*test.test_email.test_pickleable.TestPickleCopyHeader.test_deepcopy_to -*test.test_email.test_pickleable.TestPickleCopyHeader.test_pickle_date -*test.test_email.test_pickleable.TestPickleCopyHeader.test_pickle_from -*test.test_email.test_pickleable.TestPickleCopyHeader.test_pickle_subject -*test.test_email.test_pickleable.TestPickleCopyHeader.test_pickle_to -*test.test_email.test_pickleable.TestPickleCopyMessage.test_deepcopy_created -*test.test_email.test_pickleable.TestPickleCopyMessage.test_deepcopy_parsed -*test.test_email.test_pickleable.TestPickleCopyMessage.test_pickle_created -*test.test_email.test_pickleable.TestPickleCopyMessage.test_pickle_parsed -*test.test_email.test_policy.PolicyAPITests.test_abc -*test.test_email.test_policy.PolicyAPITests.test_adding_default_policies_preserves_default_factory -*test.test_email.test_policy.PolicyAPITests.test_all_attributes_covered -*test.test_email.test_policy.PolicyAPITests.test_clone_copies_factory -*test.test_email.test_policy.PolicyAPITests.test_default_header_factory -*test.test_email.test_policy.PolicyAPITests.test_defaults -*test.test_email.test_policy.PolicyAPITests.test_each_Policy_gets_unique_factory -*test.test_email.test_policy.PolicyAPITests.test_fold_zero_max_line_length -*test.test_email.test_policy.PolicyAPITests.test_handle_defect_raises_on_strict -*test.test_email.test_policy.PolicyAPITests.test_handle_defect_registers_defect -*test.test_email.test_policy.PolicyAPITests.test_new_factory_overrides_default -*test.test_email.test_policy.PolicyAPITests.test_non_ascii_chars_do_not_cause_inf_loop -*test.test_email.test_policy.PolicyAPITests.test_overridden_register_defect_still_raises -*test.test_email.test_policy.PolicyAPITests.test_overridden_register_defect_works -*test.test_email.test_policy.PolicyAPITests.test_policy_addition -*test.test_email.test_policy.PolicyAPITests.test_policy_is_immutable -*test.test_email.test_policy.PolicyAPITests.test_register_defect -*test.test_email.test_policy.PolicyAPITests.test_reject_non_policy_keyword_when_called -*test.test_email.test_policy.PolicyAPITests.test_set_policy_attrs_when_cloned -*test.test_email.test_policy.PolicyAPITests.test_short_maxlen_error -*test.test_email.test_policy.TestConcretePolicies.test_header_store_parse_rejects_newlines -*test.test_email.test_policy.TestPolicyPropagation.test_bytes_parser -*test.test_email.test_policy.TestPolicyPropagation.test_message_from_binary_file -*test.test_email.test_policy.TestPolicyPropagation.test_message_from_bytes -*test.test_email.test_policy.TestPolicyPropagation.test_message_from_file -*test.test_email.test_policy.TestPolicyPropagation.test_message_from_string -*test.test_email.test_policy.TestPolicyPropagation.test_message_policy_propagates_to_generator -*test.test_email.test_policy.TestPolicyPropagation.test_message_policy_used_by_as_string -*test.test_email.test_policy.TestPolicyPropagation.test_parser -*test.test_email.test_policy.TestPolicyPropagation.test_parser_propagates_policy_to_message -*test.test_email.test_policy.TestPolicyPropagation.test_parser_propagates_policy_to_sub_messages -*test.test_email.test_utils.DateTimeTests.test_aware_datetime -*test.test_email.test_utils.DateTimeTests.test_naive_datetime -*test.test_email.test_utils.DateTimeTests.test_parsedate_to_datetime -*test.test_email.test_utils.DateTimeTests.test_parsedate_to_datetime_naive -*test.test_email.test_utils.DateTimeTests.test_parsedate_to_datetime_with_invalid_raises_valueerror -*test.test_email.test_utils.DateTimeTests.test_usegmt -*test.test_email.test_utils.DateTimeTests.test_usegmt_with_naive_datetime_raises -*test.test_email.test_utils.DateTimeTests.test_usegmt_with_non_utc_datetime_raises -*test.test_email.test_utils.LocaltimeTests.test_localtime_daylight_false_dst_false -*test.test_email.test_utils.LocaltimeTests.test_localtime_daylight_false_dst_true -*test.test_email.test_utils.LocaltimeTests.test_localtime_daylight_true_dst_false -*test.test_email.test_utils.LocaltimeTests.test_localtime_daylight_true_dst_true -*test.test_email.test_utils.LocaltimeTests.test_localtime_epoch_notz_daylight_false -*test.test_email.test_utils.LocaltimeTests.test_localtime_epoch_notz_daylight_true -*test.test_email.test_utils.LocaltimeTests.test_localtime_epoch_utc_daylight_false -*test.test_email.test_utils.LocaltimeTests.test_localtime_epoch_utc_daylight_true -*test.test_email.test_utils.LocaltimeTests.test_localtime_is_tz_aware_daylight_false -*test.test_email.test_utils.LocaltimeTests.test_localtime_is_tz_aware_daylight_true -*test.test_email.test_utils.LocaltimeTests.test_variable_tzname +test.test_email.test__encoded_words.TestDecode.test_b_case_ignored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecode.test_b_invalid_bytes_ignored_with_defect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecode.test_b_invalid_bytes_incorrect_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecode.test_b_padding_defect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecode.test_b_undecodable_bytes_ignored_with_defect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecode.test_non_trivial_q @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecode.test_nonnull_lang @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecode.test_q_case_ignored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecode.test_q_escaped_bytes_preserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecode.test_q_nonascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecode.test_simple_b @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecode.test_simple_q @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecode.test_unknown_8bit_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecode.test_unknown_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecode.test_wrong_format_input_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecodeB.test_invalid_character @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecodeB.test_invalid_character_and_bad_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecodeB.test_invalid_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecodeB.test_missing_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecodeB.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecodeQ.test_no_encoded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecodeQ.test_run_of_encoded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestDecodeQ.test_spaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestEncode.test_auto_b_if_enough_unsafe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestEncode.test_auto_b_if_long_unsafe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestEncode.test_auto_q @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestEncode.test_auto_q_if_long_mostly_safe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestEncode.test_auto_q_if_short_mostly_safe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestEncode.test_b @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestEncode.test_lang @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestEncode.test_q @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestEncode.test_unknown_8bit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestEncode.test_utf8_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestEncodeB.test_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestEncodeB.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestEncodeQ.test_all_safe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestEncodeQ.test_run_of_encodables @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__encoded_words.TestEncodeQ.test_spaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestFolding.test_address_list_folding_at_commas @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestFolding.test_address_list_with_unicode_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestFolding.test_address_list_with_unicode_names_in_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestFolding.test_ews_combined_before_wrap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestFolding.test_long_filename_attachment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestFolding.test_one_ew_on_each_of_two_wrapped_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestFolding.test_overlong_encodeable_is_wrapped @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestFolding.test_simple_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestFolding.test_simple_unstructured_folded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestFolding.test_simple_unstructured_no_folds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestFolding.test_split_at_whitespace_after_header_before_long_token @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestFolding.test_split_at_whitespace_before_long_token @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestFolding.test_unstructured_with_unicode_no_folds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test__wsp_splitter_one_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test__wsp_splitter_two_words @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test__wsp_splitter_ws_runs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_encoded_word_inside_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_dot_atom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_ends_at_special @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_multiple_domains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_normal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_quoted_strings_in_atom_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_with_cfws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_with_doamin_literal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_with_qouoted_string_and_cfws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_address_complex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_address_empty_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_address_ends_at_special @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_address_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_address_invalid_mailbox_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_address_list_CFWS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_address_list_group_and_mailboxes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_address_list_group_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_address_list_group_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_address_list_mailboxes_complex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_address_list_mailboxes_invalid_addresses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_address_list_mailboxes_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_address_list_mailboxes_two_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_address_quoted_local_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_address_quoted_strings_in_atom_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_address_rfc2047_display_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_address_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_ends_at_special @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_internal_cfws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_missing_closing_angle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_missing_closing_angle_with_cfws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_no_angle_before_special_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_no_angle_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_no_angle_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_obs_route @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_qs_and_domain_literal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_qs_only_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_special_after_angle_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_with_cfws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_atext_all_atext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_atext_following_wsp_preserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_atext_non_printables @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_atext_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_atext_two_words_gets_first @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_atext_up_to_special @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_atom_ends_at_noncfws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_atom_ends_at_special @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_header_ends_in_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_no_atom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_no_atom_before_special @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_non_printable_in_atext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_non_printable_in_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_rfc2047_atom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_with_comments_and_wsp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_with_multiple_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_with_wsp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_empty_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_end_dquote_mid_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_following_wsp_preserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_missing_endquotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_multiple_words @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_multiple_words_wsp_preserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_must_start_with_dquote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_no_end_dquote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_non_printables @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_only_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_quoted_dquote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_cfws_ends_at_non_leader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_cfws_ends_at_non_printable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_cfws_header_ends_in_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_cfws_multiple_nested_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_cfws_non_printable_in_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_cfws_only_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_cfws_only_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_cfws_only_ws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_empty_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_end_paren_mid_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_following_wsp_preserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_missing_end_of_nesting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_multiple_nesting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_multiple_words @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_multiple_words_wsp_preserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_must_start_with_paren @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_nested_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_nested_comment_wsp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_no_end_paren @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_non_printable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_qs_in_nested_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_quoted_parens @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_display_name_complex1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_display_name_complex2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_display_name_ending_with_obsolete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_display_name_for_invalid_address_field @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_display_name_obsolete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_display_name_pharse_must_start_with_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_display_name_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_domain_literal_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_domain_literal_with_cfws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_domain_literal_with_cfws_ends_at_special @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_domain_with_cfws_ends_at_special @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_literal_bad_dtext_char_before_special_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_literal_no_start_char_before_special_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_literal_no_start_char_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_literal_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_literal_with_internal_ws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_literal_with_surrounding_cfws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_no_atom_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_no_non_cfws_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_obsolete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_regular_domain_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_with_cfws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_leading_dot_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_no_atom_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_rfc2047_atom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_space_ends_dot_atom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text_lone_atom_is_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text_raises_on_leading_dot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text_raises_on_leading_non_atext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text_raises_on_trailing_dot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text_trailing_text_preserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text_trailing_ws_preserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_trailing_dot_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_two_dots_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_with_comments_and_wsp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_with_wsp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_all_dtext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_close_bracket_mid_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_following_wsp_preserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_non_printables @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_open_bracket_mid_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_two_words_gets_first @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_up_to_close_bracket_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_up_to_open_bracket_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_with_qp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_wsp_before_close_bracket_preserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_wsp_before_open_bracket_preserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_gets_first @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_gets_first_even_if_no_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_internal_spaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_invalid_cte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_lang_default_is_blank @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_leading_internal_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_missing_end_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_missing_middle_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_missing_start_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_non_printable_defect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_quopri_utf_escape_follows_cte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_sets_extra_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_valid_ew @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_fws_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_fws_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_fws_ws_run @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_group_cfws_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_group_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_group_list_cfws_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_group_list_comment_only_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_group_list_mailbox_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_group_list_obs_group_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_group_missing_final_semicol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_group_mixed_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_group_null_addr_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_group_one_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_group_single_mailbox @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_complex_obsolete_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_complex_obsolete_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_double_dot_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_leading_dot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_leading_dot_after_ws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_no_part_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_quoted_strings_in_atom_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_quoted_with_cfws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_quoted_with_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_simple_obsolete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_simple_quoted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_special_instead_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_trailing_dot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_trailing_dot_with_ws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_unicode_defect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_valid_and_invalid_qp_in_atom_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_with_cfws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_with_dot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_with_quoted_dot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_with_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_addr_spec_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_angle_addr_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_ends_at_special @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_empty_list_element @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_junk_after_valid_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_only_empty_elements @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_single_addr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_two_complex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_two_name_addr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_two_simple_addr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_unparseable_mailbox_null @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_name_addr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_quoted_strings_in_atom_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_msg_id_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_msg_id_invalid_expected_msg_id_not_found @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_msg_id_no_angle_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_msg_id_no_angle_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_msg_id_no_id_right_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_msg_id_non_folding_literal_domain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_msg_id_obsolete_domain_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_msg_id_obsolete_local @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_msg_id_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_angle_addr_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_atom_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_atom_name_with_cfws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_ends_at_special @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_name_with_cfws_and_dots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_no_angle_after_display_name_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_no_content_before_special_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_no_content_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_qs_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_with_route @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_obs_route_complex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_obs_route_no_route_before_end_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_obs_route_no_route_before_special_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_obs_route_no_route_before_special_raises2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_obs_route_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_phrase_complex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_phrase_ending_with_obsolete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_phrase_obsolete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_phrase_pharse_must_start_with_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_phrase_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qcontent_all_printables @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qcontent_close_paren_mid_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qcontent_following_wsp_preserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qcontent_non_printables @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qcontent_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qcontent_two_words_gets_first @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qcontent_up_to_dquote_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qcontent_wsp_before_close_paren_preserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_all_printables @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_close_paren_mid_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_following_wsp_preserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_non_printables @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_open_paren_mid_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_two_words_gets_first @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_up_to_close_paren_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_up_to_open_paren_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_wsp_before_close_paren_preserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_wsp_before_open_paren_preserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_header_ends_in_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_header_ends_in_qcontent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_internal_ws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_no_quoted_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_non_printable_in_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_non_printable_in_qcontent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_qs_ends_at_noncfws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_with_comments_and_wsp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_with_multiple_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_with_wsp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_ew_with_internal_leading_ws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_ew_with_internal_ws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_ew_without_leading_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_ew_without_trailing_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invalid_base64_character @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invalid_base64_character_and_bad_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invalid_base64_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invalid_ew @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invalid_ew2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invalid_ew_cte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_leading_and_trailing_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_leading_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_missing_base64_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_no_whitespace_between_ews @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_normal_phrase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_normal_phrase_with_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_null @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_one_ew_trailing_ws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_one_valid_ew_no_ws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_one_valid_ew_trailing_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_one_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_phrase_with_ew_in_middle_of_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_phrase_with_ew_with_leading_ws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_phrase_with_two_ew @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_phrase_with_two_ew_extra_ws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_phrase_with_two_ew_trailing_ws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_trailing_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_two_ew_extra_ws_trailing_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_undecodable_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_undecodable_bytes_in_EW @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_without_trailing_whitespace_hang_case @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_word_all_CFWS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_word_atom_yields_atom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_word_ends_at_dot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_get_word_qs_yields_qs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_invalid_content_disposition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_invalid_content_transfer_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_parse_invalid_message_id @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_parse_message_id_with_remaining @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestParser.test_parse_valid_message_id @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.TestTokens.test_EWWhiteSpaceTerminal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_duplicate_and_missing_split_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_duplicate_in_split_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_duplicate_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_duplicate_key_with_split_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_duplicate_key_with_split_value_other_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_duplicate_with_broken_split_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_extra_dquote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_missing_split_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_multiple_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_split_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.Test_parse_mime_version.test_value_RFC_2045_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.Test_parse_mime_version.test_value_RFC_2045_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.Test_parse_mime_version.test_value_RFC_2045_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.Test_parse_mime_version.test_value_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test__header_value_parser.Test_parse_mime_version.test_value_rfc_2045_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_asian_codecs.TestEmailAsianCodecs.test_japanese_codecs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_asian_codecs.TestEmailAsianCodecs.test_payload_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_asian_codecs.TestEmailAsianCodecs.test_payload_encoding_utf8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_get_content_key_full_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_get_content_key_maintype_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_get_content_key_null_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_get_content_key_order_full_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_get_content_key_order_maintype_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_get_content_key_order_null_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_get_content_raises_if_unknown_mimetype_and_no_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_calls_clear_content @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_base_full_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_base_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_base_qualname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_base_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_full_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_null_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_base_full_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_base_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_base_qualname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_base_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_full_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_null_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_qualname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_str_full_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_str_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_str_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_qualname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_str_full_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_str_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_str_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_raises_if_called_on_multipart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_raises_if_unknown_type_and_no_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_cid_receiver_application_octet_stream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_cid_receiver_image_jpeg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_cid_receiver_message_external_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_cid_receiver_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_cid_receiver_text_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_cid_receiver_text_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_disposition_inline_receiver_application_octet_stream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_disposition_inline_receiver_image_jpeg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_disposition_inline_receiver_message_external_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_disposition_inline_receiver_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_disposition_inline_receiver_text_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_disposition_inline_receiver_text_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_message_non_rfc822_or_external_body_yields_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_message_rfc822_and_external_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_non_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_non_text_invalid_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_raises_on_multipart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_text_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_text_invalid_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain_bad_utf8_quoted_printable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain_bad_utf8_quoted_printable_ignore_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain_latin1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain_latin1_quoted_printable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain_utf8_base64 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain_utf8_base64_recoverable_bad_CTE_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_header_receiver_application_octet_stream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_header_receiver_image_jpeg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_header_receiver_message_external_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_header_receiver_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_header_receiver_text_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_header_receiver_text_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_non_ascii_filename_receiver_application_octet_stream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_non_ascii_filename_receiver_image_jpeg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_non_ascii_filename_receiver_message_external_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_non_ascii_filename_receiver_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_non_ascii_filename_receiver_text_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_non_ascii_filename_receiver_text_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_params_receiver_application_octet_stream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_params_receiver_image_jpeg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_params_receiver_message_external_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_params_receiver_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_params_receiver_text_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_params_receiver_text_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_application_octet_stream_with_8bit_cte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_content_bytes_cte_7bit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_disposition_attachment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_disposition_foo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_disposition_inline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_filename_and_disposition_inline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_headers_from_header_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_headers_from_strings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_headers_with_defective_header_header_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_headers_with_defective_string_header_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_headers_with_invalid_duplicate_header_header_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_headers_with_invalid_duplicate_string_header_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_image_jpg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_message_invalid_cte_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_message_with_non_ascii_and_coercion_to_7bit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_non_ascii_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_11_lines_long_line_maximal_non_ascii_heuristics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_11_lines_long_line_minimal_non_ascii_heuristics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_11_lines_maximal_non_ascii_heuristics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_charset_latin_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_long_line_maximal_non_ascii_heuristics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_long_line_minimal_non_ascii_heuristics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_maximal_non_ascii_heuristics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_non_ascii_with_charset_ascii_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_non_ascii_with_cte_7bit_and_charset_ascii_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_non_ascii_with_cte_7bit_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_plain_long_line_heuristics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_plain_null @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_short_line_minimal_non_ascii_heuristics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_video_mpeg_with_binary_cte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectCapture.test_bad_padding_in_base64_payload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectCapture.test_first_line_is_continuation_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectCapture.test_invalid_chars_in_base64_payload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectCapture.test_invalid_length_of_base64_payload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectCapture.test_lying_multipart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectCapture.test_missing_ending_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectCapture.test_missing_header_body_separator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectCapture.test_missing_start_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectCapture.test_multipart_invalid_cte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectCapture.test_multipart_no_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectCapture.test_multipart_no_cte_no_defect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectCapture.test_multipart_valid_cte_no_defect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectCapture.test_same_boundary_inner_outer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectDetection.test_bad_padding_in_base64_payload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectDetection.test_first_line_is_continuation_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectDetection.test_invalid_chars_in_base64_payload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectDetection.test_invalid_length_of_base64_payload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectDetection.test_lying_multipart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectDetection.test_missing_ending_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectDetection.test_missing_header_body_separator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectDetection.test_missing_start_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectDetection.test_multipart_invalid_cte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectDetection.test_multipart_no_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectDetection.test_multipart_no_cte_no_defect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectDetection.test_multipart_valid_cte_no_defect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectDetection.test_same_boundary_inner_outer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectRaising.test_bad_padding_in_base64_payload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectRaising.test_first_line_is_continuation_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectRaising.test_invalid_chars_in_base64_payload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectRaising.test_invalid_length_of_base64_payload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectRaising.test_lying_multipart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectRaising.test_missing_ending_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectRaising.test_missing_header_body_separator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectRaising.test_missing_start_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectRaising.test_multipart_invalid_cte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectRaising.test_multipart_no_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectRaising.test_multipart_no_cte_no_defect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectRaising.test_multipart_valid_cte_no_defect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_defect_handling.TestDefectRaising.test_same_boundary_inner_outer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_8bit_in_base64_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_8bit_in_quopri_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_8bit_in_uuencode_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_8bit_multipart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_bytes_feedparser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_bytes_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_bytes_generator_b_encoding_linesep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_bytes_generator_handles_None_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_bytes_generator_with_unix_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_crlf_flatten @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_decoded_generator_emits_unicode_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_del_rfc2231_params_with_8bit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_generator_b_encoding_linesep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_generator_handles_8bit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_get_8bit_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_get_all_with_8bit_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_get_content_type_with_8bit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_get_params_with_8bit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_get_payload_with_8bit_cte_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_get_rfc2231_params_with_8bit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_invalid_8bit_in_non_8bit_cte_uses_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_items_with_8bit_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_known_8bit_CTE @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_message_from_binary_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_print_8bit_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_set_rfc2231_params_with_8bit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_str_generator_should_not_mutate_msg_when_handling_8bit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_string_generator_reencodes_to_quopri_when_appropriate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_unknown_8bit_CTE @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.Test8BitBytesHandling.test_values_with_8bit_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBase64.test_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBase64.test_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBase64.test_header_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBase64.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_MIME_digest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_MIME_digest_with_part_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_content_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_dsn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_long_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_message_delivery_status @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_message_external_body_idempotent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_message_signed_idempotent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_mixed_with_image @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_more_rfc2231_parameters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_multipart_no_parts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_multipart_one_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_multipart_report @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_nested_multipart_mixeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_no_start_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_parse_text_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_parse_untyped_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_parser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_preamble_epilogue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_rfc2231_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_simple_multipart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_text_plain_in_a_multipart_digest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_MIME_digest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_MIME_digest_with_part_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_content_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_dsn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_long_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_message_delivery_status @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_message_external_body_idempotent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_message_signed_idempotent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_mixed_with_image @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_more_rfc2231_parameters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_multipart_no_parts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_multipart_one_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_multipart_report @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_nested_multipart_mixeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_no_start_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_parse_text_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_parse_untyped_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_parser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_preamble_epilogue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_rfc2231_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_simple_multipart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_text_plain_in_a_multipart_digest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestCharset.test_body_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestCharset.test_codec_encodeable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestCharset.test_unicode_charset_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestEncoders.test_EncodersEncode_base64 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestEncoders.test_default_cte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestEncoders.test_encode7or8bit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestEncoders.test_encode_empty_payload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestEncoders.test_qp_encode_latin1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestEncoders.test_qp_encode_non_latin1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestFeedParsers.test_empty_header_name_handled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestFeedParsers.test_long_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestFeedParsers.test_newlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestFromMangling.test_dont_mangle_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestFromMangling.test_mangle_from_in_preamble_and_epilog @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestFromMangling.test_mangled_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestFromMangling.test_mangled_from_with_bad_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestFromMangling.test_multipart_with_bad_bytes_in_cte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_bad_8bit_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_base64_splittable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_broken_base64_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_empty_header_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_encode_preserves_leading_ws_on_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_encoded_adjacent_nonencoded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_escaped_8bit_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_explicit_maxlinelen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_flatten_header_with_no_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_header_ctor_default_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_header_handles_binary_unknown8bit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_header_needs_no_decoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_make_header_handles_binary_unknown8bit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_modify_returned_list_does_not_change_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_multilingual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_quopri_splittable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_shift_jis_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_simple_surprise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_string_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_us_ascii_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_utf8_shortest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_whitespace_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeader.test_whitespace_keeper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestHeaderRegistry.test_HeaderRegistry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_MIME_digest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_MIME_digest_with_part_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_content_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_dsn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_long_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_message_delivery_status @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_message_external_body_idempotent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_message_signed_idempotent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_mixed_with_image @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_more_rfc2231_parameters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_multipart_no_parts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_multipart_one_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_multipart_report @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_nested_multipart_mixeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_no_start_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_parse_text_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_parse_untyped_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_parser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_preamble_epilogue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_rfc2231_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_simple_multipart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIdempotent.test_text_plain_in_a_multipart_digest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIterators.test_body_line_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIterators.test_pushCR_LF @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIterators.test_push_random @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIterators.test_typed_subpart_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestIterators.test_typed_subpart_iterator_default_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_another_long_almost_unsplittable_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_another_long_multiline_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_header_encode_with_different_output_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_header_splitter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_last_split_chunk_does_not_fit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_leading_splittable_in_the_middle_just_before_overlong_last_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_long_8bit_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_long_8bit_header_no_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_long_field_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_long_header_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_long_header_encode_with_different_output_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_long_header_encode_with_tab_continuation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_long_header_encode_with_tab_continuation_is_just_a_hint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_long_header_with_multiple_sequential_split_chars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_long_header_with_whitespace_runs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_long_line_after_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_long_lines_with_different_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_long_nonstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_long_received_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_long_rfc2047_header_with_embedded_fws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_long_run_with_semi_header_splitter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_long_to_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_long_unbreakable_lines_with_continuation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_multiline_with_overlong_last_part_followed_by_split_point @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_multiline_with_overlong_parts_separated_by_two_split_points @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_multiple_splittable_leading_char_followed_by_overlong_unsplittable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_no_semis_header_splitter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_no_split_long_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_overlong_last_part_followed_by_split_point @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_shorter_line_with_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_split_long_continuation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_splittable_leading_char_followed_by_overlong_unsplittable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_splitter_split_on_punctuation_only_if_fws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_splitter_split_on_punctuation_only_if_fws_with_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_splitting_first_line_only_is_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_splitting_multiple_long_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_string_headerinst_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_trailing_splittable_on_overlong_unsplittable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestLongHeaders.test_trailing_splittable_on_overlong_unsplittable_with_leading_splittable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEApplication.test_binary_body_with_encode_7or8bit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEApplication.test_binary_body_with_encode_base64 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEApplication.test_binary_body_with_encode_noop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEApplication.test_binary_body_with_encode_quopri @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEApplication.test_binary_body_with_unicode_linend_encode_noop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEApplication.test_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEApplication.test_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEAudio.test_add_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEAudio.test_checkSetMinor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEAudio.test_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEAudio.test_guess_minor_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEImage.test_add_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEImage.test_checkSetMinor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEImage.test_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEImage.test_guess_minor_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEMessage.test_bad_multipart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEMessage.test_default_multipart_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEMessage.test_default_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEMessage.test_default_type_non_parsed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEMessage.test_default_type_with_explicit_container_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEMessage.test_dsn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEMessage.test_epilogue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEMessage.test_generate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEMessage.test_mime_attachments_in_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEMessage.test_multipart_custom_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEMessage.test_multipart_default_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEMessage.test_no_nl_preamble @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEMessage.test_parse_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEMessage.test_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEMessage.test_valid_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEText.test_7bit_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEText.test_7bit_input_no_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEText.test_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEText.test_payload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEText.test_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMIMEText.test_utf8_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test__contains__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_add_header_with_name_only_param @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_add_header_with_no_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_as_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_as_bytes_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_as_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_as_string_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_ascii_add_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_ascii_add_header_with_tspecial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_attach_when_payload_is_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_bad_param @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_binary_base64_payload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_binary_quopri_payload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_bogus_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_broken_unicode_payload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_byte_message_rfc822_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_decoded_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_del_nonexistent_param @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_del_param @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_del_param_on_nonexistent_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_del_param_on_other_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_embedded_header_via_Header_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_embedded_header_via_string_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_field_containment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_charsets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_disposition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_maintype_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_maintype_from_message_explicit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_maintype_from_message_implicit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_maintype_from_message_text_plain_explicit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_maintype_from_message_text_plain_implicit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_maintype_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_maintype_missing_with_default_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_subtype_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_subtype_from_message_explicit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_subtype_from_message_implicit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_subtype_from_message_text_plain_explicit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_subtype_from_message_text_plain_implicit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_subtype_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_subtype_missing_with_default_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_type_from_message_explicit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_type_from_message_implicit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_type_from_message_text_plain_explicit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_type_from_message_text_plain_implicit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_type_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_content_type_missing_with_default_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_decoded_payload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_filename_with_name_parameter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_param @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_param_funky_continuation_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_param_liberal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_param_with_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_param_with_semis_in_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_get_payload_n_raises_on_non_multipart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_getset_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_make_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_message_rfc822_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_missing_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_missing_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_noascii_add_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_nonascii_add_header_via_triple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_nonascii_add_header_with_tspecial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_nonascii_as_string_without_content_type_and_cte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_nonascii_as_string_without_cte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_questionable_bytes_payload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_replace_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_set_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_set_charset_from_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_set_param @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_set_payload_to_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_set_payload_with_8bit_data_and_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_set_payload_with_8bit_data_and_charset_body_encoding_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_set_payload_with_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_set_payload_with_non_ascii_and_charset_body_encoding_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_set_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_set_type_on_other_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_unicode_body_defaults_to_utf8_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMessageAPI.test_unicode_header_defaults_to_utf8_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_BytesGenerator_linend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_BytesGenerator_linend_with_non_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_Generator_linend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_accepts_any_charset_like_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_charset_richcomparisons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_charsets_case_insensitive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_custom_message_does_not_require_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_escape_backslashes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_escape_dump @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_formataddr_does_not_quote_parens_in_quoted_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_formatdate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_formatdate_localtime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_formatdate_usegmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_get_body_encoding_with_bogus_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_get_body_encoding_with_uppercase_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_getaddresses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_getaddresses_embedded_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_getaddresses_header_obj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_getaddresses_nasty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_invalid_charset_like_object_raises_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_make_msgid_collisions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_make_msgid_default_domain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_make_msgid_domain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_make_msgid_idstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_message_from_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_message_from_file_with_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_message_from_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_message_from_string_with_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_mime_classes_policy_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_mktime_tz @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_multiline_from_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_name_with_dot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_noquote_dump @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_parseaddr_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_parseaddr_multiple_domains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_parseaddr_preserves_quoted_pairs_in_addresses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_parseaddr_preserves_spaces_in_local_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_acceptable_to_time_functions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_accepts_time_with_dots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_compact @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_dot_time_delimiter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_no_dayofweek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_no_seconds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_no_space_before_negative_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_no_space_before_positive_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_returns_None_for_invalid_strings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_rfc_850 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_y2k @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_partial_falls_inside_message_delivery_status @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_quote_dump @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_quotes_unicode_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_unicode_address_raises_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMiscellaneous.test_utils_quote_unquote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_boundary_in_non_multipart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_boundary_with_leading_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_boundary_without_trailing_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_double_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_empty_multipart_idempotent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_hierarchy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_message_external_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_mimebase_custom_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_mimebase_default_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_nested_inner_contains_outer_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_nested_with_same_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_no_parts_in_a_multipart_with_empty_epilogue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_no_parts_in_a_multipart_with_none_epilogue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_one_part_in_a_multipart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_seq_parts_in_a_multipart_with_empty_epilogue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_seq_parts_in_a_multipart_with_empty_preamble @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_seq_parts_in_a_multipart_with_nl_epilogue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_seq_parts_in_a_multipart_with_none_epilogue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestMultipart.test_seq_parts_in_a_multipart_with_none_preamble @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestNonConformant.test_first_line_is_continuation_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestNonConformant.test_invalid_content_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestNonConformant.test_lying_multipart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestNonConformant.test_missing_header_body_separator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestNonConformant.test_missing_start_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestNonConformant.test_multipart_invalid_cte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestNonConformant.test_multipart_no_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestNonConformant.test_multipart_no_cte_no_defect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestNonConformant.test_multipart_valid_cte_no_defect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestNonConformant.test_no_separating_blank_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestNonConformant.test_no_start_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestNonConformant.test_parse_missing_minor_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestNonConformant.test_same_boundary_inner_outer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestNonMultipart.test_attach_raises_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestNonMultipart.test_nonmultipart_is_not_multipart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestParsers.test_CRLFLF_at_end_of_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestParsers.test_bytes_header_parser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestParsers.test_bytes_parser_does_not_close_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestParsers.test_bytes_parser_on_exception_does_not_close_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestParsers.test_crlf_flatten @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestParsers.test_crlf_separation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestParsers.test_header_parser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestParsers.test_header_parser_multipart_is_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestParsers.test_multipart_digest_with_extra_mime_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestParsers.test_parser_does_not_close_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestParsers.test_parser_on_exception_does_not_close_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestParsers.test_rfc2822_header_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestParsers.test_rfc2822_one_character_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestParsers.test_rfc2822_space_not_allowed_in_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestParsers.test_strip_line_feed_and_carriage_return_in_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestParsers.test_three_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestParsers.test_whitespace_continuation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestParsers.test_whitespace_continuation_last_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_body_quopri_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_false_quoting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_lowercase_quoting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_multiple_spaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_null_line_null_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_null_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_one_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_one_line_cr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_one_line_crnl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_one_line_lf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_one_line_nl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_one_line_one_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_one_line_one_word_eol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_one_line_trailing_spaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_one_long_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_one_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_one_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_one_word_eol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_quoted_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_soft_line_break @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_two_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_two_lines_eol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_two_lines_trailing_spaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_decode_uppercase_quoting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_maxlinelen_too_small @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_null @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_null_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_one_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_one_line_crlf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_one_line_eol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_one_line_eol_after_non_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_one_line_one_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_one_line_trailing_spaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_one_line_trailing_tab @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_one_long_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_one_long_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_one_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_one_very_long_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_one_word_trailing_spaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_one_word_trailing_tab @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_quoted_equals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_shortest_maxlinelen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_trailing_space_at_maxlinelen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_trailing_space_before_maxlinelen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_trailing_space_beyond_maxlinelen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_two_lines_one_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_encode_whitespace_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_header_decode_non_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_header_decode_null @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_header_decode_one_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_header_decode_re_bug_18380 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_header_decode_two_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_header_encode_alt_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_header_encode_non_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_header_encode_null @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_header_encode_one_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_header_encode_two_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_header_quopri_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_quopri_body_check @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_quopri_header_check @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestQuopri.test_quote_unquote_idempotent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2047.test_multiline_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2047.test_rfc2047_B_bad_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2047.test_rfc2047_Q_invalid_digits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2047.test_rfc2047_missing_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2047.test_rfc2047_multiline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_5a @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_5b @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_7 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2047.test_rfc2047_with_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2047.test_whitespace_keeper_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2047.test_whitespace_keeper_unicode_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_del_param @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_get_param @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_bad_character_in_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_bad_character_in_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_bad_character_in_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_bad_encoding_in_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_bad_encoding_in_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_encoded_then_unencoded_segments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_get_content_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_missing_tick @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_missing_tick_with_encoded_non_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_no_extended_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_no_language_or_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_no_language_or_charset_in_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_no_language_or_charset_in_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_no_language_or_charset_in_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_no_language_or_charset_in_filename_encoded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_parse_extra_quoting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_parse_rfc_quoting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_partly_encoded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_partly_nonencoded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_single_tick_in_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_single_tick_in_filename_extended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_tick_attack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_tick_attack_extended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_unencoded_then_encoded_segments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_rfc2231_unknown_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_set_param @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_set_param_requote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestRFC2231.test_should_not_hang_on_invalid_ew_messages @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestSigned.test_long_headers_as_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestSigned.test_long_headers_as_string_maxheaderlen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_email.TestSigned.test_long_headers_flatten @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_compat32_max_line_length_does_not_fold_when_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_crlf_control_via_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_cte_type_7bit_handles_unknown_8bit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_cte_type_7bit_transforms_8bit_cte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_flatten_linesep_overrides_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_policy_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_policy_100 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_policy_20 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_policy_40 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_all_folds_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_all_folds_100 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_all_folds_20 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_all_folds_40 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_none_does_not_fold_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_none_does_not_fold_100 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_none_does_not_fold_20 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_none_does_not_fold_40 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parameter_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parameter_100 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parameter_20 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parameter_40 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parm_overrides_policy_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parm_overrides_policy_100 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parm_overrides_policy_20 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parm_overrides_policy_40 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_rfc2231_wrapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_rfc2231_wrapping_switches_to_default_len_if_too_narrow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_set_mangle_from_via_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_smtp_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestBytesGenerator.test_smtputf8_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_compat32_max_line_length_does_not_fold_when_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_crlf_control_via_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_flatten_linesep_overrides_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_max_line_length_policy_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_max_line_length_policy_100 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_max_line_length_policy_20 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_max_line_length_policy_40 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_all_folds_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_all_folds_100 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_all_folds_20 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_all_folds_40 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_none_does_not_fold_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_none_does_not_fold_100 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_none_does_not_fold_20 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_none_does_not_fold_40 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_maxheaderlen_parameter_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_maxheaderlen_parameter_100 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_maxheaderlen_parameter_20 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_maxheaderlen_parameter_40 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_maxheaderlen_parm_overrides_policy_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_maxheaderlen_parm_overrides_policy_100 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_maxheaderlen_parm_overrides_policy_20 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_maxheaderlen_parm_overrides_policy_40 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_rfc2231_wrapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_rfc2231_wrapping_switches_to_default_len_if_too_narrow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_generator.TestGenerator.test_set_mangle_from_via_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_addr_spec_and_domain_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_addr_spec_and_username_and_domain_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_addr_spec_and_username_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_display_name_ro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_domain_ro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_from_addr_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_from_username_domain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_username_ro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_with_no_display_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_bad_addr_sepc_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_crlf_in_constructor_args_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_display_name_blanks_not_quoted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_display_name_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_display_name_quoting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_domain_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_empty_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_empty_group_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_group_addresses_ro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_group_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_group_display_name_ro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_group_with_addresses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_group_with_addresses_no_display_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_group_with_one_address_no_display_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_il8n @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_non_ascii_username_in_addr_spec_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_null_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_null_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_quoting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_set_message_header_from_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_set_message_header_from_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_space_in_addr_spec_username_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_username_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_address_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_escaped_escapes_in_local_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_escaped_quoted_strings_in_local_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_name_and_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_name_with_dot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_quoted_backslashes_in_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_quoted_local_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_quoted_parens_in_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_quoted_strings_in_local_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_read_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_rfc2047_atom_in_phrase_is_decoded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_rfc2047_atom_in_quoted_string_is_decoded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_rfc2047_atom_is_decoded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_spaces_around_dots_in_local_part_removed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_spaces_in_unquoted_local_part_collapsed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_addresses_read_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_addresses_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_complex_address_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_address_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_escaped_escapes_in_local_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_escaped_quoted_strings_in_local_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_name_and_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_name_with_dot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_quoted_backslashes_in_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_quoted_local_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_quoted_parens_in_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_quoted_strings_in_local_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_rfc2047_atom_in_phrase_is_decoded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_rfc2047_atom_in_quoted_string_is_decoded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_rfc2047_atom_is_decoded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_spaces_around_dots_in_local_part_removed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_spaces_in_unquoted_local_part_collapsed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_groups_read_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_groups_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_set_from_Address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_set_from_Address_and_Group_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_set_from_Address_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_set_from_Group_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestAddressHeader.test_simple_address_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestBaseHeaderFeatures.test_defects_is_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestBaseHeaderFeatures.test_defects_read_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestBaseHeaderFeatures.test_has_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestBaseHeaderFeatures.test_name_read_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestBaseHeaderFeatures.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestBaseHeaderFeatures.test_substr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentDisposition.test_value_RFC_2183_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentDisposition.test_value_RFC_2183_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentDisposition.test_value_invalid_parameter_value_with_fws_between_ew @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentDisposition.test_value_invalid_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentDisposition.test_value_invalid_value_with_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentDisposition.test_value_no_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentDisposition.test_value_parameter_value_with_fws_between_tokens @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTransferEncoding.test_value_RFC_2183_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTransferEncoding.test_value_junk_after_cte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTransferEncoding.test_value_no_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_RFC_2045_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_RFC_2045_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_RFC_2045_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_bad_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_capitalized_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_capitalized_charset_param_name_and_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_cfws_in_content_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_charset_param @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_double_quotes_inside_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_junk_text_in_content_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_lots_of_mime_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_mixed_case_content_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_no_slash_in_content_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_no_subtype_in_content_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_non_ascii_in_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_non_ascii_rfc2231_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_param_value_with_tspecials @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_param_with_extra_quoted_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_quotes_inside_rfc2231_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_bad_character_in_charset_parameter_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_encoded_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_encoded_no_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_encoded_no_double_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_encoded_then_unencoded_segments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_encoded_with_double_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_folded_segments_correctly_formatted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_no_language_or_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_nonascii_in_charset_of_charset_parameter_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_partly_encoded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_partly_encoded_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_quoted_unencoded_then_encoded_segments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_segmented_normal_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_single_quote_in_non_encoded_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_single_quote_in_value_with_charset_and_lang @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_single_quote_inside_double_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_unencoded_then_encoded_segments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_unknown_charset_treated_as_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_utf8_in_supposedly_ascii_charset_parameter_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_semis_inside_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_single_quotes_inside_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_spaces_around_param_equals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_spaces_around_semis @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_spaces_in_content_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_too_many_slashes_in_content_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_unknown_charset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_unknown_content_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_unquoted_param_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestDateHeader.test_date_header_properties @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestDateHeader.test_datetime_read_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestDateHeader.test_invalid_date_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestDateHeader.test_invalid_date_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestDateHeader.test_no_value_is_defect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestDateHeader.test_parse_date @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestDateHeader.test_resent_date_header_properties @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestDateHeader.test_set_date_header_from_datetime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestDateHeader.test_set_from_datetime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestFolding.test_address_display_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestFolding.test_fold_address_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestFolding.test_fold_date_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestFolding.test_fold_overlong_words_using_RFC2047 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestFolding.test_fold_unstructured_short @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestFolding.test_fold_unstructured_single_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestFolding.test_fold_unstructured_with_commas @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestFolding.test_fold_unstructured_with_overlong_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestFolding.test_fold_unstructured_with_slightly_long_word @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestFolding.test_fold_unstructured_with_two_overlong_words @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestFolding.test_long_unstructured @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestFolding.test_message_id_header_is_not_folded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestFolding.test_short_unstructured @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestFolding.test_unstructured_short_max_line_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestHeaderRegistry.test_arbitrary_name_unstructured @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestHeaderRegistry.test_dont_use_default_map @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestHeaderRegistry.test_map_to_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestHeaderRegistry.test_name_case_ignored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestHeaderRegistry.test_override_default_base_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestHeaderRegistry.test_override_default_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestHeaderRegistry.test_override_default_class_only_overrides_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_1_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_2_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_2_x @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_RFC_2045_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_RFC_2045_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_RFC_2045_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_RFC_2045_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_foo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_leading_trailing_whitespace_ignored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_non_comment_garbage_after @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_non_comment_garbage_before @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_non_comment_garbage_inside @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_two_periods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestUnstructuredHeader.test_value_rfc2047_gb2312_base64 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestUnstructuredHeader.test_value_rfc2047_quopri_with_regular_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestUnstructuredHeader.test_value_rfc2047_simple_nonascii_quopri @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_headerregistry.TestUnstructuredHeader.test_value_rfc2047_simple_quopri @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_inversion.TestInversion.test_body_base64_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_inversion.TestInversion.test_body_plain_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_inversion.TestInversion.test_body_qp_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_inversion.TestInversion.test_input_header_with_invalid_date @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_inversion.TestInversion.test_input_header_with_one_space_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.Test.test_error_on_setitem_if_max_count_exceeded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.Test.test_rfc2043_auto_decoded_and_emailmessage_used @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_add_alternative_alternative_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_add_alternative_mixed_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_add_alternative_no_content_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_add_alternative_none_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_add_alternative_plain_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_add_alternative_related_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_add_mixed_alternative_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_add_mixed_mixed_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_add_mixed_no_content_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_add_mixed_none_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_add_mixed_plain_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_add_mixed_related_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_add_related_alternative_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_add_related_mixed_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_add_related_no_content_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_add_related_none_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_add_related_plain_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_add_related_related_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_as_string_allows_maxheaderlen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_as_string_unixform @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_as_string_uses_max_header_length_by_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_content_empty_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_content_html_text_attachment_inline_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_content_html_text_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_content_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_content_mime_non_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_content_mixed_alternative_plain_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_content_mixed_related_alternative_plain_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_content_mixed_related_alternative_plain_html_wrong_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_content_mixed_text_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_content_non_mime_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_content_plain_html_alternative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_content_plain_html_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_content_plain_html_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_content_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_content_related_with_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_empty_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_html_text_attachment_inline_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_html_text_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_mime_non_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_mixed_alternative_plain_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_mixed_related_alternative_plain_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_mixed_related_alternative_plain_html_wrong_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_mixed_text_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_non_mime_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_plain_html_alternative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_plain_html_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_plain_html_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_clear_related_with_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_default_content_manager_for_add_comes_from_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_7 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_get_body_empty_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_get_body_html_text_attachment_inline_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_get_body_html_text_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_get_body_malformed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_get_body_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_get_body_mime_non_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_get_body_mixed_alternative_plain_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_get_body_mixed_related_alternative_plain_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_get_body_mixed_related_alternative_plain_html_wrong_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_get_body_mixed_text_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_get_body_non_mime_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_get_body_plain_html_alternative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_get_body_plain_html_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_get_body_plain_html_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_get_body_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_get_body_related_with_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_get_content_default_cm_comes_from_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_get_content_with_cm @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_is_attachment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_empty_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_html_text_attachment_inline_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_html_text_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_mime_non_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_mixed_alternative_plain_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_mixed_related_alternative_plain_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_mixed_related_alternative_plain_html_wrong_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_mixed_text_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_non_mime_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_plain_html_alternative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_plain_html_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_plain_html_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_related_with_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_attachments_mutation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_empty_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_html_text_attachment_inline_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_html_text_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_mime_non_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_mixed_alternative_plain_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_mixed_related_alternative_plain_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_mixed_related_alternative_plain_html_wrong_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_mixed_text_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_non_mime_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_plain_html_alternative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_plain_html_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_plain_html_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_related_with_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_alternative_alternative_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_alternative_mixed_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_alternative_no_content_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_alternative_none_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_alternative_plain_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_alternative_related_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_mixed_alternative_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_mixed_mixed_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_mixed_no_content_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_mixed_none_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_mixed_plain_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_mixed_related_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_related_alternative_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_related_mixed_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_related_no_content_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_related_none_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_related_plain_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_related_related_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_alternative_alternative_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_alternative_mixed_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_alternative_no_content_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_alternative_none_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_alternative_plain_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_alternative_related_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_mixed_alternative_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_mixed_mixed_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_mixed_no_content_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_mixed_none_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_mixed_plain_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_mixed_related_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_related_alternative_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_related_mixed_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_related_no_content_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_related_none_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_related_plain_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_related_related_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_policy_on_part_made_by_make_comes_from_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_set_content_adds_MIME_Version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_set_content_default_cm_comes_from_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_set_content_does_not_duplicate_MIME_Version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_set_content_with_cm @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_str_defaults_to_policy_max_line_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestEmailMessage.test_str_defaults_to_utf8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_add_alternative_alternative_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_add_alternative_mixed_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_add_alternative_no_content_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_add_alternative_none_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_add_alternative_plain_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_add_alternative_related_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_add_mixed_alternative_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_add_mixed_mixed_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_add_mixed_no_content_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_add_mixed_none_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_add_mixed_plain_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_add_mixed_related_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_add_related_alternative_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_add_related_mixed_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_add_related_no_content_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_add_related_none_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_add_related_plain_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_add_related_related_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_content_empty_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_content_html_text_attachment_inline_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_content_html_text_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_content_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_content_mime_non_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_content_mixed_alternative_plain_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_content_mixed_related_alternative_plain_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_content_mixed_related_alternative_plain_html_wrong_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_content_mixed_text_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_content_non_mime_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_content_plain_html_alternative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_content_plain_html_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_content_plain_html_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_content_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_content_related_with_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_empty_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_html_text_attachment_inline_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_html_text_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_mime_non_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_mixed_alternative_plain_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_mixed_related_alternative_plain_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_mixed_related_alternative_plain_html_wrong_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_mixed_text_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_non_mime_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_plain_html_alternative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_plain_html_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_plain_html_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_clear_related_with_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_default_content_manager_for_add_comes_from_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_get_body_empty_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_get_body_html_text_attachment_inline_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_get_body_html_text_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_get_body_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_get_body_mime_non_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_get_body_mixed_alternative_plain_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_get_body_mixed_related_alternative_plain_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_get_body_mixed_related_alternative_plain_html_wrong_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_get_body_mixed_text_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_get_body_non_mime_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_get_body_plain_html_alternative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_get_body_plain_html_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_get_body_plain_html_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_get_body_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_get_body_related_with_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_get_content_default_cm_comes_from_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_get_content_with_cm @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_is_attachment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_empty_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_html_text_attachment_inline_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_html_text_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_mime_non_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_mixed_alternative_plain_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_mixed_related_alternative_plain_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_mixed_related_alternative_plain_html_wrong_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_mixed_text_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_non_mime_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_plain_html_alternative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_plain_html_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_plain_html_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_related_with_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_attachments_mutation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_empty_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_html_text_attachment_inline_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_html_text_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_mime_non_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_mixed_alternative_plain_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_mixed_related_alternative_plain_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_mixed_related_alternative_plain_html_wrong_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_mixed_text_message_rfc822 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_non_mime_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_plain_html_alternative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_plain_html_attachment_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_plain_html_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_related @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_related_with_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_alternative_alternative_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_alternative_mixed_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_alternative_no_content_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_alternative_none_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_alternative_plain_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_alternative_related_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_mixed_alternative_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_mixed_mixed_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_mixed_no_content_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_mixed_none_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_mixed_plain_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_mixed_related_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_related_alternative_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_related_mixed_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_related_no_content_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_related_none_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_related_plain_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_related_related_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_alternative_alternative_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_alternative_mixed_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_alternative_no_content_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_alternative_none_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_alternative_plain_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_alternative_related_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_mixed_alternative_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_mixed_mixed_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_mixed_no_content_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_mixed_none_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_mixed_plain_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_mixed_related_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_related_alternative_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_related_mixed_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_related_no_content_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_related_none_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_related_plain_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_related_related_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_policy_on_part_made_by_make_comes_from_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_set_content_default_cm_comes_from_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_set_content_does_not_add_MIME_Version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_set_content_with_cm @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_message.TestMIMEPart.test_string_payload_with_multipart_content_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_parser.TestBytesParser.test_custom_message_factory_on_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_parser.TestBytesParser.test_factory_arg_overrides_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_parser.TestBytesParser.test_only_split_on_cr_lf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_parser.TestCustomMessage.test_custom_message_gets_policy_if_possible_from_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_parser.TestCustomMessage.test_custom_message_gets_policy_if_possible_from_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_parser.TestParser.test_custom_message_factory_on_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_parser.TestParser.test_factory_arg_overrides_policy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_parser.TestParser.test_only_split_on_cr_lf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_pickleable.TestPickleCopyHeader.test_deepcopy_date @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_pickleable.TestPickleCopyHeader.test_deepcopy_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_pickleable.TestPickleCopyHeader.test_deepcopy_subject @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_pickleable.TestPickleCopyHeader.test_deepcopy_to @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_pickleable.TestPickleCopyHeader.test_pickle_date @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_pickleable.TestPickleCopyHeader.test_pickle_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_pickleable.TestPickleCopyHeader.test_pickle_subject @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_pickleable.TestPickleCopyHeader.test_pickle_to @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_pickleable.TestPickleCopyMessage.test_deepcopy_created @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_pickleable.TestPickleCopyMessage.test_deepcopy_parsed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_pickleable.TestPickleCopyMessage.test_pickle_created @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_pickleable.TestPickleCopyMessage.test_pickle_parsed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_abc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_adding_default_policies_preserves_default_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_all_attributes_covered @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_clone_copies_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_default_header_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_each_Policy_gets_unique_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_fold_zero_max_line_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_handle_defect_raises_on_strict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_handle_defect_registers_defect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_new_factory_overrides_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_non_ascii_chars_do_not_cause_inf_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_overridden_register_defect_still_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_overridden_register_defect_works @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_policy_addition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_policy_is_immutable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_register_defect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_reject_non_policy_keyword_when_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_set_policy_attrs_when_cloned @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.PolicyAPITests.test_short_maxlen_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.TestConcretePolicies.test_header_store_parse_rejects_newlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.TestPolicyPropagation.test_bytes_parser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.TestPolicyPropagation.test_message_from_binary_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.TestPolicyPropagation.test_message_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.TestPolicyPropagation.test_message_from_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.TestPolicyPropagation.test_message_from_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.TestPolicyPropagation.test_message_policy_propagates_to_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.TestPolicyPropagation.test_message_policy_used_by_as_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.TestPolicyPropagation.test_parser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.TestPolicyPropagation.test_parser_propagates_policy_to_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_policy.TestPolicyPropagation.test_parser_propagates_policy_to_sub_messages @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_utils.DateTimeTests.test_aware_datetime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_utils.DateTimeTests.test_naive_datetime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_utils.DateTimeTests.test_parsedate_to_datetime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_utils.DateTimeTests.test_parsedate_to_datetime_naive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_utils.DateTimeTests.test_parsedate_to_datetime_with_invalid_raises_valueerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_utils.DateTimeTests.test_usegmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_utils.DateTimeTests.test_usegmt_with_naive_datetime_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_utils.DateTimeTests.test_usegmt_with_non_utc_datetime_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_utils.LocaltimeTests.test_localtime_daylight_false_dst_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_utils.LocaltimeTests.test_localtime_daylight_false_dst_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_utils.LocaltimeTests.test_localtime_daylight_true_dst_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_utils.LocaltimeTests.test_localtime_daylight_true_dst_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_utils.LocaltimeTests.test_localtime_epoch_notz_daylight_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_utils.LocaltimeTests.test_localtime_epoch_notz_daylight_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_utils.LocaltimeTests.test_localtime_epoch_utc_daylight_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_utils.LocaltimeTests.test_localtime_epoch_utc_daylight_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_utils.LocaltimeTests.test_localtime_is_tz_aware_daylight_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_email.test_utils.LocaltimeTests.test_localtime_is_tz_aware_daylight_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_embed.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_embed.txt deleted file mode 100644 index 5329bc0070..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_embed.txt +++ /dev/null @@ -1,70 +0,0 @@ -*graalpython.lib-python.3.test.test_embed.AuditingTests.test_audit -*graalpython.lib-python.3.test.test_embed.AuditingTests.test_audit_run_command -*graalpython.lib-python.3.test.test_embed.AuditingTests.test_audit_run_file -*graalpython.lib-python.3.test.test_embed.AuditingTests.test_audit_run_interactivehook -*graalpython.lib-python.3.test.test_embed.AuditingTests.test_audit_run_startup -*graalpython.lib-python.3.test.test_embed.AuditingTests.test_audit_run_stdin -*graalpython.lib-python.3.test.test_embed.AuditingTests.test_audit_subinterpreter -*graalpython.lib-python.3.test.test_embed.AuditingTests.test_get_incomplete_frame -*graalpython.lib-python.3.test.test_embed.AuditingTests.test_open_code_hook -*graalpython.lib-python.3.test.test_embed.EmbeddingTests.test_bpo20891 -*graalpython.lib-python.3.test.test_embed.EmbeddingTests.test_finalize_structseq -*graalpython.lib-python.3.test.test_embed.EmbeddingTests.test_forced_io_encoding -*graalpython.lib-python.3.test.test_embed.EmbeddingTests.test_initialize_pymain -*graalpython.lib-python.3.test.test_embed.EmbeddingTests.test_initialize_twice -*graalpython.lib-python.3.test.test_embed.EmbeddingTests.test_pre_initialization_api -*graalpython.lib-python.3.test.test_embed.EmbeddingTests.test_pre_initialization_sys_options -*graalpython.lib-python.3.test.test_embed.EmbeddingTests.test_quickened_static_code_gets_unquickened_at_Py_FINALIZE -*graalpython.lib-python.3.test.test_embed.EmbeddingTests.test_repeated_init_and_inittab -*graalpython.lib-python.3.test.test_embed.EmbeddingTests.test_run_main -*graalpython.lib-python.3.test.test_embed.EmbeddingTests.test_run_main_loop -*graalpython.lib-python.3.test.test_embed.EmbeddingTests.test_simple_initialization_api -*graalpython.lib-python.3.test.test_embed.EmbeddingTests.test_subinterps_different_ids -*graalpython.lib-python.3.test.test_embed.EmbeddingTests.test_subinterps_distinct_state -*graalpython.lib-python.3.test.test_embed.EmbeddingTests.test_subinterps_main -*graalpython.lib-python.3.test.test_embed.EmbeddingTests.test_ucnhash_capi_reset -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_get_argc_argv -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_getpath_abspath_win32 -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_global_pathconfig -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_compat_config -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_compat_env -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_default_config -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_dev_mode -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_dont_configure_locale -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_dont_parse_argv -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_env_dev_mode -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_env_dev_mode_alloc -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_from_config -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_global_config -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_is_python_build_with_home -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_isolated_config -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_isolated_flag -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_main -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_parse_argv -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_pybuilddir -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_pybuilddir_win32 -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_python_config -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_python_env -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_pyvenv_cfg -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_read_set -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_run_main -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_set_config -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_setpath -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_setpath_config -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_setpythonhome -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_sys_add -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_use_frozen_modules -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_init_warnoptions -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_preinit_compat_config -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_preinit_dont_parse_argv -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_preinit_isolated1 -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_preinit_isolated2 -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_preinit_isolated_config -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_preinit_parse_argv -*graalpython.lib-python.3.test.test_embed.InitConfigTests.test_preinit_python_config -*graalpython.lib-python.3.test.test_embed.MiscTests.test_frozenmain -*graalpython.lib-python.3.test.test_embed.MiscTests.test_no_memleak -*graalpython.lib-python.3.test.test_embed.MiscTests.test_unicode_id_init -*graalpython.lib-python.3.test.test_embed.StdPrinterTests.test_disallow_instantiation -*graalpython.lib-python.3.test.test_embed.StdPrinterTests.test_methods -*graalpython.lib-python.3.test.test_embed.StdPrinterTests.test_write diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ensurepip.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ensurepip.txt index f6a930e40a..a1fdde8ee1 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ensurepip.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ensurepip.txt @@ -1,31 +1,30 @@ -*graalpython.lib-python.3.test.test_ensurepip.TestBootstrap.test_altinstall_default_pip_conflict -*graalpython.lib-python.3.test.test_ensurepip.TestBootstrap.test_basic_bootstrapping -*graalpython.lib-python.3.test.test_ensurepip.TestBootstrap.test_bootstrapping_with_alt_install -*graalpython.lib-python.3.test.test_ensurepip.TestBootstrap.test_bootstrapping_with_default_pip -*graalpython.lib-python.3.test.test_ensurepip.TestBootstrap.test_bootstrapping_with_regular_install -*graalpython.lib-python.3.test.test_ensurepip.TestBootstrap.test_bootstrapping_with_root -*graalpython.lib-python.3.test.test_ensurepip.TestBootstrap.test_bootstrapping_with_upgrade -*graalpython.lib-python.3.test.test_ensurepip.TestBootstrap.test_bootstrapping_with_user -*graalpython.lib-python.3.test.test_ensurepip.TestBootstrap.test_bootstrapping_with_verbosity_1 -*graalpython.lib-python.3.test.test_ensurepip.TestBootstrap.test_bootstrapping_with_verbosity_2 -*graalpython.lib-python.3.test.test_ensurepip.TestBootstrap.test_bootstrapping_with_verbosity_3 -*graalpython.lib-python.3.test.test_ensurepip.TestBootstrap.test_pip_config_file_disabled -*graalpython.lib-python.3.test.test_ensurepip.TestBootstrap.test_pip_environment_variables_removed -*graalpython.lib-python.3.test.test_ensurepip.TestBootstrappingMainFunction.test_basic_bootstrapping -*graalpython.lib-python.3.test.test_ensurepip.TestBootstrappingMainFunction.test_bootstrap_version -*graalpython.lib-python.3.test.test_ensurepip.TestBootstrappingMainFunction.test_bootstrapping_error_code -*graalpython.lib-python.3.test.test_ensurepip.TestEnsurePipVersion.test_returns_version -*graalpython.lib-python.3.test.test_ensurepip.TestPackages.test_get_packages_no_dir -*graalpython.lib-python.3.test.test_ensurepip.TestPackages.test_get_packages_with_dir -*graalpython.lib-python.3.test.test_ensurepip.TestPackages.test_version -*graalpython.lib-python.3.test.test_ensurepip.TestUninstall.test_pip_config_file_disabled -*graalpython.lib-python.3.test.test_ensurepip.TestUninstall.test_pip_environment_variables_removed -*graalpython.lib-python.3.test.test_ensurepip.TestUninstall.test_uninstall -*graalpython.lib-python.3.test.test_ensurepip.TestUninstall.test_uninstall_skipped_when_not_installed -*graalpython.lib-python.3.test.test_ensurepip.TestUninstall.test_uninstall_skipped_with_warning_for_wrong_version -*graalpython.lib-python.3.test.test_ensurepip.TestUninstall.test_uninstall_with_verbosity_1 -*graalpython.lib-python.3.test.test_ensurepip.TestUninstall.test_uninstall_with_verbosity_2 -*graalpython.lib-python.3.test.test_ensurepip.TestUninstall.test_uninstall_with_verbosity_3 -*graalpython.lib-python.3.test.test_ensurepip.TestUninstallationMainFunction.test_basic_uninstall -*graalpython.lib-python.3.test.test_ensurepip.TestUninstallationMainFunction.test_uninstall_error_code -*graalpython.lib-python.3.test.test_ensurepip.TestUninstallationMainFunction.test_uninstall_version +test.test_ensurepip.TestBootstrap.test_altinstall_default_pip_conflict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestBootstrap.test_basic_bootstrapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestBootstrap.test_bootstrapping_with_alt_install @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestBootstrap.test_bootstrapping_with_default_pip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestBootstrap.test_bootstrapping_with_regular_install @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestBootstrap.test_bootstrapping_with_root @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestBootstrap.test_bootstrapping_with_upgrade @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestBootstrap.test_bootstrapping_with_user @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestBootstrap.test_bootstrapping_with_verbosity_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestBootstrap.test_bootstrapping_with_verbosity_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestBootstrap.test_bootstrapping_with_verbosity_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestBootstrap.test_pip_config_file_disabled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestBootstrap.test_pip_environment_variables_removed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestBootstrappingMainFunction.test_basic_bootstrapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestBootstrappingMainFunction.test_bootstrap_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestBootstrappingMainFunction.test_bootstrapping_error_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestPackages.test_get_packages_no_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestPackages.test_get_packages_with_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestPackages.test_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestUninstall.test_pip_config_file_disabled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestUninstall.test_pip_environment_variables_removed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestUninstall.test_uninstall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestUninstall.test_uninstall_skipped_when_not_installed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestUninstall.test_uninstall_skipped_with_warning_for_wrong_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestUninstall.test_uninstall_with_verbosity_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestUninstall.test_uninstall_with_verbosity_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestUninstall.test_uninstall_with_verbosity_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestUninstallationMainFunction.test_basic_uninstall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestUninstallationMainFunction.test_uninstall_error_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ensurepip.TestUninstallationMainFunction.test_uninstall_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_enum.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_enum.txt index 3ed4f8bdaa..c700aa525b 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_enum.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_enum.txt @@ -1,776 +1,586 @@ -*graalpython.lib-python.3.test.test_enum.MiscTestCase.test__all__ -*graalpython.lib-python.3.test.test_enum.MiscTestCase.test_doc_1 -*graalpython.lib-python.3.test.test_enum.MiscTestCase.test_doc_2 -*graalpython.lib-python.3.test.test_enum.MiscTestCase.test_doc_3 -*graalpython.lib-python.3.test.test_enum.MiscTestCase.test_doc_4 -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_aliases -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_and -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_auto_number -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_auto_number_garbage -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_bool -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_boundary -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_contains_er -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_contains_tf -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_duplicate_auto -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_init_subclass -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_iter -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_member_contains -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_member_iter -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_member_length -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_multiple_mixin -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_number_reset_and_order_cleanup -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_or -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_pickle -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_programatic_function_from_dict -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_programatic_function_iterable -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_programatic_function_string -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_programatic_function_string_list -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_programatic_function_string_with_start -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_unique_composite -*graalpython.lib-python.3.test.test_enum.OldTestFlag.test_xor -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_aliases -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_and -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_bool -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_boundary -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_contains_er -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_contains_tf -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_format -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_global_enum_str -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_global_repr_conform1 -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_global_repr_keep -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_invert -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_iter -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_member_contains -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_member_iter -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_member_length -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_multiple_mixin -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_or -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_programatic_function_from_dict -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_programatic_function_from_empty_list -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_programatic_function_from_empty_tuple -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_programatic_function_iterable -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_programatic_function_string -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_programatic_function_string_list -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_programatic_function_string_with_start -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_type -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_unique_composite -*graalpython.lib-python.3.test.test_enum.OldTestIntFlag.test_xor -*graalpython.lib-python.3.test.test_enum.TestConvert.test_convert_complex -*graalpython.lib-python.3.test.test_enum.TestConvert.test_convert_int -*graalpython.lib-python.3.test.test_enum.TestConvert.test_convert_raise -*graalpython.lib-python.3.test.test_enum.TestConvert.test_convert_repr_and_str -*graalpython.lib-python.3.test.test_enum.TestConvert.test_convert_str -*graalpython.lib-python.3.test.test_enum.TestConvert.test_convert_uncomparable -*graalpython.lib-python.3.test.test_enum.TestConvert.test_convert_value_lookup_priority -*graalpython.lib-python.3.test.test_enum.TestEmptyAndNonLatinStrings.test_empty_string -*graalpython.lib-python.3.test.test_enum.TestEmptyAndNonLatinStrings.test_non_latin_character_string -*graalpython.lib-python.3.test.test_enum.TestEmptyAndNonLatinStrings.test_non_latin_number_string -*graalpython.lib-python.3.test.test_enum.TestEnum.test_attribute_deletion -*graalpython.lib-python.3.test.test_enum.TestEnum.test_auto_garbage -*graalpython.lib-python.3.test.test_enum.TestEnum.test_auto_garbage_corrected -*graalpython.lib-python.3.test.test_enum.TestEnum.test_auto_name -*graalpython.lib-python.3.test.test_enum.TestEnum.test_auto_name_inherit -*graalpython.lib-python.3.test.test_enum.TestEnum.test_auto_number -*graalpython.lib-python.3.test.test_enum.TestEnum.test_auto_order -*graalpython.lib-python.3.test.test_enum.TestEnum.test_auto_order_wierd -*graalpython.lib-python.3.test.test_enum.TestEnum.test_bool -*graalpython.lib-python.3.test.test_enum.TestEnum.test_bool_of_class -*graalpython.lib-python.3.test.test_enum.TestEnum.test_bool_of_member -*graalpython.lib-python.3.test.test_enum.TestEnum.test_changing_member -*graalpython.lib-python.3.test.test_enum.TestEnum.test_class_nested_enum_and_pickle_protocol_four -*graalpython.lib-python.3.test.test_enum.TestEnum.test_comparisons -*graalpython.lib-python.3.test.test_enum.TestEnum.test_conflicting_types_resolved_in_new -*graalpython.lib-python.3.test.test_enum.TestEnum.test_contains -*graalpython.lib-python.3.test.test_enum.TestEnum.test_contains_er -*graalpython.lib-python.3.test.test_enum.TestEnum.test_contains_tf -*graalpython.lib-python.3.test.test_enum.TestEnum.test_default_missing -*graalpython.lib-python.3.test.test_enum.TestEnum.test_dir_on_class -*graalpython.lib-python.3.test.test_enum.TestEnum.test_dir_on_item -*graalpython.lib-python.3.test.test_enum.TestEnum.test_dir_on_sub_with_behavior_including_instance_dict_on_super -*graalpython.lib-python.3.test.test_enum.TestEnum.test_dir_on_sub_with_behavior_on_super -*graalpython.lib-python.3.test.test_enum.TestEnum.test_dir_with_added_behavior -*graalpython.lib-python.3.test.test_enum.TestEnum.test_duplicate_auto -*graalpython.lib-python.3.test.test_enum.TestEnum.test_duplicate_name -*graalpython.lib-python.3.test.test_enum.TestEnum.test_duplicate_values_give_unique_enum_items -*graalpython.lib-python.3.test.test_enum.TestEnum.test_empty_globals -*graalpython.lib-python.3.test.test_enum.TestEnum.test_enum -*graalpython.lib-python.3.test.test_enum.TestEnum.test_enum_duplicates -*graalpython.lib-python.3.test.test_enum.TestEnum.test_enum_function_with_qualname -*graalpython.lib-python.3.test.test_enum.TestEnum.test_enum_in_enum_out -*graalpython.lib-python.3.test.test_enum.TestEnum.test_enum_str_override -*graalpython.lib-python.3.test.test_enum.TestEnum.test_enum_value -*graalpython.lib-python.3.test.test_enum.TestEnum.test_enum_with_value_name -*graalpython.lib-python.3.test.test_enum.TestEnum.test_equality -*graalpython.lib-python.3.test.test_enum.TestEnum.test_exclude_methods -*graalpython.lib-python.3.test.test_enum.TestEnum.test_exploding_pickle -*graalpython.lib-python.3.test.test_enum.TestEnum.test_extending -*graalpython.lib-python.3.test.test_enum.TestEnum.test_extending2 -*graalpython.lib-python.3.test.test_enum.TestEnum.test_extending3 -*graalpython.lib-python.3.test.test_enum.TestEnum.test_floatenum_from_scratch -*graalpython.lib-python.3.test.test_enum.TestEnum.test_floatenum_fromhex -*graalpython.lib-python.3.test.test_enum.TestEnum.test_floatenum_inherited -*graalpython.lib-python.3.test.test_enum.TestEnum.test_flufl_enum -*graalpython.lib-python.3.test.test_enum.TestEnum.test_format_enum -*graalpython.lib-python.3.test.test_enum.TestEnum.test_format_enum_custom -*graalpython.lib-python.3.test.test_enum.TestEnum.test_format_enum_date -*graalpython.lib-python.3.test.test_enum.TestEnum.test_format_enum_float -*graalpython.lib-python.3.test.test_enum.TestEnum.test_format_enum_int -*graalpython.lib-python.3.test.test_enum.TestEnum.test_format_enum_str -*graalpython.lib-python.3.test.test_enum.TestEnum.test_format_override_enum -*graalpython.lib-python.3.test.test_enum.TestEnum.test_format_override_mixin -*graalpython.lib-python.3.test.test_enum.TestEnum.test_getattr_dunder -*graalpython.lib-python.3.test.test_enum.TestEnum.test_getattr_getitem -*graalpython.lib-python.3.test.test_enum.TestEnum.test_hash -*graalpython.lib-python.3.test.test_enum.TestEnum.test_ignore -*graalpython.lib-python.3.test.test_enum.TestEnum.test_inherited_data_type -*graalpython.lib-python.3.test.test_enum.TestEnum.test_inherited_new_from_enhanced_enum -*graalpython.lib-python.3.test.test_enum.TestEnum.test_inherited_new_from_mixed_enum -*graalpython.lib-python.3.test.test_enum.TestEnum.test_inherited_repr -*graalpython.lib-python.3.test.test_enum.TestEnum.test_init -*graalpython.lib-python.3.test.test_enum.TestEnum.test_intenum -*graalpython.lib-python.3.test.test_enum.TestEnum.test_intenum_duplicates -*graalpython.lib-python.3.test.test_enum.TestEnum.test_intenum_from_bytes -*graalpython.lib-python.3.test.test_enum.TestEnum.test_intenum_from_scratch -*graalpython.lib-python.3.test.test_enum.TestEnum.test_intenum_inherited -*graalpython.lib-python.3.test.test_enum.TestEnum.test_intenum_transitivity -*graalpython.lib-python.3.test.test_enum.TestEnum.test_intenum_value -*graalpython.lib-python.3.test.test_enum.TestEnum.test_introspection -*graalpython.lib-python.3.test.test_enum.TestEnum.test_invalid_names -*graalpython.lib-python.3.test.test_enum.TestEnum.test_iteration_order -*graalpython.lib-python.3.test.test_enum.TestEnum.test_missing -*graalpython.lib-python.3.test.test_enum.TestEnum.test_mixed_enum_in_call_1 -*graalpython.lib-python.3.test.test_enum.TestEnum.test_mixed_enum_in_call_2 -*graalpython.lib-python.3.test.test_enum.TestEnum.test_multiple_inherited_mixin -*graalpython.lib-python.3.test.test_enum.TestEnum.test_multiple_mixin -*graalpython.lib-python.3.test.test_enum.TestEnum.test_multiple_mixin_inherited -*graalpython.lib-python.3.test.test_enum.TestEnum.test_multiple_mixin_mro -*graalpython.lib-python.3.test.test_enum.TestEnum.test_new_repr -*graalpython.lib-python.3.test.test_enum.TestEnum.test_no_duplicates -*graalpython.lib-python.3.test.test_enum.TestEnum.test_no_such_enum_member -*graalpython.lib-python.3.test.test_enum.TestEnum.test_nonhash_value -*graalpython.lib-python.3.test.test_enum.TestEnum.test_object_str_override -*graalpython.lib-python.3.test.test_enum.TestEnum.test_ordered_mixin -*graalpython.lib-python.3.test.test_enum.TestEnum.test_pickle_by_name -*graalpython.lib-python.3.test.test_enum.TestEnum.test_pickle_enum -*graalpython.lib-python.3.test.test_enum.TestEnum.test_pickle_enum_function -*graalpython.lib-python.3.test.test_enum.TestEnum.test_pickle_enum_function_with_module -*graalpython.lib-python.3.test.test_enum.TestEnum.test_pickle_float -*graalpython.lib-python.3.test.test_enum.TestEnum.test_pickle_int -*graalpython.lib-python.3.test.test_enum.TestEnum.test_programmatic_function_from_dict -*graalpython.lib-python.3.test.test_enum.TestEnum.test_programmatic_function_iterable -*graalpython.lib-python.3.test.test_enum.TestEnum.test_programmatic_function_string -*graalpython.lib-python.3.test.test_enum.TestEnum.test_programmatic_function_string_list -*graalpython.lib-python.3.test.test_enum.TestEnum.test_programmatic_function_string_list_with_start -*graalpython.lib-python.3.test.test_enum.TestEnum.test_programmatic_function_string_with_start -*graalpython.lib-python.3.test.test_enum.TestEnum.test_programmatic_function_type -*graalpython.lib-python.3.test.test_enum.TestEnum.test_programmatic_function_type_from_subclass -*graalpython.lib-python.3.test.test_enum.TestEnum.test_programmatic_function_type_from_subclass_with_start -*graalpython.lib-python.3.test.test_enum.TestEnum.test_programmatic_function_type_with_start -*graalpython.lib-python.3.test.test_enum.TestEnum.test_reversed_iteration_order -*graalpython.lib-python.3.test.test_enum.TestEnum.test_str_and_format_override_enum -*graalpython.lib-python.3.test.test_enum.TestEnum.test_str_and_format_override_mixin -*graalpython.lib-python.3.test.test_enum.TestEnum.test_str_override_enum -*graalpython.lib-python.3.test.test_enum.TestEnum.test_str_override_mixin -*graalpython.lib-python.3.test.test_enum.TestEnum.test_strenum_from_scratch -*graalpython.lib-python.3.test.test_enum.TestEnum.test_strenum_inherited -*graalpython.lib-python.3.test.test_enum.TestEnum.test_string_enum -*graalpython.lib-python.3.test.test_enum.TestEnum.test_subclass_duplicate_name -*graalpython.lib-python.3.test.test_enum.TestEnum.test_subclass_duplicate_name_dynamic -*graalpython.lib-python.3.test.test_enum.TestEnum.test_subclasses_with_getnewargs -*graalpython.lib-python.3.test.test_enum.TestEnum.test_subclasses_with_getnewargs_ex -*graalpython.lib-python.3.test.test_enum.TestEnum.test_subclasses_with_reduce -*graalpython.lib-python.3.test.test_enum.TestEnum.test_subclasses_with_reduce_ex -*graalpython.lib-python.3.test.test_enum.TestEnum.test_subclasses_without_direct_pickle_support -*graalpython.lib-python.3.test.test_enum.TestEnum.test_subclasses_without_direct_pickle_support_using_name -*graalpython.lib-python.3.test.test_enum.TestEnum.test_subclassing -*graalpython.lib-python.3.test.test_enum.TestEnum.test_too_many_data_types -*graalpython.lib-python.3.test.test_enum.TestEnum.test_tuple_subclass -*graalpython.lib-python.3.test.test_enum.TestEnum.test_value_name -*graalpython.lib-python.3.test.test_enum.TestEnum.test_warning_for_private_variables -*graalpython.lib-python.3.test.test_enum.TestEnum.test_wrong_enum_in_call -*graalpython.lib-python.3.test.test_enum.TestEnum.test_wrong_enum_in_mixed_call -*graalpython.lib-python.3.test.test_enum.TestEnum.test_wrong_inheritance_order -*graalpython.lib-python.3.test.test_enum.TestFlag.test_and -*graalpython.lib-python.3.test.test_enum.TestFlag.test_auto_number -*graalpython.lib-python.3.test.test_enum.TestFlag.test_auto_number_garbage -*graalpython.lib-python.3.test.test_enum.TestFlag.test_bizarre -*graalpython.lib-python.3.test.test_enum.TestFlag.test_bool -*graalpython.lib-python.3.test.test_enum.TestFlag.test_cascading_failure -*graalpython.lib-python.3.test.test_enum.TestFlag.test_contains -*graalpython.lib-python.3.test.test_enum.TestFlag.test_contains_er -*graalpython.lib-python.3.test.test_enum.TestFlag.test_contains_tf -*graalpython.lib-python.3.test.test_enum.TestFlag.test_duplicate_auto -*graalpython.lib-python.3.test.test_enum.TestFlag.test_format -*graalpython.lib-python.3.test.test_enum.TestFlag.test_init_subclass -*graalpython.lib-python.3.test.test_enum.TestFlag.test_invert -*graalpython.lib-python.3.test.test_enum.TestFlag.test_member_contains -*graalpython.lib-python.3.test.test_enum.TestFlag.test_multiple_mixin -*graalpython.lib-python.3.test.test_enum.TestFlag.test_or -*graalpython.lib-python.3.test.test_enum.TestFlag.test_pickle -*graalpython.lib-python.3.test.test_enum.TestFlag.test_programatic_function_from_dict -*graalpython.lib-python.3.test.test_enum.TestFlag.test_programatic_function_iterable -*graalpython.lib-python.3.test.test_enum.TestFlag.test_programatic_function_string -*graalpython.lib-python.3.test.test_enum.TestFlag.test_programatic_function_string_list -*graalpython.lib-python.3.test.test_enum.TestFlag.test_programatic_function_string_with_start -*graalpython.lib-python.3.test.test_enum.TestFlag.test_repr -*graalpython.lib-python.3.test.test_enum.TestFlag.test_str -*graalpython.lib-python.3.test.test_enum.TestFlag.test_unique_composite -*graalpython.lib-python.3.test.test_enum.TestFlag.test_xor -*graalpython.lib-python.3.test.test_enum.TestHelpers.test_dunder -*graalpython.lib-python.3.test.test_enum.TestHelpers.test_is_descriptor -*graalpython.lib-python.3.test.test_enum.TestHelpers.test_is_dunder -*graalpython.lib-python.3.test.test_enum.TestHelpers.test_is_private -*graalpython.lib-python.3.test.test_enum.TestHelpers.test_is_sunder -*graalpython.lib-python.3.test.test_enum.TestHelpers.test_iter_bits_lsb -*graalpython.lib-python.3.test.test_enum.TestHelpers.test_sunder -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_attribute_deletion -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_bad_new_super -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_basics -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_bool_is_true -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_changing_member_fails -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_contains_er -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_contains_tf -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_copy -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_copy_member -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_dir_on_class -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_dir_on_item -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_dir_on_sub_with_behavior_including_instance_dict_on_super -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_dir_on_sub_with_behavior_on_super -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_dir_with_added_behavior -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_enum_in_enum_out -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_format -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_format_specs -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_hash -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_inherited_repr -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_invalid_names -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_multiple_superclasses_repr -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_object_str_override -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_overridden_format -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_overridden_str -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_overridden_str_format -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_overridden_str_format_inherited -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_programmatic_function_from_dict -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_programmatic_function_iterable -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_programmatic_function_string -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_programmatic_function_string_list -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_repr -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_repr_override -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_reversed_iteration_order -*graalpython.lib-python.3.test.test_enum.TestIntEnum.test_str -*graalpython.lib-python.3.test.test_enum.TestIntEnumConvert.test_convert -*graalpython.lib-python.3.test.test_enum.TestIntEnumConvert.test_convert_raise -*graalpython.lib-python.3.test.test_enum.TestIntEnumConvert.test_convert_value_lookup_priority -*graalpython.lib-python.3.test.test_enum.TestIntEnumConvert.test_convert_warn -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_and -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_attribute_deletion -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_bad_new_super -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_basics -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_bool -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_bool_is_true -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_changing_member_fails -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_closed_invert_expectations -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_contains -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_contains_er -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_contains_tf -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_copy -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_copy_member -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_default_missing_with_wrong_type_value -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_dir_on_class -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_dir_on_item -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_dir_on_sub_with_behavior_including_instance_dict_on_super -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_dir_on_sub_with_behavior_on_super -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_dir_with_added_behavior -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_enum_in_enum_out -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_format -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_format_specs -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_hash -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_inherited_repr -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_invalid_names -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_invert -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_member_contains -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_multiple_mixin -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_multiple_superclasses_repr -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_object_str_override -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_open_invert_expectations -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_or -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_overridden_format -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_overridden_str -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_overridden_str_format -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_overridden_str_format_inherited -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_programatic_function_from_dict -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_programatic_function_from_empty_list -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_programatic_function_from_empty_tuple -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_programatic_function_iterable -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_programatic_function_string -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_programatic_function_string_list -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_programatic_function_string_with_start -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_programmatic_function_from_dict -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_programmatic_function_iterable -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_programmatic_function_string -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_programmatic_function_string_list -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_repr -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_repr_override -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_reversed_iteration_order -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_str -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_type -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_unique_composite -*graalpython.lib-python.3.test.test_enum.TestIntFlag.test_xor -*graalpython.lib-python.3.test.test_enum.TestInternals.test_auto_garbage_corrected_fail -*graalpython.lib-python.3.test.test_enum.TestInternals.test_auto_garbage_corrected_ok -*graalpython.lib-python.3.test.test_enum.TestInternals.test_auto_garbage_fail -*graalpython.lib-python.3.test.test_enum.TestInternals.test_auto_garbage_ok -*graalpython.lib-python.3.test.test_enum.TestInternals.test_auto_name -*graalpython.lib-python.3.test.test_enum.TestInternals.test_auto_name_inherit -*graalpython.lib-python.3.test.test_enum.TestInternals.test_auto_number -*graalpython.lib-python.3.test.test_enum.TestInternals.test_auto_order -*graalpython.lib-python.3.test.test_enum.TestInternals.test_auto_order_wierd -*graalpython.lib-python.3.test.test_enum.TestInternals.test_auto_with_aliases -*graalpython.lib-python.3.test.test_enum.TestInternals.test_dunder -*graalpython.lib-python.3.test.test_enum.TestInternals.test_duplicate_auto -*graalpython.lib-python.3.test.test_enum.TestInternals.test_is_private -*graalpython.lib-python.3.test.test_enum.TestInternals.test_multiple_auto_on_line -*graalpython.lib-python.3.test.test_enum.TestInternals.test_sunder -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_attribute_deletion -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_bad_new_super -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_basics -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_bool_is_true -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_changing_member_fails -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_contains_er -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_contains_tf -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_copy -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_copy_member -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_dir_on_class -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_dir_on_item -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_dir_on_sub_with_behavior_including_instance_dict_on_super -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_dir_on_sub_with_behavior_on_super -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_dir_with_added_behavior -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_enum_in_enum_out -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_format -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_format_specs -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_hash -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_inherited_repr -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_invalid_names -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_multiple_superclasses_repr -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_object_str_override -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_overridden_format -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_overridden_str -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_overridden_str_format -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_overridden_str_format_inherited -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_programmatic_function_from_dict -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_programmatic_function_iterable -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_programmatic_function_string -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_programmatic_function_string_list -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_repr -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_repr_override -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_reversed_iteration_order -*graalpython.lib-python.3.test.test_enum.TestMinimalDate.test_str -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_attribute_deletion -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_bad_new_super -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_basics -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_bool_is_true -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_changing_member_fails -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_contains_er -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_contains_tf -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_copy -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_copy_member -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_dir_on_class -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_dir_on_item -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_dir_on_sub_with_behavior_including_instance_dict_on_super -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_dir_on_sub_with_behavior_on_super -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_dir_with_added_behavior -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_enum_in_enum_out -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_format -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_format_specs -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_hash -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_inherited_repr -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_invalid_names -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_multiple_superclasses_repr -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_object_str_override -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_overridden_format -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_overridden_str -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_overridden_str_format -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_overridden_str_format_inherited -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_programmatic_function_from_dict -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_programmatic_function_iterable -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_programmatic_function_string -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_programmatic_function_string_list -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_repr -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_repr_override -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_reversed_iteration_order -*graalpython.lib-python.3.test.test_enum.TestMinimalFloat.test_str -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_attribute_deletion -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_bad_new_super -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_basics -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_bool_is_true -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_changing_member_fails -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_contains_er -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_contains_tf -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_dir_on_class -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_dir_on_item -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_dir_on_sub_with_behavior_including_instance_dict_on_super -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_dir_on_sub_with_behavior_on_super -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_dir_with_added_behavior -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_enum_in_enum_out -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_format -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_format_specs -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_hash -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_inherited_repr -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_invalid_names -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_multiple_superclasses_repr -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_object_str_override -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_overridden_format -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_overridden_str -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_overridden_str_format -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_overridden_str_format_inherited -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_programmatic_function_from_dict -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_programmatic_function_iterable -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_programmatic_function_string -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_programmatic_function_string_list -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_repr -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_repr_override -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_reversed_iteration_order -*graalpython.lib-python.3.test.test_enum.TestMixedDate.test_str -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_attribute_deletion -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_bad_new_super -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_basics -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_bool_is_true -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_changing_member_fails -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_contains_er -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_contains_tf -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_dir_on_class -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_dir_on_item -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_dir_on_sub_with_behavior_including_instance_dict_on_super -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_dir_on_sub_with_behavior_on_super -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_dir_with_added_behavior -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_enum_in_enum_out -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_format -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_format_specs -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_hash -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_inherited_repr -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_invalid_names -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_multiple_superclasses_repr -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_object_str_override -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_overridden_format -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_overridden_str -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_overridden_str_format -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_overridden_str_format_inherited -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_programmatic_function_from_dict -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_programmatic_function_iterable -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_programmatic_function_string -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_programmatic_function_string_list -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_repr -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_repr_override -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_reversed_iteration_order -*graalpython.lib-python.3.test.test_enum.TestMixedFloat.test_str -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_attribute_deletion -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_bad_new_super -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_basics -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_bool_is_true -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_changing_member_fails -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_contains_er -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_contains_tf -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_dir_on_class -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_dir_on_item -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_dir_on_sub_with_behavior_including_instance_dict_on_super -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_dir_on_sub_with_behavior_on_super -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_dir_with_added_behavior -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_enum_in_enum_out -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_format -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_format_specs -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_hash -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_inherited_repr -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_invalid_names -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_multiple_superclasses_repr -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_object_str_override -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_overridden_format -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_overridden_str -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_overridden_str_format -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_overridden_str_format_inherited -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_programmatic_function_from_dict -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_programmatic_function_iterable -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_programmatic_function_string -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_programmatic_function_string_list -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_repr -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_repr_override -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_reversed_iteration_order -*graalpython.lib-python.3.test.test_enum.TestMixedInt.test_str -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_attribute_deletion -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_bad_new_super -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_basics -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_bool_is_true -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_changing_member_fails -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_closed_invert_expectations -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_contains_er -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_contains_tf -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_default_missing_with_wrong_type_value -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_dir_on_class -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_dir_on_item -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_dir_on_sub_with_behavior_including_instance_dict_on_super -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_dir_on_sub_with_behavior_on_super -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_dir_with_added_behavior -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_enum_in_enum_out -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_format -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_format_specs -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_hash -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_inherited_repr -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_invalid_names -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_multiple_superclasses_repr -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_object_str_override -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_open_invert_expectations -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_overridden_format -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_overridden_str -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_overridden_str_format -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_overridden_str_format_inherited -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_programmatic_function_from_dict -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_programmatic_function_iterable -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_programmatic_function_string -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_programmatic_function_string_list -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_repr -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_repr_override -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_reversed_iteration_order -*graalpython.lib-python.3.test.test_enum.TestMixedIntFlag.test_str -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_attribute_deletion -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_bad_new_super -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_basics -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_bool_is_true -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_changing_member_fails -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_contains_er -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_contains_tf -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_dir_on_class -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_dir_on_item -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_dir_on_sub_with_behavior_including_instance_dict_on_super -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_dir_on_sub_with_behavior_on_super -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_dir_with_added_behavior -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_enum_in_enum_out -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_format -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_format_specs -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_hash -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_inherited_repr -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_invalid_names -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_multiple_superclasses_repr -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_object_str_override -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_overridden_format -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_overridden_str -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_overridden_str_format -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_overridden_str_format_inherited -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_programmatic_function_from_dict -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_programmatic_function_iterable -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_programmatic_function_string -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_programmatic_function_string_list -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_repr -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_repr_override -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_reversed_iteration_order -*graalpython.lib-python.3.test.test_enum.TestMixedStr.test_str -*graalpython.lib-python.3.test.test_enum.TestOrder.test_enum_has_extra_members -*graalpython.lib-python.3.test.test_enum.TestOrder.test_enum_has_extra_members_with_aliases -*graalpython.lib-python.3.test.test_enum.TestOrder.test_order_has_extra_members -*graalpython.lib-python.3.test.test_enum.TestOrder.test_order_has_extra_members_with_aliases -*graalpython.lib-python.3.test.test_enum.TestOrder.test_same_members -*graalpython.lib-python.3.test.test_enum.TestOrder.test_same_members_with_aliases -*graalpython.lib-python.3.test.test_enum.TestOrder.test_same_members_wrong_order -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_attribute_deletion -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_bad_new_super -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_basics -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_bool_is_true -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_changing_member_fails -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_contains_er -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_contains_tf -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_dir_on_class -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_dir_on_item -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_dir_on_sub_with_behavior_including_instance_dict_on_super -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_dir_on_sub_with_behavior_on_super -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_dir_with_added_behavior -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_enum_in_enum_out -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_format -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_format_specs -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_hash -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_inherited_repr -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_invalid_names -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_multiple_superclasses_repr -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_object_str_override -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_overridden_format -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_overridden_str -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_overridden_str_format -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_overridden_str_format_inherited -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_programmatic_function_from_dict -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_programmatic_function_iterable -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_programmatic_function_string -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_programmatic_function_string_list -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_repr -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_repr_override -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_reversed_iteration_order -*graalpython.lib-python.3.test.test_enum.TestPlainEnum.test_str -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_attribute_deletion -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_bad_new_super -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_basics -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_bool_is_true -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_changing_member_fails -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_closed_invert_expectations -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_contains_er -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_contains_tf -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_default_missing_with_wrong_type_value -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_dir_on_class -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_dir_on_item -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_dir_on_sub_with_behavior_including_instance_dict_on_super -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_dir_on_sub_with_behavior_on_super -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_dir_with_added_behavior -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_enum_in_enum_out -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_format -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_format_specs -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_hash -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_inherited_repr -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_invalid_names -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_multiple_superclasses_repr -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_object_str_override -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_open_invert_expectations -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_overridden_format -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_overridden_str -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_overridden_str_format -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_overridden_str_format_inherited -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_programmatic_function_from_dict -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_programmatic_function_iterable -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_programmatic_function_string -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_programmatic_function_string_list -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_repr -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_repr_override -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_reversed_iteration_order -*graalpython.lib-python.3.test.test_enum.TestPlainFlag.test_str -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_bool -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_comparisons -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_conflicting_types_resolved_in_new -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_custom_flag_bitwise -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_default_missing_no_chained_exception -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_dir_with_custom_dunders -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_duplicate_name_error -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_duplicate_values_give_unique_enum_items -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_dynamic_members_with_static_methods -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_empty_globals -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_enum_function_with_qualname -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_enum_of_generic_aliases -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_enum_of_types -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_enum_of_types_with_nonmember -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_enum_with_value_name -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_equality -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_exclude_methods -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_extending -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_extending2 -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_extending3 -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_flag_with_custom_new -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_floatenum_fromhex -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_flufl_enum -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_getattr_dunder -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_getattr_getitem -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_ignore -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_inherited_data_type -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_inherited_new_from_enhanced_enum -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_inherited_new_from_mixed_enum -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_init -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_init_exception -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_int_flags_copy -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_intenum_from_bytes -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_intenum_transitivity -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_introspection -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_iteration_order -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_member_from_member_access -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_missing_exceptions_reset -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_missing_override -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_missing_value_error -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_mixed_enum_in_call_1 -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_mixed_enum_in_call_2 -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_multiple_inherited_mixin -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_multiple_mixin -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_multiple_mixin_inherited -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_multiple_mixin_mro -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_multiple_mixin_with_common_data_type -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_namedtuple_as_value -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_nested_classes_in_enum_are_members -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_nested_classes_in_enum_are_not_members -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_nested_classes_in_enum_with_member -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_nested_classes_in_enum_with_nonmember -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_no_duplicates -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_no_such_enum_member -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_nonhash_value -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_ordered_mixin -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_pickle_by_name -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_pickle_enum -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_pickle_enum_function -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_pickle_enum_function_with_module -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_pickle_explodes -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_pickle_float -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_pickle_int -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_pickle_nested_class -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_private_variable_is_normal_attribute -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_programmatic_function_string_list_with_start -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_programmatic_function_string_with_start -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_programmatic_function_type -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_programmatic_function_type_from_subclass -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_programmatic_function_type_from_subclass_with_start -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_programmatic_function_type_with_start -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_repr_and_str_with_no_init_mixin -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_repr_with_dataclass -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_repr_with_init_mixin -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_reserved_sunder_error -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_strenum -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_string_enum -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_subclass_duplicate_name -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_subclass_duplicate_name_dynamic -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_subclasses_with_direct_pickle_support -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_subclasses_with_getnewargs -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_subclasses_with_getnewargs_ex -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_subclasses_with_reduce -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_subclasses_with_reduce_ex -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_subclasses_without_direct_pickle_support -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_subclassing -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_too_many_data_types -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_tuple_subclass -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_value_backup_assign -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_wrong_enum_in_call -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_wrong_enum_in_mixed_call -*graalpython.lib-python.3.test.test_enum.TestSpecial.test_wrong_inheritance_order -*graalpython.lib-python.3.test.test_enum.TestStdLib.test_inspect_classify_class_attrs -*graalpython.lib-python.3.test.test_enum.TestStdLib.test_inspect_getmembers -*graalpython.lib-python.3.test.test_enum.TestStdLib.test_pydoc -*graalpython.lib-python.3.test.test_enum.TestStdLib.test_test_simple_enum -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_attribute_deletion -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_bad_new_super -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_basics -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_bool_is_true -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_changing_member_fails -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_contains_er -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_contains_tf -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_copy -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_copy_member -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_dir_on_class -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_dir_on_item -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_dir_on_sub_with_behavior_including_instance_dict_on_super -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_dir_on_sub_with_behavior_on_super -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_dir_with_added_behavior -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_enum_in_enum_out -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_format -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_format_specs -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_hash -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_inherited_repr -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_invalid_names -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_multiple_superclasses_repr -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_object_str_override -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_overridden_format -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_overridden_str -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_overridden_str_format -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_overridden_str_format_inherited -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_programmatic_function_from_dict -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_programmatic_function_iterable -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_programmatic_function_string -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_programmatic_function_string_list -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_repr -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_repr_override -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_reversed_iteration_order -*graalpython.lib-python.3.test.test_enum.TestStrEnum.test_str -*graalpython.lib-python.3.test.test_enum.TestUnique.test_unique_clean -*graalpython.lib-python.3.test.test_enum.TestUnique.test_unique_dirty -*graalpython.lib-python.3.test.test_enum.TestUnique.test_unique_with_name -*graalpython.lib-python.3.test.test_enum.TestVerify.test_composite -*graalpython.lib-python.3.test.test_enum.TestVerify.test_continuous -*graalpython.lib-python.3.test.test_enum.TestVerify.test_negative_alias -*graalpython.lib-python.3.test.test_enum.TestVerify.test_unique_clean -*graalpython.lib-python.3.test.test_enum.TestVerify.test_unique_dirty -*graalpython.lib-python.3.test.test_enum.TestVerify.test_unique_with_name +DocTestCase.enum.Enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.enum._simple_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.enum._test_simple_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.enum.bin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.MiscTestCase.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.MiscTestCase.test_doc_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.MiscTestCase.test_doc_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.MiscTestCase.test_doc_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.MiscTestCase.test_doc_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_aliases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_and @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_auto_number @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_auto_number_garbage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_contains_er @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_duplicate_auto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_init_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_member_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_member_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_member_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_multiple_mixin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_number_reset_and_order_cleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_or @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_programatic_function_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_programatic_function_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_programatic_function_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_programatic_function_string_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_programatic_function_string_with_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_unique_composite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestFlag.test_xor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_aliases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_and @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_contains_er @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_global_enum_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_global_repr_conform1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_global_repr_keep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_invert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_member_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_member_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_member_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_multiple_mixin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_or @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_programatic_function_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_programatic_function_from_empty_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_programatic_function_from_empty_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_programatic_function_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_programatic_function_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_programatic_function_string_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_programatic_function_string_with_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_unique_composite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.OldTestIntFlag.test_xor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestConvert.test_convert_complex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestConvert.test_convert_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestConvert.test_convert_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestConvert.test_convert_repr_and_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestConvert.test_convert_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestConvert.test_convert_uncomparable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestConvert.test_convert_value_lookup_priority @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestEmptyAndNonLatinStrings.test_empty_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestEmptyAndNonLatinStrings.test_non_latin_character_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestEmptyAndNonLatinStrings.test_non_latin_number_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestHelpers.test_dunder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestHelpers.test_is_descriptor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestHelpers.test_is_private @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestHelpers.test_iter_bits_lsb @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestHelpers.test_sunder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_attribute_deletion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_bad_new_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_bool_is_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_changing_member_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_contains_er @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_copy_member @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_dir_on_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_dir_on_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_dir_on_sub_with_behavior_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_dir_with_added_behavior @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_enum_in_enum_out @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_format_specs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_inherited_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_invalid_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_multiple_superclasses_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_object_str_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_overridden_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_overridden_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_overridden_str_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_overridden_str_format_inherited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_programmatic_function_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_programmatic_function_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_programmatic_function_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_programmatic_function_string_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_repr_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_reversed_iteration_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntEnum.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_attribute_deletion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_bad_new_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_bool_is_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_changing_member_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_closed_invert_expectations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_contains_er @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_copy_member @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_default_missing_with_wrong_type_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_dir_on_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_dir_on_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_dir_on_sub_with_behavior_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_dir_with_added_behavior @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_enum_in_enum_out @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_format_specs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_inherited_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_invalid_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_multiple_superclasses_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_object_str_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_open_invert_expectations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_overridden_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_overridden_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_overridden_str_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_overridden_str_format_inherited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_programmatic_function_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_programmatic_function_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_programmatic_function_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_programmatic_function_string_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_repr_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_reversed_iteration_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestIntFlag.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestInternals.test_auto_garbage_corrected_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestInternals.test_auto_garbage_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestInternals.test_auto_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestInternals.test_auto_name_inherit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestInternals.test_auto_number @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestInternals.test_auto_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestInternals.test_auto_order_wierd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestInternals.test_dunder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestInternals.test_duplicate_auto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestInternals.test_is_private @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestInternals.test_multiple_auto_on_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestInternals.test_sunder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_attribute_deletion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_bad_new_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_bool_is_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_changing_member_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_contains_er @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_copy_member @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_dir_on_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_dir_on_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_dir_on_sub_with_behavior_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_dir_with_added_behavior @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_enum_in_enum_out @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_format_specs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_inherited_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_invalid_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_multiple_superclasses_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_object_str_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_overridden_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_overridden_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_overridden_str_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_overridden_str_format_inherited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_programmatic_function_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_programmatic_function_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_programmatic_function_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_programmatic_function_string_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_repr_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_reversed_iteration_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalDate.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_attribute_deletion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_bad_new_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_bool_is_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_changing_member_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_contains_er @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_copy_member @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_dir_on_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_dir_on_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_dir_on_sub_with_behavior_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_dir_with_added_behavior @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_enum_in_enum_out @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_format_specs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_inherited_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_invalid_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_multiple_superclasses_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_object_str_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_overridden_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_overridden_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_overridden_str_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_overridden_str_format_inherited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_programmatic_function_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_programmatic_function_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_programmatic_function_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_programmatic_function_string_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_repr_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_reversed_iteration_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMinimalFloat.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_attribute_deletion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_bad_new_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_bool_is_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_changing_member_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_contains_er @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_dir_on_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_dir_on_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_dir_on_sub_with_behavior_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_dir_with_added_behavior @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_enum_in_enum_out @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_format_specs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_inherited_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_invalid_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_multiple_superclasses_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_object_str_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_overridden_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_overridden_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_overridden_str_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_overridden_str_format_inherited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_programmatic_function_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_programmatic_function_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_programmatic_function_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_programmatic_function_string_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_repr_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_reversed_iteration_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedDate.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_attribute_deletion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_bad_new_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_bool_is_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_changing_member_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_contains_er @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_dir_on_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_dir_on_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_dir_on_sub_with_behavior_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_dir_with_added_behavior @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_enum_in_enum_out @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_format_specs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_inherited_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_invalid_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_multiple_superclasses_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_object_str_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_overridden_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_overridden_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_overridden_str_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_overridden_str_format_inherited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_programmatic_function_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_programmatic_function_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_programmatic_function_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_programmatic_function_string_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_repr_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_reversed_iteration_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedFloat.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_attribute_deletion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_bad_new_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_bool_is_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_changing_member_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_contains_er @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_dir_on_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_dir_on_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_dir_on_sub_with_behavior_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_dir_with_added_behavior @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_enum_in_enum_out @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_format_specs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_inherited_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_invalid_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_multiple_superclasses_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_object_str_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_overridden_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_overridden_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_overridden_str_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_overridden_str_format_inherited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_programmatic_function_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_programmatic_function_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_programmatic_function_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_programmatic_function_string_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_repr_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_reversed_iteration_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedInt.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_attribute_deletion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_bad_new_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_bool_is_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_changing_member_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_closed_invert_expectations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_contains_er @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_default_missing_with_wrong_type_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_dir_on_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_dir_on_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_dir_on_sub_with_behavior_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_dir_with_added_behavior @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_enum_in_enum_out @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_format_specs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_inherited_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_invalid_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_multiple_superclasses_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_object_str_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_open_invert_expectations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_overridden_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_overridden_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_overridden_str_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_overridden_str_format_inherited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_programmatic_function_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_programmatic_function_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_programmatic_function_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_programmatic_function_string_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_repr_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_reversed_iteration_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedIntFlag.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_attribute_deletion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_bad_new_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_bool_is_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_changing_member_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_contains_er @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_dir_on_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_dir_on_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_dir_on_sub_with_behavior_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_dir_with_added_behavior @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_enum_in_enum_out @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_format_specs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_inherited_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_invalid_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_multiple_superclasses_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_object_str_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_overridden_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_overridden_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_overridden_str_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_overridden_str_format_inherited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_programmatic_function_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_programmatic_function_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_programmatic_function_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_programmatic_function_string_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_repr_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_reversed_iteration_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestMixedStr.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestOrder.test_enum_has_extra_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestOrder.test_enum_has_extra_members_with_aliases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestOrder.test_order_has_extra_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestOrder.test_order_has_extra_members_with_aliases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestOrder.test_same_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestOrder.test_same_members_with_aliases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestOrder.test_same_members_wrong_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_attribute_deletion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_bad_new_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_bool_is_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_changing_member_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_contains_er @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_dir_on_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_dir_on_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_dir_on_sub_with_behavior_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_dir_with_added_behavior @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_enum_in_enum_out @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_format_specs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_inherited_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_invalid_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_multiple_superclasses_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_object_str_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_overridden_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_overridden_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_overridden_str_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_overridden_str_format_inherited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_programmatic_function_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_programmatic_function_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_programmatic_function_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_programmatic_function_string_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_repr_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_reversed_iteration_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainEnum.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_attribute_deletion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_bad_new_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_bool_is_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_changing_member_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_closed_invert_expectations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_contains_er @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_default_missing_with_wrong_type_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_dir_on_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_dir_on_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_dir_on_sub_with_behavior_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_dir_with_added_behavior @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_enum_in_enum_out @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_format_specs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_inherited_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_invalid_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_multiple_superclasses_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_object_str_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_open_invert_expectations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_overridden_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_overridden_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_overridden_str_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_overridden_str_format_inherited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_programmatic_function_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_programmatic_function_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_programmatic_function_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_programmatic_function_string_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_repr_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_reversed_iteration_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestPlainFlag.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_comparisons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_conflicting_types_resolved_in_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_custom_flag_bitwise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_default_missing_no_chained_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_duplicate_name_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_duplicate_values_give_unique_enum_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_dynamic_members_with_static_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_empty_globals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_enum_function_with_qualname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_enum_of_generic_aliases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_enum_of_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_enum_of_types_with_nonmember @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_enum_with_value_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_exclude_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_extending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_extending2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_extending3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_flag_with_custom_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_floatenum_fromhex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_flufl_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_getattr_dunder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_getattr_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_ignore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_inherited_data_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_inherited_new_from_enhanced_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_inherited_new_from_mixed_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_init_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_int_flags_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_intenum_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_intenum_transitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_introspection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_iteration_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_member_from_member_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_missing_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_missing_value_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_mixed_enum_in_call_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_mixed_enum_in_call_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_multiple_inherited_mixin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_multiple_mixin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_multiple_mixin_inherited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_multiple_mixin_mro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_multiple_mixin_with_common_data_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_namedtuple_as_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_nested_classes_in_enum_are_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_nested_classes_in_enum_with_member @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_nested_classes_in_enum_with_nonmember @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_no_duplicates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_no_such_enum_member @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_nonhash_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_ordered_mixin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_pickle_by_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_pickle_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_pickle_enum_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_pickle_enum_function_with_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_pickle_explodes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_pickle_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_pickle_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_pickle_nested_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_private_variable_is_normal_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_programmatic_function_string_list_with_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_programmatic_function_string_with_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_programmatic_function_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_programmatic_function_type_from_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_programmatic_function_type_from_subclass_with_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_programmatic_function_type_with_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_repr_and_str_with_no_init_mixin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_repr_with_dataclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_repr_with_init_mixin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_reserved_sunder_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_strenum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_string_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_subclass_duplicate_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_subclass_duplicate_name_dynamic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_subclasses_with_direct_pickle_support @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_subclasses_with_getnewargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_subclasses_with_getnewargs_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_subclasses_with_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_subclasses_with_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_subclasses_without_direct_pickle_support @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_too_many_data_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_tuple_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_value_backup_assign @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_wrong_enum_in_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_wrong_enum_in_mixed_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestSpecial.test_wrong_inheritance_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStdLib.test_inspect_classify_class_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStdLib.test_inspect_getmembers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStdLib.test_pydoc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStdLib.test_test_simple_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_attribute_deletion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_bad_new_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_bool_is_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_changing_member_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_contains_er @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_copy_member @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_dir_on_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_dir_on_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_dir_on_sub_with_behavior_on_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_dir_with_added_behavior @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_enum_in_enum_out @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_format_specs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_inherited_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_invalid_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_multiple_superclasses_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_object_str_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_overridden_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_overridden_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_overridden_str_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_overridden_str_format_inherited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_programmatic_function_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_programmatic_function_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_programmatic_function_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_programmatic_function_string_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_repr_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_reversed_iteration_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestStrEnum.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestUnique.test_unique_clean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestUnique.test_unique_dirty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestUnique.test_unique_with_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestVerify.test_composite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestVerify.test_continuous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestVerify.test_negative_alias @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestVerify.test_unique_clean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestVerify.test_unique_dirty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enum.TestVerify.test_unique_with_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_enumerate.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_enumerate.txt index e0d37eeef7..3fd23ccdbf 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_enumerate.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_enumerate.txt @@ -1,92 +1,78 @@ -*graalpython.lib-python.3.test.test_enumerate.EnumerateStartTestCase.test_argumentcheck -*graalpython.lib-python.3.test.test_enumerate.EnumerateStartTestCase.test_basicfunction -*graalpython.lib-python.3.test.test_enumerate.EnumerateStartTestCase.test_enumerate_result_gc -*graalpython.lib-python.3.test.test_enumerate.EnumerateStartTestCase.test_exception_propagation -*graalpython.lib-python.3.test.test_enumerate.EnumerateStartTestCase.test_getitemseqn -*graalpython.lib-python.3.test.test_enumerate.EnumerateStartTestCase.test_illformediterable -*graalpython.lib-python.3.test.test_enumerate.EnumerateStartTestCase.test_iteratorgenerator -*graalpython.lib-python.3.test.test_enumerate.EnumerateStartTestCase.test_iteratorseqn -*graalpython.lib-python.3.test.test_enumerate.EnumerateStartTestCase.test_kwargs -*graalpython.lib-python.3.test.test_enumerate.EnumerateStartTestCase.test_noniterable -*graalpython.lib-python.3.test.test_enumerate.EnumerateStartTestCase.test_pickle -*graalpython.lib-python.3.test.test_enumerate.EnumerateStartTestCase.test_tuple_reuse -*graalpython.lib-python.3.test.test_enumerate.EnumerateTestCase.test_argumentcheck -*graalpython.lib-python.3.test.test_enumerate.EnumerateTestCase.test_basicfunction -*graalpython.lib-python.3.test.test_enumerate.EnumerateTestCase.test_enumerate_result_gc -*graalpython.lib-python.3.test.test_enumerate.EnumerateTestCase.test_exception_propagation -*graalpython.lib-python.3.test.test_enumerate.EnumerateTestCase.test_getitemseqn -*graalpython.lib-python.3.test.test_enumerate.EnumerateTestCase.test_illformediterable -*graalpython.lib-python.3.test.test_enumerate.EnumerateTestCase.test_iteratorgenerator -*graalpython.lib-python.3.test.test_enumerate.EnumerateTestCase.test_iteratorseqn -*graalpython.lib-python.3.test.test_enumerate.EnumerateTestCase.test_kwargs -*graalpython.lib-python.3.test.test_enumerate.EnumerateTestCase.test_noniterable -*graalpython.lib-python.3.test.test_enumerate.EnumerateTestCase.test_pickle -*graalpython.lib-python.3.test.test_enumerate.EnumerateTestCase.test_tuple_reuse -*graalpython.lib-python.3.test.test_enumerate.SubclassTestCase.test_argumentcheck -*graalpython.lib-python.3.test.test_enumerate.SubclassTestCase.test_basicfunction -*graalpython.lib-python.3.test.test_enumerate.SubclassTestCase.test_enumerate_result_gc -*graalpython.lib-python.3.test.test_enumerate.SubclassTestCase.test_exception_propagation -*graalpython.lib-python.3.test.test_enumerate.SubclassTestCase.test_getitemseqn -*graalpython.lib-python.3.test.test_enumerate.SubclassTestCase.test_illformediterable -*graalpython.lib-python.3.test.test_enumerate.SubclassTestCase.test_iteratorgenerator -*graalpython.lib-python.3.test.test_enumerate.SubclassTestCase.test_iteratorseqn -*graalpython.lib-python.3.test.test_enumerate.SubclassTestCase.test_kwargs -*graalpython.lib-python.3.test.test_enumerate.SubclassTestCase.test_noniterable -*graalpython.lib-python.3.test.test_enumerate.SubclassTestCase.test_pickle -*graalpython.lib-python.3.test.test_enumerate.SubclassTestCase.test_tuple_reuse -*graalpython.lib-python.3.test.test_enumerate.TestBig.test_argumentcheck -*graalpython.lib-python.3.test.test_enumerate.TestBig.test_basicfunction -*graalpython.lib-python.3.test.test_enumerate.TestBig.test_enumerate_result_gc -*graalpython.lib-python.3.test.test_enumerate.TestBig.test_exception_propagation -*graalpython.lib-python.3.test.test_enumerate.TestBig.test_getitemseqn -*graalpython.lib-python.3.test.test_enumerate.TestBig.test_illformediterable -*graalpython.lib-python.3.test.test_enumerate.TestBig.test_iteratorgenerator -*graalpython.lib-python.3.test.test_enumerate.TestBig.test_iteratorseqn -*graalpython.lib-python.3.test.test_enumerate.TestBig.test_kwargs -*graalpython.lib-python.3.test.test_enumerate.TestBig.test_noniterable -*graalpython.lib-python.3.test.test_enumerate.TestBig.test_pickle -*graalpython.lib-python.3.test.test_enumerate.TestBig.test_tuple_reuse -*graalpython.lib-python.3.test.test_enumerate.TestEmpty.test_argumentcheck -*graalpython.lib-python.3.test.test_enumerate.TestEmpty.test_basicfunction -*graalpython.lib-python.3.test.test_enumerate.TestEmpty.test_enumerate_result_gc -*graalpython.lib-python.3.test.test_enumerate.TestEmpty.test_exception_propagation -*graalpython.lib-python.3.test.test_enumerate.TestEmpty.test_getitemseqn -*graalpython.lib-python.3.test.test_enumerate.TestEmpty.test_illformediterable -*graalpython.lib-python.3.test.test_enumerate.TestEmpty.test_iteratorgenerator -*graalpython.lib-python.3.test.test_enumerate.TestEmpty.test_iteratorseqn -*graalpython.lib-python.3.test.test_enumerate.TestEmpty.test_kwargs -*graalpython.lib-python.3.test.test_enumerate.TestEmpty.test_noniterable -*graalpython.lib-python.3.test.test_enumerate.TestEmpty.test_pickle -*graalpython.lib-python.3.test.test_enumerate.TestEmpty.test_tuple_reuse -*graalpython.lib-python.3.test.test_enumerate.TestLongStart.test_argumentcheck -*graalpython.lib-python.3.test.test_enumerate.TestLongStart.test_basicfunction -*graalpython.lib-python.3.test.test_enumerate.TestLongStart.test_enumerate_result_gc -*graalpython.lib-python.3.test.test_enumerate.TestLongStart.test_exception_propagation -*graalpython.lib-python.3.test.test_enumerate.TestLongStart.test_getitemseqn -*graalpython.lib-python.3.test.test_enumerate.TestLongStart.test_illformediterable -*graalpython.lib-python.3.test.test_enumerate.TestLongStart.test_iteratorgenerator -*graalpython.lib-python.3.test.test_enumerate.TestLongStart.test_iteratorseqn -*graalpython.lib-python.3.test.test_enumerate.TestLongStart.test_kwargs -*graalpython.lib-python.3.test.test_enumerate.TestLongStart.test_noniterable -*graalpython.lib-python.3.test.test_enumerate.TestLongStart.test_pickle -*graalpython.lib-python.3.test.test_enumerate.TestLongStart.test_tuple_reuse -*graalpython.lib-python.3.test.test_enumerate.TestReversed.test_args -*graalpython.lib-python.3.test.test_enumerate.TestReversed.test_bug1229429 -*graalpython.lib-python.3.test.test_enumerate.TestReversed.test_gc -*graalpython.lib-python.3.test.test_enumerate.TestReversed.test_len -*graalpython.lib-python.3.test.test_enumerate.TestReversed.test_objmethods -*graalpython.lib-python.3.test.test_enumerate.TestReversed.test_pickle -*graalpython.lib-python.3.test.test_enumerate.TestReversed.test_range_optimization -*graalpython.lib-python.3.test.test_enumerate.TestReversed.test_simple -*graalpython.lib-python.3.test.test_enumerate.TestStart.test_argumentcheck -*graalpython.lib-python.3.test.test_enumerate.TestStart.test_basicfunction -*graalpython.lib-python.3.test.test_enumerate.TestStart.test_enumerate_result_gc -*graalpython.lib-python.3.test.test_enumerate.TestStart.test_exception_propagation -*graalpython.lib-python.3.test.test_enumerate.TestStart.test_getitemseqn -*graalpython.lib-python.3.test.test_enumerate.TestStart.test_illformediterable -*graalpython.lib-python.3.test.test_enumerate.TestStart.test_iteratorgenerator -*graalpython.lib-python.3.test.test_enumerate.TestStart.test_iteratorseqn -*graalpython.lib-python.3.test.test_enumerate.TestStart.test_kwargs -*graalpython.lib-python.3.test.test_enumerate.TestStart.test_noniterable -*graalpython.lib-python.3.test.test_enumerate.TestStart.test_pickle -*graalpython.lib-python.3.test.test_enumerate.TestStart.test_tuple_reuse +test.test_enumerate.EnumerateStartTestCase.test_argumentcheck @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateStartTestCase.test_basicfunction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateStartTestCase.test_exception_propagation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateStartTestCase.test_getitemseqn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateStartTestCase.test_illformediterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateStartTestCase.test_iteratorgenerator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateStartTestCase.test_iteratorseqn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateStartTestCase.test_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateStartTestCase.test_noniterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateStartTestCase.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateTestCase.test_argumentcheck @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateTestCase.test_basicfunction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateTestCase.test_exception_propagation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateTestCase.test_getitemseqn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateTestCase.test_illformediterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateTestCase.test_iteratorgenerator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateTestCase.test_iteratorseqn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateTestCase.test_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateTestCase.test_noniterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.EnumerateTestCase.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.SubclassTestCase.test_argumentcheck @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.SubclassTestCase.test_basicfunction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.SubclassTestCase.test_exception_propagation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.SubclassTestCase.test_getitemseqn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.SubclassTestCase.test_illformediterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.SubclassTestCase.test_iteratorgenerator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.SubclassTestCase.test_iteratorseqn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.SubclassTestCase.test_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.SubclassTestCase.test_noniterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.SubclassTestCase.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestBig.test_argumentcheck @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestBig.test_basicfunction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestBig.test_exception_propagation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestBig.test_getitemseqn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestBig.test_illformediterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestBig.test_iteratorgenerator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestBig.test_iteratorseqn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestBig.test_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestBig.test_noniterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestBig.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestEmpty.test_argumentcheck @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestEmpty.test_basicfunction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestEmpty.test_exception_propagation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestEmpty.test_getitemseqn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestEmpty.test_illformediterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestEmpty.test_iteratorgenerator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestEmpty.test_iteratorseqn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestEmpty.test_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestEmpty.test_noniterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestEmpty.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestLongStart.test_argumentcheck @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestLongStart.test_basicfunction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestLongStart.test_exception_propagation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestLongStart.test_getitemseqn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestLongStart.test_illformediterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestLongStart.test_iteratorgenerator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestLongStart.test_iteratorseqn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestLongStart.test_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestLongStart.test_noniterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestLongStart.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestReversed.test_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestReversed.test_bug1229429 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestReversed.test_gc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestReversed.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestReversed.test_objmethods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestReversed.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestReversed.test_range_optimization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestReversed.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestStart.test_argumentcheck @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestStart.test_basicfunction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestStart.test_exception_propagation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestStart.test_getitemseqn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestStart.test_illformediterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestStart.test_iteratorgenerator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestStart.test_iteratorseqn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestStart.test_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestStart.test_noniterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_enumerate.TestStart.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_eof.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_eof.txt index 272b63d6fa..4cdcae85c6 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_eof.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_eof.txt @@ -1,7 +1,6 @@ -*graalpython.lib-python.3.test.test_eof.EOFTestCase.test_EOFC -*graalpython.lib-python.3.test.test_eof.EOFTestCase.test_EOFS -*graalpython.lib-python.3.test.test_eof.EOFTestCase.test_EOFS_with_file -*graalpython.lib-python.3.test.test_eof.EOFTestCase.test_EOF_single_quote -*graalpython.lib-python.3.test.test_eof.EOFTestCase.test_eof_with_line_continuation -*graalpython.lib-python.3.test.test_eof.EOFTestCase.test_line_continuation_EOF -*graalpython.lib-python.3.test.test_eof.EOFTestCase.test_line_continuation_EOF_from_file_bpo2180 +test.test_eof.EOFTestCase.test_EOFS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_eof.EOFTestCase.test_EOFS_with_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_eof.EOFTestCase.test_EOF_single_quote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_eof.EOFTestCase.test_eof_with_line_continuation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_eof.EOFTestCase.test_line_continuation_EOF @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_eof.EOFTestCase.test_line_continuation_EOF_from_file_bpo2180 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_errno.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_errno.txt index 81be12b555..12ceefa0ed 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_errno.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_errno.txt @@ -1,3 +1,3 @@ -*graalpython.lib-python.3.test.test_errno.ErrnoAttributeTests.test_for_improper_attributes -*graalpython.lib-python.3.test.test_errno.ErrnoAttributeTests.test_using_errorcode -*graalpython.lib-python.3.test.test_errno.ErrorcodeTests.test_attributes_in_errorcode +test.test_errno.ErrnoAttributeTests.test_for_improper_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_errno.ErrnoAttributeTests.test_using_errorcode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_errno.ErrorcodeTests.test_attributes_in_errorcode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_except_star.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_except_star.txt index 7a5011e043..474ae58bd3 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_except_star.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_except_star.txt @@ -1 +1 @@ -*graalpython.lib-python.3.test.test_except_star.TestInvalidExceptStar.test_mixed_except_and_except_star_is_syntax_error +test.test_except_star.TestInvalidExceptStar.test_mixed_except_and_except_star_is_syntax_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_exception_group.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_exception_group.txt index becde0e2ad..cc9e6fb3fa 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_exception_group.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_exception_group.txt @@ -1,49 +1,47 @@ -*graalpython.lib-python.3.test.test_exception_group.BadConstructorArgs.test_bad_EG_construction__bad_excs_sequence -*graalpython.lib-python.3.test.test_exception_group.BadConstructorArgs.test_bad_EG_construction__bad_message -*graalpython.lib-python.3.test.test_exception_group.BadConstructorArgs.test_bad_EG_construction__nested_non_exceptions -*graalpython.lib-python.3.test.test_exception_group.BadConstructorArgs.test_bad_EG_construction__too_many_args -*graalpython.lib-python.3.test.test_exception_group.DeepRecursionInSplitAndSubgroup.test_deep_split -*graalpython.lib-python.3.test.test_exception_group.DeepRecursionInSplitAndSubgroup.test_deep_subgroup -*graalpython.lib-python.3.test.test_exception_group.ExceptionGroupFields.test_basics_ExceptionGroup_fields -*graalpython.lib-python.3.test.test_exception_group.ExceptionGroupFields.test_fields_are_readonly -*graalpython.lib-python.3.test.test_exception_group.ExceptionGroupSplitTests.test_basics_split_by_predicate__match -*graalpython.lib-python.3.test.test_exception_group.ExceptionGroupSplitTests.test_basics_split_by_predicate__no_match -*graalpython.lib-python.3.test.test_exception_group.ExceptionGroupSplitTests.test_basics_split_by_predicate__passthrough -*graalpython.lib-python.3.test.test_exception_group.ExceptionGroupSplitTests.test_basics_split_by_type__match -*graalpython.lib-python.3.test.test_exception_group.ExceptionGroupSplitTests.test_basics_split_by_type__no_match -*graalpython.lib-python.3.test.test_exception_group.ExceptionGroupSplitTests.test_basics_split_by_type__passthrough -*graalpython.lib-python.3.test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_by_predicate__match -*graalpython.lib-python.3.test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_by_predicate__no_match -*graalpython.lib-python.3.test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_by_predicate__passthrough -*graalpython.lib-python.3.test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_by_type__match -*graalpython.lib-python.3.test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_by_type__no_match -*graalpython.lib-python.3.test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_by_type__passthrough -*graalpython.lib-python.3.test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_split__bad_arg_type -*graalpython.lib-python.3.test.test_exception_group.InstanceCreation.test_BEG_and_E_subclass_does_not_wrap_base_exceptions -*graalpython.lib-python.3.test.test_exception_group.InstanceCreation.test_BEG_and_specific_subclass_can_wrap_any_nonbase_exception -*graalpython.lib-python.3.test.test_exception_group.InstanceCreation.test_BEG_subclass_wraps_anything -*graalpython.lib-python.3.test.test_exception_group.InstanceCreation.test_BEG_wraps_BaseException__creates_BEG -*graalpython.lib-python.3.test.test_exception_group.InstanceCreation.test_BEG_wraps_Exceptions__creates_EG -*graalpython.lib-python.3.test.test_exception_group.InstanceCreation.test_EG_and_specific_subclass_can_wrap_any_nonbase_exception -*graalpython.lib-python.3.test.test_exception_group.InstanceCreation.test_EG_subclass_does_not_wrap_base_exceptions -*graalpython.lib-python.3.test.test_exception_group.InstanceCreation.test_EG_subclass_wraps_non_base_exceptions -*graalpython.lib-python.3.test.test_exception_group.InstanceCreation.test_EG_wraps_BaseException__raises_TypeError -*graalpython.lib-python.3.test.test_exception_group.InstanceCreation.test_EG_wraps_Exceptions__creates_EG -*graalpython.lib-python.3.test.test_exception_group.LeafGeneratorTest.test_leaf_generator -*graalpython.lib-python.3.test.test_exception_group.NestedExceptionGroupBasicsTest.test_iteration_full_tracebacks -*graalpython.lib-python.3.test.test_exception_group.NestedExceptionGroupBasicsTest.test_nested_exception_group_tracebacks -*graalpython.lib-python.3.test.test_exception_group.NestedExceptionGroupBasicsTest.test_nested_group_chaining -*graalpython.lib-python.3.test.test_exception_group.NestedExceptionGroupBasicsTest.test_nested_group_matches_template -*graalpython.lib-python.3.test.test_exception_group.NestedExceptionGroupSplitTest.test_split_BaseExceptionGroup -*graalpython.lib-python.3.test.test_exception_group.NestedExceptionGroupSplitTest.test_split_by_type -*graalpython.lib-python.3.test.test_exception_group.NestedExceptionGroupSplitTest.test_split_copies_notes -*graalpython.lib-python.3.test.test_exception_group.NestedExceptionGroupSplitTest.test_split_does_not_copy_non_sequence_notes -*graalpython.lib-python.3.test.test_exception_group.NestedExceptionGroupSubclassSplitTest.test_split_BaseExceptionGroup_subclass_no_derive_new_override -*graalpython.lib-python.3.test.test_exception_group.NestedExceptionGroupSubclassSplitTest.test_split_ExceptionGroup_subclass_derive_and_new_overrides -*graalpython.lib-python.3.test.test_exception_group.NestedExceptionGroupSubclassSplitTest.test_split_ExceptionGroup_subclass_no_derive_no_new_override -*graalpython.lib-python.3.test.test_exception_group.StrAndReprTests.test_BaseExceptionGroup -*graalpython.lib-python.3.test.test_exception_group.StrAndReprTests.test_ExceptionGroup -*graalpython.lib-python.3.test.test_exception_group.StrAndReprTests.test_custom_exception -*graalpython.lib-python.3.test.test_exception_group.TestExceptionGroupTypeHierarchy.test_exception_group_is_generic_type -*graalpython.lib-python.3.test.test_exception_group.TestExceptionGroupTypeHierarchy.test_exception_group_types -*graalpython.lib-python.3.test.test_exception_group.TestExceptionGroupTypeHierarchy.test_exception_is_not_generic_type +test.test_exception_group.BadConstructorArgs.test_bad_EG_construction__bad_excs_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.BadConstructorArgs.test_bad_EG_construction__bad_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.BadConstructorArgs.test_bad_EG_construction__nested_non_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.BadConstructorArgs.test_bad_EG_construction__too_many_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.ExceptionGroupFields.test_basics_ExceptionGroup_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.ExceptionGroupFields.test_fields_are_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.ExceptionGroupSplitTests.test_basics_split_by_predicate__match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.ExceptionGroupSplitTests.test_basics_split_by_predicate__no_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.ExceptionGroupSplitTests.test_basics_split_by_predicate__passthrough @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.ExceptionGroupSplitTests.test_basics_split_by_type__match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.ExceptionGroupSplitTests.test_basics_split_by_type__no_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.ExceptionGroupSplitTests.test_basics_split_by_type__passthrough @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_by_predicate__match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_by_predicate__no_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_by_predicate__passthrough @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_by_type__match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_by_type__no_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_by_type__passthrough @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_split__bad_arg_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.InstanceCreation.test_BEG_and_E_subclass_does_not_wrap_base_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.InstanceCreation.test_BEG_and_specific_subclass_can_wrap_any_nonbase_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.InstanceCreation.test_BEG_subclass_wraps_anything @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.InstanceCreation.test_BEG_wraps_BaseException__creates_BEG @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.InstanceCreation.test_BEG_wraps_Exceptions__creates_EG @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.InstanceCreation.test_EG_and_specific_subclass_can_wrap_any_nonbase_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.InstanceCreation.test_EG_subclass_does_not_wrap_base_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.InstanceCreation.test_EG_subclass_wraps_non_base_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.InstanceCreation.test_EG_wraps_BaseException__raises_TypeError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.InstanceCreation.test_EG_wraps_Exceptions__creates_EG @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.LeafGeneratorTest.test_leaf_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.NestedExceptionGroupBasicsTest.test_iteration_full_tracebacks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.NestedExceptionGroupBasicsTest.test_nested_exception_group_tracebacks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.NestedExceptionGroupBasicsTest.test_nested_group_chaining @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.NestedExceptionGroupBasicsTest.test_nested_group_matches_template @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.NestedExceptionGroupSplitTest.test_split_BaseExceptionGroup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.NestedExceptionGroupSplitTest.test_split_by_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.NestedExceptionGroupSplitTest.test_split_copies_notes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.NestedExceptionGroupSplitTest.test_split_does_not_copy_non_sequence_notes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.NestedExceptionGroupSubclassSplitTest.test_split_BaseExceptionGroup_subclass_no_derive_new_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.NestedExceptionGroupSubclassSplitTest.test_split_ExceptionGroup_subclass_derive_and_new_overrides @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.NestedExceptionGroupSubclassSplitTest.test_split_ExceptionGroup_subclass_no_derive_no_new_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.StrAndReprTests.test_BaseExceptionGroup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.StrAndReprTests.test_ExceptionGroup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.StrAndReprTests.test_custom_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.TestExceptionGroupTypeHierarchy.test_exception_group_is_generic_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.TestExceptionGroupTypeHierarchy.test_exception_group_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_group.TestExceptionGroupTypeHierarchy.test_exception_is_not_generic_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_exception_hierarchy.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_exception_hierarchy.txt index 7274a7775f..ca33df60b2 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_exception_hierarchy.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_exception_hierarchy.txt @@ -1,16 +1,15 @@ -*graalpython.lib-python.3.test.test_exception_hierarchy.AttributesTest.test_blockingioerror -*graalpython.lib-python.3.test.test_exception_hierarchy.AttributesTest.test_errno_translation -*graalpython.lib-python.3.test.test_exception_hierarchy.AttributesTest.test_posix_error -*graalpython.lib-python.3.test.test_exception_hierarchy.AttributesTest.test_windows_error -*graalpython.lib-python.3.test.test_exception_hierarchy.ExplicitSubclassingTest.test_errno_mapping -*graalpython.lib-python.3.test.test_exception_hierarchy.ExplicitSubclassingTest.test_init_kwdargs -*graalpython.lib-python.3.test.test_exception_hierarchy.ExplicitSubclassingTest.test_init_new_overridden -*graalpython.lib-python.3.test.test_exception_hierarchy.ExplicitSubclassingTest.test_init_overridden -*graalpython.lib-python.3.test.test_exception_hierarchy.ExplicitSubclassingTest.test_init_standalone -*graalpython.lib-python.3.test.test_exception_hierarchy.ExplicitSubclassingTest.test_new_kwdargs -*graalpython.lib-python.3.test.test_exception_hierarchy.ExplicitSubclassingTest.test_new_overridden -*graalpython.lib-python.3.test.test_exception_hierarchy.HierarchyTest.test_builtin_errors -*graalpython.lib-python.3.test.test_exception_hierarchy.HierarchyTest.test_errno_mapping -*graalpython.lib-python.3.test.test_exception_hierarchy.HierarchyTest.test_select_error -*graalpython.lib-python.3.test.test_exception_hierarchy.HierarchyTest.test_socket_errors -*graalpython.lib-python.3.test.test_exception_hierarchy.HierarchyTest.test_try_except +test.test_exception_hierarchy.AttributesTest.test_blockingioerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_hierarchy.AttributesTest.test_posix_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_exception_hierarchy.AttributesTest.test_windows_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_hierarchy.ExplicitSubclassingTest.test_errno_mapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_hierarchy.ExplicitSubclassingTest.test_init_kwdargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_hierarchy.ExplicitSubclassingTest.test_init_new_overridden @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_hierarchy.ExplicitSubclassingTest.test_init_overridden @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_hierarchy.ExplicitSubclassingTest.test_init_standalone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_hierarchy.ExplicitSubclassingTest.test_new_kwdargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_hierarchy.ExplicitSubclassingTest.test_new_overridden @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_hierarchy.HierarchyTest.test_builtin_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_hierarchy.HierarchyTest.test_errno_mapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_hierarchy.HierarchyTest.test_select_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_hierarchy.HierarchyTest.test_socket_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_hierarchy.HierarchyTest.test_try_except @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_exception_variations.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_exception_variations.txt index 2942bc7589..7696ddd74f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_exception_variations.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_exception_variations.txt @@ -1,27 +1,16 @@ -*graalpython.lib-python.3.test.test_exception_variations.ExceptStarTestCases.test_try_finally_no_exception -*graalpython.lib-python.3.test.test_exception_variations.ExceptTestCases.test_nested -*graalpython.lib-python.3.test.test_exception_variations.ExceptTestCases.test_nested_else -*graalpython.lib-python.3.test.test_exception_variations.ExceptTestCases.test_nested_exception_in_else -*graalpython.lib-python.3.test.test_exception_variations.ExceptTestCases.test_nested_exception_in_except -*graalpython.lib-python.3.test.test_exception_variations.ExceptTestCases.test_nested_exception_in_finally_no_exception -*graalpython.lib-python.3.test.test_exception_variations.ExceptTestCases.test_nested_exception_in_finally_with_exception -*graalpython.lib-python.3.test.test_exception_variations.ExceptTestCases.test_try_except -*graalpython.lib-python.3.test.test_exception_variations.ExceptTestCases.test_try_except_else -*graalpython.lib-python.3.test.test_exception_variations.ExceptTestCases.test_try_except_else_finally -*graalpython.lib-python.3.test.test_exception_variations.ExceptTestCases.test_try_except_else_finally_no_exception -*graalpython.lib-python.3.test.test_exception_variations.ExceptTestCases.test_try_except_else_no_exception -*graalpython.lib-python.3.test.test_exception_variations.ExceptTestCases.test_try_except_finally -*graalpython.lib-python.3.test.test_exception_variations.ExceptTestCases.test_try_except_finally_no_exception -*graalpython.lib-python.3.test.test_exception_variations.ExceptTestCases.test_try_except_no_exception -*graalpython.lib-python.3.test.test_exception_variations.ExceptTestCases.test_try_finally_no_exception -*graalpython.lib-python.3.test.test_exception_variations.ExceptionTestCase.test_nested -*graalpython.lib-python.3.test.test_exception_variations.ExceptionTestCase.test_nested_else -*graalpython.lib-python.3.test.test_exception_variations.ExceptionTestCase.test_try_except -*graalpython.lib-python.3.test.test_exception_variations.ExceptionTestCase.test_try_except_else -*graalpython.lib-python.3.test.test_exception_variations.ExceptionTestCase.test_try_except_else_finally -*graalpython.lib-python.3.test.test_exception_variations.ExceptionTestCase.test_try_except_else_finally_no_exception -*graalpython.lib-python.3.test.test_exception_variations.ExceptionTestCase.test_try_except_else_no_exception -*graalpython.lib-python.3.test.test_exception_variations.ExceptionTestCase.test_try_except_finally -*graalpython.lib-python.3.test.test_exception_variations.ExceptionTestCase.test_try_except_finally_no_exception -*graalpython.lib-python.3.test.test_exception_variations.ExceptionTestCase.test_try_except_no_exception -*graalpython.lib-python.3.test.test_exception_variations.ExceptionTestCase.test_try_finally_no_exception +test.test_exception_variations.ExceptStarTestCases.test_try_finally_no_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_variations.ExceptTestCases.test_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_variations.ExceptTestCases.test_nested_else @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_variations.ExceptTestCases.test_nested_exception_in_else @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_variations.ExceptTestCases.test_nested_exception_in_except @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_variations.ExceptTestCases.test_nested_exception_in_finally_no_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_variations.ExceptTestCases.test_nested_exception_in_finally_with_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_variations.ExceptTestCases.test_try_except @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_variations.ExceptTestCases.test_try_except_else @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_variations.ExceptTestCases.test_try_except_else_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_variations.ExceptTestCases.test_try_except_else_finally_no_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_variations.ExceptTestCases.test_try_except_else_no_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_variations.ExceptTestCases.test_try_except_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_variations.ExceptTestCases.test_try_except_finally_no_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_variations.ExceptTestCases.test_try_except_no_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exception_variations.ExceptTestCases.test_try_finally_no_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_exceptions.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_exceptions.txt index 7245fe698a..434a95a1f8 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_exceptions.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_exceptions.txt @@ -1,80 +1,66 @@ -*graalpython.lib-python.3.test.test_exceptions.AttributeErrorTests.test_attribute_error_with_failing_dict -*graalpython.lib-python.3.test.test_exceptions.AttributeErrorTests.test_getattr_error_bad_suggestions_do_not_trigger_for_small_names -*graalpython.lib-python.3.test.test_exceptions.AttributeErrorTests.test_getattr_suggestions_do_not_trigger_for_big_dicts -*graalpython.lib-python.3.test.test_exceptions.AttributeErrorTests.test_getattr_suggestions_do_not_trigger_for_long_attributes -*graalpython.lib-python.3.test.test_exceptions.AttributeErrorTests.test_getattr_suggestions_for_same_name -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testAttributes -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testChainingAttrs -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testChainingDescriptors -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testExceptionCleanupState -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testInvalidAttrs -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testInvalidTraceback -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testKeywordArgs -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testMemoryErrorBigSource -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testNoneClearsTracebackAttr -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testRaising -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testSettingException -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testSyntaxErrorMessage -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testSyntaxErrorMissingParens -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.testWithTraceback -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_3114 -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_MemoryError -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_WindowsError -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_assert_shadowing -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_badisinstance -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_context_of_exception_in_else_and_finally -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_context_of_exception_in_except_and_finally -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_context_of_exception_in_try_and_finally -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_errno_ENOTDIR -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_error_offset_continuation_characters -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_exception_cleanup_names -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_exception_cleanup_names2 -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_exception_target_in_nested_scope -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_exception_with_doc -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_close_cleanup_exc_state -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_del_cleanup_exc_state -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_doesnt_retain_old_exc -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_doesnt_retain_old_exc2 -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_finalizing_and_exc_info -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_leaking -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_leaking2 -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_leaking3 -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_leaking4 -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_next_cleanup_exc_state -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_send_cleanup_exc_state -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_generator_throw_cleanup_exc_state -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_memory_error_cleanup -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_memory_error_in_PyErr_PrintEx -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_memory_error_subclasses -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_no_hang_on_context_chain_cycle2 -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_notes -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_raise_does_not_create_context_chain_cycle -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_raise_in_generator -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_recursion_error_cleanup -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_recursion_normalizing_exception -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_recursion_normalizing_infinite_exception -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_recursion_normalizing_with_no_memory -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_str -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_trashcan_recursion -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_unhandled -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_unicode_change_attributes -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_unicode_errors_no_object -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_unraisable -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_windows_message -*graalpython.lib-python.3.test.test_exceptions.ExceptionTests.test_yield_in_nested_try_excepts -*graalpython.lib-python.3.test.test_exceptions.ImportErrorTests.test_attributes -*graalpython.lib-python.3.test.test_exceptions.ImportErrorTests.test_copy_pickle -*graalpython.lib-python.3.test.test_exceptions.ImportErrorTests.test_non_str_argument -*graalpython.lib-python.3.test.test_exceptions.ImportErrorTests.test_reset_attributes -*graalpython.lib-python.3.test.test_exceptions.NameErrorTests.test_issue45826 -*graalpython.lib-python.3.test.test_exceptions.NameErrorTests.test_issue45826_focused -*graalpython.lib-python.3.test.test_exceptions.NameErrorTests.test_name_error_bad_suggestions_do_not_trigger_for_small_names -*graalpython.lib-python.3.test.test_exceptions.NameErrorTests.test_name_error_suggestions_do_not_trigger_for_long_names -*graalpython.lib-python.3.test.test_exceptions.NameErrorTests.test_name_error_suggestions_do_not_trigger_for_too_many_locals -*graalpython.lib-python.3.test.test_exceptions.NameErrorTests.test_name_error_with_custom_exceptions -*graalpython.lib-python.3.test.test_exceptions.NameErrorTests.test_unbound_local_error_doesn_not_match -*graalpython.lib-python.3.test.test_exceptions.PEP626Tests.test_lineno_after_raise_in_with_exit -*graalpython.lib-python.3.test.test_exceptions.PEP626Tests.test_lineno_after_raise_simple -*graalpython.lib-python.3.test.test_exceptions.PEP626Tests.test_lineno_in_finally_normal -*graalpython.lib-python.3.test.test_exceptions.PEP626Tests.test_lineno_in_try -*graalpython.lib-python.3.test.test_exceptions.SyntaxErrorTests.test_attributes_old_constructor +test.test_exceptions.AttributeErrorTests.test_attribute_error_with_bad_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.AttributeErrorTests.test_attribute_error_with_failing_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.AttributeErrorTests.test_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.AttributeErrorTests.test_getattr_error_bad_suggestions_do_not_trigger_for_small_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.AttributeErrorTests.test_getattr_has_name_and_obj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.AttributeErrorTests.test_getattr_has_name_and_obj_for_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.AttributeErrorTests.test_getattr_suggestions_do_not_trigger_for_big_dicts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.AttributeErrorTests.test_getattr_suggestions_do_not_trigger_for_long_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.AttributeErrorTests.test_getattr_suggestions_for_same_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.testAttributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.testChainingAttrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.testChainingDescriptors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Disabled due to transient stack overflow that fails to get caught and crashes the VM +!test.test_exceptions.ExceptionTests.testInfiniteRecursion @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_exceptions.ExceptionTests.testInvalidAttrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.testInvalidTraceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.testKeywordArgs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.testNoneClearsTracebackAttr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.testRaising @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.testSyntaxErrorMessage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.testSyntaxErrorMissingParens @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.testWithTraceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_WindowsError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_assert_shadowing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Disabled due to transient stack overflow that fails to get caught and crashes the VM +!test.test_exceptions.ExceptionTests.test_badisinstance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_exceptions.ExceptionTests.test_context_of_exception_in_else_and_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_context_of_exception_in_except_and_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_context_of_exception_in_try_and_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_errno_ENOTDIR @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_error_offset_continuation_characters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_exception_cleanup_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_exception_cleanup_names2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_exception_target_in_nested_scope @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_generator_doesnt_retain_old_exc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_generator_doesnt_retain_old_exc2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_generator_finalizing_and_exc_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_generator_leaking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_generator_leaking2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_generator_leaking3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_generator_leaking4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_memory_error_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_notes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_raise_does_not_create_context_chain_cycle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_raise_in_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_unhandled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_unicode_change_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_unicode_errors_no_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ExceptionTests.test_yield_in_nested_try_excepts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ImportErrorTests.test_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ImportErrorTests.test_copy_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ImportErrorTests.test_non_str_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.ImportErrorTests.test_reset_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.NameErrorTests.test_issue45826 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.NameErrorTests.test_issue45826_focused @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.NameErrorTests.test_name_error_bad_suggestions_do_not_trigger_for_small_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.NameErrorTests.test_name_error_suggestions_do_not_trigger_for_long_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.NameErrorTests.test_name_error_suggestions_do_not_trigger_for_too_many_locals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.NameErrorTests.test_name_error_with_custom_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.NameErrorTests.test_unbound_local_error_doesn_not_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.PEP626Tests.test_lineno_after_raise_in_with_exit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.PEP626Tests.test_lineno_after_raise_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.PEP626Tests.test_lineno_in_finally_normal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.PEP626Tests.test_lineno_in_try @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_exceptions.SyntaxErrorTests.test_attributes_old_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_faulthandler.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_faulthandler.txt index e97bec8da5..2ef1dfb13c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_faulthandler.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_faulthandler.txt @@ -1,15 +1,7 @@ -*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_cancel_later_without_dump_traceback_later -*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_disable -*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_disable_windows_exc_handler -*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_ignore_exception -*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_is_enabled -*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_raise_exception -*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_raise_nonfatal_exception -*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_register -*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_register_chain -*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_register_fd -*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_register_file -*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_register_threads -*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_stack_overflow -*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_sys_xoptions -*graalpython.lib-python.3.test.test_faulthandler.FaultHandlerTests.test_unregister +test.test_faulthandler.FaultHandlerTests.test_cancel_later_without_dump_traceback_later @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_faulthandler.FaultHandlerTests.test_disable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_faulthandler.FaultHandlerTests.test_is_enabled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Disabled since signaling isn't stable during parallel tests +!test.test_faulthandler.FaultHandlerTests.test_sigbus +!test.test_faulthandler.FaultHandlerTests.test_sigill +test.test_faulthandler.FaultHandlerTests.test_sys_xoptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fcntl.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fcntl.txt index 5827717fef..4c1c254f50 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fcntl.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fcntl.txt @@ -1,7 +1,3 @@ -*graalpython.lib-python.3.test.test_fcntl.TestFcntl.test_fcntl_64_bit -*graalpython.lib-python.3.test.test_fcntl.TestFcntl.test_fcntl_bad_file_overflow -*graalpython.lib-python.3.test.test_fcntl.TestFcntl.test_fcntl_f_pipesize -*graalpython.lib-python.3.test.test_fcntl.TestFcntl.test_flock -*graalpython.lib-python.3.test.test_fcntl.TestFcntl.test_flock_overflow -*graalpython.lib-python.3.test.test_fcntl.TestFcntl.test_lockf_exclusive -*graalpython.lib-python.3.test.test_fcntl.TestFcntl.test_lockf_share +test.test_fcntl.TestFcntl.test_flock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fcntl.TestFcntl.test_lockf_exclusive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fcntl.TestFcntl.test_lockf_share @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_file.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_file.txt index 1b14cbb04e..c05d43f0fd 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_file.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_file.txt @@ -1,34 +1,30 @@ -*graalpython.lib-python.3.test.test_file.CAutoFileTests.testAttributes -*graalpython.lib-python.3.test.test_file.CAutoFileTests.testErrors -*graalpython.lib-python.3.test.test_file.CAutoFileTests.testMethods -*graalpython.lib-python.3.test.test_file.CAutoFileTests.testReadWhenWriting -*graalpython.lib-python.3.test.test_file.CAutoFileTests.testReadinto -*graalpython.lib-python.3.test.test_file.CAutoFileTests.testReadinto_text -*graalpython.lib-python.3.test.test_file.CAutoFileTests.testWeakRefs -*graalpython.lib-python.3.test.test_file.CAutoFileTests.testWritelinesIntegers -*graalpython.lib-python.3.test.test_file.CAutoFileTests.testWritelinesIntegersUserList -*graalpython.lib-python.3.test.test_file.CAutoFileTests.testWritelinesNonString -*graalpython.lib-python.3.test.test_file.CAutoFileTests.testWritelinesUserList -*graalpython.lib-python.3.test.test_file.COtherFileTests.testBadModeArgument -*graalpython.lib-python.3.test.test_file.COtherFileTests.testIteration -*graalpython.lib-python.3.test.test_file.COtherFileTests.testModeStrings -*graalpython.lib-python.3.test.test_file.COtherFileTests.testSetBufferSize -*graalpython.lib-python.3.test.test_file.COtherFileTests.testStdin -*graalpython.lib-python.3.test.test_file.COtherFileTests.testTruncateOnWindows -*graalpython.lib-python.3.test.test_file.PyAutoFileTests.testAttributes -*graalpython.lib-python.3.test.test_file.PyAutoFileTests.testErrors -*graalpython.lib-python.3.test.test_file.PyAutoFileTests.testMethods -*graalpython.lib-python.3.test.test_file.PyAutoFileTests.testReadWhenWriting -*graalpython.lib-python.3.test.test_file.PyAutoFileTests.testReadinto -*graalpython.lib-python.3.test.test_file.PyAutoFileTests.testReadinto_text -*graalpython.lib-python.3.test.test_file.PyAutoFileTests.testWeakRefs -*graalpython.lib-python.3.test.test_file.PyAutoFileTests.testWritelinesIntegers -*graalpython.lib-python.3.test.test_file.PyAutoFileTests.testWritelinesIntegersUserList -*graalpython.lib-python.3.test.test_file.PyAutoFileTests.testWritelinesNonString -*graalpython.lib-python.3.test.test_file.PyAutoFileTests.testWritelinesUserList -*graalpython.lib-python.3.test.test_file.PyOtherFileTests.testBadModeArgument -*graalpython.lib-python.3.test.test_file.PyOtherFileTests.testIteration -*graalpython.lib-python.3.test.test_file.PyOtherFileTests.testModeStrings -*graalpython.lib-python.3.test.test_file.PyOtherFileTests.testSetBufferSize -*graalpython.lib-python.3.test.test_file.PyOtherFileTests.testStdin -*graalpython.lib-python.3.test.test_file.PyOtherFileTests.testTruncateOnWindows +test.test_file.CAutoFileTests.testAttributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.CAutoFileTests.testErrors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.CAutoFileTests.testMethods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.CAutoFileTests.testReadWhenWriting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.CAutoFileTests.testReadinto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.CAutoFileTests.testReadinto_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.CAutoFileTests.testWritelinesIntegers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.CAutoFileTests.testWritelinesIntegersUserList @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.CAutoFileTests.testWritelinesNonString @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.CAutoFileTests.testWritelinesUserList @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.COtherFileTests.testBadModeArgument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.COtherFileTests.testIteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.COtherFileTests.testModeStrings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.COtherFileTests.testSetBufferSize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.COtherFileTests.testTruncateOnWindows @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.PyAutoFileTests.testAttributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.PyAutoFileTests.testErrors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.PyAutoFileTests.testMethods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.PyAutoFileTests.testReadWhenWriting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.PyAutoFileTests.testReadinto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.PyAutoFileTests.testReadinto_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.PyAutoFileTests.testWritelinesIntegers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.PyAutoFileTests.testWritelinesIntegersUserList @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.PyAutoFileTests.testWritelinesNonString @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.PyAutoFileTests.testWritelinesUserList @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.PyOtherFileTests.testBadModeArgument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.PyOtherFileTests.testIteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.PyOtherFileTests.testModeStrings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.PyOtherFileTests.testSetBufferSize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_file.PyOtherFileTests.testTruncateOnWindows @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_filecmp.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_filecmp.txt index dca43643d3..8433d2ac8c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_filecmp.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_filecmp.txt @@ -1,10 +1,9 @@ -*graalpython.lib-python.3.test.test_filecmp.DirCompareTestCase.test_cmpfiles -*graalpython.lib-python.3.test.test_filecmp.DirCompareTestCase.test_default_ignores -*graalpython.lib-python.3.test.test_filecmp.DirCompareTestCase.test_dircmp -*graalpython.lib-python.3.test.test_filecmp.DirCompareTestCase.test_dircmp_subdirs_type -*graalpython.lib-python.3.test.test_filecmp.DirCompareTestCase.test_report_full_closure -*graalpython.lib-python.3.test.test_filecmp.DirCompareTestCase.test_report_partial_closure -*graalpython.lib-python.3.test.test_filecmp.FileCompareTestCase.test_cache_clear -*graalpython.lib-python.3.test.test_filecmp.FileCompareTestCase.test_different -*graalpython.lib-python.3.test.test_filecmp.FileCompareTestCase.test_matching -*graalpython.lib-python.3.test.test_filecmp.TestMain.test_main +test.test_filecmp.DirCompareTestCase.test_cmpfiles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_filecmp.DirCompareTestCase.test_default_ignores @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_filecmp.DirCompareTestCase.test_dircmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_filecmp.DirCompareTestCase.test_dircmp_subdirs_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_filecmp.DirCompareTestCase.test_report_full_closure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_filecmp.DirCompareTestCase.test_report_partial_closure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_filecmp.FileCompareTestCase.test_cache_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_filecmp.FileCompareTestCase.test_different @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_filecmp.FileCompareTestCase.test_matching @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fileinput.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fileinput.txt index f6c9e6e2d1..d293a3e11a 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fileinput.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fileinput.txt @@ -1,62 +1,57 @@ -*graalpython.lib-python.3.test.test_fileinput.BufferSizesTests.test_buffer_sizes -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test__getitem__ -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test__getitem___deprecation -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test__getitem__eof -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test__getitem__invalid_key -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_close_on_exception -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_context_manager -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_detached_stdin_binary_mode -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_empty_files_list_specified_to_constructor -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_file_hook_backward_compatibility -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_file_opening_hook -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_fileno -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_fileno_when_ValueError_raised -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_files_that_dont_end_with_newline -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_inplace_binary_write_mode -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_inplace_encoding_errors -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_invalid_opening_mode -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_iteration_buffering -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_nextfile_oserror_deleting_backup -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_opening_mode -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_pathlib_file -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_pathlib_file_inplace -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_readline -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_readline_binary_mode -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_readline_buffering -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_readline_os_chmod_raises_OSError -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_readline_os_fstat_raises_OSError -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_stdin_binary_mode -*graalpython.lib-python.3.test.test_fileinput.FileInputTests.test_zero_byte_files -*graalpython.lib-python.3.test.test_fileinput.MiscTest.test_all -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_close.test_state_is_None -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_close.test_state_is_not_None -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_filelineno.test_state_is_None -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_filelineno.test_state_is_not_None -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_filename.test_state_is_None -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_filename.test_state_is_not_None -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_fileno.test_state_is_None -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_fileno.test_state_is_not_None -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_input.test_state_is_None -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_input.test_state_is_not_None_and_state_file_is_None -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_input.test_state_is_not_None_and_state_file_is_not_None -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_isfirstline.test_state_is_None -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_isfirstline.test_state_is_not_None -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_isstdin.test_state_is_None -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_isstdin.test_state_is_not_None -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_lineno.test_state_is_None -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_lineno.test_state_is_not_None -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_nextfile.test_state_is_None -*graalpython.lib-python.3.test.test_fileinput.Test_fileinput_nextfile.test_state_is_not_None -*graalpython.lib-python.3.test.test_fileinput.Test_hook_compressed.test_binary_mode_encoding -*graalpython.lib-python.3.test.test_fileinput.Test_hook_compressed.test_blah_ext -*graalpython.lib-python.3.test.test_fileinput.Test_hook_compressed.test_bz2_ext_builtin -*graalpython.lib-python.3.test.test_fileinput.Test_hook_compressed.test_bz2_ext_fake -*graalpython.lib-python.3.test.test_fileinput.Test_hook_compressed.test_empty_string -*graalpython.lib-python.3.test.test_fileinput.Test_hook_compressed.test_gz_ext_builtin -*graalpython.lib-python.3.test.test_fileinput.Test_hook_compressed.test_gz_ext_fake -*graalpython.lib-python.3.test.test_fileinput.Test_hook_compressed.test_gz_with_encoding_fake -*graalpython.lib-python.3.test.test_fileinput.Test_hook_compressed.test_no_ext -*graalpython.lib-python.3.test.test_fileinput.Test_hook_compressed.test_text_mode_encoding -*graalpython.lib-python.3.test.test_fileinput.Test_hook_encoded.test -*graalpython.lib-python.3.test.test_fileinput.Test_hook_encoded.test_errors -*graalpython.lib-python.3.test.test_fileinput.Test_hook_encoded.test_modes +test.test_fileinput.BufferSizesTests.test_buffer_sizes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_close_on_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_detached_stdin_binary_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_empty_files_list_specified_to_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_file_hook_backward_compatibility @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_file_opening_hook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_fileno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_fileno_when_ValueError_raised @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_files_that_dont_end_with_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_inplace_binary_write_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_inplace_encoding_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_invalid_opening_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_iteration_buffering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_nextfile_oserror_deleting_backup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_pathlib_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_pathlib_file_inplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_readline_binary_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_readline_buffering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_readline_os_chmod_raises_OSError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_readline_os_fstat_raises_OSError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_stdin_binary_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.FileInputTests.test_zero_byte_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.MiscTest.test_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_close.test_state_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_close.test_state_is_not_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_filelineno.test_state_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_filelineno.test_state_is_not_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_filename.test_state_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_filename.test_state_is_not_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_fileno.test_state_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_fileno.test_state_is_not_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_input.test_state_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_input.test_state_is_not_None_and_state_file_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_input.test_state_is_not_None_and_state_file_is_not_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_isfirstline.test_state_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_isfirstline.test_state_is_not_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_isstdin.test_state_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_isstdin.test_state_is_not_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_lineno.test_state_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_lineno.test_state_is_not_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_nextfile.test_state_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_fileinput_nextfile.test_state_is_not_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_hook_compressed.test_binary_mode_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_hook_compressed.test_blah_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_hook_compressed.test_bz2_ext_builtin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_hook_compressed.test_bz2_ext_fake @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_hook_compressed.test_empty_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_hook_compressed.test_gz_ext_builtin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_hook_compressed.test_gz_ext_fake @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_hook_compressed.test_gz_with_encoding_fake @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_hook_compressed.test_no_ext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_hook_compressed.test_text_mode_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_hook_encoded.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_hook_encoded.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fileinput.Test_hook_encoded.test_modes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fileio.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fileio.txt index 9bdf3f96d7..9058ed2497 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fileio.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fileio.txt @@ -1,94 +1,88 @@ -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testAttributes -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testBlksize -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testErrnoOnClose -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testErrnoOnClosedFileno -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testErrnoOnClosedIsatty -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testErrnoOnClosedRead -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testErrnoOnClosedReadable -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testErrnoOnClosedReadall -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testErrnoOnClosedReadinto -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testErrnoOnClosedSeek -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testErrnoOnClosedSeekable -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testErrnoOnClosedTell -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testErrnoOnClosedTruncate -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testErrnoOnClosedWritable -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testErrnoOnClosedWrite -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testErrors -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testMethods -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testOpenDirFD -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testOpendir -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testReadintoByteArray -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testRecursiveRepr -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testRepr -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testReprNoCloseFD -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testSeekTell -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testWeakRefs -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testWritelinesError -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testWritelinesList -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.testWritelinesUserList -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.test_none_args -*graalpython.lib-python.3.test.test_fileio.CAutoFileTests.test_reject -*graalpython.lib-python.3.test.test_fileio.COtherFileTests.testAbles -*graalpython.lib-python.3.test.test_fileio.COtherFileTests.testAppend -*graalpython.lib-python.3.test.test_fileio.COtherFileTests.testBadModeArgument -*graalpython.lib-python.3.test.test_fileio.COtherFileTests.testBytesOpen -*graalpython.lib-python.3.test.test_fileio.COtherFileTests.testConstructorHandlesNULChars -*graalpython.lib-python.3.test.test_fileio.COtherFileTests.testInvalidFd -*graalpython.lib-python.3.test.test_fileio.COtherFileTests.testInvalidFd_overflow -*graalpython.lib-python.3.test.test_fileio.COtherFileTests.testInvalidInit -*graalpython.lib-python.3.test.test_fileio.COtherFileTests.testInvalidModeStrings -*graalpython.lib-python.3.test.test_fileio.COtherFileTests.testModeStrings -*graalpython.lib-python.3.test.test_fileio.COtherFileTests.testTruncate -*graalpython.lib-python.3.test.test_fileio.COtherFileTests.testTruncateOnWindows -*graalpython.lib-python.3.test.test_fileio.COtherFileTests.testUnclosedFDOnException -*graalpython.lib-python.3.test.test_fileio.COtherFileTests.testUnicodeOpen -*graalpython.lib-python.3.test.test_fileio.COtherFileTests.testUtf8BytesOpen -*graalpython.lib-python.3.test.test_fileio.COtherFileTests.testWarnings -*graalpython.lib-python.3.test.test_fileio.COtherFileTests.test_open_code -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testAttributes -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testBlksize -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testErrnoOnClose -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testErrnoOnClosedFileno -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testErrnoOnClosedIsatty -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testErrnoOnClosedRead -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testErrnoOnClosedReadable -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testErrnoOnClosedReadall -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testErrnoOnClosedReadinto -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testErrnoOnClosedSeek -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testErrnoOnClosedSeekable -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testErrnoOnClosedTell -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testErrnoOnClosedTruncate -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testErrnoOnClosedWritable -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testErrnoOnClosedWrite -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testErrors -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testMethods -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testOpenDirFD -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testOpendir -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testReadintoByteArray -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testRecursiveRepr -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testRepr -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testReprNoCloseFD -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testSeekTell -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testWeakRefs -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testWritelinesError -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testWritelinesList -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.testWritelinesUserList -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.test_none_args -*graalpython.lib-python.3.test.test_fileio.PyAutoFileTests.test_reject -*graalpython.lib-python.3.test.test_fileio.PyOtherFileTests.testAbles -*graalpython.lib-python.3.test.test_fileio.PyOtherFileTests.testAppend -*graalpython.lib-python.3.test.test_fileio.PyOtherFileTests.testBadModeArgument -*graalpython.lib-python.3.test.test_fileio.PyOtherFileTests.testBytesOpen -*graalpython.lib-python.3.test.test_fileio.PyOtherFileTests.testConstructorHandlesNULChars -*graalpython.lib-python.3.test.test_fileio.PyOtherFileTests.testInvalidFd -*graalpython.lib-python.3.test.test_fileio.PyOtherFileTests.testInvalidInit -*graalpython.lib-python.3.test.test_fileio.PyOtherFileTests.testInvalidModeStrings -*graalpython.lib-python.3.test.test_fileio.PyOtherFileTests.testModeStrings -*graalpython.lib-python.3.test.test_fileio.PyOtherFileTests.testTruncate -*graalpython.lib-python.3.test.test_fileio.PyOtherFileTests.testTruncateOnWindows -*graalpython.lib-python.3.test.test_fileio.PyOtherFileTests.testUnclosedFDOnException -*graalpython.lib-python.3.test.test_fileio.PyOtherFileTests.testUnicodeOpen -*graalpython.lib-python.3.test.test_fileio.PyOtherFileTests.testUtf8BytesOpen -*graalpython.lib-python.3.test.test_fileio.PyOtherFileTests.testWarnings -*graalpython.lib-python.3.test.test_fileio.PyOtherFileTests.test_open_code -*graalpython.lib-python.3.test.test_fileio.TestMain.test_main +test.test_fileio.CAutoFileTests.testAttributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testBlksize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedFileno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedIsatty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedReadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedReadall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedReadinto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedSeek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedSeekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedTell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedTruncate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedWritable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedWrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testErrors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testMethods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testOpenDirFD @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testOpendir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testReadintoByteArray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testRepr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testReprNoCloseFD @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testSeekTell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testWritelinesError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testWritelinesList @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.testWritelinesUserList @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.test_none_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.CAutoFileTests.test_reject @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.COtherFileTests.testAbles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.COtherFileTests.testAppend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.COtherFileTests.testBadModeArgument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.COtherFileTests.testBytesOpen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.COtherFileTests.testConstructorHandlesNULChars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.COtherFileTests.testInvalidFd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.COtherFileTests.testInvalidInit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.COtherFileTests.testInvalidModeStrings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.COtherFileTests.testModeStrings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.COtherFileTests.testTruncate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.COtherFileTests.testTruncateOnWindows @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.COtherFileTests.testUnclosedFDOnException @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.COtherFileTests.testUnicodeOpen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.COtherFileTests.testUtf8BytesOpen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.COtherFileTests.testWarnings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.COtherFileTests.test_open_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testAttributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testBlksize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedFileno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedIsatty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedReadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedReadall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedReadinto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedSeek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedSeekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedTell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedTruncate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedWritable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedWrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testMethods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testOpenDirFD @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testOpendir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testReadintoByteArray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testRepr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testReprNoCloseFD @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testSeekTell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testWritelinesError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testWritelinesList @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.testWritelinesUserList @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.test_none_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyAutoFileTests.test_reject @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyOtherFileTests.testAbles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyOtherFileTests.testAppend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyOtherFileTests.testBadModeArgument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyOtherFileTests.testBytesOpen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyOtherFileTests.testConstructorHandlesNULChars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyOtherFileTests.testInvalidFd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyOtherFileTests.testInvalidInit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyOtherFileTests.testInvalidModeStrings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyOtherFileTests.testModeStrings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyOtherFileTests.testTruncate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyOtherFileTests.testTruncateOnWindows @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyOtherFileTests.testUnclosedFDOnException @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyOtherFileTests.testUnicodeOpen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyOtherFileTests.testUtf8BytesOpen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyOtherFileTests.testWarnings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_fileio.PyOtherFileTests.test_open_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_finalization.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_finalization.txt deleted file mode 100644 index 9bdf46dd54..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_finalization.txt +++ /dev/null @@ -1,5 +0,0 @@ -*graalpython.lib-python.3.test.test_finalization.LegacyFinalizationTest.test_legacy -*graalpython.lib-python.3.test.test_finalization.LegacyFinalizationTest.test_legacy_resurrect -*graalpython.lib-python.3.test.test_finalization.LegacyFinalizationTest.test_legacy_self_cycle -*graalpython.lib-python.3.test.test_finalization.SimpleFinalizationTest.test_non_gc -*graalpython.lib-python.3.test.test_finalization.SimpleFinalizationTest.test_non_gc_resurrect diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_float.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_float.txt index e10b454379..ecc0a5e5ba 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_float.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_float.txt @@ -1,54 +1,51 @@ -*graalpython.lib-python.3.test.test_float.FormatFunctionsTestCase.test_getformat -*graalpython.lib-python.3.test.test_float.FormatFunctionsTestCase.test_setformat -*graalpython.lib-python.3.test.test_float.FormatTestCase.test_format -*graalpython.lib-python.3.test.test_float.FormatTestCase.test_format_testfile -*graalpython.lib-python.3.test.test_float.FormatTestCase.test_issue35560 -*graalpython.lib-python.3.test.test_float.FormatTestCase.test_issue5864 -*graalpython.lib-python.3.test.test_float.GeneralFloatCases.test_error_message -*graalpython.lib-python.3.test.test_float.GeneralFloatCases.test_float -*graalpython.lib-python.3.test.test_float.GeneralFloatCases.test_float_ceil -*graalpython.lib-python.3.test.test_float.GeneralFloatCases.test_float_containment -*graalpython.lib-python.3.test.test_float.GeneralFloatCases.test_float_floor -*graalpython.lib-python.3.test.test_float.GeneralFloatCases.test_float_memoryview -*graalpython.lib-python.3.test.test_float.GeneralFloatCases.test_float_mod -*graalpython.lib-python.3.test.test_float.GeneralFloatCases.test_float_pow -*graalpython.lib-python.3.test.test_float.GeneralFloatCases.test_float_with_comma -*graalpython.lib-python.3.test.test_float.GeneralFloatCases.test_floatasratio -*graalpython.lib-python.3.test.test_float.GeneralFloatCases.test_floatconversion -*graalpython.lib-python.3.test.test_float.GeneralFloatCases.test_hash -*graalpython.lib-python.3.test.test_float.GeneralFloatCases.test_is_integer -*graalpython.lib-python.3.test.test_float.GeneralFloatCases.test_keyword_args -*graalpython.lib-python.3.test.test_float.GeneralFloatCases.test_noargs -*graalpython.lib-python.3.test.test_float.GeneralFloatCases.test_non_numeric_input_types -*graalpython.lib-python.3.test.test_float.GeneralFloatCases.test_underscores -*graalpython.lib-python.3.test.test_float.HexFloatTestCase.test_ends -*graalpython.lib-python.3.test.test_float.HexFloatTestCase.test_from_hex -*graalpython.lib-python.3.test.test_float.HexFloatTestCase.test_invalid_inputs -*graalpython.lib-python.3.test.test_float.HexFloatTestCase.test_roundtrip -*graalpython.lib-python.3.test.test_float.HexFloatTestCase.test_subclass -*graalpython.lib-python.3.test.test_float.HexFloatTestCase.test_whitespace -*graalpython.lib-python.3.test.test_float.IEEEFormatTestCase.test_double_specials_do_unpack -*graalpython.lib-python.3.test.test_float.IEEEFormatTestCase.test_float_specials_do_unpack -*graalpython.lib-python.3.test.test_float.IEEEFormatTestCase.test_serialized_float_rounding -*graalpython.lib-python.3.test.test_float.InfNanTest.test_inf_as_str -*graalpython.lib-python.3.test.test_float.InfNanTest.test_inf_from_str -*graalpython.lib-python.3.test.test_float.InfNanTest.test_inf_signs -*graalpython.lib-python.3.test.test_float.InfNanTest.test_nan_as_str -*graalpython.lib-python.3.test.test_float.InfNanTest.test_nan_from_str -*graalpython.lib-python.3.test.test_float.InfNanTest.test_nan_signs -*graalpython.lib-python.3.test.test_float.PackTests.test_pack -*graalpython.lib-python.3.test.test_float.PackTests.test_roundtrip -*graalpython.lib-python.3.test.test_float.PackTests.test_unpack -*graalpython.lib-python.3.test.test_float.ReprTestCase.test_repr -*graalpython.lib-python.3.test.test_float.ReprTestCase.test_short_repr -*graalpython.lib-python.3.test.test_float.RoundTestCase.test_None_ndigits -*graalpython.lib-python.3.test.test_float.RoundTestCase.test_format_specials -*graalpython.lib-python.3.test.test_float.RoundTestCase.test_inf_nan -*graalpython.lib-python.3.test.test_float.RoundTestCase.test_inf_nan_ndigits -*graalpython.lib-python.3.test.test_float.RoundTestCase.test_large_n -*graalpython.lib-python.3.test.test_float.RoundTestCase.test_matches_float_format -*graalpython.lib-python.3.test.test_float.RoundTestCase.test_overflow -*graalpython.lib-python.3.test.test_float.RoundTestCase.test_previous_round_bugs -*graalpython.lib-python.3.test.test_float.RoundTestCase.test_small_n -*graalpython.lib-python.3.test.test_float.UnknownFormatTestCase.test_double_specials_dont_unpack -*graalpython.lib-python.3.test.test_float.UnknownFormatTestCase.test_float_specials_dont_unpack +test.test_float.FormatFunctionsTestCase.test_getformat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.FormatTestCase.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.FormatTestCase.test_format_testfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.FormatTestCase.test_issue35560 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.FormatTestCase.test_issue5864 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.GeneralFloatCases.test_error_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.GeneralFloatCases.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.GeneralFloatCases.test_float_ceil @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.GeneralFloatCases.test_float_containment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.GeneralFloatCases.test_float_floor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.GeneralFloatCases.test_float_memoryview @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.GeneralFloatCases.test_float_mod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.GeneralFloatCases.test_float_pow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.GeneralFloatCases.test_float_with_comma @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.GeneralFloatCases.test_floatasratio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.GeneralFloatCases.test_floatconversion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.GeneralFloatCases.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.GeneralFloatCases.test_is_integer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.GeneralFloatCases.test_keyword_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.GeneralFloatCases.test_noargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.GeneralFloatCases.test_non_numeric_input_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.GeneralFloatCases.test_underscores @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.HexFloatTestCase.test_ends @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.HexFloatTestCase.test_from_hex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.HexFloatTestCase.test_invalid_inputs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.HexFloatTestCase.test_roundtrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.HexFloatTestCase.test_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.HexFloatTestCase.test_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.IEEEFormatTestCase.test_double_specials_do_unpack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.IEEEFormatTestCase.test_float_specials_do_unpack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.IEEEFormatTestCase.test_serialized_float_rounding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_float.InfNanTest.test_inf_as_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.InfNanTest.test_inf_from_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.InfNanTest.test_inf_signs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.InfNanTest.test_nan_as_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.InfNanTest.test_nan_from_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.InfNanTest.test_nan_signs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.PackTests.test_pack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_float.PackTests.test_roundtrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_float.PackTests.test_unpack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_float.ReprTestCase.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.ReprTestCase.test_short_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.RoundTestCase.test_None_ndigits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.RoundTestCase.test_format_specials @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.RoundTestCase.test_inf_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.RoundTestCase.test_inf_nan_ndigits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.RoundTestCase.test_large_n @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.RoundTestCase.test_matches_float_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.RoundTestCase.test_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.RoundTestCase.test_previous_round_bugs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_float.RoundTestCase.test_small_n @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_flufl.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_flufl.txt index 97d010b876..cd49e96422 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_flufl.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_flufl.txt @@ -1 +1 @@ -*graalpython.lib-python.3.test.test_flufl.FLUFLTests.test_guido_as_bdfl +test.test_flufl.FLUFLTests.test_guido_as_bdfl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fnmatch.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fnmatch.txt index c826e852bb..1c995722f5 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fnmatch.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fnmatch.txt @@ -1,17 +1,17 @@ -*graalpython.lib-python.3.test.test_fnmatch.FilterTestCase.test_case -*graalpython.lib-python.3.test.test_fnmatch.FilterTestCase.test_filter -*graalpython.lib-python.3.test.test_fnmatch.FilterTestCase.test_mix_bytes_str -*graalpython.lib-python.3.test.test_fnmatch.FilterTestCase.test_sep -*graalpython.lib-python.3.test.test_fnmatch.FnmatchTestCase.test_bytes -*graalpython.lib-python.3.test.test_fnmatch.FnmatchTestCase.test_case -*graalpython.lib-python.3.test.test_fnmatch.FnmatchTestCase.test_char_set -*graalpython.lib-python.3.test.test_fnmatch.FnmatchTestCase.test_fnmatch -*graalpython.lib-python.3.test.test_fnmatch.FnmatchTestCase.test_fnmatchcase -*graalpython.lib-python.3.test.test_fnmatch.FnmatchTestCase.test_mix_bytes_str -*graalpython.lib-python.3.test.test_fnmatch.FnmatchTestCase.test_range -*graalpython.lib-python.3.test.test_fnmatch.FnmatchTestCase.test_sep -*graalpython.lib-python.3.test.test_fnmatch.FnmatchTestCase.test_sep_in_char_set -*graalpython.lib-python.3.test.test_fnmatch.FnmatchTestCase.test_sep_in_range -*graalpython.lib-python.3.test.test_fnmatch.FnmatchTestCase.test_slow_fnmatch -*graalpython.lib-python.3.test.test_fnmatch.FnmatchTestCase.test_warnings -*graalpython.lib-python.3.test.test_fnmatch.TranslateTestCase.test_translate +test.test_fnmatch.FilterTestCase.test_case @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fnmatch.FilterTestCase.test_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fnmatch.FilterTestCase.test_mix_bytes_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fnmatch.FilterTestCase.test_sep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fnmatch.FnmatchTestCase.test_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fnmatch.FnmatchTestCase.test_case @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fnmatch.FnmatchTestCase.test_char_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fnmatch.FnmatchTestCase.test_fnmatch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fnmatch.FnmatchTestCase.test_fnmatchcase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fnmatch.FnmatchTestCase.test_mix_bytes_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fnmatch.FnmatchTestCase.test_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fnmatch.FnmatchTestCase.test_sep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fnmatch.FnmatchTestCase.test_sep_in_char_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fnmatch.FnmatchTestCase.test_sep_in_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fnmatch.FnmatchTestCase.test_slow_fnmatch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fnmatch.FnmatchTestCase.test_warnings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fnmatch.TranslateTestCase.test_translate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_format.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_format.txt index a1bde890f4..611f6b2f87 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_format.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_format.txt @@ -1,15 +1,12 @@ -*graalpython.lib-python.3.test.test_format.FormatTest.test_bytes_and_bytearray_format -*graalpython.lib-python.3.test.test_format.FormatTest.test_common_format -*graalpython.lib-python.3.test.test_format.FormatTest.test_format_class -*graalpython.lib-python.3.test.test_format.FormatTest.test_g_format_has_no_trailing_zeros -*graalpython.lib-python.3.test.test_format.FormatTest.test_locale -*graalpython.lib-python.3.test.test_format.FormatTest.test_non_ascii -*graalpython.lib-python.3.test.test_format.FormatTest.test_nul -*graalpython.lib-python.3.test.test_format.FormatTest.test_optimisations -*graalpython.lib-python.3.test.test_format.FormatTest.test_precision -*graalpython.lib-python.3.test.test_format.FormatTest.test_precision_c_limits -*graalpython.lib-python.3.test.test_format.FormatTest.test_str_format -*graalpython.lib-python.3.test.test_format.FormatTest.test_with_a_commas_and_an_underscore_in_format_specifier -*graalpython.lib-python.3.test.test_format.FormatTest.test_with_an_underscore_and_a_comma_in_format_specifier -*graalpython.lib-python.3.test.test_format.FormatTest.test_with_two_commas_in_format_specifier -*graalpython.lib-python.3.test.test_format.FormatTest.test_with_two_underscore_in_format_specifier +test.test_format.FormatTest.test_bytes_and_bytearray_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_format.FormatTest.test_common_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_format.FormatTest.test_g_format_has_no_trailing_zeros @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_format.FormatTest.test_locale @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_format.FormatTest.test_non_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_format.FormatTest.test_nul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_format.FormatTest.test_precision @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_format.FormatTest.test_str_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_format.FormatTest.test_with_a_commas_and_an_underscore_in_format_specifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_format.FormatTest.test_with_an_underscore_and_a_comma_in_format_specifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_format.FormatTest.test_with_two_commas_in_format_specifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_format.FormatTest.test_with_two_underscore_in_format_specifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fractions.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fractions.txt index ee717cbf35..8271d05dd4 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fractions.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fractions.txt @@ -1,34 +1,33 @@ -*graalpython.lib-python.3.test.test_fractions.FractionTest.testApproximateCos1 -*graalpython.lib-python.3.test.test_fractions.FractionTest.testApproximatePi -*graalpython.lib-python.3.test.test_fractions.FractionTest.testArithmetic -*graalpython.lib-python.3.test.test_fractions.FractionTest.testBigComplexComparisons -*graalpython.lib-python.3.test.test_fractions.FractionTest.testBigFloatComparisons -*graalpython.lib-python.3.test.test_fractions.FractionTest.testBoolGuarateesBoolReturn -*graalpython.lib-python.3.test.test_fractions.FractionTest.testComparisons -*graalpython.lib-python.3.test.test_fractions.FractionTest.testComparisonsDummyFloat -*graalpython.lib-python.3.test.test_fractions.FractionTest.testComparisonsDummyRational -*graalpython.lib-python.3.test.test_fractions.FractionTest.testConversions -*graalpython.lib-python.3.test.test_fractions.FractionTest.testFromDecimal -*graalpython.lib-python.3.test.test_fractions.FractionTest.testFromFloat -*graalpython.lib-python.3.test.test_fractions.FractionTest.testFromString -*graalpython.lib-python.3.test.test_fractions.FractionTest.testHash -*graalpython.lib-python.3.test.test_fractions.FractionTest.testImmutable -*graalpython.lib-python.3.test.test_fractions.FractionTest.testInit -*graalpython.lib-python.3.test.test_fractions.FractionTest.testInitFromDecimal -*graalpython.lib-python.3.test.test_fractions.FractionTest.testInitFromFloat -*graalpython.lib-python.3.test.test_fractions.FractionTest.testIntGuaranteesIntReturn -*graalpython.lib-python.3.test.test_fractions.FractionTest.testLargeArithmetic -*graalpython.lib-python.3.test.test_fractions.FractionTest.testLimitDenominator -*graalpython.lib-python.3.test.test_fractions.FractionTest.testMixedArithmetic -*graalpython.lib-python.3.test.test_fractions.FractionTest.testMixedEqual -*graalpython.lib-python.3.test.test_fractions.FractionTest.testMixedLess -*graalpython.lib-python.3.test.test_fractions.FractionTest.testMixedLessEqual -*graalpython.lib-python.3.test.test_fractions.FractionTest.testMixingWithDecimal -*graalpython.lib-python.3.test.test_fractions.FractionTest.testRound -*graalpython.lib-python.3.test.test_fractions.FractionTest.testStringification -*graalpython.lib-python.3.test.test_fractions.FractionTest.testSupportsInt -*graalpython.lib-python.3.test.test_fractions.FractionTest.test_as_integer_ratio -*graalpython.lib-python.3.test.test_fractions.FractionTest.test_copy_deepcopy_pickle -*graalpython.lib-python.3.test.test_fractions.FractionTest.test_int_subclass -*graalpython.lib-python.3.test.test_fractions.FractionTest.test_slots -*graalpython.lib-python.3.test.test_fractions.GcdTest.testMisc +test.test_fractions.FractionTest.testApproximateCos1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testApproximatePi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testArithmetic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testBigComplexComparisons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testBigFloatComparisons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testBoolGuarateesBoolReturn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testComparisons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testComparisonsDummyFloat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testComparisonsDummyRational @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testConversions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testFromDecimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testFromFloat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testFromString @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testHash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testImmutable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testInit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testInitFromDecimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testInitFromFloat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testIntGuaranteesIntReturn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testLargeArithmetic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testLimitDenominator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testMixedArithmetic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testMixedEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testMixedLess @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testMixedLessEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testMixingWithDecimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testRound @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testStringification @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.testSupportsInt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.test_as_integer_ratio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.test_copy_deepcopy_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.test_int_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fractions.FractionTest.test_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_frame.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_frame.txt index e63ebc03c7..fb4f11cf4b 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_frame.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_frame.txt @@ -1,9 +1,5 @@ -*graalpython.lib-python.3.test.test_frame.ClearTest.test_clear_does_not_clear_specials -*graalpython.lib-python.3.test.test_frame.ClearTest.test_clear_locals -*graalpython.lib-python.3.test.test_frame.ClearTest.test_clear_refcycles -*graalpython.lib-python.3.test.test_frame.ClearTest.test_lineno_with_tracing -*graalpython.lib-python.3.test.test_frame.FrameAttrsTest.test_f_lineno_del_segfault -*graalpython.lib-python.3.test.test_frame.FrameAttrsTest.test_locals -*graalpython.lib-python.3.test.test_frame.ReprTest.test_repr -*graalpython.lib-python.3.test.test_frame.TestIncompleteFrameAreInvisible.test_sneaky_frame_object -*graalpython.lib-python.3.test.test_frame.TestIncompleteFrameAreInvisible.test_sneaky_frame_object_teardown +test.test_frame.ClearTest.test_clear_does_not_clear_specials @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_frame.ClearTest.test_lineno_with_tracing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_frame.FrameAttrsTest.test_f_lineno_del_segfault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_frame.FrameAttrsTest.test_locals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_frame.ReprTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_frozen.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_frozen.txt index ebe822ee96..b1abcb054f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_frozen.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_frozen.txt @@ -1,3 +1,3 @@ -*graalpython.lib-python.3.test.test_frozen.TestFrozen.test_frozen -*graalpython.lib-python.3.test.test_frozen.TestFrozen.test_frozen_submodule_in_unfrozen_package -*graalpython.lib-python.3.test.test_frozen.TestFrozen.test_unfrozen_submodule_in_frozen_package +test.test_frozen.TestFrozen.test_frozen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_frozen.TestFrozen.test_frozen_submodule_in_unfrozen_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_frozen.TestFrozen.test_unfrozen_submodule_in_frozen_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fstring.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fstring.txt index cfe83487d3..723c90bb85 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fstring.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_fstring.txt @@ -1,66 +1,66 @@ -*graalpython.lib-python.3.test.test_fstring.TestCase.test__format__lookup -*graalpython.lib-python.3.test.test_fstring.TestCase.test_arguments -*graalpython.lib-python.3.test.test_fstring.TestCase.test_assignment -*graalpython.lib-python.3.test.test_fstring.TestCase.test_ast -*graalpython.lib-python.3.test.test_fstring.TestCase.test_ast_compile_time_concat -*graalpython.lib-python.3.test.test_fstring.TestCase.test_ast_line_numbers -*graalpython.lib-python.3.test.test_fstring.TestCase.test_ast_line_numbers_duplicate_expression -*graalpython.lib-python.3.test.test_fstring.TestCase.test_ast_line_numbers_multiple_formattedvalues -*graalpython.lib-python.3.test.test_fstring.TestCase.test_ast_line_numbers_nested -*graalpython.lib-python.3.test.test_fstring.TestCase.test_ast_numbers_fstring_with_formatting -*graalpython.lib-python.3.test.test_fstring.TestCase.test_backslash_char -*graalpython.lib-python.3.test.test_fstring.TestCase.test_backslashes_in_string_part -*graalpython.lib-python.3.test.test_fstring.TestCase.test_call -*graalpython.lib-python.3.test.test_fstring.TestCase.test_closure -*graalpython.lib-python.3.test.test_fstring.TestCase.test_comments -*graalpython.lib-python.3.test.test_fstring.TestCase.test_compile_time_concat -*graalpython.lib-python.3.test.test_fstring.TestCase.test_compile_time_concat_errors -*graalpython.lib-python.3.test.test_fstring.TestCase.test_conversions -*graalpython.lib-python.3.test.test_fstring.TestCase.test_debug_conversion -*graalpython.lib-python.3.test.test_fstring.TestCase.test_del -*graalpython.lib-python.3.test.test_fstring.TestCase.test_dict -*graalpython.lib-python.3.test.test_fstring.TestCase.test_docstring -*graalpython.lib-python.3.test.test_fstring.TestCase.test_double_braces -*graalpython.lib-python.3.test.test_fstring.TestCase.test_empty_format_specifier -*graalpython.lib-python.3.test.test_fstring.TestCase.test_equal_equal -*graalpython.lib-python.3.test.test_fstring.TestCase.test_errors -*graalpython.lib-python.3.test.test_fstring.TestCase.test_expressions_with_triple_quoted_strings -*graalpython.lib-python.3.test.test_fstring.TestCase.test_filename_in_syntaxerror -*graalpython.lib-python.3.test.test_fstring.TestCase.test_format_specifier_expressions -*graalpython.lib-python.3.test.test_fstring.TestCase.test_global -*graalpython.lib-python.3.test.test_fstring.TestCase.test_if_conditional -*graalpython.lib-python.3.test.test_fstring.TestCase.test_invalid_string_prefixes -*graalpython.lib-python.3.test.test_fstring.TestCase.test_invalid_syntax_error_message -*graalpython.lib-python.3.test.test_fstring.TestCase.test_lambda -*graalpython.lib-python.3.test.test_fstring.TestCase.test_leading_trailing_spaces -*graalpython.lib-python.3.test.test_fstring.TestCase.test_literal -*graalpython.lib-python.3.test.test_fstring.TestCase.test_literal_eval -*graalpython.lib-python.3.test.test_fstring.TestCase.test_locals -*graalpython.lib-python.3.test.test_fstring.TestCase.test_loop -*graalpython.lib-python.3.test.test_fstring.TestCase.test_many_expressions -*graalpython.lib-python.3.test.test_fstring.TestCase.test_misformed_unicode_character_name -*graalpython.lib-python.3.test.test_fstring.TestCase.test_mismatched_braces -*graalpython.lib-python.3.test.test_fstring.TestCase.test_mismatched_parens -*graalpython.lib-python.3.test.test_fstring.TestCase.test_missing_expression -*graalpython.lib-python.3.test.test_fstring.TestCase.test_missing_format_spec -*graalpython.lib-python.3.test.test_fstring.TestCase.test_missing_variable -*graalpython.lib-python.3.test.test_fstring.TestCase.test_multiple_vars -*graalpython.lib-python.3.test.test_fstring.TestCase.test_nested_fstrings -*graalpython.lib-python.3.test.test_fstring.TestCase.test_newlines_before_syntax_error -*graalpython.lib-python.3.test.test_fstring.TestCase.test_newlines_in_expressions -*graalpython.lib-python.3.test.test_fstring.TestCase.test_no_backslashes_in_expression_part -*graalpython.lib-python.3.test.test_fstring.TestCase.test_no_escapes_for_braces -*graalpython.lib-python.3.test.test_fstring.TestCase.test_not_equal -*graalpython.lib-python.3.test.test_fstring.TestCase.test_parens_in_expressions -*graalpython.lib-python.3.test.test_fstring.TestCase.test_shadowed_global -*graalpython.lib-python.3.test.test_fstring.TestCase.test_side_effect_order -*graalpython.lib-python.3.test.test_fstring.TestCase.test_str_format_differences -*graalpython.lib-python.3.test.test_fstring.TestCase.test_syntax_error_for_starred_expressions -*graalpython.lib-python.3.test.test_fstring.TestCase.test_unterminated_string -*graalpython.lib-python.3.test.test_fstring.TestCase.test_walrus -*graalpython.lib-python.3.test.test_fstring.TestCase.test_with_a_commas_and_an_underscore_in_format_specifier -*graalpython.lib-python.3.test.test_fstring.TestCase.test_with_an_underscore_and_a_comma_in_format_specifier -*graalpython.lib-python.3.test.test_fstring.TestCase.test_with_two_commas_in_format_specifier -*graalpython.lib-python.3.test.test_fstring.TestCase.test_with_two_underscore_in_format_specifier -*graalpython.lib-python.3.test.test_fstring.TestCase.test_yield -*graalpython.lib-python.3.test.test_fstring.TestCase.test_yield_send +test.test_fstring.TestCase.test__format__lookup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_ast @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_ast_compile_time_concat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_ast_line_numbers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_ast_line_numbers_duplicate_expression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_ast_line_numbers_multiple_formattedvalues @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_ast_line_numbers_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_ast_numbers_fstring_with_formatting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_backslash_char @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_backslashes_in_string_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_closure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_compile_time_concat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_compile_time_concat_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_conversions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_debug_conversion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_del @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_double_braces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_empty_format_specifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_equal_equal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_expressions_with_triple_quoted_strings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_filename_in_syntaxerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_format_specifier_expressions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_global @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_if_conditional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_invalid_string_prefixes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_invalid_syntax_error_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_lambda @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_leading_trailing_spaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_literal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_literal_eval @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_locals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_many_expressions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_misformed_unicode_character_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_mismatched_braces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_mismatched_parens @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_missing_expression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_missing_format_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_missing_variable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_multiple_vars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_nested_fstrings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_newlines_before_syntax_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_newlines_in_expressions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_no_backslashes_in_expression_part @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_no_escapes_for_braces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_not_equal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_parens_in_expressions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_shadowed_global @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_side_effect_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_str_format_differences @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_syntax_error_for_starred_expressions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_unterminated_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_walrus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_with_a_commas_and_an_underscore_in_format_specifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_with_an_underscore_and_a_comma_in_format_specifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_with_two_commas_in_format_specifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_with_two_underscore_in_format_specifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_yield @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_fstring.TestCase.test_yield_send @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ftplib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ftplib.txt index 944aeb40d6..f6d1ecf8f8 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ftplib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ftplib.txt @@ -1,95 +1,93 @@ -*graalpython.lib-python.3.test.test_ftplib.MiscTestCase.test__all__ -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_abort -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_acct -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_all_errors -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_cwd -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_delete -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_dir -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_encoding_param -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_exceptions -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_getwelcome -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_line_too_long -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_login -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_makepasv -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_makepasv_issue43285_security_disabled -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_makepasv_issue43285_security_enabled_default -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_makeport -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_mkd -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_mlsd -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_nlst -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_parse257 -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_pwd -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_quit -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_rename -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_retrbinary -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_retrbinary_rest -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_retrlines -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_retrlines_too_long -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_rmd -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_sanitize -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_set_pasv -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_size -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_source_address -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_source_address_passive_connection -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_storbinary -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_storbinary_rest -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_storlines -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_storlines_too_long -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_voidcmd -*graalpython.lib-python.3.test.test_ftplib.TestFTPClass.test_with_statement -*graalpython.lib-python.3.test.test_ftplib.TestIPv6Environment.test_af -*graalpython.lib-python.3.test.test_ftplib.TestIPv6Environment.test_makepasv -*graalpython.lib-python.3.test.test_ftplib.TestIPv6Environment.test_makeport -*graalpython.lib-python.3.test.test_ftplib.TestIPv6Environment.test_transfer -*graalpython.lib-python.3.test.test_ftplib.TestMain.test_main -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClass.test_auth_issued_twice -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClass.test_ccc -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClass.test_check_hostname -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClass.test_context -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClass.test_control_connection -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClass.test_data_connection -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClass.test_login -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_abort -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_acct -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_all_errors -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_cwd -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_delete -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_dir -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_encoding_param -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_exceptions -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_getwelcome -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_line_too_long -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_login -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_makepasv -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_makepasv_issue43285_security_disabled -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_makepasv_issue43285_security_enabled_default -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_makeport -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_mkd -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_mlsd -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_nlst -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_parse257 -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_pwd -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_quit -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_rename -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_retrbinary -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_retrbinary_rest -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_retrlines -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_retrlines_too_long -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_rmd -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_sanitize -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_set_pasv -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_size -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_source_address -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_source_address_passive_connection -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_storbinary -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_storbinary_rest -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_storlines -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_storlines_too_long -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_voidcmd -*graalpython.lib-python.3.test.test_ftplib.TestTLS_FTPClassMixin.test_with_statement -*graalpython.lib-python.3.test.test_ftplib.TestTimeouts.testTimeoutConnect -*graalpython.lib-python.3.test.test_ftplib.TestTimeouts.testTimeoutDefault -*graalpython.lib-python.3.test.test_ftplib.TestTimeouts.testTimeoutDifferentOrder -*graalpython.lib-python.3.test.test_ftplib.TestTimeouts.testTimeoutDirectAccess -*graalpython.lib-python.3.test.test_ftplib.TestTimeouts.testTimeoutNone -*graalpython.lib-python.3.test.test_ftplib.TestTimeouts.testTimeoutValue +test.test_ftplib.MiscTestCase.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ftplib.TestFTPClass.test_abort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_acct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_all_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_delete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_encoding_param @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_getwelcome @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_line_too_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_login @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_makepasv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_makepasv_issue43285_security_disabled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_makepasv_issue43285_security_enabled_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_makeport @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_mkd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_mlsd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_nlst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_parse257 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_pwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_quit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_rename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_retrbinary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_retrbinary_rest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_retrlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_retrlines_too_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_rmd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_sanitize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_set_pasv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_source_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_source_address_passive_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_storbinary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_storbinary_rest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_storlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_storlines_too_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_voidcmd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestFTPClass.test_with_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestIPv6Environment.test_af @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestIPv6Environment.test_makepasv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestIPv6Environment.test_makeport @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestIPv6Environment.test_transfer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClass.test_auth_issued_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClass.test_ccc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClass.test_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClass.test_control_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClass.test_data_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClass.test_login @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_abort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_acct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_all_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_delete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_encoding_param @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_getwelcome @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_line_too_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_login @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_makepasv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_makepasv_issue43285_security_disabled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_makepasv_issue43285_security_enabled_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_makeport @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_mkd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_mlsd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_nlst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_parse257 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_pwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_quit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_rename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_retrbinary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_retrbinary_rest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_retrlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_retrlines_too_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_rmd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_sanitize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_set_pasv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_source_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_source_address_passive_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_storbinary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_storbinary_rest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_storlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_storlines_too_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_voidcmd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_with_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTimeouts.testTimeoutConnect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTimeouts.testTimeoutDefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTimeouts.testTimeoutDifferentOrder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTimeouts.testTimeoutDirectAccess @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTimeouts.testTimeoutNone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ftplib.TestTimeouts.testTimeoutValue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_funcattrs.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_funcattrs.txt index 29349e7771..433e4c23e0 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_funcattrs.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_funcattrs.txt @@ -1,31 +1,31 @@ -*graalpython.lib-python.3.test.test_funcattrs.ArbitraryFunctionAttrTest.test_delete_unknown_attr -*graalpython.lib-python.3.test.test_funcattrs.ArbitraryFunctionAttrTest.test_set_attr -*graalpython.lib-python.3.test.test_funcattrs.ArbitraryFunctionAttrTest.test_unset_attr -*graalpython.lib-python.3.test.test_funcattrs.BuiltinFunctionPropertiesTest.test_builtin__qualname__ -*graalpython.lib-python.3.test.test_funcattrs.CellTest.test_comparison -*graalpython.lib-python.3.test.test_funcattrs.FunctionDictsTest.test_delete___dict__ -*graalpython.lib-python.3.test.test_funcattrs.FunctionDictsTest.test_func_as_dict_key -*graalpython.lib-python.3.test.test_funcattrs.FunctionDictsTest.test_setting_dict_to_invalid -*graalpython.lib-python.3.test.test_funcattrs.FunctionDictsTest.test_setting_dict_to_valid -*graalpython.lib-python.3.test.test_funcattrs.FunctionDictsTest.test_unassigned_dict -*graalpython.lib-python.3.test.test_funcattrs.FunctionDocstringTest.test_delete_docstring -*graalpython.lib-python.3.test.test_funcattrs.FunctionDocstringTest.test_set_docstring_attr -*graalpython.lib-python.3.test.test_funcattrs.FunctionPropertiesTest.test___closure__ -*graalpython.lib-python.3.test.test_funcattrs.FunctionPropertiesTest.test___code__ -*graalpython.lib-python.3.test.test_funcattrs.FunctionPropertiesTest.test___globals__ -*graalpython.lib-python.3.test.test_funcattrs.FunctionPropertiesTest.test___name__ -*graalpython.lib-python.3.test.test_funcattrs.FunctionPropertiesTest.test___qualname__ -*graalpython.lib-python.3.test.test_funcattrs.FunctionPropertiesTest.test_blank_func_defaults -*graalpython.lib-python.3.test.test_funcattrs.FunctionPropertiesTest.test_cell_new -*graalpython.lib-python.3.test.test_funcattrs.FunctionPropertiesTest.test_copying___code__ -*graalpython.lib-python.3.test.test_funcattrs.FunctionPropertiesTest.test_dir_includes_correct_attrs -*graalpython.lib-python.3.test.test_funcattrs.FunctionPropertiesTest.test_duplicate_function_equality -*graalpython.lib-python.3.test.test_funcattrs.FunctionPropertiesTest.test_empty_cell -*graalpython.lib-python.3.test.test_funcattrs.FunctionPropertiesTest.test_func_default_args -*graalpython.lib-python.3.test.test_funcattrs.FunctionPropertiesTest.test_module -*graalpython.lib-python.3.test.test_funcattrs.FunctionPropertiesTest.test_set_cell -*graalpython.lib-python.3.test.test_funcattrs.InstancemethodAttrTest.test___class__ -*graalpython.lib-python.3.test.test_funcattrs.InstancemethodAttrTest.test___func__ -*graalpython.lib-python.3.test.test_funcattrs.InstancemethodAttrTest.test___func___non_method -*graalpython.lib-python.3.test.test_funcattrs.InstancemethodAttrTest.test___self__ -*graalpython.lib-python.3.test.test_funcattrs.StaticMethodAttrsTest.test_func_attribute +test.test_funcattrs.ArbitraryFunctionAttrTest.test_delete_unknown_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.ArbitraryFunctionAttrTest.test_set_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.ArbitraryFunctionAttrTest.test_unset_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.BuiltinFunctionPropertiesTest.test_builtin__qualname__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.CellTest.test_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionDictsTest.test_delete___dict__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionDictsTest.test_func_as_dict_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionDictsTest.test_setting_dict_to_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionDictsTest.test_setting_dict_to_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionDictsTest.test_unassigned_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionDocstringTest.test_delete_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionDocstringTest.test_set_docstring_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionPropertiesTest.test___closure__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionPropertiesTest.test___code__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionPropertiesTest.test___globals__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionPropertiesTest.test___name__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionPropertiesTest.test___qualname__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionPropertiesTest.test_blank_func_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionPropertiesTest.test_cell_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionPropertiesTest.test_copying___code__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionPropertiesTest.test_dir_includes_correct_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionPropertiesTest.test_duplicate_function_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionPropertiesTest.test_empty_cell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionPropertiesTest.test_func_default_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionPropertiesTest.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.FunctionPropertiesTest.test_set_cell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.InstancemethodAttrTest.test___class__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.InstancemethodAttrTest.test___func__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.InstancemethodAttrTest.test___func___non_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.InstancemethodAttrTest.test___self__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_funcattrs.StaticMethodAttrsTest.test_func_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_functools.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_functools.txt index 9e5856d3ce..03aa8ceaec 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_functools.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_functools.txt @@ -1,245 +1,247 @@ -*graalpython.lib-python.3.test.test_functools.TestCachedProperty.test_access_from_class -*graalpython.lib-python.3.test.test_functools.TestCachedProperty.test_cached -*graalpython.lib-python.3.test.test_functools.TestCachedProperty.test_cached_attribute_name_differs_from_func_name -*graalpython.lib-python.3.test.test_functools.TestCachedProperty.test_doc -*graalpython.lib-python.3.test.test_functools.TestCachedProperty.test_immutable_dict -*graalpython.lib-python.3.test.test_functools.TestCachedProperty.test_object_with_slots -*graalpython.lib-python.3.test.test_functools.TestCachedProperty.test_reuse_different_names -*graalpython.lib-python.3.test.test_functools.TestCachedProperty.test_reuse_same_name -*graalpython.lib-python.3.test.test_functools.TestCachedProperty.test_set_name_not_called -*graalpython.lib-python.3.test.test_functools.TestCachedProperty.test_threaded -*graalpython.lib-python.3.test.test_functools.TestCmpToKeyC.test_bad_cmp -*graalpython.lib-python.3.test.test_functools.TestCmpToKeyC.test_cmp_to_key -*graalpython.lib-python.3.test.test_functools.TestCmpToKeyC.test_cmp_to_key_arguments -*graalpython.lib-python.3.test.test_functools.TestCmpToKeyC.test_disallow_instantiation -*graalpython.lib-python.3.test.test_functools.TestCmpToKeyC.test_hash -*graalpython.lib-python.3.test.test_functools.TestCmpToKeyC.test_obj_field -*graalpython.lib-python.3.test.test_functools.TestCmpToKeyC.test_sort_int -*graalpython.lib-python.3.test.test_functools.TestCmpToKeyC.test_sort_int_str -*graalpython.lib-python.3.test.test_functools.TestCmpToKeyPy.test_bad_cmp -*graalpython.lib-python.3.test.test_functools.TestCmpToKeyPy.test_cmp_to_key -*graalpython.lib-python.3.test.test_functools.TestCmpToKeyPy.test_cmp_to_key_arguments -*graalpython.lib-python.3.test.test_functools.TestCmpToKeyPy.test_hash -*graalpython.lib-python.3.test.test_functools.TestCmpToKeyPy.test_obj_field -*graalpython.lib-python.3.test.test_functools.TestCmpToKeyPy.test_sort_int -*graalpython.lib-python.3.test.test_functools.TestCmpToKeyPy.test_sort_int_str -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_copy -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_deepcopy -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_kwargs_order -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_bug_35780 -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_bug_36650 -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_cache_decoration -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_cache_parameters -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_cache_threaded -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_cache_threaded2 -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_cache_threaded3 -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_cache_typed_is_not_recursive -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_hash_only_once -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_method -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_no_args -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_reentrancy_with_len -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_star_arg_handling -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_type_error -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_with_exceptions -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_with_keyword_args -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_with_keyword_args_maxsize_none -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_with_maxsize_negative -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_with_maxsize_none -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_lru_with_types -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_need_for_rlock -*graalpython.lib-python.3.test.test_functools.TestLRUC.test_pickle -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_copy -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_deepcopy -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_kwargs_order -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_bug_35780 -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_bug_36650 -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_cache_decoration -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_cache_parameters -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_cache_threaded -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_cache_threaded2 -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_cache_threaded3 -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_cache_typed_is_not_recursive -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_hash_only_once -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_method -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_no_args -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_reentrancy_with_len -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_star_arg_handling -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_type_error -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_with_exceptions -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_with_keyword_args -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_with_keyword_args_maxsize_none -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_with_maxsize_negative -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_with_maxsize_none -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_lru_with_types -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_need_for_rlock -*graalpython.lib-python.3.test.test_functools.TestLRUPy.test_pickle -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_arg_combinations -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_argument_checking -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_attributes -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_attributes_unwritable -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_basic_examples -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_copy -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_deepcopy -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_error_propagation -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_keystr_replaces_value -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_keyword -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_kw_combinations -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_kwargs_copy -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_manually_adding_non_string_keyword -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_nested_optimization -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_nested_partial_with_attribute -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_no_side_effects -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_pickle -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_positional -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_protection_of_callers_dict_argument -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_recursive_repr -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_repr -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_setstate -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_setstate_errors -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_setstate_refcount -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_setstate_subclasses -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_weakref -*graalpython.lib-python.3.test.test_functools.TestPartialC.test_with_bound_and_unbound_methods -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_arg_combinations -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_argument_checking -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_attributes -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_attributes_unwritable -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_basic_examples -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_copy -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_deepcopy -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_error_propagation -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_keystr_replaces_value -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_keyword -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_kw_combinations -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_kwargs_copy -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_manually_adding_non_string_keyword -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_nested_partial_with_attribute -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_no_side_effects -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_pickle -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_positional -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_protection_of_callers_dict_argument -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_recursive_repr -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_repr -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_setstate -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_setstate_errors -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_setstate_refcount -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_setstate_subclasses -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_weakref -*graalpython.lib-python.3.test.test_functools.TestPartialCSubclass.test_with_bound_and_unbound_methods -*graalpython.lib-python.3.test.test_functools.TestPartialMethod.test_abstract -*graalpython.lib-python.3.test.test_functools.TestPartialMethod.test_arg_combinations -*graalpython.lib-python.3.test.test_functools.TestPartialMethod.test_bound_method_introspection -*graalpython.lib-python.3.test.test_functools.TestPartialMethod.test_descriptors -*graalpython.lib-python.3.test.test_functools.TestPartialMethod.test_invalid_args -*graalpython.lib-python.3.test.test_functools.TestPartialMethod.test_nested -*graalpython.lib-python.3.test.test_functools.TestPartialMethod.test_over_partial -*graalpython.lib-python.3.test.test_functools.TestPartialMethod.test_overriding_keywords -*graalpython.lib-python.3.test.test_functools.TestPartialMethod.test_positional_only -*graalpython.lib-python.3.test.test_functools.TestPartialMethod.test_repr -*graalpython.lib-python.3.test.test_functools.TestPartialMethod.test_unbound_method_retrieval -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_arg_combinations -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_argument_checking -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_attributes -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_basic_examples -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_copy -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_deepcopy -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_error_propagation -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_keyword -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_kw_combinations -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_kwargs_copy -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_nested_optimization -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_nested_partial_with_attribute -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_no_side_effects -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_pickle -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_positional -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_protection_of_callers_dict_argument -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_recursive_repr -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_repr -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_setstate -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_setstate_errors -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_setstate_refcount -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_setstate_subclasses -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_weakref -*graalpython.lib-python.3.test.test_functools.TestPartialPy.test_with_bound_and_unbound_methods -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_arg_combinations -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_argument_checking -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_attributes -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_basic_examples -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_copy -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_deepcopy -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_error_propagation -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_keyword -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_kw_combinations -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_kwargs_copy -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_nested_optimization -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_nested_partial_with_attribute -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_no_side_effects -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_pickle -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_positional -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_protection_of_callers_dict_argument -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_recursive_repr -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_repr -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_setstate -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_setstate_errors -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_setstate_refcount -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_setstate_subclasses -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_weakref -*graalpython.lib-python.3.test.test_functools.TestPartialPySubclass.test_with_bound_and_unbound_methods -*graalpython.lib-python.3.test.test_functools.TestReduceC.test_iterator_usage -*graalpython.lib-python.3.test.test_functools.TestReduceC.test_reduce -*graalpython.lib-python.3.test.test_functools.TestReducePy.test_iterator_usage -*graalpython.lib-python.3.test.test_functools.TestReducePy.test_reduce -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_abstractmethod_register -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_annotations -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_c3_abc -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_c_classes -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_cache_invalidation -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_callable_register -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_classmethod_register -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_classmethod_type_ann_register -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_compose_mro -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_double_wrapped_methods -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_false_meta -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_invalid_positional_argument -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_invalid_registrations -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_method_register -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_method_wrapping_attributes -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_mro -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_mro_conflicts -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_register_abc -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_register_decorator -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_register_genericalias -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_register_genericalias_annotation -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_register_genericalias_decorator -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_simple_overloads -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_staticmethod_register -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_staticmethod_type_ann_register -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_type_ann_register -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_union -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_union_None -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_union_conflict -*graalpython.lib-python.3.test.test_functools.TestSingleDispatch.test_wrapping_attributes -*graalpython.lib-python.3.test.test_functools.TestTotalOrdering.test_no_operations_defined -*graalpython.lib-python.3.test.test_functools.TestTotalOrdering.test_notimplemented -*graalpython.lib-python.3.test.test_functools.TestTotalOrdering.test_pickle -*graalpython.lib-python.3.test.test_functools.TestTotalOrdering.test_total_ordering_for_metaclasses_issue_44605 -*graalpython.lib-python.3.test.test_functools.TestTotalOrdering.test_total_ordering_ge -*graalpython.lib-python.3.test.test_functools.TestTotalOrdering.test_total_ordering_gt -*graalpython.lib-python.3.test.test_functools.TestTotalOrdering.test_total_ordering_le -*graalpython.lib-python.3.test.test_functools.TestTotalOrdering.test_total_ordering_lt -*graalpython.lib-python.3.test.test_functools.TestTotalOrdering.test_total_ordering_no_overwrite -*graalpython.lib-python.3.test.test_functools.TestTotalOrdering.test_type_error_when_not_implemented -*graalpython.lib-python.3.test.test_functools.TestUpdateWrapper.test_builtin_update -*graalpython.lib-python.3.test.test_functools.TestUpdateWrapper.test_default_update -*graalpython.lib-python.3.test.test_functools.TestUpdateWrapper.test_default_update_doc -*graalpython.lib-python.3.test.test_functools.TestUpdateWrapper.test_missing_attributes -*graalpython.lib-python.3.test.test_functools.TestUpdateWrapper.test_no_update -*graalpython.lib-python.3.test.test_functools.TestUpdateWrapper.test_selective_update -*graalpython.lib-python.3.test.test_functools.TestWraps.test_builtin_update -*graalpython.lib-python.3.test.test_functools.TestWraps.test_default_update -*graalpython.lib-python.3.test.test_functools.TestWraps.test_default_update_doc -*graalpython.lib-python.3.test.test_functools.TestWraps.test_missing_attributes -*graalpython.lib-python.3.test.test_functools.TestWraps.test_no_update -*graalpython.lib-python.3.test.test_functools.TestWraps.test_selective_update +test.test_functools.TestCachedProperty.test_access_from_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCachedProperty.test_cached @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCachedProperty.test_cached_attribute_name_differs_from_func_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCachedProperty.test_doc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCachedProperty.test_immutable_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCachedProperty.test_object_with_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCachedProperty.test_reuse_different_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCachedProperty.test_reuse_same_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCachedProperty.test_set_name_not_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCachedProperty.test_threaded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCmpToKeyC.test_bad_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCmpToKeyC.test_cmp_to_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCmpToKeyC.test_cmp_to_key_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCmpToKeyC.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCmpToKeyC.test_obj_field @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCmpToKeyC.test_sort_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCmpToKeyC.test_sort_int_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCmpToKeyPy.test_bad_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCmpToKeyPy.test_cmp_to_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCmpToKeyPy.test_cmp_to_key_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCmpToKeyPy.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCmpToKeyPy.test_obj_field @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCmpToKeyPy.test_sort_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestCmpToKeyPy.test_sort_int_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_kwargs_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_bug_35780 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_bug_36650 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_cache_decoration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_cache_parameters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_cache_threaded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_cache_threaded2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_cache_threaded3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_cache_typed_is_not_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_hash_only_once @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_reentrancy_with_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_star_arg_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_with_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_with_keyword_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_with_keyword_args_maxsize_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_with_maxsize_negative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_with_maxsize_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_lru_with_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_need_for_rlock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUC.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_kwargs_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_bug_35780 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_bug_36650 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_cache_decoration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_cache_parameters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_cache_threaded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_cache_threaded2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_cache_threaded3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_cache_typed_is_not_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_hash_only_once @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_reentrancy_with_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_star_arg_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_with_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_with_keyword_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_with_keyword_args_maxsize_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_with_maxsize_negative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_with_maxsize_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_lru_with_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_need_for_rlock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestLRUPy.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_arg_combinations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_argument_checking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_attributes_unwritable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_basic_examples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_error_propagation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_keystr_replaces_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_kw_combinations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_kwargs_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_manually_adding_non_string_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_nested_optimization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_nested_partial_with_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_no_side_effects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_positional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_protection_of_callers_dict_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Disabled due to transient stack overflow that fails to get caught and crashes the VM +!test.test_functools.TestPartialC.test_recursive_pickle @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_functools.TestPartialC.test_recursive_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_setstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_setstate_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_setstate_refcount @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_setstate_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialC.test_with_bound_and_unbound_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_arg_combinations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_argument_checking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_attributes_unwritable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_basic_examples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_error_propagation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_keystr_replaces_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_kw_combinations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_kwargs_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_manually_adding_non_string_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_nested_partial_with_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_no_side_effects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_positional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_protection_of_callers_dict_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Disabled due to transient stack overflow that fails to get caught and crashes the VM +!test.test_functools.TestPartialCSubclass.test_recursive_pickle @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_functools.TestPartialCSubclass.test_recursive_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_setstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_setstate_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_setstate_refcount @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_setstate_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialCSubclass.test_with_bound_and_unbound_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialMethod.test_abstract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialMethod.test_arg_combinations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialMethod.test_bound_method_introspection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialMethod.test_descriptors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialMethod.test_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialMethod.test_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialMethod.test_over_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialMethod.test_overriding_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialMethod.test_positional_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialMethod.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialMethod.test_unbound_method_retrieval @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_arg_combinations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_argument_checking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_basic_examples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_error_propagation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_kw_combinations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_kwargs_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_nested_optimization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_nested_partial_with_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_no_side_effects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_positional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_protection_of_callers_dict_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Disabled due to transient stack overflow that fails to get caught and crashes the VM +!test.test_functools.TestPartialPy.test_recursive_pickle @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_functools.TestPartialPy.test_recursive_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_setstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_setstate_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_setstate_refcount @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_setstate_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPy.test_with_bound_and_unbound_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_arg_combinations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_argument_checking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_basic_examples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_error_propagation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_kw_combinations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_kwargs_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_nested_optimization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_nested_partial_with_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_no_side_effects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_positional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_protection_of_callers_dict_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Disabled due to transient stack overflow that fails to get caught and crashes the VM +!test.test_functools.TestPartialPySubclass.test_recursive_pickle @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_functools.TestPartialPySubclass.test_recursive_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_setstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_setstate_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_setstate_refcount @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_setstate_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestPartialPySubclass.test_with_bound_and_unbound_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestReduceC.test_iterator_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestReduceC.test_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestReducePy.test_iterator_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestReducePy.test_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_abstractmethod_register @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_annotations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_c3_abc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_cache_invalidation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_callable_register @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_classmethod_register @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_classmethod_type_ann_register @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_compose_mro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_double_wrapped_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_false_meta @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_invalid_positional_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_invalid_registrations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_method_register @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_method_wrapping_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_mro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_mro_conflicts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_register_abc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_register_decorator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_register_genericalias @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_register_genericalias_annotation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_register_genericalias_decorator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_simple_overloads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_staticmethod_register @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_staticmethod_type_ann_register @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_type_ann_register @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_union_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_union_conflict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestSingleDispatch.test_wrapping_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestTotalOrdering.test_no_operations_defined @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestTotalOrdering.test_notimplemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestTotalOrdering.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestTotalOrdering.test_total_ordering_for_metaclasses_issue_44605 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestTotalOrdering.test_total_ordering_ge @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestTotalOrdering.test_total_ordering_gt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestTotalOrdering.test_total_ordering_le @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestTotalOrdering.test_total_ordering_lt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestTotalOrdering.test_total_ordering_no_overwrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestTotalOrdering.test_type_error_when_not_implemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestUpdateWrapper.test_builtin_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestUpdateWrapper.test_default_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestUpdateWrapper.test_default_update_doc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestUpdateWrapper.test_missing_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestUpdateWrapper.test_no_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestUpdateWrapper.test_selective_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestWraps.test_builtin_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestWraps.test_default_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestWraps.test_default_update_doc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestWraps.test_missing_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestWraps.test_no_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_functools.TestWraps.test_selective_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_future_stmt.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_future_stmt.txt index e523d4a0fc..02109100f3 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_future_stmt.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_future_stmt.txt @@ -1,27 +1,27 @@ -*test.test_future_stmt.test_future.AnnotationsFutureTestCase.test_annotation_with_complex_target -*test.test_future_stmt.test_future.AnnotationsFutureTestCase.test_annotations_forbidden -*test.test_future_stmt.test_future.AnnotationsFutureTestCase.test_annotations_symbol_table_pass -*test.test_future_stmt.test_future.AnnotationsFutureTestCase.test_get_type_hints_on_func_with_variadic_arg -*test.test_future_stmt.test_future.FutureTest.test_badfuture10 -*test.test_future_stmt.test_future.FutureTest.test_badfuture3 -*test.test_future_stmt.test_future.FutureTest.test_badfuture4 -*test.test_future_stmt.test_future.FutureTest.test_badfuture5 -*test.test_future_stmt.test_future.FutureTest.test_badfuture6 -*test.test_future_stmt.test_future.FutureTest.test_badfuture8 -*test.test_future_stmt.test_future.FutureTest.test_badfuture9 -*test.test_future_stmt.test_future.FutureTest.test_ensure_flags_dont_clash -*test.test_future_stmt.test_future.FutureTest.test_future1 -*test.test_future_stmt.test_future.FutureTest.test_future2 -*test.test_future_stmt.test_future.FutureTest.test_future_multiple_features -*test.test_future_stmt.test_future.FutureTest.test_future_multiple_imports -*test.test_future_stmt.test_future.FutureTest.test_future_single_import -*test.test_future_stmt.test_future.FutureTest.test_parserhack -*test.test_future_stmt.test_future.FutureTest.test_unicode_literals_exec -*test.test_future_stmt.test_future_flags.FutureTest.test_attributes -*test.test_future_stmt.test_future_flags.FutureTest.test_names -*test.test_future_stmt.test_future_multiple_features.TestMultipleFeatures.test_print_function -*test.test_future_stmt.test_future_multiple_features.TestMultipleFeatures.test_unicode_literals -*test.test_future_stmt.test_future_multiple_imports.Tests.test_unicode_literals -*test.test_future_stmt.test_future_single_import.TestFuture.test_floor_div_operator -*test.test_future_stmt.test_future_single_import.TestFuture.test_nested_scopes -*test.test_future_stmt.test_future_single_import.TestFuture.test_true_div_as_default +test.test_future_stmt.test_future.AnnotationsFutureTestCase.test_annotation_with_complex_target @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future.AnnotationsFutureTestCase.test_annotations_forbidden @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future.AnnotationsFutureTestCase.test_annotations_symbol_table_pass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future.AnnotationsFutureTestCase.test_get_type_hints_on_func_with_variadic_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future.FutureTest.test_badfuture10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future.FutureTest.test_badfuture3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future.FutureTest.test_badfuture4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future.FutureTest.test_badfuture5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future.FutureTest.test_badfuture6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future.FutureTest.test_badfuture8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future.FutureTest.test_badfuture9 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future.FutureTest.test_ensure_flags_dont_clash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future.FutureTest.test_future1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future.FutureTest.test_future2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future.FutureTest.test_future_multiple_features @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future.FutureTest.test_future_multiple_imports @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future.FutureTest.test_future_single_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future.FutureTest.test_parserhack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future.FutureTest.test_unicode_literals_exec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future_flags.FutureTest.test_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future_flags.FutureTest.test_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future_multiple_features.TestMultipleFeatures.test_print_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future_multiple_features.TestMultipleFeatures.test_unicode_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future_multiple_imports.Tests.test_unicode_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future_single_import.TestFuture.test_floor_div_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future_single_import.TestFuture.test_nested_scopes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_future_stmt.test_future_single_import.TestFuture.test_true_div_as_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_gc.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_gc.txt index 865bf06e86..fc1de1865e 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_gc.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_gc.txt @@ -1,14 +1,4 @@ -*graalpython.lib-python.3.test.test_gc.GCCallbackTests.test_collect_garbage -*graalpython.lib-python.3.test.test_gc.GCCallbackTests.test_refcount_errors -*graalpython.lib-python.3.test.test_gc.GCTests.test_bug1055820b -*graalpython.lib-python.3.test.test_gc.GCTests.test_bug21435 -*graalpython.lib-python.3.test.test_gc.GCTests.test_collect_generations -*graalpython.lib-python.3.test.test_gc.GCTests.test_frame -*graalpython.lib-python.3.test.test_gc.GCTests.test_garbage_at_shutdown -*graalpython.lib-python.3.test.test_gc.GCTests.test_get_count -*graalpython.lib-python.3.test.test_gc.GCTests.test_is_finalized -*graalpython.lib-python.3.test.test_gc.GCTests.test_legacy_finalizer -*graalpython.lib-python.3.test.test_gc.GCTests.test_legacy_finalizer_newclass -*graalpython.lib-python.3.test.test_gc.GCTests.test_trash_weakref_clear -*graalpython.lib-python.3.test.test_gc.GCTests.test_trashcan -*graalpython.lib-python.3.test.test_gc.PythonFinalizationTests.test_ast_fini +test.test_gc.GCTests.test_bug21435 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gc.GCTests.test_trash_weakref_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_gc.GCTests.test_trashcan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gc.PythonFinalizationTests.test_ast_fini @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_generator_stop.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_generator_stop.txt index 5d097cec0b..0581d7671e 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_generator_stop.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_generator_stop.txt @@ -1,2 +1,2 @@ -*graalpython.lib-python.3.test.test_generator_stop.TestPEP479.test_stopiteration_wrapping -*graalpython.lib-python.3.test.test_generator_stop.TestPEP479.test_stopiteration_wrapping_context +test.test_generator_stop.TestPEP479.test_stopiteration_wrapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generator_stop.TestPEP479.test_stopiteration_wrapping_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_generators.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_generators.txt index 52ed00d8ec..4946e695de 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_generators.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_generators.txt @@ -1,29 +1,34 @@ -*graalpython.lib-python.3.test.test_generators.ExceptionTest.test_except_gen_except -*graalpython.lib-python.3.test.test_generators.ExceptionTest.test_except_next -*graalpython.lib-python.3.test.test_generators.ExceptionTest.test_except_throw -*graalpython.lib-python.3.test.test_generators.ExceptionTest.test_except_throw_bad_exception -*graalpython.lib-python.3.test.test_generators.ExceptionTest.test_except_throw_exception_context -*graalpython.lib-python.3.test.test_generators.ExceptionTest.test_return_stopiteration -*graalpython.lib-python.3.test.test_generators.ExceptionTest.test_return_tuple -*graalpython.lib-python.3.test.test_generators.ExceptionTest.test_stopiteration_error -*graalpython.lib-python.3.test.test_generators.ExceptionTest.test_tutorial_stopiteration -*graalpython.lib-python.3.test.test_generators.FinalizationTest.test_frame_resurrect -*graalpython.lib-python.3.test.test_generators.FinalizationTest.test_lambda_generator -*graalpython.lib-python.3.test.test_generators.FinalizationTest.test_refcycle -*graalpython.lib-python.3.test.test_generators.GeneratorStackTraceTest.test_send_with_yield_from -*graalpython.lib-python.3.test.test_generators.GeneratorStackTraceTest.test_throw_with_yield_from -*graalpython.lib-python.3.test.test_generators.GeneratorTest.test_ag_frame_f_back -*graalpython.lib-python.3.test.test_generators.GeneratorTest.test_copy -*graalpython.lib-python.3.test.test_generators.GeneratorTest.test_cr_frame_f_back -*graalpython.lib-python.3.test.test_generators.GeneratorTest.test_gi_frame_f_back -*graalpython.lib-python.3.test.test_generators.GeneratorTest.test_name -*graalpython.lib-python.3.test.test_generators.GeneratorTest.test_pickle -*graalpython.lib-python.3.test.test_generators.GeneratorTest.test_send_non_none_to_new_gen -*graalpython.lib-python.3.test.test_generators.GeneratorThrowTest.test_exception_context_with_yield -*graalpython.lib-python.3.test.test_generators.GeneratorThrowTest.test_exception_context_with_yield_from -*graalpython.lib-python.3.test.test_generators.GeneratorThrowTest.test_exception_context_with_yield_from_with_context_cycle -*graalpython.lib-python.3.test.test_generators.GeneratorThrowTest.test_exception_context_with_yield_inside_generator -*graalpython.lib-python.3.test.test_generators.GeneratorThrowTest.test_throw_after_none_exc_type -*graalpython.lib-python.3.test.test_generators.SignalAndYieldFromTest.test_raise_and_yield_from -*graalpython.lib-python.3.test.test_generators.TestMain.test_main -*graalpython.lib-python.3.test.test_generators.YieldFromTests.test_generator_gi_yieldfrom +DocTestCase.test.test_generators.__test__.conjoin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_generators.__test__.coroutine @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_generators.__test__.email @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_generators.__test__.fun @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_generators.__test__.pep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_generators.__test__.refleaks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_generators.__test__.syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_generators.__test__.tut @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_generators.__test__.weakref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.ExceptionTest.test_except_gen_except @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.ExceptionTest.test_except_next @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.ExceptionTest.test_except_throw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.ExceptionTest.test_except_throw_bad_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.ExceptionTest.test_except_throw_exception_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.ExceptionTest.test_return_stopiteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.ExceptionTest.test_return_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.ExceptionTest.test_stopiteration_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.ExceptionTest.test_tutorial_stopiteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.FinalizationTest.test_lambda_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.GeneratorStackTraceTest.test_send_with_yield_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.GeneratorStackTraceTest.test_throw_with_yield_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.GeneratorTest.test_ag_frame_f_back @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.GeneratorTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.GeneratorTest.test_cr_frame_f_back @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.GeneratorTest.test_gi_frame_f_back @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.GeneratorTest.test_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.GeneratorTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.GeneratorTest.test_send_non_none_to_new_gen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.GeneratorThrowTest.test_exception_context_with_yield @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.GeneratorThrowTest.test_exception_context_with_yield_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.GeneratorThrowTest.test_exception_context_with_yield_from_with_context_cycle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.GeneratorThrowTest.test_exception_context_with_yield_inside_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.GeneratorThrowTest.test_throw_after_none_exc_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_generators.YieldFromTests.test_generator_gi_yieldfrom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_genericalias.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_genericalias.txt index 769078acf0..0edbee9306 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_genericalias.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_genericalias.txt @@ -1,31 +1,31 @@ -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_calling_next_twice_raises_stopiteration -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_class_methods -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_copy -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_del_iter -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_dir -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_equality -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_exposed_type -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_generic_subclass -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_instantiate -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_isinstance -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_issubclass -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_iter_creates_starred_tuple -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_no_chaining -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_no_kwargs -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_parameter_chaining -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_parameters -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_pickle -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_repr -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_subclassing -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_subclassing_types_genericalias -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_subscriptable -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_type_generic -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_type_subclass_generic -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_unbound_methods -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_union -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_union_generic -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_unpack -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_unsubscriptable -*graalpython.lib-python.3.test.test_genericalias.BaseTest.test_weakref -*graalpython.lib-python.3.test.test_genericalias.TypeIterationTests.test_cannot_iterate -*graalpython.lib-python.3.test.test_genericalias.TypeIterationTests.test_is_not_instance_of_iterable +test.test_genericalias.BaseTest.test_calling_next_twice_raises_stopiteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_class_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_del_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_exposed_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_generic_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_instantiate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_isinstance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_issubclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_iter_creates_starred_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_no_chaining @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_no_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_parameter_chaining @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_parameters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_subclassing_types_genericalias @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_subscriptable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_type_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_type_subclass_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_unbound_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_union_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_unpack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_unsubscriptable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.BaseTest.test_weakref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.TypeIterationTests.test_cannot_iterate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericalias.TypeIterationTests.test_is_not_instance_of_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_genericclass.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_genericclass.txt index e1d665ef01..3fadb69c55 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_genericclass.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_genericclass.txt @@ -1,22 +1,21 @@ -*graalpython.lib-python.3.test.test_genericclass.CAPITest.test_c_class -*graalpython.lib-python.3.test.test_genericclass.TestClassGetitem.test_class_getitem -*graalpython.lib-python.3.test.test_genericclass.TestClassGetitem.test_class_getitem_classmethod -*graalpython.lib-python.3.test.test_genericclass.TestClassGetitem.test_class_getitem_errors -*graalpython.lib-python.3.test.test_genericclass.TestClassGetitem.test_class_getitem_errors_2 -*graalpython.lib-python.3.test.test_genericclass.TestClassGetitem.test_class_getitem_format -*graalpython.lib-python.3.test.test_genericclass.TestClassGetitem.test_class_getitem_inheritance -*graalpython.lib-python.3.test.test_genericclass.TestClassGetitem.test_class_getitem_inheritance_2 -*graalpython.lib-python.3.test.test_genericclass.TestClassGetitem.test_class_getitem_metaclass -*graalpython.lib-python.3.test.test_genericclass.TestClassGetitem.test_class_getitem_metaclass_first -*graalpython.lib-python.3.test.test_genericclass.TestClassGetitem.test_class_getitem_patched -*graalpython.lib-python.3.test.test_genericclass.TestClassGetitem.test_class_getitem_with_builtins -*graalpython.lib-python.3.test.test_genericclass.TestClassGetitem.test_class_getitem_with_metaclass -*graalpython.lib-python.3.test.test_genericclass.TestMROEntry.test_mro_entry -*graalpython.lib-python.3.test.test_genericclass.TestMROEntry.test_mro_entry_errors -*graalpython.lib-python.3.test.test_genericclass.TestMROEntry.test_mro_entry_errors_2 -*graalpython.lib-python.3.test.test_genericclass.TestMROEntry.test_mro_entry_metaclass -*graalpython.lib-python.3.test.test_genericclass.TestMROEntry.test_mro_entry_none -*graalpython.lib-python.3.test.test_genericclass.TestMROEntry.test_mro_entry_signature -*graalpython.lib-python.3.test.test_genericclass.TestMROEntry.test_mro_entry_type_call -*graalpython.lib-python.3.test.test_genericclass.TestMROEntry.test_mro_entry_with_builtins -*graalpython.lib-python.3.test.test_genericclass.TestMROEntry.test_mro_entry_with_builtins_2 +test.test_genericclass.TestClassGetitem.test_class_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestClassGetitem.test_class_getitem_classmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestClassGetitem.test_class_getitem_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestClassGetitem.test_class_getitem_errors_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestClassGetitem.test_class_getitem_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestClassGetitem.test_class_getitem_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestClassGetitem.test_class_getitem_inheritance_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestClassGetitem.test_class_getitem_metaclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestClassGetitem.test_class_getitem_metaclass_first @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestClassGetitem.test_class_getitem_patched @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestClassGetitem.test_class_getitem_with_builtins @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestClassGetitem.test_class_getitem_with_metaclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestMROEntry.test_mro_entry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestMROEntry.test_mro_entry_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestMROEntry.test_mro_entry_errors_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestMROEntry.test_mro_entry_metaclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestMROEntry.test_mro_entry_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestMROEntry.test_mro_entry_signature @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestMROEntry.test_mro_entry_type_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestMROEntry.test_mro_entry_with_builtins @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericclass.TestMROEntry.test_mro_entry_with_builtins_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_genericpath.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_genericpath.txt index 19fa6149d7..b7f2d6184b 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_genericpath.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_genericpath.txt @@ -1,24 +1,24 @@ -*graalpython.lib-python.3.test.test_genericpath.PathLikeTests.test_path_commonprefix -*graalpython.lib-python.3.test.test_genericpath.PathLikeTests.test_path_exists -*graalpython.lib-python.3.test.test_genericpath.PathLikeTests.test_path_getctime -*graalpython.lib-python.3.test.test_genericpath.PathLikeTests.test_path_getmtime -*graalpython.lib-python.3.test.test_genericpath.PathLikeTests.test_path_getsize -*graalpython.lib-python.3.test.test_genericpath.PathLikeTests.test_path_isdir -*graalpython.lib-python.3.test.test_genericpath.PathLikeTests.test_path_isfile -*graalpython.lib-python.3.test.test_genericpath.PathLikeTests.test_path_samefile -*graalpython.lib-python.3.test.test_genericpath.TestGenericTest.test_commonprefix -*graalpython.lib-python.3.test.test_genericpath.TestGenericTest.test_exists -*graalpython.lib-python.3.test.test_genericpath.TestGenericTest.test_exists_fd -*graalpython.lib-python.3.test.test_genericpath.TestGenericTest.test_filetime -*graalpython.lib-python.3.test.test_genericpath.TestGenericTest.test_getsize -*graalpython.lib-python.3.test.test_genericpath.TestGenericTest.test_invalid_paths -*graalpython.lib-python.3.test.test_genericpath.TestGenericTest.test_isdir -*graalpython.lib-python.3.test.test_genericpath.TestGenericTest.test_isfile -*graalpython.lib-python.3.test.test_genericpath.TestGenericTest.test_no_argument -*graalpython.lib-python.3.test.test_genericpath.TestGenericTest.test_samefile -*graalpython.lib-python.3.test.test_genericpath.TestGenericTest.test_samefile_on_link -*graalpython.lib-python.3.test.test_genericpath.TestGenericTest.test_samefile_on_symlink -*graalpython.lib-python.3.test.test_genericpath.TestGenericTest.test_sameopenfile -*graalpython.lib-python.3.test.test_genericpath.TestGenericTest.test_samestat -*graalpython.lib-python.3.test.test_genericpath.TestGenericTest.test_samestat_on_link -*graalpython.lib-python.3.test.test_genericpath.TestGenericTest.test_samestat_on_symlink +test.test_genericpath.PathLikeTests.test_path_commonprefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.PathLikeTests.test_path_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.PathLikeTests.test_path_getctime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.PathLikeTests.test_path_getmtime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.PathLikeTests.test_path_getsize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.PathLikeTests.test_path_isdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.PathLikeTests.test_path_isfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.PathLikeTests.test_path_samefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.TestGenericTest.test_commonprefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.TestGenericTest.test_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.TestGenericTest.test_exists_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.TestGenericTest.test_filetime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.TestGenericTest.test_getsize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.TestGenericTest.test_invalid_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.TestGenericTest.test_isdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.TestGenericTest.test_isfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.TestGenericTest.test_no_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.TestGenericTest.test_samefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.TestGenericTest.test_samefile_on_link @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_genericpath.TestGenericTest.test_samefile_on_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.TestGenericTest.test_sameopenfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.TestGenericTest.test_samestat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_genericpath.TestGenericTest.test_samestat_on_link @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_genericpath.TestGenericTest.test_samestat_on_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_genexps.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_genexps.txt index 3c62e506fe..00c0e5d41d 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_genexps.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_genexps.txt @@ -1 +1 @@ -*graalpython.lib-python.3.test.test_genexps.TestMain.test_main +DocTestCase.test.test_genexps.__test__.doctests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_getopt.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_getopt.txt index 851bbcc48c..6bda928a1c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_getopt.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_getopt.txt @@ -1,8 +1,8 @@ -*graalpython.lib-python.3.test.test_getopt.GetoptTests.test_do_longs -*graalpython.lib-python.3.test.test_getopt.GetoptTests.test_do_shorts -*graalpython.lib-python.3.test.test_getopt.GetoptTests.test_getopt -*graalpython.lib-python.3.test.test_getopt.GetoptTests.test_gnu_getopt -*graalpython.lib-python.3.test.test_getopt.GetoptTests.test_issue4629 -*graalpython.lib-python.3.test.test_getopt.GetoptTests.test_libref_examples -*graalpython.lib-python.3.test.test_getopt.GetoptTests.test_long_has_args -*graalpython.lib-python.3.test.test_getopt.GetoptTests.test_short_has_arg +DocTestCase.test.test_getopt.test_libref_examples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_getopt.GetoptTests.test_do_longs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_getopt.GetoptTests.test_do_shorts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_getopt.GetoptTests.test_getopt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_getopt.GetoptTests.test_gnu_getopt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_getopt.GetoptTests.test_issue4629 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_getopt.GetoptTests.test_long_has_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_getopt.GetoptTests.test_short_has_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_getpass.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_getpass.txt index 8427f00be0..582a4ea880 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_getpass.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_getpass.txt @@ -1,12 +1,14 @@ -*graalpython.lib-python.3.test.test_getpass.GetpassGetuserTest.test_username_falls_back_to_pwd -*graalpython.lib-python.3.test.test_getpass.GetpassGetuserTest.test_username_priorities_of_env_values -*graalpython.lib-python.3.test.test_getpass.GetpassGetuserTest.test_username_takes_username_from_env -*graalpython.lib-python.3.test.test_getpass.GetpassRawinputTest.test_flushes_stream_after_prompt -*graalpython.lib-python.3.test.test_getpass.GetpassRawinputTest.test_raises_on_empty_input -*graalpython.lib-python.3.test.test_getpass.GetpassRawinputTest.test_trims_trailing_newline -*graalpython.lib-python.3.test.test_getpass.GetpassRawinputTest.test_uses_stderr_as_default -*graalpython.lib-python.3.test.test_getpass.GetpassRawinputTest.test_uses_stdin_as_default_input -*graalpython.lib-python.3.test.test_getpass.GetpassRawinputTest.test_uses_stdin_as_different_locale -*graalpython.lib-python.3.test.test_getpass.UnixGetpassTest.test_falls_back_to_stdin -*graalpython.lib-python.3.test.test_getpass.UnixGetpassTest.test_resets_termios -*graalpython.lib-python.3.test.test_getpass.UnixGetpassTest.test_uses_tty_directly +test.test_getpass.GetpassGetuserTest.test_username_falls_back_to_pwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_getpass.GetpassGetuserTest.test_username_priorities_of_env_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_getpass.GetpassGetuserTest.test_username_takes_username_from_env @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_getpass.GetpassRawinputTest.test_flushes_stream_after_prompt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_getpass.GetpassRawinputTest.test_raises_on_empty_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_getpass.GetpassRawinputTest.test_trims_trailing_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_getpass.GetpassRawinputTest.test_uses_stderr_as_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_getpass.GetpassRawinputTest.test_uses_stdin_as_default_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_getpass.GetpassRawinputTest.test_uses_stdin_as_different_locale @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_getpass.UnixGetpassTest.test_falls_back_to_fallback_if_termios_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_getpass.UnixGetpassTest.test_falls_back_to_stdin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_getpass.UnixGetpassTest.test_flushes_stream_after_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_getpass.UnixGetpassTest.test_resets_termios @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_getpass.UnixGetpassTest.test_uses_tty_directly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_gettext.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_gettext.txt index 2bb9b1163c..f0452cb9e5 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_gettext.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_gettext.txt @@ -1,76 +1,43 @@ -*graalpython.lib-python.3.test.test_gettext.GNUTranslationParsingTest.test_ignore_comments_in_headers_issue36239 -*graalpython.lib-python.3.test.test_gettext.GNUTranslationParsingTest.test_plural_form_error_issue17898 -*graalpython.lib-python.3.test.test_gettext.GNUTranslationsClassPluralFormsTestCase.test_plural_context_forms -*graalpython.lib-python.3.test.test_gettext.GNUTranslationsClassPluralFormsTestCase.test_plural_context_forms_null_translations -*graalpython.lib-python.3.test.test_gettext.GNUTranslationsClassPluralFormsTestCase.test_plural_forms -*graalpython.lib-python.3.test.test_gettext.GNUTranslationsClassPluralFormsTestCase.test_plural_forms_null_translations -*graalpython.lib-python.3.test.test_gettext.GNUTranslationsClassPluralFormsTestCase.test_plural_wrong_context_forms -*graalpython.lib-python.3.test.test_gettext.GNUTranslationsPluralFormsTestCase.test_plural_context_forms -*graalpython.lib-python.3.test.test_gettext.GNUTranslationsPluralFormsTestCase.test_plural_forms -*graalpython.lib-python.3.test.test_gettext.GNUTranslationsPluralFormsTestCase.test_plural_wrong_context_forms -*graalpython.lib-python.3.test.test_gettext.GNUTranslationsWithDomainPluralFormsTestCase.test_plural_context_forms -*graalpython.lib-python.3.test.test_gettext.GNUTranslationsWithDomainPluralFormsTestCase.test_plural_context_forms_wrong_domain -*graalpython.lib-python.3.test.test_gettext.GNUTranslationsWithDomainPluralFormsTestCase.test_plural_forms -*graalpython.lib-python.3.test.test_gettext.GNUTranslationsWithDomainPluralFormsTestCase.test_plural_forms_wrong_domain -*graalpython.lib-python.3.test.test_gettext.GNUTranslationsWithDomainPluralFormsTestCase.test_plural_wrong_context_forms -*graalpython.lib-python.3.test.test_gettext.GettextCacheTestCase.test_cache -*graalpython.lib-python.3.test.test_gettext.GettextTestCase1.test_double_quotes -*graalpython.lib-python.3.test.test_gettext.GettextTestCase1.test_multiline_strings -*graalpython.lib-python.3.test.test_gettext.GettextTestCase1.test_some_translations -*graalpython.lib-python.3.test.test_gettext.GettextTestCase1.test_some_translations_with_context -*graalpython.lib-python.3.test.test_gettext.GettextTestCase1.test_the_alternative_interface -*graalpython.lib-python.3.test.test_gettext.GettextTestCase1.test_triple_double_quotes -*graalpython.lib-python.3.test.test_gettext.GettextTestCase1.test_triple_single_quotes -*graalpython.lib-python.3.test.test_gettext.GettextTestCase2.test_bad_major_version -*graalpython.lib-python.3.test.test_gettext.GettextTestCase2.test_bad_minor_version -*graalpython.lib-python.3.test.test_gettext.GettextTestCase2.test_bindtextdomain -*graalpython.lib-python.3.test.test_gettext.GettextTestCase2.test_double_quotes -*graalpython.lib-python.3.test.test_gettext.GettextTestCase2.test_multiline_strings -*graalpython.lib-python.3.test.test_gettext.GettextTestCase2.test_some_translations -*graalpython.lib-python.3.test.test_gettext.GettextTestCase2.test_some_translations_with_context -*graalpython.lib-python.3.test.test_gettext.GettextTestCase2.test_some_translations_with_context_and_domain -*graalpython.lib-python.3.test.test_gettext.GettextTestCase2.test_textdomain -*graalpython.lib-python.3.test.test_gettext.GettextTestCase2.test_triple_double_quotes -*graalpython.lib-python.3.test.test_gettext.GettextTestCase2.test_triple_single_quotes -*graalpython.lib-python.3.test.test_gettext.LGettextTestCase.test_lgettext -*graalpython.lib-python.3.test.test_gettext.LGettextTestCase.test_lgettext_2 -*graalpython.lib-python.3.test.test_gettext.LGettextTestCase.test_lgettext_bind_textdomain_codeset -*graalpython.lib-python.3.test.test_gettext.LGettextTestCase.test_lgettext_output_encoding -*graalpython.lib-python.3.test.test_gettext.LGettextTestCase.test_lngettext -*graalpython.lib-python.3.test.test_gettext.LGettextTestCase.test_lngettext_2 -*graalpython.lib-python.3.test.test_gettext.LGettextTestCase.test_lngettext_bind_textdomain_codeset -*graalpython.lib-python.3.test.test_gettext.LGettextTestCase.test_lngettext_output_encoding -*graalpython.lib-python.3.test.test_gettext.LGettextTestCase.test_output_encoding -*graalpython.lib-python.3.test.test_gettext.MiscTestCase.test__all__ -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_ar -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_chained_comparison -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_cs -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_de -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_decimal_number -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_division -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_fr -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_gd -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_gd2 -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_invalid_syntax -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_ja -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_lt -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_lv -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_nested_condition_operator -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_pl -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_plural_context_forms1 -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_plural_context_forms2 -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_plural_forms1 -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_plural_forms2 -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_plural_number -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_ro -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_ru -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_security -*graalpython.lib-python.3.test.test_gettext.PluralFormsTestCase.test_sl -*graalpython.lib-python.3.test.test_gettext.UnicodeTranslationsPluralTest.test_unicode_context_msgid -*graalpython.lib-python.3.test.test_gettext.UnicodeTranslationsPluralTest.test_unicode_msgid -*graalpython.lib-python.3.test.test_gettext.UnicodeTranslationsPluralTest.test_unicode_msgstr -*graalpython.lib-python.3.test.test_gettext.UnicodeTranslationsPluralTest.test_unicode_msgstr_with_context -*graalpython.lib-python.3.test.test_gettext.UnicodeTranslationsTest.test_unicode_context_msgstr -*graalpython.lib-python.3.test.test_gettext.UnicodeTranslationsTest.test_unicode_msgid -*graalpython.lib-python.3.test.test_gettext.UnicodeTranslationsTest.test_unicode_msgstr -*graalpython.lib-python.3.test.test_gettext.WeirdMetadataTest.test_weird_metadata +test.test_gettext.GNUTranslationParsingTest.test_ignore_comments_in_headers_issue36239 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GNUTranslationParsingTest.test_plural_form_error_issue17898 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GNUTranslationsClassPluralFormsTestCase.test_plural_context_forms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GNUTranslationsClassPluralFormsTestCase.test_plural_context_forms_null_translations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GNUTranslationsClassPluralFormsTestCase.test_plural_forms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GNUTranslationsClassPluralFormsTestCase.test_plural_forms_null_translations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GNUTranslationsClassPluralFormsTestCase.test_plural_wrong_context_forms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GNUTranslationsPluralFormsTestCase.test_plural_context_forms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GNUTranslationsPluralFormsTestCase.test_plural_forms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GNUTranslationsPluralFormsTestCase.test_plural_wrong_context_forms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GNUTranslationsWithDomainPluralFormsTestCase.test_plural_context_forms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GNUTranslationsWithDomainPluralFormsTestCase.test_plural_context_forms_wrong_domain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GNUTranslationsWithDomainPluralFormsTestCase.test_plural_forms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GNUTranslationsWithDomainPluralFormsTestCase.test_plural_forms_wrong_domain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GNUTranslationsWithDomainPluralFormsTestCase.test_plural_wrong_context_forms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextCacheTestCase.test_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextTestCase1.test_double_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextTestCase1.test_multiline_strings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextTestCase1.test_some_translations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextTestCase1.test_some_translations_with_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextTestCase1.test_the_alternative_interface @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextTestCase1.test_triple_double_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextTestCase1.test_triple_single_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextTestCase2.test_bad_major_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextTestCase2.test_bad_minor_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextTestCase2.test_bindtextdomain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextTestCase2.test_double_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextTestCase2.test_multiline_strings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextTestCase2.test_some_translations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextTestCase2.test_some_translations_with_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextTestCase2.test_some_translations_with_context_and_domain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextTestCase2.test_textdomain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextTestCase2.test_triple_double_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.GettextTestCase2.test_triple_single_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.MiscTestCase.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.UnicodeTranslationsPluralTest.test_unicode_context_msgid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.UnicodeTranslationsPluralTest.test_unicode_msgid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.UnicodeTranslationsPluralTest.test_unicode_msgstr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.UnicodeTranslationsPluralTest.test_unicode_msgstr_with_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.UnicodeTranslationsTest.test_unicode_context_msgstr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.UnicodeTranslationsTest.test_unicode_msgid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.UnicodeTranslationsTest.test_unicode_msgstr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gettext.WeirdMetadataTest.test_weird_metadata @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_glob.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_glob.txt index 13a484f720..f52d452ff4 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_glob.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_glob.txt @@ -1,16 +1,15 @@ -*graalpython.lib-python.3.test.test_glob.GlobTests.test_escape -*graalpython.lib-python.3.test.test_glob.GlobTests.test_escape_windows -*graalpython.lib-python.3.test.test_glob.GlobTests.test_glob_broken_symlinks -*graalpython.lib-python.3.test.test_glob.GlobTests.test_glob_bytes_directory_with_trailing_slash -*graalpython.lib-python.3.test.test_glob.GlobTests.test_glob_directory_names -*graalpython.lib-python.3.test.test_glob.GlobTests.test_glob_directory_with_trailing_slash -*graalpython.lib-python.3.test.test_glob.GlobTests.test_glob_empty_pattern -*graalpython.lib-python.3.test.test_glob.GlobTests.test_glob_literal -*graalpython.lib-python.3.test.test_glob.GlobTests.test_glob_magic_in_drive -*graalpython.lib-python.3.test.test_glob.GlobTests.test_glob_many_open_files -*graalpython.lib-python.3.test.test_glob.GlobTests.test_glob_nested_directory -*graalpython.lib-python.3.test.test_glob.GlobTests.test_glob_one_directory -*graalpython.lib-python.3.test.test_glob.GlobTests.test_glob_symlinks -*graalpython.lib-python.3.test.test_glob.GlobTests.test_hidden_glob -*graalpython.lib-python.3.test.test_glob.GlobTests.test_recursive_glob -*graalpython.lib-python.3.test.test_glob.SymlinkLoopGlobTests.test_selflink +test.test_glob.GlobTests.test_escape @ darwin-arm64,darwin-x86_64,linux-x86_64 +test.test_glob.GlobTests.test_glob_broken_symlinks @ darwin-arm64,darwin-x86_64,linux-x86_64 +test.test_glob.GlobTests.test_glob_bytes_directory_with_trailing_slash @ darwin-arm64,darwin-x86_64,linux-x86_64 +test.test_glob.GlobTests.test_glob_directory_names @ darwin-arm64,darwin-x86_64,linux-x86_64 +test.test_glob.GlobTests.test_glob_directory_with_trailing_slash @ darwin-arm64,darwin-x86_64,linux-x86_64 +test.test_glob.GlobTests.test_glob_empty_pattern @ darwin-arm64,darwin-x86_64,linux-x86_64 +test.test_glob.GlobTests.test_glob_literal @ darwin-arm64,darwin-x86_64,linux-x86_64 +test.test_glob.GlobTests.test_glob_many_open_files @ darwin-arm64,darwin-x86_64,linux-x86_64 +test.test_glob.GlobTests.test_glob_nested_directory @ darwin-arm64,darwin-x86_64,linux-x86_64 +test.test_glob.GlobTests.test_glob_one_directory @ darwin-arm64,darwin-x86_64,linux-x86_64 +test.test_glob.GlobTests.test_glob_symlinks @ darwin-arm64,darwin-x86_64,linux-x86_64 +test.test_glob.GlobTests.test_hidden_glob @ darwin-arm64,darwin-x86_64,linux-x86_64 +test.test_glob.GlobTests.test_recursive_glob @ darwin-arm64,darwin-x86_64,linux-x86_64 +# Transiently fails at line 395 +!test.test_glob.SymlinkLoopGlobTests.test_selflink @ darwin-arm64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_global.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_global.txt index e9f2f36d76..b25e556719 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_global.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_global.txt @@ -1,5 +1,4 @@ -*graalpython.lib-python.3.test.test_global.GlobalTests.test1 -*graalpython.lib-python.3.test.test_global.GlobalTests.test2 -*graalpython.lib-python.3.test.test_global.GlobalTests.test3 -*graalpython.lib-python.3.test.test_global.GlobalTests.test4 -*graalpython.lib-python.3.test.test_global.TestMain.test_main +test.test_global.GlobalTests.test1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_global.GlobalTests.test2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_global.GlobalTests.test3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_global.GlobalTests.test4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_grammar.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_grammar.txt index 4c134bd7e5..c25b56af1d 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_grammar.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_grammar.txt @@ -1,77 +1,77 @@ -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_additive_ops -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_annotations_inheritance -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_assert -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_assert_failures -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_assert_syntax_warnings -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_assert_warning_promotes_to_syntax_error -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_async_await -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_async_for -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_async_with -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_atoms -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_binary_mask_ops -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_break_continue_loop -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_break_in_finally -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_break_in_finally_after_return -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_break_stmt -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_classdef -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_comparison -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_comparison_is_literal -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_comprehension_specials -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_continue_in_finally -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_continue_in_finally_after_return -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_continue_stmt -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_del_stmt -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_dictcomps -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_eval_input -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_expr_stmt -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_for -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_former_statements_refer_to_builtins -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_funcdef -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_genexps -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_global -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_if -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_if_else_expr -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_import -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_lambdef -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_listcomps -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_matrix_mul -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_multiplicative_ops -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_nonlocal -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_paren_evaluation -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_pass_stmt -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_raise -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_return -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_return_in_finally -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_selectors -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_shift_ops -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_simple_stmt -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_suite -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_test -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_try -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_unary_ops -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_var_annot_basic_semantics -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_var_annot_basics -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_var_annot_custom_maps -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_var_annot_in_module -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_var_annot_metaclass_semantics -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_var_annot_module_semantics -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_var_annot_refleak -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_var_annot_rhs -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_var_annot_simple_exec -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_var_annot_syntax_errors -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_warn_missed_comma -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_while -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_with_statement -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_yield -*graalpython.lib-python.3.test.test_grammar.GrammarTests.test_yield_in_comprehensions -*graalpython.lib-python.3.test.test_grammar.TokenTests.test_backslash -*graalpython.lib-python.3.test.test_grammar.TokenTests.test_bad_numerical_literals -*graalpython.lib-python.3.test.test_grammar.TokenTests.test_ellipsis -*graalpython.lib-python.3.test.test_grammar.TokenTests.test_end_of_numerical_literals -*graalpython.lib-python.3.test.test_grammar.TokenTests.test_eof_error -*graalpython.lib-python.3.test.test_grammar.TokenTests.test_float_exponent_tokenization -*graalpython.lib-python.3.test.test_grammar.TokenTests.test_floats -*graalpython.lib-python.3.test.test_grammar.TokenTests.test_long_integers -*graalpython.lib-python.3.test.test_grammar.TokenTests.test_plain_integers -*graalpython.lib-python.3.test.test_grammar.TokenTests.test_string_literals -*graalpython.lib-python.3.test.test_grammar.TokenTests.test_underscore_literals +test.test_grammar.GrammarTests.test_additive_ops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_annotations_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_assert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_assert_failures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_assert_syntax_warnings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_assert_warning_promotes_to_syntax_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_async_await @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_async_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_async_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_atoms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_binary_mask_ops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_break_continue_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_break_in_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_break_in_finally_after_return @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_break_stmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_classdef @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_comparison_is_literal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_comprehension_specials @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_continue_in_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_continue_in_finally_after_return @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_continue_stmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_del_stmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_dictcomps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_eval_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_expr_stmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_former_statements_refer_to_builtins @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_funcdef @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_genexps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_global @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_if @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_if_else_expr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_lambdef @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_listcomps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_matrix_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_multiplicative_ops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_nonlocal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_paren_evaluation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_pass_stmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_return @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_return_in_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_selectors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_shift_ops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_simple_stmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_suite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_try @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_unary_ops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_var_annot_basic_semantics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_var_annot_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_var_annot_custom_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_var_annot_in_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_var_annot_metaclass_semantics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_var_annot_module_semantics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_var_annot_refleak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_var_annot_rhs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_var_annot_simple_exec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_var_annot_syntax_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_warn_missed_comma @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_while @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_with_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_yield @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.GrammarTests.test_yield_in_comprehensions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.TokenTests.test_backslash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.TokenTests.test_bad_numerical_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.TokenTests.test_ellipsis @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.TokenTests.test_end_of_numerical_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.TokenTests.test_eof_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.TokenTests.test_float_exponent_tokenization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.TokenTests.test_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.TokenTests.test_long_integers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.TokenTests.test_plain_integers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.TokenTests.test_string_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_grammar.TokenTests.test_underscore_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_graphlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_graphlib.txt index f38932fb08..aacf57d375 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_graphlib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_graphlib.txt @@ -1,15 +1,15 @@ -*graalpython.lib-python.3.test.test_graphlib.TestTopologicalSort.test_add_dependencies_for_same_node_incrementally -*graalpython.lib-python.3.test.test_graphlib.TestTopologicalSort.test_calls_before_prepare -*graalpython.lib-python.3.test.test_graphlib.TestTopologicalSort.test_cycle -*graalpython.lib-python.3.test.test_graphlib.TestTopologicalSort.test_done -*graalpython.lib-python.3.test.test_graphlib.TestTopologicalSort.test_empty -*graalpython.lib-python.3.test.test_graphlib.TestTopologicalSort.test_graph_with_iterables -*graalpython.lib-python.3.test.test_graphlib.TestTopologicalSort.test_invalid_nodes_in_done -*graalpython.lib-python.3.test.test_graphlib.TestTopologicalSort.test_is_active -*graalpython.lib-python.3.test.test_graphlib.TestTopologicalSort.test_no_dependencies -*graalpython.lib-python.3.test.test_graphlib.TestTopologicalSort.test_not_hashable_nodes -*graalpython.lib-python.3.test.test_graphlib.TestTopologicalSort.test_order_of_insertion_does_not_matter_between_groups -*graalpython.lib-python.3.test.test_graphlib.TestTopologicalSort.test_prepare_multiple_times -*graalpython.lib-python.3.test.test_graphlib.TestTopologicalSort.test_simple_cases -*graalpython.lib-python.3.test.test_graphlib.TestTopologicalSort.test_static_order_does_not_change_with_the_hash_seed -*graalpython.lib-python.3.test.test_graphlib.TestTopologicalSort.test_the_node_multiple_times +test.test_graphlib.TestTopologicalSort.test_add_dependencies_for_same_node_incrementally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_graphlib.TestTopologicalSort.test_calls_before_prepare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_graphlib.TestTopologicalSort.test_cycle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_graphlib.TestTopologicalSort.test_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_graphlib.TestTopologicalSort.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_graphlib.TestTopologicalSort.test_graph_with_iterables @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_graphlib.TestTopologicalSort.test_invalid_nodes_in_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_graphlib.TestTopologicalSort.test_is_active @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_graphlib.TestTopologicalSort.test_no_dependencies @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_graphlib.TestTopologicalSort.test_not_hashable_nodes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_graphlib.TestTopologicalSort.test_order_of_insertion_does_not_matter_between_groups @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_graphlib.TestTopologicalSort.test_prepare_multiple_times @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_graphlib.TestTopologicalSort.test_simple_cases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_graphlib.TestTopologicalSort.test_static_order_does_not_change_with_the_hash_seed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_graphlib.TestTopologicalSort.test_the_node_multiple_times @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_gzip.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_gzip.txt index 6eb660641b..76ba7b7396 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_gzip.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_gzip.txt @@ -1,65 +1,61 @@ -*graalpython.lib-python.3.test.test_gzip.TestCommandLine.test_compress_fast_best_are_exclusive -*graalpython.lib-python.3.test.test_gzip.TestCommandLine.test_compress_infile_outfile -*graalpython.lib-python.3.test.test_gzip.TestCommandLine.test_compress_infile_outfile_default -*graalpython.lib-python.3.test.test_gzip.TestCommandLine.test_compress_stdin_outfile -*graalpython.lib-python.3.test.test_gzip.TestCommandLine.test_decompress_cannot_have_flags_compression -*graalpython.lib-python.3.test.test_gzip.TestCommandLine.test_decompress_infile_outfile -*graalpython.lib-python.3.test.test_gzip.TestCommandLine.test_decompress_infile_outfile_error -*graalpython.lib-python.3.test.test_gzip.TestCommandLine.test_decompress_stdin_stdout -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_1647484 -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_append -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_bad_gzip_file -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_buffered_reader -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_bytes_filename -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_compress -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_compress_correct_level -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_compress_mtime -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_compresslevel_metadata -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_decompress -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_decompress_limited -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_decompress_missing_trailer -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_decompress_truncated_trailer -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_exclusive_write -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_fileobj_from_fdopen -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_fileobj_mode -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_gzip_BadGzipFile_exception -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_io_on_closed_object -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_issue44439 -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_many_append -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_metadata -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_metadata_ascii_name -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_mode -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_mtime -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_non_seekable_file -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_paddedfile_getattr -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_peek -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_prepend_error -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_read -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_read1 -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_read_large -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_read_truncated -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_read_with_extra -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_readline -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_readlines -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_seek_read -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_seek_whence -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_seek_write -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_textio_readlines -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_with_open -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_write -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_write_array -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_write_bytearray -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_write_incompatible_type -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_write_memoryview -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_write_read_with_pathlike_file -*graalpython.lib-python.3.test.test_gzip.TestGzip.test_zero_padded_file -*graalpython.lib-python.3.test.test_gzip.TestMain.test_main -*graalpython.lib-python.3.test.test_gzip.TestOpen.test_bad_params -*graalpython.lib-python.3.test.test_gzip.TestOpen.test_binary_modes -*graalpython.lib-python.3.test.test_gzip.TestOpen.test_encoding -*graalpython.lib-python.3.test.test_gzip.TestOpen.test_encoding_error_handler -*graalpython.lib-python.3.test.test_gzip.TestOpen.test_fileobj -*graalpython.lib-python.3.test.test_gzip.TestOpen.test_implicit_binary_modes -*graalpython.lib-python.3.test.test_gzip.TestOpen.test_newline -*graalpython.lib-python.3.test.test_gzip.TestOpen.test_pathlike_file -*graalpython.lib-python.3.test.test_gzip.TestOpen.test_text_modes +test.test_gzip.TestCommandLine.test_compress_fast_best_are_exclusive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestCommandLine.test_compress_infile_outfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_gzip.TestCommandLine.test_compress_infile_outfile_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_gzip.TestCommandLine.test_decompress_cannot_have_flags_compression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestCommandLine.test_decompress_infile_outfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_gzip.TestCommandLine.test_decompress_infile_outfile_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_1647484 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_bad_gzip_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_buffered_reader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_compress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_compress_correct_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_compress_mtime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_compresslevel_metadata @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_decompress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_decompress_limited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_decompress_missing_trailer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_decompress_truncated_trailer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_exclusive_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_fileobj_from_fdopen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_fileobj_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_gzip_BadGzipFile_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_io_on_closed_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_issue44439 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_many_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_metadata @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_metadata_ascii_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_mtime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_non_seekable_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_paddedfile_getattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_peek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_prepend_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_read1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_read_large @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_read_truncated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_read_with_extra @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_seek_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_seek_whence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_seek_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_textio_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_with_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_write_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_write_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_write_incompatible_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_write_memoryview @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_write_read_with_pathlike_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestGzip.test_zero_padded_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestOpen.test_bad_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestOpen.test_binary_modes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestOpen.test_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_gzip.TestOpen.test_encoding_error_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestOpen.test_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestOpen.test_implicit_binary_modes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestOpen.test_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestOpen.test_pathlike_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_gzip.TestOpen.test_text_modes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_hash.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_hash.txt index daeb4c063f..ca2e4148a2 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_hash.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_hash.txt @@ -1,21 +1,11 @@ -*graalpython.lib-python.3.test.test_hash.BytesHashRandomizationTests.test_empty_string -*graalpython.lib-python.3.test.test_hash.BytesHashRandomizationTests.test_fixed_hash -*graalpython.lib-python.3.test.test_hash.BytesHashRandomizationTests.test_long_fixed_hash -*graalpython.lib-python.3.test.test_hash.HashBuiltinsTestCase.test_hashes -*graalpython.lib-python.3.test.test_hash.HashDistributionTestCase.test_hash_distribution -*graalpython.lib-python.3.test.test_hash.HashEqualityTestCase.test_coerced_floats -*graalpython.lib-python.3.test.test_hash.HashEqualityTestCase.test_coerced_integers -*graalpython.lib-python.3.test.test_hash.HashEqualityTestCase.test_numeric_literals -*graalpython.lib-python.3.test.test_hash.HashEqualityTestCase.test_unaligned_buffers -*graalpython.lib-python.3.test.test_hash.HashInheritanceTestCase.test_default_hash -*graalpython.lib-python.3.test.test_hash.HashInheritanceTestCase.test_error_hash -*graalpython.lib-python.3.test.test_hash.HashInheritanceTestCase.test_fixed_hash -*graalpython.lib-python.3.test.test_hash.HashInheritanceTestCase.test_hashable -*graalpython.lib-python.3.test.test_hash.HashInheritanceTestCase.test_not_hashable -*graalpython.lib-python.3.test.test_hash.MemoryviewHashRandomizationTests.test_empty_string -*graalpython.lib-python.3.test.test_hash.MemoryviewHashRandomizationTests.test_fixed_hash -*graalpython.lib-python.3.test.test_hash.MemoryviewHashRandomizationTests.test_long_fixed_hash -*graalpython.lib-python.3.test.test_hash.StrHashRandomizationTests.test_empty_string -*graalpython.lib-python.3.test.test_hash.StrHashRandomizationTests.test_fixed_hash -*graalpython.lib-python.3.test.test_hash.StrHashRandomizationTests.test_long_fixed_hash -*graalpython.lib-python.3.test.test_hash.StrHashRandomizationTests.test_ucs2_string +test.test_hash.HashBuiltinsTestCase.test_hashes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hash.HashDistributionTestCase.test_hash_distribution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hash.HashEqualityTestCase.test_coerced_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hash.HashEqualityTestCase.test_coerced_integers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hash.HashEqualityTestCase.test_numeric_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hash.HashEqualityTestCase.test_unaligned_buffers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hash.HashInheritanceTestCase.test_default_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hash.HashInheritanceTestCase.test_error_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hash.HashInheritanceTestCase.test_fixed_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hash.HashInheritanceTestCase.test_hashable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hash.HashInheritanceTestCase.test_not_hashable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_hashlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_hashlib.txt index e809fd51ac..a22ac8b386 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_hashlib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_hashlib.txt @@ -1,68 +1,63 @@ -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_algorithms_available -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_algorithms_guaranteed -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_blocksize_name -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_blocksize_name_blake2 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_blocksize_name_sha3 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_blake2b_0 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_blake2b_1 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_blake2s_0 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_blake2s_1 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_md5_0 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_md5_1 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_md5_2 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_md5_huge -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_md5_uintmax -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha1_0 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha1_1 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha1_2 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha1_3 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha224_0 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha224_1 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha224_2 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha224_3 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha256_0 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha256_1 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha256_2 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha256_3 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha384_0 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha384_1 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha384_2 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha384_3 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha3_224_0 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha3_224_vector -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha3_256_0 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha3_256_vector -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha3_384_0 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha3_384_vector -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha3_512_0 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha3_512_vector -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha512_0 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha512_1 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha512_2 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_case_sha512_3 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_digest_length_overflow -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_disallow_instantiation -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_extra_sha3 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_get_builtin_constructor -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_get_fips_mode -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_gil -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_hash_array -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_hash_disallow_instantiation -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_hexdigest -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_large_update -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_name_attribute -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_new_upper_to_lower -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_no_unicode -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_no_unicode_blake2 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_no_unicode_sha3 -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_readonly_types -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_sha3_update_overflow -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_threaded_hashing -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_unknown_hash -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_usedforsecurity_false -*graalpython.lib-python.3.test.test_hashlib.HashLibTestCase.test_usedforsecurity_true -*graalpython.lib-python.3.test.test_hashlib.KDFTests.test_file_digest -*graalpython.lib-python.3.test.test_hashlib.KDFTests.test_normalized_name -*graalpython.lib-python.3.test.test_hashlib.KDFTests.test_pbkdf2_hmac_c -*graalpython.lib-python.3.test.test_hashlib.KDFTests.test_pbkdf2_hmac_py -*graalpython.lib-python.3.test.test_hashlib.KDFTests.test_scrypt +test.test_hashlib.HashLibTestCase.test_algorithms_available @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_algorithms_guaranteed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_blocksize_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_blocksize_name_blake2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_blocksize_name_sha3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_blake2b_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_blake2b_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_blake2s_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_blake2s_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_md5_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_md5_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_md5_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha1_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha1_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha1_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha1_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha224_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha224_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha224_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha224_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha256_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha256_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha256_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha256_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha384_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha384_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha384_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha384_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha3_224_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha3_224_vector @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha3_256_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha3_256_vector @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha3_384_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha3_384_vector @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha3_512_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha3_512_vector @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha512_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha512_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha512_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_case_sha512_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_digest_length_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_extra_sha3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_get_builtin_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_get_fips_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_gil @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_hash_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_hash_disallow_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_hexdigest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_large_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_name_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_new_upper_to_lower @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_no_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_no_unicode_blake2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_no_unicode_sha3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_readonly_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_threaded_hashing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_unknown_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_usedforsecurity_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.HashLibTestCase.test_usedforsecurity_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.KDFTests.test_file_digest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.KDFTests.test_normalized_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.KDFTests.test_pbkdf2_hmac_c @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hashlib.KDFTests.test_pbkdf2_hmac_py @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_heapq.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_heapq.txt index 92072c0021..6f448ea700 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_heapq.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_heapq.txt @@ -1,50 +1,26 @@ -*graalpython.lib-python.3.test.test_heapq.TestErrorHandlingC.test_arg_parsing -*graalpython.lib-python.3.test.test_heapq.TestErrorHandlingC.test_cmp_err -*graalpython.lib-python.3.test.test_heapq.TestErrorHandlingC.test_comparison_operator_modifiying_heap -*graalpython.lib-python.3.test.test_heapq.TestErrorHandlingC.test_comparison_operator_modifiying_heap_two_heaps -*graalpython.lib-python.3.test.test_heapq.TestErrorHandlingC.test_heappop_mutating_heap -*graalpython.lib-python.3.test.test_heapq.TestErrorHandlingC.test_heappush_mutating_heap -*graalpython.lib-python.3.test.test_heapq.TestErrorHandlingC.test_iterable_args -*graalpython.lib-python.3.test.test_heapq.TestErrorHandlingC.test_len_only -*graalpython.lib-python.3.test.test_heapq.TestErrorHandlingC.test_non_sequence -*graalpython.lib-python.3.test.test_heapq.TestErrorHandlingPython.test_arg_parsing -*graalpython.lib-python.3.test.test_heapq.TestErrorHandlingPython.test_cmp_err -*graalpython.lib-python.3.test.test_heapq.TestErrorHandlingPython.test_comparison_operator_modifiying_heap -*graalpython.lib-python.3.test.test_heapq.TestErrorHandlingPython.test_comparison_operator_modifiying_heap_two_heaps -*graalpython.lib-python.3.test.test_heapq.TestErrorHandlingPython.test_heappop_mutating_heap -*graalpython.lib-python.3.test.test_heapq.TestErrorHandlingPython.test_heappush_mutating_heap -*graalpython.lib-python.3.test.test_heapq.TestErrorHandlingPython.test_iterable_args -*graalpython.lib-python.3.test.test_heapq.TestErrorHandlingPython.test_len_only -*graalpython.lib-python.3.test.test_heapq.TestErrorHandlingPython.test_non_sequence -*graalpython.lib-python.3.test.test_heapq.TestHeapC.test_comparison_operator -*graalpython.lib-python.3.test.test_heapq.TestHeapC.test_empty_merges -*graalpython.lib-python.3.test.test_heapq.TestHeapC.test_heapify -*graalpython.lib-python.3.test.test_heapq.TestHeapC.test_heappop_max -*graalpython.lib-python.3.test.test_heapq.TestHeapC.test_heappushpop -*graalpython.lib-python.3.test.test_heapq.TestHeapC.test_heapsort -*graalpython.lib-python.3.test.test_heapq.TestHeapC.test_merge -*graalpython.lib-python.3.test.test_heapq.TestHeapC.test_merge_does_not_suppress_index_error -*graalpython.lib-python.3.test.test_heapq.TestHeapC.test_merge_stability -*graalpython.lib-python.3.test.test_heapq.TestHeapC.test_naive_nbest -*graalpython.lib-python.3.test.test_heapq.TestHeapC.test_nbest -*graalpython.lib-python.3.test.test_heapq.TestHeapC.test_nbest_with_pushpop -*graalpython.lib-python.3.test.test_heapq.TestHeapC.test_nlargest -*graalpython.lib-python.3.test.test_heapq.TestHeapC.test_nsmallest -*graalpython.lib-python.3.test.test_heapq.TestHeapC.test_push_pop -*graalpython.lib-python.3.test.test_heapq.TestHeapPython.test_comparison_operator -*graalpython.lib-python.3.test.test_heapq.TestHeapPython.test_empty_merges -*graalpython.lib-python.3.test.test_heapq.TestHeapPython.test_heapify -*graalpython.lib-python.3.test.test_heapq.TestHeapPython.test_heappop_max -*graalpython.lib-python.3.test.test_heapq.TestHeapPython.test_heappushpop -*graalpython.lib-python.3.test.test_heapq.TestHeapPython.test_heapsort -*graalpython.lib-python.3.test.test_heapq.TestHeapPython.test_merge -*graalpython.lib-python.3.test.test_heapq.TestHeapPython.test_merge_does_not_suppress_index_error -*graalpython.lib-python.3.test.test_heapq.TestHeapPython.test_merge_stability -*graalpython.lib-python.3.test.test_heapq.TestHeapPython.test_naive_nbest -*graalpython.lib-python.3.test.test_heapq.TestHeapPython.test_nbest -*graalpython.lib-python.3.test.test_heapq.TestHeapPython.test_nbest_with_pushpop -*graalpython.lib-python.3.test.test_heapq.TestHeapPython.test_nlargest -*graalpython.lib-python.3.test.test_heapq.TestHeapPython.test_nsmallest -*graalpython.lib-python.3.test.test_heapq.TestHeapPython.test_push_pop -*graalpython.lib-python.3.test.test_heapq.TestModules.test_c_functions -*graalpython.lib-python.3.test.test_heapq.TestModules.test_py_functions +DocTestCase.merge @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestErrorHandlingPython.test_arg_parsing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestErrorHandlingPython.test_cmp_err @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestErrorHandlingPython.test_comparison_operator_modifiying_heap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestErrorHandlingPython.test_comparison_operator_modifiying_heap_two_heaps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestErrorHandlingPython.test_heappop_mutating_heap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestErrorHandlingPython.test_heappush_mutating_heap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestErrorHandlingPython.test_iterable_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestErrorHandlingPython.test_len_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestErrorHandlingPython.test_non_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestHeapPython.test_comparison_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestHeapPython.test_empty_merges @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestHeapPython.test_heapify @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestHeapPython.test_heappop_max @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestHeapPython.test_heappushpop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestHeapPython.test_heapsort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestHeapPython.test_merge @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestHeapPython.test_merge_does_not_suppress_index_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestHeapPython.test_merge_stability @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestHeapPython.test_naive_nbest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestHeapPython.test_nbest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestHeapPython.test_nbest_with_pushpop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestHeapPython.test_nlargest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestHeapPython.test_nsmallest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestHeapPython.test_push_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_heapq.TestModules.test_py_functions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_hmac.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_hmac.txt index b80abce35e..a0f4f5f5c4 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_hmac.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_hmac.txt @@ -1,28 +1,26 @@ -*graalpython.lib-python.3.test.test_hmac.CompareDigestTestCase.test_hmac_compare_digest -*graalpython.lib-python.3.test.test_hmac.CompareDigestTestCase.test_openssl_compare_digest -*graalpython.lib-python.3.test.test_hmac.ConstructorTestCase.test_dot_new_with_str_key -*graalpython.lib-python.3.test.test_hmac.ConstructorTestCase.test_internal_types -*graalpython.lib-python.3.test.test_hmac.ConstructorTestCase.test_normal -*graalpython.lib-python.3.test.test_hmac.ConstructorTestCase.test_with_bytearray -*graalpython.lib-python.3.test.test_hmac.ConstructorTestCase.test_with_memoryview_msg -*graalpython.lib-python.3.test.test_hmac.ConstructorTestCase.test_with_sha256_module -*graalpython.lib-python.3.test.test_hmac.ConstructorTestCase.test_with_str_key -*graalpython.lib-python.3.test.test_hmac.ConstructorTestCase.test_withmodule -*graalpython.lib-python.3.test.test_hmac.ConstructorTestCase.test_withtext -*graalpython.lib-python.3.test.test_hmac.CopyTestCase.test_attributes -*graalpython.lib-python.3.test.test_hmac.CopyTestCase.test_attributes_old -*graalpython.lib-python.3.test.test_hmac.CopyTestCase.test_equality -*graalpython.lib-python.3.test.test_hmac.CopyTestCase.test_equality_new -*graalpython.lib-python.3.test.test_hmac.CopyTestCase.test_realcopy -*graalpython.lib-python.3.test.test_hmac.CopyTestCase.test_realcopy_hmac -*graalpython.lib-python.3.test.test_hmac.CopyTestCase.test_realcopy_old -*graalpython.lib-python.3.test.test_hmac.SanityTestCase.test_exercise_all_methods -*graalpython.lib-python.3.test.test_hmac.TestVectorsTestCase.test_legacy_block_size_warnings -*graalpython.lib-python.3.test.test_hmac.TestVectorsTestCase.test_md5_vectors -*graalpython.lib-python.3.test.test_hmac.TestVectorsTestCase.test_sha224_rfc4231 -*graalpython.lib-python.3.test.test_hmac.TestVectorsTestCase.test_sha256_rfc4231 -*graalpython.lib-python.3.test.test_hmac.TestVectorsTestCase.test_sha384_rfc4231 -*graalpython.lib-python.3.test.test_hmac.TestVectorsTestCase.test_sha512_rfc4231 -*graalpython.lib-python.3.test.test_hmac.TestVectorsTestCase.test_sha_vectors -*graalpython.lib-python.3.test.test_hmac.TestVectorsTestCase.test_with_digestmod_no_default -*graalpython.lib-python.3.test.test_hmac.TestVectorsTestCase.test_with_fallback +test.test_hmac.CompareDigestTestCase.test_hmac_compare_digest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.CompareDigestTestCase.test_openssl_compare_digest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.ConstructorTestCase.test_dot_new_with_str_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.ConstructorTestCase.test_internal_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.ConstructorTestCase.test_normal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.ConstructorTestCase.test_with_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.ConstructorTestCase.test_with_memoryview_msg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.ConstructorTestCase.test_with_sha256_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.ConstructorTestCase.test_with_str_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.ConstructorTestCase.test_withmodule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.ConstructorTestCase.test_withtext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.CopyTestCase.test_attributes_old @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.CopyTestCase.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.CopyTestCase.test_equality_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.CopyTestCase.test_realcopy_hmac @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.CopyTestCase.test_realcopy_old @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.SanityTestCase.test_exercise_all_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.TestVectorsTestCase.test_legacy_block_size_warnings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.TestVectorsTestCase.test_md5_vectors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.TestVectorsTestCase.test_sha224_rfc4231 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.TestVectorsTestCase.test_sha256_rfc4231 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.TestVectorsTestCase.test_sha384_rfc4231 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.TestVectorsTestCase.test_sha512_rfc4231 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.TestVectorsTestCase.test_sha_vectors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.TestVectorsTestCase.test_with_digestmod_no_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_hmac.TestVectorsTestCase.test_with_fallback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_html.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_html.txt index 69af3de903..e928f6fa3f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_html.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_html.txt @@ -1,2 +1,2 @@ -*graalpython.lib-python.3.test.test_html.HtmlTests.test_escape -*graalpython.lib-python.3.test.test_html.HtmlTests.test_unescape +test.test_html.HtmlTests.test_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_html.HtmlTests.test_unescape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_htmlparser.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_htmlparser.txt index f7417ed493..c590575dd9 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_htmlparser.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_htmlparser.txt @@ -1,50 +1,46 @@ -*graalpython.lib-python.3.test.test_htmlparser.AttributesTestCase.test_adjacent_attributes -*graalpython.lib-python.3.test.test_htmlparser.AttributesTestCase.test_attr_entity_replacement -*graalpython.lib-python.3.test.test_htmlparser.AttributesTestCase.test_attr_funky_names -*graalpython.lib-python.3.test.test_htmlparser.AttributesTestCase.test_attr_funky_names2 -*graalpython.lib-python.3.test.test_htmlparser.AttributesTestCase.test_attr_nonascii -*graalpython.lib-python.3.test.test_htmlparser.AttributesTestCase.test_attr_syntax -*graalpython.lib-python.3.test.test_htmlparser.AttributesTestCase.test_attr_values -*graalpython.lib-python.3.test.test_htmlparser.AttributesTestCase.test_comma_between_attributes -*graalpython.lib-python.3.test.test_htmlparser.AttributesTestCase.test_end_tag_in_attribute_value -*graalpython.lib-python.3.test.test_htmlparser.AttributesTestCase.test_entities_in_attribute_value -*graalpython.lib-python.3.test.test_htmlparser.AttributesTestCase.test_entityrefs_in_attributes -*graalpython.lib-python.3.test.test_htmlparser.AttributesTestCase.test_javascript_attribute_value -*graalpython.lib-python.3.test.test_htmlparser.AttributesTestCase.test_malformed_adjacent_attributes -*graalpython.lib-python.3.test.test_htmlparser.AttributesTestCase.test_malformed_attributes -*graalpython.lib-python.3.test.test_htmlparser.AttributesTestCase.test_missing_attribute_value -*graalpython.lib-python.3.test.test_htmlparser.AttributesTestCase.test_weird_chars_in_unquoted_attribute_values -*graalpython.lib-python.3.test.test_htmlparser.AttributesTestCase.test_with_unquoted_attributes -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_EOF_in_charref -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_bad_nesting -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_bare_ampersands -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_bare_pointy_brackets -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_broken_comments -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_broken_condcoms -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_broken_invalid_end_tag -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_buffer_artefacts -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_cdata_content -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_cdata_with_closing_tags -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_comma_between_attributes -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_comments -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_condcoms -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_convert_charrefs -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_convert_charrefs_dropped_text -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_correct_detection_of_start_tags -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_declaration_junk_chars -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_get_starttag_text -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_illegal_declarations -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_invalid_end_tags -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_malformatted_charref -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_processing_instruction_only -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_simple_html -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_slashes_in_starttag -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_startendtag -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_starttag_end_boundary -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_starttag_junk_chars -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_tolerant_parsing -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_unclosed_entityref -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_unescape_method -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_valid_doctypes -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_weird_chars_in_unquoted_attribute_values -*graalpython.lib-python.3.test.test_htmlparser.HTMLParserTestCase.test_with_unquoted_attributes +test.test_htmlparser.AttributesTestCase.test_adjacent_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.AttributesTestCase.test_attr_entity_replacement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.AttributesTestCase.test_attr_funky_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.AttributesTestCase.test_attr_funky_names2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.AttributesTestCase.test_attr_nonascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.AttributesTestCase.test_attr_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.AttributesTestCase.test_attr_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.AttributesTestCase.test_comma_between_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.AttributesTestCase.test_end_tag_in_attribute_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.AttributesTestCase.test_entities_in_attribute_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.AttributesTestCase.test_entityrefs_in_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.AttributesTestCase.test_javascript_attribute_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.AttributesTestCase.test_malformed_adjacent_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.AttributesTestCase.test_malformed_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.AttributesTestCase.test_missing_attribute_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.AttributesTestCase.test_weird_chars_in_unquoted_attribute_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.AttributesTestCase.test_with_unquoted_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_EOF_in_charref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_bad_nesting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_bare_ampersands @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_bare_pointy_brackets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_broken_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_broken_condcoms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_broken_invalid_end_tag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_buffer_artefacts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_cdata_content @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_cdata_with_closing_tags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_condcoms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_convert_charrefs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_convert_charrefs_dropped_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_correct_detection_of_start_tags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_declaration_junk_chars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_get_starttag_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_illegal_declarations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_invalid_end_tags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_malformatted_charref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_processing_instruction_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_simple_html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_slashes_in_starttag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_startendtag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_starttag_end_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_starttag_junk_chars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_tolerant_parsing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_unclosed_entityref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_htmlparser.HTMLParserTestCase.test_valid_doctypes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_http_cookiejar.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_http_cookiejar.txt index fba653ed3a..9028bfb640 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_http_cookiejar.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_http_cookiejar.txt @@ -1,78 +1,77 @@ -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_Cookie_iterator -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_bad_cookie_header -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_custom_secure_protocols -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_default_path -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_default_path_with_query -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_domain_allow -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_domain_block -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_domain_match -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_domain_mirror -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_domain_return_ok -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_escape_path -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_evil_local_domain -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_evil_local_domain_2 -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_evil_nonlocal_domain -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_expires -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_is_HDN -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_localhost_domain -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_localhost_domain_contents -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_localhost_domain_contents_2 -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_missing_final_slash -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_missing_value -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_no_return_comment -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_ns_parser -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_ns_parser_special_names -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_parse_ns_headers -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_path_mirror -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_path_prefix_match -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_port_mirror -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_quote_cookie_value -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_reach -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_request_host -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_request_path -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_request_port -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_rfc2109_handling -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_secure -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_secure_block -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_strict_domain -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_two_component_domain_ns -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_two_component_domain_rfc2965 -*graalpython.lib-python.3.test.test_http_cookiejar.CookieTests.test_wrong_domain -*graalpython.lib-python.3.test.test_http_cookiejar.DateTimeTests.test_http2time -*graalpython.lib-python.3.test.test_http_cookiejar.DateTimeTests.test_http2time_formats -*graalpython.lib-python.3.test.test_http_cookiejar.DateTimeTests.test_http2time_garbage -*graalpython.lib-python.3.test.test_http_cookiejar.DateTimeTests.test_http2time_redos_regression_actually_completes -*graalpython.lib-python.3.test.test_http_cookiejar.DateTimeTests.test_iso2time -*graalpython.lib-python.3.test.test_http_cookiejar.DateTimeTests.test_iso2time_formats -*graalpython.lib-python.3.test.test_http_cookiejar.DateTimeTests.test_iso2time_garbage -*graalpython.lib-python.3.test.test_http_cookiejar.DateTimeTests.test_iso2time_performance_regression -*graalpython.lib-python.3.test.test_http_cookiejar.DateTimeTests.test_time2isoz -*graalpython.lib-python.3.test.test_http_cookiejar.DateTimeTests.test_time2netscape -*graalpython.lib-python.3.test.test_http_cookiejar.FileCookieJarTests.test_bad_magic -*graalpython.lib-python.3.test.test_http_cookiejar.FileCookieJarTests.test_constructor_with_none -*graalpython.lib-python.3.test.test_http_cookiejar.FileCookieJarTests.test_constructor_with_other_types -*graalpython.lib-python.3.test.test_http_cookiejar.FileCookieJarTests.test_constructor_with_path_like -*graalpython.lib-python.3.test.test_http_cookiejar.FileCookieJarTests.test_constructor_with_str -*graalpython.lib-python.3.test.test_http_cookiejar.FileCookieJarTests.test_cookie_files_are_truncated -*graalpython.lib-python.3.test.test_http_cookiejar.FileCookieJarTests.test_lwp_filepermissions -*graalpython.lib-python.3.test.test_http_cookiejar.FileCookieJarTests.test_lwp_valueless_cookie -*graalpython.lib-python.3.test.test_http_cookiejar.FileCookieJarTests.test_mozilla_filepermissions -*graalpython.lib-python.3.test.test_http_cookiejar.HeaderTests.test_join_header_words -*graalpython.lib-python.3.test.test_http_cookiejar.HeaderTests.test_parse_ns_headers -*graalpython.lib-python.3.test.test_http_cookiejar.HeaderTests.test_parse_ns_headers_special_names -*graalpython.lib-python.3.test.test_http_cookiejar.HeaderTests.test_parse_ns_headers_version -*graalpython.lib-python.3.test.test_http_cookiejar.HeaderTests.test_roundtrip -*graalpython.lib-python.3.test.test_http_cookiejar.HeaderTests.test_split_header_words -*graalpython.lib-python.3.test.test_http_cookiejar.LWPCookieTests.test_empty_path -*graalpython.lib-python.3.test.test_http_cookiejar.LWPCookieTests.test_ietf_example_1 -*graalpython.lib-python.3.test.test_http_cookiejar.LWPCookieTests.test_ietf_example_2 -*graalpython.lib-python.3.test.test_http_cookiejar.LWPCookieTests.test_intranet_domains_2965 -*graalpython.lib-python.3.test.test_http_cookiejar.LWPCookieTests.test_intranet_domains_ns -*graalpython.lib-python.3.test.test_http_cookiejar.LWPCookieTests.test_mozilla -*graalpython.lib-python.3.test.test_http_cookiejar.LWPCookieTests.test_netscape_example_1 -*graalpython.lib-python.3.test.test_http_cookiejar.LWPCookieTests.test_netscape_example_2 -*graalpython.lib-python.3.test.test_http_cookiejar.LWPCookieTests.test_netscape_misc -*graalpython.lib-python.3.test.test_http_cookiejar.LWPCookieTests.test_rejection -*graalpython.lib-python.3.test.test_http_cookiejar.LWPCookieTests.test_session_cookies -*graalpython.lib-python.3.test.test_http_cookiejar.LWPCookieTests.test_url_encoding -*graalpython.lib-python.3.test.test_http_cookiejar.TestMain.test_main +test.test_http_cookiejar.CookieTests.test_Cookie_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_bad_cookie_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_custom_secure_protocols @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_default_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_default_path_with_query @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_domain_allow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_domain_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_domain_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_domain_mirror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_domain_return_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_escape_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_evil_local_domain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_evil_local_domain_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_evil_nonlocal_domain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_expires @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_is_HDN @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_localhost_domain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_localhost_domain_contents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_localhost_domain_contents_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_missing_final_slash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_missing_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_no_return_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_ns_parser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_ns_parser_special_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_parse_ns_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_path_mirror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_path_prefix_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_port_mirror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_quote_cookie_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_reach @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_request_host @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_request_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_request_port @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_rfc2109_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_secure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_secure_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_strict_domain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_two_component_domain_ns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_two_component_domain_rfc2965 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.CookieTests.test_wrong_domain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.DateTimeTests.test_http2time @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.DateTimeTests.test_http2time_formats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.DateTimeTests.test_http2time_garbage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.DateTimeTests.test_http2time_redos_regression_actually_completes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.DateTimeTests.test_iso2time @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.DateTimeTests.test_iso2time_formats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.DateTimeTests.test_iso2time_garbage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.DateTimeTests.test_iso2time_performance_regression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.DateTimeTests.test_time2isoz @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.DateTimeTests.test_time2netscape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.FileCookieJarTests.test_bad_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.FileCookieJarTests.test_constructor_with_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.FileCookieJarTests.test_constructor_with_other_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.FileCookieJarTests.test_constructor_with_path_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.FileCookieJarTests.test_constructor_with_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.FileCookieJarTests.test_cookie_files_are_truncated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_http_cookiejar.FileCookieJarTests.test_lwp_filepermissions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_http_cookiejar.FileCookieJarTests.test_lwp_valueless_cookie @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.FileCookieJarTests.test_mozilla_filepermissions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_http_cookiejar.HeaderTests.test_join_header_words @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.HeaderTests.test_parse_ns_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.HeaderTests.test_parse_ns_headers_special_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.HeaderTests.test_parse_ns_headers_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.HeaderTests.test_roundtrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.HeaderTests.test_split_header_words @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.LWPCookieTests.test_empty_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.LWPCookieTests.test_ietf_example_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.LWPCookieTests.test_ietf_example_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.LWPCookieTests.test_intranet_domains_2965 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.LWPCookieTests.test_intranet_domains_ns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.LWPCookieTests.test_mozilla @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.LWPCookieTests.test_netscape_example_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.LWPCookieTests.test_netscape_example_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.LWPCookieTests.test_netscape_misc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.LWPCookieTests.test_rejection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.LWPCookieTests.test_session_cookies @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookiejar.LWPCookieTests.test_url_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_http_cookies.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_http_cookies.txt index 30c9fbf633..b1f1395149 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_http_cookies.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_http_cookies.txt @@ -1,27 +1,27 @@ -*graalpython.lib-python.3.test.test_http_cookies.CookieTests.test_basic -*graalpython.lib-python.3.test.test_http_cookies.CookieTests.test_comment_quoting -*graalpython.lib-python.3.test.test_http_cookies.CookieTests.test_extended_encode -*graalpython.lib-python.3.test.test_http_cookies.CookieTests.test_extra_spaces -*graalpython.lib-python.3.test.test_http_cookies.CookieTests.test_illegal_chars -*graalpython.lib-python.3.test.test_http_cookies.CookieTests.test_invalid_cookies -*graalpython.lib-python.3.test.test_http_cookies.CookieTests.test_load -*graalpython.lib-python.3.test.test_http_cookies.CookieTests.test_pickle -*graalpython.lib-python.3.test.test_http_cookies.CookieTests.test_quoted_meta -*graalpython.lib-python.3.test.test_http_cookies.CookieTests.test_samesite_attrs -*graalpython.lib-python.3.test.test_http_cookies.CookieTests.test_secure_httponly_false_if_not_present -*graalpython.lib-python.3.test.test_http_cookies.CookieTests.test_secure_httponly_true_if_have_value -*graalpython.lib-python.3.test.test_http_cookies.CookieTests.test_secure_httponly_true_if_present -*graalpython.lib-python.3.test.test_http_cookies.CookieTests.test_set_secure_httponly_attrs -*graalpython.lib-python.3.test.test_http_cookies.CookieTests.test_special_attrs -*graalpython.lib-python.3.test.test_http_cookies.MorselTests.test_copy -*graalpython.lib-python.3.test.test_http_cookies.MorselTests.test_defaults -*graalpython.lib-python.3.test.test_http_cookies.MorselTests.test_eq -*graalpython.lib-python.3.test.test_http_cookies.MorselTests.test_pickle -*graalpython.lib-python.3.test.test_http_cookies.MorselTests.test_repr -*graalpython.lib-python.3.test.test_http_cookies.MorselTests.test_reserved_keys -*graalpython.lib-python.3.test.test_http_cookies.MorselTests.test_set_properties -*graalpython.lib-python.3.test.test_http_cookies.MorselTests.test_setdefault -*graalpython.lib-python.3.test.test_http_cookies.MorselTests.test_setitem -*graalpython.lib-python.3.test.test_http_cookies.MorselTests.test_setter -*graalpython.lib-python.3.test.test_http_cookies.MorselTests.test_update -*graalpython.lib-python.3.test.test_http_cookies.TestMain.test_main +DocTestCase.http.cookies @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.CookieTests.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.CookieTests.test_comment_quoting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.CookieTests.test_extended_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.CookieTests.test_extra_spaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.CookieTests.test_illegal_chars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.CookieTests.test_invalid_cookies @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.CookieTests.test_load @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.CookieTests.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.CookieTests.test_quoted_meta @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.CookieTests.test_samesite_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.CookieTests.test_secure_httponly_false_if_not_present @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.CookieTests.test_secure_httponly_true_if_have_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.CookieTests.test_secure_httponly_true_if_present @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.CookieTests.test_set_secure_httponly_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.CookieTests.test_special_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.MorselTests.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.MorselTests.test_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.MorselTests.test_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.MorselTests.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.MorselTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.MorselTests.test_reserved_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.MorselTests.test_set_properties @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.MorselTests.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.MorselTests.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.MorselTests.test_setter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_http_cookies.MorselTests.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_httplib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_httplib.txt index 3a631e766e..54a6239633 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_httplib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_httplib.txt @@ -1,117 +1,111 @@ -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_bad_status_repr -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_blocksize_request -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_blocksize_send -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_chunked -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_chunked_extension -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_chunked_head -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_chunked_missing_end -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_chunked_sync -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_chunked_trailers -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_content_length_sync -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_dir_with_added_behavior_on_status -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_early_eof -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_epipe -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_error_leak -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_host_port -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_incomplete_read -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_mixed_reads -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_negative_content_length -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_overflowing_chunked_line -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_overflowing_header_limit_after_100 -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_overflowing_header_line -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_overflowing_status_line -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_partial_readintos -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_partial_readintos_incomplete_body -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_partial_readintos_no_content_length -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_partial_readintos_past_end -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_partial_reads -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_partial_reads_incomplete_body -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_partial_reads_no_content_length -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_partial_reads_past_end -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_putrequest_override_domain_validation -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_putrequest_override_encoding -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_putrequest_override_host_validation -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_putrequest_override_validation -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_read1_bound_content_length -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_read1_content_length -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_read_head -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_readinto_chunked -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_readinto_chunked_head -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_readinto_head -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_readline_bound_content_length -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_readlines_content_length -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_response_fileno -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_response_headers -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_send -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_send_file -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_send_iter -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_send_type_error -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_send_updating_file -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_simple_httpstatus -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_status_lines -*graalpython.lib-python.3.test.test_httplib.BasicTest.test_too_many_headers -*graalpython.lib-python.3.test.test_httplib.ExtendedReadTest.test_peek -*graalpython.lib-python.3.test.test_httplib.ExtendedReadTest.test_peek_0 -*graalpython.lib-python.3.test.test_httplib.ExtendedReadTest.test_read1 -*graalpython.lib-python.3.test.test_httplib.ExtendedReadTest.test_read1_0 -*graalpython.lib-python.3.test.test_httplib.ExtendedReadTest.test_read1_bounded -*graalpython.lib-python.3.test.test_httplib.ExtendedReadTest.test_read1_unbounded -*graalpython.lib-python.3.test.test_httplib.ExtendedReadTest.test_readline -*graalpython.lib-python.3.test.test_httplib.ExtendedReadTestChunked.test_peek -*graalpython.lib-python.3.test.test_httplib.ExtendedReadTestChunked.test_peek_0 -*graalpython.lib-python.3.test.test_httplib.ExtendedReadTestChunked.test_read1 -*graalpython.lib-python.3.test.test_httplib.ExtendedReadTestChunked.test_read1_0 -*graalpython.lib-python.3.test.test_httplib.ExtendedReadTestChunked.test_read1_bounded -*graalpython.lib-python.3.test.test_httplib.ExtendedReadTestChunked.test_read1_unbounded -*graalpython.lib-python.3.test.test_httplib.ExtendedReadTestChunked.test_readline -*graalpython.lib-python.3.test.test_httplib.HTTPResponseTest.test_getting_header -*graalpython.lib-python.3.test.test_httplib.HTTPResponseTest.test_getting_header_defaultint -*graalpython.lib-python.3.test.test_httplib.HTTPResponseTest.test_getting_nonexistent_header_with_iterable_default -*graalpython.lib-python.3.test.test_httplib.HTTPResponseTest.test_getting_nonexistent_header_with_string_default -*graalpython.lib-python.3.test.test_httplib.HTTPResponseTest.test_getting_nonexistent_header_without_default -*graalpython.lib-python.3.test.test_httplib.HTTPSTest.test_attributes -*graalpython.lib-python.3.test.test_httplib.HTTPSTest.test_host_port -*graalpython.lib-python.3.test.test_httplib.HTTPSTest.test_local_bad_hostname -*graalpython.lib-python.3.test.test_httplib.HTTPSTest.test_local_good_hostname -*graalpython.lib-python.3.test.test_httplib.HTTPSTest.test_local_unknown_cert -*graalpython.lib-python.3.test.test_httplib.HTTPSTest.test_networked -*graalpython.lib-python.3.test.test_httplib.HTTPSTest.test_networked_bad_cert -*graalpython.lib-python.3.test.test_httplib.HTTPSTest.test_networked_good_cert -*graalpython.lib-python.3.test.test_httplib.HTTPSTest.test_networked_noverification -*graalpython.lib-python.3.test.test_httplib.HTTPSTest.test_networked_trusted_by_default_cert -*graalpython.lib-python.3.test.test_httplib.HeaderTests.test_auto_headers -*graalpython.lib-python.3.test.test_httplib.HeaderTests.test_content_length_0 -*graalpython.lib-python.3.test.test_httplib.HeaderTests.test_headers_debuglevel -*graalpython.lib-python.3.test.test_httplib.HeaderTests.test_invalid_headers -*graalpython.lib-python.3.test.test_httplib.HeaderTests.test_ipv6host_header -*graalpython.lib-python.3.test.test_httplib.HeaderTests.test_malformed_headers_coped_with -*graalpython.lib-python.3.test.test_httplib.HeaderTests.test_parse_all_octets -*graalpython.lib-python.3.test.test_httplib.HeaderTests.test_putheader -*graalpython.lib-python.3.test.test_httplib.HttpMethodTests.test_invalid_method_names -*graalpython.lib-python.3.test.test_httplib.OfflineTest.test_all -*graalpython.lib-python.3.test.test_httplib.OfflineTest.test_client_constants -*graalpython.lib-python.3.test.test_httplib.OfflineTest.test_responses -*graalpython.lib-python.3.test.test_httplib.PersistenceTest.test_100_close -*graalpython.lib-python.3.test.test_httplib.PersistenceTest.test_disconnected -*graalpython.lib-python.3.test.test_httplib.PersistenceTest.test_reuse_reconnect -*graalpython.lib-python.3.test.test_httplib.RequestBodyTest.test_ascii_body -*graalpython.lib-python.3.test.test_httplib.RequestBodyTest.test_binary_file_body -*graalpython.lib-python.3.test.test_httplib.RequestBodyTest.test_bytes_body -*graalpython.lib-python.3.test.test_httplib.RequestBodyTest.test_latin1_body -*graalpython.lib-python.3.test.test_httplib.RequestBodyTest.test_list_body -*graalpython.lib-python.3.test.test_httplib.RequestBodyTest.test_manual_content_length -*graalpython.lib-python.3.test.test_httplib.RequestBodyTest.test_text_file_body -*graalpython.lib-python.3.test.test_httplib.SourceAddressTest.testHTTPConnectionSourceAddress -*graalpython.lib-python.3.test.test_httplib.SourceAddressTest.testHTTPSConnectionSourceAddress -*graalpython.lib-python.3.test.test_httplib.TimeoutTest.testTimeoutAttribute -*graalpython.lib-python.3.test.test_httplib.TransferEncodingTest.test_empty_body -*graalpython.lib-python.3.test.test_httplib.TransferEncodingTest.test_endheaders_chunked -*graalpython.lib-python.3.test.test_httplib.TransferEncodingTest.test_explicit_headers -*graalpython.lib-python.3.test.test_httplib.TransferEncodingTest.test_request -*graalpython.lib-python.3.test.test_httplib.TunnelTests.test_connect_put_request -*graalpython.lib-python.3.test.test_httplib.TunnelTests.test_connect_with_tunnel -*graalpython.lib-python.3.test.test_httplib.TunnelTests.test_disallow_set_tunnel_after_connect -*graalpython.lib-python.3.test.test_httplib.TunnelTests.test_set_tunnel_host_port_headers -*graalpython.lib-python.3.test.test_httplib.TunnelTests.test_tunnel_connect_single_send_connection_setup -*graalpython.lib-python.3.test.test_httplib.TunnelTests.test_tunnel_debuglog -*graalpython.lib-python.3.test.test_httplib.TunnelTests.test_tunnel_leak +test.test_httplib.BasicTest.test_bad_status_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_blocksize_request @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_blocksize_send @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_chunked @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_chunked_extension @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_chunked_head @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_chunked_missing_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_chunked_sync @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_chunked_trailers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_content_length_sync @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_dir_with_added_behavior_on_status @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_early_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_epipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_error_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_host_port @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_incomplete_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_mixed_reads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_negative_content_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_overflowing_chunked_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_overflowing_header_limit_after_100 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_overflowing_header_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_overflowing_status_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_partial_readintos @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_partial_readintos_incomplete_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_partial_readintos_no_content_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_partial_readintos_past_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_partial_reads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_partial_reads_incomplete_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_partial_reads_no_content_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_partial_reads_past_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_putrequest_override_domain_validation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_putrequest_override_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_putrequest_override_host_validation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_read1_bound_content_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_read1_content_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_read_head @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_readinto_chunked @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_readinto_chunked_head @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_readinto_head @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_readline_bound_content_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_readlines_content_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_response_fileno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_response_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_send @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_send_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_send_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_send_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_send_updating_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_simple_httpstatus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_status_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.BasicTest.test_too_many_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.ExtendedReadTest.test_peek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.ExtendedReadTest.test_peek_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.ExtendedReadTest.test_read1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.ExtendedReadTest.test_read1_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.ExtendedReadTest.test_read1_bounded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.ExtendedReadTest.test_read1_unbounded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.ExtendedReadTest.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.ExtendedReadTestChunked.test_peek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.ExtendedReadTestChunked.test_peek_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.ExtendedReadTestChunked.test_read1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.ExtendedReadTestChunked.test_read1_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.ExtendedReadTestChunked.test_read1_bounded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.ExtendedReadTestChunked.test_read1_unbounded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.ExtendedReadTestChunked.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.HTTPResponseTest.test_getting_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.HTTPResponseTest.test_getting_header_defaultint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.HTTPResponseTest.test_getting_nonexistent_header_with_iterable_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.HTTPResponseTest.test_getting_nonexistent_header_with_string_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.HTTPResponseTest.test_getting_nonexistent_header_without_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.HTTPSTest.test_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.HTTPSTest.test_host_port @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.HTTPSTest.test_local_bad_hostname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httplib.HTTPSTest.test_local_good_hostname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httplib.HTTPSTest.test_local_unknown_cert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httplib.HeaderTests.test_auto_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.HeaderTests.test_content_length_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.HeaderTests.test_headers_debuglevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.HeaderTests.test_invalid_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.HeaderTests.test_ipv6host_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.HeaderTests.test_malformed_headers_coped_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.HeaderTests.test_parse_all_octets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.HeaderTests.test_putheader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.HttpMethodTests.test_invalid_method_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.OfflineTest.test_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.OfflineTest.test_client_constants @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.OfflineTest.test_responses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.PersistenceTest.test_100_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.PersistenceTest.test_disconnected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.PersistenceTest.test_reuse_reconnect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.RequestBodyTest.test_ascii_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.RequestBodyTest.test_binary_file_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.RequestBodyTest.test_bytes_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.RequestBodyTest.test_latin1_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.RequestBodyTest.test_list_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.RequestBodyTest.test_manual_content_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.RequestBodyTest.test_text_file_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.SourceAddressTest.testHTTPConnectionSourceAddress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httplib.SourceAddressTest.testHTTPSConnectionSourceAddress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httplib.TimeoutTest.testTimeoutAttribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httplib.TransferEncodingTest.test_empty_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.TransferEncodingTest.test_endheaders_chunked @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.TransferEncodingTest.test_explicit_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.TransferEncodingTest.test_request @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.TunnelTests.test_connect_put_request @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.TunnelTests.test_connect_with_tunnel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.TunnelTests.test_disallow_set_tunnel_after_connect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.TunnelTests.test_set_tunnel_host_port_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.TunnelTests.test_tunnel_connect_single_send_connection_setup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.TunnelTests.test_tunnel_debuglog @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httplib.TunnelTests.test_tunnel_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_httpservers.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_httpservers.txt index 83850c73d5..517d91c426 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_httpservers.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_httpservers.txt @@ -1,21 +1,74 @@ -*graalpython.lib-python.3.test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_close_connection -*graalpython.lib-python.3.test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_date_time_string -*graalpython.lib-python.3.test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_extra_space -*graalpython.lib-python.3.test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_error -*graalpython.lib-python.3.test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_header -*graalpython.lib-python.3.test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_response_only -*graalpython.lib-python.3.test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_header_length -*graalpython.lib-python.3.test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue -*graalpython.lib-python.3.test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_html_escape_on_error -*graalpython.lib-python.3.test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_http_0_9 -*graalpython.lib-python.3.test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_http_1_0 -*graalpython.lib-python.3.test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_http_1_1 -*graalpython.lib-python.3.test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_request_length -*graalpython.lib-python.3.test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_too_many_headers -*graalpython.lib-python.3.test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_with_continue_1_0 -*graalpython.lib-python.3.test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_with_continue_1_1 -*graalpython.lib-python.3.test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_with_continue_rejected -*graalpython.lib-python.3.test.test_httpservers.CGIHTTPServerTestCase.test_accept -*graalpython.lib-python.3.test.test_httpservers.CGIHTTPServerTestCase.test_cgi_path_in_sub_directories -*graalpython.lib-python.3.test.test_httpservers.MiscTestCase.test_all -*graalpython.lib-python.3.test.test_httpservers.SimpleHTTPServerTestCase.test_undecodable_parameter +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_close_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_date_time_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_extra_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_response_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_header_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_html_escape_on_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_http_0_9 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_http_1_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_http_1_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_request_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_too_many_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_unprintable_not_logged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_with_continue_1_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_with_continue_1_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_with_continue_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_command @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_error_content_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_head_via_send_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_header_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_header_keep_alive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_internal_key_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_latin1_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_major_version_number_too_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_minor_version_number_too_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_request_line_trimming @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_return_custom_status @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_return_explain_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_return_header_keep_alive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_send_blank @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_send_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_version_bogus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_version_digits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_version_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_version_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_version_none_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.BaseHTTPServerTestCase.test_version_signs_and_underscores @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.CGIHTTPServerTestCase.test_accept @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_authorization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_cgi_path_in_sub_directories @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_headers_and_content @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_invaliduri @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_issue19435 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_nested_cgi_path_issue21323 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_no_leading_slash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_os_environ_is_not_altered @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_post @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_query_with_continuous_slashes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_query_with_multiple_question_mark @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_url_collapse_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_urlquote_decoding_in_cgi_check @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httpservers.MiscTestCase.test_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.RequestHandlerLoggingTestCase.test_err @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.ScriptTestCase.test_server_test_ipv4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.ScriptTestCase.test_server_test_ipv6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.ScriptTestCase.test_server_test_localhost @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.ScriptTestCase.test_server_test_unspec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.SimpleHTTPRequestHandlerTestCase.test_query_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.SimpleHTTPRequestHandlerTestCase.test_start_with_double_slash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.SimpleHTTPRequestHandlerTestCase.test_windows_colon @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.SimpleHTTPServerTestCase.test_browser_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.SimpleHTTPServerTestCase.test_browser_cache_file_changed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.SimpleHTTPServerTestCase.test_browser_cache_with_If_None_Match_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.SimpleHTTPServerTestCase.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.SimpleHTTPServerTestCase.test_get_dir_redirect_location_domain_injection_bug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.SimpleHTTPServerTestCase.test_head @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.SimpleHTTPServerTestCase.test_html_escape_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_httpservers.SimpleHTTPServerTestCase.test_invalid_requests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.SimpleHTTPServerTestCase.test_last_modified @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.SimpleHTTPServerTestCase.test_path_without_leading_slash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_httpservers.SimpleHTTPServerTestCase.test_undecodable_parameter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_imaplib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_imaplib.txt index e51f0af0b7..d367f7dcd6 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_imaplib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_imaplib.txt @@ -1,94 +1,87 @@ -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_EOF_without_complete_welcome_message -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_aborted_authentication -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_bad_auth_name -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_certfile_arg_warn -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_enable_UTF8_True_append -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_enable_UTF8_raises_error_if_not_supported -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_enable_raises_error_if_no_capability -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_enable_raises_error_if_not_AUTH -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_imaplib_timeout_functionality_test -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_invalid_authentication -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_line_termination -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_linetoolong -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_login -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_logout -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_lsub -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_search_disallows_charset_in_utf8_mode -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_simple_with_statement -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_ssl_verified -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_unselect -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_valid_authentication_bytes -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_with_statement -*graalpython.lib-python.3.test.test_imaplib.NewIMAPSSLTests.test_with_statement_logout -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_EOF_without_complete_welcome_message -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_aborted_authentication -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_bad_auth_name -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_enable_UTF8_True_append -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_enable_UTF8_raises_error_if_not_supported -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_enable_raises_error_if_no_capability -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_enable_raises_error_if_not_AUTH -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_imaplib_timeout_functionality_test -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_invalid_authentication -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_line_termination -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_linetoolong -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_login -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_logout -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_lsub -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_search_disallows_charset_in_utf8_mode -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_simple_with_statement -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_unselect -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_valid_authentication_bytes -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_valid_authentication_plain_text -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_with_statement -*graalpython.lib-python.3.test.test_imaplib.NewIMAPTests.test_with_statement_logout -*graalpython.lib-python.3.test.test_imaplib.RemoteIMAPTest.test_logincapa -*graalpython.lib-python.3.test.test_imaplib.RemoteIMAPTest.test_logout -*graalpython.lib-python.3.test.test_imaplib.RemoteIMAP_SSLTest.test_logincapa -*graalpython.lib-python.3.test.test_imaplib.RemoteIMAP_SSLTest.test_logout -*graalpython.lib-python.3.test.test_imaplib.RemoteIMAP_SSLTest.test_ssl_context_certfile_exclusive -*graalpython.lib-python.3.test.test_imaplib.RemoteIMAP_SSLTest.test_ssl_context_keyfile_exclusive -*graalpython.lib-python.3.test.test_imaplib.RemoteIMAP_STARTTLSTest.test_logincapa -*graalpython.lib-python.3.test.test_imaplib.RemoteIMAP_STARTTLSTest.test_logout -*graalpython.lib-python.3.test.test_imaplib.TestImaplib.test_Internaldate2tuple -*graalpython.lib-python.3.test.test_imaplib.TestImaplib.test_Internaldate2tuple_issue10941 -*graalpython.lib-python.3.test.test_imaplib.TestImaplib.test_Time2Internaldate -*graalpython.lib-python.3.test.test_imaplib.TestImaplib.test_imap4_host_default_value -*graalpython.lib-python.3.test.test_imaplib.TestImaplib.test_that_Time2Internaldate_returns_a_result -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_aborted_authentication -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_bad_auth_name -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_bracket_flags -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_connect -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_dump_ur -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_enable_UTF8_True_append -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_enable_UTF8_raises_error_if_not_supported -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_enable_raises_error_if_no_capability -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_enable_raises_error_if_not_AUTH -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_invalid_authentication -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_issue5949 -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_line_termination -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_linetoolong -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_login_cram_md5 -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_search_disallows_charset_in_utf8_mode -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_simple_with_statement -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_valid_authentication -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_with_statement -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTests.test_with_statement_logout -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_aborted_authentication -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_bad_auth_name -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_bracket_flags -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_connect -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_dump_ur -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_enable_UTF8_True_append -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_enable_UTF8_raises_error_if_not_supported -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_enable_raises_error_if_no_capability -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_enable_raises_error_if_not_AUTH -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_invalid_authentication -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_issue5949 -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_line_termination -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_linetoolong -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_login_cram_md5 -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_search_disallows_charset_in_utf8_mode -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_simple_with_statement -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_valid_authentication -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_with_statement -*graalpython.lib-python.3.test.test_imaplib.ThreadedNetworkedTestsSSL.test_with_statement_logout +test.test_imaplib.NewIMAPSSLTests.test_EOF_without_complete_welcome_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_aborted_authentication @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_bad_auth_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_enable_UTF8_True_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_enable_UTF8_raises_error_if_not_supported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_enable_raises_error_if_no_capability @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_enable_raises_error_if_not_AUTH @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_imaplib_timeout_functionality_test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_invalid_authentication @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_line_termination @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_linetoolong @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_login @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +!test.test_imaplib.NewIMAPSSLTests.test_login_cram_md5_bytes @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_imaplib.NewIMAPSSLTests.test_login_cram_md5_plain_text @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_logout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_lsub @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_search_disallows_charset_in_utf8_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_simple_with_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_ssl_verified @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_unselect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_valid_authentication_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +!test.test_imaplib.NewIMAPSSLTests.test_valid_authentication_plain_text @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_with_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_with_statement_logout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_EOF_without_complete_welcome_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_aborted_authentication @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_bad_auth_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_enable_UTF8_True_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_enable_UTF8_raises_error_if_not_supported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_enable_raises_error_if_no_capability @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_enable_raises_error_if_not_AUTH @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_imaplib_timeout_functionality_test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_invalid_authentication @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_line_termination @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_linetoolong @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_login @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +!test.test_imaplib.NewIMAPTests.test_login_cram_md5_bytes @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_imaplib.NewIMAPTests.test_login_cram_md5_plain_text @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_logout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_lsub @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_search_disallows_charset_in_utf8_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_simple_with_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_unselect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_valid_authentication_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_valid_authentication_plain_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_with_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.NewIMAPTests.test_with_statement_logout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.TestImaplib.test_Internaldate2tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imaplib.TestImaplib.test_Internaldate2tuple_issue10941 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imaplib.TestImaplib.test_imap4_host_default_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.TestImaplib.test_that_Time2Internaldate_returns_a_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imaplib.ThreadedNetworkedTests.test_aborted_authentication @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_bad_auth_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_bracket_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_connect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_enable_UTF8_True_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_enable_UTF8_raises_error_if_not_supported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_enable_raises_error_if_no_capability @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_enable_raises_error_if_not_AUTH @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_invalid_authentication @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_issue5949 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_line_termination @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_linetoolong @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_login_cram_md5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_search_disallows_charset_in_utf8_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_simple_with_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_valid_authentication @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_with_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_with_statement_logout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_aborted_authentication @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_bad_auth_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_bracket_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_connect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_enable_UTF8_True_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_enable_UTF8_raises_error_if_not_supported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_enable_raises_error_if_no_capability @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_enable_raises_error_if_not_AUTH @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_invalid_authentication @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_issue5949 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_line_termination @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_linetoolong @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_login_cram_md5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_search_disallows_charset_in_utf8_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_simple_with_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_valid_authentication @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_with_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_with_statement_logout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_imghdr.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_imghdr.txt index bda903f78f..bc8b851e8f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_imghdr.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_imghdr.txt @@ -1,11 +1,11 @@ -*graalpython.lib-python.3.test.test_imghdr.TestImghdr.test_bad_args -*graalpython.lib-python.3.test.test_imghdr.TestImghdr.test_closed_file -*graalpython.lib-python.3.test.test_imghdr.TestImghdr.test_data -*graalpython.lib-python.3.test.test_imghdr.TestImghdr.test_file_pos -*graalpython.lib-python.3.test.test_imghdr.TestImghdr.test_invalid_headers -*graalpython.lib-python.3.test.test_imghdr.TestImghdr.test_missing_file -*graalpython.lib-python.3.test.test_imghdr.TestImghdr.test_output_stream -*graalpython.lib-python.3.test.test_imghdr.TestImghdr.test_pathlike_filename -*graalpython.lib-python.3.test.test_imghdr.TestImghdr.test_register_test -*graalpython.lib-python.3.test.test_imghdr.TestImghdr.test_string_data -*graalpython.lib-python.3.test.test_imghdr.TestImghdr.test_unseekable +test.test_imghdr.TestImghdr.test_bad_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imghdr.TestImghdr.test_closed_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imghdr.TestImghdr.test_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imghdr.TestImghdr.test_file_pos @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imghdr.TestImghdr.test_invalid_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imghdr.TestImghdr.test_missing_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imghdr.TestImghdr.test_output_stream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imghdr.TestImghdr.test_pathlike_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imghdr.TestImghdr.test_register_test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imghdr.TestImghdr.test_string_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imghdr.TestImghdr.test_unseekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_imp.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_imp.txt index 651305ec63..86702d858e 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_imp.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_imp.txt @@ -1,27 +1,18 @@ -*graalpython.lib-python.3.test.test_imp.ImportTests.test_bug7732 -*graalpython.lib-python.3.test.test_imp.ImportTests.test_create_builtin_subinterp -*graalpython.lib-python.3.test.test_imp.ImportTests.test_find_and_load_checked_pyc -*graalpython.lib-python.3.test.test_imp.ImportTests.test_find_module_encoding -*graalpython.lib-python.3.test.test_imp.ImportTests.test_import_encoded_module -*graalpython.lib-python.3.test.test_imp.ImportTests.test_issue1267 -*graalpython.lib-python.3.test.test_imp.ImportTests.test_issue15828_load_extensions -*graalpython.lib-python.3.test.test_imp.ImportTests.test_issue16421_multiple_modules_in_one_dll -*graalpython.lib-python.3.test.test_imp.ImportTests.test_issue24748_load_module_skips_sys_modules_check -*graalpython.lib-python.3.test.test_imp.ImportTests.test_issue31315 -*graalpython.lib-python.3.test.test_imp.ImportTests.test_issue3594 -*graalpython.lib-python.3.test.test_imp.ImportTests.test_issue5604 -*graalpython.lib-python.3.test.test_imp.ImportTests.test_issue9319 -*graalpython.lib-python.3.test.test_imp.ImportTests.test_issue_35321 -*graalpython.lib-python.3.test.test_imp.ImportTests.test_load_dynamic_ImportError_path -*graalpython.lib-python.3.test.test_imp.ImportTests.test_load_from_source -*graalpython.lib-python.3.test.test_imp.ImportTests.test_load_module_extension_file_is_None -*graalpython.lib-python.3.test.test_imp.ImportTests.test_load_source -*graalpython.lib-python.3.test.test_imp.ImportTests.test_multiple_calls_to_get_data -*graalpython.lib-python.3.test.test_imp.ImportTests.test_pyc_invalidation_mode_from_cmdline -*graalpython.lib-python.3.test.test_imp.NullImporterTests.test_unencodeable -*graalpython.lib-python.3.test.test_imp.PEP3147Tests.test_cache_from_source -*graalpython.lib-python.3.test.test_imp.PEP3147Tests.test_source_from_cache -*graalpython.lib-python.3.test.test_imp.ReloadTests.test_builtin -*graalpython.lib-python.3.test.test_imp.ReloadTests.test_extension -*graalpython.lib-python.3.test.test_imp.ReloadTests.test_source -*graalpython.lib-python.3.test.test_imp.ReloadTests.test_with_deleted_parent +test.test_imp.ImportTests.test_bug7732 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imp.ImportTests.test_find_and_load_checked_pyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imp.ImportTests.test_find_module_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imp.ImportTests.test_import_encoded_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imp.ImportTests.test_issue1267 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imp.ImportTests.test_issue3594 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imp.ImportTests.test_issue5604 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imp.ImportTests.test_issue9319 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imp.ImportTests.test_issue_35321 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imp.ImportTests.test_load_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imp.ImportTests.test_multiple_calls_to_get_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imp.ImportTests.test_pyc_invalidation_mode_from_cmdline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imp.PEP3147Tests.test_cache_from_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imp.PEP3147Tests.test_source_from_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imp.ReloadTests.test_builtin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imp.ReloadTests.test_extension @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imp.ReloadTests.test_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_imp.ReloadTests.test_with_deleted_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_import.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_import.txt index 4aa9c3e021..f5ccdaea04 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_import.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_import.txt @@ -1,81 +1,68 @@ -*graalpython.lib-python.3.test.test_import.__init__.CircularImportTests.test_binding -*graalpython.lib-python.3.test.test_import.__init__.CircularImportTests.test_circular_from_import -*graalpython.lib-python.3.test.test_import.__init__.CircularImportTests.test_crossreference1 -*graalpython.lib-python.3.test.test_import.__init__.CircularImportTests.test_crossreference2 -*graalpython.lib-python.3.test.test_import.__init__.CircularImportTests.test_direct -*graalpython.lib-python.3.test.test_import.__init__.CircularImportTests.test_indirect -*graalpython.lib-python.3.test.test_import.__init__.CircularImportTests.test_rebinding -*graalpython.lib-python.3.test.test_import.__init__.CircularImportTests.test_subpackage -*graalpython.lib-python.3.test.test_import.__init__.CircularImportTests.test_unwritable_module -*graalpython.lib-python.3.test.test_import.__init__.FilePermissionTests.test_cached_mode_issue_2051 -*graalpython.lib-python.3.test.test_import.__init__.FilePermissionTests.test_cached_readonly -*graalpython.lib-python.3.test.test_import.__init__.FilePermissionTests.test_creation_mode -*graalpython.lib-python.3.test.test_import.__init__.FilePermissionTests.test_pyc_always_writable -*graalpython.lib-python.3.test.test_import.__init__.GetSourcefileTests.test_get_sourcefile -*graalpython.lib-python.3.test.test_import.__init__.GetSourcefileTests.test_get_sourcefile_bad_ext -*graalpython.lib-python.3.test.test_import.__init__.GetSourcefileTests.test_get_sourcefile_no_source -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_bogus_fromlist -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_case_sensitivity -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_delete_builtins_import -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_dll_dependency_import -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_double_const -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_failing_import_sticks -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_failing_reload -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_file_to_source -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_from_import_AttributeError -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_from_import_message_for_existing_module -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_from_import_message_for_nonexistent_module -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_from_import_missing_attr_has_name -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_from_import_missing_attr_has_name_and_path -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_from_import_missing_attr_has_name_and_so_path -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_from_import_missing_attr_path_is_canonical -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_from_import_missing_attr_raises_ImportError -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_from_import_missing_module_raises_ModuleNotFoundError -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_from_import_star_invalid_type -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_import -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_import_by_filename -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_import_in_del_does_not_crash -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_import_name_binding -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_import_raises_ModuleNotFoundError -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_issue31286 -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_issue31492 -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_module_with_large_stack -*graalpython.lib-python.3.test.test_import.__init__.ImportTests.test_timestamp_overflow -*graalpython.lib-python.3.test.test_import.__init__.ImportTracebackTests.test_broken_from -*graalpython.lib-python.3.test.test_import.__init__.ImportTracebackTests.test_broken_parent -*graalpython.lib-python.3.test.test_import.__init__.ImportTracebackTests.test_broken_parent_from -*graalpython.lib-python.3.test.test_import.__init__.ImportTracebackTests.test_broken_submodule -*graalpython.lib-python.3.test.test_import.__init__.ImportTracebackTests.test_exec_failure -*graalpython.lib-python.3.test.test_import.__init__.ImportTracebackTests.test_exec_failure_nested -*graalpython.lib-python.3.test.test_import.__init__.ImportTracebackTests.test_import_bug -*graalpython.lib-python.3.test.test_import.__init__.ImportTracebackTests.test_nonexistent_module -*graalpython.lib-python.3.test.test_import.__init__.ImportTracebackTests.test_nonexistent_module_nested -*graalpython.lib-python.3.test.test_import.__init__.ImportTracebackTests.test_syntax_error -*graalpython.lib-python.3.test.test_import.__init__.ImportTracebackTests.test_unencodable_filename -*graalpython.lib-python.3.test.test_import.__init__.ImportlibBootstrapTests.test_frozen_importlib -*graalpython.lib-python.3.test.test_import.__init__.ImportlibBootstrapTests.test_frozen_importlib_external_is_bootstrap_external -*graalpython.lib-python.3.test.test_import.__init__.ImportlibBootstrapTests.test_frozen_importlib_is_bootstrap -*graalpython.lib-python.3.test.test_import.__init__.ImportlibBootstrapTests.test_there_can_be_only_one -*graalpython.lib-python.3.test.test_import.__init__.OverridingImportBuiltinTests.test_override_builtin -*graalpython.lib-python.3.test.test_import.__init__.PathsTests.test_UNC_path -*graalpython.lib-python.3.test.test_import.__init__.PathsTests.test_trailing_slash -*graalpython.lib-python.3.test.test_import.__init__.PycRewritingTests.test_basics -*graalpython.lib-python.3.test.test_import.__init__.PycRewritingTests.test_foreign_code -*graalpython.lib-python.3.test.test_import.__init__.PycRewritingTests.test_incorrect_code_name -*graalpython.lib-python.3.test.test_import.__init__.PycRewritingTests.test_module_without_source -*graalpython.lib-python.3.test.test_import.__init__.PycacheTests.test___cached__ -*graalpython.lib-python.3.test.test_import.__init__.PycacheTests.test___cached___legacy_pyc -*graalpython.lib-python.3.test.test_import.__init__.PycacheTests.test_import_pyc_path -*graalpython.lib-python.3.test.test_import.__init__.PycacheTests.test_missing_source -*graalpython.lib-python.3.test.test_import.__init__.PycacheTests.test_missing_source_legacy -*graalpython.lib-python.3.test.test_import.__init__.PycacheTests.test_package___cached__ -*graalpython.lib-python.3.test.test_import.__init__.PycacheTests.test_package___cached___from_pyc -*graalpython.lib-python.3.test.test_import.__init__.PycacheTests.test_recompute_pyc_same_second -*graalpython.lib-python.3.test.test_import.__init__.PycacheTests.test_unwritable_directory -*graalpython.lib-python.3.test.test_import.__init__.RelativeImportTests.test_absolute_import_without_future -*graalpython.lib-python.3.test.test_import.__init__.RelativeImportTests.test_import_from_non_package -*graalpython.lib-python.3.test.test_import.__init__.RelativeImportTests.test_import_from_unloaded_package -*graalpython.lib-python.3.test.test_import.__init__.RelativeImportTests.test_issue3221 -*graalpython.lib-python.3.test.test_import.__init__.RelativeImportTests.test_parentless_import_shadowed_by_global -*graalpython.lib-python.3.test.test_import.__init__.RelativeImportTests.test_relimport_star -*graalpython.lib-python.3.test.test_import.__init__.TestSymbolicallyLinkedPackage.test_symlinked_dir_importable +test.test_import.CircularImportTests.test_binding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.CircularImportTests.test_circular_from_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.CircularImportTests.test_crossreference1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.CircularImportTests.test_crossreference2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.CircularImportTests.test_direct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.CircularImportTests.test_indirect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.CircularImportTests.test_rebinding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.CircularImportTests.test_subpackage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.CircularImportTests.test_unwritable_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.FilePermissionTests.test_cached_mode_issue_2051 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_import.FilePermissionTests.test_cached_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_import.FilePermissionTests.test_creation_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_import.FilePermissionTests.test_pyc_always_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_bogus_fromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Temporarily disabled due to transient failures (GR-30641) +!test.test_import.ImportTests.test_concurrency @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_import.ImportTests.test_double_const @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_failing_import_sticks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_failing_reload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_file_to_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_from_import_AttributeError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_from_import_message_for_existing_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_from_import_message_for_nonexistent_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_from_import_missing_attr_has_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_from_import_missing_attr_has_name_and_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_from_import_missing_attr_path_is_canonical @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_from_import_missing_attr_raises_ImportError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_from_import_missing_module_raises_ModuleNotFoundError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_from_import_star_invalid_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_import_by_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_import_in_del_does_not_crash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_import.ImportTests.test_import_name_binding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_import_raises_ModuleNotFoundError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_issue31286 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_module_with_large_stack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTests.test_timestamp_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTracebackTests.test_broken_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTracebackTests.test_broken_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTracebackTests.test_broken_parent_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTracebackTests.test_broken_submodule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTracebackTests.test_exec_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTracebackTests.test_exec_failure_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTracebackTests.test_nonexistent_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTracebackTests.test_nonexistent_module_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.ImportTracebackTests.test_syntax_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.OverridingImportBuiltinTests.test_override_builtin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.PathsTests.test_trailing_slash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.PycRewritingTests.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.PycRewritingTests.test_incorrect_code_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.PycRewritingTests.test_module_without_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.PycacheTests.test___cached__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.PycacheTests.test___cached___legacy_pyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.PycacheTests.test_import_pyc_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.PycacheTests.test_missing_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.PycacheTests.test_missing_source_legacy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.PycacheTests.test_package___cached__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.PycacheTests.test_package___cached___from_pyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.PycacheTests.test_recompute_pyc_same_second @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.PycacheTests.test_unwritable_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_import.RelativeImportTests.test_absolute_import_without_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.RelativeImportTests.test_import_from_non_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.RelativeImportTests.test_import_from_unloaded_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.RelativeImportTests.test_issue3221 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.RelativeImportTests.test_parentless_import_shadowed_by_global @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.RelativeImportTests.test_relimport_star @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_import.TestSymbolicallyLinkedPackage.test_symlinked_dir_importable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_importlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_importlib.txt index 4152d33743..ee9b2b256f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_importlib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_importlib.txt @@ -1,1477 +1,1418 @@ -*test.test_importlib.builtin.test_finder.Frozen_FindSpecTests.test_failure -*test.test_importlib.builtin.test_finder.Frozen_FindSpecTests.test_ignore_path -*test.test_importlib.builtin.test_finder.Frozen_FindSpecTests.test_module -*test.test_importlib.builtin.test_finder.Frozen_FinderTests.test_failure -*test.test_importlib.builtin.test_finder.Frozen_FinderTests.test_ignore_path -*test.test_importlib.builtin.test_finder.Frozen_FinderTests.test_module -*test.test_importlib.builtin.test_finder.Source_FindSpecTests.test_failure -*test.test_importlib.builtin.test_finder.Source_FindSpecTests.test_ignore_path -*test.test_importlib.builtin.test_finder.Source_FindSpecTests.test_module -*test.test_importlib.builtin.test_finder.Source_FinderTests.test_failure -*test.test_importlib.builtin.test_finder.Source_FinderTests.test_ignore_path -*test.test_importlib.builtin.test_finder.Source_FinderTests.test_module -*test.test_importlib.builtin.test_loader.Frozen_InspectLoaderTests.test_get_code -*test.test_importlib.builtin.test_loader.Frozen_InspectLoaderTests.test_get_source -*test.test_importlib.builtin.test_loader.Frozen_InspectLoaderTests.test_is_package -*test.test_importlib.builtin.test_loader.Frozen_InspectLoaderTests.test_not_builtin -*test.test_importlib.builtin.test_loader.Frozen_LoaderTests.test_already_imported -*test.test_importlib.builtin.test_loader.Frozen_LoaderTests.test_module -*test.test_importlib.builtin.test_loader.Frozen_LoaderTests.test_module_reuse -*test.test_importlib.builtin.test_loader.Frozen_LoaderTests.test_unloadable -*test.test_importlib.builtin.test_loader.Source_InspectLoaderTests.test_get_code -*test.test_importlib.builtin.test_loader.Source_InspectLoaderTests.test_get_source -*test.test_importlib.builtin.test_loader.Source_InspectLoaderTests.test_is_package -*test.test_importlib.builtin.test_loader.Source_InspectLoaderTests.test_not_builtin -*test.test_importlib.builtin.test_loader.Source_LoaderTests.test_already_imported -*test.test_importlib.builtin.test_loader.Source_LoaderTests.test_module -*test.test_importlib.builtin.test_loader.Source_LoaderTests.test_module_reuse -*test.test_importlib.builtin.test_loader.Source_LoaderTests.test_unloadable -*test.test_importlib.extension.test_case_sensitivity.Frozen_ExtensionModuleCaseSensitivityTest.test_case_insensitivity -*test.test_importlib.extension.test_case_sensitivity.Frozen_ExtensionModuleCaseSensitivityTest.test_case_sensitive -*test.test_importlib.extension.test_case_sensitivity.Source_ExtensionModuleCaseSensitivityTest.test_case_insensitivity -*test.test_importlib.extension.test_case_sensitivity.Source_ExtensionModuleCaseSensitivityTest.test_case_sensitive -*test.test_importlib.extension.test_finder.Frozen_FinderTests.test_failure -*test.test_importlib.extension.test_finder.Frozen_FinderTests.test_module -*test.test_importlib.extension.test_finder.Source_FinderTests.test_failure -*test.test_importlib.extension.test_finder.Source_FinderTests.test_module -*test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_equality -*test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_inequality -*test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_is_package -*test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_load_module_API -*test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_module -*test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_module_reuse -*test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_unloadable -*test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_bad_modules -*test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_bad_traverse -*test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_functionality -*test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_load_short_name -*test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_load_submodule -*test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_load_twice -*test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_module -*test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_nonascii -*test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_nonmodule -*test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_nonmodule_with_methods -*test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_null_slots -*test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_reload -*test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_try_registration -*test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_unloadable -*test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_unloadable_nonascii -*test.test_importlib.extension.test_loader.Source_LoaderTests.test_equality -*test.test_importlib.extension.test_loader.Source_LoaderTests.test_inequality -*test.test_importlib.extension.test_loader.Source_LoaderTests.test_is_package -*test.test_importlib.extension.test_loader.Source_LoaderTests.test_load_module_API -*test.test_importlib.extension.test_loader.Source_LoaderTests.test_module -*test.test_importlib.extension.test_loader.Source_LoaderTests.test_module_reuse -*test.test_importlib.extension.test_loader.Source_LoaderTests.test_unloadable -*test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_bad_modules -*test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_bad_traverse -*test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_functionality -*test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_load_short_name -*test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_load_submodule -*test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_load_twice -*test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_module -*test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_nonascii -*test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_nonmodule -*test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_nonmodule_with_methods -*test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_null_slots -*test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_reload -*test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_try_registration -*test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_unloadable -*test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_unloadable_nonascii -*test.test_importlib.extension.test_path_hook.Frozen_PathHookTests.test_success -*test.test_importlib.extension.test_path_hook.Source_PathHookTests.test_success -*test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_failure -*test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_module -*test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_module_in_package -*test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_not_using_frozen -*test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_package -*test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_path_ignored -*test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_target_ignored -*test.test_importlib.frozen.test_finder.Frozen_FinderTests.test_failure -*test.test_importlib.frozen.test_finder.Frozen_FinderTests.test_module -*test.test_importlib.frozen.test_finder.Frozen_FinderTests.test_module_in_package -*test.test_importlib.frozen.test_finder.Frozen_FinderTests.test_package -*test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_failure -*test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_module -*test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_module_in_package -*test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_not_using_frozen -*test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_package -*test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_path_ignored -*test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_target_ignored -*test.test_importlib.frozen.test_finder.Source_FinderTests.test_failure -*test.test_importlib.frozen.test_finder.Source_FinderTests.test_module -*test.test_importlib.frozen.test_finder.Source_FinderTests.test_module_in_package -*test.test_importlib.frozen.test_finder.Source_FinderTests.test_package -*test.test_importlib.frozen.test_loader.Frozen_ExecModuleTests.test_lacking_parent -*test.test_importlib.frozen.test_loader.Frozen_ExecModuleTests.test_module -*test.test_importlib.frozen.test_loader.Frozen_ExecModuleTests.test_module_repr -*test.test_importlib.frozen.test_loader.Frozen_ExecModuleTests.test_module_repr_indirect -*test.test_importlib.frozen.test_loader.Frozen_ExecModuleTests.test_package -*test.test_importlib.frozen.test_loader.Frozen_ExecModuleTests.test_unloadable -*test.test_importlib.frozen.test_loader.Frozen_InspectLoaderTests.test_failure -*test.test_importlib.frozen.test_loader.Frozen_InspectLoaderTests.test_get_code -*test.test_importlib.frozen.test_loader.Frozen_InspectLoaderTests.test_get_source -*test.test_importlib.frozen.test_loader.Frozen_InspectLoaderTests.test_is_package -*test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_lacking_parent -*test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_module -*test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_module_repr -*test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_module_repr_indirect -*test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_module_reuse -*test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_package -*test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_unloadable -*test.test_importlib.frozen.test_loader.Source_ExecModuleTests.test_lacking_parent -*test.test_importlib.frozen.test_loader.Source_ExecModuleTests.test_module -*test.test_importlib.frozen.test_loader.Source_ExecModuleTests.test_module_repr -*test.test_importlib.frozen.test_loader.Source_ExecModuleTests.test_module_repr_indirect -*test.test_importlib.frozen.test_loader.Source_ExecModuleTests.test_package -*test.test_importlib.frozen.test_loader.Source_ExecModuleTests.test_unloadable -*test.test_importlib.frozen.test_loader.Source_InspectLoaderTests.test_failure -*test.test_importlib.frozen.test_loader.Source_InspectLoaderTests.test_get_code -*test.test_importlib.frozen.test_loader.Source_InspectLoaderTests.test_get_source -*test.test_importlib.frozen.test_loader.Source_InspectLoaderTests.test_is_package -*test.test_importlib.frozen.test_loader.Source_LoaderTests.test_lacking_parent -*test.test_importlib.frozen.test_loader.Source_LoaderTests.test_module -*test.test_importlib.frozen.test_loader.Source_LoaderTests.test_module_repr -*test.test_importlib.frozen.test_loader.Source_LoaderTests.test_module_repr_indirect -*test.test_importlib.frozen.test_loader.Source_LoaderTests.test_module_reuse -*test.test_importlib.frozen.test_loader.Source_LoaderTests.test_package -*test.test_importlib.frozen.test_loader.Source_LoaderTests.test_unloadable -*test.test_importlib.import_.test___loader__.Frozen_LoaderAttributeTests.test___loader___is_None -*test.test_importlib.import_.test___loader__.Frozen_LoaderAttributeTests.test___loader___missing -*test.test_importlib.import_.test___loader__.Frozen_SpecLoaderAttributeTests.test___loader__ -*test.test_importlib.import_.test___loader__.Source_LoaderAttributeTests.test___loader___is_None -*test.test_importlib.import_.test___loader__.Source_LoaderAttributeTests.test___loader___missing -*test.test_importlib.import_.test___loader__.Source_SpecLoaderAttributeTests.test___loader__ -*test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_None_as___package__ -*test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_bad__package__ -*test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_bunk__package__ -*test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_spec_fallback -*test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_using___name__ -*test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_using___package__ -*test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_warn_when_package_and_spec_disagree -*test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_warn_when_using___name__ -*test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_None_as___package__ -*test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_bad__package__ -*test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_bunk__package__ -*test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_spec_fallback -*test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_using___name__ -*test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_using___package__ -*test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_warn_when_package_and_spec_disagree -*test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_warn_when_using___name__ -*test.test_importlib.import_.test___package__.Setting__package__PEP302.test_package -*test.test_importlib.import_.test___package__.Setting__package__PEP302.test_submodule -*test.test_importlib.import_.test___package__.Setting__package__PEP302.test_top_level -*test.test_importlib.import_.test___package__.Setting__package__PEP451.test_package -*test.test_importlib.import_.test___package__.Setting__package__PEP451.test_submodule -*test.test_importlib.import_.test___package__.Setting__package__PEP451.test_top_level -*test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_None_as___package__ -*test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_bad__package__ -*test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_bunk__package__ -*test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_spec_fallback -*test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_using___name__ -*test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_using___package__ -*test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_warn_when_package_and_spec_disagree -*test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_warn_when_using___name__ -*test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_None_as___package__ -*test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_bad__package__ -*test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_bunk__package__ -*test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_spec_fallback -*test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_using___name__ -*test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_using___package__ -*test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_warn_when_package_and_spec_disagree -*test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_warn_when_using___name__ -*test.test_importlib.import_.test_api.Frozen_OldAPITests.test_blocked_fromlist -*test.test_importlib.import_.test_api.Frozen_OldAPITests.test_fromlist_load_error_propagates -*test.test_importlib.import_.test_api.Frozen_OldAPITests.test_name_requires_rparition -*test.test_importlib.import_.test_api.Frozen_OldAPITests.test_negative_level -*test.test_importlib.import_.test_api.Frozen_OldAPITests.test_nonexistent_fromlist_entry -*test.test_importlib.import_.test_api.Frozen_OldAPITests.test_raises_ModuleNotFoundError -*test.test_importlib.import_.test_api.Frozen_SpecAPITests.test_blocked_fromlist -*test.test_importlib.import_.test_api.Frozen_SpecAPITests.test_fromlist_load_error_propagates -*test.test_importlib.import_.test_api.Frozen_SpecAPITests.test_name_requires_rparition -*test.test_importlib.import_.test_api.Frozen_SpecAPITests.test_negative_level -*test.test_importlib.import_.test_api.Frozen_SpecAPITests.test_nonexistent_fromlist_entry -*test.test_importlib.import_.test_api.Frozen_SpecAPITests.test_raises_ModuleNotFoundError -*test.test_importlib.import_.test_api.Source_OldAPITests.test_blocked_fromlist -*test.test_importlib.import_.test_api.Source_OldAPITests.test_fromlist_load_error_propagates -*test.test_importlib.import_.test_api.Source_OldAPITests.test_name_requires_rparition -*test.test_importlib.import_.test_api.Source_OldAPITests.test_negative_level -*test.test_importlib.import_.test_api.Source_OldAPITests.test_nonexistent_fromlist_entry -*test.test_importlib.import_.test_api.Source_OldAPITests.test_raises_ModuleNotFoundError -*test.test_importlib.import_.test_api.Source_SpecAPITests.test_blocked_fromlist -*test.test_importlib.import_.test_api.Source_SpecAPITests.test_fromlist_load_error_propagates -*test.test_importlib.import_.test_api.Source_SpecAPITests.test_name_requires_rparition -*test.test_importlib.import_.test_api.Source_SpecAPITests.test_negative_level -*test.test_importlib.import_.test_api.Source_SpecAPITests.test_nonexistent_fromlist_entry -*test.test_importlib.import_.test_api.Source_SpecAPITests.test_raises_ModuleNotFoundError -*test.test_importlib.import_.test_caching.Frozen_UseCache.test_None_in_cache -*test.test_importlib.import_.test_caching.Frozen_UseCache.test_using_cache -*test.test_importlib.import_.test_caching.ImportlibUseCache.test_None_in_cache -*test.test_importlib.import_.test_caching.ImportlibUseCache.test_using_cache -*test.test_importlib.import_.test_caching.ImportlibUseCache.test_using_cache_after_loader -*test.test_importlib.import_.test_caching.ImportlibUseCache.test_using_cache_for_assigning_to_attribute -*test.test_importlib.import_.test_caching.ImportlibUseCache.test_using_cache_for_fromlist -*test.test_importlib.import_.test_caching.Source_UseCache.test_None_in_cache -*test.test_importlib.import_.test_caching.Source_UseCache.test_using_cache -*test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_empty_string -*test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_fromlist_as_tuple -*test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_invalid_type -*test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_invalid_type_in_all -*test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_module_from_package -*test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_module_from_package_triggers_ModuleNotFoundError -*test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_nonexistent_from_package -*test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_nonexistent_in_all -*test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_nonexistent_object -*test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_object -*test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_star_in_all -*test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_star_with_others -*test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_using_star -*test.test_importlib.import_.test_fromlist.Frozen_ReturnValue.test_return_from_from_import -*test.test_importlib.import_.test_fromlist.Frozen_ReturnValue.test_return_from_import -*test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_empty_string -*test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_fromlist_as_tuple -*test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_invalid_type -*test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_invalid_type_in_all -*test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_module_from_package -*test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_module_from_package_triggers_ModuleNotFoundError -*test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_nonexistent_from_package -*test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_nonexistent_in_all -*test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_nonexistent_object -*test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_object -*test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_star_in_all -*test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_star_with_others -*test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_using_star -*test.test_importlib.import_.test_fromlist.Source_ReturnValue.test_return_from_from_import -*test.test_importlib.import_.test_fromlist.Source_ReturnValue.test_return_from_import -*test.test_importlib.import_.test_meta_path.Frozen_CallSignaturePEP302.test_no_path -*test.test_importlib.import_.test_meta_path.Frozen_CallSignaturePEP302.test_with_path -*test.test_importlib.import_.test_meta_path.Frozen_CallSignaturePEP451.test_no_path -*test.test_importlib.import_.test_meta_path.Frozen_CallSignaturePEP451.test_with_path -*test.test_importlib.import_.test_meta_path.Frozen_CallingOrder.test_continuing -*test.test_importlib.import_.test_meta_path.Frozen_CallingOrder.test_empty -*test.test_importlib.import_.test_meta_path.Frozen_CallingOrder.test_first_called -*test.test_importlib.import_.test_meta_path.Source_CallSignaturePEP302.test_no_path -*test.test_importlib.import_.test_meta_path.Source_CallSignaturePEP302.test_with_path -*test.test_importlib.import_.test_meta_path.Source_CallSignaturePEP451.test_no_path -*test.test_importlib.import_.test_meta_path.Source_CallSignaturePEP451.test_with_path -*test.test_importlib.import_.test_meta_path.Source_CallingOrder.test_continuing -*test.test_importlib.import_.test_meta_path.Source_CallingOrder.test_empty -*test.test_importlib.import_.test_meta_path.Source_CallingOrder.test_first_called -*test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_bad_parent -*test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_import_parent -*test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_module_not_package -*test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_module_not_package_but_side_effects -*test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_raising_parent_after_double_relative_importing_child -*test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_raising_parent_after_importing_child -*test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_raising_parent_after_relative_importing_child -*test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_bad_parent -*test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_import_parent -*test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_module_not_package -*test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_module_not_package_but_side_effects -*test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_raising_parent_after_double_relative_importing_child -*test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_raising_parent_after_importing_child -*test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_raising_parent_after_relative_importing_child -*test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_None_on_sys_path -*test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_deleted_cwd -*test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_empty_list -*test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_empty_path_hooks -*test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_failure -*test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_finder_with_find_loader -*test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_finder_with_find_module -*test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_finder_with_find_spec -*test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_invalidate_caches_clear_out_None -*test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_invalidate_caches_clear_out_relative_path -*test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_invalidate_caches_finders -*test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_path -*test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_path_hooks -*test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_path_importer_cache_empty_string -*test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_sys_path -*test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_None_on_sys_path -*test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_deleted_cwd -*test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_empty_list -*test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_empty_path_hooks -*test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_failure -*test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_finder_with_find_loader -*test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_finder_with_find_module -*test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_finder_with_find_spec -*test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_invalidate_caches_clear_out_None -*test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_invalidate_caches_clear_out_relative_path -*test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_invalidate_caches_finders -*test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_path -*test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_path_hooks -*test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_path_importer_cache_empty_string -*test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_sys_path -*test.test_importlib.import_.test_path.Frozen_PathEntryFinderTests.test_finder_with_failing_find_module -*test.test_importlib.import_.test_path.Frozen_PathEntryFinderTests.test_finder_with_failing_find_spec -*test.test_importlib.import_.test_path.Source_FindModuleTests.test_None_on_sys_path -*test.test_importlib.import_.test_path.Source_FindModuleTests.test_deleted_cwd -*test.test_importlib.import_.test_path.Source_FindModuleTests.test_empty_list -*test.test_importlib.import_.test_path.Source_FindModuleTests.test_empty_path_hooks -*test.test_importlib.import_.test_path.Source_FindModuleTests.test_failure -*test.test_importlib.import_.test_path.Source_FindModuleTests.test_finder_with_find_loader -*test.test_importlib.import_.test_path.Source_FindModuleTests.test_finder_with_find_module -*test.test_importlib.import_.test_path.Source_FindModuleTests.test_finder_with_find_spec -*test.test_importlib.import_.test_path.Source_FindModuleTests.test_invalidate_caches_clear_out_None -*test.test_importlib.import_.test_path.Source_FindModuleTests.test_invalidate_caches_clear_out_relative_path -*test.test_importlib.import_.test_path.Source_FindModuleTests.test_invalidate_caches_finders -*test.test_importlib.import_.test_path.Source_FindModuleTests.test_path -*test.test_importlib.import_.test_path.Source_FindModuleTests.test_path_hooks -*test.test_importlib.import_.test_path.Source_FindModuleTests.test_path_importer_cache_empty_string -*test.test_importlib.import_.test_path.Source_FindModuleTests.test_sys_path -*test.test_importlib.import_.test_path.Source_FindSpecTests.test_None_on_sys_path -*test.test_importlib.import_.test_path.Source_FindSpecTests.test_deleted_cwd -*test.test_importlib.import_.test_path.Source_FindSpecTests.test_empty_list -*test.test_importlib.import_.test_path.Source_FindSpecTests.test_empty_path_hooks -*test.test_importlib.import_.test_path.Source_FindSpecTests.test_failure -*test.test_importlib.import_.test_path.Source_FindSpecTests.test_finder_with_find_loader -*test.test_importlib.import_.test_path.Source_FindSpecTests.test_finder_with_find_module -*test.test_importlib.import_.test_path.Source_FindSpecTests.test_finder_with_find_spec -*test.test_importlib.import_.test_path.Source_FindSpecTests.test_invalidate_caches_clear_out_None -*test.test_importlib.import_.test_path.Source_FindSpecTests.test_invalidate_caches_clear_out_relative_path -*test.test_importlib.import_.test_path.Source_FindSpecTests.test_invalidate_caches_finders -*test.test_importlib.import_.test_path.Source_FindSpecTests.test_path -*test.test_importlib.import_.test_path.Source_FindSpecTests.test_path_hooks -*test.test_importlib.import_.test_path.Source_FindSpecTests.test_path_importer_cache_empty_string -*test.test_importlib.import_.test_path.Source_FindSpecTests.test_sys_path -*test.test_importlib.import_.test_path.Source_PathEntryFinderTests.test_finder_with_failing_find_module -*test.test_importlib.import_.test_path.Source_PathEntryFinderTests.test_finder_with_failing_find_spec -*test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_attr_from_module -*test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_deep_import -*test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_empty_name_w_level_0 -*test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_import_from_different_package -*test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_import_relative_import_no_fromlist -*test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_module_from_module -*test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_module_to_package -*test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_package_to_module -*test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_package_to_package -*test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_relative_import_no_globals -*test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_relative_import_no_package -*test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_relative_import_no_package_exists_absolute -*test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_too_high_from_module -*test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_too_high_from_package -*test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_attr_from_module -*test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_deep_import -*test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_empty_name_w_level_0 -*test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_import_from_different_package -*test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_import_relative_import_no_fromlist -*test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_module_from_module -*test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_module_to_package -*test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_package_to_module -*test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_package_to_package -*test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_relative_import_no_globals -*test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_relative_import_no_package -*test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_relative_import_no_package_exists_absolute -*test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_too_high_from_module -*test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_too_high_from_package -*test.test_importlib.source.test_case_sensitivity.Frozen_CaseSensitivityTestPEP302.test_insensitive -*test.test_importlib.source.test_case_sensitivity.Frozen_CaseSensitivityTestPEP302.test_sensitive -*test.test_importlib.source.test_case_sensitivity.Frozen_CaseSensitivityTestPEP451.test_insensitive -*test.test_importlib.source.test_case_sensitivity.Frozen_CaseSensitivityTestPEP451.test_sensitive -*test.test_importlib.source.test_case_sensitivity.Source_CaseSensitivityTestPEP302.test_insensitive -*test.test_importlib.source.test_case_sensitivity.Source_CaseSensitivityTestPEP302.test_sensitive -*test.test_importlib.source.test_case_sensitivity.Source_CaseSensitivityTestPEP451.test_insensitive -*test.test_importlib.source.test_case_sensitivity.Source_CaseSensitivityTestPEP451.test_sensitive -*test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_bad_syntax -*test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_checked_hash_based_pyc -*test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_equality -*test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_file_from_empty_string_dir -*test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_get_filename_API -*test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_inequality -*test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_lacking_parent -*test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_load_module_API -*test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_module -*test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_module_reuse -*test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_overridden_checked_hash_based_pyc -*test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_overridden_unchecked_hash_based_pyc -*test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_package -*test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_state_after_failure -*test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_timestamp_overflow -*test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_unchecked_hash_based_pyc -*test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_unloadable -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_bad_magic -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_bad_marshal -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_empty_file -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_magic_only -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_no_marshal -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_non_code_marshal -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_old_timestamp -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_partial_flags -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_partial_hash -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_partial_magic -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_partial_size -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_partial_timestamp -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_read_only_bytecode -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_bad_magic -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_bad_marshal -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_empty_file -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_magic_only -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_no_marshal -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_non_code_marshal -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_old_timestamp -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_partial_flags -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_partial_hash -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_partial_magic -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_partial_size -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_partial_timestamp -*test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_read_only_bytecode -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_bad_magic -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_empty_file -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_magic_only -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_no_marshal -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_non_code_marshal -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_partial_flags -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_partial_hash -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_partial_magic -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_partial_size -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_partial_timestamp -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_bad_magic -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_empty_file -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_magic_only -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_no_marshal -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_non_code_marshal -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_partial_flags -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_partial_hash -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_partial_magic -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_partial_size -*test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_partial_timestamp -*test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_bad_syntax -*test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_checked_hash_based_pyc -*test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_equality -*test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_file_from_empty_string_dir -*test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_get_filename_API -*test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_inequality -*test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_lacking_parent -*test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_load_module_API -*test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_module -*test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_module_reuse -*test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_overridden_checked_hash_based_pyc -*test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_overridden_unchecked_hash_based_pyc -*test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_package -*test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_state_after_failure -*test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_timestamp_overflow -*test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_unchecked_hash_based_pyc -*test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_unloadable -*test.test_importlib.source.test_file_loader.Source_SimpleTest.test_bad_syntax -*test.test_importlib.source.test_file_loader.Source_SimpleTest.test_checked_hash_based_pyc -*test.test_importlib.source.test_file_loader.Source_SimpleTest.test_equality -*test.test_importlib.source.test_file_loader.Source_SimpleTest.test_file_from_empty_string_dir -*test.test_importlib.source.test_file_loader.Source_SimpleTest.test_get_filename_API -*test.test_importlib.source.test_file_loader.Source_SimpleTest.test_inequality -*test.test_importlib.source.test_file_loader.Source_SimpleTest.test_lacking_parent -*test.test_importlib.source.test_file_loader.Source_SimpleTest.test_load_module_API -*test.test_importlib.source.test_file_loader.Source_SimpleTest.test_module -*test.test_importlib.source.test_file_loader.Source_SimpleTest.test_module_reuse -*test.test_importlib.source.test_file_loader.Source_SimpleTest.test_overridden_checked_hash_based_pyc -*test.test_importlib.source.test_file_loader.Source_SimpleTest.test_overridden_unchecked_hash_based_pyc -*test.test_importlib.source.test_file_loader.Source_SimpleTest.test_package -*test.test_importlib.source.test_file_loader.Source_SimpleTest.test_state_after_failure -*test.test_importlib.source.test_file_loader.Source_SimpleTest.test_timestamp_overflow -*test.test_importlib.source.test_file_loader.Source_SimpleTest.test_unchecked_hash_based_pyc -*test.test_importlib.source.test_file_loader.Source_SimpleTest.test_unloadable -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_bad_magic -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_bad_marshal -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_empty_file -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_magic_only -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_no_marshal -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_non_code_marshal -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_old_timestamp -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_partial_flags -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_partial_hash -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_partial_magic -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_partial_size -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_partial_timestamp -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_read_only_bytecode -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_bad_magic -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_bad_marshal -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_empty_file -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_magic_only -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_no_marshal -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_non_code_marshal -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_old_timestamp -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_partial_flags -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_partial_hash -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_partial_magic -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_partial_size -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_partial_timestamp -*test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_read_only_bytecode -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_bad_magic -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_empty_file -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_magic_only -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_no_marshal -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_non_code_marshal -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_partial_flags -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_partial_hash -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_partial_magic -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_partial_size -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_partial_timestamp -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_bad_magic -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_empty_file -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_magic_only -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_no_marshal -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_non_code_marshal -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_partial_flags -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_partial_hash -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_partial_magic -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_partial_size -*test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_partial_timestamp -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_dir_removal_handling -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_empty_string_for_dir -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_failure -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_ignore_file -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_invalidate_caches -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_module -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_module_in_package -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_no_read_directory -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_package -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_package_in_package -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_package_over_module -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_dir_removal_handling -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_empty_string_for_dir -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_failure -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_ignore_file -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_invalidate_caches -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_module -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_module_in_package -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_no_read_directory -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_package -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_package_in_package -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_package_over_module -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_dir_removal_handling -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_empty_string_for_dir -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_failure -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_ignore_file -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_invalidate_caches -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_module -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_module_in_package -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_no_read_directory -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_package -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_package_in_package -*test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_package_over_module -*test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_dir_removal_handling -*test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_empty_string_for_dir -*test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_failure -*test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_ignore_file -*test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_invalidate_caches -*test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_module -*test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_module_in_package -*test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_no_read_directory -*test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_package -*test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_package_in_package -*test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_package_over_module -*test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_dir_removal_handling -*test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_empty_string_for_dir -*test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_failure -*test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_ignore_file -*test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_invalidate_caches -*test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_module -*test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_module_in_package -*test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_no_read_directory -*test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_package -*test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_package_in_package -*test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_package_over_module -*test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_dir_removal_handling -*test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_empty_string_for_dir -*test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_failure -*test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_ignore_file -*test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_invalidate_caches -*test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_module -*test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_module_in_package -*test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_no_read_directory -*test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_package -*test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_package_in_package -*test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_package_over_module -*test.test_importlib.source.test_path_hook.Frozen_PathHookTest.test_empty_string -*test.test_importlib.source.test_path_hook.Frozen_PathHookTest.test_empty_string_legacy -*test.test_importlib.source.test_path_hook.Frozen_PathHookTest.test_success -*test.test_importlib.source.test_path_hook.Frozen_PathHookTest.test_success_legacy -*test.test_importlib.source.test_path_hook.Source_PathHookTest.test_empty_string -*test.test_importlib.source.test_path_hook.Source_PathHookTest.test_empty_string_legacy -*test.test_importlib.source.test_path_hook.Source_PathHookTest.test_success -*test.test_importlib.source.test_path_hook.Source_PathHookTest.test_success_legacy -*test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_bom -*test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_bom_and_utf_8 -*test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_bom_conflict -*test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_default_encoding -*test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_encoding_on_first_line -*test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_encoding_on_second_line -*test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_non_obvious_encoding -*test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_bom -*test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_bom_and_utf_8 -*test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_bom_conflict -*test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_default_encoding -*test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_encoding_on_first_line -*test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_encoding_on_second_line -*test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_non_obvious_encoding -*test.test_importlib.source.test_source_encoding.Frozen_LineEndingTestPEP302.test_cr -*test.test_importlib.source.test_source_encoding.Frozen_LineEndingTestPEP302.test_crlf -*test.test_importlib.source.test_source_encoding.Frozen_LineEndingTestPEP302.test_lf -*test.test_importlib.source.test_source_encoding.Frozen_LineEndingTestPEP451.test_cr -*test.test_importlib.source.test_source_encoding.Frozen_LineEndingTestPEP451.test_crlf -*test.test_importlib.source.test_source_encoding.Frozen_LineEndingTestPEP451.test_lf -*test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_bom -*test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_bom_and_utf_8 -*test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_bom_conflict -*test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_default_encoding -*test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_encoding_on_first_line -*test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_encoding_on_second_line -*test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_non_obvious_encoding -*test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_bom -*test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_bom_and_utf_8 -*test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_bom_conflict -*test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_default_encoding -*test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_encoding_on_first_line -*test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_encoding_on_second_line -*test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_non_obvious_encoding -*test.test_importlib.source.test_source_encoding.Source_LineEndingTestPEP302.test_cr -*test.test_importlib.source.test_source_encoding.Source_LineEndingTestPEP302.test_crlf -*test.test_importlib.source.test_source_encoding.Source_LineEndingTestPEP302.test_lf -*test.test_importlib.source.test_source_encoding.Source_LineEndingTestPEP451.test_cr -*test.test_importlib.source.test_source_encoding.Source_LineEndingTestPEP451.test_crlf -*test.test_importlib.source.test_source_encoding.Source_LineEndingTestPEP451.test_lf -*test.test_importlib.test_abc.Frozen_ExecutionLoader.test_subclasses -*test.test_importlib.test_abc.Frozen_ExecutionLoader.test_superclasses -*test.test_importlib.test_abc.Frozen_ExecutionLoaderGetCodeTests.test_get_code -*test.test_importlib.test_abc.Frozen_ExecutionLoaderGetCodeTests.test_get_code_no_path -*test.test_importlib.test_abc.Frozen_ExecutionLoaderGetCodeTests.test_get_code_source_is_None -*test.test_importlib.test_abc.Frozen_ExecutionLoaderGetCodeTests.test_get_code_source_not_found -*test.test_importlib.test_abc.Frozen_FileLoader.test_subclasses -*test.test_importlib.test_abc.Frozen_FileLoader.test_superclasses -*test.test_importlib.test_abc.Frozen_InspectLoader.test_subclasses -*test.test_importlib.test_abc.Frozen_InspectLoader.test_superclasses -*test.test_importlib.test_abc.Frozen_InspectLoaderDefaultsTests.test_get_source -*test.test_importlib.test_abc.Frozen_InspectLoaderDefaultsTests.test_is_package -*test.test_importlib.test_abc.Frozen_InspectLoaderGetCodeTests.test_get_code -*test.test_importlib.test_abc.Frozen_InspectLoaderGetCodeTests.test_get_code_source_is_None -*test.test_importlib.test_abc.Frozen_InspectLoaderGetCodeTests.test_get_code_source_not_found -*test.test_importlib.test_abc.Frozen_InspectLoaderLoadModuleTests.test_get_code_ImportError -*test.test_importlib.test_abc.Frozen_InspectLoaderLoadModuleTests.test_get_code_None -*test.test_importlib.test_abc.Frozen_InspectLoaderLoadModuleTests.test_module_returned -*test.test_importlib.test_abc.Frozen_InspectLoaderSourceToCodeTests.test_source_to_code_bytes -*test.test_importlib.test_abc.Frozen_InspectLoaderSourceToCodeTests.test_source_to_code_no_path -*test.test_importlib.test_abc.Frozen_InspectLoaderSourceToCodeTests.test_source_to_code_path -*test.test_importlib.test_abc.Frozen_InspectLoaderSourceToCodeTests.test_source_to_code_source -*test.test_importlib.test_abc.Frozen_LoaderDefaultsTests.test_create_module -*test.test_importlib.test_abc.Frozen_LoaderDefaultsTests.test_load_module -*test.test_importlib.test_abc.Frozen_LoaderDefaultsTests.test_module_repr -*test.test_importlib.test_abc.Frozen_LoaderLoadModuleTests.test_fresh -*test.test_importlib.test_abc.Frozen_LoaderLoadModuleTests.test_reload -*test.test_importlib.test_abc.Frozen_MetaPathFinder.test_subclasses -*test.test_importlib.test_abc.Frozen_MetaPathFinder.test_superclasses -*test.test_importlib.test_abc.Frozen_MetaPathFinderDefaultsTests.test_find_module -*test.test_importlib.test_abc.Frozen_MetaPathFinderDefaultsTests.test_invalidate_caches -*test.test_importlib.test_abc.Frozen_MetaPathFinderFindModuleTests.test_find_module -*test.test_importlib.test_abc.Frozen_MetaPathFinderFindModuleTests.test_find_spec_with_explicit_target -*test.test_importlib.test_abc.Frozen_MetaPathFinderFindModuleTests.test_no_spec -*test.test_importlib.test_abc.Frozen_MetaPathFinderFindModuleTests.test_spec -*test.test_importlib.test_abc.Frozen_PathEntryFinder.test_subclasses -*test.test_importlib.test_abc.Frozen_PathEntryFinder.test_superclasses -*test.test_importlib.test_abc.Frozen_PathEntryFinderDefaultsTests.test_find_loader -*test.test_importlib.test_abc.Frozen_PathEntryFinderDefaultsTests.test_invalidate_caches -*test.test_importlib.test_abc.Frozen_PathEntryFinderFindLoaderTests.test_no_spec -*test.test_importlib.test_abc.Frozen_PathEntryFinderFindLoaderTests.test_spec_with_loader -*test.test_importlib.test_abc.Frozen_PathEntryFinderFindLoaderTests.test_spec_with_portions -*test.test_importlib.test_abc.Frozen_ResourceLoader.test_subclasses -*test.test_importlib.test_abc.Frozen_ResourceLoader.test_superclasses -*test.test_importlib.test_abc.Frozen_ResourceLoaderDefaultsTests.test_get_data -*test.test_importlib.test_abc.Frozen_ResourceReaderDefaultsTests.test_contents -*test.test_importlib.test_abc.Frozen_ResourceReaderDefaultsTests.test_is_resource -*test.test_importlib.test_abc.Frozen_ResourceReaderDefaultsTests.test_open_resource -*test.test_importlib.test_abc.Frozen_ResourceReaderDefaultsTests.test_resource_path -*test.test_importlib.test_abc.Frozen_SourceLoader.test_subclasses -*test.test_importlib.test_abc.Frozen_SourceLoader.test_superclasses -*test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_code_bad_magic -*test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_code_bad_timestamp -*test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_code_with_everything -*test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_dont_write_bytecode -*test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_no_bytecode -*test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_no_set_data -*test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_set_data_raises_exceptions -*test.test_importlib.test_abc.Frozen_SourceLoaderGetSourceTests.test_decoded_source -*test.test_importlib.test_abc.Frozen_SourceLoaderGetSourceTests.test_default_encoding -*test.test_importlib.test_abc.Frozen_SourceLoaderGetSourceTests.test_universal_newlines -*test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_get_code -*test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_get_source -*test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_get_source_encoding -*test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_is_package -*test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_load_module -*test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_package_settings -*test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_source_to_code -*test.test_importlib.test_abc.Source_ExecutionLoader.test_subclasses -*test.test_importlib.test_abc.Source_ExecutionLoader.test_superclasses -*test.test_importlib.test_abc.Source_ExecutionLoaderGetCodeTests.test_get_code -*test.test_importlib.test_abc.Source_ExecutionLoaderGetCodeTests.test_get_code_no_path -*test.test_importlib.test_abc.Source_ExecutionLoaderGetCodeTests.test_get_code_source_is_None -*test.test_importlib.test_abc.Source_ExecutionLoaderGetCodeTests.test_get_code_source_not_found -*test.test_importlib.test_abc.Source_FileLoader.test_subclasses -*test.test_importlib.test_abc.Source_FileLoader.test_superclasses -*test.test_importlib.test_abc.Source_InspectLoader.test_subclasses -*test.test_importlib.test_abc.Source_InspectLoader.test_superclasses -*test.test_importlib.test_abc.Source_InspectLoaderDefaultsTests.test_get_source -*test.test_importlib.test_abc.Source_InspectLoaderDefaultsTests.test_is_package -*test.test_importlib.test_abc.Source_InspectLoaderGetCodeTests.test_get_code -*test.test_importlib.test_abc.Source_InspectLoaderGetCodeTests.test_get_code_source_is_None -*test.test_importlib.test_abc.Source_InspectLoaderGetCodeTests.test_get_code_source_not_found -*test.test_importlib.test_abc.Source_InspectLoaderLoadModuleTests.test_get_code_ImportError -*test.test_importlib.test_abc.Source_InspectLoaderLoadModuleTests.test_get_code_None -*test.test_importlib.test_abc.Source_InspectLoaderLoadModuleTests.test_module_returned -*test.test_importlib.test_abc.Source_InspectLoaderSourceToCodeTests.test_source_to_code_bytes -*test.test_importlib.test_abc.Source_InspectLoaderSourceToCodeTests.test_source_to_code_no_path -*test.test_importlib.test_abc.Source_InspectLoaderSourceToCodeTests.test_source_to_code_path -*test.test_importlib.test_abc.Source_InspectLoaderSourceToCodeTests.test_source_to_code_source -*test.test_importlib.test_abc.Source_LoaderDefaultsTests.test_create_module -*test.test_importlib.test_abc.Source_LoaderDefaultsTests.test_load_module -*test.test_importlib.test_abc.Source_LoaderDefaultsTests.test_module_repr -*test.test_importlib.test_abc.Source_LoaderLoadModuleTests.test_fresh -*test.test_importlib.test_abc.Source_LoaderLoadModuleTests.test_reload -*test.test_importlib.test_abc.Source_MetaPathFinder.test_subclasses -*test.test_importlib.test_abc.Source_MetaPathFinder.test_superclasses -*test.test_importlib.test_abc.Source_MetaPathFinderDefaultsTests.test_find_module -*test.test_importlib.test_abc.Source_MetaPathFinderDefaultsTests.test_invalidate_caches -*test.test_importlib.test_abc.Source_MetaPathFinderFindModuleTests.test_find_module -*test.test_importlib.test_abc.Source_MetaPathFinderFindModuleTests.test_find_spec_with_explicit_target -*test.test_importlib.test_abc.Source_MetaPathFinderFindModuleTests.test_no_spec -*test.test_importlib.test_abc.Source_MetaPathFinderFindModuleTests.test_spec -*test.test_importlib.test_abc.Source_PathEntryFinder.test_subclasses -*test.test_importlib.test_abc.Source_PathEntryFinder.test_superclasses -*test.test_importlib.test_abc.Source_PathEntryFinderDefaultsTests.test_find_loader -*test.test_importlib.test_abc.Source_PathEntryFinderDefaultsTests.test_invalidate_caches -*test.test_importlib.test_abc.Source_PathEntryFinderFindLoaderTests.test_no_spec -*test.test_importlib.test_abc.Source_PathEntryFinderFindLoaderTests.test_spec_with_loader -*test.test_importlib.test_abc.Source_PathEntryFinderFindLoaderTests.test_spec_with_portions -*test.test_importlib.test_abc.Source_ResourceLoader.test_subclasses -*test.test_importlib.test_abc.Source_ResourceLoader.test_superclasses -*test.test_importlib.test_abc.Source_ResourceLoaderDefaultsTests.test_get_data -*test.test_importlib.test_abc.Source_ResourceReaderDefaultsTests.test_contents -*test.test_importlib.test_abc.Source_ResourceReaderDefaultsTests.test_is_resource -*test.test_importlib.test_abc.Source_ResourceReaderDefaultsTests.test_open_resource -*test.test_importlib.test_abc.Source_ResourceReaderDefaultsTests.test_resource_path -*test.test_importlib.test_abc.Source_SourceLoader.test_subclasses -*test.test_importlib.test_abc.Source_SourceLoader.test_superclasses -*test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_code_bad_magic -*test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_code_bad_timestamp -*test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_code_with_everything -*test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_dont_write_bytecode -*test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_no_bytecode -*test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_no_set_data -*test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_set_data_raises_exceptions -*test.test_importlib.test_abc.Source_SourceLoaderGetSourceTests.test_decoded_source -*test.test_importlib.test_abc.Source_SourceLoaderGetSourceTests.test_default_encoding -*test.test_importlib.test_abc.Source_SourceLoaderGetSourceTests.test_universal_newlines -*test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_get_code -*test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_get_source -*test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_get_source_encoding -*test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_is_package -*test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_load_module -*test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_package_settings -*test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_source_to_code -*test.test_importlib.test_api.FrozenImportlibTests.test_no_frozen_importlib -*test.test_importlib.test_api.Frozen_FindLoaderPEP302Tests.test_nothing -*test.test_importlib.test_api.Frozen_FindLoaderPEP302Tests.test_success -*test.test_importlib.test_api.Frozen_FindLoaderPEP302Tests.test_success_path -*test.test_importlib.test_api.Frozen_FindLoaderPEP302Tests.test_sys_modules -*test.test_importlib.test_api.Frozen_FindLoaderPEP302Tests.test_sys_modules_loader_is_None -*test.test_importlib.test_api.Frozen_FindLoaderPEP302Tests.test_sys_modules_loader_is_not_set -*test.test_importlib.test_api.Frozen_FindLoaderPEP451Tests.test_nothing -*test.test_importlib.test_api.Frozen_FindLoaderPEP451Tests.test_success -*test.test_importlib.test_api.Frozen_FindLoaderPEP451Tests.test_success_path -*test.test_importlib.test_api.Frozen_FindLoaderPEP451Tests.test_sys_modules -*test.test_importlib.test_api.Frozen_FindLoaderPEP451Tests.test_sys_modules_loader_is_None -*test.test_importlib.test_api.Frozen_FindLoaderPEP451Tests.test_sys_modules_loader_is_not_set -*test.test_importlib.test_api.Frozen_ImportModuleTests.test_absolute_import_with_package -*test.test_importlib.test_api.Frozen_ImportModuleTests.test_absolute_package_import -*test.test_importlib.test_api.Frozen_ImportModuleTests.test_deep_relative_package_import -*test.test_importlib.test_api.Frozen_ImportModuleTests.test_loaded_once -*test.test_importlib.test_api.Frozen_ImportModuleTests.test_module_import -*test.test_importlib.test_api.Frozen_ImportModuleTests.test_relative_import_wo_package -*test.test_importlib.test_api.Frozen_ImportModuleTests.test_shallow_relative_package_import -*test.test_importlib.test_api.Frozen_InvalidateCacheTests.test_method_called -*test.test_importlib.test_api.Frozen_InvalidateCacheTests.test_method_lacking -*test.test_importlib.test_api.Frozen_ReloadTests.test_module_missing_spec -*test.test_importlib.test_api.Frozen_ReloadTests.test_module_replaced -*test.test_importlib.test_api.Frozen_ReloadTests.test_reload_loader_replaced -*test.test_importlib.test_api.Frozen_ReloadTests.test_reload_location_changed -*test.test_importlib.test_api.Frozen_ReloadTests.test_reload_missing_loader -*test.test_importlib.test_api.Frozen_ReloadTests.test_reload_modules -*test.test_importlib.test_api.Frozen_ReloadTests.test_reload_namespace_changed -*test.test_importlib.test_api.Frozen_ReloadTests.test_reload_submodule -*test.test_importlib.test_api.Frozen_StartupTests.test_everyone_has___loader__ -*test.test_importlib.test_api.Frozen_StartupTests.test_everyone_has___spec__ -*test.test_importlib.test_api.Source_FindLoaderPEP302Tests.test_nothing -*test.test_importlib.test_api.Source_FindLoaderPEP302Tests.test_success -*test.test_importlib.test_api.Source_FindLoaderPEP302Tests.test_success_path -*test.test_importlib.test_api.Source_FindLoaderPEP302Tests.test_sys_modules -*test.test_importlib.test_api.Source_FindLoaderPEP302Tests.test_sys_modules_loader_is_None -*test.test_importlib.test_api.Source_FindLoaderPEP302Tests.test_sys_modules_loader_is_not_set -*test.test_importlib.test_api.Source_FindLoaderPEP451Tests.test_nothing -*test.test_importlib.test_api.Source_FindLoaderPEP451Tests.test_success -*test.test_importlib.test_api.Source_FindLoaderPEP451Tests.test_success_path -*test.test_importlib.test_api.Source_FindLoaderPEP451Tests.test_sys_modules -*test.test_importlib.test_api.Source_FindLoaderPEP451Tests.test_sys_modules_loader_is_None -*test.test_importlib.test_api.Source_FindLoaderPEP451Tests.test_sys_modules_loader_is_not_set -*test.test_importlib.test_api.Source_ImportModuleTests.test_absolute_import_with_package -*test.test_importlib.test_api.Source_ImportModuleTests.test_absolute_package_import -*test.test_importlib.test_api.Source_ImportModuleTests.test_deep_relative_package_import -*test.test_importlib.test_api.Source_ImportModuleTests.test_loaded_once -*test.test_importlib.test_api.Source_ImportModuleTests.test_module_import -*test.test_importlib.test_api.Source_ImportModuleTests.test_relative_import_wo_package -*test.test_importlib.test_api.Source_ImportModuleTests.test_shallow_relative_package_import -*test.test_importlib.test_api.Source_InvalidateCacheTests.test_method_called -*test.test_importlib.test_api.Source_InvalidateCacheTests.test_method_lacking -*test.test_importlib.test_api.Source_ReloadTests.test_module_missing_spec -*test.test_importlib.test_api.Source_ReloadTests.test_module_replaced -*test.test_importlib.test_api.Source_ReloadTests.test_reload_loader_replaced -*test.test_importlib.test_api.Source_ReloadTests.test_reload_location_changed -*test.test_importlib.test_api.Source_ReloadTests.test_reload_missing_loader -*test.test_importlib.test_api.Source_ReloadTests.test_reload_modules -*test.test_importlib.test_api.Source_ReloadTests.test_reload_namespace_changed -*test.test_importlib.test_api.Source_ReloadTests.test_reload_submodule -*test.test_importlib.test_api.Source_StartupTests.test_everyone_has___loader__ -*test.test_importlib.test_api.Source_StartupTests.test_everyone_has___spec__ -*test.test_importlib.test_compatibilty_files.CompatibilityFilesNoReaderTests.test_spec_path_joinpath -*test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_child_path_is -*test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_child_path_iter -*test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_child_path_name -*test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_child_path_open -*test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_open_invalid_mode -*test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_orphan_path_invalid -*test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_orphan_path_is -*test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_orphan_path_iter -*test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_orphan_path_name -*test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_orphan_path_open -*test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_spec_path_is -*test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_spec_path_iter -*test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_spec_path_name -*test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_spec_path_open -*test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_wrap_spec -*test.test_importlib.test_contents.ContentsDiskTests.test_contents -*test.test_importlib.test_contents.ContentsNamespaceTests.test_contents -*test.test_importlib.test_contents.ContentsZipTests.test_contents -*test.test_importlib.test_files.OpenDiskTests.test_read_bytes -*test.test_importlib.test_files.OpenDiskTests.test_read_text -*test.test_importlib.test_files.OpenDiskTests.test_traversable -*test.test_importlib.test_files.OpenNamespaceTests.test_read_bytes -*test.test_importlib.test_files.OpenNamespaceTests.test_read_text -*test.test_importlib.test_files.OpenNamespaceTests.test_traversable -*test.test_importlib.test_files.OpenZipTests.test_read_bytes -*test.test_importlib.test_files.OpenZipTests.test_read_text -*test.test_importlib.test_files.OpenZipTests.test_traversable -*test.test_importlib.test_lazy.LazyLoaderFactoryTests.test_init -*test.test_importlib.test_lazy.LazyLoaderFactoryTests.test_validation -*test.test_importlib.test_lazy.LazyLoaderTests.test_attr_unchanged -*test.test_importlib.test_lazy.LazyLoaderTests.test_delete_eventual_attr -*test.test_importlib.test_lazy.LazyLoaderTests.test_delete_preexisting_attr -*test.test_importlib.test_lazy.LazyLoaderTests.test_e2e -*test.test_importlib.test_lazy.LazyLoaderTests.test_init -*test.test_importlib.test_lazy.LazyLoaderTests.test_module_already_in_sys -*test.test_importlib.test_lazy.LazyLoaderTests.test_module_substitution_error -*test.test_importlib.test_lazy.LazyLoaderTests.test_mutated_attr -*test.test_importlib.test_lazy.LazyLoaderTests.test_mutated_preexisting_attr -*test.test_importlib.test_lazy.LazyLoaderTests.test_new_attr -*test.test_importlib.test_locks.Frozen_DeadlockAvoidanceTests.test_deadlock -*test.test_importlib.test_locks.Frozen_DeadlockAvoidanceTests.test_no_deadlock -*test.test_importlib.test_locks.Frozen_LifetimeTests.test_lock_lifetime -*test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_acquire_contended -*test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_acquire_destroy -*test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_acquire_release -*test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_constructor -*test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_different_thread -*test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_reacquire -*test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_release_unacquired -*test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_thread_leak -*test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_weakref_deleted -*test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_weakref_exists -*test.test_importlib.test_locks.Source_DeadlockAvoidanceTests.test_deadlock -*test.test_importlib.test_locks.Source_DeadlockAvoidanceTests.test_no_deadlock -*test.test_importlib.test_locks.Source_LifetimeTests.test_lock_lifetime -*test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_acquire_contended -*test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_acquire_destroy -*test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_acquire_release -*test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_constructor -*test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_different_thread -*test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_reacquire -*test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_release_unacquired -*test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_thread_leak -*test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_weakref_deleted -*test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_weakref_exists -*test.test_importlib.test_main.BasicTests.test_for_name_does_not_exist -*test.test_importlib.test_main.BasicTests.test_invalid_inputs_to_from_name -*test.test_importlib.test_main.BasicTests.test_new_style_classes -*test.test_importlib.test_main.BasicTests.test_package_not_found_mentions_metadata -*test.test_importlib.test_main.BasicTests.test_retrieves_version_of_self -*test.test_importlib.test_main.DirectoryTest.test_egg -*test.test_importlib.test_main.DirectoryTest.test_egg_info -*test.test_importlib.test_main.DiscoveryTests.test_invalid_usage -*test.test_importlib.test_main.DiscoveryTests.test_package_discovery -*test.test_importlib.test_main.FileSystem.test_unicode_dir_on_sys_path -*test.test_importlib.test_main.ImportTests.test_entrypoint_with_colon_in_name -*test.test_importlib.test_main.ImportTests.test_import_nonexistent_module -*test.test_importlib.test_main.ImportTests.test_resolve -*test.test_importlib.test_main.ImportTests.test_resolve_without_attr -*test.test_importlib.test_main.InaccessibleSysPath.test_discovery -*test.test_importlib.test_main.MissingSysPath.test_discovery -*test.test_importlib.test_main.NameNormalizationTests.test_dashes_in_dist_name_found_as_underscores -*test.test_importlib.test_main.NameNormalizationTests.test_dist_name_found_as_any_case -*test.test_importlib.test_main.NameNormalizationTests.test_unique_distributions -*test.test_importlib.test_main.NonASCIITests.test_metadata_loads -*test.test_importlib.test_main.NonASCIITests.test_metadata_loads_egg_info -*test.test_importlib.test_main.PackagesDistributionsPrebuiltTest.test_packages_distributions_example -*test.test_importlib.test_main.PackagesDistributionsPrebuiltTest.test_packages_distributions_example2 -*test.test_importlib.test_main.PackagesDistributionsTest.test_packages_distributions_neither_toplevel_nor_files -*test.test_importlib.test_main.TestEntryPoints.test_attr -*test.test_importlib.test_main.TestEntryPoints.test_entry_point_pickleable -*test.test_importlib.test_main.TestEntryPoints.test_hashable -*test.test_importlib.test_main.TestEntryPoints.test_immutable -*test.test_importlib.test_main.TestEntryPoints.test_json_dump -*test.test_importlib.test_main.TestEntryPoints.test_module -*test.test_importlib.test_main.TestEntryPoints.test_positional_args -*test.test_importlib.test_main.TestEntryPoints.test_repr -*test.test_importlib.test_main.TestEntryPoints.test_sortable -*test.test_importlib.test_metadata_api.APITests.test_as_json -*test.test_importlib.test_metadata_api.APITests.test_as_json_egg_info -*test.test_importlib.test_metadata_api.APITests.test_as_json_odd_case -*test.test_importlib.test_metadata_api.APITests.test_entry_points -*test.test_importlib.test_metadata_api.APITests.test_entry_points_allows_no_attributes -*test.test_importlib.test_metadata_api.APITests.test_entry_points_by_index -*test.test_importlib.test_metadata_api.APITests.test_entry_points_dict_construction -*test.test_importlib.test_metadata_api.APITests.test_entry_points_distribution -*test.test_importlib.test_metadata_api.APITests.test_entry_points_groups_get -*test.test_importlib.test_metadata_api.APITests.test_entry_points_groups_getitem -*test.test_importlib.test_metadata_api.APITests.test_entry_points_missing_group -*test.test_importlib.test_metadata_api.APITests.test_entry_points_missing_name -*test.test_importlib.test_metadata_api.APITests.test_entry_points_unique_packages -*test.test_importlib.test_metadata_api.APITests.test_entry_points_unique_packages_normalized -*test.test_importlib.test_metadata_api.APITests.test_file_hash_repr -*test.test_importlib.test_metadata_api.APITests.test_files_dist_info -*test.test_importlib.test_metadata_api.APITests.test_files_egg_info -*test.test_importlib.test_metadata_api.APITests.test_for_name_does_not_exist -*test.test_importlib.test_metadata_api.APITests.test_for_top_level -*test.test_importlib.test_metadata_api.APITests.test_metadata_for_this_package -*test.test_importlib.test_metadata_api.APITests.test_more_complex_deps_requires_text -*test.test_importlib.test_metadata_api.APITests.test_name_normalization -*test.test_importlib.test_metadata_api.APITests.test_prefix_not_matched -*test.test_importlib.test_metadata_api.APITests.test_read_text -*test.test_importlib.test_metadata_api.APITests.test_requires_dist_info -*test.test_importlib.test_metadata_api.APITests.test_requires_egg_info -*test.test_importlib.test_metadata_api.APITests.test_requires_egg_info_empty -*test.test_importlib.test_metadata_api.APITests.test_requires_egg_info_file -*test.test_importlib.test_metadata_api.APITests.test_retrieves_version_of_distinfo_pkg -*test.test_importlib.test_metadata_api.APITests.test_retrieves_version_of_self -*test.test_importlib.test_metadata_api.APITests.test_version_egg_info_file -*test.test_importlib.test_metadata_api.InvalidateCache.test_invalidate_cache -*test.test_importlib.test_metadata_api.LegacyDots.test_name_normalization -*test.test_importlib.test_metadata_api.LegacyDots.test_name_normalization_versionless_egg_info -*test.test_importlib.test_metadata_api.OffSysPathTests.test_distribution_at_pathlib -*test.test_importlib.test_metadata_api.OffSysPathTests.test_distribution_at_str -*test.test_importlib.test_metadata_api.OffSysPathTests.test_find_distributions_specified_path -*test.test_importlib.test_namespace_pkgs.CombinedNamespacePackages.test_imports -*test.test_importlib.test_namespace_pkgs.DynamicPathCalculation.test_project3_fails -*test.test_importlib.test_namespace_pkgs.DynamicPathCalculation.test_project3_succeeds -*test.test_importlib.test_namespace_pkgs.DynamicPathNamespacePackage.test_dynamic_path -*test.test_importlib.test_namespace_pkgs.LegacySupport.test_non_namespace_package_takes_precedence -*test.test_importlib.test_namespace_pkgs.LoaderTests.test_loader_abc -*test.test_importlib.test_namespace_pkgs.LoaderTests.test_namespace_loader_consistency -*test.test_importlib.test_namespace_pkgs.LoaderTests.test_namespace_origin_consistency -*test.test_importlib.test_namespace_pkgs.LoaderTests.test_path_indexable -*test.test_importlib.test_namespace_pkgs.ModuleAndNamespacePackageInSameDir.test_module_before_namespace_package -*test.test_importlib.test_namespace_pkgs.ReloadTests.test_cant_import_other -*test.test_importlib.test_namespace_pkgs.ReloadTests.test_dynamic_path -*test.test_importlib.test_namespace_pkgs.ReloadTests.test_simple_package -*test.test_importlib.test_namespace_pkgs.SeparatedNamespacePackages.test_imports -*test.test_importlib.test_namespace_pkgs.SeparatedNamespacePackagesCreatedWhileRunning.test_invalidate_caches -*test.test_importlib.test_namespace_pkgs.SeparatedNestedZipNamespacePackages.test_imports -*test.test_importlib.test_namespace_pkgs.SeparatedOverlappingNamespacePackages.test_first_path_wins -*test.test_importlib.test_namespace_pkgs.SeparatedOverlappingNamespacePackages.test_first_path_wins_again -*test.test_importlib.test_namespace_pkgs.SeparatedOverlappingNamespacePackages.test_first_path_wins_importing_second_first -*test.test_importlib.test_namespace_pkgs.SeparatedZipNamespacePackages.test_imports -*test.test_importlib.test_namespace_pkgs.SingleNamespacePackage.test_cant_import_other -*test.test_importlib.test_namespace_pkgs.SingleNamespacePackage.test_module_repr -*test.test_importlib.test_namespace_pkgs.SingleNamespacePackage.test_simple_package -*test.test_importlib.test_namespace_pkgs.SingleNestedZipNamespacePackage.test_cant_import_other -*test.test_importlib.test_namespace_pkgs.SingleNestedZipNamespacePackage.test_simple_package -*test.test_importlib.test_namespace_pkgs.SingleZipNamespacePackage.test_cant_import_other -*test.test_importlib.test_namespace_pkgs.SingleZipNamespacePackage.test_simple_package -*test.test_importlib.test_namespace_pkgs.ZipWithMissingDirectory.test_present_directory -*test.test_importlib.test_open.CommonBinaryTests.test_absolute_path -*test.test_importlib.test_open.CommonBinaryTests.test_extant_path -*test.test_importlib.test_open.CommonBinaryTests.test_importing_module_as_side_effect -*test.test_importlib.test_open.CommonBinaryTests.test_missing_path -*test.test_importlib.test_open.CommonBinaryTests.test_non_package_by_name -*test.test_importlib.test_open.CommonBinaryTests.test_non_package_by_package -*test.test_importlib.test_open.CommonBinaryTests.test_package_name -*test.test_importlib.test_open.CommonBinaryTests.test_package_object -*test.test_importlib.test_open.CommonBinaryTests.test_pathlib_path -*test.test_importlib.test_open.CommonBinaryTests.test_relative_path -*test.test_importlib.test_open.CommonBinaryTests.test_resource_opener -*test.test_importlib.test_open.CommonBinaryTests.test_resource_path -*test.test_importlib.test_open.CommonBinaryTests.test_string_path -*test.test_importlib.test_open.CommonBinaryTests.test_useless_loader -*test.test_importlib.test_open.CommonTextTests.test_absolute_path -*test.test_importlib.test_open.CommonTextTests.test_extant_path -*test.test_importlib.test_open.CommonTextTests.test_importing_module_as_side_effect -*test.test_importlib.test_open.CommonTextTests.test_missing_path -*test.test_importlib.test_open.CommonTextTests.test_non_package_by_name -*test.test_importlib.test_open.CommonTextTests.test_non_package_by_package -*test.test_importlib.test_open.CommonTextTests.test_package_name -*test.test_importlib.test_open.CommonTextTests.test_package_object -*test.test_importlib.test_open.CommonTextTests.test_pathlib_path -*test.test_importlib.test_open.CommonTextTests.test_relative_path -*test.test_importlib.test_open.CommonTextTests.test_resource_opener -*test.test_importlib.test_open.CommonTextTests.test_resource_path -*test.test_importlib.test_open.CommonTextTests.test_string_path -*test.test_importlib.test_open.CommonTextTests.test_useless_loader -*test.test_importlib.test_open.OpenDiskNamespaceTests.test_open_binary -*test.test_importlib.test_open.OpenDiskNamespaceTests.test_open_binary_FileNotFoundError -*test.test_importlib.test_open.OpenDiskNamespaceTests.test_open_text_FileNotFoundError -*test.test_importlib.test_open.OpenDiskNamespaceTests.test_open_text_default_encoding -*test.test_importlib.test_open.OpenDiskNamespaceTests.test_open_text_given_encoding -*test.test_importlib.test_open.OpenDiskNamespaceTests.test_open_text_with_errors -*test.test_importlib.test_open.OpenDiskTests.test_open_binary -*test.test_importlib.test_open.OpenDiskTests.test_open_binary_FileNotFoundError -*test.test_importlib.test_open.OpenDiskTests.test_open_text_FileNotFoundError -*test.test_importlib.test_open.OpenDiskTests.test_open_text_default_encoding -*test.test_importlib.test_open.OpenDiskTests.test_open_text_given_encoding -*test.test_importlib.test_open.OpenDiskTests.test_open_text_with_errors -*test.test_importlib.test_open.OpenZipTests.test_open_binary -*test.test_importlib.test_open.OpenZipTests.test_open_binary_FileNotFoundError -*test.test_importlib.test_open.OpenZipTests.test_open_text_FileNotFoundError -*test.test_importlib.test_open.OpenZipTests.test_open_text_default_encoding -*test.test_importlib.test_open.OpenZipTests.test_open_text_given_encoding -*test.test_importlib.test_open.OpenZipTests.test_open_text_with_errors -*test.test_importlib.test_path.CommonTests.test_absolute_path -*test.test_importlib.test_path.CommonTests.test_extant_path -*test.test_importlib.test_path.CommonTests.test_importing_module_as_side_effect -*test.test_importlib.test_path.CommonTests.test_missing_path -*test.test_importlib.test_path.CommonTests.test_non_package_by_name -*test.test_importlib.test_path.CommonTests.test_non_package_by_package -*test.test_importlib.test_path.CommonTests.test_package_name -*test.test_importlib.test_path.CommonTests.test_package_object -*test.test_importlib.test_path.CommonTests.test_pathlib_path -*test.test_importlib.test_path.CommonTests.test_relative_path -*test.test_importlib.test_path.CommonTests.test_resource_opener -*test.test_importlib.test_path.CommonTests.test_resource_path -*test.test_importlib.test_path.CommonTests.test_string_path -*test.test_importlib.test_path.CommonTests.test_useless_loader -*test.test_importlib.test_path.PathDiskTests.test_natural_path -*test.test_importlib.test_path.PathDiskTests.test_reading -*test.test_importlib.test_path.PathMemoryTests.test_reading -*test.test_importlib.test_path.PathZipTests.test_reading -*test.test_importlib.test_path.PathZipTests.test_remove_in_context_manager -*test.test_importlib.test_pkg_import.TestImport.test_package_import__semantics -*test.test_importlib.test_read.CommonBinaryTests.test_absolute_path -*test.test_importlib.test_read.CommonBinaryTests.test_extant_path -*test.test_importlib.test_read.CommonBinaryTests.test_importing_module_as_side_effect -*test.test_importlib.test_read.CommonBinaryTests.test_missing_path -*test.test_importlib.test_read.CommonBinaryTests.test_non_package_by_name -*test.test_importlib.test_read.CommonBinaryTests.test_non_package_by_package -*test.test_importlib.test_read.CommonBinaryTests.test_package_name -*test.test_importlib.test_read.CommonBinaryTests.test_package_object -*test.test_importlib.test_read.CommonBinaryTests.test_pathlib_path -*test.test_importlib.test_read.CommonBinaryTests.test_relative_path -*test.test_importlib.test_read.CommonBinaryTests.test_resource_opener -*test.test_importlib.test_read.CommonBinaryTests.test_resource_path -*test.test_importlib.test_read.CommonBinaryTests.test_string_path -*test.test_importlib.test_read.CommonBinaryTests.test_useless_loader -*test.test_importlib.test_read.CommonTextTests.test_absolute_path -*test.test_importlib.test_read.CommonTextTests.test_extant_path -*test.test_importlib.test_read.CommonTextTests.test_importing_module_as_side_effect -*test.test_importlib.test_read.CommonTextTests.test_missing_path -*test.test_importlib.test_read.CommonTextTests.test_non_package_by_name -*test.test_importlib.test_read.CommonTextTests.test_non_package_by_package -*test.test_importlib.test_read.CommonTextTests.test_package_name -*test.test_importlib.test_read.CommonTextTests.test_package_object -*test.test_importlib.test_read.CommonTextTests.test_pathlib_path -*test.test_importlib.test_read.CommonTextTests.test_relative_path -*test.test_importlib.test_read.CommonTextTests.test_resource_opener -*test.test_importlib.test_read.CommonTextTests.test_resource_path -*test.test_importlib.test_read.CommonTextTests.test_string_path -*test.test_importlib.test_read.CommonTextTests.test_useless_loader -*test.test_importlib.test_read.ReadDiskTests.test_read_binary -*test.test_importlib.test_read.ReadDiskTests.test_read_bytes -*test.test_importlib.test_read.ReadDiskTests.test_read_text_default_encoding -*test.test_importlib.test_read.ReadDiskTests.test_read_text_given_encoding -*test.test_importlib.test_read.ReadDiskTests.test_read_text_with_errors -*test.test_importlib.test_read.ReadNamespaceTests.test_read_bytes -*test.test_importlib.test_read.ReadNamespaceTests.test_read_text_default_encoding -*test.test_importlib.test_read.ReadNamespaceTests.test_read_text_given_encoding -*test.test_importlib.test_read.ReadNamespaceTests.test_read_text_with_errors -*test.test_importlib.test_read.ReadZipTests.test_read_binary -*test.test_importlib.test_read.ReadZipTests.test_read_bytes -*test.test_importlib.test_read.ReadZipTests.test_read_submodule_resource -*test.test_importlib.test_read.ReadZipTests.test_read_submodule_resource_by_name -*test.test_importlib.test_read.ReadZipTests.test_read_text_default_encoding -*test.test_importlib.test_read.ReadZipTests.test_read_text_given_encoding -*test.test_importlib.test_read.ReadZipTests.test_read_text_with_errors -*test.test_importlib.test_reader.MultiplexedPathTest.test_init_file -*test.test_importlib.test_reader.MultiplexedPathTest.test_init_no_paths -*test.test_importlib.test_reader.MultiplexedPathTest.test_is_dir -*test.test_importlib.test_reader.MultiplexedPathTest.test_is_file -*test.test_importlib.test_reader.MultiplexedPathTest.test_iterdir -*test.test_importlib.test_reader.MultiplexedPathTest.test_iterdir_duplicate -*test.test_importlib.test_reader.MultiplexedPathTest.test_join_path -*test.test_importlib.test_reader.MultiplexedPathTest.test_name -*test.test_importlib.test_reader.MultiplexedPathTest.test_open_file -*test.test_importlib.test_reader.MultiplexedPathTest.test_repr -*test.test_importlib.test_reader.NamespaceReaderTest.test_files -*test.test_importlib.test_reader.NamespaceReaderTest.test_init_error -*test.test_importlib.test_reader.NamespaceReaderTest.test_resource_path -*test.test_importlib.test_resource.DeletingZipsTest.test_as_file_does_not_keep_open -*test.test_importlib.test_resource.DeletingZipsTest.test_contents_does_not_keep_open -*test.test_importlib.test_resource.DeletingZipsTest.test_entered_path_does_not_keep_open -*test.test_importlib.test_resource.DeletingZipsTest.test_is_file_does_not_keep_open -*test.test_importlib.test_resource.DeletingZipsTest.test_is_file_failure_does_not_keep_open -*test.test_importlib.test_resource.DeletingZipsTest.test_is_resource_does_not_keep_open -*test.test_importlib.test_resource.DeletingZipsTest.test_is_resource_failure_does_not_keep_open -*test.test_importlib.test_resource.DeletingZipsTest.test_iterdir_does_not_keep_open -*test.test_importlib.test_resource.DeletingZipsTest.test_path_does_not_keep_open -*test.test_importlib.test_resource.DeletingZipsTest.test_read_binary_does_not_keep_open -*test.test_importlib.test_resource.DeletingZipsTest.test_read_text_does_not_keep_open -*test.test_importlib.test_resource.NamespaceTest.test_namespaces_cannot_have_resources -*test.test_importlib.test_resource.ResourceCornerCaseTests.test_package_has_no_reader_fallback -*test.test_importlib.test_resource.ResourceDiskTests.test_contents -*test.test_importlib.test_resource.ResourceDiskTests.test_is_dir -*test.test_importlib.test_resource.ResourceDiskTests.test_is_file_exists -*test.test_importlib.test_resource.ResourceDiskTests.test_is_file_missing -*test.test_importlib.test_resource.ResourceDiskTests.test_is_resource_good_path -*test.test_importlib.test_resource.ResourceDiskTests.test_is_resource_missing -*test.test_importlib.test_resource.ResourceDiskTests.test_is_resource_subresource_directory -*test.test_importlib.test_resource.ResourceFromNamespaceTest01.test_is_submodule_resource -*test.test_importlib.test_resource.ResourceFromNamespaceTest01.test_read_submodule_resource_by_name -*test.test_importlib.test_resource.ResourceFromNamespaceTest01.test_submodule_contents -*test.test_importlib.test_resource.ResourceFromNamespaceTest01.test_submodule_contents_by_name -*test.test_importlib.test_resource.ResourceFromZipsTest.test_unrelated_contents -*test.test_importlib.test_resource.ResourceFromZipsTest01.test_is_submodule_resource -*test.test_importlib.test_resource.ResourceFromZipsTest01.test_read_submodule_resource_by_name -*test.test_importlib.test_resource.ResourceFromZipsTest01.test_submodule_contents -*test.test_importlib.test_resource.ResourceFromZipsTest01.test_submodule_contents_by_name -*test.test_importlib.test_resource.ResourceFromZipsTest02.test_unrelated_contents -*test.test_importlib.test_resource.ResourceLoaderTests.test_is_dir -*test.test_importlib.test_resource.ResourceLoaderTests.test_is_file -*test.test_importlib.test_resource.ResourceLoaderTests.test_resource_contents -*test.test_importlib.test_resource.ResourceLoaderTests.test_resource_directory_is_not_resource -*test.test_importlib.test_resource.ResourceLoaderTests.test_resource_is_resource -*test.test_importlib.test_resource.ResourceLoaderTests.test_resource_missing -*test.test_importlib.test_resource.ResourceLoaderTests.test_resource_missing_is_not_resource -*test.test_importlib.test_resource.ResourceZipTests.test_contents -*test.test_importlib.test_resource.ResourceZipTests.test_is_dir -*test.test_importlib.test_resource.ResourceZipTests.test_is_file_exists -*test.test_importlib.test_resource.ResourceZipTests.test_is_file_missing -*test.test_importlib.test_resource.ResourceZipTests.test_is_resource_good_path -*test.test_importlib.test_resource.ResourceZipTests.test_is_resource_missing -*test.test_importlib.test_resource.ResourceZipTests.test_is_resource_subresource_directory -*test.test_importlib.test_resource.SubdirectoryResourceFromZipsTest.test_is_submodule_resource -*test.test_importlib.test_resource.SubdirectoryResourceFromZipsTest.test_read_submodule_resource_by_name -*test.test_importlib.test_resource.SubdirectoryResourceFromZipsTest.test_submodule_contents -*test.test_importlib.test_resource.SubdirectoryResourceFromZipsTest.test_submodule_contents_by_name -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_default -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_default_bad_suffix -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_default_without_location -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_loader_no_location -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_loader_no_location_bad_get_filename -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_loader_no_location_no_get_filename -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_path_like_arg -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_relative_path -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_default -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_default_bad_is_package -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_default_no_is_package -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_default_not_package -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_empty -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_none -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_not_empty -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_default -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_default_with_bad_is_package -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_default_with_file_loader -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_is_package_false -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_is_package_false_with_fileloader -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_is_package_true -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_is_package_true_with_fileloader -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_is_package_with_loader_false -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_is_package_with_loader_true -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_origin -*test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_origin_and_is_package -*test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module___loader___module_repr -*test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module___loader___module_repr_bad -*test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module___spec__ -*test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module___spec___location -*test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module___spec___no_origin -*test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module___spec___no_origin_no_loader -*test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module_no_file -*test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module_no_file_no_loader -*test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module_no_name -*test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module_with_file -*test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_exec -*test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load -*test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load_failed -*test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load_failed_removed -*test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load_legacy -*test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load_legacy_attributes -*test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load_legacy_attributes_immutable -*test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load_replaced -*test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_reload -*test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_reload_extra_attributes -*test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_reload_init_module_attrs -*test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_reload_legacy -*test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_reload_modified -*test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_no_origin -*test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_set -*test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_source -*test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_source_missing_cache_tag -*test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_source_unknown_suffix -*test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_sourceless -*test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_with_origin_not_location -*test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_default -*test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_default_is_package_false -*test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_default_is_package_true -*test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_default_no_loader -*test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_equality -*test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_equality_location -*test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_has_location_setter -*test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_inequality -*test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_inequality_incomplete -*test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_package -*test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_package_is_package -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_default -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_default_bad_suffix -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_default_without_location -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_loader_no_location -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_loader_no_location_bad_get_filename -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_loader_no_location_no_get_filename -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_path_like_arg -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_relative_path -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_default -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_default_bad_is_package -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_default_no_is_package -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_default_not_package -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_empty -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_none -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_not_empty -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_default -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_default_with_bad_is_package -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_default_with_file_loader -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_is_package_false -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_is_package_false_with_fileloader -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_is_package_true -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_is_package_true_with_fileloader -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_is_package_with_loader_false -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_is_package_with_loader_true -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_origin -*test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_origin_and_is_package -*test.test_importlib.test_spec.Source_ModuleReprTests.test_module___loader___module_repr -*test.test_importlib.test_spec.Source_ModuleReprTests.test_module___loader___module_repr_bad -*test.test_importlib.test_spec.Source_ModuleReprTests.test_module___spec__ -*test.test_importlib.test_spec.Source_ModuleReprTests.test_module___spec___location -*test.test_importlib.test_spec.Source_ModuleReprTests.test_module___spec___no_origin -*test.test_importlib.test_spec.Source_ModuleReprTests.test_module___spec___no_origin_no_loader -*test.test_importlib.test_spec.Source_ModuleReprTests.test_module_no_file -*test.test_importlib.test_spec.Source_ModuleReprTests.test_module_no_file_no_loader -*test.test_importlib.test_spec.Source_ModuleReprTests.test_module_no_name -*test.test_importlib.test_spec.Source_ModuleReprTests.test_module_with_file -*test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_exec -*test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load -*test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load_failed -*test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load_failed_removed -*test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load_legacy -*test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load_legacy_attributes -*test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load_legacy_attributes_immutable -*test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load_replaced -*test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_reload -*test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_reload_extra_attributes -*test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_reload_init_module_attrs -*test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_reload_legacy -*test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_reload_modified -*test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_no_origin -*test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_set -*test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_source -*test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_source_missing_cache_tag -*test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_source_unknown_suffix -*test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_sourceless -*test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_with_origin_not_location -*test.test_importlib.test_spec.Source_ModuleSpecTests.test_default -*test.test_importlib.test_spec.Source_ModuleSpecTests.test_default_is_package_false -*test.test_importlib.test_spec.Source_ModuleSpecTests.test_default_is_package_true -*test.test_importlib.test_spec.Source_ModuleSpecTests.test_default_no_loader -*test.test_importlib.test_spec.Source_ModuleSpecTests.test_equality -*test.test_importlib.test_spec.Source_ModuleSpecTests.test_equality_location -*test.test_importlib.test_spec.Source_ModuleSpecTests.test_has_location_setter -*test.test_importlib.test_spec.Source_ModuleSpecTests.test_inequality -*test.test_importlib.test_spec.Source_ModuleSpecTests.test_inequality_incomplete -*test.test_importlib.test_spec.Source_ModuleSpecTests.test_package -*test.test_importlib.test_spec.Source_ModuleSpecTests.test_package_is_package -*test.test_importlib.test_threaded_import.ThreadedImportTests.test_circular_imports -*test.test_importlib.test_threaded_import.ThreadedImportTests.test_concurrent_futures_circular_import -*test.test_importlib.test_threaded_import.ThreadedImportTests.test_import_hangers -*test.test_importlib.test_threaded_import.ThreadedImportTests.test_multiprocessing_pool_circular_import -*test.test_importlib.test_threaded_import.ThreadedImportTests.test_parallel_meta_path -*test.test_importlib.test_threaded_import.ThreadedImportTests.test_parallel_module_init -*test.test_importlib.test_threaded_import.ThreadedImportTests.test_parallel_path_hooks -*test.test_importlib.test_threaded_import.ThreadedImportTests.test_side_effect_import -*test.test_importlib.test_util.Frozen_DecodeSourceBytesTests.test_specified_encoding -*test.test_importlib.test_util.Frozen_DecodeSourceBytesTests.test_universal_newlines -*test.test_importlib.test_util.Frozen_DecodeSourceBytesTests.test_ut8_default -*test.test_importlib.test_util.Frozen_FindSpecTests.test_find_relative_module -*test.test_importlib.test_util.Frozen_FindSpecTests.test_find_relative_module_missing_package -*test.test_importlib.test_util.Frozen_FindSpecTests.test_find_submodule -*test.test_importlib.test_util.Frozen_FindSpecTests.test_find_submodule_in_module -*test.test_importlib.test_util.Frozen_FindSpecTests.test_find_submodule_parent_already_imported -*test.test_importlib.test_util.Frozen_FindSpecTests.test_nothing -*test.test_importlib.test_util.Frozen_FindSpecTests.test_success -*test.test_importlib.test_util.Frozen_FindSpecTests.test_sys_modules -*test.test_importlib.test_util.Frozen_FindSpecTests.test_sys_modules_loader_is_None -*test.test_importlib.test_util.Frozen_FindSpecTests.test_sys_modules_spec_is_None -*test.test_importlib.test_util.Frozen_FindSpecTests.test_sys_modules_spec_is_not_set -*test.test_importlib.test_util.Frozen_FindSpecTests.test_sys_modules_without___loader__ -*test.test_importlib.test_util.Frozen_MagicNumberTests.test_incorporates_rn -*test.test_importlib.test_util.Frozen_MagicNumberTests.test_length -*test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_attributes_set -*test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_decorator_attrs -*test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_false_module -*test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_new_module -*test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_new_module_failure -*test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_reload -*test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_reload_failure -*test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_warning -*test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___cached__ -*test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___file__ -*test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___loader__ -*test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___name__ -*test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___package__ -*test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___path__ -*test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___spec__ -*test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test_create_module -*test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test_create_module_returns_None -*test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test_no_create_module -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_cwd -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_debug_override -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_debug_override_optimization_both_set -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_no_cache_tag -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_no_dot -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_optimization_None -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_optimization_empty_string -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_optimization_set -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_override -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_path_like_arg -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_respects_pycache_prefix -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_respects_pycache_prefix_relative -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_sep_altsep_and_sep_cache_from_source -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_bad_path -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_inside_pycache_prefix -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_missing_optimization -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_no__pycache__ -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_no_cache_tag -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_no_slash -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_not_opt -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_optimized_bytecode -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_outside_pycache_prefix -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_path_like_arg -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_too_few_dots -*test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_too_many_dots -*test.test_importlib.test_util.Frozen_ResolveNameTests.test_absolute -*test.test_importlib.test_util.Frozen_ResolveNameTests.test_absolute_within_package -*test.test_importlib.test_util.Frozen_ResolveNameTests.test_escape -*test.test_importlib.test_util.Frozen_ResolveNameTests.test_in_package -*test.test_importlib.test_util.Frozen_ResolveNameTests.test_no_package -*test.test_importlib.test_util.Frozen_ResolveNameTests.test_other_package -*test.test_importlib.test_util.Frozen_SetLoaderTests.test_attribute_is_None -*test.test_importlib.test_util.Frozen_SetLoaderTests.test_no_attribute -*test.test_importlib.test_util.Frozen_SetLoaderTests.test_not_reset -*test.test_importlib.test_util.Frozen_SetPackageTests.test_decorator_attrs -*test.test_importlib.test_util.Frozen_SetPackageTests.test_leaving_alone -*test.test_importlib.test_util.Frozen_SetPackageTests.test_package -*test.test_importlib.test_util.Frozen_SetPackageTests.test_setting_if_missing -*test.test_importlib.test_util.Frozen_SetPackageTests.test_submodule -*test.test_importlib.test_util.Frozen_SetPackageTests.test_top_level -*test.test_importlib.test_util.MagicNumberTests.test_magic_number -*test.test_importlib.test_util.Source_DecodeSourceBytesTests.test_specified_encoding -*test.test_importlib.test_util.Source_DecodeSourceBytesTests.test_universal_newlines -*test.test_importlib.test_util.Source_DecodeSourceBytesTests.test_ut8_default -*test.test_importlib.test_util.Source_FindSpecTests.test_find_relative_module -*test.test_importlib.test_util.Source_FindSpecTests.test_find_relative_module_missing_package -*test.test_importlib.test_util.Source_FindSpecTests.test_find_submodule -*test.test_importlib.test_util.Source_FindSpecTests.test_find_submodule_in_module -*test.test_importlib.test_util.Source_FindSpecTests.test_find_submodule_parent_already_imported -*test.test_importlib.test_util.Source_FindSpecTests.test_nothing -*test.test_importlib.test_util.Source_FindSpecTests.test_success -*test.test_importlib.test_util.Source_FindSpecTests.test_sys_modules -*test.test_importlib.test_util.Source_FindSpecTests.test_sys_modules_loader_is_None -*test.test_importlib.test_util.Source_FindSpecTests.test_sys_modules_spec_is_None -*test.test_importlib.test_util.Source_FindSpecTests.test_sys_modules_spec_is_not_set -*test.test_importlib.test_util.Source_FindSpecTests.test_sys_modules_without___loader__ -*test.test_importlib.test_util.Source_MagicNumberTests.test_incorporates_rn -*test.test_importlib.test_util.Source_MagicNumberTests.test_length -*test.test_importlib.test_util.Source_ModuleForLoaderTests.test_attributes_set -*test.test_importlib.test_util.Source_ModuleForLoaderTests.test_decorator_attrs -*test.test_importlib.test_util.Source_ModuleForLoaderTests.test_false_module -*test.test_importlib.test_util.Source_ModuleForLoaderTests.test_new_module -*test.test_importlib.test_util.Source_ModuleForLoaderTests.test_new_module_failure -*test.test_importlib.test_util.Source_ModuleForLoaderTests.test_reload -*test.test_importlib.test_util.Source_ModuleForLoaderTests.test_reload_failure -*test.test_importlib.test_util.Source_ModuleForLoaderTests.test_warning -*test.test_importlib.test_util.Source_ModuleFromSpecTests.test___cached__ -*test.test_importlib.test_util.Source_ModuleFromSpecTests.test___file__ -*test.test_importlib.test_util.Source_ModuleFromSpecTests.test___loader__ -*test.test_importlib.test_util.Source_ModuleFromSpecTests.test___name__ -*test.test_importlib.test_util.Source_ModuleFromSpecTests.test___package__ -*test.test_importlib.test_util.Source_ModuleFromSpecTests.test___path__ -*test.test_importlib.test_util.Source_ModuleFromSpecTests.test___spec__ -*test.test_importlib.test_util.Source_ModuleFromSpecTests.test_create_module -*test.test_importlib.test_util.Source_ModuleFromSpecTests.test_create_module_returns_None -*test.test_importlib.test_util.Source_ModuleFromSpecTests.test_no_create_module -*test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source -*test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_cwd -*test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_debug_override -*test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_debug_override_optimization_both_set -*test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_no_cache_tag -*test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_no_dot -*test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_optimization_None -*test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_optimization_empty_string -*test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_optimization_set -*test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_override -*test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_path_like_arg -*test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_respects_pycache_prefix -*test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_respects_pycache_prefix_relative -*test.test_importlib.test_util.Source_PEP3147Tests.test_sep_altsep_and_sep_cache_from_source -*test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache -*test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_bad_path -*test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_inside_pycache_prefix -*test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_missing_optimization -*test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_no__pycache__ -*test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_no_cache_tag -*test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_no_slash -*test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_not_opt -*test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_optimized_bytecode -*test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_outside_pycache_prefix -*test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_path_like_arg -*test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_too_few_dots -*test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_too_many_dots -*test.test_importlib.test_util.Source_ResolveNameTests.test_absolute -*test.test_importlib.test_util.Source_ResolveNameTests.test_absolute_within_package -*test.test_importlib.test_util.Source_ResolveNameTests.test_escape -*test.test_importlib.test_util.Source_ResolveNameTests.test_in_package -*test.test_importlib.test_util.Source_ResolveNameTests.test_no_package -*test.test_importlib.test_util.Source_ResolveNameTests.test_other_package -*test.test_importlib.test_util.Source_SetLoaderTests.test_attribute_is_None -*test.test_importlib.test_util.Source_SetLoaderTests.test_no_attribute -*test.test_importlib.test_util.Source_SetLoaderTests.test_not_reset -*test.test_importlib.test_util.Source_SetPackageTests.test_decorator_attrs -*test.test_importlib.test_util.Source_SetPackageTests.test_leaving_alone -*test.test_importlib.test_util.Source_SetPackageTests.test_package -*test.test_importlib.test_util.Source_SetPackageTests.test_setting_if_missing -*test.test_importlib.test_util.Source_SetPackageTests.test_submodule -*test.test_importlib.test_util.Source_SetPackageTests.test_top_level -*test.test_importlib.test_zip.TestEgg.test_case_insensitive -*test.test_importlib.test_zip.TestEgg.test_files -*test.test_importlib.test_zip.TestEgg.test_missing_metadata -*test.test_importlib.test_zip.TestEgg.test_normalized_name -*test.test_importlib.test_zip.TestEgg.test_one_distribution -*test.test_importlib.test_zip.TestEgg.test_zip_entry_points -*test.test_importlib.test_zip.TestEgg.test_zip_version -*test.test_importlib.test_zip.TestEgg.test_zip_version_does_not_match -*test.test_importlib.test_zip.TestZip.test_case_insensitive -*test.test_importlib.test_zip.TestZip.test_files -*test.test_importlib.test_zip.TestZip.test_missing_metadata -*test.test_importlib.test_zip.TestZip.test_one_distribution -*test.test_importlib.test_zip.TestZip.test_zip_entry_points -*test.test_importlib.test_zip.TestZip.test_zip_version -*test.test_importlib.test_zip.TestZip.test_zip_version_does_not_match -*unittest.loader.ModuleSkipped.test.test_importlib.test_windows +test.test_importlib.builtin.test_finder.Frozen_FindSpecTests.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_finder.Frozen_FindSpecTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_finder.Frozen_FinderTests.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_finder.Frozen_FinderTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_finder.Source_FindSpecTests.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_finder.Source_FindSpecTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_finder.Source_FinderTests.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_finder.Source_FinderTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_loader.Frozen_InspectLoaderTests.test_get_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_loader.Frozen_InspectLoaderTests.test_get_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_loader.Frozen_InspectLoaderTests.test_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_loader.Frozen_InspectLoaderTests.test_not_builtin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_loader.Frozen_LoaderTests.test_already_imported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_loader.Frozen_LoaderTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_loader.Frozen_LoaderTests.test_module_reuse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_loader.Frozen_LoaderTests.test_unloadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_loader.Source_InspectLoaderTests.test_get_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_loader.Source_InspectLoaderTests.test_get_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_loader.Source_InspectLoaderTests.test_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_loader.Source_InspectLoaderTests.test_not_builtin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_loader.Source_LoaderTests.test_already_imported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_loader.Source_LoaderTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_loader.Source_LoaderTests.test_module_reuse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.builtin.test_loader.Source_LoaderTests.test_unloadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_case_sensitivity.Frozen_ExtensionModuleCaseSensitivityTest.test_case_insensitivity @ darwin-arm64,darwin-x86_64 +test.test_importlib.extension.test_case_sensitivity.Frozen_ExtensionModuleCaseSensitivityTest.test_case_sensitive @ darwin-arm64,darwin-x86_64 +test.test_importlib.extension.test_case_sensitivity.Source_ExtensionModuleCaseSensitivityTest.test_case_insensitivity @ darwin-arm64,darwin-x86_64 +test.test_importlib.extension.test_case_sensitivity.Source_ExtensionModuleCaseSensitivityTest.test_case_sensitive @ darwin-arm64,darwin-x86_64 +test.test_importlib.extension.test_finder.Frozen_FinderTests.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_finder.Frozen_FinderTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_finder.Source_FinderTests.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_finder.Source_FinderTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_inequality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_load_module_API @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_module_reuse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_unloadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_bad_modules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_functionality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_load_short_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_load_submodule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_load_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_nonascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_nonmodule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_nonmodule_with_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_null_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_reload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_try_registration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_unloadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_unloadable_nonascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_LoaderTests.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_LoaderTests.test_inequality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_LoaderTests.test_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_LoaderTests.test_load_module_API @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_LoaderTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_LoaderTests.test_module_reuse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_LoaderTests.test_unloadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_bad_modules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_functionality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_load_short_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_load_submodule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_load_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_nonascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_nonmodule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_nonmodule_with_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_null_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_reload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_try_registration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_unloadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_unloadable_nonascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_path_hook.Frozen_PathHookTests.test_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.extension.test_path_hook.Source_PathHookTests.test_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_not_using_frozen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_path_ignored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_target_ignored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FinderTests.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FinderTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FinderTests.test_module_in_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FinderTests.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_not_using_frozen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_path_ignored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_target_ignored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FinderTests.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FinderTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FinderTests.test_module_in_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FinderTests.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_ExecModuleTests.test_lacking_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_ExecModuleTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_ExecModuleTests.test_module_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_ExecModuleTests.test_module_repr_indirect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_ExecModuleTests.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_ExecModuleTests.test_unloadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_InspectLoaderTests.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_InspectLoaderTests.test_get_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_InspectLoaderTests.test_get_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_InspectLoaderTests.test_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_lacking_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_module_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_module_reuse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_unloadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Source_ExecModuleTests.test_lacking_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Source_ExecModuleTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Source_ExecModuleTests.test_module_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Source_ExecModuleTests.test_module_repr_indirect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Source_ExecModuleTests.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Source_ExecModuleTests.test_unloadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Source_InspectLoaderTests.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Source_InspectLoaderTests.test_get_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Source_InspectLoaderTests.test_get_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Source_InspectLoaderTests.test_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Source_LoaderTests.test_lacking_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Source_LoaderTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Source_LoaderTests.test_module_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Source_LoaderTests.test_module_reuse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Source_LoaderTests.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.frozen.test_loader.Source_LoaderTests.test_unloadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___loader__.Frozen_LoaderAttributeTests.test___loader___is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___loader__.Frozen_LoaderAttributeTests.test___loader___missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___loader__.Frozen_SpecLoaderAttributeTests.test___loader__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___loader__.Source_LoaderAttributeTests.test___loader___is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___loader__.Source_LoaderAttributeTests.test___loader___missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___loader__.Source_SpecLoaderAttributeTests.test___loader__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_None_as___package__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_bad__package__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_bunk__package__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_spec_fallback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_using___name__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_using___package__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_warn_when_package_and_spec_disagree @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_warn_when_using___name__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_None_as___package__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_bad__package__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_bunk__package__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_spec_fallback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_using___name__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_using___package__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_warn_when_package_and_spec_disagree @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_warn_when_using___name__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Setting__package__PEP302.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Setting__package__PEP302.test_submodule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Setting__package__PEP302.test_top_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Setting__package__PEP451.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Setting__package__PEP451.test_submodule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Setting__package__PEP451.test_top_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_None_as___package__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_bad__package__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_bunk__package__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_spec_fallback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_using___name__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_using___package__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_warn_when_package_and_spec_disagree @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_warn_when_using___name__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_None_as___package__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_bad__package__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_bunk__package__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_spec_fallback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_using___name__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_using___package__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_warn_when_package_and_spec_disagree @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_warn_when_using___name__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Frozen_OldAPITests.test_blocked_fromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Frozen_OldAPITests.test_fromlist_load_error_propagates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Frozen_OldAPITests.test_name_requires_rparition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Frozen_OldAPITests.test_negative_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Frozen_OldAPITests.test_nonexistent_fromlist_entry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Frozen_OldAPITests.test_raises_ModuleNotFoundError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Frozen_SpecAPITests.test_blocked_fromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Frozen_SpecAPITests.test_fromlist_load_error_propagates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Frozen_SpecAPITests.test_name_requires_rparition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Frozen_SpecAPITests.test_negative_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Frozen_SpecAPITests.test_nonexistent_fromlist_entry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Frozen_SpecAPITests.test_raises_ModuleNotFoundError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Source_OldAPITests.test_blocked_fromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Source_OldAPITests.test_fromlist_load_error_propagates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Source_OldAPITests.test_name_requires_rparition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Source_OldAPITests.test_negative_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Source_OldAPITests.test_nonexistent_fromlist_entry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Source_OldAPITests.test_raises_ModuleNotFoundError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Source_SpecAPITests.test_blocked_fromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Source_SpecAPITests.test_fromlist_load_error_propagates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Source_SpecAPITests.test_name_requires_rparition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Source_SpecAPITests.test_negative_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Source_SpecAPITests.test_nonexistent_fromlist_entry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_api.Source_SpecAPITests.test_raises_ModuleNotFoundError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_caching.Frozen_UseCache.test_None_in_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_caching.Frozen_UseCache.test_using_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_caching.ImportlibUseCache.test_None_in_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_caching.ImportlibUseCache.test_using_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_caching.ImportlibUseCache.test_using_cache_after_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_caching.ImportlibUseCache.test_using_cache_for_assigning_to_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_caching.ImportlibUseCache.test_using_cache_for_fromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_caching.Source_UseCache.test_None_in_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_caching.Source_UseCache.test_using_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_empty_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_fromlist_as_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_invalid_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_invalid_type_in_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_module_from_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_module_from_package_triggers_ModuleNotFoundError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_nonexistent_from_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_nonexistent_in_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_nonexistent_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_star_in_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_star_with_others @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_using_star @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_ReturnValue.test_return_from_from_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_ReturnValue.test_return_from_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_empty_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_fromlist_as_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_invalid_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_invalid_type_in_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_module_from_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_module_from_package_triggers_ModuleNotFoundError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_nonexistent_from_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_nonexistent_in_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_nonexistent_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_star_in_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_star_with_others @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_using_star @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_ReturnValue.test_return_from_from_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_ReturnValue.test_return_from_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_meta_path.Frozen_CallSignaturePEP302.test_no_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_meta_path.Frozen_CallSignaturePEP302.test_with_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_meta_path.Frozen_CallSignaturePEP451.test_no_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_meta_path.Frozen_CallSignaturePEP451.test_with_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_meta_path.Frozen_CallingOrder.test_continuing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_meta_path.Frozen_CallingOrder.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_meta_path.Frozen_CallingOrder.test_first_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_meta_path.Source_CallSignaturePEP302.test_no_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_meta_path.Source_CallSignaturePEP302.test_with_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_meta_path.Source_CallSignaturePEP451.test_no_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_meta_path.Source_CallSignaturePEP451.test_with_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_meta_path.Source_CallingOrder.test_continuing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_meta_path.Source_CallingOrder.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_meta_path.Source_CallingOrder.test_first_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_bad_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_import_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_module_not_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_module_not_package_but_side_effects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_raising_parent_after_double_relative_importing_child @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_raising_parent_after_importing_child @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_raising_parent_after_relative_importing_child @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_bad_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_import_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_module_not_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_module_not_package_but_side_effects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_raising_parent_after_double_relative_importing_child @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_raising_parent_after_importing_child @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_raising_parent_after_relative_importing_child @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_None_on_sys_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_deleted_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_empty_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_empty_path_hooks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_finder_with_find_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_finder_with_find_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_finder_with_find_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_invalidate_caches_clear_out_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_invalidate_caches_clear_out_relative_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_invalidate_caches_finders @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_path_hooks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_path_importer_cache_empty_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_sys_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_None_on_sys_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_deleted_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_empty_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_empty_path_hooks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_finder_with_find_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_finder_with_find_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_finder_with_find_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_invalidate_caches_clear_out_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_invalidate_caches_clear_out_relative_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_invalidate_caches_finders @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_path_hooks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_path_importer_cache_empty_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_sys_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_PathEntryFinderTests.test_finder_with_failing_find_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Frozen_PathEntryFinderTests.test_finder_with_failing_find_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_None_on_sys_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_deleted_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_empty_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_empty_path_hooks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_finder_with_find_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_finder_with_find_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_finder_with_find_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_invalidate_caches_clear_out_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_invalidate_caches_clear_out_relative_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_invalidate_caches_finders @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_path_hooks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_path_importer_cache_empty_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_sys_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_None_on_sys_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_deleted_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_empty_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_empty_path_hooks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_finder_with_find_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_finder_with_find_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_finder_with_find_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_invalidate_caches_clear_out_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_invalidate_caches_clear_out_relative_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_invalidate_caches_finders @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_path_hooks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_path_importer_cache_empty_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_sys_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_PathEntryFinderTests.test_finder_with_failing_find_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_path.Source_PathEntryFinderTests.test_finder_with_failing_find_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_attr_from_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_deep_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_empty_name_w_level_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_import_from_different_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_import_relative_import_no_fromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_module_from_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_module_to_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_package_to_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_package_to_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_relative_import_no_globals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_relative_import_no_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_relative_import_no_package_exists_absolute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_too_high_from_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_too_high_from_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_attr_from_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_deep_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_empty_name_w_level_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_import_from_different_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_import_relative_import_no_fromlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_module_from_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_module_to_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_package_to_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_package_to_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_relative_import_no_globals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_relative_import_no_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_relative_import_no_package_exists_absolute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_too_high_from_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_too_high_from_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_case_sensitivity.Frozen_CaseSensitivityTestPEP302.test_insensitive @ darwin-arm64,darwin-x86_64 +test.test_importlib.source.test_case_sensitivity.Frozen_CaseSensitivityTestPEP302.test_sensitive @ darwin-arm64,darwin-x86_64 +test.test_importlib.source.test_case_sensitivity.Frozen_CaseSensitivityTestPEP451.test_insensitive @ darwin-arm64,darwin-x86_64 +test.test_importlib.source.test_case_sensitivity.Frozen_CaseSensitivityTestPEP451.test_sensitive @ darwin-arm64,darwin-x86_64 +test.test_importlib.source.test_case_sensitivity.Source_CaseSensitivityTestPEP302.test_insensitive @ darwin-arm64,darwin-x86_64 +test.test_importlib.source.test_case_sensitivity.Source_CaseSensitivityTestPEP302.test_sensitive @ darwin-arm64,darwin-x86_64 +test.test_importlib.source.test_case_sensitivity.Source_CaseSensitivityTestPEP451.test_insensitive @ darwin-arm64,darwin-x86_64 +test.test_importlib.source.test_case_sensitivity.Source_CaseSensitivityTestPEP451.test_sensitive @ darwin-arm64,darwin-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_bad_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_checked_hash_based_pyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_file_from_empty_string_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_get_filename_API @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_inequality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_lacking_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_load_module_API @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_module_reuse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_overridden_checked_hash_based_pyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_overridden_unchecked_hash_based_pyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_state_after_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_timestamp_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_unchecked_hash_based_pyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_unloadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_bad_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_bad_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_empty_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_magic_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_no_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_non_code_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_old_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_partial_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_partial_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_partial_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_partial_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_partial_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_read_only_bytecode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_bad_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_bad_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_empty_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_magic_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_no_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_non_code_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_old_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_partial_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_partial_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_partial_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_partial_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_partial_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_read_only_bytecode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_bad_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_empty_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_magic_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_no_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_non_code_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_partial_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_partial_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_partial_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_partial_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_partial_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_bad_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_empty_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_magic_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_no_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_non_code_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_partial_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_partial_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_partial_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_partial_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_partial_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_bad_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_checked_hash_based_pyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_file_from_empty_string_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_get_filename_API @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_inequality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_lacking_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_load_module_API @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_module_reuse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_overridden_checked_hash_based_pyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_overridden_unchecked_hash_based_pyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_state_after_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_timestamp_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_unchecked_hash_based_pyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_unloadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_bad_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_checked_hash_based_pyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_file_from_empty_string_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_get_filename_API @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_inequality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_lacking_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_load_module_API @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_module_reuse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_overridden_checked_hash_based_pyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_overridden_unchecked_hash_based_pyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_state_after_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_timestamp_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_unchecked_hash_based_pyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_unloadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_bad_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_bad_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_empty_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_magic_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_no_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_non_code_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_old_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_partial_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_partial_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_partial_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_partial_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_partial_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_read_only_bytecode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_bad_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_bad_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_empty_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_magic_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_no_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_non_code_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_old_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_partial_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_partial_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_partial_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_partial_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_partial_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_read_only_bytecode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_bad_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_empty_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_magic_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_no_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_non_code_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_partial_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_partial_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_partial_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_partial_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_partial_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_bad_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_empty_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_magic_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_no_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_non_code_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_partial_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_partial_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_partial_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_partial_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_partial_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_dir_removal_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_empty_string_for_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_ignore_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_invalidate_caches @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_module_in_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_no_read_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_package_in_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_package_over_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_dir_removal_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_empty_string_for_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_ignore_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_invalidate_caches @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_module_in_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_no_read_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_package_in_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_package_over_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_dir_removal_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_empty_string_for_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_ignore_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_invalidate_caches @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_module_in_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_no_read_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_package_in_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_package_over_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_dir_removal_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_empty_string_for_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_ignore_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_invalidate_caches @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_module_in_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_no_read_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_package_in_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_package_over_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_dir_removal_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_empty_string_for_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_ignore_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_invalidate_caches @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_module_in_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_no_read_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_package_in_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_package_over_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_dir_removal_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_empty_string_for_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_ignore_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_invalidate_caches @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_module_in_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_no_read_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_package_in_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_package_over_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_path_hook.Frozen_PathHookTest.test_empty_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_path_hook.Frozen_PathHookTest.test_empty_string_legacy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_path_hook.Frozen_PathHookTest.test_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_path_hook.Frozen_PathHookTest.test_success_legacy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_path_hook.Source_PathHookTest.test_empty_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_path_hook.Source_PathHookTest.test_empty_string_legacy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_path_hook.Source_PathHookTest.test_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_path_hook.Source_PathHookTest.test_success_legacy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_bom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_bom_and_utf_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_bom_conflict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_default_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_encoding_on_first_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_encoding_on_second_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_non_obvious_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_bom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_bom_and_utf_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_bom_conflict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_default_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_encoding_on_first_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_encoding_on_second_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_non_obvious_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_LineEndingTestPEP302.test_cr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_LineEndingTestPEP302.test_crlf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_LineEndingTestPEP302.test_lf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_LineEndingTestPEP451.test_cr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_LineEndingTestPEP451.test_crlf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_LineEndingTestPEP451.test_lf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_bom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_bom_and_utf_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_bom_conflict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_default_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_encoding_on_first_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_encoding_on_second_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_non_obvious_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_bom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_bom_and_utf_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_bom_conflict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_default_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_encoding_on_first_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_encoding_on_second_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_non_obvious_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_LineEndingTestPEP302.test_cr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_LineEndingTestPEP302.test_crlf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_LineEndingTestPEP302.test_lf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_LineEndingTestPEP451.test_cr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_LineEndingTestPEP451.test_crlf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_LineEndingTestPEP451.test_lf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_ExecutionLoader.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_ExecutionLoader.test_superclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_ExecutionLoaderGetCodeTests.test_get_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_ExecutionLoaderGetCodeTests.test_get_code_no_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_ExecutionLoaderGetCodeTests.test_get_code_source_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_ExecutionLoaderGetCodeTests.test_get_code_source_not_found @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_FileLoader.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_FileLoader.test_superclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoader.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoader.test_superclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderDefaultsTests.test_get_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderDefaultsTests.test_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderGetCodeTests.test_get_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderGetCodeTests.test_get_code_source_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderGetCodeTests.test_get_code_source_not_found @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderLoadModuleTests.test_get_code_ImportError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderLoadModuleTests.test_get_code_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderLoadModuleTests.test_module_returned @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderSourceToCodeTests.test_source_to_code_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderSourceToCodeTests.test_source_to_code_no_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderSourceToCodeTests.test_source_to_code_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderSourceToCodeTests.test_source_to_code_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_LoaderDefaultsTests.test_create_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_LoaderDefaultsTests.test_load_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_LoaderDefaultsTests.test_module_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_LoaderLoadModuleTests.test_fresh @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_LoaderLoadModuleTests.test_reload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_MetaPathFinder.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_MetaPathFinder.test_superclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_MetaPathFinderDefaultsTests.test_find_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_MetaPathFinderDefaultsTests.test_invalidate_caches @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_MetaPathFinderFindModuleTests.test_find_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_MetaPathFinderFindModuleTests.test_find_spec_with_explicit_target @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_MetaPathFinderFindModuleTests.test_no_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_MetaPathFinderFindModuleTests.test_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_PathEntryFinder.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_PathEntryFinder.test_superclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_PathEntryFinderDefaultsTests.test_find_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_PathEntryFinderDefaultsTests.test_invalidate_caches @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_PathEntryFinderFindLoaderTests.test_no_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_PathEntryFinderFindLoaderTests.test_spec_with_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_PathEntryFinderFindLoaderTests.test_spec_with_portions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_ResourceLoader.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_ResourceLoader.test_superclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_ResourceLoaderDefaultsTests.test_get_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_ResourceReaderDefaultsTests.test_contents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_ResourceReaderDefaultsTests.test_is_resource @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_ResourceReaderDefaultsTests.test_open_resource @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_ResourceReaderDefaultsTests.test_resource_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoader.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoader.test_superclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_code_bad_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_code_bad_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_code_with_everything @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_dont_write_bytecode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_no_bytecode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_no_set_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_set_data_raises_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderGetSourceTests.test_decoded_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderGetSourceTests.test_default_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderGetSourceTests.test_universal_newlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_get_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_get_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_get_source_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_load_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_package_settings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_source_to_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_ExecutionLoader.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_ExecutionLoader.test_superclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_ExecutionLoaderGetCodeTests.test_get_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_ExecutionLoaderGetCodeTests.test_get_code_no_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_ExecutionLoaderGetCodeTests.test_get_code_source_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_ExecutionLoaderGetCodeTests.test_get_code_source_not_found @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_FileLoader.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_FileLoader.test_superclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoader.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoader.test_superclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderDefaultsTests.test_get_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderDefaultsTests.test_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderGetCodeTests.test_get_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderGetCodeTests.test_get_code_source_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderGetCodeTests.test_get_code_source_not_found @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderLoadModuleTests.test_get_code_ImportError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderLoadModuleTests.test_get_code_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderLoadModuleTests.test_module_returned @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderSourceToCodeTests.test_source_to_code_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderSourceToCodeTests.test_source_to_code_no_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderSourceToCodeTests.test_source_to_code_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderSourceToCodeTests.test_source_to_code_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_LoaderDefaultsTests.test_create_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_LoaderDefaultsTests.test_load_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_LoaderDefaultsTests.test_module_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_LoaderLoadModuleTests.test_fresh @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_LoaderLoadModuleTests.test_reload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_MetaPathFinder.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_MetaPathFinder.test_superclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_MetaPathFinderDefaultsTests.test_find_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_MetaPathFinderDefaultsTests.test_invalidate_caches @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_MetaPathFinderFindModuleTests.test_find_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_MetaPathFinderFindModuleTests.test_find_spec_with_explicit_target @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_MetaPathFinderFindModuleTests.test_no_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_MetaPathFinderFindModuleTests.test_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_PathEntryFinder.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_PathEntryFinder.test_superclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_PathEntryFinderDefaultsTests.test_find_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_PathEntryFinderDefaultsTests.test_invalidate_caches @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_PathEntryFinderFindLoaderTests.test_no_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_PathEntryFinderFindLoaderTests.test_spec_with_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_PathEntryFinderFindLoaderTests.test_spec_with_portions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_ResourceLoader.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_ResourceLoader.test_superclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_ResourceLoaderDefaultsTests.test_get_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_ResourceReaderDefaultsTests.test_contents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_ResourceReaderDefaultsTests.test_is_resource @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_ResourceReaderDefaultsTests.test_open_resource @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_ResourceReaderDefaultsTests.test_resource_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoader.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoader.test_superclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_code_bad_magic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_code_bad_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_code_with_everything @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_dont_write_bytecode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_no_bytecode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_no_set_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_set_data_raises_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderGetSourceTests.test_decoded_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderGetSourceTests.test_default_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderGetSourceTests.test_universal_newlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_get_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_get_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_get_source_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_load_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_package_settings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_source_to_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.FrozenImportlibTests.test_no_frozen_importlib @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP302Tests.test_nothing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP302Tests.test_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP302Tests.test_success_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP302Tests.test_sys_modules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP302Tests.test_sys_modules_loader_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP302Tests.test_sys_modules_loader_is_not_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP451Tests.test_nothing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP451Tests.test_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP451Tests.test_success_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP451Tests.test_sys_modules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP451Tests.test_sys_modules_loader_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP451Tests.test_sys_modules_loader_is_not_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_ImportModuleTests.test_absolute_import_with_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_ImportModuleTests.test_absolute_package_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_ImportModuleTests.test_deep_relative_package_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_ImportModuleTests.test_loaded_once @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_ImportModuleTests.test_module_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_ImportModuleTests.test_relative_import_wo_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_ImportModuleTests.test_shallow_relative_package_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_InvalidateCacheTests.test_method_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_InvalidateCacheTests.test_method_lacking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_ReloadTests.test_module_missing_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_ReloadTests.test_module_replaced @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_ReloadTests.test_reload_loader_replaced @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_ReloadTests.test_reload_location_changed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_ReloadTests.test_reload_missing_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_ReloadTests.test_reload_modules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_ReloadTests.test_reload_namespace_changed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_ReloadTests.test_reload_submodule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_StartupTests.test_everyone_has___loader__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Frozen_StartupTests.test_everyone_has___spec__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP302Tests.test_nothing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP302Tests.test_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP302Tests.test_success_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP302Tests.test_sys_modules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP302Tests.test_sys_modules_loader_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP302Tests.test_sys_modules_loader_is_not_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP451Tests.test_nothing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP451Tests.test_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP451Tests.test_success_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP451Tests.test_sys_modules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP451Tests.test_sys_modules_loader_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP451Tests.test_sys_modules_loader_is_not_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_ImportModuleTests.test_absolute_import_with_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_ImportModuleTests.test_absolute_package_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_ImportModuleTests.test_deep_relative_package_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_ImportModuleTests.test_loaded_once @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_ImportModuleTests.test_module_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_ImportModuleTests.test_relative_import_wo_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_ImportModuleTests.test_shallow_relative_package_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_InvalidateCacheTests.test_method_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_InvalidateCacheTests.test_method_lacking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_ReloadTests.test_module_missing_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_ReloadTests.test_module_replaced @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_ReloadTests.test_reload_loader_replaced @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_ReloadTests.test_reload_location_changed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_ReloadTests.test_reload_missing_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_ReloadTests.test_reload_modules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_ReloadTests.test_reload_namespace_changed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_ReloadTests.test_reload_submodule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_StartupTests.test_everyone_has___loader__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_api.Source_StartupTests.test_everyone_has___spec__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesNoReaderTests.test_spec_path_joinpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_child_path_is @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_child_path_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_child_path_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_child_path_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_open_invalid_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_orphan_path_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_orphan_path_is @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_orphan_path_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_orphan_path_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_orphan_path_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_spec_path_is @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_spec_path_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_spec_path_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_spec_path_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_wrap_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_contents.ContentsDiskTests.test_contents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_contents.ContentsNamespaceTests.test_contents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_contents.ContentsZipTests.test_contents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_files.OpenDiskTests.test_read_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_files.OpenDiskTests.test_read_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_files.OpenDiskTests.test_traversable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_files.OpenNamespaceTests.test_read_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_files.OpenNamespaceTests.test_read_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_files.OpenNamespaceTests.test_traversable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_files.OpenZipTests.test_read_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_files.OpenZipTests.test_read_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_files.OpenZipTests.test_traversable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderFactoryTests.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderFactoryTests.test_validation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_attr_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_delete_eventual_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_delete_preexisting_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_e2e @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_module_already_in_sys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_module_substitution_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_mutated_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_mutated_preexisting_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_new_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Frozen_DeadlockAvoidanceTests.test_deadlock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Frozen_DeadlockAvoidanceTests.test_no_deadlock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Frozen_LifetimeTests.test_lock_lifetime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_acquire_contended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_acquire_destroy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_acquire_release @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_different_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_reacquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_release_unacquired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_thread_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_weakref_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Source_DeadlockAvoidanceTests.test_deadlock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Source_DeadlockAvoidanceTests.test_no_deadlock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +# GC-dependent +!test.test_importlib.test_locks.Source_LifetimeTests.test_all_locks @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Source_LifetimeTests.test_lock_lifetime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_acquire_contended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_acquire_destroy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_acquire_release @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_different_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_reacquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_release_unacquired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_thread_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_weakref_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.BasicTests.test_for_name_does_not_exist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.BasicTests.test_invalid_inputs_to_from_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.BasicTests.test_new_style_classes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.BasicTests.test_package_not_found_mentions_metadata @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.BasicTests.test_retrieves_version_of_self @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.DirectoryTest.test_egg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.DirectoryTest.test_egg_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.DiscoveryTests.test_invalid_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.DiscoveryTests.test_package_discovery @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.FileSystem.test_unicode_dir_on_sys_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.ImportTests.test_entrypoint_with_colon_in_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.ImportTests.test_import_nonexistent_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.ImportTests.test_resolve @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.ImportTests.test_resolve_without_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.MissingSysPath.test_discovery @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.NameNormalizationTests.test_dashes_in_dist_name_found_as_underscores @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.NameNormalizationTests.test_dist_name_found_as_any_case @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.NameNormalizationTests.test_unique_distributions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.NonASCIITests.test_metadata_loads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.NonASCIITests.test_metadata_loads_egg_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.PackagesDistributionsPrebuiltTest.test_packages_distributions_example @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.PackagesDistributionsPrebuiltTest.test_packages_distributions_example2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.PackagesDistributionsTest.test_packages_distributions_neither_toplevel_nor_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.TestEntryPoints.test_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.TestEntryPoints.test_entry_point_pickleable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.TestEntryPoints.test_hashable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.TestEntryPoints.test_immutable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.TestEntryPoints.test_json_dump @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.TestEntryPoints.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.TestEntryPoints.test_positional_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.TestEntryPoints.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_main.TestEntryPoints.test_sortable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_as_json @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_as_json_egg_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_as_json_odd_case @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points_allows_no_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points_by_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points_dict_construction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points_distribution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points_groups_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points_groups_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points_missing_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points_missing_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points_unique_packages_normalized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_file_hash_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_files_dist_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_files_egg_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_for_name_does_not_exist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_for_top_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_metadata_for_this_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_more_complex_deps_requires_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_name_normalization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_prefix_not_matched @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_read_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_requires_dist_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_requires_egg_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_requires_egg_info_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_requires_egg_info_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_retrieves_version_of_distinfo_pkg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_retrieves_version_of_self @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_version_egg_info_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.InvalidateCache.test_invalidate_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.LegacyDots.test_name_normalization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.LegacyDots.test_name_normalization_versionless_egg_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.OffSysPathTests.test_distribution_at_pathlib @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.OffSysPathTests.test_distribution_at_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_metadata_api.OffSysPathTests.test_find_distributions_specified_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.CombinedNamespacePackages.test_imports @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.DynamicPathCalculation.test_project3_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.DynamicPathCalculation.test_project3_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.DynamicPathNamespacePackage.test_dynamic_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.LegacySupport.test_non_namespace_package_takes_precedence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.LoaderTests.test_loader_abc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.LoaderTests.test_namespace_loader_consistency @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.LoaderTests.test_namespace_origin_consistency @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.LoaderTests.test_path_indexable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.ModuleAndNamespacePackageInSameDir.test_module_before_namespace_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.ReloadTests.test_cant_import_other @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.ReloadTests.test_dynamic_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.ReloadTests.test_simple_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.SeparatedNamespacePackages.test_imports @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.SeparatedNamespacePackagesCreatedWhileRunning.test_invalidate_caches @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.SeparatedNestedZipNamespacePackages.test_imports @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.SeparatedOverlappingNamespacePackages.test_first_path_wins @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.SeparatedOverlappingNamespacePackages.test_first_path_wins_again @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.SeparatedOverlappingNamespacePackages.test_first_path_wins_importing_second_first @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.SeparatedZipNamespacePackages.test_imports @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.SingleNamespacePackage.test_cant_import_other @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.SingleNamespacePackage.test_module_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.SingleNamespacePackage.test_simple_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.SingleNestedZipNamespacePackage.test_cant_import_other @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.SingleNestedZipNamespacePackage.test_simple_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.SingleZipNamespacePackage.test_cant_import_other @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.SingleZipNamespacePackage.test_simple_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.ZipWithMissingDirectory.test_missing_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_namespace_pkgs.ZipWithMissingDirectory.test_present_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_extant_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_importing_module_as_side_effect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_missing_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_non_package_by_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_non_package_by_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_package_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_package_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_pathlib_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_string_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_useless_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_extant_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_importing_module_as_side_effect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_missing_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_non_package_by_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_non_package_by_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_package_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_package_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_pathlib_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_string_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_useless_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.OpenDiskNamespaceTests.test_open_binary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.OpenDiskNamespaceTests.test_open_binary_FileNotFoundError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.OpenDiskNamespaceTests.test_open_text_FileNotFoundError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.OpenDiskNamespaceTests.test_open_text_default_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.OpenDiskNamespaceTests.test_open_text_given_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.OpenDiskNamespaceTests.test_open_text_with_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.OpenDiskTests.test_open_binary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.OpenDiskTests.test_open_binary_FileNotFoundError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.OpenDiskTests.test_open_text_FileNotFoundError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.OpenDiskTests.test_open_text_default_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.OpenDiskTests.test_open_text_given_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.OpenDiskTests.test_open_text_with_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.OpenZipTests.test_open_binary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.OpenZipTests.test_open_binary_FileNotFoundError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.OpenZipTests.test_open_text_FileNotFoundError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.OpenZipTests.test_open_text_default_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.OpenZipTests.test_open_text_given_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_open.OpenZipTests.test_open_text_with_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_path.CommonTests.test_extant_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_path.CommonTests.test_importing_module_as_side_effect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_path.CommonTests.test_missing_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_path.CommonTests.test_non_package_by_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_path.CommonTests.test_non_package_by_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_path.CommonTests.test_package_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_path.CommonTests.test_package_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_path.CommonTests.test_pathlib_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_path.CommonTests.test_string_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_path.CommonTests.test_useless_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_path.PathDiskTests.test_natural_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_path.PathDiskTests.test_reading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_path.PathMemoryTests.test_reading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_path.PathZipTests.test_reading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_path.PathZipTests.test_remove_in_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_pkg_import.TestImport.test_package_import__semantics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_extant_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_importing_module_as_side_effect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_missing_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_non_package_by_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_non_package_by_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_package_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_package_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_pathlib_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_string_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_useless_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_extant_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_importing_module_as_side_effect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_missing_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_non_package_by_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_non_package_by_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_package_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_package_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_pathlib_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_string_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_useless_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.ReadDiskTests.test_read_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.ReadDiskTests.test_read_text_default_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.ReadDiskTests.test_read_text_given_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.ReadDiskTests.test_read_text_with_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.ReadNamespaceTests.test_read_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.ReadNamespaceTests.test_read_text_default_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.ReadNamespaceTests.test_read_text_given_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.ReadNamespaceTests.test_read_text_with_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.ReadZipTests.test_read_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.ReadZipTests.test_read_submodule_resource @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.ReadZipTests.test_read_submodule_resource_by_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.ReadZipTests.test_read_text_default_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.ReadZipTests.test_read_text_given_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_read.ReadZipTests.test_read_text_with_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_init_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_init_no_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_is_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_is_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_iterdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_iterdir_duplicate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_join_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_open_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_reader.NamespaceReaderTest.test_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_reader.NamespaceReaderTest.test_init_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_reader.NamespaceReaderTest.test_resource_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.DeletingZipsTest.test_entered_path_does_not_keep_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.DeletingZipsTest.test_is_file_does_not_keep_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.DeletingZipsTest.test_is_file_failure_does_not_keep_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.DeletingZipsTest.test_iterdir_does_not_keep_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.DeletingZipsTest.test_read_binary_does_not_keep_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.DeletingZipsTest.test_read_text_does_not_keep_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceCornerCaseTests.test_package_has_no_reader_fallback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceDiskTests.test_is_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceDiskTests.test_is_file_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceDiskTests.test_is_file_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceFromNamespaceTest01.test_is_submodule_resource @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceFromNamespaceTest01.test_read_submodule_resource_by_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceFromNamespaceTest01.test_submodule_contents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceFromNamespaceTest01.test_submodule_contents_by_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceFromZipsTest01.test_is_submodule_resource @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceFromZipsTest01.test_read_submodule_resource_by_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceFromZipsTest01.test_submodule_contents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceFromZipsTest01.test_submodule_contents_by_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceFromZipsTest02.test_unrelated_contents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceLoaderTests.test_is_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceLoaderTests.test_is_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceLoaderTests.test_resource_contents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceLoaderTests.test_resource_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceZipTests.test_is_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceZipTests.test_is_file_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_resource.ResourceZipTests.test_is_file_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_default_bad_suffix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_default_without_location @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_loader_no_location @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_loader_no_location_bad_get_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_loader_no_location_no_get_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_path_like_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_relative_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_default_bad_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_default_no_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_default_not_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_not_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_default_with_bad_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_default_with_file_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_is_package_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_is_package_false_with_fileloader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_is_package_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_is_package_true_with_fileloader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_is_package_with_loader_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_is_package_with_loader_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_origin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_origin_and_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module___loader___module_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module___loader___module_repr_bad @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module___spec__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module___spec___location @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module___spec___no_origin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module___spec___no_origin_no_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module_no_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module_no_file_no_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module_no_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module_with_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_exec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load_failed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load_failed_removed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load_legacy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load_legacy_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load_legacy_attributes_immutable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load_replaced @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_reload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_reload_extra_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_reload_init_module_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_reload_legacy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_reload_modified @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_no_origin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_source_missing_cache_tag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_source_unknown_suffix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_sourceless @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_with_origin_not_location @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_default_is_package_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_default_is_package_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_default_no_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_equality_location @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_has_location_setter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_inequality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_inequality_incomplete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_package_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_default_bad_suffix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_default_without_location @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_loader_no_location @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_loader_no_location_bad_get_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_loader_no_location_no_get_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_path_like_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_relative_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_default_bad_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_default_no_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_default_not_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_not_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_default_with_bad_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_default_with_file_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_is_package_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_is_package_false_with_fileloader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_is_package_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_is_package_true_with_fileloader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_is_package_with_loader_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_is_package_with_loader_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_origin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_origin_and_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module___loader___module_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module___loader___module_repr_bad @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module___spec__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module___spec___location @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module___spec___no_origin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module___spec___no_origin_no_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module_no_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module_no_file_no_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module_no_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module_with_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_exec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load_failed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load_failed_removed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load_legacy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load_legacy_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load_legacy_attributes_immutable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load_replaced @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_reload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_reload_extra_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_reload_init_module_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_reload_legacy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_reload_modified @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_no_origin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_source_missing_cache_tag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_source_unknown_suffix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_sourceless @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_with_origin_not_location @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_default_is_package_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_default_is_package_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_default_no_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_equality_location @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_has_location_setter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_inequality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_inequality_incomplete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_package_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_threaded_import.ThreadedImportTests.test_circular_imports @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_threaded_import.ThreadedImportTests.test_concurrent_futures_circular_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_threaded_import.ThreadedImportTests.test_import_hangers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_threaded_import.ThreadedImportTests.test_multiprocessing_pool_circular_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_threaded_import.ThreadedImportTests.test_parallel_meta_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_threaded_import.ThreadedImportTests.test_parallel_module_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_threaded_import.ThreadedImportTests.test_parallel_path_hooks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_threaded_import.ThreadedImportTests.test_side_effect_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_DecodeSourceBytesTests.test_specified_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_DecodeSourceBytesTests.test_universal_newlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_DecodeSourceBytesTests.test_ut8_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_find_relative_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_find_relative_module_missing_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_find_submodule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_find_submodule_in_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_find_submodule_parent_already_imported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_nothing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_sys_modules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_sys_modules_loader_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_sys_modules_spec_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_sys_modules_spec_is_not_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_sys_modules_without___loader__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_MagicNumberTests.test_incorporates_rn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_MagicNumberTests.test_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_attributes_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_decorator_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_false_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_new_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_new_module_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_reload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_reload_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___cached__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___file__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___loader__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___name__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___package__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___path__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___spec__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test_create_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test_create_module_returns_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test_no_create_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_debug_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_debug_override_optimization_both_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_no_cache_tag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_no_dot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_optimization_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_optimization_empty_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_optimization_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_path_like_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_respects_pycache_prefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_respects_pycache_prefix_relative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_bad_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_inside_pycache_prefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_missing_optimization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_no__pycache__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_no_cache_tag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_no_slash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_not_opt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_optimized_bytecode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_outside_pycache_prefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_path_like_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_too_few_dots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_too_many_dots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ResolveNameTests.test_absolute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ResolveNameTests.test_absolute_within_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ResolveNameTests.test_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ResolveNameTests.test_in_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ResolveNameTests.test_no_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_ResolveNameTests.test_other_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_SetLoaderTests.test_attribute_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_SetLoaderTests.test_no_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_SetLoaderTests.test_not_reset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_SetPackageTests.test_decorator_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_SetPackageTests.test_leaving_alone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_SetPackageTests.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_SetPackageTests.test_setting_if_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_SetPackageTests.test_submodule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Frozen_SetPackageTests.test_top_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_DecodeSourceBytesTests.test_specified_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_DecodeSourceBytesTests.test_universal_newlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_DecodeSourceBytesTests.test_ut8_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_find_relative_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_find_relative_module_missing_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_find_submodule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_find_submodule_in_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_find_submodule_parent_already_imported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_nothing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_sys_modules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_sys_modules_loader_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_sys_modules_spec_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_sys_modules_spec_is_not_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_sys_modules_without___loader__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_MagicNumberTests.test_incorporates_rn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_MagicNumberTests.test_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ModuleForLoaderTests.test_attributes_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ModuleForLoaderTests.test_decorator_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ModuleForLoaderTests.test_false_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ModuleForLoaderTests.test_new_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ModuleForLoaderTests.test_new_module_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ModuleForLoaderTests.test_reload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ModuleForLoaderTests.test_reload_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ModuleForLoaderTests.test_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test___cached__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test___file__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test___loader__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test___name__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test___package__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test___path__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test___spec__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test_create_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test_create_module_returns_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test_no_create_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_debug_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_debug_override_optimization_both_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_no_cache_tag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_no_dot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_optimization_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_optimization_empty_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_optimization_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_path_like_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_respects_pycache_prefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_respects_pycache_prefix_relative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_bad_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_inside_pycache_prefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_missing_optimization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_no__pycache__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_no_cache_tag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_no_slash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_not_opt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_optimized_bytecode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_outside_pycache_prefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_path_like_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_too_few_dots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_too_many_dots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ResolveNameTests.test_absolute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ResolveNameTests.test_absolute_within_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ResolveNameTests.test_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ResolveNameTests.test_in_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ResolveNameTests.test_no_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_ResolveNameTests.test_other_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_SetLoaderTests.test_attribute_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_SetLoaderTests.test_no_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_SetLoaderTests.test_not_reset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_SetPackageTests.test_decorator_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_SetPackageTests.test_leaving_alone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_SetPackageTests.test_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_SetPackageTests.test_setting_if_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_SetPackageTests.test_submodule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_util.Source_SetPackageTests.test_top_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_zip.TestEgg.test_case_insensitive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_zip.TestEgg.test_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_zip.TestEgg.test_missing_metadata @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_zip.TestEgg.test_normalized_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_zip.TestEgg.test_one_distribution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_zip.TestEgg.test_zip_entry_points @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_zip.TestEgg.test_zip_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_zip.TestEgg.test_zip_version_does_not_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_zip.TestZip.test_case_insensitive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_zip.TestZip.test_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_zip.TestZip.test_missing_metadata @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_zip.TestZip.test_one_distribution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_zip.TestZip.test_zip_entry_points @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_zip.TestZip.test_zip_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_importlib.test_zip.TestZip.test_zip_version_does_not_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_index.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_index.txt index af579faa52..62f469b5db 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_index.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_index.txt @@ -1,55 +1,55 @@ -*graalpython.lib-python.3.test.test_index.BaseTestCase.test_basic -*graalpython.lib-python.3.test.test_index.BaseTestCase.test_error -*graalpython.lib-python.3.test.test_index.BaseTestCase.test_index_returns_int_subclass -*graalpython.lib-python.3.test.test_index.BaseTestCase.test_int_subclass_with_index -*graalpython.lib-python.3.test.test_index.BaseTestCase.test_slice -*graalpython.lib-python.3.test.test_index.BaseTestCase.test_subclasses -*graalpython.lib-python.3.test.test_index.BaseTestCase.test_wrappers -*graalpython.lib-python.3.test.test_index.ByteArrayTestCase.test_error -*graalpython.lib-python.3.test.test_index.ByteArrayTestCase.test_index -*graalpython.lib-python.3.test.test_index.ByteArrayTestCase.test_repeat -*graalpython.lib-python.3.test.test_index.ByteArrayTestCase.test_slice -*graalpython.lib-python.3.test.test_index.ByteArrayTestCase.test_slice_bug7532 -*graalpython.lib-python.3.test.test_index.ByteArrayTestCase.test_subclasses -*graalpython.lib-python.3.test.test_index.ByteArrayTestCase.test_wrappers -*graalpython.lib-python.3.test.test_index.BytesTestCase.test_error -*graalpython.lib-python.3.test.test_index.BytesTestCase.test_index -*graalpython.lib-python.3.test.test_index.BytesTestCase.test_repeat -*graalpython.lib-python.3.test.test_index.BytesTestCase.test_slice -*graalpython.lib-python.3.test.test_index.BytesTestCase.test_slice_bug7532 -*graalpython.lib-python.3.test.test_index.BytesTestCase.test_subclasses -*graalpython.lib-python.3.test.test_index.BytesTestCase.test_wrappers -*graalpython.lib-python.3.test.test_index.ListTestCase.test_error -*graalpython.lib-python.3.test.test_index.ListTestCase.test_index -*graalpython.lib-python.3.test.test_index.ListTestCase.test_inplace_repeat -*graalpython.lib-python.3.test.test_index.ListTestCase.test_repeat -*graalpython.lib-python.3.test.test_index.ListTestCase.test_setdelitem -*graalpython.lib-python.3.test.test_index.ListTestCase.test_slice -*graalpython.lib-python.3.test.test_index.ListTestCase.test_slice_bug7532 -*graalpython.lib-python.3.test.test_index.ListTestCase.test_subclasses -*graalpython.lib-python.3.test.test_index.ListTestCase.test_wrappers -*graalpython.lib-python.3.test.test_index.NewSeqTestCase.test_error -*graalpython.lib-python.3.test.test_index.NewSeqTestCase.test_index -*graalpython.lib-python.3.test.test_index.NewSeqTestCase.test_repeat -*graalpython.lib-python.3.test.test_index.NewSeqTestCase.test_slice -*graalpython.lib-python.3.test.test_index.NewSeqTestCase.test_slice_bug7532 -*graalpython.lib-python.3.test.test_index.NewSeqTestCase.test_subclasses -*graalpython.lib-python.3.test.test_index.NewSeqTestCase.test_wrappers -*graalpython.lib-python.3.test.test_index.OverflowTestCase.test_getitem -*graalpython.lib-python.3.test.test_index.OverflowTestCase.test_large_longs -*graalpython.lib-python.3.test.test_index.OverflowTestCase.test_sequence_repeat -*graalpython.lib-python.3.test.test_index.RangeTestCase.test_range -*graalpython.lib-python.3.test.test_index.StringTestCase.test_error -*graalpython.lib-python.3.test.test_index.StringTestCase.test_index -*graalpython.lib-python.3.test.test_index.StringTestCase.test_repeat -*graalpython.lib-python.3.test.test_index.StringTestCase.test_slice -*graalpython.lib-python.3.test.test_index.StringTestCase.test_slice_bug7532 -*graalpython.lib-python.3.test.test_index.StringTestCase.test_subclasses -*graalpython.lib-python.3.test.test_index.StringTestCase.test_wrappers -*graalpython.lib-python.3.test.test_index.TupleTestCase.test_error -*graalpython.lib-python.3.test.test_index.TupleTestCase.test_index -*graalpython.lib-python.3.test.test_index.TupleTestCase.test_repeat -*graalpython.lib-python.3.test.test_index.TupleTestCase.test_slice -*graalpython.lib-python.3.test.test_index.TupleTestCase.test_slice_bug7532 -*graalpython.lib-python.3.test.test_index.TupleTestCase.test_subclasses -*graalpython.lib-python.3.test.test_index.TupleTestCase.test_wrappers +test.test_index.BaseTestCase.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.BaseTestCase.test_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.BaseTestCase.test_index_returns_int_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.BaseTestCase.test_int_subclass_with_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.BaseTestCase.test_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.BaseTestCase.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.BaseTestCase.test_wrappers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.ByteArrayTestCase.test_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.ByteArrayTestCase.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.ByteArrayTestCase.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.ByteArrayTestCase.test_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.ByteArrayTestCase.test_slice_bug7532 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.ByteArrayTestCase.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.ByteArrayTestCase.test_wrappers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.BytesTestCase.test_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.BytesTestCase.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.BytesTestCase.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.BytesTestCase.test_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.BytesTestCase.test_slice_bug7532 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.BytesTestCase.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.BytesTestCase.test_wrappers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.ListTestCase.test_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.ListTestCase.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.ListTestCase.test_inplace_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.ListTestCase.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.ListTestCase.test_setdelitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.ListTestCase.test_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.ListTestCase.test_slice_bug7532 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.ListTestCase.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.ListTestCase.test_wrappers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.NewSeqTestCase.test_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.NewSeqTestCase.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.NewSeqTestCase.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.NewSeqTestCase.test_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.NewSeqTestCase.test_slice_bug7532 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.NewSeqTestCase.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.NewSeqTestCase.test_wrappers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.OverflowTestCase.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.OverflowTestCase.test_large_longs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.OverflowTestCase.test_sequence_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.RangeTestCase.test_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.StringTestCase.test_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.StringTestCase.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.StringTestCase.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.StringTestCase.test_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.StringTestCase.test_slice_bug7532 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.StringTestCase.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.StringTestCase.test_wrappers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.TupleTestCase.test_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.TupleTestCase.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.TupleTestCase.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.TupleTestCase.test_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.TupleTestCase.test_slice_bug7532 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.TupleTestCase.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_index.TupleTestCase.test_wrappers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_inspect.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_inspect.txt index 9483399a73..571f2206b1 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_inspect.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_inspect.txt @@ -1,498 +1,247 @@ -*graalpython.lib-python.3.test.test_inspect.TestBlockComments.test_class_async_method -*graalpython.lib-python.3.test.test_inspect.TestBlockComments.test_class_method -*graalpython.lib-python.3.test.test_inspect.TestBlockComments.test_toplevel_class -*graalpython.lib-python.3.test.test_inspect.TestBoundArguments.test_signature_bound_arguments_apply_defaults -*graalpython.lib-python.3.test.test_inspect.TestBoundArguments.test_signature_bound_arguments_arguments_type -*graalpython.lib-python.3.test.test_inspect.TestBoundArguments.test_signature_bound_arguments_equality -*graalpython.lib-python.3.test.test_inspect.TestBoundArguments.test_signature_bound_arguments_pickle -*graalpython.lib-python.3.test.test_inspect.TestBoundArguments.test_signature_bound_arguments_repr -*graalpython.lib-python.3.test.test_inspect.TestBoundArguments.test_signature_bound_arguments_unhashable -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_class_decorator -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_class_definition_in_multiline_comment -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_class_definition_in_multiline_string_definition -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_class_inside_conditional -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_findsource_binary -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_findsource_code_in_linecache -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_findsource_with_out_of_bounds_lineno -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_findsource_without_filename -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_getsource_on_method -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_method_in_dynamic_class -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_multiline_sig -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_multiple_children_classes -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_nested_class -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_nested_class_definition -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_nested_class_definition_indented_string -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_nested_class_definition_inside_async_function -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_nested_class_definition_inside_function -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_nested_func -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_one_liner_dedent_non_name -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_one_liner_followed_by_non_name -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_with_comment -*graalpython.lib-python.3.test.test_inspect.TestBuggyCases.test_with_comment_instead_of_docstring -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_argspec_api_ignores_wrapped -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_classify_DynamicClassAttribute -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_classify_VirtualAttribute -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_classify_VirtualAttribute_multi_classes -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_classify_builtin_types -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_classify_class_attrs_with_buggy_dir -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_classify_metaclass_class_attribute -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_classify_newstyle -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_classify_overrides_bool -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_get_annotations_with_stock_annotations -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_get_annotations_with_stringized_annotations -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_getargspec -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_getargspec_method -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_getfullargspec -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_getfullargspec_builtin_func -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_getfullargspec_builtin_func_no_signature -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_getfullargspec_definition_order_preserved_on_kwonly -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_getfullargspec_signature_annos -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_getfullargspec_signature_attr -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_getmembers_VirtualAttribute -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_getmembers_descriptors -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_getmembers_method -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_getmembers_with_buggy_dir -*graalpython.lib-python.3.test.test_inspect.TestClassesAndFunctions.test_newstyle_mro -*graalpython.lib-python.3.test.test_inspect.TestDecorators.test_replacing_decorator -*graalpython.lib-python.3.test.test_inspect.TestFormatAnnotation.test_typing_replacement -*graalpython.lib-python.3.test.test_inspect.TestGetClosureVars.test_builtins_as_dict -*graalpython.lib-python.3.test.test_inspect.TestGetClosureVars.test_builtins_as_module -*graalpython.lib-python.3.test.test_inspect.TestGetClosureVars.test_builtins_fallback -*graalpython.lib-python.3.test.test_inspect.TestGetClosureVars.test_generator_closure -*graalpython.lib-python.3.test.test_inspect.TestGetClosureVars.test_getclosurevars_empty -*graalpython.lib-python.3.test.test_inspect.TestGetClosureVars.test_getclosurevars_error -*graalpython.lib-python.3.test.test_inspect.TestGetClosureVars.test_method_closure -*graalpython.lib-python.3.test.test_inspect.TestGetClosureVars.test_name_resolution -*graalpython.lib-python.3.test.test_inspect.TestGetClosureVars.test_nonlocal_vars -*graalpython.lib-python.3.test.test_inspect.TestGetCoroutineState.test_closed_after_exhaustion -*graalpython.lib-python.3.test.test_inspect.TestGetCoroutineState.test_closed_after_immediate_exception -*graalpython.lib-python.3.test.test_inspect.TestGetCoroutineState.test_created -*graalpython.lib-python.3.test.test_inspect.TestGetCoroutineState.test_easy_debugging -*graalpython.lib-python.3.test.test_inspect.TestGetCoroutineState.test_getcoroutinelocals -*graalpython.lib-python.3.test.test_inspect.TestGetCoroutineState.test_suspended -*graalpython.lib-python.3.test.test_inspect.TestGetGeneratorState.test_closed_after_exhaustion -*graalpython.lib-python.3.test.test_inspect.TestGetGeneratorState.test_closed_after_immediate_exception -*graalpython.lib-python.3.test.test_inspect.TestGetGeneratorState.test_created -*graalpython.lib-python.3.test.test_inspect.TestGetGeneratorState.test_easy_debugging -*graalpython.lib-python.3.test.test_inspect.TestGetGeneratorState.test_getgeneratorlocals -*graalpython.lib-python.3.test.test_inspect.TestGetGeneratorState.test_getgeneratorlocals_empty -*graalpython.lib-python.3.test.test_inspect.TestGetGeneratorState.test_getgeneratorlocals_error -*graalpython.lib-python.3.test.test_inspect.TestGetGeneratorState.test_running -*graalpython.lib-python.3.test.test_inspect.TestGetGeneratorState.test_suspended -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_basic -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_classAttribute -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_classVirtualAttribute -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_class_as_property -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_custom_object_dict -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_descriptor -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_descriptor_raises_AttributeError -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_dict_as_property -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_inherited -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_inherited_classattribute -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_inherited_slots -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_instance_attr -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_metaclass -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_metaclass_dict_as_property -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_metaclass_with_descriptor -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_metaclass_with_metaclass_with_dict_as_property -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_module -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_mro_as_property -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_no_dict_no_slots -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_no_dict_no_slots_instance_member -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_property -*graalpython.lib-python.3.test.test_inspect.TestGetattrStatic.test_slots -*graalpython.lib-python.3.test.test_inspect.TestGetcallargsFunctions.test_keyword_only -*graalpython.lib-python.3.test.test_inspect.TestGetcallargsFunctions.test_multiple_features -*graalpython.lib-python.3.test.test_inspect.TestGetcallargsFunctions.test_plain -*graalpython.lib-python.3.test.test_inspect.TestGetcallargsFunctions.test_varargs -*graalpython.lib-python.3.test.test_inspect.TestGetcallargsFunctions.test_varkw -*graalpython.lib-python.3.test.test_inspect.TestGetcallargsFunctions.test_varkw_only -*graalpython.lib-python.3.test.test_inspect.TestGetcallargsMethods.test_keyword_only -*graalpython.lib-python.3.test.test_inspect.TestGetcallargsMethods.test_multiple_features -*graalpython.lib-python.3.test.test_inspect.TestGetcallargsMethods.test_plain -*graalpython.lib-python.3.test.test_inspect.TestGetcallargsMethods.test_varargs -*graalpython.lib-python.3.test.test_inspect.TestGetcallargsMethods.test_varkw -*graalpython.lib-python.3.test.test_inspect.TestGetcallargsMethods.test_varkw_only -*graalpython.lib-python.3.test.test_inspect.TestGetcallargsUnboundMethods.test_keyword_only -*graalpython.lib-python.3.test.test_inspect.TestGetcallargsUnboundMethods.test_multiple_features -*graalpython.lib-python.3.test.test_inspect.TestGetcallargsUnboundMethods.test_plain -*graalpython.lib-python.3.test.test_inspect.TestGetcallargsUnboundMethods.test_varargs -*graalpython.lib-python.3.test.test_inspect.TestGetcallargsUnboundMethods.test_varkw -*graalpython.lib-python.3.test.test_inspect.TestGetcallargsUnboundMethods.test_varkw_only -*graalpython.lib-python.3.test.test_inspect.TestGetsourceInteractive.test_getclasses_interactive -*graalpython.lib-python.3.test.test_inspect.TestGettingSourceOfToplevelFrames.test_range_toplevel_frame -*graalpython.lib-python.3.test.test_inspect.TestGettingSourceOfToplevelFrames.test_range_traceback_toplevel_frame -*graalpython.lib-python.3.test.test_inspect.TestInterpreterStack.test_abuse_done -*graalpython.lib-python.3.test.test_inspect.TestInterpreterStack.test_frame -*graalpython.lib-python.3.test.test_inspect.TestInterpreterStack.test_previous_frame -*graalpython.lib-python.3.test.test_inspect.TestInterpreterStack.test_stack -*graalpython.lib-python.3.test.test_inspect.TestInterpreterStack.test_trace -*graalpython.lib-python.3.test.test_inspect.TestIsDataDescriptor.test_custom_descriptors -*graalpython.lib-python.3.test.test_inspect.TestIsDataDescriptor.test_functions -*graalpython.lib-python.3.test.test_inspect.TestIsDataDescriptor.test_property -*graalpython.lib-python.3.test.test_inspect.TestIsDataDescriptor.test_slot -*graalpython.lib-python.3.test.test_inspect.TestMain.test_builtins -*graalpython.lib-python.3.test.test_inspect.TestMain.test_custom_getattr -*graalpython.lib-python.3.test.test_inspect.TestMain.test_only_source -*graalpython.lib-python.3.test.test_inspect.TestMain.test_qualname_source -*graalpython.lib-python.3.test.test_inspect.TestNoEOL.test_class -*graalpython.lib-python.3.test.test_inspect.TestOneliners.test_anonymous -*graalpython.lib-python.3.test.test_inspect.TestOneliners.test_lambda_in_list -*graalpython.lib-python.3.test.test_inspect.TestOneliners.test_manyargs -*graalpython.lib-python.3.test.test_inspect.TestOneliners.test_oneline_lambda -*graalpython.lib-python.3.test.test_inspect.TestOneliners.test_onelinefunc -*graalpython.lib-python.3.test.test_inspect.TestOneliners.test_threeline_lambda -*graalpython.lib-python.3.test.test_inspect.TestOneliners.test_twoline_indented_lambda -*graalpython.lib-python.3.test.test_inspect.TestOneliners.test_twolinefunc -*graalpython.lib-python.3.test.test_inspect.TestParameterObject.test_signature_parameter_equality -*graalpython.lib-python.3.test.test_inspect.TestParameterObject.test_signature_parameter_hashable -*graalpython.lib-python.3.test.test_inspect.TestParameterObject.test_signature_parameter_immutability -*graalpython.lib-python.3.test.test_inspect.TestParameterObject.test_signature_parameter_implicit -*graalpython.lib-python.3.test.test_inspect.TestParameterObject.test_signature_parameter_kinds -*graalpython.lib-python.3.test.test_inspect.TestParameterObject.test_signature_parameter_object -*graalpython.lib-python.3.test.test_inspect.TestParameterObject.test_signature_parameter_positional_only -*graalpython.lib-python.3.test.test_inspect.TestParameterObject.test_signature_parameter_replace -*graalpython.lib-python.3.test.test_inspect.TestPredicates.test_get_slot_members -*graalpython.lib-python.3.test.test_inspect.TestPredicates.test_isabstract -*graalpython.lib-python.3.test.test_inspect.TestPredicates.test_isabstract_during_init_subclass -*graalpython.lib-python.3.test.test_inspect.TestPredicates.test_isclass -*graalpython.lib-python.3.test.test_inspect.TestPredicates.test_isroutine -*graalpython.lib-python.3.test.test_inspect.TestReload.test_getsource_reload -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_cleandoc -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_finddoc -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_getclasses -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_getcomments -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_getdoc_inherited -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_getfile -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_getfile_broken_repr -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_getfile_builtin_class -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_getfile_builtin_function_or_method -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_getfile_builtin_module -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_getframeinfo_get_first_line -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_getfunctions -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_getmodule -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_getmodule_file_not_found -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_getmodule_recursion -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_getsource -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_getsource_on_code_object -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_getsourcefile -*graalpython.lib-python.3.test.test_inspect.TestRetrievingSourceCode.test_proceed_with_fake_filename -*graalpython.lib-python.3.test.test_inspect.TestSignatureBind.test_signature_bind_args_and_kwargs -*graalpython.lib-python.3.test.test_inspect.TestSignatureBind.test_signature_bind_args_and_varargs -*graalpython.lib-python.3.test.test_inspect.TestSignatureBind.test_signature_bind_arguments -*graalpython.lib-python.3.test.test_inspect.TestSignatureBind.test_signature_bind_empty -*graalpython.lib-python.3.test.test_inspect.TestSignatureBind.test_signature_bind_implicit_arg -*graalpython.lib-python.3.test.test_inspect.TestSignatureBind.test_signature_bind_just_args -*graalpython.lib-python.3.test.test_inspect.TestSignatureBind.test_signature_bind_just_kwargs -*graalpython.lib-python.3.test.test_inspect.TestSignatureBind.test_signature_bind_kwonly -*graalpython.lib-python.3.test.test_inspect.TestSignatureBind.test_signature_bind_positional_only -*graalpython.lib-python.3.test.test_inspect.TestSignatureBind.test_signature_bind_posonly_kwargs -*graalpython.lib-python.3.test.test_inspect.TestSignatureBind.test_signature_bind_var -*graalpython.lib-python.3.test.test_inspect.TestSignatureBind.test_signature_bind_vararg_name -*graalpython.lib-python.3.test.test_inspect.TestSignatureBind.test_signature_bind_varargs_order -*graalpython.lib-python.3.test.test_inspect.TestSignatureBind.test_signature_bind_with_self_arg -*graalpython.lib-python.3.test.test_inspect.TestSignatureDefinitions.test_builtins_have_signatures -*graalpython.lib-python.3.test.test_inspect.TestSignatureDefinitions.test_python_function_override_signature -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signater_parameters_is_ordered -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_annotations_with_local_namespaces -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_definition_order_preserved_on_kwonly -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_equality -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_eval_str -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_from_callable_class -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_from_callable_python_obj -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_from_functionlike_object -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_functionlike_class -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_hashable -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_immutability -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_none_annotation -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_object -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_object_pickle -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_builtins -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_builtins_no_signature -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_callable_objects -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_class -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_classmethod -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_complex_args -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_decorated -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_decorated_builtins -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_fake_partialmethod -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_generic_subclass -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_lambdas -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_mangled_parameters -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_method -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_noarg -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_non_function -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_partial -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_partialmethod -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_staticmethod -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_subclass -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_wargs -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_on_wkwonly -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_replace_anno -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_str -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_str_positional_only -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_without_self -*graalpython.lib-python.3.test.test_inspect.TestSignatureObject.test_signature_wrapped_bound_method -*graalpython.lib-python.3.test.test_inspect.TestSignaturePrivateHelpers.test_signature_get_bound_param -*graalpython.lib-python.3.test.test_inspect.TestSignaturePrivateHelpers.test_signature_strip_non_python_syntax -*graalpython.lib-python.3.test.test_inspect.TestUnwrap.test_cycle -*graalpython.lib-python.3.test.test_inspect.TestUnwrap.test_recursion_limit -*graalpython.lib-python.3.test.test_inspect.TestUnwrap.test_stop -*graalpython.lib-python.3.test.test_inspect.TestUnwrap.test_unhashable -*graalpython.lib-python.3.test.test_inspect.TestUnwrap.test_unwrap_one -*graalpython.lib-python.3.test.test_inspect.TestUnwrap.test_unwrap_several -*test.test_inspect.test_inspect.IsTestBase.test__all__ -*test.test_inspect.test_inspect.TestBlockComments.test_class_async_method -*test.test_inspect.test_inspect.TestBlockComments.test_class_method -*test.test_inspect.test_inspect.TestBlockComments.test_toplevel_class -*test.test_inspect.test_inspect.TestBoundArguments.test_signature_bound_arguments_apply_defaults -*test.test_inspect.test_inspect.TestBoundArguments.test_signature_bound_arguments_arguments_type -*test.test_inspect.test_inspect.TestBoundArguments.test_signature_bound_arguments_equality -*test.test_inspect.test_inspect.TestBoundArguments.test_signature_bound_arguments_pickle -*test.test_inspect.test_inspect.TestBoundArguments.test_signature_bound_arguments_repr -*test.test_inspect.test_inspect.TestBoundArguments.test_signature_bound_arguments_unhashable -*test.test_inspect.test_inspect.TestBuggyCases.test_class_decorator -*test.test_inspect.test_inspect.TestBuggyCases.test_class_definition_in_multiline_comment -*test.test_inspect.test_inspect.TestBuggyCases.test_class_definition_in_multiline_string_definition -*test.test_inspect.test_inspect.TestBuggyCases.test_class_inside_conditional -*test.test_inspect.test_inspect.TestBuggyCases.test_findsource_binary -*test.test_inspect.test_inspect.TestBuggyCases.test_findsource_code_in_linecache -*test.test_inspect.test_inspect.TestBuggyCases.test_findsource_with_out_of_bounds_lineno -*test.test_inspect.test_inspect.TestBuggyCases.test_findsource_without_filename -*test.test_inspect.test_inspect.TestBuggyCases.test_getsource_on_method -*test.test_inspect.test_inspect.TestBuggyCases.test_method_in_dynamic_class -*test.test_inspect.test_inspect.TestBuggyCases.test_multiline_sig -*test.test_inspect.test_inspect.TestBuggyCases.test_multiple_children_classes -*test.test_inspect.test_inspect.TestBuggyCases.test_nested_class -*test.test_inspect.test_inspect.TestBuggyCases.test_nested_class_definition -*test.test_inspect.test_inspect.TestBuggyCases.test_nested_class_definition_indented_string -*test.test_inspect.test_inspect.TestBuggyCases.test_nested_class_definition_inside_async_function -*test.test_inspect.test_inspect.TestBuggyCases.test_nested_class_definition_inside_function -*test.test_inspect.test_inspect.TestBuggyCases.test_nested_func -*test.test_inspect.test_inspect.TestBuggyCases.test_one_liner_dedent_non_name -*test.test_inspect.test_inspect.TestBuggyCases.test_one_liner_followed_by_non_name -*test.test_inspect.test_inspect.TestBuggyCases.test_with_comment -*test.test_inspect.test_inspect.TestBuggyCases.test_with_comment_instead_of_docstring -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_argspec_api_ignores_wrapped -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_DynamicClassAttribute -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_VirtualAttribute -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_VirtualAttribute_multi_classes -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_builtin_types -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_class_attrs_with_buggy_dir -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_metaclass_class_attribute -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_newstyle -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_overrides_bool -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_get_annotations_with_stock_annotations -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_get_annotations_with_stringized_annotations -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_getfullargspec -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_getfullargspec_builtin_func -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_getfullargspec_builtin_func_no_signature -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_getfullargspec_definition_order_preserved_on_kwonly -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_getfullargspec_signature_annos -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_getfullargspec_signature_attr -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_getmembers_VirtualAttribute -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_getmembers_descriptors -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_getmembers_method -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_getmembers_static -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_getmembers_with_buggy_dir -*test.test_inspect.test_inspect.TestClassesAndFunctions.test_newstyle_mro -*test.test_inspect.test_inspect.TestComplexDecorator.test_parens_in_decorator -*test.test_inspect.test_inspect.TestDecorators.test_decorator_with_lambda -*test.test_inspect.test_inspect.TestDecorators.test_getsource_unwrap -*test.test_inspect.test_inspect.TestDecorators.test_replacing_decorator -*test.test_inspect.test_inspect.TestDecorators.test_wrapped_decorator -*test.test_inspect.test_inspect.TestFormatAnnotation.test_typing_replacement -*test.test_inspect.test_inspect.TestGetClosureVars.test_builtins_as_dict -*test.test_inspect.test_inspect.TestGetClosureVars.test_builtins_as_module -*test.test_inspect.test_inspect.TestGetClosureVars.test_builtins_fallback -*test.test_inspect.test_inspect.TestGetClosureVars.test_generator_closure -*test.test_inspect.test_inspect.TestGetClosureVars.test_getclosurevars_empty -*test.test_inspect.test_inspect.TestGetClosureVars.test_getclosurevars_error -*test.test_inspect.test_inspect.TestGetClosureVars.test_method_closure -*test.test_inspect.test_inspect.TestGetClosureVars.test_name_resolution -*test.test_inspect.test_inspect.TestGetClosureVars.test_nonlocal_vars -*test.test_inspect.test_inspect.TestGetCoroutineState.test_closed_after_exhaustion -*test.test_inspect.test_inspect.TestGetCoroutineState.test_closed_after_immediate_exception -*test.test_inspect.test_inspect.TestGetCoroutineState.test_created -*test.test_inspect.test_inspect.TestGetCoroutineState.test_easy_debugging -*test.test_inspect.test_inspect.TestGetCoroutineState.test_getcoroutinelocals -*test.test_inspect.test_inspect.TestGetCoroutineState.test_suspended -*test.test_inspect.test_inspect.TestGetGeneratorState.test_closed_after_exhaustion -*test.test_inspect.test_inspect.TestGetGeneratorState.test_closed_after_immediate_exception -*test.test_inspect.test_inspect.TestGetGeneratorState.test_created -*test.test_inspect.test_inspect.TestGetGeneratorState.test_easy_debugging -*test.test_inspect.test_inspect.TestGetGeneratorState.test_getgeneratorlocals -*test.test_inspect.test_inspect.TestGetGeneratorState.test_getgeneratorlocals_empty -*test.test_inspect.test_inspect.TestGetGeneratorState.test_getgeneratorlocals_error -*test.test_inspect.test_inspect.TestGetGeneratorState.test_running -*test.test_inspect.test_inspect.TestGetGeneratorState.test_suspended -*test.test_inspect.test_inspect.TestGetattrStatic.test_basic -*test.test_inspect.test_inspect.TestGetattrStatic.test_classAttribute -*test.test_inspect.test_inspect.TestGetattrStatic.test_classVirtualAttribute -*test.test_inspect.test_inspect.TestGetattrStatic.test_class_as_property -*test.test_inspect.test_inspect.TestGetattrStatic.test_custom___getattr__ -*test.test_inspect.test_inspect.TestGetattrStatic.test_custom___getattribute__ -*test.test_inspect.test_inspect.TestGetattrStatic.test_custom_object_dict -*test.test_inspect.test_inspect.TestGetattrStatic.test_descriptor -*test.test_inspect.test_inspect.TestGetattrStatic.test_descriptor_raises_AttributeError -*test.test_inspect.test_inspect.TestGetattrStatic.test_dict_as_property -*test.test_inspect.test_inspect.TestGetattrStatic.test_inherited -*test.test_inspect.test_inspect.TestGetattrStatic.test_inherited_classattribute -*test.test_inspect.test_inspect.TestGetattrStatic.test_inherited_slots -*test.test_inspect.test_inspect.TestGetattrStatic.test_instance_attr -*test.test_inspect.test_inspect.TestGetattrStatic.test_metaclass -*test.test_inspect.test_inspect.TestGetattrStatic.test_metaclass_dict_as_property -*test.test_inspect.test_inspect.TestGetattrStatic.test_metaclass_with_descriptor -*test.test_inspect.test_inspect.TestGetattrStatic.test_metaclass_with_metaclass_with_dict_as_property -*test.test_inspect.test_inspect.TestGetattrStatic.test_module -*test.test_inspect.test_inspect.TestGetattrStatic.test_mro_as_property -*test.test_inspect.test_inspect.TestGetattrStatic.test_no_dict_no_slots -*test.test_inspect.test_inspect.TestGetattrStatic.test_no_dict_no_slots_instance_member -*test.test_inspect.test_inspect.TestGetattrStatic.test_property -*test.test_inspect.test_inspect.TestGetattrStatic.test_slots -*test.test_inspect.test_inspect.TestGetcallargsFunctions.test_keyword_only -*test.test_inspect.test_inspect.TestGetcallargsFunctions.test_multiple_features -*test.test_inspect.test_inspect.TestGetcallargsFunctions.test_plain -*test.test_inspect.test_inspect.TestGetcallargsFunctions.test_varargs -*test.test_inspect.test_inspect.TestGetcallargsFunctions.test_varkw -*test.test_inspect.test_inspect.TestGetcallargsFunctions.test_varkw_only -*test.test_inspect.test_inspect.TestGetcallargsMethods.test_keyword_only -*test.test_inspect.test_inspect.TestGetcallargsMethods.test_multiple_features -*test.test_inspect.test_inspect.TestGetcallargsMethods.test_plain -*test.test_inspect.test_inspect.TestGetcallargsMethods.test_varargs -*test.test_inspect.test_inspect.TestGetcallargsMethods.test_varkw -*test.test_inspect.test_inspect.TestGetcallargsMethods.test_varkw_only -*test.test_inspect.test_inspect.TestGetcallargsUnboundMethods.test_keyword_only -*test.test_inspect.test_inspect.TestGetcallargsUnboundMethods.test_multiple_features -*test.test_inspect.test_inspect.TestGetcallargsUnboundMethods.test_plain -*test.test_inspect.test_inspect.TestGetcallargsUnboundMethods.test_varargs -*test.test_inspect.test_inspect.TestGetcallargsUnboundMethods.test_varkw -*test.test_inspect.test_inspect.TestGetcallargsUnboundMethods.test_varkw_only -*test.test_inspect.test_inspect.TestGetsourceInteractive.test_getclasses_interactive -*test.test_inspect.test_inspect.TestGettingSourceOfToplevelFrames.test_range_toplevel_frame -*test.test_inspect.test_inspect.TestGettingSourceOfToplevelFrames.test_range_traceback_toplevel_frame -*test.test_inspect.test_inspect.TestInterpreterStack.test__all__ -*test.test_inspect.test_inspect.TestInterpreterStack.test_abuse_done -*test.test_inspect.test_inspect.TestInterpreterStack.test_frame -*test.test_inspect.test_inspect.TestInterpreterStack.test_previous_frame -*test.test_inspect.test_inspect.TestInterpreterStack.test_stack -*test.test_inspect.test_inspect.TestInterpreterStack.test_trace -*test.test_inspect.test_inspect.TestIsDataDescriptor.test_custom_descriptors -*test.test_inspect.test_inspect.TestIsDataDescriptor.test_functions -*test.test_inspect.test_inspect.TestIsDataDescriptor.test_property -*test.test_inspect.test_inspect.TestIsDataDescriptor.test_slot -*test.test_inspect.test_inspect.TestMain.test_builtins -*test.test_inspect.test_inspect.TestMain.test_custom_getattr -*test.test_inspect.test_inspect.TestMain.test_only_source -*test.test_inspect.test_inspect.TestMain.test_qualname_source -*test.test_inspect.test_inspect.TestNoEOL.test_class -*test.test_inspect.test_inspect.TestOneliners.test_anonymous -*test.test_inspect.test_inspect.TestOneliners.test_lambda_in_list -*test.test_inspect.test_inspect.TestOneliners.test_manyargs -*test.test_inspect.test_inspect.TestOneliners.test_oneline_lambda -*test.test_inspect.test_inspect.TestOneliners.test_onelinefunc -*test.test_inspect.test_inspect.TestOneliners.test_threeline_lambda -*test.test_inspect.test_inspect.TestOneliners.test_twoline_indented_lambda -*test.test_inspect.test_inspect.TestOneliners.test_twolinefunc -*test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_equality -*test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_hashable -*test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_immutability -*test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_implicit -*test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_kinds -*test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_object -*test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_positional_only -*test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_replace -*test.test_inspect.test_inspect.TestPredicates.test__all__ -*test.test_inspect.test_inspect.TestPredicates.test_get_slot_members -*test.test_inspect.test_inspect.TestPredicates.test_isabstract -*test.test_inspect.test_inspect.TestPredicates.test_isabstract_during_init_subclass -*test.test_inspect.test_inspect.TestPredicates.test_isclass -*test.test_inspect.test_inspect.TestPredicates.test_isroutine -*test.test_inspect.test_inspect.TestReload.test_getsource_reload -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_cleandoc -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_finddoc -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getclasses -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getcomments -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getdoc_inherited -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getfile -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getfile_broken_repr -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getfile_builtin_class -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getfile_builtin_function_or_method -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getfile_builtin_module -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getframeinfo_get_first_line -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getfunctions -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getmodule -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getmodule_file_not_found -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getmodule_recursion -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getsource -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getsource_on_code_object -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getsourcefile -*test.test_inspect.test_inspect.TestRetrievingSourceCode.test_proceed_with_fake_filename -*test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_args_and_kwargs -*test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_args_and_varargs -*test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_arguments -*test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_empty -*test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_implicit_arg -*test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_just_args -*test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_just_kwargs -*test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_kwonly -*test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_positional_only -*test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_posonly_kwargs -*test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_var -*test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_vararg_name -*test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_varargs_order -*test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_with_self_arg -*test.test_inspect.test_inspect.TestSignatureDefinitions.test_builtins_have_signatures -*test.test_inspect.test_inspect.TestSignatureDefinitions.test_python_function_override_signature -*test.test_inspect.test_inspect.TestSignatureObject.test_signater_parameters_is_ordered -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_annotations_with_local_namespaces -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_definition_order_preserved_on_kwonly -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_equality -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_eval_str -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_from_callable_builtin_obj -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_from_callable_class -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_from_callable_python_obj -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_from_functionlike_object -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_functionlike_class -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_hashable -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_immutability -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_none_annotation -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_object -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_object_pickle -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_builtins -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_builtins_no_signature -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_callable_objects -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_class -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_classmethod -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_complex_args -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_decorated -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_decorated_builtins -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_derived_classes -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_fake_partialmethod -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_generic_subclass -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_lambdas -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_mangled_parameters -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_method -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_mocks -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_noarg -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_non_function -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_noncallable_mocks -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_partial -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_partialmethod -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_staticmethod -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_subclass -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_wargs -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_wkwonly -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_replace_anno -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_replaced -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_str -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_str_positional_only -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_without_self -*test.test_inspect.test_inspect.TestSignatureObject.test_signature_wrapped_bound_method -*test.test_inspect.test_inspect.TestSignaturePrivateHelpers.test_signature_strip_non_python_syntax -*test.test_inspect.test_inspect.TestUnwrap.test_cycle -*test.test_inspect.test_inspect.TestUnwrap.test_recursion_limit -*test.test_inspect.test_inspect.TestUnwrap.test_stop -*test.test_inspect.test_inspect.TestUnwrap.test_unhashable -*test.test_inspect.test_inspect.TestUnwrap.test_unwrap_one -*test.test_inspect.test_inspect.TestUnwrap.test_unwrap_several +test.test_inspect.test_inspect.IsTestBase.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBlockComments.test_class_async_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBlockComments.test_class_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBlockComments.test_toplevel_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBoundArguments.test_signature_bound_arguments_apply_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBoundArguments.test_signature_bound_arguments_arguments_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBoundArguments.test_signature_bound_arguments_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBoundArguments.test_signature_bound_arguments_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBoundArguments.test_signature_bound_arguments_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBoundArguments.test_signature_bound_arguments_unhashable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_class_decorator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_class_definition_in_multiline_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_class_definition_in_multiline_string_definition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_class_inside_conditional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_findsource_code_in_linecache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_findsource_with_out_of_bounds_lineno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_findsource_without_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_getsource_on_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_method_in_dynamic_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_multiline_sig @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_multiple_children_classes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_nested_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_nested_class_definition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_nested_class_definition_indented_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_nested_class_definition_inside_async_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_nested_class_definition_inside_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_nested_func @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_one_liner_dedent_non_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_one_liner_followed_by_non_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_with_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestBuggyCases.test_with_comment_instead_of_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_argspec_api_ignores_wrapped @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_DynamicClassAttribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_VirtualAttribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_VirtualAttribute_multi_classes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_builtin_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_class_attrs_with_buggy_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_metaclass_class_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_newstyle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_overrides_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_get_annotations_with_stock_annotations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_get_annotations_with_stringized_annotations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_getfullargspec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_getfullargspec_definition_order_preserved_on_kwonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_getfullargspec_signature_annos @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_getfullargspec_signature_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_getmembers_VirtualAttribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_getmembers_descriptors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_getmembers_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_getmembers_static @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_getmembers_with_buggy_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_newstyle_mro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestComplexDecorator.test_parens_in_decorator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestDecorators.test_decorator_with_lambda @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestDecorators.test_getsource_unwrap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestDecorators.test_replacing_decorator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestDecorators.test_wrapped_decorator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestFormatAnnotation.test_typing_replacement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetClosureVars.test_builtins_as_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetClosureVars.test_builtins_as_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetClosureVars.test_builtins_fallback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetClosureVars.test_generator_closure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetClosureVars.test_getclosurevars_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetClosureVars.test_getclosurevars_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetClosureVars.test_method_closure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetClosureVars.test_name_resolution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetClosureVars.test_nonlocal_vars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetCoroutineState.test_closed_after_exhaustion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetCoroutineState.test_closed_after_immediate_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetCoroutineState.test_created @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetCoroutineState.test_easy_debugging @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetCoroutineState.test_getcoroutinelocals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetCoroutineState.test_suspended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetGeneratorState.test_closed_after_exhaustion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetGeneratorState.test_closed_after_immediate_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetGeneratorState.test_created @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetGeneratorState.test_easy_debugging @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetGeneratorState.test_getgeneratorlocals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetGeneratorState.test_getgeneratorlocals_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetGeneratorState.test_getgeneratorlocals_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetGeneratorState.test_running @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetGeneratorState.test_suspended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_classAttribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_classVirtualAttribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_class_as_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_custom___getattr__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_custom___getattribute__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_custom_object_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_descriptor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_descriptor_raises_AttributeError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_dict_as_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_inherited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_inherited_classattribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_inherited_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_instance_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_metaclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_metaclass_dict_as_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_metaclass_with_descriptor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_metaclass_with_metaclass_with_dict_as_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_mro_as_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_no_dict_no_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_no_dict_no_slots_instance_member @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetattrStatic.test_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetcallargsFunctions.test_keyword_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetcallargsFunctions.test_multiple_features @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetcallargsFunctions.test_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetcallargsFunctions.test_varargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetcallargsFunctions.test_varkw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetcallargsFunctions.test_varkw_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetcallargsMethods.test_keyword_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetcallargsMethods.test_multiple_features @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetcallargsMethods.test_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetcallargsMethods.test_varargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetcallargsMethods.test_varkw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetcallargsMethods.test_varkw_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetcallargsUnboundMethods.test_keyword_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetcallargsUnboundMethods.test_multiple_features @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetcallargsUnboundMethods.test_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetcallargsUnboundMethods.test_varargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetcallargsUnboundMethods.test_varkw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetcallargsUnboundMethods.test_varkw_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGetsourceInteractive.test_getclasses_interactive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGettingSourceOfToplevelFrames.test_range_toplevel_frame @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestGettingSourceOfToplevelFrames.test_range_traceback_toplevel_frame @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestInterpreterStack.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestInterpreterStack.test_abuse_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestInterpreterStack.test_frame @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestInterpreterStack.test_previous_frame @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestInterpreterStack.test_stack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestInterpreterStack.test_trace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestIsDataDescriptor.test_custom_descriptors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestIsDataDescriptor.test_functions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestIsDataDescriptor.test_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestIsDataDescriptor.test_slot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestMain.test_builtins @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestMain.test_custom_getattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestMain.test_only_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestMain.test_qualname_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestNoEOL.test_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestOneliners.test_anonymous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestOneliners.test_lambda_in_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestOneliners.test_manyargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestOneliners.test_oneline_lambda @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestOneliners.test_onelinefunc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestOneliners.test_threeline_lambda @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestOneliners.test_twoline_indented_lambda @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestOneliners.test_twolinefunc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_hashable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_immutability @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_kinds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_positional_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestPredicates.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestPredicates.test_get_slot_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestPredicates.test_isabstract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestPredicates.test_isabstract_during_init_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestPredicates.test_isclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestPredicates.test_iscoroutine @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestPredicates.test_isroutine @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestReload.test_getsource_reload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_cleandoc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_finddoc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getcomments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getdoc_inherited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getfile_broken_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getfile_builtin_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getfile_builtin_function_or_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getfile_builtin_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getframeinfo_get_first_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getfunctions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getmodule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getmodule_file_not_found @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getmodule_recursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getsource @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getsource_on_code_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getsourcefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_proceed_with_fake_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_args_and_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_args_and_varargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_just_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_just_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_kwonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_positional_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_posonly_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_var @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_vararg_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_varargs_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_with_self_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureDefinitions.test_python_function_override_signature @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signater_parameters_is_ordered @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_annotations_with_local_namespaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_definition_order_preserved_on_kwonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_eval_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_from_callable_builtin_obj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_from_callable_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_from_callable_python_obj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_from_functionlike_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_functionlike_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_hashable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_immutability @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_none_annotation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_object_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_callable_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_classmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_complex_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_decorated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_derived_classes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_fake_partialmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_generic_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_lambdas @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_mangled_parameters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_mocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_noarg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_non_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_noncallable_mocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_partialmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_staticmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_wargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_wkwonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_replace_anno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_replaced @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_str_positional_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_without_self @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_wrapped_bound_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestSignaturePrivateHelpers.test_signature_strip_non_python_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestUnwrap.test_cycle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestUnwrap.test_recursion_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestUnwrap.test_stop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestUnwrap.test_unhashable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestUnwrap.test_unwrap_one @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_inspect.test_inspect.TestUnwrap.test_unwrap_several @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_int.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_int.txt index 356eb0fd0a..e91b5f29ae 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_int.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_int.txt @@ -1,35 +1,38 @@ -*graalpython.lib-python.3.test.test_int.IntStrDigitLimitsTests.test_denial_of_service_prevented_str_to_int -*graalpython.lib-python.3.test.test_int.IntStrDigitLimitsTests.test_disabled_limit -*graalpython.lib-python.3.test.test_int.IntStrDigitLimitsTests.test_int_from_other_bases -*graalpython.lib-python.3.test.test_int.IntStrDigitLimitsTests.test_max_str_digits -*graalpython.lib-python.3.test.test_int.IntStrDigitLimitsTests.test_max_str_digits_edge_cases -*graalpython.lib-python.3.test.test_int.IntStrDigitLimitsTests.test_power_of_two_bases_unlimited -*graalpython.lib-python.3.test.test_int.IntStrDigitLimitsTests.test_sign_not_counted -*graalpython.lib-python.3.test.test_int.IntStrDigitLimitsTests.test_underscores_ignored -*graalpython.lib-python.3.test.test_int.IntSubclassStrDigitLimitsTests.test_denial_of_service_prevented_str_to_int -*graalpython.lib-python.3.test.test_int.IntSubclassStrDigitLimitsTests.test_disabled_limit -*graalpython.lib-python.3.test.test_int.IntSubclassStrDigitLimitsTests.test_int_from_other_bases -*graalpython.lib-python.3.test.test_int.IntSubclassStrDigitLimitsTests.test_max_str_digits -*graalpython.lib-python.3.test.test_int.IntSubclassStrDigitLimitsTests.test_max_str_digits_edge_cases -*graalpython.lib-python.3.test.test_int.IntSubclassStrDigitLimitsTests.test_power_of_two_bases_unlimited -*graalpython.lib-python.3.test.test_int.IntSubclassStrDigitLimitsTests.test_sign_not_counted -*graalpython.lib-python.3.test.test_int.IntSubclassStrDigitLimitsTests.test_underscores_ignored -*graalpython.lib-python.3.test.test_int.IntTestCases.test_basic -*graalpython.lib-python.3.test.test_int.IntTestCases.test_error_message -*graalpython.lib-python.3.test.test_int.IntTestCases.test_int_base_bad_types -*graalpython.lib-python.3.test.test_int.IntTestCases.test_int_base_indexable -*graalpython.lib-python.3.test.test_int.IntTestCases.test_int_base_limits -*graalpython.lib-python.3.test.test_int.IntTestCases.test_int_memoryview -*graalpython.lib-python.3.test.test_int.IntTestCases.test_int_returns_int_subclass -*graalpython.lib-python.3.test.test_int.IntTestCases.test_int_subclass_with_index -*graalpython.lib-python.3.test.test_int.IntTestCases.test_int_subclass_with_int -*graalpython.lib-python.3.test.test_int.IntTestCases.test_intconversion -*graalpython.lib-python.3.test.test_int.IntTestCases.test_invalid_signs -*graalpython.lib-python.3.test.test_int.IntTestCases.test_issue31619 -*graalpython.lib-python.3.test.test_int.IntTestCases.test_keyword_args -*graalpython.lib-python.3.test.test_int.IntTestCases.test_no_args -*graalpython.lib-python.3.test.test_int.IntTestCases.test_non_numeric_input_types -*graalpython.lib-python.3.test.test_int.IntTestCases.test_small_ints -*graalpython.lib-python.3.test.test_int.IntTestCases.test_string_float -*graalpython.lib-python.3.test.test_int.IntTestCases.test_underscores -*graalpython.lib-python.3.test.test_int.IntTestCases.test_unicode +# Transiently fails because it's dependent on timings +!test.test_int.IntStrDigitLimitsTests.test_denial_of_service_prevented_int_to_str @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_int.IntStrDigitLimitsTests.test_denial_of_service_prevented_str_to_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntStrDigitLimitsTests.test_disabled_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntStrDigitLimitsTests.test_int_from_other_bases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntStrDigitLimitsTests.test_max_str_digits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntStrDigitLimitsTests.test_max_str_digits_edge_cases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntStrDigitLimitsTests.test_power_of_two_bases_unlimited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntStrDigitLimitsTests.test_sign_not_counted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntStrDigitLimitsTests.test_underscores_ignored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Transiently fails because it's dependent on timings +!test.test_int.IntSubclassStrDigitLimitsTests.test_denial_of_service_prevented_int_to_str @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_int.IntSubclassStrDigitLimitsTests.test_denial_of_service_prevented_str_to_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntSubclassStrDigitLimitsTests.test_disabled_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntSubclassStrDigitLimitsTests.test_int_from_other_bases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntSubclassStrDigitLimitsTests.test_max_str_digits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntSubclassStrDigitLimitsTests.test_max_str_digits_edge_cases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntSubclassStrDigitLimitsTests.test_power_of_two_bases_unlimited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntSubclassStrDigitLimitsTests.test_sign_not_counted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntSubclassStrDigitLimitsTests.test_underscores_ignored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntTestCases.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntTestCases.test_error_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntTestCases.test_int_base_bad_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntTestCases.test_int_base_indexable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntTestCases.test_int_base_limits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntTestCases.test_int_memoryview @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntTestCases.test_int_returns_int_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntTestCases.test_int_subclass_with_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntTestCases.test_int_subclass_with_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntTestCases.test_intconversion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntTestCases.test_invalid_signs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntTestCases.test_issue31619 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntTestCases.test_keyword_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntTestCases.test_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntTestCases.test_non_numeric_input_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntTestCases.test_string_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntTestCases.test_underscores @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int.IntTestCases.test_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_int_literal.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_int_literal.txt index 2891a40cf3..f17e8afe33 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_int_literal.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_int_literal.txt @@ -1,6 +1,6 @@ -*graalpython.lib-python.3.test.test_int_literal.TestHexOctBin.test_bin_baseline -*graalpython.lib-python.3.test.test_int_literal.TestHexOctBin.test_bin_unsigned -*graalpython.lib-python.3.test.test_int_literal.TestHexOctBin.test_hex_baseline -*graalpython.lib-python.3.test.test_int_literal.TestHexOctBin.test_hex_unsigned -*graalpython.lib-python.3.test.test_int_literal.TestHexOctBin.test_oct_baseline -*graalpython.lib-python.3.test.test_int_literal.TestHexOctBin.test_oct_unsigned +test.test_int_literal.TestHexOctBin.test_bin_baseline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int_literal.TestHexOctBin.test_bin_unsigned @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int_literal.TestHexOctBin.test_hex_baseline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int_literal.TestHexOctBin.test_hex_unsigned @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int_literal.TestHexOctBin.test_oct_baseline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_int_literal.TestHexOctBin.test_oct_unsigned @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_io.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_io.txt index 3a079ee234..eedbeab220 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_io.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_io.txt @@ -1,624 +1,523 @@ -*graalpython.lib-python.3.test.test_io.APIMismatchTest.test_RawIOBase_io_in_pyio_match -*graalpython.lib-python.3.test.test_io.APIMismatchTest.test_RawIOBase_pyio_in_io_match -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_close_and_closed -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_constructor -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_constructor_max_buffer_size_removal -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_constructor_with_not_readable -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_constructor_with_not_writeable -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_detach -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_isatty -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_peek -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_read -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_read1 -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_readable -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_reader_close_error_on_close -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_reader_writer_close_error_on_close -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_readinto -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_readlines -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_seekable -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_uninitialized -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_weakref_clearing -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_write -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_writeable -*graalpython.lib-python.3.test.test_io.CBufferedRWPairTest.test_writer_close_error_on_close -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_args_error -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_buffer_freeing -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_buffering -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_close_error_on_close -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_constructor -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_context_manager -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_destructor -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_detach -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_detach_flush -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_error_through_destructor -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_fileno -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_flush -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_flush_and_peek -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_flush_and_read -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_flush_and_readinto -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_flush_and_write -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_flush_error_on_close -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_garbage_collection -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_interleaved_read_write -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_interleaved_readline_write -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_invalid_args -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_max_buffer_size_removal -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_misbehaved_io -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_multi_close -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_no_extraneous_read -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_nonnormalized_close_error_on_close -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_override_destructor -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_read -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_read1 -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_read1_arbitrary -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_read_all -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_read_and_write -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_read_non_blocking -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_read_on_closed -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_read_past_eof -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_readinto -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_readinto1 -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_readinto1_array -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_readinto_array -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_readlines -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_readonly_attributes -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_recursive_repr -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_repr -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_seek_and_tell -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_sizeof -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_slow_close_from_thread -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_threads -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_truncate -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_truncate_after_read_or_write -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_truncate_after_write -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_uninitialized -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_write -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_write_after_readahead -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_write_and_rewind -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_write_error_on_close -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_write_non_blocking -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_write_overflow -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_write_rewind_write -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_writelines -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_writelines_error -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_writelines_userlist -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_writes -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_writes_and_flushes -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_writes_and_peek -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_writes_and_read1s -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_writes_and_readintos -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_writes_and_reads -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_writes_and_seeks -*graalpython.lib-python.3.test.test_io.CBufferedRandomTest.test_writes_and_truncates -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_args_error -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_bad_readinto_type -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_bad_readinto_value -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_buffer_freeing -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_buffering -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_close_error_on_close -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_constructor -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_context_manager -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_detach -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_error_through_destructor -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_fileno -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_flush_error_on_close -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_garbage_collection -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_initialization -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_invalid_args -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_misbehaved_io -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_misbehaved_io_read -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_multi_close -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_no_extraneous_read -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_nonnormalized_close_error_on_close -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_override_destructor -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_read -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_read1 -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_read1_arbitrary -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_read_all -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_read_non_blocking -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_read_on_closed -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_read_past_eof -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_readinto -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_readinto1 -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_readinto1_array -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_readinto_array -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_readlines -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_readonly_attributes -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_recursive_repr -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_repr -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_sizeof -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_threads -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_truncate_on_read_only -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_uninitialized -*graalpython.lib-python.3.test.test_io.CBufferedReaderTest.test_unseekable -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_args_error -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_buffer_freeing -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_close_error_on_close -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_constructor -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_context_manager -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_destructor -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_detach -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_detach_flush -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_error_through_destructor -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_fileno -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_flush -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_flush_error_on_close -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_garbage_collection -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_initialization -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_invalid_args -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_max_buffer_size_removal -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_misbehaved_io -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_multi_close -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_nonnormalized_close_error_on_close -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_override_destructor -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_readonly_attributes -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_recursive_repr -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_repr -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_sizeof -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_slow_close_from_thread -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_threads -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_truncate -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_truncate_after_write -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_uninitialized -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_unseekable -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_write -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_write_and_rewind -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_write_error_on_close -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_write_non_blocking -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_write_overflow -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_writelines -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_writelines_error -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_writelines_userlist -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_writes -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_writes_and_flushes -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_writes_and_seeks -*graalpython.lib-python.3.test.test_io.CBufferedWriterTest.test_writes_and_truncates -*graalpython.lib-python.3.test.test_io.CIOTest.test_BufferedIOBase_destructor -*graalpython.lib-python.3.test.test_io.CIOTest.test_BufferedIOBase_readinto -*graalpython.lib-python.3.test.test_io.CIOTest.test_IOBase_destructor -*graalpython.lib-python.3.test.test_io.CIOTest.test_IOBase_finalize -*graalpython.lib-python.3.test.test_io.CIOTest.test_RawIOBase_destructor -*graalpython.lib-python.3.test.test_io.CIOTest.test_RawIOBase_read -*graalpython.lib-python.3.test.test_io.CIOTest.test_RawIOBase_readall -*graalpython.lib-python.3.test.test_io.CIOTest.test_TextIOBase_destructor -*graalpython.lib-python.3.test.test_io.CIOTest.test_append_mode_tell -*graalpython.lib-python.3.test.test_io.CIOTest.test_array_writes -*graalpython.lib-python.3.test.test_io.CIOTest.test_bad_opener_negative_1 -*graalpython.lib-python.3.test.test_io.CIOTest.test_bad_opener_other_negative -*graalpython.lib-python.3.test.test_io.CIOTest.test_buffered_file_io -*graalpython.lib-python.3.test.test_io.CIOTest.test_buffered_readinto_mixin -*graalpython.lib-python.3.test.test_io.CIOTest.test_close_assert -*graalpython.lib-python.3.test.test_io.CIOTest.test_close_flushes -*graalpython.lib-python.3.test.test_io.CIOTest.test_closefd -*graalpython.lib-python.3.test.test_io.CIOTest.test_closefd_attr -*graalpython.lib-python.3.test.test_io.CIOTest.test_destructor -*graalpython.lib-python.3.test.test_io.CIOTest.test_fileio_closefd -*graalpython.lib-python.3.test.test_io.CIOTest.test_flush_error_on_close -*graalpython.lib-python.3.test.test_io.CIOTest.test_fspath_support -*graalpython.lib-python.3.test.test_io.CIOTest.test_garbage_collection -*graalpython.lib-python.3.test.test_io.CIOTest.test_invalid_newline -*graalpython.lib-python.3.test.test_io.CIOTest.test_invalid_operations -*graalpython.lib-python.3.test.test_io.CIOTest.test_large_file_ops -*graalpython.lib-python.3.test.test_io.CIOTest.test_multi_close -*graalpython.lib-python.3.test.test_io.CIOTest.test_next_nonsizeable -*graalpython.lib-python.3.test.test_io.CIOTest.test_no_closefd_with_filename -*graalpython.lib-python.3.test.test_io.CIOTest.test_nonbuffered_textio -*graalpython.lib-python.3.test.test_io.CIOTest.test_open_handles_NUL_chars -*graalpython.lib-python.3.test.test_io.CIOTest.test_opener -*graalpython.lib-python.3.test.test_io.CIOTest.test_opener_invalid_fd -*graalpython.lib-python.3.test.test_io.CIOTest.test_optional_abilities -*graalpython.lib-python.3.test.test_io.CIOTest.test_raw_bytes_io -*graalpython.lib-python.3.test.test_io.CIOTest.test_raw_file_io -*graalpython.lib-python.3.test.test_io.CIOTest.test_read_closed -*graalpython.lib-python.3.test.test_io.CIOTest.test_readline -*graalpython.lib-python.3.test.test_io.CIOTest.test_readline_nonsizeable -*graalpython.lib-python.3.test.test_io.CIOTest.test_types_have_dict -*graalpython.lib-python.3.test.test_io.CIOTest.test_unbounded_file -*graalpython.lib-python.3.test.test_io.CIOTest.test_with_open -*graalpython.lib-python.3.test.test_io.CIncrementalNewlineDecoderTest.test_newline_bytes -*graalpython.lib-python.3.test.test_io.CIncrementalNewlineDecoderTest.test_newline_decoder -*graalpython.lib-python.3.test.test_io.CIncrementalNewlineDecoderTest.test_translate -*graalpython.lib-python.3.test.test_io.CIncrementalNewlineDecoderTest.test_uninitialized -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test___all__ -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_abc_inheritance -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_abc_inheritance_official -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_abcs -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_attributes -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_blockingioerror -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_check_encoding_errors -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_check_encoding_warning -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_create_fail -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_create_writes -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_daemon_threads_shutdown_stderr_deadlock -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_daemon_threads_shutdown_stdout_deadlock -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_io_after_close -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_nonblock_pipe_write_bigbuf -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_nonblock_pipe_write_smallbuf -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_open_allargs -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_open_pipe_with_append -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_openwrapper -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_pickling -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_readinto_buffer_overflow -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_warn_on_dealloc -*graalpython.lib-python.3.test.test_io.CMiscIOTest.test_warn_on_dealloc_fd -*graalpython.lib-python.3.test.test_io.CSignalsTest.test_interrupted_read_retry_buffered -*graalpython.lib-python.3.test.test_io.CSignalsTest.test_interrupted_read_retry_text -*graalpython.lib-python.3.test.test_io.CSignalsTest.test_interrupted_write_buffered -*graalpython.lib-python.3.test.test_io.CSignalsTest.test_interrupted_write_retry_buffered -*graalpython.lib-python.3.test.test_io.CSignalsTest.test_interrupted_write_retry_text -*graalpython.lib-python.3.test.test_io.CSignalsTest.test_interrupted_write_text -*graalpython.lib-python.3.test.test_io.CSignalsTest.test_interrupted_write_unbuffered -*graalpython.lib-python.3.test.test_io.CSignalsTest.test_reentrant_write_buffered -*graalpython.lib-python.3.test.test_io.CSignalsTest.test_reentrant_write_text -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_append_bom -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_basic_io -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_bufio_write_through -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_close_error_on_close -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_constructor -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_create_at_shutdown_with_encoding -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_create_at_shutdown_without_encoding -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_default_encoding -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_del__CHUNK_SIZE_SystemError -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_destructor -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_detach -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_device_encoding -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_encoded_writes -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_encoding -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_encoding_errors_reading -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_encoding_errors_writing -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_error_through_destructor -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_errors_property -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_flush_error_on_close -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_garbage_collection -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_illegal_decoder -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_illegal_encoder -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_initialization -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_internal_buffer_size -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_issue1395_1 -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_issue1395_2 -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_issue1395_3 -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_issue1395_4 -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_issue1395_5 -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_issue2282 -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_issue22849 -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_issue25862 -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_line_buffering -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_multi_close -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_multibyte_seek_and_tell -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_newlines -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_newlines_input -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_newlines_output -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_non_text_encoding_codecs_are_rejected -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_nonnormalized_close_error_on_close -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_override_destructor -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_rawio -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_rawio_write_through -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_read_by_chunk -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_read_byteslike -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_read_nonbytes -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_read_one_by_one -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_readlines -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_readonly_attributes -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_reconfigure_defaults -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_reconfigure_encoding_read -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_reconfigure_line_buffering -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_reconfigure_newline -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_reconfigure_write -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_reconfigure_write_fromascii -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_reconfigure_write_non_seekable -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_reconfigure_write_through -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_recursive_repr -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_repr -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_rwpair_cleared_before_textio -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_seek_and_tell -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_seek_append_bom -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_seek_bom -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_seek_with_encoder_state -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_seeking -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_seeking_too -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_telling -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_threads_write -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_uninitialized -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_unreadable -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_unseekable -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_writelines -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_writelines_error -*graalpython.lib-python.3.test.test_io.CTextIOWrapperTest.test_writelines_userlist -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_close_and_closed -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_constructor -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_constructor_max_buffer_size_removal -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_constructor_with_not_readable -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_constructor_with_not_writeable -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_detach -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_isatty -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_peek -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_read -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_read1 -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_readable -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_reader_close_error_on_close -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_reader_writer_close_error_on_close -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_readinto -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_readlines -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_seekable -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_uninitialized -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_weakref_clearing -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_write -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_writeable -*graalpython.lib-python.3.test.test_io.PyBufferedRWPairTest.test_writer_close_error_on_close -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_buffering -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_close_error_on_close -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_constructor -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_context_manager -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_destructor -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_detach -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_detach_flush -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_error_through_destructor -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_fileno -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_flush -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_flush_and_peek -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_flush_and_read -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_flush_and_readinto -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_flush_and_write -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_flush_error_on_close -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_interleaved_read_write -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_interleaved_readline_write -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_invalid_args -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_max_buffer_size_removal -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_misbehaved_io -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_multi_close -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_no_extraneous_read -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_nonnormalized_close_error_on_close -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_override_destructor -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_read -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_read1 -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_read1_arbitrary -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_read_all -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_read_and_write -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_read_non_blocking -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_read_on_closed -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_read_past_eof -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_readinto -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_readinto1 -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_readinto1_array -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_readinto_array -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_readlines -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_readonly_attributes -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_recursive_repr -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_repr -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_seek_and_tell -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_slow_close_from_thread -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_threads -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_truncate -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_truncate_after_read_or_write -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_truncate_after_write -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_uninitialized -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_write -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_write_after_readahead -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_write_and_rewind -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_write_error_on_close -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_write_non_blocking -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_write_overflow -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_write_rewind_write -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_writelines -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_writelines_error -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_writelines_userlist -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_writes -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_writes_and_flushes -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_writes_and_peek -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_writes_and_read1s -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_writes_and_readintos -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_writes_and_reads -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_writes_and_seeks -*graalpython.lib-python.3.test.test_io.PyBufferedRandomTest.test_writes_and_truncates -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_buffering -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_close_error_on_close -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_constructor -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_context_manager -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_detach -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_error_through_destructor -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_fileno -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_flush_error_on_close -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_invalid_args -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_misbehaved_io -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_multi_close -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_no_extraneous_read -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_nonnormalized_close_error_on_close -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_override_destructor -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_read -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_read1 -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_read1_arbitrary -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_read_all -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_read_non_blocking -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_read_on_closed -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_read_past_eof -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_readinto -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_readinto1 -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_readinto1_array -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_readinto_array -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_readlines -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_readonly_attributes -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_recursive_repr -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_repr -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_threads -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_truncate_on_read_only -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_uninitialized -*graalpython.lib-python.3.test.test_io.PyBufferedReaderTest.test_unseekable -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_close_error_on_close -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_constructor -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_context_manager -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_destructor -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_detach -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_detach_flush -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_error_through_destructor -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_fileno -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_flush -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_flush_error_on_close -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_invalid_args -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_max_buffer_size_removal -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_misbehaved_io -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_multi_close -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_nonnormalized_close_error_on_close -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_override_destructor -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_readonly_attributes -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_recursive_repr -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_repr -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_slow_close_from_thread -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_threads -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_truncate -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_truncate_after_write -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_uninitialized -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_unseekable -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_write -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_write_and_rewind -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_write_error_on_close -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_write_non_blocking -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_write_overflow -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_writelines -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_writelines_error -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_writelines_userlist -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_writes -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_writes_and_flushes -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_writes_and_seeks -*graalpython.lib-python.3.test.test_io.PyBufferedWriterTest.test_writes_and_truncates -*graalpython.lib-python.3.test.test_io.PyIOTest.test_BufferedIOBase_destructor -*graalpython.lib-python.3.test.test_io.PyIOTest.test_BufferedIOBase_readinto -*graalpython.lib-python.3.test.test_io.PyIOTest.test_IOBase_destructor -*graalpython.lib-python.3.test.test_io.PyIOTest.test_RawIOBase_destructor -*graalpython.lib-python.3.test.test_io.PyIOTest.test_RawIOBase_read -*graalpython.lib-python.3.test.test_io.PyIOTest.test_RawIOBase_readall -*graalpython.lib-python.3.test.test_io.PyIOTest.test_TextIOBase_destructor -*graalpython.lib-python.3.test.test_io.PyIOTest.test_append_mode_tell -*graalpython.lib-python.3.test.test_io.PyIOTest.test_array_writes -*graalpython.lib-python.3.test.test_io.PyIOTest.test_bad_opener_negative_1 -*graalpython.lib-python.3.test.test_io.PyIOTest.test_bad_opener_other_negative -*graalpython.lib-python.3.test.test_io.PyIOTest.test_buffered_file_io -*graalpython.lib-python.3.test.test_io.PyIOTest.test_buffered_readinto_mixin -*graalpython.lib-python.3.test.test_io.PyIOTest.test_close_assert -*graalpython.lib-python.3.test.test_io.PyIOTest.test_close_flushes -*graalpython.lib-python.3.test.test_io.PyIOTest.test_closefd -*graalpython.lib-python.3.test.test_io.PyIOTest.test_closefd_attr -*graalpython.lib-python.3.test.test_io.PyIOTest.test_destructor -*graalpython.lib-python.3.test.test_io.PyIOTest.test_fileio_closefd -*graalpython.lib-python.3.test.test_io.PyIOTest.test_flush_error_on_close -*graalpython.lib-python.3.test.test_io.PyIOTest.test_fspath_support -*graalpython.lib-python.3.test.test_io.PyIOTest.test_garbage_collection -*graalpython.lib-python.3.test.test_io.PyIOTest.test_invalid_newline -*graalpython.lib-python.3.test.test_io.PyIOTest.test_invalid_operations -*graalpython.lib-python.3.test.test_io.PyIOTest.test_large_file_ops -*graalpython.lib-python.3.test.test_io.PyIOTest.test_multi_close -*graalpython.lib-python.3.test.test_io.PyIOTest.test_next_nonsizeable -*graalpython.lib-python.3.test.test_io.PyIOTest.test_no_closefd_with_filename -*graalpython.lib-python.3.test.test_io.PyIOTest.test_nonbuffered_textio -*graalpython.lib-python.3.test.test_io.PyIOTest.test_open_handles_NUL_chars -*graalpython.lib-python.3.test.test_io.PyIOTest.test_opener -*graalpython.lib-python.3.test.test_io.PyIOTest.test_opener_invalid_fd -*graalpython.lib-python.3.test.test_io.PyIOTest.test_optional_abilities -*graalpython.lib-python.3.test.test_io.PyIOTest.test_raw_bytes_io -*graalpython.lib-python.3.test.test_io.PyIOTest.test_raw_file_io -*graalpython.lib-python.3.test.test_io.PyIOTest.test_read_closed -*graalpython.lib-python.3.test.test_io.PyIOTest.test_readline -*graalpython.lib-python.3.test.test_io.PyIOTest.test_readline_nonsizeable -*graalpython.lib-python.3.test.test_io.PyIOTest.test_types_have_dict -*graalpython.lib-python.3.test.test_io.PyIOTest.test_unbounded_file -*graalpython.lib-python.3.test.test_io.PyIOTest.test_with_open -*graalpython.lib-python.3.test.test_io.PyIncrementalNewlineDecoderTest.test_newline_bytes -*graalpython.lib-python.3.test.test_io.PyIncrementalNewlineDecoderTest.test_newline_decoder -*graalpython.lib-python.3.test.test_io.PyIncrementalNewlineDecoderTest.test_translate -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test___all__ -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_abc_inheritance -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_abc_inheritance_official -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_abcs -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_attributes -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_blockingioerror -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_check_encoding_errors -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_check_encoding_warning -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_create_fail -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_create_writes -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_io_after_close -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_nonblock_pipe_write_bigbuf -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_nonblock_pipe_write_smallbuf -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_open_allargs -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_open_pipe_with_append -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_openwrapper -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_pickling -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_removed_u_mode -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_warn_on_dealloc -*graalpython.lib-python.3.test.test_io.PyMiscIOTest.test_warn_on_dealloc_fd -*graalpython.lib-python.3.test.test_io.PySignalsTest.test_interrupted_read_retry_buffered -*graalpython.lib-python.3.test.test_io.PySignalsTest.test_interrupted_read_retry_text -*graalpython.lib-python.3.test.test_io.PySignalsTest.test_interrupted_write_buffered -*graalpython.lib-python.3.test.test_io.PySignalsTest.test_interrupted_write_retry_buffered -*graalpython.lib-python.3.test.test_io.PySignalsTest.test_interrupted_write_retry_text -*graalpython.lib-python.3.test.test_io.PySignalsTest.test_interrupted_write_text -*graalpython.lib-python.3.test.test_io.PySignalsTest.test_interrupted_write_unbuffered -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_append_bom -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_basic_io -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_bufio_write_through -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_close_error_on_close -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_constructor -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_create_at_shutdown_with_encoding -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_create_at_shutdown_without_encoding -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_default_encoding -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_destructor -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_detach -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_device_encoding -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_encoded_writes -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_encoding -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_encoding_errors_reading -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_encoding_errors_writing -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_error_through_destructor -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_errors_property -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_flush_error_on_close -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_illegal_decoder -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_illegal_encoder -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_issue1395_1 -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_issue1395_2 -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_issue1395_3 -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_issue1395_4 -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_issue1395_5 -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_issue2282 -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_issue22849 -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_issue25862 -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_line_buffering -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_multi_close -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_multibyte_seek_and_tell -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_newlines -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_newlines_input -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_newlines_output -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_non_text_encoding_codecs_are_rejected -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_nonnormalized_close_error_on_close -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_override_destructor -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_rawio -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_rawio_write_through -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_read_by_chunk -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_read_byteslike -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_read_nonbytes -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_read_one_by_one -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_readlines -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_readonly_attributes -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_reconfigure_defaults -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_reconfigure_encoding_read -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_reconfigure_errors -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_reconfigure_line_buffering -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_reconfigure_newline -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_reconfigure_write -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_reconfigure_write_fromascii -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_reconfigure_write_non_seekable -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_reconfigure_write_through -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_recursive_repr -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_repr -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_seek_and_tell -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_seek_append_bom -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_seek_bom -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_seek_with_encoder_state -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_seeking -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_seeking_too -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_telling -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_threads_write -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_uninitialized -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_unreadable -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_unseekable -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_writelines -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_writelines_error -*graalpython.lib-python.3.test.test_io.PyTextIOWrapperTest.test_writelines_userlist -*graalpython.lib-python.3.test.test_io.StatefulIncrementalDecoderTest.test_decoder +test.test_io.CBufferedRWPairTest.test_close_and_closed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_constructor_max_buffer_size_removal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_constructor_with_not_readable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_constructor_with_not_writeable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_detach @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_isatty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_peek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_read1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_readable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_reader_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_reader_writer_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_readinto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_seekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_uninitialized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_weakref_clearing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRWPairTest.test_writeable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_args_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_buffering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_detach @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_detach_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_fileno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_flush_and_peek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_flush_and_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_flush_and_readinto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_flush_and_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_flush_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_interleaved_read_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_interleaved_readline_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_max_buffer_size_removal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_misbehaved_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_multi_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_no_extraneous_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_nonnormalized_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_read1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_read1_arbitrary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_read_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_read_and_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_read_non_blocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_read_on_closed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_read_past_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_readinto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_readinto1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_readinto1_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_readinto_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_readonly_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_seek_and_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_slow_close_from_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_threads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_truncate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_truncate_after_read_or_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_truncate_after_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_uninitialized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_write_after_readahead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_write_and_rewind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_write_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_write_non_blocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_write_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_write_rewind_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_writelines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_writelines_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_writelines_userlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_writes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_writes_and_flushes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_writes_and_peek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_writes_and_read1s @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_writes_and_readintos @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_writes_and_reads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_writes_and_seeks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedRandomTest.test_writes_and_truncates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_args_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_bad_readinto_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_bad_readinto_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_buffering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_detach @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_fileno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_flush_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_initialization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_misbehaved_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_misbehaved_io_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_multi_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_no_extraneous_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_nonnormalized_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_read1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_read1_arbitrary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_read_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_read_non_blocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_read_on_closed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_read_past_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_readinto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_readinto1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_readinto1_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_readinto_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_readonly_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_threads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_truncate_on_read_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_uninitialized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedReaderTest.test_unseekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_args_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_detach @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_detach_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_fileno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_flush_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_initialization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_max_buffer_size_removal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_misbehaved_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_multi_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_nonnormalized_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_readonly_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_slow_close_from_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_threads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_truncate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_truncate_after_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_uninitialized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_unseekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_write_and_rewind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_write_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_write_non_blocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_write_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_writelines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_writelines_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_writelines_userlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_writes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_writes_and_flushes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_writes_and_seeks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CBufferedWriterTest.test_writes_and_truncates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_BufferedIOBase_readinto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_RawIOBase_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_RawIOBase_readall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_append_mode_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_array_writes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_bad_opener_negative_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_bad_opener_other_negative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_buffered_file_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_buffered_readinto_mixin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_close_assert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_close_flushes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_closefd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_closefd_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_fileio_closefd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_flush_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_fspath_support @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_invalid_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_invalid_operations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_large_file_ops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_multi_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_next_nonsizeable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_no_closefd_with_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_nonbuffered_textio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_open_handles_NUL_chars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_opener @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_opener_invalid_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_optional_abilities @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_raw_bytes_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_raw_file_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_read_closed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_readline_nonsizeable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_types_have_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIOTest.test_with_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIncrementalNewlineDecoderTest.test_newline_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIncrementalNewlineDecoderTest.test_newline_decoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CIncrementalNewlineDecoderTest.test_translate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CMiscIOTest.test___all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CMiscIOTest.test_abc_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CMiscIOTest.test_abc_inheritance_official @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CMiscIOTest.test_abcs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CMiscIOTest.test_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CMiscIOTest.test_check_encoding_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CMiscIOTest.test_create_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CMiscIOTest.test_create_writes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CMiscIOTest.test_daemon_threads_shutdown_stderr_deadlock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CMiscIOTest.test_daemon_threads_shutdown_stdout_deadlock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CMiscIOTest.test_io_after_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CMiscIOTest.test_nonblock_pipe_write_bigbuf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CMiscIOTest.test_nonblock_pipe_write_smallbuf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CMiscIOTest.test_open_allargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CMiscIOTest.test_open_pipe_with_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CMiscIOTest.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CMiscIOTest.test_readinto_buffer_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_basic_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_bufio_write_through @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_default_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_del__CHUNK_SIZE_SystemError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_detach @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_encoding_errors_reading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_encoding_errors_writing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_error_through_destructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_errors_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_flush_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_illegal_decoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_illegal_encoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_initialization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_internal_buffer_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_issue1395_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_issue1395_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_issue1395_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_issue1395_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_issue1395_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_issue2282 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_issue22849 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_issue25862 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_line_buffering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_multi_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_multibyte_seek_and_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_newlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_newlines_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_newlines_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_non_text_encoding_codecs_are_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_nonnormalized_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_rawio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_rawio_write_through @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_read_by_chunk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_read_byteslike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_read_nonbytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_read_one_by_one @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_readonly_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_reconfigure_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_reconfigure_encoding_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_reconfigure_line_buffering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_reconfigure_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_reconfigure_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_reconfigure_write_fromascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_reconfigure_write_non_seekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_reconfigure_write_through @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_seek_and_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_seeking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_seeking_too @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_telling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_threads_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_uninitialized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_unreadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_unseekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_writelines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_writelines_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.CTextIOWrapperTest.test_writelines_userlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_close_and_closed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_constructor_max_buffer_size_removal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_constructor_with_not_readable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_constructor_with_not_writeable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_detach @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_isatty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_peek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_read1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_readable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_reader_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_reader_writer_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_readinto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_seekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_uninitialized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_weakref_clearing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_writeable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_buffering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_detach @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_detach_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_fileno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_flush_and_peek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_flush_and_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_flush_and_readinto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_flush_and_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_flush_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_interleaved_read_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_interleaved_readline_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_max_buffer_size_removal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_misbehaved_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_multi_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_no_extraneous_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_nonnormalized_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_read1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_read1_arbitrary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_read_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_read_and_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_read_non_blocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_read_on_closed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_read_past_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_readinto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_readinto1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_readinto1_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_readinto_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_readonly_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_seek_and_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_slow_close_from_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_threads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_truncate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_truncate_after_read_or_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_truncate_after_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_uninitialized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_write_after_readahead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_write_and_rewind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_write_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_write_non_blocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_write_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_write_rewind_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writelines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writelines_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writelines_userlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writes_and_flushes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writes_and_peek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writes_and_read1s @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writes_and_readintos @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writes_and_reads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writes_and_seeks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writes_and_truncates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_buffering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_detach @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_fileno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_flush_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_misbehaved_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_multi_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_no_extraneous_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_nonnormalized_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_read1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_read1_arbitrary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_read_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_read_non_blocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_read_on_closed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_read_past_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_readinto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_readinto1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_readinto1_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_readinto_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_readonly_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_threads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_truncate_on_read_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_uninitialized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedReaderTest.test_unseekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_detach @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_detach_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_fileno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_flush_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_max_buffer_size_removal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_misbehaved_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_multi_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_nonnormalized_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_readonly_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_slow_close_from_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_threads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_truncate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_truncate_after_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_uninitialized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_unseekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_write_and_rewind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_write_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_write_non_blocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_write_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_writelines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_writelines_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_writelines_userlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_writes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_writes_and_flushes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_writes_and_seeks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyBufferedWriterTest.test_writes_and_truncates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_BufferedIOBase_readinto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_RawIOBase_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_RawIOBase_readall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_append_mode_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_array_writes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_bad_opener_negative_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_bad_opener_other_negative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_buffered_file_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_buffered_readinto_mixin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_close_assert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_close_flushes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_closefd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_closefd_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_fileio_closefd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_flush_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_fspath_support @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_invalid_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_invalid_operations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_large_file_ops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_multi_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_next_nonsizeable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_no_closefd_with_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_nonbuffered_textio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_open_handles_NUL_chars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_opener @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_opener_invalid_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_optional_abilities @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_raw_bytes_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_raw_file_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_read_closed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_readline_nonsizeable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_types_have_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIOTest.test_with_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIncrementalNewlineDecoderTest.test_newline_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIncrementalNewlineDecoderTest.test_newline_decoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyIncrementalNewlineDecoderTest.test_translate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyMiscIOTest.test___all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyMiscIOTest.test_abc_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyMiscIOTest.test_abc_inheritance_official @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyMiscIOTest.test_abcs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyMiscIOTest.test_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyMiscIOTest.test_check_encoding_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyMiscIOTest.test_create_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyMiscIOTest.test_create_writes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyMiscIOTest.test_io_after_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyMiscIOTest.test_nonblock_pipe_write_bigbuf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyMiscIOTest.test_nonblock_pipe_write_smallbuf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyMiscIOTest.test_open_allargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyMiscIOTest.test_open_pipe_with_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyMiscIOTest.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyMiscIOTest.test_removed_u_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_basic_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_bufio_write_through @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_default_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_detach @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_encoding_errors_reading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_encoding_errors_writing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_error_through_destructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_errors_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_flush_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_illegal_decoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_illegal_encoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_issue1395_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_issue1395_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_issue1395_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_issue1395_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_issue1395_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_issue2282 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_issue22849 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_issue25862 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_line_buffering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_multi_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_multibyte_seek_and_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_newlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_newlines_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_newlines_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_non_text_encoding_codecs_are_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_nonnormalized_close_error_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_rawio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_rawio_write_through @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_read_by_chunk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_read_byteslike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_read_nonbytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_read_one_by_one @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_readonly_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_reconfigure_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_reconfigure_encoding_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_reconfigure_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_reconfigure_line_buffering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_reconfigure_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_reconfigure_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_reconfigure_write_fromascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_reconfigure_write_non_seekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_reconfigure_write_through @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_seek_and_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_seeking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_seeking_too @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_telling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_threads_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_uninitialized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_unreadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_unseekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_writelines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_writelines_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_writelines_userlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_io.StatefulIncrementalDecoderTest.test_decoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ipaddress.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ipaddress.txt index 37d2285d4c..3ff8a1f7f8 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ipaddress.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ipaddress.txt @@ -1,204 +1,204 @@ -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v4.test_bad_address_split -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v4.test_bad_packed_length -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v4.test_empty_address -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v4.test_empty_octet -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v4.test_floats_rejected -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v4.test_format -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v4.test_int -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v4.test_invalid_characters -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v4.test_large_ints_rejected -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v4.test_leading_zeros -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v4.test_negative_ints_rejected -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v4.test_network_passed_as_address -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v4.test_not_an_index_issue15559 -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v4.test_octet_length -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v4.test_octet_limit -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v4.test_packed -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v4.test_pickle -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v4.test_weakref -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_leading_colon -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_not_enough_parts -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_repeated_double_colon -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_too_many_colons -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_too_many_parts -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_too_many_parts_with_double_colon -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_trailing_colon -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_bad_packed_length -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_bad_v4_part_in -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_blank_scope_id -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_copy -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_empty_address -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_floats_rejected -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_format -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_int -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_invalid_characters -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_invalid_scope_id_with_percent -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_large_ints_rejected -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_leading_zeros -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_negative_ints_rejected -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_network_passed_as_address -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_not_an_index_issue15559 -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_packed -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_part_length -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_pickle -*graalpython.lib-python.3.test.test_ipaddress.AddressTestCase_v6.test_weakref -*graalpython.lib-python.3.test.test_ipaddress.ComparisonTests.test_containment -*graalpython.lib-python.3.test.test_ipaddress.ComparisonTests.test_foreign_type_equality -*graalpython.lib-python.3.test.test_ipaddress.ComparisonTests.test_foreign_type_ordering -*graalpython.lib-python.3.test.test_ipaddress.ComparisonTests.test_incompatible_versions -*graalpython.lib-python.3.test.test_ipaddress.ComparisonTests.test_mixed_type_equality -*graalpython.lib-python.3.test.test_ipaddress.ComparisonTests.test_mixed_type_key -*graalpython.lib-python.3.test.test_ipaddress.ComparisonTests.test_mixed_type_ordering -*graalpython.lib-python.3.test.test_ipaddress.ComparisonTests.test_same_type_equality -*graalpython.lib-python.3.test.test_ipaddress.ComparisonTests.test_same_type_ordering -*graalpython.lib-python.3.test.test_ipaddress.ComparisonTests.test_scoped_ipv6_equality -*graalpython.lib-python.3.test.test_ipaddress.ComparisonTests.test_v4_with_v6_scoped_equality -*graalpython.lib-python.3.test.test_ipaddress.FactoryFunctionErrors.test_ip_address -*graalpython.lib-python.3.test.test_ipaddress.FactoryFunctionErrors.test_ip_interface -*graalpython.lib-python.3.test.test_ipaddress.FactoryFunctionErrors.test_ip_network -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v4.test_address_errors -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v4.test_bad_packed_length -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v4.test_empty_address -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v4.test_floats_rejected -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v4.test_int -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v4.test_large_ints_rejected -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v4.test_leading_zeros -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v4.test_negative_ints_rejected -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v4.test_netmask_errors -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v4.test_netmask_in_tuple_errors -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v4.test_no_mask -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v4.test_not_an_index_issue15559 -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v4.test_packed -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v4.test_pickle -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v4.test_split_netmask -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v4.test_valid_netmask -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v6.test_address_errors -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v6.test_bad_packed_length -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v6.test_blank_scope_id -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v6.test_empty_address -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v6.test_floats_rejected -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v6.test_int -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v6.test_invalid_scope_id_with_percent -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v6.test_large_ints_rejected -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v6.test_leading_zeros -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v6.test_negative_ints_rejected -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v6.test_netmask_errors -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v6.test_netmask_in_tuple_errors -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v6.test_no_mask -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v6.test_not_an_index_issue15559 -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v6.test_packed -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v6.test_pickle -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v6.test_split_netmask -*graalpython.lib-python.3.test.test_ipaddress.InterfaceTestCase_v6.test_valid_netmask -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testAddrExclude -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testAddressComparison -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testAddressIntMath -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testCollapsing -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testCompressIPv6Address -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testContains -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testCopyConstructor -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testEmbeddedIpv4 -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testEqual -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testExplodeShortHandIpStr -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testFancySubnetting -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testForceVersion -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testGetBroadcast -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testGetIp -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testGetNetmask -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testGetNetwork -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testGetNum_Addresses -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testGetPrefixlen -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testGetScopeId -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testGetSubnetForSingle128 -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testGetSubnetForSingle32 -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testGetSubnets -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testGetSubnets3 -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testGetSupernet -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testGetSupernet3 -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testGetSupernet4 -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testGetitem -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testHash -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testHosts -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testIPBases -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testIPVersion -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testIPv4Net -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testIPv4NetworkHelpers -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testIPv4Tuple -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testIPv6AddressTooLarge -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testIPv6NetworkHelpers -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testIPv6Tuple -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testIntRepresentation -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testInterfaceComparison -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testInternals -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testInvalidIntToBytes -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testIpFromInt -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testIpFromPacked -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testIpType -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testIpv4Mapped -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testIpv4MappedPrivateCheck -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testMaxPrefixLength -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testNetworkComparison -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testNetworkElementCaching -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testNotEqual -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testNth -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testOverlaps -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testPacked -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testPrivateNetworks -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testRepr -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testReservedIpv4 -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testReservedIpv6 -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testReversePointer -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testSlash0Constructor -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testSlash128Constructor -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testSlash32Constructor -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testStrictNetworks -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testSubnet2 -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testSubnetFailsForLargeCidrDiff -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testSubnetFailsForNegativeCidrDiff -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testSummarizing -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testSupernetFailsForLargeCidrDiff -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testTeredo -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testV4HashIsNotConstant -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testV6HashIsNotConstant -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testWithStar -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testZeroNetmask -*graalpython.lib-python.3.test.test_ipaddress.IpaddrUnitTest.testsixtofour -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_address_errors -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_bad_packed_length -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_empty_address -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_floats_rejected -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_int -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_large_ints_rejected -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_leading_zeros -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_negative_ints_rejected -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_netmask_errors -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_netmask_in_tuple_errors -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_no_mask -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_not_an_index_issue15559 -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_packed -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_pickle -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_split_netmask -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_subnet_of -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_subnet_of_mixed_types -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_supernet_of -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v4.test_valid_netmask -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_address_errors -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_bad_packed_length -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_blank_scope_id -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_empty_address -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_floats_rejected -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_int -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_invalid_scope_id_with_percent -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_large_ints_rejected -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_leading_zeros -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_negative_ints_rejected -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_netmask_errors -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_netmask_in_tuple_errors -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_no_mask -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_not_an_index_issue15559 -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_packed -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_pickle -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_split_netmask -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_subnet_of -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_supernet_of -*graalpython.lib-python.3.test.test_ipaddress.NetworkTestCase_v6.test_valid_netmask +test.test_ipaddress.AddressTestCase_v4.test_bad_address_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v4.test_bad_packed_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v4.test_empty_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v4.test_empty_octet @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v4.test_floats_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v4.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v4.test_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v4.test_invalid_characters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v4.test_large_ints_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v4.test_leading_zeros @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v4.test_negative_ints_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v4.test_network_passed_as_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v4.test_not_an_index_issue15559 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v4.test_octet_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v4.test_octet_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v4.test_packed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v4.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v4.test_weakref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_leading_colon @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_not_enough_parts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_repeated_double_colon @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_too_many_colons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_too_many_parts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_too_many_parts_with_double_colon @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_trailing_colon @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_bad_packed_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_bad_v4_part_in @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_blank_scope_id @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_empty_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_floats_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_invalid_characters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_invalid_scope_id_with_percent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_large_ints_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_leading_zeros @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_negative_ints_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_network_passed_as_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_not_an_index_issue15559 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_packed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_part_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.AddressTestCase_v6.test_weakref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.ComparisonTests.test_containment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.ComparisonTests.test_foreign_type_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.ComparisonTests.test_foreign_type_ordering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.ComparisonTests.test_incompatible_versions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.ComparisonTests.test_mixed_type_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.ComparisonTests.test_mixed_type_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.ComparisonTests.test_mixed_type_ordering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.ComparisonTests.test_same_type_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.ComparisonTests.test_same_type_ordering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.ComparisonTests.test_scoped_ipv6_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.ComparisonTests.test_v4_with_v6_scoped_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.FactoryFunctionErrors.test_ip_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.FactoryFunctionErrors.test_ip_interface @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.FactoryFunctionErrors.test_ip_network @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v4.test_address_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v4.test_bad_packed_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v4.test_empty_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v4.test_floats_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v4.test_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v4.test_large_ints_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v4.test_leading_zeros @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v4.test_negative_ints_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v4.test_netmask_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v4.test_netmask_in_tuple_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v4.test_no_mask @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v4.test_not_an_index_issue15559 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v4.test_packed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v4.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v4.test_split_netmask @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v4.test_valid_netmask @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v6.test_address_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v6.test_bad_packed_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v6.test_blank_scope_id @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v6.test_empty_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v6.test_floats_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v6.test_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v6.test_invalid_scope_id_with_percent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v6.test_large_ints_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v6.test_leading_zeros @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v6.test_negative_ints_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v6.test_netmask_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v6.test_netmask_in_tuple_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v6.test_no_mask @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v6.test_not_an_index_issue15559 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v6.test_packed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v6.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v6.test_split_netmask @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.InterfaceTestCase_v6.test_valid_netmask @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testAddrExclude @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testAddressComparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testAddressIntMath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testCollapsing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testCompressIPv6Address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testContains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testCopyConstructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testEmbeddedIpv4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testExplodeShortHandIpStr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testFancySubnetting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testForceVersion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testGetBroadcast @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testGetIp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testGetNetmask @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testGetNetwork @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testGetNum_Addresses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testGetPrefixlen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testGetScopeId @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testGetSubnetForSingle128 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testGetSubnetForSingle32 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testGetSubnets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testGetSubnets3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testGetSupernet @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testGetSupernet3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testGetSupernet4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testGetitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testHash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testHosts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testIPBases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testIPVersion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testIPv4Net @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testIPv4NetworkHelpers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testIPv4Tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testIPv6AddressTooLarge @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testIPv6NetworkHelpers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testIPv6Tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testIntRepresentation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testInterfaceComparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testInternals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testInvalidIntToBytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testIpFromInt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testIpFromPacked @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testIpType @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testIpv4Mapped @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testIpv4MappedPrivateCheck @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testMaxPrefixLength @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testNetworkComparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testNetworkElementCaching @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testNotEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testNth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testOverlaps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testPacked @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testPrivateNetworks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testRepr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testReservedIpv4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testReservedIpv6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testReversePointer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testSlash0Constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testSlash128Constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testSlash32Constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testStrictNetworks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testSubnet2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testSubnetFailsForLargeCidrDiff @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testSubnetFailsForNegativeCidrDiff @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testSummarizing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testSupernetFailsForLargeCidrDiff @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testTeredo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testV4HashIsNotConstant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testV6HashIsNotConstant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testWithStar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testZeroNetmask @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.IpaddrUnitTest.testsixtofour @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_address_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_bad_packed_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_empty_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_floats_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_large_ints_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_leading_zeros @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_negative_ints_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_netmask_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_netmask_in_tuple_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_no_mask @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_not_an_index_issue15559 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_packed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_split_netmask @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_subnet_of @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_subnet_of_mixed_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_supernet_of @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v4.test_valid_netmask @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_address_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_bad_packed_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_blank_scope_id @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_empty_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_floats_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_invalid_scope_id_with_percent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_large_ints_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_leading_zeros @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_negative_ints_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_netmask_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_netmask_in_tuple_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_no_mask @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_not_an_index_issue15559 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_packed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_split_netmask @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_subnet_of @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_supernet_of @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ipaddress.NetworkTestCase_v6.test_valid_netmask @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_isinstance.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_isinstance.txt index 2f34b078c7..135a39a8d3 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_isinstance.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_isinstance.txt @@ -1,22 +1,23 @@ -*graalpython.lib-python.3.test.test_isinstance.TestIsInstanceExceptions.test_bases_raises_other_than_attribute_error -*graalpython.lib-python.3.test.test_isinstance.TestIsInstanceExceptions.test_class_has_no_bases -*graalpython.lib-python.3.test.test_isinstance.TestIsInstanceExceptions.test_dont_mask_non_attribute_error -*graalpython.lib-python.3.test.test_isinstance.TestIsInstanceExceptions.test_isinstance_dont_mask_non_attribute_error -*graalpython.lib-python.3.test.test_isinstance.TestIsInstanceExceptions.test_mask_attribute_error -*graalpython.lib-python.3.test.test_isinstance.TestIsInstanceIsSubclass.test_infinite_cycle_in_bases -*graalpython.lib-python.3.test.test_isinstance.TestIsInstanceIsSubclass.test_infinite_recursion_in_bases -*graalpython.lib-python.3.test.test_isinstance.TestIsInstanceIsSubclass.test_infinitely_many_bases -*graalpython.lib-python.3.test.test_isinstance.TestIsInstanceIsSubclass.test_isinstance_abstract -*graalpython.lib-python.3.test.test_isinstance.TestIsInstanceIsSubclass.test_isinstance_normal -*graalpython.lib-python.3.test.test_isinstance.TestIsInstanceIsSubclass.test_isinstance_recursion_limit -*graalpython.lib-python.3.test.test_isinstance.TestIsInstanceIsSubclass.test_isinstance_with_or_union -*graalpython.lib-python.3.test.test_isinstance.TestIsInstanceIsSubclass.test_issubclass_refcount_handling -*graalpython.lib-python.3.test.test_isinstance.TestIsInstanceIsSubclass.test_subclass_abstract -*graalpython.lib-python.3.test.test_isinstance.TestIsInstanceIsSubclass.test_subclass_normal -*graalpython.lib-python.3.test.test_isinstance.TestIsInstanceIsSubclass.test_subclass_recursion_limit -*graalpython.lib-python.3.test.test_isinstance.TestIsInstanceIsSubclass.test_subclass_tuple -*graalpython.lib-python.3.test.test_isinstance.TestIsInstanceIsSubclass.test_subclass_with_union -*graalpython.lib-python.3.test.test_isinstance.TestIsSubclassExceptions.test_dont_mask_non_attribute_error -*graalpython.lib-python.3.test.test_isinstance.TestIsSubclassExceptions.test_dont_mask_non_attribute_error_in_cls_arg -*graalpython.lib-python.3.test.test_isinstance.TestIsSubclassExceptions.test_mask_attribute_error -*graalpython.lib-python.3.test.test_isinstance.TestIsSubclassExceptions.test_mask_attribute_error_in_cls_arg +test.test_isinstance.TestIsInstanceExceptions.test_bases_raises_other_than_attribute_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsInstanceExceptions.test_class_has_no_bases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsInstanceExceptions.test_dont_mask_non_attribute_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsInstanceExceptions.test_isinstance_dont_mask_non_attribute_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsInstanceExceptions.test_mask_attribute_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsInstanceIsSubclass.test_infinite_cycle_in_bases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsInstanceIsSubclass.test_infinite_recursion_in_bases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsInstanceIsSubclass.test_infinite_recursion_via_bases_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsInstanceIsSubclass.test_infinitely_many_bases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsInstanceIsSubclass.test_isinstance_abstract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsInstanceIsSubclass.test_isinstance_normal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsInstanceIsSubclass.test_isinstance_recursion_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsInstanceIsSubclass.test_isinstance_with_or_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsInstanceIsSubclass.test_issubclass_refcount_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsInstanceIsSubclass.test_subclass_abstract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsInstanceIsSubclass.test_subclass_normal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsInstanceIsSubclass.test_subclass_recursion_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsInstanceIsSubclass.test_subclass_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsInstanceIsSubclass.test_subclass_with_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsSubclassExceptions.test_dont_mask_non_attribute_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsSubclassExceptions.test_dont_mask_non_attribute_error_in_cls_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsSubclassExceptions.test_mask_attribute_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_isinstance.TestIsSubclassExceptions.test_mask_attribute_error_in_cls_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_iter.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_iter.txt index be891077e8..69e4e1520f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_iter.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_iter.txt @@ -1,55 +1,51 @@ -*graalpython.lib-python.3.test.test_iter.TestCase.test_3720 -*graalpython.lib-python.3.test.test_iter.TestCase.test_builtin_filter -*graalpython.lib-python.3.test.test_iter.TestCase.test_builtin_list -*graalpython.lib-python.3.test.test_iter.TestCase.test_builtin_map -*graalpython.lib-python.3.test.test_iter.TestCase.test_builtin_max_min -*graalpython.lib-python.3.test.test_iter.TestCase.test_builtin_tuple -*graalpython.lib-python.3.test.test_iter.TestCase.test_builtin_zip -*graalpython.lib-python.3.test.test_iter.TestCase.test_countOf -*graalpython.lib-python.3.test.test_iter.TestCase.test_error_iter -*graalpython.lib-python.3.test.test_iter.TestCase.test_exception_function -*graalpython.lib-python.3.test.test_iter.TestCase.test_exception_sequence -*graalpython.lib-python.3.test.test_iter.TestCase.test_extending_list_with_iterator_does_not_segfault -*graalpython.lib-python.3.test.test_iter.TestCase.test_free_after_iterating -*graalpython.lib-python.3.test.test_iter.TestCase.test_in_and_not_in -*graalpython.lib-python.3.test.test_iter.TestCase.test_indexOf -*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_basic -*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_big_range -*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_callable -*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_class_for -*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_class_iter -*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_dict -*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_empty -*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_file -*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_for_loop -*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_function -*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_function_stop -*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_idempotency -*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_independence -*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_neg_setstate -*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_overflow -*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_range -*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_string -*graalpython.lib-python.3.test.test_iter.TestCase.test_iter_tuple -*graalpython.lib-python.3.test.test_iter.TestCase.test_mutating_seq_class_exhausted_iter -*graalpython.lib-python.3.test.test_iter.TestCase.test_mutating_seq_class_iter_pickle -*graalpython.lib-python.3.test.test_iter.TestCase.test_nested_comprehensions_for -*graalpython.lib-python.3.test.test_iter.TestCase.test_nested_comprehensions_iter -*graalpython.lib-python.3.test.test_iter.TestCase.test_new_style_iter_class -*graalpython.lib-python.3.test.test_iter.TestCase.test_ref_counting_behavior -*graalpython.lib-python.3.test.test_iter.TestCase.test_seq_class_for -*graalpython.lib-python.3.test.test_iter.TestCase.test_seq_class_iter -*graalpython.lib-python.3.test.test_iter.TestCase.test_sinkstate_callable -*graalpython.lib-python.3.test.test_iter.TestCase.test_sinkstate_dict -*graalpython.lib-python.3.test.test_iter.TestCase.test_sinkstate_enumerate -*graalpython.lib-python.3.test.test_iter.TestCase.test_sinkstate_list -*graalpython.lib-python.3.test.test_iter.TestCase.test_sinkstate_range -*graalpython.lib-python.3.test.test_iter.TestCase.test_sinkstate_sequence -*graalpython.lib-python.3.test.test_iter.TestCase.test_sinkstate_string -*graalpython.lib-python.3.test.test_iter.TestCase.test_sinkstate_tuple -*graalpython.lib-python.3.test.test_iter.TestCase.test_sinkstate_yield -*graalpython.lib-python.3.test.test_iter.TestCase.test_stop_sequence -*graalpython.lib-python.3.test.test_iter.TestCase.test_unicode_join_endcase -*graalpython.lib-python.3.test.test_iter.TestCase.test_unpack_iter -*graalpython.lib-python.3.test.test_iter.TestCase.test_writelines -*graalpython.lib-python.3.test.test_iter.TestMain.test_main +test.test_iter.TestCase.test_3720 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_builtin_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_builtin_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_builtin_map @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_builtin_max_min @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_builtin_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_builtin_zip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_countOf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_error_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_exception_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_exception_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_extending_list_with_iterator_does_not_segfault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_in_and_not_in @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_indexOf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_iter_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_iter_big_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_iter_callable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_iter_class_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_iter_class_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_iter_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_iter_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_iter_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_iter_for_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_iter_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_iter_function_stop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_iter_idempotency @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_iter_independence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_iter_neg_setstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_iter_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_iter_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_iter_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_mutating_seq_class_exhausted_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_mutating_seq_class_iter_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_nested_comprehensions_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_nested_comprehensions_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_new_style_iter_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_seq_class_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_seq_class_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_sinkstate_callable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_sinkstate_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_sinkstate_enumerate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_sinkstate_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_sinkstate_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_sinkstate_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_sinkstate_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_sinkstate_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_sinkstate_yield @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_stop_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_unicode_join_endcase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_unpack_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iter.TestCase.test_writelines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_iterlen.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_iterlen.txt index 52690efb5a..4bf8657a1c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_iterlen.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_iterlen.txt @@ -1,22 +1,22 @@ -*graalpython.lib-python.3.test.test_iterlen.TestDeque.test_immutable_during_iteration -*graalpython.lib-python.3.test.test_iterlen.TestDeque.test_invariant -*graalpython.lib-python.3.test.test_iterlen.TestDequeReversed.test_immutable_during_iteration -*graalpython.lib-python.3.test.test_iterlen.TestDequeReversed.test_invariant -*graalpython.lib-python.3.test.test_iterlen.TestDictItems.test_immutable_during_iteration -*graalpython.lib-python.3.test.test_iterlen.TestDictItems.test_invariant -*graalpython.lib-python.3.test.test_iterlen.TestDictKeys.test_immutable_during_iteration -*graalpython.lib-python.3.test.test_iterlen.TestDictKeys.test_invariant -*graalpython.lib-python.3.test.test_iterlen.TestDictValues.test_immutable_during_iteration -*graalpython.lib-python.3.test.test_iterlen.TestDictValues.test_invariant -*graalpython.lib-python.3.test.test_iterlen.TestLengthHintExceptions.test_invalid_hint -*graalpython.lib-python.3.test.test_iterlen.TestLengthHintExceptions.test_issue1242657 -*graalpython.lib-python.3.test.test_iterlen.TestList.test_invariant -*graalpython.lib-python.3.test.test_iterlen.TestList.test_mutation -*graalpython.lib-python.3.test.test_iterlen.TestListReversed.test_invariant -*graalpython.lib-python.3.test.test_iterlen.TestListReversed.test_mutation -*graalpython.lib-python.3.test.test_iterlen.TestRepeat.test_invariant -*graalpython.lib-python.3.test.test_iterlen.TestSet.test_immutable_during_iteration -*graalpython.lib-python.3.test.test_iterlen.TestSet.test_invariant -*graalpython.lib-python.3.test.test_iterlen.TestTuple.test_invariant -*graalpython.lib-python.3.test.test_iterlen.TestXrange.test_invariant -*graalpython.lib-python.3.test.test_iterlen.TestXrangeCustomReversed.test_invariant +test.test_iterlen.TestDeque.test_immutable_during_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestDeque.test_invariant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestDequeReversed.test_immutable_during_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestDequeReversed.test_invariant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestDictItems.test_immutable_during_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestDictItems.test_invariant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestDictKeys.test_immutable_during_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestDictKeys.test_invariant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestDictValues.test_immutable_during_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestDictValues.test_invariant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestLengthHintExceptions.test_invalid_hint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestLengthHintExceptions.test_issue1242657 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestList.test_invariant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestList.test_mutation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestListReversed.test_invariant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestListReversed.test_mutation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestRepeat.test_invariant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestSet.test_immutable_during_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestSet.test_invariant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestTuple.test_invariant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestXrange.test_invariant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_iterlen.TestXrangeCustomReversed.test_invariant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_itertools.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_itertools.txt index 33ae4cbd15..f92ed2f9e1 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_itertools.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_itertools.txt @@ -1,133 +1,114 @@ -*graalpython.lib-python.3.test.test_itertools.LengthTransparency.test_repeat -*graalpython.lib-python.3.test.test_itertools.LengthTransparency.test_repeat_with_negative_times -*graalpython.lib-python.3.test.test_itertools.RegressionTests.test_issue30347_1 -*graalpython.lib-python.3.test.test_itertools.RegressionTests.test_issue30347_2 -*graalpython.lib-python.3.test.test_itertools.RegressionTests.test_long_chain_of_empty_iterables -*graalpython.lib-python.3.test.test_itertools.RegressionTests.test_sf_793826 -*graalpython.lib-python.3.test.test_itertools.RegressionTests.test_sf_950057 -*graalpython.lib-python.3.test.test_itertools.SizeofTest.test_combinations_sizeof -*graalpython.lib-python.3.test.test_itertools.SizeofTest.test_combinations_with_replacement_sizeof -*graalpython.lib-python.3.test.test_itertools.SizeofTest.test_permutations_sizeof -*graalpython.lib-python.3.test.test_itertools.SizeofTest.test_product_sizeof -*graalpython.lib-python.3.test.test_itertools.SubclassWithKwargsTest.test_keywords_in_subclass -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_StopIteration -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_accumulate -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_bug_7244 -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_chain -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_chain_from_iterable -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_chain_reducible -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_chain_setstate -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_combinations -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_combinations_overflow -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_combinations_result_gc -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_combinations_tuple_reuse -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_combinations_with_replacement -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_combinations_with_replacement_overflow -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_combinations_with_replacement_result_gc -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_combinations_with_replacement_tuple_reuse -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_combinatorics -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_compress -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_count -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_count_with_stride -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_cycle -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_cycle_copy_pickle -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_cycle_setstate -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_cycle_unpickle_compat -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_dropwhile -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_filter -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_filterfalse -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_groupby -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_islice -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_map -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_pairwise -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_pairwise_reenter -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_permutations -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_permutations_overflow -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_permutations_result_gc -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_permutations_tuple_reuse -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_product -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_product_issue_25021 -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_product_overflow -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_product_pickling -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_product_result_gc -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_product_tuple_reuse -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_repeat -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_repeat_with_negative_times -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_starmap -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_takewhile -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_tee -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_tee_concurrent -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_tee_del_backward -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_tee_reenter -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_zip -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_zip_longest_bad_iterable -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_zip_longest_pickling -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_zip_longest_result_gc -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_zip_longest_tuple_reuse -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_zip_tuple_reuse -*graalpython.lib-python.3.test.test_itertools.TestBasicOps.test_ziplongest -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_accumulate -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_accumulate_reducible -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_accumulate_reducible_none -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_chain -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_chain_from_iterable -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_combinations -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_combinations_with_replacement -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_compress -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_count -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_cycle -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_dropwhile -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_filter -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_filterfalse -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_groupby -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_islice -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_map -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_permutations -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_product -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_repeat -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_stapmap -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_takewhile -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_zip -*graalpython.lib-python.3.test.test_itertools.TestExamples.test_zip_longest -*graalpython.lib-python.3.test.test_itertools.TestGC.test_accumulate -*graalpython.lib-python.3.test.test_itertools.TestGC.test_chain -*graalpython.lib-python.3.test.test_itertools.TestGC.test_chain_from_iterable -*graalpython.lib-python.3.test.test_itertools.TestGC.test_combinations -*graalpython.lib-python.3.test.test_itertools.TestGC.test_combinations_with_replacement -*graalpython.lib-python.3.test.test_itertools.TestGC.test_compress -*graalpython.lib-python.3.test.test_itertools.TestGC.test_count -*graalpython.lib-python.3.test.test_itertools.TestGC.test_cycle -*graalpython.lib-python.3.test.test_itertools.TestGC.test_dropwhile -*graalpython.lib-python.3.test.test_itertools.TestGC.test_filter -*graalpython.lib-python.3.test.test_itertools.TestGC.test_filterfalse -*graalpython.lib-python.3.test.test_itertools.TestGC.test_groupby -*graalpython.lib-python.3.test.test_itertools.TestGC.test_islice -*graalpython.lib-python.3.test.test_itertools.TestGC.test_issue2246 -*graalpython.lib-python.3.test.test_itertools.TestGC.test_map -*graalpython.lib-python.3.test.test_itertools.TestGC.test_pairwise -*graalpython.lib-python.3.test.test_itertools.TestGC.test_permutations -*graalpython.lib-python.3.test.test_itertools.TestGC.test_product -*graalpython.lib-python.3.test.test_itertools.TestGC.test_repeat -*graalpython.lib-python.3.test.test_itertools.TestGC.test_starmap -*graalpython.lib-python.3.test.test_itertools.TestGC.test_takewhile -*graalpython.lib-python.3.test.test_itertools.TestGC.test_zip -*graalpython.lib-python.3.test.test_itertools.TestGC.test_zip_longest -*graalpython.lib-python.3.test.test_itertools.TestMain.test_main -*graalpython.lib-python.3.test.test_itertools.TestPurePythonRoughEquivalents.test_islice_recipe -*graalpython.lib-python.3.test.test_itertools.TestVariousIteratorArgs.test_accumulate -*graalpython.lib-python.3.test.test_itertools.TestVariousIteratorArgs.test_chain -*graalpython.lib-python.3.test.test_itertools.TestVariousIteratorArgs.test_compress -*graalpython.lib-python.3.test.test_itertools.TestVariousIteratorArgs.test_cycle -*graalpython.lib-python.3.test.test_itertools.TestVariousIteratorArgs.test_dropwhile -*graalpython.lib-python.3.test.test_itertools.TestVariousIteratorArgs.test_filter -*graalpython.lib-python.3.test.test_itertools.TestVariousIteratorArgs.test_filterfalse -*graalpython.lib-python.3.test.test_itertools.TestVariousIteratorArgs.test_groupby -*graalpython.lib-python.3.test.test_itertools.TestVariousIteratorArgs.test_islice -*graalpython.lib-python.3.test.test_itertools.TestVariousIteratorArgs.test_map -*graalpython.lib-python.3.test.test_itertools.TestVariousIteratorArgs.test_pairwise -*graalpython.lib-python.3.test.test_itertools.TestVariousIteratorArgs.test_product -*graalpython.lib-python.3.test.test_itertools.TestVariousIteratorArgs.test_starmap -*graalpython.lib-python.3.test.test_itertools.TestVariousIteratorArgs.test_takewhile -*graalpython.lib-python.3.test.test_itertools.TestVariousIteratorArgs.test_tee -*graalpython.lib-python.3.test.test_itertools.TestVariousIteratorArgs.test_zip -*graalpython.lib-python.3.test.test_itertools.TestVariousIteratorArgs.test_ziplongest +test.test_itertools.LengthTransparency.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.LengthTransparency.test_repeat_with_negative_times @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.RegressionTests.test_issue30347_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.RegressionTests.test_issue30347_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.RegressionTests.test_long_chain_of_empty_iterables @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.RegressionTests.test_sf_793826 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.RegressionTests.test_sf_950057 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.SubclassWithKwargsTest.test_keywords_in_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_StopIteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_accumulate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_bug_7244 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_chain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_chain_from_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_chain_reducible @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_chain_setstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_combinations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_combinations_with_replacement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_combinatorics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_compress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_count_with_stride @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_cycle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_cycle_copy_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_cycle_setstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_cycle_unpickle_compat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_dropwhile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_filterfalse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_groupby @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_islice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_map @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_pairwise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_pairwise_reenter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_pairwise_reenter2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_permutations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_product @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_product_issue_25021 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_product_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_repeat_with_negative_times @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_starmap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_takewhile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_tee @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_tee_concurrent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_tee_del_backward @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_tee_reenter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_zip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_zip_longest_bad_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_zip_longest_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestBasicOps.test_ziplongest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_accumulate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_accumulate_reducible @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_accumulate_reducible_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_chain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_chain_from_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_combinations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_combinations_with_replacement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_compress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_cycle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_dropwhile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_filterfalse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_groupby @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_islice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_map @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_permutations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_product @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_stapmap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_takewhile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_zip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestExamples.test_zip_longest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_accumulate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_chain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_chain_from_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_combinations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_combinations_with_replacement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_compress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_cycle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_dropwhile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_filterfalse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_groupby @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_islice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_issue2246 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_map @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_pairwise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_permutations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_product @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_starmap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_takewhile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_zip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestGC.test_zip_longest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestPurePythonRoughEquivalents.test_islice_recipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestVariousIteratorArgs.test_accumulate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestVariousIteratorArgs.test_chain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestVariousIteratorArgs.test_compress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestVariousIteratorArgs.test_cycle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestVariousIteratorArgs.test_dropwhile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestVariousIteratorArgs.test_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestVariousIteratorArgs.test_filterfalse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestVariousIteratorArgs.test_groupby @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestVariousIteratorArgs.test_islice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestVariousIteratorArgs.test_map @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestVariousIteratorArgs.test_pairwise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestVariousIteratorArgs.test_product @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestVariousIteratorArgs.test_starmap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestVariousIteratorArgs.test_takewhile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestVariousIteratorArgs.test_tee @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestVariousIteratorArgs.test_zip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_itertools.TestVariousIteratorArgs.test_ziplongest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_json.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_json.txt index b3e9256df6..9da39cfdf1 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_json.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_json.txt @@ -1,166 +1,163 @@ -*graalpython.lib-python.3.test.test_json.__init__.TestCTest.test_cjson -*graalpython.lib-python.3.test.test_json.__init__.TestPyTest.test_pyjson -*test.test_json.TestCTest.test_cjson -*test.test_json.TestPyTest.test_pyjson -*test.test_json.test_decode.TestCDecode.test_decimal -*test.test_json.test_decode.TestCDecode.test_decoder_optimizations -*test.test_json.test_decode.TestCDecode.test_deprecated_encode -*test.test_json.test_decode.TestCDecode.test_empty_objects -*test.test_json.test_decode.TestCDecode.test_extra_data -*test.test_json.test_decode.TestCDecode.test_float -*test.test_json.test_decode.TestCDecode.test_invalid_escape -*test.test_json.test_decode.TestCDecode.test_invalid_input_type -*test.test_json.test_decode.TestCDecode.test_keys_reuse -*test.test_json.test_decode.TestCDecode.test_limit_int -*test.test_json.test_decode.TestCDecode.test_negative_index -*test.test_json.test_decode.TestCDecode.test_object_pairs_hook -*test.test_json.test_decode.TestCDecode.test_string_with_utf8_bom -*test.test_json.test_decode.TestPyDecode.test_decimal -*test.test_json.test_decode.TestPyDecode.test_decoder_optimizations -*test.test_json.test_decode.TestPyDecode.test_deprecated_encode -*test.test_json.test_decode.TestPyDecode.test_empty_objects -*test.test_json.test_decode.TestPyDecode.test_extra_data -*test.test_json.test_decode.TestPyDecode.test_float -*test.test_json.test_decode.TestPyDecode.test_invalid_escape -*test.test_json.test_decode.TestPyDecode.test_invalid_input_type -*test.test_json.test_decode.TestPyDecode.test_keys_reuse -*test.test_json.test_decode.TestPyDecode.test_limit_int -*test.test_json.test_decode.TestPyDecode.test_negative_index -*test.test_json.test_decode.TestPyDecode.test_object_pairs_hook -*test.test_json.test_decode.TestPyDecode.test_string_with_utf8_bom -*test.test_json.test_default.TestCDefault.test_default -*test.test_json.test_default.TestCDefault.test_ordereddict -*test.test_json.test_default.TestPyDefault.test_default -*test.test_json.test_default.TestPyDefault.test_ordereddict -*test.test_json.test_dump.TestCDump.test_dump -*test.test_json.test_dump.TestCDump.test_dump_skipkeys -*test.test_json.test_dump.TestCDump.test_dumps -*test.test_json.test_dump.TestCDump.test_encode_evil_dict -*test.test_json.test_dump.TestCDump.test_encode_mutated -*test.test_json.test_dump.TestCDump.test_encode_truefalse -*test.test_json.test_dump.TestCDump.test_large_list -*test.test_json.test_dump.TestPyDump.test_dump -*test.test_json.test_dump.TestPyDump.test_dump_skipkeys -*test.test_json.test_dump.TestPyDump.test_dumps -*test.test_json.test_dump.TestPyDump.test_encode_evil_dict -*test.test_json.test_dump.TestPyDump.test_encode_mutated -*test.test_json.test_dump.TestPyDump.test_encode_truefalse -*test.test_json.test_encode_basestring_ascii.TestCEncodeBasestringAscii.test_encode_basestring_ascii -*test.test_json.test_encode_basestring_ascii.TestCEncodeBasestringAscii.test_ordered_dict -*test.test_json.test_encode_basestring_ascii.TestCEncodeBasestringAscii.test_overflow -*test.test_json.test_encode_basestring_ascii.TestCEncodeBasestringAscii.test_sorted_dict -*test.test_json.test_encode_basestring_ascii.TestPyEncodeBasestringAscii.test_encode_basestring_ascii -*test.test_json.test_encode_basestring_ascii.TestPyEncodeBasestringAscii.test_ordered_dict -*test.test_json.test_encode_basestring_ascii.TestPyEncodeBasestringAscii.test_sorted_dict -*test.test_json.test_enum.TestCEnum.test_dict_keys -*test.test_json.test_enum.TestCEnum.test_dict_values -*test.test_json.test_enum.TestCEnum.test_floats -*test.test_json.test_enum.TestCEnum.test_ints -*test.test_json.test_enum.TestCEnum.test_list -*test.test_json.test_enum.TestCEnum.test_weird_floats -*test.test_json.test_enum.TestPyEnum.test_dict_keys -*test.test_json.test_enum.TestPyEnum.test_dict_values -*test.test_json.test_enum.TestPyEnum.test_floats -*test.test_json.test_enum.TestPyEnum.test_ints -*test.test_json.test_enum.TestPyEnum.test_list -*test.test_json.test_enum.TestPyEnum.test_weird_floats -*test.test_json.test_fail.TestCFail.test_extra_data -*test.test_json.test_fail.TestCFail.test_failures -*test.test_json.test_fail.TestCFail.test_linecol -*test.test_json.test_fail.TestCFail.test_non_string_keys_dict -*test.test_json.test_fail.TestCFail.test_not_serializable -*test.test_json.test_fail.TestCFail.test_truncated_input -*test.test_json.test_fail.TestCFail.test_unexpected_data -*test.test_json.test_fail.TestPyFail.test_extra_data -*test.test_json.test_fail.TestPyFail.test_failures -*test.test_json.test_fail.TestPyFail.test_linecol -*test.test_json.test_fail.TestPyFail.test_non_string_keys_dict -*test.test_json.test_fail.TestPyFail.test_not_serializable -*test.test_json.test_fail.TestPyFail.test_truncated_input -*test.test_json.test_fail.TestPyFail.test_unexpected_data -*test.test_json.test_float.TestCFloat.test_allow_nan -*test.test_json.test_float.TestCFloat.test_floats -*test.test_json.test_float.TestCFloat.test_ints -*test.test_json.test_float.TestCFloat.test_out_of_range -*test.test_json.test_float.TestPyFloat.test_allow_nan -*test.test_json.test_float.TestPyFloat.test_floats -*test.test_json.test_float.TestPyFloat.test_ints -*test.test_json.test_float.TestPyFloat.test_out_of_range -*test.test_json.test_indent.TestCIndent.test_indent -*test.test_json.test_indent.TestCIndent.test_indent0 -*test.test_json.test_indent.TestPyIndent.test_indent -*test.test_json.test_indent.TestPyIndent.test_indent0 -*test.test_json.test_pass1.TestCPass1.test_parse -*test.test_json.test_pass1.TestPyPass1.test_parse -*test.test_json.test_pass2.TestCPass2.test_parse -*test.test_json.test_pass2.TestPyPass2.test_parse -*test.test_json.test_pass3.TestCPass3.test_parse -*test.test_json.test_pass3.TestPyPass3.test_parse -*test.test_json.test_recursion.TestCRecursion.test_defaultrecursion -*test.test_json.test_recursion.TestCRecursion.test_dictrecursion -*test.test_json.test_recursion.TestCRecursion.test_endless_recursion -*test.test_json.test_recursion.TestCRecursion.test_highly_nested_objects_decoding -*test.test_json.test_recursion.TestCRecursion.test_highly_nested_objects_encoding -*test.test_json.test_recursion.TestCRecursion.test_listrecursion -*test.test_json.test_recursion.TestPyRecursion.test_defaultrecursion -*test.test_json.test_recursion.TestPyRecursion.test_dictrecursion -*test.test_json.test_recursion.TestPyRecursion.test_endless_recursion -*test.test_json.test_recursion.TestPyRecursion.test_highly_nested_objects_decoding -*test.test_json.test_recursion.TestPyRecursion.test_highly_nested_objects_encoding -*test.test_json.test_recursion.TestPyRecursion.test_listrecursion -*test.test_json.test_scanstring.TestCScanstring.test_bad_escapes -*test.test_json.test_scanstring.TestCScanstring.test_overflow -*test.test_json.test_scanstring.TestPyScanstring.test_bad_escapes -*test.test_json.test_scanstring.TestPyScanstring.test_overflow -*test.test_json.test_scanstring.TestPyScanstring.test_scanstring -*test.test_json.test_scanstring.TestPyScanstring.test_surrogates -*test.test_json.test_separators.TestCSeparators.test_illegal_separators -*test.test_json.test_separators.TestCSeparators.test_separators -*test.test_json.test_separators.TestPySeparators.test_illegal_separators -*test.test_json.test_separators.TestPySeparators.test_separators -*test.test_json.test_speedups.TestDecode.test_bad_bool_args -*test.test_json.test_speedups.TestDecode.test_make_scanner -*test.test_json.test_speedups.TestEncode.test_bad_bool_args -*test.test_json.test_speedups.TestEncode.test_bad_markers_argument_to_encoder -*test.test_json.test_speedups.TestEncode.test_bad_str_encoder -*test.test_json.test_speedups.TestEncode.test_make_encoder -*test.test_json.test_speedups.TestEncode.test_unsortable_keys -*test.test_json.test_speedups.TestSpeedups.test_encode_basestring_ascii -*test.test_json.test_speedups.TestSpeedups.test_scanstring -*test.test_json.test_tool.TestTool.test_broken_pipe_error -*test.test_json.test_tool.TestTool.test_compact -*test.test_json.test_tool.TestTool.test_ensure_ascii_default -*test.test_json.test_tool.TestTool.test_help_flag -*test.test_json.test_tool.TestTool.test_indent -*test.test_json.test_tool.TestTool.test_infile_outfile -*test.test_json.test_tool.TestTool.test_infile_stdout -*test.test_json.test_tool.TestTool.test_jsonlines -*test.test_json.test_tool.TestTool.test_no_ensure_ascii_flag -*test.test_json.test_tool.TestTool.test_no_indent -*test.test_json.test_tool.TestTool.test_non_ascii_infile -*test.test_json.test_tool.TestTool.test_sort_keys_flag -*test.test_json.test_tool.TestTool.test_stdin_stdout -*test.test_json.test_tool.TestTool.test_tab -*test.test_json.test_tool.TestTool.test_writing_in_place -*test.test_json.test_unicode.TestCUnicode.test_big_unicode_decode -*test.test_json.test_unicode.TestCUnicode.test_big_unicode_encode -*test.test_json.test_unicode.TestCUnicode.test_bytes_decode -*test.test_json.test_unicode.TestCUnicode.test_bytes_encode -*test.test_json.test_unicode.TestCUnicode.test_encoding3 -*test.test_json.test_unicode.TestCUnicode.test_encoding4 -*test.test_json.test_unicode.TestCUnicode.test_encoding5 -*test.test_json.test_unicode.TestCUnicode.test_encoding6 -*test.test_json.test_unicode.TestCUnicode.test_object_pairs_hook_with_unicode -*test.test_json.test_unicode.TestCUnicode.test_unicode_decode -*test.test_json.test_unicode.TestCUnicode.test_unicode_preservation -*test.test_json.test_unicode.TestPyUnicode.test_big_unicode_decode -*test.test_json.test_unicode.TestPyUnicode.test_big_unicode_encode -*test.test_json.test_unicode.TestPyUnicode.test_bytes_decode -*test.test_json.test_unicode.TestPyUnicode.test_bytes_encode -*test.test_json.test_unicode.TestPyUnicode.test_encoding3 -*test.test_json.test_unicode.TestPyUnicode.test_encoding4 -*test.test_json.test_unicode.TestPyUnicode.test_encoding5 -*test.test_json.test_unicode.TestPyUnicode.test_encoding6 -*test.test_json.test_unicode.TestPyUnicode.test_object_pairs_hook_with_unicode -*test.test_json.test_unicode.TestPyUnicode.test_unicode_decode -*test.test_json.test_unicode.TestPyUnicode.test_unicode_preservation +DocTestCase.json @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.json.encoder.JSONEncoder.encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.TestCTest.test_cjson @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.TestPyTest.test_pyjson @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestCDecode.test_decimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestCDecode.test_decoder_optimizations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestCDecode.test_empty_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestCDecode.test_extra_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestCDecode.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestCDecode.test_invalid_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestCDecode.test_invalid_input_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestCDecode.test_keys_reuse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestCDecode.test_limit_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestCDecode.test_negative_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestCDecode.test_object_pairs_hook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestCDecode.test_string_with_utf8_bom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestPyDecode.test_decimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestPyDecode.test_decoder_optimizations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestPyDecode.test_empty_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestPyDecode.test_extra_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestPyDecode.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestPyDecode.test_invalid_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestPyDecode.test_invalid_input_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestPyDecode.test_keys_reuse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestPyDecode.test_limit_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestPyDecode.test_negative_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestPyDecode.test_object_pairs_hook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_decode.TestPyDecode.test_string_with_utf8_bom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_default.TestCDefault.test_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_default.TestCDefault.test_ordereddict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_default.TestPyDefault.test_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_default.TestPyDefault.test_ordereddict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_dump.TestCDump.test_dump @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_dump.TestCDump.test_dump_skipkeys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_dump.TestCDump.test_dumps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_dump.TestCDump.test_encode_evil_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_dump.TestCDump.test_encode_mutated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_dump.TestCDump.test_encode_truefalse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_dump.TestCDump.test_large_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_dump.TestPyDump.test_dump @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_dump.TestPyDump.test_dump_skipkeys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_dump.TestPyDump.test_dumps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_dump.TestPyDump.test_encode_evil_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_dump.TestPyDump.test_encode_mutated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_dump.TestPyDump.test_encode_truefalse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_encode_basestring_ascii.TestCEncodeBasestringAscii.test_encode_basestring_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_encode_basestring_ascii.TestCEncodeBasestringAscii.test_ordered_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_encode_basestring_ascii.TestCEncodeBasestringAscii.test_sorted_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_encode_basestring_ascii.TestPyEncodeBasestringAscii.test_encode_basestring_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_encode_basestring_ascii.TestPyEncodeBasestringAscii.test_ordered_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_encode_basestring_ascii.TestPyEncodeBasestringAscii.test_sorted_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_enum.TestCEnum.test_dict_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_enum.TestCEnum.test_dict_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_enum.TestCEnum.test_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_enum.TestCEnum.test_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_enum.TestCEnum.test_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_enum.TestCEnum.test_weird_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_enum.TestPyEnum.test_dict_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_enum.TestPyEnum.test_dict_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_enum.TestPyEnum.test_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_enum.TestPyEnum.test_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_enum.TestPyEnum.test_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_enum.TestPyEnum.test_weird_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_fail.TestCFail.test_extra_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_fail.TestCFail.test_failures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_fail.TestCFail.test_linecol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_fail.TestCFail.test_non_string_keys_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_fail.TestCFail.test_not_serializable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_fail.TestCFail.test_truncated_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_fail.TestCFail.test_unexpected_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_fail.TestPyFail.test_extra_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_fail.TestPyFail.test_failures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_fail.TestPyFail.test_linecol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_fail.TestPyFail.test_non_string_keys_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_fail.TestPyFail.test_not_serializable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_fail.TestPyFail.test_truncated_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_fail.TestPyFail.test_unexpected_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_float.TestCFloat.test_allow_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_float.TestCFloat.test_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_float.TestCFloat.test_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_float.TestCFloat.test_out_of_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_float.TestPyFloat.test_allow_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_float.TestPyFloat.test_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_float.TestPyFloat.test_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_float.TestPyFloat.test_out_of_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_indent.TestCIndent.test_indent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_indent.TestCIndent.test_indent0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_indent.TestPyIndent.test_indent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_indent.TestPyIndent.test_indent0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_pass1.TestCPass1.test_parse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_pass1.TestPyPass1.test_parse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_pass2.TestCPass2.test_parse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_pass2.TestPyPass2.test_parse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_pass3.TestCPass3.test_parse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_pass3.TestPyPass3.test_parse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_recursion.TestCRecursion.test_defaultrecursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_recursion.TestCRecursion.test_dictrecursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_recursion.TestCRecursion.test_endless_recursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_recursion.TestCRecursion.test_highly_nested_objects_decoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_recursion.TestCRecursion.test_highly_nested_objects_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_recursion.TestCRecursion.test_listrecursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_recursion.TestPyRecursion.test_defaultrecursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_recursion.TestPyRecursion.test_dictrecursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_recursion.TestPyRecursion.test_endless_recursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_recursion.TestPyRecursion.test_highly_nested_objects_decoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_recursion.TestPyRecursion.test_highly_nested_objects_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_recursion.TestPyRecursion.test_listrecursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_scanstring.TestCScanstring.test_bad_escapes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_scanstring.TestCScanstring.test_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_scanstring.TestPyScanstring.test_bad_escapes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_scanstring.TestPyScanstring.test_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_scanstring.TestPyScanstring.test_scanstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_scanstring.TestPyScanstring.test_surrogates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_separators.TestCSeparators.test_illegal_separators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_separators.TestCSeparators.test_separators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_separators.TestPySeparators.test_illegal_separators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_separators.TestPySeparators.test_separators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_speedups.TestDecode.test_bad_bool_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_speedups.TestDecode.test_make_scanner @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_speedups.TestEncode.test_bad_bool_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_speedups.TestEncode.test_bad_markers_argument_to_encoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_speedups.TestEncode.test_bad_str_encoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_speedups.TestEncode.test_make_encoder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_speedups.TestEncode.test_unsortable_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_speedups.TestSpeedups.test_encode_basestring_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_speedups.TestSpeedups.test_scanstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_tool.TestTool.test_broken_pipe_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_json.test_tool.TestTool.test_compact @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_tool.TestTool.test_ensure_ascii_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_json.test_tool.TestTool.test_help_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_tool.TestTool.test_indent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_tool.TestTool.test_infile_outfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_json.test_tool.TestTool.test_infile_stdout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_json.test_tool.TestTool.test_jsonlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_tool.TestTool.test_no_ensure_ascii_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_json.test_tool.TestTool.test_no_indent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_tool.TestTool.test_non_ascii_infile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_json.test_tool.TestTool.test_sort_keys_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_json.test_tool.TestTool.test_stdin_stdout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_tool.TestTool.test_tab @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_tool.TestTool.test_writing_in_place @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_json.test_unicode.TestCUnicode.test_big_unicode_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestCUnicode.test_big_unicode_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestCUnicode.test_bytes_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestCUnicode.test_bytes_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestCUnicode.test_encoding3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestCUnicode.test_encoding4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestCUnicode.test_encoding5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestCUnicode.test_encoding6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestCUnicode.test_object_pairs_hook_with_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestCUnicode.test_unicode_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestCUnicode.test_unicode_preservation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestPyUnicode.test_big_unicode_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestPyUnicode.test_big_unicode_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestPyUnicode.test_bytes_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestPyUnicode.test_bytes_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestPyUnicode.test_encoding3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestPyUnicode.test_encoding4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestPyUnicode.test_encoding5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestPyUnicode.test_encoding6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestPyUnicode.test_object_pairs_hook_with_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestPyUnicode.test_unicode_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_json.test_unicode.TestPyUnicode.test_unicode_preservation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_keyword.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_keyword.txt index e6a9601f73..fed68e0a19 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_keyword.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_keyword.txt @@ -1,11 +1,11 @@ -*graalpython.lib-python.3.test.test_keyword.Test_iskeyword.test_all_keywords_fail_to_be_used_as_names -*graalpython.lib-python.3.test.test_keyword.Test_iskeyword.test_all_soft_keywords_can_be_used_as_names -*graalpython.lib-python.3.test.test_keyword.Test_iskeyword.test_async_and_await_are_keywords -*graalpython.lib-python.3.test.test_keyword.Test_iskeyword.test_changing_the_kwlist_does_not_affect_iskeyword -*graalpython.lib-python.3.test.test_keyword.Test_iskeyword.test_changing_the_softkwlist_does_not_affect_issoftkeyword -*graalpython.lib-python.3.test.test_keyword.Test_iskeyword.test_keywords_are_sorted -*graalpython.lib-python.3.test.test_keyword.Test_iskeyword.test_match_and_case_are_soft_keywords -*graalpython.lib-python.3.test.test_keyword.Test_iskeyword.test_none_value_is_not_a_keyword -*graalpython.lib-python.3.test.test_keyword.Test_iskeyword.test_softkeywords_are_sorted -*graalpython.lib-python.3.test.test_keyword.Test_iskeyword.test_true_is_a_keyword -*graalpython.lib-python.3.test.test_keyword.Test_iskeyword.test_uppercase_true_is_not_a_keyword +test.test_keyword.Test_iskeyword.test_all_keywords_fail_to_be_used_as_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keyword.Test_iskeyword.test_all_soft_keywords_can_be_used_as_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keyword.Test_iskeyword.test_async_and_await_are_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keyword.Test_iskeyword.test_changing_the_kwlist_does_not_affect_iskeyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keyword.Test_iskeyword.test_changing_the_softkwlist_does_not_affect_issoftkeyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keyword.Test_iskeyword.test_keywords_are_sorted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keyword.Test_iskeyword.test_match_and_case_are_soft_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keyword.Test_iskeyword.test_none_value_is_not_a_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keyword.Test_iskeyword.test_softkeywords_are_sorted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keyword.Test_iskeyword.test_true_is_a_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keyword.Test_iskeyword.test_uppercase_true_is_not_a_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_keywordonlyarg.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_keywordonlyarg.txt index 0f3d47eb03..61d50e3126 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_keywordonlyarg.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_keywordonlyarg.txt @@ -1,11 +1,11 @@ -*graalpython.lib-python.3.test.test_keywordonlyarg.KeywordOnlyArgTestCase.testFunctionCall -*graalpython.lib-python.3.test.test_keywordonlyarg.KeywordOnlyArgTestCase.testKwDefaults -*graalpython.lib-python.3.test.test_keywordonlyarg.KeywordOnlyArgTestCase.testRaiseErrorFuncallWithUnexpectedKeywordArgument -*graalpython.lib-python.3.test.test_keywordonlyarg.KeywordOnlyArgTestCase.testSyntaxErrorForFunctionCall -*graalpython.lib-python.3.test.test_keywordonlyarg.KeywordOnlyArgTestCase.testSyntaxErrorForFunctionDefinition -*graalpython.lib-python.3.test.test_keywordonlyarg.KeywordOnlyArgTestCase.testSyntaxForManyArguments -*graalpython.lib-python.3.test.test_keywordonlyarg.KeywordOnlyArgTestCase.testTooManyPositionalErrorMessage -*graalpython.lib-python.3.test.test_keywordonlyarg.KeywordOnlyArgTestCase.test_default_evaluation_order -*graalpython.lib-python.3.test.test_keywordonlyarg.KeywordOnlyArgTestCase.test_issue13343 -*graalpython.lib-python.3.test.test_keywordonlyarg.KeywordOnlyArgTestCase.test_kwonly_methods -*graalpython.lib-python.3.test.test_keywordonlyarg.KeywordOnlyArgTestCase.test_mangling +test.test_keywordonlyarg.KeywordOnlyArgTestCase.testFunctionCall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.testKwDefaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.testRaiseErrorFuncallWithUnexpectedKeywordArgument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.testSyntaxErrorForFunctionCall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.testSyntaxErrorForFunctionDefinition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.testSyntaxForManyArguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.testTooManyPositionalErrorMessage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.test_default_evaluation_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.test_issue13343 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.test_kwonly_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.test_mangling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_largefile.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_largefile.txt index bd08c836b7..fa9dfe79ee 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_largefile.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_largefile.txt @@ -1,14 +1,11 @@ -*graalpython.lib-python.3.test.test_largefile.CLargeFileTest.test_large_read -*graalpython.lib-python.3.test.test_largefile.CLargeFileTest.test_lseek -*graalpython.lib-python.3.test.test_largefile.CLargeFileTest.test_osstat -*graalpython.lib-python.3.test.test_largefile.CLargeFileTest.test_seek_read -*graalpython.lib-python.3.test.test_largefile.CLargeFileTest.test_seekable -*graalpython.lib-python.3.test.test_largefile.CLargeFileTest.test_truncate -*graalpython.lib-python.3.test.test_largefile.PyLargeFileTest.test_large_read -*graalpython.lib-python.3.test.test_largefile.PyLargeFileTest.test_lseek -*graalpython.lib-python.3.test.test_largefile.PyLargeFileTest.test_osstat -*graalpython.lib-python.3.test.test_largefile.PyLargeFileTest.test_seek_read -*graalpython.lib-python.3.test.test_largefile.PyLargeFileTest.test_seekable -*graalpython.lib-python.3.test.test_largefile.PyLargeFileTest.test_truncate -*graalpython.lib-python.3.test.test_largefile.TestCopyfile.test_it -*graalpython.lib-python.3.test.test_largefile.TestSocketSendfile.test_it +test.test_largefile.CLargeFileTest.test_lseek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_largefile.CLargeFileTest.test_osstat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_largefile.CLargeFileTest.test_seek_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_largefile.CLargeFileTest.test_seekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_largefile.CLargeFileTest.test_truncate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_largefile.PyLargeFileTest.test_lseek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_largefile.PyLargeFileTest.test_osstat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_largefile.PyLargeFileTest.test_seek_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_largefile.PyLargeFileTest.test_seekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_largefile.PyLargeFileTest.test_truncate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_largefile.TestCopyfile.test_it @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_lib2to3.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_lib2to3.txt index 4726f9a2d8..80a0d82a66 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_lib2to3.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_lib2to3.txt @@ -1,614 +1,671 @@ -*lib2to3.tests.test_all_fixers.Test_all.test_all_project_files -*lib2to3.tests.test_fixers.Test_apply.test_1 -*lib2to3.tests.test_fixers.Test_apply.test_2 -*lib2to3.tests.test_fixers.Test_apply.test_3 -*lib2to3.tests.test_fixers.Test_apply.test_4 -*lib2to3.tests.test_fixers.Test_apply.test_5 -*lib2to3.tests.test_fixers.Test_apply.test_6 -*lib2to3.tests.test_fixers.Test_apply.test_call -*lib2to3.tests.test_fixers.Test_apply.test_complex_1 -*lib2to3.tests.test_fixers.Test_apply.test_complex_2 -*lib2to3.tests.test_fixers.Test_apply.test_complex_3 -*lib2to3.tests.test_fixers.Test_apply.test_dotted_name -*lib2to3.tests.test_fixers.Test_apply.test_extreme -*lib2to3.tests.test_fixers.Test_apply.test_space_1 -*lib2to3.tests.test_fixers.Test_apply.test_space_2 -*lib2to3.tests.test_fixers.Test_apply.test_subscript -*lib2to3.tests.test_fixers.Test_apply.test_unchanged_1 -*lib2to3.tests.test_fixers.Test_apply.test_unchanged_2 -*lib2to3.tests.test_fixers.Test_apply.test_unchanged_3 -*lib2to3.tests.test_fixers.Test_apply.test_unchanged_4 -*lib2to3.tests.test_fixers.Test_apply.test_unchanged_5 -*lib2to3.tests.test_fixers.Test_apply.test_unchanged_6 -*lib2to3.tests.test_fixers.Test_apply.test_unchanged_6b -*lib2to3.tests.test_fixers.Test_apply.test_unchanged_7 -*lib2to3.tests.test_fixers.Test_apply.test_unchanged_8 -*lib2to3.tests.test_fixers.Test_apply.test_unchanged_9 -*lib2to3.tests.test_fixers.Test_apply.test_weird_comments -*lib2to3.tests.test_fixers.Test_asserts.test_deprecated_names -*lib2to3.tests.test_fixers.Test_asserts.test_unchanged -*lib2to3.tests.test_fixers.Test_asserts.test_variants -*lib2to3.tests.test_fixers.Test_basestring.test_basestring -*lib2to3.tests.test_fixers.Test_buffer.test_buffer -*lib2to3.tests.test_fixers.Test_buffer.test_slicing -*lib2to3.tests.test_fixers.Test_dict.test_01 -*lib2to3.tests.test_fixers.Test_dict.test_02 -*lib2to3.tests.test_fixers.Test_dict.test_03 -*lib2to3.tests.test_fixers.Test_dict.test_04 -*lib2to3.tests.test_fixers.Test_dict.test_05 -*lib2to3.tests.test_fixers.Test_dict.test_06 -*lib2to3.tests.test_fixers.Test_dict.test_07 -*lib2to3.tests.test_fixers.Test_dict.test_08 -*lib2to3.tests.test_fixers.Test_dict.test_09 -*lib2to3.tests.test_fixers.Test_dict.test_10 -*lib2to3.tests.test_fixers.Test_dict.test_11 -*lib2to3.tests.test_fixers.Test_dict.test_12 -*lib2to3.tests.test_fixers.Test_dict.test_13 -*lib2to3.tests.test_fixers.Test_dict.test_14 -*lib2to3.tests.test_fixers.Test_dict.test_15 -*lib2to3.tests.test_fixers.Test_dict.test_16 -*lib2to3.tests.test_fixers.Test_dict.test_17 -*lib2to3.tests.test_fixers.Test_dict.test_18 -*lib2to3.tests.test_fixers.Test_dict.test_19 -*lib2to3.tests.test_fixers.Test_dict.test_20 -*lib2to3.tests.test_fixers.Test_dict.test_21 -*lib2to3.tests.test_fixers.Test_dict.test_22 -*lib2to3.tests.test_fixers.Test_dict.test_23 -*lib2to3.tests.test_fixers.Test_dict.test_24 -*lib2to3.tests.test_fixers.Test_dict.test_25 -*lib2to3.tests.test_fixers.Test_dict.test_26 -*lib2to3.tests.test_fixers.Test_dict.test_27 -*lib2to3.tests.test_fixers.Test_dict.test_28 -*lib2to3.tests.test_fixers.Test_dict.test_29 -*lib2to3.tests.test_fixers.Test_dict.test_30 -*lib2to3.tests.test_fixers.Test_dict.test_31 -*lib2to3.tests.test_fixers.Test_dict.test_32 -*lib2to3.tests.test_fixers.Test_dict.test_prefix_preservation -*lib2to3.tests.test_fixers.Test_dict.test_trailing_comment -*lib2to3.tests.test_fixers.Test_dict.test_unchanged -*lib2to3.tests.test_fixers.Test_except.test_bare_except -*lib2to3.tests.test_fixers.Test_except.test_bare_except_and_else_finally -*lib2to3.tests.test_fixers.Test_except.test_list_unpack -*lib2to3.tests.test_fixers.Test_except.test_multi_class -*lib2to3.tests.test_fixers.Test_except.test_multi_fixed_excepts_before_bare_except -*lib2to3.tests.test_fixers.Test_except.test_one_line_suites -*lib2to3.tests.test_fixers.Test_except.test_prefix_preservation -*lib2to3.tests.test_fixers.Test_except.test_simple -*lib2to3.tests.test_fixers.Test_except.test_simple_no_space_before_target -*lib2to3.tests.test_fixers.Test_except.test_tuple_unpack -*lib2to3.tests.test_fixers.Test_except.test_unchanged_1 -*lib2to3.tests.test_fixers.Test_except.test_unchanged_2 -*lib2to3.tests.test_fixers.Test_except.test_unchanged_3 -*lib2to3.tests.test_fixers.Test_except.test_weird_target_1 -*lib2to3.tests.test_fixers.Test_except.test_weird_target_2 -*lib2to3.tests.test_fixers.Test_except.test_weird_target_3 -*lib2to3.tests.test_fixers.Test_exec.test_basic -*lib2to3.tests.test_fixers.Test_exec.test_complex_1 -*lib2to3.tests.test_fixers.Test_exec.test_complex_2 -*lib2to3.tests.test_fixers.Test_exec.test_prefix_preservation -*lib2to3.tests.test_fixers.Test_exec.test_unchanged_1 -*lib2to3.tests.test_fixers.Test_exec.test_unchanged_2 -*lib2to3.tests.test_fixers.Test_exec.test_unchanged_3 -*lib2to3.tests.test_fixers.Test_exec.test_unchanged_4 -*lib2to3.tests.test_fixers.Test_exec.test_with_globals -*lib2to3.tests.test_fixers.Test_exec.test_with_globals_locals -*lib2to3.tests.test_fixers.Test_execfile.test_conversion -*lib2to3.tests.test_fixers.Test_execfile.test_spacing -*lib2to3.tests.test_fixers.Test_exitfunc.test_comments -*lib2to3.tests.test_fixers.Test_exitfunc.test_complex_expression -*lib2to3.tests.test_fixers.Test_exitfunc.test_in_a_function -*lib2to3.tests.test_fixers.Test_exitfunc.test_names_import -*lib2to3.tests.test_fixers.Test_exitfunc.test_no_sys_import -*lib2to3.tests.test_fixers.Test_exitfunc.test_simple -*lib2to3.tests.test_fixers.Test_exitfunc.test_unchanged -*lib2to3.tests.test_fixers.Test_filter.test_filter_basic -*lib2to3.tests.test_fixers.Test_filter.test_filter_nochange -*lib2to3.tests.test_fixers.Test_filter.test_filter_trailers -*lib2to3.tests.test_fixers.Test_filter.test_future_builtins -*lib2to3.tests.test_fixers.Test_filter.test_prefix_preservation -*lib2to3.tests.test_fixers.Test_funcattrs.test -*lib2to3.tests.test_fixers.Test_funcattrs.test_unchanged -*lib2to3.tests.test_fixers.Test_future.test_future -*lib2to3.tests.test_fixers.Test_future.test_run_order -*lib2to3.tests.test_fixers.Test_getcwdu.test_basic -*lib2to3.tests.test_fixers.Test_getcwdu.test_comment -*lib2to3.tests.test_fixers.Test_getcwdu.test_indentation -*lib2to3.tests.test_fixers.Test_getcwdu.test_multilation -*lib2to3.tests.test_fixers.Test_getcwdu.test_unchanged -*lib2to3.tests.test_fixers.Test_has_key.test_1 -*lib2to3.tests.test_fixers.Test_has_key.test_10 -*lib2to3.tests.test_fixers.Test_has_key.test_11 -*lib2to3.tests.test_fixers.Test_has_key.test_2 -*lib2to3.tests.test_fixers.Test_has_key.test_3 -*lib2to3.tests.test_fixers.Test_has_key.test_4 -*lib2to3.tests.test_fixers.Test_has_key.test_5 -*lib2to3.tests.test_fixers.Test_has_key.test_6 -*lib2to3.tests.test_fixers.Test_has_key.test_7 -*lib2to3.tests.test_fixers.Test_has_key.test_8 -*lib2to3.tests.test_fixers.Test_has_key.test_9 -*lib2to3.tests.test_fixers.Test_idioms.test_eq_expression -*lib2to3.tests.test_fixers.Test_idioms.test_eq_reverse -*lib2to3.tests.test_fixers.Test_idioms.test_eq_simple -*lib2to3.tests.test_fixers.Test_idioms.test_is_expression -*lib2to3.tests.test_fixers.Test_idioms.test_is_not_expression -*lib2to3.tests.test_fixers.Test_idioms.test_is_not_reverse -*lib2to3.tests.test_fixers.Test_idioms.test_is_not_simple -*lib2to3.tests.test_fixers.Test_idioms.test_is_reverse -*lib2to3.tests.test_fixers.Test_idioms.test_is_simple -*lib2to3.tests.test_fixers.Test_idioms.test_ne_expression -*lib2to3.tests.test_fixers.Test_idioms.test_ne_reverse -*lib2to3.tests.test_fixers.Test_idioms.test_ne_simple -*lib2to3.tests.test_fixers.Test_idioms.test_sort_list_call -*lib2to3.tests.test_fixers.Test_idioms.test_sort_simple_expr -*lib2to3.tests.test_fixers.Test_idioms.test_sort_unchanged -*lib2to3.tests.test_fixers.Test_idioms.test_type_unchanged -*lib2to3.tests.test_fixers.Test_idioms.test_while -*lib2to3.tests.test_fixers.Test_idioms.test_while_unchanged -*lib2to3.tests.test_fixers.Test_import.test_already_relative_import -*lib2to3.tests.test_fixers.Test_import.test_comments_and_indent -*lib2to3.tests.test_fixers.Test_import.test_dotted_from -*lib2to3.tests.test_fixers.Test_import.test_dotted_import -*lib2to3.tests.test_fixers.Test_import.test_dotted_import_as -*lib2to3.tests.test_fixers.Test_import.test_files_checked -*lib2to3.tests.test_fixers.Test_import.test_from -*lib2to3.tests.test_fixers.Test_import.test_from_as -*lib2to3.tests.test_fixers.Test_import.test_import -*lib2to3.tests.test_fixers.Test_import.test_import_as -*lib2to3.tests.test_fixers.Test_import.test_import_from_package -*lib2to3.tests.test_fixers.Test_import.test_in_package -*lib2to3.tests.test_fixers.Test_import.test_local_and_absolute -*lib2to3.tests.test_fixers.Test_import.test_not_in_package -*lib2to3.tests.test_fixers.Test_import.test_prefix -*lib2to3.tests.test_fixers.Test_import.test_with_absolute_import_enabled -*lib2to3.tests.test_fixers.Test_imports.test_import_from -*lib2to3.tests.test_fixers.Test_imports.test_import_from_as -*lib2to3.tests.test_fixers.Test_imports.test_import_module -*lib2to3.tests.test_fixers.Test_imports.test_import_module_as -*lib2to3.tests.test_fixers.Test_imports.test_import_module_usage -*lib2to3.tests.test_fixers.Test_imports.test_multiple_imports -*lib2to3.tests.test_fixers.Test_imports.test_multiple_imports_as -*lib2to3.tests.test_fixers.Test_imports.test_star -*lib2to3.tests.test_fixers.Test_imports2.test_import_from -*lib2to3.tests.test_fixers.Test_imports2.test_import_from_as -*lib2to3.tests.test_fixers.Test_imports2.test_import_module -*lib2to3.tests.test_fixers.Test_imports2.test_import_module_as -*lib2to3.tests.test_fixers.Test_imports2.test_import_module_usage -*lib2to3.tests.test_fixers.Test_imports2.test_star -*lib2to3.tests.test_fixers.Test_imports_fixer_order.test_after_local_imports_refactoring -*lib2to3.tests.test_fixers.Test_imports_fixer_order.test_import_from -*lib2to3.tests.test_fixers.Test_imports_fixer_order.test_import_from_as -*lib2to3.tests.test_fixers.Test_imports_fixer_order.test_import_module -*lib2to3.tests.test_fixers.Test_imports_fixer_order.test_import_module_as -*lib2to3.tests.test_fixers.Test_imports_fixer_order.test_import_module_usage -*lib2to3.tests.test_fixers.Test_imports_fixer_order.test_star -*lib2to3.tests.test_fixers.Test_input.test_1 -*lib2to3.tests.test_fixers.Test_input.test_2 -*lib2to3.tests.test_fixers.Test_input.test_3 -*lib2to3.tests.test_fixers.Test_input.test_4 -*lib2to3.tests.test_fixers.Test_input.test_idempotency -*lib2to3.tests.test_fixers.Test_input.test_prefix_preservation -*lib2to3.tests.test_fixers.Test_input.test_trailing_comment -*lib2to3.tests.test_fixers.Test_intern.test -*lib2to3.tests.test_fixers.Test_intern.test_prefix_preservation -*lib2to3.tests.test_fixers.Test_intern.test_unchanged -*lib2to3.tests.test_fixers.Test_isinstance.test_prefix_preservation -*lib2to3.tests.test_fixers.Test_isinstance.test_remove_multiple_items -*lib2to3.tests.test_fixers.Test_isinstance.test_unchanged -*lib2to3.tests.test_fixers.Test_itertools.test_0 -*lib2to3.tests.test_fixers.Test_itertools.test_1 -*lib2to3.tests.test_fixers.Test_itertools.test_2 -*lib2to3.tests.test_fixers.Test_itertools.test_qualified -*lib2to3.tests.test_fixers.Test_itertools.test_run_order -*lib2to3.tests.test_fixers.Test_itertools.test_space_1 -*lib2to3.tests.test_fixers.Test_itertools.test_space_2 -*lib2to3.tests.test_fixers.Test_itertools_imports.test_comments -*lib2to3.tests.test_fixers.Test_itertools_imports.test_ifilter_and_zip_longest -*lib2to3.tests.test_fixers.Test_itertools_imports.test_import_as -*lib2to3.tests.test_fixers.Test_itertools_imports.test_import_star -*lib2to3.tests.test_fixers.Test_itertools_imports.test_none -*lib2to3.tests.test_fixers.Test_itertools_imports.test_reduced -*lib2to3.tests.test_fixers.Test_itertools_imports.test_unchanged -*lib2to3.tests.test_fixers.Test_long.test_1 -*lib2to3.tests.test_fixers.Test_long.test_2 -*lib2to3.tests.test_fixers.Test_long.test_3 -*lib2to3.tests.test_fixers.Test_long.test_prefix_preservation -*lib2to3.tests.test_fixers.Test_long.test_unchanged -*lib2to3.tests.test_fixers.Test_map.test_None_with_multiple_arguments -*lib2to3.tests.test_fixers.Test_map.test_future_builtins -*lib2to3.tests.test_fixers.Test_map.test_map_basic -*lib2to3.tests.test_fixers.Test_map.test_map_nochange -*lib2to3.tests.test_fixers.Test_map.test_map_trailers -*lib2to3.tests.test_fixers.Test_map.test_prefix_preservation -*lib2to3.tests.test_fixers.Test_map.test_trailing_comment -*lib2to3.tests.test_fixers.Test_metaclass.test_comments -*lib2to3.tests.test_fixers.Test_metaclass.test_meta -*lib2to3.tests.test_fixers.Test_metaclass.test_unchanged -*lib2to3.tests.test_fixers.Test_methodattrs.test -*lib2to3.tests.test_fixers.Test_methodattrs.test_unchanged -*lib2to3.tests.test_fixers.Test_ne.test_basic -*lib2to3.tests.test_fixers.Test_ne.test_chained -*lib2to3.tests.test_fixers.Test_ne.test_no_spaces -*lib2to3.tests.test_fixers.Test_next.test_1 -*lib2to3.tests.test_fixers.Test_next.test_2 -*lib2to3.tests.test_fixers.Test_next.test_3 -*lib2to3.tests.test_fixers.Test_next.test_4 -*lib2to3.tests.test_fixers.Test_next.test_5 -*lib2to3.tests.test_fixers.Test_next.test_6 -*lib2to3.tests.test_fixers.Test_next.test_assign_to_next -*lib2to3.tests.test_fixers.Test_next.test_assign_to_next_in_list -*lib2to3.tests.test_fixers.Test_next.test_assign_to_next_in_tuple -*lib2to3.tests.test_fixers.Test_next.test_builtin_assign -*lib2to3.tests.test_fixers.Test_next.test_builtin_assign_in_list -*lib2to3.tests.test_fixers.Test_next.test_builtin_assign_in_tuple -*lib2to3.tests.test_fixers.Test_next.test_method_1 -*lib2to3.tests.test_fixers.Test_next.test_method_2 -*lib2to3.tests.test_fixers.Test_next.test_method_3 -*lib2to3.tests.test_fixers.Test_next.test_method_4 -*lib2to3.tests.test_fixers.Test_next.test_method_unchanged -*lib2to3.tests.test_fixers.Test_next.test_noncall_access_1 -*lib2to3.tests.test_fixers.Test_next.test_noncall_access_2 -*lib2to3.tests.test_fixers.Test_next.test_noncall_access_3 -*lib2to3.tests.test_fixers.Test_next.test_prefix_preservation_1 -*lib2to3.tests.test_fixers.Test_next.test_prefix_preservation_2 -*lib2to3.tests.test_fixers.Test_next.test_prefix_preservation_3 -*lib2to3.tests.test_fixers.Test_next.test_prefix_preservation_4 -*lib2to3.tests.test_fixers.Test_next.test_prefix_preservation_5 -*lib2to3.tests.test_fixers.Test_next.test_prefix_preservation_6 -*lib2to3.tests.test_fixers.Test_next.test_shadowing_assign_list_1 -*lib2to3.tests.test_fixers.Test_next.test_shadowing_assign_list_2 -*lib2to3.tests.test_fixers.Test_next.test_shadowing_assign_simple -*lib2to3.tests.test_fixers.Test_next.test_shadowing_assign_tuple_1 -*lib2to3.tests.test_fixers.Test_next.test_shadowing_assign_tuple_2 -*lib2to3.tests.test_fixers.Test_next.test_shadowing_for_simple -*lib2to3.tests.test_fixers.Test_next.test_shadowing_for_tuple_1 -*lib2to3.tests.test_fixers.Test_next.test_shadowing_for_tuple_2 -*lib2to3.tests.test_fixers.Test_next.test_shadowing_funcdef_1 -*lib2to3.tests.test_fixers.Test_next.test_shadowing_funcdef_2 -*lib2to3.tests.test_fixers.Test_next.test_shadowing_global_1 -*lib2to3.tests.test_fixers.Test_next.test_shadowing_global_2 -*lib2to3.tests.test_fixers.Test_next.test_shadowing_import_1 -*lib2to3.tests.test_fixers.Test_next.test_shadowing_import_2 -*lib2to3.tests.test_fixers.Test_next.test_shadowing_import_3 -*lib2to3.tests.test_fixers.Test_next.test_shadowing_import_from_1 -*lib2to3.tests.test_fixers.Test_next.test_shadowing_import_from_2 -*lib2to3.tests.test_fixers.Test_next.test_shadowing_import_from_3 -*lib2to3.tests.test_fixers.Test_next.test_shadowing_import_from_4 -*lib2to3.tests.test_fixers.Test_nonzero.test_1 -*lib2to3.tests.test_fixers.Test_nonzero.test_2 -*lib2to3.tests.test_fixers.Test_nonzero.test_unchanged_1 -*lib2to3.tests.test_fixers.Test_nonzero.test_unchanged_2 -*lib2to3.tests.test_fixers.Test_nonzero.test_unchanged_func -*lib2to3.tests.test_fixers.Test_numliterals.test_comments_and_spacing -*lib2to3.tests.test_fixers.Test_numliterals.test_long_hex -*lib2to3.tests.test_fixers.Test_numliterals.test_long_int_1 -*lib2to3.tests.test_fixers.Test_numliterals.test_long_int_2 -*lib2to3.tests.test_fixers.Test_numliterals.test_octal_1 -*lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_complex_bare -*lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_complex_float -*lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_complex_int -*lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_exp -*lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_float -*lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_hex -*lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_int -*lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_octal -*lib2to3.tests.test_fixers.Test_operator.test_bare_isCallable -*lib2to3.tests.test_fixers.Test_operator.test_bare_operator_irepeat -*lib2to3.tests.test_fixers.Test_operator.test_bare_operator_isMappingType -*lib2to3.tests.test_fixers.Test_operator.test_bare_operator_isNumberType -*lib2to3.tests.test_fixers.Test_operator.test_bare_operator_isSequenceType -*lib2to3.tests.test_fixers.Test_operator.test_bare_operator_repeat -*lib2to3.tests.test_fixers.Test_operator.test_bare_sequenceIncludes -*lib2to3.tests.test_fixers.Test_operator.test_operator_irepeat -*lib2to3.tests.test_fixers.Test_operator.test_operator_isCallable -*lib2to3.tests.test_fixers.Test_operator.test_operator_isMappingType -*lib2to3.tests.test_fixers.Test_operator.test_operator_isNumberType -*lib2to3.tests.test_fixers.Test_operator.test_operator_isSequenceType -*lib2to3.tests.test_fixers.Test_operator.test_operator_repeat -*lib2to3.tests.test_fixers.Test_operator.test_operator_sequenceIncludes -*lib2to3.tests.test_fixers.Test_paren.test_0 -*lib2to3.tests.test_fixers.Test_paren.test_1 -*lib2to3.tests.test_fixers.Test_paren.test_2 -*lib2to3.tests.test_fixers.Test_paren.test_3 -*lib2to3.tests.test_fixers.Test_paren.test_4 -*lib2to3.tests.test_fixers.Test_paren.test_5 -*lib2to3.tests.test_fixers.Test_paren.test_6 -*lib2to3.tests.test_fixers.Test_paren.test_unchanged_0 -*lib2to3.tests.test_fixers.Test_paren.test_unchanged_1 -*lib2to3.tests.test_fixers.Test_paren.test_unchanged_2 -*lib2to3.tests.test_fixers.Test_paren.test_unchanged_3 -*lib2to3.tests.test_fixers.Test_paren.test_unchanged_4 -*lib2to3.tests.test_fixers.Test_print.test_1 -*lib2to3.tests.test_fixers.Test_print.test_2 -*lib2to3.tests.test_fixers.Test_print.test_3 -*lib2to3.tests.test_fixers.Test_print.test_4 -*lib2to3.tests.test_fixers.Test_print.test_5 -*lib2to3.tests.test_fixers.Test_print.test_idempotency -*lib2to3.tests.test_fixers.Test_print.test_idempotency_print_as_function -*lib2to3.tests.test_fixers.Test_print.test_no_trailing_comma -*lib2to3.tests.test_fixers.Test_print.test_prefix_preservation -*lib2to3.tests.test_fixers.Test_print.test_spaces_before_file -*lib2to3.tests.test_fixers.Test_print.test_trailing_comma_1 -*lib2to3.tests.test_fixers.Test_print.test_trailing_comma_2 -*lib2to3.tests.test_fixers.Test_print.test_trailing_comma_3 -*lib2to3.tests.test_fixers.Test_print.test_tuple -*lib2to3.tests.test_fixers.Test_print.test_vargs_without_trailing_comma -*lib2to3.tests.test_fixers.Test_print.test_with_future_print_function -*lib2to3.tests.test_fixers.Test_print.test_with_trailing_comma -*lib2to3.tests.test_fixers.Test_raise.test_None_value -*lib2to3.tests.test_fixers.Test_raise.test_basic -*lib2to3.tests.test_fixers.Test_raise.test_prefix_preservation -*lib2to3.tests.test_fixers.Test_raise.test_string_exc -*lib2to3.tests.test_fixers.Test_raise.test_string_exc_val -*lib2to3.tests.test_fixers.Test_raise.test_string_exc_val_tb -*lib2to3.tests.test_fixers.Test_raise.test_tb_1 -*lib2to3.tests.test_fixers.Test_raise.test_tb_2 -*lib2to3.tests.test_fixers.Test_raise.test_tb_3 -*lib2to3.tests.test_fixers.Test_raise.test_tb_4 -*lib2to3.tests.test_fixers.Test_raise.test_tb_5 -*lib2to3.tests.test_fixers.Test_raise.test_tb_6 -*lib2to3.tests.test_fixers.Test_raise.test_tuple_detection -*lib2to3.tests.test_fixers.Test_raise.test_tuple_exc_1 -*lib2to3.tests.test_fixers.Test_raise.test_tuple_exc_2 -*lib2to3.tests.test_fixers.Test_raise.test_tuple_value -*lib2to3.tests.test_fixers.Test_raise.test_with_comments -*lib2to3.tests.test_fixers.Test_raw_input.test_1 -*lib2to3.tests.test_fixers.Test_raw_input.test_2 -*lib2to3.tests.test_fixers.Test_raw_input.test_3 -*lib2to3.tests.test_fixers.Test_raw_input.test_4 -*lib2to3.tests.test_fixers.Test_raw_input.test_5 -*lib2to3.tests.test_fixers.Test_raw_input.test_6 -*lib2to3.tests.test_fixers.Test_raw_input.test_8 -*lib2to3.tests.test_fixers.Test_raw_input.test_prefix_preservation -*lib2to3.tests.test_fixers.Test_reduce.test_bug_7253 -*lib2to3.tests.test_fixers.Test_reduce.test_call_with_lambda -*lib2to3.tests.test_fixers.Test_reduce.test_simple_call -*lib2to3.tests.test_fixers.Test_reduce.test_unchanged -*lib2to3.tests.test_fixers.Test_reload.test -*lib2to3.tests.test_fixers.Test_reload.test_comment -*lib2to3.tests.test_fixers.Test_reload.test_space -*lib2to3.tests.test_fixers.Test_reload.test_unchanged -*lib2to3.tests.test_fixers.Test_renames.test_import_from -*lib2to3.tests.test_fixers.Test_renames.test_import_from_as -*lib2to3.tests.test_fixers.Test_renames.test_import_module_usage -*lib2to3.tests.test_fixers.Test_repr.test_complex -*lib2to3.tests.test_fixers.Test_repr.test_nested -*lib2to3.tests.test_fixers.Test_repr.test_nested_tuples -*lib2to3.tests.test_fixers.Test_repr.test_prefix_preservation -*lib2to3.tests.test_fixers.Test_repr.test_simple_1 -*lib2to3.tests.test_fixers.Test_repr.test_simple_2 -*lib2to3.tests.test_fixers.Test_repr.test_tuple -*lib2to3.tests.test_fixers.Test_set_literal.test_basic -*lib2to3.tests.test_fixers.Test_set_literal.test_comments -*lib2to3.tests.test_fixers.Test_set_literal.test_listcomps -*lib2to3.tests.test_fixers.Test_set_literal.test_unchanged -*lib2to3.tests.test_fixers.Test_set_literal.test_whitespace -*lib2to3.tests.test_fixers.Test_standarderror.test -*lib2to3.tests.test_fixers.Test_sys_exc.test_0 -*lib2to3.tests.test_fixers.Test_sys_exc.test_1 -*lib2to3.tests.test_fixers.Test_sys_exc.test_2 -*lib2to3.tests.test_fixers.Test_sys_exc.test_3 -*lib2to3.tests.test_fixers.Test_sys_exc.test_4 -*lib2to3.tests.test_fixers.Test_sys_exc.test_5 -*lib2to3.tests.test_fixers.Test_throw.test_1 -*lib2to3.tests.test_fixers.Test_throw.test_2 -*lib2to3.tests.test_fixers.Test_throw.test_3 -*lib2to3.tests.test_fixers.Test_throw.test_4 -*lib2to3.tests.test_fixers.Test_throw.test_tb_1 -*lib2to3.tests.test_fixers.Test_throw.test_tb_2 -*lib2to3.tests.test_fixers.Test_throw.test_tb_3 -*lib2to3.tests.test_fixers.Test_throw.test_tb_4 -*lib2to3.tests.test_fixers.Test_throw.test_tb_5 -*lib2to3.tests.test_fixers.Test_throw.test_tb_6 -*lib2to3.tests.test_fixers.Test_throw.test_tb_7 -*lib2to3.tests.test_fixers.Test_throw.test_tb_8 -*lib2to3.tests.test_fixers.Test_throw.test_untouched_1 -*lib2to3.tests.test_fixers.Test_throw.test_untouched_2 -*lib2to3.tests.test_fixers.Test_throw.test_untouched_3 -*lib2to3.tests.test_fixers.Test_throw.test_warn_1 -*lib2to3.tests.test_fixers.Test_throw.test_warn_2 -*lib2to3.tests.test_fixers.Test_throw.test_warn_3 -*lib2to3.tests.test_fixers.Test_tuple_params.test_1 -*lib2to3.tests.test_fixers.Test_tuple_params.test_2 -*lib2to3.tests.test_fixers.Test_tuple_params.test_3 -*lib2to3.tests.test_fixers.Test_tuple_params.test_docstring -*lib2to3.tests.test_fixers.Test_tuple_params.test_keywords -*lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_nested -*lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_nested_multi_use -*lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_no_change -*lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_one_tuple -*lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_parens_single_arg -*lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_simple -*lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_simple_multi_use -*lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_simple_reverse -*lib2to3.tests.test_fixers.Test_tuple_params.test_multi_1 -*lib2to3.tests.test_fixers.Test_tuple_params.test_multi_2 -*lib2to3.tests.test_fixers.Test_tuple_params.test_semicolon -*lib2to3.tests.test_fixers.Test_tuple_params.test_unchanged_1 -*lib2to3.tests.test_fixers.Test_tuple_params.test_unchanged_2 -*lib2to3.tests.test_fixers.Test_tuple_params.test_unchanged_3 -*lib2to3.tests.test_fixers.Test_tuple_params.test_varargs -*lib2to3.tests.test_fixers.Test_types.test_basic_types_convert -*lib2to3.tests.test_fixers.Test_unicode.test_bytes_literal_escape_u -*lib2to3.tests.test_fixers.Test_unicode.test_native_literal_escape_u -*lib2to3.tests.test_fixers.Test_unicode.test_native_unicode_literal_escape_u -*lib2to3.tests.test_fixers.Test_unicode.test_unichr -*lib2to3.tests.test_fixers.Test_unicode.test_unicode_call -*lib2to3.tests.test_fixers.Test_unicode.test_unicode_literal_1 -*lib2to3.tests.test_fixers.Test_unicode.test_unicode_literal_2 -*lib2to3.tests.test_fixers.Test_unicode.test_unicode_literal_3 -*lib2to3.tests.test_fixers.Test_unicode.test_unicode_literal_escape_u -*lib2to3.tests.test_fixers.Test_unicode.test_whitespace -*lib2to3.tests.test_fixers.Test_urllib.test_import_from -*lib2to3.tests.test_fixers.Test_urllib.test_import_from_as -*lib2to3.tests.test_fixers.Test_urllib.test_import_module -*lib2to3.tests.test_fixers.Test_urllib.test_import_module_as -*lib2to3.tests.test_fixers.Test_urllib.test_import_module_usage -*lib2to3.tests.test_fixers.Test_urllib.test_indented -*lib2to3.tests.test_fixers.Test_urllib.test_single_import -*lib2to3.tests.test_fixers.Test_urllib.test_star -*lib2to3.tests.test_fixers.Test_xrange.test_in_consuming_context -*lib2to3.tests.test_fixers.Test_xrange.test_in_contains_test -*lib2to3.tests.test_fixers.Test_xrange.test_prefix_preservation -*lib2to3.tests.test_fixers.Test_xrange.test_range_in_for -*lib2to3.tests.test_fixers.Test_xrange.test_single_arg -*lib2to3.tests.test_fixers.Test_xrange.test_three_args -*lib2to3.tests.test_fixers.Test_xrange.test_two_args -*lib2to3.tests.test_fixers.Test_xrange.test_wrap_in_list -*lib2to3.tests.test_fixers.Test_xrange.test_xrange_in_for -*lib2to3.tests.test_fixers.Test_xrange_with_reduce.test_double_transform -*lib2to3.tests.test_fixers.Test_xreadlines.test_attr_ref -*lib2to3.tests.test_fixers.Test_xreadlines.test_call -*lib2to3.tests.test_fixers.Test_xreadlines.test_unchanged -*lib2to3.tests.test_fixers.Test_zip.test_future_builtins -*lib2to3.tests.test_fixers.Test_zip.test_zip_basic -*lib2to3.tests.test_fixers.Test_zip.test_zip_nochange -*lib2to3.tests.test_fixers.Test_zip.test_zip_trailers -*lib2to3.tests.test_main.TestMain.test_filename_changing_on_output_single_dir -*lib2to3.tests.test_main.TestMain.test_filename_changing_on_output_single_file -*lib2to3.tests.test_main.TestMain.test_filename_changing_on_output_two_files -*lib2to3.tests.test_parser.TestAsyncAwait.test_async_for -*lib2to3.tests.test_parser.TestAsyncAwait.test_async_generator -*lib2to3.tests.test_parser.TestAsyncAwait.test_async_var -*lib2to3.tests.test_parser.TestAsyncAwait.test_async_with -*lib2to3.tests.test_parser.TestAsyncAwait.test_await_expr -*lib2to3.tests.test_parser.TestClassDef.test_new_syntax -*lib2to3.tests.test_parser.TestDriver.test_formfeed -*lib2to3.tests.test_parser.TestExcept.test_new -*lib2to3.tests.test_parser.TestExcept.test_old -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_1 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_10 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_11 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_12 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_13 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_14 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_15 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_16 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_17 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_18 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_19 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_2 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_20 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_21 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_3 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_4 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_5 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_6 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_7 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_8 -*lib2to3.tests.test_parser.TestFunctionAnnotations.test_9 -*lib2to3.tests.test_parser.TestIdentifier.test_non_ascii_identifiers -*lib2to3.tests.test_parser.TestLiterals.test_multiline_bytes_literals -*lib2to3.tests.test_parser.TestLiterals.test_multiline_bytes_tripquote_literals -*lib2to3.tests.test_parser.TestLiterals.test_multiline_str_literals -*lib2to3.tests.test_parser.TestMatrixMultiplication.test_matrix_multiplication_operator -*lib2to3.tests.test_parser.TestNamedAssignments.test_named_assignment_generator -*lib2to3.tests.test_parser.TestNamedAssignments.test_named_assignment_if -*lib2to3.tests.test_parser.TestNamedAssignments.test_named_assignment_listcomp -*lib2to3.tests.test_parser.TestNamedAssignments.test_named_assignment_while -*lib2to3.tests.test_parser.TestNumericLiterals.test_new_binary_notation -*lib2to3.tests.test_parser.TestNumericLiterals.test_new_octal_notation -*lib2to3.tests.test_parser.TestParserIdempotency.test_all_project_files -*lib2to3.tests.test_parser.TestParserIdempotency.test_extended_unpacking -*lib2to3.tests.test_parser.TestPgen2Caching.test_load_grammar_from_pickle -*lib2to3.tests.test_parser.TestPgen2Caching.test_load_grammar_from_txt_file -*lib2to3.tests.test_parser.TestPgen2Caching.test_load_packaged_grammar -*lib2to3.tests.test_parser.TestPickleableException.test_ParseError -*lib2to3.tests.test_parser.TestPositionalOnlyArgs.test_all_markers -*lib2to3.tests.test_parser.TestPositionalOnlyArgs.test_all_with_args_and_kwargs -*lib2to3.tests.test_parser.TestPositionalOnlyArgs.test_lambda_soup -*lib2to3.tests.test_parser.TestPositionalOnlyArgs.test_one_pos_only_arg -*lib2to3.tests.test_parser.TestPositionalOnlyArgs.test_only_positional_or_keyword -*lib2to3.tests.test_parser.TestRaiseChanges.test_2x_style_1 -*lib2to3.tests.test_parser.TestRaiseChanges.test_2x_style_2 -*lib2to3.tests.test_parser.TestRaiseChanges.test_2x_style_3 -*lib2to3.tests.test_parser.TestRaiseChanges.test_2x_style_invalid_1 -*lib2to3.tests.test_parser.TestRaiseChanges.test_3x_style -*lib2to3.tests.test_parser.TestRaiseChanges.test_3x_style_invalid_1 -*lib2to3.tests.test_parser.TestRaiseChanges.test_3x_style_invalid_2 -*lib2to3.tests.test_parser.TestRaiseChanges.test_3x_style_invalid_3 -*lib2to3.tests.test_parser.TestRaiseChanges.test_3x_style_invalid_4 -*lib2to3.tests.test_parser.TestSetLiteral.test_1 -*lib2to3.tests.test_parser.TestSetLiteral.test_2 -*lib2to3.tests.test_parser.TestSetLiteral.test_3 -*lib2to3.tests.test_parser.TestSetLiteral.test_4 -*lib2to3.tests.test_parser.TestStringLiterals.test_lit -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_argument_unpacking_1 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_argument_unpacking_2 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_argument_unpacking_3 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_complex_double_star_expression -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_complex_star_expression -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_dict_display_1 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_dict_display_2 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_double_star_dict_literal -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_double_star_dict_literal_after_keywords -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_double_star_expression -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_list_display -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_mid_positional_star -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_set_display -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_star_expression -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_1 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_2 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_3 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_4 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_5 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_6 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_7 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_8 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_9 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_1 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_2 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_3 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_4 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_5 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_6 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_7 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_8 -*lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_9 -*lib2to3.tests.test_parser.TestVarAnnotations.test_1 -*lib2to3.tests.test_parser.TestVarAnnotations.test_2 -*lib2to3.tests.test_parser.TestVarAnnotations.test_3 -*lib2to3.tests.test_parser.TestVarAnnotations.test_4 -*lib2to3.tests.test_parser.TestVarAnnotations.test_5 -*lib2to3.tests.test_parser.TestVarAnnotations.test_6 -*lib2to3.tests.test_parser.TestYieldFrom.test_yield_from -*lib2to3.tests.test_pytree.TestNodes.test_changed -*lib2to3.tests.test_pytree.TestNodes.test_depth -*lib2to3.tests.test_pytree.TestNodes.test_get_suffix -*lib2to3.tests.test_pytree.TestNodes.test_instantiate_base -*lib2to3.tests.test_pytree.TestNodes.test_leaf -*lib2to3.tests.test_pytree.TestNodes.test_leaf_constructor_prefix -*lib2to3.tests.test_pytree.TestNodes.test_leaf_equality -*lib2to3.tests.test_pytree.TestNodes.test_leaf_next_sibling -*lib2to3.tests.test_pytree.TestNodes.test_leaf_prefix -*lib2to3.tests.test_pytree.TestNodes.test_leaf_prev_sibling -*lib2to3.tests.test_pytree.TestNodes.test_leaf_repr -*lib2to3.tests.test_pytree.TestNodes.test_leaf_str -*lib2to3.tests.test_pytree.TestNodes.test_leaf_str_numeric_value -*lib2to3.tests.test_pytree.TestNodes.test_leaves -*lib2to3.tests.test_pytree.TestNodes.test_node -*lib2to3.tests.test_pytree.TestNodes.test_node_append_child -*lib2to3.tests.test_pytree.TestNodes.test_node_constructor_prefix -*lib2to3.tests.test_pytree.TestNodes.test_node_equality -*lib2to3.tests.test_pytree.TestNodes.test_node_insert_child -*lib2to3.tests.test_pytree.TestNodes.test_node_next_sibling -*lib2to3.tests.test_pytree.TestNodes.test_node_prefix -*lib2to3.tests.test_pytree.TestNodes.test_node_prev_sibling -*lib2to3.tests.test_pytree.TestNodes.test_node_recursive_equality -*lib2to3.tests.test_pytree.TestNodes.test_node_repr -*lib2to3.tests.test_pytree.TestNodes.test_node_set_child -*lib2to3.tests.test_pytree.TestNodes.test_node_str -*lib2to3.tests.test_pytree.TestNodes.test_post_order -*lib2to3.tests.test_pytree.TestNodes.test_pre_order -*lib2to3.tests.test_pytree.TestNodes.test_remove -*lib2to3.tests.test_pytree.TestNodes.test_remove_parentless -*lib2to3.tests.test_pytree.TestNodes.test_replace -*lib2to3.tests.test_pytree.TestNodes.test_replace_with_list -*lib2to3.tests.test_pytree.TestPatterns.test_basic_patterns -*lib2to3.tests.test_pytree.TestPatterns.test_generate_matches -*lib2to3.tests.test_pytree.TestPatterns.test_has_key_example -*lib2to3.tests.test_pytree.TestPatterns.test_wildcard -*lib2to3.tests.test_refactor.TestRefactoringTool.test_bom -*lib2to3.tests.test_refactor.TestRefactoringTool.test_detect_future_features -*lib2to3.tests.test_refactor.TestRefactoringTool.test_fixer_loading_helpers -*lib2to3.tests.test_refactor.TestRefactoringTool.test_naughty_fixers -*lib2to3.tests.test_util.Test_Attr.test_returns +lib2to3.tests.test_all_fixers.Test_all.test_all_project_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_complex_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_complex_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_complex_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_dotted_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_extreme @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_space_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_space_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_6b @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_7 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_9 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_apply.test_weird_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_asserts.test_deprecated_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_asserts.test_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_asserts.test_variants @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_basestring.test_basestring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_buffer.test_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_buffer.test_slicing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_01 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_02 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_03 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_04 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_05 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_06 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_07 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_08 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_09 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_11 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_12 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_13 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_14 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_15 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_16 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_17 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_18 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_19 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_20 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_21 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_22 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_23 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_24 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_25 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_26 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_27 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_28 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_29 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_30 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_31 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_32 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_prefix_preservation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_trailing_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_dict.test_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_except.test_bare_except @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_except.test_bare_except_and_else_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_except.test_list_unpack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_except.test_multi_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_except.test_multi_fixed_excepts_before_bare_except @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_except.test_one_line_suites @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_except.test_prefix_preservation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_except.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_except.test_simple_no_space_before_target @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_except.test_tuple_unpack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_except.test_unchanged_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_except.test_unchanged_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_except.test_unchanged_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_except.test_weird_target_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_except.test_weird_target_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_except.test_weird_target_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_exec.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_exec.test_complex_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_exec.test_complex_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_exec.test_prefix_preservation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_exec.test_unchanged_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_exec.test_unchanged_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_exec.test_unchanged_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_exec.test_unchanged_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_exec.test_with_globals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_exec.test_with_globals_locals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_execfile.test_conversion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_execfile.test_spacing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_exitfunc.test_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_exitfunc.test_complex_expression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_exitfunc.test_in_a_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_exitfunc.test_names_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_exitfunc.test_no_sys_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_exitfunc.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_exitfunc.test_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_filter.test_filter_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_filter.test_filter_nochange @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_filter.test_filter_trailers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_filter.test_future_builtins @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_filter.test_prefix_preservation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_funcattrs.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_funcattrs.test_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_future.test_future @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_future.test_run_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_getcwdu.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_getcwdu.test_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_getcwdu.test_indentation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_getcwdu.test_multilation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_getcwdu.test_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_has_key.test_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_has_key.test_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_has_key.test_11 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_has_key.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_has_key.test_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_has_key.test_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_has_key.test_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_has_key.test_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_has_key.test_7 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_has_key.test_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_has_key.test_9 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_idioms.test_eq_expression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_idioms.test_eq_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_idioms.test_eq_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_idioms.test_is_expression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_idioms.test_is_not_expression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_idioms.test_is_not_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_idioms.test_is_not_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_idioms.test_is_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_idioms.test_is_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_idioms.test_ne_expression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_idioms.test_ne_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_idioms.test_ne_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_idioms.test_sort_list_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_idioms.test_sort_simple_expr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_idioms.test_sort_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_idioms.test_type_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_idioms.test_while @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_idioms.test_while_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_import.test_already_relative_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_import.test_comments_and_indent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_import.test_dotted_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_import.test_dotted_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_import.test_dotted_import_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_import.test_files_checked @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_import.test_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_import.test_from_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_import.test_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_import.test_import_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_import.test_import_from_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_import.test_in_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_import.test_local_and_absolute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_import.test_not_in_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_import.test_prefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_import.test_with_absolute_import_enabled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports.test_import_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports.test_import_from_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports.test_import_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports.test_import_module_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports.test_import_module_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports.test_multiple_imports @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports.test_multiple_imports_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports.test_star @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports2.test_import_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports2.test_import_from_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports2.test_import_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports2.test_import_module_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports2.test_import_module_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports2.test_star @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports_fixer_order.test_after_local_imports_refactoring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports_fixer_order.test_import_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports_fixer_order.test_import_from_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports_fixer_order.test_import_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports_fixer_order.test_import_module_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports_fixer_order.test_import_module_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_imports_fixer_order.test_star @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_input.test_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_input.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_input.test_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_input.test_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_input.test_idempotency @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_input.test_prefix_preservation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_input.test_trailing_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_intern.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_intern.test_prefix_preservation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_intern.test_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_isinstance.test_prefix_preservation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_isinstance.test_remove_multiple_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_isinstance.test_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_itertools.test_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_itertools.test_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_itertools.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_itertools.test_qualified @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_itertools.test_run_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_itertools.test_space_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_itertools.test_space_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_itertools_imports.test_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_itertools_imports.test_ifilter_and_zip_longest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_itertools_imports.test_import_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_itertools_imports.test_import_star @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_itertools_imports.test_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_itertools_imports.test_reduced @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_itertools_imports.test_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_long.test_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_long.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_long.test_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_long.test_prefix_preservation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_long.test_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_map.test_None_with_multiple_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_map.test_future_builtins @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_map.test_map_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_map.test_map_nochange @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_map.test_map_trailers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_map.test_prefix_preservation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_map.test_trailing_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_metaclass.test_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_metaclass.test_meta @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_metaclass.test_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_methodattrs.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_methodattrs.test_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_ne.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_ne.test_chained @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_ne.test_no_spaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_assign_to_next @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_assign_to_next_in_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_assign_to_next_in_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_builtin_assign @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_builtin_assign_in_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_builtin_assign_in_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_method_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_method_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_method_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_method_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_method_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_noncall_access_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_noncall_access_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_noncall_access_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_prefix_preservation_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_prefix_preservation_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_prefix_preservation_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_prefix_preservation_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_prefix_preservation_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_prefix_preservation_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_assign_list_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_assign_list_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_assign_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_assign_tuple_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_assign_tuple_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_for_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_for_tuple_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_for_tuple_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_funcdef_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_funcdef_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_global_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_global_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_import_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_import_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_import_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_import_from_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_import_from_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_import_from_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_import_from_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_nonzero.test_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_nonzero.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_nonzero.test_unchanged_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_nonzero.test_unchanged_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_nonzero.test_unchanged_func @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_numliterals.test_comments_and_spacing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_numliterals.test_long_hex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_numliterals.test_long_int_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_numliterals.test_long_int_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_numliterals.test_octal_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_complex_bare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_complex_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_complex_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_exp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_hex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_octal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_operator.test_bare_isCallable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_operator.test_bare_operator_irepeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_operator.test_bare_operator_isMappingType @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_operator.test_bare_operator_isNumberType @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_operator.test_bare_operator_isSequenceType @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_operator.test_bare_operator_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_operator.test_bare_sequenceIncludes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_operator.test_operator_irepeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_operator.test_operator_isCallable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_operator.test_operator_isMappingType @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_operator.test_operator_isNumberType @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_operator.test_operator_isSequenceType @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_operator.test_operator_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_operator.test_operator_sequenceIncludes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_paren.test_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_paren.test_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_paren.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_paren.test_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_paren.test_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_paren.test_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_paren.test_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_paren.test_unchanged_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_paren.test_unchanged_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_paren.test_unchanged_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_paren.test_unchanged_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_paren.test_unchanged_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_print.test_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_print.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_print.test_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_print.test_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_print.test_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_print.test_idempotency @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_print.test_idempotency_print_as_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_print.test_no_trailing_comma @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_print.test_prefix_preservation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_print.test_spaces_before_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_print.test_trailing_comma_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_print.test_trailing_comma_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_print.test_trailing_comma_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_print.test_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_print.test_vargs_without_trailing_comma @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_print.test_with_future_print_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_print.test_with_trailing_comma @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raise.test_None_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raise.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raise.test_prefix_preservation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raise.test_string_exc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raise.test_string_exc_val @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raise.test_string_exc_val_tb @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raise.test_tb_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raise.test_tb_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raise.test_tb_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raise.test_tb_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raise.test_tb_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raise.test_tb_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raise.test_tuple_detection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raise.test_tuple_exc_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raise.test_tuple_exc_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raise.test_tuple_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raise.test_with_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raw_input.test_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raw_input.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raw_input.test_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raw_input.test_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raw_input.test_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raw_input.test_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raw_input.test_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_raw_input.test_prefix_preservation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_reduce.test_bug_7253 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_reduce.test_call_with_lambda @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_reduce.test_simple_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_reduce.test_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_reload.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_reload.test_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_reload.test_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_reload.test_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_renames.test_import_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_renames.test_import_from_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_renames.test_import_module_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_repr.test_complex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_repr.test_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_repr.test_nested_tuples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_repr.test_prefix_preservation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_repr.test_simple_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_repr.test_simple_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_repr.test_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_set_literal.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_set_literal.test_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_set_literal.test_listcomps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_set_literal.test_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_set_literal.test_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_standarderror.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_sys_exc.test_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_sys_exc.test_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_sys_exc.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_sys_exc.test_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_sys_exc.test_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_sys_exc.test_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_throw.test_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_throw.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_throw.test_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_throw.test_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_throw.test_tb_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_throw.test_tb_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_throw.test_tb_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_throw.test_tb_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_throw.test_tb_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_throw.test_tb_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_throw.test_tb_7 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_throw.test_tb_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_throw.test_untouched_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_throw.test_untouched_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_throw.test_untouched_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_throw.test_warn_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_throw.test_warn_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_throw.test_warn_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_nested_multi_use @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_no_change @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_one_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_parens_single_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_simple_multi_use @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_simple_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_multi_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_multi_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_semicolon @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_unchanged_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_unchanged_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_unchanged_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_tuple_params.test_varargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_types.test_basic_types_convert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_unicode.test_bytes_literal_escape_u @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_unicode.test_native_literal_escape_u @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_unicode.test_native_unicode_literal_escape_u @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_unicode.test_unichr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_unicode.test_unicode_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_unicode.test_unicode_literal_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_unicode.test_unicode_literal_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_unicode.test_unicode_literal_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_unicode.test_unicode_literal_escape_u @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_unicode.test_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_urllib.test_import_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_urllib.test_import_from_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_urllib.test_import_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_urllib.test_import_module_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_urllib.test_import_module_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_urllib.test_indented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_urllib.test_single_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_urllib.test_star @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_xrange.test_in_consuming_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_xrange.test_in_contains_test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_xrange.test_prefix_preservation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_xrange.test_range_in_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_xrange.test_single_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_xrange.test_three_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_xrange.test_two_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_xrange.test_wrap_in_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_xrange.test_xrange_in_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_xrange_with_reduce.test_double_transform @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_xreadlines.test_attr_ref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_xreadlines.test_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_xreadlines.test_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_zip.test_future_builtins @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_zip.test_zip_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_zip.test_zip_nochange @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_fixers.Test_zip.test_zip_trailers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_main.TestMain.test_filename_changing_on_output_single_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_main.TestMain.test_filename_changing_on_output_single_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_main.TestMain.test_filename_changing_on_output_two_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestAsyncAwait.test_async_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestAsyncAwait.test_async_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestAsyncAwait.test_async_var @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestAsyncAwait.test_async_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestAsyncAwait.test_await_expr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestClassDef.test_new_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestDriver.test_formfeed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestExcept.test_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestExcept.test_old @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_11 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_12 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_13 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_14 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_15 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_16 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_17 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_18 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_19 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_20 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_21 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_7 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_9 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestIdentifier.test_non_ascii_identifiers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestLiterals.test_multiline_bytes_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestLiterals.test_multiline_bytes_tripquote_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestLiterals.test_multiline_str_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestMatrixMultiplication.test_matrix_multiplication_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestNamedAssignments.test_named_assignment_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestNamedAssignments.test_named_assignment_if @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestNamedAssignments.test_named_assignment_listcomp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestNamedAssignments.test_named_assignment_while @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestNumericLiterals.test_new_binary_notation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestNumericLiterals.test_new_octal_notation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestParserIdempotency.test_all_project_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestParserIdempotency.test_extended_unpacking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestPgen2Caching.test_load_grammar_from_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Transient hash mismatch +!lib2to3.tests.test_parser.TestPgen2Caching.test_load_grammar_from_subprocess @ darwin-arm64,linux-aarch64,linux-x86_64 +lib2to3.tests.test_parser.TestPgen2Caching.test_load_grammar_from_txt_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestPgen2Caching.test_load_packaged_grammar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestPickleableException.test_ParseError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestPositionalOnlyArgs.test_all_markers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestPositionalOnlyArgs.test_all_with_args_and_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestPositionalOnlyArgs.test_lambda_soup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestPositionalOnlyArgs.test_one_pos_only_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestPositionalOnlyArgs.test_only_positional_or_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestRaiseChanges.test_2x_style_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestRaiseChanges.test_2x_style_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestRaiseChanges.test_2x_style_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestRaiseChanges.test_2x_style_invalid_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestRaiseChanges.test_3x_style @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestRaiseChanges.test_3x_style_invalid_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestRaiseChanges.test_3x_style_invalid_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestRaiseChanges.test_3x_style_invalid_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestRaiseChanges.test_3x_style_invalid_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestSetLiteral.test_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestSetLiteral.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestSetLiteral.test_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestSetLiteral.test_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestStringLiterals.test_lit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_argument_unpacking_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_argument_unpacking_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_argument_unpacking_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_complex_double_star_expression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_complex_star_expression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_dict_display_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_dict_display_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_double_star_dict_literal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_double_star_dict_literal_after_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_double_star_expression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_list_display @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_mid_positional_star @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_set_display @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_star_expression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_7 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_9 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_7 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_9 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestVarAnnotations.test_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestVarAnnotations.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestVarAnnotations.test_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestVarAnnotations.test_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestVarAnnotations.test_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestVarAnnotations.test_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_parser.TestYieldFrom.test_yield_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_changed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_depth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_get_suffix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_instantiate_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_leaf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_leaf_constructor_prefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_leaf_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_leaf_next_sibling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_leaf_prefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_leaf_prev_sibling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_leaf_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_leaf_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_leaf_str_numeric_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_leaves @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_node @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_node_append_child @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_node_constructor_prefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_node_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_node_insert_child @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_node_next_sibling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_node_prefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_node_prev_sibling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_node_recursive_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_node_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_node_set_child @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_node_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_post_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_pre_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_remove_parentless @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestNodes.test_replace_with_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestPatterns.test_basic_patterns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestPatterns.test_generate_matches @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestPatterns.test_has_key_example @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_pytree.TestPatterns.test_wildcard @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_bom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_crlf_newlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_crlf_unchanged @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_detect_future_features @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_exec_function_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_explicit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_false_file_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_file_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_fixer_loading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_fixer_loading_helpers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_get_headnode_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_naughty_fixers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_print_function_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_refactor_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_refactor_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_refactor_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_refactor_file_write_unchanged_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_refactor_stdin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_refactor_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_write_unchanged_files_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_Attr.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_Attr.test_returns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_Call.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_Name.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_does_tree_import.test_in_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_class_def @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_for_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_from_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_from_import_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_from_import_as_with_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_from_import_with_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_function_def @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_if @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_if_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_import_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_import_as_with_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_invalid_assignments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_list_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_simple_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_simple_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_simple_import_with_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_try_except @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_try_except_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_try_except_finally_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_try_except_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_tuple_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_while @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_binding.test_while_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_indentation.test_nothing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_find_indentation.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_is_list.test_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_is_list.test_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_is_tuple.test_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_is_tuple.test_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_touch_import.test_after_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_touch_import.test_after_imports @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_touch_import.test_beginning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_touch_import.test_from_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +lib2to3.tests.test_util.Test_touch_import.test_name_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_linecache.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_linecache.txt index 5544862c2e..4f4dadbe42 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_linecache.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_linecache.txt @@ -1,26 +1,24 @@ -*graalpython.lib-python.3.test.test_linecache.BadUnicode.test_getline -*graalpython.lib-python.3.test.test_linecache.BadUnicode.test_getlines -*graalpython.lib-python.3.test.test_linecache.BadUnicode_NoDeclaration.test_getline -*graalpython.lib-python.3.test.test_linecache.BadUnicode_NoDeclaration.test_getlines -*graalpython.lib-python.3.test.test_linecache.BadUnicode_WithDeclaration.test_getline -*graalpython.lib-python.3.test.test_linecache.BadUnicode_WithDeclaration.test_getlines -*graalpython.lib-python.3.test.test_linecache.EmptyFile.test_getline -*graalpython.lib-python.3.test.test_linecache.EmptyFile.test_getlines -*graalpython.lib-python.3.test.test_linecache.GoodUnicode.test_getline -*graalpython.lib-python.3.test.test_linecache.GoodUnicode.test_getlines -*graalpython.lib-python.3.test.test_linecache.LineCacheInvalidationTests.test_checkcache_for_deleted_file -*graalpython.lib-python.3.test.test_linecache.LineCacheInvalidationTests.test_checkcache_for_modified_file -*graalpython.lib-python.3.test.test_linecache.LineCacheInvalidationTests.test_checkcache_with_no_parameter -*graalpython.lib-python.3.test.test_linecache.LineCacheTests.test_checkcache -*graalpython.lib-python.3.test.test_linecache.LineCacheTests.test_clearcache -*graalpython.lib-python.3.test.test_linecache.LineCacheTests.test_getline -*graalpython.lib-python.3.test.test_linecache.LineCacheTests.test_lazycache_already_cached -*graalpython.lib-python.3.test.test_linecache.LineCacheTests.test_lazycache_bad_filename -*graalpython.lib-python.3.test.test_linecache.LineCacheTests.test_lazycache_check -*graalpython.lib-python.3.test.test_linecache.LineCacheTests.test_lazycache_no_globals -*graalpython.lib-python.3.test.test_linecache.LineCacheTests.test_lazycache_provide_after_failed_lookup -*graalpython.lib-python.3.test.test_linecache.LineCacheTests.test_lazycache_smoke -*graalpython.lib-python.3.test.test_linecache.LineCacheTests.test_memoryerror -*graalpython.lib-python.3.test.test_linecache.LineCacheTests.test_no_ending_newline -*graalpython.lib-python.3.test.test_linecache.SingleEmptyLine.test_getline -*graalpython.lib-python.3.test.test_linecache.SingleEmptyLine.test_getlines +test.test_linecache.BadUnicode_NoDeclaration.test_getline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.BadUnicode_NoDeclaration.test_getlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.BadUnicode_WithDeclaration.test_getline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.BadUnicode_WithDeclaration.test_getlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.EmptyFile.test_getline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.EmptyFile.test_getlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.GoodUnicode.test_getline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.GoodUnicode.test_getlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.LineCacheInvalidationTests.test_checkcache_for_deleted_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.LineCacheInvalidationTests.test_checkcache_for_modified_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.LineCacheInvalidationTests.test_checkcache_with_no_parameter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.LineCacheTests.test_checkcache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.LineCacheTests.test_clearcache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.LineCacheTests.test_getline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.LineCacheTests.test_lazycache_already_cached @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.LineCacheTests.test_lazycache_bad_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.LineCacheTests.test_lazycache_check @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.LineCacheTests.test_lazycache_no_globals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.LineCacheTests.test_lazycache_provide_after_failed_lookup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.LineCacheTests.test_lazycache_smoke @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.LineCacheTests.test_memoryerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.LineCacheTests.test_no_ending_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.SingleEmptyLine.test_getline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_linecache.SingleEmptyLine.test_getlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_list.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_list.txt index 96450a9b3f..76bcfc7655 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_list.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_list.txt @@ -1,57 +1,55 @@ -*graalpython.lib-python.3.test.test_list.ListTest.test_addmul -*graalpython.lib-python.3.test.test_list.ListTest.test_append -*graalpython.lib-python.3.test.test_list.ListTest.test_basic -*graalpython.lib-python.3.test.test_list.ListTest.test_bigrepeat -*graalpython.lib-python.3.test.test_list.ListTest.test_clear -*graalpython.lib-python.3.test.test_list.ListTest.test_constructor_exception_handling -*graalpython.lib-python.3.test.test_list.ListTest.test_constructors -*graalpython.lib-python.3.test.test_list.ListTest.test_contains -*graalpython.lib-python.3.test.test_list.ListTest.test_contains_fake -*graalpython.lib-python.3.test.test_list.ListTest.test_contains_order -*graalpython.lib-python.3.test.test_list.ListTest.test_copy -*graalpython.lib-python.3.test.test_list.ListTest.test_count -*graalpython.lib-python.3.test.test_list.ListTest.test_count_index_remove_crashes -*graalpython.lib-python.3.test.test_list.ListTest.test_delitem -*graalpython.lib-python.3.test.test_list.ListTest.test_delslice -*graalpython.lib-python.3.test.test_list.ListTest.test_equal_operator_modifying_operand -*graalpython.lib-python.3.test.test_list.ListTest.test_exhausted_iterator -*graalpython.lib-python.3.test.test_list.ListTest.test_extend -*graalpython.lib-python.3.test.test_list.ListTest.test_extendedslicing -*graalpython.lib-python.3.test.test_list.ListTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_list.ListTest.test_getitem -*graalpython.lib-python.3.test.test_list.ListTest.test_getitem_error -*graalpython.lib-python.3.test.test_list.ListTest.test_getitemoverwriteiter -*graalpython.lib-python.3.test.test_list.ListTest.test_getslice -*graalpython.lib-python.3.test.test_list.ListTest.test_iadd -*graalpython.lib-python.3.test.test_list.ListTest.test_identity -*graalpython.lib-python.3.test.test_list.ListTest.test_imul -*graalpython.lib-python.3.test.test_list.ListTest.test_index -*graalpython.lib-python.3.test.test_list.ListTest.test_init -*graalpython.lib-python.3.test.test_list.ListTest.test_insert -*graalpython.lib-python.3.test.test_list.ListTest.test_iterator_pickle -*graalpython.lib-python.3.test.test_list.ListTest.test_keyword_args -*graalpython.lib-python.3.test.test_list.ListTest.test_len -*graalpython.lib-python.3.test.test_list.ListTest.test_list_resize_overflow -*graalpython.lib-python.3.test.test_list.ListTest.test_minmax -*graalpython.lib-python.3.test.test_list.ListTest.test_no_comdat_folding -*graalpython.lib-python.3.test.test_list.ListTest.test_overflow -*graalpython.lib-python.3.test.test_list.ListTest.test_pickle -*graalpython.lib-python.3.test.test_list.ListTest.test_pop -*graalpython.lib-python.3.test.test_list.ListTest.test_preallocation -*graalpython.lib-python.3.test.test_list.ListTest.test_print -*graalpython.lib-python.3.test.test_list.ListTest.test_remove -*graalpython.lib-python.3.test.test_list.ListTest.test_repeat -*graalpython.lib-python.3.test.test_list.ListTest.test_repr -*graalpython.lib-python.3.test.test_list.ListTest.test_repr_large -*graalpython.lib-python.3.test.test_list.ListTest.test_reverse -*graalpython.lib-python.3.test.test_list.ListTest.test_reversed -*graalpython.lib-python.3.test.test_list.ListTest.test_reversed_pickle -*graalpython.lib-python.3.test.test_list.ListTest.test_set_subscript -*graalpython.lib-python.3.test.test_list.ListTest.test_setitem -*graalpython.lib-python.3.test.test_list.ListTest.test_setitem_error -*graalpython.lib-python.3.test.test_list.ListTest.test_setslice -*graalpython.lib-python.3.test.test_list.ListTest.test_slice -*graalpython.lib-python.3.test.test_list.ListTest.test_sort -*graalpython.lib-python.3.test.test_list.ListTest.test_step_overflow -*graalpython.lib-python.3.test.test_list.ListTest.test_subscript -*graalpython.lib-python.3.test.test_list.ListTest.test_truth +test.test_list.ListTest.test_addmul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_constructor_exception_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_constructors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_contains_fake @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_contains_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_count_index_remove_crashes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_delslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_equal_operator_modifying_operand @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_exhausted_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_extendedslicing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_getitem_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_getitemoverwriteiter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_iadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_identity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_imul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_iterator_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_keyword_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_list_resize_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_minmax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_no_comdat_folding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Disabled due to transient stack overflow that fails to get caught and crashes the VM +!test.test_list.ListTest.test_repr_deep @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_list.ListTest.test_repr_large @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_reversed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_reversed_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_set_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_setitem_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_setslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_sort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_step_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_list.ListTest.test_truth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_listcomps.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_listcomps.txt index fb118bab9a..3fb76b53ef 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_listcomps.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_listcomps.txt @@ -1 +1 @@ -*graalpython.lib-python.3.test.test_listcomps.TestMain.test_main +DocTestCase.test.test_listcomps.__test__.doctests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_lltrace.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_lltrace.txt deleted file mode 100644 index a43aee92d5..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_lltrace.txt +++ /dev/null @@ -1,3 +0,0 @@ -*graalpython.lib-python.3.test.test_lltrace.TestLLTrace.test_lltrace -*graalpython.lib-python.3.test.test_lltrace.TestLLTrace.test_lltrace_different_module -*graalpython.lib-python.3.test.test_lltrace.TestLLTrace.test_lltrace_does_not_crash_on_subscript_operator diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_locale.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_locale.txt index b216272bb8..07ee9f74b4 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_locale.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_locale.txt @@ -1,59 +1,59 @@ -*graalpython.lib-python.3.test.test_locale.NormalizeTest.test_c -*graalpython.lib-python.3.test.test_locale.NormalizeTest.test_devanagari_modifier -*graalpython.lib-python.3.test.test_locale.NormalizeTest.test_empty -*graalpython.lib-python.3.test.test_locale.NormalizeTest.test_english -*graalpython.lib-python.3.test.test_locale.NormalizeTest.test_euc_encoding -*graalpython.lib-python.3.test.test_locale.NormalizeTest.test_euro_modifier -*graalpython.lib-python.3.test.test_locale.NormalizeTest.test_hyphenated_encoding -*graalpython.lib-python.3.test.test_locale.NormalizeTest.test_japanese -*graalpython.lib-python.3.test.test_locale.NormalizeTest.test_latin_modifier -*graalpython.lib-python.3.test.test_locale.NormalizeTest.test_locale_alias -*graalpython.lib-python.3.test.test_locale.NormalizeTest.test_valencia_modifier -*graalpython.lib-python.3.test.test_locale.TestCDelocalizeTest.test_atof -*graalpython.lib-python.3.test.test_locale.TestCDelocalizeTest.test_atoi -*graalpython.lib-python.3.test.test_locale.TestCDelocalizeTest.test_delocalize -*graalpython.lib-python.3.test.test_locale.TestCLocalize.test_localize -*graalpython.lib-python.3.test.test_locale.TestCNumberFormatting.test_grouping -*graalpython.lib-python.3.test.test_locale.TestCNumberFormatting.test_grouping_and_padding -*graalpython.lib-python.3.test.test_locale.TestEnUSDelocalize.test_atof -*graalpython.lib-python.3.test.test_locale.TestEnUSDelocalize.test_atoi -*graalpython.lib-python.3.test.test_locale.TestEnUSDelocalize.test_delocalize -*graalpython.lib-python.3.test.test_locale.TestEnUSLocalize.test_localize -*graalpython.lib-python.3.test.test_locale.TestEnUSNumberFormatting.test_complex_formatting -*graalpython.lib-python.3.test.test_locale.TestEnUSNumberFormatting.test_currency -*graalpython.lib-python.3.test.test_locale.TestEnUSNumberFormatting.test_format_deprecation -*graalpython.lib-python.3.test.test_locale.TestEnUSNumberFormatting.test_grouping -*graalpython.lib-python.3.test.test_locale.TestEnUSNumberFormatting.test_grouping_and_padding -*graalpython.lib-python.3.test.test_locale.TestEnUSNumberFormatting.test_integer_grouping -*graalpython.lib-python.3.test.test_locale.TestEnUSNumberFormatting.test_integer_grouping_and_padding -*graalpython.lib-python.3.test.test_locale.TestEnUSNumberFormatting.test_padding -*graalpython.lib-python.3.test.test_locale.TestEnUSNumberFormatting.test_simple -*graalpython.lib-python.3.test.test_locale.TestFormatPatternArg.test_onlyOnePattern -*graalpython.lib-python.3.test.test_locale.TestFrFRNumberFormatting.test_currency -*graalpython.lib-python.3.test.test_locale.TestFrFRNumberFormatting.test_decimal_point -*graalpython.lib-python.3.test.test_locale.TestFrFRNumberFormatting.test_grouping -*graalpython.lib-python.3.test.test_locale.TestFrFRNumberFormatting.test_grouping_and_padding -*graalpython.lib-python.3.test.test_locale.TestFrFRNumberFormatting.test_integer_grouping -*graalpython.lib-python.3.test.test_locale.TestFrFRNumberFormatting.test_integer_grouping_and_padding -*graalpython.lib-python.3.test.test_locale.TestLocaleFormatString.test_mapping -*graalpython.lib-python.3.test.test_locale.TestLocaleFormatString.test_percent_escape -*graalpython.lib-python.3.test.test_locale.TestMiscellaneous.test_defaults_UTF8 -*graalpython.lib-python.3.test.test_locale.TestMiscellaneous.test_getencoding -*graalpython.lib-python.3.test.test_locale.TestMiscellaneous.test_getpreferredencoding -*graalpython.lib-python.3.test.test_locale.TestMiscellaneous.test_getsetlocale_issue1813 -*graalpython.lib-python.3.test.test_locale.TestMiscellaneous.test_invalid_iterable_in_localetuple -*graalpython.lib-python.3.test.test_locale.TestMiscellaneous.test_invalid_locale_format_in_localetuple -*graalpython.lib-python.3.test.test_locale.TestMiscellaneous.test_setlocale_category -*graalpython.lib-python.3.test.test_locale.TestMiscellaneous.test_strcoll_3303 -*graalpython.lib-python.3.test.test_locale.TestNumberFormatting.test_complex_formatting -*graalpython.lib-python.3.test.test_locale.TestNumberFormatting.test_format_deprecation -*graalpython.lib-python.3.test.test_locale.TestNumberFormatting.test_grouping -*graalpython.lib-python.3.test.test_locale.TestNumberFormatting.test_grouping_and_padding -*graalpython.lib-python.3.test.test_locale.TestNumberFormatting.test_integer_grouping -*graalpython.lib-python.3.test.test_locale.TestNumberFormatting.test_integer_grouping_and_padding -*graalpython.lib-python.3.test.test_locale.TestNumberFormatting.test_padding -*graalpython.lib-python.3.test.test_locale.TestNumberFormatting.test_simple -*graalpython.lib-python.3.test.test_locale.TestfrFRDelocalizeTest.test_atof -*graalpython.lib-python.3.test.test_locale.TestfrFRDelocalizeTest.test_atoi -*graalpython.lib-python.3.test.test_locale.TestfrFRDelocalizeTest.test_delocalize -*graalpython.lib-python.3.test.test_locale.TestfrFRLocalize.test_localize +test.test_locale.NormalizeTest.test_c @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.NormalizeTest.test_devanagari_modifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.NormalizeTest.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.NormalizeTest.test_english @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.NormalizeTest.test_euc_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.NormalizeTest.test_euro_modifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.NormalizeTest.test_hyphenated_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.NormalizeTest.test_japanese @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.NormalizeTest.test_latin_modifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.NormalizeTest.test_locale_alias @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.NormalizeTest.test_valencia_modifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestCDelocalizeTest.test_atof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestCDelocalizeTest.test_atoi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestCDelocalizeTest.test_delocalize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestCLocalize.test_localize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestCNumberFormatting.test_grouping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestCNumberFormatting.test_grouping_and_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestEnUSDelocalize.test_atof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestEnUSDelocalize.test_atoi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestEnUSDelocalize.test_delocalize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestEnUSLocalize.test_localize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestEnUSNumberFormatting.test_complex_formatting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestEnUSNumberFormatting.test_currency @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestEnUSNumberFormatting.test_format_deprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestEnUSNumberFormatting.test_grouping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestEnUSNumberFormatting.test_grouping_and_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestEnUSNumberFormatting.test_integer_grouping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestEnUSNumberFormatting.test_integer_grouping_and_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestEnUSNumberFormatting.test_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestEnUSNumberFormatting.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestFormatPatternArg.test_onlyOnePattern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestFrFRNumberFormatting.test_currency @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestFrFRNumberFormatting.test_decimal_point @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestFrFRNumberFormatting.test_grouping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestFrFRNumberFormatting.test_grouping_and_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestFrFRNumberFormatting.test_integer_grouping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestFrFRNumberFormatting.test_integer_grouping_and_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestLocaleFormatString.test_mapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestLocaleFormatString.test_percent_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestMiscellaneous.test_defaults_UTF8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestMiscellaneous.test_getencoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestMiscellaneous.test_getpreferredencoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestMiscellaneous.test_getsetlocale_issue1813 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestMiscellaneous.test_invalid_iterable_in_localetuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestMiscellaneous.test_invalid_locale_format_in_localetuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestMiscellaneous.test_setlocale_category @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestMiscellaneous.test_strcoll_3303 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestNumberFormatting.test_complex_formatting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestNumberFormatting.test_format_deprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestNumberFormatting.test_grouping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestNumberFormatting.test_grouping_and_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestNumberFormatting.test_integer_grouping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestNumberFormatting.test_integer_grouping_and_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestNumberFormatting.test_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestNumberFormatting.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestfrFRDelocalizeTest.test_atof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestfrFRDelocalizeTest.test_atoi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestfrFRDelocalizeTest.test_delocalize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_locale.TestfrFRLocalize.test_localize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_logging.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_logging.txt index a0f45c8f7d..fb7700d5e1 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_logging.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_logging.txt @@ -1,215 +1,217 @@ -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_critical -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_datefmt -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_debug -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_encoding -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_encoding_errors -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_encoding_errors_default -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_encoding_errors_none -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_error -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_filemode -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_filename -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_force -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_format -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_handlers -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_incompatible -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_info -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_level -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_log -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_no_kwargs -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_stream -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_strformatstyle -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_stringtemplatestyle -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_style -*graalpython.lib-python.3.test.test_logging.BasicConfigTest.test_warning -*graalpython.lib-python.3.test.test_logging.BasicFilterTest.test_callable_filter -*graalpython.lib-python.3.test.test_logging.BasicFilterTest.test_empty_filter -*graalpython.lib-python.3.test.test_logging.BasicFilterTest.test_filter -*graalpython.lib-python.3.test.test_logging.BufferingFormatterTest.test_custom -*graalpython.lib-python.3.test.test_logging.BufferingFormatterTest.test_default -*graalpython.lib-python.3.test.test_logging.BuiltinLevelsTest.test_flat -*graalpython.lib-python.3.test.test_logging.BuiltinLevelsTest.test_issue27935 -*graalpython.lib-python.3.test.test_logging.BuiltinLevelsTest.test_nested_explicit -*graalpython.lib-python.3.test.test_logging.BuiltinLevelsTest.test_nested_inherited -*graalpython.lib-python.3.test.test_logging.BuiltinLevelsTest.test_nested_with_virtual_parent -*graalpython.lib-python.3.test.test_logging.BuiltinLevelsTest.test_regression_22386 -*graalpython.lib-python.3.test.test_logging.BuiltinLevelsTest.test_regression_29220 -*graalpython.lib-python.3.test.test_logging.ChildLoggerTest.test_child_loggers -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_90195 -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_baseconfig -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config0_ok -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config11_ok -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config12_failure -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config13_failure -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config14_ok -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config15_ok -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config17_ok -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config1_ok -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config2_failure -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config2a_failure -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config2b_failure -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config3_failure -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config4_ok -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config4a_ok -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config5_ok -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config6_failure -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config7_ok -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config_10_ok -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config_8_ok -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config_8a_ok -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config_9_ok -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config_callable_filter_works -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config_filter_method_works -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_config_filter_works -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_custom_formatter_class_with_validate -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_custom_formatter_class_with_validate2 -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_custom_formatter_class_with_validate2_with_wrong_fmt -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_custom_formatter_class_with_validate3 -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_custom_formatter_function_with_validate -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_invalid_type_raises -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_namedtuple -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_out_of_order -*graalpython.lib-python.3.test.test_logging.ConfigDictTest.test_out_of_order_with_dollar_style -*graalpython.lib-python.3.test.test_logging.ConfigFileTest.test_config0_ok -*graalpython.lib-python.3.test.test_logging.ConfigFileTest.test_config0_using_cp_ok -*graalpython.lib-python.3.test.test_logging.ConfigFileTest.test_config1_ok -*graalpython.lib-python.3.test.test_logging.ConfigFileTest.test_config2_failure -*graalpython.lib-python.3.test.test_logging.ConfigFileTest.test_config3_failure -*graalpython.lib-python.3.test.test_logging.ConfigFileTest.test_config4_ok -*graalpython.lib-python.3.test.test_logging.ConfigFileTest.test_config5_ok -*graalpython.lib-python.3.test.test_logging.ConfigFileTest.test_config6_ok -*graalpython.lib-python.3.test.test_logging.ConfigFileTest.test_config7_ok -*graalpython.lib-python.3.test.test_logging.ConfigFileTest.test_config8_ok -*graalpython.lib-python.3.test.test_logging.ConfigFileTest.test_config_set_handler_names -*graalpython.lib-python.3.test.test_logging.ConfigFileTest.test_defaults_do_no_interpolation -*graalpython.lib-python.3.test.test_logging.ConfigFileTest.test_exception_if_confg_file_is_empty -*graalpython.lib-python.3.test.test_logging.ConfigFileTest.test_exception_if_confg_file_is_invalid -*graalpython.lib-python.3.test.test_logging.ConfigFileTest.test_exception_if_config_file_does_not_exist -*graalpython.lib-python.3.test.test_logging.ConfigFileTest.test_logger_disabling -*graalpython.lib-python.3.test.test_logging.CustomLevelsAndFiltersTest.test_handler_filter -*graalpython.lib-python.3.test.test_logging.CustomLevelsAndFiltersTest.test_logger_filter -*graalpython.lib-python.3.test.test_logging.CustomLevelsAndFiltersTest.test_specific_filters -*graalpython.lib-python.3.test.test_logging.DatagramHandlerTest.test_output -*graalpython.lib-python.3.test.test_logging.EncodingTest.test_encoding_cyrillic_unicode -*graalpython.lib-python.3.test.test_logging.EncodingTest.test_encoding_plain_file -*graalpython.lib-python.3.test.test_logging.ExceptionTest.test_formatting -*graalpython.lib-python.3.test.test_logging.FileHandlerTest.test_delay -*graalpython.lib-python.3.test.test_logging.FileHandlerTest.test_emit_after_closing_in_write_mode -*graalpython.lib-python.3.test.test_logging.FormatterTest.test_braces -*graalpython.lib-python.3.test.test_logging.FormatterTest.test_default_msec_format_none -*graalpython.lib-python.3.test.test_logging.FormatterTest.test_defaults_parameter -*graalpython.lib-python.3.test.test_logging.FormatterTest.test_dollars -*graalpython.lib-python.3.test.test_logging.FormatterTest.test_format_validate -*graalpython.lib-python.3.test.test_logging.FormatterTest.test_invalid_style -*graalpython.lib-python.3.test.test_logging.FormatterTest.test_issue_89047 -*graalpython.lib-python.3.test.test_logging.FormatterTest.test_percent -*graalpython.lib-python.3.test.test_logging.FormatterTest.test_time -*graalpython.lib-python.3.test.test_logging.HTTPHandlerTest.test_output -*graalpython.lib-python.3.test.test_logging.HandlerTest.test_builtin_handlers -*graalpython.lib-python.3.test.test_logging.HandlerTest.test_name -*graalpython.lib-python.3.test.test_logging.HandlerTest.test_path_objects -*graalpython.lib-python.3.test.test_logging.HandlerTest.test_post_fork_child_no_deadlock -*graalpython.lib-python.3.test.test_logging.HandlerTest.test_race -*graalpython.lib-python.3.test.test_logging.IPv6SysLogHandlerTest.test_output -*graalpython.lib-python.3.test.test_logging.IPv6SysLogHandlerTest.test_udp_reconnection -*graalpython.lib-python.3.test.test_logging.LastResortTest.test_last_resort -*graalpython.lib-python.3.test.test_logging.LogRecordFactoryTest.test_logrecord_class -*graalpython.lib-python.3.test.test_logging.LogRecordTest.test_dict_arg -*graalpython.lib-python.3.test.test_logging.LogRecordTest.test_multiprocessing -*graalpython.lib-python.3.test.test_logging.LogRecordTest.test_optional -*graalpython.lib-python.3.test.test_logging.LogRecordTest.test_str_rep -*graalpython.lib-python.3.test.test_logging.LoggerAdapterTest.test_critical -*graalpython.lib-python.3.test.test_logging.LoggerAdapterTest.test_exception -*graalpython.lib-python.3.test.test_logging.LoggerAdapterTest.test_exception_excinfo -*graalpython.lib-python.3.test.test_logging.LoggerAdapterTest.test_has_handlers -*graalpython.lib-python.3.test.test_logging.LoggerAdapterTest.test_is_enabled_for -*graalpython.lib-python.3.test.test_logging.LoggerAdapterTest.test_nested -*graalpython.lib-python.3.test.test_logging.LoggerTest.test_caching -*graalpython.lib-python.3.test.test_logging.LoggerTest.test_exception -*graalpython.lib-python.3.test.test_logging.LoggerTest.test_find_caller_with_stack_info -*graalpython.lib-python.3.test.test_logging.LoggerTest.test_find_caller_with_stacklevel -*graalpython.lib-python.3.test.test_logging.LoggerTest.test_has_handlers -*graalpython.lib-python.3.test.test_logging.LoggerTest.test_has_handlers_no_propagate -*graalpython.lib-python.3.test.test_logging.LoggerTest.test_invalid_names -*graalpython.lib-python.3.test.test_logging.LoggerTest.test_is_enabled_for -*graalpython.lib-python.3.test.test_logging.LoggerTest.test_is_enabled_for_disabled_logger -*graalpython.lib-python.3.test.test_logging.LoggerTest.test_log_invalid_level_no_raise -*graalpython.lib-python.3.test.test_logging.LoggerTest.test_log_invalid_level_with_raise -*graalpython.lib-python.3.test.test_logging.LoggerTest.test_make_record_with_extra_no_overwrite -*graalpython.lib-python.3.test.test_logging.LoggerTest.test_make_record_with_extra_overwrite -*graalpython.lib-python.3.test.test_logging.LoggerTest.test_pickling -*graalpython.lib-python.3.test.test_logging.LoggerTest.test_root_logger_aliases -*graalpython.lib-python.3.test.test_logging.LoggerTest.test_set_invalid_level -*graalpython.lib-python.3.test.test_logging.ManagerTest.test_manager_loggerclass -*graalpython.lib-python.3.test.test_logging.ManagerTest.test_set_log_record_factory -*graalpython.lib-python.3.test.test_logging.MemoryHandlerTest.test_flush -*graalpython.lib-python.3.test.test_logging.MemoryHandlerTest.test_flush_on_close -*graalpython.lib-python.3.test.test_logging.MemoryHandlerTest.test_race_between_set_target_and_flush -*graalpython.lib-python.3.test.test_logging.MemoryTest.test_persistent_loggers -*graalpython.lib-python.3.test.test_logging.MiscTestCase.test__all__ -*graalpython.lib-python.3.test.test_logging.ModuleLevelMiscTest.test_critical -*graalpython.lib-python.3.test.test_logging.ModuleLevelMiscTest.test_debug -*graalpython.lib-python.3.test.test_logging.ModuleLevelMiscTest.test_disable -*graalpython.lib-python.3.test.test_logging.ModuleLevelMiscTest.test_error -*graalpython.lib-python.3.test.test_logging.ModuleLevelMiscTest.test_get_level_names_mapping -*graalpython.lib-python.3.test.test_logging.ModuleLevelMiscTest.test_info -*graalpython.lib-python.3.test.test_logging.ModuleLevelMiscTest.test_log -*graalpython.lib-python.3.test.test_logging.ModuleLevelMiscTest.test_recursion_error -*graalpython.lib-python.3.test.test_logging.ModuleLevelMiscTest.test_set_logger_class -*graalpython.lib-python.3.test.test_logging.ModuleLevelMiscTest.test_subclass_logger_cache -*graalpython.lib-python.3.test.test_logging.ModuleLevelMiscTest.test_warning -*graalpython.lib-python.3.test.test_logging.NTEventLogHandlerTest.test_basic -*graalpython.lib-python.3.test.test_logging.QueueHandlerTest.test_formatting -*graalpython.lib-python.3.test.test_logging.QueueHandlerTest.test_queue_handler -*graalpython.lib-python.3.test.test_logging.QueueHandlerTest.test_queue_listener -*graalpython.lib-python.3.test.test_logging.QueueHandlerTest.test_queue_listener_with_StreamHandler -*graalpython.lib-python.3.test.test_logging.QueueHandlerTest.test_queue_listener_with_multiple_handlers -*graalpython.lib-python.3.test.test_logging.QueueListenerTest.test_calls_task_done_after_stop -*graalpython.lib-python.3.test.test_logging.QueueListenerTest.test_handle_called_with_mp_queue -*graalpython.lib-python.3.test.test_logging.QueueListenerTest.test_handle_called_with_queue_queue -*graalpython.lib-python.3.test.test_logging.QueueListenerTest.test_no_messages_in_queue_after_stop -*graalpython.lib-python.3.test.test_logging.RotatingFileHandlerTest.test_file_created -*graalpython.lib-python.3.test.test_logging.RotatingFileHandlerTest.test_namer_rotator_inheritance -*graalpython.lib-python.3.test.test_logging.RotatingFileHandlerTest.test_rollover_filenames -*graalpython.lib-python.3.test.test_logging.RotatingFileHandlerTest.test_rotator -*graalpython.lib-python.3.test.test_logging.RotatingFileHandlerTest.test_should_not_rollover -*graalpython.lib-python.3.test.test_logging.RotatingFileHandlerTest.test_should_rollover -*graalpython.lib-python.3.test.test_logging.SMTPHandlerTest.test_basic -*graalpython.lib-python.3.test.test_logging.ShutdownTest.test_no_failure -*graalpython.lib-python.3.test.test_logging.ShutdownTest.test_with_ioerror_in_acquire -*graalpython.lib-python.3.test.test_logging.ShutdownTest.test_with_ioerror_in_close -*graalpython.lib-python.3.test.test_logging.ShutdownTest.test_with_ioerror_in_flush -*graalpython.lib-python.3.test.test_logging.ShutdownTest.test_with_other_error_in_acquire_with_raise -*graalpython.lib-python.3.test.test_logging.ShutdownTest.test_with_other_error_in_acquire_without_raise -*graalpython.lib-python.3.test.test_logging.ShutdownTest.test_with_other_error_in_close_with_raise -*graalpython.lib-python.3.test.test_logging.ShutdownTest.test_with_other_error_in_close_without_raise -*graalpython.lib-python.3.test.test_logging.ShutdownTest.test_with_other_error_in_flush_with_raise -*graalpython.lib-python.3.test.test_logging.ShutdownTest.test_with_other_error_in_flush_without_raise -*graalpython.lib-python.3.test.test_logging.ShutdownTest.test_with_valueerror_in_acquire -*graalpython.lib-python.3.test.test_logging.ShutdownTest.test_with_valueerror_in_close -*graalpython.lib-python.3.test.test_logging.ShutdownTest.test_with_valueerror_in_flush -*graalpython.lib-python.3.test.test_logging.SocketHandlerTest.test_noserver -*graalpython.lib-python.3.test.test_logging.SocketHandlerTest.test_output -*graalpython.lib-python.3.test.test_logging.StreamHandlerTest.test_can_represent_stream_with_int_name -*graalpython.lib-python.3.test.test_logging.StreamHandlerTest.test_error_handling -*graalpython.lib-python.3.test.test_logging.StreamHandlerTest.test_stream_setting -*graalpython.lib-python.3.test.test_logging.SysLogHandlerTest.test_output -*graalpython.lib-python.3.test.test_logging.SysLogHandlerTest.test_udp_reconnection -*graalpython.lib-python.3.test.test_logging.TimedRotatingFileHandlerTest.test_compute_files_to_delete -*graalpython.lib-python.3.test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_D -*graalpython.lib-python.3.test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_H -*graalpython.lib-python.3.test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_M -*graalpython.lib-python.3.test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_MIDNIGHT -*graalpython.lib-python.3.test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_S -*graalpython.lib-python.3.test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_W0 -*graalpython.lib-python.3.test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_daily_attime -*graalpython.lib-python.3.test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_weekly_attime -*graalpython.lib-python.3.test.test_logging.TimedRotatingFileHandlerTest.test_invalid -*graalpython.lib-python.3.test.test_logging.TimedRotatingFileHandlerTest.test_rollover -*graalpython.lib-python.3.test.test_logging.TimedRotatingFileHandlerTest.test_should_not_rollover -*graalpython.lib-python.3.test.test_logging.UnixDatagramHandlerTest.test_output -*graalpython.lib-python.3.test.test_logging.UnixSocketHandlerTest.test_noserver -*graalpython.lib-python.3.test.test_logging.UnixSocketHandlerTest.test_output -*graalpython.lib-python.3.test.test_logging.UnixSysLogHandlerTest.test_output -*graalpython.lib-python.3.test.test_logging.UnixSysLogHandlerTest.test_udp_reconnection -*graalpython.lib-python.3.test.test_logging.WarningsTest.test_warnings -*graalpython.lib-python.3.test.test_logging.WarningsTest.test_warnings_no_handlers +test.test_logging.BasicConfigTest.test_critical @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_datefmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_debug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_encoding_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_encoding_errors_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_encoding_errors_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_filemode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_force @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_handlers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_incompatible @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_log @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_no_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_stream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_strformatstyle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_stringtemplatestyle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_style @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicConfigTest.test_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicFilterTest.test_callable_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicFilterTest.test_empty_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BasicFilterTest.test_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BufferingFormatterTest.test_custom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BufferingFormatterTest.test_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BuiltinLevelsTest.test_flat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BuiltinLevelsTest.test_issue27935 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BuiltinLevelsTest.test_nested_explicit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BuiltinLevelsTest.test_nested_inherited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BuiltinLevelsTest.test_nested_with_virtual_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BuiltinLevelsTest.test_regression_22386 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.BuiltinLevelsTest.test_regression_29220 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ChildLoggerTest.test_child_loggers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_90195 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_baseconfig @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config0_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config11_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config12_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config13_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config14_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config15_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config17_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config1_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config2_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config2a_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config2b_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config3_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config4_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config4a_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config5_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config6_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config7_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config_10_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config_8_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config_8a_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config_9_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config_callable_filter_works @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config_filter_method_works @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_config_filter_works @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_custom_formatter_class_with_validate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_custom_formatter_class_with_validate2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_custom_formatter_class_with_validate2_with_wrong_fmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_custom_formatter_class_with_validate3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_custom_formatter_function_with_validate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_invalid_type_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Disabled because these tests hang on Darwin +!test.test_logging.ConfigDictTest.test_listen_config_10_ok @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_logging.ConfigDictTest.test_listen_config_1_ok @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_logging.ConfigDictTest.test_listen_verify @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_logging.ConfigDictTest.test_namedtuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_out_of_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigDictTest.test_out_of_order_with_dollar_style @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigFileTest.test_config0_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigFileTest.test_config0_using_cp_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigFileTest.test_config1_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigFileTest.test_config2_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigFileTest.test_config3_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigFileTest.test_config4_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigFileTest.test_config5_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigFileTest.test_config6_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigFileTest.test_config7_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigFileTest.test_config8_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigFileTest.test_config_set_handler_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigFileTest.test_defaults_do_no_interpolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigFileTest.test_exception_if_confg_file_is_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigFileTest.test_exception_if_confg_file_is_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigFileTest.test_exception_if_config_file_does_not_exist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ConfigFileTest.test_logger_disabling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.CustomLevelsAndFiltersTest.test_handler_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.CustomLevelsAndFiltersTest.test_logger_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.CustomLevelsAndFiltersTest.test_specific_filters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.DatagramHandlerTest.test_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.EncodingTest.test_encoding_cyrillic_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.EncodingTest.test_encoding_plain_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ExceptionTest.test_formatting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.FileHandlerTest.test_delay @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.FileHandlerTest.test_emit_after_closing_in_write_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.FormatterTest.test_braces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.FormatterTest.test_default_msec_format_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.FormatterTest.test_defaults_parameter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.FormatterTest.test_dollars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.FormatterTest.test_format_validate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.FormatterTest.test_invalid_style @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.FormatterTest.test_issue_89047 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.FormatterTest.test_percent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.FormatterTest.test_time @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.HTTPHandlerTest.test_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_logging.HandlerTest.test_builtin_handlers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.HandlerTest.test_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.HandlerTest.test_path_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.HandlerTest.test_race @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_logging.IPv6SysLogHandlerTest.test_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.IPv6SysLogHandlerTest.test_udp_reconnection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LastResortTest.test_last_resort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LogRecordFactoryTest.test_logrecord_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LogRecordTest.test_dict_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LogRecordTest.test_multiprocessing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_logging.LogRecordTest.test_optional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LogRecordTest.test_str_rep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerAdapterTest.test_critical @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerAdapterTest.test_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerAdapterTest.test_exception_excinfo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerAdapterTest.test_has_handlers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerAdapterTest.test_is_enabled_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerAdapterTest.test_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerTest.test_caching @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerTest.test_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerTest.test_find_caller_with_stack_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerTest.test_find_caller_with_stacklevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerTest.test_has_handlers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerTest.test_has_handlers_no_propagate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerTest.test_invalid_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerTest.test_is_enabled_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerTest.test_is_enabled_for_disabled_logger @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerTest.test_log_invalid_level_no_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerTest.test_log_invalid_level_with_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerTest.test_make_record_with_extra_no_overwrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerTest.test_make_record_with_extra_overwrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerTest.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerTest.test_root_logger_aliases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.LoggerTest.test_set_invalid_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ManagerTest.test_manager_loggerclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ManagerTest.test_set_log_record_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.MemoryHandlerTest.test_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.MemoryHandlerTest.test_flush_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.MemoryHandlerTest.test_race_between_set_target_and_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.MemoryTest.test_persistent_loggers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.MiscTestCase.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ModuleLevelMiscTest.test_critical @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ModuleLevelMiscTest.test_debug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ModuleLevelMiscTest.test_disable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ModuleLevelMiscTest.test_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ModuleLevelMiscTest.test_get_level_names_mapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ModuleLevelMiscTest.test_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ModuleLevelMiscTest.test_log @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ModuleLevelMiscTest.test_recursion_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ModuleLevelMiscTest.test_set_logger_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ModuleLevelMiscTest.test_subclass_logger_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ModuleLevelMiscTest.test_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.QueueHandlerTest.test_formatting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.QueueHandlerTest.test_queue_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.QueueHandlerTest.test_queue_listener @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.QueueHandlerTest.test_queue_listener_with_StreamHandler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.QueueHandlerTest.test_queue_listener_with_multiple_handlers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.QueueListenerTest.test_calls_task_done_after_stop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.QueueListenerTest.test_handle_called_with_mp_queue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_logging.QueueListenerTest.test_handle_called_with_queue_queue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.QueueListenerTest.test_no_messages_in_queue_after_stop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_logging.RotatingFileHandlerTest.test_file_created @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.RotatingFileHandlerTest.test_namer_rotator_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.RotatingFileHandlerTest.test_rollover_filenames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.RotatingFileHandlerTest.test_rotator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_logging.RotatingFileHandlerTest.test_should_not_rollover @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_logging.RotatingFileHandlerTest.test_should_rollover @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.SMTPHandlerTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ShutdownTest.test_no_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ShutdownTest.test_with_ioerror_in_acquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ShutdownTest.test_with_ioerror_in_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ShutdownTest.test_with_ioerror_in_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ShutdownTest.test_with_other_error_in_acquire_with_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ShutdownTest.test_with_other_error_in_acquire_without_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ShutdownTest.test_with_other_error_in_close_with_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ShutdownTest.test_with_other_error_in_close_without_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ShutdownTest.test_with_other_error_in_flush_with_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ShutdownTest.test_with_other_error_in_flush_without_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ShutdownTest.test_with_valueerror_in_acquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ShutdownTest.test_with_valueerror_in_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.ShutdownTest.test_with_valueerror_in_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.SocketHandlerTest.test_noserver @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.SocketHandlerTest.test_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_logging.StreamHandlerTest.test_can_represent_stream_with_int_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.StreamHandlerTest.test_error_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.StreamHandlerTest.test_stream_setting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.SysLogHandlerTest.test_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.SysLogHandlerTest.test_udp_reconnection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.TimedRotatingFileHandlerTest.test_compute_files_to_delete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_D @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_H @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_M @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_MIDNIGHT @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_S @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_W0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_daily_attime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_weekly_attime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.TimedRotatingFileHandlerTest.test_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.TimedRotatingFileHandlerTest.test_rollover @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.TimedRotatingFileHandlerTest.test_should_not_rollover @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_logging.UnixDatagramHandlerTest.test_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_logging.UnixSocketHandlerTest.test_noserver @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_logging.UnixSocketHandlerTest.test_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_logging.UnixSysLogHandlerTest.test_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_logging.UnixSysLogHandlerTest.test_udp_reconnection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_logging.WarningsTest.test_warnings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_logging.WarningsTest.test_warnings_no_handlers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_long.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_long.txt index 12b5b93a69..e124d539e2 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_long.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_long.txt @@ -1,42 +1,34 @@ -*graalpython.lib-python.3.test.test_long.LongTest.test__format__ -*graalpython.lib-python.3.test.test_long.LongTest.test_access_to_nonexistent_digit_0 -*graalpython.lib-python.3.test.test_long.LongTest.test_as_integer_ratio -*graalpython.lib-python.3.test.test_long.LongTest.test_big_lshift -*graalpython.lib-python.3.test.test_long.LongTest.test_big_rshift -*graalpython.lib-python.3.test.test_long.LongTest.test_bit_count -*graalpython.lib-python.3.test.test_long.LongTest.test_bit_length -*graalpython.lib-python.3.test.test_long.LongTest.test_bitop_identities -*graalpython.lib-python.3.test.test_long.LongTest.test_conversion -*graalpython.lib-python.3.test.test_long.LongTest.test_correctly_rounded_true_division -*graalpython.lib-python.3.test.test_long.LongTest.test_division -*graalpython.lib-python.3.test.test_long.LongTest.test_divmod_uses_cached_small_ints -*graalpython.lib-python.3.test.test_long.LongTest.test_float_conversion -*graalpython.lib-python.3.test.test_long.LongTest.test_float_overflow -*graalpython.lib-python.3.test.test_long.LongTest.test_floordiv -*graalpython.lib-python.3.test.test_long.LongTest.test_format -*graalpython.lib-python.3.test.test_long.LongTest.test_from_bytes -*graalpython.lib-python.3.test.test_long.LongTest.test_from_bytes_small -*graalpython.lib-python.3.test.test_long.LongTest.test_huge_lshift -*graalpython.lib-python.3.test.test_long.LongTest.test_huge_lshift_of_zero -*graalpython.lib-python.3.test.test_long.LongTest.test_huge_rshift -*graalpython.lib-python.3.test.test_long.LongTest.test_huge_rshift_of_huge -*graalpython.lib-python.3.test.test_long.LongTest.test_karatsuba -*graalpython.lib-python.3.test.test_long.LongTest.test_logs -*graalpython.lib-python.3.test.test_long.LongTest.test_long -*graalpython.lib-python.3.test.test_long.LongTest.test_lshift_of_zero -*graalpython.lib-python.3.test.test_long.LongTest.test_medium_lshift -*graalpython.lib-python.3.test.test_long.LongTest.test_medium_rshift -*graalpython.lib-python.3.test.test_long.LongTest.test_mixed_compares -*graalpython.lib-python.3.test.test_long.LongTest.test_mod_division -*graalpython.lib-python.3.test.test_long.LongTest.test_nan_inf -*graalpython.lib-python.3.test.test_long.LongTest.test_negative_shift_count -*graalpython.lib-python.3.test.test_long.LongTest.test_pow_uses_cached_small_ints -*graalpython.lib-python.3.test.test_long.LongTest.test_round -*graalpython.lib-python.3.test.test_long.LongTest.test_shift_bool -*graalpython.lib-python.3.test.test_long.LongTest.test_small_ints -*graalpython.lib-python.3.test.test_long.LongTest.test_small_ints_in_huge_calculation -*graalpython.lib-python.3.test.test_long.LongTest.test_small_lshift -*graalpython.lib-python.3.test.test_long.LongTest.test_small_rshift -*graalpython.lib-python.3.test.test_long.LongTest.test_square -*graalpython.lib-python.3.test.test_long.LongTest.test_to_bytes -*graalpython.lib-python.3.test.test_long.LongTest.test_true_division +test.test_long.LongTest.test__format__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_access_to_nonexistent_digit_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_as_integer_ratio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_big_lshift @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_big_rshift @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_bit_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_bit_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_bitop_identities @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_conversion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_division @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_float_conversion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_float_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_floordiv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_huge_rshift @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_karatsuba @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_logs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_lshift_of_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_medium_lshift @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_medium_rshift @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_mixed_compares @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_mod_division @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_nan_inf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_negative_shift_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_round @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_shift_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_small_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_small_lshift @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_small_rshift @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_square @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_to_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_long.LongTest.test_true_division @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_longexp.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_longexp.txt index ad73ffcd37..d6ed34b594 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_longexp.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_longexp.txt @@ -1 +1 @@ -*graalpython.lib-python.3.test.test_longexp.LongExpText.test_longexp +test.test_longexp.LongExpText.test_longexp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_lzma.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_lzma.txt index d4ff759d3f..fa06f747b9 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_lzma.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_lzma.txt @@ -1,117 +1,112 @@ -*graalpython.lib-python.3.test.test_lzma.CompressDecompressFunctionTestCase.test_bad_args -*graalpython.lib-python.3.test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_bad_input -*graalpython.lib-python.3.test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_good_input -*graalpython.lib-python.3.test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_incomplete_input -*graalpython.lib-python.3.test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_memlimit -*graalpython.lib-python.3.test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_multistream -*graalpython.lib-python.3.test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_multistream_trailing_junk -*graalpython.lib-python.3.test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_trailing_junk -*graalpython.lib-python.3.test.test_lzma.CompressDecompressFunctionTestCase.test_roundtrip -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_bad_filter_spec -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_compressor_bigmem -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_after_eof -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_alone -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_auto -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_bad_input -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_bigmem -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_bug_28275 -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_chunks -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_chunks_empty -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_chunks_maxsize -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_inputbuf_1 -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_inputbuf_2 -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_inputbuf_3 -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_memlimit -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_multistream -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_raw_1 -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_raw_2 -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_raw_3 -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_raw_4 -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_unused_data -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_decompressor_xz -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_pickle -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_refleaks_in_decompressor___init__ -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_roundtrip_alone -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_roundtrip_chunks -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_roundtrip_empty_chunks -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_roundtrip_raw -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_roundtrip_raw_empty -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_roundtrip_xz -*graalpython.lib-python.3.test.test_lzma.CompressorDecompressorTestCase.test_simple_bad_args -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_close -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_closed -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_decompress_limited -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_fileno -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_init -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_init_bad_check -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_init_bad_filter_spec -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_init_bad_mode -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_init_bad_preset -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_init_mode -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_init_with_PathLike_filename -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_init_with_filename -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_init_with_preset_and_filters -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_init_with_x_mode -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_issue21872 -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_issue44439 -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_iterator -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_peek -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_peek_bad_args -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_read -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_read1 -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_read1_0 -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_read1_10 -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_read1_bad_args -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_read1_multistream -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_read_0 -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_read_10 -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_read_bad_args -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_read_bad_data -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_read_from_file -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_read_from_file_with_bytes_filename -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_read_incomplete -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_read_multistream -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_read_multistream_buffer_size_aligned -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_read_multistream_trailing_junk -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_read_trailing_junk -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_read_truncated -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_readable -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_readline -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_readlines -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_seek_backward -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_seek_backward_across_streams -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_seek_backward_relative_to_end -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_seek_bad_args -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_seek_forward -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_seek_forward_across_streams -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_seek_forward_relative_to_current -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_seek_forward_relative_to_end -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_seek_past_end -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_seek_past_start -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_seekable -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_tell -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_tell_bad_args -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_writable -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_write -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_write_10 -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_write_append -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_write_append_to_file -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_write_bad_args -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_write_to_file -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_write_to_file_with_bytes_filename -*graalpython.lib-python.3.test.test_lzma.FileTestCase.test_writelines -*graalpython.lib-python.3.test.test_lzma.MiscellaneousTestCase.test__decode_filter_properties -*graalpython.lib-python.3.test.test_lzma.MiscellaneousTestCase.test__encode_filter_properties -*graalpython.lib-python.3.test.test_lzma.MiscellaneousTestCase.test_filter_properties_roundtrip -*graalpython.lib-python.3.test.test_lzma.MiscellaneousTestCase.test_is_check_supported -*graalpython.lib-python.3.test.test_lzma.OpenTestCase.test_bad_params -*graalpython.lib-python.3.test.test_lzma.OpenTestCase.test_binary_modes -*graalpython.lib-python.3.test.test_lzma.OpenTestCase.test_encoding -*graalpython.lib-python.3.test.test_lzma.OpenTestCase.test_encoding_error_handler -*graalpython.lib-python.3.test.test_lzma.OpenTestCase.test_filename -*graalpython.lib-python.3.test.test_lzma.OpenTestCase.test_format_and_filters -*graalpython.lib-python.3.test.test_lzma.OpenTestCase.test_newline -*graalpython.lib-python.3.test.test_lzma.OpenTestCase.test_text_modes -*graalpython.lib-python.3.test.test_lzma.OpenTestCase.test_with_pathlike_filename -*graalpython.lib-python.3.test.test_lzma.OpenTestCase.test_x_mode -*graalpython.lib-python.3.test.test_lzma.TestMain.test_main +test.test_lzma.CompressDecompressFunctionTestCase.test_bad_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_bad_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_good_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_incomplete_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_memlimit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_multistream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_multistream_trailing_junk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_trailing_junk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.CompressDecompressFunctionTestCase.test_roundtrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_bad_filter_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.CompressorDecompressorTestCase.test_compressor_bigmem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_after_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_alone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_auto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_bad_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_bigmem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_bug_28275 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_chunks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_chunks_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_chunks_maxsize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_inputbuf_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_inputbuf_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_inputbuf_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_memlimit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_multistream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_raw_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_raw_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_raw_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_raw_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_unused_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_xz @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_roundtrip_alone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_roundtrip_chunks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_roundtrip_empty_chunks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_roundtrip_raw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_roundtrip_raw_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_roundtrip_xz @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_simple_bad_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.FileTestCase.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_closed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_decompress_limited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_fileno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_init_bad_check @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.FileTestCase.test_init_bad_filter_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_init_bad_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_init_bad_preset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.FileTestCase.test_init_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_init_with_PathLike_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_init_with_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_init_with_preset_and_filters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_init_with_x_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_issue21872 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.FileTestCase.test_issue44439 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.FileTestCase.test_peek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_peek_bad_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.FileTestCase.test_read1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_read1_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_read1_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_read1_bad_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_read1_multistream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_read_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_read_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_read_bad_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_read_bad_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_read_from_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_read_incomplete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.FileTestCase.test_read_multistream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.FileTestCase.test_read_multistream_buffer_size_aligned @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_read_multistream_trailing_junk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_read_trailing_junk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_read_truncated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.FileTestCase.test_readable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_seek_backward @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_seek_backward_across_streams @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_seek_backward_relative_to_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_seek_bad_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_seek_forward @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_seek_forward_across_streams @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_seek_forward_relative_to_current @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_seek_forward_relative_to_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_seek_past_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_seek_past_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_seekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_tell_bad_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.FileTestCase.test_write_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_write_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_write_append_to_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_write_bad_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_write_to_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.FileTestCase.test_writelines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.MiscellaneousTestCase.test__decode_filter_properties @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.MiscellaneousTestCase.test__encode_filter_properties @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.MiscellaneousTestCase.test_filter_properties_roundtrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.MiscellaneousTestCase.test_is_check_supported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.OpenTestCase.test_bad_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.OpenTestCase.test_binary_modes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.OpenTestCase.test_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.OpenTestCase.test_encoding_error_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.OpenTestCase.test_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.OpenTestCase.test_format_and_filters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.OpenTestCase.test_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.OpenTestCase.test_text_modes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_lzma.OpenTestCase.test_with_pathlike_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_lzma.OpenTestCase.test_x_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_mailbox.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_mailbox.txt index c4885fab66..d32a884820 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_mailbox.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_mailbox.txt @@ -1,370 +1,362 @@ -*graalpython.lib-python.3.test.test_mailbox.MaildirTestCase.test_empty_maildir -*graalpython.lib-python.3.test.test_mailbox.MaildirTestCase.test_nonempty_maildir_both -*graalpython.lib-python.3.test.test_mailbox.MaildirTestCase.test_nonempty_maildir_cur -*graalpython.lib-python.3.test.test_mailbox.MaildirTestCase.test_nonempty_maildir_new -*graalpython.lib-python.3.test.test_mailbox.MiscTestCase.test__all__ -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_add -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_add_8bit_body -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_add_StringIO_warns -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_add_binary_file -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_add_binary_nonascii_file -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_add_doesnt_rewrite -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_add_invalid_8bit_bytes_header -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_add_nonascii_StringIO_raises -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_add_nonascii_string_header_raises -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_add_text_file_warns -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_add_that_raises_leaves_mailbox_empty -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_clear -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_close -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_contains -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_delitem -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_discard -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_dump_message -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_flush -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_get -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_get_bytes -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_get_file -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_get_file_can_be_closed_twice -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_get_message -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_get_string -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_getitem -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_invalid_nonascii_header_as_string -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_items -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_iter -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_iteritems -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_iterkeys -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_itervalues -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_keys -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_labels -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_len -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_lock_unlock -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_permissions_after_flush -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_pop -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_popitem -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_popitem_and_flush_twice -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_remove -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_set_item -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_update -*graalpython.lib-python.3.test.test_mailbox.TestBabyl.test_values -*graalpython.lib-python.3.test.test_mailbox.TestBabylMessage.test_all_eMM_attribues_exist -*graalpython.lib-python.3.test.test_mailbox.TestBabylMessage.test_all_eMM_attributes_exist -*graalpython.lib-python.3.test.test_mailbox.TestBabylMessage.test_become_message -*graalpython.lib-python.3.test.test_mailbox.TestBabylMessage.test_explain_to -*graalpython.lib-python.3.test.test_mailbox.TestBabylMessage.test_initialize_incorrectly -*graalpython.lib-python.3.test.test_mailbox.TestBabylMessage.test_initialize_with_binary_file -*graalpython.lib-python.3.test.test_mailbox.TestBabylMessage.test_initialize_with_eMM -*graalpython.lib-python.3.test.test_mailbox.TestBabylMessage.test_initialize_with_file -*graalpython.lib-python.3.test.test_mailbox.TestBabylMessage.test_initialize_with_nothing -*graalpython.lib-python.3.test.test_mailbox.TestBabylMessage.test_initialize_with_string -*graalpython.lib-python.3.test.test_mailbox.TestBabylMessage.test_labels -*graalpython.lib-python.3.test.test_mailbox.TestBabylMessage.test_visible -*graalpython.lib-python.3.test.test_mailbox.TestFakeMailBox.test_closing_fd -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_add -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_add_8bit_body -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_add_StringIO_warns -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_add_and_remove_folders -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_add_binary_file -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_add_binary_nonascii_file -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_add_invalid_8bit_bytes_header -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_add_nonascii_StringIO_raises -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_add_nonascii_string_header_raises -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_add_text_file_warns -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_add_that_raises_leaves_mailbox_empty -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_clear -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_close -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_contains -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_delitem -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_discard -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_dump_message -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_flush -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_get -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_get_bytes -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_get_file -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_get_file_can_be_closed_twice -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_get_folder -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_get_message -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_get_string -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_getitem -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_invalid_nonascii_header_as_string -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_issue2625 -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_issue7627 -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_items -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_iter -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_iteritems -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_iterkeys -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_itervalues -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_keys -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_len -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_list_folders -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_lock_unlock -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_pack -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_pop -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_popitem -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_popitem_and_flush_twice -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_remove -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_sequences -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_set_item -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_update -*graalpython.lib-python.3.test.test_mailbox.TestMH.test_values -*graalpython.lib-python.3.test.test_mailbox.TestMHMessage.test_all_eMM_attribues_exist -*graalpython.lib-python.3.test.test_mailbox.TestMHMessage.test_all_eMM_attributes_exist -*graalpython.lib-python.3.test.test_mailbox.TestMHMessage.test_become_message -*graalpython.lib-python.3.test.test_mailbox.TestMHMessage.test_explain_to -*graalpython.lib-python.3.test.test_mailbox.TestMHMessage.test_initialize_incorrectly -*graalpython.lib-python.3.test.test_mailbox.TestMHMessage.test_initialize_with_binary_file -*graalpython.lib-python.3.test.test_mailbox.TestMHMessage.test_initialize_with_eMM -*graalpython.lib-python.3.test.test_mailbox.TestMHMessage.test_initialize_with_file -*graalpython.lib-python.3.test.test_mailbox.TestMHMessage.test_initialize_with_nothing -*graalpython.lib-python.3.test.test_mailbox.TestMHMessage.test_initialize_with_string -*graalpython.lib-python.3.test.test_mailbox.TestMHMessage.test_sequences -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_add -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_add_8bit_body -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_add_StringIO_warns -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_add_and_close -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_add_binary_file -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_add_binary_nonascii_file -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_add_doesnt_rewrite -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_add_from_bytes -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_add_from_string -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_add_invalid_8bit_bytes_header -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_add_mbox_or_mmdf_message -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_add_nonascii_StringIO_raises -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_add_nonascii_string_header_raises -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_add_text_file_warns -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_add_that_raises_leaves_mailbox_empty -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_clear -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_close -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_contains -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_delitem -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_discard -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_dump_message -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_flush -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_get -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_get_bytes -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_get_bytes_from -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_get_file -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_get_file_can_be_closed_twice -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_get_message -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_get_string -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_get_string_from -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_getitem -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_invalid_nonascii_header_as_string -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_items -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_iter -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_iteritems -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_iterkeys -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_itervalues -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_keys -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_len -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_lock_conflict -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_lock_unlock -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_open_close_open -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_permissions_after_flush -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_pop -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_popitem -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_popitem_and_flush_twice -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_relock -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_remove -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_set_item -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_update -*graalpython.lib-python.3.test.test_mailbox.TestMMDF.test_values -*graalpython.lib-python.3.test.test_mailbox.TestMMDFMessage.test_all_eMM_attribues_exist -*graalpython.lib-python.3.test.test_mailbox.TestMMDFMessage.test_all_eMM_attributes_exist -*graalpython.lib-python.3.test.test_mailbox.TestMMDFMessage.test_become_message -*graalpython.lib-python.3.test.test_mailbox.TestMMDFMessage.test_explain_to -*graalpython.lib-python.3.test.test_mailbox.TestMMDFMessage.test_flags -*graalpython.lib-python.3.test.test_mailbox.TestMMDFMessage.test_from -*graalpython.lib-python.3.test.test_mailbox.TestMMDFMessage.test_initialize_incorrectly -*graalpython.lib-python.3.test.test_mailbox.TestMMDFMessage.test_initialize_with_binary_file -*graalpython.lib-python.3.test.test_mailbox.TestMMDFMessage.test_initialize_with_eMM -*graalpython.lib-python.3.test.test_mailbox.TestMMDFMessage.test_initialize_with_file -*graalpython.lib-python.3.test.test_mailbox.TestMMDFMessage.test_initialize_with_nothing -*graalpython.lib-python.3.test.test_mailbox.TestMMDFMessage.test_initialize_with_string -*graalpython.lib-python.3.test.test_mailbox.TestMMDFMessage.test_initialize_with_unixfrom -*graalpython.lib-python.3.test.test_mailbox.TestMailboxSuperclass.test_notimplemented -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_add -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_add_8bit_body -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_add_MM -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_add_StringIO_warns -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_add_and_remove_folders -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_add_binary_file -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_add_binary_nonascii_file -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_add_invalid_8bit_bytes_header -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_add_nonascii_StringIO_raises -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_add_nonascii_string_header_raises -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_add_text_file_warns -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_add_that_raises_leaves_mailbox_empty -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_clean -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_clear -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_close -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_consistent_factory -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_contains -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_create_tmp -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_delitem -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_directory_in_folder -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_discard -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_dump_message -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_file_permissions -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_flush -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_folder -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_folder_file_perms -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_get -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_get_MM -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_get_bytes -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_get_file -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_get_file_can_be_closed_twice -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_get_folder -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_get_message -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_get_string -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_getitem -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_initialize_existing -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_initialize_new -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_invalid_nonascii_header_as_string -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_items -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_iter -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_iteritems -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_iterkeys -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_itervalues -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_keys -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_len -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_list_folders -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_lock_unlock -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_lookup -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_pop -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_popitem -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_popitem_and_flush_twice -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_refresh -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_refresh_after_safety_period -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_remove -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_reread -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_set_MM -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_set_item -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_update -*graalpython.lib-python.3.test.test_mailbox.TestMaildir.test_values -*graalpython.lib-python.3.test.test_mailbox.TestMaildirMessage.test_all_eMM_attribues_exist -*graalpython.lib-python.3.test.test_mailbox.TestMaildirMessage.test_all_eMM_attributes_exist -*graalpython.lib-python.3.test.test_mailbox.TestMaildirMessage.test_become_message -*graalpython.lib-python.3.test.test_mailbox.TestMaildirMessage.test_date -*graalpython.lib-python.3.test.test_mailbox.TestMaildirMessage.test_explain_to -*graalpython.lib-python.3.test.test_mailbox.TestMaildirMessage.test_flags -*graalpython.lib-python.3.test.test_mailbox.TestMaildirMessage.test_info -*graalpython.lib-python.3.test.test_mailbox.TestMaildirMessage.test_info_and_flags -*graalpython.lib-python.3.test.test_mailbox.TestMaildirMessage.test_initialize_incorrectly -*graalpython.lib-python.3.test.test_mailbox.TestMaildirMessage.test_initialize_with_binary_file -*graalpython.lib-python.3.test.test_mailbox.TestMaildirMessage.test_initialize_with_eMM -*graalpython.lib-python.3.test.test_mailbox.TestMaildirMessage.test_initialize_with_file -*graalpython.lib-python.3.test.test_mailbox.TestMaildirMessage.test_initialize_with_nothing -*graalpython.lib-python.3.test.test_mailbox.TestMaildirMessage.test_initialize_with_string -*graalpython.lib-python.3.test.test_mailbox.TestMaildirMessage.test_subdir -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_add -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_add_8bit_body -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_add_StringIO_warns -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_add_and_close -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_add_binary_file -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_add_binary_nonascii_file -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_add_doesnt_rewrite -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_add_from_bytes -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_add_from_string -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_add_invalid_8bit_bytes_header -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_add_mbox_or_mmdf_message -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_add_nonascii_StringIO_raises -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_add_nonascii_string_header_raises -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_add_text_file_warns -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_add_that_raises_leaves_mailbox_empty -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_clear -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_close -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_contains -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_delitem -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_discard -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_dump_message -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_file_perms -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_flush -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_get -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_get_bytes -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_get_bytes_from -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_get_file -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_get_file_can_be_closed_twice -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_get_message -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_get_string -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_get_string_from -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_getitem -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_invalid_nonascii_header_as_string -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_items -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_iter -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_iteritems -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_iterkeys -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_itervalues -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_keys -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_len -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_lock_conflict -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_lock_unlock -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_message_separator -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_open_close_open -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_permissions_after_flush -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_pop -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_popitem -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_popitem_and_flush_twice -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_relock -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_remove -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_set_item -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_terminating_newline -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_update -*graalpython.lib-python.3.test.test_mailbox.TestMbox.test_values -*graalpython.lib-python.3.test.test_mailbox.TestMboxMessage.test_all_eMM_attribues_exist -*graalpython.lib-python.3.test.test_mailbox.TestMboxMessage.test_all_eMM_attributes_exist -*graalpython.lib-python.3.test.test_mailbox.TestMboxMessage.test_become_message -*graalpython.lib-python.3.test.test_mailbox.TestMboxMessage.test_explain_to -*graalpython.lib-python.3.test.test_mailbox.TestMboxMessage.test_flags -*graalpython.lib-python.3.test.test_mailbox.TestMboxMessage.test_from -*graalpython.lib-python.3.test.test_mailbox.TestMboxMessage.test_initialize_incorrectly -*graalpython.lib-python.3.test.test_mailbox.TestMboxMessage.test_initialize_with_binary_file -*graalpython.lib-python.3.test.test_mailbox.TestMboxMessage.test_initialize_with_eMM -*graalpython.lib-python.3.test.test_mailbox.TestMboxMessage.test_initialize_with_file -*graalpython.lib-python.3.test.test_mailbox.TestMboxMessage.test_initialize_with_nothing -*graalpython.lib-python.3.test.test_mailbox.TestMboxMessage.test_initialize_with_string -*graalpython.lib-python.3.test.test_mailbox.TestMboxMessage.test_initialize_with_unixfrom -*graalpython.lib-python.3.test.test_mailbox.TestMessage.test_all_eMM_attribues_exist -*graalpython.lib-python.3.test.test_mailbox.TestMessage.test_all_eMM_attributes_exist -*graalpython.lib-python.3.test.test_mailbox.TestMessage.test_become_message -*graalpython.lib-python.3.test.test_mailbox.TestMessage.test_explain_to -*graalpython.lib-python.3.test.test_mailbox.TestMessage.test_initialize_incorrectly -*graalpython.lib-python.3.test.test_mailbox.TestMessage.test_initialize_with_binary_file -*graalpython.lib-python.3.test.test_mailbox.TestMessage.test_initialize_with_eMM -*graalpython.lib-python.3.test.test_mailbox.TestMessage.test_initialize_with_file -*graalpython.lib-python.3.test.test_mailbox.TestMessage.test_initialize_with_nothing -*graalpython.lib-python.3.test.test_mailbox.TestMessage.test_initialize_with_string -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_babyl_to_babyl -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_babyl_to_maildir -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_babyl_to_mboxmmdf -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_babyl_to_mh -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_maildir_to_babyl -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_maildir_to_maildir -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_maildir_to_mboxmmdf -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_maildir_to_mh -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_mboxmmdf_to_babyl -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_mboxmmdf_to_maildir -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_mboxmmdf_to_mboxmmdf -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_mboxmmdf_to_mh -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_mh_to_babyl -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_mh_to_maildir -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_mh_to_mboxmmdf -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_mh_to_mh -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_plain_to_x -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_type_specific_attributes_removed_on_conversion -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_x_from_bytes -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_x_to_invalid -*graalpython.lib-python.3.test.test_mailbox.TestMessageConversion.test_x_to_plain -*graalpython.lib-python.3.test.test_mailbox.TestPartialFile.test_close -*graalpython.lib-python.3.test.test_mailbox.TestPartialFile.test_initialize -*graalpython.lib-python.3.test.test_mailbox.TestPartialFile.test_iteration -*graalpython.lib-python.3.test.test_mailbox.TestPartialFile.test_read -*graalpython.lib-python.3.test.test_mailbox.TestPartialFile.test_readline -*graalpython.lib-python.3.test.test_mailbox.TestPartialFile.test_readlines -*graalpython.lib-python.3.test.test_mailbox.TestPartialFile.test_seek_and_tell -*graalpython.lib-python.3.test.test_mailbox.TestProxyFile.test_close -*graalpython.lib-python.3.test.test_mailbox.TestProxyFile.test_initialize -*graalpython.lib-python.3.test.test_mailbox.TestProxyFile.test_iteration -*graalpython.lib-python.3.test.test_mailbox.TestProxyFile.test_read -*graalpython.lib-python.3.test.test_mailbox.TestProxyFile.test_readline -*graalpython.lib-python.3.test.test_mailbox.TestProxyFile.test_readlines -*graalpython.lib-python.3.test.test_mailbox.TestProxyFile.test_seek_and_tell +test.test_mailbox.MaildirTestCase.test_empty_maildir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.MaildirTestCase.test_nonempty_maildir_both @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.MaildirTestCase.test_nonempty_maildir_cur @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.MaildirTestCase.test_nonempty_maildir_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.MiscTestCase.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_add_8bit_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_add_StringIO_warns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_add_binary_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_add_binary_nonascii_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_add_doesnt_rewrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_add_invalid_8bit_bytes_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_add_nonascii_StringIO_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_add_nonascii_string_header_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_add_text_file_warns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_add_that_raises_leaves_mailbox_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_discard @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_dump_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_get_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_get_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_get_file_can_be_closed_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_get_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_get_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_invalid_nonascii_header_as_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_iteritems @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_iterkeys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_itervalues @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_labels @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_lock_unlock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestBabyl.test_permissions_after_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_popitem_and_flush_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_set_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabyl.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabylMessage.test_all_eMM_attributes_exist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabylMessage.test_become_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabylMessage.test_explain_to @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabylMessage.test_initialize_incorrectly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabylMessage.test_initialize_with_binary_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabylMessage.test_initialize_with_eMM @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabylMessage.test_initialize_with_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabylMessage.test_initialize_with_nothing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabylMessage.test_initialize_with_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabylMessage.test_labels @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestBabylMessage.test_visible @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestFakeMailBox.test_closing_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_add_8bit_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_add_StringIO_warns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_add_and_remove_folders @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_add_binary_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_add_binary_nonascii_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_add_invalid_8bit_bytes_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_add_nonascii_StringIO_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_add_nonascii_string_header_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_add_text_file_warns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_add_that_raises_leaves_mailbox_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_discard @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_dump_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_get_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_get_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_get_file_can_be_closed_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_get_folder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_get_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_get_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_invalid_nonascii_header_as_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_issue2625 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_issue7627 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMH.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_iteritems @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_iterkeys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_itervalues @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_list_folders @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_lock_unlock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMH.test_pack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMH.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_popitem_and_flush_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_sequences @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_set_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMH.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMHMessage.test_all_eMM_attributes_exist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMHMessage.test_become_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMHMessage.test_explain_to @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMHMessage.test_initialize_incorrectly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMHMessage.test_initialize_with_binary_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMHMessage.test_initialize_with_eMM @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMHMessage.test_initialize_with_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMHMessage.test_initialize_with_nothing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMHMessage.test_initialize_with_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMHMessage.test_sequences @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_add_8bit_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_add_StringIO_warns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_add_and_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_add_binary_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_add_binary_nonascii_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_add_doesnt_rewrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_add_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_add_from_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_add_invalid_8bit_bytes_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_add_mbox_or_mmdf_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_add_nonascii_StringIO_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_add_nonascii_string_header_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_add_text_file_warns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_add_that_raises_leaves_mailbox_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_discard @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_dump_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_get_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_get_bytes_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_get_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_get_file_can_be_closed_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_get_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_get_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_get_string_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_invalid_nonascii_header_as_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_iteritems @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_iterkeys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_itervalues @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_lock_unlock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMMDF.test_open_close_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_permissions_after_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_popitem_and_flush_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_relock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMMDF.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_set_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDF.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDFMessage.test_all_eMM_attributes_exist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDFMessage.test_become_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDFMessage.test_explain_to @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDFMessage.test_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDFMessage.test_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDFMessage.test_initialize_incorrectly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDFMessage.test_initialize_with_binary_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDFMessage.test_initialize_with_eMM @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDFMessage.test_initialize_with_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDFMessage.test_initialize_with_nothing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDFMessage.test_initialize_with_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMMDFMessage.test_initialize_with_unixfrom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMailboxSuperclass.test_notimplemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildir.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_add_8bit_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_add_MM @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_add_StringIO_warns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_add_and_remove_folders @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildir.test_add_binary_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_add_binary_nonascii_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_add_invalid_8bit_bytes_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_add_nonascii_StringIO_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildir.test_add_nonascii_string_header_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildir.test_add_text_file_warns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_add_that_raises_leaves_mailbox_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildir.test_clean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildir.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_consistent_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_create_tmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildir.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_directory_in_folder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_discard @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_dump_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildir.test_file_permissions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_folder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildir.test_folder_file_perms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_get_MM @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_get_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_get_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_get_file_can_be_closed_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_get_folder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_get_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_get_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_initialize_existing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildir.test_initialize_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildir.test_invalid_nonascii_header_as_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_iteritems @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_iterkeys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_itervalues @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_list_folders @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildir.test_lock_unlock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildir.test_lookup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_popitem_and_flush_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_refresh @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_refresh_after_safety_period @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_reread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildir.test_set_MM @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_set_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildir.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMaildirMessage.test_all_eMM_attributes_exist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildirMessage.test_become_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildirMessage.test_date @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildirMessage.test_explain_to @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildirMessage.test_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildirMessage.test_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildirMessage.test_info_and_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildirMessage.test_initialize_incorrectly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildirMessage.test_initialize_with_binary_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildirMessage.test_initialize_with_eMM @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildirMessage.test_initialize_with_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildirMessage.test_initialize_with_nothing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildirMessage.test_initialize_with_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMaildirMessage.test_subdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_add_8bit_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_add_StringIO_warns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_add_and_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_add_binary_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_add_binary_nonascii_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_add_doesnt_rewrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_add_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_add_from_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_add_invalid_8bit_bytes_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_add_mbox_or_mmdf_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_add_nonascii_StringIO_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_add_nonascii_string_header_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_add_text_file_warns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_add_that_raises_leaves_mailbox_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_discard @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_dump_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_file_perms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMbox.test_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_get_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_get_bytes_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_get_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_get_file_can_be_closed_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_get_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_get_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_get_string_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_invalid_nonascii_header_as_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_iteritems @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_iterkeys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_itervalues @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_lock_unlock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMbox.test_message_separator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_open_close_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_permissions_after_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_popitem_and_flush_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_relock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailbox.TestMbox.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_set_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_terminating_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMbox.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMboxMessage.test_all_eMM_attributes_exist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMboxMessage.test_become_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMboxMessage.test_explain_to @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMboxMessage.test_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMboxMessage.test_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMboxMessage.test_initialize_incorrectly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMboxMessage.test_initialize_with_binary_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMboxMessage.test_initialize_with_eMM @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMboxMessage.test_initialize_with_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMboxMessage.test_initialize_with_nothing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMboxMessage.test_initialize_with_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMboxMessage.test_initialize_with_unixfrom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessage.test_all_eMM_attributes_exist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessage.test_become_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessage.test_explain_to @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessage.test_initialize_incorrectly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessage.test_initialize_with_binary_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessage.test_initialize_with_eMM @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessage.test_initialize_with_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessage.test_initialize_with_nothing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessage.test_initialize_with_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_babyl_to_babyl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_babyl_to_maildir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_babyl_to_mboxmmdf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_babyl_to_mh @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_maildir_to_babyl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_maildir_to_maildir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_maildir_to_mboxmmdf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_maildir_to_mh @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_mboxmmdf_to_babyl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_mboxmmdf_to_maildir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_mboxmmdf_to_mboxmmdf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_mboxmmdf_to_mh @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_mh_to_babyl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_mh_to_maildir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_mh_to_mboxmmdf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_mh_to_mh @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_plain_to_x @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_type_specific_attributes_removed_on_conversion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_x_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_x_to_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestMessageConversion.test_x_to_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestPartialFile.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestPartialFile.test_initialize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestPartialFile.test_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestPartialFile.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestPartialFile.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestPartialFile.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestPartialFile.test_seek_and_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestProxyFile.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestProxyFile.test_initialize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestProxyFile.test_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestProxyFile.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestProxyFile.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestProxyFile.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailbox.TestProxyFile.test_seek_and_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_mailcap.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_mailcap.txt index ba8468d268..1789c3201f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_mailcap.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_mailcap.txt @@ -1,9 +1,9 @@ -*graalpython.lib-python.3.test.test_mailcap.FindmatchTest.test_findmatch -*graalpython.lib-python.3.test.test_mailcap.FindmatchTest.test_test -*graalpython.lib-python.3.test.test_mailcap.FindmatchTest.test_unsafe_mailcap_input -*graalpython.lib-python.3.test.test_mailcap.GetcapsTest.test_mock_getcaps -*graalpython.lib-python.3.test.test_mailcap.GetcapsTest.test_system_mailcap -*graalpython.lib-python.3.test.test_mailcap.HelperFunctionTest.test_listmailcapfiles -*graalpython.lib-python.3.test.test_mailcap.HelperFunctionTest.test_lookup -*graalpython.lib-python.3.test.test_mailcap.HelperFunctionTest.test_readmailcapfile -*graalpython.lib-python.3.test.test_mailcap.HelperFunctionTest.test_subst +test.test_mailcap.FindmatchTest.test_findmatch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailcap.FindmatchTest.test_test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mailcap.FindmatchTest.test_unsafe_mailcap_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailcap.GetcapsTest.test_mock_getcaps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailcap.GetcapsTest.test_system_mailcap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailcap.HelperFunctionTest.test_listmailcapfiles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailcap.HelperFunctionTest.test_lookup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailcap.HelperFunctionTest.test_readmailcapfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mailcap.HelperFunctionTest.test_subst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_marshal.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_marshal.txt index 9293f07e1e..295472d563 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_marshal.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_marshal.txt @@ -1,62 +1,50 @@ -*graalpython.lib-python.3.test.test_marshal.BufferTestCase.test_array -*graalpython.lib-python.3.test.test_marshal.BufferTestCase.test_bytearray -*graalpython.lib-python.3.test.test_marshal.BufferTestCase.test_memoryview -*graalpython.lib-python.3.test.test_marshal.BugsTestCase.test_bad_reader -*graalpython.lib-python.3.test.test_marshal.BugsTestCase.test_bug_5888452 -*graalpython.lib-python.3.test.test_marshal.BugsTestCase.test_deterministic_sets -*graalpython.lib-python.3.test.test_marshal.BugsTestCase.test_eof -*graalpython.lib-python.3.test.test_marshal.BugsTestCase.test_exact_type_match -*graalpython.lib-python.3.test.test_marshal.BugsTestCase.test_fuzz -*graalpython.lib-python.3.test.test_marshal.BugsTestCase.test_invalid_longs -*graalpython.lib-python.3.test.test_marshal.BugsTestCase.test_large_marshal -*graalpython.lib-python.3.test.test_marshal.BugsTestCase.test_loads_recursion -*graalpython.lib-python.3.test.test_marshal.BugsTestCase.test_loads_reject_unicode_strings -*graalpython.lib-python.3.test.test_marshal.BugsTestCase.test_multiple_dumps_and_loads -*graalpython.lib-python.3.test.test_marshal.BugsTestCase.test_patch_873224 -*graalpython.lib-python.3.test.test_marshal.BugsTestCase.test_recursion_limit -*graalpython.lib-python.3.test.test_marshal.BugsTestCase.test_version_argument -*graalpython.lib-python.3.test.test_marshal.CAPI_TestCase.test_read_last_object_from_file -*graalpython.lib-python.3.test.test_marshal.CAPI_TestCase.test_read_long_from_file -*graalpython.lib-python.3.test.test_marshal.CAPI_TestCase.test_read_object_from_file -*graalpython.lib-python.3.test.test_marshal.CAPI_TestCase.test_read_short_from_file -*graalpython.lib-python.3.test.test_marshal.CAPI_TestCase.test_write_long_to_file -*graalpython.lib-python.3.test.test_marshal.CAPI_TestCase.test_write_object_to_file -*graalpython.lib-python.3.test.test_marshal.CodeTestCase.test_different_filenames -*graalpython.lib-python.3.test.test_marshal.CodeTestCase.test_many_codeobjects -*graalpython.lib-python.3.test.test_marshal.CodeTestCase.test_same_filename_used -*graalpython.lib-python.3.test.test_marshal.CompatibilityTestCase.test0To3 -*graalpython.lib-python.3.test.test_marshal.CompatibilityTestCase.test1To3 -*graalpython.lib-python.3.test.test_marshal.CompatibilityTestCase.test2To3 -*graalpython.lib-python.3.test.test_marshal.CompatibilityTestCase.test3To3 -*graalpython.lib-python.3.test.test_marshal.ContainerTestCase.test_dict -*graalpython.lib-python.3.test.test_marshal.ContainerTestCase.test_empty_frozenset_singleton -*graalpython.lib-python.3.test.test_marshal.ContainerTestCase.test_list -*graalpython.lib-python.3.test.test_marshal.ContainerTestCase.test_sets -*graalpython.lib-python.3.test.test_marshal.ContainerTestCase.test_tuple -*graalpython.lib-python.3.test.test_marshal.ExceptionTestCase.test_exceptions -*graalpython.lib-python.3.test.test_marshal.FloatTestCase.test_floats -*graalpython.lib-python.3.test.test_marshal.InstancingTestCase.testBytes -*graalpython.lib-python.3.test.test_marshal.InstancingTestCase.testDict -*graalpython.lib-python.3.test.test_marshal.InstancingTestCase.testFloat -*graalpython.lib-python.3.test.test_marshal.InstancingTestCase.testFrozenSet -*graalpython.lib-python.3.test.test_marshal.InstancingTestCase.testInt -*graalpython.lib-python.3.test.test_marshal.InstancingTestCase.testList -*graalpython.lib-python.3.test.test_marshal.InstancingTestCase.testRecursion -*graalpython.lib-python.3.test.test_marshal.InstancingTestCase.testSet -*graalpython.lib-python.3.test.test_marshal.InstancingTestCase.testStr -*graalpython.lib-python.3.test.test_marshal.InstancingTestCase.testTuple -*graalpython.lib-python.3.test.test_marshal.IntTestCase.test_bool -*graalpython.lib-python.3.test.test_marshal.IntTestCase.test_int64 -*graalpython.lib-python.3.test.test_marshal.IntTestCase.test_ints -*graalpython.lib-python.3.test.test_marshal.InterningTestCase.testIntern -*graalpython.lib-python.3.test.test_marshal.InterningTestCase.testNoIntern -*graalpython.lib-python.3.test.test_marshal.LargeValuesTestCase.test_bytearray -*graalpython.lib-python.3.test.test_marshal.LargeValuesTestCase.test_bytes -*graalpython.lib-python.3.test.test_marshal.LargeValuesTestCase.test_frozenset -*graalpython.lib-python.3.test.test_marshal.LargeValuesTestCase.test_list -*graalpython.lib-python.3.test.test_marshal.LargeValuesTestCase.test_set -*graalpython.lib-python.3.test.test_marshal.LargeValuesTestCase.test_str -*graalpython.lib-python.3.test.test_marshal.LargeValuesTestCase.test_tuple -*graalpython.lib-python.3.test.test_marshal.StringTestCase.test_bytes -*graalpython.lib-python.3.test.test_marshal.StringTestCase.test_string -*graalpython.lib-python.3.test.test_marshal.StringTestCase.test_unicode +test.test_marshal.BufferTestCase.test_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.BufferTestCase.test_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.BufferTestCase.test_memoryview @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.BugsTestCase.test_bad_reader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.BugsTestCase.test_bug_5888452 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.BugsTestCase.test_deterministic_sets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.BugsTestCase.test_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.BugsTestCase.test_exact_type_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.BugsTestCase.test_fuzz @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.BugsTestCase.test_large_marshal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.BugsTestCase.test_loads_recursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.BugsTestCase.test_loads_reject_unicode_strings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.BugsTestCase.test_multiple_dumps_and_loads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.BugsTestCase.test_patch_873224 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.BugsTestCase.test_recursion_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.BugsTestCase.test_version_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Disabled since code object comparison is not stable for us +!test.test_marshal.CodeTestCase.test_code +test.test_marshal.CodeTestCase.test_different_filenames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.CodeTestCase.test_many_codeobjects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.CompatibilityTestCase.test0To3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.CompatibilityTestCase.test1To3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.CompatibilityTestCase.test2To3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.CompatibilityTestCase.test3To3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.ContainerTestCase.test_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.ContainerTestCase.test_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.ContainerTestCase.test_sets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.ContainerTestCase.test_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.ExceptionTestCase.test_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.FloatTestCase.test_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.InstancingTestCase.testBytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.InstancingTestCase.testDict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.InstancingTestCase.testFloat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.InstancingTestCase.testFrozenSet @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.InstancingTestCase.testInt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.InstancingTestCase.testList @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Disabled since code object comparison is not stable for us +!test.test_marshal.InstancingTestCase.testModule +test.test_marshal.InstancingTestCase.testRecursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.InstancingTestCase.testSet @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.InstancingTestCase.testStr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.InstancingTestCase.testTuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.IntTestCase.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.IntTestCase.test_int64 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.IntTestCase.test_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.InterningTestCase.testIntern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.InterningTestCase.testNoIntern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.StringTestCase.test_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.StringTestCase.test_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_marshal.StringTestCase.test_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_math.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_math.txt index 55be586118..b91ce5d51f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_math.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_math.txt @@ -1,71 +1,70 @@ -*graalpython.lib-python.3.test.test_math.IsCloseTests.test_asymmetry -*graalpython.lib-python.3.test.test_math.IsCloseTests.test_decimals -*graalpython.lib-python.3.test.test_math.IsCloseTests.test_eight_decimal_places -*graalpython.lib-python.3.test.test_math.IsCloseTests.test_fractions -*graalpython.lib-python.3.test.test_math.IsCloseTests.test_identical -*graalpython.lib-python.3.test.test_math.IsCloseTests.test_identical_infinite -*graalpython.lib-python.3.test.test_math.IsCloseTests.test_inf_ninf_nan -*graalpython.lib-python.3.test.test_math.IsCloseTests.test_integers -*graalpython.lib-python.3.test.test_math.IsCloseTests.test_near_zero -*graalpython.lib-python.3.test.test_math.IsCloseTests.test_negative_tolerances -*graalpython.lib-python.3.test.test_math.IsCloseTests.test_zero_tolerance -*graalpython.lib-python.3.test.test_math.MathTests.testAcos -*graalpython.lib-python.3.test.test_math.MathTests.testAcosh -*graalpython.lib-python.3.test.test_math.MathTests.testAsin -*graalpython.lib-python.3.test.test_math.MathTests.testAsinh -*graalpython.lib-python.3.test.test_math.MathTests.testAtan -*graalpython.lib-python.3.test.test_math.MathTests.testAtan2 -*graalpython.lib-python.3.test.test_math.MathTests.testAtanh -*graalpython.lib-python.3.test.test_math.MathTests.testCeil -*graalpython.lib-python.3.test.test_math.MathTests.testComb -*graalpython.lib-python.3.test.test_math.MathTests.testConstants -*graalpython.lib-python.3.test.test_math.MathTests.testCopysign -*graalpython.lib-python.3.test.test_math.MathTests.testCos -*graalpython.lib-python.3.test.test_math.MathTests.testCosh -*graalpython.lib-python.3.test.test_math.MathTests.testDegrees -*graalpython.lib-python.3.test.test_math.MathTests.testDist -*graalpython.lib-python.3.test.test_math.MathTests.testExp -*graalpython.lib-python.3.test.test_math.MathTests.testFabs -*graalpython.lib-python.3.test.test_math.MathTests.testFactorial -*graalpython.lib-python.3.test.test_math.MathTests.testFactorialHugeInputs -*graalpython.lib-python.3.test.test_math.MathTests.testFactorialNonIntegers -*graalpython.lib-python.3.test.test_math.MathTests.testFloor -*graalpython.lib-python.3.test.test_math.MathTests.testFmod -*graalpython.lib-python.3.test.test_math.MathTests.testFrexp -*graalpython.lib-python.3.test.test_math.MathTests.testFsum -*graalpython.lib-python.3.test.test_math.MathTests.testGcd -*graalpython.lib-python.3.test.test_math.MathTests.testHypot -*graalpython.lib-python.3.test.test_math.MathTests.testIsfinite -*graalpython.lib-python.3.test.test_math.MathTests.testIsinf -*graalpython.lib-python.3.test.test_math.MathTests.testIsnan -*graalpython.lib-python.3.test.test_math.MathTests.testIsqrt -*graalpython.lib-python.3.test.test_math.MathTests.testLdexp -*graalpython.lib-python.3.test.test_math.MathTests.testLog -*graalpython.lib-python.3.test.test_math.MathTests.testLog10 -*graalpython.lib-python.3.test.test_math.MathTests.testLog1p -*graalpython.lib-python.3.test.test_math.MathTests.testLog2 -*graalpython.lib-python.3.test.test_math.MathTests.testLog2Exact -*graalpython.lib-python.3.test.test_math.MathTests.testModf -*graalpython.lib-python.3.test.test_math.MathTests.testPerm -*graalpython.lib-python.3.test.test_math.MathTests.testPow -*graalpython.lib-python.3.test.test_math.MathTests.testRadians -*graalpython.lib-python.3.test.test_math.MathTests.testRemainder -*graalpython.lib-python.3.test.test_math.MathTests.testSin -*graalpython.lib-python.3.test.test_math.MathTests.testSinh -*graalpython.lib-python.3.test.test_math.MathTests.testSqrt -*graalpython.lib-python.3.test.test_math.MathTests.testTan -*graalpython.lib-python.3.test.test_math.MathTests.testTanh -*graalpython.lib-python.3.test.test_math.MathTests.testTanhSign -*graalpython.lib-python.3.test.test_math.MathTests.test_exceptions -*graalpython.lib-python.3.test.test_math.MathTests.test_inf_constant -*graalpython.lib-python.3.test.test_math.MathTests.test_input_exceptions -*graalpython.lib-python.3.test.test_math.MathTests.test_issue39871 -*graalpython.lib-python.3.test.test_math.MathTests.test_lcm -*graalpython.lib-python.3.test.test_math.MathTests.test_math_dist_leak -*graalpython.lib-python.3.test.test_math.MathTests.test_mtestfile -*graalpython.lib-python.3.test.test_math.MathTests.test_nan_constant -*graalpython.lib-python.3.test.test_math.MathTests.test_nextafter -*graalpython.lib-python.3.test.test_math.MathTests.test_prod -*graalpython.lib-python.3.test.test_math.MathTests.test_testfile -*graalpython.lib-python.3.test.test_math.MathTests.test_trunc -*graalpython.lib-python.3.test.test_math.MathTests.test_ulp +DocFileCase.ieee754_txt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.IsCloseTests.test_asymmetry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.IsCloseTests.test_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.IsCloseTests.test_eight_decimal_places @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.IsCloseTests.test_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.IsCloseTests.test_identical @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.IsCloseTests.test_identical_infinite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.IsCloseTests.test_inf_ninf_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.IsCloseTests.test_integers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.IsCloseTests.test_near_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.IsCloseTests.test_negative_tolerances @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.IsCloseTests.test_zero_tolerance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testAcos @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testAcosh @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testAsin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testAsinh @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testAtan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testAtan2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testAtanh @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testCeil @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testComb @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testConstants @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testCopysign @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testCos @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testCosh @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testDegrees @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testDist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testExp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testFabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testFactorial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testFactorialNonIntegers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testFloor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testFmod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testFrexp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testFsum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testGcd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testHypot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testIsfinite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testIsinf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testIsnan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testIsqrt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testLdexp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testLog @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testLog10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testLog1p @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testLog2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testLog2Exact @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testModf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testPerm @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testPow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testRadians @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testRemainder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testSin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testSinh @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testSqrt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testTan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testTanh @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.testTanhSign @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.test_inf_constant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.test_input_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.test_issue39871 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.test_lcm @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.test_math_dist_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.test_mtestfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.test_nan_constant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.test_nextafter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.test_prod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.test_testfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.test_trunc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_math.MathTests.test_ulp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_memoryio.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_memoryio.txt index 22a3ec7966..ba276925e7 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_memoryio.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_memoryio.txt @@ -1,166 +1,157 @@ -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.testInit -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.testRead -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.testReadNoArgs -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.testSeek -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.testTell -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_bytes_array -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_cow_mutable -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_cow_setstate -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_cow_truncate -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_cow_write -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_detach -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_flags -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_flush -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_getbuffer -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_getstate -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_getvalue -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_init -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_instance_dict_leak -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_issue5449 -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_iterator -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_overseek -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_pickling -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_read -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_read1 -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_readinto -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_readline -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_readlines -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_relative_seek -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_seek -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_setstate -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_sizeof -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_subclassing -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_tell -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_truncate -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_unicode -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_write -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_writelines -*graalpython.lib-python.3.test.test_memoryio.CBytesIOTest.test_writelines_error -*graalpython.lib-python.3.test.test_memoryio.CStringIOPickleTest.test_issue5265 -*graalpython.lib-python.3.test.test_memoryio.CStringIOPickleTest.test_newline_argument -*graalpython.lib-python.3.test.test_memoryio.CStringIOPickleTest.test_newline_cr -*graalpython.lib-python.3.test.test_memoryio.CStringIOPickleTest.test_newline_crlf -*graalpython.lib-python.3.test.test_memoryio.CStringIOPickleTest.test_newline_default -*graalpython.lib-python.3.test.test_memoryio.CStringIOPickleTest.test_newline_empty -*graalpython.lib-python.3.test.test_memoryio.CStringIOPickleTest.test_newline_lf -*graalpython.lib-python.3.test.test_memoryio.CStringIOPickleTest.test_newline_none -*graalpython.lib-python.3.test.test_memoryio.CStringIOPickleTest.test_newlines_property -*graalpython.lib-python.3.test.test_memoryio.CStringIOPickleTest.test_relative_seek -*graalpython.lib-python.3.test.test_memoryio.CStringIOPickleTest.test_textio_properties -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.testInit -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.testRead -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.testReadNoArgs -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.testSeek -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.testTell -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_detach -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_flags -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_flush -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_getstate -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_getvalue -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_init -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_instance_dict_leak -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_issue5265 -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_iterator -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_lone_surrogates -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_newline_argument -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_newline_cr -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_newline_crlf -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_newline_default -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_newline_empty -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_newline_lf -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_newline_none -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_newlines_property -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_overseek -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_pickling -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_read -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_readline -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_readlines -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_relative_seek -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_seek -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_setstate -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_subclassing -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_tell -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_textio_properties -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_truncate -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_widechar -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_write -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_writelines -*graalpython.lib-python.3.test.test_memoryio.CStringIOTest.test_writelines_error -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.testInit -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.testRead -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.testReadNoArgs -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.testSeek -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.testTell -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_bytes_array -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_detach -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_flags -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_flush -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_getbuffer -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_getvalue -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_init -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_instance_dict_leak -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_issue5449 -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_iterator -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_overseek -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_pickling -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_read -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_read1 -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_readinto -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_readline -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_readlines -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_relative_seek -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_seek -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_subclassing -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_tell -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_truncate -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_unicode -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_write -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_writelines -*graalpython.lib-python.3.test.test_memoryio.PyBytesIOTest.test_writelines_error -*graalpython.lib-python.3.test.test_memoryio.PyStringIOPickleTest.test_issue5265 -*graalpython.lib-python.3.test.test_memoryio.PyStringIOPickleTest.test_newline_argument -*graalpython.lib-python.3.test.test_memoryio.PyStringIOPickleTest.test_newline_cr -*graalpython.lib-python.3.test.test_memoryio.PyStringIOPickleTest.test_newline_crlf -*graalpython.lib-python.3.test.test_memoryio.PyStringIOPickleTest.test_newline_default -*graalpython.lib-python.3.test.test_memoryio.PyStringIOPickleTest.test_newline_empty -*graalpython.lib-python.3.test.test_memoryio.PyStringIOPickleTest.test_newline_lf -*graalpython.lib-python.3.test.test_memoryio.PyStringIOPickleTest.test_newline_none -*graalpython.lib-python.3.test.test_memoryio.PyStringIOPickleTest.test_newlines_property -*graalpython.lib-python.3.test.test_memoryio.PyStringIOPickleTest.test_relative_seek -*graalpython.lib-python.3.test.test_memoryio.PyStringIOPickleTest.test_textio_properties -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.testInit -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.testRead -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.testReadNoArgs -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.testSeek -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.testTell -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_detach -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_flags -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_flush -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_getvalue -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_init -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_instance_dict_leak -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_issue5265 -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_iterator -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_lone_surrogates -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_newline_argument -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_newline_cr -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_newline_crlf -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_newline_default -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_newline_empty -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_newline_lf -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_newline_none -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_newlines_property -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_overseek -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_pickling -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_read -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_readline -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_readlines -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_relative_seek -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_seek -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_subclassing -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_tell -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_textio_properties -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_truncate -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_write -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_writelines -*graalpython.lib-python.3.test.test_memoryio.PyStringIOTest.test_writelines_error +test.test_memoryio.CBytesIOTest.testInit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.testRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.testReadNoArgs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.testSeek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.testTell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_bytes_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_detach @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_getstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_getvalue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_instance_dict_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_issue5449 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_overseek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_read1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_readinto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_relative_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_setstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_truncate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_writelines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CBytesIOTest.test_writelines_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_issue5265 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_newline_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_newline_cr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_newline_crlf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_newline_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_newline_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_newline_lf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_newline_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_newlines_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_relative_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_textio_properties @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.testInit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.testRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.testReadNoArgs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.testSeek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.testTell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_detach @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_getstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_getvalue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_instance_dict_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_issue5265 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_newline_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_newline_cr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_newline_crlf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_newline_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_newline_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_newline_lf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_newline_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_newlines_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_overseek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_relative_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_setstate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_textio_properties @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_truncate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_widechar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_writelines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.CStringIOTest.test_writelines_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.testInit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.testRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.testReadNoArgs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.testSeek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.testTell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_bytes_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_detach @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_getvalue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_instance_dict_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_issue5449 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_overseek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_read1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_readinto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_relative_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_truncate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_writelines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_writelines_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_issue5265 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_newline_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_newline_cr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_newline_crlf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_newline_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_newline_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_newline_lf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_newline_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_newlines_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_relative_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_textio_properties @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.testInit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.testRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.testReadNoArgs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.testSeek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.testTell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_detach @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_getvalue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_instance_dict_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_issue5265 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_newline_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_newline_cr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_newline_crlf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_newline_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_newline_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_newline_lf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_newline_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_newlines_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_overseek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_relative_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_textio_properties @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_truncate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_writelines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_memoryio.PyStringIOTest.test_writelines_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_memoryview.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_memoryview.txt index 7b45dadaba..2d0ae77c90 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_memoryview.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_memoryview.txt @@ -1,140 +1,107 @@ -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_attributes_readonly -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_attributes_writable -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_compare -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_contextmanager -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_delitem -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_gc -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_getbuf_fail -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_getbuffer -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_getitem -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_hash -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_hash_writable -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_issue22668 -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_iter -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_release -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_reversed -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_setitem_readonly -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_setitem_writable -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_tobytes -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_tolist -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_toreadonly -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_weakref -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceSliceTest.test_writable_readonly -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_attributes_readonly -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_attributes_writable -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_compare -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_contextmanager -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_delitem -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_gc -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_getbuf_fail -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_getbuffer -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_getitem -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_hash -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_hash_writable -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_issue22668 -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_iter -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_refs -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_release -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_reversed -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_setitem_readonly -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_setitem_writable -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_tobytes -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_tolist -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_toreadonly -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_weakref -*graalpython.lib-python.3.test.test_memoryview.ArrayMemorySliceTest.test_writable_readonly -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_array_assign -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_attributes_readonly -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_attributes_writable -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_compare -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_contextmanager -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_delitem -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_gc -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_getbuf_fail -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_getbuffer -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_getitem -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_hash -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_hash_writable -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_issue22668 -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_iter -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_release -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_reversed -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_setitem_readonly -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_setitem_writable -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_tobytes -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_tolist -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_toreadonly -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_weakref -*graalpython.lib-python.3.test.test_memoryview.ArrayMemoryviewTest.test_writable_readonly -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_attributes_readonly -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_attributes_writable -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_compare -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_contextmanager -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_delitem -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_gc -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_getbuf_fail -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_getbuffer -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_getitem -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_hash -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_hash_writable -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_issue22668 -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_iter -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_release -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_reversed -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_setitem_readonly -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_setitem_writable -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_tobytes -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_tolist -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_toreadonly -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_weakref -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceSliceTest.test_writable_readonly -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_attributes_readonly -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_attributes_writable -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_compare -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_contextmanager -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_delitem -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_gc -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_getbuf_fail -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_getbuffer -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_getitem -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_hash -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_hash_writable -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_issue22668 -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_iter -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_refs -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_release -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_reversed -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_setitem_readonly -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_setitem_writable -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_tobytes -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_tolist -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_toreadonly -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_weakref -*graalpython.lib-python.3.test.test_memoryview.BytesMemorySliceTest.test_writable_readonly -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_attributes_readonly -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_attributes_writable -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_compare -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_constructor -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_contextmanager -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_delitem -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_gc -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_getbuf_fail -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_getbuffer -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_getitem -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_hash -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_hash_writable -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_issue22668 -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_iter -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_release -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_reversed -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_setitem_readonly -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_setitem_writable -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_tobytes -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_tolist -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_toreadonly -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_weakref -*graalpython.lib-python.3.test.test_memoryview.BytesMemoryviewTest.test_writable_readonly -*graalpython.lib-python.3.test.test_memoryview.OtherTest.test_copy -*graalpython.lib-python.3.test.test_memoryview.OtherTest.test_ctypes_cast -*graalpython.lib-python.3.test.test_memoryview.OtherTest.test_memoryview_hex -*graalpython.lib-python.3.test.test_memoryview.OtherTest.test_pickle +test.test_memoryview.ArrayMemorySliceSliceTest.test_attributes_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_contextmanager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_getbuf_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_hash_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_issue22668 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_release @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_reversed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_setitem_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_tobytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_toreadonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceTest.test_attributes_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceTest.test_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceTest.test_contextmanager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceTest.test_getbuf_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceTest.test_hash_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceTest.test_issue22668 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceTest.test_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceTest.test_release @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceTest.test_reversed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceTest.test_setitem_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceTest.test_tobytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemorySliceTest.test_toreadonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemoryviewTest.test_array_assign @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemoryviewTest.test_attributes_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemoryviewTest.test_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemoryviewTest.test_contextmanager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemoryviewTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemoryviewTest.test_getbuf_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemoryviewTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemoryviewTest.test_hash_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemoryviewTest.test_issue22668 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemoryviewTest.test_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemoryviewTest.test_release @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemoryviewTest.test_reversed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemoryviewTest.test_setitem_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemoryviewTest.test_tobytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.ArrayMemoryviewTest.test_toreadonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_attributes_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_attributes_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_contextmanager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_getbuf_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_getbuffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_hash_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_issue22668 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_release @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_reversed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_setitem_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_setitem_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_tobytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_tolist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_toreadonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceSliceTest.test_writable_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_attributes_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_attributes_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_contextmanager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_getbuf_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_getbuffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_hash_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_issue22668 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_release @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_reversed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_setitem_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_setitem_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_tobytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_tolist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_toreadonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemorySliceTest.test_writable_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_attributes_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_attributes_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_contextmanager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_getbuf_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_getbuffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_hash_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_issue22668 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_release @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_reversed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_setitem_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_setitem_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_tobytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_tolist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_toreadonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.BytesMemoryviewTest.test_writable_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.OtherTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.OtherTest.test_memoryview_hex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_memoryview.OtherTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_metaclass.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_metaclass.txt index 3171ca7474..cf97f2c833 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_metaclass.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_metaclass.txt @@ -1 +1 @@ -*graalpython.lib-python.3.test.test_metaclass.TestMain.test_main +DocTestCase.test.test_metaclass.__test__.doctests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_mimetypes.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_mimetypes.txt index 65e10543fc..99df647003 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_mimetypes.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_mimetypes.txt @@ -1,22 +1,21 @@ -*graalpython.lib-python.3.test.test_mimetypes.MimeTypesTestCase.test_case_sensitivity -*graalpython.lib-python.3.test.test_mimetypes.MimeTypesTestCase.test_data_urls -*graalpython.lib-python.3.test.test_mimetypes.MimeTypesTestCase.test_default_data -*graalpython.lib-python.3.test.test_mimetypes.MimeTypesTestCase.test_encoding -*graalpython.lib-python.3.test.test_mimetypes.MimeTypesTestCase.test_file_parsing -*graalpython.lib-python.3.test.test_mimetypes.MimeTypesTestCase.test_filename_with_url_delimiters -*graalpython.lib-python.3.test.test_mimetypes.MimeTypesTestCase.test_guess_all_types -*graalpython.lib-python.3.test.test_mimetypes.MimeTypesTestCase.test_guess_known_extensions -*graalpython.lib-python.3.test.test_mimetypes.MimeTypesTestCase.test_init_reinitializes -*graalpython.lib-python.3.test.test_mimetypes.MimeTypesTestCase.test_init_stability -*graalpython.lib-python.3.test.test_mimetypes.MimeTypesTestCase.test_keywords_args_api -*graalpython.lib-python.3.test.test_mimetypes.MimeTypesTestCase.test_non_standard_types -*graalpython.lib-python.3.test.test_mimetypes.MimeTypesTestCase.test_path_like_ob -*graalpython.lib-python.3.test.test_mimetypes.MimeTypesTestCase.test_preferred_extension -*graalpython.lib-python.3.test.test_mimetypes.MimeTypesTestCase.test_read_mime_types -*graalpython.lib-python.3.test.test_mimetypes.MimetypesCliTestCase.test_guess_extension -*graalpython.lib-python.3.test.test_mimetypes.MimetypesCliTestCase.test_guess_type -*graalpython.lib-python.3.test.test_mimetypes.MimetypesCliTestCase.test_help_option -*graalpython.lib-python.3.test.test_mimetypes.MimetypesCliTestCase.test_invalid_option -*graalpython.lib-python.3.test.test_mimetypes.MiscTestCase.test__all__ -*graalpython.lib-python.3.test.test_mimetypes.Win32MimeTypesTestCase.test_registry_accelerator -*graalpython.lib-python.3.test.test_mimetypes.Win32MimeTypesTestCase.test_registry_parsing +test.test_mimetypes.MimeTypesTestCase.test_case_sensitivity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.MimeTypesTestCase.test_data_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.MimeTypesTestCase.test_default_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.MimeTypesTestCase.test_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.MimeTypesTestCase.test_file_parsing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.MimeTypesTestCase.test_filename_with_url_delimiters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.MimeTypesTestCase.test_guess_all_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.MimeTypesTestCase.test_guess_known_extensions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mimetypes.MimeTypesTestCase.test_init_reinitializes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.MimeTypesTestCase.test_init_stability @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.MimeTypesTestCase.test_keywords_args_api @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.MimeTypesTestCase.test_non_standard_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.MimeTypesTestCase.test_path_like_ob @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.MimeTypesTestCase.test_preferred_extension @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.MimeTypesTestCase.test_read_mime_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.MimetypesCliTestCase.test_guess_extension @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.MimetypesCliTestCase.test_guess_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.MimetypesCliTestCase.test_help_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.MimetypesCliTestCase.test_invalid_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.MiscTestCase.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mimetypes.Win32MimeTypesTestCase.test_registry_parsing @ win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_minidom.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_minidom.txt index 66384bf0d2..7bdf442de7 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_minidom.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_minidom.txt @@ -1,128 +1,128 @@ -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testAAA -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testAAB -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testAddAttr -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testAltNewline -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testAppendChild -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testAppendChildFragment -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testAttrListItem -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testAttrListItemNS -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testAttrListItems -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testAttrListKeys -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testAttrListKeysNS -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testAttrListLength -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testAttrListValues -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testAttrList__getitem__ -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testAttrList__setitem__ -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testAttrModeSetsNonOptionalAttrs -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testAttrModeSetsParamsAsAttrs -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testAttributeRepr -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testBug0777884 -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testBug1433694 -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testChangeAttr -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testChildNodes -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testCloneAttributeDeep -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testCloneAttributeShallow -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testCloneDocumentDeep -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testCloneDocumentShallow -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testCloneDocumentTypeDeepNotOk -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testCloneDocumentTypeDeepOk -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testCloneDocumentTypeShallowNotOk -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testCloneDocumentTypeShallowOk -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testCloneElementDeep -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testCloneElementShallow -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testCloneNodeEntity -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testClonePIDeep -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testClonePIShallow -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testComment -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testContext -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testCreateAttributeNS -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testCreateElementNS -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testDeepcopiedDocument -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testDeleteAttr -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testDocRemoveChild -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testDocumentAsyncAttr -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testDocumentElement -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testElement -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testElementReprAndStr -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testElementReprAndStrUnicode -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testElementReprAndStrUnicodeNS -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testEmptyXMLNSValue -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testExceptionOnSpacesInXMLNSValue -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testFirstChild -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testGetAttrLength -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testGetAttrList -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testGetAttrValues -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testGetAttribute -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testGetAttributeNS -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testGetAttributeNode -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testGetElementsByTagName -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testGetElementsByTagNameNS -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testGetEmptyNodeListFromElementsByTagNameNS -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testHasAttribute -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testHasChildNodes -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testImportDocumentDeep -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testImportDocumentShallow -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testImportDocumentTypeDeep -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testImportDocumentTypeShallow -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testInsertBefore -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testInsertBeforeFragment -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testLegalChildren -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testNamedNodeMapSetItem -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testNodeListItem -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testNonZero -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testNormalize -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testNormalizeCombineAndNextSibling -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testNormalizeDeleteAndCombine -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testNormalizeDeleteWithNextSibling -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testNormalizeDeleteWithPrevSibling -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testNormalizeDeleteWithTwoNonTextSiblings -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testNormalizeRecursion -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testParents -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testParse -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testParseAttributeNamespaces -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testParseAttributes -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testParseElement -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testParseElementNamespaces -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testParseFromBinaryFile -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testParseFromTextFile -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testParseProcessingInstructions -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testParseString -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testPatch1094164 -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testPickledDocument -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testProcessingInstruction -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testProcessingInstructionNameError -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testProcessingInstructionRepr -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testRemoveAttr -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testRemoveAttrNS -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testRemoveAttributeNode -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testRemoveNamedItem -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testRemoveNamedItemNS -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testRenameAttribute -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testRenameElement -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testRenameOther -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testReplaceChildFragment -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testReplaceWholeText -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testSchemaType -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testSerializeCommentNodeWithDoubleHyphen -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testSetAttrValueandNodeValue -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testSetIdAttribute -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testSetIdAttributeNS -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testSetIdAttributeNode -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testSiblings -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testStandalone -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testTextNodeRepr -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testTextRepr -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testTooManyDocumentElements -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testUnlink -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testUserData -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testWholeText -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testWriteText -*graalpython.lib-python.3.test.test_minidom.MinidomTest.testWriteXML -*graalpython.lib-python.3.test.test_minidom.MinidomTest.test_cdata_parsing -*graalpython.lib-python.3.test.test_minidom.MinidomTest.test_minidom_attribute_order -*graalpython.lib-python.3.test.test_minidom.MinidomTest.test_toprettyxml_preserves_content_of_text_node -*graalpython.lib-python.3.test.test_minidom.MinidomTest.test_toprettyxml_with_adjacent_text_nodes -*graalpython.lib-python.3.test.test_minidom.MinidomTest.test_toprettyxml_with_attributes_ordered -*graalpython.lib-python.3.test.test_minidom.MinidomTest.test_toprettyxml_with_cdata -*graalpython.lib-python.3.test.test_minidom.MinidomTest.test_toprettyxml_with_text_nodes -*graalpython.lib-python.3.test.test_minidom.MinidomTest.test_toxml_with_attributes_ordered +test.test_minidom.MinidomTest.testAAA @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testAAB @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testAddAttr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testAltNewline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testAppendChild @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testAppendChildFragment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testAttrListItem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testAttrListItemNS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testAttrListItems @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testAttrListKeys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testAttrListKeysNS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testAttrListLength @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testAttrListValues @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testAttrList__getitem__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testAttrList__setitem__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testAttrModeSetsNonOptionalAttrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testAttrModeSetsParamsAsAttrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testAttributeRepr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testBug0777884 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testBug1433694 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testChangeAttr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testChildNodes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testCloneAttributeDeep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testCloneAttributeShallow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testCloneDocumentDeep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testCloneDocumentShallow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testCloneDocumentTypeDeepNotOk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testCloneDocumentTypeDeepOk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testCloneDocumentTypeShallowNotOk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testCloneDocumentTypeShallowOk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testCloneElementDeep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testCloneElementShallow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testCloneNodeEntity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testClonePIDeep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testClonePIShallow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testComment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testContext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testCreateAttributeNS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testCreateElementNS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testDeepcopiedDocument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testDeleteAttr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testDocRemoveChild @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testDocumentAsyncAttr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testDocumentElement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testElement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testElementReprAndStr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testElementReprAndStrUnicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testElementReprAndStrUnicodeNS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testEmptyXMLNSValue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testExceptionOnSpacesInXMLNSValue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testFirstChild @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testGetAttrLength @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testGetAttrList @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testGetAttrValues @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testGetAttribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testGetAttributeNS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testGetAttributeNode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testGetElementsByTagName @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testGetElementsByTagNameNS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testGetEmptyNodeListFromElementsByTagNameNS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testHasAttribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testHasChildNodes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testImportDocumentDeep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testImportDocumentShallow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testImportDocumentTypeDeep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testImportDocumentTypeShallow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testInsertBefore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testInsertBeforeFragment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testLegalChildren @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testNamedNodeMapSetItem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testNodeListItem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testNonZero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testNormalize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testNormalizeCombineAndNextSibling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testNormalizeDeleteAndCombine @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testNormalizeDeleteWithNextSibling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testNormalizeDeleteWithPrevSibling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testNormalizeDeleteWithTwoNonTextSiblings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testNormalizeRecursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testParents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testParse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testParseAttributeNamespaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testParseAttributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testParseElement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testParseElementNamespaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testParseFromBinaryFile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testParseFromTextFile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testParseProcessingInstructions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testParseString @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testPatch1094164 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testPickledDocument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testProcessingInstruction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testProcessingInstructionNameError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testProcessingInstructionRepr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testRemoveAttr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testRemoveAttrNS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testRemoveAttributeNode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testRemoveNamedItem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testRemoveNamedItemNS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testRenameAttribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testRenameElement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testRenameOther @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testReplaceChildFragment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testReplaceWholeText @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testSchemaType @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testSerializeCommentNodeWithDoubleHyphen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testSetAttrValueandNodeValue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testSetIdAttribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testSetIdAttributeNS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testSetIdAttributeNode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testSiblings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testStandalone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testTextNodeRepr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testTextRepr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testTooManyDocumentElements @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testUnlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testUserData @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testWholeText @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testWriteText @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.testWriteXML @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.test_cdata_parsing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.test_minidom_attribute_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.test_toprettyxml_preserves_content_of_text_node @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.test_toprettyxml_with_adjacent_text_nodes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.test_toprettyxml_with_attributes_ordered @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.test_toprettyxml_with_cdata @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.test_toprettyxml_with_text_nodes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_minidom.MinidomTest.test_toxml_with_attributes_ordered @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_mmap.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_mmap.txt index c14d171e24..2370950aa3 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_mmap.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_mmap.txt @@ -1,27 +1,23 @@ -*graalpython.lib-python.3.test.test_mmap.LargeMmapTests.test_around_2GB -*graalpython.lib-python.3.test.test_mmap.LargeMmapTests.test_around_4GB -*graalpython.lib-python.3.test.test_mmap.LargeMmapTests.test_large_offset -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_anonymous -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_bad_file_desc -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_basic -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_concat_repeat_exception -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_context_manager -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_context_manager_exception -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_crasher_on_windows -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_double_close -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_empty_file -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_entire_file -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_find_end -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_invalid_descriptor -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_length_0_large_offset -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_length_0_offset -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_madvise -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_prot_readonly -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_read_all -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_read_invalid_arg -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_resize_past_pos -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_sizeof -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_subclass -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_tagname -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_tougher_find -*graalpython.lib-python.3.test.test_mmap.MmapTests.test_write_returning_the_number_of_bytes_written +test.test_mmap.LargeMmapTests.test_large_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mmap.MmapTests.test_anonymous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mmap.MmapTests.test_bad_file_desc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mmap.MmapTests.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mmap.MmapTests.test_concat_repeat_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mmap.MmapTests.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mmap.MmapTests.test_context_manager_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mmap.MmapTests.test_double_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mmap.MmapTests.test_empty_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mmap.MmapTests.test_entire_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mmap.MmapTests.test_extended_set_del_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mmap.MmapTests.test_find_does_not_access_beyond_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mmap.MmapTests.test_find_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mmap.MmapTests.test_flush_return_value @ darwin-arm64,darwin-x86_64,win32-AMD64 +test.test_mmap.MmapTests.test_length_0_large_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mmap.MmapTests.test_length_0_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mmap.MmapTests.test_offset @ darwin-x86_64,linux-x86_64 +test.test_mmap.MmapTests.test_prot_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mmap.MmapTests.test_read_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mmap.MmapTests.test_read_invalid_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mmap.MmapTests.test_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_mmap.MmapTests.test_tougher_find @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_mmap.MmapTests.test_write_returning_the_number_of_bytes_written @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_module.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_module.txt index efa22e5188..dd4663185c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_module.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_module.txt @@ -1,68 +1,34 @@ -*graalpython.lib-python.3.test.test_module.ModuleTests.test_annotations_are_created_correctly -*graalpython.lib-python.3.test.test_module.ModuleTests.test_ascii_docstring -*graalpython.lib-python.3.test.test_module.ModuleTests.test_clear_dict_in_ref_cycle -*graalpython.lib-python.3.test.test_module.ModuleTests.test_descriptor_errors_propagate -*graalpython.lib-python.3.test.test_module.ModuleTests.test_dont_clear_dict -*graalpython.lib-python.3.test.test_module.ModuleTests.test_lazy_create_annotations -*graalpython.lib-python.3.test.test_module.ModuleTests.test_missing_getattr -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_dir -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_dir_errors -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_finalization_at_shutdown -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_getattr -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_getattr_errors -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_getattr_tricky -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_builtin -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_minimal -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_source -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_bare_loader -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_bare_loader_and_filename -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_bare_loader_but_no_name -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_filename_only -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_full_loader -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_full_loader_and_filename -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_full_loader_but_no_name -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_loader_as_None -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_name -*graalpython.lib-python.3.test.test_module.ModuleTests.test_module_repr_with_name_and_filename -*graalpython.lib-python.3.test.test_module.ModuleTests.test_no_docstring -*graalpython.lib-python.3.test.test_module.ModuleTests.test_reinit -*graalpython.lib-python.3.test.test_module.ModuleTests.test_setting_annotations -*graalpython.lib-python.3.test.test_module.ModuleTests.test_unicode_docstring -*graalpython.lib-python.3.test.test_module.ModuleTests.test_uninitialized -*graalpython.lib-python.3.test.test_module.ModuleTests.test_uninitialized_missing_getattr -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_annotations_are_created_correctly -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_annotations_getset_raises -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_ascii_docstring -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_clear_dict_in_ref_cycle -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_descriptor_errors_propagate -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_dont_clear_dict -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_lazy_create_annotations -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_missing_getattr -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_dir -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_dir_errors -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_finalization_at_shutdown -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_getattr -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_getattr_errors -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_getattr_tricky -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_repr_builtin -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_repr_minimal -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_repr_source -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_repr_with_bare_loader -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_repr_with_bare_loader_and_filename -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_repr_with_bare_loader_but_no_name -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_repr_with_filename_only -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_repr_with_full_loader -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_repr_with_full_loader_and_filename -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_repr_with_full_loader_but_no_name -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_repr_with_loader_as_None -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_repr_with_name -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_module_repr_with_name_and_filename -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_no_docstring -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_reinit -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_repeated_attribute_pops -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_setting_annotations -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_subclass_with_slots -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_unicode_docstring -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_uninitialized -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_uninitialized_missing_getattr -*graalpython.lib-python.3.test.test_module.__init__.ModuleTests.test_weakref +test.test_module.ModuleTests.test_annotations_are_created_correctly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_annotations_getset_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_ascii_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_descriptor_errors_propagate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_dont_clear_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_lazy_create_annotations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_missing_getattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_module_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_module_dir_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_module_getattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_module_getattr_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_module_getattr_tricky @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_module_repr_builtin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_module_repr_minimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_module_repr_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_module_repr_with_bare_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_module_repr_with_bare_loader_and_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_module_repr_with_bare_loader_but_no_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_module_repr_with_filename_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_module_repr_with_full_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_module_repr_with_full_loader_and_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_module_repr_with_full_loader_but_no_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_module_repr_with_loader_as_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_module_repr_with_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_module_repr_with_name_and_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_no_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_reinit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_repeated_attribute_pops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_setting_annotations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_subclass_with_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_unicode_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_uninitialized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_uninitialized_missing_getattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_module.ModuleTests.test_weakref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_modulefinder.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_modulefinder.txt new file mode 100644 index 0000000000..6c543a0a85 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_modulefinder.txt @@ -0,0 +1,3 @@ +# The following two try to read bytecode and fail randomly as our co_code is changing +!graalpython.lib-python.3.test.test_modulefinder.ModuleFinderTest.test_bytecode +!graalpython.lib-python.3.test.test_modulefinder.ModuleFinderTest.test_relative_imports_4 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_multibytecodec.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_multibytecodec.txt index cff3e4ec49..41a29f2bcf 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_multibytecodec.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_multibytecodec.txt @@ -1,8 +1,10 @@ -*graalpython.lib-python.3.test.test_multibytecodec.TestStateful.test_encode -*graalpython.lib-python.3.test.test_multibytecodec.Test_ISO2022.test_bug1572832 -*graalpython.lib-python.3.test.test_multibytecodec.Test_IncrementalDecoder.test_dbcs -*graalpython.lib-python.3.test.test_multibytecodec.Test_IncrementalDecoder.test_dbcs_keep_buffer -*graalpython.lib-python.3.test.test_multibytecodec.Test_IncrementalEncoder.test_issue5640 -*graalpython.lib-python.3.test.test_multibytecodec.Test_IncrementalEncoder.test_stateless -*graalpython.lib-python.3.test.test_multibytecodec.Test_IncrementalEncoder.test_subinterp -*graalpython.lib-python.3.test.test_multibytecodec.Test_MultibyteCodec.test_codingspec +test.test_multibytecodec.TestStateful.test_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_multibytecodec.Test_ISO2022.test_bug1572832 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_multibytecodec.Test_IncrementalDecoder.test_dbcs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_multibytecodec.Test_IncrementalDecoder.test_dbcs_keep_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_multibytecodec.Test_IncrementalEncoder.test_issue5640 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_multibytecodec.Test_IncrementalEncoder.test_stateless @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_multibytecodec.Test_MultibyteCodec.test_codingspec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_multibytecodec.Test_StreamWriter.test_gb18030 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_multibytecodec.Test_StreamWriter.test_streamwriter_strwrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_multibytecodec.Test_StreamWriter.test_utf_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_multiprocessing_main_handling.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_multiprocessing_main_handling.txt index df508fa6a6..fa8039f340 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_multiprocessing_main_handling.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_multiprocessing_main_handling.txt @@ -1,26 +1,12 @@ -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkCmdLineTest.test_basic_script -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkCmdLineTest.test_basic_script_no_suffix -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkCmdLineTest.test_directory -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkCmdLineTest.test_directory_compiled -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkCmdLineTest.test_ipython_workaround -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkCmdLineTest.test_module_in_package -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkCmdLineTest.test_module_in_package_in_zipfile -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkCmdLineTest.test_module_in_subpackage_in_zipfile -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkCmdLineTest.test_package -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkCmdLineTest.test_package_compiled -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkCmdLineTest.test_script_compiled -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkCmdLineTest.test_zipfile -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkCmdLineTest.test_zipfile_compiled -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_basic_script -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_basic_script_no_suffix -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_directory -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_directory_compiled -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_ipython_workaround -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_module_in_package -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_module_in_package_in_zipfile -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_module_in_subpackage_in_zipfile -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_package -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_package_compiled -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_script_compiled -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_zipfile -*graalpython.lib-python.3.test.test_multiprocessing_main_handling.ForkServerCmdLineTest.test_zipfile_compiled +!test.test_multiprocessing_main_handling.SpawnCmdLineTest.test_basic_script @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_multiprocessing_main_handling.SpawnCmdLineTest.test_basic_script_no_suffix @ darwin-arm64,linux-x86_64 +!test.test_multiprocessing_main_handling.SpawnCmdLineTest.test_directory @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_multiprocessing_main_handling.SpawnCmdLineTest.test_directory_compiled @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_multiprocessing_main_handling.SpawnCmdLineTest.test_ipython_workaround @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_multiprocessing_main_handling.SpawnCmdLineTest.test_module_in_package @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_multiprocessing_main_handling.SpawnCmdLineTest.test_module_in_package_in_zipfile @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_multiprocessing_main_handling.SpawnCmdLineTest.test_module_in_subpackage_in_zipfile @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_multiprocessing_main_handling.SpawnCmdLineTest.test_package @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_multiprocessing_main_handling.SpawnCmdLineTest.test_package_compiled @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_multiprocessing_main_handling.SpawnCmdLineTest.test_zipfile @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_multiprocessing_main_handling.SpawnCmdLineTest.test_zipfile_compiled @ darwin-arm64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_multiprocessing_spawn.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_multiprocessing_spawn.txt index e75f290139..83747affb1 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_multiprocessing_spawn.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_multiprocessing_spawn.txt @@ -1,297 +1,221 @@ -*test.test_multiprocessing_spawn.test_misc.MiscTestCase.test__all__ -*test.test_multiprocessing_spawn.test_misc.MiscTestCase.test_spawn_sys_executable_none_allows_import -*test.test_multiprocessing_spawn.test_misc.OtherTest.test_answer_challenge_auth_failure -*test.test_multiprocessing_spawn.test_misc.OtherTest.test_deliver_challenge_auth_failure -*test.test_multiprocessing_spawn.test_misc.SemLockTests.test_semlock_subclass -*test.test_multiprocessing_spawn.test_misc.TestCloseFds.test_closefd -*test.test_multiprocessing_spawn.test_misc.TestForkAwareThreadLock.test_lock -*test.test_multiprocessing_spawn.test_misc.TestIgnoreEINTR.test_ignore -*test.test_multiprocessing_spawn.test_misc.TestIgnoreEINTR.test_ignore_listener -*test.test_multiprocessing_spawn.test_misc.TestInitializers.test_manager_initializer -*test.test_multiprocessing_spawn.test_misc.TestInitializers.test_pool_initializer -*test.test_multiprocessing_spawn.test_misc.TestInternalDecorators.test_only_run_in_spawn_testsuite -*test.test_multiprocessing_spawn.test_misc.TestInvalidFamily.test_invalid_family -*test.test_multiprocessing_spawn.test_misc.TestInvalidFamily.test_invalid_family_win32 -*test.test_multiprocessing_spawn.test_misc.TestInvalidHandle.test_invalid_handles -*test.test_multiprocessing_spawn.test_misc.TestNamedResource.test_global_named_resource_spawn -*test.test_multiprocessing_spawn.test_misc.TestNoForkBomb.test_noforkbomb -*test.test_multiprocessing_spawn.test_misc.TestPoolNotLeakOnFailure.test_release_unused_processes -*test.test_multiprocessing_spawn.test_misc.TestResourceTracker.test_resource_tracker -*test.test_multiprocessing_spawn.test_misc.TestResourceTracker.test_resource_tracker_reused -*test.test_multiprocessing_spawn.test_misc.TestResourceTracker.test_too_long_name_resource -*test.test_multiprocessing_spawn.test_misc.TestSimpleQueue.test_close -*test.test_multiprocessing_spawn.test_misc.TestSimpleQueue.test_closed -*test.test_multiprocessing_spawn.test_misc.TestSimpleQueue.test_empty -*test.test_multiprocessing_spawn.test_misc.TestStartMethod.test_context -*test.test_multiprocessing_spawn.test_misc.TestStartMethod.test_context_check_module_types -*test.test_multiprocessing_spawn.test_misc.TestStartMethod.test_get_all -*test.test_multiprocessing_spawn.test_misc.TestStartMethod.test_nested_startmethod -*test.test_multiprocessing_spawn.test_misc.TestStartMethod.test_preload_resources -*test.test_multiprocessing_spawn.test_misc.TestStartMethod.test_set_get -*test.test_multiprocessing_spawn.test_misc.TestStdinBadfiledescriptor.test_flushing -*test.test_multiprocessing_spawn.test_misc.TestStdinBadfiledescriptor.test_pool_in_process -*test.test_multiprocessing_spawn.test_misc.TestStdinBadfiledescriptor.test_queue_in_process -*test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_array -*test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_barrier -*test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_bounded_semaphore -*test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_condition -*test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_dict -*test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_event -*test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_joinable_queue -*test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_list -*test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_namespace -*test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_pool -*test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_queue -*test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_rlock -*test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_semaphore -*test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_value -*test.test_multiprocessing_spawn.test_misc.TestTimeouts.test_timeout -*test.test_multiprocessing_spawn.test_misc.TestWait.test_neg_timeout -*test.test_multiprocessing_spawn.test_misc.TestWait.test_wait -*test.test_multiprocessing_spawn.test_misc.TestWait.test_wait_integer -*test.test_multiprocessing_spawn.test_misc.TestWait.test_wait_slow -*test.test_multiprocessing_spawn.test_misc.TestWait.test_wait_socket -*test.test_multiprocessing_spawn.test_misc.TestWait.test_wait_socket_slow -*test.test_multiprocessing_spawn.test_misc.TestWait.test_wait_timeout -*test.test_multiprocessing_spawn.test_misc._TestImportStar.test_import -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestArray.test_array -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestArray.test_array_from_size -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestArray.test_getobj_getlock_obj -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestArray.test_rawarray -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_abort -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_abort_and_reset -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_action -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_barrier -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_barrier_10 -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_default_timeout -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_reset -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_single_thread -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_thousand -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_timeout -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_wait_return -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestCondition.test_notify -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestCondition.test_notify_all -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestCondition.test_notify_n -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestCondition.test_timeout -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestCondition.test_wait_result -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestCondition.test_waitfor -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestCondition.test_waitfor_timeout -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestConnection.test_connection -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestConnection.test_context -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestConnection.test_duplex_false -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestConnection.test_fd_transfer -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestConnection.test_large_fd_transfer -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestConnection.test_missing_fd_transfer -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestConnection.test_sendbytes -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestConnection.test_spawn_close -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestEvent.test_event -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestEvent.test_repr -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestFinalize.test_finalize -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestFinalize.test_thread_safety -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestHeap.test_free_from_gc -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestListener.test_abstract_socket -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestListener.test_context -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestListener.test_multiple_bind -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestListenerClient.test_issue14725 -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestListenerClient.test_issue16955 -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestListenerClient.test_listener_client -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestLock.test_lock -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestLock.test_lock_context -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestLock.test_rlock -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestLogging.test_enable_logging -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestLogging.test_level -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestManagerRestart.test_rapid_restart -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPicklingConnections.test_access -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPicklingConnections.test_pickling -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoll.test_boundaries -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoll.test_dont_merge -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoll.test_empty_string -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoll.test_strings -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPollEintr.test_poll_eintr -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_apply -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_async -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_async_timeout -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_context -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_empty_iterable -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_enter -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_imap -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_imap_handle_iterable_exception -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_imap_unordered -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_imap_unordered_handle_iterable_exception -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_make_pool -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map_async -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map_async_callbacks -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map_chunksize -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map_handle_iterable_exception -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map_no_failfast -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map_unplicklable -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_release_task_refs -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_resource_warning -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_starmap -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_starmap_async -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_terminate -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_traceback -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_wrapped_exception -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoolWorkerErrors.test_async_error_callback -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoolWorkerErrors.test_unpickleable_result -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoolWorkerLifetime.test_pool_maxtasksperchild_invalid -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoolWorkerLifetime.test_pool_worker_lifetime -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoolWorkerLifetime.test_pool_worker_lifetime_early_close -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoolWorkerLifetime.test_worker_finalization_via_atexit_handler_of_multiprocessing -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_active_children -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_args_argument -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_child_fd_inflation -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_close -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_cpu_count -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_current -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_daemon_argument -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_error_on_stdio_flush_1 -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_error_on_stdio_flush_2 -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_forkserver_sigint -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_forkserver_sigkill -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_kill -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_lose_target_ref -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_parent_process -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_parent_process_attributes -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_process -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_process_mainthread_native_id -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_recursion -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_sentinel -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_set_executable -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_terminate -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_wait_for_threads -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_closed_queue_put_get_exceptions -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_fork -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_get -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_no_import_lock_contention -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_put -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_qsize -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_queue_feeder_donot_stop_onexc -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_queue_feeder_on_queue_feeder_error -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_task_done -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_timeout -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSemaphore.test_bounded_semaphore -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSemaphore.test_semaphore -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSemaphore.test_timeout -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSharedCTypes.test_copy -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSharedCTypes.test_sharedctypes -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSharedCTypes.test_synchronize -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSharedMemory.test_invalid_shared_memory_cration -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSharedMemory.test_shared_memory_ShareableList_basics -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSharedMemory.test_shared_memory_ShareableList_pickling -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSharedMemory.test_shared_memory_ShareableList_pickling_dead_object -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSharedMemory.test_shared_memory_SharedMemoryManager_basics -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSharedMemory.test_shared_memory_SharedMemoryManager_reuses_resource_tracker -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSharedMemory.test_shared_memory_SharedMemoryServer_ignores_sigint -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSharedMemory.test_shared_memory_across_processes -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSharedMemory.test_shared_memory_basics -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSharedMemory.test_shared_memory_cleaned_after_process_termination -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSharedMemory.test_shared_memory_pickle_unpickle -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSharedMemory.test_shared_memory_pickle_unpickle_dead_object -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSharedMemory.test_shared_memory_recreate -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSubclassingProcess.test_stderr_flush -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSubclassingProcess.test_subclassing -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestSubclassingProcess.test_sys_exit -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestValue.test_getobj_getlock -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestValue.test_rawvalue -*test.test_multiprocessing_spawn.test_processes.WithProcessesTestValue.test_value -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_abort -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_abort_and_reset -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_action -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_barrier -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_barrier_10 -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_default_timeout -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_reset -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_single_thread -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_thousand -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_timeout -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_wait_return -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestCondition.test_notify -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestCondition.test_notify_all -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestCondition.test_notify_n -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestCondition.test_timeout -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestCondition.test_wait_result -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestCondition.test_waitfor -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestCondition.test_waitfor_timeout -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestConnection.test_connection -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestConnection.test_context -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestConnection.test_duplex_false -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestConnection.test_fd_transfer -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestConnection.test_large_fd_transfer -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestConnection.test_missing_fd_transfer -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestConnection.test_sendbytes -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestConnection.test_spawn_close -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestEvent.test_event -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestEvent.test_repr -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestListenerClient.test_issue14725 -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestListenerClient.test_issue16955 -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestListenerClient.test_listener_client -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestLock.test_lock_context -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestLock.test_rlock -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestManagerRestart.test_rapid_restart -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPoll.test_boundaries -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPoll.test_dont_merge -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPoll.test_empty_string -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPoll.test_strings -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_apply -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_async -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_async_timeout -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_context -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_empty_iterable -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_enter -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_imap -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_imap_handle_iterable_exception -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_imap_unordered -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_imap_unordered_handle_iterable_exception -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_make_pool -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_map -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_map_async -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_map_async_callbacks -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_map_chunksize -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_map_handle_iterable_exception -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_map_no_failfast -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_map_unplicklable -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_release_task_refs -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_resource_warning -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_starmap -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_starmap_async -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_terminate -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_traceback -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_wrapped_exception -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_active_children -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_args_argument -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_child_fd_inflation -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_close -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_cpu_count -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_current -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_daemon_argument -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_error_on_stdio_flush_1 -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_error_on_stdio_flush_2 -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_forkserver_sigint -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_forkserver_sigkill -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_kill -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_lose_target_ref -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_many_processes -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_parent_process -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_parent_process_attributes -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_process -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_process_mainthread_native_id -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_recursion -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_sentinel -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_set_executable -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_terminate -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_wait_for_threads -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_closed_queue_put_get_exceptions -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_fork -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_get -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_no_import_lock_contention -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_put -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_qsize -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_queue_feeder_donot_stop_onexc -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_queue_feeder_on_queue_feeder_error -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_task_done -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_timeout -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestSemaphore.test_bounded_semaphore -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestSemaphore.test_semaphore -*test.test_multiprocessing_spawn.test_threads.WithThreadsTestSemaphore.test_timeout +test.test_multiprocessing_spawn.test_misc.MiscTestCase.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.MiscTestCase.test_spawn_sys_executable_none_allows_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.OtherTest.test_answer_challenge_auth_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.OtherTest.test_deliver_challenge_auth_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.SemLockTests.test_semlock_subclass @ linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestForkAwareThreadLock.test_lock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestIgnoreEINTR.test_ignore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestIgnoreEINTR.test_ignore_listener @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestInternalDecorators.test_only_run_in_spawn_testsuite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestInvalidFamily.test_invalid_family @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestInvalidHandle.test_invalid_handles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestNamedResource.test_global_named_resource_spawn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestNoForkBomb.test_noforkbomb @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestPoolNotLeakOnFailure.test_release_unused_processes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestResourceTracker.test_resource_tracker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestResourceTracker.test_resource_tracker_reused @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +# The following tests rely on weakrefs for semaphore cleanup +!test.test_multiprocessing_spawn.test_misc.TestResourceTracker.test_resource_tracker_sigint +!test.test_multiprocessing_spawn.test_misc.TestResourceTracker.test_resource_tracker_sigkill +!test.test_multiprocessing_spawn.test_misc.TestResourceTracker.test_resource_tracker_sigterm +test.test_multiprocessing_spawn.test_misc.TestResourceTracker.test_too_long_name_resource @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSimpleQueue.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSimpleQueue.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestStartMethod.test_get_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestStartMethod.test_nested_startmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestStdinBadfiledescriptor.test_flushing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestStdinBadfiledescriptor.test_pool_in_process @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestStdinBadfiledescriptor.test_queue_in_process @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_barrier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_bounded_semaphore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_condition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_event @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_joinable_queue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_pool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_queue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_rlock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_semaphore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestTimeouts.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestWait.test_neg_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestWait.test_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestWait.test_wait_slow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestWait.test_wait_socket @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestWait.test_wait_socket_slow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestWait.test_wait_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_misc._TestImportStar.test_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestArray.test_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestArray.test_array_from_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestArray.test_getobj_getlock_obj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestArray.test_rawarray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_abort @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_abort_and_reset @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_action @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_barrier @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_barrier_10 @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_default_timeout @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_reset @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_single_thread @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_thousand @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_timeout @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestBarrier.test_wait_return @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestCondition.test_notify @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestCondition.test_notify_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestCondition.test_notify_n @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestCondition.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestConnection.test_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestConnection.test_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestConnection.test_duplex_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestConnection.test_sendbytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestConnection.test_spawn_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestEvent.test_event @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestEvent.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestListener.test_abstract_socket @ linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestListener.test_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestListener.test_multiple_bind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestListenerClient.test_issue14725 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestListenerClient.test_issue16955 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestListenerClient.test_listener_client @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestLock.test_lock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestLock.test_lock_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestLock.test_rlock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestLogging.test_enable_logging @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestLogging.test_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestManagerRestart.test_rapid_restart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoll.test_boundaries @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoll.test_dont_merge @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoll.test_empty_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoll.test_strings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPollEintr.test_poll_eintr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_apply @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_async @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_async_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_empty_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +!test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_enter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_imap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_imap_handle_iterable_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_imap_unordered @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_imap_unordered_handle_iterable_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_make_pool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map_async @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map_async_callbacks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map_chunksize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map_handle_iterable_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map_no_failfast @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map_unplicklable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_starmap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_starmap_async @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_terminate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_wrapped_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoolWorkerErrors.test_async_error_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoolWorkerErrors.test_unpickleable_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoolWorkerLifetime.test_pool_maxtasksperchild_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoolWorkerLifetime.test_pool_worker_lifetime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoolWorkerLifetime.test_pool_worker_lifetime_early_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoolWorkerLifetime.test_worker_finalization_via_atexit_handler_of_multiprocessing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_active_children @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_args_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_child_fd_inflation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_cpu_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_current @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_daemon_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_error_on_stdio_flush_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_error_on_stdio_flush_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_kill @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_parent_process @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_parent_process_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_process @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_recursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_sentinel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_set_executable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_terminate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_wait_for_threads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_closed_queue_put_get_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_fork @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_no_import_lock_contention @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_put @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_qsize @ linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_queue_feeder_donot_stop_onexc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_queue_feeder_on_queue_feeder_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_task_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestSemaphore.test_bounded_semaphore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestSemaphore.test_semaphore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestSemaphore.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestSubclassingProcess.test_stderr_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestSubclassingProcess.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_abort @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_abort_and_reset @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_action @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_barrier @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_barrier_10 @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_default_timeout @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_reset @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_single_thread @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_thousand @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_timeout @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestBarrier.test_wait_return @ darwin-arm64,darwin-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestCondition.test_notify @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestCondition.test_notify_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestCondition.test_notify_n @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestCondition.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestConnection.test_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestConnection.test_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestConnection.test_duplex_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestConnection.test_spawn_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestEvent.test_event @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestEvent.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestListenerClient.test_issue14725 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestListenerClient.test_issue16955 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestListenerClient.test_listener_client @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestLock.test_lock_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestLock.test_rlock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestManagerRestart.test_rapid_restart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPoll.test_boundaries @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPoll.test_dont_merge @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPoll.test_empty_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPoll.test_strings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_apply @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_async @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_async_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_empty_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_enter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_imap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_imap_unordered @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_make_pool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_map @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_map_async @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_map_async_callbacks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_map_chunksize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_map_no_failfast @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_starmap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_starmap_async @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +# transiently fails +!test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_terminate +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_active_children @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_args_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_cpu_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_error_on_stdio_flush_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_error_on_stdio_flush_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_process @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_recursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_closed_queue_put_get_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_fork @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_no_import_lock_contention @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_put @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_qsize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_task_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestSemaphore.test_bounded_semaphore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestSemaphore.test_semaphore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_named_expressions.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_named_expressions.txt index 73849ac838..3d93477e23 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_named_expressions.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_named_expressions.txt @@ -1,67 +1,65 @@ -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_01 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_02 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_03 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_04 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_05 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_06 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_07 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_08 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_09 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_10 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_11 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_12 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_13 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_14 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_15 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_16 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_17 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_18 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_01 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_02 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_03 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_04 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_06 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_07 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_08 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_09 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_10 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_11 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_12 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_13 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_14 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_15 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_16 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_17 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_comprehension_iterable_expression -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_in_class_body -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_list_comprehension_iterable_expression -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_rebinding_comprehension_inner_loop -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_rebinding_list_comprehension_inner_loop -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_rebinding_set_comprehension_inner_loop -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_set_comprehension_iterable_expression -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_global_scope -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_global_scope_no_global_keyword -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_nonlocal_scope -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_nonlocal_scope_no_nonlocal_keyword -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_01 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_02 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_03 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_04 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_05 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_06 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_07 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_08 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_09 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_10 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_11 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_17 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_18 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_19 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_20 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_21 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_22 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_23 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_24 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_25 -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_in_genexp -*graalpython.lib-python.3.test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_variable_reuse_in_comprehensions +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_01 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_02 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_03 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_04 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_05 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_06 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_07 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_08 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_09 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_11 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_12 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_13 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_14 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_15 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_16 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_17 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_18 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_01 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_02 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_03 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_04 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_06 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_07 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_08 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_09 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_11 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_12 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_13 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_14 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_15 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_16 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_17 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_in_class_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_list_comprehension_iterable_expression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_rebinding_list_comprehension_inner_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_rebinding_set_comprehension_inner_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_set_comprehension_iterable_expression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_global_scope @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_global_scope_no_global_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_nonlocal_scope @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_nonlocal_scope_no_nonlocal_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_01 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_02 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_03 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_04 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_05 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_06 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_07 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_08 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_09 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_11 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_17 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_18 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_19 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_20 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_21 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_22 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_23 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_24 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_25 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_in_genexp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_variable_reuse_in_comprehensions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_netrc.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_netrc.txt index b8cbc0ba3f..c5e81ec28f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_netrc.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_netrc.txt @@ -1,29 +1,22 @@ -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_comment_after_machine_line -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_comment_after_machine_line_hash_only -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_comment_after_machine_line_no_space -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_comment_at_end_of_machine_line -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_comment_at_end_of_machine_line_no_space -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_comment_at_end_of_machine_line_pass_has_hash -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_comment_before_machine_line -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_comment_before_machine_line_hash_only -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_comment_before_machine_line_no_space -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_default -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_file_not_found_explicit -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_file_not_found_in_home -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_home_not_set -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_invalid_tokens -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_macros -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_optional_tokens -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_password_with_internal_hash -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_password_with_leading_hash -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_password_with_trailing_hash -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_security -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_token_value_escape -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_token_value_internal_hash -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_token_value_leading_hash -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_token_value_non_ascii -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_token_value_quotes -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_token_value_trailing_hash -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_token_value_whitespace -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_toplevel_non_ordered_tokens -*graalpython.lib-python.3.test.test_netrc.NetrcTestCase.test_toplevel_tokens +test.test_netrc.NetrcTestCase.test_comment_after_machine_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_comment_after_machine_line_hash_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_comment_after_machine_line_no_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_comment_at_end_of_machine_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_comment_at_end_of_machine_line_no_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_comment_at_end_of_machine_line_pass_has_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_comment_before_machine_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_comment_before_machine_line_hash_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_comment_before_machine_line_no_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_invalid_tokens @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_macros @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_optional_tokens @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_security @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_netrc.NetrcTestCase.test_token_value_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_token_value_internal_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_token_value_leading_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_token_value_non_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_token_value_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_token_value_trailing_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_token_value_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_toplevel_non_ordered_tokens @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_netrc.NetrcTestCase.test_toplevel_tokens @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_nntplib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_nntplib.txt index 2f68594579..a74ebb3f54 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_nntplib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_nntplib.txt @@ -1,71 +1,71 @@ -*graalpython.lib-python.3.test.test_nntplib.CapsAfterLoginNNTPv2Tests.test_caps_only_after_login -*graalpython.lib-python.3.test.test_nntplib.LocalServerTests.test_starttls -*graalpython.lib-python.3.test.test_nntplib.MiscTests.test_decode_header -*graalpython.lib-python.3.test.test_nntplib.MiscTests.test_parse_datetime -*graalpython.lib-python.3.test.test_nntplib.MiscTests.test_parse_overview -*graalpython.lib-python.3.test.test_nntplib.MiscTests.test_parse_overview_fmt -*graalpython.lib-python.3.test.test_nntplib.MiscTests.test_ssl_support -*graalpython.lib-python.3.test.test_nntplib.MiscTests.test_unparse_datetime -*graalpython.lib-python.3.test.test_nntplib.MiscTests.test_unparse_datetime_legacy -*graalpython.lib-python.3.test.test_nntplib.MockSocketTests.test_bad_capabilities -*graalpython.lib-python.3.test.test_nntplib.MockSocketTests.test_bad_welcome -*graalpython.lib-python.3.test.test_nntplib.MockSocketTests.test_login_aborted -*graalpython.lib-python.3.test.test_nntplib.MockSocketTests.test_service_permanently_unavailable -*graalpython.lib-python.3.test.test_nntplib.MockSocketTests.test_service_temporarily_unavailable -*graalpython.lib-python.3.test.test_nntplib.MockSslTests.test_bad_capabilities -*graalpython.lib-python.3.test.test_nntplib.MockSslTests.test_bad_welcome -*graalpython.lib-python.3.test.test_nntplib.MockSslTests.test_login_aborted -*graalpython.lib-python.3.test.test_nntplib.MockSslTests.test_service_permanently_unavailable -*graalpython.lib-python.3.test.test_nntplib.MockSslTests.test_service_temporarily_unavailable -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_article -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_article_file -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_authinfo -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_body -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_body_file -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_caps -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_date -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_description -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_descriptions -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_group -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_head -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_head_file -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_help -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_ihave -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_last -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_list -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_newnews -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_next -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_over -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_post -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_quit -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_stat -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_too_long_lines -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_welcome -*graalpython.lib-python.3.test.test_nntplib.NNTPv1Tests.test_xover -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_article -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_article_file -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_authinfo -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_body -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_body_file -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_caps -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_date -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_description -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_descriptions -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_group -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_head -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_head_file -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_help -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_ihave -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_last -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_list -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_newnews -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_next -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_over -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_post -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_quit -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_stat -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_too_long_lines -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_welcome -*graalpython.lib-python.3.test.test_nntplib.NNTPv2Tests.test_xover -*graalpython.lib-python.3.test.test_nntplib.PublicAPITests.test_module_all_attribute -*graalpython.lib-python.3.test.test_nntplib.SendReaderNNTPv2Tests.test_we_are_in_reader_mode_after_connect +test.test_nntplib.CapsAfterLoginNNTPv2Tests.test_caps_only_after_login @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.LocalServerTests.test_starttls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_nntplib.MiscTests.test_decode_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.MiscTests.test_parse_datetime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.MiscTests.test_parse_overview @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.MiscTests.test_parse_overview_fmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.MiscTests.test_ssl_support @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.MiscTests.test_unparse_datetime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.MiscTests.test_unparse_datetime_legacy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.MockSocketTests.test_bad_capabilities @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.MockSocketTests.test_bad_welcome @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.MockSocketTests.test_login_aborted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.MockSocketTests.test_service_permanently_unavailable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.MockSocketTests.test_service_temporarily_unavailable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.MockSslTests.test_bad_capabilities @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.MockSslTests.test_bad_welcome @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.MockSslTests.test_login_aborted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.MockSslTests.test_service_permanently_unavailable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.MockSslTests.test_service_temporarily_unavailable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_article @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_article_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_authinfo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_body_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_caps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_date @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_description @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_descriptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_head @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_head_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_ihave @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_last @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_newnews @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_next @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_over @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_post @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_quit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_stat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_too_long_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_welcome @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv1Tests.test_xover @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_article @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_article_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_authinfo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_body_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_caps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_date @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_description @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_descriptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_head @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_head_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_ihave @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_last @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_newnews @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_next @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_over @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_post @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_quit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_stat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_too_long_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_welcome @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.NNTPv2Tests.test_xover @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.PublicAPITests.test_module_all_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_nntplib.SendReaderNNTPv2Tests.test_we_are_in_reader_mode_after_connect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ntpath.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ntpath.txt index 1daa154b33..7f1fc4defd 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ntpath.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ntpath.txt @@ -1,74 +1,63 @@ -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_abspath -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_abspath_issue3426 -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_commonprefix -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_exists -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_exists_fd -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_expandvars -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_expandvars_nonascii -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_filetime -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_getsize -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_import -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_isdir -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_isfile -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_join_errors -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_no_argument -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_nonascii_abspath -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_normcase -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_normpath_issue106242 -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_normpath_issue5827 -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_realpath -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_relpath_errors -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_samefile -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_samefile_on_link -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_samefile_on_symlink -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_sameopenfile -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_samestat -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_samestat_on_link -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_samestat_on_symlink -*graalpython.lib-python.3.test.test_ntpath.NtCommonTest.test_splitdrive -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_abspath -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_basename -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_commonpath -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_dirname -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_expanduser -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_expandvars -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_isabs -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_isdir -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_islink -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_ismount -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_join -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_lexists -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_normcase -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_normpath -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_realpath -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_relpath -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_split -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_splitdrive -*graalpython.lib-python.3.test.test_ntpath.PathLikeTests.test_path_splitext -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_abspath -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_commonpath -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_commonprefix -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_expanduser -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_expandvars -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_expandvars_nonascii -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_isabs -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_ismount -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_join -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_normpath -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_nt_helpers -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_realpath_basic -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_realpath_broken_symlinks -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_realpath_curdir -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_realpath_cwd -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_realpath_nul -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_realpath_pardir -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_realpath_relative -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_realpath_strict -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_realpath_symlink_loops -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_realpath_symlink_loops_strict -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_realpath_symlink_prefix -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_relpath -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_sameopenfile -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_split -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_splitdrive -*graalpython.lib-python.3.test.test_ntpath.TestNtpath.test_splitext +test.test_ntpath.NtCommonTest.test_abspath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_abspath_issue3426 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_commonprefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_exists_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_expandvars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_expandvars_nonascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_filetime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_getsize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_isdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_isfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_join_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_no_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_nonascii_abspath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_normcase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_normpath_issue106242 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_normpath_issue5827 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_realpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_relpath_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_samefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_samefile_on_link @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ntpath.NtCommonTest.test_samefile_on_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_sameopenfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_samestat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_samestat_on_link @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ntpath.NtCommonTest.test_samestat_on_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.NtCommonTest.test_splitdrive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.PathLikeTests.test_path_abspath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.PathLikeTests.test_path_basename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.PathLikeTests.test_path_commonpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.PathLikeTests.test_path_dirname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.PathLikeTests.test_path_expanduser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.PathLikeTests.test_path_expandvars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.PathLikeTests.test_path_isabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.PathLikeTests.test_path_isdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.PathLikeTests.test_path_islink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.PathLikeTests.test_path_ismount @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.PathLikeTests.test_path_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.PathLikeTests.test_path_lexists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.PathLikeTests.test_path_normcase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_normpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.PathLikeTests.test_path_realpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.PathLikeTests.test_path_relpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.PathLikeTests.test_path_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.PathLikeTests.test_path_splitdrive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.PathLikeTests.test_path_splitext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.TestNtpath.test_commonpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.TestNtpath.test_commonprefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.TestNtpath.test_expanduser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.TestNtpath.test_expandvars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.TestNtpath.test_expandvars_nonascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.TestNtpath.test_isabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.TestNtpath.test_ismount @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.TestNtpath.test_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.TestNtpath.test_normpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.TestNtpath.test_realpath_curdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.TestNtpath.test_realpath_pardir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.TestNtpath.test_relpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.TestNtpath.test_sameopenfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.TestNtpath.test_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.TestNtpath.test_splitdrive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ntpath.TestNtpath.test_splitext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_numeric_tower.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_numeric_tower.txt index 87fc438155..20b563dea3 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_numeric_tower.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_numeric_tower.txt @@ -1,9 +1,9 @@ -*graalpython.lib-python.3.test.test_numeric_tower.ComparisonTest.test_complex -*graalpython.lib-python.3.test.test_numeric_tower.ComparisonTest.test_mixed_comparisons -*graalpython.lib-python.3.test.test_numeric_tower.HashTest.test_binary_floats -*graalpython.lib-python.3.test.test_numeric_tower.HashTest.test_bools -*graalpython.lib-python.3.test.test_numeric_tower.HashTest.test_complex -*graalpython.lib-python.3.test.test_numeric_tower.HashTest.test_decimals -*graalpython.lib-python.3.test.test_numeric_tower.HashTest.test_fractions -*graalpython.lib-python.3.test.test_numeric_tower.HashTest.test_hash_normalization -*graalpython.lib-python.3.test.test_numeric_tower.HashTest.test_integers +test.test_numeric_tower.ComparisonTest.test_complex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_numeric_tower.ComparisonTest.test_mixed_comparisons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_numeric_tower.HashTest.test_binary_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_numeric_tower.HashTest.test_bools @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_numeric_tower.HashTest.test_complex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_numeric_tower.HashTest.test_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_numeric_tower.HashTest.test_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_numeric_tower.HashTest.test_hash_normalization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_numeric_tower.HashTest.test_integers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_opcache.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_opcache.txt index 1c6740d0b4..3fc983addd 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_opcache.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_opcache.txt @@ -1,26 +1,26 @@ -*graalpython.lib-python.3.test.test_opcache.TestCallCache.test_too_many_defaults_0 -*graalpython.lib-python.3.test.test_opcache.TestCallCache.test_too_many_defaults_1 -*graalpython.lib-python.3.test.test_opcache.TestCallCache.test_too_many_defaults_2 -*graalpython.lib-python.3.test.test_opcache.TestLoadAttrCache.test_descriptor_added_after_optimization -*graalpython.lib-python.3.test.test_opcache.TestLoadAttrCache.test_load_borrowed_slot_should_not_crash -*graalpython.lib-python.3.test.test_opcache.TestLoadAttrCache.test_load_shadowing_slot_should_raise_type_error -*graalpython.lib-python.3.test.test_opcache.TestLoadAttrCache.test_metaclass_del_descriptor_after_optimization -*graalpython.lib-python.3.test.test_opcache.TestLoadAttrCache.test_metaclass_descriptor_added_after_optimization -*graalpython.lib-python.3.test.test_opcache.TestLoadAttrCache.test_metaclass_descriptor_shadows_class_attribute -*graalpython.lib-python.3.test.test_opcache.TestLoadAttrCache.test_metaclass_getattribute -*graalpython.lib-python.3.test.test_opcache.TestLoadAttrCache.test_metaclass_set_descriptor_after_optimization -*graalpython.lib-python.3.test.test_opcache.TestLoadAttrCache.test_metaclass_swap -*graalpython.lib-python.3.test.test_opcache.TestLoadAttrCache.test_store_borrowed_slot_should_not_crash -*graalpython.lib-python.3.test.test_opcache.TestLoadAttrCache.test_store_shadowing_slot_should_raise_type_error -*graalpython.lib-python.3.test.test_opcache.TestLoadAttrCache.test_type_descriptor_shadows_attribute_getset -*graalpython.lib-python.3.test.test_opcache.TestLoadAttrCache.test_type_descriptor_shadows_attribute_member -*graalpython.lib-python.3.test.test_opcache.TestLoadAttrCache.test_type_descriptor_shadows_attribute_method -*graalpython.lib-python.3.test.test_opcache.TestLoadMethodCache.test_descriptor_added_after_optimization -*graalpython.lib-python.3.test.test_opcache.TestLoadMethodCache.test_metaclass_del_descriptor_after_optimization -*graalpython.lib-python.3.test.test_opcache.TestLoadMethodCache.test_metaclass_descriptor_added_after_optimization -*graalpython.lib-python.3.test.test_opcache.TestLoadMethodCache.test_metaclass_descriptor_shadows_class_attribute -*graalpython.lib-python.3.test.test_opcache.TestLoadMethodCache.test_metaclass_getattribute -*graalpython.lib-python.3.test.test_opcache.TestLoadMethodCache.test_metaclass_set_descriptor_after_optimization -*graalpython.lib-python.3.test.test_opcache.TestLoadMethodCache.test_metaclass_swap -*graalpython.lib-python.3.test.test_opcache.TestLoadMethodCache.test_type_descriptor_shadows_attribute_member -*graalpython.lib-python.3.test.test_opcache.TestLoadMethodCache.test_type_descriptor_shadows_attribute_method +test.test_opcache.TestCallCache.test_too_many_defaults_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestCallCache.test_too_many_defaults_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestCallCache.test_too_many_defaults_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadAttrCache.test_descriptor_added_after_optimization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadAttrCache.test_load_borrowed_slot_should_not_crash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadAttrCache.test_load_shadowing_slot_should_raise_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadAttrCache.test_metaclass_del_descriptor_after_optimization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadAttrCache.test_metaclass_descriptor_added_after_optimization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadAttrCache.test_metaclass_descriptor_shadows_class_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadAttrCache.test_metaclass_getattribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadAttrCache.test_metaclass_set_descriptor_after_optimization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadAttrCache.test_metaclass_swap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadAttrCache.test_store_borrowed_slot_should_not_crash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadAttrCache.test_store_shadowing_slot_should_raise_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadAttrCache.test_type_descriptor_shadows_attribute_getset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadAttrCache.test_type_descriptor_shadows_attribute_member @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadAttrCache.test_type_descriptor_shadows_attribute_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadMethodCache.test_descriptor_added_after_optimization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadMethodCache.test_metaclass_del_descriptor_after_optimization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadMethodCache.test_metaclass_descriptor_added_after_optimization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadMethodCache.test_metaclass_descriptor_shadows_class_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadMethodCache.test_metaclass_getattribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadMethodCache.test_metaclass_set_descriptor_after_optimization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadMethodCache.test_metaclass_swap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadMethodCache.test_type_descriptor_shadows_attribute_member @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcache.TestLoadMethodCache.test_type_descriptor_shadows_attribute_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_opcodes.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_opcodes.txt index d7e7ae4844..bf381f89e4 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_opcodes.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_opcodes.txt @@ -1,9 +1,8 @@ -*graalpython.lib-python.3.test.test_opcodes.OpcodeTest.test_compare_function_objects -*graalpython.lib-python.3.test.test_opcodes.OpcodeTest.test_default_annotations_exist -*graalpython.lib-python.3.test.test_opcodes.OpcodeTest.test_do_not_recreate_annotations -*graalpython.lib-python.3.test.test_opcodes.OpcodeTest.test_modulo_of_string_subclasses -*graalpython.lib-python.3.test.test_opcodes.OpcodeTest.test_no_annotations_if_not_needed -*graalpython.lib-python.3.test.test_opcodes.OpcodeTest.test_raise_class_exceptions -*graalpython.lib-python.3.test.test_opcodes.OpcodeTest.test_setup_annotations_line -*graalpython.lib-python.3.test.test_opcodes.OpcodeTest.test_try_inside_for_loop -*graalpython.lib-python.3.test.test_opcodes.OpcodeTest.test_use_existing_annotations +test.test_opcodes.OpcodeTest.test_compare_function_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcodes.OpcodeTest.test_default_annotations_exist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcodes.OpcodeTest.test_do_not_recreate_annotations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcodes.OpcodeTest.test_modulo_of_string_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcodes.OpcodeTest.test_raise_class_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcodes.OpcodeTest.test_setup_annotations_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcodes.OpcodeTest.test_try_inside_for_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_opcodes.OpcodeTest.test_use_existing_annotations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_openpty.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_openpty.txt index f2c94c3983..259cd489fe 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_openpty.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_openpty.txt @@ -1 +1 @@ -*graalpython.lib-python.3.test.test_openpty.OpenptyTest.test +!test.test_openpty.OpenptyTest.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_operator.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_operator.txt index 096accd8d4..9b665a8bc8 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_operator.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_operator.txt @@ -1,94 +1,94 @@ -*graalpython.lib-python.3.test.test_operator.CCOperatorPickleTestCase.test_attrgetter -*graalpython.lib-python.3.test.test_operator.CCOperatorPickleTestCase.test_itemgetter -*graalpython.lib-python.3.test.test_operator.CCOperatorPickleTestCase.test_methodcaller -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test___all__ -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_abs -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_add -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_attrgetter -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_bitwise_and -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_bitwise_or -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_bitwise_xor -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_call -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_concat -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_contains -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_countOf -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_delitem -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_dunder_is_original -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_eq -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_floordiv -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_ge -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_getitem -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_gt -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_indexOf -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_inplace -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_invert -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_is -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_is_not -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_itemgetter -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_le -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_length_hint -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_lshift -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_lt -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_matmul -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_methodcaller -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_mod -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_mul -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_ne -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_neg -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_pos -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_pow -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_rshift -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_setitem -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_sub -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_truediv -*graalpython.lib-python.3.test.test_operator.COperatorTestCase.test_truth -*graalpython.lib-python.3.test.test_operator.CPyOperatorPickleTestCase.test_attrgetter -*graalpython.lib-python.3.test.test_operator.CPyOperatorPickleTestCase.test_itemgetter -*graalpython.lib-python.3.test.test_operator.CPyOperatorPickleTestCase.test_methodcaller -*graalpython.lib-python.3.test.test_operator.PyCOperatorPickleTestCase.test_attrgetter -*graalpython.lib-python.3.test.test_operator.PyCOperatorPickleTestCase.test_itemgetter -*graalpython.lib-python.3.test.test_operator.PyCOperatorPickleTestCase.test_methodcaller -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test___all__ -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_abs -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_add -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_attrgetter -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_bitwise_and -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_bitwise_or -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_bitwise_xor -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_call -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_concat -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_contains -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_countOf -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_delitem -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_dunder_is_original -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_eq -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_floordiv -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_ge -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_getitem -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_gt -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_indexOf -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_inplace -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_invert -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_is -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_is_not -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_itemgetter -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_le -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_length_hint -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_lshift -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_lt -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_matmul -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_methodcaller -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_mod -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_mul -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_ne -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_neg -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_pos -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_pow -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_rshift -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_setitem -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_sub -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_truediv -*graalpython.lib-python.3.test.test_operator.PyOperatorTestCase.test_truth -*graalpython.lib-python.3.test.test_operator.PyPyOperatorPickleTestCase.test_attrgetter -*graalpython.lib-python.3.test.test_operator.PyPyOperatorPickleTestCase.test_itemgetter -*graalpython.lib-python.3.test.test_operator.PyPyOperatorPickleTestCase.test_methodcaller +test.test_operator.CCOperatorPickleTestCase.test_attrgetter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.CCOperatorPickleTestCase.test_itemgetter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.CCOperatorPickleTestCase.test_methodcaller @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test___all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_abs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_attrgetter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_bitwise_and @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_bitwise_or @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_bitwise_xor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_concat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_countOf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_dunder_is_original @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_floordiv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_ge @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_gt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_indexOf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_inplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_invert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_is @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_is_not @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_itemgetter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_le @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_length_hint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_lshift @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_lt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_matmul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_methodcaller @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_mod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_ne @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_neg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_pos @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_pow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_rshift @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_sub @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_truediv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.COperatorTestCase.test_truth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.CPyOperatorPickleTestCase.test_attrgetter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.CPyOperatorPickleTestCase.test_itemgetter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.CPyOperatorPickleTestCase.test_methodcaller @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyCOperatorPickleTestCase.test_attrgetter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyCOperatorPickleTestCase.test_itemgetter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyCOperatorPickleTestCase.test_methodcaller @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test___all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_abs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_attrgetter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_bitwise_and @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_bitwise_or @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_bitwise_xor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_concat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_countOf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_dunder_is_original @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_floordiv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_ge @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_gt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_indexOf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_inplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_invert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_is @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_is_not @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_itemgetter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_le @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_length_hint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_lshift @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_lt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_matmul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_methodcaller @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_mod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_ne @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_neg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_pos @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_pow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_rshift @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_sub @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_truediv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyOperatorTestCase.test_truth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyPyOperatorPickleTestCase.test_attrgetter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyPyOperatorPickleTestCase.test_itemgetter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_operator.PyPyOperatorPickleTestCase.test_methodcaller @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_optparse.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_optparse.txt index 1bb232b121..2390bdc25e 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_optparse.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_optparse.txt @@ -1,153 +1,151 @@ -*graalpython.lib-python.3.test.test_optparse.MiscTestCase.test__all__ -*graalpython.lib-python.3.test.test_optparse.TestBool.test_bool_default -*graalpython.lib-python.3.test.test_optparse.TestBool.test_bool_false -*graalpython.lib-python.3.test.test_optparse.TestBool.test_bool_flicker_on_and_off -*graalpython.lib-python.3.test.test_optparse.TestBool.test_bool_true -*graalpython.lib-python.3.test.test_optparse.TestCallback.test_callback -*graalpython.lib-python.3.test.test_optparse.TestCallback.test_callback_help -*graalpython.lib-python.3.test.test_optparse.TestCallbackCheckAbbrev.test_abbrev_callback_expansion -*graalpython.lib-python.3.test.test_optparse.TestCallbackExtraArgs.test_callback_extra_args -*graalpython.lib-python.3.test.test_optparse.TestCallbackManyArgs.test_many_args -*graalpython.lib-python.3.test.test_optparse.TestCallbackMeddleArgs.test_callback_meddle_args -*graalpython.lib-python.3.test.test_optparse.TestCallbackMeddleArgs.test_callback_meddle_args_separator -*graalpython.lib-python.3.test.test_optparse.TestCallbackVarArgs.test_consume_separator_stop_at_option -*graalpython.lib-python.3.test.test_optparse.TestCallbackVarArgs.test_positional_arg_and_variable_args -*graalpython.lib-python.3.test.test_optparse.TestCallbackVarArgs.test_stop_at_invalid_option -*graalpython.lib-python.3.test.test_optparse.TestCallbackVarArgs.test_stop_at_option -*graalpython.lib-python.3.test.test_optparse.TestCallbackVarArgs.test_variable_args -*graalpython.lib-python.3.test.test_optparse.TestChoice.test_add_choice_option -*graalpython.lib-python.3.test.test_optparse.TestChoice.test_invalid_choice -*graalpython.lib-python.3.test.test_optparse.TestChoice.test_valid_choice -*graalpython.lib-python.3.test.test_optparse.TestConflict.test_conflict_error -*graalpython.lib-python.3.test.test_optparse.TestConflict.test_conflict_error_group -*graalpython.lib-python.3.test.test_optparse.TestConflict.test_no_such_conflict_handler -*graalpython.lib-python.3.test.test_optparse.TestConflictOverride.test_conflict_override_args -*graalpython.lib-python.3.test.test_optparse.TestConflictOverride.test_conflict_override_help -*graalpython.lib-python.3.test.test_optparse.TestConflictOverride.test_conflict_override_opts -*graalpython.lib-python.3.test.test_optparse.TestConflictResolve.test_conflict_resolve -*graalpython.lib-python.3.test.test_optparse.TestConflictResolve.test_conflict_resolve_help -*graalpython.lib-python.3.test.test_optparse.TestConflictResolve.test_conflict_resolve_long_opt -*graalpython.lib-python.3.test.test_optparse.TestConflictResolve.test_conflict_resolve_long_opts -*graalpython.lib-python.3.test.test_optparse.TestConflictResolve.test_conflict_resolve_short_opt -*graalpython.lib-python.3.test.test_optparse.TestConflictingDefaults.test_conflict_default -*graalpython.lib-python.3.test.test_optparse.TestConflictingDefaults.test_conflict_default_none -*graalpython.lib-python.3.test.test_optparse.TestCount.test_count_interspersed_args -*graalpython.lib-python.3.test.test_optparse.TestCount.test_count_no_interspersed_args -*graalpython.lib-python.3.test.test_optparse.TestCount.test_count_no_such_option -*graalpython.lib-python.3.test.test_optparse.TestCount.test_count_one -*graalpython.lib-python.3.test.test_optparse.TestCount.test_count_option_no_value -*graalpython.lib-python.3.test.test_optparse.TestCount.test_count_override_amount -*graalpython.lib-python.3.test.test_optparse.TestCount.test_count_override_quiet -*graalpython.lib-python.3.test.test_optparse.TestCount.test_count_overriding -*graalpython.lib-python.3.test.test_optparse.TestCount.test_count_overriding_default -*graalpython.lib-python.3.test.test_optparse.TestCount.test_count_three -*graalpython.lib-python.3.test.test_optparse.TestCount.test_count_three_apart -*graalpython.lib-python.3.test.test_optparse.TestCount.test_count_with_default -*graalpython.lib-python.3.test.test_optparse.TestCount.test_empty -*graalpython.lib-python.3.test.test_optparse.TestDefaultValues.test_basic_defaults -*graalpython.lib-python.3.test.test_optparse.TestDefaultValues.test_mixed_defaults_post -*graalpython.lib-python.3.test.test_optparse.TestDefaultValues.test_mixed_defaults_pre -*graalpython.lib-python.3.test.test_optparse.TestDefaultValues.test_process_default -*graalpython.lib-python.3.test.test_optparse.TestExpandDefaults.test_alt_expand -*graalpython.lib-python.3.test.test_optparse.TestExpandDefaults.test_default_none_1 -*graalpython.lib-python.3.test.test_optparse.TestExpandDefaults.test_default_none_2 -*graalpython.lib-python.3.test.test_optparse.TestExpandDefaults.test_float_default -*graalpython.lib-python.3.test.test_optparse.TestExpandDefaults.test_no_default -*graalpython.lib-python.3.test.test_optparse.TestExpandDefaults.test_no_expand -*graalpython.lib-python.3.test.test_optparse.TestExpandDefaults.test_option_default -*graalpython.lib-python.3.test.test_optparse.TestExpandDefaults.test_parser_default_1 -*graalpython.lib-python.3.test.test_optparse.TestExpandDefaults.test_parser_default_2 -*graalpython.lib-python.3.test.test_optparse.TestExtendAddActions.test_extend_add_action -*graalpython.lib-python.3.test.test_optparse.TestExtendAddActions.test_extend_add_action_normal -*graalpython.lib-python.3.test.test_optparse.TestExtendAddTypes.test_filetype_noexist -*graalpython.lib-python.3.test.test_optparse.TestExtendAddTypes.test_filetype_notfile -*graalpython.lib-python.3.test.test_optparse.TestExtendAddTypes.test_filetype_ok -*graalpython.lib-python.3.test.test_optparse.TestHelp.test_help -*graalpython.lib-python.3.test.test_optparse.TestHelp.test_help_description_groups -*graalpython.lib-python.3.test.test_optparse.TestHelp.test_help_long_opts_first -*graalpython.lib-python.3.test.test_optparse.TestHelp.test_help_old_usage -*graalpython.lib-python.3.test.test_optparse.TestHelp.test_help_title_formatter -*graalpython.lib-python.3.test.test_optparse.TestHelp.test_help_unicode -*graalpython.lib-python.3.test.test_optparse.TestHelp.test_help_unicode_description -*graalpython.lib-python.3.test.test_optparse.TestHelp.test_wrap_columns -*graalpython.lib-python.3.test.test_optparse.TestMain.test_main -*graalpython.lib-python.3.test.test_optparse.TestMatchAbbrev.test_match_abbrev -*graalpython.lib-python.3.test.test_optparse.TestMatchAbbrev.test_match_abbrev_error -*graalpython.lib-python.3.test.test_optparse.TestMultipleArgs.test_nargs_invalid_float_value -*graalpython.lib-python.3.test.test_optparse.TestMultipleArgs.test_nargs_long_opt -*graalpython.lib-python.3.test.test_optparse.TestMultipleArgs.test_nargs_required_values -*graalpython.lib-python.3.test.test_optparse.TestMultipleArgs.test_nargs_with_positional_args -*graalpython.lib-python.3.test.test_optparse.TestMultipleArgsAppend.test_nargs_append -*graalpython.lib-python.3.test.test_optparse.TestMultipleArgsAppend.test_nargs_append_const -*graalpython.lib-python.3.test.test_optparse.TestMultipleArgsAppend.test_nargs_append_required_values -*graalpython.lib-python.3.test.test_optparse.TestMultipleArgsAppend.test_nargs_append_simple -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_action_invalid -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_attr_invalid -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_bad_choices_list -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_callback_args_no_tuple -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_callback_kwargs_no_dict -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_callback_not_callable -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_no_callback_args_for_action -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_no_callback_for_action -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_no_callback_kwargs_for_action -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_no_choices_for_type -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_no_choices_list -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_no_const_for_action -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_no_nargs_for_action -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_no_single_dash -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_no_type_for_action -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_opt_string_empty -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_opt_string_long_invalid -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_opt_string_short_invalid -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_opt_string_too_short -*graalpython.lib-python.3.test.test_optparse.TestOptionChecks.test_type_invalid -*graalpython.lib-python.3.test.test_optparse.TestOptionGroup.test_add_group_invalid_arguments -*graalpython.lib-python.3.test.test_optparse.TestOptionGroup.test_add_group_no_group -*graalpython.lib-python.3.test.test_optparse.TestOptionGroup.test_add_group_wrong_parser -*graalpython.lib-python.3.test.test_optparse.TestOptionGroup.test_group_manipulate -*graalpython.lib-python.3.test.test_optparse.TestOptionGroup.test_option_group_create_instance -*graalpython.lib-python.3.test.test_optparse.TestOptionParser.test_add_option_invalid_arguments -*graalpython.lib-python.3.test.test_optparse.TestOptionParser.test_add_option_no_Option -*graalpython.lib-python.3.test.test_optparse.TestOptionParser.test_get_option -*graalpython.lib-python.3.test.test_optparse.TestOptionParser.test_get_option_equals -*graalpython.lib-python.3.test.test_optparse.TestOptionParser.test_has_option -*graalpython.lib-python.3.test.test_optparse.TestOptionParser.test_refleak -*graalpython.lib-python.3.test.test_optparse.TestOptionParser.test_remove_long_opt -*graalpython.lib-python.3.test.test_optparse.TestOptionParser.test_remove_nonexistent -*graalpython.lib-python.3.test.test_optparse.TestOptionParser.test_remove_short_opt -*graalpython.lib-python.3.test.test_optparse.TestOptionValues.test_basics -*graalpython.lib-python.3.test.test_optparse.TestParseNumber.test_numeric_options -*graalpython.lib-python.3.test.test_optparse.TestParseNumber.test_parse_num_fail -*graalpython.lib-python.3.test.test_optparse.TestParseNumber.test_parse_num_ok -*graalpython.lib-python.3.test.test_optparse.TestProgName.test_custom_progname -*graalpython.lib-python.3.test.test_optparse.TestProgName.test_default_progname -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_abbrev_long_option -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_ambiguous_option -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_combined_single_invalid_option -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_defaults -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_empty -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_hyphen_becomes_positional_arg -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_invalid_integer -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_long_invalid_integer -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_long_option_append -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_long_option_argument_joined -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_long_option_argument_split -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_long_option_short_option -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_no_append_versus_append -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_no_such_option -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_option_argument_joined -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_option_argument_joined_integer -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_option_argument_split -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_option_argument_split_negative_integer -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_option_consumes_optionlike_string -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_required_value -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_short_and_long_option_split -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_short_option_consumes_separator -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_short_option_joined_and_separator -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_short_option_split_long_option_append -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_short_option_split_one_positional_arg -*graalpython.lib-python.3.test.test_optparse.TestStandard.test_shortopt_empty_longopt_append -*graalpython.lib-python.3.test.test_optparse.TestTypeAliases.test_str_aliases_string -*graalpython.lib-python.3.test.test_optparse.TestTypeAliases.test_type_object -*graalpython.lib-python.3.test.test_optparse.TestVersion.test_no_version -*graalpython.lib-python.3.test.test_optparse.TestVersion.test_version +test.test_optparse.MiscTestCase.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestBool.test_bool_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestBool.test_bool_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestBool.test_bool_flicker_on_and_off @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestBool.test_bool_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCallback.test_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCallback.test_callback_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCallbackCheckAbbrev.test_abbrev_callback_expansion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCallbackExtraArgs.test_callback_extra_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCallbackManyArgs.test_many_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCallbackMeddleArgs.test_callback_meddle_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCallbackMeddleArgs.test_callback_meddle_args_separator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCallbackVarArgs.test_consume_separator_stop_at_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCallbackVarArgs.test_positional_arg_and_variable_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCallbackVarArgs.test_stop_at_invalid_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCallbackVarArgs.test_stop_at_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCallbackVarArgs.test_variable_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestChoice.test_add_choice_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestChoice.test_invalid_choice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestChoice.test_valid_choice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestConflict.test_conflict_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestConflict.test_conflict_error_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestConflict.test_no_such_conflict_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestConflictOverride.test_conflict_override_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestConflictOverride.test_conflict_override_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestConflictOverride.test_conflict_override_opts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestConflictResolve.test_conflict_resolve @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestConflictResolve.test_conflict_resolve_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestConflictResolve.test_conflict_resolve_long_opt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestConflictResolve.test_conflict_resolve_long_opts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestConflictResolve.test_conflict_resolve_short_opt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestConflictingDefaults.test_conflict_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestConflictingDefaults.test_conflict_default_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCount.test_count_interspersed_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCount.test_count_no_interspersed_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCount.test_count_no_such_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCount.test_count_one @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCount.test_count_option_no_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCount.test_count_override_amount @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCount.test_count_override_quiet @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCount.test_count_overriding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCount.test_count_overriding_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCount.test_count_three @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCount.test_count_three_apart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCount.test_count_with_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestCount.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestDefaultValues.test_basic_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestDefaultValues.test_mixed_defaults_post @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestDefaultValues.test_mixed_defaults_pre @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestDefaultValues.test_process_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestExpandDefaults.test_alt_expand @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestExpandDefaults.test_default_none_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestExpandDefaults.test_default_none_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestExpandDefaults.test_float_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestExpandDefaults.test_no_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestExpandDefaults.test_no_expand @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestExpandDefaults.test_option_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestExpandDefaults.test_parser_default_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestExpandDefaults.test_parser_default_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestExtendAddActions.test_extend_add_action @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestExtendAddActions.test_extend_add_action_normal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestExtendAddTypes.test_filetype_noexist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestExtendAddTypes.test_filetype_notfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestExtendAddTypes.test_filetype_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestHelp.test_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestHelp.test_help_description_groups @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestHelp.test_help_long_opts_first @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestHelp.test_help_old_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestHelp.test_help_title_formatter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestHelp.test_help_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestHelp.test_help_unicode_description @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestHelp.test_wrap_columns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestMatchAbbrev.test_match_abbrev @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestMatchAbbrev.test_match_abbrev_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestMultipleArgs.test_nargs_invalid_float_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestMultipleArgs.test_nargs_long_opt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestMultipleArgs.test_nargs_required_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestMultipleArgs.test_nargs_with_positional_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestMultipleArgsAppend.test_nargs_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestMultipleArgsAppend.test_nargs_append_const @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestMultipleArgsAppend.test_nargs_append_required_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestMultipleArgsAppend.test_nargs_append_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_action_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_attr_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_bad_choices_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_callback_args_no_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_callback_kwargs_no_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_callback_not_callable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_no_callback_args_for_action @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_no_callback_for_action @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_no_callback_kwargs_for_action @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_no_choices_for_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_no_choices_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_no_const_for_action @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_no_nargs_for_action @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_no_single_dash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_no_type_for_action @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_opt_string_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_opt_string_long_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_opt_string_short_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_opt_string_too_short @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionChecks.test_type_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionGroup.test_add_group_invalid_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionGroup.test_add_group_no_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionGroup.test_add_group_wrong_parser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionGroup.test_group_manipulate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionGroup.test_option_group_create_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionParser.test_add_option_invalid_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionParser.test_add_option_no_Option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionParser.test_get_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionParser.test_get_option_equals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionParser.test_has_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionParser.test_remove_long_opt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionParser.test_remove_nonexistent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionParser.test_remove_short_opt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestOptionValues.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestParseNumber.test_numeric_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestParseNumber.test_parse_num_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestParseNumber.test_parse_num_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestProgName.test_custom_progname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestProgName.test_default_progname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_abbrev_long_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_ambiguous_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_combined_single_invalid_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_hyphen_becomes_positional_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_invalid_integer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_long_invalid_integer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_long_option_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_long_option_argument_joined @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_long_option_argument_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_long_option_short_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_no_append_versus_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_no_such_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_option_argument_joined @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_option_argument_joined_integer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_option_argument_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_option_argument_split_negative_integer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_option_consumes_optionlike_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_required_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_short_and_long_option_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_short_option_consumes_separator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_short_option_joined_and_separator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_short_option_split_long_option_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_short_option_split_one_positional_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestStandard.test_shortopt_empty_longopt_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestTypeAliases.test_str_aliases_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestTypeAliases.test_type_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestVersion.test_no_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_optparse.TestVersion.test_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ordered_dict.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ordered_dict.txt index aeb6b2f348..04f7507791 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ordered_dict.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ordered_dict.txt @@ -1,280 +1,251 @@ -*graalpython.lib-python.3.test.test_ordered_dict.CPythonBuiltinDictTests.test_abc -*graalpython.lib-python.3.test.test_ordered_dict.CPythonBuiltinDictTests.test_clear -*graalpython.lib-python.3.test.test_ordered_dict.CPythonBuiltinDictTests.test_delitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonBuiltinDictTests.test_delitem_hash_collision -*graalpython.lib-python.3.test.test_ordered_dict.CPythonBuiltinDictTests.test_detect_deletion_during_iteration -*graalpython.lib-python.3.test.test_ordered_dict.CPythonBuiltinDictTests.test_highly_nested -*graalpython.lib-python.3.test.test_ordered_dict.CPythonBuiltinDictTests.test_highly_nested_subclass -*graalpython.lib-python.3.test.test_ordered_dict.CPythonBuiltinDictTests.test_init -*graalpython.lib-python.3.test.test_ordered_dict.CPythonBuiltinDictTests.test_override_update -*graalpython.lib-python.3.test.test_ordered_dict.CPythonBuiltinDictTests.test_popitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonBuiltinDictTests.test_reinsert -*graalpython.lib-python.3.test.test_ordered_dict.CPythonBuiltinDictTests.test_setitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonBuiltinDictTests.test_update -*graalpython.lib-python.3.test.test_ordered_dict.CPythonGeneralMappingTests.test_bool -*graalpython.lib-python.3.test.test_ordered_dict.CPythonGeneralMappingTests.test_constructor -*graalpython.lib-python.3.test.test_ordered_dict.CPythonGeneralMappingTests.test_get -*graalpython.lib-python.3.test.test_ordered_dict.CPythonGeneralMappingTests.test_getitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonGeneralMappingTests.test_items -*graalpython.lib-python.3.test.test_ordered_dict.CPythonGeneralMappingTests.test_keys -*graalpython.lib-python.3.test.test_ordered_dict.CPythonGeneralMappingTests.test_len -*graalpython.lib-python.3.test.test_ordered_dict.CPythonGeneralMappingTests.test_pop -*graalpython.lib-python.3.test.test_ordered_dict.CPythonGeneralMappingTests.test_popitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonGeneralMappingTests.test_read -*graalpython.lib-python.3.test.test_ordered_dict.CPythonGeneralMappingTests.test_setdefault -*graalpython.lib-python.3.test.test_ordered_dict.CPythonGeneralMappingTests.test_update -*graalpython.lib-python.3.test.test_ordered_dict.CPythonGeneralMappingTests.test_values -*graalpython.lib-python.3.test.test_ordered_dict.CPythonGeneralMappingTests.test_write -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_468 -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_abc -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_clear -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_copying -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_delitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_delitem_hash_collision -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_detect_deletion_during_iteration -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_clear -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_delitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_pop -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_popitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_setdefault -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_setitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_update -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_equality -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_free_after_iterating -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_fromkeys -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_highly_nested -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_highly_nested_subclass -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_init -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_init_calls -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_issue24347 -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_issue24348 -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_issue24667 -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_iterators -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_iterators_empty -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_iterators_pickling -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_merge_operator -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_move_to_end -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_move_to_end_issue25406 -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_ordered_dict_items_result_gc -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_overridden_init -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_override_update -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_pickle_recursive -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_pop -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_popitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_popitem_last -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_reduce_not_too_fat -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_reference_loop -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_reinsert -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_repr -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_repr_recursive -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_repr_recursive_values -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_setdefault -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_setitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_sizeof -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_sizeof_exact -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_sorted_iterators -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_update -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_views -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_weakref_list_is_not_traversed -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_yaml_linkage -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_468 -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_abc -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_clear -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_copying -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_delitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_delitem_hash_collision -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_detect_deletion_during_iteration -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_dict_clear -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_dict_delitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_dict_pop -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_dict_popitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_dict_setdefault -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_dict_setitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_dict_update -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_equality -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_free_after_iterating -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_fromkeys -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_highly_nested -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_highly_nested_subclass -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_init -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_init_calls -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_issue24347 -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_issue24348 -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_issue24667 -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_iterators -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_iterators_empty -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_iterators_pickling -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_merge_operator -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_move_to_end -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_move_to_end_issue25406 -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_ordered_dict_items_result_gc -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_overridden_init -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_override_update -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_pickle_recursive -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_pop -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_popitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_popitem_last -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_reduce_not_too_fat -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_reference_loop -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_reinsert -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_repr -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_repr_recursive -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_repr_recursive_values -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_setdefault -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_setitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_sizeof -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_sizeof_exact -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_sorted_iterators -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_update -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_views -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_weakref_list_is_not_traversed -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictTests.test_yaml_linkage -*graalpython.lib-python.3.test.test_ordered_dict.CPythonOrderedDictWithSlotsCopyingTests.test_copying -*graalpython.lib-python.3.test.test_ordered_dict.CPythonSubclassMappingTests.test_bool -*graalpython.lib-python.3.test.test_ordered_dict.CPythonSubclassMappingTests.test_constructor -*graalpython.lib-python.3.test.test_ordered_dict.CPythonSubclassMappingTests.test_get -*graalpython.lib-python.3.test.test_ordered_dict.CPythonSubclassMappingTests.test_getitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonSubclassMappingTests.test_items -*graalpython.lib-python.3.test.test_ordered_dict.CPythonSubclassMappingTests.test_keys -*graalpython.lib-python.3.test.test_ordered_dict.CPythonSubclassMappingTests.test_len -*graalpython.lib-python.3.test.test_ordered_dict.CPythonSubclassMappingTests.test_pop -*graalpython.lib-python.3.test.test_ordered_dict.CPythonSubclassMappingTests.test_popitem -*graalpython.lib-python.3.test.test_ordered_dict.CPythonSubclassMappingTests.test_read -*graalpython.lib-python.3.test.test_ordered_dict.CPythonSubclassMappingTests.test_setdefault -*graalpython.lib-python.3.test.test_ordered_dict.CPythonSubclassMappingTests.test_update -*graalpython.lib-python.3.test.test_ordered_dict.CPythonSubclassMappingTests.test_values -*graalpython.lib-python.3.test.test_ordered_dict.CPythonSubclassMappingTests.test_write -*graalpython.lib-python.3.test.test_ordered_dict.CSimpleLRUCacheTests.test_add_after_full -*graalpython.lib-python.3.test.test_ordered_dict.CSimpleLRUCacheTests.test_change_order_on_get -*graalpython.lib-python.3.test.test_ordered_dict.CSimpleLRUCacheTests.test_popitem -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonGeneralMappingTests.test_bool -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonGeneralMappingTests.test_constructor -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonGeneralMappingTests.test_get -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonGeneralMappingTests.test_getitem -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonGeneralMappingTests.test_items -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonGeneralMappingTests.test_keys -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonGeneralMappingTests.test_len -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonGeneralMappingTests.test_pop -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonGeneralMappingTests.test_popitem -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonGeneralMappingTests.test_read -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonGeneralMappingTests.test_setdefault -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonGeneralMappingTests.test_update -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonGeneralMappingTests.test_values -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonGeneralMappingTests.test_write -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_468 -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_abc -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_clear -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_copying -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_delitem -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_delitem_hash_collision -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_detect_deletion_during_iteration -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_clear -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_delitem -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_pop -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_popitem -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_setdefault -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_setitem -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_update -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_equality -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_free_after_iterating -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_fromkeys -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_highly_nested -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_highly_nested_subclass -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_init -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_init_calls -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_issue24347 -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_issue24348 -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_issue24667 -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_iterators -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_iterators_empty -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_merge_operator -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_move_to_end -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_move_to_end_issue25406 -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_ordered_dict_items_result_gc -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_overridden_init -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_override_update -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_pickle_recursive -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_pop -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_popitem -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_popitem_last -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_reduce_not_too_fat -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_reference_loop -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_reinsert -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_repr -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_repr_recursive -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_repr_recursive_values -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_setdefault -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_setitem -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_sizeof -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_sorted_iterators -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_update -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_views -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_yaml_linkage -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_468 -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_abc -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_clear -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_copying -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_delitem -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_delitem_hash_collision -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_detect_deletion_during_iteration -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_clear -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_delitem -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_pop -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_popitem -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_setdefault -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_setitem -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_update -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_equality -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_free_after_iterating -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_fromkeys -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_highly_nested -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_highly_nested_subclass -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_init -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_init_calls -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_issue24347 -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_issue24348 -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_issue24667 -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_iterators -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_iterators_empty -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_merge_operator -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_move_to_end -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_move_to_end_issue25406 -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_ordered_dict_items_result_gc -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_overridden_init -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_override_update -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_pickle_recursive -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_pop -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_popitem -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_popitem_last -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_reduce_not_too_fat -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_reference_loop -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_reinsert -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_repr -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_repr_recursive -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_repr_recursive_values -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_setdefault -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_setitem -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_sizeof -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_sorted_iterators -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_update -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_views -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictTests.test_yaml_linkage -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonOrderedDictWithSlotsCopyingTests.test_copying -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonSubclassMappingTests.test_bool -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonSubclassMappingTests.test_constructor -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonSubclassMappingTests.test_get -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonSubclassMappingTests.test_getitem -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonSubclassMappingTests.test_items -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonSubclassMappingTests.test_keys -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonSubclassMappingTests.test_len -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonSubclassMappingTests.test_pop -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonSubclassMappingTests.test_popitem -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonSubclassMappingTests.test_read -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonSubclassMappingTests.test_setdefault -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonSubclassMappingTests.test_update -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonSubclassMappingTests.test_values -*graalpython.lib-python.3.test.test_ordered_dict.PurePythonSubclassMappingTests.test_write -*graalpython.lib-python.3.test.test_ordered_dict.PySimpleLRUCacheTests.test_add_after_full -*graalpython.lib-python.3.test.test_ordered_dict.PySimpleLRUCacheTests.test_change_order_on_get -*graalpython.lib-python.3.test.test_ordered_dict.PySimpleLRUCacheTests.test_pop -*graalpython.lib-python.3.test.test_ordered_dict.PySimpleLRUCacheTests.test_popitem +test.test_ordered_dict.CPythonBuiltinDictTests.test_abc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_delitem_hash_collision @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_detect_deletion_during_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_highly_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_override_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_reinsert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_468 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_abc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_copying @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_delitem_hash_collision @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_detect_deletion_during_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_fromkeys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_highly_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_init_calls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_issue24348 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_issue24667 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_iterators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_iterators_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_iterators_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_merge_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_move_to_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_move_to_end_issue25406 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_overridden_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_override_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_pickle_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_popitem_last @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_reduce_not_too_fat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_reinsert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_repr_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_repr_recursive_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_sizeof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_sorted_iterators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_views @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_yaml_linkage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_468 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_abc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_copying @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_delitem_hash_collision @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_detect_deletion_during_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_dict_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_dict_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_dict_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_dict_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_dict_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_dict_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_fromkeys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_highly_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_init_calls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_issue24348 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_issue24667 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_iterators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_iterators_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_iterators_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_merge_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_move_to_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_move_to_end_issue25406 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_overridden_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_override_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_pickle_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_popitem_last @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_reduce_not_too_fat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_reinsert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_repr_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_repr_recursive_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_sizeof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_sorted_iterators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_views @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictTests.test_yaml_linkage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonOrderedDictWithSlotsCopyingTests.test_copying @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CSimpleLRUCacheTests.test_add_after_full @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CSimpleLRUCacheTests.test_change_order_on_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.CSimpleLRUCacheTests.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_468 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_abc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_copying @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_delitem_hash_collision @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_detect_deletion_during_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_fromkeys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_highly_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_init_calls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_issue24348 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_issue24667 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_iterators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_iterators_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_merge_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_move_to_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_move_to_end_issue25406 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_overridden_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_override_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_pickle_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_popitem_last @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_reduce_not_too_fat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_reinsert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_repr_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_repr_recursive_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_sizeof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_sorted_iterators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_views @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_yaml_linkage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_468 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_abc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_copying @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_delitem_hash_collision @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_detect_deletion_during_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_fromkeys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_highly_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_init_calls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_issue24348 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_issue24667 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_iterators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_iterators_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_merge_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_move_to_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_move_to_end_issue25406 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_overridden_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_override_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_pickle_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_popitem_last @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_reduce_not_too_fat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_reinsert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_repr_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_repr_recursive_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_sizeof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_sorted_iterators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_views @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_yaml_linkage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonOrderedDictWithSlotsCopyingTests.test_copying @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PySimpleLRUCacheTests.test_add_after_full @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PySimpleLRUCacheTests.test_change_order_on_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PySimpleLRUCacheTests.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ordered_dict.PySimpleLRUCacheTests.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_os.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_os.txt index 1e998a5c45..0a73dbb177 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_os.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_os.txt @@ -1,297 +1,216 @@ -*graalpython.lib-python.3.test.test_os.BlockingTests.test_blocking -*graalpython.lib-python.3.test.test_os.BytesFwalkTests.test_compare_to_walk -*graalpython.lib-python.3.test.test_os.BytesFwalkTests.test_dir_fd -*graalpython.lib-python.3.test.test_os.BytesFwalkTests.test_fd_leak -*graalpython.lib-python.3.test.test_os.BytesFwalkTests.test_file_like_path -*graalpython.lib-python.3.test.test_os.BytesFwalkTests.test_walk_bad_dir -*graalpython.lib-python.3.test.test_os.BytesFwalkTests.test_walk_bottom_up -*graalpython.lib-python.3.test.test_os.BytesFwalkTests.test_walk_prune -*graalpython.lib-python.3.test.test_os.BytesFwalkTests.test_walk_symlink -*graalpython.lib-python.3.test.test_os.BytesFwalkTests.test_walk_topdown -*graalpython.lib-python.3.test.test_os.BytesFwalkTests.test_yields_correct_dir_fd -*graalpython.lib-python.3.test.test_os.BytesWalkTests.test_file_like_path -*graalpython.lib-python.3.test.test_os.BytesWalkTests.test_walk_bad_dir -*graalpython.lib-python.3.test.test_os.BytesWalkTests.test_walk_bottom_up -*graalpython.lib-python.3.test.test_os.BytesWalkTests.test_walk_many_open_files -*graalpython.lib-python.3.test.test_os.BytesWalkTests.test_walk_prune -*graalpython.lib-python.3.test.test_os.BytesWalkTests.test_walk_symlink -*graalpython.lib-python.3.test.test_os.BytesWalkTests.test_walk_topdown -*graalpython.lib-python.3.test.test_os.CPUCountTests.test_cpu_count -*graalpython.lib-python.3.test.test_os.ChownFileTests.test_chown_gid -*graalpython.lib-python.3.test.test_os.ChownFileTests.test_chown_uid_gid_arguments_must_be_index -*graalpython.lib-python.3.test.test_os.ChownFileTests.test_chown_with_root -*graalpython.lib-python.3.test.test_os.ChownFileTests.test_chown_without_permission -*graalpython.lib-python.3.test.test_os.DevNullTests.test_devnull -*graalpython.lib-python.3.test.test_os.DeviceEncodingTests.test_device_encoding -*graalpython.lib-python.3.test.test_os.EnvironTests.test___repr__ -*graalpython.lib-python.3.test.test_os.EnvironTests.test_bool -*graalpython.lib-python.3.test.test_os.EnvironTests.test_constructor -*graalpython.lib-python.3.test.test_os.EnvironTests.test_environb -*graalpython.lib-python.3.test.test_os.EnvironTests.test_get -*graalpython.lib-python.3.test.test_os.EnvironTests.test_get_exec_path -*graalpython.lib-python.3.test.test_os.EnvironTests.test_getitem -*graalpython.lib-python.3.test.test_os.EnvironTests.test_ior_operator -*graalpython.lib-python.3.test.test_os.EnvironTests.test_ior_operator_invalid_dicts -*graalpython.lib-python.3.test.test_os.EnvironTests.test_ior_operator_key_value_iterable -*graalpython.lib-python.3.test.test_os.EnvironTests.test_items -*graalpython.lib-python.3.test.test_os.EnvironTests.test_iter_error_when_changing_os_environ -*graalpython.lib-python.3.test.test_os.EnvironTests.test_iter_error_when_changing_os_environ_items -*graalpython.lib-python.3.test.test_os.EnvironTests.test_iter_error_when_changing_os_environ_values -*graalpython.lib-python.3.test.test_os.EnvironTests.test_key_type -*graalpython.lib-python.3.test.test_os.EnvironTests.test_keys -*graalpython.lib-python.3.test.test_os.EnvironTests.test_keyvalue_types -*graalpython.lib-python.3.test.test_os.EnvironTests.test_len -*graalpython.lib-python.3.test.test_os.EnvironTests.test_or_operator -*graalpython.lib-python.3.test.test_os.EnvironTests.test_os_popen_iter -*graalpython.lib-python.3.test.test_os.EnvironTests.test_pop -*graalpython.lib-python.3.test.test_os.EnvironTests.test_popitem -*graalpython.lib-python.3.test.test_os.EnvironTests.test_putenv_unsetenv -*graalpython.lib-python.3.test.test_os.EnvironTests.test_putenv_unsetenv_error -*graalpython.lib-python.3.test.test_os.EnvironTests.test_read -*graalpython.lib-python.3.test.test_os.EnvironTests.test_ror_operator -*graalpython.lib-python.3.test.test_os.EnvironTests.test_setdefault -*graalpython.lib-python.3.test.test_os.EnvironTests.test_update -*graalpython.lib-python.3.test.test_os.EnvironTests.test_update2 -*graalpython.lib-python.3.test.test_os.EnvironTests.test_values -*graalpython.lib-python.3.test.test_os.EnvironTests.test_write -*graalpython.lib-python.3.test.test_os.EventfdTests.test_eventfd_initval -*graalpython.lib-python.3.test.test_os.EventfdTests.test_eventfd_select -*graalpython.lib-python.3.test.test_os.EventfdTests.test_eventfd_semaphore -*graalpython.lib-python.3.test.test_os.ExecTests.test_execv_with_bad_arglist -*graalpython.lib-python.3.test.test_os.ExecTests.test_execve_with_empty_path -*graalpython.lib-python.3.test.test_os.ExecTests.test_execvpe_with_bad_program -*graalpython.lib-python.3.test.test_os.ExportsTests.test_os_all -*graalpython.lib-python.3.test.test_os.ExtendedAttributeTests.test_fds -*graalpython.lib-python.3.test.test_os.ExtendedAttributeTests.test_lpath -*graalpython.lib-python.3.test.test_os.ExtendedAttributeTests.test_simple -*graalpython.lib-python.3.test.test_os.FDInheritanceTests.test_dup -*graalpython.lib-python.3.test.test_os.FDInheritanceTests.test_dup2 -*graalpython.lib-python.3.test.test_os.FDInheritanceTests.test_dup_nul -*graalpython.lib-python.3.test.test_os.FDInheritanceTests.test_dup_standard_stream -*graalpython.lib-python.3.test.test_os.FDInheritanceTests.test_get_set_inheritable -*graalpython.lib-python.3.test.test_os.FDInheritanceTests.test_get_set_inheritable_badf -*graalpython.lib-python.3.test.test_os.FDInheritanceTests.test_get_set_inheritable_o_path -*graalpython.lib-python.3.test.test_os.FDInheritanceTests.test_open -*graalpython.lib-python.3.test.test_os.FDInheritanceTests.test_openpty -*graalpython.lib-python.3.test.test_os.FDInheritanceTests.test_pipe -*graalpython.lib-python.3.test.test_os.FSEncodingTests.test_identity -*graalpython.lib-python.3.test.test_os.FSEncodingTests.test_nop -*graalpython.lib-python.3.test.test_os.FileTests.test_access -*graalpython.lib-python.3.test.test_os.FileTests.test_copy_file_range -*graalpython.lib-python.3.test.test_os.FileTests.test_copy_file_range_invalid_values -*graalpython.lib-python.3.test.test_os.FileTests.test_copy_file_range_offset -*graalpython.lib-python.3.test.test_os.FileTests.test_fdopen -*graalpython.lib-python.3.test.test_os.FileTests.test_large_read -*graalpython.lib-python.3.test.test_os.FileTests.test_open_keywords -*graalpython.lib-python.3.test.test_os.FileTests.test_read -*graalpython.lib-python.3.test.test_os.FileTests.test_rename -*graalpython.lib-python.3.test.test_os.FileTests.test_replace -*graalpython.lib-python.3.test.test_os.FileTests.test_splice -*graalpython.lib-python.3.test.test_os.FileTests.test_splice_invalid_values -*graalpython.lib-python.3.test.test_os.FileTests.test_splice_offset_in -*graalpython.lib-python.3.test.test_os.FileTests.test_splice_offset_out -*graalpython.lib-python.3.test.test_os.FileTests.test_symlink_keywords -*graalpython.lib-python.3.test.test_os.FileTests.test_write -*graalpython.lib-python.3.test.test_os.FileTests.test_write_windows_console -*graalpython.lib-python.3.test.test_os.ForkTests.test_fork -*graalpython.lib-python.3.test.test_os.FwalkTests.test_compare_to_walk -*graalpython.lib-python.3.test.test_os.FwalkTests.test_dir_fd -*graalpython.lib-python.3.test.test_os.FwalkTests.test_fd_leak -*graalpython.lib-python.3.test.test_os.FwalkTests.test_file_like_path -*graalpython.lib-python.3.test.test_os.FwalkTests.test_walk_bad_dir -*graalpython.lib-python.3.test.test_os.FwalkTests.test_walk_bottom_up -*graalpython.lib-python.3.test.test_os.FwalkTests.test_walk_prune -*graalpython.lib-python.3.test.test_os.FwalkTests.test_walk_symlink -*graalpython.lib-python.3.test.test_os.FwalkTests.test_walk_topdown -*graalpython.lib-python.3.test.test_os.FwalkTests.test_yields_correct_dir_fd -*graalpython.lib-python.3.test.test_os.GetRandomTests.test_getrandom0 -*graalpython.lib-python.3.test.test_os.GetRandomTests.test_getrandom_nonblock -*graalpython.lib-python.3.test.test_os.GetRandomTests.test_getrandom_random -*graalpython.lib-python.3.test.test_os.GetRandomTests.test_getrandom_type -*graalpython.lib-python.3.test.test_os.GetRandomTests.test_getrandom_value -*graalpython.lib-python.3.test.test_os.LinkTests.test_link -*graalpython.lib-python.3.test.test_os.LinkTests.test_link_bytes -*graalpython.lib-python.3.test.test_os.LinkTests.test_unicode_name -*graalpython.lib-python.3.test.test_os.LoginTests.test_getlogin -*graalpython.lib-python.3.test.test_os.MakedirTests.test_exist_ok_existing_directory -*graalpython.lib-python.3.test.test_os.MakedirTests.test_exist_ok_existing_regular_file -*graalpython.lib-python.3.test.test_os.MakedirTests.test_exist_ok_s_isgid_directory -*graalpython.lib-python.3.test.test_os.MakedirTests.test_makedir -*graalpython.lib-python.3.test.test_os.MakedirTests.test_mode -*graalpython.lib-python.3.test.test_os.MemfdCreateTests.test_memfd_create -*graalpython.lib-python.3.test.test_os.MiscTests.test_getcwd -*graalpython.lib-python.3.test.test_os.MiscTests.test_getcwd_long_path -*graalpython.lib-python.3.test.test_os.MiscTests.test_getcwdb -*graalpython.lib-python.3.test.test_os.NonLocalSymlinkTests.test_directory_link_nonlocal -*graalpython.lib-python.3.test.test_os.OSErrorTests.test_oserror_filename -*graalpython.lib-python.3.test.test_os.PathTConverterTests.test_path_t_converter -*graalpython.lib-python.3.test.test_os.PathTConverterTests.test_path_t_converter_and_custom_class -*graalpython.lib-python.3.test.test_os.PidTests.test_getppid -*graalpython.lib-python.3.test.test_os.PidTests.test_waitpid_windows -*graalpython.lib-python.3.test.test_os.PidTests.test_waitstatus_to_exitcode_windows -*graalpython.lib-python.3.test.test_os.PosixUidGidTests.test_setegid -*graalpython.lib-python.3.test.test_os.PosixUidGidTests.test_seteuid -*graalpython.lib-python.3.test.test_os.PosixUidGidTests.test_setgid -*graalpython.lib-python.3.test.test_os.PosixUidGidTests.test_setregid -*graalpython.lib-python.3.test.test_os.PosixUidGidTests.test_setregid_neg1 -*graalpython.lib-python.3.test.test_os.PosixUidGidTests.test_setreuid -*graalpython.lib-python.3.test.test_os.PosixUidGidTests.test_setreuid_neg1 -*graalpython.lib-python.3.test.test_os.PosixUidGidTests.test_setuid -*graalpython.lib-python.3.test.test_os.ProgramPriorityTests.test_set_get_priority -*graalpython.lib-python.3.test.test_os.ReadlinkTests.test_bytes -*graalpython.lib-python.3.test.test_os.ReadlinkTests.test_missing_link -*graalpython.lib-python.3.test.test_os.ReadlinkTests.test_not_symlink -*graalpython.lib-python.3.test.test_os.ReadlinkTests.test_pathlike -*graalpython.lib-python.3.test.test_os.ReadlinkTests.test_pathlike_bytes -*graalpython.lib-python.3.test.test_os.RemoveDirsTests.test_remove_all -*graalpython.lib-python.3.test.test_os.RemoveDirsTests.test_remove_nothing -*graalpython.lib-python.3.test.test_os.RemoveDirsTests.test_remove_partial -*graalpython.lib-python.3.test.test_os.SpawnTests.test_nowait -*graalpython.lib-python.3.test.test_os.SpawnTests.test_spawnl -*graalpython.lib-python.3.test.test_os.SpawnTests.test_spawnl_noargs -*graalpython.lib-python.3.test.test_os.SpawnTests.test_spawnle -*graalpython.lib-python.3.test.test_os.SpawnTests.test_spawnle_noargs -*graalpython.lib-python.3.test.test_os.SpawnTests.test_spawnlp -*graalpython.lib-python.3.test.test_os.SpawnTests.test_spawnlpe -*graalpython.lib-python.3.test.test_os.SpawnTests.test_spawnv -*graalpython.lib-python.3.test.test_os.SpawnTests.test_spawnv_noargs -*graalpython.lib-python.3.test.test_os.SpawnTests.test_spawnve -*graalpython.lib-python.3.test.test_os.SpawnTests.test_spawnve_bytes -*graalpython.lib-python.3.test.test_os.SpawnTests.test_spawnve_invalid_env -*graalpython.lib-python.3.test.test_os.SpawnTests.test_spawnve_noargs -*graalpython.lib-python.3.test.test_os.SpawnTests.test_spawnvp -*graalpython.lib-python.3.test.test_os.SpawnTests.test_spawnvpe -*graalpython.lib-python.3.test.test_os.SpawnTests.test_spawnvpe_invalid_env -*graalpython.lib-python.3.test.test_os.StatAttributeTests.test_15261 -*graalpython.lib-python.3.test.test_os.StatAttributeTests.test_1686475 -*graalpython.lib-python.3.test.test_os.StatAttributeTests.test_access_denied -*graalpython.lib-python.3.test.test_os.StatAttributeTests.test_file_attributes -*graalpython.lib-python.3.test.test_os.StatAttributeTests.test_stat_attributes -*graalpython.lib-python.3.test.test_os.StatAttributeTests.test_stat_attributes_bytes -*graalpython.lib-python.3.test.test_os.StatAttributeTests.test_stat_block_device -*graalpython.lib-python.3.test.test_os.StatAttributeTests.test_stat_result_pickle -*graalpython.lib-python.3.test.test_os.StatAttributeTests.test_statvfs_attributes -*graalpython.lib-python.3.test.test_os.StatAttributeTests.test_statvfs_result_pickle -*graalpython.lib-python.3.test.test_os.TermsizeTests.test_does_not_crash -*graalpython.lib-python.3.test.test_os.TermsizeTests.test_stty_match -*graalpython.lib-python.3.test.test_os.TestDirEntry.test_uninstantiable -*graalpython.lib-python.3.test.test_os.TestDirEntry.test_unpickable -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_blocking -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_closerange -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_dup -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_dup2 -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_fchdir -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_fchmod -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_fchown -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_fdatasync -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_fdopen -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_fpathconf -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_fstat -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_fstatvfs -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_fsync -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_inheritable -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_isatty -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_lseek -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_read -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_readv -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_tcgetpgrp -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_tcsetpgrpt -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_ttyname -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_write -*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_writev -*graalpython.lib-python.3.test.test_os.TestPEP519.test_argument_required -*graalpython.lib-python.3.test.test_os.TestPEP519.test_bad_pathlike -*graalpython.lib-python.3.test.test_os.TestPEP519.test_fsencode_fsdecode -*graalpython.lib-python.3.test.test_os.TestPEP519.test_garbage_in_exception_out -*graalpython.lib-python.3.test.test_os.TestPEP519.test_pathlike -*graalpython.lib-python.3.test.test_os.TestPEP519.test_pathlike_class_getitem -*graalpython.lib-python.3.test.test_os.TestPEP519.test_pathlike_subclasshook -*graalpython.lib-python.3.test.test_os.TestPEP519.test_return_bytes -*graalpython.lib-python.3.test.test_os.TestPEP519.test_return_string -*graalpython.lib-python.3.test.test_os.TestPEP519PurePython.test_argument_required -*graalpython.lib-python.3.test.test_os.TestPEP519PurePython.test_bad_pathlike -*graalpython.lib-python.3.test.test_os.TestPEP519PurePython.test_fsencode_fsdecode -*graalpython.lib-python.3.test.test_os.TestPEP519PurePython.test_garbage_in_exception_out -*graalpython.lib-python.3.test.test_os.TestPEP519PurePython.test_pathlike -*graalpython.lib-python.3.test.test_os.TestPEP519PurePython.test_pathlike_class_getitem -*graalpython.lib-python.3.test.test_os.TestPEP519PurePython.test_pathlike_subclasshook -*graalpython.lib-python.3.test.test_os.TestPEP519PurePython.test_return_bytes -*graalpython.lib-python.3.test.test_os.TestPEP519PurePython.test_return_string -*graalpython.lib-python.3.test.test_os.TestScandir.test_attributes -*graalpython.lib-python.3.test.test_os.TestScandir.test_bad_path_type -*graalpython.lib-python.3.test.test_os.TestScandir.test_broken_symlink -*graalpython.lib-python.3.test.test_os.TestScandir.test_bytes -*graalpython.lib-python.3.test.test_os.TestScandir.test_bytes_like -*graalpython.lib-python.3.test.test_os.TestScandir.test_close -*graalpython.lib-python.3.test.test_os.TestScandir.test_consume_iterator_twice -*graalpython.lib-python.3.test.test_os.TestScandir.test_context_manager -*graalpython.lib-python.3.test.test_os.TestScandir.test_context_manager_close -*graalpython.lib-python.3.test.test_os.TestScandir.test_context_manager_exception -*graalpython.lib-python.3.test.test_os.TestScandir.test_current_directory -*graalpython.lib-python.3.test.test_os.TestScandir.test_empty_path -*graalpython.lib-python.3.test.test_os.TestScandir.test_fd -*graalpython.lib-python.3.test.test_os.TestScandir.test_fspath_protocol -*graalpython.lib-python.3.test.test_os.TestScandir.test_fspath_protocol_bytes -*graalpython.lib-python.3.test.test_os.TestScandir.test_removed_dir -*graalpython.lib-python.3.test.test_os.TestScandir.test_removed_file -*graalpython.lib-python.3.test.test_os.TestScandir.test_repr -*graalpython.lib-python.3.test.test_os.TestScandir.test_resource_warning -*graalpython.lib-python.3.test.test_os.TestScandir.test_uninstantiable -*graalpython.lib-python.3.test.test_os.TestScandir.test_unpickable -*graalpython.lib-python.3.test.test_os.TestSendfile.test_flags -*graalpython.lib-python.3.test.test_os.TestSendfile.test_headers -*graalpython.lib-python.3.test.test_os.TestSendfile.test_headers_overflow_32bits -*graalpython.lib-python.3.test.test_os.TestSendfile.test_invalid_offset -*graalpython.lib-python.3.test.test_os.TestSendfile.test_keywords -*graalpython.lib-python.3.test.test_os.TestSendfile.test_offset_overflow -*graalpython.lib-python.3.test.test_os.TestSendfile.test_send_at_certain_offset -*graalpython.lib-python.3.test.test_os.TestSendfile.test_send_whole_file -*graalpython.lib-python.3.test.test_os.TestSendfile.test_trailers -*graalpython.lib-python.3.test.test_os.TestSendfile.test_trailers_overflow_32bits -*graalpython.lib-python.3.test.test_os.URandomTests.test_urandom_length -*graalpython.lib-python.3.test.test_os.URandomTests.test_urandom_subprocess -*graalpython.lib-python.3.test.test_os.URandomTests.test_urandom_value -*graalpython.lib-python.3.test.test_os.UtimeTests.test_issue31577 -*graalpython.lib-python.3.test.test_os.UtimeTests.test_large_time -*graalpython.lib-python.3.test.test_os.UtimeTests.test_utime -*graalpython.lib-python.3.test.test_os.UtimeTests.test_utime_by_indexed -*graalpython.lib-python.3.test.test_os.UtimeTests.test_utime_by_times -*graalpython.lib-python.3.test.test_os.UtimeTests.test_utime_current -*graalpython.lib-python.3.test.test_os.UtimeTests.test_utime_current_old -*graalpython.lib-python.3.test.test_os.UtimeTests.test_utime_dir_fd -*graalpython.lib-python.3.test.test_os.UtimeTests.test_utime_directory -*graalpython.lib-python.3.test.test_os.UtimeTests.test_utime_fd -*graalpython.lib-python.3.test.test_os.UtimeTests.test_utime_invalid_arguments -*graalpython.lib-python.3.test.test_os.UtimeTests.test_utime_nofollow_symlinks -*graalpython.lib-python.3.test.test_os.WalkTests.test_file_like_path -*graalpython.lib-python.3.test.test_os.WalkTests.test_walk_bad_dir -*graalpython.lib-python.3.test.test_os.WalkTests.test_walk_bottom_up -*graalpython.lib-python.3.test.test_os.WalkTests.test_walk_many_open_files -*graalpython.lib-python.3.test.test_os.WalkTests.test_walk_prune -*graalpython.lib-python.3.test.test_os.WalkTests.test_walk_symlink -*graalpython.lib-python.3.test.test_os.WalkTests.test_walk_topdown -*graalpython.lib-python.3.test.test_os.Win32ErrorTests.test_chdir -*graalpython.lib-python.3.test.test_os.Win32ErrorTests.test_chmod -*graalpython.lib-python.3.test.test_os.Win32ErrorTests.test_mkdir -*graalpython.lib-python.3.test.test_os.Win32ErrorTests.test_remove -*graalpython.lib-python.3.test.test_os.Win32ErrorTests.test_rename -*graalpython.lib-python.3.test.test_os.Win32ErrorTests.test_utime -*graalpython.lib-python.3.test.test_os.Win32JunctionTests.test_create_junction -*graalpython.lib-python.3.test.test_os.Win32JunctionTests.test_unlink_removes_junction -*graalpython.lib-python.3.test.test_os.Win32KillTests.test_CTRL_BREAK_EVENT -*graalpython.lib-python.3.test.test_os.Win32KillTests.test_CTRL_C_EVENT -*graalpython.lib-python.3.test.test_os.Win32KillTests.test_kill_int -*graalpython.lib-python.3.test.test_os.Win32KillTests.test_kill_sigterm -*graalpython.lib-python.3.test.test_os.Win32ListdirTests.test_listdir_extended_path -*graalpython.lib-python.3.test.test_os.Win32ListdirTests.test_listdir_no_extended_path -*graalpython.lib-python.3.test.test_os.Win32NtTests.test_getfinalpathname_handles -*graalpython.lib-python.3.test.test_os.Win32NtTests.test_stat_unlink_race -*graalpython.lib-python.3.test.test_os.Win32SymlinkTests.test_12084 -*graalpython.lib-python.3.test.test_os.Win32SymlinkTests.test_29248 -*graalpython.lib-python.3.test.test_os.Win32SymlinkTests.test_appexeclink -*graalpython.lib-python.3.test.test_os.Win32SymlinkTests.test_buffer_overflow -*graalpython.lib-python.3.test.test_os.Win32SymlinkTests.test_directory_link -*graalpython.lib-python.3.test.test_os.Win32SymlinkTests.test_file_link -*graalpython.lib-python.3.test.test_os.Win32SymlinkTests.test_isdir_on_directory_link_to_missing_target -*graalpython.lib-python.3.test.test_os.Win32SymlinkTests.test_remove_directory_link_to_missing_target -*graalpython.lib-python.3.test.test_os.Win32SymlinkTests.test_rmdir_on_directory_link_to_missing_target +test.test_os.BlockingTests.test_blocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.BytesFwalkTests.test_compare_to_walk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.BytesFwalkTests.test_dir_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.BytesFwalkTests.test_fd_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.BytesFwalkTests.test_file_like_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.BytesFwalkTests.test_walk_bad_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.BytesFwalkTests.test_walk_bottom_up @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.BytesFwalkTests.test_walk_prune @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.BytesFwalkTests.test_walk_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.BytesFwalkTests.test_walk_topdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.BytesFwalkTests.test_yields_correct_dir_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.BytesWalkTests.test_file_like_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.BytesWalkTests.test_walk_bad_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.BytesWalkTests.test_walk_bottom_up @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.BytesWalkTests.test_walk_many_open_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.BytesWalkTests.test_walk_prune @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.BytesWalkTests.test_walk_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.BytesWalkTests.test_walk_topdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.CPUCountTests.test_cpu_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.ChownFileTests.test_chown_uid_gid_arguments_must_be_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.ChownFileTests.test_chown_without_permission @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.DevNullTests.test_devnull @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.DeviceEncodingTests.test_bad_fd @ win32-AMD64 +test.test_os.EnvironTests.test___repr__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_environb @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.EnvironTests.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_get_exec_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_ior_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_ior_operator_invalid_dicts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_ior_operator_key_value_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_iter_error_when_changing_os_environ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_iter_error_when_changing_os_environ_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_iter_error_when_changing_os_environ_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_key_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_keyvalue_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_or_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_os_popen_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.EnvironTests.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_putenv_unsetenv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.EnvironTests.test_putenv_unsetenv_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.EnvironTests.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_ror_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_update2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.EnvironTests.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.EnvironTests.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.ExecTests.test_execv_with_bad_arglist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.ExecTests.test_execvpe_with_bad_program @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.ExportsTests.test_os_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.FDInheritanceTests.test_dup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.FDInheritanceTests.test_dup2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.FDInheritanceTests.test_dup_nul @ win32-AMD64 +test.test_os.FDInheritanceTests.test_dup_standard_stream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.FDInheritanceTests.test_get_set_inheritable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.FDInheritanceTests.test_get_set_inheritable_badf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.FDInheritanceTests.test_get_set_inheritable_o_path @ linux-aarch64,linux-x86_64 +test.test_os.FDInheritanceTests.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.FDInheritanceTests.test_openpty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.FDInheritanceTests.test_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.FSEncodingTests.test_identity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.FSEncodingTests.test_nop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.FileTests.test_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.FileTests.test_fdopen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.FileTests.test_open_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.FileTests.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.FileTests.test_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.FileTests.test_symlink_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.FileTests.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.FwalkTests.test_compare_to_walk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.FwalkTests.test_dir_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.FwalkTests.test_fd_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.FwalkTests.test_file_like_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.FwalkTests.test_walk_bad_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.FwalkTests.test_walk_bottom_up @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.FwalkTests.test_walk_prune @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.FwalkTests.test_walk_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.FwalkTests.test_walk_topdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.FwalkTests.test_yields_correct_dir_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.LinkTests.test_link @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.LinkTests.test_link_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.LinkTests.test_unicode_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.MakedirTests.test_exist_ok_existing_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.MakedirTests.test_exist_ok_existing_regular_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.MakedirTests.test_exist_ok_s_isgid_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.MakedirTests.test_makedir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.MakedirTests.test_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.MiscTests.test_getcwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.MiscTests.test_getcwd_long_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.MiscTests.test_getcwdb @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.NonLocalSymlinkTests.test_directory_link_nonlocal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.OSErrorTests.test_oserror_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.PathTConverterTests.test_path_t_converter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.PathTConverterTests.test_path_t_converter_and_custom_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.Pep383Tests.test_listdir @ darwin-arm64,darwin-x86_64 +test.test_os.Pep383Tests.test_open @ darwin-arm64,darwin-x86_64 +test.test_os.Pep383Tests.test_stat @ darwin-arm64,darwin-x86_64 +test.test_os.Pep383Tests.test_statvfs @ darwin-arm64,darwin-x86_64 +test.test_os.PidTests.test_getppid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.ReadlinkTests.test_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.ReadlinkTests.test_missing_link @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.ReadlinkTests.test_not_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.ReadlinkTests.test_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.ReadlinkTests.test_pathlike_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.RemoveDirsTests.test_remove_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.RemoveDirsTests.test_remove_nothing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.RemoveDirsTests.test_remove_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.StatAttributeTests.test_15261 @ win32-AMD64 +test.test_os.StatAttributeTests.test_1686475 @ win32-AMD64 +test.test_os.StatAttributeTests.test_access_denied @ win32-AMD64 +test.test_os.StatAttributeTests.test_stat_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.StatAttributeTests.test_stat_attributes_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.StatAttributeTests.test_stat_result_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.StatAttributeTests.test_statvfs_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.StatAttributeTests.test_statvfs_result_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.TermsizeTests.test_does_not_crash @ win32-AMD64 +test.test_os.TestDirEntry.test_uninstantiable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestDirEntry.test_unpickable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestInvalidFD.test_blocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.TestInvalidFD.test_dup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.TestInvalidFD.test_dup2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.TestInvalidFD.test_fchdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestInvalidFD.test_fchmod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestInvalidFD.test_fchown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.TestInvalidFD.test_fdatasync @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestInvalidFD.test_fdopen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestInvalidFD.test_fstat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestInvalidFD.test_fstatvfs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.TestInvalidFD.test_fsync @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.TestInvalidFD.test_ftruncate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestInvalidFD.test_inheritable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.TestInvalidFD.test_isatty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestInvalidFD.test_lseek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestInvalidFD.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestInvalidFD.test_tcgetpgrp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestInvalidFD.test_ttyname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestInvalidFD.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestPEP519.test_argument_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestPEP519.test_bad_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestPEP519.test_fsencode_fsdecode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestPEP519.test_garbage_in_exception_out @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestPEP519.test_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestPEP519.test_pathlike_class_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestPEP519.test_pathlike_subclasshook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestPEP519.test_return_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestPEP519.test_return_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestPEP519PurePython.test_argument_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestPEP519PurePython.test_bad_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestPEP519PurePython.test_fsencode_fsdecode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestPEP519PurePython.test_garbage_in_exception_out @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestPEP519PurePython.test_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestPEP519PurePython.test_pathlike_class_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestPEP519PurePython.test_pathlike_subclasshook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestPEP519PurePython.test_return_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestPEP519PurePython.test_return_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestScandir.test_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.TestScandir.test_bad_path_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestScandir.test_broken_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestScandir.test_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestScandir.test_bytes_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestScandir.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestScandir.test_consume_iterator_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestScandir.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestScandir.test_context_manager_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestScandir.test_context_manager_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestScandir.test_current_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestScandir.test_empty_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestScandir.test_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.TestScandir.test_fspath_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestScandir.test_fspath_protocol_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestScandir.test_removed_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.TestScandir.test_removed_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.TestScandir.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestScandir.test_uninstantiable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.TestScandir.test_unpickable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.URandomTests.test_urandom_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.URandomTests.test_urandom_subprocess @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.URandomTests.test_urandom_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.UtimeTests.test_large_time @ win32-AMD64 +test.test_os.UtimeTests.test_utime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.UtimeTests.test_utime_by_indexed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.UtimeTests.test_utime_by_times @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.UtimeTests.test_utime_current @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.UtimeTests.test_utime_current_old @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.UtimeTests.test_utime_dir_fd @ linux-aarch64,linux-x86_64 +test.test_os.UtimeTests.test_utime_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.UtimeTests.test_utime_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.UtimeTests.test_utime_invalid_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.UtimeTests.test_utime_nofollow_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.WalkTests.test_file_like_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.WalkTests.test_walk_bad_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.WalkTests.test_walk_bottom_up @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.WalkTests.test_walk_many_open_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.WalkTests.test_walk_prune @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.WalkTests.test_walk_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_os.WalkTests.test_walk_topdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_os.Win32ErrorTests.test_chdir @ win32-AMD64 +test.test_os.Win32ErrorTests.test_mkdir @ win32-AMD64 +test.test_os.Win32ErrorTests.test_remove @ win32-AMD64 +test.test_os.Win32ErrorTests.test_rename @ win32-AMD64 +test.test_os.Win32ErrorTests.test_utime @ win32-AMD64 +test.test_os.Win32ListdirTests.test_listdir_extended_path @ win32-AMD64 +test.test_os.Win32ListdirTests.test_listdir_no_extended_path @ win32-AMD64 +# Transiently gets different count of file handles +!test.test_os.Win32NtTests.test_getfinalpathname_handles @ win32-AMD64 +test.test_os.Win32NtTests.test_stat_unlink_race @ win32-AMD64 +test.test_os.Win32SymlinkTests.test_12084 @ win32-AMD64 +test.test_os.Win32SymlinkTests.test_29248 @ win32-AMD64 +test.test_os.Win32SymlinkTests.test_buffer_overflow @ win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_osx_env.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_osx_env.txt deleted file mode 100644 index 4ac9250a85..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_osx_env.txt +++ /dev/null @@ -1 +0,0 @@ -*graalpython.lib-python.3.test.test_osx_env.OSXEnvironmentVariableTestCase.test_pythonexecutable_sets_sys_executable diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pathlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pathlib.txt index 3631a01e28..6e4258d86c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pathlib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pathlib.txt @@ -1,457 +1,418 @@ -*graalpython.lib-python.3.test.test_pathlib.CompatiblePathTest.test_rtruediv -*graalpython.lib-python.3.test.test_pathlib.CompatiblePathTest.test_truediv -*graalpython.lib-python.3.test.test_pathlib.NTFlavourTest.test_parse_parts -*graalpython.lib-python.3.test.test_pathlib.NTFlavourTest.test_parse_parts_common -*graalpython.lib-python.3.test.test_pathlib.NTFlavourTest.test_splitroot -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_absolute_common -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_chmod -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_chmod_follow_symlinks_true -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_class_getitem -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_complex_symlinks_absolute -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_complex_symlinks_relative -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_complex_symlinks_relative_dot_dot -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_concrete_class -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_cwd -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_empty_path -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_exists -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_expanduser_common -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_glob_common -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_glob_dotdot -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_glob_empty_pattern -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_glob_long_symlink -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_glob_many_open_files -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_glob_permissions -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_group -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_hardlink_to -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_home -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_is_block_device_false -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_is_char_device_false -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_is_char_device_true -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_is_dir -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_is_fifo_false -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_is_fifo_true -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_is_file -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_is_mount -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_is_socket_false -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_is_socket_true -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_is_symlink -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_iterdir -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_iterdir_nodir -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_iterdir_symlink -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_link_to -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_link_to_not_implemented -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_lstat -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_lstat_nosymlink -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_mkdir -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_mkdir_concurrent_parent_creation -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_mkdir_exist_ok -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_mkdir_exist_ok_root -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_mkdir_exist_ok_with_parent -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_mkdir_no_parents_file -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_mkdir_parents -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_mkdir_with_child_file -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_mkdir_with_unknown_drive -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_open_common -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_owner -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_parts_interning -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_pickling_common -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_read_write_bytes -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_read_write_text -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_readlink -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_rename -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_replace -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_resolve_common -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_resolve_dot -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_resolve_nonexist_relative_issue38671 -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_rglob_common -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_rglob_symlink_loop -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_rmdir -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_samefile -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_stat -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_stat_no_follow_symlinks -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_stat_no_follow_symlinks_nosymlink -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_symlink_to -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_touch_common -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_touch_nochange -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_unlink -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_unlink_missing_ok -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_unsupported_flavour -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_with -*graalpython.lib-python.3.test.test_pathlib.PathTest.test_write_text_with_newlines -*graalpython.lib-python.3.test.test_pathlib.PosixFlavourTest.test_parse_parts -*graalpython.lib-python.3.test.test_pathlib.PosixFlavourTest.test_parse_parts_common -*graalpython.lib-python.3.test.test_pathlib.PosixFlavourTest.test_splitroot -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_anchor_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_as_bytes_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_as_posix_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_as_uri -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_as_uri_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_as_uri_non_ascii -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_constructor_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_div -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_div_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_drive_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_eq -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_eq_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_equivalences -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_fspath_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_is_absolute -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_is_relative_to_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_is_reserved -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_join -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_join_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_match -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_match_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_name_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_ordering_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_parent_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_parents_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_parts_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_pickling_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_relative_to_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_repr_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_root -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_root_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_stem_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_str_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_str_subclass_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_suffix_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_suffixes_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_with_name_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_with_stem_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathAsPureTest.test_with_suffix_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_absolute -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_absolute_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_chmod -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_chmod_follow_symlinks_true -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_complex_symlinks_absolute -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_complex_symlinks_relative -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_complex_symlinks_relative_dot_dot -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_cwd -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_empty_path -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_exists -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_expanduser -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_expanduser_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_glob -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_glob_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_glob_dotdot -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_glob_long_symlink -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_glob_many_open_files -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_glob_permissions -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_group -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_handling_bad_descriptor -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_hardlink_to -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_home -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_is_block_device_false -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_is_char_device_false -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_is_char_device_true -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_is_dir -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_is_fifo_false -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_is_fifo_true -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_is_file -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_is_mount -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_is_socket_false -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_is_socket_true -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_is_symlink -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_iterdir -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_iterdir_nodir -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_iterdir_symlink -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_link_to -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_link_to_not_implemented -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_lstat -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_lstat_nosymlink -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_mkdir -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_mkdir_concurrent_parent_creation -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_mkdir_exist_ok -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_mkdir_exist_ok_root -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_mkdir_exist_ok_with_parent -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_mkdir_no_parents_file -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_mkdir_parents -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_mkdir_with_child_file -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_mkdir_with_unknown_drive -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_open_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_open_mode -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_owner -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_parts_interning -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_pickling_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_read_write_bytes -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_read_write_text -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_readlink -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_rename -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_replace -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_resolve_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_resolve_dot -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_resolve_loop -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_resolve_nonexist_relative_issue38671 -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_resolve_root -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_rglob -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_rglob_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_rglob_symlink_loop -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_rmdir -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_samefile -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_stat -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_stat_no_follow_symlinks -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_stat_no_follow_symlinks_nosymlink -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_symlink_to -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_touch_common -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_touch_mode -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_touch_nochange -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_unlink -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_unlink_missing_ok -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_with -*graalpython.lib-python.3.test.test_pathlib.PosixPathTest.test_write_text_with_newlines -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_anchor_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_as_bytes_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_as_posix_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_as_uri_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_concrete_class -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_constructor_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_different_flavours_unequal -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_different_flavours_unordered -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_div_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_drive_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_eq_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_equivalences -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_fspath_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_is_relative_to_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_join_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_match_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_name_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_ordering_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_parent_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_parents_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_parts_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_pickling_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_relative_to_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_repr_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_root_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_stem_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_str_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_str_subclass_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_suffix_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_suffixes_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_with_name_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_with_stem_common -*graalpython.lib-python.3.test.test_pathlib.PurePathTest.test_with_suffix_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_anchor_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_as_bytes_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_as_posix_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_as_uri -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_as_uri_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_as_uri_non_ascii -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_constructor_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_div -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_div_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_drive_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_eq -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_eq_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_equivalences -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_fspath_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_is_absolute -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_is_relative_to_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_is_reserved -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_join -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_join_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_match -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_match_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_name_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_ordering_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_parent_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_parents_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_parts_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_pickling_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_relative_to_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_repr_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_root -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_root_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_stem_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_str_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_str_subclass_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_suffix_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_suffixes_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_with_name_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_with_stem_common -*graalpython.lib-python.3.test.test_pathlib.PurePosixPathTest.test_with_suffix_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_anchor -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_anchor_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_as_bytes_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_as_posix_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_as_uri -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_as_uri_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_constructor_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_div -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_div_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_drive -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_drive_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_eq -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_eq_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_equivalences -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_fspath_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_is_absolute -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_is_relative_to -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_is_relative_to_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_is_reserved -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_join -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_join_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_match_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_name -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_name_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_ordering_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_parent -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_parent_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_parents -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_parents_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_parts -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_parts_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_pickling_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_relative_to -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_relative_to_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_repr_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_root -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_root_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_stem -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_stem_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_str -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_str_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_str_subclass -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_str_subclass_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_suffix -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_suffix_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_suffixes -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_suffixes_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_with_name -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_with_name_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_with_stem -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_with_stem_common -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_with_suffix -*graalpython.lib-python.3.test.test_pathlib.PureWindowsPathTest.test_with_suffix_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_anchor -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_anchor_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_as_bytes_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_as_posix_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_as_uri -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_as_uri_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_constructor_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_div -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_div_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_drive -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_drive_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_eq -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_eq_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_equivalences -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_fspath_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_group -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_is_absolute -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_is_relative_to -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_is_relative_to_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_is_reserved -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_join -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_join_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_match_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_name -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_name_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_ordering_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_owner -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_parent -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_parent_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_parents -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_parents_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_parts -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_parts_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_pickling_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_relative_to -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_relative_to_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_repr_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_root -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_root_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_stem -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_stem_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_str -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_str_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_str_subclass -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_str_subclass_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_suffix -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_suffix_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_suffixes -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_suffixes_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_with_name -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_with_name_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_with_stem -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_with_stem_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_with_suffix -*graalpython.lib-python.3.test.test_pathlib.WindowsPathAsPureTest.test_with_suffix_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_absolute -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_absolute_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_chmod -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_chmod_follow_symlinks_true -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_complex_symlinks_absolute -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_complex_symlinks_relative -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_complex_symlinks_relative_dot_dot -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_cwd -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_empty_path -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_exists -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_expanduser -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_expanduser_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_glob -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_glob_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_glob_dotdot -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_glob_long_symlink -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_glob_many_open_files -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_glob_permissions -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_group -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_hardlink_to -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_home -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_is_block_device_false -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_is_char_device_false -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_is_char_device_true -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_is_dir -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_is_fifo_false -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_is_fifo_true -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_is_file -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_is_mount -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_is_socket_false -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_is_socket_true -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_is_symlink -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_iterdir -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_iterdir_nodir -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_iterdir_symlink -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_link_to -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_link_to_not_implemented -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_lstat -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_lstat_nosymlink -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_mkdir -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_mkdir_concurrent_parent_creation -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_mkdir_exist_ok -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_mkdir_exist_ok_root -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_mkdir_exist_ok_with_parent -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_mkdir_no_parents_file -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_mkdir_parents -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_mkdir_with_child_file -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_mkdir_with_unknown_drive -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_open_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_owner -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_parts_interning -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_pickling_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_read_write_bytes -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_read_write_text -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_readlink -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_rename -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_replace -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_resolve_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_resolve_dot -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_resolve_nonexist_relative_issue38671 -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_rglob -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_rglob_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_rglob_symlink_loop -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_rmdir -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_samefile -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_stat -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_stat_no_follow_symlinks -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_stat_no_follow_symlinks_nosymlink -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_symlink_to -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_touch_common -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_touch_nochange -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_unlink -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_unlink_missing_ok -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_with -*graalpython.lib-python.3.test.test_pathlib.WindowsPathTest.test_write_text_with_newlines +test.test_pathlib.CompatiblePathTest.test_rtruediv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.CompatiblePathTest.test_truediv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.NTFlavourTest.test_parse_parts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.NTFlavourTest.test_parse_parts_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.NTFlavourTest.test_splitroot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_absolute_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_chmod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PathTest.test_chmod_follow_symlinks_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PathTest.test_complex_symlinks_absolute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PathTest.test_complex_symlinks_relative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PathTest.test_complex_symlinks_relative_dot_dot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PathTest.test_concrete_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_empty_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_expanduser_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_glob_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PathTest.test_glob_dotdot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_glob_empty_pattern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_glob_long_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_glob_many_open_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_glob_permissions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_hardlink_to @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PathTest.test_is_block_device_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_is_char_device_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_is_char_device_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PathTest.test_is_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_is_fifo_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_is_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_is_mount @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PathTest.test_is_socket_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_is_socket_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PathTest.test_is_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PathTest.test_iterdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_iterdir_nodir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_iterdir_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_link_to @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PathTest.test_lstat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_lstat_nosymlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_mkdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_mkdir_concurrent_parent_creation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_mkdir_exist_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_mkdir_exist_ok_root @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PathTest.test_mkdir_exist_ok_with_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_mkdir_no_parents_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_mkdir_parents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_mkdir_with_child_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_mkdir_with_unknown_drive @ win32-AMD64 +test.test_pathlib.PathTest.test_open_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_parts_interning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_pickling_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_read_write_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_read_write_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_readlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PathTest.test_rename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_resolve_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PathTest.test_resolve_dot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PathTest.test_resolve_nonexist_relative_issue38671 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_rglob_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PathTest.test_rglob_symlink_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_rmdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_samefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_stat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PathTest.test_stat_no_follow_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_stat_no_follow_symlinks_nosymlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_symlink_to @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_touch_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_touch_nochange @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_unlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_unlink_missing_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_unsupported_flavour @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PathTest.test_write_text_with_newlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixFlavourTest.test_parse_parts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PosixFlavourTest.test_parse_parts_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PosixFlavourTest.test_splitroot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PosixPathAsPureTest.test_anchor_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_as_bytes_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_as_posix_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_as_uri @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_as_uri_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_as_uri_non_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_constructor_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_div @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_div_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_drive_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_eq_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_equivalences @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_fspath_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_is_absolute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_is_relative_to_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_is_reserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_join_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_match_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_name_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_ordering_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_parent_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_parents_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_parts_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_pickling_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_relative_to_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_repr_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_root @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_root_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_stem_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_str_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_str_subclass_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_suffix_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_suffixes_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_with_name_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_with_stem_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_with_suffix_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_absolute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_absolute_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_chmod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_chmod_follow_symlinks_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_complex_symlinks_absolute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_complex_symlinks_relative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_complex_symlinks_relative_dot_dot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_empty_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_expanduser_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_glob @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_glob_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_glob_dotdot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_glob_long_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_glob_many_open_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_glob_permissions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_handling_bad_descriptor @ darwin-arm64,darwin-x86_64 +test.test_pathlib.PosixPathTest.test_hardlink_to @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_block_device_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_char_device_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_char_device_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_fifo_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_mount @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_socket_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_socket_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_iterdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_iterdir_nodir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_iterdir_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_link_to @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_lstat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_lstat_nosymlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_mkdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_mkdir_concurrent_parent_creation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_mkdir_exist_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_mkdir_exist_ok_root @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_mkdir_exist_ok_with_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_mkdir_no_parents_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_mkdir_parents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_mkdir_with_child_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_open_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_open_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_parts_interning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_pickling_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_read_write_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_read_write_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_readlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_rename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_resolve_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_resolve_dot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_resolve_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_resolve_nonexist_relative_issue38671 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_resolve_root @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_rglob @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_rglob_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_rglob_symlink_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_rmdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_samefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_stat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_stat_no_follow_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_stat_no_follow_symlinks_nosymlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_symlink_to @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_touch_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_touch_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_touch_nochange @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_unlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_unlink_missing_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PosixPathTest.test_write_text_with_newlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pathlib.PurePathTest.test_anchor_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_as_bytes_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_as_posix_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_as_uri_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_concrete_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_constructor_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_different_flavours_unequal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_different_flavours_unordered @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_div_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_drive_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_eq_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_equivalences @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_fspath_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_is_relative_to_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_join_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_match_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_name_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_ordering_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_parent_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_parents_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_parts_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_pickling_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_relative_to_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_repr_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_root_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_stem_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_str_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_str_subclass_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_suffix_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_suffixes_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_with_name_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_with_stem_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePathTest.test_with_suffix_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_anchor_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_as_bytes_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_as_posix_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_as_uri @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_as_uri_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_as_uri_non_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_constructor_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_div @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_div_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_drive_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_eq_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_equivalences @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_fspath_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_is_absolute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_is_relative_to_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_is_reserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_join_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_match_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_name_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_ordering_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_parent_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_parents_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_parts_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_pickling_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_relative_to_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_repr_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_root @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_root_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_stem_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_str_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_str_subclass_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_suffix_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_suffixes_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_with_name_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_with_stem_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PurePosixPathTest.test_with_suffix_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_anchor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_anchor_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_as_bytes_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_as_posix_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_as_uri @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_as_uri_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_constructor_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_div @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_div_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_drive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_drive_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_eq_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_equivalences @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_fspath_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_is_absolute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_is_relative_to @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_is_relative_to_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_is_reserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_join_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_match_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_name_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_ordering_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_parent_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_parents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_parents_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_parts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_parts_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_pickling_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_relative_to @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_relative_to_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_repr_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_root @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_root_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_stem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_stem_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_str_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_str_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_str_subclass_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_suffix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_suffix_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_suffixes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_suffixes_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_with_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_with_name_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_with_stem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_with_stem_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_with_suffix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.PureWindowsPathTest.test_with_suffix_common @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_anchor @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_anchor_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_as_bytes_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_as_posix_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_as_uri @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_as_uri_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_constructor_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_div @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_div_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_drive @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_drive_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_eq @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_eq_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_equivalences @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_fspath_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_group @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_is_absolute @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_is_relative_to @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_is_relative_to_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_is_reserved @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_join @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_join_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_match_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_name @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_name_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_ordering_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_parent @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_parent_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_parents @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_parents_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_parts @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_parts_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_pickling_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_relative_to @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_relative_to_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_repr_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_root @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_root_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_stem @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_stem_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_str @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_str_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_str_subclass @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_str_subclass_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_suffix @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_suffix_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_suffixes @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_suffixes_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_with_name @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_with_name_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_with_stem @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_with_stem_common @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_with_suffix @ win32-AMD64 +test.test_pathlib.WindowsPathAsPureTest.test_with_suffix_common @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_absolute @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_absolute_common @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_cwd @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_empty_path @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_exists @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_expanduser @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_expanduser_common @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_glob_dotdot @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_glob_long_symlink @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_glob_many_open_files @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_glob_permissions @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_is_block_device_false @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_is_char_device_false @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_is_dir @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_is_fifo_false @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_is_file @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_is_socket_false @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_iterdir @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_iterdir_nodir @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_iterdir_symlink @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_lstat @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_lstat_nosymlink @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_mkdir @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_mkdir_concurrent_parent_creation @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_mkdir_exist_ok @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_mkdir_exist_ok_with_parent @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_mkdir_no_parents_file @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_mkdir_parents @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_mkdir_with_child_file @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_mkdir_with_unknown_drive @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_open_common @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_parts_interning @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_pickling_common @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_read_write_bytes @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_read_write_text @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_rename @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_replace @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_resolve_nonexist_relative_issue38671 @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_rglob @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_rglob_symlink_loop @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_rmdir @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_samefile @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_stat_no_follow_symlinks @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_stat_no_follow_symlinks_nosymlink @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_symlink_to @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_touch_common @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_touch_nochange @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_unlink @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_unlink_missing_ok @ win32-AMD64 +test.test_pathlib.WindowsPathTest.test_with @ win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_patma.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_patma.txt index 6c254f12ce..7ef2ae4182 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_patma.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_patma.txt @@ -1,310 +1,310 @@ -*graalpython.lib-python.3.test.test_patma.TestCompiler.test_refleaks -*graalpython.lib-python.3.test.test_patma.TestInheritance.test_late_registration_mapping -*graalpython.lib-python.3.test.test_patma.TestInheritance.test_late_registration_sequence -*graalpython.lib-python.3.test.test_patma.TestInheritance.test_multiple_inheritance_mapping -*graalpython.lib-python.3.test.test_patma.TestInheritance.test_multiple_inheritance_sequence -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_000 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_001 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_002 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_003 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_004 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_005 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_006 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_007 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_008 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_009 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_010 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_011 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_012 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_013 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_014 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_015 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_016 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_017 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_018 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_019 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_020 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_021 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_022 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_023 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_024 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_025 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_026 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_027 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_028 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_029 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_030 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_031 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_032 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_033 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_034 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_035 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_036 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_037 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_038 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_039 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_040 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_041 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_042 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_043 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_044 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_045 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_046 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_047 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_048 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_049 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_050 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_051 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_052 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_053 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_054 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_055 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_056 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_057 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_058 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_059 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_060 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_061 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_062 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_063 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_064 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_065 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_066 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_067 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_068 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_069 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_070 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_071 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_072 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_073 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_074 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_075 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_076 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_077 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_078 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_079 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_080 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_081 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_082 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_083 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_084 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_085 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_086 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_087 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_088 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_089 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_090 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_091 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_092 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_093 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_094 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_095 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_096 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_097 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_098 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_099 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_100 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_101 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_102 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_103 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_104 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_105 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_106 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_107 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_108 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_109 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_110 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_111 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_112 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_113 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_114 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_115 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_116 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_117 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_118 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_119 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_120 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_121 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_122 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_123 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_124 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_125 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_126 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_127 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_128 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_129 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_130 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_131 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_132 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_133 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_134 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_135 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_136 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_137 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_138 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_139 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_140 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_141 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_142 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_143 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_144 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_145 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_146 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_147 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_148 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_149 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_150 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_151 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_152 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_153 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_154 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_155 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_156 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_157 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_158 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_159 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_160 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_161 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_162 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_163 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_164 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_165 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_166 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_167 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_168 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_169 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_170 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_171 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_172 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_173 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_174 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_175 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_176 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_177 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_178 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_179 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_180 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_181 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_182 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_183 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_184 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_185 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_186 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_187 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_188 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_189 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_190 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_191 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_192 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_193 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_194 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_195 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_196 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_197 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_198 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_199 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_200 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_201 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_202 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_203 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_204 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_205 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_206 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_207 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_208 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_209 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_210 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_211 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_212 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_213 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_214 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_215 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_216 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_217 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_218 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_219 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_220 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_221 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_222 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_223 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_224 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_225 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_226 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_227 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_228 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_229 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_230 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_231 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_232 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_233 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_234 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_235 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_236 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_237 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_238 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_239 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_240 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_241 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_242 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_243 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_244 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_245 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_246 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_247 -*graalpython.lib-python.3.test.test_patma.TestPatma.test_patma_248 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_alternative_patterns_bind_different_names_0 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_alternative_patterns_bind_different_names_1 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_attribute_name_repeated_in_class_pattern -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_imaginary_number_required_in_complex_literal_0 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_imaginary_number_required_in_complex_literal_1 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_invalid_syntax_0 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_invalid_syntax_1 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_invalid_syntax_2 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_invalid_syntax_3 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_mapping_pattern_duplicate_key -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_mapping_pattern_duplicate_key_edge_case0 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_mapping_pattern_duplicate_key_edge_case1 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_mapping_pattern_duplicate_key_edge_case2 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_mapping_pattern_duplicate_key_edge_case3 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_mapping_pattern_keys_may_only_match_literals_and_attribute_lookups -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_multiple_assignments_to_name_in_pattern_0 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_multiple_assignments_to_name_in_pattern_1 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_multiple_assignments_to_name_in_pattern_2 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_multiple_assignments_to_name_in_pattern_3 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_multiple_assignments_to_name_in_pattern_4 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_multiple_assignments_to_name_in_pattern_5 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_multiple_starred_names_in_sequence_pattern_0 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_multiple_starred_names_in_sequence_pattern_1 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_name_capture_makes_remaining_patterns_unreachable_0 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_name_capture_makes_remaining_patterns_unreachable_1 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_name_capture_makes_remaining_patterns_unreachable_2 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_name_capture_makes_remaining_patterns_unreachable_3 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_name_capture_makes_remaining_patterns_unreachable_4 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_patterns_may_only_match_literals_and_attribute_lookups_0 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_patterns_may_only_match_literals_and_attribute_lookups_1 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_real_number_required_in_complex_literal_0 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_real_number_required_in_complex_literal_1 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_real_number_required_in_complex_literal_2 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_real_number_required_in_complex_literal_3 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_wildcard_makes_remaining_patterns_unreachable_0 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_wildcard_makes_remaining_patterns_unreachable_1 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_wildcard_makes_remaining_patterns_unreachable_2 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_wildcard_makes_remaining_patterns_unreachable_3 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_wildcard_makes_remaining_patterns_unreachable_4 -*graalpython.lib-python.3.test.test_patma.TestSyntaxErrors.test_wildcard_makes_remaining_patterns_unreachable_5 -*graalpython.lib-python.3.test.test_patma.TestTracing.test_default_capture -*graalpython.lib-python.3.test.test_patma.TestTracing.test_default_wildcard -*graalpython.lib-python.3.test.test_patma.TestTracing.test_no_default -*graalpython.lib-python.3.test.test_patma.TestTracing.test_only_default_capture -*graalpython.lib-python.3.test.test_patma.TestTracing.test_only_default_wildcard -*graalpython.lib-python.3.test.test_patma.TestTracing.test_parser_deeply_nested_patterns -*graalpython.lib-python.3.test.test_patma.TestTracing.test_unreachable_code -*graalpython.lib-python.3.test.test_patma.TestTypeErrors.test_accepts_positional_subpatterns_0 -*graalpython.lib-python.3.test.test_patma.TestTypeErrors.test_accepts_positional_subpatterns_1 -*graalpython.lib-python.3.test.test_patma.TestTypeErrors.test_got_multiple_subpatterns_for_attribute_0 -*graalpython.lib-python.3.test.test_patma.TestTypeErrors.test_got_multiple_subpatterns_for_attribute_1 -*graalpython.lib-python.3.test.test_patma.TestTypeErrors.test_match_args_elements_must_be_strings -*graalpython.lib-python.3.test.test_patma.TestTypeErrors.test_match_args_must_be_a_tuple_0 -*graalpython.lib-python.3.test.test_patma.TestTypeErrors.test_match_args_must_be_a_tuple_1 -*graalpython.lib-python.3.test.test_patma.TestTypeErrors.test_match_args_must_be_a_tuple_2 -*graalpython.lib-python.3.test.test_patma.TestValueErrors.test_mapping_pattern_checks_duplicate_key_1 +test.test_patma.TestCompiler.test_refleaks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestInheritance.test_late_registration_mapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestInheritance.test_late_registration_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestInheritance.test_multiple_inheritance_mapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestInheritance.test_multiple_inheritance_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_000 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_001 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_002 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_003 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_004 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_005 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_006 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_007 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_008 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_009 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_010 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_011 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_012 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_013 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_014 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_015 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_016 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_017 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_018 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_019 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_020 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_021 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_022 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_023 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_024 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_025 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_026 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_027 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_028 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_029 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_030 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_031 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_032 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_033 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_034 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_035 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_036 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_037 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_038 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_039 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_040 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_041 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_042 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_043 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_044 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_045 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_046 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_047 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_048 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_049 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_050 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_051 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_052 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_053 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_054 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_055 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_056 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_057 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_058 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_059 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_060 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_061 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_062 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_063 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_064 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_065 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_066 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_067 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_068 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_069 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_070 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_071 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_072 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_073 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_074 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_075 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_076 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_077 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_078 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_079 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_080 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_081 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_082 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_083 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_084 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_085 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_086 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_087 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_088 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_089 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_090 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_091 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_092 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_093 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_094 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_095 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_096 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_097 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_098 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_099 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_100 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_101 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_102 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_103 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_104 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_105 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_106 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_107 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_108 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_109 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_110 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_111 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_112 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_113 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_114 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_115 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_116 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_117 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_118 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_119 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_120 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_121 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_122 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_123 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_124 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_125 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_126 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_127 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_128 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_129 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_130 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_131 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_132 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_133 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_134 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_135 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_136 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_137 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_138 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_139 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_140 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_141 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_142 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_143 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_144 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_145 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_146 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_147 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_148 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_149 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_150 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_151 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_152 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_153 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_154 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_155 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_156 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_157 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_158 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_159 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_160 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_161 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_162 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_163 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_164 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_165 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_166 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_167 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_168 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_169 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_170 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_171 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_172 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_173 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_174 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_175 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_176 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_177 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_178 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_179 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_180 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_181 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_182 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_183 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_184 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_185 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_186 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_187 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_188 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_189 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_190 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_191 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_192 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_193 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_194 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_195 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_196 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_197 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_198 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_199 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_200 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_201 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_202 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_203 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_204 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_205 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_206 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_207 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_208 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_209 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_210 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_211 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_212 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_213 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_214 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_215 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_216 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_217 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_218 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_219 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_220 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_221 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_222 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_223 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_224 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_225 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_226 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_227 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_228 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_229 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_230 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_231 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_232 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_233 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_234 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_235 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_236 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_237 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_238 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_239 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_240 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_241 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_242 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_243 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_244 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_245 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_246 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_247 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestPatma.test_patma_248 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_alternative_patterns_bind_different_names_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_alternative_patterns_bind_different_names_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_attribute_name_repeated_in_class_pattern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_imaginary_number_required_in_complex_literal_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_imaginary_number_required_in_complex_literal_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_invalid_syntax_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_invalid_syntax_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_invalid_syntax_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_invalid_syntax_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_mapping_pattern_duplicate_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_mapping_pattern_duplicate_key_edge_case0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_mapping_pattern_duplicate_key_edge_case1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_mapping_pattern_duplicate_key_edge_case2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_mapping_pattern_duplicate_key_edge_case3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_mapping_pattern_keys_may_only_match_literals_and_attribute_lookups @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_multiple_assignments_to_name_in_pattern_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_multiple_assignments_to_name_in_pattern_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_multiple_assignments_to_name_in_pattern_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_multiple_assignments_to_name_in_pattern_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_multiple_assignments_to_name_in_pattern_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_multiple_assignments_to_name_in_pattern_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_multiple_starred_names_in_sequence_pattern_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_multiple_starred_names_in_sequence_pattern_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_name_capture_makes_remaining_patterns_unreachable_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_name_capture_makes_remaining_patterns_unreachable_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_name_capture_makes_remaining_patterns_unreachable_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_name_capture_makes_remaining_patterns_unreachable_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_name_capture_makes_remaining_patterns_unreachable_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_patterns_may_only_match_literals_and_attribute_lookups_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_patterns_may_only_match_literals_and_attribute_lookups_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_real_number_required_in_complex_literal_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_real_number_required_in_complex_literal_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_real_number_required_in_complex_literal_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_real_number_required_in_complex_literal_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_wildcard_makes_remaining_patterns_unreachable_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_wildcard_makes_remaining_patterns_unreachable_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_wildcard_makes_remaining_patterns_unreachable_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_wildcard_makes_remaining_patterns_unreachable_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_wildcard_makes_remaining_patterns_unreachable_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestSyntaxErrors.test_wildcard_makes_remaining_patterns_unreachable_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestTracing.test_default_capture @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestTracing.test_default_wildcard @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestTracing.test_no_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestTracing.test_only_default_capture @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestTracing.test_only_default_wildcard @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestTracing.test_parser_deeply_nested_patterns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestTracing.test_unreachable_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestTypeErrors.test_accepts_positional_subpatterns_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestTypeErrors.test_accepts_positional_subpatterns_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestTypeErrors.test_got_multiple_subpatterns_for_attribute_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestTypeErrors.test_got_multiple_subpatterns_for_attribute_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestTypeErrors.test_match_args_elements_must_be_strings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestTypeErrors.test_match_args_must_be_a_tuple_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestTypeErrors.test_match_args_must_be_a_tuple_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestTypeErrors.test_match_args_must_be_a_tuple_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_patma.TestValueErrors.test_mapping_pattern_checks_duplicate_key_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pdb.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pdb.txt new file mode 100644 index 0000000000..3b6395f3b2 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pdb.txt @@ -0,0 +1,55 @@ +DocTestCase.test.test_pdb.test_list_commands @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_pdb.test_next_until_return_at_return_event @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_pdb.test_pdb_alias_command @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_pdb.test_pdb_breakpoint_commands @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_pdb.test_pdb_breakpoints_preserved_across_interactive_sessions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_pdb.test_pdb_continue_in_bottomframe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_pdb.test_pdb_display_command @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_pdb.test_pdb_displayhook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_pdb.test_pdb_issue_20766 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_pdb.test_pdb_issue_43318 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_pdb.test_pdb_issue_gh_101673 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_pdb.test_pdb_issue_gh_103225 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_pdb.test_pdb_issue_gh_65052 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_pdb.test_pdb_issue_gh_91742 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_pdb.test_pdb_pp_repr_exc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_pdb.test_pdb_run_with_code_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_pdb.test_pdb_skip_modules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_pdb.test_pdb_skip_modules_with_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_pdb.test_pdb_whatis_command @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.ChecklineTests.test_checkline_after_reset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.ChecklineTests.test_checkline_before_debugging @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.ChecklineTests.test_checkline_is_not_executable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_blocks_at_first_code_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_breakpoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_dir_as_script @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_find_function_empty_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_find_function_found @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_find_function_found_with_bom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_find_function_found_with_encoding_cookie @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_gh_93696_frozen_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_gh_94215_crash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_invalid_cmd_line_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_issue13120 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_issue13183 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_issue16180 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_issue26053 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_issue34266 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_issue36250 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_issue42383 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_issue42384 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_issue42384_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pdb.PdbTestCase.test_issue46434 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_issue7964 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_module_is_run_as_main @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_module_without_a_main @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_non_utf8_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_nonexistent_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pdb.PdbTestCase.test_package_without_a_main @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_readrc_homedir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_readrc_kwarg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_relative_imports @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_relative_imports_on_plain_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_run_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pdb.PdbTestCase.test_run_pdb_with_pdb @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_peg_generator.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_peg_generator.txt index 3c36892dbd..8d4cf1ffa4 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_peg_generator.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_peg_generator.txt @@ -1,4 +1,4 @@ -*unittest.loader.ModuleSkipped.test.test_peg_generator.test_c_parser -*unittest.loader.ModuleSkipped.test.test_peg_generator.test_first_sets -*unittest.loader.ModuleSkipped.test.test_peg_generator.test_grammar_validator -*unittest.loader.ModuleSkipped.test.test_peg_generator.test_pegen +unittest.loader.ModuleSkipped.test.test_peg_generator.test_c_parser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.loader.ModuleSkipped.test.test_peg_generator.test_first_sets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.loader.ModuleSkipped.test.test_peg_generator.test_grammar_validator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.loader.ModuleSkipped.test.test_peg_generator.test_pegen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pep646_syntax.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pep646_syntax.txt new file mode 100644 index 0000000000..63685db65d --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pep646_syntax.txt @@ -0,0 +1 @@ +DocTestCase.test.test_pep646_syntax.__test__.doctests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pickle.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pickle.txt index b79f353673..4d260cfbfa 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pickle.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pickle.txt @@ -1,761 +1,730 @@ -*graalpython.lib-python.3.test.test_pickle.CChainDispatchTableTests.test_class_dispatch_table -*graalpython.lib-python.3.test.test_pickle.CChainDispatchTableTests.test_default_dispatch_table -*graalpython.lib-python.3.test.test_pickle.CChainDispatchTableTests.test_instance_dispatch_table -*graalpython.lib-python.3.test.test_pickle.CDispatchTableTests.test_class_dispatch_table -*graalpython.lib-python.3.test.test_pickle.CDispatchTableTests.test_default_dispatch_table -*graalpython.lib-python.3.test.test_pickle.CDispatchTableTests.test_instance_dispatch_table -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_appends_on_non_lists -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_attribute_name_interning -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_bad_getattr -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_buffer_callback_error -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_buffers_error -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_buffers_numpy -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_builtin_exceptions -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_builtin_functions -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_builtin_types -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_bytearray -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_bytearray_memoization_bug -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_bytes -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_c_methods -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_compat_pickle -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_complex_newobj -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_complex_newobj_ex -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_dict_chunking -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_dynamic_class -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_ellipsis -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_evil_class_mutating_dict -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_evil_pickler_mutating_collection -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_float -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_float_format -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_framed_write_sizes_with_delayed_writer -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_framing_large_objects -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_framing_many_objects -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_getinitargs -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_global_ext1 -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_global_ext2 -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_global_ext4 -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_in_band_buffers -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_inband_accept_default_buffers_argument -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_int_pickling_efficiency -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_ints -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_large_pickles -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_list_chunking -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_local_lookup_error -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_long -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_long1 -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_long4 -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_many_puts_and_gets -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_metaclass -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_misc -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_nested_names -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_newobj_generic -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_newobj_list -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_newobj_list_slots -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_newobj_not_class -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_newobj_overridden_new -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_newobj_proxies -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_newobj_tuple -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_notimplemented -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_oob_buffers -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_oob_buffers_writable_to_readonly -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_optional_frames -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_pickle_to_2x -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_picklebuffer_error -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_proto -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_py_methods -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_and_inst -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_key -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_like -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_like_key -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_subclass -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_subclass_key -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_frozenset_and_inst -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_frozenset_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_inst -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_inst_state -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_list -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_list_and_inst -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_list_like -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_list_subclass -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_list_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_multi -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_nested_names -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_set -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_set_and_inst -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_set_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_dict -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_dict_key -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_dict_like -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_dict_like_key -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_dict_subclass -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_dict_subclass_key -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_inst -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_inst_state -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_list -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_list_like -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_list_subclass -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_reduce -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_reduce_bad_iterator -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_reduce_calls_base -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_reduce_ex_called -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_reduce_ex_calls_base -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_reduce_ex_overrides_reduce -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_reduce_overrides_default_reduce_ex -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_roundtrip_equality -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_set_chunking -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_setitems_on_non_dicts -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_short_tuples -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_simple_newobj -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_singleton_types -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_singletons -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_structseq -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_unicode -*graalpython.lib-python.3.test.test_pickle.CDumpPickle_LoadPickle.test_unicode_high_plane -*graalpython.lib-python.3.test.test_pickle.CIdPersPicklerTests.test_custom_pickler_dispatch_table_memleak -*graalpython.lib-python.3.test.test_pickle.CIdPersPicklerTests.test_pickler_reference_cycle -*graalpython.lib-python.3.test.test_pickle.CIdPersPicklerTests.test_protocol0_is_ascii_only -*graalpython.lib-python.3.test.test_pickle.CIdPersPicklerTests.test_return_correct_type -*graalpython.lib-python.3.test.test_pickle.CIdPersPicklerTests.test_unpickler_reference_cycle -*graalpython.lib-python.3.test.test_pickle.CPersPicklerTests.test_persistence -*graalpython.lib-python.3.test.test_pickle.CPickleTests.test_bad_init -*graalpython.lib-python.3.test.test_pickle.CPickleTests.test_callapi -*graalpython.lib-python.3.test.test_pickle.CPickleTests.test_dump_closed_file -*graalpython.lib-python.3.test.test_pickle.CPickleTests.test_dump_load_oob_buffers -*graalpython.lib-python.3.test.test_pickle.CPickleTests.test_dump_text_file -*graalpython.lib-python.3.test.test_pickle.CPickleTests.test_dumps_loads_oob_buffers -*graalpython.lib-python.3.test.test_pickle.CPickleTests.test_highest_protocol -*graalpython.lib-python.3.test.test_pickle.CPickleTests.test_incomplete_input -*graalpython.lib-python.3.test.test_pickle.CPickleTests.test_load_closed_file -*graalpython.lib-python.3.test.test_pickle.CPickleTests.test_load_from_and_dump_to_file -*graalpython.lib-python.3.test.test_pickle.CPickleTests.test_pickler_bad_file -*graalpython.lib-python.3.test.test_pickle.CPickleTests.test_unpickler_bad_file -*graalpython.lib-python.3.test.test_pickle.CPicklerHookTests.test_pickler_hook -*graalpython.lib-python.3.test.test_pickle.CPicklerHookTests.test_reducer_override_no_reference_cycle -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_appends_on_non_lists -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_attribute_name_interning -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_bad_getattr -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_buffer_callback_error -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_buffers_error -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_buffers_numpy -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_builtin_exceptions -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_builtin_functions -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_builtin_types -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_bytearray -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_bytearray_memoization_bug -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_bytes -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_c_methods -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_compat_pickle -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_complex_newobj -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_complex_newobj_ex -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_dict_chunking -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_dynamic_class -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_ellipsis -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_evil_class_mutating_dict -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_evil_pickler_mutating_collection -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_float -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_float_format -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_framed_write_sizes_with_delayed_writer -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_framing_large_objects -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_framing_many_objects -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_getinitargs -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_global_ext1 -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_global_ext2 -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_global_ext4 -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_in_band_buffers -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_inband_accept_default_buffers_argument -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_int_pickling_efficiency -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_ints -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_large_pickles -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_list_chunking -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_local_lookup_error -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_long -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_long1 -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_long4 -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_many_puts_and_gets -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_metaclass -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_misc -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_nested_names -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_newobj_generic -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_newobj_list -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_newobj_list_slots -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_newobj_not_class -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_newobj_overridden_new -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_newobj_proxies -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_newobj_tuple -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_notimplemented -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_oob_buffers -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_oob_buffers_writable_to_readonly -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_optional_frames -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_pickle_to_2x -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_picklebuffer_error -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_proto -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_py_methods -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_dict -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_dict_and_inst -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_dict_key -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_dict_like -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_dict_like_key -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_dict_subclass -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_dict_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_dict_subclass_key -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_frozenset_and_inst -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_frozenset_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_inst -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_inst_state -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_list -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_list_and_inst -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_list_like -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_list_subclass -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_list_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_multi -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_nested_names -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_set -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_set_and_inst -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_set_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_tuple_and_dict -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_tuple_and_dict_key -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_tuple_and_dict_like -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_tuple_and_dict_like_key -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_tuple_and_dict_subclass -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_tuple_and_dict_subclass_key -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_tuple_and_inst -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_tuple_and_inst_state -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_tuple_and_list -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_tuple_and_list_like -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_tuple_and_list_subclass -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_recursive_tuple_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_reduce -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_reduce_bad_iterator -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_reduce_calls_base -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_reduce_ex_called -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_reduce_ex_calls_base -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_reduce_ex_overrides_reduce -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_reduce_overrides_default_reduce_ex -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_roundtrip_equality -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_set_chunking -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_setitems_on_non_dicts -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_short_tuples -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_simple_newobj -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_singleton_types -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_singletons -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_structseq -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_unicode -*graalpython.lib-python.3.test.test_pickle.CPicklerTests.test_unicode_high_plane -*graalpython.lib-python.3.test.test_pickle.CPicklerUnpicklerObjectTests.test_clear_pickler_memo -*graalpython.lib-python.3.test.test_pickle.CPicklerUnpicklerObjectTests.test_issue18339 -*graalpython.lib-python.3.test.test_pickle.CPicklerUnpicklerObjectTests.test_multiple_unpicklings_minimal -*graalpython.lib-python.3.test.test_pickle.CPicklerUnpicklerObjectTests.test_multiple_unpicklings_seekable -*graalpython.lib-python.3.test.test_pickle.CPicklerUnpicklerObjectTests.test_multiple_unpicklings_unseekable -*graalpython.lib-python.3.test.test_pickle.CPicklerUnpicklerObjectTests.test_priming_pickler_memo -*graalpython.lib-python.3.test.test_pickle.CPicklerUnpicklerObjectTests.test_priming_unpickler_memo -*graalpython.lib-python.3.test.test_pickle.CPicklerUnpicklerObjectTests.test_reusing_unpickler_objects -*graalpython.lib-python.3.test.test_pickle.CPicklerUnpicklerObjectTests.test_unpickling_buffering_readline -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_bad_mark -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_bad_newobj -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_bad_newobj_ex -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_bad_reduce -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_bad_stack -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_badly_escaped_string -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_badly_quoted_string -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_binbytes -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_binbytes8 -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_binget -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_binunicode8 -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_bytearray8 -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_compat_unpickle -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_constants -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_correctly_quoted_string -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_dup -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_empty_bytestring -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_frame_readline -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_get -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_large_32b_binbytes8 -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_large_32b_binunicode8 -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_large_32b_bytearray8 -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_load_classic_instance -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_load_from_data0 -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_load_from_data1 -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_load_from_data2 -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_load_from_data3 -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_load_from_data4 -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_load_long_python2_str_as_bytes -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_load_python2_str_as_bytes -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_load_python2_unicode_as_str -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_long_binget -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_maxint64 -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_misc_get -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_negative_32b_binbytes -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_negative_32b_binput -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_negative_32b_binunicode -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_negative_put -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_short_binbytes -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_short_binunicode -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_truncated_data -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_unpickle_from_2x -*graalpython.lib-python.3.test.test_pickle.CUnpicklerTests.test_unpickle_module_race -*graalpython.lib-python.3.test.test_pickle.CompatPickleTests.test_exceptions -*graalpython.lib-python.3.test.test_pickle.CompatPickleTests.test_import -*graalpython.lib-python.3.test.test_pickle.CompatPickleTests.test_import_mapping -*graalpython.lib-python.3.test.test_pickle.CompatPickleTests.test_multiprocessing_exceptions -*graalpython.lib-python.3.test.test_pickle.CompatPickleTests.test_name_mapping -*graalpython.lib-python.3.test.test_pickle.CompatPickleTests.test_reverse_import_mapping -*graalpython.lib-python.3.test.test_pickle.CompatPickleTests.test_reverse_name_mapping -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_appends_on_non_lists -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_attribute_name_interning -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_bad_getattr -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_buffer_callback_error -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_buffers_error -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_buffers_numpy -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_builtin_exceptions -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_builtin_functions -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_builtin_types -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_bytearray -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_bytearray_memoization_bug -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_bytes -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_c_methods -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_compat_pickle -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_complex_newobj -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_complex_newobj_ex -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_dict_chunking -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_dynamic_class -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_ellipsis -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_evil_class_mutating_dict -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_evil_pickler_mutating_collection -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_float -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_float_format -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_framed_write_sizes_with_delayed_writer -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_framing_large_objects -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_framing_many_objects -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_getinitargs -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_global_ext1 -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_global_ext2 -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_global_ext4 -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_in_band_buffers -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_inband_accept_default_buffers_argument -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_int_pickling_efficiency -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_ints -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_large_pickles -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_list_chunking -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_local_lookup_error -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_long -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_long1 -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_long4 -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_many_puts_and_gets -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_metaclass -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_misc -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_nested_names -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_newobj_generic -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_newobj_list -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_newobj_list_slots -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_newobj_not_class -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_newobj_overridden_new -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_newobj_proxies -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_newobj_tuple -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_notimplemented -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_oob_buffers -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_oob_buffers_writable_to_readonly -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_optional_frames -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_pickle_to_2x -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_picklebuffer_error -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_proto -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_py_methods -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_and_inst -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_key -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_like -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_like_key -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_subclass -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_subclass_key -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_frozenset_and_inst -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_frozenset_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_inst -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_inst_state -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_list -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_list_and_inst -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_list_like -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_list_subclass -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_list_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_multi -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_nested_names -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_set -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_set_and_inst -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_set_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_dict -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_dict_key -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_dict_like -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_dict_like_key -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_dict_subclass -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_dict_subclass_key -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_inst -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_inst_state -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_list -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_list_like -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_list_subclass -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_reduce -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_reduce_bad_iterator -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_reduce_calls_base -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_reduce_ex_called -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_reduce_ex_calls_base -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_reduce_ex_overrides_reduce -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_reduce_overrides_default_reduce_ex -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_roundtrip_equality -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_set_chunking -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_setitems_on_non_dicts -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_short_tuples -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_simple_newobj -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_singleton_types -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_singletons -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_structseq -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_unicode -*graalpython.lib-python.3.test.test_pickle.DumpPickle_CLoadPickle.test_unicode_high_plane -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_appends_on_non_lists -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_attribute_name_interning -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_bad_getattr -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_bad_mark -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_bad_newobj -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_bad_newobj_ex -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_bad_reduce -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_bad_stack -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_badly_escaped_string -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_badly_quoted_string -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_binbytes -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_binbytes8 -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_binget -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_binunicode8 -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_buffer_callback_error -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_buffers_error -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_buffers_numpy -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_builtin_exceptions -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_builtin_functions -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_builtin_types -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_bytearray -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_bytearray8 -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_bytearray_memoization_bug -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_bytes -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_c_methods -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_compat_pickle -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_compat_unpickle -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_complex_newobj -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_complex_newobj_ex -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_constants -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_correctly_quoted_string -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_dict_chunking -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_dup -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_dynamic_class -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_ellipsis -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_empty_bytestring -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_evil_class_mutating_dict -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_evil_pickler_mutating_collection -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_float -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_float_format -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_frame_readline -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_framing_large_objects -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_framing_many_objects -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_get -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_getinitargs -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_global_ext1 -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_global_ext2 -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_global_ext4 -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_huge_bytes_32b -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_huge_bytes_64b -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_huge_long_32b -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_huge_str_32b -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_huge_str_64b -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_in_band_buffers -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_inband_accept_default_buffers_argument -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_int_pickling_efficiency -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_ints -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_large_32b_binbytes8 -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_large_32b_binunicode8 -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_large_32b_bytearray8 -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_large_pickles -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_list_chunking -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_load_classic_instance -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_load_from_data0 -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_load_from_data1 -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_load_from_data2 -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_load_from_data3 -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_load_from_data4 -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_load_long_python2_str_as_bytes -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_load_python2_str_as_bytes -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_load_python2_unicode_as_str -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_local_lookup_error -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_long -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_long1 -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_long4 -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_long_binget -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_many_puts_and_gets -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_maxint64 -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_metaclass -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_misc -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_misc_get -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_negative_32b_binbytes -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_negative_32b_binput -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_negative_32b_binunicode -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_negative_put -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_nested_names -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_newobj_generic -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_newobj_list -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_newobj_list_slots -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_newobj_not_class -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_newobj_overridden_new -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_newobj_proxies -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_newobj_tuple -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_notimplemented -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_oob_buffers -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_oob_buffers_writable_to_readonly -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_optional_frames -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_pickle_to_2x -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_picklebuffer_error -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_proto -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_py_methods -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_dict -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_dict_and_inst -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_dict_key -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_dict_like -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_dict_like_key -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_dict_subclass -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_dict_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_dict_subclass_key -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_frozenset_and_inst -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_frozenset_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_inst -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_inst_state -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_list -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_list_and_inst -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_list_like -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_list_subclass -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_list_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_multi -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_nested_names -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_set -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_set_and_inst -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_set_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_dict -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_dict_key -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_dict_like -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_dict_like_key -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_dict_subclass -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_dict_subclass_key -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_inst -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_inst_state -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_list -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_list_like -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_list_subclass -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_recursive_tuple_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_reduce -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_reduce_bad_iterator -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_reduce_calls_base -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_reduce_ex_called -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_reduce_ex_calls_base -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_reduce_ex_overrides_reduce -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_reduce_overrides_default_reduce_ex -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_roundtrip_equality -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_set_chunking -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_setitems_on_non_dicts -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_short_binbytes -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_short_binunicode -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_short_tuples -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_simple_newobj -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_singleton_types -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_singletons -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_structseq -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_truncated_data -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_unicode -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_unicode_high_plane -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_unpickle_from_2x -*graalpython.lib-python.3.test.test_pickle.InMemoryPickleTests.test_unpickle_module_race -*graalpython.lib-python.3.test.test_pickle.PyChainDispatchTableTests.test_class_dispatch_table -*graalpython.lib-python.3.test.test_pickle.PyChainDispatchTableTests.test_default_dispatch_table -*graalpython.lib-python.3.test.test_pickle.PyChainDispatchTableTests.test_instance_dispatch_table -*graalpython.lib-python.3.test.test_pickle.PyDispatchTableTests.test_class_dispatch_table -*graalpython.lib-python.3.test.test_pickle.PyDispatchTableTests.test_default_dispatch_table -*graalpython.lib-python.3.test.test_pickle.PyDispatchTableTests.test_instance_dispatch_table -*graalpython.lib-python.3.test.test_pickle.PyIdPersPicklerTests.test_custom_pickler_dispatch_table_memleak -*graalpython.lib-python.3.test.test_pickle.PyIdPersPicklerTests.test_pickler_reference_cycle -*graalpython.lib-python.3.test.test_pickle.PyIdPersPicklerTests.test_protocol0_is_ascii_only -*graalpython.lib-python.3.test.test_pickle.PyIdPersPicklerTests.test_return_correct_type -*graalpython.lib-python.3.test.test_pickle.PyIdPersPicklerTests.test_unpickler_reference_cycle -*graalpython.lib-python.3.test.test_pickle.PyPersPicklerTests.test_persistence -*graalpython.lib-python.3.test.test_pickle.PyPickleTests.test_bad_init -*graalpython.lib-python.3.test.test_pickle.PyPickleTests.test_callapi -*graalpython.lib-python.3.test.test_pickle.PyPickleTests.test_dump_closed_file -*graalpython.lib-python.3.test.test_pickle.PyPickleTests.test_dump_load_oob_buffers -*graalpython.lib-python.3.test.test_pickle.PyPickleTests.test_dump_text_file -*graalpython.lib-python.3.test.test_pickle.PyPickleTests.test_dumps_loads_oob_buffers -*graalpython.lib-python.3.test.test_pickle.PyPickleTests.test_highest_protocol -*graalpython.lib-python.3.test.test_pickle.PyPickleTests.test_incomplete_input -*graalpython.lib-python.3.test.test_pickle.PyPickleTests.test_load_closed_file -*graalpython.lib-python.3.test.test_pickle.PyPickleTests.test_load_from_and_dump_to_file -*graalpython.lib-python.3.test.test_pickle.PyPickleTests.test_pickler_bad_file -*graalpython.lib-python.3.test.test_pickle.PyPickleTests.test_unpickler_bad_file -*graalpython.lib-python.3.test.test_pickle.PyPicklerHookTests.test_pickler_hook -*graalpython.lib-python.3.test.test_pickle.PyPicklerHookTests.test_reducer_override_no_reference_cycle -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_appends_on_non_lists -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_attribute_name_interning -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_bad_getattr -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_buffer_callback_error -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_buffers_error -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_buffers_numpy -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_builtin_exceptions -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_builtin_functions -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_builtin_types -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_bytearray -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_bytearray_memoization_bug -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_bytes -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_c_methods -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_compat_pickle -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_complex_newobj -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_complex_newobj_ex -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_dict_chunking -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_dynamic_class -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_ellipsis -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_evil_class_mutating_dict -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_evil_pickler_mutating_collection -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_float -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_float_format -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_framed_write_sizes_with_delayed_writer -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_framing_large_objects -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_framing_many_objects -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_getinitargs -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_global_ext1 -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_global_ext2 -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_global_ext4 -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_in_band_buffers -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_inband_accept_default_buffers_argument -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_int_pickling_efficiency -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_ints -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_large_pickles -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_list_chunking -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_local_lookup_error -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_long -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_long1 -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_long4 -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_many_puts_and_gets -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_metaclass -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_misc -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_nested_names -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_newobj_generic -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_newobj_list -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_newobj_list_slots -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_newobj_not_class -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_newobj_overridden_new -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_newobj_proxies -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_newobj_tuple -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_notimplemented -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_oob_buffers -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_oob_buffers_writable_to_readonly -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_optional_frames -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_pickle_to_2x -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_picklebuffer_error -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_proto -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_py_methods -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_dict -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_dict_and_inst -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_dict_key -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_dict_like -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_dict_like_key -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_dict_subclass -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_dict_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_dict_subclass_key -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_frozenset_and_inst -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_frozenset_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_inst -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_inst_state -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_list -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_list_and_inst -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_list_like -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_list_subclass -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_list_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_multi -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_nested_names -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_set -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_set_and_inst -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_set_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_tuple_and_dict -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_tuple_and_dict_key -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_tuple_and_dict_like -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_tuple_and_dict_like_key -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_tuple_and_dict_subclass -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_tuple_and_dict_subclass_key -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_tuple_and_inst -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_tuple_and_inst_state -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_tuple_and_list -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_tuple_and_list_like -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_tuple_and_list_subclass -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_recursive_tuple_subclass_and_inst -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_reduce -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_reduce_bad_iterator -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_reduce_calls_base -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_reduce_ex_called -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_reduce_ex_calls_base -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_reduce_ex_overrides_reduce -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_reduce_overrides_default_reduce_ex -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_roundtrip_equality -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_set_chunking -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_setitems_on_non_dicts -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_short_tuples -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_simple_newobj -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_singleton_types -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_singletons -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_structseq -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_unicode -*graalpython.lib-python.3.test.test_pickle.PyPicklerTests.test_unicode_high_plane -*graalpython.lib-python.3.test.test_pickle.PyPicklerUnpicklerObjectTests.test_clear_pickler_memo -*graalpython.lib-python.3.test.test_pickle.PyPicklerUnpicklerObjectTests.test_multiple_unpicklings_minimal -*graalpython.lib-python.3.test.test_pickle.PyPicklerUnpicklerObjectTests.test_multiple_unpicklings_seekable -*graalpython.lib-python.3.test.test_pickle.PyPicklerUnpicklerObjectTests.test_multiple_unpicklings_unseekable -*graalpython.lib-python.3.test.test_pickle.PyPicklerUnpicklerObjectTests.test_priming_pickler_memo -*graalpython.lib-python.3.test.test_pickle.PyPicklerUnpicklerObjectTests.test_priming_unpickler_memo -*graalpython.lib-python.3.test.test_pickle.PyPicklerUnpicklerObjectTests.test_reusing_unpickler_objects -*graalpython.lib-python.3.test.test_pickle.PyPicklerUnpicklerObjectTests.test_unpickling_buffering_readline -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_bad_mark -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_bad_newobj -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_bad_newobj_ex -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_bad_reduce -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_bad_stack -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_badly_escaped_string -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_badly_quoted_string -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_binbytes -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_binbytes8 -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_binget -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_binunicode8 -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_bytearray8 -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_compat_unpickle -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_constants -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_correctly_quoted_string -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_dup -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_empty_bytestring -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_frame_readline -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_get -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_large_32b_binbytes8 -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_large_32b_binunicode8 -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_large_32b_bytearray8 -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_load_classic_instance -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_load_from_data0 -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_load_from_data1 -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_load_from_data2 -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_load_from_data3 -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_load_from_data4 -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_load_long_python2_str_as_bytes -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_load_python2_str_as_bytes -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_load_python2_unicode_as_str -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_long_binget -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_maxint64 -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_misc_get -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_negative_32b_binbytes -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_negative_32b_binput -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_negative_32b_binunicode -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_negative_put -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_short_binbytes -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_short_binunicode -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_truncated_data -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_unpickle_from_2x -*graalpython.lib-python.3.test.test_pickle.PyUnpicklerTests.test_unpickle_module_race -*graalpython.lib-python.3.test.test_pickle.SizeofTests.test_pickler -*graalpython.lib-python.3.test.test_pickle.SizeofTests.test_unpickler +test.test_pickle.CChainDispatchTableTests.test_class_dispatch_table @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CChainDispatchTableTests.test_default_dispatch_table @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CChainDispatchTableTests.test_instance_dispatch_table @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDispatchTableTests.test_class_dispatch_table @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDispatchTableTests.test_default_dispatch_table @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDispatchTableTests.test_instance_dispatch_table @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_appends_on_non_lists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_buffer_callback_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_buffers_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_builtin_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_builtin_functions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_builtin_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_bytearray_memoization_bug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_c_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_compat_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_complex_newobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_complex_newobj_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_dict_chunking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_dynamic_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_ellipsis @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_evil_class_mutating_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_evil_pickler_mutating_collection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_float_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_framed_write_sizes_with_delayed_writer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_framing_large_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_framing_many_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_getinitargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_global_ext1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_global_ext2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_global_ext4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_in_band_buffers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_inband_accept_default_buffers_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_int_pickling_efficiency @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_large_pickles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_list_chunking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_local_lookup_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_long1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_long4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_many_puts_and_gets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_metaclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_misc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_nested_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_newobj_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_newobj_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_newobj_list_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_newobj_not_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_newobj_overridden_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_newobj_proxies @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_newobj_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_notimplemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_oob_buffers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_oob_buffers_writable_to_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_optional_frames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_pickle_to_2x @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_picklebuffer_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_proto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_py_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_like_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_subclass_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_frozenset_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_frozenset_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_inst_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_list_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_list_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_list_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_list_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_multi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_nested_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_set_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_set_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_dict_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_dict_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_dict_like_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_dict_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_dict_subclass_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_inst_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_list_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_list_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_reduce_bad_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_reduce_calls_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_reduce_ex_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_reduce_ex_calls_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_reduce_ex_overrides_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_reduce_overrides_default_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_roundtrip_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_set_chunking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_setitems_on_non_dicts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_short_tuples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_simple_newobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_singleton_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_singletons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_structseq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CDumpPickle_LoadPickle.test_unicode_high_plane @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CIdPersPicklerTests.test_protocol0_is_ascii_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CIdPersPicklerTests.test_return_correct_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPersPicklerTests.test_persistence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPickleTests.test_bad_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPickleTests.test_callapi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPickleTests.test_dump_closed_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPickleTests.test_dump_load_oob_buffers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPickleTests.test_dump_text_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPickleTests.test_dumps_loads_oob_buffers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPickleTests.test_highest_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPickleTests.test_incomplete_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPickleTests.test_load_closed_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPickleTests.test_load_from_and_dump_to_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPickleTests.test_pickler_bad_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPickleTests.test_unpickler_bad_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerHookTests.test_pickler_hook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_appends_on_non_lists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_buffer_callback_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_buffers_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_builtin_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_builtin_functions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_builtin_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_bytearray_memoization_bug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_c_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_compat_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_complex_newobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_complex_newobj_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_dict_chunking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_dynamic_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_ellipsis @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_evil_class_mutating_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_evil_pickler_mutating_collection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_float_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_framed_write_sizes_with_delayed_writer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_framing_large_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_framing_many_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_getinitargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_global_ext1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_global_ext2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_global_ext4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_in_band_buffers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_inband_accept_default_buffers_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_int_pickling_efficiency @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_large_pickles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_list_chunking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_local_lookup_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_long1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_long4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_many_puts_and_gets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_metaclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_misc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_nested_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_newobj_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_newobj_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_newobj_list_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_newobj_not_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_newobj_overridden_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_newobj_proxies @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_newobj_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_notimplemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_oob_buffers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_oob_buffers_writable_to_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_optional_frames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_pickle_to_2x @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_picklebuffer_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_proto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_py_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_dict_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_dict_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_dict_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_dict_like_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_dict_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_dict_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_dict_subclass_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_frozenset_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_frozenset_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_inst_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_list_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_list_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_list_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_list_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_multi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_nested_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_set_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_set_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_dict_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_dict_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_dict_like_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_dict_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_dict_subclass_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_inst_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_list_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_list_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_recursive_tuple_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_reduce_bad_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_reduce_calls_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_reduce_ex_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_reduce_ex_calls_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_reduce_ex_overrides_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_reduce_overrides_default_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_roundtrip_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_set_chunking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_setitems_on_non_dicts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_short_tuples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_simple_newobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_singleton_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_singletons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_structseq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerTests.test_unicode_high_plane @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerUnpicklerObjectTests.test_clear_pickler_memo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerUnpicklerObjectTests.test_issue18339 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerUnpicklerObjectTests.test_multiple_unpicklings_minimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerUnpicklerObjectTests.test_multiple_unpicklings_seekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerUnpicklerObjectTests.test_multiple_unpicklings_unseekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerUnpicklerObjectTests.test_priming_pickler_memo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerUnpicklerObjectTests.test_priming_unpickler_memo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerUnpicklerObjectTests.test_reusing_unpickler_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CPicklerUnpicklerObjectTests.test_unpickling_buffering_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_bad_mark @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_bad_newobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_bad_newobj_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_bad_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_bad_stack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_badly_escaped_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_badly_quoted_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_binbytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_binbytes8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_binget @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_binunicode8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_bytearray8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_compat_unpickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_constants @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_correctly_quoted_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_dup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_empty_bytestring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_frame_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_large_32b_binbytes8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_large_32b_binunicode8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_large_32b_bytearray8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_load_classic_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_load_from_data0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_load_from_data1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_load_from_data2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_load_from_data3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_load_from_data4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_load_long_python2_str_as_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_load_python2_str_as_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_load_python2_unicode_as_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_long_binget @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_maxint64 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_misc_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_negative_32b_binbytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_negative_32b_binput @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_negative_32b_binunicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_negative_put @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_short_binbytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_short_binunicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_truncated_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_unpickle_from_2x @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CUnpicklerTests.test_unpickle_module_race @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CompatPickleTests.test_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CompatPickleTests.test_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CompatPickleTests.test_import_mapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CompatPickleTests.test_multiprocessing_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CompatPickleTests.test_name_mapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CompatPickleTests.test_reverse_import_mapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.CompatPickleTests.test_reverse_name_mapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_appends_on_non_lists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_buffer_callback_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_buffers_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_builtin_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_builtin_functions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_builtin_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_bytearray_memoization_bug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_c_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_compat_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_complex_newobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_complex_newobj_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_dict_chunking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_dynamic_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_ellipsis @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_evil_class_mutating_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_evil_pickler_mutating_collection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_float_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_framed_write_sizes_with_delayed_writer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_framing_large_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_framing_many_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_getinitargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_global_ext1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_global_ext2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_global_ext4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_in_band_buffers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_inband_accept_default_buffers_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_int_pickling_efficiency @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_large_pickles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_list_chunking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_local_lookup_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_long1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_long4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_many_puts_and_gets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_metaclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_misc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_nested_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_newobj_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_newobj_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_newobj_list_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_newobj_not_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_newobj_overridden_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_newobj_proxies @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_newobj_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_notimplemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_oob_buffers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_oob_buffers_writable_to_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_optional_frames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_pickle_to_2x @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_picklebuffer_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_proto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_py_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_like_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_subclass_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_frozenset_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_frozenset_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_inst_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_list_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_list_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_list_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_list_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_multi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_nested_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_set_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_set_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_dict_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_dict_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_dict_like_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_dict_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_dict_subclass_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_inst_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_list_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_list_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_reduce_bad_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_reduce_calls_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_reduce_ex_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_reduce_ex_calls_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_reduce_ex_overrides_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_reduce_overrides_default_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_roundtrip_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_set_chunking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_setitems_on_non_dicts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_short_tuples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_simple_newobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_singleton_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_singletons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_structseq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.DumpPickle_CLoadPickle.test_unicode_high_plane @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_appends_on_non_lists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_bad_mark @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_bad_newobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_bad_newobj_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_bad_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_bad_stack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_badly_escaped_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_badly_quoted_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_binbytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_binbytes8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_binget @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_binunicode8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_buffer_callback_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_buffers_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_builtin_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_builtin_functions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_builtin_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_bytearray8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_bytearray_memoization_bug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_c_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_compat_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_compat_unpickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_complex_newobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_complex_newobj_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_constants @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_correctly_quoted_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_dict_chunking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_dup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_dynamic_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_ellipsis @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_empty_bytestring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_evil_class_mutating_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_float_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_frame_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_framing_large_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_framing_many_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_getinitargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_global_ext1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_global_ext2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_global_ext4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_in_band_buffers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_inband_accept_default_buffers_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_int_pickling_efficiency @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_large_32b_binbytes8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_large_32b_binunicode8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_large_32b_bytearray8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_large_pickles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_list_chunking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_load_classic_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_load_from_data0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_load_from_data1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_load_from_data2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_load_from_data3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_load_from_data4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_load_long_python2_str_as_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_load_python2_str_as_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_load_python2_unicode_as_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_local_lookup_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_long1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_long4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_long_binget @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_many_puts_and_gets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_maxint64 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_metaclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_misc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_misc_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_negative_32b_binbytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_negative_32b_binput @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_negative_32b_binunicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_negative_put @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_nested_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_newobj_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_newobj_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_newobj_list_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_newobj_not_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_newobj_overridden_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_newobj_proxies @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_newobj_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_notimplemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_oob_buffers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_oob_buffers_writable_to_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_optional_frames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_pickle_to_2x @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_picklebuffer_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_proto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_py_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_dict_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_dict_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_dict_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_dict_like_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_dict_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_dict_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_dict_subclass_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_frozenset_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_frozenset_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_inst_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_list_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_list_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_list_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_list_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_multi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_nested_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_set_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_set_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_dict_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_dict_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_dict_like_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_dict_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_dict_subclass_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_inst_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_list_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_list_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_reduce_bad_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_reduce_calls_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_reduce_ex_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_reduce_ex_calls_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_reduce_ex_overrides_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_reduce_overrides_default_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_roundtrip_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_set_chunking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_setitems_on_non_dicts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_short_binbytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_short_binunicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_short_tuples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_simple_newobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_singleton_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_singletons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_structseq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_truncated_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_unicode_high_plane @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_unpickle_from_2x @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.InMemoryPickleTests.test_unpickle_module_race @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyChainDispatchTableTests.test_class_dispatch_table @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyChainDispatchTableTests.test_default_dispatch_table @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyChainDispatchTableTests.test_instance_dispatch_table @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyDispatchTableTests.test_class_dispatch_table @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyDispatchTableTests.test_default_dispatch_table @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyDispatchTableTests.test_instance_dispatch_table @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyIdPersPicklerTests.test_protocol0_is_ascii_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyIdPersPicklerTests.test_return_correct_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPersPicklerTests.test_persistence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPickleTests.test_bad_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPickleTests.test_callapi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPickleTests.test_dump_closed_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPickleTests.test_dump_load_oob_buffers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPickleTests.test_dump_text_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPickleTests.test_dumps_loads_oob_buffers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPickleTests.test_highest_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPickleTests.test_incomplete_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPickleTests.test_load_closed_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPickleTests.test_load_from_and_dump_to_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPickleTests.test_pickler_bad_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPickleTests.test_unpickler_bad_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerHookTests.test_pickler_hook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_appends_on_non_lists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_buffer_callback_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_buffers_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_builtin_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_builtin_functions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_builtin_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_bytearray_memoization_bug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_c_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_compat_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_complex_newobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_complex_newobj_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_dict_chunking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_dynamic_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_ellipsis @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_evil_class_mutating_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_evil_pickler_mutating_collection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_float_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_framed_write_sizes_with_delayed_writer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_framing_large_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_framing_many_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_getinitargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_global_ext1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_global_ext2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_global_ext4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_in_band_buffers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_inband_accept_default_buffers_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_int_pickling_efficiency @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_large_pickles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_list_chunking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_local_lookup_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_long1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_long4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_many_puts_and_gets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_metaclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_misc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_nested_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_newobj_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_newobj_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_newobj_list_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_newobj_not_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_newobj_overridden_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_newobj_proxies @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_newobj_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_notimplemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_oob_buffers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_oob_buffers_writable_to_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_optional_frames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_pickle_to_2x @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_picklebuffer_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_proto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_py_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_dict_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_dict_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_dict_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_dict_like_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_dict_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_dict_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_dict_subclass_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_frozenset_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_frozenset_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_inst_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_list_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_list_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_list_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_list_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_multi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_nested_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_set_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_set_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_dict_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_dict_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_dict_like_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_dict_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_dict_subclass_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_inst_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_list_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_list_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_reduce_bad_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_reduce_calls_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_reduce_ex_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_reduce_ex_calls_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_reduce_ex_overrides_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_reduce_overrides_default_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_roundtrip_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_set_chunking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_setitems_on_non_dicts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_short_tuples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_simple_newobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_singleton_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_singletons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_structseq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerTests.test_unicode_high_plane @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerUnpicklerObjectTests.test_clear_pickler_memo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerUnpicklerObjectTests.test_multiple_unpicklings_minimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerUnpicklerObjectTests.test_multiple_unpicklings_seekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerUnpicklerObjectTests.test_multiple_unpicklings_unseekable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerUnpicklerObjectTests.test_priming_pickler_memo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerUnpicklerObjectTests.test_priming_unpickler_memo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerUnpicklerObjectTests.test_reusing_unpickler_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyPicklerUnpicklerObjectTests.test_unpickling_buffering_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_bad_mark @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_bad_newobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_bad_newobj_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_bad_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_bad_stack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_badly_escaped_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_badly_quoted_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_binbytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_binbytes8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_binget @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_binunicode8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_bytearray8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_compat_unpickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_constants @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_correctly_quoted_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_dup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_empty_bytestring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_frame_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_large_32b_binbytes8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_large_32b_binunicode8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_large_32b_bytearray8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_load_classic_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_load_from_data0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_load_from_data1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_load_from_data2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_load_from_data3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_load_from_data4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_load_long_python2_str_as_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_load_python2_str_as_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_load_python2_unicode_as_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_long_binget @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_maxint64 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_misc_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_negative_32b_binbytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_negative_32b_binput @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_negative_32b_binunicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_negative_put @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_short_binbytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_short_binunicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_truncated_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_unpickle_from_2x @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickle.PyUnpicklerTests.test_unpickle_module_race @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_picklebuffer.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_picklebuffer.txt index 90c7fa5734..26f026023f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_picklebuffer.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_picklebuffer.txt @@ -1,9 +1,8 @@ -*graalpython.lib-python.3.test.test_picklebuffer.PickleBufferTest.test_basics -*graalpython.lib-python.3.test.test_picklebuffer.PickleBufferTest.test_constructor_failure -*graalpython.lib-python.3.test.test_picklebuffer.PickleBufferTest.test_cycle -*graalpython.lib-python.3.test.test_picklebuffer.PickleBufferTest.test_ndarray_2d -*graalpython.lib-python.3.test.test_picklebuffer.PickleBufferTest.test_raw -*graalpython.lib-python.3.test.test_picklebuffer.PickleBufferTest.test_raw_ndarray -*graalpython.lib-python.3.test.test_picklebuffer.PickleBufferTest.test_raw_non_contiguous -*graalpython.lib-python.3.test.test_picklebuffer.PickleBufferTest.test_raw_released -*graalpython.lib-python.3.test.test_picklebuffer.PickleBufferTest.test_release +test.test_picklebuffer.PickleBufferTest.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_picklebuffer.PickleBufferTest.test_constructor_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_picklebuffer.PickleBufferTest.test_ndarray_2d @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_picklebuffer.PickleBufferTest.test_raw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_picklebuffer.PickleBufferTest.test_raw_ndarray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_picklebuffer.PickleBufferTest.test_raw_non_contiguous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_picklebuffer.PickleBufferTest.test_raw_released @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_picklebuffer.PickleBufferTest.test_release @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pickletools.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pickletools.txt index 6693e76d2a..29e80b3edd 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pickletools.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pickletools.txt @@ -1,111 +1,132 @@ -*graalpython.lib-python.3.test.test_pickletools.MiscTestCase.test__all__ -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_appends_on_non_lists -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_attribute_name_interning -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_bad_getattr -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_buffer_callback_error -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_buffers_error -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_buffers_numpy -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_builtin_exceptions -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_builtin_functions -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_builtin_types -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_bytearray -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_bytearray_memoization_bug -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_bytes -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_c_methods -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_compat_pickle -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_complex_newobj -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_complex_newobj_ex -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_dict_chunking -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_dynamic_class -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_ellipsis -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_evil_class_mutating_dict -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_evil_pickler_mutating_collection -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_float -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_float_format -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_framing_large_objects -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_framing_many_objects -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_getinitargs -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_global_ext1 -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_global_ext2 -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_global_ext4 -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_in_band_buffers -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_inband_accept_default_buffers_argument -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_int_pickling_efficiency -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_ints -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_large_pickles -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_list_chunking -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_local_lookup_error -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_long -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_long1 -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_long4 -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_many_puts_and_gets -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_metaclass -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_misc -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_nested_names -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_newobj_generic -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_newobj_list -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_newobj_list_slots -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_newobj_not_class -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_newobj_overridden_new -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_newobj_proxies -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_newobj_tuple -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_notimplemented -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_oob_buffers -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_oob_buffers_writable_to_readonly -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_optimize_binput_and_memoize -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_optimize_long_binget -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_optional_frames -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_picklebuffer_error -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_proto -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_py_methods -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_dict -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_dict_and_inst -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_dict_key -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_dict_like -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_dict_like_key -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_dict_subclass -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_dict_subclass_and_inst -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_dict_subclass_key -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_frozenset_and_inst -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_frozenset_subclass_and_inst -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_inst -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_inst_state -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_list -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_list_and_inst -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_list_like -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_list_subclass -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_list_subclass_and_inst -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_multi -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_nested_names -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_set -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_set_and_inst -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_set_subclass_and_inst -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_dict -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_dict_key -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_dict_like -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_dict_like_key -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_dict_subclass -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_dict_subclass_key -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_inst -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_inst_state -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_list -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_list_like -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_list_subclass -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_subclass_and_inst -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_reduce -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_reduce_bad_iterator -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_reduce_calls_base -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_reduce_ex_called -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_reduce_ex_calls_base -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_reduce_ex_overrides_reduce -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_reduce_overrides_default_reduce_ex -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_roundtrip_equality -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_set_chunking -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_setitems_on_non_dicts -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_short_tuples -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_simple_newobj -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_singleton_types -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_singletons -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_structseq -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_unicode -*graalpython.lib-python.3.test.test_pickletools.OptimizedPickleTests.test_unicode_high_plane +DocTestCase.pickletools.__test__.disassembler_memo_test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.__test__.disassembler_test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_bytearray8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_bytes1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_bytes4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_bytes8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_decimalnl_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_decimalnl_short @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_float8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_floatnl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_int4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_long1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_long4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_string1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_string4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_stringnl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_stringnl_noescape_pair @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_uint1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_uint2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_uint4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_uint8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_unicodestring1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_unicodestring4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_unicodestring8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.pickletools.read_unicodestringnl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.MiscTestCase.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_appends_on_non_lists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_buffer_callback_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_buffers_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_builtin_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_builtin_functions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_builtin_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_bytearray_memoization_bug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_c_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_compat_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_complex_newobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_complex_newobj_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_dict_chunking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_dynamic_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_ellipsis @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_evil_class_mutating_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_float_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_framing_large_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_framing_many_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_getinitargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_global_ext1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_global_ext2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_global_ext4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_in_band_buffers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_inband_accept_default_buffers_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_int_pickling_efficiency @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_large_pickles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_list_chunking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_local_lookup_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_long1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_long4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_many_puts_and_gets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_metaclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_misc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_nested_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_newobj_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_newobj_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_newobj_list_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_newobj_not_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_newobj_overridden_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_newobj_proxies @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_newobj_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_notimplemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_oob_buffers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_oob_buffers_writable_to_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_optimize_binput_and_memoize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_optimize_long_binget @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_optional_frames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_picklebuffer_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_proto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_py_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_dict_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_dict_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_dict_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_dict_like_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_dict_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_dict_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_dict_subclass_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_frozenset_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_frozenset_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_inst_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_list_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_list_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_list_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_list_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_multi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_nested_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_set_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_set_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_dict_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_dict_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_dict_like_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_dict_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_dict_subclass_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_inst_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_list_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_list_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_subclass_and_inst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_reduce_bad_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_reduce_calls_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_reduce_ex_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_reduce_ex_calls_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_reduce_ex_overrides_reduce @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_reduce_overrides_default_reduce_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_roundtrip_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_set_chunking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_setitems_on_non_dicts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_short_tuples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_simple_newobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_singleton_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_singletons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_structseq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pickletools.OptimizedPickleTests.test_unicode_high_plane @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pipes.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pipes.txt index f114d58ff0..2a0ef8bf4a 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pipes.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pipes.txt @@ -1,15 +1,14 @@ -*graalpython.lib-python.3.test.test_pipes.SimplePipeTests.testBadAppendOptions -*graalpython.lib-python.3.test.test_pipes.SimplePipeTests.testBadOpenMode -*graalpython.lib-python.3.test.test_pipes.SimplePipeTests.testBadPrependOptions -*graalpython.lib-python.3.test.test_pipes.SimplePipeTests.testClone -*graalpython.lib-python.3.test.test_pipes.SimplePipeTests.testEmptyPipeline1 -*graalpython.lib-python.3.test.test_pipes.SimplePipeTests.testEmptyPipeline2 -*graalpython.lib-python.3.test.test_pipes.SimplePipeTests.testEmptyPipeline3 -*graalpython.lib-python.3.test.test_pipes.SimplePipeTests.testReadOpenSink -*graalpython.lib-python.3.test.test_pipes.SimplePipeTests.testRepr -*graalpython.lib-python.3.test.test_pipes.SimplePipeTests.testSetDebug -*graalpython.lib-python.3.test.test_pipes.SimplePipeTests.testSimplePipe1 -*graalpython.lib-python.3.test.test_pipes.SimplePipeTests.testSimplePipe2 -*graalpython.lib-python.3.test.test_pipes.SimplePipeTests.testSimplePipe3 -*graalpython.lib-python.3.test.test_pipes.SimplePipeTests.testWriteOpenSource -*graalpython.lib-python.3.test.test_pipes.TestMain.test_main +test.test_pipes.SimplePipeTests.testBadAppendOptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pipes.SimplePipeTests.testBadOpenMode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pipes.SimplePipeTests.testBadPrependOptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pipes.SimplePipeTests.testClone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pipes.SimplePipeTests.testEmptyPipeline1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pipes.SimplePipeTests.testEmptyPipeline2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pipes.SimplePipeTests.testEmptyPipeline3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pipes.SimplePipeTests.testReadOpenSink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pipes.SimplePipeTests.testRepr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pipes.SimplePipeTests.testSetDebug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pipes.SimplePipeTests.testSimplePipe1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pipes.SimplePipeTests.testSimplePipe2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pipes.SimplePipeTests.testSimplePipe3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pipes.SimplePipeTests.testWriteOpenSource @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pkg.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pkg.txt index ce5ad15493..0b5216237c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pkg.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pkg.txt @@ -1,8 +1,8 @@ -*graalpython.lib-python.3.test.test_pkg.TestPkg.test_1 -*graalpython.lib-python.3.test.test_pkg.TestPkg.test_2 -*graalpython.lib-python.3.test.test_pkg.TestPkg.test_3 -*graalpython.lib-python.3.test.test_pkg.TestPkg.test_4 -*graalpython.lib-python.3.test.test_pkg.TestPkg.test_5 -*graalpython.lib-python.3.test.test_pkg.TestPkg.test_6 -*graalpython.lib-python.3.test.test_pkg.TestPkg.test_7 -*graalpython.lib-python.3.test.test_pkg.TestPkg.test_8 +test.test_pkg.TestPkg.test_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkg.TestPkg.test_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkg.TestPkg.test_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkg.TestPkg.test_4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkg.TestPkg.test_5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkg.TestPkg.test_6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkg.TestPkg.test_7 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkg.TestPkg.test_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pkgutil.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pkgutil.txt index 0c14437098..92ca04f988 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pkgutil.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pkgutil.txt @@ -1,27 +1,26 @@ -*graalpython.lib-python.3.test.test_pkgutil.ExtendPathTests.test_iter_importers -*graalpython.lib-python.3.test.test_pkgutil.ExtendPathTests.test_mixed_namespace -*graalpython.lib-python.3.test.test_pkgutil.ExtendPathTests.test_simple -*graalpython.lib-python.3.test.test_pkgutil.ImportlibMigrationTests.test_find_loader_avoids_emulation -*graalpython.lib-python.3.test.test_pkgutil.ImportlibMigrationTests.test_find_loader_missing_module -*graalpython.lib-python.3.test.test_pkgutil.ImportlibMigrationTests.test_get_importer_avoids_emulation -*graalpython.lib-python.3.test.test_pkgutil.ImportlibMigrationTests.test_get_loader_None_in_sys_modules -*graalpython.lib-python.3.test.test_pkgutil.ImportlibMigrationTests.test_get_loader_avoids_emulation -*graalpython.lib-python.3.test.test_pkgutil.ImportlibMigrationTests.test_get_loader_handles_missing_loader_attribute -*graalpython.lib-python.3.test.test_pkgutil.ImportlibMigrationTests.test_get_loader_handles_missing_spec_attribute -*graalpython.lib-python.3.test.test_pkgutil.ImportlibMigrationTests.test_get_loader_handles_spec_attribute_none -*graalpython.lib-python.3.test.test_pkgutil.ImportlibMigrationTests.test_importer_deprecated -*graalpython.lib-python.3.test.test_pkgutil.ImportlibMigrationTests.test_issue44061 -*graalpython.lib-python.3.test.test_pkgutil.ImportlibMigrationTests.test_iter_importers_avoids_emulation -*graalpython.lib-python.3.test.test_pkgutil.ImportlibMigrationTests.test_loader_deprecated -*graalpython.lib-python.3.test.test_pkgutil.NestedNamespacePackageTest.test_nested -*graalpython.lib-python.3.test.test_pkgutil.PkgutilPEP302Tests.test_alreadyloaded -*graalpython.lib-python.3.test.test_pkgutil.PkgutilPEP302Tests.test_getdata_pep302 -*graalpython.lib-python.3.test.test_pkgutil.PkgutilTests.test_getdata_filesys -*graalpython.lib-python.3.test.test_pkgutil.PkgutilTests.test_getdata_zipfile -*graalpython.lib-python.3.test.test_pkgutil.PkgutilTests.test_issue44061_iter_modules -*graalpython.lib-python.3.test.test_pkgutil.PkgutilTests.test_name_resolution -*graalpython.lib-python.3.test.test_pkgutil.PkgutilTests.test_unreadable_dir_on_syspath -*graalpython.lib-python.3.test.test_pkgutil.PkgutilTests.test_walk_packages_raises_on_string_or_bytes_input -*graalpython.lib-python.3.test.test_pkgutil.PkgutilTests.test_walkpackages_filesys -*graalpython.lib-python.3.test.test_pkgutil.PkgutilTests.test_walkpackages_zipfile -*graalpython.lib-python.3.test.test_pkgutil.TestMain.test_main +test.test_pkgutil.ExtendPathTests.test_iter_importers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.ExtendPathTests.test_mixed_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.ExtendPathTests.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.ImportlibMigrationTests.test_find_loader_avoids_emulation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.ImportlibMigrationTests.test_find_loader_missing_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.ImportlibMigrationTests.test_get_importer_avoids_emulation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.ImportlibMigrationTests.test_get_loader_None_in_sys_modules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.ImportlibMigrationTests.test_get_loader_avoids_emulation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.ImportlibMigrationTests.test_get_loader_handles_missing_loader_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.ImportlibMigrationTests.test_get_loader_handles_missing_spec_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.ImportlibMigrationTests.test_get_loader_handles_spec_attribute_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.ImportlibMigrationTests.test_importer_deprecated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.ImportlibMigrationTests.test_issue44061 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.ImportlibMigrationTests.test_iter_importers_avoids_emulation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.ImportlibMigrationTests.test_loader_deprecated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.NestedNamespacePackageTest.test_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.PkgutilPEP302Tests.test_alreadyloaded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.PkgutilPEP302Tests.test_getdata_pep302 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.PkgutilTests.test_getdata_filesys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.PkgutilTests.test_getdata_zipfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.PkgutilTests.test_issue44061_iter_modules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.PkgutilTests.test_name_resolution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.PkgutilTests.test_unreadable_dir_on_syspath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.PkgutilTests.test_walk_packages_raises_on_string_or_bytes_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.PkgutilTests.test_walkpackages_filesys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pkgutil.PkgutilTests.test_walkpackages_zipfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_platform.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_platform.txt index 667497ef97..d3c8ea200f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_platform.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_platform.txt @@ -1,30 +1,28 @@ -*graalpython.lib-python.3.test.test_platform.PlatformTest.test__comparable_version -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_architecture -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_architecture_via_symlink -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_freedesktop_os_release -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_java_ver -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_libc_ver -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_mac_ver -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_mac_ver_with_fork -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_machine -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_macos -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_node -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_parse_os_release -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_platform -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_processor -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_release -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_sys_version -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_system -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_system_alias -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_uname -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_uname_asdict -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_uname_cast_to_tuple -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_uname_copy -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_uname_fields -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_uname_pickle -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_uname_processor -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_uname_replace -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_uname_slices -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_uname_win32_ARCHITEW6432 -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_version -*graalpython.lib-python.3.test.test_platform.PlatformTest.test_win32_ver +test.test_platform.PlatformTest.test_architecture @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_architecture_via_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_platform.PlatformTest.test_freedesktop_os_release @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_java_ver @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_libc_ver @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_mac_ver @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_machine @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_macos @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_node @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_parse_os_release @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_platform @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_processor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_release @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_sys_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_system @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_system_alias @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_uname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_uname_asdict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_uname_cast_to_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_uname_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_uname_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_uname_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_uname_processor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_platform.PlatformTest.test_uname_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_uname_slices @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_uname_win32_ARCHITEW6432 @ win32-AMD64 +test.test_platform.PlatformTest.test_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_platform.PlatformTest.test_win32_ver @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_plistlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_plistlib.txt index aae3fd003e..d27a0d345c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_plistlib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_plistlib.txt @@ -1,59 +1,58 @@ -*graalpython.lib-python.3.test.test_plistlib.MiscTestCase.test__all__ -*graalpython.lib-python.3.test.test_plistlib.TestBinaryPlistlib.test_cycles -*graalpython.lib-python.3.test.test_plistlib.TestBinaryPlistlib.test_dump_duplicates -*graalpython.lib-python.3.test.test_plistlib.TestBinaryPlistlib.test_identity -*graalpython.lib-python.3.test.test_plistlib.TestBinaryPlistlib.test_invalid_binary -*graalpython.lib-python.3.test.test_plistlib.TestBinaryPlistlib.test_large_timestamp -*graalpython.lib-python.3.test.test_plistlib.TestBinaryPlistlib.test_load_int -*graalpython.lib-python.3.test.test_plistlib.TestBinaryPlistlib.test_load_singletons -*graalpython.lib-python.3.test.test_plistlib.TestBinaryPlistlib.test_nonstandard_refs_size -*graalpython.lib-python.3.test.test_plistlib.TestBinaryPlistlib.test_unsupported -*graalpython.lib-python.3.test.test_plistlib.TestKeyedArchive.test_keyed_archive_data -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_appleformatting -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_appleformattingfromliteral -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_bytearray -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_bytes -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_bytesio -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_controlcharacters -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_create -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_dict_members -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_dump_invalid_format -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_indentation_array -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_indentation_dict -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_indentation_dict_mix -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_int -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_integer_notations -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_invalid_type -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_invalid_uid -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_invalidarray -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_invaliddict -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_invalidinteger -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_invalidreal -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_io -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_keys_no_string -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_keysort -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_keysort_bytesio -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_list_members -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_load_invalid_file -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_lone_surrogates -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_modified_uid_huge -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_modified_uid_negative -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_non_bmp_characters -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_nondictroot -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_skipkeys -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_tuple_members -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_uid -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_uid_copy -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_uid_data -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_uid_eq -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_uid_hash -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_uid_index -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_uid_pickle -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_uid_repr -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_xml_encodings -*graalpython.lib-python.3.test.test_plistlib.TestPlistlib.test_xml_plist_with_entity_decl -*graalpython.lib-python.3.test.test_plistlib.TestPlistlibDeprecated.test_bytes_deprecated -*graalpython.lib-python.3.test.test_plistlib.TestPlistlibDeprecated.test_dataobject_deprecated -*graalpython.lib-python.3.test.test_plistlib.TestPlistlibDeprecated.test_io_deprecated -*graalpython.lib-python.3.test.test_plistlib.TestPlutil.test_lint_status -*graalpython.lib-python.3.test.test_plistlib.TestPlutil.test_octal_and_hex +test.test_plistlib.MiscTestCase.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestBinaryPlistlib.test_cycles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Disabled due to transient stack overflow that fails to get caught and crashes the VM +!test.test_plistlib.TestBinaryPlistlib.test_deep_nesting @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_plistlib.TestBinaryPlistlib.test_dump_duplicates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestBinaryPlistlib.test_identity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestBinaryPlistlib.test_invalid_binary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestBinaryPlistlib.test_large_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestBinaryPlistlib.test_load_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestBinaryPlistlib.test_load_singletons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestBinaryPlistlib.test_nonstandard_refs_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestBinaryPlistlib.test_unsupported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestKeyedArchive.test_keyed_archive_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_appleformatting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_appleformattingfromliteral @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_bytesio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_controlcharacters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_create @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_dict_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_dump_invalid_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_indentation_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_indentation_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_indentation_dict_mix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_integer_notations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_invalid_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_invalid_uid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_invalidarray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_invaliddict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_invalidinteger @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_invalidreal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_keys_no_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_keysort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_keysort_bytesio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_list_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_load_invalid_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_lone_surrogates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_modified_uid_huge @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_modified_uid_negative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_non_bmp_characters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_nondictroot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_skipkeys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_tuple_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_uid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_uid_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_uid_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_uid_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_uid_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_uid_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_uid_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_uid_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_xml_encodings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlistlib.test_xml_plist_with_entity_decl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_plistlib.TestPlutil.test_lint_status @ darwin-arm64,darwin-x86_64 +test.test_plistlib.TestPlutil.test_octal_and_hex @ darwin-arm64,darwin-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_popen.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_popen.txt index 8b4520a629..a1a43d16fe 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_popen.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_popen.txt @@ -1,5 +1,5 @@ -*graalpython.lib-python.3.test.test_popen.PopenTest.test_contextmanager -*graalpython.lib-python.3.test.test_popen.PopenTest.test_iterating -*graalpython.lib-python.3.test.test_popen.PopenTest.test_keywords -*graalpython.lib-python.3.test.test_popen.PopenTest.test_popen -*graalpython.lib-python.3.test.test_popen.PopenTest.test_return_code +test.test_popen.PopenTest.test_contextmanager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_popen.PopenTest.test_iterating @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_popen.PopenTest.test_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_popen.PopenTest.test_popen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_popen.PopenTest.test_return_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_poplib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_poplib.txt index f9eb8c2a25..81e68bc9b4 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_poplib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_poplib.txt @@ -1,65 +1,70 @@ -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_apop_REDOS -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_apop_normal -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_capa -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_dele -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_exceptions -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_getwelcome -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_list -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_noop -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_pass_ -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_quit -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_retr -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_rpop -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_stat -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_stls -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_stls_capa -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_too_long_lines -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_top -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_uidl -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_user -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_utf8 -*graalpython.lib-python.3.test.test_poplib.TestPOP3Class.test_utf8_raises_if_unsupported -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test__all__ -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_apop_REDOS -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_apop_normal -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_capa -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_context -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_dele -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_exceptions -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_getwelcome -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_list -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_noop -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_pass_ -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_quit -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_retr -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_rpop -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_stat -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_stls -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_stls_capa -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_stls_context -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_too_long_lines -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_top -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_uidl -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_user -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_utf8 -*graalpython.lib-python.3.test.test_poplib.TestPOP3_SSLClass.test_utf8_raises_if_unsupported -*graalpython.lib-python.3.test.test_poplib.TestPOP3_TLSClass.test_apop_REDOS -*graalpython.lib-python.3.test.test_poplib.TestPOP3_TLSClass.test_exceptions -*graalpython.lib-python.3.test.test_poplib.TestPOP3_TLSClass.test_getwelcome -*graalpython.lib-python.3.test.test_poplib.TestPOP3_TLSClass.test_list -*graalpython.lib-python.3.test.test_poplib.TestPOP3_TLSClass.test_quit -*graalpython.lib-python.3.test.test_poplib.TestPOP3_TLSClass.test_retr -*graalpython.lib-python.3.test.test_poplib.TestPOP3_TLSClass.test_rpop -*graalpython.lib-python.3.test.test_poplib.TestPOP3_TLSClass.test_stat -*graalpython.lib-python.3.test.test_poplib.TestPOP3_TLSClass.test_stls -*graalpython.lib-python.3.test.test_poplib.TestPOP3_TLSClass.test_stls_capa -*graalpython.lib-python.3.test.test_poplib.TestPOP3_TLSClass.test_stls_context -*graalpython.lib-python.3.test.test_poplib.TestPOP3_TLSClass.test_too_long_lines -*graalpython.lib-python.3.test.test_poplib.TestPOP3_TLSClass.test_top -*graalpython.lib-python.3.test.test_poplib.TestPOP3_TLSClass.test_uidl -*graalpython.lib-python.3.test.test_poplib.TestPOP3_TLSClass.test_user -*graalpython.lib-python.3.test.test_poplib.TestPOP3_TLSClass.test_utf8 -*graalpython.lib-python.3.test.test_poplib.TestPOP3_TLSClass.test_utf8_raises_if_unsupported -*graalpython.lib-python.3.test.test_poplib.TestTimeouts.testTimeoutDefault -*graalpython.lib-python.3.test.test_poplib.TestTimeouts.testTimeoutNone -*graalpython.lib-python.3.test.test_poplib.TestTimeouts.testTimeoutValue +test.test_poplib.TestPOP3Class.test_apop_REDOS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_apop_normal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_capa @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_dele @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_getwelcome @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_noop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_pass_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_quit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_retr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_rpop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_stat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_stls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_stls_capa @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_too_long_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_top @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_uidl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_user @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_utf8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3Class.test_utf8_raises_if_unsupported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_apop_REDOS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_apop_normal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_capa @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_dele @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_getwelcome @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_noop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_pass_ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_quit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_retr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_rpop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_stat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_stls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_stls_capa @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_stls_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_too_long_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_top @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_uidl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_user @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_utf8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_SSLClass.test_utf8_raises_if_unsupported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_TLSClass.test_apop_REDOS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +!test.test_poplib.TestPOP3_TLSClass.test_apop_normal @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_poplib.TestPOP3_TLSClass.test_capa @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_poplib.TestPOP3_TLSClass.test_dele @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_TLSClass.test_getwelcome @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_TLSClass.test_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +!test.test_poplib.TestPOP3_TLSClass.test_noop @ darwin-arm64,linux-aarch64,linux-x86_64 +!test.test_poplib.TestPOP3_TLSClass.test_pass_ @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_quit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_TLSClass.test_retr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_TLSClass.test_rpop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_TLSClass.test_stat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_TLSClass.test_stls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_TLSClass.test_stls_capa @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_TLSClass.test_stls_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_TLSClass.test_too_long_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_TLSClass.test_top @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_TLSClass.test_uidl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_TLSClass.test_user @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_TLSClass.test_utf8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestPOP3_TLSClass.test_utf8_raises_if_unsupported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_poplib.TestTimeouts.testTimeoutDefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_poplib.TestTimeouts.testTimeoutNone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_poplib.TestTimeouts.testTimeoutValue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_positional_only_arg.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_positional_only_arg.txt index 7d5e3e964d..fd55e70142 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_positional_only_arg.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_positional_only_arg.txt @@ -1,29 +1,26 @@ -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_annotations -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_annotations_constant_fold -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_annotations_in_closures -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_async -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_change_default_pos_only -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_closures -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_generator -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_invalid_syntax_errors -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_invalid_syntax_errors_async -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_invalid_syntax_lambda -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_lambdas -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_mangling -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_module_function -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_no_standard_args_usage -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_optional_positional_only_args -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_pos_only_call_via_unpacking -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_pos_only_definition -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_positional_only_and_arg_invalid_calls -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_positional_only_and_kwonlyargs_invalid_calls -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_positional_only_and_optional_arg_invalid_calls -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_positional_only_invalid_calls -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_positional_only_with_optional_invalid_calls -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_posonly_methods -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_same_keyword_as_positional_with_kwargs -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_serialization -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_super -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_syntax_for_many_positional_only -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_too_many_arguments -*graalpython.lib-python.3.test.test_positional_only_arg.PositionalOnlyTestCase.test_use_positional_as_keyword +test.test_positional_only_arg.PositionalOnlyTestCase.test_annotations_in_closures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_change_default_pos_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_closures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_invalid_syntax_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_invalid_syntax_errors_async @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_invalid_syntax_lambda @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_lambdas @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_mangling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_module_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_no_standard_args_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_optional_positional_only_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_pos_only_call_via_unpacking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_pos_only_definition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_positional_only_and_arg_invalid_calls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_positional_only_and_kwonlyargs_invalid_calls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_positional_only_and_optional_arg_invalid_calls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_positional_only_invalid_calls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_positional_only_with_optional_invalid_calls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_posonly_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_same_keyword_as_positional_with_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_serialization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_syntax_for_many_positional_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_too_many_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_use_positional_as_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_posix.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_posix.txt index 0964a233e4..6d2dc8167c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_posix.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_posix.txt @@ -1,174 +1,47 @@ -*graalpython.lib-python.3.test.test_posix.PosixGroupsTester.test_initgroups -*graalpython.lib-python.3.test.test_posix.PosixGroupsTester.test_setgroups -*graalpython.lib-python.3.test.test_posix.PosixTester.testNoArgFunctions -*graalpython.lib-python.3.test.test_posix.PosixTester.test_access -*graalpython.lib-python.3.test.test_posix.PosixTester.test_access_dir_fd -*graalpython.lib-python.3.test.test_posix.PosixTester.test_chdir -*graalpython.lib-python.3.test.test_posix.PosixTester.test_chflags -*graalpython.lib-python.3.test.test_posix.PosixTester.test_chmod_dir_fd -*graalpython.lib-python.3.test.test_posix.PosixTester.test_chown -*graalpython.lib-python.3.test.test_posix.PosixTester.test_chown_dir_fd -*graalpython.lib-python.3.test.test_posix.PosixTester.test_cld_xxxx_constants -*graalpython.lib-python.3.test.test_posix.PosixTester.test_confstr -*graalpython.lib-python.3.test.test_posix.PosixTester.test_dup -*graalpython.lib-python.3.test.test_posix.PosixTester.test_dup2 -*graalpython.lib-python.3.test.test_posix.PosixTester.test_environ -*graalpython.lib-python.3.test.test_posix.PosixTester.test_fchown -*graalpython.lib-python.3.test.test_posix.PosixTester.test_fexecve -*graalpython.lib-python.3.test.test_posix.PosixTester.test_fs_holes -*graalpython.lib-python.3.test.test_posix.PosixTester.test_fstat -*graalpython.lib-python.3.test.test_posix.PosixTester.test_fstatvfs -*graalpython.lib-python.3.test.test_posix.PosixTester.test_ftruncate -*graalpython.lib-python.3.test.test_posix.PosixTester.test_get_and_set_scheduler_and_param -*graalpython.lib-python.3.test.test_posix.PosixTester.test_getcwd_long_pathnames -*graalpython.lib-python.3.test.test_posix.PosixTester.test_getgrouplist -*graalpython.lib-python.3.test.test_posix.PosixTester.test_getgroups -*graalpython.lib-python.3.test.test_posix.PosixTester.test_getresgid -*graalpython.lib-python.3.test.test_posix.PosixTester.test_getresuid -*graalpython.lib-python.3.test.test_posix.PosixTester.test_initgroups -*graalpython.lib-python.3.test.test_posix.PosixTester.test_lchflags_regular_file -*graalpython.lib-python.3.test.test_posix.PosixTester.test_lchflags_symlink -*graalpython.lib-python.3.test.test_posix.PosixTester.test_lchown -*graalpython.lib-python.3.test.test_posix.PosixTester.test_link_dir_fd -*graalpython.lib-python.3.test.test_posix.PosixTester.test_listdir -*graalpython.lib-python.3.test.test_posix.PosixTester.test_listdir_bytes -*graalpython.lib-python.3.test.test_posix.PosixTester.test_listdir_bytes_like -*graalpython.lib-python.3.test.test_posix.PosixTester.test_listdir_default -*graalpython.lib-python.3.test.test_posix.PosixTester.test_listdir_fd -*graalpython.lib-python.3.test.test_posix.PosixTester.test_lockf -*graalpython.lib-python.3.test.test_posix.PosixTester.test_makedev -*graalpython.lib-python.3.test.test_posix.PosixTester.test_mkdir_dir_fd -*graalpython.lib-python.3.test.test_posix.PosixTester.test_mkfifo -*graalpython.lib-python.3.test.test_posix.PosixTester.test_mkfifo_dir_fd -*graalpython.lib-python.3.test.test_posix.PosixTester.test_mknod -*graalpython.lib-python.3.test.test_posix.PosixTester.test_mknod_dir_fd -*graalpython.lib-python.3.test.test_posix.PosixTester.test_open_dir_fd -*graalpython.lib-python.3.test.test_posix.PosixTester.test_oscloexec -*graalpython.lib-python.3.test.test_posix.PosixTester.test_osexlock -*graalpython.lib-python.3.test.test_posix.PosixTester.test_osshlock -*graalpython.lib-python.3.test.test_posix.PosixTester.test_path_error2 -*graalpython.lib-python.3.test.test_posix.PosixTester.test_path_with_null_byte -*graalpython.lib-python.3.test.test_posix.PosixTester.test_path_with_null_character -*graalpython.lib-python.3.test.test_posix.PosixTester.test_pidfd_open -*graalpython.lib-python.3.test.test_posix.PosixTester.test_pipe -*graalpython.lib-python.3.test.test_posix.PosixTester.test_pipe2 -*graalpython.lib-python.3.test.test_posix.PosixTester.test_pipe2_c_limits -*graalpython.lib-python.3.test.test_posix.PosixTester.test_posix_fadvise -*graalpython.lib-python.3.test.test_posix.PosixTester.test_posix_fadvise_errno -*graalpython.lib-python.3.test.test_posix.PosixTester.test_posix_fallocate -*graalpython.lib-python.3.test.test_posix.PosixTester.test_posix_fallocate_errno -*graalpython.lib-python.3.test.test_posix.PosixTester.test_pread -*graalpython.lib-python.3.test.test_posix.PosixTester.test_preadv -*graalpython.lib-python.3.test.test_posix.PosixTester.test_preadv_flags -*graalpython.lib-python.3.test.test_posix.PosixTester.test_preadv_overflow_32bits -*graalpython.lib-python.3.test.test_posix.PosixTester.test_putenv -*graalpython.lib-python.3.test.test_posix.PosixTester.test_pwrite -*graalpython.lib-python.3.test.test_posix.PosixTester.test_pwritev -*graalpython.lib-python.3.test.test_posix.PosixTester.test_pwritev_flags -*graalpython.lib-python.3.test.test_posix.PosixTester.test_pwritev_overflow_32bits -*graalpython.lib-python.3.test.test_posix.PosixTester.test_readlink_dir_fd -*graalpython.lib-python.3.test.test_posix.PosixTester.test_readv -*graalpython.lib-python.3.test.test_posix.PosixTester.test_readv_overflow_32bits -*graalpython.lib-python.3.test.test_posix.PosixTester.test_register_at_fork -*graalpython.lib-python.3.test.test_posix.PosixTester.test_rename_dir_fd -*graalpython.lib-python.3.test.test_posix.PosixTester.test_rtld_constants -*graalpython.lib-python.3.test.test_posix.PosixTester.test_sched_getaffinity -*graalpython.lib-python.3.test.test_posix.PosixTester.test_sched_priority -*graalpython.lib-python.3.test.test_posix.PosixTester.test_sched_rr_get_interval -*graalpython.lib-python.3.test.test_posix.PosixTester.test_sched_setaffinity -*graalpython.lib-python.3.test.test_posix.PosixTester.test_sched_yield -*graalpython.lib-python.3.test.test_posix.PosixTester.test_setresgid -*graalpython.lib-python.3.test.test_posix.PosixTester.test_setresgid_exception -*graalpython.lib-python.3.test.test_posix.PosixTester.test_setresuid -*graalpython.lib-python.3.test.test_posix.PosixTester.test_setresuid_exception -*graalpython.lib-python.3.test.test_posix.PosixTester.test_stat -*graalpython.lib-python.3.test.test_posix.PosixTester.test_stat_dir_fd -*graalpython.lib-python.3.test.test_posix.PosixTester.test_statvfs -*graalpython.lib-python.3.test.test_posix.PosixTester.test_strerror -*graalpython.lib-python.3.test.test_posix.PosixTester.test_symlink_dir_fd -*graalpython.lib-python.3.test.test_posix.PosixTester.test_truncate -*graalpython.lib-python.3.test.test_posix.PosixTester.test_umask -*graalpython.lib-python.3.test.test_posix.PosixTester.test_unlink_dir_fd -*graalpython.lib-python.3.test.test_posix.PosixTester.test_utime -*graalpython.lib-python.3.test.test_posix.PosixTester.test_utime_dir_fd -*graalpython.lib-python.3.test.test_posix.PosixTester.test_utime_nofollow_symlinks -*graalpython.lib-python.3.test.test_posix.PosixTester.test_utime_with_fd -*graalpython.lib-python.3.test.test_posix.PosixTester.test_waitid -*graalpython.lib-python.3.test.test_posix.PosixTester.test_writev -*graalpython.lib-python.3.test.test_posix.PosixTester.test_writev_overflow_32bits -*graalpython.lib-python.3.test.test_posix.TestMain.test_main -*graalpython.lib-python.3.test.test_posix.TestPosixDirFd.test_access_dir_fd -*graalpython.lib-python.3.test.test_posix.TestPosixDirFd.test_chmod_dir_fd -*graalpython.lib-python.3.test.test_posix.TestPosixDirFd.test_chown_dir_fd -*graalpython.lib-python.3.test.test_posix.TestPosixDirFd.test_link_dir_fd -*graalpython.lib-python.3.test.test_posix.TestPosixDirFd.test_mkdir_dir_fd -*graalpython.lib-python.3.test.test_posix.TestPosixDirFd.test_mkfifo_dir_fd -*graalpython.lib-python.3.test.test_posix.TestPosixDirFd.test_mknod_dir_fd -*graalpython.lib-python.3.test.test_posix.TestPosixDirFd.test_open_dir_fd -*graalpython.lib-python.3.test.test_posix.TestPosixDirFd.test_readlink_dir_fd -*graalpython.lib-python.3.test.test_posix.TestPosixDirFd.test_rename_dir_fd -*graalpython.lib-python.3.test.test_posix.TestPosixDirFd.test_stat_dir_fd -*graalpython.lib-python.3.test.test_posix.TestPosixDirFd.test_symlink_dir_fd -*graalpython.lib-python.3.test.test_posix.TestPosixDirFd.test_unlink_dir_fd -*graalpython.lib-python.3.test.test_posix.TestPosixDirFd.test_utime_dir_fd -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_bad_file_actions -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_close_file -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_dup2 -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_empty_file_actions -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_multiple_file_actions -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_no_such_executable -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_none_file_actions -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_open_file -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_resetids -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_resetids_explicit_default -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_resetids_wrong_type -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_returns_pid -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_setpgroup -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_setpgroup_wrong_type -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_setscheduler_only_param -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_setscheduler_with_policy -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_setsid -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_setsigdef -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_setsigdef_wrong_type -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_setsigmask -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_setsigmask_wrong_type -*graalpython.lib-python.3.test.test_posix.TestPosixSpawn.test_specify_environment -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_bad_file_actions -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_close_file -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_dup2 -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_empty_file_actions -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_multiple_file_actions -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_no_such_executable -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_none_file_actions -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_open_file -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_posix_spawnp -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_resetids -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_resetids_explicit_default -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_resetids_wrong_type -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_returns_pid -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_setpgroup -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_setpgroup_wrong_type -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_setscheduler_only_param -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_setscheduler_with_policy -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_setsid -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_setsigdef -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_setsigdef_wrong_type -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_setsigmask -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_setsigmask_wrong_type -*graalpython.lib-python.3.test.test_posix.TestPosixSpawnP.test_specify_environment -*graalpython.lib-python.3.test.test_posix.TestPosixWeaklinking.test_access -*graalpython.lib-python.3.test.test_posix.TestPosixWeaklinking.test_chmod -*graalpython.lib-python.3.test.test_posix.TestPosixWeaklinking.test_chown -*graalpython.lib-python.3.test.test_posix.TestPosixWeaklinking.test_link -*graalpython.lib-python.3.test.test_posix.TestPosixWeaklinking.test_listdir_scandir -*graalpython.lib-python.3.test.test_posix.TestPosixWeaklinking.test_mkdir -*graalpython.lib-python.3.test.test_posix.TestPosixWeaklinking.test_mkfifo -*graalpython.lib-python.3.test.test_posix.TestPosixWeaklinking.test_mknod -*graalpython.lib-python.3.test.test_posix.TestPosixWeaklinking.test_open -*graalpython.lib-python.3.test.test_posix.TestPosixWeaklinking.test_pwritev -*graalpython.lib-python.3.test.test_posix.TestPosixWeaklinking.test_readlink -*graalpython.lib-python.3.test.test_posix.TestPosixWeaklinking.test_rename_replace -*graalpython.lib-python.3.test.test_posix.TestPosixWeaklinking.test_stat -*graalpython.lib-python.3.test.test_posix.TestPosixWeaklinking.test_symlink -*graalpython.lib-python.3.test.test_posix.TestPosixWeaklinking.test_unlink_rmdir -*graalpython.lib-python.3.test.test_posix.TestPosixWeaklinking.test_utime +test.test_posix.PosixTester.testNoArgFunctions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.PosixTester.test_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_chdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_chown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.PosixTester.test_dup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_dup2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_environ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_fchown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.PosixTester.test_fs_holes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.PosixTester.test_fstat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_fstatvfs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.PosixTester.test_ftruncate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_getcwd_long_pathnames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_getgroups @ linux-aarch64,linux-x86_64 +test.test_posix.PosixTester.test_lchown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.PosixTester.test_listdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_listdir_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_listdir_bytes_like @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_listdir_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_listdir_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.PosixTester.test_oscloexec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.PosixTester.test_osexlock @ darwin-arm64,darwin-x86_64 +test.test_posix.PosixTester.test_osshlock @ darwin-arm64,darwin-x86_64 +test.test_posix.PosixTester.test_path_error2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_path_with_null_byte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_path_with_null_character @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_putenv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_rtld_constants @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.PosixTester.test_stat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_statvfs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.PosixTester.test_strerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_truncate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_umask @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_utime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posix.PosixTester.test_utime_nofollow_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.PosixTester.test_utime_with_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.TestPosixDirFd.test_access_dir_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.TestPosixDirFd.test_chmod_dir_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.TestPosixDirFd.test_mkdir_dir_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.TestPosixDirFd.test_open_dir_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.TestPosixDirFd.test_readlink_dir_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.TestPosixDirFd.test_rename_dir_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.TestPosixDirFd.test_stat_dir_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.TestPosixDirFd.test_symlink_dir_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.TestPosixDirFd.test_unlink_dir_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posix.TestPosixDirFd.test_utime_dir_fd @ linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_posixpath.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_posixpath.txt index 5c62d723d0..2d124df9c6 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_posixpath.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_posixpath.txt @@ -1,77 +1,77 @@ -*graalpython.lib-python.3.test.test_posixpath.PathLikeTests.test_path_abspath -*graalpython.lib-python.3.test.test_posixpath.PathLikeTests.test_path_basename -*graalpython.lib-python.3.test.test_posixpath.PathLikeTests.test_path_commonpath -*graalpython.lib-python.3.test.test_posixpath.PathLikeTests.test_path_dirname -*graalpython.lib-python.3.test.test_posixpath.PathLikeTests.test_path_expanduser -*graalpython.lib-python.3.test.test_posixpath.PathLikeTests.test_path_expandvars -*graalpython.lib-python.3.test.test_posixpath.PathLikeTests.test_path_isabs -*graalpython.lib-python.3.test.test_posixpath.PathLikeTests.test_path_islink -*graalpython.lib-python.3.test.test_posixpath.PathLikeTests.test_path_ismount -*graalpython.lib-python.3.test.test_posixpath.PathLikeTests.test_path_join -*graalpython.lib-python.3.test.test_posixpath.PathLikeTests.test_path_lexists -*graalpython.lib-python.3.test.test_posixpath.PathLikeTests.test_path_normcase -*graalpython.lib-python.3.test.test_posixpath.PathLikeTests.test_path_normpath -*graalpython.lib-python.3.test.test_posixpath.PathLikeTests.test_path_realpath -*graalpython.lib-python.3.test.test_posixpath.PathLikeTests.test_path_relpath -*graalpython.lib-python.3.test.test_posixpath.PathLikeTests.test_path_split -*graalpython.lib-python.3.test.test_posixpath.PathLikeTests.test_path_splitdrive -*graalpython.lib-python.3.test.test_posixpath.PathLikeTests.test_path_splitext -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_abspath -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_abspath_issue3426 -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_commonprefix -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_exists -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_exists_fd -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_expandvars -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_expandvars_nonascii -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_filetime -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_getsize -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_import -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_isdir -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_isfile -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_join_errors -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_no_argument -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_nonascii_abspath -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_normcase -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_normpath_issue106242 -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_normpath_issue5827 -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_realpath -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_relpath_errors -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_samefile -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_samefile_on_link -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_samefile_on_symlink -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_sameopenfile -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_samestat -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_samestat_on_link -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_samestat_on_symlink -*graalpython.lib-python.3.test.test_posixpath.PosixCommonTest.test_splitdrive -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_basename -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_commonpath -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_dirname -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_expanduser -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_expanduser_home_envvar -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_expanduser_pwd -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_isabs -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_islink -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_ismount -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_ismount_different_device -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_ismount_directory_not_readable -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_ismount_non_existent -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_ismount_symlinks -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_join -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_normpath -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_realpath_basic -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_realpath_curdir -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_realpath_deep_recursion -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_realpath_pardir -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_realpath_relative -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_realpath_repeated_indirect_symlinks -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_realpath_resolve_before_normalizing -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_realpath_resolve_first -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_realpath_resolve_parents -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_realpath_strict -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_realpath_symlink_loops -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_realpath_symlink_loops_strict -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_relpath -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_relpath_bytes -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_split -*graalpython.lib-python.3.test.test_posixpath.PosixPathTest.test_splitext +test.test_posixpath.PathLikeTests.test_path_abspath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PathLikeTests.test_path_basename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PathLikeTests.test_path_commonpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PathLikeTests.test_path_dirname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PathLikeTests.test_path_expanduser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PathLikeTests.test_path_expandvars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PathLikeTests.test_path_isabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PathLikeTests.test_path_islink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PathLikeTests.test_path_ismount @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PathLikeTests.test_path_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PathLikeTests.test_path_lexists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PathLikeTests.test_path_normcase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PathLikeTests.test_path_normpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PathLikeTests.test_path_realpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PathLikeTests.test_path_relpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PathLikeTests.test_path_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PathLikeTests.test_path_splitdrive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PathLikeTests.test_path_splitext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_abspath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_abspath_issue3426 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_commonprefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_exists_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_expandvars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_expandvars_nonascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_filetime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_getsize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_isdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_isfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_join_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_no_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_nonascii_abspath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_normcase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_normpath_issue106242 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_normpath_issue5827 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_realpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_relpath_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_samefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_samefile_on_link @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixCommonTest.test_samefile_on_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_sameopenfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_samestat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_samestat_on_link @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixCommonTest.test_samestat_on_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixCommonTest.test_splitdrive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixPathTest.test_basename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixPathTest.test_commonpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixPathTest.test_dirname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixPathTest.test_expanduser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixPathTest.test_expanduser_home_envvar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixPathTest.test_expanduser_pwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixPathTest.test_isabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixPathTest.test_islink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixPathTest.test_ismount @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixPathTest.test_ismount_different_device @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixPathTest.test_ismount_directory_not_readable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixPathTest.test_ismount_non_existent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixPathTest.test_ismount_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixPathTest.test_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixPathTest.test_normpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixPathTest.test_realpath_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_curdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_deep_recursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_pardir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_relative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_repeated_indirect_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_resolve_before_normalizing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_resolve_first @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_resolve_parents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_strict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_symlink_loops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_symlink_loops_strict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_posixpath.PosixPathTest.test_relpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixPathTest.test_relpath_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixPathTest.test_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_posixpath.PosixPathTest.test_splitext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pow.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pow.txt index 2335cf8f2c..659afc7b57 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pow.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pow.txt @@ -1,7 +1,7 @@ -*graalpython.lib-python.3.test.test_pow.PowTest.test_big_exp -*graalpython.lib-python.3.test.test_pow.PowTest.test_bug643260 -*graalpython.lib-python.3.test.test_pow.PowTest.test_bug705231 -*graalpython.lib-python.3.test.test_pow.PowTest.test_negative_exponent -*graalpython.lib-python.3.test.test_pow.PowTest.test_other -*graalpython.lib-python.3.test.test_pow.PowTest.test_powfloat -*graalpython.lib-python.3.test.test_pow.PowTest.test_powint +test.test_pow.PowTest.test_big_exp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pow.PowTest.test_bug643260 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pow.PowTest.test_bug705231 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pow.PowTest.test_negative_exponent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pow.PowTest.test_other @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pow.PowTest.test_powfloat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pow.PowTest.test_powint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pprint.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pprint.txt index 12bf95e46e..1f98dad27b 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pprint.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pprint.txt @@ -1,43 +1,43 @@ -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_basic -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_basic_line_wrap -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_bytearray_wrap -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_bytes_wrap -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_chainmap -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_compact -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_compact_width -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_container_repr_override_called -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_counter -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_cyclic_dataclass -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_dataclass_with_repr -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_default_dict -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_depth -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_deque -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_empty_dataclass -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_empty_simple_namespace -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_init -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_integer -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_knotted -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_larger_dataclass -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_mapping_proxy -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_nested_indentations -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_ordered_dict -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_recursive_dataclass -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_same_as_repr -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_set_of_sets_reprs -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_set_reprs -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_simple_namespace -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_simple_namespace_subclass -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_small_dataclass -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_small_simple_namespace -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_sort_dict -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_sort_orderable_and_unorderable_values -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_sort_unorderable_values -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_sorted_dict -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_stdout_is_None -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_str_wrap -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_subclassing -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_unreadable -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_user_dict -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_user_list -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_user_string -*graalpython.lib-python.3.test.test_pprint.QueryTestCase.test_width +test.test_pprint.QueryTestCase.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_basic_line_wrap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_bytearray_wrap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_bytes_wrap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_chainmap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_compact @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_compact_width @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_container_repr_override_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_counter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_cyclic_dataclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_dataclass_no_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_dataclass_with_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_default_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_depth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_deque @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_empty_dataclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_empty_simple_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_integer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_knotted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_larger_dataclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_mapping_proxy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_nested_indentations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_ordered_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_recursive_dataclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_same_as_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_set_reprs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_simple_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_simple_namespace_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_small_dataclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_small_simple_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_sort_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_sort_orderable_and_unorderable_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_sort_unorderable_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_sorted_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_stdout_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_str_wrap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_unreadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_user_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_user_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_user_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pprint.QueryTestCase.test_width @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_print.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_print.txt index 6fdccefe67..bccf20641f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_print.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_print.txt @@ -1,9 +1,9 @@ -*graalpython.lib-python.3.test.test_print.TestPrint.test_print -*graalpython.lib-python.3.test.test_print.TestPrint.test_print_flush -*graalpython.lib-python.3.test.test_print.TestPy2MigrationHint.test_normal_string -*graalpython.lib-python.3.test.test_print.TestPy2MigrationHint.test_stream_redirection_hint_for_py2_migration -*graalpython.lib-python.3.test.test_print.TestPy2MigrationHint.test_string_in_loop_on_same_line -*graalpython.lib-python.3.test.test_print.TestPy2MigrationHint.test_string_with_excessive_whitespace -*graalpython.lib-python.3.test.test_print.TestPy2MigrationHint.test_string_with_leading_whitespace -*graalpython.lib-python.3.test.test_print.TestPy2MigrationHint.test_string_with_semicolon -*graalpython.lib-python.3.test.test_print.TestPy2MigrationHint.test_string_with_soft_space +test.test_print.TestPrint.test_print @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_print.TestPrint.test_print_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_print.TestPy2MigrationHint.test_normal_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_print.TestPy2MigrationHint.test_stream_redirection_hint_for_py2_migration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_print.TestPy2MigrationHint.test_string_in_loop_on_same_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_print.TestPy2MigrationHint.test_string_with_excessive_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_print.TestPy2MigrationHint.test_string_with_leading_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_print.TestPy2MigrationHint.test_string_with_semicolon @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_print.TestPy2MigrationHint.test_string_with_soft_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_profile.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_profile.txt index 9cd0f47ca7..3512595460 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_profile.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_profile.txt @@ -1,7 +1,6 @@ -*graalpython.lib-python.3.test.test_profile.ProfileTest.test_calling_conventions -*graalpython.lib-python.3.test.test_profile.ProfileTest.test_cprofile -*graalpython.lib-python.3.test.test_profile.ProfileTest.test_output_file_when_changing_directory -*graalpython.lib-python.3.test.test_profile.ProfileTest.test_run -*graalpython.lib-python.3.test.test_profile.ProfileTest.test_run_profile_as_module -*graalpython.lib-python.3.test.test_profile.ProfileTest.test_runctx -*graalpython.lib-python.3.test.test_profile.TestMain.test_main +test.test_profile.ProfileTest.test_calling_conventions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_profile.ProfileTest.test_cprofile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_profile.ProfileTest.test_output_file_when_changing_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_profile.ProfileTest.test_run @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_profile.ProfileTest.test_run_profile_as_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_profile.ProfileTest.test_runctx @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_property.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_property.txt index 45ae1c9083..da4ba9f3aa 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_property.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_property.txt @@ -1,22 +1,21 @@ -*graalpython.lib-python.3.test.test_property.PropertySubclassTests.test_docstring_copy -*graalpython.lib-python.3.test.test_property.PropertySubclassTests.test_property_new_getter_new_docstring -*graalpython.lib-python.3.test.test_property.PropertySubclassTests.test_property_setter_copies_getter_docstring -*graalpython.lib-python.3.test.test_property.PropertySubclassTests.test_slots_docstring_copy_exception -*graalpython.lib-python.3.test.test_property.PropertyTests.test_property___isabstractmethod__descriptor -*graalpython.lib-python.3.test.test_property.PropertyTests.test_property_builtin_doc_writable -*graalpython.lib-python.3.test.test_property.PropertyTests.test_property_decorator_baseclass -*graalpython.lib-python.3.test.test_property.PropertyTests.test_property_decorator_baseclass_doc -*graalpython.lib-python.3.test.test_property.PropertyTests.test_property_decorator_doc -*graalpython.lib-python.3.test.test_property.PropertyTests.test_property_decorator_doc_writable -*graalpython.lib-python.3.test.test_property.PropertyTests.test_property_decorator_subclass -*graalpython.lib-python.3.test.test_property.PropertyTests.test_property_decorator_subclass_doc -*graalpython.lib-python.3.test.test_property.PropertyTests.test_property_getter_doc_override -*graalpython.lib-python.3.test.test_property.PropertyTests.test_property_set_name_incorrect_args -*graalpython.lib-python.3.test.test_property.PropertyTests.test_property_setname_on_property_subclass -*graalpython.lib-python.3.test.test_property.PropertyTests.test_refleaks_in___init__ -*graalpython.lib-python.3.test.test_property.PropertyUnreachableAttributeNoName.test_del_property -*graalpython.lib-python.3.test.test_property.PropertyUnreachableAttributeNoName.test_get_property -*graalpython.lib-python.3.test.test_property.PropertyUnreachableAttributeNoName.test_set_property -*graalpython.lib-python.3.test.test_property.PropertyUnreachableAttributeWithName.test_del_property -*graalpython.lib-python.3.test.test_property.PropertyUnreachableAttributeWithName.test_get_property -*graalpython.lib-python.3.test.test_property.PropertyUnreachableAttributeWithName.test_set_property +test.test_property.PropertySubclassTests.test_docstring_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertySubclassTests.test_property_new_getter_new_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertySubclassTests.test_property_setter_copies_getter_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertySubclassTests.test_slots_docstring_copy_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertyTests.test_property___isabstractmethod__descriptor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertyTests.test_property_builtin_doc_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertyTests.test_property_decorator_baseclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertyTests.test_property_decorator_baseclass_doc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertyTests.test_property_decorator_doc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertyTests.test_property_decorator_doc_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertyTests.test_property_decorator_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertyTests.test_property_decorator_subclass_doc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertyTests.test_property_getter_doc_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertyTests.test_property_set_name_incorrect_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertyTests.test_property_setname_on_property_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertyUnreachableAttributeNoName.test_del_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertyUnreachableAttributeNoName.test_get_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertyUnreachableAttributeNoName.test_set_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertyUnreachableAttributeWithName.test_del_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertyUnreachableAttributeWithName.test_get_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_property.PropertyUnreachableAttributeWithName.test_set_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pstats.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pstats.txt index 35282bf91f..bc7367ed25 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pstats.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pstats.txt @@ -1,8 +1,8 @@ -*graalpython.lib-python.3.test.test_pstats.AddCallersTestCase.test_combine_results -*graalpython.lib-python.3.test.test_pstats.StatsTestCase.test_SortKey_enum -*graalpython.lib-python.3.test.test_pstats.StatsTestCase.test_add -*graalpython.lib-python.3.test.test_pstats.StatsTestCase.test_sort_starts_mix -*graalpython.lib-python.3.test.test_pstats.StatsTestCase.test_sort_stats_enum -*graalpython.lib-python.3.test.test_pstats.StatsTestCase.test_sort_stats_int -*graalpython.lib-python.3.test.test_pstats.StatsTestCase.test_sort_stats_partial -*graalpython.lib-python.3.test.test_pstats.StatsTestCase.test_sort_stats_string +test.test_pstats.AddCallersTestCase.test_combine_results @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pstats.StatsTestCase.test_SortKey_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pstats.StatsTestCase.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pstats.StatsTestCase.test_sort_starts_mix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pstats.StatsTestCase.test_sort_stats_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pstats.StatsTestCase.test_sort_stats_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pstats.StatsTestCase.test_sort_stats_partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pstats.StatsTestCase.test_sort_stats_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pty.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pty.txt index 36a585441b..7b070cc015 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pty.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pty.txt @@ -1,3 +1,4 @@ -*graalpython.lib-python.3.test.test_pty.PtyTest.test_master_read -*graalpython.lib-python.3.test.test_pty.SmallPtyTests.test__copy_to_each -*graalpython.lib-python.3.test.test_pty.SmallPtyTests.test__restore_tty_mode_normal_return +test.test_pty.PtyTest.test_master_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pty.PtyTest.test_openpty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pty.SmallPtyTests.test__copy_to_each @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pty.SmallPtyTests.test__restore_tty_mode_normal_return @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pulldom.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pulldom.txt index b4d5267717..17ba1519f5 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pulldom.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pulldom.txt @@ -1,9 +1,11 @@ -*graalpython.lib-python.3.test.test_pulldom.PullDOMTestCase.test_expandItem -*graalpython.lib-python.3.test.test_pulldom.PullDOMTestCase.test_external_ges_default -*graalpython.lib-python.3.test.test_pulldom.PullDOMTestCase.test_getitem_deprecation -*graalpython.lib-python.3.test.test_pulldom.PullDOMTestCase.test_parse -*graalpython.lib-python.3.test.test_pulldom.PullDOMTestCase.test_parse_semantics -*graalpython.lib-python.3.test.test_pulldom.SAX2DOMTestCase.testSAX2DOM -*graalpython.lib-python.3.test.test_pulldom.SAX2DOMTestCase.test_basic -*graalpython.lib-python.3.test.test_pulldom.ThoroughTestCase.test_thorough_parse -*graalpython.lib-python.3.test.test_pulldom.ThoroughTestCase.test_thorough_sax2dom +test.test_pulldom.PullDOMTestCase.test_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pulldom.PullDOMTestCase.test_end_document @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pulldom.PullDOMTestCase.test_expandItem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pulldom.PullDOMTestCase.test_external_ges_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pulldom.PullDOMTestCase.test_parse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pulldom.PullDOMTestCase.test_parse_semantics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pulldom.SAX2DOMTestCase.testSAX2DOM @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pulldom.SAX2DOMTestCase.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pulldom.ThoroughTestCase.test_sax2dom_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pulldom.ThoroughTestCase.test_thorough_parse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pulldom.ThoroughTestCase.test_thorough_sax2dom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pwd.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pwd.txt index 7b88e05c59..cbbb450695 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pwd.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pwd.txt @@ -1,3 +1,3 @@ -*graalpython.lib-python.3.test.test_pwd.PwdTest.test_errors -*graalpython.lib-python.3.test.test_pwd.PwdTest.test_values -*graalpython.lib-python.3.test.test_pwd.PwdTest.test_values_extended +test.test_pwd.PwdTest.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pwd.PwdTest.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pwd.PwdTest.test_values_extended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_py_compile.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_py_compile.txt index 8d530d304a..29aacf1f59 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_py_compile.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_py_compile.txt @@ -1,32 +1,32 @@ -*graalpython.lib-python.3.test.test_py_compile.PyCompileCLITestCase.test_bad_syntax -*graalpython.lib-python.3.test.test_py_compile.PyCompileCLITestCase.test_bad_syntax_with_quiet -*graalpython.lib-python.3.test.test_py_compile.PyCompileCLITestCase.test_file_not_exists -*graalpython.lib-python.3.test.test_py_compile.PyCompileCLITestCase.test_file_not_exists_with_quiet -*graalpython.lib-python.3.test.test_py_compile.PyCompileCLITestCase.test_stdin -*graalpython.lib-python.3.test.test_py_compile.PyCompileCLITestCase.test_with_files -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithSourceEpoch.test_absolute_path -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithSourceEpoch.test_bad_coding -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithSourceEpoch.test_cache_path -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithSourceEpoch.test_cwd -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithSourceEpoch.test_do_not_overwrite_nonregular_files -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithSourceEpoch.test_do_not_overwrite_symlinks -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithSourceEpoch.test_double_dot_no_clobber -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithSourceEpoch.test_exceptions_propagate -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithSourceEpoch.test_invalidation_mode -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithSourceEpoch.test_optimization_path -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithSourceEpoch.test_quiet -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithSourceEpoch.test_relative_path -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithSourceEpoch.test_source_date_epoch -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_absolute_path -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_bad_coding -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_cache_path -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_cwd -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_do_not_overwrite_nonregular_files -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_do_not_overwrite_symlinks -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_double_dot_no_clobber -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_exceptions_propagate -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_invalidation_mode -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_optimization_path -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_quiet -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_relative_path -*graalpython.lib-python.3.test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_source_date_epoch +test.test_py_compile.PyCompileCLITestCase.test_bad_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileCLITestCase.test_bad_syntax_with_quiet @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileCLITestCase.test_file_not_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileCLITestCase.test_file_not_exists_with_quiet @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileCLITestCase.test_stdin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileCLITestCase.test_with_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_absolute_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_bad_coding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_cache_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_do_not_overwrite_nonregular_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_do_not_overwrite_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_double_dot_no_clobber @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_exceptions_propagate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_invalidation_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_optimization_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_quiet @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_relative_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_source_date_epoch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_absolute_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_bad_coding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_cache_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_do_not_overwrite_nonregular_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_do_not_overwrite_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_double_dot_no_clobber @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_exceptions_propagate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_invalidation_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_optimization_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_quiet @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_relative_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_source_date_epoch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pyclbr.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pyclbr.txt index 6985f3114a..f478e4d6f5 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pyclbr.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pyclbr.txt @@ -1,5 +1,6 @@ -*graalpython.lib-python.3.test.test_pyclbr.PyclbrTest.test_decorators -*graalpython.lib-python.3.test.test_pyclbr.PyclbrTest.test_easy -*graalpython.lib-python.3.test.test_pyclbr.PyclbrTest.test_nested -*graalpython.lib-python.3.test.test_pyclbr.ReadmoduleTests.test_dotted_name_not_a_package -*graalpython.lib-python.3.test.test_pyclbr.ReadmoduleTests.test_module_has_no_spec +test.test_pyclbr.PyclbrTest.test_decorators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyclbr.PyclbrTest.test_easy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyclbr.PyclbrTest.test_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyclbr.PyclbrTest.test_others @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyclbr.ReadmoduleTests.test_dotted_name_not_a_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyclbr.ReadmoduleTests.test_module_has_no_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pydoc.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pydoc.txt index c7ee69b5a1..1535c26d51 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pydoc.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pydoc.txt @@ -1,69 +1,68 @@ -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test__future__imports -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_allmethods -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_builtin_no_child -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_builtin_on_metaclasses -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_builtin_with_child -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_builtin_with_grandchild -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_builtin_with_more_than_four_children -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_fail_help_cli -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_fail_help_output_redirect -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_getpager_with_stdin_none -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_input_strip -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_is_package_when_is_package -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_is_package_when_not_package -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_issue8225 -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_mixed_case_module_names_are_lower_cased -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_namedtuple_fields -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_namedtuple_public_underscore -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_non_str_name -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_not_ascii -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_not_here -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_splitdoc_with_description -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_stripid -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_synopsis -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_synopsis_sourceless -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_synopsis_sourceless_empty_doc -*graalpython.lib-python.3.test.test_pydoc.PydocDocTest.test_text_enum_member_with_value_zero -*graalpython.lib-python.3.test.test_pydoc.PydocImportTest.test_apropos_empty_doc -*graalpython.lib-python.3.test.test_pydoc.PydocImportTest.test_apropos_with_bad_package -*graalpython.lib-python.3.test.test_pydoc.PydocImportTest.test_apropos_with_unreadable_dir -*graalpython.lib-python.3.test.test_pydoc.PydocImportTest.test_badimport -*graalpython.lib-python.3.test.test_pydoc.PydocImportTest.test_importfile -*graalpython.lib-python.3.test.test_pydoc.PydocImportTest.test_modules -*graalpython.lib-python.3.test.test_pydoc.PydocImportTest.test_modules_search -*graalpython.lib-python.3.test.test_pydoc.PydocImportTest.test_modules_search_builtin -*graalpython.lib-python.3.test.test_pydoc.PydocImportTest.test_url_search_package_error -*graalpython.lib-python.3.test.test_pydoc.PydocServerTest.test_server -*graalpython.lib-python.3.test.test_pydoc.PydocUrlHandlerTest.test_content_type_err -*graalpython.lib-python.3.test.test_pydoc.PydocUrlHandlerTest.test_url_requests -*graalpython.lib-python.3.test.test_pydoc.PydocWithMetaClasses.test_buggy_dir -*graalpython.lib-python.3.test.test_pydoc.PydocWithMetaClasses.test_resolve_false -*graalpython.lib-python.3.test.test_pydoc.PydocWithMetaClasses.test_virtualClassAttributeWithOneMeta -*graalpython.lib-python.3.test.test_pydoc.PydocWithMetaClasses.test_virtualClassAttributeWithTwoMeta -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_async_annotation -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_async_generator_annotation -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_bound_builtin_method -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_bound_python_method -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_builtin -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_class -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_custom_data_descriptor -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_dict_attr_descriptor -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_field_order_for_named_tuples -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_generic_alias -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_getset_descriptor -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_html_for_https_links -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_member_descriptor -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_module -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_namedtuple_field_descriptor -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_property -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_slot_descriptor -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_special_form -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_staticmethod -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_structseq_member_descriptor -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_typing_pydoc -*graalpython.lib-python.3.test.test_pydoc.TestDescriptions.test_unbound_python_method -*graalpython.lib-python.3.test.test_pydoc.TestHelper.test_keywords -*graalpython.lib-python.3.test.test_pydoc.TestInternalUtilities.test_sys_path_adjustment_adds_missing_curdir -*graalpython.lib-python.3.test.test_pydoc.TestInternalUtilities.test_sys_path_adjustment_protects_pydoc_dir -*graalpython.lib-python.3.test.test_pydoc.TestInternalUtilities.test_sys_path_adjustment_removes_argv0_dir -*graalpython.lib-python.3.test.test_pydoc.TestInternalUtilities.test_sys_path_adjustment_when_curdir_already_included +test.test_pydoc.PydocDocTest.test__future__imports @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_allmethods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_builtin_no_child @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_builtin_on_metaclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_builtin_with_child @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_builtin_with_grandchild @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_builtin_with_more_than_four_children @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_fail_help_cli @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_fail_help_output_redirect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_getpager_with_stdin_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_input_strip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pydoc.PydocDocTest.test_is_package_when_is_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_is_package_when_not_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_issue8225 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_mixed_case_module_names_are_lower_cased @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_namedtuple_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_namedtuple_public_underscore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_non_str_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_not_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_not_here @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pydoc.PydocDocTest.test_splitdoc_with_description @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_stripid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_synopsis @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_synopsis_sourceless @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_synopsis_sourceless_empty_doc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocDocTest.test_text_enum_member_with_value_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocImportTest.test_apropos_empty_doc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pydoc.PydocImportTest.test_apropos_with_bad_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocImportTest.test_apropos_with_unreadable_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocImportTest.test_badimport @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocImportTest.test_importfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocImportTest.test_url_search_package_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocServerTest.test_server @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_pydoc.PydocUrlHandlerTest.test_content_type_err @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocUrlHandlerTest.test_url_requests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocWithMetaClasses.test_buggy_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocWithMetaClasses.test_resolve_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocWithMetaClasses.test_virtualClassAttributeWithOneMeta @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.PydocWithMetaClasses.test_virtualClassAttributeWithTwoMeta @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_async_annotation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_async_generator_annotation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_bound_builtin_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_bound_python_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_builtin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_custom_data_descriptor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_custom_non_data_descriptor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_dict_attr_descriptor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_field_order_for_named_tuples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_generic_alias @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_getset_descriptor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_html_for_https_links @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_member_descriptor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_namedtuple_field_descriptor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_property @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_slot_descriptor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_special_form @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_staticmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_structseq_member_descriptor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_typing_pydoc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_unbound_builtin_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestDescriptions.test_unbound_python_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestHelper.test_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestInternalUtilities.test_sys_path_adjustment_adds_missing_curdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestInternalUtilities.test_sys_path_adjustment_protects_pydoc_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestInternalUtilities.test_sys_path_adjustment_removes_argv0_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pydoc.TestInternalUtilities.test_sys_path_adjustment_when_curdir_already_included @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pyexpat.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pyexpat.txt index 3ff1defa43..08280d4170 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pyexpat.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_pyexpat.txt @@ -1,39 +1,38 @@ -*graalpython.lib-python.3.test.test_pyexpat.BufferTextTest.test1 -*graalpython.lib-python.3.test.test_pyexpat.BufferTextTest.test2 -*graalpython.lib-python.3.test.test_pyexpat.BufferTextTest.test3 -*graalpython.lib-python.3.test.test_pyexpat.BufferTextTest.test4 -*graalpython.lib-python.3.test.test_pyexpat.BufferTextTest.test5 -*graalpython.lib-python.3.test.test_pyexpat.BufferTextTest.test6 -*graalpython.lib-python.3.test.test_pyexpat.BufferTextTest.test7 -*graalpython.lib-python.3.test.test_pyexpat.BufferTextTest.test_buffering_enabled -*graalpython.lib-python.3.test.test_pyexpat.BufferTextTest.test_default_to_disabled -*graalpython.lib-python.3.test.test_pyexpat.ChardataBufferTest.test_1000_bytes -*graalpython.lib-python.3.test.test_pyexpat.ChardataBufferTest.test_1025_bytes -*graalpython.lib-python.3.test.test_pyexpat.ChardataBufferTest.test_change_size_1 -*graalpython.lib-python.3.test.test_pyexpat.ChardataBufferTest.test_change_size_2 -*graalpython.lib-python.3.test.test_pyexpat.ChardataBufferTest.test_disabling_buffer -*graalpython.lib-python.3.test.test_pyexpat.ChardataBufferTest.test_unchanged_size -*graalpython.lib-python.3.test.test_pyexpat.ChardataBufferTest.test_wrong_size -*graalpython.lib-python.3.test.test_pyexpat.ErrorMessageTest.test_codes -*graalpython.lib-python.3.test.test_pyexpat.ErrorMessageTest.test_expaterror -*graalpython.lib-python.3.test.test_pyexpat.ForeignDTDTests.test_ignore_use_foreign_dtd -*graalpython.lib-python.3.test.test_pyexpat.ForeignDTDTests.test_use_foreign_dtd -*graalpython.lib-python.3.test.test_pyexpat.HandlerExceptionTest.test_exception -*graalpython.lib-python.3.test.test_pyexpat.InterningTest.test -*graalpython.lib-python.3.test.test_pyexpat.InterningTest.test_issue9402 -*graalpython.lib-python.3.test.test_pyexpat.MalformedInputTest.test1 -*graalpython.lib-python.3.test.test_pyexpat.MalformedInputTest.test2 -*graalpython.lib-python.3.test.test_pyexpat.NamespaceSeparatorTest.test_illegal -*graalpython.lib-python.3.test.test_pyexpat.NamespaceSeparatorTest.test_legal -*graalpython.lib-python.3.test.test_pyexpat.NamespaceSeparatorTest.test_zero_length -*graalpython.lib-python.3.test.test_pyexpat.ParseTest.test_parse_again -*graalpython.lib-python.3.test.test_pyexpat.ParseTest.test_parse_bytes -*graalpython.lib-python.3.test.test_pyexpat.ParseTest.test_parse_file -*graalpython.lib-python.3.test.test_pyexpat.ParseTest.test_parse_str -*graalpython.lib-python.3.test.test_pyexpat.PositionTest.test -*graalpython.lib-python.3.test.test_pyexpat.SetAttributeTest.test_buffer_text -*graalpython.lib-python.3.test.test_pyexpat.SetAttributeTest.test_invalid_attributes -*graalpython.lib-python.3.test.test_pyexpat.SetAttributeTest.test_namespace_prefixes -*graalpython.lib-python.3.test.test_pyexpat.SetAttributeTest.test_ordered_attributes -*graalpython.lib-python.3.test.test_pyexpat.SetAttributeTest.test_specified_attributes -*graalpython.lib-python.3.test.test_pyexpat.sf1296433Test.test_parse_only_xml_data +test.test_pyexpat.BufferTextTest.test1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.BufferTextTest.test2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.BufferTextTest.test3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.BufferTextTest.test4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.BufferTextTest.test5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.BufferTextTest.test6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.BufferTextTest.test7 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.BufferTextTest.test_buffering_enabled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.BufferTextTest.test_default_to_disabled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.ChardataBufferTest.test_1000_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.ChardataBufferTest.test_1025_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.ChardataBufferTest.test_change_size_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.ChardataBufferTest.test_change_size_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.ChardataBufferTest.test_disabling_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.ChardataBufferTest.test_unchanged_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.ChardataBufferTest.test_wrong_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.ErrorMessageTest.test_codes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.ErrorMessageTest.test_expaterror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.ForeignDTDTests.test_ignore_use_foreign_dtd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.ForeignDTDTests.test_use_foreign_dtd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.InterningTest.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.InterningTest.test_issue9402 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.MalformedInputTest.test1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.MalformedInputTest.test2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.NamespaceSeparatorTest.test_illegal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.NamespaceSeparatorTest.test_legal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.NamespaceSeparatorTest.test_zero_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.ParseTest.test_parse_again @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.ParseTest.test_parse_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.ParseTest.test_parse_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.ParseTest.test_parse_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.PositionTest.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.SetAttributeTest.test_buffer_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.SetAttributeTest.test_invalid_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.SetAttributeTest.test_namespace_prefixes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.SetAttributeTest.test_ordered_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.SetAttributeTest.test_specified_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_pyexpat.sf1296433Test.test_parse_only_xml_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_queue.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_queue.txt index 634ea6f3c3..51974e2df0 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_queue.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_queue.txt @@ -1,54 +1,52 @@ -*graalpython.lib-python.3.test.test_queue.CFailingQueueTest.test_failing_queue -*graalpython.lib-python.3.test.test_queue.CLifoQueueTest.test_basic -*graalpython.lib-python.3.test.test_queue.CLifoQueueTest.test_negative_timeout_raises_exception -*graalpython.lib-python.3.test.test_queue.CLifoQueueTest.test_nowait -*graalpython.lib-python.3.test.test_queue.CLifoQueueTest.test_queue_join -*graalpython.lib-python.3.test.test_queue.CLifoQueueTest.test_queue_task_done -*graalpython.lib-python.3.test.test_queue.CLifoQueueTest.test_shrinking_queue -*graalpython.lib-python.3.test.test_queue.CPriorityQueueTest.test_basic -*graalpython.lib-python.3.test.test_queue.CPriorityQueueTest.test_negative_timeout_raises_exception -*graalpython.lib-python.3.test.test_queue.CPriorityQueueTest.test_nowait -*graalpython.lib-python.3.test.test_queue.CPriorityQueueTest.test_queue_join -*graalpython.lib-python.3.test.test_queue.CPriorityQueueTest.test_queue_task_done -*graalpython.lib-python.3.test.test_queue.CPriorityQueueTest.test_shrinking_queue -*graalpython.lib-python.3.test.test_queue.CQueueTest.test_basic -*graalpython.lib-python.3.test.test_queue.CQueueTest.test_negative_timeout_raises_exception -*graalpython.lib-python.3.test.test_queue.CQueueTest.test_nowait -*graalpython.lib-python.3.test.test_queue.CQueueTest.test_queue_join -*graalpython.lib-python.3.test.test_queue.CQueueTest.test_queue_task_done -*graalpython.lib-python.3.test.test_queue.CQueueTest.test_shrinking_queue -*graalpython.lib-python.3.test.test_queue.CSimpleQueueTest.test_basic -*graalpython.lib-python.3.test.test_queue.CSimpleQueueTest.test_is_default -*graalpython.lib-python.3.test.test_queue.CSimpleQueueTest.test_many_threads -*graalpython.lib-python.3.test.test_queue.CSimpleQueueTest.test_many_threads_nonblock -*graalpython.lib-python.3.test.test_queue.CSimpleQueueTest.test_many_threads_timeout -*graalpython.lib-python.3.test.test_queue.CSimpleQueueTest.test_negative_timeout_raises_exception -*graalpython.lib-python.3.test.test_queue.CSimpleQueueTest.test_order -*graalpython.lib-python.3.test.test_queue.CSimpleQueueTest.test_reentrancy -*graalpython.lib-python.3.test.test_queue.CSimpleQueueTest.test_references -*graalpython.lib-python.3.test.test_queue.PyFailingQueueTest.test_failing_queue -*graalpython.lib-python.3.test.test_queue.PyLifoQueueTest.test_basic -*graalpython.lib-python.3.test.test_queue.PyLifoQueueTest.test_negative_timeout_raises_exception -*graalpython.lib-python.3.test.test_queue.PyLifoQueueTest.test_nowait -*graalpython.lib-python.3.test.test_queue.PyLifoQueueTest.test_queue_join -*graalpython.lib-python.3.test.test_queue.PyLifoQueueTest.test_queue_task_done -*graalpython.lib-python.3.test.test_queue.PyLifoQueueTest.test_shrinking_queue -*graalpython.lib-python.3.test.test_queue.PyPriorityQueueTest.test_basic -*graalpython.lib-python.3.test.test_queue.PyPriorityQueueTest.test_negative_timeout_raises_exception -*graalpython.lib-python.3.test.test_queue.PyPriorityQueueTest.test_nowait -*graalpython.lib-python.3.test.test_queue.PyPriorityQueueTest.test_queue_join -*graalpython.lib-python.3.test.test_queue.PyPriorityQueueTest.test_queue_task_done -*graalpython.lib-python.3.test.test_queue.PyPriorityQueueTest.test_shrinking_queue -*graalpython.lib-python.3.test.test_queue.PyQueueTest.test_basic -*graalpython.lib-python.3.test.test_queue.PyQueueTest.test_negative_timeout_raises_exception -*graalpython.lib-python.3.test.test_queue.PyQueueTest.test_nowait -*graalpython.lib-python.3.test.test_queue.PyQueueTest.test_queue_join -*graalpython.lib-python.3.test.test_queue.PyQueueTest.test_queue_task_done -*graalpython.lib-python.3.test.test_queue.PyQueueTest.test_shrinking_queue -*graalpython.lib-python.3.test.test_queue.PySimpleQueueTest.test_basic -*graalpython.lib-python.3.test.test_queue.PySimpleQueueTest.test_many_threads -*graalpython.lib-python.3.test.test_queue.PySimpleQueueTest.test_many_threads_nonblock -*graalpython.lib-python.3.test.test_queue.PySimpleQueueTest.test_many_threads_timeout -*graalpython.lib-python.3.test.test_queue.PySimpleQueueTest.test_negative_timeout_raises_exception -*graalpython.lib-python.3.test.test_queue.PySimpleQueueTest.test_order -*graalpython.lib-python.3.test.test_queue.PySimpleQueueTest.test_references +test.test_queue.CFailingQueueTest.test_failing_queue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CLifoQueueTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CLifoQueueTest.test_negative_timeout_raises_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CLifoQueueTest.test_nowait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CLifoQueueTest.test_queue_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CLifoQueueTest.test_queue_task_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CLifoQueueTest.test_shrinking_queue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CPriorityQueueTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CPriorityQueueTest.test_negative_timeout_raises_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CPriorityQueueTest.test_nowait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CPriorityQueueTest.test_queue_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CPriorityQueueTest.test_queue_task_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CPriorityQueueTest.test_shrinking_queue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CQueueTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CQueueTest.test_negative_timeout_raises_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CQueueTest.test_nowait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CQueueTest.test_queue_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CQueueTest.test_queue_task_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CQueueTest.test_shrinking_queue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CSimpleQueueTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CSimpleQueueTest.test_is_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CSimpleQueueTest.test_many_threads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CSimpleQueueTest.test_many_threads_nonblock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CSimpleQueueTest.test_many_threads_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CSimpleQueueTest.test_negative_timeout_raises_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CSimpleQueueTest.test_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.CSimpleQueueTest.test_reentrancy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyFailingQueueTest.test_failing_queue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyLifoQueueTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyLifoQueueTest.test_negative_timeout_raises_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyLifoQueueTest.test_nowait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyLifoQueueTest.test_queue_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyLifoQueueTest.test_queue_task_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyLifoQueueTest.test_shrinking_queue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyPriorityQueueTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyPriorityQueueTest.test_negative_timeout_raises_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyPriorityQueueTest.test_nowait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyPriorityQueueTest.test_queue_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyPriorityQueueTest.test_queue_task_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyPriorityQueueTest.test_shrinking_queue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyQueueTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyQueueTest.test_negative_timeout_raises_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyQueueTest.test_nowait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyQueueTest.test_queue_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyQueueTest.test_queue_task_done @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PyQueueTest.test_shrinking_queue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PySimpleQueueTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PySimpleQueueTest.test_many_threads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PySimpleQueueTest.test_many_threads_nonblock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PySimpleQueueTest.test_many_threads_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PySimpleQueueTest.test_negative_timeout_raises_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_queue.PySimpleQueueTest.test_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_quopri.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_quopri.txt index d19f67a377..eebe74261b 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_quopri.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_quopri.txt @@ -1,11 +1,11 @@ -*graalpython.lib-python.3.test.test_quopri.QuopriTestCase.test_decode -*graalpython.lib-python.3.test.test_quopri.QuopriTestCase.test_decode_header -*graalpython.lib-python.3.test.test_quopri.QuopriTestCase.test_decodestring -*graalpython.lib-python.3.test.test_quopri.QuopriTestCase.test_decodestring_double_equals -*graalpython.lib-python.3.test.test_quopri.QuopriTestCase.test_embedded_ws -*graalpython.lib-python.3.test.test_quopri.QuopriTestCase.test_encode -*graalpython.lib-python.3.test.test_quopri.QuopriTestCase.test_encode_header -*graalpython.lib-python.3.test.test_quopri.QuopriTestCase.test_encodestring -*graalpython.lib-python.3.test.test_quopri.QuopriTestCase.test_idempotent_string -*graalpython.lib-python.3.test.test_quopri.QuopriTestCase.test_scriptdecode -*graalpython.lib-python.3.test.test_quopri.QuopriTestCase.test_scriptencode +test.test_quopri.QuopriTestCase.test_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_quopri.QuopriTestCase.test_decode_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_quopri.QuopriTestCase.test_decodestring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_quopri.QuopriTestCase.test_decodestring_double_equals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_quopri.QuopriTestCase.test_embedded_ws @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_quopri.QuopriTestCase.test_encode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_quopri.QuopriTestCase.test_encode_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_quopri.QuopriTestCase.test_encodestring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_quopri.QuopriTestCase.test_idempotent_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_quopri.QuopriTestCase.test_scriptdecode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_quopri.QuopriTestCase.test_scriptencode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_raise.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_raise.txt index 498e701735..4b1d30ab90 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_raise.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_raise.txt @@ -1,36 +1,35 @@ -*graalpython.lib-python.3.test.test_raise.TestCause.testCauseSyntax -*graalpython.lib-python.3.test.test_raise.TestCause.test_class_cause -*graalpython.lib-python.3.test.test_raise.TestCause.test_erroneous_cause -*graalpython.lib-python.3.test.test_raise.TestCause.test_instance_cause -*graalpython.lib-python.3.test.test_raise.TestCause.test_invalid_cause -*graalpython.lib-python.3.test.test_raise.TestContext.test_3118 -*graalpython.lib-python.3.test.test_raise.TestContext.test_3611 -*graalpython.lib-python.3.test.test_raise.TestContext.test_c_exception_context -*graalpython.lib-python.3.test.test_raise.TestContext.test_c_exception_raise -*graalpython.lib-python.3.test.test_raise.TestContext.test_class_context_class_raise -*graalpython.lib-python.3.test.test_raise.TestContext.test_class_context_instance_raise -*graalpython.lib-python.3.test.test_raise.TestContext.test_context_manager -*graalpython.lib-python.3.test.test_raise.TestContext.test_cycle_broken -*graalpython.lib-python.3.test.test_raise.TestContext.test_instance_context_instance_raise -*graalpython.lib-python.3.test.test_raise.TestContext.test_noraise_finally -*graalpython.lib-python.3.test.test_raise.TestContext.test_not_last -*graalpython.lib-python.3.test.test_raise.TestContext.test_raise_finally -*graalpython.lib-python.3.test.test_raise.TestContext.test_reraise_cycle_broken -*graalpython.lib-python.3.test.test_raise.TestRaise.test_assert_with_tuple_arg -*graalpython.lib-python.3.test.test_raise.TestRaise.test_erroneous_exception -*graalpython.lib-python.3.test.test_raise.TestRaise.test_except_reraise -*graalpython.lib-python.3.test.test_raise.TestRaise.test_finally_reraise -*graalpython.lib-python.3.test.test_raise.TestRaise.test_invalid_reraise -*graalpython.lib-python.3.test.test_raise.TestRaise.test_nested_reraise -*graalpython.lib-python.3.test.test_raise.TestRaise.test_new_returns_invalid_instance -*graalpython.lib-python.3.test.test_raise.TestRaise.test_raise_from_None -*graalpython.lib-python.3.test.test_raise.TestRaise.test_reraise -*graalpython.lib-python.3.test.test_raise.TestRaise.test_with_reraise1 -*graalpython.lib-python.3.test.test_raise.TestRaise.test_with_reraise2 -*graalpython.lib-python.3.test.test_raise.TestRaise.test_yield_reraise -*graalpython.lib-python.3.test.test_raise.TestRemovedFunctionality.test_strings -*graalpython.lib-python.3.test.test_raise.TestRemovedFunctionality.test_tuples -*graalpython.lib-python.3.test.test_raise.TestTraceback.test_accepts_traceback -*graalpython.lib-python.3.test.test_raise.TestTraceback.test_sets_traceback -*graalpython.lib-python.3.test.test_raise.TestTracebackType.test_attrs -*graalpython.lib-python.3.test.test_raise.TestTracebackType.test_constructor +test.test_raise.TestCause.testCauseSyntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestCause.test_class_cause @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestCause.test_erroneous_cause @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestCause.test_instance_cause @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestCause.test_invalid_cause @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestContext.test_3118 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestContext.test_c_exception_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestContext.test_c_exception_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestContext.test_class_context_class_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestContext.test_class_context_instance_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestContext.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestContext.test_cycle_broken @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestContext.test_instance_context_instance_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestContext.test_noraise_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestContext.test_not_last @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestContext.test_raise_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestContext.test_reraise_cycle_broken @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestRaise.test_assert_with_tuple_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestRaise.test_erroneous_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestRaise.test_except_reraise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestRaise.test_finally_reraise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestRaise.test_invalid_reraise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestRaise.test_nested_reraise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestRaise.test_new_returns_invalid_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestRaise.test_raise_from_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestRaise.test_reraise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestRaise.test_with_reraise1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestRaise.test_with_reraise2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestRaise.test_yield_reraise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestRemovedFunctionality.test_strings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestRemovedFunctionality.test_tuples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestTraceback.test_accepts_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestTraceback.test_sets_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestTracebackType.test_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_raise.TestTracebackType.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_random.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_random.txt index 343b08c752..cf33a90810 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_random.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_random.txt @@ -1,109 +1,98 @@ -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_53_bits_per_float -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_autoseed -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_bigrand -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_bigrand_ranges -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_bug_1727780 -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_bug_27706 -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_bug_31478 -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_bug_31482 -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_bug_41052 -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_bug_42008 -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_bug_9025 -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_choice -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_choice_with_numpy -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_choices -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_choices_algorithms -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_choices_infinite_total -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_choices_negative_total -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_choices_subnormal -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_choices_with_all_zero_weights -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_gauss -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_genrandbits -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_getrandbits -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_guaranteed_stable -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_long_seed -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_mu_sigma_default_args -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_pickling -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_randbelow_logic -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_randbelow_without_getrandbits -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_randbytes -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_randbytes_getrandbits -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_randrange_bug_1590891 -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_randrange_uses_getrandbits -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_rangelimits -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_referenceImplementation -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_sample -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_sample_counts_equivalence -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_sample_distribution -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_sample_inputs -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_sample_on_dicts -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_sample_on_seqsets -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_sample_on_sets -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_sample_with_counts -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_saverestore -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_seed_no_mutate_bug_44018 -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_seed_when_randomness_source_not_found -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_seedargs -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_setstate_first_arg -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_setstate_middle_arg -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_shuffle -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_shuffle_random_argument -*graalpython.lib-python.3.test.test_random.MersenneTwister_TestBasicOps.test_strong_reference_implementation -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_53_bits_per_float -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_autoseed -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_bigrand -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_bigrand_ranges -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_bug_1727780 -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_bug_41052 -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_bug_42008 -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_bug_9025 -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_choice -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_choice_with_numpy -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_choices -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_choices_infinite_total -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_choices_negative_total -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_choices_subnormal -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_choices_with_all_zero_weights -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_gauss -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_genrandbits -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_getrandbits -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_mu_sigma_default_args -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_pickling -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_randbelow_logic -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_randbytes -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_randrange_argument_handling -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_randrange_errors -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_randrange_nonunit_step -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_randrange_step -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_rangelimits -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_sample -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_sample_distribution -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_sample_inputs -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_sample_on_dicts -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_sample_on_seqsets -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_sample_on_sets -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_sample_with_counts -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_saverestore -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_seed_no_mutate_bug_44018 -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_seed_when_randomness_source_not_found -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_seedargs -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_shuffle -*graalpython.lib-python.3.test.test_random.SystemRandom_TestBasicOps.test_shuffle_random_argument -*graalpython.lib-python.3.test.test_random.TestDistributions.test_avg_std -*graalpython.lib-python.3.test.test_random.TestDistributions.test_betavariate_return_zero -*graalpython.lib-python.3.test.test_random.TestDistributions.test_constant -*graalpython.lib-python.3.test.test_random.TestDistributions.test_gammavariate_alpha_between_zero_and_one -*graalpython.lib-python.3.test.test_random.TestDistributions.test_gammavariate_alpha_equal_one -*graalpython.lib-python.3.test.test_random.TestDistributions.test_gammavariate_alpha_equal_one_equals_expovariate -*graalpython.lib-python.3.test.test_random.TestDistributions.test_gammavariate_alpha_greater_one -*graalpython.lib-python.3.test.test_random.TestDistributions.test_gammavariate_errors -*graalpython.lib-python.3.test.test_random.TestDistributions.test_von_mises_large_kappa -*graalpython.lib-python.3.test.test_random.TestDistributions.test_von_mises_range -*graalpython.lib-python.3.test.test_random.TestDistributions.test_zeroinputs -*graalpython.lib-python.3.test.test_random.TestModule.testMagicConstants -*graalpython.lib-python.3.test.test_random.TestModule.test__all__ -*graalpython.lib-python.3.test.test_random.TestModule.test_after_fork -*graalpython.lib-python.3.test.test_random.TestRandomSubclassing.test_random_subclass_with_kwargs -*graalpython.lib-python.3.test.test_random.TestRandomSubclassing.test_subclasses_overriding_methods -*graalpython.lib-python.3.test.test_random.TestRawMersenneTwister.test_bug_41052 -*graalpython.lib-python.3.test.test_random.TestRawMersenneTwister.test_bug_42008 +test.test_random.MersenneTwister_TestBasicOps.test_53_bits_per_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_autoseed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_bigrand @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_bigrand_ranges @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_bug_1727780 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_bug_27706 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_bug_31478 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_bug_31482 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_bug_9025 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_choice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_choice_with_numpy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_choices @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_choices_algorithms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_choices_infinite_total @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_choices_negative_total @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_choices_subnormal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_choices_with_all_zero_weights @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_gauss @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_getrandbits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_guaranteed_stable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_long_seed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_mu_sigma_default_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_randbelow_logic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_randbelow_without_getrandbits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_randbytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_randbytes_getrandbits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_randrange_bug_1590891 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_randrange_uses_getrandbits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_rangelimits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_referenceImplementation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_sample @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_sample_counts_equivalence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_sample_distribution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_sample_inputs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_sample_on_dicts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_sample_on_seqsets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_sample_on_sets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_sample_with_counts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_saverestore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_seed_no_mutate_bug_44018 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_seed_when_randomness_source_not_found @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_seedargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_setstate_first_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_setstate_middle_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_shuffle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.MersenneTwister_TestBasicOps.test_strong_reference_implementation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_53_bits_per_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_autoseed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_bigrand @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_bigrand_ranges @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_bug_1727780 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_bug_9025 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_choice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_choice_with_numpy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_choices @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_choices_infinite_total @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_choices_negative_total @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_choices_subnormal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_choices_with_all_zero_weights @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_gauss @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_getrandbits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_mu_sigma_default_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_randbelow_logic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_randbytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_randrange_argument_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_randrange_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_randrange_nonunit_step @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_randrange_step @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_rangelimits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_sample @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_sample_distribution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_sample_inputs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_sample_on_dicts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_sample_on_seqsets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_sample_on_sets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_sample_with_counts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_saverestore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_seed_no_mutate_bug_44018 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_seed_when_randomness_source_not_found @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_seedargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.SystemRandom_TestBasicOps.test_shuffle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.TestDistributions.test_avg_std @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.TestDistributions.test_betavariate_return_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.TestDistributions.test_constant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.TestDistributions.test_gammavariate_alpha_between_zero_and_one @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.TestDistributions.test_gammavariate_alpha_equal_one @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.TestDistributions.test_gammavariate_alpha_equal_one_equals_expovariate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.TestDistributions.test_gammavariate_alpha_greater_one @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.TestDistributions.test_gammavariate_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.TestDistributions.test_von_mises_large_kappa @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.TestDistributions.test_von_mises_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.TestDistributions.test_zeroinputs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.TestModule.testMagicConstants @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.TestModule.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.TestRandomSubclassing.test_random_subclass_with_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_random.TestRandomSubclassing.test_subclasses_overriding_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_range.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_range.txt index 85dc07f26e..e207e25ce5 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_range.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_range.txt @@ -1,25 +1,25 @@ -*graalpython.lib-python.3.test.test_range.RangeTest.test_attributes -*graalpython.lib-python.3.test.test_range.RangeTest.test_comparison -*graalpython.lib-python.3.test.test_range.RangeTest.test_contains -*graalpython.lib-python.3.test.test_range.RangeTest.test_count -*graalpython.lib-python.3.test.test_range.RangeTest.test_empty -*graalpython.lib-python.3.test.test_range.RangeTest.test_exhausted_iterator_pickling -*graalpython.lib-python.3.test.test_range.RangeTest.test_index -*graalpython.lib-python.3.test.test_range.RangeTest.test_invalid_invocation -*graalpython.lib-python.3.test.test_range.RangeTest.test_issue11845 -*graalpython.lib-python.3.test.test_range.RangeTest.test_iterator_pickling -*graalpython.lib-python.3.test.test_range.RangeTest.test_iterator_pickling_overflowing_index -*graalpython.lib-python.3.test.test_range.RangeTest.test_large_exhausted_iterator_pickling -*graalpython.lib-python.3.test.test_range.RangeTest.test_large_operands -*graalpython.lib-python.3.test.test_range.RangeTest.test_large_range -*graalpython.lib-python.3.test.test_range.RangeTest.test_odd_bug -*graalpython.lib-python.3.test.test_range.RangeTest.test_pickling -*graalpython.lib-python.3.test.test_range.RangeTest.test_range -*graalpython.lib-python.3.test.test_range.RangeTest.test_range_iterators -*graalpython.lib-python.3.test.test_range.RangeTest.test_range_iterators_invocation -*graalpython.lib-python.3.test.test_range.RangeTest.test_repr -*graalpython.lib-python.3.test.test_range.RangeTest.test_reverse_iteration -*graalpython.lib-python.3.test.test_range.RangeTest.test_slice -*graalpython.lib-python.3.test.test_range.RangeTest.test_strided_limits -*graalpython.lib-python.3.test.test_range.RangeTest.test_types -*graalpython.lib-python.3.test.test_range.RangeTest.test_user_index_method +test.test_range.RangeTest.test_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_exhausted_iterator_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_invalid_invocation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_issue11845 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_iterator_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_iterator_pickling_overflowing_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_large_exhausted_iterator_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_large_operands @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_large_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_odd_bug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_range_iterators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_range_iterators_invocation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_reverse_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_strided_limits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_range.RangeTest.test_user_index_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_re.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_re.txt index e5c34eef6a..2810175b33 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_re.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_re.txt @@ -1,153 +1,143 @@ -*graalpython.lib-python.3.test.test_re.DebugTests.test_atomic_group -*graalpython.lib-python.3.test.test_re.DebugTests.test_debug_flag -*graalpython.lib-python.3.test.test_re.DebugTests.test_possesive_repeat -*graalpython.lib-python.3.test.test_re.DebugTests.test_possesive_repeat_one -*graalpython.lib-python.3.test.test_re.ExternalTests.test_re_benchmarks -*graalpython.lib-python.3.test.test_re.ExternalTests.test_re_tests -*graalpython.lib-python.3.test.test_re.ImplementationTest.test_case_helpers -*graalpython.lib-python.3.test.test_re.ImplementationTest.test_dealloc -*graalpython.lib-python.3.test.test_re.ImplementationTest.test_disallow_instantiation -*graalpython.lib-python.3.test.test_re.ImplementationTest.test_immutable -*graalpython.lib-python.3.test.test_re.ImplementationTest.test_overlap_table -*graalpython.lib-python.3.test.test_re.ImplementationTest.test_repeat_minmax_overflow_maxrepeat -*graalpython.lib-python.3.test.test_re.ImplementationTest.test_signedness -*graalpython.lib-python.3.test.test_re.PatternReprTests.test_bytes -*graalpython.lib-python.3.test.test_re.PatternReprTests.test_flags_repr -*graalpython.lib-python.3.test.test_re.PatternReprTests.test_inline_flags -*graalpython.lib-python.3.test.test_re.PatternReprTests.test_locale -*graalpython.lib-python.3.test.test_re.PatternReprTests.test_long_pattern -*graalpython.lib-python.3.test.test_re.PatternReprTests.test_multiple_flags -*graalpython.lib-python.3.test.test_re.PatternReprTests.test_quotes -*graalpython.lib-python.3.test.test_re.PatternReprTests.test_single_flag -*graalpython.lib-python.3.test.test_re.PatternReprTests.test_unicode_flag -*graalpython.lib-python.3.test.test_re.PatternReprTests.test_unknown_flags -*graalpython.lib-python.3.test.test_re.PatternReprTests.test_without_flags -*graalpython.lib-python.3.test.test_re.ReTests.test_ASSERT_NOT_mark_bug -*graalpython.lib-python.3.test.test_re.ReTests.test_MARK_PUSH_macro_bug -*graalpython.lib-python.3.test.test_re.ReTests.test_MIN_REPEAT_ONE_mark_bug -*graalpython.lib-python.3.test.test_re.ReTests.test_MIN_UNTIL_mark_bug -*graalpython.lib-python.3.test.test_re.ReTests.test_REPEAT_ONE_mark_bug -*graalpython.lib-python.3.test.test_re.ReTests.test_anyall -*graalpython.lib-python.3.test.test_re.ReTests.test_ascii_and_unicode_flag -*graalpython.lib-python.3.test.test_re.ReTests.test_atomic_grouping -*graalpython.lib-python.3.test.test_re.ReTests.test_backref_group_name_in_exception -*graalpython.lib-python.3.test.test_re.ReTests.test_basic_re_sub -*graalpython.lib-python.3.test.test_re.ReTests.test_big_codesize -*graalpython.lib-python.3.test.test_re.ReTests.test_bigcharset -*graalpython.lib-python.3.test.test_re.ReTests.test_branching -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_113254 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_114660 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_117612 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_1661 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_16688 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_20998 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_2537 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_29444 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_34294 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_3629 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_418626 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_448951 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_449000 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_449964 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_527371 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_581080 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_612074 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_6509 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_6561 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_725106 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_725149 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_764548 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_817234 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_926075 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_931848 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_gh106052 -*graalpython.lib-python.3.test.test_re.ReTests.test_bug_gh91616 -*graalpython.lib-python.3.test.test_re.ReTests.test_bytes_str_mixing -*graalpython.lib-python.3.test.test_re.ReTests.test_case_helpers -*graalpython.lib-python.3.test.test_re.ReTests.test_category -*graalpython.lib-python.3.test.test_re.ReTests.test_character_set_errors -*graalpython.lib-python.3.test.test_re.ReTests.test_comments -*graalpython.lib-python.3.test.test_re.ReTests.test_compile -*graalpython.lib-python.3.test.test_re.ReTests.test_constants -*graalpython.lib-python.3.test.test_re.ReTests.test_copying -*graalpython.lib-python.3.test.test_re.ReTests.test_dealloc -*graalpython.lib-python.3.test.test_re.ReTests.test_debug_flag -*graalpython.lib-python.3.test.test_re.ReTests.test_dollar_matches_twice -*graalpython.lib-python.3.test.test_re.ReTests.test_empty_array -*graalpython.lib-python.3.test.test_re.ReTests.test_enum -*graalpython.lib-python.3.test.test_re.ReTests.test_error -*graalpython.lib-python.3.test.test_re.ReTests.test_expand -*graalpython.lib-python.3.test.test_re.ReTests.test_findall_atomic_grouping -*graalpython.lib-python.3.test.test_re.ReTests.test_findall_possessive_quantifiers -*graalpython.lib-python.3.test.test_re.ReTests.test_finditer -*graalpython.lib-python.3.test.test_re.ReTests.test_flags -*graalpython.lib-python.3.test.test_re.ReTests.test_fullmatch_atomic_grouping -*graalpython.lib-python.3.test.test_re.ReTests.test_fullmatch_possessive_quantifiers -*graalpython.lib-python.3.test.test_re.ReTests.test_getattr -*graalpython.lib-python.3.test.test_re.ReTests.test_group -*graalpython.lib-python.3.test.test_re.ReTests.test_group_name_in_exception -*graalpython.lib-python.3.test.test_re.ReTests.test_groupdict -*graalpython.lib-python.3.test.test_re.ReTests.test_ignore_case -*graalpython.lib-python.3.test.test_re.ReTests.test_ignore_case_range -*graalpython.lib-python.3.test.test_re.ReTests.test_ignore_case_set -*graalpython.lib-python.3.test.test_re.ReTests.test_ignore_spaces -*graalpython.lib-python.3.test.test_re.ReTests.test_inline_flags -*graalpython.lib-python.3.test.test_re.ReTests.test_issue17998 -*graalpython.lib-python.3.test.test_re.ReTests.test_keep_buffer -*graalpython.lib-python.3.test.test_re.ReTests.test_keyword_parameters -*graalpython.lib-python.3.test.test_re.ReTests.test_large_search -*graalpython.lib-python.3.test.test_re.ReTests.test_large_subn -*graalpython.lib-python.3.test.test_re.ReTests.test_locale_flag -*graalpython.lib-python.3.test.test_re.ReTests.test_lookahead -*graalpython.lib-python.3.test.test_re.ReTests.test_lookbehind -*graalpython.lib-python.3.test.test_re.ReTests.test_match_getitem -*graalpython.lib-python.3.test.test_re.ReTests.test_match_repr -*graalpython.lib-python.3.test.test_re.ReTests.test_misc_errors -*graalpython.lib-python.3.test.test_re.ReTests.test_multiple_repeat -*graalpython.lib-python.3.test.test_re.ReTests.test_named_unicode_escapes -*graalpython.lib-python.3.test.test_re.ReTests.test_not_literal -*graalpython.lib-python.3.test.test_re.ReTests.test_nothing_to_repeat -*graalpython.lib-python.3.test.test_re.ReTests.test_other_escapes -*graalpython.lib-python.3.test.test_re.ReTests.test_pattern_compare -*graalpython.lib-python.3.test.test_re.ReTests.test_pattern_compare_bytes -*graalpython.lib-python.3.test.test_re.ReTests.test_pickling -*graalpython.lib-python.3.test.test_re.ReTests.test_possible_set_operations -*graalpython.lib-python.3.test.test_re.ReTests.test_qualified_re_split -*graalpython.lib-python.3.test.test_re.ReTests.test_qualified_re_sub -*graalpython.lib-python.3.test.test_re.ReTests.test_re_escape -*graalpython.lib-python.3.test.test_re.ReTests.test_re_escape_bytes -*graalpython.lib-python.3.test.test_re.ReTests.test_re_escape_non_ascii -*graalpython.lib-python.3.test.test_re.ReTests.test_re_escape_non_ascii_bytes -*graalpython.lib-python.3.test.test_re.ReTests.test_re_findall -*graalpython.lib-python.3.test.test_re.ReTests.test_re_fullmatch -*graalpython.lib-python.3.test.test_re.ReTests.test_re_groupref -*graalpython.lib-python.3.test.test_re.ReTests.test_re_groupref_exists -*graalpython.lib-python.3.test.test_re.ReTests.test_re_groupref_exists_errors -*graalpython.lib-python.3.test.test_re.ReTests.test_re_groupref_exists_validation_bug -*graalpython.lib-python.3.test.test_re.ReTests.test_re_groupref_overflow -*graalpython.lib-python.3.test.test_re.ReTests.test_re_match -*graalpython.lib-python.3.test.test_re.ReTests.test_re_split -*graalpython.lib-python.3.test.test_re.ReTests.test_re_subn -*graalpython.lib-python.3.test.test_re.ReTests.test_repeat_minmax -*graalpython.lib-python.3.test.test_re.ReTests.test_repeat_minmax_overflow -*graalpython.lib-python.3.test.test_re.ReTests.test_repeat_minmax_overflow_maxrepeat -*graalpython.lib-python.3.test.test_re.ReTests.test_scanner -*graalpython.lib-python.3.test.test_re.ReTests.test_scoped_flags -*graalpython.lib-python.3.test.test_re.ReTests.test_search_coverage -*graalpython.lib-python.3.test.test_re.ReTests.test_search_dot_unicode -*graalpython.lib-python.3.test.test_re.ReTests.test_search_star_plus -*graalpython.lib-python.3.test.test_re.ReTests.test_special_escapes -*graalpython.lib-python.3.test.test_re.ReTests.test_sre_byte_class_literals -*graalpython.lib-python.3.test.test_re.ReTests.test_sre_byte_literals -*graalpython.lib-python.3.test.test_re.ReTests.test_sre_character_class_literals -*graalpython.lib-python.3.test.test_re.ReTests.test_sre_character_literals -*graalpython.lib-python.3.test.test_re.ReTests.test_stack_overflow -*graalpython.lib-python.3.test.test_re.ReTests.test_string_boundaries -*graalpython.lib-python.3.test.test_re.ReTests.test_sub_template_numeric_escape -*graalpython.lib-python.3.test.test_re.ReTests.test_symbolic_groups -*graalpython.lib-python.3.test.test_re.ReTests.test_symbolic_groups_errors -*graalpython.lib-python.3.test.test_re.ReTests.test_symbolic_refs -*graalpython.lib-python.3.test.test_re.ReTests.test_symbolic_refs_errors -*graalpython.lib-python.3.test.test_re.ReTests.test_unlimited_zero_width_repeat -*graalpython.lib-python.3.test.test_re.ReTests.test_weakref -*graalpython.lib-python.3.test.test_re.ReTests.test_zerowidth +test.test_re.ExternalTests.test_re_benchmarks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ExternalTests.test_re_tests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ImplementationTest.test_overlap_table @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ImplementationTest.test_signedness @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.PatternReprTests.test_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.PatternReprTests.test_flags_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.PatternReprTests.test_inline_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.PatternReprTests.test_locale @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.PatternReprTests.test_long_pattern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.PatternReprTests.test_multiple_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.PatternReprTests.test_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.PatternReprTests.test_single_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.PatternReprTests.test_unicode_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.PatternReprTests.test_unknown_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.PatternReprTests.test_without_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_ASSERT_NOT_mark_bug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_MARK_PUSH_macro_bug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_MIN_REPEAT_ONE_mark_bug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_MIN_UNTIL_mark_bug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_REPEAT_ONE_mark_bug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_anyall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_ascii_and_unicode_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_atomic_grouping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_backref_group_name_in_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_basic_re_sub @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_big_codesize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bigcharset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_branching @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_113254 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_114660 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_117612 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_1661 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_16688 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_20998 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_2537 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_29444 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_34294 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_3629 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_418626 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_448951 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_449000 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_449964 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_527371 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_581080 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_612074 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_6509 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_6561 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_725106 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_725149 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_764548 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_817234 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_926075 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_931848 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_gh106052 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bug_gh91616 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_bytes_str_mixing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_category @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_character_set_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_compile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_constants @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_copying @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_dollar_matches_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_empty_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_expand @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_findall_atomic_grouping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_findall_possessive_quantifiers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_finditer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_fullmatch_atomic_grouping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_fullmatch_possessive_quantifiers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_getattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_group_name_in_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_groupdict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_ignore_case @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_ignore_case_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_ignore_case_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_ignore_spaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_inline_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_issue17998 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_keyword_parameters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_large_search @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_large_subn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_locale_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_lookahead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_lookbehind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_match_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_match_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_misc_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_multiple_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_named_unicode_escapes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_not_literal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_nothing_to_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_other_escapes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_pattern_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_pattern_compare_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_possessive_quantifiers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_possible_set_operations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_qualified_re_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_qualified_re_sub @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_re_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_re_escape_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_re_escape_non_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_re_escape_non_ascii_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_re_findall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_re_fullmatch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_re_groupref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_re_groupref_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_re_groupref_exists_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_re_groupref_exists_validation_bug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_re_groupref_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_re_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_re_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_re_subn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_regression_gh94675 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_re.ReTests.test_repeat_minmax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_repeat_minmax_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_scanner @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_scoped_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_search_anchor_at_beginning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_search_coverage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_search_dot_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_search_star_plus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_special_escapes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_sre_byte_class_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_sre_byte_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_sre_character_class_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_sre_character_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_stack_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_string_boundaries @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_sub_template_numeric_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_symbolic_groups @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_symbolic_groups_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_symbolic_refs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_symbolic_refs_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_template_function_and_flag_is_deprecated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_unlimited_zero_width_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_weakref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_re.ReTests.test_zerowidth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_regrtest.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_regrtest.txt index 65e7cd54a5..00a959c1fe 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_regrtest.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_regrtest.txt @@ -1,60 +1,47 @@ -*graalpython.lib-python.3.test.test_regrtest.ArgsTestCase.test_crashed -*graalpython.lib-python.3.test.test_regrtest.ArgsTestCase.test_findleaks -*graalpython.lib-python.3.test.test_regrtest.ArgsTestCase.test_huntrleaks -*graalpython.lib-python.3.test.test_regrtest.ArgsTestCase.test_huntrleaks_fd_leak -*graalpython.lib-python.3.test.test_regrtest.ArgsTestCase.test_huntrleaks_mp -*graalpython.lib-python.3.test.test_regrtest.ArgsTestCase.test_uncollectable -*graalpython.lib-python.3.test.test_regrtest.ArgsTestCase.test_worker_output_on_failure -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_arg -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_arg_option_arg -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_coverage -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_coverdir -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_dont_add_python_opts -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_exclude -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_failfast -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_fast_ci -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_fast_ci_python_cmd -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_fast_ci_resource -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_forever -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_fromfile -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_header -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_help -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_huntrleaks -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_ignore -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_long_option__partial -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_match -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_memlimit -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_multiprocess -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_nocoverdir -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_nowindows -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_option_and_arg -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_option_with_empty_string_value -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_quiet -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_randomize -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_randseed -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_rerun -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_runleaks -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_single -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_slow_ci -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_slowest -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_start -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_testdir -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_threshold -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_timeout -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_two_options -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_unknown_option -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_unrecognized_argument -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_use -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_verbose -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_verbose2 -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_verbose3 -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_wait -*graalpython.lib-python.3.test.test_regrtest.ParseArgsTestCase.test_worker_args -*graalpython.lib-python.3.test.test_regrtest.ProgramsTestCase.test_pcbuild_rt -*graalpython.lib-python.3.test.test_regrtest.ProgramsTestCase.test_tools_buildbot_test -*graalpython.lib-python.3.test.test_regrtest.ProgramsTestCase.test_tools_script_run_tests -*graalpython.lib-python.3.test.test_regrtest.TestUtils.test_format_duration -*graalpython.lib-python.3.test.test_regrtest.TestUtils.test_format_resources -*graalpython.lib-python.3.test.test_regrtest.TestUtils.test_get_signal_name -*graalpython.lib-python.3.test.test_regrtest.TestUtils.test_match_test -*graalpython.lib-python.3.test.test_regrtest.TestUtils.test_normalize_test_name +test.test_regrtest.ParseArgsTestCase.test_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_arg_option_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_coverage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_coverdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_dont_add_python_opts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_exclude @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_failfast @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_fast_ci @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_fast_ci_python_cmd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_fast_ci_resource @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_forever @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_fromfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_huntrleaks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_long_option__partial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_memlimit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_multiprocess @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_nocoverdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_nowindows @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_option_and_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_option_with_empty_string_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_quiet @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_randomize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_randseed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_rerun @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_runleaks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_single @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_slow_ci @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_slowest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_testdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_threshold @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_two_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_unknown_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_unrecognized_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_use @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_verbose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_verbose3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.ParseArgsTestCase.test_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.TestUtils.test_format_duration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.TestUtils.test_format_resources @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.TestUtils.test_get_signal_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.TestUtils.test_match_test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_regrtest.TestUtils.test_normalize_test_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_repl.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_repl.txt index 921bc97e4b..124e5b4acb 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_repl.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_repl.txt @@ -1,2 +1 @@ -*graalpython.lib-python.3.test.test_repl.TestInteractiveInterpreter.test_multiline_string_parsing -*graalpython.lib-python.3.test.test_repl.TestInteractiveInterpreter.test_no_memory +test.test_repl.TestInteractiveInterpreter.test_close_stdin @ win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_reprlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_reprlib.txt index 96405f65f8..4a900f403c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_reprlib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_reprlib.txt @@ -1,23 +1,21 @@ -*graalpython.lib-python.3.test.test_reprlib.LongReprTest.test_builtin_function -*graalpython.lib-python.3.test.test_reprlib.LongReprTest.test_class -*graalpython.lib-python.3.test.test_reprlib.LongReprTest.test_instance -*graalpython.lib-python.3.test.test_reprlib.LongReprTest.test_method -*graalpython.lib-python.3.test.test_reprlib.LongReprTest.test_module -*graalpython.lib-python.3.test.test_reprlib.LongReprTest.test_object -*graalpython.lib-python.3.test.test_reprlib.LongReprTest.test_type -*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_builtin_function -*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_cell -*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_container -*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_descriptors -*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_frozenset -*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_instance -*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_lambda -*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_nesting -*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_numbers -*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_range -*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_set_literal -*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_string -*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_tuple -*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_unsortable -*graalpython.lib-python.3.test.test_reprlib.TestRecursiveRepr.test_assigned_attributes -*graalpython.lib-python.3.test.test_reprlib.TestRecursiveRepr.test_recursive_repr +test.test_reprlib.LongReprTest.test_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.LongReprTest.test_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.LongReprTest.test_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.LongReprTest.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.LongReprTest.test_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.ReprTests.test_builtin_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.ReprTests.test_cell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.ReprTests.test_container @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.ReprTests.test_descriptors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.ReprTests.test_frozenset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.ReprTests.test_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.ReprTests.test_lambda @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.ReprTests.test_nesting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.ReprTests.test_numbers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.ReprTests.test_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.ReprTests.test_set_literal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.ReprTests.test_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.ReprTests.test_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.ReprTests.test_unsortable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.TestRecursiveRepr.test_assigned_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_reprlib.TestRecursiveRepr.test_recursive_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_resource.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_resource.txt index e5a7931338..4474352e82 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_resource.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_resource.txt @@ -1,6 +1,4 @@ -*graalpython.lib-python.3.test.test_resource.ResourceTest.test_freebsd_contants -*graalpython.lib-python.3.test.test_resource.ResourceTest.test_getrusage -*graalpython.lib-python.3.test.test_resource.ResourceTest.test_linux_constants -*graalpython.lib-python.3.test.test_resource.ResourceTest.test_pagesize -*graalpython.lib-python.3.test.test_resource.ResourceTest.test_prlimit -*graalpython.lib-python.3.test.test_resource.ResourceTest.test_prlimit_refcount +test.test_resource.ResourceTest.test_freebsd_contants @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_resource.ResourceTest.test_getrusage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_resource.ResourceTest.test_linux_constants @ linux-aarch64,linux-x86_64 +test.test_resource.ResourceTest.test_pagesize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_richcmp.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_richcmp.txt index 50274adc2c..e268a9598d 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_richcmp.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_richcmp.txt @@ -1,11 +1,11 @@ -*graalpython.lib-python.3.test.test_richcmp.DictTest.test_dicts -*graalpython.lib-python.3.test.test_richcmp.ListTest.test_badentry -*graalpython.lib-python.3.test.test_richcmp.ListTest.test_coverage -*graalpython.lib-python.3.test.test_richcmp.ListTest.test_goodentry -*graalpython.lib-python.3.test.test_richcmp.MiscTest.test_exception_message -*graalpython.lib-python.3.test.test_richcmp.MiscTest.test_misbehavin -*graalpython.lib-python.3.test.test_richcmp.MiscTest.test_not -*graalpython.lib-python.3.test.test_richcmp.MiscTest.test_recursion -*graalpython.lib-python.3.test.test_richcmp.NumberTest.test_basic -*graalpython.lib-python.3.test.test_richcmp.NumberTest.test_values -*graalpython.lib-python.3.test.test_richcmp.VectorTest.test_mixed +test.test_richcmp.DictTest.test_dicts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_richcmp.ListTest.test_badentry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_richcmp.ListTest.test_coverage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_richcmp.ListTest.test_goodentry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_richcmp.MiscTest.test_exception_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_richcmp.MiscTest.test_misbehavin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_richcmp.MiscTest.test_not @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_richcmp.MiscTest.test_recursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_richcmp.NumberTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_richcmp.NumberTest.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_richcmp.VectorTest.test_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_rlcompleter.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_rlcompleter.txt index bf074fd487..ac28cc47a0 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_rlcompleter.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_rlcompleter.txt @@ -1,7 +1,7 @@ -*graalpython.lib-python.3.test.test_rlcompleter.TestRlcompleter.test_complete -*graalpython.lib-python.3.test.test_rlcompleter.TestRlcompleter.test_duplicate_globals -*graalpython.lib-python.3.test.test_rlcompleter.TestRlcompleter.test_excessive_getattr -*graalpython.lib-python.3.test.test_rlcompleter.TestRlcompleter.test_global_matches -*graalpython.lib-python.3.test.test_rlcompleter.TestRlcompleter.test_namespace -*graalpython.lib-python.3.test.test_rlcompleter.TestRlcompleter.test_property_method_not_called -*graalpython.lib-python.3.test.test_rlcompleter.TestRlcompleter.test_uncreated_attr +test.test_rlcompleter.TestRlcompleter.test_complete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_rlcompleter.TestRlcompleter.test_duplicate_globals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_rlcompleter.TestRlcompleter.test_excessive_getattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_rlcompleter.TestRlcompleter.test_global_matches @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_rlcompleter.TestRlcompleter.test_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_rlcompleter.TestRlcompleter.test_property_method_not_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_rlcompleter.TestRlcompleter.test_uncreated_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_robotparser.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_robotparser.txt index 89447af4c2..40d63af106 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_robotparser.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_robotparser.txt @@ -1,63 +1,63 @@ -*graalpython.lib-python.3.test.test_robotparser.AnotherInvalidRequestRateTest.test_bad_urls -*graalpython.lib-python.3.test.test_robotparser.AnotherInvalidRequestRateTest.test_good_urls -*graalpython.lib-python.3.test.test_robotparser.AnotherInvalidRequestRateTest.test_site_maps -*graalpython.lib-python.3.test.test_robotparser.CrawlDelayAndCustomAgentTest.test_bad_urls -*graalpython.lib-python.3.test.test_robotparser.CrawlDelayAndCustomAgentTest.test_good_urls -*graalpython.lib-python.3.test.test_robotparser.CrawlDelayAndCustomAgentTest.test_site_maps -*graalpython.lib-python.3.test.test_robotparser.CrawlDelayAndRequestRateTest.test_bad_urls -*graalpython.lib-python.3.test.test_robotparser.CrawlDelayAndRequestRateTest.test_good_urls -*graalpython.lib-python.3.test.test_robotparser.CrawlDelayAndRequestRateTest.test_request_rate -*graalpython.lib-python.3.test.test_robotparser.CrawlDelayAndRequestRateTest.test_site_maps -*graalpython.lib-python.3.test.test_robotparser.DefaultEntryTest.test_bad_urls -*graalpython.lib-python.3.test.test_robotparser.DefaultEntryTest.test_good_urls -*graalpython.lib-python.3.test.test_robotparser.DefaultEntryTest.test_request_rate -*graalpython.lib-python.3.test.test_robotparser.DefaultEntryTest.test_site_maps -*graalpython.lib-python.3.test.test_robotparser.DifferentAgentTest.test_bad_urls -*graalpython.lib-python.3.test.test_robotparser.DifferentAgentTest.test_good_urls -*graalpython.lib-python.3.test.test_robotparser.DifferentAgentTest.test_request_rate -*graalpython.lib-python.3.test.test_robotparser.DifferentAgentTest.test_site_maps -*graalpython.lib-python.3.test.test_robotparser.DisallowQueryStringTest.test_bad_urls -*graalpython.lib-python.3.test.test_robotparser.DisallowQueryStringTest.test_good_urls -*graalpython.lib-python.3.test.test_robotparser.DisallowQueryStringTest.test_site_maps -*graalpython.lib-python.3.test.test_robotparser.EmptyFileTest.test_bad_urls -*graalpython.lib-python.3.test.test_robotparser.EmptyFileTest.test_good_urls -*graalpython.lib-python.3.test.test_robotparser.EmptyFileTest.test_request_rate -*graalpython.lib-python.3.test.test_robotparser.EmptyFileTest.test_site_maps -*graalpython.lib-python.3.test.test_robotparser.EmptyQueryStringTest.test_bad_urls -*graalpython.lib-python.3.test.test_robotparser.EmptyQueryStringTest.test_good_urls -*graalpython.lib-python.3.test.test_robotparser.EmptyQueryStringTest.test_site_maps -*graalpython.lib-python.3.test.test_robotparser.GoogleURLOrderingTest.test_bad_urls -*graalpython.lib-python.3.test.test_robotparser.GoogleURLOrderingTest.test_good_urls -*graalpython.lib-python.3.test.test_robotparser.GoogleURLOrderingTest.test_site_maps -*graalpython.lib-python.3.test.test_robotparser.InvalidCrawlDelayTest.test_bad_urls -*graalpython.lib-python.3.test.test_robotparser.InvalidCrawlDelayTest.test_good_urls -*graalpython.lib-python.3.test.test_robotparser.InvalidCrawlDelayTest.test_site_maps -*graalpython.lib-python.3.test.test_robotparser.InvalidRequestRateTest.test_bad_urls -*graalpython.lib-python.3.test.test_robotparser.InvalidRequestRateTest.test_good_urls -*graalpython.lib-python.3.test.test_robotparser.InvalidRequestRateTest.test_site_maps -*graalpython.lib-python.3.test.test_robotparser.NetworkTestCase.test_basic -*graalpython.lib-python.3.test.test_robotparser.NetworkTestCase.test_can_fetch -*graalpython.lib-python.3.test.test_robotparser.NetworkTestCase.test_read_404 -*graalpython.lib-python.3.test.test_robotparser.PasswordProtectedSiteTestCase.testPasswordProtectedSite -*graalpython.lib-python.3.test.test_robotparser.RejectAllRobotsTest.test_bad_urls -*graalpython.lib-python.3.test.test_robotparser.RejectAllRobotsTest.test_good_urls -*graalpython.lib-python.3.test.test_robotparser.RejectAllRobotsTest.test_site_maps -*graalpython.lib-python.3.test.test_robotparser.SitemapTest.test_bad_urls -*graalpython.lib-python.3.test.test_robotparser.SitemapTest.test_good_urls -*graalpython.lib-python.3.test.test_robotparser.SitemapTest.test_site_maps -*graalpython.lib-python.3.test.test_robotparser.StringFormattingTest.test_bad_urls -*graalpython.lib-python.3.test.test_robotparser.StringFormattingTest.test_good_urls -*graalpython.lib-python.3.test.test_robotparser.StringFormattingTest.test_site_maps -*graalpython.lib-python.3.test.test_robotparser.StringFormattingTest.test_string_formatting -*graalpython.lib-python.3.test.test_robotparser.UseFirstUserAgentWildcardTest.test_bad_urls -*graalpython.lib-python.3.test.test_robotparser.UseFirstUserAgentWildcardTest.test_good_urls -*graalpython.lib-python.3.test.test_robotparser.UseFirstUserAgentWildcardTest.test_site_maps -*graalpython.lib-python.3.test.test_robotparser.UserAgentGoogleMobileTest.test_bad_urls -*graalpython.lib-python.3.test.test_robotparser.UserAgentGoogleMobileTest.test_good_urls -*graalpython.lib-python.3.test.test_robotparser.UserAgentGoogleMobileTest.test_site_maps -*graalpython.lib-python.3.test.test_robotparser.UserAgentOrderingTest.test_bad_urls -*graalpython.lib-python.3.test.test_robotparser.UserAgentOrderingTest.test_good_urls -*graalpython.lib-python.3.test.test_robotparser.UserAgentOrderingTest.test_site_maps -*graalpython.lib-python.3.test.test_robotparser.UserAgentWildcardTest.test_bad_urls -*graalpython.lib-python.3.test.test_robotparser.UserAgentWildcardTest.test_good_urls -*graalpython.lib-python.3.test.test_robotparser.UserAgentWildcardTest.test_site_maps +test.test_robotparser.AnotherInvalidRequestRateTest.test_bad_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.AnotherInvalidRequestRateTest.test_good_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.AnotherInvalidRequestRateTest.test_site_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.CrawlDelayAndCustomAgentTest.test_bad_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.CrawlDelayAndCustomAgentTest.test_good_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.CrawlDelayAndCustomAgentTest.test_site_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.CrawlDelayAndRequestRateTest.test_bad_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.CrawlDelayAndRequestRateTest.test_good_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.CrawlDelayAndRequestRateTest.test_request_rate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.CrawlDelayAndRequestRateTest.test_site_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.DefaultEntryTest.test_bad_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.DefaultEntryTest.test_good_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.DefaultEntryTest.test_request_rate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.DefaultEntryTest.test_site_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.DifferentAgentTest.test_bad_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.DifferentAgentTest.test_good_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.DifferentAgentTest.test_request_rate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.DifferentAgentTest.test_site_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.DisallowQueryStringTest.test_bad_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.DisallowQueryStringTest.test_good_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.DisallowQueryStringTest.test_site_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.EmptyFileTest.test_bad_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.EmptyFileTest.test_good_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.EmptyFileTest.test_request_rate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.EmptyFileTest.test_site_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.EmptyQueryStringTest.test_bad_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.EmptyQueryStringTest.test_good_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.EmptyQueryStringTest.test_site_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.GoogleURLOrderingTest.test_bad_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.GoogleURLOrderingTest.test_good_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.GoogleURLOrderingTest.test_site_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.InvalidCrawlDelayTest.test_bad_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.InvalidCrawlDelayTest.test_good_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.InvalidCrawlDelayTest.test_site_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.InvalidRequestRateTest.test_bad_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.InvalidRequestRateTest.test_good_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.InvalidRequestRateTest.test_site_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.NetworkTestCase.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.NetworkTestCase.test_can_fetch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.NetworkTestCase.test_read_404 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.PasswordProtectedSiteTestCase.testPasswordProtectedSite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_robotparser.RejectAllRobotsTest.test_bad_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.RejectAllRobotsTest.test_good_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.RejectAllRobotsTest.test_site_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.SitemapTest.test_bad_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.SitemapTest.test_good_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.SitemapTest.test_site_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.StringFormattingTest.test_bad_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.StringFormattingTest.test_good_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.StringFormattingTest.test_site_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.StringFormattingTest.test_string_formatting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.UseFirstUserAgentWildcardTest.test_bad_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.UseFirstUserAgentWildcardTest.test_good_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.UseFirstUserAgentWildcardTest.test_site_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.UserAgentGoogleMobileTest.test_bad_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.UserAgentGoogleMobileTest.test_good_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.UserAgentGoogleMobileTest.test_site_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.UserAgentOrderingTest.test_bad_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.UserAgentOrderingTest.test_good_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.UserAgentOrderingTest.test_site_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.UserAgentWildcardTest.test_bad_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.UserAgentWildcardTest.test_good_urls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_robotparser.UserAgentWildcardTest.test_site_maps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_runpy.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_runpy.txt index c82adea68b..649b22e6d2 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_runpy.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_runpy.txt @@ -1,31 +1,31 @@ -*graalpython.lib-python.3.test.test_runpy.ExecutionLayerTestCase.test_run_code -*graalpython.lib-python.3.test.test_runpy.ExecutionLayerTestCase.test_run_module_code -*graalpython.lib-python.3.test.test_runpy.RunModuleTestCase.test_explicit_relative_import -*graalpython.lib-python.3.test.test_runpy.RunModuleTestCase.test_invalid_names -*graalpython.lib-python.3.test.test_runpy.RunModuleTestCase.test_library_module -*graalpython.lib-python.3.test.test_runpy.RunModuleTestCase.test_main_relative_import -*graalpython.lib-python.3.test.test_runpy.RunModuleTestCase.test_package_imported_no_warning -*graalpython.lib-python.3.test.test_runpy.RunModuleTestCase.test_pkgutil_walk_packages -*graalpython.lib-python.3.test.test_runpy.RunModuleTestCase.test_run_module -*graalpython.lib-python.3.test.test_runpy.RunModuleTestCase.test_run_module_alter_sys -*graalpython.lib-python.3.test.test_runpy.RunModuleTestCase.test_run_module_in_namespace_package -*graalpython.lib-python.3.test.test_runpy.RunModuleTestCase.test_run_name -*graalpython.lib-python.3.test.test_runpy.RunModuleTestCase.test_run_namespace_package -*graalpython.lib-python.3.test.test_runpy.RunModuleTestCase.test_run_namespace_package_in_namespace_package -*graalpython.lib-python.3.test.test_runpy.RunModuleTestCase.test_run_package -*graalpython.lib-python.3.test.test_runpy.RunModuleTestCase.test_run_package_alter_sys -*graalpython.lib-python.3.test.test_runpy.RunModuleTestCase.test_run_package_in_namespace_package -*graalpython.lib-python.3.test.test_runpy.RunModuleTestCase.test_run_package_init_exceptions -*graalpython.lib-python.3.test.test_runpy.RunModuleTestCase.test_submodule_imported_warning -*graalpython.lib-python.3.test.test_runpy.RunPathTestCase.test_basic_script -*graalpython.lib-python.3.test.test_runpy.RunPathTestCase.test_basic_script_no_suffix -*graalpython.lib-python.3.test.test_runpy.RunPathTestCase.test_basic_script_with_path_object -*graalpython.lib-python.3.test.test_runpy.RunPathTestCase.test_directory -*graalpython.lib-python.3.test.test_runpy.RunPathTestCase.test_directory_compiled -*graalpython.lib-python.3.test.test_runpy.RunPathTestCase.test_directory_error -*graalpython.lib-python.3.test.test_runpy.RunPathTestCase.test_encoding -*graalpython.lib-python.3.test.test_runpy.RunPathTestCase.test_main_recursion_error -*graalpython.lib-python.3.test.test_runpy.RunPathTestCase.test_script_compiled -*graalpython.lib-python.3.test.test_runpy.RunPathTestCase.test_zipfile -*graalpython.lib-python.3.test.test_runpy.RunPathTestCase.test_zipfile_compiled -*graalpython.lib-python.3.test.test_runpy.RunPathTestCase.test_zipfile_error +test.test_runpy.ExecutionLayerTestCase.test_run_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.ExecutionLayerTestCase.test_run_module_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunModuleTestCase.test_explicit_relative_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunModuleTestCase.test_invalid_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunModuleTestCase.test_library_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunModuleTestCase.test_main_relative_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunModuleTestCase.test_package_imported_no_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunModuleTestCase.test_pkgutil_walk_packages @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunModuleTestCase.test_run_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunModuleTestCase.test_run_module_alter_sys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunModuleTestCase.test_run_module_in_namespace_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunModuleTestCase.test_run_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunModuleTestCase.test_run_namespace_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunModuleTestCase.test_run_namespace_package_in_namespace_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunModuleTestCase.test_run_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunModuleTestCase.test_run_package_alter_sys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunModuleTestCase.test_run_package_in_namespace_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunModuleTestCase.test_run_package_init_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunModuleTestCase.test_submodule_imported_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunPathTestCase.test_basic_script @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunPathTestCase.test_basic_script_no_suffix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunPathTestCase.test_basic_script_with_path_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunPathTestCase.test_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunPathTestCase.test_directory_compiled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunPathTestCase.test_directory_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunPathTestCase.test_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunPathTestCase.test_main_recursion_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunPathTestCase.test_script_compiled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunPathTestCase.test_zipfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunPathTestCase.test_zipfile_compiled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_runpy.RunPathTestCase.test_zipfile_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sax.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sax.txt index f168637350..a47fdf0549 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sax.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sax.txt @@ -1,175 +1,175 @@ -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_1463026_1 -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_1463026_1_empty -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_1463026_2 -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_1463026_2_empty -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_1463026_3 -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_1463026_3_empty -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_5027_1 -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_5027_2 -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_no_close_file -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_xmlgen_attr_escape -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_xmlgen_basic -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_xmlgen_basic_empty -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_xmlgen_content -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_xmlgen_content_empty -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_xmlgen_content_escape -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_xmlgen_fragment -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_xmlgen_ignorable -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_xmlgen_ignorable_empty -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_xmlgen_ns -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_xmlgen_ns_empty -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_xmlgen_pi -*graalpython.lib-python.3.test.test_sax.BytesXmlgenTest.test_xmlgen_unencodable -*graalpython.lib-python.3.test.test_sax.CDATAHandlerTest.test_handlers -*graalpython.lib-python.3.test.test_sax.ErrorReportingTest.test_expat_incomplete -*graalpython.lib-python.3.test.test_sax.ErrorReportingTest.test_expat_inpsource_location -*graalpython.lib-python.3.test.test_sax.ErrorReportingTest.test_sax_parse_exception_str -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_attrs_empty -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_attrs_wattr -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_binary_file -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_binary_file_bytes_name -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_binary_file_int_name -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_binary_file_nonascii -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_dtdhandler -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_entityresolver_default -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_entityresolver_enabled -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_external_dtd_default -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_external_dtd_enabled -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_incremental -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_incremental_reset -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_inpsource_byte_stream -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_inpsource_character_stream -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_inpsource_filename -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_inpsource_sysid -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_inpsource_sysid_nonascii -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_locator_noinfo -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_locator_withinfo -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_locator_withinfo_nonascii -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_nsattrs_empty -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_nsattrs_wattr -*graalpython.lib-python.3.test.test_sax.ExpatReaderTest.test_expat_text_file -*graalpython.lib-python.3.test.test_sax.LexicalHandlerTest.test_handlers -*graalpython.lib-python.3.test.test_sax.MakeParserTest.test_make_parser2 -*graalpython.lib-python.3.test.test_sax.MakeParserTest.test_make_parser3 -*graalpython.lib-python.3.test.test_sax.MakeParserTest.test_make_parser4 -*graalpython.lib-python.3.test.test_sax.MakeParserTest.test_make_parser5 -*graalpython.lib-python.3.test.test_sax.ParseTest.test_parseString_text -*graalpython.lib-python.3.test.test_sax.ParseTest.test_parse_close_source -*graalpython.lib-python.3.test.test_sax.ParseTest.test_parse_path_object -*graalpython.lib-python.3.test.test_sax.PrepareInputSourceTest.test_binary_file -*graalpython.lib-python.3.test.test_sax.PrepareInputSourceTest.test_byte_stream -*graalpython.lib-python.3.test.test_sax.PrepareInputSourceTest.test_character_stream -*graalpython.lib-python.3.test.test_sax.PrepareInputSourceTest.test_path_objects -*graalpython.lib-python.3.test.test_sax.PrepareInputSourceTest.test_string -*graalpython.lib-python.3.test.test_sax.PrepareInputSourceTest.test_system_id -*graalpython.lib-python.3.test.test_sax.PrepareInputSourceTest.test_text_file -*graalpython.lib-python.3.test.test_sax.SaxutilsTest.test_double_quoteattr -*graalpython.lib-python.3.test.test_sax.SaxutilsTest.test_escape_all -*graalpython.lib-python.3.test.test_sax.SaxutilsTest.test_escape_basic -*graalpython.lib-python.3.test.test_sax.SaxutilsTest.test_escape_extra -*graalpython.lib-python.3.test.test_sax.SaxutilsTest.test_make_parser -*graalpython.lib-python.3.test.test_sax.SaxutilsTest.test_quoteattr_basic -*graalpython.lib-python.3.test.test_sax.SaxutilsTest.test_single_double_quoteattr -*graalpython.lib-python.3.test.test_sax.SaxutilsTest.test_single_quoteattr -*graalpython.lib-python.3.test.test_sax.SaxutilsTest.test_unescape_all -*graalpython.lib-python.3.test.test_sax.SaxutilsTest.test_unescape_amp_extra -*graalpython.lib-python.3.test.test_sax.SaxutilsTest.test_unescape_basic -*graalpython.lib-python.3.test.test_sax.SaxutilsTest.test_unescape_extra -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_1463026_1 -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_1463026_1_empty -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_1463026_2 -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_1463026_2_empty -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_1463026_3 -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_1463026_3_empty -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_5027_1 -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_5027_2 -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_no_close_file -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_attr_escape -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_basic -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_basic_empty -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_content -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_content_empty -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_content_escape -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_encoding -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_encoding_bytes -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_fragment -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_ignorable -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_ignorable_empty -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_ns -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_ns_empty -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_pi -*graalpython.lib-python.3.test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_unencodable -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_1463026_1 -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_1463026_1_empty -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_1463026_2 -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_1463026_2_empty -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_1463026_3 -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_1463026_3_empty -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_5027_1 -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_5027_2 -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_no_close_file -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_xmlgen_attr_escape -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_xmlgen_basic -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_xmlgen_basic_empty -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_xmlgen_content -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_xmlgen_content_empty -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_xmlgen_content_escape -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_xmlgen_encoding -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_xmlgen_encoding_bytes -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_xmlgen_fragment -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_xmlgen_ignorable -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_xmlgen_ignorable_empty -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_xmlgen_ns -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_xmlgen_ns_empty -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_xmlgen_pi -*graalpython.lib-python.3.test.test_sax.StreamWriterXmlgenTest.test_xmlgen_unencodable -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_1463026_1 -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_1463026_1_empty -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_1463026_2 -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_1463026_2_empty -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_1463026_3 -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_1463026_3_empty -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_5027_1 -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_5027_2 -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_no_close_file -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_xmlgen_attr_escape -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_xmlgen_basic -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_xmlgen_basic_empty -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_xmlgen_content -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_xmlgen_content_empty -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_xmlgen_content_escape -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_xmlgen_encoding -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_xmlgen_encoding_bytes -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_xmlgen_fragment -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_xmlgen_ignorable -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_xmlgen_ignorable_empty -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_xmlgen_ns -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_xmlgen_ns_empty -*graalpython.lib-python.3.test.test_sax.StringXmlgenTest.test_xmlgen_pi -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_1463026_1 -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_1463026_1_empty -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_1463026_2 -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_1463026_2_empty -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_1463026_3 -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_1463026_3_empty -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_5027_1 -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_5027_2 -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_no_close_file -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_xmlgen_attr_escape -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_xmlgen_basic -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_xmlgen_basic_empty -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_xmlgen_content -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_xmlgen_content_empty -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_xmlgen_content_escape -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_xmlgen_fragment -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_xmlgen_ignorable -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_xmlgen_ignorable_empty -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_xmlgen_ns -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_xmlgen_ns_empty -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_xmlgen_pi -*graalpython.lib-python.3.test.test_sax.WriterXmlgenTest.test_xmlgen_unencodable -*graalpython.lib-python.3.test.test_sax.XMLFilterBaseTest.test_filter_basic -*graalpython.lib-python.3.test.test_sax.XmlReaderTest.test_attrs_empty -*graalpython.lib-python.3.test.test_sax.XmlReaderTest.test_attrs_wattr -*graalpython.lib-python.3.test.test_sax.XmlReaderTest.test_nsattrs_empty -*graalpython.lib-python.3.test.test_sax.XmlReaderTest.test_nsattrs_wattr +test.test_sax.BytesXmlgenTest.test_1463026_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_1463026_1_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_1463026_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_1463026_2_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_1463026_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_1463026_3_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_5027_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_5027_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_no_close_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_xmlgen_attr_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_xmlgen_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_xmlgen_basic_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_xmlgen_content @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_xmlgen_content_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_xmlgen_content_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_xmlgen_fragment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_xmlgen_ignorable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_xmlgen_ignorable_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_xmlgen_ns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_xmlgen_ns_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_xmlgen_pi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.BytesXmlgenTest.test_xmlgen_unencodable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.CDATAHandlerTest.test_handlers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ErrorReportingTest.test_expat_incomplete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ErrorReportingTest.test_expat_inpsource_location @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ErrorReportingTest.test_sax_parse_exception_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ExpatReaderTest.test_expat_attrs_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ExpatReaderTest.test_expat_attrs_wattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ExpatReaderTest.test_expat_binary_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_binary_file_bytes_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_binary_file_int_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_binary_file_nonascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_dtdhandler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ExpatReaderTest.test_expat_entityresolver_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ExpatReaderTest.test_expat_entityresolver_enabled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ExpatReaderTest.test_expat_external_dtd_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ExpatReaderTest.test_expat_external_dtd_enabled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ExpatReaderTest.test_expat_incremental @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ExpatReaderTest.test_expat_incremental_reset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ExpatReaderTest.test_expat_inpsource_byte_stream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_inpsource_character_stream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_inpsource_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_inpsource_sysid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_inpsource_sysid_nonascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_locator_noinfo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ExpatReaderTest.test_expat_locator_withinfo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ExpatReaderTest.test_expat_locator_withinfo_nonascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ExpatReaderTest.test_expat_nsattrs_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ExpatReaderTest.test_expat_nsattrs_wattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ExpatReaderTest.test_expat_text_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sax.LexicalHandlerTest.test_handlers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.MakeParserTest.test_make_parser2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.MakeParserTest.test_make_parser3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.MakeParserTest.test_make_parser4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.MakeParserTest.test_make_parser5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ParseTest.test_parseString_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ParseTest.test_parse_close_source @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.ParseTest.test_parse_path_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.PrepareInputSourceTest.test_binary_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.PrepareInputSourceTest.test_byte_stream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.PrepareInputSourceTest.test_character_stream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.PrepareInputSourceTest.test_path_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.PrepareInputSourceTest.test_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.PrepareInputSourceTest.test_system_id @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.PrepareInputSourceTest.test_text_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.SaxutilsTest.test_double_quoteattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.SaxutilsTest.test_escape_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.SaxutilsTest.test_escape_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.SaxutilsTest.test_escape_extra @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.SaxutilsTest.test_make_parser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.SaxutilsTest.test_quoteattr_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.SaxutilsTest.test_single_double_quoteattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.SaxutilsTest.test_single_quoteattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.SaxutilsTest.test_unescape_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.SaxutilsTest.test_unescape_amp_extra @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.SaxutilsTest.test_unescape_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.SaxutilsTest.test_unescape_extra @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_1463026_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_1463026_1_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_1463026_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_1463026_2_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_1463026_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_1463026_3_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_5027_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_5027_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_no_close_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_attr_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_basic_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_content @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_content_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_content_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_encoding_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_fragment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_ignorable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_ignorable_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_ns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_ns_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_pi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_unencodable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_1463026_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_1463026_1_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_1463026_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_1463026_2_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_1463026_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_1463026_3_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_5027_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_5027_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_no_close_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_attr_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_basic_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_content @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_content_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_content_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_encoding_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_fragment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_ignorable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_ignorable_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_ns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_ns_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_pi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_unencodable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_1463026_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_1463026_1_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_1463026_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_1463026_2_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_1463026_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_1463026_3_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_5027_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_5027_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_no_close_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_xmlgen_attr_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_xmlgen_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_xmlgen_basic_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_xmlgen_content @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_xmlgen_content_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_xmlgen_content_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_xmlgen_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_xmlgen_encoding_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_xmlgen_fragment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_xmlgen_ignorable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_xmlgen_ignorable_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_xmlgen_ns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_xmlgen_ns_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.StringXmlgenTest.test_xmlgen_pi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_1463026_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_1463026_1_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_1463026_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_1463026_2_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_1463026_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_1463026_3_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_5027_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_5027_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_no_close_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_xmlgen_attr_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_xmlgen_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_xmlgen_basic_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_xmlgen_content @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_xmlgen_content_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_xmlgen_content_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_xmlgen_fragment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_xmlgen_ignorable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_xmlgen_ignorable_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_xmlgen_ns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_xmlgen_ns_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_xmlgen_pi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.WriterXmlgenTest.test_xmlgen_unencodable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.XMLFilterBaseTest.test_filter_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.XmlReaderTest.test_attrs_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.XmlReaderTest.test_attrs_wattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.XmlReaderTest.test_nsattrs_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sax.XmlReaderTest.test_nsattrs_wattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sched.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sched.txt index 5dc8a7503d..bf82c96729 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sched.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sched.txt @@ -1,11 +1,11 @@ -*graalpython.lib-python.3.test.test_sched.TestCase.test_args_kwargs -*graalpython.lib-python.3.test.test_sched.TestCase.test_cancel -*graalpython.lib-python.3.test.test_sched.TestCase.test_cancel_concurrent -*graalpython.lib-python.3.test.test_sched.TestCase.test_cancel_correct_event -*graalpython.lib-python.3.test.test_sched.TestCase.test_empty -*graalpython.lib-python.3.test.test_sched.TestCase.test_enter -*graalpython.lib-python.3.test.test_sched.TestCase.test_enter_concurrent -*graalpython.lib-python.3.test.test_sched.TestCase.test_enterabs -*graalpython.lib-python.3.test.test_sched.TestCase.test_priority -*graalpython.lib-python.3.test.test_sched.TestCase.test_queue -*graalpython.lib-python.3.test.test_sched.TestCase.test_run_non_blocking +test.test_sched.TestCase.test_args_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sched.TestCase.test_cancel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sched.TestCase.test_cancel_concurrent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sched.TestCase.test_cancel_correct_event @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sched.TestCase.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sched.TestCase.test_enter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sched.TestCase.test_enter_concurrent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sched.TestCase.test_enterabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sched.TestCase.test_priority @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sched.TestCase.test_queue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sched.TestCase.test_run_non_blocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_scope.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_scope.txt index d58aef1755..bf142a7efb 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_scope.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_scope.txt @@ -1,40 +1,36 @@ -*graalpython.lib-python.3.test.test_scope.ScopeTests.testBoundAndFree -*graalpython.lib-python.3.test.test_scope.ScopeTests.testCellIsArgAndEscapes -*graalpython.lib-python.3.test.test_scope.ScopeTests.testCellIsKwonlyArg -*graalpython.lib-python.3.test.test_scope.ScopeTests.testCellIsLocalAndEscapes -*graalpython.lib-python.3.test.test_scope.ScopeTests.testCellLeak -*graalpython.lib-python.3.test.test_scope.ScopeTests.testClassAndGlobal -*graalpython.lib-python.3.test.test_scope.ScopeTests.testClassNamespaceOverridesClosure -*graalpython.lib-python.3.test.test_scope.ScopeTests.testComplexDefinitions -*graalpython.lib-python.3.test.test_scope.ScopeTests.testEvalExecFreeVars -*graalpython.lib-python.3.test.test_scope.ScopeTests.testEvalFreeVars -*graalpython.lib-python.3.test.test_scope.ScopeTests.testExtraNesting -*graalpython.lib-python.3.test.test_scope.ScopeTests.testFreeVarInMethod -*graalpython.lib-python.3.test.test_scope.ScopeTests.testFreeingCell -*graalpython.lib-python.3.test.test_scope.ScopeTests.testGlobalInParallelNestedFunctions -*graalpython.lib-python.3.test.test_scope.ScopeTests.testInteractionWithTraceFunc -*graalpython.lib-python.3.test.test_scope.ScopeTests.testLambdas -*graalpython.lib-python.3.test.test_scope.ScopeTests.testLeaks -*graalpython.lib-python.3.test.test_scope.ScopeTests.testListCompLocalVars -*graalpython.lib-python.3.test.test_scope.ScopeTests.testLocalsClass -*graalpython.lib-python.3.test.test_scope.ScopeTests.testLocalsClass_WithTrace -*graalpython.lib-python.3.test.test_scope.ScopeTests.testLocalsFunction -*graalpython.lib-python.3.test.test_scope.ScopeTests.testMixedFreevarsAndCellvars -*graalpython.lib-python.3.test.test_scope.ScopeTests.testNearestEnclosingScope -*graalpython.lib-python.3.test.test_scope.ScopeTests.testNestedNonLocal -*graalpython.lib-python.3.test.test_scope.ScopeTests.testNestingGlobalNoFree -*graalpython.lib-python.3.test.test_scope.ScopeTests.testNestingPlusFreeRefToGlobal -*graalpython.lib-python.3.test.test_scope.ScopeTests.testNestingThroughClass -*graalpython.lib-python.3.test.test_scope.ScopeTests.testNonLocalClass -*graalpython.lib-python.3.test.test_scope.ScopeTests.testNonLocalFunction -*graalpython.lib-python.3.test.test_scope.ScopeTests.testNonLocalGenerator -*graalpython.lib-python.3.test.test_scope.ScopeTests.testNonLocalMethod -*graalpython.lib-python.3.test.test_scope.ScopeTests.testRecursion -*graalpython.lib-python.3.test.test_scope.ScopeTests.testScopeOfGlobalStmt -*graalpython.lib-python.3.test.test_scope.ScopeTests.testSimpleAndRebinding -*graalpython.lib-python.3.test.test_scope.ScopeTests.testSimpleNesting -*graalpython.lib-python.3.test.test_scope.ScopeTests.testTopIsNotSignificant -*graalpython.lib-python.3.test.test_scope.ScopeTests.testUnboundLocal -*graalpython.lib-python.3.test.test_scope.ScopeTests.testUnboundLocal_AfterDel -*graalpython.lib-python.3.test.test_scope.ScopeTests.testUnboundLocal_AugAssign -*graalpython.lib-python.3.test.test_scope.ScopeTests.testUnoptimizedNamespaces +test.test_scope.ScopeTests.testBoundAndFree @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testCellIsArgAndEscapes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testCellIsKwonlyArg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testCellIsLocalAndEscapes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testClassAndGlobal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testClassNamespaceOverridesClosure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testComplexDefinitions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testEvalExecFreeVars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testEvalFreeVars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testExtraNesting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testFreeVarInMethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testFreeingCell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testGlobalInParallelNestedFunctions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testLambdas @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testListCompLocalVars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testLocalsClass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testLocalsFunction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testMixedFreevarsAndCellvars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testNearestEnclosingScope @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testNestedNonLocal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testNestingGlobalNoFree @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testNestingPlusFreeRefToGlobal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testNestingThroughClass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testNonLocalClass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testNonLocalFunction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testNonLocalGenerator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testNonLocalMethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testRecursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testScopeOfGlobalStmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testSimpleAndRebinding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testSimpleNesting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testTopIsNotSignificant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testUnboundLocal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testUnboundLocal_AfterDel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testUnboundLocal_AugAssign @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_scope.ScopeTests.testUnoptimizedNamespaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_script_helper.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_script_helper.txt index 203ea15efb..3eea7eba11 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_script_helper.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_script_helper.txt @@ -1,10 +1,10 @@ -*graalpython.lib-python.3.test.test_script_helper.TestScriptHelper.test_assert_python_failure -*graalpython.lib-python.3.test.test_script_helper.TestScriptHelper.test_assert_python_failure_raises -*graalpython.lib-python.3.test.test_script_helper.TestScriptHelper.test_assert_python_isolated_when_env_not_required -*graalpython.lib-python.3.test.test_script_helper.TestScriptHelper.test_assert_python_not_isolated_when_env_is_required -*graalpython.lib-python.3.test.test_script_helper.TestScriptHelper.test_assert_python_ok -*graalpython.lib-python.3.test.test_script_helper.TestScriptHelper.test_assert_python_ok_raises -*graalpython.lib-python.3.test.test_script_helper.TestScriptHelperEnvironment.test_interpreter_requires_environment_details -*graalpython.lib-python.3.test.test_script_helper.TestScriptHelperEnvironment.test_interpreter_requires_environment_false -*graalpython.lib-python.3.test.test_script_helper.TestScriptHelperEnvironment.test_interpreter_requires_environment_true -*graalpython.lib-python.3.test.test_script_helper.TestScriptHelperEnvironment.test_interpreter_requires_environment_with_pythonhome +test.test_script_helper.TestScriptHelper.test_assert_python_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_script_helper.TestScriptHelper.test_assert_python_failure_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_script_helper.TestScriptHelper.test_assert_python_isolated_when_env_not_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_script_helper.TestScriptHelper.test_assert_python_not_isolated_when_env_is_required @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_script_helper.TestScriptHelper.test_assert_python_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_script_helper.TestScriptHelper.test_assert_python_ok_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_script_helper.TestScriptHelperEnvironment.test_interpreter_requires_environment_details @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_script_helper.TestScriptHelperEnvironment.test_interpreter_requires_environment_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_script_helper.TestScriptHelperEnvironment.test_interpreter_requires_environment_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_script_helper.TestScriptHelperEnvironment.test_interpreter_requires_environment_with_pythonhome @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_secrets.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_secrets.txt index dde12f7985..9296347167 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_secrets.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_secrets.txt @@ -1,11 +1,11 @@ -*graalpython.lib-python.3.test.test_secrets.Compare_Digest_Tests.test_bad_types -*graalpython.lib-python.3.test.test_secrets.Compare_Digest_Tests.test_bool -*graalpython.lib-python.3.test.test_secrets.Compare_Digest_Tests.test_equal -*graalpython.lib-python.3.test.test_secrets.Compare_Digest_Tests.test_unequal -*graalpython.lib-python.3.test.test_secrets.Random_Tests.test_choice -*graalpython.lib-python.3.test.test_secrets.Random_Tests.test_randbelow -*graalpython.lib-python.3.test.test_secrets.Random_Tests.test_randbits -*graalpython.lib-python.3.test.test_secrets.Token_Tests.test_token_bytes -*graalpython.lib-python.3.test.test_secrets.Token_Tests.test_token_defaults -*graalpython.lib-python.3.test.test_secrets.Token_Tests.test_token_hex -*graalpython.lib-python.3.test.test_secrets.Token_Tests.test_token_urlsafe +test.test_secrets.Compare_Digest_Tests.test_bad_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_secrets.Compare_Digest_Tests.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_secrets.Compare_Digest_Tests.test_equal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_secrets.Compare_Digest_Tests.test_unequal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_secrets.Random_Tests.test_choice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_secrets.Random_Tests.test_randbelow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_secrets.Random_Tests.test_randbits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_secrets.Token_Tests.test_token_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_secrets.Token_Tests.test_token_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_secrets.Token_Tests.test_token_hex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_secrets.Token_Tests.test_token_urlsafe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_select.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_select.txt index ae22f88bb3..0d4cd7d16d 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_select.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_select.txt @@ -1,5 +1,4 @@ -*graalpython.lib-python.3.test.test_select.SelectTestCase.test_errno -*graalpython.lib-python.3.test.test_select.SelectTestCase.test_error_conditions -*graalpython.lib-python.3.test.test_select.SelectTestCase.test_returned_list_identity -*graalpython.lib-python.3.test.test_select.SelectTestCase.test_select -*graalpython.lib-python.3.test.test_select.SelectTestCase.test_select_mutated +test.test_select.SelectTestCase.test_errno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_select.SelectTestCase.test_error_conditions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_select.SelectTestCase.test_returned_list_identity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_select.SelectTestCase.test_select_mutated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_selectors.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_selectors.txt index 228043b35a..dbc27d34b3 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_selectors.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_selectors.txt @@ -1,119 +1,34 @@ -*graalpython.lib-python.3.test.test_selectors.DefaultSelectorTestCase.test_close -*graalpython.lib-python.3.test.test_selectors.DefaultSelectorTestCase.test_context_manager -*graalpython.lib-python.3.test.test_selectors.DefaultSelectorTestCase.test_empty_select -*graalpython.lib-python.3.test.test_selectors.DefaultSelectorTestCase.test_fileno -*graalpython.lib-python.3.test.test_selectors.DefaultSelectorTestCase.test_get_key -*graalpython.lib-python.3.test.test_selectors.DefaultSelectorTestCase.test_get_map -*graalpython.lib-python.3.test.test_selectors.DefaultSelectorTestCase.test_modify -*graalpython.lib-python.3.test.test_selectors.DefaultSelectorTestCase.test_modify_unregister -*graalpython.lib-python.3.test.test_selectors.DefaultSelectorTestCase.test_register -*graalpython.lib-python.3.test.test_selectors.DefaultSelectorTestCase.test_select -*graalpython.lib-python.3.test.test_selectors.DefaultSelectorTestCase.test_select_interrupt_noraise -*graalpython.lib-python.3.test.test_selectors.DefaultSelectorTestCase.test_select_read_write -*graalpython.lib-python.3.test.test_selectors.DefaultSelectorTestCase.test_selector -*graalpython.lib-python.3.test.test_selectors.DefaultSelectorTestCase.test_timeout -*graalpython.lib-python.3.test.test_selectors.DefaultSelectorTestCase.test_unregister -*graalpython.lib-python.3.test.test_selectors.DefaultSelectorTestCase.test_unregister_after_fd_close -*graalpython.lib-python.3.test.test_selectors.DefaultSelectorTestCase.test_unregister_after_fd_close_and_reuse -*graalpython.lib-python.3.test.test_selectors.DefaultSelectorTestCase.test_unregister_after_socket_close -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_above_fd_setsize -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_close -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_context_manager -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_empty_select -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_fileno -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_get_key -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_get_map -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_modify -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_modify_unregister -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_register -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_select -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_select_interrupt_exc -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_select_interrupt_noraise -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_select_read_write -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_selector -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_timeout -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_unregister -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_unregister_after_fd_close -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_unregister_after_fd_close_and_reuse -*graalpython.lib-python.3.test.test_selectors.DevpollSelectorTestCase.test_unregister_after_socket_close -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_above_fd_setsize -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_close -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_context_manager -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_empty_select -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_fileno -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_get_key -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_get_map -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_modify -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_modify_unregister -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_register -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_register_file -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_select -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_select_interrupt_exc -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_select_interrupt_noraise -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_select_read_write -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_selector -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_timeout -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_unregister -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_unregister_after_fd_close -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_unregister_after_fd_close_and_reuse -*graalpython.lib-python.3.test.test_selectors.EpollSelectorTestCase.test_unregister_after_socket_close -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_above_fd_setsize -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_close -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_context_manager -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_empty_select -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_empty_select_timeout -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_fileno -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_get_key -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_get_map -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_modify -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_modify_unregister -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_register -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_register_bad_fd -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_select -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_select_interrupt_exc -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_select_interrupt_noraise -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_select_read_write -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_selector -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_timeout -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_unregister -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_unregister_after_fd_close -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_unregister_after_fd_close_and_reuse -*graalpython.lib-python.3.test.test_selectors.KqueueSelectorTestCase.test_unregister_after_socket_close -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_above_fd_setsize -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_close -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_context_manager -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_empty_select -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_fileno -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_get_key -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_get_map -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_modify -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_modify_unregister -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_register -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_select -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_select_interrupt_exc -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_select_interrupt_noraise -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_select_read_write -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_selector -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_timeout -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_unregister -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_unregister_after_fd_close -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_unregister_after_fd_close_and_reuse -*graalpython.lib-python.3.test.test_selectors.PollSelectorTestCase.test_unregister_after_socket_close -*graalpython.lib-python.3.test.test_selectors.SelectSelectorTestCase.test_close -*graalpython.lib-python.3.test.test_selectors.SelectSelectorTestCase.test_context_manager -*graalpython.lib-python.3.test.test_selectors.SelectSelectorTestCase.test_empty_select -*graalpython.lib-python.3.test.test_selectors.SelectSelectorTestCase.test_fileno -*graalpython.lib-python.3.test.test_selectors.SelectSelectorTestCase.test_get_key -*graalpython.lib-python.3.test.test_selectors.SelectSelectorTestCase.test_get_map -*graalpython.lib-python.3.test.test_selectors.SelectSelectorTestCase.test_modify -*graalpython.lib-python.3.test.test_selectors.SelectSelectorTestCase.test_modify_unregister -*graalpython.lib-python.3.test.test_selectors.SelectSelectorTestCase.test_register -*graalpython.lib-python.3.test.test_selectors.SelectSelectorTestCase.test_select -*graalpython.lib-python.3.test.test_selectors.SelectSelectorTestCase.test_select_interrupt_noraise -*graalpython.lib-python.3.test.test_selectors.SelectSelectorTestCase.test_select_read_write -*graalpython.lib-python.3.test.test_selectors.SelectSelectorTestCase.test_selector -*graalpython.lib-python.3.test.test_selectors.SelectSelectorTestCase.test_timeout -*graalpython.lib-python.3.test.test_selectors.SelectSelectorTestCase.test_unregister -*graalpython.lib-python.3.test.test_selectors.SelectSelectorTestCase.test_unregister_after_fd_close -*graalpython.lib-python.3.test.test_selectors.SelectSelectorTestCase.test_unregister_after_fd_close_and_reuse -*graalpython.lib-python.3.test.test_selectors.SelectSelectorTestCase.test_unregister_after_socket_close +test.test_selectors.DefaultSelectorTestCase.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.DefaultSelectorTestCase.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.DefaultSelectorTestCase.test_empty_select @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_fileno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.DefaultSelectorTestCase.test_get_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.DefaultSelectorTestCase.test_get_map @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.DefaultSelectorTestCase.test_modify @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.DefaultSelectorTestCase.test_register @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.DefaultSelectorTestCase.test_select @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.DefaultSelectorTestCase.test_select_interrupt_noraise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_select_read_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_selector @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.DefaultSelectorTestCase.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.DefaultSelectorTestCase.test_unregister @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.DefaultSelectorTestCase.test_unregister_after_fd_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.DefaultSelectorTestCase.test_unregister_after_fd_close_and_reuse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_unregister_after_socket_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.SelectSelectorTestCase.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.SelectSelectorTestCase.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.SelectSelectorTestCase.test_empty_select @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_fileno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.SelectSelectorTestCase.test_get_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.SelectSelectorTestCase.test_get_map @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.SelectSelectorTestCase.test_modify @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.SelectSelectorTestCase.test_register @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.SelectSelectorTestCase.test_select @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.SelectSelectorTestCase.test_select_interrupt_noraise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_select_read_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_selector @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.SelectSelectorTestCase.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.SelectSelectorTestCase.test_unregister @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.SelectSelectorTestCase.test_unregister_after_fd_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_selectors.SelectSelectorTestCase.test_unregister_after_fd_close_and_reuse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_unregister_after_socket_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_set.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_set.txt index 50da170c80..34a768e4d4 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_set.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_set.txt @@ -1,563 +1,614 @@ -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_copy -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_empty_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_empty_difference_rev -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_empty_intersection -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_empty_isdisjoint -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_empty_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_empty_union -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_equivalent_equality -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_intersection_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_isdisjoint_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_issue_37219 -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_iteration -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_length -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_pickling -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_print -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_repr -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_self_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_self_equality -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_self_intersection -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_self_isdisjoint -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_self_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_self_union -*graalpython.lib-python.3.test.test_set.TestBasicOpsBytes.test_union_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_copy -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_empty_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_empty_difference_rev -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_empty_intersection -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_empty_isdisjoint -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_empty_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_empty_union -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_equivalent_equality -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_intersection_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_isdisjoint_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_issue_37219 -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_iteration -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_length -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_pickling -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_print -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_repr -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_self_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_self_equality -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_self_intersection -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_self_isdisjoint -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_self_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_self_union -*graalpython.lib-python.3.test.test_set.TestBasicOpsEmpty.test_union_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_copy -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_empty_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_empty_difference_rev -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_empty_intersection -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_empty_isdisjoint -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_empty_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_empty_union -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_equivalent_equality -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_intersection_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_isdisjoint_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_issue_37219 -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_iteration -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_length -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_pickling -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_print -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_repr -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_self_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_self_equality -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_self_intersection -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_self_isdisjoint -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_self_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_self_union -*graalpython.lib-python.3.test.test_set.TestBasicOpsMixedStringBytes.test_union_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_copy -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_empty_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_empty_difference_rev -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_empty_intersection -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_empty_isdisjoint -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_empty_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_empty_union -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_equivalent_equality -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_in -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_intersection_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_isdisjoint_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_issue_37219 -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_iteration -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_length -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_not_in -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_pickling -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_print -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_repr -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_self_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_self_equality -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_self_intersection -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_self_isdisjoint -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_self_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_self_union -*graalpython.lib-python.3.test.test_set.TestBasicOpsSingleton.test_union_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_copy -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_empty_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_empty_difference_rev -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_empty_intersection -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_empty_isdisjoint -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_empty_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_empty_union -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_equivalent_equality -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_intersection_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_isdisjoint_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_issue_37219 -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_iteration -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_length -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_pickling -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_print -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_repr -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_self_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_self_equality -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_self_intersection -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_self_isdisjoint -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_self_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_self_union -*graalpython.lib-python.3.test.test_set.TestBasicOpsString.test_union_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_copy -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_empty_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_empty_difference_rev -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_empty_intersection -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_empty_isdisjoint -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_empty_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_empty_union -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_equivalent_equality -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_intersection_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_isdisjoint_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_issue_37219 -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_iteration -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_length -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_pickling -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_print -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_repr -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_self_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_self_equality -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_self_intersection -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_self_isdisjoint -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_self_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_self_union -*graalpython.lib-python.3.test.test_set.TestBasicOpsTriple.test_union_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_copy -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_empty_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_empty_difference_rev -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_empty_intersection -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_empty_isdisjoint -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_empty_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_empty_union -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_equivalent_equality -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_in -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_intersection_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_isdisjoint_empty -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_issue_37219 -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_iteration -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_length -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_not_in -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_pickling -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_print -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_repr -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_self_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_self_equality -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_self_intersection -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_self_isdisjoint -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_self_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_self_union -*graalpython.lib-python.3.test.test_set.TestBasicOpsTuple.test_union_empty -*graalpython.lib-python.3.test.test_set.TestBinaryOps.test_eq -*graalpython.lib-python.3.test.test_set.TestBinaryOps.test_intersection_non_overlap -*graalpython.lib-python.3.test.test_set.TestBinaryOps.test_intersection_overlap -*graalpython.lib-python.3.test.test_set.TestBinaryOps.test_intersection_subset -*graalpython.lib-python.3.test.test_set.TestBinaryOps.test_intersection_superset -*graalpython.lib-python.3.test.test_set.TestBinaryOps.test_isdisjoint_non_overlap -*graalpython.lib-python.3.test.test_set.TestBinaryOps.test_isdisjoint_overlap -*graalpython.lib-python.3.test.test_set.TestBinaryOps.test_isdisjoint_subset -*graalpython.lib-python.3.test.test_set.TestBinaryOps.test_isdisjoint_superset -*graalpython.lib-python.3.test.test_set.TestBinaryOps.test_sym_difference_non_overlap -*graalpython.lib-python.3.test.test_set.TestBinaryOps.test_sym_difference_overlap -*graalpython.lib-python.3.test.test_set.TestBinaryOps.test_sym_difference_subset -*graalpython.lib-python.3.test.test_set.TestBinaryOps.test_sym_difference_superset -*graalpython.lib-python.3.test.test_set.TestBinaryOps.test_union_non_overlap -*graalpython.lib-python.3.test.test_set.TestBinaryOps.test_union_overlap -*graalpython.lib-python.3.test.test_set.TestBinaryOps.test_union_subset -*graalpython.lib-python.3.test.test_set.TestBinaryOps.test_union_superset -*graalpython.lib-python.3.test.test_set.TestBinaryOpsMutating_Set_Set.test_iteration_with_mutation -*graalpython.lib-python.3.test.test_set.TestBinaryOpsMutating_Set_Set.test_or_with_mutation -*graalpython.lib-python.3.test.test_set.TestCopyingEmpty.test_copy -*graalpython.lib-python.3.test.test_set.TestCopyingEmpty.test_deep_copy -*graalpython.lib-python.3.test.test_set.TestCopyingNested.test_copy -*graalpython.lib-python.3.test.test_set.TestCopyingNested.test_deep_copy -*graalpython.lib-python.3.test.test_set.TestCopyingSingleton.test_copy -*graalpython.lib-python.3.test.test_set.TestCopyingSingleton.test_deep_copy -*graalpython.lib-python.3.test.test_set.TestCopyingTriple.test_copy -*graalpython.lib-python.3.test.test_set.TestCopyingTriple.test_deep_copy -*graalpython.lib-python.3.test.test_set.TestCopyingTuple.test_copy -*graalpython.lib-python.3.test.test_set.TestCopyingTuple.test_deep_copy -*graalpython.lib-python.3.test.test_set.TestExceptionPropagation.test_changingSizeWhileIterating -*graalpython.lib-python.3.test.test_set.TestExceptionPropagation.test_instanceWithException -*graalpython.lib-python.3.test.test_set.TestExceptionPropagation.test_instancesWithoutException -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_and -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_badcmp -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_constructor_identity -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_container_iterator -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_contains -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_copy -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_cyclical_print -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_cyclical_repr -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_deepcopy -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_difference -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_do_not_rehash_dict_keys -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_equality -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_free_after_iterating -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_frozen_as_dictkey -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_gc -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_hash -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_hash_caching -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_hash_effectiveness -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_init -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_intersection -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_isdisjoint -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_iterator_pickling -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_len -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_new_or_init -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_or -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_pickling -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_setOfFrozensets -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_singleton_empty_frozenset -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_sub -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_sub_and_super -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_subclass_with_custom_hash -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_union -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_uniquification -*graalpython.lib-python.3.test.test_set.TestFrozenSet.test_xor -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_and -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_badcmp -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_constructor_identity -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_container_iterator -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_contains -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_copy -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_cyclical_print -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_cyclical_repr -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_deepcopy -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_difference -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_do_not_rehash_dict_keys -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_equality -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_free_after_iterating -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_frozen_as_dictkey -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_gc -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_hash -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_hash_caching -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_hash_effectiveness -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_init -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_intersection -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_isdisjoint -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_iterator_pickling -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_len -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_nested_empty_constructor -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_new_or_init -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_or -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_pickling -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_setOfFrozensets -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_singleton_empty_frozenset -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_sub -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_sub_and_super -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_subclass_with_custom_hash -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_union -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_uniquification -*graalpython.lib-python.3.test.test_set.TestFrozenSetSubclass.test_xor -*graalpython.lib-python.3.test.test_set.TestGraphs.test_cube -*graalpython.lib-python.3.test.test_set.TestGraphs.test_cuboctahedron -*graalpython.lib-python.3.test.test_set.TestIdentities.test_binopsVsSubsets -*graalpython.lib-python.3.test.test_set.TestIdentities.test_commutativity -*graalpython.lib-python.3.test.test_set.TestIdentities.test_exclusion -*graalpython.lib-python.3.test.test_set.TestIdentities.test_summations -*graalpython.lib-python.3.test.test_set.TestMutate.test_add_absent -*graalpython.lib-python.3.test.test_set.TestMutate.test_add_present -*graalpython.lib-python.3.test.test_set.TestMutate.test_add_until_full -*graalpython.lib-python.3.test.test_set.TestMutate.test_clear -*graalpython.lib-python.3.test.test_set.TestMutate.test_discard_absent -*graalpython.lib-python.3.test.test_set.TestMutate.test_discard_present -*graalpython.lib-python.3.test.test_set.TestMutate.test_pop -*graalpython.lib-python.3.test.test_set.TestMutate.test_remove_absent -*graalpython.lib-python.3.test.test_set.TestMutate.test_remove_present -*graalpython.lib-python.3.test.test_set.TestMutate.test_remove_until_empty -*graalpython.lib-python.3.test.test_set.TestMutate.test_update_empty_tuple -*graalpython.lib-python.3.test.test_set.TestMutate.test_update_unit_tuple_non_overlap -*graalpython.lib-python.3.test.test_set.TestMutate.test_update_unit_tuple_overlap -*graalpython.lib-python.3.test.test_set.TestOnlySetsDict.test_difference -*graalpython.lib-python.3.test.test_set.TestOnlySetsDict.test_difference_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsDict.test_difference_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsDict.test_eq_ne -*graalpython.lib-python.3.test.test_set.TestOnlySetsDict.test_ge_gt_le_lt -*graalpython.lib-python.3.test.test_set.TestOnlySetsDict.test_intersection -*graalpython.lib-python.3.test.test_set.TestOnlySetsDict.test_intersection_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsDict.test_intersection_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsDict.test_sym_difference -*graalpython.lib-python.3.test.test_set.TestOnlySetsDict.test_sym_difference_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsDict.test_sym_difference_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsDict.test_union -*graalpython.lib-python.3.test.test_set.TestOnlySetsDict.test_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsDict.test_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsGenerator.test_difference -*graalpython.lib-python.3.test.test_set.TestOnlySetsGenerator.test_difference_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsGenerator.test_difference_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsGenerator.test_eq_ne -*graalpython.lib-python.3.test.test_set.TestOnlySetsGenerator.test_ge_gt_le_lt -*graalpython.lib-python.3.test.test_set.TestOnlySetsGenerator.test_intersection -*graalpython.lib-python.3.test.test_set.TestOnlySetsGenerator.test_intersection_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsGenerator.test_intersection_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsGenerator.test_sym_difference -*graalpython.lib-python.3.test.test_set.TestOnlySetsGenerator.test_sym_difference_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsGenerator.test_sym_difference_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsGenerator.test_union -*graalpython.lib-python.3.test.test_set.TestOnlySetsGenerator.test_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsGenerator.test_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsNumeric.test_difference -*graalpython.lib-python.3.test.test_set.TestOnlySetsNumeric.test_difference_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsNumeric.test_difference_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsNumeric.test_eq_ne -*graalpython.lib-python.3.test.test_set.TestOnlySetsNumeric.test_ge_gt_le_lt -*graalpython.lib-python.3.test.test_set.TestOnlySetsNumeric.test_intersection -*graalpython.lib-python.3.test.test_set.TestOnlySetsNumeric.test_intersection_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsNumeric.test_intersection_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsNumeric.test_sym_difference -*graalpython.lib-python.3.test.test_set.TestOnlySetsNumeric.test_sym_difference_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsNumeric.test_sym_difference_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsNumeric.test_union -*graalpython.lib-python.3.test.test_set.TestOnlySetsNumeric.test_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsNumeric.test_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsOperator.test_difference -*graalpython.lib-python.3.test.test_set.TestOnlySetsOperator.test_difference_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsOperator.test_difference_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsOperator.test_eq_ne -*graalpython.lib-python.3.test.test_set.TestOnlySetsOperator.test_ge_gt_le_lt -*graalpython.lib-python.3.test.test_set.TestOnlySetsOperator.test_intersection -*graalpython.lib-python.3.test.test_set.TestOnlySetsOperator.test_intersection_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsOperator.test_intersection_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsOperator.test_sym_difference -*graalpython.lib-python.3.test.test_set.TestOnlySetsOperator.test_sym_difference_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsOperator.test_sym_difference_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsOperator.test_union -*graalpython.lib-python.3.test.test_set.TestOnlySetsOperator.test_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsOperator.test_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsString.test_difference -*graalpython.lib-python.3.test.test_set.TestOnlySetsString.test_difference_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsString.test_difference_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsString.test_eq_ne -*graalpython.lib-python.3.test.test_set.TestOnlySetsString.test_ge_gt_le_lt -*graalpython.lib-python.3.test.test_set.TestOnlySetsString.test_intersection -*graalpython.lib-python.3.test.test_set.TestOnlySetsString.test_intersection_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsString.test_intersection_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsString.test_sym_difference -*graalpython.lib-python.3.test.test_set.TestOnlySetsString.test_sym_difference_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsString.test_sym_difference_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsString.test_union -*graalpython.lib-python.3.test.test_set.TestOnlySetsString.test_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsString.test_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsTuple.test_difference -*graalpython.lib-python.3.test.test_set.TestOnlySetsTuple.test_difference_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsTuple.test_difference_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsTuple.test_eq_ne -*graalpython.lib-python.3.test.test_set.TestOnlySetsTuple.test_ge_gt_le_lt -*graalpython.lib-python.3.test.test_set.TestOnlySetsTuple.test_intersection -*graalpython.lib-python.3.test.test_set.TestOnlySetsTuple.test_intersection_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsTuple.test_intersection_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsTuple.test_sym_difference -*graalpython.lib-python.3.test.test_set.TestOnlySetsTuple.test_sym_difference_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsTuple.test_sym_difference_update_operator -*graalpython.lib-python.3.test.test_set.TestOnlySetsTuple.test_union -*graalpython.lib-python.3.test.test_set.TestOnlySetsTuple.test_update -*graalpython.lib-python.3.test.test_set.TestOnlySetsTuple.test_update_operator -*graalpython.lib-python.3.test.test_set.TestSet.test_add -*graalpython.lib-python.3.test.test_set.TestSet.test_and -*graalpython.lib-python.3.test.test_set.TestSet.test_badcmp -*graalpython.lib-python.3.test.test_set.TestSet.test_c_api -*graalpython.lib-python.3.test.test_set.TestSet.test_clear -*graalpython.lib-python.3.test.test_set.TestSet.test_constructor_identity -*graalpython.lib-python.3.test.test_set.TestSet.test_container_iterator -*graalpython.lib-python.3.test.test_set.TestSet.test_contains -*graalpython.lib-python.3.test.test_set.TestSet.test_copy -*graalpython.lib-python.3.test.test_set.TestSet.test_cyclical_print -*graalpython.lib-python.3.test.test_set.TestSet.test_cyclical_repr -*graalpython.lib-python.3.test.test_set.TestSet.test_deepcopy -*graalpython.lib-python.3.test.test_set.TestSet.test_difference -*graalpython.lib-python.3.test.test_set.TestSet.test_difference_update -*graalpython.lib-python.3.test.test_set.TestSet.test_discard -*graalpython.lib-python.3.test.test_set.TestSet.test_do_not_rehash_dict_keys -*graalpython.lib-python.3.test.test_set.TestSet.test_equality -*graalpython.lib-python.3.test.test_set.TestSet.test_free_after_iterating -*graalpython.lib-python.3.test.test_set.TestSet.test_gc -*graalpython.lib-python.3.test.test_set.TestSet.test_hash -*graalpython.lib-python.3.test.test_set.TestSet.test_iand -*graalpython.lib-python.3.test.test_set.TestSet.test_init -*graalpython.lib-python.3.test.test_set.TestSet.test_inplace_on_self -*graalpython.lib-python.3.test.test_set.TestSet.test_intersection -*graalpython.lib-python.3.test.test_set.TestSet.test_intersection_update -*graalpython.lib-python.3.test.test_set.TestSet.test_ior -*graalpython.lib-python.3.test.test_set.TestSet.test_isdisjoint -*graalpython.lib-python.3.test.test_set.TestSet.test_isub -*graalpython.lib-python.3.test.test_set.TestSet.test_iterator_pickling -*graalpython.lib-python.3.test.test_set.TestSet.test_ixor -*graalpython.lib-python.3.test.test_set.TestSet.test_len -*graalpython.lib-python.3.test.test_set.TestSet.test_new_or_init -*graalpython.lib-python.3.test.test_set.TestSet.test_or -*graalpython.lib-python.3.test.test_set.TestSet.test_pickling -*graalpython.lib-python.3.test.test_set.TestSet.test_pop -*graalpython.lib-python.3.test.test_set.TestSet.test_remove -*graalpython.lib-python.3.test.test_set.TestSet.test_remove_keyerror_set -*graalpython.lib-python.3.test.test_set.TestSet.test_remove_keyerror_unpacking -*graalpython.lib-python.3.test.test_set.TestSet.test_rich_compare -*graalpython.lib-python.3.test.test_set.TestSet.test_setOfFrozensets -*graalpython.lib-python.3.test.test_set.TestSet.test_set_literal -*graalpython.lib-python.3.test.test_set.TestSet.test_set_literal_evaluation_order -*graalpython.lib-python.3.test.test_set.TestSet.test_set_literal_insertion_order -*graalpython.lib-python.3.test.test_set.TestSet.test_sub -*graalpython.lib-python.3.test.test_set.TestSet.test_sub_and_super -*graalpython.lib-python.3.test.test_set.TestSet.test_subclass_with_custom_hash -*graalpython.lib-python.3.test.test_set.TestSet.test_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestSet.test_symmetric_difference_update -*graalpython.lib-python.3.test.test_set.TestSet.test_union -*graalpython.lib-python.3.test.test_set.TestSet.test_uniquification -*graalpython.lib-python.3.test.test_set.TestSet.test_update -*graalpython.lib-python.3.test.test_set.TestSet.test_weakref -*graalpython.lib-python.3.test.test_set.TestSet.test_xor -*graalpython.lib-python.3.test.test_set.TestSetOfSets.test_constructor -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_add -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_and -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_badcmp -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_c_api -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_clear -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_constructor_identity -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_container_iterator -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_contains -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_copy -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_cyclical_print -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_cyclical_repr -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_deepcopy -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_difference -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_difference_update -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_discard -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_do_not_rehash_dict_keys -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_equality -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_free_after_iterating -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_gc -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_hash -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_iand -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_init -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_inplace_on_self -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_intersection -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_intersection_update -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_ior -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_isdisjoint -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_isub -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_iterator_pickling -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_ixor -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_len -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_new_or_init -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_or -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_pickling -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_pop -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_remove -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_remove_keyerror_set -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_remove_keyerror_unpacking -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_rich_compare -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_setOfFrozensets -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_set_literal -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_set_literal_evaluation_order -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_set_literal_insertion_order -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_sub -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_sub_and_super -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_subclass_with_custom_hash -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_symmetric_difference_update -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_union -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_uniquification -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_update -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_weakref -*graalpython.lib-python.3.test.test_set.TestSetSubclass.test_xor -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_add -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_and -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_badcmp -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_c_api -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_clear -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_constructor_identity -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_container_iterator -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_contains -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_copy -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_cyclical_print -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_cyclical_repr -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_deepcopy -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_difference -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_difference_update -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_discard -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_do_not_rehash_dict_keys -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_equality -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_free_after_iterating -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_gc -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_hash -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_iand -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_init -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_inplace_on_self -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_intersection -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_intersection_update -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_ior -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_isdisjoint -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_isub -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_iterator_pickling -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_ixor -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_keywords_in_subclass -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_len -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_new_or_init -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_or -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_pickling -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_pop -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_remove -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_remove_keyerror_set -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_remove_keyerror_unpacking -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_rich_compare -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_setOfFrozensets -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_set_literal -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_set_literal_evaluation_order -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_set_literal_insertion_order -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_sub -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_sub_and_super -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_subclass_with_custom_hash -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_symmetric_difference -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_symmetric_difference_update -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_union -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_uniquification -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_update -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_weakref -*graalpython.lib-python.3.test.test_set.TestSetSubclassWithKeywordArgs.test_xor -*graalpython.lib-python.3.test.test_set.TestSubsetEmptyNonEmpty.test_issubset -*graalpython.lib-python.3.test.test_set.TestSubsetEqualEmpty.test_issubset -*graalpython.lib-python.3.test.test_set.TestSubsetEqualNonEmpty.test_issubset -*graalpython.lib-python.3.test.test_set.TestSubsetNonOverlap.test_issubset -*graalpython.lib-python.3.test.test_set.TestSubsetPartial.test_issubset -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_difference_method_call -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_difference_non_overlap -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_difference_overlap -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_difference_subset -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_difference_superset -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_intersection_method_call -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_intersection_non_overlap -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_intersection_overlap -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_intersection_subset -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_intersection_superset -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_sym_difference_method_call -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_sym_difference_non_overlap -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_sym_difference_overlap -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_sym_difference_subset -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_sym_difference_superset -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_union_method_call -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_union_non_overlap -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_union_overlap -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_union_subset -*graalpython.lib-python.3.test.test_set.TestUpdateOps.test_union_superset -*graalpython.lib-python.3.test.test_set.TestVariousIteratorArgs.test_constructor -*graalpython.lib-python.3.test.test_set.TestVariousIteratorArgs.test_inline_methods -*graalpython.lib-python.3.test.test_set.TestVariousIteratorArgs.test_inplace_methods -*graalpython.lib-python.3.test.test_set.TestWeirdBugs.test_8420_set_merge -*graalpython.lib-python.3.test.test_set.TestWeirdBugs.test_iter_and_mutate -*graalpython.lib-python.3.test.test_set.TestWeirdBugs.test_merge_and_mutate +test.test_set.TestBasicOpsBytes.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_empty_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_empty_difference_rev @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_empty_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_empty_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_empty_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_empty_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_equivalent_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_intersection_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_isdisjoint_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_issue_37219 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_self_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_self_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_self_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_self_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_self_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_self_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsBytes.test_union_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_empty_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_empty_difference_rev @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_empty_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_empty_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_empty_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_empty_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_equivalent_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_intersection_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_isdisjoint_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_issue_37219 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_self_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_self_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_self_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_self_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_self_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_self_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsEmpty.test_union_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_empty_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_empty_difference_rev @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_empty_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_empty_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_empty_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_empty_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_equivalent_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_intersection_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_isdisjoint_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_issue_37219 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_self_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_self_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_self_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_self_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_self_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_self_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsMixedStringBytes.test_union_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_empty_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_empty_difference_rev @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_empty_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_empty_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_empty_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_empty_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_equivalent_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_in @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_intersection_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_isdisjoint_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_issue_37219 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_not_in @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_self_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_self_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_self_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_self_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_self_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_self_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsSingleton.test_union_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_empty_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_empty_difference_rev @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_empty_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_empty_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_empty_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_empty_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_equivalent_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_intersection_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_isdisjoint_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_issue_37219 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_self_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_self_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_self_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_self_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_self_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_self_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsString.test_union_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_empty_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_empty_difference_rev @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_empty_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_empty_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_empty_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_empty_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_equivalent_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_intersection_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_isdisjoint_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_issue_37219 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_self_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_self_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_self_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_self_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_self_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_self_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTriple.test_union_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_empty_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_empty_difference_rev @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_empty_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_empty_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_empty_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_empty_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_equivalent_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_in @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_intersection_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_isdisjoint_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_issue_37219 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_not_in @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_self_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_self_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_self_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_self_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_self_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_self_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBasicOpsTuple.test_union_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBinaryOps.test_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBinaryOps.test_intersection_non_overlap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBinaryOps.test_intersection_overlap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBinaryOps.test_intersection_subset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBinaryOps.test_intersection_superset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBinaryOps.test_isdisjoint_non_overlap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBinaryOps.test_isdisjoint_overlap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBinaryOps.test_isdisjoint_subset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBinaryOps.test_isdisjoint_superset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBinaryOps.test_sym_difference_non_overlap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBinaryOps.test_sym_difference_overlap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBinaryOps.test_sym_difference_subset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBinaryOps.test_sym_difference_superset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBinaryOps.test_union_non_overlap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBinaryOps.test_union_overlap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBinaryOps.test_union_subset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestBinaryOps.test_union_superset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# GR-59857 - any of the mutation tests can randomly fail with ArrayIndexOutOfBoundsException +!test.test_set.TestBinaryOpsMutating_Set_Set.test_and_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Set.test_eq_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Set.test_ge_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Set.test_gt_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Set.test_iadd_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Set.test_ior_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Set.test_isub_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Set.test_iteration_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Set.test_ixor_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Set.test_le_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Set.test_lt_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Set.test_ne_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Set.test_or_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Set.test_sub_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Set.test_xor_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Subclass.test_and_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Subclass.test_eq_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Subclass.test_ge_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Subclass.test_gt_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Subclass.test_iadd_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Subclass.test_ior_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Subclass.test_isub_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Subclass.test_iteration_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Subclass.test_ixor_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Subclass.test_le_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Subclass.test_lt_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Subclass.test_ne_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Subclass.test_or_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Subclass.test_sub_with_mutation +!test.test_set.TestBinaryOpsMutating_Set_Subclass.test_xor_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Set.test_and_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Set.test_eq_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Set.test_ge_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Set.test_gt_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Set.test_iadd_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Set.test_ior_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Set.test_isub_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Set.test_iteration_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Set.test_ixor_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Set.test_le_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Set.test_lt_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Set.test_ne_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Set.test_or_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Set.test_sub_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Set.test_xor_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Subclass.test_and_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Subclass.test_eq_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Subclass.test_ge_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Subclass.test_gt_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Subclass.test_iadd_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Subclass.test_ior_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Subclass.test_isub_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Subclass.test_iteration_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Subclass.test_ixor_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Subclass.test_le_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Subclass.test_lt_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Subclass.test_ne_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Subclass.test_or_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Subclass.test_sub_with_mutation +!test.test_set.TestBinaryOpsMutating_Subclass_Subclass.test_xor_with_mutation +test.test_set.TestCopyingEmpty.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestCopyingEmpty.test_deep_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestCopyingNested.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestCopyingNested.test_deep_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestCopyingSingleton.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestCopyingSingleton.test_deep_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestCopyingTriple.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestCopyingTriple.test_deep_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestCopyingTuple.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestCopyingTuple.test_deep_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestExceptionPropagation.test_changingSizeWhileIterating @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestExceptionPropagation.test_instanceWithException @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestExceptionPropagation.test_instancesWithoutException @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_and @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_badcmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_constructor_identity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_cyclical_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_do_not_rehash_dict_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_frozen_as_dictkey @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_gc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_hash_caching @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_hash_effectiveness @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_iterator_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_new_or_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_or @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_setOfFrozensets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_sub @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_sub_and_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_subclass_with_custom_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_uniquification @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSet.test_xor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_and @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_badcmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_constructor_identity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_cyclical_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_do_not_rehash_dict_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_frozen_as_dictkey @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_gc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_hash_caching @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_hash_effectiveness @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_iterator_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_nested_empty_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_new_or_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_or @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_setOfFrozensets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_singleton_empty_frozenset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_sub @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_sub_and_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_subclass_with_custom_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_uniquification @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclass.test_xor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestFrozenSetSubclassWithSlots.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestGraphs.test_cube @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestGraphs.test_cuboctahedron @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestIdentities.test_binopsVsSubsets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestIdentities.test_commutativity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestIdentities.test_exclusion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestIdentities.test_summations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# GR-59857 - any of the mutation tests can randomly fail with ArrayIndexOutOfBoundsException +!test.test_set.TestMethodsMutating_Set_Dict.test_difference_update_with_mutation +!test.test_set.TestMethodsMutating_Set_Dict.test_difference_with_mutation +!test.test_set.TestMethodsMutating_Set_Dict.test_intersection_update_with_mutation +!test.test_set.TestMethodsMutating_Set_Dict.test_intersection_with_mutation +!test.test_set.TestMethodsMutating_Set_Dict.test_isdisjoint_with_mutation +!test.test_set.TestMethodsMutating_Set_Dict.test_issubset_with_mutation +!test.test_set.TestMethodsMutating_Set_Dict.test_issuperset_with_mutation +!test.test_set.TestMethodsMutating_Set_Dict.test_symmetric_difference_update_with_mutation +!test.test_set.TestMethodsMutating_Set_Dict.test_symmetric_difference_with_mutation +!test.test_set.TestMethodsMutating_Set_Dict.test_union_with_mutation +!test.test_set.TestMethodsMutating_Set_Dict.test_update_with_mutation +!test.test_set.TestMethodsMutating_Set_List.test_difference_update_with_mutation +!test.test_set.TestMethodsMutating_Set_List.test_difference_with_mutation +!test.test_set.TestMethodsMutating_Set_List.test_intersection_update_with_mutation +!test.test_set.TestMethodsMutating_Set_List.test_intersection_with_mutation +!test.test_set.TestMethodsMutating_Set_List.test_isdisjoint_with_mutation +!test.test_set.TestMethodsMutating_Set_List.test_issubset_with_mutation +!test.test_set.TestMethodsMutating_Set_List.test_issuperset_with_mutation +!test.test_set.TestMethodsMutating_Set_List.test_symmetric_difference_update_with_mutation +!test.test_set.TestMethodsMutating_Set_List.test_symmetric_difference_with_mutation +!test.test_set.TestMethodsMutating_Set_List.test_union_with_mutation +!test.test_set.TestMethodsMutating_Set_List.test_update_with_mutation +!test.test_set.TestMethodsMutating_Set_Set.test_difference_update_with_mutation +!test.test_set.TestMethodsMutating_Set_Set.test_difference_with_mutation +!test.test_set.TestMethodsMutating_Set_Set.test_intersection_update_with_mutation +!test.test_set.TestMethodsMutating_Set_Set.test_intersection_with_mutation +!test.test_set.TestMethodsMutating_Set_Set.test_isdisjoint_with_mutation +!test.test_set.TestMethodsMutating_Set_Set.test_issubset_with_mutation +!test.test_set.TestMethodsMutating_Set_Set.test_issuperset_with_mutation +!test.test_set.TestMethodsMutating_Set_Set.test_symmetric_difference_update_with_mutation +!test.test_set.TestMethodsMutating_Set_Set.test_symmetric_difference_with_mutation +!test.test_set.TestMethodsMutating_Set_Set.test_union_with_mutation +!test.test_set.TestMethodsMutating_Set_Set.test_update_with_mutation +!test.test_set.TestMethodsMutating_Set_Subclass.test_difference_update_with_mutation +!test.test_set.TestMethodsMutating_Set_Subclass.test_difference_with_mutation +!test.test_set.TestMethodsMutating_Set_Subclass.test_intersection_update_with_mutation +!test.test_set.TestMethodsMutating_Set_Subclass.test_intersection_with_mutation +!test.test_set.TestMethodsMutating_Set_Subclass.test_isdisjoint_with_mutation +!test.test_set.TestMethodsMutating_Set_Subclass.test_issubset_with_mutation +!test.test_set.TestMethodsMutating_Set_Subclass.test_issuperset_with_mutation +!test.test_set.TestMethodsMutating_Set_Subclass.test_symmetric_difference_update_with_mutation +!test.test_set.TestMethodsMutating_Set_Subclass.test_symmetric_difference_with_mutation +!test.test_set.TestMethodsMutating_Set_Subclass.test_union_with_mutation +!test.test_set.TestMethodsMutating_Set_Subclass.test_update_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Set.test_difference_update_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Set.test_difference_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Set.test_intersection_update_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Set.test_intersection_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Set.test_isdisjoint_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Set.test_issubset_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Set.test_issuperset_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Set.test_symmetric_difference_update_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Set.test_symmetric_difference_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Set.test_union_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Set.test_update_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Subclass.test_difference_update_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Subclass.test_difference_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Subclass.test_intersection_update_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Subclass.test_intersection_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Subclass.test_isdisjoint_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Subclass.test_issubset_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Subclass.test_issuperset_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Subclass.test_symmetric_difference_update_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Subclass.test_symmetric_difference_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Subclass.test_union_with_mutation +!test.test_set.TestMethodsMutating_Subclass_Subclass.test_update_with_mutation +test.test_set.TestMutate.test_add_absent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestMutate.test_add_present @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestMutate.test_add_until_full @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestMutate.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestMutate.test_discard_absent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestMutate.test_discard_present @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestMutate.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestMutate.test_remove_absent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestMutate.test_remove_present @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestMutate.test_remove_until_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestMutate.test_update_empty_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestMutate.test_update_unit_tuple_non_overlap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestMutate.test_update_unit_tuple_overlap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsDict.test_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsDict.test_difference_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsDict.test_difference_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsDict.test_eq_ne @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsDict.test_ge_gt_le_lt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsDict.test_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsDict.test_intersection_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsDict.test_intersection_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsDict.test_sym_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsDict.test_sym_difference_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsDict.test_sym_difference_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsDict.test_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsDict.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsDict.test_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsGenerator.test_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsGenerator.test_difference_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsGenerator.test_difference_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsGenerator.test_eq_ne @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsGenerator.test_ge_gt_le_lt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsGenerator.test_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsGenerator.test_intersection_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsGenerator.test_intersection_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsGenerator.test_sym_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsGenerator.test_sym_difference_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsGenerator.test_sym_difference_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsGenerator.test_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsGenerator.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsGenerator.test_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsNumeric.test_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsNumeric.test_difference_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsNumeric.test_difference_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsNumeric.test_eq_ne @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsNumeric.test_ge_gt_le_lt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsNumeric.test_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsNumeric.test_intersection_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsNumeric.test_intersection_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsNumeric.test_sym_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsNumeric.test_sym_difference_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsNumeric.test_sym_difference_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsNumeric.test_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsNumeric.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsNumeric.test_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsOperator.test_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsOperator.test_difference_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsOperator.test_difference_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsOperator.test_eq_ne @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsOperator.test_ge_gt_le_lt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsOperator.test_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsOperator.test_intersection_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsOperator.test_intersection_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsOperator.test_sym_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsOperator.test_sym_difference_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsOperator.test_sym_difference_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsOperator.test_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsOperator.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsOperator.test_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsString.test_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsString.test_difference_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsString.test_difference_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsString.test_eq_ne @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsString.test_ge_gt_le_lt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsString.test_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsString.test_intersection_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsString.test_intersection_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsString.test_sym_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsString.test_sym_difference_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsString.test_sym_difference_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsString.test_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsString.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsString.test_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsTuple.test_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsTuple.test_difference_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsTuple.test_difference_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsTuple.test_eq_ne @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsTuple.test_ge_gt_le_lt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsTuple.test_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsTuple.test_intersection_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsTuple.test_intersection_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsTuple.test_sym_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsTuple.test_sym_difference_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsTuple.test_sym_difference_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsTuple.test_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsTuple.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestOnlySetsTuple.test_update_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_and @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_badcmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_constructor_identity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_cyclical_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_difference_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_discard @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_do_not_rehash_dict_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_gc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_iand @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_inplace_on_self @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_intersection_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_ior @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_isub @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_iterator_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_ixor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_new_or_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_or @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_remove_keyerror_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_remove_keyerror_unpacking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_rich_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_setOfFrozensets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_set_literal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_set_literal_evaluation_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_set_literal_insertion_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_sub @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_sub_and_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_subclass_with_custom_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_symmetric_difference_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_uniquification @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSet.test_xor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetOfSets.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_and @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_badcmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_constructor_identity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_cyclical_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_difference_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_discard @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_do_not_rehash_dict_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_gc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_iand @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_inplace_on_self @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_intersection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_intersection_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_ior @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_isub @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_iterator_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_ixor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_keywords_in_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_new_or_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_or @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_remove_keyerror_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_remove_keyerror_unpacking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_rich_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_setOfFrozensets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_set_literal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_set_literal_evaluation_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_set_literal_insertion_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_sub @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_sub_and_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_subclass_with_custom_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_symmetric_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_symmetric_difference_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_uniquification @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclass.test_xor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSetSubclassWithSlots.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSubsetEmptyNonEmpty.test_issubset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSubsetEqualEmpty.test_issubset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSubsetEqualNonEmpty.test_issubset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSubsetNonOverlap.test_issubset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestSubsetPartial.test_issubset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_difference_method_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_difference_non_overlap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_difference_overlap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_difference_subset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_difference_superset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_intersection_method_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_intersection_non_overlap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_intersection_overlap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_intersection_subset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_intersection_superset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_sym_difference_method_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_sym_difference_non_overlap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_sym_difference_overlap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_sym_difference_subset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_sym_difference_superset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_union_method_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_union_non_overlap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_union_overlap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_union_subset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestUpdateOps.test_union_superset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestVariousIteratorArgs.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestVariousIteratorArgs.test_inline_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestVariousIteratorArgs.test_inplace_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestWeirdBugs.test_8420_set_merge @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestWeirdBugs.test_iter_and_mutate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_set.TestWeirdBugs.test_merge_and_mutate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_setcomps.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_setcomps.txt index 0ae0795a9b..e651c34b20 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_setcomps.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_setcomps.txt @@ -1 +1 @@ -*graalpython.lib-python.3.test.test_setcomps.TestMain.test_main +DocTestCase.test.test_setcomps.__test__.doctests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_shelve.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_shelve.txt index 9ffe1f0a5a..0bbaee6dbb 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_shelve.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_shelve.txt @@ -1,253 +1,182 @@ -*graalpython.lib-python.3.test.test_shelve.TestAsciiFileShelve.test_bool -*graalpython.lib-python.3.test.test_shelve.TestAsciiFileShelve.test_constructor -*graalpython.lib-python.3.test.test_shelve.TestAsciiFileShelve.test_get -*graalpython.lib-python.3.test.test_shelve.TestAsciiFileShelve.test_getitem -*graalpython.lib-python.3.test.test_shelve.TestAsciiFileShelve.test_items -*graalpython.lib-python.3.test.test_shelve.TestAsciiFileShelve.test_keys -*graalpython.lib-python.3.test.test_shelve.TestAsciiFileShelve.test_len -*graalpython.lib-python.3.test.test_shelve.TestAsciiFileShelve.test_pop -*graalpython.lib-python.3.test.test_shelve.TestAsciiFileShelve.test_popitem -*graalpython.lib-python.3.test.test_shelve.TestAsciiFileShelve.test_read -*graalpython.lib-python.3.test.test_shelve.TestAsciiFileShelve.test_setdefault -*graalpython.lib-python.3.test.test_shelve.TestAsciiFileShelve.test_update -*graalpython.lib-python.3.test.test_shelve.TestAsciiFileShelve.test_values -*graalpython.lib-python.3.test.test_shelve.TestAsciiFileShelve.test_write -*graalpython.lib-python.3.test.test_shelve.TestAsciiMemShelve.test_bool -*graalpython.lib-python.3.test.test_shelve.TestAsciiMemShelve.test_constructor -*graalpython.lib-python.3.test.test_shelve.TestAsciiMemShelve.test_get -*graalpython.lib-python.3.test.test_shelve.TestAsciiMemShelve.test_getitem -*graalpython.lib-python.3.test.test_shelve.TestAsciiMemShelve.test_items -*graalpython.lib-python.3.test.test_shelve.TestAsciiMemShelve.test_keys -*graalpython.lib-python.3.test.test_shelve.TestAsciiMemShelve.test_len -*graalpython.lib-python.3.test.test_shelve.TestAsciiMemShelve.test_pop -*graalpython.lib-python.3.test.test_shelve.TestAsciiMemShelve.test_popitem -*graalpython.lib-python.3.test.test_shelve.TestAsciiMemShelve.test_read -*graalpython.lib-python.3.test.test_shelve.TestAsciiMemShelve.test_setdefault -*graalpython.lib-python.3.test.test_shelve.TestAsciiMemShelve.test_update -*graalpython.lib-python.3.test.test_shelve.TestAsciiMemShelve.test_values -*graalpython.lib-python.3.test.test_shelve.TestAsciiMemShelve.test_write -*graalpython.lib-python.3.test.test_shelve.TestBinaryFileShelve.test_bool -*graalpython.lib-python.3.test.test_shelve.TestBinaryFileShelve.test_constructor -*graalpython.lib-python.3.test.test_shelve.TestBinaryFileShelve.test_get -*graalpython.lib-python.3.test.test_shelve.TestBinaryFileShelve.test_getitem -*graalpython.lib-python.3.test.test_shelve.TestBinaryFileShelve.test_items -*graalpython.lib-python.3.test.test_shelve.TestBinaryFileShelve.test_keys -*graalpython.lib-python.3.test.test_shelve.TestBinaryFileShelve.test_len -*graalpython.lib-python.3.test.test_shelve.TestBinaryFileShelve.test_pop -*graalpython.lib-python.3.test.test_shelve.TestBinaryFileShelve.test_popitem -*graalpython.lib-python.3.test.test_shelve.TestBinaryFileShelve.test_read -*graalpython.lib-python.3.test.test_shelve.TestBinaryFileShelve.test_setdefault -*graalpython.lib-python.3.test.test_shelve.TestBinaryFileShelve.test_update -*graalpython.lib-python.3.test.test_shelve.TestBinaryFileShelve.test_values -*graalpython.lib-python.3.test.test_shelve.TestBinaryFileShelve.test_write -*graalpython.lib-python.3.test.test_shelve.TestBinaryMemShelve.test_bool -*graalpython.lib-python.3.test.test_shelve.TestBinaryMemShelve.test_constructor -*graalpython.lib-python.3.test.test_shelve.TestBinaryMemShelve.test_get -*graalpython.lib-python.3.test.test_shelve.TestBinaryMemShelve.test_getitem -*graalpython.lib-python.3.test.test_shelve.TestBinaryMemShelve.test_items -*graalpython.lib-python.3.test.test_shelve.TestBinaryMemShelve.test_keys -*graalpython.lib-python.3.test.test_shelve.TestBinaryMemShelve.test_len -*graalpython.lib-python.3.test.test_shelve.TestBinaryMemShelve.test_pop -*graalpython.lib-python.3.test.test_shelve.TestBinaryMemShelve.test_popitem -*graalpython.lib-python.3.test.test_shelve.TestBinaryMemShelve.test_read -*graalpython.lib-python.3.test.test_shelve.TestBinaryMemShelve.test_setdefault -*graalpython.lib-python.3.test.test_shelve.TestBinaryMemShelve.test_update -*graalpython.lib-python.3.test.test_shelve.TestBinaryMemShelve.test_values -*graalpython.lib-python.3.test.test_shelve.TestBinaryMemShelve.test_write -*graalpython.lib-python.3.test.test_shelve.TestCase.test_ascii_file_shelf -*graalpython.lib-python.3.test.test_shelve.TestCase.test_binary_file_shelf -*graalpython.lib-python.3.test.test_shelve.TestCase.test_bytes_path_file_shelf -*graalpython.lib-python.3.test.test_shelve.TestCase.test_close -*graalpython.lib-python.3.test.test_shelve.TestCase.test_default_protocol -*graalpython.lib-python.3.test.test_shelve.TestCase.test_in_memory_shelf -*graalpython.lib-python.3.test.test_shelve.TestCase.test_keyencoding -*graalpython.lib-python.3.test.test_shelve.TestCase.test_mutable_entry -*graalpython.lib-python.3.test.test_shelve.TestCase.test_open_template -*graalpython.lib-python.3.test.test_shelve.TestCase.test_pathlib_bytes_path_file_shelf -*graalpython.lib-python.3.test.test_shelve.TestCase.test_pathlib_path_file_shelf -*graalpython.lib-python.3.test.test_shelve.TestCase.test_proto2_file_shelf -*graalpython.lib-python.3.test.test_shelve.TestCase.test_with -*graalpython.lib-python.3.test.test_shelve.TestCase.test_writeback_also_writes_immediately -*graalpython.lib-python.3.test.test_shelve.TestMain.test_main -*graalpython.lib-python.3.test.test_shelve.TestProto0File_dumbShelve.test_bool -*graalpython.lib-python.3.test.test_shelve.TestProto0File_dumbShelve.test_constructor -*graalpython.lib-python.3.test.test_shelve.TestProto0File_dumbShelve.test_get -*graalpython.lib-python.3.test.test_shelve.TestProto0File_dumbShelve.test_getitem -*graalpython.lib-python.3.test.test_shelve.TestProto0File_dumbShelve.test_items -*graalpython.lib-python.3.test.test_shelve.TestProto0File_dumbShelve.test_keys -*graalpython.lib-python.3.test.test_shelve.TestProto0File_dumbShelve.test_len -*graalpython.lib-python.3.test.test_shelve.TestProto0File_dumbShelve.test_pop -*graalpython.lib-python.3.test.test_shelve.TestProto0File_dumbShelve.test_popitem -*graalpython.lib-python.3.test.test_shelve.TestProto0File_dumbShelve.test_read -*graalpython.lib-python.3.test.test_shelve.TestProto0File_dumbShelve.test_setdefault -*graalpython.lib-python.3.test.test_shelve.TestProto0File_dumbShelve.test_update -*graalpython.lib-python.3.test.test_shelve.TestProto0File_dumbShelve.test_values -*graalpython.lib-python.3.test.test_shelve.TestProto0File_dumbShelve.test_write -*graalpython.lib-python.3.test.test_shelve.TestProto0MemShelve.test_bool -*graalpython.lib-python.3.test.test_shelve.TestProto0MemShelve.test_constructor -*graalpython.lib-python.3.test.test_shelve.TestProto0MemShelve.test_get -*graalpython.lib-python.3.test.test_shelve.TestProto0MemShelve.test_getitem -*graalpython.lib-python.3.test.test_shelve.TestProto0MemShelve.test_items -*graalpython.lib-python.3.test.test_shelve.TestProto0MemShelve.test_keys -*graalpython.lib-python.3.test.test_shelve.TestProto0MemShelve.test_len -*graalpython.lib-python.3.test.test_shelve.TestProto0MemShelve.test_pop -*graalpython.lib-python.3.test.test_shelve.TestProto0MemShelve.test_popitem -*graalpython.lib-python.3.test.test_shelve.TestProto0MemShelve.test_read -*graalpython.lib-python.3.test.test_shelve.TestProto0MemShelve.test_setdefault -*graalpython.lib-python.3.test.test_shelve.TestProto0MemShelve.test_update -*graalpython.lib-python.3.test.test_shelve.TestProto0MemShelve.test_values -*graalpython.lib-python.3.test.test_shelve.TestProto0MemShelve.test_write -*graalpython.lib-python.3.test.test_shelve.TestProto1File_dumbShelve.test_bool -*graalpython.lib-python.3.test.test_shelve.TestProto1File_dumbShelve.test_constructor -*graalpython.lib-python.3.test.test_shelve.TestProto1File_dumbShelve.test_get -*graalpython.lib-python.3.test.test_shelve.TestProto1File_dumbShelve.test_getitem -*graalpython.lib-python.3.test.test_shelve.TestProto1File_dumbShelve.test_items -*graalpython.lib-python.3.test.test_shelve.TestProto1File_dumbShelve.test_keys -*graalpython.lib-python.3.test.test_shelve.TestProto1File_dumbShelve.test_len -*graalpython.lib-python.3.test.test_shelve.TestProto1File_dumbShelve.test_pop -*graalpython.lib-python.3.test.test_shelve.TestProto1File_dumbShelve.test_popitem -*graalpython.lib-python.3.test.test_shelve.TestProto1File_dumbShelve.test_read -*graalpython.lib-python.3.test.test_shelve.TestProto1File_dumbShelve.test_setdefault -*graalpython.lib-python.3.test.test_shelve.TestProto1File_dumbShelve.test_update -*graalpython.lib-python.3.test.test_shelve.TestProto1File_dumbShelve.test_values -*graalpython.lib-python.3.test.test_shelve.TestProto1File_dumbShelve.test_write -*graalpython.lib-python.3.test.test_shelve.TestProto1MemShelve.test_bool -*graalpython.lib-python.3.test.test_shelve.TestProto1MemShelve.test_constructor -*graalpython.lib-python.3.test.test_shelve.TestProto1MemShelve.test_get -*graalpython.lib-python.3.test.test_shelve.TestProto1MemShelve.test_getitem -*graalpython.lib-python.3.test.test_shelve.TestProto1MemShelve.test_items -*graalpython.lib-python.3.test.test_shelve.TestProto1MemShelve.test_keys -*graalpython.lib-python.3.test.test_shelve.TestProto1MemShelve.test_len -*graalpython.lib-python.3.test.test_shelve.TestProto1MemShelve.test_pop -*graalpython.lib-python.3.test.test_shelve.TestProto1MemShelve.test_popitem -*graalpython.lib-python.3.test.test_shelve.TestProto1MemShelve.test_read -*graalpython.lib-python.3.test.test_shelve.TestProto1MemShelve.test_setdefault -*graalpython.lib-python.3.test.test_shelve.TestProto1MemShelve.test_update -*graalpython.lib-python.3.test.test_shelve.TestProto1MemShelve.test_values -*graalpython.lib-python.3.test.test_shelve.TestProto1MemShelve.test_write -*graalpython.lib-python.3.test.test_shelve.TestProto2FileShelve.test_bool -*graalpython.lib-python.3.test.test_shelve.TestProto2FileShelve.test_constructor -*graalpython.lib-python.3.test.test_shelve.TestProto2FileShelve.test_get -*graalpython.lib-python.3.test.test_shelve.TestProto2FileShelve.test_getitem -*graalpython.lib-python.3.test.test_shelve.TestProto2FileShelve.test_items -*graalpython.lib-python.3.test.test_shelve.TestProto2FileShelve.test_keys -*graalpython.lib-python.3.test.test_shelve.TestProto2FileShelve.test_len -*graalpython.lib-python.3.test.test_shelve.TestProto2FileShelve.test_pop -*graalpython.lib-python.3.test.test_shelve.TestProto2FileShelve.test_popitem -*graalpython.lib-python.3.test.test_shelve.TestProto2FileShelve.test_read -*graalpython.lib-python.3.test.test_shelve.TestProto2FileShelve.test_setdefault -*graalpython.lib-python.3.test.test_shelve.TestProto2FileShelve.test_update -*graalpython.lib-python.3.test.test_shelve.TestProto2FileShelve.test_values -*graalpython.lib-python.3.test.test_shelve.TestProto2FileShelve.test_write -*graalpython.lib-python.3.test.test_shelve.TestProto2File_dumbShelve.test_bool -*graalpython.lib-python.3.test.test_shelve.TestProto2File_dumbShelve.test_constructor -*graalpython.lib-python.3.test.test_shelve.TestProto2File_dumbShelve.test_get -*graalpython.lib-python.3.test.test_shelve.TestProto2File_dumbShelve.test_getitem -*graalpython.lib-python.3.test.test_shelve.TestProto2File_dumbShelve.test_items -*graalpython.lib-python.3.test.test_shelve.TestProto2File_dumbShelve.test_keys -*graalpython.lib-python.3.test.test_shelve.TestProto2File_dumbShelve.test_len -*graalpython.lib-python.3.test.test_shelve.TestProto2File_dumbShelve.test_pop -*graalpython.lib-python.3.test.test_shelve.TestProto2File_dumbShelve.test_popitem -*graalpython.lib-python.3.test.test_shelve.TestProto2File_dumbShelve.test_read -*graalpython.lib-python.3.test.test_shelve.TestProto2File_dumbShelve.test_setdefault -*graalpython.lib-python.3.test.test_shelve.TestProto2File_dumbShelve.test_update -*graalpython.lib-python.3.test.test_shelve.TestProto2File_dumbShelve.test_values -*graalpython.lib-python.3.test.test_shelve.TestProto2File_dumbShelve.test_write -*graalpython.lib-python.3.test.test_shelve.TestProto2MemShelve.test_bool -*graalpython.lib-python.3.test.test_shelve.TestProto2MemShelve.test_constructor -*graalpython.lib-python.3.test.test_shelve.TestProto2MemShelve.test_get -*graalpython.lib-python.3.test.test_shelve.TestProto2MemShelve.test_getitem -*graalpython.lib-python.3.test.test_shelve.TestProto2MemShelve.test_items -*graalpython.lib-python.3.test.test_shelve.TestProto2MemShelve.test_keys -*graalpython.lib-python.3.test.test_shelve.TestProto2MemShelve.test_len -*graalpython.lib-python.3.test.test_shelve.TestProto2MemShelve.test_pop -*graalpython.lib-python.3.test.test_shelve.TestProto2MemShelve.test_popitem -*graalpython.lib-python.3.test.test_shelve.TestProto2MemShelve.test_read -*graalpython.lib-python.3.test.test_shelve.TestProto2MemShelve.test_setdefault -*graalpython.lib-python.3.test.test_shelve.TestProto2MemShelve.test_update -*graalpython.lib-python.3.test.test_shelve.TestProto2MemShelve.test_values -*graalpython.lib-python.3.test.test_shelve.TestProto2MemShelve.test_write -*graalpython.lib-python.3.test.test_shelve.TestProto3File_dumbShelve.test_bool -*graalpython.lib-python.3.test.test_shelve.TestProto3File_dumbShelve.test_constructor -*graalpython.lib-python.3.test.test_shelve.TestProto3File_dumbShelve.test_get -*graalpython.lib-python.3.test.test_shelve.TestProto3File_dumbShelve.test_getitem -*graalpython.lib-python.3.test.test_shelve.TestProto3File_dumbShelve.test_items -*graalpython.lib-python.3.test.test_shelve.TestProto3File_dumbShelve.test_keys -*graalpython.lib-python.3.test.test_shelve.TestProto3File_dumbShelve.test_len -*graalpython.lib-python.3.test.test_shelve.TestProto3File_dumbShelve.test_pop -*graalpython.lib-python.3.test.test_shelve.TestProto3File_dumbShelve.test_popitem -*graalpython.lib-python.3.test.test_shelve.TestProto3File_dumbShelve.test_read -*graalpython.lib-python.3.test.test_shelve.TestProto3File_dumbShelve.test_setdefault -*graalpython.lib-python.3.test.test_shelve.TestProto3File_dumbShelve.test_update -*graalpython.lib-python.3.test.test_shelve.TestProto3File_dumbShelve.test_values -*graalpython.lib-python.3.test.test_shelve.TestProto3File_dumbShelve.test_write -*graalpython.lib-python.3.test.test_shelve.TestProto3MemShelve.test_bool -*graalpython.lib-python.3.test.test_shelve.TestProto3MemShelve.test_constructor -*graalpython.lib-python.3.test.test_shelve.TestProto3MemShelve.test_get -*graalpython.lib-python.3.test.test_shelve.TestProto3MemShelve.test_getitem -*graalpython.lib-python.3.test.test_shelve.TestProto3MemShelve.test_items -*graalpython.lib-python.3.test.test_shelve.TestProto3MemShelve.test_keys -*graalpython.lib-python.3.test.test_shelve.TestProto3MemShelve.test_len -*graalpython.lib-python.3.test.test_shelve.TestProto3MemShelve.test_pop -*graalpython.lib-python.3.test.test_shelve.TestProto3MemShelve.test_popitem -*graalpython.lib-python.3.test.test_shelve.TestProto3MemShelve.test_read -*graalpython.lib-python.3.test.test_shelve.TestProto3MemShelve.test_setdefault -*graalpython.lib-python.3.test.test_shelve.TestProto3MemShelve.test_update -*graalpython.lib-python.3.test.test_shelve.TestProto3MemShelve.test_values -*graalpython.lib-python.3.test.test_shelve.TestProto3MemShelve.test_write -*graalpython.lib-python.3.test.test_shelve.TestProto4File_dumbShelve.test_bool -*graalpython.lib-python.3.test.test_shelve.TestProto4File_dumbShelve.test_constructor -*graalpython.lib-python.3.test.test_shelve.TestProto4File_dumbShelve.test_get -*graalpython.lib-python.3.test.test_shelve.TestProto4File_dumbShelve.test_getitem -*graalpython.lib-python.3.test.test_shelve.TestProto4File_dumbShelve.test_items -*graalpython.lib-python.3.test.test_shelve.TestProto4File_dumbShelve.test_keys -*graalpython.lib-python.3.test.test_shelve.TestProto4File_dumbShelve.test_len -*graalpython.lib-python.3.test.test_shelve.TestProto4File_dumbShelve.test_pop -*graalpython.lib-python.3.test.test_shelve.TestProto4File_dumbShelve.test_popitem -*graalpython.lib-python.3.test.test_shelve.TestProto4File_dumbShelve.test_read -*graalpython.lib-python.3.test.test_shelve.TestProto4File_dumbShelve.test_setdefault -*graalpython.lib-python.3.test.test_shelve.TestProto4File_dumbShelve.test_update -*graalpython.lib-python.3.test.test_shelve.TestProto4File_dumbShelve.test_values -*graalpython.lib-python.3.test.test_shelve.TestProto4File_dumbShelve.test_write -*graalpython.lib-python.3.test.test_shelve.TestProto4MemShelve.test_bool -*graalpython.lib-python.3.test.test_shelve.TestProto4MemShelve.test_constructor -*graalpython.lib-python.3.test.test_shelve.TestProto4MemShelve.test_get -*graalpython.lib-python.3.test.test_shelve.TestProto4MemShelve.test_getitem -*graalpython.lib-python.3.test.test_shelve.TestProto4MemShelve.test_items -*graalpython.lib-python.3.test.test_shelve.TestProto4MemShelve.test_keys -*graalpython.lib-python.3.test.test_shelve.TestProto4MemShelve.test_len -*graalpython.lib-python.3.test.test_shelve.TestProto4MemShelve.test_pop -*graalpython.lib-python.3.test.test_shelve.TestProto4MemShelve.test_popitem -*graalpython.lib-python.3.test.test_shelve.TestProto4MemShelve.test_read -*graalpython.lib-python.3.test.test_shelve.TestProto4MemShelve.test_setdefault -*graalpython.lib-python.3.test.test_shelve.TestProto4MemShelve.test_update -*graalpython.lib-python.3.test.test_shelve.TestProto4MemShelve.test_values -*graalpython.lib-python.3.test.test_shelve.TestProto4MemShelve.test_write -*graalpython.lib-python.3.test.test_shelve.TestProto5File_dumbShelve.test_bool -*graalpython.lib-python.3.test.test_shelve.TestProto5File_dumbShelve.test_constructor -*graalpython.lib-python.3.test.test_shelve.TestProto5File_dumbShelve.test_get -*graalpython.lib-python.3.test.test_shelve.TestProto5File_dumbShelve.test_getitem -*graalpython.lib-python.3.test.test_shelve.TestProto5File_dumbShelve.test_items -*graalpython.lib-python.3.test.test_shelve.TestProto5File_dumbShelve.test_keys -*graalpython.lib-python.3.test.test_shelve.TestProto5File_dumbShelve.test_len -*graalpython.lib-python.3.test.test_shelve.TestProto5File_dumbShelve.test_pop -*graalpython.lib-python.3.test.test_shelve.TestProto5File_dumbShelve.test_popitem -*graalpython.lib-python.3.test.test_shelve.TestProto5File_dumbShelve.test_read -*graalpython.lib-python.3.test.test_shelve.TestProto5File_dumbShelve.test_setdefault -*graalpython.lib-python.3.test.test_shelve.TestProto5File_dumbShelve.test_update -*graalpython.lib-python.3.test.test_shelve.TestProto5File_dumbShelve.test_values -*graalpython.lib-python.3.test.test_shelve.TestProto5File_dumbShelve.test_write -*graalpython.lib-python.3.test.test_shelve.TestProto5MemShelve.test_bool -*graalpython.lib-python.3.test.test_shelve.TestProto5MemShelve.test_constructor -*graalpython.lib-python.3.test.test_shelve.TestProto5MemShelve.test_get -*graalpython.lib-python.3.test.test_shelve.TestProto5MemShelve.test_getitem -*graalpython.lib-python.3.test.test_shelve.TestProto5MemShelve.test_items -*graalpython.lib-python.3.test.test_shelve.TestProto5MemShelve.test_keys -*graalpython.lib-python.3.test.test_shelve.TestProto5MemShelve.test_len -*graalpython.lib-python.3.test.test_shelve.TestProto5MemShelve.test_pop -*graalpython.lib-python.3.test.test_shelve.TestProto5MemShelve.test_popitem -*graalpython.lib-python.3.test.test_shelve.TestProto5MemShelve.test_read -*graalpython.lib-python.3.test.test_shelve.TestProto5MemShelve.test_setdefault -*graalpython.lib-python.3.test.test_shelve.TestProto5MemShelve.test_update -*graalpython.lib-python.3.test.test_shelve.TestProto5MemShelve.test_values -*graalpython.lib-python.3.test.test_shelve.TestProto5MemShelve.test_write +test.test_shelve.TestCase.test_ascii_file_shelf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestCase.test_binary_file_shelf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestCase.test_bytes_path_file_shelf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestCase.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestCase.test_default_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestCase.test_in_memory_shelf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestCase.test_keyencoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestCase.test_mutable_entry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestCase.test_open_template @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestCase.test_pathlib_bytes_path_file_shelf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestCase.test_pathlib_path_file_shelf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestCase.test_proto2_file_shelf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestCase.test_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestCase.test_writeback_also_writes_immediately @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0File_dumbShelve.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0File_dumbShelve.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0File_dumbShelve.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0File_dumbShelve.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0File_dumbShelve.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0File_dumbShelve.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0File_dumbShelve.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0File_dumbShelve.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0File_dumbShelve.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0File_dumbShelve.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0File_dumbShelve.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0File_dumbShelve.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0File_dumbShelve.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0File_dumbShelve.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0MemShelve.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0MemShelve.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0MemShelve.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0MemShelve.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0MemShelve.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0MemShelve.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0MemShelve.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0MemShelve.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0MemShelve.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0MemShelve.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0MemShelve.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0MemShelve.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0MemShelve.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto0MemShelve.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1File_dumbShelve.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1File_dumbShelve.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1File_dumbShelve.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1File_dumbShelve.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1File_dumbShelve.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1File_dumbShelve.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1File_dumbShelve.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1File_dumbShelve.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1File_dumbShelve.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1File_dumbShelve.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1File_dumbShelve.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1File_dumbShelve.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1File_dumbShelve.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1File_dumbShelve.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1MemShelve.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1MemShelve.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1MemShelve.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1MemShelve.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1MemShelve.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1MemShelve.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1MemShelve.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1MemShelve.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1MemShelve.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1MemShelve.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1MemShelve.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1MemShelve.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1MemShelve.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto1MemShelve.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2File_dumbShelve.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2File_dumbShelve.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2File_dumbShelve.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2File_dumbShelve.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2File_dumbShelve.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2File_dumbShelve.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2File_dumbShelve.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2File_dumbShelve.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2File_dumbShelve.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2File_dumbShelve.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2File_dumbShelve.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2File_dumbShelve.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2File_dumbShelve.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2File_dumbShelve.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2MemShelve.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2MemShelve.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2MemShelve.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2MemShelve.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2MemShelve.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2MemShelve.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2MemShelve.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2MemShelve.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2MemShelve.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2MemShelve.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2MemShelve.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2MemShelve.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2MemShelve.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto2MemShelve.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3File_dumbShelve.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3File_dumbShelve.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3File_dumbShelve.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3File_dumbShelve.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3File_dumbShelve.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3File_dumbShelve.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3File_dumbShelve.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3File_dumbShelve.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3File_dumbShelve.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3File_dumbShelve.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3File_dumbShelve.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3File_dumbShelve.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3File_dumbShelve.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3File_dumbShelve.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3MemShelve.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3MemShelve.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3MemShelve.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3MemShelve.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3MemShelve.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3MemShelve.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3MemShelve.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3MemShelve.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3MemShelve.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3MemShelve.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3MemShelve.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3MemShelve.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3MemShelve.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto3MemShelve.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4File_dumbShelve.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4File_dumbShelve.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4File_dumbShelve.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4File_dumbShelve.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4File_dumbShelve.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4File_dumbShelve.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4File_dumbShelve.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4File_dumbShelve.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4File_dumbShelve.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4File_dumbShelve.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4File_dumbShelve.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4File_dumbShelve.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4File_dumbShelve.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4File_dumbShelve.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4MemShelve.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4MemShelve.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4MemShelve.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4MemShelve.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4MemShelve.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4MemShelve.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4MemShelve.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4MemShelve.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4MemShelve.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4MemShelve.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4MemShelve.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4MemShelve.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4MemShelve.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto4MemShelve.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5File_dumbShelve.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5File_dumbShelve.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5File_dumbShelve.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5File_dumbShelve.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5File_dumbShelve.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5File_dumbShelve.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5File_dumbShelve.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5File_dumbShelve.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5File_dumbShelve.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5File_dumbShelve.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5File_dumbShelve.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5File_dumbShelve.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5File_dumbShelve.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5File_dumbShelve.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5MemShelve.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5MemShelve.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5MemShelve.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5MemShelve.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5MemShelve.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5MemShelve.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5MemShelve.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5MemShelve.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5MemShelve.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5MemShelve.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5MemShelve.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5MemShelve.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5MemShelve.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shelve.TestProto5MemShelve.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_shlex.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_shlex.txt index b4f8a7b040..8c4b6d171b 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_shlex.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_shlex.txt @@ -1,18 +1,18 @@ -*graalpython.lib-python.3.test.test_shlex.ShlexTest.testCompat -*graalpython.lib-python.3.test.test_shlex.ShlexTest.testEmptyStringHandling -*graalpython.lib-python.3.test.test_shlex.ShlexTest.testJoin -*graalpython.lib-python.3.test.test_shlex.ShlexTest.testJoinRoundtrip -*graalpython.lib-python.3.test.test_shlex.ShlexTest.testPunctuationCharsReadOnly -*graalpython.lib-python.3.test.test_shlex.ShlexTest.testPunctuationInWordChars -*graalpython.lib-python.3.test.test_shlex.ShlexTest.testPunctuationWithPosix -*graalpython.lib-python.3.test.test_shlex.ShlexTest.testPunctuationWithWhitespaceSplit -*graalpython.lib-python.3.test.test_shlex.ShlexTest.testQuote -*graalpython.lib-python.3.test.test_shlex.ShlexTest.testSplitNoneDeprecation -*graalpython.lib-python.3.test.test_shlex.ShlexTest.testSplitPosix -*graalpython.lib-python.3.test.test_shlex.ShlexTest.testSyntaxSplitAmpersandAndPipe -*graalpython.lib-python.3.test.test_shlex.ShlexTest.testSyntaxSplitCustom -*graalpython.lib-python.3.test.test_shlex.ShlexTest.testSyntaxSplitParen -*graalpython.lib-python.3.test.test_shlex.ShlexTest.testSyntaxSplitRedirect -*graalpython.lib-python.3.test.test_shlex.ShlexTest.testSyntaxSplitSemicolon -*graalpython.lib-python.3.test.test_shlex.ShlexTest.testTokenTypes -*graalpython.lib-python.3.test.test_shlex.ShlexTest.testUnicodeHandling +test.test_shlex.ShlexTest.testCompat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shlex.ShlexTest.testEmptyStringHandling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shlex.ShlexTest.testJoin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shlex.ShlexTest.testJoinRoundtrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shlex.ShlexTest.testPunctuationCharsReadOnly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shlex.ShlexTest.testPunctuationInWordChars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shlex.ShlexTest.testPunctuationWithPosix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shlex.ShlexTest.testPunctuationWithWhitespaceSplit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shlex.ShlexTest.testQuote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shlex.ShlexTest.testSplitNoneDeprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shlex.ShlexTest.testSplitPosix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shlex.ShlexTest.testSyntaxSplitAmpersandAndPipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shlex.ShlexTest.testSyntaxSplitCustom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shlex.ShlexTest.testSyntaxSplitParen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shlex.ShlexTest.testSyntaxSplitRedirect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shlex.ShlexTest.testSyntaxSplitSemicolon @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shlex.ShlexTest.testTokenTypes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shlex.ShlexTest.testUnicodeHandling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_shutil.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_shutil.txt index ecf2eb72a5..015b9ca133 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_shutil.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_shutil.txt @@ -1,232 +1,132 @@ -*graalpython.lib-python.3.test.test_shutil.PublicAPITests.test_module_all_attribute -*graalpython.lib-python.3.test.test_shutil.TermsizeTests.test_bad_environ -*graalpython.lib-python.3.test.test_shutil.TermsizeTests.test_does_not_crash -*graalpython.lib-python.3.test.test_shutil.TermsizeTests.test_fallback -*graalpython.lib-python.3.test.test_shutil.TermsizeTests.test_os_environ_first -*graalpython.lib-python.3.test.test_shutil.TermsizeTests.test_stty_match -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_make_archive -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_make_archive_cwd -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_make_archive_owner_group -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_make_tarball -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_make_tarfile_in_curdir -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_make_tarfile_rootdir_nodir -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_make_zipfile -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_make_zipfile_in_curdir -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_make_zipfile_rootdir_nodir -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_register_archive_format -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_tarfile_root_owner -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_tarfile_vs_tar -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_unpack_archive_bztar -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_unpack_archive_gztar -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_unpack_archive_tar -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_unpack_archive_xztar -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_unpack_archive_zip -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_unpack_registry -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_unzip_zipfile -*graalpython.lib-python.3.test.test_shutil.TestArchives.test_zipfile_vs_zip -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copy -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copy2 -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copy2_dir -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copy2_symlinks -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copy2_xattr -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copy_dir -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copy_return_value -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copy_symlinks -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copyfile_copy_dir -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copyfile_named_pipe -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copyfile_nonexistent_dir -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copyfile_return_value -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copyfile_same_file -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copyfile_symlinks -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copymode_follow_symlinks -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copymode_symlink_to_symlink -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copymode_symlink_to_symlink_wo_lchmod -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copystat_handles_harmless_chflags_errors -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copystat_symlinks -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copyxattr -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_copyxattr_symlinks -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_dont_copy_file_onto_link_to_itself -*graalpython.lib-python.3.test.test_shutil.TestCopy.test_dont_copy_file_onto_symlink_to_itself -*graalpython.lib-python.3.test.test_shutil.TestCopyFile.test_move_dir_caseinsensitive -*graalpython.lib-python.3.test.test_shutil.TestCopyFile.test_w_dest_close_fails -*graalpython.lib-python.3.test.test_shutil.TestCopyFile.test_w_dest_open_fails -*graalpython.lib-python.3.test.test_shutil.TestCopyFile.test_w_source_close_fails -*graalpython.lib-python.3.test.test_shutil.TestCopyFile.test_w_source_open_fails -*graalpython.lib-python.3.test.test_shutil.TestCopyFileObj.test_content -*graalpython.lib-python.3.test.test_shutil.TestCopyFileObj.test_file_not_closed -*graalpython.lib-python.3.test.test_shutil.TestCopyFileObj.test_file_offset -*graalpython.lib-python.3.test.test_shutil.TestCopyFileObj.test_win_impl -*graalpython.lib-python.3.test.test_shutil.TestCopyTree.test_copytree_arg_types_of_ignore -*graalpython.lib-python.3.test.test_shutil.TestCopyTree.test_copytree_custom_copy_function -*graalpython.lib-python.3.test.test_shutil.TestCopyTree.test_copytree_dangling_symlinks -*graalpython.lib-python.3.test.test_shutil.TestCopyTree.test_copytree_dirs_exist_ok -*graalpython.lib-python.3.test.test_shutil.TestCopyTree.test_copytree_named_pipe -*graalpython.lib-python.3.test.test_shutil.TestCopyTree.test_copytree_retains_permissions -*graalpython.lib-python.3.test.test_shutil.TestCopyTree.test_copytree_return_value -*graalpython.lib-python.3.test.test_shutil.TestCopyTree.test_copytree_simple -*graalpython.lib-python.3.test.test_shutil.TestCopyTree.test_copytree_special_func -*graalpython.lib-python.3.test.test_shutil.TestCopyTree.test_copytree_subdirectory -*graalpython.lib-python.3.test.test_shutil.TestCopyTree.test_copytree_symlink_dir -*graalpython.lib-python.3.test.test_shutil.TestCopyTree.test_copytree_symlinks -*graalpython.lib-python.3.test.test_shutil.TestCopyTree.test_copytree_winerror -*graalpython.lib-python.3.test.test_shutil.TestCopyTree.test_copytree_with_exclude -*graalpython.lib-python.3.test.test_shutil.TestGetTerminalSize.test_bad_environ -*graalpython.lib-python.3.test.test_shutil.TestGetTerminalSize.test_does_not_crash -*graalpython.lib-python.3.test.test_shutil.TestGetTerminalSize.test_fallback -*graalpython.lib-python.3.test.test_shutil.TestGetTerminalSize.test_os_environ_first -*graalpython.lib-python.3.test.test_shutil.TestGetTerminalSize.test_stty_match -*graalpython.lib-python.3.test.test_shutil.TestMisc.test_chown -*graalpython.lib-python.3.test.test_shutil.TestMisc.test_disk_usage -*graalpython.lib-python.3.test.test_shutil.TestMove.test_destinsrc_false_negative -*graalpython.lib-python.3.test.test_shutil.TestMove.test_destinsrc_false_positive -*graalpython.lib-python.3.test.test_shutil.TestMove.test_dont_move_dir_in_itself -*graalpython.lib-python.3.test.test_shutil.TestMove.test_existing_file_inside_dest_dir -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_as_rename_return_value -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_dangling_symlink -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_dir -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_dir_altsep_to_dir -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_dir_caseinsensitive -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_dir_other_fs -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_dir_permission_denied -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_dir_sep_to_dir -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_dir_special_function -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_dir_symlink -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_dir_to_dir -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_dir_to_dir_other_fs -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_file -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_file_other_fs -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_file_special_function -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_file_symlink -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_file_symlink_to_dir -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_file_to_dir -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_file_to_dir_other_fs -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_file_to_dir_pathlike_dst -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_file_to_dir_pathlike_src -*graalpython.lib-python.3.test.test_shutil.TestMove.test_move_return_value -*graalpython.lib-python.3.test.test_shutil.TestRmTree.test_on_error -*graalpython.lib-python.3.test.test_shutil.TestRmTree.test_rmtree_does_not_choke_on_failing_lstat -*graalpython.lib-python.3.test.test_shutil.TestRmTree.test_rmtree_dont_delete_file -*graalpython.lib-python.3.test.test_shutil.TestRmTree.test_rmtree_errors -*graalpython.lib-python.3.test.test_shutil.TestRmTree.test_rmtree_fails_on_junctions -*graalpython.lib-python.3.test.test_shutil.TestRmTree.test_rmtree_fails_on_symlink -*graalpython.lib-python.3.test.test_shutil.TestRmTree.test_rmtree_on_junction -*graalpython.lib-python.3.test.test_shutil.TestRmTree.test_rmtree_on_symlink -*graalpython.lib-python.3.test.test_shutil.TestRmTree.test_rmtree_uses_safe_fd_version_if_available -*graalpython.lib-python.3.test.test_shutil.TestRmTree.test_rmtree_with_dir_fd -*graalpython.lib-python.3.test.test_shutil.TestRmTree.test_rmtree_with_dir_fd_unsupported -*graalpython.lib-python.3.test.test_shutil.TestRmTree.test_rmtree_works_on_bytes -*graalpython.lib-python.3.test.test_shutil.TestRmTree.test_rmtree_works_on_junctions -*graalpython.lib-python.3.test.test_shutil.TestRmTree.test_rmtree_works_on_symlinks -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_chown -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copy -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copy2 -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copy2_symlinks -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copy2_xattr -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copy_return_value -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copy_symlinks -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copyfile_named_pipe -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copyfile_return_value -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copyfile_same_file -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copyfile_symlinks -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copymode_follow_symlinks -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copymode_symlink_to_symlink -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copymode_symlink_to_symlink_wo_lchmod -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copystat_handles_harmless_chflags_errors -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copystat_symlinks -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copytree_arg_types_of_ignore -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copytree_custom_copy_function -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copytree_dangling_symlinks -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copytree_dirs_exist_ok -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copytree_named_pipe -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copytree_retains_permissions -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copytree_return_value -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copytree_simple -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copytree_special_func -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copytree_subdirectory -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copytree_symlink_dir -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copytree_symlinks -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copytree_winerror -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copytree_with_exclude -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copyxattr -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_copyxattr_symlinks -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_disk_usage -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_dont_copy_file_onto_link_to_itself -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_dont_copy_file_onto_symlink_to_itself -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_make_archive -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_make_archive_cwd -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_make_archive_owner_group -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_make_tarball -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_make_tarfile_in_curdir -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_make_zipfile -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_make_zipfile_in_curdir -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_on_error -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_register_archive_format -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_rmtree_does_not_choke_on_failing_lstat -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_rmtree_dont_delete_file -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_rmtree_errors -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_rmtree_fails_on_junctions -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_rmtree_fails_on_symlink -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_rmtree_on_junction -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_rmtree_on_symlink -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_rmtree_uses_safe_fd_version_if_available -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_rmtree_works_on_bytes -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_rmtree_works_on_junctions -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_rmtree_works_on_symlinks -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_tarfile_root_owner -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_tarfile_vs_tar -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_unpack_archive_bztar -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_unpack_archive_gztar -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_unpack_archive_tar -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_unpack_archive_xztar -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_unpack_archive_zip -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_unpack_registry -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_unzip_zipfile -*graalpython.lib-python.3.test.test_shutil.TestShutil.test_zipfile_vs_zip -*graalpython.lib-python.3.test.test_shutil.TestWhich.test_absolute_cmd -*graalpython.lib-python.3.test.test_shutil.TestWhich.test_basic -*graalpython.lib-python.3.test.test_shutil.TestWhich.test_cwd -*graalpython.lib-python.3.test.test_shutil.TestWhich.test_empty_path -*graalpython.lib-python.3.test.test_shutil.TestWhich.test_empty_path_no_PATH -*graalpython.lib-python.3.test.test_shutil.TestWhich.test_environ_path -*graalpython.lib-python.3.test.test_shutil.TestWhich.test_environ_path_cwd -*graalpython.lib-python.3.test.test_shutil.TestWhich.test_environ_path_empty -*graalpython.lib-python.3.test.test_shutil.TestWhich.test_environ_path_missing -*graalpython.lib-python.3.test.test_shutil.TestWhich.test_non_matching_mode -*graalpython.lib-python.3.test.test_shutil.TestWhich.test_nonexistent_file -*graalpython.lib-python.3.test.test_shutil.TestWhich.test_pathext -*graalpython.lib-python.3.test.test_shutil.TestWhich.test_pathext_checking -*graalpython.lib-python.3.test.test_shutil.TestWhich.test_pathext_with_empty_str -*graalpython.lib-python.3.test.test_shutil.TestWhich.test_relative_cmd -*graalpython.lib-python.3.test.test_shutil.TestWhich.test_relative_path -*graalpython.lib-python.3.test.test_shutil.TestWhichBytes.test_absolute_cmd -*graalpython.lib-python.3.test.test_shutil.TestWhichBytes.test_basic -*graalpython.lib-python.3.test.test_shutil.TestWhichBytes.test_cwd -*graalpython.lib-python.3.test.test_shutil.TestWhichBytes.test_empty_path -*graalpython.lib-python.3.test.test_shutil.TestWhichBytes.test_empty_path_no_PATH -*graalpython.lib-python.3.test.test_shutil.TestWhichBytes.test_environ_path -*graalpython.lib-python.3.test.test_shutil.TestWhichBytes.test_environ_path_cwd -*graalpython.lib-python.3.test.test_shutil.TestWhichBytes.test_environ_path_empty -*graalpython.lib-python.3.test.test_shutil.TestWhichBytes.test_environ_path_missing -*graalpython.lib-python.3.test.test_shutil.TestWhichBytes.test_non_matching_mode -*graalpython.lib-python.3.test.test_shutil.TestWhichBytes.test_nonexistent_file -*graalpython.lib-python.3.test.test_shutil.TestWhichBytes.test_pathext -*graalpython.lib-python.3.test.test_shutil.TestWhichBytes.test_pathext_checking -*graalpython.lib-python.3.test.test_shutil.TestWhichBytes.test_pathext_with_empty_str -*graalpython.lib-python.3.test.test_shutil.TestWhichBytes.test_relative_cmd -*graalpython.lib-python.3.test.test_shutil.TestWhichBytes.test_relative_path -*graalpython.lib-python.3.test.test_shutil.TestZeroCopyMACOS.test_non_existent_src -*graalpython.lib-python.3.test.test_shutil.TestZeroCopySendfile.test_big_chunk -*graalpython.lib-python.3.test.test_shutil.TestZeroCopySendfile.test_blocksize_arg -*graalpython.lib-python.3.test.test_shutil.TestZeroCopySendfile.test_cant_get_size -*graalpython.lib-python.3.test.test_shutil.TestZeroCopySendfile.test_empty_file -*graalpython.lib-python.3.test.test_shutil.TestZeroCopySendfile.test_exception_on_first_call -*graalpython.lib-python.3.test.test_shutil.TestZeroCopySendfile.test_exception_on_second_call -*graalpython.lib-python.3.test.test_shutil.TestZeroCopySendfile.test_file2file_not_supported -*graalpython.lib-python.3.test.test_shutil.TestZeroCopySendfile.test_filesystem_full -*graalpython.lib-python.3.test.test_shutil.TestZeroCopySendfile.test_non_existent_src -*graalpython.lib-python.3.test.test_shutil.TestZeroCopySendfile.test_non_regular_file_dst -*graalpython.lib-python.3.test.test_shutil.TestZeroCopySendfile.test_non_regular_file_src -*graalpython.lib-python.3.test.test_shutil.TestZeroCopySendfile.test_regular_copy -*graalpython.lib-python.3.test.test_shutil.TestZeroCopySendfile.test_same_file -*graalpython.lib-python.3.test.test_shutil.TestZeroCopySendfile.test_small_chunks -*graalpython.lib-python.3.test.test_shutil.TestZeroCopySendfile.test_unhandled_exception +test.test_shutil.PublicAPITests.test_module_all_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestArchives.test_make_archive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestArchives.test_make_archive_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestArchives.test_make_archive_owner_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestArchives.test_make_tarball @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestArchives.test_make_tarfile_in_curdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestArchives.test_make_tarfile_rootdir_nodir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestArchives.test_make_zipfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestArchives.test_make_zipfile_in_curdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestArchives.test_make_zipfile_rootdir_nodir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestArchives.test_register_archive_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestArchives.test_tarfile_vs_tar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestArchives.test_unpack_archive_bztar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestArchives.test_unpack_archive_gztar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestArchives.test_unpack_archive_tar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestArchives.test_unpack_archive_xztar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestArchives.test_unpack_archive_zip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestArchives.test_unpack_registry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestArchives.test_unzip_zipfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestArchives.test_zipfile_vs_zip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestCopy.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopy.test_copy2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopy.test_copy2_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopy.test_copy2_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestCopy.test_copy_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopy.test_copy_return_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopy.test_copy_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestCopy.test_copyfile_copy_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopy.test_copyfile_nonexistent_dir @ linux-aarch64,linux-x86_64 +test.test_shutil.TestCopy.test_copyfile_return_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopy.test_copyfile_same_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopy.test_copyfile_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestCopy.test_copymode_follow_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestCopy.test_copymode_symlink_to_symlink_wo_lchmod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopy.test_copystat_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopy.test_dont_copy_file_onto_link_to_itself @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestCopy.test_dont_copy_file_onto_symlink_to_itself @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopyFile.test_w_dest_close_fails @ linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopyFile.test_w_dest_open_fails @ linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopyFile.test_w_source_close_fails @ linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopyFile.test_w_source_open_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopyFileObj.test_content @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopyFileObj.test_file_not_closed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopyFileObj.test_file_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopyFileObj.test_win_impl @ win32-AMD64 +test.test_shutil.TestCopyTree.test_copytree_arg_types_of_ignore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopyTree.test_copytree_custom_copy_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopyTree.test_copytree_dangling_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestCopyTree.test_copytree_dirs_exist_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopyTree.test_copytree_retains_permissions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopyTree.test_copytree_return_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopyTree.test_copytree_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopyTree.test_copytree_special_func @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopyTree.test_copytree_subdirectory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopyTree.test_copytree_symlink_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestCopyTree.test_copytree_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestCopyTree.test_copytree_winerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestCopyTree.test_copytree_with_exclude @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestGetTerminalSize.test_bad_environ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestGetTerminalSize.test_does_not_crash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestGetTerminalSize.test_fallback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestGetTerminalSize.test_os_environ_first @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMisc.test_disk_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestMove.test_destinsrc_false_negative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMove.test_destinsrc_false_positive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMove.test_dont_move_dir_in_itself @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMove.test_existing_file_inside_dest_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMove.test_move_as_rename_return_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMove.test_move_dangling_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestMove.test_move_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMove.test_move_dir_altsep_to_dir @ win32-AMD64 +test.test_shutil.TestMove.test_move_dir_caseinsensitive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestMove.test_move_dir_other_fs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMove.test_move_dir_sep_to_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMove.test_move_dir_special_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMove.test_move_dir_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestMove.test_move_dir_to_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMove.test_move_dir_to_dir_other_fs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMove.test_move_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMove.test_move_file_other_fs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMove.test_move_file_special_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMove.test_move_file_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestMove.test_move_file_symlink_to_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestMove.test_move_file_to_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMove.test_move_file_to_dir_other_fs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMove.test_move_file_to_dir_pathlike_dst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMove.test_move_file_to_dir_pathlike_src @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestMove.test_move_return_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestRmTree.test_on_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestRmTree.test_rmtree_does_not_choke_on_failing_lstat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestRmTree.test_rmtree_dont_delete_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestRmTree.test_rmtree_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestRmTree.test_rmtree_fails_on_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestRmTree.test_rmtree_on_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestRmTree.test_rmtree_uses_safe_fd_version_if_available @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestRmTree.test_rmtree_with_dir_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestRmTree.test_rmtree_with_dir_fd_unsupported @ win32-AMD64 +test.test_shutil.TestRmTree.test_rmtree_works_on_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestRmTree.test_rmtree_works_on_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhich.test_absolute_cmd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhich.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhich.test_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhich.test_empty_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhich.test_empty_path_no_PATH @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhich.test_environ_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhich.test_environ_path_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhich.test_environ_path_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhich.test_environ_path_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhich.test_non_matching_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestWhich.test_nonexistent_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhich.test_pathext @ win32-AMD64 +test.test_shutil.TestWhich.test_pathext_checking @ win32-AMD64 +test.test_shutil.TestWhich.test_pathext_with_empty_str @ win32-AMD64 +test.test_shutil.TestWhich.test_relative_cmd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhich.test_relative_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhichBytes.test_absolute_cmd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhichBytes.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhichBytes.test_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhichBytes.test_empty_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhichBytes.test_empty_path_no_PATH @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhichBytes.test_environ_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhichBytes.test_environ_path_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhichBytes.test_environ_path_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhichBytes.test_environ_path_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhichBytes.test_non_matching_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_shutil.TestWhichBytes.test_nonexistent_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhichBytes.test_pathext @ win32-AMD64 +test.test_shutil.TestWhichBytes.test_pathext_checking @ win32-AMD64 +test.test_shutil.TestWhichBytes.test_pathext_with_empty_str @ win32-AMD64 +test.test_shutil.TestWhichBytes.test_relative_cmd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestWhichBytes.test_relative_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_shutil.TestZeroCopyMACOS.test_non_existent_src @ darwin-arm64,darwin-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_signal.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_signal.txt index 95091bedac..6436d1abbf 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_signal.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_signal.txt @@ -1,26 +1,10 @@ -*graalpython.lib-python.3.test.test_signal.GenericTests.test_enums -*graalpython.lib-python.3.test.test_signal.GenericTests.test_functions_module_attr -*graalpython.lib-python.3.test.test_signal.ItimerTest.test_setitimer_tiny -*graalpython.lib-python.3.test.test_signal.PendingSignalsTests.test_pthread_kill -*graalpython.lib-python.3.test.test_signal.PendingSignalsTests.test_pthread_kill_main_thread -*graalpython.lib-python.3.test.test_signal.PendingSignalsTests.test_pthread_sigmask -*graalpython.lib-python.3.test.test_signal.PendingSignalsTests.test_pthread_sigmask_arguments -*graalpython.lib-python.3.test.test_signal.PendingSignalsTests.test_pthread_sigmask_valid_signals -*graalpython.lib-python.3.test.test_signal.PendingSignalsTests.test_sigpending -*graalpython.lib-python.3.test.test_signal.PendingSignalsTests.test_sigpending_empty -*graalpython.lib-python.3.test.test_signal.PendingSignalsTests.test_sigtimedwait -*graalpython.lib-python.3.test.test_signal.PendingSignalsTests.test_sigtimedwait_negative_timeout -*graalpython.lib-python.3.test.test_signal.PendingSignalsTests.test_sigtimedwait_poll -*graalpython.lib-python.3.test.test_signal.PendingSignalsTests.test_sigtimedwait_timeout -*graalpython.lib-python.3.test.test_signal.PendingSignalsTests.test_sigwait -*graalpython.lib-python.3.test.test_signal.PendingSignalsTests.test_sigwait_thread -*graalpython.lib-python.3.test.test_signal.PendingSignalsTests.test_sigwaitinfo -*graalpython.lib-python.3.test.test_signal.PidfdSignalTest.test_pidfd_send_signal -*graalpython.lib-python.3.test.test_signal.PosixTests.test_getsignal -*graalpython.lib-python.3.test.test_signal.PosixTests.test_setting_signal_handler_to_none_raises_error -*graalpython.lib-python.3.test.test_signal.RaiseSignalTest.test_invalid_argument -*graalpython.lib-python.3.test.test_signal.SiginterruptTest.test_siginterrupt_off -*graalpython.lib-python.3.test.test_signal.WakeupSignalTests.test_pending -*graalpython.lib-python.3.test.test_signal.WindowsSignalTests.test_issue9324 -*graalpython.lib-python.3.test.test_signal.WindowsSignalTests.test_keyboard_interrupt_exit_code -*graalpython.lib-python.3.test.test_signal.WindowsSignalTests.test_valid_signals +test.test_signal.GenericTests.test_enums @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_signal.GenericTests.test_functions_module_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_signal.ItimerTest.test_setitimer_tiny @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_signal.PosixTests.test_getsignal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_signal.PosixTests.test_setting_signal_handler_to_none_raises_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_signal.PosixTests.test_valid_signals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_signal.SiginterruptTest.test_siginterrupt_off @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +# Timeout +!test.test_signal.StressTest.test_stress_modifying_handlers @ darwin-arm64,darwin-x86_64 +test.test_signal.WindowsSignalTests.test_valid_signals @ win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_site.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_site.txt index 80fce882e0..e271aa8ea8 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_site.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_site.txt @@ -1,28 +1,26 @@ -*graalpython.lib-python.3.test.test_site.HelperFunctionsTests.test__getuserbase -*graalpython.lib-python.3.test.test_site.HelperFunctionsTests.test_addpackage -*graalpython.lib-python.3.test.test_site.HelperFunctionsTests.test_addpackage_empty_lines -*graalpython.lib-python.3.test.test_site.HelperFunctionsTests.test_addpackage_import_bad_exec -*graalpython.lib-python.3.test.test_site.HelperFunctionsTests.test_addpackage_import_bad_pth_file -*graalpython.lib-python.3.test.test_site.HelperFunctionsTests.test_addpackage_import_bad_syntax -*graalpython.lib-python.3.test.test_site.HelperFunctionsTests.test_addsitedir -*graalpython.lib-python.3.test.test_site.HelperFunctionsTests.test_get_path -*graalpython.lib-python.3.test.test_site.HelperFunctionsTests.test_getsitepackages -*graalpython.lib-python.3.test.test_site.HelperFunctionsTests.test_getuserbase -*graalpython.lib-python.3.test.test_site.HelperFunctionsTests.test_getusersitepackages -*graalpython.lib-python.3.test.test_site.HelperFunctionsTests.test_init_pathinfo -*graalpython.lib-python.3.test.test_site.HelperFunctionsTests.test_makepath -*graalpython.lib-python.3.test.test_site.HelperFunctionsTests.test_no_home_directory -*graalpython.lib-python.3.test.test_site.HelperFunctionsTests.test_s_option -*graalpython.lib-python.3.test.test_site.HelperFunctionsTests.test_trace -*graalpython.lib-python.3.test.test_site.ImportSideEffectTests.test_abs_paths_cached_None -*graalpython.lib-python.3.test.test_site.ImportSideEffectTests.test_add_build_dir -*graalpython.lib-python.3.test.test_site.ImportSideEffectTests.test_license_exists_at_url -*graalpython.lib-python.3.test.test_site.ImportSideEffectTests.test_no_duplicate_paths -*graalpython.lib-python.3.test.test_site.ImportSideEffectTests.test_setting_copyright -*graalpython.lib-python.3.test.test_site.ImportSideEffectTests.test_setting_help -*graalpython.lib-python.3.test.test_site.ImportSideEffectTests.test_setting_quit -*graalpython.lib-python.3.test.test_site.ImportSideEffectTests.test_sitecustomize_executed -*graalpython.lib-python.3.test.test_site.StartupImportTests.test_startup_interactivehook -*graalpython.lib-python.3.test.test_site.StartupImportTests.test_startup_interactivehook_isolated -*graalpython.lib-python.3.test.test_site.StartupImportTests.test_startup_interactivehook_isolated_explicit -*graalpython.lib-python.3.test.test_site._pthFileTests.test_underpth_dll_file +test.test_site.HelperFunctionsTests.test__getuserbase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.HelperFunctionsTests.test_addpackage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.HelperFunctionsTests.test_addpackage_empty_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.HelperFunctionsTests.test_addpackage_import_bad_exec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.HelperFunctionsTests.test_addpackage_import_bad_pth_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.HelperFunctionsTests.test_addpackage_import_bad_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.HelperFunctionsTests.test_addsitedir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.HelperFunctionsTests.test_get_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.HelperFunctionsTests.test_getsitepackages @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.HelperFunctionsTests.test_getuserbase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.HelperFunctionsTests.test_getusersitepackages @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.HelperFunctionsTests.test_init_pathinfo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.HelperFunctionsTests.test_makepath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.HelperFunctionsTests.test_no_home_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.HelperFunctionsTests.test_s_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.HelperFunctionsTests.test_trace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.ImportSideEffectTests.test_abs_paths_cached_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.ImportSideEffectTests.test_license_exists_at_url @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.ImportSideEffectTests.test_no_duplicate_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.ImportSideEffectTests.test_setting_copyright @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.ImportSideEffectTests.test_setting_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.ImportSideEffectTests.test_setting_quit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.ImportSideEffectTests.test_sitecustomize_executed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.StartupImportTests.test_startup_interactivehook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.StartupImportTests.test_startup_interactivehook_isolated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_site.StartupImportTests.test_startup_interactivehook_isolated_explicit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_slice.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_slice.txt index a1a5d5553c..ff90e654af 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_slice.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_slice.txt @@ -1,11 +1,10 @@ -*graalpython.lib-python.3.test.test_slice.SliceTest.test_cmp -*graalpython.lib-python.3.test.test_slice.SliceTest.test_constructor -*graalpython.lib-python.3.test.test_slice.SliceTest.test_copy -*graalpython.lib-python.3.test.test_slice.SliceTest.test_cycle -*graalpython.lib-python.3.test.test_slice.SliceTest.test_deepcopy -*graalpython.lib-python.3.test.test_slice.SliceTest.test_hash -*graalpython.lib-python.3.test.test_slice.SliceTest.test_indices -*graalpython.lib-python.3.test.test_slice.SliceTest.test_members -*graalpython.lib-python.3.test.test_slice.SliceTest.test_pickle -*graalpython.lib-python.3.test.test_slice.SliceTest.test_repr -*graalpython.lib-python.3.test.test_slice.SliceTest.test_setslice_without_getslice +test.test_slice.SliceTest.test_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_slice.SliceTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_slice.SliceTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_slice.SliceTest.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_slice.SliceTest.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_slice.SliceTest.test_indices @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_slice.SliceTest.test_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_slice.SliceTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_slice.SliceTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_slice.SliceTest.test_setslice_without_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_smtpd.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_smtpd.txt index 5a926278de..e5cdd0b599 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_smtpd.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_smtpd.txt @@ -1,153 +1,153 @@ -*graalpython.lib-python.3.test.test_smtpd.DebuggingServerTest.test_process_SMTPUTF8_message_with_enable_SMTPUTF8_true -*graalpython.lib-python.3.test.test_smtpd.DebuggingServerTest.test_process_message_with_decode_data_false -*graalpython.lib-python.3.test.test_smtpd.DebuggingServerTest.test_process_message_with_decode_data_true -*graalpython.lib-python.3.test.test_smtpd.DebuggingServerTest.test_process_message_with_enable_SMTPUTF8_true -*graalpython.lib-python.3.test.test_smtpd.MiscTestCase.test__all__ -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_DATA_syntax -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_EHLO -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_EHLO_HELO_duplicate -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_EHLO_bad_syntax -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_EHLO_duplicate -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_EXPN_not_implemented -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_HELO -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_EHLO_duplicate -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_NOOP -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_QUIT -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_RSET -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_bad_syntax -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_duplicate -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_parameter_rejected_when_extensions_not_enabled -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_HELP -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_HELP_command -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_HELP_command_unknown -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_RCPT_unknown_parameters -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_allows_space_after_colon -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_chevrons -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_command_limit_extended_with_SIZE -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_command_rejects_SMTPUTF8_by_default -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_empty_chevrons -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_invalid_size_parameter -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_missing_address -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_quoted_localpart -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_quoted_localpart_no_angles -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_quoted_localpart_with_size -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_quoted_localpart_with_size_no_angles -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_size_parameter -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_size_parameter_larger_than_default_data_size_limit -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_syntax_EHLO -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_syntax_HELO -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_NOOP -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_NOOP_bad_syntax -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_QUIT -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_QUIT_arg_ignored -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_RCPT_lowercase_to_OK -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_RCPT_syntax_EHLO -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_RCPT_syntax_HELO -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_RSET -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_RSET_syntax -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_VRFY -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_VRFY_syntax -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_attribute_deprecations -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_bad_state -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_broken_connect -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_command_too_long -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_data_dialog -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_data_longer_than_default_data_size_limit -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_data_transparency_section_4_5_2 -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_decode_data_and_enable_SMTPUTF8_raises -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_extended_MAIL_allows_space_after_colon -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_manual_status -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_missing_data -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_multiple_RCPT -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_need_MAIL -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_need_RCPT -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_nested_MAIL -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_no_HELO_DATA -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_no_HELO_MAIL -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_no_HELO_RCPT -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_server_accept -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelIPv6Test.test_unknown_command -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_DATA_syntax -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_EHLO -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_EHLO_HELO_duplicate -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_EHLO_bad_syntax -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_EHLO_duplicate -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_EXPN_not_implemented -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_HELO -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_HELO_EHLO_duplicate -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_HELO_NOOP -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_HELO_QUIT -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_HELO_RSET -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_HELO_bad_syntax -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_HELO_duplicate -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_HELO_parameter_rejected_when_extensions_not_enabled -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_HELP -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_HELP_command -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_HELP_command_unknown -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_MAIL_RCPT_unknown_parameters -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_MAIL_allows_space_after_colon -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_MAIL_chevrons -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_MAIL_command_limit_extended_with_SIZE -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_MAIL_command_rejects_SMTPUTF8_by_default -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_MAIL_empty_chevrons -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_MAIL_invalid_size_parameter -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_MAIL_missing_address -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_MAIL_quoted_localpart -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_MAIL_quoted_localpart_no_angles -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_MAIL_quoted_localpart_with_size -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_MAIL_quoted_localpart_with_size_no_angles -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_MAIL_size_parameter -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_MAIL_size_parameter_larger_than_default_data_size_limit -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_MAIL_syntax_EHLO -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_MAIL_syntax_HELO -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_NOOP -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_NOOP_bad_syntax -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_QUIT -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_QUIT_arg_ignored -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_RCPT_lowercase_to_OK -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_RCPT_syntax_EHLO -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_RCPT_syntax_HELO -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_RSET -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_RSET_syntax -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_VRFY -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_VRFY_syntax -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_attribute_deprecations -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_bad_state -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_broken_connect -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_command_too_long -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_data_dialog -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_data_longer_than_default_data_size_limit -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_data_transparency_section_4_5_2 -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_decode_data_and_enable_SMTPUTF8_raises -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_extended_MAIL_allows_space_after_colon -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_manual_status -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_missing_data -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_multiple_RCPT -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_need_MAIL -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_need_RCPT -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_nested_MAIL -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_no_HELO_DATA -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_no_HELO_MAIL -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_no_HELO_RCPT -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_server_accept -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTest.test_unknown_command -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTestWithEnableSMTPUTF8True.test_MAIL_command_accepts_SMTPUTF8_when_announced -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTestWithEnableSMTPUTF8True.test_MAIL_command_limit_extended_with_SIZE_and_SMTPUTF8 -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTestWithEnableSMTPUTF8True.test_multiple_emails_with_extended_command_length -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTestWithEnableSMTPUTF8True.test_process_smtputf8_message -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelTestWithEnableSMTPUTF8True.test_utf8_data -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelWithDataSizeLimitTest.test_data_limit_dialog -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelWithDataSizeLimitTest.test_data_limit_dialog_too_much_data -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelWithDecodeDataFalse.test_ascii_data -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelWithDecodeDataFalse.test_utf8_data -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelWithDecodeDataTrue.test_ascii_data -*graalpython.lib-python.3.test.test_smtpd.SMTPDChannelWithDecodeDataTrue.test_utf8_data -*graalpython.lib-python.3.test.test_smtpd.SMTPDServerTest.test_decode_data_and_enable_SMTPUTF8_raises -*graalpython.lib-python.3.test.test_smtpd.SMTPDServerTest.test_process_message_unimplemented -*graalpython.lib-python.3.test.test_smtpd.TestFamilyDetection.test_socket_uses_IPv4 -*graalpython.lib-python.3.test.test_smtpd.TestFamilyDetection.test_socket_uses_IPv6 -*graalpython.lib-python.3.test.test_smtpd.TestMailOptionParsing.test_with_decode_data_false -*graalpython.lib-python.3.test.test_smtpd.TestMailOptionParsing.test_with_decode_data_true -*graalpython.lib-python.3.test.test_smtpd.TestMailOptionParsing.test_with_enable_smtputf8_true -*graalpython.lib-python.3.test.test_smtpd.TestRcptOptionParsing.test_nothing_accepted -*graalpython.lib-python.3.test.test_smtpd.TestRcptOptionParsing.test_params_rejected +test.test_smtpd.DebuggingServerTest.test_process_SMTPUTF8_message_with_enable_SMTPUTF8_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.DebuggingServerTest.test_process_message_with_decode_data_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.DebuggingServerTest.test_process_message_with_decode_data_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.DebuggingServerTest.test_process_message_with_enable_SMTPUTF8_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.MiscTestCase.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_DATA_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_EHLO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_EHLO_HELO_duplicate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_EHLO_bad_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_EHLO_duplicate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_EXPN_not_implemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_EHLO_duplicate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_NOOP @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_QUIT @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_RSET @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_bad_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_duplicate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_parameter_rejected_when_extensions_not_enabled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELP @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELP_command @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELP_command_unknown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_RCPT_unknown_parameters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_allows_space_after_colon @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_chevrons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_command_limit_extended_with_SIZE @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_command_rejects_SMTPUTF8_by_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_empty_chevrons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_invalid_size_parameter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_missing_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_quoted_localpart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_quoted_localpart_no_angles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_quoted_localpart_with_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_quoted_localpart_with_size_no_angles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_size_parameter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_size_parameter_larger_than_default_data_size_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_syntax_EHLO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_syntax_HELO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_NOOP @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_NOOP_bad_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_QUIT @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_QUIT_arg_ignored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_RCPT_lowercase_to_OK @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_RCPT_syntax_EHLO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_RCPT_syntax_HELO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_RSET @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_RSET_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_VRFY @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_VRFY_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_attribute_deprecations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_bad_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_broken_connect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_command_too_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_data_dialog @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_data_longer_than_default_data_size_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_data_transparency_section_4_5_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_decode_data_and_enable_SMTPUTF8_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_extended_MAIL_allows_space_after_colon @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_manual_status @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_missing_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_multiple_RCPT @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_need_MAIL @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_need_RCPT @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_nested_MAIL @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_no_HELO_DATA @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_no_HELO_MAIL @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_no_HELO_RCPT @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_server_accept @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelIPv6Test.test_unknown_command @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_DATA_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_EHLO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_EHLO_HELO_duplicate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_EHLO_bad_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_EHLO_duplicate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_EXPN_not_implemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_HELO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_HELO_EHLO_duplicate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_HELO_NOOP @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_HELO_QUIT @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_HELO_RSET @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_HELO_bad_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_HELO_duplicate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_HELO_parameter_rejected_when_extensions_not_enabled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_HELP @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_HELP_command @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_HELP_command_unknown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_RCPT_unknown_parameters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_allows_space_after_colon @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_chevrons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_command_limit_extended_with_SIZE @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_command_rejects_SMTPUTF8_by_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_empty_chevrons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_invalid_size_parameter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_missing_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_quoted_localpart @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_quoted_localpart_no_angles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_quoted_localpart_with_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_quoted_localpart_with_size_no_angles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_size_parameter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_size_parameter_larger_than_default_data_size_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_syntax_EHLO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_syntax_HELO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_NOOP @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_NOOP_bad_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_QUIT @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_QUIT_arg_ignored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_RCPT_lowercase_to_OK @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_RCPT_syntax_EHLO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_RCPT_syntax_HELO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_RSET @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_RSET_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_VRFY @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_VRFY_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_attribute_deprecations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_bad_state @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_broken_connect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_command_too_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_data_dialog @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_data_longer_than_default_data_size_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_data_transparency_section_4_5_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_decode_data_and_enable_SMTPUTF8_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_extended_MAIL_allows_space_after_colon @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_manual_status @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_missing_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_multiple_RCPT @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_need_MAIL @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_need_RCPT @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_nested_MAIL @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_no_HELO_DATA @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_no_HELO_MAIL @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_no_HELO_RCPT @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_server_accept @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTest.test_unknown_command @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTestWithEnableSMTPUTF8True.test_MAIL_command_accepts_SMTPUTF8_when_announced @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTestWithEnableSMTPUTF8True.test_MAIL_command_limit_extended_with_SIZE_and_SMTPUTF8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTestWithEnableSMTPUTF8True.test_multiple_emails_with_extended_command_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTestWithEnableSMTPUTF8True.test_process_smtputf8_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelTestWithEnableSMTPUTF8True.test_utf8_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelWithDataSizeLimitTest.test_data_limit_dialog @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelWithDataSizeLimitTest.test_data_limit_dialog_too_much_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelWithDecodeDataFalse.test_ascii_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelWithDecodeDataFalse.test_utf8_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelWithDecodeDataTrue.test_ascii_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDChannelWithDecodeDataTrue.test_utf8_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDServerTest.test_decode_data_and_enable_SMTPUTF8_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.SMTPDServerTest.test_process_message_unimplemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.TestFamilyDetection.test_socket_uses_IPv4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.TestFamilyDetection.test_socket_uses_IPv6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.TestMailOptionParsing.test_with_decode_data_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.TestMailOptionParsing.test_with_decode_data_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.TestMailOptionParsing.test_with_enable_smtputf8_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.TestRcptOptionParsing.test_nothing_accepted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtpd.TestRcptOptionParsing.test_params_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_smtplib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_smtplib.txt index 2d71c9e979..f9e68b0604 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_smtplib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_smtplib.txt @@ -1,92 +1,82 @@ -*graalpython.lib-python.3.test.test_smtplib.BadHELOServerTests.testFailingHELO -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testBasic -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testELHO -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testEXPNNotImplemented -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testHELP -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testNOOP -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testRSET -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testSecondHELO -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testSend -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testSendBinary -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testSendMessage -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testSendMessageMultipleResentRaises -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testSendMessageResent -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testSendMessageWithAddresses -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testSendMessageWithMultipleFrom -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testSendMessageWithSomeAddresses -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testSendMessageWithSpecifiedAddresses -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testSendNeedingDotQuote -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testSendNullSender -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testSourceAddress -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.testVRFY -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.test_issue43124_escape_localhostname -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.test_issue43124_escape_options -*graalpython.lib-python.3.test.test_smtplib.DebuggingServerTests.test_issue43124_putcmd_escapes_newline -*graalpython.lib-python.3.test.test_smtplib.DefaultArgumentsTests.testSendMessage -*graalpython.lib-python.3.test.test_smtplib.DefaultArgumentsTests.testSendMessageWithMailOptions -*graalpython.lib-python.3.test.test_smtplib.GeneralTests.testBasic1 -*graalpython.lib-python.3.test.test_smtplib.GeneralTests.testBasic2 -*graalpython.lib-python.3.test.test_smtplib.GeneralTests.testLocalHostName -*graalpython.lib-python.3.test.test_smtplib.GeneralTests.testQuoteData -*graalpython.lib-python.3.test.test_smtplib.GeneralTests.testSourceAddress -*graalpython.lib-python.3.test.test_smtplib.GeneralTests.testTimeoutDefault -*graalpython.lib-python.3.test.test_smtplib.GeneralTests.testTimeoutNone -*graalpython.lib-python.3.test.test_smtplib.GeneralTests.testTimeoutValue -*graalpython.lib-python.3.test.test_smtplib.GeneralTests.test_debuglevel -*graalpython.lib-python.3.test.test_smtplib.GeneralTests.test_debuglevel_2 -*graalpython.lib-python.3.test.test_smtplib.LMTPGeneralTests.testBasic1 -*graalpython.lib-python.3.test.test_smtplib.LMTPGeneralTests.testBasic2 -*graalpython.lib-python.3.test.test_smtplib.LMTPGeneralTests.testLocalHostName -*graalpython.lib-python.3.test.test_smtplib.LMTPGeneralTests.testQuoteData -*graalpython.lib-python.3.test.test_smtplib.LMTPGeneralTests.testSourceAddress -*graalpython.lib-python.3.test.test_smtplib.LMTPGeneralTests.testTimeoutDefault -*graalpython.lib-python.3.test.test_smtplib.LMTPGeneralTests.testTimeoutNone -*graalpython.lib-python.3.test.test_smtplib.LMTPGeneralTests.testTimeoutValue -*graalpython.lib-python.3.test.test_smtplib.LMTPGeneralTests.testTimeoutZero -*graalpython.lib-python.3.test.test_smtplib.LMTPGeneralTests.testUnixDomainSocketTimeoutDefault -*graalpython.lib-python.3.test.test_smtplib.LMTPGeneralTests.test_debuglevel -*graalpython.lib-python.3.test.test_smtplib.LMTPGeneralTests.test_debuglevel_2 -*graalpython.lib-python.3.test.test_smtplib.NonConnectingTests.testNonnumericPort -*graalpython.lib-python.3.test.test_smtplib.NonConnectingTests.testNotConnected -*graalpython.lib-python.3.test.test_smtplib.NonConnectingTests.testSockAttributeExists -*graalpython.lib-python.3.test.test_smtplib.SMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_auth -*graalpython.lib-python.3.test.test_smtplib.SMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_login -*graalpython.lib-python.3.test.test_smtplib.SMTPGeneralTests.testBasic1 -*graalpython.lib-python.3.test.test_smtplib.SMTPGeneralTests.testBasic2 -*graalpython.lib-python.3.test.test_smtplib.SMTPGeneralTests.testLocalHostName -*graalpython.lib-python.3.test.test_smtplib.SMTPGeneralTests.testQuoteData -*graalpython.lib-python.3.test.test_smtplib.SMTPGeneralTests.testSourceAddress -*graalpython.lib-python.3.test.test_smtplib.SMTPGeneralTests.testTimeoutDefault -*graalpython.lib-python.3.test.test_smtplib.SMTPGeneralTests.testTimeoutNone -*graalpython.lib-python.3.test.test_smtplib.SMTPGeneralTests.testTimeoutValue -*graalpython.lib-python.3.test.test_smtplib.SMTPGeneralTests.testTimeoutZero -*graalpython.lib-python.3.test.test_smtplib.SMTPGeneralTests.test_debuglevel -*graalpython.lib-python.3.test.test_smtplib.SMTPGeneralTests.test_debuglevel_2 -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.testAUTH_BUGGY -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.testAUTH_CRAM_MD5 -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.testAUTH_LOGIN -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.testAUTH_LOGIN_initial_response_notok -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.testAUTH_LOGIN_initial_response_ok -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.testAUTH_PLAIN -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.testAUTH_multiple -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.testBasic -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.testEHLO -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.testEXPN -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.testVRFY -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.test_421_from_data_cmd -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.test_421_from_mail_cmd -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.test_421_from_rcpt_cmd -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.test__rest_from_mail_cmd -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.test_auth_function -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.test_name_field_not_included_in_envelop_addresses -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.test_quit_resets_greeting -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.test_send_message_error_on_non_ascii_addrs_if_no_smtputf8 -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.test_send_unicode_without_SMTPUTF8 -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.test_smtputf8_NotSupportedError_if_no_server_support -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.test_with_statement -*graalpython.lib-python.3.test.test_smtplib.SMTPSimTests.test_with_statement_QUIT_failure -*graalpython.lib-python.3.test.test_smtplib.SMTPUTF8SimTests.test_send_message_uses_smtputf8_if_addrs_non_ascii -*graalpython.lib-python.3.test.test_smtplib.SMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_low_level_API -*graalpython.lib-python.3.test.test_smtplib.SMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_sendmail -*graalpython.lib-python.3.test.test_smtplib.SMTPUTF8SimTests.test_test_server_supports_extensions -*graalpython.lib-python.3.test.test_smtplib.TooLongLineTests.testLineTooLong +test.test_smtplib.BadHELOServerTests.testFailingHELO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testBasic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testELHO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testEXPNNotImplemented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testHELP @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testNOOP @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testRSET @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testSecondHELO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testSend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testSendBinary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testSendMessage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testSendMessageMultipleResentRaises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testSendMessageResent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testSendMessageWithAddresses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testSendMessageWithMultipleFrom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testSendMessageWithSomeAddresses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testSendMessageWithSpecifiedAddresses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testSendNeedingDotQuote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testSendNullSender @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.testSourceAddress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_smtplib.DebuggingServerTests.testVRFY @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.test_issue43124_escape_localhostname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.test_issue43124_escape_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DebuggingServerTests.test_issue43124_putcmd_escapes_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DefaultArgumentsTests.testSendMessage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.DefaultArgumentsTests.testSendMessageWithMailOptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.LMTPGeneralTests.testBasic1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.LMTPGeneralTests.testBasic2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.LMTPGeneralTests.testLocalHostName @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.LMTPGeneralTests.testQuoteData @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.LMTPGeneralTests.testSourceAddress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.LMTPGeneralTests.testTimeoutDefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.LMTPGeneralTests.testTimeoutNone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.LMTPGeneralTests.testTimeoutValue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.LMTPGeneralTests.testTimeoutZero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.LMTPGeneralTests.testUnixDomainSocketTimeoutDefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_smtplib.LMTPGeneralTests.test_debuglevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.LMTPGeneralTests.test_debuglevel_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.NonConnectingTests.testNonnumericPort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.NonConnectingTests.testNotConnected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.NonConnectingTests.testSockAttributeExists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_auth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_login @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPGeneralTests.testBasic1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPGeneralTests.testBasic2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPGeneralTests.testLocalHostName @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPGeneralTests.testQuoteData @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPGeneralTests.testSourceAddress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPGeneralTests.testTimeoutDefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPGeneralTests.testTimeoutNone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPGeneralTests.testTimeoutValue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPGeneralTests.testTimeoutZero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPGeneralTests.test_debuglevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPGeneralTests.test_debuglevel_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.testAUTH_BUGGY @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.testAUTH_CRAM_MD5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.testAUTH_LOGIN @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.testAUTH_LOGIN_initial_response_notok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.testAUTH_LOGIN_initial_response_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.testAUTH_PLAIN @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.testAUTH_multiple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.testBasic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.testEHLO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.testEXPN @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.testVRFY @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.test_421_from_data_cmd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.test_421_from_mail_cmd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.test_421_from_rcpt_cmd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.test__rest_from_mail_cmd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.test_auth_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.test_name_field_not_included_in_envelop_addresses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.test_quit_resets_greeting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.test_send_message_error_on_non_ascii_addrs_if_no_smtputf8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.test_send_unicode_without_SMTPUTF8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.test_smtputf8_NotSupportedError_if_no_server_support @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.test_with_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPSimTests.test_with_statement_QUIT_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPUTF8SimTests.test_send_message_uses_smtputf8_if_addrs_non_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_low_level_API @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_sendmail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.SMTPUTF8SimTests.test_test_server_supports_extensions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_smtplib.TooLongLineTests.testLineTooLong @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_smtpnet.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_smtpnet.txt deleted file mode 100644 index d51fcdff98..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_smtpnet.txt +++ /dev/null @@ -1,5 +0,0 @@ -*graalpython.lib-python.3.test.test_smtpnet.SmtpSSLTest.test_connect -*graalpython.lib-python.3.test.test_smtpnet.SmtpSSLTest.test_connect_default_port -*graalpython.lib-python.3.test.test_smtpnet.SmtpSSLTest.test_connect_using_sslcontext -*graalpython.lib-python.3.test.test_smtpnet.SmtpSSLTest.test_connect_using_sslcontext_verified -*graalpython.lib-python.3.test.test_smtpnet.SmtpTest.test_connect_starttls diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sndhdr.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sndhdr.txt index cf07b71ff3..568da87282 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sndhdr.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sndhdr.txt @@ -1,2 +1,2 @@ -*graalpython.lib-python.3.test.test_sndhdr.TestFormats.test_data -*graalpython.lib-python.3.test.test_sndhdr.TestFormats.test_pickleable +test.test_sndhdr.TestFormats.test_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sndhdr.TestFormats.test_pickleable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_socket.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_socket.txt index ffe7dd6a4d..9eaa901f44 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_socket.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_socket.txt @@ -1,830 +1,220 @@ -*graalpython.lib-python.3.test.test_socket.BasicBluetoothTest.testBluetoothConstants -*graalpython.lib-python.3.test.test_socket.BasicBluetoothTest.testCreateHciSocket -*graalpython.lib-python.3.test.test_socket.BasicBluetoothTest.testCreateL2capSocket -*graalpython.lib-python.3.test.test_socket.BasicBluetoothTest.testCreateRfcommSocket -*graalpython.lib-python.3.test.test_socket.BasicBluetoothTest.testCreateScoSocket -*graalpython.lib-python.3.test.test_socket.BasicCANTest.testBCMConstants -*graalpython.lib-python.3.test.test_socket.BasicCANTest.testBindAny -*graalpython.lib-python.3.test.test_socket.BasicCANTest.testCreateBCMSocket -*graalpython.lib-python.3.test.test_socket.BasicCANTest.testCreateSocket -*graalpython.lib-python.3.test.test_socket.BasicCANTest.testCrucialConstants -*graalpython.lib-python.3.test.test_socket.BasicCANTest.testFilter -*graalpython.lib-python.3.test.test_socket.BasicCANTest.testLoopback -*graalpython.lib-python.3.test.test_socket.BasicCANTest.testTooLongInterfaceName -*graalpython.lib-python.3.test.test_socket.BasicQIPCRTRTest.testAutoBindSock -*graalpython.lib-python.3.test.test_socket.BasicQIPCRTRTest.testBindSock -*graalpython.lib-python.3.test.test_socket.BasicQIPCRTRTest.testCreateSocket -*graalpython.lib-python.3.test.test_socket.BasicQIPCRTRTest.testCrucialConstants -*graalpython.lib-python.3.test.test_socket.BasicQIPCRTRTest.testInvalidBindSock -*graalpython.lib-python.3.test.test_socket.BasicQIPCRTRTest.testUnbound -*graalpython.lib-python.3.test.test_socket.BasicRDSTest.testCreateSocket -*graalpython.lib-python.3.test.test_socket.BasicRDSTest.testCrucialConstants -*graalpython.lib-python.3.test.test_socket.BasicRDSTest.testSocketBufferSize -*graalpython.lib-python.3.test.test_socket.BasicSocketPairTest.testDefaults -*graalpython.lib-python.3.test.test_socket.BasicSocketPairTest.testRecv -*graalpython.lib-python.3.test.test_socket.BasicSocketPairTest.testSend -*graalpython.lib-python.3.test.test_socket.BasicTCPTest.testDetach -*graalpython.lib-python.3.test.test_socket.BasicTCPTest.testDup -*graalpython.lib-python.3.test.test_socket.BasicTCPTest.testFromFd -*graalpython.lib-python.3.test.test_socket.BasicTCPTest.testOverFlowRecv -*graalpython.lib-python.3.test.test_socket.BasicTCPTest.testOverFlowRecvFrom -*graalpython.lib-python.3.test.test_socket.BasicTCPTest.testRecv -*graalpython.lib-python.3.test.test_socket.BasicTCPTest.testRecvFrom -*graalpython.lib-python.3.test.test_socket.BasicTCPTest.testSendAll -*graalpython.lib-python.3.test.test_socket.BasicTCPTest.testShutdown -*graalpython.lib-python.3.test.test_socket.BasicTCPTest.testShutdown_overflow -*graalpython.lib-python.3.test.test_socket.BasicTCPTest2.testDetach -*graalpython.lib-python.3.test.test_socket.BasicTCPTest2.testDup -*graalpython.lib-python.3.test.test_socket.BasicTCPTest2.testFromFd -*graalpython.lib-python.3.test.test_socket.BasicTCPTest2.testOverFlowRecv -*graalpython.lib-python.3.test.test_socket.BasicTCPTest2.testOverFlowRecvFrom -*graalpython.lib-python.3.test.test_socket.BasicTCPTest2.testRecv -*graalpython.lib-python.3.test.test_socket.BasicTCPTest2.testRecvFrom -*graalpython.lib-python.3.test.test_socket.BasicTCPTest2.testSendAll -*graalpython.lib-python.3.test.test_socket.BasicTCPTest2.testShutdown -*graalpython.lib-python.3.test.test_socket.BasicTCPTest2.testShutdown_overflow -*graalpython.lib-python.3.test.test_socket.BasicUDPLITETest.testRecvFrom -*graalpython.lib-python.3.test.test_socket.BasicUDPLITETest.testRecvFromNegative -*graalpython.lib-python.3.test.test_socket.BasicUDPLITETest.testSendtoAndRecv -*graalpython.lib-python.3.test.test_socket.BasicUDPTest.testRecvFrom -*graalpython.lib-python.3.test.test_socket.BasicUDPTest.testRecvFromNegative -*graalpython.lib-python.3.test.test_socket.BasicUDPTest.testSendtoAndRecv -*graalpython.lib-python.3.test.test_socket.BasicVSOCKTest.testCreateSocket -*graalpython.lib-python.3.test.test_socket.BasicVSOCKTest.testCrucialConstants -*graalpython.lib-python.3.test.test_socket.BasicVSOCKTest.testSocketBufferSize -*graalpython.lib-python.3.test.test_socket.BasicVSOCKTest.testVSOCKConstants -*graalpython.lib-python.3.test.test_socket.BufferIOTest.testRecvFromIntoArray -*graalpython.lib-python.3.test.test_socket.BufferIOTest.testRecvFromIntoBytearray -*graalpython.lib-python.3.test.test_socket.BufferIOTest.testRecvFromIntoEmptyBuffer -*graalpython.lib-python.3.test.test_socket.BufferIOTest.testRecvFromIntoMemoryview -*graalpython.lib-python.3.test.test_socket.BufferIOTest.testRecvFromIntoSmallBuffer -*graalpython.lib-python.3.test.test_socket.BufferIOTest.testRecvIntoArray -*graalpython.lib-python.3.test.test_socket.BufferIOTest.testRecvIntoBytearray -*graalpython.lib-python.3.test.test_socket.BufferIOTest.testRecvIntoMemoryview -*graalpython.lib-python.3.test.test_socket.CANTest.testBCM -*graalpython.lib-python.3.test.test_socket.CANTest.testSendFrame -*graalpython.lib-python.3.test.test_socket.CANTest.testSendMaxFrame -*graalpython.lib-python.3.test.test_socket.CANTest.testSendMultiFrames -*graalpython.lib-python.3.test.test_socket.CmsgMacroTests.testCMSG_LEN -*graalpython.lib-python.3.test.test_socket.CmsgMacroTests.testCMSG_SPACE -*graalpython.lib-python.3.test.test_socket.ContextManagersTest.testCreateConnectionBase -*graalpython.lib-python.3.test.test_socket.ContextManagersTest.testCreateConnectionClose -*graalpython.lib-python.3.test.test_socket.CreateServerFunctionalTest.test_dual_stack_client_v4 -*graalpython.lib-python.3.test.test_socket.CreateServerFunctionalTest.test_dual_stack_client_v6 -*graalpython.lib-python.3.test.test_socket.CreateServerFunctionalTest.test_tcp4 -*graalpython.lib-python.3.test.test_socket.CreateServerFunctionalTest.test_tcp6 -*graalpython.lib-python.3.test.test_socket.CreateServerTest.test_address -*graalpython.lib-python.3.test.test_socket.CreateServerTest.test_dualstack_ipv6_family -*graalpython.lib-python.3.test.test_socket.CreateServerTest.test_family_and_type -*graalpython.lib-python.3.test.test_socket.CreateServerTest.test_ipv6_only_default -*graalpython.lib-python.3.test.test_socket.CreateServerTest.test_reuse_port -*graalpython.lib-python.3.test.test_socket.FileObjectClassTestCase.testAttributes -*graalpython.lib-python.3.test.test_socket.FileObjectClassTestCase.testCloseAfterMakefile -*graalpython.lib-python.3.test.test_socket.FileObjectClassTestCase.testClosedAttr -*graalpython.lib-python.3.test.test_socket.FileObjectClassTestCase.testFullRead -*graalpython.lib-python.3.test.test_socket.FileObjectClassTestCase.testMakefileAfterMakefileClose -*graalpython.lib-python.3.test.test_socket.FileObjectClassTestCase.testReadAfterTimeout -*graalpython.lib-python.3.test.test_socket.FileObjectClassTestCase.testReadline -*graalpython.lib-python.3.test.test_socket.FileObjectClassTestCase.testRealClose -*graalpython.lib-python.3.test.test_socket.FileObjectClassTestCase.testSmallRead -*graalpython.lib-python.3.test.test_socket.FileObjectClassTestCase.testUnbufferedRead -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testCloseException -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testCrucialConstants -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testCrucialIpProtoConstants -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testDefaultTimeout -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testGetServBy -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testGetSockOpt -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testHostnameRes -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testIPv4_inet_aton_fourbytes -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testIPv4toString -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testIPv6toString -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testInterfaceNameIndex -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testInterpreterCrash -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testInvalidInterfaceIndexToName -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testInvalidInterfaceNameToIndex -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testNewAttributes -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testNtoH -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testNtoHErrors -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testRefCountGetNameInfo -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testSendAfterClose -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testSendtoErrors -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testSetSockOpt -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testSockName -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testSocketError -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testStringToIPv4 -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testStringToIPv6 -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.testWindowsSpecificConstants -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_SocketType_is_socketobject -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test__sendfile_use_sendfile -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_addressfamily_enum -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_addressinfo_enum -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_csocket_repr -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_dealloc_warn -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_flowinfo -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_getaddrinfo_ipv6_basic -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_getaddrinfo_ipv6_scopeid_numeric -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_getaddrinfo_ipv6_scopeid_symbolic -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_getfqdn_filter_localhost -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_getnameinfo -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_getnameinfo_ipv6_scopeid_numeric -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_getnameinfo_ipv6_scopeid_symbolic -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_getsockaddrarg -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_host_resolution -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_host_resolution_bad_address -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_idna -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_listen_backlog -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_listen_backlog_overflow -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_makefile_invalid_mode -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_makefile_mode -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_msgflag_enum -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_name_closed_socketio -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_pickle -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_repr -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_sendall_interrupted -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_sendall_interrupted_with_timeout -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_sethostname -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_sio_loopback_fast_path -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_sock_ioctl -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_socket_close -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_socket_consistent_sock_type -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_socket_fileno -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_socket_fileno_rejects_float -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_socket_fileno_rejects_invalid_socket -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_socket_fileno_rejects_negative -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_socket_fileno_rejects_other_types -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_socket_fileno_requires_socket_fd -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_socket_fileno_requires_valid_fd -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_socket_methods -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_socketkind_enum -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_str_for_enums -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_unknown_socket_family_repr -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_unusable_closed_socketio -*graalpython.lib-python.3.test.test_socket.GeneralModuleTests.test_weakref -*graalpython.lib-python.3.test.test_socket.ISOTPTest.testBind -*graalpython.lib-python.3.test.test_socket.ISOTPTest.testCreateISOTPSocket -*graalpython.lib-python.3.test.test_socket.ISOTPTest.testCreateSocket -*graalpython.lib-python.3.test.test_socket.ISOTPTest.testCrucialConstants -*graalpython.lib-python.3.test.test_socket.ISOTPTest.testTooLongInterfaceName -*graalpython.lib-python.3.test.test_socket.InheritanceTest.test_SOCK_CLOEXEC -*graalpython.lib-python.3.test.test_socket.InheritanceTest.test_default_inheritable -*graalpython.lib-python.3.test.test_socket.InheritanceTest.test_dup -*graalpython.lib-python.3.test.test_socket.InheritanceTest.test_set_inheritable -*graalpython.lib-python.3.test.test_socket.InheritanceTest.test_socketpair -*graalpython.lib-python.3.test.test_socket.InterruptedRecvTimeoutTest.testInterruptedRecvIntoTimeout -*graalpython.lib-python.3.test.test_socket.InterruptedRecvTimeoutTest.testInterruptedRecvTimeout -*graalpython.lib-python.3.test.test_socket.InterruptedRecvTimeoutTest.testInterruptedRecvfromIntoTimeout -*graalpython.lib-python.3.test.test_socket.InterruptedRecvTimeoutTest.testInterruptedRecvfromTimeout -*graalpython.lib-python.3.test.test_socket.InterruptedRecvTimeoutTest.testInterruptedRecvmsgIntoTimeout -*graalpython.lib-python.3.test.test_socket.InterruptedRecvTimeoutTest.testInterruptedRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.InterruptedSendTimeoutTest.testInterruptedSendTimeout -*graalpython.lib-python.3.test.test_socket.InterruptedSendTimeoutTest.testInterruptedSendmsgTimeout -*graalpython.lib-python.3.test.test_socket.InterruptedSendTimeoutTest.testInterruptedSendtoTimeout -*graalpython.lib-python.3.test.test_socket.J1939Test.testBind -*graalpython.lib-python.3.test.test_socket.J1939Test.testCreateJ1939Socket -*graalpython.lib-python.3.test.test_socket.J1939Test.testJ1939Constants -*graalpython.lib-python.3.test.test_socket.LineBufferedFileObjectClassTestCase.testAttributes -*graalpython.lib-python.3.test.test_socket.LineBufferedFileObjectClassTestCase.testCloseAfterMakefile -*graalpython.lib-python.3.test.test_socket.LineBufferedFileObjectClassTestCase.testClosedAttr -*graalpython.lib-python.3.test.test_socket.LineBufferedFileObjectClassTestCase.testFullRead -*graalpython.lib-python.3.test.test_socket.LineBufferedFileObjectClassTestCase.testMakefileAfterMakefileClose -*graalpython.lib-python.3.test.test_socket.LineBufferedFileObjectClassTestCase.testReadAfterTimeout -*graalpython.lib-python.3.test.test_socket.LineBufferedFileObjectClassTestCase.testReadline -*graalpython.lib-python.3.test.test_socket.LineBufferedFileObjectClassTestCase.testRealClose -*graalpython.lib-python.3.test.test_socket.LineBufferedFileObjectClassTestCase.testSmallRead -*graalpython.lib-python.3.test.test_socket.LineBufferedFileObjectClassTestCase.testUnbufferedRead -*graalpython.lib-python.3.test.test_socket.LinuxKernelCryptoAPI.test_aead_aes_gcm -*graalpython.lib-python.3.test.test_socket.LinuxKernelCryptoAPI.test_aes_cbc -*graalpython.lib-python.3.test.test_socket.LinuxKernelCryptoAPI.test_drbg_pr_sha256 -*graalpython.lib-python.3.test.test_socket.LinuxKernelCryptoAPI.test_hmac_sha1 -*graalpython.lib-python.3.test.test_socket.LinuxKernelCryptoAPI.test_length_restriction -*graalpython.lib-python.3.test.test_socket.LinuxKernelCryptoAPI.test_sendmsg_afalg_args -*graalpython.lib-python.3.test.test_socket.LinuxKernelCryptoAPI.test_sha256 -*graalpython.lib-python.3.test.test_socket.NetworkConnectionAttributesTest.testFamily -*graalpython.lib-python.3.test.test_socket.NetworkConnectionAttributesTest.testSourceAddress -*graalpython.lib-python.3.test.test_socket.NetworkConnectionAttributesTest.testTimeoutDefault -*graalpython.lib-python.3.test.test_socket.NetworkConnectionAttributesTest.testTimeoutNone -*graalpython.lib-python.3.test.test_socket.NetworkConnectionAttributesTest.testTimeoutValueNamed -*graalpython.lib-python.3.test.test_socket.NetworkConnectionAttributesTest.testTimeoutValueNonamed -*graalpython.lib-python.3.test.test_socket.NetworkConnectionBehaviourTest.testInsideTimeout -*graalpython.lib-python.3.test.test_socket.NetworkConnectionBehaviourTest.testOutsideTimeout -*graalpython.lib-python.3.test.test_socket.NetworkConnectionNoServer.test_connect -*graalpython.lib-python.3.test.test_socket.NetworkConnectionNoServer.test_create_connection -*graalpython.lib-python.3.test.test_socket.NetworkConnectionNoServer.test_create_connection_all_errors -*graalpython.lib-python.3.test.test_socket.NetworkConnectionNoServer.test_create_connection_timeout -*graalpython.lib-python.3.test.test_socket.NonBlockingTCPTests.testAccept -*graalpython.lib-python.3.test.test_socket.NonBlockingTCPTests.testInheritFlagsBlocking -*graalpython.lib-python.3.test.test_socket.NonBlockingTCPTests.testInheritFlagsTimeout -*graalpython.lib-python.3.test.test_socket.NonBlockingTCPTests.testInitNonBlocking -*graalpython.lib-python.3.test.test_socket.NonBlockingTCPTests.testRecv -*graalpython.lib-python.3.test.test_socket.NonBlockingTCPTests.testSetBlocking_overflow -*graalpython.lib-python.3.test.test_socket.NonblockConstantTest.test_SOCK_NONBLOCK -*graalpython.lib-python.3.test.test_socket.RDSTest.testPeek -*graalpython.lib-python.3.test.test_socket.RDSTest.testSelect -*graalpython.lib-python.3.test.test_socket.RDSTest.testSendAndRecv -*graalpython.lib-python.3.test.test_socket.RDSTest.testSendAndRecvMsg -*graalpython.lib-python.3.test.test_socket.RDSTest.testSendAndRecvMulti -*graalpython.lib-python.3.test.test_socket.RFC3542AncillaryTest.testCmsgTruncNoBufSize -*graalpython.lib-python.3.test.test_socket.RFC3542AncillaryTest.testOddCmsgSize -*graalpython.lib-python.3.test.test_socket.RFC3542AncillaryTest.testRecvHopLimit -*graalpython.lib-python.3.test.test_socket.RFC3542AncillaryTest.testRecvHopLimitCMSG_SPACE -*graalpython.lib-python.3.test.test_socket.RFC3542AncillaryTest.testRecvTrafficClassAndHopLimit -*graalpython.lib-python.3.test.test_socket.RFC3542AncillaryTest.testRecvTrafficClassAndHopLimitCMSG_SPACE -*graalpython.lib-python.3.test.test_socket.RFC3542AncillaryTest.testSecomdCmsgTruncInData -*graalpython.lib-python.3.test.test_socket.RFC3542AncillaryTest.testSecondCmsgTrunc0 -*graalpython.lib-python.3.test.test_socket.RFC3542AncillaryTest.testSecondCmsgTrunc1 -*graalpython.lib-python.3.test.test_socket.RFC3542AncillaryTest.testSecondCmsgTrunc2Int -*graalpython.lib-python.3.test.test_socket.RFC3542AncillaryTest.testSecondCmsgTruncLen0Minus1 -*graalpython.lib-python.3.test.test_socket.RFC3542AncillaryTest.testSetHopLimit -*graalpython.lib-python.3.test.test_socket.RFC3542AncillaryTest.testSetTrafficClassAndHopLimit -*graalpython.lib-python.3.test.test_socket.RFC3542AncillaryTest.testSingleCmsgTrunc0 -*graalpython.lib-python.3.test.test_socket.RFC3542AncillaryTest.testSingleCmsgTrunc1 -*graalpython.lib-python.3.test.test_socket.RFC3542AncillaryTest.testSingleCmsgTrunc2Int -*graalpython.lib-python.3.test.test_socket.RFC3542AncillaryTest.testSingleCmsgTruncInData -*graalpython.lib-python.3.test.test_socket.RFC3542AncillaryTest.testSingleCmsgTruncLen0Minus1 -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericStreamTests.testRecvmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericStreamTests.testRecvmsgAfterClose -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericStreamTests.testRecvmsgEOF -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericStreamTests.testRecvmsgExplicitDefaults -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericStreamTests.testRecvmsgFromSendmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericStreamTests.testRecvmsgLongAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericStreamTests.testRecvmsgOverflow -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericStreamTests.testRecvmsgPeek -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericStreamTests.testRecvmsgShortAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericStreamTests.testRecvmsgShorter -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericStreamTests.testRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericStreamTests.testRecvmsgTrunc -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericTests.testRecvmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericTests.testRecvmsgAfterClose -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericTests.testRecvmsgExplicitDefaults -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericTests.testRecvmsgFromSendmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericTests.testRecvmsgLongAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericTests.testRecvmsgPeek -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericTests.testRecvmsgShortAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericTests.testRecvmsgShorter -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericTests.testRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.RecvmsgGenericTests.testRecvmsgTrunc -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testCmsgTruncNoBufSize -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testOddCmsgSize -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testRecvHopLimit -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testRecvHopLimitCMSG_SPACE -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testRecvTrafficClassAndHopLimit -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testRecvTrafficClassAndHopLimitCMSG_SPACE -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testSecomdCmsgTruncInData -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testSecondCmsgTrunc0 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testSecondCmsgTrunc1 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testSecondCmsgTrunc2Int -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testSecondCmsgTruncInData -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testSecondCmsgTruncLen0Minus1 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testSetHopLimit -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testSetTrafficClassAndHopLimit -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testSingleCmsgTrunc0 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testSingleCmsgTrunc1 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testSingleCmsgTrunc2Int -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testSingleCmsgTruncInData -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDP6Test.testSingleCmsgTruncLen0Minus1 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDPLITE6Test.testCmsgTruncNoBufSize -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDPLITE6Test.testOddCmsgSize -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDPLITE6Test.testRecvHopLimit -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDPLITE6Test.testRecvHopLimitCMSG_SPACE -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDPLITE6Test.testRecvTrafficClassAndHopLimit -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDPLITE6Test.testRecvTrafficClassAndHopLimitCMSG_SPACE -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDPLITE6Test.testSecondCmsgTrunc0 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDPLITE6Test.testSecondCmsgTrunc1 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDPLITE6Test.testSecondCmsgTrunc2Int -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDPLITE6Test.testSecondCmsgTruncInData -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDPLITE6Test.testSecondCmsgTruncLen0Minus1 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDPLITE6Test.testSetHopLimit -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDPLITE6Test.testSetTrafficClassAndHopLimit -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDPLITE6Test.testSingleCmsgTrunc0 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDPLITE6Test.testSingleCmsgTrunc1 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDPLITE6Test.testSingleCmsgTrunc2Int -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDPLITE6Test.testSingleCmsgTruncInData -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoRFC3542AncillaryUDPLITE6Test.testSingleCmsgTruncLen0Minus1 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCMRightsStreamTest.testCmsgTrunc0 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCMRightsStreamTest.testCmsgTrunc1 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCMRightsStreamTest.testCmsgTrunc2Int -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCMRightsStreamTest.testCmsgTruncLen0 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCMRightsStreamTest.testCmsgTruncLen0Minus1 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCMRightsStreamTest.testCmsgTruncLen0Plus1 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCMRightsStreamTest.testCmsgTruncLen1 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCMRightsStreamTest.testCmsgTruncLen2Minus1 -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCMRightsStreamTest.testCmsgTruncNoBufSize -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCMRightsStreamTest.testFDPassCMSG_LEN -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCMRightsStreamTest.testFDPassCMSG_SPACE -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCMRightsStreamTest.testFDPassEmpty -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCMRightsStreamTest.testFDPassPartialInt -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCMRightsStreamTest.testFDPassPartialIntInMiddle -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCMRightsStreamTest.testFDPassSeparate -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCMRightsStreamTest.testFDPassSeparateMinSpace -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCMRightsStreamTest.testFDPassSimple -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCMRightsStreamTest.testMultipleFDPass -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCTPStreamTest.testRecvmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCTPStreamTest.testRecvmsgAfterClose -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCTPStreamTest.testRecvmsgEOF -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCTPStreamTest.testRecvmsgExplicitDefaults -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCTPStreamTest.testRecvmsgFromSendmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCTPStreamTest.testRecvmsgIntoArray -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCTPStreamTest.testRecvmsgIntoBadArgs -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCTPStreamTest.testRecvmsgIntoGenerator -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCTPStreamTest.testRecvmsgIntoScatter -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCTPStreamTest.testRecvmsgLongAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCTPStreamTest.testRecvmsgOverflow -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCTPStreamTest.testRecvmsgPeek -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCTPStreamTest.testRecvmsgShortAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCTPStreamTest.testRecvmsgShorter -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCTPStreamTest.testRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoSCTPStreamTest.testRecvmsgTrunc -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTCPTest.testRecvmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTCPTest.testRecvmsgAfterClose -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTCPTest.testRecvmsgEOF -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTCPTest.testRecvmsgExplicitDefaults -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTCPTest.testRecvmsgFromSendmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTCPTest.testRecvmsgIntoArray -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTCPTest.testRecvmsgIntoBadArgs -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTCPTest.testRecvmsgIntoGenerator -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTCPTest.testRecvmsgIntoScatter -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTCPTest.testRecvmsgLongAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTCPTest.testRecvmsgOverflow -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTCPTest.testRecvmsgPeek -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTCPTest.testRecvmsgShortAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTCPTest.testRecvmsgShorter -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTCPTest.testRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTCPTest.testRecvmsgTrunc -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTests.testRecvmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTests.testRecvmsgAfterClose -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTests.testRecvmsgExplicitDefaults -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTests.testRecvmsgFromSendmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTests.testRecvmsgIntoArray -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTests.testRecvmsgIntoBadArgs -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTests.testRecvmsgIntoGenerator -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTests.testRecvmsgIntoScatter -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTests.testRecvmsgLongAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTests.testRecvmsgPeek -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTests.testRecvmsgShortAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTests.testRecvmsgShorter -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTests.testRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoTests.testRecvmsgTrunc -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDP6Test.testRecvmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDP6Test.testRecvmsgAfterClose -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDP6Test.testRecvmsgExplicitDefaults -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDP6Test.testRecvmsgFromSendmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDP6Test.testRecvmsgIntoArray -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDP6Test.testRecvmsgIntoBadArgs -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDP6Test.testRecvmsgIntoGenerator -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDP6Test.testRecvmsgIntoScatter -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDP6Test.testRecvmsgLongAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDP6Test.testRecvmsgPeek -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDP6Test.testRecvmsgShortAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDP6Test.testRecvmsgShorter -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDP6Test.testRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDP6Test.testRecvmsgTrunc -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITE6Test.testRecvmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITE6Test.testRecvmsgAfterClose -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITE6Test.testRecvmsgExplicitDefaults -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITE6Test.testRecvmsgFromSendmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITE6Test.testRecvmsgIntoArray -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITE6Test.testRecvmsgIntoBadArgs -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITE6Test.testRecvmsgIntoGenerator -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITE6Test.testRecvmsgIntoScatter -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITE6Test.testRecvmsgLongAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITE6Test.testRecvmsgPeek -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITE6Test.testRecvmsgShortAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITE6Test.testRecvmsgShorter -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITE6Test.testRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITE6Test.testRecvmsgTrunc -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITETest.testRecvmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITETest.testRecvmsgAfterClose -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITETest.testRecvmsgExplicitDefaults -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITETest.testRecvmsgFromSendmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITETest.testRecvmsgIntoArray -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITETest.testRecvmsgIntoBadArgs -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITETest.testRecvmsgIntoGenerator -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITETest.testRecvmsgIntoScatter -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITETest.testRecvmsgLongAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITETest.testRecvmsgPeek -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITETest.testRecvmsgShortAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITETest.testRecvmsgShorter -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITETest.testRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPLITETest.testRecvmsgTrunc -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPTest.testRecvmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPTest.testRecvmsgAfterClose -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPTest.testRecvmsgExplicitDefaults -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPTest.testRecvmsgFromSendmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPTest.testRecvmsgIntoArray -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPTest.testRecvmsgIntoBadArgs -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPTest.testRecvmsgIntoGenerator -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPTest.testRecvmsgIntoScatter -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPTest.testRecvmsgLongAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPTest.testRecvmsgPeek -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPTest.testRecvmsgShortAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPTest.testRecvmsgShorter -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPTest.testRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUDPTest.testRecvmsgTrunc -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUnixStreamTest.testRecvmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUnixStreamTest.testRecvmsgAfterClose -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUnixStreamTest.testRecvmsgEOF -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUnixStreamTest.testRecvmsgExplicitDefaults -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUnixStreamTest.testRecvmsgFromSendmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUnixStreamTest.testRecvmsgIntoArray -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUnixStreamTest.testRecvmsgIntoBadArgs -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUnixStreamTest.testRecvmsgIntoGenerator -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUnixStreamTest.testRecvmsgIntoScatter -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUnixStreamTest.testRecvmsgLongAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUnixStreamTest.testRecvmsgOverflow -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUnixStreamTest.testRecvmsgPeek -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUnixStreamTest.testRecvmsgShortAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUnixStreamTest.testRecvmsgShorter -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUnixStreamTest.testRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.RecvmsgIntoUnixStreamTest.testRecvmsgTrunc -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testCmsgTruncNoBufSize -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testOddCmsgSize -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testRecvHopLimit -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testRecvHopLimitCMSG_SPACE -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testRecvTrafficClassAndHopLimit -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testRecvTrafficClassAndHopLimitCMSG_SPACE -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testSecomdCmsgTruncInData -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testSecondCmsgTrunc0 -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testSecondCmsgTrunc1 -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testSecondCmsgTrunc2Int -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testSecondCmsgTruncInData -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testSecondCmsgTruncLen0Minus1 -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testSetHopLimit -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testSetTrafficClassAndHopLimit -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testSingleCmsgTrunc0 -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testSingleCmsgTrunc1 -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testSingleCmsgTrunc2Int -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testSingleCmsgTruncInData -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDP6Test.testSingleCmsgTruncLen0Minus1 -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDPLITE6Test.testCmsgTruncNoBufSize -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDPLITE6Test.testOddCmsgSize -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDPLITE6Test.testRecvHopLimit -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDPLITE6Test.testRecvHopLimitCMSG_SPACE -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDPLITE6Test.testRecvTrafficClassAndHopLimit -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDPLITE6Test.testRecvTrafficClassAndHopLimitCMSG_SPACE -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDPLITE6Test.testSecondCmsgTrunc0 -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDPLITE6Test.testSecondCmsgTrunc1 -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDPLITE6Test.testSecondCmsgTrunc2Int -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDPLITE6Test.testSecondCmsgTruncInData -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDPLITE6Test.testSecondCmsgTruncLen0Minus1 -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDPLITE6Test.testSetHopLimit -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDPLITE6Test.testSetTrafficClassAndHopLimit -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDPLITE6Test.testSingleCmsgTrunc0 -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDPLITE6Test.testSingleCmsgTrunc1 -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDPLITE6Test.testSingleCmsgTrunc2Int -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDPLITE6Test.testSingleCmsgTruncInData -*graalpython.lib-python.3.test.test_socket.RecvmsgRFC3542AncillaryUDPLITE6Test.testSingleCmsgTruncLen0Minus1 -*graalpython.lib-python.3.test.test_socket.RecvmsgSCMRightsStreamTest.testCmsgTrunc0 -*graalpython.lib-python.3.test.test_socket.RecvmsgSCMRightsStreamTest.testCmsgTrunc1 -*graalpython.lib-python.3.test.test_socket.RecvmsgSCMRightsStreamTest.testCmsgTrunc2Int -*graalpython.lib-python.3.test.test_socket.RecvmsgSCMRightsStreamTest.testCmsgTruncLen0 -*graalpython.lib-python.3.test.test_socket.RecvmsgSCMRightsStreamTest.testCmsgTruncLen0Minus1 -*graalpython.lib-python.3.test.test_socket.RecvmsgSCMRightsStreamTest.testCmsgTruncLen0Plus1 -*graalpython.lib-python.3.test.test_socket.RecvmsgSCMRightsStreamTest.testCmsgTruncLen1 -*graalpython.lib-python.3.test.test_socket.RecvmsgSCMRightsStreamTest.testCmsgTruncLen2Minus1 -*graalpython.lib-python.3.test.test_socket.RecvmsgSCMRightsStreamTest.testCmsgTruncNoBufSize -*graalpython.lib-python.3.test.test_socket.RecvmsgSCMRightsStreamTest.testFDPassCMSG_LEN -*graalpython.lib-python.3.test.test_socket.RecvmsgSCMRightsStreamTest.testFDPassCMSG_SPACE -*graalpython.lib-python.3.test.test_socket.RecvmsgSCMRightsStreamTest.testFDPassEmpty -*graalpython.lib-python.3.test.test_socket.RecvmsgSCMRightsStreamTest.testFDPassPartialInt -*graalpython.lib-python.3.test.test_socket.RecvmsgSCMRightsStreamTest.testFDPassPartialIntInMiddle -*graalpython.lib-python.3.test.test_socket.RecvmsgSCMRightsStreamTest.testFDPassSeparate -*graalpython.lib-python.3.test.test_socket.RecvmsgSCMRightsStreamTest.testFDPassSeparateMinSpace -*graalpython.lib-python.3.test.test_socket.RecvmsgSCMRightsStreamTest.testFDPassSimple -*graalpython.lib-python.3.test.test_socket.RecvmsgSCMRightsStreamTest.testMultipleFDPass -*graalpython.lib-python.3.test.test_socket.RecvmsgSCTPStreamTest.testRecvmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgSCTPStreamTest.testRecvmsgAfterClose -*graalpython.lib-python.3.test.test_socket.RecvmsgSCTPStreamTest.testRecvmsgBadArgs -*graalpython.lib-python.3.test.test_socket.RecvmsgSCTPStreamTest.testRecvmsgEOF -*graalpython.lib-python.3.test.test_socket.RecvmsgSCTPStreamTest.testRecvmsgExplicitDefaults -*graalpython.lib-python.3.test.test_socket.RecvmsgSCTPStreamTest.testRecvmsgFromSendmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgSCTPStreamTest.testRecvmsgLongAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgSCTPStreamTest.testRecvmsgOverflow -*graalpython.lib-python.3.test.test_socket.RecvmsgSCTPStreamTest.testRecvmsgPeek -*graalpython.lib-python.3.test.test_socket.RecvmsgSCTPStreamTest.testRecvmsgShortAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgSCTPStreamTest.testRecvmsgShorter -*graalpython.lib-python.3.test.test_socket.RecvmsgSCTPStreamTest.testRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.RecvmsgSCTPStreamTest.testRecvmsgTrunc -*graalpython.lib-python.3.test.test_socket.RecvmsgTCPTest.testRecvmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgTCPTest.testRecvmsgAfterClose -*graalpython.lib-python.3.test.test_socket.RecvmsgTCPTest.testRecvmsgBadArgs -*graalpython.lib-python.3.test.test_socket.RecvmsgTCPTest.testRecvmsgEOF -*graalpython.lib-python.3.test.test_socket.RecvmsgTCPTest.testRecvmsgExplicitDefaults -*graalpython.lib-python.3.test.test_socket.RecvmsgTCPTest.testRecvmsgFromSendmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgTCPTest.testRecvmsgLongAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgTCPTest.testRecvmsgOverflow -*graalpython.lib-python.3.test.test_socket.RecvmsgTCPTest.testRecvmsgPeek -*graalpython.lib-python.3.test.test_socket.RecvmsgTCPTest.testRecvmsgShortAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgTCPTest.testRecvmsgShorter -*graalpython.lib-python.3.test.test_socket.RecvmsgTCPTest.testRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.RecvmsgTCPTest.testRecvmsgTrunc -*graalpython.lib-python.3.test.test_socket.RecvmsgTests.testRecvmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgTests.testRecvmsgAfterClose -*graalpython.lib-python.3.test.test_socket.RecvmsgTests.testRecvmsgBadArgs -*graalpython.lib-python.3.test.test_socket.RecvmsgTests.testRecvmsgExplicitDefaults -*graalpython.lib-python.3.test.test_socket.RecvmsgTests.testRecvmsgFromSendmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgTests.testRecvmsgLongAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgTests.testRecvmsgPeek -*graalpython.lib-python.3.test.test_socket.RecvmsgTests.testRecvmsgShortAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgTests.testRecvmsgShorter -*graalpython.lib-python.3.test.test_socket.RecvmsgTests.testRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.RecvmsgTests.testRecvmsgTrunc -*graalpython.lib-python.3.test.test_socket.RecvmsgUDP6Test.testRecvmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgUDP6Test.testRecvmsgAfterClose -*graalpython.lib-python.3.test.test_socket.RecvmsgUDP6Test.testRecvmsgBadArgs -*graalpython.lib-python.3.test.test_socket.RecvmsgUDP6Test.testRecvmsgExplicitDefaults -*graalpython.lib-python.3.test.test_socket.RecvmsgUDP6Test.testRecvmsgFromSendmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgUDP6Test.testRecvmsgLongAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgUDP6Test.testRecvmsgPeek -*graalpython.lib-python.3.test.test_socket.RecvmsgUDP6Test.testRecvmsgShortAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgUDP6Test.testRecvmsgShorter -*graalpython.lib-python.3.test.test_socket.RecvmsgUDP6Test.testRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.RecvmsgUDP6Test.testRecvmsgTrunc -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITE6Test.testRecvmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITE6Test.testRecvmsgAfterClose -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITE6Test.testRecvmsgBadArgs -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITE6Test.testRecvmsgExplicitDefaults -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITE6Test.testRecvmsgFromSendmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITE6Test.testRecvmsgLongAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITE6Test.testRecvmsgPeek -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITE6Test.testRecvmsgShortAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITE6Test.testRecvmsgShorter -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITE6Test.testRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITE6Test.testRecvmsgTrunc -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITETest.testRecvmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITETest.testRecvmsgAfterClose -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITETest.testRecvmsgBadArgs -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITETest.testRecvmsgExplicitDefaults -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITETest.testRecvmsgFromSendmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITETest.testRecvmsgLongAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITETest.testRecvmsgPeek -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITETest.testRecvmsgShortAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITETest.testRecvmsgShorter -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITETest.testRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPLITETest.testRecvmsgTrunc -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPTest.testRecvmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPTest.testRecvmsgAfterClose -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPTest.testRecvmsgBadArgs -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPTest.testRecvmsgExplicitDefaults -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPTest.testRecvmsgFromSendmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPTest.testRecvmsgLongAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPTest.testRecvmsgPeek -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPTest.testRecvmsgShortAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPTest.testRecvmsgShorter -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPTest.testRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.RecvmsgUDPTest.testRecvmsgTrunc -*graalpython.lib-python.3.test.test_socket.RecvmsgUnixStreamTest.testRecvmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgUnixStreamTest.testRecvmsgAfterClose -*graalpython.lib-python.3.test.test_socket.RecvmsgUnixStreamTest.testRecvmsgBadArgs -*graalpython.lib-python.3.test.test_socket.RecvmsgUnixStreamTest.testRecvmsgEOF -*graalpython.lib-python.3.test.test_socket.RecvmsgUnixStreamTest.testRecvmsgExplicitDefaults -*graalpython.lib-python.3.test.test_socket.RecvmsgUnixStreamTest.testRecvmsgFromSendmsg -*graalpython.lib-python.3.test.test_socket.RecvmsgUnixStreamTest.testRecvmsgLongAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgUnixStreamTest.testRecvmsgOverflow -*graalpython.lib-python.3.test.test_socket.RecvmsgUnixStreamTest.testRecvmsgPeek -*graalpython.lib-python.3.test.test_socket.RecvmsgUnixStreamTest.testRecvmsgShortAncillaryBuf -*graalpython.lib-python.3.test.test_socket.RecvmsgUnixStreamTest.testRecvmsgShorter -*graalpython.lib-python.3.test.test_socket.RecvmsgUnixStreamTest.testRecvmsgTimeout -*graalpython.lib-python.3.test.test_socket.RecvmsgUnixStreamTest.testRecvmsgTrunc -*graalpython.lib-python.3.test.test_socket.SCMRightsTest.testCmsgTrunc0 -*graalpython.lib-python.3.test.test_socket.SCMRightsTest.testCmsgTrunc1 -*graalpython.lib-python.3.test.test_socket.SCMRightsTest.testCmsgTrunc2Int -*graalpython.lib-python.3.test.test_socket.SCMRightsTest.testCmsgTruncLen0 -*graalpython.lib-python.3.test.test_socket.SCMRightsTest.testCmsgTruncLen0Minus1 -*graalpython.lib-python.3.test.test_socket.SCMRightsTest.testCmsgTruncLen0Plus1 -*graalpython.lib-python.3.test.test_socket.SCMRightsTest.testCmsgTruncLen1 -*graalpython.lib-python.3.test.test_socket.SCMRightsTest.testCmsgTruncLen2Minus1 -*graalpython.lib-python.3.test.test_socket.SCMRightsTest.testCmsgTruncNoBufSize -*graalpython.lib-python.3.test.test_socket.SCMRightsTest.testFDPassCMSG_LEN -*graalpython.lib-python.3.test.test_socket.SCMRightsTest.testFDPassCMSG_SPACE -*graalpython.lib-python.3.test.test_socket.SCMRightsTest.testFDPassEmpty -*graalpython.lib-python.3.test.test_socket.SCMRightsTest.testFDPassPartialInt -*graalpython.lib-python.3.test.test_socket.SCMRightsTest.testFDPassPartialIntInMiddle -*graalpython.lib-python.3.test.test_socket.SCMRightsTest.testFDPassSeparate -*graalpython.lib-python.3.test.test_socket.SCMRightsTest.testFDPassSeparateMinSpace -*graalpython.lib-python.3.test.test_socket.SCMRightsTest.testFDPassSimple -*graalpython.lib-python.3.test.test_socket.SCMRightsTest.testMultipleFDPass -*graalpython.lib-python.3.test.test_socket.SendRecvFdsTests.testSendAndRecvFds -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendTest.testCount -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendTest.testCountSmall -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendTest.testCountWithOffset -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendTest.testEmptyFileSend -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendTest.testNonBlocking -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendTest.testNonRegularFile -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendTest.testOffset -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendTest.testRegularFile -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendTest.testWithTimeout -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendTest.testWithTimeoutTriggeredSend -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendTest.test_errors -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendfileTest.testCount -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendfileTest.testCountSmall -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendfileTest.testCountWithOffset -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendfileTest.testEmptyFileSend -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendfileTest.testNonBlocking -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendfileTest.testNonRegularFile -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendfileTest.testOffset -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendfileTest.testRegularFile -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendfileTest.testWithTimeout -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendfileTest.testWithTimeoutTriggeredSend -*graalpython.lib-python.3.test.test_socket.SendfileUsingSendfileTest.test_errors -*graalpython.lib-python.3.test.test_socket.SendmsgConnectionlessTests.testSendmsg -*graalpython.lib-python.3.test.test_socket.SendmsgConnectionlessTests.testSendmsgAfterClose -*graalpython.lib-python.3.test.test_socket.SendmsgConnectionlessTests.testSendmsgAncillaryGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgConnectionlessTests.testSendmsgArray -*graalpython.lib-python.3.test.test_socket.SendmsgConnectionlessTests.testSendmsgBadArgs -*graalpython.lib-python.3.test.test_socket.SendmsgConnectionlessTests.testSendmsgBadCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgConnectionlessTests.testSendmsgBadMultiCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgConnectionlessTests.testSendmsgDataGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgConnectionlessTests.testSendmsgExcessCmsgReject -*graalpython.lib-python.3.test.test_socket.SendmsgConnectionlessTests.testSendmsgGather -*graalpython.lib-python.3.test.test_socket.SendmsgConnectionlessTests.testSendmsgNoDestAddr -*graalpython.lib-python.3.test.test_socket.SendmsgSCTPStreamTest.testSendmsg -*graalpython.lib-python.3.test.test_socket.SendmsgSCTPStreamTest.testSendmsgAfterClose -*graalpython.lib-python.3.test.test_socket.SendmsgSCTPStreamTest.testSendmsgAncillaryGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgSCTPStreamTest.testSendmsgArray -*graalpython.lib-python.3.test.test_socket.SendmsgSCTPStreamTest.testSendmsgBadArgs -*graalpython.lib-python.3.test.test_socket.SendmsgSCTPStreamTest.testSendmsgBadCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgSCTPStreamTest.testSendmsgBadMultiCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgSCTPStreamTest.testSendmsgDataGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgSCTPStreamTest.testSendmsgDontWait -*graalpython.lib-python.3.test.test_socket.SendmsgSCTPStreamTest.testSendmsgExcessCmsgReject -*graalpython.lib-python.3.test.test_socket.SendmsgSCTPStreamTest.testSendmsgExplicitNoneAddr -*graalpython.lib-python.3.test.test_socket.SendmsgSCTPStreamTest.testSendmsgGather -*graalpython.lib-python.3.test.test_socket.SendmsgSCTPStreamTest.testSendmsgTimeout -*graalpython.lib-python.3.test.test_socket.SendmsgStreamTests.testSendmsg -*graalpython.lib-python.3.test.test_socket.SendmsgStreamTests.testSendmsgAfterClose -*graalpython.lib-python.3.test.test_socket.SendmsgStreamTests.testSendmsgAncillaryGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgStreamTests.testSendmsgArray -*graalpython.lib-python.3.test.test_socket.SendmsgStreamTests.testSendmsgBadArgs -*graalpython.lib-python.3.test.test_socket.SendmsgStreamTests.testSendmsgBadCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgStreamTests.testSendmsgBadMultiCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgStreamTests.testSendmsgDataGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgStreamTests.testSendmsgDontWait -*graalpython.lib-python.3.test.test_socket.SendmsgStreamTests.testSendmsgExcessCmsgReject -*graalpython.lib-python.3.test.test_socket.SendmsgStreamTests.testSendmsgExplicitNoneAddr -*graalpython.lib-python.3.test.test_socket.SendmsgStreamTests.testSendmsgGather -*graalpython.lib-python.3.test.test_socket.SendmsgStreamTests.testSendmsgTimeout -*graalpython.lib-python.3.test.test_socket.SendmsgTCPTest.testSendmsg -*graalpython.lib-python.3.test.test_socket.SendmsgTCPTest.testSendmsgAfterClose -*graalpython.lib-python.3.test.test_socket.SendmsgTCPTest.testSendmsgAncillaryGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgTCPTest.testSendmsgArray -*graalpython.lib-python.3.test.test_socket.SendmsgTCPTest.testSendmsgBadArgs -*graalpython.lib-python.3.test.test_socket.SendmsgTCPTest.testSendmsgBadCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgTCPTest.testSendmsgBadMultiCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgTCPTest.testSendmsgDataGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgTCPTest.testSendmsgDontWait -*graalpython.lib-python.3.test.test_socket.SendmsgTCPTest.testSendmsgExcessCmsgReject -*graalpython.lib-python.3.test.test_socket.SendmsgTCPTest.testSendmsgExplicitNoneAddr -*graalpython.lib-python.3.test.test_socket.SendmsgTCPTest.testSendmsgGather -*graalpython.lib-python.3.test.test_socket.SendmsgTCPTest.testSendmsgTimeout -*graalpython.lib-python.3.test.test_socket.SendmsgTests.testSendmsg -*graalpython.lib-python.3.test.test_socket.SendmsgTests.testSendmsgAfterClose -*graalpython.lib-python.3.test.test_socket.SendmsgTests.testSendmsgAncillaryGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgTests.testSendmsgArray -*graalpython.lib-python.3.test.test_socket.SendmsgTests.testSendmsgBadArgs -*graalpython.lib-python.3.test.test_socket.SendmsgTests.testSendmsgBadCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgTests.testSendmsgBadMultiCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgTests.testSendmsgDataGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgTests.testSendmsgExcessCmsgReject -*graalpython.lib-python.3.test.test_socket.SendmsgTests.testSendmsgGather -*graalpython.lib-python.3.test.test_socket.SendmsgUDP6Test.testSendmsg -*graalpython.lib-python.3.test.test_socket.SendmsgUDP6Test.testSendmsgAfterClose -*graalpython.lib-python.3.test.test_socket.SendmsgUDP6Test.testSendmsgAncillaryGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgUDP6Test.testSendmsgArray -*graalpython.lib-python.3.test.test_socket.SendmsgUDP6Test.testSendmsgBadArgs -*graalpython.lib-python.3.test.test_socket.SendmsgUDP6Test.testSendmsgBadCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgUDP6Test.testSendmsgBadMultiCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgUDP6Test.testSendmsgDataGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgUDP6Test.testSendmsgExcessCmsgReject -*graalpython.lib-python.3.test.test_socket.SendmsgUDP6Test.testSendmsgGather -*graalpython.lib-python.3.test.test_socket.SendmsgUDP6Test.testSendmsgNoDestAddr -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITE6Test.testSendmsg -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITE6Test.testSendmsgAfterClose -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITE6Test.testSendmsgAncillaryGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITE6Test.testSendmsgArray -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITE6Test.testSendmsgBadArgs -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITE6Test.testSendmsgBadCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITE6Test.testSendmsgBadMultiCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITE6Test.testSendmsgDataGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITE6Test.testSendmsgExcessCmsgReject -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITE6Test.testSendmsgGather -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITE6Test.testSendmsgNoDestAddr -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITETest.testSendmsg -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITETest.testSendmsgAfterClose -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITETest.testSendmsgAncillaryGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITETest.testSendmsgArray -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITETest.testSendmsgBadArgs -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITETest.testSendmsgBadCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITETest.testSendmsgBadMultiCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITETest.testSendmsgDataGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITETest.testSendmsgExcessCmsgReject -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITETest.testSendmsgGather -*graalpython.lib-python.3.test.test_socket.SendmsgUDPLITETest.testSendmsgNoDestAddr -*graalpython.lib-python.3.test.test_socket.SendmsgUDPTest.testSendmsg -*graalpython.lib-python.3.test.test_socket.SendmsgUDPTest.testSendmsgAfterClose -*graalpython.lib-python.3.test.test_socket.SendmsgUDPTest.testSendmsgAncillaryGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgUDPTest.testSendmsgArray -*graalpython.lib-python.3.test.test_socket.SendmsgUDPTest.testSendmsgBadArgs -*graalpython.lib-python.3.test.test_socket.SendmsgUDPTest.testSendmsgBadCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgUDPTest.testSendmsgBadMultiCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgUDPTest.testSendmsgDataGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgUDPTest.testSendmsgExcessCmsgReject -*graalpython.lib-python.3.test.test_socket.SendmsgUDPTest.testSendmsgGather -*graalpython.lib-python.3.test.test_socket.SendmsgUDPTest.testSendmsgNoDestAddr -*graalpython.lib-python.3.test.test_socket.SendmsgUnixStreamTest.testSendmsg -*graalpython.lib-python.3.test.test_socket.SendmsgUnixStreamTest.testSendmsgAfterClose -*graalpython.lib-python.3.test.test_socket.SendmsgUnixStreamTest.testSendmsgAncillaryGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgUnixStreamTest.testSendmsgArray -*graalpython.lib-python.3.test.test_socket.SendmsgUnixStreamTest.testSendmsgBadArgs -*graalpython.lib-python.3.test.test_socket.SendmsgUnixStreamTest.testSendmsgBadCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgUnixStreamTest.testSendmsgBadMultiCmsg -*graalpython.lib-python.3.test.test_socket.SendmsgUnixStreamTest.testSendmsgDataGenerator -*graalpython.lib-python.3.test.test_socket.SendmsgUnixStreamTest.testSendmsgDontWait -*graalpython.lib-python.3.test.test_socket.SendmsgUnixStreamTest.testSendmsgExcessCmsgReject -*graalpython.lib-python.3.test.test_socket.SendmsgUnixStreamTest.testSendmsgExplicitNoneAddr -*graalpython.lib-python.3.test.test_socket.SendmsgUnixStreamTest.testSendmsgGather -*graalpython.lib-python.3.test.test_socket.SendmsgUnixStreamTest.testSendmsgTimeout -*graalpython.lib-python.3.test.test_socket.SmallBufferedFileObjectClassTestCase.testAttributes -*graalpython.lib-python.3.test.test_socket.SmallBufferedFileObjectClassTestCase.testCloseAfterMakefile -*graalpython.lib-python.3.test.test_socket.SmallBufferedFileObjectClassTestCase.testClosedAttr -*graalpython.lib-python.3.test.test_socket.SmallBufferedFileObjectClassTestCase.testFullRead -*graalpython.lib-python.3.test.test_socket.SmallBufferedFileObjectClassTestCase.testMakefileAfterMakefileClose -*graalpython.lib-python.3.test.test_socket.SmallBufferedFileObjectClassTestCase.testReadAfterTimeout -*graalpython.lib-python.3.test.test_socket.SmallBufferedFileObjectClassTestCase.testReadline -*graalpython.lib-python.3.test.test_socket.SmallBufferedFileObjectClassTestCase.testRealClose -*graalpython.lib-python.3.test.test_socket.SmallBufferedFileObjectClassTestCase.testSmallRead -*graalpython.lib-python.3.test.test_socket.SmallBufferedFileObjectClassTestCase.testUnbufferedRead -*graalpython.lib-python.3.test.test_socket.TCPCloserTest.testClose -*graalpython.lib-python.3.test.test_socket.TCPTimeoutTest.testInterruptedTimeout -*graalpython.lib-python.3.test.test_socket.TCPTimeoutTest.testTCPTimeout -*graalpython.lib-python.3.test.test_socket.TCPTimeoutTest.testTimeoutZero -*graalpython.lib-python.3.test.test_socket.TIPCTest.testRDM -*graalpython.lib-python.3.test.test_socket.TIPCThreadableTest.testStream -*graalpython.lib-python.3.test.test_socket.TestExceptions.testExceptionTree -*graalpython.lib-python.3.test.test_socket.TestExceptions.test_setblocking_invalidfd -*graalpython.lib-python.3.test.test_socket.TestLinuxAbstractNamespace.testAutobind -*graalpython.lib-python.3.test.test_socket.TestLinuxAbstractNamespace.testBytearrayName -*graalpython.lib-python.3.test.test_socket.TestLinuxAbstractNamespace.testLinuxAbstractNamespace -*graalpython.lib-python.3.test.test_socket.TestLinuxAbstractNamespace.testMaxName -*graalpython.lib-python.3.test.test_socket.TestLinuxAbstractNamespace.testNameOverflow -*graalpython.lib-python.3.test.test_socket.TestLinuxAbstractNamespace.testStrName -*graalpython.lib-python.3.test.test_socket.TestMSWindowsTCPFlags.test_new_tcp_flags -*graalpython.lib-python.3.test.test_socket.TestSocketSharing.testShare -*graalpython.lib-python.3.test.test_socket.TestSocketSharing.testShareLength -*graalpython.lib-python.3.test.test_socket.TestSocketSharing.testShareLocal -*graalpython.lib-python.3.test.test_socket.TestSocketSharing.testTypes -*graalpython.lib-python.3.test.test_socket.TestUnixDomain.testBytesAddr -*graalpython.lib-python.3.test.test_socket.TestUnixDomain.testEmptyAddress -*graalpython.lib-python.3.test.test_socket.TestUnixDomain.testStrAddr -*graalpython.lib-python.3.test.test_socket.TestUnixDomain.testSurrogateescapeBind -*graalpython.lib-python.3.test.test_socket.TestUnixDomain.testUnbound -*graalpython.lib-python.3.test.test_socket.TestUnixDomain.testUnencodableAddr -*graalpython.lib-python.3.test.test_socket.ThreadedVSOCKSocketStreamTest.testStream -*graalpython.lib-python.3.test.test_socket.UDPLITETimeoutTest.testTimeoutZero -*graalpython.lib-python.3.test.test_socket.UDPLITETimeoutTest.testUDPLITETimeout -*graalpython.lib-python.3.test.test_socket.UDPTimeoutTest.testTimeoutZero -*graalpython.lib-python.3.test.test_socket.UDPTimeoutTest.testUDPTimeout -*graalpython.lib-python.3.test.test_socket.UnbufferedFileObjectClassTestCase.testAttributes -*graalpython.lib-python.3.test.test_socket.UnbufferedFileObjectClassTestCase.testCloseAfterMakefile -*graalpython.lib-python.3.test.test_socket.UnbufferedFileObjectClassTestCase.testClosedAttr -*graalpython.lib-python.3.test.test_socket.UnbufferedFileObjectClassTestCase.testFullRead -*graalpython.lib-python.3.test.test_socket.UnbufferedFileObjectClassTestCase.testMakefileAfterMakefileClose -*graalpython.lib-python.3.test.test_socket.UnbufferedFileObjectClassTestCase.testMakefileClose -*graalpython.lib-python.3.test.test_socket.UnbufferedFileObjectClassTestCase.testMakefileCloseSocketDestroy -*graalpython.lib-python.3.test.test_socket.UnbufferedFileObjectClassTestCase.testReadAfterTimeout -*graalpython.lib-python.3.test.test_socket.UnbufferedFileObjectClassTestCase.testReadline -*graalpython.lib-python.3.test.test_socket.UnbufferedFileObjectClassTestCase.testRealClose -*graalpython.lib-python.3.test.test_socket.UnbufferedFileObjectClassTestCase.testSmallRead -*graalpython.lib-python.3.test.test_socket.UnbufferedFileObjectClassTestCase.testSmallReadNonBlocking -*graalpython.lib-python.3.test.test_socket.UnbufferedFileObjectClassTestCase.testUnbufferedRead -*graalpython.lib-python.3.test.test_socket.UnbufferedFileObjectClassTestCase.testUnbufferedReadline -*graalpython.lib-python.3.test.test_socket.UnbufferedFileObjectClassTestCase.testWriteNonBlocking -*graalpython.lib-python.3.test.test_socket.UnicodeReadFileObjectClassTestCase.testAttributes -*graalpython.lib-python.3.test.test_socket.UnicodeReadFileObjectClassTestCase.testCloseAfterMakefile -*graalpython.lib-python.3.test.test_socket.UnicodeReadFileObjectClassTestCase.testClosedAttr -*graalpython.lib-python.3.test.test_socket.UnicodeReadFileObjectClassTestCase.testFullRead -*graalpython.lib-python.3.test.test_socket.UnicodeReadFileObjectClassTestCase.testMakefileAfterMakefileClose -*graalpython.lib-python.3.test.test_socket.UnicodeReadFileObjectClassTestCase.testReadAfterTimeout -*graalpython.lib-python.3.test.test_socket.UnicodeReadFileObjectClassTestCase.testReadline -*graalpython.lib-python.3.test.test_socket.UnicodeReadFileObjectClassTestCase.testRealClose -*graalpython.lib-python.3.test.test_socket.UnicodeReadFileObjectClassTestCase.testSmallRead -*graalpython.lib-python.3.test.test_socket.UnicodeReadFileObjectClassTestCase.testUnbufferedRead -*graalpython.lib-python.3.test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testAttributes -*graalpython.lib-python.3.test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testCloseAfterMakefile -*graalpython.lib-python.3.test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testClosedAttr -*graalpython.lib-python.3.test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testFullRead -*graalpython.lib-python.3.test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testMakefileAfterMakefileClose -*graalpython.lib-python.3.test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testReadAfterTimeout -*graalpython.lib-python.3.test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testReadline -*graalpython.lib-python.3.test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testRealClose -*graalpython.lib-python.3.test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testSmallRead -*graalpython.lib-python.3.test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testUnbufferedRead -*graalpython.lib-python.3.test.test_socket.UnicodeWriteFileObjectClassTestCase.testAttributes -*graalpython.lib-python.3.test.test_socket.UnicodeWriteFileObjectClassTestCase.testCloseAfterMakefile -*graalpython.lib-python.3.test.test_socket.UnicodeWriteFileObjectClassTestCase.testClosedAttr -*graalpython.lib-python.3.test.test_socket.UnicodeWriteFileObjectClassTestCase.testFullRead -*graalpython.lib-python.3.test.test_socket.UnicodeWriteFileObjectClassTestCase.testMakefileAfterMakefileClose -*graalpython.lib-python.3.test.test_socket.UnicodeWriteFileObjectClassTestCase.testReadAfterTimeout -*graalpython.lib-python.3.test.test_socket.UnicodeWriteFileObjectClassTestCase.testReadline -*graalpython.lib-python.3.test.test_socket.UnicodeWriteFileObjectClassTestCase.testRealClose -*graalpython.lib-python.3.test.test_socket.UnicodeWriteFileObjectClassTestCase.testSmallRead -*graalpython.lib-python.3.test.test_socket.UnicodeWriteFileObjectClassTestCase.testUnbufferedRead +test.test_socket.BasicSocketPairTest.testDefaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.BasicSocketPairTest.testRecv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.BasicSocketPairTest.testSend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.BasicTCPTest.testDetach @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BasicTCPTest.testDup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BasicTCPTest.testFromFd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BasicTCPTest.testOverFlowRecv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BasicTCPTest.testOverFlowRecvFrom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BasicTCPTest.testRecv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BasicTCPTest.testRecvFrom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BasicTCPTest.testSendAll @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BasicTCPTest.testShutdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BasicTCPTest2.testDetach @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BasicTCPTest2.testDup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BasicTCPTest2.testFromFd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BasicTCPTest2.testOverFlowRecv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BasicTCPTest2.testOverFlowRecvFrom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BasicTCPTest2.testRecv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BasicTCPTest2.testRecvFrom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BasicTCPTest2.testSendAll @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BasicTCPTest2.testShutdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BasicUDPTest.testRecvFrom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.BasicUDPTest.testRecvFromNegative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.BasicUDPTest.testSendtoAndRecv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.BufferIOTest.testRecvFromIntoArray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BufferIOTest.testRecvFromIntoBytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BufferIOTest.testRecvFromIntoEmptyBuffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BufferIOTest.testRecvFromIntoMemoryview @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BufferIOTest.testRecvFromIntoSmallBuffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BufferIOTest.testRecvIntoArray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BufferIOTest.testRecvIntoBytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.BufferIOTest.testRecvIntoMemoryview @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.ContextManagersTest.testCreateConnectionBase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.ContextManagersTest.testCreateConnectionClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.CreateServerFunctionalTest.test_dual_stack_client_v4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.CreateServerFunctionalTest.test_dual_stack_client_v6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.CreateServerFunctionalTest.test_tcp4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.CreateServerFunctionalTest.test_tcp6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.CreateServerTest.test_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.CreateServerTest.test_dualstack_ipv6_family @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.CreateServerTest.test_family_and_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.CreateServerTest.test_ipv6_only_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.CreateServerTest.test_reuse_port @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.FileObjectClassTestCase.testAttributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.FileObjectClassTestCase.testCloseAfterMakefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.FileObjectClassTestCase.testClosedAttr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.FileObjectClassTestCase.testFullRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.FileObjectClassTestCase.testMakefileAfterMakefileClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.FileObjectClassTestCase.testReadAfterTimeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.FileObjectClassTestCase.testReadline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.FileObjectClassTestCase.testRealClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.FileObjectClassTestCase.testSmallRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.FileObjectClassTestCase.testUnbufferedRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.GeneralModuleTests.testCloseException @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.testCrucialConstants @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.testCrucialIpProtoConstants @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.testDefaultTimeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.testGetServBy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.GeneralModuleTests.testGetSockOpt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.GeneralModuleTests.testHostnameRes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.testIPv4_inet_aton_fourbytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.testIPv4toString @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.GeneralModuleTests.testIPv6toString @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.testInterpreterCrash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.testNewAttributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.testNtoH @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.testRefCountGetNameInfo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.testSendAfterClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.testSendtoErrors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.testSetSockOpt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.GeneralModuleTests.testSockName @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.GeneralModuleTests.testSocketError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.testStringToIPv4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.testStringToIPv6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.GeneralModuleTests.test_SocketType_is_socketobject @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_addressfamily_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_addressinfo_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_csocket_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_flowinfo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_getaddrinfo_ipv6_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.GeneralModuleTests.test_getfqdn_filter_localhost @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_getnameinfo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.GeneralModuleTests.test_getsockaddrarg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.GeneralModuleTests.test_host_resolution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.GeneralModuleTests.test_host_resolution_bad_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_idna @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_listen_backlog @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_makefile_invalid_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_makefile_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_msgflag_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_name_closed_socketio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_socket_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_socket_consistent_sock_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_socket_fileno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_socket_fileno_rejects_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_socket_fileno_rejects_invalid_socket @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_socket_fileno_rejects_negative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.GeneralModuleTests.test_socket_fileno_rejects_other_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_socket_fileno_requires_socket_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_socket_fileno_requires_valid_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_socket_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_socketkind_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_str_for_enums @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_unknown_socket_family_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.GeneralModuleTests.test_unusable_closed_socketio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.InheritanceTest.test_default_inheritable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.InheritanceTest.test_dup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.InheritanceTest.test_set_inheritable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.InheritanceTest.test_socketpair @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testAttributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testCloseAfterMakefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testClosedAttr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testFullRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testMakefileAfterMakefileClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testReadAfterTimeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testReadline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testRealClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testSmallRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testUnbufferedRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.NetworkConnectionAttributesTest.testFamily @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.NetworkConnectionAttributesTest.testSourceAddress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.NetworkConnectionAttributesTest.testTimeoutDefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.NetworkConnectionAttributesTest.testTimeoutNone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.NetworkConnectionAttributesTest.testTimeoutValueNamed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.NetworkConnectionAttributesTest.testTimeoutValueNonamed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.NetworkConnectionBehaviourTest.testInsideTimeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.NetworkConnectionBehaviourTest.testOutsideTimeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.NetworkConnectionNoServer.test_connect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.NetworkConnectionNoServer.test_create_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.NetworkConnectionNoServer.test_create_connection_all_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.NetworkConnectionNoServer.test_create_connection_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.NonBlockingTCPTests.testAccept @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.NonBlockingTCPTests.testInheritFlagsBlocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.NonBlockingTCPTests.testInheritFlagsTimeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.NonBlockingTCPTests.testRecv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SendfileUsingSendTest.testCount @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SendfileUsingSendTest.testCountSmall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SendfileUsingSendTest.testCountWithOffset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SendfileUsingSendTest.testEmptyFileSend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SendfileUsingSendTest.testNonBlocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SendfileUsingSendTest.testNonRegularFile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SendfileUsingSendTest.testOffset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SendfileUsingSendTest.testRegularFile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SendfileUsingSendTest.testWithTimeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SendfileUsingSendTest.testWithTimeoutTriggeredSend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SendfileUsingSendTest.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testAttributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testCloseAfterMakefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testClosedAttr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testFullRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testMakefileAfterMakefileClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testReadAfterTimeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testReadline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testRealClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testSmallRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testUnbufferedRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.TCPCloserTest.testClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.TCPTimeoutTest.testTCPTimeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.TCPTimeoutTest.testTimeoutZero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.TestExceptions.testExceptionTree @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.TestExceptions.test_setblocking_invalidfd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.TestLinuxAbstractNamespace.testAutobind @ linux-aarch64,linux-x86_64 +test.test_socket.TestLinuxAbstractNamespace.testBytearrayName @ linux-aarch64,linux-x86_64 +test.test_socket.TestLinuxAbstractNamespace.testLinuxAbstractNamespace @ linux-aarch64,linux-x86_64 +test.test_socket.TestLinuxAbstractNamespace.testMaxName @ linux-aarch64,linux-x86_64 +test.test_socket.TestLinuxAbstractNamespace.testNameOverflow @ linux-aarch64,linux-x86_64 +test.test_socket.TestLinuxAbstractNamespace.testStrName @ linux-aarch64,linux-x86_64 +test.test_socket.TestMSWindowsTCPFlags.test_new_tcp_flags @ win32-AMD64 +test.test_socket.TestUnixDomain.testBytesAddr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.TestUnixDomain.testEmptyAddress @ darwin-arm64,darwin-x86_64 +test.test_socket.TestUnixDomain.testStrAddr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.TestUnixDomain.testUnbound @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UDPTimeoutTest.testTimeoutZero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.UDPTimeoutTest.testUDPTimeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socket.UnbufferedFileObjectClassTestCase.testAttributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testCloseAfterMakefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testClosedAttr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testFullRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testMakefileAfterMakefileClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testMakefileClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testReadAfterTimeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testReadline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testRealClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testSmallRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testSmallReadNonBlocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testUnbufferedRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testUnbufferedReadline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testWriteNonBlocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testAttributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testCloseAfterMakefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testClosedAttr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testFullRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testMakefileAfterMakefileClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testReadAfterTimeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testReadline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testRealClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testSmallRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testUnbufferedRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testAttributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testCloseAfterMakefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testClosedAttr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testFullRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testMakefileAfterMakefileClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testReadAfterTimeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testReadline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testRealClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testSmallRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testUnbufferedRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testAttributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testCloseAfterMakefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testClosedAttr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testFullRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testMakefileAfterMakefileClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testReadAfterTimeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testReadline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testRealClose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testSmallRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testUnbufferedRead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_socketserver.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_socketserver.txt index ce903b1d50..6543aefeb9 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_socketserver.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_socketserver.txt @@ -1,27 +1,20 @@ -*graalpython.lib-python.3.test.test_socketserver.ErrorHandlerTest.test_forking_handled -*graalpython.lib-python.3.test.test_socketserver.ErrorHandlerTest.test_forking_not_handled -*graalpython.lib-python.3.test.test_socketserver.ErrorHandlerTest.test_sync_handled -*graalpython.lib-python.3.test.test_socketserver.ErrorHandlerTest.test_sync_not_handled -*graalpython.lib-python.3.test.test_socketserver.ErrorHandlerTest.test_threading_handled -*graalpython.lib-python.3.test.test_socketserver.ErrorHandlerTest.test_threading_not_handled -*graalpython.lib-python.3.test.test_socketserver.MiscTestCase.test_all -*graalpython.lib-python.3.test.test_socketserver.MiscTestCase.test_shutdown_request_called_if_verify_request_false -*graalpython.lib-python.3.test.test_socketserver.MiscTestCase.test_threads_reaped -*graalpython.lib-python.3.test.test_socketserver.SocketServerTest.test_ForkingTCPServer -*graalpython.lib-python.3.test.test_socketserver.SocketServerTest.test_ForkingUDPServer -*graalpython.lib-python.3.test.test_socketserver.SocketServerTest.test_ForkingUnixDatagramServer -*graalpython.lib-python.3.test.test_socketserver.SocketServerTest.test_ForkingUnixStreamServer -*graalpython.lib-python.3.test.test_socketserver.SocketServerTest.test_TCPServer -*graalpython.lib-python.3.test.test_socketserver.SocketServerTest.test_ThreadingTCPServer -*graalpython.lib-python.3.test.test_socketserver.SocketServerTest.test_ThreadingUDPServer -*graalpython.lib-python.3.test.test_socketserver.SocketServerTest.test_ThreadingUnixDatagramServer -*graalpython.lib-python.3.test.test_socketserver.SocketServerTest.test_ThreadingUnixStreamServer -*graalpython.lib-python.3.test.test_socketserver.SocketServerTest.test_UDPServer -*graalpython.lib-python.3.test.test_socketserver.SocketServerTest.test_UnixDatagramServer -*graalpython.lib-python.3.test.test_socketserver.SocketServerTest.test_UnixStreamServer -*graalpython.lib-python.3.test.test_socketserver.SocketServerTest.test_close_immediately -*graalpython.lib-python.3.test.test_socketserver.SocketServerTest.test_context_manager -*graalpython.lib-python.3.test.test_socketserver.SocketServerTest.test_shutdown -*graalpython.lib-python.3.test.test_socketserver.SocketServerTest.test_tcpserver_bind_leak -*graalpython.lib-python.3.test.test_socketserver.SocketWriterTest.test_basics -*graalpython.lib-python.3.test.test_socketserver.SocketWriterTest.test_write +test.test_socketserver.ErrorHandlerTest.test_sync_handled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socketserver.ErrorHandlerTest.test_sync_not_handled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socketserver.ErrorHandlerTest.test_threading_handled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socketserver.ErrorHandlerTest.test_threading_not_handled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socketserver.MiscTestCase.test_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socketserver.MiscTestCase.test_shutdown_request_called_if_verify_request_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socketserver.MiscTestCase.test_threads_reaped @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socketserver.SocketServerTest.test_TCPServer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socketserver.SocketServerTest.test_ThreadingTCPServer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socketserver.SocketServerTest.test_ThreadingUDPServer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socketserver.SocketServerTest.test_ThreadingUnixDatagramServer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socketserver.SocketServerTest.test_ThreadingUnixStreamServer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socketserver.SocketServerTest.test_UDPServer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socketserver.SocketServerTest.test_UnixDatagramServer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socketserver.SocketServerTest.test_UnixStreamServer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_socketserver.SocketServerTest.test_close_immediately @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socketserver.SocketServerTest.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socketserver.SocketServerTest.test_shutdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socketserver.SocketServerTest.test_tcpserver_bind_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_socketserver.SocketWriterTest.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sort.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sort.txt index 35afe908ad..6796ae6f43 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sort.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sort.txt @@ -1,20 +1,19 @@ -*graalpython.lib-python.3.test.test_sort.TestBase.testStressfully -*graalpython.lib-python.3.test.test_sort.TestBugs.test_bug453523 -*graalpython.lib-python.3.test.test_sort.TestBugs.test_undetected_mutation -*graalpython.lib-python.3.test.test_sort.TestDecorateSortUndecorate.test_baddecorator -*graalpython.lib-python.3.test.test_sort.TestDecorateSortUndecorate.test_decorated -*graalpython.lib-python.3.test.test_sort.TestDecorateSortUndecorate.test_key_with_exception -*graalpython.lib-python.3.test.test_sort.TestDecorateSortUndecorate.test_key_with_mutating_del -*graalpython.lib-python.3.test.test_sort.TestDecorateSortUndecorate.test_key_with_mutating_del_and_exception -*graalpython.lib-python.3.test.test_sort.TestDecorateSortUndecorate.test_key_with_mutation -*graalpython.lib-python.3.test.test_sort.TestDecorateSortUndecorate.test_reverse -*graalpython.lib-python.3.test.test_sort.TestDecorateSortUndecorate.test_reverse_stability -*graalpython.lib-python.3.test.test_sort.TestDecorateSortUndecorate.test_stability -*graalpython.lib-python.3.test.test_sort.TestOptimizedCompares.test_none_in_tuples -*graalpython.lib-python.3.test.test_sort.TestOptimizedCompares.test_not_all_tuples -*graalpython.lib-python.3.test.test_sort.TestOptimizedCompares.test_safe_object_compare -*graalpython.lib-python.3.test.test_sort.TestOptimizedCompares.test_unsafe_float_compare -*graalpython.lib-python.3.test.test_sort.TestOptimizedCompares.test_unsafe_latin_compare -*graalpython.lib-python.3.test.test_sort.TestOptimizedCompares.test_unsafe_long_compare -*graalpython.lib-python.3.test.test_sort.TestOptimizedCompares.test_unsafe_object_compare -*graalpython.lib-python.3.test.test_sort.TestOptimizedCompares.test_unsafe_tuple_compare +test.test_sort.TestBase.testStressfully @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sort.TestBugs.test_bug453523 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sort.TestBugs.test_undetected_mutation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sort.TestDecorateSortUndecorate.test_baddecorator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sort.TestDecorateSortUndecorate.test_decorated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sort.TestDecorateSortUndecorate.test_key_with_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sort.TestDecorateSortUndecorate.test_key_with_mutating_del_and_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sort.TestDecorateSortUndecorate.test_key_with_mutation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sort.TestDecorateSortUndecorate.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sort.TestDecorateSortUndecorate.test_reverse_stability @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sort.TestDecorateSortUndecorate.test_stability @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sort.TestOptimizedCompares.test_none_in_tuples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sort.TestOptimizedCompares.test_not_all_tuples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sort.TestOptimizedCompares.test_safe_object_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sort.TestOptimizedCompares.test_unsafe_float_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sort.TestOptimizedCompares.test_unsafe_latin_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sort.TestOptimizedCompares.test_unsafe_long_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sort.TestOptimizedCompares.test_unsafe_object_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sort.TestOptimizedCompares.test_unsafe_tuple_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_source_encoding.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_source_encoding.txt index f4ab321f80..f804cabc86 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_source_encoding.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_source_encoding.txt @@ -1,40 +1,40 @@ -*graalpython.lib-python.3.test.test_source_encoding.BytesSourceEncodingTest.test_crcrcrlf -*graalpython.lib-python.3.test.test_source_encoding.BytesSourceEncodingTest.test_crcrcrlf2 -*graalpython.lib-python.3.test.test_source_encoding.BytesSourceEncodingTest.test_crcrlf -*graalpython.lib-python.3.test.test_source_encoding.BytesSourceEncodingTest.test_crlf -*graalpython.lib-python.3.test.test_source_encoding.BytesSourceEncodingTest.test_default_coding -*graalpython.lib-python.3.test.test_source_encoding.BytesSourceEncodingTest.test_double_coding_line -*graalpython.lib-python.3.test.test_source_encoding.BytesSourceEncodingTest.test_double_coding_same_line -*graalpython.lib-python.3.test.test_source_encoding.BytesSourceEncodingTest.test_first_coding_line -*graalpython.lib-python.3.test.test_source_encoding.BytesSourceEncodingTest.test_first_non_utf8_coding_line -*graalpython.lib-python.3.test.test_source_encoding.BytesSourceEncodingTest.test_second_coding_line -*graalpython.lib-python.3.test.test_source_encoding.BytesSourceEncodingTest.test_second_non_utf8_coding_line -*graalpython.lib-python.3.test.test_source_encoding.BytesSourceEncodingTest.test_third_coding_line -*graalpython.lib-python.3.test.test_source_encoding.BytesSourceEncodingTest.test_utf8_bom -*graalpython.lib-python.3.test.test_source_encoding.BytesSourceEncodingTest.test_utf8_bom_and_utf8_coding_line -*graalpython.lib-python.3.test.test_source_encoding.FileSourceEncodingTest.test_crcrcrlf -*graalpython.lib-python.3.test.test_source_encoding.FileSourceEncodingTest.test_crcrcrlf2 -*graalpython.lib-python.3.test.test_source_encoding.FileSourceEncodingTest.test_crcrlf -*graalpython.lib-python.3.test.test_source_encoding.FileSourceEncodingTest.test_crlf -*graalpython.lib-python.3.test.test_source_encoding.FileSourceEncodingTest.test_default_coding -*graalpython.lib-python.3.test.test_source_encoding.FileSourceEncodingTest.test_double_coding_line -*graalpython.lib-python.3.test.test_source_encoding.FileSourceEncodingTest.test_double_coding_same_line -*graalpython.lib-python.3.test.test_source_encoding.FileSourceEncodingTest.test_first_coding_line -*graalpython.lib-python.3.test.test_source_encoding.FileSourceEncodingTest.test_first_non_utf8_coding_line -*graalpython.lib-python.3.test.test_source_encoding.FileSourceEncodingTest.test_second_coding_line -*graalpython.lib-python.3.test.test_source_encoding.FileSourceEncodingTest.test_second_non_utf8_coding_line -*graalpython.lib-python.3.test.test_source_encoding.FileSourceEncodingTest.test_third_coding_line -*graalpython.lib-python.3.test.test_source_encoding.FileSourceEncodingTest.test_utf8_bom -*graalpython.lib-python.3.test.test_source_encoding.FileSourceEncodingTest.test_utf8_bom_and_utf8_coding_line -*graalpython.lib-python.3.test.test_source_encoding.MiscSourceEncodingTest.test_20731 -*graalpython.lib-python.3.test.test_source_encoding.MiscSourceEncodingTest.test_bad_coding -*graalpython.lib-python.3.test.test_source_encoding.MiscSourceEncodingTest.test_bad_coding2 -*graalpython.lib-python.3.test.test_source_encoding.MiscSourceEncodingTest.test_compilestring -*graalpython.lib-python.3.test.test_source_encoding.MiscSourceEncodingTest.test_error_message -*graalpython.lib-python.3.test.test_source_encoding.MiscSourceEncodingTest.test_exec_valid_coding -*graalpython.lib-python.3.test.test_source_encoding.MiscSourceEncodingTest.test_file_parse -*graalpython.lib-python.3.test.test_source_encoding.MiscSourceEncodingTest.test_issue2301 -*graalpython.lib-python.3.test.test_source_encoding.MiscSourceEncodingTest.test_issue3297 -*graalpython.lib-python.3.test.test_source_encoding.MiscSourceEncodingTest.test_issue4626 -*graalpython.lib-python.3.test.test_source_encoding.MiscSourceEncodingTest.test_issue7820 -*graalpython.lib-python.3.test.test_source_encoding.MiscSourceEncodingTest.test_pep263 +test.test_source_encoding.BytesSourceEncodingTest.test_crcrcrlf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.BytesSourceEncodingTest.test_crcrcrlf2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.BytesSourceEncodingTest.test_crcrlf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.BytesSourceEncodingTest.test_crlf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.BytesSourceEncodingTest.test_default_coding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.BytesSourceEncodingTest.test_double_coding_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.BytesSourceEncodingTest.test_double_coding_same_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.BytesSourceEncodingTest.test_first_coding_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.BytesSourceEncodingTest.test_first_non_utf8_coding_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.BytesSourceEncodingTest.test_second_coding_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.BytesSourceEncodingTest.test_second_non_utf8_coding_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.BytesSourceEncodingTest.test_third_coding_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.BytesSourceEncodingTest.test_utf8_bom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.BytesSourceEncodingTest.test_utf8_bom_and_utf8_coding_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.FileSourceEncodingTest.test_crcrcrlf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.FileSourceEncodingTest.test_crcrcrlf2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.FileSourceEncodingTest.test_crcrlf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.FileSourceEncodingTest.test_crlf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.FileSourceEncodingTest.test_default_coding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.FileSourceEncodingTest.test_double_coding_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.FileSourceEncodingTest.test_double_coding_same_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.FileSourceEncodingTest.test_first_coding_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.FileSourceEncodingTest.test_first_non_utf8_coding_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.FileSourceEncodingTest.test_second_coding_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.FileSourceEncodingTest.test_second_non_utf8_coding_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.FileSourceEncodingTest.test_third_coding_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.FileSourceEncodingTest.test_utf8_bom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.FileSourceEncodingTest.test_utf8_bom_and_utf8_coding_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.MiscSourceEncodingTest.test_20731 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.MiscSourceEncodingTest.test_bad_coding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.MiscSourceEncodingTest.test_bad_coding2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.MiscSourceEncodingTest.test_compilestring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.MiscSourceEncodingTest.test_error_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.MiscSourceEncodingTest.test_exec_valid_coding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.MiscSourceEncodingTest.test_file_parse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.MiscSourceEncodingTest.test_issue2301 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.MiscSourceEncodingTest.test_issue3297 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.MiscSourceEncodingTest.test_issue4626 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.MiscSourceEncodingTest.test_issue7820 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_source_encoding.MiscSourceEncodingTest.test_pep263 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sqlite3.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sqlite3.txt index ccbbb2927d..f311a1d41d 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sqlite3.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sqlite3.txt @@ -1,432 +1,421 @@ -*test.test_sqlite3.test_backup.BackupTests.test_bad_source_closed_connection -*test.test_sqlite3.test_backup.BackupTests.test_bad_target -*test.test_sqlite3.test_backup.BackupTests.test_bad_target_closed_connection -*test.test_sqlite3.test_backup.BackupTests.test_bad_target_filename -*test.test_sqlite3.test_backup.BackupTests.test_bad_target_in_transaction -*test.test_sqlite3.test_backup.BackupTests.test_bad_target_same_connection -*test.test_sqlite3.test_backup.BackupTests.test_database_source_name -*test.test_sqlite3.test_backup.BackupTests.test_failing_progress -*test.test_sqlite3.test_backup.BackupTests.test_keyword_only_args -*test.test_sqlite3.test_backup.BackupTests.test_modifying_progress -*test.test_sqlite3.test_backup.BackupTests.test_non_callable_progress -*test.test_sqlite3.test_backup.BackupTests.test_progress -*test.test_sqlite3.test_backup.BackupTests.test_progress_all_pages_at_once_1 -*test.test_sqlite3.test_backup.BackupTests.test_progress_all_pages_at_once_2 -*test.test_sqlite3.test_backup.BackupTests.test_simple -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_32bit_rowid -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_closed -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_closed_db_read -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_context_manager -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_context_manager_reraise_exceptions -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_get_empty_slice -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_get_item -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_get_item_error -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_get_slice -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_get_slice_negative_index -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_get_slice_with_skip -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_is_a_blob -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_length -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_mapping_invalid_index_type -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_open_error -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_read -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_read_advance_offset -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_read_at_offset -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_read_error_row_changed -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_read_oversized -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_seek_and_tell -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_seek_error -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_sequence_not_supported -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_empty_slice -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_item -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_item_error -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_item_negative_index -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_item_with_offset -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_slice -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_slice_buffer_object -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_slice_error -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_slice_with_skip -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_write -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_write_advance_offset -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_write_at_offset -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_write_error_length -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_write_error_readonly -*test.test_sqlite3.test_dbapi.BlobTests.test_blob_write_error_row_changed -*test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_call -*test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_con_commit -*test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_con_cursor -*test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_con_rollback -*test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_create_aggregate -*test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_create_function -*test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_cur_execute -*test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_set_authorizer -*test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_set_progress_callback -*test.test_sqlite3.test_dbapi.ClosedCurTests.test_closed -*test.test_sqlite3.test_dbapi.ConnectionTests.test_close -*test.test_sqlite3.test_dbapi.ConnectionTests.test_commit -*test.test_sqlite3.test_dbapi.ConnectionTests.test_commit_after_no_changes -*test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_bad_limit_category -*test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_bad_reinit -*test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_exceptions -*test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_init_bad_isolation_level -*test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_init_good_isolation_levels -*test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_limits -*test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_reinit -*test.test_sqlite3.test_dbapi.ConnectionTests.test_cursor -*test.test_sqlite3.test_dbapi.ConnectionTests.test_drop_unused_refs -*test.test_sqlite3.test_dbapi.ConnectionTests.test_exceptions -*test.test_sqlite3.test_dbapi.ConnectionTests.test_failed_open -*test.test_sqlite3.test_dbapi.ConnectionTests.test_in_transaction -*test.test_sqlite3.test_dbapi.ConnectionTests.test_in_transaction_ro -*test.test_sqlite3.test_dbapi.ConnectionTests.test_interrupt -*test.test_sqlite3.test_dbapi.ConnectionTests.test_interrupt_on_closed_db -*test.test_sqlite3.test_dbapi.ConnectionTests.test_rollback -*test.test_sqlite3.test_dbapi.ConnectionTests.test_rollback_after_no_changes -*test.test_sqlite3.test_dbapi.ConnectionTests.test_use_after_close -*test.test_sqlite3.test_dbapi.ConstructorTests.test_binary -*test.test_sqlite3.test_dbapi.ConstructorTests.test_date -*test.test_sqlite3.test_dbapi.ConstructorTests.test_date_from_ticks -*test.test_sqlite3.test_dbapi.ConstructorTests.test_time -*test.test_sqlite3.test_dbapi.ConstructorTests.test_time_from_ticks -*test.test_sqlite3.test_dbapi.ConstructorTests.test_timestamp -*test.test_sqlite3.test_dbapi.ConstructorTests.test_timestamp_from_ticks -*test.test_sqlite3.test_dbapi.CursorTests.test_array_size -*test.test_sqlite3.test_dbapi.CursorTests.test_close -*test.test_sqlite3.test_dbapi.CursorTests.test_column_count -*test.test_sqlite3.test_dbapi.CursorTests.test_cursor_connection -*test.test_sqlite3.test_dbapi.CursorTests.test_cursor_wrong_class -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_arg_float -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_arg_int -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_arg_string -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_arg_string_with_zero_byte -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_dict_mapping -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_dict_mapping_mapping -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_dict_mapping_no_args -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_dict_mapping_too_little_args -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_dict_mapping_unnamed -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_illegal_sql -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_many_generator -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_many_iterator -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_many_not_iterable -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_many_select -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_many_sequence -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_many_wrong_sql_arg -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_multiple_statements -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_no_args -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_non_iterable -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_param_list -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_param_sequence -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_param_sequence_bad_len -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_too_many_params -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_with_appended_comments -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_wrong_no_of_args1 -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_wrong_no_of_args2 -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_wrong_no_of_args3 -*test.test_sqlite3.test_dbapi.CursorTests.test_execute_wrong_sql_arg -*test.test_sqlite3.test_dbapi.CursorTests.test_fetch_iter -*test.test_sqlite3.test_dbapi.CursorTests.test_fetchall -*test.test_sqlite3.test_dbapi.CursorTests.test_fetchmany -*test.test_sqlite3.test_dbapi.CursorTests.test_fetchmany_kw_arg -*test.test_sqlite3.test_dbapi.CursorTests.test_fetchone -*test.test_sqlite3.test_dbapi.CursorTests.test_fetchone_no_statement -*test.test_sqlite3.test_dbapi.CursorTests.test_last_row_id_insert_o_r -*test.test_sqlite3.test_dbapi.CursorTests.test_last_row_id_on_ignore -*test.test_sqlite3.test_dbapi.CursorTests.test_last_row_id_on_replace -*test.test_sqlite3.test_dbapi.CursorTests.test_rowcount_execute -*test.test_sqlite3.test_dbapi.CursorTests.test_rowcount_executemany -*test.test_sqlite3.test_dbapi.CursorTests.test_rowcount_prefixed_with_comment -*test.test_sqlite3.test_dbapi.CursorTests.test_rowcount_select -*test.test_sqlite3.test_dbapi.CursorTests.test_rowcount_update_returning -*test.test_sqlite3.test_dbapi.CursorTests.test_rowcount_vaccuum -*test.test_sqlite3.test_dbapi.CursorTests.test_same_query_in_multiple_cursors -*test.test_sqlite3.test_dbapi.CursorTests.test_setinputsizes -*test.test_sqlite3.test_dbapi.CursorTests.test_setoutputsize -*test.test_sqlite3.test_dbapi.CursorTests.test_setoutputsize_no_column -*test.test_sqlite3.test_dbapi.CursorTests.test_total_changes -*test.test_sqlite3.test_dbapi.CursorTests.test_wrong_cursor_callable -*test.test_sqlite3.test_dbapi.ExtensionTests.test_connection_execute -*test.test_sqlite3.test_dbapi.ExtensionTests.test_connection_executemany -*test.test_sqlite3.test_dbapi.ExtensionTests.test_connection_executescript -*test.test_sqlite3.test_dbapi.ExtensionTests.test_cursor_executescript_as_bytes -*test.test_sqlite3.test_dbapi.ExtensionTests.test_cursor_executescript_too_large_script -*test.test_sqlite3.test_dbapi.ExtensionTests.test_cursor_executescript_tx_control -*test.test_sqlite3.test_dbapi.ExtensionTests.test_cursor_executescript_with_null_characters -*test.test_sqlite3.test_dbapi.ExtensionTests.test_cursor_executescript_with_surrogates -*test.test_sqlite3.test_dbapi.ExtensionTests.test_script_error_normal -*test.test_sqlite3.test_dbapi.ExtensionTests.test_script_string_sql -*test.test_sqlite3.test_dbapi.ExtensionTests.test_script_syntax_error -*test.test_sqlite3.test_dbapi.ModuleTests.test_api_level -*test.test_sqlite3.test_dbapi.ModuleTests.test_complete_statement -*test.test_sqlite3.test_dbapi.ModuleTests.test_data_error -*test.test_sqlite3.test_dbapi.ModuleTests.test_database_error -*test.test_sqlite3.test_dbapi.ModuleTests.test_disallow_instantiation -*test.test_sqlite3.test_dbapi.ModuleTests.test_error -*test.test_sqlite3.test_dbapi.ModuleTests.test_error_code_on_exception -*test.test_sqlite3.test_dbapi.ModuleTests.test_extended_error_code_on_exception -*test.test_sqlite3.test_dbapi.ModuleTests.test_integrity_error -*test.test_sqlite3.test_dbapi.ModuleTests.test_interface_error -*test.test_sqlite3.test_dbapi.ModuleTests.test_internal_error -*test.test_sqlite3.test_dbapi.ModuleTests.test_module_constants -*test.test_sqlite3.test_dbapi.ModuleTests.test_not_supported_error -*test.test_sqlite3.test_dbapi.ModuleTests.test_operational_error -*test.test_sqlite3.test_dbapi.ModuleTests.test_param_style -*test.test_sqlite3.test_dbapi.ModuleTests.test_programming_error -*test.test_sqlite3.test_dbapi.ModuleTests.test_shared_cache_deprecated -*test.test_sqlite3.test_dbapi.ModuleTests.test_thread_safety -*test.test_sqlite3.test_dbapi.ModuleTests.test_warning -*test.test_sqlite3.test_dbapi.MultiprocessTests.test_ctx_mgr_rollback_if_commit_failed -*test.test_sqlite3.test_dbapi.OpenTests.test_database_keyword -*test.test_sqlite3.test_dbapi.OpenTests.test_factory_database_arg -*test.test_sqlite3.test_dbapi.OpenTests.test_open_undecodable_uri -*test.test_sqlite3.test_dbapi.OpenTests.test_open_unquoted_uri -*test.test_sqlite3.test_dbapi.OpenTests.test_open_uri -*test.test_sqlite3.test_dbapi.OpenTests.test_open_uri_readonly -*test.test_sqlite3.test_dbapi.OpenTests.test_open_with_path_like_object -*test.test_sqlite3.test_dbapi.OpenTests.test_open_with_undecodable_path -*test.test_sqlite3.test_dbapi.SerializeTests.test_deserialize_corrupt_database -*test.test_sqlite3.test_dbapi.SerializeTests.test_deserialize_too_much_data_64bit -*test.test_sqlite3.test_dbapi.SerializeTests.test_deserialize_wrong_args -*test.test_sqlite3.test_dbapi.SerializeTests.test_serialize_deserialize -*test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_abort_raises_with_explicit_transactions -*test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_abort_raises_without_transactions -*test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_fail -*test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_ignore -*test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_replace -*test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_rollback_with_explicit_transaction -*test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_rollback_without_transaction -*test.test_sqlite3.test_dbapi.ThreadTests.test_check_connection_thread -*test.test_sqlite3.test_dbapi.ThreadTests.test_check_cursor_thread -*test.test_sqlite3.test_dbapi.ThreadTests.test_dont_check_same_thread -*test.test_sqlite3.test_dbapi.UninitialisedConnectionTests.test_uninit_operations -*test.test_sqlite3.test_dump.DumpTests.test_dump_autoincrement -*test.test_sqlite3.test_dump.DumpTests.test_dump_autoincrement_create_new_db -*test.test_sqlite3.test_dump.DumpTests.test_table_dump -*test.test_sqlite3.test_dump.DumpTests.test_unorderable_row -*test.test_sqlite3.test_factory.ConnectionFactoryTests.test_connection_factories -*test.test_sqlite3.test_factory.ConnectionFactoryTests.test_connection_factory_as_positional_arg -*test.test_sqlite3.test_factory.ConnectionFactoryTests.test_connection_factory_relayed_call -*test.test_sqlite3.test_factory.CursorFactoryTests.test_invalid_factory -*test.test_sqlite3.test_factory.CursorFactoryTests.test_is_instance -*test.test_sqlite3.test_factory.RowFactoryTests.test_custom_factory -*test.test_sqlite3.test_factory.RowFactoryTests.test_fake_cursor_class -*test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_as_dict -*test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_as_sequence -*test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_as_tuple -*test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_hash_cmp -*test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_index -*test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_index_unicode -*test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_iter -*test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_keys -*test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_slice -*test.test_sqlite3.test_factory.RowFactoryTestsBackwardsCompat.test_is_produced_by_factory -*test.test_sqlite3.test_factory.TextFactoryTests.test_custom -*test.test_sqlite3.test_factory.TextFactoryTests.test_optimized_unicode -*test.test_sqlite3.test_factory.TextFactoryTests.test_string -*test.test_sqlite3.test_factory.TextFactoryTests.test_unicode -*test.test_sqlite3.test_factory.TextFactoryTestsWithEmbeddedZeroBytes.test_bytearray -*test.test_sqlite3.test_factory.TextFactoryTestsWithEmbeddedZeroBytes.test_bytes -*test.test_sqlite3.test_factory.TextFactoryTestsWithEmbeddedZeroBytes.test_custom -*test.test_sqlite3.test_factory.TextFactoryTestsWithEmbeddedZeroBytes.test_string -*test.test_sqlite3.test_hooks.CollationTests.test_collation_is_used -*test.test_sqlite3.test_hooks.CollationTests.test_collation_register_twice -*test.test_sqlite3.test_hooks.CollationTests.test_collation_returns_large_integer -*test.test_sqlite3.test_hooks.CollationTests.test_create_collation_bad_upper -*test.test_sqlite3.test_hooks.CollationTests.test_create_collation_not_ascii -*test.test_sqlite3.test_hooks.CollationTests.test_create_collation_not_callable -*test.test_sqlite3.test_hooks.CollationTests.test_create_collation_not_string -*test.test_sqlite3.test_hooks.CollationTests.test_deregister_collation -*test.test_sqlite3.test_hooks.ProgressTests.test_cancel_operation -*test.test_sqlite3.test_hooks.ProgressTests.test_clear_handler -*test.test_sqlite3.test_hooks.ProgressTests.test_error_in_progress_handler -*test.test_sqlite3.test_hooks.ProgressTests.test_error_in_progress_handler_result -*test.test_sqlite3.test_hooks.ProgressTests.test_opcode_count -*test.test_sqlite3.test_hooks.ProgressTests.test_progress_handler_used -*test.test_sqlite3.test_hooks.TraceCallbackTests.test_clear_trace_callback -*test.test_sqlite3.test_hooks.TraceCallbackTests.test_trace_bad_handler -*test.test_sqlite3.test_hooks.TraceCallbackTests.test_trace_callback_content -*test.test_sqlite3.test_hooks.TraceCallbackTests.test_trace_callback_used -*test.test_sqlite3.test_hooks.TraceCallbackTests.test_trace_expanded_sql -*test.test_sqlite3.test_hooks.TraceCallbackTests.test_trace_too_much_expanded_sql -*test.test_sqlite3.test_hooks.TraceCallbackTests.test_unicode_content -*test.test_sqlite3.test_regression.RecursiveUseOfCursors.test_recursive_cursor_close -*test.test_sqlite3.test_regression.RecursiveUseOfCursors.test_recursive_cursor_init -*test.test_sqlite3.test_regression.RecursiveUseOfCursors.test_recursive_cursor_iter -*test.test_sqlite3.test_regression.RegressionTests.test_auto_commit -*test.test_sqlite3.test_regression.RegressionTests.test_bind_mutating_list -*test.test_sqlite3.test_regression.RegressionTests.test_bpo31770 -*test.test_sqlite3.test_regression.RegressionTests.test_bpo37347 -*test.test_sqlite3.test_regression.RegressionTests.test_collation -*test.test_sqlite3.test_regression.RegressionTests.test_column_name_with_spaces -*test.test_sqlite3.test_regression.RegressionTests.test_commit_cursor_reset -*test.test_sqlite3.test_regression.RegressionTests.test_connection_call -*test.test_sqlite3.test_regression.RegressionTests.test_connection_constructor_call_check -*test.test_sqlite3.test_regression.RegressionTests.test_convert_timestamp_microsecond_padding -*test.test_sqlite3.test_regression.RegressionTests.test_cursor_constructor_call_check -*test.test_sqlite3.test_regression.RegressionTests.test_custom_cursor_object_crash_gh_99886 -*test.test_sqlite3.test_regression.RegressionTests.test_del_isolation_level_segfault -*test.test_sqlite3.test_regression.RegressionTests.test_empty_statement -*test.test_sqlite3.test_regression.RegressionTests.test_error_msg_decode_error -*test.test_sqlite3.test_regression.RegressionTests.test_executescript_step_through_select -*test.test_sqlite3.test_regression.RegressionTests.test_invalid_isolation_level_type -*test.test_sqlite3.test_regression.RegressionTests.test_large_sql -*test.test_sqlite3.test_regression.RegressionTests.test_null_character -*test.test_sqlite3.test_regression.RegressionTests.test_on_conflict_rollback -*test.test_sqlite3.test_regression.RegressionTests.test_pragma_autocommit -*test.test_sqlite3.test_regression.RegressionTests.test_pragma_schema_version -*test.test_sqlite3.test_regression.RegressionTests.test_pragma_user_version -*test.test_sqlite3.test_regression.RegressionTests.test_recursive_cursor_use -*test.test_sqlite3.test_regression.RegressionTests.test_register_adapter -*test.test_sqlite3.test_regression.RegressionTests.test_return_empty_bytestring -*test.test_sqlite3.test_regression.RegressionTests.test_set_isolation_level -*test.test_sqlite3.test_regression.RegressionTests.test_statement_finalization_on_close_db -*test.test_sqlite3.test_regression.RegressionTests.test_statement_reset -*test.test_sqlite3.test_regression.RegressionTests.test_str_subclass -*test.test_sqlite3.test_regression.RegressionTests.test_surrogates -*test.test_sqlite3.test_regression.RegressionTests.test_table_lock_cursor_replace_stmt -*test.test_sqlite3.test_regression.RegressionTests.test_type_map_usage -*test.test_sqlite3.test_regression.RegressionTests.test_workaround_for_buggy_sqlite_transfer_bindings -*test.test_sqlite3.test_transactions.IsolationLevelFromInit.test_isolation_level_begin -*test.test_sqlite3.test_transactions.IsolationLevelFromInit.test_isolation_level_default -*test.test_sqlite3.test_transactions.IsolationLevelFromInit.test_isolation_level_deferred -*test.test_sqlite3.test_transactions.IsolationLevelFromInit.test_isolation_level_exclusive -*test.test_sqlite3.test_transactions.IsolationLevelFromInit.test_isolation_level_immediate -*test.test_sqlite3.test_transactions.IsolationLevelFromInit.test_isolation_level_none -*test.test_sqlite3.test_transactions.IsolationLevelPostInit.test_isolation_level_begin -*test.test_sqlite3.test_transactions.IsolationLevelPostInit.test_isolation_level_default -*test.test_sqlite3.test_transactions.IsolationLevelPostInit.test_isolation_level_deferrred -*test.test_sqlite3.test_transactions.IsolationLevelPostInit.test_isolation_level_exclusive -*test.test_sqlite3.test_transactions.IsolationLevelPostInit.test_isolation_level_immediate -*test.test_sqlite3.test_transactions.IsolationLevelPostInit.test_isolation_level_none -*test.test_sqlite3.test_transactions.RollbackTests.test_no_duplicate_rows_after_rollback_close_cursor -*test.test_sqlite3.test_transactions.RollbackTests.test_no_duplicate_rows_after_rollback_del_cursor -*test.test_sqlite3.test_transactions.RollbackTests.test_no_duplicate_rows_after_rollback_new_query -*test.test_sqlite3.test_transactions.SpecialCommandTests.test_drop_table -*test.test_sqlite3.test_transactions.SpecialCommandTests.test_pragma -*test.test_sqlite3.test_transactions.TransactionTests.test_delete_starts_transaction -*test.test_sqlite3.test_transactions.TransactionTests.test_dml_does_not_auto_commit_before -*test.test_sqlite3.test_transactions.TransactionTests.test_insert_starts_transaction -*test.test_sqlite3.test_transactions.TransactionTests.test_locking -*test.test_sqlite3.test_transactions.TransactionTests.test_multiple_cursors_and_iternext -*test.test_sqlite3.test_transactions.TransactionTests.test_raise_timeout -*test.test_sqlite3.test_transactions.TransactionTests.test_replace_starts_transaction -*test.test_sqlite3.test_transactions.TransactionTests.test_rollback_cursor_consistency -*test.test_sqlite3.test_transactions.TransactionTests.test_toggle_auto_commit -*test.test_sqlite3.test_transactions.TransactionTests.test_update_starts_transaction -*test.test_sqlite3.test_transactions.TransactionalDDL.test_ddl_does_not_autostart_transaction -*test.test_sqlite3.test_transactions.TransactionalDDL.test_immediate_transactional_ddl -*test.test_sqlite3.test_transactions.TransactionalDDL.test_transactional_ddl -*test.test_sqlite3.test_types.BinaryConverterTests.test_binary_input_for_converter -*test.test_sqlite3.test_types.ColNamesTests.test_case_in_converter_name -*test.test_sqlite3.test_types.ColNamesTests.test_col_name -*test.test_sqlite3.test_types.ColNamesTests.test_cursor_description_insert -*test.test_sqlite3.test_types.ColNamesTests.test_cursor_description_no_row -*test.test_sqlite3.test_types.ColNamesTests.test_decl_type_not_used -*test.test_sqlite3.test_types.ColNamesTests.test_none -*test.test_sqlite3.test_types.CommonTableExpressionTests.test_cursor_description_cte -*test.test_sqlite3.test_types.CommonTableExpressionTests.test_cursor_description_cte_multiple_columns -*test.test_sqlite3.test_types.CommonTableExpressionTests.test_cursor_description_cte_simple -*test.test_sqlite3.test_types.DateTimeTests.test_date_time_sub_seconds -*test.test_sqlite3.test_types.DateTimeTests.test_date_time_sub_seconds_floating_point -*test.test_sqlite3.test_types.DateTimeTests.test_sql_timestamp -*test.test_sqlite3.test_types.DateTimeTests.test_sqlite_date -*test.test_sqlite3.test_types.DateTimeTests.test_sqlite_timestamp -*test.test_sqlite3.test_types.DeclTypesTests.test_blob -*test.test_sqlite3.test_types.DeclTypesTests.test_bool -*test.test_sqlite3.test_types.DeclTypesTests.test_convert_zero_sized_blob -*test.test_sqlite3.test_types.DeclTypesTests.test_error_in_conform -*test.test_sqlite3.test_types.DeclTypesTests.test_float -*test.test_sqlite3.test_types.DeclTypesTests.test_foo -*test.test_sqlite3.test_types.DeclTypesTests.test_large_int -*test.test_sqlite3.test_types.DeclTypesTests.test_number1 -*test.test_sqlite3.test_types.DeclTypesTests.test_number2 -*test.test_sqlite3.test_types.DeclTypesTests.test_small_int -*test.test_sqlite3.test_types.DeclTypesTests.test_string -*test.test_sqlite3.test_types.DeclTypesTests.test_unicode -*test.test_sqlite3.test_types.DeclTypesTests.test_unsupported_dict -*test.test_sqlite3.test_types.DeclTypesTests.test_unsupported_seq -*test.test_sqlite3.test_types.ObjectAdaptationTests.test_adapt -*test.test_sqlite3.test_types.ObjectAdaptationTests.test_adapt_alt -*test.test_sqlite3.test_types.ObjectAdaptationTests.test_caster_is_used -*test.test_sqlite3.test_types.ObjectAdaptationTests.test_custom_proto -*test.test_sqlite3.test_types.ObjectAdaptationTests.test_defect_proto -*test.test_sqlite3.test_types.ObjectAdaptationTests.test_defect_self_adapt -*test.test_sqlite3.test_types.ObjectAdaptationTests.test_missing_adapter -*test.test_sqlite3.test_types.ObjectAdaptationTests.test_missing_protocol -*test.test_sqlite3.test_types.SqliteTypeTests.test_blob -*test.test_sqlite3.test_types.SqliteTypeTests.test_float -*test.test_sqlite3.test_types.SqliteTypeTests.test_large_int -*test.test_sqlite3.test_types.SqliteTypeTests.test_small_int -*test.test_sqlite3.test_types.SqliteTypeTests.test_string -*test.test_sqlite3.test_types.SqliteTypeTests.test_string_with_null_character -*test.test_sqlite3.test_types.SqliteTypeTests.test_string_with_surrogates -*test.test_sqlite3.test_types.SqliteTypeTests.test_too_large_blob -*test.test_sqlite3.test_types.SqliteTypeTests.test_too_large_int -*test.test_sqlite3.test_types.SqliteTypeTests.test_too_large_string -*test.test_sqlite3.test_types.SqliteTypeTests.test_unicode_execute -*test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_aggr_sum -*test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_param_blob -*test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_param_float -*test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_param_int -*test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_param_none -*test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_param_str -*test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_params_int -*test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_error_on_create -*test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_exception_in_finalize -*test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_exception_in_init -*test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_exception_in_step -*test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_no_finalize -*test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_no_match -*test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_no_step -*test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_text -*test.test_sqlite3.test_userfunctions.AuthorizerIllegalTypeTests.test_clear_authorizer -*test.test_sqlite3.test_userfunctions.AuthorizerIllegalTypeTests.test_column_access -*test.test_sqlite3.test_userfunctions.AuthorizerIllegalTypeTests.test_table_access -*test.test_sqlite3.test_userfunctions.AuthorizerLargeIntegerTests.test_clear_authorizer -*test.test_sqlite3.test_userfunctions.AuthorizerLargeIntegerTests.test_column_access -*test.test_sqlite3.test_userfunctions.AuthorizerLargeIntegerTests.test_table_access -*test.test_sqlite3.test_userfunctions.AuthorizerRaiseExceptionTests.test_clear_authorizer -*test.test_sqlite3.test_userfunctions.AuthorizerRaiseExceptionTests.test_column_access -*test.test_sqlite3.test_userfunctions.AuthorizerRaiseExceptionTests.test_table_access -*test.test_sqlite3.test_userfunctions.AuthorizerTests.test_clear_authorizer -*test.test_sqlite3.test_userfunctions.AuthorizerTests.test_column_access -*test.test_sqlite3.test_userfunctions.AuthorizerTests.test_table_access -*test.test_sqlite3.test_userfunctions.FunctionTests.test_any_arguments -*test.test_sqlite3.test_userfunctions.FunctionTests.test_empty_blob -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_deterministic -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_deterministic_keyword_only -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_deterministic_not_supported -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_error_on_create -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_exception -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_memory_error -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_non_deterministic -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_overflow_error -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_params -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_ref_count -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_blob -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_float -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_illegal_value -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_int -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_long_long -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_nan -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_null -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_text -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_text_with_null_char -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_too_large_blob -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_too_large_int -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_too_large_text -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_unicode -*test.test_sqlite3.test_userfunctions.FunctionTests.test_func_too_many_args -*test.test_sqlite3.test_userfunctions.FunctionTests.test_function_destructor_via_gc -*test.test_sqlite3.test_userfunctions.FunctionTests.test_nan_float -*test.test_sqlite3.test_userfunctions.FunctionTests.test_non_contiguous_blob -*test.test_sqlite3.test_userfunctions.FunctionTests.test_param_surrogates -*test.test_sqlite3.test_userfunctions.FunctionTests.test_return_non_contiguous_blob -*test.test_sqlite3.test_userfunctions.FunctionTests.test_too_large_int -*test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_clear_function -*test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_error_on_create -*test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_error_value_return -*test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_exception_in_finalize -*test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_exception_in_method -*test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_missing_finalize -*test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_missing_method -*test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_redefine_function -*test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_sum_int +test.test_sqlite3.test_backup.BackupTests.test_bad_source_closed_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_bad_target @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_bad_target_closed_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_bad_target_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_bad_target_in_transaction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_bad_target_same_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_database_source_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_failing_progress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_keyword_only_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_modifying_progress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_non_callable_progress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_progress @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_progress_all_pages_at_once_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_progress_all_pages_at_once_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_32bit_rowid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_closed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_closed_db_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_context_manager_reraise_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_get_empty_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_get_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_get_item_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_get_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_get_slice_negative_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_get_slice_with_skip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_is_a_blob @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_mapping_invalid_index_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_open_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_read_advance_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_read_at_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_read_error_row_changed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_read_oversized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_seek_and_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_seek_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_sequence_not_supported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_empty_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_item_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_item_negative_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_item_with_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_slice_buffer_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_slice_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_slice_with_skip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_write_advance_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_write_at_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_write_error_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_write_error_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_write_error_row_changed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_con_commit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_con_cursor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_con_rollback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_create_aggregate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_create_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_cur_execute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_set_authorizer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_set_progress_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedCurTests.test_closed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_commit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_commit_after_no_changes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_bad_limit_category @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_bad_reinit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_init_bad_isolation_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_init_good_isolation_levels @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_limits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_reinit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_cursor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_drop_unused_refs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_failed_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_in_transaction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_in_transaction_ro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_interrupt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_interrupt_on_closed_db @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_rollback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_rollback_after_no_changes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_use_after_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConstructorTests.test_binary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConstructorTests.test_date @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConstructorTests.test_date_from_ticks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConstructorTests.test_time @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConstructorTests.test_time_from_ticks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConstructorTests.test_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ConstructorTests.test_timestamp_from_ticks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_array_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_column_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_cursor_connection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_cursor_wrong_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_arg_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_arg_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_arg_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_arg_string_with_zero_byte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_dict_mapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_dict_mapping_mapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_dict_mapping_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_dict_mapping_too_little_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_dict_mapping_unnamed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_illegal_sql @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_many_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_many_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_many_not_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_many_select @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_many_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_many_wrong_sql_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_multiple_statements @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_non_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_param_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_param_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_param_sequence_bad_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_too_many_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_with_appended_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_wrong_no_of_args1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_wrong_no_of_args2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_wrong_no_of_args3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_wrong_sql_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_fetch_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_fetchall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_fetchmany @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_fetchmany_kw_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_fetchone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_fetchone_no_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_last_row_id_insert_o_r @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_last_row_id_on_ignore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_last_row_id_on_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_rowcount_execute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_rowcount_executemany @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_rowcount_prefixed_with_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_rowcount_select @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_rowcount_update_returning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_rowcount_vaccuum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_same_query_in_multiple_cursors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_setinputsizes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_setoutputsize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_setoutputsize_no_column @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_total_changes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_wrong_cursor_callable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_connection_execute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_connection_executemany @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_connection_executescript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_cursor_executescript_as_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_cursor_executescript_too_large_script @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_cursor_executescript_tx_control @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_cursor_executescript_with_null_characters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_cursor_executescript_with_surrogates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_script_error_normal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_script_string_sql @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_script_syntax_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_api_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_complete_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_data_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_database_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_disallow_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_error_code_on_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_extended_error_code_on_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_integrity_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_interface_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_internal_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_module_constants @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_not_supported_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_operational_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_param_style @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_programming_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_shared_cache_deprecated @ linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_thread_safety @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.MultiprocessTests.test_ctx_mgr_rollback_if_commit_failed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.OpenTests.test_database_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.OpenTests.test_factory_database_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.OpenTests.test_open_undecodable_uri @ linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.OpenTests.test_open_unquoted_uri @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.OpenTests.test_open_uri @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.OpenTests.test_open_uri_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.OpenTests.test_open_with_path_like_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.OpenTests.test_open_with_undecodable_path @ linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_abort_raises_with_explicit_transactions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_abort_raises_without_transactions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_ignore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_rollback_with_explicit_transaction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_rollback_without_transaction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ThreadTests.test_check_connection_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ThreadTests.test_check_cursor_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.ThreadTests.test_dont_check_same_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dbapi.UninitialisedConnectionTests.test_uninit_operations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dump.DumpTests.test_dump_autoincrement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dump.DumpTests.test_dump_autoincrement_create_new_db @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dump.DumpTests.test_table_dump @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_dump.DumpTests.test_unorderable_row @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.ConnectionFactoryTests.test_connection_factories @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.ConnectionFactoryTests.test_connection_factory_as_positional_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.ConnectionFactoryTests.test_connection_factory_relayed_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.CursorFactoryTests.test_invalid_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.CursorFactoryTests.test_is_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_custom_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_fake_cursor_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_as_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_as_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_as_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_hash_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_index_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTestsBackwardsCompat.test_is_produced_by_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.TextFactoryTests.test_custom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.TextFactoryTests.test_optimized_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.TextFactoryTests.test_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.TextFactoryTests.test_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.TextFactoryTestsWithEmbeddedZeroBytes.test_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.TextFactoryTestsWithEmbeddedZeroBytes.test_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.TextFactoryTestsWithEmbeddedZeroBytes.test_custom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_factory.TextFactoryTestsWithEmbeddedZeroBytes.test_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.CollationTests.test_collation_is_used @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.CollationTests.test_collation_register_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.CollationTests.test_collation_returns_large_integer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.CollationTests.test_create_collation_bad_upper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.CollationTests.test_create_collation_not_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.CollationTests.test_create_collation_not_callable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.CollationTests.test_create_collation_not_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.CollationTests.test_deregister_collation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.ProgressTests.test_cancel_operation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.ProgressTests.test_clear_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.ProgressTests.test_error_in_progress_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.ProgressTests.test_error_in_progress_handler_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.ProgressTests.test_opcode_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.ProgressTests.test_progress_handler_used @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.TraceCallbackTests.test_clear_trace_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.TraceCallbackTests.test_trace_bad_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.TraceCallbackTests.test_trace_callback_content @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.TraceCallbackTests.test_trace_callback_used @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.TraceCallbackTests.test_trace_expanded_sql @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.TraceCallbackTests.test_trace_too_much_expanded_sql @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_hooks.TraceCallbackTests.test_unicode_content @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RecursiveUseOfCursors.test_recursive_cursor_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RecursiveUseOfCursors.test_recursive_cursor_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RecursiveUseOfCursors.test_recursive_cursor_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_auto_commit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_bind_mutating_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_bpo31770 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_bpo37347 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_collation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_column_name_with_spaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_commit_cursor_reset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_connection_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_connection_constructor_call_check @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_convert_timestamp_microsecond_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_cursor_constructor_call_check @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_custom_cursor_object_crash_gh_99886 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_del_isolation_level_segfault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_empty_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_executescript_step_through_select @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_invalid_isolation_level_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_large_sql @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_null_character @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_on_conflict_rollback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_pragma_autocommit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_pragma_schema_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_pragma_user_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_recursive_cursor_use @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_register_adapter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_return_empty_bytestring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_set_isolation_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_statement_finalization_on_close_db @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_statement_reset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_str_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_surrogates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_table_lock_cursor_replace_stmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_type_map_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_workaround_for_buggy_sqlite_transfer_bindings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelFromInit.test_isolation_level_begin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelFromInit.test_isolation_level_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelFromInit.test_isolation_level_deferred @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelFromInit.test_isolation_level_exclusive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelFromInit.test_isolation_level_immediate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelFromInit.test_isolation_level_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelPostInit.test_isolation_level_begin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelPostInit.test_isolation_level_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelPostInit.test_isolation_level_deferrred @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelPostInit.test_isolation_level_exclusive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelPostInit.test_isolation_level_immediate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelPostInit.test_isolation_level_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.RollbackTests.test_no_duplicate_rows_after_rollback_close_cursor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.RollbackTests.test_no_duplicate_rows_after_rollback_del_cursor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.RollbackTests.test_no_duplicate_rows_after_rollback_new_query @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.SpecialCommandTests.test_drop_table @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.SpecialCommandTests.test_pragma @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_delete_starts_transaction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_dml_does_not_auto_commit_before @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_insert_starts_transaction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_locking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_multiple_cursors_and_iternext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_raise_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_replace_starts_transaction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_rollback_cursor_consistency @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_toggle_auto_commit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_update_starts_transaction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.TransactionalDDL.test_ddl_does_not_autostart_transaction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.TransactionalDDL.test_immediate_transactional_ddl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_transactions.TransactionalDDL.test_transactional_ddl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.BinaryConverterTests.test_binary_input_for_converter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.ColNamesTests.test_case_in_converter_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.ColNamesTests.test_col_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.ColNamesTests.test_cursor_description_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.ColNamesTests.test_cursor_description_no_row @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.ColNamesTests.test_decl_type_not_used @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.ColNamesTests.test_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.CommonTableExpressionTests.test_cursor_description_cte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.CommonTableExpressionTests.test_cursor_description_cte_multiple_columns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.CommonTableExpressionTests.test_cursor_description_cte_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DateTimeTests.test_date_time_sub_seconds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DateTimeTests.test_date_time_sub_seconds_floating_point @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DateTimeTests.test_sql_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DateTimeTests.test_sqlite_date @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DateTimeTests.test_sqlite_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_blob @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_convert_zero_sized_blob @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_error_in_conform @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_foo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_large_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_number1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_number2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_small_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_unsupported_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_unsupported_seq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.ObjectAdaptationTests.test_adapt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.ObjectAdaptationTests.test_adapt_alt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.ObjectAdaptationTests.test_caster_is_used @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.ObjectAdaptationTests.test_custom_proto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.ObjectAdaptationTests.test_defect_proto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.ObjectAdaptationTests.test_defect_self_adapt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.ObjectAdaptationTests.test_missing_adapter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.ObjectAdaptationTests.test_missing_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.SqliteTypeTests.test_blob @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.SqliteTypeTests.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.SqliteTypeTests.test_large_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.SqliteTypeTests.test_small_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.SqliteTypeTests.test_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.SqliteTypeTests.test_string_with_null_character @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.SqliteTypeTests.test_string_with_surrogates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.SqliteTypeTests.test_too_large_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_types.SqliteTypeTests.test_unicode_execute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_aggr_sum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_param_blob @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_param_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_param_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_param_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_param_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_params_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_error_on_create @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_exception_in_finalize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_exception_in_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_exception_in_step @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_no_finalize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_no_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_no_step @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerIllegalTypeTests.test_clear_authorizer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerIllegalTypeTests.test_column_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerIllegalTypeTests.test_table_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerLargeIntegerTests.test_clear_authorizer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerLargeIntegerTests.test_column_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerLargeIntegerTests.test_table_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerRaiseExceptionTests.test_clear_authorizer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerRaiseExceptionTests.test_column_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerRaiseExceptionTests.test_table_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerTests.test_clear_authorizer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerTests.test_column_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerTests.test_table_access @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_any_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_empty_blob @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_deterministic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_deterministic_keyword_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_error_on_create @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_memory_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_non_deterministic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_overflow_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_ref_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_blob @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_illegal_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_long_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_null @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_text_with_null_char @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_too_large_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_too_many_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_function_destructor_via_gc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_nan_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_non_contiguous_blob @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_return_non_contiguous_blob @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_too_large_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_clear_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_error_on_create @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_error_value_return @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_exception_in_finalize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_exception_in_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_missing_finalize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_missing_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_redefine_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_sum_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ssl.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ssl.txt index 1fec2f1ccf..349786aa27 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ssl.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ssl.txt @@ -1,159 +1,113 @@ -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_DER_to_PEM -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_cert_time_to_seconds -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_cert_time_to_seconds_locale -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_cert_time_to_seconds_timezone -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_connect_ex_error -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_empty_cert -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_enum_certificates -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_enum_crls -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_errors_sslwrap -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_get_default_verify_paths -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_malformed_cert -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_malformed_key -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_openssl_version -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_parse_cert -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_parse_cert_CVE_2019_5010 -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_private_init -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_purpose_enum -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_read_write_zero -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_refcycle -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_server_side -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_str_for_enums -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_timeout -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_tls_unique_channel_binding -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_unknown_channel_binding -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_unsupported_dtls -*graalpython.lib-python.3.test.test_ssl.BasicSocketTests.test_wrapped_unconnected -*graalpython.lib-python.3.test.test_ssl.ContextTests.test__create_stdlib_context -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_cert_store_stats -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_check_hostname -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_ciphers -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_constructor -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_context_client_server -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_context_custom_class -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_create_default_context -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_get_ca_certs -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_get_ciphers -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_hostname_checks_common_name -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_load_cert_chain -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_load_default_certs -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_load_default_certs_env -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_load_default_certs_env_windows -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_load_verify_cadata -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_load_verify_locations -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_min_max_version -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_num_tickest -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_options -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_protocol -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_python_ciphers -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_security_level -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_set_default_verify_paths -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_set_ecdh_curve -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_sni_callback -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_sni_callback_refcycle -*graalpython.lib-python.3.test.test_ssl.ContextTests.test_verify_mode_protocol -*graalpython.lib-python.3.test.test_ssl.MemoryBIOTests.test_buffer_types -*graalpython.lib-python.3.test.test_ssl.MemoryBIOTests.test_eof -*graalpython.lib-python.3.test.test_ssl.MemoryBIOTests.test_error_types -*graalpython.lib-python.3.test.test_ssl.MemoryBIOTests.test_pending -*graalpython.lib-python.3.test.test_ssl.MemoryBIOTests.test_read_write -*graalpython.lib-python.3.test.test_ssl.NetworkedTests.test_get_server_certificate_ipv6 -*graalpython.lib-python.3.test.test_ssl.SSLErrorTests.test_bad_server_hostname -*graalpython.lib-python.3.test.test_ssl.SSLErrorTests.test_str -*graalpython.lib-python.3.test.test_ssl.SSLErrorTests.test_subclass -*graalpython.lib-python.3.test.test_ssl.SSLObjectTests.test_private_init -*graalpython.lib-python.3.test.test_ssl.SSLObjectTests.test_unwrap -*graalpython.lib-python.3.test.test_ssl.SimpleBackgroundTests.test_bio_handshake -*graalpython.lib-python.3.test.test_ssl.SimpleBackgroundTests.test_bio_read_write_data -*graalpython.lib-python.3.test.test_ssl.SimpleBackgroundTests.test_ciphers -*graalpython.lib-python.3.test.test_ssl.SimpleBackgroundTests.test_connect_cadata -*graalpython.lib-python.3.test.test_ssl.SimpleBackgroundTests.test_connect_capath -*graalpython.lib-python.3.test.test_ssl.SimpleBackgroundTests.test_connect_ex -*graalpython.lib-python.3.test.test_ssl.SimpleBackgroundTests.test_connect_fail -*graalpython.lib-python.3.test.test_ssl.SimpleBackgroundTests.test_connect_with_context_fail -*graalpython.lib-python.3.test.test_ssl.SimpleBackgroundTests.test_get_ca_certs_capath -*graalpython.lib-python.3.test.test_ssl.SimpleBackgroundTests.test_get_server_certificate -*graalpython.lib-python.3.test.test_ssl.SimpleBackgroundTests.test_get_server_certificate_fail -*graalpython.lib-python.3.test.test_ssl.SimpleBackgroundTests.test_makefile_close -*graalpython.lib-python.3.test.test_ssl.SimpleBackgroundTests.test_non_blocking_connect_ex -*graalpython.lib-python.3.test.test_ssl.SimpleBackgroundTests.test_non_blocking_handshake -*graalpython.lib-python.3.test.test_ssl.SimpleBackgroundTests.test_transport_eof -*graalpython.lib-python.3.test.test_ssl.TestEnumerations.test_alertdescription -*graalpython.lib-python.3.test.test_ssl.TestEnumerations.test_options -*graalpython.lib-python.3.test.test_ssl.TestEnumerations.test_sslerrornumber -*graalpython.lib-python.3.test.test_ssl.TestEnumerations.test_sslmethod -*graalpython.lib-python.3.test.test_ssl.TestEnumerations.test_tlsalerttype -*graalpython.lib-python.3.test.test_ssl.TestEnumerations.test_tlscontenttype -*graalpython.lib-python.3.test.test_ssl.TestEnumerations.test_tlsmessagetype -*graalpython.lib-python.3.test.test_ssl.TestEnumerations.test_tlsversion -*graalpython.lib-python.3.test.test_ssl.TestEnumerations.test_verifyflags -*graalpython.lib-python.3.test.test_ssl.TestEnumerations.test_verifymode -*graalpython.lib-python.3.test.test_ssl.TestPostHandshakeAuth.test_bpo37428_pha_cert_none -*graalpython.lib-python.3.test.test_ssl.TestPostHandshakeAuth.test_internal_chain_client -*graalpython.lib-python.3.test.test_ssl.TestPostHandshakeAuth.test_internal_chain_server -*graalpython.lib-python.3.test.test_ssl.TestPostHandshakeAuth.test_pha_no_pha_client -*graalpython.lib-python.3.test.test_ssl.TestPostHandshakeAuth.test_pha_no_pha_server -*graalpython.lib-python.3.test.test_ssl.TestPostHandshakeAuth.test_pha_not_tls13 -*graalpython.lib-python.3.test.test_ssl.TestPostHandshakeAuth.test_pha_optional -*graalpython.lib-python.3.test.test_ssl.TestPostHandshakeAuth.test_pha_optional_nocert -*graalpython.lib-python.3.test.test_ssl.TestPostHandshakeAuth.test_pha_required -*graalpython.lib-python.3.test.test_ssl.TestPostHandshakeAuth.test_pha_required_nocert -*graalpython.lib-python.3.test.test_ssl.TestPostHandshakeAuth.test_pha_setter -*graalpython.lib-python.3.test.test_ssl.TestPreHandshakeClose.test_https_client_non_tls_response_ignored -*graalpython.lib-python.3.test.test_ssl.TestPreHandshakeClose.test_preauth_data_to_tls_client -*graalpython.lib-python.3.test.test_ssl.TestPreHandshakeClose.test_preauth_data_to_tls_server -*graalpython.lib-python.3.test.test_ssl.TestSSLDebug.test_keylog_defaults -*graalpython.lib-python.3.test.test_ssl.TestSSLDebug.test_keylog_env -*graalpython.lib-python.3.test.test_ssl.TestSSLDebug.test_keylog_filename -*graalpython.lib-python.3.test.test_ssl.TestSSLDebug.test_msg_callback -*graalpython.lib-python.3.test.test_ssl.TestSSLDebug.test_msg_callback_tls12 -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_PROTOCOL_TLS -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_asyncore_server -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_check_hostname -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_check_hostname_idn -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_compression -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_compression_disabled -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_crl_check -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_default_ecdh_curve -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_dh_params -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_do_handshake_enotconn -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_dual_rsa_ecc -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_ecc_cert -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_getpeercert -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_getpeercert_enotconn -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_handshake_timeout -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_hostname_checks_common_name -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_min_max_version_mismatch -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_min_max_version_sslv3 -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_min_max_version_tlsv1_1 -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_min_max_version_tlsv1_2 -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_nonblocking_send -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_npn_protocols -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_protocol_sslv2 -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_protocol_sslv3 -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_protocol_tlsv1 -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_protocol_tlsv1_1 -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_protocol_tlsv1_2 -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_read_write_after_close_raises_valuerror -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_recv_into_buffer_protocol_len -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_recv_send -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_recv_zero -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_rude_shutdown -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_selected_alpn_protocol -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_selected_alpn_protocol_if_server_uses_alpn -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_selected_npn_protocol -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_sendfile -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_server_accept -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_shared_ciphers -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_sni_callback -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_sni_callback_alert -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_sni_callback_raising -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_sni_callback_wrong_return_type -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_socketserver -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_ssl_cert_verify_error -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_starttls -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_tls1_3 -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_tls_unique_channel_binding -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_version_basic -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_wrong_cert_tls12 -*graalpython.lib-python.3.test.test_ssl.ThreadedTests.test_wrong_cert_tls13 +test.test_ssl.BasicSocketTests.test_DER_to_PEM @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.BasicSocketTests.test_cert_time_to_seconds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.BasicSocketTests.test_cert_time_to_seconds_timezone @ darwin-arm64,darwin-x86_64,win32-AMD64 +test.test_ssl.BasicSocketTests.test_connect_ex_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.BasicSocketTests.test_empty_cert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.BasicSocketTests.test_errors_sslwrap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.BasicSocketTests.test_get_default_verify_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.BasicSocketTests.test_malformed_cert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.BasicSocketTests.test_malformed_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.BasicSocketTests.test_parse_cert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.BasicSocketTests.test_parse_cert_CVE_2019_5010 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.BasicSocketTests.test_private_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.BasicSocketTests.test_purpose_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.BasicSocketTests.test_read_write_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.BasicSocketTests.test_server_side @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.BasicSocketTests.test_str_for_enums @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.BasicSocketTests.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.BasicSocketTests.test_unknown_channel_binding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.BasicSocketTests.test_unsupported_dtls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.BasicSocketTests.test_wrapped_unconnected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test__create_stdlib_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test_cert_store_stats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test_check_hostname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test_ciphers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test_context_client_server @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test_context_custom_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test_create_default_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test_get_ca_certs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test_get_ciphers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test_hostname_checks_common_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test_load_cert_chain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test_load_default_certs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test_load_default_certs_env @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ContextTests.test_load_verify_cadata @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test_load_verify_locations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test_min_max_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test_set_default_verify_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ContextTests.test_verify_mode_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.MemoryBIOTests.test_buffer_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.MemoryBIOTests.test_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.MemoryBIOTests.test_error_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.MemoryBIOTests.test_pending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.MemoryBIOTests.test_read_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Connects to internet, sometimes can't reach +!test.test_ssl.NetworkedTests.test_timeout_connect_ex +test.test_ssl.SSLErrorTests.test_bad_server_hostname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.SSLErrorTests.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.SSLErrorTests.test_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.SSLObjectTests.test_private_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.SSLObjectTests.test_unwrap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.SimpleBackgroundTests.test_bio_handshake @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_bio_read_write_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_ciphers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_connect_cadata @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_connect_capath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_connect_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_connect_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_connect_with_context_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_get_server_certificate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_get_server_certificate_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_makefile_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_non_blocking_connect_ex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_non_blocking_handshake @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_transport_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.TestEnumerations.test_alertdescription @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.TestEnumerations.test_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.TestEnumerations.test_sslerrornumber @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.TestEnumerations.test_sslmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.TestEnumerations.test_tlsalerttype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.TestEnumerations.test_tlscontenttype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.TestEnumerations.test_tlsmessagetype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.TestEnumerations.test_tlsversion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.TestEnumerations.test_verifyflags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.TestEnumerations.test_verifymode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.TestPreHandshakeClose.test_https_client_non_tls_response_ignored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.TestPreHandshakeClose.test_preauth_data_to_tls_client @ linux-aarch64,linux-x86_64 +test.test_ssl.TestPreHandshakeClose.test_preauth_data_to_tls_server @ linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_PROTOCOL_TLS @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_asyncore_server @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_check_hostname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_check_hostname_idn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_compression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_compression_disabled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_crl_check @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_default_ecdh_curve @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_do_handshake_enotconn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ThreadedTests.test_dual_rsa_ecc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_ecc_cert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_getpeercert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_getpeercert_enotconn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ThreadedTests.test_handshake_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_nonblocking_send @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_npn_protocols @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ssl.ThreadedTests.test_protocol_tlsv1_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_read_write_after_close_raises_valuerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_recv_into_buffer_protocol_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_recv_send @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_recv_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_rude_shutdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_selected_alpn_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_selected_alpn_protocol_if_server_uses_alpn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_sendfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_server_accept @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_shared_ciphers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_socketserver @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_ssl_cert_verify_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_starttls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_tls1_3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_version_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_wrong_cert_tls12 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_ssl.ThreadedTests.test_wrong_cert_tls13 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_stat.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_stat.txt index cdb02c6640..094bb9fe03 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_stat.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_stat.txt @@ -1,11 +1,6 @@ -*graalpython.lib-python.3.test.test_stat.TestFilemodeCStat.test_fifo -*graalpython.lib-python.3.test.test_stat.TestFilemodeCStat.test_file_attribute_constants -*graalpython.lib-python.3.test.test_stat.TestFilemodeCStat.test_socket -*graalpython.lib-python.3.test.test_stat.TestFilemodePyStat.test_devices -*graalpython.lib-python.3.test.test_stat.TestFilemodePyStat.test_directory -*graalpython.lib-python.3.test.test_stat.TestFilemodePyStat.test_fifo -*graalpython.lib-python.3.test.test_stat.TestFilemodePyStat.test_file_attribute_constants -*graalpython.lib-python.3.test.test_stat.TestFilemodePyStat.test_link -*graalpython.lib-python.3.test.test_stat.TestFilemodePyStat.test_mode -*graalpython.lib-python.3.test.test_stat.TestFilemodePyStat.test_module_attributes -*graalpython.lib-python.3.test.test_stat.TestFilemodePyStat.test_socket +test.test_stat.TestFilemodePyStat.test_devices @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_stat.TestFilemodePyStat.test_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_stat.TestFilemodePyStat.test_file_attribute_constants @ win32-AMD64 +test.test_stat.TestFilemodePyStat.test_link @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_stat.TestFilemodePyStat.test_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_stat.TestFilemodePyStat.test_module_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_statistics.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_statistics.txt index 28c3c3ee4e..fcff1d99fa 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_statistics.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_statistics.txt @@ -1,370 +1,349 @@ -*graalpython.lib-python.3.test.test_statistics.ApproxEqualExactTest.test_exactly_equal_absolute -*graalpython.lib-python.3.test.test_statistics.ApproxEqualExactTest.test_exactly_equal_absolute_decimals -*graalpython.lib-python.3.test.test_statistics.ApproxEqualExactTest.test_exactly_equal_both -*graalpython.lib-python.3.test.test_statistics.ApproxEqualExactTest.test_exactly_equal_decimals -*graalpython.lib-python.3.test.test_statistics.ApproxEqualExactTest.test_exactly_equal_floats -*graalpython.lib-python.3.test.test_statistics.ApproxEqualExactTest.test_exactly_equal_fractions -*graalpython.lib-python.3.test.test_statistics.ApproxEqualExactTest.test_exactly_equal_ints -*graalpython.lib-python.3.test.test_statistics.ApproxEqualExactTest.test_exactly_equal_relative -*graalpython.lib-python.3.test.test_statistics.ApproxEqualInexactTest.test_approx_equal_absolute_decimals -*graalpython.lib-python.3.test.test_statistics.ApproxEqualInexactTest.test_approx_equal_absolute_floats -*graalpython.lib-python.3.test.test_statistics.ApproxEqualInexactTest.test_approx_equal_absolute_fractions -*graalpython.lib-python.3.test.test_statistics.ApproxEqualInexactTest.test_approx_equal_absolute_ints -*graalpython.lib-python.3.test.test_statistics.ApproxEqualInexactTest.test_approx_equal_both1 -*graalpython.lib-python.3.test.test_statistics.ApproxEqualInexactTest.test_approx_equal_both2 -*graalpython.lib-python.3.test.test_statistics.ApproxEqualInexactTest.test_approx_equal_both3 -*graalpython.lib-python.3.test.test_statistics.ApproxEqualInexactTest.test_approx_equal_both4 -*graalpython.lib-python.3.test.test_statistics.ApproxEqualInexactTest.test_approx_equal_relative_decimals -*graalpython.lib-python.3.test.test_statistics.ApproxEqualInexactTest.test_approx_equal_relative_floats -*graalpython.lib-python.3.test.test_statistics.ApproxEqualInexactTest.test_approx_equal_relative_fractions -*graalpython.lib-python.3.test.test_statistics.ApproxEqualInexactTest.test_approx_equal_relative_ints -*graalpython.lib-python.3.test.test_statistics.ApproxEqualInexactTest.test_cross_zero -*graalpython.lib-python.3.test.test_statistics.ApproxEqualSpecialsTest.test_decimal_zeroes -*graalpython.lib-python.3.test.test_statistics.ApproxEqualSpecialsTest.test_float_zeroes -*graalpython.lib-python.3.test.test_statistics.ApproxEqualSpecialsTest.test_inf -*graalpython.lib-python.3.test.test_statistics.ApproxEqualSpecialsTest.test_nan -*graalpython.lib-python.3.test.test_statistics.ApproxEqualSymmetryTest.test_relative_symmetry -*graalpython.lib-python.3.test.test_statistics.ApproxEqualSymmetryTest.test_symmetry -*graalpython.lib-python.3.test.test_statistics.ApproxEqualUnequalTest.test_exactly_unequal_decimals -*graalpython.lib-python.3.test.test_statistics.ApproxEqualUnequalTest.test_exactly_unequal_floats -*graalpython.lib-python.3.test.test_statistics.ApproxEqualUnequalTest.test_exactly_unequal_fractions -*graalpython.lib-python.3.test.test_statistics.ApproxEqualUnequalTest.test_exactly_unequal_ints -*graalpython.lib-python.3.test.test_statistics.CoerceTest.test_bool -*graalpython.lib-python.3.test.test_statistics.CoerceTest.test_decimal -*graalpython.lib-python.3.test.test_statistics.CoerceTest.test_float -*graalpython.lib-python.3.test.test_statistics.CoerceTest.test_fraction -*graalpython.lib-python.3.test.test_statistics.CoerceTest.test_incompatible_types -*graalpython.lib-python.3.test.test_statistics.CoerceTest.test_int -*graalpython.lib-python.3.test.test_statistics.CoerceTest.test_non_numeric_types -*graalpython.lib-python.3.test.test_statistics.ConvertTest.test_decimal -*graalpython.lib-python.3.test.test_statistics.ConvertTest.test_float -*graalpython.lib-python.3.test.test_statistics.ConvertTest.test_fraction -*graalpython.lib-python.3.test.test_statistics.ConvertTest.test_inf -*graalpython.lib-python.3.test.test_statistics.ConvertTest.test_int -*graalpython.lib-python.3.test.test_statistics.ConvertTest.test_invalid_input_type -*graalpython.lib-python.3.test.test_statistics.ConvertTest.test_nan -*graalpython.lib-python.3.test.test_statistics.DecimalToRatioTest.test_infinity -*graalpython.lib-python.3.test.test_statistics.DecimalToRatioTest.test_nan -*graalpython.lib-python.3.test.test_statistics.DecimalToRatioTest.test_negative_exponent -*graalpython.lib-python.3.test.test_statistics.DecimalToRatioTest.test_positive_exponent -*graalpython.lib-python.3.test.test_statistics.DecimalToRatioTest.test_regression_20536 -*graalpython.lib-python.3.test.test_statistics.DecimalToRatioTest.test_sign -*graalpython.lib-python.3.test.test_statistics.DocTests.test_doc_tests -*graalpython.lib-python.3.test.test_statistics.ExactRatioTest.test_decimal -*graalpython.lib-python.3.test.test_statistics.ExactRatioTest.test_decimal_nan -*graalpython.lib-python.3.test.test_statistics.ExactRatioTest.test_float -*graalpython.lib-python.3.test.test_statistics.ExactRatioTest.test_float_nan -*graalpython.lib-python.3.test.test_statistics.ExactRatioTest.test_fraction -*graalpython.lib-python.3.test.test_statistics.ExactRatioTest.test_inf -*graalpython.lib-python.3.test.test_statistics.ExactRatioTest.test_int -*graalpython.lib-python.3.test.test_statistics.FailNegTest.test_error_msg -*graalpython.lib-python.3.test.test_statistics.FailNegTest.test_negatives_raise -*graalpython.lib-python.3.test.test_statistics.FailNegTest.test_pass_through -*graalpython.lib-python.3.test.test_statistics.FindLteqTest.test_invalid_input_values -*graalpython.lib-python.3.test.test_statistics.FindLteqTest.test_locate_successfully -*graalpython.lib-python.3.test.test_statistics.FindRteqTest.test_invalid_input_values -*graalpython.lib-python.3.test.test_statistics.FindRteqTest.test_locate_successfully -*graalpython.lib-python.3.test.test_statistics.GlobalsTest.test_check_all -*graalpython.lib-python.3.test.test_statistics.GlobalsTest.test_meta -*graalpython.lib-python.3.test.test_statistics.IsFiniteTest.test_finite -*graalpython.lib-python.3.test.test_statistics.IsFiniteTest.test_infinity -*graalpython.lib-python.3.test.test_statistics.IsFiniteTest.test_nan -*graalpython.lib-python.3.test.test_statistics.StatisticsErrorTest.test_has_exception -*graalpython.lib-python.3.test.test_statistics.SumSpecialValues.test_decimal_basiccontext_mismatched_infs_to_nan -*graalpython.lib-python.3.test.test_statistics.SumSpecialValues.test_decimal_extendedcontext_mismatched_infs_to_nan -*graalpython.lib-python.3.test.test_statistics.SumSpecialValues.test_decimal_inf -*graalpython.lib-python.3.test.test_statistics.SumSpecialValues.test_decimal_snan_raises -*graalpython.lib-python.3.test.test_statistics.SumSpecialValues.test_float_inf -*graalpython.lib-python.3.test.test_statistics.SumSpecialValues.test_float_mismatched_infs -*graalpython.lib-python.3.test.test_statistics.SumSpecialValues.test_nan -*graalpython.lib-python.3.test.test_statistics.SumTortureTest.test_torture -*graalpython.lib-python.3.test.test_statistics.TestApproxEqualErrors.test_bad_rel -*graalpython.lib-python.3.test.test_statistics.TestApproxEqualErrors.test_bad_tol -*graalpython.lib-python.3.test.test_statistics.TestBivariateStatistics.test_small_sample_error -*graalpython.lib-python.3.test.test_statistics.TestBivariateStatistics.test_unequal_size_error -*graalpython.lib-python.3.test.test_statistics.TestCorrelationAndCovariance.test_different_scales -*graalpython.lib-python.3.test.test_statistics.TestCorrelationAndCovariance.test_results -*graalpython.lib-python.3.test.test_statistics.TestFMean.test_basics -*graalpython.lib-python.3.test.test_statistics.TestFMean.test_error_cases -*graalpython.lib-python.3.test.test_statistics.TestFMean.test_special_values -*graalpython.lib-python.3.test.test_statistics.TestFMean.test_weights -*graalpython.lib-python.3.test.test_statistics.TestGeometricMean.test_basics -*graalpython.lib-python.3.test.test_statistics.TestGeometricMean.test_big_and_small -*graalpython.lib-python.3.test.test_statistics.TestGeometricMean.test_error_cases -*graalpython.lib-python.3.test.test_statistics.TestGeometricMean.test_mixed_int_and_float -*graalpython.lib-python.3.test.test_statistics.TestGeometricMean.test_special_values -*graalpython.lib-python.3.test.test_statistics.TestGeometricMean.test_various_input_types -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_bad_arg_types -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_decimals_exact -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_doubled_data -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_empty_data -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_floats_exact -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_fractions -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_inf -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_ints -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_invalid_type_error -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_multiply_data_points -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_nan -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_negative_error -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_no_args -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_no_inplace_modifications -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_order_doesnt_matter -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_range_data -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_repeated_single_value -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_single_value -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_singleton_lists -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_type_of_data_collection -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_type_of_data_element -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_types_conserved -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_with_weights -*graalpython.lib-python.3.test.test_statistics.TestHarmonicMean.test_zero -*graalpython.lib-python.3.test.test_statistics.TestLinearRegression.test_constant_input_error -*graalpython.lib-python.3.test.test_statistics.TestLinearRegression.test_proportional -*graalpython.lib-python.3.test.test_statistics.TestLinearRegression.test_results -*graalpython.lib-python.3.test.test_statistics.TestMean.test_bad_arg_types -*graalpython.lib-python.3.test.test_statistics.TestMean.test_big_data -*graalpython.lib-python.3.test.test_statistics.TestMean.test_decimals -*graalpython.lib-python.3.test.test_statistics.TestMean.test_doubled_data -*graalpython.lib-python.3.test.test_statistics.TestMean.test_empty_data -*graalpython.lib-python.3.test.test_statistics.TestMean.test_floats -*graalpython.lib-python.3.test.test_statistics.TestMean.test_fractions -*graalpython.lib-python.3.test.test_statistics.TestMean.test_inf -*graalpython.lib-python.3.test.test_statistics.TestMean.test_ints -*graalpython.lib-python.3.test.test_statistics.TestMean.test_mismatched_infs -*graalpython.lib-python.3.test.test_statistics.TestMean.test_nan -*graalpython.lib-python.3.test.test_statistics.TestMean.test_no_args -*graalpython.lib-python.3.test.test_statistics.TestMean.test_no_inplace_modifications -*graalpython.lib-python.3.test.test_statistics.TestMean.test_order_doesnt_matter -*graalpython.lib-python.3.test.test_statistics.TestMean.test_range_data -*graalpython.lib-python.3.test.test_statistics.TestMean.test_regression_20561 -*graalpython.lib-python.3.test.test_statistics.TestMean.test_regression_25177 -*graalpython.lib-python.3.test.test_statistics.TestMean.test_repeated_single_value -*graalpython.lib-python.3.test.test_statistics.TestMean.test_single_value -*graalpython.lib-python.3.test.test_statistics.TestMean.test_torture_pep -*graalpython.lib-python.3.test.test_statistics.TestMean.test_type_of_data_collection -*graalpython.lib-python.3.test.test_statistics.TestMean.test_type_of_data_element -*graalpython.lib-python.3.test.test_statistics.TestMean.test_types_conserved -*graalpython.lib-python.3.test.test_statistics.TestMedian.test_bad_arg_types -*graalpython.lib-python.3.test.test_statistics.TestMedian.test_empty_data -*graalpython.lib-python.3.test.test_statistics.TestMedian.test_even_decimals -*graalpython.lib-python.3.test.test_statistics.TestMedian.test_even_fractions -*graalpython.lib-python.3.test.test_statistics.TestMedian.test_even_ints -*graalpython.lib-python.3.test.test_statistics.TestMedian.test_no_args -*graalpython.lib-python.3.test.test_statistics.TestMedian.test_no_inplace_modifications -*graalpython.lib-python.3.test.test_statistics.TestMedian.test_odd_decimals -*graalpython.lib-python.3.test.test_statistics.TestMedian.test_odd_fractions -*graalpython.lib-python.3.test.test_statistics.TestMedian.test_odd_ints -*graalpython.lib-python.3.test.test_statistics.TestMedian.test_order_doesnt_matter -*graalpython.lib-python.3.test.test_statistics.TestMedian.test_range_data -*graalpython.lib-python.3.test.test_statistics.TestMedian.test_repeated_single_value -*graalpython.lib-python.3.test.test_statistics.TestMedian.test_single_value -*graalpython.lib-python.3.test.test_statistics.TestMedian.test_type_of_data_collection -*graalpython.lib-python.3.test.test_statistics.TestMedian.test_type_of_data_element -*graalpython.lib-python.3.test.test_statistics.TestMedianDataType.test_types_conserved -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_bad_arg_types -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_data_type_error -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_empty_data -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_even_decimals -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_even_fractions -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_even_ints -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_even_number_repeated -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_interval -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_no_args -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_no_inplace_modifications -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_odd_decimals -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_odd_fractions -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_odd_ints -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_odd_number_repeated -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_order_doesnt_matter -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_range_data -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_repeated_single_value -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_single_value -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_type_of_data_collection -*graalpython.lib-python.3.test.test_statistics.TestMedianGrouped.test_type_of_data_element -*graalpython.lib-python.3.test.test_statistics.TestMedianHigh.test_bad_arg_types -*graalpython.lib-python.3.test.test_statistics.TestMedianHigh.test_empty_data -*graalpython.lib-python.3.test.test_statistics.TestMedianHigh.test_even_decimals -*graalpython.lib-python.3.test.test_statistics.TestMedianHigh.test_even_fractions -*graalpython.lib-python.3.test.test_statistics.TestMedianHigh.test_even_ints -*graalpython.lib-python.3.test.test_statistics.TestMedianHigh.test_no_args -*graalpython.lib-python.3.test.test_statistics.TestMedianHigh.test_no_inplace_modifications -*graalpython.lib-python.3.test.test_statistics.TestMedianHigh.test_odd_decimals -*graalpython.lib-python.3.test.test_statistics.TestMedianHigh.test_odd_fractions -*graalpython.lib-python.3.test.test_statistics.TestMedianHigh.test_odd_ints -*graalpython.lib-python.3.test.test_statistics.TestMedianHigh.test_order_doesnt_matter -*graalpython.lib-python.3.test.test_statistics.TestMedianHigh.test_range_data -*graalpython.lib-python.3.test.test_statistics.TestMedianHigh.test_repeated_single_value -*graalpython.lib-python.3.test.test_statistics.TestMedianHigh.test_single_value -*graalpython.lib-python.3.test.test_statistics.TestMedianHigh.test_type_of_data_collection -*graalpython.lib-python.3.test.test_statistics.TestMedianHigh.test_type_of_data_element -*graalpython.lib-python.3.test.test_statistics.TestMedianHigh.test_types_conserved -*graalpython.lib-python.3.test.test_statistics.TestMedianLow.test_bad_arg_types -*graalpython.lib-python.3.test.test_statistics.TestMedianLow.test_empty_data -*graalpython.lib-python.3.test.test_statistics.TestMedianLow.test_even_decimals -*graalpython.lib-python.3.test.test_statistics.TestMedianLow.test_even_fractions -*graalpython.lib-python.3.test.test_statistics.TestMedianLow.test_even_ints -*graalpython.lib-python.3.test.test_statistics.TestMedianLow.test_no_args -*graalpython.lib-python.3.test.test_statistics.TestMedianLow.test_no_inplace_modifications -*graalpython.lib-python.3.test.test_statistics.TestMedianLow.test_odd_decimals -*graalpython.lib-python.3.test.test_statistics.TestMedianLow.test_odd_fractions -*graalpython.lib-python.3.test.test_statistics.TestMedianLow.test_odd_ints -*graalpython.lib-python.3.test.test_statistics.TestMedianLow.test_order_doesnt_matter -*graalpython.lib-python.3.test.test_statistics.TestMedianLow.test_range_data -*graalpython.lib-python.3.test.test_statistics.TestMedianLow.test_repeated_single_value -*graalpython.lib-python.3.test.test_statistics.TestMedianLow.test_single_value -*graalpython.lib-python.3.test.test_statistics.TestMedianLow.test_type_of_data_collection -*graalpython.lib-python.3.test.test_statistics.TestMedianLow.test_type_of_data_element -*graalpython.lib-python.3.test.test_statistics.TestMedianLow.test_types_conserved -*graalpython.lib-python.3.test.test_statistics.TestMode.test_bad_arg_types -*graalpython.lib-python.3.test.test_statistics.TestMode.test_bimodal_data -*graalpython.lib-python.3.test.test_statistics.TestMode.test_counter_data -*graalpython.lib-python.3.test.test_statistics.TestMode.test_discrete_data -*graalpython.lib-python.3.test.test_statistics.TestMode.test_empty_data -*graalpython.lib-python.3.test.test_statistics.TestMode.test_no_args -*graalpython.lib-python.3.test.test_statistics.TestMode.test_no_inplace_modifications -*graalpython.lib-python.3.test.test_statistics.TestMode.test_nominal_data -*graalpython.lib-python.3.test.test_statistics.TestMode.test_none_data -*graalpython.lib-python.3.test.test_statistics.TestMode.test_order_doesnt_matter -*graalpython.lib-python.3.test.test_statistics.TestMode.test_range_data -*graalpython.lib-python.3.test.test_statistics.TestMode.test_repeated_single_value -*graalpython.lib-python.3.test.test_statistics.TestMode.test_single_value -*graalpython.lib-python.3.test.test_statistics.TestMode.test_type_of_data_collection -*graalpython.lib-python.3.test.test_statistics.TestMode.test_type_of_data_element -*graalpython.lib-python.3.test.test_statistics.TestMode.test_types_conserved -*graalpython.lib-python.3.test.test_statistics.TestMode.test_unique_data -*graalpython.lib-python.3.test.test_statistics.TestModules.test_c_functions -*graalpython.lib-python.3.test.test_statistics.TestModules.test_py_functions -*graalpython.lib-python.3.test.test_statistics.TestMultiMode.test_basics -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_alternative_constructor -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_cdf -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_copy -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_equality -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_hashability -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_instantiation_and_attributes -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_inv_cdf -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_overlap -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_pdf -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_pickle -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_pickle_and_copy -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_properties -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_quantiles -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_repr -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_same_type_addition_and_subtraction -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_sample_generation -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_slots -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_translation_and_scaling -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_unary_operations -*graalpython.lib-python.3.test.test_statistics.TestNormalDistC.test_zscore -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_alternative_constructor -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_cdf -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_copy -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_equality -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_hashability -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_instantiation_and_attributes -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_inv_cdf -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_pdf -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_pickle -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_pickle_and_copy -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_properties -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_quantiles -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_repr -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_same_type_addition_and_subtraction -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_sample_generation -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_slots -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_translation_and_scaling -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_unary_operations -*graalpython.lib-python.3.test.test_statistics.TestNormalDistPython.test_zscore -*graalpython.lib-python.3.test.test_statistics.TestNumericTestCase.test_error_msg_numeric -*graalpython.lib-python.3.test.test_statistics.TestNumericTestCase.test_error_msg_sequence -*graalpython.lib-python.3.test.test_statistics.TestNumericTestCase.test_numerictestcase_is_testcase -*graalpython.lib-python.3.test.test_statistics.TestPStdev.test_bad_arg_types -*graalpython.lib-python.3.test.test_statistics.TestPStdev.test_center_not_at_mean -*graalpython.lib-python.3.test.test_statistics.TestPStdev.test_compare_to_variance -*graalpython.lib-python.3.test.test_statistics.TestPStdev.test_domain_error_regression -*graalpython.lib-python.3.test.test_statistics.TestPStdev.test_empty_data -*graalpython.lib-python.3.test.test_statistics.TestPStdev.test_iter_list_same -*graalpython.lib-python.3.test.test_statistics.TestPStdev.test_no_args -*graalpython.lib-python.3.test.test_statistics.TestPStdev.test_no_inplace_modifications -*graalpython.lib-python.3.test.test_statistics.TestPStdev.test_order_doesnt_matter -*graalpython.lib-python.3.test.test_statistics.TestPStdev.test_range_data -*graalpython.lib-python.3.test.test_statistics.TestPStdev.test_repeated_single_value -*graalpython.lib-python.3.test.test_statistics.TestPStdev.test_shift_data -*graalpython.lib-python.3.test.test_statistics.TestPStdev.test_shift_data_exact -*graalpython.lib-python.3.test.test_statistics.TestPStdev.test_single_value -*graalpython.lib-python.3.test.test_statistics.TestPStdev.test_type_of_data_collection -*graalpython.lib-python.3.test.test_statistics.TestPStdev.test_type_of_data_element -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_accuracy_bug_20499 -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_bad_arg_types -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_decimals -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_domain_error_regression -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_empty_data -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_exact_uniform -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_fractions -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_ints -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_iter_list_same -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_no_args -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_no_inplace_modifications -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_order_doesnt_matter -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_range_data -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_repeated_single_value -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_shift_data -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_shift_data_exact -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_single_value -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_type_of_data_collection -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_type_of_data_element -*graalpython.lib-python.3.test.test_statistics.TestPVariance.test_types_conserved -*graalpython.lib-python.3.test.test_statistics.TestQuantiles.test_equal_inputs -*graalpython.lib-python.3.test.test_statistics.TestQuantiles.test_equal_sized_groups -*graalpython.lib-python.3.test.test_statistics.TestQuantiles.test_error_cases -*graalpython.lib-python.3.test.test_statistics.TestQuantiles.test_specific_cases -*graalpython.lib-python.3.test.test_statistics.TestQuantiles.test_specific_cases_inclusive -*graalpython.lib-python.3.test.test_statistics.TestSign.testZeroes -*graalpython.lib-python.3.test.test_statistics.TestSqrtHelpers.test_decimal_sqrt_of_frac -*graalpython.lib-python.3.test.test_statistics.TestSqrtHelpers.test_float_sqrt_of_frac -*graalpython.lib-python.3.test.test_statistics.TestSqrtHelpers.test_integer_sqrt_of_frac_rto -*graalpython.lib-python.3.test.test_statistics.TestStdev.test_bad_arg_types -*graalpython.lib-python.3.test.test_statistics.TestStdev.test_center_not_at_mean -*graalpython.lib-python.3.test.test_statistics.TestStdev.test_compare_to_variance -*graalpython.lib-python.3.test.test_statistics.TestStdev.test_domain_error_regression -*graalpython.lib-python.3.test.test_statistics.TestStdev.test_empty_data -*graalpython.lib-python.3.test.test_statistics.TestStdev.test_iter_list_same -*graalpython.lib-python.3.test.test_statistics.TestStdev.test_no_args -*graalpython.lib-python.3.test.test_statistics.TestStdev.test_no_inplace_modifications -*graalpython.lib-python.3.test.test_statistics.TestStdev.test_order_doesnt_matter -*graalpython.lib-python.3.test.test_statistics.TestStdev.test_range_data -*graalpython.lib-python.3.test.test_statistics.TestStdev.test_repeated_single_value -*graalpython.lib-python.3.test.test_statistics.TestStdev.test_shift_data -*graalpython.lib-python.3.test.test_statistics.TestStdev.test_shift_data_exact -*graalpython.lib-python.3.test.test_statistics.TestStdev.test_single_value -*graalpython.lib-python.3.test.test_statistics.TestStdev.test_type_of_data_collection -*graalpython.lib-python.3.test.test_statistics.TestStdev.test_type_of_data_element -*graalpython.lib-python.3.test.test_statistics.TestSum.test_bytes_fail -*graalpython.lib-python.3.test.test_statistics.TestSum.test_compare_with_math_fsum -*graalpython.lib-python.3.test.test_statistics.TestSum.test_decimals -*graalpython.lib-python.3.test.test_statistics.TestSum.test_empty_data -*graalpython.lib-python.3.test.test_statistics.TestSum.test_floats -*graalpython.lib-python.3.test.test_statistics.TestSum.test_fractions -*graalpython.lib-python.3.test.test_statistics.TestSum.test_ints -*graalpython.lib-python.3.test.test_statistics.TestSum.test_mixed_sum -*graalpython.lib-python.3.test.test_statistics.TestSum.test_start_argument -*graalpython.lib-python.3.test.test_statistics.TestSum.test_strings_fail -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_accuracy_bug_20499 -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_bad_arg_types -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_center_not_at_mean -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_decimals -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_domain_error_regression -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_empty_data -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_fractions -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_ints -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_iter_list_same -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_no_args -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_no_inplace_modifications -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_order_doesnt_matter -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_range_data -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_repeated_single_value -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_shift_data -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_shift_data_exact -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_single_value -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_type_of_data_collection -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_type_of_data_element -*graalpython.lib-python.3.test.test_statistics.TestVariance.test_types_conserved +DocTestCase.test.test_statistics.NumericTestCase.assertApproxEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_statistics._DoNothing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_statistics._calc_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_statistics._nan_equal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.test.test_statistics.approx_equal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualExactTest.test_exactly_equal_absolute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualExactTest.test_exactly_equal_absolute_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualExactTest.test_exactly_equal_both @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualExactTest.test_exactly_equal_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualExactTest.test_exactly_equal_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualExactTest.test_exactly_equal_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualExactTest.test_exactly_equal_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualExactTest.test_exactly_equal_relative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_absolute_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_absolute_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_absolute_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_absolute_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_both1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_both2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_both3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_both4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_relative_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_relative_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_relative_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_relative_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualInexactTest.test_cross_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualSpecialsTest.test_decimal_zeroes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualSpecialsTest.test_float_zeroes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualSpecialsTest.test_inf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualSpecialsTest.test_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualSymmetryTest.test_relative_symmetry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualSymmetryTest.test_symmetry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualUnequalTest.test_exactly_unequal_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualUnequalTest.test_exactly_unequal_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualUnequalTest.test_exactly_unequal_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ApproxEqualUnequalTest.test_exactly_unequal_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.CoerceTest.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.CoerceTest.test_decimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.CoerceTest.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.CoerceTest.test_fraction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.CoerceTest.test_incompatible_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.CoerceTest.test_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.CoerceTest.test_non_numeric_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ConvertTest.test_decimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ConvertTest.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ConvertTest.test_fraction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ConvertTest.test_inf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ConvertTest.test_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ConvertTest.test_invalid_input_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ConvertTest.test_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.DecimalToRatioTest.test_infinity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.DecimalToRatioTest.test_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.DecimalToRatioTest.test_negative_exponent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.DecimalToRatioTest.test_positive_exponent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.DecimalToRatioTest.test_regression_20536 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.DecimalToRatioTest.test_sign @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.DocTests.test_doc_tests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ExactRatioTest.test_decimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ExactRatioTest.test_decimal_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ExactRatioTest.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ExactRatioTest.test_float_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ExactRatioTest.test_fraction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ExactRatioTest.test_inf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.ExactRatioTest.test_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.FailNegTest.test_error_msg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.FailNegTest.test_negatives_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.FailNegTest.test_pass_through @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.GlobalsTest.test_check_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.GlobalsTest.test_meta @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.IsFiniteTest.test_finite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.IsFiniteTest.test_infinity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.IsFiniteTest.test_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.StatisticsErrorTest.test_has_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.SumSpecialValues.test_decimal_basiccontext_mismatched_infs_to_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.SumSpecialValues.test_decimal_extendedcontext_mismatched_infs_to_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.SumSpecialValues.test_decimal_inf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.SumSpecialValues.test_decimal_snan_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.SumSpecialValues.test_float_inf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.SumSpecialValues.test_float_mismatched_infs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.SumSpecialValues.test_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.SumTortureTest.test_torture @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestApproxEqualErrors.test_bad_rel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestApproxEqualErrors.test_bad_tol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestBivariateStatistics.test_small_sample_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestBivariateStatistics.test_unequal_size_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestCorrelationAndCovariance.test_different_scales @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestCorrelationAndCovariance.test_results @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestFMean.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestFMean.test_error_cases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestFMean.test_special_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestFMean.test_weights @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestGeometricMean.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestGeometricMean.test_big_and_small @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestGeometricMean.test_error_cases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestGeometricMean.test_mixed_int_and_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestGeometricMean.test_special_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestGeometricMean.test_various_input_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_bad_arg_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_decimals_exact @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_doubled_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_empty_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_floats_exact @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_inf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_invalid_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_multiply_data_points @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_negative_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_no_inplace_modifications @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_order_doesnt_matter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_range_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_repeated_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_singleton_lists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_type_of_data_collection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_type_of_data_element @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_types_conserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_with_weights @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestHarmonicMean.test_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestLinearRegression.test_constant_input_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestLinearRegression.test_proportional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestLinearRegression.test_results @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_bad_arg_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_big_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_doubled_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_empty_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_inf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_mismatched_infs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_no_inplace_modifications @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_order_doesnt_matter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_range_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_regression_20561 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_regression_25177 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_repeated_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_torture_pep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_type_of_data_collection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_type_of_data_element @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMean.test_types_conserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedian.test_bad_arg_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedian.test_empty_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedian.test_even_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedian.test_even_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedian.test_even_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedian.test_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedian.test_no_inplace_modifications @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedian.test_odd_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedian.test_odd_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedian.test_odd_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedian.test_order_doesnt_matter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedian.test_range_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedian.test_repeated_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedian.test_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedian.test_type_of_data_collection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedian.test_type_of_data_element @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianDataType.test_types_conserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_bad_arg_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_data_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_empty_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_even_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_even_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_even_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_even_number_repeated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_interval @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_no_inplace_modifications @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_odd_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_odd_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_odd_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_odd_number_repeated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_order_doesnt_matter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_range_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_repeated_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_type_of_data_collection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianGrouped.test_type_of_data_element @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianHigh.test_bad_arg_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianHigh.test_empty_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianHigh.test_even_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianHigh.test_even_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianHigh.test_even_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianHigh.test_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianHigh.test_no_inplace_modifications @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianHigh.test_odd_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianHigh.test_odd_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianHigh.test_odd_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianHigh.test_order_doesnt_matter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianHigh.test_range_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianHigh.test_repeated_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianHigh.test_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianHigh.test_type_of_data_collection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianHigh.test_type_of_data_element @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianHigh.test_types_conserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianLow.test_bad_arg_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianLow.test_empty_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianLow.test_even_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianLow.test_even_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianLow.test_even_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianLow.test_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianLow.test_no_inplace_modifications @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianLow.test_odd_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianLow.test_odd_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianLow.test_odd_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianLow.test_order_doesnt_matter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianLow.test_range_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianLow.test_repeated_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianLow.test_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianLow.test_type_of_data_collection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianLow.test_type_of_data_element @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMedianLow.test_types_conserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMode.test_bad_arg_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMode.test_bimodal_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMode.test_counter_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMode.test_discrete_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMode.test_empty_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMode.test_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMode.test_no_inplace_modifications @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMode.test_nominal_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMode.test_none_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMode.test_order_doesnt_matter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMode.test_range_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMode.test_repeated_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMode.test_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMode.test_type_of_data_collection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMode.test_type_of_data_element @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMode.test_types_conserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMode.test_unique_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestModules.test_py_functions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestMultiMode.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNormalDistPython.test_alternative_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNormalDistPython.test_cdf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNormalDistPython.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNormalDistPython.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNormalDistPython.test_hashability @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNormalDistPython.test_instantiation_and_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNormalDistPython.test_inv_cdf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNormalDistPython.test_overlap @ darwin-arm64,linux-aarch64 +test.test_statistics.TestNormalDistPython.test_pdf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNormalDistPython.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNormalDistPython.test_properties @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNormalDistPython.test_quantiles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNormalDistPython.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNormalDistPython.test_same_type_addition_and_subtraction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNormalDistPython.test_sample_generation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNormalDistPython.test_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNormalDistPython.test_translation_and_scaling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNormalDistPython.test_unary_operations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNormalDistPython.test_zscore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNumericTestCase.test_error_msg_numeric @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNumericTestCase.test_error_msg_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestNumericTestCase.test_numerictestcase_is_testcase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPStdev.test_bad_arg_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPStdev.test_center_not_at_mean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPStdev.test_compare_to_variance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPStdev.test_domain_error_regression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPStdev.test_empty_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPStdev.test_iter_list_same @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPStdev.test_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPStdev.test_no_inplace_modifications @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPStdev.test_order_doesnt_matter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPStdev.test_range_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPStdev.test_repeated_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPStdev.test_shift_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPStdev.test_shift_data_exact @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPStdev.test_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPStdev.test_type_of_data_collection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPStdev.test_type_of_data_element @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_accuracy_bug_20499 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_bad_arg_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_domain_error_regression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_empty_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_exact_uniform @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_iter_list_same @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_no_inplace_modifications @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_order_doesnt_matter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_range_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_repeated_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_shift_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_shift_data_exact @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_type_of_data_collection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_type_of_data_element @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestPVariance.test_types_conserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestQuantiles.test_equal_inputs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestQuantiles.test_equal_sized_groups @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestQuantiles.test_error_cases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestQuantiles.test_specific_cases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestQuantiles.test_specific_cases_inclusive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestSign.testZeroes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestSqrtHelpers.test_decimal_sqrt_of_frac @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestSqrtHelpers.test_float_sqrt_of_frac @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestSqrtHelpers.test_integer_sqrt_of_frac_rto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestStdev.test_bad_arg_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestStdev.test_center_not_at_mean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestStdev.test_compare_to_variance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestStdev.test_domain_error_regression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestStdev.test_empty_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestStdev.test_iter_list_same @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestStdev.test_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestStdev.test_no_inplace_modifications @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestStdev.test_order_doesnt_matter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestStdev.test_range_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestStdev.test_repeated_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestStdev.test_shift_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestStdev.test_shift_data_exact @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestStdev.test_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestStdev.test_type_of_data_collection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestStdev.test_type_of_data_element @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestSum.test_bytes_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestSum.test_compare_with_math_fsum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestSum.test_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestSum.test_empty_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestSum.test_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestSum.test_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestSum.test_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestSum.test_mixed_sum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestSum.test_strings_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_accuracy_bug_20499 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_bad_arg_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_center_not_at_mean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_decimals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_domain_error_regression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_empty_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_fractions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_ints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_iter_list_same @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_no_inplace_modifications @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_order_doesnt_matter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_range_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_repeated_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_shift_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_shift_data_exact @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_single_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_type_of_data_collection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_type_of_data_element @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_statistics.TestVariance.test_types_conserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_strftime.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_strftime.txt index 72b6d8efaf..184aa95db5 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_strftime.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_strftime.txt @@ -1,4 +1,4 @@ -*graalpython.lib-python.3.test.test_strftime.StrftimeTest.test_strftime -*graalpython.lib-python.3.test.test_strftime.Y1900Tests.test_y_1900 -*graalpython.lib-python.3.test.test_strftime.Y1900Tests.test_y_after_1900 -*graalpython.lib-python.3.test.test_strftime.Y1900Tests.test_y_before_1900 +test.test_strftime.StrftimeTest.test_strftime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strftime.Y1900Tests.test_y_1900 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strftime.Y1900Tests.test_y_after_1900 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strftime.Y1900Tests.test_y_before_1900 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_string.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_string.txt index b00fa79d80..b53902380b 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_string.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_string.txt @@ -1,38 +1,38 @@ -*graalpython.lib-python.3.test.test_string.ModuleTest.test_attrs -*graalpython.lib-python.3.test.test_string.ModuleTest.test_auto_numbering -*graalpython.lib-python.3.test.test_string.ModuleTest.test_basic_formatter -*graalpython.lib-python.3.test.test_string.ModuleTest.test_capwords -*graalpython.lib-python.3.test.test_string.ModuleTest.test_check_unused_args -*graalpython.lib-python.3.test.test_string.ModuleTest.test_conversion_specifiers -*graalpython.lib-python.3.test.test_string.ModuleTest.test_format_keyword_arguments -*graalpython.lib-python.3.test.test_string.ModuleTest.test_index_lookup -*graalpython.lib-python.3.test.test_string.ModuleTest.test_name_lookup -*graalpython.lib-python.3.test.test_string.ModuleTest.test_override_convert_field -*graalpython.lib-python.3.test.test_string.ModuleTest.test_override_format_field -*graalpython.lib-python.3.test.test_string.ModuleTest.test_override_get_value -*graalpython.lib-python.3.test.test_string.ModuleTest.test_override_parse -*graalpython.lib-python.3.test.test_string.ModuleTest.test_vformat_recursion_limit -*graalpython.lib-python.3.test.test_string.TestTemplate.test_SafeTemplate -*graalpython.lib-python.3.test.test_string.TestTemplate.test_braced_override -*graalpython.lib-python.3.test.test_string.TestTemplate.test_braced_override_safe -*graalpython.lib-python.3.test.test_string.TestTemplate.test_delimiter_override -*graalpython.lib-python.3.test.test_string.TestTemplate.test_escapes -*graalpython.lib-python.3.test.test_string.TestTemplate.test_flags_override -*graalpython.lib-python.3.test.test_string.TestTemplate.test_get_identifiers -*graalpython.lib-python.3.test.test_string.TestTemplate.test_idpattern_override -*graalpython.lib-python.3.test.test_string.TestTemplate.test_idpattern_override_inside_outside -*graalpython.lib-python.3.test.test_string.TestTemplate.test_idpattern_override_inside_outside_invalid_unbraced -*graalpython.lib-python.3.test.test_string.TestTemplate.test_invalid_placeholders -*graalpython.lib-python.3.test.test_string.TestTemplate.test_invalid_with_no_lines -*graalpython.lib-python.3.test.test_string.TestTemplate.test_is_valid -*graalpython.lib-python.3.test.test_string.TestTemplate.test_keyword_arguments -*graalpython.lib-python.3.test.test_string.TestTemplate.test_keyword_arguments_safe -*graalpython.lib-python.3.test.test_string.TestTemplate.test_pattern_override -*graalpython.lib-python.3.test.test_string.TestTemplate.test_percents -*graalpython.lib-python.3.test.test_string.TestTemplate.test_regular_templates -*graalpython.lib-python.3.test.test_string.TestTemplate.test_regular_templates_with_braces -*graalpython.lib-python.3.test.test_string.TestTemplate.test_regular_templates_with_non_letters -*graalpython.lib-python.3.test.test_string.TestTemplate.test_regular_templates_with_upper_case -*graalpython.lib-python.3.test.test_string.TestTemplate.test_stringification -*graalpython.lib-python.3.test.test_string.TestTemplate.test_tupleargs -*graalpython.lib-python.3.test.test_string.TestTemplate.test_unicode_values +test.test_string.ModuleTest.test_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.ModuleTest.test_auto_numbering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.ModuleTest.test_basic_formatter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.ModuleTest.test_capwords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.ModuleTest.test_check_unused_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.ModuleTest.test_conversion_specifiers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.ModuleTest.test_format_keyword_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.ModuleTest.test_index_lookup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.ModuleTest.test_name_lookup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.ModuleTest.test_override_convert_field @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.ModuleTest.test_override_format_field @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.ModuleTest.test_override_get_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.ModuleTest.test_override_parse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.ModuleTest.test_vformat_recursion_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_SafeTemplate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_braced_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_braced_override_safe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_delimiter_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_escapes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_flags_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_get_identifiers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_idpattern_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_idpattern_override_inside_outside @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_idpattern_override_inside_outside_invalid_unbraced @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_invalid_placeholders @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_invalid_with_no_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_is_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_keyword_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_keyword_arguments_safe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_pattern_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_percents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_regular_templates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_regular_templates_with_braces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_regular_templates_with_non_letters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_regular_templates_with_upper_case @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_stringification @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_tupleargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string.TestTemplate.test_unicode_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_string_literals.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_string_literals.txt index cdd3b2e6d7..15e5640418 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_string_literals.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_string_literals.txt @@ -1,17 +1,17 @@ -*graalpython.lib-python.3.test.test_string_literals.TestLiterals.test_eval_bytes_incomplete -*graalpython.lib-python.3.test.test_string_literals.TestLiterals.test_eval_bytes_invalid_escape -*graalpython.lib-python.3.test.test_string_literals.TestLiterals.test_eval_bytes_normal -*graalpython.lib-python.3.test.test_string_literals.TestLiterals.test_eval_bytes_raw -*graalpython.lib-python.3.test.test_string_literals.TestLiterals.test_eval_str_incomplete -*graalpython.lib-python.3.test.test_string_literals.TestLiterals.test_eval_str_invalid_escape -*graalpython.lib-python.3.test.test_string_literals.TestLiterals.test_eval_str_normal -*graalpython.lib-python.3.test.test_string_literals.TestLiterals.test_eval_str_raw -*graalpython.lib-python.3.test.test_string_literals.TestLiterals.test_eval_str_u -*graalpython.lib-python.3.test.test_string_literals.TestLiterals.test_file_iso_8859_1 -*graalpython.lib-python.3.test.test_string_literals.TestLiterals.test_file_latin9 -*graalpython.lib-python.3.test.test_string_literals.TestLiterals.test_file_latin_1 -*graalpython.lib-python.3.test.test_string_literals.TestLiterals.test_file_utf8 -*graalpython.lib-python.3.test.test_string_literals.TestLiterals.test_file_utf_8 -*graalpython.lib-python.3.test.test_string_literals.TestLiterals.test_file_utf_8_error -*graalpython.lib-python.3.test.test_string_literals.TestLiterals.test_template -*graalpython.lib-python.3.test.test_string_literals.TestLiterals.test_uppercase_prefixes +test.test_string_literals.TestLiterals.test_eval_bytes_incomplete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string_literals.TestLiterals.test_eval_bytes_invalid_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string_literals.TestLiterals.test_eval_bytes_normal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string_literals.TestLiterals.test_eval_bytes_raw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string_literals.TestLiterals.test_eval_str_incomplete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string_literals.TestLiterals.test_eval_str_invalid_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string_literals.TestLiterals.test_eval_str_normal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string_literals.TestLiterals.test_eval_str_raw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string_literals.TestLiterals.test_eval_str_u @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string_literals.TestLiterals.test_file_iso_8859_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string_literals.TestLiterals.test_file_latin9 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string_literals.TestLiterals.test_file_latin_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string_literals.TestLiterals.test_file_utf8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string_literals.TestLiterals.test_file_utf_8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string_literals.TestLiterals.test_file_utf_8_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string_literals.TestLiterals.test_template @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_string_literals.TestLiterals.test_uppercase_prefixes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_stringprep.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_stringprep.txt index b8f8dc6c0e..56c5a05839 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_stringprep.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_stringprep.txt @@ -1 +1 @@ -*graalpython.lib-python.3.test.test_stringprep.StringprepTests.test +test.test_stringprep.StringprepTests.test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_strptime.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_strptime.txt index ba2c1e91e5..220ef38651 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_strptime.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_strptime.txt @@ -1,43 +1,48 @@ -*graalpython.lib-python.3.test.test_strptime.CacheTests.test_TimeRE_recreation_locale -*graalpython.lib-python.3.test.test_strptime.CacheTests.test_new_localetime -*graalpython.lib-python.3.test.test_strptime.CacheTests.test_regex_cleanup -*graalpython.lib-python.3.test.test_strptime.CacheTests.test_time_re_recreation -*graalpython.lib-python.3.test.test_strptime.CalculationTests.test_week_0 -*graalpython.lib-python.3.test.test_strptime.JulianTests.test_all_julian_days -*graalpython.lib-python.3.test.test_strptime.LocaleTime_Tests.test_am_pm -*graalpython.lib-python.3.test.test_strptime.LocaleTime_Tests.test_date_time -*graalpython.lib-python.3.test.test_strptime.LocaleTime_Tests.test_lang -*graalpython.lib-python.3.test.test_strptime.LocaleTime_Tests.test_month -*graalpython.lib-python.3.test.test_strptime.LocaleTime_Tests.test_timezone -*graalpython.lib-python.3.test.test_strptime.LocaleTime_Tests.test_weekday -*graalpython.lib-python.3.test.test_strptime.Strptime12AMPMTests.test_twelve_noon_midnight -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_ValueError -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_bad_offset -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_bad_timezone -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_caseinsensitive -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_date -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_date_time -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_day -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_defaults -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_escaping -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_feb29_on_leap_year_without_year -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_fraction -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_hour -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_julian -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_mar1_comes_after_feb29_even_when_omitting_the_year -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_minute -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_month -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_offset -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_percent -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_second -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_strptime_exception_context -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_time -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_unconverteddata -*graalpython.lib-python.3.test.test_strptime.StrptimeTests.test_year -*graalpython.lib-python.3.test.test_strptime.TimeRETests.test_blankpattern -*graalpython.lib-python.3.test.test_strptime.TimeRETests.test_locale_data_w_regex_metacharacters -*graalpython.lib-python.3.test.test_strptime.TimeRETests.test_matching_with_escapes -*graalpython.lib-python.3.test.test_strptime.TimeRETests.test_pattern -*graalpython.lib-python.3.test.test_strptime.TimeRETests.test_pattern_escaping -*graalpython.lib-python.3.test.test_strptime.TimeRETests.test_whitespace_substitution -*graalpython.lib-python.3.test.test_strptime.getlang_Tests.test_basic +test.test_strptime.CacheTests.test_TimeRE_recreation_locale @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.CacheTests.test_new_localetime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.CacheTests.test_regex_cleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.CacheTests.test_time_re_recreation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.CalculationTests.test_day_of_week_calculation @ darwin-arm64,darwin-x86_64,win32-AMD64 +test.test_strptime.CalculationTests.test_gregorian_calculation @ darwin-arm64,darwin-x86_64,win32-AMD64 +test.test_strptime.CalculationTests.test_julian_calculation @ darwin-arm64,darwin-x86_64,win32-AMD64 +test.test_strptime.CalculationTests.test_week_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.JulianTests.test_all_julian_days @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.LocaleTime_Tests.test_am_pm @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.LocaleTime_Tests.test_date_time @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.LocaleTime_Tests.test_lang @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.LocaleTime_Tests.test_month @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.LocaleTime_Tests.test_timezone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.LocaleTime_Tests.test_weekday @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.Strptime12AMPMTests.test_twelve_noon_midnight @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_ValueError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_bad_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_bad_timezone @ darwin-arm64,darwin-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_caseinsensitive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_date @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_date_time @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_day @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_escaping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_feb29_on_leap_year_without_year @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_fraction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_hour @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_julian @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_mar1_comes_after_feb29_even_when_omitting_the_year @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_minute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_month @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_percent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_second @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_strptime_exception_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_time @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Seems to be dependent on the actual time/date/timezone of the machine, at least on GraalPy. Needs investigation +!test.test_strptime.StrptimeTests.test_timezone +test.test_strptime.StrptimeTests.test_unconverteddata @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.StrptimeTests.test_year @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.TimeRETests.test_blankpattern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.TimeRETests.test_locale_data_w_regex_metacharacters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.TimeRETests.test_matching_with_escapes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.TimeRETests.test_pattern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.TimeRETests.test_pattern_escaping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.TimeRETests.test_whitespace_substitution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strptime.getlang_Tests.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_strtod.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_strtod.txt index acfbe07491..fe7ad0a788 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_strtod.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_strtod.txt @@ -1,9 +1,8 @@ -*graalpython.lib-python.3.test.test_strtod.StrtodTests.test_bigcomp -*graalpython.lib-python.3.test.test_strtod.StrtodTests.test_boundaries -*graalpython.lib-python.3.test.test_strtod.StrtodTests.test_halfway_cases -*graalpython.lib-python.3.test.test_strtod.StrtodTests.test_large_exponents -*graalpython.lib-python.3.test.test_strtod.StrtodTests.test_oversized_digit_strings -*graalpython.lib-python.3.test.test_strtod.StrtodTests.test_parsing -*graalpython.lib-python.3.test.test_strtod.StrtodTests.test_particular -*graalpython.lib-python.3.test.test_strtod.StrtodTests.test_short_halfway_cases -*graalpython.lib-python.3.test.test_strtod.StrtodTests.test_underflow_boundary +test.test_strtod.StrtodTests.test_bigcomp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strtod.StrtodTests.test_boundaries @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strtod.StrtodTests.test_halfway_cases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strtod.StrtodTests.test_large_exponents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strtod.StrtodTests.test_parsing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strtod.StrtodTests.test_particular @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strtod.StrtodTests.test_short_halfway_cases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_strtod.StrtodTests.test_underflow_boundary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_struct.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_struct.txt index 2c4d8edbe9..a156c6a67d 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_struct.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_struct.txt @@ -1,35 +1,30 @@ -*graalpython.lib-python.3.test.test_struct.StructTest.test_1530559 -*graalpython.lib-python.3.test.test_struct.StructTest.test_705836 -*graalpython.lib-python.3.test.test_struct.StructTest.test_Struct_reinitialization -*graalpython.lib-python.3.test.test_struct.StructTest.test__sizeof__ -*graalpython.lib-python.3.test.test_struct.StructTest.test__struct_types_immutable -*graalpython.lib-python.3.test.test_struct.StructTest.test_bool -*graalpython.lib-python.3.test.test_struct.StructTest.test_boundary_error_message -*graalpython.lib-python.3.test.test_struct.StructTest.test_boundary_error_message_with_large_offset -*graalpython.lib-python.3.test.test_struct.StructTest.test_boundary_error_message_with_negative_offset -*graalpython.lib-python.3.test.test_struct.StructTest.test_calcsize -*graalpython.lib-python.3.test.test_struct.StructTest.test_consistence -*graalpython.lib-python.3.test.test_struct.StructTest.test_count_overflow -*graalpython.lib-python.3.test.test_struct.StructTest.test_format_attr -*graalpython.lib-python.3.test.test_struct.StructTest.test_integers -*graalpython.lib-python.3.test.test_struct.StructTest.test_isbigendian -*graalpython.lib-python.3.test.test_struct.StructTest.test_issue29802 -*graalpython.lib-python.3.test.test_struct.StructTest.test_issue35714 -*graalpython.lib-python.3.test.test_struct.StructTest.test_issue45034_signed -*graalpython.lib-python.3.test.test_struct.StructTest.test_issue45034_unsigned -*graalpython.lib-python.3.test.test_struct.StructTest.test_nN_code -*graalpython.lib-python.3.test.test_struct.StructTest.test_new_features -*graalpython.lib-python.3.test.test_struct.StructTest.test_p_code -*graalpython.lib-python.3.test.test_struct.StructTest.test_pack_into -*graalpython.lib-python.3.test.test_struct.StructTest.test_pack_into_fn -*graalpython.lib-python.3.test.test_struct.StructTest.test_trailing_counter -*graalpython.lib-python.3.test.test_struct.StructTest.test_transitiveness -*graalpython.lib-python.3.test.test_struct.StructTest.test_unpack_from -*graalpython.lib-python.3.test.test_struct.StructTest.test_unpack_with_buffer -*graalpython.lib-python.3.test.test_struct.UnpackIteratorTest.test_arbitrary_buffer -*graalpython.lib-python.3.test.test_struct.UnpackIteratorTest.test_construct -*graalpython.lib-python.3.test.test_struct.UnpackIteratorTest.test_half_float -*graalpython.lib-python.3.test.test_struct.UnpackIteratorTest.test_iterate -*graalpython.lib-python.3.test.test_struct.UnpackIteratorTest.test_length_hint -*graalpython.lib-python.3.test.test_struct.UnpackIteratorTest.test_module_func -*graalpython.lib-python.3.test.test_struct.UnpackIteratorTest.test_uninstantiable +test.test_struct.StructTest.test_1530559 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_705836 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_Struct_reinitialization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_boundary_error_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_boundary_error_message_with_large_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_boundary_error_message_with_negative_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_calcsize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_consistence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_format_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_integers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_isbigendian @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_issue29802 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_issue35714 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_nN_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_new_features @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_p_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_pack_into @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_pack_into_fn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_trailing_counter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_transitiveness @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_unpack_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.StructTest.test_unpack_with_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.UnpackIteratorTest.test_arbitrary_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.UnpackIteratorTest.test_construct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.UnpackIteratorTest.test_half_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.UnpackIteratorTest.test_iterate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.UnpackIteratorTest.test_length_hint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.UnpackIteratorTest.test_module_func @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_struct.UnpackIteratorTest.test_uninstantiable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_structseq.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_structseq.txt index c592885e3e..a138e56de5 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_structseq.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_structseq.txt @@ -1,16 +1,15 @@ -*graalpython.lib-python.3.test.test_structseq.StructSeqTest.test_cmp -*graalpython.lib-python.3.test.test_structseq.StructSeqTest.test_concat -*graalpython.lib-python.3.test.test_structseq.StructSeqTest.test_constructor -*graalpython.lib-python.3.test.test_structseq.StructSeqTest.test_contains -*graalpython.lib-python.3.test.test_structseq.StructSeqTest.test_copying -*graalpython.lib-python.3.test.test_structseq.StructSeqTest.test_copying_with_unnamed_fields -*graalpython.lib-python.3.test.test_structseq.StructSeqTest.test_eviltuple -*graalpython.lib-python.3.test.test_structseq.StructSeqTest.test_extended_getslice -*graalpython.lib-python.3.test.test_structseq.StructSeqTest.test_fields -*graalpython.lib-python.3.test.test_structseq.StructSeqTest.test_hash -*graalpython.lib-python.3.test.test_structseq.StructSeqTest.test_pickling -*graalpython.lib-python.3.test.test_structseq.StructSeqTest.test_pickling_with_unnamed_fields -*graalpython.lib-python.3.test.test_structseq.StructSeqTest.test_reduce -*graalpython.lib-python.3.test.test_structseq.StructSeqTest.test_repeat -*graalpython.lib-python.3.test.test_structseq.StructSeqTest.test_repr -*graalpython.lib-python.3.test.test_structseq.StructSeqTest.test_tuple +test.test_structseq.StructSeqTest.test_cmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_structseq.StructSeqTest.test_concat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_structseq.StructSeqTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_structseq.StructSeqTest.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_structseq.StructSeqTest.test_copying @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_structseq.StructSeqTest.test_copying_with_unnamed_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_structseq.StructSeqTest.test_eviltuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_structseq.StructSeqTest.test_extended_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_structseq.StructSeqTest.test_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_structseq.StructSeqTest.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_structseq.StructSeqTest.test_pickling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_structseq.StructSeqTest.test_pickling_with_unnamed_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_structseq.StructSeqTest.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_structseq.StructSeqTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_structseq.StructSeqTest.test_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_subclassinit.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_subclassinit.txt index 04bdd547cc..1b8d54f0f0 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_subclassinit.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_subclassinit.txt @@ -1,17 +1,17 @@ -*graalpython.lib-python.3.test.test_subclassinit.Test.test_errors -*graalpython.lib-python.3.test.test_subclassinit.Test.test_errors_changed_pep487 -*graalpython.lib-python.3.test.test_subclassinit.Test.test_init_subclass -*graalpython.lib-python.3.test.test_subclassinit.Test.test_init_subclass_diamond -*graalpython.lib-python.3.test.test_subclassinit.Test.test_init_subclass_dict -*graalpython.lib-python.3.test.test_subclassinit.Test.test_init_subclass_error -*graalpython.lib-python.3.test.test_subclassinit.Test.test_init_subclass_kwargs -*graalpython.lib-python.3.test.test_subclassinit.Test.test_init_subclass_skipped -*graalpython.lib-python.3.test.test_subclassinit.Test.test_init_subclass_wrong -*graalpython.lib-python.3.test.test_subclassinit.Test.test_set_name -*graalpython.lib-python.3.test.test_subclassinit.Test.test_set_name_error -*graalpython.lib-python.3.test.test_subclassinit.Test.test_set_name_init_subclass -*graalpython.lib-python.3.test.test_subclassinit.Test.test_set_name_lookup -*graalpython.lib-python.3.test.test_subclassinit.Test.test_set_name_metaclass -*graalpython.lib-python.3.test.test_subclassinit.Test.test_set_name_modifying_dict -*graalpython.lib-python.3.test.test_subclassinit.Test.test_set_name_wrong -*graalpython.lib-python.3.test.test_subclassinit.Test.test_type +test.test_subclassinit.Test.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subclassinit.Test.test_errors_changed_pep487 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subclassinit.Test.test_init_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subclassinit.Test.test_init_subclass_diamond @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subclassinit.Test.test_init_subclass_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subclassinit.Test.test_init_subclass_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subclassinit.Test.test_init_subclass_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subclassinit.Test.test_init_subclass_skipped @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subclassinit.Test.test_init_subclass_wrong @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subclassinit.Test.test_set_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subclassinit.Test.test_set_name_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subclassinit.Test.test_set_name_init_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subclassinit.Test.test_set_name_lookup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subclassinit.Test.test_set_name_metaclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subclassinit.Test.test_set_name_modifying_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subclassinit.Test.test_set_name_wrong @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subclassinit.Test.test_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_subprocess.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_subprocess.txt index d2b837a6ce..7163f64509 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_subprocess.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_subprocess.txt @@ -1,325 +1,183 @@ -*graalpython.lib-python.3.test.test_subprocess.CommandsWithSpaces.test_noshell_sequence_with_spaces -*graalpython.lib-python.3.test.test_subprocess.CommandsWithSpaces.test_noshell_string_with_spaces -*graalpython.lib-python.3.test.test_subprocess.CommandsWithSpaces.test_shell_sequence_with_spaces -*graalpython.lib-python.3.test.test_subprocess.CommandsWithSpaces.test_shell_string_with_spaces -*graalpython.lib-python.3.test.test_subprocess.ContextManagerTests.test_broken_pipe_cleanup -*graalpython.lib-python.3.test.test_subprocess.ContextManagerTests.test_communicate_stdin -*graalpython.lib-python.3.test.test_subprocess.ContextManagerTests.test_invalid_args -*graalpython.lib-python.3.test.test_subprocess.ContextManagerTests.test_pipe -*graalpython.lib-python.3.test.test_subprocess.ContextManagerTests.test_returncode -*graalpython.lib-python.3.test.test_subprocess.MiscTests.test__all__ -*graalpython.lib-python.3.test.test_subprocess.MiscTests.test_call_keyboardinterrupt_no_kill -*graalpython.lib-python.3.test.test_subprocess.MiscTests.test_context_manager_keyboardinterrupt_no_kill -*graalpython.lib-python.3.test.test_subprocess.MiscTests.test_getoutput -*graalpython.lib-python.3.test.test_subprocess.MiscTests.test_run_keyboardinterrupt_no_kill -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_CalledProcessError_str_non_zero -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_CalledProcessError_str_signal -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_CalledProcessError_str_unknown_signal -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_args_string -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_bytes_program -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_call_string -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_close_fd_0 -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_close_fd_1 -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_close_fd_2 -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_close_fds -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_close_fds_0_1 -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_close_fds_0_1_2 -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_close_fds_0_2 -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_close_fds_1_2 -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_close_fds_after_preexec -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_close_fds_when_max_fd_is_lowered -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_close -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_close_with_timeout -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_flush -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_write -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_communicate_repeated_call_after_stdout_close -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_exception_bad_args_0 -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_exception_bad_executable -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_exception_cwd -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_exception_errpipe_bad_data -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_exception_errpipe_normal -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_extra_groups -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_extra_groups_error -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_fork_exec -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_group -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_group_error -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_invalid_args -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_kill -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_kill_dead -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_leak_fast_process_del_killed -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_pass_fds -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_pass_fds_inheritable -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_pass_fds_redirected -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_pipe_cloexec -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_pipe_cloexec_real_tools -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_preexec -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipes -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_preexec_exception -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_preexec_fork_failure -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_preexec_gc_module_failure -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_remapping_std_fds -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_select_unbuffered -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_send_signal -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_send_signal_dead -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_send_signal_race -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_send_signal_race2 -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_shell_sequence -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_shell_string -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_small_errpipe_write_fd -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_specific_shell -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_start_new_session -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_stderr_stdin_are_single_inout_fd -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_stdout_stderr_are_single_inout_fd -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_stdout_stdin_are_single_inout_fd -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_stopped -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_surrogates_error_message -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_swap_fds -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_terminate_dead -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_user -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_user_error -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_wait_when_sigchild_ignored -*graalpython.lib-python.3.test.test_subprocess.POSIXProcessTestCase.test_zombie_fast_process_del -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test__use_vfork -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_bufsize_equal_one_binary_mode -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_bufsize_equal_one_text_mode -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_bufsize_is_none -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_bytes_executable -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_bytes_executable_replaces_shell -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_call_kwargs -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_call_seq -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_call_timeout -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_check_call_nonzero -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_check_call_zero -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_check_output -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_check_output_input_arg -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_check_output_input_none -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_check_output_input_none_encoding_errors -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_check_output_input_none_text -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_check_output_input_none_universal_newlines -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_check_output_nonzero -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_check_output_stderr -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_check_output_stdin_arg -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_check_output_stdin_with_input_arg -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_check_output_stdout_arg -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_check_output_timeout -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_class_getitems -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_communicate -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_communicate_eintr -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_communicate_epipe -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_communicate_epipe_only_stdin -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_communicate_errors -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_communicate_pipe_buf -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_communicate_pipe_fd_leak -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_communicate_returns -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_communicate_stderr -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_communicate_stdin -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_communicate_stdout -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_communicate_timeout -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_communicate_timeout_large_output -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_cwd -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_cwd_with_absolute_arg -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_cwd_with_bytes -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_cwd_with_pathlike -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_cwd_with_relative_arg -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_cwd_with_relative_executable -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_double_close_on_error -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_empty_env -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_env -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_executable -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_executable_replaces_shell -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_executable_takes_precedence -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_executable_with_cwd -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_executable_without_cwd -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_failed_child_execute_fd_leak -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_file_not_found_includes_filename -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_file_not_found_with_bad_cwd -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_handles_closed_on_exception -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_invalid_args -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_invalid_bufsize -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_invalid_cmd -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_invalid_env -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_io_buffered_by_default -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_io_unbuffered_works -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_issue8780 -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_leaking_fds_on_error -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_list2cmdline -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_no_leaking -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_nonexisting_with_pipes -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_pathlike_executable -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_pathlike_executable_replaces_shell -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_pipesize_default -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_pipesizes -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_poll -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_repr -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stderr_devnull -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stderr_filedes -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stderr_fileobj -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stderr_none -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stderr_pipe -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stderr_redirect_with_no_stdout_redirect -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stdin_devnull -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stdin_filedes -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stdin_fileobj -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stdin_none -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stdin_pipe -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stdout_devnull -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stdout_filedes -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stdout_filedes_of_stdout -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stdout_fileobj -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stdout_none -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stdout_pipe -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stdout_stderr_file -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_stdout_stderr_pipe -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_threadsafe_wait -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_universal_newlines_and_text -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_universal_newlines_communicate -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_universal_newlines_communicate_encodings -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_universal_newlines_communicate_input_none -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_universal_newlines_communicate_stdin -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_universal_newlines_communicate_stdin_stdout_stderr -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_wait -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_wait_timeout -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCase.test_writes_before_communicate -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test__use_vfork -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_bufsize_equal_one_binary_mode -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_bufsize_equal_one_text_mode -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_bufsize_is_none -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_bytes_executable -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_bytes_executable_replaces_shell -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_call_kwargs -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_call_seq -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_call_timeout -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_check_call_nonzero -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_check_call_zero -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_check_output -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_check_output_input_arg -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_check_output_input_none -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_check_output_input_none_encoding_errors -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_check_output_input_none_text -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_check_output_input_none_universal_newlines -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_check_output_nonzero -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_check_output_stderr -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_check_output_stdin_arg -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_check_output_stdin_with_input_arg -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_check_output_stdout_arg -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_check_output_timeout -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_class_getitems -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_communicate -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_communicate_eintr -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_communicate_epipe -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_communicate_epipe_only_stdin -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_communicate_errors -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_communicate_pipe_buf -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_communicate_pipe_fd_leak -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_communicate_returns -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_communicate_stderr -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_communicate_stdin -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_communicate_stdout -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_communicate_timeout -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_communicate_timeout_large_output -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_cwd -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_cwd_with_absolute_arg -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_cwd_with_bytes -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_cwd_with_pathlike -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_cwd_with_relative_arg -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_cwd_with_relative_executable -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_double_close_on_error -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_empty_env -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_env -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_executable -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_executable_replaces_shell -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_executable_takes_precedence -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_executable_with_cwd -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_executable_without_cwd -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_failed_child_execute_fd_leak -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_file_not_found_includes_filename -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_file_not_found_with_bad_cwd -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_handles_closed_on_exception -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_invalid_args -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_invalid_bufsize -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_invalid_cmd -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_invalid_env -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_io_buffered_by_default -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_io_unbuffered_works -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_issue8780 -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_leaking_fds_on_error -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_list2cmdline -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_no_leaking -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_nonexisting_with_pipes -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_pathlike_executable -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_pathlike_executable_replaces_shell -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_pipesize_default -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_pipesizes -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_poll -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_repr -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stderr_devnull -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stderr_filedes -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stderr_fileobj -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stderr_none -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stderr_pipe -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stderr_redirect_with_no_stdout_redirect -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stdin_devnull -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stdin_filedes -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stdin_fileobj -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stdin_none -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stdin_pipe -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stdout_devnull -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stdout_filedes -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stdout_filedes_of_stdout -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stdout_fileobj -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stdout_none -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stdout_pipe -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stdout_stderr_file -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_stdout_stderr_pipe -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_threadsafe_wait -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_universal_newlines_and_text -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_universal_newlines_communicate -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_universal_newlines_communicate_encodings -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_universal_newlines_communicate_input_none -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_universal_newlines_communicate_stdin -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_universal_newlines_communicate_stdin_stdout_stderr -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_wait -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_wait_timeout -*graalpython.lib-python.3.test.test_subprocess.ProcessTestCaseNoPoll.test_writes_before_communicate -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test__use_vfork -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_capture_output -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_capture_stderr -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_capture_stdout -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_check -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_check_output_input_arg -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_check_output_stdin_arg -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_check_output_stdin_with_input_arg -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_check_output_timeout -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_check_zero -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_encoding_warning -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_returncode -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_run_kwargs -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_run_with_an_empty_env -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_run_with_bytes_path_and_arguments -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_run_with_pathlike_path -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_run_with_pathlike_path_and_arguments -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_run_with_shell_timeout_and_capture_output -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_stderr_with_capture_output_arg -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_stdout_with_capture_output_arg -*graalpython.lib-python.3.test.test_subprocess.RunFuncTestCase.test_timeout -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_call_string -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_close_fds -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_close_fds_with_stdio -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_creationflags -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_empty_attribute_list -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_empty_handle_list -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_invalid_args -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_issue31471 -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_kill -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_kill_dead -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_send_signal -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_send_signal_dead -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_shell_encodings -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_shell_sequence -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_shell_string -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_startupinfo -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_startupinfo_copy -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_startupinfo_keywords -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_terminate -*graalpython.lib-python.3.test.test_subprocess.Win32ProcessTestCase.test_terminate_dead +test.test_subprocess.CommandsWithSpaces.test_noshell_sequence_with_spaces @ win32-AMD64 +test.test_subprocess.CommandsWithSpaces.test_shell_sequence_with_spaces @ win32-AMD64 +test.test_subprocess.ContextManagerTests.test_broken_pipe_cleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ContextManagerTests.test_communicate_stdin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ContextManagerTests.test_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ContextManagerTests.test_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ContextManagerTests.test_returncode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.MiscTests.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.MiscTests.test_call_keyboardinterrupt_no_kill @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.MiscTests.test_context_manager_keyboardinterrupt_no_kill @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.MiscTests.test_getoutput @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.MiscTests.test_run_keyboardinterrupt_no_kill @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.POSIXProcessTestCase.test_CalledProcessError_str_non_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_CalledProcessError_str_signal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_CalledProcessError_str_unknown_signal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_args_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_bytes_program @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_call_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_close_fd_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_close_fd_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_close_fd_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_close_fds_0_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_close_fds_0_1_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_close_fds_0_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_close_fds_1_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_close_with_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_communicate_repeated_call_after_stdout_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_exception_bad_args_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_exception_bad_executable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_exception_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_exception_errpipe_bad_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_exception_errpipe_normal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_extra_groups_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_group_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_kill @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_kill_dead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_remapping_std_fds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_select_unbuffered @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_send_signal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_send_signal_dead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_send_signal_race @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_send_signal_race2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_shell_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_shell_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_small_errpipe_write_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_specific_shell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_start_new_session @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_stderr_stdin_are_single_inout_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_stdout_stderr_are_single_inout_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_stdout_stdin_are_single_inout_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_stopped @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_swap_fds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +# Transient, GR-41056 +!test.test_subprocess.POSIXProcessTestCase.test_swap_std_fds_with_one_closed @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_terminate_dead @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_user_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_wait_when_sigchild_ignored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_bufsize_equal_one_binary_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_bufsize_equal_one_text_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_bufsize_is_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_bytes_executable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_bytes_executable_replaces_shell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_call_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_call_seq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_call_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_check_call_nonzero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_check_call_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_check_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_check_output_input_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_check_output_input_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_check_output_input_none_encoding_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_check_output_input_none_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_check_output_input_none_universal_newlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_check_output_nonzero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_check_output_stderr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_check_output_stdin_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_check_output_stdin_with_input_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_check_output_stdout_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_class_getitems @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_communicate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_eintr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_epipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_epipe_only_stdin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_communicate_pipe_buf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_pipe_fd_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_communicate_returns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_communicate_stderr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_communicate_stdin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_stdout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_communicate_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_timeout_large_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_cwd_with_absolute_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_cwd_with_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_cwd_with_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_cwd_with_relative_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_cwd_with_relative_executable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_double_close_on_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_empty_env @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_env @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_executable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_executable_replaces_shell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_executable_takes_precedence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_executable_with_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_executable_without_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_failed_child_execute_fd_leak @ linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_file_not_found_includes_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_file_not_found_with_bad_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_handles_closed_on_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_invalid_bufsize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_invalid_cmd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_invalid_env @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_io_buffered_by_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_io_unbuffered_works @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_issue8780 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_leaking_fds_on_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_list2cmdline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_pathlike_executable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_pathlike_executable_replaces_shell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_poll @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_stderr_devnull @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stderr_filedes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stderr_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stderr_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stderr_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_stderr_redirect_with_no_stdout_redirect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdin_devnull @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_stdin_filedes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdin_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdin_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_stdin_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdout_devnull @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdout_filedes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdout_filedes_of_stdout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_stdout_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdout_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdout_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_stdout_stderr_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdout_stderr_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_threadsafe_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_universal_newlines_and_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_universal_newlines_communicate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_universal_newlines_communicate_encodings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_universal_newlines_communicate_input_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_universal_newlines_communicate_stdin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_universal_newlines_communicate_stdin_stdout_stderr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.ProcessTestCase.test_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.ProcessTestCase.test_writes_before_communicate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_capture_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.RunFuncTestCase.test_capture_stderr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.RunFuncTestCase.test_capture_stdout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.RunFuncTestCase.test_check @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.RunFuncTestCase.test_check_output_input_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.RunFuncTestCase.test_check_output_stdin_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_check_output_stdin_with_input_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.RunFuncTestCase.test_check_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.RunFuncTestCase.test_encoding_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.RunFuncTestCase.test_returncode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.RunFuncTestCase.test_run_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.RunFuncTestCase.test_run_with_an_empty_env @ win32-AMD64 +test.test_subprocess.RunFuncTestCase.test_run_with_bytes_path_and_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_run_with_pathlike_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.RunFuncTestCase.test_run_with_pathlike_path_and_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.RunFuncTestCase.test_run_with_shell_timeout_and_capture_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_stderr_with_capture_output_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.RunFuncTestCase.test_stdout_with_capture_output_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.RunFuncTestCase.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_subprocess.Win32ProcessTestCase.test_call_string @ win32-AMD64 +test.test_subprocess.Win32ProcessTestCase.test_close_fds @ win32-AMD64 +test.test_subprocess.Win32ProcessTestCase.test_creationflags @ win32-AMD64 +test.test_subprocess.Win32ProcessTestCase.test_kill @ win32-AMD64 +test.test_subprocess.Win32ProcessTestCase.test_kill_dead @ win32-AMD64 +test.test_subprocess.Win32ProcessTestCase.test_send_signal @ win32-AMD64 +test.test_subprocess.Win32ProcessTestCase.test_send_signal_dead @ win32-AMD64 +test.test_subprocess.Win32ProcessTestCase.test_terminate @ win32-AMD64 +test.test_subprocess.Win32ProcessTestCase.test_terminate_dead @ win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sundry.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sundry.txt index 073b456e5e..e138b988be 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sundry.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sundry.txt @@ -1 +1 @@ -*graalpython.lib-python.3.test.test_sundry.TestUntestedModules.test_untested_modules_can_be_imported +test.test_sundry.TestUntestedModules.test_untested_modules_can_be_imported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_super.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_super.txt index 30ac177d3b..12a638b551 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_super.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_super.txt @@ -1,18 +1,18 @@ -*graalpython.lib-python.3.test.test_super.TestSuper.test___class___classmethod -*graalpython.lib-python.3.test.test_super.TestSuper.test___class___delayed -*graalpython.lib-python.3.test.test_super.TestSuper.test___class___instancemethod -*graalpython.lib-python.3.test.test_super.TestSuper.test___class___new -*graalpython.lib-python.3.test.test_super.TestSuper.test___class___staticmethod -*graalpython.lib-python.3.test.test_super.TestSuper.test___classcell___expected_behaviour -*graalpython.lib-python.3.test.test_super.TestSuper.test___classcell___overwrite -*graalpython.lib-python.3.test.test_super.TestSuper.test_basics_working -*graalpython.lib-python.3.test.test_super.TestSuper.test_cell_as_self -*graalpython.lib-python.3.test.test_super.TestSuper.test_class_getattr_working -*graalpython.lib-python.3.test.test_super.TestSuper.test_class_methods_still_working -*graalpython.lib-python.3.test.test_super.TestSuper.test_obscure_super_errors -*graalpython.lib-python.3.test.test_super.TestSuper.test_subclass_no_override_working -*graalpython.lib-python.3.test.test_super.TestSuper.test_super_in_class_methods_working -*graalpython.lib-python.3.test.test_super.TestSuper.test_super_init_leaks -*graalpython.lib-python.3.test.test_super.TestSuper.test_super_with_closure -*graalpython.lib-python.3.test.test_super.TestSuper.test_unbound_method_transfer_working -*graalpython.lib-python.3.test.test_super.TestSuper.test_various___class___pathologies +test.test_super.TestSuper.test___class___classmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_super.TestSuper.test___class___delayed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_super.TestSuper.test___class___instancemethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_super.TestSuper.test___class___new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_super.TestSuper.test___class___staticmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_super.TestSuper.test___classcell___expected_behaviour @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_super.TestSuper.test___classcell___overwrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_super.TestSuper.test_basics_working @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_super.TestSuper.test_cell_as_self @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_super.TestSuper.test_class_getattr_working @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_super.TestSuper.test_class_methods_still_working @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_super.TestSuper.test_obscure_super_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_super.TestSuper.test_subclass_no_override_working @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_super.TestSuper.test_super_in_class_methods_working @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_super.TestSuper.test_super_init_leaks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_super.TestSuper.test_super_with_closure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_super.TestSuper.test_unbound_method_transfer_working @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_super.TestSuper.test_various___class___pathologies @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_support.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_support.txt index 79dfe9d902..daee8c6992 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_support.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_support.txt @@ -1,45 +1,41 @@ -*graalpython.lib-python.3.test.test_support.TestSupport.test_CleanImport -*graalpython.lib-python.3.test.test_support.TestSupport.test_DirsOnSysPath -*graalpython.lib-python.3.test.test_support.TestSupport.test_HOST -*graalpython.lib-python.3.test.test_support.TestSupport.test_bind_port -*graalpython.lib-python.3.test.test_support.TestSupport.test_captured_stderr -*graalpython.lib-python.3.test.test_support.TestSupport.test_captured_stdin -*graalpython.lib-python.3.test.test_support.TestSupport.test_captured_stdout -*graalpython.lib-python.3.test.test_support.TestSupport.test_change_cwd -*graalpython.lib-python.3.test.test_support.TestSupport.test_change_cwd__chdir_warning -*graalpython.lib-python.3.test.test_support.TestSupport.test_change_cwd__non_existent_dir -*graalpython.lib-python.3.test.test_support.TestSupport.test_change_cwd__non_existent_dir__quiet_true -*graalpython.lib-python.3.test.test_support.TestSupport.test_check_syntax_error -*graalpython.lib-python.3.test.test_support.TestSupport.test_copy_python_src_ignore -*graalpython.lib-python.3.test.test_support.TestSupport.test_detect_api_mismatch -*graalpython.lib-python.3.test.test_support.TestSupport.test_detect_api_mismatch__ignore -*graalpython.lib-python.3.test.test_support.TestSupport.test_fd_count -*graalpython.lib-python.3.test.test_support.TestSupport.test_find_unused_port -*graalpython.lib-python.3.test.test_support.TestSupport.test_forget -*graalpython.lib-python.3.test.test_support.TestSupport.test_gc_collect -*graalpython.lib-python.3.test.test_support.TestSupport.test_get_attribute -*graalpython.lib-python.3.test.test_support.TestSupport.test_get_original_stdout -*graalpython.lib-python.3.test.test_support.TestSupport.test_get_recursion_depth -*graalpython.lib-python.3.test.test_support.TestSupport.test_has_strftime_extensions -*graalpython.lib-python.3.test.test_support.TestSupport.test_import_fresh_module -*graalpython.lib-python.3.test.test_support.TestSupport.test_import_module -*graalpython.lib-python.3.test.test_support.TestSupport.test_make_bad_fd -*graalpython.lib-python.3.test.test_support.TestSupport.test_match_test -*graalpython.lib-python.3.test.test_support.TestSupport.test_parse_memlimit -*graalpython.lib-python.3.test.test_support.TestSupport.test_print_warning -*graalpython.lib-python.3.test.test_support.TestSupport.test_python_is_optimized -*graalpython.lib-python.3.test.test_support.TestSupport.test_reap_children -*graalpython.lib-python.3.test.test_support.TestSupport.test_rmtree -*graalpython.lib-python.3.test.test_support.TestSupport.test_set_memlimit -*graalpython.lib-python.3.test.test_support.TestSupport.test_sortdict -*graalpython.lib-python.3.test.test_support.TestSupport.test_swap_attr -*graalpython.lib-python.3.test.test_support.TestSupport.test_swap_item -*graalpython.lib-python.3.test.test_support.TestSupport.test_temp_cwd -*graalpython.lib-python.3.test.test_support.TestSupport.test_temp_cwd__name_none -*graalpython.lib-python.3.test.test_support.TestSupport.test_temp_dir -*graalpython.lib-python.3.test.test_support.TestSupport.test_temp_dir__existing_dir__quiet_default -*graalpython.lib-python.3.test.test_support.TestSupport.test_temp_dir__existing_dir__quiet_true -*graalpython.lib-python.3.test.test_support.TestSupport.test_temp_dir__forked_child -*graalpython.lib-python.3.test.test_support.TestSupport.test_temp_dir__path_none -*graalpython.lib-python.3.test.test_support.TestSupport.test_unlink -*graalpython.lib-python.3.test.test_support.TestSupport.test_unload +test.test_support.TestSupport.test_CleanImport @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_DirsOnSysPath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_HOST @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_bind_port @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_support.TestSupport.test_captured_stderr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_captured_stdin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_captured_stdout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_change_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_change_cwd__chdir_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_change_cwd__non_existent_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_change_cwd__non_existent_dir__quiet_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_check__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_check_syntax_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_detect_api_mismatch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_detect_api_mismatch__ignore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_fd_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_support.TestSupport.test_find_unused_port @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_support.TestSupport.test_forget @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_gc_collect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_get_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_has_strftime_extensions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_ignored_deprecations_are_silent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_import_fresh_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_import_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_make_bad_fd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_parse_memlimit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_print_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_python_is_optimized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_rmtree @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_set_memlimit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_sortdict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_swap_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_swap_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_temp_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_temp_cwd__name_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_temp_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_temp_dir__existing_dir__quiet_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_temp_dir__existing_dir__quiet_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_temp_dir__path_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_unlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_support.TestSupport.test_unload @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_syntax.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_syntax.txt index c89fa014fb..15a07d0fef 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_syntax.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_syntax.txt @@ -1,30 +1,27 @@ -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_assign_call -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_assign_del -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_bad_outdent -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_barry_as_flufl_with_syntax_errors -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_break_outside_loop -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_case_call_does_not_raise_syntax_error -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_continuation_bad_indentation -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_continue_outside_loop -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_curly_brace_after_primary_raises_immediately -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_deep_invalid_rule -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_empty_line_after_linecont -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_error_on_parser_stack_overflow -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_error_string_literal -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_except_star_then_except -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_except_then_except_star -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_expression_with_assignment -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_generator_in_function_call -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_global_param_err_first -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_invalid_line_continuation_left_recursive -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_kwargs_last -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_kwargs_last2 -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_kwargs_last3 -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_match_call_does_not_raise_syntax_error -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_nested_named_except_blocks -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_no_indent -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_nonlocal_param_err_first -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_return_outside_function -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_syntax_error_on_deeply_nested_blocks -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_unexpected_indent -*graalpython.lib-python.3.test.test_syntax.SyntaxTestCase.test_yield_outside_function +DocTestCase.test.test_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_assign_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_assign_del @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_bad_outdent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_barry_as_flufl_with_syntax_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_break_outside_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_case_call_does_not_raise_syntax_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_continuation_bad_indentation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_continue_outside_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_curly_brace_after_primary_raises_immediately @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_empty_line_after_linecont @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_error_string_literal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_except_star_then_except @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_except_then_except_star @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_expression_with_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_generator_in_function_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_global_param_err_first @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_invalid_line_continuation_left_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_kwargs_last @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_kwargs_last2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_kwargs_last3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_match_call_does_not_raise_syntax_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_no_indent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_nonlocal_param_err_first @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_return_outside_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_unexpected_indent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_syntax.SyntaxTestCase.test_yield_outside_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sys.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sys.txt index 6ac231819c..7d83d4902d 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sys.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sys.txt @@ -1,68 +1,41 @@ -*graalpython.lib-python.3.test.test_sys.ActiveExceptionTests.test_exc_info_no_exception -*graalpython.lib-python.3.test.test_sys.ActiveExceptionTests.test_exc_info_with_exception_instance -*graalpython.lib-python.3.test.test_sys.ActiveExceptionTests.test_exc_info_with_exception_type -*graalpython.lib-python.3.test.test_sys.DisplayHookTest.test_custom_displayhook -*graalpython.lib-python.3.test.test_sys.DisplayHookTest.test_lost_displayhook -*graalpython.lib-python.3.test.test_sys.DisplayHookTest.test_original_displayhook -*graalpython.lib-python.3.test.test_sys.ExceptHookTest.test_excepthook -*graalpython.lib-python.3.test.test_sys.ExceptHookTest.test_excepthook_bytes_filename -*graalpython.lib-python.3.test.test_sys.ExceptHookTest.test_original_excepthook -*graalpython.lib-python.3.test.test_sys.SizeofTest.test_asyncgen_hooks -*graalpython.lib-python.3.test.test_sys.SizeofTest.test_changing_sys_stderr_and_removing_reference -*graalpython.lib-python.3.test.test_sys.SizeofTest.test_default -*graalpython.lib-python.3.test.test_sys.SizeofTest.test_errors -*graalpython.lib-python.3.test.test_sys.SizeofTest.test_gc_head_size -*graalpython.lib-python.3.test.test_sys.SizeofTest.test_objecttypes -*graalpython.lib-python.3.test.test_sys.SizeofTest.test_pythontypes -*graalpython.lib-python.3.test.test_sys.SizeofTest.test_slots -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_43581 -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test__enablelegacywindowsfsencoding -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_attributes -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_c_locale_surrogateescape -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_clear_type_cache -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_current_frames -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_debugmallocstats -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_dlopenflags -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_emscripten_info -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_executable -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_exit -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_getallocatedblocks -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_getandroidapilevel -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_getdefaultencoding -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_getfilesystemencoding -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_getframe -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_getrecursionlimit -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_getwindowsversion -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_implementation -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_intern -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_ioencoding -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_ioencoding_nonascii -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_is_finalizing -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_issue20602 -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_module_names -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_no_duplicates_in_meta_path -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_orig_argv -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_posix_locale_surrogateescape -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_recursionlimit -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_recursionlimit_fatalerror -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_recursionlimit_recovery -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_refcount -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_setcheckinterval -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_setrecursionlimit -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_setrecursionlimit_recursion_depth -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_setrecursionlimit_to_depth -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_stdlib_dir -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_switchinterval -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_sys_flags -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_sys_flags_no_instantiation -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_sys_getwindowsversion_no_instantiation -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_sys_ignores_cleaning_up_user_data -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_sys_tracebacklimit -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_sys_version_info_no_instantiation -*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_thread_info -*graalpython.lib-python.3.test.test_sys.UnraisableHookTest.test_custom_unraisablehook -*graalpython.lib-python.3.test.test_sys.UnraisableHookTest.test_custom_unraisablehook_fail -*graalpython.lib-python.3.test.test_sys.UnraisableHookTest.test_original_unraisablehook -*graalpython.lib-python.3.test.test_sys.UnraisableHookTest.test_original_unraisablehook_err -*graalpython.lib-python.3.test.test_sys.UnraisableHookTest.test_original_unraisablehook_exception_qualname -*graalpython.lib-python.3.test.test_sys.UnraisableHookTest.test_original_unraisablehook_wrong_type +test.test_sys.ActiveExceptionTests.test_exc_info_no_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.ActiveExceptionTests.test_exc_info_with_exception_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.ActiveExceptionTests.test_exc_info_with_exception_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.ActiveExceptionTests.test_sys_exception_no_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.ActiveExceptionTests.test_sys_exception_with_exception_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.ActiveExceptionTests.test_sys_exception_with_exception_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.DisplayHookTest.test_custom_displayhook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.DisplayHookTest.test_lost_displayhook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.DisplayHookTest.test_original_displayhook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.ExceptHookTest.test_excepthook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.ExceptHookTest.test_excepthook_bytes_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.ExceptHookTest.test_original_excepthook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_43581 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_c_locale_surrogateescape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_dlopenflags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_executable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_exit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_getdefaultencoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_getfilesystemencoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_getframe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_getrecursionlimit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_getwindowsversion @ win32-AMD64 +test.test_sys.SysModuleTest.test_implementation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_intern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_ioencoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sys.SysModuleTest.test_module_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_no_duplicates_in_meta_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_orig_argv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_posix_locale_surrogateescape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_recursionlimit_recovery @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_setrecursionlimit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_stdlib_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_switchinterval @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_sys_flags @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_sys_flags_no_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_sys_getwindowsversion_no_instantiation @ win32-AMD64 +test.test_sys.SysModuleTest.test_sys_ignores_cleaning_up_user_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_sys_tracebacklimit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_sys_version_info_no_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys.SysModuleTest.test_thread_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sys_setprofile.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sys_setprofile.txt index 6ddb45bcf1..b464ab07a5 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sys_setprofile.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sys_setprofile.txt @@ -1,16 +1,23 @@ -*graalpython.lib-python.3.test.test_sys_setprofile.ProfileHookTestCase.test_caught_exception -*graalpython.lib-python.3.test.test_sys_setprofile.ProfileHookTestCase.test_caught_nested_exception -*graalpython.lib-python.3.test.test_sys_setprofile.ProfileHookTestCase.test_distant_exception -*graalpython.lib-python.3.test.test_sys_setprofile.ProfileHookTestCase.test_exception -*graalpython.lib-python.3.test.test_sys_setprofile.ProfileHookTestCase.test_exception_in_except_clause -*graalpython.lib-python.3.test.test_sys_setprofile.ProfileHookTestCase.test_exception_propagation -*graalpython.lib-python.3.test.test_sys_setprofile.ProfileHookTestCase.test_nested_exception -*graalpython.lib-python.3.test.test_sys_setprofile.ProfileHookTestCase.test_raise -*graalpython.lib-python.3.test.test_sys_setprofile.ProfileHookTestCase.test_raise_reraise -*graalpython.lib-python.3.test.test_sys_setprofile.ProfileHookTestCase.test_raise_twice -*graalpython.lib-python.3.test.test_sys_setprofile.ProfileHookTestCase.test_simple -*graalpython.lib-python.3.test.test_sys_setprofile.ProfileSimulatorTestCase.test_basic_exception -*graalpython.lib-python.3.test.test_sys_setprofile.ProfileSimulatorTestCase.test_caught_exception -*graalpython.lib-python.3.test.test_sys_setprofile.ProfileSimulatorTestCase.test_distant_exception -*graalpython.lib-python.3.test.test_sys_setprofile.ProfileSimulatorTestCase.test_simple -*graalpython.lib-python.3.test.test_sys_setprofile.ProfileSimulatorTestCase.test_unbound_method +test.test_sys_setprofile.ProfileHookTestCase.test_caught_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileHookTestCase.test_caught_nested_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileHookTestCase.test_distant_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileHookTestCase.test_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileHookTestCase.test_exception_in_except_clause @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileHookTestCase.test_exception_propagation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileHookTestCase.test_nested_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileHookTestCase.test_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileHookTestCase.test_raise_reraise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileHookTestCase.test_raise_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileHookTestCase.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileSimulatorTestCase.test_basic_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileSimulatorTestCase.test_caught_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileSimulatorTestCase.test_distant_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileSimulatorTestCase.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileSimulatorTestCase.test_unbound_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileSimulatorTestCase.test_unbound_method_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileSimulatorTestCase.test_unbound_method_invalid_keyword_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileSimulatorTestCase.test_unbound_method_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.ProfileSimulatorTestCase.test_unbound_method_no_keyword_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.TestEdgeCases.test_same_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.TestGetProfile.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_setprofile.TestGetProfile.test_setget @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sys_settrace.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sys_settrace.txt index 6046f3d030..2bc11635fc 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sys_settrace.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sys_settrace.txt @@ -1,230 +1,162 @@ -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_across_async_with -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_across_with -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_backward_over_async_listcomp -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_backward_over_async_listcomp_v2 -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_backward_over_listcomp -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_backward_over_listcomp_v2 -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_backwards_into_try_except_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_backwards_into_try_finally_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_backwards_into_while_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_backwards_out_of_async_with_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_backwards_out_of_try_except_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_backwards_out_of_try_finally_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_backwards_out_of_with_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_between_async_with_blocks -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_between_except_blocks -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_between_except_blocks_2 -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_between_with_blocks -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_extended_args_for_iter -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_extended_args_unpack_ex_simple -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_extended_args_unpack_ex_tricky -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_forward_over_async_listcomp -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_forward_over_listcomp -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_forwards_into_try_except_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_forwards_into_try_finally_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_forwards_into_while_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_forwards_out_of_async_with_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_forwards_out_of_try_except_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_forwards_out_of_try_finally_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_forwards_out_of_with_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_is_none_backwards -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_is_none_forwards -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_is_not_none_backwards -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_is_not_none_forwards -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_or_pop -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_out_of_async_for_block_backwards -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_out_of_async_for_block_forwards -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_out_of_async_with_assignment -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_out_of_async_with_block_within_for_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_out_of_async_with_block_within_with_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_out_of_bare_except_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_out_of_block_backwards -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_out_of_block_forwards -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_out_of_complex_nested_blocks -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_out_of_qualified_except_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_out_of_with_assignment -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_out_of_with_block_within_for_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_out_of_with_block_within_with_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_over_async_for_block_before_else -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_over_break_in_try_finally_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_over_for_block_before_else -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_over_return_in_try_finally_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_over_try_except -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_simple_backwards -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_simple_forwards -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_to_codeless_line -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_to_firstlineno -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_to_same_line -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_with_null_on_stack_load_global -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_with_null_on_stack_push_null -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_jump_within_except_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_large_function -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_no_jump_backwards_into_for_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_no_jump_forwards_into_async_for_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_no_jump_forwards_into_for_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_no_jump_into_async_for_block_before_else -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_no_jump_into_for_block_before_else -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_no_jump_over_return_out_of_finally_block -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_no_jump_too_far_backwards -*graalpython.lib-python.3.test.test_sys_settrace.JumpTestCase.test_no_jump_too_far_forwards -*graalpython.lib-python.3.test.test_sys_settrace.RaisingTraceFuncTestCase.test_call -*graalpython.lib-python.3.test.test_sys_settrace.RaisingTraceFuncTestCase.test_exception -*graalpython.lib-python.3.test.test_sys_settrace.RaisingTraceFuncTestCase.test_exception_arguments -*graalpython.lib-python.3.test.test_sys_settrace.RaisingTraceFuncTestCase.test_line -*graalpython.lib-python.3.test.test_sys_settrace.RaisingTraceFuncTestCase.test_return -*graalpython.lib-python.3.test.test_sys_settrace.RaisingTraceFuncTestCase.test_trash_stack -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_01_basic -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_02_arigo0 -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_02_arigo1 -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_02_arigo2 -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_03_one_instr -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_04_no_pop_blocks -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_05_no_pop_tops -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_06_call -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_07_raise -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_08_settrace_and_return -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_09_settrace_and_raise -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_10_ireturn -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_11_tightloop -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_12_tighterloop -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_14_onliner_if -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_15_loops -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_16_blank_lines -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_17_none_f_trace -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_21_repeated_pass -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_break_through_finally -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_break_to_break -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_break_to_continue1 -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_break_to_continue2 -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_class_creation_with_docstrings -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_continue_through_finally -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_early_exit_with -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_flow_converges_on_same_line -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_if_break -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_if_false_in_try_except -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_if_false_in_with -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_if_in_if_in_if -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_implicit_return_in_class -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_loop_in_try_except -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_nested_ifs -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_nested_ifs_with_and -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_nested_loops -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_nested_try_if -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_no_line_event_after_creating_generator -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_no_tracing_of_named_except_cleanup -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_notrace_lambda -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_return_through_finally -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_set_and_retrieve_func -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_set_and_retrieve_none -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_testcapi_settrace_error -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_try_except_with_wrong_type -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_try_in_try -*graalpython.lib-python.3.test.test_sys_settrace.SkipLineEventsTraceTestCase.test_very_large_function -*graalpython.lib-python.3.test.test_sys_settrace.TestEdgeCases.test_same_object -*graalpython.lib-python.3.test.test_sys_settrace.TestExtendedArgs.test_trace_lots_of_globals -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_01_basic -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_02_arigo0 -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_02_arigo1 -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_02_arigo2 -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_03_one_instr -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_04_no_pop_blocks -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_05_no_pop_tops -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_06_call -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_07_raise -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_08_settrace_and_return -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_09_settrace_and_raise -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_10_ireturn -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_11_tightloop -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_12_tighterloop -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_13_genexp -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_14_onliner_if -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_15_loops -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_16_blank_lines -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_17_none_f_trace -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_18_except_with_name -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_19_except_with_finally -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_20_async_for_loop -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_21_repeated_pass -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_async_for_backwards_jump_has_no_line -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_break_through_finally -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_break_to_break -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_break_to_continue1 -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_break_to_continue2 -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_class_creation_with_docstrings -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_continue_through_finally -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_early_exit_with -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_flow_converges_on_same_line -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_if_break -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_if_false_in_try_except -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_if_false_in_with -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_if_in_if_in_if -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_implicit_return_in_class -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_loop_in_try_except -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_nested_ifs -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_nested_ifs_with_and -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_nested_loops -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_nested_try_if -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_no_line_event_after_creating_generator -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_no_tracing_of_named_except_cleanup -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_notrace_lambda -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_return_through_finally -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_set_and_retrieve_func -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_set_and_retrieve_none -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_settrace_error -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_testcapi_settrace_error -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_tracing_exception_raised_in_with -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_try_except_no_exception -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_try_except_star_exception_caught -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_try_except_star_exception_not_caught -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_try_except_star_named_exception_caught -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_try_except_star_named_exception_not_caught -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_try_except_star_named_no_exception -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_try_except_star_nested -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_try_except_star_no_exception -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_try_except_with_wrong_type -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_try_exception_in_else -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_try_in_try -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_try_in_try_with_exception -*graalpython.lib-python.3.test.test_sys_settrace.TraceOpcodesTestCase.test_very_large_function -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_01_basic -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_02_arigo0 -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_02_arigo1 -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_02_arigo2 -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_03_one_instr -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_04_no_pop_blocks -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_05_no_pop_tops -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_06_call -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_07_raise -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_08_settrace_and_return -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_09_settrace_and_raise -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_10_ireturn -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_11_tightloop -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_12_tighterloop -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_14_onliner_if -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_15_loops -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_16_blank_lines -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_17_none_f_trace -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_21_repeated_pass -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_break_to_break -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_break_to_continue1 -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_break_to_continue2 -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_flow_converges_on_same_line -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_if_break -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_if_false_in_try_except -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_if_false_in_with -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_if_in_if_in_if -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_implicit_return_in_class -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_loop_in_try_except -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_nested_ifs -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_nested_ifs_with_and -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_nested_loops -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_nested_try_if -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_no_line_event_after_creating_generator -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_no_tracing_of_named_except_cleanup -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_return_through_finally -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_set_and_retrieve_func -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_set_and_retrieve_none -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_testcapi_settrace_error -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_try_except_with_wrong_type -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_try_in_try -*graalpython.lib-python.3.test.test_sys_settrace.TraceTestCase.test_very_large_function +test.test_sys_settrace.JumpTestCase.test_jump_across_async_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sys_settrace.JumpTestCase.test_jump_across_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_backward_over_async_listcomp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sys_settrace.JumpTestCase.test_jump_backward_over_async_listcomp_v2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sys_settrace.JumpTestCase.test_jump_backward_over_listcomp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_backward_over_listcomp_v2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_backwards_into_try_except_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_backwards_into_try_finally_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_backwards_into_while_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_backwards_out_of_async_with_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sys_settrace.JumpTestCase.test_jump_backwards_out_of_try_except_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_backwards_out_of_try_finally_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_backwards_out_of_with_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_between_async_with_blocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sys_settrace.JumpTestCase.test_jump_between_except_blocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_between_except_blocks_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_between_with_blocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_extended_args_for_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_extended_args_unpack_ex_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_extended_args_unpack_ex_tricky @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_forward_over_async_listcomp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sys_settrace.JumpTestCase.test_jump_forward_over_listcomp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_forwards_into_try_except_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_forwards_into_try_finally_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_forwards_into_while_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_forwards_out_of_async_with_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sys_settrace.JumpTestCase.test_jump_forwards_out_of_try_except_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_forwards_out_of_try_finally_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_forwards_out_of_with_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_is_none_backwards @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_is_none_forwards @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_is_not_none_backwards @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_is_not_none_forwards @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_or_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_out_of_async_for_block_backwards @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sys_settrace.JumpTestCase.test_jump_out_of_async_for_block_forwards @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sys_settrace.JumpTestCase.test_jump_out_of_async_with_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sys_settrace.JumpTestCase.test_jump_out_of_async_with_block_within_for_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sys_settrace.JumpTestCase.test_jump_out_of_async_with_block_within_with_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sys_settrace.JumpTestCase.test_jump_out_of_bare_except_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_out_of_block_backwards @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_out_of_block_forwards @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_out_of_complex_nested_blocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_out_of_qualified_except_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_out_of_with_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_out_of_with_block_within_for_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_out_of_with_block_within_with_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_over_async_for_block_before_else @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sys_settrace.JumpTestCase.test_jump_over_break_in_try_finally_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_over_for_block_before_else @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_over_return_in_try_finally_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_over_try_except @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_simple_backwards @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_simple_forwards @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_to_codeless_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_to_firstlineno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_to_same_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_with_null_on_stack_load_global @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_with_null_on_stack_push_null @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_jump_within_except_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_large_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_no_jump_backwards_into_for_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_no_jump_forwards_into_async_for_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sys_settrace.JumpTestCase.test_no_jump_forwards_into_for_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_no_jump_into_async_for_block_before_else @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sys_settrace.JumpTestCase.test_no_jump_into_for_block_before_else @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_no_jump_over_return_out_of_finally_block @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_no_jump_too_far_backwards @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.JumpTestCase.test_no_jump_too_far_forwards @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.RaisingTraceFuncTestCase.test_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.RaisingTraceFuncTestCase.test_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.RaisingTraceFuncTestCase.test_exception_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.RaisingTraceFuncTestCase.test_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.RaisingTraceFuncTestCase.test_return @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.RaisingTraceFuncTestCase.test_trash_stack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_01_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_02_arigo0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_02_arigo1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_02_arigo2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_03_one_instr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_04_no_pop_blocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_05_no_pop_tops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_06_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_07_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_08_settrace_and_return @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_09_settrace_and_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_10_ireturn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_11_tightloop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_12_tighterloop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_14_onliner_if @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_15_loops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_16_blank_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_17_none_f_trace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_21_repeated_pass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_break_through_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_break_to_break @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_break_to_continue1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_break_to_continue2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_class_creation_with_docstrings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_continue_through_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_early_exit_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_flow_converges_on_same_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_if_break @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_if_false_in_try_except @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_if_false_in_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_if_in_if_in_if @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_implicit_return_in_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_loop_in_try_except @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_nested_ifs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_nested_ifs_with_and @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_nested_loops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_nested_try_if @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_no_tracing_of_named_except_cleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_notrace_lambda @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_return_through_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_set_and_retrieve_func @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_set_and_retrieve_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_try_except_with_wrong_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_try_in_try @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.SkipLineEventsTraceTestCase.test_very_large_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TestEdgeCases.test_same_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TestExtendedArgs.test_trace_lots_of_globals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_01_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_02_arigo0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_02_arigo1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_02_arigo2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_03_one_instr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_04_no_pop_blocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_05_no_pop_tops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_06_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_07_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_08_settrace_and_return @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_09_settrace_and_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_10_ireturn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_11_tightloop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_12_tighterloop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_14_onliner_if @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_15_loops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_16_blank_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_17_none_f_trace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_21_repeated_pass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_break_to_break @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_break_to_continue1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_break_to_continue2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_flow_converges_on_same_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_if_break @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_if_false_in_try_except @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_if_false_in_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_if_in_if_in_if @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_implicit_return_in_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_loop_in_try_except @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_nested_ifs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_nested_ifs_with_and @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_nested_loops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_nested_try_if @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_no_tracing_of_named_except_cleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_return_through_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_set_and_retrieve_func @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_set_and_retrieve_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_try_except_with_wrong_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_try_in_try @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sys_settrace.TraceTestCase.test_very_large_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sysconfig.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sysconfig.txt index afa588583e..a8ad05a3c5 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sysconfig.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_sysconfig.txt @@ -1,27 +1,20 @@ -*graalpython.lib-python.3.test.test_sysconfig.MakefileTests.test_get_makefile_filename -*graalpython.lib-python.3.test.test_sysconfig.MakefileTests.test_parse_makefile -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_EXT_SUFFIX_in_vars -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_SO_deprecation -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_SO_in_vars -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_SO_value -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_get_config_h_filename -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_get_config_vars -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_get_default_scheme -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_get_path -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_get_path_names -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_get_paths -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_get_platform -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_get_preferred_schemes -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_get_scheme_names -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_ldshared_value -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_main -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_nt_venv_scheme -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_osx_ext_suffix -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_platform_in_subprocess -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_posix_venv_scheme -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_srcdir -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_srcdir_independent_of_cwd -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_symlink -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_triplet_in_ext_suffix -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_user_similar -*graalpython.lib-python.3.test.test_sysconfig.TestSysConfig.test_venv_scheme +test.test_sysconfig.MakefileTests.test_parse_makefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sysconfig.TestSysConfig.test_EXT_SUFFIX_in_vars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sysconfig.TestSysConfig.test_get_config_h_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sysconfig.TestSysConfig.test_get_config_vars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sysconfig.TestSysConfig.test_get_default_scheme @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sysconfig.TestSysConfig.test_get_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sysconfig.TestSysConfig.test_get_path_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sysconfig.TestSysConfig.test_get_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sysconfig.TestSysConfig.test_get_platform @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sysconfig.TestSysConfig.test_get_preferred_schemes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sysconfig.TestSysConfig.test_get_scheme_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sysconfig.TestSysConfig.test_ldshared_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sysconfig.TestSysConfig.test_main @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sysconfig.TestSysConfig.test_nt_venv_scheme @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sysconfig.TestSysConfig.test_platform_in_subprocess @ darwin-arm64,darwin-x86_64 +test.test_sysconfig.TestSysConfig.test_posix_venv_scheme @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sysconfig.TestSysConfig.test_srcdir_independent_of_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sysconfig.TestSysConfig.test_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_sysconfig.TestSysConfig.test_user_similar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_sysconfig.TestSysConfig.test_venv_scheme @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tabnanny.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tabnanny.txt index 8888f1b5a3..3cd6f69b57 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tabnanny.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tabnanny.txt @@ -1,19 +1,19 @@ -*graalpython.lib-python.3.test.test_tabnanny.TestCheck.test_correct_directory -*graalpython.lib-python.3.test.test_tabnanny.TestCheck.test_correct_directory_verbose -*graalpython.lib-python.3.test.test_tabnanny.TestCheck.test_correct_file -*graalpython.lib-python.3.test.test_tabnanny.TestCheck.test_errored_directory -*graalpython.lib-python.3.test.test_tabnanny.TestCheck.test_when_nannynag_error -*graalpython.lib-python.3.test.test_tabnanny.TestCheck.test_when_nannynag_error_verbose -*graalpython.lib-python.3.test.test_tabnanny.TestCheck.test_when_no_file -*graalpython.lib-python.3.test.test_tabnanny.TestCheck.test_when_tokenize_tokenerror -*graalpython.lib-python.3.test.test_tabnanny.TestCheck.test_when_wrong_indented -*graalpython.lib-python.3.test.test_tabnanny.TestCommandLine.test_double_verbose_mode -*graalpython.lib-python.3.test.test_tabnanny.TestCommandLine.test_quiet_flag -*graalpython.lib-python.3.test.test_tabnanny.TestCommandLine.test_verbose_mode -*graalpython.lib-python.3.test.test_tabnanny.TestCommandLine.test_with_error_free_file -*graalpython.lib-python.3.test.test_tabnanny.TestCommandLine.test_with_errored_file -*graalpython.lib-python.3.test.test_tabnanny.TestErrPrint.test_errprint -*graalpython.lib-python.3.test.test_tabnanny.TestFormatWitnesses.test_format_witnesses -*graalpython.lib-python.3.test.test_tabnanny.TestNannyNag.test_all_methods -*graalpython.lib-python.3.test.test_tabnanny.TestProcessTokens.test_with_correct_code -*graalpython.lib-python.3.test.test_tabnanny.TestProcessTokens.test_with_errored_codes_samples +test.test_tabnanny.TestCheck.test_correct_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tabnanny.TestCheck.test_correct_directory_verbose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tabnanny.TestCheck.test_correct_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tabnanny.TestCheck.test_errored_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tabnanny.TestCheck.test_when_nannynag_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tabnanny.TestCheck.test_when_nannynag_error_verbose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tabnanny.TestCheck.test_when_no_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tabnanny.TestCheck.test_when_tokenize_tokenerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tabnanny.TestCheck.test_when_wrong_indented @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tabnanny.TestCommandLine.test_double_verbose_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tabnanny.TestCommandLine.test_quiet_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tabnanny.TestCommandLine.test_verbose_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tabnanny.TestCommandLine.test_with_error_free_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tabnanny.TestCommandLine.test_with_errored_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tabnanny.TestErrPrint.test_errprint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tabnanny.TestFormatWitnesses.test_format_witnesses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tabnanny.TestNannyNag.test_all_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tabnanny.TestProcessTokens.test_with_correct_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tabnanny.TestProcessTokens.test_with_errored_codes_samples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tarfile.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tarfile.txt index 59da478a6c..ccb59a6b7f 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tarfile.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tarfile.txt @@ -1,560 +1,556 @@ -*graalpython.lib-python.3.test.test_tarfile.AppendTest.test_empty -*graalpython.lib-python.3.test.test_tarfile.AppendTest.test_empty_fileobj -*graalpython.lib-python.3.test.test_tarfile.AppendTest.test_existing -*graalpython.lib-python.3.test.test_tarfile.AppendTest.test_fileobj -*graalpython.lib-python.3.test.test_tarfile.AppendTest.test_incomplete -*graalpython.lib-python.3.test.test_tarfile.AppendTest.test_invalid -*graalpython.lib-python.3.test.test_tarfile.AppendTest.test_non_existing -*graalpython.lib-python.3.test.test_tarfile.AppendTest.test_null -*graalpython.lib-python.3.test.test_tarfile.AppendTest.test_premature_eof -*graalpython.lib-python.3.test.test_tarfile.AppendTest.test_trailing_garbage -*graalpython.lib-python.3.test.test_tarfile.Bz2AppendTest.test_append_compressed -*graalpython.lib-python.3.test.test_tarfile.Bz2CreateTest.test_create -*graalpython.lib-python.3.test.test_tarfile.Bz2CreateTest.test_create_existing -*graalpython.lib-python.3.test.test_tarfile.Bz2CreateTest.test_create_existing_taropen -*graalpython.lib-python.3.test.test_tarfile.Bz2CreateTest.test_create_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.Bz2CreateTest.test_create_taropen -*graalpython.lib-python.3.test.test_tarfile.Bz2CreateTest.test_create_taropen_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.Bz2CreateTest.test_create_with_compresslevel -*graalpython.lib-python.3.test.test_tarfile.Bz2CreateTest.test_eof_marker -*graalpython.lib-python.3.test.test_tarfile.Bz2CreateTest.test_fileobj_no_close -*graalpython.lib-python.3.test.test_tarfile.Bz2DetectReadTest.test_detect_file -*graalpython.lib-python.3.test.test_tarfile.Bz2DetectReadTest.test_detect_fileobj -*graalpython.lib-python.3.test.test_tarfile.Bz2DetectReadTest.test_detect_stream_bz2 -*graalpython.lib-python.3.test.test_tarfile.Bz2ListTest.test_list -*graalpython.lib-python.3.test.test_tarfile.Bz2ListTest.test_list_members -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_bytes_name_attribute -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_check_members -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_empty_name_attribute -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_empty_tarfile -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_extract_directory -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_extract_hardlink -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_extract_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_extractall -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_extractall_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_fail_comp -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_fileobj_with_offset -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_find_members -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_ignore_zeros -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_illegal_mode_arg -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_init_close_fobj -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_int_name_attribute -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_is_tarfile_erroneous -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_is_tarfile_keeps_position -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_is_tarfile_valid -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_length_zero_header -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_next_on_empty_tarfile -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_no_name_argument -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_no_name_attribute -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_non_existent_tarfile -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_null_tarfile -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_parallel_iteration -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_premature_end_of_archive -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_v7_dirtype -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_xstar_type -*graalpython.lib-python.3.test.test_tarfile.Bz2MiscReadTest.test_zlib_error_does_not_leak -*graalpython.lib-python.3.test.test_tarfile.Bz2PartialReadTest.test_partial_input -*graalpython.lib-python.3.test.test_tarfile.Bz2PartialReadTest.test_partial_input_bz2 -*graalpython.lib-python.3.test.test_tarfile.Bz2StreamReadTest.test_compare_members -*graalpython.lib-python.3.test.test_tarfile.Bz2StreamReadTest.test_empty_tarfile -*graalpython.lib-python.3.test.test_tarfile.Bz2StreamReadTest.test_fileobj_regular_file -*graalpython.lib-python.3.test.test_tarfile.Bz2StreamReadTest.test_ignore_zeros -*graalpython.lib-python.3.test.test_tarfile.Bz2StreamReadTest.test_is_tarfile_erroneous -*graalpython.lib-python.3.test.test_tarfile.Bz2StreamReadTest.test_is_tarfile_keeps_position -*graalpython.lib-python.3.test.test_tarfile.Bz2StreamReadTest.test_is_tarfile_valid -*graalpython.lib-python.3.test.test_tarfile.Bz2StreamReadTest.test_length_zero_header -*graalpython.lib-python.3.test.test_tarfile.Bz2StreamReadTest.test_non_existent_tarfile -*graalpython.lib-python.3.test.test_tarfile.Bz2StreamReadTest.test_null_tarfile -*graalpython.lib-python.3.test.test_tarfile.Bz2StreamReadTest.test_premature_end_of_archive -*graalpython.lib-python.3.test.test_tarfile.Bz2StreamReadTest.test_provoke_stream_error -*graalpython.lib-python.3.test.test_tarfile.Bz2StreamReadTest.test_read_through -*graalpython.lib-python.3.test.test_tarfile.Bz2StreamWriteTest.test_eof_marker -*graalpython.lib-python.3.test.test_tarfile.Bz2StreamWriteTest.test_file_mode -*graalpython.lib-python.3.test.test_tarfile.Bz2StreamWriteTest.test_fileobj_no_close -*graalpython.lib-python.3.test.test_tarfile.Bz2StreamWriteTest.test_stream_padding -*graalpython.lib-python.3.test.test_tarfile.Bz2UstarReadTest.test_add_dir_getmember -*graalpython.lib-python.3.test.test_tarfile.Bz2UstarReadTest.test_fileobj_iter -*graalpython.lib-python.3.test.test_tarfile.Bz2UstarReadTest.test_fileobj_link1 -*graalpython.lib-python.3.test.test_tarfile.Bz2UstarReadTest.test_fileobj_link2 -*graalpython.lib-python.3.test.test_tarfile.Bz2UstarReadTest.test_fileobj_readlines -*graalpython.lib-python.3.test.test_tarfile.Bz2UstarReadTest.test_fileobj_regular_file -*graalpython.lib-python.3.test.test_tarfile.Bz2UstarReadTest.test_fileobj_seek -*graalpython.lib-python.3.test.test_tarfile.Bz2UstarReadTest.test_fileobj_symlink1 -*graalpython.lib-python.3.test.test_tarfile.Bz2UstarReadTest.test_fileobj_symlink2 -*graalpython.lib-python.3.test.test_tarfile.Bz2UstarReadTest.test_fileobj_text -*graalpython.lib-python.3.test.test_tarfile.Bz2UstarReadTest.test_issue14160 -*graalpython.lib-python.3.test.test_tarfile.Bz2WriteTest.test_100_char_name -*graalpython.lib-python.3.test.test_tarfile.Bz2WriteTest.test_abs_pathnames -*graalpython.lib-python.3.test.test_tarfile.Bz2WriteTest.test_add_self -*graalpython.lib-python.3.test.test_tarfile.Bz2WriteTest.test_cwd -*graalpython.lib-python.3.test.test_tarfile.Bz2WriteTest.test_directory_size -*graalpython.lib-python.3.test.test_tarfile.Bz2WriteTest.test_eof_marker -*graalpython.lib-python.3.test.test_tarfile.Bz2WriteTest.test_extractall_symlinks -*graalpython.lib-python.3.test.test_tarfile.Bz2WriteTest.test_file_size -*graalpython.lib-python.3.test.test_tarfile.Bz2WriteTest.test_fileobj_no_close -*graalpython.lib-python.3.test.test_tarfile.Bz2WriteTest.test_filter -*graalpython.lib-python.3.test.test_tarfile.Bz2WriteTest.test_gettarinfo_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.Bz2WriteTest.test_link_size -*graalpython.lib-python.3.test.test_tarfile.Bz2WriteTest.test_open_nonwritable_fileobj -*graalpython.lib-python.3.test.test_tarfile.Bz2WriteTest.test_ordered_recursion -*graalpython.lib-python.3.test.test_tarfile.Bz2WriteTest.test_pathnames -*graalpython.lib-python.3.test.test_tarfile.Bz2WriteTest.test_symlink_size -*graalpython.lib-python.3.test.test_tarfile.Bz2WriteTest.test_tar_size -*graalpython.lib-python.3.test.test_tarfile.CommandLineTest.test_bad_use -*graalpython.lib-python.3.test.test_tarfile.CommandLineTest.test_create_command -*graalpython.lib-python.3.test.test_tarfile.CommandLineTest.test_create_command_compressed -*graalpython.lib-python.3.test.test_tarfile.CommandLineTest.test_create_command_dot_started_filename -*graalpython.lib-python.3.test.test_tarfile.CommandLineTest.test_create_command_dotless_filename -*graalpython.lib-python.3.test.test_tarfile.CommandLineTest.test_create_command_verbose -*graalpython.lib-python.3.test.test_tarfile.CommandLineTest.test_extract_command -*graalpython.lib-python.3.test.test_tarfile.CommandLineTest.test_extract_command_different_directory -*graalpython.lib-python.3.test.test_tarfile.CommandLineTest.test_extract_command_filter -*graalpython.lib-python.3.test.test_tarfile.CommandLineTest.test_extract_command_invalid_file -*graalpython.lib-python.3.test.test_tarfile.CommandLineTest.test_extract_command_verbose -*graalpython.lib-python.3.test.test_tarfile.CommandLineTest.test_list_command -*graalpython.lib-python.3.test.test_tarfile.CommandLineTest.test_list_command_invalid_file -*graalpython.lib-python.3.test.test_tarfile.CommandLineTest.test_list_command_verbose -*graalpython.lib-python.3.test.test_tarfile.CommandLineTest.test_test_command -*graalpython.lib-python.3.test.test_tarfile.CommandLineTest.test_test_command_invalid_file -*graalpython.lib-python.3.test.test_tarfile.CommandLineTest.test_test_command_verbose -*graalpython.lib-python.3.test.test_tarfile.ContextManagerTest.test_basic -*graalpython.lib-python.3.test.test_tarfile.ContextManagerTest.test_closed -*graalpython.lib-python.3.test.test_tarfile.ContextManagerTest.test_eof -*graalpython.lib-python.3.test.test_tarfile.ContextManagerTest.test_exception -*graalpython.lib-python.3.test.test_tarfile.ContextManagerTest.test_fileobj -*graalpython.lib-python.3.test.test_tarfile.ContextManagerTest.test_no_eof -*graalpython.lib-python.3.test.test_tarfile.CreateTest.test_create -*graalpython.lib-python.3.test.test_tarfile.CreateTest.test_create_existing -*graalpython.lib-python.3.test.test_tarfile.CreateTest.test_create_existing_taropen -*graalpython.lib-python.3.test.test_tarfile.CreateTest.test_create_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.CreateTest.test_create_taropen -*graalpython.lib-python.3.test.test_tarfile.CreateTest.test_create_taropen_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.CreateTest.test_eof_marker -*graalpython.lib-python.3.test.test_tarfile.CreateTest.test_fileobj_no_close -*graalpython.lib-python.3.test.test_tarfile.CreateWithXModeTest.test_create -*graalpython.lib-python.3.test.test_tarfile.CreateWithXModeTest.test_create_existing -*graalpython.lib-python.3.test.test_tarfile.CreateWithXModeTest.test_create_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.CreateWithXModeTest.test_create_taropen_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.CreateWithXModeTest.test_eof_marker -*graalpython.lib-python.3.test.test_tarfile.CreateWithXModeTest.test_fileobj_no_close -*graalpython.lib-python.3.test.test_tarfile.DetectReadTest.test_detect_file -*graalpython.lib-python.3.test.test_tarfile.DetectReadTest.test_detect_fileobj -*graalpython.lib-python.3.test.test_tarfile.DeviceHeaderTest.test_eof_marker -*graalpython.lib-python.3.test.test_tarfile.DeviceHeaderTest.test_fileobj_no_close -*graalpython.lib-python.3.test.test_tarfile.DeviceHeaderTest.test_headers_written_only_for_device_files -*graalpython.lib-python.3.test.test_tarfile.GNUReadTest.test_header_offset -*graalpython.lib-python.3.test.test_tarfile.GNUReadTest.test_longname_directory -*graalpython.lib-python.3.test.test_tarfile.GNUReadTest.test_read_longlink -*graalpython.lib-python.3.test.test_tarfile.GNUReadTest.test_read_longname -*graalpython.lib-python.3.test.test_tarfile.GNUReadTest.test_truncated_longname -*graalpython.lib-python.3.test.test_tarfile.GNUUnicodeTest.test_bad_pax_header -*graalpython.lib-python.3.test.test_tarfile.GNUUnicodeTest.test_iso8859_1_filename -*graalpython.lib-python.3.test.test_tarfile.GNUUnicodeTest.test_uname_unicode -*graalpython.lib-python.3.test.test_tarfile.GNUUnicodeTest.test_unicode_argument -*graalpython.lib-python.3.test.test_tarfile.GNUUnicodeTest.test_unicode_filename_error -*graalpython.lib-python.3.test.test_tarfile.GNUUnicodeTest.test_utf7_filename -*graalpython.lib-python.3.test.test_tarfile.GNUUnicodeTest.test_utf8_filename -*graalpython.lib-python.3.test.test_tarfile.GNUWriteTest.test_longlink_1023 -*graalpython.lib-python.3.test.test_tarfile.GNUWriteTest.test_longlink_1024 -*graalpython.lib-python.3.test.test_tarfile.GNUWriteTest.test_longlink_1025 -*graalpython.lib-python.3.test.test_tarfile.GNUWriteTest.test_longname_1023 -*graalpython.lib-python.3.test.test_tarfile.GNUWriteTest.test_longname_1024 -*graalpython.lib-python.3.test.test_tarfile.GNUWriteTest.test_longname_1025 -*graalpython.lib-python.3.test.test_tarfile.GNUWriteTest.test_longnamelink_1023 -*graalpython.lib-python.3.test.test_tarfile.GNUWriteTest.test_longnamelink_1024 -*graalpython.lib-python.3.test.test_tarfile.GNUWriteTest.test_longnamelink_1025 -*graalpython.lib-python.3.test.test_tarfile.GzipAppendTest.test_append_compressed -*graalpython.lib-python.3.test.test_tarfile.GzipCreateTest.test_create -*graalpython.lib-python.3.test.test_tarfile.GzipCreateTest.test_create_existing -*graalpython.lib-python.3.test.test_tarfile.GzipCreateTest.test_create_existing_taropen -*graalpython.lib-python.3.test.test_tarfile.GzipCreateTest.test_create_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.GzipCreateTest.test_create_taropen -*graalpython.lib-python.3.test.test_tarfile.GzipCreateTest.test_create_taropen_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.GzipCreateTest.test_create_with_compresslevel -*graalpython.lib-python.3.test.test_tarfile.GzipCreateTest.test_eof_marker -*graalpython.lib-python.3.test.test_tarfile.GzipCreateTest.test_fileobj_no_close -*graalpython.lib-python.3.test.test_tarfile.GzipDetectReadTest.test_detect_file -*graalpython.lib-python.3.test.test_tarfile.GzipDetectReadTest.test_detect_fileobj -*graalpython.lib-python.3.test.test_tarfile.GzipListTest.test_list -*graalpython.lib-python.3.test.test_tarfile.GzipListTest.test_list_members -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_bytes_name_attribute -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_check_members -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_empty_name_attribute -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_empty_tarfile -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_extract_directory -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_extract_hardlink -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_extract_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_extractall -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_extractall_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_fail_comp -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_fileobj_with_offset -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_find_members -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_ignore_zeros -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_illegal_mode_arg -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_init_close_fobj -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_int_name_attribute -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_is_tarfile_erroneous -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_is_tarfile_keeps_position -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_is_tarfile_valid -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_length_zero_header -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_next_on_empty_tarfile -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_no_name_argument -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_no_name_attribute -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_non_existent_tarfile -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_null_tarfile -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_parallel_iteration -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_premature_end_of_archive -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_v7_dirtype -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_xstar_type -*graalpython.lib-python.3.test.test_tarfile.GzipMiscReadTest.test_zlib_error_does_not_leak -*graalpython.lib-python.3.test.test_tarfile.GzipStreamReadTest.test_compare_members -*graalpython.lib-python.3.test.test_tarfile.GzipStreamReadTest.test_empty_tarfile -*graalpython.lib-python.3.test.test_tarfile.GzipStreamReadTest.test_fileobj_regular_file -*graalpython.lib-python.3.test.test_tarfile.GzipStreamReadTest.test_ignore_zeros -*graalpython.lib-python.3.test.test_tarfile.GzipStreamReadTest.test_is_tarfile_erroneous -*graalpython.lib-python.3.test.test_tarfile.GzipStreamReadTest.test_is_tarfile_keeps_position -*graalpython.lib-python.3.test.test_tarfile.GzipStreamReadTest.test_is_tarfile_valid -*graalpython.lib-python.3.test.test_tarfile.GzipStreamReadTest.test_length_zero_header -*graalpython.lib-python.3.test.test_tarfile.GzipStreamReadTest.test_non_existent_tarfile -*graalpython.lib-python.3.test.test_tarfile.GzipStreamReadTest.test_null_tarfile -*graalpython.lib-python.3.test.test_tarfile.GzipStreamReadTest.test_premature_end_of_archive -*graalpython.lib-python.3.test.test_tarfile.GzipStreamReadTest.test_provoke_stream_error -*graalpython.lib-python.3.test.test_tarfile.GzipStreamReadTest.test_read_through -*graalpython.lib-python.3.test.test_tarfile.GzipStreamWriteTest.test_eof_marker -*graalpython.lib-python.3.test.test_tarfile.GzipStreamWriteTest.test_file_mode -*graalpython.lib-python.3.test.test_tarfile.GzipStreamWriteTest.test_fileobj_no_close -*graalpython.lib-python.3.test.test_tarfile.GzipStreamWriteTest.test_source_directory_not_leaked -*graalpython.lib-python.3.test.test_tarfile.GzipStreamWriteTest.test_stream_padding -*graalpython.lib-python.3.test.test_tarfile.GzipUstarReadTest.test_add_dir_getmember -*graalpython.lib-python.3.test.test_tarfile.GzipUstarReadTest.test_fileobj_iter -*graalpython.lib-python.3.test.test_tarfile.GzipUstarReadTest.test_fileobj_link1 -*graalpython.lib-python.3.test.test_tarfile.GzipUstarReadTest.test_fileobj_link2 -*graalpython.lib-python.3.test.test_tarfile.GzipUstarReadTest.test_fileobj_readlines -*graalpython.lib-python.3.test.test_tarfile.GzipUstarReadTest.test_fileobj_regular_file -*graalpython.lib-python.3.test.test_tarfile.GzipUstarReadTest.test_fileobj_seek -*graalpython.lib-python.3.test.test_tarfile.GzipUstarReadTest.test_fileobj_symlink1 -*graalpython.lib-python.3.test.test_tarfile.GzipUstarReadTest.test_fileobj_symlink2 -*graalpython.lib-python.3.test.test_tarfile.GzipUstarReadTest.test_fileobj_text -*graalpython.lib-python.3.test.test_tarfile.GzipUstarReadTest.test_issue14160 -*graalpython.lib-python.3.test.test_tarfile.GzipWriteTest.test_100_char_name -*graalpython.lib-python.3.test.test_tarfile.GzipWriteTest.test_abs_pathnames -*graalpython.lib-python.3.test.test_tarfile.GzipWriteTest.test_add_self -*graalpython.lib-python.3.test.test_tarfile.GzipWriteTest.test_cwd -*graalpython.lib-python.3.test.test_tarfile.GzipWriteTest.test_directory_size -*graalpython.lib-python.3.test.test_tarfile.GzipWriteTest.test_eof_marker -*graalpython.lib-python.3.test.test_tarfile.GzipWriteTest.test_extractall_symlinks -*graalpython.lib-python.3.test.test_tarfile.GzipWriteTest.test_file_size -*graalpython.lib-python.3.test.test_tarfile.GzipWriteTest.test_fileobj_no_close -*graalpython.lib-python.3.test.test_tarfile.GzipWriteTest.test_filter -*graalpython.lib-python.3.test.test_tarfile.GzipWriteTest.test_gettarinfo_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.GzipWriteTest.test_link_size -*graalpython.lib-python.3.test.test_tarfile.GzipWriteTest.test_open_nonwritable_fileobj -*graalpython.lib-python.3.test.test_tarfile.GzipWriteTest.test_ordered_recursion -*graalpython.lib-python.3.test.test_tarfile.GzipWriteTest.test_pathnames -*graalpython.lib-python.3.test.test_tarfile.GzipWriteTest.test_symlink_size -*graalpython.lib-python.3.test.test_tarfile.GzipWriteTest.test_tar_size -*graalpython.lib-python.3.test.test_tarfile.HardlinkTest.test_add_hardlink -*graalpython.lib-python.3.test.test_tarfile.HardlinkTest.test_add_twice -*graalpython.lib-python.3.test.test_tarfile.HardlinkTest.test_dereference_hardlink -*graalpython.lib-python.3.test.test_tarfile.LimitsTest.test_gnu_limits -*graalpython.lib-python.3.test.test_tarfile.LimitsTest.test_pax_limits -*graalpython.lib-python.3.test.test_tarfile.LimitsTest.test_ustar_limits -*graalpython.lib-python.3.test.test_tarfile.LinkEmulationTest.test_hardlink_extraction1 -*graalpython.lib-python.3.test.test_tarfile.LinkEmulationTest.test_hardlink_extraction2 -*graalpython.lib-python.3.test.test_tarfile.LinkEmulationTest.test_symlink_extraction1 -*graalpython.lib-python.3.test.test_tarfile.LinkEmulationTest.test_symlink_extraction2 -*graalpython.lib-python.3.test.test_tarfile.ListTest.test_list -*graalpython.lib-python.3.test.test_tarfile.ListTest.test_list_members -*graalpython.lib-python.3.test.test_tarfile.LzmaAppendTest.test_append_compressed -*graalpython.lib-python.3.test.test_tarfile.LzmaCreateTest.test_create -*graalpython.lib-python.3.test.test_tarfile.LzmaCreateTest.test_create_existing -*graalpython.lib-python.3.test.test_tarfile.LzmaCreateTest.test_create_existing_taropen -*graalpython.lib-python.3.test.test_tarfile.LzmaCreateTest.test_create_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.LzmaCreateTest.test_create_taropen -*graalpython.lib-python.3.test.test_tarfile.LzmaCreateTest.test_create_taropen_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.LzmaCreateTest.test_create_with_preset -*graalpython.lib-python.3.test.test_tarfile.LzmaCreateTest.test_eof_marker -*graalpython.lib-python.3.test.test_tarfile.LzmaCreateTest.test_fileobj_no_close -*graalpython.lib-python.3.test.test_tarfile.LzmaDetectReadTest.test_detect_file -*graalpython.lib-python.3.test.test_tarfile.LzmaDetectReadTest.test_detect_fileobj -*graalpython.lib-python.3.test.test_tarfile.LzmaListTest.test_list -*graalpython.lib-python.3.test.test_tarfile.LzmaListTest.test_list_members -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_bytes_name_attribute -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_check_members -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_empty_name_attribute -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_empty_tarfile -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_extract_directory -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_extract_hardlink -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_extract_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_extractall -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_extractall_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_fail_comp -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_fileobj_with_offset -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_find_members -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_ignore_zeros -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_illegal_mode_arg -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_init_close_fobj -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_int_name_attribute -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_is_tarfile_erroneous -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_is_tarfile_keeps_position -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_is_tarfile_valid -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_length_zero_header -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_next_on_empty_tarfile -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_no_name_argument -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_no_name_attribute -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_non_existent_tarfile -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_null_tarfile -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_parallel_iteration -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_premature_end_of_archive -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_v7_dirtype -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_xstar_type -*graalpython.lib-python.3.test.test_tarfile.LzmaMiscReadTest.test_zlib_error_does_not_leak -*graalpython.lib-python.3.test.test_tarfile.LzmaStreamReadTest.test_compare_members -*graalpython.lib-python.3.test.test_tarfile.LzmaStreamReadTest.test_empty_tarfile -*graalpython.lib-python.3.test.test_tarfile.LzmaStreamReadTest.test_fileobj_regular_file -*graalpython.lib-python.3.test.test_tarfile.LzmaStreamReadTest.test_ignore_zeros -*graalpython.lib-python.3.test.test_tarfile.LzmaStreamReadTest.test_is_tarfile_erroneous -*graalpython.lib-python.3.test.test_tarfile.LzmaStreamReadTest.test_is_tarfile_keeps_position -*graalpython.lib-python.3.test.test_tarfile.LzmaStreamReadTest.test_is_tarfile_valid -*graalpython.lib-python.3.test.test_tarfile.LzmaStreamReadTest.test_length_zero_header -*graalpython.lib-python.3.test.test_tarfile.LzmaStreamReadTest.test_non_existent_tarfile -*graalpython.lib-python.3.test.test_tarfile.LzmaStreamReadTest.test_null_tarfile -*graalpython.lib-python.3.test.test_tarfile.LzmaStreamReadTest.test_premature_end_of_archive -*graalpython.lib-python.3.test.test_tarfile.LzmaStreamReadTest.test_provoke_stream_error -*graalpython.lib-python.3.test.test_tarfile.LzmaStreamReadTest.test_read_through -*graalpython.lib-python.3.test.test_tarfile.LzmaStreamWriteTest.test_eof_marker -*graalpython.lib-python.3.test.test_tarfile.LzmaStreamWriteTest.test_file_mode -*graalpython.lib-python.3.test.test_tarfile.LzmaStreamWriteTest.test_fileobj_no_close -*graalpython.lib-python.3.test.test_tarfile.LzmaStreamWriteTest.test_stream_padding -*graalpython.lib-python.3.test.test_tarfile.LzmaUstarReadTest.test_add_dir_getmember -*graalpython.lib-python.3.test.test_tarfile.LzmaUstarReadTest.test_fileobj_iter -*graalpython.lib-python.3.test.test_tarfile.LzmaUstarReadTest.test_fileobj_link1 -*graalpython.lib-python.3.test.test_tarfile.LzmaUstarReadTest.test_fileobj_link2 -*graalpython.lib-python.3.test.test_tarfile.LzmaUstarReadTest.test_fileobj_readlines -*graalpython.lib-python.3.test.test_tarfile.LzmaUstarReadTest.test_fileobj_regular_file -*graalpython.lib-python.3.test.test_tarfile.LzmaUstarReadTest.test_fileobj_seek -*graalpython.lib-python.3.test.test_tarfile.LzmaUstarReadTest.test_fileobj_symlink1 -*graalpython.lib-python.3.test.test_tarfile.LzmaUstarReadTest.test_fileobj_symlink2 -*graalpython.lib-python.3.test.test_tarfile.LzmaUstarReadTest.test_fileobj_text -*graalpython.lib-python.3.test.test_tarfile.LzmaUstarReadTest.test_issue14160 -*graalpython.lib-python.3.test.test_tarfile.LzmaWriteTest.test_100_char_name -*graalpython.lib-python.3.test.test_tarfile.LzmaWriteTest.test_abs_pathnames -*graalpython.lib-python.3.test.test_tarfile.LzmaWriteTest.test_add_self -*graalpython.lib-python.3.test.test_tarfile.LzmaWriteTest.test_cwd -*graalpython.lib-python.3.test.test_tarfile.LzmaWriteTest.test_directory_size -*graalpython.lib-python.3.test.test_tarfile.LzmaWriteTest.test_eof_marker -*graalpython.lib-python.3.test.test_tarfile.LzmaWriteTest.test_extractall_symlinks -*graalpython.lib-python.3.test.test_tarfile.LzmaWriteTest.test_file_size -*graalpython.lib-python.3.test.test_tarfile.LzmaWriteTest.test_fileobj_no_close -*graalpython.lib-python.3.test.test_tarfile.LzmaWriteTest.test_filter -*graalpython.lib-python.3.test.test_tarfile.LzmaWriteTest.test_gettarinfo_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.LzmaWriteTest.test_link_size -*graalpython.lib-python.3.test.test_tarfile.LzmaWriteTest.test_open_nonwritable_fileobj -*graalpython.lib-python.3.test.test_tarfile.LzmaWriteTest.test_ordered_recursion -*graalpython.lib-python.3.test.test_tarfile.LzmaWriteTest.test_pathnames -*graalpython.lib-python.3.test.test_tarfile.LzmaWriteTest.test_symlink_size -*graalpython.lib-python.3.test.test_tarfile.LzmaWriteTest.test_tar_size -*graalpython.lib-python.3.test.test_tarfile.MemberReadTest.test_find_blktype -*graalpython.lib-python.3.test.test_tarfile.MemberReadTest.test_find_chrtype -*graalpython.lib-python.3.test.test_tarfile.MemberReadTest.test_find_conttype -*graalpython.lib-python.3.test.test_tarfile.MemberReadTest.test_find_dirtype -*graalpython.lib-python.3.test.test_tarfile.MemberReadTest.test_find_dirtype_with_size -*graalpython.lib-python.3.test.test_tarfile.MemberReadTest.test_find_fifotype -*graalpython.lib-python.3.test.test_tarfile.MemberReadTest.test_find_gnusparse -*graalpython.lib-python.3.test.test_tarfile.MemberReadTest.test_find_gnusparse_00 -*graalpython.lib-python.3.test.test_tarfile.MemberReadTest.test_find_gnusparse_01 -*graalpython.lib-python.3.test.test_tarfile.MemberReadTest.test_find_gnusparse_10 -*graalpython.lib-python.3.test.test_tarfile.MemberReadTest.test_find_lnktype -*graalpython.lib-python.3.test.test_tarfile.MemberReadTest.test_find_pax_umlauts -*graalpython.lib-python.3.test.test_tarfile.MemberReadTest.test_find_regtype -*graalpython.lib-python.3.test.test_tarfile.MemberReadTest.test_find_regtype_oldv7 -*graalpython.lib-python.3.test.test_tarfile.MemberReadTest.test_find_sparse -*graalpython.lib-python.3.test.test_tarfile.MemberReadTest.test_find_symtype -*graalpython.lib-python.3.test.test_tarfile.MemberReadTest.test_find_umlauts -*graalpython.lib-python.3.test.test_tarfile.MemberReadTest.test_find_ustar_longname -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_bytes_name_attribute -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_check_members -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_empty_name_attribute -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_empty_tarfile -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_extract_directory -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_extract_hardlink -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_extract_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_extractall -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_extractall_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_fileobj_with_offset -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_find_members -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_ignore_zeros -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_illegal_mode_arg -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_init_close_fobj -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_int_name_attribute -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_is_tarfile_erroneous -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_is_tarfile_keeps_position -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_is_tarfile_valid -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_length_zero_header -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_next_on_empty_tarfile -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_no_name_argument -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_no_name_attribute -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_non_existent_tarfile -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_null_tarfile -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_parallel_iteration -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_premature_end_of_archive -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_v7_dirtype -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_xstar_type -*graalpython.lib-python.3.test.test_tarfile.MiscReadTest.test_zlib_error_does_not_leak -*graalpython.lib-python.3.test.test_tarfile.MiscTest.test__all__ -*graalpython.lib-python.3.test.test_tarfile.MiscTest.test_char_fields -*graalpython.lib-python.3.test.test_tarfile.MiscTest.test_number_field_limits -*graalpython.lib-python.3.test.test_tarfile.MiscTest.test_read_number_fields -*graalpython.lib-python.3.test.test_tarfile.MiscTest.test_useful_error_message_when_modules_missing -*graalpython.lib-python.3.test.test_tarfile.MiscTest.test_write_number_fields -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_gid -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_gname -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_mode -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_mtime -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_ownership -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_uid -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_uname -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_gid -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_gname -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_mode -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_mtime -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_ownership -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_uid -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_uname -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_gid -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_gname -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_mode -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_mtime -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_ownership -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_uid -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_uname -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_gid -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_gname -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_mode -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_mtime -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_ownership -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_uid -*graalpython.lib-python.3.test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_uname -*graalpython.lib-python.3.test.test_tarfile.NoneInfoTests_Misc.test_add -*graalpython.lib-python.3.test.test_tarfile.NoneInfoTests_Misc.test_list -*graalpython.lib-python.3.test.test_tarfile.NumericOwnerTest.test_extract_with_numeric_owner -*graalpython.lib-python.3.test.test_tarfile.NumericOwnerTest.test_extract_without_numeric_owner -*graalpython.lib-python.3.test.test_tarfile.NumericOwnerTest.test_extractall_with_numeric_owner -*graalpython.lib-python.3.test.test_tarfile.NumericOwnerTest.test_keyword_only -*graalpython.lib-python.3.test.test_tarfile.PAXUnicodeTest.test_binary_header -*graalpython.lib-python.3.test.test_tarfile.PAXUnicodeTest.test_iso8859_1_filename -*graalpython.lib-python.3.test.test_tarfile.PAXUnicodeTest.test_uname_unicode -*graalpython.lib-python.3.test.test_tarfile.PAXUnicodeTest.test_unicode_argument -*graalpython.lib-python.3.test.test_tarfile.PAXUnicodeTest.test_utf7_filename -*graalpython.lib-python.3.test.test_tarfile.PAXUnicodeTest.test_utf8_filename -*graalpython.lib-python.3.test.test_tarfile.PaxReadTest.test_header_offset -*graalpython.lib-python.3.test.test_tarfile.PaxReadTest.test_longname_directory -*graalpython.lib-python.3.test.test_tarfile.PaxReadTest.test_pax_global_headers -*graalpython.lib-python.3.test.test_tarfile.PaxReadTest.test_pax_number_fields -*graalpython.lib-python.3.test.test_tarfile.PaxReadTest.test_read_longlink -*graalpython.lib-python.3.test.test_tarfile.PaxReadTest.test_read_longname -*graalpython.lib-python.3.test.test_tarfile.PaxReadTest.test_truncated_longname -*graalpython.lib-python.3.test.test_tarfile.PaxWriteTest.test_create_pax_header -*graalpython.lib-python.3.test.test_tarfile.PaxWriteTest.test_longlink_1023 -*graalpython.lib-python.3.test.test_tarfile.PaxWriteTest.test_longlink_1024 -*graalpython.lib-python.3.test.test_tarfile.PaxWriteTest.test_longlink_1025 -*graalpython.lib-python.3.test.test_tarfile.PaxWriteTest.test_longname_1023 -*graalpython.lib-python.3.test.test_tarfile.PaxWriteTest.test_longname_1024 -*graalpython.lib-python.3.test.test_tarfile.PaxWriteTest.test_longname_1025 -*graalpython.lib-python.3.test.test_tarfile.PaxWriteTest.test_longnamelink_1023 -*graalpython.lib-python.3.test.test_tarfile.PaxWriteTest.test_longnamelink_1024 -*graalpython.lib-python.3.test.test_tarfile.PaxWriteTest.test_longnamelink_1025 -*graalpython.lib-python.3.test.test_tarfile.PaxWriteTest.test_pax_extended_header -*graalpython.lib-python.3.test.test_tarfile.PaxWriteTest.test_pax_global_header -*graalpython.lib-python.3.test.test_tarfile.ReplaceTests.test_replace_all -*graalpython.lib-python.3.test.test_tarfile.ReplaceTests.test_replace_deep -*graalpython.lib-python.3.test.test_tarfile.ReplaceTests.test_replace_internal -*graalpython.lib-python.3.test.test_tarfile.ReplaceTests.test_replace_name -*graalpython.lib-python.3.test.test_tarfile.ReplaceTests.test_replace_shallow -*graalpython.lib-python.3.test.test_tarfile.StreamReadTest.test_compare_members -*graalpython.lib-python.3.test.test_tarfile.StreamReadTest.test_empty_tarfile -*graalpython.lib-python.3.test.test_tarfile.StreamReadTest.test_fileobj_regular_file -*graalpython.lib-python.3.test.test_tarfile.StreamReadTest.test_ignore_zeros -*graalpython.lib-python.3.test.test_tarfile.StreamReadTest.test_is_tarfile_erroneous -*graalpython.lib-python.3.test.test_tarfile.StreamReadTest.test_is_tarfile_keeps_position -*graalpython.lib-python.3.test.test_tarfile.StreamReadTest.test_is_tarfile_valid -*graalpython.lib-python.3.test.test_tarfile.StreamReadTest.test_length_zero_header -*graalpython.lib-python.3.test.test_tarfile.StreamReadTest.test_non_existent_tarfile -*graalpython.lib-python.3.test.test_tarfile.StreamReadTest.test_null_tarfile -*graalpython.lib-python.3.test.test_tarfile.StreamReadTest.test_premature_end_of_archive -*graalpython.lib-python.3.test.test_tarfile.StreamReadTest.test_provoke_stream_error -*graalpython.lib-python.3.test.test_tarfile.StreamReadTest.test_read_through -*graalpython.lib-python.3.test.test_tarfile.StreamWriteTest.test_eof_marker -*graalpython.lib-python.3.test.test_tarfile.StreamWriteTest.test_file_mode -*graalpython.lib-python.3.test.test_tarfile.StreamWriteTest.test_fileobj_no_close -*graalpython.lib-python.3.test.test_tarfile.StreamWriteTest.test_stream_padding -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_absolute -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_absolute_hardlink -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_absolute_symlink -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_bad_filter_name -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_benign_file -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_chains -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_change_default_filter_on_class -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_change_default_filter_on_instance -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_change_default_filter_on_subclass -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_change_default_filter_to_string -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_custom_filter -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_data_filter -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_deep_symlink -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_default_filter_warns_not -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_errorlevel -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_fully_trusted_filter -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_parent_symlink -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_parent_symlink2 -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_pipe -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_sly_relative0 -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_sly_relative2 -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_special_files -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_stateful_filter -*graalpython.lib-python.3.test.test_tarfile.TestExtractionFilters.test_tar_filter -*graalpython.lib-python.3.test.test_tarfile.UstarReadTest.test_add_dir_getmember -*graalpython.lib-python.3.test.test_tarfile.UstarReadTest.test_fileobj_iter -*graalpython.lib-python.3.test.test_tarfile.UstarReadTest.test_fileobj_link1 -*graalpython.lib-python.3.test.test_tarfile.UstarReadTest.test_fileobj_link2 -*graalpython.lib-python.3.test.test_tarfile.UstarReadTest.test_fileobj_readlines -*graalpython.lib-python.3.test.test_tarfile.UstarReadTest.test_fileobj_regular_file -*graalpython.lib-python.3.test.test_tarfile.UstarReadTest.test_fileobj_seek -*graalpython.lib-python.3.test.test_tarfile.UstarReadTest.test_fileobj_symlink1 -*graalpython.lib-python.3.test.test_tarfile.UstarReadTest.test_fileobj_symlink2 -*graalpython.lib-python.3.test.test_tarfile.UstarReadTest.test_fileobj_text -*graalpython.lib-python.3.test.test_tarfile.UstarReadTest.test_issue14160 -*graalpython.lib-python.3.test.test_tarfile.UstarUnicodeTest.test_iso8859_1_filename -*graalpython.lib-python.3.test.test_tarfile.UstarUnicodeTest.test_uname_unicode -*graalpython.lib-python.3.test.test_tarfile.UstarUnicodeTest.test_unicode_argument -*graalpython.lib-python.3.test.test_tarfile.UstarUnicodeTest.test_unicode_filename_error -*graalpython.lib-python.3.test.test_tarfile.UstarUnicodeTest.test_unicode_link1 -*graalpython.lib-python.3.test.test_tarfile.UstarUnicodeTest.test_unicode_link2 -*graalpython.lib-python.3.test.test_tarfile.UstarUnicodeTest.test_unicode_longname1 -*graalpython.lib-python.3.test.test_tarfile.UstarUnicodeTest.test_unicode_longname2 -*graalpython.lib-python.3.test.test_tarfile.UstarUnicodeTest.test_unicode_longname3 -*graalpython.lib-python.3.test.test_tarfile.UstarUnicodeTest.test_unicode_longname4 -*graalpython.lib-python.3.test.test_tarfile.UstarUnicodeTest.test_unicode_name1 -*graalpython.lib-python.3.test.test_tarfile.UstarUnicodeTest.test_unicode_name2 -*graalpython.lib-python.3.test.test_tarfile.UstarUnicodeTest.test_utf7_filename -*graalpython.lib-python.3.test.test_tarfile.UstarUnicodeTest.test_utf8_filename -*graalpython.lib-python.3.test.test_tarfile.WriteTest.test_100_char_name -*graalpython.lib-python.3.test.test_tarfile.WriteTest.test_abs_pathnames -*graalpython.lib-python.3.test.test_tarfile.WriteTest.test_add_self -*graalpython.lib-python.3.test.test_tarfile.WriteTest.test_cwd -*graalpython.lib-python.3.test.test_tarfile.WriteTest.test_directory_size -*graalpython.lib-python.3.test.test_tarfile.WriteTest.test_eof_marker -*graalpython.lib-python.3.test.test_tarfile.WriteTest.test_extractall_symlinks -*graalpython.lib-python.3.test.test_tarfile.WriteTest.test_file_size -*graalpython.lib-python.3.test.test_tarfile.WriteTest.test_fileobj_no_close -*graalpython.lib-python.3.test.test_tarfile.WriteTest.test_filter -*graalpython.lib-python.3.test.test_tarfile.WriteTest.test_gettarinfo_pathlike_name -*graalpython.lib-python.3.test.test_tarfile.WriteTest.test_link_size -*graalpython.lib-python.3.test.test_tarfile.WriteTest.test_open_nonwritable_fileobj -*graalpython.lib-python.3.test.test_tarfile.WriteTest.test_ordered_recursion -*graalpython.lib-python.3.test.test_tarfile.WriteTest.test_pathnames -*graalpython.lib-python.3.test.test_tarfile.WriteTest.test_symlink_size -*graalpython.lib-python.3.test.test_tarfile.WriteTest.test_tar_size +test.test_tarfile.AppendTest.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.AppendTest.test_empty_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.AppendTest.test_existing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.AppendTest.test_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.AppendTest.test_incomplete @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.AppendTest.test_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.AppendTest.test_non_existing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.AppendTest.test_null @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.AppendTest.test_premature_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.AppendTest.test_trailing_garbage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2AppendTest.test_append_compressed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2CreateTest.test_create @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2CreateTest.test_create_existing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2CreateTest.test_create_existing_taropen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2CreateTest.test_create_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2CreateTest.test_create_taropen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2CreateTest.test_create_taropen_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2CreateTest.test_create_with_compresslevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2CreateTest.test_eof_marker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2CreateTest.test_fileobj_no_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2DetectReadTest.test_detect_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2DetectReadTest.test_detect_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2DetectReadTest.test_detect_stream_bz2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2ListTest.test_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2ListTest.test_list_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_check_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_empty_name_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_empty_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_extract_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_extract_hardlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_extract_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_extractall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_extractall_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_fail_comp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_fileobj_with_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_find_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_ignore_zeros @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_illegal_mode_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_init_close_fobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_int_name_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_is_tarfile_erroneous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_is_tarfile_keeps_position @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_is_tarfile_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_length_zero_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_next_on_empty_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_no_name_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_non_existent_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_null_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_parallel_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_premature_end_of_archive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_v7_dirtype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_xstar_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2MiscReadTest.test_zlib_error_does_not_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2PartialReadTest.test_partial_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2PartialReadTest.test_partial_input_bz2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2StreamReadTest.test_compare_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2StreamReadTest.test_empty_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2StreamReadTest.test_fileobj_regular_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2StreamReadTest.test_ignore_zeros @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2StreamReadTest.test_is_tarfile_erroneous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2StreamReadTest.test_is_tarfile_keeps_position @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2StreamReadTest.test_is_tarfile_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2StreamReadTest.test_length_zero_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2StreamReadTest.test_non_existent_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2StreamReadTest.test_null_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2StreamReadTest.test_premature_end_of_archive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2StreamReadTest.test_provoke_stream_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2StreamReadTest.test_read_through @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2StreamWriteTest.test_eof_marker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2StreamWriteTest.test_file_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2StreamWriteTest.test_fileobj_no_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2StreamWriteTest.test_stream_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2UstarReadTest.test_add_dir_getmember @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2UstarReadTest.test_fileobj_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2UstarReadTest.test_fileobj_link1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2UstarReadTest.test_fileobj_link2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2UstarReadTest.test_fileobj_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2UstarReadTest.test_fileobj_regular_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2UstarReadTest.test_fileobj_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2UstarReadTest.test_fileobj_symlink1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2UstarReadTest.test_fileobj_symlink2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2UstarReadTest.test_fileobj_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2UstarReadTest.test_issue14160 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2WriteTest.test_100_char_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2WriteTest.test_abs_pathnames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_add_self @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2WriteTest.test_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_directory_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_eof_marker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2WriteTest.test_extractall_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_file_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_fileobj_no_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2WriteTest.test_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_gettarinfo_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_link_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_open_nonwritable_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.Bz2WriteTest.test_ordered_recursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_pathnames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_symlink_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_tar_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CommandLineTest.test_bad_use @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.CommandLineTest.test_create_command @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CommandLineTest.test_create_command_compressed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CommandLineTest.test_create_command_dot_started_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CommandLineTest.test_create_command_dotless_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CommandLineTest.test_create_command_verbose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CommandLineTest.test_extract_command @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CommandLineTest.test_extract_command_different_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CommandLineTest.test_extract_command_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CommandLineTest.test_extract_command_invalid_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.CommandLineTest.test_extract_command_verbose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CommandLineTest.test_list_command @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CommandLineTest.test_list_command_invalid_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.CommandLineTest.test_list_command_verbose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CommandLineTest.test_test_command @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CommandLineTest.test_test_command_invalid_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.CommandLineTest.test_test_command_verbose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.ContextManagerTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.ContextManagerTest.test_closed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.ContextManagerTest.test_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.ContextManagerTest.test_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.ContextManagerTest.test_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.ContextManagerTest.test_no_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.CreateTest.test_create @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CreateTest.test_create_existing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CreateTest.test_create_existing_taropen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CreateTest.test_create_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CreateTest.test_create_taropen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CreateTest.test_create_taropen_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CreateTest.test_eof_marker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.CreateTest.test_fileobj_no_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.CreateWithXModeTest.test_create @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CreateWithXModeTest.test_create_existing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CreateWithXModeTest.test_create_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CreateWithXModeTest.test_create_taropen_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.CreateWithXModeTest.test_eof_marker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.CreateWithXModeTest.test_fileobj_no_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.DetectReadTest.test_detect_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.DetectReadTest.test_detect_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.DeviceHeaderTest.test_eof_marker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.DeviceHeaderTest.test_fileobj_no_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.DeviceHeaderTest.test_headers_written_only_for_device_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUReadTest.test_header_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUReadTest.test_longname_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GNUReadTest.test_read_longlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUReadTest.test_read_longname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUReadTest.test_sparse_file_00 @ darwin-arm64,darwin-x86_64 +test.test_tarfile.GNUReadTest.test_sparse_file_01 @ darwin-arm64,darwin-x86_64 +test.test_tarfile.GNUReadTest.test_sparse_file_10 @ darwin-arm64,darwin-x86_64 +test.test_tarfile.GNUReadTest.test_sparse_file_old @ darwin-arm64,darwin-x86_64 +test.test_tarfile.GNUReadTest.test_truncated_longname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUUnicodeTest.test_bad_pax_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUUnicodeTest.test_iso8859_1_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUUnicodeTest.test_uname_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GNUUnicodeTest.test_unicode_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUUnicodeTest.test_unicode_filename_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUUnicodeTest.test_utf7_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUUnicodeTest.test_utf8_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUWriteTest.test_longlink_1023 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUWriteTest.test_longlink_1024 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUWriteTest.test_longlink_1025 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUWriteTest.test_longname_1023 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUWriteTest.test_longname_1024 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUWriteTest.test_longname_1025 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUWriteTest.test_longnamelink_1023 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUWriteTest.test_longnamelink_1024 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GNUWriteTest.test_longnamelink_1025 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipAppendTest.test_append_compressed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipBrokenHeaderCorrectException.runTest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipCreateTest.test_create @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipCreateTest.test_create_existing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipCreateTest.test_create_existing_taropen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipCreateTest.test_create_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipCreateTest.test_create_taropen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipCreateTest.test_create_taropen_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipCreateTest.test_create_with_compresslevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipCreateTest.test_eof_marker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipCreateTest.test_fileobj_no_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipDetectReadTest.test_detect_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipDetectReadTest.test_detect_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipListTest.test_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipListTest.test_list_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_bytes_name_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_check_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_empty_name_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_empty_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_extract_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_extract_hardlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_extract_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_extractall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_extractall_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_fail_comp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_fileobj_with_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_find_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_ignore_zeros @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_illegal_mode_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_init_close_fobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_int_name_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_is_tarfile_erroneous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_is_tarfile_keeps_position @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_is_tarfile_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_length_zero_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_next_on_empty_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_no_name_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_no_name_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_non_existent_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_null_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_parallel_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_premature_end_of_archive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_v7_dirtype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_xstar_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipMiscReadTest.test_zlib_error_does_not_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipStreamReadTest.test_compare_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipStreamReadTest.test_empty_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipStreamReadTest.test_fileobj_regular_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipStreamReadTest.test_ignore_zeros @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipStreamReadTest.test_is_tarfile_erroneous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipStreamReadTest.test_is_tarfile_keeps_position @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipStreamReadTest.test_is_tarfile_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipStreamReadTest.test_length_zero_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipStreamReadTest.test_non_existent_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipStreamReadTest.test_null_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipStreamReadTest.test_premature_end_of_archive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipStreamReadTest.test_provoke_stream_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipStreamReadTest.test_read_through @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipStreamWriteTest.test_eof_marker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipStreamWriteTest.test_file_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipStreamWriteTest.test_fileobj_no_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipStreamWriteTest.test_source_directory_not_leaked @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipStreamWriteTest.test_stream_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipUstarReadTest.test_add_dir_getmember @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipUstarReadTest.test_fileobj_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipUstarReadTest.test_fileobj_link1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipUstarReadTest.test_fileobj_link2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipUstarReadTest.test_fileobj_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipUstarReadTest.test_fileobj_regular_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipUstarReadTest.test_fileobj_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipUstarReadTest.test_fileobj_symlink1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipUstarReadTest.test_fileobj_symlink2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipUstarReadTest.test_fileobj_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipUstarReadTest.test_issue14160 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipWriteTest.test_100_char_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipWriteTest.test_abs_pathnames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipWriteTest.test_add_self @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipWriteTest.test_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipWriteTest.test_directory_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipWriteTest.test_eof_marker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipWriteTest.test_extractall_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipWriteTest.test_file_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipWriteTest.test_fileobj_no_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipWriteTest.test_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipWriteTest.test_gettarinfo_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipWriteTest.test_link_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipWriteTest.test_open_nonwritable_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.GzipWriteTest.test_ordered_recursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipWriteTest.test_pathnames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipWriteTest.test_symlink_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.GzipWriteTest.test_tar_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.HardlinkTest.test_add_hardlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.HardlinkTest.test_add_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.HardlinkTest.test_dereference_hardlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LimitsTest.test_gnu_limits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.LimitsTest.test_pax_limits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.LimitsTest.test_ustar_limits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.ListTest.test_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.ListTest.test_list_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.LzmaAppendTest.test_append_compressed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tarfile.LzmaCreateTest.test_create @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaCreateTest.test_create_existing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaCreateTest.test_create_existing_taropen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaCreateTest.test_create_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaCreateTest.test_create_taropen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaCreateTest.test_create_taropen_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaCreateTest.test_create_with_preset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaCreateTest.test_eof_marker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaCreateTest.test_fileobj_no_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaDetectReadTest.test_detect_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaDetectReadTest.test_detect_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaListTest.test_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaListTest.test_list_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_check_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_empty_name_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_empty_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_extract_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_extract_hardlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_extract_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_extractall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_extractall_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_fail_comp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_fileobj_with_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_find_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_ignore_zeros @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_illegal_mode_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_init_close_fobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_int_name_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_is_tarfile_erroneous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_is_tarfile_keeps_position @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_is_tarfile_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_length_zero_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_next_on_empty_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_no_name_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_non_existent_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_null_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_parallel_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_premature_end_of_archive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_v7_dirtype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_xstar_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_zlib_error_does_not_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_compare_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_empty_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_fileobj_regular_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_ignore_zeros @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_is_tarfile_erroneous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_is_tarfile_keeps_position @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_is_tarfile_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_length_zero_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_non_existent_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_null_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_premature_end_of_archive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_provoke_stream_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_read_through @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaStreamWriteTest.test_eof_marker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaStreamWriteTest.test_file_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaStreamWriteTest.test_fileobj_no_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaStreamWriteTest.test_stream_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_add_dir_getmember @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_fileobj_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_fileobj_link1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_fileobj_link2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_fileobj_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_fileobj_regular_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_fileobj_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_fileobj_symlink1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_fileobj_symlink2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_fileobj_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_issue14160 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_100_char_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_abs_pathnames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_add_self @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_directory_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_eof_marker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_extractall_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_file_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_fileobj_no_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_gettarinfo_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_link_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_open_nonwritable_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_ordered_recursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_pathnames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_symlink_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_tar_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_blktype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_chrtype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_conttype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_dirtype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_dirtype_with_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_fifotype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_gnusparse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_gnusparse_00 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_gnusparse_01 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_gnusparse_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_lnktype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_pax_umlauts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_regtype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_regtype_oldv7 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_sparse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_symtype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_umlauts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_ustar_longname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_bytes_name_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_check_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_empty_name_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_empty_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_extract_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_extract_hardlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_extract_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_extractall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_extractall_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_fileobj_with_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_find_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_ignore_zeros @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_illegal_mode_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_init_close_fobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_int_name_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_is_tarfile_erroneous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_is_tarfile_keeps_position @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_is_tarfile_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_length_zero_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_next_on_empty_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_no_name_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_no_name_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_non_existent_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_null_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_parallel_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_premature_end_of_archive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_v7_dirtype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_xstar_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscReadTest.test_zlib_error_does_not_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscTest.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscTest.test_char_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscTest.test_number_field_limits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscTest.test_read_number_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscTest.test_useful_error_message_when_modules_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.MiscTest.test_write_number_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_gid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_gname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_mtime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_ownership @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_uid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_uname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_gid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_gname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_mtime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_ownership @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_uid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_uname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_gid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_gname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_mtime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_ownership @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_uid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_uname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_gid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_gname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_mtime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_ownership @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_uid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_uname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoTests_Misc.test_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NoneInfoTests_Misc.test_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NumericOwnerTest.test_extract_with_numeric_owner @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NumericOwnerTest.test_extractall_with_numeric_owner @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.NumericOwnerTest.test_keyword_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PAXUnicodeTest.test_binary_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PAXUnicodeTest.test_iso8859_1_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PAXUnicodeTest.test_uname_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PAXUnicodeTest.test_unicode_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PAXUnicodeTest.test_utf7_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PAXUnicodeTest.test_utf8_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxReadTest.test_header_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxReadTest.test_longname_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxReadTest.test_pax_global_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxReadTest.test_pax_number_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxReadTest.test_read_longlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxReadTest.test_read_longname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxReadTest.test_truncated_longname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxWriteTest.test_create_pax_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxWriteTest.test_longlink_1023 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxWriteTest.test_longlink_1024 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxWriteTest.test_longlink_1025 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxWriteTest.test_longname_1023 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxWriteTest.test_longname_1024 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxWriteTest.test_longname_1025 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxWriteTest.test_longnamelink_1023 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxWriteTest.test_longnamelink_1024 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxWriteTest.test_longnamelink_1025 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxWriteTest.test_pax_extended_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.PaxWriteTest.test_pax_global_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.ReplaceTests.test_replace_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.ReplaceTests.test_replace_deep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.ReplaceTests.test_replace_internal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.ReplaceTests.test_replace_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.ReplaceTests.test_replace_shallow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.StreamReadTest.test_compare_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.StreamReadTest.test_empty_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.StreamReadTest.test_fileobj_regular_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.StreamReadTest.test_ignore_zeros @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.StreamReadTest.test_is_tarfile_erroneous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.StreamReadTest.test_is_tarfile_keeps_position @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.StreamReadTest.test_is_tarfile_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.StreamReadTest.test_length_zero_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.StreamReadTest.test_non_existent_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.StreamReadTest.test_null_tarfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.StreamReadTest.test_premature_end_of_archive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.StreamReadTest.test_provoke_stream_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.StreamReadTest.test_read_through @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.StreamWriteTest.test_eof_marker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.StreamWriteTest.test_file_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.StreamWriteTest.test_fileobj_no_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.StreamWriteTest.test_stream_padding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_absolute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_absolute_hardlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_absolute_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_bad_filter_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_benign_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_chains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_change_default_filter_on_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_change_default_filter_on_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_change_default_filter_on_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_change_default_filter_to_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_custom_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_data_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_deep_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_default_filter_warns_not @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_errorlevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_fully_trusted_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_parent_symlink @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_parent_symlink2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_sly_relative0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_sly_relative2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_special_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_stateful_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_tar_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarReadTest.test_add_dir_getmember @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarReadTest.test_fileobj_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarReadTest.test_fileobj_link1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarReadTest.test_fileobj_link2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarReadTest.test_fileobj_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarReadTest.test_fileobj_regular_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarReadTest.test_fileobj_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarReadTest.test_fileobj_symlink1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarReadTest.test_fileobj_symlink2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarReadTest.test_fileobj_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarReadTest.test_issue14160 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_iso8859_1_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_uname_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_filename_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_link1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_link2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_longname1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_longname2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_longname3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_longname4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_name1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_name2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_utf7_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_utf8_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.WriteTest.test_100_char_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.WriteTest.test_abs_pathnames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.WriteTest.test_add_self @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.WriteTest.test_cwd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.WriteTest.test_directory_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.WriteTest.test_eof_marker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.WriteTest.test_extractall_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.WriteTest.test_file_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.WriteTest.test_fileobj_no_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.WriteTest.test_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.WriteTest.test_gettarinfo_pathlike_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.WriteTest.test_link_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.WriteTest.test_open_nonwritable_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.WriteTest.test_ordered_recursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.WriteTest.test_pathnames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.WriteTest.test_symlink_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tarfile.WriteTest.test_tar_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_telnetlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_telnetlib.txt index 8b161bbbd9..60bef80d3d 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_telnetlib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_telnetlib.txt @@ -1,19 +1,19 @@ -*graalpython.lib-python.3.test.test_telnetlib.ExpectTests.test_expect -*graalpython.lib-python.3.test.test_telnetlib.GeneralTests.testBasic -*graalpython.lib-python.3.test.test_telnetlib.GeneralTests.testContextManager -*graalpython.lib-python.3.test.test_telnetlib.GeneralTests.testGetters -*graalpython.lib-python.3.test.test_telnetlib.GeneralTests.testTimeoutDefault -*graalpython.lib-python.3.test.test_telnetlib.GeneralTests.testTimeoutNone -*graalpython.lib-python.3.test.test_telnetlib.GeneralTests.testTimeoutOpen -*graalpython.lib-python.3.test.test_telnetlib.GeneralTests.testTimeoutValue -*graalpython.lib-python.3.test.test_telnetlib.OptionTests.test_IAC_commands -*graalpython.lib-python.3.test.test_telnetlib.OptionTests.test_SB_commands -*graalpython.lib-python.3.test.test_telnetlib.OptionTests.test_debug_accepts_str_port -*graalpython.lib-python.3.test.test_telnetlib.OptionTests.test_debuglevel_reads -*graalpython.lib-python.3.test.test_telnetlib.OptionTests.test_debuglevel_write -*graalpython.lib-python.3.test.test_telnetlib.ReadTests.test_read_all -*graalpython.lib-python.3.test.test_telnetlib.ReadTests.test_read_eager -*graalpython.lib-python.3.test.test_telnetlib.ReadTests.test_read_lazy -*graalpython.lib-python.3.test.test_telnetlib.ReadTests.test_read_some -*graalpython.lib-python.3.test.test_telnetlib.ReadTests.test_read_until -*graalpython.lib-python.3.test.test_telnetlib.WriteTests.test_write +test.test_telnetlib.ExpectTests.test_expect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_telnetlib.GeneralTests.testBasic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_telnetlib.GeneralTests.testContextManager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_telnetlib.GeneralTests.testGetters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_telnetlib.GeneralTests.testTimeoutDefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_telnetlib.GeneralTests.testTimeoutNone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_telnetlib.GeneralTests.testTimeoutOpen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_telnetlib.GeneralTests.testTimeoutValue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_telnetlib.OptionTests.test_IAC_commands @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_telnetlib.OptionTests.test_SB_commands @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_telnetlib.OptionTests.test_debug_accepts_str_port @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_telnetlib.OptionTests.test_debuglevel_reads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_telnetlib.OptionTests.test_debuglevel_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_telnetlib.ReadTests.test_read_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_telnetlib.ReadTests.test_read_eager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_telnetlib.ReadTests.test_read_lazy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_telnetlib.ReadTests.test_read_some @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_telnetlib.ReadTests.test_read_until @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_telnetlib.WriteTests.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tempfile.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tempfile.txt index d28f67e0bb..338dde09bc 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tempfile.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tempfile.txt @@ -1,104 +1,94 @@ -*graalpython.lib-python.3.test.test_tempfile.TestCandidateTempdirList.test_nonempty_list -*graalpython.lib-python.3.test.test_tempfile.TestCandidateTempdirList.test_wanted_dirs -*graalpython.lib-python.3.test.test_tempfile.TestExports.test_exports -*graalpython.lib-python.3.test.test_tempfile.TestGetCandidateNames.test_retval -*graalpython.lib-python.3.test.test_tempfile.TestGetCandidateNames.test_same_thing -*graalpython.lib-python.3.test.test_tempfile.TestGetDefaultTempdir.test_no_files_left_behind -*graalpython.lib-python.3.test.test_tempfile.TestGetTempDir.test_case_sensitive -*graalpython.lib-python.3.test.test_tempfile.TestGetTempDir.test_directory_exists -*graalpython.lib-python.3.test.test_tempfile.TestGetTempDir.test_directory_writable -*graalpython.lib-python.3.test.test_tempfile.TestGetTempDir.test_same_thing -*graalpython.lib-python.3.test.test_tempfile.TestGetTempPrefix.test_sane_template -*graalpython.lib-python.3.test.test_tempfile.TestGetTempPrefix.test_usable_template -*graalpython.lib-python.3.test.test_tempfile.TestLowLevelInternals.test_infer_return_type_multiples -*graalpython.lib-python.3.test.test_tempfile.TestLowLevelInternals.test_infer_return_type_multiples_and_none -*graalpython.lib-python.3.test.test_tempfile.TestLowLevelInternals.test_infer_return_type_pathlib -*graalpython.lib-python.3.test.test_tempfile.TestLowLevelInternals.test_infer_return_type_pathlike -*graalpython.lib-python.3.test.test_tempfile.TestLowLevelInternals.test_infer_return_type_singles -*graalpython.lib-python.3.test.test_tempfile.TestMkdtemp.test_basic -*graalpython.lib-python.3.test.test_tempfile.TestMkdtemp.test_basic_many -*graalpython.lib-python.3.test.test_tempfile.TestMkdtemp.test_basic_with_bytes_names -*graalpython.lib-python.3.test.test_tempfile.TestMkdtemp.test_choose_directory -*graalpython.lib-python.3.test.test_tempfile.TestMkdtemp.test_collision_with_existing_directory -*graalpython.lib-python.3.test.test_tempfile.TestMkdtemp.test_collision_with_existing_file -*graalpython.lib-python.3.test.test_tempfile.TestMkdtemp.test_for_tempdir_is_bytes_issue40701_api_warts -*graalpython.lib-python.3.test.test_tempfile.TestMkdtemp.test_mode -*graalpython.lib-python.3.test.test_tempfile.TestMkdtemp.test_non_directory -*graalpython.lib-python.3.test.test_tempfile.TestMkdtemp.test_nonexisting_directory -*graalpython.lib-python.3.test.test_tempfile.TestMkdtemp.test_read_only_directory -*graalpython.lib-python.3.test.test_tempfile.TestMkstemp.test_basic -*graalpython.lib-python.3.test.test_tempfile.TestMkstemp.test_basic_with_bytes_names -*graalpython.lib-python.3.test.test_tempfile.TestMkstemp.test_choose_directory -*graalpython.lib-python.3.test.test_tempfile.TestMkstemp.test_for_tempdir_is_bytes_issue40701_api_warts -*graalpython.lib-python.3.test.test_tempfile.TestMkstempInner.test_basic -*graalpython.lib-python.3.test.test_tempfile.TestMkstempInner.test_basic_many -*graalpython.lib-python.3.test.test_tempfile.TestMkstempInner.test_basic_with_bytes_names -*graalpython.lib-python.3.test.test_tempfile.TestMkstempInner.test_collision_with_existing_directory -*graalpython.lib-python.3.test.test_tempfile.TestMkstempInner.test_collision_with_existing_file -*graalpython.lib-python.3.test.test_tempfile.TestMkstempInner.test_file_mode -*graalpython.lib-python.3.test.test_tempfile.TestMkstempInner.test_noinherit -*graalpython.lib-python.3.test.test_tempfile.TestMkstempInner.test_non_directory -*graalpython.lib-python.3.test.test_tempfile.TestMkstempInner.test_nonexisting_directory -*graalpython.lib-python.3.test.test_tempfile.TestMkstempInner.test_read_only_directory -*graalpython.lib-python.3.test.test_tempfile.TestMkstempInner.test_textmode -*graalpython.lib-python.3.test.test_tempfile.TestNamedTemporaryFile.test_bad_encoding -*graalpython.lib-python.3.test.test_tempfile.TestNamedTemporaryFile.test_bad_mode -*graalpython.lib-python.3.test.test_tempfile.TestNamedTemporaryFile.test_basic -*graalpython.lib-python.3.test.test_tempfile.TestNamedTemporaryFile.test_context_manager -*graalpython.lib-python.3.test.test_tempfile.TestNamedTemporaryFile.test_creates_named -*graalpython.lib-python.3.test.test_tempfile.TestNamedTemporaryFile.test_del_on_close -*graalpython.lib-python.3.test.test_tempfile.TestNamedTemporaryFile.test_dis_del_on_close -*graalpython.lib-python.3.test.test_tempfile.TestNamedTemporaryFile.test_iter -*graalpython.lib-python.3.test.test_tempfile.TestNamedTemporaryFile.test_method_lookup -*graalpython.lib-python.3.test.test_tempfile.TestNamedTemporaryFile.test_multiple_close -*graalpython.lib-python.3.test.test_tempfile.TestNamedTemporaryFile.test_no_leak_fd -*graalpython.lib-python.3.test.test_tempfile.TestNamedTemporaryFile.test_unexpected_error -*graalpython.lib-python.3.test.test_tempfile.TestRandomNameSequence.test_get_eight_char_str -*graalpython.lib-python.3.test.test_tempfile.TestRandomNameSequence.test_get_six_char_str -*graalpython.lib-python.3.test.test_tempfile.TestRandomNameSequence.test_many -*graalpython.lib-python.3.test.test_tempfile.TestRandomNameSequence.test_process_awareness -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_basic -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_bound_methods -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_class_getitem -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_context_manager_after_rollover -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_context_manager_before_rollover -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_context_manager_during_rollover -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_del_on_close -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_del_rolled_file -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_del_unrolled_file -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_fileno -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_iobase_interface -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_is_iobase -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_multiple_close_after_rollover -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_multiple_close_before_rollover -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_properties -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_rewrite_small -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_sparse -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_text_mode -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_text_newline_and_encoding -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_truncate_with_size_parameter -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_write_sequential -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_writelines -*graalpython.lib-python.3.test.test_tempfile.TestSpooledTemporaryFile.test_writelines_sequential -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryDirectory.test_cleanup_with_symlink_to_a_directory -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryDirectory.test_context_manager -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryDirectory.test_del_on_collection -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryDirectory.test_del_on_collection_ignore_errors -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryDirectory.test_del_on_shutdown -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryDirectory.test_del_on_shutdown_ignore_errors -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryDirectory.test_exit_on_shutdown -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryDirectory.test_explicit_cleanup -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryDirectory.test_explict_cleanup_ignore_errors -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryDirectory.test_flags -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryDirectory.test_mkdtemp_failure -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryDirectory.test_modes -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryDirectory.test_multiple_close -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryDirectory.test_warnings_on_cleanup -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryFile.test_bad_encoding -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryFile.test_bad_mode -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryFile.test_basic -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryFile.test_has_no_name -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryFile.test_mode_and_encoding -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryFile.test_multiple_close -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryFile.test_no_leak_fd -*graalpython.lib-python.3.test.test_tempfile.TestTemporaryFile.test_unexpected_error +test.test_tempfile.TestCandidateTempdirList.test_nonempty_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestCandidateTempdirList.test_wanted_dirs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestExports.test_exports @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestGetCandidateNames.test_retval @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestGetCandidateNames.test_same_thing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestGetDefaultTempdir.test_no_files_left_behind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestGetTempDir.test_case_sensitive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestGetTempDir.test_directory_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestGetTempDir.test_directory_writable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestGetTempDir.test_same_thing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestGetTempPrefix.test_sane_template @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestGetTempPrefix.test_usable_template @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestLowLevelInternals.test_infer_return_type_multiples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestLowLevelInternals.test_infer_return_type_multiples_and_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestLowLevelInternals.test_infer_return_type_pathlib @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestLowLevelInternals.test_infer_return_type_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestLowLevelInternals.test_infer_return_type_singles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkdtemp.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkdtemp.test_basic_many @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkdtemp.test_basic_with_bytes_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkdtemp.test_choose_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkdtemp.test_collision_with_existing_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkdtemp.test_collision_with_existing_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkdtemp.test_for_tempdir_is_bytes_issue40701_api_warts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkdtemp.test_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestMkdtemp.test_non_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkdtemp.test_nonexisting_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkdtemp.test_read_only_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestMkstemp.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkstemp.test_basic_with_bytes_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkstemp.test_choose_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkstemp.test_for_tempdir_is_bytes_issue40701_api_warts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkstempInner.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkstempInner.test_basic_many @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkstempInner.test_basic_with_bytes_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkstempInner.test_collision_with_existing_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkstempInner.test_collision_with_existing_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkstempInner.test_file_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestMkstempInner.test_non_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkstempInner.test_nonexisting_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestMkstempInner.test_read_only_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestNamedTemporaryFile.test_bad_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestNamedTemporaryFile.test_bad_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestNamedTemporaryFile.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestNamedTemporaryFile.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestNamedTemporaryFile.test_creates_named @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestNamedTemporaryFile.test_del_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestNamedTemporaryFile.test_dis_del_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestNamedTemporaryFile.test_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestNamedTemporaryFile.test_method_lookup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestNamedTemporaryFile.test_multiple_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestNamedTemporaryFile.test_unexpected_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestRandomNameSequence.test_get_eight_char_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestRandomNameSequence.test_many @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_bound_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_class_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_context_manager_after_rollover @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_context_manager_before_rollover @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_context_manager_during_rollover @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_del_on_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_del_rolled_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_del_unrolled_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_fileno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_iobase_interface @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_is_iobase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_multiple_close_after_rollover @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_multiple_close_before_rollover @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_properties @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_rewrite_small @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_sparse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_text_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_text_newline_and_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_truncate_with_size_parameter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_write_sequential @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_writelines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestSpooledTemporaryFile.test_writelines_sequential @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestTemporaryDirectory.test_cleanup_with_symlink_to_a_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestTemporaryDirectory.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestTemporaryDirectory.test_del_on_shutdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestTemporaryDirectory.test_del_on_shutdown_ignore_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestTemporaryDirectory.test_exit_on_shutdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestTemporaryDirectory.test_explicit_cleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestTemporaryDirectory.test_explict_cleanup_ignore_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestTemporaryDirectory.test_mkdtemp_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestTemporaryDirectory.test_modes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestTemporaryDirectory.test_multiple_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tempfile.TestTemporaryFile.test_bad_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestTemporaryFile.test_bad_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestTemporaryFile.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestTemporaryFile.test_has_no_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestTemporaryFile.test_mode_and_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestTemporaryFile.test_multiple_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tempfile.TestTemporaryFile.test_unexpected_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_termios.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_termios.txt index 091ac28036..687f310592 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_termios.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_termios.txt @@ -1,18 +1,18 @@ -*graalpython.lib-python.3.test.test_termios.TestFunctions.test_tcdrain -*graalpython.lib-python.3.test.test_termios.TestFunctions.test_tcdrain_errors -*graalpython.lib-python.3.test.test_termios.TestFunctions.test_tcflow -*graalpython.lib-python.3.test.test_termios.TestFunctions.test_tcflow_errors -*graalpython.lib-python.3.test.test_termios.TestFunctions.test_tcflush -*graalpython.lib-python.3.test.test_termios.TestFunctions.test_tcflush_errors -*graalpython.lib-python.3.test.test_termios.TestFunctions.test_tcgetattr -*graalpython.lib-python.3.test.test_termios.TestFunctions.test_tcgetattr_errors -*graalpython.lib-python.3.test.test_termios.TestFunctions.test_tcgetwinsize -*graalpython.lib-python.3.test.test_termios.TestFunctions.test_tcgetwinsize_errors -*graalpython.lib-python.3.test.test_termios.TestFunctions.test_tcsendbreak -*graalpython.lib-python.3.test.test_termios.TestFunctions.test_tcsendbreak_errors -*graalpython.lib-python.3.test.test_termios.TestFunctions.test_tcsetattr -*graalpython.lib-python.3.test.test_termios.TestFunctions.test_tcsetattr_errors -*graalpython.lib-python.3.test.test_termios.TestFunctions.test_tcsetwinsize -*graalpython.lib-python.3.test.test_termios.TestFunctions.test_tcsetwinsize_errors -*graalpython.lib-python.3.test.test_termios.TestModule.test_constants -*graalpython.lib-python.3.test.test_termios.TestModule.test_exception +test.test_termios.TestFunctions.test_tcdrain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_termios.TestFunctions.test_tcdrain_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_termios.TestFunctions.test_tcflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_termios.TestFunctions.test_tcflow_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_termios.TestFunctions.test_tcflush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_termios.TestFunctions.test_tcflush_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_termios.TestFunctions.test_tcgetattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_termios.TestFunctions.test_tcgetattr_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_termios.TestFunctions.test_tcgetwinsize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_termios.TestFunctions.test_tcgetwinsize_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_termios.TestFunctions.test_tcsendbreak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_termios.TestFunctions.test_tcsendbreak_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_termios.TestFunctions.test_tcsetattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_termios.TestFunctions.test_tcsetattr_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_termios.TestFunctions.test_tcsetwinsize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_termios.TestFunctions.test_tcsetwinsize_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_termios.TestModule.test_constants @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_termios.TestModule.test_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_textwrap.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_textwrap.txt index d7d15b8b14..6895899902 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_textwrap.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_textwrap.txt @@ -1,66 +1,66 @@ -*graalpython.lib-python.3.test.test_textwrap.DedentTestCase.test_dedent_declining -*graalpython.lib-python.3.test.test_textwrap.DedentTestCase.test_dedent_even -*graalpython.lib-python.3.test.test_textwrap.DedentTestCase.test_dedent_nomargin -*graalpython.lib-python.3.test.test_textwrap.DedentTestCase.test_dedent_preserve_internal_tabs -*graalpython.lib-python.3.test.test_textwrap.DedentTestCase.test_dedent_preserve_margin_tabs -*graalpython.lib-python.3.test.test_textwrap.DedentTestCase.test_dedent_uneven -*graalpython.lib-python.3.test.test_textwrap.IndentTestCase.test_indent_all_lines -*graalpython.lib-python.3.test.test_textwrap.IndentTestCase.test_indent_default -*graalpython.lib-python.3.test.test_textwrap.IndentTestCase.test_indent_empty_lines -*graalpython.lib-python.3.test.test_textwrap.IndentTestCase.test_indent_explicit_default -*graalpython.lib-python.3.test.test_textwrap.IndentTestCase.test_indent_no_lines -*graalpython.lib-python.3.test.test_textwrap.IndentTestCase.test_indent_nomargin_all_lines -*graalpython.lib-python.3.test.test_textwrap.IndentTestCase.test_indent_nomargin_default -*graalpython.lib-python.3.test.test_textwrap.IndentTestCase.test_indent_nomargin_explicit_default -*graalpython.lib-python.3.test.test_textwrap.IndentTestCase.test_roundtrip_mixed -*graalpython.lib-python.3.test.test_textwrap.IndentTestCase.test_roundtrip_spaces -*graalpython.lib-python.3.test.test_textwrap.IndentTestCase.test_roundtrip_tabs -*graalpython.lib-python.3.test.test_textwrap.IndentTestCases.test_fill -*graalpython.lib-python.3.test.test_textwrap.IndentTestCases.test_initial_indent -*graalpython.lib-python.3.test.test_textwrap.IndentTestCases.test_subsequent_indent -*graalpython.lib-python.3.test.test_textwrap.LongWordTestCase.test_break_long -*graalpython.lib-python.3.test.test_textwrap.LongWordTestCase.test_max_lines_long -*graalpython.lib-python.3.test.test_textwrap.LongWordTestCase.test_nobreak_long -*graalpython.lib-python.3.test.test_textwrap.LongWordWithHyphensTestCase.test_break_long_words_not_on_hyphen -*graalpython.lib-python.3.test.test_textwrap.LongWordWithHyphensTestCase.test_break_long_words_on_hyphen -*graalpython.lib-python.3.test.test_textwrap.LongWordWithHyphensTestCase.test_break_on_hyphen_but_not_long_words -*graalpython.lib-python.3.test.test_textwrap.LongWordWithHyphensTestCase.test_do_not_break_long_words_or_on_hyphens -*graalpython.lib-python.3.test.test_textwrap.MaxLinesTestCase.test_placeholder -*graalpython.lib-python.3.test.test_textwrap.MaxLinesTestCase.test_placeholder_backtrack -*graalpython.lib-python.3.test.test_textwrap.MaxLinesTestCase.test_simple -*graalpython.lib-python.3.test.test_textwrap.MaxLinesTestCase.test_spaces -*graalpython.lib-python.3.test.test_textwrap.ShortenTestCase.test_empty_string -*graalpython.lib-python.3.test.test_textwrap.ShortenTestCase.test_first_word_too_long_but_placeholder_fits -*graalpython.lib-python.3.test.test_textwrap.ShortenTestCase.test_placeholder -*graalpython.lib-python.3.test.test_textwrap.ShortenTestCase.test_simple -*graalpython.lib-python.3.test.test_textwrap.ShortenTestCase.test_whitespace -*graalpython.lib-python.3.test.test_textwrap.ShortenTestCase.test_width_too_small_for_placeholder -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_bad_width -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_break_on_hyphens -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_drop_whitespace_false -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_drop_whitespace_false_whitespace_only -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_drop_whitespace_false_whitespace_only_with_indent -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_drop_whitespace_leading_whitespace -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_drop_whitespace_whitespace_indent -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_drop_whitespace_whitespace_line -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_drop_whitespace_whitespace_only -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_drop_whitespace_whitespace_only_with_indent -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_em_dash -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_empty_string -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_empty_string_with_initial_indent -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_fix_sentence_endings -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_funky_hyphens -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_funky_parens -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_hyphenated -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_hyphenated_numbers -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_narrow_non_breaking_space -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_no_split_at_umlaut -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_non_breaking_space -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_punct_hyphens -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_simple -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_split -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_umlaut_followed_by_dash -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_unix_options -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_whitespace -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_wrap_short -*graalpython.lib-python.3.test.test_textwrap.WrapTestCase.test_wrap_short_1line +test.test_textwrap.DedentTestCase.test_dedent_declining @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.DedentTestCase.test_dedent_even @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.DedentTestCase.test_dedent_nomargin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.DedentTestCase.test_dedent_preserve_internal_tabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.DedentTestCase.test_dedent_preserve_margin_tabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.DedentTestCase.test_dedent_uneven @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.IndentTestCase.test_indent_all_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.IndentTestCase.test_indent_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.IndentTestCase.test_indent_empty_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.IndentTestCase.test_indent_explicit_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.IndentTestCase.test_indent_no_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.IndentTestCase.test_indent_nomargin_all_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.IndentTestCase.test_indent_nomargin_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.IndentTestCase.test_indent_nomargin_explicit_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.IndentTestCase.test_roundtrip_mixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.IndentTestCase.test_roundtrip_spaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.IndentTestCase.test_roundtrip_tabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.IndentTestCases.test_fill @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.IndentTestCases.test_initial_indent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.IndentTestCases.test_subsequent_indent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.LongWordTestCase.test_break_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.LongWordTestCase.test_max_lines_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.LongWordTestCase.test_nobreak_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.LongWordWithHyphensTestCase.test_break_long_words_not_on_hyphen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.LongWordWithHyphensTestCase.test_break_long_words_on_hyphen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.LongWordWithHyphensTestCase.test_break_on_hyphen_but_not_long_words @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.LongWordWithHyphensTestCase.test_do_not_break_long_words_or_on_hyphens @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.MaxLinesTestCase.test_placeholder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.MaxLinesTestCase.test_placeholder_backtrack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.MaxLinesTestCase.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.MaxLinesTestCase.test_spaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.ShortenTestCase.test_empty_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.ShortenTestCase.test_first_word_too_long_but_placeholder_fits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.ShortenTestCase.test_placeholder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.ShortenTestCase.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.ShortenTestCase.test_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.ShortenTestCase.test_width_too_small_for_placeholder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_bad_width @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_break_on_hyphens @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_drop_whitespace_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_drop_whitespace_false_whitespace_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_drop_whitespace_false_whitespace_only_with_indent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_drop_whitespace_leading_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_drop_whitespace_whitespace_indent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_drop_whitespace_whitespace_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_drop_whitespace_whitespace_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_drop_whitespace_whitespace_only_with_indent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_em_dash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_empty_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_empty_string_with_initial_indent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_fix_sentence_endings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_funky_hyphens @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_funky_parens @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_hyphenated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_hyphenated_numbers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_narrow_non_breaking_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_no_split_at_umlaut @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_non_breaking_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_punct_hyphens @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_umlaut_followed_by_dash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_unix_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_wrap_short @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_textwrap.WrapTestCase.test_wrap_short_1line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_thread.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_thread.txt index aec7b856b2..ac10dfaa95 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_thread.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_thread.txt @@ -1,24 +1,20 @@ -*graalpython.lib-python.3.test.test_thread.BarrierTest.test_barrier -*graalpython.lib-python.3.test.test_thread.LockTests.test_acquire_contended -*graalpython.lib-python.3.test.test_thread.LockTests.test_acquire_destroy -*graalpython.lib-python.3.test.test_thread.LockTests.test_acquire_release -*graalpython.lib-python.3.test.test_thread.LockTests.test_at_fork_reinit -*graalpython.lib-python.3.test.test_thread.LockTests.test_constructor -*graalpython.lib-python.3.test.test_thread.LockTests.test_different_thread -*graalpython.lib-python.3.test.test_thread.LockTests.test_locked_repr -*graalpython.lib-python.3.test.test_thread.LockTests.test_reacquire -*graalpython.lib-python.3.test.test_thread.LockTests.test_repr -*graalpython.lib-python.3.test.test_thread.LockTests.test_state_after_timeout -*graalpython.lib-python.3.test.test_thread.LockTests.test_thread_leak -*graalpython.lib-python.3.test.test_thread.LockTests.test_timeout -*graalpython.lib-python.3.test.test_thread.LockTests.test_try_acquire -*graalpython.lib-python.3.test.test_thread.LockTests.test_try_acquire_contended -*graalpython.lib-python.3.test.test_thread.LockTests.test_weakref_deleted -*graalpython.lib-python.3.test.test_thread.LockTests.test_weakref_exists -*graalpython.lib-python.3.test.test_thread.LockTests.test_with -*graalpython.lib-python.3.test.test_thread.TestForkInThread.test_forkinthread -*graalpython.lib-python.3.test.test_thread.ThreadRunningTests.test__count -*graalpython.lib-python.3.test.test_thread.ThreadRunningTests.test_nt_and_posix_stack_size -*graalpython.lib-python.3.test.test_thread.ThreadRunningTests.test_stack_size -*graalpython.lib-python.3.test.test_thread.ThreadRunningTests.test_starting_threads -*graalpython.lib-python.3.test.test_thread.ThreadRunningTests.test_unraisable_exception +test.test_thread.BarrierTest.test_barrier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.LockTests.test_acquire_contended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.LockTests.test_acquire_destroy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.LockTests.test_acquire_release @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.LockTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.LockTests.test_different_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.LockTests.test_locked_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.LockTests.test_reacquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.LockTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.LockTests.test_state_after_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.LockTests.test_thread_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.LockTests.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.LockTests.test_try_acquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.LockTests.test_try_acquire_contended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.LockTests.test_weakref_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.LockTests.test_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.ThreadRunningTests.test__count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.ThreadRunningTests.test_nt_and_posix_stack_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.ThreadRunningTests.test_stack_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_thread.ThreadRunningTests.test_starting_threads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_threadedtempfile.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_threadedtempfile.txt index 4049dcb1b8..db353a08d8 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_threadedtempfile.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_threadedtempfile.txt @@ -1 +1 @@ -*graalpython.lib-python.3.test.test_threadedtempfile.ThreadedTempFileTest.test_main +test.test_threadedtempfile.ThreadedTempFileTest.test_main @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_threading.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_threading.txt index a720efa0c5..fdd233cba0 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_threading.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_threading.txt @@ -1,186 +1,162 @@ -*graalpython.lib-python.3.test.test_threading.AtexitTests.test_atexit_called_once -*graalpython.lib-python.3.test.test_threading.AtexitTests.test_atexit_output -*graalpython.lib-python.3.test.test_threading.BarrierTests.test_abort -*graalpython.lib-python.3.test.test_threading.BarrierTests.test_abort_and_reset -*graalpython.lib-python.3.test.test_threading.BarrierTests.test_action -*graalpython.lib-python.3.test.test_threading.BarrierTests.test_barrier -*graalpython.lib-python.3.test.test_threading.BarrierTests.test_barrier_10 -*graalpython.lib-python.3.test.test_threading.BarrierTests.test_default_timeout -*graalpython.lib-python.3.test.test_threading.BarrierTests.test_repr -*graalpython.lib-python.3.test.test_threading.BarrierTests.test_reset -*graalpython.lib-python.3.test.test_threading.BarrierTests.test_single_thread -*graalpython.lib-python.3.test.test_threading.BarrierTests.test_timeout -*graalpython.lib-python.3.test.test_threading.BarrierTests.test_wait_return -*graalpython.lib-python.3.test.test_threading.BoundedSemaphoreTests.test_acquire -*graalpython.lib-python.3.test.test_threading.BoundedSemaphoreTests.test_acquire_contended -*graalpython.lib-python.3.test.test_threading.BoundedSemaphoreTests.test_acquire_destroy -*graalpython.lib-python.3.test.test_threading.BoundedSemaphoreTests.test_acquire_timeout -*graalpython.lib-python.3.test.test_threading.BoundedSemaphoreTests.test_constructor -*graalpython.lib-python.3.test.test_threading.BoundedSemaphoreTests.test_default_value -*graalpython.lib-python.3.test.test_threading.BoundedSemaphoreTests.test_multirelease -*graalpython.lib-python.3.test.test_threading.BoundedSemaphoreTests.test_release_unacquired -*graalpython.lib-python.3.test.test_threading.BoundedSemaphoreTests.test_repr -*graalpython.lib-python.3.test.test_threading.BoundedSemaphoreTests.test_try_acquire -*graalpython.lib-python.3.test.test_threading.BoundedSemaphoreTests.test_try_acquire_contended -*graalpython.lib-python.3.test.test_threading.BoundedSemaphoreTests.test_with -*graalpython.lib-python.3.test.test_threading.CRLockTests.test__is_owned -*graalpython.lib-python.3.test.test_threading.CRLockTests.test_acquire_contended -*graalpython.lib-python.3.test.test_threading.CRLockTests.test_acquire_destroy -*graalpython.lib-python.3.test.test_threading.CRLockTests.test_acquire_release -*graalpython.lib-python.3.test.test_threading.CRLockTests.test_constructor -*graalpython.lib-python.3.test.test_threading.CRLockTests.test_different_thread -*graalpython.lib-python.3.test.test_threading.CRLockTests.test_locked_repr -*graalpython.lib-python.3.test.test_threading.CRLockTests.test_reacquire -*graalpython.lib-python.3.test.test_threading.CRLockTests.test_recursion_count -*graalpython.lib-python.3.test.test_threading.CRLockTests.test_release_save_unacquired -*graalpython.lib-python.3.test.test_threading.CRLockTests.test_release_unacquired -*graalpython.lib-python.3.test.test_threading.CRLockTests.test_repr -*graalpython.lib-python.3.test.test_threading.CRLockTests.test_thread_leak -*graalpython.lib-python.3.test.test_threading.CRLockTests.test_timeout -*graalpython.lib-python.3.test.test_threading.CRLockTests.test_try_acquire -*graalpython.lib-python.3.test.test_threading.CRLockTests.test_try_acquire_contended -*graalpython.lib-python.3.test.test_threading.CRLockTests.test_weakref_deleted -*graalpython.lib-python.3.test.test_threading.CRLockTests.test_weakref_exists -*graalpython.lib-python.3.test.test_threading.CRLockTests.test_with -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test__is_owned -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test_acquire_contended -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test_acquire_destroy -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test_acquire_release -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test_constructor -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test_different_thread -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test_locked_repr -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test_reacquire -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test_recursion_count -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test_release_save_unacquired -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test_release_unacquired -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test_repr -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test_thread_leak -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test_timeout -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test_try_acquire -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test_try_acquire_contended -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test_weakref_deleted -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test_weakref_exists -*graalpython.lib-python.3.test.test_threading.ConditionAsRLockTests.test_with -*graalpython.lib-python.3.test.test_threading.ConditionTests.test_acquire -*graalpython.lib-python.3.test.test_threading.ConditionTests.test_notify -*graalpython.lib-python.3.test.test_threading.ConditionTests.test_timeout -*graalpython.lib-python.3.test.test_threading.ConditionTests.test_unacquired_notify -*graalpython.lib-python.3.test.test_threading.ConditionTests.test_unacquired_wait -*graalpython.lib-python.3.test.test_threading.ConditionTests.test_waitfor -*graalpython.lib-python.3.test.test_threading.ConditionTests.test_waitfor_timeout -*graalpython.lib-python.3.test.test_threading.EventTests.test_at_fork_reinit -*graalpython.lib-python.3.test.test_threading.EventTests.test_is_set -*graalpython.lib-python.3.test.test_threading.EventTests.test_notify -*graalpython.lib-python.3.test.test_threading.EventTests.test_repr -*graalpython.lib-python.3.test.test_threading.EventTests.test_reset_internal_locks -*graalpython.lib-python.3.test.test_threading.EventTests.test_set_and_clear -*graalpython.lib-python.3.test.test_threading.EventTests.test_timeout -*graalpython.lib-python.3.test.test_threading.ExceptHookTests.test_custom_excepthook -*graalpython.lib-python.3.test.test_threading.ExceptHookTests.test_custom_excepthook_fail -*graalpython.lib-python.3.test.test_threading.ExceptHookTests.test_excepthook -*graalpython.lib-python.3.test.test_threading.ExceptHookTests.test_excepthook_thread_None -*graalpython.lib-python.3.test.test_threading.ExceptHookTests.test_original_excepthook -*graalpython.lib-python.3.test.test_threading.ExceptHookTests.test_system_exit -*graalpython.lib-python.3.test.test_threading.InterruptMainTests.test_can_interrupt_tight_loops -*graalpython.lib-python.3.test.test_threading.InterruptMainTests.test_interrupt_main_noerror -*graalpython.lib-python.3.test.test_threading.LockTests.test_acquire_contended -*graalpython.lib-python.3.test.test_threading.LockTests.test_acquire_destroy -*graalpython.lib-python.3.test.test_threading.LockTests.test_acquire_release -*graalpython.lib-python.3.test.test_threading.LockTests.test_at_fork_reinit -*graalpython.lib-python.3.test.test_threading.LockTests.test_constructor -*graalpython.lib-python.3.test.test_threading.LockTests.test_different_thread -*graalpython.lib-python.3.test.test_threading.LockTests.test_locked_repr -*graalpython.lib-python.3.test.test_threading.LockTests.test_reacquire -*graalpython.lib-python.3.test.test_threading.LockTests.test_repr -*graalpython.lib-python.3.test.test_threading.LockTests.test_state_after_timeout -*graalpython.lib-python.3.test.test_threading.LockTests.test_thread_leak -*graalpython.lib-python.3.test.test_threading.LockTests.test_timeout -*graalpython.lib-python.3.test.test_threading.LockTests.test_try_acquire -*graalpython.lib-python.3.test.test_threading.LockTests.test_try_acquire_contended -*graalpython.lib-python.3.test.test_threading.LockTests.test_weakref_deleted -*graalpython.lib-python.3.test.test_threading.LockTests.test_weakref_exists -*graalpython.lib-python.3.test.test_threading.LockTests.test_with -*graalpython.lib-python.3.test.test_threading.MiscTestCase.test__all__ -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test__is_owned -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test_acquire_contended -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test_acquire_destroy -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test_acquire_release -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test_constructor -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test_different_thread -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test_locked_repr -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test_reacquire -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test_recursion_count -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test_release_save_unacquired -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test_release_unacquired -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test_repr -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test_thread_leak -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test_timeout -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test_try_acquire -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test_try_acquire_contended -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test_weakref_deleted -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test_weakref_exists -*graalpython.lib-python.3.test.test_threading.PyRLockTests.test_with -*graalpython.lib-python.3.test.test_threading.SemaphoreTests.test_acquire -*graalpython.lib-python.3.test.test_threading.SemaphoreTests.test_acquire_contended -*graalpython.lib-python.3.test.test_threading.SemaphoreTests.test_acquire_destroy -*graalpython.lib-python.3.test.test_threading.SemaphoreTests.test_acquire_timeout -*graalpython.lib-python.3.test.test_threading.SemaphoreTests.test_constructor -*graalpython.lib-python.3.test.test_threading.SemaphoreTests.test_default_value -*graalpython.lib-python.3.test.test_threading.SemaphoreTests.test_multirelease -*graalpython.lib-python.3.test.test_threading.SemaphoreTests.test_release_unacquired -*graalpython.lib-python.3.test.test_threading.SemaphoreTests.test_repr -*graalpython.lib-python.3.test.test_threading.SemaphoreTests.test_try_acquire -*graalpython.lib-python.3.test.test_threading.SemaphoreTests.test_try_acquire_contended -*graalpython.lib-python.3.test.test_threading.SemaphoreTests.test_with -*graalpython.lib-python.3.test.test_threading.SubinterpThreadingTests.test_daemon_threads_fatal_error -*graalpython.lib-python.3.test.test_threading.ThreadJoinOnShutdown.test_2_join_in_forked_process -*graalpython.lib-python.3.test.test_threading.ThreadJoinOnShutdown.test_3_join_in_forked_from_thread -*graalpython.lib-python.3.test.test_threading.ThreadJoinOnShutdown.test_4_daemon_threads -*graalpython.lib-python.3.test.test_threading.ThreadJoinOnShutdown.test_clear_threads_states_after_fork -*graalpython.lib-python.3.test.test_threading.ThreadJoinOnShutdown.test_reinit_tls_after_fork -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_BoundedSemaphore_limit -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_PyThreadState_SetAsyncExc -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_args_argument -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_boolean_target -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_daemon_param -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_debug_deprecation -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_disallow_instantiation -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_dummy_thread_after_fork -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_enumerate_after_join -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_finalization_shutdown -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_finalize_running_thread -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_finalize_runnning_thread -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_finalize_with_trace -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_foreign_thread -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_fork_at_exit -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_frame_tstate_tracing -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_getprofile -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_gettrace -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_ident_of_no_threading_threads -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_import_from_another_thread -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_is_alive_after_fork -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_join_nondaemon_on_shutdown -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_leak_without_join -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_limbo_cleanup -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_main_thread -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_main_thread_after_fork -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_main_thread_after_fork_from_nonmain_thread -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_main_thread_during_shutdown -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_name -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_no_refcycle_through_target -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_old_threading_api -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_repr_daemon -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_repr_stopped -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_shutdown_locks -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_tstate_lock -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_various_ops -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_various_ops_large_stack -*graalpython.lib-python.3.test.test_threading.ThreadTests.test_various_ops_small_stack -*graalpython.lib-python.3.test.test_threading.ThreadingExceptionTests.test_bare_raise_in_brand_new_thread -*graalpython.lib-python.3.test.test_threading.ThreadingExceptionTests.test_daemonize_active_thread -*graalpython.lib-python.3.test.test_threading.ThreadingExceptionTests.test_joining_current_thread -*graalpython.lib-python.3.test.test_threading.ThreadingExceptionTests.test_joining_inactive_thread -*graalpython.lib-python.3.test.test_threading.ThreadingExceptionTests.test_multithread_modify_file_noerror -*graalpython.lib-python.3.test.test_threading.ThreadingExceptionTests.test_recursion_limit -*graalpython.lib-python.3.test.test_threading.ThreadingExceptionTests.test_start_thread_again -*graalpython.lib-python.3.test.test_threading.TimerTests.test_init_immutable_default_args +test.test_threading.AtexitTests.test_atexit_called_once @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.AtexitTests.test_atexit_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BarrierTests.test_abort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BarrierTests.test_abort_and_reset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BarrierTests.test_action @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BarrierTests.test_barrier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BarrierTests.test_barrier_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BarrierTests.test_default_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BarrierTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BarrierTests.test_reset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BarrierTests.test_single_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BarrierTests.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BarrierTests.test_wait_return @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BoundedSemaphoreTests.test_acquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BoundedSemaphoreTests.test_acquire_contended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BoundedSemaphoreTests.test_acquire_destroy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BoundedSemaphoreTests.test_acquire_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BoundedSemaphoreTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BoundedSemaphoreTests.test_default_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BoundedSemaphoreTests.test_multirelease @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BoundedSemaphoreTests.test_release_unacquired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BoundedSemaphoreTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BoundedSemaphoreTests.test_try_acquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BoundedSemaphoreTests.test_try_acquire_contended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.BoundedSemaphoreTests.test_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.CRLockTests.test__is_owned @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.CRLockTests.test_acquire_contended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.CRLockTests.test_acquire_destroy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.CRLockTests.test_acquire_release @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.CRLockTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.CRLockTests.test_different_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.CRLockTests.test_locked_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.CRLockTests.test_reacquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.CRLockTests.test_recursion_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.CRLockTests.test_release_save_unacquired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.CRLockTests.test_release_unacquired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.CRLockTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.CRLockTests.test_thread_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.CRLockTests.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.CRLockTests.test_try_acquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.CRLockTests.test_try_acquire_contended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.CRLockTests.test_weakref_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.CRLockTests.test_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionAsRLockTests.test__is_owned @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionAsRLockTests.test_acquire_contended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionAsRLockTests.test_acquire_destroy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionAsRLockTests.test_acquire_release @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionAsRLockTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionAsRLockTests.test_different_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionAsRLockTests.test_locked_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionAsRLockTests.test_reacquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionAsRLockTests.test_release_save_unacquired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionAsRLockTests.test_release_unacquired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionAsRLockTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionAsRLockTests.test_thread_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionAsRLockTests.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionAsRLockTests.test_try_acquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionAsRLockTests.test_try_acquire_contended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionAsRLockTests.test_weakref_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionAsRLockTests.test_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionTests.test_acquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionTests.test_notify @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionTests.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionTests.test_unacquired_notify @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionTests.test_unacquired_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionTests.test_waitfor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ConditionTests.test_waitfor_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.EventTests.test_is_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.EventTests.test_notify @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.EventTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.EventTests.test_set_and_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.EventTests.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ExceptHookTests.test_custom_excepthook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ExceptHookTests.test_custom_excepthook_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ExceptHookTests.test_excepthook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ExceptHookTests.test_original_excepthook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ExceptHookTests.test_system_exit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Transient on Darwin (at least) +!test.test_threading.InterruptMainTests.test_can_interrupt_tight_loops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.InterruptMainTests.test_interrupt_main_noerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.LockTests.test_acquire_contended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.LockTests.test_acquire_destroy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.LockTests.test_acquire_release @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.LockTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.LockTests.test_different_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.LockTests.test_locked_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.LockTests.test_reacquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.LockTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.LockTests.test_state_after_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.LockTests.test_thread_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.LockTests.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.LockTests.test_try_acquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.LockTests.test_try_acquire_contended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.LockTests.test_weakref_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.LockTests.test_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.MiscTestCase.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.PyRLockTests.test__is_owned @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.PyRLockTests.test_acquire_contended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.PyRLockTests.test_acquire_destroy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.PyRLockTests.test_acquire_release @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.PyRLockTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.PyRLockTests.test_different_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.PyRLockTests.test_locked_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.PyRLockTests.test_reacquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.PyRLockTests.test_recursion_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.PyRLockTests.test_release_save_unacquired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.PyRLockTests.test_release_unacquired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.PyRLockTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.PyRLockTests.test_thread_leak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.PyRLockTests.test_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.PyRLockTests.test_try_acquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.PyRLockTests.test_try_acquire_contended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.PyRLockTests.test_weakref_exists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.PyRLockTests.test_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.SemaphoreTests.test_acquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.SemaphoreTests.test_acquire_contended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.SemaphoreTests.test_acquire_destroy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.SemaphoreTests.test_acquire_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.SemaphoreTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.SemaphoreTests.test_default_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.SemaphoreTests.test_multirelease @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.SemaphoreTests.test_release_unacquired @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.SemaphoreTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.SemaphoreTests.test_try_acquire @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.SemaphoreTests.test_try_acquire_contended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.SemaphoreTests.test_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Can transiently fail with java.lang.AssertionError: The TruffleContext must be entered +!test.test_threading.ThreadJoinOnShutdown.test_1_join_on_shutdown @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_threading.ThreadJoinOnShutdown.test_4_daemon_threads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_threading.ThreadTests.test_BoundedSemaphore_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_args_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_boolean_target @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_daemon_param @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_enumerate_after_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_finalization_shutdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_finalize_with_trace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_foreign_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_getprofile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_gettrace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_ident_of_no_threading_threads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_import_from_another_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_join_nondaemon_on_shutdown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_leak_without_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_limbo_cleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_main_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_old_threading_api @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_repr_daemon @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_repr_stopped @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_tstate_lock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_various_ops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_various_ops_large_stack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadTests.test_various_ops_small_stack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadingExceptionTests.test_bare_raise_in_brand_new_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadingExceptionTests.test_daemonize_active_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadingExceptionTests.test_joining_current_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadingExceptionTests.test_joining_inactive_thread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadingExceptionTests.test_multithread_modify_file_noerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadingExceptionTests.test_print_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadingExceptionTests.test_print_exception_stderr_is_none_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadingExceptionTests.test_print_exception_stderr_is_none_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.ThreadingExceptionTests.test_start_thread_again @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading.TimerTests.test_init_immutable_default_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_threading_local.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_threading_local.txt index 23b54dc531..f8ac86ecd6 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_threading_local.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_threading_local.txt @@ -1,21 +1,15 @@ -*graalpython.lib-python.3.test.test_threading_local.PyThreadingLocalTest.test_arguments -*graalpython.lib-python.3.test.test_threading_local.PyThreadingLocalTest.test_cycle_collection -*graalpython.lib-python.3.test.test_threading_local.PyThreadingLocalTest.test_derived -*graalpython.lib-python.3.test.test_threading_local.PyThreadingLocalTest.test_derived_cycle_dealloc -*graalpython.lib-python.3.test.test_threading_local.PyThreadingLocalTest.test_dict_attribute -*graalpython.lib-python.3.test.test_threading_local.PyThreadingLocalTest.test_dict_attribute_subclass -*graalpython.lib-python.3.test.test_threading_local.PyThreadingLocalTest.test_local_refs -*graalpython.lib-python.3.test.test_threading_local.PyThreadingLocalTest.test_threading_local -*graalpython.lib-python.3.test.test_threading_local.PyThreadingLocalTest.test_threading_local_clear_race -*graalpython.lib-python.3.test.test_threading_local.PyThreadingLocalTest.test_threading_local_subclass -*graalpython.lib-python.3.test.test_threading_local.TestMain.test_main -*graalpython.lib-python.3.test.test_threading_local.ThreadLocalTest.test_arguments -*graalpython.lib-python.3.test.test_threading_local.ThreadLocalTest.test_cycle_collection -*graalpython.lib-python.3.test.test_threading_local.ThreadLocalTest.test_derived -*graalpython.lib-python.3.test.test_threading_local.ThreadLocalTest.test_derived_cycle_dealloc -*graalpython.lib-python.3.test.test_threading_local.ThreadLocalTest.test_dict_attribute -*graalpython.lib-python.3.test.test_threading_local.ThreadLocalTest.test_dict_attribute_subclass -*graalpython.lib-python.3.test.test_threading_local.ThreadLocalTest.test_local_refs -*graalpython.lib-python.3.test.test_threading_local.ThreadLocalTest.test_threading_local -*graalpython.lib-python.3.test.test_threading_local.ThreadLocalTest.test_threading_local_clear_race -*graalpython.lib-python.3.test.test_threading_local.ThreadLocalTest.test_threading_local_subclass +DocTestCase._threading_local @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading_local.PyThreadingLocalTest.test_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading_local.PyThreadingLocalTest.test_derived @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading_local.PyThreadingLocalTest.test_derived_cycle_dealloc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading_local.PyThreadingLocalTest.test_dict_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading_local.PyThreadingLocalTest.test_dict_attribute_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading_local.PyThreadingLocalTest.test_threading_local @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading_local.PyThreadingLocalTest.test_threading_local_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading_local.ThreadLocalTest.test_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading_local.ThreadLocalTest.test_derived @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading_local.ThreadLocalTest.test_derived_cycle_dealloc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading_local.ThreadLocalTest.test_dict_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading_local.ThreadLocalTest.test_dict_attribute_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading_local.ThreadLocalTest.test_threading_local @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_threading_local.ThreadLocalTest.test_threading_local_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_threadsignals.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_threadsignals.txt index 486c15eb4e..cf6bcd1b3b 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_threadsignals.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_threadsignals.txt @@ -1,5 +1,7 @@ -*graalpython.lib-python.3.test.test_threadsignals.ThreadSignals.test_lock_acquire_interruption -*graalpython.lib-python.3.test.test_threadsignals.ThreadSignals.test_lock_acquire_retries_on_intr -*graalpython.lib-python.3.test.test_threadsignals.ThreadSignals.test_rlock_acquire_interruption -*graalpython.lib-python.3.test.test_threadsignals.ThreadSignals.test_rlock_acquire_retries_on_intr -*graalpython.lib-python.3.test.test_threadsignals.ThreadSignals.test_signals +# Too dependent on timings +!test.test_threadsignals.ThreadSignals.test_interrupted_timed_acquire +test.test_threadsignals.ThreadSignals.test_lock_acquire_interruption @ darwin-arm64,darwin-x86_64 +test.test_threadsignals.ThreadSignals.test_lock_acquire_retries_on_intr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_threadsignals.ThreadSignals.test_rlock_acquire_interruption @ darwin-arm64,darwin-x86_64 +test.test_threadsignals.ThreadSignals.test_rlock_acquire_retries_on_intr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_threadsignals.ThreadSignals.test_signals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_time.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_time.txt index 3d9b52f5b4..649d8d61f4 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_time.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_time.txt @@ -1,55 +1,35 @@ -*graalpython.lib-python.3.test.test_time.TestAsctime4dyear.test_large_year -*graalpython.lib-python.3.test.test_time.TestAsctime4dyear.test_negative -*graalpython.lib-python.3.test.test_time.TestAsctime4dyear.test_year -*graalpython.lib-python.3.test.test_time.TestCPyTime.test_AsMicroseconds -*graalpython.lib-python.3.test.test_time.TestCPyTime.test_AsMilliseconds -*graalpython.lib-python.3.test.test_time.TestCPyTime.test_AsSecondsDouble -*graalpython.lib-python.3.test.test_time.TestCPyTime.test_AsTimespec -*graalpython.lib-python.3.test.test_time.TestCPyTime.test_AsTimespec_clamp -*graalpython.lib-python.3.test.test_time.TestCPyTime.test_AsTimeval -*graalpython.lib-python.3.test.test_time.TestCPyTime.test_AsTimeval_clamp -*graalpython.lib-python.3.test.test_time.TestCPyTime.test_FromSeconds -*graalpython.lib-python.3.test.test_time.TestCPyTime.test_FromSecondsObject -*graalpython.lib-python.3.test.test_time.TestLocale.test_bug_3061 -*graalpython.lib-python.3.test.test_time.TestOldPyTime.test_object_to_time_t -*graalpython.lib-python.3.test.test_time.TestOldPyTime.test_object_to_timespec -*graalpython.lib-python.3.test.test_time.TestOldPyTime.test_object_to_timeval -*graalpython.lib-python.3.test.test_time.TestPytime.test_localtime_timezone -*graalpython.lib-python.3.test.test_time.TestPytime.test_short_times -*graalpython.lib-python.3.test.test_time.TestStrftime4dyear.test_large_year -*graalpython.lib-python.3.test.test_time.TestStrftime4dyear.test_negative -*graalpython.lib-python.3.test.test_time.TestStrftime4dyear.test_year -*graalpython.lib-python.3.test.test_time.TestTimeWeaklinking.test_clock_functions -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_asctime -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_asctime_bounding_check -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_clock_getres -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_clock_monotonic -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_clock_realtime -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_clock_settime -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_conversions -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_ctime -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_ctime_without_arg -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_data_attributes -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_default_values_for_zero -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_epoch -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_get_clock_info -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_gmtime_without_arg -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_insane_timestamps -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_localtime_failure -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_localtime_without_arg -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_mktime -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_mktime_error -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_monotonic -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_monotonic_settime -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_perf_counter -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_process_time -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_pthread_getcpuclockid -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_sleep -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_strftime -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_strftime_bounding_check -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_strftime_format_check -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_strptime_bytes -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_strptime_exception_context -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_thread_time -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_time -*graalpython.lib-python.3.test.test_time.TimeTestCase.test_time_ns_type +test.test_time.TestAsctime4dyear.test_large_year @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TestAsctime4dyear.test_negative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TestAsctime4dyear.test_year @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TestLocale.test_bug_3061 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TestPytime.test_localtime_timezone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TestPytime.test_short_times @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TestPytime.test_strptime_timezone @ darwin-arm64,darwin-x86_64,win32-AMD64 +test.test_time.TestStrftime4dyear.test_large_year @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TestStrftime4dyear.test_negative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TestStrftime4dyear.test_year @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_asctime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_asctime_bounding_check @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_conversions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_ctime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_ctime_without_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_data_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_default_values_for_zero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_epoch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_get_clock_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_insane_timestamps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_mktime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_mktime_error @ darwin-arm64,darwin-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_monotonic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_perf_counter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_process_time @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_sleep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_strftime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_strftime_bounding_check @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_strftime_format_check @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_strptime @ darwin-arm64,darwin-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_strptime_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_strptime_exception_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_thread_time @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_time @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_time.TimeTestCase.test_time_ns_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_timeit.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_timeit.txt index 71f82f2cdf..10da5d41e4 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_timeit.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_timeit.txt @@ -1,41 +1,41 @@ -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_autorange -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_autorange_second -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_autorange_with_callback -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_main_bad_switch -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_main_exception -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_main_exception_fixed_reps -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_main_fixed_iters -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_main_fixed_reps -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_main_help -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_main_microseconds -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_main_milliseconds -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_main_multiple_setups -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_main_negative_reps -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_main_seconds -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_main_setup -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_main_verbose -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_main_very_verbose -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_main_with_time_unit -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_print_exc -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_reindent_empty -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_reindent_multi -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_reindent_multi_empty -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_reindent_single -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_repeat_callable_setup -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_repeat_callable_stmt -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_repeat_callable_stmt_and_setup -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_repeat_few_reps_and_iters -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_repeat_function_zero_iters -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_repeat_function_zero_reps -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_repeat_zero_iters -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_repeat_zero_reps -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_timeit_callable_setup -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_timeit_callable_stmt -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_timeit_callable_stmt_and_setup -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_timeit_few_iters -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_timeit_function_zero_iters -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_timeit_globals_args -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_timeit_zero_iters -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_timer_empty_stmt -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_timer_invalid_setup -*graalpython.lib-python.3.test.test_timeit.TestTimeit.test_timer_invalid_stmt +test.test_timeit.TestTimeit.test_autorange @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_autorange_second @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_autorange_with_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_main_bad_switch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_main_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_main_exception_fixed_reps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_main_fixed_iters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_main_fixed_reps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_main_help @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_main_microseconds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_main_milliseconds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_main_multiple_setups @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_main_negative_reps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_main_seconds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_main_setup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_main_verbose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_main_very_verbose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_main_with_time_unit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_print_exc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_reindent_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_reindent_multi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_reindent_multi_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_reindent_single @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_repeat_callable_setup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_repeat_callable_stmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_repeat_callable_stmt_and_setup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_repeat_few_reps_and_iters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_repeat_function_zero_iters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_repeat_function_zero_reps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_repeat_zero_iters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_repeat_zero_reps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_timeit_callable_setup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_timeit_callable_stmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_timeit_callable_stmt_and_setup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_timeit_few_iters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_timeit_function_zero_iters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_timeit_globals_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_timeit_zero_iters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_timer_empty_stmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_timer_invalid_setup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeit.TestTimeit.test_timer_invalid_stmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_timeout.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_timeout.txt index c345f3478d..117de6eead 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_timeout.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_timeout.txt @@ -1,15 +1,12 @@ -*graalpython.lib-python.3.test.test_timeout.CreationTestCase.testBlockingThenTimeout -*graalpython.lib-python.3.test.test_timeout.CreationTestCase.testFloatReturnValue -*graalpython.lib-python.3.test.test_timeout.CreationTestCase.testObjectCreation -*graalpython.lib-python.3.test.test_timeout.CreationTestCase.testRangeCheck -*graalpython.lib-python.3.test.test_timeout.CreationTestCase.testReturnType -*graalpython.lib-python.3.test.test_timeout.CreationTestCase.testTimeoutThenBlocking -*graalpython.lib-python.3.test.test_timeout.CreationTestCase.testTypeCheck -*graalpython.lib-python.3.test.test_timeout.TCPTimeoutTestCase.testAcceptTimeout -*graalpython.lib-python.3.test.test_timeout.TCPTimeoutTestCase.testConnectTimeout -*graalpython.lib-python.3.test.test_timeout.TCPTimeoutTestCase.testRecvTimeout -*graalpython.lib-python.3.test.test_timeout.TCPTimeoutTestCase.testSend -*graalpython.lib-python.3.test.test_timeout.TCPTimeoutTestCase.testSendall -*graalpython.lib-python.3.test.test_timeout.TCPTimeoutTestCase.testSendto -*graalpython.lib-python.3.test.test_timeout.TestMain.test_main -*graalpython.lib-python.3.test.test_timeout.UDPTimeoutTestCase.testRecvfromTimeout +test.test_timeout.CreationTestCase.testBlockingThenTimeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeout.CreationTestCase.testFloatReturnValue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeout.CreationTestCase.testObjectCreation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeout.CreationTestCase.testRangeCheck @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeout.CreationTestCase.testReturnType @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeout.CreationTestCase.testTimeoutThenBlocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeout.CreationTestCase.testTypeCheck @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_timeout.TCPTimeoutTestCase.testAcceptTimeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_timeout.TCPTimeoutTestCase.testSend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_timeout.TCPTimeoutTestCase.testSendall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_timeout.TCPTimeoutTestCase.testSendto @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_timeout.UDPTimeoutTestCase.testRecvfromTimeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tokenize.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tokenize.txt index 592d928b57..dc122d43bf 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tokenize.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tokenize.txt @@ -1,95 +1,95 @@ -*graalpython.lib-python.3.test.test_tokenize.CTokenizeTest.test_additive -*graalpython.lib-python.3.test.test_tokenize.CTokenizeTest.test_async -*graalpython.lib-python.3.test.test_tokenize.CTokenizeTest.test_comparison -*graalpython.lib-python.3.test.test_tokenize.CTokenizeTest.test_continuation_lines_indentation -*graalpython.lib-python.3.test.test_tokenize.CTokenizeTest.test_float -*graalpython.lib-python.3.test.test_tokenize.CTokenizeTest.test_function -*graalpython.lib-python.3.test.test_tokenize.CTokenizeTest.test_int -*graalpython.lib-python.3.test.test_tokenize.CTokenizeTest.test_invalid_syntax -*graalpython.lib-python.3.test.test_tokenize.CTokenizeTest.test_max_indent -*graalpython.lib-python.3.test.test_tokenize.CTokenizeTest.test_method -*graalpython.lib-python.3.test.test_tokenize.CTokenizeTest.test_multiplicative -*graalpython.lib-python.3.test.test_tokenize.CTokenizeTest.test_selector -*graalpython.lib-python.3.test.test_tokenize.CTokenizeTest.test_string -*graalpython.lib-python.3.test.test_tokenize.CTokenizeTest.test_tabs -*graalpython.lib-python.3.test.test_tokenize.CTokenizeTest.test_unary -*graalpython.lib-python.3.test.test_tokenize.CTokenizerBufferTests.test_newline_at_the_end_of_buffer -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_additive -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_async -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_basic -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_comparison -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_float -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_function -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_implicit_newline -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_int -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_long -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_method -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_multiplicative -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_non_ascii_identifiers -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_selector -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_shift -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_string -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_tabs -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_unary -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_underscore_literals -*graalpython.lib-python.3.test.test_tokenize.GenerateTokensTest.test_unicode -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_bom_no_cookie -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_cookie_first_line_no_bom -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_cookie_second_line_commented_first_line -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_cookie_second_line_empty_first_line -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_cookie_second_line_no_bom -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_cookie_second_line_noncommented_first_line -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_false_encoding -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_filename_in_exception -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_latin1_normalization -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_matched_bom_and_cookie_first_line -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_matched_bom_and_cookie_second_line -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_mismatched_bom_and_cookie_first_line_raises_syntaxerror -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_mismatched_bom_and_cookie_second_line_raises_syntaxerror -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_no_bom_no_encoding_cookie -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_open -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_open_error -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_short_files -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_syntaxerror_latin1 -*graalpython.lib-python.3.test.test_tokenize.TestDetectEncoding.test_utf8_normalization -*graalpython.lib-python.3.test.test_tokenize.TestMisc.test_decistmt -*graalpython.lib-python.3.test.test_tokenize.TestRoundtrip.test_backslash_continuation -*graalpython.lib-python.3.test.test_tokenize.TestRoundtrip.test_continuation -*graalpython.lib-python.3.test.test_tokenize.TestRoundtrip.test_indentation_semantics_retained -*graalpython.lib-python.3.test.test_tokenize.TestRoundtrip.test_random_files -*graalpython.lib-python.3.test.test_tokenize.TestRoundtrip.test_roundtrip -*graalpython.lib-python.3.test.test_tokenize.TestRoundtrip.test_string_concatenation -*graalpython.lib-python.3.test.test_tokenize.TestTokenize.test_comment_at_the_end_of_the_source_without_newline -*graalpython.lib-python.3.test.test_tokenize.TestTokenize.test_exact_type -*graalpython.lib-python.3.test.test_tokenize.TestTokenize.test_oneline_defs -*graalpython.lib-python.3.test.test_tokenize.TestTokenize.test_pathological_trailing_whitespace -*graalpython.lib-python.3.test.test_tokenize.TestTokenize.test_tokenize -*graalpython.lib-python.3.test.test_tokenize.TestTokenizerAdheresToPep0263.test_bad_coding_cookie -*graalpython.lib-python.3.test.test_tokenize.TestTokenizerAdheresToPep0263.test_latin1_coding_cookie_and_utf8_bom -*graalpython.lib-python.3.test.test_tokenize.TestTokenizerAdheresToPep0263.test_no_coding_cookie_and_utf8_bom -*graalpython.lib-python.3.test.test_tokenize.TestTokenizerAdheresToPep0263.test_utf8_coding_cookie_and_no_utf8_bom -*graalpython.lib-python.3.test.test_tokenize.TestTokenizerAdheresToPep0263.test_utf8_coding_cookie_and_utf8_bom -*graalpython.lib-python.3.test.test_tokenize.Test_Tokenize.test__tokenize_decodes_with_specified_encoding -*graalpython.lib-python.3.test.test_tokenize.Test_Tokenize.test__tokenize_does_not_decode_with_encoding_none -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_additive -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_async -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_basic -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_comparison -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_float -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_function -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_implicit_newline -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_int -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_long -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_method -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_multiplicative -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_non_ascii_identifiers -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_selector -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_shift -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_string -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_tabs -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_unary -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_underscore_literals -*graalpython.lib-python.3.test.test_tokenize.TokenizeTest.test_unicode -*graalpython.lib-python.3.test.test_tokenize.UntokenizeTest.test_backslash_continuation -*graalpython.lib-python.3.test.test_tokenize.UntokenizeTest.test_bad_input_order -*graalpython.lib-python.3.test.test_tokenize.UntokenizeTest.test_iter_compat +test.test_tokenize.CTokenizeTest.test_additive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.CTokenizeTest.test_async @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.CTokenizeTest.test_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.CTokenizeTest.test_continuation_lines_indentation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.CTokenizeTest.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.CTokenizeTest.test_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.CTokenizeTest.test_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.CTokenizeTest.test_invalid_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.CTokenizeTest.test_max_indent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.CTokenizeTest.test_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.CTokenizeTest.test_multiplicative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.CTokenizeTest.test_selector @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.CTokenizeTest.test_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.CTokenizeTest.test_tabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.CTokenizeTest.test_unary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.CTokenizerBufferTests.test_newline_at_the_end_of_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_additive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_async @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_implicit_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_multiplicative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_non_ascii_identifiers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_selector @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_shift @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_tabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_unary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_underscore_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.GenerateTokensTest.test_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_bom_no_cookie @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_cookie_first_line_no_bom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_cookie_second_line_commented_first_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_cookie_second_line_empty_first_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_cookie_second_line_no_bom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_cookie_second_line_noncommented_first_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_false_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_filename_in_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_latin1_normalization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_matched_bom_and_cookie_first_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_matched_bom_and_cookie_second_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_mismatched_bom_and_cookie_first_line_raises_syntaxerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_mismatched_bom_and_cookie_second_line_raises_syntaxerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_no_bom_no_encoding_cookie @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_open_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_short_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_syntaxerror_latin1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestDetectEncoding.test_utf8_normalization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestMisc.test_decistmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestRoundtrip.test_backslash_continuation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestRoundtrip.test_continuation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestRoundtrip.test_indentation_semantics_retained @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestRoundtrip.test_random_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestRoundtrip.test_roundtrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestRoundtrip.test_string_concatenation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestTokenize.test_comment_at_the_end_of_the_source_without_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestTokenize.test_exact_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestTokenize.test_oneline_defs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestTokenize.test_pathological_trailing_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestTokenize.test_tokenize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestTokenizerAdheresToPep0263.test_bad_coding_cookie @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestTokenizerAdheresToPep0263.test_latin1_coding_cookie_and_utf8_bom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestTokenizerAdheresToPep0263.test_no_coding_cookie_and_utf8_bom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestTokenizerAdheresToPep0263.test_utf8_coding_cookie_and_no_utf8_bom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TestTokenizerAdheresToPep0263.test_utf8_coding_cookie_and_utf8_bom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.Test_Tokenize.test__tokenize_decodes_with_specified_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.Test_Tokenize.test__tokenize_does_not_decode_with_encoding_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_additive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_async @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_implicit_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_multiplicative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_non_ascii_identifiers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_selector @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_shift @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_tabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_unary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_underscore_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.TokenizeTest.test_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.UntokenizeTest.test_backslash_continuation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.UntokenizeTest.test_bad_input_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tokenize.UntokenizeTest.test_iter_compat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tomllib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tomllib.txt index 5278a571d8..02d2cd3933 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tomllib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tomllib.txt @@ -1,13 +1,13 @@ -*test.test_tomllib.test_data.TestData.test_invalid -*test.test_tomllib.test_data.TestData.test_valid -*test.test_tomllib.test_error.TestError.test_invalid_char_quotes -*test.test_tomllib.test_error.TestError.test_invalid_parse_float -*test.test_tomllib.test_error.TestError.test_line_and_col -*test.test_tomllib.test_error.TestError.test_missing_value -*test.test_tomllib.test_error.TestError.test_module_name -*test.test_tomllib.test_misc.TestMiscellaneous.test_deepcopy -*test.test_tomllib.test_misc.TestMiscellaneous.test_incorrect_load -*test.test_tomllib.test_misc.TestMiscellaneous.test_inline_array_recursion_limit -*test.test_tomllib.test_misc.TestMiscellaneous.test_inline_table_recursion_limit -*test.test_tomllib.test_misc.TestMiscellaneous.test_load -*test.test_tomllib.test_misc.TestMiscellaneous.test_parse_float +test.test_tomllib.test_data.TestData.test_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tomllib.test_data.TestData.test_valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tomllib.test_error.TestError.test_invalid_char_quotes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tomllib.test_error.TestError.test_invalid_parse_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tomllib.test_error.TestError.test_line_and_col @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tomllib.test_error.TestError.test_missing_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tomllib.test_error.TestError.test_module_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tomllib.test_misc.TestMiscellaneous.test_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tomllib.test_misc.TestMiscellaneous.test_incorrect_load @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tomllib.test_misc.TestMiscellaneous.test_inline_array_recursion_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tomllib.test_misc.TestMiscellaneous.test_inline_table_recursion_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tomllib.test_misc.TestMiscellaneous.test_load @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tomllib.test_misc.TestMiscellaneous.test_parse_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tools.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tools.txt index 17b900814d..a13f0102f0 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tools.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tools.txt @@ -1,12 +1,11 @@ -*unittest.loader.ModuleSkipped.test.test_tools.test_fixcid -*unittest.loader.ModuleSkipped.test.test_tools.test_freeze -*unittest.loader.ModuleSkipped.test.test_tools.test_gprof2html -*unittest.loader.ModuleSkipped.test.test_tools.test_i18n -*unittest.loader.ModuleSkipped.test.test_tools.test_lll -*unittest.loader.ModuleSkipped.test.test_tools.test_md5sum -*unittest.loader.ModuleSkipped.test.test_tools.test_pathfix -*unittest.loader.ModuleSkipped.test.test_tools.test_pdeps -*unittest.loader.ModuleSkipped.test.test_tools.test_pindent -*unittest.loader.ModuleSkipped.test.test_tools.test_reindent -*unittest.loader.ModuleSkipped.test.test_tools.test_sundry -*unittest.loader.ModuleSkipped.test.test_tools.test_unparse +unittest.loader.ModuleSkipped.test.test_tools.test_fixcid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.loader.ModuleSkipped.test.test_tools.test_freeze @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.loader.ModuleSkipped.test.test_tools.test_gprof2html @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.loader.ModuleSkipped.test.test_tools.test_i18n @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.loader.ModuleSkipped.test.test_tools.test_lll @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.loader.ModuleSkipped.test.test_tools.test_md5sum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.loader.ModuleSkipped.test.test_tools.test_pathfix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.loader.ModuleSkipped.test.test_tools.test_pdeps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.loader.ModuleSkipped.test.test_tools.test_pindent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.loader.ModuleSkipped.test.test_tools.test_reindent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.loader.ModuleSkipped.test.test_tools.test_sundry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_trace.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_trace.txt index e88373aa4d..319562ba35 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_trace.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_trace.txt @@ -1,18 +1,20 @@ -*graalpython.lib-python.3.test.test_trace.TestCommandLine.test_failures -*graalpython.lib-python.3.test.test_trace.TestCommandLine.test_run_as_module -*graalpython.lib-python.3.test.test_trace.TestCommandLine.test_sys_argv_list -*graalpython.lib-python.3.test.test_trace.TestCoverage.test_coverage -*graalpython.lib-python.3.test.test_trace.TestCoverage.test_coverage_ignore -*graalpython.lib-python.3.test.test_trace.TestCoverage.test_coverageresults_update -*graalpython.lib-python.3.test.test_trace.TestCoverage.test_issue9936 -*graalpython.lib-python.3.test.test_trace.TestCoverageCommandLineOutput.test_cover_files_written_no_highlight -*graalpython.lib-python.3.test.test_trace.TestCoverageCommandLineOutput.test_cover_files_written_with_highlight -*graalpython.lib-python.3.test.test_trace.TestFuncs.test_arg_errors -*graalpython.lib-python.3.test.test_trace.TestFuncs.test_loop_caller_importing -*graalpython.lib-python.3.test.test_trace.TestFuncs.test_simple_caller -*graalpython.lib-python.3.test.test_trace.TestFuncs.test_traced_decorated_function -*graalpython.lib-python.3.test.test_trace.TestLineCounts.test_linear_methods -*graalpython.lib-python.3.test.test_trace.TestLineCounts.test_traced_decorated_function -*graalpython.lib-python.3.test.test_trace.TestLineCounts.test_traced_func_importing -*graalpython.lib-python.3.test.test_trace.TestLineCounts.test_traced_func_linear -*graalpython.lib-python.3.test.test_trace.Test_Ignore.test_ignored +test.test_trace.TestCommandLine.test_failures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_trace.TestCommandLine.test_run_as_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_trace.TestCommandLine.test_sys_argv_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_trace.TestCoverage.test_coverage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_trace.TestCoverage.test_coverage_ignore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_trace.TestCoverage.test_coverageresults_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_trace.TestCoverage.test_issue9936 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_trace.TestCoverageCommandLineOutput.test_cover_files_written_no_highlight @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_trace.TestCoverageCommandLineOutput.test_cover_files_written_with_highlight @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_trace.TestFuncs.test_arg_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_trace.TestFuncs.test_loop_caller_importing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_trace.TestFuncs.test_simple_caller @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_trace.TestFuncs.test_traced_decorated_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_trace.TestLineCounts.test_linear_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_trace.TestLineCounts.test_traced_decorated_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_trace.TestLineCounts.test_traced_func_importing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_trace.TestLineCounts.test_traced_func_linear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# GR-59862 - passes only if one of the other tests invokes the traced function before +!test.test_trace.TestRunExecCounts.test_exec_counts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_trace.Test_Ignore.test_ignored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_traceback.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_traceback.txt index f133de062c..a4fee982ac 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_traceback.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_traceback.txt @@ -1,168 +1,107 @@ -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_KeyboardInterrupt_at_first_line_of_frame -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_cause -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_cause_and_context -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_cause_recursive -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_context -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_context_suppression -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_exception_bad__str__ -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_exception_group_basic -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_exception_group_cause -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_exception_group_context_with_context -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_exception_group_depth_limit -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_exception_group_nested -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_exception_group_width_limit -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_exception_group_with_multiple_notes -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_exception_group_with_notes -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_exception_modulename -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_exception_modulename_not_unicode -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_exception_qualname -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_exception_with_invalid_notes -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_exception_with_multiple_notes -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_exception_with_note -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_message_none -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_simple -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_syntax_error_no_lineno -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_syntax_error_offset_at_eol -*graalpython.lib-python.3.test.test_traceback.CExcReportingTests.test_syntax_error_various_offsets -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_basic_caret -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_byte_offset_multiline -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_byte_offset_wide_chars_subscript -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_byte_offset_with_emojis_term_highlight -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_byte_offset_with_wide_characters_middle -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_byte_offset_with_wide_characters_term_highlight -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_caret_exception_group -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_caret_for_binary_operators -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_caret_for_binary_operators_two_char -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_caret_for_binary_operators_with_spaces_and_parenthesis -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_caret_for_binary_operators_with_unicode -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_caret_for_subscript -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_caret_for_subscript_unicode -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_caret_for_subscript_with_spaces_and_parenthesis -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_caret_in_type_annotation -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_caret_multiline_expression -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_caret_multiline_expression_bin_op -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_caret_multiline_expression_syntax_error -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_decorator_application_lineno_correct -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_line_with_unicode -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_multiline_method_call_a -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_multiline_method_call_b -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_multiline_method_call_c -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_secondary_caret_not_elided -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_specialization_variations -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_traceback_specialization_with_syntax_error -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_traceback_very_long_line -*graalpython.lib-python.3.test.test_traceback.CPythonTracebackErrorCaretTests.test_wide_characters_unicode_with_problematic_byte_offset -*graalpython.lib-python.3.test.test_traceback.LimitTests.test_extract_stack -*graalpython.lib-python.3.test.test_traceback.LimitTests.test_extract_tb -*graalpython.lib-python.3.test.test_traceback.LimitTests.test_format_exception -*graalpython.lib-python.3.test.test_traceback.MiscTest.test_all -*graalpython.lib-python.3.test.test_traceback.MiscTracebackCases.test_extract_stack -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_cause -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_cause_and_context -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_cause_recursive -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_context -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_context_suppression -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_exception_bad__str__ -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_exception_group_basic -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_exception_group_cause -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_exception_group_context_with_context -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_exception_group_depth_limit -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_exception_group_nested -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_exception_group_width_limit -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_exception_group_with_multiple_notes -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_exception_group_with_notes -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_exception_modulename -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_exception_modulename_not_unicode -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_exception_qualname -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_exception_with_invalid_notes -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_exception_with_multiple_notes -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_exception_with_note -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_message_none -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_simple -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_syntax_error_no_lineno -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_syntax_error_offset_at_eol -*graalpython.lib-python.3.test.test_traceback.PyExcReportingTests.test_syntax_error_various_offsets -*graalpython.lib-python.3.test.test_traceback.TestFrame.test_basics -*graalpython.lib-python.3.test.test_traceback.TestFrame.test_explicit_line -*graalpython.lib-python.3.test.test_traceback.TestFrame.test_lazy_lines -*graalpython.lib-python.3.test.test_traceback.TestFrame.test_len -*graalpython.lib-python.3.test.test_traceback.TestFrame.test_no_line -*graalpython.lib-python.3.test.test_traceback.TestStack.test_custom_format_frame -*graalpython.lib-python.3.test.test_traceback.TestStack.test_dropping_frames -*graalpython.lib-python.3.test.test_traceback.TestStack.test_extract_stack -*graalpython.lib-python.3.test.test_traceback.TestStack.test_extract_stack_limit -*graalpython.lib-python.3.test.test_traceback.TestStack.test_extract_stack_lookup_lines -*graalpython.lib-python.3.test.test_traceback.TestStack.test_extract_stackup_deferred_lookup_lines -*graalpython.lib-python.3.test.test_traceback.TestStack.test_format_locals -*graalpython.lib-python.3.test.test_traceback.TestStack.test_format_smoke -*graalpython.lib-python.3.test.test_traceback.TestStack.test_from_list -*graalpython.lib-python.3.test.test_traceback.TestStack.test_from_list_edited_stack -*graalpython.lib-python.3.test.test_traceback.TestStack.test_locals -*graalpython.lib-python.3.test.test_traceback.TestStack.test_no_locals -*graalpython.lib-python.3.test.test_traceback.TestStack.test_walk_stack -*graalpython.lib-python.3.test.test_traceback.TestStack.test_walk_tb -*graalpython.lib-python.3.test.test_traceback.TestTracebackException.test_cause -*graalpython.lib-python.3.test.test_traceback.TestTracebackException.test_compact_no_cause -*graalpython.lib-python.3.test.test_traceback.TestTracebackException.test_compact_with_cause -*graalpython.lib-python.3.test.test_traceback.TestTracebackException.test_comparison_basic -*graalpython.lib-python.3.test.test_traceback.TestTracebackException.test_comparison_equivalent_exceptions_are_equal -*graalpython.lib-python.3.test.test_traceback.TestTracebackException.test_comparison_params_variations -*graalpython.lib-python.3.test.test_traceback.TestTracebackException.test_context -*graalpython.lib-python.3.test.test_traceback.TestTracebackException.test_from_exception -*graalpython.lib-python.3.test.test_traceback.TestTracebackException.test_limit -*graalpython.lib-python.3.test.test_traceback.TestTracebackException.test_locals -*graalpython.lib-python.3.test.test_traceback.TestTracebackException.test_long_context_chain -*graalpython.lib-python.3.test.test_traceback.TestTracebackException.test_lookup_lines -*graalpython.lib-python.3.test.test_traceback.TestTracebackException.test_no_locals -*graalpython.lib-python.3.test.test_traceback.TestTracebackException.test_no_refs_to_exception_and_traceback_objects -*graalpython.lib-python.3.test.test_traceback.TestTracebackException.test_print -*graalpython.lib-python.3.test.test_traceback.TestTracebackException.test_smoke -*graalpython.lib-python.3.test.test_traceback.TestTracebackException.test_traceback_header -*graalpython.lib-python.3.test.test_traceback.TestTracebackException.test_unhashable -*graalpython.lib-python.3.test.test_traceback.TestTracebackException_ExceptionGroups.test_comparison -*graalpython.lib-python.3.test.test_traceback.TestTracebackException_ExceptionGroups.test_exception_group_construction -*graalpython.lib-python.3.test.test_traceback.TestTracebackException_ExceptionGroups.test_exception_group_format -*graalpython.lib-python.3.test.test_traceback.TestTracebackException_ExceptionGroups.test_exception_group_format_exception_only -*graalpython.lib-python.3.test.test_traceback.TestTracebackException_ExceptionGroups.test_max_group_depth -*graalpython.lib-python.3.test.test_traceback.TestTracebackException_ExceptionGroups.test_max_group_width -*graalpython.lib-python.3.test.test_traceback.TracebackCases.test_base_exception -*graalpython.lib-python.3.test.test_traceback.TracebackCases.test_caret -*graalpython.lib-python.3.test.test_traceback.TracebackCases.test_encoded_file -*graalpython.lib-python.3.test.test_traceback.TracebackCases.test_exception_is_None -*graalpython.lib-python.3.test.test_traceback.TracebackCases.test_format_exception_exc -*graalpython.lib-python.3.test.test_traceback.TracebackCases.test_format_exception_only_bad__str__ -*graalpython.lib-python.3.test.test_traceback.TracebackCases.test_format_exception_only_exc -*graalpython.lib-python.3.test.test_traceback.TracebackCases.test_no_caret_with_no_debug_ranges_flag -*graalpython.lib-python.3.test.test_traceback.TracebackCases.test_nocaret -*graalpython.lib-python.3.test.test_traceback.TracebackCases.test_print_exception -*graalpython.lib-python.3.test.test_traceback.TracebackCases.test_print_exception_exc -*graalpython.lib-python.3.test.test_traceback.TracebackCases.test_print_traceback_at_exit -*graalpython.lib-python.3.test.test_traceback.TracebackCases.test_recursion_error_during_traceback -*graalpython.lib-python.3.test.test_traceback.TracebackCases.test_signatures -*graalpython.lib-python.3.test.test_traceback.TracebackErrorLocationCaretTests.test_basic_caret -*graalpython.lib-python.3.test.test_traceback.TracebackErrorLocationCaretTests.test_byte_offset_multiline -*graalpython.lib-python.3.test.test_traceback.TracebackErrorLocationCaretTests.test_caret_exception_group -*graalpython.lib-python.3.test.test_traceback.TracebackErrorLocationCaretTests.test_caret_for_binary_operators -*graalpython.lib-python.3.test.test_traceback.TracebackErrorLocationCaretTests.test_caret_for_binary_operators_two_char -*graalpython.lib-python.3.test.test_traceback.TracebackErrorLocationCaretTests.test_caret_for_binary_operators_with_spaces_and_parenthesis -*graalpython.lib-python.3.test.test_traceback.TracebackErrorLocationCaretTests.test_caret_for_subscript -*graalpython.lib-python.3.test.test_traceback.TracebackErrorLocationCaretTests.test_caret_for_subscript_with_spaces_and_parenthesis -*graalpython.lib-python.3.test.test_traceback.TracebackErrorLocationCaretTests.test_caret_in_type_annotation -*graalpython.lib-python.3.test.test_traceback.TracebackErrorLocationCaretTests.test_caret_multiline_expression -*graalpython.lib-python.3.test.test_traceback.TracebackErrorLocationCaretTests.test_caret_multiline_expression_bin_op -*graalpython.lib-python.3.test.test_traceback.TracebackErrorLocationCaretTests.test_decorator_application_lineno_correct -*graalpython.lib-python.3.test.test_traceback.TracebackErrorLocationCaretTests.test_secondary_caret_not_elided -*graalpython.lib-python.3.test.test_traceback.TracebackErrorLocationCaretTests.test_specialization_variations -*graalpython.lib-python.3.test.test_traceback.TracebackErrorLocationCaretTests.test_traceback_specialization_with_syntax_error -*graalpython.lib-python.3.test.test_traceback.TracebackErrorLocationCaretTests.test_traceback_very_long_line -*graalpython.lib-python.3.test.test_traceback.TracebackFormatTests.test_exception_group_deep_recursion_capi -*graalpython.lib-python.3.test.test_traceback.TracebackFormatTests.test_exception_group_deep_recursion_traceback -*graalpython.lib-python.3.test.test_traceback.TracebackFormatTests.test_format_stack -*graalpython.lib-python.3.test.test_traceback.TracebackFormatTests.test_print_exception_bad_type_capi -*graalpython.lib-python.3.test.test_traceback.TracebackFormatTests.test_print_exception_bad_type_python -*graalpython.lib-python.3.test.test_traceback.TracebackFormatTests.test_print_stack -*graalpython.lib-python.3.test.test_traceback.TracebackFormatTests.test_recursive_traceback_cpython_internal -*graalpython.lib-python.3.test.test_traceback.TracebackFormatTests.test_stack_format -*graalpython.lib-python.3.test.test_traceback.TracebackFormatTests.test_traceback_format -*graalpython.lib-python.3.test.test_traceback.TracebackFormatTests.test_traceback_format_with_cleared_frames -*graalpython.lib-python.3.test.test_traceback.TracebackFormatTests.test_unhashable +test.test_traceback.LimitTests.test_extract_stack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.LimitTests.test_extract_tb @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.LimitTests.test_format_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.MiscTest.test_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.MiscTracebackCases.test_extract_stack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_cause @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_cause_and_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_cause_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_context_suppression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_exception_bad__str__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_exception_group_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_exception_group_cause @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_exception_group_context_with_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_exception_group_depth_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_exception_group_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_exception_group_width_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_exception_group_with_multiple_notes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_exception_group_with_notes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_exception_modulename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_exception_modulename_not_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_exception_qualname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_exception_with_invalid_notes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_exception_with_multiple_notes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_exception_with_note @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_message_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_syntax_error_no_lineno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_syntax_error_offset_at_eol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.PyExcReportingTests.test_syntax_error_various_offsets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestFrame.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestFrame.test_explicit_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestFrame.test_lazy_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestFrame.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestFrame.test_no_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestStack.test_custom_format_frame @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestStack.test_dropping_frames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestStack.test_extract_stack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestStack.test_extract_stack_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestStack.test_extract_stack_lookup_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestStack.test_extract_stackup_deferred_lookup_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestStack.test_format_locals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestStack.test_format_smoke @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestStack.test_from_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestStack.test_from_list_edited_stack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestStack.test_locals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestStack.test_no_locals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestStack.test_walk_stack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestStack.test_walk_tb @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException.test_cause @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException.test_compact_no_cause @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException.test_compact_with_cause @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException.test_comparison_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException.test_comparison_equivalent_exceptions_are_equal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException.test_comparison_params_variations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException.test_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException.test_from_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException.test_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException.test_locals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException.test_long_context_chain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_traceback.TestTracebackException.test_lookup_lines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException.test_no_locals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException.test_no_refs_to_exception_and_traceback_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException.test_print @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException.test_smoke @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException.test_traceback_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException.test_unhashable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException_ExceptionGroups.test_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException_ExceptionGroups.test_exception_group_construction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException_ExceptionGroups.test_exception_group_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException_ExceptionGroups.test_exception_group_format_exception_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException_ExceptionGroups.test_max_group_depth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TestTracebackException_ExceptionGroups.test_max_group_width @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackCases.test_base_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackCases.test_caret @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackCases.test_encoded_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_traceback.TracebackCases.test_exception_is_None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackCases.test_format_exception_exc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackCases.test_format_exception_only_bad__str__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackCases.test_format_exception_only_exc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackCases.test_no_caret_with_no_debug_ranges_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_traceback.TracebackCases.test_nocaret @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackCases.test_print_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackCases.test_print_exception_exc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackCases.test_recursion_error_during_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_traceback.TracebackCases.test_signatures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackErrorLocationCaretTests.test_basic_caret @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackErrorLocationCaretTests.test_byte_offset_multiline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackErrorLocationCaretTests.test_caret_exception_group @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackErrorLocationCaretTests.test_caret_for_binary_operators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackErrorLocationCaretTests.test_caret_for_binary_operators_two_char @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackErrorLocationCaretTests.test_caret_for_binary_operators_with_spaces_and_parenthesis @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackErrorLocationCaretTests.test_caret_for_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackErrorLocationCaretTests.test_caret_for_subscript_with_spaces_and_parenthesis @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackErrorLocationCaretTests.test_caret_in_type_annotation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackErrorLocationCaretTests.test_caret_multiline_expression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackErrorLocationCaretTests.test_caret_multiline_expression_bin_op @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackErrorLocationCaretTests.test_decorator_application_lineno_correct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackErrorLocationCaretTests.test_secondary_caret_not_elided @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackErrorLocationCaretTests.test_specialization_variations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackErrorLocationCaretTests.test_traceback_specialization_with_syntax_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackErrorLocationCaretTests.test_traceback_very_long_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackFormatTests.test_exception_group_deep_recursion_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackFormatTests.test_format_stack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackFormatTests.test_print_exception_bad_type_python @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackFormatTests.test_print_stack @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_traceback.TracebackFormatTests.test_stack_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tracemalloc.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tracemalloc.txt index 12edbd10d6..c8a4f5dcc9 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tracemalloc.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tracemalloc.txt @@ -1,19 +1,19 @@ -*graalpython.lib-python.3.test.test_tracemalloc.TestFilters.test_filter_attributes -*graalpython.lib-python.3.test.test_tracemalloc.TestFilters.test_filter_match -*graalpython.lib-python.3.test.test_tracemalloc.TestFilters.test_filter_match_filename -*graalpython.lib-python.3.test.test_tracemalloc.TestFilters.test_filter_match_filename_joker -*graalpython.lib-python.3.test.test_tracemalloc.TestFilters.test_filter_match_trace -*graalpython.lib-python.3.test.test_tracemalloc.TestSnapshot.test_filter_traces -*graalpython.lib-python.3.test.test_tracemalloc.TestSnapshot.test_filter_traces_domain -*graalpython.lib-python.3.test.test_tracemalloc.TestSnapshot.test_filter_traces_domain_filter -*graalpython.lib-python.3.test.test_tracemalloc.TestSnapshot.test_format_traceback -*graalpython.lib-python.3.test.test_tracemalloc.TestSnapshot.test_slices -*graalpython.lib-python.3.test.test_tracemalloc.TestSnapshot.test_snapshot_group_by_cumulative -*graalpython.lib-python.3.test.test_tracemalloc.TestSnapshot.test_snapshot_group_by_file -*graalpython.lib-python.3.test.test_tracemalloc.TestSnapshot.test_snapshot_group_by_line -*graalpython.lib-python.3.test.test_tracemalloc.TestSnapshot.test_snapshot_group_by_traceback -*graalpython.lib-python.3.test.test_tracemalloc.TestSnapshot.test_statistic_diff_format -*graalpython.lib-python.3.test.test_tracemalloc.TestSnapshot.test_statistic_format -*graalpython.lib-python.3.test.test_tracemalloc.TestSnapshot.test_trace_format -*graalpython.lib-python.3.test.test_tracemalloc.TestTraceback.test_repr -*graalpython.lib-python.3.test.test_tracemalloc.TestTracemallocEnabled.test_fork +test.test_tracemalloc.TestCommandLine.test_pymem_alloc0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tracemalloc.TestFilters.test_filter_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tracemalloc.TestFilters.test_filter_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tracemalloc.TestFilters.test_filter_match_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tracemalloc.TestFilters.test_filter_match_filename_joker @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tracemalloc.TestFilters.test_filter_match_trace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tracemalloc.TestSnapshot.test_filter_traces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tracemalloc.TestSnapshot.test_filter_traces_domain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tracemalloc.TestSnapshot.test_filter_traces_domain_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tracemalloc.TestSnapshot.test_format_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tracemalloc.TestSnapshot.test_slices @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tracemalloc.TestSnapshot.test_snapshot_group_by_cumulative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tracemalloc.TestSnapshot.test_snapshot_group_by_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tracemalloc.TestSnapshot.test_snapshot_group_by_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tracemalloc.TestSnapshot.test_snapshot_group_by_traceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tracemalloc.TestSnapshot.test_statistic_diff_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tracemalloc.TestSnapshot.test_statistic_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tracemalloc.TestSnapshot.test_trace_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tracemalloc.TestTraceback.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tty.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tty.txt index 1574016b1a..2faa9d86dd 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tty.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tty.txt @@ -1,2 +1,2 @@ -*graalpython.lib-python.3.test.test_tty.TestTty.test_setcbreak -*graalpython.lib-python.3.test.test_tty.TestTty.test_setraw +test.test_tty.TestTty.test_setcbreak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_tty.TestTty.test_setraw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tuple.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tuple.txt index c919a38632..1f843c8b67 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tuple.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_tuple.txt @@ -1,34 +1,28 @@ -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_addmul -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_bigrepeat -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_bug7466 -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_constructors -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_contains -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_contains_fake -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_contains_order -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_count -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_getitem -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_getitem_error -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_getitemoverwriteiter -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_getslice -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_hash_optional -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_iadd -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_imul -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_index -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_iterator_pickle -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_keyword_args -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_len -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_lexicographic_ordering -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_minmax -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_no_comdat_folding -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_pickle -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_repeat -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_repr -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_repr_large -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_reversed_pickle -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_subscript -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_track_dynamic -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_track_literals -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_track_subtypes -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_truth -*graalpython.lib-python.3.test.test_tuple.TupleTest.test_tupleresizebug +test.test_tuple.TupleTest.test_addmul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_constructors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_contains_fake @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_contains_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_getitem_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_getitemoverwriteiter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_hash_optional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_iadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_imul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_iterator_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_keyword_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_lexicographic_ordering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_minmax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_no_comdat_folding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_repr_large @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_reversed_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_truth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_tuple.TupleTest.test_tupleresizebug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_type_annotations.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_type_annotations.txt index 25c7eed4cf..18af0e0bb0 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_type_annotations.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_type_annotations.txt @@ -1,9 +1,9 @@ -*graalpython.lib-python.3.test.test_type_annotations.TestSetupAnnotations.test_blocks -*graalpython.lib-python.3.test.test_type_annotations.TestSetupAnnotations.test_match -*graalpython.lib-python.3.test.test_type_annotations.TestSetupAnnotations.test_top_level -*graalpython.lib-python.3.test.test_type_annotations.TestSetupAnnotations.test_try -*graalpython.lib-python.3.test.test_type_annotations.TypeAnnotationTests.test_annotations_are_created_correctly -*graalpython.lib-python.3.test.test_type_annotations.TypeAnnotationTests.test_annotations_getset_raises -*graalpython.lib-python.3.test.test_type_annotations.TypeAnnotationTests.test_descriptor_still_works -*graalpython.lib-python.3.test.test_type_annotations.TypeAnnotationTests.test_lazy_create_annotations -*graalpython.lib-python.3.test.test_type_annotations.TypeAnnotationTests.test_setting_annotations +test.test_type_annotations.TestSetupAnnotations.test_blocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_annotations.TestSetupAnnotations.test_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_annotations.TestSetupAnnotations.test_top_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_annotations.TestSetupAnnotations.test_try @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_annotations.TypeAnnotationTests.test_annotations_are_created_correctly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_annotations.TypeAnnotationTests.test_annotations_getset_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_annotations.TypeAnnotationTests.test_descriptor_still_works @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_annotations.TypeAnnotationTests.test_lazy_create_annotations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_annotations.TypeAnnotationTests.test_setting_annotations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_type_cache.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_type_cache.txt deleted file mode 100644 index 2d592bff56..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_type_cache.txt +++ /dev/null @@ -1 +0,0 @@ -*graalpython.lib-python.3.test.test_type_cache.TypeCacheTests.test_tp_version_tag_unique diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_type_comments.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_type_comments.txt index 22990bfd8d..ad939dc1c9 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_type_comments.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_type_comments.txt @@ -1,16 +1,16 @@ -*graalpython.lib-python.3.test.test_type_comments.TypeCommentTests.test_asynccomp -*graalpython.lib-python.3.test.test_type_comments.TypeCommentTests.test_asyncdef -*graalpython.lib-python.3.test.test_type_comments.TypeCommentTests.test_asyncvar -*graalpython.lib-python.3.test.test_type_comments.TypeCommentTests.test_forstmt -*graalpython.lib-python.3.test.test_type_comments.TypeCommentTests.test_fstring -*graalpython.lib-python.3.test.test_type_comments.TypeCommentTests.test_func_type_input -*graalpython.lib-python.3.test.test_type_comments.TypeCommentTests.test_funcdef -*graalpython.lib-python.3.test.test_type_comments.TypeCommentTests.test_ignores -*graalpython.lib-python.3.test.test_type_comments.TypeCommentTests.test_inappropriate_type_comments -*graalpython.lib-python.3.test.test_type_comments.TypeCommentTests.test_longargs -*graalpython.lib-python.3.test.test_type_comments.TypeCommentTests.test_matmul -*graalpython.lib-python.3.test.test_type_comments.TypeCommentTests.test_nonasciidef -*graalpython.lib-python.3.test.test_type_comments.TypeCommentTests.test_redundantdef -*graalpython.lib-python.3.test.test_type_comments.TypeCommentTests.test_underscorednumber -*graalpython.lib-python.3.test.test_type_comments.TypeCommentTests.test_vardecl -*graalpython.lib-python.3.test.test_type_comments.TypeCommentTests.test_withstmt +test.test_type_comments.TypeCommentTests.test_asynccomp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_comments.TypeCommentTests.test_asyncdef @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_comments.TypeCommentTests.test_asyncvar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_comments.TypeCommentTests.test_forstmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_comments.TypeCommentTests.test_fstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_comments.TypeCommentTests.test_func_type_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_comments.TypeCommentTests.test_funcdef @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_comments.TypeCommentTests.test_ignores @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_comments.TypeCommentTests.test_inappropriate_type_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_comments.TypeCommentTests.test_longargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_comments.TypeCommentTests.test_matmul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_comments.TypeCommentTests.test_nonasciidef @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_comments.TypeCommentTests.test_redundantdef @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_comments.TypeCommentTests.test_underscorednumber @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_comments.TypeCommentTests.test_vardecl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_type_comments.TypeCommentTests.test_withstmt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_typechecks.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_typechecks.txt index b0e7aba3b2..afdd2fc6b6 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_typechecks.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_typechecks.txt @@ -1,6 +1,6 @@ -*graalpython.lib-python.3.test.test_typechecks.TypeChecksTest.testIsInstanceActual -*graalpython.lib-python.3.test.test_typechecks.TypeChecksTest.testIsInstanceBuiltin -*graalpython.lib-python.3.test.test_typechecks.TypeChecksTest.testIsSubclassActual -*graalpython.lib-python.3.test.test_typechecks.TypeChecksTest.testIsSubclassBuiltin -*graalpython.lib-python.3.test.test_typechecks.TypeChecksTest.testIsSubclassInternal -*graalpython.lib-python.3.test.test_typechecks.TypeChecksTest.testSubclassBehavior +test.test_typechecks.TypeChecksTest.testIsInstanceActual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typechecks.TypeChecksTest.testIsInstanceBuiltin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typechecks.TypeChecksTest.testIsSubclassActual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typechecks.TypeChecksTest.testIsSubclassBuiltin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typechecks.TypeChecksTest.testIsSubclassInternal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typechecks.TypeChecksTest.testSubclassBehavior @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_types.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_types.txt index 5c5e7a8f19..5e397a2adf 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_types.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_types.txt @@ -1,109 +1,100 @@ -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_bad___prepare__ -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_metaclass_derivation -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_metaclass_new_error -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_metaclass_override_callable -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_metaclass_override_function -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_new_class_basics -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_new_class_defaults -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_new_class_exec_body -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_new_class_meta -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_new_class_meta_with_base -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_new_class_metaclass_keywords -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_new_class_subclass -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_new_class_with_mro_entry -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_new_class_with_mro_entry_error -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_new_class_with_mro_entry_genericalias -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_new_class_with_mro_entry_multiple -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_new_class_with_mro_entry_multiple_2 -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_new_class_with_mro_entry_none -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_one_argument_type -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_prepare_class -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_resolve_bases -*graalpython.lib-python.3.test.test_types.ClassCreationTests.test_resolve_bases_with_mro_entry -*graalpython.lib-python.3.test.test_types.CoroutineTests.test_async_def -*graalpython.lib-python.3.test.test_types.CoroutineTests.test_duck_coro -*graalpython.lib-python.3.test.test_types.CoroutineTests.test_duck_corogen -*graalpython.lib-python.3.test.test_types.CoroutineTests.test_duck_functional_gen -*graalpython.lib-python.3.test.test_types.CoroutineTests.test_duck_gen -*graalpython.lib-python.3.test.test_types.CoroutineTests.test_gen -*graalpython.lib-python.3.test.test_types.CoroutineTests.test_genfunc -*graalpython.lib-python.3.test.test_types.CoroutineTests.test_non_gen_values -*graalpython.lib-python.3.test.test_types.CoroutineTests.test_returning_itercoro -*graalpython.lib-python.3.test.test_types.CoroutineTests.test_wrapper_object -*graalpython.lib-python.3.test.test_types.CoroutineTests.test_wrong_args -*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_chainmap -*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_constructor -*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_contains -*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_copy -*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_customdict -*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_get -*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_iterators -*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_len -*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_methods -*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_missing -*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_reversed -*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_union -*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_views -*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_as_dict -*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_attrdel -*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_attrget -*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_attrset -*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_constructor -*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_equal -*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_fake_namespace_compare -*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_nested -*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_pickle -*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_recursive -*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_subclass -*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_unbound -*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_underlying_dict -*graalpython.lib-python.3.test.test_types.TypesTests.test_boolean_ops -*graalpython.lib-python.3.test.test_types.TypesTests.test_comparisons -*graalpython.lib-python.3.test.test_types.TypesTests.test_ellipsis_type -*graalpython.lib-python.3.test.test_types.TypesTests.test_float__format__ -*graalpython.lib-python.3.test.test_types.TypesTests.test_float__format__locale -*graalpython.lib-python.3.test.test_types.TypesTests.test_float_constructor -*graalpython.lib-python.3.test.test_types.TypesTests.test_float_to_string -*graalpython.lib-python.3.test.test_types.TypesTests.test_floats -*graalpython.lib-python.3.test.test_types.TypesTests.test_format_spec_errors -*graalpython.lib-python.3.test.test_types.TypesTests.test_int__format__ -*graalpython.lib-python.3.test.test_types.TypesTests.test_int__format__locale -*graalpython.lib-python.3.test.test_types.TypesTests.test_internal_sizes -*graalpython.lib-python.3.test.test_types.TypesTests.test_method_descriptor_types -*graalpython.lib-python.3.test.test_types.TypesTests.test_method_wrapper_types -*graalpython.lib-python.3.test.test_types.TypesTests.test_none_type -*graalpython.lib-python.3.test.test_types.TypesTests.test_normal_integers -*graalpython.lib-python.3.test.test_types.TypesTests.test_notimplemented_type -*graalpython.lib-python.3.test.test_types.TypesTests.test_numeric_types -*graalpython.lib-python.3.test.test_types.TypesTests.test_slot_wrapper_types -*graalpython.lib-python.3.test.test_types.TypesTests.test_strings -*graalpython.lib-python.3.test.test_types.TypesTests.test_traceback_and_frame_types -*graalpython.lib-python.3.test.test_types.TypesTests.test_truth_values -*graalpython.lib-python.3.test.test_types.TypesTests.test_type_function -*graalpython.lib-python.3.test.test_types.TypesTests.test_zero_division -*graalpython.lib-python.3.test.test_types.UnionTests.test_bad_instancecheck -*graalpython.lib-python.3.test.test_types.UnionTests.test_bad_subclasscheck -*graalpython.lib-python.3.test.test_types.UnionTests.test_hash -*graalpython.lib-python.3.test.test_types.UnionTests.test_instancecheck_and_subclasscheck -*graalpython.lib-python.3.test.test_types.UnionTests.test_instancecheck_and_subclasscheck_order -*graalpython.lib-python.3.test.test_types.UnionTests.test_or_type_operator_reference_cycle -*graalpython.lib-python.3.test.test_types.UnionTests.test_or_type_operator_with_Alias -*graalpython.lib-python.3.test.test_types.UnionTests.test_or_type_operator_with_IO -*graalpython.lib-python.3.test.test_types.UnionTests.test_or_type_operator_with_Literal -*graalpython.lib-python.3.test.test_types.UnionTests.test_or_type_operator_with_NamedTuple -*graalpython.lib-python.3.test.test_types.UnionTests.test_or_type_operator_with_NewType -*graalpython.lib-python.3.test.test_types.UnionTests.test_or_type_operator_with_Protocol -*graalpython.lib-python.3.test.test_types.UnionTests.test_or_type_operator_with_SpecialForm -*graalpython.lib-python.3.test.test_types.UnionTests.test_or_type_operator_with_TypeVar -*graalpython.lib-python.3.test.test_types.UnionTests.test_or_type_operator_with_TypedDict -*graalpython.lib-python.3.test.test_types.UnionTests.test_or_type_operator_with_bad_module -*graalpython.lib-python.3.test.test_types.UnionTests.test_or_type_operator_with_forward -*graalpython.lib-python.3.test.test_types.UnionTests.test_or_type_operator_with_genericalias -*graalpython.lib-python.3.test.test_types.UnionTests.test_or_type_repr -*graalpython.lib-python.3.test.test_types.UnionTests.test_or_types_operator -*graalpython.lib-python.3.test.test_types.UnionTests.test_union_args -*graalpython.lib-python.3.test.test_types.UnionTests.test_union_copy -*graalpython.lib-python.3.test.test_types.UnionTests.test_union_parameter_chaining -*graalpython.lib-python.3.test.test_types.UnionTests.test_union_parameter_substitution -*graalpython.lib-python.3.test.test_types.UnionTests.test_union_parameter_substitution_errors -*graalpython.lib-python.3.test.test_types.UnionTests.test_union_pickle +test.test_types.ClassCreationTests.test_bad___prepare__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_metaclass_derivation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_metaclass_new_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_metaclass_override_callable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_metaclass_override_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_new_class_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_new_class_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_new_class_exec_body @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_new_class_meta @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_new_class_meta_with_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_new_class_metaclass_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_new_class_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_new_class_with_mro_entry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_new_class_with_mro_entry_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_new_class_with_mro_entry_genericalias @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_new_class_with_mro_entry_multiple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_new_class_with_mro_entry_multiple_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_new_class_with_mro_entry_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_one_argument_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_prepare_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_resolve_bases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.ClassCreationTests.test_resolve_bases_with_mro_entry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.CoroutineTests.test_duck_coro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.CoroutineTests.test_duck_corogen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.CoroutineTests.test_non_gen_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.CoroutineTests.test_wrapper_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.CoroutineTests.test_wrong_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.MappingProxyTests.test_chainmap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.MappingProxyTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.MappingProxyTests.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.MappingProxyTests.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.MappingProxyTests.test_customdict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.MappingProxyTests.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.MappingProxyTests.test_iterators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.MappingProxyTests.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.MappingProxyTests.test_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.MappingProxyTests.test_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.MappingProxyTests.test_reversed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.MappingProxyTests.test_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.MappingProxyTests.test_views @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.SimpleNamespaceTests.test_as_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.SimpleNamespaceTests.test_attrdel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.SimpleNamespaceTests.test_attrget @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.SimpleNamespaceTests.test_attrset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.SimpleNamespaceTests.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.SimpleNamespaceTests.test_equal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.SimpleNamespaceTests.test_fake_namespace_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.SimpleNamespaceTests.test_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.SimpleNamespaceTests.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.SimpleNamespaceTests.test_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.SimpleNamespaceTests.test_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.SimpleNamespaceTests.test_unbound @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.SimpleNamespaceTests.test_underlying_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_boolean_ops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_comparisons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_ellipsis_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_float__format__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_float__format__locale @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_float_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_float_to_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_floats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_format_spec_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_int__format__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_int__format__locale @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_method_wrapper_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_none_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_normal_integers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_notimplemented_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_numeric_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_slot_wrapper_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_strings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_traceback_and_frame_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_truth_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_type_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.TypesTests.test_zero_division @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_bad_instancecheck @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_bad_subclasscheck @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_instancecheck_and_subclasscheck @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_instancecheck_and_subclasscheck_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_or_type_operator_with_Alias @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_or_type_operator_with_IO @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_or_type_operator_with_Literal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_or_type_operator_with_NamedTuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_or_type_operator_with_NewType @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_or_type_operator_with_Protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_or_type_operator_with_SpecialForm @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_or_type_operator_with_TypeVar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_or_type_operator_with_TypedDict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_or_type_operator_with_bad_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_or_type_operator_with_forward @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_or_type_operator_with_genericalias @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_or_type_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_or_types_operator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_union_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_union_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_union_parameter_chaining @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_union_parameter_substitution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_union_parameter_substitution_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_types.UnionTests.test_union_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_typing.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_typing.txt index 3e49859750..9cc8b4e493 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_typing.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_typing.txt @@ -1,579 +1,557 @@ -*graalpython.lib-python.3.test.test_typing.AllTests.test_all -*graalpython.lib-python.3.test.test_typing.AllTests.test_all_exported_names -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_annotated_cached_with_types -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_annotated_in_other_types -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_annotated_mro -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_attr_passthrough -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_cannot_check_instance -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_cannot_check_subclass -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_cannot_getattr_typevar -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_cannot_instantiate_forward -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_cannot_instantiate_type_var -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_cannot_subclass -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_flatten -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_hash_eq -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_instantiate -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_instantiate_generic -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_new -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_pickle -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_repr -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_special_form_containment -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_specialize -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_subst -*graalpython.lib-python.3.test.test_typing.AnnotatedTests.test_too_few_type_args -*graalpython.lib-python.3.test.test_typing.AnyTests.test_any_instance_type_error -*graalpython.lib-python.3.test.test_typing.AnyTests.test_any_subclass_type_error -*graalpython.lib-python.3.test.test_typing.AnyTests.test_any_works_with_alias -*graalpython.lib-python.3.test.test_typing.AnyTests.test_can_subclass -*graalpython.lib-python.3.test.test_typing.AnyTests.test_cannot_instantiate -*graalpython.lib-python.3.test.test_typing.AnyTests.test_cannot_subclass -*graalpython.lib-python.3.test.test_typing.AnyTests.test_errors -*graalpython.lib-python.3.test.test_typing.AnyTests.test_repr -*graalpython.lib-python.3.test.test_typing.AssertNeverTests.test_exception -*graalpython.lib-python.3.test.test_typing.AssertTypeTests.test_basics -*graalpython.lib-python.3.test.test_typing.AssertTypeTests.test_errors -*graalpython.lib-python.3.test.test_typing.CastTests.test_basics -*graalpython.lib-python.3.test.test_typing.CastTests.test_errors -*graalpython.lib-python.3.test.test_typing.ClassVarTests.test_basics -*graalpython.lib-python.3.test.test_typing.ClassVarTests.test_cannot_init -*graalpython.lib-python.3.test.test_typing.ClassVarTests.test_cannot_subclass -*graalpython.lib-python.3.test.test_typing.ClassVarTests.test_no_isinstance -*graalpython.lib-python.3.test.test_typing.ClassVarTests.test_repr -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_abstractset -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_async_generator -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_async_iterable -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_async_iterator -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_awaitable -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_bytestring -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_chainmap_instantiation -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_chainmap_subclass -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_collection -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_collections_as_base -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_container -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_coroutine -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_counter -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_counter_instantiation -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_counter_subclass_instantiation -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_defaultdict_instantiation -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_defaultdict_subclass -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_deque -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_deque_instantiation -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_dict -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_dict_subclass -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_dict_subscribe -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_frozenset -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_frozenset_subclass_instantiation -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_generator -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_hashable -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_iterable -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_iterator -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_list -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_list_subclass -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_mapping -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_mutablemapping -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_mutablesequence -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_mutableset -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_no_async_generator_instantiation -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_no_dict_instantiation -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_no_frozenset_instantiation -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_no_generator_instantiation -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_no_list_instantiation -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_no_set_instantiation -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_no_tuple_instantiation -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_or_and_ror -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_ordereddict_instantiation -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_ordereddict_subclass -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_sequence -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_set -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_set_subclass_instantiation -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_sized -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_subclassing -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_subclassing_async_generator -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_subclassing_register -*graalpython.lib-python.3.test.test_typing.CollectionsAbcTests.test_subclassing_subclasshook -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_basic -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_callable_instance_type_error -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_callable_instance_works -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_callable_with_ellipsis -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_callable_wrong_forms -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_cannot_instantiate -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_concatenate -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_dir -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_ellipsis_in_generic -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_eq_hash -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_errors -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_or_and_ror -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_paramspec -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_pickle -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_repr -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_self_subclass -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_type_erasure -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_type_subst_error -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_var_substitution -*graalpython.lib-python.3.test.test_typing.CollectionsCallableTests.test_weakref -*graalpython.lib-python.3.test.test_typing.ConcatenateTests.test_basics -*graalpython.lib-python.3.test.test_typing.ConcatenateTests.test_valid_uses -*graalpython.lib-python.3.test.test_typing.ConcatenateTests.test_var_substitution -*graalpython.lib-python.3.test.test_typing.DataclassTransformTests.test_base_class -*graalpython.lib-python.3.test.test_typing.DataclassTransformTests.test_decorator -*graalpython.lib-python.3.test.test_typing.DataclassTransformTests.test_metaclass -*graalpython.lib-python.3.test.test_typing.FinalDecoratorTests.test_dunder_final -*graalpython.lib-python.3.test.test_typing.FinalDecoratorTests.test_final_unmodified -*graalpython.lib-python.3.test.test_typing.FinalTests.test_basics -*graalpython.lib-python.3.test.test_typing.FinalTests.test_cannot_init -*graalpython.lib-python.3.test.test_typing.FinalTests.test_cannot_subclass -*graalpython.lib-python.3.test.test_typing.FinalTests.test_final_unmodified -*graalpython.lib-python.3.test.test_typing.FinalTests.test_no_isinstance -*graalpython.lib-python.3.test.test_typing.FinalTests.test_repr -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_basics -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_callable_forward -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_callable_with_ellipsis_forward -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_default_globals -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_delayed_syntax_error -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_double_forward -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_final_forward_ref -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_forward_equality -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_forward_equality_gth -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_forward_equality_hash -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_forward_equality_namespace -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_forward_recursion_actually -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_forward_repr -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_forwardref_instance_type_error -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_forwardref_only_str_arg -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_forwardref_subclass_type_error -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_meta_no_type_check -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_name_error -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_nested_classvar_fails_forward_ref_check -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_no_type_check -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_no_type_check_TypeError -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_no_type_check_class -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_no_type_check_class_and_static_methods -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_no_type_check_forward_ref_as_string -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_no_type_check_lambda -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_no_type_check_nested_types -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_no_type_check_no_bases -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_no_type_check_other_module -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_or -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_special_forms_forward -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_syntax_error -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_tuple_forward -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_type_error -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_union_forward -*graalpython.lib-python.3.test.test_typing.ForwardRefTests.test_union_forward_recursion -*graalpython.lib-python.3.test.test_typing.GenericAliasSubstitutionTests.test_one_parameter -*graalpython.lib-python.3.test.test_typing.GenericAliasSubstitutionTests.test_three_parameters -*graalpython.lib-python.3.test.test_typing.GenericAliasSubstitutionTests.test_two_parameters -*graalpython.lib-python.3.test.test_typing.GenericTests.test_abc_bases -*graalpython.lib-python.3.test.test_typing.GenericTests.test_abc_registry_kept -*graalpython.lib-python.3.test.test_typing.GenericTests.test_all_repr_eq_any -*graalpython.lib-python.3.test.test_typing.GenericTests.test_basics -*graalpython.lib-python.3.test.test_typing.GenericTests.test_chain_repr -*graalpython.lib-python.3.test.test_typing.GenericTests.test_complex_subclasses -*graalpython.lib-python.3.test.test_typing.GenericTests.test_copy_and_deepcopy -*graalpython.lib-python.3.test.test_typing.GenericTests.test_copy_generic_instances -*graalpython.lib-python.3.test.test_typing.GenericTests.test_dict -*graalpython.lib-python.3.test.test_typing.GenericTests.test_eq_1 -*graalpython.lib-python.3.test.test_typing.GenericTests.test_eq_2 -*graalpython.lib-python.3.test.test_typing.GenericTests.test_errors -*graalpython.lib-python.3.test.test_typing.GenericTests.test_extended_generic_rules_eq -*graalpython.lib-python.3.test.test_typing.GenericTests.test_extended_generic_rules_repr -*graalpython.lib-python.3.test.test_typing.GenericTests.test_extended_generic_rules_subclassing -*graalpython.lib-python.3.test.test_typing.GenericTests.test_fail_with_bare_generic -*graalpython.lib-python.3.test.test_typing.GenericTests.test_fail_with_bare_union -*graalpython.lib-python.3.test.test_typing.GenericTests.test_false_subclasses -*graalpython.lib-python.3.test.test_typing.GenericTests.test_generic_errors -*graalpython.lib-python.3.test.test_typing.GenericTests.test_generic_forward_ref -*graalpython.lib-python.3.test.test_typing.GenericTests.test_generic_hashes -*graalpython.lib-python.3.test.test_typing.GenericTests.test_generic_pep585_forward_ref -*graalpython.lib-python.3.test.test_typing.GenericTests.test_immutability_by_copy_and_pickle -*graalpython.lib-python.3.test.test_typing.GenericTests.test_implicit_any -*graalpython.lib-python.3.test.test_typing.GenericTests.test_init -*graalpython.lib-python.3.test.test_typing.GenericTests.test_init_subclass -*graalpython.lib-python.3.test.test_typing.GenericTests.test_init_subclass_super_called -*graalpython.lib-python.3.test.test_typing.GenericTests.test_multi_subscr_base -*graalpython.lib-python.3.test.test_typing.GenericTests.test_multiple_bases -*graalpython.lib-python.3.test.test_typing.GenericTests.test_multiple_inheritance -*graalpython.lib-python.3.test.test_typing.GenericTests.test_multiple_inheritance_special -*graalpython.lib-python.3.test.test_typing.GenericTests.test_naive_runtime_checks -*graalpython.lib-python.3.test.test_typing.GenericTests.test_nested -*graalpython.lib-python.3.test.test_typing.GenericTests.test_new_no_args -*graalpython.lib-python.3.test.test_typing.GenericTests.test_new_repr -*graalpython.lib-python.3.test.test_typing.GenericTests.test_new_repr_bare -*graalpython.lib-python.3.test.test_typing.GenericTests.test_new_repr_complex -*graalpython.lib-python.3.test.test_typing.GenericTests.test_new_with_args -*graalpython.lib-python.3.test.test_typing.GenericTests.test_new_with_args2 -*graalpython.lib-python.3.test.test_typing.GenericTests.test_non_generic_subscript -*graalpython.lib-python.3.test.test_typing.GenericTests.test_orig_bases -*graalpython.lib-python.3.test.test_typing.GenericTests.test_parameter_detection -*graalpython.lib-python.3.test.test_typing.GenericTests.test_parameterized_slots -*graalpython.lib-python.3.test.test_typing.GenericTests.test_parameterized_slots_dict -*graalpython.lib-python.3.test.test_typing.GenericTests.test_pickle -*graalpython.lib-python.3.test.test_typing.GenericTests.test_repr -*graalpython.lib-python.3.test.test_typing.GenericTests.test_repr_2 -*graalpython.lib-python.3.test.test_typing.GenericTests.test_subclass_special_form -*graalpython.lib-python.3.test.test_typing.GenericTests.test_subscript_meta -*graalpython.lib-python.3.test.test_typing.GenericTests.test_subscripted_generics_as_proxies -*graalpython.lib-python.3.test.test_typing.GenericTests.test_type_erasure -*graalpython.lib-python.3.test.test_typing.GenericTests.test_type_erasure_special -*graalpython.lib-python.3.test.test_typing.GenericTests.test_weakref_all -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_forward_ref_and_final -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_get_type_hints_ClassVar -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_get_type_hints_annotated -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_get_type_hints_annotated_bad_module -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_get_type_hints_annotated_in_union -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_get_type_hints_annotated_refs -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_get_type_hints_annotated_with_none_default -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_get_type_hints_bad_module -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_get_type_hints_classes -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_get_type_hints_classes_no_implicit_optional -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_get_type_hints_classes_str_annotations -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_get_type_hints_collections_abc_callable -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_get_type_hints_for_builtins -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_get_type_hints_for_object_with_annotations -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_get_type_hints_from_various_objects -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_get_type_hints_modules -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_get_type_hints_modules_forwardref -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_get_type_hints_typeddict -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_get_type_hints_wrapped_decoratored_func -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_previous_behavior -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_respect_no_type_check -*graalpython.lib-python.3.test.test_typing.GetTypeHintTests.test_top_level_class_var -*graalpython.lib-python.3.test.test_typing.GetUtilitiesTestCase.test_forward_ref_and_final -*graalpython.lib-python.3.test.test_typing.GetUtilitiesTestCase.test_get_args -*graalpython.lib-python.3.test.test_typing.GetUtilitiesTestCase.test_get_origin -*graalpython.lib-python.3.test.test_typing.GetUtilitiesTestCase.test_top_level_class_var -*graalpython.lib-python.3.test.test_typing.IOTests.test_binaryio -*graalpython.lib-python.3.test.test_typing.IOTests.test_io -*graalpython.lib-python.3.test.test_typing.IOTests.test_io_submodule -*graalpython.lib-python.3.test.test_typing.IOTests.test_textio -*graalpython.lib-python.3.test.test_typing.LiteralStringTests.test_alias -*graalpython.lib-python.3.test.test_typing.LiteralStringTests.test_basics -*graalpython.lib-python.3.test.test_typing.LiteralStringTests.test_cannot_init -*graalpython.lib-python.3.test.test_typing.LiteralStringTests.test_cannot_subclass -*graalpython.lib-python.3.test.test_typing.LiteralStringTests.test_cannot_subscript -*graalpython.lib-python.3.test.test_typing.LiteralStringTests.test_equality -*graalpython.lib-python.3.test.test_typing.LiteralStringTests.test_no_isinstance -*graalpython.lib-python.3.test.test_typing.LiteralStringTests.test_repr -*graalpython.lib-python.3.test.test_typing.LiteralTests.test_args -*graalpython.lib-python.3.test.test_typing.LiteralTests.test_basics -*graalpython.lib-python.3.test.test_typing.LiteralTests.test_cannot_init -*graalpython.lib-python.3.test.test_typing.LiteralTests.test_does_not_flatten_enum -*graalpython.lib-python.3.test.test_typing.LiteralTests.test_enum -*graalpython.lib-python.3.test.test_typing.LiteralTests.test_equal -*graalpython.lib-python.3.test.test_typing.LiteralTests.test_flatten -*graalpython.lib-python.3.test.test_typing.LiteralTests.test_hash -*graalpython.lib-python.3.test.test_typing.LiteralTests.test_illegal_parameters_do_not_raise_runtime_errors -*graalpython.lib-python.3.test.test_typing.LiteralTests.test_literals_inside_other_types -*graalpython.lib-python.3.test.test_typing.LiteralTests.test_no_isinstance_or_issubclass -*graalpython.lib-python.3.test.test_typing.LiteralTests.test_no_multiple_subscripts -*graalpython.lib-python.3.test.test_typing.LiteralTests.test_no_subclassing -*graalpython.lib-python.3.test.test_typing.LiteralTests.test_repr -*graalpython.lib-python.3.test.test_typing.NamedTupleTests.test_annotation_usage -*graalpython.lib-python.3.test.test_typing.NamedTupleTests.test_annotation_usage_with_default -*graalpython.lib-python.3.test.test_typing.NamedTupleTests.test_annotation_usage_with_methods -*graalpython.lib-python.3.test.test_typing.NamedTupleTests.test_basics -*graalpython.lib-python.3.test.test_typing.NamedTupleTests.test_copy_and_pickle -*graalpython.lib-python.3.test.test_typing.NamedTupleTests.test_empty_namedtuple -*graalpython.lib-python.3.test.test_typing.NamedTupleTests.test_generic -*graalpython.lib-python.3.test.test_typing.NamedTupleTests.test_multiple_inheritance -*graalpython.lib-python.3.test.test_typing.NamedTupleTests.test_namedtuple_errors -*graalpython.lib-python.3.test.test_typing.NamedTupleTests.test_namedtuple_keyword_usage -*graalpython.lib-python.3.test.test_typing.NamedTupleTests.test_namedtuple_pyversion -*graalpython.lib-python.3.test.test_typing.NamedTupleTests.test_namedtuple_special_keyword_names -*graalpython.lib-python.3.test.test_typing.NamedTupleTests.test_non_generic_subscript -*graalpython.lib-python.3.test.test_typing.NeverTests.test_cannot_instantiate -*graalpython.lib-python.3.test.test_typing.NeverTests.test_cannot_subclass -*graalpython.lib-python.3.test.test_typing.NeverTests.test_equality -*graalpython.lib-python.3.test.test_typing.NeverTests.test_get_origin -*graalpython.lib-python.3.test.test_typing.NeverTests.test_get_type_hints -*graalpython.lib-python.3.test.test_typing.NeverTests.test_instance_type_error -*graalpython.lib-python.3.test.test_typing.NeverTests.test_not_generic -*graalpython.lib-python.3.test.test_typing.NeverTests.test_repr -*graalpython.lib-python.3.test.test_typing.NeverTests.test_subclass_type_error -*graalpython.lib-python.3.test.test_typing.NewTypeCTests.test_basic -*graalpython.lib-python.3.test.test_typing.NewTypeCTests.test_error_message_when_subclassing -*graalpython.lib-python.3.test.test_typing.NewTypeCTests.test_errors -*graalpython.lib-python.3.test.test_typing.NewTypeCTests.test_missing__name__ -*graalpython.lib-python.3.test.test_typing.NewTypeCTests.test_or -*graalpython.lib-python.3.test.test_typing.NewTypeCTests.test_pickle -*graalpython.lib-python.3.test.test_typing.NewTypeCTests.test_repr -*graalpython.lib-python.3.test.test_typing.NewTypeCTests.test_special_attrs -*graalpython.lib-python.3.test.test_typing.NewTypePythonTests.test_basic -*graalpython.lib-python.3.test.test_typing.NewTypePythonTests.test_error_message_when_subclassing -*graalpython.lib-python.3.test.test_typing.NewTypePythonTests.test_errors -*graalpython.lib-python.3.test.test_typing.NewTypePythonTests.test_missing__name__ -*graalpython.lib-python.3.test.test_typing.NewTypePythonTests.test_or -*graalpython.lib-python.3.test.test_typing.NewTypePythonTests.test_pickle -*graalpython.lib-python.3.test.test_typing.NewTypePythonTests.test_repr -*graalpython.lib-python.3.test.test_typing.NewTypePythonTests.test_special_attrs -*graalpython.lib-python.3.test.test_typing.NewTypeTests.test_basic -*graalpython.lib-python.3.test.test_typing.NewTypeTests.test_errors -*graalpython.lib-python.3.test.test_typing.NewTypeTests.test_missing__name__ -*graalpython.lib-python.3.test.test_typing.NewTypeTests.test_or -*graalpython.lib-python.3.test.test_typing.NewTypeTests.test_pickle -*graalpython.lib-python.3.test.test_typing.NewTypeTests.test_repr -*graalpython.lib-python.3.test.test_typing.NewTypeTests.test_special_attrs -*graalpython.lib-python.3.test.test_typing.NoReturnTests.test_cannot_instantiate -*graalpython.lib-python.3.test.test_typing.NoReturnTests.test_cannot_subclass -*graalpython.lib-python.3.test.test_typing.NoReturnTests.test_equality -*graalpython.lib-python.3.test.test_typing.NoReturnTests.test_get_origin -*graalpython.lib-python.3.test.test_typing.NoReturnTests.test_get_type_hints -*graalpython.lib-python.3.test.test_typing.NoReturnTests.test_instance_type_error -*graalpython.lib-python.3.test.test_typing.NoReturnTests.test_noreturn_instance_type_error -*graalpython.lib-python.3.test.test_typing.NoReturnTests.test_noreturn_subclass_type_error -*graalpython.lib-python.3.test.test_typing.NoReturnTests.test_not_equality -*graalpython.lib-python.3.test.test_typing.NoReturnTests.test_not_generic -*graalpython.lib-python.3.test.test_typing.NoReturnTests.test_repr -*graalpython.lib-python.3.test.test_typing.NoReturnTests.test_subclass_type_error -*graalpython.lib-python.3.test.test_typing.NotRequiredTests.test_basics -*graalpython.lib-python.3.test.test_typing.NotRequiredTests.test_cannot_init -*graalpython.lib-python.3.test.test_typing.NotRequiredTests.test_cannot_subclass -*graalpython.lib-python.3.test.test_typing.NotRequiredTests.test_no_isinstance -*graalpython.lib-python.3.test.test_typing.NotRequiredTests.test_repr -*graalpython.lib-python.3.test.test_typing.OtherABCTests.test_async_contextmanager -*graalpython.lib-python.3.test.test_typing.OtherABCTests.test_contextmanager -*graalpython.lib-python.3.test.test_typing.OverloadTests.test_overload_fails -*graalpython.lib-python.3.test.test_typing.OverloadTests.test_overload_on_compiled_functions -*graalpython.lib-python.3.test.test_typing.OverloadTests.test_overload_registry -*graalpython.lib-python.3.test.test_typing.OverloadTests.test_overload_registry_repeated -*graalpython.lib-python.3.test.test_typing.OverloadTests.test_overload_succeeds -*graalpython.lib-python.3.test.test_typing.ParamSpecTests.test_args_kwargs -*graalpython.lib-python.3.test.test_typing.ParamSpecTests.test_bad_var_substitution -*graalpython.lib-python.3.test.test_typing.ParamSpecTests.test_basic_plain -*graalpython.lib-python.3.test.test_typing.ParamSpecTests.test_multiple_paramspecs_in_user_generics -*graalpython.lib-python.3.test.test_typing.ParamSpecTests.test_no_paramspec_in__parameters__ -*graalpython.lib-python.3.test.test_typing.ParamSpecTests.test_paramspec_gets_copied -*graalpython.lib-python.3.test.test_typing.ParamSpecTests.test_paramspec_in_nested_generics -*graalpython.lib-python.3.test.test_typing.ParamSpecTests.test_stringized -*graalpython.lib-python.3.test.test_typing.ParamSpecTests.test_type_var_subst_for_other_type_vars -*graalpython.lib-python.3.test.test_typing.ParamSpecTests.test_typevartuple_and_paramspecs_in_user_generics -*graalpython.lib-python.3.test.test_typing.ParamSpecTests.test_user_generics -*graalpython.lib-python.3.test.test_typing.ParamSpecTests.test_valid_uses -*graalpython.lib-python.3.test.test_typing.ParamSpecTests.test_var_substitution -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_basic_protocol -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_builtin_protocol_allowlist -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_bundled_protocol_instance_works -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_cannot_instantiate_abstract -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_collections_protocols_allowed -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_concrete_class_inheriting_init_from_protocol -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_custom_subclasshook -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_defining_generic_protocols -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_defining_generic_protocols_old_style -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_empty_protocol_decorated_with_final -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_everything_implements_empty_protocol -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_function_implements_protocol -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_generic_protocols_eq -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_generic_protocols_repr -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_generic_protocols_special_from_generic -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_generic_protocols_special_from_protocol -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_implicit_issubclass_between_two_protocols -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_init_called -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_isinstance_checks_not_at_whim_of_gc -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_issubclass_fails_correctly -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_new_called -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_no_inheritance_from_nominal -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_no_instantiation -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_no_runtime_deco_on_nominal -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_non_protocol_subclasses -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_non_runtime_protocol_isinstance_check -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_none_on_callable_blocks_implementation -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_none_on_non_callable_doesnt_block_implementation -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_none_treated_correctly -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_protocol_checks_after_subscript -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_protocol_decorated_with_final_callable_members -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_protocol_decorated_with_final_mixed_members -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_protocol_decorated_with_final_noncallable_members -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_protocol_defining_init_does_not_get_overridden -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_protocols_bad_subscripts -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_protocols_in_unions -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_protocols_isinstance -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_protocols_isinstance_init -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_protocols_isinstance_monkeypatching -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_protocols_isinstance_not_fooled_by_custom_dir -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_protocols_isinstance_properties_and_descriptors -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_protocols_isinstance_py36 -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_protocols_issubclass -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_protocols_issubclass_non_callable -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_protocols_pickleable -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_protocols_support_register -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_reversible -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_subprotocols_extending -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_subprotocols_merging -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_super_call_init -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_supports_abs -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_supports_bytes -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_supports_complex -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_supports_float -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_supports_index -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_supports_int -*graalpython.lib-python.3.test.test_typing.ProtocolTests.test_supports_round -*graalpython.lib-python.3.test.test_typing.RETests.test_alias_equality -*graalpython.lib-python.3.test.test_typing.RETests.test_basics -*graalpython.lib-python.3.test.test_typing.RETests.test_errors -*graalpython.lib-python.3.test.test_typing.RETests.test_re_submodule -*graalpython.lib-python.3.test.test_typing.RETests.test_repr -*graalpython.lib-python.3.test.test_typing.RequiredTests.test_basics -*graalpython.lib-python.3.test.test_typing.RequiredTests.test_cannot_init -*graalpython.lib-python.3.test.test_typing.RequiredTests.test_cannot_subclass -*graalpython.lib-python.3.test.test_typing.RequiredTests.test_no_isinstance -*graalpython.lib-python.3.test.test_typing.RequiredTests.test_repr -*graalpython.lib-python.3.test.test_typing.RevealTypeTests.test_reveal_type -*graalpython.lib-python.3.test.test_typing.SelfTests.test_alias -*graalpython.lib-python.3.test.test_typing.SelfTests.test_basics -*graalpython.lib-python.3.test.test_typing.SelfTests.test_cannot_init -*graalpython.lib-python.3.test.test_typing.SelfTests.test_cannot_subclass -*graalpython.lib-python.3.test.test_typing.SelfTests.test_cannot_subscript -*graalpython.lib-python.3.test.test_typing.SelfTests.test_equality -*graalpython.lib-python.3.test.test_typing.SelfTests.test_no_isinstance -*graalpython.lib-python.3.test.test_typing.SelfTests.test_repr -*graalpython.lib-python.3.test.test_typing.SpecialAttrsTests.test_special_attrs -*graalpython.lib-python.3.test.test_typing.SpecialAttrsTests.test_special_attrs2 -*graalpython.lib-python.3.test.test_typing.TemplateReplacementTests.test_no_duplicates_if_replacement_not_in_templates -*graalpython.lib-python.3.test.test_typing.TemplateReplacementTests.test_two_templates_two_replacements_yields_correct_renders -*graalpython.lib-python.3.test.test_typing.TestModules.test_c_functions -*graalpython.lib-python.3.test.test_typing.TestModules.test_py_functions -*graalpython.lib-python.3.test.test_typing.TupleTests.test_basics -*graalpython.lib-python.3.test.test_typing.TupleTests.test_equality -*graalpython.lib-python.3.test.test_typing.TupleTests.test_errors -*graalpython.lib-python.3.test.test_typing.TupleTests.test_repr -*graalpython.lib-python.3.test.test_typing.TupleTests.test_tuple_instance_type_error -*graalpython.lib-python.3.test.test_typing.TupleTests.test_tuple_subclass -*graalpython.lib-python.3.test.test_typing.TypeAliasTests.test_cannot_instantiate -*graalpython.lib-python.3.test.test_typing.TypeAliasTests.test_cannot_subclass -*graalpython.lib-python.3.test.test_typing.TypeAliasTests.test_cannot_subscript -*graalpython.lib-python.3.test.test_typing.TypeAliasTests.test_canonical_usage_with_type_comment -*graalpython.lib-python.3.test.test_typing.TypeAliasTests.test_canonical_usage_with_variable_annotation -*graalpython.lib-python.3.test.test_typing.TypeAliasTests.test_no_isinstance -*graalpython.lib-python.3.test.test_typing.TypeAliasTests.test_no_issubclass -*graalpython.lib-python.3.test.test_typing.TypeAliasTests.test_repr -*graalpython.lib-python.3.test.test_typing.TypeAliasTests.test_stringized_usage -*graalpython.lib-python.3.test.test_typing.TypeGuardTests.test_basics -*graalpython.lib-python.3.test.test_typing.TypeGuardTests.test_cannot_init -*graalpython.lib-python.3.test.test_typing.TypeGuardTests.test_cannot_subclass -*graalpython.lib-python.3.test.test_typing.TypeGuardTests.test_no_isinstance -*graalpython.lib-python.3.test.test_typing.TypeGuardTests.test_repr -*graalpython.lib-python.3.test.test_typing.TypeIterationTests.test_is_not_instance_of_iterable -*graalpython.lib-python.3.test.test_typing.TypeTests.test_type_basic -*graalpython.lib-python.3.test.test_typing.TypeTests.test_type_optional -*graalpython.lib-python.3.test.test_typing.TypeTests.test_type_typevar -*graalpython.lib-python.3.test.test_typing.TypeVarTests.test_attributes -*graalpython.lib-python.3.test.test_typing.TypeVarTests.test_bad_var_substitution -*graalpython.lib-python.3.test.test_typing.TypeVarTests.test_basic_plain -*graalpython.lib-python.3.test.test_typing.TypeVarTests.test_bound_errors -*graalpython.lib-python.3.test.test_typing.TypeVarTests.test_cannot_instantiate_vars -*graalpython.lib-python.3.test.test_typing.TypeVarTests.test_cannot_subclass_var_itself -*graalpython.lib-python.3.test.test_typing.TypeVarTests.test_cannot_subclass_vars -*graalpython.lib-python.3.test.test_typing.TypeVarTests.test_constrained_error -*graalpython.lib-python.3.test.test_typing.TypeVarTests.test_missing__name__ -*graalpython.lib-python.3.test.test_typing.TypeVarTests.test_no_bivariant -*graalpython.lib-python.3.test.test_typing.TypeVarTests.test_no_redefinition -*graalpython.lib-python.3.test.test_typing.TypeVarTests.test_or -*graalpython.lib-python.3.test.test_typing.TypeVarTests.test_repr -*graalpython.lib-python.3.test.test_typing.TypeVarTests.test_typevar_instance_type_error -*graalpython.lib-python.3.test.test_typing.TypeVarTests.test_typevar_subclass_type_error -*graalpython.lib-python.3.test.test_typing.TypeVarTests.test_union_constrained -*graalpython.lib-python.3.test.test_typing.TypeVarTests.test_union_unique -*graalpython.lib-python.3.test.test_typing.TypeVarTests.test_var_substitution -*graalpython.lib-python.3.test.test_typing.TypeVarTuplePicklingTests.test_pickling_then_unpickling_results_in_same_identity -*graalpython.lib-python.3.test.test_typing.TypeVarTuplePicklingTests.test_pickling_then_unpickling_tuple_with_typevartuple_equality -*graalpython.lib-python.3.test.test_typing.TypeVarTuplePicklingTests.test_pickling_then_unpickling_unpacked_results_in_same_identity -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_bad_var_substitution -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_callable_args_are_correct -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_cannot_call_instance -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_cannot_subclass_class -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_cannot_subclass_instance -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_concatenation_in_variadic_args_annotations_are_correct -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_different_instances_are_different -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_get_type_hints_on_unpack_args -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_get_type_hints_on_unpack_args_string -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_instance_is_equal_to_itself -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_instance_isinstance_of_typevartuple -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_name -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_parameterised_tuple_is_equal_to_itself -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_repr_is_correct -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_tuple_args_and_parameters_are_correct -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_tuple_args_are_correct -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_type_concatenation_in_tuple_argument_list_succeeds -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_type_concatenation_in_variadic_class_argument_list_succeeds -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_unpacked_typevartuple_is_equal_to_itself -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_variadic_args_annotations_are_correct -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_variadic_args_with_ellipsis_annotations_are_correct -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_variadic_class_alias_repr_is_correct -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_variadic_class_arg_ordering_matters -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_variadic_class_arg_typevartuple_identity_matters -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_variadic_class_args_are_correct -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_variadic_class_definition_using_concrete_types_fails -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_variadic_class_definition_using_packed_typevartuple_fails -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_variadic_class_origin_is_correct -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_variadic_class_repr_is_correct -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_variadic_class_same_args_results_in_equalty -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_variadic_class_with_2_typevars_accepts_2_or_more_args -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.test_variadic_class_with_duplicate_typevartuples_fails -*graalpython.lib-python.3.test.test_typing.TypeVarTupleTests.tests_tuple_arg_ordering_matters -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_basics_functional_syntax -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_basics_keywords_syntax -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_generic_inheritance -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_get_type_hints -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_get_type_hints_generic -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_implicit_any_inheritance -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_is_typeddict -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_keys_inheritance -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_keys_inheritance_with_same_name -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_multiple_inheritance -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_multiple_inheritance_with_same_key -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_non_generic_subscript -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_optional -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_optional_keys -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_pickle -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_pickle_generic -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_py36_class_syntax_usage -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_required_notrequired_keys -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_total -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_typeddict_create_errors -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_typeddict_errors -*graalpython.lib-python.3.test.test_typing.TypedDictTests.test_typeddict_special_keyword_names -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_basic -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_callable_instance_type_error -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_callable_instance_works -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_callable_with_ellipsis -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_callable_wrong_forms -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_cannot_instantiate -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_concatenate -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_consistency -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_ellipsis_in_generic -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_eq_hash -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_errors -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_nested_paramspec -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_or_and_ror -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_paramspec -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_pickle -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_repr -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_self_subclass -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_type_erasure -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_type_subst_error -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_var_substitution -*graalpython.lib-python.3.test.test_typing.TypingCallableTests.test_weakref -*graalpython.lib-python.3.test.test_typing.UnionTests.test_base_class_kept -*graalpython.lib-python.3.test.test_typing.UnionTests.test_basics -*graalpython.lib-python.3.test.test_typing.UnionTests.test_cannot_instantiate -*graalpython.lib-python.3.test.test_typing.UnionTests.test_cannot_subclass -*graalpython.lib-python.3.test.test_typing.UnionTests.test_empty -*graalpython.lib-python.3.test.test_typing.UnionTests.test_etree -*graalpython.lib-python.3.test.test_typing.UnionTests.test_function_repr_union -*graalpython.lib-python.3.test.test_typing.UnionTests.test_no_eval_union -*graalpython.lib-python.3.test.test_typing.UnionTests.test_optional -*graalpython.lib-python.3.test.test_typing.UnionTests.test_repr -*graalpython.lib-python.3.test.test_typing.UnionTests.test_single_class_disappears -*graalpython.lib-python.3.test.test_typing.UnionTests.test_subclass_error -*graalpython.lib-python.3.test.test_typing.UnionTests.test_union_any -*graalpython.lib-python.3.test.test_typing.UnionTests.test_union_compare_other -*graalpython.lib-python.3.test.test_typing.UnionTests.test_union_generalization -*graalpython.lib-python.3.test.test_typing.UnionTests.test_union_object -*graalpython.lib-python.3.test.test_typing.UnionTests.test_union_of_literals -*graalpython.lib-python.3.test.test_typing.UnionTests.test_union_str_pattern -*graalpython.lib-python.3.test.test_typing.UnionTests.test_union_union -*graalpython.lib-python.3.test.test_typing.UnionTests.test_unordered -*graalpython.lib-python.3.test.test_typing.UnpackTests.test_accepts_single_type -*graalpython.lib-python.3.test.test_typing.UnpackTests.test_cannot_be_called -*graalpython.lib-python.3.test.test_typing.UnpackTests.test_rejects_multiple_parameterization -*graalpython.lib-python.3.test.test_typing.UnpackTests.test_rejects_multiple_types +DocTestCase.typing.TypedDict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.typing._collect_parameters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.typing._should_unflatten_callable_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.typing.get_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.typing.get_origin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +DocTestCase.typing.is_typeddict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AllTests.test_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AllTests.test_all_exported_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_annotated_cached_with_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_annotated_in_other_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_annotated_mro @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_attr_passthrough @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_cannot_check_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_cannot_check_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_cannot_getattr_typevar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_cannot_instantiate_forward @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_cannot_instantiate_type_var @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_cannot_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_flatten @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_hash_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_instantiate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_instantiate_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_special_form_containment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_specialize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_subst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnnotatedTests.test_too_few_type_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnyTests.test_any_instance_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnyTests.test_any_works_with_alias @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnyTests.test_can_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnyTests.test_cannot_instantiate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnyTests.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AnyTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AssertNeverTests.test_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AssertTypeTests.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.AssertTypeTests.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CastTests.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CastTests.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ClassVarTests.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ClassVarTests.test_cannot_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ClassVarTests.test_cannot_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ClassVarTests.test_no_isinstance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ClassVarTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_abstractset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_async_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_async_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_async_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_awaitable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_bytestring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_chainmap_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_chainmap_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_collection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_collections_as_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_container @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_coroutine @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_counter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_counter_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_counter_subclass_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_defaultdict_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_defaultdict_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_deque @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_deque_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_dict_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_dict_subscribe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_frozenset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_frozenset_subclass_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_hashable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_list_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_mapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_mutablemapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_mutablesequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_mutableset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_no_async_generator_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_no_dict_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_no_frozenset_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_no_generator_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_no_list_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_no_set_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_no_tuple_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_or_and_ror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_ordereddict_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_ordereddict_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_set_subclass_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_sized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_subclassing_async_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_subclassing_register @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsAbcTests.test_subclassing_subclasshook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_callable_instance_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_callable_instance_works @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_callable_with_ellipsis @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_callable_wrong_forms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_cannot_instantiate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_concatenate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_ellipsis_in_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_eq_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_or_and_ror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_paramspec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_self_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_type_erasure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_type_subst_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_var_substitution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.CollectionsCallableTests.test_weakref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ConcatenateTests.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ConcatenateTests.test_valid_uses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ConcatenateTests.test_var_substitution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.DataclassTransformTests.test_base_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.DataclassTransformTests.test_decorator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.DataclassTransformTests.test_metaclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.FinalDecoratorTests.test_dunder_final @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.FinalDecoratorTests.test_final_unmodified @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.FinalTests.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.FinalTests.test_cannot_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.FinalTests.test_cannot_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.FinalTests.test_no_isinstance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.FinalTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_callable_forward @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_callable_with_ellipsis_forward @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_default_globals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_delayed_syntax_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_double_forward @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_final_forward_ref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_forward_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_forward_equality_gth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_forward_equality_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_forward_equality_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_forward_recursion_actually @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_forward_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_forwardref_instance_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_forwardref_only_str_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_forwardref_subclass_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_meta_no_type_check @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_name_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_nested_classvar_fails_forward_ref_check @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_no_type_check @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_no_type_check_TypeError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_no_type_check_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_no_type_check_class_and_static_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_no_type_check_forward_ref_as_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_no_type_check_lambda @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_no_type_check_nested_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_no_type_check_no_bases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_no_type_check_other_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_or @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_special_forms_forward @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_syntax_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_tuple_forward @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_union_forward @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ForwardRefTests.test_union_forward_recursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericAliasSubstitutionTests.test_one_parameter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericAliasSubstitutionTests.test_three_parameters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericAliasSubstitutionTests.test_two_parameters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_abc_bases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_abc_registry_kept @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_all_repr_eq_any @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_chain_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_complex_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_copy_and_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_copy_generic_instances @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_eq_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_eq_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_extended_generic_rules_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_extended_generic_rules_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_extended_generic_rules_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_fail_with_bare_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_fail_with_bare_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_false_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_generic_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_generic_forward_ref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_generic_hashes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_generic_pep585_forward_ref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_immutability_by_copy_and_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_implicit_any @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_init_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_init_subclass_super_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_multi_subscr_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_multiple_bases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_multiple_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_multiple_inheritance_special @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_naive_runtime_checks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_new_no_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_new_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_new_repr_bare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_new_repr_complex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_new_with_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_new_with_args2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_non_generic_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_orig_bases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_parameter_detection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_parameterized_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_parameterized_slots_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_repr_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_subclass_special_form @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_subscript_meta @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_subscripted_generics_as_proxies @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_type_erasure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_type_erasure_special @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GenericTests.test_weakref_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_forward_ref_and_final @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_get_type_hints_ClassVar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_get_type_hints_annotated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_get_type_hints_annotated_bad_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_get_type_hints_annotated_in_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_get_type_hints_annotated_refs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_get_type_hints_annotated_with_none_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_get_type_hints_bad_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_get_type_hints_classes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_get_type_hints_classes_no_implicit_optional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_get_type_hints_classes_str_annotations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_get_type_hints_collections_abc_callable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_get_type_hints_for_builtins @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_get_type_hints_for_object_with_annotations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_get_type_hints_from_various_objects @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_get_type_hints_modules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_get_type_hints_typeddict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_get_type_hints_wrapped_decoratored_func @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_previous_behavior @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_respect_no_type_check @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetTypeHintTests.test_top_level_class_var @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetUtilitiesTestCase.test_get_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.GetUtilitiesTestCase.test_get_origin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.IOTests.test_binaryio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.IOTests.test_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.IOTests.test_io_submodule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.IOTests.test_textio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralStringTests.test_alias @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralStringTests.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralStringTests.test_cannot_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralStringTests.test_cannot_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralStringTests.test_cannot_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralStringTests.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralStringTests.test_no_isinstance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralStringTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralTests.test_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralTests.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralTests.test_cannot_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralTests.test_does_not_flatten_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralTests.test_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralTests.test_equal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralTests.test_flatten @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralTests.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralTests.test_illegal_parameters_do_not_raise_runtime_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralTests.test_literals_inside_other_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralTests.test_no_isinstance_or_issubclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralTests.test_no_multiple_subscripts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralTests.test_no_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.LiteralTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NamedTupleTests.test_annotation_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NamedTupleTests.test_annotation_usage_with_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NamedTupleTests.test_annotation_usage_with_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NamedTupleTests.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NamedTupleTests.test_copy_and_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NamedTupleTests.test_empty_namedtuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NamedTupleTests.test_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NamedTupleTests.test_multiple_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NamedTupleTests.test_namedtuple_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NamedTupleTests.test_namedtuple_keyword_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NamedTupleTests.test_namedtuple_special_keyword_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NamedTupleTests.test_non_generic_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NeverTests.test_cannot_instantiate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NeverTests.test_cannot_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NeverTests.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NeverTests.test_get_origin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NeverTests.test_get_type_hints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NeverTests.test_instance_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NeverTests.test_not_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NeverTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NeverTests.test_subclass_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NewTypePythonTests.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NewTypePythonTests.test_error_message_when_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NewTypePythonTests.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NewTypePythonTests.test_missing__name__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NewTypePythonTests.test_or @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NewTypePythonTests.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NewTypePythonTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NewTypePythonTests.test_special_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NoReturnTests.test_cannot_instantiate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NoReturnTests.test_cannot_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NoReturnTests.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NoReturnTests.test_get_origin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NoReturnTests.test_get_type_hints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NoReturnTests.test_instance_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NoReturnTests.test_not_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NoReturnTests.test_not_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NoReturnTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NoReturnTests.test_subclass_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NotRequiredTests.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NotRequiredTests.test_cannot_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NotRequiredTests.test_cannot_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NotRequiredTests.test_no_isinstance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.NotRequiredTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.OtherABCTests.test_async_contextmanager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.OtherABCTests.test_contextmanager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.OverloadTests.test_overload_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.OverloadTests.test_overload_registry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.OverloadTests.test_overload_registry_repeated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.OverloadTests.test_overload_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ParamSpecTests.test_args_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ParamSpecTests.test_bad_var_substitution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ParamSpecTests.test_basic_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ParamSpecTests.test_multiple_paramspecs_in_user_generics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ParamSpecTests.test_paramspec_gets_copied @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ParamSpecTests.test_paramspec_in_nested_generics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ParamSpecTests.test_stringized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ParamSpecTests.test_type_var_subst_for_other_type_vars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ParamSpecTests.test_typevartuple_and_paramspecs_in_user_generics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ParamSpecTests.test_user_generics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ParamSpecTests.test_valid_uses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ParamSpecTests.test_var_substitution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_basic_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_builtin_protocol_allowlist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_bundled_protocol_instance_works @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_cannot_instantiate_abstract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_collections_protocols_allowed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_concrete_class_inheriting_init_from_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_custom_subclasshook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_defining_generic_protocols @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_defining_generic_protocols_old_style @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_empty_protocol_decorated_with_final @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_everything_implements_empty_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_function_implements_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_generic_protocols_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_generic_protocols_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_generic_protocols_special_from_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_generic_protocols_special_from_protocol @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_implicit_issubclass_between_two_protocols @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_init_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_isinstance_checks_not_at_whim_of_gc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_issubclass_fails_correctly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_new_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_no_inheritance_from_nominal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_no_instantiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_no_runtime_deco_on_nominal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_non_protocol_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_non_runtime_protocol_isinstance_check @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_none_on_callable_blocks_implementation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_none_on_non_callable_doesnt_block_implementation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_none_treated_correctly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_protocol_checks_after_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_protocol_decorated_with_final_callable_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_protocol_decorated_with_final_mixed_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_protocol_decorated_with_final_noncallable_members @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_protocol_defining_init_does_not_get_overridden @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_protocols_bad_subscripts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_protocols_in_unions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_protocols_isinstance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_protocols_isinstance_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_protocols_isinstance_monkeypatching @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_protocols_isinstance_not_fooled_by_custom_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_protocols_isinstance_properties_and_descriptors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_protocols_isinstance_py36 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_protocols_issubclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_protocols_issubclass_non_callable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_protocols_pickleable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_protocols_support_register @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_reversible @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_subprotocols_extending @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_subprotocols_merging @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_super_call_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_supports_abs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_supports_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_supports_complex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_supports_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_supports_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_supports_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.ProtocolTests.test_supports_round @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.RETests.test_alias_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.RETests.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.RETests.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.RETests.test_re_submodule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.RETests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.RequiredTests.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.RequiredTests.test_cannot_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.RequiredTests.test_cannot_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.RequiredTests.test_no_isinstance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.RequiredTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.RevealTypeTests.test_reveal_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.SelfTests.test_alias @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.SelfTests.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.SelfTests.test_cannot_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.SelfTests.test_cannot_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.SelfTests.test_cannot_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.SelfTests.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.SelfTests.test_no_isinstance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.SelfTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.SpecialAttrsTests.test_special_attrs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.SpecialAttrsTests.test_special_attrs2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TemplateReplacementTests.test_no_duplicates_if_replacement_not_in_templates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TemplateReplacementTests.test_two_templates_two_replacements_yields_correct_renders @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TestModules.test_py_functions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TupleTests.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TupleTests.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TupleTests.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TupleTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TupleTests.test_tuple_instance_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TupleTests.test_tuple_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeAliasTests.test_cannot_instantiate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeAliasTests.test_cannot_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeAliasTests.test_cannot_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeAliasTests.test_canonical_usage_with_type_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeAliasTests.test_canonical_usage_with_variable_annotation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeAliasTests.test_no_isinstance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeAliasTests.test_no_issubclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeAliasTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeAliasTests.test_stringized_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeGuardTests.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeGuardTests.test_cannot_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeGuardTests.test_cannot_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeGuardTests.test_no_isinstance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeGuardTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeIterationTests.test_is_not_instance_of_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeTests.test_type_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeTests.test_type_optional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeTests.test_type_typevar @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTests.test_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTests.test_bad_var_substitution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTests.test_basic_plain @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTests.test_bound_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTests.test_cannot_instantiate_vars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTests.test_cannot_subclass_var_itself @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTests.test_cannot_subclass_vars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTests.test_constrained_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTests.test_missing__name__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTests.test_no_bivariant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTests.test_no_redefinition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTests.test_or @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTests.test_typevar_instance_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTests.test_typevar_subclass_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTests.test_union_constrained @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTests.test_union_unique @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTests.test_var_substitution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTuplePicklingTests.test_pickling_then_unpickling_results_in_same_identity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTuplePicklingTests.test_pickling_then_unpickling_tuple_with_typevartuple_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTuplePicklingTests.test_pickling_then_unpickling_unpacked_results_in_same_identity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_bad_var_substitution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_callable_args_are_correct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_cannot_call_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_cannot_subclass_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_cannot_subclass_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_concatenation_in_variadic_args_annotations_are_correct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_different_instances_are_different @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_get_type_hints_on_unpack_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_get_type_hints_on_unpack_args_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_instance_is_equal_to_itself @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_instance_isinstance_of_typevartuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_parameterised_tuple_is_equal_to_itself @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_repr_is_correct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_tuple_args_and_parameters_are_correct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_tuple_args_are_correct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_type_concatenation_in_tuple_argument_list_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_type_concatenation_in_variadic_class_argument_list_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_unpacked_typevartuple_is_equal_to_itself @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_variadic_args_annotations_are_correct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_variadic_args_with_ellipsis_annotations_are_correct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_variadic_class_alias_repr_is_correct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_variadic_class_arg_ordering_matters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_variadic_class_arg_typevartuple_identity_matters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_variadic_class_args_are_correct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_variadic_class_definition_using_concrete_types_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_variadic_class_definition_using_packed_typevartuple_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_variadic_class_origin_is_correct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_variadic_class_repr_is_correct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_variadic_class_same_args_results_in_equalty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_variadic_class_with_2_typevars_accepts_2_or_more_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.test_variadic_class_with_duplicate_typevartuples_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypeVarTupleTests.tests_tuple_arg_ordering_matters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_basics_functional_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_basics_keywords_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_generic_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_get_type_hints @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_get_type_hints_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_implicit_any_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_is_typeddict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_keys_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_keys_inheritance_with_same_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_multiple_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_multiple_inheritance_with_same_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_non_generic_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_optional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_optional_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_pickle_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_py36_class_syntax_usage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_required_notrequired_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_total @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_typeddict_create_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_typeddict_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypedDictTests.test_typeddict_special_keyword_names @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_callable_instance_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_callable_instance_works @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_callable_with_ellipsis @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_callable_wrong_forms @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_cannot_instantiate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_concatenate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_consistency @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_ellipsis_in_generic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_eq_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_nested_paramspec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_or_and_ror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_paramspec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_self_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_type_erasure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_type_subst_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_var_substitution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.TypingCallableTests.test_weakref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_base_class_kept @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_basics @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_cannot_instantiate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_cannot_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_etree @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_function_repr_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_no_eval_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_optional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_single_class_disappears @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_subclass_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_union_any @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_union_compare_other @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_union_generalization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_union_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_union_of_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_union_str_pattern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_union_union @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnionTests.test_unordered @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnpackTests.test_accepts_single_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnpackTests.test_cannot_be_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnpackTests.test_rejects_multiple_parameterization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_typing.UnpackTests.test_rejects_multiple_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ucn.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ucn.txt index 960897c03e..759b4bde10 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ucn.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_ucn.txt @@ -1,13 +1,12 @@ -*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_aliases -*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_aliases_names_in_pua_range -*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_ascii_letters -*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_cjk_unified_ideographs -*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_errors -*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_general -*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_hangul_syllables -*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_issue16335 -*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_misc_symbols -*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_named_sequences_full -*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_named_sequences_names_in_pua_range -*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_named_sequences_sample -*graalpython.lib-python.3.test.test_ucn.UnicodeNamesTest.test_strict_error_handling +test.test_ucn.UnicodeNamesTest.test_aliases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ucn.UnicodeNamesTest.test_aliases_names_in_pua_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ucn.UnicodeNamesTest.test_ascii_letters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ucn.UnicodeNamesTest.test_cjk_unified_ideographs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ucn.UnicodeNamesTest.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ucn.UnicodeNamesTest.test_general @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ucn.UnicodeNamesTest.test_hangul_syllables @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ucn.UnicodeNamesTest.test_misc_symbols @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ucn.UnicodeNamesTest.test_named_sequences_full @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ucn.UnicodeNamesTest.test_named_sequences_names_in_pua_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ucn.UnicodeNamesTest.test_named_sequences_sample @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_ucn.UnicodeNamesTest.test_strict_error_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unary.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unary.txt index 6176614be3..2befe1bf65 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unary.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unary.txt @@ -1,6 +1,6 @@ -*graalpython.lib-python.3.test.test_unary.UnaryOpTestCase.test_bad_types -*graalpython.lib-python.3.test.test_unary.UnaryOpTestCase.test_invert -*graalpython.lib-python.3.test.test_unary.UnaryOpTestCase.test_negation_of_exponentiation -*graalpython.lib-python.3.test.test_unary.UnaryOpTestCase.test_negative -*graalpython.lib-python.3.test.test_unary.UnaryOpTestCase.test_no_overflow -*graalpython.lib-python.3.test.test_unary.UnaryOpTestCase.test_positive +test.test_unary.UnaryOpTestCase.test_bad_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unary.UnaryOpTestCase.test_invert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unary.UnaryOpTestCase.test_negation_of_exponentiation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unary.UnaryOpTestCase.test_negative @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unary.UnaryOpTestCase.test_no_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unary.UnaryOpTestCase.test_positive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicode.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicode.txt index 8d1ce424f6..d5f197e698 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicode.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicode.txt @@ -1,140 +1,112 @@ -*graalpython.lib-python.3.test.test_unicode.CAPITest.test_asucs4 -*graalpython.lib-python.3.test.test_unicode.CAPITest.test_asutf8 -*graalpython.lib-python.3.test.test_unicode.CAPITest.test_asutf8andsize -*graalpython.lib-python.3.test.test_unicode.CAPITest.test_aswidechar -*graalpython.lib-python.3.test.test_unicode.CAPITest.test_aswidecharstring -*graalpython.lib-python.3.test.test_unicode.CAPITest.test_copycharacters -*graalpython.lib-python.3.test.test_unicode.CAPITest.test_encode_decimal -*graalpython.lib-python.3.test.test_unicode.CAPITest.test_findchar -*graalpython.lib-python.3.test.test_unicode.CAPITest.test_from_format -*graalpython.lib-python.3.test.test_unicode.CAPITest.test_pep393_utf8_caching_bug -*graalpython.lib-python.3.test.test_unicode.CAPITest.test_transform_decimal -*graalpython.lib-python.3.test.test_unicode.StringModuleTest.test_formatter_field_name_split -*graalpython.lib-python.3.test.test_unicode.StringModuleTest.test_formatter_parser -*graalpython.lib-python.3.test.test_unicode.StringModuleTest.test_str_subclass_attr -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test___contains__ -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_additional_rsplit -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_additional_split -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_ascii -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_bug1001011 -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_bytes_comparison -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_capitalize -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_capitalize_nonascii -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_case_operation_overflow -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_casefold -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_center -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_codecs -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_codecs_charmap -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_codecs_errors -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_codecs_idna -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_codecs_utf7 -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_codecs_utf8 -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_compare -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_comparison -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_concatenation -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_constructor -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_constructor_defaults -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_constructor_keyword_args -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_contains -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_conversion -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_count -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_endswith -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_exhausted_iterator -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_expandtabs -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_expandtabs_optimization -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_expandtabs_overflows_gracefully -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_extended_getslice -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_find -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_find_etc_raise_correct_error_messages -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_find_periodic_pattern -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_find_shift_table_overflow -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_fixtype -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_floatformatting -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_format -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_format_auto_numbering -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_format_float -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_format_huge_item_number -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_format_huge_precision -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_format_huge_width -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_format_map -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_format_subclass -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_formatting -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_formatting_c_limits -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_formatting_huge_precision -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_formatting_huge_precision_c_limits -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_formatting_huge_width -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_formatting_with_enum -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_getnewargs -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_hash -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_index -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_inplace_rewrites -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_invalid_cb_for_2bytes_seq -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_invalid_cb_for_3bytes_seq -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_invalid_cb_for_4bytes_seq -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_invalid_start_byte -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_isalnum -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_isalpha -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_isascii -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_isdecimal -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_isdigit -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_isidentifier -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_isidentifier_legacy -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_islower -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_isnumeric -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_isprintable -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_isspace -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_isspace_invariant -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_issue18183 -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_issue28598_strsubclass_rhs -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_issue8271 -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_istitle -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_isupper -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_iteration -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_iterators -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_iterators_invocation -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_join -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_join_overflow -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_literals -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_ljust -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_lower -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_maketrans_translate -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_mul -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_none_arguments -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_partition -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_pickle_iterator -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_printable_repr -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_printing -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_raiseMemError -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_removeprefix -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_removesuffix -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_repeat_id_preserving -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_replace -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_replace_id -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_replace_overflow -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_repr -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_resize -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_rfind -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_rindex -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_rjust -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_rpartition -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_rsplit -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_slice -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_split -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_splitlines -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_startswith -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_startswith_endswith_errors -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_strip -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_strip_whitespace -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_subclass_add -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_subscript -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_surrogates -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_swapcase -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_title -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_ucs4 -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_unexpected_end_of_data -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_unicode_repr -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_upper -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_utf8_decode_invalid_sequences -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_utf8_decode_valid_sequences -*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_zfill +test.test_unicode.StringModuleTest.test_formatter_field_name_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.StringModuleTest.test_formatter_parser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.StringModuleTest.test_str_subclass_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test___contains__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_additional_rsplit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_additional_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_ascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_bug1001011 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_bytes_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_capitalize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_casefold @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_center @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_codecs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_codecs_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_codecs_idna @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_codecs_utf7 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_codecs_utf8 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_concatenation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_constructor_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_constructor_keyword_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_conversion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_endswith @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_exhausted_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_expandtabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_extended_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_find @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_find_etc_raise_correct_error_messages @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_find_periodic_pattern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_find_shift_table_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_fixtype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_floatformatting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_format @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_format_auto_numbering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_format_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_format_huge_item_number @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_format_huge_precision @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_format_huge_width @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_format_map @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_format_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_formatting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_formatting_huge_precision @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_formatting_huge_width @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_formatting_with_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_getnewargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_inplace_rewrites @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_invalid_cb_for_2bytes_seq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_invalid_cb_for_4bytes_seq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_invalid_start_byte @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_isalnum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_isalpha @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_isascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_isdecimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_isdigit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_isidentifier @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_islower @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_isnumeric @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_isprintable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_isspace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_isspace_invariant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_issue18183 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_issue28598_strsubclass_rhs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_issue8271 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_istitle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_isupper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_iterators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_iterators_invocation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_ljust @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_lower @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_maketrans_translate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_none_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_partition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_pickle_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_removeprefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_removesuffix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_repeat_id_preserving @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_rfind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_rindex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_rjust @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_rpartition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_rsplit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_splitlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_startswith @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_startswith_endswith_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_strip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_strip_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_subclass_add @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_surrogates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_swapcase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_title @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_ucs4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_unexpected_end_of_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_unicode_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_upper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_utf8_decode_invalid_sequences @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_utf8_decode_valid_sequences @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode.UnicodeTest.test_zfill @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicode_file.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicode_file.txt deleted file mode 100644 index a1d7067395..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicode_file.txt +++ /dev/null @@ -1,3 +0,0 @@ -*graalpython.lib-python.3.test.test_unicode_file.TestMain.test_main -*graalpython.lib-python.3.test.test_unicode_file.TestUnicodeFiles.test_directories -*graalpython.lib-python.3.test.test_unicode_file.TestUnicodeFiles.test_single_files diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicode_file_functions.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicode_file_functions.txt index 8989bacc39..d02836c50e 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicode_file_functions.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicode_file_functions.txt @@ -1,31 +1,30 @@ -*graalpython.lib-python.3.test.test_unicode_file_functions.TestMain.test_main -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeFileTests.test_directory -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeFileTests.test_failures -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeFileTests.test_listdir -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeFileTests.test_normalize -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeFileTests.test_open -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeFileTests.test_rename -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFCFileTests.test_directory -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFCFileTests.test_failures -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFCFileTests.test_listdir -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFCFileTests.test_normalize -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFCFileTests.test_open -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFCFileTests.test_rename -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFDFileTests.test_directory -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFDFileTests.test_failures -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFDFileTests.test_listdir -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFDFileTests.test_normalize -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFDFileTests.test_open -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFDFileTests.test_rename -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFKCFileTests.test_directory -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFKCFileTests.test_failures -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFKCFileTests.test_listdir -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFKCFileTests.test_normalize -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFKCFileTests.test_open -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFKCFileTests.test_rename -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFKDFileTests.test_directory -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFKDFileTests.test_failures -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFKDFileTests.test_listdir -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFKDFileTests.test_normalize -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFKDFileTests.test_open -*graalpython.lib-python.3.test.test_unicode_file_functions.UnicodeNFKDFileTests.test_rename +test.test_unicode_file_functions.UnicodeFileTests.test_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeFileTests.test_failures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeFileTests.test_listdir @ linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeFileTests.test_normalize @ linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeFileTests.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeFileTests.test_rename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFCFileTests.test_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFCFileTests.test_failures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFCFileTests.test_listdir @ linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFCFileTests.test_normalize @ linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFCFileTests.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFCFileTests.test_rename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFDFileTests.test_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFDFileTests.test_failures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFDFileTests.test_listdir @ linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFDFileTests.test_normalize @ linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFDFileTests.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFDFileTests.test_rename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFKCFileTests.test_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFKCFileTests.test_failures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFKCFileTests.test_listdir @ linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFKCFileTests.test_normalize @ linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFKCFileTests.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFKCFileTests.test_rename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFKDFileTests.test_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFKDFileTests.test_failures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFKDFileTests.test_listdir @ linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFKDFileTests.test_normalize @ linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFKDFileTests.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_file_functions.UnicodeNFKDFileTests.test_rename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicode_identifiers.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicode_identifiers.txt new file mode 100644 index 0000000000..ee5433ef45 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicode_identifiers.txt @@ -0,0 +1,2 @@ +test.test_unicode_identifiers.PEP3131Test.test_invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicode_identifiers.PEP3131Test.test_non_bmp_normalized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicodedata.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicodedata.txt index 0c39fcbc71..8c27431d98 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicodedata.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicodedata.txt @@ -1,22 +1,21 @@ -*graalpython.lib-python.3.test.test_unicodedata.NormalizationTest.test_bug_834676 -*graalpython.lib-python.3.test.test_unicodedata.NormalizationTest.test_edge_cases -*graalpython.lib-python.3.test.test_unicodedata.UnicodeFunctionsTest.test_category -*graalpython.lib-python.3.test.test_unicodedata.UnicodeFunctionsTest.test_combining -*graalpython.lib-python.3.test.test_unicodedata.UnicodeFunctionsTest.test_decimal -*graalpython.lib-python.3.test.test_unicodedata.UnicodeFunctionsTest.test_decomposition -*graalpython.lib-python.3.test.test_unicodedata.UnicodeFunctionsTest.test_digit -*graalpython.lib-python.3.test.test_unicodedata.UnicodeFunctionsTest.test_east_asian_width -*graalpython.lib-python.3.test.test_unicodedata.UnicodeFunctionsTest.test_east_asian_width_9_0_changes -*graalpython.lib-python.3.test.test_unicodedata.UnicodeFunctionsTest.test_issue10254 -*graalpython.lib-python.3.test.test_unicodedata.UnicodeFunctionsTest.test_issue29456 -*graalpython.lib-python.3.test.test_unicodedata.UnicodeFunctionsTest.test_mirrored -*graalpython.lib-python.3.test.test_unicodedata.UnicodeFunctionsTest.test_normalize -*graalpython.lib-python.3.test.test_unicodedata.UnicodeFunctionsTest.test_numeric -*graalpython.lib-python.3.test.test_unicodedata.UnicodeFunctionsTest.test_pr29 -*graalpython.lib-python.3.test.test_unicodedata.UnicodeMiscTest.test_bug_1704793 -*graalpython.lib-python.3.test.test_unicodedata.UnicodeMiscTest.test_bug_4971 -*graalpython.lib-python.3.test.test_unicodedata.UnicodeMiscTest.test_bug_5828 -*graalpython.lib-python.3.test.test_unicodedata.UnicodeMiscTest.test_decimal_numeric_consistent -*graalpython.lib-python.3.test.test_unicodedata.UnicodeMiscTest.test_digit_numeric_consistent -*graalpython.lib-python.3.test.test_unicodedata.UnicodeMiscTest.test_disallow_instantiation -*graalpython.lib-python.3.test.test_unicodedata.UnicodeMiscTest.test_ucd_510 +test.test_unicodedata.NormalizationTest.test_bug_834676 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.NormalizationTest.test_edge_cases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.NormalizationTest.test_normalization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.UnicodeFunctionsTest.test_category @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.UnicodeFunctionsTest.test_combining @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.UnicodeFunctionsTest.test_decimal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.UnicodeFunctionsTest.test_decomposition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.UnicodeFunctionsTest.test_digit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.UnicodeFunctionsTest.test_east_asian_width @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.UnicodeFunctionsTest.test_east_asian_width_9_0_changes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.UnicodeFunctionsTest.test_issue10254 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.UnicodeFunctionsTest.test_issue29456 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.UnicodeFunctionsTest.test_mirrored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.UnicodeFunctionsTest.test_numeric @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.UnicodeFunctionsTest.test_pr29 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.UnicodeMiscTest.test_bug_1704793 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.UnicodeMiscTest.test_bug_4971 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.UnicodeMiscTest.test_bug_5828 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.UnicodeMiscTest.test_decimal_numeric_consistent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.UnicodeMiscTest.test_digit_numeric_consistent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unicodedata.UnicodeMiscTest.test_ucd_510 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unittest.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unittest.txt index 55aaa88f7d..b884443c5b 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unittest.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unittest.txt @@ -1,976 +1,957 @@ -*unittest.test.test_assertions.TestLongMessage.testAlmostEqual -*unittest.test.test_assertions.TestLongMessage.testAssertDictContainsSubset -*unittest.test.test_assertions.TestLongMessage.testAssertDictEqual -*unittest.test.test_assertions.TestLongMessage.testAssertFalse -*unittest.test.test_assertions.TestLongMessage.testAssertGreater -*unittest.test.test_assertions.TestLongMessage.testAssertGreaterEqual -*unittest.test.test_assertions.TestLongMessage.testAssertIn -*unittest.test.test_assertions.TestLongMessage.testAssertIs -*unittest.test.test_assertions.TestLongMessage.testAssertIsNone -*unittest.test.test_assertions.TestLongMessage.testAssertIsNot -*unittest.test.test_assertions.TestLongMessage.testAssertIsNotNone -*unittest.test.test_assertions.TestLongMessage.testAssertLess -*unittest.test.test_assertions.TestLongMessage.testAssertLessEqual -*unittest.test.test_assertions.TestLongMessage.testAssertMultiLineEqual -*unittest.test.test_assertions.TestLongMessage.testAssertNotIn -*unittest.test.test_assertions.TestLongMessage.testAssertNotRegex -*unittest.test.test_assertions.TestLongMessage.testAssertRaises -*unittest.test.test_assertions.TestLongMessage.testAssertRaisesRegex -*unittest.test.test_assertions.TestLongMessage.testAssertRegex -*unittest.test.test_assertions.TestLongMessage.testAssertSequenceEqual -*unittest.test.test_assertions.TestLongMessage.testAssertSetEqual -*unittest.test.test_assertions.TestLongMessage.testAssertTrue -*unittest.test.test_assertions.TestLongMessage.testAssertWarns -*unittest.test.test_assertions.TestLongMessage.testAssertWarnsRegex -*unittest.test.test_assertions.TestLongMessage.testDefault -*unittest.test.test_assertions.TestLongMessage.testNotAlmostEqual -*unittest.test.test_assertions.TestLongMessage.testNotEqual -*unittest.test.test_assertions.TestLongMessage.test_baseAssertEqual -*unittest.test.test_assertions.TestLongMessage.test_formatMessage_unicode_error -*unittest.test.test_assertions.TestLongMessage.test_formatMsg -*unittest.test.test_assertions.Test_Assertions.testAssertNotRegex -*unittest.test.test_assertions.Test_Assertions.test_AlmostEqual -*unittest.test.test_assertions.Test_Assertions.test_AmostEqualWithDelta -*unittest.test.test_assertions.Test_Assertions.test_assertRaises -*unittest.test.test_assertions.Test_Assertions.test_assertRaises_frames_survival -*unittest.test.test_async_case.TestAsyncCase.test_base_exception_from_async_method -*unittest.test.test_async_case.TestAsyncCase.test_cancellation_hanging_tasks -*unittest.test.test_async_case.TestAsyncCase.test_cleanups_interleave_order -*unittest.test.test_async_case.TestAsyncCase.test_debug_cleanup_same_loop -*unittest.test.test_async_case.TestAsyncCase.test_deprecation_of_return_val_from_test -*unittest.test.test_async_case.TestAsyncCase.test_enterAsyncContext -*unittest.test.test_async_case.TestAsyncCase.test_enterAsyncContext_arg_errors -*unittest.test.test_async_case.TestAsyncCase.test_exception_in_setup -*unittest.test.test_async_case.TestAsyncCase.test_exception_in_tear_clean_up -*unittest.test.test_async_case.TestAsyncCase.test_exception_in_tear_down -*unittest.test.test_async_case.TestAsyncCase.test_exception_in_test -*unittest.test.test_async_case.TestAsyncCase.test_full_cycle -*unittest.test.test_async_case.TestAsyncCase.test_setup_get_event_loop -*unittest.test.test_break.TestBreak.testHandlerReplacedButCalled -*unittest.test.test_break.TestBreak.testInstallHandler -*unittest.test.test_break.TestBreak.testInterruptCaught -*unittest.test.test_break.TestBreak.testMainInstallsHandler -*unittest.test.test_break.TestBreak.testRegisterResult -*unittest.test.test_break.TestBreak.testRemoveHandler -*unittest.test.test_break.TestBreak.testRemoveHandlerAsDecorator -*unittest.test.test_break.TestBreak.testRemoveResult -*unittest.test.test_break.TestBreak.testRunner -*unittest.test.test_break.TestBreak.testSecondInterrupt -*unittest.test.test_break.TestBreak.testTwoResults -*unittest.test.test_break.TestBreak.testWeakReferences -*unittest.test.test_break.TestBreakDefaultIntHandler.testHandlerReplacedButCalled -*unittest.test.test_break.TestBreakDefaultIntHandler.testInstallHandler -*unittest.test.test_break.TestBreakDefaultIntHandler.testInterruptCaught -*unittest.test.test_break.TestBreakDefaultIntHandler.testMainInstallsHandler -*unittest.test.test_break.TestBreakDefaultIntHandler.testRegisterResult -*unittest.test.test_break.TestBreakDefaultIntHandler.testRemoveHandler -*unittest.test.test_break.TestBreakDefaultIntHandler.testRemoveHandlerAsDecorator -*unittest.test.test_break.TestBreakDefaultIntHandler.testRemoveResult -*unittest.test.test_break.TestBreakDefaultIntHandler.testRunner -*unittest.test.test_break.TestBreakDefaultIntHandler.testSecondInterrupt -*unittest.test.test_break.TestBreakDefaultIntHandler.testTwoResults -*unittest.test.test_break.TestBreakDefaultIntHandler.testWeakReferences -*unittest.test.test_break.TestBreakSignalDefault.testHandlerReplacedButCalled -*unittest.test.test_break.TestBreakSignalDefault.testInstallHandler -*unittest.test.test_break.TestBreakSignalDefault.testInterruptCaught -*unittest.test.test_break.TestBreakSignalDefault.testMainInstallsHandler -*unittest.test.test_break.TestBreakSignalDefault.testRegisterResult -*unittest.test.test_break.TestBreakSignalDefault.testRemoveHandler -*unittest.test.test_break.TestBreakSignalDefault.testRemoveHandlerAsDecorator -*unittest.test.test_break.TestBreakSignalDefault.testRemoveResult -*unittest.test.test_break.TestBreakSignalDefault.testRunner -*unittest.test.test_break.TestBreakSignalDefault.testSecondInterrupt -*unittest.test.test_break.TestBreakSignalDefault.testTwoResults -*unittest.test.test_break.TestBreakSignalDefault.testWeakReferences -*unittest.test.test_break.TestBreakSignalIgnored.testHandlerReplacedButCalled -*unittest.test.test_break.TestBreakSignalIgnored.testInstallHandler -*unittest.test.test_break.TestBreakSignalIgnored.testInterruptCaught -*unittest.test.test_break.TestBreakSignalIgnored.testMainInstallsHandler -*unittest.test.test_break.TestBreakSignalIgnored.testRegisterResult -*unittest.test.test_break.TestBreakSignalIgnored.testRemoveHandler -*unittest.test.test_break.TestBreakSignalIgnored.testRemoveHandlerAsDecorator -*unittest.test.test_break.TestBreakSignalIgnored.testRemoveResult -*unittest.test.test_break.TestBreakSignalIgnored.testRunner -*unittest.test.test_break.TestBreakSignalIgnored.testSecondInterrupt -*unittest.test.test_break.TestBreakSignalIgnored.testTwoResults -*unittest.test.test_break.TestBreakSignalIgnored.testWeakReferences -*unittest.test.test_case.Test_TestCase.testAddTypeEqualityFunc -*unittest.test.test_case.Test_TestCase.testAssertCountEqual -*unittest.test.test_case.Test_TestCase.testAssertDictContainsSubset -*unittest.test.test_case.Test_TestCase.testAssertDictEqualTruncates -*unittest.test.test_case.Test_TestCase.testAssertEqual -*unittest.test.test_case.Test_TestCase.testAssertEqualSingleLine -*unittest.test.test_case.Test_TestCase.testAssertEqual_diffThreshold -*unittest.test.test_case.Test_TestCase.testAssertEqual_shorten -*unittest.test.test_case.Test_TestCase.testAssertIn -*unittest.test.test_case.Test_TestCase.testAssertIs -*unittest.test.test_case.Test_TestCase.testAssertIsInstance -*unittest.test.test_case.Test_TestCase.testAssertIsNone -*unittest.test.test_case.Test_TestCase.testAssertIsNot -*unittest.test.test_case.Test_TestCase.testAssertLogsDefaults -*unittest.test.test_case.Test_TestCase.testAssertLogsFailureLevelTooHigh -*unittest.test.test_case.Test_TestCase.testAssertLogsFailureLevelTooHigh_FilterInRootLogger -*unittest.test.test_case.Test_TestCase.testAssertLogsFailureMismatchingLogger -*unittest.test.test_case.Test_TestCase.testAssertLogsFailureNoLogs -*unittest.test.test_case.Test_TestCase.testAssertLogsPerLevel -*unittest.test.test_case.Test_TestCase.testAssertLogsPerLogger -*unittest.test.test_case.Test_TestCase.testAssertLogsTwoMatchingMessages -*unittest.test.test_case.Test_TestCase.testAssertLogsUnexpectedException -*unittest.test.test_case.Test_TestCase.testAssertMultiLineEqual -*unittest.test.test_case.Test_TestCase.testAssertMultiLineEqualTruncates -*unittest.test.test_case.Test_TestCase.testAssertNoLogsDefault -*unittest.test.test_case.Test_TestCase.testAssertNoLogsFailureFoundLogs -*unittest.test.test_case.Test_TestCase.testAssertNoLogsFailurePerLevel -*unittest.test.test_case.Test_TestCase.testAssertNoLogsFailurePerLogger -*unittest.test.test_case.Test_TestCase.testAssertNoLogsPerLevel -*unittest.test.test_case.Test_TestCase.testAssertNoLogsPerLogger -*unittest.test.test_case.Test_TestCase.testAssertNoLogsUnexpectedException -*unittest.test.test_case.Test_TestCase.testAssertNoLogsYieldsNone -*unittest.test.test_case.Test_TestCase.testAssertNotIsInstance -*unittest.test.test_case.Test_TestCase.testAssertNotRaisesRegex -*unittest.test.test_case.Test_TestCase.testAssertRaisesCallable -*unittest.test.test_case.Test_TestCase.testAssertRaisesContext -*unittest.test.test_case.Test_TestCase.testAssertRaisesExcValue -*unittest.test.test_case.Test_TestCase.testAssertRaisesNoExceptionType -*unittest.test.test_case.Test_TestCase.testAssertRaisesRefcount -*unittest.test.test_case.Test_TestCase.testAssertRaisesRegex -*unittest.test.test_case.Test_TestCase.testAssertRaisesRegexInvalidRegex -*unittest.test.test_case.Test_TestCase.testAssertRaisesRegexMismatch -*unittest.test.test_case.Test_TestCase.testAssertRaisesRegexNoExceptionType -*unittest.test.test_case.Test_TestCase.testAssertRegex -*unittest.test.test_case.Test_TestCase.testAssertSequenceEqualMaxDiff -*unittest.test.test_case.Test_TestCase.testAssertSetEqual -*unittest.test.test_case.Test_TestCase.testAssertWarnsCallable -*unittest.test.test_case.Test_TestCase.testAssertWarnsContext -*unittest.test.test_case.Test_TestCase.testAssertWarnsModifySysModules -*unittest.test.test_case.Test_TestCase.testAssertWarnsNoExceptionType -*unittest.test.test_case.Test_TestCase.testAssertWarnsRegexCallable -*unittest.test.test_case.Test_TestCase.testAssertWarnsRegexContext -*unittest.test.test_case.Test_TestCase.testAssertWarnsRegexInvalidRegex -*unittest.test.test_case.Test_TestCase.testAssertWarnsRegexNoExceptionType -*unittest.test.test_case.Test_TestCase.testDeepcopy -*unittest.test.test_case.Test_TestCase.testDeprecatedMethodNames -*unittest.test.test_case.Test_TestCase.testEquality -*unittest.test.test_case.Test_TestCase.testEqualityBytesWarning -*unittest.test.test_case.Test_TestCase.testInequality -*unittest.test.test_case.Test_TestCase.testKeyboardInterrupt -*unittest.test.test_case.Test_TestCase.testNoCycles -*unittest.test.test_case.Test_TestCase.testPickle -*unittest.test.test_case.Test_TestCase.testShortDescriptionWhitespaceTrimming -*unittest.test.test_case.Test_TestCase.testShortDescriptionWithMultiLineDocstring -*unittest.test.test_case.Test_TestCase.testShortDescriptionWithOneLineDocstring -*unittest.test.test_case.Test_TestCase.testShortDescriptionWithoutDocstring -*unittest.test.test_case.Test_TestCase.testSkippingEverywhere -*unittest.test.test_case.Test_TestCase.testSystemExit -*unittest.test.test_case.Test_TestCase.testTruncateMessage -*unittest.test.test_case.Test_TestCase.test_call__invoking_an_instance_delegates_to_run -*unittest.test.test_case.Test_TestCase.test_countTestCases -*unittest.test.test_case.Test_TestCase.test_defaultTestResult -*unittest.test.test_case.Test_TestCase.test_deprecation_of_return_val_from_test -*unittest.test.test_case.Test_TestCase.test_eq -*unittest.test.test_case.Test_TestCase.test_failureException__default -*unittest.test.test_case.Test_TestCase.test_failureException__subclassing__explicit_raise -*unittest.test.test_case.Test_TestCase.test_failureException__subclassing__implicit_raise -*unittest.test.test_case.Test_TestCase.test_hash -*unittest.test.test_case.Test_TestCase.test_id -*unittest.test.test_case.Test_TestCase.test_init__no_test_name -*unittest.test.test_case.Test_TestCase.test_init__test_name__invalid -*unittest.test.test_case.Test_TestCase.test_init__test_name__valid -*unittest.test.test_case.Test_TestCase.test_ne -*unittest.test.test_case.Test_TestCase.test_run__returns_given_result -*unittest.test.test_case.Test_TestCase.test_run__uses_defaultTestResult -*unittest.test.test_case.Test_TestCase.test_run_call_order__error_in_setUp -*unittest.test.test_case.Test_TestCase.test_run_call_order__error_in_setUp_default_result -*unittest.test.test_case.Test_TestCase.test_run_call_order__error_in_tearDown -*unittest.test.test_case.Test_TestCase.test_run_call_order__error_in_tearDown_default_result -*unittest.test.test_case.Test_TestCase.test_run_call_order__error_in_test -*unittest.test.test_case.Test_TestCase.test_run_call_order__error_in_test_default_result -*unittest.test.test_case.Test_TestCase.test_run_call_order__failure_in_test -*unittest.test.test_case.Test_TestCase.test_run_call_order__failure_in_test_default_result -*unittest.test.test_case.Test_TestCase.test_run_call_order__subtests -*unittest.test.test_case.Test_TestCase.test_run_call_order__subtests_failfast -*unittest.test.test_case.Test_TestCase.test_run_call_order__subtests_legacy -*unittest.test.test_case.Test_TestCase.test_run_call_order__subtests_success -*unittest.test.test_case.Test_TestCase.test_run_call_order__subtests_success_legacy -*unittest.test.test_case.Test_TestCase.test_run_call_order_default_result -*unittest.test.test_case.Test_TestCase.test_setUp -*unittest.test.test_case.Test_TestCase.test_subtests_debug -*unittest.test.test_case.Test_TestCase.test_subtests_failfast -*unittest.test.test_case.Test_TestCase.test_tearDown -*unittest.test.test_discovery.TestDiscovery.test_command_line_handling_discover_by_default -*unittest.test.test_discovery.TestDiscovery.test_command_line_handling_discover_by_default_with_options -*unittest.test.test_discovery.TestDiscovery.test_command_line_handling_do_discovery_calls_loader -*unittest.test.test_discovery.TestDiscovery.test_command_line_handling_do_discovery_too_many_arguments -*unittest.test.test_discovery.TestDiscovery.test_command_line_handling_do_discovery_uses_default_loader -*unittest.test.test_discovery.TestDiscovery.test_command_line_handling_parseArgs -*unittest.test.test_discovery.TestDiscovery.test_detect_module_clash -*unittest.test.test_discovery.TestDiscovery.test_discover -*unittest.test.test_discovery.TestDiscovery.test_discover_start_dir_is_package_calls_package_load_tests -*unittest.test.test_discovery.TestDiscovery.test_discover_with_init_module_that_raises_SkipTest_on_import -*unittest.test.test_discovery.TestDiscovery.test_discover_with_init_modules_that_fail_to_import -*unittest.test.test_discovery.TestDiscovery.test_discover_with_module_that_raises_SkipTest_on_import -*unittest.test.test_discovery.TestDiscovery.test_discover_with_modules_that_fail_to_import -*unittest.test.test_discovery.TestDiscovery.test_discovery_failed_discovery -*unittest.test.test_discovery.TestDiscovery.test_discovery_from_dotted_namespace_packages -*unittest.test.test_discovery.TestDiscovery.test_discovery_from_dotted_path -*unittest.test.test_discovery.TestDiscovery.test_discovery_from_dotted_path_builtin_modules -*unittest.test.test_discovery.TestDiscovery.test_find_tests -*unittest.test.test_discovery.TestDiscovery.test_find_tests_customize_via_package_pattern -*unittest.test.test_discovery.TestDiscovery.test_find_tests_default_calls_package_load_tests -*unittest.test.test_discovery.TestDiscovery.test_find_tests_socket -*unittest.test.test_discovery.TestDiscovery.test_find_tests_with_package -*unittest.test.test_discovery.TestDiscovery.test_get_name_from_path -*unittest.test.test_discovery.TestDiscovery.test_module_symlink_ok -*unittest.test.test_functiontestcase.Test_FunctionTestCase.test_countTestCases -*unittest.test.test_functiontestcase.Test_FunctionTestCase.test_id -*unittest.test.test_functiontestcase.Test_FunctionTestCase.test_run_call_order__error_in_setUp -*unittest.test.test_functiontestcase.Test_FunctionTestCase.test_run_call_order__error_in_tearDown -*unittest.test.test_functiontestcase.Test_FunctionTestCase.test_run_call_order__error_in_test -*unittest.test.test_functiontestcase.Test_FunctionTestCase.test_run_call_order__failure_in_test -*unittest.test.test_functiontestcase.Test_FunctionTestCase.test_shortDescription__no_docstring -*unittest.test.test_functiontestcase.Test_FunctionTestCase.test_shortDescription__singleline_docstring -*unittest.test.test_loader.TestObsoleteFunctions.test_findTestCases -*unittest.test.test_loader.TestObsoleteFunctions.test_getTestCaseNames -*unittest.test.test_loader.TestObsoleteFunctions.test_makeSuite -*unittest.test.test_loader.Test_TestLoader.test___init__ -*unittest.test.test_loader.Test_TestLoader.test_getTestCaseNames -*unittest.test.test_loader.Test_TestLoader.test_getTestCaseNames__inheritance -*unittest.test.test_loader.Test_TestLoader.test_getTestCaseNames__no_tests -*unittest.test.test_loader.Test_TestLoader.test_getTestCaseNames__not_a_TestCase -*unittest.test.test_loader.Test_TestLoader.test_getTestCaseNames__testNamePatterns -*unittest.test.test_loader.Test_TestLoader.test_getTestCaseNames__testNamePatterns__attribute_access_regression -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__TestCase_subclass -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__TestCase_subclass_internals -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__faulty_load_tests -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__load_tests -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__no_TestCase_instances -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__no_TestCase_tests -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__not_a_module -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__pattern -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__too_many_positional_args -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__use_load_tests_deprecated_keyword -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__use_load_tests_deprecated_positional -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__use_load_tests_other_bad_keyword -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__callable__TestCase_instance -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__callable__TestCase_instance_ProperSuiteClass -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__callable__TestSuite -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__callable__wrong_type -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__empty_name -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__function_with_different_name_than_method -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__malformed_name -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__module_not_loaded -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_TestCase_subclass -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_TestSuite -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_bad_object -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_empty_name -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_malformed_name -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_not_a_module -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_testmethod -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_testmethod_ProperSuiteClass -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_unknown_name -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__unknown_attr_name_on_module -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__unknown_attr_name_on_package -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__unknown_module_name -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__callable__TestCase_instance -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__callable__TestSuite -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__callable__call_staticmethod -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__callable__wrong_type -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__empty_name -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__empty_name_list -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__malformed_name -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__module_not_loaded -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_TestCase_subclass -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_TestSuite -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_bad_object -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_empty_name -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_empty_name_list -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_malformed_name -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_not_a_module -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_testmethod -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__unknown_attr_name -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__unknown_module_name -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__unknown_name_relative_1 -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__unknown_name_relative_2 -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromTestCase -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromTestCase__TestSuite_subclass -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromTestCase__default_method_name -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromTestCase__from_FunctionTestCase -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromTestCase__from_TestCase -*unittest.test.test_loader.Test_TestLoader.test_loadTestsFromTestCase__no_matches -*unittest.test.test_loader.Test_TestLoader.test_partial_functions -*unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__None -*unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__default_value -*unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__getTestCaseNames -*unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__loadTestsFromModule -*unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__loadTestsFromName -*unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__loadTestsFromNames -*unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__loadTestsFromTestCase -*unittest.test.test_loader.Test_TestLoader.test_suiteClass__default_value -*unittest.test.test_loader.Test_TestLoader.test_suiteClass__loadTestsFromModule -*unittest.test.test_loader.Test_TestLoader.test_suiteClass__loadTestsFromName -*unittest.test.test_loader.Test_TestLoader.test_suiteClass__loadTestsFromNames -*unittest.test.test_loader.Test_TestLoader.test_suiteClass__loadTestsFromTestCase -*unittest.test.test_loader.Test_TestLoader.test_testMethodPrefix__default_value -*unittest.test.test_loader.Test_TestLoader.test_testMethodPrefix__loadTestsFromModule -*unittest.test.test_loader.Test_TestLoader.test_testMethodPrefix__loadTestsFromName -*unittest.test.test_loader.Test_TestLoader.test_testMethodPrefix__loadTestsFromNames -*unittest.test.test_loader.Test_TestLoader.test_testMethodPrefix__loadTestsFromTestCase -*unittest.test.test_program.TestCommandLineArgs.testBufferCatchFailfast -*unittest.test.test_program.TestCommandLineArgs.testCatchBreakInstallsHandler -*unittest.test.test_program.TestCommandLineArgs.testParseArgsAbsolutePathsThatCanBeConverted -*unittest.test.test_program.TestCommandLineArgs.testParseArgsAbsolutePathsThatCannotBeConverted -*unittest.test.test_program.TestCommandLineArgs.testParseArgsFileNames -*unittest.test.test_program.TestCommandLineArgs.testParseArgsFilePaths -*unittest.test.test_program.TestCommandLineArgs.testParseArgsNonExistentFiles -*unittest.test.test_program.TestCommandLineArgs.testParseArgsSelectedTestNames -*unittest.test.test_program.TestCommandLineArgs.testRunTestsOldRunnerClass -*unittest.test.test_program.TestCommandLineArgs.testRunTestsRunnerClass -*unittest.test.test_program.TestCommandLineArgs.testRunTestsRunnerInstance -*unittest.test.test_program.TestCommandLineArgs.testSelectedTestNamesFunctionalTest -*unittest.test.test_program.TestCommandLineArgs.testVerbosity -*unittest.test.test_program.TestCommandLineArgs.testWarning -*unittest.test.test_program.TestCommandLineArgs.test_locals -*unittest.test.test_program.Test_TestProgram.testNoExit -*unittest.test.test_program.Test_TestProgram.test_Exit -*unittest.test.test_program.Test_TestProgram.test_ExitAsDefault -*unittest.test.test_program.Test_TestProgram.test_NonExit -*unittest.test.test_program.Test_TestProgram.test_defaultTest_with_iterable -*unittest.test.test_program.Test_TestProgram.test_defaultTest_with_string -*unittest.test.test_program.Test_TestProgram.test_discovery_from_dotted_path -*unittest.test.test_result.TestOutputBuffering.testBufferDoClassCleanups -*unittest.test.test_result.TestOutputBuffering.testBufferDoCleanups -*unittest.test.test_result.TestOutputBuffering.testBufferDoModuleCleanups -*unittest.test.test_result.TestOutputBuffering.testBufferOutputAddErrorOrFailure -*unittest.test.test_result.TestOutputBuffering.testBufferOutputOff -*unittest.test.test_result.TestOutputBuffering.testBufferOutputStartTestAddSuccess -*unittest.test.test_result.TestOutputBuffering.testBufferSetUp -*unittest.test.test_result.TestOutputBuffering.testBufferSetUpModule -*unittest.test.test_result.TestOutputBuffering.testBufferSetUpModule_DoModuleCleanups -*unittest.test.test_result.TestOutputBuffering.testBufferSetUp_DoCleanups -*unittest.test.test_result.TestOutputBuffering.testBufferSetupClass -*unittest.test.test_result.TestOutputBuffering.testBufferSetupClass_DoClassCleanups -*unittest.test.test_result.TestOutputBuffering.testBufferTearDown -*unittest.test.test_result.TestOutputBuffering.testBufferTearDownClass -*unittest.test.test_result.TestOutputBuffering.testBufferTearDownClass_DoClassCleanups -*unittest.test.test_result.TestOutputBuffering.testBufferTearDownModule -*unittest.test.test_result.TestOutputBuffering.testBufferTearDownModule_DoModuleCleanups -*unittest.test.test_result.TestOutputBuffering.testBufferTearDown_DoCleanups -*unittest.test.test_result.Test_OldTestResult.testOldResultWithRunner -*unittest.test.test_result.Test_OldTestResult.testOldTestResult -*unittest.test.test_result.Test_OldTestResult.testOldTestResultClass -*unittest.test.test_result.Test_OldTestResult.testOldTestTesultSetup -*unittest.test.test_result.Test_TestResult.testFailFast -*unittest.test.test_result.Test_TestResult.testFailFastSetByRunner -*unittest.test.test_result.Test_TestResult.testGetDescriptionWithMultiLineDocstring -*unittest.test.test_result.Test_TestResult.testGetDescriptionWithOneLineDocstring -*unittest.test.test_result.Test_TestResult.testGetDescriptionWithoutDocstring -*unittest.test.test_result.Test_TestResult.testGetDuplicatedNestedSubTestDescriptionWithoutDocstring -*unittest.test.test_result.Test_TestResult.testGetNestedSubTestDescriptionWithoutDocstring -*unittest.test.test_result.Test_TestResult.testGetSubTestDescriptionForFalsyValues -*unittest.test.test_result.Test_TestResult.testGetSubTestDescriptionWithMultiLineDocstring -*unittest.test.test_result.Test_TestResult.testGetSubTestDescriptionWithOneLineDocstring -*unittest.test.test_result.Test_TestResult.testGetSubTestDescriptionWithoutDocstring -*unittest.test.test_result.Test_TestResult.testGetSubTestDescriptionWithoutDocstringAndParams -*unittest.test.test_result.Test_TestResult.testStackFrameTrimming -*unittest.test.test_result.Test_TestResult.test_addError -*unittest.test.test_result.Test_TestResult.test_addError_locals -*unittest.test.test_result.Test_TestResult.test_addFailure -*unittest.test.test_result.Test_TestResult.test_addFailure_filter_traceback_frames -*unittest.test.test_result.Test_TestResult.test_addFailure_filter_traceback_frames_chained_exception_cycle -*unittest.test.test_result.Test_TestResult.test_addFailure_filter_traceback_frames_chained_exception_self_loop -*unittest.test.test_result.Test_TestResult.test_addFailure_filter_traceback_frames_context -*unittest.test.test_result.Test_TestResult.test_addSubTest -*unittest.test.test_result.Test_TestResult.test_addSuccess -*unittest.test.test_result.Test_TestResult.test_init -*unittest.test.test_result.Test_TestResult.test_startTest -*unittest.test.test_result.Test_TestResult.test_startTestRun_stopTestRun -*unittest.test.test_result.Test_TestResult.test_stop -*unittest.test.test_result.Test_TestResult.test_stopTest -*unittest.test.test_result.Test_TextTestResult.testDotsOutput -*unittest.test.test_result.Test_TextTestResult.testDotsOutputSubTestMixed -*unittest.test.test_result.Test_TextTestResult.testDotsOutputSubTestSuccess -*unittest.test.test_result.Test_TextTestResult.testDotsOutputTearDownFail -*unittest.test.test_result.Test_TextTestResult.testGetDescriptionWithMultiLineDocstring -*unittest.test.test_result.Test_TextTestResult.testGetDescriptionWithOneLineDocstring -*unittest.test.test_result.Test_TextTestResult.testGetDescriptionWithoutDocstring -*unittest.test.test_result.Test_TextTestResult.testGetDuplicatedNestedSubTestDescriptionWithoutDocstring -*unittest.test.test_result.Test_TextTestResult.testGetNestedSubTestDescriptionWithoutDocstring -*unittest.test.test_result.Test_TextTestResult.testGetSubTestDescriptionForFalsyValues -*unittest.test.test_result.Test_TextTestResult.testGetSubTestDescriptionWithMultiLineDocstring -*unittest.test.test_result.Test_TextTestResult.testGetSubTestDescriptionWithOneLineDocstring -*unittest.test.test_result.Test_TextTestResult.testGetSubTestDescriptionWithoutDocstring -*unittest.test.test_result.Test_TextTestResult.testGetSubTestDescriptionWithoutDocstringAndParams -*unittest.test.test_result.Test_TextTestResult.testLongOutput -*unittest.test.test_result.Test_TextTestResult.testLongOutputSubTestMixed -*unittest.test.test_result.Test_TextTestResult.testLongOutputSubTestSuccess -*unittest.test.test_result.Test_TextTestResult.testLongOutputTearDownFail -*unittest.test.test_runner.TestClassCleanup.test_addClassCleanUp -*unittest.test.test_runner.TestClassCleanup.test_doClassCleanups_with_errors_addClassCleanUp -*unittest.test.test_runner.TestClassCleanup.test_enterClassContext -*unittest.test.test_runner.TestClassCleanup.test_enterClassContext_arg_errors -*unittest.test.test_runner.TestCleanUp.testCleanUp -*unittest.test.test_runner.TestCleanUp.testCleanUpWithErrors -*unittest.test.test_runner.TestCleanUp.testCleanupInRun -*unittest.test.test_runner.TestCleanUp.testTestCaseDebugExecutesCleanups -*unittest.test.test_runner.TestCleanUp.test_enterContext -*unittest.test.test_runner.TestCleanUp.test_enterContext_arg_errors -*unittest.test.test_runner.TestModuleCleanUp.test_addModuleCleanup_arg_errors -*unittest.test.test_runner.TestModuleCleanUp.test_add_and_do_ModuleCleanup -*unittest.test.test_runner.TestModuleCleanUp.test_doModuleCleanup_with_errors_in_addModuleCleanup -*unittest.test.test_runner.TestModuleCleanUp.test_enterModuleContext -*unittest.test.test_runner.TestModuleCleanUp.test_enterModuleContext_arg_errors -*unittest.test.test_runner.Test_TextTestRunner.testBufferAndFailfast -*unittest.test.test_runner.Test_TextTestRunner.testRunnerRegistersResult -*unittest.test.test_runner.Test_TextTestRunner.testSpecifiedStreamUsed -*unittest.test.test_runner.Test_TextTestRunner.testStdErrLookedUpAtInstantiationTime -*unittest.test.test_runner.Test_TextTestRunner.test_init -*unittest.test.test_runner.Test_TextTestRunner.test_locals -*unittest.test.test_runner.Test_TextTestRunner.test_multiple_inheritance -*unittest.test.test_runner.Test_TextTestRunner.test_pickle_unpickle -*unittest.test.test_runner.Test_TextTestRunner.test_resultclass -*unittest.test.test_runner.Test_TextTestRunner.test_startTestRun_stopTestRun_called -*unittest.test.test_runner.Test_TextTestRunner.test_warnings -*unittest.test.test_runner.Test_TextTestRunner.test_works_with_result_without_startTestRun_stopTestRun -*unittest.test.test_setups.TestSetups.test_class_not_setup_or_torndown_when_skipped -*unittest.test.test_setups.TestSetups.test_class_not_torndown_when_setup_fails -*unittest.test.test_setups.TestSetups.test_setup_teardown_order_with_pathological_suite -*unittest.test.test_skipping.Test_TestSkipping.test_debug_skipping -*unittest.test.test_skipping.Test_TestSkipping.test_debug_skipping_class -*unittest.test.test_skipping.Test_TestSkipping.test_debug_skipping_subtests -*unittest.test.test_skipping.Test_TestSkipping.test_decorated_skip -*unittest.test.test_skipping.Test_TestSkipping.test_expected_failure -*unittest.test.test_skipping.Test_TestSkipping.test_expected_failure_and_fail_in_cleanup -*unittest.test.test_skipping.Test_TestSkipping.test_expected_failure_and_skip_in_cleanup -*unittest.test.test_skipping.Test_TestSkipping.test_expected_failure_subtests -*unittest.test.test_skipping.Test_TestSkipping.test_expected_failure_with_wrapped_class -*unittest.test.test_skipping.Test_TestSkipping.test_expected_failure_with_wrapped_subclass -*unittest.test.test_skipping.Test_TestSkipping.test_failure_and_skip_in_cleanup -*unittest.test.test_skipping.Test_TestSkipping.test_skip_class -*unittest.test.test_skipping.Test_TestSkipping.test_skip_doesnt_run_setup -*unittest.test.test_skipping.Test_TestSkipping.test_skip_in_cleanup -*unittest.test.test_skipping.Test_TestSkipping.test_skip_in_setup -*unittest.test.test_skipping.Test_TestSkipping.test_skip_non_unittest_class -*unittest.test.test_skipping.Test_TestSkipping.test_skip_without_reason -*unittest.test.test_skipping.Test_TestSkipping.test_skipping -*unittest.test.test_skipping.Test_TestSkipping.test_skipping_and_fail_in_cleanup -*unittest.test.test_skipping.Test_TestSkipping.test_skipping_decorators -*unittest.test.test_skipping.Test_TestSkipping.test_skipping_subtests -*unittest.test.test_skipping.Test_TestSkipping.test_unexpected_success -*unittest.test.test_skipping.Test_TestSkipping.test_unexpected_success_and_fail_in_cleanup -*unittest.test.test_skipping.Test_TestSkipping.test_unexpected_success_and_skip_in_cleanup -*unittest.test.test_skipping.Test_TestSkipping.test_unexpected_success_subtests -*unittest.test.test_suite.Test_TestSuite.test_addTest__TestCase -*unittest.test.test_suite.Test_TestSuite.test_addTest__TestSuite -*unittest.test.test_suite.Test_TestSuite.test_addTest__casesuiteclass -*unittest.test.test_suite.Test_TestSuite.test_addTest__noncallable -*unittest.test.test_suite.Test_TestSuite.test_addTest__noniterable -*unittest.test.test_suite.Test_TestSuite.test_addTests -*unittest.test.test_suite.Test_TestSuite.test_addTests__string -*unittest.test.test_suite.Test_TestSuite.test_basetestsuite -*unittest.test.test_suite.Test_TestSuite.test_countTestCases_nested -*unittest.test.test_suite.Test_TestSuite.test_countTestCases_simple -*unittest.test.test_suite.Test_TestSuite.test_countTestCases_zero_nested -*unittest.test.test_suite.Test_TestSuite.test_countTestCases_zero_simple -*unittest.test.test_suite.Test_TestSuite.test_eq -*unittest.test.test_suite.Test_TestSuite.test_function_in_suite -*unittest.test.test_suite.Test_TestSuite.test_garbage_collect_test_after_run_BaseTestSuite -*unittest.test.test_suite.Test_TestSuite.test_init__TestSuite_instances_in_tests -*unittest.test.test_suite.Test_TestSuite.test_init__empty_tests -*unittest.test.test_suite.Test_TestSuite.test_init__tests_from_any_iterable -*unittest.test.test_suite.Test_TestSuite.test_init__tests_optional -*unittest.test.test_suite.Test_TestSuite.test_iter -*unittest.test.test_suite.Test_TestSuite.test_ne -*unittest.test.test_suite.Test_TestSuite.test_overriding_call -*unittest.test.test_suite.Test_TestSuite.test_remove_test_at_index -*unittest.test.test_suite.Test_TestSuite.test_remove_test_at_index_not_indexable -*unittest.test.test_suite.Test_TestSuite.test_run -*unittest.test.test_suite.Test_TestSuite.test_run__empty_suite -*unittest.test.test_suite.Test_TestSuite.test_run__requires_result -*unittest.test.testmock.testasync.AsyncArguments.test_add_return_value -*unittest.test.testmock.testasync.AsyncArguments.test_add_side_effect_coroutine -*unittest.test.testmock.testasync.AsyncArguments.test_add_side_effect_exception -*unittest.test.testmock.testasync.AsyncArguments.test_add_side_effect_exception_iterable -*unittest.test.testmock.testasync.AsyncArguments.test_add_side_effect_iterable -*unittest.test.testmock.testasync.AsyncArguments.test_add_side_effect_normal_function -*unittest.test.testmock.testasync.AsyncArguments.test_await_args_list_order -*unittest.test.testmock.testasync.AsyncArguments.test_return_value_AsyncMock -*unittest.test.testmock.testasync.AsyncArguments.test_return_value_awaitable -*unittest.test.testmock.testasync.AsyncArguments.test_side_effect_awaitable_values -*unittest.test.testmock.testasync.AsyncArguments.test_side_effect_is_AsyncMock -*unittest.test.testmock.testasync.AsyncArguments.test_wraps_coroutine -*unittest.test.testmock.testasync.AsyncArguments.test_wraps_normal_function -*unittest.test.testmock.testasync.AsyncAutospecTest.test_create_autospec -*unittest.test.testmock.testasync.AsyncAutospecTest.test_create_autospec_awaitable_class -*unittest.test.testmock.testasync.AsyncAutospecTest.test_create_autospec_instance -*unittest.test.testmock.testasync.AsyncAutospecTest.test_is_AsyncMock_patch -*unittest.test.testmock.testasync.AsyncAutospecTest.test_patch_with_autospec -*unittest.test.testmock.testasync.AsyncContextManagerTest.test_context_manager_raise_exception_by_default -*unittest.test.testmock.testasync.AsyncContextManagerTest.test_mock_customize_async_context_manager -*unittest.test.testmock.testasync.AsyncContextManagerTest.test_mock_customize_async_context_manager_with_coroutine -*unittest.test.testmock.testasync.AsyncContextManagerTest.test_mock_supports_async_context_manager -*unittest.test.testmock.testasync.AsyncContextManagerTest.test_set_return_value_of_aenter -*unittest.test.testmock.testasync.AsyncIteratorTest.test_aiter_set_return_value -*unittest.test.testmock.testasync.AsyncIteratorTest.test_mock_aiter_and_anext_asyncmock -*unittest.test.testmock.testasync.AsyncIteratorTest.test_mock_async_for -*unittest.test.testmock.testasync.AsyncMagicMethods.test_async_magic_methods_return_async_mocks -*unittest.test.testmock.testasync.AsyncMagicMethods.test_asyncmock_has_sync_magic_methods -*unittest.test.testmock.testasync.AsyncMagicMethods.test_magic_methods_are_async_functions -*unittest.test.testmock.testasync.AsyncMagicMethods.test_magicmock_has_async_magic_methods -*unittest.test.testmock.testasync.AsyncMagicMethods.test_sync_magic_methods_return_magic_mocks -*unittest.test.testmock.testasync.AsyncMockAssert.test_assert_any_wait -*unittest.test.testmock.testasync.AsyncMockAssert.test_assert_awaited -*unittest.test.testmock.testasync.AsyncMockAssert.test_assert_awaited_but_not_called -*unittest.test.testmock.testasync.AsyncMockAssert.test_assert_awaited_once -*unittest.test.testmock.testasync.AsyncMockAssert.test_assert_awaited_once_with -*unittest.test.testmock.testasync.AsyncMockAssert.test_assert_awaited_with -*unittest.test.testmock.testasync.AsyncMockAssert.test_assert_called_and_awaited_at_same_time -*unittest.test.testmock.testasync.AsyncMockAssert.test_assert_called_once_and_awaited_twice -*unittest.test.testmock.testasync.AsyncMockAssert.test_assert_called_then_awaited -*unittest.test.testmock.testasync.AsyncMockAssert.test_assert_has_awaits_no_order -*unittest.test.testmock.testasync.AsyncMockAssert.test_assert_has_awaits_not_matching_spec_error -*unittest.test.testmock.testasync.AsyncMockAssert.test_assert_has_awaits_ordered -*unittest.test.testmock.testasync.AsyncMockAssert.test_assert_not_awaited -*unittest.test.testmock.testasync.AsyncMockAssert.test_awaits_asserts_with_any -*unittest.test.testmock.testasync.AsyncMockAssert.test_awaits_asserts_with_spec_and_any -*unittest.test.testmock.testasync.AsyncMockTest.test_future_isfuture -*unittest.test.testmock.testasync.AsyncMockTest.test_isawaitable -*unittest.test.testmock.testasync.AsyncMockTest.test_iscoroutinefunction_default -*unittest.test.testmock.testasync.AsyncPatchCMTest.test_async_def_cm -*unittest.test.testmock.testasync.AsyncPatchCMTest.test_is_AsyncMock_cm -*unittest.test.testmock.testasync.AsyncPatchCMTest.test_is_async_cm -*unittest.test.testmock.testasync.AsyncPatchCMTest.test_is_async_function_cm -*unittest.test.testmock.testasync.AsyncPatchCMTest.test_patch_dict_async_def -*unittest.test.testmock.testasync.AsyncPatchCMTest.test_patch_dict_async_def_context -*unittest.test.testmock.testasync.AsyncPatchDecoratorTest.test_async_def_patch -*unittest.test.testmock.testasync.AsyncPatchDecoratorTest.test_is_AsyncMock_patch -*unittest.test.testmock.testasync.AsyncPatchDecoratorTest.test_is_AsyncMock_patch_classmethod -*unittest.test.testmock.testasync.AsyncPatchDecoratorTest.test_is_AsyncMock_patch_staticmethod -*unittest.test.testmock.testasync.AsyncPatchDecoratorTest.test_is_async_patch -*unittest.test.testmock.testasync.AsyncPatchDecoratorTest.test_is_coroutine_function_patch -*unittest.test.testmock.testasync.AsyncSpecSetTest.test_is_AsyncMock_patch -*unittest.test.testmock.testasync.AsyncSpecSetTest.test_is_async_AsyncMock -*unittest.test.testmock.testasync.AsyncSpecSetTest.test_is_child_AsyncMock -*unittest.test.testmock.testasync.AsyncSpecSetTest.test_magicmock_lambda_spec -*unittest.test.testmock.testasync.AsyncSpecTest.test_spec_as_normal_kw_AsyncMock -*unittest.test.testmock.testasync.AsyncSpecTest.test_spec_as_normal_positional_AsyncMock -*unittest.test.testmock.testasync.AsyncSpecTest.test_spec_async_attributes -*unittest.test.testmock.testasync.AsyncSpecTest.test_spec_async_mock -*unittest.test.testmock.testasync.AsyncSpecTest.test_spec_normal_methods_on_class -*unittest.test.testmock.testasync.AsyncSpecTest.test_spec_normal_methods_on_class_with_mock -*unittest.test.testmock.testasync.AsyncSpecTest.test_spec_normal_methods_on_class_with_mock_seal -*unittest.test.testmock.testasync.AsyncSpecTest.test_spec_parent_not_async_attribute_is -*unittest.test.testmock.testasync.AsyncSpecTest.test_target_async_spec_not -*unittest.test.testmock.testasync.AsyncSpecTest.test_target_not_async_spec_is -*unittest.test.testmock.testcallable.TestCallable.test_attributes -*unittest.test.testmock.testcallable.TestCallable.test_create_autospec -*unittest.test.testmock.testcallable.TestCallable.test_create_autospec_instance -*unittest.test.testmock.testcallable.TestCallable.test_hierarchy -*unittest.test.testmock.testcallable.TestCallable.test_non_callable -*unittest.test.testmock.testcallable.TestCallable.test_patch_spec -*unittest.test.testmock.testcallable.TestCallable.test_patch_spec_callable_class -*unittest.test.testmock.testcallable.TestCallable.test_patch_spec_instance -*unittest.test.testmock.testcallable.TestCallable.test_patch_spec_set -*unittest.test.testmock.testcallable.TestCallable.test_patch_spec_set_instance -*unittest.test.testmock.testcallable.TestCallable.test_subclasses -*unittest.test.testmock.testhelpers.AnyTest.test_any -*unittest.test.testmock.testhelpers.AnyTest.test_any_and_datetime -*unittest.test.testmock.testhelpers.AnyTest.test_any_and_spec_set -*unittest.test.testmock.testhelpers.AnyTest.test_any_no_spec -*unittest.test.testmock.testhelpers.AnyTest.test_repr -*unittest.test.testmock.testhelpers.CallTest.test_attribute_call -*unittest.test.testmock.testhelpers.CallTest.test_call -*unittest.test.testmock.testhelpers.CallTest.test_call_any -*unittest.test.testmock.testhelpers.CallTest.test_call_list -*unittest.test.testmock.testhelpers.CallTest.test_call_ne -*unittest.test.testmock.testhelpers.CallTest.test_call_non_tuples -*unittest.test.testmock.testhelpers.CallTest.test_call_with_args -*unittest.test.testmock.testhelpers.CallTest.test_call_with_args_call_empty_name -*unittest.test.testmock.testhelpers.CallTest.test_call_with_call -*unittest.test.testmock.testhelpers.CallTest.test_call_with_kwargs -*unittest.test.testmock.testhelpers.CallTest.test_call_with_name -*unittest.test.testmock.testhelpers.CallTest.test_dunder_call -*unittest.test.testmock.testhelpers.CallTest.test_empty__Call -*unittest.test.testmock.testhelpers.CallTest.test_extended_call -*unittest.test.testmock.testhelpers.CallTest.test_extended_not_equal -*unittest.test.testmock.testhelpers.CallTest.test_named_call_with_args -*unittest.test.testmock.testhelpers.CallTest.test_named_call_with_kwargs -*unittest.test.testmock.testhelpers.CallTest.test_named_empty_call -*unittest.test.testmock.testhelpers.CallTest.test_nested_calls_not_equal -*unittest.test.testmock.testhelpers.CallTest.test_repr -*unittest.test.testmock.testhelpers.CallTest.test_two_args_call -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_attributes -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_autospec_data_descriptor -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_autospec_functions_with_self_in_odd_place -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_autospec_getattr_partial_function -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_autospec_reset_mock -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_autospec_signature_classmethod -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_autospec_signature_staticmethod -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_basic -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_builtins -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_class_with_no_init -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_create_autospec_keyword_arguments -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_create_autospec_keyword_only_arguments -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_create_autospec_none -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_create_autospec_return_value -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_descriptors -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_function_as_instance_attribute -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_inherit -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_magic_methods -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_method_calls -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_mocking_unbound_methods -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_recursive -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_signature_callable -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_signature_class -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_signature_noncallable -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_skip_attributeerrors -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_as_list -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_function_assert_any_call -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_function_assert_has_calls -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_function_no_name -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_function_reset_mock -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_has_descriptor_returning_function -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_inheritance_for_classes -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_inspect_signature -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_inspect_signature_annotations -*unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_set -*unittest.test.testmock.testhelpers.TestCallList.test_args_list_contains_call_list -*unittest.test.testmock.testhelpers.TestCallList.test_call_list_str -*unittest.test.testmock.testhelpers.TestCallList.test_propertymock -*unittest.test.testmock.testhelpers.TestCallList.test_propertymock_bare -*unittest.test.testmock.testhelpers.TestCallList.test_propertymock_returnvalue -*unittest.test.testmock.testhelpers.TestCallList.test_propertymock_side_effect -*unittest.test.testmock.testhelpers.TestCallablePredicate.test_call_magic_method -*unittest.test.testmock.testhelpers.TestCallablePredicate.test_classmethod -*unittest.test.testmock.testhelpers.TestCallablePredicate.test_non_callable_classmethod -*unittest.test.testmock.testhelpers.TestCallablePredicate.test_non_callable_staticmethod -*unittest.test.testmock.testhelpers.TestCallablePredicate.test_staticmethod -*unittest.test.testmock.testhelpers.TestCallablePredicate.test_type -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_asyncmock_defaults -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_attributes_and_return_value -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_bound_methods -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_changing_magic_set_in_initialization -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_comparison -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_deleting_magic_methods -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_descriptor_from_class -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_dict_methods -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_dir -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_division -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_divmod_and_rdivmod -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_equality -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_hash -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_iterable_as_iter_return_value -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_len_contains_iter -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_in_initialization -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_method_reset_mock -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_method_type -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_method_wrapping -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_methods_and_spec -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_methods_and_spec_set -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_methods_are_magic_mocks -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_methods_fspath -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_methods_isolated_between_mocks -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_mock_equality -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magicmock -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magicmock_defaults -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magicmock_del -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_matmul -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_nonzero -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_numeric -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_repr -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_setting_unsupported_magic_method -*unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_str -*unittest.test.testmock.testmock.MockTest.test__name__ -*unittest.test.testmock.testmock.MockTest.test_adding_child_mock -*unittest.test.testmock.testmock.MockTest.test_adding_return_value_mock -*unittest.test.testmock.testmock.MockTest.test_all -*unittest.test.testmock.testmock.MockTest.test_arg_lists -*unittest.test.testmock.testmock.MockTest.test_assert_any_call -*unittest.test.testmock.testmock.MockTest.test_assert_any_call_with_function_spec -*unittest.test.testmock.testmock.MockTest.test_assert_called -*unittest.test.testmock.testmock.MockTest.test_assert_called_exception_message -*unittest.test.testmock.testmock.MockTest.test_assert_called_once -*unittest.test.testmock.testmock.MockTest.test_assert_called_once_message -*unittest.test.testmock.testmock.MockTest.test_assert_called_once_message_not_called -*unittest.test.testmock.testmock.MockTest.test_assert_called_once_with -*unittest.test.testmock.testmock.MockTest.test_assert_called_once_with_call_list -*unittest.test.testmock.testmock.MockTest.test_assert_called_once_with_function_spec -*unittest.test.testmock.testmock.MockTest.test_assert_called_once_with_message -*unittest.test.testmock.testmock.MockTest.test_assert_called_with -*unittest.test.testmock.testmock.MockTest.test_assert_called_with_any -*unittest.test.testmock.testmock.MockTest.test_assert_called_with_failure_message -*unittest.test.testmock.testmock.MockTest.test_assert_called_with_function_spec -*unittest.test.testmock.testmock.MockTest.test_assert_called_with_message -*unittest.test.testmock.testmock.MockTest.test_assert_called_with_method_spec -*unittest.test.testmock.testmock.MockTest.test_assert_has_calls -*unittest.test.testmock.testmock.MockTest.test_assert_has_calls_any_order -*unittest.test.testmock.testmock.MockTest.test_assert_has_calls_nested_spec -*unittest.test.testmock.testmock.MockTest.test_assert_has_calls_nested_without_spec -*unittest.test.testmock.testmock.MockTest.test_assert_has_calls_not_matching_spec_error -*unittest.test.testmock.testmock.MockTest.test_assert_has_calls_with_function_spec -*unittest.test.testmock.testmock.MockTest.test_assert_not_called -*unittest.test.testmock.testmock.MockTest.test_assert_not_called_message -*unittest.test.testmock.testmock.MockTest.test_attach_mock -*unittest.test.testmock.testmock.MockTest.test_attach_mock_patch_autospec -*unittest.test.testmock.testmock.MockTest.test_attach_mock_patch_autospec_signature -*unittest.test.testmock.testmock.MockTest.test_attach_mock_return_value -*unittest.test.testmock.testmock.MockTest.test_attribute_access_returns_mocks -*unittest.test.testmock.testmock.MockTest.test_attribute_deletion -*unittest.test.testmock.testmock.MockTest.test_attributes_have_name_and_parent_set -*unittest.test.testmock.testmock.MockTest.test_autospec_mock -*unittest.test.testmock.testmock.MockTest.test_autospec_side_effect -*unittest.test.testmock.testmock.MockTest.test_autospec_side_effect_exception -*unittest.test.testmock.testmock.MockTest.test_baseexceptional_side_effect -*unittest.test.testmock.testmock.MockTest.test_bool_not_called_when_passing_spec_arg -*unittest.test.testmock.testmock.MockTest.test_call -*unittest.test.testmock.testmock.MockTest.test_call_args_comparison -*unittest.test.testmock.testmock.MockTest.test_call_args_two_tuple -*unittest.test.testmock.testmock.MockTest.test_calls_equal_with_any -*unittest.test.testmock.testmock.MockTest.test_change_return_value_via_delegate -*unittest.test.testmock.testmock.MockTest.test_change_side_effect_via_delegate -*unittest.test.testmock.testmock.MockTest.test_child_mock_call_equal -*unittest.test.testmock.testmock.MockTest.test_class_assignable -*unittest.test.testmock.testmock.MockTest.test_configure_mock -*unittest.test.testmock.testmock.MockTest.test_constructor -*unittest.test.testmock.testmock.MockTest.test_copy -*unittest.test.testmock.testmock.MockTest.test_create_autospec_classmethod_and_staticmethod -*unittest.test.testmock.testmock.MockTest.test_create_autospec_with_name -*unittest.test.testmock.testmock.MockTest.test_customize_wrapped_object_with_return_value -*unittest.test.testmock.testmock.MockTest.test_customize_wrapped_object_with_return_value_and_side_effect -*unittest.test.testmock.testmock.MockTest.test_customize_wrapped_object_with_return_value_and_side_effect2 -*unittest.test.testmock.testmock.MockTest.test_customize_wrapped_object_with_return_value_and_side_effect_default -*unittest.test.testmock.testmock.MockTest.test_customize_wrapped_object_with_side_effect_exception -*unittest.test.testmock.testmock.MockTest.test_customize_wrapped_object_with_side_effect_function -*unittest.test.testmock.testmock.MockTest.test_customize_wrapped_object_with_side_effect_iterable -*unittest.test.testmock.testmock.MockTest.test_customize_wrapped_object_with_side_effect_iterable_with_default -*unittest.test.testmock.testmock.MockTest.test_dir -*unittest.test.testmock.testmock.MockTest.test_dir_does_not_include_deleted_attributes -*unittest.test.testmock.testmock.MockTest.test_dir_from_spec -*unittest.test.testmock.testmock.MockTest.test_exceptional_side_effect -*unittest.test.testmock.testmock.MockTest.test_filter_dir -*unittest.test.testmock.testmock.MockTest.test_from_spec -*unittest.test.testmock.testmock.MockTest.test_isinstance_under_settrace -*unittest.test.testmock.testmock.MockTest.test_magic_method_wraps_class -*unittest.test.testmock.testmock.MockTest.test_magic_method_wraps_dict -*unittest.test.testmock.testmock.MockTest.test_magic_methods_mock_calls -*unittest.test.testmock.testmock.MockTest.test_manager_mock -*unittest.test.testmock.testmock.MockTest.test_method_calls_compare_easily -*unittest.test.testmock.testmock.MockTest.test_method_calls_recorded -*unittest.test.testmock.testmock.MockTest.test_misspelled_arguments -*unittest.test.testmock.testmock.MockTest.test_mock_add_spec -*unittest.test.testmock.testmock.MockTest.test_mock_add_spec_magic_methods -*unittest.test.testmock.testmock.MockTest.test_mock_call_not_equal_leaf -*unittest.test.testmock.testmock.MockTest.test_mock_call_not_equal_non_leaf -*unittest.test.testmock.testmock.MockTest.test_mock_call_not_equal_non_leaf_attr -*unittest.test.testmock.testmock.MockTest.test_mock_call_not_equal_non_leaf_call_versus_attr -*unittest.test.testmock.testmock.MockTest.test_mock_call_not_equal_non_leaf_params_different -*unittest.test.testmock.testmock.MockTest.test_mock_call_repr -*unittest.test.testmock.testmock.MockTest.test_mock_call_repr_loop -*unittest.test.testmock.testmock.MockTest.test_mock_calls -*unittest.test.testmock.testmock.MockTest.test_mock_calls_contains -*unittest.test.testmock.testmock.MockTest.test_mock_calls_create_autospec -*unittest.test.testmock.testmock.MockTest.test_mock_does_not_raise_on_repeated_attribute_deletion -*unittest.test.testmock.testmock.MockTest.test_mock_open_after_eof -*unittest.test.testmock.testmock.MockTest.test_mock_open_alter_readline -*unittest.test.testmock.testmock.MockTest.test_mock_open_dunder_iter_issue -*unittest.test.testmock.testmock.MockTest.test_mock_open_next_with_readline_with_return_value -*unittest.test.testmock.testmock.MockTest.test_mock_open_reuse_issue_21750 -*unittest.test.testmock.testmock.MockTest.test_mock_open_using_next -*unittest.test.testmock.testmock.MockTest.test_mock_open_write -*unittest.test.testmock.testmock.MockTest.test_mock_parents -*unittest.test.testmock.testmock.MockTest.test_mock_raises_when_deleting_nonexistent_attribute -*unittest.test.testmock.testmock.MockTest.test_mock_safe_with_spec -*unittest.test.testmock.testmock.MockTest.test_mock_unsafe -*unittest.test.testmock.testmock.MockTest.test_name_attribute_of_call -*unittest.test.testmock.testmock.MockTest.test_only_allowed_methods_exist -*unittest.test.testmock.testmock.MockTest.test_ordered_call_signature -*unittest.test.testmock.testmock.MockTest.test_override_tuple_methods -*unittest.test.testmock.testmock.MockTest.test_parent_attribute_of_call -*unittest.test.testmock.testmock.MockTest.test_parent_propagation_with_autospec_attach_mock -*unittest.test.testmock.testmock.MockTest.test_parent_propagation_with_create_autospec -*unittest.test.testmock.testmock.MockTest.test_repr -*unittest.test.testmock.testmock.MockTest.test_repr_with_spec -*unittest.test.testmock.testmock.MockTest.test_reset_mock -*unittest.test.testmock.testmock.MockTest.test_reset_mock_does_not_raise_on_attr_deletion -*unittest.test.testmock.testmock.MockTest.test_reset_mock_on_mock_open_issue_18622 -*unittest.test.testmock.testmock.MockTest.test_reset_mock_recursion -*unittest.test.testmock.testmock.MockTest.test_reset_return -*unittest.test.testmock.testmock.MockTest.test_reset_return_sideeffect -*unittest.test.testmock.testmock.MockTest.test_reset_return_with_children -*unittest.test.testmock.testmock.MockTest.test_reset_return_with_children_side_effect -*unittest.test.testmock.testmock.MockTest.test_reset_sideeffect -*unittest.test.testmock.testmock.MockTest.test_return_value_in_constructor -*unittest.test.testmock.testmock.MockTest.test_setting_attribute_with_spec_set -*unittest.test.testmock.testmock.MockTest.test_setting_call -*unittest.test.testmock.testmock.MockTest.test_side_effect -*unittest.test.testmock.testmock.MockTest.test_side_effect_iterator -*unittest.test.testmock.testmock.MockTest.test_side_effect_iterator_default -*unittest.test.testmock.testmock.MockTest.test_side_effect_iterator_exceptions -*unittest.test.testmock.testmock.MockTest.test_side_effect_setting_iterator -*unittest.test.testmock.testmock.MockTest.test_spec_class -*unittest.test.testmock.testmock.MockTest.test_spec_class_no_object_base -*unittest.test.testmock.testmock.MockTest.test_spec_list_subclass -*unittest.test.testmock.testmock.MockTest.test_subclass_with_properties -*unittest.test.testmock.testmock.MockTest.test_subclassing -*unittest.test.testmock.testmock.MockTest.test_wraps_attributes -*unittest.test.testmock.testmock.MockTest.test_wraps_call_with_nondefault_return_value -*unittest.test.testmock.testmock.MockTest.test_wraps_calls -*unittest.test.testmock.testmock.MockTest.test_wraps_prevents_automatic_creation_of_mocks -*unittest.test.testmock.testpatch.PatchTest.test_autospec -*unittest.test.testmock.testpatch.PatchTest.test_autospec_classmethod -*unittest.test.testmock.testpatch.PatchTest.test_autospec_classmethod_signature -*unittest.test.testmock.testpatch.PatchTest.test_autospec_function -*unittest.test.testmock.testpatch.PatchTest.test_autospec_inherits -*unittest.test.testmock.testpatch.PatchTest.test_autospec_keywords -*unittest.test.testmock.testpatch.PatchTest.test_autospec_name -*unittest.test.testmock.testpatch.PatchTest.test_autospec_staticmethod -*unittest.test.testmock.testpatch.PatchTest.test_autospec_staticmethod_signature -*unittest.test.testmock.testpatch.PatchTest.test_autospec_with_new -*unittest.test.testmock.testpatch.PatchTest.test_callable_spec_as_list -*unittest.test.testmock.testpatch.PatchTest.test_cant_set_kwargs_when_passing_a_mock -*unittest.test.testmock.testpatch.PatchTest.test_create_and_specs -*unittest.test.testmock.testpatch.PatchTest.test_dotted_but_module_not_loaded -*unittest.test.testmock.testpatch.PatchTest.test_falsey_spec -*unittest.test.testmock.testpatch.PatchTest.test_get_only_proxy -*unittest.test.testmock.testpatch.PatchTest.test_get_set_delete_proxy -*unittest.test.testmock.testpatch.PatchTest.test_invalid_target -*unittest.test.testmock.testpatch.PatchTest.test_mock_calls_with_patch -*unittest.test.testmock.testpatch.PatchTest.test_multiple_patchobject -*unittest.test.testmock.testpatch.PatchTest.test_multiple_specs -*unittest.test.testmock.testpatch.PatchTest.test_name_preserved -*unittest.test.testmock.testpatch.PatchTest.test_nested_patch_failure -*unittest.test.testmock.testpatch.PatchTest.test_nested_patch_with_spec_as_list -*unittest.test.testmock.testpatch.PatchTest.test_new_callable_class_decorating -*unittest.test.testmock.testpatch.PatchTest.test_new_callable_create -*unittest.test.testmock.testpatch.PatchTest.test_new_callable_failure -*unittest.test.testmock.testpatch.PatchTest.test_new_callable_incompatible_with_autospec -*unittest.test.testmock.testpatch.PatchTest.test_new_callable_incompatible_with_new -*unittest.test.testmock.testpatch.PatchTest.test_new_callable_inherit_for_mocks -*unittest.test.testmock.testpatch.PatchTest.test_new_callable_inherit_non_mock -*unittest.test.testmock.testpatch.PatchTest.test_new_callable_keyword_arguments -*unittest.test.testmock.testpatch.PatchTest.test_new_callable_patch -*unittest.test.testmock.testpatch.PatchTest.test_new_callable_patch_object -*unittest.test.testmock.testpatch.PatchTest.test_new_callable_spec -*unittest.test.testmock.testpatch.PatchTest.test_not_callable_spec_as_list -*unittest.test.testmock.testpatch.PatchTest.test_object_lookup_is_quite_lazy -*unittest.test.testmock.testpatch.PatchTest.test_patch -*unittest.test.testmock.testpatch.PatchTest.test_patch_and_patch_dict_stopall -*unittest.test.testmock.testpatch.PatchTest.test_patch_builtins_without_create -*unittest.test.testmock.testpatch.PatchTest.test_patch_class_acts_with_spec_is_inherited -*unittest.test.testmock.testpatch.PatchTest.test_patch_class_attribute -*unittest.test.testmock.testpatch.PatchTest.test_patch_class_decorator -*unittest.test.testmock.testpatch.PatchTest.test_patch_dict -*unittest.test.testmock.testpatch.PatchTest.test_patch_dict_as_context_manager -*unittest.test.testmock.testpatch.PatchTest.test_patch_dict_class_decorator -*unittest.test.testmock.testpatch.PatchTest.test_patch_dict_decorator_resolution -*unittest.test.testmock.testpatch.PatchTest.test_patch_dict_keyword_args -*unittest.test.testmock.testpatch.PatchTest.test_patch_dict_start_stop -*unittest.test.testmock.testpatch.PatchTest.test_patch_dict_stop_without_start -*unittest.test.testmock.testpatch.PatchTest.test_patch_dict_stopall -*unittest.test.testmock.testpatch.PatchTest.test_patch_dict_test_prefix -*unittest.test.testmock.testpatch.PatchTest.test_patch_dict_with_clear -*unittest.test.testmock.testpatch.PatchTest.test_patch_dict_with_container_object -*unittest.test.testmock.testpatch.PatchTest.test_patch_dict_with_container_object_and_clear -*unittest.test.testmock.testpatch.PatchTest.test_patch_dict_with_string -*unittest.test.testmock.testpatch.PatchTest.test_patch_imports_lazily -*unittest.test.testmock.testpatch.PatchTest.test_patch_keyword_args -*unittest.test.testmock.testpatch.PatchTest.test_patch_local -*unittest.test.testmock.testpatch.PatchTest.test_patch_multiple -*unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_create -*unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_create_mocks -*unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_create_mocks_different_order -*unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_create_mocks_patcher -*unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_decorating_class -*unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_failure -*unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_new_callable -*unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_new_callable_failure -*unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_no_kwargs -*unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_spec_set -*unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_stacked_decorators -*unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_string_subclasses -*unittest.test.testmock.testpatch.PatchTest.test_patch_nested_autospec_repr -*unittest.test.testmock.testpatch.PatchTest.test_patch_object_keyword_args -*unittest.test.testmock.testpatch.PatchTest.test_patch_object_with_spec_as_boolean -*unittest.test.testmock.testpatch.PatchTest.test_patch_orderdict -*unittest.test.testmock.testpatch.PatchTest.test_patch_propagates_exc_on_exit -*unittest.test.testmock.testpatch.PatchTest.test_patch_slots -*unittest.test.testmock.testpatch.PatchTest.test_patch_spec_set -*unittest.test.testmock.testpatch.PatchTest.test_patch_start_stop -*unittest.test.testmock.testpatch.PatchTest.test_patch_stopall -*unittest.test.testmock.testpatch.PatchTest.test_patch_test_prefix -*unittest.test.testmock.testpatch.PatchTest.test_patch_with_create_mocks_non_existent_attributes -*unittest.test.testmock.testpatch.PatchTest.test_patch_with_exception -*unittest.test.testmock.testpatch.PatchTest.test_patch_with_spec -*unittest.test.testmock.testpatch.PatchTest.test_patch_with_spec_as_boolean -*unittest.test.testmock.testpatch.PatchTest.test_patch_with_spec_as_list -*unittest.test.testmock.testpatch.PatchTest.test_patch_with_spec_mock_repr -*unittest.test.testmock.testpatch.PatchTest.test_patch_with_static_methods -*unittest.test.testmock.testpatch.PatchTest.test_patch_wont_create_by_default -*unittest.test.testmock.testpatch.PatchTest.test_patchobject_class_decorator -*unittest.test.testmock.testpatch.PatchTest.test_patchobject_start_stop -*unittest.test.testmock.testpatch.PatchTest.test_patchobject_twice -*unittest.test.testmock.testpatch.PatchTest.test_patchobject_with_create_mocks_non_existent_attributes -*unittest.test.testmock.testpatch.PatchTest.test_patchobject_with_default_mock -*unittest.test.testmock.testpatch.PatchTest.test_patchobject_with_none -*unittest.test.testmock.testpatch.PatchTest.test_patchobject_with_spec -*unittest.test.testmock.testpatch.PatchTest.test_patchobject_with_spec_as_list -*unittest.test.testmock.testpatch.PatchTest.test_patchobject_with_string_as_target -*unittest.test.testmock.testpatch.PatchTest.test_patchobject_wont_create_by_default -*unittest.test.testmock.testpatch.PatchTest.test_single_patchobject -*unittest.test.testmock.testpatch.PatchTest.test_spec_set_inherit -*unittest.test.testmock.testpatch.PatchTest.test_spec_set_true -*unittest.test.testmock.testpatch.PatchTest.test_specs_false_instead_of_none -*unittest.test.testmock.testpatch.PatchTest.test_stop_idempotent -*unittest.test.testmock.testpatch.PatchTest.test_stop_without_start -*unittest.test.testmock.testpatch.PatchTest.test_stopall_lifo -*unittest.test.testmock.testpatch.PatchTest.test_tracebacks -*unittest.test.testmock.testsealable.TestSealable.test_attribute_chain_is_maintained -*unittest.test.testmock.testsealable.TestSealable.test_attributes_return_more_mocks_by_default -*unittest.test.testmock.testsealable.TestSealable.test_call_chain_is_maintained -*unittest.test.testmock.testsealable.TestSealable.test_call_on_defined_sealed_mock_succeeds -*unittest.test.testmock.testsealable.TestSealable.test_call_on_sealed_mock_fails -*unittest.test.testmock.testsealable.TestSealable.test_existing_attributes_allowed_after_seal -*unittest.test.testmock.testsealable.TestSealable.test_existing_attributes_can_be_set_on_seal -*unittest.test.testmock.testsealable.TestSealable.test_initialized_attributes_allowed_after_seal -*unittest.test.testmock.testsealable.TestSealable.test_integration_with_spec_att_definition -*unittest.test.testmock.testsealable.TestSealable.test_integration_with_spec_method_definition -*unittest.test.testmock.testsealable.TestSealable.test_integration_with_spec_method_definition_respects_spec -*unittest.test.testmock.testsealable.TestSealable.test_new_attributes_cannot_be_accessed_on_seal -*unittest.test.testmock.testsealable.TestSealable.test_new_attributes_cannot_be_set_on_child_of_seal -*unittest.test.testmock.testsealable.TestSealable.test_new_attributes_cannot_be_set_on_seal -*unittest.test.testmock.testsealable.TestSealable.test_sealed_exception_has_attribute_name -*unittest.test.testmock.testsealable.TestSealable.test_seals_dont_recurse_on_manual_attributes -*unittest.test.testmock.testsealable.TestSealable.test_seals_recurse_on_added_attributes -*unittest.test.testmock.testsealable.TestSealable.test_seals_recurse_on_magic_methods -*unittest.test.testmock.testsentinel.SentinelTest.testBases -*unittest.test.testmock.testsentinel.SentinelTest.testCopy -*unittest.test.testmock.testsentinel.SentinelTest.testDEFAULT -*unittest.test.testmock.testsentinel.SentinelTest.testPickle -*unittest.test.testmock.testsentinel.SentinelTest.testSentinelName -*unittest.test.testmock.testsentinel.SentinelTest.testSentinels -*unittest.test.testmock.testwith.TestMockOpen.test_dunder_iter_data -*unittest.test.testmock.testwith.TestMockOpen.test_explicit_mock -*unittest.test.testmock.testwith.TestMockOpen.test_interleaved_reads -*unittest.test.testmock.testwith.TestMockOpen.test_mock_open -*unittest.test.testmock.testwith.TestMockOpen.test_mock_open_context_manager -*unittest.test.testmock.testwith.TestMockOpen.test_mock_open_context_manager_multiple_times -*unittest.test.testmock.testwith.TestMockOpen.test_mock_open_read_with_argument -*unittest.test.testmock.testwith.TestMockOpen.test_next_data -*unittest.test.testmock.testwith.TestMockOpen.test_overriding_return_values -*unittest.test.testmock.testwith.TestMockOpen.test_read_bytes -*unittest.test.testmock.testwith.TestMockOpen.test_read_data -*unittest.test.testmock.testwith.TestMockOpen.test_readline_bytes -*unittest.test.testmock.testwith.TestMockOpen.test_readline_data -*unittest.test.testmock.testwith.TestMockOpen.test_readlines_bytes -*unittest.test.testmock.testwith.TestMockOpen.test_readlines_data -*unittest.test.testmock.testwith.WithTest.testContextManagerMocking -*unittest.test.testmock.testwith.WithTest.test_context_manager_with_magic_mock -*unittest.test.testmock.testwith.WithTest.test_dict_context_manager -*unittest.test.testmock.testwith.WithTest.test_double_patch_instance_method -*unittest.test.testmock.testwith.WithTest.test_patch_object_with_statement -*unittest.test.testmock.testwith.WithTest.test_with_statement -*unittest.test.testmock.testwith.WithTest.test_with_statement_as -*unittest.test.testmock.testwith.WithTest.test_with_statement_exception -*unittest.test.testmock.testwith.WithTest.test_with_statement_imbricated -*unittest.test.testmock.testwith.WithTest.test_with_statement_nested -*unittest.test.testmock.testwith.WithTest.test_with_statement_same_attribute -*unittest.test.testmock.testwith.WithTest.test_with_statement_specified +unittest.test.test_assertions.TestLongMessage.testAlmostEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertDictContainsSubset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertDictEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertFalse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertGreater @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertGreaterEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertIn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertIs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertIsNone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertIsNot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertIsNotNone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertLess @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertLessEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertMultiLineEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertNotIn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertNotRegex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertRaises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertRaisesRegex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertRegex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertSequenceEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertSetEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertTrue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertWarns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testAssertWarnsRegex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testDefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testNotAlmostEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.testNotEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.test_baseAssertEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.test_formatMessage_unicode_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.TestLongMessage.test_formatMsg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.Test_Assertions.testAssertNotRegex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.Test_Assertions.test_AlmostEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.Test_Assertions.test_AmostEqualWithDelta @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_assertions.Test_Assertions.test_assertRaises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Weakref +!unittest.test.test_assertions.Test_Assertions.test_assertRaises_frames_survival @ darwin-arm64,linux-aarch64,linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_base_exception_from_async_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_cancellation_hanging_tasks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_cleanups_interleave_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_debug_cleanup_same_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_deprecation_of_return_val_from_test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_enterAsyncContext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_enterAsyncContext_arg_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_exception_in_setup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_exception_in_tear_clean_up @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_exception_in_tear_down @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_exception_in_test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_full_cycle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_setup_get_event_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.test_case.Test_TestCase.testAddTypeEqualityFunc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertCountEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertDictContainsSubset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertDictEqualTruncates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertEqualSingleLine @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertEqual_diffThreshold @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertEqual_shorten @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertIn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertIs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertIsInstance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertIsNone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertIsNot @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertLogsDefaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertLogsFailureLevelTooHigh @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertLogsFailureLevelTooHigh_FilterInRootLogger @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertLogsFailureMismatchingLogger @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertLogsFailureNoLogs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertLogsPerLevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertLogsPerLogger @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertLogsTwoMatchingMessages @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertLogsUnexpectedException @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertMultiLineEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertMultiLineEqualTruncates @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertNoLogsDefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertNoLogsFailureFoundLogs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertNoLogsFailurePerLevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertNoLogsFailurePerLogger @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertNoLogsPerLevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertNoLogsPerLogger @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertNoLogsUnexpectedException @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertNoLogsYieldsNone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertNotIsInstance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertNotRaisesRegex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertRaisesCallable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertRaisesContext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertRaisesExcValue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertRaisesNoExceptionType @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertRaisesRefcount @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertRaisesRegex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertRaisesRegexInvalidRegex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertRaisesRegexMismatch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertRaisesRegexNoExceptionType @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertRegex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertSequenceEqualMaxDiff @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertSetEqual @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertWarnsCallable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertWarnsContext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertWarnsModifySysModules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertWarnsNoExceptionType @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertWarnsRegexCallable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertWarnsRegexContext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertWarnsRegexInvalidRegex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testAssertWarnsRegexNoExceptionType @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testDeepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testDeprecatedMethodNames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testEquality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testEqualityBytesWarning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testInequality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testKeyboardInterrupt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testPickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testShortDescriptionWhitespaceTrimming @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testShortDescriptionWithMultiLineDocstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testShortDescriptionWithOneLineDocstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testShortDescriptionWithoutDocstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testSkippingEverywhere @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testSystemExit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.testTruncateMessage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_call__invoking_an_instance_delegates_to_run @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_countTestCases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_defaultTestResult @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_deprecation_of_return_val_from_test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_failureException__default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_failureException__subclassing__explicit_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_failureException__subclassing__implicit_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_id @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_init__no_test_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_init__test_name__invalid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_init__test_name__valid @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_ne @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_run__returns_given_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_run__uses_defaultTestResult @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_run_call_order__error_in_setUp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_run_call_order__error_in_setUp_default_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_run_call_order__error_in_tearDown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_run_call_order__error_in_tearDown_default_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_run_call_order__error_in_test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_run_call_order__error_in_test_default_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_run_call_order__failure_in_test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_run_call_order__failure_in_test_default_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_run_call_order__subtests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_run_call_order__subtests_failfast @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_run_call_order__subtests_legacy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_run_call_order__subtests_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_run_call_order__subtests_success_legacy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_run_call_order_default_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_setUp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_subtests_debug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_subtests_failfast @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_case.Test_TestCase.test_tearDown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_command_line_handling_discover_by_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_command_line_handling_discover_by_default_with_options @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_command_line_handling_do_discovery_calls_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_command_line_handling_do_discovery_too_many_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_command_line_handling_do_discovery_uses_default_loader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_command_line_handling_parseArgs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_detect_module_clash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_discover @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_discover_start_dir_is_package_calls_package_load_tests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_discover_with_init_module_that_raises_SkipTest_on_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_discover_with_init_modules_that_fail_to_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_discover_with_module_that_raises_SkipTest_on_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_discover_with_modules_that_fail_to_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_discovery_failed_discovery @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_discovery_from_dotted_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_discovery_from_dotted_path_builtin_modules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_find_tests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_find_tests_customize_via_package_pattern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_find_tests_default_calls_package_load_tests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_find_tests_socket @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_find_tests_with_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_get_name_from_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_discovery.TestDiscovery.test_module_symlink_ok @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_functiontestcase.Test_FunctionTestCase.test_countTestCases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_functiontestcase.Test_FunctionTestCase.test_id @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_functiontestcase.Test_FunctionTestCase.test_run_call_order__error_in_setUp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_functiontestcase.Test_FunctionTestCase.test_run_call_order__error_in_tearDown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_functiontestcase.Test_FunctionTestCase.test_run_call_order__error_in_test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_functiontestcase.Test_FunctionTestCase.test_run_call_order__failure_in_test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_functiontestcase.Test_FunctionTestCase.test_shortDescription__no_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_functiontestcase.Test_FunctionTestCase.test_shortDescription__singleline_docstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.TestObsoleteFunctions.test_findTestCases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.TestObsoleteFunctions.test_getTestCaseNames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.TestObsoleteFunctions.test_makeSuite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test___init__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_getTestCaseNames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_getTestCaseNames__inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_getTestCaseNames__no_tests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_getTestCaseNames__not_a_TestCase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_getTestCaseNames__testNamePatterns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_getTestCaseNames__testNamePatterns__attribute_access_regression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__TestCase_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__TestCase_subclass_internals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__faulty_load_tests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__load_tests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__no_TestCase_instances @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__no_TestCase_tests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__not_a_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__pattern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__too_many_positional_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__use_load_tests_deprecated_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__use_load_tests_deprecated_positional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__use_load_tests_other_bad_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__callable__TestCase_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__callable__TestCase_instance_ProperSuiteClass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__callable__TestSuite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__callable__wrong_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__empty_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__function_with_different_name_than_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__malformed_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__module_not_loaded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_TestCase_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_TestSuite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_bad_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_empty_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_malformed_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_not_a_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_testmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_testmethod_ProperSuiteClass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_unknown_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__unknown_attr_name_on_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__unknown_attr_name_on_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__unknown_module_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__callable__TestCase_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__callable__TestSuite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__callable__call_staticmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__callable__wrong_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__empty_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__empty_name_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__malformed_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__module_not_loaded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_TestCase_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_TestSuite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_bad_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_empty_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_empty_name_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_malformed_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_not_a_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_testmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__unknown_attr_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__unknown_module_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__unknown_name_relative_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__unknown_name_relative_2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromTestCase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromTestCase__TestSuite_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromTestCase__default_method_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromTestCase__from_FunctionTestCase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromTestCase__from_TestCase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromTestCase__no_matches @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_partial_functions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__None @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__default_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__getTestCaseNames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__loadTestsFromModule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__loadTestsFromName @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__loadTestsFromNames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__loadTestsFromTestCase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_suiteClass__default_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_suiteClass__loadTestsFromModule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_suiteClass__loadTestsFromName @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_suiteClass__loadTestsFromNames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_suiteClass__loadTestsFromTestCase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_testMethodPrefix__default_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_testMethodPrefix__loadTestsFromModule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_testMethodPrefix__loadTestsFromName @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_testMethodPrefix__loadTestsFromNames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_loader.Test_TestLoader.test_testMethodPrefix__loadTestsFromTestCase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.TestCommandLineArgs.testBufferCatchFailfast @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.TestCommandLineArgs.testCatchBreakInstallsHandler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.TestCommandLineArgs.testParseArgsAbsolutePathsThatCanBeConverted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.TestCommandLineArgs.testParseArgsAbsolutePathsThatCannotBeConverted @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.test_program.TestCommandLineArgs.testParseArgsFileNames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.TestCommandLineArgs.testParseArgsFilePaths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.TestCommandLineArgs.testParseArgsNonExistentFiles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.TestCommandLineArgs.testParseArgsSelectedTestNames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.TestCommandLineArgs.testRunTestsOldRunnerClass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.TestCommandLineArgs.testRunTestsRunnerClass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.TestCommandLineArgs.testRunTestsRunnerInstance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.TestCommandLineArgs.testSelectedTestNamesFunctionalTest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.TestCommandLineArgs.testVerbosity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.TestCommandLineArgs.testWarning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.TestCommandLineArgs.test_locals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.Test_TestProgram.testNoExit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.Test_TestProgram.test_Exit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.Test_TestProgram.test_ExitAsDefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.Test_TestProgram.test_NonExit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.Test_TestProgram.test_defaultTest_with_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.Test_TestProgram.test_defaultTest_with_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_program.Test_TestProgram.test_discovery_from_dotted_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.TestOutputBuffering.testBufferDoClassCleanups @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.TestOutputBuffering.testBufferDoCleanups @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.TestOutputBuffering.testBufferDoModuleCleanups @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.TestOutputBuffering.testBufferOutputAddErrorOrFailure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.TestOutputBuffering.testBufferOutputOff @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.TestOutputBuffering.testBufferOutputStartTestAddSuccess @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.TestOutputBuffering.testBufferSetUp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.TestOutputBuffering.testBufferSetUpModule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.TestOutputBuffering.testBufferSetUpModule_DoModuleCleanups @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.TestOutputBuffering.testBufferSetUp_DoCleanups @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.TestOutputBuffering.testBufferSetupClass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.TestOutputBuffering.testBufferSetupClass_DoClassCleanups @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.TestOutputBuffering.testBufferTearDown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.TestOutputBuffering.testBufferTearDownClass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.TestOutputBuffering.testBufferTearDownClass_DoClassCleanups @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.TestOutputBuffering.testBufferTearDownModule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.TestOutputBuffering.testBufferTearDownModule_DoModuleCleanups @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.TestOutputBuffering.testBufferTearDown_DoCleanups @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_OldTestResult.testOldResultWithRunner @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_OldTestResult.testOldTestResult @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_OldTestResult.testOldTestResultClass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_OldTestResult.testOldTestTesultSetup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TestResult.testFailFast @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TestResult.testFailFastSetByRunner @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TestResult.testStackFrameTrimming @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TestResult.test_addError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TestResult.test_addError_locals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TestResult.test_addFailure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TestResult.test_addFailure_filter_traceback_frames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TestResult.test_addFailure_filter_traceback_frames_chained_exception_cycle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TestResult.test_addFailure_filter_traceback_frames_chained_exception_self_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TestResult.test_addFailure_filter_traceback_frames_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TestResult.test_addSubTest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TestResult.test_addSuccess @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TestResult.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TestResult.test_startTest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TestResult.test_startTestRun_stopTestRun @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TestResult.test_stop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TestResult.test_stopTest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TextTestResult.testDotsOutput @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TextTestResult.testDotsOutputSubTestMixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TextTestResult.testDotsOutputSubTestSuccess @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TextTestResult.testDotsOutputTearDownFail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TextTestResult.testGetDescriptionWithMultiLineDocstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TextTestResult.testGetDescriptionWithOneLineDocstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TextTestResult.testGetDescriptionWithoutDocstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TextTestResult.testGetDuplicatedNestedSubTestDescriptionWithoutDocstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TextTestResult.testGetNestedSubTestDescriptionWithoutDocstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TextTestResult.testGetSubTestDescriptionForFalsyValues @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TextTestResult.testGetSubTestDescriptionWithMultiLineDocstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TextTestResult.testGetSubTestDescriptionWithOneLineDocstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TextTestResult.testGetSubTestDescriptionWithoutDocstring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TextTestResult.testGetSubTestDescriptionWithoutDocstringAndParams @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TextTestResult.testLongOutput @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TextTestResult.testLongOutputSubTestMixed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TextTestResult.testLongOutputSubTestSuccess @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_result.Test_TextTestResult.testLongOutputTearDownFail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestClassCleanup.test_addClassCleanUp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestClassCleanup.test_debug_executes_classCleanUp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestClassCleanup.test_debug_executes_classCleanUp_when_teardown_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestClassCleanup.test_doClassCleanups_with_errors_addClassCleanUp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestClassCleanup.test_enterClassContext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestClassCleanup.test_enterClassContext_arg_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestClassCleanup.test_run_class_cleanUp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestClassCleanup.test_run_class_cleanUp_without_tearDownClass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestClassCleanup.test_run_nested_test @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestClassCleanup.test_run_with_errors_addClassCleanUp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestClassCleanup.test_with_errors_addCleanUp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestClassCleanup.test_with_errors_in_addClassCleanup_and_setUps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestClassCleanup.test_with_errors_in_tearDownClass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestCleanUp.testCleanUp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestCleanUp.testCleanUpWithErrors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestCleanUp.testCleanupInRun @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestCleanUp.testTestCaseDebugExecutesCleanups @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestCleanUp.test_enterContext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestCleanUp.test_enterContext_arg_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestModuleCleanUp.test_addClassCleanup_arg_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestModuleCleanUp.test_addCleanup_arg_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestModuleCleanUp.test_addModuleCleanup_arg_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestModuleCleanUp.test_add_and_do_ModuleCleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestModuleCleanUp.test_debug_module_cleanUp_when_teardown_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestModuleCleanUp.test_debug_module_executes_cleanUp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestModuleCleanUp.test_doModuleCleanup_with_errors_in_addModuleCleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestModuleCleanUp.test_enterModuleContext @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestModuleCleanUp.test_enterModuleContext_arg_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestModuleCleanUp.test_module_cleanUp_with_multiple_classes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestModuleCleanUp.test_run_module_cleanUp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestModuleCleanUp.test_run_module_cleanUp_when_teardown_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestModuleCleanUp.test_run_module_cleanUp_without_teardown @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestModuleCleanUp.test_run_multiple_module_cleanUp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestModuleCleanUp.test_with_errors_in_addClassCleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestModuleCleanUp.test_with_errors_in_addCleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.TestModuleCleanUp.test_with_errors_in_addModuleCleanup_and_setUps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.Test_TextTestRunner.testBufferAndFailfast @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.Test_TextTestRunner.testRunnerRegistersResult @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.Test_TextTestRunner.testSpecifiedStreamUsed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.Test_TextTestRunner.testStdErrLookedUpAtInstantiationTime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.Test_TextTestRunner.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.Test_TextTestRunner.test_locals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.Test_TextTestRunner.test_multiple_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.Test_TextTestRunner.test_pickle_unpickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.Test_TextTestRunner.test_resultclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.Test_TextTestRunner.test_startTestRun_stopTestRun_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.Test_TextTestRunner.test_warnings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_runner.Test_TextTestRunner.test_works_with_result_without_startTestRun_stopTestRun @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_setups.TestSetups.test_class_not_setup_or_torndown_when_skipped @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_setups.TestSetups.test_class_not_torndown_when_setup_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_setups.TestSetups.test_error_in_setup_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_setups.TestSetups.test_error_in_setupclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_setups.TestSetups.test_error_in_teardown_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_setups.TestSetups.test_error_in_teardown_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_setups.TestSetups.test_setup_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_setups.TestSetups.test_setup_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_setups.TestSetups.test_setup_teardown_order_with_pathological_suite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_setups.TestSetups.test_skiptest_in_setupclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_setups.TestSetups.test_skiptest_in_setupmodule @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_setups.TestSetups.test_suite_debug_executes_setups_and_teardowns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_setups.TestSetups.test_suite_debug_propagates_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_setups.TestSetups.test_teardown_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_setups.TestSetups.test_teardown_class_two_classes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_setups.TestSetups.test_teardown_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_setups.TestSetups.test_testcase_with_missing_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_debug_skipping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_debug_skipping_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_debug_skipping_subtests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_decorated_skip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_expected_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_expected_failure_and_fail_in_cleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_expected_failure_and_skip_in_cleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_expected_failure_subtests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_expected_failure_with_wrapped_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_expected_failure_with_wrapped_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_failure_and_skip_in_cleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_skip_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_skip_doesnt_run_setup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_skip_in_cleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_skip_in_setup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_skip_non_unittest_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_skip_without_reason @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_skipping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_skipping_and_fail_in_cleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_skipping_decorators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_skipping_subtests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_unexpected_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_unexpected_success_and_fail_in_cleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_unexpected_success_and_skip_in_cleanup @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_skipping.Test_TestSkipping.test_unexpected_success_subtests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_addTest__TestCase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_addTest__TestSuite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_addTest__casesuiteclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_addTest__noncallable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_addTest__noniterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_addTests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_addTests__string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_basetestsuite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_countTestCases_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_countTestCases_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_countTestCases_zero_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_countTestCases_zero_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_function_in_suite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_garbage_collect_test_after_run_BaseTestSuite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_init__TestSuite_instances_in_tests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_init__empty_tests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_init__tests_from_any_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_init__tests_optional @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_ne @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_overriding_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_remove_test_at_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_remove_test_at_index_not_indexable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_run @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_run__empty_suite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.test_suite.Test_TestSuite.test_run__requires_result @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncArguments.test_add_return_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncArguments.test_add_side_effect_coroutine @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncArguments.test_add_side_effect_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncArguments.test_add_side_effect_exception_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncArguments.test_add_side_effect_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncArguments.test_add_side_effect_normal_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncArguments.test_await_args_list_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncArguments.test_return_value_AsyncMock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncArguments.test_return_value_awaitable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncArguments.test_side_effect_awaitable_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncArguments.test_side_effect_is_AsyncMock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncArguments.test_wraps_coroutine @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncArguments.test_wraps_normal_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncAutospecTest.test_create_autospec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncAutospecTest.test_create_autospec_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncAutospecTest.test_is_AsyncMock_patch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncAutospecTest.test_patch_with_autospec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncContextManagerTest.test_context_manager_raise_exception_by_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncContextManagerTest.test_mock_customize_async_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncContextManagerTest.test_mock_customize_async_context_manager_with_coroutine @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncContextManagerTest.test_mock_supports_async_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncContextManagerTest.test_set_return_value_of_aenter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncIteratorTest.test_aiter_set_return_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncIteratorTest.test_mock_aiter_and_anext_asyncmock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncIteratorTest.test_mock_async_for @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncMagicMethods.test_async_magic_methods_return_async_mocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncMagicMethods.test_asyncmock_has_sync_magic_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncMagicMethods.test_magic_methods_are_async_functions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncMagicMethods.test_magicmock_has_async_magic_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncMagicMethods.test_sync_magic_methods_return_magic_mocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncMockAssert.test_assert_any_wait @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncMockAssert.test_assert_awaited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncMockAssert.test_assert_awaited_but_not_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncMockAssert.test_assert_awaited_once @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncMockAssert.test_assert_awaited_once_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncMockAssert.test_assert_awaited_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncMockAssert.test_assert_called_and_awaited_at_same_time @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncMockAssert.test_assert_called_once_and_awaited_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncMockAssert.test_assert_called_then_awaited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncMockAssert.test_assert_has_awaits_no_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncMockAssert.test_assert_has_awaits_not_matching_spec_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncMockAssert.test_assert_has_awaits_ordered @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncMockAssert.test_assert_not_awaited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncMockAssert.test_awaits_asserts_with_any @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncMockAssert.test_awaits_asserts_with_spec_and_any @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncMockTest.test_future_isfuture @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncMockTest.test_isawaitable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncMockTest.test_iscoroutinefunction_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncMockTest.test_iscoroutinefunction_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncMockTest.test_iscoroutinefunction_normal_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncPatchCMTest.test_async_def_cm @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncPatchCMTest.test_is_AsyncMock_cm @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncPatchCMTest.test_is_async_cm @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncPatchCMTest.test_is_async_function_cm @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncPatchCMTest.test_patch_dict_async_def @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncPatchCMTest.test_patch_dict_async_def_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncPatchDecoratorTest.test_async_def_patch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncPatchDecoratorTest.test_is_AsyncMock_patch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncPatchDecoratorTest.test_is_AsyncMock_patch_classmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncPatchDecoratorTest.test_is_AsyncMock_patch_staticmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncPatchDecoratorTest.test_is_async_patch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncPatchDecoratorTest.test_is_coroutine_function_patch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncSpecSetTest.test_is_AsyncMock_patch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncSpecSetTest.test_is_async_AsyncMock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncSpecSetTest.test_is_child_AsyncMock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncSpecSetTest.test_magicmock_lambda_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncSpecTest.test_spec_as_normal_kw_AsyncMock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncSpecTest.test_spec_as_normal_positional_AsyncMock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +unittest.test.testmock.testasync.AsyncSpecTest.test_spec_async_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncSpecTest.test_spec_async_mock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncSpecTest.test_spec_normal_methods_on_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncSpecTest.test_spec_normal_methods_on_class_with_mock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncSpecTest.test_spec_normal_methods_on_class_with_mock_seal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncSpecTest.test_spec_parent_not_async_attribute_is @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncSpecTest.test_target_async_spec_not @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testasync.AsyncSpecTest.test_target_not_async_spec_is @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testcallable.TestCallable.test_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testcallable.TestCallable.test_create_autospec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testcallable.TestCallable.test_create_autospec_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testcallable.TestCallable.test_hierarchy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testcallable.TestCallable.test_non_callable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testcallable.TestCallable.test_patch_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testcallable.TestCallable.test_patch_spec_callable_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testcallable.TestCallable.test_patch_spec_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testcallable.TestCallable.test_patch_spec_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testcallable.TestCallable.test_patch_spec_set_instance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testcallable.TestCallable.test_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.AnyTest.test_any @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.AnyTest.test_any_and_datetime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.AnyTest.test_any_and_spec_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.AnyTest.test_any_no_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.AnyTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_attribute_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_call_any @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_call_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_call_ne @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_call_non_tuples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_call_with_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_call_with_args_call_empty_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_call_with_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_call_with_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_call_with_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_dunder_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_empty__Call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_extended_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_extended_not_equal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_named_call_with_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_named_call_with_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_named_empty_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_nested_calls_not_equal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.CallTest.test_two_args_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_autospec_data_descriptor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_autospec_functions_with_self_in_odd_place @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_autospec_getattr_partial_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_autospec_reset_mock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_autospec_signature_classmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_autospec_signature_staticmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_builtin_functions_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_builtins @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_class_with_no_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_create_autospec_keyword_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_create_autospec_keyword_only_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_create_autospec_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_create_autospec_return_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_descriptors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_function_as_instance_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_inherit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_magic_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_method_calls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_mocking_unbound_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_recursive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_signature_callable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_signature_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_signature_noncallable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_skip_attributeerrors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_as_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_function_assert_any_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_function_assert_has_calls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_function_no_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_function_reset_mock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_has_descriptor_returning_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_inheritance_for_classes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_inspect_signature @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_inspect_signature_annotations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.SpecSignatureTest.test_spec_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.TestCallList.test_args_list_contains_call_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.TestCallList.test_call_list_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.TestCallList.test_propertymock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.TestCallList.test_propertymock_bare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.TestCallList.test_propertymock_returnvalue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.TestCallList.test_propertymock_side_effect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.TestCallablePredicate.test_call_magic_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.TestCallablePredicate.test_classmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.TestCallablePredicate.test_non_callable_classmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.TestCallablePredicate.test_non_callable_staticmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.TestCallablePredicate.test_staticmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testhelpers.TestCallablePredicate.test_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_asyncmock_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_attributes_and_return_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_bound_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_changing_magic_set_in_initialization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_deleting_magic_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_descriptor_from_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_dict_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_division @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_divmod_and_rdivmod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_iterable_as_iter_return_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_len_contains_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_in_initialization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_method_reset_mock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_method_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_method_wrapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_methods_and_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_methods_and_spec_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_methods_are_magic_mocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_methods_fspath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_methods_isolated_between_mocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magic_mock_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magicmock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magicmock_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_magicmock_del @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_matmul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_nonzero @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_numeric @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_setting_unsupported_magic_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmagicmethods.TestMockingMagicMethods.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test__name__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_adding_child_mock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_adding_return_value_mock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_arg_lists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_any_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_any_call_with_function_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_called_exception_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_called_once @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_called_once_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_called_once_message_not_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_called_once_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_called_once_with_call_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_called_once_with_function_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_called_once_with_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_called_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_called_with_any @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_called_with_failure_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_called_with_function_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_called_with_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_called_with_method_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_has_calls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_has_calls_any_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_has_calls_nested_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_has_calls_nested_without_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_has_calls_not_matching_spec_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_has_calls_with_function_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_not_called @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_assert_not_called_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_attach_mock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_attach_mock_patch_autospec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_attach_mock_patch_autospec_signature @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_attach_mock_return_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_attribute_access_returns_mocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_attribute_deletion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_attributes_have_name_and_parent_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_autospec_mock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_autospec_side_effect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_autospec_side_effect_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_baseexceptional_side_effect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_bool_not_called_when_passing_spec_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_call_args_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_call_args_two_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_calls_equal_with_any @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_change_return_value_via_delegate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_change_side_effect_via_delegate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_child_mock_call_equal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_class_assignable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_configure_mock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_create_autospec_classmethod_and_staticmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_create_autospec_with_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_customize_wrapped_object_with_return_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_customize_wrapped_object_with_return_value_and_side_effect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_customize_wrapped_object_with_return_value_and_side_effect2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_customize_wrapped_object_with_return_value_and_side_effect_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_customize_wrapped_object_with_side_effect_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_customize_wrapped_object_with_side_effect_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_customize_wrapped_object_with_side_effect_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_customize_wrapped_object_with_side_effect_iterable_with_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_dir_does_not_include_deleted_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_dir_from_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_exceptional_side_effect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_filter_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_from_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_isinstance_under_settrace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_magic_method_wraps_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_magic_method_wraps_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_magic_methods_mock_calls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_manager_mock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_method_calls_compare_easily @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_method_calls_recorded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_misspelled_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_add_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_add_spec_magic_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_call_not_equal_leaf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_call_not_equal_non_leaf @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_call_not_equal_non_leaf_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_call_not_equal_non_leaf_call_versus_attr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_call_not_equal_non_leaf_params_different @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_call_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_call_repr_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_calls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_calls_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_calls_create_autospec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_does_not_raise_on_repeated_attribute_deletion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_open_after_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_open_alter_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_open_dunder_iter_issue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_open_next_with_readline_with_return_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_open_reuse_issue_21750 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_open_using_next @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_open_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_parents @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_raises_when_deleting_nonexistent_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_safe_with_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_mock_unsafe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_name_attribute_of_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_only_allowed_methods_exist @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_ordered_call_signature @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_override_tuple_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_parent_attribute_of_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_parent_propagation_with_autospec_attach_mock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_parent_propagation_with_create_autospec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_repr_with_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_reset_mock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_reset_mock_does_not_raise_on_attr_deletion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_reset_mock_on_mock_open_issue_18622 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_reset_mock_recursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_reset_return @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_reset_return_sideeffect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_reset_return_with_children @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_reset_return_with_children_side_effect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_reset_sideeffect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_return_value_in_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_setting_attribute_with_spec_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_setting_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_side_effect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_side_effect_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_side_effect_iterator_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_side_effect_iterator_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_side_effect_setting_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_spec_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_spec_class_no_object_base @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_spec_list_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_subclass_with_properties @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_subclassing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_wraps_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_wraps_call_with_nondefault_return_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_wraps_calls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testmock.MockTest.test_wraps_prevents_automatic_creation_of_mocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_autospec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_autospec_classmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_autospec_classmethod_signature @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_autospec_function @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_autospec_inherits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_autospec_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_autospec_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_autospec_staticmethod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_autospec_staticmethod_signature @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_autospec_with_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_autospec_with_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_callable_spec_as_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_cant_set_kwargs_when_passing_a_mock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_create_and_specs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_dotted_but_module_not_loaded @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_falsey_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_get_only_proxy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_get_set_delete_proxy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_invalid_target @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_mock_calls_with_patch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_multiple_patchobject @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_multiple_specs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_name_preserved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_nested_patch_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_nested_patch_with_spec_as_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_new_callable_class_decorating @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_new_callable_create @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_new_callable_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_new_callable_incompatible_with_autospec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_new_callable_incompatible_with_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_new_callable_inherit_for_mocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_new_callable_inherit_non_mock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_new_callable_keyword_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_new_callable_patch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_new_callable_patch_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_new_callable_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_not_callable_spec_as_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_object_lookup_is_quite_lazy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_and_patch_dict_stopall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_builtins_without_create @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_class_acts_with_spec_is_inherited @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_class_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_class_decorator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_dict_as_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_dict_class_decorator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_dict_decorator_resolution @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_dict_keyword_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_dict_start_stop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_dict_stop_without_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_dict_stopall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_dict_test_prefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_dict_with_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_dict_with_container_object @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_dict_with_container_object_and_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_dict_with_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_imports_lazily @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_keyword_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_local @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_multiple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_create @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_create_mocks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_create_mocks_different_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_create_mocks_patcher @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_decorating_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_new_callable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_new_callable_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_no_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_spec_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_stacked_decorators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_multiple_string_subclasses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_nested_autospec_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_object_keyword_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_object_with_spec_as_boolean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_orderdict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_propagates_exc_on_exit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_spec_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_start_stop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_stopall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_test_prefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_with_create_mocks_non_existent_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_with_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_with_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_with_spec_as_boolean @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_with_spec_as_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_with_spec_mock_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_with_static_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patch_wont_create_by_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patchobject_class_decorator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patchobject_start_stop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patchobject_twice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patchobject_with_create_mocks_non_existent_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patchobject_with_default_mock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patchobject_with_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patchobject_with_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patchobject_with_spec_as_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patchobject_with_string_as_target @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_patchobject_wont_create_by_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_single_patchobject @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_spec_set_inherit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_spec_set_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_specs_false_instead_of_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_stop_idempotent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_stop_without_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_stopall_lifo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testpatch.PatchTest.test_tracebacks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_attribute_chain_is_maintained @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_attributes_return_more_mocks_by_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_call_chain_is_maintained @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_call_on_defined_sealed_mock_succeeds @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_call_on_sealed_mock_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_existing_attributes_allowed_after_seal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_existing_attributes_can_be_set_on_seal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_initialized_attributes_allowed_after_seal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_integration_with_spec_att_definition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_integration_with_spec_method_definition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_integration_with_spec_method_definition_respects_spec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_new_attributes_cannot_be_accessed_on_seal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_new_attributes_cannot_be_set_on_child_of_seal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_new_attributes_cannot_be_set_on_seal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_seal_with_autospec @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_sealed_exception_has_attribute_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_seals_dont_recurse_on_manual_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_seals_recurse_on_added_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsealable.TestSealable.test_seals_recurse_on_magic_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsentinel.SentinelTest.testBases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsentinel.SentinelTest.testCopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsentinel.SentinelTest.testDEFAULT @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsentinel.SentinelTest.testPickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsentinel.SentinelTest.testSentinelName @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testsentinel.SentinelTest.testSentinels @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.TestMockOpen.test_dunder_iter_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.TestMockOpen.test_explicit_mock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.TestMockOpen.test_interleaved_reads @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.TestMockOpen.test_mock_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.TestMockOpen.test_mock_open_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.TestMockOpen.test_mock_open_context_manager_multiple_times @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.TestMockOpen.test_mock_open_read_with_argument @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.TestMockOpen.test_next_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.TestMockOpen.test_overriding_return_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.TestMockOpen.test_read_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.TestMockOpen.test_read_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.TestMockOpen.test_readline_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.TestMockOpen.test_readline_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.TestMockOpen.test_readlines_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.TestMockOpen.test_readlines_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.WithTest.testContextManagerMocking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.WithTest.test_context_manager_with_magic_mock @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.WithTest.test_dict_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.WithTest.test_double_patch_instance_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.WithTest.test_patch_object_with_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.WithTest.test_with_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.WithTest.test_with_statement_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.WithTest.test_with_statement_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.WithTest.test_with_statement_imbricated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.WithTest.test_with_statement_nested @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.WithTest.test_with_statement_same_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +unittest.test.testmock.testwith.WithTest.test_with_statement_specified @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_univnewlines.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_univnewlines.txt index ad92540b7f..aa7a568fb5 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_univnewlines.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_univnewlines.txt @@ -1,34 +1,34 @@ -*graalpython.lib-python.3.test.test_univnewlines.CTestCRLFNewlines.test_read -*graalpython.lib-python.3.test.test_univnewlines.CTestCRLFNewlines.test_readline -*graalpython.lib-python.3.test.test_univnewlines.CTestCRLFNewlines.test_readlines -*graalpython.lib-python.3.test.test_univnewlines.CTestCRLFNewlines.test_seek -*graalpython.lib-python.3.test.test_univnewlines.CTestCRLFNewlines.test_tell -*graalpython.lib-python.3.test.test_univnewlines.CTestCRNewlines.test_read -*graalpython.lib-python.3.test.test_univnewlines.CTestCRNewlines.test_readline -*graalpython.lib-python.3.test.test_univnewlines.CTestCRNewlines.test_readlines -*graalpython.lib-python.3.test.test_univnewlines.CTestCRNewlines.test_seek -*graalpython.lib-python.3.test.test_univnewlines.CTestLFNewlines.test_read -*graalpython.lib-python.3.test.test_univnewlines.CTestLFNewlines.test_readline -*graalpython.lib-python.3.test.test_univnewlines.CTestLFNewlines.test_readlines -*graalpython.lib-python.3.test.test_univnewlines.CTestLFNewlines.test_seek -*graalpython.lib-python.3.test.test_univnewlines.CTestMixedNewlines.test_read -*graalpython.lib-python.3.test.test_univnewlines.CTestMixedNewlines.test_readline -*graalpython.lib-python.3.test.test_univnewlines.CTestMixedNewlines.test_readlines -*graalpython.lib-python.3.test.test_univnewlines.CTestMixedNewlines.test_seek -*graalpython.lib-python.3.test.test_univnewlines.PyTestCRLFNewlines.test_read -*graalpython.lib-python.3.test.test_univnewlines.PyTestCRLFNewlines.test_readline -*graalpython.lib-python.3.test.test_univnewlines.PyTestCRLFNewlines.test_readlines -*graalpython.lib-python.3.test.test_univnewlines.PyTestCRLFNewlines.test_seek -*graalpython.lib-python.3.test.test_univnewlines.PyTestCRLFNewlines.test_tell -*graalpython.lib-python.3.test.test_univnewlines.PyTestCRNewlines.test_read -*graalpython.lib-python.3.test.test_univnewlines.PyTestCRNewlines.test_readline -*graalpython.lib-python.3.test.test_univnewlines.PyTestCRNewlines.test_readlines -*graalpython.lib-python.3.test.test_univnewlines.PyTestCRNewlines.test_seek -*graalpython.lib-python.3.test.test_univnewlines.PyTestLFNewlines.test_read -*graalpython.lib-python.3.test.test_univnewlines.PyTestLFNewlines.test_readline -*graalpython.lib-python.3.test.test_univnewlines.PyTestLFNewlines.test_readlines -*graalpython.lib-python.3.test.test_univnewlines.PyTestLFNewlines.test_seek -*graalpython.lib-python.3.test.test_univnewlines.PyTestMixedNewlines.test_read -*graalpython.lib-python.3.test.test_univnewlines.PyTestMixedNewlines.test_readline -*graalpython.lib-python.3.test.test_univnewlines.PyTestMixedNewlines.test_readlines -*graalpython.lib-python.3.test.test_univnewlines.PyTestMixedNewlines.test_seek +test.test_univnewlines.CTestCRLFNewlines.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.CTestCRLFNewlines.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.CTestCRLFNewlines.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.CTestCRLFNewlines.test_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.CTestCRLFNewlines.test_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.CTestCRNewlines.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.CTestCRNewlines.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.CTestCRNewlines.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.CTestCRNewlines.test_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.CTestLFNewlines.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.CTestLFNewlines.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.CTestLFNewlines.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.CTestLFNewlines.test_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.CTestMixedNewlines.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.CTestMixedNewlines.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.CTestMixedNewlines.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.CTestMixedNewlines.test_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.PyTestCRLFNewlines.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.PyTestCRLFNewlines.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.PyTestCRLFNewlines.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.PyTestCRLFNewlines.test_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.PyTestCRLFNewlines.test_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.PyTestCRNewlines.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.PyTestCRNewlines.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.PyTestCRNewlines.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.PyTestCRNewlines.test_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.PyTestLFNewlines.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.PyTestLFNewlines.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.PyTestLFNewlines.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.PyTestLFNewlines.test_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.PyTestMixedNewlines.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.PyTestMixedNewlines.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.PyTestMixedNewlines.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_univnewlines.PyTestMixedNewlines.test_seek @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unpack.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unpack.txt index 1ca41fa2b3..710cfd8c85 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unpack.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unpack.txt @@ -1,2 +1,2 @@ -*graalpython.lib-python.3.test.test_unpack.TestCornerCases.test_extended_oparg_not_ignored -*graalpython.lib-python.3.test.test_unpack.TestMain.test_main +DocTestCase.test.test_unpack.__test__.doctests @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unpack.TestCornerCases.test_extended_oparg_not_ignored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unparse.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unparse.txt index f755c7441d..40de6fc96a 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unparse.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unparse.txt @@ -1,58 +1,57 @@ -*graalpython.lib-python.3.test.test_unparse.CosmeticTestCase.test_class_bases_and_keywords -*graalpython.lib-python.3.test.test_unparse.CosmeticTestCase.test_docstrings_negative_cases -*graalpython.lib-python.3.test.test_unparse.CosmeticTestCase.test_fstrings -*graalpython.lib-python.3.test.test_unparse.CosmeticTestCase.test_lambda_parameters -*graalpython.lib-python.3.test.test_unparse.CosmeticTestCase.test_multiquote_joined_string -*graalpython.lib-python.3.test.test_unparse.CosmeticTestCase.test_simple_expressions_parens -*graalpython.lib-python.3.test.test_unparse.CosmeticTestCase.test_slices -*graalpython.lib-python.3.test.test_unparse.CosmeticTestCase.test_star_expr_assign_target -*graalpython.lib-python.3.test.test_unparse.CosmeticTestCase.test_star_expr_assign_target_multiple -*graalpython.lib-python.3.test.test_unparse.CosmeticTestCase.test_unary_op_factor -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_annotations -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_bytes -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_chained_comparisons -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_class_decorators -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_class_definition -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_del_statement -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_dict_comprehension -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_dict_unpacking_in_dict -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_docstrings -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_elifs -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_empty_set -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_for_else -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_fstrings -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_fstrings_complicated -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_fstrings_special_chars -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_function_arguments -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_function_type -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_huge_float -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_imaginary_literals -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_import_from_level_none -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_integer_parens -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_invalid_fstring_backslash -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_invalid_fstring_constant -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_invalid_fstring_conversion -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_invalid_fstring_value -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_invalid_raise -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_invalid_yield_from -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_lambda_parentheses -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_min_int -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_nan -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_nonlocal -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_raise_from -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_relative_import -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_set_comprehension -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_set_literal -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_shifts -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_slices -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_starred_assignment -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_strings -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_try_except_finally -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_try_except_star_finally -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_type_comments -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_type_ignore -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_unary_parens -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_while_else -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_with_as -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_with_simple -*graalpython.lib-python.3.test.test_unparse.UnparseTestCase.test_with_two_items +test.test_unparse.CosmeticTestCase.test_class_bases_and_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.CosmeticTestCase.test_docstrings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.CosmeticTestCase.test_docstrings_negative_cases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.CosmeticTestCase.test_fstrings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.CosmeticTestCase.test_lambda_parameters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.CosmeticTestCase.test_multiquote_joined_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.CosmeticTestCase.test_simple_expressions_parens @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.CosmeticTestCase.test_slices @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.CosmeticTestCase.test_star_expr_assign_target @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.CosmeticTestCase.test_star_expr_assign_target_multiple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.CosmeticTestCase.test_unary_op_factor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_annotations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_chained_comparisons @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_class_decorators @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_class_definition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_del_statement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_dict_comprehension @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_dict_unpacking_in_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_docstrings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_elifs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_empty_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_for_else @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_fstrings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_fstrings_complicated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_fstrings_special_chars @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_function_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_function_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_huge_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_imaginary_literals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_import_from_level_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_integer_parens @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_invalid_fstring_backslash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_invalid_fstring_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_invalid_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_invalid_yield_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_lambda_parentheses @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_min_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_nan @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_nonlocal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_raise_from @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_relative_import @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_set_comprehension @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_set_literal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_shifts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_slices @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_starred_assignment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_strings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_try_except_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_try_except_star_finally @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_type_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_type_ignore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_unary_parens @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_while_else @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_with_as @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_with_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_unparse.UnparseTestCase.test_with_two_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib.txt index 5fa1d262ec..6e34ead432 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib.txt @@ -1,103 +1,103 @@ -*graalpython.lib-python.3.test.test_urllib.PathName2URLTests.test_converting_drive_letter -*graalpython.lib-python.3.test.test_urllib.PathName2URLTests.test_converting_when_no_drive_letter -*graalpython.lib-python.3.test.test_urllib.PathName2URLTests.test_long_drive_letter -*graalpython.lib-python.3.test.test_urllib.PathName2URLTests.test_roundtrip_pathname2url -*graalpython.lib-python.3.test.test_urllib.PathName2URLTests.test_simple_compare -*graalpython.lib-python.3.test.test_urllib.Pathname_Tests.test_basic -*graalpython.lib-python.3.test.test_urllib.Pathname_Tests.test_ntpath -*graalpython.lib-python.3.test.test_urllib.Pathname_Tests.test_prefixes -*graalpython.lib-python.3.test.test_urllib.Pathname_Tests.test_quoting -*graalpython.lib-python.3.test.test_urllib.ProxyTests.test_getproxies_environment_keep_no_proxies -*graalpython.lib-python.3.test.test_urllib.ProxyTests.test_proxy_bypass_environment_always_match -*graalpython.lib-python.3.test.test_urllib.ProxyTests.test_proxy_bypass_environment_host_match -*graalpython.lib-python.3.test.test_urllib.ProxyTests.test_proxy_bypass_environment_newline -*graalpython.lib-python.3.test.test_urllib.ProxyTests.test_proxy_cgi_ignore -*graalpython.lib-python.3.test.test_urllib.ProxyTests_withOrderedEnv.test_getproxies_environment_prefer_lowercase -*graalpython.lib-python.3.test.test_urllib.QuotingTests.test_default_quoting -*graalpython.lib-python.3.test.test_urllib.QuotingTests.test_default_safe -*graalpython.lib-python.3.test.test_urllib.QuotingTests.test_never_quote -*graalpython.lib-python.3.test.test_urllib.QuotingTests.test_quote_bytes -*graalpython.lib-python.3.test.test_urllib.QuotingTests.test_quote_plus_with_unicode -*graalpython.lib-python.3.test.test_urllib.QuotingTests.test_quote_with_unicode -*graalpython.lib-python.3.test.test_urllib.QuotingTests.test_quoting_plus -*graalpython.lib-python.3.test.test_urllib.QuotingTests.test_quoting_space -*graalpython.lib-python.3.test.test_urllib.QuotingTests.test_safe -*graalpython.lib-python.3.test.test_urllib.RequestTests.test_default_values -*graalpython.lib-python.3.test.test_urllib.RequestTests.test_with_method_arg -*graalpython.lib-python.3.test.test_urllib.URL2PathNameTests.test_converting_drive_letter -*graalpython.lib-python.3.test.test_urllib.URL2PathNameTests.test_converting_when_no_drive_letter -*graalpython.lib-python.3.test.test_urllib.URL2PathNameTests.test_non_ascii_drive_letter -*graalpython.lib-python.3.test.test_urllib.URL2PathNameTests.test_roundtrip_url2pathname -*graalpython.lib-python.3.test.test_urllib.URL2PathNameTests.test_simple_compare -*graalpython.lib-python.3.test.test_urllib.URLopener_Tests.test_local_file_open -*graalpython.lib-python.3.test.test_urllib.URLopener_Tests.test_quoted_open -*graalpython.lib-python.3.test.test_urllib.URLopener_Tests.test_urlopener_retrieve_file -*graalpython.lib-python.3.test.test_urllib.URLopener_Tests.test_urlopener_retrieve_remote -*graalpython.lib-python.3.test.test_urllib.UnquotingTests.test_unquote_to_bytes -*graalpython.lib-python.3.test.test_urllib.UnquotingTests.test_unquote_with_unicode -*graalpython.lib-python.3.test.test_urllib.UnquotingTests.test_unquoting -*graalpython.lib-python.3.test.test_urllib.UnquotingTests.test_unquoting_badpercent -*graalpython.lib-python.3.test.test_urllib.UnquotingTests.test_unquoting_mixed_case -*graalpython.lib-python.3.test.test_urllib.UnquotingTests.test_unquoting_parts -*graalpython.lib-python.3.test.test_urllib.UnquotingTests.test_unquoting_plus -*graalpython.lib-python.3.test.test_urllib.UnquotingTests.test_unquoting_with_bytes_input -*graalpython.lib-python.3.test.test_urllib.Utility_Tests.test_thishost -*graalpython.lib-python.3.test.test_urllib.urlencode_Tests.test_doseq -*graalpython.lib-python.3.test.test_urllib.urlencode_Tests.test_empty_sequence -*graalpython.lib-python.3.test.test_urllib.urlencode_Tests.test_nonstring_seq_values -*graalpython.lib-python.3.test.test_urllib.urlencode_Tests.test_nonstring_values -*graalpython.lib-python.3.test.test_urllib.urlencode_Tests.test_quoting -*graalpython.lib-python.3.test.test_urllib.urlencode_Tests.test_urlencode_bytes -*graalpython.lib-python.3.test.test_urllib.urlencode_Tests.test_urlencode_encoding -*graalpython.lib-python.3.test.test_urllib.urlencode_Tests.test_urlencode_encoding_doseq -*graalpython.lib-python.3.test.test_urllib.urlencode_Tests.test_urlencode_encoding_safe_parameter -*graalpython.lib-python.3.test.test_urllib.urlencode_Tests.test_using_mapping -*graalpython.lib-python.3.test.test_urllib.urlencode_Tests.test_using_sequence -*graalpython.lib-python.3.test.test_urllib.urlopen_DataTests.test_geturl -*graalpython.lib-python.3.test.test_urllib.urlopen_DataTests.test_info -*graalpython.lib-python.3.test.test_urllib.urlopen_DataTests.test_interface -*graalpython.lib-python.3.test.test_urllib.urlopen_DataTests.test_invalid_base64_data -*graalpython.lib-python.3.test.test_urllib.urlopen_DataTests.test_missing_comma -*graalpython.lib-python.3.test.test_urllib.urlopen_DataTests.test_read_image -*graalpython.lib-python.3.test.test_urllib.urlopen_DataTests.test_read_text -*graalpython.lib-python.3.test.test_urllib.urlopen_DataTests.test_read_text_base64 -*graalpython.lib-python.3.test.test_urllib.urlopen_FileTests.test_close -*graalpython.lib-python.3.test.test_urllib.urlopen_FileTests.test_fileno -*graalpython.lib-python.3.test.test_urllib.urlopen_FileTests.test_getcode -*graalpython.lib-python.3.test.test_urllib.urlopen_FileTests.test_geturl -*graalpython.lib-python.3.test.test_urllib.urlopen_FileTests.test_headers -*graalpython.lib-python.3.test.test_urllib.urlopen_FileTests.test_info -*graalpython.lib-python.3.test.test_urllib.urlopen_FileTests.test_interface -*graalpython.lib-python.3.test.test_urllib.urlopen_FileTests.test_iter -*graalpython.lib-python.3.test.test_urllib.urlopen_FileTests.test_read -*graalpython.lib-python.3.test.test_urllib.urlopen_FileTests.test_readline -*graalpython.lib-python.3.test.test_urllib.urlopen_FileTests.test_readlines -*graalpython.lib-python.3.test.test_urllib.urlopen_FileTests.test_relativelocalfile -*graalpython.lib-python.3.test.test_urllib.urlopen_FileTests.test_status -*graalpython.lib-python.3.test.test_urllib.urlopen_FileTests.test_url -*graalpython.lib-python.3.test.test_urllib.urlopen_HttpTests.test_URLopener_deprecation -*graalpython.lib-python.3.test.test_urllib.urlopen_HttpTests.test_cafile_and_context -*graalpython.lib-python.3.test.test_urllib.urlopen_HttpTests.test_empty_socket -*graalpython.lib-python.3.test.test_urllib.urlopen_HttpTests.test_file_notexists -*graalpython.lib-python.3.test.test_urllib.urlopen_HttpTests.test_ftp_cache_pruning -*graalpython.lib-python.3.test.test_urllib.urlopen_HttpTests.test_invalid_redirect -*graalpython.lib-python.3.test.test_urllib.urlopen_HttpTests.test_missing_localfile -*graalpython.lib-python.3.test.test_urllib.urlopen_HttpTests.test_read_0_9 -*graalpython.lib-python.3.test.test_urllib.urlopen_HttpTests.test_read_1_0 -*graalpython.lib-python.3.test.test_urllib.urlopen_HttpTests.test_read_1_1 -*graalpython.lib-python.3.test.test_urllib.urlopen_HttpTests.test_read_bogus -*graalpython.lib-python.3.test.test_urllib.urlopen_HttpTests.test_redirect_limit_independent -*graalpython.lib-python.3.test.test_urllib.urlopen_HttpTests.test_url_fragment -*graalpython.lib-python.3.test.test_urllib.urlopen_HttpTests.test_url_path_with_control_char_rejected -*graalpython.lib-python.3.test.test_urllib.urlopen_HttpTests.test_url_path_with_newline_header_injection_rejected -*graalpython.lib-python.3.test.test_urllib.urlopen_HttpTests.test_userpass_inurl -*graalpython.lib-python.3.test.test_urllib.urlopen_HttpTests.test_userpass_inurl_w_spaces -*graalpython.lib-python.3.test.test_urllib.urlopen_HttpTests.test_willclose -*graalpython.lib-python.3.test.test_urllib.urlretrieve_FileTests.test_basic -*graalpython.lib-python.3.test.test_urllib.urlretrieve_FileTests.test_copy -*graalpython.lib-python.3.test.test_urllib.urlretrieve_FileTests.test_reporthook -*graalpython.lib-python.3.test.test_urllib.urlretrieve_FileTests.test_reporthook_0_bytes -*graalpython.lib-python.3.test.test_urllib.urlretrieve_FileTests.test_reporthook_5_bytes -*graalpython.lib-python.3.test.test_urllib.urlretrieve_FileTests.test_reporthook_8193_bytes -*graalpython.lib-python.3.test.test_urllib.urlretrieve_HttpTests.test_short_content_raises_ContentTooShortError -*graalpython.lib-python.3.test.test_urllib.urlretrieve_HttpTests.test_short_content_raises_ContentTooShortError_without_reporthook +test.test_urllib.PathName2URLTests.test_converting_drive_letter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.PathName2URLTests.test_converting_when_no_drive_letter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.PathName2URLTests.test_long_drive_letter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.PathName2URLTests.test_roundtrip_pathname2url @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.PathName2URLTests.test_simple_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.Pathname_Tests.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.Pathname_Tests.test_ntpath @ win32-AMD64 +test.test_urllib.Pathname_Tests.test_prefixes @ win32-AMD64 +test.test_urllib.Pathname_Tests.test_quoting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.ProxyTests.test_getproxies_environment_keep_no_proxies @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.ProxyTests.test_proxy_bypass_environment_always_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.ProxyTests.test_proxy_bypass_environment_host_match @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.ProxyTests.test_proxy_bypass_environment_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.ProxyTests.test_proxy_cgi_ignore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.ProxyTests_withOrderedEnv.test_getproxies_environment_prefer_lowercase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.QuotingTests.test_default_quoting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.QuotingTests.test_default_safe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.QuotingTests.test_never_quote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.QuotingTests.test_quote_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.QuotingTests.test_quote_plus_with_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.QuotingTests.test_quote_with_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.QuotingTests.test_quoting_plus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.QuotingTests.test_quoting_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.QuotingTests.test_safe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.RequestTests.test_default_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.RequestTests.test_with_method_arg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.URL2PathNameTests.test_converting_drive_letter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.URL2PathNameTests.test_converting_when_no_drive_letter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.URL2PathNameTests.test_non_ascii_drive_letter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.URL2PathNameTests.test_roundtrip_url2pathname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.URL2PathNameTests.test_simple_compare @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.URLopener_Tests.test_local_file_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.URLopener_Tests.test_quoted_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.URLopener_Tests.test_urlopener_retrieve_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.URLopener_Tests.test_urlopener_retrieve_remote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.UnquotingTests.test_unquote_to_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.UnquotingTests.test_unquote_with_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.UnquotingTests.test_unquoting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.UnquotingTests.test_unquoting_badpercent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.UnquotingTests.test_unquoting_mixed_case @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.UnquotingTests.test_unquoting_parts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.UnquotingTests.test_unquoting_plus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.UnquotingTests.test_unquoting_with_bytes_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.Utility_Tests.test_thishost @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlencode_Tests.test_doseq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlencode_Tests.test_empty_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlencode_Tests.test_nonstring_seq_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlencode_Tests.test_nonstring_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlencode_Tests.test_quoting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlencode_Tests.test_urlencode_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlencode_Tests.test_urlencode_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlencode_Tests.test_urlencode_encoding_doseq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlencode_Tests.test_urlencode_encoding_safe_parameter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlencode_Tests.test_using_mapping @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlencode_Tests.test_using_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_DataTests.test_geturl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_DataTests.test_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_DataTests.test_interface @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_DataTests.test_invalid_base64_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_DataTests.test_missing_comma @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_DataTests.test_read_image @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_DataTests.test_read_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_DataTests.test_read_text_base64 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_FileTests.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_FileTests.test_fileno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_FileTests.test_getcode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_FileTests.test_geturl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_FileTests.test_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_FileTests.test_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_FileTests.test_interface @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_FileTests.test_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_FileTests.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_FileTests.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_FileTests.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_FileTests.test_relativelocalfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_FileTests.test_status @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_FileTests.test_url @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_HttpTests.test_URLopener_deprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_HttpTests.test_cafile_and_context @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_HttpTests.test_empty_socket @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_HttpTests.test_file_notexists @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_HttpTests.test_ftp_cache_pruning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_HttpTests.test_invalid_redirect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_HttpTests.test_missing_localfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_HttpTests.test_read_0_9 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_HttpTests.test_read_1_0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_HttpTests.test_read_1_1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_HttpTests.test_read_bogus @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_HttpTests.test_redirect_limit_independent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_HttpTests.test_url_fragment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_HttpTests.test_url_path_with_control_char_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_HttpTests.test_url_path_with_newline_header_injection_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_HttpTests.test_userpass_inurl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_HttpTests.test_userpass_inurl_w_spaces @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlopen_HttpTests.test_willclose @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlretrieve_FileTests.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlretrieve_FileTests.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlretrieve_FileTests.test_reporthook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlretrieve_FileTests.test_reporthook_0_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlretrieve_FileTests.test_reporthook_5_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlretrieve_FileTests.test_reporthook_8193_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlretrieve_HttpTests.test_short_content_raises_ContentTooShortError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib.urlretrieve_HttpTests.test_short_content_raises_ContentTooShortError_without_reporthook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib2.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib2.txt index 687437c0bc..4215cf1e48 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib2.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib2.txt @@ -1,72 +1,69 @@ -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_basic_and_digest_auth_handlers -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_basic_auth -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_basic_auth_with_single_quoted_realm -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_basic_auth_with_unquoted_realm -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_basic_prior_auth_auto_send -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_basic_prior_auth_send_after_first_success -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_cookie_redirect -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_cookies -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_errors -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_file -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_fixpath_in_weirdurls -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_ftp -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_full_url_deleter -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_full_url_setter -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_http -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_http_body_array -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_http_body_empty_seq -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_http_body_file -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_http_body_fileobj -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_http_body_iterable -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_http_body_pipe -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_http_closed -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_http_doubleslash -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_http_handler_debuglevel -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_invalid_closed -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_invalid_redirect -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_osx_proxy_bypass -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_proxy -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_proxy_basic_auth -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_proxy_https -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_proxy_https_proxy_authorization -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_proxy_no_proxy -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_proxy_no_proxy_all -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_redirect -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_redirect_fragment -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_relative_redirect -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_unsupported_auth_basic_handler -*graalpython.lib-python.3.test.test_urllib2.HandlerTests.test_unsupported_auth_digest_handler -*graalpython.lib-python.3.test.test_urllib2.MiscTests.test_HTTPError_interface -*graalpython.lib-python.3.test.test_urllib2.MiscTests.test_build_opener -*graalpython.lib-python.3.test.test_urllib2.MiscTests.test_gh_98778 -*graalpython.lib-python.3.test.test_urllib2.MiscTests.test_issue16464 -*graalpython.lib-python.3.test.test_urllib2.MiscTests.test_parse_proxy -*graalpython.lib-python.3.test.test_urllib2.MiscTests.test_unsupported_algorithm -*graalpython.lib-python.3.test.test_urllib2.OpenerDirectorTests.test_add_non_handler -*graalpython.lib-python.3.test.test_urllib2.OpenerDirectorTests.test_badly_named_methods -*graalpython.lib-python.3.test.test_urllib2.OpenerDirectorTests.test_handled -*graalpython.lib-python.3.test.test_urllib2.OpenerDirectorTests.test_handler_order -*graalpython.lib-python.3.test.test_urllib2.OpenerDirectorTests.test_http_error -*graalpython.lib-python.3.test.test_urllib2.OpenerDirectorTests.test_processors -*graalpython.lib-python.3.test.test_urllib2.OpenerDirectorTests.test_raise -*graalpython.lib-python.3.test.test_urllib2.RequestHdrsTests.test_password_manager -*graalpython.lib-python.3.test.test_urllib2.RequestHdrsTests.test_password_manager_default_port -*graalpython.lib-python.3.test.test_urllib2.RequestHdrsTests.test_request_headers_dict -*graalpython.lib-python.3.test.test_urllib2.RequestHdrsTests.test_request_headers_methods -*graalpython.lib-python.3.test.test_urllib2.RequestTests.test_data -*graalpython.lib-python.3.test.test_urllib2.RequestTests.test_deleting_data_should_remove_content_length -*graalpython.lib-python.3.test.test_urllib2.RequestTests.test_get_full_url -*graalpython.lib-python.3.test.test_urllib2.RequestTests.test_get_host -*graalpython.lib-python.3.test.test_urllib2.RequestTests.test_get_host_unquote -*graalpython.lib-python.3.test.test_urllib2.RequestTests.test_get_type -*graalpython.lib-python.3.test.test_urllib2.RequestTests.test_method -*graalpython.lib-python.3.test.test_urllib2.RequestTests.test_proxy -*graalpython.lib-python.3.test.test_urllib2.RequestTests.test_selector -*graalpython.lib-python.3.test.test_urllib2.RequestTests.test_setting_data_should_remove_content_length -*graalpython.lib-python.3.test.test_urllib2.RequestTests.test_url_fragment -*graalpython.lib-python.3.test.test_urllib2.RequestTests.test_url_fullurl_get_full_url -*graalpython.lib-python.3.test.test_urllib2.RequestTests.test_wrapped_url -*graalpython.lib-python.3.test.test_urllib2.TrivialTests.test_URLError_reasonstr -*graalpython.lib-python.3.test.test_urllib2.TrivialTests.test___all__ -*graalpython.lib-python.3.test.test_urllib2.TrivialTests.test_parse_http_list -*graalpython.lib-python.3.test.test_urllib2.TrivialTests.test_trivial +test.test_urllib2.HandlerTests.test_basic_and_digest_auth_handlers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_basic_auth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_basic_prior_auth_auto_send @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_basic_prior_auth_send_after_first_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_cookie_redirect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_cookies @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_fixpath_in_weirdurls @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_ftp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_full_url_deleter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_full_url_setter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_http @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_http_body_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_http_body_empty_seq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_http_body_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_http_body_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_http_body_iterable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_http_body_pipe @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_http_closed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_http_doubleslash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_http_handler_debuglevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_invalid_closed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_invalid_redirect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_osx_proxy_bypass @ darwin-arm64,darwin-x86_64 +test.test_urllib2.HandlerTests.test_proxy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_proxy_basic_auth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_proxy_https @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_proxy_https_proxy_authorization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_proxy_no_proxy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_proxy_no_proxy_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_redirect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_redirect_fragment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_relative_redirect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_unsupported_auth_basic_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.HandlerTests.test_unsupported_auth_digest_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.MiscTests.test_HTTPError_interface @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.MiscTests.test_build_opener @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.MiscTests.test_gh_98778 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.MiscTests.test_parse_proxy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.MiscTests.test_unsupported_algorithm @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.OpenerDirectorTests.test_add_non_handler @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.OpenerDirectorTests.test_badly_named_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.OpenerDirectorTests.test_handled @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.OpenerDirectorTests.test_handler_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.OpenerDirectorTests.test_http_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.OpenerDirectorTests.test_processors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.OpenerDirectorTests.test_raise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.RequestHdrsTests.test_password_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.RequestHdrsTests.test_password_manager_default_port @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.RequestHdrsTests.test_request_headers_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.RequestHdrsTests.test_request_headers_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.RequestTests.test_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.RequestTests.test_deleting_data_should_remove_content_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.RequestTests.test_get_full_url @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.RequestTests.test_get_host @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.RequestTests.test_get_host_unquote @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.RequestTests.test_get_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.RequestTests.test_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.RequestTests.test_proxy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.RequestTests.test_selector @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.RequestTests.test_setting_data_should_remove_content_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.RequestTests.test_url_fragment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.RequestTests.test_url_fullurl_get_full_url @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.RequestTests.test_wrapped_url @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.TrivialTests.test_URLError_reasonstr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.TrivialTests.test___all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.TrivialTests.test_parse_http_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2.TrivialTests.test_trivial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib2_localnet.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib2_localnet.txt index f620bc14e9..a14b6252b4 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib2_localnet.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib2_localnet.txt @@ -1,22 +1,22 @@ -*graalpython.lib-python.3.test.test_urllib2_localnet.BasicAuthTests.test_basic_auth_httperror -*graalpython.lib-python.3.test.test_urllib2_localnet.BasicAuthTests.test_basic_auth_success -*graalpython.lib-python.3.test.test_urllib2_localnet.ProxyAuthTests.test_proxy_qop_auth_int_works_or_throws_urlerror -*graalpython.lib-python.3.test.test_urllib2_localnet.ProxyAuthTests.test_proxy_qop_auth_works -*graalpython.lib-python.3.test.test_urllib2_localnet.ProxyAuthTests.test_proxy_with_bad_password_raises_httperror -*graalpython.lib-python.3.test.test_urllib2_localnet.ProxyAuthTests.test_proxy_with_no_password_raises_httperror -*graalpython.lib-python.3.test.test_urllib2_localnet.TestUrlopen.test_200 -*graalpython.lib-python.3.test.test_urllib2_localnet.TestUrlopen.test_200_with_parameters -*graalpython.lib-python.3.test.test_urllib2_localnet.TestUrlopen.test_404 -*graalpython.lib-python.3.test.test_urllib2_localnet.TestUrlopen.test_basic -*graalpython.lib-python.3.test.test_urllib2_localnet.TestUrlopen.test_chunked -*graalpython.lib-python.3.test.test_urllib2_localnet.TestUrlopen.test_geturl -*graalpython.lib-python.3.test.test_urllib2_localnet.TestUrlopen.test_https -*graalpython.lib-python.3.test.test_urllib2_localnet.TestUrlopen.test_https_with_cadefault -*graalpython.lib-python.3.test.test_urllib2_localnet.TestUrlopen.test_https_with_cafile -*graalpython.lib-python.3.test.test_urllib2_localnet.TestUrlopen.test_info -*graalpython.lib-python.3.test.test_urllib2_localnet.TestUrlopen.test_issue16464 -*graalpython.lib-python.3.test.test_urllib2_localnet.TestUrlopen.test_iteration -*graalpython.lib-python.3.test.test_urllib2_localnet.TestUrlopen.test_line_iteration -*graalpython.lib-python.3.test.test_urllib2_localnet.TestUrlopen.test_redirection -*graalpython.lib-python.3.test.test_urllib2_localnet.TestUrlopen.test_sending_headers -*graalpython.lib-python.3.test.test_urllib2_localnet.TestUrlopen.test_sending_headers_camel +test.test_urllib2_localnet.BasicAuthTests.test_basic_auth_httperror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.BasicAuthTests.test_basic_auth_success @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.ProxyAuthTests.test_proxy_qop_auth_int_works_or_throws_urlerror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2_localnet.ProxyAuthTests.test_proxy_qop_auth_works @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.ProxyAuthTests.test_proxy_with_bad_password_raises_httperror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.ProxyAuthTests.test_proxy_with_no_password_raises_httperror @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_200 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_200_with_parameters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_404 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_chunked @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_geturl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_https @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_https_with_cadefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_https_with_cafile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_issue16464 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_line_iteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_redirection @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_sending_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_sending_headers_camel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib2net.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib2net.txt index 07d5308297..85b7d7a76d 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib2net.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib2net.txt @@ -1,10 +1,11 @@ -*graalpython.lib-python.3.test.test_urllib2net.CloseSocketTest.test_close -*graalpython.lib-python.3.test.test_urllib2net.OtherNetworkTests.test_custom_headers -*graalpython.lib-python.3.test.test_urllib2net.OtherNetworkTests.test_file -*graalpython.lib-python.3.test.test_urllib2net.OtherNetworkTests.test_redirect_url_withfrag -*graalpython.lib-python.3.test.test_urllib2net.OtherNetworkTests.test_sites_no_connection_close -*graalpython.lib-python.3.test.test_urllib2net.OtherNetworkTests.test_urlwithfrag -*graalpython.lib-python.3.test.test_urllib2net.TimeoutTest.test_http_basic -*graalpython.lib-python.3.test.test_urllib2net.TimeoutTest.test_http_default_timeout -*graalpython.lib-python.3.test.test_urllib2net.TimeoutTest.test_http_no_timeout -*graalpython.lib-python.3.test.test_urllib2net.TimeoutTest.test_http_timeout +test.test_urllib2net.CloseSocketTest.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2net.OtherNetworkTests.test_custom_headers @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2net.OtherNetworkTests.test_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Connecting to external page that sometimes times out +!test.test_urllib2net.OtherNetworkTests.test_ftp @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_urllib2net.OtherNetworkTests.test_redirect_url_withfrag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2net.OtherNetworkTests.test_urlwithfrag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2net.TimeoutTest.test_http_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2net.TimeoutTest.test_http_default_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2net.TimeoutTest.test_http_no_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib2net.TimeoutTest.test_http_timeout @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib_response.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib_response.txt index 91f1107239..319ea2bb86 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib_response.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllib_response.txt @@ -1,4 +1,4 @@ -*graalpython.lib-python.3.test.test_urllib_response.TestResponse.test_addclosehook -*graalpython.lib-python.3.test.test_urllib_response.TestResponse.test_addinfo -*graalpython.lib-python.3.test.test_urllib_response.TestResponse.test_addinfourl -*graalpython.lib-python.3.test.test_urllib_response.TestResponse.test_with +test.test_urllib_response.TestResponse.test_addclosehook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib_response.TestResponse.test_addinfo @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib_response.TestResponse.test_addinfourl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllib_response.TestResponse.test_with @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllibnet.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllibnet.txt index 0fd8ee7f9b..95356bd971 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllibnet.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urllibnet.txt @@ -1,12 +1,12 @@ -*graalpython.lib-python.3.test.test_urllibnet.URLTimeoutTest.testURLread -*graalpython.lib-python.3.test.test_urllibnet.urlopenNetworkTests.test_bad_address -*graalpython.lib-python.3.test.test_urllibnet.urlopenNetworkTests.test_basic -*graalpython.lib-python.3.test.test_urllibnet.urlopenNetworkTests.test_getcode -*graalpython.lib-python.3.test.test_urllibnet.urlopenNetworkTests.test_geturl -*graalpython.lib-python.3.test.test_urllibnet.urlopenNetworkTests.test_info -*graalpython.lib-python.3.test.test_urllibnet.urlopenNetworkTests.test_readlines -*graalpython.lib-python.3.test.test_urllibnet.urlretrieveNetworkTests.test_basic -*graalpython.lib-python.3.test.test_urllibnet.urlretrieveNetworkTests.test_data_header -*graalpython.lib-python.3.test.test_urllibnet.urlretrieveNetworkTests.test_header -*graalpython.lib-python.3.test.test_urllibnet.urlretrieveNetworkTests.test_reporthook -*graalpython.lib-python.3.test.test_urllibnet.urlretrieveNetworkTests.test_specified_path +test.test_urllibnet.URLTimeoutTest.testURLread @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllibnet.urlopenNetworkTests.test_bad_address @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllibnet.urlopenNetworkTests.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllibnet.urlopenNetworkTests.test_getcode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllibnet.urlopenNetworkTests.test_geturl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllibnet.urlopenNetworkTests.test_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllibnet.urlopenNetworkTests.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllibnet.urlretrieveNetworkTests.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllibnet.urlretrieveNetworkTests.test_data_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllibnet.urlretrieveNetworkTests.test_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllibnet.urlretrieveNetworkTests.test_reporthook @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urllibnet.urlretrieveNetworkTests.test_specified_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urlparse.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urlparse.txt index 620ad635a8..65ad35bdd9 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urlparse.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_urlparse.txt @@ -1,71 +1,71 @@ -*graalpython.lib-python.3.test.test_urlparse.DeprecationTest.test_Quoter_deprecation -*graalpython.lib-python.3.test.test_urlparse.DeprecationTest.test_splitattr_deprecation -*graalpython.lib-python.3.test.test_urlparse.DeprecationTest.test_splithost_deprecation -*graalpython.lib-python.3.test.test_urlparse.DeprecationTest.test_splitnport_deprecation -*graalpython.lib-python.3.test.test_urlparse.DeprecationTest.test_splitpasswd_deprecation -*graalpython.lib-python.3.test.test_urlparse.DeprecationTest.test_splitport_deprecation -*graalpython.lib-python.3.test.test_urlparse.DeprecationTest.test_splitquery_deprecation -*graalpython.lib-python.3.test.test_urlparse.DeprecationTest.test_splittag_deprecation -*graalpython.lib-python.3.test.test_urlparse.DeprecationTest.test_splittype_deprecation -*graalpython.lib-python.3.test.test_urlparse.DeprecationTest.test_splituser_deprecation -*graalpython.lib-python.3.test.test_urlparse.DeprecationTest.test_splitvalue_deprecation -*graalpython.lib-python.3.test.test_urlparse.DeprecationTest.test_to_bytes_deprecation -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_Quoter_repr -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_RFC1808 -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_RFC2368 -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_RFC2396 -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_RFC2732 -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_RFC3986 -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_all -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_anyscheme -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_attributes_bad_port -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_attributes_bad_scheme -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_attributes_without_netloc -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_clear_cache_for_code_coverage -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_default_scheme -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_http_roundtrips -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_invalid_bracketed_hosts -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_issue14072 -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_mixed_types_rejected -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_noslash -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_parse_fragments -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_parse_qs_encoding -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_parse_qs_separator -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_parse_qsl_encoding -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_parse_qsl_max_num_fields -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_parse_qsl_separator -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_port_casting_failure_message -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_portseparator -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_qs -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_qsl -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_quote_errors -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_quote_from_bytes -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_result_pairs -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_roundtrips -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_splitting_bracketed_hosts -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_telurl_params -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_unparse_parse -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_unquote_to_bytes -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_urldefrag -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_urlencode_quote_via -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_urlencode_sequences -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_urljoins -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_urllib_parse_getattr_failure -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_urlsplit_attributes -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_urlsplit_remove_unsafe_bytes -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_urlsplit_scoped_IPv6 -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_urlsplit_strip_url -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_usingsys -*graalpython.lib-python.3.test.test_urlparse.UrlParseTestCase.test_withoutscheme -*graalpython.lib-python.3.test.test_urlparse.Utility_Tests.test_splitattr -*graalpython.lib-python.3.test.test_urlparse.Utility_Tests.test_splithost -*graalpython.lib-python.3.test.test_urlparse.Utility_Tests.test_splitnport -*graalpython.lib-python.3.test.test_urlparse.Utility_Tests.test_splitpasswd -*graalpython.lib-python.3.test.test_urlparse.Utility_Tests.test_splitport -*graalpython.lib-python.3.test.test_urlparse.Utility_Tests.test_splitquery -*graalpython.lib-python.3.test.test_urlparse.Utility_Tests.test_splittag -*graalpython.lib-python.3.test.test_urlparse.Utility_Tests.test_splittype -*graalpython.lib-python.3.test.test_urlparse.Utility_Tests.test_splituser -*graalpython.lib-python.3.test.test_urlparse.Utility_Tests.test_splitvalue -*graalpython.lib-python.3.test.test_urlparse.Utility_Tests.test_to_bytes -*graalpython.lib-python.3.test.test_urlparse.Utility_Tests.test_unwrap +test.test_urlparse.DeprecationTest.test_Quoter_deprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.DeprecationTest.test_splitattr_deprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.DeprecationTest.test_splithost_deprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.DeprecationTest.test_splitnport_deprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.DeprecationTest.test_splitpasswd_deprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.DeprecationTest.test_splitport_deprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.DeprecationTest.test_splitquery_deprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.DeprecationTest.test_splittag_deprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.DeprecationTest.test_splittype_deprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.DeprecationTest.test_splituser_deprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.DeprecationTest.test_splitvalue_deprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.DeprecationTest.test_to_bytes_deprecation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_Quoter_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_RFC1808 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_RFC2368 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_RFC2396 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_RFC2732 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_RFC3986 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_anyscheme @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_attributes_bad_port @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_attributes_bad_scheme @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_attributes_without_netloc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_clear_cache_for_code_coverage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_default_scheme @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_http_roundtrips @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_invalid_bracketed_hosts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_issue14072 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_mixed_types_rejected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_noslash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_parse_fragments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_parse_qs_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_parse_qs_separator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_parse_qsl_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_parse_qsl_max_num_fields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_parse_qsl_separator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_port_casting_failure_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_portseparator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_qs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_qsl @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_quote_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_quote_from_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_result_pairs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_roundtrips @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_splitting_bracketed_hosts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_telurl_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_unparse_parse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_unquote_to_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_urldefrag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_urlencode_quote_via @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_urlencode_sequences @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_urljoins @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_urllib_parse_getattr_failure @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_urlsplit_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_urlsplit_remove_unsafe_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_urlsplit_scoped_IPv6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_urlsplit_strip_url @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_usingsys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.UrlParseTestCase.test_withoutscheme @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.Utility_Tests.test_splitattr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.Utility_Tests.test_splithost @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.Utility_Tests.test_splitnport @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.Utility_Tests.test_splitpasswd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.Utility_Tests.test_splitport @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.Utility_Tests.test_splitquery @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.Utility_Tests.test_splittag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.Utility_Tests.test_splittype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.Utility_Tests.test_splituser @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.Utility_Tests.test_splitvalue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.Utility_Tests.test_to_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_urlparse.Utility_Tests.test_unwrap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_userdict.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_userdict.txt index 7f2fe1c96d..c6b9c69596 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_userdict.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_userdict.txt @@ -1,25 +1,25 @@ -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_all -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_bool -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_clear -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_constructor -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_contains -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_copy -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_eq -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_fromkeys -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_get -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_getitem -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_init -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_items -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_keys -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_len -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_missing -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_mutatingiteration -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_pop -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_popitem -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_read -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_repr -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_repr_deep -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_setdefault -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_update -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_values -*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_write +test.test_userdict.UserDictTest.test_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_fromkeys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_mutatingiteration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_repr_deep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userdict.UserDictTest.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_userlist.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_userlist.txt index 819542e5ba..8ec957dbc0 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_userlist.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_userlist.txt @@ -1,51 +1,48 @@ -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_add_specials -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_addmul -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_append -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_bigrepeat -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_clear -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_constructor_exception_handling -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_constructors -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_contains -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_contains_fake -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_contains_order -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_copy -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_count -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_delitem -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_delslice -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_exhausted_iterator -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_extend -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_extendedslicing -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_free_after_iterating -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_getitem -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_getitem_error -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_getitemoverwriteiter -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_getslice -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_iadd -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_imul -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_index -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_init -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_insert -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_len -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_minmax -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_mixedadd -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_mixedcmp -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_pickle -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_pop -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_print -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_radd_specials -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_remove -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_repeat -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_repr -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_repr_deep -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_reverse -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_reversed -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_set_subscript -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_setitem -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_setitem_error -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_setslice -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_slice -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_slice_type -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_sort -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_subscript -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_truth -*graalpython.lib-python.3.test.test_userlist.UserListTest.test_userlist_copy +test.test_userlist.UserListTest.test_add_specials @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_addmul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_constructor_exception_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_constructors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_contains @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_contains_fake @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_contains_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_delslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_exhausted_iterator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_extend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_extendedslicing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_getitem_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_getitemoverwriteiter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_iadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_imul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_minmax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_mixedadd @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_mixedcmp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_radd_specials @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_repeat @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_repr_deep @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_reverse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_reversed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_set_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_setitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_setitem_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_setslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_slice_type @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_sort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_truth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userlist.UserListTest.test_userlist_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_userstring.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_userstring.txt index a08e919c6d..1ab9a333a0 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_userstring.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_userstring.txt @@ -1,58 +1,55 @@ -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test___contains__ -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_additional_rsplit -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_additional_split -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_capitalize -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_capitalize_nonascii -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_center -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_count -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_encode_default_args -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_encode_explicit_none_args -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_endswith -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_expandtabs -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_extended_getslice -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_find -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_find_etc_raise_correct_error_messages -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_find_periodic_pattern -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_find_shift_table_overflow -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_fixtype -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_floatformatting -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_formatting -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_formatting_c_limits -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_hash -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_index -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_inplace_rewrites -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_isalnum -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_isalpha -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_isascii -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_isdigit -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_islower -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_isspace -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_istitle -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_isupper -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_join -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_ljust -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_lower -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_mul -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_none_arguments -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_partition -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_removeprefix -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_removesuffix -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_replace -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_replace_overflow -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_rfind -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_rindex -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_rjust -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_rmod -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_rpartition -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_rsplit -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_slice -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_split -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_splitlines -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_startswith -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_strip -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_strip_whitespace -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_subscript -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_swapcase -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_title -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_upper -*graalpython.lib-python.3.test.test_userstring.UserStringTest.test_zfill +test.test_userstring.UserStringTest.test___contains__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_additional_rsplit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_additional_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_capitalize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_center @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_count @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_encode_default_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_encode_explicit_none_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_endswith @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_expandtabs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_extended_getslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_find @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_find_etc_raise_correct_error_messages @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_find_periodic_pattern @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_find_shift_table_overflow @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_fixtype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_floatformatting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_formatting @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_inplace_rewrites @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_isalnum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_isalpha @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_isascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_isdigit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_islower @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_isspace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_istitle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_isupper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_join @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_ljust @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_lower @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_mul @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_none_arguments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_partition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_removeprefix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_removesuffix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_replace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_rfind @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_rindex @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_rjust @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_rmod @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_rpartition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_rsplit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_slice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_split @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_splitlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_startswith @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_strip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_strip_whitespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_subscript @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_swapcase @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_title @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_upper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_userstring.UserStringTest.test_zfill @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_utf8_mode.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_utf8_mode.txt index e0f04cf5f4..87bb151fc6 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_utf8_mode.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_utf8_mode.txt @@ -1,5 +1,5 @@ -*graalpython.lib-python.3.test.test_utf8_mode.UTF8ModeTests.test_device_encoding -*graalpython.lib-python.3.test.test_utf8_mode.UTF8ModeTests.test_filesystemencoding -*graalpython.lib-python.3.test.test_utf8_mode.UTF8ModeTests.test_io -*graalpython.lib-python.3.test.test_utf8_mode.UTF8ModeTests.test_io_encoding -*graalpython.lib-python.3.test.test_utf8_mode.UTF8ModeTests.test_pyio_encoding +test.test_utf8_mode.UTF8ModeTests.test_cmd_line @ darwin-arm64,darwin-x86_64 +test.test_utf8_mode.UTF8ModeTests.test_filesystemencoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_utf8_mode.UTF8ModeTests.test_io @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_utf8_mode.UTF8ModeTests.test_io_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_utf8_mode.UTF8ModeTests.test_pyio_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_utf8source.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_utf8source.txt index e8b19ab1ca..fefa89376d 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_utf8source.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_utf8source.txt @@ -1,3 +1,3 @@ -*graalpython.lib-python.3.test.test_utf8source.BuiltinCompileTests.test_latin1 -*graalpython.lib-python.3.test.test_utf8source.PEP3120Test.test_badsyntax -*graalpython.lib-python.3.test.test_utf8source.PEP3120Test.test_pep3120 +test.test_utf8source.BuiltinCompileTests.test_latin1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_utf8source.PEP3120Test.test_badsyntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_utf8source.PEP3120Test.test_pep3120 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_uu.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_uu.txt index 972d245ab4..1c00837969 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_uu.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_uu.txt @@ -1,2 +1,2 @@ -*graalpython.lib-python.3.test.test_uu.UUTest.test_missingbegin -*graalpython.lib-python.3.test.test_uu.UUTest.test_no_directory_traversal +test.test_uu.UUTest.test_missingbegin @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uu.UUTest.test_no_directory_traversal @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_uuid.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_uuid.txt index ce81ec48b9..37807266d6 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_uuid.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_uuid.txt @@ -1,70 +1,23 @@ -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithExtModule.test_arp_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithExtModule.test_find_mac -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithExtModule.test_find_mac_near_keyword -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithExtModule.test_find_under_heading -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithExtModule.test_find_under_heading_ipv6 -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithExtModule.test_ifconfig_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithExtModule.test_ip_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithExtModule.test_ipconfig_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithExtModule.test_lanscan_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithExtModule.test_netbios_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithExtModule.test_netstat_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithExtModule.test_parse_mac -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithExtModule.test_parse_mac_aix -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithExtModule.test_random_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithExtModule.test_unix_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithExtModule.test_windll_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithoutExtModule.test_arp_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithoutExtModule.test_find_mac -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithoutExtModule.test_find_mac_near_keyword -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithoutExtModule.test_find_under_heading -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithoutExtModule.test_find_under_heading_ipv6 -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithoutExtModule.test_ifconfig_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithoutExtModule.test_ip_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithoutExtModule.test_ipconfig_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithoutExtModule.test_lanscan_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithoutExtModule.test_netbios_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithoutExtModule.test_netstat_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithoutExtModule.test_parse_mac -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithoutExtModule.test_parse_mac_aix -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithoutExtModule.test_random_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithoutExtModule.test_unix_getnode -*graalpython.lib-python.3.test.test_uuid.TestInternalsWithoutExtModule.test_windll_getnode -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.testIssue8621 -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.test_UUID -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.test_exceptions -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.test_getnode -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.test_pickle_roundtrip -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.test_safe_uuid_enum -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.test_unpickle_previous_python_versions -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.test_uuid1 -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.test_uuid1_bogus_return_value -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.test_uuid1_eui64 -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.test_uuid1_is_safe -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.test_uuid1_is_unsafe -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.test_uuid1_safe -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.test_uuid1_time -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.test_uuid1_unknown -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.test_uuid3 -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.test_uuid4 -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.test_uuid5 -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithExtModule.test_uuid_weakref -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.testIssue8621 -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.test_UUID -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.test_exceptions -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.test_getnode -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.test_pickle_roundtrip -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.test_safe_uuid_enum -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.test_unpickle_previous_python_versions -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.test_uuid1 -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.test_uuid1_bogus_return_value -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.test_uuid1_eui64 -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.test_uuid1_is_safe -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.test_uuid1_is_unsafe -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.test_uuid1_safe -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.test_uuid1_time -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.test_uuid1_unknown -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.test_uuid3 -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.test_uuid4 -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.test_uuid5 -*graalpython.lib-python.3.test.test_uuid.TestUUIDWithoutExtModule.test_uuid_weakref +test.test_uuid.TestInternalsWithoutExtModule.test_arp_getnode @ darwin-arm64,darwin-x86_64 +test.test_uuid.TestInternalsWithoutExtModule.test_find_mac_near_keyword @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uuid.TestInternalsWithoutExtModule.test_find_under_heading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uuid.TestInternalsWithoutExtModule.test_find_under_heading_ipv6 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uuid.TestInternalsWithoutExtModule.test_ifconfig_getnode @ darwin-arm64,darwin-x86_64 +test.test_uuid.TestInternalsWithoutExtModule.test_ip_getnode @ linux-aarch64,linux-x86_64 +test.test_uuid.TestInternalsWithoutExtModule.test_netstat_getnode @ darwin-arm64,darwin-x86_64 +test.test_uuid.TestInternalsWithoutExtModule.test_parse_mac @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uuid.TestInternalsWithoutExtModule.test_parse_mac_aix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uuid.TestInternalsWithoutExtModule.test_random_getnode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uuid.TestUUIDWithoutExtModule.test_UUID @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uuid.TestUUIDWithoutExtModule.test_exceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uuid.TestUUIDWithoutExtModule.test_getnode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uuid.TestUUIDWithoutExtModule.test_pickle_roundtrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uuid.TestUUIDWithoutExtModule.test_safe_uuid_enum @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uuid.TestUUIDWithoutExtModule.test_unpickle_previous_python_versions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uuid.TestUUIDWithoutExtModule.test_uuid1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uuid.TestUUIDWithoutExtModule.test_uuid1_eui64 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uuid.TestUUIDWithoutExtModule.test_uuid1_time @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uuid.TestUUIDWithoutExtModule.test_uuid3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uuid.TestUUIDWithoutExtModule.test_uuid4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uuid.TestUUIDWithoutExtModule.test_uuid5 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_uuid.TestUUIDWithoutExtModule.test_uuid_weakref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_venv.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_venv.txt index 6914d1c9bd..17937ae7a1 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_venv.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_venv.txt @@ -1,22 +1,24 @@ -*graalpython.lib-python.3.test.test_venv.BasicTest.test_deactivate_with_strict_bash_opts -*graalpython.lib-python.3.test.test_venv.BasicTest.test_executable -*graalpython.lib-python.3.test.test_venv.BasicTest.test_executable_symlinks -*graalpython.lib-python.3.test.test_venv.BasicTest.test_isolation -*graalpython.lib-python.3.test.test_venv.BasicTest.test_macos_env -*graalpython.lib-python.3.test.test_venv.BasicTest.test_multiprocessing -*graalpython.lib-python.3.test.test_venv.BasicTest.test_multiprocessing_recursion -*graalpython.lib-python.3.test.test_venv.BasicTest.test_overwrite_existing -*graalpython.lib-python.3.test.test_venv.BasicTest.test_pathsep_error -*graalpython.lib-python.3.test.test_venv.BasicTest.test_prefixes -*graalpython.lib-python.3.test.test_venv.BasicTest.test_prompt -*graalpython.lib-python.3.test.test_venv.BasicTest.test_symlinking -*graalpython.lib-python.3.test.test_venv.BasicTest.test_sysconfig -*graalpython.lib-python.3.test.test_venv.BasicTest.test_sysconfig_symlinks -*graalpython.lib-python.3.test.test_venv.BasicTest.test_unicode_in_batch_file -*graalpython.lib-python.3.test.test_venv.BasicTest.test_unoverwritable_fails -*graalpython.lib-python.3.test.test_venv.BasicTest.test_upgrade -*graalpython.lib-python.3.test.test_venv.BasicTest.test_upgrade_dependencies -*graalpython.lib-python.3.test.test_venv.EnsurePipTest.test_devnull -*graalpython.lib-python.3.test.test_venv.EnsurePipTest.test_explicit_no_pip -*graalpython.lib-python.3.test.test_venv.EnsurePipTest.test_no_pip_by_default -*graalpython.lib-python.3.test.test_venv.EnsurePipTest.test_with_pip +test.test_venv.BasicTest.test_config_file_command_key @ win32-AMD64 +test.test_venv.BasicTest.test_deactivate_with_strict_bash_opts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_venv.BasicTest.test_defaults_with_pathlib_path @ win32-AMD64 +test.test_venv.BasicTest.test_defaults_with_str_path @ win32-AMD64 +test.test_venv.BasicTest.test_executable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_venv.BasicTest.test_executable_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_venv.BasicTest.test_isolation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_venv.BasicTest.test_macos_env @ darwin-arm64,darwin-x86_64 +test.test_venv.BasicTest.test_multiprocessing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_venv.BasicTest.test_multiprocessing_recursion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_venv.BasicTest.test_overwrite_existing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_venv.BasicTest.test_pathsep_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_venv.BasicTest.test_prefixes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_venv.BasicTest.test_prompt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_venv.BasicTest.test_symlinking @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_venv.BasicTest.test_sysconfig @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_venv.BasicTest.test_sysconfig_symlinks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_venv.BasicTest.test_unoverwritable_fails @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_venv.BasicTest.test_upgrade @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_venv.BasicTest.test_upgrade_dependencies @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_venv.EnsurePipTest.test_devnull @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_venv.EnsurePipTest.test_explicit_no_pip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_venv.EnsurePipTest.test_no_pip_by_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_venv.EnsurePipTest.test_with_pip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_warnings.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_warnings.txt index d8a61a3c6d..45f817349d 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_warnings.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_warnings.txt @@ -1,119 +1,113 @@ -*graalpython.lib-python.3.test.test_warnings.__init__.BootstrapTest.test_issue_8766 -*graalpython.lib-python.3.test.test_warnings.__init__.CCatchWarningTests.test_catch_warnings_defaults -*graalpython.lib-python.3.test.test_warnings.__init__.CCatchWarningTests.test_catch_warnings_recording -*graalpython.lib-python.3.test.test_warnings.__init__.CCatchWarningTests.test_catch_warnings_reentry_guard -*graalpython.lib-python.3.test.test_warnings.__init__.CCatchWarningTests.test_catch_warnings_restore -*graalpython.lib-python.3.test.test_warnings.__init__.CCatchWarningTests.test_check_warnings -*graalpython.lib-python.3.test.test_warnings.__init__.CCatchWarningTests.test_record_override_showwarning_before -*graalpython.lib-python.3.test.test_warnings.__init__.CCatchWarningTests.test_record_override_showwarning_inside -*graalpython.lib-python.3.test.test_warnings.__init__.CEnvironmentVariableTests.test_comma_separated_warnings -*graalpython.lib-python.3.test.test_warnings.__init__.CEnvironmentVariableTests.test_conflicting_envvar_and_command_line -*graalpython.lib-python.3.test.test_warnings.__init__.CEnvironmentVariableTests.test_default_filter_configuration -*graalpython.lib-python.3.test.test_warnings.__init__.CEnvironmentVariableTests.test_envvar_and_command_line -*graalpython.lib-python.3.test.test_warnings.__init__.CEnvironmentVariableTests.test_nonascii -*graalpython.lib-python.3.test.test_warnings.__init__.CEnvironmentVariableTests.test_single_warning -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_always -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_always_after_default -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_append_duplicate -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_catchwarnings_with_simplefilter_error -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_catchwarnings_with_simplefilter_ignore -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_default -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_error -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_error_after_default -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_filterwarnings -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_filterwarnings_duplicate_filters -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_ignore -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_ignore_after_default -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_inheritance -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_message_matching -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_module -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_module_globals -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_mutate_filter_list -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_once -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_ordering -*graalpython.lib-python.3.test.test_warnings.__init__.CFilterTests.test_simplefilter_duplicate_filters -*graalpython.lib-python.3.test.test_warnings.__init__.CPublicAPITests.test_module_all_attribute -*graalpython.lib-python.3.test.test_warnings.__init__.CWCmdLineTests.test_improper_input -*graalpython.lib-python.3.test.test_warnings.__init__.CWarnTests.test_accelerated -*graalpython.lib-python.3.test.test_warnings.__init__.CWarnTests.test_bad_str -*graalpython.lib-python.3.test.test_warnings.__init__.CWarnTests.test_exec_filename -*graalpython.lib-python.3.test.test_warnings.__init__.CWarnTests.test_filename -*graalpython.lib-python.3.test.test_warnings.__init__.CWarnTests.test_message -*graalpython.lib-python.3.test.test_warnings.__init__.CWarnTests.test_stacklevel -*graalpython.lib-python.3.test.test_warnings.__init__.CWarnTests.test_stacklevel_import -*graalpython.lib-python.3.test.test_warnings.__init__.CWarnTests.test_warn_explicit_non_ascii_filename -*graalpython.lib-python.3.test.test_warnings.__init__.CWarnTests.test_warn_explicit_type_errors -*graalpython.lib-python.3.test.test_warnings.__init__.CWarnTests.test_warn_nonstandard_types -*graalpython.lib-python.3.test.test_warnings.__init__.CWarnTests.test_warning_classes -*graalpython.lib-python.3.test.test_warnings.__init__.CWarningsDisplayTests.test_formatwarning -*graalpython.lib-python.3.test.test_warnings.__init__.CWarningsDisplayTests.test_formatwarning_override -*graalpython.lib-python.3.test.test_warnings.__init__.CWarningsDisplayTests.test_showwarning -*graalpython.lib-python.3.test.test_warnings.__init__.FinalizationTest.test_finalization -*graalpython.lib-python.3.test.test_warnings.__init__.FinalizationTest.test_late_resource_warning -*graalpython.lib-python.3.test.test_warnings.__init__.PyCatchWarningTests.test_catch_warnings_defaults -*graalpython.lib-python.3.test.test_warnings.__init__.PyCatchWarningTests.test_catch_warnings_recording -*graalpython.lib-python.3.test.test_warnings.__init__.PyCatchWarningTests.test_catch_warnings_reentry_guard -*graalpython.lib-python.3.test.test_warnings.__init__.PyCatchWarningTests.test_catch_warnings_restore -*graalpython.lib-python.3.test.test_warnings.__init__.PyCatchWarningTests.test_check_warnings -*graalpython.lib-python.3.test.test_warnings.__init__.PyCatchWarningTests.test_record_override_showwarning_before -*graalpython.lib-python.3.test.test_warnings.__init__.PyCatchWarningTests.test_record_override_showwarning_inside -*graalpython.lib-python.3.test.test_warnings.__init__.PyEnvironmentVariableTests.test_comma_separated_warnings -*graalpython.lib-python.3.test.test_warnings.__init__.PyEnvironmentVariableTests.test_conflicting_envvar_and_command_line -*graalpython.lib-python.3.test.test_warnings.__init__.PyEnvironmentVariableTests.test_default_filter_configuration -*graalpython.lib-python.3.test.test_warnings.__init__.PyEnvironmentVariableTests.test_envvar_and_command_line -*graalpython.lib-python.3.test.test_warnings.__init__.PyEnvironmentVariableTests.test_nonascii -*graalpython.lib-python.3.test.test_warnings.__init__.PyEnvironmentVariableTests.test_single_warning -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_always -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_always_after_default -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_append_duplicate -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_catchwarnings_with_simplefilter_error -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_catchwarnings_with_simplefilter_ignore -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_default -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_error -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_error_after_default -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_filterwarnings -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_filterwarnings_duplicate_filters -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_ignore -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_ignore_after_default -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_inheritance -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_message_matching -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_module -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_module_globals -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_mutate_filter_list -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_once -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_ordering -*graalpython.lib-python.3.test.test_warnings.__init__.PyFilterTests.test_simplefilter_duplicate_filters -*graalpython.lib-python.3.test.test_warnings.__init__.PyPublicAPITests.test_module_all_attribute -*graalpython.lib-python.3.test.test_warnings.__init__.PyWCmdLineTests.test_improper_input -*graalpython.lib-python.3.test.test_warnings.__init__.PyWCmdLineTests.test_improper_option -*graalpython.lib-python.3.test.test_warnings.__init__.PyWCmdLineTests.test_warnings_bootstrap -*graalpython.lib-python.3.test.test_warnings.__init__.PyWarnTests.test_bad_str -*graalpython.lib-python.3.test.test_warnings.__init__.PyWarnTests.test_exec_filename -*graalpython.lib-python.3.test.test_warnings.__init__.PyWarnTests.test_filename -*graalpython.lib-python.3.test.test_warnings.__init__.PyWarnTests.test_message -*graalpython.lib-python.3.test.test_warnings.__init__.PyWarnTests.test_pure_python -*graalpython.lib-python.3.test.test_warnings.__init__.PyWarnTests.test_stacklevel -*graalpython.lib-python.3.test.test_warnings.__init__.PyWarnTests.test_stacklevel_import -*graalpython.lib-python.3.test.test_warnings.__init__.PyWarnTests.test_warn_explicit_non_ascii_filename -*graalpython.lib-python.3.test.test_warnings.__init__.PyWarnTests.test_warn_explicit_type_errors -*graalpython.lib-python.3.test.test_warnings.__init__.PyWarnTests.test_warn_nonstandard_types -*graalpython.lib-python.3.test.test_warnings.__init__.PyWarnTests.test_warning_classes -*graalpython.lib-python.3.test.test_warnings.__init__.PyWarningsDisplayTests.test_formatwarning -*graalpython.lib-python.3.test.test_warnings.__init__.PyWarningsDisplayTests.test_formatwarning_override -*graalpython.lib-python.3.test.test_warnings.__init__.PyWarningsDisplayTests.test_showwarning -*graalpython.lib-python.3.test.test_warnings.__init__.PyWarningsDisplayTests.test_tracemalloc -*graalpython.lib-python.3.test.test_warnings.__init__._DeprecatedTest.test_RuntimeError -*graalpython.lib-python.3.test.test_warnings.__init__._DeprecatedTest.test_warning -*graalpython.lib-python.3.test.test_warnings.__init__._WarningsTests.test_default_action -*graalpython.lib-python.3.test.test_warnings.__init__._WarningsTests.test_filename_none -*graalpython.lib-python.3.test.test_warnings.__init__._WarningsTests.test_filter -*graalpython.lib-python.3.test.test_warnings.__init__._WarningsTests.test_issue31285 -*graalpython.lib-python.3.test.test_warnings.__init__._WarningsTests.test_issue31411 -*graalpython.lib-python.3.test.test_warnings.__init__._WarningsTests.test_issue31416 -*graalpython.lib-python.3.test.test_warnings.__init__._WarningsTests.test_issue31566 -*graalpython.lib-python.3.test.test_warnings.__init__._WarningsTests.test_onceregistry -*graalpython.lib-python.3.test.test_warnings.__init__._WarningsTests.test_show_warning_output -*graalpython.lib-python.3.test.test_warnings.__init__._WarningsTests.test_showwarning_missing -*graalpython.lib-python.3.test.test_warnings.__init__._WarningsTests.test_showwarning_not_callable -*graalpython.lib-python.3.test.test_warnings.__init__._WarningsTests.test_showwarnmsg_missing -*graalpython.lib-python.3.test.test_warnings.__init__._WarningsTests.test_stderr_none +test.test_warnings.BootstrapTest.test_issue_8766 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CCatchWarningTests.test_catch_warnings_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CCatchWarningTests.test_catch_warnings_recording @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CCatchWarningTests.test_catch_warnings_reentry_guard @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CCatchWarningTests.test_catch_warnings_restore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CCatchWarningTests.test_check_warnings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CCatchWarningTests.test_record_override_showwarning_before @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CCatchWarningTests.test_record_override_showwarning_inside @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CEnvironmentVariableTests.test_comma_separated_warnings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CEnvironmentVariableTests.test_conflicting_envvar_and_command_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CEnvironmentVariableTests.test_default_filter_configuration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CEnvironmentVariableTests.test_envvar_and_command_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CEnvironmentVariableTests.test_nonascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CEnvironmentVariableTests.test_single_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_always @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_always_after_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_append_duplicate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_catchwarnings_with_simplefilter_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_catchwarnings_with_simplefilter_ignore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_error_after_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_filterwarnings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_filterwarnings_duplicate_filters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_ignore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_ignore_after_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_message_matching @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_module_globals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_mutate_filter_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_once @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_ordering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CFilterTests.test_simplefilter_duplicate_filters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CPublicAPITests.test_module_all_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CWCmdLineTests.test_import_from_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CWCmdLineTests.test_improper_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CWarnTests.test_accelerated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CWarnTests.test_bad_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CWarnTests.test_exec_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CWarnTests.test_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CWarnTests.test_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CWarnTests.test_stacklevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CWarnTests.test_warn_explicit_non_ascii_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CWarnTests.test_warn_explicit_type_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CWarnTests.test_warn_nonstandard_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CWarnTests.test_warning_classes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CWarningsDisplayTests.test_formatwarning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CWarningsDisplayTests.test_formatwarning_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.CWarningsDisplayTests.test_showwarning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyCatchWarningTests.test_catch_warnings_defaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyCatchWarningTests.test_catch_warnings_recording @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyCatchWarningTests.test_catch_warnings_reentry_guard @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyCatchWarningTests.test_catch_warnings_restore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyCatchWarningTests.test_check_warnings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyCatchWarningTests.test_record_override_showwarning_before @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyCatchWarningTests.test_record_override_showwarning_inside @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyEnvironmentVariableTests.test_comma_separated_warnings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyEnvironmentVariableTests.test_conflicting_envvar_and_command_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyEnvironmentVariableTests.test_default_filter_configuration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyEnvironmentVariableTests.test_envvar_and_command_line @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyEnvironmentVariableTests.test_nonascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyEnvironmentVariableTests.test_single_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_always @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_always_after_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_append_duplicate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_catchwarnings_with_simplefilter_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_catchwarnings_with_simplefilter_ignore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_error_after_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_filterwarnings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_filterwarnings_duplicate_filters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_ignore @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_ignore_after_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_message_matching @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_module_globals @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_mutate_filter_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_once @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_ordering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyFilterTests.test_simplefilter_duplicate_filters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyPublicAPITests.test_module_all_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyWCmdLineTests.test_import_from_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyWCmdLineTests.test_improper_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyWCmdLineTests.test_improper_option @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyWCmdLineTests.test_warnings_bootstrap @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyWarnTests.test_bad_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyWarnTests.test_exec_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyWarnTests.test_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyWarnTests.test_message @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyWarnTests.test_pure_python @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyWarnTests.test_stacklevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyWarnTests.test_warn_explicit_non_ascii_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyWarnTests.test_warn_explicit_type_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyWarnTests.test_warn_nonstandard_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyWarnTests.test_warning_classes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyWarningsDisplayTests.test_formatwarning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyWarningsDisplayTests.test_formatwarning_override @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings.PyWarningsDisplayTests.test_showwarning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings._DeprecatedTest.test_RuntimeError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings._DeprecatedTest.test_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings._WarningsTests.test_default_action @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings._WarningsTests.test_filename_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings._WarningsTests.test_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings._WarningsTests.test_issue31285 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings._WarningsTests.test_onceregistry @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings._WarningsTests.test_show_warning_output @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings._WarningsTests.test_showwarning_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings._WarningsTests.test_showwarning_not_callable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings._WarningsTests.test_showwarnmsg_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_warnings._WarningsTests.test_stderr_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_wave.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_wave.txt index fcbf24d62a..ede52625be 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_wave.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_wave.txt @@ -1,90 +1,90 @@ -*graalpython.lib-python.3.test.test_wave.MiscTestCase.test__all__ -*graalpython.lib-python.3.test.test_wave.WaveLowLevelTest.test_read_no_chunks -*graalpython.lib-python.3.test.test_wave.WaveLowLevelTest.test_read_no_data_chunk -*graalpython.lib-python.3.test.test_wave.WaveLowLevelTest.test_read_no_fmt_chunk -*graalpython.lib-python.3.test.test_wave.WaveLowLevelTest.test_read_no_fmt_no_data_chunk -*graalpython.lib-python.3.test.test_wave.WaveLowLevelTest.test_read_no_riff_chunk -*graalpython.lib-python.3.test.test_wave.WaveLowLevelTest.test_read_not_wave -*graalpython.lib-python.3.test.test_wave.WaveLowLevelTest.test_read_wrong_form -*graalpython.lib-python.3.test.test_wave.WaveLowLevelTest.test_read_wrong_number_of_channels -*graalpython.lib-python.3.test.test_wave.WaveLowLevelTest.test_read_wrong_sample_width -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_close -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_context_manager_with_filename -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_context_manager_with_open_file -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_copy -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_incompleted_write -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_multiple_writes -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_overflowed_write -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_read -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_read_not_from_start -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_read_params -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_unseekable_incompleted_write -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_unseekable_overflowed_write -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_unseekable_read -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_unseekable_write -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_write -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_write_array -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_write_bytearray -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_write_context_manager_calls_close -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_write_memoryview -*graalpython.lib-python.3.test.test_wave.WavePCM16Test.test_write_params -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_close -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_context_manager_with_filename -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_context_manager_with_open_file -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_copy -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_incompleted_write -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_multiple_writes -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_overflowed_write -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_read -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_read_not_from_start -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_read_params -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_unseekable_incompleted_write -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_unseekable_overflowed_write -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_unseekable_read -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_unseekable_write -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_write -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_write_array -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_write_bytearray -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_write_context_manager_calls_close -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_write_memoryview -*graalpython.lib-python.3.test.test_wave.WavePCM24Test.test_write_params -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_close -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_context_manager_with_filename -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_context_manager_with_open_file -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_copy -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_incompleted_write -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_multiple_writes -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_overflowed_write -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_read -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_read_not_from_start -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_read_params -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_unseekable_incompleted_write -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_unseekable_overflowed_write -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_unseekable_read -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_unseekable_write -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_write -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_write_array -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_write_bytearray -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_write_context_manager_calls_close -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_write_memoryview -*graalpython.lib-python.3.test.test_wave.WavePCM32Test.test_write_params -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_close -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_context_manager_with_filename -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_context_manager_with_open_file -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_copy -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_incompleted_write -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_multiple_writes -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_overflowed_write -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_read -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_read_not_from_start -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_read_params -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_unseekable_incompleted_write -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_unseekable_overflowed_write -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_unseekable_read -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_unseekable_write -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_write -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_write_array -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_write_bytearray -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_write_context_manager_calls_close -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_write_memoryview -*graalpython.lib-python.3.test.test_wave.WavePCM8Test.test_write_params +test.test_wave.MiscTestCase.test__all__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WaveLowLevelTest.test_read_no_chunks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WaveLowLevelTest.test_read_no_data_chunk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WaveLowLevelTest.test_read_no_fmt_chunk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WaveLowLevelTest.test_read_no_fmt_no_data_chunk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WaveLowLevelTest.test_read_no_riff_chunk @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WaveLowLevelTest.test_read_not_wave @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WaveLowLevelTest.test_read_wrong_form @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WaveLowLevelTest.test_read_wrong_number_of_channels @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WaveLowLevelTest.test_read_wrong_sample_width @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_context_manager_with_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_context_manager_with_open_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_incompleted_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_multiple_writes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_overflowed_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_read_not_from_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_read_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_unseekable_incompleted_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_unseekable_overflowed_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_unseekable_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_unseekable_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_write_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_write_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_write_context_manager_calls_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_write_memoryview @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM16Test.test_write_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_context_manager_with_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_context_manager_with_open_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_incompleted_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_multiple_writes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_overflowed_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_read_not_from_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_read_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_unseekable_incompleted_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_unseekable_overflowed_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_unseekable_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_unseekable_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_write_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_write_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_write_context_manager_calls_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_write_memoryview @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM24Test.test_write_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_context_manager_with_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_context_manager_with_open_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_incompleted_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_multiple_writes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_overflowed_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_read_not_from_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_read_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_unseekable_incompleted_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_unseekable_overflowed_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_unseekable_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_unseekable_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_write_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_write_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_write_context_manager_calls_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_write_memoryview @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM32Test.test_write_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_context_manager_with_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_context_manager_with_open_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_incompleted_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_multiple_writes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_overflowed_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_read_not_from_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_read_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_unseekable_incompleted_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_unseekable_overflowed_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_unseekable_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_unseekable_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_write_array @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_write_bytearray @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_write_context_manager_calls_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_write_memoryview @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wave.WavePCM8Test.test_write_params @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_weakref.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_weakref.txt index 4567ae0321..56f3526cc9 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_weakref.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_weakref.txt @@ -1,102 +1,89 @@ -*graalpython.lib-python.3.test.test_weakref.FinalizeTestCase.test_arg_errors -*graalpython.lib-python.3.test.test_weakref.FinalizeTestCase.test_finalize -*graalpython.lib-python.3.test.test_weakref.FinalizeTestCase.test_order -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_make_weak_keyed_dict_from_dict -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_make_weak_keyed_dict_from_weak_keyed_dict -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_make_weak_keyed_dict_repr -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_make_weak_valued_dict_from_dict -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_make_weak_valued_dict_from_weak_valued_dict -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_make_weak_valued_dict_misc -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_make_weak_valued_dict_repr -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_remove_closure -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_threaded_weak_key_dict_copy -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_threaded_weak_value_dict_copy -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_threaded_weak_value_dict_deepcopy -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_threaded_weak_valued_consistency -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_threaded_weak_valued_pop -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_threaded_weak_valued_setdefault -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_weak_keyed_delitem -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_weak_keyed_dict_popitem -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_weak_keyed_dict_setdefault -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_weak_keyed_dict_update -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_weak_keyed_iters -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_weak_valued_delitem -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_weak_valued_dict_popitem -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_weak_valued_dict_setdefault -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_weak_valued_dict_update -*graalpython.lib-python.3.test.test_weakref.MappingTestCase.test_weak_valued_iters -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_basic_callback -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_basic_proxy -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_basic_ref -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_callback_different_classes -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_callback_gcs -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_callback_in_cycle -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_callback_in_cycle_1 -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_callback_in_cycle_2 -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_callback_in_cycle_3 -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_callback_in_cycle_4 -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_callback_in_cycle_resurrection -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_callback_reachable_one_way -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_callbacks_on_callback -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_callbacks_protected -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_cfunction -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_classes -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_constructor_kwargs -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_getweakrefcount -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_getweakrefs -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_hashing -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_init -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_multiple_callbacks -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_multiple_selfref_callbacks -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_newstyle_number_ops -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_ordering -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_proxy_bool -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_proxy_deletion -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_proxy_div -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_proxy_index -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_proxy_iter -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_proxy_next -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_proxy_ref -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_proxy_reversed -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_proxy_unicode -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_ref_created_during_del -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_set_callback_attribute -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_sf_bug_840829 -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_shared_ref_without_callback -*graalpython.lib-python.3.test.test_weakref.ReferencesTestCase.test_trashcan_16602 -*graalpython.lib-python.3.test.test_weakref.SubclassableWeakrefTestCase.test_subclass_refs_with_cycle -*graalpython.lib-python.3.test.test_weakref.SubclassableWeakrefTestCase.test_subclass_refs_with_slots -*graalpython.lib-python.3.test.test_weakref.WeakKeyDictionaryTestCase.test_bool -*graalpython.lib-python.3.test.test_weakref.WeakKeyDictionaryTestCase.test_constructor -*graalpython.lib-python.3.test.test_weakref.WeakKeyDictionaryTestCase.test_get -*graalpython.lib-python.3.test.test_weakref.WeakKeyDictionaryTestCase.test_getitem -*graalpython.lib-python.3.test.test_weakref.WeakKeyDictionaryTestCase.test_items -*graalpython.lib-python.3.test.test_weakref.WeakKeyDictionaryTestCase.test_keys -*graalpython.lib-python.3.test.test_weakref.WeakKeyDictionaryTestCase.test_len -*graalpython.lib-python.3.test.test_weakref.WeakKeyDictionaryTestCase.test_pop -*graalpython.lib-python.3.test.test_weakref.WeakKeyDictionaryTestCase.test_popitem -*graalpython.lib-python.3.test.test_weakref.WeakKeyDictionaryTestCase.test_read -*graalpython.lib-python.3.test.test_weakref.WeakKeyDictionaryTestCase.test_setdefault -*graalpython.lib-python.3.test.test_weakref.WeakKeyDictionaryTestCase.test_update -*graalpython.lib-python.3.test.test_weakref.WeakKeyDictionaryTestCase.test_values -*graalpython.lib-python.3.test.test_weakref.WeakKeyDictionaryTestCase.test_write -*graalpython.lib-python.3.test.test_weakref.WeakMethodTestCase.test_alive -*graalpython.lib-python.3.test.test_weakref.WeakMethodTestCase.test_equality -*graalpython.lib-python.3.test.test_weakref.WeakMethodTestCase.test_hashing -*graalpython.lib-python.3.test.test_weakref.WeakMethodTestCase.test_method_dead -*graalpython.lib-python.3.test.test_weakref.WeakMethodTestCase.test_no_cycles -*graalpython.lib-python.3.test.test_weakref.WeakMethodTestCase.test_object_dead -*graalpython.lib-python.3.test.test_weakref.WeakValueDictionaryTestCase.test_bool -*graalpython.lib-python.3.test.test_weakref.WeakValueDictionaryTestCase.test_constructor -*graalpython.lib-python.3.test.test_weakref.WeakValueDictionaryTestCase.test_get -*graalpython.lib-python.3.test.test_weakref.WeakValueDictionaryTestCase.test_getitem -*graalpython.lib-python.3.test.test_weakref.WeakValueDictionaryTestCase.test_items -*graalpython.lib-python.3.test.test_weakref.WeakValueDictionaryTestCase.test_keys -*graalpython.lib-python.3.test.test_weakref.WeakValueDictionaryTestCase.test_len -*graalpython.lib-python.3.test.test_weakref.WeakValueDictionaryTestCase.test_pop -*graalpython.lib-python.3.test.test_weakref.WeakValueDictionaryTestCase.test_popitem -*graalpython.lib-python.3.test.test_weakref.WeakValueDictionaryTestCase.test_read -*graalpython.lib-python.3.test.test_weakref.WeakValueDictionaryTestCase.test_setdefault -*graalpython.lib-python.3.test.test_weakref.WeakValueDictionaryTestCase.test_update -*graalpython.lib-python.3.test.test_weakref.WeakValueDictionaryTestCase.test_values -*graalpython.lib-python.3.test.test_weakref.WeakValueDictionaryTestCase.test_write +DocTestCase.test.test_weakref.__test__.libreftest @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.FinalizeTestCase.test_arg_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.FinalizeTestCase.test_finalize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_make_weak_keyed_dict_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_make_weak_keyed_dict_from_weak_keyed_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_make_weak_keyed_dict_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_make_weak_valued_dict_from_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_make_weak_valued_dict_from_weak_valued_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_make_weak_valued_dict_misc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_make_weak_valued_dict_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_threaded_weak_key_dict_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_threaded_weak_value_dict_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_threaded_weak_value_dict_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_threaded_weak_valued_consistency @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_threaded_weak_valued_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_threaded_weak_valued_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_weak_keyed_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_weak_keyed_dict_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_weak_keyed_dict_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_weak_keyed_dict_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_weak_keyed_iters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_weak_valued_delitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_weak_valued_dict_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_weak_valued_dict_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_weak_valued_dict_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.MappingTestCase.test_weak_valued_iters @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_basic_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_basic_proxy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_basic_ref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_callback_different_classes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_callback_gcs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_callback_in_cycle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_callback_reachable_one_way @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_callbacks_on_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_callbacks_protected @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_constructor_kwargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_hashing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_multiple_callbacks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_multiple_selfref_callbacks @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_newstyle_number_ops @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_ordering @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_proxy_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_proxy_deletion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_proxy_div @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_proxy_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_proxy_iter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_proxy_next @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_proxy_reversed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_proxy_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_ref_created_during_del @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_set_callback_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_sf_bug_840829 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_shared_ref_without_callback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.ReferencesTestCase.test_trashcan_16602 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# transiently fails +!test.test_weakref.SubclassableWeakrefTestCase.test_subclass_refs +test.test_weakref.SubclassableWeakrefTestCase.test_subclass_refs_with_cycle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.SubclassableWeakrefTestCase.test_subclass_refs_with_slots @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakKeyDictionaryTestCase.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakKeyDictionaryTestCase.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakKeyDictionaryTestCase.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakKeyDictionaryTestCase.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakKeyDictionaryTestCase.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakKeyDictionaryTestCase.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakKeyDictionaryTestCase.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakKeyDictionaryTestCase.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakKeyDictionaryTestCase.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakKeyDictionaryTestCase.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakKeyDictionaryTestCase.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakKeyDictionaryTestCase.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakKeyDictionaryTestCase.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakKeyDictionaryTestCase.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakMethodTestCase.test_alive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakMethodTestCase.test_equality @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakValueDictionaryTestCase.test_bool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakValueDictionaryTestCase.test_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakValueDictionaryTestCase.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakValueDictionaryTestCase.test_getitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakValueDictionaryTestCase.test_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakValueDictionaryTestCase.test_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakValueDictionaryTestCase.test_len @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakValueDictionaryTestCase.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakValueDictionaryTestCase.test_popitem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakValueDictionaryTestCase.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakValueDictionaryTestCase.test_setdefault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakValueDictionaryTestCase.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakValueDictionaryTestCase.test_values @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakref.WeakValueDictionaryTestCase.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_weakset.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_weakset.txt index 1cdd3f491a..37b7f55132 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_weakset.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_weakset.txt @@ -1,46 +1,36 @@ -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_abc -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_add -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_and -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_clear -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_constructor_identity -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_contains -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_copy -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_copying -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_difference -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_difference_update -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_discard -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_eq -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_gc -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_gt -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_hash -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_iand -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_init -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_inplace_on_self -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_intersection -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_intersection_update -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_ior -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_isdisjoint -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_isub -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_ixor -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_len -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_len_cycles -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_len_race -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_lt -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_methods -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_ne -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_new_or_init -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_or -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_pop -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_remove -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_repr -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_sub -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_sub_and_super -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_subclass_with_custom_hash -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_symmetric_difference -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_symmetric_difference_update -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_union -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_update -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_update_set -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_weak_destroy_and_mutate_while_iterating -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_weak_destroy_while_iterating -*graalpython.lib-python.3.test.test_weakset.TestWeakSet.test_xor +test.test_weakset.TestWeakSet.test_abc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_and @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_clear @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_constructor_identity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_copying @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_difference @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_difference_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_discard @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_eq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_gc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_gt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_iand @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_inplace_on_self @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_intersection_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_ior @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_isdisjoint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_isub @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_ixor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_lt @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_ne @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_new_or_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_or @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_pop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_remove @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_sub @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_sub_and_super @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_subclass_with_custom_hash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_symmetric_difference_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_update @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_update_set @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_weakset.TestWeakSet.test_xor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_webbrowser.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_webbrowser.txt index f180bb7e62..531fd9ee34 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_webbrowser.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_webbrowser.txt @@ -1,34 +1,34 @@ -*graalpython.lib-python.3.test.test_webbrowser.BackgroundBrowserCommandTest.test_open -*graalpython.lib-python.3.test.test_webbrowser.BrowserRegistrationTest.test_register -*graalpython.lib-python.3.test.test_webbrowser.BrowserRegistrationTest.test_register_default -*graalpython.lib-python.3.test.test_webbrowser.BrowserRegistrationTest.test_register_preferred -*graalpython.lib-python.3.test.test_webbrowser.ChromeCommandTest.test_open -*graalpython.lib-python.3.test.test_webbrowser.ChromeCommandTest.test_open_new -*graalpython.lib-python.3.test.test_webbrowser.ChromeCommandTest.test_open_new_tab -*graalpython.lib-python.3.test.test_webbrowser.ChromeCommandTest.test_open_with_autoraise_false -*graalpython.lib-python.3.test.test_webbrowser.ELinksCommandTest.test_open -*graalpython.lib-python.3.test.test_webbrowser.ELinksCommandTest.test_open_new -*graalpython.lib-python.3.test.test_webbrowser.ELinksCommandTest.test_open_new_tab -*graalpython.lib-python.3.test.test_webbrowser.ELinksCommandTest.test_open_with_autoraise_false -*graalpython.lib-python.3.test.test_webbrowser.GaleonCommandTest.test_open -*graalpython.lib-python.3.test.test_webbrowser.GaleonCommandTest.test_open_new -*graalpython.lib-python.3.test.test_webbrowser.GaleonCommandTest.test_open_new_tab -*graalpython.lib-python.3.test.test_webbrowser.GaleonCommandTest.test_open_with_autoraise_false -*graalpython.lib-python.3.test.test_webbrowser.GenericBrowserCommandTest.test_open -*graalpython.lib-python.3.test.test_webbrowser.ImportTest.test_environment -*graalpython.lib-python.3.test.test_webbrowser.ImportTest.test_environment_preferred -*graalpython.lib-python.3.test.test_webbrowser.ImportTest.test_get -*graalpython.lib-python.3.test.test_webbrowser.ImportTest.test_register -*graalpython.lib-python.3.test.test_webbrowser.ImportTest.test_synthesize -*graalpython.lib-python.3.test.test_webbrowser.MozillaCommandTest.test_open -*graalpython.lib-python.3.test.test_webbrowser.MozillaCommandTest.test_open_new -*graalpython.lib-python.3.test.test_webbrowser.MozillaCommandTest.test_open_new_tab -*graalpython.lib-python.3.test.test_webbrowser.MozillaCommandTest.test_open_with_autoraise_false -*graalpython.lib-python.3.test.test_webbrowser.NetscapeCommandTest.test_open -*graalpython.lib-python.3.test.test_webbrowser.NetscapeCommandTest.test_open_new -*graalpython.lib-python.3.test.test_webbrowser.NetscapeCommandTest.test_open_new_tab -*graalpython.lib-python.3.test.test_webbrowser.NetscapeCommandTest.test_open_with_autoraise_false -*graalpython.lib-python.3.test.test_webbrowser.OperaCommandTest.test_open -*graalpython.lib-python.3.test.test_webbrowser.OperaCommandTest.test_open_new -*graalpython.lib-python.3.test.test_webbrowser.OperaCommandTest.test_open_new_tab -*graalpython.lib-python.3.test.test_webbrowser.OperaCommandTest.test_open_with_autoraise_false +test.test_webbrowser.BackgroundBrowserCommandTest.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.BrowserRegistrationTest.test_register @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.BrowserRegistrationTest.test_register_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.BrowserRegistrationTest.test_register_preferred @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.ChromeCommandTest.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.ChromeCommandTest.test_open_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.ChromeCommandTest.test_open_new_tab @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.ChromeCommandTest.test_open_with_autoraise_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.ELinksCommandTest.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.ELinksCommandTest.test_open_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.ELinksCommandTest.test_open_new_tab @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.ELinksCommandTest.test_open_with_autoraise_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.GaleonCommandTest.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.GaleonCommandTest.test_open_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.GaleonCommandTest.test_open_new_tab @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.GaleonCommandTest.test_open_with_autoraise_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.GenericBrowserCommandTest.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.ImportTest.test_environment @ darwin-arm64,darwin-x86_64,win32-AMD64 +test.test_webbrowser.ImportTest.test_environment_preferred @ darwin-arm64,darwin-x86_64,win32-AMD64 +test.test_webbrowser.ImportTest.test_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.ImportTest.test_register @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.ImportTest.test_synthesize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.MozillaCommandTest.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.MozillaCommandTest.test_open_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.MozillaCommandTest.test_open_new_tab @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.MozillaCommandTest.test_open_with_autoraise_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.NetscapeCommandTest.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.NetscapeCommandTest.test_open_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.NetscapeCommandTest.test_open_new_tab @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.NetscapeCommandTest.test_open_with_autoraise_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.OperaCommandTest.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.OperaCommandTest.test_open_new @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.OperaCommandTest.test_open_new_tab @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_webbrowser.OperaCommandTest.test_open_with_autoraise_false @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_with.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_with.txt index a199d79ce1..00f148b963 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_with.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_with.txt @@ -1,50 +1,50 @@ -*graalpython.lib-python.3.test.test_with.AssignmentTargetTestCase.testMultipleComplexTargets -*graalpython.lib-python.3.test.test_with.AssignmentTargetTestCase.testSingleComplexTarget -*graalpython.lib-python.3.test.test_with.AssignmentTargetTestCase.testWithExtendedTargets -*graalpython.lib-python.3.test.test_with.ExceptionalTestCase.testErrorsInBool -*graalpython.lib-python.3.test.test_with.ExceptionalTestCase.testExceptionNormalized -*graalpython.lib-python.3.test.test_with.ExceptionalTestCase.testMultipleResourcesInSingleStatement -*graalpython.lib-python.3.test.test_with.ExceptionalTestCase.testNestedExceptionAfterInnerStatement -*graalpython.lib-python.3.test.test_with.ExceptionalTestCase.testNestedExceptionBeforeInnerStatement -*graalpython.lib-python.3.test.test_with.ExceptionalTestCase.testNestedSingleStatements -*graalpython.lib-python.3.test.test_with.ExceptionalTestCase.testRaisedGeneratorExit1 -*graalpython.lib-python.3.test.test_with.ExceptionalTestCase.testRaisedGeneratorExit2 -*graalpython.lib-python.3.test.test_with.ExceptionalTestCase.testRaisedStopIteration1 -*graalpython.lib-python.3.test.test_with.ExceptionalTestCase.testRaisedStopIteration2 -*graalpython.lib-python.3.test.test_with.ExceptionalTestCase.testRaisedStopIteration3 -*graalpython.lib-python.3.test.test_with.ExceptionalTestCase.testSingleResource -*graalpython.lib-python.3.test.test_with.ExitSwallowsExceptionTestCase.testExitFalseDoesntSwallowException -*graalpython.lib-python.3.test.test_with.ExitSwallowsExceptionTestCase.testExitTrueSwallowsException -*graalpython.lib-python.3.test.test_with.FailureTestCase.testAssignmentToNoneError -*graalpython.lib-python.3.test.test_with.FailureTestCase.testAssignmentToTupleContainingNoneError -*graalpython.lib-python.3.test.test_with.FailureTestCase.testAssignmentToTupleOnlyContainingNoneError -*graalpython.lib-python.3.test.test_with.FailureTestCase.testEnterAttributeError1 -*graalpython.lib-python.3.test.test_with.FailureTestCase.testEnterAttributeError2 -*graalpython.lib-python.3.test.test_with.FailureTestCase.testEnterThrows -*graalpython.lib-python.3.test.test_with.FailureTestCase.testExitAttributeError -*graalpython.lib-python.3.test.test_with.FailureTestCase.testExitThrows -*graalpython.lib-python.3.test.test_with.FailureTestCase.testNameError -*graalpython.lib-python.3.test.test_with.NestedNonexceptionalTestCase.testMultipleArgBound -*graalpython.lib-python.3.test.test_with.NestedNonexceptionalTestCase.testMultipleArgUnbound -*graalpython.lib-python.3.test.test_with.NestedNonexceptionalTestCase.testSingleArgBoundToMultipleElementTupleError -*graalpython.lib-python.3.test.test_with.NestedNonexceptionalTestCase.testSingleArgBoundToNonTuple -*graalpython.lib-python.3.test.test_with.NestedNonexceptionalTestCase.testSingleArgBoundToSingleElementParenthesizedList -*graalpython.lib-python.3.test.test_with.NestedNonexceptionalTestCase.testSingleArgInlineGeneratorSyntax -*graalpython.lib-python.3.test.test_with.NestedNonexceptionalTestCase.testSingleArgUnbound -*graalpython.lib-python.3.test.test_with.NestedWith.testEnterReturnsTuple -*graalpython.lib-python.3.test.test_with.NestedWith.testExceptionInEnter -*graalpython.lib-python.3.test.test_with.NestedWith.testExceptionInExit -*graalpython.lib-python.3.test.test_with.NestedWith.testExceptionInExprList -*graalpython.lib-python.3.test.test_with.NestedWith.testNoExceptions -*graalpython.lib-python.3.test.test_with.NonLocalFlowControlTestCase.testWithBreak -*graalpython.lib-python.3.test.test_with.NonLocalFlowControlTestCase.testWithContinue -*graalpython.lib-python.3.test.test_with.NonLocalFlowControlTestCase.testWithRaise -*graalpython.lib-python.3.test.test_with.NonLocalFlowControlTestCase.testWithReturn -*graalpython.lib-python.3.test.test_with.NonLocalFlowControlTestCase.testWithYield -*graalpython.lib-python.3.test.test_with.NonexceptionalTestCase.testBoundGenerator -*graalpython.lib-python.3.test.test_with.NonexceptionalTestCase.testInlineGeneratorBoundSyntax -*graalpython.lib-python.3.test.test_with.NonexceptionalTestCase.testInlineGeneratorBoundToDottedVariable -*graalpython.lib-python.3.test.test_with.NonexceptionalTestCase.testInlineGeneratorBoundToExistingVariable -*graalpython.lib-python.3.test.test_with.NonexceptionalTestCase.testInlineGeneratorSyntax -*graalpython.lib-python.3.test.test_with.NonexceptionalTestCase.testNestedSingleStatements -*graalpython.lib-python.3.test.test_with.NonexceptionalTestCase.testUnboundGenerator +test.test_with.AssignmentTargetTestCase.testMultipleComplexTargets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.AssignmentTargetTestCase.testSingleComplexTarget @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.AssignmentTargetTestCase.testWithExtendedTargets @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.ExceptionalTestCase.testErrorsInBool @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.ExceptionalTestCase.testExceptionNormalized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.ExceptionalTestCase.testMultipleResourcesInSingleStatement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.ExceptionalTestCase.testNestedExceptionAfterInnerStatement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.ExceptionalTestCase.testNestedExceptionBeforeInnerStatement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.ExceptionalTestCase.testNestedSingleStatements @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.ExceptionalTestCase.testRaisedGeneratorExit1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.ExceptionalTestCase.testRaisedGeneratorExit2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.ExceptionalTestCase.testRaisedStopIteration1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.ExceptionalTestCase.testRaisedStopIteration2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.ExceptionalTestCase.testRaisedStopIteration3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.ExceptionalTestCase.testSingleResource @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.ExitSwallowsExceptionTestCase.testExitFalseDoesntSwallowException @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.ExitSwallowsExceptionTestCase.testExitTrueSwallowsException @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.FailureTestCase.testAssignmentToNoneError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.FailureTestCase.testAssignmentToTupleContainingNoneError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.FailureTestCase.testAssignmentToTupleOnlyContainingNoneError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.FailureTestCase.testEnterAttributeError1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.FailureTestCase.testEnterAttributeError2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.FailureTestCase.testEnterThrows @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.FailureTestCase.testExitAttributeError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.FailureTestCase.testExitThrows @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.FailureTestCase.testNameError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NestedNonexceptionalTestCase.testMultipleArgBound @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NestedNonexceptionalTestCase.testMultipleArgUnbound @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NestedNonexceptionalTestCase.testSingleArgBoundToMultipleElementTupleError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NestedNonexceptionalTestCase.testSingleArgBoundToNonTuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NestedNonexceptionalTestCase.testSingleArgBoundToSingleElementParenthesizedList @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NestedNonexceptionalTestCase.testSingleArgInlineGeneratorSyntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NestedNonexceptionalTestCase.testSingleArgUnbound @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NestedWith.testEnterReturnsTuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NestedWith.testExceptionInEnter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NestedWith.testExceptionInExit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NestedWith.testExceptionInExprList @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NestedWith.testNoExceptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NonLocalFlowControlTestCase.testWithBreak @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NonLocalFlowControlTestCase.testWithContinue @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NonLocalFlowControlTestCase.testWithRaise @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NonLocalFlowControlTestCase.testWithReturn @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NonLocalFlowControlTestCase.testWithYield @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NonexceptionalTestCase.testBoundGenerator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NonexceptionalTestCase.testInlineGeneratorBoundSyntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NonexceptionalTestCase.testInlineGeneratorBoundToDottedVariable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NonexceptionalTestCase.testInlineGeneratorBoundToExistingVariable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NonexceptionalTestCase.testInlineGeneratorSyntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NonexceptionalTestCase.testNestedSingleStatements @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_with.NonexceptionalTestCase.testUnboundGenerator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_wsgiref.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_wsgiref.txt index 1b092d91a3..81bfaf4112 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_wsgiref.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_wsgiref.txt @@ -1,36 +1,34 @@ -*graalpython.lib-python.3.test.test_wsgiref.HandlerTests.testAbstractMethods -*graalpython.lib-python.3.test.test_wsgiref.HandlerTests.testBasicErrorOutput -*graalpython.lib-python.3.test.test_wsgiref.HandlerTests.testBytesData -*graalpython.lib-python.3.test.test_wsgiref.HandlerTests.testCGIEnviron -*graalpython.lib-python.3.test.test_wsgiref.HandlerTests.testClientConnectionTerminations -*graalpython.lib-python.3.test.test_wsgiref.HandlerTests.testCloseOnError -*graalpython.lib-python.3.test.test_wsgiref.HandlerTests.testContentLength -*graalpython.lib-python.3.test.test_wsgiref.HandlerTests.testDontResetInternalStateOnException -*graalpython.lib-python.3.test.test_wsgiref.HandlerTests.testEnviron -*graalpython.lib-python.3.test.test_wsgiref.HandlerTests.testErrorAfterOutput -*graalpython.lib-python.3.test.test_wsgiref.HandlerTests.testHeaderFormats -*graalpython.lib-python.3.test.test_wsgiref.HandlerTests.testPartialWrite -*graalpython.lib-python.3.test.test_wsgiref.HandlerTests.testScheme -*graalpython.lib-python.3.test.test_wsgiref.HeaderTests.testExtras -*graalpython.lib-python.3.test.test_wsgiref.HeaderTests.testMappingInterface -*graalpython.lib-python.3.test.test_wsgiref.HeaderTests.testRequireList -*graalpython.lib-python.3.test.test_wsgiref.IntegrationTests.test_bytes_validation -*graalpython.lib-python.3.test.test_wsgiref.IntegrationTests.test_cp1252_url -*graalpython.lib-python.3.test.test_wsgiref.IntegrationTests.test_environ -*graalpython.lib-python.3.test.test_wsgiref.IntegrationTests.test_interrupted_write -*graalpython.lib-python.3.test.test_wsgiref.IntegrationTests.test_plain_hello -*graalpython.lib-python.3.test.test_wsgiref.IntegrationTests.test_request_length -*graalpython.lib-python.3.test.test_wsgiref.IntegrationTests.test_simple_validation_error -*graalpython.lib-python.3.test.test_wsgiref.IntegrationTests.test_status_validation_errors -*graalpython.lib-python.3.test.test_wsgiref.IntegrationTests.test_validated_hello -*graalpython.lib-python.3.test.test_wsgiref.IntegrationTests.test_wsgi_input -*graalpython.lib-python.3.test.test_wsgiref.UtilityTests.testAppURIs -*graalpython.lib-python.3.test.test_wsgiref.UtilityTests.testCrossDefaults -*graalpython.lib-python.3.test.test_wsgiref.UtilityTests.testDefaults -*graalpython.lib-python.3.test.test_wsgiref.UtilityTests.testFileWrapper -*graalpython.lib-python.3.test.test_wsgiref.UtilityTests.testGuessScheme -*graalpython.lib-python.3.test.test_wsgiref.UtilityTests.testHopByHop -*graalpython.lib-python.3.test.test_wsgiref.UtilityTests.testNormalizedShifts -*graalpython.lib-python.3.test.test_wsgiref.UtilityTests.testReqURIs -*graalpython.lib-python.3.test.test_wsgiref.UtilityTests.testSimpleShifts -*graalpython.lib-python.3.test.test_wsgiref.UtilityTests.test_filewrapper_getitem_deprecation +test.test_wsgiref.HandlerTests.testAbstractMethods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.HandlerTests.testBasicErrorOutput @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.HandlerTests.testBytesData @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.HandlerTests.testCGIEnviron @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.HandlerTests.testClientConnectionTerminations @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.HandlerTests.testCloseOnError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.HandlerTests.testContentLength @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.HandlerTests.testDontResetInternalStateOnException @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.HandlerTests.testEnviron @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.HandlerTests.testErrorAfterOutput @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.HandlerTests.testHeaderFormats @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.HandlerTests.testPartialWrite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.HandlerTests.testScheme @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.HeaderTests.testExtras @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.HeaderTests.testMappingInterface @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.HeaderTests.testRequireList @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.IntegrationTests.test_bytes_validation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.IntegrationTests.test_cp1252_url @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.IntegrationTests.test_environ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.IntegrationTests.test_plain_hello @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.IntegrationTests.test_request_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.IntegrationTests.test_simple_validation_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.IntegrationTests.test_status_validation_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.IntegrationTests.test_validated_hello @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.IntegrationTests.test_wsgi_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.UtilityTests.testAppURIs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.UtilityTests.testCrossDefaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.UtilityTests.testDefaults @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.UtilityTests.testFileWrapper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.UtilityTests.testGuessScheme @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.UtilityTests.testHopByHop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.UtilityTests.testNormalizedShifts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.UtilityTests.testReqURIs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_wsgiref.UtilityTests.testSimpleShifts @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xdrlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xdrlib.txt index f59e950ec8..700482a462 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xdrlib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xdrlib.txt @@ -1,6 +1,6 @@ -*graalpython.lib-python.3.test.test_xdrlib.ConversionErrorTest.test_double -*graalpython.lib-python.3.test.test_xdrlib.ConversionErrorTest.test_float -*graalpython.lib-python.3.test.test_xdrlib.ConversionErrorTest.test_pack_int -*graalpython.lib-python.3.test.test_xdrlib.ConversionErrorTest.test_pack_uint -*graalpython.lib-python.3.test.test_xdrlib.ConversionErrorTest.test_uhyper -*graalpython.lib-python.3.test.test_xdrlib.XDRTest.test_xdr +test.test_xdrlib.ConversionErrorTest.test_double @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xdrlib.ConversionErrorTest.test_float @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xdrlib.ConversionErrorTest.test_pack_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xdrlib.ConversionErrorTest.test_pack_uint @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xdrlib.ConversionErrorTest.test_uhyper @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xdrlib.XDRTest.test_xdr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xml_dom_minicompat.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xml_dom_minicompat.txt index fc919392cf..1a93088186 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xml_dom_minicompat.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xml_dom_minicompat.txt @@ -1,11 +1,11 @@ -*graalpython.lib-python.3.test.test_xml_dom_minicompat.EmptyNodeListTestCase.test_emptynodelist___add__ -*graalpython.lib-python.3.test.test_xml_dom_minicompat.EmptyNodeListTestCase.test_emptynodelist___radd__ -*graalpython.lib-python.3.test.test_xml_dom_minicompat.EmptyNodeListTestCase.test_emptynodelist_item -*graalpython.lib-python.3.test.test_xml_dom_minicompat.EmptyNodeListTestCase.test_emptynodelist_length -*graalpython.lib-python.3.test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist___add__ -*graalpython.lib-python.3.test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist___radd__ -*graalpython.lib-python.3.test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist_copy -*graalpython.lib-python.3.test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist_deepcopy -*graalpython.lib-python.3.test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist_item -*graalpython.lib-python.3.test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist_length -*graalpython.lib-python.3.test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist_pickle_roundtrip +test.test_xml_dom_minicompat.EmptyNodeListTestCase.test_emptynodelist___add__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_dom_minicompat.EmptyNodeListTestCase.test_emptynodelist___radd__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_dom_minicompat.EmptyNodeListTestCase.test_emptynodelist_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_dom_minicompat.EmptyNodeListTestCase.test_emptynodelist_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist___add__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist___radd__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist_deepcopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist_pickle_roundtrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xml_etree.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xml_etree.txt index 51409e16b1..d96d44019c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xml_etree.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xml_etree.txt @@ -1,182 +1,181 @@ -*graalpython.lib-python.3.test.test_xml_etree.BadElementPathTest.test_find_with_error -*graalpython.lib-python.3.test.test_xml_etree.BadElementPathTest.test_find_with_mutating -*graalpython.lib-python.3.test.test_xml_etree.BadElementPathTest.test_findall_with_error -*graalpython.lib-python.3.test.test_xml_etree.BadElementPathTest.test_findall_with_mutating -*graalpython.lib-python.3.test.test_xml_etree.BadElementPathTest.test_findtext_with_error -*graalpython.lib-python.3.test.test_xml_etree.BadElementPathTest.test_findtext_with_falsey_text_attribute -*graalpython.lib-python.3.test.test_xml_etree.BadElementPathTest.test_findtext_with_mutating -*graalpython.lib-python.3.test.test_xml_etree.BadElementPathTest.test_findtext_with_none_text_attribute -*graalpython.lib-python.3.test.test_xml_etree.BadElementTest.test_ass_subscr -*graalpython.lib-python.3.test.test_xml_etree.BadElementTest.test_element_get_tail -*graalpython.lib-python.3.test.test_xml_etree.BadElementTest.test_element_get_text -*graalpython.lib-python.3.test.test_xml_etree.BadElementTest.test_extend_mutable_list -*graalpython.lib-python.3.test.test_xml_etree.BadElementTest.test_extend_mutable_list2 -*graalpython.lib-python.3.test.test_xml_etree.BadElementTest.test_recursive_repr -*graalpython.lib-python.3.test.test_xml_etree.BadElementTest.test_remove_with_mutating -*graalpython.lib-python.3.test.test_xml_etree.BadElementTest.test_subscr -*graalpython.lib-python.3.test.test_xml_etree.BadElementTest.test_treebuilder_end -*graalpython.lib-python.3.test.test_xml_etree.BadElementTest.test_treebuilder_start -*graalpython.lib-python.3.test.test_xml_etree.BasicElementTest.test___copy__ -*graalpython.lib-python.3.test.test_xml_etree.BasicElementTest.test___deepcopy__ -*graalpython.lib-python.3.test.test_xml_etree.BasicElementTest.test___init__ -*graalpython.lib-python.3.test.test_xml_etree.BasicElementTest.test_augmentation_type_errors -*graalpython.lib-python.3.test.test_xml_etree.BasicElementTest.test_copy -*graalpython.lib-python.3.test.test_xml_etree.BasicElementTest.test_get_keyword_args -*graalpython.lib-python.3.test.test_xml_etree.BasicElementTest.test_pickle -*graalpython.lib-python.3.test.test_xml_etree.BasicElementTest.test_pickle_issue18997 -*graalpython.lib-python.3.test.test_xml_etree.BasicElementTest.test_weakref -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_39495_treebuilder_start -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_bug_1534630 -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_bug_200708_close -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_bug_200708_newline -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_bug_200709_default_namespace -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_bug_200709_element_comment -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_bug_200709_element_insert -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_bug_200709_iter_comment -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_bug_200709_register_namespace -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_bug_xmltoolkit21 -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_bug_xmltoolkit25 -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_bug_xmltoolkit28 -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_bug_xmltoolkit39 -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_bug_xmltoolkit54 -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_bug_xmltoolkit55 -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_bug_xmltoolkit60 -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_bug_xmltoolkit62 -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_bug_xmltoolkit63 -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_bug_xmltoolkitX1 -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_expat224_utf8_bug -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_expat224_utf8_bug_file -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_issue10777 -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_issue6233 -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_issue6565 -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_lost_elem -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_lost_tail -*graalpython.lib-python.3.test.test_xml_etree.BugsTest.test_lost_text -*graalpython.lib-python.3.test.test_xml_etree.C14NTest.test_c14n_exclusion -*graalpython.lib-python.3.test.test_xml_etree.C14NTest.test_simple_roundtrip -*graalpython.lib-python.3.test.test_xml_etree.C14NTest.test_xml_c14n2 -*graalpython.lib-python.3.test.test_xml_etree.ElementFindTest.test_bad_find -*graalpython.lib-python.3.test.test_xml_etree.ElementFindTest.test_find_simple -*graalpython.lib-python.3.test.test_xml_etree.ElementFindTest.test_find_through_ElementTree -*graalpython.lib-python.3.test.test_xml_etree.ElementFindTest.test_find_xpath -*graalpython.lib-python.3.test.test_xml_etree.ElementFindTest.test_findall -*graalpython.lib-python.3.test.test_xml_etree.ElementFindTest.test_findall_different_nsmaps -*graalpython.lib-python.3.test.test_xml_etree.ElementFindTest.test_findall_wildcard -*graalpython.lib-python.3.test.test_xml_etree.ElementFindTest.test_test_find_with_ns -*graalpython.lib-python.3.test.test_xml_etree.ElementIterTest.test_basic -*graalpython.lib-python.3.test.test_xml_etree.ElementIterTest.test_copy -*graalpython.lib-python.3.test.test_xml_etree.ElementIterTest.test_corners -*graalpython.lib-python.3.test.test_xml_etree.ElementIterTest.test_iter_by_tag -*graalpython.lib-python.3.test.test_xml_etree.ElementIterTest.test_pickle -*graalpython.lib-python.3.test.test_xml_etree.ElementSlicingTest.test_delslice -*graalpython.lib-python.3.test.test_xml_etree.ElementSlicingTest.test_getslice_negative_steps -*graalpython.lib-python.3.test.test_xml_etree.ElementSlicingTest.test_getslice_range -*graalpython.lib-python.3.test.test_xml_etree.ElementSlicingTest.test_getslice_single_index -*graalpython.lib-python.3.test.test_xml_etree.ElementSlicingTest.test_getslice_steps -*graalpython.lib-python.3.test.test_xml_etree.ElementSlicingTest.test_setslice_range -*graalpython.lib-python.3.test.test_xml_etree.ElementSlicingTest.test_setslice_single_index -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_attlist_default -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_attrib -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_cdata -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_children -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_copy -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_custom_builder -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_custom_builder_only_end_ns -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_doctype_public -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_dump_attribute_order -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_entity -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_file_init -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_html_empty_elems_serialization -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_indent -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_indent_level -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_indent_space -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_indent_space_caching -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_initialize_parser_without_target -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_interface -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_issue18347 -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_iterparse -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_makeelement -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_methods -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_namespace -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_parsefile -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_parseliteral -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_path_cache -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_processinginstruction -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_qname -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_set_attribute -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_tostring_default_namespace -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_tostring_default_namespace_different_namespace -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_tostring_default_namespace_original_no_namespace -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_tostring_no_xml_declaration -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_tostring_xml_declaration -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_tostring_xml_declaration_cases -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_tostring_xml_declaration_unicode_encoding -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_tostringlist_default_namespace -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_tostringlist_xml_declaration -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_tree_write_attribute_order -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_writefile -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_writestring -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTest.test_xpath_tokenizer -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTypeTest.test_Element_subclass_constructor -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTypeTest.test_Element_subclass_find -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTypeTest.test_Element_subclass_new_method -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTypeTest.test_Element_subclass_trivial -*graalpython.lib-python.3.test.test_xml_etree.ElementTreeTypeTest.test_istype -*graalpython.lib-python.3.test.test_xml_etree.IOTest.test_read_from_bytesio -*graalpython.lib-python.3.test.test_xml_etree.IOTest.test_read_from_stringio -*graalpython.lib-python.3.test.test_xml_etree.IOTest.test_read_from_user_binary_reader -*graalpython.lib-python.3.test.test_xml_etree.IOTest.test_read_from_user_text_reader -*graalpython.lib-python.3.test.test_xml_etree.IOTest.test_short_empty_elements -*graalpython.lib-python.3.test.test_xml_etree.IOTest.test_tostringlist_invariant -*graalpython.lib-python.3.test.test_xml_etree.IOTest.test_write_to_binary_file -*graalpython.lib-python.3.test.test_xml_etree.IOTest.test_write_to_binary_file_with_encoding -*graalpython.lib-python.3.test.test_xml_etree.IOTest.test_write_to_bytesio -*graalpython.lib-python.3.test.test_xml_etree.IOTest.test_write_to_filename -*graalpython.lib-python.3.test.test_xml_etree.IOTest.test_write_to_filename_as_unicode -*graalpython.lib-python.3.test.test_xml_etree.IOTest.test_write_to_filename_with_encoding -*graalpython.lib-python.3.test.test_xml_etree.IOTest.test_write_to_stringio -*graalpython.lib-python.3.test.test_xml_etree.IOTest.test_write_to_text_file -*graalpython.lib-python.3.test.test_xml_etree.IOTest.test_write_to_user_binary_writer -*graalpython.lib-python.3.test.test_xml_etree.IOTest.test_write_to_user_text_writer -*graalpython.lib-python.3.test.test_xml_etree.KeywordArgsTest.test_issue14818 -*graalpython.lib-python.3.test.test_xml_etree.ModuleTest.test_all -*graalpython.lib-python.3.test.test_xml_etree.ModuleTest.test_sanity -*graalpython.lib-python.3.test.test_xml_etree.NamespaceParseTest.test_find_with_namespace -*graalpython.lib-python.3.test.test_xml_etree.NoAcceleratorTest.test_correct_import_pyET -*graalpython.lib-python.3.test.test_xml_etree.ParseErrorTest.test_error_code -*graalpython.lib-python.3.test.test_xml_etree.ParseErrorTest.test_error_position -*graalpython.lib-python.3.test.test_xml_etree.ParseErrorTest.test_subclass -*graalpython.lib-python.3.test.test_xml_etree.TreeBuilderTest.test_builder_lookup_errors -*graalpython.lib-python.3.test.test_xml_etree.TreeBuilderTest.test_doctype -*graalpython.lib-python.3.test.test_xml_etree.TreeBuilderTest.test_dummy_builder -*graalpython.lib-python.3.test.test_xml_etree.TreeBuilderTest.test_element_factory -*graalpython.lib-python.3.test.test_xml_etree.TreeBuilderTest.test_element_factory_pure_python_subclass -*graalpython.lib-python.3.test.test_xml_etree.TreeBuilderTest.test_element_factory_subclass -*graalpython.lib-python.3.test.test_xml_etree.TreeBuilderTest.test_late_tail -*graalpython.lib-python.3.test.test_xml_etree.TreeBuilderTest.test_late_tail_mix_pi_comments -*graalpython.lib-python.3.test.test_xml_etree.TreeBuilderTest.test_subclass -*graalpython.lib-python.3.test.test_xml_etree.TreeBuilderTest.test_subclass_comment_pi -*graalpython.lib-python.3.test.test_xml_etree.TreeBuilderTest.test_treebuilder_comment -*graalpython.lib-python.3.test.test_xml_etree.TreeBuilderTest.test_treebuilder_elementfactory_none -*graalpython.lib-python.3.test.test_xml_etree.TreeBuilderTest.test_treebuilder_pi -*graalpython.lib-python.3.test.test_xml_etree.XIncludeTest.test_xinclude -*graalpython.lib-python.3.test.test_xml_etree.XIncludeTest.test_xinclude_default -*graalpython.lib-python.3.test.test_xml_etree.XIncludeTest.test_xinclude_failures -*graalpython.lib-python.3.test.test_xml_etree.XIncludeTest.test_xinclude_repeated -*graalpython.lib-python.3.test.test_xml_etree.XMLParserTest.test_constructor_args -*graalpython.lib-python.3.test.test_xml_etree.XMLParserTest.test_doctype_warning -*graalpython.lib-python.3.test.test_xml_etree.XMLParserTest.test_inherited_doctype -*graalpython.lib-python.3.test.test_xml_etree.XMLParserTest.test_parse_string -*graalpython.lib-python.3.test.test_xml_etree.XMLParserTest.test_subclass -*graalpython.lib-python.3.test.test_xml_etree.XMLParserTest.test_subclass_doctype -*graalpython.lib-python.3.test.test_xml_etree.XMLPullParserTest.test_events -*graalpython.lib-python.3.test.test_xml_etree.XMLPullParserTest.test_events_comment -*graalpython.lib-python.3.test.test_xml_etree.XMLPullParserTest.test_events_pi -*graalpython.lib-python.3.test.test_xml_etree.XMLPullParserTest.test_events_sequence -*graalpython.lib-python.3.test.test_xml_etree.XMLPullParserTest.test_feed_while_iterating -*graalpython.lib-python.3.test.test_xml_etree.XMLPullParserTest.test_ns_events -*graalpython.lib-python.3.test.test_xml_etree.XMLPullParserTest.test_ns_events_start -*graalpython.lib-python.3.test.test_xml_etree.XMLPullParserTest.test_ns_events_start_end -*graalpython.lib-python.3.test.test_xml_etree.XMLPullParserTest.test_simple_xml -*graalpython.lib-python.3.test.test_xml_etree.XMLPullParserTest.test_simple_xml_with_ns -*graalpython.lib-python.3.test.test_xml_etree.XMLPullParserTest.test_unknown_event +test.test_xml_etree.BadElementPathTest.test_find_with_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BadElementPathTest.test_find_with_mutating @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BadElementPathTest.test_findall_with_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BadElementPathTest.test_findall_with_mutating @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BadElementPathTest.test_findtext_with_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BadElementPathTest.test_findtext_with_falsey_text_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BadElementPathTest.test_findtext_with_mutating @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BadElementPathTest.test_findtext_with_none_text_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BadElementTest.test_ass_subscr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BadElementTest.test_element_get_tail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BadElementTest.test_element_get_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BadElementTest.test_extend_mutable_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BadElementTest.test_extend_mutable_list2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BadElementTest.test_recursive_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BadElementTest.test_remove_with_mutating @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BadElementTest.test_subscr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BadElementTest.test_treebuilder_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BadElementTest.test_treebuilder_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BasicElementTest.test___copy__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BasicElementTest.test___deepcopy__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BasicElementTest.test___init__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BasicElementTest.test_augmentation_type_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BasicElementTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +!test.test_xml_etree.BasicElementTest.test_cyclic_gc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BasicElementTest.test_get_keyword_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BasicElementTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BasicElementTest.test_pickle_issue18997 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BasicElementTest.test_weakref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_39495_treebuilder_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_bug_1534630 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_bug_200708_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_bug_200708_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_bug_200709_default_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_bug_200709_element_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_bug_200709_element_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_bug_200709_iter_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_bug_200709_register_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkit21 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkit25 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkit28 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkit39 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkit54 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkit55 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkit60 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkit62 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkit63 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkitX1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_expat224_utf8_bug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_expat224_utf8_bug_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_issue10777 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_issue6233 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_issue6565 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_lost_tail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.BugsTest.test_lost_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.C14NTest.test_c14n_exclusion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.C14NTest.test_simple_roundtrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementFindTest.test_bad_find @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementFindTest.test_find_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementFindTest.test_find_through_ElementTree @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementFindTest.test_find_xpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementFindTest.test_findall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementFindTest.test_findall_different_nsmaps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementFindTest.test_findall_wildcard @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementFindTest.test_test_find_with_ns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementIterTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementIterTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementIterTest.test_corners @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementIterTest.test_iter_by_tag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementIterTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementSlicingTest.test_delslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementSlicingTest.test_getslice_negative_steps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementSlicingTest.test_getslice_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementSlicingTest.test_getslice_single_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementSlicingTest.test_getslice_steps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementSlicingTest.test_setslice_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementSlicingTest.test_setslice_single_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_attlist_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_attrib @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_cdata @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_children @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_custom_builder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_custom_builder_only_end_ns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_doctype_public @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_dump_attribute_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_entity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_file_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_html_empty_elems_serialization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_indent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_indent_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_indent_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_indent_space_caching @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_initialize_parser_without_target @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_interface @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_issue18347 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_iterparse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_makeelement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_parsefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_parseliteral @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_path_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_processinginstruction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_qname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_set_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_tostring_default_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_tostring_default_namespace_different_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_tostring_default_namespace_original_no_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_tostring_no_xml_declaration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_tostring_xml_declaration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_tostring_xml_declaration_cases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_tostring_xml_declaration_unicode_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_tostringlist_default_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_tostringlist_xml_declaration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_tree_write_attribute_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_writefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_writestring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTest.test_xpath_tokenizer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTypeTest.test_Element_subclass_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTypeTest.test_Element_subclass_find @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTypeTest.test_Element_subclass_new_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTypeTest.test_Element_subclass_trivial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ElementTreeTypeTest.test_istype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.IOTest.test_read_from_bytesio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.IOTest.test_read_from_stringio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.IOTest.test_read_from_user_binary_reader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.IOTest.test_read_from_user_text_reader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.IOTest.test_short_empty_elements @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.IOTest.test_tostringlist_invariant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.IOTest.test_write_to_binary_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xml_etree.IOTest.test_write_to_binary_file_with_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xml_etree.IOTest.test_write_to_bytesio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.IOTest.test_write_to_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xml_etree.IOTest.test_write_to_filename_as_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xml_etree.IOTest.test_write_to_filename_with_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xml_etree.IOTest.test_write_to_stringio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.IOTest.test_write_to_text_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xml_etree.IOTest.test_write_to_user_binary_writer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.IOTest.test_write_to_user_text_writer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.KeywordArgsTest.test_issue14818 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ModuleTest.test_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ModuleTest.test_sanity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.NamespaceParseTest.test_find_with_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.NoAcceleratorTest.test_correct_import_pyET @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ParseErrorTest.test_error_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ParseErrorTest.test_error_position @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.ParseErrorTest.test_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.TreeBuilderTest.test_builder_lookup_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.TreeBuilderTest.test_doctype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.TreeBuilderTest.test_dummy_builder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.TreeBuilderTest.test_element_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.TreeBuilderTest.test_element_factory_pure_python_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.TreeBuilderTest.test_element_factory_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.TreeBuilderTest.test_late_tail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.TreeBuilderTest.test_late_tail_mix_pi_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.TreeBuilderTest.test_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.TreeBuilderTest.test_subclass_comment_pi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.TreeBuilderTest.test_treebuilder_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.TreeBuilderTest.test_treebuilder_elementfactory_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.TreeBuilderTest.test_treebuilder_pi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XIncludeTest.test_xinclude @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XIncludeTest.test_xinclude_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XIncludeTest.test_xinclude_failures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XIncludeTest.test_xinclude_repeated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XMLParserTest.test_constructor_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XMLParserTest.test_doctype_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XMLParserTest.test_inherited_doctype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XMLParserTest.test_parse_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XMLParserTest.test_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XMLParserTest.test_subclass_doctype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XMLPullParserTest.test_events @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XMLPullParserTest.test_events_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XMLPullParserTest.test_events_pi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XMLPullParserTest.test_events_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XMLPullParserTest.test_feed_while_iterating @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XMLPullParserTest.test_ns_events @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XMLPullParserTest.test_ns_events_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XMLPullParserTest.test_ns_events_start_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XMLPullParserTest.test_simple_xml @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XMLPullParserTest.test_simple_xml_with_ns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree.XMLPullParserTest.test_unknown_event @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xml_etree_c.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xml_etree_c.txt index f982607e73..2f4d6db93e 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xml_etree_c.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xml_etree_c.txt @@ -1,199 +1,181 @@ -*graalpython.lib-python.3.test.test_xml_etree_c.BadElementPathTest.test_find_with_error -*graalpython.lib-python.3.test.test_xml_etree_c.BadElementPathTest.test_find_with_mutating -*graalpython.lib-python.3.test.test_xml_etree_c.BadElementPathTest.test_findall_with_error -*graalpython.lib-python.3.test.test_xml_etree_c.BadElementPathTest.test_findall_with_mutating -*graalpython.lib-python.3.test.test_xml_etree_c.BadElementPathTest.test_findtext_with_error -*graalpython.lib-python.3.test.test_xml_etree_c.BadElementPathTest.test_findtext_with_falsey_text_attribute -*graalpython.lib-python.3.test.test_xml_etree_c.BadElementPathTest.test_findtext_with_mutating -*graalpython.lib-python.3.test.test_xml_etree_c.BadElementPathTest.test_findtext_with_none_text_attribute -*graalpython.lib-python.3.test.test_xml_etree_c.BadElementTest.test_ass_subscr -*graalpython.lib-python.3.test.test_xml_etree_c.BadElementTest.test_element_get_tail -*graalpython.lib-python.3.test.test_xml_etree_c.BadElementTest.test_element_get_text -*graalpython.lib-python.3.test.test_xml_etree_c.BadElementTest.test_extend_mutable_list -*graalpython.lib-python.3.test.test_xml_etree_c.BadElementTest.test_extend_mutable_list2 -*graalpython.lib-python.3.test.test_xml_etree_c.BadElementTest.test_recursive_repr -*graalpython.lib-python.3.test.test_xml_etree_c.BadElementTest.test_remove_with_mutating -*graalpython.lib-python.3.test.test_xml_etree_c.BadElementTest.test_subscr -*graalpython.lib-python.3.test.test_xml_etree_c.BadElementTest.test_treebuilder_end -*graalpython.lib-python.3.test.test_xml_etree_c.BadElementTest.test_treebuilder_start -*graalpython.lib-python.3.test.test_xml_etree_c.BasicElementTest.test___copy__ -*graalpython.lib-python.3.test.test_xml_etree_c.BasicElementTest.test___deepcopy__ -*graalpython.lib-python.3.test.test_xml_etree_c.BasicElementTest.test___init__ -*graalpython.lib-python.3.test.test_xml_etree_c.BasicElementTest.test_augmentation_type_errors -*graalpython.lib-python.3.test.test_xml_etree_c.BasicElementTest.test_copy -*graalpython.lib-python.3.test.test_xml_etree_c.BasicElementTest.test_get_keyword_args -*graalpython.lib-python.3.test.test_xml_etree_c.BasicElementTest.test_pickle -*graalpython.lib-python.3.test.test_xml_etree_c.BasicElementTest.test_pickle_issue18997 -*graalpython.lib-python.3.test.test_xml_etree_c.BasicElementTest.test_weakref -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_39495_treebuilder_start -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_bug_1534630 -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_bug_200708_close -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_bug_200708_newline -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_bug_200709_default_namespace -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_bug_200709_element_comment -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_bug_200709_element_insert -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_bug_200709_iter_comment -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_bug_200709_register_namespace -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit21 -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit25 -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit28 -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit39 -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit54 -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit55 -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit60 -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit62 -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit63 -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_bug_xmltoolkitX1 -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_expat224_utf8_bug -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_expat224_utf8_bug_file -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_issue10777 -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_issue6233 -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_issue6565 -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_lost_elem -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_lost_tail -*graalpython.lib-python.3.test.test_xml_etree_c.BugsTest.test_lost_text -*graalpython.lib-python.3.test.test_xml_etree_c.C14NTest.test_c14n_exclusion -*graalpython.lib-python.3.test.test_xml_etree_c.C14NTest.test_simple_roundtrip -*graalpython.lib-python.3.test.test_xml_etree_c.C14NTest.test_xml_c14n2 -*graalpython.lib-python.3.test.test_xml_etree_c.ElementFindTest.test_bad_find -*graalpython.lib-python.3.test.test_xml_etree_c.ElementFindTest.test_find_simple -*graalpython.lib-python.3.test.test_xml_etree_c.ElementFindTest.test_find_through_ElementTree -*graalpython.lib-python.3.test.test_xml_etree_c.ElementFindTest.test_find_xpath -*graalpython.lib-python.3.test.test_xml_etree_c.ElementFindTest.test_findall -*graalpython.lib-python.3.test.test_xml_etree_c.ElementFindTest.test_findall_different_nsmaps -*graalpython.lib-python.3.test.test_xml_etree_c.ElementFindTest.test_findall_wildcard -*graalpython.lib-python.3.test.test_xml_etree_c.ElementFindTest.test_test_find_with_ns -*graalpython.lib-python.3.test.test_xml_etree_c.ElementIterTest.test_basic -*graalpython.lib-python.3.test.test_xml_etree_c.ElementIterTest.test_copy -*graalpython.lib-python.3.test.test_xml_etree_c.ElementIterTest.test_corners -*graalpython.lib-python.3.test.test_xml_etree_c.ElementIterTest.test_iter_by_tag -*graalpython.lib-python.3.test.test_xml_etree_c.ElementIterTest.test_pickle -*graalpython.lib-python.3.test.test_xml_etree_c.ElementSlicingTest.test_delslice -*graalpython.lib-python.3.test.test_xml_etree_c.ElementSlicingTest.test_getslice_negative_steps -*graalpython.lib-python.3.test.test_xml_etree_c.ElementSlicingTest.test_getslice_range -*graalpython.lib-python.3.test.test_xml_etree_c.ElementSlicingTest.test_getslice_single_index -*graalpython.lib-python.3.test.test_xml_etree_c.ElementSlicingTest.test_getslice_steps -*graalpython.lib-python.3.test.test_xml_etree_c.ElementSlicingTest.test_setslice_range -*graalpython.lib-python.3.test.test_xml_etree_c.ElementSlicingTest.test_setslice_single_index -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_attlist_default -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_attrib -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_cdata -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_children -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_copy -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_custom_builder -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_custom_builder_only_end_ns -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_doctype_public -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_dump_attribute_order -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_entity -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_file_init -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_html_empty_elems_serialization -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_indent -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_indent_level -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_indent_space -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_indent_space_caching -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_initialize_parser_without_target -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_interface -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_issue18347 -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_iterparse -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_makeelement -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_methods -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_namespace -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_parsefile -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_parseliteral -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_path_cache -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_processinginstruction -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_qname -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_set_attribute -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_tostring_default_namespace -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_tostring_default_namespace_different_namespace -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_tostring_default_namespace_original_no_namespace -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_tostring_no_xml_declaration -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_tostring_xml_declaration -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_tostring_xml_declaration_cases -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_tostring_xml_declaration_unicode_encoding -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_tostringlist_default_namespace -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_tostringlist_xml_declaration -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_tree_write_attribute_order -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_writefile -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_writestring -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTest.test_xpath_tokenizer -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTypeTest.test_Element_subclass_constructor -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTypeTest.test_Element_subclass_find -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTypeTest.test_Element_subclass_new_method -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTypeTest.test_Element_subclass_trivial -*graalpython.lib-python.3.test.test_xml_etree_c.ElementTreeTypeTest.test_istype -*graalpython.lib-python.3.test.test_xml_etree_c.IOTest.test_read_from_bytesio -*graalpython.lib-python.3.test.test_xml_etree_c.IOTest.test_read_from_stringio -*graalpython.lib-python.3.test.test_xml_etree_c.IOTest.test_read_from_user_binary_reader -*graalpython.lib-python.3.test.test_xml_etree_c.IOTest.test_read_from_user_text_reader -*graalpython.lib-python.3.test.test_xml_etree_c.IOTest.test_short_empty_elements -*graalpython.lib-python.3.test.test_xml_etree_c.IOTest.test_tostringlist_invariant -*graalpython.lib-python.3.test.test_xml_etree_c.IOTest.test_write_to_binary_file -*graalpython.lib-python.3.test.test_xml_etree_c.IOTest.test_write_to_binary_file_with_encoding -*graalpython.lib-python.3.test.test_xml_etree_c.IOTest.test_write_to_bytesio -*graalpython.lib-python.3.test.test_xml_etree_c.IOTest.test_write_to_filename -*graalpython.lib-python.3.test.test_xml_etree_c.IOTest.test_write_to_filename_as_unicode -*graalpython.lib-python.3.test.test_xml_etree_c.IOTest.test_write_to_filename_with_encoding -*graalpython.lib-python.3.test.test_xml_etree_c.IOTest.test_write_to_stringio -*graalpython.lib-python.3.test.test_xml_etree_c.IOTest.test_write_to_text_file -*graalpython.lib-python.3.test.test_xml_etree_c.IOTest.test_write_to_user_binary_writer -*graalpython.lib-python.3.test.test_xml_etree_c.IOTest.test_write_to_user_text_writer -*graalpython.lib-python.3.test.test_xml_etree_c.KeywordArgsTest.test_issue14818 -*graalpython.lib-python.3.test.test_xml_etree_c.MiscTests.test_bpo_31728 -*graalpython.lib-python.3.test.test_xml_etree_c.MiscTests.test_del_attribute -*graalpython.lib-python.3.test.test_xml_etree_c.MiscTests.test_dict_disappearing_during_get_item -*graalpython.lib-python.3.test.test_xml_etree_c.MiscTests.test_iterparse_leaks -*graalpython.lib-python.3.test.test_xml_etree_c.MiscTests.test_length_overflow -*graalpython.lib-python.3.test.test_xml_etree_c.MiscTests.test_parser_ref_cycle -*graalpython.lib-python.3.test.test_xml_etree_c.MiscTests.test_setstate_leaks -*graalpython.lib-python.3.test.test_xml_etree_c.MiscTests.test_trashcan -*graalpython.lib-python.3.test.test_xml_etree_c.MiscTests.test_uninitialized_parser -*graalpython.lib-python.3.test.test_xml_etree_c.MiscTests.test_xmlpullparser_leaks -*graalpython.lib-python.3.test.test_xml_etree_c.ModuleTest.test_all -*graalpython.lib-python.3.test.test_xml_etree_c.ModuleTest.test_sanity -*graalpython.lib-python.3.test.test_xml_etree_c.NamespaceParseTest.test_find_with_namespace -*graalpython.lib-python.3.test.test_xml_etree_c.NoAcceleratorTest.test_correct_import_pyET -*graalpython.lib-python.3.test.test_xml_etree_c.ParseErrorTest.test_error_code -*graalpython.lib-python.3.test.test_xml_etree_c.ParseErrorTest.test_error_position -*graalpython.lib-python.3.test.test_xml_etree_c.ParseErrorTest.test_subclass -*graalpython.lib-python.3.test.test_xml_etree_c.SizeofTest.test_element -*graalpython.lib-python.3.test.test_xml_etree_c.SizeofTest.test_element_with_attrib -*graalpython.lib-python.3.test.test_xml_etree_c.SizeofTest.test_element_with_children -*graalpython.lib-python.3.test.test_xml_etree_c.TestAcceleratorImported.test_correct_import_cET -*graalpython.lib-python.3.test.test_xml_etree_c.TestAcceleratorImported.test_correct_import_cET_alias -*graalpython.lib-python.3.test.test_xml_etree_c.TestAcceleratorImported.test_parser_comes_from_C -*graalpython.lib-python.3.test.test_xml_etree_c.TestAliasWorking.test_alias_working -*graalpython.lib-python.3.test.test_xml_etree_c.TreeBuilderTest.test_builder_lookup_errors -*graalpython.lib-python.3.test.test_xml_etree_c.TreeBuilderTest.test_doctype -*graalpython.lib-python.3.test.test_xml_etree_c.TreeBuilderTest.test_dummy_builder -*graalpython.lib-python.3.test.test_xml_etree_c.TreeBuilderTest.test_element_factory -*graalpython.lib-python.3.test.test_xml_etree_c.TreeBuilderTest.test_element_factory_pure_python_subclass -*graalpython.lib-python.3.test.test_xml_etree_c.TreeBuilderTest.test_element_factory_subclass -*graalpython.lib-python.3.test.test_xml_etree_c.TreeBuilderTest.test_late_tail -*graalpython.lib-python.3.test.test_xml_etree_c.TreeBuilderTest.test_late_tail_mix_pi_comments -*graalpython.lib-python.3.test.test_xml_etree_c.TreeBuilderTest.test_subclass -*graalpython.lib-python.3.test.test_xml_etree_c.TreeBuilderTest.test_subclass_comment_pi -*graalpython.lib-python.3.test.test_xml_etree_c.TreeBuilderTest.test_treebuilder_comment -*graalpython.lib-python.3.test.test_xml_etree_c.TreeBuilderTest.test_treebuilder_elementfactory_none -*graalpython.lib-python.3.test.test_xml_etree_c.TreeBuilderTest.test_treebuilder_pi -*graalpython.lib-python.3.test.test_xml_etree_c.XIncludeTest.test_xinclude -*graalpython.lib-python.3.test.test_xml_etree_c.XIncludeTest.test_xinclude_default -*graalpython.lib-python.3.test.test_xml_etree_c.XIncludeTest.test_xinclude_failures -*graalpython.lib-python.3.test.test_xml_etree_c.XIncludeTest.test_xinclude_repeated -*graalpython.lib-python.3.test.test_xml_etree_c.XMLParserTest.test_constructor_args -*graalpython.lib-python.3.test.test_xml_etree_c.XMLParserTest.test_doctype_warning -*graalpython.lib-python.3.test.test_xml_etree_c.XMLParserTest.test_inherited_doctype -*graalpython.lib-python.3.test.test_xml_etree_c.XMLParserTest.test_parse_string -*graalpython.lib-python.3.test.test_xml_etree_c.XMLParserTest.test_subclass -*graalpython.lib-python.3.test.test_xml_etree_c.XMLParserTest.test_subclass_doctype -*graalpython.lib-python.3.test.test_xml_etree_c.XMLPullParserTest.test_events -*graalpython.lib-python.3.test.test_xml_etree_c.XMLPullParserTest.test_events_comment -*graalpython.lib-python.3.test.test_xml_etree_c.XMLPullParserTest.test_events_pi -*graalpython.lib-python.3.test.test_xml_etree_c.XMLPullParserTest.test_events_sequence -*graalpython.lib-python.3.test.test_xml_etree_c.XMLPullParserTest.test_feed_while_iterating -*graalpython.lib-python.3.test.test_xml_etree_c.XMLPullParserTest.test_ns_events -*graalpython.lib-python.3.test.test_xml_etree_c.XMLPullParserTest.test_ns_events_start -*graalpython.lib-python.3.test.test_xml_etree_c.XMLPullParserTest.test_ns_events_start_end -*graalpython.lib-python.3.test.test_xml_etree_c.XMLPullParserTest.test_simple_xml -*graalpython.lib-python.3.test.test_xml_etree_c.XMLPullParserTest.test_simple_xml_with_ns -*graalpython.lib-python.3.test.test_xml_etree_c.XMLPullParserTest.test_unknown_event +test.test_xml_etree_c.BadElementPathTest.test_find_with_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BadElementPathTest.test_find_with_mutating @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BadElementPathTest.test_findall_with_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BadElementPathTest.test_findall_with_mutating @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BadElementPathTest.test_findtext_with_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BadElementPathTest.test_findtext_with_falsey_text_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BadElementPathTest.test_findtext_with_mutating @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BadElementPathTest.test_findtext_with_none_text_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BadElementTest.test_ass_subscr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BadElementTest.test_element_get_tail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BadElementTest.test_element_get_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BadElementTest.test_extend_mutable_list @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BadElementTest.test_extend_mutable_list2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BadElementTest.test_recursive_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BadElementTest.test_remove_with_mutating @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BadElementTest.test_subscr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BadElementTest.test_treebuilder_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BadElementTest.test_treebuilder_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BasicElementTest.test___copy__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BasicElementTest.test___deepcopy__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BasicElementTest.test___init__ @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BasicElementTest.test_augmentation_type_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BasicElementTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +!test.test_xml_etree_c.BasicElementTest.test_cyclic_gc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BasicElementTest.test_get_keyword_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BasicElementTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BasicElementTest.test_pickle_issue18997 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BasicElementTest.test_weakref @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_39495_treebuilder_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_bug_1534630 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_bug_200708_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_bug_200708_newline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_bug_200709_default_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_bug_200709_element_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_bug_200709_element_insert @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_bug_200709_iter_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_bug_200709_register_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit21 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit25 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit28 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit39 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit54 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit55 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit60 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit62 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit63 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkitX1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_expat224_utf8_bug @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_expat224_utf8_bug_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_issue10777 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_issue6233 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_issue6565 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_lost_tail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.BugsTest.test_lost_text @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.C14NTest.test_c14n_exclusion @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.C14NTest.test_simple_roundtrip @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementFindTest.test_bad_find @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementFindTest.test_find_simple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementFindTest.test_find_through_ElementTree @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementFindTest.test_find_xpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementFindTest.test_findall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementFindTest.test_findall_different_nsmaps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementFindTest.test_findall_wildcard @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementFindTest.test_test_find_with_ns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementIterTest.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementIterTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementIterTest.test_corners @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementIterTest.test_iter_by_tag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementIterTest.test_pickle @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementSlicingTest.test_delslice @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementSlicingTest.test_getslice_negative_steps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementSlicingTest.test_getslice_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementSlicingTest.test_getslice_single_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementSlicingTest.test_getslice_steps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementSlicingTest.test_setslice_range @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementSlicingTest.test_setslice_single_index @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_attlist_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_attrib @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_cdata @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_children @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_custom_builder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_custom_builder_only_end_ns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_doctype_public @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_dump_attribute_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_entity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_file_init @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_html_empty_elems_serialization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_indent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_indent_level @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_indent_space @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_indent_space_caching @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_initialize_parser_without_target @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_interface @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_issue18347 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_iterparse @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_makeelement @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_methods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_parsefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_parseliteral @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_path_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_processinginstruction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_qname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_set_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_tostring_default_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_tostring_default_namespace_different_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_tostring_default_namespace_original_no_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_tostring_no_xml_declaration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_tostring_xml_declaration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_tostring_xml_declaration_cases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_tostring_xml_declaration_unicode_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_tostringlist_default_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_tostringlist_xml_declaration @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_tree_write_attribute_order @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_writefile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_writestring @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTest.test_xpath_tokenizer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTypeTest.test_Element_subclass_constructor @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTypeTest.test_Element_subclass_find @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTypeTest.test_Element_subclass_new_method @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTypeTest.test_Element_subclass_trivial @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ElementTreeTypeTest.test_istype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.IOTest.test_read_from_bytesio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.IOTest.test_read_from_stringio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.IOTest.test_read_from_user_binary_reader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.IOTest.test_read_from_user_text_reader @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.IOTest.test_short_empty_elements @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.IOTest.test_tostringlist_invariant @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.IOTest.test_write_to_binary_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xml_etree_c.IOTest.test_write_to_binary_file_with_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xml_etree_c.IOTest.test_write_to_bytesio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.IOTest.test_write_to_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xml_etree_c.IOTest.test_write_to_filename_as_unicode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xml_etree_c.IOTest.test_write_to_filename_with_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xml_etree_c.IOTest.test_write_to_stringio @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.IOTest.test_write_to_text_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xml_etree_c.IOTest.test_write_to_user_binary_writer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.IOTest.test_write_to_user_text_writer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.KeywordArgsTest.test_issue14818 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ModuleTest.test_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ModuleTest.test_sanity @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.NamespaceParseTest.test_find_with_namespace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.NoAcceleratorTest.test_correct_import_pyET @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ParseErrorTest.test_error_code @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ParseErrorTest.test_error_position @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.ParseErrorTest.test_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.TreeBuilderTest.test_builder_lookup_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.TreeBuilderTest.test_doctype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.TreeBuilderTest.test_dummy_builder @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.TreeBuilderTest.test_element_factory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.TreeBuilderTest.test_element_factory_pure_python_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.TreeBuilderTest.test_element_factory_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.TreeBuilderTest.test_late_tail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.TreeBuilderTest.test_late_tail_mix_pi_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.TreeBuilderTest.test_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.TreeBuilderTest.test_subclass_comment_pi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.TreeBuilderTest.test_treebuilder_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.TreeBuilderTest.test_treebuilder_elementfactory_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.TreeBuilderTest.test_treebuilder_pi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XIncludeTest.test_xinclude @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XIncludeTest.test_xinclude_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XIncludeTest.test_xinclude_failures @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XIncludeTest.test_xinclude_repeated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XMLParserTest.test_constructor_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XMLParserTest.test_doctype_warning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XMLParserTest.test_inherited_doctype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XMLParserTest.test_parse_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XMLParserTest.test_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XMLParserTest.test_subclass_doctype @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XMLPullParserTest.test_events @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XMLPullParserTest.test_events_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XMLPullParserTest.test_events_pi @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XMLPullParserTest.test_events_sequence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XMLPullParserTest.test_feed_while_iterating @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XMLPullParserTest.test_ns_events @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XMLPullParserTest.test_ns_events_start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XMLPullParserTest.test_ns_events_start_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XMLPullParserTest.test_simple_xml @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XMLPullParserTest.test_simple_xml_with_ns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xml_etree_c.XMLPullParserTest.test_unknown_event @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xmlrpc.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xmlrpc.txt new file mode 100644 index 0000000000..e881500fe0 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xmlrpc.txt @@ -0,0 +1,93 @@ +test.test_xmlrpc.BinaryTestCase.test_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.BinaryTestCase.test_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.BinaryTestCase.test_string @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.CGIHandlerTestCase.test_cgi_get @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.CGIHandlerTestCase.test_cgi_xmlrpc_response @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.DateTimeTestCase.test_comparison @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.DateTimeTestCase.test_datetime_datetime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.DateTimeTestCase.test_decode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.DateTimeTestCase.test_default @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.DateTimeTestCase.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.DateTimeTestCase.test_time @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.DateTimeTestCase.test_time_struct @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.DateTimeTestCase.test_time_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.FailingServerTestCase.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.FailingServerTestCase.test_fail_no_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.FailingServerTestCase.test_fail_with_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.FaultTestCase.test_dotted_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.FaultTestCase.test_dump_fault @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.FaultTestCase.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.GzipServerTestCase.test_bad_gzip_request @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.GzipServerTestCase.test_gzip_request @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.GzipServerTestCase.test_gzip_response @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.GzipUtilTestCase.test_gzip_decode_limit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.HeadersServerTestCase.test_header @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.HeadersServerTestCase.test_header_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.HeadersServerTestCase.test_header_items @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.HeadersServerTestCase.test_header_many @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.HeadersServerTestCase.test_header_tuple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.HelperTestCase.test_escape @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.KeepaliveServerTestCase1.test_two @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.KeepaliveServerTestCase2.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.KeepaliveServerTestCase2.test_transport @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_empty_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_empty_path_fragment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_empty_path_query @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_invalid_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_path1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_path2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_path3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_path_fragment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_path_query @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_path_query_fragment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_root_path @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.ServerProxyTestCase.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.ServerProxyTestCase.test_transport @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.SimpleServerEncodingTestCase.test_server_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_404 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_allow_dotted_names_true @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_client_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_context_manager @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_context_manager_method_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_dotted_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_introspection1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_introspection2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_introspection3 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_introspection4 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_multicall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_non_existing_multicall @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_nonascii @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_nonascii_methodname @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_partial_post @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_simple1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_unicode_host @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.SimpleXMLRPCDispatcherTestCase.test_call_dispatch_func @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.SimpleXMLRPCDispatcherTestCase.test_call_instance_func @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.SimpleXMLRPCDispatcherTestCase.test_call_registered_func @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.SimpleXMLRPCDispatcherTestCase.test_cannot_locate_func @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.SimpleXMLRPCDispatcherTestCase.test_instance_has_no_func @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.SimpleXMLRPCDispatcherTestCase.test_registered_func_is_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.UseBuiltinTypesTestCase.test_cgihandler_has_use_builtin_types_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.UseBuiltinTypesTestCase.test_use_builtin_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.UseBuiltinTypesTestCase.test_xmlrpcserver_has_use_builtin_types_flag @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_bug_1164912 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_datetime_before_1900 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_bad_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_bare_datetime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_big_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_big_long @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_double @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_load @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_recursive_dict @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_recursive_seq @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_get_host_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_keepalive_disconnect @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_limit_int @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_load_extension_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_load_standard_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_loads_unsupported @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_newstyle_class @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_xmlrpc.XMLRPCTestCase.test_ssl_presence @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xmlrpc_net.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xmlrpc_net.txt deleted file mode 100644 index 03096b441e..0000000000 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_xmlrpc_net.txt +++ /dev/null @@ -1,2 +0,0 @@ -*graalpython.lib-python.3.test.test_xmlrpc_net.PythonBuildersTest.test_python_builders -*graalpython.lib-python.3.test.test_xmlrpc_net.TestMain.test_main diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_yield_from.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_yield_from.txt index 46b83da2bc..25a0477e45 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_yield_from.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_yield_from.txt @@ -1,33 +1,33 @@ -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_attempted_yield_from_loop -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_attempting_to_send_to_non_generator -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_broken_getattr_handling -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_catching_exception_from_subgen_and_returning -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_close_with_cleared_frame -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_conversion_of_sendNone_to_next -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_custom_iterator_return -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_delegating_close -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_delegating_generators_claim_to_be_running -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_delegating_throw -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_delegating_throw_to_non_generator -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_delegation_of_close_to_non_generator -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_delegation_of_initial_next_to_subgenerator -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_delegation_of_next_call_to_subgenerator -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_delegation_of_next_to_non_generator -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_delegation_of_send -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_delegator_is_visible_to_debugger -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_exception_in_initial_next_call -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_exception_value_crash -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_generator_return_value -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_handing_exception_while_delegating_close -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_handling_exception_while_delegating_send -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_next_and_return_with_value -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_raising_exception_in_delegated_next_call -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_raising_exception_in_initial_next_call -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_returning_value_from_delegated_throw -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_send_and_return_with_value -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_send_tuple_with_custom_generator -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_throwing_GeneratorExit_into_subgen_that_raises -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_throwing_GeneratorExit_into_subgen_that_returns -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_throwing_GeneratorExit_into_subgenerator_that_yields -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_value_attribute_of_StopIteration_exception -*graalpython.lib-python.3.test.test_yield_from.TestPEP380Operation.test_yield_from_empty +test.test_yield_from.TestPEP380Operation.test_attempted_yield_from_loop @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_attempting_to_send_to_non_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_broken_getattr_handling @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_catching_exception_from_subgen_and_returning @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_close_with_cleared_frame @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_conversion_of_sendNone_to_next @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_custom_iterator_return @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_delegating_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_delegating_generators_claim_to_be_running @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_delegating_throw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_delegating_throw_to_non_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_delegation_of_close_to_non_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_delegation_of_initial_next_to_subgenerator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_delegation_of_next_call_to_subgenerator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_delegation_of_next_to_non_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_delegation_of_send @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_delegator_is_visible_to_debugger @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_exception_in_initial_next_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_exception_value_crash @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_generator_return_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_handing_exception_while_delegating_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_handling_exception_while_delegating_send @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_next_and_return_with_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_raising_exception_in_delegated_next_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_raising_exception_in_initial_next_call @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_returning_value_from_delegated_throw @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_send_and_return_with_value @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_send_tuple_with_custom_generator @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_throwing_GeneratorExit_into_subgen_that_raises @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_throwing_GeneratorExit_into_subgen_that_returns @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_throwing_GeneratorExit_into_subgenerator_that_yields @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_value_attribute_of_StopIteration_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_yield_from.TestPEP380Operation.test_yield_from_empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipapp.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipapp.txt index 6f6b3f5104..f36b62bd26 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipapp.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipapp.txt @@ -1,31 +1,31 @@ -*graalpython.lib-python.3.test.test_zipapp.ZipAppCmdlineTest.test_cmdline_copy -*graalpython.lib-python.3.test.test_zipapp.ZipAppCmdlineTest.test_cmdline_copy_change_main -*graalpython.lib-python.3.test.test_zipapp.ZipAppCmdlineTest.test_cmdline_copy_inplace -*graalpython.lib-python.3.test.test_zipapp.ZipAppCmdlineTest.test_cmdline_create -*graalpython.lib-python.3.test.test_zipapp.ZipAppCmdlineTest.test_info_command -*graalpython.lib-python.3.test.test_zipapp.ZipAppCmdlineTest.test_info_error -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_content_of_copied_archive -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_create_archive -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_create_archive_default_target -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_create_archive_filter_exclude_dir -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_create_archive_with_compression -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_create_archive_with_filter -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_create_archive_with_pathlib -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_create_archive_with_subdirs -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_custom_interpreter -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_default_no_shebang -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_main_and_main_py -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_main_only_written_once -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_main_validation -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_main_written -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_modify_shebang -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_no_main -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_no_shebang_is_not_executable -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_pack_to_fileobj -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_read_from_fileobj -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_read_from_pathobj -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_read_missing_shebang -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_read_shebang -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_remove_shebang -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_shebang_is_executable -*graalpython.lib-python.3.test.test_zipapp.ZipAppTest.test_write_shebang_to_fileobj +test.test_zipapp.ZipAppCmdlineTest.test_cmdline_copy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppCmdlineTest.test_cmdline_copy_change_main @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppCmdlineTest.test_cmdline_copy_inplace @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppCmdlineTest.test_cmdline_create @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppCmdlineTest.test_info_command @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppCmdlineTest.test_info_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_content_of_copied_archive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_create_archive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_create_archive_default_target @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_create_archive_filter_exclude_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_create_archive_with_compression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_create_archive_with_filter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_create_archive_with_pathlib @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_create_archive_with_subdirs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_custom_interpreter @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_default_no_shebang @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_main_and_main_py @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_main_only_written_once @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_main_validation @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_main_written @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_modify_shebang @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_no_main @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_no_shebang_is_not_executable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipapp.ZipAppTest.test_pack_to_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_read_from_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_read_from_pathobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_read_missing_shebang @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_read_shebang @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_remove_shebang @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipapp.ZipAppTest.test_shebang_is_executable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipapp.ZipAppTest.test_write_shebang_to_fileobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipfile.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipfile.txt index 92be4fbcd9..9332f85274 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipfile.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipfile.txt @@ -1,284 +1,286 @@ -*graalpython.lib-python.3.test.test_zipfile.Bzip2BadCrcTests.test_read_with_bad_crc -*graalpython.lib-python.3.test.test_zipfile.Bzip2BadCrcTests.test_testzip_with_bad_crc -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestZip64InSmallFiles.test_basic -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestZip64InSmallFiles.test_too_many_files -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestZip64InSmallFiles.test_too_many_files_append -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithRandomBinaryFiles.test_open -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithRandomBinaryFiles.test_random_open -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithRandomBinaryFiles.test_read -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_basic -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_compresslevel_basic -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_iterlines -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_low_compression -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_open -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_open_with_pathlike -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_per_file_compresslevel -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_random_open -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_read1 -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_read1_10 -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_read_return_size -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_readline -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_readline_read -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_readlines -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_repr -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_truncated_zipfile -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_writestr_compression -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_writestr_compresslevel -*graalpython.lib-python.3.test.test_zipfile.Bzip2TestsWithSourceFile.test_writing_errors -*graalpython.lib-python.3.test.test_zipfile.Bzip2WriterTests.test_close_after_close -*graalpython.lib-python.3.test.test_zipfile.Bzip2WriterTests.test_issue44439 -*graalpython.lib-python.3.test.test_zipfile.Bzip2WriterTests.test_write_after_close -*graalpython.lib-python.3.test.test_zipfile.CommandLineTest.test_bad_use -*graalpython.lib-python.3.test.test_zipfile.CommandLineTest.test_create_command -*graalpython.lib-python.3.test.test_zipfile.CommandLineTest.test_extract_command -*graalpython.lib-python.3.test.test_zipfile.CommandLineTest.test_list_command -*graalpython.lib-python.3.test.test_zipfile.CommandLineTest.test_test_command -*graalpython.lib-python.3.test.test_zipfile.DecryptionTests.test_bad_password -*graalpython.lib-python.3.test.test_zipfile.DecryptionTests.test_good_password -*graalpython.lib-python.3.test.test_zipfile.DecryptionTests.test_no_password -*graalpython.lib-python.3.test.test_zipfile.DecryptionTests.test_seek_tell -*graalpython.lib-python.3.test.test_zipfile.DecryptionTests.test_unicode_password -*graalpython.lib-python.3.test.test_zipfile.DeflateBadCrcTests.test_read_with_bad_crc -*graalpython.lib-python.3.test.test_zipfile.DeflateBadCrcTests.test_testzip_with_bad_crc -*graalpython.lib-python.3.test.test_zipfile.DeflateTestZip64InSmallFiles.test_basic -*graalpython.lib-python.3.test.test_zipfile.DeflateTestZip64InSmallFiles.test_too_many_files -*graalpython.lib-python.3.test.test_zipfile.DeflateTestZip64InSmallFiles.test_too_many_files_append -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithRandomBinaryFiles.test_open -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithRandomBinaryFiles.test_random_open -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithRandomBinaryFiles.test_read -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_basic -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_compresslevel_basic -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_iterlines -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_low_compression -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_open -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_open_with_pathlike -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_per_file_compression -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_per_file_compresslevel -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_random_open -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_read1 -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_read1_10 -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_read_return_size -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_readline -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_readline_read -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_readlines -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_repr -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_truncated_zipfile -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_writestr_compression -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_writestr_compresslevel -*graalpython.lib-python.3.test.test_zipfile.DeflateTestsWithSourceFile.test_writing_errors -*graalpython.lib-python.3.test.test_zipfile.DeflateWriterTests.test_close_after_close -*graalpython.lib-python.3.test.test_zipfile.DeflateWriterTests.test_issue44439 -*graalpython.lib-python.3.test.test_zipfile.DeflateWriterTests.test_write_after_close -*graalpython.lib-python.3.test.test_zipfile.EncodedMetadataTests.test_cli_with_metadata_encoding -*graalpython.lib-python.3.test.test_zipfile.EncodedMetadataTests.test_cli_with_metadata_encoding_extract -*graalpython.lib-python.3.test.test_zipfile.EncodedMetadataTests.test_read_after_append -*graalpython.lib-python.3.test.test_zipfile.EncodedMetadataTests.test_read_with_incorrect_metadata_encoding -*graalpython.lib-python.3.test.test_zipfile.EncodedMetadataTests.test_read_with_metadata_encoding -*graalpython.lib-python.3.test.test_zipfile.EncodedMetadataTests.test_read_with_unsuitable_metadata_encoding -*graalpython.lib-python.3.test.test_zipfile.EncodedMetadataTests.test_read_without_metadata_encoding -*graalpython.lib-python.3.test.test_zipfile.EncodedMetadataTests.test_write_with_metadata_encoding -*graalpython.lib-python.3.test.test_zipfile.ExtractTests.test_extract -*graalpython.lib-python.3.test.test_zipfile.ExtractTests.test_extract_all -*graalpython.lib-python.3.test.test_zipfile.ExtractTests.test_extract_all_with_target -*graalpython.lib-python.3.test.test_zipfile.ExtractTests.test_extract_all_with_target_pathlike -*graalpython.lib-python.3.test.test_zipfile.ExtractTests.test_extract_hackers_arcnames_common_cases -*graalpython.lib-python.3.test.test_zipfile.ExtractTests.test_extract_hackers_arcnames_posix_only -*graalpython.lib-python.3.test.test_zipfile.ExtractTests.test_extract_hackers_arcnames_windows_only -*graalpython.lib-python.3.test.test_zipfile.ExtractTests.test_extract_with_target -*graalpython.lib-python.3.test.test_zipfile.ExtractTests.test_extract_with_target_pathlike -*graalpython.lib-python.3.test.test_zipfile.ExtractTests.test_sanitize_windows_name -*graalpython.lib-python.3.test.test_zipfile.LzmaBadCrcTests.test_read_with_bad_crc -*graalpython.lib-python.3.test.test_zipfile.LzmaBadCrcTests.test_testzip_with_bad_crc -*graalpython.lib-python.3.test.test_zipfile.LzmaTestZip64InSmallFiles.test_basic -*graalpython.lib-python.3.test.test_zipfile.LzmaTestZip64InSmallFiles.test_too_many_files -*graalpython.lib-python.3.test.test_zipfile.LzmaTestZip64InSmallFiles.test_too_many_files_append -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithRandomBinaryFiles.test_open -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithRandomBinaryFiles.test_random_open -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithRandomBinaryFiles.test_read -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_basic -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_compresslevel_basic -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_iterlines -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_low_compression -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_open -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_open_with_pathlike -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_per_file_compresslevel -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_random_open -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_read1 -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_read1_10 -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_read_return_size -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_readline -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_readline_read -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_readlines -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_repr -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_truncated_zipfile -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_writestr_compression -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_writestr_compresslevel -*graalpython.lib-python.3.test.test_zipfile.LzmaTestsWithSourceFile.test_writing_errors -*graalpython.lib-python.3.test.test_zipfile.LzmaWriterTests.test_close_after_close -*graalpython.lib-python.3.test.test_zipfile.LzmaWriterTests.test_issue44439 -*graalpython.lib-python.3.test.test_zipfile.LzmaWriterTests.test_write_after_close -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_bad_compression_mode -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_bad_constructor_mode -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_bad_open_mode -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_change_comment_in_empty_archive -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_change_comment_in_nonempty_archive -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_close -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_close_erroneous_file -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_close_on_exception -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_closed_zip_raises_ValueError -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_comments -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_create_empty_zipinfo_default_attributes -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_create_empty_zipinfo_repr -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_create_non_existent_file_for_append -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_create_zipinfo_before_1980 -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_damaged_zipfile -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_decompress_without_3rd_party_library -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_empty_file_raises_BadZipFile -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_empty_zipfile -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_exclusive_create_zip_file -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_is_zip_erroneous_file -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_is_zip_valid_file -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_negative_central_directory_offset_raises_BadZipFile -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_non_existent_file_raises_OSError -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_null_byte_in_filename -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_open_conflicting_handles -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_open_empty_file -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_open_non_existent_item -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_open_via_zip_info -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_read0 -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_read_after_write_unicode_filenames -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_read_unicode_filenames -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_seek_tell -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_struct_sizes -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_unicode_comment -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_unsupported_compression -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_unsupported_version -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_write_unicode_filenames -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_writestr_extended_local_header_issue1202 -*graalpython.lib-python.3.test.test_zipfile.OtherTests.test_zipfile_with_short_extra_field -*graalpython.lib-python.3.test.test_zipfile.PyZipFileTests.test_write_non_pyfile -*graalpython.lib-python.3.test.test_zipfile.PyZipFileTests.test_write_pathlike -*graalpython.lib-python.3.test.test_zipfile.PyZipFileTests.test_write_pyfile -*graalpython.lib-python.3.test.test_zipfile.PyZipFileTests.test_write_pyfile_bad_syntax -*graalpython.lib-python.3.test.test_zipfile.PyZipFileTests.test_write_python_directory -*graalpython.lib-python.3.test.test_zipfile.PyZipFileTests.test_write_python_directory_filtered -*graalpython.lib-python.3.test.test_zipfile.PyZipFileTests.test_write_python_package -*graalpython.lib-python.3.test.test_zipfile.PyZipFileTests.test_write_with_optimization -*graalpython.lib-python.3.test.test_zipfile.StoredBadCrcTests.test_read_with_bad_crc -*graalpython.lib-python.3.test.test_zipfile.StoredBadCrcTests.test_testzip_with_bad_crc -*graalpython.lib-python.3.test.test_zipfile.StoredTestZip64InSmallFiles.test_absolute_arcnames -*graalpython.lib-python.3.test.test_zipfile.StoredTestZip64InSmallFiles.test_append -*graalpython.lib-python.3.test.test_zipfile.StoredTestZip64InSmallFiles.test_bad_zip64_extra -*graalpython.lib-python.3.test.test_zipfile.StoredTestZip64InSmallFiles.test_basic -*graalpython.lib-python.3.test.test_zipfile.StoredTestZip64InSmallFiles.test_force_zip64 -*graalpython.lib-python.3.test.test_zipfile.StoredTestZip64InSmallFiles.test_generated_valid_zip64_extra -*graalpython.lib-python.3.test.test_zipfile.StoredTestZip64InSmallFiles.test_large_file_exception -*graalpython.lib-python.3.test.test_zipfile.StoredTestZip64InSmallFiles.test_too_many_files -*graalpython.lib-python.3.test.test_zipfile.StoredTestZip64InSmallFiles.test_too_many_files_append -*graalpython.lib-python.3.test.test_zipfile.StoredTestZip64InSmallFiles.test_unseekable_zip_known_filesize -*graalpython.lib-python.3.test.test_zipfile.StoredTestZip64InSmallFiles.test_unseekable_zip_unknown_filesize -*graalpython.lib-python.3.test.test_zipfile.StoredTestZip64InSmallFiles.test_zip64_required_not_allowed_fail -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithRandomBinaryFiles.test_open -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithRandomBinaryFiles.test_random_open -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithRandomBinaryFiles.test_read -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_absolute_arcnames -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_add_file_after_2107 -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_add_file_before_1980 -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_append_to_concatenated_zip_file -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_append_to_non_zip_file -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_append_to_zip_file -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_basic -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_compresslevel_basic -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_ignores_newline_at_end -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_ignores_stuff_appended_past_comments -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_io_on_closed_zipextfile -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_iterlines -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_open -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_open_with_pathlike -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_per_file_compresslevel -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_random_open -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_read1 -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_read1_10 -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_read_concatenated_zip_file -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_read_return_size -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_readline -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_readline_read -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_readlines -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_repr -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_truncated_zipfile -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_write_default_name -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_write_to_readonly -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_writestr_compression -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_writestr_compresslevel -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_writestr_permissions -*graalpython.lib-python.3.test.test_zipfile.StoredTestsWithSourceFile.test_writing_errors -*graalpython.lib-python.3.test.test_zipfile.StoredWriterTests.test_close_after_close -*graalpython.lib-python.3.test.test_zipfile.StoredWriterTests.test_issue44439 -*graalpython.lib-python.3.test.test_zipfile.StoredWriterTests.test_write_after_close -*graalpython.lib-python.3.test.test_zipfile.StripExtraTests.test_multiples -*graalpython.lib-python.3.test.test_zipfile.StripExtraTests.test_no_data -*graalpython.lib-python.3.test.test_zipfile.StripExtraTests.test_too_short -*graalpython.lib-python.3.test.test_zipfile.StripExtraTests.test_with_data -*graalpython.lib-python.3.test.test_zipfile.TestExecutablePrependedZip.test_execute_zip2 -*graalpython.lib-python.3.test.test_zipfile.TestExecutablePrependedZip.test_execute_zip64 -*graalpython.lib-python.3.test.test_zipfile.TestExecutablePrependedZip.test_read_zip64_with_exe_prepended -*graalpython.lib-python.3.test.test_zipfile.TestExecutablePrependedZip.test_read_zip_with_exe_prepended -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_dir_parent -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_encoding_warnings -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_extract_orig_with_implied_dirs -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_filename -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_implied_dirs_performance -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_inheritance -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_is_file_missing -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_iterdir_and_types -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_iterdir_on_file -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_joinpath -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_joinpath_constant_time -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_joinpath_multiple -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_missing_dir_parent -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_mutability -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_open -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_open_binary_invalid_args -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_open_encoding_errors -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_open_encoding_utf16 -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_open_extant_directory -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_open_missing_directory -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_open_write -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_parent -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_pathlike_construction -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_read -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_read_does_not_close -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_root_name -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_root_parent -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_root_unnamed -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_stem -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_subclass -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_subdir_is_dir -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_suffix -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_suffix_no_filename -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_suffixes -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_traverse_pathlike -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_traverse_simplediv -*graalpython.lib-python.3.test.test_zipfile.TestPath.test_traverse_truediv -*graalpython.lib-python.3.test.test_zipfile.TestWithDirectory.test_bug_6050 -*graalpython.lib-python.3.test.test_zipfile.TestWithDirectory.test_create_directory_with_write -*graalpython.lib-python.3.test.test_zipfile.TestWithDirectory.test_extract_dir -*graalpython.lib-python.3.test.test_zipfile.TestWithDirectory.test_mkdir -*graalpython.lib-python.3.test.test_zipfile.TestWithDirectory.test_write_dir -*graalpython.lib-python.3.test.test_zipfile.TestWithDirectory.test_writestr_dir -*graalpython.lib-python.3.test.test_zipfile.TestsWithMultipleOpens.test_different_file -*graalpython.lib-python.3.test.test_zipfile.TestsWithMultipleOpens.test_interleaved -*graalpython.lib-python.3.test.test_zipfile.TestsWithMultipleOpens.test_many_opens -*graalpython.lib-python.3.test.test_zipfile.TestsWithMultipleOpens.test_read_after_close -*graalpython.lib-python.3.test.test_zipfile.TestsWithMultipleOpens.test_read_after_write -*graalpython.lib-python.3.test.test_zipfile.TestsWithMultipleOpens.test_same_file -*graalpython.lib-python.3.test.test_zipfile.TestsWithMultipleOpens.test_write_after_read -*graalpython.lib-python.3.test.test_zipfile.TestsWithMultipleOpens.test_write_while_reading -*graalpython.lib-python.3.test.test_zipfile.UnseekableTests.test_open_write -*graalpython.lib-python.3.test.test_zipfile.UnseekableTests.test_write -*graalpython.lib-python.3.test.test_zipfile.UnseekableTests.test_writestr -*graalpython.lib-python.3.test.test_zipfile.ZipInfoTests.test_from_dir -*graalpython.lib-python.3.test.test_zipfile.ZipInfoTests.test_from_file -*graalpython.lib-python.3.test.test_zipfile.ZipInfoTests.test_from_file_bytes -*graalpython.lib-python.3.test.test_zipfile.ZipInfoTests.test_from_file_fileno -*graalpython.lib-python.3.test.test_zipfile.ZipInfoTests.test_from_file_pathlike +test.test_zipfile.Bzip2BadCrcTests.test_read_with_bad_crc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2BadCrcTests.test_testzip_with_bad_crc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestZip64InSmallFiles.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestZip64InSmallFiles.test_too_many_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestZip64InSmallFiles.test_too_many_files_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithRandomBinaryFiles.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithRandomBinaryFiles.test_random_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithRandomBinaryFiles.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_compresslevel_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_iterlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_low_compression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_open_with_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_per_file_compresslevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_random_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_read1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_read1_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_read_return_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_readline_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_truncated_zipfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_writestr_compression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_writestr_compresslevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_writing_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2WriterTests.test_close_after_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2WriterTests.test_issue44439 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.Bzip2WriterTests.test_write_after_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.CommandLineTest.test_bad_use @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.CommandLineTest.test_create_command @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.CommandLineTest.test_extract_command @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.CommandLineTest.test_list_command @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.CommandLineTest.test_test_command @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DecryptionTests.test_bad_password @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DecryptionTests.test_good_password @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DecryptionTests.test_no_password @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DecryptionTests.test_seek_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DecryptionTests.test_unicode_password @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateBadCrcTests.test_read_with_bad_crc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateBadCrcTests.test_testzip_with_bad_crc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestZip64InSmallFiles.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestZip64InSmallFiles.test_too_many_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestZip64InSmallFiles.test_too_many_files_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithRandomBinaryFiles.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithRandomBinaryFiles.test_random_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithRandomBinaryFiles.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_compresslevel_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_iterlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_low_compression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_open_with_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_per_file_compression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_per_file_compresslevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_random_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_read1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_read1_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_read_return_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_readline_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_truncated_zipfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_writestr_compression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_writestr_compresslevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateTestsWithSourceFile.test_writing_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateWriterTests.test_close_after_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateWriterTests.test_issue44439 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.DeflateWriterTests.test_write_after_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.EncodedMetadataTests.test_cli_with_metadata_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.EncodedMetadataTests.test_cli_with_metadata_encoding_extract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.EncodedMetadataTests.test_read_after_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.EncodedMetadataTests.test_read_with_incorrect_metadata_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.EncodedMetadataTests.test_read_with_metadata_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.EncodedMetadataTests.test_read_with_unsuitable_metadata_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.EncodedMetadataTests.test_read_without_metadata_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.EncodedMetadataTests.test_write_with_metadata_encoding @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.ExtractTests.test_extract @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.ExtractTests.test_extract_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.ExtractTests.test_extract_all_with_target @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.ExtractTests.test_extract_all_with_target_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.ExtractTests.test_extract_hackers_arcnames_common_cases @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.ExtractTests.test_extract_hackers_arcnames_posix_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.ExtractTests.test_extract_hackers_arcnames_windows_only @ win32-AMD64 +test.test_zipfile.ExtractTests.test_extract_with_target @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.ExtractTests.test_extract_with_target_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.ExtractTests.test_sanitize_windows_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.LzmaBadCrcTests.test_read_with_bad_crc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaBadCrcTests.test_testzip_with_bad_crc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestZip64InSmallFiles.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestZip64InSmallFiles.test_too_many_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestZip64InSmallFiles.test_too_many_files_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithRandomBinaryFiles.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithRandomBinaryFiles.test_random_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithRandomBinaryFiles.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_compresslevel_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_iterlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_low_compression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_open_with_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_per_file_compresslevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.LzmaTestsWithSourceFile.test_random_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_read1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_read1_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_read_return_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_readline_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_truncated_zipfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_writestr_compression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_writestr_compresslevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_writing_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaWriterTests.test_close_after_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaWriterTests.test_issue44439 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.LzmaWriterTests.test_write_after_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.OtherTests.test_bad_compression_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_bad_constructor_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_bad_open_mode @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_change_comment_in_empty_archive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_change_comment_in_nonempty_archive @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_close_erroneous_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_close_on_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_closed_zip_raises_ValueError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_create_empty_zipinfo_default_attributes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_create_empty_zipinfo_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_create_non_existent_file_for_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_create_zipinfo_before_1980 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_damaged_zipfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_decompress_without_3rd_party_library @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_empty_file_raises_BadZipFile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_empty_zipfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_exclusive_create_zip_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_is_zip_erroneous_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_is_zip_valid_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_negative_central_directory_offset_raises_BadZipFile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_non_existent_file_raises_OSError @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_null_byte_in_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_open_conflicting_handles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_open_empty_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_open_non_existent_item @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_open_via_zip_info @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_read0 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_read_after_write_unicode_filenames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_read_unicode_filenames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_seek_tell @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_struct_sizes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_unicode_comment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_unsupported_compression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_unsupported_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_write_unicode_filenames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_writestr_extended_local_header_issue1202 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.OtherTests.test_zipfile_with_short_extra_field @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.PyZipFileTests.test_write_filtered_python_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.PyZipFileTests.test_write_non_pyfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.PyZipFileTests.test_write_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.PyZipFileTests.test_write_pyfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.PyZipFileTests.test_write_pyfile_bad_syntax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.PyZipFileTests.test_write_python_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.PyZipFileTests.test_write_python_directory_filtered @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.PyZipFileTests.test_write_python_package @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.PyZipFileTests.test_write_with_optimization @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredBadCrcTests.test_read_with_bad_crc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredBadCrcTests.test_testzip_with_bad_crc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_absolute_arcnames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_bad_zip64_extra @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_force_zip64 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_generated_valid_zip64_extra @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_large_file_exception @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_too_many_files @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_too_many_files_append @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_unseekable_zip_known_filesize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_unseekable_zip_unknown_filesize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_zip64_required_not_allowed_fail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithRandomBinaryFiles.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithRandomBinaryFiles.test_random_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithRandomBinaryFiles.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_absolute_arcnames @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_add_file_after_2107 @ darwin-arm64,darwin-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_add_file_before_1980 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_append_to_concatenated_zip_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_append_to_non_zip_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_append_to_zip_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_compresslevel_basic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_ignores_newline_at_end @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_ignores_stuff_appended_past_comments @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_io_on_closed_zipextfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_iterlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_open_with_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_per_file_compresslevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_random_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_read1 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_read1_10 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_read_concatenated_zip_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_read_return_size @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_readline @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_readline_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_readlines @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_truncated_zipfile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_write_default_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_write_to_readonly @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_writestr_compression @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_writestr_compresslevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_writestr_permissions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredTestsWithSourceFile.test_writing_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredWriterTests.test_close_after_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredWriterTests.test_issue44439 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StoredWriterTests.test_write_after_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StripExtraTests.test_multiples @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StripExtraTests.test_no_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StripExtraTests.test_too_short @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.StripExtraTests.test_with_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestExecutablePrependedZip.test_execute_zip2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.TestExecutablePrependedZip.test_execute_zip64 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.TestExecutablePrependedZip.test_read_zip64_with_exe_prepended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestExecutablePrependedZip.test_read_zip_with_exe_prepended @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_dir_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_encoding_warnings @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_extract_orig_with_implied_dirs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.TestPath.test_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_implied_dirs_performance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_inheritance @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_is_file_missing @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_iterdir_and_types @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_iterdir_on_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_joinpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_joinpath_constant_time @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_joinpath_multiple @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_missing_dir_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_mutability @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_open @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_open_binary_invalid_args @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_open_encoding_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_open_encoding_utf16 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_open_extant_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_open_missing_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_open_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_pathlike_construction @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile.TestPath.test_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_read_does_not_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_root_name @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_root_parent @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_root_unnamed @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_stem @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_subclass @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_subdir_is_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_suffix @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_suffix_no_filename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_suffixes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_traverse_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_traverse_simplediv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestPath.test_traverse_truediv @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestWithDirectory.test_bug_6050 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestWithDirectory.test_create_directory_with_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestWithDirectory.test_extract_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestWithDirectory.test_mkdir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestWithDirectory.test_write_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestWithDirectory.test_writestr_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestsWithMultipleOpens.test_different_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestsWithMultipleOpens.test_interleaved @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +# Counting file descriptors, can randomly change due to finalizers +!test.test_zipfile.TestsWithMultipleOpens.test_many_opens @ darwin-arm64,linux-aarch64,linux-x86_64 +test.test_zipfile.TestsWithMultipleOpens.test_read_after_close @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestsWithMultipleOpens.test_read_after_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestsWithMultipleOpens.test_same_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestsWithMultipleOpens.test_write_after_read @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.TestsWithMultipleOpens.test_write_while_reading @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.UnseekableTests.test_open_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.UnseekableTests.test_write @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.UnseekableTests.test_writestr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.ZipInfoTests.test_from_dir @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.ZipInfoTests.test_from_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.ZipInfoTests.test_from_file_bytes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.ZipInfoTests.test_from_file_fileno @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile.ZipInfoTests.test_from_file_pathlike @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipfile64.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipfile64.txt index 24955a84a2..2177abec25 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipfile64.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipfile64.txt @@ -1,4 +1,4 @@ -*graalpython.lib-python.3.test.test_zipfile64.OtherTests.testMoreThan64kFiles -*graalpython.lib-python.3.test.test_zipfile64.OtherTests.testMoreThan64kFilesAppend -*graalpython.lib-python.3.test.test_zipfile64.TestsWithSourceFile.testDeflated -*graalpython.lib-python.3.test.test_zipfile64.TestsWithSourceFile.testStored +test.test_zipfile64.OtherTests.testMoreThan64kFiles @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile64.OtherTests.testMoreThan64kFilesAppend @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipfile64.TestsWithSourceFile.testDeflated @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipfile64.TestsWithSourceFile.testStored @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipimport.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipimport.txt index 22639aa76d..b269535019 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipimport.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipimport.txt @@ -1,73 +1,71 @@ -*graalpython.lib-python.3.test.test_zipimport.BadFileZipImportTestCase.testBadArgs -*graalpython.lib-python.3.test.test_zipimport.BadFileZipImportTestCase.testEmptyFile -*graalpython.lib-python.3.test.test_zipimport.BadFileZipImportTestCase.testEmptyFilename -*graalpython.lib-python.3.test.test_zipimport.BadFileZipImportTestCase.testFileUnreadable -*graalpython.lib-python.3.test.test_zipimport.BadFileZipImportTestCase.testFilenameTooLong -*graalpython.lib-python.3.test.test_zipimport.BadFileZipImportTestCase.testNoFile -*graalpython.lib-python.3.test.test_zipimport.BadFileZipImportTestCase.testNotZipFile -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.test2038MTime -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testAFakeZlib -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testBadMTime -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testBadMagic -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testBadMagic2 -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testBeginningCruftAndComment -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testBoth -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testBytesPath -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testComment -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testDefaultOptimizationLevel -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testDoctestFile -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testDoctestSuite -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testEmptyPy -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testGetCompiledSource -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testGetData -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testGetSource -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testImport_WithStuff -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testImporterAttr -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testInvalidateCaches -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testLargestPossibleComment -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testMixedNamespacePackage -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testNamespacePackage -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testPackage -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testPy -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testPyc -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testSubNamespacePackage -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testSubPackage -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testTraceback -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testUncheckedHashBasedPyc -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testUnencodable -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testZipImporterMethods -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.testZipImporterMethodsInSubDirectory -*graalpython.lib-python.3.test.test_zipimport.CompressedZipImportTestCase.test_checked_hash_based_change_pyc -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.test2038MTime -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testAFakeZlib -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testBadMTime -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testBadMagic -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testBadMagic2 -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testBeginningCruftAndComment -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testBoth -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testBytesPath -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testComment -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testDefaultOptimizationLevel -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testDoctestFile -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testDoctestSuite -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testEmptyPy -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testGetCompiledSource -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testGetData -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testGetSource -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testImport_WithStuff -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testImporterAttr -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testInvalidateCaches -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testLargestPossibleComment -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testMixedNamespacePackage -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testNamespacePackage -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testPackage -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testPy -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testPyc -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testSubNamespacePackage -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testSubPackage -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testTraceback -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testUncheckedHashBasedPyc -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testUnencodable -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testZipImporterMethods -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.testZipImporterMethodsInSubDirectory -*graalpython.lib-python.3.test.test_zipimport.UncompressedZipImportTestCase.test_checked_hash_based_change_pyc +test.test_zipimport.BadFileZipImportTestCase.testBadArgs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.BadFileZipImportTestCase.testEmptyFile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.BadFileZipImportTestCase.testEmptyFilename @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.BadFileZipImportTestCase.testFileUnreadable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.BadFileZipImportTestCase.testFilenameTooLong @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.BadFileZipImportTestCase.testNoFile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.BadFileZipImportTestCase.testNotZipFile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.test2038MTime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testBadMTime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testBadMagic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testBadMagic2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testBeginningCruftAndComment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testBoth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testBytesPath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testComment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testDefaultOptimizationLevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testDoctestFile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testDoctestSuite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testEmptyPy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testGetCompiledSource @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testGetData @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testGetSource @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testImport_WithStuff @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testImporterAttr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testInvalidateCaches @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testLargestPossibleComment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testMixedNamespacePackage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testNamespacePackage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testPackage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testPy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testPyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testSubNamespacePackage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testSubPackage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testTraceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testUncheckedHashBasedPyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testUnencodable @ linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testZipImporterMethods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.testZipImporterMethodsInSubDirectory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.CompressedZipImportTestCase.test_checked_hash_based_change_pyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.test2038MTime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testBadMTime @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testBadMagic @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testBadMagic2 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testBeginningCruftAndComment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testBoth @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testBytesPath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testComment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testDefaultOptimizationLevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testDoctestFile @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testDoctestSuite @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testEmptyPy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testGetCompiledSource @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testGetData @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testGetSource @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testImport_WithStuff @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testImporterAttr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testInvalidateCaches @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testLargestPossibleComment @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testMixedNamespacePackage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testNamespacePackage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testPackage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testPy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testPyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testSubNamespacePackage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testSubPackage @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testTraceback @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testUncheckedHashBasedPyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testUnencodable @ linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testZipImporterMethods @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.testZipImporterMethodsInSubDirectory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport.UncompressedZipImportTestCase.test_checked_hash_based_change_pyc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipimport_support.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipimport_support.txt index a4a66fd6d1..b5e0e5a7c5 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipimport_support.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zipimport_support.txt @@ -1,4 +1,4 @@ -*graalpython.lib-python.3.test.test_zipimport_support.ZipSupportTests.test_doctest_issue4197 -*graalpython.lib-python.3.test.test_zipimport_support.ZipSupportTests.test_doctest_main_issue4197 -*graalpython.lib-python.3.test.test_zipimport_support.ZipSupportTests.test_inspect_getsource_issue4223 -*graalpython.lib-python.3.test.test_zipimport_support.ZipSupportTests.test_pdb_issue4201 +test.test_zipimport_support.ZipSupportTests.test_doctest_issue4197 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport_support.ZipSupportTests.test_doctest_main_issue4197 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport_support.ZipSupportTests.test_inspect_getsource_issue4223 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zipimport_support.ZipSupportTests.test_pdb_issue4201 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zlib.txt index 71d7c6565e..ac96eed9fd 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zlib.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zlib.txt @@ -1,63 +1,54 @@ -*graalpython.lib-python.3.test.test_zlib.ChecksumBigBufferTestCase.test_big_buffer -*graalpython.lib-python.3.test.test_zlib.ChecksumTestCase.test_adler32empty -*graalpython.lib-python.3.test.test_zlib.ChecksumTestCase.test_adler32start -*graalpython.lib-python.3.test.test_zlib.ChecksumTestCase.test_crc32_adler32_unsigned -*graalpython.lib-python.3.test.test_zlib.ChecksumTestCase.test_crc32empty -*graalpython.lib-python.3.test.test_zlib.ChecksumTestCase.test_crc32start -*graalpython.lib-python.3.test.test_zlib.ChecksumTestCase.test_penguins -*graalpython.lib-python.3.test.test_zlib.ChecksumTestCase.test_same_as_binascii_crc32 -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_64bit_compress -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_badcompresscopy -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_baddecompresscopy -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_big_compress_buffer -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_big_decompress_buffer -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_clear_unconsumed_tail -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_compresscopy -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_compressincremental -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_compressoptions -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_compresspickle -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_decompimax -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_decompinc -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_decompincflush -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_decompress_eof -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_decompress_eof_incomplete_stream -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_decompress_incomplete_stream -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_decompress_raw_with_dictionary -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_decompress_unused_data -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_decompresscopy -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_decompressmaxlen -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_decompressmaxlenflush -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_decompresspickle -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_dictionary -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_dictionary_streaming -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_empty_flush -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_flush_custom_length -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_flush_large_length -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_flush_with_freed_input -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_flushes -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_keywords -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_large_unconsumed_tail -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_large_unused_data -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_maxlen_custom -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_maxlen_large -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_maxlenmisc -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_odd_flush -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_pair -*graalpython.lib-python.3.test.test_zlib.CompressObjectTestCase.test_wbits -*graalpython.lib-python.3.test.test_zlib.CompressTestCase.test_64bit_compress -*graalpython.lib-python.3.test.test_zlib.CompressTestCase.test_big_compress_buffer -*graalpython.lib-python.3.test.test_zlib.CompressTestCase.test_big_decompress_buffer -*graalpython.lib-python.3.test.test_zlib.CompressTestCase.test_custom_bufsize -*graalpython.lib-python.3.test.test_zlib.CompressTestCase.test_incomplete_stream -*graalpython.lib-python.3.test.test_zlib.CompressTestCase.test_keywords -*graalpython.lib-python.3.test.test_zlib.CompressTestCase.test_large_bufsize -*graalpython.lib-python.3.test.test_zlib.CompressTestCase.test_speech -*graalpython.lib-python.3.test.test_zlib.CompressTestCase.test_speech128 -*graalpython.lib-python.3.test.test_zlib.ExceptionTestCase.test_badargs -*graalpython.lib-python.3.test.test_zlib.ExceptionTestCase.test_badcompressobj -*graalpython.lib-python.3.test.test_zlib.ExceptionTestCase.test_baddecompressobj -*graalpython.lib-python.3.test.test_zlib.ExceptionTestCase.test_badlevel -*graalpython.lib-python.3.test.test_zlib.ExceptionTestCase.test_decompressobj_badflush -*graalpython.lib-python.3.test.test_zlib.ExceptionTestCase.test_disallow_instantiation -*graalpython.lib-python.3.test.test_zlib.ExceptionTestCase.test_overflow -*graalpython.lib-python.3.test.test_zlib.VersionTestCase.test_library_version +test.test_zlib.ChecksumTestCase.test_adler32empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.ChecksumTestCase.test_adler32start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.ChecksumTestCase.test_crc32_adler32_unsigned @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.ChecksumTestCase.test_crc32empty @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.ChecksumTestCase.test_crc32start @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.ChecksumTestCase.test_penguins @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.ChecksumTestCase.test_same_as_binascii_crc32 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_badcompresscopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_baddecompresscopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_big_compress_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_big_decompress_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_clear_unconsumed_tail @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_compresscopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_compressincremental @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_compressoptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_decompimax @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_decompinc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_decompincflush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_decompress_eof @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_decompress_eof_incomplete_stream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_decompress_incomplete_stream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_decompress_raw_with_dictionary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_decompress_unused_data @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_decompresscopy @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_decompressmaxlen @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_decompressmaxlenflush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_dictionary @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_dictionary_streaming @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_empty_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_flush_custom_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_flush_large_length @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_flush_with_freed_input @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_flushes @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_maxlen_custom @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_maxlen_large @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_maxlenmisc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_odd_flush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_pair @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressObjectTestCase.test_wbits @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zlib.CompressTestCase.test_big_compress_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressTestCase.test_big_decompress_buffer @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressTestCase.test_custom_bufsize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressTestCase.test_incomplete_stream @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressTestCase.test_keywords @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressTestCase.test_large_bufsize @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressTestCase.test_speech @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.CompressTestCase.test_speech128 @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.ExceptionTestCase.test_badargs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.ExceptionTestCase.test_badcompressobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.ExceptionTestCase.test_baddecompressobj @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.ExceptionTestCase.test_badlevel @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64 +test.test_zlib.ExceptionTestCase.test_decompressobj_badflush @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zlib.VersionTestCase.test_library_version @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zoneinfo.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zoneinfo.txt index a3af614456..29d26f8ee8 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zoneinfo.txt +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_zoneinfo.txt @@ -1,210 +1,184 @@ -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CCallingConventionTest.test_clear_cache -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CCallingConventionTest.test_from_file -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTZDataTests.test_bad_keys -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTZDataTests.test_bad_keys_paths -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTZDataTests.test_bad_zones -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTZDataTests.test_folds_and_gaps -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTZDataTests.test_folds_from_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTZDataTests.test_fromutc_errors -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTZDataTests.test_key_attribute -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTZDataTests.test_repr -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTZDataTests.test_str -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTZDataTests.test_time_fixed_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTZDataTests.test_time_variable_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTZDataTests.test_unambiguous -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTZDataTests.test_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTZStrTest.test_extreme_tzstr -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTZStrTest.test_invalid_tzstr -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTZStrTest.test_tzstr_from_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTZStrTest.test_tzstr_localized -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTestModule.test_available_timezones -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTestModule.test_available_timezones_weirdzone -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTestModule.test_dir_contains_all -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTestModule.test_dir_unique -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTestModule.test_exclude_posixrules -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTestModule.test_folder_exclusions -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTestModule.test_getattr_error -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTzPathTest.test_env_variable -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTzPathTest.test_env_variable_relative_paths -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTzPathTest.test_reset_tzpath_kwarg -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTzPathTest.test_reset_tzpath_relative_paths -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTzPathTest.test_tzpath_attribute -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CTzPathTest.test_tzpath_type_error -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_empty_zone -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_fixed_offset_phantom_transition -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_no_tz_str -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_one_transition -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_one_zone_dst -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_tz_before_only -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_zone_very_large_timestamp -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_cache_reset_tzpath -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_clear_cache_explicit_none -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_clear_cache_one_key -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_clear_cache_two_keys -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_ephemeral_zones -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_no_cache -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_strong_refs -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_bad_keys -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_bad_keys_paths -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_bad_zones -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_fold_mutate -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_folds_and_gaps -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_folds_from_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_fromutc_errors -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_key_attribute -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_repr -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_str -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_time_fixed_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_time_variable_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_unambiguous -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoPickleTest.test_cache_hit -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoPickleTest.test_cache_miss -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoPickleTest.test_from_file -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoPickleTest.test_no_cache -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoPickleTest.test_pickle_after_from_file -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_bad_keys -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_bad_keys_paths -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_bad_zones -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_folds_and_gaps -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_folds_from_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_fromutc_errors -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_key_attribute -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_repr -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_str -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_subclass_own_cache -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_time_fixed_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_time_variable_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_unambiguous -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_bad_keys -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_bad_keys_paths -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_bad_zones -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_fold_mutate -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_folds_and_gaps -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_folds_from_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_fromutc_errors -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_key_attribute -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_repr -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_str -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_time_fixed_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_time_variable_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_unambiguous -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_bad_keys -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_bad_keys_paths -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_bad_zones -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_folds_and_gaps -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_folds_from_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_fromutc_errors -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_key_attribute -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_repr -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_str -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_time_fixed_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_time_variable_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_unambiguous -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CallingConventionTest.test_clear_cache -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.CallingConventionTest.test_from_file -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TZDataTests.test_bad_keys -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TZDataTests.test_bad_keys_paths -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TZDataTests.test_bad_zones -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TZDataTests.test_folds_and_gaps -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TZDataTests.test_folds_from_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TZDataTests.test_fromutc_errors -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TZDataTests.test_key_attribute -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TZDataTests.test_repr -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TZDataTests.test_str -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TZDataTests.test_time_fixed_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TZDataTests.test_time_variable_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TZDataTests.test_unambiguous -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TZDataTests.test_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TZStrTest.test_extreme_tzstr -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TZStrTest.test_invalid_tzstr -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TZStrTest.test_tzstr_from_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TZStrTest.test_tzstr_localized -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TestModule.test_available_timezones -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TestModule.test_available_timezones_weirdzone -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TestModule.test_dir_contains_all -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TestModule.test_dir_unique -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TestModule.test_exclude_posixrules -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TestModule.test_folder_exclusions -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TestModule.test_getattr_error -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TzPathTest.test_env_variable -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TzPathTest.test_env_variable_relative_paths -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TzPathTest.test_reset_tzpath_kwarg -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TzPathTest.test_reset_tzpath_relative_paths -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TzPathTest.test_tzpath_attribute -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.TzPathTest.test_tzpath_type_error -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_empty_zone -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_fixed_offset_phantom_transition -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_no_tz_str -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_one_transition -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_one_zone_dst -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_tz_before_only -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_zone_very_large_timestamp -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_cache_reset_tzpath -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_clear_cache_explicit_none -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_clear_cache_one_key -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_clear_cache_two_keys -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_ephemeral_zones -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_no_cache -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_strong_refs -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_bad_keys -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_bad_keys_paths -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_bad_zones -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_folds_and_gaps -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_folds_from_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_fromutc_errors -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_key_attribute -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_repr -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_str -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_time_fixed_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_time_variable_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_unambiguous -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoPickleTest.test_cache_hit -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoPickleTest.test_cache_miss -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoPickleTest.test_from_file -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoPickleTest.test_no_cache -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoPickleTest.test_pickle_after_from_file -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_bad_keys -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_bad_keys_paths -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_bad_zones -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_folds_and_gaps -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_folds_from_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_fromutc_errors -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_key_attribute -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_repr -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_str -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_subclass_own_cache -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_time_fixed_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_time_variable_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_unambiguous -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_bad_keys -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_bad_keys_paths -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_bad_zones -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_folds_and_gaps -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_folds_from_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_fromutc_errors -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_key_attribute -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_repr -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_str -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_time_fixed_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_time_variable_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_unambiguous -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_bad_keys -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_bad_keys_paths -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_bad_zones -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_folds_and_gaps -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_folds_from_utc -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_fromutc_errors -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_key_attribute -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_repr -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_str -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_time_fixed_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_time_variable_offset -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_unambiguous -*graalpython.lib-python.3.test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_utc +test.test_zoneinfo.test_zoneinfo.CCallingConventionTest.test_clear_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CCallingConventionTest.test_from_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CTZStrTest.test_extreme_tzstr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CTZStrTest.test_invalid_tzstr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CTZStrTest.test_tzstr_from_utc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CTZStrTest.test_tzstr_localized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CTestModule.test_available_timezones @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CTestModule.test_available_timezones_weirdzone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CTestModule.test_dir_contains_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CTestModule.test_dir_unique @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CTestModule.test_exclude_posixrules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CTestModule.test_folder_exclusions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CTestModule.test_getattr_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CTzPathTest.test_env_variable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CTzPathTest.test_env_variable_relative_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CTzPathTest.test_reset_tzpath_kwarg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CTzPathTest.test_reset_tzpath_relative_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CTzPathTest.test_tzpath_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CTzPathTest.test_tzpath_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_empty_zone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_fixed_offset_phantom_transition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_no_tz_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_one_transition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_one_zone_dst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_tz_before_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_zone_very_large_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_cache_reset_tzpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_clear_cache_explicit_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_clear_cache_one_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_clear_cache_two_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_ephemeral_zones @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_no_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_strong_refs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_bad_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_bad_keys_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_bad_zones @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_fold_mutate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_folds_and_gaps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_folds_from_utc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_fromutc_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_key_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_time_fixed_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_time_variable_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_unambiguous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_utc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoPickleTest.test_cache_hit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoPickleTest.test_cache_miss @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoPickleTest.test_from_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoPickleTest.test_no_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoPickleTest.test_pickle_after_from_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_bad_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_bad_keys_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_bad_zones @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_folds_and_gaps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_folds_from_utc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_fromutc_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_key_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_subclass_own_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_time_fixed_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_time_variable_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_unambiguous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_utc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_bad_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_bad_keys_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_bad_zones @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_fold_mutate @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_folds_and_gaps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_folds_from_utc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_fromutc_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_key_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_time_fixed_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_time_variable_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_unambiguous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_utc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_bad_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_bad_keys_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_bad_zones @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_folds_and_gaps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_folds_from_utc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_fromutc_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_key_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_time_fixed_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_time_variable_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_unambiguous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_utc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CallingConventionTest.test_clear_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.CallingConventionTest.test_from_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.TZStrTest.test_extreme_tzstr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.TZStrTest.test_invalid_tzstr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.TZStrTest.test_tzstr_from_utc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.TZStrTest.test_tzstr_localized @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.TestModule.test_available_timezones @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.TestModule.test_available_timezones_weirdzone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.TestModule.test_dir_contains_all @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.TestModule.test_dir_unique @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.TestModule.test_exclude_posixrules @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.TestModule.test_folder_exclusions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.TestModule.test_getattr_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.TzPathTest.test_env_variable @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.TzPathTest.test_env_variable_relative_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.TzPathTest.test_reset_tzpath_kwarg @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.TzPathTest.test_reset_tzpath_relative_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.TzPathTest.test_tzpath_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.TzPathTest.test_tzpath_type_error @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_empty_zone @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_fixed_offset_phantom_transition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_no_tz_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_one_transition @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_one_zone_dst @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_tz_before_only @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_zone_very_large_timestamp @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_cache_reset_tzpath @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_clear_cache_explicit_none @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_clear_cache_one_key @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_clear_cache_two_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_ephemeral_zones @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_no_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_strong_refs @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_bad_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_bad_keys_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_bad_zones @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_folds_and_gaps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_folds_from_utc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_fromutc_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_key_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_time_fixed_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_time_variable_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_unambiguous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_utc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoPickleTest.test_cache_hit @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoPickleTest.test_cache_miss @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoPickleTest.test_from_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoPickleTest.test_no_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoPickleTest.test_pickle_after_from_file @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_bad_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_bad_keys_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_bad_zones @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_folds_and_gaps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_folds_from_utc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_fromutc_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_key_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_subclass_own_cache @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_time_fixed_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_time_variable_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_unambiguous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_utc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_bad_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_bad_keys_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_bad_zones @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_folds_and_gaps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_folds_from_utc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_fromutc_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_key_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_time_fixed_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_time_variable_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_unambiguous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_utc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_bad_keys @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_bad_keys_paths @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_bad_zones @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_folds_and_gaps @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_folds_from_utc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_fromutc_errors @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_key_attribute @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_repr @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_str @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_time_fixed_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_time_variable_offset @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_unambiguous @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_utc @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test__locale.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test__locale.txt new file mode 100644 index 0000000000..d7efaa61ba --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test__locale.txt @@ -0,0 +1,2 @@ +test.test__locale._LocaleTests.test_float_parsing @ linux-x86_64 +test.test__locale._LocaleTests.test_lc_numeric_localeconv @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_abc.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_abc.txt new file mode 100644 index 0000000000..7c0fed706c --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_abc.txt @@ -0,0 +1,36 @@ +test.test_abc.test_factory..TestABC.test_ABC_has___slots__ @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_ABC_helper @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_abstractclassmethod_basics @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_abstractmethod_basics @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_abstractmethod_integration @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_abstractproperty_basics @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_abstractstaticmethod_basics @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_all_new_methods_are_called @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_customdescriptors_with_abstractmethod @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_descriptors_with_abstractmethod @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_isinstance_invalidation @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_issubclass_bad_arguments @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_metaclass_abc @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_object_new_with_many_abstractmethods @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_object_new_with_one_abstractmethod @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_register_as_class_deco @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_register_non_class @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_registration_basics @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_registration_builtins @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_registration_edge_cases @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_registration_transitiveness @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_subclasshook @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_tricky_new_works @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_update_as_decorator @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_update_del @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_update_del_implementation @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_update_implementation @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_update_layered_implementation @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_update_multi_inheritance @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_update_new_abstractmethods @ linux-x86_64 +test.test_abc.test_factory..TestABC.test_update_non_abc @ linux-x86_64 +test.test_abc.test_factory..TestABCWithInitSubclass.test_positional_only_and_kwonlyargs_with_init_subclass @ linux-x86_64 +test.test_abc.test_factory..TestABCWithInitSubclass.test_works_with_init_subclass @ linux-x86_64 +test.test_abc.test_factory..TestLegacyAPI.test_abstractclassmethod_basics @ linux-x86_64 +test.test_abc.test_factory..TestLegacyAPI.test_abstractproperty_basics @ linux-x86_64 +test.test_abc.test_factory..TestLegacyAPI.test_abstractstaticmethod_basics @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_abstract_numbers.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_abstract_numbers.txt new file mode 100644 index 0000000000..5ef53c818f --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_abstract_numbers.txt @@ -0,0 +1,3 @@ +test.test_abstract_numbers.TestNumbers.test_complex @ linux-x86_64 +test.test_abstract_numbers.TestNumbers.test_float @ linux-x86_64 +test.test_abstract_numbers.TestNumbers.test_int @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_argparse.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_argparse.txt new file mode 100644 index 0000000000..c1f78cf360 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_argparse.txt @@ -0,0 +1,1706 @@ +test.test_argparse.StdStreamTest.test_skip_invalid_stderr @ linux-x86_64 +test.test_argparse.StdStreamTest.test_skip_invalid_stdout @ linux-x86_64 +test.test_argparse.TestActionExtend.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestActionExtend.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestActionExtend.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestActionExtend.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestActionExtend.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestActionExtend.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestActionExtend.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestActionExtend.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestActionExtend.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestActionExtend.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestActionExtend.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestActionExtend.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestActionRegistration.test @ linux-x86_64 +test.test_argparse.TestActionUserDefined.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestActionUserDefined.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestActionUserDefined.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestActionUserDefined.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestActionUserDefined.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestActionUserDefined.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestActionUserDefined.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestActionUserDefined.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestActionUserDefined.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestActionUserDefined.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestActionUserDefined.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestActionUserDefined.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestActionsReturned.test_dest @ linux-x86_64 +test.test_argparse.TestActionsReturned.test_misc @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_1_metavar_length0 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_1_metavar_length1 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_1_metavar_length2 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_1_metavar_length3 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_1_metavar_string @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_2_metavar_length0 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_2_metavar_length1 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_2_metavar_length2 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_2_metavar_length3 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_2_metavar_string @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_3_metavar_length0 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_3_metavar_length1 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_3_metavar_length2 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_3_metavar_length3 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_3_metavar_string @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_None_metavar_length0 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_None_metavar_length1 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_None_metavar_length2 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_None_metavar_length3 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_None_metavar_string @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_oneormore_metavar_length0 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_oneormore_metavar_length1 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_oneormore_metavar_length2 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_oneormore_metavar_length3 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_oneormore_metavar_string @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_optional_metavar_length0 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_optional_metavar_length1 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_optional_metavar_length2 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_optional_metavar_length3 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_optional_metavar_string @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_parser_metavar_length0 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_parser_metavar_length1 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_parser_metavar_length2 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_parser_metavar_length3 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_parser_metavar_string @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_remainder_metavar_length0 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_remainder_metavar_length1 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_remainder_metavar_length2 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_remainder_metavar_length3 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_remainder_metavar_string @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_zeroormore_metavar_length0 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_zeroormore_metavar_length1 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_zeroormore_metavar_length2 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_zeroormore_metavar_length3 @ linux-x86_64 +test.test_argparse.TestAddArgumentMetavar.test_nargs_zeroormore_metavar_string @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_alias_help @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_alias_invocation @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_dest @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_error_alias_invocation @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_help @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_help_alternate_prefix_chars @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_help_blank @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_help_extra_prefix_chars @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_help_non_breaking_spaces @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_optional_subparsers @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_parse_args @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_parse_args_failures @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_parse_known_args @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_parser_command_help @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_required_subparsers_default @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_required_subparsers_no_destination_error @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_required_subparsers_via_attribute @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_required_subparsers_via_kwarg @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_subparser1_help @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_subparser2_help @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_subparser_title_help @ linux-x86_64 +test.test_argparse.TestAddSubparsers.test_wrong_argument_subparsers_no_destination_error @ linux-x86_64 +test.test_argparse.TestArgumentError.test_argument_error @ linux-x86_64 +test.test_argparse.TestArgumentTypeError.test_argument_type_error @ linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFile.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestArgumentsFromFileConverter.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalAction.test_const @ linux-x86_64 +test.test_argparse.TestBooleanOptionalAction.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalAction.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalAction.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalAction.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalAction.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalAction.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalAction.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalAction.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalAction.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalAction.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalAction.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalAction.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalActionRequired.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalActionRequired.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalActionRequired.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalActionRequired.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalActionRequired.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalActionRequired.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalActionRequired.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalActionRequired.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalActionRequired.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalActionRequired.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalActionRequired.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestBooleanOptionalActionRequired.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestConflictHandling.test_bad_type @ linux-x86_64 +test.test_argparse.TestConflictHandling.test_conflict_error @ linux-x86_64 +test.test_argparse.TestConflictHandling.test_resolve_error @ linux-x86_64 +test.test_argparse.TestConflictHandling.test_subparser_conflict @ linux-x86_64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestConstActionsMissingConstKwarg.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestDefaultSuppress.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestDefaultSuppress.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestDefaultSuppress.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestDefaultSuppress.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestDefaultSuppress.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestDefaultSuppress.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestDefaultSuppress.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestDefaultSuppress.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestDefaultSuppress.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestDefaultSuppress.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestDefaultSuppress.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestDefaultSuppress.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGrouping.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestDisallowLongAbbreviationAllowsShortGroupingPrefix.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestEmptyAndSpaceContainingArguments.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestEncoding.test_argparse_module_encoding @ linux-x86_64 +test.test_argparse.TestEncoding.test_test_argparse_module_encoding @ linux-x86_64 +test.test_argparse.TestExitOnError.test_exit_on_error_with_bad_args @ linux-x86_64 +test.test_argparse.TestExitOnError.test_exit_on_error_with_good_args @ linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeDefaults.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeMissingInitialization.test @ linux-x86_64 +test.test_argparse.TestFileTypeOpenArgs.test_open_args @ linux-x86_64 +test.test_argparse.TestFileTypeR.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeR.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeR.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeR.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeR.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeR.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeR.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeR.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeR.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeR.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeR.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeR.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeRB.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeRB.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeRB.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeRB.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeRB.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeRB.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeRB.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeRB.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeRB.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeRB.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeRB.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeRB.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeRepr.test_r @ linux-x86_64 +test.test_argparse.TestFileTypeRepr.test_r_1_replace @ linux-x86_64 +test.test_argparse.TestFileTypeRepr.test_r_latin @ linux-x86_64 +test.test_argparse.TestFileTypeRepr.test_w_big5_ignore @ linux-x86_64 +test.test_argparse.TestFileTypeRepr.test_wb_1 @ linux-x86_64 +test.test_argparse.TestFileTypeW.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeW.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeW.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeW.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeW.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeW.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeW.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeW.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeW.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeW.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeW.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeW.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeWB.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeWB.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeWB.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeWB.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeWB.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeWB.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeWB.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeWB.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeWB.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeWB.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeWB.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeWB.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeX.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeX.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeX.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeX.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeX.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeX.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeX.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeX.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeX.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeX.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeX.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeX.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeXB.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeXB.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeXB.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeXB.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeXB.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeXB.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeXB.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeXB.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeXB.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeXB.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestFileTypeXB.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestFileTypeXB.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestGetDefault.test_get_default @ linux-x86_64 +test.test_argparse.TestHelpAlternatePrefixChars.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpAlternatePrefixChars.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpAlternatePrefixChars.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpAlternatePrefixChars.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpAlternatePrefixChars.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpAlternatePrefixChars.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpArgumentDefaults.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpArgumentDefaults.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpArgumentDefaults.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpArgumentDefaults.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpArgumentDefaults.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpArgumentDefaults.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpBiggerOptionalGroups.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpBiggerOptionalGroups.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpBiggerOptionalGroups.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpBiggerOptionalGroups.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpBiggerOptionalGroups.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpBiggerOptionalGroups.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpBiggerOptionals.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpBiggerOptionals.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpBiggerOptionals.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpBiggerOptionals.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpBiggerOptionals.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpBiggerOptionals.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpBiggerPositionals.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpBiggerPositionals.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpBiggerPositionals.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpBiggerPositionals.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpBiggerPositionals.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpBiggerPositionals.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpMetavarTypeFormatter.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpMetavarTypeFormatter.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpMetavarTypeFormatter.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpMetavarTypeFormatter.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpMetavarTypeFormatter.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpMetavarTypeFormatter.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpNoHelpOptional.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpNoHelpOptional.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpNoHelpOptional.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpNoHelpOptional.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpNoHelpOptional.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpNoHelpOptional.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpNone.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpNone.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpNone.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpNone.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpNone.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpNone.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpOnlyUserGroups.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpOnlyUserGroups.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpOnlyUserGroups.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpOnlyUserGroups.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpOnlyUserGroups.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpOnlyUserGroups.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpRawDescription.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpRawDescription.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpRawDescription.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpRawDescription.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpRawDescription.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpRawDescription.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpRawText.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpRawText.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpRawText.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpRawText.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpRawText.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpRawText.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpReformatting.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpReformatting.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpReformatting.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpReformatting.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpReformatting.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpReformatting.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpRequiredOptional.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpRequiredOptional.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpRequiredOptional.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpRequiredOptional.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpRequiredOptional.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpRequiredOptional.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpSubparsersOrdering.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpSubparsersOrdering.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpSubparsersOrdering.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpSubparsersOrdering.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpSubparsersOrdering.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpSubparsersOrdering.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpSubparsersWithHelpOrdering.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpSubparsersWithHelpOrdering.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpSubparsersWithHelpOrdering.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpSubparsersWithHelpOrdering.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpSubparsersWithHelpOrdering.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpSubparsersWithHelpOrdering.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpSuppressOptional.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpSuppressOptional.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpSuppressOptional.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpSuppressOptional.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpSuppressOptional.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpSuppressOptional.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpSuppressOptionalGroup.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpSuppressOptionalGroup.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpSuppressOptionalGroup.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpSuppressOptionalGroup.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpSuppressOptionalGroup.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpSuppressOptionalGroup.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpSuppressPositional.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpSuppressPositional.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpSuppressPositional.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpSuppressPositional.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpSuppressPositional.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpSuppressPositional.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpSuppressUsage.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpSuppressUsage.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpSuppressUsage.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpSuppressUsage.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpSuppressUsage.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpSuppressUsage.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpTupleMetavar.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpTupleMetavar.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpTupleMetavar.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpTupleMetavar.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpTupleMetavar.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpTupleMetavar.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpUsage.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpUsage.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpUsage.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpUsage.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpUsage.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpUsage.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageLongProg.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpUsageLongProg.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageLongProg.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpUsageLongProg.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageLongProg.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpUsageLongProg.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageLongProgOptionsWrap.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpUsageLongProgOptionsWrap.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageLongProgOptionsWrap.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpUsageLongProgOptionsWrap.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageLongProgOptionsWrap.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpUsageLongProgOptionsWrap.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageLongProgPositionalsWrap.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpUsageLongProgPositionalsWrap.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageLongProgPositionalsWrap.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpUsageLongProgPositionalsWrap.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageLongProgPositionalsWrap.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpUsageLongProgPositionalsWrap.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageOptionalsOnlyWrap.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpUsageOptionalsOnlyWrap.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageOptionalsOnlyWrap.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpUsageOptionalsOnlyWrap.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageOptionalsOnlyWrap.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpUsageOptionalsOnlyWrap.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageOptionalsPositionalsWrap.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpUsageOptionalsPositionalsWrap.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageOptionalsPositionalsWrap.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpUsageOptionalsPositionalsWrap.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageOptionalsPositionalsWrap.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpUsageOptionalsPositionalsWrap.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageOptionalsWrap.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpUsageOptionalsWrap.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageOptionalsWrap.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpUsageOptionalsWrap.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageOptionalsWrap.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpUsageOptionalsWrap.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpUsagePositionalsOnlyWrap.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpUsagePositionalsOnlyWrap.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpUsagePositionalsOnlyWrap.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpUsagePositionalsOnlyWrap.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpUsagePositionalsOnlyWrap.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpUsagePositionalsOnlyWrap.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpUsagePositionalsWrap.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpUsagePositionalsWrap.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpUsagePositionalsWrap.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpUsagePositionalsWrap.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpUsagePositionalsWrap.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpUsagePositionalsWrap.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageWithParentheses.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpUsageWithParentheses.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageWithParentheses.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpUsageWithParentheses.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpUsageWithParentheses.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpUsageWithParentheses.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpVariableExpansion.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpVariableExpansion.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpVariableExpansion.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpVariableExpansion.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpVariableExpansion.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpVariableExpansion.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpVariableExpansionNoArguments.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpVariableExpansionNoArguments.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpVariableExpansionNoArguments.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpVariableExpansionNoArguments.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpVariableExpansionNoArguments.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpVariableExpansionNoArguments.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpVariableExpansionUsageSupplied.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpVariableExpansionUsageSupplied.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpVariableExpansionUsageSupplied.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpVariableExpansionUsageSupplied.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpVariableExpansionUsageSupplied.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpVariableExpansionUsageSupplied.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpVersionAction.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpVersionAction.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpVersionAction.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpVersionAction.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpVersionAction.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpVersionAction.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpVersionActionSuppress.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpVersionActionSuppress.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpVersionActionSuppress.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpVersionActionSuppress.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpVersionActionSuppress.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpVersionActionSuppress.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpWrappingLongNames.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpWrappingLongNames.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpWrappingLongNames.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpWrappingLongNames.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpWrappingLongNames.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpWrappingLongNames.test_print_usage @ linux-x86_64 +test.test_argparse.TestHelpWrappingShortNames.test_format_help @ linux-x86_64 +test.test_argparse.TestHelpWrappingShortNames.test_format_usage @ linux-x86_64 +test.test_argparse.TestHelpWrappingShortNames.test_print_file_help @ linux-x86_64 +test.test_argparse.TestHelpWrappingShortNames.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestHelpWrappingShortNames.test_print_help @ linux-x86_64 +test.test_argparse.TestHelpWrappingShortNames.test_print_usage @ linux-x86_64 +test.test_argparse.TestImportStar.test @ linux-x86_64 +test.test_argparse.TestImportStar.test_all_exports_everything_but_modules @ linux-x86_64 +test.test_argparse.TestIntermixedArgs.test_basic @ linux-x86_64 +test.test_argparse.TestIntermixedArgs.test_exclusive @ linux-x86_64 +test.test_argparse.TestIntermixedArgs.test_exclusive_incompatible @ linux-x86_64 +test.test_argparse.TestIntermixedArgs.test_remainder @ linux-x86_64 +test.test_argparse.TestIntermixedMessageContentError.test_missing_argument_name_in_message @ linux-x86_64 +test.test_argparse.TestInvalidArgumentConstructors.test_invalid_action @ linux-x86_64 +test.test_argparse.TestInvalidArgumentConstructors.test_invalid_keyword_arguments @ linux-x86_64 +test.test_argparse.TestInvalidArgumentConstructors.test_invalid_option_strings @ linux-x86_64 +test.test_argparse.TestInvalidArgumentConstructors.test_invalid_type @ linux-x86_64 +test.test_argparse.TestInvalidArgumentConstructors.test_missing_destination @ linux-x86_64 +test.test_argparse.TestInvalidArgumentConstructors.test_more_than_one_argument_actions @ linux-x86_64 +test.test_argparse.TestInvalidArgumentConstructors.test_multiple_dest @ linux-x86_64 +test.test_argparse.TestInvalidArgumentConstructors.test_no_argument_actions @ linux-x86_64 +test.test_argparse.TestInvalidArgumentConstructors.test_no_argument_no_const_actions @ linux-x86_64 +test.test_argparse.TestInvalidArgumentConstructors.test_parsers_action_missing_params @ linux-x86_64 +test.test_argparse.TestInvalidArgumentConstructors.test_required_const_actions @ linux-x86_64 +test.test_argparse.TestInvalidArgumentConstructors.test_required_positional @ linux-x86_64 +test.test_argparse.TestInvalidArgumentConstructors.test_user_defined_action @ linux-x86_64 +test.test_argparse.TestInvalidNargs.test_nargs_alphabetic @ linux-x86_64 +test.test_argparse.TestInvalidNargs.test_nargs_zero @ linux-x86_64 +test.test_argparse.TestMessageContentError.test_missing_argument_name_in_message @ linux-x86_64 +test.test_argparse.TestMessageContentError.test_optional_optional_not_in_message @ linux-x86_64 +test.test_argparse.TestMessageContentError.test_optional_positional_not_in_message @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_failures_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_failures_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_help_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_help_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_successes_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_successes_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_usage_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressed.test_usage_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_failures_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_failures_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_help_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_help_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_successes_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_successes_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_usage_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveFirstSuppressedParent.test_usage_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveGroupErrors.test_empty_group @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveGroupErrors.test_help @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveGroupErrors.test_invalid_add_argument @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveGroupErrors.test_invalid_add_argument_group @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveGroupErrorsParent.test_empty_group @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveGroupErrorsParent.test_help @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveGroupErrorsParent.test_invalid_add_argument @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveGroupErrorsParent.test_invalid_add_argument_group @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveInGroup.test_failures_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveInGroup.test_failures_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveInGroup.test_help_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveInGroup.test_help_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveInGroup.test_successes_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveInGroup.test_successes_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveInGroup.test_usage_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveInGroup.test_usage_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveLong.test_failures_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveLong.test_failures_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveLong.test_help_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveLong.test_help_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveLong.test_successes_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveLong.test_successes_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveLong.test_usage_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveLong.test_usage_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveLongParent.test_failures_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveLongParent.test_failures_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveLongParent.test_help_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveLongParent.test_help_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveLongParent.test_successes_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveLongParent.test_successes_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveLongParent.test_usage_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveLongParent.test_usage_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveManySuppressed.test_failures_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveManySuppressed.test_failures_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveManySuppressed.test_help_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveManySuppressed.test_help_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveManySuppressed.test_successes_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveManySuppressed.test_successes_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveManySuppressed.test_usage_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveManySuppressed.test_usage_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_failures_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_failures_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_help_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_help_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_successes_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_successes_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_usage_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveManySuppressedParent.test_usage_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveNested.test_help_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveNested.test_help_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveNested.test_usage_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveNested.test_usage_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_failures_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_failures_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_help_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_help_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_successes_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_successes_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_usage_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositional.test_usage_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_failures_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_failures_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_help_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_help_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_successes_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_successes_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_usage_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalAndPositionalParent.test_usage_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_failures_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_failures_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_help_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_help_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_successes_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_successes_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_usage_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixed.test_usage_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_failures_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_failures_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_help_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_help_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_successes_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_successes_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_usage_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsAndPositionalsMixedParent.test_usage_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_failures_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_failures_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_help_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_help_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_successes_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_successes_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_usage_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixed.test_usage_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_failures_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_failures_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_help_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_help_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_successes_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_successes_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_usage_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveOptionalsMixedParent.test_usage_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveSimple.test_failures_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveSimple.test_failures_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveSimple.test_help_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveSimple.test_help_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveSimple.test_successes_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveSimple.test_successes_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveSimple.test_usage_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveSimple.test_usage_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveSimpleParent.test_failures_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveSimpleParent.test_failures_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveSimpleParent.test_help_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveSimpleParent.test_help_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveSimpleParent.test_successes_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveSimpleParent.test_successes_when_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveSimpleParent.test_usage_when_not_required @ linux-x86_64 +test.test_argparse.TestMutuallyExclusiveSimpleParent.test_usage_when_required @ linux-x86_64 +test.test_argparse.TestNamespace.test_constructor @ linux-x86_64 +test.test_argparse.TestNamespace.test_equality @ linux-x86_64 +test.test_argparse.TestNamespace.test_equality_returns_notimplemented @ linux-x86_64 +test.test_argparse.TestNamespaceContainsSimple.test_empty @ linux-x86_64 +test.test_argparse.TestNamespaceContainsSimple.test_non_empty @ linux-x86_64 +test.test_argparse.TestNargsRemainder.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestNargsRemainder.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestNargsRemainder.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestNargsRemainder.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestNargsRemainder.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestNargsRemainder.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestNargsRemainder.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestNargsRemainder.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestNargsRemainder.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestNargsRemainder.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestNargsRemainder.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestNargsRemainder.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestNargsZeroOrMore.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestNargsZeroOrMore.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestNargsZeroOrMore.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestNargsZeroOrMore.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestNargsZeroOrMore.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestNargsZeroOrMore.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestNargsZeroOrMore.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestNargsZeroOrMore.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestNargsZeroOrMore.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestNargsZeroOrMore.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestNargsZeroOrMore.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestNargsZeroOrMore.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionLike.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionLike.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionLike.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionLike.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionLike.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionLike.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionLike.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionLike.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionLike.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionLike.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionLike.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionLike.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppend.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppend.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppend.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppend.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppend.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppend.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppend.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppend.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppend.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppend.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppend.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppend.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConst.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConst.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConst.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConst.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConst.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConst.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConst.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConst.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConst.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConst.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConst.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConst.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendConstWithDefault.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionAppendWithDefault.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionCount.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionCount.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionCount.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionCount.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionCount.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionCount.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionCount.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionCount.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionCount.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionCount.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionCount.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionCount.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStore.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStore.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStore.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStore.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStore.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStore.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStore.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStore.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStore.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStore.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStore.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStore.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreConst.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreConst.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreConst.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreConst.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreConst.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreConst.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreConst.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreConst.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreConst.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreConst.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreConst.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreConst.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreFalse.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreFalse.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreFalse.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreFalse.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreFalse.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreFalse.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreFalse.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreFalse.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreFalse.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreFalse.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreFalse.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreFalse.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreTrue.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreTrue.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreTrue.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreTrue.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreTrue.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreTrue.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreTrue.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreTrue.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreTrue.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreTrue.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreTrue.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsActionStoreTrue.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAllowLongAbbreviation.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlmostNumericAndPositionals.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixChars.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsAddedHelp.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsAlternatePrefixCharsMultipleShortArgs.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsChoices.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsChoices.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsChoices.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsChoices.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsChoices.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsChoices.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsChoices.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsChoices.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsChoices.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsChoices.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsChoices.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsChoices.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDefault.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDefault.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDefault.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDefault.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDefault.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDefault.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDefault.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDefault.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDefault.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDefault.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDefault.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDefault.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDest.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDest.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDest.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDest.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDest.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDest.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDest.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDest.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDest.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDest.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDest.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDest.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviation.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDisallowLongAbbreviationPrefixChars.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDash.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDash.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDash.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDash.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDash.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDash.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDash.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDash.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDash.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDash.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDash.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDash.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPartialMatch.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsDoubleDashPrefixMatch.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsHelpVersionActions.test_alternate_help_version @ linux-x86_64 +test.test_argparse.TestOptionalsHelpVersionActions.test_help_version_extra_arguments @ linux-x86_64 +test.test_argparse.TestOptionalsHelpVersionActions.test_no_help @ linux-x86_64 +test.test_argparse.TestOptionalsHelpVersionActions.test_version @ linux-x86_64 +test.test_argparse.TestOptionalsHelpVersionActions.test_version_action @ linux-x86_64 +test.test_argparse.TestOptionalsHelpVersionActions.test_version_format @ linux-x86_64 +test.test_argparse.TestOptionalsHelpVersionActions.test_version_no_help @ linux-x86_64 +test.test_argparse.TestOptionalsNargs1.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs1.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs1.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs1.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs1.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs1.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs1.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs1.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs1.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs1.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs1.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs1.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs3.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs3.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs3.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs3.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs3.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs3.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs3.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs3.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs3.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs3.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs3.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargs3.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsDefault.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsDefault.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsDefault.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsDefault.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsDefault.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsDefault.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsDefault.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsDefault.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsDefault.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsDefault.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsDefault.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsDefault.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOneOrMore.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOptional.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOptional.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOptional.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOptional.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOptional.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOptional.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOptional.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOptional.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOptional.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOptional.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOptional.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsOptional.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNargsZeroOrMore.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumeric.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumeric.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumeric.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumeric.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumeric.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumeric.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumeric.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumeric.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumeric.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumeric.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumeric.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumeric.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsNumericAndPositionals.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsRequired.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsRequired.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsRequired.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsRequired.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsRequired.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsRequired.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsRequired.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsRequired.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsRequired.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsRequired.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsRequired.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsRequired.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsShortLong.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsShortLong.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsShortLong.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsShortLong.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsShortLong.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsShortLong.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsShortLong.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsShortLong.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsShortLong.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsShortLong.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsShortLong.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsShortLong.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDash.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDash.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDash.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDash.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDash.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDash.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDash.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDash.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDash.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDash.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDash.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDash.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashAmbiguous.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashCombined.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashCombined.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashCombined.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashCombined.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashCombined.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashCombined.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashCombined.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashCombined.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashCombined.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashCombined.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashCombined.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashCombined.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashLong.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashLong.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashLong.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashLong.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashLong.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashLong.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashLong.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashLong.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashLong.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashLong.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashLong.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashLong.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDashSubsetAmbiguous.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestOptionalsSingleDoubleDash.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestParentParsers.test_conflicting_parents @ linux-x86_64 +test.test_argparse.TestParentParsers.test_conflicting_parents_mutex @ linux-x86_64 +test.test_argparse.TestParentParsers.test_groups_parents @ linux-x86_64 +test.test_argparse.TestParentParsers.test_multiple_parents @ linux-x86_64 +test.test_argparse.TestParentParsers.test_multiple_parents_mutex @ linux-x86_64 +test.test_argparse.TestParentParsers.test_parent_help @ linux-x86_64 +test.test_argparse.TestParentParsers.test_same_argument_name_parents @ linux-x86_64 +test.test_argparse.TestParentParsers.test_single_granparent_mutex @ linux-x86_64 +test.test_argparse.TestParentParsers.test_single_parent @ linux-x86_64 +test.test_argparse.TestParentParsers.test_single_parent_mutex @ linux-x86_64 +test.test_argparse.TestParentParsers.test_subparser_parents @ linux-x86_64 +test.test_argparse.TestParentParsers.test_subparser_parents_mutex @ linux-x86_64 +test.test_argparse.TestParseKnownArgs.test_arguments_list @ linux-x86_64 +test.test_argparse.TestParseKnownArgs.test_arguments_list_positional @ linux-x86_64 +test.test_argparse.TestParseKnownArgs.test_arguments_tuple @ linux-x86_64 +test.test_argparse.TestParseKnownArgs.test_arguments_tuple_positional @ linux-x86_64 +test.test_argparse.TestParseKnownArgs.test_mixed @ linux-x86_64 +test.test_argparse.TestParseKnownArgs.test_optionals @ linux-x86_64 +test.test_argparse.TestParserDefault42.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestParserDefault42.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestParserDefault42.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestParserDefault42.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestParserDefault42.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestParserDefault42.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestParserDefault42.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestParserDefault42.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestParserDefault42.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestParserDefault42.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestParserDefault42.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestParserDefault42.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestParserDefaultSuppress.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestParserDefaultSuppress.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestParserDefaultSuppress.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestParserDefaultSuppress.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestParserDefaultSuppress.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestParserDefaultSuppress.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestParserDefaultSuppress.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestParserDefaultSuppress.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestParserDefaultSuppress.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestParserDefaultSuppress.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestParserDefaultSuppress.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestParserDefaultSuppress.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsActionAppend.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsActionAppend.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsActionAppend.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsActionAppend.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsActionAppend.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsActionAppend.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsActionAppend.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsActionAppend.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsActionAppend.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsActionAppend.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsActionAppend.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsActionAppend.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesInt.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesInt.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesInt.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesInt.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesInt.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesInt.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesInt.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesInt.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesInt.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesInt.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesInt.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesInt.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesString.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesString.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesString.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesString.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesString.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesString.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesString.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesString.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesString.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesString.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesString.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsChoicesString.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsGroups.test_group_first @ linux-x86_64 +test.test_argparse.TestPositionalsGroups.test_interleaved_groups @ linux-x86_64 +test.test_argparse.TestPositionalsGroups.test_nongroup_first @ linux-x86_64 +test.test_argparse.TestPositionalsNargs1.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs1.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs1.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs1.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs1.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs1.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs1.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs1.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs1.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs1.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs1.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs1.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2None.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2None.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2None.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2None.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2None.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2None.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2None.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2None.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2None.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2None.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2None.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2None.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2OneOrMore.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2Optional.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2Optional.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2Optional.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2Optional.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2Optional.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2Optional.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2Optional.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2Optional.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2Optional.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2Optional.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2Optional.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2Optional.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargs2ZeroOrMore.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone1.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone1.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone1.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone1.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone1.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone1.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone1.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone1.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone1.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone1.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone1.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNone1.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneNone.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneNone.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneNone.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneNone.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneNone.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneNone.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneNone.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneNone.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneNone.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneNone.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneNone.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneNone.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOneOrMore1.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneOptional1.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsNoneZeroOrMore1.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMore1.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOneOrMoreNone.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional1.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional1.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional1.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional1.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional1.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional1.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional1.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional1.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional1.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional1.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional1.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptional1.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalConvertedDefault.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalDefault.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalNone.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOneOrMore.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalOptional.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsOptionalZeroOrMore.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMore1.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreDefault.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPositionalsNargsZeroOrMoreNone.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestPrefixCharacterOnlyArguments.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestSetDefaults.test_set_defaults_no_args @ linux-x86_64 +test.test_argparse.TestSetDefaults.test_set_defaults_on_parent_and_subparser @ linux-x86_64 +test.test_argparse.TestSetDefaults.test_set_defaults_parents @ linux-x86_64 +test.test_argparse.TestSetDefaults.test_set_defaults_same_as_add_argument @ linux-x86_64 +test.test_argparse.TestSetDefaults.test_set_defaults_same_as_add_argument_group @ linux-x86_64 +test.test_argparse.TestSetDefaults.test_set_defaults_subparsers @ linux-x86_64 +test.test_argparse.TestSetDefaults.test_set_defaults_with_args @ linux-x86_64 +test.test_argparse.TestShortColumns.test_format_help @ linux-x86_64 +test.test_argparse.TestShortColumns.test_format_usage @ linux-x86_64 +test.test_argparse.TestShortColumns.test_print_file_help @ linux-x86_64 +test.test_argparse.TestShortColumns.test_print_file_usage @ linux-x86_64 +test.test_argparse.TestShortColumns.test_print_help @ linux-x86_64 +test.test_argparse.TestShortColumns.test_print_usage @ linux-x86_64 +test.test_argparse.TestStrings.test_argument @ linux-x86_64 +test.test_argparse.TestStrings.test_namespace @ linux-x86_64 +test.test_argparse.TestStrings.test_namespace_kwargs_and_starkwargs_notidentifier @ linux-x86_64 +test.test_argparse.TestStrings.test_namespace_starkwargs_identifier @ linux-x86_64 +test.test_argparse.TestStrings.test_namespace_starkwargs_notidentifier @ linux-x86_64 +test.test_argparse.TestStrings.test_optional @ linux-x86_64 +test.test_argparse.TestStrings.test_parser @ linux-x86_64 +test.test_argparse.TestTypeCallable.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestTypeCallable.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestTypeCallable.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestTypeCallable.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestTypeCallable.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestTypeCallable.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestTypeCallable.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestTypeCallable.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestTypeCallable.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestTypeCallable.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestTypeCallable.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestTypeCallable.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestTypeClassicClass.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestTypeClassicClass.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestTypeClassicClass.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestTypeClassicClass.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestTypeClassicClass.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestTypeClassicClass.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestTypeClassicClass.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestTypeClassicClass.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestTypeClassicClass.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestTypeClassicClass.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestTypeClassicClass.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestTypeClassicClass.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestTypeFunctionCallOnlyOnce.test_type_function_call_only_once @ linux-x86_64 +test.test_argparse.TestTypeFunctionCalledOnDefault.test_issue_15906 @ linux-x86_64 +test.test_argparse.TestTypeFunctionCalledOnDefault.test_no_double_type_conversion_of_default @ linux-x86_64 +test.test_argparse.TestTypeFunctionCalledOnDefault.test_type_function_call_with_non_string_default @ linux-x86_64 +test.test_argparse.TestTypeFunctionCalledOnDefault.test_type_function_call_with_string_default @ linux-x86_64 +test.test_argparse.TestTypeRegistration.test @ linux-x86_64 +test.test_argparse.TestTypeUserDefined.test_failures_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestTypeUserDefined.test_failures_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestTypeUserDefined.test_failures_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestTypeUserDefined.test_failures_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestTypeUserDefined.test_failures_one_group_listargs @ linux-x86_64 +test.test_argparse.TestTypeUserDefined.test_failures_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestTypeUserDefined.test_successes_many_groups_listargs @ linux-x86_64 +test.test_argparse.TestTypeUserDefined.test_successes_many_groups_sysargs @ linux-x86_64 +test.test_argparse.TestTypeUserDefined.test_successes_no_groups_listargs @ linux-x86_64 +test.test_argparse.TestTypeUserDefined.test_successes_no_groups_sysargs @ linux-x86_64 +test.test_argparse.TestTypeUserDefined.test_successes_one_group_listargs @ linux-x86_64 +test.test_argparse.TestTypeUserDefined.test_successes_one_group_sysargs @ linux-x86_64 +test.test_argparse.TestWrappingMetavar.test_help_with_metavar @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_array.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_array.txt new file mode 100644 index 0000000000..ef892153ba --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_array.txt @@ -0,0 +1,731 @@ +test.test_array.ArrayReconstructorTest.test_error @ linux-x86_64 +test.test_array.ArrayReconstructorTest.test_numbers @ linux-x86_64 +test.test_array.ArrayReconstructorTest.test_unicode @ linux-x86_64 +test.test_array.ByteTest.test_add @ linux-x86_64 +test.test_array.ByteTest.test_assignment @ linux-x86_64 +test.test_array.ByteTest.test_buffer @ linux-x86_64 +test.test_array.ByteTest.test_buffer_info @ linux-x86_64 +test.test_array.ByteTest.test_bug_782369 @ linux-x86_64 +test.test_array.ByteTest.test_byteswap @ linux-x86_64 +test.test_array.ByteTest.test_cmp @ linux-x86_64 +test.test_array.ByteTest.test_constructor @ linux-x86_64 +test.test_array.ByteTest.test_constructor_with_iterable_argument @ linux-x86_64 +test.test_array.ByteTest.test_copy @ linux-x86_64 +test.test_array.ByteTest.test_count @ linux-x86_64 +test.test_array.ByteTest.test_coveritertraverse @ linux-x86_64 +test.test_array.ByteTest.test_create_from_bytes @ linux-x86_64 +test.test_array.ByteTest.test_deepcopy @ linux-x86_64 +test.test_array.ByteTest.test_delitem @ linux-x86_64 +test.test_array.ByteTest.test_delslice @ linux-x86_64 +test.test_array.ByteTest.test_exhausted_iterator @ linux-x86_64 +test.test_array.ByteTest.test_exhausted_reverse_iterator @ linux-x86_64 +test.test_array.ByteTest.test_extend @ linux-x86_64 +test.test_array.ByteTest.test_extended_getslice @ linux-x86_64 +test.test_array.ByteTest.test_extended_set_del_slice @ linux-x86_64 +test.test_array.ByteTest.test_extslice @ linux-x86_64 +test.test_array.ByteTest.test_filewrite @ linux-x86_64 +test.test_array.ByteTest.test_fromarray @ linux-x86_64 +test.test_array.ByteTest.test_frombytearray @ linux-x86_64 +test.test_array.ByteTest.test_fromfile_ioerror @ linux-x86_64 +test.test_array.ByteTest.test_getitem @ linux-x86_64 +test.test_array.ByteTest.test_getslice @ linux-x86_64 +test.test_array.ByteTest.test_iadd @ linux-x86_64 +test.test_array.ByteTest.test_imul @ linux-x86_64 +test.test_array.ByteTest.test_index @ linux-x86_64 +test.test_array.ByteTest.test_initialize_with_unicode @ linux-x86_64 +test.test_array.ByteTest.test_insert @ linux-x86_64 +test.test_array.ByteTest.test_iterationcontains @ linux-x86_64 +test.test_array.ByteTest.test_iterator_pickle @ linux-x86_64 +test.test_array.ByteTest.test_len @ linux-x86_64 +test.test_array.ByteTest.test_mul @ linux-x86_64 +test.test_array.ByteTest.test_overflow @ linux-x86_64 +test.test_array.ByteTest.test_pickle @ linux-x86_64 +test.test_array.ByteTest.test_pickle_for_empty_array @ linux-x86_64 +test.test_array.ByteTest.test_pop @ linux-x86_64 +test.test_array.ByteTest.test_reduce_ex @ linux-x86_64 +test.test_array.ByteTest.test_remove @ linux-x86_64 +test.test_array.ByteTest.test_repr @ linux-x86_64 +test.test_array.ByteTest.test_reverse @ linux-x86_64 +test.test_array.ByteTest.test_reverse_iterator @ linux-x86_64 +test.test_array.ByteTest.test_setitem @ linux-x86_64 +test.test_array.ByteTest.test_setslice @ linux-x86_64 +test.test_array.ByteTest.test_str @ linux-x86_64 +test.test_array.ByteTest.test_subclass_with_kwargs @ linux-x86_64 +test.test_array.ByteTest.test_subclassing @ linux-x86_64 +test.test_array.ByteTest.test_tofrombytes @ linux-x86_64 +test.test_array.ByteTest.test_tofromfile @ linux-x86_64 +test.test_array.ByteTest.test_tofromlist @ linux-x86_64 +test.test_array.ByteTest.test_type_error @ linux-x86_64 +test.test_array.DoubleTest.test_add @ linux-x86_64 +test.test_array.DoubleTest.test_alloc_overflow @ linux-x86_64 +test.test_array.DoubleTest.test_assignment @ linux-x86_64 +test.test_array.DoubleTest.test_buffer @ linux-x86_64 +test.test_array.DoubleTest.test_buffer_info @ linux-x86_64 +test.test_array.DoubleTest.test_bug_782369 @ linux-x86_64 +test.test_array.DoubleTest.test_byteswap @ linux-x86_64 +test.test_array.DoubleTest.test_cmp @ linux-x86_64 +test.test_array.DoubleTest.test_constructor @ linux-x86_64 +test.test_array.DoubleTest.test_constructor_with_iterable_argument @ linux-x86_64 +test.test_array.DoubleTest.test_copy @ linux-x86_64 +test.test_array.DoubleTest.test_count @ linux-x86_64 +test.test_array.DoubleTest.test_coveritertraverse @ linux-x86_64 +test.test_array.DoubleTest.test_create_from_bytes @ linux-x86_64 +test.test_array.DoubleTest.test_deepcopy @ linux-x86_64 +test.test_array.DoubleTest.test_delitem @ linux-x86_64 +test.test_array.DoubleTest.test_delslice @ linux-x86_64 +test.test_array.DoubleTest.test_exhausted_iterator @ linux-x86_64 +test.test_array.DoubleTest.test_exhausted_reverse_iterator @ linux-x86_64 +test.test_array.DoubleTest.test_extend @ linux-x86_64 +test.test_array.DoubleTest.test_extended_getslice @ linux-x86_64 +test.test_array.DoubleTest.test_extended_set_del_slice @ linux-x86_64 +test.test_array.DoubleTest.test_extslice @ linux-x86_64 +test.test_array.DoubleTest.test_filewrite @ linux-x86_64 +test.test_array.DoubleTest.test_fromarray @ linux-x86_64 +test.test_array.DoubleTest.test_frombytearray @ linux-x86_64 +test.test_array.DoubleTest.test_fromfile_ioerror @ linux-x86_64 +test.test_array.DoubleTest.test_getitem @ linux-x86_64 +test.test_array.DoubleTest.test_getslice @ linux-x86_64 +test.test_array.DoubleTest.test_iadd @ linux-x86_64 +test.test_array.DoubleTest.test_imul @ linux-x86_64 +test.test_array.DoubleTest.test_index @ linux-x86_64 +test.test_array.DoubleTest.test_initialize_with_unicode @ linux-x86_64 +test.test_array.DoubleTest.test_insert @ linux-x86_64 +test.test_array.DoubleTest.test_iterationcontains @ linux-x86_64 +test.test_array.DoubleTest.test_iterator_pickle @ linux-x86_64 +test.test_array.DoubleTest.test_len @ linux-x86_64 +test.test_array.DoubleTest.test_mul @ linux-x86_64 +test.test_array.DoubleTest.test_nan @ linux-x86_64 +test.test_array.DoubleTest.test_pickle @ linux-x86_64 +test.test_array.DoubleTest.test_pickle_for_empty_array @ linux-x86_64 +test.test_array.DoubleTest.test_pop @ linux-x86_64 +test.test_array.DoubleTest.test_reduce_ex @ linux-x86_64 +test.test_array.DoubleTest.test_remove @ linux-x86_64 +test.test_array.DoubleTest.test_repr @ linux-x86_64 +test.test_array.DoubleTest.test_reverse @ linux-x86_64 +test.test_array.DoubleTest.test_reverse_iterator @ linux-x86_64 +test.test_array.DoubleTest.test_setitem @ linux-x86_64 +test.test_array.DoubleTest.test_setslice @ linux-x86_64 +test.test_array.DoubleTest.test_str @ linux-x86_64 +test.test_array.DoubleTest.test_subclass_with_kwargs @ linux-x86_64 +test.test_array.DoubleTest.test_subclassing @ linux-x86_64 +test.test_array.DoubleTest.test_tofrombytes @ linux-x86_64 +test.test_array.DoubleTest.test_tofromfile @ linux-x86_64 +test.test_array.DoubleTest.test_tofromlist @ linux-x86_64 +test.test_array.FloatTest.test_add @ linux-x86_64 +test.test_array.FloatTest.test_assignment @ linux-x86_64 +test.test_array.FloatTest.test_buffer @ linux-x86_64 +test.test_array.FloatTest.test_buffer_info @ linux-x86_64 +test.test_array.FloatTest.test_bug_782369 @ linux-x86_64 +test.test_array.FloatTest.test_byteswap @ linux-x86_64 +test.test_array.FloatTest.test_cmp @ linux-x86_64 +test.test_array.FloatTest.test_constructor @ linux-x86_64 +test.test_array.FloatTest.test_constructor_with_iterable_argument @ linux-x86_64 +test.test_array.FloatTest.test_copy @ linux-x86_64 +test.test_array.FloatTest.test_count @ linux-x86_64 +test.test_array.FloatTest.test_coveritertraverse @ linux-x86_64 +test.test_array.FloatTest.test_create_from_bytes @ linux-x86_64 +test.test_array.FloatTest.test_deepcopy @ linux-x86_64 +test.test_array.FloatTest.test_delitem @ linux-x86_64 +test.test_array.FloatTest.test_delslice @ linux-x86_64 +test.test_array.FloatTest.test_exhausted_iterator @ linux-x86_64 +test.test_array.FloatTest.test_exhausted_reverse_iterator @ linux-x86_64 +test.test_array.FloatTest.test_extend @ linux-x86_64 +test.test_array.FloatTest.test_extended_getslice @ linux-x86_64 +test.test_array.FloatTest.test_extended_set_del_slice @ linux-x86_64 +test.test_array.FloatTest.test_extslice @ linux-x86_64 +test.test_array.FloatTest.test_filewrite @ linux-x86_64 +test.test_array.FloatTest.test_fromarray @ linux-x86_64 +test.test_array.FloatTest.test_frombytearray @ linux-x86_64 +test.test_array.FloatTest.test_fromfile_ioerror @ linux-x86_64 +test.test_array.FloatTest.test_getitem @ linux-x86_64 +test.test_array.FloatTest.test_getslice @ linux-x86_64 +test.test_array.FloatTest.test_iadd @ linux-x86_64 +test.test_array.FloatTest.test_imul @ linux-x86_64 +test.test_array.FloatTest.test_index @ linux-x86_64 +test.test_array.FloatTest.test_initialize_with_unicode @ linux-x86_64 +test.test_array.FloatTest.test_insert @ linux-x86_64 +test.test_array.FloatTest.test_iterationcontains @ linux-x86_64 +test.test_array.FloatTest.test_iterator_pickle @ linux-x86_64 +test.test_array.FloatTest.test_len @ linux-x86_64 +test.test_array.FloatTest.test_mul @ linux-x86_64 +test.test_array.FloatTest.test_nan @ linux-x86_64 +test.test_array.FloatTest.test_pickle @ linux-x86_64 +test.test_array.FloatTest.test_pickle_for_empty_array @ linux-x86_64 +test.test_array.FloatTest.test_pop @ linux-x86_64 +test.test_array.FloatTest.test_reduce_ex @ linux-x86_64 +test.test_array.FloatTest.test_remove @ linux-x86_64 +test.test_array.FloatTest.test_repr @ linux-x86_64 +test.test_array.FloatTest.test_reverse @ linux-x86_64 +test.test_array.FloatTest.test_reverse_iterator @ linux-x86_64 +test.test_array.FloatTest.test_setitem @ linux-x86_64 +test.test_array.FloatTest.test_setslice @ linux-x86_64 +test.test_array.FloatTest.test_str @ linux-x86_64 +test.test_array.FloatTest.test_subclass_with_kwargs @ linux-x86_64 +test.test_array.FloatTest.test_subclassing @ linux-x86_64 +test.test_array.FloatTest.test_tofrombytes @ linux-x86_64 +test.test_array.FloatTest.test_tofromfile @ linux-x86_64 +test.test_array.FloatTest.test_tofromlist @ linux-x86_64 +test.test_array.IntTest.test_add @ linux-x86_64 +test.test_array.IntTest.test_assignment @ linux-x86_64 +test.test_array.IntTest.test_buffer @ linux-x86_64 +test.test_array.IntTest.test_buffer_info @ linux-x86_64 +test.test_array.IntTest.test_bug_782369 @ linux-x86_64 +test.test_array.IntTest.test_byteswap @ linux-x86_64 +test.test_array.IntTest.test_cmp @ linux-x86_64 +test.test_array.IntTest.test_constructor @ linux-x86_64 +test.test_array.IntTest.test_constructor_with_iterable_argument @ linux-x86_64 +test.test_array.IntTest.test_copy @ linux-x86_64 +test.test_array.IntTest.test_count @ linux-x86_64 +test.test_array.IntTest.test_coveritertraverse @ linux-x86_64 +test.test_array.IntTest.test_create_from_bytes @ linux-x86_64 +test.test_array.IntTest.test_deepcopy @ linux-x86_64 +test.test_array.IntTest.test_delitem @ linux-x86_64 +test.test_array.IntTest.test_delslice @ linux-x86_64 +test.test_array.IntTest.test_exhausted_iterator @ linux-x86_64 +test.test_array.IntTest.test_exhausted_reverse_iterator @ linux-x86_64 +test.test_array.IntTest.test_extend @ linux-x86_64 +test.test_array.IntTest.test_extended_getslice @ linux-x86_64 +test.test_array.IntTest.test_extended_set_del_slice @ linux-x86_64 +test.test_array.IntTest.test_extslice @ linux-x86_64 +test.test_array.IntTest.test_filewrite @ linux-x86_64 +test.test_array.IntTest.test_fromarray @ linux-x86_64 +test.test_array.IntTest.test_frombytearray @ linux-x86_64 +test.test_array.IntTest.test_fromfile_ioerror @ linux-x86_64 +test.test_array.IntTest.test_getitem @ linux-x86_64 +test.test_array.IntTest.test_getslice @ linux-x86_64 +test.test_array.IntTest.test_iadd @ linux-x86_64 +test.test_array.IntTest.test_imul @ linux-x86_64 +test.test_array.IntTest.test_index @ linux-x86_64 +test.test_array.IntTest.test_initialize_with_unicode @ linux-x86_64 +test.test_array.IntTest.test_insert @ linux-x86_64 +test.test_array.IntTest.test_iterationcontains @ linux-x86_64 +test.test_array.IntTest.test_iterator_pickle @ linux-x86_64 +test.test_array.IntTest.test_len @ linux-x86_64 +test.test_array.IntTest.test_mul @ linux-x86_64 +test.test_array.IntTest.test_overflow @ linux-x86_64 +test.test_array.IntTest.test_pickle @ linux-x86_64 +test.test_array.IntTest.test_pickle_for_empty_array @ linux-x86_64 +test.test_array.IntTest.test_pop @ linux-x86_64 +test.test_array.IntTest.test_reduce_ex @ linux-x86_64 +test.test_array.IntTest.test_remove @ linux-x86_64 +test.test_array.IntTest.test_repr @ linux-x86_64 +test.test_array.IntTest.test_reverse @ linux-x86_64 +test.test_array.IntTest.test_reverse_iterator @ linux-x86_64 +test.test_array.IntTest.test_setitem @ linux-x86_64 +test.test_array.IntTest.test_setslice @ linux-x86_64 +test.test_array.IntTest.test_str @ linux-x86_64 +test.test_array.IntTest.test_subclass_with_kwargs @ linux-x86_64 +test.test_array.IntTest.test_subclassing @ linux-x86_64 +test.test_array.IntTest.test_tofrombytes @ linux-x86_64 +test.test_array.IntTest.test_tofromfile @ linux-x86_64 +test.test_array.IntTest.test_tofromlist @ linux-x86_64 +test.test_array.IntTest.test_type_error @ linux-x86_64 +test.test_array.LargeArrayTest.test_access @ linux-x86_64 +test.test_array.LargeArrayTest.test_append @ linux-x86_64 +test.test_array.LargeArrayTest.test_count @ linux-x86_64 +test.test_array.LargeArrayTest.test_example_data @ linux-x86_64 +test.test_array.LargeArrayTest.test_extend @ linux-x86_64 +test.test_array.LargeArrayTest.test_frombytes @ linux-x86_64 +test.test_array.LargeArrayTest.test_fromlist @ linux-x86_64 +test.test_array.LargeArrayTest.test_index @ linux-x86_64 +test.test_array.LargeArrayTest.test_insert @ linux-x86_64 +test.test_array.LargeArrayTest.test_pop @ linux-x86_64 +test.test_array.LargeArrayTest.test_remove @ linux-x86_64 +test.test_array.LargeArrayTest.test_reverse @ linux-x86_64 +test.test_array.LargeArrayTest.test_slice @ linux-x86_64 +test.test_array.LargeArrayTest.test_tolist @ linux-x86_64 +test.test_array.LongLongTest.test_add @ linux-x86_64 +test.test_array.LongLongTest.test_assignment @ linux-x86_64 +test.test_array.LongLongTest.test_buffer @ linux-x86_64 +test.test_array.LongLongTest.test_buffer_info @ linux-x86_64 +test.test_array.LongLongTest.test_bug_782369 @ linux-x86_64 +test.test_array.LongLongTest.test_byteswap @ linux-x86_64 +test.test_array.LongLongTest.test_cmp @ linux-x86_64 +test.test_array.LongLongTest.test_constructor @ linux-x86_64 +test.test_array.LongLongTest.test_constructor_with_iterable_argument @ linux-x86_64 +test.test_array.LongLongTest.test_copy @ linux-x86_64 +test.test_array.LongLongTest.test_count @ linux-x86_64 +test.test_array.LongLongTest.test_coveritertraverse @ linux-x86_64 +test.test_array.LongLongTest.test_create_from_bytes @ linux-x86_64 +test.test_array.LongLongTest.test_deepcopy @ linux-x86_64 +test.test_array.LongLongTest.test_delitem @ linux-x86_64 +test.test_array.LongLongTest.test_delslice @ linux-x86_64 +test.test_array.LongLongTest.test_exhausted_iterator @ linux-x86_64 +test.test_array.LongLongTest.test_exhausted_reverse_iterator @ linux-x86_64 +test.test_array.LongLongTest.test_extend @ linux-x86_64 +test.test_array.LongLongTest.test_extended_getslice @ linux-x86_64 +test.test_array.LongLongTest.test_extended_set_del_slice @ linux-x86_64 +test.test_array.LongLongTest.test_extslice @ linux-x86_64 +test.test_array.LongLongTest.test_filewrite @ linux-x86_64 +test.test_array.LongLongTest.test_fromarray @ linux-x86_64 +test.test_array.LongLongTest.test_frombytearray @ linux-x86_64 +test.test_array.LongLongTest.test_fromfile_ioerror @ linux-x86_64 +test.test_array.LongLongTest.test_getitem @ linux-x86_64 +test.test_array.LongLongTest.test_getslice @ linux-x86_64 +test.test_array.LongLongTest.test_iadd @ linux-x86_64 +test.test_array.LongLongTest.test_imul @ linux-x86_64 +test.test_array.LongLongTest.test_index @ linux-x86_64 +test.test_array.LongLongTest.test_initialize_with_unicode @ linux-x86_64 +test.test_array.LongLongTest.test_insert @ linux-x86_64 +test.test_array.LongLongTest.test_iterationcontains @ linux-x86_64 +test.test_array.LongLongTest.test_iterator_pickle @ linux-x86_64 +test.test_array.LongLongTest.test_len @ linux-x86_64 +test.test_array.LongLongTest.test_mul @ linux-x86_64 +test.test_array.LongLongTest.test_overflow @ linux-x86_64 +test.test_array.LongLongTest.test_pickle @ linux-x86_64 +test.test_array.LongLongTest.test_pickle_for_empty_array @ linux-x86_64 +test.test_array.LongLongTest.test_pop @ linux-x86_64 +test.test_array.LongLongTest.test_reduce_ex @ linux-x86_64 +test.test_array.LongLongTest.test_remove @ linux-x86_64 +test.test_array.LongLongTest.test_repr @ linux-x86_64 +test.test_array.LongLongTest.test_reverse @ linux-x86_64 +test.test_array.LongLongTest.test_reverse_iterator @ linux-x86_64 +test.test_array.LongLongTest.test_setitem @ linux-x86_64 +test.test_array.LongLongTest.test_setslice @ linux-x86_64 +test.test_array.LongLongTest.test_str @ linux-x86_64 +test.test_array.LongLongTest.test_subclass_with_kwargs @ linux-x86_64 +test.test_array.LongLongTest.test_subclassing @ linux-x86_64 +test.test_array.LongLongTest.test_tofrombytes @ linux-x86_64 +test.test_array.LongLongTest.test_tofromfile @ linux-x86_64 +test.test_array.LongLongTest.test_tofromlist @ linux-x86_64 +test.test_array.LongLongTest.test_type_error @ linux-x86_64 +test.test_array.LongTest.test_add @ linux-x86_64 +test.test_array.LongTest.test_assignment @ linux-x86_64 +test.test_array.LongTest.test_buffer @ linux-x86_64 +test.test_array.LongTest.test_buffer_info @ linux-x86_64 +test.test_array.LongTest.test_bug_782369 @ linux-x86_64 +test.test_array.LongTest.test_byteswap @ linux-x86_64 +test.test_array.LongTest.test_cmp @ linux-x86_64 +test.test_array.LongTest.test_constructor @ linux-x86_64 +test.test_array.LongTest.test_constructor_with_iterable_argument @ linux-x86_64 +test.test_array.LongTest.test_copy @ linux-x86_64 +test.test_array.LongTest.test_count @ linux-x86_64 +test.test_array.LongTest.test_coveritertraverse @ linux-x86_64 +test.test_array.LongTest.test_create_from_bytes @ linux-x86_64 +test.test_array.LongTest.test_deepcopy @ linux-x86_64 +test.test_array.LongTest.test_delitem @ linux-x86_64 +test.test_array.LongTest.test_delslice @ linux-x86_64 +test.test_array.LongTest.test_exhausted_iterator @ linux-x86_64 +test.test_array.LongTest.test_exhausted_reverse_iterator @ linux-x86_64 +test.test_array.LongTest.test_extend @ linux-x86_64 +test.test_array.LongTest.test_extended_getslice @ linux-x86_64 +test.test_array.LongTest.test_extended_set_del_slice @ linux-x86_64 +test.test_array.LongTest.test_extslice @ linux-x86_64 +test.test_array.LongTest.test_filewrite @ linux-x86_64 +test.test_array.LongTest.test_fromarray @ linux-x86_64 +test.test_array.LongTest.test_frombytearray @ linux-x86_64 +test.test_array.LongTest.test_fromfile_ioerror @ linux-x86_64 +test.test_array.LongTest.test_getitem @ linux-x86_64 +test.test_array.LongTest.test_getslice @ linux-x86_64 +test.test_array.LongTest.test_iadd @ linux-x86_64 +test.test_array.LongTest.test_imul @ linux-x86_64 +test.test_array.LongTest.test_index @ linux-x86_64 +test.test_array.LongTest.test_initialize_with_unicode @ linux-x86_64 +test.test_array.LongTest.test_insert @ linux-x86_64 +test.test_array.LongTest.test_iterationcontains @ linux-x86_64 +test.test_array.LongTest.test_iterator_pickle @ linux-x86_64 +test.test_array.LongTest.test_len @ linux-x86_64 +test.test_array.LongTest.test_mul @ linux-x86_64 +test.test_array.LongTest.test_overflow @ linux-x86_64 +test.test_array.LongTest.test_pickle @ linux-x86_64 +test.test_array.LongTest.test_pickle_for_empty_array @ linux-x86_64 +test.test_array.LongTest.test_pop @ linux-x86_64 +test.test_array.LongTest.test_reduce_ex @ linux-x86_64 +test.test_array.LongTest.test_remove @ linux-x86_64 +test.test_array.LongTest.test_repr @ linux-x86_64 +test.test_array.LongTest.test_reverse @ linux-x86_64 +test.test_array.LongTest.test_reverse_iterator @ linux-x86_64 +test.test_array.LongTest.test_setitem @ linux-x86_64 +test.test_array.LongTest.test_setslice @ linux-x86_64 +test.test_array.LongTest.test_str @ linux-x86_64 +test.test_array.LongTest.test_subclass_with_kwargs @ linux-x86_64 +test.test_array.LongTest.test_subclassing @ linux-x86_64 +test.test_array.LongTest.test_tofrombytes @ linux-x86_64 +test.test_array.LongTest.test_tofromfile @ linux-x86_64 +test.test_array.LongTest.test_tofromlist @ linux-x86_64 +test.test_array.LongTest.test_type_error @ linux-x86_64 +test.test_array.MiscTest.test_empty @ linux-x86_64 +test.test_array.ShortTest.test_add @ linux-x86_64 +test.test_array.ShortTest.test_assignment @ linux-x86_64 +test.test_array.ShortTest.test_buffer @ linux-x86_64 +test.test_array.ShortTest.test_buffer_info @ linux-x86_64 +test.test_array.ShortTest.test_bug_782369 @ linux-x86_64 +test.test_array.ShortTest.test_byteswap @ linux-x86_64 +test.test_array.ShortTest.test_cmp @ linux-x86_64 +test.test_array.ShortTest.test_constructor @ linux-x86_64 +test.test_array.ShortTest.test_constructor_with_iterable_argument @ linux-x86_64 +test.test_array.ShortTest.test_copy @ linux-x86_64 +test.test_array.ShortTest.test_count @ linux-x86_64 +test.test_array.ShortTest.test_coveritertraverse @ linux-x86_64 +test.test_array.ShortTest.test_create_from_bytes @ linux-x86_64 +test.test_array.ShortTest.test_deepcopy @ linux-x86_64 +test.test_array.ShortTest.test_delitem @ linux-x86_64 +test.test_array.ShortTest.test_delslice @ linux-x86_64 +test.test_array.ShortTest.test_exhausted_iterator @ linux-x86_64 +test.test_array.ShortTest.test_exhausted_reverse_iterator @ linux-x86_64 +test.test_array.ShortTest.test_extend @ linux-x86_64 +test.test_array.ShortTest.test_extended_getslice @ linux-x86_64 +test.test_array.ShortTest.test_extended_set_del_slice @ linux-x86_64 +test.test_array.ShortTest.test_extslice @ linux-x86_64 +test.test_array.ShortTest.test_filewrite @ linux-x86_64 +test.test_array.ShortTest.test_fromarray @ linux-x86_64 +test.test_array.ShortTest.test_frombytearray @ linux-x86_64 +test.test_array.ShortTest.test_fromfile_ioerror @ linux-x86_64 +test.test_array.ShortTest.test_getitem @ linux-x86_64 +test.test_array.ShortTest.test_getslice @ linux-x86_64 +test.test_array.ShortTest.test_iadd @ linux-x86_64 +test.test_array.ShortTest.test_imul @ linux-x86_64 +test.test_array.ShortTest.test_index @ linux-x86_64 +test.test_array.ShortTest.test_initialize_with_unicode @ linux-x86_64 +test.test_array.ShortTest.test_insert @ linux-x86_64 +test.test_array.ShortTest.test_iterationcontains @ linux-x86_64 +test.test_array.ShortTest.test_iterator_pickle @ linux-x86_64 +test.test_array.ShortTest.test_len @ linux-x86_64 +test.test_array.ShortTest.test_mul @ linux-x86_64 +test.test_array.ShortTest.test_overflow @ linux-x86_64 +test.test_array.ShortTest.test_pickle @ linux-x86_64 +test.test_array.ShortTest.test_pickle_for_empty_array @ linux-x86_64 +test.test_array.ShortTest.test_pop @ linux-x86_64 +test.test_array.ShortTest.test_reduce_ex @ linux-x86_64 +test.test_array.ShortTest.test_remove @ linux-x86_64 +test.test_array.ShortTest.test_repr @ linux-x86_64 +test.test_array.ShortTest.test_reverse @ linux-x86_64 +test.test_array.ShortTest.test_reverse_iterator @ linux-x86_64 +test.test_array.ShortTest.test_setitem @ linux-x86_64 +test.test_array.ShortTest.test_setslice @ linux-x86_64 +test.test_array.ShortTest.test_str @ linux-x86_64 +test.test_array.ShortTest.test_subclass_with_kwargs @ linux-x86_64 +test.test_array.ShortTest.test_subclassing @ linux-x86_64 +test.test_array.ShortTest.test_tofrombytes @ linux-x86_64 +test.test_array.ShortTest.test_tofromfile @ linux-x86_64 +test.test_array.ShortTest.test_tofromlist @ linux-x86_64 +test.test_array.ShortTest.test_type_error @ linux-x86_64 +test.test_array.UnicodeTest.test_add @ linux-x86_64 +test.test_array.UnicodeTest.test_buffer @ linux-x86_64 +test.test_array.UnicodeTest.test_buffer_info @ linux-x86_64 +test.test_array.UnicodeTest.test_bug_782369 @ linux-x86_64 +test.test_array.UnicodeTest.test_byteswap @ linux-x86_64 +test.test_array.UnicodeTest.test_cmp @ linux-x86_64 +test.test_array.UnicodeTest.test_constructor @ linux-x86_64 +test.test_array.UnicodeTest.test_constructor_with_iterable_argument @ linux-x86_64 +test.test_array.UnicodeTest.test_copy @ linux-x86_64 +test.test_array.UnicodeTest.test_count @ linux-x86_64 +test.test_array.UnicodeTest.test_coveritertraverse @ linux-x86_64 +test.test_array.UnicodeTest.test_create_from_bytes @ linux-x86_64 +test.test_array.UnicodeTest.test_deepcopy @ linux-x86_64 +test.test_array.UnicodeTest.test_delitem @ linux-x86_64 +test.test_array.UnicodeTest.test_exhausted_iterator @ linux-x86_64 +test.test_array.UnicodeTest.test_exhausted_reverse_iterator @ linux-x86_64 +test.test_array.UnicodeTest.test_extend @ linux-x86_64 +test.test_array.UnicodeTest.test_extended_getslice @ linux-x86_64 +test.test_array.UnicodeTest.test_extended_set_del_slice @ linux-x86_64 +test.test_array.UnicodeTest.test_filewrite @ linux-x86_64 +test.test_array.UnicodeTest.test_fromarray @ linux-x86_64 +test.test_array.UnicodeTest.test_fromfile_ioerror @ linux-x86_64 +test.test_array.UnicodeTest.test_getitem @ linux-x86_64 +test.test_array.UnicodeTest.test_getslice @ linux-x86_64 +test.test_array.UnicodeTest.test_iadd @ linux-x86_64 +test.test_array.UnicodeTest.test_imul @ linux-x86_64 +test.test_array.UnicodeTest.test_index @ linux-x86_64 +test.test_array.UnicodeTest.test_initialize_with_unicode @ linux-x86_64 +test.test_array.UnicodeTest.test_insert @ linux-x86_64 +test.test_array.UnicodeTest.test_issue17223 @ linux-x86_64 +test.test_array.UnicodeTest.test_iterator_pickle @ linux-x86_64 +test.test_array.UnicodeTest.test_len @ linux-x86_64 +test.test_array.UnicodeTest.test_mul @ linux-x86_64 +test.test_array.UnicodeTest.test_pickle @ linux-x86_64 +test.test_array.UnicodeTest.test_pickle_for_empty_array @ linux-x86_64 +test.test_array.UnicodeTest.test_pop @ linux-x86_64 +test.test_array.UnicodeTest.test_reduce_ex @ linux-x86_64 +test.test_array.UnicodeTest.test_remove @ linux-x86_64 +test.test_array.UnicodeTest.test_repr @ linux-x86_64 +test.test_array.UnicodeTest.test_reverse @ linux-x86_64 +test.test_array.UnicodeTest.test_reverse_iterator @ linux-x86_64 +test.test_array.UnicodeTest.test_setitem @ linux-x86_64 +test.test_array.UnicodeTest.test_setslice @ linux-x86_64 +test.test_array.UnicodeTest.test_str @ linux-x86_64 +test.test_array.UnicodeTest.test_subclass_with_kwargs @ linux-x86_64 +test.test_array.UnicodeTest.test_tofrombytes @ linux-x86_64 +test.test_array.UnicodeTest.test_tofromfile @ linux-x86_64 +test.test_array.UnicodeTest.test_tofromlist @ linux-x86_64 +test.test_array.UnicodeTest.test_unicode @ linux-x86_64 +test.test_array.UnsignedByteTest.test_add @ linux-x86_64 +test.test_array.UnsignedByteTest.test_assignment @ linux-x86_64 +test.test_array.UnsignedByteTest.test_buffer @ linux-x86_64 +test.test_array.UnsignedByteTest.test_buffer_info @ linux-x86_64 +test.test_array.UnsignedByteTest.test_bug_782369 @ linux-x86_64 +test.test_array.UnsignedByteTest.test_bytes_extend @ linux-x86_64 +test.test_array.UnsignedByteTest.test_byteswap @ linux-x86_64 +test.test_array.UnsignedByteTest.test_cmp @ linux-x86_64 +test.test_array.UnsignedByteTest.test_constructor @ linux-x86_64 +test.test_array.UnsignedByteTest.test_constructor_with_iterable_argument @ linux-x86_64 +test.test_array.UnsignedByteTest.test_copy @ linux-x86_64 +test.test_array.UnsignedByteTest.test_count @ linux-x86_64 +test.test_array.UnsignedByteTest.test_coveritertraverse @ linux-x86_64 +test.test_array.UnsignedByteTest.test_create_from_bytes @ linux-x86_64 +test.test_array.UnsignedByteTest.test_deepcopy @ linux-x86_64 +test.test_array.UnsignedByteTest.test_delitem @ linux-x86_64 +test.test_array.UnsignedByteTest.test_delslice @ linux-x86_64 +test.test_array.UnsignedByteTest.test_exhausted_iterator @ linux-x86_64 +test.test_array.UnsignedByteTest.test_exhausted_reverse_iterator @ linux-x86_64 +test.test_array.UnsignedByteTest.test_extend @ linux-x86_64 +test.test_array.UnsignedByteTest.test_extended_getslice @ linux-x86_64 +test.test_array.UnsignedByteTest.test_extended_set_del_slice @ linux-x86_64 +test.test_array.UnsignedByteTest.test_extslice @ linux-x86_64 +test.test_array.UnsignedByteTest.test_filewrite @ linux-x86_64 +test.test_array.UnsignedByteTest.test_fromarray @ linux-x86_64 +test.test_array.UnsignedByteTest.test_frombytearray @ linux-x86_64 +test.test_array.UnsignedByteTest.test_fromfile_ioerror @ linux-x86_64 +test.test_array.UnsignedByteTest.test_getitem @ linux-x86_64 +test.test_array.UnsignedByteTest.test_getslice @ linux-x86_64 +test.test_array.UnsignedByteTest.test_iadd @ linux-x86_64 +test.test_array.UnsignedByteTest.test_imul @ linux-x86_64 +test.test_array.UnsignedByteTest.test_index @ linux-x86_64 +test.test_array.UnsignedByteTest.test_initialize_with_unicode @ linux-x86_64 +test.test_array.UnsignedByteTest.test_insert @ linux-x86_64 +test.test_array.UnsignedByteTest.test_iterationcontains @ linux-x86_64 +test.test_array.UnsignedByteTest.test_iterator_pickle @ linux-x86_64 +test.test_array.UnsignedByteTest.test_len @ linux-x86_64 +test.test_array.UnsignedByteTest.test_mul @ linux-x86_64 +test.test_array.UnsignedByteTest.test_overflow @ linux-x86_64 +test.test_array.UnsignedByteTest.test_pickle @ linux-x86_64 +test.test_array.UnsignedByteTest.test_pickle_for_empty_array @ linux-x86_64 +test.test_array.UnsignedByteTest.test_pop @ linux-x86_64 +test.test_array.UnsignedByteTest.test_reduce_ex @ linux-x86_64 +test.test_array.UnsignedByteTest.test_remove @ linux-x86_64 +test.test_array.UnsignedByteTest.test_repr @ linux-x86_64 +test.test_array.UnsignedByteTest.test_reverse @ linux-x86_64 +test.test_array.UnsignedByteTest.test_reverse_iterator @ linux-x86_64 +test.test_array.UnsignedByteTest.test_setitem @ linux-x86_64 +test.test_array.UnsignedByteTest.test_setslice @ linux-x86_64 +test.test_array.UnsignedByteTest.test_str @ linux-x86_64 +test.test_array.UnsignedByteTest.test_subclass_with_kwargs @ linux-x86_64 +test.test_array.UnsignedByteTest.test_subclassing @ linux-x86_64 +test.test_array.UnsignedByteTest.test_tofrombytes @ linux-x86_64 +test.test_array.UnsignedByteTest.test_tofromfile @ linux-x86_64 +test.test_array.UnsignedByteTest.test_tofromlist @ linux-x86_64 +test.test_array.UnsignedByteTest.test_type_error @ linux-x86_64 +test.test_array.UnsignedIntTest.test_add @ linux-x86_64 +test.test_array.UnsignedIntTest.test_assignment @ linux-x86_64 +test.test_array.UnsignedIntTest.test_buffer @ linux-x86_64 +test.test_array.UnsignedIntTest.test_buffer_info @ linux-x86_64 +test.test_array.UnsignedIntTest.test_bug_782369 @ linux-x86_64 +test.test_array.UnsignedIntTest.test_bytes_extend @ linux-x86_64 +test.test_array.UnsignedIntTest.test_byteswap @ linux-x86_64 +test.test_array.UnsignedIntTest.test_cmp @ linux-x86_64 +test.test_array.UnsignedIntTest.test_constructor @ linux-x86_64 +test.test_array.UnsignedIntTest.test_constructor_with_iterable_argument @ linux-x86_64 +test.test_array.UnsignedIntTest.test_copy @ linux-x86_64 +test.test_array.UnsignedIntTest.test_count @ linux-x86_64 +test.test_array.UnsignedIntTest.test_coveritertraverse @ linux-x86_64 +test.test_array.UnsignedIntTest.test_create_from_bytes @ linux-x86_64 +test.test_array.UnsignedIntTest.test_deepcopy @ linux-x86_64 +test.test_array.UnsignedIntTest.test_delitem @ linux-x86_64 +test.test_array.UnsignedIntTest.test_delslice @ linux-x86_64 +test.test_array.UnsignedIntTest.test_exhausted_iterator @ linux-x86_64 +test.test_array.UnsignedIntTest.test_exhausted_reverse_iterator @ linux-x86_64 +test.test_array.UnsignedIntTest.test_extend @ linux-x86_64 +test.test_array.UnsignedIntTest.test_extended_getslice @ linux-x86_64 +test.test_array.UnsignedIntTest.test_extended_set_del_slice @ linux-x86_64 +test.test_array.UnsignedIntTest.test_extslice @ linux-x86_64 +test.test_array.UnsignedIntTest.test_filewrite @ linux-x86_64 +test.test_array.UnsignedIntTest.test_fromarray @ linux-x86_64 +test.test_array.UnsignedIntTest.test_frombytearray @ linux-x86_64 +test.test_array.UnsignedIntTest.test_fromfile_ioerror @ linux-x86_64 +test.test_array.UnsignedIntTest.test_getitem @ linux-x86_64 +test.test_array.UnsignedIntTest.test_getslice @ linux-x86_64 +test.test_array.UnsignedIntTest.test_iadd @ linux-x86_64 +test.test_array.UnsignedIntTest.test_imul @ linux-x86_64 +test.test_array.UnsignedIntTest.test_index @ linux-x86_64 +test.test_array.UnsignedIntTest.test_initialize_with_unicode @ linux-x86_64 +test.test_array.UnsignedIntTest.test_insert @ linux-x86_64 +test.test_array.UnsignedIntTest.test_iterationcontains @ linux-x86_64 +test.test_array.UnsignedIntTest.test_iterator_pickle @ linux-x86_64 +test.test_array.UnsignedIntTest.test_len @ linux-x86_64 +test.test_array.UnsignedIntTest.test_mul @ linux-x86_64 +test.test_array.UnsignedIntTest.test_overflow @ linux-x86_64 +test.test_array.UnsignedIntTest.test_pickle @ linux-x86_64 +test.test_array.UnsignedIntTest.test_pickle_for_empty_array @ linux-x86_64 +test.test_array.UnsignedIntTest.test_pop @ linux-x86_64 +test.test_array.UnsignedIntTest.test_reduce_ex @ linux-x86_64 +test.test_array.UnsignedIntTest.test_remove @ linux-x86_64 +test.test_array.UnsignedIntTest.test_repr @ linux-x86_64 +test.test_array.UnsignedIntTest.test_reverse @ linux-x86_64 +test.test_array.UnsignedIntTest.test_reverse_iterator @ linux-x86_64 +test.test_array.UnsignedIntTest.test_setitem @ linux-x86_64 +test.test_array.UnsignedIntTest.test_setslice @ linux-x86_64 +test.test_array.UnsignedIntTest.test_str @ linux-x86_64 +test.test_array.UnsignedIntTest.test_subclass_with_kwargs @ linux-x86_64 +test.test_array.UnsignedIntTest.test_subclassing @ linux-x86_64 +test.test_array.UnsignedIntTest.test_tofrombytes @ linux-x86_64 +test.test_array.UnsignedIntTest.test_tofromfile @ linux-x86_64 +test.test_array.UnsignedIntTest.test_tofromlist @ linux-x86_64 +test.test_array.UnsignedIntTest.test_type_error @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_add @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_assignment @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_buffer @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_buffer_info @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_bug_782369 @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_bytes_extend @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_byteswap @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_cmp @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_constructor @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_constructor_with_iterable_argument @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_copy @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_count @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_coveritertraverse @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_create_from_bytes @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_deepcopy @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_delitem @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_delslice @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_exhausted_iterator @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_exhausted_reverse_iterator @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_extend @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_extended_getslice @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_extended_set_del_slice @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_extslice @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_filewrite @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_fromarray @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_frombytearray @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_fromfile_ioerror @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_getitem @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_getslice @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_iadd @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_imul @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_index @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_initialize_with_unicode @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_insert @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_iterationcontains @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_iterator_pickle @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_len @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_mul @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_overflow @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_pickle @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_pickle_for_empty_array @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_pop @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_reduce_ex @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_remove @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_repr @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_reverse @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_reverse_iterator @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_setitem @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_setslice @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_str @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_subclass_with_kwargs @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_subclassing @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_tofrombytes @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_tofromfile @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_tofromlist @ linux-x86_64 +test.test_array.UnsignedLongLongTest.test_type_error @ linux-x86_64 +test.test_array.UnsignedLongTest.test_add @ linux-x86_64 +test.test_array.UnsignedLongTest.test_assignment @ linux-x86_64 +test.test_array.UnsignedLongTest.test_buffer @ linux-x86_64 +test.test_array.UnsignedLongTest.test_buffer_info @ linux-x86_64 +test.test_array.UnsignedLongTest.test_bug_782369 @ linux-x86_64 +test.test_array.UnsignedLongTest.test_bytes_extend @ linux-x86_64 +test.test_array.UnsignedLongTest.test_byteswap @ linux-x86_64 +test.test_array.UnsignedLongTest.test_cmp @ linux-x86_64 +test.test_array.UnsignedLongTest.test_constructor @ linux-x86_64 +test.test_array.UnsignedLongTest.test_constructor_with_iterable_argument @ linux-x86_64 +test.test_array.UnsignedLongTest.test_copy @ linux-x86_64 +test.test_array.UnsignedLongTest.test_count @ linux-x86_64 +test.test_array.UnsignedLongTest.test_coveritertraverse @ linux-x86_64 +test.test_array.UnsignedLongTest.test_create_from_bytes @ linux-x86_64 +test.test_array.UnsignedLongTest.test_deepcopy @ linux-x86_64 +test.test_array.UnsignedLongTest.test_delitem @ linux-x86_64 +test.test_array.UnsignedLongTest.test_delslice @ linux-x86_64 +test.test_array.UnsignedLongTest.test_exhausted_iterator @ linux-x86_64 +test.test_array.UnsignedLongTest.test_exhausted_reverse_iterator @ linux-x86_64 +test.test_array.UnsignedLongTest.test_extend @ linux-x86_64 +test.test_array.UnsignedLongTest.test_extended_getslice @ linux-x86_64 +test.test_array.UnsignedLongTest.test_extended_set_del_slice @ linux-x86_64 +test.test_array.UnsignedLongTest.test_extslice @ linux-x86_64 +test.test_array.UnsignedLongTest.test_filewrite @ linux-x86_64 +test.test_array.UnsignedLongTest.test_fromarray @ linux-x86_64 +test.test_array.UnsignedLongTest.test_frombytearray @ linux-x86_64 +test.test_array.UnsignedLongTest.test_fromfile_ioerror @ linux-x86_64 +test.test_array.UnsignedLongTest.test_getitem @ linux-x86_64 +test.test_array.UnsignedLongTest.test_getslice @ linux-x86_64 +test.test_array.UnsignedLongTest.test_iadd @ linux-x86_64 +test.test_array.UnsignedLongTest.test_imul @ linux-x86_64 +test.test_array.UnsignedLongTest.test_index @ linux-x86_64 +test.test_array.UnsignedLongTest.test_initialize_with_unicode @ linux-x86_64 +test.test_array.UnsignedLongTest.test_insert @ linux-x86_64 +test.test_array.UnsignedLongTest.test_iterationcontains @ linux-x86_64 +test.test_array.UnsignedLongTest.test_iterator_pickle @ linux-x86_64 +test.test_array.UnsignedLongTest.test_len @ linux-x86_64 +test.test_array.UnsignedLongTest.test_mul @ linux-x86_64 +test.test_array.UnsignedLongTest.test_overflow @ linux-x86_64 +test.test_array.UnsignedLongTest.test_pickle @ linux-x86_64 +test.test_array.UnsignedLongTest.test_pickle_for_empty_array @ linux-x86_64 +test.test_array.UnsignedLongTest.test_pop @ linux-x86_64 +test.test_array.UnsignedLongTest.test_reduce_ex @ linux-x86_64 +test.test_array.UnsignedLongTest.test_remove @ linux-x86_64 +test.test_array.UnsignedLongTest.test_repr @ linux-x86_64 +test.test_array.UnsignedLongTest.test_reverse @ linux-x86_64 +test.test_array.UnsignedLongTest.test_reverse_iterator @ linux-x86_64 +test.test_array.UnsignedLongTest.test_setitem @ linux-x86_64 +test.test_array.UnsignedLongTest.test_setslice @ linux-x86_64 +test.test_array.UnsignedLongTest.test_str @ linux-x86_64 +test.test_array.UnsignedLongTest.test_subclass_with_kwargs @ linux-x86_64 +test.test_array.UnsignedLongTest.test_subclassing @ linux-x86_64 +test.test_array.UnsignedLongTest.test_tofrombytes @ linux-x86_64 +test.test_array.UnsignedLongTest.test_tofromfile @ linux-x86_64 +test.test_array.UnsignedLongTest.test_tofromlist @ linux-x86_64 +test.test_array.UnsignedLongTest.test_type_error @ linux-x86_64 +test.test_array.UnsignedShortTest.test_add @ linux-x86_64 +test.test_array.UnsignedShortTest.test_assignment @ linux-x86_64 +test.test_array.UnsignedShortTest.test_buffer @ linux-x86_64 +test.test_array.UnsignedShortTest.test_buffer_info @ linux-x86_64 +test.test_array.UnsignedShortTest.test_bug_782369 @ linux-x86_64 +test.test_array.UnsignedShortTest.test_bytes_extend @ linux-x86_64 +test.test_array.UnsignedShortTest.test_byteswap @ linux-x86_64 +test.test_array.UnsignedShortTest.test_cmp @ linux-x86_64 +test.test_array.UnsignedShortTest.test_constructor @ linux-x86_64 +test.test_array.UnsignedShortTest.test_constructor_with_iterable_argument @ linux-x86_64 +test.test_array.UnsignedShortTest.test_copy @ linux-x86_64 +test.test_array.UnsignedShortTest.test_count @ linux-x86_64 +test.test_array.UnsignedShortTest.test_coveritertraverse @ linux-x86_64 +test.test_array.UnsignedShortTest.test_create_from_bytes @ linux-x86_64 +test.test_array.UnsignedShortTest.test_deepcopy @ linux-x86_64 +test.test_array.UnsignedShortTest.test_delitem @ linux-x86_64 +test.test_array.UnsignedShortTest.test_delslice @ linux-x86_64 +test.test_array.UnsignedShortTest.test_exhausted_iterator @ linux-x86_64 +test.test_array.UnsignedShortTest.test_exhausted_reverse_iterator @ linux-x86_64 +test.test_array.UnsignedShortTest.test_extend @ linux-x86_64 +test.test_array.UnsignedShortTest.test_extended_getslice @ linux-x86_64 +test.test_array.UnsignedShortTest.test_extended_set_del_slice @ linux-x86_64 +test.test_array.UnsignedShortTest.test_extslice @ linux-x86_64 +test.test_array.UnsignedShortTest.test_filewrite @ linux-x86_64 +test.test_array.UnsignedShortTest.test_fromarray @ linux-x86_64 +test.test_array.UnsignedShortTest.test_frombytearray @ linux-x86_64 +test.test_array.UnsignedShortTest.test_fromfile_ioerror @ linux-x86_64 +test.test_array.UnsignedShortTest.test_getitem @ linux-x86_64 +test.test_array.UnsignedShortTest.test_getslice @ linux-x86_64 +test.test_array.UnsignedShortTest.test_iadd @ linux-x86_64 +test.test_array.UnsignedShortTest.test_imul @ linux-x86_64 +test.test_array.UnsignedShortTest.test_index @ linux-x86_64 +test.test_array.UnsignedShortTest.test_initialize_with_unicode @ linux-x86_64 +test.test_array.UnsignedShortTest.test_insert @ linux-x86_64 +test.test_array.UnsignedShortTest.test_iterationcontains @ linux-x86_64 +test.test_array.UnsignedShortTest.test_iterator_pickle @ linux-x86_64 +test.test_array.UnsignedShortTest.test_len @ linux-x86_64 +test.test_array.UnsignedShortTest.test_mul @ linux-x86_64 +test.test_array.UnsignedShortTest.test_overflow @ linux-x86_64 +test.test_array.UnsignedShortTest.test_pickle @ linux-x86_64 +test.test_array.UnsignedShortTest.test_pickle_for_empty_array @ linux-x86_64 +test.test_array.UnsignedShortTest.test_pop @ linux-x86_64 +test.test_array.UnsignedShortTest.test_reduce_ex @ linux-x86_64 +test.test_array.UnsignedShortTest.test_remove @ linux-x86_64 +test.test_array.UnsignedShortTest.test_repr @ linux-x86_64 +test.test_array.UnsignedShortTest.test_reverse @ linux-x86_64 +test.test_array.UnsignedShortTest.test_reverse_iterator @ linux-x86_64 +test.test_array.UnsignedShortTest.test_setitem @ linux-x86_64 +test.test_array.UnsignedShortTest.test_setslice @ linux-x86_64 +test.test_array.UnsignedShortTest.test_str @ linux-x86_64 +test.test_array.UnsignedShortTest.test_subclass_with_kwargs @ linux-x86_64 +test.test_array.UnsignedShortTest.test_subclassing @ linux-x86_64 +test.test_array.UnsignedShortTest.test_tofrombytes @ linux-x86_64 +test.test_array.UnsignedShortTest.test_tofromfile @ linux-x86_64 +test.test_array.UnsignedShortTest.test_tofromlist @ linux-x86_64 +test.test_array.UnsignedShortTest.test_type_error @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ast.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ast.txt new file mode 100644 index 0000000000..0ea7b15035 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ast.txt @@ -0,0 +1,136 @@ +test.test_ast.ASTHelpers_Test.test_bad_integer @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_copy_location @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_dump @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_dump_incomplete @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_dump_indent @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_elif_stmt_start_position @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_elif_stmt_start_position_with_else @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_fix_missing_locations @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_get_docstring @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_get_docstring_none @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_increment_lineno @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_increment_lineno_on_module @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_iter_child_nodes @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_iter_fields @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_level_as_none @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_literal_eval @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_literal_eval_complex @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_literal_eval_malformed_dict_nodes @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_literal_eval_malformed_lineno @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_literal_eval_syntax_errors @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_literal_eval_trailing_ws @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_multi_line_docstring_col_offset_and_lineno_issue16806 @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_parse @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_parse_in_error @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_recursion_direct @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_recursion_indirect @ linux-x86_64 +test.test_ast.ASTHelpers_Test.test_starred_expr_end_position_within_call @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_assert @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_assign @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_attribute @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_augassign @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_boolop @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_call @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_classdef @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_compare @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_delete @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_dict @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_dictcomp @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_expr @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_for @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_funcdef @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_generatorexp @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_global @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_if @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_ifexp @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_import @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_importfrom @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_lambda @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_list @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_listcomp @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_match_validation_pattern @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_module @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_nameconstant @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_nonlocal @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_num @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_raise @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_set @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_setcomp @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_starred @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_subscript @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_try @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_try_star @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_tuple @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_unaryop @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_while @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_with @ linux-x86_64 +test.test_ast.ASTValidatorTests.test_yield @ linux-x86_64 +test.test_ast.AST_Tests.test_AST_garbage_collection @ linux-x86_64 +test.test_ast.AST_Tests.test_AST_objects @ linux-x86_64 +test.test_ast.AST_Tests.test_alias @ linux-x86_64 +test.test_ast.AST_Tests.test_arguments @ linux-x86_64 +test.test_ast.AST_Tests.test_assignment_expression_feature_version @ linux-x86_64 +test.test_ast.AST_Tests.test_ast_asdl_signature @ linux-x86_64 +test.test_ast.AST_Tests.test_ast_validation @ linux-x86_64 +test.test_ast.AST_Tests.test_base_classes @ linux-x86_64 +test.test_ast.AST_Tests.test_classattrs @ linux-x86_64 +test.test_ast.AST_Tests.test_compilation_of_ast_nodes_with_default_end_position_values @ linux-x86_64 +test.test_ast.AST_Tests.test_constant_as_name @ linux-x86_64 +test.test_ast.AST_Tests.test_debug_f_string_feature_version @ linux-x86_64 +test.test_ast.AST_Tests.test_empty_yield_from @ linux-x86_64 +test.test_ast.AST_Tests.test_field_attr_existence @ linux-x86_64 +test.test_ast.AST_Tests.test_field_attr_writable @ linux-x86_64 +test.test_ast.AST_Tests.test_from_import @ linux-x86_64 +test.test_ast.AST_Tests.test_invalid_constant @ linux-x86_64 +test.test_ast.AST_Tests.test_invalid_identifier @ linux-x86_64 +test.test_ast.AST_Tests.test_invalid_sum @ linux-x86_64 +test.test_ast.AST_Tests.test_isinstance @ linux-x86_64 +test.test_ast.AST_Tests.test_issue18374_binop_col_offset @ linux-x86_64 +test.test_ast.AST_Tests.test_issue39579_dotted_name_end_col_offset @ linux-x86_64 +test.test_ast.AST_Tests.test_module @ linux-x86_64 +test.test_ast.AST_Tests.test_no_fields @ linux-x86_64 +test.test_ast.AST_Tests.test_nodeclasses @ linux-x86_64 +test.test_ast.AST_Tests.test_non_interned_future_from_ast @ linux-x86_64 +test.test_ast.AST_Tests.test_none_checks @ linux-x86_64 +test.test_ast.AST_Tests.test_null_bytes @ linux-x86_64 +test.test_ast.AST_Tests.test_parenthesized_with_feature_version @ linux-x86_64 +test.test_ast.AST_Tests.test_pickling @ linux-x86_64 +test.test_ast.AST_Tests.test_positional_only_feature_version @ linux-x86_64 +test.test_ast.AST_Tests.test_precedence_enum @ linux-x86_64 +test.test_ast.AST_Tests.test_realtype @ linux-x86_64 +test.test_ast.AST_Tests.test_slice @ linux-x86_64 +test.test_ast.AST_Tests.test_snippets @ linux-x86_64 +test.test_ast.AST_Tests.test_subclasses @ linux-x86_64 +test.test_ast.ConstantTests.test_assign_to_constant @ linux-x86_64 +test.test_ast.ConstantTests.test_get_docstring @ linux-x86_64 +test.test_ast.ConstantTests.test_literal_eval @ linux-x86_64 +test.test_ast.ConstantTests.test_string_kind @ linux-x86_64 +test.test_ast.ConstantTests.test_validation @ linux-x86_64 +test.test_ast.ConstantTests.test_values @ linux-x86_64 +test.test_ast.EndPositionTests.test_attribute_spaces @ linux-x86_64 +test.test_ast.EndPositionTests.test_binop @ linux-x86_64 +test.test_ast.EndPositionTests.test_boolop @ linux-x86_64 +test.test_ast.EndPositionTests.test_call @ linux-x86_64 +test.test_ast.EndPositionTests.test_call_noargs @ linux-x86_64 +test.test_ast.EndPositionTests.test_class_def @ linux-x86_64 +test.test_ast.EndPositionTests.test_class_kw @ linux-x86_64 +test.test_ast.EndPositionTests.test_comprehensions @ linux-x86_64 +test.test_ast.EndPositionTests.test_continued_str @ linux-x86_64 +test.test_ast.EndPositionTests.test_displays @ linux-x86_64 +test.test_ast.EndPositionTests.test_fstring @ linux-x86_64 +test.test_ast.EndPositionTests.test_fstring_multi_line @ linux-x86_64 +test.test_ast.EndPositionTests.test_func_def @ linux-x86_64 +test.test_ast.EndPositionTests.test_import_from_multi_line @ linux-x86_64 +test.test_ast.EndPositionTests.test_lambda @ linux-x86_64 +test.test_ast.EndPositionTests.test_multi_line_str @ linux-x86_64 +test.test_ast.EndPositionTests.test_redundant_parenthesis @ linux-x86_64 +test.test_ast.EndPositionTests.test_slices @ linux-x86_64 +test.test_ast.EndPositionTests.test_source_segment_endings @ linux-x86_64 +test.test_ast.EndPositionTests.test_source_segment_missing_info @ linux-x86_64 +test.test_ast.EndPositionTests.test_source_segment_multi @ linux-x86_64 +test.test_ast.EndPositionTests.test_source_segment_tabs @ linux-x86_64 +test.test_ast.EndPositionTests.test_suites @ linux-x86_64 +test.test_ast.EndPositionTests.test_trailers_with_redundant_parenthesis @ linux-x86_64 +test.test_ast.EndPositionTests.test_tuples @ linux-x86_64 +test.test_ast.EndPositionTests.test_yield_await @ linux-x86_64 +test.test_ast.NodeVisitorTests.test_old_constant_nodes @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_asynchat.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_asynchat.txt new file mode 100644 index 0000000000..28ec009e04 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_asynchat.txt @@ -0,0 +1,25 @@ +test.test_asynchat.TestAsynchat.test_close_when_done @ linux-x86_64 +test.test_asynchat.TestAsynchat.test_empty_line @ linux-x86_64 +test.test_asynchat.TestAsynchat.test_line_terminator1 @ linux-x86_64 +test.test_asynchat.TestAsynchat.test_line_terminator2 @ linux-x86_64 +test.test_asynchat.TestAsynchat.test_line_terminator3 @ linux-x86_64 +test.test_asynchat.TestAsynchat.test_none_terminator @ linux-x86_64 +test.test_asynchat.TestAsynchat.test_numeric_terminator1 @ linux-x86_64 +test.test_asynchat.TestAsynchat.test_numeric_terminator2 @ linux-x86_64 +test.test_asynchat.TestAsynchat.test_push @ linux-x86_64 +test.test_asynchat.TestAsynchat.test_simple_producer @ linux-x86_64 +test.test_asynchat.TestAsynchat.test_string_producer @ linux-x86_64 +test.test_asynchat.TestAsynchatMocked.test_blockingioerror @ linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_close_when_done @ linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_empty_line @ linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_line_terminator1 @ linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_line_terminator2 @ linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_line_terminator3 @ linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_none_terminator @ linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_numeric_terminator1 @ linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_numeric_terminator2 @ linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_push @ linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_simple_producer @ linux-x86_64 +test.test_asynchat.TestAsynchat_WithPoll.test_string_producer @ linux-x86_64 +test.test_asynchat.TestHelperFunctions.test_find_prefix_at_end @ linux-x86_64 +test.test_asynchat.TestNotConnected.test_disallow_negative_terminator @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_asyncio.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_asyncio.txt new file mode 100644 index 0000000000..e38bc5688a --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_asyncio.txt @@ -0,0 +1,657 @@ +test.test_asyncio.test_base_events.BaseEventLoopTests.test__add_callback_cancelled_handle @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test__add_callback_handle @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test__run_once @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test__run_once_cancelled_event_cleanup @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test__run_once_schedule_handle @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_call_later @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_call_later_negative_delays @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_call_soon @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_call_soon_non_callable @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_check_thread @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_close @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_create_named_task_with_custom_factory @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_create_named_task_with_default_factory @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_create_task @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_create_task_error_closes_coro @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_default_exc_handler_broken @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_default_exc_handler_callback @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_not_implemented @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_forever_keyboard_interrupt @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_forever_pre_stopped @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_once @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_until_complete_baseexception @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_until_complete_loop @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_run_until_complete_type_error @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_debug @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_default_executor @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_default_executor_error @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_exc_handler_broken @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_exc_handler_custom @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_exc_handler_invalid @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_task_factory @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_set_task_factory_invalid @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_single_selecter_event_callback_after_stopping @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_subprocess_exec_invalid_args @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_subprocess_shell_invalid_args @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopTests.test_time_and_call_at @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_accept_connection_exception @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_accept_connection_retry @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_call_coroutine @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_host_port_sock @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_no_host_port_sock @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_no_ssl_server_hostname_errors @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_ssl_server_hostname_errors @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_ssl_timeout_for_plain_socket @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_connection_wrong_sock @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_addr_error @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_noaddr_nofamily @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_setblk_err @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_sock @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_sock_sockopts @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_datagram_endpoint_wrong_sock @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_host_port_sock @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_no_host_port_sock @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_ssl_timeout_for_plain_socket @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_create_server_wrong_sock @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventLoopWithSelectorTests.test_getnameinfo @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventTests.test_ipaddr_info @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventTests.test_ipaddr_info_no_inet_pton @ linux-x86_64 +test.test_asyncio.test_base_events.BaseEventTests.test_port_parameter_types @ linux-x86_64 +test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_blocking_socket @ linux-x86_64 +test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_negative_count @ linux-x86_64 +test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_negative_offset @ linux-x86_64 +test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_nonbinary_file @ linux-x86_64 +test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_nonstream_socket @ linux-x86_64 +test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_notint_count @ linux-x86_64 +test.test_asyncio.test_base_events.BaseLoopSockSendfileTests.test_notint_offset @ linux-x86_64 +test.test_asyncio.test_base_events.RunningLoopTests.test_running_loop_within_a_loop @ linux-x86_64 +test.test_asyncio.test_base_events.TestSelectorUtils.test_set_nodelay @ linux-x86_64 +test.test_asyncio.test_events.AbstractEventLoopTests.test_not_implemented @ linux-x86_64 +test.test_asyncio.test_events.HandleTests.test_callback_with_exception @ linux-x86_64 +test.test_asyncio.test_events.HandleTests.test_coroutine_like_object_debug_formatting @ linux-x86_64 +test.test_asyncio.test_events.HandleTests.test_handle @ linux-x86_64 +test.test_asyncio.test_events.HandleTests.test_handle_repr @ linux-x86_64 +test.test_asyncio.test_events.HandleTests.test_handle_repr_debug @ linux-x86_64 +test.test_asyncio.test_events.HandleTests.test_handle_source_traceback @ linux-x86_64 +test.test_asyncio.test_events.HandleTests.test_handle_weakref @ linux-x86_64 +test.test_asyncio.test_events.PolicyTests.test_event_loop_policy @ linux-x86_64 +test.test_asyncio.test_events.PolicyTests.test_get_event_loop @ linux-x86_64 +test.test_asyncio.test_events.PolicyTests.test_get_event_loop_after_set_none @ linux-x86_64 +test.test_asyncio.test_events.PolicyTests.test_get_event_loop_calls_set_event_loop @ linux-x86_64 +test.test_asyncio.test_events.PolicyTests.test_get_event_loop_policy @ linux-x86_64 +test.test_asyncio.test_events.PolicyTests.test_get_event_loop_thread @ linux-x86_64 +test.test_asyncio.test_events.PolicyTests.test_new_event_loop @ linux-x86_64 +test.test_asyncio.test_events.PolicyTests.test_set_event_loop @ linux-x86_64 +test.test_asyncio.test_events.PolicyTests.test_set_event_loop_policy @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_add_fds_after_closing @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_bidirectional_pty @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_call_later @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_call_soon @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_call_soon_threadsafe @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_call_soon_threadsafe_same_thread @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_close @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_close_running_event_loop @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_internal_fds @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_prompt_cancellation @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_reader_callback @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_remove_fds_after_closing @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_run_in_executor @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_run_in_executor_cancel @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_run_until_complete @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_write_pipe @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_write_pipe_disconnect_on_close @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_write_pty @ linux-x86_64 +test.test_asyncio.test_events.SelectEventLoopTests.test_writer_callback @ linux-x86_64 +test.test_asyncio.test_events.TestAbstractServer.test_close @ linux-x86_64 +test.test_asyncio.test_events.TestAbstractServer.test_get_loop @ linux-x86_64 +test.test_asyncio.test_events.TestAbstractServer.test_wait_closed @ linux-x86_64 +test.test_asyncio.test_events.TestCGetEventLoop.test_get_event_loop_new_process @ linux-x86_64 +test.test_asyncio.test_events.TestCGetEventLoop.test_get_event_loop_returns_running_loop @ linux-x86_64 +test.test_asyncio.test_events.TestCGetEventLoop.test_get_event_loop_returns_running_loop2 @ linux-x86_64 +test.test_asyncio.test_events.TestPyGetEventLoop.test_get_event_loop_new_process @ linux-x86_64 +test.test_asyncio.test_events.TestPyGetEventLoop.test_get_event_loop_returns_running_loop @ linux-x86_64 +test.test_asyncio.test_events.TestPyGetEventLoop.test_get_event_loop_returns_running_loop2 @ linux-x86_64 +test.test_asyncio.test_events.TimerTests.test_hash @ linux-x86_64 +test.test_asyncio.test_events.TimerTests.test_timer @ linux-x86_64 +test.test_asyncio.test_events.TimerTests.test_timer_comparison @ linux-x86_64 +test.test_asyncio.test_events.TimerTests.test_timer_repr @ linux-x86_64 +test.test_asyncio.test_events.TimerTests.test_timer_repr_debug @ linux-x86_64 +test.test_asyncio.test_events.TimerTests.test_when @ linux-x86_64 +test.test_asyncio.test_futures.DuckTests.test_ensure_future @ linux-x86_64 +test.test_asyncio.test_futures.DuckTests.test_wrap_future @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_callbacks_invoked_on_set_exception @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_callbacks_invoked_on_set_result @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_callbacks_remove_first_and_second_callback @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_callbacks_remove_first_callback @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_callbacks_remove_third_callback @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_remove_done_callback @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_remove_done_callbacks_list_clear @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_remove_done_callbacks_list_mutation @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_1 @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureDoneCallbackTests.test_schedule_callbacks_list_mutation_2 @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureInheritanceTests.test_inherit_without_calling_super_init @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_cancel @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_constructor_positional @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_constructor_use_global_loop @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_constructor_use_running_loop @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_constructor_without_loop @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_copy_state @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_exception @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_exception_class @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_future_cancel_message_getter @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_future_cancel_message_setter @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_future_del_collect @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_future_iter_throw @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_future_repr @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_future_source_traceback @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_future_stop_iteration_args @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_generic_alias @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_initial_state @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_isfuture @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_iter @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_log_traceback @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_result @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_set_result_unless_cancelled @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_tb_logger_abandoned @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_tb_logger_exception_result_retrieved @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_tb_logger_exception_retrieved @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_tb_logger_not_called_after_cancel @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_tb_logger_result_retrieved @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_tb_logger_result_unretrieved @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_uninitialized @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_wrap_future @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_wrap_future_cancel @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_wrap_future_cancel2 @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_wrap_future_future @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_wrap_future_use_global_loop @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_wrap_future_use_running_loop @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_wrap_future_without_loop @ linux-x86_64 +test.test_asyncio.test_futures.PyFutureTests.test_yield_from_twice @ linux-x86_64 +test.test_asyncio.test_locks.EventTests.test_clear @ linux-x86_64 +test.test_asyncio.test_locks.EventTests.test_repr @ linux-x86_64 +test.test_asyncio.test_locks.LockTests.test_lock @ linux-x86_64 +test.test_asyncio.test_locks.LockTests.test_lock_doesnt_accept_loop_parameter @ linux-x86_64 +test.test_asyncio.test_locks.LockTests.test_release_not_acquired @ linux-x86_64 +test.test_asyncio.test_locks.SemaphoreTests.test_initial_value_zero @ linux-x86_64 +test.test_asyncio.test_locks.SemaphoreTests.test_release_not_acquired @ linux-x86_64 +test.test_asyncio.test_locks.SemaphoreTests.test_semaphore @ linux-x86_64 +test.test_asyncio.test_locks.SemaphoreTests.test_semaphore_value @ linux-x86_64 +test.test_asyncio.test_pep492.CoroutineTests.test_iscoroutine @ linux-x86_64 +test.test_asyncio.test_pep492.CoroutineTests.test_iscoroutinefunction @ linux-x86_64 +test.test_asyncio.test_pep492.CoroutineTests.test_types_coroutine @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_close @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_close_self_pipe @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_create_server @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_create_server_cancel @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_ctor @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_datagram_loop_reading @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_datagram_loop_reading_aborted @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_datagram_loop_reading_data @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_datagram_loop_reading_no_data @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_datagram_loop_writing @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_datagram_loop_writing_aborted @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_loop_self_reading @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_loop_self_reading_exception @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_loop_self_reading_fut @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_make_datagram_transport @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_make_socket_transport @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_process_events @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_stop_serving @ linux-x86_64 +test.test_asyncio.test_proactor_events.BaseProactorEventLoopTests.test_write_to_self @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test__loop_writing_closing @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test__loop_writing_error_received @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test__loop_writing_error_received_connection @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test__loop_writing_exception @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_fatal_error_connected @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_buffer @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_buffer_bytearray @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_buffer_memoryview @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_bytearray @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_closing @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_connected_addr @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_error_received @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_error_received_connected @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_exception @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_memoryview @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_no_data @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorDatagramTransportTests.test_sendto_str @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_abort @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_call_connection_lost @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_close @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_close_buffer @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_close_invalid_sockobj @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_close_protocol_connection_lost_once @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_close_write_fut @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_ctor @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_dont_pause_writing @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_fatal_error @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_fatal_error_2 @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_force_close @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_force_close_idempotent @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_force_close_protocol_connection_lost_once @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_aborted @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_aborted_closing @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_aborted_is_fatal @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_conn_reset_lost @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_data @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_exception @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_reading_no_data @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_writing @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_writing_closing @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_writing_err @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_writing_force_close @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_loop_writing_stop @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_pause_reading_connection_made @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_pause_resume_reading @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_pause_resume_writing @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_pause_writing_2write @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_pause_writing_3write @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_eof @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_eof_buffer @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_eof_buffer_write_pipe @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_eof_duplex_pipe @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_eof_write_pipe @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_more @ linux-x86_64 +test.test_asyncio.test_proactor_events.ProactorSocketTransportTests.test_write_no_data @ linux-x86_64 +test.test_asyncio.test_protocols.ProtocolsAbsTests.test_base_protocol @ linux-x86_64 +test.test_asyncio.test_protocols.ProtocolsAbsTests.test_buffered_protocol @ linux-x86_64 +test.test_asyncio.test_protocols.ProtocolsAbsTests.test_datagram_protocol @ linux-x86_64 +test.test_asyncio.test_protocols.ProtocolsAbsTests.test_protocol @ linux-x86_64 +test.test_asyncio.test_protocols.ProtocolsAbsTests.test_subprocess_protocol @ linux-x86_64 +test.test_asyncio.test_runners.RunTests.test_asyncio_run_debug @ linux-x86_64 +test.test_asyncio.test_runners.RunTests.test_asyncio_run_from_running_loop @ linux-x86_64 +test.test_asyncio.test_runners.RunTests.test_asyncio_run_only_coro @ linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_custom_factory @ linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_debug @ linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_double_close @ linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_explicit_close @ linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_non_debug @ linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_second_with_block_raises @ linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_set_event_loop_called_once @ linux-x86_64 +test.test_asyncio.test_runners.RunnerTests.test_signal_install_not_supported_ok @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_add_reader @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_add_reader_existing @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_add_reader_existing_writer @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_add_writer @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_add_writer_existing @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_close @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_close_no_selector @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_make_socket_transport @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_make_ssl_transport_without_ssl_error @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_process_events_read @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_process_events_read_cancelled @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_process_events_write @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_process_events_write_cancelled @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_read_from_self_exception @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_read_from_self_tryagain @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_remove_reader @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_remove_reader_read_write @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_remove_reader_unknown @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_remove_writer @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_remove_writer_read_write @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_remove_writer_unknown @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_write_to_self_exception @ linux-x86_64 +test.test_asyncio.test_selector_events.BaseSelectorEventLoopTests.test_write_to_self_tryagain @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_fatal_error_connected @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_fatal_error_connected_custom_error @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_read_ready @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_read_ready_err @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_read_ready_oserr @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_read_ready_tryagain @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_buffer @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_buffer_bytearray @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_buffer_memoryview @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_bytearray @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_closing @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_connected_addr @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_error_received @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_error_received_connected @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_exception @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_memoryview @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_no_data @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready_closing @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready_error_received @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready_error_received_connection @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready_exception @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready_no_data @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_ready_tryagain @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_str @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorDatagramTransportTests.test_sendto_tryagain @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_buffer_updated_error @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_ctor @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_get_buffer_error @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_get_buffer_zerosized @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_proto_type_switch @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_eof_received_error @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready_conn_reset @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready_eof @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready_eof_keep_open @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready_err @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready_tryagain @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportBufferedProtocolTests.test_read_ready_tryagain_interrupted @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_ctor @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_ctor_with_waiter @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_data_received_error @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_pause_reading_connection_made @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_pause_resume_reading @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_eof_received_error @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready_conn_reset @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready_eof @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready_eof_keep_open @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready_err @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready_tryagain @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_read_ready_tryagain_interrupted @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_transport_close_remove_writer @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_buffer @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_bytearray @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_closing @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_eof @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_eof_buffer @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_exception @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_memoryview @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_no_data @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_partial @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_partial_bytearray @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_partial_memoryview @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_partial_none @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready_closing @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready_exception @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready_no_data @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready_partial @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready_partial_none @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_ready_tryagain @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_str @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorSocketTransportTests.test_write_tryagain @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorTransportTests.test__add_reader @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorTransportTests.test_abort @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorTransportTests.test_close @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorTransportTests.test_close_write_buffer @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorTransportTests.test_connection_lost @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorTransportTests.test_ctor @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorTransportTests.test_fatal_error @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorTransportTests.test_fatal_error_custom_exception @ linux-x86_64 +test.test_asyncio.test_selector_events.SelectorTransportTests.test_force_close @ linux-x86_64 +test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_sock_accept @ linux-x86_64 +test.test_asyncio.test_sock_lowlevel.SelectEventLoopTests.test_unix_sock_client_ops @ linux-x86_64 +test.test_asyncio.test_ssl.TestSSL.test_ssl_connect_accepted_socket @ linux-x86_64 +test.test_asyncio.test_sslproto.SelectorStartTLSTests.test_buf_feed_data @ linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_close_during_handshake @ linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_connection_lost @ linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_data_received_after_closing @ linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_eof_received_waiter @ linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_fatal_error_no_name_error @ linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_get_extra_info_on_closed_connection @ linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_handshake_timeout_negative @ linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_handshake_timeout_zero @ linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_set_new_app_protocol @ linux-x86_64 +test.test_asyncio.test_sslproto.SslProtoHandshakeTests.test_write_after_closing @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_IncompleteReadError_pickleable @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_LimitOverrunError_pickleable @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test___repr__ @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test___repr__data @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test___repr__eof @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test___repr__exception @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test___repr__nondefault_limit @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test___repr__transport @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test___repr__waiter @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_exception @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_feed_empty_data @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_feed_nonempty_data @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_invalid_limit @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_streamreader_constructor_use_global_loop @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_streamreader_constructor_use_running_loop @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_streamreader_constructor_without_loop @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_streamreaderprotocol_constructor_use_global_loop @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_streamreaderprotocol_constructor_use_running_loop @ linux-x86_64 +test.test_asyncio.test_streams.StreamTests.test_streamreaderprotocol_constructor_without_loop @ linux-x86_64 +!test.test_asyncio.test_subprocess.SubprocessSafeWatcherTests.test_shell @ linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessTransportTests.test_proc_exited @ linux-x86_64 +test.test_asyncio.test_subprocess.SubprocessTransportTests.test_subprocess_repr @ linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__enter_task @ linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__enter_task_failure @ linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__leave_task @ linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__leave_task_failure1 @ linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__leave_task_failure2 @ linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__register_task_1 @ linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__register_task_2 @ linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__register_task_3 @ linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__unregister_task @ linux-x86_64 +test.test_asyncio.test_tasks.CIntrospectionTests.test__unregister_task_not_registered @ linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_cancellation_broadcast @ linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_constructor_use_global_loop @ linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_constructor_use_running_loop @ linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_constructor_without_loop @ linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_duplicate_coroutines @ linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_exception_marking @ linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_issue46672 @ linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_one_exception @ linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_result_exception_success @ linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_return_exceptions @ linux-x86_64 +test.test_asyncio.test_tasks.CoroutineGatherTests.test_success @ linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_constructor_empty_sequence_use_global_loop @ linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_constructor_empty_sequence_use_running_loop @ linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_constructor_empty_sequence_without_loop @ linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_constructor_heterogenous_futures @ linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_constructor_homogenous_futures @ linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_one_cancellation @ linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_one_exception @ linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_result_exception_one_cancellation @ linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_result_exception_success @ linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_return_exceptions @ linux-x86_64 +test.test_asyncio.test_tasks.FutureGatherTests.test_success @ linux-x86_64 +test.test_asyncio.test_tasks.GenericTaskTests.test_future_subclass @ linux-x86_64 +test.test_asyncio.test_tasks.PyCurrentLoopTests.test_current_task_no_running_loop @ linux-x86_64 +test.test_asyncio.test_tasks.PyCurrentLoopTests.test_current_task_no_running_loop_implicit @ linux-x86_64 +test.test_asyncio.test_tasks.PyCurrentLoopTests.test_current_task_with_implicit_loop @ linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__enter_task @ linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__enter_task_failure @ linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__leave_task @ linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__leave_task_failure1 @ linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__leave_task_failure2 @ linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__register_task_1 @ linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__register_task_2 @ linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__register_task_3 @ linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__unregister_task @ linux-x86_64 +test.test_asyncio.test_tasks.PyIntrospectionTests.test__unregister_task_not_registered @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_bare_create_named_task @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_bare_create_task @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_coroutine_non_gen_function @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_coroutine_non_gen_function_return_future @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_create_task_with_async_function @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_create_task_with_asynclike_function @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_create_task_with_noncoroutine @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_current_task @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_ensure_future_coroutine @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_ensure_future_error_msg @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_ensure_future_future @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_ensure_future_neither @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_ensure_future_task @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_gather_shield @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_generic_alias @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_get_coro @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_iscoroutinefunction @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_log_traceback @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_other_loop_future @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_cancel_inner @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_cancel_outer @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_coroutine_use_global_loop @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_coroutine_use_running_loop @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_coroutine_without_loop @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_effect @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_exception @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_gather @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_result @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_shield_shortcut @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_step_result_future @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_subclasses_ctask_cfuture @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_awaits_on_itself @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_cancel_message_getter @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_cancel_message_setter @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_cancel_waiter_future @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_class @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_del_collect @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_repr_name_not_str @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_repr_wait_for @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_SubclassTests.test_task_set_methods @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_bare_create_named_task @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_bare_create_task @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_coroutine_non_gen_function @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_coroutine_non_gen_function_return_future @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_create_task_with_async_function @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_create_task_with_asynclike_function @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_create_task_with_noncoroutine @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_current_task @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_ensure_future_coroutine @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_ensure_future_error_msg @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_ensure_future_future @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_ensure_future_neither @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_ensure_future_task @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_gather_shield @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_generic_alias @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_get_coro @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_iscoroutinefunction @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_log_traceback @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_other_loop_future @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_cancel_inner @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_cancel_outer @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_coroutine_use_global_loop @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_coroutine_use_running_loop @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_coroutine_without_loop @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_effect @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_exception @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_gather @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_result @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_shield_shortcut @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_step_result_future @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_awaits_on_itself @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_cancel_message_getter @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_cancel_message_setter @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_cancel_waiter_future @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_class @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_del_collect @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_repr_name_not_str @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_repr_wait_for @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_set_methods @ linux-x86_64 +test.test_asyncio.test_tasks.PyTask_PyFuture_Tests.test_task_source_traceback @ linux-x86_64 +test.test_asyncio.test_timeouts.TimeoutTests.test_timeout_not_entered @ linux-x86_64 +test.test_asyncio.test_transports.TransportTests.test_ctor_extra_is_none @ linux-x86_64 +test.test_asyncio.test_transports.TransportTests.test_dgram_not_implemented @ linux-x86_64 +test.test_asyncio.test_transports.TransportTests.test_flowcontrol_mixin_set_write_limits @ linux-x86_64 +test.test_asyncio.test_transports.TransportTests.test_get_extra_info @ linux-x86_64 +test.test_asyncio.test_transports.TransportTests.test_not_implemented @ linux-x86_64 +test.test_asyncio.test_transports.TransportTests.test_subprocess_transport_not_implemented @ linux-x86_64 +test.test_asyncio.test_transports.TransportTests.test_writelines @ linux-x86_64 +test.test_asyncio.test_unix_events.AbstractChildWatcherTests.test_not_implemented @ linux-x86_64 +test.test_asyncio.test_unix_events.BaseChildWatcherTests.test_not_implemented @ linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_close @ linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_create_watcher @ linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_remove_child_handler @ linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_set_loop @ linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_set_loop_race_condition @ linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld @ linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld_child_reaped_elsewhere @ linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld_race_condition @ linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld_remove_handler @ linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld_replace_handler @ linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld_two_children @ linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld_two_children_terminating_together @ linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld_unhandled_exception @ linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld_unknown_pid_during_registration @ linux-x86_64 +test.test_asyncio.test_unix_events.FastChildWatcherTests.test_sigchld_unknown_status @ linux-x86_64 +test.test_asyncio.test_unix_events.PolicyTests.test_child_watcher_replace_mainloop_existing @ linux-x86_64 +test.test_asyncio.test_unix_events.PolicyTests.test_get_child_watcher_after_set @ linux-x86_64 +test.test_asyncio.test_unix_events.PolicyTests.test_get_child_watcher_thread @ linux-x86_64 +test.test_asyncio.test_unix_events.PolicyTests.test_get_default_child_watcher @ linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_close @ linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_create_watcher @ linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_remove_child_handler @ linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_set_loop @ linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_set_loop_race_condition @ linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld @ linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld_child_reaped_elsewhere @ linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld_race_condition @ linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld_remove_handler @ linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld_replace_handler @ linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld_two_children @ linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld_two_children_terminating_together @ linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld_unhandled_exception @ linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld_unknown_pid_during_registration @ linux-x86_64 +test.test_asyncio.test_unix_events.SafeChildWatcherTests.test_sigchld_unknown_status @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_add_signal_handler @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_add_signal_handler_coroutine_error @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_add_signal_handler_install_error @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_add_signal_handler_install_error2 @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_add_signal_handler_install_error3 @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_add_signal_handler_setup_error @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_check_signal @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_close @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_close_on_finalizing @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_handle_signal_cancelled_handler @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_handle_signal_no_handler @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_remove_signal_handler @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_remove_signal_handler_2 @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_remove_signal_handler_cleanup_error @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_remove_signal_handler_error @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopSignalTests.test_remove_signal_handler_error2 @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_nopath_nosock @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_nossl_serverhost @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_path_inetsock @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_path_sock @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_ssl_noserverhost @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_connection_ssl_timeout_with_plain_sock @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_bind_error @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_existing_path_nonsock @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_nopath_nosock @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_path_dgram @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_path_inetsock @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_ssl_bool @ linux-x86_64 +test.test_asyncio.test_unix_events.SelectorEventLoopUnixSocketTests.test_create_unix_server_ssl_timeout_with_plain_sock @ linux-x86_64 +test.test_asyncio.test_unix_events.TestFunctional.test_add_reader_invalid_argument @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__call_connection_lost @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__call_connection_lost_with_err @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__close @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__read_ready @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__read_ready_blocked @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__read_ready_eof @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test__read_ready_error @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_close @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_close_already_closing @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_ctor @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_pause_reading @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_pause_reading_on_closed_pipe @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_pause_reading_on_paused_pipe @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_resume_reading @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_resume_reading_on_closed_pipe @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixReadPipeTransportTests.test_resume_reading_on_paused_pipe @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__call_connection_lost @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__call_connection_lost_with_err @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__read_ready @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__write_ready @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__write_ready_again @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__write_ready_closing @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__write_ready_empty @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__write_ready_err @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test__write_ready_partial @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_abort @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_can_write_eof @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_close @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_close_closing @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_ctor @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_again @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_buffer @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_close @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_eof @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_eof_pending @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_err @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_no_data @ linux-x86_64 +test.test_asyncio.test_unix_events.UnixWritePipeTransportTests.test_write_partial @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_asyncore.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_asyncore.txt new file mode 100644 index 0000000000..8159384918 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_asyncore.txt @@ -0,0 +1,51 @@ +test.test_asyncore.DispatcherTests.test_basic @ linux-x86_64 +test.test_asyncore.DispatcherTests.test_log @ linux-x86_64 +test.test_asyncore.DispatcherTests.test_log_info @ linux-x86_64 +test.test_asyncore.DispatcherTests.test_repr @ linux-x86_64 +test.test_asyncore.DispatcherTests.test_strerror @ linux-x86_64 +test.test_asyncore.DispatcherTests.test_unhandled @ linux-x86_64 +test.test_asyncore.DispatcherWithSendTests.test_send @ linux-x86_64 +test.test_asyncore.FileWrapperTest.test_close_twice @ linux-x86_64 +test.test_asyncore.FileWrapperTest.test_dispatcher @ linux-x86_64 +test.test_asyncore.FileWrapperTest.test_recv @ linux-x86_64 +test.test_asyncore.FileWrapperTest.test_send @ linux-x86_64 +test.test_asyncore.HelperFunctionTests.test_closeall @ linux-x86_64 +test.test_asyncore.HelperFunctionTests.test_closeall_default @ linux-x86_64 +test.test_asyncore.HelperFunctionTests.test_compact_traceback @ linux-x86_64 +test.test_asyncore.HelperFunctionTests.test_readwriteexc @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_bind @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_connection_attributes @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_create_socket @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_handle_accept @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_handle_accepted @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_handle_close @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_handle_close_after_conn_broken @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_handle_connect @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_handle_error @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_handle_read @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_handle_write @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_quick_connect @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv4Select.test_set_reuse_addr @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_bind @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_connection_attributes @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_create_socket @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_handle_accept @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_handle_accepted @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_handle_close @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_handle_close_after_conn_broken @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_handle_connect @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_handle_error @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_handle_read @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_handle_write @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_quick_connect @ linux-x86_64 +test.test_asyncore.TestAPI_UseIPv6Select.test_set_reuse_addr @ linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_connection_attributes @ linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_create_socket @ linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_accept @ linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_accepted @ linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_close @ linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_close_after_conn_broken @ linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_connect @ linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_error @ linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_read @ linux-x86_64 +test.test_asyncore.TestAPI_UseUnixSocketsSelect.test_handle_write @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_atexit.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_atexit.txt new file mode 100644 index 0000000000..a9abb7e8ef --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_atexit.txt @@ -0,0 +1 @@ +test.test_atexit.FunctionalTest.test_shutdown @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_augassign.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_augassign.txt new file mode 100644 index 0000000000..a052d1cb02 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_augassign.txt @@ -0,0 +1,7 @@ +test.test_augassign.AugAssignTest.testBasic @ linux-x86_64 +test.test_augassign.AugAssignTest.testCustomMethods1 @ linux-x86_64 +test.test_augassign.AugAssignTest.testCustomMethods2 @ linux-x86_64 +test.test_augassign.AugAssignTest.testInDict @ linux-x86_64 +test.test_augassign.AugAssignTest.testInList @ linux-x86_64 +test.test_augassign.AugAssignTest.testSequences @ linux-x86_64 +test.test_augassign.AugAssignTest.test_with_unpacking @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_base64.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_base64.txt new file mode 100644 index 0000000000..a0f858836c --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_base64.txt @@ -0,0 +1,36 @@ +test.test_base64.BaseXYTestCase.test_ErrorHeritage @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_RFC4648_test_cases @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_a85_padding @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_a85decode @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_a85decode_errors @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_a85encode @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b16decode @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b16encode @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b32decode @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b32decode_casefold @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b32decode_error @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b32encode @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b32hexdecode @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b32hexdecode_error @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b32hexdecode_other_types @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b32hexencode @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b32hexencode_other_types @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b64decode @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b64decode_invalid_chars @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b64decode_padding_error @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b64encode @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b85_padding @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b85decode @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b85decode_errors @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_b85encode @ linux-x86_64 +test.test_base64.BaseXYTestCase.test_decode_nonascii_str @ linux-x86_64 +test.test_base64.LegacyBase64TestCase.test_decode @ linux-x86_64 +test.test_base64.LegacyBase64TestCase.test_decodebytes @ linux-x86_64 +test.test_base64.LegacyBase64TestCase.test_encode @ linux-x86_64 +test.test_base64.LegacyBase64TestCase.test_encodebytes @ linux-x86_64 +test.test_base64.TestMain.test_decode @ linux-x86_64 +test.test_base64.TestMain.test_encode_decode @ linux-x86_64 +test.test_base64.TestMain.test_encode_file @ linux-x86_64 +test.test_base64.TestMain.test_encode_from_stdin @ linux-x86_64 +test.test_base64.TestMain.test_prints_usage_with_help_flag @ linux-x86_64 +test.test_base64.TestMain.test_prints_usage_with_invalid_flag @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_baseexception.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_baseexception.txt new file mode 100644 index 0000000000..9c96347c99 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_baseexception.txt @@ -0,0 +1,11 @@ +test.test_baseexception.ExceptionClassTests.test_builtins_new_style @ linux-x86_64 +test.test_baseexception.ExceptionClassTests.test_inheritance @ linux-x86_64 +test.test_baseexception.ExceptionClassTests.test_interface_multi_arg @ linux-x86_64 +test.test_baseexception.ExceptionClassTests.test_interface_no_arg @ linux-x86_64 +test.test_baseexception.ExceptionClassTests.test_interface_single_arg @ linux-x86_64 +test.test_baseexception.ExceptionClassTests.test_setstate_refcount_no_crash @ linux-x86_64 +test.test_baseexception.UsageTests.test_catch_BaseException_instance @ linux-x86_64 +test.test_baseexception.UsageTests.test_catch_non_BaseException @ linux-x86_64 +test.test_baseexception.UsageTests.test_catch_string @ linux-x86_64 +test.test_baseexception.UsageTests.test_raise_new_style_non_exception @ linux-x86_64 +test.test_baseexception.UsageTests.test_raise_string @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bdb.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bdb.txt new file mode 100644 index 0000000000..041d0880ae --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bdb.txt @@ -0,0 +1,30 @@ +test.test_bdb.BreakpointTestCase.test_bp_after_last_statement @ linux-x86_64 +test.test_bdb.BreakpointTestCase.test_bp_condition @ linux-x86_64 +test.test_bdb.BreakpointTestCase.test_bp_exception_on_condition_evaluation @ linux-x86_64 +test.test_bdb.BreakpointTestCase.test_bp_ignore_count @ linux-x86_64 +test.test_bdb.BreakpointTestCase.test_bp_on_non_existent_module @ linux-x86_64 +test.test_bdb.BreakpointTestCase.test_clear_at_no_bp @ linux-x86_64 +test.test_bdb.BreakpointTestCase.test_clear_two_bp_on_same_line @ linux-x86_64 +test.test_bdb.BreakpointTestCase.test_disabled_temporary_bp @ linux-x86_64 +test.test_bdb.BreakpointTestCase.test_ignore_count_on_disabled_bp @ linux-x86_64 +test.test_bdb.BreakpointTestCase.test_load_bps_from_previous_Bdb_instance @ linux-x86_64 +test.test_bdb.BreakpointTestCase.test_temporary_bp @ linux-x86_64 +test.test_bdb.IssuesTestCase.test_step_at_return_with_no_trace_in_caller @ linux-x86_64 +test.test_bdb.RunTestCase.test_run_step @ linux-x86_64 +test.test_bdb.RunTestCase.test_runeval_step @ linux-x86_64 +test.test_bdb.StateTestCase.test_down @ linux-x86_64 +test.test_bdb.StateTestCase.test_next @ linux-x86_64 +test.test_bdb.StateTestCase.test_next_in_caller_frame @ linux-x86_64 +test.test_bdb.StateTestCase.test_next_on_plain_statement @ linux-x86_64 +test.test_bdb.StateTestCase.test_next_over_import @ linux-x86_64 +test.test_bdb.StateTestCase.test_return @ linux-x86_64 +test.test_bdb.StateTestCase.test_return_in_caller_frame @ linux-x86_64 +test.test_bdb.StateTestCase.test_skip @ linux-x86_64 +test.test_bdb.StateTestCase.test_skip_with_no_name_module @ linux-x86_64 +test.test_bdb.StateTestCase.test_step @ linux-x86_64 +test.test_bdb.StateTestCase.test_step_next_on_last_statement @ linux-x86_64 +test.test_bdb.StateTestCase.test_until @ linux-x86_64 +test.test_bdb.StateTestCase.test_until_in_caller_frame @ linux-x86_64 +test.test_bdb.StateTestCase.test_until_with_too_large_count @ linux-x86_64 +test.test_bdb.StateTestCase.test_up @ linux-x86_64 +test.test_bdb.TestRegressions.test_format_stack_entry_no_lineno @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bigmem.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bigmem.txt new file mode 100644 index 0000000000..d45ef8543c --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bigmem.txt @@ -0,0 +1,161 @@ +test.test_bigmem.BytearrayTest.test_capitalize @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_center @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_compare @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_concat @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_contains @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_count @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_decode @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_endswith @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_expandtabs @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_find @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_index @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_isalnum @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_isalpha @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_isdigit @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_islower @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_isspace @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_istitle @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_isupper @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_join @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_ljust @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_lower @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_lstrip @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_repeat @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_replace @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_rfind @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_rindex @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_rjust @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_rstrip @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_slice_and_getitem @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_split_small @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_splitlines @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_startswith @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_strip @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_swapcase @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_title @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_translate @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_upper @ linux-x86_64 +test.test_bigmem.BytearrayTest.test_zfill @ linux-x86_64 +test.test_bigmem.BytesTest.test_capitalize @ linux-x86_64 +test.test_bigmem.BytesTest.test_center @ linux-x86_64 +test.test_bigmem.BytesTest.test_compare @ linux-x86_64 +test.test_bigmem.BytesTest.test_concat @ linux-x86_64 +test.test_bigmem.BytesTest.test_contains @ linux-x86_64 +test.test_bigmem.BytesTest.test_count @ linux-x86_64 +test.test_bigmem.BytesTest.test_decode @ linux-x86_64 +test.test_bigmem.BytesTest.test_endswith @ linux-x86_64 +test.test_bigmem.BytesTest.test_expandtabs @ linux-x86_64 +test.test_bigmem.BytesTest.test_find @ linux-x86_64 +test.test_bigmem.BytesTest.test_hash @ linux-x86_64 +test.test_bigmem.BytesTest.test_index @ linux-x86_64 +test.test_bigmem.BytesTest.test_isalnum @ linux-x86_64 +test.test_bigmem.BytesTest.test_isalpha @ linux-x86_64 +test.test_bigmem.BytesTest.test_isdigit @ linux-x86_64 +test.test_bigmem.BytesTest.test_islower @ linux-x86_64 +test.test_bigmem.BytesTest.test_isspace @ linux-x86_64 +test.test_bigmem.BytesTest.test_istitle @ linux-x86_64 +test.test_bigmem.BytesTest.test_isupper @ linux-x86_64 +test.test_bigmem.BytesTest.test_join @ linux-x86_64 +test.test_bigmem.BytesTest.test_ljust @ linux-x86_64 +test.test_bigmem.BytesTest.test_lower @ linux-x86_64 +test.test_bigmem.BytesTest.test_repeat @ linux-x86_64 +test.test_bigmem.BytesTest.test_replace @ linux-x86_64 +test.test_bigmem.BytesTest.test_rfind @ linux-x86_64 +test.test_bigmem.BytesTest.test_rindex @ linux-x86_64 +test.test_bigmem.BytesTest.test_rjust @ linux-x86_64 +test.test_bigmem.BytesTest.test_slice_and_getitem @ linux-x86_64 +test.test_bigmem.BytesTest.test_split_large @ linux-x86_64 +test.test_bigmem.BytesTest.test_split_small @ linux-x86_64 +test.test_bigmem.BytesTest.test_splitlines @ linux-x86_64 +test.test_bigmem.BytesTest.test_startswith @ linux-x86_64 +test.test_bigmem.BytesTest.test_strip @ linux-x86_64 +test.test_bigmem.BytesTest.test_swapcase @ linux-x86_64 +test.test_bigmem.BytesTest.test_title @ linux-x86_64 +test.test_bigmem.BytesTest.test_translate @ linux-x86_64 +test.test_bigmem.BytesTest.test_upper @ linux-x86_64 +test.test_bigmem.BytesTest.test_zfill @ linux-x86_64 +test.test_bigmem.DictTest.test_dict @ linux-x86_64 +test.test_bigmem.ListTest.test_append @ linux-x86_64 +test.test_bigmem.ListTest.test_compare @ linux-x86_64 +test.test_bigmem.ListTest.test_concat_large @ linux-x86_64 +test.test_bigmem.ListTest.test_concat_small @ linux-x86_64 +test.test_bigmem.ListTest.test_contains @ linux-x86_64 +test.test_bigmem.ListTest.test_count @ linux-x86_64 +test.test_bigmem.ListTest.test_extend_large @ linux-x86_64 +test.test_bigmem.ListTest.test_extend_small @ linux-x86_64 +test.test_bigmem.ListTest.test_hash @ linux-x86_64 +test.test_bigmem.ListTest.test_index @ linux-x86_64 +test.test_bigmem.ListTest.test_index_and_slice @ linux-x86_64 +test.test_bigmem.ListTest.test_inplace_concat_large @ linux-x86_64 +test.test_bigmem.ListTest.test_inplace_concat_small @ linux-x86_64 +test.test_bigmem.ListTest.test_inplace_repeat_large @ linux-x86_64 +test.test_bigmem.ListTest.test_inplace_repeat_small @ linux-x86_64 +test.test_bigmem.ListTest.test_insert @ linux-x86_64 +test.test_bigmem.ListTest.test_pop @ linux-x86_64 +test.test_bigmem.ListTest.test_remove @ linux-x86_64 +test.test_bigmem.ListTest.test_repeat_large @ linux-x86_64 +test.test_bigmem.ListTest.test_repeat_small @ linux-x86_64 +test.test_bigmem.ListTest.test_repr_large @ linux-x86_64 +test.test_bigmem.ListTest.test_repr_small @ linux-x86_64 +test.test_bigmem.ListTest.test_reverse @ linux-x86_64 +test.test_bigmem.ListTest.test_sort @ linux-x86_64 +test.test_bigmem.StrTest.test_capitalize @ linux-x86_64 +test.test_bigmem.StrTest.test_center @ linux-x86_64 +test.test_bigmem.StrTest.test_compare @ linux-x86_64 +test.test_bigmem.StrTest.test_concat @ linux-x86_64 +test.test_bigmem.StrTest.test_contains @ linux-x86_64 +test.test_bigmem.StrTest.test_count @ linux-x86_64 +test.test_bigmem.StrTest.test_encode @ linux-x86_64 +test.test_bigmem.StrTest.test_encode_ascii @ linux-x86_64 +test.test_bigmem.StrTest.test_encode_raw_unicode_escape @ linux-x86_64 +test.test_bigmem.StrTest.test_encode_utf32 @ linux-x86_64 +test.test_bigmem.StrTest.test_encode_utf7 @ linux-x86_64 +test.test_bigmem.StrTest.test_endswith @ linux-x86_64 +test.test_bigmem.StrTest.test_expandtabs @ linux-x86_64 +test.test_bigmem.StrTest.test_find @ linux-x86_64 +test.test_bigmem.StrTest.test_format @ linux-x86_64 +test.test_bigmem.StrTest.test_index @ linux-x86_64 +test.test_bigmem.StrTest.test_isalnum @ linux-x86_64 +test.test_bigmem.StrTest.test_isalpha @ linux-x86_64 +test.test_bigmem.StrTest.test_isdigit @ linux-x86_64 +test.test_bigmem.StrTest.test_islower @ linux-x86_64 +test.test_bigmem.StrTest.test_isspace @ linux-x86_64 +test.test_bigmem.StrTest.test_istitle @ linux-x86_64 +test.test_bigmem.StrTest.test_isupper @ linux-x86_64 +test.test_bigmem.StrTest.test_join @ linux-x86_64 +test.test_bigmem.StrTest.test_ljust @ linux-x86_64 +test.test_bigmem.StrTest.test_lower @ linux-x86_64 +test.test_bigmem.StrTest.test_lstrip @ linux-x86_64 +test.test_bigmem.StrTest.test_repeat @ linux-x86_64 +test.test_bigmem.StrTest.test_replace @ linux-x86_64 +test.test_bigmem.StrTest.test_repr_large @ linux-x86_64 +test.test_bigmem.StrTest.test_repr_small @ linux-x86_64 +test.test_bigmem.StrTest.test_rfind @ linux-x86_64 +test.test_bigmem.StrTest.test_rindex @ linux-x86_64 +test.test_bigmem.StrTest.test_rjust @ linux-x86_64 +test.test_bigmem.StrTest.test_rstrip @ linux-x86_64 +test.test_bigmem.StrTest.test_split_large @ linux-x86_64 +test.test_bigmem.StrTest.test_split_small @ linux-x86_64 +test.test_bigmem.StrTest.test_splitlines @ linux-x86_64 +test.test_bigmem.StrTest.test_startswith @ linux-x86_64 +test.test_bigmem.StrTest.test_strip @ linux-x86_64 +test.test_bigmem.StrTest.test_swapcase @ linux-x86_64 +test.test_bigmem.StrTest.test_title @ linux-x86_64 +test.test_bigmem.StrTest.test_translate @ linux-x86_64 +test.test_bigmem.StrTest.test_unicode_repr @ linux-x86_64 +test.test_bigmem.StrTest.test_unicode_repr_wide @ linux-x86_64 +test.test_bigmem.StrTest.test_upper @ linux-x86_64 +test.test_bigmem.StrTest.test_zfill @ linux-x86_64 +test.test_bigmem.TupleTest.test_compare @ linux-x86_64 +test.test_bigmem.TupleTest.test_concat_large @ linux-x86_64 +test.test_bigmem.TupleTest.test_concat_small @ linux-x86_64 +test.test_bigmem.TupleTest.test_contains @ linux-x86_64 +test.test_bigmem.TupleTest.test_from_2G_generator @ linux-x86_64 +test.test_bigmem.TupleTest.test_from_almost_2G_generator @ linux-x86_64 +test.test_bigmem.TupleTest.test_hash @ linux-x86_64 +test.test_bigmem.TupleTest.test_index_and_slice @ linux-x86_64 +test.test_bigmem.TupleTest.test_repeat_large @ linux-x86_64 +test.test_bigmem.TupleTest.test_repeat_large_2 @ linux-x86_64 +test.test_bigmem.TupleTest.test_repeat_small @ linux-x86_64 +test.test_bigmem.TupleTest.test_repr_large @ linux-x86_64 +test.test_bigmem.TupleTest.test_repr_small @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_binascii.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_binascii.txt new file mode 100644 index 0000000000..5d7c43d458 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_binascii.txt @@ -0,0 +1,28 @@ +test.test_binascii.ArrayBinASCIITest.test_b2a_base64_newline @ linux-x86_64 +test.test_binascii.ArrayBinASCIITest.test_base64valid @ linux-x86_64 +test.test_binascii.ArrayBinASCIITest.test_c_contiguity @ linux-x86_64 +test.test_binascii.ArrayBinASCIITest.test_crc32 @ linux-x86_64 +test.test_binascii.ArrayBinASCIITest.test_crc_hqx @ linux-x86_64 +test.test_binascii.ArrayBinASCIITest.test_exceptions @ linux-x86_64 +test.test_binascii.ArrayBinASCIITest.test_hex @ linux-x86_64 +test.test_binascii.BinASCIITest.test_b2a_base64_newline @ linux-x86_64 +test.test_binascii.BinASCIITest.test_base64valid @ linux-x86_64 +test.test_binascii.BinASCIITest.test_c_contiguity @ linux-x86_64 +test.test_binascii.BinASCIITest.test_crc32 @ linux-x86_64 +test.test_binascii.BinASCIITest.test_crc_hqx @ linux-x86_64 +test.test_binascii.BinASCIITest.test_exceptions @ linux-x86_64 +test.test_binascii.BinASCIITest.test_hex @ linux-x86_64 +test.test_binascii.BytearrayBinASCIITest.test_b2a_base64_newline @ linux-x86_64 +test.test_binascii.BytearrayBinASCIITest.test_base64valid @ linux-x86_64 +test.test_binascii.BytearrayBinASCIITest.test_c_contiguity @ linux-x86_64 +test.test_binascii.BytearrayBinASCIITest.test_crc32 @ linux-x86_64 +test.test_binascii.BytearrayBinASCIITest.test_crc_hqx @ linux-x86_64 +test.test_binascii.BytearrayBinASCIITest.test_exceptions @ linux-x86_64 +test.test_binascii.BytearrayBinASCIITest.test_hex @ linux-x86_64 +test.test_binascii.MemoryviewBinASCIITest.test_b2a_base64_newline @ linux-x86_64 +test.test_binascii.MemoryviewBinASCIITest.test_base64valid @ linux-x86_64 +test.test_binascii.MemoryviewBinASCIITest.test_c_contiguity @ linux-x86_64 +test.test_binascii.MemoryviewBinASCIITest.test_crc32 @ linux-x86_64 +test.test_binascii.MemoryviewBinASCIITest.test_crc_hqx @ linux-x86_64 +test.test_binascii.MemoryviewBinASCIITest.test_exceptions @ linux-x86_64 +test.test_binascii.MemoryviewBinASCIITest.test_hex @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_binop.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_binop.txt new file mode 100644 index 0000000000..f464c4d476 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_binop.txt @@ -0,0 +1,12 @@ +test.test_binop.FallbackBlockingTests.test_fallback_ne_blocking @ linux-x86_64 +test.test_binop.FallbackBlockingTests.test_fallback_rmethod_blocking @ linux-x86_64 +test.test_binop.OperationOrderTests.test_comparison_orders @ linux-x86_64 +test.test_binop.RatTestCase.test_add @ linux-x86_64 +test.test_binop.RatTestCase.test_constructor @ linux-x86_64 +test.test_binop.RatTestCase.test_div @ linux-x86_64 +test.test_binop.RatTestCase.test_eq @ linux-x86_64 +test.test_binop.RatTestCase.test_floordiv @ linux-x86_64 +test.test_binop.RatTestCase.test_gcd @ linux-x86_64 +test.test_binop.RatTestCase.test_mul @ linux-x86_64 +test.test_binop.RatTestCase.test_sub @ linux-x86_64 +test.test_binop.RatTestCase.test_true_div @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bisect.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bisect.txt new file mode 100644 index 0000000000..f52cf5eb45 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bisect.txt @@ -0,0 +1,21 @@ +test.test_bisect.TestBisectPython.test_backcompatibility @ linux-x86_64 +test.test_bisect.TestBisectPython.test_insort @ linux-x86_64 +test.test_bisect.TestBisectPython.test_insort_keynotNone @ linux-x86_64 +test.test_bisect.TestBisectPython.test_keyword_args @ linux-x86_64 +test.test_bisect.TestBisectPython.test_large_pyrange @ linux-x86_64 +test.test_bisect.TestBisectPython.test_large_range @ linux-x86_64 +test.test_bisect.TestBisectPython.test_lookups_with_key_function @ linux-x86_64 +test.test_bisect.TestBisectPython.test_negative_lo @ linux-x86_64 +test.test_bisect.TestBisectPython.test_optionalSlicing @ linux-x86_64 +test.test_bisect.TestBisectPython.test_precomputed @ linux-x86_64 +test.test_bisect.TestBisectPython.test_random @ linux-x86_64 +test.test_bisect.TestDocExamplePython.test_colors @ linux-x86_64 +test.test_bisect.TestDocExamplePython.test_grades @ linux-x86_64 +test.test_bisect.TestErrorHandlingPython.test_arg_parsing @ linux-x86_64 +test.test_bisect.TestErrorHandlingPython.test_cmp_err @ linux-x86_64 +test.test_bisect.TestErrorHandlingPython.test_get_only @ linux-x86_64 +test.test_bisect.TestErrorHandlingPython.test_len_only @ linux-x86_64 +test.test_bisect.TestErrorHandlingPython.test_non_sequence @ linux-x86_64 +test.test_bisect.TestInsortPython.test_backcompatibility @ linux-x86_64 +test.test_bisect.TestInsortPython.test_listDerived @ linux-x86_64 +test.test_bisect.TestInsortPython.test_vsBuiltinSort @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bool.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bool.txt new file mode 100644 index 0000000000..7f82eb32fc --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bool.txt @@ -0,0 +1,30 @@ +test.test_bool.BoolTest.test_blocked @ linux-x86_64 +test.test_bool.BoolTest.test_bool_called_at_least_once @ linux-x86_64 +test.test_bool.BoolTest.test_bool_new @ linux-x86_64 +test.test_bool.BoolTest.test_boolean @ linux-x86_64 +test.test_bool.BoolTest.test_callable @ linux-x86_64 +test.test_bool.BoolTest.test_complex @ linux-x86_64 +test.test_bool.BoolTest.test_contains @ linux-x86_64 +test.test_bool.BoolTest.test_convert @ linux-x86_64 +test.test_bool.BoolTest.test_convert_to_bool @ linux-x86_64 +test.test_bool.BoolTest.test_fileclosed @ linux-x86_64 +test.test_bool.BoolTest.test_float @ linux-x86_64 +test.test_bool.BoolTest.test_format @ linux-x86_64 +test.test_bool.BoolTest.test_from_bytes @ linux-x86_64 +test.test_bool.BoolTest.test_hasattr @ linux-x86_64 +test.test_bool.BoolTest.test_int @ linux-x86_64 +test.test_bool.BoolTest.test_isinstance @ linux-x86_64 +test.test_bool.BoolTest.test_issubclass @ linux-x86_64 +test.test_bool.BoolTest.test_keyword_args @ linux-x86_64 +test.test_bool.BoolTest.test_marshal @ linux-x86_64 +test.test_bool.BoolTest.test_math @ linux-x86_64 +test.test_bool.BoolTest.test_operator @ linux-x86_64 +test.test_bool.BoolTest.test_pickle @ linux-x86_64 +test.test_bool.BoolTest.test_picklevalues @ linux-x86_64 +test.test_bool.BoolTest.test_real_and_imag @ linux-x86_64 +test.test_bool.BoolTest.test_repr @ linux-x86_64 +test.test_bool.BoolTest.test_sane_len @ linux-x86_64 +test.test_bool.BoolTest.test_str @ linux-x86_64 +test.test_bool.BoolTest.test_string @ linux-x86_64 +test.test_bool.BoolTest.test_subclass @ linux-x86_64 +test.test_bool.BoolTest.test_types @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_buffer.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_buffer.txt new file mode 100644 index 0000000000..e63458e0f4 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_buffer.txt @@ -0,0 +1,35 @@ +test.test_buffer.TestBufferProtocol.test_issue_7385 @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_array @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_cast @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_cast_zero_shape @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_cast_zero_strides @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_check_released @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_compare_multidim_zero_shape @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_compare_zero_shape @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_getbuffer_undefined @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_index @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_redirect @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_repr @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_sequence @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_serializing @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_memoryview_tolist @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_cmp_contig @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_fortran @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_hash @ linux-x86_64 +!test.test_buffer.TestBufferProtocol.test_ndarray_index_getitem_multidim @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_index_invalid @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_index_null_strides @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_index_scalar @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_linked_list @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_memoryview_from_buffer @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_offset @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_random_invalid @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_re_export @ linux-x86_64 +!test.test_buffer.TestBufferProtocol.test_ndarray_slice_assign_multidim @ linux-x86_64 +!test.test_buffer.TestBufferProtocol.test_ndarray_slice_multidim @ linux-x86_64 +!test.test_buffer.TestBufferProtocol.test_ndarray_slice_redundant_suboffsets @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_slice_zero_shape @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_tolist_null_strides @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_zero_shape @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_ndarray_zero_strides @ linux-x86_64 +test.test_buffer.TestBufferProtocol.test_py_buffer_to_contiguous @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bufio.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bufio.txt new file mode 100644 index 0000000000..5e4e38c7ee --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bufio.txt @@ -0,0 +1,4 @@ +test.test_bufio.CBufferSizeTest.test_nullpat @ linux-x86_64 +test.test_bufio.CBufferSizeTest.test_primepat @ linux-x86_64 +test.test_bufio.PyBufferSizeTest.test_nullpat @ linux-x86_64 +test.test_bufio.PyBufferSizeTest.test_primepat @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_builtin.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_builtin.txt new file mode 100644 index 0000000000..7cbb95d21b --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_builtin.txt @@ -0,0 +1,87 @@ +DocTestCase.builtins.zip @ linux-x86_64 +test.test_builtin.BuiltinTest.test_abs @ linux-x86_64 +test.test_builtin.BuiltinTest.test_all @ linux-x86_64 +test.test_builtin.BuiltinTest.test_any @ linux-x86_64 +test.test_builtin.BuiltinTest.test_ascii @ linux-x86_64 +test.test_builtin.BuiltinTest.test_bin @ linux-x86_64 +test.test_builtin.BuiltinTest.test_bug_27936 @ linux-x86_64 +test.test_builtin.BuiltinTest.test_bytearray_extend_error @ linux-x86_64 +test.test_builtin.BuiltinTest.test_bytearray_join_with_custom_iterator @ linux-x86_64 +test.test_builtin.BuiltinTest.test_bytearray_translate @ linux-x86_64 +test.test_builtin.BuiltinTest.test_callable @ linux-x86_64 +test.test_builtin.BuiltinTest.test_chr @ linux-x86_64 +test.test_builtin.BuiltinTest.test_cmp @ linux-x86_64 +test.test_builtin.BuiltinTest.test_construct_singletons @ linux-x86_64 +test.test_builtin.BuiltinTest.test_delattr @ linux-x86_64 +test.test_builtin.BuiltinTest.test_dir @ linux-x86_64 +test.test_builtin.BuiltinTest.test_divmod @ linux-x86_64 +test.test_builtin.BuiltinTest.test_eval @ linux-x86_64 +test.test_builtin.BuiltinTest.test_exec @ linux-x86_64 +test.test_builtin.BuiltinTest.test_exec_redirected @ linux-x86_64 +test.test_builtin.BuiltinTest.test_filter @ linux-x86_64 +test.test_builtin.BuiltinTest.test_filter_dealloc @ linux-x86_64 +test.test_builtin.BuiltinTest.test_filter_pickle @ linux-x86_64 +test.test_builtin.BuiltinTest.test_format @ linux-x86_64 +test.test_builtin.BuiltinTest.test_general_eval @ linux-x86_64 +test.test_builtin.BuiltinTest.test_getattr @ linux-x86_64 +test.test_builtin.BuiltinTest.test_hasattr @ linux-x86_64 +test.test_builtin.BuiltinTest.test_hash @ linux-x86_64 +test.test_builtin.BuiltinTest.test_hex @ linux-x86_64 +test.test_builtin.BuiltinTest.test_id @ linux-x86_64 +test.test_builtin.BuiltinTest.test_import @ linux-x86_64 +test.test_builtin.BuiltinTest.test_input @ linux-x86_64 +test.test_builtin.BuiltinTest.test_isinstance @ linux-x86_64 +test.test_builtin.BuiltinTest.test_issubclass @ linux-x86_64 +test.test_builtin.BuiltinTest.test_iter @ linux-x86_64 +test.test_builtin.BuiltinTest.test_len @ linux-x86_64 +test.test_builtin.BuiltinTest.test_map @ linux-x86_64 +test.test_builtin.BuiltinTest.test_map_pickle @ linux-x86_64 +test.test_builtin.BuiltinTest.test_max @ linux-x86_64 +test.test_builtin.BuiltinTest.test_min @ linux-x86_64 +test.test_builtin.BuiltinTest.test_neg @ linux-x86_64 +test.test_builtin.BuiltinTest.test_next @ linux-x86_64 +test.test_builtin.BuiltinTest.test_oct @ linux-x86_64 +test.test_builtin.BuiltinTest.test_open @ linux-x86_64 +test.test_builtin.BuiltinTest.test_open_default_encoding @ linux-x86_64 +test.test_builtin.BuiltinTest.test_open_non_inheritable @ linux-x86_64 +test.test_builtin.BuiltinTest.test_ord @ linux-x86_64 +test.test_builtin.BuiltinTest.test_pow @ linux-x86_64 +test.test_builtin.BuiltinTest.test_repr @ linux-x86_64 +test.test_builtin.BuiltinTest.test_round @ linux-x86_64 +test.test_builtin.BuiltinTest.test_round_large @ linux-x86_64 +test.test_builtin.BuiltinTest.test_setattr @ linux-x86_64 +test.test_builtin.BuiltinTest.test_sum @ linux-x86_64 +test.test_builtin.BuiltinTest.test_type @ linux-x86_64 +test.test_builtin.BuiltinTest.test_vars @ linux-x86_64 +test.test_builtin.BuiltinTest.test_zip @ linux-x86_64 +test.test_builtin.BuiltinTest.test_zip_bad_iterable @ linux-x86_64 +test.test_builtin.BuiltinTest.test_zip_pickle @ linux-x86_64 +test.test_builtin.BuiltinTest.test_zip_pickle_strict @ linux-x86_64 +test.test_builtin.BuiltinTest.test_zip_pickle_strict_fail @ linux-x86_64 +test.test_builtin.BuiltinTest.test_zip_strict @ linux-x86_64 +test.test_builtin.BuiltinTest.test_zip_strict_error_handling @ linux-x86_64 +test.test_builtin.BuiltinTest.test_zip_strict_error_handling_stopiteration @ linux-x86_64 +test.test_builtin.BuiltinTest.test_zip_strict_iterators @ linux-x86_64 +test.test_builtin.TestBreakpoint.test_breakpoint @ linux-x86_64 +test.test_builtin.TestBreakpoint.test_breakpoint_with_args_and_keywords @ linux-x86_64 +test.test_builtin.TestBreakpoint.test_breakpoint_with_breakpointhook_reset @ linux-x86_64 +test.test_builtin.TestBreakpoint.test_breakpoint_with_breakpointhook_set @ linux-x86_64 +test.test_builtin.TestBreakpoint.test_breakpoint_with_passthru_error @ linux-x86_64 +test.test_builtin.TestBreakpoint.test_envar_good_path_builtin @ linux-x86_64 +test.test_builtin.TestBreakpoint.test_envar_good_path_empty_string @ linux-x86_64 +test.test_builtin.TestBreakpoint.test_envar_good_path_noop_0 @ linux-x86_64 +test.test_builtin.TestBreakpoint.test_envar_good_path_other @ linux-x86_64 +test.test_builtin.TestBreakpoint.test_envar_ignored_when_hook_is_set @ linux-x86_64 +test.test_builtin.TestBreakpoint.test_envar_unimportable @ linux-x86_64 +test.test_builtin.TestSorted.test_bad_arguments @ linux-x86_64 +test.test_builtin.TestSorted.test_baddecorator @ linux-x86_64 +test.test_builtin.TestSorted.test_basic @ linux-x86_64 +test.test_builtin.TestSorted.test_inputtypes @ linux-x86_64 +test.test_builtin.TestType.test_bad_args @ linux-x86_64 +test.test_builtin.TestType.test_bad_slots @ linux-x86_64 +test.test_builtin.TestType.test_namespace_order @ linux-x86_64 +test.test_builtin.TestType.test_new_type @ linux-x86_64 +test.test_builtin.TestType.test_type_doc @ linux-x86_64 +test.test_builtin.TestType.test_type_name @ linux-x86_64 +test.test_builtin.TestType.test_type_nokwargs @ linux-x86_64 +test.test_builtin.TestType.test_type_qualname @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bytes.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bytes.txt new file mode 100644 index 0000000000..ad3d40a2d2 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bytes.txt @@ -0,0 +1,269 @@ +test.test_bytes.AssortedBytesTest.test_compare_bytes_to_bytearray @ linux-x86_64 +test.test_bytes.AssortedBytesTest.test_doc @ linux-x86_64 +test.test_bytes.AssortedBytesTest.test_format @ linux-x86_64 +test.test_bytes.AssortedBytesTest.test_from_bytearray @ linux-x86_64 +test.test_bytes.AssortedBytesTest.test_literal @ linux-x86_64 +test.test_bytes.AssortedBytesTest.test_repr_str @ linux-x86_64 +test.test_bytes.AssortedBytesTest.test_return_self @ linux-x86_64 +test.test_bytes.AssortedBytesTest.test_rsplit_bytearray @ linux-x86_64 +test.test_bytes.AssortedBytesTest.test_split_bytearray @ linux-x86_64 +test.test_bytes.AssortedBytesTest.test_to_str @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_additional_rsplit @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_additional_split @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_capitalize @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_center @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_count @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_expandtabs @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_find @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_find_periodic_pattern @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_find_shift_table_overflow @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_fixtype @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_index @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_isalnum @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_isalpha @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_isascii @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_isdigit @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_islower @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_isspace @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_istitle @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_isupper @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_ljust @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_lower @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_removeprefix @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_removesuffix @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_replace @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_rfind @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_rindex @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_rjust @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_rsplit @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_split @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_splitlines @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_strip @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_strip_whitespace @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_swapcase @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_title @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_upper @ linux-x86_64 +test.test_bytes.ByteArrayAsStringTest.test_zfill @ linux-x86_64 +test.test_bytes.ByteArraySubclassTest.test_basic @ linux-x86_64 +test.test_bytes.ByteArraySubclassTest.test_copy @ linux-x86_64 +test.test_bytes.ByteArraySubclassTest.test_fromhex @ linux-x86_64 +test.test_bytes.ByteArraySubclassTest.test_init_override @ linux-x86_64 +test.test_bytes.ByteArraySubclassTest.test_join @ linux-x86_64 +test.test_bytes.ByteArraySubclassTest.test_pickle @ linux-x86_64 +test.test_bytes.ByteArraySubclassWithSlotsTest.test_basic @ linux-x86_64 +test.test_bytes.ByteArraySubclassWithSlotsTest.test_copy @ linux-x86_64 +test.test_bytes.ByteArraySubclassWithSlotsTest.test_fromhex @ linux-x86_64 +test.test_bytes.ByteArraySubclassWithSlotsTest.test_join @ linux-x86_64 +test.test_bytes.ByteArraySubclassWithSlotsTest.test_pickle @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_alloc @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_append @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_basics @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_bytearray_api @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_center @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_clear @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_compare @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_compare_to_str @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_concat @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_constructor_exceptions @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_constructor_type_errors @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_constructor_value_errors @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_contains @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_copied @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_copy @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_count @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_decode @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_del_expand @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_delitem @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_empty_sequence @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_encoding @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_endswith @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_exhausted_iterator @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_extend @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_extended_getslice @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_extended_set_del_slice @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_fifo_overrun @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_find @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_find_etc_raise_correct_error_messages @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_from_buffer @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_from_index @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_from_int @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_from_iterable @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_from_list @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_from_mutating_list @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_from_ssize @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_from_tuple @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_fromhex @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_getitem_error @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_getslice @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_hex @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_hex_separator_basics @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_hex_separator_five_bytes @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_hex_separator_six_bytes @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_iconcat @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_imod @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_index @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_init_alloc @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_insert @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_integer_arguments_out_of_byte_range @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_irepeat @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_irepeat_1char @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_iterator_length_hint @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_iterator_pickling @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_join @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_ljust @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_maketrans @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_mod @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_nohash @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_none_arguments @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_nosort @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_ord @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_partition @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_partition_bytearray_doesnt_share_nullstring @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_partition_int_error @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_partition_string_error @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_pickling @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_pop @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_regexps @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_remove @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_repeat @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_repeat_1char @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_repeat_after_setslice @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_replace @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_replace_int_error @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_reverse @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_reversed @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_rfind @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_rindex @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_rjust @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_rmod @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_rpartition @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_rsplit_unicodewhitespace @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_setitem @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_setitem_error @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_setslice @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_setslice_extend @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_setslice_trap @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_split_int_error @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_split_string_error @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_split_unicodewhitespace @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_sq_item @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_startswith @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_strip_bytearray @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_strip_int_error @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_strip_string_error @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_translate @ linux-x86_64 +test.test_bytes.ByteArrayTest.test_xjust_int_error @ linux-x86_64 +test.test_bytes.BytearrayPEP3137Test.test_returns_new_copy @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_additional_rsplit @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_additional_split @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_capitalize @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_center @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_count @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_expandtabs @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_find @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_find_periodic_pattern @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_find_shift_table_overflow @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_fixtype @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_index @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_isalnum @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_isalpha @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_isascii @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_isdigit @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_islower @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_isspace @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_istitle @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_isupper @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_ljust @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_lower @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_removeprefix @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_removesuffix @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_replace @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_rfind @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_rindex @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_rjust @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_rsplit @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_split @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_splitlines @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_strip @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_strip_whitespace @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_swapcase @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_title @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_upper @ linux-x86_64 +test.test_bytes.BytesAsStringTest.test_zfill @ linux-x86_64 +test.test_bytes.BytesSubclassTest.test_basic @ linux-x86_64 +test.test_bytes.BytesSubclassTest.test_copy @ linux-x86_64 +test.test_bytes.BytesSubclassTest.test_fromhex @ linux-x86_64 +test.test_bytes.BytesSubclassTest.test_join @ linux-x86_64 +test.test_bytes.BytesSubclassTest.test_pickle @ linux-x86_64 +test.test_bytes.BytesTest.test__bytes__ @ linux-x86_64 +test.test_bytes.BytesTest.test_basics @ linux-x86_64 +test.test_bytes.BytesTest.test_buffer_is_readonly @ linux-x86_64 +test.test_bytes.BytesTest.test_bytes_blocking @ linux-x86_64 +test.test_bytes.BytesTest.test_center @ linux-x86_64 +test.test_bytes.BytesTest.test_compare @ linux-x86_64 +test.test_bytes.BytesTest.test_compare_to_str @ linux-x86_64 +test.test_bytes.BytesTest.test_concat @ linux-x86_64 +test.test_bytes.BytesTest.test_constructor_exceptions @ linux-x86_64 +test.test_bytes.BytesTest.test_constructor_type_errors @ linux-x86_64 +test.test_bytes.BytesTest.test_constructor_value_errors @ linux-x86_64 +test.test_bytes.BytesTest.test_contains @ linux-x86_64 +test.test_bytes.BytesTest.test_copy @ linux-x86_64 +test.test_bytes.BytesTest.test_count @ linux-x86_64 +test.test_bytes.BytesTest.test_custom @ linux-x86_64 +test.test_bytes.BytesTest.test_decode @ linux-x86_64 +test.test_bytes.BytesTest.test_empty_sequence @ linux-x86_64 +test.test_bytes.BytesTest.test_encoding @ linux-x86_64 +test.test_bytes.BytesTest.test_endswith @ linux-x86_64 +test.test_bytes.BytesTest.test_extended_getslice @ linux-x86_64 +test.test_bytes.BytesTest.test_find @ linux-x86_64 +test.test_bytes.BytesTest.test_find_etc_raise_correct_error_messages @ linux-x86_64 +test.test_bytes.BytesTest.test_from_buffer @ linux-x86_64 +test.test_bytes.BytesTest.test_from_index @ linux-x86_64 +test.test_bytes.BytesTest.test_from_int @ linux-x86_64 +test.test_bytes.BytesTest.test_from_iterable @ linux-x86_64 +test.test_bytes.BytesTest.test_from_list @ linux-x86_64 +test.test_bytes.BytesTest.test_from_mutating_list @ linux-x86_64 +test.test_bytes.BytesTest.test_from_ssize @ linux-x86_64 +test.test_bytes.BytesTest.test_from_tuple @ linux-x86_64 +test.test_bytes.BytesTest.test_fromhex @ linux-x86_64 +test.test_bytes.BytesTest.test_getitem_error @ linux-x86_64 +test.test_bytes.BytesTest.test_getslice @ linux-x86_64 +test.test_bytes.BytesTest.test_hex @ linux-x86_64 +test.test_bytes.BytesTest.test_hex_separator_basics @ linux-x86_64 +test.test_bytes.BytesTest.test_hex_separator_five_bytes @ linux-x86_64 +test.test_bytes.BytesTest.test_hex_separator_six_bytes @ linux-x86_64 +test.test_bytes.BytesTest.test_imod @ linux-x86_64 +test.test_bytes.BytesTest.test_index @ linux-x86_64 +test.test_bytes.BytesTest.test_integer_arguments_out_of_byte_range @ linux-x86_64 +test.test_bytes.BytesTest.test_iterator_pickling @ linux-x86_64 +test.test_bytes.BytesTest.test_join @ linux-x86_64 +test.test_bytes.BytesTest.test_ljust @ linux-x86_64 +test.test_bytes.BytesTest.test_maketrans @ linux-x86_64 +test.test_bytes.BytesTest.test_mod @ linux-x86_64 +test.test_bytes.BytesTest.test_none_arguments @ linux-x86_64 +test.test_bytes.BytesTest.test_ord @ linux-x86_64 +test.test_bytes.BytesTest.test_partition @ linux-x86_64 +test.test_bytes.BytesTest.test_partition_int_error @ linux-x86_64 +test.test_bytes.BytesTest.test_partition_string_error @ linux-x86_64 +test.test_bytes.BytesTest.test_pickling @ linux-x86_64 +test.test_bytes.BytesTest.test_repeat @ linux-x86_64 +test.test_bytes.BytesTest.test_repeat_1char @ linux-x86_64 +test.test_bytes.BytesTest.test_replace @ linux-x86_64 +test.test_bytes.BytesTest.test_replace_int_error @ linux-x86_64 +test.test_bytes.BytesTest.test_reversed @ linux-x86_64 +test.test_bytes.BytesTest.test_rfind @ linux-x86_64 +test.test_bytes.BytesTest.test_rindex @ linux-x86_64 +test.test_bytes.BytesTest.test_rjust @ linux-x86_64 +test.test_bytes.BytesTest.test_rmod @ linux-x86_64 +test.test_bytes.BytesTest.test_rpartition @ linux-x86_64 +test.test_bytes.BytesTest.test_rsplit_unicodewhitespace @ linux-x86_64 +test.test_bytes.BytesTest.test_split_int_error @ linux-x86_64 +test.test_bytes.BytesTest.test_split_string_error @ linux-x86_64 +test.test_bytes.BytesTest.test_split_unicodewhitespace @ linux-x86_64 +test.test_bytes.BytesTest.test_sq_item @ linux-x86_64 +test.test_bytes.BytesTest.test_startswith @ linux-x86_64 +test.test_bytes.BytesTest.test_strip_bytearray @ linux-x86_64 +test.test_bytes.BytesTest.test_strip_int_error @ linux-x86_64 +test.test_bytes.BytesTest.test_strip_string_error @ linux-x86_64 +test.test_bytes.BytesTest.test_translate @ linux-x86_64 +test.test_bytes.BytesTest.test_xjust_int_error @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bz2.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bz2.txt new file mode 100644 index 0000000000..207a85ee3c --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_bz2.txt @@ -0,0 +1,94 @@ +test.test_bz2.BZ2CompressorTest.testCompress @ linux-x86_64 +test.test_bz2.BZ2CompressorTest.testCompress4G @ linux-x86_64 +test.test_bz2.BZ2CompressorTest.testCompressChunks10 @ linux-x86_64 +test.test_bz2.BZ2CompressorTest.testCompressEmptyString @ linux-x86_64 +test.test_bz2.BZ2CompressorTest.testPickle @ linux-x86_64 +test.test_bz2.BZ2DecompressorTest.testDecompress @ linux-x86_64 +test.test_bz2.BZ2DecompressorTest.testDecompress4G @ linux-x86_64 +test.test_bz2.BZ2DecompressorTest.testDecompressChunks10 @ linux-x86_64 +test.test_bz2.BZ2DecompressorTest.testDecompressUnusedData @ linux-x86_64 +test.test_bz2.BZ2DecompressorTest.testDecompressorChunksMaxsize @ linux-x86_64 +test.test_bz2.BZ2DecompressorTest.testEOFError @ linux-x86_64 +test.test_bz2.BZ2DecompressorTest.testPickle @ linux-x86_64 +test.test_bz2.BZ2DecompressorTest.test_Constructor @ linux-x86_64 +test.test_bz2.BZ2DecompressorTest.test_decompressor_inputbuf_1 @ linux-x86_64 +test.test_bz2.BZ2DecompressorTest.test_decompressor_inputbuf_2 @ linux-x86_64 +test.test_bz2.BZ2DecompressorTest.test_decompressor_inputbuf_3 @ linux-x86_64 +test.test_bz2.BZ2DecompressorTest.test_failure @ linux-x86_64 +test.test_bz2.BZ2FileTest.testAppend @ linux-x86_64 +test.test_bz2.BZ2FileTest.testBadArgs @ linux-x86_64 +test.test_bz2.BZ2FileTest.testClosedIteratorDeadlock @ linux-x86_64 +test.test_bz2.BZ2FileTest.testContextProtocol @ linux-x86_64 +test.test_bz2.BZ2FileTest.testDecompressLimited @ linux-x86_64 +test.test_bz2.BZ2FileTest.testFileno @ linux-x86_64 +test.test_bz2.BZ2FileTest.testIterator @ linux-x86_64 +test.test_bz2.BZ2FileTest.testIteratorMultiStream @ linux-x86_64 +test.test_bz2.BZ2FileTest.testMixedIterationAndReads @ linux-x86_64 +test.test_bz2.BZ2FileTest.testMultiStreamOrdering @ linux-x86_64 +test.test_bz2.BZ2FileTest.testOpenBytesFilename @ linux-x86_64 +test.test_bz2.BZ2FileTest.testOpenNonexistent @ linux-x86_64 +test.test_bz2.BZ2FileTest.testOpenPathLikeFilename @ linux-x86_64 +test.test_bz2.BZ2FileTest.testPeek @ linux-x86_64 +test.test_bz2.BZ2FileTest.testPeekBytesIO @ linux-x86_64 +test.test_bz2.BZ2FileTest.testRead @ linux-x86_64 +test.test_bz2.BZ2FileTest.testRead0 @ linux-x86_64 +test.test_bz2.BZ2FileTest.testRead100 @ linux-x86_64 +test.test_bz2.BZ2FileTest.testReadBadFile @ linux-x86_64 +test.test_bz2.BZ2FileTest.testReadBytesIO @ linux-x86_64 +test.test_bz2.BZ2FileTest.testReadChunk10 @ linux-x86_64 +test.test_bz2.BZ2FileTest.testReadChunk10MultiStream @ linux-x86_64 +test.test_bz2.BZ2FileTest.testReadInto @ linux-x86_64 +test.test_bz2.BZ2FileTest.testReadLine @ linux-x86_64 +test.test_bz2.BZ2FileTest.testReadLineMultiStream @ linux-x86_64 +test.test_bz2.BZ2FileTest.testReadLines @ linux-x86_64 +test.test_bz2.BZ2FileTest.testReadLinesMultiStream @ linux-x86_64 +test.test_bz2.BZ2FileTest.testReadMonkeyMultiStream @ linux-x86_64 +test.test_bz2.BZ2FileTest.testReadMultiStream @ linux-x86_64 +test.test_bz2.BZ2FileTest.testReadMultiStreamTrailingJunk @ linux-x86_64 +test.test_bz2.BZ2FileTest.testReadTrailingJunk @ linux-x86_64 +test.test_bz2.BZ2FileTest.testReadable @ linux-x86_64 +test.test_bz2.BZ2FileTest.testReadlinesNoNewline @ linux-x86_64 +test.test_bz2.BZ2FileTest.testSeekBackwards @ linux-x86_64 +test.test_bz2.BZ2FileTest.testSeekBackwardsAcrossStreams @ linux-x86_64 +test.test_bz2.BZ2FileTest.testSeekBackwardsBytesIO @ linux-x86_64 +test.test_bz2.BZ2FileTest.testSeekBackwardsFromEnd @ linux-x86_64 +test.test_bz2.BZ2FileTest.testSeekBackwardsFromEndAcrossStreams @ linux-x86_64 +test.test_bz2.BZ2FileTest.testSeekForward @ linux-x86_64 +test.test_bz2.BZ2FileTest.testSeekForwardAcrossStreams @ linux-x86_64 +test.test_bz2.BZ2FileTest.testSeekForwardBytesIO @ linux-x86_64 +test.test_bz2.BZ2FileTest.testSeekPostEnd @ linux-x86_64 +test.test_bz2.BZ2FileTest.testSeekPostEndMultiStream @ linux-x86_64 +test.test_bz2.BZ2FileTest.testSeekPostEndTwice @ linux-x86_64 +test.test_bz2.BZ2FileTest.testSeekPostEndTwiceMultiStream @ linux-x86_64 +test.test_bz2.BZ2FileTest.testSeekPreStart @ linux-x86_64 +test.test_bz2.BZ2FileTest.testSeekPreStartMultiStream @ linux-x86_64 +test.test_bz2.BZ2FileTest.testSeekable @ linux-x86_64 +test.test_bz2.BZ2FileTest.testThreading @ linux-x86_64 +test.test_bz2.BZ2FileTest.testWritable @ linux-x86_64 +test.test_bz2.BZ2FileTest.testWrite @ linux-x86_64 +test.test_bz2.BZ2FileTest.testWriteBytesIO @ linux-x86_64 +test.test_bz2.BZ2FileTest.testWriteChunks10 @ linux-x86_64 +test.test_bz2.BZ2FileTest.testWriteLines @ linux-x86_64 +test.test_bz2.BZ2FileTest.testWriteMethodsOnReadOnlyFile @ linux-x86_64 +test.test_bz2.BZ2FileTest.testWriteNonDefaultCompressLevel @ linux-x86_64 +test.test_bz2.BZ2FileTest.test_issue44439 @ linux-x86_64 +test.test_bz2.BZ2FileTest.test_read_truncated @ linux-x86_64 +test.test_bz2.CompressDecompressTest.testCompress @ linux-x86_64 +test.test_bz2.CompressDecompressTest.testCompressEmptyString @ linux-x86_64 +test.test_bz2.CompressDecompressTest.testDecompress @ linux-x86_64 +test.test_bz2.CompressDecompressTest.testDecompressBadData @ linux-x86_64 +test.test_bz2.CompressDecompressTest.testDecompressEmpty @ linux-x86_64 +test.test_bz2.CompressDecompressTest.testDecompressIncomplete @ linux-x86_64 +test.test_bz2.CompressDecompressTest.testDecompressMultiStream @ linux-x86_64 +test.test_bz2.CompressDecompressTest.testDecompressMultiStreamTrailingJunk @ linux-x86_64 +test.test_bz2.CompressDecompressTest.testDecompressToEmptyString @ linux-x86_64 +test.test_bz2.CompressDecompressTest.testDecompressTrailingJunk @ linux-x86_64 +test.test_bz2.OpenTest.test_bad_params @ linux-x86_64 +test.test_bz2.OpenTest.test_binary_modes @ linux-x86_64 +test.test_bz2.OpenTest.test_encoding @ linux-x86_64 +test.test_bz2.OpenTest.test_encoding_error_handler @ linux-x86_64 +test.test_bz2.OpenTest.test_fileobj @ linux-x86_64 +test.test_bz2.OpenTest.test_implicit_binary_modes @ linux-x86_64 +test.test_bz2.OpenTest.test_newline @ linux-x86_64 +test.test_bz2.OpenTest.test_text_modes @ linux-x86_64 +test.test_bz2.OpenTest.test_x_mode @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_calendar.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_calendar.txt new file mode 100644 index 0000000000..2073a0d353 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_calendar.txt @@ -0,0 +1,71 @@ +test.test_calendar.CalendarTestCase.test_days @ linux-x86_64 +test.test_calendar.CalendarTestCase.test_enumerate_weekdays @ linux-x86_64 +test.test_calendar.CalendarTestCase.test_illegal_weekday_reported @ linux-x86_64 +test.test_calendar.CalendarTestCase.test_isleap @ linux-x86_64 +test.test_calendar.CalendarTestCase.test_itermonthdays @ linux-x86_64 +test.test_calendar.CalendarTestCase.test_itermonthdays2 @ linux-x86_64 +test.test_calendar.CalendarTestCase.test_itermonthdays3 @ linux-x86_64 +test.test_calendar.CalendarTestCase.test_itermonthdays4 @ linux-x86_64 +test.test_calendar.CalendarTestCase.test_iterweekdays @ linux-x86_64 +test.test_calendar.CalendarTestCase.test_locale_calendar_formatweekday @ linux-x86_64 +test.test_calendar.CalendarTestCase.test_locale_calendars @ linux-x86_64 +test.test_calendar.CalendarTestCase.test_locale_html_calendar_custom_css_class_month_name @ linux-x86_64 +test.test_calendar.CalendarTestCase.test_locale_html_calendar_custom_css_class_weekday @ linux-x86_64 +test.test_calendar.CalendarTestCase.test_months @ linux-x86_64 +test.test_calendar.CalendarTestCase.test_setfirstweekday @ linux-x86_64 +test.test_calendar.CommandLineTestCase.test_help @ linux-x86_64 +test.test_calendar.CommandLineTestCase.test_html_output_current_year @ linux-x86_64 +test.test_calendar.CommandLineTestCase.test_html_output_year_css @ linux-x86_64 +test.test_calendar.CommandLineTestCase.test_html_output_year_encoding @ linux-x86_64 +test.test_calendar.CommandLineTestCase.test_illegal_arguments @ linux-x86_64 +test.test_calendar.CommandLineTestCase.test_option_encoding @ linux-x86_64 +test.test_calendar.CommandLineTestCase.test_option_lines @ linux-x86_64 +test.test_calendar.CommandLineTestCase.test_option_locale @ linux-x86_64 +test.test_calendar.CommandLineTestCase.test_option_months @ linux-x86_64 +test.test_calendar.CommandLineTestCase.test_option_spacing @ linux-x86_64 +test.test_calendar.CommandLineTestCase.test_option_type @ linux-x86_64 +test.test_calendar.CommandLineTestCase.test_option_width @ linux-x86_64 +test.test_calendar.CommandLineTestCase.test_output_current_year @ linux-x86_64 +test.test_calendar.CommandLineTestCase.test_output_month @ linux-x86_64 +test.test_calendar.CommandLineTestCase.test_output_year @ linux-x86_64 +test.test_calendar.LeapdaysTestCase.test_no_leapdays @ linux-x86_64 +test.test_calendar.LeapdaysTestCase.test_no_leapdays_upper_boundary @ linux-x86_64 +test.test_calendar.LeapdaysTestCase.test_no_range @ linux-x86_64 +test.test_calendar.LeapdaysTestCase.test_one_leapday_lower_boundary @ linux-x86_64 +test.test_calendar.LeapdaysTestCase.test_several_leapyears_in_range @ linux-x86_64 +test.test_calendar.MiscTestCase.test__all__ @ linux-x86_64 +test.test_calendar.MondayTestCase.test_april @ linux-x86_64 +test.test_calendar.MondayTestCase.test_december @ linux-x86_64 +test.test_calendar.MondayTestCase.test_february @ linux-x86_64 +test.test_calendar.MonthRangeTestCase.test_december @ linux-x86_64 +test.test_calendar.MonthRangeTestCase.test_february_leap @ linux-x86_64 +test.test_calendar.MonthRangeTestCase.test_february_nonleap @ linux-x86_64 +test.test_calendar.MonthRangeTestCase.test_illegal_month_reported @ linux-x86_64 +test.test_calendar.MonthRangeTestCase.test_january @ linux-x86_64 +test.test_calendar.MonthRangeTestCase.test_thirteenth_month @ linux-x86_64 +test.test_calendar.MonthRangeTestCase.test_zeroth_month @ linux-x86_64 +test.test_calendar.OutputTestCase.test_format @ linux-x86_64 +test.test_calendar.OutputTestCase.test_formatmonth @ linux-x86_64 +test.test_calendar.OutputTestCase.test_formatmonthname_with_year @ linux-x86_64 +test.test_calendar.OutputTestCase.test_formatmonthname_without_year @ linux-x86_64 +test.test_calendar.OutputTestCase.test_formatweekheader_long @ linux-x86_64 +test.test_calendar.OutputTestCase.test_formatweekheader_short @ linux-x86_64 +test.test_calendar.OutputTestCase.test_output @ linux-x86_64 +test.test_calendar.OutputTestCase.test_output_htmlcalendar_encoding_ascii @ linux-x86_64 +test.test_calendar.OutputTestCase.test_output_htmlcalendar_encoding_utf8 @ linux-x86_64 +test.test_calendar.OutputTestCase.test_output_textcalendar @ linux-x86_64 +test.test_calendar.OutputTestCase.test_prmonth @ linux-x86_64 +test.test_calendar.OutputTestCase.test_prweek @ linux-x86_64 +test.test_calendar.OutputTestCase.test_pryear @ linux-x86_64 +test.test_calendar.OutputTestCase.test_yeardatescalendar @ linux-x86_64 +test.test_calendar.OutputTestCase.test_yeardayscalendar @ linux-x86_64 +test.test_calendar.SundayTestCase.test_april @ linux-x86_64 +test.test_calendar.SundayTestCase.test_december @ linux-x86_64 +test.test_calendar.SundayTestCase.test_february @ linux-x86_64 +test.test_calendar.TestSubClassingCase.test_format_year @ linux-x86_64 +test.test_calendar.TestSubClassingCase.test_format_year_head @ linux-x86_64 +test.test_calendar.TestSubClassingCase.test_formatmonth @ linux-x86_64 +test.test_calendar.TestSubClassingCase.test_formatmonthname @ linux-x86_64 +test.test_calendar.TestSubClassingCase.test_formatweek @ linux-x86_64 +test.test_calendar.TestSubClassingCase.test_formatweek_head @ linux-x86_64 +test.test_calendar.TimegmTestCase.test_timegm @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_call.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_call.txt new file mode 100644 index 0000000000..f0f74964cc --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_call.txt @@ -0,0 +1,66 @@ +test.test_call.FastCallTests.test_fastcall @ linux-x86_64 +test.test_call.FastCallTests.test_fastcall_clearing_dict @ linux-x86_64 +test.test_call.FastCallTests.test_vectorcall @ linux-x86_64 +test.test_call.FastCallTests.test_vectorcall_dict @ linux-x86_64 +test.test_call.FunctionCalls.test_frames_are_popped_after_failed_calls @ linux-x86_64 +test.test_call.FunctionCalls.test_kwargs_order @ linux-x86_64 +test.test_call.TestCallingConventions.test_fastcall @ linux-x86_64 +test.test_call.TestCallingConventions.test_fastcall_ext @ linux-x86_64 +test.test_call.TestCallingConventions.test_fastcall_keywords @ linux-x86_64 +test.test_call.TestCallingConventions.test_fastcall_keywords_ext @ linux-x86_64 +test.test_call.TestCallingConventions.test_noargs @ linux-x86_64 +test.test_call.TestCallingConventions.test_noargs_ext @ linux-x86_64 +test.test_call.TestCallingConventions.test_o @ linux-x86_64 +test.test_call.TestCallingConventions.test_o_ext @ linux-x86_64 +test.test_call.TestCallingConventions.test_varargs @ linux-x86_64 +test.test_call.TestCallingConventions.test_varargs_ext @ linux-x86_64 +test.test_call.TestCallingConventions.test_varargs_keywords @ linux-x86_64 +test.test_call.TestCallingConventions.test_varargs_keywords_ext @ linux-x86_64 +test.test_call.TestCallingConventionsClass.test_fastcall @ linux-x86_64 +test.test_call.TestCallingConventionsClass.test_fastcall_ext @ linux-x86_64 +test.test_call.TestCallingConventionsClass.test_fastcall_keywords @ linux-x86_64 +test.test_call.TestCallingConventionsClass.test_fastcall_keywords_ext @ linux-x86_64 +test.test_call.TestCallingConventionsClass.test_noargs @ linux-x86_64 +test.test_call.TestCallingConventionsClass.test_noargs_ext @ linux-x86_64 +test.test_call.TestCallingConventionsClass.test_o @ linux-x86_64 +test.test_call.TestCallingConventionsClass.test_o_ext @ linux-x86_64 +test.test_call.TestCallingConventionsClass.test_varargs @ linux-x86_64 +test.test_call.TestCallingConventionsClass.test_varargs_ext @ linux-x86_64 +test.test_call.TestCallingConventionsClass.test_varargs_keywords @ linux-x86_64 +test.test_call.TestCallingConventionsClass.test_varargs_keywords_ext @ linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_fastcall @ linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_fastcall_ext @ linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_fastcall_keywords @ linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_fastcall_keywords_ext @ linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_noargs @ linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_noargs_ext @ linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_o @ linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_o_ext @ linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_varargs @ linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_varargs_ext @ linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_varargs_keywords @ linux-x86_64 +test.test_call.TestCallingConventionsClassInstance.test_varargs_keywords_ext @ linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_fastcall @ linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_fastcall_ext @ linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_fastcall_keywords @ linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_fastcall_keywords_ext @ linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_noargs @ linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_noargs_ext @ linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_o @ linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_o_ext @ linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_varargs @ linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_varargs_ext @ linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_varargs_keywords @ linux-x86_64 +test.test_call.TestCallingConventionsInstance.test_varargs_keywords_ext @ linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_fastcall @ linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_fastcall_ext @ linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_fastcall_keywords @ linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_fastcall_keywords_ext @ linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_noargs @ linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_noargs_ext @ linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_o @ linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_o_ext @ linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_varargs @ linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_varargs_ext @ linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_varargs_keywords @ linux-x86_64 +test.test_call.TestCallingConventionsStatic.test_varargs_keywords_ext @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_capi.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_capi.txt new file mode 100644 index 0000000000..cf2abd1c77 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_capi.txt @@ -0,0 +1,150 @@ +test.test_capi.test_codecs.CAPITest.test_decodeutf8 @ linux-x86_64 +test.test_capi.test_codecs.CAPITest.test_decodeutf8stateful @ linux-x86_64 +test.test_capi.test_eval_code_ex.PyEval_EvalCodeExTests.test_simple @ linux-x86_64 +test.test_capi.test_eval_code_ex.PyEval_EvalCodeExTests.test_with_args @ linux-x86_64 +test.test_capi.test_eval_code_ex.PyEval_EvalCodeExTests.test_with_closure @ linux-x86_64 +test.test_capi.test_eval_code_ex.PyEval_EvalCodeExTests.test_with_default @ linux-x86_64 +test.test_capi.test_eval_code_ex.PyEval_EvalCodeExTests.test_with_kwarg_default @ linux-x86_64 +test.test_capi.test_getargs.Boolean_TestCase.test_p @ linux-x86_64 +test.test_capi.test_getargs.Bytes_TestCase.test_c @ linux-x86_64 +test.test_capi.test_getargs.Bytes_TestCase.test_w_star @ linux-x86_64 +test.test_capi.test_getargs.Bytes_TestCase.test_y @ linux-x86_64 +test.test_capi.test_getargs.Bytes_TestCase.test_y_hash @ linux-x86_64 +test.test_capi.test_getargs.Bytes_TestCase.test_y_star @ linux-x86_64 +test.test_capi.test_getargs.Float_TestCase.test_D @ linux-x86_64 +test.test_capi.test_getargs.Float_TestCase.test_d @ linux-x86_64 +test.test_capi.test_getargs.Float_TestCase.test_f @ linux-x86_64 +test.test_capi.test_getargs.Float_TestCase.test_f_rounding @ linux-x86_64 +test.test_capi.test_getargs.KeywordOnly_TestCase.test_invalid_keyword @ linux-x86_64 +test.test_capi.test_getargs.KeywordOnly_TestCase.test_keyword_args @ linux-x86_64 +test.test_capi.test_getargs.KeywordOnly_TestCase.test_mixed_args @ linux-x86_64 +test.test_capi.test_getargs.KeywordOnly_TestCase.test_optional_args @ linux-x86_64 +test.test_capi.test_getargs.KeywordOnly_TestCase.test_positional_args @ linux-x86_64 +test.test_capi.test_getargs.KeywordOnly_TestCase.test_required_args @ linux-x86_64 +test.test_capi.test_getargs.KeywordOnly_TestCase.test_surrogate_keyword @ linux-x86_64 +test.test_capi.test_getargs.KeywordOnly_TestCase.test_too_many_args @ linux-x86_64 +test.test_capi.test_getargs.Keywords_TestCase.test_invalid_keyword @ linux-x86_64 +test.test_capi.test_getargs.Keywords_TestCase.test_keyword_args @ linux-x86_64 +test.test_capi.test_getargs.Keywords_TestCase.test_kwargs @ linux-x86_64 +test.test_capi.test_getargs.Keywords_TestCase.test_mixed_args @ linux-x86_64 +test.test_capi.test_getargs.Keywords_TestCase.test_optional_args @ linux-x86_64 +test.test_capi.test_getargs.Keywords_TestCase.test_positional_args @ linux-x86_64 +test.test_capi.test_getargs.Keywords_TestCase.test_required_args @ linux-x86_64 +test.test_capi.test_getargs.Keywords_TestCase.test_surrogate_keyword @ linux-x86_64 +test.test_capi.test_getargs.Keywords_TestCase.test_too_many_args @ linux-x86_64 +test.test_capi.test_getargs.LongLong_TestCase.test_K @ linux-x86_64 +test.test_capi.test_getargs.LongLong_TestCase.test_L @ linux-x86_64 +test.test_capi.test_getargs.Object_TestCase.test_S @ linux-x86_64 +test.test_capi.test_getargs.Object_TestCase.test_Y @ linux-x86_64 +test.test_capi.test_getargs.ParseTupleAndKeywords_Test.test_bad_use @ linux-x86_64 +test.test_capi.test_getargs.ParseTupleAndKeywords_Test.test_nested_tuple @ linux-x86_64 +test.test_capi.test_getargs.ParseTupleAndKeywords_Test.test_parse_tuple_and_keywords @ linux-x86_64 +test.test_capi.test_getargs.ParseTupleAndKeywords_Test.test_positional_only @ linux-x86_64 +test.test_capi.test_getargs.PositionalOnlyAndKeywords_TestCase.test_empty_keyword @ linux-x86_64 +test.test_capi.test_getargs.PositionalOnlyAndKeywords_TestCase.test_mixed_args @ linux-x86_64 +test.test_capi.test_getargs.PositionalOnlyAndKeywords_TestCase.test_optional_args @ linux-x86_64 +test.test_capi.test_getargs.PositionalOnlyAndKeywords_TestCase.test_positional_args @ linux-x86_64 +test.test_capi.test_getargs.PositionalOnlyAndKeywords_TestCase.test_required_args @ linux-x86_64 +test.test_capi.test_getargs.Signed_TestCase.test_h @ linux-x86_64 +test.test_capi.test_getargs.Signed_TestCase.test_i @ linux-x86_64 +test.test_capi.test_getargs.Signed_TestCase.test_l @ linux-x86_64 +test.test_capi.test_getargs.Signed_TestCase.test_n @ linux-x86_64 +test.test_capi.test_getargs.SkipitemTest.test_skipitem @ linux-x86_64 +test.test_capi.test_getargs.SkipitemTest.test_skipitem_with_suffix @ linux-x86_64 +test.test_capi.test_getargs.String_TestCase.test_C @ linux-x86_64 +test.test_capi.test_getargs.String_TestCase.test_gh_99240_clear_args @ linux-x86_64 +test.test_capi.test_getargs.String_TestCase.test_s @ linux-x86_64 +test.test_capi.test_getargs.String_TestCase.test_s_hash @ linux-x86_64 +test.test_capi.test_getargs.String_TestCase.test_s_hash_int @ linux-x86_64 +test.test_capi.test_getargs.String_TestCase.test_s_star @ linux-x86_64 +test.test_capi.test_getargs.String_TestCase.test_z @ linux-x86_64 +test.test_capi.test_getargs.String_TestCase.test_z_hash @ linux-x86_64 +test.test_capi.test_getargs.String_TestCase.test_z_star @ linux-x86_64 +test.test_capi.test_getargs.Test_testcapi.test_L_code @ linux-x86_64 +test.test_capi.test_getargs.Test_testcapi.test_k_code @ linux-x86_64 +test.test_capi.test_getargs.Test_testcapi.test_s_code @ linux-x86_64 +test.test_capi.test_getargs.Tuple_TestCase.test_args @ linux-x86_64 +test.test_capi.test_getargs.Tuple_TestCase.test_tuple @ linux-x86_64 +test.test_capi.test_getargs.Unsigned_TestCase.test_B @ linux-x86_64 +test.test_capi.test_getargs.Unsigned_TestCase.test_H @ linux-x86_64 +test.test_capi.test_getargs.Unsigned_TestCase.test_I @ linux-x86_64 +test.test_capi.test_getargs.Unsigned_TestCase.test_b @ linux-x86_64 +test.test_capi.test_getargs.Unsigned_TestCase.test_k @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_c_type_with_ipow @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_c_type_with_matrix_multiplication @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_export_symbols @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_getitem_with_error @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_heaptype_with_buffer @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_heaptype_with_dict @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_heaptype_with_negative_dict @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_heaptype_with_setattro @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_instancemethod @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_mapping_has_key @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_mapping_keys_values_items @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_mapping_keys_values_items_bad_arg @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_memoryview_from_NULL_pointer @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_multiple_inheritance_ctypes_with_weakref_or_dict @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_null_type_doc @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_pynumber_tobase @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_pyobject_bytes_from_null @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_pyobject_repr_from_null @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_pyobject_str_from_null @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_return_null_without_error @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_return_result_with_error @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_sequence_del_slice @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_sequence_set_slice @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_subprocess_fork_exec @ linux-x86_64 +test.test_capi.test_misc.CAPITest.test_sys_getobject @ linux-x86_64 +test.test_capi.test_misc.Test_FrameAPI.test_frame_fback_api @ linux-x86_64 +test.test_capi.test_misc.Test_FrameAPI.test_frame_getters @ linux-x86_64 +test.test_capi.test_misc.Test_ModuleStateAccess.test_get_module_bad_def @ linux-x86_64 +test.test_capi.test_misc.Test_ModuleStateAccess.test_get_module_static_in_mro @ linux-x86_64 +test.test_capi.test_misc.Test_ModuleStateAccess.test_subclass_get_module @ linux-x86_64 +test.test_capi.test_misc.Test_ModuleStateAccess.test_subclass_get_module_with_super @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_buildvalue_issue38913 @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_config @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_datetime_capi @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_decref_doesnt_leak @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_dict_iteration @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_empty_argparse @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_from_contiguous @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_gc_control @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_get_statictype_slots @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_get_type_name @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_get_type_qualname @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_incref_decref_API @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_incref_doesnt_leak @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_lazy_hash_inheritance @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_list_api @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_long_and_overflow @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_long_api @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_long_as_double @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_long_as_size_t @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_long_as_unsigned_long_long_mask @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_long_long_and_overflow @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_long_numbits @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_longlong_api @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_mapping_has_key_string @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_py_is_funcs @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_py_is_macros @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_pymem_alloc0 @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_pythread_tss_key_state @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_set_type_size @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_sizeof_c_types @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_string_from_format @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_string_to_double @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_structseq_newtype_doesnt_leak @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_type_from_ephemeral_spec @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_unicode_compare_with_ascii @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_with_docstring @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_xdecref_doesnt_leak @ linux-x86_64 +test.test_capi.test_misc.Test_testcapi.test_xincref_doesnt_leak @ linux-x86_64 +test.test_capi.test_structmembers.ReadWriteTests.test_bad_assignments @ linux-x86_64 +test.test_capi.test_structmembers.ReadWriteTests.test_bool @ linux-x86_64 +test.test_capi.test_structmembers.ReadWriteTests.test_byte @ linux-x86_64 +test.test_capi.test_structmembers.ReadWriteTests.test_inplace_string @ linux-x86_64 +test.test_capi.test_structmembers.ReadWriteTests.test_int @ linux-x86_64 +test.test_capi.test_structmembers.ReadWriteTests.test_long @ linux-x86_64 +test.test_capi.test_structmembers.ReadWriteTests.test_longlong @ linux-x86_64 +test.test_capi.test_structmembers.ReadWriteTests.test_py_ssize_t @ linux-x86_64 +test.test_capi.test_structmembers.ReadWriteTests.test_short @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cgi.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cgi.txt new file mode 100644 index 0000000000..6fa6fd178b --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cgi.txt @@ -0,0 +1,23 @@ +test.test_cgi.CgiTests.testQSAndFormData @ linux-x86_64 +test.test_cgi.CgiTests.testQSAndFormDataFile @ linux-x86_64 +test.test_cgi.CgiTests.testQSAndUrlEncode @ linux-x86_64 +test.test_cgi.CgiTests.test_all @ linux-x86_64 +test.test_cgi.CgiTests.test_field_storage_multipart_no_content_length @ linux-x86_64 +test.test_cgi.CgiTests.test_fieldstorage_as_context_manager @ linux-x86_64 +test.test_cgi.CgiTests.test_fieldstorage_invalid @ linux-x86_64 +test.test_cgi.CgiTests.test_fieldstorage_multipart @ linux-x86_64 +test.test_cgi.CgiTests.test_fieldstorage_multipart_leading_whitespace @ linux-x86_64 +test.test_cgi.CgiTests.test_fieldstorage_multipart_maxline @ linux-x86_64 +test.test_cgi.CgiTests.test_fieldstorage_multipart_non_ascii @ linux-x86_64 +test.test_cgi.CgiTests.test_fieldstorage_multipart_w3c @ linux-x86_64 +test.test_cgi.CgiTests.test_fieldstorage_part_content_length @ linux-x86_64 +test.test_cgi.CgiTests.test_fieldstorage_properties @ linux-x86_64 +test.test_cgi.CgiTests.test_fieldstorage_readline @ linux-x86_64 +test.test_cgi.CgiTests.test_log @ linux-x86_64 +test.test_cgi.CgiTests.test_max_num_fields @ linux-x86_64 +test.test_cgi.CgiTests.test_parse_header @ linux-x86_64 +test.test_cgi.CgiTests.test_parse_multipart @ linux-x86_64 +test.test_cgi.CgiTests.test_parse_multipart_invalid_encoding @ linux-x86_64 +test.test_cgi.CgiTests.test_parse_multipart_without_content_length @ linux-x86_64 +test.test_cgi.CgiTests.test_separator @ linux-x86_64 +test.test_cgi.CgiTests.test_strict @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cgitb.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cgitb.txt new file mode 100644 index 0000000000..f892768c30 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cgitb.txt @@ -0,0 +1,6 @@ +test.test_cgitb.TestCgitb.test_blanks @ linux-x86_64 +test.test_cgitb.TestCgitb.test_fonts @ linux-x86_64 +test.test_cgitb.TestCgitb.test_html @ linux-x86_64 +test.test_cgitb.TestCgitb.test_syshook_no_logdir_default_format @ linux-x86_64 +test.test_cgitb.TestCgitb.test_syshook_no_logdir_text_format @ linux-x86_64 +test.test_cgitb.TestCgitb.test_text @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_charmapcodec.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_charmapcodec.txt new file mode 100644 index 0000000000..e1157a4ea6 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_charmapcodec.txt @@ -0,0 +1,4 @@ +test.test_charmapcodec.CharmapCodecTest.test_constructorx @ linux-x86_64 +test.test_charmapcodec.CharmapCodecTest.test_constructory @ linux-x86_64 +test.test_charmapcodec.CharmapCodecTest.test_encodex @ linux-x86_64 +test.test_charmapcodec.CharmapCodecTest.test_maptoundefined @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_class.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_class.txt new file mode 100644 index 0000000000..2e9f8bfd28 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_class.txt @@ -0,0 +1,15 @@ +test.test_class.ClassTests.testBadTypeReturned @ linux-x86_64 +test.test_class.ClassTests.testBinaryOps @ linux-x86_64 +test.test_class.ClassTests.testClassWithExtCall @ linux-x86_64 +test.test_class.ClassTests.testConstructorErrorMessages @ linux-x86_64 +test.test_class.ClassTests.testForExceptionsRaisedInInstanceGetattr2 @ linux-x86_64 +test.test_class.ClassTests.testGetSetAndDel @ linux-x86_64 +test.test_class.ClassTests.testHashComparisonOfMethods @ linux-x86_64 +test.test_class.ClassTests.testHashStuff @ linux-x86_64 +test.test_class.ClassTests.testInit @ linux-x86_64 +test.test_class.ClassTests.testListAndDictOps @ linux-x86_64 +test.test_class.ClassTests.testMisc @ linux-x86_64 +test.test_class.ClassTests.testSFBug532646 @ linux-x86_64 +test.test_class.ClassTests.testSetattrNonStringName @ linux-x86_64 +test.test_class.ClassTests.testSetattrWrapperNameIntern @ linux-x86_64 +test.test_class.ClassTests.testUnaryOps @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cmath.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cmath.txt new file mode 100644 index 0000000000..4205cc32e6 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cmath.txt @@ -0,0 +1,31 @@ +test.test_cmath.CMathTests.testAtanSign @ linux-x86_64 +test.test_cmath.CMathTests.testAtanhSign @ linux-x86_64 +test.test_cmath.CMathTests.testTanhSign @ linux-x86_64 +test.test_cmath.CMathTests.test_abs @ linux-x86_64 +test.test_cmath.CMathTests.test_abs_overflows @ linux-x86_64 +test.test_cmath.CMathTests.test_cmath_matches_math @ linux-x86_64 +test.test_cmath.CMathTests.test_constants @ linux-x86_64 +test.test_cmath.CMathTests.test_infinity_and_nan_constants @ linux-x86_64 +test.test_cmath.CMathTests.test_input_type @ linux-x86_64 +test.test_cmath.CMathTests.test_isfinite @ linux-x86_64 +test.test_cmath.CMathTests.test_isinf @ linux-x86_64 +test.test_cmath.CMathTests.test_isnan @ linux-x86_64 +test.test_cmath.CMathTests.test_phase @ linux-x86_64 +test.test_cmath.CMathTests.test_polar @ linux-x86_64 +test.test_cmath.CMathTests.test_rect @ linux-x86_64 +test.test_cmath.CMathTests.test_specific_values @ linux-x86_64 +test.test_cmath.CMathTests.test_user_object @ linux-x86_64 +test.test_cmath.IsCloseTests.test_asymmetry @ linux-x86_64 +test.test_cmath.IsCloseTests.test_complex_near_zero @ linux-x86_64 +test.test_cmath.IsCloseTests.test_complex_values @ linux-x86_64 +test.test_cmath.IsCloseTests.test_decimals @ linux-x86_64 +test.test_cmath.IsCloseTests.test_eight_decimal_places @ linux-x86_64 +test.test_cmath.IsCloseTests.test_fractions @ linux-x86_64 +test.test_cmath.IsCloseTests.test_identical @ linux-x86_64 +test.test_cmath.IsCloseTests.test_identical_infinite @ linux-x86_64 +test.test_cmath.IsCloseTests.test_inf_ninf_nan @ linux-x86_64 +test.test_cmath.IsCloseTests.test_integers @ linux-x86_64 +test.test_cmath.IsCloseTests.test_near_zero @ linux-x86_64 +test.test_cmath.IsCloseTests.test_negative_tolerances @ linux-x86_64 +test.test_cmath.IsCloseTests.test_reject_complex_tolerances @ linux-x86_64 +test.test_cmath.IsCloseTests.test_zero_tolerance @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cmd.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cmd.txt new file mode 100644 index 0000000000..ee3bcdeeca --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cmd.txt @@ -0,0 +1,3 @@ +DocTestCase.test.test_cmd.samplecmdclass @ linux-x86_64 +test.test_cmd.TestAlternateInput.test_file_with_missing_final_nl @ linux-x86_64 +test.test_cmd.TestAlternateInput.test_input_reset_at_EOF @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cmd_line.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cmd_line.txt new file mode 100644 index 0000000000..87863ffbb0 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cmd_line.txt @@ -0,0 +1,22 @@ +test.test_cmd_line.CmdLineTest.test_builtin_input @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_closed_stdout @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_coding @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_del___main__ @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_directories @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_empty_PYTHONPATH_issue16309 @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_help_env @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_isolatedmode @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_large_PYTHONPATH @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_non_ascii @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_optimize @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_output_newline @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_run_code @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_run_module @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_run_module_bug1764407 @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_site_flag @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_stdin_readline @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_unbuffered_input @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_unbuffered_output @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_unmached_quote @ linux-x86_64 +test.test_cmd_line.CmdLineTest.test_verbose @ linux-x86_64 +test.test_cmd_line.IgnoreEnvironmentTest.test_ignore_PYTHONPATH @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cmd_line_script.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cmd_line_script.txt new file mode 100644 index 0000000000..e074744d28 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cmd_line_script.txt @@ -0,0 +1,18 @@ +test.test_cmd_line_script.CmdLineTest.test_consistent_sys_path_for_direct_execution @ linux-x86_64 +test.test_cmd_line_script.CmdLineTest.test_consistent_sys_path_for_module_execution @ linux-x86_64 +test.test_cmd_line_script.CmdLineTest.test_dash_m_bad_pyc @ linux-x86_64 +test.test_cmd_line_script.CmdLineTest.test_dash_m_error_code_is_one @ linux-x86_64 +test.test_cmd_line_script.CmdLineTest.test_dash_m_errors @ linux-x86_64 +test.test_cmd_line_script.CmdLineTest.test_dash_m_init_traceback @ linux-x86_64 +test.test_cmd_line_script.CmdLineTest.test_dash_m_main_traceback @ linux-x86_64 +test.test_cmd_line_script.CmdLineTest.test_directory_error @ linux-x86_64 +test.test_cmd_line_script.CmdLineTest.test_hint_when_triying_to_import_a_py_file @ linux-x86_64 +test.test_cmd_line_script.CmdLineTest.test_issue20500_exit_with_exception_value @ linux-x86_64 +test.test_cmd_line_script.CmdLineTest.test_issue20884 @ linux-x86_64 +test.test_cmd_line_script.CmdLineTest.test_issue8202_dash_c_file_ignored @ linux-x86_64 +test.test_cmd_line_script.CmdLineTest.test_nonexisting_script @ linux-x86_64 +test.test_cmd_line_script.CmdLineTest.test_package_error @ linux-x86_64 +test.test_cmd_line_script.CmdLineTest.test_package_recursion @ linux-x86_64 +test.test_cmd_line_script.CmdLineTest.test_pep_409_verbiage @ linux-x86_64 +test.test_cmd_line_script.CmdLineTest.test_script_as_dev_fd @ linux-x86_64 +test.test_cmd_line_script.CmdLineTest.test_zipfile_error @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_code.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_code.txt new file mode 100644 index 0000000000..b5a1216d25 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_code.txt @@ -0,0 +1,4 @@ +test.test_code.CodeTest.test_constructor @ linux-x86_64 +test.test_code.CodeTest.test_qualname @ linux-x86_64 +test.test_code.CodeTest.test_replace @ linux-x86_64 +test.test_code.CodeTest.test_shrinking_localsplus @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_code_module.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_code_module.txt new file mode 100644 index 0000000000..4be9d93892 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_code_module.txt @@ -0,0 +1,7 @@ +test.test_code_module.TestInteractiveConsole.test_banner @ linux-x86_64 +test.test_code_module.TestInteractiveConsole.test_console_stderr @ linux-x86_64 +test.test_code_module.TestInteractiveConsole.test_exit_msg @ linux-x86_64 +test.test_code_module.TestInteractiveConsole.test_ps1 @ linux-x86_64 +test.test_code_module.TestInteractiveConsole.test_ps2 @ linux-x86_64 +test.test_code_module.TestInteractiveConsole.test_syntax_error @ linux-x86_64 +test.test_code_module.TestInteractiveConsole.test_sysexcepthook @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codeccallbacks.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codeccallbacks.txt new file mode 100644 index 0000000000..3eda050da2 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codeccallbacks.txt @@ -0,0 +1,18 @@ +test.test_codeccallbacks.CodecCallbackTest.test_backslashescape @ linux-x86_64 +test.test_codeccallbacks.CodecCallbackTest.test_badandgoodbackslashreplaceexceptions @ linux-x86_64 +test.test_codeccallbacks.CodecCallbackTest.test_badandgoodignoreexceptions @ linux-x86_64 +test.test_codeccallbacks.CodecCallbackTest.test_badandgoodnamereplaceexceptions @ linux-x86_64 +test.test_codeccallbacks.CodecCallbackTest.test_badandgoodreplaceexceptions @ linux-x86_64 +test.test_codeccallbacks.CodecCallbackTest.test_badandgoodstrictexceptions @ linux-x86_64 +test.test_codeccallbacks.CodecCallbackTest.test_badandgoodsurrogateescapeexceptions @ linux-x86_64 +test.test_codeccallbacks.CodecCallbackTest.test_badandgoodsurrogatepassexceptions @ linux-x86_64 +test.test_codeccallbacks.CodecCallbackTest.test_badandgoodxmlcharrefreplaceexceptions @ linux-x86_64 +test.test_codeccallbacks.CodecCallbackTest.test_badlookupcall @ linux-x86_64 +test.test_codeccallbacks.CodecCallbackTest.test_badregistercall @ linux-x86_64 +test.test_codeccallbacks.CodecCallbackTest.test_bug828737 @ linux-x86_64 +test.test_codeccallbacks.CodecCallbackTest.test_charmapencode @ linux-x86_64 +test.test_codeccallbacks.CodecCallbackTest.test_fake_error_class @ linux-x86_64 +test.test_codeccallbacks.CodecCallbackTest.test_lookup @ linux-x86_64 +test.test_codeccallbacks.CodecCallbackTest.test_translatehelper @ linux-x86_64 +test.test_codeccallbacks.CodecCallbackTest.test_unknownhandler @ linux-x86_64 +test.test_codeccallbacks.CodecCallbackTest.test_xmlcharrefreplace @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecencodings_cn.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecencodings_cn.txt new file mode 100644 index 0000000000..27e059842b --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecencodings_cn.txt @@ -0,0 +1,19 @@ +test.test_codecencodings_cn.Test_GB18030.test_chunkcoding @ linux-x86_64 +test.test_codecencodings_cn.Test_GB18030.test_incrementaldecoder @ linux-x86_64 +test.test_codecencodings_cn.Test_GB18030.test_incrementalencoder @ linux-x86_64 +test.test_codecencodings_cn.Test_GB18030.test_streamwriter @ linux-x86_64 +test.test_codecencodings_cn.Test_GB18030.test_streamwriter_reset_no_pending @ linux-x86_64 +test.test_codecencodings_cn.Test_GB2312.test_chunkcoding @ linux-x86_64 +test.test_codecencodings_cn.Test_GB2312.test_errorhandle @ linux-x86_64 +test.test_codecencodings_cn.Test_GB2312.test_incrementaldecoder @ linux-x86_64 +test.test_codecencodings_cn.Test_GB2312.test_incrementalencoder @ linux-x86_64 +test.test_codecencodings_cn.Test_GB2312.test_streamwriter @ linux-x86_64 +test.test_codecencodings_cn.Test_GB2312.test_streamwriter_reset_no_pending @ linux-x86_64 +test.test_codecencodings_cn.Test_GB2312.test_xmlcharrefreplace @ linux-x86_64 +test.test_codecencodings_cn.Test_GBK.test_chunkcoding @ linux-x86_64 +test.test_codecencodings_cn.Test_GBK.test_errorhandle @ linux-x86_64 +test.test_codecencodings_cn.Test_GBK.test_incrementaldecoder @ linux-x86_64 +test.test_codecencodings_cn.Test_GBK.test_incrementalencoder @ linux-x86_64 +test.test_codecencodings_cn.Test_GBK.test_streamwriter @ linux-x86_64 +test.test_codecencodings_cn.Test_GBK.test_streamwriter_reset_no_pending @ linux-x86_64 +test.test_codecencodings_cn.Test_GBK.test_xmlcharrefreplace @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecencodings_hk.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecencodings_hk.txt new file mode 100644 index 0000000000..0aceba9f63 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecencodings_hk.txt @@ -0,0 +1,2 @@ +test.test_codecencodings_hk.Test_Big5HKSCS.test_streamwriter_reset_no_pending @ linux-x86_64 +test.test_codecencodings_hk.Test_Big5HKSCS.test_xmlcharrefreplace @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecencodings_iso2022.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecencodings_iso2022.txt new file mode 100644 index 0000000000..5b8ed6a51c --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecencodings_iso2022.txt @@ -0,0 +1,8 @@ +test.test_codecencodings_iso2022.Test_ISO2022_JP.test_chunkcoding @ linux-x86_64 +test.test_codecencodings_iso2022.Test_ISO2022_JP.test_streamwriter_reset_no_pending @ linux-x86_64 +test.test_codecencodings_iso2022.Test_ISO2022_JP.test_xmlcharrefreplace @ linux-x86_64 +test.test_codecencodings_iso2022.Test_ISO2022_JP2.test_chunkcoding @ linux-x86_64 +test.test_codecencodings_iso2022.Test_ISO2022_JP2.test_streamwriter_reset_no_pending @ linux-x86_64 +test.test_codecencodings_iso2022.Test_ISO2022_JP2.test_xmlcharrefreplace @ linux-x86_64 +test.test_codecencodings_iso2022.Test_ISO2022_KR.test_streamwriter_reset_no_pending @ linux-x86_64 +test.test_codecencodings_iso2022.Test_ISO2022_KR.test_xmlcharrefreplace @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecencodings_jp.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecencodings_jp.txt new file mode 100644 index 0000000000..c84d3693cf --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecencodings_jp.txt @@ -0,0 +1,23 @@ +test.test_codecencodings_jp.Test_CP932.test_chunkcoding @ linux-x86_64 +test.test_codecencodings_jp.Test_CP932.test_errorhandle @ linux-x86_64 +test.test_codecencodings_jp.Test_CP932.test_incrementaldecoder @ linux-x86_64 +test.test_codecencodings_jp.Test_CP932.test_incrementalencoder @ linux-x86_64 +test.test_codecencodings_jp.Test_CP932.test_streamwriter @ linux-x86_64 +test.test_codecencodings_jp.Test_CP932.test_streamwriter_reset_no_pending @ linux-x86_64 +test.test_codecencodings_jp.Test_CP932.test_xmlcharrefreplace @ linux-x86_64 +test.test_codecencodings_jp.Test_EUC_JP_COMPAT.test_chunkcoding @ linux-x86_64 +test.test_codecencodings_jp.Test_EUC_JP_COMPAT.test_incrementaldecoder @ linux-x86_64 +test.test_codecencodings_jp.Test_EUC_JP_COMPAT.test_incrementalencoder @ linux-x86_64 +test.test_codecencodings_jp.Test_EUC_JP_COMPAT.test_streamwriter @ linux-x86_64 +test.test_codecencodings_jp.Test_EUC_JP_COMPAT.test_streamwriter_reset_no_pending @ linux-x86_64 +test.test_codecencodings_jp.Test_EUC_JP_COMPAT.test_xmlcharrefreplace @ linux-x86_64 +test.test_codecencodings_jp.Test_SJISX0213.test_chunkcoding @ linux-x86_64 +test.test_codecencodings_jp.Test_SJISX0213.test_incrementaldecoder @ linux-x86_64 +test.test_codecencodings_jp.Test_SJISX0213.test_streamwriter_reset_no_pending @ linux-x86_64 +test.test_codecencodings_jp.Test_SJISX0213.test_xmlcharrefreplace @ linux-x86_64 +test.test_codecencodings_jp.Test_SJIS_COMPAT.test_chunkcoding @ linux-x86_64 +test.test_codecencodings_jp.Test_SJIS_COMPAT.test_incrementaldecoder @ linux-x86_64 +test.test_codecencodings_jp.Test_SJIS_COMPAT.test_incrementalencoder @ linux-x86_64 +test.test_codecencodings_jp.Test_SJIS_COMPAT.test_streamwriter @ linux-x86_64 +test.test_codecencodings_jp.Test_SJIS_COMPAT.test_streamwriter_reset_no_pending @ linux-x86_64 +test.test_codecencodings_jp.Test_SJIS_COMPAT.test_xmlcharrefreplace @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecencodings_kr.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecencodings_kr.txt new file mode 100644 index 0000000000..382ca971e8 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecencodings_kr.txt @@ -0,0 +1,16 @@ +test.test_codecencodings_kr.Test_CP949.test_chunkcoding @ linux-x86_64 +test.test_codecencodings_kr.Test_CP949.test_errorhandle @ linux-x86_64 +test.test_codecencodings_kr.Test_CP949.test_incrementaldecoder @ linux-x86_64 +test.test_codecencodings_kr.Test_CP949.test_incrementalencoder @ linux-x86_64 +test.test_codecencodings_kr.Test_CP949.test_streamwriter @ linux-x86_64 +test.test_codecencodings_kr.Test_CP949.test_streamwriter_reset_no_pending @ linux-x86_64 +test.test_codecencodings_kr.Test_CP949.test_xmlcharrefreplace @ linux-x86_64 +test.test_codecencodings_kr.Test_EUCKR.test_streamwriter_reset_no_pending @ linux-x86_64 +test.test_codecencodings_kr.Test_EUCKR.test_xmlcharrefreplace @ linux-x86_64 +test.test_codecencodings_kr.Test_JOHAB.test_chunkcoding @ linux-x86_64 +test.test_codecencodings_kr.Test_JOHAB.test_errorhandle @ linux-x86_64 +test.test_codecencodings_kr.Test_JOHAB.test_incrementaldecoder @ linux-x86_64 +test.test_codecencodings_kr.Test_JOHAB.test_incrementalencoder @ linux-x86_64 +test.test_codecencodings_kr.Test_JOHAB.test_streamwriter @ linux-x86_64 +test.test_codecencodings_kr.Test_JOHAB.test_streamwriter_reset_no_pending @ linux-x86_64 +test.test_codecencodings_kr.Test_JOHAB.test_xmlcharrefreplace @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecencodings_tw.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecencodings_tw.txt new file mode 100644 index 0000000000..7a6a5a5e84 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecencodings_tw.txt @@ -0,0 +1,7 @@ +test.test_codecencodings_tw.Test_Big5.test_chunkcoding @ linux-x86_64 +test.test_codecencodings_tw.Test_Big5.test_errorhandle @ linux-x86_64 +test.test_codecencodings_tw.Test_Big5.test_incrementaldecoder @ linux-x86_64 +test.test_codecencodings_tw.Test_Big5.test_incrementalencoder @ linux-x86_64 +test.test_codecencodings_tw.Test_Big5.test_streamwriter @ linux-x86_64 +test.test_codecencodings_tw.Test_Big5.test_streamwriter_reset_no_pending @ linux-x86_64 +test.test_codecencodings_tw.Test_Big5.test_xmlcharrefreplace @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecmaps_cn.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecmaps_cn.txt new file mode 100644 index 0000000000..4f4a7348a3 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecmaps_cn.txt @@ -0,0 +1,7 @@ +test.test_codecmaps_cn.TestGB18030Map.test_errorhandle @ linux-x86_64 +test.test_codecmaps_cn.TestGB18030Map.test_mapping_supplemental @ linux-x86_64 +test.test_codecmaps_cn.TestGB2312Map.test_errorhandle @ linux-x86_64 +test.test_codecmaps_cn.TestGB2312Map.test_mapping_file @ linux-x86_64 +test.test_codecmaps_cn.TestGB2312Map.test_mapping_supplemental @ linux-x86_64 +test.test_codecmaps_cn.TestGBKMap.test_errorhandle @ linux-x86_64 +test.test_codecmaps_cn.TestGBKMap.test_mapping_supplemental @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecmaps_hk.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecmaps_hk.txt new file mode 100644 index 0000000000..cf96d766b8 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecmaps_hk.txt @@ -0,0 +1,3 @@ +test.test_codecmaps_hk.TestBig5HKSCSMap.test_errorhandle @ linux-x86_64 +test.test_codecmaps_hk.TestBig5HKSCSMap.test_mapping_file @ linux-x86_64 +test.test_codecmaps_hk.TestBig5HKSCSMap.test_mapping_supplemental @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecmaps_jp.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecmaps_jp.txt new file mode 100644 index 0000000000..4a82aad223 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecmaps_jp.txt @@ -0,0 +1,9 @@ +test.test_codecmaps_jp.TestCP932Map.test_errorhandle @ linux-x86_64 +test.test_codecmaps_jp.TestEUCJISX0213Map.test_errorhandle @ linux-x86_64 +test.test_codecmaps_jp.TestEUCJISX0213Map.test_mapping_supplemental @ linux-x86_64 +test.test_codecmaps_jp.TestEUCJPCOMPATMap.test_errorhandle @ linux-x86_64 +test.test_codecmaps_jp.TestEUCJPCOMPATMap.test_mapping_supplemental @ linux-x86_64 +test.test_codecmaps_jp.TestSJISCOMPATMap.test_errorhandle @ linux-x86_64 +test.test_codecmaps_jp.TestSJISCOMPATMap.test_mapping_supplemental @ linux-x86_64 +test.test_codecmaps_jp.TestSJISX0213Map.test_errorhandle @ linux-x86_64 +test.test_codecmaps_jp.TestSJISX0213Map.test_mapping_supplemental @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecmaps_kr.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecmaps_kr.txt new file mode 100644 index 0000000000..b8671dd8fd --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecmaps_kr.txt @@ -0,0 +1,9 @@ +test.test_codecmaps_kr.TestCP949Map.test_errorhandle @ linux-x86_64 +test.test_codecmaps_kr.TestCP949Map.test_mapping_file @ linux-x86_64 +test.test_codecmaps_kr.TestCP949Map.test_mapping_supplemental @ linux-x86_64 +test.test_codecmaps_kr.TestEUCKRMap.test_errorhandle @ linux-x86_64 +test.test_codecmaps_kr.TestEUCKRMap.test_mapping_file @ linux-x86_64 +test.test_codecmaps_kr.TestEUCKRMap.test_mapping_supplemental @ linux-x86_64 +test.test_codecmaps_kr.TestJOHABMap.test_errorhandle @ linux-x86_64 +test.test_codecmaps_kr.TestJOHABMap.test_mapping_file @ linux-x86_64 +test.test_codecmaps_kr.TestJOHABMap.test_mapping_supplemental @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecmaps_tw.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecmaps_tw.txt new file mode 100644 index 0000000000..0555dea346 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecmaps_tw.txt @@ -0,0 +1,5 @@ +test.test_codecmaps_tw.TestBIG5Map.test_errorhandle @ linux-x86_64 +test.test_codecmaps_tw.TestBIG5Map.test_mapping_file @ linux-x86_64 +test.test_codecmaps_tw.TestBIG5Map.test_mapping_supplemental @ linux-x86_64 +test.test_codecmaps_tw.TestCP950Map.test_errorhandle @ linux-x86_64 +test.test_codecmaps_tw.TestCP950Map.test_mapping_supplemental @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecs.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecs.txt new file mode 100644 index 0000000000..786d2cffcf --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codecs.txt @@ -0,0 +1,184 @@ +test.test_codecs.ASCIITest.test_decode @ linux-x86_64 +test.test_codecs.ASCIITest.test_decode_error @ linux-x86_64 +test.test_codecs.ASCIITest.test_encode @ linux-x86_64 +test.test_codecs.ASCIITest.test_encode_error @ linux-x86_64 +test.test_codecs.ASCIITest.test_encode_surrogateescape_error @ linux-x86_64 +test.test_codecs.BasicUnicodeTest.test_encoding_map_type_initialized @ linux-x86_64 +test.test_codecs.CharmapTest.test_decode_with_int2int_map @ linux-x86_64 +test.test_codecs.CharmapTest.test_decode_with_int2str_map @ linux-x86_64 +test.test_codecs.CharmapTest.test_decode_with_string_map @ linux-x86_64 +test.test_codecs.CodecNameNormalizationTest.test_codecs_lookup @ linux-x86_64 +test.test_codecs.CodecNameNormalizationTest.test_encodings_normalize_encoding @ linux-x86_64 +test.test_codecs.CodecsModuleTest.test_all @ linux-x86_64 +test.test_codecs.CodecsModuleTest.test_decode @ linux-x86_64 +test.test_codecs.CodecsModuleTest.test_encode @ linux-x86_64 +test.test_codecs.CodecsModuleTest.test_file_closes_if_lookup_error_raised @ linux-x86_64 +test.test_codecs.CodecsModuleTest.test_getdecoder @ linux-x86_64 +test.test_codecs.CodecsModuleTest.test_getencoder @ linux-x86_64 +test.test_codecs.CodecsModuleTest.test_getreader @ linux-x86_64 +test.test_codecs.CodecsModuleTest.test_getwriter @ linux-x86_64 +test.test_codecs.CodecsModuleTest.test_lookup @ linux-x86_64 +test.test_codecs.CodecsModuleTest.test_lookup_issue1813 @ linux-x86_64 +test.test_codecs.CodecsModuleTest.test_open @ linux-x86_64 +test.test_codecs.CodecsModuleTest.test_register @ linux-x86_64 +test.test_codecs.CodecsModuleTest.test_undefined @ linux-x86_64 +test.test_codecs.CodecsModuleTest.test_unregister @ linux-x86_64 +test.test_codecs.EncodedFileTest.test_basic @ linux-x86_64 +test.test_codecs.EscapeDecodeTest.test_empty @ linux-x86_64 +test.test_codecs.EscapeDecodeTest.test_errors @ linux-x86_64 +test.test_codecs.EscapeDecodeTest.test_raw @ linux-x86_64 +test.test_codecs.EscapeEncodeTest.test_escape_encode @ linux-x86_64 +test.test_codecs.ExceptionChainingTest.test_init_override_is_not_wrapped @ linux-x86_64 +test.test_codecs.ExceptionChainingTest.test_instance_attribute_is_not_wrapped @ linux-x86_64 +test.test_codecs.ExceptionChainingTest.test_multiple_args_is_not_wrapped @ linux-x86_64 +test.test_codecs.ExceptionChainingTest.test_new_override_is_not_wrapped @ linux-x86_64 +test.test_codecs.ExceptionChainingTest.test_non_str_arg_is_not_wrapped @ linux-x86_64 +test.test_codecs.ExceptionChainingTest.test_unflagged_non_text_codec_handling @ linux-x86_64 +test.test_codecs.IDNACodecTest.test_builtin_decode @ linux-x86_64 +test.test_codecs.IDNACodecTest.test_builtin_decode_length_limit @ linux-x86_64 +test.test_codecs.IDNACodecTest.test_builtin_encode @ linux-x86_64 +test.test_codecs.IDNACodecTest.test_errors @ linux-x86_64 +test.test_codecs.IDNACodecTest.test_incremental_decode @ linux-x86_64 +test.test_codecs.IDNACodecTest.test_incremental_encode @ linux-x86_64 +test.test_codecs.IDNACodecTest.test_stream @ linux-x86_64 +test.test_codecs.Latin1Test.test_decode @ linux-x86_64 +test.test_codecs.Latin1Test.test_encode @ linux-x86_64 +test.test_codecs.Latin1Test.test_encode_errors @ linux-x86_64 +test.test_codecs.Latin1Test.test_encode_surrogateescape_error @ linux-x86_64 +test.test_codecs.NameprepTest.test_nameprep @ linux-x86_64 +test.test_codecs.PunycodeTest.test_decode @ linux-x86_64 +test.test_codecs.PunycodeTest.test_decode_invalid @ linux-x86_64 +test.test_codecs.PunycodeTest.test_encode @ linux-x86_64 +test.test_codecs.RawUnicodeEscapeTest.test_bug1098990_a @ linux-x86_64 +test.test_codecs.RawUnicodeEscapeTest.test_bug1098990_b @ linux-x86_64 +test.test_codecs.RawUnicodeEscapeTest.test_bug1175396 @ linux-x86_64 +test.test_codecs.RawUnicodeEscapeTest.test_empty @ linux-x86_64 +test.test_codecs.RawUnicodeEscapeTest.test_escape_encode @ linux-x86_64 +test.test_codecs.RawUnicodeEscapeTest.test_mixed_readline_and_read @ linux-x86_64 +test.test_codecs.RawUnicodeEscapeTest.test_raw_encode @ linux-x86_64 +test.test_codecs.RawUnicodeEscapeTest.test_readlinequeue @ linux-x86_64 +test.test_codecs.Rot13Test.test_decode @ linux-x86_64 +test.test_codecs.Rot13Test.test_encode @ linux-x86_64 +test.test_codecs.Rot13Test.test_incremental_decode @ linux-x86_64 +test.test_codecs.Rot13Test.test_incremental_encode @ linux-x86_64 +test.test_codecs.Rot13UtilTest.test_rot13_func @ linux-x86_64 +test.test_codecs.StreamReaderTest.test_copy @ linux-x86_64 +test.test_codecs.StreamReaderTest.test_pickle @ linux-x86_64 +test.test_codecs.StreamReaderTest.test_readlines @ linux-x86_64 +test.test_codecs.StreamReaderWriterTest.test_copy @ linux-x86_64 +test.test_codecs.StreamReaderWriterTest.test_pickle @ linux-x86_64 +test.test_codecs.StreamRecoderTest.test_seeking_read @ linux-x86_64 +test.test_codecs.StreamRecoderTest.test_seeking_write @ linux-x86_64 +test.test_codecs.StreamWriterTest.test_copy @ linux-x86_64 +test.test_codecs.StreamWriterTest.test_pickle @ linux-x86_64 +test.test_codecs.SurrogateEscapeTest.test_ascii @ linux-x86_64 +test.test_codecs.SurrogateEscapeTest.test_charmap @ linux-x86_64 +test.test_codecs.SurrogateEscapeTest.test_latin1 @ linux-x86_64 +test.test_codecs.SurrogateEscapeTest.test_utf8 @ linux-x86_64 +test.test_codecs.TransformCodecTest.test_aliases @ linux-x86_64 +test.test_codecs.TransformCodecTest.test_quopri_stateless @ linux-x86_64 +test.test_codecs.TransformCodecTest.test_uu_invalid @ linux-x86_64 +test.test_codecs.UTF16BETest.test_bug1098990_a @ linux-x86_64 +test.test_codecs.UTF16BETest.test_bug1098990_b @ linux-x86_64 +test.test_codecs.UTF16BETest.test_bug1175396 @ linux-x86_64 +test.test_codecs.UTF16BETest.test_mixed_readline_and_read @ linux-x86_64 +test.test_codecs.UTF16BETest.test_nonbmp @ linux-x86_64 +test.test_codecs.UTF16BETest.test_partial @ linux-x86_64 +test.test_codecs.UTF16BETest.test_readline @ linux-x86_64 +test.test_codecs.UTF16BETest.test_readlinequeue @ linux-x86_64 +test.test_codecs.UTF16ExTest.test_bad_args @ linux-x86_64 +test.test_codecs.UTF16LETest.test_bug1098990_a @ linux-x86_64 +test.test_codecs.UTF16LETest.test_bug1098990_b @ linux-x86_64 +test.test_codecs.UTF16LETest.test_bug1175396 @ linux-x86_64 +test.test_codecs.UTF16LETest.test_mixed_readline_and_read @ linux-x86_64 +test.test_codecs.UTF16LETest.test_nonbmp @ linux-x86_64 +test.test_codecs.UTF16LETest.test_partial @ linux-x86_64 +test.test_codecs.UTF16LETest.test_readline @ linux-x86_64 +test.test_codecs.UTF16LETest.test_readlinequeue @ linux-x86_64 +test.test_codecs.UTF16Test.test_bug1098990_a @ linux-x86_64 +test.test_codecs.UTF16Test.test_bug1098990_b @ linux-x86_64 +test.test_codecs.UTF16Test.test_bug1175396 @ linux-x86_64 +test.test_codecs.UTF16Test.test_bug691291 @ linux-x86_64 +test.test_codecs.UTF16Test.test_errors @ linux-x86_64 +test.test_codecs.UTF16Test.test_handlers @ linux-x86_64 +test.test_codecs.UTF16Test.test_mixed_readline_and_read @ linux-x86_64 +test.test_codecs.UTF16Test.test_partial @ linux-x86_64 +test.test_codecs.UTF16Test.test_readline @ linux-x86_64 +test.test_codecs.UTF16Test.test_readlinequeue @ linux-x86_64 +test.test_codecs.UTF32BETest.test_bug1098990_a @ linux-x86_64 +test.test_codecs.UTF32BETest.test_bug1098990_b @ linux-x86_64 +test.test_codecs.UTF32BETest.test_bug1175396 @ linux-x86_64 +test.test_codecs.UTF32BETest.test_errors @ linux-x86_64 +test.test_codecs.UTF32BETest.test_issue8941 @ linux-x86_64 +test.test_codecs.UTF32BETest.test_mixed_readline_and_read @ linux-x86_64 +test.test_codecs.UTF32BETest.test_partial @ linux-x86_64 +test.test_codecs.UTF32BETest.test_readline @ linux-x86_64 +test.test_codecs.UTF32BETest.test_readlinequeue @ linux-x86_64 +test.test_codecs.UTF32BETest.test_simple @ linux-x86_64 +test.test_codecs.UTF32LETest.test_bug1098990_a @ linux-x86_64 +test.test_codecs.UTF32LETest.test_bug1098990_b @ linux-x86_64 +test.test_codecs.UTF32LETest.test_bug1175396 @ linux-x86_64 +test.test_codecs.UTF32LETest.test_errors @ linux-x86_64 +test.test_codecs.UTF32LETest.test_issue8941 @ linux-x86_64 +test.test_codecs.UTF32LETest.test_mixed_readline_and_read @ linux-x86_64 +test.test_codecs.UTF32LETest.test_partial @ linux-x86_64 +test.test_codecs.UTF32LETest.test_readline @ linux-x86_64 +test.test_codecs.UTF32LETest.test_readlinequeue @ linux-x86_64 +test.test_codecs.UTF32LETest.test_simple @ linux-x86_64 +test.test_codecs.UTF32Test.test_badbom @ linux-x86_64 +test.test_codecs.UTF32Test.test_bug1098990_a @ linux-x86_64 +test.test_codecs.UTF32Test.test_bug1098990_b @ linux-x86_64 +test.test_codecs.UTF32Test.test_bug1175396 @ linux-x86_64 +test.test_codecs.UTF32Test.test_errors @ linux-x86_64 +test.test_codecs.UTF32Test.test_handlers @ linux-x86_64 +test.test_codecs.UTF32Test.test_issue8941 @ linux-x86_64 +test.test_codecs.UTF32Test.test_mixed_readline_and_read @ linux-x86_64 +test.test_codecs.UTF32Test.test_partial @ linux-x86_64 +test.test_codecs.UTF32Test.test_readline @ linux-x86_64 +test.test_codecs.UTF32Test.test_readlinequeue @ linux-x86_64 +test.test_codecs.UTF7Test.test_ascii @ linux-x86_64 +test.test_codecs.UTF7Test.test_bug1098990_a @ linux-x86_64 +test.test_codecs.UTF7Test.test_bug1098990_b @ linux-x86_64 +test.test_codecs.UTF7Test.test_bug1175396 @ linux-x86_64 +test.test_codecs.UTF7Test.test_mixed_readline_and_read @ linux-x86_64 +test.test_codecs.UTF7Test.test_readlinequeue @ linux-x86_64 +test.test_codecs.UTF8SigTest.test_bom @ linux-x86_64 +test.test_codecs.UTF8SigTest.test_bug1098990_a @ linux-x86_64 +test.test_codecs.UTF8SigTest.test_bug1098990_b @ linux-x86_64 +test.test_codecs.UTF8SigTest.test_bug1175396 @ linux-x86_64 +test.test_codecs.UTF8SigTest.test_bug1601501 @ linux-x86_64 +test.test_codecs.UTF8SigTest.test_decode_error @ linux-x86_64 +test.test_codecs.UTF8SigTest.test_decoder_state @ linux-x86_64 +test.test_codecs.UTF8SigTest.test_incremental_errors @ linux-x86_64 +test.test_codecs.UTF8SigTest.test_incremental_surrogatepass @ linux-x86_64 +test.test_codecs.UTF8SigTest.test_mixed_readline_and_read @ linux-x86_64 +test.test_codecs.UTF8SigTest.test_partial @ linux-x86_64 +test.test_codecs.UTF8SigTest.test_readline @ linux-x86_64 +test.test_codecs.UTF8SigTest.test_readlinequeue @ linux-x86_64 +test.test_codecs.UTF8SigTest.test_stream_bare @ linux-x86_64 +test.test_codecs.UTF8SigTest.test_stream_bom @ linux-x86_64 +test.test_codecs.UTF8Test.test_bug1098990_a @ linux-x86_64 +test.test_codecs.UTF8Test.test_bug1098990_b @ linux-x86_64 +test.test_codecs.UTF8Test.test_bug1175396 @ linux-x86_64 +test.test_codecs.UTF8Test.test_decode_error @ linux-x86_64 +test.test_codecs.UTF8Test.test_decoder_state @ linux-x86_64 +test.test_codecs.UTF8Test.test_incremental_errors @ linux-x86_64 +test.test_codecs.UTF8Test.test_incremental_surrogatepass @ linux-x86_64 +test.test_codecs.UTF8Test.test_mixed_readline_and_read @ linux-x86_64 +test.test_codecs.UTF8Test.test_partial @ linux-x86_64 +test.test_codecs.UTF8Test.test_readline @ linux-x86_64 +test.test_codecs.UTF8Test.test_readlinequeue @ linux-x86_64 +test.test_codecs.UnicodeEscapeTest.test_bug1098990_a @ linux-x86_64 +test.test_codecs.UnicodeEscapeTest.test_bug1098990_b @ linux-x86_64 +test.test_codecs.UnicodeEscapeTest.test_bug1175396 @ linux-x86_64 +test.test_codecs.UnicodeEscapeTest.test_empty @ linux-x86_64 +test.test_codecs.UnicodeEscapeTest.test_escape_encode @ linux-x86_64 +test.test_codecs.UnicodeEscapeTest.test_incremental_surrogatepass @ linux-x86_64 +test.test_codecs.UnicodeEscapeTest.test_mixed_readline_and_read @ linux-x86_64 +test.test_codecs.UnicodeEscapeTest.test_partial @ linux-x86_64 +test.test_codecs.UnicodeEscapeTest.test_raw_decode @ linux-x86_64 +test.test_codecs.UnicodeEscapeTest.test_raw_encode @ linux-x86_64 +test.test_codecs.UnicodeEscapeTest.test_readline @ linux-x86_64 +test.test_codecs.UnicodeEscapeTest.test_readlinequeue @ linux-x86_64 +test.test_codecs.WithStmtTest.test_encodedfile @ linux-x86_64 +test.test_codecs.WithStmtTest.test_streamreaderwriter @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codeop.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codeop.txt new file mode 100644 index 0000000000..bdcc9a323a --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_codeop.txt @@ -0,0 +1,6 @@ +test.test_codeop.CodeopTests.test_filename @ linux-x86_64 +test.test_codeop.CodeopTests.test_invalid @ linux-x86_64 +test.test_codeop.CodeopTests.test_invalid_exec @ linux-x86_64 +test.test_codeop.CodeopTests.test_syntax_errors @ linux-x86_64 +test.test_codeop.CodeopTests.test_valid @ linux-x86_64 +test.test_codeop.CodeopTests.test_warning @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_collections.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_collections.txt new file mode 100644 index 0000000000..2ab93367cf --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_collections.txt @@ -0,0 +1,101 @@ +DocTestCase.collections.Counter @ linux-x86_64 +DocTestCase.collections.Counter.__add__ @ linux-x86_64 +DocTestCase.collections.Counter.__and__ @ linux-x86_64 +DocTestCase.collections.Counter.__iadd__ @ linux-x86_64 +DocTestCase.collections.Counter.__iand__ @ linux-x86_64 +DocTestCase.collections.Counter.__init__ @ linux-x86_64 +DocTestCase.collections.Counter.__ior__ @ linux-x86_64 +DocTestCase.collections.Counter.__isub__ @ linux-x86_64 +DocTestCase.collections.Counter.__or__ @ linux-x86_64 +DocTestCase.collections.Counter.__sub__ @ linux-x86_64 +DocTestCase.collections.Counter.elements @ linux-x86_64 +DocTestCase.collections.Counter.most_common @ linux-x86_64 +DocTestCase.collections.Counter.subtract @ linux-x86_64 +DocTestCase.collections.Counter.update @ linux-x86_64 +DocTestCase.collections.namedtuple @ linux-x86_64 +test.test_collections.TestChainMap.test_basics @ linux-x86_64 +test.test_collections.TestChainMap.test_bool @ linux-x86_64 +test.test_collections.TestChainMap.test_constructor @ linux-x86_64 +test.test_collections.TestChainMap.test_dict_coercion @ linux-x86_64 +test.test_collections.TestChainMap.test_iter_not_calling_getitem_on_maps @ linux-x86_64 +test.test_collections.TestChainMap.test_missing @ linux-x86_64 +test.test_collections.TestChainMap.test_new_child @ linux-x86_64 +test.test_collections.TestChainMap.test_order_preservation @ linux-x86_64 +test.test_collections.TestChainMap.test_ordering @ linux-x86_64 +test.test_collections.TestChainMap.test_union_operators @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_ByteString @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_Mapping @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_MutableMapping @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_MutableMapping_subclass @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_MutableSequence @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_MutableSequence_mixins @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_MutableSet @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_Sequence @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_Sequence_mixins @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_Set @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_Set_from_iterable @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_Set_interoperability_with_real_sets @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_arithmetic_Set @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_equality_Set @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_hash_Set @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_illegal_patma_flags @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_isdisjoint_Set @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_issue16373 @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_issue26915 @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_issue8750 @ linux-x86_64 +test.test_collections.TestCollectionABCs.test_issue_5647 @ linux-x86_64 +test.test_collections.TestCounter.test_basics @ linux-x86_64 +test.test_collections.TestCounter.test_conversions @ linux-x86_64 +test.test_collections.TestCounter.test_copy_subclass @ linux-x86_64 +test.test_collections.TestCounter.test_copying @ linux-x86_64 +test.test_collections.TestCounter.test_eq @ linux-x86_64 +test.test_collections.TestCounter.test_ge @ linux-x86_64 +test.test_collections.TestCounter.test_gt @ linux-x86_64 +test.test_collections.TestCounter.test_helper_function @ linux-x86_64 +test.test_collections.TestCounter.test_init @ linux-x86_64 +test.test_collections.TestCounter.test_inplace_operations @ linux-x86_64 +test.test_collections.TestCounter.test_invariant_for_the_in_operator @ linux-x86_64 +test.test_collections.TestCounter.test_le @ linux-x86_64 +test.test_collections.TestCounter.test_lt @ linux-x86_64 +test.test_collections.TestCounter.test_multiset_operations @ linux-x86_64 +test.test_collections.TestCounter.test_multiset_operations_equivalent_to_set_operations @ linux-x86_64 +test.test_collections.TestCounter.test_order_preservation @ linux-x86_64 +test.test_collections.TestCounter.test_repr_nonsortable @ linux-x86_64 +test.test_collections.TestCounter.test_subtract @ linux-x86_64 +test.test_collections.TestCounter.test_total @ linux-x86_64 +test.test_collections.TestCounter.test_unary @ linux-x86_64 +test.test_collections.TestCounter.test_update @ linux-x86_64 +test.test_collections.TestNamedTuple.test_copy @ linux-x86_64 +test.test_collections.TestNamedTuple.test_defaults @ linux-x86_64 +test.test_collections.TestNamedTuple.test_factory @ linux-x86_64 +test.test_collections.TestNamedTuple.test_factory_doc_attr @ linux-x86_64 +test.test_collections.TestNamedTuple.test_field_doc @ linux-x86_64 +test.test_collections.TestNamedTuple.test_instance @ linux-x86_64 +test.test_collections.TestNamedTuple.test_keyword_only_arguments @ linux-x86_64 +test.test_collections.TestNamedTuple.test_match_args @ linux-x86_64 +test.test_collections.TestNamedTuple.test_module_parameter @ linux-x86_64 +test.test_collections.TestNamedTuple.test_name_conflicts @ linux-x86_64 +test.test_collections.TestNamedTuple.test_name_fixer @ linux-x86_64 +test.test_collections.TestNamedTuple.test_namedtuple_subclass_issue_24931 @ linux-x86_64 +test.test_collections.TestNamedTuple.test_non_generic_subscript @ linux-x86_64 +test.test_collections.TestNamedTuple.test_odd_sizes @ linux-x86_64 +test.test_collections.TestNamedTuple.test_pickle @ linux-x86_64 +test.test_collections.TestNamedTuple.test_readonly @ linux-x86_64 +test.test_collections.TestNamedTuple.test_repr @ linux-x86_64 +test.test_collections.TestNamedTuple.test_tupleness @ linux-x86_64 +test.test_collections.TestOneTrickPonyABCs.test_Callable @ linux-x86_64 +test.test_collections.TestOneTrickPonyABCs.test_Collection @ linux-x86_64 +test.test_collections.TestOneTrickPonyABCs.test_Container @ linux-x86_64 +test.test_collections.TestOneTrickPonyABCs.test_Generator @ linux-x86_64 +test.test_collections.TestOneTrickPonyABCs.test_Hashable @ linux-x86_64 +test.test_collections.TestOneTrickPonyABCs.test_Iterable @ linux-x86_64 +test.test_collections.TestOneTrickPonyABCs.test_Iterator @ linux-x86_64 +test.test_collections.TestOneTrickPonyABCs.test_Reversible @ linux-x86_64 +test.test_collections.TestOneTrickPonyABCs.test_Sized @ linux-x86_64 +test.test_collections.TestOneTrickPonyABCs.test_direct_subclassing @ linux-x86_64 +test.test_collections.TestOneTrickPonyABCs.test_registration @ linux-x86_64 +test.test_collections.TestUserObjects.test_dict_copy @ linux-x86_64 +test.test_collections.TestUserObjects.test_dict_protocol @ linux-x86_64 +test.test_collections.TestUserObjects.test_list_copy @ linux-x86_64 +test.test_collections.TestUserObjects.test_list_protocol @ linux-x86_64 +test.test_collections.TestUserObjects.test_str_protocol @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_colorsys.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_colorsys.txt new file mode 100644 index 0000000000..c49849b173 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_colorsys.txt @@ -0,0 +1,7 @@ +test.test_colorsys.ColorsysTest.test_hls_nearwhite @ linux-x86_64 +test.test_colorsys.ColorsysTest.test_hls_roundtrip @ linux-x86_64 +test.test_colorsys.ColorsysTest.test_hls_values @ linux-x86_64 +test.test_colorsys.ColorsysTest.test_hsv_roundtrip @ linux-x86_64 +test.test_colorsys.ColorsysTest.test_hsv_values @ linux-x86_64 +test.test_colorsys.ColorsysTest.test_yiq_roundtrip @ linux-x86_64 +test.test_colorsys.ColorsysTest.test_yiq_values @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_compare.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_compare.txt new file mode 100644 index 0000000000..c58480cadc --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_compare.txt @@ -0,0 +1,16 @@ +test.test_compare.ComparisonFullTest.test_bytes @ linux-x86_64 +test.test_compare.ComparisonFullTest.test_comp_classes_different @ linux-x86_64 +test.test_compare.ComparisonFullTest.test_comp_classes_same @ linux-x86_64 +test.test_compare.ComparisonFullTest.test_mappings @ linux-x86_64 +test.test_compare.ComparisonFullTest.test_numbers @ linux-x86_64 +test.test_compare.ComparisonFullTest.test_objects @ linux-x86_64 +test.test_compare.ComparisonFullTest.test_sequences @ linux-x86_64 +test.test_compare.ComparisonFullTest.test_sets @ linux-x86_64 +test.test_compare.ComparisonFullTest.test_str_subclass @ linux-x86_64 +test.test_compare.ComparisonSimpleTest.test_comparisons @ linux-x86_64 +test.test_compare.ComparisonSimpleTest.test_id_comparisons @ linux-x86_64 +test.test_compare.ComparisonSimpleTest.test_issue_1393 @ linux-x86_64 +test.test_compare.ComparisonSimpleTest.test_ne_defaults_to_not_eq @ linux-x86_64 +test.test_compare.ComparisonSimpleTest.test_ne_high_priority @ linux-x86_64 +test.test_compare.ComparisonSimpleTest.test_ne_low_priority @ linux-x86_64 +test.test_compare.ComparisonSimpleTest.test_other_delegation @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_compile.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_compile.txt new file mode 100644 index 0000000000..b4ce94500b --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_compile.txt @@ -0,0 +1,53 @@ +test.test_compile.TestExpressionStackSize.test_and @ linux-x86_64 +test.test_compile.TestExpressionStackSize.test_and_or @ linux-x86_64 +test.test_compile.TestExpressionStackSize.test_binop @ linux-x86_64 +test.test_compile.TestExpressionStackSize.test_chained_comparison @ linux-x86_64 +test.test_compile.TestExpressionStackSize.test_func_and @ linux-x86_64 +test.test_compile.TestExpressionStackSize.test_or @ linux-x86_64 +test.test_compile.TestExpressionStackSize.test_stack_3050 @ linux-x86_64 +test.test_compile.TestExpressionStackSize.test_stack_3050_2 @ linux-x86_64 +test.test_compile.TestSourcePositions.test_multiline_assert_rewritten_as_method_call @ linux-x86_64 +test.test_compile.TestSourcePositions.test_simple_assignment @ linux-x86_64 +test.test_compile.TestSourcePositions.test_weird_attribute_position_regressions @ linux-x86_64 +test.test_compile.TestSpecifics.test_annotation_limit @ linux-x86_64 +test.test_compile.TestSpecifics.test_apply_static_swaps @ linux-x86_64 +test.test_compile.TestSpecifics.test_apply_static_swaps_2 @ linux-x86_64 +test.test_compile.TestSpecifics.test_apply_static_swaps_3 @ linux-x86_64 +test.test_compile.TestSpecifics.test_argument_handling @ linux-x86_64 +test.test_compile.TestSpecifics.test_argument_order @ linux-x86_64 +test.test_compile.TestSpecifics.test_bad_single_statement @ linux-x86_64 +test.test_compile.TestSpecifics.test_big_dict_literal @ linux-x86_64 +test.test_compile.TestSpecifics.test_compile_filename @ linux-x86_64 +test.test_compile.TestSpecifics.test_dict_evaluation_order @ linux-x86_64 +test.test_compile.TestSpecifics.test_duplicate_global_local @ linux-x86_64 +test.test_compile.TestSpecifics.test_empty @ linux-x86_64 +test.test_compile.TestSpecifics.test_encoding @ linux-x86_64 +test.test_compile.TestSpecifics.test_exec_with_general_mapping_for_locals @ linux-x86_64 +test.test_compile.TestSpecifics.test_extended_arg @ linux-x86_64 +test.test_compile.TestSpecifics.test_float_literals @ linux-x86_64 +test.test_compile.TestSpecifics.test_for_distinct_code_objects @ linux-x86_64 +test.test_compile.TestSpecifics.test_import @ linux-x86_64 +test.test_compile.TestSpecifics.test_indentation @ linux-x86_64 +test.test_compile.TestSpecifics.test_lambda_doc @ linux-x86_64 +test.test_compile.TestSpecifics.test_literals_with_leading_zeroes @ linux-x86_64 +test.test_compile.TestSpecifics.test_mangling @ linux-x86_64 +test.test_compile.TestSpecifics.test_no_ending_newline @ linux-x86_64 +test.test_compile.TestSpecifics.test_none_assignment @ linux-x86_64 +test.test_compile.TestSpecifics.test_none_keyword_arg @ linux-x86_64 +test.test_compile.TestSpecifics.test_null_terminated @ linux-x86_64 +test.test_compile.TestSpecifics.test_other_newlines @ linux-x86_64 +test.test_compile.TestSpecifics.test_path_like_objects @ linux-x86_64 +test.test_compile.TestSpecifics.test_sequence_unpacking_error @ linux-x86_64 +test.test_compile.TestSpecifics.test_single_statement @ linux-x86_64 +test.test_compile.TestSpecifics.test_stack_overflow @ linux-x86_64 +test.test_compile.TestSpecifics.test_subscripts @ linux-x86_64 +test.test_compile.TestSpecifics.test_syntax_error @ linux-x86_64 +test.test_compile.TestSpecifics.test_unary_minus @ linux-x86_64 +test.test_compile.TestStackSizeStability.test_async_for @ linux-x86_64 +test.test_compile.TestStackSizeStability.test_async_for_else @ linux-x86_64 +test.test_compile.TestStackSizeStability.test_if @ linux-x86_64 +test.test_compile.TestStackSizeStability.test_if_else @ linux-x86_64 +test.test_compile.TestStackSizeStability.test_try_except_star_as @ linux-x86_64 +test.test_compile.TestStackSizeStability.test_try_except_star_finally @ linux-x86_64 +test.test_compile.TestStackSizeStability.test_try_except_star_qualified @ linux-x86_64 +test.test_compile.TestStackSizeStability.test_while_else @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_compileall.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_compileall.txt new file mode 100644 index 0000000000..f847d5d87c --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_compileall.txt @@ -0,0 +1,121 @@ +test.test_compileall.CommandLineTestsNoSourceEpoch.test_compiles_as_much_as_possible @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_d_compile_error @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_d_runtime_error @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_force @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_hardlink @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_hardlink_bad_args @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_ignore_symlink_destination @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_include_bad_file @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_include_file_no_arg @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_include_file_with_arg @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_include_on_stdin @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_invalid_arg_produces_message @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_legacy_paths @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_multiple_dirs @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_multiple_optimization_levels @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_multiple_runs @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_no_args_compiles_path @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_no_args_respects_force_flag @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_no_args_respects_quiet_flag @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_pep3147_paths_normal @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_pyc_invalidation_mode @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_quiet @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_recursion_control @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_recursion_limit @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_regexp @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_silent @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_symlink_loop @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_workers @ linux-x86_64 +test.test_compileall.CommandLineTestsNoSourceEpoch.test_workers_available_cores @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_compiles_as_much_as_possible @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_d_compile_error @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_d_runtime_error @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_force @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_hardlink @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_hardlink_bad_args @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_ignore_symlink_destination @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_include_bad_file @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_include_file_no_arg @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_include_file_with_arg @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_include_on_stdin @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_invalid_arg_produces_message @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_legacy_paths @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_multiple_dirs @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_multiple_optimization_levels @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_multiple_runs @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_no_args_compiles_path @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_no_args_respects_force_flag @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_no_args_respects_quiet_flag @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_pep3147_paths_normal @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_pyc_invalidation_mode @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_quiet @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_recursion_control @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_recursion_limit @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_regexp @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_silent @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_symlink_loop @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_workers @ linux-x86_64 +test.test_compileall.CommandLineTestsWithSourceEpoch.test_workers_available_cores @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_dir_maxlevels @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_dir_pathlike @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_dir_pathlike_prependdir @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_dir_pathlike_stripdir @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_file_encoding_fallback @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_file_pathlike @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_file_pathlike_ddir @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_file_pathlike_prependdir @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_file_pathlike_stripdir @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_files @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_missing_multiprocessing @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_one_worker @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_path @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_pool_called @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_workers_cpu_count @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_compile_workers_non_positive @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_ignore_symlink_destination @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_larger_than_32_bit_times @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_multiple_optimization_levels @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_no_pycache_in_non_package @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_optimize @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_prepend_only @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_strip_prepend_and_ddir @ linux-x86_64 +test.test_compileall.CompileallTestsWithSourceEpoch.test_year_2038_mtime_compilation @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_dir_maxlevels @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_dir_pathlike @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_dir_pathlike_prependdir @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_dir_pathlike_stripdir @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_file_encoding_fallback @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_file_pathlike @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_file_pathlike_ddir @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_file_pathlike_prependdir @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_file_pathlike_stripdir @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_files @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_missing_multiprocessing @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_one_worker @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_path @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_pool_called @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_workers_cpu_count @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_compile_workers_non_positive @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_ignore_symlink_destination @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_larger_than_32_bit_times @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_magic_number @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_mtime @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_multiple_optimization_levels @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_no_pycache_in_non_package @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_optimize @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_prepend_only @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_strip_prepend_and_ddir @ linux-x86_64 +test.test_compileall.CompileallTestsWithoutSourceEpoch.test_year_2038_mtime_compilation @ linux-x86_64 +test.test_compileall.EncodingTest.test_error @ linux-x86_64 +test.test_compileall.HardlinkDedupTestsNoSourceEpoch.test_bad_args @ linux-x86_64 +test.test_compileall.HardlinkDedupTestsNoSourceEpoch.test_disabled @ linux-x86_64 +test.test_compileall.HardlinkDedupTestsNoSourceEpoch.test_duplicated_levels @ linux-x86_64 +test.test_compileall.HardlinkDedupTestsNoSourceEpoch.test_hardlink @ linux-x86_64 +test.test_compileall.HardlinkDedupTestsNoSourceEpoch.test_only_two_levels @ linux-x86_64 +test.test_compileall.HardlinkDedupTestsNoSourceEpoch.test_recompilation @ linux-x86_64 +test.test_compileall.HardlinkDedupTestsWithSourceEpoch.test_bad_args @ linux-x86_64 +test.test_compileall.HardlinkDedupTestsWithSourceEpoch.test_disabled @ linux-x86_64 +test.test_compileall.HardlinkDedupTestsWithSourceEpoch.test_duplicated_levels @ linux-x86_64 +test.test_compileall.HardlinkDedupTestsWithSourceEpoch.test_hardlink @ linux-x86_64 +test.test_compileall.HardlinkDedupTestsWithSourceEpoch.test_only_two_levels @ linux-x86_64 +test.test_compileall.HardlinkDedupTestsWithSourceEpoch.test_recompilation @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_complex.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_complex.txt new file mode 100644 index 0000000000..dd274d7f37 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_complex.txt @@ -0,0 +1,29 @@ +test.test_complex.ComplexTest.test___complex__ @ linux-x86_64 +test.test_complex.ComplexTest.test_abs @ linux-x86_64 +test.test_complex.ComplexTest.test_boolcontext @ linux-x86_64 +test.test_complex.ComplexTest.test_conjugate @ linux-x86_64 +test.test_complex.ComplexTest.test_constructor @ linux-x86_64 +test.test_complex.ComplexTest.test_constructor_special_numbers @ linux-x86_64 +test.test_complex.ComplexTest.test_divmod @ linux-x86_64 +test.test_complex.ComplexTest.test_divmod_zero_division @ linux-x86_64 +test.test_complex.ComplexTest.test_floordiv @ linux-x86_64 +test.test_complex.ComplexTest.test_floordiv_zero_division @ linux-x86_64 +test.test_complex.ComplexTest.test_format @ linux-x86_64 +test.test_complex.ComplexTest.test_getnewargs @ linux-x86_64 +test.test_complex.ComplexTest.test_hash @ linux-x86_64 +test.test_complex.ComplexTest.test_mod @ linux-x86_64 +test.test_complex.ComplexTest.test_mod_zero_division @ linux-x86_64 +test.test_complex.ComplexTest.test_neg @ linux-x86_64 +test.test_complex.ComplexTest.test_negated_imaginary_literal @ linux-x86_64 +test.test_complex.ComplexTest.test_negative_zero_repr_str @ linux-x86_64 +test.test_complex.ComplexTest.test_overflow @ linux-x86_64 +test.test_complex.ComplexTest.test_plus_minus_0j @ linux-x86_64 +test.test_complex.ComplexTest.test_pow @ linux-x86_64 +test.test_complex.ComplexTest.test_pow_with_small_integer_exponents @ linux-x86_64 +test.test_complex.ComplexTest.test_repr_roundtrip @ linux-x86_64 +test.test_complex.ComplexTest.test_repr_str @ linux-x86_64 +test.test_complex.ComplexTest.test_richcompare @ linux-x86_64 +test.test_complex.ComplexTest.test_richcompare_boundaries @ linux-x86_64 +test.test_complex.ComplexTest.test_truediv @ linux-x86_64 +test.test_complex.ComplexTest.test_truediv_zero_division @ linux-x86_64 +test.test_complex.ComplexTest.test_underscores @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_concurrent_futures.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_concurrent_futures.txt new file mode 100644 index 0000000000..fb441d2e0f --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_concurrent_futures.txt @@ -0,0 +1,112 @@ +test.test_concurrent_futures.test_as_completed.ProcessPoolForkAsCompletedTest.test_correct_timeout_exception_msg @ linux-x86_64 +test.test_concurrent_futures.test_as_completed.ProcessPoolSpawnAsCompletedTest.test_correct_timeout_exception_msg @ linux-x86_64 +test.test_concurrent_futures.test_as_completed.ProcessPoolSpawnAsCompletedTest.test_duplicate_futures @ linux-x86_64 +test.test_concurrent_futures.test_as_completed.ProcessPoolSpawnAsCompletedTest.test_no_timeout @ linux-x86_64 +test.test_concurrent_futures.test_as_completed.ProcessPoolSpawnAsCompletedTest.test_zero_timeout @ linux-x86_64 +test.test_concurrent_futures.test_as_completed.ThreadPoolAsCompletedTest.test_correct_timeout_exception_msg @ linux-x86_64 +test.test_concurrent_futures.test_as_completed.ThreadPoolAsCompletedTest.test_duplicate_futures @ linux-x86_64 +test.test_concurrent_futures.test_as_completed.ThreadPoolAsCompletedTest.test_no_timeout @ linux-x86_64 +test.test_concurrent_futures.test_as_completed.ThreadPoolAsCompletedTest.test_zero_timeout @ linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_crash_at_task_unpickle @ linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_error_at_task_pickle @ linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_error_at_task_unpickle @ linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_error_during_func_exec_on_worker @ linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_error_during_result_pickle_on_worker @ linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_error_during_result_unpickle_in_result_handler @ linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_exit_at_task_unpickle @ linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_exit_during_func_exec_on_worker @ linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_exit_during_result_pickle_on_worker @ linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_exit_during_result_unpickle_in_result_handler @ linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_gh105829_should_not_deadlock_if_wakeup_pipe_full @ linux-x86_64 +test.test_concurrent_futures.test_deadlock.ProcessPoolSpawnExecutorDeadlockTest.test_shutdown_deadlock_pickle @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_cancel @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_cancelled @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_done @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_done_callback_already_cancelled @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_done_callback_already_failed @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_done_callback_already_successful @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_done_callback_raises @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_done_callback_raises_already_succeeded @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_done_callback_with_cancel @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_done_callback_with_exception @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_done_callback_with_result @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_exception_with_success @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_exception_with_timeout @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_multiple_set_exception @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_multiple_set_result @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_repr @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_result_with_cancel @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_result_with_success @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_result_with_timeout @ linux-x86_64 +test.test_concurrent_futures.test_future.FutureTests.test_running @ linux-x86_64 +test.test_concurrent_futures.test_init.ProcessPoolSpawnFailingInitializerTest.test_initializer @ linux-x86_64 +test.test_concurrent_futures.test_init.ProcessPoolSpawnInitializerTest.test_initializer @ linux-x86_64 +test.test_concurrent_futures.test_init.ThreadPoolFailingInitializerTest.test_initializer @ linux-x86_64 +test.test_concurrent_futures.test_init.ThreadPoolInitializerTest.test_initializer @ linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolForkProcessPoolExecutorTest.test_max_tasks_per_child @ linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolForkProcessPoolExecutorTest.test_max_tasks_per_child_defaults_to_spawn_context @ linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolForkProcessPoolExecutorTest.test_max_workers_negative @ linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_idle_process_reuse_multiple @ linux-x86_64 +!test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_idle_process_reuse_one @ linux-x86_64 +!test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_killed_child @ linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_map @ linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_map_chunksize @ linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_map_exception @ linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_map_timeout @ linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_max_tasks_early_shutdown @ linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_max_tasks_per_child @ linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_max_tasks_per_child_defaults_to_spawn_context @ linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_max_workers_negative @ linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_saturation @ linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_shutdown_race_issue12456 @ linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_submit @ linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_submit_keyword @ linux-x86_64 +test.test_concurrent_futures.test_process_pool.ProcessPoolSpawnProcessPoolExecutorTest.test_traceback @ linux-x86_64 +test.test_concurrent_futures.test_shutdown.ProcessPoolForkProcessPoolShutdownTest.test_run_after_shutdown @ linux-x86_64 +test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_cancel_futures @ linux-x86_64 +test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_context_manager_shutdown @ linux-x86_64 +test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_hang_gh94440 @ linux-x86_64 +test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_hang_issue12364 @ linux-x86_64 +test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_processes_terminate @ linux-x86_64 +test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_run_after_shutdown @ linux-x86_64 +test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_shutdown_no_wait @ linux-x86_64 +!test.test_concurrent_futures.test_shutdown.ProcessPoolSpawnProcessPoolShutdownTest.test_submit_after_interpreter_shutdown @ linux-x86_64 +test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_cancel_futures @ linux-x86_64 +test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_context_manager_shutdown @ linux-x86_64 +!test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_hang_gh94440 @ linux-x86_64 +test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_hang_issue12364 @ linux-x86_64 +test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_run_after_shutdown @ linux-x86_64 +test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_shutdown_no_wait @ linux-x86_64 +test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_submit_after_interpreter_shutdown @ linux-x86_64 +!test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_thread_names_assigned @ linux-x86_64 +!test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_thread_names_default @ linux-x86_64 +test.test_concurrent_futures.test_shutdown.ThreadPoolShutdownTest.test_threads_terminate @ linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_default_workers @ linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_executor_map_current_future_cancel @ linux-x86_64 +!test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_idle_thread_reuse @ linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_map @ linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_map_exception @ linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_map_submits_without_iteration @ linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_map_timeout @ linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_max_workers_negative @ linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_saturation @ linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_shutdown_race_issue12456 @ linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_submit @ linux-x86_64 +test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_submit_keyword @ linux-x86_64 +test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_20369 @ linux-x86_64 +test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_all_completed @ linux-x86_64 +test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_first_completed @ linux-x86_64 +test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_first_completed_some_already_completed @ linux-x86_64 +test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_first_exception @ linux-x86_64 +test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_first_exception_one_already_failed @ linux-x86_64 +test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_first_exception_some_already_complete @ linux-x86_64 +test.test_concurrent_futures.test_wait.ProcessPoolSpawnWaitTest.test_timeout @ linux-x86_64 +test.test_concurrent_futures.test_wait.ThreadPoolWaitTests.test_20369 @ linux-x86_64 +test.test_concurrent_futures.test_wait.ThreadPoolWaitTests.test_all_completed @ linux-x86_64 +test.test_concurrent_futures.test_wait.ThreadPoolWaitTests.test_first_completed @ linux-x86_64 +test.test_concurrent_futures.test_wait.ThreadPoolWaitTests.test_first_completed_some_already_completed @ linux-x86_64 +test.test_concurrent_futures.test_wait.ThreadPoolWaitTests.test_first_exception @ linux-x86_64 +test.test_concurrent_futures.test_wait.ThreadPoolWaitTests.test_first_exception_one_already_failed @ linux-x86_64 +test.test_concurrent_futures.test_wait.ThreadPoolWaitTests.test_first_exception_some_already_complete @ linux-x86_64 +test.test_concurrent_futures.test_wait.ThreadPoolWaitTests.test_pending_calls_race @ linux-x86_64 +test.test_concurrent_futures.test_wait.ThreadPoolWaitTests.test_timeout @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_configparser.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_configparser.txt new file mode 100644 index 0000000000..811985b72d --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_configparser.txt @@ -0,0 +1,337 @@ +test.test_configparser.BlatantOverrideConvertersTestCase.test_converters_at_init @ linux-x86_64 +test.test_configparser.BlatantOverrideConvertersTestCase.test_inheritance @ linux-x86_64 +test.test_configparser.BlatantOverrideConvertersTestCase.test_instance_assignment @ linux-x86_64 +test.test_configparser.CompatibleTestCase.test_comment_handling @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_add_section_default @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_basic @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_basic_from_dict @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_boolean @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_case_sensitivity @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_case_sensitivity_mapping_access @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_clear @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_default_case_sensitivity @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_defaults_keyword @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_interpolation @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_interpolation_missing_value @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_invalid_multiline_value @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_items @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_parse_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_popitem @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_query_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_read_returns_file_list @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_read_returns_file_list_with_bytestring_path @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_safe_interpolation @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_set_malformatted_interpolation @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_set_nonstring_types @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_set_string_types @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_setitem @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_weird_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCase.test_write @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_basic @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_basic_from_dict @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_boolean @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_case_sensitivity @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_case_sensitivity_basic @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_case_sensitivity_conflicts @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_case_sensitivity_mapping_access @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_clear @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_default_case_sensitivity @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_endless_loop @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_extended_interpolation @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_invalid_multiline_value @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_other_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_parse_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_popitem @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_query_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_read_returns_file_list @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_read_returns_file_list_with_bytestring_path @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_set_string_types @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_setitem @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_strange_options @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_weird_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseExtendedInterpolation.test_write @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseInvalidInterpolationType.test_error_on_wrong_type_for_interpolation @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_add_section_default @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_basic @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_basic_from_dict @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_boolean @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_case_sensitivity @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_case_sensitivity_mapping_access @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_clear @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_default_case_sensitivity @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_defaults_keyword @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_interpolation @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_interpolation_missing_value @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_invalid_multiline_value @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_items @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_parse_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_popitem @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_query_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_read_returns_file_list @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_read_returns_file_list_with_bytestring_path @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_set_malformatted_interpolation @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_set_nonstring_types @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_set_string_types @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_setitem @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_weird_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseLegacyInterpolation.test_write @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_basic @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_basic_from_dict @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_boolean @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_case_sensitivity @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_case_sensitivity_mapping_access @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_clear @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_default_case_sensitivity @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_empty_case @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_invalid_multiline_value @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_no_interpolation @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_none_as_default_interpolation @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_parse_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_popitem @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_query_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_read_returns_file_list @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_read_returns_file_list_with_bytestring_path @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_set_string_types @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_setitem @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_weird_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoInterpolation.test_write @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_add_section_default @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_basic @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_basic_from_dict @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_boolean @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_case_sensitivity @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_case_sensitivity_mapping_access @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_clear @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_default_case_sensitivity @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_defaults_keyword @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_interpolation @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_interpolation_missing_value @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_items @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_parse_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_popitem @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_query_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_read_returns_file_list @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_read_returns_file_list_with_bytestring_path @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_safe_interpolation @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_set_malformatted_interpolation @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_set_nonstring_types @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_set_string_types @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_setitem @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_weird_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNoValue.test_write @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_add_section_default @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_basic @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_basic_from_dict @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_boolean @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_case_sensitivity @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_case_sensitivity_mapping_access @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_clear @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_default_case_sensitivity @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_defaults_keyword @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_interpolation @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_interpolation_missing_value @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_invalid_multiline_value @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_items @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_parse_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_popitem @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_query_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_read_returns_file_list @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_read_returns_file_list_with_bytestring_path @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_safe_interpolation @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_set_malformatted_interpolation @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_set_nonstring_types @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_set_string_types @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_setitem @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_weird_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDefaultSection.test_write @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_add_section_default @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_basic @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_basic_from_dict @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_boolean @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_case_sensitivity @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_case_sensitivity_mapping_access @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_clear @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_default_case_sensitivity @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_defaults_keyword @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_interpolation @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_interpolation_missing_value @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_invalid_multiline_value @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_items @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_parse_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_popitem @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_query_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_safe_interpolation @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_set_malformatted_interpolation @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_set_nonstring_types @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_set_string_types @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_setitem @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_weird_errors @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseNonStandardDelimiters.test_write @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseTrickyFile.test_cfgparser_dot_3 @ linux-x86_64 +test.test_configparser.ConfigParserTestCaseTrickyFile.test_unicode_failure @ linux-x86_64 +test.test_configparser.ConvertersTestCase.test_basic @ linux-x86_64 +test.test_configparser.ConvertersTestCase.test_basic_from_dict @ linux-x86_64 +test.test_configparser.ConvertersTestCase.test_boolean @ linux-x86_64 +test.test_configparser.ConvertersTestCase.test_case_sensitivity @ linux-x86_64 +test.test_configparser.ConvertersTestCase.test_case_sensitivity_mapping_access @ linux-x86_64 +test.test_configparser.ConvertersTestCase.test_clear @ linux-x86_64 +test.test_configparser.ConvertersTestCase.test_converters @ linux-x86_64 +test.test_configparser.ConvertersTestCase.test_default_case_sensitivity @ linux-x86_64 +test.test_configparser.ConvertersTestCase.test_invalid_multiline_value @ linux-x86_64 +test.test_configparser.ConvertersTestCase.test_parse_errors @ linux-x86_64 +test.test_configparser.ConvertersTestCase.test_popitem @ linux-x86_64 +test.test_configparser.ConvertersTestCase.test_query_errors @ linux-x86_64 +test.test_configparser.ConvertersTestCase.test_read_returns_file_list @ linux-x86_64 +test.test_configparser.ConvertersTestCase.test_read_returns_file_list_with_bytestring_path @ linux-x86_64 +test.test_configparser.ConvertersTestCase.test_set_string_types @ linux-x86_64 +test.test_configparser.ConvertersTestCase.test_setitem @ linux-x86_64 +test.test_configparser.ConvertersTestCase.test_weird_errors @ linux-x86_64 +test.test_configparser.ConvertersTestCase.test_write @ linux-x86_64 +test.test_configparser.CopyTestCase.test_basic @ linux-x86_64 +test.test_configparser.CopyTestCase.test_basic_from_dict @ linux-x86_64 +test.test_configparser.CopyTestCase.test_boolean @ linux-x86_64 +test.test_configparser.CopyTestCase.test_case_sensitivity @ linux-x86_64 +test.test_configparser.CopyTestCase.test_case_sensitivity_mapping_access @ linux-x86_64 +test.test_configparser.CopyTestCase.test_clear @ linux-x86_64 +test.test_configparser.CopyTestCase.test_default_case_sensitivity @ linux-x86_64 +test.test_configparser.CopyTestCase.test_invalid_multiline_value @ linux-x86_64 +test.test_configparser.CopyTestCase.test_parse_errors @ linux-x86_64 +test.test_configparser.CopyTestCase.test_popitem @ linux-x86_64 +test.test_configparser.CopyTestCase.test_query_errors @ linux-x86_64 +test.test_configparser.CopyTestCase.test_read_returns_file_list @ linux-x86_64 +test.test_configparser.CopyTestCase.test_read_returns_file_list_with_bytestring_path @ linux-x86_64 +test.test_configparser.CopyTestCase.test_set_string_types @ linux-x86_64 +test.test_configparser.CopyTestCase.test_setitem @ linux-x86_64 +test.test_configparser.CopyTestCase.test_weird_errors @ linux-x86_64 +test.test_configparser.CopyTestCase.test_write @ linux-x86_64 +test.test_configparser.CoverageOneHundredTestCase.test_duplicate_option_error @ linux-x86_64 +test.test_configparser.CoverageOneHundredTestCase.test_inconsistent_converters_state @ linux-x86_64 +test.test_configparser.CoverageOneHundredTestCase.test_interpolation_depth_error @ linux-x86_64 +test.test_configparser.CoverageOneHundredTestCase.test_interpolation_validation @ linux-x86_64 +test.test_configparser.CoverageOneHundredTestCase.test_legacyinterpolation_deprecation @ linux-x86_64 +test.test_configparser.CoverageOneHundredTestCase.test_parsing_error @ linux-x86_64 +test.test_configparser.CoverageOneHundredTestCase.test_readfp_deprecation @ linux-x86_64 +test.test_configparser.CoverageOneHundredTestCase.test_safeconfigparser_deprecation @ linux-x86_64 +test.test_configparser.CoverageOneHundredTestCase.test_sectionproxy_repr @ linux-x86_64 +test.test_configparser.ExceptionContextTestCase.test_get_basic_interpolation @ linux-x86_64 +test.test_configparser.ExceptionContextTestCase.test_get_extended_interpolation @ linux-x86_64 +test.test_configparser.ExceptionContextTestCase.test_missing_options @ linux-x86_64 +test.test_configparser.ExceptionContextTestCase.test_missing_section @ linux-x86_64 +test.test_configparser.ExceptionContextTestCase.test_remove_option @ linux-x86_64 +test.test_configparser.ExceptionPicklingTestCase.test_duplicateoptionerror @ linux-x86_64 +test.test_configparser.ExceptionPicklingTestCase.test_duplicatesectionerror @ linux-x86_64 +test.test_configparser.ExceptionPicklingTestCase.test_error @ linux-x86_64 +test.test_configparser.ExceptionPicklingTestCase.test_interpolationdeptherror @ linux-x86_64 +test.test_configparser.ExceptionPicklingTestCase.test_interpolationerror @ linux-x86_64 +test.test_configparser.ExceptionPicklingTestCase.test_interpolationmissingoptionerror @ linux-x86_64 +test.test_configparser.ExceptionPicklingTestCase.test_interpolationsyntaxerror @ linux-x86_64 +test.test_configparser.ExceptionPicklingTestCase.test_missingsectionheadererror @ linux-x86_64 +test.test_configparser.ExceptionPicklingTestCase.test_nooptionerror @ linux-x86_64 +test.test_configparser.ExceptionPicklingTestCase.test_nosectionerror @ linux-x86_64 +test.test_configparser.ExceptionPicklingTestCase.test_parsingerror @ linux-x86_64 +test.test_configparser.InlineCommentStrippingTestCase.test_stripping @ linux-x86_64 +test.test_configparser.Issue7005TestCase.test_none_as_value_stringified @ linux-x86_64 +test.test_configparser.Issue7005TestCase.test_none_as_value_stringified_raw @ linux-x86_64 +test.test_configparser.MiscTestCase.test__all__ @ linux-x86_64 +test.test_configparser.MultilineValuesTestCase.test_basic @ linux-x86_64 +test.test_configparser.MultilineValuesTestCase.test_basic_from_dict @ linux-x86_64 +test.test_configparser.MultilineValuesTestCase.test_boolean @ linux-x86_64 +test.test_configparser.MultilineValuesTestCase.test_case_sensitivity @ linux-x86_64 +test.test_configparser.MultilineValuesTestCase.test_case_sensitivity_mapping_access @ linux-x86_64 +test.test_configparser.MultilineValuesTestCase.test_clear @ linux-x86_64 +test.test_configparser.MultilineValuesTestCase.test_default_case_sensitivity @ linux-x86_64 +test.test_configparser.MultilineValuesTestCase.test_dominating_multiline_values @ linux-x86_64 +test.test_configparser.MultilineValuesTestCase.test_invalid_multiline_value @ linux-x86_64 +test.test_configparser.MultilineValuesTestCase.test_parse_errors @ linux-x86_64 +test.test_configparser.MultilineValuesTestCase.test_popitem @ linux-x86_64 +test.test_configparser.MultilineValuesTestCase.test_query_errors @ linux-x86_64 +test.test_configparser.MultilineValuesTestCase.test_read_returns_file_list @ linux-x86_64 +test.test_configparser.MultilineValuesTestCase.test_read_returns_file_list_with_bytestring_path @ linux-x86_64 +test.test_configparser.MultilineValuesTestCase.test_set_string_types @ linux-x86_64 +test.test_configparser.MultilineValuesTestCase.test_setitem @ linux-x86_64 +test.test_configparser.MultilineValuesTestCase.test_weird_errors @ linux-x86_64 +test.test_configparser.MultilineValuesTestCase.test_write @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_basic @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_basic_from_dict @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_boolean @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_case_sensitivity @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_case_sensitivity_mapping_access @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_clear @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_default_case_sensitivity @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_defaults_keyword @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_interpolation @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_invalid_multiline_value @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_items @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_parse_errors @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_popitem @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_query_errors @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_read_returns_file_list @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_read_returns_file_list_with_bytestring_path @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_set_nonstring_types @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_set_string_types @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_setitem @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_weird_errors @ linux-x86_64 +test.test_configparser.RawConfigParserTestCase.test_write @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_basic @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_basic_from_dict @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_boolean @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_case_sensitivity @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_case_sensitivity_mapping_access @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_clear @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_default_case_sensitivity @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_defaults_keyword @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_interpolation @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_invalid_multiline_value @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_items @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_parse_errors @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_popitem @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_query_errors @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_set_nonstring_types @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_set_string_types @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_setitem @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_weird_errors @ linux-x86_64 +test.test_configparser.RawConfigParserTestCaseNonStandardDelimiters.test_write @ linux-x86_64 +test.test_configparser.RawConfigParserTestSambaConf.test_reading @ linux-x86_64 +test.test_configparser.ReadFileTestCase.test_file @ linux-x86_64 +test.test_configparser.ReadFileTestCase.test_iterable @ linux-x86_64 +test.test_configparser.ReadFileTestCase.test_readline_generator @ linux-x86_64 +test.test_configparser.ReadFileTestCase.test_source_as_bytes @ linux-x86_64 +test.test_configparser.SortedTestCase.test_basic @ linux-x86_64 +test.test_configparser.SortedTestCase.test_basic_from_dict @ linux-x86_64 +test.test_configparser.SortedTestCase.test_boolean @ linux-x86_64 +test.test_configparser.SortedTestCase.test_case_sensitivity @ linux-x86_64 +test.test_configparser.SortedTestCase.test_case_sensitivity_mapping_access @ linux-x86_64 +test.test_configparser.SortedTestCase.test_clear @ linux-x86_64 +test.test_configparser.SortedTestCase.test_default_case_sensitivity @ linux-x86_64 +test.test_configparser.SortedTestCase.test_defaults_keyword @ linux-x86_64 +test.test_configparser.SortedTestCase.test_interpolation @ linux-x86_64 +test.test_configparser.SortedTestCase.test_invalid_multiline_value @ linux-x86_64 +test.test_configparser.SortedTestCase.test_items @ linux-x86_64 +test.test_configparser.SortedTestCase.test_parse_errors @ linux-x86_64 +test.test_configparser.SortedTestCase.test_popitem @ linux-x86_64 +test.test_configparser.SortedTestCase.test_query_errors @ linux-x86_64 +test.test_configparser.SortedTestCase.test_read_returns_file_list @ linux-x86_64 +test.test_configparser.SortedTestCase.test_read_returns_file_list_with_bytestring_path @ linux-x86_64 +test.test_configparser.SortedTestCase.test_set_nonstring_types @ linux-x86_64 +test.test_configparser.SortedTestCase.test_set_string_types @ linux-x86_64 +test.test_configparser.SortedTestCase.test_setitem @ linux-x86_64 +test.test_configparser.SortedTestCase.test_sorted @ linux-x86_64 +test.test_configparser.SortedTestCase.test_weird_errors @ linux-x86_64 +test.test_configparser.SortedTestCase.test_write @ linux-x86_64 +test.test_configparser.StrictTestCase.test_basic @ linux-x86_64 +test.test_configparser.StrictTestCase.test_basic_from_dict @ linux-x86_64 +test.test_configparser.StrictTestCase.test_boolean @ linux-x86_64 +test.test_configparser.StrictTestCase.test_case_sensitivity @ linux-x86_64 +test.test_configparser.StrictTestCase.test_case_sensitivity_mapping_access @ linux-x86_64 +test.test_configparser.StrictTestCase.test_clear @ linux-x86_64 +test.test_configparser.StrictTestCase.test_default_case_sensitivity @ linux-x86_64 +test.test_configparser.StrictTestCase.test_invalid_multiline_value @ linux-x86_64 +test.test_configparser.StrictTestCase.test_parse_errors @ linux-x86_64 +test.test_configparser.StrictTestCase.test_popitem @ linux-x86_64 +test.test_configparser.StrictTestCase.test_query_errors @ linux-x86_64 +test.test_configparser.StrictTestCase.test_read_returns_file_list @ linux-x86_64 +test.test_configparser.StrictTestCase.test_read_returns_file_list_with_bytestring_path @ linux-x86_64 +test.test_configparser.StrictTestCase.test_set_string_types @ linux-x86_64 +test.test_configparser.StrictTestCase.test_setitem @ linux-x86_64 +test.test_configparser.StrictTestCase.test_weird_errors @ linux-x86_64 +test.test_configparser.StrictTestCase.test_write @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_contains.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_contains.txt new file mode 100644 index 0000000000..9e8dfde5ae --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_contains.txt @@ -0,0 +1,4 @@ +test.test_contains.TestContains.test_block_fallback @ linux-x86_64 +test.test_contains.TestContains.test_builtin_sequence_types @ linux-x86_64 +test.test_contains.TestContains.test_common_tests @ linux-x86_64 +test.test_contains.TestContains.test_nonreflexive @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_context.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_context.txt new file mode 100644 index 0000000000..cba6f09333 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_context.txt @@ -0,0 +1,15 @@ +test.test_context.ContextTest.test_context_copy_1 @ linux-x86_64 +test.test_context.ContextTest.test_context_get_context_1 @ linux-x86_64 +test.test_context.ContextTest.test_context_getset_1 @ linux-x86_64 +test.test_context.ContextTest.test_context_getset_2 @ linux-x86_64 +test.test_context.ContextTest.test_context_getset_3 @ linux-x86_64 +test.test_context.ContextTest.test_context_getset_5 @ linux-x86_64 +test.test_context.ContextTest.test_context_run_1 @ linux-x86_64 +test.test_context.ContextTest.test_context_run_2 @ linux-x86_64 +test.test_context.ContextTest.test_context_run_3 @ linux-x86_64 +test.test_context.ContextTest.test_context_run_5 @ linux-x86_64 +test.test_context.ContextTest.test_context_run_6 @ linux-x86_64 +test.test_context.ContextTest.test_context_run_7 @ linux-x86_64 +test.test_context.ContextTest.test_context_subclassing_1 @ linux-x86_64 +test.test_context.ContextTest.test_context_threads_1 @ linux-x86_64 +test.test_context.ContextTest.test_context_typerrors_1 @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_contextlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_contextlib.txt new file mode 100644 index 0000000000..e80bfd6a73 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_contextlib.txt @@ -0,0 +1,85 @@ +test.test_contextlib.ClosingTestCase.test_closing @ linux-x86_64 +test.test_contextlib.ClosingTestCase.test_closing_error @ linux-x86_64 +test.test_contextlib.ClosingTestCase.test_instance_docs @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_attribs @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_do_not_unchain_non_stopiteration_exceptions @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_doc_attrib @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_except @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_except_pep479 @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_except_stopiter @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_finally @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_no_reraise @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_non_normalised @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_plain @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_traceback @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_trap_no_yield @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_trap_second_yield @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_trap_yield_after_throw @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_contextmanager_wrap_runtimeerror @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_instance_docstring_given_cm_docstring @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_keywords @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_param_errors @ linux-x86_64 +test.test_contextlib.ContextManagerTestCase.test_recursive @ linux-x86_64 +test.test_contextlib.FileContextTestCase.testWithOpen @ linux-x86_64 +test.test_contextlib.LockContextTestCase.testWithBoundedSemaphore @ linux-x86_64 +test.test_contextlib.LockContextTestCase.testWithCondition @ linux-x86_64 +test.test_contextlib.LockContextTestCase.testWithLock @ linux-x86_64 +test.test_contextlib.LockContextTestCase.testWithRLock @ linux-x86_64 +test.test_contextlib.LockContextTestCase.testWithSemaphore @ linux-x86_64 +test.test_contextlib.NullcontextTestCase.test_nullcontext @ linux-x86_64 +test.test_contextlib.TestAbstractContextManager.test_enter @ linux-x86_64 +test.test_contextlib.TestAbstractContextManager.test_exit_is_abstract @ linux-x86_64 +test.test_contextlib.TestAbstractContextManager.test_structural_subclassing @ linux-x86_64 +test.test_contextlib.TestChdir.test_exception @ linux-x86_64 +test.test_contextlib.TestChdir.test_reentrant @ linux-x86_64 +test.test_contextlib.TestChdir.test_simple @ linux-x86_64 +test.test_contextlib.TestContextDecorator.test_contextdecorator @ linux-x86_64 +test.test_contextlib.TestContextDecorator.test_contextdecorator_as_mixin @ linux-x86_64 +test.test_contextlib.TestContextDecorator.test_contextdecorator_with_exception @ linux-x86_64 +test.test_contextlib.TestContextDecorator.test_contextmanager_as_decorator @ linux-x86_64 +test.test_contextlib.TestContextDecorator.test_decorating_method @ linux-x86_64 +test.test_contextlib.TestContextDecorator.test_decorator @ linux-x86_64 +test.test_contextlib.TestContextDecorator.test_decorator_with_exception @ linux-x86_64 +test.test_contextlib.TestContextDecorator.test_instance_docs @ linux-x86_64 +test.test_contextlib.TestContextDecorator.test_typo_enter @ linux-x86_64 +test.test_contextlib.TestContextDecorator.test_typo_exit @ linux-x86_64 +test.test_contextlib.TestExitStack.test_body_exception_suppress @ linux-x86_64 +test.test_contextlib.TestExitStack.test_callback @ linux-x86_64 +test.test_contextlib.TestExitStack.test_close @ linux-x86_64 +test.test_contextlib.TestExitStack.test_dont_reraise_RuntimeError @ linux-x86_64 +test.test_contextlib.TestExitStack.test_enter_context @ linux-x86_64 +test.test_contextlib.TestExitStack.test_enter_context_errors @ linux-x86_64 +test.test_contextlib.TestExitStack.test_excessive_nesting @ linux-x86_64 +test.test_contextlib.TestExitStack.test_exit_exception_chaining_reference @ linux-x86_64 +test.test_contextlib.TestExitStack.test_exit_exception_chaining_suppress @ linux-x86_64 +test.test_contextlib.TestExitStack.test_exit_exception_non_suppressing @ linux-x86_64 +test.test_contextlib.TestExitStack.test_exit_exception_traceback @ linux-x86_64 +test.test_contextlib.TestExitStack.test_exit_exception_with_existing_context @ linux-x86_64 +test.test_contextlib.TestExitStack.test_exit_raise @ linux-x86_64 +test.test_contextlib.TestExitStack.test_exit_suppress @ linux-x86_64 +test.test_contextlib.TestExitStack.test_instance_bypass @ linux-x86_64 +test.test_contextlib.TestExitStack.test_instance_docs @ linux-x86_64 +test.test_contextlib.TestExitStack.test_no_resources @ linux-x86_64 +test.test_contextlib.TestExitStack.test_pop_all @ linux-x86_64 +test.test_contextlib.TestExitStack.test_push @ linux-x86_64 +test.test_contextlib.TestRedirectStderr.test_cm_is_reentrant @ linux-x86_64 +test.test_contextlib.TestRedirectStderr.test_cm_is_reusable @ linux-x86_64 +test.test_contextlib.TestRedirectStderr.test_enter_result_is_target @ linux-x86_64 +test.test_contextlib.TestRedirectStderr.test_instance_docs @ linux-x86_64 +test.test_contextlib.TestRedirectStderr.test_no_redirect_in_init @ linux-x86_64 +test.test_contextlib.TestRedirectStderr.test_redirect_to_string_io @ linux-x86_64 +test.test_contextlib.TestRedirectStdout.test_cm_is_reentrant @ linux-x86_64 +test.test_contextlib.TestRedirectStdout.test_cm_is_reusable @ linux-x86_64 +test.test_contextlib.TestRedirectStdout.test_enter_result_is_target @ linux-x86_64 +test.test_contextlib.TestRedirectStdout.test_instance_docs @ linux-x86_64 +test.test_contextlib.TestRedirectStdout.test_no_redirect_in_init @ linux-x86_64 +test.test_contextlib.TestRedirectStdout.test_redirect_to_string_io @ linux-x86_64 +test.test_contextlib.TestSuppress.test_cm_is_reentrant @ linux-x86_64 +test.test_contextlib.TestSuppress.test_exact_exception @ linux-x86_64 +test.test_contextlib.TestSuppress.test_exception_hierarchy @ linux-x86_64 +test.test_contextlib.TestSuppress.test_instance_docs @ linux-x86_64 +test.test_contextlib.TestSuppress.test_multiple_exception_args @ linux-x86_64 +test.test_contextlib.TestSuppress.test_no_args @ linux-x86_64 +test.test_contextlib.TestSuppress.test_no_exception @ linux-x86_64 +test.test_contextlib.TestSuppress.test_no_result_from_enter @ linux-x86_64 +test.test_contextlib.TestSuppress.test_other_exception @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_contextlib_async.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_contextlib_async.txt new file mode 100644 index 0000000000..0e63035340 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_contextlib_async.txt @@ -0,0 +1,21 @@ +test.test_contextlib_async.AclosingTestCase.test_instance_docs @ linux-x86_64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_attribs @ linux-x86_64 +test.test_contextlib_async.AsyncContextManagerTestCase.test_contextmanager_doc_attrib @ linux-x86_64 +test.test_contextlib_async.TestAbstractAsyncContextManager.test_exit_is_abstract @ linux-x86_64 +test.test_contextlib_async.TestAbstractAsyncContextManager.test_structural_subclassing @ linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_body_exception_suppress @ linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_callback @ linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_dont_reraise_RuntimeError @ linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_enter_context @ linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_enter_context_errors @ linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_excessive_nesting @ linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_exit_exception_chaining_reference @ linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_exit_exception_chaining_suppress @ linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_exit_exception_non_suppressing @ linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_exit_exception_with_existing_context @ linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_exit_raise @ linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_exit_suppress @ linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_instance_bypass @ linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_instance_docs @ linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_no_resources @ linux-x86_64 +test.test_contextlib_async.TestAsyncExitStack.test_push @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_copy.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_copy.txt new file mode 100644 index 0000000000..13c1eac947 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_copy.txt @@ -0,0 +1,74 @@ +test.test_copy.TestCopy.test_copy_atomic @ linux-x86_64 +test.test_copy.TestCopy.test_copy_basic @ linux-x86_64 +test.test_copy.TestCopy.test_copy_bytearray @ linux-x86_64 +test.test_copy.TestCopy.test_copy_cant @ linux-x86_64 +test.test_copy.TestCopy.test_copy_copy @ linux-x86_64 +test.test_copy.TestCopy.test_copy_dict @ linux-x86_64 +test.test_copy.TestCopy.test_copy_frozenset @ linux-x86_64 +test.test_copy.TestCopy.test_copy_function @ linux-x86_64 +test.test_copy.TestCopy.test_copy_inst_copy @ linux-x86_64 +test.test_copy.TestCopy.test_copy_inst_getinitargs @ linux-x86_64 +test.test_copy.TestCopy.test_copy_inst_getnewargs @ linux-x86_64 +test.test_copy.TestCopy.test_copy_inst_getnewargs_ex @ linux-x86_64 +test.test_copy.TestCopy.test_copy_inst_getstate @ linux-x86_64 +test.test_copy.TestCopy.test_copy_inst_getstate_setstate @ linux-x86_64 +test.test_copy.TestCopy.test_copy_inst_setstate @ linux-x86_64 +test.test_copy.TestCopy.test_copy_inst_vanilla @ linux-x86_64 +test.test_copy.TestCopy.test_copy_list @ linux-x86_64 +test.test_copy.TestCopy.test_copy_list_subclass @ linux-x86_64 +test.test_copy.TestCopy.test_copy_reduce @ linux-x86_64 +test.test_copy.TestCopy.test_copy_reduce_ex @ linux-x86_64 +test.test_copy.TestCopy.test_copy_registry @ linux-x86_64 +test.test_copy.TestCopy.test_copy_set @ linux-x86_64 +test.test_copy.TestCopy.test_copy_slots @ linux-x86_64 +test.test_copy.TestCopy.test_copy_tuple @ linux-x86_64 +test.test_copy.TestCopy.test_copy_tuple_subclass @ linux-x86_64 +!test.test_copy.TestCopy.test_copy_weakkeydict @ linux-x86_64 +test.test_copy.TestCopy.test_copy_weakref @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_atomic @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_basic @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_bound_method @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_cant @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_deepcopy @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_dict @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_dict_subclass @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_dont_memo_immutable @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_empty_tuple @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_function @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_inst_deepcopy @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_inst_getinitargs @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_inst_getnewargs @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_inst_getnewargs_ex @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_inst_getstate @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_inst_getstate_setstate @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_inst_setstate @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_inst_vanilla @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_issubclass @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_keepalive @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_list @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_list_subclass @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_memo @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_reduce @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_reduce_ex @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_reflexive_dict @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_reflexive_inst @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_reflexive_list @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_reflexive_tuple @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_registry @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_slots @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_tuple @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_tuple_of_immutables @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_tuple_subclass @ linux-x86_64 +!test.test_copy.TestCopy.test_deepcopy_weakkeydict @ linux-x86_64 +test.test_copy.TestCopy.test_deepcopy_weakref @ linux-x86_64 +test.test_copy.TestCopy.test_exceptions @ linux-x86_64 +test.test_copy.TestCopy.test_getstate_exc @ linux-x86_64 +test.test_copy.TestCopy.test_reconstruct_nostate @ linux-x86_64 +test.test_copy.TestCopy.test_reconstruct_reflexive @ linux-x86_64 +test.test_copy.TestCopy.test_reconstruct_state @ linux-x86_64 +test.test_copy.TestCopy.test_reconstruct_state_setstate @ linux-x86_64 +test.test_copy.TestCopy.test_reconstruct_string @ linux-x86_64 +test.test_copy.TestCopy.test_reduce_4tuple @ linux-x86_64 +test.test_copy.TestCopy.test_reduce_5tuple @ linux-x86_64 +test.test_copy.TestCopy.test_reduce_6tuple @ linux-x86_64 +test.test_copy.TestCopy.test_reduce_6tuple_none @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_copyreg.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_copyreg.txt new file mode 100644 index 0000000000..3d90ddb1df --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_copyreg.txt @@ -0,0 +1,6 @@ +test.test_copyreg.CopyRegTestCase.test_bool @ linux-x86_64 +test.test_copyreg.CopyRegTestCase.test_class @ linux-x86_64 +test.test_copyreg.CopyRegTestCase.test_extension_registry @ linux-x86_64 +test.test_copyreg.CopyRegTestCase.test_noncallable_constructor @ linux-x86_64 +test.test_copyreg.CopyRegTestCase.test_noncallable_reduce @ linux-x86_64 +test.test_copyreg.CopyRegTestCase.test_slotnames @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cppext.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_cppext.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_crypt.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_crypt.txt new file mode 100644 index 0000000000..48e58c8afc --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_crypt.txt @@ -0,0 +1,6 @@ +test.test_crypt.CryptTestCase.test_crypt @ linux-x86_64 +test.test_crypt.CryptTestCase.test_invalid_rounds @ linux-x86_64 +test.test_crypt.CryptTestCase.test_methods @ linux-x86_64 +test.test_crypt.CryptTestCase.test_salt @ linux-x86_64 +test.test_crypt.CryptTestCase.test_saltedcrypt @ linux-x86_64 +test.test_crypt.CryptTestCase.test_sha2_rounds @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_csv.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_csv.txt new file mode 100644 index 0000000000..1855d81e76 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_csv.txt @@ -0,0 +1,110 @@ +test.test_csv.KeyOrderingTest.test_ordered_dict_reader @ linux-x86_64 +test.test_csv.KeyOrderingTest.test_ordering_for_the_dict_reader_and_writer @ linux-x86_64 +test.test_csv.MiscTestCase.test__all__ @ linux-x86_64 +test.test_csv.MiscTestCase.test_subclassable @ linux-x86_64 +test.test_csv.TestArrayWrites.test_char_write @ linux-x86_64 +test.test_csv.TestArrayWrites.test_double_write @ linux-x86_64 +test.test_csv.TestArrayWrites.test_float_write @ linux-x86_64 +test.test_csv.TestArrayWrites.test_int_write @ linux-x86_64 +test.test_csv.TestDialectExcel.test_blankline @ linux-x86_64 +test.test_csv.TestDialectExcel.test_dubious_quote @ linux-x86_64 +test.test_csv.TestDialectExcel.test_empty_fields @ linux-x86_64 +test.test_csv.TestDialectExcel.test_inline_quote @ linux-x86_64 +test.test_csv.TestDialectExcel.test_inline_quotes @ linux-x86_64 +test.test_csv.TestDialectExcel.test_lone_quote @ linux-x86_64 +test.test_csv.TestDialectExcel.test_newlines @ linux-x86_64 +test.test_csv.TestDialectExcel.test_null @ linux-x86_64 +test.test_csv.TestDialectExcel.test_quote_and_quote @ linux-x86_64 +test.test_csv.TestDialectExcel.test_quote_fieldsep @ linux-x86_64 +test.test_csv.TestDialectExcel.test_quoted @ linux-x86_64 +test.test_csv.TestDialectExcel.test_quoted_nl @ linux-x86_64 +test.test_csv.TestDialectExcel.test_quoted_quote @ linux-x86_64 +test.test_csv.TestDialectExcel.test_quoted_quotes @ linux-x86_64 +test.test_csv.TestDialectExcel.test_quotes @ linux-x86_64 +test.test_csv.TestDialectExcel.test_quotes_and_more @ linux-x86_64 +test.test_csv.TestDialectExcel.test_simple @ linux-x86_64 +test.test_csv.TestDialectExcel.test_simple_writer @ linux-x86_64 +test.test_csv.TestDialectExcel.test_single @ linux-x86_64 +test.test_csv.TestDialectExcel.test_single_quoted_quote @ linux-x86_64 +test.test_csv.TestDialectExcel.test_single_writer @ linux-x86_64 +test.test_csv.TestDialectExcel.test_singlequoted @ linux-x86_64 +test.test_csv.TestDialectExcel.test_singlequoted_left_empty @ linux-x86_64 +test.test_csv.TestDialectExcel.test_singlequoted_right_empty @ linux-x86_64 +test.test_csv.TestDialectExcel.test_space_and_quote @ linux-x86_64 +test.test_csv.TestDialectRegistry.test_bad_dialect @ linux-x86_64 +test.test_csv.TestDialectRegistry.test_dialect_apply @ linux-x86_64 +test.test_csv.TestDialectRegistry.test_incomplete_dialect @ linux-x86_64 +test.test_csv.TestDialectRegistry.test_register_kwargs @ linux-x86_64 +test.test_csv.TestDialectRegistry.test_register_kwargs_override @ linux-x86_64 +test.test_csv.TestDialectRegistry.test_registry @ linux-x86_64 +test.test_csv.TestDialectRegistry.test_registry_badargs @ linux-x86_64 +test.test_csv.TestDialectRegistry.test_space_dialect @ linux-x86_64 +test.test_csv.TestDialectUnix.test_simple_reader @ linux-x86_64 +test.test_csv.TestDialectUnix.test_simple_writer @ linux-x86_64 +test.test_csv.TestDialectValidity.test_delimiter @ linux-x86_64 +test.test_csv.TestDialectValidity.test_escapechar @ linux-x86_64 +test.test_csv.TestDialectValidity.test_invalid_chars @ linux-x86_64 +test.test_csv.TestDialectValidity.test_lineterminator @ linux-x86_64 +test.test_csv.TestDialectValidity.test_quoting @ linux-x86_64 +test.test_csv.TestDictFields.test_read_dict_fieldnames_chain @ linux-x86_64 +test.test_csv.TestDictFields.test_read_dict_fieldnames_from_file @ linux-x86_64 +test.test_csv.TestDictFields.test_read_dict_fields @ linux-x86_64 +test.test_csv.TestDictFields.test_read_dict_no_fieldnames @ linux-x86_64 +test.test_csv.TestDictFields.test_read_long @ linux-x86_64 +test.test_csv.TestDictFields.test_read_long_with_rest @ linux-x86_64 +test.test_csv.TestDictFields.test_read_long_with_rest_no_fieldnames @ linux-x86_64 +test.test_csv.TestDictFields.test_read_multi @ linux-x86_64 +test.test_csv.TestDictFields.test_read_semi_sep @ linux-x86_64 +test.test_csv.TestDictFields.test_read_short @ linux-x86_64 +test.test_csv.TestDictFields.test_read_with_blanks @ linux-x86_64 +test.test_csv.TestDictFields.test_typo_in_extrasaction_raises_error @ linux-x86_64 +test.test_csv.TestDictFields.test_write_field_not_in_field_names_ignore @ linux-x86_64 +test.test_csv.TestDictFields.test_write_field_not_in_field_names_raise @ linux-x86_64 +test.test_csv.TestDictFields.test_write_fields_not_in_fieldnames @ linux-x86_64 +test.test_csv.TestDictFields.test_write_multiple_dict_rows @ linux-x86_64 +test.test_csv.TestDictFields.test_write_no_fields @ linux-x86_64 +test.test_csv.TestDictFields.test_write_simple_dict @ linux-x86_64 +test.test_csv.TestDictFields.test_writeheader_return_value @ linux-x86_64 +test.test_csv.TestEscapedExcel.test_escape_fieldsep @ linux-x86_64 +test.test_csv.TestEscapedExcel.test_read_escape_fieldsep @ linux-x86_64 +test.test_csv.TestQuotedEscapedExcel.test_read_escape_fieldsep @ linux-x86_64 +test.test_csv.TestQuotedEscapedExcel.test_write_escape_fieldsep @ linux-x86_64 +test.test_csv.TestSniffer.test_delimiters @ linux-x86_64 +test.test_csv.TestSniffer.test_doublequote @ linux-x86_64 +test.test_csv.TestSniffer.test_guess_quote_and_delimiter @ linux-x86_64 +test.test_csv.TestSniffer.test_has_header @ linux-x86_64 +test.test_csv.TestSniffer.test_has_header_regex_special_delimiter @ linux-x86_64 +test.test_csv.TestSniffer.test_has_header_strings @ linux-x86_64 +test.test_csv.TestSniffer.test_issue43625 @ linux-x86_64 +test.test_csv.TestSniffer.test_sniff @ linux-x86_64 +test.test_csv.TestUnicode.test_unicode_read @ linux-x86_64 +test.test_csv.TestUnicode.test_unicode_write @ linux-x86_64 +test.test_csv.Test_Csv.test_read_bigfield @ linux-x86_64 +test.test_csv.Test_Csv.test_read_delimiter @ linux-x86_64 +test.test_csv.Test_Csv.test_read_eof @ linux-x86_64 +test.test_csv.Test_Csv.test_read_eol @ linux-x86_64 +test.test_csv.Test_Csv.test_read_escape @ linux-x86_64 +test.test_csv.Test_Csv.test_read_linenum @ linux-x86_64 +test.test_csv.Test_Csv.test_read_nul @ linux-x86_64 +test.test_csv.Test_Csv.test_read_oddinputs @ linux-x86_64 +test.test_csv.Test_Csv.test_read_quoting @ linux-x86_64 +test.test_csv.Test_Csv.test_read_skipinitialspace @ linux-x86_64 +test.test_csv.Test_Csv.test_reader_arg_valid @ linux-x86_64 +test.test_csv.Test_Csv.test_reader_attrs @ linux-x86_64 +test.test_csv.Test_Csv.test_reader_dialect_attrs @ linux-x86_64 +test.test_csv.Test_Csv.test_reader_kw_attrs @ linux-x86_64 +test.test_csv.Test_Csv.test_roundtrip_escaped_unquoted_newlines @ linux-x86_64 +test.test_csv.Test_Csv.test_roundtrip_quoteed_newlines @ linux-x86_64 +test.test_csv.Test_Csv.test_write_arg_valid @ linux-x86_64 +test.test_csv.Test_Csv.test_write_bigfield @ linux-x86_64 +test.test_csv.Test_Csv.test_write_escape @ linux-x86_64 +test.test_csv.Test_Csv.test_write_iterable @ linux-x86_64 +test.test_csv.Test_Csv.test_write_lineterminator @ linux-x86_64 +test.test_csv.Test_Csv.test_write_quoting @ linux-x86_64 +test.test_csv.Test_Csv.test_writer_arg_valid @ linux-x86_64 +test.test_csv.Test_Csv.test_writer_attrs @ linux-x86_64 +test.test_csv.Test_Csv.test_writer_dialect_attrs @ linux-x86_64 +test.test_csv.Test_Csv.test_writer_kw_attrs @ linux-x86_64 +test.test_csv.Test_Csv.test_writerows @ linux-x86_64 +test.test_csv.Test_Csv.test_writerows_errors @ linux-x86_64 +test.test_csv.Test_Csv.test_writerows_with_none @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ctypes.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ctypes.txt new file mode 100644 index 0000000000..936392b758 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ctypes.txt @@ -0,0 +1,247 @@ +ctypes.test.test_anon.AnonTest.test_anon_nonmember @ linux-x86_64 +ctypes.test.test_anon.AnonTest.test_anon_nonseq @ linux-x86_64 +ctypes.test.test_array_in_pointer.Test.test @ linux-x86_64 +ctypes.test.test_array_in_pointer.Test.test_2 @ linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_bad_subclass @ linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_bpo36504_signed_int_overflow @ linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_cache @ linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_classcache @ linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_empty_element_array @ linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_empty_element_struct @ linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_from_address @ linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_numeric_arrays @ linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_simple @ linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_subclass @ linux-x86_64 +ctypes.test.test_arrays.ArrayTestCase.test_zero_length @ linux-x86_64 +ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_callbacks @ linux-x86_64 +ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_callbacks_2 @ linux-x86_64 +ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_longlong_callbacks @ linux-x86_64 +ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_pointers @ linux-x86_64 +ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_recursive_as_param @ linux-x86_64 +ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_shorts @ linux-x86_64 +ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_wchar_parm @ linux-x86_64 +ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_callbacks @ linux-x86_64 +ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_callbacks_2 @ linux-x86_64 +ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_longlong_callbacks @ linux-x86_64 +ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_pointers @ linux-x86_64 +ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_recursive_as_param @ linux-x86_64 +ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_shorts @ linux-x86_64 +ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_wchar_parm @ linux-x86_64 +ctypes.test.test_as_parameter.BasicWrapTestCase.test_callbacks @ linux-x86_64 +ctypes.test.test_as_parameter.BasicWrapTestCase.test_callbacks_2 @ linux-x86_64 +ctypes.test.test_as_parameter.BasicWrapTestCase.test_longlong_callbacks @ linux-x86_64 +ctypes.test.test_as_parameter.BasicWrapTestCase.test_pointers @ linux-x86_64 +ctypes.test.test_as_parameter.BasicWrapTestCase.test_recursive_as_param @ linux-x86_64 +ctypes.test.test_as_parameter.BasicWrapTestCase.test_shorts @ linux-x86_64 +ctypes.test.test_as_parameter.BasicWrapTestCase.test_wchar_parm @ linux-x86_64 +ctypes.test.test_bitfields.BitFieldTest.test_c_wchar @ linux-x86_64 +ctypes.test.test_bitfields.BitFieldTest.test_mixed_1 @ linux-x86_64 +ctypes.test.test_bitfields.BitFieldTest.test_mixed_2 @ linux-x86_64 +ctypes.test.test_bitfields.BitFieldTest.test_mixed_3 @ linux-x86_64 +ctypes.test.test_bitfields.BitFieldTest.test_mixed_4 @ linux-x86_64 +ctypes.test.test_bitfields.BitFieldTest.test_multi_bitfields_size @ linux-x86_64 +ctypes.test.test_bitfields.BitFieldTest.test_nonint_types @ linux-x86_64 +ctypes.test.test_bitfields.BitFieldTest.test_single_bitfield_size @ linux-x86_64 +ctypes.test.test_bitfields.BitFieldTest.test_uint32 @ linux-x86_64 +ctypes.test.test_buffers.StringBufferTestCase.test_buffer @ linux-x86_64 +ctypes.test.test_buffers.StringBufferTestCase.test_buffer_interface @ linux-x86_64 +ctypes.test.test_buffers.StringBufferTestCase.test_create_unicode_buffer_non_bmp @ linux-x86_64 +ctypes.test.test_bytes.BytesTest.test_c_char_p @ linux-x86_64 +ctypes.test.test_bytes.BytesTest.test_c_wchar @ linux-x86_64 +ctypes.test.test_bytes.BytesTest.test_c_wchar_p @ linux-x86_64 +ctypes.test.test_bytes.BytesTest.test_struct @ linux-x86_64 +ctypes.test.test_bytes.BytesTest.test_struct_W @ linux-x86_64 +ctypes.test.test_byteswap.Test.test_endian_double @ linux-x86_64 +ctypes.test.test_byteswap.Test.test_endian_float @ linux-x86_64 +ctypes.test.test_byteswap.Test.test_endian_int @ linux-x86_64 +ctypes.test.test_byteswap.Test.test_endian_longlong @ linux-x86_64 +ctypes.test.test_byteswap.Test.test_endian_other @ linux-x86_64 +ctypes.test.test_byteswap.Test.test_endian_short @ linux-x86_64 +ctypes.test.test_byteswap.Test.test_slots @ linux-x86_64 +ctypes.test.test_byteswap.Test.test_struct_field_alignment @ linux-x86_64 +ctypes.test.test_byteswap.Test.test_struct_fields_unsupported_byte_order @ linux-x86_64 +ctypes.test.test_byteswap.Test.test_unaligned_native_struct_fields @ linux-x86_64 +ctypes.test.test_byteswap.Test.test_unaligned_nonnative_struct_fields @ linux-x86_64 +ctypes.test.test_byteswap.Test.test_union_fields_unsupported_byte_order @ linux-x86_64 +ctypes.test.test_callbacks.Callbacks.test_issue12483 @ linux-x86_64 +ctypes.test.test_callbacks.Callbacks.test_unsupported_restype_1 @ linux-x86_64 +ctypes.test.test_callbacks.Callbacks.test_unsupported_restype_2 @ linux-x86_64 +ctypes.test.test_callbacks.SampleCallbacksTestCase.test_callback_register_double @ linux-x86_64 +ctypes.test.test_callbacks.SampleCallbacksTestCase.test_callback_register_int @ linux-x86_64 +ctypes.test.test_callbacks.SampleCallbacksTestCase.test_integrate @ linux-x86_64 +ctypes.test.test_callbacks.SampleCallbacksTestCase.test_issue_8959_a @ linux-x86_64 +ctypes.test.test_cast.Test.test_address2pointer @ linux-x86_64 +ctypes.test.test_cast.Test.test_array2pointer @ linux-x86_64 +ctypes.test.test_cast.Test.test_bad_type_arg @ linux-x86_64 +ctypes.test.test_cast.Test.test_char_p @ linux-x86_64 +ctypes.test.test_cast.Test.test_other @ linux-x86_64 +ctypes.test.test_cast.Test.test_p2a_objects @ linux-x86_64 +ctypes.test.test_cast.Test.test_wchar_p @ linux-x86_64 +ctypes.test.test_delattr.TestCase.test_chararray @ linux-x86_64 +ctypes.test.test_delattr.TestCase.test_simple @ linux-x86_64 +ctypes.test.test_delattr.TestCase.test_struct @ linux-x86_64 +ctypes.test.test_find.FindLibraryLinux.test_find_library_with_gcc @ linux-x86_64 +ctypes.test.test_find.FindLibraryLinux.test_find_library_with_ld @ linux-x86_64 +ctypes.test.test_find.FindLibraryLinux.test_find_on_libpath @ linux-x86_64 +ctypes.test.test_find.Test_OpenGL_libs.test_gl @ linux-x86_64 +ctypes.test.test_find.Test_OpenGL_libs.test_shell_injection @ linux-x86_64 +ctypes.test.test_frombuffer.Test.test_abstract @ linux-x86_64 +ctypes.test.test_frombuffer.Test.test_fortran_contiguous @ linux-x86_64 +ctypes.test.test_frombuffer.Test.test_from_buffer_copy @ linux-x86_64 +ctypes.test.test_frombuffer.Test.test_from_buffer_copy_with_offset @ linux-x86_64 +ctypes.test.test_frombuffer.Test.test_from_buffer_memoryview @ linux-x86_64 +ctypes.test.test_frombuffer.Test.test_from_buffer_with_offset @ linux-x86_64 +ctypes.test.test_funcptr.CFuncPtrTestCase.test_abstract @ linux-x86_64 +ctypes.test.test_funcptr.CFuncPtrTestCase.test_basic @ linux-x86_64 +ctypes.test.test_funcptr.CFuncPtrTestCase.test_dllfunctions @ linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_callbacks @ linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_callbacks_2 @ linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_doubleresult @ linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_errors @ linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_floatresult @ linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_intresult @ linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_longlong_callbacks @ linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_longlongresult @ linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_mro @ linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_pointers @ linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_shorts @ linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_stringresult @ linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_wchar_parm @ linux-x86_64 +ctypes.test.test_functions.FunctionTestCase.test_wchar_result @ linux-x86_64 +ctypes.test.test_init.InitTest.test_get @ linux-x86_64 +ctypes.test.test_internals.ObjectsTestCase.test_embedded_structs @ linux-x86_64 +ctypes.test.test_internals.ObjectsTestCase.test_ints @ linux-x86_64 +ctypes.test.test_internals.ObjectsTestCase.test_ptr_struct @ linux-x86_64 +ctypes.test.test_internals.ObjectsTestCase.test_simple_struct @ linux-x86_64 +ctypes.test.test_internals.ObjectsTestCase.test_xxx @ linux-x86_64 +ctypes.test.test_keeprefs.ArrayTestCase.test_cint_array @ linux-x86_64 +ctypes.test.test_keeprefs.PointerTestCase.test_p_cint @ linux-x86_64 +ctypes.test.test_keeprefs.SimpleTestCase.test_ccharp @ linux-x86_64 +ctypes.test.test_keeprefs.SimpleTestCase.test_cint @ linux-x86_64 +ctypes.test.test_keeprefs.StructureTestCase.test_ccharp_struct @ linux-x86_64 +ctypes.test.test_keeprefs.StructureTestCase.test_cint_struct @ linux-x86_64 +ctypes.test.test_keeprefs.StructureTestCase.test_struct_struct @ linux-x86_64 +ctypes.test.test_libc.LibTest.test_qsort @ linux-x86_64 +ctypes.test.test_libc.LibTest.test_sqrt @ linux-x86_64 +ctypes.test.test_loading.LoaderTest.test_find @ linux-x86_64 +ctypes.test.test_loading.LoaderTest.test_load @ linux-x86_64 +ctypes.test.test_loading.LoaderTest.test_load_version @ linux-x86_64 +ctypes.test.test_memfunctions.MemFunctionsTest.test_cast @ linux-x86_64 +ctypes.test.test_memfunctions.MemFunctionsTest.test_memmove @ linux-x86_64 +ctypes.test.test_memfunctions.MemFunctionsTest.test_memset @ linux-x86_64 +ctypes.test.test_memfunctions.MemFunctionsTest.test_wstring_at @ linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_bool_values @ linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_byref @ linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_char_from_address @ linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_default_init @ linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_float_from_address @ linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_float_overflow @ linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_floats @ linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_from_param @ linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_init @ linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_int_from_address @ linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_integers @ linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_signed_values @ linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_sizes @ linux-x86_64 +ctypes.test.test_numbers.NumberTestCase.test_typeerror @ linux-x86_64 +ctypes.test.test_objects.TestCase.test @ linux-x86_64 +ctypes.test.test_parameters.SimpleTypesTestCase.test_abstract @ linux-x86_64 +ctypes.test.test_parameters.SimpleTypesTestCase.test_array_pointers @ linux-x86_64 +ctypes.test.test_parameters.SimpleTypesTestCase.test_byref_pointer @ linux-x86_64 +ctypes.test.test_parameters.SimpleTypesTestCase.test_byref_pointerpointer @ linux-x86_64 +ctypes.test.test_parameters.SimpleTypesTestCase.test_cstrings @ linux-x86_64 +ctypes.test.test_parameters.SimpleTypesTestCase.test_cw_strings @ linux-x86_64 +ctypes.test.test_parameters.SimpleTypesTestCase.test_int_pointers @ linux-x86_64 +ctypes.test.test_parameters.SimpleTypesTestCase.test_subclasses @ linux-x86_64 +ctypes.test.test_parameters.SimpleTypesTestCase.test_subclasses_c_wchar_p @ linux-x86_64 +ctypes.test.test_pickling.PickleTest_0.test_unpickable @ linux-x86_64 +ctypes.test.test_pickling.PickleTest_0.test_wchar @ linux-x86_64 +ctypes.test.test_pickling.PickleTest_1.test_unpickable @ linux-x86_64 +ctypes.test.test_pickling.PickleTest_1.test_wchar @ linux-x86_64 +ctypes.test.test_pickling.PickleTest_2.test_unpickable @ linux-x86_64 +ctypes.test.test_pickling.PickleTest_2.test_wchar @ linux-x86_64 +ctypes.test.test_pickling.PickleTest_3.test_unpickable @ linux-x86_64 +ctypes.test.test_pickling.PickleTest_3.test_wchar @ linux-x86_64 +ctypes.test.test_pickling.PickleTest_4.test_unpickable @ linux-x86_64 +ctypes.test.test_pickling.PickleTest_4.test_wchar @ linux-x86_64 +ctypes.test.test_pickling.PickleTest_5.test_unpickable @ linux-x86_64 +ctypes.test.test_pickling.PickleTest_5.test_wchar @ linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_abstract @ linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_basic @ linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_basics @ linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_bug_1467852 @ linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_callbacks_with_pointers @ linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_change_pointers @ linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_charpp @ linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_from_address @ linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_pass_pointers @ linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_pointer_crash @ linux-x86_64 +ctypes.test.test_pointers.PointersTestCase.test_pointer_type_name @ linux-x86_64 +ctypes.test.test_prototypes.ArrayTest.test @ linux-x86_64 +ctypes.test.test_prototypes.CharPointersTestCase.test_POINTER_c_char_arg @ linux-x86_64 +ctypes.test.test_prototypes.CharPointersTestCase.test_c_char_p_arg @ linux-x86_64 +ctypes.test.test_prototypes.CharPointersTestCase.test_c_void_p_arg @ linux-x86_64 +ctypes.test.test_prototypes.CharPointersTestCase.test_c_void_p_arg_with_c_wchar_p @ linux-x86_64 +ctypes.test.test_prototypes.WCharPointersTestCase.test_POINTER_c_wchar_arg @ linux-x86_64 +ctypes.test.test_prototypes.WCharPointersTestCase.test_c_wchar_p_arg @ linux-x86_64 +ctypes.test.test_python_api.PythonAPITestCase.test_PyBytes_FromStringAndSize @ linux-x86_64 +!ctypes.test.test_python_api.PythonAPITestCase.test_PyOS_snprintf @ linux-x86_64 +ctypes.test.test_returnfuncptrs.ReturnFuncPtrTestCase.test_from_dll @ linux-x86_64 +ctypes.test.test_returnfuncptrs.ReturnFuncPtrTestCase.test_from_dll_refcount @ linux-x86_64 +ctypes.test.test_simplesubclasses.Test.test_compare @ linux-x86_64 +ctypes.test.test_simplesubclasses.Test.test_int_struct @ linux-x86_64 +ctypes.test.test_sizes.SizesTestCase.test_16 @ linux-x86_64 +ctypes.test.test_sizes.SizesTestCase.test_32 @ linux-x86_64 +ctypes.test.test_sizes.SizesTestCase.test_64 @ linux-x86_64 +ctypes.test.test_sizes.SizesTestCase.test_8 @ linux-x86_64 +ctypes.test.test_sizes.SizesTestCase.test_size_t @ linux-x86_64 +ctypes.test.test_sizes.SizesTestCase.test_ssize_t @ linux-x86_64 +ctypes.test.test_slicing.SlicesTestCase.test_char_array @ linux-x86_64 +ctypes.test.test_slicing.SlicesTestCase.test_getslice_cint @ linux-x86_64 +ctypes.test.test_slicing.SlicesTestCase.test_setslice_cint @ linux-x86_64 +ctypes.test.test_stringptr.StringPtrTestCase.test__c_char_p @ linux-x86_64 +ctypes.test.test_stringptr.StringPtrTestCase.test_functions @ linux-x86_64 +ctypes.test.test_strings.StringArrayTestCase.test_c_buffer_raw @ linux-x86_64 +ctypes.test.test_strings.StringArrayTestCase.test_c_buffer_value @ linux-x86_64 +ctypes.test.test_strings.StringArrayTestCase.test_param_1 @ linux-x86_64 +ctypes.test.test_strings.StringArrayTestCase.test_param_2 @ linux-x86_64 +ctypes.test.test_strings.WStringArrayTestCase.test_nonbmp @ linux-x86_64 +ctypes.test.test_strings.WStringTestCase.test_wchar @ linux-x86_64 +ctypes.test.test_struct_fields.StructFieldsTestCase.test_1_A @ linux-x86_64 +ctypes.test.test_struct_fields.StructFieldsTestCase.test_1_B @ linux-x86_64 +ctypes.test.test_struct_fields.StructFieldsTestCase.test_2 @ linux-x86_64 +ctypes.test.test_struct_fields.StructFieldsTestCase.test_3 @ linux-x86_64 +ctypes.test.test_struct_fields.StructFieldsTestCase.test_4 @ linux-x86_64 +ctypes.test.test_struct_fields.StructFieldsTestCase.test___get__ @ linux-x86_64 +ctypes.test.test_struct_fields.StructFieldsTestCase.test___set__ @ linux-x86_64 +ctypes.test.test_structures.PointerMemberTestCase.test @ linux-x86_64 +ctypes.test.test_structures.PointerMemberTestCase.test_none_to_pointer_fields @ linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_38368 @ linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_abstract_class @ linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_conflicting_initializers @ linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_empty @ linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_fields @ linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_huge_field_name @ linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_initializers @ linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_invalid_field_types @ linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_invalid_name @ linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_keyword_initializers @ linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_methods @ linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_struct_alignment @ linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_structures_with_wchar @ linux-x86_64 +ctypes.test.test_structures.StructureTestCase.test_unions @ linux-x86_64 +ctypes.test.test_structures.TestRecursiveStructure.test_contains_itself @ linux-x86_64 +ctypes.test.test_structures.TestRecursiveStructure.test_vice_versa @ linux-x86_64 +ctypes.test.test_unaligned_structures.TestStructures.test_native @ linux-x86_64 +ctypes.test.test_unaligned_structures.TestStructures.test_swapped @ linux-x86_64 +ctypes.test.test_unicode.StringTestCase.test_buffers @ linux-x86_64 +ctypes.test.test_unicode.StringTestCase.test_embedded_null @ linux-x86_64 +ctypes.test.test_unicode.StringTestCase.test_func @ linux-x86_64 +ctypes.test.test_unicode.StringTestCase.test_wcslen @ linux-x86_64 +ctypes.test.test_unicode.UnicodeTestCase.test_embedded_null @ linux-x86_64 +ctypes.test.test_unicode.UnicodeTestCase.test_wcslen @ linux-x86_64 +ctypes.test.test_values.PythonValuesTestCase.test_undefined @ linux-x86_64 +ctypes.test.test_values.ValuesTestCase.test_undefined @ linux-x86_64 +ctypes.test.test_varsize_struct.VarSizeTest.test_array_invalid_length @ linux-x86_64 +ctypes.test.test_varsize_struct.VarSizeTest.test_zerosized_array @ linux-x86_64 +ctypes.test.test_wintypes.WinTypesTest.test_variant_bool @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dataclasses.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dataclasses.txt new file mode 100644 index 0000000000..7fe7338fcf --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dataclasses.txt @@ -0,0 +1,211 @@ +test.test_dataclasses.TestAbstract.test_abc_implementation @ linux-x86_64 +test.test_dataclasses.TestAbstract.test_maintain_abc @ linux-x86_64 +test.test_dataclasses.TestCase.test_0_field_compare @ linux-x86_64 +test.test_dataclasses.TestCase.test_1_field_compare @ linux-x86_64 +test.test_dataclasses.TestCase.test_alternate_classmethod_constructor @ linux-x86_64 +test.test_dataclasses.TestCase.test_class_attrs @ linux-x86_64 +test.test_dataclasses.TestCase.test_class_marker @ linux-x86_64 +test.test_dataclasses.TestCase.test_class_var @ linux-x86_64 +test.test_dataclasses.TestCase.test_class_var_default_factory @ linux-x86_64 +test.test_dataclasses.TestCase.test_class_var_frozen @ linux-x86_64 +test.test_dataclasses.TestCase.test_class_var_no_default @ linux-x86_64 +test.test_dataclasses.TestCase.test_class_var_with_default @ linux-x86_64 +test.test_dataclasses.TestCase.test_classvar_default_factory @ linux-x86_64 +test.test_dataclasses.TestCase.test_clean_traceback_from_fields_exception @ linux-x86_64 +test.test_dataclasses.TestCase.test_compare_subclasses @ linux-x86_64 +test.test_dataclasses.TestCase.test_dataclasses_pickleable @ linux-x86_64 +test.test_dataclasses.TestCase.test_dataclasses_qualnames @ linux-x86_64 +test.test_dataclasses.TestCase.test_default_factory @ linux-x86_64 +test.test_dataclasses.TestCase.test_default_factory_derived @ linux-x86_64 +test.test_dataclasses.TestCase.test_default_factory_not_called_if_value_given @ linux-x86_64 +test.test_dataclasses.TestCase.test_default_factory_with_no_init @ linux-x86_64 +test.test_dataclasses.TestCase.test_deliberately_mutable_defaults @ linux-x86_64 +test.test_dataclasses.TestCase.test_disallowed_mutable_defaults @ linux-x86_64 +test.test_dataclasses.TestCase.test_dont_include_other_annotations @ linux-x86_64 +test.test_dataclasses.TestCase.test_dynamic_class_creation @ linux-x86_64 +test.test_dataclasses.TestCase.test_dynamic_class_creation_using_field @ linux-x86_64 +test.test_dataclasses.TestCase.test_eq_order @ linux-x86_64 +test.test_dataclasses.TestCase.test_field_default @ linux-x86_64 +test.test_dataclasses.TestCase.test_field_default_default_factory_error @ linux-x86_64 +test.test_dataclasses.TestCase.test_field_metadata_custom_mapping @ linux-x86_64 +test.test_dataclasses.TestCase.test_field_metadata_default @ linux-x86_64 +test.test_dataclasses.TestCase.test_field_metadata_mapping @ linux-x86_64 +test.test_dataclasses.TestCase.test_field_named_BUILTINS_frozen @ linux-x86_64 +test.test_dataclasses.TestCase.test_field_named_like_builtin @ linux-x86_64 +test.test_dataclasses.TestCase.test_field_named_like_builtin_frozen @ linux-x86_64 +test.test_dataclasses.TestCase.test_field_named_object @ linux-x86_64 +test.test_dataclasses.TestCase.test_field_named_object_frozen @ linux-x86_64 +test.test_dataclasses.TestCase.test_field_named_self @ linux-x86_64 +test.test_dataclasses.TestCase.test_field_no_default @ linux-x86_64 +test.test_dataclasses.TestCase.test_field_order @ linux-x86_64 +test.test_dataclasses.TestCase.test_field_recursive_repr @ linux-x86_64 +test.test_dataclasses.TestCase.test_field_repr @ linux-x86_64 +test.test_dataclasses.TestCase.test_function_annotations @ linux-x86_64 +test.test_dataclasses.TestCase.test_generic_dataclasses @ linux-x86_64 +test.test_dataclasses.TestCase.test_generic_dynamic @ linux-x86_64 +test.test_dataclasses.TestCase.test_generic_extending @ linux-x86_64 +test.test_dataclasses.TestCase.test_hash_field_rules @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_asdict @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_asdict_builtin_containers @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_asdict_builtin_object_containers @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_asdict_copy_values @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_asdict_factory @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_asdict_namedtuple @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_asdict_namedtuple_derived @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_asdict_namedtuple_key @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_asdict_nested @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_asdict_raises_on_classes @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_astuple @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_astuple_builtin_containers @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_astuple_builtin_object_containers @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_astuple_copy_values @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_astuple_factory @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_astuple_namedtuple @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_astuple_nested @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_astuple_raises_on_classes @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_fields_exception @ linux-x86_64 +test.test_dataclasses.TestCase.test_helper_fields_with_class_instance @ linux-x86_64 +test.test_dataclasses.TestCase.test_init_false_no_default @ linux-x86_64 +test.test_dataclasses.TestCase.test_init_in_order @ linux-x86_64 +test.test_dataclasses.TestCase.test_init_var @ linux-x86_64 +test.test_dataclasses.TestCase.test_init_var_default_factory @ linux-x86_64 +test.test_dataclasses.TestCase.test_init_var_inheritance @ linux-x86_64 +test.test_dataclasses.TestCase.test_init_var_no_default @ linux-x86_64 +test.test_dataclasses.TestCase.test_init_var_preserve_type @ linux-x86_64 +test.test_dataclasses.TestCase.test_init_var_with_default @ linux-x86_64 +test.test_dataclasses.TestCase.test_intermediate_non_dataclass @ linux-x86_64 +test.test_dataclasses.TestCase.test_is_dataclass @ linux-x86_64 +test.test_dataclasses.TestCase.test_is_dataclass_genericalias @ linux-x86_64 +test.test_dataclasses.TestCase.test_is_dataclass_when_getattr_always_returns @ linux-x86_64 +test.test_dataclasses.TestCase.test_items_in_dicts @ linux-x86_64 +test.test_dataclasses.TestCase.test_missing_default @ linux-x86_64 +test.test_dataclasses.TestCase.test_missing_default_factory @ linux-x86_64 +test.test_dataclasses.TestCase.test_missing_repr @ linux-x86_64 +test.test_dataclasses.TestCase.test_named_init_params @ linux-x86_64 +test.test_dataclasses.TestCase.test_no_fields @ linux-x86_64 +test.test_dataclasses.TestCase.test_no_fields_but_member_variable @ linux-x86_64 +test.test_dataclasses.TestCase.test_no_options @ linux-x86_64 +test.test_dataclasses.TestCase.test_no_unhashable_default @ linux-x86_64 +test.test_dataclasses.TestCase.test_not_in_compare @ linux-x86_64 +test.test_dataclasses.TestCase.test_not_in_repr @ linux-x86_64 +test.test_dataclasses.TestCase.test_not_other_dataclass @ linux-x86_64 +test.test_dataclasses.TestCase.test_not_tuple @ linux-x86_64 +test.test_dataclasses.TestCase.test_one_field_no_default @ linux-x86_64 +test.test_dataclasses.TestCase.test_overwrite_fields_in_derived_class @ linux-x86_64 +test.test_dataclasses.TestCase.test_overwrite_hash @ linux-x86_64 +test.test_dataclasses.TestCase.test_post_init @ linux-x86_64 +test.test_dataclasses.TestCase.test_post_init_classmethod @ linux-x86_64 +test.test_dataclasses.TestCase.test_post_init_not_auto_added @ linux-x86_64 +test.test_dataclasses.TestCase.test_post_init_staticmethod @ linux-x86_64 +test.test_dataclasses.TestCase.test_post_init_super @ linux-x86_64 +test.test_dataclasses.TestCase.test_recursive_annotation @ linux-x86_64 +test.test_dataclasses.TestCase.test_simple_compare @ linux-x86_64 +test.test_dataclasses.TestCase.test_two_fields_one_default @ linux-x86_64 +test.test_dataclasses.TestDescriptors.test_default_value @ linux-x86_64 +test.test_dataclasses.TestDescriptors.test_getting_field_calls_get @ linux-x86_64 +test.test_dataclasses.TestDescriptors.test_init_calls_set @ linux-x86_64 +test.test_dataclasses.TestDescriptors.test_lookup_on_class @ linux-x86_64 +test.test_dataclasses.TestDescriptors.test_lookup_on_instance @ linux-x86_64 +test.test_dataclasses.TestDescriptors.test_no_default_value @ linux-x86_64 +test.test_dataclasses.TestDescriptors.test_non_descriptor @ linux-x86_64 +test.test_dataclasses.TestDescriptors.test_set_name @ linux-x86_64 +test.test_dataclasses.TestDescriptors.test_setting_field_calls_set @ linux-x86_64 +test.test_dataclasses.TestDescriptors.test_setting_uninitialized_descriptor_field @ linux-x86_64 +test.test_dataclasses.TestDocString.test_docstring_list_field @ linux-x86_64 +test.test_dataclasses.TestDocString.test_docstring_list_field_with_default_factory @ linux-x86_64 +test.test_dataclasses.TestDocString.test_docstring_no_fields @ linux-x86_64 +test.test_dataclasses.TestDocString.test_docstring_one_field @ linux-x86_64 +test.test_dataclasses.TestDocString.test_docstring_one_field_with_default @ linux-x86_64 +test.test_dataclasses.TestDocString.test_docstring_one_field_with_default_none @ linux-x86_64 +test.test_dataclasses.TestDocString.test_docstring_three_fields @ linux-x86_64 +test.test_dataclasses.TestDocString.test_docstring_two_fields @ linux-x86_64 +test.test_dataclasses.TestDocString.test_existing_docstring_not_overridden @ linux-x86_64 +test.test_dataclasses.TestEq.test_no_eq @ linux-x86_64 +test.test_dataclasses.TestEq.test_overwriting_eq @ linux-x86_64 +test.test_dataclasses.TestFieldNoAnnotation.test_field_without_annotation @ linux-x86_64 +test.test_dataclasses.TestFieldNoAnnotation.test_field_without_annotation_but_annotation_in_base @ linux-x86_64 +test.test_dataclasses.TestFieldNoAnnotation.test_field_without_annotation_but_annotation_in_base_not_dataclass @ linux-x86_64 +test.test_dataclasses.TestFrozen.test_frozen @ linux-x86_64 +test.test_dataclasses.TestFrozen.test_frozen_hash @ linux-x86_64 +test.test_dataclasses.TestFrozen.test_inherit @ linux-x86_64 +test.test_dataclasses.TestFrozen.test_inherit_from_normal_class @ linux-x86_64 +test.test_dataclasses.TestFrozen.test_inherit_frozen_from_nonfrozen @ linux-x86_64 +test.test_dataclasses.TestFrozen.test_inherit_nonfrozen_from_empty @ linux-x86_64 +test.test_dataclasses.TestFrozen.test_inherit_nonfrozen_from_empty_frozen @ linux-x86_64 +test.test_dataclasses.TestFrozen.test_inherit_nonfrozen_from_frozen @ linux-x86_64 +test.test_dataclasses.TestFrozen.test_non_frozen_normal_derived @ linux-x86_64 +test.test_dataclasses.TestFrozen.test_overwriting_frozen @ linux-x86_64 +test.test_dataclasses.TestHash.test_0_field_hash @ linux-x86_64 +test.test_dataclasses.TestHash.test_1_field_hash @ linux-x86_64 +test.test_dataclasses.TestHash.test_eq_only @ linux-x86_64 +test.test_dataclasses.TestHash.test_hash_no_args @ linux-x86_64 +test.test_dataclasses.TestHash.test_hash_rules @ linux-x86_64 +test.test_dataclasses.TestHash.test_unsafe_hash @ linux-x86_64 +test.test_dataclasses.TestInit.test_base_has_init @ linux-x86_64 +test.test_dataclasses.TestInit.test_inherit_from_protocol @ linux-x86_64 +test.test_dataclasses.TestInit.test_no_init @ linux-x86_64 +test.test_dataclasses.TestInit.test_overwriting_init @ linux-x86_64 +test.test_dataclasses.TestKeywordArgs.test_KW_ONLY @ linux-x86_64 +test.test_dataclasses.TestKeywordArgs.test_KW_ONLY_as_string @ linux-x86_64 +test.test_dataclasses.TestKeywordArgs.test_KW_ONLY_twice @ linux-x86_64 +test.test_dataclasses.TestKeywordArgs.test_defaults @ linux-x86_64 +test.test_dataclasses.TestKeywordArgs.test_field_marked_as_kwonly @ linux-x86_64 +test.test_dataclasses.TestKeywordArgs.test_make_dataclass @ linux-x86_64 +test.test_dataclasses.TestKeywordArgs.test_match_args @ linux-x86_64 +test.test_dataclasses.TestKeywordArgs.test_no_classvar_kwarg @ linux-x86_64 +test.test_dataclasses.TestKeywordArgs.test_post_init @ linux-x86_64 +test.test_dataclasses.TestMakeDataclass.test_base @ linux-x86_64 +test.test_dataclasses.TestMakeDataclass.test_base_dataclass @ linux-x86_64 +test.test_dataclasses.TestMakeDataclass.test_class_var @ linux-x86_64 +test.test_dataclasses.TestMakeDataclass.test_duplicate_field_names @ linux-x86_64 +test.test_dataclasses.TestMakeDataclass.test_funny_class_names_names @ linux-x86_64 +test.test_dataclasses.TestMakeDataclass.test_init_var @ linux-x86_64 +test.test_dataclasses.TestMakeDataclass.test_invalid_type_specification @ linux-x86_64 +test.test_dataclasses.TestMakeDataclass.test_keyword_field_names @ linux-x86_64 +test.test_dataclasses.TestMakeDataclass.test_no_mutate_namespace @ linux-x86_64 +test.test_dataclasses.TestMakeDataclass.test_no_types @ linux-x86_64 +test.test_dataclasses.TestMakeDataclass.test_non_identifier_field_names @ linux-x86_64 +test.test_dataclasses.TestMakeDataclass.test_other_params @ linux-x86_64 +test.test_dataclasses.TestMakeDataclass.test_simple @ linux-x86_64 +test.test_dataclasses.TestMakeDataclass.test_underscore_field_names @ linux-x86_64 +test.test_dataclasses.TestMatchArgs.test_bpo_43764 @ linux-x86_64 +test.test_dataclasses.TestMatchArgs.test_explicit_match_args @ linux-x86_64 +test.test_dataclasses.TestMatchArgs.test_make_dataclasses @ linux-x86_64 +test.test_dataclasses.TestMatchArgs.test_match_args @ linux-x86_64 +test.test_dataclasses.TestMatchArgs.test_match_args_argument @ linux-x86_64 +test.test_dataclasses.TestOrdering.test_functools_total_ordering @ linux-x86_64 +test.test_dataclasses.TestOrdering.test_no_order @ linux-x86_64 +test.test_dataclasses.TestOrdering.test_overwriting_order @ linux-x86_64 +test.test_dataclasses.TestReplace.test @ linux-x86_64 +test.test_dataclasses.TestReplace.test_classvar @ linux-x86_64 +test.test_dataclasses.TestReplace.test_frozen @ linux-x86_64 +test.test_dataclasses.TestReplace.test_initvar_is_specified @ linux-x86_64 +test.test_dataclasses.TestReplace.test_initvar_with_default_value @ linux-x86_64 +test.test_dataclasses.TestReplace.test_invalid_field_name @ linux-x86_64 +test.test_dataclasses.TestReplace.test_invalid_object @ linux-x86_64 +test.test_dataclasses.TestReplace.test_no_init @ linux-x86_64 +test.test_dataclasses.TestReplace.test_recursive_repr @ linux-x86_64 +test.test_dataclasses.TestReplace.test_recursive_repr_indirection @ linux-x86_64 +test.test_dataclasses.TestReplace.test_recursive_repr_indirection_two @ linux-x86_64 +test.test_dataclasses.TestReplace.test_recursive_repr_misc_attrs @ linux-x86_64 +test.test_dataclasses.TestReplace.test_recursive_repr_two_attrs @ linux-x86_64 +test.test_dataclasses.TestRepr.test_no_repr @ linux-x86_64 +test.test_dataclasses.TestRepr.test_overwriting_repr @ linux-x86_64 +test.test_dataclasses.TestRepr.test_repr @ linux-x86_64 +test.test_dataclasses.TestSlots.test_add_slots_when_slots_exists @ linux-x86_64 +test.test_dataclasses.TestSlots.test_derived_added_field @ linux-x86_64 +test.test_dataclasses.TestSlots.test_frozen_pickle @ linux-x86_64 +test.test_dataclasses.TestSlots.test_frozen_slots_pickle_custom_state @ linux-x86_64 +test.test_dataclasses.TestSlots.test_generated_slots @ linux-x86_64 +test.test_dataclasses.TestSlots.test_returns_new_class @ linux-x86_64 +test.test_dataclasses.TestSlots.test_simple @ linux-x86_64 +test.test_dataclasses.TestSlots.test_slots_with_default_factory_no_init @ linux-x86_64 +test.test_dataclasses.TestSlots.test_slots_with_default_no_init @ linux-x86_64 +test.test_dataclasses.TestSlots.test_weakref_slot_make_dataclass @ linux-x86_64 +test.test_dataclasses.TestSlots.test_weakref_slot_without_slot @ linux-x86_64 +test.test_dataclasses.TestStringAnnotations.test_classvar @ linux-x86_64 +test.test_dataclasses.TestStringAnnotations.test_classvar_module_level_import @ linux-x86_64 +test.test_dataclasses.TestStringAnnotations.test_initvar @ linux-x86_64 +test.test_dataclasses.TestStringAnnotations.test_isnt_classvar @ linux-x86_64 +test.test_dataclasses.TestStringAnnotations.test_isnt_initvar @ linux-x86_64 +test.test_dataclasses.TestStringAnnotations.test_text_annotations @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dbm.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dbm.txt new file mode 100644 index 0000000000..c60e90da92 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dbm.txt @@ -0,0 +1,14 @@ +test.test_dbm.TestCase_dumb.test_anydbm_access @ linux-x86_64 +test.test_dbm.TestCase_dumb.test_anydbm_creation @ linux-x86_64 +test.test_dbm.TestCase_dumb.test_anydbm_creation_n_file_exists_with_invalid_contents @ linux-x86_64 +test.test_dbm.TestCase_dumb.test_anydbm_keys @ linux-x86_64 +test.test_dbm.TestCase_dumb.test_anydbm_modification @ linux-x86_64 +test.test_dbm.TestCase_dumb.test_anydbm_not_existing @ linux-x86_64 +test.test_dbm.TestCase_dumb.test_anydbm_read @ linux-x86_64 +test.test_dbm.TestCase_dumb.test_empty_value @ linux-x86_64 +test.test_dbm.TestCase_dumb.test_error @ linux-x86_64 +test.test_dbm.TestCase_dumb.test_keys @ linux-x86_64 +test.test_dbm.TestCase_dumb.test_open_with_bytes @ linux-x86_64 +test.test_dbm.TestCase_dumb.test_open_with_pathlib_path @ linux-x86_64 +test.test_dbm.TestCase_dumb.test_open_with_pathlib_path_bytes @ linux-x86_64 +test.test_dbm.WhichDBTestCase.test_whichdb @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dbm_dumb.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dbm_dumb.txt new file mode 100644 index 0000000000..8cb718bcaf --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dbm_dumb.txt @@ -0,0 +1,24 @@ +test.test_dbm_dumb.DumbDBMTestCase.test_check_closed @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_close_twice @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_context_manager @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_create_new @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_dumbdbm_creation @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_dumbdbm_creation_mode @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_dumbdbm_keys @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_dumbdbm_modification @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_dumbdbm_read @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_eval @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_invalid_flag @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_line_endings @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_missing_data @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_missing_index @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_nonascii_filename @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_open_with_bytes_path @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_open_with_pathlib_bytes_path @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_open_with_pathlib_path @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_random @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_readonly_files @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_str_read @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_str_write_contains @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_write_contains @ linux-x86_64 +test.test_dbm_dumb.DumbDBMTestCase.test_write_write_read @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_decimal.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_decimal.txt new file mode 100644 index 0000000000..8a06c4ae72 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_decimal.txt @@ -0,0 +1,372 @@ +DocTestCase.decimal @ linux-x86_64 +DocTestCase.decimal.Context.abs @ linux-x86_64 +DocTestCase.decimal.Context.add @ linux-x86_64 +DocTestCase.decimal.Context.canonical @ linux-x86_64 +DocTestCase.decimal.Context.compare @ linux-x86_64 +DocTestCase.decimal.Context.compare_signal @ linux-x86_64 +DocTestCase.decimal.Context.compare_total @ linux-x86_64 +DocTestCase.decimal.Context.copy_abs @ linux-x86_64 +DocTestCase.decimal.Context.copy_decimal @ linux-x86_64 +DocTestCase.decimal.Context.copy_negate @ linux-x86_64 +DocTestCase.decimal.Context.copy_sign @ linux-x86_64 +DocTestCase.decimal.Context.create_decimal_from_float @ linux-x86_64 +DocTestCase.decimal.Context.divide @ linux-x86_64 +DocTestCase.decimal.Context.divide_int @ linux-x86_64 +DocTestCase.decimal.Context.divmod @ linux-x86_64 +DocTestCase.decimal.Context.exp @ linux-x86_64 +DocTestCase.decimal.Context.fma @ linux-x86_64 +DocTestCase.decimal.Context.is_canonical @ linux-x86_64 +DocTestCase.decimal.Context.is_finite @ linux-x86_64 +DocTestCase.decimal.Context.is_infinite @ linux-x86_64 +DocTestCase.decimal.Context.is_nan @ linux-x86_64 +DocTestCase.decimal.Context.is_normal @ linux-x86_64 +DocTestCase.decimal.Context.is_qnan @ linux-x86_64 +DocTestCase.decimal.Context.is_signed @ linux-x86_64 +DocTestCase.decimal.Context.is_snan @ linux-x86_64 +DocTestCase.decimal.Context.is_subnormal @ linux-x86_64 +DocTestCase.decimal.Context.is_zero @ linux-x86_64 +DocTestCase.decimal.Context.ln @ linux-x86_64 +DocTestCase.decimal.Context.log10 @ linux-x86_64 +DocTestCase.decimal.Context.logb @ linux-x86_64 +DocTestCase.decimal.Context.logical_and @ linux-x86_64 +DocTestCase.decimal.Context.logical_invert @ linux-x86_64 +DocTestCase.decimal.Context.logical_or @ linux-x86_64 +DocTestCase.decimal.Context.logical_xor @ linux-x86_64 +DocTestCase.decimal.Context.max @ linux-x86_64 +DocTestCase.decimal.Context.max_mag @ linux-x86_64 +DocTestCase.decimal.Context.min @ linux-x86_64 +DocTestCase.decimal.Context.min_mag @ linux-x86_64 +DocTestCase.decimal.Context.minus @ linux-x86_64 +DocTestCase.decimal.Context.multiply @ linux-x86_64 +DocTestCase.decimal.Context.next_minus @ linux-x86_64 +DocTestCase.decimal.Context.next_plus @ linux-x86_64 +DocTestCase.decimal.Context.next_toward @ linux-x86_64 +DocTestCase.decimal.Context.normalize @ linux-x86_64 +DocTestCase.decimal.Context.number_class @ linux-x86_64 +DocTestCase.decimal.Context.plus @ linux-x86_64 +DocTestCase.decimal.Context.power @ linux-x86_64 +DocTestCase.decimal.Context.quantize @ linux-x86_64 +DocTestCase.decimal.Context.radix @ linux-x86_64 +DocTestCase.decimal.Context.remainder @ linux-x86_64 +DocTestCase.decimal.Context.remainder_near @ linux-x86_64 +DocTestCase.decimal.Context.rotate @ linux-x86_64 +DocTestCase.decimal.Context.same_quantum @ linux-x86_64 +DocTestCase.decimal.Context.scaleb @ linux-x86_64 +DocTestCase.decimal.Context.shift @ linux-x86_64 +DocTestCase.decimal.Context.sqrt @ linux-x86_64 +DocTestCase.decimal.Context.subtract @ linux-x86_64 +DocTestCase.decimal.Context.to_eng_string @ linux-x86_64 +DocTestCase.decimal.Context.to_integral_exact @ linux-x86_64 +DocTestCase.decimal.Context.to_integral_value @ linux-x86_64 +DocTestCase.decimal.Decimal.__new__ @ linux-x86_64 +DocTestCase.decimal.Decimal.__round__ @ linux-x86_64 +DocTestCase.decimal.Decimal.as_integer_ratio @ linux-x86_64 +DocTestCase.decimal.Decimal.from_float @ linux-x86_64 +DocTestCase.decimal.localcontext @ linux-x86_64 +test.test_decimal.PyArithmeticOperatorsTest.test_addition @ linux-x86_64 +test.test_decimal.PyArithmeticOperatorsTest.test_copy_sign @ linux-x86_64 +test.test_decimal.PyArithmeticOperatorsTest.test_division @ linux-x86_64 +test.test_decimal.PyArithmeticOperatorsTest.test_floor_div_module @ linux-x86_64 +test.test_decimal.PyArithmeticOperatorsTest.test_floor_division @ linux-x86_64 +test.test_decimal.PyArithmeticOperatorsTest.test_module @ linux-x86_64 +test.test_decimal.PyArithmeticOperatorsTest.test_multiplication @ linux-x86_64 +test.test_decimal.PyArithmeticOperatorsTest.test_nan_comparisons @ linux-x86_64 +test.test_decimal.PyArithmeticOperatorsTest.test_powering @ linux-x86_64 +test.test_decimal.PyArithmeticOperatorsTest.test_subtraction @ linux-x86_64 +test.test_decimal.PyArithmeticOperatorsTest.test_unary_operators @ linux-x86_64 +test.test_decimal.PyContextAPItests.test__clamp @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_abs @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_add @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_compare @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_compare_signal @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_compare_total @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_compare_total_mag @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_copy @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_copy_abs @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_copy_decimal @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_copy_negate @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_copy_sign @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_divide @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_divide_int @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_divmod @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_equality_with_other_types @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_exp @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_fma @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_is_finite @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_is_infinite @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_is_nan @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_is_normal @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_is_qnan @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_is_signed @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_is_snan @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_is_subnormal @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_is_zero @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_ln @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_log10 @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_logb @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_logical_and @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_logical_invert @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_logical_or @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_logical_xor @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_max @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_max_mag @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_min @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_min_mag @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_minus @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_multiply @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_next_minus @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_next_plus @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_next_toward @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_none_args @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_normalize @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_number_class @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_pickle @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_plus @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_power @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_quantize @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_remainder @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_remainder_near @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_rotate @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_same_quantum @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_scaleb @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_shift @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_sqrt @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_subtract @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_to_eng_string @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_to_integral_exact @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_to_integral_value @ linux-x86_64 +test.test_decimal.PyContextAPItests.test_to_sci_string @ linux-x86_64 +test.test_decimal.PyContextFlags.test_flag_comparisons @ linux-x86_64 +test.test_decimal.PyContextFlags.test_flags_irrelevant @ linux-x86_64 +test.test_decimal.PyContextFlags.test_float_comparison @ linux-x86_64 +test.test_decimal.PyContextFlags.test_float_operation @ linux-x86_64 +test.test_decimal.PyContextFlags.test_float_operation_default @ linux-x86_64 +test.test_decimal.PyContextInputValidation.test_invalid_context @ linux-x86_64 +test.test_decimal.PyContextSubclassing.test_context_subclassing @ linux-x86_64 +test.test_decimal.PyContextWithStatement.test_local_context_kwargs_does_not_overwrite_existing_argument @ linux-x86_64 +test.test_decimal.PyContextWithStatement.test_localcontext @ linux-x86_64 +test.test_decimal.PyContextWithStatement.test_localcontext_kwargs @ linux-x86_64 +test.test_decimal.PyContextWithStatement.test_localcontextarg @ linux-x86_64 +test.test_decimal.PyContextWithStatement.test_nested_with_statements @ linux-x86_64 +test.test_decimal.PyContextWithStatement.test_with_statements_gc1 @ linux-x86_64 +test.test_decimal.PyContextWithStatement.test_with_statements_gc2 @ linux-x86_64 +test.test_decimal.PyContextWithStatement.test_with_statements_gc3 @ linux-x86_64 +test.test_decimal.PyCoverage.test_adjusted @ linux-x86_64 +test.test_decimal.PyCoverage.test_canonical @ linux-x86_64 +test.test_decimal.PyCoverage.test_context_repr @ linux-x86_64 +test.test_decimal.PyCoverage.test_copy @ linux-x86_64 +test.test_decimal.PyCoverage.test_create_decimal @ linux-x86_64 +test.test_decimal.PyCoverage.test_divmod @ linux-x86_64 +test.test_decimal.PyCoverage.test_implicit_context @ linux-x86_64 +test.test_decimal.PyCoverage.test_int @ linux-x86_64 +test.test_decimal.PyCoverage.test_power @ linux-x86_64 +test.test_decimal.PyCoverage.test_quantize @ linux-x86_64 +test.test_decimal.PyCoverage.test_radix @ linux-x86_64 +test.test_decimal.PyCoverage.test_rop @ linux-x86_64 +test.test_decimal.PyCoverage.test_round @ linux-x86_64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_context_create_decimal @ linux-x86_64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_context_create_from_float @ linux-x86_64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_empty @ linux-x86_64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_from_Decimal @ linux-x86_64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_from_None @ linux-x86_64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_from_bool @ linux-x86_64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_from_float @ linux-x86_64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_from_int @ linux-x86_64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_from_list @ linux-x86_64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_from_string @ linux-x86_64 +test.test_decimal.PyExplicitConstructionTest.test_explicit_from_tuples @ linux-x86_64 +test.test_decimal.PyExplicitConstructionTest.test_unicode_digits @ linux-x86_64 +test.test_decimal.PyFormatTest.test_decimal_from_float_argument_type @ linux-x86_64 +test.test_decimal.PyFormatTest.test_formatting @ linux-x86_64 +test.test_decimal.PyFormatTest.test_n_format @ linux-x86_64 +test.test_decimal.PyFormatTest.test_negative_zero_bad_format @ linux-x86_64 +test.test_decimal.PyFormatTest.test_negative_zero_format_directed_rounding @ linux-x86_64 +test.test_decimal.PyFormatTest.test_wide_char_separator_decimal_point @ linux-x86_64 +test.test_decimal.PyFunctionality.test_py_alternate_formatting @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_abs @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_add @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_and @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_base @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_clamp @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_class @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_compare @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_comparetotal @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_comparetotmag @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_copy @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_copyabs @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_copynegate @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_copysign @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddAbs @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddAdd @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddAnd @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddBase @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddCanonical @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddClass @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddCompare @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddCompareSig @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddCompareTotal @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddCompareTotalMag @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddCopy @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddCopyAbs @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddCopyNegate @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddCopySign @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddDivide @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddDivideInt @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddEncode @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddFMA @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddInvert @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddLogB @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddMax @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddMaxMag @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddMin @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddMinMag @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddMinus @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddMultiply @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddNextMinus @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddNextPlus @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddNextToward @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddOr @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddPlus @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddQuantize @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddReduce @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddRemainder @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddRemainderNear @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddRotate @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddSameQuantum @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddScaleB @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddShift @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddSubtract @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddToIntegral @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ddXor @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_decDouble @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_decQuad @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_decSingle @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_divide @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_divideint @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqAbs @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqAdd @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqAnd @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqBase @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqCanonical @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqClass @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqCompare @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqCompareSig @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqCompareTotal @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqCompareTotalMag @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqCopy @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqCopyAbs @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqCopyNegate @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqCopySign @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqDivide @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqDivideInt @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqEncode @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqFMA @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqInvert @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqLogB @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqMax @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqMaxMag @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqMin @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqMinMag @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqMinus @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqMultiply @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqNextMinus @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqNextPlus @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqNextToward @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqOr @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqPlus @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqQuantize @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqReduce @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqRemainder @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqRemainderNear @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqRotate @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqSameQuantum @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqScaleB @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqShift @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqSubtract @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqToIntegral @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dqXor @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dsBase @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_dsEncode @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_exp @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_extra @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_fma @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_inexact @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_invert @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_ln @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_log10 @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_logb @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_max @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_maxmag @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_min @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_minmag @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_minus @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_multiply @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_nextminus @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_nextplus @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_nexttoward @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_or @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_plus @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_power @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_powersqrt @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_quantize @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_randomBound32 @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_randoms @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_reduce @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_remainder @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_remainderNear @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_rescale @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_rotate @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_rounding @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_samequantum @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_scaleb @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_shift @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_squareroot @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_subtract @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_testall @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_tointegral @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_tointegralx @ linux-x86_64 +test.test_decimal.PyIBMTestCases.test_xor @ linux-x86_64 +test.test_decimal.PyImplicitConstructionTest.test_implicit_from_Decimal @ linux-x86_64 +test.test_decimal.PyImplicitConstructionTest.test_implicit_from_None @ linux-x86_64 +test.test_decimal.PyImplicitConstructionTest.test_implicit_from_float @ linux-x86_64 +test.test_decimal.PyImplicitConstructionTest.test_implicit_from_int @ linux-x86_64 +test.test_decimal.PyImplicitConstructionTest.test_implicit_from_string @ linux-x86_64 +test.test_decimal.PyImplicitConstructionTest.test_rop @ linux-x86_64 +test.test_decimal.PyPythonAPItests.test_abc @ linux-x86_64 +test.test_decimal.PyPythonAPItests.test_complex @ linux-x86_64 +test.test_decimal.PyPythonAPItests.test_create_decimal_from_float @ linux-x86_64 +test.test_decimal.PyPythonAPItests.test_exception_hierarchy @ linux-x86_64 +test.test_decimal.PyPythonAPItests.test_from_float @ linux-x86_64 +test.test_decimal.PyPythonAPItests.test_int @ linux-x86_64 +test.test_decimal.PyPythonAPItests.test_named_parameters @ linux-x86_64 +test.test_decimal.PyPythonAPItests.test_pickle @ linux-x86_64 +test.test_decimal.PyPythonAPItests.test_quantize @ linux-x86_64 +test.test_decimal.PyPythonAPItests.test_trunc @ linux-x86_64 +test.test_decimal.PySpecialContexts.test_context_templates @ linux-x86_64 +test.test_decimal.PySpecialContexts.test_default_context @ linux-x86_64 +test.test_decimal.PyThreadingTest.test_threading @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_as_integer_ratio @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_as_nonzero @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_as_tuple @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_comparison_operators @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_conversions_from_int @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_copy_and_deepcopy_methods @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_decimal_complex_comparison @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_decimal_float_comparison @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_decimal_fraction_comparison @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_eval_round_trip @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_hash_method @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_hash_method_nan @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_implicit_context @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_min_and_max_methods @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_nan_to_float @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_none_args @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_snan_to_float @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_subclassing @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_tonum_methods @ linux-x86_64 +test.test_decimal.PyUsabilityTest.test_tostring_methods @ linux-x86_64 +test.test_decimal.PyWhitebox.test_py__round @ linux-x86_64 +test.test_decimal.PyWhitebox.test_py_decimal_id @ linux-x86_64 +test.test_decimal.PyWhitebox.test_py_exact_power @ linux-x86_64 +test.test_decimal.PyWhitebox.test_py_immutability_operations @ linux-x86_64 +test.test_decimal.PyWhitebox.test_py_rescale @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_decorators.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_decorators.txt new file mode 100644 index 0000000000..fe2c3b183a --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_decorators.txt @@ -0,0 +1,16 @@ +test.test_decorators.TestClassDecorators.test_double @ linux-x86_64 +test.test_decorators.TestClassDecorators.test_order @ linux-x86_64 +test.test_decorators.TestClassDecorators.test_simple @ linux-x86_64 +test.test_decorators.TestDecorators.test_argforms @ linux-x86_64 +test.test_decorators.TestDecorators.test_bound_function_inside_classmethod @ linux-x86_64 +test.test_decorators.TestDecorators.test_dbcheck @ linux-x86_64 +test.test_decorators.TestDecorators.test_dotted @ linux-x86_64 +test.test_decorators.TestDecorators.test_double @ linux-x86_64 +test.test_decorators.TestDecorators.test_errors @ linux-x86_64 +test.test_decorators.TestDecorators.test_eval_order @ linux-x86_64 +test.test_decorators.TestDecorators.test_expressions @ linux-x86_64 +test.test_decorators.TestDecorators.test_memoize @ linux-x86_64 +test.test_decorators.TestDecorators.test_order @ linux-x86_64 +test.test_decorators.TestDecorators.test_single @ linux-x86_64 +test.test_decorators.TestDecorators.test_staticmethod @ linux-x86_64 +test.test_decorators.TestDecorators.test_wrapped_classmethod_inside_classmethod @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_defaultdict.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_defaultdict.txt new file mode 100644 index 0000000000..0180d51c34 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_defaultdict.txt @@ -0,0 +1,10 @@ +test.test_defaultdict.TestDefaultDict.test_basic @ linux-x86_64 +test.test_defaultdict.TestDefaultDict.test_callable_arg @ linux-x86_64 +test.test_defaultdict.TestDefaultDict.test_copy @ linux-x86_64 +test.test_defaultdict.TestDefaultDict.test_deep_copy @ linux-x86_64 +test.test_defaultdict.TestDefaultDict.test_keyerror_without_factory @ linux-x86_64 +test.test_defaultdict.TestDefaultDict.test_missing @ linux-x86_64 +test.test_defaultdict.TestDefaultDict.test_pickling @ linux-x86_64 +test.test_defaultdict.TestDefaultDict.test_repr @ linux-x86_64 +test.test_defaultdict.TestDefaultDict.test_shallow_copy @ linux-x86_64 +test.test_defaultdict.TestDefaultDict.test_union @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_deque.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_deque.txt new file mode 100644 index 0000000000..7349540e6c --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_deque.txt @@ -0,0 +1,73 @@ +DocTestCase.test.test_deque.__test__.libreftest @ linux-x86_64 +test.test_deque.TestBasic.test_add @ linux-x86_64 +test.test_deque.TestBasic.test_basics @ linux-x86_64 +test.test_deque.TestBasic.test_big_queue_popleft @ linux-x86_64 +test.test_deque.TestBasic.test_big_queue_popright @ linux-x86_64 +test.test_deque.TestBasic.test_big_stack_left @ linux-x86_64 +test.test_deque.TestBasic.test_big_stack_right @ linux-x86_64 +test.test_deque.TestBasic.test_clear @ linux-x86_64 +test.test_deque.TestBasic.test_comparisons @ linux-x86_64 +test.test_deque.TestBasic.test_contains @ linux-x86_64 +test.test_deque.TestBasic.test_contains_count_stop_crashes @ linux-x86_64 +test.test_deque.TestBasic.test_copy @ linux-x86_64 +test.test_deque.TestBasic.test_copy_method @ linux-x86_64 +test.test_deque.TestBasic.test_count @ linux-x86_64 +test.test_deque.TestBasic.test_deepcopy @ linux-x86_64 +test.test_deque.TestBasic.test_delitem @ linux-x86_64 +test.test_deque.TestBasic.test_extend @ linux-x86_64 +test.test_deque.TestBasic.test_extendleft @ linux-x86_64 +test.test_deque.TestBasic.test_gc_doesnt_blowup @ linux-x86_64 +test.test_deque.TestBasic.test_getitem @ linux-x86_64 +test.test_deque.TestBasic.test_hash @ linux-x86_64 +test.test_deque.TestBasic.test_iadd @ linux-x86_64 +test.test_deque.TestBasic.test_imul @ linux-x86_64 +test.test_deque.TestBasic.test_index @ linux-x86_64 +test.test_deque.TestBasic.test_index_bug_24913 @ linux-x86_64 +test.test_deque.TestBasic.test_init @ linux-x86_64 +test.test_deque.TestBasic.test_insert @ linux-x86_64 +test.test_deque.TestBasic.test_insert_bug_26194 @ linux-x86_64 +test.test_deque.TestBasic.test_iterator_pickle @ linux-x86_64 +test.test_deque.TestBasic.test_len @ linux-x86_64 +test.test_deque.TestBasic.test_long_steadystate_queue_popleft @ linux-x86_64 +test.test_deque.TestBasic.test_long_steadystate_queue_popright @ linux-x86_64 +test.test_deque.TestBasic.test_maxlen @ linux-x86_64 +test.test_deque.TestBasic.test_maxlen_attribute @ linux-x86_64 +test.test_deque.TestBasic.test_maxlen_zero @ linux-x86_64 +test.test_deque.TestBasic.test_mul @ linux-x86_64 +test.test_deque.TestBasic.test_pickle @ linux-x86_64 +test.test_deque.TestBasic.test_pickle_recursive @ linux-x86_64 +test.test_deque.TestBasic.test_remove @ linux-x86_64 +test.test_deque.TestBasic.test_repr @ linux-x86_64 +test.test_deque.TestBasic.test_reverse @ linux-x86_64 +test.test_deque.TestBasic.test_reversed @ linux-x86_64 +test.test_deque.TestBasic.test_reversed_new @ linux-x86_64 +test.test_deque.TestBasic.test_rotate @ linux-x86_64 +test.test_deque.TestBasic.test_roundtrip_iter_init @ linux-x86_64 +test.test_deque.TestBasic.test_setitem @ linux-x86_64 +test.test_deque.TestBasic.test_underflow @ linux-x86_64 +test.test_deque.TestSequence.test_addmul @ linux-x86_64 +test.test_deque.TestSequence.test_constructors @ linux-x86_64 +test.test_deque.TestSequence.test_contains @ linux-x86_64 +test.test_deque.TestSequence.test_contains_fake @ linux-x86_64 +test.test_deque.TestSequence.test_contains_order @ linux-x86_64 +test.test_deque.TestSequence.test_count @ linux-x86_64 +test.test_deque.TestSequence.test_getitem @ linux-x86_64 +test.test_deque.TestSequence.test_getitemoverwriteiter @ linux-x86_64 +test.test_deque.TestSequence.test_getslice @ linux-x86_64 +test.test_deque.TestSequence.test_iadd @ linux-x86_64 +test.test_deque.TestSequence.test_imul @ linux-x86_64 +test.test_deque.TestSequence.test_index @ linux-x86_64 +test.test_deque.TestSequence.test_len @ linux-x86_64 +test.test_deque.TestSequence.test_minmax @ linux-x86_64 +test.test_deque.TestSequence.test_pickle @ linux-x86_64 +test.test_deque.TestSequence.test_repeat @ linux-x86_64 +test.test_deque.TestSequence.test_subscript @ linux-x86_64 +test.test_deque.TestSequence.test_truth @ linux-x86_64 +test.test_deque.TestSubclass.test_basics @ linux-x86_64 +test.test_deque.TestSubclass.test_copy_pickle @ linux-x86_64 +test.test_deque.TestSubclass.test_pickle_recursive @ linux-x86_64 +test.test_deque.TestSubclass.test_strange_subclass @ linux-x86_64 +test.test_deque.TestSubclassWithKwargs.test_subclass_with_kwargs @ linux-x86_64 +test.test_deque.TestVariousIteratorArgs.test_constructor @ linux-x86_64 +test.test_deque.TestVariousIteratorArgs.test_iter_with_altered_data @ linux-x86_64 +test.test_deque.TestVariousIteratorArgs.test_runtime_error_on_empty_deque @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_descr.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_descr.txt new file mode 100644 index 0000000000..e254f464db --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_descr.txt @@ -0,0 +1,126 @@ +test.test_descr.AAAPTypesLongInitTest.test_pytype_long_ready @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_abstractmethods @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_altmro @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_assign_slice @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_attr_raise_through_property @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_basic_inheritance @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_binary_operator_override @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_bound_method_repr @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_bpo25750 @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_buffer_inheritance @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_builtin_bases @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_builtin_function_or_method @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_carloverre @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_carloverre_multi_inherit_valid @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_classic @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_classic_comparisons @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_classmethods @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_consistency_with_epg @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_copy_setstate @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_deepcopy_recursive @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_diamond_inheritance @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_dict_constructors @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_dir @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_doc_descriptor @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_dynamics @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_errors @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_evil_type_name @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_ex5_from_c3_switch @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_file_fault @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_funny_new @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_getattr_hooks @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_hash_inheritance @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_imul_bug @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_init @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_ipow @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_ipow_exception_text @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_ipow_returns_not_implemented @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_isinst_isclass @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_keyword_arguments @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_keywords @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_load_attr_extended_arg @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_metaclass @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_method_wrapper @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_methods @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_mixing_slot_wrappers @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_module_subclasses @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_monotonicity @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_mro_disagreement @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_multiple_inheritance @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_mutable_bases @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_mutable_bases_catch_mro_conflict @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_mutable_bases_with_failing_mro @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_mutable_names @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_newslots @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_no_ipow @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_not_implemented @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_object_class @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_object_class_assignment_between_heaptypes_and_nonheaptypes @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_object_new @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_object_new_and_init_with_parameters @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_overloading @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_proxy_call @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_proxy_super @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_python_dicts @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_python_lists @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_qualname @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_qualname_dict @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_recursive_call @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_repr_with_module_str_subclass @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_rich_comparisons @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_rmul @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_set_and_no_get @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_set_class @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_set_dict @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_set_doc @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_slices @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_slot_shadows_class_variable @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_slots @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_slots_descriptor @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_slots_multiple_inheritance @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_slots_special @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_slots_special2 @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_slots_trash @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_special_method_lookup @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_special_unbound_method_types @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_specials @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_staticmethods @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_str_of_str_subclass @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_str_operations @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_str_subclass_as_dict_key @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_subclass_propagation @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_subclass_right_op @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_subclassing_does_not_duplicate_dict_descriptors @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_supers @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_type___getattribute__ @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_uninitialized_modules @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_unsubclassable_types @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_vicious_descriptor_nonsense @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_weakref_segfault @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_wrapper_segfault @ linux-x86_64 +test.test_descr.ClassPropertiesAndMethods.test_wrong_class_slot_wrapper @ linux-x86_64 +test.test_descr.DictProxyTests.test_dict_type_with_metaclass @ linux-x86_64 +test.test_descr.DictProxyTests.test_iter_items @ linux-x86_64 +test.test_descr.DictProxyTests.test_iter_keys @ linux-x86_64 +test.test_descr.DictProxyTests.test_iter_values @ linux-x86_64 +test.test_descr.DictProxyTests.test_repr @ linux-x86_64 +test.test_descr.MiscTests.test_type_lookup_mro_reference @ linux-x86_64 +test.test_descr.MroTest.test_incomplete_extend @ linux-x86_64 +test.test_descr.MroTest.test_incomplete_set_bases_on_self @ linux-x86_64 +test.test_descr.MroTest.test_incomplete_super @ linux-x86_64 +test.test_descr.MroTest.test_reent_set_bases_on_base @ linux-x86_64 +test.test_descr.MroTest.test_reent_set_bases_on_direct_base @ linux-x86_64 +test.test_descr.MroTest.test_reent_set_bases_tp_base_cycle @ linux-x86_64 +test.test_descr.MroTest.test_tp_subclasses_cycle_error_return_path @ linux-x86_64 +test.test_descr.MroTest.test_tp_subclasses_cycle_in_update_slots @ linux-x86_64 +test.test_descr.OperatorsTest.test_complexes @ linux-x86_64 +test.test_descr.OperatorsTest.test_dicts @ linux-x86_64 +test.test_descr.OperatorsTest.test_explicit_reverse_methods @ linux-x86_64 +test.test_descr.OperatorsTest.test_floats @ linux-x86_64 +test.test_descr.OperatorsTest.test_ints @ linux-x86_64 +test.test_descr.OperatorsTest.test_lists @ linux-x86_64 +test.test_descr.OperatorsTest.test_wrap_lenfunc_bad_cast @ linux-x86_64 +test.test_descr.PicklingTests.test_issue24097 @ linux-x86_64 +test.test_descr.PicklingTests.test_pickle_slots @ linux-x86_64 +test.test_descr.PicklingTests.test_reduce @ linux-x86_64 +test.test_descr.PicklingTests.test_reduce_copying @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_descrtut.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_descrtut.txt new file mode 100644 index 0000000000..a34b61d3d2 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_descrtut.txt @@ -0,0 +1,7 @@ +DocTestCase.test.test_descrtut.__test__.tut1 @ linux-x86_64 +DocTestCase.test.test_descrtut.__test__.tut2 @ linux-x86_64 +DocTestCase.test.test_descrtut.__test__.tut4 @ linux-x86_64 +DocTestCase.test.test_descrtut.__test__.tut5 @ linux-x86_64 +DocTestCase.test.test_descrtut.__test__.tut6 @ linux-x86_64 +DocTestCase.test.test_descrtut.__test__.tut7 @ linux-x86_64 +DocTestCase.test.test_descrtut.__test__.tut8 @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dict.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dict.txt new file mode 100644 index 0000000000..5f57dca657 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dict.txt @@ -0,0 +1,90 @@ +test.test_dict.DictTest.test_bad_key @ linux-x86_64 +test.test_dict.DictTest.test_bool @ linux-x86_64 +test.test_dict.DictTest.test_clear @ linux-x86_64 +test.test_dict.DictTest.test_constructor @ linux-x86_64 +test.test_dict.DictTest.test_contains @ linux-x86_64 +test.test_dict.DictTest.test_copy @ linux-x86_64 +test.test_dict.DictTest.test_copy_fuzz @ linux-x86_64 +test.test_dict.DictTest.test_copy_maintains_tracking @ linux-x86_64 +test.test_dict.DictTest.test_copy_noncompact @ linux-x86_64 +test.test_dict.DictTest.test_dict_contain_use_after_free @ linux-x86_64 +test.test_dict.DictTest.test_dict_copy_order @ linux-x86_64 +test.test_dict.DictTest.test_dictitems_contains_use_after_free @ linux-x86_64 +test.test_dict.DictTest.test_dictview_mixed_set_operations @ linux-x86_64 +test.test_dict.DictTest.test_dictview_set_operations_on_items @ linux-x86_64 +test.test_dict.DictTest.test_dictview_set_operations_on_keys @ linux-x86_64 +test.test_dict.DictTest.test_empty_presized_dict_in_freelist @ linux-x86_64 +test.test_dict.DictTest.test_eq @ linux-x86_64 +test.test_dict.DictTest.test_equal_operator_modifying_operand @ linux-x86_64 +test.test_dict.DictTest.test_errors_in_view_containment_check @ linux-x86_64 +test.test_dict.DictTest.test_fromkeys @ linux-x86_64 +test.test_dict.DictTest.test_fromkeys_operator_modifying_dict_operand @ linux-x86_64 +test.test_dict.DictTest.test_fromkeys_operator_modifying_set_operand @ linux-x86_64 +test.test_dict.DictTest.test_get @ linux-x86_64 +test.test_dict.DictTest.test_getitem @ linux-x86_64 +test.test_dict.DictTest.test_init_use_after_free @ linux-x86_64 +test.test_dict.DictTest.test_instance_dict_getattr_str_subclass @ linux-x86_64 +test.test_dict.DictTest.test_invalid_keyword_arguments @ linux-x86_64 +test.test_dict.DictTest.test_itemiterator_pickling @ linux-x86_64 +test.test_dict.DictTest.test_items @ linux-x86_64 +test.test_dict.DictTest.test_items_symmetric_difference @ linux-x86_64 +test.test_dict.DictTest.test_iterator_pickling @ linux-x86_64 +test.test_dict.DictTest.test_keys @ linux-x86_64 +test.test_dict.DictTest.test_keys_contained @ linux-x86_64 +test.test_dict.DictTest.test_len @ linux-x86_64 +test.test_dict.DictTest.test_literal_constructor @ linux-x86_64 +test.test_dict.DictTest.test_merge_and_mutate @ linux-x86_64 +test.test_dict.DictTest.test_merge_operator @ linux-x86_64 +test.test_dict.DictTest.test_missing @ linux-x86_64 +test.test_dict.DictTest.test_mutating_iteration @ linux-x86_64 +test.test_dict.DictTest.test_mutating_lookup @ linux-x86_64 +test.test_dict.DictTest.test_object_set_item_single_instance_non_str_key @ linux-x86_64 +test.test_dict.DictTest.test_pop @ linux-x86_64 +test.test_dict.DictTest.test_popitem @ linux-x86_64 +test.test_dict.DictTest.test_reentrant_insertion @ linux-x86_64 +test.test_dict.DictTest.test_repr @ linux-x86_64 +test.test_dict.DictTest.test_resize1 @ linux-x86_64 +test.test_dict.DictTest.test_resize2 @ linux-x86_64 +test.test_dict.DictTest.test_reverse_iterator_for_empty_dict @ linux-x86_64 +test.test_dict.DictTest.test_reverse_iterator_for_shared_shared_dicts @ linux-x86_64 +test.test_dict.DictTest.test_reversed @ linux-x86_64 +test.test_dict.DictTest.test_reverseitemiterator_pickling @ linux-x86_64 +test.test_dict.DictTest.test_reverseiterator_pickling @ linux-x86_64 +test.test_dict.DictTest.test_reversevaluesiterator_pickling @ linux-x86_64 +test.test_dict.DictTest.test_setdefault @ linux-x86_64 +test.test_dict.DictTest.test_setitem_atomic_at_resize @ linux-x86_64 +test.test_dict.DictTest.test_str_nonstr @ linux-x86_64 +test.test_dict.DictTest.test_string_keys_can_track_values @ linux-x86_64 +test.test_dict.DictTest.test_tuple_keyerror @ linux-x86_64 +test.test_dict.DictTest.test_update @ linux-x86_64 +test.test_dict.DictTest.test_values @ linux-x86_64 +test.test_dict.DictTest.test_valuesiterator_pickling @ linux-x86_64 +test.test_dict.DictTest.test_views_mapping @ linux-x86_64 +test.test_dict.GeneralMappingTests.test_bool @ linux-x86_64 +test.test_dict.GeneralMappingTests.test_constructor @ linux-x86_64 +test.test_dict.GeneralMappingTests.test_get @ linux-x86_64 +test.test_dict.GeneralMappingTests.test_getitem @ linux-x86_64 +test.test_dict.GeneralMappingTests.test_items @ linux-x86_64 +test.test_dict.GeneralMappingTests.test_keys @ linux-x86_64 +test.test_dict.GeneralMappingTests.test_len @ linux-x86_64 +test.test_dict.GeneralMappingTests.test_pop @ linux-x86_64 +test.test_dict.GeneralMappingTests.test_popitem @ linux-x86_64 +test.test_dict.GeneralMappingTests.test_read @ linux-x86_64 +test.test_dict.GeneralMappingTests.test_setdefault @ linux-x86_64 +test.test_dict.GeneralMappingTests.test_update @ linux-x86_64 +test.test_dict.GeneralMappingTests.test_values @ linux-x86_64 +test.test_dict.GeneralMappingTests.test_write @ linux-x86_64 +test.test_dict.SubclassMappingTests.test_bool @ linux-x86_64 +test.test_dict.SubclassMappingTests.test_constructor @ linux-x86_64 +test.test_dict.SubclassMappingTests.test_get @ linux-x86_64 +test.test_dict.SubclassMappingTests.test_getitem @ linux-x86_64 +test.test_dict.SubclassMappingTests.test_items @ linux-x86_64 +test.test_dict.SubclassMappingTests.test_keys @ linux-x86_64 +test.test_dict.SubclassMappingTests.test_len @ linux-x86_64 +test.test_dict.SubclassMappingTests.test_pop @ linux-x86_64 +test.test_dict.SubclassMappingTests.test_popitem @ linux-x86_64 +test.test_dict.SubclassMappingTests.test_read @ linux-x86_64 +test.test_dict.SubclassMappingTests.test_setdefault @ linux-x86_64 +test.test_dict.SubclassMappingTests.test_update @ linux-x86_64 +test.test_dict.SubclassMappingTests.test_values @ linux-x86_64 +test.test_dict.SubclassMappingTests.test_write @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dictcomps.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dictcomps.txt new file mode 100644 index 0000000000..915c156532 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dictcomps.txt @@ -0,0 +1,9 @@ +test.test_dictcomps.DictComprehensionTest.test_assignment_idiom_in_comprehensions @ linux-x86_64 +test.test_dictcomps.DictComprehensionTest.test_basics @ linux-x86_64 +test.test_dictcomps.DictComprehensionTest.test_evaluation_order @ linux-x86_64 +test.test_dictcomps.DictComprehensionTest.test_global_visibility @ linux-x86_64 +test.test_dictcomps.DictComprehensionTest.test_illegal_assignment @ linux-x86_64 +test.test_dictcomps.DictComprehensionTest.test_local_visibility @ linux-x86_64 +test.test_dictcomps.DictComprehensionTest.test_scope_isolation @ linux-x86_64 +test.test_dictcomps.DictComprehensionTest.test_scope_isolation_from_global @ linux-x86_64 +test.test_dictcomps.DictComprehensionTest.test_star_expression @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dictviews.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dictviews.txt new file mode 100644 index 0000000000..9ae7a102fa --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dictviews.txt @@ -0,0 +1,15 @@ +test.test_dictviews.DictSetTest.test_abc_registry @ linux-x86_64 +test.test_dictviews.DictSetTest.test_compare_error @ linux-x86_64 +test.test_dictviews.DictSetTest.test_constructors_not_callable @ linux-x86_64 +test.test_dictviews.DictSetTest.test_copy @ linux-x86_64 +test.test_dictviews.DictSetTest.test_dict_items @ linux-x86_64 +test.test_dictviews.DictSetTest.test_dict_keys @ linux-x86_64 +test.test_dictviews.DictSetTest.test_dict_mixed_keys_items @ linux-x86_64 +test.test_dictviews.DictSetTest.test_dict_repr @ linux-x86_64 +test.test_dictviews.DictSetTest.test_dict_values @ linux-x86_64 +test.test_dictviews.DictSetTest.test_items_set_operations @ linux-x86_64 +test.test_dictviews.DictSetTest.test_keys_set_operations @ linux-x86_64 +test.test_dictviews.DictSetTest.test_pickle @ linux-x86_64 +test.test_dictviews.DictSetTest.test_recursive_repr @ linux-x86_64 +test.test_dictviews.DictSetTest.test_set_operations_with_iterator @ linux-x86_64 +test.test_dictviews.DictSetTest.test_set_operations_with_noniterable @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_difflib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_difflib.txt new file mode 100644 index 0000000000..6d92dc085b --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_difflib.txt @@ -0,0 +1,51 @@ +DocTestCase.difflib.Differ @ linux-x86_64 +DocTestCase.difflib.Differ._fancy_replace @ linux-x86_64 +DocTestCase.difflib.Differ._qformat @ linux-x86_64 +DocTestCase.difflib.Differ.compare @ linux-x86_64 +DocTestCase.difflib.IS_CHARACTER_JUNK @ linux-x86_64 +DocTestCase.difflib.IS_LINE_JUNK @ linux-x86_64 +DocTestCase.difflib.SequenceMatcher @ linux-x86_64 +DocTestCase.difflib.SequenceMatcher.find_longest_match @ linux-x86_64 +DocTestCase.difflib.SequenceMatcher.get_grouped_opcodes @ linux-x86_64 +DocTestCase.difflib.SequenceMatcher.get_matching_blocks @ linux-x86_64 +DocTestCase.difflib.SequenceMatcher.get_opcodes @ linux-x86_64 +DocTestCase.difflib.SequenceMatcher.ratio @ linux-x86_64 +DocTestCase.difflib.SequenceMatcher.set_seq1 @ linux-x86_64 +DocTestCase.difflib.SequenceMatcher.set_seq2 @ linux-x86_64 +DocTestCase.difflib.SequenceMatcher.set_seqs @ linux-x86_64 +DocTestCase.difflib.context_diff @ linux-x86_64 +DocTestCase.difflib.get_close_matches @ linux-x86_64 +DocTestCase.difflib.ndiff @ linux-x86_64 +DocTestCase.difflib.restore @ linux-x86_64 +DocTestCase.difflib.unified_diff @ linux-x86_64 +test.test_difflib.TestAutojunk.test_one_insert_homogenous_sequence @ linux-x86_64 +test.test_difflib.TestBytes.test_byte_content @ linux-x86_64 +test.test_difflib.TestBytes.test_byte_filenames @ linux-x86_64 +test.test_difflib.TestBytes.test_mixed_types_content @ linux-x86_64 +test.test_difflib.TestBytes.test_mixed_types_dates @ linux-x86_64 +test.test_difflib.TestBytes.test_mixed_types_filenames @ linux-x86_64 +test.test_difflib.TestFindLongest.test_default_args @ linux-x86_64 +test.test_difflib.TestFindLongest.test_longest_match_with_popular_chars @ linux-x86_64 +test.test_difflib.TestJunkAPIs.test_is_character_junk_false @ linux-x86_64 +test.test_difflib.TestJunkAPIs.test_is_character_junk_true @ linux-x86_64 +test.test_difflib.TestJunkAPIs.test_is_line_junk_REDOS @ linux-x86_64 +test.test_difflib.TestJunkAPIs.test_is_line_junk_false @ linux-x86_64 +test.test_difflib.TestJunkAPIs.test_is_line_junk_true @ linux-x86_64 +test.test_difflib.TestOutputFormat.test_no_trailing_tab_on_empty_filedate @ linux-x86_64 +test.test_difflib.TestOutputFormat.test_range_format_context @ linux-x86_64 +test.test_difflib.TestOutputFormat.test_range_format_unified @ linux-x86_64 +test.test_difflib.TestOutputFormat.test_tab_delimiter @ linux-x86_64 +test.test_difflib.TestSFbugs.test_added_tab_hint @ linux-x86_64 +test.test_difflib.TestSFbugs.test_comparing_empty_lists @ linux-x86_64 +test.test_difflib.TestSFbugs.test_hint_indented_properly_with_tabs @ linux-x86_64 +test.test_difflib.TestSFbugs.test_matching_blocks_cache @ linux-x86_64 +test.test_difflib.TestSFbugs.test_mdiff_catch_stop_iteration @ linux-x86_64 +test.test_difflib.TestSFbugs.test_ratio_for_null_seqn @ linux-x86_64 +test.test_difflib.TestSFpatches.test_html_diff @ linux-x86_64 +test.test_difflib.TestSFpatches.test_make_file_default_charset @ linux-x86_64 +test.test_difflib.TestSFpatches.test_make_file_iso88591_charset @ linux-x86_64 +test.test_difflib.TestSFpatches.test_make_file_usascii_charset_with_nonascii_input @ linux-x86_64 +test.test_difflib.TestSFpatches.test_recursion_limit @ linux-x86_64 +test.test_difflib.TestWithAscii.test_bjunk @ linux-x86_64 +test.test_difflib.TestWithAscii.test_one_delete @ linux-x86_64 +test.test_difflib.TestWithAscii.test_one_insert @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_distutils.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_distutils.txt new file mode 100644 index 0000000000..cc19b39312 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_distutils.txt @@ -0,0 +1,210 @@ +DocTestCase.distutils.versionpredicate.VersionPredicate @ linux-x86_64 +DocTestCase.distutils.versionpredicate.split_provision @ linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_check_archive_formats @ linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive @ linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive_bztar @ linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive_cwd @ linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive_gztar @ linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive_owner_group @ linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive_tar @ linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_archive_xztar @ linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_tarball @ linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_tarball_bzip2 @ linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_tarball_extended @ linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_tarball_gzip @ linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_tarball_latin1 @ linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_tarball_xz @ linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_zipfile @ linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_make_zipfile_no_zlib @ linux-x86_64 +distutils.tests.test_archive_util.ArchiveUtilTestCase.test_tarfile_vs_tar @ linux-x86_64 +distutils.tests.test_bdist.BuildTestCase.test_formats @ linux-x86_64 +distutils.tests.test_bdist.BuildTestCase.test_skip_build @ linux-x86_64 +distutils.tests.test_bdist_dumb.BuildDumbTestCase.test_simple_built @ linux-x86_64 +distutils.tests.test_build.BuildTestCase.test_finalize_options @ linux-x86_64 +distutils.tests.test_build_clib.BuildCLibTestCase.test_build_libraries @ linux-x86_64 +distutils.tests.test_build_clib.BuildCLibTestCase.test_check_library_dist @ linux-x86_64 +distutils.tests.test_build_clib.BuildCLibTestCase.test_finalize_options @ linux-x86_64 +distutils.tests.test_build_clib.BuildCLibTestCase.test_get_source_files @ linux-x86_64 +distutils.tests.test_build_clib.BuildCLibTestCase.test_run @ linux-x86_64 +distutils.tests.test_build_ext.BuildExtTestCase.test_check_extensions_list @ linux-x86_64 +distutils.tests.test_build_ext.BuildExtTestCase.test_compiler_option @ linux-x86_64 +distutils.tests.test_build_ext.BuildExtTestCase.test_ext_fullpath @ linux-x86_64 +distutils.tests.test_build_ext.BuildExtTestCase.test_finalize_options @ linux-x86_64 +distutils.tests.test_build_ext.BuildExtTestCase.test_get_outputs @ linux-x86_64 +distutils.tests.test_build_ext.BuildExtTestCase.test_get_source_files @ linux-x86_64 +distutils.tests.test_build_ext.BuildExtTestCase.test_optional_extension @ linux-x86_64 +distutils.tests.test_build_ext.BuildExtTestCase.test_solaris_enable_shared @ linux-x86_64 +distutils.tests.test_build_ext.BuildExtTestCase.test_unicode_module_names @ linux-x86_64 +distutils.tests.test_build_ext.BuildExtTestCase.test_user_site @ linux-x86_64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_check_extensions_list @ linux-x86_64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_compiler_option @ linux-x86_64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_ext_fullpath @ linux-x86_64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_finalize_options @ linux-x86_64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_get_outputs @ linux-x86_64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_get_source_files @ linux-x86_64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_optional_extension @ linux-x86_64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_solaris_enable_shared @ linux-x86_64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_unicode_module_names @ linux-x86_64 +distutils.tests.test_build_ext.ParallelBuildExtTestCase.test_user_site @ linux-x86_64 +distutils.tests.test_build_py.BuildPyTestCase.test_byte_compile @ linux-x86_64 +distutils.tests.test_build_py.BuildPyTestCase.test_byte_compile_optimized @ linux-x86_64 +distutils.tests.test_build_py.BuildPyTestCase.test_dir_in_package_data @ linux-x86_64 +distutils.tests.test_build_py.BuildPyTestCase.test_dont_write_bytecode @ linux-x86_64 +distutils.tests.test_build_py.BuildPyTestCase.test_empty_package_dir @ linux-x86_64 +distutils.tests.test_build_py.BuildPyTestCase.test_package_data @ linux-x86_64 +distutils.tests.test_build_scripts.BuildScriptsTestCase.test_build @ linux-x86_64 +distutils.tests.test_build_scripts.BuildScriptsTestCase.test_default_settings @ linux-x86_64 +distutils.tests.test_build_scripts.BuildScriptsTestCase.test_version_int @ linux-x86_64 +distutils.tests.test_check.CheckTestCase.test_check_all @ linux-x86_64 +distutils.tests.test_check.CheckTestCase.test_check_metadata @ linux-x86_64 +distutils.tests.test_clean.cleanTestCase.test_simple_run @ linux-x86_64 +distutils.tests.test_cmd.CommandTestCase.test_debug_print @ linux-x86_64 +distutils.tests.test_cmd.CommandTestCase.test_dump_options @ linux-x86_64 +distutils.tests.test_cmd.CommandTestCase.test_ensure_dirname @ linux-x86_64 +distutils.tests.test_cmd.CommandTestCase.test_ensure_filename @ linux-x86_64 +distutils.tests.test_cmd.CommandTestCase.test_ensure_string @ linux-x86_64 +distutils.tests.test_cmd.CommandTestCase.test_ensure_string_list @ linux-x86_64 +distutils.tests.test_cmd.CommandTestCase.test_make_file @ linux-x86_64 +distutils.tests.test_config.PyPIRCCommandTestCase.test_config_interpolation @ linux-x86_64 +distutils.tests.test_config.PyPIRCCommandTestCase.test_server_empty_registration @ linux-x86_64 +distutils.tests.test_config.PyPIRCCommandTestCase.test_server_registration @ linux-x86_64 +distutils.tests.test_config_cmd.ConfigTestCase.test_clean @ linux-x86_64 +distutils.tests.test_config_cmd.ConfigTestCase.test_dump_file @ linux-x86_64 +distutils.tests.test_config_cmd.ConfigTestCase.test_finalize_options @ linux-x86_64 +distutils.tests.test_config_cmd.ConfigTestCase.test_search_cpp @ linux-x86_64 +distutils.tests.test_core.CoreTestCase.test_debug_mode @ linux-x86_64 +distutils.tests.test_core.CoreTestCase.test_run_setup_defines_subclass @ linux-x86_64 +distutils.tests.test_core.CoreTestCase.test_run_setup_preserves_sys_argv @ linux-x86_64 +distutils.tests.test_core.CoreTestCase.test_run_setup_provides_file @ linux-x86_64 +distutils.tests.test_core.CoreTestCase.test_run_setup_uses_current_dir @ linux-x86_64 +distutils.tests.test_cygwinccompiler.CygwinCCompilerTestCase.test_check_config_h @ linux-x86_64 +distutils.tests.test_cygwinccompiler.CygwinCCompilerTestCase.test_get_msvcr @ linux-x86_64 +distutils.tests.test_cygwinccompiler.CygwinCCompilerTestCase.test_get_versions @ linux-x86_64 +distutils.tests.test_dep_util.DepUtilTestCase.test_newer @ linux-x86_64 +distutils.tests.test_dep_util.DepUtilTestCase.test_newer_group @ linux-x86_64 +distutils.tests.test_dep_util.DepUtilTestCase.test_newer_pairwise @ linux-x86_64 +distutils.tests.test_dir_util.DirUtilTestCase.test_copy_tree_exception_in_listdir @ linux-x86_64 +distutils.tests.test_dir_util.DirUtilTestCase.test_copy_tree_skips_nfs_temp_files @ linux-x86_64 +distutils.tests.test_dir_util.DirUtilTestCase.test_copy_tree_verbosity @ linux-x86_64 +distutils.tests.test_dir_util.DirUtilTestCase.test_create_tree_verbosity @ linux-x86_64 +distutils.tests.test_dir_util.DirUtilTestCase.test_ensure_relative @ linux-x86_64 +distutils.tests.test_dir_util.DirUtilTestCase.test_mkpath_remove_tree_verbosity @ linux-x86_64 +distutils.tests.test_dir_util.DirUtilTestCase.test_mkpath_with_custom_mode @ linux-x86_64 +distutils.tests.test_dist.DistributionTestCase.test_announce @ linux-x86_64 +distutils.tests.test_dist.DistributionTestCase.test_command_packages_cmdline @ linux-x86_64 +distutils.tests.test_dist.DistributionTestCase.test_command_packages_configfile @ linux-x86_64 +distutils.tests.test_dist.DistributionTestCase.test_command_packages_unspecified @ linux-x86_64 +distutils.tests.test_dist.DistributionTestCase.test_empty_options @ linux-x86_64 +distutils.tests.test_dist.DistributionTestCase.test_finalize_options @ linux-x86_64 +distutils.tests.test_dist.DistributionTestCase.test_find_config_files_disable @ linux-x86_64 +distutils.tests.test_dist.DistributionTestCase.test_get_command_packages @ linux-x86_64 +distutils.tests.test_dist.DistributionTestCase.test_venv_install_options @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_classifier @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_classifier_invalid_type @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_custom_pydistutils @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_download_url @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_fix_help_options @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_keywords @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_keywords_invalid_type @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_long_description @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_obsoletes @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_obsoletes_illegal @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_obsoletes_to_list @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_platforms @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_platforms_invalid_types @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_provides @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_provides_illegal @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_read_metadata @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_requires @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_requires_illegal @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_requires_to_list @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_show_help @ linux-x86_64 +distutils.tests.test_dist.MetadataTestCase.test_simple_metadata @ linux-x86_64 +distutils.tests.test_extension.ExtensionTestCase.test_extension_init @ linux-x86_64 +distutils.tests.test_extension.ExtensionTestCase.test_read_setup_file @ linux-x86_64 +distutils.tests.test_file_util.FileUtilTestCase.test_copy_file_hard_link @ linux-x86_64 +distutils.tests.test_file_util.FileUtilTestCase.test_copy_file_hard_link_failure @ linux-x86_64 +distutils.tests.test_file_util.FileUtilTestCase.test_move_file_exception_unpacking_rename @ linux-x86_64 +distutils.tests.test_file_util.FileUtilTestCase.test_move_file_exception_unpacking_unlink @ linux-x86_64 +distutils.tests.test_file_util.FileUtilTestCase.test_move_file_verbosity @ linux-x86_64 +distutils.tests.test_filelist.FileListTestCase.test_debug_print @ linux-x86_64 +distutils.tests.test_filelist.FileListTestCase.test_exclude_pattern @ linux-x86_64 +distutils.tests.test_filelist.FileListTestCase.test_glob_to_re @ linux-x86_64 +distutils.tests.test_filelist.FileListTestCase.test_include_pattern @ linux-x86_64 +distutils.tests.test_filelist.FileListTestCase.test_process_template @ linux-x86_64 +distutils.tests.test_filelist.FileListTestCase.test_process_template_line @ linux-x86_64 +distutils.tests.test_filelist.FileListTestCase.test_remove_duplicates @ linux-x86_64 +distutils.tests.test_filelist.FileListTestCase.test_set_allfiles @ linux-x86_64 +distutils.tests.test_filelist.FileListTestCase.test_translate_pattern @ linux-x86_64 +distutils.tests.test_filelist.FindAllTestCase.test_basic_discovery @ linux-x86_64 +distutils.tests.test_filelist.FindAllTestCase.test_missing_symlink @ linux-x86_64 +distutils.tests.test_filelist.FindAllTestCase.test_non_local_discovery @ linux-x86_64 +distutils.tests.test_install.InstallTestCase.test_debug_mode @ linux-x86_64 +distutils.tests.test_install.InstallTestCase.test_finalize_options @ linux-x86_64 +distutils.tests.test_install.InstallTestCase.test_handle_extra_path @ linux-x86_64 +distutils.tests.test_install.InstallTestCase.test_home_installation_scheme @ linux-x86_64 +distutils.tests.test_install.InstallTestCase.test_record @ linux-x86_64 +distutils.tests.test_install.InstallTestCase.test_user_site @ linux-x86_64 +distutils.tests.test_install_data.InstallDataTestCase.test_simple_run @ linux-x86_64 +distutils.tests.test_install_headers.InstallHeadersTestCase.test_simple_run @ linux-x86_64 +distutils.tests.test_install_lib.InstallLibTestCase.test_byte_compile @ linux-x86_64 +distutils.tests.test_install_lib.InstallLibTestCase.test_dont_write_bytecode @ linux-x86_64 +distutils.tests.test_install_lib.InstallLibTestCase.test_finalize_options @ linux-x86_64 +distutils.tests.test_install_lib.InstallLibTestCase.test_get_inputs @ linux-x86_64 +distutils.tests.test_install_lib.InstallLibTestCase.test_get_outputs @ linux-x86_64 +distutils.tests.test_install_scripts.InstallScriptsTestCase.test_default_settings @ linux-x86_64 +distutils.tests.test_install_scripts.InstallScriptsTestCase.test_installation @ linux-x86_64 +distutils.tests.test_log.TestLog.test_non_ascii @ linux-x86_64 +distutils.tests.test_register.RegisterTestCase.test_check_metadata_deprecated @ linux-x86_64 +distutils.tests.test_register.RegisterTestCase.test_create_pypirc @ linux-x86_64 +distutils.tests.test_register.RegisterTestCase.test_list_classifiers @ linux-x86_64 +distutils.tests.test_register.RegisterTestCase.test_password_not_in_file @ linux-x86_64 +distutils.tests.test_register.RegisterTestCase.test_password_reset @ linux-x86_64 +distutils.tests.test_register.RegisterTestCase.test_registering @ linux-x86_64 +distutils.tests.test_register.RegisterTestCase.test_show_response @ linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_add_defaults @ linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_check_metadata_deprecated @ linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_finalize_options @ linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_get_file_list @ linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_invalid_template_unknown_command @ linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_invalid_template_wrong_arguments @ linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_make_distribution @ linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_manifest_comments @ linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_manifest_marker @ linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_manual_manifest @ linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_metadata_check_option @ linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_prune_file_list @ linux-x86_64 +distutils.tests.test_sdist.SDistTestCase.test_show_formats @ linux-x86_64 +distutils.tests.test_spawn.SpawnTestCase.test_find_executable @ linux-x86_64 +distutils.tests.test_spawn.SpawnTestCase.test_spawn @ linux-x86_64 +distutils.tests.test_spawn.SpawnTestCase.test_spawn_missing_exe @ linux-x86_64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_customize_compiler_before_get_config_vars @ linux-x86_64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_get_config_h_filename @ linux-x86_64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_get_config_vars @ linux-x86_64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_get_python_lib @ linux-x86_64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_parse_makefile_base @ linux-x86_64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_parse_makefile_literal_dollar @ linux-x86_64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_srcdir_independent_of_cwd @ linux-x86_64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_sysconfig_compiler_vars @ linux-x86_64 +distutils.tests.test_sysconfig.SysconfigTestCase.test_sysconfig_module @ linux-x86_64 +distutils.tests.test_text_file.TextFileTestCase.test_class @ linux-x86_64 +distutils.tests.test_unixccompiler.UnixCCompilerTestCase.test_runtime_libdir_option @ linux-x86_64 +distutils.tests.test_upload.uploadTestCase.test_finalize_options @ linux-x86_64 +distutils.tests.test_upload.uploadTestCase.test_saved_password @ linux-x86_64 +distutils.tests.test_upload.uploadTestCase.test_upload @ linux-x86_64 +distutils.tests.test_upload.uploadTestCase.test_upload_correct_cr @ linux-x86_64 +distutils.tests.test_upload.uploadTestCase.test_upload_fails @ linux-x86_64 +distutils.tests.test_upload.uploadTestCase.test_wrong_exception_order @ linux-x86_64 +distutils.tests.test_util.UtilTestCase.test_change_root @ linux-x86_64 +distutils.tests.test_util.UtilTestCase.test_check_environ @ linux-x86_64 +distutils.tests.test_util.UtilTestCase.test_check_environ_getpwuid @ linux-x86_64 +distutils.tests.test_util.UtilTestCase.test_convert_path @ linux-x86_64 +distutils.tests.test_util.UtilTestCase.test_dont_write_bytecode @ linux-x86_64 +distutils.tests.test_util.UtilTestCase.test_get_platform @ linux-x86_64 +distutils.tests.test_util.UtilTestCase.test_grok_environment_error @ linux-x86_64 +distutils.tests.test_util.UtilTestCase.test_rfc822_escape @ linux-x86_64 +distutils.tests.test_util.UtilTestCase.test_split_quoted @ linux-x86_64 +distutils.tests.test_util.UtilTestCase.test_strtobool @ linux-x86_64 +distutils.tests.test_version.VersionTestCase.test_cmp @ linux-x86_64 +distutils.tests.test_version.VersionTestCase.test_cmp_strict @ linux-x86_64 +distutils.tests.test_version.VersionTestCase.test_prerelease @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_doctest.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_doctest.txt new file mode 100644 index 0000000000..36c97d04a7 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_doctest.txt @@ -0,0 +1,17 @@ +DocTestCase.doctest.DebugRunner @ linux-x86_64 +DocTestCase.doctest.DocTestCase.debug @ linux-x86_64 +DocTestCase.doctest.DocTestRunner @ linux-x86_64 +DocTestCase.doctest._TestClass @ linux-x86_64 +DocTestCase.doctest._TestClass.__init__ @ linux-x86_64 +DocTestCase.doctest._TestClass.get @ linux-x86_64 +DocTestCase.doctest._TestClass.square @ linux-x86_64 +DocTestCase.doctest.__test__.blank lines @ linux-x86_64 +DocTestCase.doctest.__test__.bool-int equivalence @ linux-x86_64 +DocTestCase.doctest.__test__.ellipsis @ linux-x86_64 +DocTestCase.doctest.__test__.string @ linux-x86_64 +DocTestCase.doctest.__test__.whitespace normalization @ linux-x86_64 +DocTestCase.doctest._ellipsis_match @ linux-x86_64 +DocTestCase.doctest.script_from_examples @ linux-x86_64 +DocTestCase.doctest.set_unittest_reportflags @ linux-x86_64 +test.test_doctest.TestDocTestFinder.test_empty_namespace_package @ linux-x86_64 +test.test_doctest.TestDocTestFinder.test_issue35753 @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_doctest2.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_doctest2.txt new file mode 100644 index 0000000000..cc5fc9cb5d --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_doctest2.txt @@ -0,0 +1 @@ +test.test_doctest2.Test.test_testmod @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_docxmlrpc.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_docxmlrpc.txt new file mode 100644 index 0000000000..8e10b69988 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_docxmlrpc.txt @@ -0,0 +1,9 @@ +test.test_docxmlrpc.DocXMLRPCHTTPGETServer.test_annotations @ linux-x86_64 +test.test_docxmlrpc.DocXMLRPCHTTPGETServer.test_autolink_dotted_methods @ linux-x86_64 +test.test_docxmlrpc.DocXMLRPCHTTPGETServer.test_autolinking @ linux-x86_64 +test.test_docxmlrpc.DocXMLRPCHTTPGETServer.test_get_css @ linux-x86_64 +test.test_docxmlrpc.DocXMLRPCHTTPGETServer.test_invalid_get_response @ linux-x86_64 +test.test_docxmlrpc.DocXMLRPCHTTPGETServer.test_lambda @ linux-x86_64 +test.test_docxmlrpc.DocXMLRPCHTTPGETServer.test_server_title_escape @ linux-x86_64 +test.test_docxmlrpc.DocXMLRPCHTTPGETServer.test_system_methods @ linux-x86_64 +test.test_docxmlrpc.DocXMLRPCHTTPGETServer.test_valid_get_response @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dynamic.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dynamic.txt new file mode 100644 index 0000000000..b075cbad44 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dynamic.txt @@ -0,0 +1,11 @@ +test.test_dynamic.RebindBuiltinsTests.test_cannot_change_globals_or_builtins_with_eval @ linux-x86_64 +test.test_dynamic.RebindBuiltinsTests.test_cannot_change_globals_or_builtins_with_exec @ linux-x86_64 +test.test_dynamic.RebindBuiltinsTests.test_cannot_replace_builtins_dict_between_calls @ linux-x86_64 +test.test_dynamic.RebindBuiltinsTests.test_cannot_replace_builtins_dict_while_active @ linux-x86_64 +test.test_dynamic.RebindBuiltinsTests.test_eval_gives_lambda_custom_globals @ linux-x86_64 +test.test_dynamic.RebindBuiltinsTests.test_globals_shadow_builtins @ linux-x86_64 +test.test_dynamic.RebindBuiltinsTests.test_load_global_specialization_failure_keeps_oparg @ linux-x86_64 +test.test_dynamic.RebindBuiltinsTests.test_modify_builtins @ linux-x86_64 +test.test_dynamic.RebindBuiltinsTests.test_modify_builtins_from_leaf_function @ linux-x86_64 +test.test_dynamic.RebindBuiltinsTests.test_modify_builtins_while_generator_active @ linux-x86_64 +test.test_dynamic.TestTracing.test_after_specialization @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dynamicclassattribute.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dynamicclassattribute.txt new file mode 100644 index 0000000000..9532001425 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_dynamicclassattribute.txt @@ -0,0 +1,11 @@ +test.test_dynamicclassattribute.PropertySubclassTests.test_docstring_copy @ linux-x86_64 +test.test_dynamicclassattribute.PropertySubclassTests.test_property_new_getter_new_docstring @ linux-x86_64 +test.test_dynamicclassattribute.PropertySubclassTests.test_property_setter_copies_getter_docstring @ linux-x86_64 +test.test_dynamicclassattribute.PropertyTests.test_abstract_virtual @ linux-x86_64 +test.test_dynamicclassattribute.PropertyTests.test_property___isabstractmethod__descriptor @ linux-x86_64 +test.test_dynamicclassattribute.PropertyTests.test_property_decorator_baseclass @ linux-x86_64 +test.test_dynamicclassattribute.PropertyTests.test_property_decorator_baseclass_doc @ linux-x86_64 +test.test_dynamicclassattribute.PropertyTests.test_property_decorator_doc @ linux-x86_64 +test.test_dynamicclassattribute.PropertyTests.test_property_decorator_subclass @ linux-x86_64 +test.test_dynamicclassattribute.PropertyTests.test_property_decorator_subclass_doc @ linux-x86_64 +test.test_dynamicclassattribute.PropertyTests.test_property_getter_doc_override @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_email.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_email.txt new file mode 100644 index 0000000000..15505206c9 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_email.txt @@ -0,0 +1,1659 @@ +test.test_email.test__encoded_words.TestDecode.test_b_case_ignored @ linux-x86_64 +test.test_email.test__encoded_words.TestDecode.test_b_invalid_bytes_ignored_with_defect @ linux-x86_64 +test.test_email.test__encoded_words.TestDecode.test_b_invalid_bytes_incorrect_padding @ linux-x86_64 +test.test_email.test__encoded_words.TestDecode.test_b_padding_defect @ linux-x86_64 +test.test_email.test__encoded_words.TestDecode.test_b_undecodable_bytes_ignored_with_defect @ linux-x86_64 +test.test_email.test__encoded_words.TestDecode.test_non_trivial_q @ linux-x86_64 +test.test_email.test__encoded_words.TestDecode.test_nonnull_lang @ linux-x86_64 +test.test_email.test__encoded_words.TestDecode.test_q_case_ignored @ linux-x86_64 +test.test_email.test__encoded_words.TestDecode.test_q_escaped_bytes_preserved @ linux-x86_64 +test.test_email.test__encoded_words.TestDecode.test_q_nonascii @ linux-x86_64 +test.test_email.test__encoded_words.TestDecode.test_simple_b @ linux-x86_64 +test.test_email.test__encoded_words.TestDecode.test_simple_q @ linux-x86_64 +test.test_email.test__encoded_words.TestDecode.test_unknown_8bit_charset @ linux-x86_64 +test.test_email.test__encoded_words.TestDecode.test_unknown_charset @ linux-x86_64 +test.test_email.test__encoded_words.TestDecode.test_wrong_format_input_raises @ linux-x86_64 +test.test_email.test__encoded_words.TestDecodeB.test_invalid_character @ linux-x86_64 +test.test_email.test__encoded_words.TestDecodeB.test_invalid_character_and_bad_padding @ linux-x86_64 +test.test_email.test__encoded_words.TestDecodeB.test_invalid_length @ linux-x86_64 +test.test_email.test__encoded_words.TestDecodeB.test_missing_padding @ linux-x86_64 +test.test_email.test__encoded_words.TestDecodeB.test_simple @ linux-x86_64 +test.test_email.test__encoded_words.TestDecodeQ.test_no_encoded @ linux-x86_64 +test.test_email.test__encoded_words.TestDecodeQ.test_run_of_encoded @ linux-x86_64 +test.test_email.test__encoded_words.TestDecodeQ.test_spaces @ linux-x86_64 +test.test_email.test__encoded_words.TestEncode.test_auto_b_if_enough_unsafe @ linux-x86_64 +test.test_email.test__encoded_words.TestEncode.test_auto_b_if_long_unsafe @ linux-x86_64 +test.test_email.test__encoded_words.TestEncode.test_auto_q @ linux-x86_64 +test.test_email.test__encoded_words.TestEncode.test_auto_q_if_long_mostly_safe @ linux-x86_64 +test.test_email.test__encoded_words.TestEncode.test_auto_q_if_short_mostly_safe @ linux-x86_64 +test.test_email.test__encoded_words.TestEncode.test_b @ linux-x86_64 +test.test_email.test__encoded_words.TestEncode.test_lang @ linux-x86_64 +test.test_email.test__encoded_words.TestEncode.test_q @ linux-x86_64 +test.test_email.test__encoded_words.TestEncode.test_unknown_8bit @ linux-x86_64 +test.test_email.test__encoded_words.TestEncode.test_utf8_default @ linux-x86_64 +test.test_email.test__encoded_words.TestEncodeB.test_padding @ linux-x86_64 +test.test_email.test__encoded_words.TestEncodeB.test_simple @ linux-x86_64 +test.test_email.test__encoded_words.TestEncodeQ.test_all_safe @ linux-x86_64 +test.test_email.test__encoded_words.TestEncodeQ.test_run_of_encodables @ linux-x86_64 +test.test_email.test__encoded_words.TestEncodeQ.test_spaces @ linux-x86_64 +test.test_email.test__header_value_parser.TestFolding.test_address_list_folding_at_commas @ linux-x86_64 +test.test_email.test__header_value_parser.TestFolding.test_address_list_with_unicode_names @ linux-x86_64 +test.test_email.test__header_value_parser.TestFolding.test_address_list_with_unicode_names_in_quotes @ linux-x86_64 +test.test_email.test__header_value_parser.TestFolding.test_ews_combined_before_wrap @ linux-x86_64 +test.test_email.test__header_value_parser.TestFolding.test_long_filename_attachment @ linux-x86_64 +test.test_email.test__header_value_parser.TestFolding.test_one_ew_on_each_of_two_wrapped_lines @ linux-x86_64 +test.test_email.test__header_value_parser.TestFolding.test_overlong_encodeable_is_wrapped @ linux-x86_64 +test.test_email.test__header_value_parser.TestFolding.test_simple_address @ linux-x86_64 +test.test_email.test__header_value_parser.TestFolding.test_simple_unstructured_folded @ linux-x86_64 +test.test_email.test__header_value_parser.TestFolding.test_simple_unstructured_no_folds @ linux-x86_64 +test.test_email.test__header_value_parser.TestFolding.test_split_at_whitespace_after_header_before_long_token @ linux-x86_64 +test.test_email.test__header_value_parser.TestFolding.test_split_at_whitespace_before_long_token @ linux-x86_64 +test.test_email.test__header_value_parser.TestFolding.test_unstructured_with_unicode_no_folds @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test__wsp_splitter_one_word @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test__wsp_splitter_two_words @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test__wsp_splitter_ws_runs @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_encoded_word_inside_quotes @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_dot_atom @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_ends_at_special @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_multiple_domains @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_normal @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_quoted_strings_in_atom_list @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_with_cfws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_with_doamin_literal @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_addr_spec_with_qouoted_string_and_cfws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_address_complex @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_address_empty_group @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_address_ends_at_special @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_address_group @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_address_invalid_mailbox_invalid @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_address_list_CFWS @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_address_list_group_and_mailboxes @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_address_list_group_empty @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_address_list_group_simple @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_address_list_mailboxes_complex @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_address_list_mailboxes_invalid_addresses @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_address_list_mailboxes_simple @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_address_list_mailboxes_two_simple @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_address_quoted_local_part @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_address_quoted_strings_in_atom_list @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_address_rfc2047_display_name @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_address_simple @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_empty @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_ends_at_special @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_internal_cfws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_missing_closing_angle @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_missing_closing_angle_with_cfws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_no_angle_before_special_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_no_angle_raise @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_no_angle_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_obs_route @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_qs_and_domain_literal @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_qs_only_quotes @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_simple @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_special_after_angle_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_angle_addr_with_cfws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_atext_all_atext @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_atext_following_wsp_preserved @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_atext_non_printables @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_atext_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_atext_two_words_gets_first @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_atext_up_to_special @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_atom_ends_at_noncfws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_atom_ends_at_special @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_header_ends_in_comment @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_no_atom @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_no_atom_before_special @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_non_printable_in_atext @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_non_printable_in_comment @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_rfc2047_atom @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_with_comments_and_wsp @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_with_multiple_comments @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_atom_with_wsp @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_empty_quotes @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_end_dquote_mid_word @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_following_wsp_preserved @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_missing_endquotes @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_multiple_words @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_multiple_words_wsp_preserved @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_must_start_with_dquote @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_no_end_dquote @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_non_printables @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_only_quotes @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_bare_quoted_string_quoted_dquote @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_cfws_ends_at_non_leader @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_cfws_ends_at_non_printable @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_cfws_header_ends_in_comment @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_cfws_multiple_nested_comments @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_cfws_non_printable_in_comment @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_cfws_only_comment @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_cfws_only_mixed @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_cfws_only_ws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_empty_comment @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_end_paren_mid_word @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_following_wsp_preserved @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_missing_end_of_nesting @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_multiple_nesting @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_multiple_words @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_multiple_words_wsp_preserved @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_must_start_with_paren @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_nested_comment @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_nested_comment_wsp @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_no_end_paren @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_non_printable @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_qs_in_nested_comment @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_comment_quoted_parens @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_display_name_complex1 @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_display_name_complex2 @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_display_name_ending_with_obsolete @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_display_name_for_invalid_address_field @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_display_name_obsolete @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_display_name_pharse_must_start_with_word @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_display_name_simple @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_domain_literal_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_domain_literal_with_cfws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_domain_literal_with_cfws_ends_at_special @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_domain_with_cfws_ends_at_special @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_literal_bad_dtext_char_before_special_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_literal_no_start_char_before_special_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_literal_no_start_char_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_literal_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_literal_with_internal_ws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_literal_with_surrounding_cfws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_no_atom_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_no_non_cfws_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_obsolete @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_regular_domain_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_domain_with_cfws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_leading_dot_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_no_atom_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_rfc2047_atom @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_space_ends_dot_atom @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text_lone_atom_is_valid @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text_raises_on_leading_dot @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text_raises_on_leading_non_atext @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text_raises_on_trailing_dot @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text_trailing_text_preserved @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_text_trailing_ws_preserved @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_trailing_dot_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_two_dots_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_with_comments_and_wsp @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dot_atom_with_wsp @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_all_dtext @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_close_bracket_mid_word @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_following_wsp_preserved @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_non_printables @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_open_bracket_mid_word @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_two_words_gets_first @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_up_to_close_bracket_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_up_to_open_bracket_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_with_qp @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_wsp_before_close_bracket_preserved @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_dtext_wsp_before_open_bracket_preserved @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_gets_first @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_gets_first_even_if_no_space @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_internal_spaces @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_invalid_cte @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_lang_default_is_blank @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_leading_internal_space @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_missing_end_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_missing_middle_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_missing_start_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_non_printable_defect @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_quopri_utf_escape_follows_cte @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_sets_extra_attributes @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_encoded_word_valid_ew @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_fws_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_fws_space @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_fws_ws_run @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_group_cfws_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_group_empty @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_group_list_cfws_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_group_list_comment_only_invalid @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_group_list_mailbox_list @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_group_list_obs_group_list @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_group_missing_final_semicol @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_group_mixed_list @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_group_null_addr_spec @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_group_one_invalid @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_group_single_mailbox @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_complex_obsolete_1 @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_complex_obsolete_invalid @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_double_dot_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_leading_dot @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_leading_dot_after_ws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_no_part_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_quoted_strings_in_atom_list @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_quoted_with_cfws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_quoted_with_whitespace @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_simple @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_simple_obsolete @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_simple_quoted @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_special_instead_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_trailing_dot @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_trailing_dot_with_ws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_unicode_defect @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_valid_and_invalid_qp_in_atom_list @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_with_cfws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_with_dot @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_with_quoted_dot @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_local_part_with_whitespace @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_addr_spec_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_angle_addr_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_ends_at_special @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_empty_list_element @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_junk_after_valid_address @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_only_empty_elements @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_single_addr @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_two_complex @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_two_name_addr @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_two_simple_addr @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_list_unparseable_mailbox_null @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_name_addr @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_mailbox_quoted_strings_in_atom_list @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_msg_id_empty @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_msg_id_invalid_expected_msg_id_not_found @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_msg_id_no_angle_end @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_msg_id_no_angle_start @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_msg_id_no_id_right_part @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_msg_id_non_folding_literal_domain @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_msg_id_obsolete_domain_part @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_msg_id_obsolete_local @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_msg_id_valid @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_angle_addr_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_atom_name @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_atom_name_with_cfws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_ends_at_special @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_name_with_cfws_and_dots @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_no_angle_after_display_name_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_no_content_before_special_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_no_content_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_qs_name @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_name_addr_with_route @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_obs_route_complex @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_obs_route_no_route_before_end_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_obs_route_no_route_before_special_raises @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_obs_route_no_route_before_special_raises2 @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_obs_route_simple @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_phrase_complex @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_phrase_ending_with_obsolete @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_phrase_obsolete @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_phrase_pharse_must_start_with_word @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_phrase_simple @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qcontent_all_printables @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qcontent_close_paren_mid_word @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qcontent_following_wsp_preserved @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qcontent_non_printables @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qcontent_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qcontent_two_words_gets_first @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qcontent_up_to_dquote_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qcontent_wsp_before_close_paren_preserved @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_all_printables @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_close_paren_mid_word @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_following_wsp_preserved @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_non_printables @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_open_paren_mid_word @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_two_words_gets_first @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_up_to_close_paren_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_up_to_open_paren_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_wsp_before_close_paren_preserved @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_qp_ctext_wsp_before_open_paren_preserved @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_header_ends_in_comment @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_header_ends_in_qcontent @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_internal_ws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_no_quoted_string @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_non_printable_in_comment @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_non_printable_in_qcontent @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_only @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_qs_ends_at_noncfws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_with_comments_and_wsp @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_with_multiple_comments @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_quoted_string_with_wsp @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_ew_with_internal_leading_ws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_ew_with_internal_ws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_ew_without_leading_whitespace @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_ew_without_trailing_whitespace @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invalid_base64_character @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invalid_base64_character_and_bad_padding @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invalid_base64_length @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invalid_ew @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invalid_ew2 @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_invalid_ew_cte @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_leading_and_trailing_whitespace @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_leading_whitespace @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_missing_base64_padding @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_no_whitespace_between_ews @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_normal_phrase @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_normal_phrase_with_whitespace @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_null @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_one_ew_trailing_ws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_one_valid_ew_no_ws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_one_valid_ew_trailing_text @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_one_word @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_phrase_with_ew_in_middle_of_text @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_phrase_with_ew_with_leading_ws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_phrase_with_two_ew @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_phrase_with_two_ew_extra_ws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_phrase_with_two_ew_trailing_ws @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_trailing_whitespace @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_two_ew_extra_ws_trailing_text @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_undecodable_bytes @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_undecodable_bytes_in_EW @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_unstructured_without_trailing_whitespace_hang_case @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_word_all_CFWS @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_word_atom_yields_atom @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_word_ends_at_dot @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_get_word_qs_yields_qs @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_invalid_content_disposition @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_invalid_content_transfer_encoding @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_parse_invalid_message_id @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_parse_message_id_with_remaining @ linux-x86_64 +test.test_email.test__header_value_parser.TestParser.test_parse_valid_message_id @ linux-x86_64 +test.test_email.test__header_value_parser.TestTokens.test_EWWhiteSpaceTerminal @ linux-x86_64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_duplicate_and_missing_split_value @ linux-x86_64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_duplicate_in_split_value @ linux-x86_64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_duplicate_key @ linux-x86_64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_duplicate_key_with_split_value @ linux-x86_64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_duplicate_key_with_split_value_other_order @ linux-x86_64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_duplicate_with_broken_split_value @ linux-x86_64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_extra_dquote @ linux-x86_64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_missing_split_value @ linux-x86_64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_multiple_keys @ linux-x86_64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_simple @ linux-x86_64 +test.test_email.test__header_value_parser.Test_parse_mime_parameters.test_value_split_value @ linux-x86_64 +test.test_email.test__header_value_parser.Test_parse_mime_version.test_value_RFC_2045_2 @ linux-x86_64 +test.test_email.test__header_value_parser.Test_parse_mime_version.test_value_RFC_2045_3 @ linux-x86_64 +test.test_email.test__header_value_parser.Test_parse_mime_version.test_value_RFC_2045_4 @ linux-x86_64 +test.test_email.test__header_value_parser.Test_parse_mime_version.test_value_empty @ linux-x86_64 +test.test_email.test__header_value_parser.Test_parse_mime_version.test_value_rfc_2045_1 @ linux-x86_64 +test.test_email.test_asian_codecs.TestEmailAsianCodecs.test_japanese_codecs @ linux-x86_64 +test.test_email.test_asian_codecs.TestEmailAsianCodecs.test_payload_encoding @ linux-x86_64 +test.test_email.test_asian_codecs.TestEmailAsianCodecs.test_payload_encoding_utf8 @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_get_content_key_full_type @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_get_content_key_maintype_only @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_get_content_key_null_key @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_get_content_key_order_full_type @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_get_content_key_order_maintype_only @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_get_content_key_order_null_key @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_get_content_raises_if_unknown_mimetype_and_no_default @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_calls_clear_content @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_base_full_path @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_base_name @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_base_qualname @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_base_type @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_full_path @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_name @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_null_key @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_base_full_path @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_base_name @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_base_qualname @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_base_type @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_full_path @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_name @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_null_key @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_qualname @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_str_full_path @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_str_name @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_str_type @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_order_type @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_qualname @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_str_full_path @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_str_name @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_str_type @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_key_type @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_raises_if_called_on_multipart @ linux-x86_64 +test.test_email.test_contentmanager.TestContentManager.test_set_content_raises_if_unknown_type_and_no_default @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_cid_receiver_application_octet_stream @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_cid_receiver_image_jpeg @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_cid_receiver_message_external_body @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_cid_receiver_message_rfc822 @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_cid_receiver_text_html @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_cid_receiver_text_plain @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_disposition_inline_receiver_application_octet_stream @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_disposition_inline_receiver_image_jpeg @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_disposition_inline_receiver_message_external_body @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_disposition_inline_receiver_message_rfc822 @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_disposition_inline_receiver_text_html @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_disposition_inline_receiver_text_plain @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_message_non_rfc822_or_external_body_yields_bytes @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_message_rfc822_and_external_body @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_non_text @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_non_text_invalid_keyword @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_raises_on_multipart @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_text_html @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_text_invalid_keyword @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain_bad_utf8_quoted_printable @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain_bad_utf8_quoted_printable_ignore_errors @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain_latin1 @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain_latin1_quoted_printable @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain_utf8_base64 @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_get_text_plain_utf8_base64_recoverable_bad_CTE_data @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_header_receiver_application_octet_stream @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_header_receiver_image_jpeg @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_header_receiver_message_external_body @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_header_receiver_message_rfc822 @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_header_receiver_text_html @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_header_receiver_text_plain @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_non_ascii_filename_receiver_application_octet_stream @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_non_ascii_filename_receiver_image_jpeg @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_non_ascii_filename_receiver_message_external_body @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_non_ascii_filename_receiver_message_rfc822 @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_non_ascii_filename_receiver_text_html @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_non_ascii_filename_receiver_text_plain @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_params_receiver_application_octet_stream @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_params_receiver_image_jpeg @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_params_receiver_message_external_body @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_params_receiver_message_rfc822 @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_params_receiver_text_html @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_params_receiver_text_plain @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_application_octet_stream_with_8bit_cte @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_content_bytes_cte_7bit @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_disposition_attachment @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_disposition_foo @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_disposition_inline @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_filename @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_filename_and_disposition_inline @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_headers_from_header_objects @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_headers_from_strings @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_headers_with_defective_header_header_raises @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_headers_with_defective_string_header_raises @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_headers_with_invalid_duplicate_header_header_raises @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_headers_with_invalid_duplicate_string_header_raises @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_image_jpg @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_message @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_message_invalid_cte_raises @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_message_with_non_ascii_and_coercion_to_7bit @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_non_ascii_filename @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_11_lines_long_line_maximal_non_ascii_heuristics @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_11_lines_long_line_minimal_non_ascii_heuristics @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_11_lines_maximal_non_ascii_heuristics @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_charset_latin_1 @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_html @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_long_line_maximal_non_ascii_heuristics @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_long_line_minimal_non_ascii_heuristics @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_maximal_non_ascii_heuristics @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_non_ascii_with_charset_ascii_raises @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_non_ascii_with_cte_7bit_and_charset_ascii_raises @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_non_ascii_with_cte_7bit_raises @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_plain @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_plain_long_line_heuristics @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_plain_null @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_text_short_line_minimal_non_ascii_heuristics @ linux-x86_64 +test.test_email.test_contentmanager.TestRawDataManager.test_set_video_mpeg_with_binary_cte @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectCapture.test_bad_padding_in_base64_payload @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectCapture.test_first_line_is_continuation_header @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectCapture.test_invalid_chars_in_base64_payload @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectCapture.test_invalid_length_of_base64_payload @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectCapture.test_lying_multipart @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectCapture.test_missing_ending_boundary @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectCapture.test_missing_header_body_separator @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectCapture.test_missing_start_boundary @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectCapture.test_multipart_invalid_cte @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectCapture.test_multipart_no_boundary @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectCapture.test_multipart_no_cte_no_defect @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectCapture.test_multipart_valid_cte_no_defect @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectCapture.test_same_boundary_inner_outer @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectDetection.test_bad_padding_in_base64_payload @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectDetection.test_first_line_is_continuation_header @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectDetection.test_invalid_chars_in_base64_payload @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectDetection.test_invalid_length_of_base64_payload @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectDetection.test_lying_multipart @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectDetection.test_missing_ending_boundary @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectDetection.test_missing_header_body_separator @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectDetection.test_missing_start_boundary @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectDetection.test_multipart_invalid_cte @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectDetection.test_multipart_no_boundary @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectDetection.test_multipart_no_cte_no_defect @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectDetection.test_multipart_valid_cte_no_defect @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectDetection.test_same_boundary_inner_outer @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectRaising.test_bad_padding_in_base64_payload @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectRaising.test_first_line_is_continuation_header @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectRaising.test_invalid_chars_in_base64_payload @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectRaising.test_invalid_length_of_base64_payload @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectRaising.test_lying_multipart @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectRaising.test_missing_header_body_separator @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectRaising.test_missing_start_boundary @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectRaising.test_multipart_invalid_cte @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectRaising.test_multipart_no_boundary @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectRaising.test_multipart_no_cte_no_defect @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectRaising.test_multipart_valid_cte_no_defect @ linux-x86_64 +test.test_email.test_defect_handling.TestDefectRaising.test_same_boundary_inner_outer @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_8bit_in_base64_body @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_8bit_in_quopri_body @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_8bit_in_uuencode_body @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_8bit_multipart @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_bytes_feedparser @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_bytes_generator @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_bytes_generator_b_encoding_linesep @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_bytes_generator_handles_None_body @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_bytes_generator_with_unix_from @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_crlf_flatten @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_decoded_generator_emits_unicode_body @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_del_rfc2231_params_with_8bit @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_generator_b_encoding_linesep @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_generator_handles_8bit @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_get_8bit_header @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_get_all_with_8bit_headers @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_get_content_type_with_8bit @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_get_params_with_8bit @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_get_payload_with_8bit_cte_header @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_get_rfc2231_params_with_8bit @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_invalid_8bit_in_non_8bit_cte_uses_replace @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_items_with_8bit_headers @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_known_8bit_CTE @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_message_from_binary_file @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_print_8bit_headers @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_set_rfc2231_params_with_8bit @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_str_generator_should_not_mutate_msg_when_handling_8bit @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_string_generator_reencodes_to_quopri_when_appropriate @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_unknown_8bit_CTE @ linux-x86_64 +test.test_email.test_email.Test8BitBytesHandling.test_values_with_8bit_headers @ linux-x86_64 +test.test_email.test_email.TestBase64.test_decode @ linux-x86_64 +test.test_email.test_email.TestBase64.test_encode @ linux-x86_64 +test.test_email.test_email.TestBase64.test_header_encode @ linux-x86_64 +test.test_email.test_email.TestBase64.test_len @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_MIME_digest @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_MIME_digest_with_part_headers @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_content_type @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_dsn @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_long_header @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_message_delivery_status @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_message_external_body_idempotent @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_message_signed_idempotent @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_mixed_with_image @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_more_rfc2231_parameters @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_multipart_no_parts @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_multipart_one_part @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_multipart_report @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_nested_multipart_mixeds @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_no_start_boundary @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_parse_text_message @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_parse_untyped_message @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_parser @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_preamble_epilogue @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_rfc2231_charset @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_simple_multipart @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentCRLF.test_text_plain_in_a_multipart_digest @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_MIME_digest @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_MIME_digest_with_part_headers @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_content_type @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_dsn @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_long_header @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_message_delivery_status @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_message_external_body_idempotent @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_message_signed_idempotent @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_mixed_with_image @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_more_rfc2231_parameters @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_multipart_no_parts @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_multipart_one_part @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_multipart_report @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_nested_multipart_mixeds @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_no_start_boundary @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_parse_text_message @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_parse_untyped_message @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_parser @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_preamble_epilogue @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_rfc2231_charset @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_simple_multipart @ linux-x86_64 +test.test_email.test_email.TestBytesGeneratorIdempotentNL.test_text_plain_in_a_multipart_digest @ linux-x86_64 +test.test_email.test_email.TestCharset.test_body_encode @ linux-x86_64 +test.test_email.test_email.TestCharset.test_codec_encodeable @ linux-x86_64 +test.test_email.test_email.TestCharset.test_unicode_charset_name @ linux-x86_64 +test.test_email.test_email.TestEncoders.test_EncodersEncode_base64 @ linux-x86_64 +test.test_email.test_email.TestEncoders.test_default_cte @ linux-x86_64 +test.test_email.test_email.TestEncoders.test_encode7or8bit @ linux-x86_64 +test.test_email.test_email.TestEncoders.test_encode_empty_payload @ linux-x86_64 +test.test_email.test_email.TestEncoders.test_qp_encode_latin1 @ linux-x86_64 +test.test_email.test_email.TestEncoders.test_qp_encode_non_latin1 @ linux-x86_64 +test.test_email.test_email.TestFeedParsers.test_empty_header_name_handled @ linux-x86_64 +test.test_email.test_email.TestFeedParsers.test_long_lines @ linux-x86_64 +test.test_email.test_email.TestFeedParsers.test_newlines @ linux-x86_64 +test.test_email.test_email.TestFromMangling.test_dont_mangle_from @ linux-x86_64 +test.test_email.test_email.TestFromMangling.test_mangle_from_in_preamble_and_epilog @ linux-x86_64 +test.test_email.test_email.TestFromMangling.test_mangled_from @ linux-x86_64 +test.test_email.test_email.TestFromMangling.test_mangled_from_with_bad_bytes @ linux-x86_64 +test.test_email.test_email.TestFromMangling.test_multipart_with_bad_bytes_in_cte @ linux-x86_64 +test.test_email.test_email.TestHeader.test_bad_8bit_header @ linux-x86_64 +test.test_email.test_email.TestHeader.test_base64_splittable @ linux-x86_64 +test.test_email.test_email.TestHeader.test_broken_base64_header @ linux-x86_64 +test.test_email.test_email.TestHeader.test_empty_header_encode @ linux-x86_64 +test.test_email.test_email.TestHeader.test_encode_preserves_leading_ws_on_value @ linux-x86_64 +test.test_email.test_email.TestHeader.test_encoded_adjacent_nonencoded @ linux-x86_64 +test.test_email.test_email.TestHeader.test_escaped_8bit_header @ linux-x86_64 +test.test_email.test_email.TestHeader.test_explicit_maxlinelen @ linux-x86_64 +test.test_email.test_email.TestHeader.test_flatten_header_with_no_value @ linux-x86_64 +test.test_email.test_email.TestHeader.test_header_ctor_default_args @ linux-x86_64 +test.test_email.test_email.TestHeader.test_header_handles_binary_unknown8bit @ linux-x86_64 +test.test_email.test_email.TestHeader.test_header_needs_no_decoding @ linux-x86_64 +test.test_email.test_email.TestHeader.test_long @ linux-x86_64 +test.test_email.test_email.TestHeader.test_make_header_handles_binary_unknown8bit @ linux-x86_64 +test.test_email.test_email.TestHeader.test_modify_returned_list_does_not_change_header @ linux-x86_64 +test.test_email.test_email.TestHeader.test_multilingual @ linux-x86_64 +test.test_email.test_email.TestHeader.test_quopri_splittable @ linux-x86_64 +test.test_email.test_email.TestHeader.test_shift_jis_charset @ linux-x86_64 +test.test_email.test_email.TestHeader.test_simple @ linux-x86_64 +test.test_email.test_email.TestHeader.test_simple_surprise @ linux-x86_64 +test.test_email.test_email.TestHeader.test_string_charset @ linux-x86_64 +test.test_email.test_email.TestHeader.test_us_ascii_header @ linux-x86_64 +test.test_email.test_email.TestHeader.test_utf8_shortest @ linux-x86_64 +test.test_email.test_email.TestHeader.test_whitespace_header @ linux-x86_64 +test.test_email.test_email.TestHeader.test_whitespace_keeper @ linux-x86_64 +test.test_email.test_email.TestHeaderRegistry.test_HeaderRegistry @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_MIME_digest @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_MIME_digest_with_part_headers @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_content_type @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_dsn @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_long_header @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_message_delivery_status @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_message_external_body_idempotent @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_message_signed_idempotent @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_mixed_with_image @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_more_rfc2231_parameters @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_multipart_no_parts @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_multipart_one_part @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_multipart_report @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_nested_multipart_mixeds @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_no_start_boundary @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_parse_text_message @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_parse_untyped_message @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_parser @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_preamble_epilogue @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_rfc2231_charset @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_simple_multipart @ linux-x86_64 +test.test_email.test_email.TestIdempotent.test_text_plain_in_a_multipart_digest @ linux-x86_64 +test.test_email.test_email.TestIterators.test_body_line_iterator @ linux-x86_64 +test.test_email.test_email.TestIterators.test_pushCR_LF @ linux-x86_64 +test.test_email.test_email.TestIterators.test_push_random @ linux-x86_64 +test.test_email.test_email.TestIterators.test_typed_subpart_iterator @ linux-x86_64 +test.test_email.test_email.TestIterators.test_typed_subpart_iterator_default_type @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_another_long_almost_unsplittable_header @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_another_long_multiline_header @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_header_encode_with_different_output_charset @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_header_splitter @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_last_split_chunk_does_not_fit @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_leading_splittable_in_the_middle_just_before_overlong_last_part @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_long_8bit_header @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_long_8bit_header_no_charset @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_long_field_name @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_long_header_encode @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_long_header_encode_with_different_output_charset @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_long_header_encode_with_tab_continuation @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_long_header_encode_with_tab_continuation_is_just_a_hint @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_long_header_with_multiple_sequential_split_chars @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_long_header_with_whitespace_runs @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_long_line_after_append @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_long_lines_with_different_header @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_long_nonstring @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_long_received_header @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_long_rfc2047_header_with_embedded_fws @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_long_run_with_semi_header_splitter @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_long_to_header @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_long_unbreakable_lines_with_continuation @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_multiline_with_overlong_last_part_followed_by_split_point @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_multiline_with_overlong_parts_separated_by_two_split_points @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_multiple_splittable_leading_char_followed_by_overlong_unsplittable @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_no_semis_header_splitter @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_no_split_long_header @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_overlong_last_part_followed_by_split_point @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_shorter_line_with_append @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_split_long_continuation @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_splittable_leading_char_followed_by_overlong_unsplittable @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_splitter_split_on_punctuation_only_if_fws @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_splitter_split_on_punctuation_only_if_fws_with_header @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_splitting_first_line_only_is_long @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_splitting_multiple_long_lines @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_string_headerinst_eq @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_trailing_splittable_on_overlong_unsplittable @ linux-x86_64 +test.test_email.test_email.TestLongHeaders.test_trailing_splittable_on_overlong_unsplittable_with_leading_splittable @ linux-x86_64 +test.test_email.test_email.TestMIMEApplication.test_binary_body_with_encode_7or8bit @ linux-x86_64 +test.test_email.test_email.TestMIMEApplication.test_binary_body_with_encode_base64 @ linux-x86_64 +test.test_email.test_email.TestMIMEApplication.test_binary_body_with_encode_noop @ linux-x86_64 +test.test_email.test_email.TestMIMEApplication.test_binary_body_with_encode_quopri @ linux-x86_64 +test.test_email.test_email.TestMIMEApplication.test_binary_body_with_unicode_linend_encode_noop @ linux-x86_64 +test.test_email.test_email.TestMIMEApplication.test_body @ linux-x86_64 +test.test_email.test_email.TestMIMEApplication.test_headers @ linux-x86_64 +test.test_email.test_email.TestMIMEAudio.test_add_header @ linux-x86_64 +test.test_email.test_email.TestMIMEAudio.test_checkSetMinor @ linux-x86_64 +test.test_email.test_email.TestMIMEAudio.test_encoding @ linux-x86_64 +test.test_email.test_email.TestMIMEAudio.test_guess_minor_type @ linux-x86_64 +test.test_email.test_email.TestMIMEImage.test_add_header @ linux-x86_64 +test.test_email.test_email.TestMIMEImage.test_checkSetMinor @ linux-x86_64 +test.test_email.test_email.TestMIMEImage.test_encoding @ linux-x86_64 +test.test_email.test_email.TestMIMEImage.test_guess_minor_type @ linux-x86_64 +test.test_email.test_email.TestMIMEMessage.test_bad_multipart @ linux-x86_64 +test.test_email.test_email.TestMIMEMessage.test_default_multipart_constructor @ linux-x86_64 +test.test_email.test_email.TestMIMEMessage.test_default_type @ linux-x86_64 +test.test_email.test_email.TestMIMEMessage.test_default_type_non_parsed @ linux-x86_64 +test.test_email.test_email.TestMIMEMessage.test_default_type_with_explicit_container_type @ linux-x86_64 +test.test_email.test_email.TestMIMEMessage.test_dsn @ linux-x86_64 +test.test_email.test_email.TestMIMEMessage.test_epilogue @ linux-x86_64 +test.test_email.test_email.TestMIMEMessage.test_generate @ linux-x86_64 +test.test_email.test_email.TestMIMEMessage.test_mime_attachments_in_constructor @ linux-x86_64 +test.test_email.test_email.TestMIMEMessage.test_multipart_custom_policy @ linux-x86_64 +test.test_email.test_email.TestMIMEMessage.test_multipart_default_policy @ linux-x86_64 +test.test_email.test_email.TestMIMEMessage.test_no_nl_preamble @ linux-x86_64 +test.test_email.test_email.TestMIMEMessage.test_parse_message_rfc822 @ linux-x86_64 +test.test_email.test_email.TestMIMEMessage.test_type_error @ linux-x86_64 +test.test_email.test_email.TestMIMEMessage.test_valid_argument @ linux-x86_64 +test.test_email.test_email.TestMIMEText.test_7bit_input @ linux-x86_64 +test.test_email.test_email.TestMIMEText.test_7bit_input_no_charset @ linux-x86_64 +test.test_email.test_email.TestMIMEText.test_charset @ linux-x86_64 +test.test_email.test_email.TestMIMEText.test_payload @ linux-x86_64 +test.test_email.test_email.TestMIMEText.test_types @ linux-x86_64 +test.test_email.test_email.TestMIMEText.test_utf8_input @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test__contains__ @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_add_header_with_name_only_param @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_add_header_with_no_value @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_as_bytes @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_as_bytes_policy @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_as_string @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_as_string_policy @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_ascii_add_header @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_ascii_add_header_with_tspecial @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_attach_when_payload_is_string @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_bad_param @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_binary_base64_payload @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_binary_quopri_payload @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_bogus_filename @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_broken_unicode_payload @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_byte_message_rfc822_only @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_decoded_generator @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_del_nonexistent_param @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_del_param @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_del_param_on_nonexistent_header @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_del_param_on_other_header @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_embedded_header_via_Header_rejected @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_embedded_header_via_string_rejected @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_field_containment @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_all @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_boundary @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_charsets @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_disposition @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_maintype_error @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_maintype_from_message_explicit @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_maintype_from_message_implicit @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_maintype_from_message_text_plain_explicit @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_maintype_from_message_text_plain_implicit @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_maintype_missing @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_maintype_missing_with_default_type @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_subtype_error @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_subtype_from_message_explicit @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_subtype_from_message_implicit @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_subtype_from_message_text_plain_explicit @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_subtype_from_message_text_plain_implicit @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_subtype_missing @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_subtype_missing_with_default_type @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_type_from_message_explicit @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_type_from_message_implicit @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_type_from_message_text_plain_explicit @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_type_from_message_text_plain_implicit @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_type_missing @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_content_type_missing_with_default_type @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_decoded_payload @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_filename @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_filename_with_name_parameter @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_param @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_param_funky_continuation_lines @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_param_liberal @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_param_with_quotes @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_param_with_semis_in_quotes @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_params @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_get_payload_n_raises_on_non_multipart @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_getset_charset @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_make_boundary @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_message_rfc822_only @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_missing_boundary @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_missing_filename @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_noascii_add_header @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_nonascii_add_header_via_triple @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_nonascii_add_header_with_tspecial @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_nonascii_as_string_without_content_type_and_cte @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_nonascii_as_string_without_cte @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_questionable_bytes_payload @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_replace_header @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_set_boundary @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_set_charset_from_string @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_set_param @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_set_payload_to_list @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_set_payload_with_8bit_data_and_charset @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_set_payload_with_8bit_data_and_charset_body_encoding_none @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_set_payload_with_charset @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_set_payload_with_non_ascii_and_charset_body_encoding_none @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_set_type @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_set_type_on_other_header @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_unicode_body_defaults_to_utf8_encoding @ linux-x86_64 +test.test_email.test_email.TestMessageAPI.test_unicode_header_defaults_to_utf8_encoding @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_BytesGenerator_linend @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_BytesGenerator_linend_with_non_ascii @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_Generator_linend @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test__all__ @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_accepts_any_charset_like_object @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_charset_richcomparisons @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_charsets_case_insensitive @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_custom_message_does_not_require_arguments @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_escape_backslashes @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_escape_dump @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_formataddr_does_not_quote_parens_in_quoted_string @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_formatdate @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_formatdate_localtime @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_formatdate_usegmt @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_get_body_encoding_with_bogus_charset @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_get_body_encoding_with_uppercase_charset @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_getaddresses @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_getaddresses_embedded_comment @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_getaddresses_header_obj @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_getaddresses_nasty @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_invalid_charset_like_object_raises_error @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_make_msgid_collisions @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_make_msgid_default_domain @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_make_msgid_domain @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_make_msgid_idstring @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_message_from_file @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_message_from_file_with_class @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_message_from_string @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_message_from_string_with_class @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_mime_classes_policy_argument @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_mktime_tz @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_multiline_from_comment @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_name_with_dot @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_noquote_dump @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_parseaddr_empty @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_parseaddr_multiple_domains @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_parseaddr_preserves_quoted_pairs_in_addresses @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_parseaddr_preserves_spaces_in_local_part @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_acceptable_to_time_functions @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_accepts_time_with_dots @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_compact @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_dot_time_delimiter @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_no_dayofweek @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_no_seconds @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_no_space_before_negative_offset @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_no_space_before_positive_offset @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_returns_None_for_invalid_strings @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_rfc_850 @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_parsedate_y2k @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_partial_falls_inside_message_delivery_status @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_quote_dump @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_quotes_unicode_names @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_unicode_address_raises_error @ linux-x86_64 +test.test_email.test_email.TestMiscellaneous.test_utils_quote_unquote @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_boundary_in_non_multipart @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_boundary_with_leading_space @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_boundary_without_trailing_newline @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_double_boundary @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_empty_multipart_idempotent @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_hierarchy @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_message_external_body @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_mimebase_custom_policy @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_mimebase_default_policy @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_nested_inner_contains_outer_boundary @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_nested_with_same_boundary @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_no_parts_in_a_multipart_with_empty_epilogue @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_no_parts_in_a_multipart_with_none_epilogue @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_one_part_in_a_multipart @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_seq_parts_in_a_multipart_with_empty_epilogue @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_seq_parts_in_a_multipart_with_empty_preamble @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_seq_parts_in_a_multipart_with_nl_epilogue @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_seq_parts_in_a_multipart_with_none_epilogue @ linux-x86_64 +test.test_email.test_email.TestMultipart.test_seq_parts_in_a_multipart_with_none_preamble @ linux-x86_64 +test.test_email.test_email.TestNonConformant.test_first_line_is_continuation_header @ linux-x86_64 +test.test_email.test_email.TestNonConformant.test_invalid_content_type @ linux-x86_64 +test.test_email.test_email.TestNonConformant.test_lying_multipart @ linux-x86_64 +test.test_email.test_email.TestNonConformant.test_missing_header_body_separator @ linux-x86_64 +test.test_email.test_email.TestNonConformant.test_missing_start_boundary @ linux-x86_64 +test.test_email.test_email.TestNonConformant.test_multipart_invalid_cte @ linux-x86_64 +test.test_email.test_email.TestNonConformant.test_multipart_no_boundary @ linux-x86_64 +test.test_email.test_email.TestNonConformant.test_multipart_no_cte_no_defect @ linux-x86_64 +test.test_email.test_email.TestNonConformant.test_multipart_valid_cte_no_defect @ linux-x86_64 +test.test_email.test_email.TestNonConformant.test_no_separating_blank_line @ linux-x86_64 +test.test_email.test_email.TestNonConformant.test_no_start_boundary @ linux-x86_64 +test.test_email.test_email.TestNonConformant.test_parse_missing_minor_type @ linux-x86_64 +test.test_email.test_email.TestNonConformant.test_same_boundary_inner_outer @ linux-x86_64 +test.test_email.test_email.TestNonMultipart.test_attach_raises_exception @ linux-x86_64 +test.test_email.test_email.TestNonMultipart.test_nonmultipart_is_not_multipart @ linux-x86_64 +test.test_email.test_email.TestParsers.test_CRLFLF_at_end_of_part @ linux-x86_64 +test.test_email.test_email.TestParsers.test_bytes_header_parser @ linux-x86_64 +test.test_email.test_email.TestParsers.test_bytes_parser_does_not_close_file @ linux-x86_64 +test.test_email.test_email.TestParsers.test_bytes_parser_on_exception_does_not_close_file @ linux-x86_64 +test.test_email.test_email.TestParsers.test_crlf_flatten @ linux-x86_64 +test.test_email.test_email.TestParsers.test_crlf_separation @ linux-x86_64 +test.test_email.test_email.TestParsers.test_header_parser @ linux-x86_64 +test.test_email.test_email.TestParsers.test_header_parser_multipart_is_valid @ linux-x86_64 +test.test_email.test_email.TestParsers.test_multipart_digest_with_extra_mime_headers @ linux-x86_64 +test.test_email.test_email.TestParsers.test_parser_does_not_close_file @ linux-x86_64 +test.test_email.test_email.TestParsers.test_parser_on_exception_does_not_close_file @ linux-x86_64 +test.test_email.test_email.TestParsers.test_rfc2822_header_syntax @ linux-x86_64 +test.test_email.test_email.TestParsers.test_rfc2822_one_character_header @ linux-x86_64 +test.test_email.test_email.TestParsers.test_rfc2822_space_not_allowed_in_header @ linux-x86_64 +test.test_email.test_email.TestParsers.test_strip_line_feed_and_carriage_return_in_headers @ linux-x86_64 +test.test_email.test_email.TestParsers.test_three_lines @ linux-x86_64 +test.test_email.test_email.TestParsers.test_whitespace_continuation @ linux-x86_64 +test.test_email.test_email.TestParsers.test_whitespace_continuation_last_header @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_body_quopri_len @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_false_quoting @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_lowercase_quoting @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_multiple_spaces @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_null_line_null_word @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_null_word @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_one_line @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_one_line_cr @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_one_line_crnl @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_one_line_lf @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_one_line_nl @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_one_line_one_word @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_one_line_one_word_eol @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_one_line_trailing_spaces @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_one_long_line @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_one_space @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_one_word @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_one_word_eol @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_quoted_word @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_soft_line_break @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_two_lines @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_two_lines_eol @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_two_lines_trailing_spaces @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_decode_uppercase_quoting @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_maxlinelen_too_small @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_null @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_null_lines @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_one_line @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_one_line_crlf @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_one_line_eol @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_one_line_eol_after_non_ascii @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_one_line_one_space @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_one_line_trailing_spaces @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_one_line_trailing_tab @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_one_long_line @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_one_long_string @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_one_space @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_one_very_long_line @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_one_word_trailing_spaces @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_one_word_trailing_tab @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_quoted_equals @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_shortest_maxlinelen @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_trailing_space_at_maxlinelen @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_trailing_space_before_maxlinelen @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_trailing_space_beyond_maxlinelen @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_two_lines_one_space @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_encode_whitespace_lines @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_header_decode_non_ascii @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_header_decode_null @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_header_decode_one_word @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_header_decode_re_bug_18380 @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_header_decode_two_lines @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_header_encode_alt_charset @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_header_encode_non_ascii @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_header_encode_null @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_header_encode_one_word @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_header_encode_two_lines @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_header_quopri_len @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_quopri_body_check @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_quopri_header_check @ linux-x86_64 +test.test_email.test_email.TestQuopri.test_quote_unquote_idempotent @ linux-x86_64 +test.test_email.test_email.TestRFC2047.test_multiline_header @ linux-x86_64 +test.test_email.test_email.TestRFC2047.test_rfc2047_B_bad_padding @ linux-x86_64 +test.test_email.test_email.TestRFC2047.test_rfc2047_Q_invalid_digits @ linux-x86_64 +test.test_email.test_email.TestRFC2047.test_rfc2047_missing_whitespace @ linux-x86_64 +test.test_email.test_email.TestRFC2047.test_rfc2047_multiline @ linux-x86_64 +test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_1 @ linux-x86_64 +test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_2 @ linux-x86_64 +test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_3 @ linux-x86_64 +test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_4 @ linux-x86_64 +test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_5a @ linux-x86_64 +test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_5b @ linux-x86_64 +test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_6 @ linux-x86_64 +test.test_email.test_email.TestRFC2047.test_rfc2047_rfc2047_7 @ linux-x86_64 +test.test_email.test_email.TestRFC2047.test_rfc2047_with_whitespace @ linux-x86_64 +test.test_email.test_email.TestRFC2047.test_whitespace_keeper_unicode @ linux-x86_64 +test.test_email.test_email.TestRFC2047.test_whitespace_keeper_unicode_2 @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_del_param @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_get_param @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_bad_character_in_charset @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_bad_character_in_encoding @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_bad_character_in_filename @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_bad_encoding_in_charset @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_bad_encoding_in_filename @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_encoded_then_unencoded_segments @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_get_content_charset @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_missing_tick @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_missing_tick_with_encoded_non_ascii @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_no_extended_values @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_no_language_or_charset @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_no_language_or_charset_in_boundary @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_no_language_or_charset_in_charset @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_no_language_or_charset_in_filename @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_no_language_or_charset_in_filename_encoded @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_parse_extra_quoting @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_parse_rfc_quoting @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_partly_encoded @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_partly_nonencoded @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_single_tick_in_filename @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_single_tick_in_filename_extended @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_tick_attack @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_tick_attack_extended @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_unencoded_then_encoded_segments @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_rfc2231_unknown_encoding @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_set_param @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_set_param_requote @ linux-x86_64 +test.test_email.test_email.TestRFC2231.test_should_not_hang_on_invalid_ew_messages @ linux-x86_64 +test.test_email.test_email.TestSigned.test_long_headers_as_string @ linux-x86_64 +test.test_email.test_email.TestSigned.test_long_headers_as_string_maxheaderlen @ linux-x86_64 +test.test_email.test_email.TestSigned.test_long_headers_flatten @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_compat32_max_line_length_does_not_fold_when_none @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_crlf_control_via_policy @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_cte_type_7bit_handles_unknown_8bit @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_cte_type_7bit_transforms_8bit_cte @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_flatten_linesep_overrides_policy @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_policy_0 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_policy_100 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_policy_20 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_policy_40 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_all_folds_0 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_all_folds_100 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_all_folds_20 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_all_folds_40 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_none_does_not_fold_0 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_none_does_not_fold_100 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_none_does_not_fold_20 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_max_line_length_with_refold_none_does_not_fold_40 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parameter_0 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parameter_100 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parameter_20 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parameter_40 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parm_overrides_policy_0 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parm_overrides_policy_100 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parm_overrides_policy_20 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_maxheaderlen_parm_overrides_policy_40 @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_rfc2231_wrapping @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_rfc2231_wrapping_switches_to_default_len_if_too_narrow @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_set_mangle_from_via_policy @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_smtp_policy @ linux-x86_64 +test.test_email.test_generator.TestBytesGenerator.test_smtputf8_policy @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_compat32_max_line_length_does_not_fold_when_none @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_crlf_control_via_policy @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_flatten_linesep_overrides_policy @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_max_line_length_policy_0 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_max_line_length_policy_100 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_max_line_length_policy_20 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_max_line_length_policy_40 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_all_folds_0 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_all_folds_100 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_all_folds_20 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_all_folds_40 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_none_does_not_fold_0 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_none_does_not_fold_100 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_none_does_not_fold_20 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_max_line_length_with_refold_none_does_not_fold_40 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_maxheaderlen_parameter_0 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_maxheaderlen_parameter_100 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_maxheaderlen_parameter_20 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_maxheaderlen_parameter_40 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_maxheaderlen_parm_overrides_policy_0 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_maxheaderlen_parm_overrides_policy_100 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_maxheaderlen_parm_overrides_policy_20 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_maxheaderlen_parm_overrides_policy_40 @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_rfc2231_wrapping @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_rfc2231_wrapping_switches_to_default_len_if_too_narrow @ linux-x86_64 +test.test_email.test_generator.TestGenerator.test_set_mangle_from_via_policy @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_addr_spec_and_domain_raises @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_addr_spec_and_username_and_domain_raises @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_addr_spec_and_username_raises @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_comparison @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_display_name_ro @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_domain_ro @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_from_addr_spec @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_from_username_domain @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_username_ro @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_address_with_no_display_name @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_bad_addr_sepc_raises @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_crlf_in_constructor_args_raises @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_display_name_blanks_not_quoted @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_display_name_only @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_display_name_quoting @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_domain_only @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_empty_group @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_empty_group_list @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_group_addresses_ro @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_group_comparison @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_group_display_name_ro @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_group_with_addresses @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_group_with_addresses_no_display_name @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_group_with_one_address_no_display_name @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_il8n @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_non_ascii_username_in_addr_spec_raises @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_null_address @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_null_group @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_quoting @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_set_message_header_from_address @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_set_message_header_from_group @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_space_in_addr_spec_username_raises @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressAndGroup.test_username_only @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_address_only @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_empty @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_escaped_escapes_in_local_part @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_escaped_quoted_strings_in_local_part @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_name_and_address @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_name_with_dot @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_quoted_backslashes_in_name @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_quoted_local_part @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_quoted_parens_in_name @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_quoted_strings_in_local_part @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_read_only @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_rfc2047_atom_in_phrase_is_decoded @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_rfc2047_atom_in_quoted_string_is_decoded @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_rfc2047_atom_is_decoded @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_spaces_around_dots_in_local_part_removed @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_address_spaces_in_unquoted_local_part_collapsed @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_addresses_read_only @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_addresses_types @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_complex_address_list @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_address_only @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_empty @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_escaped_escapes_in_local_part @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_escaped_quoted_strings_in_local_part @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_name_and_address @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_name_with_dot @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_quoted_backslashes_in_name @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_quoted_local_part @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_quoted_parens_in_name @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_quoted_strings_in_local_part @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_rfc2047_atom_in_phrase_is_decoded @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_rfc2047_atom_in_quoted_string_is_decoded @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_rfc2047_atom_is_decoded @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_spaces_around_dots_in_local_part_removed @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_group_spaces_in_unquoted_local_part_collapsed @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_groups_read_only @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_groups_types @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_set_from_Address @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_set_from_Address_and_Group_list @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_set_from_Address_list @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_set_from_Group_list @ linux-x86_64 +test.test_email.test_headerregistry.TestAddressHeader.test_simple_address_list @ linux-x86_64 +test.test_email.test_headerregistry.TestBaseHeaderFeatures.test_defects_is_tuple @ linux-x86_64 +test.test_email.test_headerregistry.TestBaseHeaderFeatures.test_defects_read_only @ linux-x86_64 +test.test_email.test_headerregistry.TestBaseHeaderFeatures.test_has_name @ linux-x86_64 +test.test_email.test_headerregistry.TestBaseHeaderFeatures.test_name_read_only @ linux-x86_64 +test.test_email.test_headerregistry.TestBaseHeaderFeatures.test_str @ linux-x86_64 +test.test_email.test_headerregistry.TestBaseHeaderFeatures.test_substr @ linux-x86_64 +test.test_email.test_headerregistry.TestContentDisposition.test_value_RFC_2183_1 @ linux-x86_64 +test.test_email.test_headerregistry.TestContentDisposition.test_value_RFC_2183_2 @ linux-x86_64 +test.test_email.test_headerregistry.TestContentDisposition.test_value_invalid_parameter_value_with_fws_between_ew @ linux-x86_64 +test.test_email.test_headerregistry.TestContentDisposition.test_value_invalid_value @ linux-x86_64 +test.test_email.test_headerregistry.TestContentDisposition.test_value_invalid_value_with_params @ linux-x86_64 +test.test_email.test_headerregistry.TestContentDisposition.test_value_no_value @ linux-x86_64 +test.test_email.test_headerregistry.TestContentDisposition.test_value_parameter_value_with_fws_between_tokens @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTransferEncoding.test_value_RFC_2183_1 @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTransferEncoding.test_value_junk_after_cte @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTransferEncoding.test_value_no_value @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_RFC_2045_1 @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_RFC_2045_2 @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_RFC_2045_3 @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_bad_params @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_capitalized_charset @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_capitalized_charset_param_name_and_comment @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_cfws_in_content_type @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_charset_param @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_double_quotes_inside_quotes @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_junk_text_in_content_type @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_lots_of_mime_params @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_mixed_case_content_type @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_no_slash_in_content_type @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_no_subtype_in_content_type @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_non_ascii_in_params @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_non_ascii_rfc2231_value @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_param_value_with_tspecials @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_param_with_extra_quoted_whitespace @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_quotes_inside_rfc2231_value @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_bad_character_in_charset_parameter_value @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_encoded_charset @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_encoded_no_charset @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_encoded_no_double_quotes @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_encoded_then_unencoded_segments @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_encoded_with_double_quotes @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_folded_segments_correctly_formatted @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_no_language_or_charset @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_nonascii_in_charset_of_charset_parameter_value @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_partly_encoded @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_partly_encoded_2 @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_quoted_unencoded_then_encoded_segments @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_segmented_normal_values @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_single_quote_in_non_encoded_value @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_single_quote_in_value_with_charset_and_lang @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_single_quote_inside_double_quotes @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_unencoded_then_encoded_segments @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_unknown_charset_treated_as_ascii @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_rfc2231_utf8_in_supposedly_ascii_charset_parameter_value @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_semis_inside_quotes @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_single_quotes_inside_quotes @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_spaces_around_param_equals @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_spaces_around_semis @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_spaces_in_content_type @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_too_many_slashes_in_content_type @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_unknown_charset @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_unknown_content_type @ linux-x86_64 +test.test_email.test_headerregistry.TestContentTypeHeader.test_value_unquoted_param_value @ linux-x86_64 +test.test_email.test_headerregistry.TestDateHeader.test_date_header_properties @ linux-x86_64 +test.test_email.test_headerregistry.TestDateHeader.test_datetime_read_only @ linux-x86_64 +test.test_email.test_headerregistry.TestDateHeader.test_invalid_date_format @ linux-x86_64 +test.test_email.test_headerregistry.TestDateHeader.test_invalid_date_value @ linux-x86_64 +test.test_email.test_headerregistry.TestDateHeader.test_no_value_is_defect @ linux-x86_64 +test.test_email.test_headerregistry.TestDateHeader.test_parse_date @ linux-x86_64 +test.test_email.test_headerregistry.TestDateHeader.test_resent_date_header_properties @ linux-x86_64 +test.test_email.test_headerregistry.TestDateHeader.test_set_date_header_from_datetime @ linux-x86_64 +test.test_email.test_headerregistry.TestDateHeader.test_set_from_datetime @ linux-x86_64 +test.test_email.test_headerregistry.TestFolding.test_address_display_names @ linux-x86_64 +test.test_email.test_headerregistry.TestFolding.test_fold_address_list @ linux-x86_64 +test.test_email.test_headerregistry.TestFolding.test_fold_date_header @ linux-x86_64 +test.test_email.test_headerregistry.TestFolding.test_fold_overlong_words_using_RFC2047 @ linux-x86_64 +test.test_email.test_headerregistry.TestFolding.test_fold_unstructured_short @ linux-x86_64 +test.test_email.test_headerregistry.TestFolding.test_fold_unstructured_single_word @ linux-x86_64 +test.test_email.test_headerregistry.TestFolding.test_fold_unstructured_with_commas @ linux-x86_64 +test.test_email.test_headerregistry.TestFolding.test_fold_unstructured_with_overlong_word @ linux-x86_64 +test.test_email.test_headerregistry.TestFolding.test_fold_unstructured_with_slightly_long_word @ linux-x86_64 +test.test_email.test_headerregistry.TestFolding.test_fold_unstructured_with_two_overlong_words @ linux-x86_64 +test.test_email.test_headerregistry.TestFolding.test_long_unstructured @ linux-x86_64 +test.test_email.test_headerregistry.TestFolding.test_message_id_header_is_not_folded @ linux-x86_64 +test.test_email.test_headerregistry.TestFolding.test_short_unstructured @ linux-x86_64 +test.test_email.test_headerregistry.TestFolding.test_unstructured_short_max_line_length @ linux-x86_64 +test.test_email.test_headerregistry.TestHeaderRegistry.test_arbitrary_name_unstructured @ linux-x86_64 +test.test_email.test_headerregistry.TestHeaderRegistry.test_dont_use_default_map @ linux-x86_64 +test.test_email.test_headerregistry.TestHeaderRegistry.test_map_to_type @ linux-x86_64 +test.test_email.test_headerregistry.TestHeaderRegistry.test_name_case_ignored @ linux-x86_64 +test.test_email.test_headerregistry.TestHeaderRegistry.test_override_default_base_class @ linux-x86_64 +test.test_email.test_headerregistry.TestHeaderRegistry.test_override_default_class @ linux-x86_64 +test.test_email.test_headerregistry.TestHeaderRegistry.test_override_default_class_only_overrides_default @ linux-x86_64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_1_1 @ linux-x86_64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_2_1 @ linux-x86_64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_2_x @ linux-x86_64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_RFC_2045_1 @ linux-x86_64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_RFC_2045_2 @ linux-x86_64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_RFC_2045_3 @ linux-x86_64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_RFC_2045_4 @ linux-x86_64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_foo @ linux-x86_64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_leading_trailing_whitespace_ignored @ linux-x86_64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_missing @ linux-x86_64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_non_comment_garbage_after @ linux-x86_64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_non_comment_garbage_before @ linux-x86_64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_non_comment_garbage_inside @ linux-x86_64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_two_periods @ linux-x86_64 +test.test_email.test_headerregistry.TestMIMEVersionHeader.test_MIME_Version_whitespace @ linux-x86_64 +test.test_email.test_headerregistry.TestUnstructuredHeader.test_value_rfc2047_gb2312_base64 @ linux-x86_64 +test.test_email.test_headerregistry.TestUnstructuredHeader.test_value_rfc2047_quopri_with_regular_text @ linux-x86_64 +test.test_email.test_headerregistry.TestUnstructuredHeader.test_value_rfc2047_simple_nonascii_quopri @ linux-x86_64 +test.test_email.test_headerregistry.TestUnstructuredHeader.test_value_rfc2047_simple_quopri @ linux-x86_64 +test.test_email.test_inversion.TestInversion.test_body_base64_text @ linux-x86_64 +test.test_email.test_inversion.TestInversion.test_body_plain_text @ linux-x86_64 +test.test_email.test_inversion.TestInversion.test_body_qp_text @ linux-x86_64 +test.test_email.test_inversion.TestInversion.test_input_header_with_invalid_date @ linux-x86_64 +test.test_email.test_inversion.TestInversion.test_input_header_with_one_space_body @ linux-x86_64 +test.test_email.test_message.Test.test_error_on_setitem_if_max_count_exceeded @ linux-x86_64 +test.test_email.test_message.Test.test_rfc2043_auto_decoded_and_emailmessage_used @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_add_alternative_alternative_ @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_add_alternative_mixed_raises @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_add_alternative_no_content_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_add_alternative_none_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_add_alternative_plain_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_add_alternative_related_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_add_mixed_alternative_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_add_mixed_mixed_ @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_add_mixed_no_content_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_add_mixed_none_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_add_mixed_plain_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_add_mixed_related_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_add_related_alternative_raises @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_add_related_mixed_raises @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_add_related_no_content_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_add_related_none_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_add_related_plain_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_add_related_related_ @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_as_string_allows_maxheaderlen @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_as_string_unixform @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_as_string_uses_max_header_length_by_default @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_content_empty_message @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_content_html_text_attachment_inline_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_content_html_text_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_content_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_content_mime_non_text @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_content_mixed_alternative_plain_related @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_content_mixed_related_alternative_plain_html @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_content_mixed_related_alternative_plain_html_wrong_order @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_content_mixed_text_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_content_non_mime_plain @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_content_plain_html_alternative @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_content_plain_html_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_content_plain_html_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_content_related @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_content_related_with_start @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_empty_message @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_html_text_attachment_inline_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_html_text_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_mime_non_text @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_mixed_alternative_plain_related @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_mixed_related_alternative_plain_html @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_mixed_related_alternative_plain_html_wrong_order @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_mixed_text_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_non_mime_plain @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_plain_html_alternative @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_plain_html_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_plain_html_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_related @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_clear_related_with_start @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_default_content_manager_for_add_comes_from_policy @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_1 @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_2 @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_3 @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_4 @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_5 @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_6 @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_7 @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_folding_with_utf8_encoding_8 @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_get_body_empty_message @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_get_body_html_text_attachment_inline_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_get_body_html_text_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_get_body_malformed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_get_body_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_get_body_mime_non_text @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_get_body_mixed_alternative_plain_related @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_get_body_mixed_related_alternative_plain_html @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_get_body_mixed_related_alternative_plain_html_wrong_order @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_get_body_mixed_text_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_get_body_non_mime_plain @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_get_body_plain_html_alternative @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_get_body_plain_html_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_get_body_plain_html_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_get_body_related @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_get_body_related_with_start @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_get_content_default_cm_comes_from_policy @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_get_content_with_cm @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_is_attachment @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_empty_message @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_html_text_attachment_inline_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_html_text_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_mime_non_text @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_mixed_alternative_plain_related @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_mixed_related_alternative_plain_html @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_mixed_related_alternative_plain_html_wrong_order @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_mixed_text_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_non_mime_plain @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_plain_html_alternative @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_plain_html_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_plain_html_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_related @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_attachment_related_with_start @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_attachments_mutation @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_empty_message @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_html_text_attachment_inline_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_html_text_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_mime_non_text @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_mixed_alternative_plain_related @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_mixed_related_alternative_plain_html @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_mixed_related_alternative_plain_html_wrong_order @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_mixed_text_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_non_mime_plain @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_plain_html_alternative @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_plain_html_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_plain_html_mixed @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_related @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_iter_parts_related_with_start @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_alternative_alternative_ @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_alternative_mixed_raises @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_alternative_no_content_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_alternative_none_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_alternative_plain_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_alternative_related_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_mixed_alternative_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_mixed_mixed_ @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_mixed_no_content_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_mixed_none_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_mixed_plain_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_mixed_related_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_related_alternative_raises @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_related_mixed_raises @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_related_no_content_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_related_none_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_related_plain_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_related_related_ @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_alternative_alternative_ @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_alternative_mixed_raises @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_alternative_no_content_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_alternative_none_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_alternative_plain_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_alternative_related_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_mixed_alternative_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_mixed_mixed_ @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_mixed_no_content_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_mixed_none_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_mixed_plain_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_mixed_related_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_related_alternative_raises @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_related_mixed_raises @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_related_no_content_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_related_none_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_related_plain_succeeds @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_make_with_boundary_related_related_ @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_policy_on_part_made_by_make_comes_from_message @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_set_content_adds_MIME_Version @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_set_content_default_cm_comes_from_policy @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_set_content_does_not_duplicate_MIME_Version @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_set_content_with_cm @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_str_defaults_to_policy_max_line_length @ linux-x86_64 +test.test_email.test_message.TestEmailMessage.test_str_defaults_to_utf8 @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_add_alternative_alternative_ @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_add_alternative_mixed_raises @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_add_alternative_no_content_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_add_alternative_none_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_add_alternative_plain_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_add_alternative_related_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_add_mixed_alternative_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_add_mixed_mixed_ @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_add_mixed_no_content_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_add_mixed_none_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_add_mixed_plain_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_add_mixed_related_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_add_related_alternative_raises @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_add_related_mixed_raises @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_add_related_no_content_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_add_related_none_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_add_related_plain_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_add_related_related_ @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_content_empty_message @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_content_html_text_attachment_inline_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_content_html_text_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_content_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_content_mime_non_text @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_content_mixed_alternative_plain_related @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_content_mixed_related_alternative_plain_html @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_content_mixed_related_alternative_plain_html_wrong_order @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_content_mixed_text_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_content_non_mime_plain @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_content_plain_html_alternative @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_content_plain_html_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_content_plain_html_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_content_related @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_content_related_with_start @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_empty_message @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_html_text_attachment_inline_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_html_text_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_mime_non_text @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_mixed_alternative_plain_related @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_mixed_related_alternative_plain_html @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_mixed_related_alternative_plain_html_wrong_order @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_mixed_text_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_non_mime_plain @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_plain_html_alternative @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_plain_html_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_plain_html_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_related @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_clear_related_with_start @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_default_content_manager_for_add_comes_from_policy @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_get_body_empty_message @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_get_body_html_text_attachment_inline_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_get_body_html_text_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_get_body_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_get_body_mime_non_text @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_get_body_mixed_alternative_plain_related @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_get_body_mixed_related_alternative_plain_html @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_get_body_mixed_related_alternative_plain_html_wrong_order @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_get_body_mixed_text_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_get_body_non_mime_plain @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_get_body_plain_html_alternative @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_get_body_plain_html_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_get_body_plain_html_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_get_body_related @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_get_body_related_with_start @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_get_content_default_cm_comes_from_policy @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_get_content_with_cm @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_is_attachment @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_empty_message @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_html_text_attachment_inline_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_html_text_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_mime_non_text @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_mixed_alternative_plain_related @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_mixed_related_alternative_plain_html @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_mixed_related_alternative_plain_html_wrong_order @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_mixed_text_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_non_mime_plain @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_plain_html_alternative @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_plain_html_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_plain_html_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_related @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_attachment_related_with_start @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_attachments_mutation @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_empty_message @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_html_text_attachment_inline_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_html_text_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_mime_non_text @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_mixed_alternative_plain_related @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_mixed_related_alternative_plain_html @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_mixed_related_alternative_plain_html_wrong_order @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_mixed_text_message_rfc822 @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_non_mime_plain @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_plain_html_alternative @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_plain_html_attachment_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_plain_html_mixed @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_related @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_iter_parts_related_with_start @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_alternative_alternative_ @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_alternative_mixed_raises @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_alternative_no_content_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_alternative_none_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_alternative_plain_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_alternative_related_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_mixed_alternative_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_mixed_mixed_ @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_mixed_no_content_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_mixed_none_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_mixed_plain_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_mixed_related_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_related_alternative_raises @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_related_mixed_raises @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_related_no_content_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_related_none_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_related_plain_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_related_related_ @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_alternative_alternative_ @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_alternative_mixed_raises @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_alternative_no_content_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_alternative_none_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_alternative_plain_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_alternative_related_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_mixed_alternative_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_mixed_mixed_ @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_mixed_no_content_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_mixed_none_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_mixed_plain_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_mixed_related_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_related_alternative_raises @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_related_mixed_raises @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_related_no_content_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_related_none_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_related_plain_succeeds @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_make_with_boundary_related_related_ @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_policy_on_part_made_by_make_comes_from_message @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_set_content_default_cm_comes_from_policy @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_set_content_does_not_add_MIME_Version @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_set_content_with_cm @ linux-x86_64 +test.test_email.test_message.TestMIMEPart.test_string_payload_with_multipart_content_type @ linux-x86_64 +test.test_email.test_parser.TestBytesParser.test_custom_message_factory_on_policy @ linux-x86_64 +test.test_email.test_parser.TestBytesParser.test_factory_arg_overrides_policy @ linux-x86_64 +test.test_email.test_parser.TestBytesParser.test_only_split_on_cr_lf @ linux-x86_64 +test.test_email.test_parser.TestCustomMessage.test_custom_message_gets_policy_if_possible_from_file @ linux-x86_64 +test.test_email.test_parser.TestCustomMessage.test_custom_message_gets_policy_if_possible_from_string @ linux-x86_64 +test.test_email.test_parser.TestParser.test_custom_message_factory_on_policy @ linux-x86_64 +test.test_email.test_parser.TestParser.test_factory_arg_overrides_policy @ linux-x86_64 +test.test_email.test_parser.TestParser.test_only_split_on_cr_lf @ linux-x86_64 +test.test_email.test_pickleable.TestPickleCopyHeader.test_deepcopy_date @ linux-x86_64 +test.test_email.test_pickleable.TestPickleCopyHeader.test_deepcopy_from @ linux-x86_64 +test.test_email.test_pickleable.TestPickleCopyHeader.test_deepcopy_subject @ linux-x86_64 +test.test_email.test_pickleable.TestPickleCopyHeader.test_deepcopy_to @ linux-x86_64 +test.test_email.test_pickleable.TestPickleCopyHeader.test_pickle_date @ linux-x86_64 +test.test_email.test_pickleable.TestPickleCopyHeader.test_pickle_from @ linux-x86_64 +test.test_email.test_pickleable.TestPickleCopyHeader.test_pickle_subject @ linux-x86_64 +test.test_email.test_pickleable.TestPickleCopyHeader.test_pickle_to @ linux-x86_64 +test.test_email.test_pickleable.TestPickleCopyMessage.test_deepcopy_created @ linux-x86_64 +test.test_email.test_pickleable.TestPickleCopyMessage.test_deepcopy_parsed @ linux-x86_64 +test.test_email.test_pickleable.TestPickleCopyMessage.test_pickle_created @ linux-x86_64 +test.test_email.test_pickleable.TestPickleCopyMessage.test_pickle_parsed @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_abc @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_adding_default_policies_preserves_default_factory @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_all_attributes_covered @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_clone_copies_factory @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_default_header_factory @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_defaults @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_each_Policy_gets_unique_factory @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_fold_zero_max_line_length @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_handle_defect_raises_on_strict @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_handle_defect_registers_defect @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_new_factory_overrides_default @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_non_ascii_chars_do_not_cause_inf_loop @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_overridden_register_defect_still_raises @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_overridden_register_defect_works @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_policy_addition @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_policy_is_immutable @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_register_defect @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_reject_non_policy_keyword_when_called @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_set_policy_attrs_when_cloned @ linux-x86_64 +test.test_email.test_policy.PolicyAPITests.test_short_maxlen_error @ linux-x86_64 +test.test_email.test_policy.TestConcretePolicies.test_header_store_parse_rejects_newlines @ linux-x86_64 +test.test_email.test_policy.TestPolicyPropagation.test_bytes_parser @ linux-x86_64 +test.test_email.test_policy.TestPolicyPropagation.test_message_from_binary_file @ linux-x86_64 +test.test_email.test_policy.TestPolicyPropagation.test_message_from_bytes @ linux-x86_64 +test.test_email.test_policy.TestPolicyPropagation.test_message_from_file @ linux-x86_64 +test.test_email.test_policy.TestPolicyPropagation.test_message_from_string @ linux-x86_64 +test.test_email.test_policy.TestPolicyPropagation.test_message_policy_propagates_to_generator @ linux-x86_64 +test.test_email.test_policy.TestPolicyPropagation.test_message_policy_used_by_as_string @ linux-x86_64 +test.test_email.test_policy.TestPolicyPropagation.test_parser @ linux-x86_64 +test.test_email.test_policy.TestPolicyPropagation.test_parser_propagates_policy_to_message @ linux-x86_64 +test.test_email.test_policy.TestPolicyPropagation.test_parser_propagates_policy_to_sub_messages @ linux-x86_64 +test.test_email.test_utils.DateTimeTests.test_aware_datetime @ linux-x86_64 +test.test_email.test_utils.DateTimeTests.test_naive_datetime @ linux-x86_64 +test.test_email.test_utils.DateTimeTests.test_parsedate_to_datetime @ linux-x86_64 +test.test_email.test_utils.DateTimeTests.test_parsedate_to_datetime_naive @ linux-x86_64 +test.test_email.test_utils.DateTimeTests.test_parsedate_to_datetime_with_invalid_raises_valueerror @ linux-x86_64 +test.test_email.test_utils.DateTimeTests.test_usegmt @ linux-x86_64 +test.test_email.test_utils.DateTimeTests.test_usegmt_with_naive_datetime_raises @ linux-x86_64 +test.test_email.test_utils.DateTimeTests.test_usegmt_with_non_utc_datetime_raises @ linux-x86_64 +test.test_email.test_utils.LocaltimeTests.test_localtime_daylight_false_dst_false @ linux-x86_64 +test.test_email.test_utils.LocaltimeTests.test_localtime_daylight_false_dst_true @ linux-x86_64 +test.test_email.test_utils.LocaltimeTests.test_localtime_daylight_true_dst_false @ linux-x86_64 +test.test_email.test_utils.LocaltimeTests.test_localtime_daylight_true_dst_true @ linux-x86_64 +test.test_email.test_utils.LocaltimeTests.test_localtime_epoch_notz_daylight_false @ linux-x86_64 +test.test_email.test_utils.LocaltimeTests.test_localtime_epoch_notz_daylight_true @ linux-x86_64 +test.test_email.test_utils.LocaltimeTests.test_localtime_epoch_utc_daylight_false @ linux-x86_64 +test.test_email.test_utils.LocaltimeTests.test_localtime_epoch_utc_daylight_true @ linux-x86_64 +test.test_email.test_utils.LocaltimeTests.test_localtime_is_tz_aware_daylight_false @ linux-x86_64 +test.test_email.test_utils.LocaltimeTests.test_localtime_is_tz_aware_daylight_true @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ensurepip.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ensurepip.txt new file mode 100644 index 0000000000..4c357b2ef0 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ensurepip.txt @@ -0,0 +1,30 @@ +test.test_ensurepip.TestBootstrap.test_altinstall_default_pip_conflict @ linux-x86_64 +test.test_ensurepip.TestBootstrap.test_basic_bootstrapping @ linux-x86_64 +test.test_ensurepip.TestBootstrap.test_bootstrapping_with_alt_install @ linux-x86_64 +test.test_ensurepip.TestBootstrap.test_bootstrapping_with_default_pip @ linux-x86_64 +test.test_ensurepip.TestBootstrap.test_bootstrapping_with_regular_install @ linux-x86_64 +test.test_ensurepip.TestBootstrap.test_bootstrapping_with_root @ linux-x86_64 +test.test_ensurepip.TestBootstrap.test_bootstrapping_with_upgrade @ linux-x86_64 +test.test_ensurepip.TestBootstrap.test_bootstrapping_with_user @ linux-x86_64 +test.test_ensurepip.TestBootstrap.test_bootstrapping_with_verbosity_1 @ linux-x86_64 +test.test_ensurepip.TestBootstrap.test_bootstrapping_with_verbosity_2 @ linux-x86_64 +test.test_ensurepip.TestBootstrap.test_bootstrapping_with_verbosity_3 @ linux-x86_64 +test.test_ensurepip.TestBootstrap.test_pip_config_file_disabled @ linux-x86_64 +test.test_ensurepip.TestBootstrap.test_pip_environment_variables_removed @ linux-x86_64 +test.test_ensurepip.TestBootstrappingMainFunction.test_basic_bootstrapping @ linux-x86_64 +test.test_ensurepip.TestBootstrappingMainFunction.test_bootstrap_version @ linux-x86_64 +test.test_ensurepip.TestBootstrappingMainFunction.test_bootstrapping_error_code @ linux-x86_64 +test.test_ensurepip.TestPackages.test_get_packages_no_dir @ linux-x86_64 +test.test_ensurepip.TestPackages.test_get_packages_with_dir @ linux-x86_64 +test.test_ensurepip.TestPackages.test_version @ linux-x86_64 +test.test_ensurepip.TestUninstall.test_pip_config_file_disabled @ linux-x86_64 +test.test_ensurepip.TestUninstall.test_pip_environment_variables_removed @ linux-x86_64 +test.test_ensurepip.TestUninstall.test_uninstall @ linux-x86_64 +test.test_ensurepip.TestUninstall.test_uninstall_skipped_when_not_installed @ linux-x86_64 +test.test_ensurepip.TestUninstall.test_uninstall_skipped_with_warning_for_wrong_version @ linux-x86_64 +test.test_ensurepip.TestUninstall.test_uninstall_with_verbosity_1 @ linux-x86_64 +test.test_ensurepip.TestUninstall.test_uninstall_with_verbosity_2 @ linux-x86_64 +test.test_ensurepip.TestUninstall.test_uninstall_with_verbosity_3 @ linux-x86_64 +test.test_ensurepip.TestUninstallationMainFunction.test_basic_uninstall @ linux-x86_64 +test.test_ensurepip.TestUninstallationMainFunction.test_uninstall_error_code @ linux-x86_64 +test.test_ensurepip.TestUninstallationMainFunction.test_uninstall_version @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_enum.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_enum.txt new file mode 100644 index 0000000000..be63ac457f --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_enum.txt @@ -0,0 +1,586 @@ +DocTestCase.enum.Enum @ linux-x86_64 +DocTestCase.enum._simple_enum @ linux-x86_64 +DocTestCase.enum._test_simple_enum @ linux-x86_64 +DocTestCase.enum.bin @ linux-x86_64 +test.test_enum.MiscTestCase.test__all__ @ linux-x86_64 +test.test_enum.MiscTestCase.test_doc_1 @ linux-x86_64 +test.test_enum.MiscTestCase.test_doc_2 @ linux-x86_64 +test.test_enum.MiscTestCase.test_doc_3 @ linux-x86_64 +test.test_enum.MiscTestCase.test_doc_4 @ linux-x86_64 +test.test_enum.OldTestFlag.test_aliases @ linux-x86_64 +test.test_enum.OldTestFlag.test_and @ linux-x86_64 +test.test_enum.OldTestFlag.test_auto_number @ linux-x86_64 +test.test_enum.OldTestFlag.test_auto_number_garbage @ linux-x86_64 +test.test_enum.OldTestFlag.test_bool @ linux-x86_64 +test.test_enum.OldTestFlag.test_boundary @ linux-x86_64 +test.test_enum.OldTestFlag.test_contains_er @ linux-x86_64 +test.test_enum.OldTestFlag.test_duplicate_auto @ linux-x86_64 +test.test_enum.OldTestFlag.test_init_subclass @ linux-x86_64 +test.test_enum.OldTestFlag.test_iter @ linux-x86_64 +test.test_enum.OldTestFlag.test_member_contains @ linux-x86_64 +test.test_enum.OldTestFlag.test_member_iter @ linux-x86_64 +test.test_enum.OldTestFlag.test_member_length @ linux-x86_64 +test.test_enum.OldTestFlag.test_multiple_mixin @ linux-x86_64 +test.test_enum.OldTestFlag.test_number_reset_and_order_cleanup @ linux-x86_64 +test.test_enum.OldTestFlag.test_or @ linux-x86_64 +test.test_enum.OldTestFlag.test_pickle @ linux-x86_64 +test.test_enum.OldTestFlag.test_programatic_function_from_dict @ linux-x86_64 +test.test_enum.OldTestFlag.test_programatic_function_iterable @ linux-x86_64 +test.test_enum.OldTestFlag.test_programatic_function_string @ linux-x86_64 +test.test_enum.OldTestFlag.test_programatic_function_string_list @ linux-x86_64 +test.test_enum.OldTestFlag.test_programatic_function_string_with_start @ linux-x86_64 +test.test_enum.OldTestFlag.test_unique_composite @ linux-x86_64 +test.test_enum.OldTestFlag.test_xor @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_aliases @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_and @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_bool @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_boundary @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_contains_er @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_format @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_global_enum_str @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_global_repr_conform1 @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_global_repr_keep @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_invert @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_iter @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_member_contains @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_member_iter @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_member_length @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_multiple_mixin @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_or @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_programatic_function_from_dict @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_programatic_function_from_empty_list @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_programatic_function_from_empty_tuple @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_programatic_function_iterable @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_programatic_function_string @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_programatic_function_string_list @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_programatic_function_string_with_start @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_type @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_unique_composite @ linux-x86_64 +test.test_enum.OldTestIntFlag.test_xor @ linux-x86_64 +test.test_enum.TestConvert.test_convert_complex @ linux-x86_64 +test.test_enum.TestConvert.test_convert_int @ linux-x86_64 +test.test_enum.TestConvert.test_convert_raise @ linux-x86_64 +test.test_enum.TestConvert.test_convert_repr_and_str @ linux-x86_64 +test.test_enum.TestConvert.test_convert_str @ linux-x86_64 +test.test_enum.TestConvert.test_convert_uncomparable @ linux-x86_64 +test.test_enum.TestConvert.test_convert_value_lookup_priority @ linux-x86_64 +test.test_enum.TestEmptyAndNonLatinStrings.test_empty_string @ linux-x86_64 +test.test_enum.TestEmptyAndNonLatinStrings.test_non_latin_character_string @ linux-x86_64 +test.test_enum.TestEmptyAndNonLatinStrings.test_non_latin_number_string @ linux-x86_64 +test.test_enum.TestHelpers.test_dunder @ linux-x86_64 +test.test_enum.TestHelpers.test_is_descriptor @ linux-x86_64 +test.test_enum.TestHelpers.test_is_private @ linux-x86_64 +test.test_enum.TestHelpers.test_iter_bits_lsb @ linux-x86_64 +test.test_enum.TestHelpers.test_sunder @ linux-x86_64 +test.test_enum.TestIntEnum.test_attribute_deletion @ linux-x86_64 +test.test_enum.TestIntEnum.test_bad_new_super @ linux-x86_64 +test.test_enum.TestIntEnum.test_basics @ linux-x86_64 +test.test_enum.TestIntEnum.test_bool_is_true @ linux-x86_64 +test.test_enum.TestIntEnum.test_changing_member_fails @ linux-x86_64 +test.test_enum.TestIntEnum.test_contains_er @ linux-x86_64 +test.test_enum.TestIntEnum.test_copy @ linux-x86_64 +test.test_enum.TestIntEnum.test_copy_member @ linux-x86_64 +test.test_enum.TestIntEnum.test_dir_on_class @ linux-x86_64 +test.test_enum.TestIntEnum.test_dir_on_item @ linux-x86_64 +test.test_enum.TestIntEnum.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ linux-x86_64 +test.test_enum.TestIntEnum.test_dir_on_sub_with_behavior_on_super @ linux-x86_64 +test.test_enum.TestIntEnum.test_dir_with_added_behavior @ linux-x86_64 +test.test_enum.TestIntEnum.test_enum_in_enum_out @ linux-x86_64 +test.test_enum.TestIntEnum.test_format @ linux-x86_64 +test.test_enum.TestIntEnum.test_format_specs @ linux-x86_64 +test.test_enum.TestIntEnum.test_hash @ linux-x86_64 +test.test_enum.TestIntEnum.test_inherited_repr @ linux-x86_64 +test.test_enum.TestIntEnum.test_invalid_names @ linux-x86_64 +test.test_enum.TestIntEnum.test_multiple_superclasses_repr @ linux-x86_64 +test.test_enum.TestIntEnum.test_object_str_override @ linux-x86_64 +test.test_enum.TestIntEnum.test_overridden_format @ linux-x86_64 +test.test_enum.TestIntEnum.test_overridden_str @ linux-x86_64 +test.test_enum.TestIntEnum.test_overridden_str_format @ linux-x86_64 +test.test_enum.TestIntEnum.test_overridden_str_format_inherited @ linux-x86_64 +test.test_enum.TestIntEnum.test_programmatic_function_from_dict @ linux-x86_64 +test.test_enum.TestIntEnum.test_programmatic_function_iterable @ linux-x86_64 +test.test_enum.TestIntEnum.test_programmatic_function_string @ linux-x86_64 +test.test_enum.TestIntEnum.test_programmatic_function_string_list @ linux-x86_64 +test.test_enum.TestIntEnum.test_repr @ linux-x86_64 +test.test_enum.TestIntEnum.test_repr_override @ linux-x86_64 +test.test_enum.TestIntEnum.test_reversed_iteration_order @ linux-x86_64 +test.test_enum.TestIntEnum.test_str @ linux-x86_64 +test.test_enum.TestIntFlag.test_attribute_deletion @ linux-x86_64 +test.test_enum.TestIntFlag.test_bad_new_super @ linux-x86_64 +test.test_enum.TestIntFlag.test_basics @ linux-x86_64 +test.test_enum.TestIntFlag.test_bool_is_true @ linux-x86_64 +test.test_enum.TestIntFlag.test_changing_member_fails @ linux-x86_64 +test.test_enum.TestIntFlag.test_closed_invert_expectations @ linux-x86_64 +test.test_enum.TestIntFlag.test_contains_er @ linux-x86_64 +test.test_enum.TestIntFlag.test_copy @ linux-x86_64 +test.test_enum.TestIntFlag.test_copy_member @ linux-x86_64 +test.test_enum.TestIntFlag.test_default_missing_with_wrong_type_value @ linux-x86_64 +test.test_enum.TestIntFlag.test_dir_on_class @ linux-x86_64 +test.test_enum.TestIntFlag.test_dir_on_item @ linux-x86_64 +test.test_enum.TestIntFlag.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ linux-x86_64 +test.test_enum.TestIntFlag.test_dir_on_sub_with_behavior_on_super @ linux-x86_64 +test.test_enum.TestIntFlag.test_dir_with_added_behavior @ linux-x86_64 +test.test_enum.TestIntFlag.test_enum_in_enum_out @ linux-x86_64 +test.test_enum.TestIntFlag.test_format @ linux-x86_64 +test.test_enum.TestIntFlag.test_format_specs @ linux-x86_64 +test.test_enum.TestIntFlag.test_hash @ linux-x86_64 +test.test_enum.TestIntFlag.test_inherited_repr @ linux-x86_64 +test.test_enum.TestIntFlag.test_invalid_names @ linux-x86_64 +test.test_enum.TestIntFlag.test_multiple_superclasses_repr @ linux-x86_64 +test.test_enum.TestIntFlag.test_object_str_override @ linux-x86_64 +test.test_enum.TestIntFlag.test_open_invert_expectations @ linux-x86_64 +test.test_enum.TestIntFlag.test_overridden_format @ linux-x86_64 +test.test_enum.TestIntFlag.test_overridden_str @ linux-x86_64 +test.test_enum.TestIntFlag.test_overridden_str_format @ linux-x86_64 +test.test_enum.TestIntFlag.test_overridden_str_format_inherited @ linux-x86_64 +test.test_enum.TestIntFlag.test_programmatic_function_from_dict @ linux-x86_64 +test.test_enum.TestIntFlag.test_programmatic_function_iterable @ linux-x86_64 +test.test_enum.TestIntFlag.test_programmatic_function_string @ linux-x86_64 +test.test_enum.TestIntFlag.test_programmatic_function_string_list @ linux-x86_64 +test.test_enum.TestIntFlag.test_repr @ linux-x86_64 +test.test_enum.TestIntFlag.test_repr_override @ linux-x86_64 +test.test_enum.TestIntFlag.test_reversed_iteration_order @ linux-x86_64 +test.test_enum.TestIntFlag.test_str @ linux-x86_64 +test.test_enum.TestInternals.test_auto_garbage_corrected_ok @ linux-x86_64 +test.test_enum.TestInternals.test_auto_garbage_ok @ linux-x86_64 +test.test_enum.TestInternals.test_auto_name @ linux-x86_64 +test.test_enum.TestInternals.test_auto_name_inherit @ linux-x86_64 +test.test_enum.TestInternals.test_auto_number @ linux-x86_64 +test.test_enum.TestInternals.test_auto_order @ linux-x86_64 +test.test_enum.TestInternals.test_auto_order_wierd @ linux-x86_64 +test.test_enum.TestInternals.test_dunder @ linux-x86_64 +test.test_enum.TestInternals.test_duplicate_auto @ linux-x86_64 +test.test_enum.TestInternals.test_is_private @ linux-x86_64 +test.test_enum.TestInternals.test_multiple_auto_on_line @ linux-x86_64 +test.test_enum.TestInternals.test_sunder @ linux-x86_64 +test.test_enum.TestMinimalDate.test_attribute_deletion @ linux-x86_64 +test.test_enum.TestMinimalDate.test_bad_new_super @ linux-x86_64 +test.test_enum.TestMinimalDate.test_basics @ linux-x86_64 +test.test_enum.TestMinimalDate.test_bool_is_true @ linux-x86_64 +test.test_enum.TestMinimalDate.test_changing_member_fails @ linux-x86_64 +test.test_enum.TestMinimalDate.test_contains_er @ linux-x86_64 +test.test_enum.TestMinimalDate.test_copy @ linux-x86_64 +test.test_enum.TestMinimalDate.test_copy_member @ linux-x86_64 +test.test_enum.TestMinimalDate.test_dir_on_class @ linux-x86_64 +test.test_enum.TestMinimalDate.test_dir_on_item @ linux-x86_64 +test.test_enum.TestMinimalDate.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ linux-x86_64 +test.test_enum.TestMinimalDate.test_dir_on_sub_with_behavior_on_super @ linux-x86_64 +test.test_enum.TestMinimalDate.test_dir_with_added_behavior @ linux-x86_64 +test.test_enum.TestMinimalDate.test_enum_in_enum_out @ linux-x86_64 +test.test_enum.TestMinimalDate.test_format @ linux-x86_64 +test.test_enum.TestMinimalDate.test_format_specs @ linux-x86_64 +test.test_enum.TestMinimalDate.test_hash @ linux-x86_64 +test.test_enum.TestMinimalDate.test_inherited_repr @ linux-x86_64 +test.test_enum.TestMinimalDate.test_invalid_names @ linux-x86_64 +test.test_enum.TestMinimalDate.test_multiple_superclasses_repr @ linux-x86_64 +test.test_enum.TestMinimalDate.test_object_str_override @ linux-x86_64 +test.test_enum.TestMinimalDate.test_overridden_format @ linux-x86_64 +test.test_enum.TestMinimalDate.test_overridden_str @ linux-x86_64 +test.test_enum.TestMinimalDate.test_overridden_str_format @ linux-x86_64 +test.test_enum.TestMinimalDate.test_overridden_str_format_inherited @ linux-x86_64 +test.test_enum.TestMinimalDate.test_programmatic_function_from_dict @ linux-x86_64 +test.test_enum.TestMinimalDate.test_programmatic_function_iterable @ linux-x86_64 +test.test_enum.TestMinimalDate.test_programmatic_function_string @ linux-x86_64 +test.test_enum.TestMinimalDate.test_programmatic_function_string_list @ linux-x86_64 +test.test_enum.TestMinimalDate.test_repr @ linux-x86_64 +test.test_enum.TestMinimalDate.test_repr_override @ linux-x86_64 +test.test_enum.TestMinimalDate.test_reversed_iteration_order @ linux-x86_64 +test.test_enum.TestMinimalDate.test_str @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_attribute_deletion @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_bad_new_super @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_basics @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_bool_is_true @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_changing_member_fails @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_contains_er @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_copy @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_copy_member @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_dir_on_class @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_dir_on_item @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_dir_on_sub_with_behavior_on_super @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_dir_with_added_behavior @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_enum_in_enum_out @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_format @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_format_specs @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_hash @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_inherited_repr @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_invalid_names @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_multiple_superclasses_repr @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_object_str_override @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_overridden_format @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_overridden_str @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_overridden_str_format @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_overridden_str_format_inherited @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_programmatic_function_from_dict @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_programmatic_function_iterable @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_programmatic_function_string @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_programmatic_function_string_list @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_repr @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_repr_override @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_reversed_iteration_order @ linux-x86_64 +test.test_enum.TestMinimalFloat.test_str @ linux-x86_64 +test.test_enum.TestMixedDate.test_attribute_deletion @ linux-x86_64 +test.test_enum.TestMixedDate.test_bad_new_super @ linux-x86_64 +test.test_enum.TestMixedDate.test_basics @ linux-x86_64 +test.test_enum.TestMixedDate.test_bool_is_true @ linux-x86_64 +test.test_enum.TestMixedDate.test_changing_member_fails @ linux-x86_64 +test.test_enum.TestMixedDate.test_contains_er @ linux-x86_64 +test.test_enum.TestMixedDate.test_dir_on_class @ linux-x86_64 +test.test_enum.TestMixedDate.test_dir_on_item @ linux-x86_64 +test.test_enum.TestMixedDate.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ linux-x86_64 +test.test_enum.TestMixedDate.test_dir_on_sub_with_behavior_on_super @ linux-x86_64 +test.test_enum.TestMixedDate.test_dir_with_added_behavior @ linux-x86_64 +test.test_enum.TestMixedDate.test_enum_in_enum_out @ linux-x86_64 +test.test_enum.TestMixedDate.test_format @ linux-x86_64 +test.test_enum.TestMixedDate.test_format_specs @ linux-x86_64 +test.test_enum.TestMixedDate.test_hash @ linux-x86_64 +test.test_enum.TestMixedDate.test_inherited_repr @ linux-x86_64 +test.test_enum.TestMixedDate.test_invalid_names @ linux-x86_64 +test.test_enum.TestMixedDate.test_multiple_superclasses_repr @ linux-x86_64 +test.test_enum.TestMixedDate.test_object_str_override @ linux-x86_64 +test.test_enum.TestMixedDate.test_overridden_format @ linux-x86_64 +test.test_enum.TestMixedDate.test_overridden_str @ linux-x86_64 +test.test_enum.TestMixedDate.test_overridden_str_format @ linux-x86_64 +test.test_enum.TestMixedDate.test_overridden_str_format_inherited @ linux-x86_64 +test.test_enum.TestMixedDate.test_programmatic_function_from_dict @ linux-x86_64 +test.test_enum.TestMixedDate.test_programmatic_function_iterable @ linux-x86_64 +test.test_enum.TestMixedDate.test_programmatic_function_string @ linux-x86_64 +test.test_enum.TestMixedDate.test_programmatic_function_string_list @ linux-x86_64 +test.test_enum.TestMixedDate.test_repr @ linux-x86_64 +test.test_enum.TestMixedDate.test_repr_override @ linux-x86_64 +test.test_enum.TestMixedDate.test_reversed_iteration_order @ linux-x86_64 +test.test_enum.TestMixedDate.test_str @ linux-x86_64 +test.test_enum.TestMixedFloat.test_attribute_deletion @ linux-x86_64 +test.test_enum.TestMixedFloat.test_bad_new_super @ linux-x86_64 +test.test_enum.TestMixedFloat.test_basics @ linux-x86_64 +test.test_enum.TestMixedFloat.test_bool_is_true @ linux-x86_64 +test.test_enum.TestMixedFloat.test_changing_member_fails @ linux-x86_64 +test.test_enum.TestMixedFloat.test_contains_er @ linux-x86_64 +test.test_enum.TestMixedFloat.test_dir_on_class @ linux-x86_64 +test.test_enum.TestMixedFloat.test_dir_on_item @ linux-x86_64 +test.test_enum.TestMixedFloat.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ linux-x86_64 +test.test_enum.TestMixedFloat.test_dir_on_sub_with_behavior_on_super @ linux-x86_64 +test.test_enum.TestMixedFloat.test_dir_with_added_behavior @ linux-x86_64 +test.test_enum.TestMixedFloat.test_enum_in_enum_out @ linux-x86_64 +test.test_enum.TestMixedFloat.test_format @ linux-x86_64 +test.test_enum.TestMixedFloat.test_format_specs @ linux-x86_64 +test.test_enum.TestMixedFloat.test_hash @ linux-x86_64 +test.test_enum.TestMixedFloat.test_inherited_repr @ linux-x86_64 +test.test_enum.TestMixedFloat.test_invalid_names @ linux-x86_64 +test.test_enum.TestMixedFloat.test_multiple_superclasses_repr @ linux-x86_64 +test.test_enum.TestMixedFloat.test_object_str_override @ linux-x86_64 +test.test_enum.TestMixedFloat.test_overridden_format @ linux-x86_64 +test.test_enum.TestMixedFloat.test_overridden_str @ linux-x86_64 +test.test_enum.TestMixedFloat.test_overridden_str_format @ linux-x86_64 +test.test_enum.TestMixedFloat.test_overridden_str_format_inherited @ linux-x86_64 +test.test_enum.TestMixedFloat.test_programmatic_function_from_dict @ linux-x86_64 +test.test_enum.TestMixedFloat.test_programmatic_function_iterable @ linux-x86_64 +test.test_enum.TestMixedFloat.test_programmatic_function_string @ linux-x86_64 +test.test_enum.TestMixedFloat.test_programmatic_function_string_list @ linux-x86_64 +test.test_enum.TestMixedFloat.test_repr @ linux-x86_64 +test.test_enum.TestMixedFloat.test_repr_override @ linux-x86_64 +test.test_enum.TestMixedFloat.test_reversed_iteration_order @ linux-x86_64 +test.test_enum.TestMixedFloat.test_str @ linux-x86_64 +test.test_enum.TestMixedInt.test_attribute_deletion @ linux-x86_64 +test.test_enum.TestMixedInt.test_bad_new_super @ linux-x86_64 +test.test_enum.TestMixedInt.test_basics @ linux-x86_64 +test.test_enum.TestMixedInt.test_bool_is_true @ linux-x86_64 +test.test_enum.TestMixedInt.test_changing_member_fails @ linux-x86_64 +test.test_enum.TestMixedInt.test_contains_er @ linux-x86_64 +test.test_enum.TestMixedInt.test_dir_on_class @ linux-x86_64 +test.test_enum.TestMixedInt.test_dir_on_item @ linux-x86_64 +test.test_enum.TestMixedInt.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ linux-x86_64 +test.test_enum.TestMixedInt.test_dir_on_sub_with_behavior_on_super @ linux-x86_64 +test.test_enum.TestMixedInt.test_dir_with_added_behavior @ linux-x86_64 +test.test_enum.TestMixedInt.test_enum_in_enum_out @ linux-x86_64 +test.test_enum.TestMixedInt.test_format @ linux-x86_64 +test.test_enum.TestMixedInt.test_format_specs @ linux-x86_64 +test.test_enum.TestMixedInt.test_hash @ linux-x86_64 +test.test_enum.TestMixedInt.test_inherited_repr @ linux-x86_64 +test.test_enum.TestMixedInt.test_invalid_names @ linux-x86_64 +test.test_enum.TestMixedInt.test_multiple_superclasses_repr @ linux-x86_64 +test.test_enum.TestMixedInt.test_object_str_override @ linux-x86_64 +test.test_enum.TestMixedInt.test_overridden_format @ linux-x86_64 +test.test_enum.TestMixedInt.test_overridden_str @ linux-x86_64 +test.test_enum.TestMixedInt.test_overridden_str_format @ linux-x86_64 +test.test_enum.TestMixedInt.test_overridden_str_format_inherited @ linux-x86_64 +test.test_enum.TestMixedInt.test_programmatic_function_from_dict @ linux-x86_64 +test.test_enum.TestMixedInt.test_programmatic_function_iterable @ linux-x86_64 +test.test_enum.TestMixedInt.test_programmatic_function_string @ linux-x86_64 +test.test_enum.TestMixedInt.test_programmatic_function_string_list @ linux-x86_64 +test.test_enum.TestMixedInt.test_repr @ linux-x86_64 +test.test_enum.TestMixedInt.test_repr_override @ linux-x86_64 +test.test_enum.TestMixedInt.test_reversed_iteration_order @ linux-x86_64 +test.test_enum.TestMixedInt.test_str @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_attribute_deletion @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_bad_new_super @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_basics @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_bool_is_true @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_changing_member_fails @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_closed_invert_expectations @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_contains_er @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_default_missing_with_wrong_type_value @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_dir_on_class @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_dir_on_item @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_dir_on_sub_with_behavior_on_super @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_dir_with_added_behavior @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_enum_in_enum_out @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_format @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_format_specs @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_hash @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_inherited_repr @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_invalid_names @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_multiple_superclasses_repr @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_object_str_override @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_open_invert_expectations @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_overridden_format @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_overridden_str @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_overridden_str_format @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_overridden_str_format_inherited @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_programmatic_function_from_dict @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_programmatic_function_iterable @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_programmatic_function_string @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_programmatic_function_string_list @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_repr @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_repr_override @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_reversed_iteration_order @ linux-x86_64 +test.test_enum.TestMixedIntFlag.test_str @ linux-x86_64 +test.test_enum.TestMixedStr.test_attribute_deletion @ linux-x86_64 +test.test_enum.TestMixedStr.test_bad_new_super @ linux-x86_64 +test.test_enum.TestMixedStr.test_basics @ linux-x86_64 +test.test_enum.TestMixedStr.test_bool_is_true @ linux-x86_64 +test.test_enum.TestMixedStr.test_changing_member_fails @ linux-x86_64 +test.test_enum.TestMixedStr.test_contains_er @ linux-x86_64 +test.test_enum.TestMixedStr.test_dir_on_class @ linux-x86_64 +test.test_enum.TestMixedStr.test_dir_on_item @ linux-x86_64 +test.test_enum.TestMixedStr.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ linux-x86_64 +test.test_enum.TestMixedStr.test_dir_on_sub_with_behavior_on_super @ linux-x86_64 +test.test_enum.TestMixedStr.test_dir_with_added_behavior @ linux-x86_64 +test.test_enum.TestMixedStr.test_enum_in_enum_out @ linux-x86_64 +test.test_enum.TestMixedStr.test_format @ linux-x86_64 +test.test_enum.TestMixedStr.test_format_specs @ linux-x86_64 +test.test_enum.TestMixedStr.test_hash @ linux-x86_64 +test.test_enum.TestMixedStr.test_inherited_repr @ linux-x86_64 +test.test_enum.TestMixedStr.test_invalid_names @ linux-x86_64 +test.test_enum.TestMixedStr.test_multiple_superclasses_repr @ linux-x86_64 +test.test_enum.TestMixedStr.test_object_str_override @ linux-x86_64 +test.test_enum.TestMixedStr.test_overridden_format @ linux-x86_64 +test.test_enum.TestMixedStr.test_overridden_str @ linux-x86_64 +test.test_enum.TestMixedStr.test_overridden_str_format @ linux-x86_64 +test.test_enum.TestMixedStr.test_overridden_str_format_inherited @ linux-x86_64 +test.test_enum.TestMixedStr.test_programmatic_function_from_dict @ linux-x86_64 +test.test_enum.TestMixedStr.test_programmatic_function_iterable @ linux-x86_64 +test.test_enum.TestMixedStr.test_programmatic_function_string @ linux-x86_64 +test.test_enum.TestMixedStr.test_programmatic_function_string_list @ linux-x86_64 +test.test_enum.TestMixedStr.test_repr @ linux-x86_64 +test.test_enum.TestMixedStr.test_repr_override @ linux-x86_64 +test.test_enum.TestMixedStr.test_reversed_iteration_order @ linux-x86_64 +test.test_enum.TestMixedStr.test_str @ linux-x86_64 +test.test_enum.TestOrder.test_enum_has_extra_members @ linux-x86_64 +test.test_enum.TestOrder.test_enum_has_extra_members_with_aliases @ linux-x86_64 +test.test_enum.TestOrder.test_order_has_extra_members @ linux-x86_64 +test.test_enum.TestOrder.test_order_has_extra_members_with_aliases @ linux-x86_64 +test.test_enum.TestOrder.test_same_members @ linux-x86_64 +test.test_enum.TestOrder.test_same_members_with_aliases @ linux-x86_64 +test.test_enum.TestOrder.test_same_members_wrong_order @ linux-x86_64 +test.test_enum.TestPlainEnum.test_attribute_deletion @ linux-x86_64 +test.test_enum.TestPlainEnum.test_bad_new_super @ linux-x86_64 +test.test_enum.TestPlainEnum.test_basics @ linux-x86_64 +test.test_enum.TestPlainEnum.test_bool_is_true @ linux-x86_64 +test.test_enum.TestPlainEnum.test_changing_member_fails @ linux-x86_64 +test.test_enum.TestPlainEnum.test_contains_er @ linux-x86_64 +test.test_enum.TestPlainEnum.test_dir_on_class @ linux-x86_64 +test.test_enum.TestPlainEnum.test_dir_on_item @ linux-x86_64 +test.test_enum.TestPlainEnum.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ linux-x86_64 +test.test_enum.TestPlainEnum.test_dir_on_sub_with_behavior_on_super @ linux-x86_64 +test.test_enum.TestPlainEnum.test_dir_with_added_behavior @ linux-x86_64 +test.test_enum.TestPlainEnum.test_enum_in_enum_out @ linux-x86_64 +test.test_enum.TestPlainEnum.test_format @ linux-x86_64 +test.test_enum.TestPlainEnum.test_format_specs @ linux-x86_64 +test.test_enum.TestPlainEnum.test_hash @ linux-x86_64 +test.test_enum.TestPlainEnum.test_inherited_repr @ linux-x86_64 +test.test_enum.TestPlainEnum.test_invalid_names @ linux-x86_64 +test.test_enum.TestPlainEnum.test_multiple_superclasses_repr @ linux-x86_64 +test.test_enum.TestPlainEnum.test_object_str_override @ linux-x86_64 +test.test_enum.TestPlainEnum.test_overridden_format @ linux-x86_64 +test.test_enum.TestPlainEnum.test_overridden_str @ linux-x86_64 +test.test_enum.TestPlainEnum.test_overridden_str_format @ linux-x86_64 +test.test_enum.TestPlainEnum.test_overridden_str_format_inherited @ linux-x86_64 +test.test_enum.TestPlainEnum.test_programmatic_function_from_dict @ linux-x86_64 +test.test_enum.TestPlainEnum.test_programmatic_function_iterable @ linux-x86_64 +test.test_enum.TestPlainEnum.test_programmatic_function_string @ linux-x86_64 +test.test_enum.TestPlainEnum.test_programmatic_function_string_list @ linux-x86_64 +test.test_enum.TestPlainEnum.test_repr @ linux-x86_64 +test.test_enum.TestPlainEnum.test_repr_override @ linux-x86_64 +test.test_enum.TestPlainEnum.test_reversed_iteration_order @ linux-x86_64 +test.test_enum.TestPlainEnum.test_str @ linux-x86_64 +test.test_enum.TestPlainFlag.test_attribute_deletion @ linux-x86_64 +test.test_enum.TestPlainFlag.test_bad_new_super @ linux-x86_64 +test.test_enum.TestPlainFlag.test_basics @ linux-x86_64 +test.test_enum.TestPlainFlag.test_bool_is_true @ linux-x86_64 +test.test_enum.TestPlainFlag.test_changing_member_fails @ linux-x86_64 +test.test_enum.TestPlainFlag.test_closed_invert_expectations @ linux-x86_64 +test.test_enum.TestPlainFlag.test_contains_er @ linux-x86_64 +test.test_enum.TestPlainFlag.test_default_missing_with_wrong_type_value @ linux-x86_64 +test.test_enum.TestPlainFlag.test_dir_on_class @ linux-x86_64 +test.test_enum.TestPlainFlag.test_dir_on_item @ linux-x86_64 +test.test_enum.TestPlainFlag.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ linux-x86_64 +test.test_enum.TestPlainFlag.test_dir_on_sub_with_behavior_on_super @ linux-x86_64 +test.test_enum.TestPlainFlag.test_dir_with_added_behavior @ linux-x86_64 +test.test_enum.TestPlainFlag.test_enum_in_enum_out @ linux-x86_64 +test.test_enum.TestPlainFlag.test_format @ linux-x86_64 +test.test_enum.TestPlainFlag.test_format_specs @ linux-x86_64 +test.test_enum.TestPlainFlag.test_hash @ linux-x86_64 +test.test_enum.TestPlainFlag.test_inherited_repr @ linux-x86_64 +test.test_enum.TestPlainFlag.test_invalid_names @ linux-x86_64 +test.test_enum.TestPlainFlag.test_multiple_superclasses_repr @ linux-x86_64 +test.test_enum.TestPlainFlag.test_object_str_override @ linux-x86_64 +test.test_enum.TestPlainFlag.test_open_invert_expectations @ linux-x86_64 +test.test_enum.TestPlainFlag.test_overridden_format @ linux-x86_64 +test.test_enum.TestPlainFlag.test_overridden_str @ linux-x86_64 +test.test_enum.TestPlainFlag.test_overridden_str_format @ linux-x86_64 +test.test_enum.TestPlainFlag.test_overridden_str_format_inherited @ linux-x86_64 +test.test_enum.TestPlainFlag.test_programmatic_function_from_dict @ linux-x86_64 +test.test_enum.TestPlainFlag.test_programmatic_function_iterable @ linux-x86_64 +test.test_enum.TestPlainFlag.test_programmatic_function_string @ linux-x86_64 +test.test_enum.TestPlainFlag.test_programmatic_function_string_list @ linux-x86_64 +test.test_enum.TestPlainFlag.test_repr @ linux-x86_64 +test.test_enum.TestPlainFlag.test_repr_override @ linux-x86_64 +test.test_enum.TestPlainFlag.test_reversed_iteration_order @ linux-x86_64 +test.test_enum.TestPlainFlag.test_str @ linux-x86_64 +test.test_enum.TestSpecial.test_bool @ linux-x86_64 +test.test_enum.TestSpecial.test_comparisons @ linux-x86_64 +test.test_enum.TestSpecial.test_conflicting_types_resolved_in_new @ linux-x86_64 +test.test_enum.TestSpecial.test_custom_flag_bitwise @ linux-x86_64 +test.test_enum.TestSpecial.test_default_missing_no_chained_exception @ linux-x86_64 +test.test_enum.TestSpecial.test_duplicate_name_error @ linux-x86_64 +test.test_enum.TestSpecial.test_duplicate_values_give_unique_enum_items @ linux-x86_64 +test.test_enum.TestSpecial.test_dynamic_members_with_static_methods @ linux-x86_64 +test.test_enum.TestSpecial.test_empty_globals @ linux-x86_64 +test.test_enum.TestSpecial.test_enum_function_with_qualname @ linux-x86_64 +test.test_enum.TestSpecial.test_enum_of_generic_aliases @ linux-x86_64 +test.test_enum.TestSpecial.test_enum_of_types @ linux-x86_64 +test.test_enum.TestSpecial.test_enum_of_types_with_nonmember @ linux-x86_64 +test.test_enum.TestSpecial.test_enum_with_value_name @ linux-x86_64 +test.test_enum.TestSpecial.test_equality @ linux-x86_64 +test.test_enum.TestSpecial.test_exclude_methods @ linux-x86_64 +test.test_enum.TestSpecial.test_extending @ linux-x86_64 +test.test_enum.TestSpecial.test_extending2 @ linux-x86_64 +test.test_enum.TestSpecial.test_extending3 @ linux-x86_64 +test.test_enum.TestSpecial.test_flag_with_custom_new @ linux-x86_64 +test.test_enum.TestSpecial.test_floatenum_fromhex @ linux-x86_64 +test.test_enum.TestSpecial.test_flufl_enum @ linux-x86_64 +test.test_enum.TestSpecial.test_getattr_dunder @ linux-x86_64 +test.test_enum.TestSpecial.test_getattr_getitem @ linux-x86_64 +test.test_enum.TestSpecial.test_ignore @ linux-x86_64 +test.test_enum.TestSpecial.test_inherited_data_type @ linux-x86_64 +test.test_enum.TestSpecial.test_inherited_new_from_enhanced_enum @ linux-x86_64 +test.test_enum.TestSpecial.test_inherited_new_from_mixed_enum @ linux-x86_64 +test.test_enum.TestSpecial.test_init @ linux-x86_64 +test.test_enum.TestSpecial.test_init_exception @ linux-x86_64 +test.test_enum.TestSpecial.test_int_flags_copy @ linux-x86_64 +test.test_enum.TestSpecial.test_intenum_from_bytes @ linux-x86_64 +test.test_enum.TestSpecial.test_intenum_transitivity @ linux-x86_64 +test.test_enum.TestSpecial.test_introspection @ linux-x86_64 +test.test_enum.TestSpecial.test_iteration_order @ linux-x86_64 +test.test_enum.TestSpecial.test_member_from_member_access @ linux-x86_64 +test.test_enum.TestSpecial.test_missing_override @ linux-x86_64 +test.test_enum.TestSpecial.test_missing_value_error @ linux-x86_64 +test.test_enum.TestSpecial.test_mixed_enum_in_call_1 @ linux-x86_64 +test.test_enum.TestSpecial.test_mixed_enum_in_call_2 @ linux-x86_64 +test.test_enum.TestSpecial.test_multiple_inherited_mixin @ linux-x86_64 +test.test_enum.TestSpecial.test_multiple_mixin @ linux-x86_64 +test.test_enum.TestSpecial.test_multiple_mixin_inherited @ linux-x86_64 +test.test_enum.TestSpecial.test_multiple_mixin_mro @ linux-x86_64 +test.test_enum.TestSpecial.test_multiple_mixin_with_common_data_type @ linux-x86_64 +test.test_enum.TestSpecial.test_namedtuple_as_value @ linux-x86_64 +test.test_enum.TestSpecial.test_nested_classes_in_enum_are_members @ linux-x86_64 +test.test_enum.TestSpecial.test_nested_classes_in_enum_with_member @ linux-x86_64 +test.test_enum.TestSpecial.test_nested_classes_in_enum_with_nonmember @ linux-x86_64 +test.test_enum.TestSpecial.test_no_duplicates @ linux-x86_64 +test.test_enum.TestSpecial.test_no_such_enum_member @ linux-x86_64 +test.test_enum.TestSpecial.test_nonhash_value @ linux-x86_64 +test.test_enum.TestSpecial.test_ordered_mixin @ linux-x86_64 +test.test_enum.TestSpecial.test_pickle_by_name @ linux-x86_64 +test.test_enum.TestSpecial.test_pickle_enum @ linux-x86_64 +test.test_enum.TestSpecial.test_pickle_enum_function @ linux-x86_64 +test.test_enum.TestSpecial.test_pickle_enum_function_with_module @ linux-x86_64 +test.test_enum.TestSpecial.test_pickle_explodes @ linux-x86_64 +test.test_enum.TestSpecial.test_pickle_float @ linux-x86_64 +test.test_enum.TestSpecial.test_pickle_int @ linux-x86_64 +test.test_enum.TestSpecial.test_pickle_nested_class @ linux-x86_64 +test.test_enum.TestSpecial.test_private_variable_is_normal_attribute @ linux-x86_64 +test.test_enum.TestSpecial.test_programmatic_function_string_list_with_start @ linux-x86_64 +test.test_enum.TestSpecial.test_programmatic_function_string_with_start @ linux-x86_64 +test.test_enum.TestSpecial.test_programmatic_function_type @ linux-x86_64 +test.test_enum.TestSpecial.test_programmatic_function_type_from_subclass @ linux-x86_64 +test.test_enum.TestSpecial.test_programmatic_function_type_from_subclass_with_start @ linux-x86_64 +test.test_enum.TestSpecial.test_programmatic_function_type_with_start @ linux-x86_64 +test.test_enum.TestSpecial.test_repr_and_str_with_no_init_mixin @ linux-x86_64 +test.test_enum.TestSpecial.test_repr_with_dataclass @ linux-x86_64 +test.test_enum.TestSpecial.test_repr_with_init_mixin @ linux-x86_64 +test.test_enum.TestSpecial.test_reserved_sunder_error @ linux-x86_64 +test.test_enum.TestSpecial.test_strenum @ linux-x86_64 +test.test_enum.TestSpecial.test_string_enum @ linux-x86_64 +test.test_enum.TestSpecial.test_subclass_duplicate_name @ linux-x86_64 +test.test_enum.TestSpecial.test_subclass_duplicate_name_dynamic @ linux-x86_64 +test.test_enum.TestSpecial.test_subclasses_with_direct_pickle_support @ linux-x86_64 +test.test_enum.TestSpecial.test_subclasses_with_getnewargs @ linux-x86_64 +test.test_enum.TestSpecial.test_subclasses_with_getnewargs_ex @ linux-x86_64 +test.test_enum.TestSpecial.test_subclasses_with_reduce @ linux-x86_64 +test.test_enum.TestSpecial.test_subclasses_with_reduce_ex @ linux-x86_64 +test.test_enum.TestSpecial.test_subclasses_without_direct_pickle_support @ linux-x86_64 +test.test_enum.TestSpecial.test_subclassing @ linux-x86_64 +test.test_enum.TestSpecial.test_too_many_data_types @ linux-x86_64 +test.test_enum.TestSpecial.test_tuple_subclass @ linux-x86_64 +test.test_enum.TestSpecial.test_value_backup_assign @ linux-x86_64 +test.test_enum.TestSpecial.test_wrong_enum_in_call @ linux-x86_64 +test.test_enum.TestSpecial.test_wrong_enum_in_mixed_call @ linux-x86_64 +test.test_enum.TestSpecial.test_wrong_inheritance_order @ linux-x86_64 +test.test_enum.TestStdLib.test_inspect_classify_class_attrs @ linux-x86_64 +test.test_enum.TestStdLib.test_inspect_getmembers @ linux-x86_64 +test.test_enum.TestStdLib.test_pydoc @ linux-x86_64 +test.test_enum.TestStdLib.test_test_simple_enum @ linux-x86_64 +test.test_enum.TestStrEnum.test_attribute_deletion @ linux-x86_64 +test.test_enum.TestStrEnum.test_bad_new_super @ linux-x86_64 +test.test_enum.TestStrEnum.test_basics @ linux-x86_64 +test.test_enum.TestStrEnum.test_bool_is_true @ linux-x86_64 +test.test_enum.TestStrEnum.test_changing_member_fails @ linux-x86_64 +test.test_enum.TestStrEnum.test_contains_er @ linux-x86_64 +test.test_enum.TestStrEnum.test_copy @ linux-x86_64 +test.test_enum.TestStrEnum.test_copy_member @ linux-x86_64 +test.test_enum.TestStrEnum.test_dir_on_class @ linux-x86_64 +test.test_enum.TestStrEnum.test_dir_on_item @ linux-x86_64 +test.test_enum.TestStrEnum.test_dir_on_sub_with_behavior_including_instance_dict_on_super @ linux-x86_64 +test.test_enum.TestStrEnum.test_dir_on_sub_with_behavior_on_super @ linux-x86_64 +test.test_enum.TestStrEnum.test_dir_with_added_behavior @ linux-x86_64 +test.test_enum.TestStrEnum.test_enum_in_enum_out @ linux-x86_64 +test.test_enum.TestStrEnum.test_format @ linux-x86_64 +test.test_enum.TestStrEnum.test_format_specs @ linux-x86_64 +test.test_enum.TestStrEnum.test_hash @ linux-x86_64 +test.test_enum.TestStrEnum.test_inherited_repr @ linux-x86_64 +test.test_enum.TestStrEnum.test_invalid_names @ linux-x86_64 +test.test_enum.TestStrEnum.test_multiple_superclasses_repr @ linux-x86_64 +test.test_enum.TestStrEnum.test_object_str_override @ linux-x86_64 +test.test_enum.TestStrEnum.test_overridden_format @ linux-x86_64 +test.test_enum.TestStrEnum.test_overridden_str @ linux-x86_64 +test.test_enum.TestStrEnum.test_overridden_str_format @ linux-x86_64 +test.test_enum.TestStrEnum.test_overridden_str_format_inherited @ linux-x86_64 +test.test_enum.TestStrEnum.test_programmatic_function_from_dict @ linux-x86_64 +test.test_enum.TestStrEnum.test_programmatic_function_iterable @ linux-x86_64 +test.test_enum.TestStrEnum.test_programmatic_function_string @ linux-x86_64 +test.test_enum.TestStrEnum.test_programmatic_function_string_list @ linux-x86_64 +test.test_enum.TestStrEnum.test_repr @ linux-x86_64 +test.test_enum.TestStrEnum.test_repr_override @ linux-x86_64 +test.test_enum.TestStrEnum.test_reversed_iteration_order @ linux-x86_64 +test.test_enum.TestStrEnum.test_str @ linux-x86_64 +test.test_enum.TestUnique.test_unique_clean @ linux-x86_64 +test.test_enum.TestUnique.test_unique_dirty @ linux-x86_64 +test.test_enum.TestUnique.test_unique_with_name @ linux-x86_64 +test.test_enum.TestVerify.test_composite @ linux-x86_64 +test.test_enum.TestVerify.test_continuous @ linux-x86_64 +test.test_enum.TestVerify.test_negative_alias @ linux-x86_64 +test.test_enum.TestVerify.test_unique_clean @ linux-x86_64 +test.test_enum.TestVerify.test_unique_dirty @ linux-x86_64 +test.test_enum.TestVerify.test_unique_with_name @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_enumerate.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_enumerate.txt new file mode 100644 index 0000000000..ec427b036a --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_enumerate.txt @@ -0,0 +1,78 @@ +test.test_enumerate.EnumerateStartTestCase.test_argumentcheck @ linux-x86_64 +test.test_enumerate.EnumerateStartTestCase.test_basicfunction @ linux-x86_64 +test.test_enumerate.EnumerateStartTestCase.test_exception_propagation @ linux-x86_64 +test.test_enumerate.EnumerateStartTestCase.test_getitemseqn @ linux-x86_64 +test.test_enumerate.EnumerateStartTestCase.test_illformediterable @ linux-x86_64 +test.test_enumerate.EnumerateStartTestCase.test_iteratorgenerator @ linux-x86_64 +test.test_enumerate.EnumerateStartTestCase.test_iteratorseqn @ linux-x86_64 +test.test_enumerate.EnumerateStartTestCase.test_kwargs @ linux-x86_64 +test.test_enumerate.EnumerateStartTestCase.test_noniterable @ linux-x86_64 +test.test_enumerate.EnumerateStartTestCase.test_pickle @ linux-x86_64 +test.test_enumerate.EnumerateTestCase.test_argumentcheck @ linux-x86_64 +test.test_enumerate.EnumerateTestCase.test_basicfunction @ linux-x86_64 +test.test_enumerate.EnumerateTestCase.test_exception_propagation @ linux-x86_64 +test.test_enumerate.EnumerateTestCase.test_getitemseqn @ linux-x86_64 +test.test_enumerate.EnumerateTestCase.test_illformediterable @ linux-x86_64 +test.test_enumerate.EnumerateTestCase.test_iteratorgenerator @ linux-x86_64 +test.test_enumerate.EnumerateTestCase.test_iteratorseqn @ linux-x86_64 +test.test_enumerate.EnumerateTestCase.test_kwargs @ linux-x86_64 +test.test_enumerate.EnumerateTestCase.test_noniterable @ linux-x86_64 +test.test_enumerate.EnumerateTestCase.test_pickle @ linux-x86_64 +test.test_enumerate.SubclassTestCase.test_argumentcheck @ linux-x86_64 +test.test_enumerate.SubclassTestCase.test_basicfunction @ linux-x86_64 +test.test_enumerate.SubclassTestCase.test_exception_propagation @ linux-x86_64 +test.test_enumerate.SubclassTestCase.test_getitemseqn @ linux-x86_64 +test.test_enumerate.SubclassTestCase.test_illformediterable @ linux-x86_64 +test.test_enumerate.SubclassTestCase.test_iteratorgenerator @ linux-x86_64 +test.test_enumerate.SubclassTestCase.test_iteratorseqn @ linux-x86_64 +test.test_enumerate.SubclassTestCase.test_kwargs @ linux-x86_64 +test.test_enumerate.SubclassTestCase.test_noniterable @ linux-x86_64 +test.test_enumerate.SubclassTestCase.test_pickle @ linux-x86_64 +test.test_enumerate.TestBig.test_argumentcheck @ linux-x86_64 +test.test_enumerate.TestBig.test_basicfunction @ linux-x86_64 +test.test_enumerate.TestBig.test_exception_propagation @ linux-x86_64 +test.test_enumerate.TestBig.test_getitemseqn @ linux-x86_64 +test.test_enumerate.TestBig.test_illformediterable @ linux-x86_64 +test.test_enumerate.TestBig.test_iteratorgenerator @ linux-x86_64 +test.test_enumerate.TestBig.test_iteratorseqn @ linux-x86_64 +test.test_enumerate.TestBig.test_kwargs @ linux-x86_64 +test.test_enumerate.TestBig.test_noniterable @ linux-x86_64 +test.test_enumerate.TestBig.test_pickle @ linux-x86_64 +test.test_enumerate.TestEmpty.test_argumentcheck @ linux-x86_64 +test.test_enumerate.TestEmpty.test_basicfunction @ linux-x86_64 +test.test_enumerate.TestEmpty.test_exception_propagation @ linux-x86_64 +test.test_enumerate.TestEmpty.test_getitemseqn @ linux-x86_64 +test.test_enumerate.TestEmpty.test_illformediterable @ linux-x86_64 +test.test_enumerate.TestEmpty.test_iteratorgenerator @ linux-x86_64 +test.test_enumerate.TestEmpty.test_iteratorseqn @ linux-x86_64 +test.test_enumerate.TestEmpty.test_kwargs @ linux-x86_64 +test.test_enumerate.TestEmpty.test_noniterable @ linux-x86_64 +test.test_enumerate.TestEmpty.test_pickle @ linux-x86_64 +test.test_enumerate.TestLongStart.test_argumentcheck @ linux-x86_64 +test.test_enumerate.TestLongStart.test_basicfunction @ linux-x86_64 +test.test_enumerate.TestLongStart.test_exception_propagation @ linux-x86_64 +test.test_enumerate.TestLongStart.test_getitemseqn @ linux-x86_64 +test.test_enumerate.TestLongStart.test_illformediterable @ linux-x86_64 +test.test_enumerate.TestLongStart.test_iteratorgenerator @ linux-x86_64 +test.test_enumerate.TestLongStart.test_iteratorseqn @ linux-x86_64 +test.test_enumerate.TestLongStart.test_kwargs @ linux-x86_64 +test.test_enumerate.TestLongStart.test_noniterable @ linux-x86_64 +test.test_enumerate.TestLongStart.test_pickle @ linux-x86_64 +test.test_enumerate.TestReversed.test_args @ linux-x86_64 +test.test_enumerate.TestReversed.test_bug1229429 @ linux-x86_64 +test.test_enumerate.TestReversed.test_gc @ linux-x86_64 +test.test_enumerate.TestReversed.test_len @ linux-x86_64 +test.test_enumerate.TestReversed.test_objmethods @ linux-x86_64 +test.test_enumerate.TestReversed.test_pickle @ linux-x86_64 +test.test_enumerate.TestReversed.test_range_optimization @ linux-x86_64 +test.test_enumerate.TestReversed.test_simple @ linux-x86_64 +test.test_enumerate.TestStart.test_argumentcheck @ linux-x86_64 +test.test_enumerate.TestStart.test_basicfunction @ linux-x86_64 +test.test_enumerate.TestStart.test_exception_propagation @ linux-x86_64 +test.test_enumerate.TestStart.test_getitemseqn @ linux-x86_64 +test.test_enumerate.TestStart.test_illformediterable @ linux-x86_64 +test.test_enumerate.TestStart.test_iteratorgenerator @ linux-x86_64 +test.test_enumerate.TestStart.test_iteratorseqn @ linux-x86_64 +test.test_enumerate.TestStart.test_kwargs @ linux-x86_64 +test.test_enumerate.TestStart.test_noniterable @ linux-x86_64 +test.test_enumerate.TestStart.test_pickle @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_eof.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_eof.txt new file mode 100644 index 0000000000..926aeaddb9 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_eof.txt @@ -0,0 +1,6 @@ +test.test_eof.EOFTestCase.test_EOFS @ linux-x86_64 +test.test_eof.EOFTestCase.test_EOFS_with_file @ linux-x86_64 +test.test_eof.EOFTestCase.test_EOF_single_quote @ linux-x86_64 +test.test_eof.EOFTestCase.test_eof_with_line_continuation @ linux-x86_64 +test.test_eof.EOFTestCase.test_line_continuation_EOF @ linux-x86_64 +test.test_eof.EOFTestCase.test_line_continuation_EOF_from_file_bpo2180 @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_errno.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_errno.txt new file mode 100644 index 0000000000..413ccd9bf2 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_errno.txt @@ -0,0 +1,3 @@ +test.test_errno.ErrnoAttributeTests.test_for_improper_attributes @ linux-x86_64 +test.test_errno.ErrnoAttributeTests.test_using_errorcode @ linux-x86_64 +test.test_errno.ErrorcodeTests.test_attributes_in_errorcode @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_except_star.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_except_star.txt new file mode 100644 index 0000000000..6bec5e2be3 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_except_star.txt @@ -0,0 +1 @@ +test.test_except_star.TestInvalidExceptStar.test_mixed_except_and_except_star_is_syntax_error @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_exception_group.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_exception_group.txt new file mode 100644 index 0000000000..b765dab392 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_exception_group.txt @@ -0,0 +1,47 @@ +test.test_exception_group.BadConstructorArgs.test_bad_EG_construction__bad_excs_sequence @ linux-x86_64 +test.test_exception_group.BadConstructorArgs.test_bad_EG_construction__bad_message @ linux-x86_64 +test.test_exception_group.BadConstructorArgs.test_bad_EG_construction__nested_non_exceptions @ linux-x86_64 +test.test_exception_group.BadConstructorArgs.test_bad_EG_construction__too_many_args @ linux-x86_64 +test.test_exception_group.ExceptionGroupFields.test_basics_ExceptionGroup_fields @ linux-x86_64 +test.test_exception_group.ExceptionGroupFields.test_fields_are_readonly @ linux-x86_64 +test.test_exception_group.ExceptionGroupSplitTests.test_basics_split_by_predicate__match @ linux-x86_64 +test.test_exception_group.ExceptionGroupSplitTests.test_basics_split_by_predicate__no_match @ linux-x86_64 +test.test_exception_group.ExceptionGroupSplitTests.test_basics_split_by_predicate__passthrough @ linux-x86_64 +test.test_exception_group.ExceptionGroupSplitTests.test_basics_split_by_type__match @ linux-x86_64 +test.test_exception_group.ExceptionGroupSplitTests.test_basics_split_by_type__no_match @ linux-x86_64 +test.test_exception_group.ExceptionGroupSplitTests.test_basics_split_by_type__passthrough @ linux-x86_64 +test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_by_predicate__match @ linux-x86_64 +test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_by_predicate__no_match @ linux-x86_64 +test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_by_predicate__passthrough @ linux-x86_64 +test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_by_type__match @ linux-x86_64 +test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_by_type__no_match @ linux-x86_64 +test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_by_type__passthrough @ linux-x86_64 +test.test_exception_group.ExceptionGroupSubgroupTests.test_basics_subgroup_split__bad_arg_type @ linux-x86_64 +test.test_exception_group.InstanceCreation.test_BEG_and_E_subclass_does_not_wrap_base_exceptions @ linux-x86_64 +test.test_exception_group.InstanceCreation.test_BEG_and_specific_subclass_can_wrap_any_nonbase_exception @ linux-x86_64 +test.test_exception_group.InstanceCreation.test_BEG_subclass_wraps_anything @ linux-x86_64 +test.test_exception_group.InstanceCreation.test_BEG_wraps_BaseException__creates_BEG @ linux-x86_64 +test.test_exception_group.InstanceCreation.test_BEG_wraps_Exceptions__creates_EG @ linux-x86_64 +test.test_exception_group.InstanceCreation.test_EG_and_specific_subclass_can_wrap_any_nonbase_exception @ linux-x86_64 +test.test_exception_group.InstanceCreation.test_EG_subclass_does_not_wrap_base_exceptions @ linux-x86_64 +test.test_exception_group.InstanceCreation.test_EG_subclass_wraps_non_base_exceptions @ linux-x86_64 +test.test_exception_group.InstanceCreation.test_EG_wraps_BaseException__raises_TypeError @ linux-x86_64 +test.test_exception_group.InstanceCreation.test_EG_wraps_Exceptions__creates_EG @ linux-x86_64 +test.test_exception_group.LeafGeneratorTest.test_leaf_generator @ linux-x86_64 +test.test_exception_group.NestedExceptionGroupBasicsTest.test_iteration_full_tracebacks @ linux-x86_64 +test.test_exception_group.NestedExceptionGroupBasicsTest.test_nested_exception_group_tracebacks @ linux-x86_64 +test.test_exception_group.NestedExceptionGroupBasicsTest.test_nested_group_chaining @ linux-x86_64 +test.test_exception_group.NestedExceptionGroupBasicsTest.test_nested_group_matches_template @ linux-x86_64 +test.test_exception_group.NestedExceptionGroupSplitTest.test_split_BaseExceptionGroup @ linux-x86_64 +test.test_exception_group.NestedExceptionGroupSplitTest.test_split_by_type @ linux-x86_64 +test.test_exception_group.NestedExceptionGroupSplitTest.test_split_copies_notes @ linux-x86_64 +test.test_exception_group.NestedExceptionGroupSplitTest.test_split_does_not_copy_non_sequence_notes @ linux-x86_64 +test.test_exception_group.NestedExceptionGroupSubclassSplitTest.test_split_BaseExceptionGroup_subclass_no_derive_new_override @ linux-x86_64 +test.test_exception_group.NestedExceptionGroupSubclassSplitTest.test_split_ExceptionGroup_subclass_derive_and_new_overrides @ linux-x86_64 +test.test_exception_group.NestedExceptionGroupSubclassSplitTest.test_split_ExceptionGroup_subclass_no_derive_no_new_override @ linux-x86_64 +test.test_exception_group.StrAndReprTests.test_BaseExceptionGroup @ linux-x86_64 +test.test_exception_group.StrAndReprTests.test_ExceptionGroup @ linux-x86_64 +test.test_exception_group.StrAndReprTests.test_custom_exception @ linux-x86_64 +test.test_exception_group.TestExceptionGroupTypeHierarchy.test_exception_group_is_generic_type @ linux-x86_64 +test.test_exception_group.TestExceptionGroupTypeHierarchy.test_exception_group_types @ linux-x86_64 +test.test_exception_group.TestExceptionGroupTypeHierarchy.test_exception_is_not_generic_type @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_exception_hierarchy.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_exception_hierarchy.txt new file mode 100644 index 0000000000..4fb44e89eb --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_exception_hierarchy.txt @@ -0,0 +1,15 @@ +test.test_exception_hierarchy.AttributesTest.test_blockingioerror @ linux-x86_64 +test.test_exception_hierarchy.AttributesTest.test_posix_error @ linux-x86_64 +test.test_exception_hierarchy.AttributesTest.test_windows_error @ linux-x86_64 +test.test_exception_hierarchy.ExplicitSubclassingTest.test_errno_mapping @ linux-x86_64 +test.test_exception_hierarchy.ExplicitSubclassingTest.test_init_kwdargs @ linux-x86_64 +test.test_exception_hierarchy.ExplicitSubclassingTest.test_init_new_overridden @ linux-x86_64 +test.test_exception_hierarchy.ExplicitSubclassingTest.test_init_overridden @ linux-x86_64 +test.test_exception_hierarchy.ExplicitSubclassingTest.test_init_standalone @ linux-x86_64 +test.test_exception_hierarchy.ExplicitSubclassingTest.test_new_kwdargs @ linux-x86_64 +test.test_exception_hierarchy.ExplicitSubclassingTest.test_new_overridden @ linux-x86_64 +test.test_exception_hierarchy.HierarchyTest.test_builtin_errors @ linux-x86_64 +test.test_exception_hierarchy.HierarchyTest.test_errno_mapping @ linux-x86_64 +test.test_exception_hierarchy.HierarchyTest.test_select_error @ linux-x86_64 +test.test_exception_hierarchy.HierarchyTest.test_socket_errors @ linux-x86_64 +test.test_exception_hierarchy.HierarchyTest.test_try_except @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_exception_variations.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_exception_variations.txt new file mode 100644 index 0000000000..49f8f650d1 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_exception_variations.txt @@ -0,0 +1,16 @@ +test.test_exception_variations.ExceptStarTestCases.test_try_finally_no_exception @ linux-x86_64 +test.test_exception_variations.ExceptTestCases.test_nested @ linux-x86_64 +test.test_exception_variations.ExceptTestCases.test_nested_else @ linux-x86_64 +test.test_exception_variations.ExceptTestCases.test_nested_exception_in_else @ linux-x86_64 +test.test_exception_variations.ExceptTestCases.test_nested_exception_in_except @ linux-x86_64 +test.test_exception_variations.ExceptTestCases.test_nested_exception_in_finally_no_exception @ linux-x86_64 +test.test_exception_variations.ExceptTestCases.test_nested_exception_in_finally_with_exception @ linux-x86_64 +test.test_exception_variations.ExceptTestCases.test_try_except @ linux-x86_64 +test.test_exception_variations.ExceptTestCases.test_try_except_else @ linux-x86_64 +test.test_exception_variations.ExceptTestCases.test_try_except_else_finally @ linux-x86_64 +test.test_exception_variations.ExceptTestCases.test_try_except_else_finally_no_exception @ linux-x86_64 +test.test_exception_variations.ExceptTestCases.test_try_except_else_no_exception @ linux-x86_64 +test.test_exception_variations.ExceptTestCases.test_try_except_finally @ linux-x86_64 +test.test_exception_variations.ExceptTestCases.test_try_except_finally_no_exception @ linux-x86_64 +test.test_exception_variations.ExceptTestCases.test_try_except_no_exception @ linux-x86_64 +test.test_exception_variations.ExceptTestCases.test_try_finally_no_exception @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_exceptions.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_exceptions.txt new file mode 100644 index 0000000000..fa0dd83249 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_exceptions.txt @@ -0,0 +1,54 @@ +test.test_exceptions.AttributeErrorTests.test_attribute_error_with_failing_dict @ linux-x86_64 +test.test_exceptions.AttributeErrorTests.test_getattr_error_bad_suggestions_do_not_trigger_for_small_names @ linux-x86_64 +test.test_exceptions.AttributeErrorTests.test_getattr_suggestions_do_not_trigger_for_big_dicts @ linux-x86_64 +test.test_exceptions.AttributeErrorTests.test_getattr_suggestions_do_not_trigger_for_long_attributes @ linux-x86_64 +test.test_exceptions.AttributeErrorTests.test_getattr_suggestions_for_same_name @ linux-x86_64 +test.test_exceptions.ExceptionTests.testAttributes @ linux-x86_64 +test.test_exceptions.ExceptionTests.testChainingAttrs @ linux-x86_64 +test.test_exceptions.ExceptionTests.testChainingDescriptors @ linux-x86_64 +!test.test_exceptions.ExceptionTests.testInfiniteRecursion @ linux-x86_64 +test.test_exceptions.ExceptionTests.testInvalidAttrs @ linux-x86_64 +test.test_exceptions.ExceptionTests.testInvalidTraceback @ linux-x86_64 +test.test_exceptions.ExceptionTests.testKeywordArgs @ linux-x86_64 +test.test_exceptions.ExceptionTests.testNoneClearsTracebackAttr @ linux-x86_64 +test.test_exceptions.ExceptionTests.testRaising @ linux-x86_64 +test.test_exceptions.ExceptionTests.testSyntaxErrorMessage @ linux-x86_64 +test.test_exceptions.ExceptionTests.testSyntaxErrorMissingParens @ linux-x86_64 +test.test_exceptions.ExceptionTests.testWithTraceback @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_WindowsError @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_assert_shadowing @ linux-x86_64 +!test.test_exceptions.ExceptionTests.test_badisinstance @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_context_of_exception_in_else_and_finally @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_context_of_exception_in_except_and_finally @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_context_of_exception_in_try_and_finally @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_errno_ENOTDIR @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_error_offset_continuation_characters @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_exception_cleanup_names @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_exception_cleanup_names2 @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_exception_target_in_nested_scope @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_generator_doesnt_retain_old_exc2 @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_generator_finalizing_and_exc_info @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_generator_leaking2 @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_generator_leaking3 @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_memory_error_subclasses @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_notes @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_raise_does_not_create_context_chain_cycle @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_str @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_unhandled @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_unicode_change_attributes @ linux-x86_64 +test.test_exceptions.ExceptionTests.test_unicode_errors_no_object @ linux-x86_64 +test.test_exceptions.ImportErrorTests.test_attributes @ linux-x86_64 +test.test_exceptions.ImportErrorTests.test_copy_pickle @ linux-x86_64 +test.test_exceptions.ImportErrorTests.test_non_str_argument @ linux-x86_64 +test.test_exceptions.ImportErrorTests.test_reset_attributes @ linux-x86_64 +test.test_exceptions.NameErrorTests.test_issue45826 @ linux-x86_64 +test.test_exceptions.NameErrorTests.test_issue45826_focused @ linux-x86_64 +test.test_exceptions.NameErrorTests.test_name_error_bad_suggestions_do_not_trigger_for_small_names @ linux-x86_64 +test.test_exceptions.NameErrorTests.test_name_error_suggestions_do_not_trigger_for_long_names @ linux-x86_64 +test.test_exceptions.NameErrorTests.test_name_error_suggestions_do_not_trigger_for_too_many_locals @ linux-x86_64 +test.test_exceptions.NameErrorTests.test_name_error_with_custom_exceptions @ linux-x86_64 +test.test_exceptions.NameErrorTests.test_unbound_local_error_doesn_not_match @ linux-x86_64 +test.test_exceptions.PEP626Tests.test_lineno_after_raise_in_with_exit @ linux-x86_64 +test.test_exceptions.PEP626Tests.test_lineno_after_raise_simple @ linux-x86_64 +test.test_exceptions.PEP626Tests.test_lineno_in_finally_normal @ linux-x86_64 +test.test_exceptions.SyntaxErrorTests.test_attributes_old_constructor @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_faulthandler.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_faulthandler.txt new file mode 100644 index 0000000000..a40d51f103 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_faulthandler.txt @@ -0,0 +1,4 @@ +test.test_faulthandler.FaultHandlerTests.test_cancel_later_without_dump_traceback_later @ linux-x86_64 +test.test_faulthandler.FaultHandlerTests.test_disable @ linux-x86_64 +test.test_faulthandler.FaultHandlerTests.test_is_enabled @ linux-x86_64 +test.test_faulthandler.FaultHandlerTests.test_sys_xoptions @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_fcntl.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_fcntl.txt new file mode 100644 index 0000000000..fb90c674c4 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_fcntl.txt @@ -0,0 +1,3 @@ +test.test_fcntl.TestFcntl.test_flock @ linux-x86_64 +test.test_fcntl.TestFcntl.test_lockf_exclusive @ linux-x86_64 +test.test_fcntl.TestFcntl.test_lockf_share @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_file.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_file.txt new file mode 100644 index 0000000000..323b57ee68 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_file.txt @@ -0,0 +1,30 @@ +test.test_file.CAutoFileTests.testAttributes @ linux-x86_64 +test.test_file.CAutoFileTests.testErrors @ linux-x86_64 +test.test_file.CAutoFileTests.testMethods @ linux-x86_64 +test.test_file.CAutoFileTests.testReadWhenWriting @ linux-x86_64 +test.test_file.CAutoFileTests.testReadinto @ linux-x86_64 +test.test_file.CAutoFileTests.testReadinto_text @ linux-x86_64 +test.test_file.CAutoFileTests.testWritelinesIntegers @ linux-x86_64 +test.test_file.CAutoFileTests.testWritelinesIntegersUserList @ linux-x86_64 +test.test_file.CAutoFileTests.testWritelinesNonString @ linux-x86_64 +test.test_file.CAutoFileTests.testWritelinesUserList @ linux-x86_64 +test.test_file.COtherFileTests.testBadModeArgument @ linux-x86_64 +test.test_file.COtherFileTests.testIteration @ linux-x86_64 +test.test_file.COtherFileTests.testModeStrings @ linux-x86_64 +test.test_file.COtherFileTests.testSetBufferSize @ linux-x86_64 +test.test_file.COtherFileTests.testTruncateOnWindows @ linux-x86_64 +test.test_file.PyAutoFileTests.testAttributes @ linux-x86_64 +test.test_file.PyAutoFileTests.testErrors @ linux-x86_64 +test.test_file.PyAutoFileTests.testMethods @ linux-x86_64 +test.test_file.PyAutoFileTests.testReadWhenWriting @ linux-x86_64 +test.test_file.PyAutoFileTests.testReadinto @ linux-x86_64 +test.test_file.PyAutoFileTests.testReadinto_text @ linux-x86_64 +test.test_file.PyAutoFileTests.testWritelinesIntegers @ linux-x86_64 +test.test_file.PyAutoFileTests.testWritelinesIntegersUserList @ linux-x86_64 +test.test_file.PyAutoFileTests.testWritelinesNonString @ linux-x86_64 +test.test_file.PyAutoFileTests.testWritelinesUserList @ linux-x86_64 +test.test_file.PyOtherFileTests.testBadModeArgument @ linux-x86_64 +test.test_file.PyOtherFileTests.testIteration @ linux-x86_64 +test.test_file.PyOtherFileTests.testModeStrings @ linux-x86_64 +test.test_file.PyOtherFileTests.testSetBufferSize @ linux-x86_64 +test.test_file.PyOtherFileTests.testTruncateOnWindows @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_filecmp.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_filecmp.txt new file mode 100644 index 0000000000..627be31d25 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_filecmp.txt @@ -0,0 +1,9 @@ +test.test_filecmp.DirCompareTestCase.test_cmpfiles @ linux-x86_64 +test.test_filecmp.DirCompareTestCase.test_default_ignores @ linux-x86_64 +test.test_filecmp.DirCompareTestCase.test_dircmp @ linux-x86_64 +test.test_filecmp.DirCompareTestCase.test_dircmp_subdirs_type @ linux-x86_64 +test.test_filecmp.DirCompareTestCase.test_report_full_closure @ linux-x86_64 +test.test_filecmp.DirCompareTestCase.test_report_partial_closure @ linux-x86_64 +test.test_filecmp.FileCompareTestCase.test_cache_clear @ linux-x86_64 +test.test_filecmp.FileCompareTestCase.test_different @ linux-x86_64 +test.test_filecmp.FileCompareTestCase.test_matching @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_fileinput.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_fileinput.txt new file mode 100644 index 0000000000..d7b8216335 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_fileinput.txt @@ -0,0 +1,57 @@ +test.test_fileinput.BufferSizesTests.test_buffer_sizes @ linux-x86_64 +test.test_fileinput.FileInputTests.test_close_on_exception @ linux-x86_64 +test.test_fileinput.FileInputTests.test_context_manager @ linux-x86_64 +test.test_fileinput.FileInputTests.test_detached_stdin_binary_mode @ linux-x86_64 +test.test_fileinput.FileInputTests.test_empty_files_list_specified_to_constructor @ linux-x86_64 +test.test_fileinput.FileInputTests.test_file_hook_backward_compatibility @ linux-x86_64 +test.test_fileinput.FileInputTests.test_file_opening_hook @ linux-x86_64 +test.test_fileinput.FileInputTests.test_fileno @ linux-x86_64 +test.test_fileinput.FileInputTests.test_fileno_when_ValueError_raised @ linux-x86_64 +test.test_fileinput.FileInputTests.test_files_that_dont_end_with_newline @ linux-x86_64 +test.test_fileinput.FileInputTests.test_inplace_binary_write_mode @ linux-x86_64 +test.test_fileinput.FileInputTests.test_inplace_encoding_errors @ linux-x86_64 +test.test_fileinput.FileInputTests.test_invalid_opening_mode @ linux-x86_64 +test.test_fileinput.FileInputTests.test_iteration_buffering @ linux-x86_64 +test.test_fileinput.FileInputTests.test_nextfile_oserror_deleting_backup @ linux-x86_64 +test.test_fileinput.FileInputTests.test_pathlib_file @ linux-x86_64 +test.test_fileinput.FileInputTests.test_pathlib_file_inplace @ linux-x86_64 +test.test_fileinput.FileInputTests.test_readline @ linux-x86_64 +test.test_fileinput.FileInputTests.test_readline_binary_mode @ linux-x86_64 +test.test_fileinput.FileInputTests.test_readline_buffering @ linux-x86_64 +test.test_fileinput.FileInputTests.test_readline_os_chmod_raises_OSError @ linux-x86_64 +test.test_fileinput.FileInputTests.test_readline_os_fstat_raises_OSError @ linux-x86_64 +test.test_fileinput.FileInputTests.test_stdin_binary_mode @ linux-x86_64 +test.test_fileinput.FileInputTests.test_zero_byte_files @ linux-x86_64 +test.test_fileinput.MiscTest.test_all @ linux-x86_64 +test.test_fileinput.Test_fileinput_close.test_state_is_None @ linux-x86_64 +test.test_fileinput.Test_fileinput_close.test_state_is_not_None @ linux-x86_64 +test.test_fileinput.Test_fileinput_filelineno.test_state_is_None @ linux-x86_64 +test.test_fileinput.Test_fileinput_filelineno.test_state_is_not_None @ linux-x86_64 +test.test_fileinput.Test_fileinput_filename.test_state_is_None @ linux-x86_64 +test.test_fileinput.Test_fileinput_filename.test_state_is_not_None @ linux-x86_64 +test.test_fileinput.Test_fileinput_fileno.test_state_is_None @ linux-x86_64 +test.test_fileinput.Test_fileinput_fileno.test_state_is_not_None @ linux-x86_64 +test.test_fileinput.Test_fileinput_input.test_state_is_None @ linux-x86_64 +test.test_fileinput.Test_fileinput_input.test_state_is_not_None_and_state_file_is_None @ linux-x86_64 +test.test_fileinput.Test_fileinput_input.test_state_is_not_None_and_state_file_is_not_None @ linux-x86_64 +test.test_fileinput.Test_fileinput_isfirstline.test_state_is_None @ linux-x86_64 +test.test_fileinput.Test_fileinput_isfirstline.test_state_is_not_None @ linux-x86_64 +test.test_fileinput.Test_fileinput_isstdin.test_state_is_None @ linux-x86_64 +test.test_fileinput.Test_fileinput_isstdin.test_state_is_not_None @ linux-x86_64 +test.test_fileinput.Test_fileinput_lineno.test_state_is_None @ linux-x86_64 +test.test_fileinput.Test_fileinput_lineno.test_state_is_not_None @ linux-x86_64 +test.test_fileinput.Test_fileinput_nextfile.test_state_is_None @ linux-x86_64 +test.test_fileinput.Test_fileinput_nextfile.test_state_is_not_None @ linux-x86_64 +test.test_fileinput.Test_hook_compressed.test_binary_mode_encoding @ linux-x86_64 +test.test_fileinput.Test_hook_compressed.test_blah_ext @ linux-x86_64 +test.test_fileinput.Test_hook_compressed.test_bz2_ext_builtin @ linux-x86_64 +test.test_fileinput.Test_hook_compressed.test_bz2_ext_fake @ linux-x86_64 +test.test_fileinput.Test_hook_compressed.test_empty_string @ linux-x86_64 +test.test_fileinput.Test_hook_compressed.test_gz_ext_builtin @ linux-x86_64 +test.test_fileinput.Test_hook_compressed.test_gz_ext_fake @ linux-x86_64 +test.test_fileinput.Test_hook_compressed.test_gz_with_encoding_fake @ linux-x86_64 +test.test_fileinput.Test_hook_compressed.test_no_ext @ linux-x86_64 +test.test_fileinput.Test_hook_compressed.test_text_mode_encoding @ linux-x86_64 +test.test_fileinput.Test_hook_encoded.test @ linux-x86_64 +test.test_fileinput.Test_hook_encoded.test_errors @ linux-x86_64 +test.test_fileinput.Test_hook_encoded.test_modes @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_fileio.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_fileio.txt new file mode 100644 index 0000000000..fb618fca01 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_fileio.txt @@ -0,0 +1,87 @@ +test.test_fileio.CAutoFileTests.testAttributes @ linux-x86_64 +test.test_fileio.CAutoFileTests.testBlksize @ linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClose @ linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedFileno @ linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedIsatty @ linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedRead @ linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedReadable @ linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedReadall @ linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedReadinto @ linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedSeek @ linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedSeekable @ linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedTell @ linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedTruncate @ linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedWritable @ linux-x86_64 +test.test_fileio.CAutoFileTests.testErrnoOnClosedWrite @ linux-x86_64 +test.test_fileio.CAutoFileTests.testErrors @ linux-x86_64 +test.test_fileio.CAutoFileTests.testMethods @ linux-x86_64 +test.test_fileio.CAutoFileTests.testOpenDirFD @ linux-x86_64 +test.test_fileio.CAutoFileTests.testOpendir @ linux-x86_64 +test.test_fileio.CAutoFileTests.testReadintoByteArray @ linux-x86_64 +test.test_fileio.CAutoFileTests.testRepr @ linux-x86_64 +test.test_fileio.CAutoFileTests.testReprNoCloseFD @ linux-x86_64 +test.test_fileio.CAutoFileTests.testSeekTell @ linux-x86_64 +test.test_fileio.CAutoFileTests.testWritelinesError @ linux-x86_64 +test.test_fileio.CAutoFileTests.testWritelinesList @ linux-x86_64 +test.test_fileio.CAutoFileTests.testWritelinesUserList @ linux-x86_64 +test.test_fileio.CAutoFileTests.test_none_args @ linux-x86_64 +test.test_fileio.CAutoFileTests.test_reject @ linux-x86_64 +test.test_fileio.COtherFileTests.testAbles @ linux-x86_64 +test.test_fileio.COtherFileTests.testAppend @ linux-x86_64 +test.test_fileio.COtherFileTests.testBadModeArgument @ linux-x86_64 +test.test_fileio.COtherFileTests.testBytesOpen @ linux-x86_64 +test.test_fileio.COtherFileTests.testConstructorHandlesNULChars @ linux-x86_64 +test.test_fileio.COtherFileTests.testInvalidFd @ linux-x86_64 +test.test_fileio.COtherFileTests.testInvalidInit @ linux-x86_64 +test.test_fileio.COtherFileTests.testInvalidModeStrings @ linux-x86_64 +test.test_fileio.COtherFileTests.testModeStrings @ linux-x86_64 +test.test_fileio.COtherFileTests.testTruncate @ linux-x86_64 +test.test_fileio.COtherFileTests.testTruncateOnWindows @ linux-x86_64 +test.test_fileio.COtherFileTests.testUnclosedFDOnException @ linux-x86_64 +test.test_fileio.COtherFileTests.testUnicodeOpen @ linux-x86_64 +test.test_fileio.COtherFileTests.testUtf8BytesOpen @ linux-x86_64 +test.test_fileio.COtherFileTests.testWarnings @ linux-x86_64 +test.test_fileio.COtherFileTests.test_open_code @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testAttributes @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testBlksize @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClose @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedFileno @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedIsatty @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedRead @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedReadable @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedReadall @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedReadinto @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedSeek @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedSeekable @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedTell @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedTruncate @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedWritable @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrnoOnClosedWrite @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testErrors @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testMethods @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testOpenDirFD @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testOpendir @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testReadintoByteArray @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testRepr @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testReprNoCloseFD @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testSeekTell @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testWritelinesError @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testWritelinesList @ linux-x86_64 +test.test_fileio.PyAutoFileTests.testWritelinesUserList @ linux-x86_64 +test.test_fileio.PyAutoFileTests.test_none_args @ linux-x86_64 +test.test_fileio.PyAutoFileTests.test_reject @ linux-x86_64 +test.test_fileio.PyOtherFileTests.testAbles @ linux-x86_64 +test.test_fileio.PyOtherFileTests.testAppend @ linux-x86_64 +test.test_fileio.PyOtherFileTests.testBadModeArgument @ linux-x86_64 +test.test_fileio.PyOtherFileTests.testBytesOpen @ linux-x86_64 +test.test_fileio.PyOtherFileTests.testConstructorHandlesNULChars @ linux-x86_64 +test.test_fileio.PyOtherFileTests.testInvalidInit @ linux-x86_64 +test.test_fileio.PyOtherFileTests.testInvalidModeStrings @ linux-x86_64 +test.test_fileio.PyOtherFileTests.testModeStrings @ linux-x86_64 +test.test_fileio.PyOtherFileTests.testTruncate @ linux-x86_64 +test.test_fileio.PyOtherFileTests.testTruncateOnWindows @ linux-x86_64 +test.test_fileio.PyOtherFileTests.testUnclosedFDOnException @ linux-x86_64 +test.test_fileio.PyOtherFileTests.testUnicodeOpen @ linux-x86_64 +test.test_fileio.PyOtherFileTests.testUtf8BytesOpen @ linux-x86_64 +test.test_fileio.PyOtherFileTests.testWarnings @ linux-x86_64 +test.test_fileio.PyOtherFileTests.test_open_code @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_float.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_float.txt new file mode 100644 index 0000000000..b1065333ca --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_float.txt @@ -0,0 +1,51 @@ +test.test_float.FormatFunctionsTestCase.test_getformat @ linux-x86_64 +test.test_float.FormatTestCase.test_format @ linux-x86_64 +test.test_float.FormatTestCase.test_format_testfile @ linux-x86_64 +test.test_float.FormatTestCase.test_issue35560 @ linux-x86_64 +test.test_float.FormatTestCase.test_issue5864 @ linux-x86_64 +test.test_float.GeneralFloatCases.test_error_message @ linux-x86_64 +test.test_float.GeneralFloatCases.test_float @ linux-x86_64 +test.test_float.GeneralFloatCases.test_float_ceil @ linux-x86_64 +test.test_float.GeneralFloatCases.test_float_containment @ linux-x86_64 +test.test_float.GeneralFloatCases.test_float_floor @ linux-x86_64 +test.test_float.GeneralFloatCases.test_float_memoryview @ linux-x86_64 +test.test_float.GeneralFloatCases.test_float_mod @ linux-x86_64 +test.test_float.GeneralFloatCases.test_float_pow @ linux-x86_64 +test.test_float.GeneralFloatCases.test_float_with_comma @ linux-x86_64 +test.test_float.GeneralFloatCases.test_floatasratio @ linux-x86_64 +test.test_float.GeneralFloatCases.test_floatconversion @ linux-x86_64 +test.test_float.GeneralFloatCases.test_hash @ linux-x86_64 +test.test_float.GeneralFloatCases.test_is_integer @ linux-x86_64 +test.test_float.GeneralFloatCases.test_keyword_args @ linux-x86_64 +test.test_float.GeneralFloatCases.test_noargs @ linux-x86_64 +test.test_float.GeneralFloatCases.test_non_numeric_input_types @ linux-x86_64 +test.test_float.GeneralFloatCases.test_underscores @ linux-x86_64 +test.test_float.HexFloatTestCase.test_ends @ linux-x86_64 +test.test_float.HexFloatTestCase.test_from_hex @ linux-x86_64 +test.test_float.HexFloatTestCase.test_invalid_inputs @ linux-x86_64 +test.test_float.HexFloatTestCase.test_roundtrip @ linux-x86_64 +test.test_float.HexFloatTestCase.test_subclass @ linux-x86_64 +test.test_float.HexFloatTestCase.test_whitespace @ linux-x86_64 +test.test_float.IEEEFormatTestCase.test_double_specials_do_unpack @ linux-x86_64 +test.test_float.IEEEFormatTestCase.test_float_specials_do_unpack @ linux-x86_64 +test.test_float.IEEEFormatTestCase.test_serialized_float_rounding @ linux-x86_64 +test.test_float.InfNanTest.test_inf_as_str @ linux-x86_64 +test.test_float.InfNanTest.test_inf_from_str @ linux-x86_64 +test.test_float.InfNanTest.test_inf_signs @ linux-x86_64 +test.test_float.InfNanTest.test_nan_as_str @ linux-x86_64 +test.test_float.InfNanTest.test_nan_from_str @ linux-x86_64 +test.test_float.InfNanTest.test_nan_signs @ linux-x86_64 +test.test_float.PackTests.test_pack @ linux-x86_64 +test.test_float.PackTests.test_roundtrip @ linux-x86_64 +test.test_float.PackTests.test_unpack @ linux-x86_64 +test.test_float.ReprTestCase.test_repr @ linux-x86_64 +test.test_float.ReprTestCase.test_short_repr @ linux-x86_64 +test.test_float.RoundTestCase.test_None_ndigits @ linux-x86_64 +test.test_float.RoundTestCase.test_format_specials @ linux-x86_64 +test.test_float.RoundTestCase.test_inf_nan @ linux-x86_64 +test.test_float.RoundTestCase.test_inf_nan_ndigits @ linux-x86_64 +test.test_float.RoundTestCase.test_large_n @ linux-x86_64 +test.test_float.RoundTestCase.test_matches_float_format @ linux-x86_64 +test.test_float.RoundTestCase.test_overflow @ linux-x86_64 +test.test_float.RoundTestCase.test_previous_round_bugs @ linux-x86_64 +test.test_float.RoundTestCase.test_small_n @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_flufl.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_flufl.txt new file mode 100644 index 0000000000..adab1d3902 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_flufl.txt @@ -0,0 +1 @@ +test.test_flufl.FLUFLTests.test_guido_as_bdfl @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_fnmatch.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_fnmatch.txt new file mode 100644 index 0000000000..9e89c85e12 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_fnmatch.txt @@ -0,0 +1,17 @@ +test.test_fnmatch.FilterTestCase.test_case @ linux-x86_64 +test.test_fnmatch.FilterTestCase.test_filter @ linux-x86_64 +test.test_fnmatch.FilterTestCase.test_mix_bytes_str @ linux-x86_64 +test.test_fnmatch.FilterTestCase.test_sep @ linux-x86_64 +test.test_fnmatch.FnmatchTestCase.test_bytes @ linux-x86_64 +test.test_fnmatch.FnmatchTestCase.test_case @ linux-x86_64 +test.test_fnmatch.FnmatchTestCase.test_char_set @ linux-x86_64 +test.test_fnmatch.FnmatchTestCase.test_fnmatch @ linux-x86_64 +test.test_fnmatch.FnmatchTestCase.test_fnmatchcase @ linux-x86_64 +test.test_fnmatch.FnmatchTestCase.test_mix_bytes_str @ linux-x86_64 +test.test_fnmatch.FnmatchTestCase.test_range @ linux-x86_64 +test.test_fnmatch.FnmatchTestCase.test_sep @ linux-x86_64 +test.test_fnmatch.FnmatchTestCase.test_sep_in_char_set @ linux-x86_64 +test.test_fnmatch.FnmatchTestCase.test_sep_in_range @ linux-x86_64 +test.test_fnmatch.FnmatchTestCase.test_slow_fnmatch @ linux-x86_64 +test.test_fnmatch.FnmatchTestCase.test_warnings @ linux-x86_64 +test.test_fnmatch.TranslateTestCase.test_translate @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_format.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_format.txt new file mode 100644 index 0000000000..d90ff3ebf4 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_format.txt @@ -0,0 +1,12 @@ +test.test_format.FormatTest.test_bytes_and_bytearray_format @ linux-x86_64 +test.test_format.FormatTest.test_common_format @ linux-x86_64 +test.test_format.FormatTest.test_g_format_has_no_trailing_zeros @ linux-x86_64 +test.test_format.FormatTest.test_locale @ linux-x86_64 +test.test_format.FormatTest.test_non_ascii @ linux-x86_64 +test.test_format.FormatTest.test_nul @ linux-x86_64 +test.test_format.FormatTest.test_precision @ linux-x86_64 +test.test_format.FormatTest.test_str_format @ linux-x86_64 +test.test_format.FormatTest.test_with_a_commas_and_an_underscore_in_format_specifier @ linux-x86_64 +test.test_format.FormatTest.test_with_an_underscore_and_a_comma_in_format_specifier @ linux-x86_64 +test.test_format.FormatTest.test_with_two_commas_in_format_specifier @ linux-x86_64 +test.test_format.FormatTest.test_with_two_underscore_in_format_specifier @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_fractions.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_fractions.txt new file mode 100644 index 0000000000..a2b7acbed6 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_fractions.txt @@ -0,0 +1,33 @@ +test.test_fractions.FractionTest.testApproximateCos1 @ linux-x86_64 +test.test_fractions.FractionTest.testApproximatePi @ linux-x86_64 +test.test_fractions.FractionTest.testArithmetic @ linux-x86_64 +test.test_fractions.FractionTest.testBigComplexComparisons @ linux-x86_64 +test.test_fractions.FractionTest.testBigFloatComparisons @ linux-x86_64 +test.test_fractions.FractionTest.testBoolGuarateesBoolReturn @ linux-x86_64 +test.test_fractions.FractionTest.testComparisons @ linux-x86_64 +test.test_fractions.FractionTest.testComparisonsDummyFloat @ linux-x86_64 +test.test_fractions.FractionTest.testComparisonsDummyRational @ linux-x86_64 +test.test_fractions.FractionTest.testConversions @ linux-x86_64 +test.test_fractions.FractionTest.testFromDecimal @ linux-x86_64 +test.test_fractions.FractionTest.testFromFloat @ linux-x86_64 +test.test_fractions.FractionTest.testFromString @ linux-x86_64 +test.test_fractions.FractionTest.testHash @ linux-x86_64 +test.test_fractions.FractionTest.testImmutable @ linux-x86_64 +test.test_fractions.FractionTest.testInit @ linux-x86_64 +test.test_fractions.FractionTest.testInitFromDecimal @ linux-x86_64 +test.test_fractions.FractionTest.testInitFromFloat @ linux-x86_64 +test.test_fractions.FractionTest.testIntGuaranteesIntReturn @ linux-x86_64 +test.test_fractions.FractionTest.testLargeArithmetic @ linux-x86_64 +test.test_fractions.FractionTest.testLimitDenominator @ linux-x86_64 +test.test_fractions.FractionTest.testMixedArithmetic @ linux-x86_64 +test.test_fractions.FractionTest.testMixedEqual @ linux-x86_64 +test.test_fractions.FractionTest.testMixedLess @ linux-x86_64 +test.test_fractions.FractionTest.testMixedLessEqual @ linux-x86_64 +test.test_fractions.FractionTest.testMixingWithDecimal @ linux-x86_64 +test.test_fractions.FractionTest.testRound @ linux-x86_64 +test.test_fractions.FractionTest.testStringification @ linux-x86_64 +test.test_fractions.FractionTest.testSupportsInt @ linux-x86_64 +test.test_fractions.FractionTest.test_as_integer_ratio @ linux-x86_64 +test.test_fractions.FractionTest.test_copy_deepcopy_pickle @ linux-x86_64 +test.test_fractions.FractionTest.test_int_subclass @ linux-x86_64 +test.test_fractions.FractionTest.test_slots @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_frame.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_frame.txt new file mode 100644 index 0000000000..ba0e568adc --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_frame.txt @@ -0,0 +1,5 @@ +test.test_frame.ClearTest.test_clear_does_not_clear_specials @ linux-x86_64 +test.test_frame.ClearTest.test_lineno_with_tracing @ linux-x86_64 +test.test_frame.FrameAttrsTest.test_f_lineno_del_segfault @ linux-x86_64 +test.test_frame.FrameAttrsTest.test_locals @ linux-x86_64 +test.test_frame.ReprTest.test_repr @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_frozen.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_frozen.txt new file mode 100644 index 0000000000..9b6e502a8f --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_frozen.txt @@ -0,0 +1,3 @@ +test.test_frozen.TestFrozen.test_frozen @ linux-x86_64 +test.test_frozen.TestFrozen.test_frozen_submodule_in_unfrozen_package @ linux-x86_64 +test.test_frozen.TestFrozen.test_unfrozen_submodule_in_frozen_package @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_fstring.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_fstring.txt new file mode 100644 index 0000000000..a47c1e7c43 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_fstring.txt @@ -0,0 +1,66 @@ +test.test_fstring.TestCase.test__format__lookup @ linux-x86_64 +test.test_fstring.TestCase.test_arguments @ linux-x86_64 +test.test_fstring.TestCase.test_assignment @ linux-x86_64 +test.test_fstring.TestCase.test_ast @ linux-x86_64 +test.test_fstring.TestCase.test_ast_compile_time_concat @ linux-x86_64 +test.test_fstring.TestCase.test_ast_line_numbers @ linux-x86_64 +test.test_fstring.TestCase.test_ast_line_numbers_duplicate_expression @ linux-x86_64 +test.test_fstring.TestCase.test_ast_line_numbers_multiple_formattedvalues @ linux-x86_64 +test.test_fstring.TestCase.test_ast_line_numbers_nested @ linux-x86_64 +test.test_fstring.TestCase.test_ast_numbers_fstring_with_formatting @ linux-x86_64 +test.test_fstring.TestCase.test_backslash_char @ linux-x86_64 +test.test_fstring.TestCase.test_backslashes_in_string_part @ linux-x86_64 +test.test_fstring.TestCase.test_call @ linux-x86_64 +test.test_fstring.TestCase.test_closure @ linux-x86_64 +test.test_fstring.TestCase.test_comments @ linux-x86_64 +test.test_fstring.TestCase.test_compile_time_concat @ linux-x86_64 +test.test_fstring.TestCase.test_compile_time_concat_errors @ linux-x86_64 +test.test_fstring.TestCase.test_conversions @ linux-x86_64 +test.test_fstring.TestCase.test_debug_conversion @ linux-x86_64 +test.test_fstring.TestCase.test_del @ linux-x86_64 +test.test_fstring.TestCase.test_dict @ linux-x86_64 +test.test_fstring.TestCase.test_docstring @ linux-x86_64 +test.test_fstring.TestCase.test_double_braces @ linux-x86_64 +test.test_fstring.TestCase.test_empty_format_specifier @ linux-x86_64 +test.test_fstring.TestCase.test_equal_equal @ linux-x86_64 +test.test_fstring.TestCase.test_errors @ linux-x86_64 +test.test_fstring.TestCase.test_expressions_with_triple_quoted_strings @ linux-x86_64 +test.test_fstring.TestCase.test_filename_in_syntaxerror @ linux-x86_64 +test.test_fstring.TestCase.test_format_specifier_expressions @ linux-x86_64 +test.test_fstring.TestCase.test_global @ linux-x86_64 +test.test_fstring.TestCase.test_if_conditional @ linux-x86_64 +test.test_fstring.TestCase.test_invalid_string_prefixes @ linux-x86_64 +test.test_fstring.TestCase.test_invalid_syntax_error_message @ linux-x86_64 +test.test_fstring.TestCase.test_lambda @ linux-x86_64 +test.test_fstring.TestCase.test_leading_trailing_spaces @ linux-x86_64 +test.test_fstring.TestCase.test_literal @ linux-x86_64 +test.test_fstring.TestCase.test_literal_eval @ linux-x86_64 +test.test_fstring.TestCase.test_locals @ linux-x86_64 +test.test_fstring.TestCase.test_loop @ linux-x86_64 +test.test_fstring.TestCase.test_many_expressions @ linux-x86_64 +test.test_fstring.TestCase.test_misformed_unicode_character_name @ linux-x86_64 +test.test_fstring.TestCase.test_mismatched_braces @ linux-x86_64 +test.test_fstring.TestCase.test_mismatched_parens @ linux-x86_64 +test.test_fstring.TestCase.test_missing_expression @ linux-x86_64 +test.test_fstring.TestCase.test_missing_format_spec @ linux-x86_64 +test.test_fstring.TestCase.test_missing_variable @ linux-x86_64 +test.test_fstring.TestCase.test_multiple_vars @ linux-x86_64 +test.test_fstring.TestCase.test_nested_fstrings @ linux-x86_64 +test.test_fstring.TestCase.test_newlines_before_syntax_error @ linux-x86_64 +test.test_fstring.TestCase.test_newlines_in_expressions @ linux-x86_64 +test.test_fstring.TestCase.test_no_backslashes_in_expression_part @ linux-x86_64 +test.test_fstring.TestCase.test_no_escapes_for_braces @ linux-x86_64 +test.test_fstring.TestCase.test_not_equal @ linux-x86_64 +test.test_fstring.TestCase.test_parens_in_expressions @ linux-x86_64 +test.test_fstring.TestCase.test_shadowed_global @ linux-x86_64 +test.test_fstring.TestCase.test_side_effect_order @ linux-x86_64 +test.test_fstring.TestCase.test_str_format_differences @ linux-x86_64 +test.test_fstring.TestCase.test_syntax_error_for_starred_expressions @ linux-x86_64 +test.test_fstring.TestCase.test_unterminated_string @ linux-x86_64 +test.test_fstring.TestCase.test_walrus @ linux-x86_64 +test.test_fstring.TestCase.test_with_a_commas_and_an_underscore_in_format_specifier @ linux-x86_64 +test.test_fstring.TestCase.test_with_an_underscore_and_a_comma_in_format_specifier @ linux-x86_64 +test.test_fstring.TestCase.test_with_two_commas_in_format_specifier @ linux-x86_64 +test.test_fstring.TestCase.test_with_two_underscore_in_format_specifier @ linux-x86_64 +test.test_fstring.TestCase.test_yield @ linux-x86_64 +test.test_fstring.TestCase.test_yield_send @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ftplib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ftplib.txt new file mode 100644 index 0000000000..f96e315943 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ftplib.txt @@ -0,0 +1,93 @@ +test.test_ftplib.MiscTestCase.test__all__ @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_abort @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_acct @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_all_errors @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_cwd @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_delete @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_dir @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_encoding_param @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_exceptions @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_getwelcome @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_line_too_long @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_login @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_makepasv @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_makepasv_issue43285_security_disabled @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_makepasv_issue43285_security_enabled_default @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_makeport @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_mkd @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_mlsd @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_nlst @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_parse257 @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_pwd @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_quit @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_rename @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_retrbinary @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_retrbinary_rest @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_retrlines @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_retrlines_too_long @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_rmd @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_sanitize @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_set_pasv @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_size @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_source_address @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_source_address_passive_connection @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_storbinary @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_storbinary_rest @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_storlines @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_storlines_too_long @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_voidcmd @ linux-x86_64 +test.test_ftplib.TestFTPClass.test_with_statement @ linux-x86_64 +test.test_ftplib.TestIPv6Environment.test_af @ linux-x86_64 +test.test_ftplib.TestIPv6Environment.test_makepasv @ linux-x86_64 +test.test_ftplib.TestIPv6Environment.test_makeport @ linux-x86_64 +test.test_ftplib.TestIPv6Environment.test_transfer @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClass.test_auth_issued_twice @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClass.test_ccc @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClass.test_context @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClass.test_control_connection @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClass.test_data_connection @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClass.test_login @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_abort @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_acct @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_all_errors @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_cwd @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_delete @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_dir @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_encoding_param @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_exceptions @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_getwelcome @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_line_too_long @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_login @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_makepasv @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_makepasv_issue43285_security_disabled @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_makepasv_issue43285_security_enabled_default @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_makeport @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_mkd @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_mlsd @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_nlst @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_parse257 @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_pwd @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_quit @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_rename @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_retrbinary @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_retrbinary_rest @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_retrlines @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_retrlines_too_long @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_rmd @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_sanitize @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_set_pasv @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_size @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_source_address @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_source_address_passive_connection @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_storbinary @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_storbinary_rest @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_storlines @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_storlines_too_long @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_voidcmd @ linux-x86_64 +test.test_ftplib.TestTLS_FTPClassMixin.test_with_statement @ linux-x86_64 +test.test_ftplib.TestTimeouts.testTimeoutConnect @ linux-x86_64 +test.test_ftplib.TestTimeouts.testTimeoutDefault @ linux-x86_64 +test.test_ftplib.TestTimeouts.testTimeoutDifferentOrder @ linux-x86_64 +test.test_ftplib.TestTimeouts.testTimeoutDirectAccess @ linux-x86_64 +test.test_ftplib.TestTimeouts.testTimeoutNone @ linux-x86_64 +test.test_ftplib.TestTimeouts.testTimeoutValue @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_funcattrs.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_funcattrs.txt new file mode 100644 index 0000000000..22e952bf33 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_funcattrs.txt @@ -0,0 +1,30 @@ +test.test_funcattrs.ArbitraryFunctionAttrTest.test_delete_unknown_attr @ linux-x86_64 +test.test_funcattrs.ArbitraryFunctionAttrTest.test_set_attr @ linux-x86_64 +test.test_funcattrs.ArbitraryFunctionAttrTest.test_unset_attr @ linux-x86_64 +test.test_funcattrs.BuiltinFunctionPropertiesTest.test_builtin__qualname__ @ linux-x86_64 +test.test_funcattrs.CellTest.test_comparison @ linux-x86_64 +test.test_funcattrs.FunctionDictsTest.test_delete___dict__ @ linux-x86_64 +test.test_funcattrs.FunctionDictsTest.test_func_as_dict_key @ linux-x86_64 +test.test_funcattrs.FunctionDictsTest.test_setting_dict_to_invalid @ linux-x86_64 +test.test_funcattrs.FunctionDictsTest.test_setting_dict_to_valid @ linux-x86_64 +test.test_funcattrs.FunctionDictsTest.test_unassigned_dict @ linux-x86_64 +test.test_funcattrs.FunctionDocstringTest.test_delete_docstring @ linux-x86_64 +test.test_funcattrs.FunctionDocstringTest.test_set_docstring_attr @ linux-x86_64 +test.test_funcattrs.FunctionPropertiesTest.test___closure__ @ linux-x86_64 +test.test_funcattrs.FunctionPropertiesTest.test___code__ @ linux-x86_64 +test.test_funcattrs.FunctionPropertiesTest.test___globals__ @ linux-x86_64 +test.test_funcattrs.FunctionPropertiesTest.test___name__ @ linux-x86_64 +test.test_funcattrs.FunctionPropertiesTest.test_blank_func_defaults @ linux-x86_64 +test.test_funcattrs.FunctionPropertiesTest.test_cell_new @ linux-x86_64 +test.test_funcattrs.FunctionPropertiesTest.test_copying___code__ @ linux-x86_64 +test.test_funcattrs.FunctionPropertiesTest.test_dir_includes_correct_attrs @ linux-x86_64 +test.test_funcattrs.FunctionPropertiesTest.test_duplicate_function_equality @ linux-x86_64 +test.test_funcattrs.FunctionPropertiesTest.test_empty_cell @ linux-x86_64 +test.test_funcattrs.FunctionPropertiesTest.test_func_default_args @ linux-x86_64 +test.test_funcattrs.FunctionPropertiesTest.test_module @ linux-x86_64 +test.test_funcattrs.FunctionPropertiesTest.test_set_cell @ linux-x86_64 +test.test_funcattrs.InstancemethodAttrTest.test___class__ @ linux-x86_64 +test.test_funcattrs.InstancemethodAttrTest.test___func__ @ linux-x86_64 +test.test_funcattrs.InstancemethodAttrTest.test___func___non_method @ linux-x86_64 +test.test_funcattrs.InstancemethodAttrTest.test___self__ @ linux-x86_64 +test.test_funcattrs.StaticMethodAttrsTest.test_func_attribute @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_functools.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_functools.txt new file mode 100644 index 0000000000..0f23b8017c --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_functools.txt @@ -0,0 +1,243 @@ +test.test_functools.TestCachedProperty.test_access_from_class @ linux-x86_64 +test.test_functools.TestCachedProperty.test_cached @ linux-x86_64 +test.test_functools.TestCachedProperty.test_cached_attribute_name_differs_from_func_name @ linux-x86_64 +test.test_functools.TestCachedProperty.test_doc @ linux-x86_64 +test.test_functools.TestCachedProperty.test_immutable_dict @ linux-x86_64 +test.test_functools.TestCachedProperty.test_object_with_slots @ linux-x86_64 +test.test_functools.TestCachedProperty.test_reuse_different_names @ linux-x86_64 +test.test_functools.TestCachedProperty.test_reuse_same_name @ linux-x86_64 +test.test_functools.TestCachedProperty.test_set_name_not_called @ linux-x86_64 +test.test_functools.TestCachedProperty.test_threaded @ linux-x86_64 +test.test_functools.TestCmpToKeyC.test_bad_cmp @ linux-x86_64 +test.test_functools.TestCmpToKeyC.test_cmp_to_key @ linux-x86_64 +test.test_functools.TestCmpToKeyC.test_cmp_to_key_arguments @ linux-x86_64 +test.test_functools.TestCmpToKeyC.test_hash @ linux-x86_64 +test.test_functools.TestCmpToKeyC.test_obj_field @ linux-x86_64 +test.test_functools.TestCmpToKeyC.test_sort_int @ linux-x86_64 +test.test_functools.TestCmpToKeyC.test_sort_int_str @ linux-x86_64 +test.test_functools.TestCmpToKeyPy.test_bad_cmp @ linux-x86_64 +test.test_functools.TestCmpToKeyPy.test_cmp_to_key @ linux-x86_64 +test.test_functools.TestCmpToKeyPy.test_cmp_to_key_arguments @ linux-x86_64 +test.test_functools.TestCmpToKeyPy.test_hash @ linux-x86_64 +test.test_functools.TestCmpToKeyPy.test_obj_field @ linux-x86_64 +test.test_functools.TestCmpToKeyPy.test_sort_int @ linux-x86_64 +test.test_functools.TestCmpToKeyPy.test_sort_int_str @ linux-x86_64 +test.test_functools.TestLRUC.test_copy @ linux-x86_64 +test.test_functools.TestLRUC.test_deepcopy @ linux-x86_64 +test.test_functools.TestLRUC.test_kwargs_order @ linux-x86_64 +test.test_functools.TestLRUC.test_lru @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_bug_35780 @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_bug_36650 @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_cache_decoration @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_cache_parameters @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_cache_threaded @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_cache_threaded2 @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_cache_threaded3 @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_cache_typed_is_not_recursive @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_hash_only_once @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_method @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_no_args @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_reentrancy_with_len @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_star_arg_handling @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_type_error @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_with_exceptions @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_with_keyword_args @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_with_keyword_args_maxsize_none @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_with_maxsize_negative @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_with_maxsize_none @ linux-x86_64 +test.test_functools.TestLRUC.test_lru_with_types @ linux-x86_64 +test.test_functools.TestLRUC.test_need_for_rlock @ linux-x86_64 +test.test_functools.TestLRUC.test_pickle @ linux-x86_64 +test.test_functools.TestLRUPy.test_copy @ linux-x86_64 +test.test_functools.TestLRUPy.test_deepcopy @ linux-x86_64 +test.test_functools.TestLRUPy.test_kwargs_order @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_bug_35780 @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_bug_36650 @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_cache_decoration @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_cache_parameters @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_cache_threaded @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_cache_threaded2 @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_cache_threaded3 @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_cache_typed_is_not_recursive @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_hash_only_once @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_method @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_no_args @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_reentrancy_with_len @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_star_arg_handling @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_type_error @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_with_exceptions @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_with_keyword_args @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_with_keyword_args_maxsize_none @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_with_maxsize_negative @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_with_maxsize_none @ linux-x86_64 +test.test_functools.TestLRUPy.test_lru_with_types @ linux-x86_64 +test.test_functools.TestLRUPy.test_need_for_rlock @ linux-x86_64 +test.test_functools.TestLRUPy.test_pickle @ linux-x86_64 +test.test_functools.TestPartialC.test_arg_combinations @ linux-x86_64 +test.test_functools.TestPartialC.test_argument_checking @ linux-x86_64 +test.test_functools.TestPartialC.test_attributes @ linux-x86_64 +test.test_functools.TestPartialC.test_attributes_unwritable @ linux-x86_64 +test.test_functools.TestPartialC.test_basic_examples @ linux-x86_64 +test.test_functools.TestPartialC.test_copy @ linux-x86_64 +test.test_functools.TestPartialC.test_deepcopy @ linux-x86_64 +test.test_functools.TestPartialC.test_error_propagation @ linux-x86_64 +test.test_functools.TestPartialC.test_keystr_replaces_value @ linux-x86_64 +test.test_functools.TestPartialC.test_keyword @ linux-x86_64 +test.test_functools.TestPartialC.test_kw_combinations @ linux-x86_64 +test.test_functools.TestPartialC.test_kwargs_copy @ linux-x86_64 +test.test_functools.TestPartialC.test_manually_adding_non_string_keyword @ linux-x86_64 +test.test_functools.TestPartialC.test_nested_optimization @ linux-x86_64 +test.test_functools.TestPartialC.test_nested_partial_with_attribute @ linux-x86_64 +test.test_functools.TestPartialC.test_no_side_effects @ linux-x86_64 +test.test_functools.TestPartialC.test_pickle @ linux-x86_64 +test.test_functools.TestPartialC.test_positional @ linux-x86_64 +test.test_functools.TestPartialC.test_protection_of_callers_dict_argument @ linux-x86_64 +!test.test_functools.TestPartialC.test_recursive_pickle @ linux-x86_64 +test.test_functools.TestPartialC.test_recursive_repr @ linux-x86_64 +test.test_functools.TestPartialC.test_repr @ linux-x86_64 +test.test_functools.TestPartialC.test_setstate @ linux-x86_64 +test.test_functools.TestPartialC.test_setstate_errors @ linux-x86_64 +test.test_functools.TestPartialC.test_setstate_refcount @ linux-x86_64 +test.test_functools.TestPartialC.test_setstate_subclasses @ linux-x86_64 +test.test_functools.TestPartialC.test_with_bound_and_unbound_methods @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_arg_combinations @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_argument_checking @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_attributes @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_attributes_unwritable @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_basic_examples @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_copy @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_deepcopy @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_error_propagation @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_keystr_replaces_value @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_keyword @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_kw_combinations @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_kwargs_copy @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_manually_adding_non_string_keyword @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_nested_partial_with_attribute @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_no_side_effects @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_pickle @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_positional @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_protection_of_callers_dict_argument @ linux-x86_64 +!test.test_functools.TestPartialCSubclass.test_recursive_pickle @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_recursive_repr @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_repr @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_setstate @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_setstate_errors @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_setstate_refcount @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_setstate_subclasses @ linux-x86_64 +test.test_functools.TestPartialCSubclass.test_with_bound_and_unbound_methods @ linux-x86_64 +test.test_functools.TestPartialMethod.test_abstract @ linux-x86_64 +test.test_functools.TestPartialMethod.test_arg_combinations @ linux-x86_64 +test.test_functools.TestPartialMethod.test_bound_method_introspection @ linux-x86_64 +test.test_functools.TestPartialMethod.test_descriptors @ linux-x86_64 +test.test_functools.TestPartialMethod.test_invalid_args @ linux-x86_64 +test.test_functools.TestPartialMethod.test_nested @ linux-x86_64 +test.test_functools.TestPartialMethod.test_over_partial @ linux-x86_64 +test.test_functools.TestPartialMethod.test_overriding_keywords @ linux-x86_64 +test.test_functools.TestPartialMethod.test_positional_only @ linux-x86_64 +test.test_functools.TestPartialMethod.test_repr @ linux-x86_64 +test.test_functools.TestPartialMethod.test_unbound_method_retrieval @ linux-x86_64 +test.test_functools.TestPartialPy.test_arg_combinations @ linux-x86_64 +test.test_functools.TestPartialPy.test_argument_checking @ linux-x86_64 +test.test_functools.TestPartialPy.test_attributes @ linux-x86_64 +test.test_functools.TestPartialPy.test_basic_examples @ linux-x86_64 +test.test_functools.TestPartialPy.test_copy @ linux-x86_64 +test.test_functools.TestPartialPy.test_deepcopy @ linux-x86_64 +test.test_functools.TestPartialPy.test_error_propagation @ linux-x86_64 +test.test_functools.TestPartialPy.test_keyword @ linux-x86_64 +test.test_functools.TestPartialPy.test_kw_combinations @ linux-x86_64 +test.test_functools.TestPartialPy.test_kwargs_copy @ linux-x86_64 +test.test_functools.TestPartialPy.test_nested_optimization @ linux-x86_64 +test.test_functools.TestPartialPy.test_nested_partial_with_attribute @ linux-x86_64 +test.test_functools.TestPartialPy.test_no_side_effects @ linux-x86_64 +test.test_functools.TestPartialPy.test_pickle @ linux-x86_64 +test.test_functools.TestPartialPy.test_positional @ linux-x86_64 +test.test_functools.TestPartialPy.test_protection_of_callers_dict_argument @ linux-x86_64 +!test.test_functools.TestPartialPy.test_recursive_pickle @ linux-x86_64 +test.test_functools.TestPartialPy.test_recursive_repr @ linux-x86_64 +test.test_functools.TestPartialPy.test_repr @ linux-x86_64 +test.test_functools.TestPartialPy.test_setstate @ linux-x86_64 +test.test_functools.TestPartialPy.test_setstate_errors @ linux-x86_64 +test.test_functools.TestPartialPy.test_setstate_refcount @ linux-x86_64 +test.test_functools.TestPartialPy.test_setstate_subclasses @ linux-x86_64 +test.test_functools.TestPartialPy.test_with_bound_and_unbound_methods @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_arg_combinations @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_argument_checking @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_attributes @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_basic_examples @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_copy @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_deepcopy @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_error_propagation @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_keyword @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_kw_combinations @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_kwargs_copy @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_nested_optimization @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_nested_partial_with_attribute @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_no_side_effects @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_pickle @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_positional @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_protection_of_callers_dict_argument @ linux-x86_64 +!test.test_functools.TestPartialPySubclass.test_recursive_pickle @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_recursive_repr @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_repr @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_setstate @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_setstate_errors @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_setstate_refcount @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_setstate_subclasses @ linux-x86_64 +test.test_functools.TestPartialPySubclass.test_with_bound_and_unbound_methods @ linux-x86_64 +test.test_functools.TestReduceC.test_iterator_usage @ linux-x86_64 +test.test_functools.TestReduceC.test_reduce @ linux-x86_64 +test.test_functools.TestReducePy.test_iterator_usage @ linux-x86_64 +test.test_functools.TestReducePy.test_reduce @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_abstractmethod_register @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_annotations @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_c3_abc @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_cache_invalidation @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_callable_register @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_classmethod_register @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_classmethod_type_ann_register @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_compose_mro @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_double_wrapped_methods @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_false_meta @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_invalid_positional_argument @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_invalid_registrations @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_method_register @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_method_wrapping_attributes @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_mro @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_mro_conflicts @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_register_abc @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_register_decorator @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_register_genericalias @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_register_genericalias_annotation @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_register_genericalias_decorator @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_simple_overloads @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_staticmethod_register @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_staticmethod_type_ann_register @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_type_ann_register @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_union @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_union_None @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_union_conflict @ linux-x86_64 +test.test_functools.TestSingleDispatch.test_wrapping_attributes @ linux-x86_64 +test.test_functools.TestTotalOrdering.test_no_operations_defined @ linux-x86_64 +test.test_functools.TestTotalOrdering.test_notimplemented @ linux-x86_64 +test.test_functools.TestTotalOrdering.test_pickle @ linux-x86_64 +test.test_functools.TestTotalOrdering.test_total_ordering_for_metaclasses_issue_44605 @ linux-x86_64 +test.test_functools.TestTotalOrdering.test_total_ordering_ge @ linux-x86_64 +test.test_functools.TestTotalOrdering.test_total_ordering_gt @ linux-x86_64 +test.test_functools.TestTotalOrdering.test_total_ordering_le @ linux-x86_64 +test.test_functools.TestTotalOrdering.test_total_ordering_lt @ linux-x86_64 +test.test_functools.TestTotalOrdering.test_total_ordering_no_overwrite @ linux-x86_64 +test.test_functools.TestTotalOrdering.test_type_error_when_not_implemented @ linux-x86_64 +test.test_functools.TestUpdateWrapper.test_builtin_update @ linux-x86_64 +test.test_functools.TestUpdateWrapper.test_default_update @ linux-x86_64 +test.test_functools.TestUpdateWrapper.test_default_update_doc @ linux-x86_64 +test.test_functools.TestUpdateWrapper.test_missing_attributes @ linux-x86_64 +test.test_functools.TestUpdateWrapper.test_no_update @ linux-x86_64 +test.test_functools.TestUpdateWrapper.test_selective_update @ linux-x86_64 +test.test_functools.TestWraps.test_builtin_update @ linux-x86_64 +test.test_functools.TestWraps.test_default_update @ linux-x86_64 +test.test_functools.TestWraps.test_default_update_doc @ linux-x86_64 +test.test_functools.TestWraps.test_missing_attributes @ linux-x86_64 +test.test_functools.TestWraps.test_no_update @ linux-x86_64 +test.test_functools.TestWraps.test_selective_update @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_future_stmt.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_future_stmt.txt new file mode 100644 index 0000000000..882a010086 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_future_stmt.txt @@ -0,0 +1,27 @@ +test.test_future_stmt.test_future.AnnotationsFutureTestCase.test_annotation_with_complex_target @ linux-x86_64 +test.test_future_stmt.test_future.AnnotationsFutureTestCase.test_annotations_forbidden @ linux-x86_64 +test.test_future_stmt.test_future.AnnotationsFutureTestCase.test_annotations_symbol_table_pass @ linux-x86_64 +test.test_future_stmt.test_future.AnnotationsFutureTestCase.test_get_type_hints_on_func_with_variadic_arg @ linux-x86_64 +test.test_future_stmt.test_future.FutureTest.test_badfuture10 @ linux-x86_64 +test.test_future_stmt.test_future.FutureTest.test_badfuture3 @ linux-x86_64 +test.test_future_stmt.test_future.FutureTest.test_badfuture4 @ linux-x86_64 +test.test_future_stmt.test_future.FutureTest.test_badfuture5 @ linux-x86_64 +test.test_future_stmt.test_future.FutureTest.test_badfuture6 @ linux-x86_64 +test.test_future_stmt.test_future.FutureTest.test_badfuture8 @ linux-x86_64 +test.test_future_stmt.test_future.FutureTest.test_badfuture9 @ linux-x86_64 +test.test_future_stmt.test_future.FutureTest.test_ensure_flags_dont_clash @ linux-x86_64 +test.test_future_stmt.test_future.FutureTest.test_future1 @ linux-x86_64 +test.test_future_stmt.test_future.FutureTest.test_future2 @ linux-x86_64 +test.test_future_stmt.test_future.FutureTest.test_future_multiple_features @ linux-x86_64 +test.test_future_stmt.test_future.FutureTest.test_future_multiple_imports @ linux-x86_64 +test.test_future_stmt.test_future.FutureTest.test_future_single_import @ linux-x86_64 +test.test_future_stmt.test_future.FutureTest.test_parserhack @ linux-x86_64 +test.test_future_stmt.test_future.FutureTest.test_unicode_literals_exec @ linux-x86_64 +test.test_future_stmt.test_future_flags.FutureTest.test_attributes @ linux-x86_64 +test.test_future_stmt.test_future_flags.FutureTest.test_names @ linux-x86_64 +test.test_future_stmt.test_future_multiple_features.TestMultipleFeatures.test_print_function @ linux-x86_64 +test.test_future_stmt.test_future_multiple_features.TestMultipleFeatures.test_unicode_literals @ linux-x86_64 +test.test_future_stmt.test_future_multiple_imports.Tests.test_unicode_literals @ linux-x86_64 +test.test_future_stmt.test_future_single_import.TestFuture.test_floor_div_operator @ linux-x86_64 +test.test_future_stmt.test_future_single_import.TestFuture.test_nested_scopes @ linux-x86_64 +test.test_future_stmt.test_future_single_import.TestFuture.test_true_div_as_default @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_gc.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_gc.txt new file mode 100644 index 0000000000..060f29052b --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_gc.txt @@ -0,0 +1,4 @@ +test.test_gc.GCTests.test_bug21435 @ linux-x86_64 +test.test_gc.GCTests.test_trash_weakref_clear @ linux-x86_64 +test.test_gc.GCTests.test_trashcan @ linux-x86_64 +test.test_gc.PythonFinalizationTests.test_ast_fini @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_generator_stop.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_generator_stop.txt new file mode 100644 index 0000000000..15823559d7 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_generator_stop.txt @@ -0,0 +1,2 @@ +test.test_generator_stop.TestPEP479.test_stopiteration_wrapping @ linux-x86_64 +test.test_generator_stop.TestPEP479.test_stopiteration_wrapping_context @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_generators.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_generators.txt new file mode 100644 index 0000000000..9b87a9580c --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_generators.txt @@ -0,0 +1,19 @@ +DocTestCase.test.test_generators.__test__.conjoin @ linux-x86_64 +DocTestCase.test.test_generators.__test__.coroutine @ linux-x86_64 +DocTestCase.test.test_generators.__test__.fun @ linux-x86_64 +DocTestCase.test.test_generators.__test__.pep @ linux-x86_64 +DocTestCase.test.test_generators.__test__.refleaks @ linux-x86_64 +DocTestCase.test.test_generators.__test__.syntax @ linux-x86_64 +DocTestCase.test.test_generators.__test__.tut @ linux-x86_64 +DocTestCase.test.test_generators.__test__.weakref @ linux-x86_64 +test.test_generators.ExceptionTest.test_except_throw_bad_exception @ linux-x86_64 +test.test_generators.ExceptionTest.test_return_stopiteration @ linux-x86_64 +test.test_generators.ExceptionTest.test_return_tuple @ linux-x86_64 +test.test_generators.ExceptionTest.test_stopiteration_error @ linux-x86_64 +test.test_generators.ExceptionTest.test_tutorial_stopiteration @ linux-x86_64 +test.test_generators.GeneratorStackTraceTest.test_send_with_yield_from @ linux-x86_64 +test.test_generators.GeneratorStackTraceTest.test_throw_with_yield_from @ linux-x86_64 +test.test_generators.GeneratorTest.test_copy @ linux-x86_64 +test.test_generators.GeneratorTest.test_pickle @ linux-x86_64 +test.test_generators.GeneratorTest.test_send_non_none_to_new_gen @ linux-x86_64 +test.test_generators.GeneratorThrowTest.test_throw_after_none_exc_type @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_genericalias.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_genericalias.txt new file mode 100644 index 0000000000..597b9f718e --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_genericalias.txt @@ -0,0 +1,29 @@ +test.test_genericalias.BaseTest.test_calling_next_twice_raises_stopiteration @ linux-x86_64 +test.test_genericalias.BaseTest.test_class_methods @ linux-x86_64 +test.test_genericalias.BaseTest.test_copy @ linux-x86_64 +test.test_genericalias.BaseTest.test_del_iter @ linux-x86_64 +test.test_genericalias.BaseTest.test_dir @ linux-x86_64 +test.test_genericalias.BaseTest.test_equality @ linux-x86_64 +test.test_genericalias.BaseTest.test_exposed_type @ linux-x86_64 +test.test_genericalias.BaseTest.test_generic_subclass @ linux-x86_64 +test.test_genericalias.BaseTest.test_instantiate @ linux-x86_64 +test.test_genericalias.BaseTest.test_isinstance @ linux-x86_64 +test.test_genericalias.BaseTest.test_issubclass @ linux-x86_64 +test.test_genericalias.BaseTest.test_iter_creates_starred_tuple @ linux-x86_64 +test.test_genericalias.BaseTest.test_no_chaining @ linux-x86_64 +test.test_genericalias.BaseTest.test_no_kwargs @ linux-x86_64 +test.test_genericalias.BaseTest.test_parameter_chaining @ linux-x86_64 +test.test_genericalias.BaseTest.test_parameters @ linux-x86_64 +test.test_genericalias.BaseTest.test_pickle @ linux-x86_64 +test.test_genericalias.BaseTest.test_repr @ linux-x86_64 +test.test_genericalias.BaseTest.test_subclassing @ linux-x86_64 +test.test_genericalias.BaseTest.test_subclassing_types_genericalias @ linux-x86_64 +test.test_genericalias.BaseTest.test_type_generic @ linux-x86_64 +test.test_genericalias.BaseTest.test_type_subclass_generic @ linux-x86_64 +test.test_genericalias.BaseTest.test_unbound_methods @ linux-x86_64 +test.test_genericalias.BaseTest.test_union @ linux-x86_64 +test.test_genericalias.BaseTest.test_union_generic @ linux-x86_64 +test.test_genericalias.BaseTest.test_unpack @ linux-x86_64 +test.test_genericalias.BaseTest.test_unsubscriptable @ linux-x86_64 +test.test_genericalias.TypeIterationTests.test_cannot_iterate @ linux-x86_64 +test.test_genericalias.TypeIterationTests.test_is_not_instance_of_iterable @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_genericclass.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_genericclass.txt new file mode 100644 index 0000000000..dbcbd8dee2 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_genericclass.txt @@ -0,0 +1,21 @@ +test.test_genericclass.TestClassGetitem.test_class_getitem @ linux-x86_64 +test.test_genericclass.TestClassGetitem.test_class_getitem_classmethod @ linux-x86_64 +test.test_genericclass.TestClassGetitem.test_class_getitem_errors @ linux-x86_64 +test.test_genericclass.TestClassGetitem.test_class_getitem_errors_2 @ linux-x86_64 +test.test_genericclass.TestClassGetitem.test_class_getitem_format @ linux-x86_64 +test.test_genericclass.TestClassGetitem.test_class_getitem_inheritance @ linux-x86_64 +test.test_genericclass.TestClassGetitem.test_class_getitem_inheritance_2 @ linux-x86_64 +test.test_genericclass.TestClassGetitem.test_class_getitem_metaclass @ linux-x86_64 +test.test_genericclass.TestClassGetitem.test_class_getitem_metaclass_first @ linux-x86_64 +test.test_genericclass.TestClassGetitem.test_class_getitem_patched @ linux-x86_64 +test.test_genericclass.TestClassGetitem.test_class_getitem_with_builtins @ linux-x86_64 +test.test_genericclass.TestClassGetitem.test_class_getitem_with_metaclass @ linux-x86_64 +test.test_genericclass.TestMROEntry.test_mro_entry @ linux-x86_64 +test.test_genericclass.TestMROEntry.test_mro_entry_errors @ linux-x86_64 +test.test_genericclass.TestMROEntry.test_mro_entry_errors_2 @ linux-x86_64 +test.test_genericclass.TestMROEntry.test_mro_entry_metaclass @ linux-x86_64 +test.test_genericclass.TestMROEntry.test_mro_entry_none @ linux-x86_64 +test.test_genericclass.TestMROEntry.test_mro_entry_signature @ linux-x86_64 +test.test_genericclass.TestMROEntry.test_mro_entry_type_call @ linux-x86_64 +test.test_genericclass.TestMROEntry.test_mro_entry_with_builtins @ linux-x86_64 +test.test_genericclass.TestMROEntry.test_mro_entry_with_builtins_2 @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_genericpath.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_genericpath.txt new file mode 100644 index 0000000000..123bc7545c --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_genericpath.txt @@ -0,0 +1,24 @@ +test.test_genericpath.PathLikeTests.test_path_commonprefix @ linux-x86_64 +test.test_genericpath.PathLikeTests.test_path_exists @ linux-x86_64 +test.test_genericpath.PathLikeTests.test_path_getctime @ linux-x86_64 +test.test_genericpath.PathLikeTests.test_path_getmtime @ linux-x86_64 +test.test_genericpath.PathLikeTests.test_path_getsize @ linux-x86_64 +test.test_genericpath.PathLikeTests.test_path_isdir @ linux-x86_64 +test.test_genericpath.PathLikeTests.test_path_isfile @ linux-x86_64 +test.test_genericpath.PathLikeTests.test_path_samefile @ linux-x86_64 +test.test_genericpath.TestGenericTest.test_commonprefix @ linux-x86_64 +test.test_genericpath.TestGenericTest.test_exists @ linux-x86_64 +test.test_genericpath.TestGenericTest.test_exists_fd @ linux-x86_64 +test.test_genericpath.TestGenericTest.test_filetime @ linux-x86_64 +test.test_genericpath.TestGenericTest.test_getsize @ linux-x86_64 +test.test_genericpath.TestGenericTest.test_invalid_paths @ linux-x86_64 +test.test_genericpath.TestGenericTest.test_isdir @ linux-x86_64 +test.test_genericpath.TestGenericTest.test_isfile @ linux-x86_64 +test.test_genericpath.TestGenericTest.test_no_argument @ linux-x86_64 +test.test_genericpath.TestGenericTest.test_samefile @ linux-x86_64 +test.test_genericpath.TestGenericTest.test_samefile_on_link @ linux-x86_64 +test.test_genericpath.TestGenericTest.test_samefile_on_symlink @ linux-x86_64 +test.test_genericpath.TestGenericTest.test_sameopenfile @ linux-x86_64 +test.test_genericpath.TestGenericTest.test_samestat @ linux-x86_64 +test.test_genericpath.TestGenericTest.test_samestat_on_link @ linux-x86_64 +test.test_genericpath.TestGenericTest.test_samestat_on_symlink @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_genexps.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_genexps.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_getopt.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_getopt.txt new file mode 100644 index 0000000000..8cd52c58d6 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_getopt.txt @@ -0,0 +1,8 @@ +DocTestCase.test.test_getopt.test_libref_examples @ linux-x86_64 +test.test_getopt.GetoptTests.test_do_longs @ linux-x86_64 +test.test_getopt.GetoptTests.test_do_shorts @ linux-x86_64 +test.test_getopt.GetoptTests.test_getopt @ linux-x86_64 +test.test_getopt.GetoptTests.test_gnu_getopt @ linux-x86_64 +test.test_getopt.GetoptTests.test_issue4629 @ linux-x86_64 +test.test_getopt.GetoptTests.test_long_has_args @ linux-x86_64 +test.test_getopt.GetoptTests.test_short_has_arg @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_getpass.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_getpass.txt new file mode 100644 index 0000000000..581d65f3a0 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_getpass.txt @@ -0,0 +1,14 @@ +test.test_getpass.GetpassGetuserTest.test_username_falls_back_to_pwd @ linux-x86_64 +test.test_getpass.GetpassGetuserTest.test_username_priorities_of_env_values @ linux-x86_64 +test.test_getpass.GetpassGetuserTest.test_username_takes_username_from_env @ linux-x86_64 +test.test_getpass.GetpassRawinputTest.test_flushes_stream_after_prompt @ linux-x86_64 +test.test_getpass.GetpassRawinputTest.test_raises_on_empty_input @ linux-x86_64 +test.test_getpass.GetpassRawinputTest.test_trims_trailing_newline @ linux-x86_64 +test.test_getpass.GetpassRawinputTest.test_uses_stderr_as_default @ linux-x86_64 +test.test_getpass.GetpassRawinputTest.test_uses_stdin_as_default_input @ linux-x86_64 +test.test_getpass.GetpassRawinputTest.test_uses_stdin_as_different_locale @ linux-x86_64 +test.test_getpass.UnixGetpassTest.test_falls_back_to_fallback_if_termios_raises @ linux-x86_64 +test.test_getpass.UnixGetpassTest.test_falls_back_to_stdin @ linux-x86_64 +test.test_getpass.UnixGetpassTest.test_flushes_stream_after_input @ linux-x86_64 +test.test_getpass.UnixGetpassTest.test_resets_termios @ linux-x86_64 +test.test_getpass.UnixGetpassTest.test_uses_tty_directly @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_gettext.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_gettext.txt new file mode 100644 index 0000000000..34862ff8fe --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_gettext.txt @@ -0,0 +1,43 @@ +test.test_gettext.GNUTranslationParsingTest.test_ignore_comments_in_headers_issue36239 @ linux-x86_64 +test.test_gettext.GNUTranslationParsingTest.test_plural_form_error_issue17898 @ linux-x86_64 +test.test_gettext.GNUTranslationsClassPluralFormsTestCase.test_plural_context_forms @ linux-x86_64 +test.test_gettext.GNUTranslationsClassPluralFormsTestCase.test_plural_context_forms_null_translations @ linux-x86_64 +test.test_gettext.GNUTranslationsClassPluralFormsTestCase.test_plural_forms @ linux-x86_64 +test.test_gettext.GNUTranslationsClassPluralFormsTestCase.test_plural_forms_null_translations @ linux-x86_64 +test.test_gettext.GNUTranslationsClassPluralFormsTestCase.test_plural_wrong_context_forms @ linux-x86_64 +test.test_gettext.GNUTranslationsPluralFormsTestCase.test_plural_context_forms @ linux-x86_64 +test.test_gettext.GNUTranslationsPluralFormsTestCase.test_plural_forms @ linux-x86_64 +test.test_gettext.GNUTranslationsPluralFormsTestCase.test_plural_wrong_context_forms @ linux-x86_64 +test.test_gettext.GNUTranslationsWithDomainPluralFormsTestCase.test_plural_context_forms @ linux-x86_64 +test.test_gettext.GNUTranslationsWithDomainPluralFormsTestCase.test_plural_context_forms_wrong_domain @ linux-x86_64 +test.test_gettext.GNUTranslationsWithDomainPluralFormsTestCase.test_plural_forms @ linux-x86_64 +test.test_gettext.GNUTranslationsWithDomainPluralFormsTestCase.test_plural_forms_wrong_domain @ linux-x86_64 +test.test_gettext.GNUTranslationsWithDomainPluralFormsTestCase.test_plural_wrong_context_forms @ linux-x86_64 +test.test_gettext.GettextCacheTestCase.test_cache @ linux-x86_64 +test.test_gettext.GettextTestCase1.test_double_quotes @ linux-x86_64 +test.test_gettext.GettextTestCase1.test_multiline_strings @ linux-x86_64 +test.test_gettext.GettextTestCase1.test_some_translations @ linux-x86_64 +test.test_gettext.GettextTestCase1.test_some_translations_with_context @ linux-x86_64 +test.test_gettext.GettextTestCase1.test_the_alternative_interface @ linux-x86_64 +test.test_gettext.GettextTestCase1.test_triple_double_quotes @ linux-x86_64 +test.test_gettext.GettextTestCase1.test_triple_single_quotes @ linux-x86_64 +test.test_gettext.GettextTestCase2.test_bad_major_version @ linux-x86_64 +test.test_gettext.GettextTestCase2.test_bad_minor_version @ linux-x86_64 +test.test_gettext.GettextTestCase2.test_bindtextdomain @ linux-x86_64 +test.test_gettext.GettextTestCase2.test_double_quotes @ linux-x86_64 +test.test_gettext.GettextTestCase2.test_multiline_strings @ linux-x86_64 +test.test_gettext.GettextTestCase2.test_some_translations @ linux-x86_64 +test.test_gettext.GettextTestCase2.test_some_translations_with_context @ linux-x86_64 +test.test_gettext.GettextTestCase2.test_some_translations_with_context_and_domain @ linux-x86_64 +test.test_gettext.GettextTestCase2.test_textdomain @ linux-x86_64 +test.test_gettext.GettextTestCase2.test_triple_double_quotes @ linux-x86_64 +test.test_gettext.GettextTestCase2.test_triple_single_quotes @ linux-x86_64 +test.test_gettext.MiscTestCase.test__all__ @ linux-x86_64 +test.test_gettext.UnicodeTranslationsPluralTest.test_unicode_context_msgid @ linux-x86_64 +test.test_gettext.UnicodeTranslationsPluralTest.test_unicode_msgid @ linux-x86_64 +test.test_gettext.UnicodeTranslationsPluralTest.test_unicode_msgstr @ linux-x86_64 +test.test_gettext.UnicodeTranslationsPluralTest.test_unicode_msgstr_with_context @ linux-x86_64 +test.test_gettext.UnicodeTranslationsTest.test_unicode_context_msgstr @ linux-x86_64 +test.test_gettext.UnicodeTranslationsTest.test_unicode_msgid @ linux-x86_64 +test.test_gettext.UnicodeTranslationsTest.test_unicode_msgstr @ linux-x86_64 +test.test_gettext.WeirdMetadataTest.test_weird_metadata @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_glob.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_glob.txt new file mode 100644 index 0000000000..25bb39a632 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_glob.txt @@ -0,0 +1,14 @@ +test.test_glob.GlobTests.test_escape @ linux-x86_64 +test.test_glob.GlobTests.test_glob_broken_symlinks @ linux-x86_64 +test.test_glob.GlobTests.test_glob_bytes_directory_with_trailing_slash @ linux-x86_64 +test.test_glob.GlobTests.test_glob_directory_names @ linux-x86_64 +test.test_glob.GlobTests.test_glob_directory_with_trailing_slash @ linux-x86_64 +test.test_glob.GlobTests.test_glob_empty_pattern @ linux-x86_64 +test.test_glob.GlobTests.test_glob_literal @ linux-x86_64 +test.test_glob.GlobTests.test_glob_many_open_files @ linux-x86_64 +test.test_glob.GlobTests.test_glob_nested_directory @ linux-x86_64 +test.test_glob.GlobTests.test_glob_one_directory @ linux-x86_64 +test.test_glob.GlobTests.test_glob_symlinks @ linux-x86_64 +test.test_glob.GlobTests.test_hidden_glob @ linux-x86_64 +test.test_glob.GlobTests.test_recursive_glob @ linux-x86_64 +!test.test_glob.SymlinkLoopGlobTests.test_selflink @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_global.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_global.txt new file mode 100644 index 0000000000..2238dcc5f3 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_global.txt @@ -0,0 +1,4 @@ +test.test_global.GlobalTests.test1 @ linux-x86_64 +test.test_global.GlobalTests.test2 @ linux-x86_64 +test.test_global.GlobalTests.test3 @ linux-x86_64 +test.test_global.GlobalTests.test4 @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_grammar.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_grammar.txt new file mode 100644 index 0000000000..92ca68e163 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_grammar.txt @@ -0,0 +1,67 @@ +test.test_grammar.GrammarTests.test_additive_ops @ linux-x86_64 +test.test_grammar.GrammarTests.test_annotations_inheritance @ linux-x86_64 +test.test_grammar.GrammarTests.test_assert @ linux-x86_64 +test.test_grammar.GrammarTests.test_assert_failures @ linux-x86_64 +test.test_grammar.GrammarTests.test_async_await @ linux-x86_64 +test.test_grammar.GrammarTests.test_atoms @ linux-x86_64 +test.test_grammar.GrammarTests.test_binary_mask_ops @ linux-x86_64 +test.test_grammar.GrammarTests.test_break_continue_loop @ linux-x86_64 +test.test_grammar.GrammarTests.test_break_in_finally @ linux-x86_64 +test.test_grammar.GrammarTests.test_break_in_finally_after_return @ linux-x86_64 +test.test_grammar.GrammarTests.test_break_stmt @ linux-x86_64 +test.test_grammar.GrammarTests.test_classdef @ linux-x86_64 +test.test_grammar.GrammarTests.test_comparison @ linux-x86_64 +test.test_grammar.GrammarTests.test_comparison_is_literal @ linux-x86_64 +test.test_grammar.GrammarTests.test_comprehension_specials @ linux-x86_64 +test.test_grammar.GrammarTests.test_continue_in_finally @ linux-x86_64 +test.test_grammar.GrammarTests.test_continue_in_finally_after_return @ linux-x86_64 +test.test_grammar.GrammarTests.test_continue_stmt @ linux-x86_64 +test.test_grammar.GrammarTests.test_del_stmt @ linux-x86_64 +test.test_grammar.GrammarTests.test_dictcomps @ linux-x86_64 +test.test_grammar.GrammarTests.test_eval_input @ linux-x86_64 +test.test_grammar.GrammarTests.test_expr_stmt @ linux-x86_64 +test.test_grammar.GrammarTests.test_for @ linux-x86_64 +test.test_grammar.GrammarTests.test_former_statements_refer_to_builtins @ linux-x86_64 +test.test_grammar.GrammarTests.test_funcdef @ linux-x86_64 +test.test_grammar.GrammarTests.test_genexps @ linux-x86_64 +test.test_grammar.GrammarTests.test_global @ linux-x86_64 +test.test_grammar.GrammarTests.test_if @ linux-x86_64 +test.test_grammar.GrammarTests.test_if_else_expr @ linux-x86_64 +test.test_grammar.GrammarTests.test_import @ linux-x86_64 +test.test_grammar.GrammarTests.test_lambdef @ linux-x86_64 +test.test_grammar.GrammarTests.test_listcomps @ linux-x86_64 +test.test_grammar.GrammarTests.test_matrix_mul @ linux-x86_64 +test.test_grammar.GrammarTests.test_multiplicative_ops @ linux-x86_64 +test.test_grammar.GrammarTests.test_nonlocal @ linux-x86_64 +test.test_grammar.GrammarTests.test_paren_evaluation @ linux-x86_64 +test.test_grammar.GrammarTests.test_pass_stmt @ linux-x86_64 +test.test_grammar.GrammarTests.test_raise @ linux-x86_64 +test.test_grammar.GrammarTests.test_return @ linux-x86_64 +test.test_grammar.GrammarTests.test_return_in_finally @ linux-x86_64 +test.test_grammar.GrammarTests.test_selectors @ linux-x86_64 +test.test_grammar.GrammarTests.test_shift_ops @ linux-x86_64 +test.test_grammar.GrammarTests.test_simple_stmt @ linux-x86_64 +test.test_grammar.GrammarTests.test_suite @ linux-x86_64 +test.test_grammar.GrammarTests.test_test @ linux-x86_64 +test.test_grammar.GrammarTests.test_try @ linux-x86_64 +test.test_grammar.GrammarTests.test_unary_ops @ linux-x86_64 +test.test_grammar.GrammarTests.test_var_annot_basic_semantics @ linux-x86_64 +test.test_grammar.GrammarTests.test_var_annot_basics @ linux-x86_64 +test.test_grammar.GrammarTests.test_var_annot_in_module @ linux-x86_64 +test.test_grammar.GrammarTests.test_var_annot_module_semantics @ linux-x86_64 +test.test_grammar.GrammarTests.test_var_annot_rhs @ linux-x86_64 +test.test_grammar.GrammarTests.test_var_annot_simple_exec @ linux-x86_64 +test.test_grammar.GrammarTests.test_var_annot_syntax_errors @ linux-x86_64 +test.test_grammar.GrammarTests.test_while @ linux-x86_64 +test.test_grammar.GrammarTests.test_with_statement @ linux-x86_64 +test.test_grammar.TokenTests.test_backslash @ linux-x86_64 +test.test_grammar.TokenTests.test_bad_numerical_literals @ linux-x86_64 +test.test_grammar.TokenTests.test_ellipsis @ linux-x86_64 +test.test_grammar.TokenTests.test_end_of_numerical_literals @ linux-x86_64 +test.test_grammar.TokenTests.test_eof_error @ linux-x86_64 +test.test_grammar.TokenTests.test_float_exponent_tokenization @ linux-x86_64 +test.test_grammar.TokenTests.test_floats @ linux-x86_64 +test.test_grammar.TokenTests.test_long_integers @ linux-x86_64 +test.test_grammar.TokenTests.test_plain_integers @ linux-x86_64 +test.test_grammar.TokenTests.test_string_literals @ linux-x86_64 +test.test_grammar.TokenTests.test_underscore_literals @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_graphlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_graphlib.txt new file mode 100644 index 0000000000..54dd30a3ef --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_graphlib.txt @@ -0,0 +1,15 @@ +test.test_graphlib.TestTopologicalSort.test_add_dependencies_for_same_node_incrementally @ linux-x86_64 +test.test_graphlib.TestTopologicalSort.test_calls_before_prepare @ linux-x86_64 +test.test_graphlib.TestTopologicalSort.test_cycle @ linux-x86_64 +test.test_graphlib.TestTopologicalSort.test_done @ linux-x86_64 +test.test_graphlib.TestTopologicalSort.test_empty @ linux-x86_64 +test.test_graphlib.TestTopologicalSort.test_graph_with_iterables @ linux-x86_64 +test.test_graphlib.TestTopologicalSort.test_invalid_nodes_in_done @ linux-x86_64 +test.test_graphlib.TestTopologicalSort.test_is_active @ linux-x86_64 +test.test_graphlib.TestTopologicalSort.test_no_dependencies @ linux-x86_64 +test.test_graphlib.TestTopologicalSort.test_not_hashable_nodes @ linux-x86_64 +test.test_graphlib.TestTopologicalSort.test_order_of_insertion_does_not_matter_between_groups @ linux-x86_64 +test.test_graphlib.TestTopologicalSort.test_prepare_multiple_times @ linux-x86_64 +test.test_graphlib.TestTopologicalSort.test_simple_cases @ linux-x86_64 +test.test_graphlib.TestTopologicalSort.test_static_order_does_not_change_with_the_hash_seed @ linux-x86_64 +test.test_graphlib.TestTopologicalSort.test_the_node_multiple_times @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_gzip.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_gzip.txt new file mode 100644 index 0000000000..e77957a1c2 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_gzip.txt @@ -0,0 +1,61 @@ +test.test_gzip.TestCommandLine.test_compress_fast_best_are_exclusive @ linux-x86_64 +test.test_gzip.TestCommandLine.test_compress_infile_outfile @ linux-x86_64 +test.test_gzip.TestCommandLine.test_compress_infile_outfile_default @ linux-x86_64 +test.test_gzip.TestCommandLine.test_decompress_cannot_have_flags_compression @ linux-x86_64 +test.test_gzip.TestCommandLine.test_decompress_infile_outfile @ linux-x86_64 +test.test_gzip.TestCommandLine.test_decompress_infile_outfile_error @ linux-x86_64 +test.test_gzip.TestGzip.test_1647484 @ linux-x86_64 +test.test_gzip.TestGzip.test_append @ linux-x86_64 +test.test_gzip.TestGzip.test_bad_gzip_file @ linux-x86_64 +test.test_gzip.TestGzip.test_buffered_reader @ linux-x86_64 +test.test_gzip.TestGzip.test_compress @ linux-x86_64 +test.test_gzip.TestGzip.test_compress_correct_level @ linux-x86_64 +test.test_gzip.TestGzip.test_compress_mtime @ linux-x86_64 +test.test_gzip.TestGzip.test_compresslevel_metadata @ linux-x86_64 +test.test_gzip.TestGzip.test_decompress @ linux-x86_64 +test.test_gzip.TestGzip.test_decompress_limited @ linux-x86_64 +test.test_gzip.TestGzip.test_decompress_missing_trailer @ linux-x86_64 +test.test_gzip.TestGzip.test_decompress_truncated_trailer @ linux-x86_64 +test.test_gzip.TestGzip.test_exclusive_write @ linux-x86_64 +test.test_gzip.TestGzip.test_fileobj_from_fdopen @ linux-x86_64 +test.test_gzip.TestGzip.test_fileobj_mode @ linux-x86_64 +test.test_gzip.TestGzip.test_gzip_BadGzipFile_exception @ linux-x86_64 +test.test_gzip.TestGzip.test_io_on_closed_object @ linux-x86_64 +test.test_gzip.TestGzip.test_issue44439 @ linux-x86_64 +test.test_gzip.TestGzip.test_many_append @ linux-x86_64 +test.test_gzip.TestGzip.test_metadata @ linux-x86_64 +test.test_gzip.TestGzip.test_metadata_ascii_name @ linux-x86_64 +test.test_gzip.TestGzip.test_mode @ linux-x86_64 +test.test_gzip.TestGzip.test_mtime @ linux-x86_64 +test.test_gzip.TestGzip.test_non_seekable_file @ linux-x86_64 +test.test_gzip.TestGzip.test_paddedfile_getattr @ linux-x86_64 +test.test_gzip.TestGzip.test_peek @ linux-x86_64 +test.test_gzip.TestGzip.test_prepend_error @ linux-x86_64 +test.test_gzip.TestGzip.test_read @ linux-x86_64 +test.test_gzip.TestGzip.test_read1 @ linux-x86_64 +test.test_gzip.TestGzip.test_read_large @ linux-x86_64 +test.test_gzip.TestGzip.test_read_truncated @ linux-x86_64 +test.test_gzip.TestGzip.test_read_with_extra @ linux-x86_64 +test.test_gzip.TestGzip.test_readline @ linux-x86_64 +test.test_gzip.TestGzip.test_readlines @ linux-x86_64 +test.test_gzip.TestGzip.test_seek_read @ linux-x86_64 +test.test_gzip.TestGzip.test_seek_whence @ linux-x86_64 +test.test_gzip.TestGzip.test_seek_write @ linux-x86_64 +test.test_gzip.TestGzip.test_textio_readlines @ linux-x86_64 +test.test_gzip.TestGzip.test_with_open @ linux-x86_64 +test.test_gzip.TestGzip.test_write @ linux-x86_64 +test.test_gzip.TestGzip.test_write_array @ linux-x86_64 +test.test_gzip.TestGzip.test_write_bytearray @ linux-x86_64 +test.test_gzip.TestGzip.test_write_incompatible_type @ linux-x86_64 +test.test_gzip.TestGzip.test_write_memoryview @ linux-x86_64 +test.test_gzip.TestGzip.test_write_read_with_pathlike_file @ linux-x86_64 +test.test_gzip.TestGzip.test_zero_padded_file @ linux-x86_64 +test.test_gzip.TestOpen.test_bad_params @ linux-x86_64 +test.test_gzip.TestOpen.test_binary_modes @ linux-x86_64 +test.test_gzip.TestOpen.test_encoding @ linux-x86_64 +test.test_gzip.TestOpen.test_encoding_error_handler @ linux-x86_64 +test.test_gzip.TestOpen.test_fileobj @ linux-x86_64 +test.test_gzip.TestOpen.test_implicit_binary_modes @ linux-x86_64 +test.test_gzip.TestOpen.test_newline @ linux-x86_64 +test.test_gzip.TestOpen.test_pathlike_file @ linux-x86_64 +test.test_gzip.TestOpen.test_text_modes @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_hash.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_hash.txt new file mode 100644 index 0000000000..fc1493c22c --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_hash.txt @@ -0,0 +1,11 @@ +test.test_hash.HashBuiltinsTestCase.test_hashes @ linux-x86_64 +test.test_hash.HashDistributionTestCase.test_hash_distribution @ linux-x86_64 +test.test_hash.HashEqualityTestCase.test_coerced_floats @ linux-x86_64 +test.test_hash.HashEqualityTestCase.test_coerced_integers @ linux-x86_64 +test.test_hash.HashEqualityTestCase.test_numeric_literals @ linux-x86_64 +test.test_hash.HashEqualityTestCase.test_unaligned_buffers @ linux-x86_64 +test.test_hash.HashInheritanceTestCase.test_default_hash @ linux-x86_64 +test.test_hash.HashInheritanceTestCase.test_error_hash @ linux-x86_64 +test.test_hash.HashInheritanceTestCase.test_fixed_hash @ linux-x86_64 +test.test_hash.HashInheritanceTestCase.test_hashable @ linux-x86_64 +test.test_hash.HashInheritanceTestCase.test_not_hashable @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_hashlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_hashlib.txt new file mode 100644 index 0000000000..e8465ffd8b --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_hashlib.txt @@ -0,0 +1,63 @@ +test.test_hashlib.HashLibTestCase.test_algorithms_available @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_algorithms_guaranteed @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_blocksize_name @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_blocksize_name_blake2 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_blocksize_name_sha3 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_blake2b_0 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_blake2b_1 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_blake2s_0 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_blake2s_1 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_md5_0 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_md5_1 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_md5_2 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha1_0 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha1_1 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha1_2 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha1_3 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha224_0 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha224_1 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha224_2 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha224_3 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha256_0 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha256_1 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha256_2 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha256_3 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha384_0 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha384_1 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha384_2 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha384_3 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha3_224_0 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha3_224_vector @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha3_256_0 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha3_256_vector @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha3_384_0 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha3_384_vector @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha3_512_0 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha3_512_vector @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha512_0 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha512_1 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha512_2 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_case_sha512_3 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_digest_length_overflow @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_extra_sha3 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_get_builtin_constructor @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_get_fips_mode @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_gil @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_hash_array @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_hash_disallow_instantiation @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_hexdigest @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_large_update @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_name_attribute @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_new_upper_to_lower @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_no_unicode @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_no_unicode_blake2 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_no_unicode_sha3 @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_readonly_types @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_threaded_hashing @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_unknown_hash @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_usedforsecurity_false @ linux-x86_64 +test.test_hashlib.HashLibTestCase.test_usedforsecurity_true @ linux-x86_64 +test.test_hashlib.KDFTests.test_file_digest @ linux-x86_64 +test.test_hashlib.KDFTests.test_normalized_name @ linux-x86_64 +test.test_hashlib.KDFTests.test_pbkdf2_hmac_c @ linux-x86_64 +test.test_hashlib.KDFTests.test_pbkdf2_hmac_py @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_heapq.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_heapq.txt new file mode 100644 index 0000000000..3f3973edf0 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_heapq.txt @@ -0,0 +1,25 @@ +DocTestCase.merge @ linux-x86_64 +test.test_heapq.TestErrorHandlingPython.test_arg_parsing @ linux-x86_64 +test.test_heapq.TestErrorHandlingPython.test_cmp_err @ linux-x86_64 +test.test_heapq.TestErrorHandlingPython.test_comparison_operator_modifiying_heap @ linux-x86_64 +test.test_heapq.TestErrorHandlingPython.test_comparison_operator_modifiying_heap_two_heaps @ linux-x86_64 +test.test_heapq.TestErrorHandlingPython.test_heappop_mutating_heap @ linux-x86_64 +test.test_heapq.TestErrorHandlingPython.test_heappush_mutating_heap @ linux-x86_64 +test.test_heapq.TestErrorHandlingPython.test_iterable_args @ linux-x86_64 +test.test_heapq.TestErrorHandlingPython.test_len_only @ linux-x86_64 +test.test_heapq.TestErrorHandlingPython.test_non_sequence @ linux-x86_64 +test.test_heapq.TestHeapPython.test_comparison_operator @ linux-x86_64 +test.test_heapq.TestHeapPython.test_empty_merges @ linux-x86_64 +test.test_heapq.TestHeapPython.test_heapify @ linux-x86_64 +test.test_heapq.TestHeapPython.test_heappop_max @ linux-x86_64 +test.test_heapq.TestHeapPython.test_heappushpop @ linux-x86_64 +test.test_heapq.TestHeapPython.test_heapsort @ linux-x86_64 +test.test_heapq.TestHeapPython.test_merge @ linux-x86_64 +test.test_heapq.TestHeapPython.test_merge_stability @ linux-x86_64 +test.test_heapq.TestHeapPython.test_naive_nbest @ linux-x86_64 +test.test_heapq.TestHeapPython.test_nbest @ linux-x86_64 +test.test_heapq.TestHeapPython.test_nbest_with_pushpop @ linux-x86_64 +test.test_heapq.TestHeapPython.test_nlargest @ linux-x86_64 +test.test_heapq.TestHeapPython.test_nsmallest @ linux-x86_64 +test.test_heapq.TestHeapPython.test_push_pop @ linux-x86_64 +test.test_heapq.TestModules.test_py_functions @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_hmac.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_hmac.txt new file mode 100644 index 0000000000..b08a530204 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_hmac.txt @@ -0,0 +1,26 @@ +test.test_hmac.CompareDigestTestCase.test_hmac_compare_digest @ linux-x86_64 +test.test_hmac.CompareDigestTestCase.test_openssl_compare_digest @ linux-x86_64 +test.test_hmac.ConstructorTestCase.test_dot_new_with_str_key @ linux-x86_64 +test.test_hmac.ConstructorTestCase.test_internal_types @ linux-x86_64 +test.test_hmac.ConstructorTestCase.test_normal @ linux-x86_64 +test.test_hmac.ConstructorTestCase.test_with_bytearray @ linux-x86_64 +test.test_hmac.ConstructorTestCase.test_with_memoryview_msg @ linux-x86_64 +test.test_hmac.ConstructorTestCase.test_with_sha256_module @ linux-x86_64 +test.test_hmac.ConstructorTestCase.test_with_str_key @ linux-x86_64 +test.test_hmac.ConstructorTestCase.test_withmodule @ linux-x86_64 +test.test_hmac.ConstructorTestCase.test_withtext @ linux-x86_64 +test.test_hmac.CopyTestCase.test_attributes_old @ linux-x86_64 +test.test_hmac.CopyTestCase.test_equality @ linux-x86_64 +test.test_hmac.CopyTestCase.test_equality_new @ linux-x86_64 +test.test_hmac.CopyTestCase.test_realcopy_hmac @ linux-x86_64 +test.test_hmac.CopyTestCase.test_realcopy_old @ linux-x86_64 +test.test_hmac.SanityTestCase.test_exercise_all_methods @ linux-x86_64 +test.test_hmac.TestVectorsTestCase.test_legacy_block_size_warnings @ linux-x86_64 +test.test_hmac.TestVectorsTestCase.test_md5_vectors @ linux-x86_64 +test.test_hmac.TestVectorsTestCase.test_sha224_rfc4231 @ linux-x86_64 +test.test_hmac.TestVectorsTestCase.test_sha256_rfc4231 @ linux-x86_64 +test.test_hmac.TestVectorsTestCase.test_sha384_rfc4231 @ linux-x86_64 +test.test_hmac.TestVectorsTestCase.test_sha512_rfc4231 @ linux-x86_64 +test.test_hmac.TestVectorsTestCase.test_sha_vectors @ linux-x86_64 +test.test_hmac.TestVectorsTestCase.test_with_digestmod_no_default @ linux-x86_64 +test.test_hmac.TestVectorsTestCase.test_with_fallback @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_html.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_html.txt new file mode 100644 index 0000000000..965d834712 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_html.txt @@ -0,0 +1,2 @@ +test.test_html.HtmlTests.test_escape @ linux-x86_64 +test.test_html.HtmlTests.test_unescape @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_htmlparser.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_htmlparser.txt new file mode 100644 index 0000000000..ce4295f5bb --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_htmlparser.txt @@ -0,0 +1,46 @@ +test.test_htmlparser.AttributesTestCase.test_adjacent_attributes @ linux-x86_64 +test.test_htmlparser.AttributesTestCase.test_attr_entity_replacement @ linux-x86_64 +test.test_htmlparser.AttributesTestCase.test_attr_funky_names @ linux-x86_64 +test.test_htmlparser.AttributesTestCase.test_attr_funky_names2 @ linux-x86_64 +test.test_htmlparser.AttributesTestCase.test_attr_nonascii @ linux-x86_64 +test.test_htmlparser.AttributesTestCase.test_attr_syntax @ linux-x86_64 +test.test_htmlparser.AttributesTestCase.test_attr_values @ linux-x86_64 +test.test_htmlparser.AttributesTestCase.test_comma_between_attributes @ linux-x86_64 +test.test_htmlparser.AttributesTestCase.test_end_tag_in_attribute_value @ linux-x86_64 +test.test_htmlparser.AttributesTestCase.test_entities_in_attribute_value @ linux-x86_64 +test.test_htmlparser.AttributesTestCase.test_entityrefs_in_attributes @ linux-x86_64 +test.test_htmlparser.AttributesTestCase.test_javascript_attribute_value @ linux-x86_64 +test.test_htmlparser.AttributesTestCase.test_malformed_adjacent_attributes @ linux-x86_64 +test.test_htmlparser.AttributesTestCase.test_malformed_attributes @ linux-x86_64 +test.test_htmlparser.AttributesTestCase.test_missing_attribute_value @ linux-x86_64 +test.test_htmlparser.AttributesTestCase.test_weird_chars_in_unquoted_attribute_values @ linux-x86_64 +test.test_htmlparser.AttributesTestCase.test_with_unquoted_attributes @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_EOF_in_charref @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_bad_nesting @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_bare_ampersands @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_bare_pointy_brackets @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_broken_comments @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_broken_condcoms @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_broken_invalid_end_tag @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_buffer_artefacts @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_cdata_content @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_cdata_with_closing_tags @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_comments @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_condcoms @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_convert_charrefs @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_convert_charrefs_dropped_text @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_correct_detection_of_start_tags @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_declaration_junk_chars @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_get_starttag_text @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_illegal_declarations @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_invalid_end_tags @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_malformatted_charref @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_processing_instruction_only @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_simple_html @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_slashes_in_starttag @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_startendtag @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_starttag_end_boundary @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_starttag_junk_chars @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_tolerant_parsing @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_unclosed_entityref @ linux-x86_64 +test.test_htmlparser.HTMLParserTestCase.test_valid_doctypes @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_http_cookiejar.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_http_cookiejar.txt new file mode 100644 index 0000000000..7a783ce34a --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_http_cookiejar.txt @@ -0,0 +1,77 @@ +test.test_http_cookiejar.CookieTests.test_Cookie_iterator @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_bad_cookie_header @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_custom_secure_protocols @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_default_path @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_default_path_with_query @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_domain_allow @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_domain_block @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_domain_match @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_domain_mirror @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_domain_return_ok @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_escape_path @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_evil_local_domain @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_evil_local_domain_2 @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_evil_nonlocal_domain @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_expires @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_is_HDN @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_localhost_domain @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_localhost_domain_contents @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_localhost_domain_contents_2 @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_missing_final_slash @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_missing_value @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_no_return_comment @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_ns_parser @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_ns_parser_special_names @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_parse_ns_headers @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_path_mirror @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_path_prefix_match @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_port_mirror @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_quote_cookie_value @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_reach @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_request_host @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_request_path @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_request_port @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_rfc2109_handling @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_secure @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_secure_block @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_strict_domain @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_two_component_domain_ns @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_two_component_domain_rfc2965 @ linux-x86_64 +test.test_http_cookiejar.CookieTests.test_wrong_domain @ linux-x86_64 +test.test_http_cookiejar.DateTimeTests.test_http2time @ linux-x86_64 +test.test_http_cookiejar.DateTimeTests.test_http2time_formats @ linux-x86_64 +test.test_http_cookiejar.DateTimeTests.test_http2time_garbage @ linux-x86_64 +test.test_http_cookiejar.DateTimeTests.test_http2time_redos_regression_actually_completes @ linux-x86_64 +test.test_http_cookiejar.DateTimeTests.test_iso2time @ linux-x86_64 +test.test_http_cookiejar.DateTimeTests.test_iso2time_formats @ linux-x86_64 +test.test_http_cookiejar.DateTimeTests.test_iso2time_garbage @ linux-x86_64 +test.test_http_cookiejar.DateTimeTests.test_iso2time_performance_regression @ linux-x86_64 +test.test_http_cookiejar.DateTimeTests.test_time2isoz @ linux-x86_64 +test.test_http_cookiejar.DateTimeTests.test_time2netscape @ linux-x86_64 +test.test_http_cookiejar.FileCookieJarTests.test_bad_magic @ linux-x86_64 +test.test_http_cookiejar.FileCookieJarTests.test_constructor_with_none @ linux-x86_64 +test.test_http_cookiejar.FileCookieJarTests.test_constructor_with_other_types @ linux-x86_64 +test.test_http_cookiejar.FileCookieJarTests.test_constructor_with_path_like @ linux-x86_64 +test.test_http_cookiejar.FileCookieJarTests.test_constructor_with_str @ linux-x86_64 +test.test_http_cookiejar.FileCookieJarTests.test_cookie_files_are_truncated @ linux-x86_64 +test.test_http_cookiejar.FileCookieJarTests.test_lwp_filepermissions @ linux-x86_64 +test.test_http_cookiejar.FileCookieJarTests.test_lwp_valueless_cookie @ linux-x86_64 +test.test_http_cookiejar.FileCookieJarTests.test_mozilla_filepermissions @ linux-x86_64 +test.test_http_cookiejar.HeaderTests.test_join_header_words @ linux-x86_64 +test.test_http_cookiejar.HeaderTests.test_parse_ns_headers @ linux-x86_64 +test.test_http_cookiejar.HeaderTests.test_parse_ns_headers_special_names @ linux-x86_64 +test.test_http_cookiejar.HeaderTests.test_parse_ns_headers_version @ linux-x86_64 +test.test_http_cookiejar.HeaderTests.test_roundtrip @ linux-x86_64 +test.test_http_cookiejar.HeaderTests.test_split_header_words @ linux-x86_64 +test.test_http_cookiejar.LWPCookieTests.test_empty_path @ linux-x86_64 +test.test_http_cookiejar.LWPCookieTests.test_ietf_example_1 @ linux-x86_64 +test.test_http_cookiejar.LWPCookieTests.test_ietf_example_2 @ linux-x86_64 +test.test_http_cookiejar.LWPCookieTests.test_intranet_domains_2965 @ linux-x86_64 +test.test_http_cookiejar.LWPCookieTests.test_intranet_domains_ns @ linux-x86_64 +test.test_http_cookiejar.LWPCookieTests.test_mozilla @ linux-x86_64 +test.test_http_cookiejar.LWPCookieTests.test_netscape_example_1 @ linux-x86_64 +test.test_http_cookiejar.LWPCookieTests.test_netscape_example_2 @ linux-x86_64 +test.test_http_cookiejar.LWPCookieTests.test_netscape_misc @ linux-x86_64 +test.test_http_cookiejar.LWPCookieTests.test_rejection @ linux-x86_64 +test.test_http_cookiejar.LWPCookieTests.test_session_cookies @ linux-x86_64 +test.test_http_cookiejar.LWPCookieTests.test_url_encoding @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_http_cookies.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_http_cookies.txt new file mode 100644 index 0000000000..8ae953096f --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_http_cookies.txt @@ -0,0 +1,27 @@ +DocTestCase.http.cookies @ linux-x86_64 +test.test_http_cookies.CookieTests.test_basic @ linux-x86_64 +test.test_http_cookies.CookieTests.test_comment_quoting @ linux-x86_64 +test.test_http_cookies.CookieTests.test_extended_encode @ linux-x86_64 +test.test_http_cookies.CookieTests.test_extra_spaces @ linux-x86_64 +test.test_http_cookies.CookieTests.test_illegal_chars @ linux-x86_64 +test.test_http_cookies.CookieTests.test_invalid_cookies @ linux-x86_64 +test.test_http_cookies.CookieTests.test_load @ linux-x86_64 +test.test_http_cookies.CookieTests.test_pickle @ linux-x86_64 +test.test_http_cookies.CookieTests.test_quoted_meta @ linux-x86_64 +test.test_http_cookies.CookieTests.test_samesite_attrs @ linux-x86_64 +test.test_http_cookies.CookieTests.test_secure_httponly_false_if_not_present @ linux-x86_64 +test.test_http_cookies.CookieTests.test_secure_httponly_true_if_have_value @ linux-x86_64 +test.test_http_cookies.CookieTests.test_secure_httponly_true_if_present @ linux-x86_64 +test.test_http_cookies.CookieTests.test_set_secure_httponly_attrs @ linux-x86_64 +test.test_http_cookies.CookieTests.test_special_attrs @ linux-x86_64 +test.test_http_cookies.MorselTests.test_copy @ linux-x86_64 +test.test_http_cookies.MorselTests.test_defaults @ linux-x86_64 +test.test_http_cookies.MorselTests.test_eq @ linux-x86_64 +test.test_http_cookies.MorselTests.test_pickle @ linux-x86_64 +test.test_http_cookies.MorselTests.test_repr @ linux-x86_64 +test.test_http_cookies.MorselTests.test_reserved_keys @ linux-x86_64 +test.test_http_cookies.MorselTests.test_set_properties @ linux-x86_64 +test.test_http_cookies.MorselTests.test_setdefault @ linux-x86_64 +test.test_http_cookies.MorselTests.test_setitem @ linux-x86_64 +test.test_http_cookies.MorselTests.test_setter @ linux-x86_64 +test.test_http_cookies.MorselTests.test_update @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_httplib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_httplib.txt new file mode 100644 index 0000000000..85b1040c95 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_httplib.txt @@ -0,0 +1,111 @@ +test.test_httplib.BasicTest.test_bad_status_repr @ linux-x86_64 +test.test_httplib.BasicTest.test_blocksize_request @ linux-x86_64 +test.test_httplib.BasicTest.test_blocksize_send @ linux-x86_64 +test.test_httplib.BasicTest.test_chunked @ linux-x86_64 +test.test_httplib.BasicTest.test_chunked_extension @ linux-x86_64 +test.test_httplib.BasicTest.test_chunked_head @ linux-x86_64 +test.test_httplib.BasicTest.test_chunked_missing_end @ linux-x86_64 +test.test_httplib.BasicTest.test_chunked_sync @ linux-x86_64 +test.test_httplib.BasicTest.test_chunked_trailers @ linux-x86_64 +test.test_httplib.BasicTest.test_content_length_sync @ linux-x86_64 +test.test_httplib.BasicTest.test_dir_with_added_behavior_on_status @ linux-x86_64 +test.test_httplib.BasicTest.test_early_eof @ linux-x86_64 +test.test_httplib.BasicTest.test_epipe @ linux-x86_64 +test.test_httplib.BasicTest.test_error_leak @ linux-x86_64 +test.test_httplib.BasicTest.test_host_port @ linux-x86_64 +test.test_httplib.BasicTest.test_incomplete_read @ linux-x86_64 +test.test_httplib.BasicTest.test_mixed_reads @ linux-x86_64 +test.test_httplib.BasicTest.test_negative_content_length @ linux-x86_64 +test.test_httplib.BasicTest.test_overflowing_chunked_line @ linux-x86_64 +test.test_httplib.BasicTest.test_overflowing_header_limit_after_100 @ linux-x86_64 +test.test_httplib.BasicTest.test_overflowing_header_line @ linux-x86_64 +test.test_httplib.BasicTest.test_overflowing_status_line @ linux-x86_64 +test.test_httplib.BasicTest.test_partial_readintos @ linux-x86_64 +test.test_httplib.BasicTest.test_partial_readintos_incomplete_body @ linux-x86_64 +test.test_httplib.BasicTest.test_partial_readintos_no_content_length @ linux-x86_64 +test.test_httplib.BasicTest.test_partial_readintos_past_end @ linux-x86_64 +test.test_httplib.BasicTest.test_partial_reads @ linux-x86_64 +test.test_httplib.BasicTest.test_partial_reads_incomplete_body @ linux-x86_64 +test.test_httplib.BasicTest.test_partial_reads_no_content_length @ linux-x86_64 +test.test_httplib.BasicTest.test_partial_reads_past_end @ linux-x86_64 +test.test_httplib.BasicTest.test_putrequest_override_domain_validation @ linux-x86_64 +test.test_httplib.BasicTest.test_putrequest_override_encoding @ linux-x86_64 +test.test_httplib.BasicTest.test_putrequest_override_host_validation @ linux-x86_64 +test.test_httplib.BasicTest.test_read1_bound_content_length @ linux-x86_64 +test.test_httplib.BasicTest.test_read1_content_length @ linux-x86_64 +test.test_httplib.BasicTest.test_read_head @ linux-x86_64 +test.test_httplib.BasicTest.test_readinto_chunked @ linux-x86_64 +test.test_httplib.BasicTest.test_readinto_chunked_head @ linux-x86_64 +test.test_httplib.BasicTest.test_readinto_head @ linux-x86_64 +test.test_httplib.BasicTest.test_readline_bound_content_length @ linux-x86_64 +test.test_httplib.BasicTest.test_readlines_content_length @ linux-x86_64 +test.test_httplib.BasicTest.test_response_fileno @ linux-x86_64 +test.test_httplib.BasicTest.test_response_headers @ linux-x86_64 +test.test_httplib.BasicTest.test_send @ linux-x86_64 +test.test_httplib.BasicTest.test_send_file @ linux-x86_64 +test.test_httplib.BasicTest.test_send_iter @ linux-x86_64 +test.test_httplib.BasicTest.test_send_type_error @ linux-x86_64 +test.test_httplib.BasicTest.test_send_updating_file @ linux-x86_64 +test.test_httplib.BasicTest.test_simple_httpstatus @ linux-x86_64 +test.test_httplib.BasicTest.test_status_lines @ linux-x86_64 +test.test_httplib.BasicTest.test_too_many_headers @ linux-x86_64 +test.test_httplib.ExtendedReadTest.test_peek @ linux-x86_64 +test.test_httplib.ExtendedReadTest.test_peek_0 @ linux-x86_64 +test.test_httplib.ExtendedReadTest.test_read1 @ linux-x86_64 +test.test_httplib.ExtendedReadTest.test_read1_0 @ linux-x86_64 +test.test_httplib.ExtendedReadTest.test_read1_bounded @ linux-x86_64 +test.test_httplib.ExtendedReadTest.test_read1_unbounded @ linux-x86_64 +test.test_httplib.ExtendedReadTest.test_readline @ linux-x86_64 +test.test_httplib.ExtendedReadTestChunked.test_peek @ linux-x86_64 +test.test_httplib.ExtendedReadTestChunked.test_peek_0 @ linux-x86_64 +test.test_httplib.ExtendedReadTestChunked.test_read1 @ linux-x86_64 +test.test_httplib.ExtendedReadTestChunked.test_read1_0 @ linux-x86_64 +test.test_httplib.ExtendedReadTestChunked.test_read1_bounded @ linux-x86_64 +test.test_httplib.ExtendedReadTestChunked.test_read1_unbounded @ linux-x86_64 +test.test_httplib.ExtendedReadTestChunked.test_readline @ linux-x86_64 +test.test_httplib.HTTPResponseTest.test_getting_header @ linux-x86_64 +test.test_httplib.HTTPResponseTest.test_getting_header_defaultint @ linux-x86_64 +test.test_httplib.HTTPResponseTest.test_getting_nonexistent_header_with_iterable_default @ linux-x86_64 +test.test_httplib.HTTPResponseTest.test_getting_nonexistent_header_with_string_default @ linux-x86_64 +test.test_httplib.HTTPResponseTest.test_getting_nonexistent_header_without_default @ linux-x86_64 +test.test_httplib.HTTPSTest.test_attributes @ linux-x86_64 +test.test_httplib.HTTPSTest.test_host_port @ linux-x86_64 +test.test_httplib.HTTPSTest.test_local_bad_hostname @ linux-x86_64 +test.test_httplib.HTTPSTest.test_local_good_hostname @ linux-x86_64 +test.test_httplib.HTTPSTest.test_local_unknown_cert @ linux-x86_64 +test.test_httplib.HeaderTests.test_auto_headers @ linux-x86_64 +test.test_httplib.HeaderTests.test_content_length_0 @ linux-x86_64 +test.test_httplib.HeaderTests.test_headers_debuglevel @ linux-x86_64 +test.test_httplib.HeaderTests.test_invalid_headers @ linux-x86_64 +test.test_httplib.HeaderTests.test_ipv6host_header @ linux-x86_64 +test.test_httplib.HeaderTests.test_malformed_headers_coped_with @ linux-x86_64 +test.test_httplib.HeaderTests.test_parse_all_octets @ linux-x86_64 +test.test_httplib.HeaderTests.test_putheader @ linux-x86_64 +test.test_httplib.HttpMethodTests.test_invalid_method_names @ linux-x86_64 +test.test_httplib.OfflineTest.test_all @ linux-x86_64 +test.test_httplib.OfflineTest.test_client_constants @ linux-x86_64 +test.test_httplib.OfflineTest.test_responses @ linux-x86_64 +test.test_httplib.PersistenceTest.test_100_close @ linux-x86_64 +test.test_httplib.PersistenceTest.test_disconnected @ linux-x86_64 +test.test_httplib.PersistenceTest.test_reuse_reconnect @ linux-x86_64 +test.test_httplib.RequestBodyTest.test_ascii_body @ linux-x86_64 +test.test_httplib.RequestBodyTest.test_binary_file_body @ linux-x86_64 +test.test_httplib.RequestBodyTest.test_bytes_body @ linux-x86_64 +test.test_httplib.RequestBodyTest.test_latin1_body @ linux-x86_64 +test.test_httplib.RequestBodyTest.test_list_body @ linux-x86_64 +test.test_httplib.RequestBodyTest.test_manual_content_length @ linux-x86_64 +test.test_httplib.RequestBodyTest.test_text_file_body @ linux-x86_64 +test.test_httplib.SourceAddressTest.testHTTPConnectionSourceAddress @ linux-x86_64 +test.test_httplib.SourceAddressTest.testHTTPSConnectionSourceAddress @ linux-x86_64 +test.test_httplib.TimeoutTest.testTimeoutAttribute @ linux-x86_64 +test.test_httplib.TransferEncodingTest.test_empty_body @ linux-x86_64 +test.test_httplib.TransferEncodingTest.test_endheaders_chunked @ linux-x86_64 +test.test_httplib.TransferEncodingTest.test_explicit_headers @ linux-x86_64 +test.test_httplib.TransferEncodingTest.test_request @ linux-x86_64 +test.test_httplib.TunnelTests.test_connect_put_request @ linux-x86_64 +test.test_httplib.TunnelTests.test_connect_with_tunnel @ linux-x86_64 +test.test_httplib.TunnelTests.test_disallow_set_tunnel_after_connect @ linux-x86_64 +test.test_httplib.TunnelTests.test_set_tunnel_host_port_headers @ linux-x86_64 +test.test_httplib.TunnelTests.test_tunnel_connect_single_send_connection_setup @ linux-x86_64 +test.test_httplib.TunnelTests.test_tunnel_debuglog @ linux-x86_64 +test.test_httplib.TunnelTests.test_tunnel_leak @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_httpservers.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_httpservers.txt new file mode 100644 index 0000000000..291d42ff2a --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_httpservers.txt @@ -0,0 +1,74 @@ +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_close_connection @ linux-x86_64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_date_time_string @ linux-x86_64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_extra_space @ linux-x86_64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_error @ linux-x86_64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_header @ linux-x86_64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_response_only @ linux-x86_64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_header_length @ linux-x86_64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue @ linux-x86_64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_html_escape_on_error @ linux-x86_64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_http_0_9 @ linux-x86_64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_http_1_0 @ linux-x86_64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_http_1_1 @ linux-x86_64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_request_length @ linux-x86_64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_too_many_headers @ linux-x86_64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_unprintable_not_logged @ linux-x86_64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_with_continue_1_0 @ linux-x86_64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_with_continue_1_1 @ linux-x86_64 +test.test_httpservers.BaseHTTPRequestHandlerTestCase.test_with_continue_rejected @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_command @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_error_content_length @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_handler @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_head_via_send_error @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_header_close @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_header_keep_alive @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_internal_key_error @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_latin1_header @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_major_version_number_too_long @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_minor_version_number_too_long @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_request_line_trimming @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_return_custom_status @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_return_explain_error @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_return_header_keep_alive @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_send_blank @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_send_error @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_version_bogus @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_version_digits @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_version_invalid @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_version_none @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_version_none_get @ linux-x86_64 +test.test_httpservers.BaseHTTPServerTestCase.test_version_signs_and_underscores @ linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_accept @ linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_authorization @ linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_cgi_path_in_sub_directories @ linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_headers_and_content @ linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_invaliduri @ linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_issue19435 @ linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_nested_cgi_path_issue21323 @ linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_no_leading_slash @ linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_os_environ_is_not_altered @ linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_post @ linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_query_with_continuous_slashes @ linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_query_with_multiple_question_mark @ linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_url_collapse_path @ linux-x86_64 +test.test_httpservers.CGIHTTPServerTestCase.test_urlquote_decoding_in_cgi_check @ linux-x86_64 +test.test_httpservers.MiscTestCase.test_all @ linux-x86_64 +test.test_httpservers.RequestHandlerLoggingTestCase.test_err @ linux-x86_64 +test.test_httpservers.ScriptTestCase.test_server_test_ipv4 @ linux-x86_64 +test.test_httpservers.ScriptTestCase.test_server_test_ipv6 @ linux-x86_64 +test.test_httpservers.ScriptTestCase.test_server_test_localhost @ linux-x86_64 +test.test_httpservers.ScriptTestCase.test_server_test_unspec @ linux-x86_64 +test.test_httpservers.SimpleHTTPRequestHandlerTestCase.test_query_arguments @ linux-x86_64 +test.test_httpservers.SimpleHTTPRequestHandlerTestCase.test_start_with_double_slash @ linux-x86_64 +test.test_httpservers.SimpleHTTPRequestHandlerTestCase.test_windows_colon @ linux-x86_64 +test.test_httpservers.SimpleHTTPServerTestCase.test_browser_cache @ linux-x86_64 +test.test_httpservers.SimpleHTTPServerTestCase.test_browser_cache_file_changed @ linux-x86_64 +test.test_httpservers.SimpleHTTPServerTestCase.test_browser_cache_with_If_None_Match_header @ linux-x86_64 +test.test_httpservers.SimpleHTTPServerTestCase.test_get @ linux-x86_64 +test.test_httpservers.SimpleHTTPServerTestCase.test_get_dir_redirect_location_domain_injection_bug @ linux-x86_64 +test.test_httpservers.SimpleHTTPServerTestCase.test_head @ linux-x86_64 +test.test_httpservers.SimpleHTTPServerTestCase.test_html_escape_filename @ linux-x86_64 +test.test_httpservers.SimpleHTTPServerTestCase.test_invalid_requests @ linux-x86_64 +test.test_httpservers.SimpleHTTPServerTestCase.test_last_modified @ linux-x86_64 +test.test_httpservers.SimpleHTTPServerTestCase.test_path_without_leading_slash @ linux-x86_64 +test.test_httpservers.SimpleHTTPServerTestCase.test_undecodable_parameter @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_imaplib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_imaplib.txt new file mode 100644 index 0000000000..93471d4ee8 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_imaplib.txt @@ -0,0 +1,87 @@ +test.test_imaplib.NewIMAPSSLTests.test_EOF_without_complete_welcome_message @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_aborted_authentication @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_bad_auth_name @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_enable_UTF8_True_append @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_enable_UTF8_raises_error_if_not_supported @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_enable_raises_error_if_no_capability @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_enable_raises_error_if_not_AUTH @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_imaplib_timeout_functionality_test @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_invalid_authentication @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_line_termination @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_linetoolong @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_login @ linux-x86_64 +!test.test_imaplib.NewIMAPSSLTests.test_login_cram_md5_bytes @ linux-x86_64 +!test.test_imaplib.NewIMAPSSLTests.test_login_cram_md5_plain_text @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_logout @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_lsub @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_search_disallows_charset_in_utf8_mode @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_simple_with_statement @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_ssl_verified @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_unselect @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_valid_authentication_bytes @ linux-x86_64 +!test.test_imaplib.NewIMAPSSLTests.test_valid_authentication_plain_text @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_with_statement @ linux-x86_64 +test.test_imaplib.NewIMAPSSLTests.test_with_statement_logout @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_EOF_without_complete_welcome_message @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_aborted_authentication @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_bad_auth_name @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_enable_UTF8_True_append @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_enable_UTF8_raises_error_if_not_supported @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_enable_raises_error_if_no_capability @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_enable_raises_error_if_not_AUTH @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_imaplib_timeout_functionality_test @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_invalid_authentication @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_line_termination @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_linetoolong @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_login @ linux-x86_64 +!test.test_imaplib.NewIMAPTests.test_login_cram_md5_bytes @ linux-x86_64 +!test.test_imaplib.NewIMAPTests.test_login_cram_md5_plain_text @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_logout @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_lsub @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_search_disallows_charset_in_utf8_mode @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_simple_with_statement @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_unselect @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_valid_authentication_bytes @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_valid_authentication_plain_text @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_with_statement @ linux-x86_64 +test.test_imaplib.NewIMAPTests.test_with_statement_logout @ linux-x86_64 +test.test_imaplib.TestImaplib.test_Internaldate2tuple @ linux-x86_64 +test.test_imaplib.TestImaplib.test_Internaldate2tuple_issue10941 @ linux-x86_64 +test.test_imaplib.TestImaplib.test_imap4_host_default_value @ linux-x86_64 +test.test_imaplib.TestImaplib.test_that_Time2Internaldate_returns_a_result @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_aborted_authentication @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_bad_auth_name @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_bracket_flags @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_connect @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_enable_UTF8_True_append @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_enable_UTF8_raises_error_if_not_supported @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_enable_raises_error_if_no_capability @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_enable_raises_error_if_not_AUTH @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_invalid_authentication @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_issue5949 @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_line_termination @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_linetoolong @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_login_cram_md5 @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_search_disallows_charset_in_utf8_mode @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_simple_with_statement @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_valid_authentication @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_with_statement @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTests.test_with_statement_logout @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_aborted_authentication @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_bad_auth_name @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_bracket_flags @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_connect @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_enable_UTF8_True_append @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_enable_UTF8_raises_error_if_not_supported @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_enable_raises_error_if_no_capability @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_enable_raises_error_if_not_AUTH @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_invalid_authentication @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_issue5949 @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_line_termination @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_linetoolong @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_login_cram_md5 @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_search_disallows_charset_in_utf8_mode @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_simple_with_statement @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_valid_authentication @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_with_statement @ linux-x86_64 +test.test_imaplib.ThreadedNetworkedTestsSSL.test_with_statement_logout @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_imghdr.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_imghdr.txt new file mode 100644 index 0000000000..97068cb373 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_imghdr.txt @@ -0,0 +1,11 @@ +test.test_imghdr.TestImghdr.test_bad_args @ linux-x86_64 +test.test_imghdr.TestImghdr.test_closed_file @ linux-x86_64 +test.test_imghdr.TestImghdr.test_data @ linux-x86_64 +test.test_imghdr.TestImghdr.test_file_pos @ linux-x86_64 +test.test_imghdr.TestImghdr.test_invalid_headers @ linux-x86_64 +test.test_imghdr.TestImghdr.test_missing_file @ linux-x86_64 +test.test_imghdr.TestImghdr.test_output_stream @ linux-x86_64 +test.test_imghdr.TestImghdr.test_pathlike_filename @ linux-x86_64 +test.test_imghdr.TestImghdr.test_register_test @ linux-x86_64 +test.test_imghdr.TestImghdr.test_string_data @ linux-x86_64 +test.test_imghdr.TestImghdr.test_unseekable @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_imp.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_imp.txt new file mode 100644 index 0000000000..49e7590894 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_imp.txt @@ -0,0 +1,18 @@ +test.test_imp.ImportTests.test_bug7732 @ linux-x86_64 +test.test_imp.ImportTests.test_find_and_load_checked_pyc @ linux-x86_64 +test.test_imp.ImportTests.test_find_module_encoding @ linux-x86_64 +test.test_imp.ImportTests.test_import_encoded_module @ linux-x86_64 +test.test_imp.ImportTests.test_issue1267 @ linux-x86_64 +test.test_imp.ImportTests.test_issue3594 @ linux-x86_64 +test.test_imp.ImportTests.test_issue5604 @ linux-x86_64 +test.test_imp.ImportTests.test_issue9319 @ linux-x86_64 +test.test_imp.ImportTests.test_issue_35321 @ linux-x86_64 +test.test_imp.ImportTests.test_load_source @ linux-x86_64 +test.test_imp.ImportTests.test_multiple_calls_to_get_data @ linux-x86_64 +test.test_imp.ImportTests.test_pyc_invalidation_mode_from_cmdline @ linux-x86_64 +test.test_imp.PEP3147Tests.test_cache_from_source @ linux-x86_64 +test.test_imp.PEP3147Tests.test_source_from_cache @ linux-x86_64 +test.test_imp.ReloadTests.test_builtin @ linux-x86_64 +test.test_imp.ReloadTests.test_extension @ linux-x86_64 +test.test_imp.ReloadTests.test_source @ linux-x86_64 +test.test_imp.ReloadTests.test_with_deleted_parent @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_import.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_import.txt new file mode 100644 index 0000000000..66ccc2507c --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_import.txt @@ -0,0 +1,66 @@ +test.test_import.CircularImportTests.test_binding @ linux-x86_64 +test.test_import.CircularImportTests.test_circular_from_import @ linux-x86_64 +test.test_import.CircularImportTests.test_crossreference1 @ linux-x86_64 +test.test_import.CircularImportTests.test_crossreference2 @ linux-x86_64 +test.test_import.CircularImportTests.test_direct @ linux-x86_64 +test.test_import.CircularImportTests.test_indirect @ linux-x86_64 +test.test_import.CircularImportTests.test_rebinding @ linux-x86_64 +test.test_import.CircularImportTests.test_subpackage @ linux-x86_64 +test.test_import.CircularImportTests.test_unwritable_module @ linux-x86_64 +test.test_import.FilePermissionTests.test_cached_mode_issue_2051 @ linux-x86_64 +test.test_import.FilePermissionTests.test_cached_readonly @ linux-x86_64 +test.test_import.FilePermissionTests.test_creation_mode @ linux-x86_64 +test.test_import.FilePermissionTests.test_pyc_always_writable @ linux-x86_64 +test.test_import.ImportTests.test_bogus_fromlist @ linux-x86_64 +test.test_import.ImportTests.test_case_sensitivity @ linux-x86_64 +!test.test_import.ImportTests.test_concurrency @ linux-x86_64 +test.test_import.ImportTests.test_double_const @ linux-x86_64 +test.test_import.ImportTests.test_failing_import_sticks @ linux-x86_64 +test.test_import.ImportTests.test_failing_reload @ linux-x86_64 +test.test_import.ImportTests.test_file_to_source @ linux-x86_64 +test.test_import.ImportTests.test_from_import_AttributeError @ linux-x86_64 +test.test_import.ImportTests.test_from_import_message_for_existing_module @ linux-x86_64 +test.test_import.ImportTests.test_from_import_message_for_nonexistent_module @ linux-x86_64 +test.test_import.ImportTests.test_from_import_missing_attr_has_name @ linux-x86_64 +test.test_import.ImportTests.test_from_import_missing_attr_has_name_and_path @ linux-x86_64 +test.test_import.ImportTests.test_from_import_missing_attr_path_is_canonical @ linux-x86_64 +test.test_import.ImportTests.test_from_import_missing_attr_raises_ImportError @ linux-x86_64 +test.test_import.ImportTests.test_from_import_missing_module_raises_ModuleNotFoundError @ linux-x86_64 +test.test_import.ImportTests.test_from_import_star_invalid_type @ linux-x86_64 +test.test_import.ImportTests.test_import @ linux-x86_64 +test.test_import.ImportTests.test_import_by_filename @ linux-x86_64 +test.test_import.ImportTests.test_import_in_del_does_not_crash @ linux-x86_64 +test.test_import.ImportTests.test_import_name_binding @ linux-x86_64 +test.test_import.ImportTests.test_import_raises_ModuleNotFoundError @ linux-x86_64 +test.test_import.ImportTests.test_issue31286 @ linux-x86_64 +test.test_import.ImportTests.test_module_with_large_stack @ linux-x86_64 +test.test_import.ImportTests.test_timestamp_overflow @ linux-x86_64 +test.test_import.ImportTracebackTests.test_broken_from @ linux-x86_64 +test.test_import.ImportTracebackTests.test_broken_parent @ linux-x86_64 +test.test_import.ImportTracebackTests.test_broken_parent_from @ linux-x86_64 +test.test_import.ImportTracebackTests.test_broken_submodule @ linux-x86_64 +test.test_import.ImportTracebackTests.test_exec_failure @ linux-x86_64 +test.test_import.ImportTracebackTests.test_exec_failure_nested @ linux-x86_64 +test.test_import.ImportTracebackTests.test_nonexistent_module @ linux-x86_64 +test.test_import.ImportTracebackTests.test_nonexistent_module_nested @ linux-x86_64 +test.test_import.ImportTracebackTests.test_syntax_error @ linux-x86_64 +test.test_import.OverridingImportBuiltinTests.test_override_builtin @ linux-x86_64 +test.test_import.PathsTests.test_trailing_slash @ linux-x86_64 +test.test_import.PycRewritingTests.test_basics @ linux-x86_64 +test.test_import.PycRewritingTests.test_module_without_source @ linux-x86_64 +test.test_import.PycacheTests.test___cached__ @ linux-x86_64 +test.test_import.PycacheTests.test___cached___legacy_pyc @ linux-x86_64 +test.test_import.PycacheTests.test_import_pyc_path @ linux-x86_64 +test.test_import.PycacheTests.test_missing_source @ linux-x86_64 +test.test_import.PycacheTests.test_missing_source_legacy @ linux-x86_64 +test.test_import.PycacheTests.test_package___cached__ @ linux-x86_64 +test.test_import.PycacheTests.test_package___cached___from_pyc @ linux-x86_64 +test.test_import.PycacheTests.test_recompute_pyc_same_second @ linux-x86_64 +test.test_import.PycacheTests.test_unwritable_directory @ linux-x86_64 +test.test_import.RelativeImportTests.test_absolute_import_without_future @ linux-x86_64 +test.test_import.RelativeImportTests.test_import_from_non_package @ linux-x86_64 +test.test_import.RelativeImportTests.test_import_from_unloaded_package @ linux-x86_64 +test.test_import.RelativeImportTests.test_issue3221 @ linux-x86_64 +test.test_import.RelativeImportTests.test_parentless_import_shadowed_by_global @ linux-x86_64 +test.test_import.RelativeImportTests.test_relimport_star @ linux-x86_64 +test.test_import.TestSymbolicallyLinkedPackage.test_symlinked_dir_importable @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_importlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_importlib.txt new file mode 100644 index 0000000000..f26069aba6 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_importlib.txt @@ -0,0 +1,1405 @@ +test.test_importlib.builtin.test_finder.Frozen_FindSpecTests.test_failure @ linux-x86_64 +test.test_importlib.builtin.test_finder.Frozen_FindSpecTests.test_module @ linux-x86_64 +test.test_importlib.builtin.test_finder.Frozen_FinderTests.test_failure @ linux-x86_64 +test.test_importlib.builtin.test_finder.Frozen_FinderTests.test_module @ linux-x86_64 +test.test_importlib.builtin.test_finder.Source_FindSpecTests.test_failure @ linux-x86_64 +test.test_importlib.builtin.test_finder.Source_FindSpecTests.test_module @ linux-x86_64 +test.test_importlib.builtin.test_finder.Source_FinderTests.test_failure @ linux-x86_64 +test.test_importlib.builtin.test_finder.Source_FinderTests.test_module @ linux-x86_64 +test.test_importlib.builtin.test_loader.Frozen_InspectLoaderTests.test_get_code @ linux-x86_64 +test.test_importlib.builtin.test_loader.Frozen_InspectLoaderTests.test_get_source @ linux-x86_64 +test.test_importlib.builtin.test_loader.Frozen_InspectLoaderTests.test_is_package @ linux-x86_64 +test.test_importlib.builtin.test_loader.Frozen_InspectLoaderTests.test_not_builtin @ linux-x86_64 +test.test_importlib.builtin.test_loader.Frozen_LoaderTests.test_already_imported @ linux-x86_64 +test.test_importlib.builtin.test_loader.Frozen_LoaderTests.test_module @ linux-x86_64 +test.test_importlib.builtin.test_loader.Frozen_LoaderTests.test_module_reuse @ linux-x86_64 +test.test_importlib.builtin.test_loader.Frozen_LoaderTests.test_unloadable @ linux-x86_64 +test.test_importlib.builtin.test_loader.Source_InspectLoaderTests.test_get_code @ linux-x86_64 +test.test_importlib.builtin.test_loader.Source_InspectLoaderTests.test_get_source @ linux-x86_64 +test.test_importlib.builtin.test_loader.Source_InspectLoaderTests.test_is_package @ linux-x86_64 +test.test_importlib.builtin.test_loader.Source_InspectLoaderTests.test_not_builtin @ linux-x86_64 +test.test_importlib.builtin.test_loader.Source_LoaderTests.test_already_imported @ linux-x86_64 +test.test_importlib.builtin.test_loader.Source_LoaderTests.test_module @ linux-x86_64 +test.test_importlib.builtin.test_loader.Source_LoaderTests.test_module_reuse @ linux-x86_64 +test.test_importlib.builtin.test_loader.Source_LoaderTests.test_unloadable @ linux-x86_64 +test.test_importlib.extension.test_finder.Frozen_FinderTests.test_failure @ linux-x86_64 +test.test_importlib.extension.test_finder.Frozen_FinderTests.test_module @ linux-x86_64 +test.test_importlib.extension.test_finder.Source_FinderTests.test_failure @ linux-x86_64 +test.test_importlib.extension.test_finder.Source_FinderTests.test_module @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_equality @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_inequality @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_is_package @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_load_module_API @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_module @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_module_reuse @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_LoaderTests.test_unloadable @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_bad_modules @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_functionality @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_load_short_name @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_load_submodule @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_load_twice @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_module @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_nonascii @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_nonmodule @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_nonmodule_with_methods @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_null_slots @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_reload @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_try_registration @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_unloadable @ linux-x86_64 +test.test_importlib.extension.test_loader.Frozen_MultiPhaseExtensionModuleTests.test_unloadable_nonascii @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_LoaderTests.test_equality @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_LoaderTests.test_inequality @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_LoaderTests.test_is_package @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_LoaderTests.test_load_module_API @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_LoaderTests.test_module @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_LoaderTests.test_module_reuse @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_LoaderTests.test_unloadable @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_bad_modules @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_functionality @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_load_short_name @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_load_submodule @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_load_twice @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_module @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_nonascii @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_nonmodule @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_nonmodule_with_methods @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_null_slots @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_reload @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_try_registration @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_unloadable @ linux-x86_64 +test.test_importlib.extension.test_loader.Source_MultiPhaseExtensionModuleTests.test_unloadable_nonascii @ linux-x86_64 +test.test_importlib.extension.test_path_hook.Frozen_PathHookTests.test_success @ linux-x86_64 +test.test_importlib.extension.test_path_hook.Source_PathHookTests.test_success @ linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_failure @ linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_module @ linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_not_using_frozen @ linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_package @ linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_path_ignored @ linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FindSpecTests.test_target_ignored @ linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FinderTests.test_failure @ linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FinderTests.test_module @ linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FinderTests.test_module_in_package @ linux-x86_64 +test.test_importlib.frozen.test_finder.Frozen_FinderTests.test_package @ linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_failure @ linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_module @ linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_not_using_frozen @ linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_package @ linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_path_ignored @ linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FindSpecTests.test_target_ignored @ linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FinderTests.test_failure @ linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FinderTests.test_module @ linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FinderTests.test_module_in_package @ linux-x86_64 +test.test_importlib.frozen.test_finder.Source_FinderTests.test_package @ linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_ExecModuleTests.test_lacking_parent @ linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_ExecModuleTests.test_module @ linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_ExecModuleTests.test_module_repr @ linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_ExecModuleTests.test_module_repr_indirect @ linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_ExecModuleTests.test_package @ linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_ExecModuleTests.test_unloadable @ linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_InspectLoaderTests.test_failure @ linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_InspectLoaderTests.test_get_code @ linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_InspectLoaderTests.test_get_source @ linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_InspectLoaderTests.test_is_package @ linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_lacking_parent @ linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_module @ linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_module_repr @ linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_module_reuse @ linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_package @ linux-x86_64 +test.test_importlib.frozen.test_loader.Frozen_LoaderTests.test_unloadable @ linux-x86_64 +test.test_importlib.frozen.test_loader.Source_ExecModuleTests.test_lacking_parent @ linux-x86_64 +test.test_importlib.frozen.test_loader.Source_ExecModuleTests.test_module @ linux-x86_64 +test.test_importlib.frozen.test_loader.Source_ExecModuleTests.test_module_repr @ linux-x86_64 +test.test_importlib.frozen.test_loader.Source_ExecModuleTests.test_module_repr_indirect @ linux-x86_64 +test.test_importlib.frozen.test_loader.Source_ExecModuleTests.test_package @ linux-x86_64 +test.test_importlib.frozen.test_loader.Source_ExecModuleTests.test_unloadable @ linux-x86_64 +test.test_importlib.frozen.test_loader.Source_InspectLoaderTests.test_failure @ linux-x86_64 +test.test_importlib.frozen.test_loader.Source_InspectLoaderTests.test_get_code @ linux-x86_64 +test.test_importlib.frozen.test_loader.Source_InspectLoaderTests.test_get_source @ linux-x86_64 +test.test_importlib.frozen.test_loader.Source_InspectLoaderTests.test_is_package @ linux-x86_64 +test.test_importlib.frozen.test_loader.Source_LoaderTests.test_lacking_parent @ linux-x86_64 +test.test_importlib.frozen.test_loader.Source_LoaderTests.test_module @ linux-x86_64 +test.test_importlib.frozen.test_loader.Source_LoaderTests.test_module_repr @ linux-x86_64 +test.test_importlib.frozen.test_loader.Source_LoaderTests.test_module_reuse @ linux-x86_64 +test.test_importlib.frozen.test_loader.Source_LoaderTests.test_package @ linux-x86_64 +test.test_importlib.frozen.test_loader.Source_LoaderTests.test_unloadable @ linux-x86_64 +test.test_importlib.import_.test___loader__.Frozen_LoaderAttributeTests.test___loader___is_None @ linux-x86_64 +test.test_importlib.import_.test___loader__.Frozen_LoaderAttributeTests.test___loader___missing @ linux-x86_64 +test.test_importlib.import_.test___loader__.Frozen_SpecLoaderAttributeTests.test___loader__ @ linux-x86_64 +test.test_importlib.import_.test___loader__.Source_LoaderAttributeTests.test___loader___is_None @ linux-x86_64 +test.test_importlib.import_.test___loader__.Source_LoaderAttributeTests.test___loader___missing @ linux-x86_64 +test.test_importlib.import_.test___loader__.Source_SpecLoaderAttributeTests.test___loader__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_None_as___package__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_bad__package__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_bunk__package__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_spec_fallback @ linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_using___name__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_using___package__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_warn_when_package_and_spec_disagree @ linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP302.test_warn_when_using___name__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_None_as___package__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_bad__package__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_bunk__package__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_spec_fallback @ linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_using___name__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_using___package__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_warn_when_package_and_spec_disagree @ linux-x86_64 +test.test_importlib.import_.test___package__.Frozen_Using__package__PEP451.test_warn_when_using___name__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Setting__package__PEP302.test_package @ linux-x86_64 +test.test_importlib.import_.test___package__.Setting__package__PEP302.test_submodule @ linux-x86_64 +test.test_importlib.import_.test___package__.Setting__package__PEP302.test_top_level @ linux-x86_64 +test.test_importlib.import_.test___package__.Setting__package__PEP451.test_package @ linux-x86_64 +test.test_importlib.import_.test___package__.Setting__package__PEP451.test_submodule @ linux-x86_64 +test.test_importlib.import_.test___package__.Setting__package__PEP451.test_top_level @ linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_None_as___package__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_bad__package__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_bunk__package__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_spec_fallback @ linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_using___name__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_using___package__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_warn_when_package_and_spec_disagree @ linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP302.test_warn_when_using___name__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_None_as___package__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_bad__package__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_bunk__package__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_spec_fallback @ linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_using___name__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_using___package__ @ linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_warn_when_package_and_spec_disagree @ linux-x86_64 +test.test_importlib.import_.test___package__.Source_Using__package__PEP451.test_warn_when_using___name__ @ linux-x86_64 +test.test_importlib.import_.test_api.Frozen_OldAPITests.test_blocked_fromlist @ linux-x86_64 +test.test_importlib.import_.test_api.Frozen_OldAPITests.test_fromlist_load_error_propagates @ linux-x86_64 +test.test_importlib.import_.test_api.Frozen_OldAPITests.test_name_requires_rparition @ linux-x86_64 +test.test_importlib.import_.test_api.Frozen_OldAPITests.test_negative_level @ linux-x86_64 +test.test_importlib.import_.test_api.Frozen_OldAPITests.test_nonexistent_fromlist_entry @ linux-x86_64 +test.test_importlib.import_.test_api.Frozen_OldAPITests.test_raises_ModuleNotFoundError @ linux-x86_64 +test.test_importlib.import_.test_api.Frozen_SpecAPITests.test_blocked_fromlist @ linux-x86_64 +test.test_importlib.import_.test_api.Frozen_SpecAPITests.test_fromlist_load_error_propagates @ linux-x86_64 +test.test_importlib.import_.test_api.Frozen_SpecAPITests.test_name_requires_rparition @ linux-x86_64 +test.test_importlib.import_.test_api.Frozen_SpecAPITests.test_negative_level @ linux-x86_64 +test.test_importlib.import_.test_api.Frozen_SpecAPITests.test_nonexistent_fromlist_entry @ linux-x86_64 +test.test_importlib.import_.test_api.Frozen_SpecAPITests.test_raises_ModuleNotFoundError @ linux-x86_64 +test.test_importlib.import_.test_api.Source_OldAPITests.test_blocked_fromlist @ linux-x86_64 +test.test_importlib.import_.test_api.Source_OldAPITests.test_fromlist_load_error_propagates @ linux-x86_64 +test.test_importlib.import_.test_api.Source_OldAPITests.test_name_requires_rparition @ linux-x86_64 +test.test_importlib.import_.test_api.Source_OldAPITests.test_negative_level @ linux-x86_64 +test.test_importlib.import_.test_api.Source_OldAPITests.test_nonexistent_fromlist_entry @ linux-x86_64 +test.test_importlib.import_.test_api.Source_OldAPITests.test_raises_ModuleNotFoundError @ linux-x86_64 +test.test_importlib.import_.test_api.Source_SpecAPITests.test_blocked_fromlist @ linux-x86_64 +test.test_importlib.import_.test_api.Source_SpecAPITests.test_fromlist_load_error_propagates @ linux-x86_64 +test.test_importlib.import_.test_api.Source_SpecAPITests.test_name_requires_rparition @ linux-x86_64 +test.test_importlib.import_.test_api.Source_SpecAPITests.test_negative_level @ linux-x86_64 +test.test_importlib.import_.test_api.Source_SpecAPITests.test_nonexistent_fromlist_entry @ linux-x86_64 +test.test_importlib.import_.test_api.Source_SpecAPITests.test_raises_ModuleNotFoundError @ linux-x86_64 +test.test_importlib.import_.test_caching.Frozen_UseCache.test_None_in_cache @ linux-x86_64 +test.test_importlib.import_.test_caching.Frozen_UseCache.test_using_cache @ linux-x86_64 +test.test_importlib.import_.test_caching.ImportlibUseCache.test_None_in_cache @ linux-x86_64 +test.test_importlib.import_.test_caching.ImportlibUseCache.test_using_cache @ linux-x86_64 +test.test_importlib.import_.test_caching.ImportlibUseCache.test_using_cache_after_loader @ linux-x86_64 +test.test_importlib.import_.test_caching.ImportlibUseCache.test_using_cache_for_assigning_to_attribute @ linux-x86_64 +test.test_importlib.import_.test_caching.ImportlibUseCache.test_using_cache_for_fromlist @ linux-x86_64 +test.test_importlib.import_.test_caching.Source_UseCache.test_None_in_cache @ linux-x86_64 +test.test_importlib.import_.test_caching.Source_UseCache.test_using_cache @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_empty_string @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_fromlist_as_tuple @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_invalid_type @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_invalid_type_in_all @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_module_from_package @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_module_from_package_triggers_ModuleNotFoundError @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_nonexistent_from_package @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_nonexistent_in_all @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_nonexistent_object @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_object @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_star_in_all @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_star_with_others @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_HandlingFromlist.test_using_star @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_ReturnValue.test_return_from_from_import @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Frozen_ReturnValue.test_return_from_import @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_empty_string @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_fromlist_as_tuple @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_invalid_type @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_invalid_type_in_all @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_module_from_package @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_module_from_package_triggers_ModuleNotFoundError @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_nonexistent_from_package @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_nonexistent_in_all @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_nonexistent_object @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_object @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_star_in_all @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_star_with_others @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_HandlingFromlist.test_using_star @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_ReturnValue.test_return_from_from_import @ linux-x86_64 +test.test_importlib.import_.test_fromlist.Source_ReturnValue.test_return_from_import @ linux-x86_64 +test.test_importlib.import_.test_meta_path.Frozen_CallSignaturePEP302.test_no_path @ linux-x86_64 +test.test_importlib.import_.test_meta_path.Frozen_CallSignaturePEP302.test_with_path @ linux-x86_64 +test.test_importlib.import_.test_meta_path.Frozen_CallSignaturePEP451.test_no_path @ linux-x86_64 +test.test_importlib.import_.test_meta_path.Frozen_CallSignaturePEP451.test_with_path @ linux-x86_64 +test.test_importlib.import_.test_meta_path.Frozen_CallingOrder.test_continuing @ linux-x86_64 +test.test_importlib.import_.test_meta_path.Frozen_CallingOrder.test_empty @ linux-x86_64 +test.test_importlib.import_.test_meta_path.Frozen_CallingOrder.test_first_called @ linux-x86_64 +test.test_importlib.import_.test_meta_path.Source_CallSignaturePEP302.test_no_path @ linux-x86_64 +test.test_importlib.import_.test_meta_path.Source_CallSignaturePEP302.test_with_path @ linux-x86_64 +test.test_importlib.import_.test_meta_path.Source_CallSignaturePEP451.test_no_path @ linux-x86_64 +test.test_importlib.import_.test_meta_path.Source_CallSignaturePEP451.test_with_path @ linux-x86_64 +test.test_importlib.import_.test_meta_path.Source_CallingOrder.test_continuing @ linux-x86_64 +test.test_importlib.import_.test_meta_path.Source_CallingOrder.test_empty @ linux-x86_64 +test.test_importlib.import_.test_meta_path.Source_CallingOrder.test_first_called @ linux-x86_64 +test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_bad_parent @ linux-x86_64 +test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_import_parent @ linux-x86_64 +test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_module_not_package @ linux-x86_64 +test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_module_not_package_but_side_effects @ linux-x86_64 +test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_raising_parent_after_double_relative_importing_child @ linux-x86_64 +test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_raising_parent_after_importing_child @ linux-x86_64 +test.test_importlib.import_.test_packages.Frozen_ParentModuleTests.test_raising_parent_after_relative_importing_child @ linux-x86_64 +test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_bad_parent @ linux-x86_64 +test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_import_parent @ linux-x86_64 +test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_module_not_package @ linux-x86_64 +test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_module_not_package_but_side_effects @ linux-x86_64 +test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_raising_parent_after_double_relative_importing_child @ linux-x86_64 +test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_raising_parent_after_importing_child @ linux-x86_64 +test.test_importlib.import_.test_packages.Source_ParentModuleTests.test_raising_parent_after_relative_importing_child @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_None_on_sys_path @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_deleted_cwd @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_empty_list @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_empty_path_hooks @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_failure @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_finder_with_find_loader @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_finder_with_find_module @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_finder_with_find_spec @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_invalidate_caches_clear_out_None @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_invalidate_caches_clear_out_relative_path @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_invalidate_caches_finders @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_path @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_path_hooks @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_path_importer_cache_empty_string @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindModuleTests.test_sys_path @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_None_on_sys_path @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_deleted_cwd @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_empty_list @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_empty_path_hooks @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_failure @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_finder_with_find_loader @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_finder_with_find_module @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_finder_with_find_spec @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_invalidate_caches_clear_out_None @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_invalidate_caches_clear_out_relative_path @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_invalidate_caches_finders @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_path @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_path_hooks @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_path_importer_cache_empty_string @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_FindSpecTests.test_sys_path @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_PathEntryFinderTests.test_finder_with_failing_find_module @ linux-x86_64 +test.test_importlib.import_.test_path.Frozen_PathEntryFinderTests.test_finder_with_failing_find_spec @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_None_on_sys_path @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_deleted_cwd @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_empty_list @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_empty_path_hooks @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_failure @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_finder_with_find_loader @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_finder_with_find_module @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_finder_with_find_spec @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_invalidate_caches_clear_out_None @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_invalidate_caches_clear_out_relative_path @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_invalidate_caches_finders @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_path @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_path_hooks @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_path_importer_cache_empty_string @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindModuleTests.test_sys_path @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_None_on_sys_path @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_deleted_cwd @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_empty_list @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_empty_path_hooks @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_failure @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_finder_with_find_loader @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_finder_with_find_module @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_finder_with_find_spec @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_invalidate_caches_clear_out_None @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_invalidate_caches_clear_out_relative_path @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_invalidate_caches_finders @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_path @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_path_hooks @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_path_importer_cache_empty_string @ linux-x86_64 +test.test_importlib.import_.test_path.Source_FindSpecTests.test_sys_path @ linux-x86_64 +test.test_importlib.import_.test_path.Source_PathEntryFinderTests.test_finder_with_failing_find_module @ linux-x86_64 +test.test_importlib.import_.test_path.Source_PathEntryFinderTests.test_finder_with_failing_find_spec @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_attr_from_module @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_deep_import @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_empty_name_w_level_0 @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_import_from_different_package @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_import_relative_import_no_fromlist @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_module_from_module @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_module_to_package @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_package_to_module @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_package_to_package @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_relative_import_no_globals @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_relative_import_no_package @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_relative_import_no_package_exists_absolute @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_too_high_from_module @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Frozen_RelativeImports.test_too_high_from_package @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_attr_from_module @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_deep_import @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_empty_name_w_level_0 @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_import_from_different_package @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_import_relative_import_no_fromlist @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_module_from_module @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_module_to_package @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_package_to_module @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_package_to_package @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_relative_import_no_globals @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_relative_import_no_package @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_relative_import_no_package_exists_absolute @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_too_high_from_module @ linux-x86_64 +test.test_importlib.import_.test_relative_imports.Source_RelativeImports.test_too_high_from_package @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_bad_syntax @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_checked_hash_based_pyc @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_equality @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_file_from_empty_string_dir @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_get_filename_API @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_inequality @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_lacking_parent @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_load_module_API @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_module @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_module_reuse @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_overridden_checked_hash_based_pyc @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_overridden_unchecked_hash_based_pyc @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_package @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_state_after_failure @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_timestamp_overflow @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_unchecked_hash_based_pyc @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SimpleTest.test_unloadable @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_bad_magic @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_bad_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_empty_file @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_magic_only @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_no_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_non_code_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_old_timestamp @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_partial_flags @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_partial_hash @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_partial_magic @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_partial_size @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_partial_timestamp @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP302.test_read_only_bytecode @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_bad_magic @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_bad_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_empty_file @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_magic_only @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_no_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_non_code_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_old_timestamp @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_partial_flags @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_partial_hash @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_partial_magic @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_partial_size @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_partial_timestamp @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourceLoaderBadBytecodeTestPEP451.test_read_only_bytecode @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_bad_magic @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_empty_file @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_magic_only @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_no_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_non_code_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_partial_flags @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_partial_hash @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_partial_magic @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_partial_size @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP302.test_partial_timestamp @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_bad_magic @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_empty_file @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_magic_only @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_no_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_non_code_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_partial_flags @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_partial_hash @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_partial_magic @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_partial_size @ linux-x86_64 +test.test_importlib.source.test_file_loader.Frozen_SourcelessLoaderBadBytecodeTestPEP451.test_partial_timestamp @ linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_bad_syntax @ linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_checked_hash_based_pyc @ linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_equality @ linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_file_from_empty_string_dir @ linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_get_filename_API @ linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_inequality @ linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_lacking_parent @ linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_load_module_API @ linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_module @ linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_module_reuse @ linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_overridden_checked_hash_based_pyc @ linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_overridden_unchecked_hash_based_pyc @ linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_package @ linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_state_after_failure @ linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_timestamp_overflow @ linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_unchecked_hash_based_pyc @ linux-x86_64 +test.test_importlib.source.test_file_loader.SourceDateEpoch_SimpleTest.test_unloadable @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_bad_syntax @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_checked_hash_based_pyc @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_equality @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_file_from_empty_string_dir @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_get_filename_API @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_inequality @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_lacking_parent @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_load_module_API @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_module @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_module_reuse @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_overridden_checked_hash_based_pyc @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_overridden_unchecked_hash_based_pyc @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_package @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_state_after_failure @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_timestamp_overflow @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_unchecked_hash_based_pyc @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SimpleTest.test_unloadable @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_bad_magic @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_bad_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_empty_file @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_magic_only @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_no_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_non_code_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_old_timestamp @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_partial_flags @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_partial_hash @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_partial_magic @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_partial_size @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_partial_timestamp @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP302.test_read_only_bytecode @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_bad_magic @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_bad_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_empty_file @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_magic_only @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_no_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_non_code_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_old_timestamp @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_partial_flags @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_partial_hash @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_partial_magic @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_partial_size @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_partial_timestamp @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourceLoaderBadBytecodeTestPEP451.test_read_only_bytecode @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_bad_magic @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_empty_file @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_magic_only @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_no_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_non_code_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_partial_flags @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_partial_hash @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_partial_magic @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_partial_size @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP302.test_partial_timestamp @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_bad_magic @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_empty_file @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_magic_only @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_no_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_non_code_marshal @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_partial_flags @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_partial_hash @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_partial_magic @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_partial_size @ linux-x86_64 +test.test_importlib.source.test_file_loader.Source_SourcelessLoaderBadBytecodeTestPEP451.test_partial_timestamp @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_dir_removal_handling @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_empty_string_for_dir @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_failure @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_ignore_file @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_invalidate_caches @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_module @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_module_in_package @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_no_read_directory @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_package @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_package_in_package @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP302.test_package_over_module @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_dir_removal_handling @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_empty_string_for_dir @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_failure @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_ignore_file @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_invalidate_caches @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_module @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_module_in_package @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_no_read_directory @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_package @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_package_in_package @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP420.test_package_over_module @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_dir_removal_handling @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_empty_string_for_dir @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_failure @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_ignore_file @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_invalidate_caches @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_module @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_module_in_package @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_no_read_directory @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_package @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_package_in_package @ linux-x86_64 +test.test_importlib.source.test_finder.Frozen_FinderTestsPEP451.test_package_over_module @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_dir_removal_handling @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_empty_string_for_dir @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_failure @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_ignore_file @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_invalidate_caches @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_module @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_module_in_package @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_no_read_directory @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_package @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_package_in_package @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP302.test_package_over_module @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_dir_removal_handling @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_empty_string_for_dir @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_failure @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_ignore_file @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_invalidate_caches @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_module @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_module_in_package @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_no_read_directory @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_package @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_package_in_package @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP420.test_package_over_module @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_dir_removal_handling @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_empty_string_for_dir @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_failure @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_ignore_file @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_invalidate_caches @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_module @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_module_in_package @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_no_read_directory @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_package @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_package_in_package @ linux-x86_64 +test.test_importlib.source.test_finder.Source_FinderTestsPEP451.test_package_over_module @ linux-x86_64 +test.test_importlib.source.test_path_hook.Frozen_PathHookTest.test_empty_string @ linux-x86_64 +test.test_importlib.source.test_path_hook.Frozen_PathHookTest.test_empty_string_legacy @ linux-x86_64 +test.test_importlib.source.test_path_hook.Frozen_PathHookTest.test_success @ linux-x86_64 +test.test_importlib.source.test_path_hook.Frozen_PathHookTest.test_success_legacy @ linux-x86_64 +test.test_importlib.source.test_path_hook.Source_PathHookTest.test_empty_string @ linux-x86_64 +test.test_importlib.source.test_path_hook.Source_PathHookTest.test_empty_string_legacy @ linux-x86_64 +test.test_importlib.source.test_path_hook.Source_PathHookTest.test_success @ linux-x86_64 +test.test_importlib.source.test_path_hook.Source_PathHookTest.test_success_legacy @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_bom @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_bom_and_utf_8 @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_bom_conflict @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_default_encoding @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_encoding_on_first_line @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_encoding_on_second_line @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP302.test_non_obvious_encoding @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_bom @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_bom_and_utf_8 @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_bom_conflict @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_default_encoding @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_encoding_on_first_line @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_encoding_on_second_line @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_EncodingTestPEP451.test_non_obvious_encoding @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_LineEndingTestPEP302.test_cr @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_LineEndingTestPEP302.test_crlf @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_LineEndingTestPEP302.test_lf @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_LineEndingTestPEP451.test_cr @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_LineEndingTestPEP451.test_crlf @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Frozen_LineEndingTestPEP451.test_lf @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_bom @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_bom_and_utf_8 @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_bom_conflict @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_default_encoding @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_encoding_on_first_line @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_encoding_on_second_line @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP302.test_non_obvious_encoding @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_bom @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_bom_and_utf_8 @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_bom_conflict @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_default_encoding @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_encoding_on_first_line @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_encoding_on_second_line @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_EncodingTestPEP451.test_non_obvious_encoding @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_LineEndingTestPEP302.test_cr @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_LineEndingTestPEP302.test_crlf @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_LineEndingTestPEP302.test_lf @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_LineEndingTestPEP451.test_cr @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_LineEndingTestPEP451.test_crlf @ linux-x86_64 +test.test_importlib.source.test_source_encoding.Source_LineEndingTestPEP451.test_lf @ linux-x86_64 +test.test_importlib.test_abc.Frozen_ExecutionLoader.test_subclasses @ linux-x86_64 +test.test_importlib.test_abc.Frozen_ExecutionLoader.test_superclasses @ linux-x86_64 +test.test_importlib.test_abc.Frozen_ExecutionLoaderGetCodeTests.test_get_code @ linux-x86_64 +test.test_importlib.test_abc.Frozen_ExecutionLoaderGetCodeTests.test_get_code_no_path @ linux-x86_64 +test.test_importlib.test_abc.Frozen_ExecutionLoaderGetCodeTests.test_get_code_source_is_None @ linux-x86_64 +test.test_importlib.test_abc.Frozen_ExecutionLoaderGetCodeTests.test_get_code_source_not_found @ linux-x86_64 +test.test_importlib.test_abc.Frozen_FileLoader.test_subclasses @ linux-x86_64 +test.test_importlib.test_abc.Frozen_FileLoader.test_superclasses @ linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoader.test_subclasses @ linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoader.test_superclasses @ linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderDefaultsTests.test_get_source @ linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderDefaultsTests.test_is_package @ linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderGetCodeTests.test_get_code @ linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderGetCodeTests.test_get_code_source_is_None @ linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderGetCodeTests.test_get_code_source_not_found @ linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderLoadModuleTests.test_get_code_ImportError @ linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderLoadModuleTests.test_get_code_None @ linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderLoadModuleTests.test_module_returned @ linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderSourceToCodeTests.test_source_to_code_bytes @ linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderSourceToCodeTests.test_source_to_code_no_path @ linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderSourceToCodeTests.test_source_to_code_path @ linux-x86_64 +test.test_importlib.test_abc.Frozen_InspectLoaderSourceToCodeTests.test_source_to_code_source @ linux-x86_64 +test.test_importlib.test_abc.Frozen_LoaderDefaultsTests.test_create_module @ linux-x86_64 +test.test_importlib.test_abc.Frozen_LoaderDefaultsTests.test_load_module @ linux-x86_64 +test.test_importlib.test_abc.Frozen_LoaderDefaultsTests.test_module_repr @ linux-x86_64 +test.test_importlib.test_abc.Frozen_LoaderLoadModuleTests.test_fresh @ linux-x86_64 +test.test_importlib.test_abc.Frozen_LoaderLoadModuleTests.test_reload @ linux-x86_64 +test.test_importlib.test_abc.Frozen_MetaPathFinder.test_subclasses @ linux-x86_64 +test.test_importlib.test_abc.Frozen_MetaPathFinder.test_superclasses @ linux-x86_64 +test.test_importlib.test_abc.Frozen_MetaPathFinderDefaultsTests.test_find_module @ linux-x86_64 +test.test_importlib.test_abc.Frozen_MetaPathFinderDefaultsTests.test_invalidate_caches @ linux-x86_64 +test.test_importlib.test_abc.Frozen_MetaPathFinderFindModuleTests.test_find_module @ linux-x86_64 +test.test_importlib.test_abc.Frozen_MetaPathFinderFindModuleTests.test_find_spec_with_explicit_target @ linux-x86_64 +test.test_importlib.test_abc.Frozen_MetaPathFinderFindModuleTests.test_no_spec @ linux-x86_64 +test.test_importlib.test_abc.Frozen_MetaPathFinderFindModuleTests.test_spec @ linux-x86_64 +test.test_importlib.test_abc.Frozen_PathEntryFinder.test_subclasses @ linux-x86_64 +test.test_importlib.test_abc.Frozen_PathEntryFinder.test_superclasses @ linux-x86_64 +test.test_importlib.test_abc.Frozen_PathEntryFinderDefaultsTests.test_find_loader @ linux-x86_64 +test.test_importlib.test_abc.Frozen_PathEntryFinderDefaultsTests.test_invalidate_caches @ linux-x86_64 +test.test_importlib.test_abc.Frozen_PathEntryFinderFindLoaderTests.test_no_spec @ linux-x86_64 +test.test_importlib.test_abc.Frozen_PathEntryFinderFindLoaderTests.test_spec_with_loader @ linux-x86_64 +test.test_importlib.test_abc.Frozen_PathEntryFinderFindLoaderTests.test_spec_with_portions @ linux-x86_64 +test.test_importlib.test_abc.Frozen_ResourceLoader.test_subclasses @ linux-x86_64 +test.test_importlib.test_abc.Frozen_ResourceLoader.test_superclasses @ linux-x86_64 +test.test_importlib.test_abc.Frozen_ResourceLoaderDefaultsTests.test_get_data @ linux-x86_64 +test.test_importlib.test_abc.Frozen_ResourceReaderDefaultsTests.test_contents @ linux-x86_64 +test.test_importlib.test_abc.Frozen_ResourceReaderDefaultsTests.test_is_resource @ linux-x86_64 +test.test_importlib.test_abc.Frozen_ResourceReaderDefaultsTests.test_open_resource @ linux-x86_64 +test.test_importlib.test_abc.Frozen_ResourceReaderDefaultsTests.test_resource_path @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoader.test_subclasses @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoader.test_superclasses @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_code_bad_magic @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_code_bad_timestamp @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_code_with_everything @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_dont_write_bytecode @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_no_bytecode @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_no_set_data @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderBytecodeTests.test_set_data_raises_exceptions @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderGetSourceTests.test_decoded_source @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderGetSourceTests.test_default_encoding @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceLoaderGetSourceTests.test_universal_newlines @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_get_code @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_get_source @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_get_source_encoding @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_is_package @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_load_module @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_package_settings @ linux-x86_64 +test.test_importlib.test_abc.Frozen_SourceOnlyLoaderTests.test_source_to_code @ linux-x86_64 +test.test_importlib.test_abc.Source_ExecutionLoader.test_subclasses @ linux-x86_64 +test.test_importlib.test_abc.Source_ExecutionLoader.test_superclasses @ linux-x86_64 +test.test_importlib.test_abc.Source_ExecutionLoaderGetCodeTests.test_get_code @ linux-x86_64 +test.test_importlib.test_abc.Source_ExecutionLoaderGetCodeTests.test_get_code_no_path @ linux-x86_64 +test.test_importlib.test_abc.Source_ExecutionLoaderGetCodeTests.test_get_code_source_is_None @ linux-x86_64 +test.test_importlib.test_abc.Source_ExecutionLoaderGetCodeTests.test_get_code_source_not_found @ linux-x86_64 +test.test_importlib.test_abc.Source_FileLoader.test_subclasses @ linux-x86_64 +test.test_importlib.test_abc.Source_FileLoader.test_superclasses @ linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoader.test_subclasses @ linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoader.test_superclasses @ linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderDefaultsTests.test_get_source @ linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderDefaultsTests.test_is_package @ linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderGetCodeTests.test_get_code @ linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderGetCodeTests.test_get_code_source_is_None @ linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderGetCodeTests.test_get_code_source_not_found @ linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderLoadModuleTests.test_get_code_ImportError @ linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderLoadModuleTests.test_get_code_None @ linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderLoadModuleTests.test_module_returned @ linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderSourceToCodeTests.test_source_to_code_bytes @ linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderSourceToCodeTests.test_source_to_code_no_path @ linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderSourceToCodeTests.test_source_to_code_path @ linux-x86_64 +test.test_importlib.test_abc.Source_InspectLoaderSourceToCodeTests.test_source_to_code_source @ linux-x86_64 +test.test_importlib.test_abc.Source_LoaderDefaultsTests.test_create_module @ linux-x86_64 +test.test_importlib.test_abc.Source_LoaderDefaultsTests.test_load_module @ linux-x86_64 +test.test_importlib.test_abc.Source_LoaderDefaultsTests.test_module_repr @ linux-x86_64 +test.test_importlib.test_abc.Source_LoaderLoadModuleTests.test_fresh @ linux-x86_64 +test.test_importlib.test_abc.Source_LoaderLoadModuleTests.test_reload @ linux-x86_64 +test.test_importlib.test_abc.Source_MetaPathFinder.test_subclasses @ linux-x86_64 +test.test_importlib.test_abc.Source_MetaPathFinder.test_superclasses @ linux-x86_64 +test.test_importlib.test_abc.Source_MetaPathFinderDefaultsTests.test_find_module @ linux-x86_64 +test.test_importlib.test_abc.Source_MetaPathFinderDefaultsTests.test_invalidate_caches @ linux-x86_64 +test.test_importlib.test_abc.Source_MetaPathFinderFindModuleTests.test_find_module @ linux-x86_64 +test.test_importlib.test_abc.Source_MetaPathFinderFindModuleTests.test_find_spec_with_explicit_target @ linux-x86_64 +test.test_importlib.test_abc.Source_MetaPathFinderFindModuleTests.test_no_spec @ linux-x86_64 +test.test_importlib.test_abc.Source_MetaPathFinderFindModuleTests.test_spec @ linux-x86_64 +test.test_importlib.test_abc.Source_PathEntryFinder.test_subclasses @ linux-x86_64 +test.test_importlib.test_abc.Source_PathEntryFinder.test_superclasses @ linux-x86_64 +test.test_importlib.test_abc.Source_PathEntryFinderDefaultsTests.test_find_loader @ linux-x86_64 +test.test_importlib.test_abc.Source_PathEntryFinderDefaultsTests.test_invalidate_caches @ linux-x86_64 +test.test_importlib.test_abc.Source_PathEntryFinderFindLoaderTests.test_no_spec @ linux-x86_64 +test.test_importlib.test_abc.Source_PathEntryFinderFindLoaderTests.test_spec_with_loader @ linux-x86_64 +test.test_importlib.test_abc.Source_PathEntryFinderFindLoaderTests.test_spec_with_portions @ linux-x86_64 +test.test_importlib.test_abc.Source_ResourceLoader.test_subclasses @ linux-x86_64 +test.test_importlib.test_abc.Source_ResourceLoader.test_superclasses @ linux-x86_64 +test.test_importlib.test_abc.Source_ResourceLoaderDefaultsTests.test_get_data @ linux-x86_64 +test.test_importlib.test_abc.Source_ResourceReaderDefaultsTests.test_contents @ linux-x86_64 +test.test_importlib.test_abc.Source_ResourceReaderDefaultsTests.test_is_resource @ linux-x86_64 +test.test_importlib.test_abc.Source_ResourceReaderDefaultsTests.test_open_resource @ linux-x86_64 +test.test_importlib.test_abc.Source_ResourceReaderDefaultsTests.test_resource_path @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoader.test_subclasses @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoader.test_superclasses @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_code_bad_magic @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_code_bad_timestamp @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_code_with_everything @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_dont_write_bytecode @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_no_bytecode @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_no_set_data @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderBytecodeTests.test_set_data_raises_exceptions @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderGetSourceTests.test_decoded_source @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderGetSourceTests.test_default_encoding @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceLoaderGetSourceTests.test_universal_newlines @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_get_code @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_get_source @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_get_source_encoding @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_is_package @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_load_module @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_package_settings @ linux-x86_64 +test.test_importlib.test_abc.Source_SourceOnlyLoaderTests.test_source_to_code @ linux-x86_64 +test.test_importlib.test_api.FrozenImportlibTests.test_no_frozen_importlib @ linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP302Tests.test_nothing @ linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP302Tests.test_success @ linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP302Tests.test_success_path @ linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP302Tests.test_sys_modules @ linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP302Tests.test_sys_modules_loader_is_None @ linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP302Tests.test_sys_modules_loader_is_not_set @ linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP451Tests.test_nothing @ linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP451Tests.test_success @ linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP451Tests.test_success_path @ linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP451Tests.test_sys_modules @ linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP451Tests.test_sys_modules_loader_is_None @ linux-x86_64 +test.test_importlib.test_api.Frozen_FindLoaderPEP451Tests.test_sys_modules_loader_is_not_set @ linux-x86_64 +test.test_importlib.test_api.Frozen_ImportModuleTests.test_absolute_import_with_package @ linux-x86_64 +test.test_importlib.test_api.Frozen_ImportModuleTests.test_absolute_package_import @ linux-x86_64 +test.test_importlib.test_api.Frozen_ImportModuleTests.test_deep_relative_package_import @ linux-x86_64 +test.test_importlib.test_api.Frozen_ImportModuleTests.test_loaded_once @ linux-x86_64 +test.test_importlib.test_api.Frozen_ImportModuleTests.test_module_import @ linux-x86_64 +test.test_importlib.test_api.Frozen_ImportModuleTests.test_relative_import_wo_package @ linux-x86_64 +test.test_importlib.test_api.Frozen_ImportModuleTests.test_shallow_relative_package_import @ linux-x86_64 +test.test_importlib.test_api.Frozen_InvalidateCacheTests.test_method_called @ linux-x86_64 +test.test_importlib.test_api.Frozen_InvalidateCacheTests.test_method_lacking @ linux-x86_64 +test.test_importlib.test_api.Frozen_ReloadTests.test_module_missing_spec @ linux-x86_64 +test.test_importlib.test_api.Frozen_ReloadTests.test_module_replaced @ linux-x86_64 +test.test_importlib.test_api.Frozen_ReloadTests.test_reload_loader_replaced @ linux-x86_64 +test.test_importlib.test_api.Frozen_ReloadTests.test_reload_location_changed @ linux-x86_64 +test.test_importlib.test_api.Frozen_ReloadTests.test_reload_missing_loader @ linux-x86_64 +test.test_importlib.test_api.Frozen_ReloadTests.test_reload_modules @ linux-x86_64 +test.test_importlib.test_api.Frozen_ReloadTests.test_reload_namespace_changed @ linux-x86_64 +test.test_importlib.test_api.Frozen_ReloadTests.test_reload_submodule @ linux-x86_64 +test.test_importlib.test_api.Frozen_StartupTests.test_everyone_has___loader__ @ linux-x86_64 +test.test_importlib.test_api.Frozen_StartupTests.test_everyone_has___spec__ @ linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP302Tests.test_nothing @ linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP302Tests.test_success @ linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP302Tests.test_success_path @ linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP302Tests.test_sys_modules @ linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP302Tests.test_sys_modules_loader_is_None @ linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP302Tests.test_sys_modules_loader_is_not_set @ linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP451Tests.test_nothing @ linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP451Tests.test_success @ linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP451Tests.test_success_path @ linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP451Tests.test_sys_modules @ linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP451Tests.test_sys_modules_loader_is_None @ linux-x86_64 +test.test_importlib.test_api.Source_FindLoaderPEP451Tests.test_sys_modules_loader_is_not_set @ linux-x86_64 +test.test_importlib.test_api.Source_ImportModuleTests.test_absolute_import_with_package @ linux-x86_64 +test.test_importlib.test_api.Source_ImportModuleTests.test_absolute_package_import @ linux-x86_64 +test.test_importlib.test_api.Source_ImportModuleTests.test_deep_relative_package_import @ linux-x86_64 +test.test_importlib.test_api.Source_ImportModuleTests.test_loaded_once @ linux-x86_64 +test.test_importlib.test_api.Source_ImportModuleTests.test_module_import @ linux-x86_64 +test.test_importlib.test_api.Source_ImportModuleTests.test_relative_import_wo_package @ linux-x86_64 +test.test_importlib.test_api.Source_ImportModuleTests.test_shallow_relative_package_import @ linux-x86_64 +test.test_importlib.test_api.Source_InvalidateCacheTests.test_method_called @ linux-x86_64 +test.test_importlib.test_api.Source_InvalidateCacheTests.test_method_lacking @ linux-x86_64 +test.test_importlib.test_api.Source_ReloadTests.test_module_missing_spec @ linux-x86_64 +test.test_importlib.test_api.Source_ReloadTests.test_module_replaced @ linux-x86_64 +test.test_importlib.test_api.Source_ReloadTests.test_reload_loader_replaced @ linux-x86_64 +test.test_importlib.test_api.Source_ReloadTests.test_reload_location_changed @ linux-x86_64 +test.test_importlib.test_api.Source_ReloadTests.test_reload_missing_loader @ linux-x86_64 +test.test_importlib.test_api.Source_ReloadTests.test_reload_modules @ linux-x86_64 +test.test_importlib.test_api.Source_ReloadTests.test_reload_namespace_changed @ linux-x86_64 +test.test_importlib.test_api.Source_ReloadTests.test_reload_submodule @ linux-x86_64 +test.test_importlib.test_api.Source_StartupTests.test_everyone_has___loader__ @ linux-x86_64 +test.test_importlib.test_api.Source_StartupTests.test_everyone_has___spec__ @ linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesNoReaderTests.test_spec_path_joinpath @ linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_child_path_is @ linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_child_path_iter @ linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_child_path_name @ linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_child_path_open @ linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_open_invalid_mode @ linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_orphan_path_invalid @ linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_orphan_path_is @ linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_orphan_path_iter @ linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_orphan_path_name @ linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_orphan_path_open @ linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_spec_path_is @ linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_spec_path_iter @ linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_spec_path_name @ linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_spec_path_open @ linux-x86_64 +test.test_importlib.test_compatibilty_files.CompatibilityFilesTests.test_wrap_spec @ linux-x86_64 +test.test_importlib.test_contents.ContentsDiskTests.test_contents @ linux-x86_64 +test.test_importlib.test_contents.ContentsNamespaceTests.test_contents @ linux-x86_64 +test.test_importlib.test_contents.ContentsZipTests.test_contents @ linux-x86_64 +test.test_importlib.test_files.OpenDiskTests.test_read_bytes @ linux-x86_64 +test.test_importlib.test_files.OpenDiskTests.test_read_text @ linux-x86_64 +test.test_importlib.test_files.OpenDiskTests.test_traversable @ linux-x86_64 +test.test_importlib.test_files.OpenNamespaceTests.test_read_bytes @ linux-x86_64 +test.test_importlib.test_files.OpenNamespaceTests.test_read_text @ linux-x86_64 +test.test_importlib.test_files.OpenNamespaceTests.test_traversable @ linux-x86_64 +test.test_importlib.test_files.OpenZipTests.test_read_bytes @ linux-x86_64 +test.test_importlib.test_files.OpenZipTests.test_read_text @ linux-x86_64 +test.test_importlib.test_files.OpenZipTests.test_traversable @ linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderFactoryTests.test_init @ linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderFactoryTests.test_validation @ linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_attr_unchanged @ linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_delete_eventual_attr @ linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_delete_preexisting_attr @ linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_e2e @ linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_init @ linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_module_already_in_sys @ linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_module_substitution_error @ linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_mutated_attr @ linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_mutated_preexisting_attr @ linux-x86_64 +test.test_importlib.test_lazy.LazyLoaderTests.test_new_attr @ linux-x86_64 +test.test_importlib.test_locks.Frozen_DeadlockAvoidanceTests.test_deadlock @ linux-x86_64 +test.test_importlib.test_locks.Frozen_DeadlockAvoidanceTests.test_no_deadlock @ linux-x86_64 +test.test_importlib.test_locks.Frozen_LifetimeTests.test_lock_lifetime @ linux-x86_64 +test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_acquire_contended @ linux-x86_64 +test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_acquire_destroy @ linux-x86_64 +test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_acquire_release @ linux-x86_64 +test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_constructor @ linux-x86_64 +test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_different_thread @ linux-x86_64 +test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_reacquire @ linux-x86_64 +test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_release_unacquired @ linux-x86_64 +test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_thread_leak @ linux-x86_64 +test.test_importlib.test_locks.Frozen_ModuleLockAsRLockTests.test_weakref_exists @ linux-x86_64 +test.test_importlib.test_locks.Source_DeadlockAvoidanceTests.test_deadlock @ linux-x86_64 +test.test_importlib.test_locks.Source_DeadlockAvoidanceTests.test_no_deadlock @ linux-x86_64 +!test.test_importlib.test_locks.Source_LifetimeTests.test_all_locks @ linux-x86_64 +test.test_importlib.test_locks.Source_LifetimeTests.test_lock_lifetime @ linux-x86_64 +test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_acquire_contended @ linux-x86_64 +test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_acquire_destroy @ linux-x86_64 +test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_acquire_release @ linux-x86_64 +test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_constructor @ linux-x86_64 +test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_different_thread @ linux-x86_64 +test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_reacquire @ linux-x86_64 +test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_release_unacquired @ linux-x86_64 +test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_thread_leak @ linux-x86_64 +test.test_importlib.test_locks.Source_ModuleLockAsRLockTests.test_weakref_exists @ linux-x86_64 +test.test_importlib.test_main.BasicTests.test_for_name_does_not_exist @ linux-x86_64 +test.test_importlib.test_main.BasicTests.test_invalid_inputs_to_from_name @ linux-x86_64 +test.test_importlib.test_main.BasicTests.test_new_style_classes @ linux-x86_64 +test.test_importlib.test_main.BasicTests.test_package_not_found_mentions_metadata @ linux-x86_64 +test.test_importlib.test_main.BasicTests.test_retrieves_version_of_self @ linux-x86_64 +test.test_importlib.test_main.DirectoryTest.test_egg @ linux-x86_64 +test.test_importlib.test_main.DirectoryTest.test_egg_info @ linux-x86_64 +test.test_importlib.test_main.DiscoveryTests.test_invalid_usage @ linux-x86_64 +test.test_importlib.test_main.DiscoveryTests.test_package_discovery @ linux-x86_64 +test.test_importlib.test_main.FileSystem.test_unicode_dir_on_sys_path @ linux-x86_64 +test.test_importlib.test_main.ImportTests.test_entrypoint_with_colon_in_name @ linux-x86_64 +test.test_importlib.test_main.ImportTests.test_import_nonexistent_module @ linux-x86_64 +test.test_importlib.test_main.ImportTests.test_resolve @ linux-x86_64 +test.test_importlib.test_main.ImportTests.test_resolve_without_attr @ linux-x86_64 +test.test_importlib.test_main.MissingSysPath.test_discovery @ linux-x86_64 +test.test_importlib.test_main.NameNormalizationTests.test_dashes_in_dist_name_found_as_underscores @ linux-x86_64 +test.test_importlib.test_main.NameNormalizationTests.test_dist_name_found_as_any_case @ linux-x86_64 +test.test_importlib.test_main.NameNormalizationTests.test_unique_distributions @ linux-x86_64 +test.test_importlib.test_main.NonASCIITests.test_metadata_loads @ linux-x86_64 +test.test_importlib.test_main.NonASCIITests.test_metadata_loads_egg_info @ linux-x86_64 +test.test_importlib.test_main.PackagesDistributionsPrebuiltTest.test_packages_distributions_example @ linux-x86_64 +test.test_importlib.test_main.PackagesDistributionsPrebuiltTest.test_packages_distributions_example2 @ linux-x86_64 +test.test_importlib.test_main.PackagesDistributionsTest.test_packages_distributions_neither_toplevel_nor_files @ linux-x86_64 +test.test_importlib.test_main.TestEntryPoints.test_attr @ linux-x86_64 +test.test_importlib.test_main.TestEntryPoints.test_entry_point_pickleable @ linux-x86_64 +test.test_importlib.test_main.TestEntryPoints.test_hashable @ linux-x86_64 +test.test_importlib.test_main.TestEntryPoints.test_immutable @ linux-x86_64 +test.test_importlib.test_main.TestEntryPoints.test_json_dump @ linux-x86_64 +test.test_importlib.test_main.TestEntryPoints.test_module @ linux-x86_64 +test.test_importlib.test_main.TestEntryPoints.test_positional_args @ linux-x86_64 +test.test_importlib.test_main.TestEntryPoints.test_repr @ linux-x86_64 +test.test_importlib.test_main.TestEntryPoints.test_sortable @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_as_json @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_as_json_egg_info @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_as_json_odd_case @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points_allows_no_attributes @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points_by_index @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points_dict_construction @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points_distribution @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points_groups_get @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points_groups_getitem @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points_missing_group @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points_missing_name @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_entry_points_unique_packages_normalized @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_file_hash_repr @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_files_dist_info @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_files_egg_info @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_for_name_does_not_exist @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_for_top_level @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_metadata_for_this_package @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_more_complex_deps_requires_text @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_name_normalization @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_prefix_not_matched @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_read_text @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_requires_dist_info @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_requires_egg_info @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_requires_egg_info_empty @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_requires_egg_info_file @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_retrieves_version_of_distinfo_pkg @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_retrieves_version_of_self @ linux-x86_64 +test.test_importlib.test_metadata_api.APITests.test_version_egg_info_file @ linux-x86_64 +test.test_importlib.test_metadata_api.InvalidateCache.test_invalidate_cache @ linux-x86_64 +test.test_importlib.test_metadata_api.LegacyDots.test_name_normalization @ linux-x86_64 +test.test_importlib.test_metadata_api.LegacyDots.test_name_normalization_versionless_egg_info @ linux-x86_64 +test.test_importlib.test_metadata_api.OffSysPathTests.test_distribution_at_pathlib @ linux-x86_64 +test.test_importlib.test_metadata_api.OffSysPathTests.test_distribution_at_str @ linux-x86_64 +test.test_importlib.test_metadata_api.OffSysPathTests.test_find_distributions_specified_path @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.CombinedNamespacePackages.test_imports @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.DynamicPathCalculation.test_project3_fails @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.DynamicPathCalculation.test_project3_succeeds @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.DynamicPathNamespacePackage.test_dynamic_path @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.LegacySupport.test_non_namespace_package_takes_precedence @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.LoaderTests.test_loader_abc @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.LoaderTests.test_namespace_loader_consistency @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.LoaderTests.test_namespace_origin_consistency @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.LoaderTests.test_path_indexable @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.ModuleAndNamespacePackageInSameDir.test_module_before_namespace_package @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.ReloadTests.test_cant_import_other @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.ReloadTests.test_dynamic_path @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.ReloadTests.test_simple_package @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.SeparatedNamespacePackages.test_imports @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.SeparatedNamespacePackagesCreatedWhileRunning.test_invalidate_caches @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.SeparatedNestedZipNamespacePackages.test_imports @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.SeparatedOverlappingNamespacePackages.test_first_path_wins @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.SeparatedOverlappingNamespacePackages.test_first_path_wins_again @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.SeparatedOverlappingNamespacePackages.test_first_path_wins_importing_second_first @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.SeparatedZipNamespacePackages.test_imports @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.SingleNamespacePackage.test_cant_import_other @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.SingleNamespacePackage.test_module_repr @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.SingleNamespacePackage.test_simple_package @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.SingleNestedZipNamespacePackage.test_cant_import_other @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.SingleNestedZipNamespacePackage.test_simple_package @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.SingleZipNamespacePackage.test_cant_import_other @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.SingleZipNamespacePackage.test_simple_package @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.ZipWithMissingDirectory.test_missing_directory @ linux-x86_64 +test.test_importlib.test_namespace_pkgs.ZipWithMissingDirectory.test_present_directory @ linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_extant_path @ linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_importing_module_as_side_effect @ linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_missing_path @ linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_non_package_by_name @ linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_non_package_by_package @ linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_package_name @ linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_package_object @ linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_pathlib_path @ linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_string_path @ linux-x86_64 +test.test_importlib.test_open.CommonBinaryTests.test_useless_loader @ linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_extant_path @ linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_importing_module_as_side_effect @ linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_missing_path @ linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_non_package_by_name @ linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_non_package_by_package @ linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_package_name @ linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_package_object @ linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_pathlib_path @ linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_string_path @ linux-x86_64 +test.test_importlib.test_open.CommonTextTests.test_useless_loader @ linux-x86_64 +test.test_importlib.test_open.OpenDiskNamespaceTests.test_open_binary @ linux-x86_64 +test.test_importlib.test_open.OpenDiskNamespaceTests.test_open_binary_FileNotFoundError @ linux-x86_64 +test.test_importlib.test_open.OpenDiskNamespaceTests.test_open_text_FileNotFoundError @ linux-x86_64 +test.test_importlib.test_open.OpenDiskNamespaceTests.test_open_text_default_encoding @ linux-x86_64 +test.test_importlib.test_open.OpenDiskNamespaceTests.test_open_text_given_encoding @ linux-x86_64 +test.test_importlib.test_open.OpenDiskNamespaceTests.test_open_text_with_errors @ linux-x86_64 +test.test_importlib.test_open.OpenDiskTests.test_open_binary @ linux-x86_64 +test.test_importlib.test_open.OpenDiskTests.test_open_binary_FileNotFoundError @ linux-x86_64 +test.test_importlib.test_open.OpenDiskTests.test_open_text_FileNotFoundError @ linux-x86_64 +test.test_importlib.test_open.OpenDiskTests.test_open_text_default_encoding @ linux-x86_64 +test.test_importlib.test_open.OpenDiskTests.test_open_text_given_encoding @ linux-x86_64 +test.test_importlib.test_open.OpenDiskTests.test_open_text_with_errors @ linux-x86_64 +test.test_importlib.test_open.OpenZipTests.test_open_binary @ linux-x86_64 +test.test_importlib.test_open.OpenZipTests.test_open_binary_FileNotFoundError @ linux-x86_64 +test.test_importlib.test_open.OpenZipTests.test_open_text_FileNotFoundError @ linux-x86_64 +test.test_importlib.test_open.OpenZipTests.test_open_text_default_encoding @ linux-x86_64 +test.test_importlib.test_open.OpenZipTests.test_open_text_given_encoding @ linux-x86_64 +test.test_importlib.test_open.OpenZipTests.test_open_text_with_errors @ linux-x86_64 +test.test_importlib.test_path.CommonTests.test_extant_path @ linux-x86_64 +test.test_importlib.test_path.CommonTests.test_importing_module_as_side_effect @ linux-x86_64 +test.test_importlib.test_path.CommonTests.test_missing_path @ linux-x86_64 +test.test_importlib.test_path.CommonTests.test_non_package_by_name @ linux-x86_64 +test.test_importlib.test_path.CommonTests.test_non_package_by_package @ linux-x86_64 +test.test_importlib.test_path.CommonTests.test_package_name @ linux-x86_64 +test.test_importlib.test_path.CommonTests.test_package_object @ linux-x86_64 +test.test_importlib.test_path.CommonTests.test_pathlib_path @ linux-x86_64 +test.test_importlib.test_path.CommonTests.test_string_path @ linux-x86_64 +test.test_importlib.test_path.CommonTests.test_useless_loader @ linux-x86_64 +test.test_importlib.test_path.PathDiskTests.test_natural_path @ linux-x86_64 +test.test_importlib.test_path.PathDiskTests.test_reading @ linux-x86_64 +test.test_importlib.test_path.PathMemoryTests.test_reading @ linux-x86_64 +test.test_importlib.test_path.PathZipTests.test_reading @ linux-x86_64 +test.test_importlib.test_path.PathZipTests.test_remove_in_context_manager @ linux-x86_64 +test.test_importlib.test_pkg_import.TestImport.test_package_import__semantics @ linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_extant_path @ linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_importing_module_as_side_effect @ linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_missing_path @ linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_non_package_by_name @ linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_non_package_by_package @ linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_package_name @ linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_package_object @ linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_pathlib_path @ linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_string_path @ linux-x86_64 +test.test_importlib.test_read.CommonBinaryTests.test_useless_loader @ linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_extant_path @ linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_importing_module_as_side_effect @ linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_missing_path @ linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_non_package_by_name @ linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_non_package_by_package @ linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_package_name @ linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_package_object @ linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_pathlib_path @ linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_string_path @ linux-x86_64 +test.test_importlib.test_read.CommonTextTests.test_useless_loader @ linux-x86_64 +test.test_importlib.test_read.ReadDiskTests.test_read_bytes @ linux-x86_64 +test.test_importlib.test_read.ReadDiskTests.test_read_text_default_encoding @ linux-x86_64 +test.test_importlib.test_read.ReadDiskTests.test_read_text_given_encoding @ linux-x86_64 +test.test_importlib.test_read.ReadDiskTests.test_read_text_with_errors @ linux-x86_64 +test.test_importlib.test_read.ReadNamespaceTests.test_read_bytes @ linux-x86_64 +test.test_importlib.test_read.ReadNamespaceTests.test_read_text_default_encoding @ linux-x86_64 +test.test_importlib.test_read.ReadNamespaceTests.test_read_text_given_encoding @ linux-x86_64 +test.test_importlib.test_read.ReadNamespaceTests.test_read_text_with_errors @ linux-x86_64 +test.test_importlib.test_read.ReadZipTests.test_read_bytes @ linux-x86_64 +test.test_importlib.test_read.ReadZipTests.test_read_submodule_resource @ linux-x86_64 +test.test_importlib.test_read.ReadZipTests.test_read_submodule_resource_by_name @ linux-x86_64 +test.test_importlib.test_read.ReadZipTests.test_read_text_default_encoding @ linux-x86_64 +test.test_importlib.test_read.ReadZipTests.test_read_text_given_encoding @ linux-x86_64 +test.test_importlib.test_read.ReadZipTests.test_read_text_with_errors @ linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_init_file @ linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_init_no_paths @ linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_is_dir @ linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_is_file @ linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_iterdir @ linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_iterdir_duplicate @ linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_join_path @ linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_name @ linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_open_file @ linux-x86_64 +test.test_importlib.test_reader.MultiplexedPathTest.test_repr @ linux-x86_64 +test.test_importlib.test_reader.NamespaceReaderTest.test_files @ linux-x86_64 +test.test_importlib.test_reader.NamespaceReaderTest.test_init_error @ linux-x86_64 +test.test_importlib.test_reader.NamespaceReaderTest.test_resource_path @ linux-x86_64 +test.test_importlib.test_resource.DeletingZipsTest.test_entered_path_does_not_keep_open @ linux-x86_64 +test.test_importlib.test_resource.DeletingZipsTest.test_is_file_does_not_keep_open @ linux-x86_64 +test.test_importlib.test_resource.DeletingZipsTest.test_is_file_failure_does_not_keep_open @ linux-x86_64 +test.test_importlib.test_resource.DeletingZipsTest.test_iterdir_does_not_keep_open @ linux-x86_64 +test.test_importlib.test_resource.DeletingZipsTest.test_read_binary_does_not_keep_open @ linux-x86_64 +test.test_importlib.test_resource.DeletingZipsTest.test_read_text_does_not_keep_open @ linux-x86_64 +test.test_importlib.test_resource.ResourceCornerCaseTests.test_package_has_no_reader_fallback @ linux-x86_64 +test.test_importlib.test_resource.ResourceDiskTests.test_is_dir @ linux-x86_64 +test.test_importlib.test_resource.ResourceDiskTests.test_is_file_exists @ linux-x86_64 +test.test_importlib.test_resource.ResourceDiskTests.test_is_file_missing @ linux-x86_64 +test.test_importlib.test_resource.ResourceFromNamespaceTest01.test_is_submodule_resource @ linux-x86_64 +test.test_importlib.test_resource.ResourceFromNamespaceTest01.test_read_submodule_resource_by_name @ linux-x86_64 +test.test_importlib.test_resource.ResourceFromNamespaceTest01.test_submodule_contents @ linux-x86_64 +test.test_importlib.test_resource.ResourceFromNamespaceTest01.test_submodule_contents_by_name @ linux-x86_64 +test.test_importlib.test_resource.ResourceFromZipsTest01.test_is_submodule_resource @ linux-x86_64 +test.test_importlib.test_resource.ResourceFromZipsTest01.test_read_submodule_resource_by_name @ linux-x86_64 +test.test_importlib.test_resource.ResourceFromZipsTest01.test_submodule_contents @ linux-x86_64 +test.test_importlib.test_resource.ResourceFromZipsTest01.test_submodule_contents_by_name @ linux-x86_64 +test.test_importlib.test_resource.ResourceFromZipsTest02.test_unrelated_contents @ linux-x86_64 +test.test_importlib.test_resource.ResourceLoaderTests.test_is_dir @ linux-x86_64 +test.test_importlib.test_resource.ResourceLoaderTests.test_is_file @ linux-x86_64 +test.test_importlib.test_resource.ResourceLoaderTests.test_resource_contents @ linux-x86_64 +test.test_importlib.test_resource.ResourceLoaderTests.test_resource_missing @ linux-x86_64 +test.test_importlib.test_resource.ResourceZipTests.test_is_dir @ linux-x86_64 +test.test_importlib.test_resource.ResourceZipTests.test_is_file_exists @ linux-x86_64 +test.test_importlib.test_resource.ResourceZipTests.test_is_file_missing @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_default @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_default_bad_suffix @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_default_without_location @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_loader_no_location @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_loader_no_location_bad_get_filename @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_loader_no_location_no_get_filename @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_path_like_arg @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_relative_path @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_default @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_default_bad_is_package @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_default_no_is_package @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_default_not_package @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_empty @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_none @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_file_location_smsl_not_empty @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_default @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_default_with_bad_is_package @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_default_with_file_loader @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_is_package_false @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_is_package_false_with_fileloader @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_is_package_true @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_is_package_true_with_fileloader @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_is_package_with_loader_false @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_is_package_with_loader_true @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_origin @ linux-x86_64 +test.test_importlib.test_spec.Frozen_FactoryTests.test_spec_from_loader_origin_and_is_package @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module___loader___module_repr @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module___loader___module_repr_bad @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module___spec__ @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module___spec___location @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module___spec___no_origin @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module___spec___no_origin_no_loader @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module_no_file @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module_no_file_no_loader @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module_no_name @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleReprTests.test_module_with_file @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_exec @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load_failed @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load_failed_removed @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load_legacy @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load_legacy_attributes @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load_legacy_attributes_immutable @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_load_replaced @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_reload @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_reload_extra_attributes @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_reload_init_module_attrs @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_reload_legacy @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecMethodsTests.test_reload_modified @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_no_origin @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_set @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_source @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_source_missing_cache_tag @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_source_unknown_suffix @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_sourceless @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_cached_with_origin_not_location @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_default @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_default_is_package_false @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_default_is_package_true @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_default_no_loader @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_equality @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_equality_location @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_has_location_setter @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_inequality @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_inequality_incomplete @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_package @ linux-x86_64 +test.test_importlib.test_spec.Frozen_ModuleSpecTests.test_package_is_package @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_default @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_default_bad_suffix @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_default_without_location @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_loader_no_location @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_loader_no_location_bad_get_filename @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_loader_no_location_no_get_filename @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_path_like_arg @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_relative_path @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_default @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_default_bad_is_package @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_default_no_is_package @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_default_not_package @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_empty @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_none @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_file_location_smsl_not_empty @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_default @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_default_with_bad_is_package @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_default_with_file_loader @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_is_package_false @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_is_package_false_with_fileloader @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_is_package_true @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_is_package_true_with_fileloader @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_is_package_with_loader_false @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_is_package_with_loader_true @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_origin @ linux-x86_64 +test.test_importlib.test_spec.Source_FactoryTests.test_spec_from_loader_origin_and_is_package @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module___loader___module_repr @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module___loader___module_repr_bad @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module___spec__ @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module___spec___location @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module___spec___no_origin @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module___spec___no_origin_no_loader @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module_no_file @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module_no_file_no_loader @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module_no_name @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleReprTests.test_module_with_file @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_exec @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load_failed @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load_failed_removed @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load_legacy @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load_legacy_attributes @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load_legacy_attributes_immutable @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_load_replaced @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_reload @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_reload_extra_attributes @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_reload_init_module_attrs @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_reload_legacy @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecMethodsTests.test_reload_modified @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_no_origin @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_set @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_source @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_source_missing_cache_tag @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_source_unknown_suffix @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_sourceless @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_cached_with_origin_not_location @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_default @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_default_is_package_false @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_default_is_package_true @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_default_no_loader @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_equality @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_equality_location @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_has_location_setter @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_inequality @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_inequality_incomplete @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_package @ linux-x86_64 +test.test_importlib.test_spec.Source_ModuleSpecTests.test_package_is_package @ linux-x86_64 +test.test_importlib.test_threaded_import.ThreadedImportTests.test_circular_imports @ linux-x86_64 +test.test_importlib.test_threaded_import.ThreadedImportTests.test_concurrent_futures_circular_import @ linux-x86_64 +test.test_importlib.test_threaded_import.ThreadedImportTests.test_import_hangers @ linux-x86_64 +test.test_importlib.test_threaded_import.ThreadedImportTests.test_multiprocessing_pool_circular_import @ linux-x86_64 +test.test_importlib.test_threaded_import.ThreadedImportTests.test_parallel_meta_path @ linux-x86_64 +test.test_importlib.test_threaded_import.ThreadedImportTests.test_parallel_module_init @ linux-x86_64 +test.test_importlib.test_threaded_import.ThreadedImportTests.test_parallel_path_hooks @ linux-x86_64 +test.test_importlib.test_threaded_import.ThreadedImportTests.test_side_effect_import @ linux-x86_64 +test.test_importlib.test_util.Frozen_DecodeSourceBytesTests.test_specified_encoding @ linux-x86_64 +test.test_importlib.test_util.Frozen_DecodeSourceBytesTests.test_universal_newlines @ linux-x86_64 +test.test_importlib.test_util.Frozen_DecodeSourceBytesTests.test_ut8_default @ linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_find_relative_module @ linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_find_relative_module_missing_package @ linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_find_submodule @ linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_find_submodule_in_module @ linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_find_submodule_parent_already_imported @ linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_nothing @ linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_success @ linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_sys_modules @ linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_sys_modules_loader_is_None @ linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_sys_modules_spec_is_None @ linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_sys_modules_spec_is_not_set @ linux-x86_64 +test.test_importlib.test_util.Frozen_FindSpecTests.test_sys_modules_without___loader__ @ linux-x86_64 +test.test_importlib.test_util.Frozen_MagicNumberTests.test_incorporates_rn @ linux-x86_64 +test.test_importlib.test_util.Frozen_MagicNumberTests.test_length @ linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_attributes_set @ linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_decorator_attrs @ linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_false_module @ linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_new_module @ linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_new_module_failure @ linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_reload @ linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_reload_failure @ linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleForLoaderTests.test_warning @ linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___cached__ @ linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___file__ @ linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___loader__ @ linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___name__ @ linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___package__ @ linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___path__ @ linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test___spec__ @ linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test_create_module @ linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test_create_module_returns_None @ linux-x86_64 +test.test_importlib.test_util.Frozen_ModuleFromSpecTests.test_no_create_module @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_cwd @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_debug_override @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_debug_override_optimization_both_set @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_no_cache_tag @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_no_dot @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_optimization_None @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_optimization_empty_string @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_optimization_set @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_override @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_path_like_arg @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_respects_pycache_prefix @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_cache_from_source_respects_pycache_prefix_relative @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_bad_path @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_inside_pycache_prefix @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_missing_optimization @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_no__pycache__ @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_no_cache_tag @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_no_slash @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_not_opt @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_optimized_bytecode @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_outside_pycache_prefix @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_path_like_arg @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_too_few_dots @ linux-x86_64 +test.test_importlib.test_util.Frozen_PEP3147Tests.test_source_from_cache_too_many_dots @ linux-x86_64 +test.test_importlib.test_util.Frozen_ResolveNameTests.test_absolute @ linux-x86_64 +test.test_importlib.test_util.Frozen_ResolveNameTests.test_absolute_within_package @ linux-x86_64 +test.test_importlib.test_util.Frozen_ResolveNameTests.test_escape @ linux-x86_64 +test.test_importlib.test_util.Frozen_ResolveNameTests.test_in_package @ linux-x86_64 +test.test_importlib.test_util.Frozen_ResolveNameTests.test_no_package @ linux-x86_64 +test.test_importlib.test_util.Frozen_ResolveNameTests.test_other_package @ linux-x86_64 +test.test_importlib.test_util.Frozen_SetLoaderTests.test_attribute_is_None @ linux-x86_64 +test.test_importlib.test_util.Frozen_SetLoaderTests.test_no_attribute @ linux-x86_64 +test.test_importlib.test_util.Frozen_SetLoaderTests.test_not_reset @ linux-x86_64 +test.test_importlib.test_util.Frozen_SetPackageTests.test_decorator_attrs @ linux-x86_64 +test.test_importlib.test_util.Frozen_SetPackageTests.test_leaving_alone @ linux-x86_64 +test.test_importlib.test_util.Frozen_SetPackageTests.test_package @ linux-x86_64 +test.test_importlib.test_util.Frozen_SetPackageTests.test_setting_if_missing @ linux-x86_64 +test.test_importlib.test_util.Frozen_SetPackageTests.test_submodule @ linux-x86_64 +test.test_importlib.test_util.Frozen_SetPackageTests.test_top_level @ linux-x86_64 +test.test_importlib.test_util.Source_DecodeSourceBytesTests.test_specified_encoding @ linux-x86_64 +test.test_importlib.test_util.Source_DecodeSourceBytesTests.test_universal_newlines @ linux-x86_64 +test.test_importlib.test_util.Source_DecodeSourceBytesTests.test_ut8_default @ linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_find_relative_module @ linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_find_relative_module_missing_package @ linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_find_submodule @ linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_find_submodule_in_module @ linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_find_submodule_parent_already_imported @ linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_nothing @ linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_success @ linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_sys_modules @ linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_sys_modules_loader_is_None @ linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_sys_modules_spec_is_None @ linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_sys_modules_spec_is_not_set @ linux-x86_64 +test.test_importlib.test_util.Source_FindSpecTests.test_sys_modules_without___loader__ @ linux-x86_64 +test.test_importlib.test_util.Source_MagicNumberTests.test_incorporates_rn @ linux-x86_64 +test.test_importlib.test_util.Source_MagicNumberTests.test_length @ linux-x86_64 +test.test_importlib.test_util.Source_ModuleForLoaderTests.test_attributes_set @ linux-x86_64 +test.test_importlib.test_util.Source_ModuleForLoaderTests.test_decorator_attrs @ linux-x86_64 +test.test_importlib.test_util.Source_ModuleForLoaderTests.test_false_module @ linux-x86_64 +test.test_importlib.test_util.Source_ModuleForLoaderTests.test_new_module @ linux-x86_64 +test.test_importlib.test_util.Source_ModuleForLoaderTests.test_new_module_failure @ linux-x86_64 +test.test_importlib.test_util.Source_ModuleForLoaderTests.test_reload @ linux-x86_64 +test.test_importlib.test_util.Source_ModuleForLoaderTests.test_reload_failure @ linux-x86_64 +test.test_importlib.test_util.Source_ModuleForLoaderTests.test_warning @ linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test___cached__ @ linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test___file__ @ linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test___loader__ @ linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test___name__ @ linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test___package__ @ linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test___path__ @ linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test___spec__ @ linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test_create_module @ linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test_create_module_returns_None @ linux-x86_64 +test.test_importlib.test_util.Source_ModuleFromSpecTests.test_no_create_module @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_cwd @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_debug_override @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_debug_override_optimization_both_set @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_no_cache_tag @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_no_dot @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_optimization_None @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_optimization_empty_string @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_optimization_set @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_override @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_path_like_arg @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_respects_pycache_prefix @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_cache_from_source_respects_pycache_prefix_relative @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_bad_path @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_inside_pycache_prefix @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_missing_optimization @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_no__pycache__ @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_no_cache_tag @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_no_slash @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_not_opt @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_optimized_bytecode @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_outside_pycache_prefix @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_path_like_arg @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_too_few_dots @ linux-x86_64 +test.test_importlib.test_util.Source_PEP3147Tests.test_source_from_cache_too_many_dots @ linux-x86_64 +test.test_importlib.test_util.Source_ResolveNameTests.test_absolute @ linux-x86_64 +test.test_importlib.test_util.Source_ResolveNameTests.test_absolute_within_package @ linux-x86_64 +test.test_importlib.test_util.Source_ResolveNameTests.test_escape @ linux-x86_64 +test.test_importlib.test_util.Source_ResolveNameTests.test_in_package @ linux-x86_64 +test.test_importlib.test_util.Source_ResolveNameTests.test_no_package @ linux-x86_64 +test.test_importlib.test_util.Source_ResolveNameTests.test_other_package @ linux-x86_64 +test.test_importlib.test_util.Source_SetLoaderTests.test_attribute_is_None @ linux-x86_64 +test.test_importlib.test_util.Source_SetLoaderTests.test_no_attribute @ linux-x86_64 +test.test_importlib.test_util.Source_SetLoaderTests.test_not_reset @ linux-x86_64 +test.test_importlib.test_util.Source_SetPackageTests.test_decorator_attrs @ linux-x86_64 +test.test_importlib.test_util.Source_SetPackageTests.test_leaving_alone @ linux-x86_64 +test.test_importlib.test_util.Source_SetPackageTests.test_package @ linux-x86_64 +test.test_importlib.test_util.Source_SetPackageTests.test_setting_if_missing @ linux-x86_64 +test.test_importlib.test_util.Source_SetPackageTests.test_submodule @ linux-x86_64 +test.test_importlib.test_util.Source_SetPackageTests.test_top_level @ linux-x86_64 +test.test_importlib.test_zip.TestEgg.test_case_insensitive @ linux-x86_64 +test.test_importlib.test_zip.TestEgg.test_files @ linux-x86_64 +test.test_importlib.test_zip.TestEgg.test_missing_metadata @ linux-x86_64 +test.test_importlib.test_zip.TestEgg.test_normalized_name @ linux-x86_64 +test.test_importlib.test_zip.TestEgg.test_one_distribution @ linux-x86_64 +test.test_importlib.test_zip.TestEgg.test_zip_entry_points @ linux-x86_64 +test.test_importlib.test_zip.TestEgg.test_zip_version @ linux-x86_64 +test.test_importlib.test_zip.TestEgg.test_zip_version_does_not_match @ linux-x86_64 +test.test_importlib.test_zip.TestZip.test_case_insensitive @ linux-x86_64 +test.test_importlib.test_zip.TestZip.test_files @ linux-x86_64 +test.test_importlib.test_zip.TestZip.test_missing_metadata @ linux-x86_64 +test.test_importlib.test_zip.TestZip.test_one_distribution @ linux-x86_64 +test.test_importlib.test_zip.TestZip.test_zip_entry_points @ linux-x86_64 +test.test_importlib.test_zip.TestZip.test_zip_version @ linux-x86_64 +test.test_importlib.test_zip.TestZip.test_zip_version_does_not_match @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_index.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_index.txt new file mode 100644 index 0000000000..b12815a266 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_index.txt @@ -0,0 +1,55 @@ +test.test_index.BaseTestCase.test_basic @ linux-x86_64 +test.test_index.BaseTestCase.test_error @ linux-x86_64 +test.test_index.BaseTestCase.test_index_returns_int_subclass @ linux-x86_64 +test.test_index.BaseTestCase.test_int_subclass_with_index @ linux-x86_64 +test.test_index.BaseTestCase.test_slice @ linux-x86_64 +test.test_index.BaseTestCase.test_subclasses @ linux-x86_64 +test.test_index.BaseTestCase.test_wrappers @ linux-x86_64 +test.test_index.ByteArrayTestCase.test_error @ linux-x86_64 +test.test_index.ByteArrayTestCase.test_index @ linux-x86_64 +test.test_index.ByteArrayTestCase.test_repeat @ linux-x86_64 +test.test_index.ByteArrayTestCase.test_slice @ linux-x86_64 +test.test_index.ByteArrayTestCase.test_slice_bug7532 @ linux-x86_64 +test.test_index.ByteArrayTestCase.test_subclasses @ linux-x86_64 +test.test_index.ByteArrayTestCase.test_wrappers @ linux-x86_64 +test.test_index.BytesTestCase.test_error @ linux-x86_64 +test.test_index.BytesTestCase.test_index @ linux-x86_64 +test.test_index.BytesTestCase.test_repeat @ linux-x86_64 +test.test_index.BytesTestCase.test_slice @ linux-x86_64 +test.test_index.BytesTestCase.test_slice_bug7532 @ linux-x86_64 +test.test_index.BytesTestCase.test_subclasses @ linux-x86_64 +test.test_index.BytesTestCase.test_wrappers @ linux-x86_64 +test.test_index.ListTestCase.test_error @ linux-x86_64 +test.test_index.ListTestCase.test_index @ linux-x86_64 +test.test_index.ListTestCase.test_inplace_repeat @ linux-x86_64 +test.test_index.ListTestCase.test_repeat @ linux-x86_64 +test.test_index.ListTestCase.test_setdelitem @ linux-x86_64 +test.test_index.ListTestCase.test_slice @ linux-x86_64 +test.test_index.ListTestCase.test_slice_bug7532 @ linux-x86_64 +test.test_index.ListTestCase.test_subclasses @ linux-x86_64 +test.test_index.ListTestCase.test_wrappers @ linux-x86_64 +test.test_index.NewSeqTestCase.test_error @ linux-x86_64 +test.test_index.NewSeqTestCase.test_index @ linux-x86_64 +test.test_index.NewSeqTestCase.test_repeat @ linux-x86_64 +test.test_index.NewSeqTestCase.test_slice @ linux-x86_64 +test.test_index.NewSeqTestCase.test_slice_bug7532 @ linux-x86_64 +test.test_index.NewSeqTestCase.test_subclasses @ linux-x86_64 +test.test_index.NewSeqTestCase.test_wrappers @ linux-x86_64 +test.test_index.OverflowTestCase.test_getitem @ linux-x86_64 +test.test_index.OverflowTestCase.test_large_longs @ linux-x86_64 +test.test_index.OverflowTestCase.test_sequence_repeat @ linux-x86_64 +test.test_index.RangeTestCase.test_range @ linux-x86_64 +test.test_index.StringTestCase.test_error @ linux-x86_64 +test.test_index.StringTestCase.test_index @ linux-x86_64 +test.test_index.StringTestCase.test_repeat @ linux-x86_64 +test.test_index.StringTestCase.test_slice @ linux-x86_64 +test.test_index.StringTestCase.test_slice_bug7532 @ linux-x86_64 +test.test_index.StringTestCase.test_subclasses @ linux-x86_64 +test.test_index.StringTestCase.test_wrappers @ linux-x86_64 +test.test_index.TupleTestCase.test_error @ linux-x86_64 +test.test_index.TupleTestCase.test_index @ linux-x86_64 +test.test_index.TupleTestCase.test_repeat @ linux-x86_64 +test.test_index.TupleTestCase.test_slice @ linux-x86_64 +test.test_index.TupleTestCase.test_slice_bug7532 @ linux-x86_64 +test.test_index.TupleTestCase.test_subclasses @ linux-x86_64 +test.test_index.TupleTestCase.test_wrappers @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_inspect.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_inspect.txt new file mode 100644 index 0000000000..9828c57e4a --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_inspect.txt @@ -0,0 +1,231 @@ +test.test_inspect.test_inspect.IsTestBase.test__all__ @ linux-x86_64 +test.test_inspect.test_inspect.TestBlockComments.test_class_async_method @ linux-x86_64 +test.test_inspect.test_inspect.TestBlockComments.test_class_method @ linux-x86_64 +test.test_inspect.test_inspect.TestBlockComments.test_toplevel_class @ linux-x86_64 +test.test_inspect.test_inspect.TestBoundArguments.test_signature_bound_arguments_apply_defaults @ linux-x86_64 +test.test_inspect.test_inspect.TestBoundArguments.test_signature_bound_arguments_arguments_type @ linux-x86_64 +test.test_inspect.test_inspect.TestBoundArguments.test_signature_bound_arguments_equality @ linux-x86_64 +test.test_inspect.test_inspect.TestBoundArguments.test_signature_bound_arguments_pickle @ linux-x86_64 +test.test_inspect.test_inspect.TestBoundArguments.test_signature_bound_arguments_repr @ linux-x86_64 +test.test_inspect.test_inspect.TestBoundArguments.test_signature_bound_arguments_unhashable @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_class_decorator @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_class_definition_in_multiline_comment @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_class_definition_in_multiline_string_definition @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_class_inside_conditional @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_findsource_code_in_linecache @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_findsource_with_out_of_bounds_lineno @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_findsource_without_filename @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_getsource_on_method @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_method_in_dynamic_class @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_multiline_sig @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_multiple_children_classes @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_nested_class @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_nested_class_definition @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_nested_class_definition_indented_string @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_nested_class_definition_inside_async_function @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_nested_class_definition_inside_function @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_nested_func @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_one_liner_dedent_non_name @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_one_liner_followed_by_non_name @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_with_comment @ linux-x86_64 +test.test_inspect.test_inspect.TestBuggyCases.test_with_comment_instead_of_docstring @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_argspec_api_ignores_wrapped @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_DynamicClassAttribute @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_VirtualAttribute @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_VirtualAttribute_multi_classes @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_builtin_types @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_class_attrs_with_buggy_dir @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_metaclass_class_attribute @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_newstyle @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_classify_overrides_bool @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_get_annotations_with_stock_annotations @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_get_annotations_with_stringized_annotations @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_getfullargspec @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_getfullargspec_definition_order_preserved_on_kwonly @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_getfullargspec_signature_annos @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_getfullargspec_signature_attr @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_getmembers_VirtualAttribute @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_getmembers_descriptors @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_getmembers_method @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_getmembers_static @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_getmembers_with_buggy_dir @ linux-x86_64 +test.test_inspect.test_inspect.TestClassesAndFunctions.test_newstyle_mro @ linux-x86_64 +test.test_inspect.test_inspect.TestDecorators.test_replacing_decorator @ linux-x86_64 +test.test_inspect.test_inspect.TestFormatAnnotation.test_typing_replacement @ linux-x86_64 +test.test_inspect.test_inspect.TestGetClosureVars.test_builtins_as_dict @ linux-x86_64 +test.test_inspect.test_inspect.TestGetClosureVars.test_builtins_as_module @ linux-x86_64 +test.test_inspect.test_inspect.TestGetClosureVars.test_builtins_fallback @ linux-x86_64 +test.test_inspect.test_inspect.TestGetClosureVars.test_generator_closure @ linux-x86_64 +test.test_inspect.test_inspect.TestGetClosureVars.test_getclosurevars_empty @ linux-x86_64 +test.test_inspect.test_inspect.TestGetClosureVars.test_getclosurevars_error @ linux-x86_64 +test.test_inspect.test_inspect.TestGetClosureVars.test_method_closure @ linux-x86_64 +test.test_inspect.test_inspect.TestGetClosureVars.test_name_resolution @ linux-x86_64 +test.test_inspect.test_inspect.TestGetClosureVars.test_nonlocal_vars @ linux-x86_64 +test.test_inspect.test_inspect.TestGetCoroutineState.test_closed_after_immediate_exception @ linux-x86_64 +test.test_inspect.test_inspect.TestGetCoroutineState.test_easy_debugging @ linux-x86_64 +test.test_inspect.test_inspect.TestGetGeneratorState.test_closed_after_exhaustion @ linux-x86_64 +test.test_inspect.test_inspect.TestGetGeneratorState.test_closed_after_immediate_exception @ linux-x86_64 +test.test_inspect.test_inspect.TestGetGeneratorState.test_easy_debugging @ linux-x86_64 +test.test_inspect.test_inspect.TestGetGeneratorState.test_running @ linux-x86_64 +test.test_inspect.test_inspect.TestGetGeneratorState.test_suspended @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_basic @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_classAttribute @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_classVirtualAttribute @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_class_as_property @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_custom___getattr__ @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_custom___getattribute__ @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_custom_object_dict @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_descriptor @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_descriptor_raises_AttributeError @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_dict_as_property @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_inherited @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_inherited_classattribute @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_inherited_slots @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_instance_attr @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_metaclass @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_metaclass_dict_as_property @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_metaclass_with_descriptor @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_metaclass_with_metaclass_with_dict_as_property @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_module @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_mro_as_property @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_no_dict_no_slots @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_no_dict_no_slots_instance_member @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_property @ linux-x86_64 +test.test_inspect.test_inspect.TestGetattrStatic.test_slots @ linux-x86_64 +test.test_inspect.test_inspect.TestGetcallargsFunctions.test_multiple_features @ linux-x86_64 +test.test_inspect.test_inspect.TestGetcallargsFunctions.test_plain @ linux-x86_64 +test.test_inspect.test_inspect.TestGetcallargsFunctions.test_varargs @ linux-x86_64 +test.test_inspect.test_inspect.TestGetcallargsFunctions.test_varkw @ linux-x86_64 +test.test_inspect.test_inspect.TestGetcallargsFunctions.test_varkw_only @ linux-x86_64 +test.test_inspect.test_inspect.TestGetcallargsMethods.test_multiple_features @ linux-x86_64 +test.test_inspect.test_inspect.TestGetcallargsMethods.test_plain @ linux-x86_64 +test.test_inspect.test_inspect.TestGetcallargsMethods.test_varargs @ linux-x86_64 +test.test_inspect.test_inspect.TestGetcallargsMethods.test_varkw @ linux-x86_64 +test.test_inspect.test_inspect.TestGetcallargsMethods.test_varkw_only @ linux-x86_64 +test.test_inspect.test_inspect.TestGetcallargsUnboundMethods.test_multiple_features @ linux-x86_64 +test.test_inspect.test_inspect.TestGetcallargsUnboundMethods.test_plain @ linux-x86_64 +test.test_inspect.test_inspect.TestGetcallargsUnboundMethods.test_varargs @ linux-x86_64 +test.test_inspect.test_inspect.TestGetcallargsUnboundMethods.test_varkw @ linux-x86_64 +test.test_inspect.test_inspect.TestGetcallargsUnboundMethods.test_varkw_only @ linux-x86_64 +test.test_inspect.test_inspect.TestGetsourceInteractive.test_getclasses_interactive @ linux-x86_64 +test.test_inspect.test_inspect.TestGettingSourceOfToplevelFrames.test_range_toplevel_frame @ linux-x86_64 +test.test_inspect.test_inspect.TestGettingSourceOfToplevelFrames.test_range_traceback_toplevel_frame @ linux-x86_64 +test.test_inspect.test_inspect.TestInterpreterStack.test__all__ @ linux-x86_64 +test.test_inspect.test_inspect.TestInterpreterStack.test_abuse_done @ linux-x86_64 +test.test_inspect.test_inspect.TestInterpreterStack.test_frame @ linux-x86_64 +test.test_inspect.test_inspect.TestInterpreterStack.test_previous_frame @ linux-x86_64 +test.test_inspect.test_inspect.TestInterpreterStack.test_stack @ linux-x86_64 +test.test_inspect.test_inspect.TestInterpreterStack.test_trace @ linux-x86_64 +test.test_inspect.test_inspect.TestIsDataDescriptor.test_custom_descriptors @ linux-x86_64 +test.test_inspect.test_inspect.TestIsDataDescriptor.test_functions @ linux-x86_64 +test.test_inspect.test_inspect.TestIsDataDescriptor.test_property @ linux-x86_64 +test.test_inspect.test_inspect.TestIsDataDescriptor.test_slot @ linux-x86_64 +test.test_inspect.test_inspect.TestMain.test_builtins @ linux-x86_64 +test.test_inspect.test_inspect.TestMain.test_custom_getattr @ linux-x86_64 +test.test_inspect.test_inspect.TestMain.test_only_source @ linux-x86_64 +test.test_inspect.test_inspect.TestMain.test_qualname_source @ linux-x86_64 +test.test_inspect.test_inspect.TestNoEOL.test_class @ linux-x86_64 +test.test_inspect.test_inspect.TestOneliners.test_anonymous @ linux-x86_64 +test.test_inspect.test_inspect.TestOneliners.test_lambda_in_list @ linux-x86_64 +test.test_inspect.test_inspect.TestOneliners.test_manyargs @ linux-x86_64 +test.test_inspect.test_inspect.TestOneliners.test_oneline_lambda @ linux-x86_64 +test.test_inspect.test_inspect.TestOneliners.test_onelinefunc @ linux-x86_64 +test.test_inspect.test_inspect.TestOneliners.test_threeline_lambda @ linux-x86_64 +test.test_inspect.test_inspect.TestOneliners.test_twoline_indented_lambda @ linux-x86_64 +test.test_inspect.test_inspect.TestOneliners.test_twolinefunc @ linux-x86_64 +test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_equality @ linux-x86_64 +test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_hashable @ linux-x86_64 +test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_immutability @ linux-x86_64 +test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_kinds @ linux-x86_64 +test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_object @ linux-x86_64 +test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_positional_only @ linux-x86_64 +test.test_inspect.test_inspect.TestParameterObject.test_signature_parameter_replace @ linux-x86_64 +test.test_inspect.test_inspect.TestPredicates.test__all__ @ linux-x86_64 +test.test_inspect.test_inspect.TestPredicates.test_get_slot_members @ linux-x86_64 +test.test_inspect.test_inspect.TestPredicates.test_isabstract @ linux-x86_64 +test.test_inspect.test_inspect.TestPredicates.test_isabstract_during_init_subclass @ linux-x86_64 +test.test_inspect.test_inspect.TestPredicates.test_isclass @ linux-x86_64 +test.test_inspect.test_inspect.TestPredicates.test_isroutine @ linux-x86_64 +test.test_inspect.test_inspect.TestReload.test_getsource_reload @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_cleandoc @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_finddoc @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getclasses @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getcomments @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getdoc_inherited @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getfile @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getfile_broken_repr @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getfile_builtin_class @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getfile_builtin_function_or_method @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getfile_builtin_module @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getframeinfo_get_first_line @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getfunctions @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getmodule @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getmodule_file_not_found @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getmodule_recursion @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getsource @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getsource_on_code_object @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_getsourcefile @ linux-x86_64 +test.test_inspect.test_inspect.TestRetrievingSourceCode.test_proceed_with_fake_filename @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_args_and_kwargs @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_args_and_varargs @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_arguments @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_empty @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_just_args @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_just_kwargs @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_kwonly @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_positional_only @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_posonly_kwargs @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_var @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_vararg_name @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_varargs_order @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureBind.test_signature_bind_with_self_arg @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureDefinitions.test_python_function_override_signature @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signater_parameters_is_ordered @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_annotations_with_local_namespaces @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_definition_order_preserved_on_kwonly @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_equality @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_eval_str @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_from_callable_builtin_obj @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_from_callable_class @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_from_callable_python_obj @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_from_functionlike_object @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_functionlike_class @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_hashable @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_immutability @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_none_annotation @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_object @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_object_pickle @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_callable_objects @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_class @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_classmethod @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_complex_args @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_decorated @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_derived_classes @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_fake_partialmethod @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_generic_subclass @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_lambdas @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_mangled_parameters @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_method @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_mocks @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_noarg @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_non_function @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_noncallable_mocks @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_partial @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_partialmethod @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_staticmethod @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_subclass @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_wargs @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_on_wkwonly @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_replace_anno @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_replaced @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_str @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_str_positional_only @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_without_self @ linux-x86_64 +test.test_inspect.test_inspect.TestSignatureObject.test_signature_wrapped_bound_method @ linux-x86_64 +test.test_inspect.test_inspect.TestSignaturePrivateHelpers.test_signature_strip_non_python_syntax @ linux-x86_64 +test.test_inspect.test_inspect.TestUnwrap.test_cycle @ linux-x86_64 +test.test_inspect.test_inspect.TestUnwrap.test_recursion_limit @ linux-x86_64 +test.test_inspect.test_inspect.TestUnwrap.test_stop @ linux-x86_64 +test.test_inspect.test_inspect.TestUnwrap.test_unhashable @ linux-x86_64 +test.test_inspect.test_inspect.TestUnwrap.test_unwrap_one @ linux-x86_64 +test.test_inspect.test_inspect.TestUnwrap.test_unwrap_several @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_int.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_int.txt new file mode 100644 index 0000000000..a7c86661c0 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_int.txt @@ -0,0 +1,36 @@ +!test.test_int.IntStrDigitLimitsTests.test_denial_of_service_prevented_int_to_str @ linux-x86_64 +test.test_int.IntStrDigitLimitsTests.test_denial_of_service_prevented_str_to_int @ linux-x86_64 +test.test_int.IntStrDigitLimitsTests.test_disabled_limit @ linux-x86_64 +test.test_int.IntStrDigitLimitsTests.test_int_from_other_bases @ linux-x86_64 +test.test_int.IntStrDigitLimitsTests.test_max_str_digits @ linux-x86_64 +test.test_int.IntStrDigitLimitsTests.test_max_str_digits_edge_cases @ linux-x86_64 +test.test_int.IntStrDigitLimitsTests.test_power_of_two_bases_unlimited @ linux-x86_64 +test.test_int.IntStrDigitLimitsTests.test_sign_not_counted @ linux-x86_64 +test.test_int.IntStrDigitLimitsTests.test_underscores_ignored @ linux-x86_64 +!test.test_int.IntSubclassStrDigitLimitsTests.test_denial_of_service_prevented_int_to_str @ linux-x86_64 +test.test_int.IntSubclassStrDigitLimitsTests.test_denial_of_service_prevented_str_to_int @ linux-x86_64 +test.test_int.IntSubclassStrDigitLimitsTests.test_disabled_limit @ linux-x86_64 +test.test_int.IntSubclassStrDigitLimitsTests.test_int_from_other_bases @ linux-x86_64 +test.test_int.IntSubclassStrDigitLimitsTests.test_max_str_digits @ linux-x86_64 +test.test_int.IntSubclassStrDigitLimitsTests.test_max_str_digits_edge_cases @ linux-x86_64 +test.test_int.IntSubclassStrDigitLimitsTests.test_power_of_two_bases_unlimited @ linux-x86_64 +test.test_int.IntSubclassStrDigitLimitsTests.test_sign_not_counted @ linux-x86_64 +test.test_int.IntSubclassStrDigitLimitsTests.test_underscores_ignored @ linux-x86_64 +test.test_int.IntTestCases.test_basic @ linux-x86_64 +test.test_int.IntTestCases.test_error_message @ linux-x86_64 +test.test_int.IntTestCases.test_int_base_bad_types @ linux-x86_64 +test.test_int.IntTestCases.test_int_base_indexable @ linux-x86_64 +test.test_int.IntTestCases.test_int_base_limits @ linux-x86_64 +test.test_int.IntTestCases.test_int_memoryview @ linux-x86_64 +test.test_int.IntTestCases.test_int_returns_int_subclass @ linux-x86_64 +test.test_int.IntTestCases.test_int_subclass_with_index @ linux-x86_64 +test.test_int.IntTestCases.test_int_subclass_with_int @ linux-x86_64 +test.test_int.IntTestCases.test_intconversion @ linux-x86_64 +test.test_int.IntTestCases.test_invalid_signs @ linux-x86_64 +test.test_int.IntTestCases.test_issue31619 @ linux-x86_64 +test.test_int.IntTestCases.test_keyword_args @ linux-x86_64 +test.test_int.IntTestCases.test_no_args @ linux-x86_64 +test.test_int.IntTestCases.test_non_numeric_input_types @ linux-x86_64 +test.test_int.IntTestCases.test_string_float @ linux-x86_64 +test.test_int.IntTestCases.test_underscores @ linux-x86_64 +test.test_int.IntTestCases.test_unicode @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_int_literal.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_int_literal.txt new file mode 100644 index 0000000000..6228e00732 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_int_literal.txt @@ -0,0 +1,6 @@ +test.test_int_literal.TestHexOctBin.test_bin_baseline @ linux-x86_64 +test.test_int_literal.TestHexOctBin.test_bin_unsigned @ linux-x86_64 +test.test_int_literal.TestHexOctBin.test_hex_baseline @ linux-x86_64 +test.test_int_literal.TestHexOctBin.test_hex_unsigned @ linux-x86_64 +test.test_int_literal.TestHexOctBin.test_oct_baseline @ linux-x86_64 +test.test_int_literal.TestHexOctBin.test_oct_unsigned @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_io.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_io.txt new file mode 100644 index 0000000000..fba4892118 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_io.txt @@ -0,0 +1,523 @@ +test.test_io.CBufferedRWPairTest.test_close_and_closed @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_constructor @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_constructor_max_buffer_size_removal @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_constructor_with_not_readable @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_constructor_with_not_writeable @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_detach @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_isatty @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_peek @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_read @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_read1 @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_readable @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_reader_close_error_on_close @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_reader_writer_close_error_on_close @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_readinto @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_readlines @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_seekable @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_uninitialized @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_weakref_clearing @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_write @ linux-x86_64 +test.test_io.CBufferedRWPairTest.test_writeable @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_args_error @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_buffering @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_close_error_on_close @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_constructor @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_context_manager @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_detach @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_detach_flush @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_fileno @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_flush @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_flush_and_peek @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_flush_and_read @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_flush_and_readinto @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_flush_and_write @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_flush_error_on_close @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_interleaved_read_write @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_interleaved_readline_write @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_invalid_args @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_max_buffer_size_removal @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_misbehaved_io @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_multi_close @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_no_extraneous_read @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_nonnormalized_close_error_on_close @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_read @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_read1 @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_read1_arbitrary @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_read_all @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_read_and_write @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_read_non_blocking @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_read_on_closed @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_read_past_eof @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_readinto @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_readinto1 @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_readinto1_array @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_readinto_array @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_readlines @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_readonly_attributes @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_repr @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_seek_and_tell @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_slow_close_from_thread @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_threads @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_truncate @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_truncate_after_read_or_write @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_truncate_after_write @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_uninitialized @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_write @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_write_after_readahead @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_write_and_rewind @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_write_error_on_close @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_write_non_blocking @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_write_overflow @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_write_rewind_write @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_writelines @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_writelines_error @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_writelines_userlist @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_writes @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_writes_and_flushes @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_writes_and_peek @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_writes_and_read1s @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_writes_and_readintos @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_writes_and_reads @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_writes_and_seeks @ linux-x86_64 +test.test_io.CBufferedRandomTest.test_writes_and_truncates @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_args_error @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_bad_readinto_type @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_bad_readinto_value @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_buffering @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_close_error_on_close @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_constructor @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_context_manager @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_detach @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_fileno @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_flush_error_on_close @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_initialization @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_invalid_args @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_misbehaved_io @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_misbehaved_io_read @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_multi_close @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_no_extraneous_read @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_nonnormalized_close_error_on_close @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_read @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_read1 @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_read1_arbitrary @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_read_all @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_read_non_blocking @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_read_on_closed @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_read_past_eof @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_readinto @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_readinto1 @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_readinto1_array @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_readinto_array @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_readlines @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_readonly_attributes @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_repr @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_threads @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_truncate_on_read_only @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_uninitialized @ linux-x86_64 +test.test_io.CBufferedReaderTest.test_unseekable @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_args_error @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_close_error_on_close @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_constructor @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_context_manager @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_detach @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_detach_flush @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_fileno @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_flush @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_flush_error_on_close @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_initialization @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_invalid_args @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_max_buffer_size_removal @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_misbehaved_io @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_multi_close @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_nonnormalized_close_error_on_close @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_readonly_attributes @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_repr @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_slow_close_from_thread @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_threads @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_truncate @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_truncate_after_write @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_uninitialized @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_unseekable @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_write @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_write_and_rewind @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_write_error_on_close @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_write_non_blocking @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_write_overflow @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_writelines @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_writelines_error @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_writelines_userlist @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_writes @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_writes_and_flushes @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_writes_and_seeks @ linux-x86_64 +test.test_io.CBufferedWriterTest.test_writes_and_truncates @ linux-x86_64 +test.test_io.CIOTest.test_BufferedIOBase_readinto @ linux-x86_64 +test.test_io.CIOTest.test_RawIOBase_read @ linux-x86_64 +test.test_io.CIOTest.test_RawIOBase_readall @ linux-x86_64 +test.test_io.CIOTest.test_append_mode_tell @ linux-x86_64 +test.test_io.CIOTest.test_array_writes @ linux-x86_64 +test.test_io.CIOTest.test_bad_opener_negative_1 @ linux-x86_64 +test.test_io.CIOTest.test_bad_opener_other_negative @ linux-x86_64 +test.test_io.CIOTest.test_buffered_file_io @ linux-x86_64 +test.test_io.CIOTest.test_buffered_readinto_mixin @ linux-x86_64 +test.test_io.CIOTest.test_close_assert @ linux-x86_64 +test.test_io.CIOTest.test_close_flushes @ linux-x86_64 +test.test_io.CIOTest.test_closefd @ linux-x86_64 +test.test_io.CIOTest.test_closefd_attr @ linux-x86_64 +test.test_io.CIOTest.test_fileio_closefd @ linux-x86_64 +test.test_io.CIOTest.test_flush_error_on_close @ linux-x86_64 +test.test_io.CIOTest.test_fspath_support @ linux-x86_64 +test.test_io.CIOTest.test_invalid_newline @ linux-x86_64 +test.test_io.CIOTest.test_invalid_operations @ linux-x86_64 +test.test_io.CIOTest.test_large_file_ops @ linux-x86_64 +test.test_io.CIOTest.test_multi_close @ linux-x86_64 +test.test_io.CIOTest.test_next_nonsizeable @ linux-x86_64 +test.test_io.CIOTest.test_no_closefd_with_filename @ linux-x86_64 +test.test_io.CIOTest.test_nonbuffered_textio @ linux-x86_64 +test.test_io.CIOTest.test_open_handles_NUL_chars @ linux-x86_64 +test.test_io.CIOTest.test_opener @ linux-x86_64 +test.test_io.CIOTest.test_opener_invalid_fd @ linux-x86_64 +test.test_io.CIOTest.test_optional_abilities @ linux-x86_64 +test.test_io.CIOTest.test_raw_bytes_io @ linux-x86_64 +test.test_io.CIOTest.test_raw_file_io @ linux-x86_64 +test.test_io.CIOTest.test_read_closed @ linux-x86_64 +test.test_io.CIOTest.test_readline @ linux-x86_64 +test.test_io.CIOTest.test_readline_nonsizeable @ linux-x86_64 +test.test_io.CIOTest.test_types_have_dict @ linux-x86_64 +test.test_io.CIOTest.test_with_open @ linux-x86_64 +test.test_io.CIncrementalNewlineDecoderTest.test_newline_bytes @ linux-x86_64 +test.test_io.CIncrementalNewlineDecoderTest.test_newline_decoder @ linux-x86_64 +test.test_io.CIncrementalNewlineDecoderTest.test_translate @ linux-x86_64 +test.test_io.CMiscIOTest.test___all__ @ linux-x86_64 +test.test_io.CMiscIOTest.test_abc_inheritance @ linux-x86_64 +test.test_io.CMiscIOTest.test_abc_inheritance_official @ linux-x86_64 +test.test_io.CMiscIOTest.test_abcs @ linux-x86_64 +test.test_io.CMiscIOTest.test_attributes @ linux-x86_64 +test.test_io.CMiscIOTest.test_check_encoding_warning @ linux-x86_64 +test.test_io.CMiscIOTest.test_create_fail @ linux-x86_64 +test.test_io.CMiscIOTest.test_create_writes @ linux-x86_64 +test.test_io.CMiscIOTest.test_daemon_threads_shutdown_stderr_deadlock @ linux-x86_64 +test.test_io.CMiscIOTest.test_daemon_threads_shutdown_stdout_deadlock @ linux-x86_64 +test.test_io.CMiscIOTest.test_io_after_close @ linux-x86_64 +test.test_io.CMiscIOTest.test_nonblock_pipe_write_bigbuf @ linux-x86_64 +test.test_io.CMiscIOTest.test_nonblock_pipe_write_smallbuf @ linux-x86_64 +test.test_io.CMiscIOTest.test_open_allargs @ linux-x86_64 +test.test_io.CMiscIOTest.test_open_pipe_with_append @ linux-x86_64 +test.test_io.CMiscIOTest.test_pickling @ linux-x86_64 +test.test_io.CMiscIOTest.test_readinto_buffer_overflow @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_basic_io @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_bufio_write_through @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_close_error_on_close @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_constructor @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_default_encoding @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_del__CHUNK_SIZE_SystemError @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_detach @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_encoding @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_encoding_errors_reading @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_encoding_errors_writing @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_error_through_destructor @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_errors_property @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_flush_error_on_close @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_illegal_decoder @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_illegal_encoder @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_initialization @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_internal_buffer_size @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_issue1395_1 @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_issue1395_2 @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_issue1395_3 @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_issue1395_4 @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_issue1395_5 @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_issue2282 @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_issue22849 @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_issue25862 @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_line_buffering @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_multi_close @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_multibyte_seek_and_tell @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_newlines @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_newlines_input @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_newlines_output @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_non_text_encoding_codecs_are_rejected @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_nonnormalized_close_error_on_close @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_rawio @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_rawio_write_through @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_read_by_chunk @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_read_byteslike @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_read_nonbytes @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_read_one_by_one @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_readlines @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_readonly_attributes @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_reconfigure_defaults @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_reconfigure_encoding_read @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_reconfigure_line_buffering @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_reconfigure_newline @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_reconfigure_write @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_reconfigure_write_fromascii @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_reconfigure_write_non_seekable @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_reconfigure_write_through @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_repr @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_seek_and_tell @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_seeking @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_seeking_too @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_telling @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_threads_write @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_uninitialized @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_unreadable @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_unseekable @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_writelines @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_writelines_error @ linux-x86_64 +test.test_io.CTextIOWrapperTest.test_writelines_userlist @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_close_and_closed @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_constructor @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_constructor_max_buffer_size_removal @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_constructor_with_not_readable @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_constructor_with_not_writeable @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_detach @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_isatty @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_peek @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_read @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_read1 @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_readable @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_reader_close_error_on_close @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_reader_writer_close_error_on_close @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_readinto @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_readlines @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_seekable @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_uninitialized @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_weakref_clearing @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_write @ linux-x86_64 +test.test_io.PyBufferedRWPairTest.test_writeable @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_buffering @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_close_error_on_close @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_constructor @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_context_manager @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_detach @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_detach_flush @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_fileno @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_flush @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_flush_and_peek @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_flush_and_read @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_flush_and_readinto @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_flush_and_write @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_flush_error_on_close @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_interleaved_read_write @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_interleaved_readline_write @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_invalid_args @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_max_buffer_size_removal @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_misbehaved_io @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_multi_close @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_no_extraneous_read @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_nonnormalized_close_error_on_close @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_read @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_read1 @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_read1_arbitrary @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_read_all @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_read_and_write @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_read_non_blocking @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_read_on_closed @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_read_past_eof @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_readinto @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_readinto1 @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_readinto1_array @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_readinto_array @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_readlines @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_readonly_attributes @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_repr @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_seek_and_tell @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_slow_close_from_thread @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_threads @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_truncate @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_truncate_after_read_or_write @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_truncate_after_write @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_uninitialized @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_write @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_write_after_readahead @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_write_and_rewind @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_write_error_on_close @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_write_non_blocking @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_write_overflow @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_write_rewind_write @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writelines @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writelines_error @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writelines_userlist @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writes @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writes_and_flushes @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writes_and_peek @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writes_and_read1s @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writes_and_readintos @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writes_and_reads @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writes_and_seeks @ linux-x86_64 +test.test_io.PyBufferedRandomTest.test_writes_and_truncates @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_buffering @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_close_error_on_close @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_constructor @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_context_manager @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_detach @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_fileno @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_flush_error_on_close @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_invalid_args @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_misbehaved_io @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_multi_close @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_no_extraneous_read @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_nonnormalized_close_error_on_close @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_read @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_read1 @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_read1_arbitrary @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_read_all @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_read_non_blocking @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_read_on_closed @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_read_past_eof @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_readinto @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_readinto1 @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_readinto1_array @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_readinto_array @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_readlines @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_readonly_attributes @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_repr @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_threads @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_truncate_on_read_only @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_uninitialized @ linux-x86_64 +test.test_io.PyBufferedReaderTest.test_unseekable @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_close_error_on_close @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_constructor @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_context_manager @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_detach @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_detach_flush @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_fileno @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_flush @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_flush_error_on_close @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_invalid_args @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_max_buffer_size_removal @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_misbehaved_io @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_multi_close @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_nonnormalized_close_error_on_close @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_readonly_attributes @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_repr @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_slow_close_from_thread @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_threads @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_truncate @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_truncate_after_write @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_uninitialized @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_unseekable @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_write @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_write_and_rewind @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_write_error_on_close @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_write_non_blocking @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_write_overflow @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_writelines @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_writelines_error @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_writelines_userlist @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_writes @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_writes_and_flushes @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_writes_and_seeks @ linux-x86_64 +test.test_io.PyBufferedWriterTest.test_writes_and_truncates @ linux-x86_64 +test.test_io.PyIOTest.test_BufferedIOBase_readinto @ linux-x86_64 +test.test_io.PyIOTest.test_RawIOBase_read @ linux-x86_64 +test.test_io.PyIOTest.test_RawIOBase_readall @ linux-x86_64 +test.test_io.PyIOTest.test_append_mode_tell @ linux-x86_64 +test.test_io.PyIOTest.test_array_writes @ linux-x86_64 +test.test_io.PyIOTest.test_bad_opener_negative_1 @ linux-x86_64 +test.test_io.PyIOTest.test_bad_opener_other_negative @ linux-x86_64 +test.test_io.PyIOTest.test_buffered_file_io @ linux-x86_64 +test.test_io.PyIOTest.test_buffered_readinto_mixin @ linux-x86_64 +test.test_io.PyIOTest.test_close_assert @ linux-x86_64 +test.test_io.PyIOTest.test_close_flushes @ linux-x86_64 +test.test_io.PyIOTest.test_closefd @ linux-x86_64 +test.test_io.PyIOTest.test_closefd_attr @ linux-x86_64 +test.test_io.PyIOTest.test_fileio_closefd @ linux-x86_64 +test.test_io.PyIOTest.test_flush_error_on_close @ linux-x86_64 +test.test_io.PyIOTest.test_fspath_support @ linux-x86_64 +test.test_io.PyIOTest.test_invalid_newline @ linux-x86_64 +test.test_io.PyIOTest.test_invalid_operations @ linux-x86_64 +test.test_io.PyIOTest.test_large_file_ops @ linux-x86_64 +test.test_io.PyIOTest.test_multi_close @ linux-x86_64 +test.test_io.PyIOTest.test_next_nonsizeable @ linux-x86_64 +test.test_io.PyIOTest.test_no_closefd_with_filename @ linux-x86_64 +test.test_io.PyIOTest.test_nonbuffered_textio @ linux-x86_64 +test.test_io.PyIOTest.test_open_handles_NUL_chars @ linux-x86_64 +test.test_io.PyIOTest.test_opener @ linux-x86_64 +test.test_io.PyIOTest.test_opener_invalid_fd @ linux-x86_64 +test.test_io.PyIOTest.test_optional_abilities @ linux-x86_64 +test.test_io.PyIOTest.test_raw_bytes_io @ linux-x86_64 +test.test_io.PyIOTest.test_raw_file_io @ linux-x86_64 +test.test_io.PyIOTest.test_read_closed @ linux-x86_64 +test.test_io.PyIOTest.test_readline @ linux-x86_64 +test.test_io.PyIOTest.test_readline_nonsizeable @ linux-x86_64 +test.test_io.PyIOTest.test_types_have_dict @ linux-x86_64 +test.test_io.PyIOTest.test_with_open @ linux-x86_64 +test.test_io.PyIncrementalNewlineDecoderTest.test_newline_bytes @ linux-x86_64 +test.test_io.PyIncrementalNewlineDecoderTest.test_newline_decoder @ linux-x86_64 +test.test_io.PyIncrementalNewlineDecoderTest.test_translate @ linux-x86_64 +test.test_io.PyMiscIOTest.test___all__ @ linux-x86_64 +test.test_io.PyMiscIOTest.test_abc_inheritance @ linux-x86_64 +test.test_io.PyMiscIOTest.test_abc_inheritance_official @ linux-x86_64 +test.test_io.PyMiscIOTest.test_abcs @ linux-x86_64 +test.test_io.PyMiscIOTest.test_attributes @ linux-x86_64 +test.test_io.PyMiscIOTest.test_check_encoding_warning @ linux-x86_64 +test.test_io.PyMiscIOTest.test_create_fail @ linux-x86_64 +test.test_io.PyMiscIOTest.test_create_writes @ linux-x86_64 +test.test_io.PyMiscIOTest.test_io_after_close @ linux-x86_64 +test.test_io.PyMiscIOTest.test_nonblock_pipe_write_bigbuf @ linux-x86_64 +test.test_io.PyMiscIOTest.test_nonblock_pipe_write_smallbuf @ linux-x86_64 +test.test_io.PyMiscIOTest.test_open_allargs @ linux-x86_64 +test.test_io.PyMiscIOTest.test_open_pipe_with_append @ linux-x86_64 +test.test_io.PyMiscIOTest.test_pickling @ linux-x86_64 +test.test_io.PyMiscIOTest.test_removed_u_mode @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_basic_io @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_bufio_write_through @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_close_error_on_close @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_constructor @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_default_encoding @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_detach @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_encoding @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_encoding_errors_reading @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_encoding_errors_writing @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_error_through_destructor @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_errors_property @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_flush_error_on_close @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_illegal_decoder @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_illegal_encoder @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_issue1395_1 @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_issue1395_2 @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_issue1395_3 @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_issue1395_4 @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_issue1395_5 @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_issue2282 @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_issue22849 @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_issue25862 @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_line_buffering @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_multi_close @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_multibyte_seek_and_tell @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_newlines @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_newlines_input @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_newlines_output @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_non_text_encoding_codecs_are_rejected @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_nonnormalized_close_error_on_close @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_rawio @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_rawio_write_through @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_read_by_chunk @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_read_byteslike @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_read_nonbytes @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_read_one_by_one @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_readlines @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_readonly_attributes @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_reconfigure_defaults @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_reconfigure_encoding_read @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_reconfigure_errors @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_reconfigure_line_buffering @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_reconfigure_newline @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_reconfigure_write @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_reconfigure_write_fromascii @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_reconfigure_write_non_seekable @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_reconfigure_write_through @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_repr @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_seek_and_tell @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_seeking @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_seeking_too @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_telling @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_threads_write @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_uninitialized @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_unreadable @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_unseekable @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_writelines @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_writelines_error @ linux-x86_64 +test.test_io.PyTextIOWrapperTest.test_writelines_userlist @ linux-x86_64 +test.test_io.StatefulIncrementalDecoderTest.test_decoder @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ipaddress.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ipaddress.txt new file mode 100644 index 0000000000..57e91a4198 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ipaddress.txt @@ -0,0 +1,204 @@ +test.test_ipaddress.AddressTestCase_v4.test_bad_address_split @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v4.test_bad_packed_length @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v4.test_empty_address @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v4.test_empty_octet @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v4.test_floats_rejected @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v4.test_format @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v4.test_int @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v4.test_invalid_characters @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v4.test_large_ints_rejected @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v4.test_leading_zeros @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v4.test_negative_ints_rejected @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v4.test_network_passed_as_address @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v4.test_not_an_index_issue15559 @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v4.test_octet_length @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v4.test_octet_limit @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v4.test_packed @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v4.test_pickle @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v4.test_weakref @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_leading_colon @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_not_enough_parts @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_repeated_double_colon @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_too_many_colons @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_too_many_parts @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_too_many_parts_with_double_colon @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_bad_address_split_v6_trailing_colon @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_bad_packed_length @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_bad_v4_part_in @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_blank_scope_id @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_copy @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_empty_address @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_floats_rejected @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_format @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_int @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_invalid_characters @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_invalid_scope_id_with_percent @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_large_ints_rejected @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_leading_zeros @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_negative_ints_rejected @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_network_passed_as_address @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_not_an_index_issue15559 @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_packed @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_part_length @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_pickle @ linux-x86_64 +test.test_ipaddress.AddressTestCase_v6.test_weakref @ linux-x86_64 +test.test_ipaddress.ComparisonTests.test_containment @ linux-x86_64 +test.test_ipaddress.ComparisonTests.test_foreign_type_equality @ linux-x86_64 +test.test_ipaddress.ComparisonTests.test_foreign_type_ordering @ linux-x86_64 +test.test_ipaddress.ComparisonTests.test_incompatible_versions @ linux-x86_64 +test.test_ipaddress.ComparisonTests.test_mixed_type_equality @ linux-x86_64 +test.test_ipaddress.ComparisonTests.test_mixed_type_key @ linux-x86_64 +test.test_ipaddress.ComparisonTests.test_mixed_type_ordering @ linux-x86_64 +test.test_ipaddress.ComparisonTests.test_same_type_equality @ linux-x86_64 +test.test_ipaddress.ComparisonTests.test_same_type_ordering @ linux-x86_64 +test.test_ipaddress.ComparisonTests.test_scoped_ipv6_equality @ linux-x86_64 +test.test_ipaddress.ComparisonTests.test_v4_with_v6_scoped_equality @ linux-x86_64 +test.test_ipaddress.FactoryFunctionErrors.test_ip_address @ linux-x86_64 +test.test_ipaddress.FactoryFunctionErrors.test_ip_interface @ linux-x86_64 +test.test_ipaddress.FactoryFunctionErrors.test_ip_network @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v4.test_address_errors @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v4.test_bad_packed_length @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v4.test_empty_address @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v4.test_floats_rejected @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v4.test_int @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v4.test_large_ints_rejected @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v4.test_leading_zeros @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v4.test_negative_ints_rejected @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v4.test_netmask_errors @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v4.test_netmask_in_tuple_errors @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v4.test_no_mask @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v4.test_not_an_index_issue15559 @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v4.test_packed @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v4.test_pickle @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v4.test_split_netmask @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v4.test_valid_netmask @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v6.test_address_errors @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v6.test_bad_packed_length @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v6.test_blank_scope_id @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v6.test_empty_address @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v6.test_floats_rejected @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v6.test_int @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v6.test_invalid_scope_id_with_percent @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v6.test_large_ints_rejected @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v6.test_leading_zeros @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v6.test_negative_ints_rejected @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v6.test_netmask_errors @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v6.test_netmask_in_tuple_errors @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v6.test_no_mask @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v6.test_not_an_index_issue15559 @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v6.test_packed @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v6.test_pickle @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v6.test_split_netmask @ linux-x86_64 +test.test_ipaddress.InterfaceTestCase_v6.test_valid_netmask @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testAddrExclude @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testAddressComparison @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testAddressIntMath @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testCollapsing @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testCompressIPv6Address @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testContains @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testCopyConstructor @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testEmbeddedIpv4 @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testEqual @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testExplodeShortHandIpStr @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testFancySubnetting @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testForceVersion @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testGetBroadcast @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testGetIp @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testGetNetmask @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testGetNetwork @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testGetNum_Addresses @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testGetPrefixlen @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testGetScopeId @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testGetSubnetForSingle128 @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testGetSubnetForSingle32 @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testGetSubnets @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testGetSubnets3 @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testGetSupernet @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testGetSupernet3 @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testGetSupernet4 @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testGetitem @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testHash @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testHosts @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testIPBases @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testIPVersion @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testIPv4Net @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testIPv4NetworkHelpers @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testIPv4Tuple @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testIPv6AddressTooLarge @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testIPv6NetworkHelpers @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testIPv6Tuple @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testIntRepresentation @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testInterfaceComparison @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testInternals @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testInvalidIntToBytes @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testIpFromInt @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testIpFromPacked @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testIpType @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testIpv4Mapped @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testIpv4MappedPrivateCheck @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testMaxPrefixLength @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testNetworkComparison @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testNetworkElementCaching @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testNotEqual @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testNth @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testOverlaps @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testPacked @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testPrivateNetworks @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testRepr @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testReservedIpv4 @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testReservedIpv6 @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testReversePointer @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testSlash0Constructor @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testSlash128Constructor @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testSlash32Constructor @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testStrictNetworks @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testSubnet2 @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testSubnetFailsForLargeCidrDiff @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testSubnetFailsForNegativeCidrDiff @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testSummarizing @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testSupernetFailsForLargeCidrDiff @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testTeredo @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testV4HashIsNotConstant @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testV6HashIsNotConstant @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testWithStar @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testZeroNetmask @ linux-x86_64 +test.test_ipaddress.IpaddrUnitTest.testsixtofour @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_address_errors @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_bad_packed_length @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_empty_address @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_floats_rejected @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_int @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_large_ints_rejected @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_leading_zeros @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_negative_ints_rejected @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_netmask_errors @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_netmask_in_tuple_errors @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_no_mask @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_not_an_index_issue15559 @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_packed @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_pickle @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_split_netmask @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_subnet_of @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_subnet_of_mixed_types @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_supernet_of @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v4.test_valid_netmask @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_address_errors @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_bad_packed_length @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_blank_scope_id @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_empty_address @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_floats_rejected @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_int @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_invalid_scope_id_with_percent @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_large_ints_rejected @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_leading_zeros @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_negative_ints_rejected @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_netmask_errors @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_netmask_in_tuple_errors @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_no_mask @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_not_an_index_issue15559 @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_packed @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_pickle @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_split_netmask @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_subnet_of @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_supernet_of @ linux-x86_64 +test.test_ipaddress.NetworkTestCase_v6.test_valid_netmask @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_isinstance.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_isinstance.txt new file mode 100644 index 0000000000..25d29c2028 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_isinstance.txt @@ -0,0 +1,22 @@ +test.test_isinstance.TestIsInstanceExceptions.test_bases_raises_other_than_attribute_error @ linux-x86_64 +test.test_isinstance.TestIsInstanceExceptions.test_class_has_no_bases @ linux-x86_64 +test.test_isinstance.TestIsInstanceExceptions.test_dont_mask_non_attribute_error @ linux-x86_64 +test.test_isinstance.TestIsInstanceExceptions.test_isinstance_dont_mask_non_attribute_error @ linux-x86_64 +test.test_isinstance.TestIsInstanceExceptions.test_mask_attribute_error @ linux-x86_64 +test.test_isinstance.TestIsInstanceIsSubclass.test_infinite_cycle_in_bases @ linux-x86_64 +test.test_isinstance.TestIsInstanceIsSubclass.test_infinite_recursion_in_bases @ linux-x86_64 +test.test_isinstance.TestIsInstanceIsSubclass.test_infinitely_many_bases @ linux-x86_64 +test.test_isinstance.TestIsInstanceIsSubclass.test_isinstance_abstract @ linux-x86_64 +test.test_isinstance.TestIsInstanceIsSubclass.test_isinstance_normal @ linux-x86_64 +test.test_isinstance.TestIsInstanceIsSubclass.test_isinstance_recursion_limit @ linux-x86_64 +test.test_isinstance.TestIsInstanceIsSubclass.test_isinstance_with_or_union @ linux-x86_64 +test.test_isinstance.TestIsInstanceIsSubclass.test_issubclass_refcount_handling @ linux-x86_64 +test.test_isinstance.TestIsInstanceIsSubclass.test_subclass_abstract @ linux-x86_64 +test.test_isinstance.TestIsInstanceIsSubclass.test_subclass_normal @ linux-x86_64 +test.test_isinstance.TestIsInstanceIsSubclass.test_subclass_recursion_limit @ linux-x86_64 +test.test_isinstance.TestIsInstanceIsSubclass.test_subclass_tuple @ linux-x86_64 +test.test_isinstance.TestIsInstanceIsSubclass.test_subclass_with_union @ linux-x86_64 +test.test_isinstance.TestIsSubclassExceptions.test_dont_mask_non_attribute_error @ linux-x86_64 +test.test_isinstance.TestIsSubclassExceptions.test_dont_mask_non_attribute_error_in_cls_arg @ linux-x86_64 +test.test_isinstance.TestIsSubclassExceptions.test_mask_attribute_error @ linux-x86_64 +test.test_isinstance.TestIsSubclassExceptions.test_mask_attribute_error_in_cls_arg @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_iter.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_iter.txt new file mode 100644 index 0000000000..f613726e1b --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_iter.txt @@ -0,0 +1,51 @@ +test.test_iter.TestCase.test_3720 @ linux-x86_64 +test.test_iter.TestCase.test_builtin_filter @ linux-x86_64 +test.test_iter.TestCase.test_builtin_list @ linux-x86_64 +test.test_iter.TestCase.test_builtin_map @ linux-x86_64 +test.test_iter.TestCase.test_builtin_max_min @ linux-x86_64 +test.test_iter.TestCase.test_builtin_tuple @ linux-x86_64 +test.test_iter.TestCase.test_builtin_zip @ linux-x86_64 +test.test_iter.TestCase.test_countOf @ linux-x86_64 +test.test_iter.TestCase.test_error_iter @ linux-x86_64 +test.test_iter.TestCase.test_exception_function @ linux-x86_64 +test.test_iter.TestCase.test_exception_sequence @ linux-x86_64 +test.test_iter.TestCase.test_extending_list_with_iterator_does_not_segfault @ linux-x86_64 +test.test_iter.TestCase.test_in_and_not_in @ linux-x86_64 +test.test_iter.TestCase.test_indexOf @ linux-x86_64 +test.test_iter.TestCase.test_iter_basic @ linux-x86_64 +test.test_iter.TestCase.test_iter_big_range @ linux-x86_64 +test.test_iter.TestCase.test_iter_callable @ linux-x86_64 +test.test_iter.TestCase.test_iter_class_for @ linux-x86_64 +test.test_iter.TestCase.test_iter_class_iter @ linux-x86_64 +test.test_iter.TestCase.test_iter_dict @ linux-x86_64 +test.test_iter.TestCase.test_iter_empty @ linux-x86_64 +test.test_iter.TestCase.test_iter_file @ linux-x86_64 +test.test_iter.TestCase.test_iter_for_loop @ linux-x86_64 +test.test_iter.TestCase.test_iter_function @ linux-x86_64 +test.test_iter.TestCase.test_iter_function_stop @ linux-x86_64 +test.test_iter.TestCase.test_iter_idempotency @ linux-x86_64 +test.test_iter.TestCase.test_iter_independence @ linux-x86_64 +test.test_iter.TestCase.test_iter_neg_setstate @ linux-x86_64 +test.test_iter.TestCase.test_iter_range @ linux-x86_64 +test.test_iter.TestCase.test_iter_string @ linux-x86_64 +test.test_iter.TestCase.test_iter_tuple @ linux-x86_64 +test.test_iter.TestCase.test_mutating_seq_class_exhausted_iter @ linux-x86_64 +test.test_iter.TestCase.test_mutating_seq_class_iter_pickle @ linux-x86_64 +test.test_iter.TestCase.test_nested_comprehensions_for @ linux-x86_64 +test.test_iter.TestCase.test_nested_comprehensions_iter @ linux-x86_64 +test.test_iter.TestCase.test_new_style_iter_class @ linux-x86_64 +test.test_iter.TestCase.test_seq_class_for @ linux-x86_64 +test.test_iter.TestCase.test_seq_class_iter @ linux-x86_64 +test.test_iter.TestCase.test_sinkstate_callable @ linux-x86_64 +test.test_iter.TestCase.test_sinkstate_dict @ linux-x86_64 +test.test_iter.TestCase.test_sinkstate_enumerate @ linux-x86_64 +test.test_iter.TestCase.test_sinkstate_list @ linux-x86_64 +test.test_iter.TestCase.test_sinkstate_range @ linux-x86_64 +test.test_iter.TestCase.test_sinkstate_sequence @ linux-x86_64 +test.test_iter.TestCase.test_sinkstate_string @ linux-x86_64 +test.test_iter.TestCase.test_sinkstate_tuple @ linux-x86_64 +test.test_iter.TestCase.test_sinkstate_yield @ linux-x86_64 +test.test_iter.TestCase.test_stop_sequence @ linux-x86_64 +test.test_iter.TestCase.test_unicode_join_endcase @ linux-x86_64 +test.test_iter.TestCase.test_unpack_iter @ linux-x86_64 +test.test_iter.TestCase.test_writelines @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_iterlen.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_iterlen.txt new file mode 100644 index 0000000000..42c583084e --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_iterlen.txt @@ -0,0 +1,21 @@ +test.test_iterlen.TestDeque.test_immutable_during_iteration @ linux-x86_64 +test.test_iterlen.TestDeque.test_invariant @ linux-x86_64 +test.test_iterlen.TestDequeReversed.test_immutable_during_iteration @ linux-x86_64 +test.test_iterlen.TestDequeReversed.test_invariant @ linux-x86_64 +test.test_iterlen.TestDictItems.test_immutable_during_iteration @ linux-x86_64 +test.test_iterlen.TestDictItems.test_invariant @ linux-x86_64 +test.test_iterlen.TestDictKeys.test_immutable_during_iteration @ linux-x86_64 +test.test_iterlen.TestDictKeys.test_invariant @ linux-x86_64 +test.test_iterlen.TestDictValues.test_immutable_during_iteration @ linux-x86_64 +test.test_iterlen.TestDictValues.test_invariant @ linux-x86_64 +test.test_iterlen.TestLengthHintExceptions.test_invalid_hint @ linux-x86_64 +test.test_iterlen.TestLengthHintExceptions.test_issue1242657 @ linux-x86_64 +test.test_iterlen.TestList.test_invariant @ linux-x86_64 +test.test_iterlen.TestListReversed.test_invariant @ linux-x86_64 +test.test_iterlen.TestListReversed.test_mutation @ linux-x86_64 +test.test_iterlen.TestRepeat.test_invariant @ linux-x86_64 +test.test_iterlen.TestSet.test_immutable_during_iteration @ linux-x86_64 +test.test_iterlen.TestSet.test_invariant @ linux-x86_64 +test.test_iterlen.TestTuple.test_invariant @ linux-x86_64 +test.test_iterlen.TestXrange.test_invariant @ linux-x86_64 +test.test_iterlen.TestXrangeCustomReversed.test_invariant @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_itertools.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_itertools.txt new file mode 100644 index 0000000000..1788425219 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_itertools.txt @@ -0,0 +1,114 @@ +test.test_itertools.LengthTransparency.test_repeat @ linux-x86_64 +test.test_itertools.LengthTransparency.test_repeat_with_negative_times @ linux-x86_64 +test.test_itertools.RegressionTests.test_issue30347_1 @ linux-x86_64 +test.test_itertools.RegressionTests.test_issue30347_2 @ linux-x86_64 +test.test_itertools.RegressionTests.test_long_chain_of_empty_iterables @ linux-x86_64 +test.test_itertools.RegressionTests.test_sf_793826 @ linux-x86_64 +test.test_itertools.RegressionTests.test_sf_950057 @ linux-x86_64 +test.test_itertools.SubclassWithKwargsTest.test_keywords_in_subclass @ linux-x86_64 +test.test_itertools.TestBasicOps.test_StopIteration @ linux-x86_64 +test.test_itertools.TestBasicOps.test_accumulate @ linux-x86_64 +test.test_itertools.TestBasicOps.test_bug_7244 @ linux-x86_64 +test.test_itertools.TestBasicOps.test_chain @ linux-x86_64 +test.test_itertools.TestBasicOps.test_chain_from_iterable @ linux-x86_64 +test.test_itertools.TestBasicOps.test_chain_reducible @ linux-x86_64 +test.test_itertools.TestBasicOps.test_chain_setstate @ linux-x86_64 +test.test_itertools.TestBasicOps.test_combinations @ linux-x86_64 +test.test_itertools.TestBasicOps.test_combinations_with_replacement @ linux-x86_64 +test.test_itertools.TestBasicOps.test_combinatorics @ linux-x86_64 +test.test_itertools.TestBasicOps.test_compress @ linux-x86_64 +test.test_itertools.TestBasicOps.test_count @ linux-x86_64 +test.test_itertools.TestBasicOps.test_count_with_stride @ linux-x86_64 +test.test_itertools.TestBasicOps.test_cycle @ linux-x86_64 +test.test_itertools.TestBasicOps.test_cycle_copy_pickle @ linux-x86_64 +test.test_itertools.TestBasicOps.test_cycle_setstate @ linux-x86_64 +test.test_itertools.TestBasicOps.test_cycle_unpickle_compat @ linux-x86_64 +test.test_itertools.TestBasicOps.test_dropwhile @ linux-x86_64 +test.test_itertools.TestBasicOps.test_filter @ linux-x86_64 +test.test_itertools.TestBasicOps.test_filterfalse @ linux-x86_64 +test.test_itertools.TestBasicOps.test_groupby @ linux-x86_64 +test.test_itertools.TestBasicOps.test_islice @ linux-x86_64 +test.test_itertools.TestBasicOps.test_map @ linux-x86_64 +test.test_itertools.TestBasicOps.test_pairwise @ linux-x86_64 +test.test_itertools.TestBasicOps.test_pairwise_reenter @ linux-x86_64 +test.test_itertools.TestBasicOps.test_pairwise_reenter2 @ linux-x86_64 +test.test_itertools.TestBasicOps.test_permutations @ linux-x86_64 +test.test_itertools.TestBasicOps.test_product @ linux-x86_64 +test.test_itertools.TestBasicOps.test_product_issue_25021 @ linux-x86_64 +test.test_itertools.TestBasicOps.test_product_pickling @ linux-x86_64 +test.test_itertools.TestBasicOps.test_repeat @ linux-x86_64 +test.test_itertools.TestBasicOps.test_repeat_with_negative_times @ linux-x86_64 +test.test_itertools.TestBasicOps.test_starmap @ linux-x86_64 +test.test_itertools.TestBasicOps.test_takewhile @ linux-x86_64 +test.test_itertools.TestBasicOps.test_tee @ linux-x86_64 +test.test_itertools.TestBasicOps.test_tee_concurrent @ linux-x86_64 +test.test_itertools.TestBasicOps.test_tee_del_backward @ linux-x86_64 +test.test_itertools.TestBasicOps.test_tee_reenter @ linux-x86_64 +test.test_itertools.TestBasicOps.test_zip @ linux-x86_64 +test.test_itertools.TestBasicOps.test_zip_longest_bad_iterable @ linux-x86_64 +test.test_itertools.TestBasicOps.test_zip_longest_pickling @ linux-x86_64 +test.test_itertools.TestBasicOps.test_ziplongest @ linux-x86_64 +test.test_itertools.TestExamples.test_accumulate @ linux-x86_64 +test.test_itertools.TestExamples.test_accumulate_reducible @ linux-x86_64 +test.test_itertools.TestExamples.test_accumulate_reducible_none @ linux-x86_64 +test.test_itertools.TestExamples.test_chain @ linux-x86_64 +test.test_itertools.TestExamples.test_chain_from_iterable @ linux-x86_64 +test.test_itertools.TestExamples.test_combinations @ linux-x86_64 +test.test_itertools.TestExamples.test_combinations_with_replacement @ linux-x86_64 +test.test_itertools.TestExamples.test_compress @ linux-x86_64 +test.test_itertools.TestExamples.test_count @ linux-x86_64 +test.test_itertools.TestExamples.test_cycle @ linux-x86_64 +test.test_itertools.TestExamples.test_dropwhile @ linux-x86_64 +test.test_itertools.TestExamples.test_filter @ linux-x86_64 +test.test_itertools.TestExamples.test_filterfalse @ linux-x86_64 +test.test_itertools.TestExamples.test_groupby @ linux-x86_64 +test.test_itertools.TestExamples.test_islice @ linux-x86_64 +test.test_itertools.TestExamples.test_map @ linux-x86_64 +test.test_itertools.TestExamples.test_permutations @ linux-x86_64 +test.test_itertools.TestExamples.test_product @ linux-x86_64 +test.test_itertools.TestExamples.test_repeat @ linux-x86_64 +test.test_itertools.TestExamples.test_stapmap @ linux-x86_64 +test.test_itertools.TestExamples.test_takewhile @ linux-x86_64 +test.test_itertools.TestExamples.test_zip @ linux-x86_64 +test.test_itertools.TestExamples.test_zip_longest @ linux-x86_64 +test.test_itertools.TestGC.test_accumulate @ linux-x86_64 +test.test_itertools.TestGC.test_chain @ linux-x86_64 +test.test_itertools.TestGC.test_chain_from_iterable @ linux-x86_64 +test.test_itertools.TestGC.test_combinations @ linux-x86_64 +test.test_itertools.TestGC.test_combinations_with_replacement @ linux-x86_64 +test.test_itertools.TestGC.test_compress @ linux-x86_64 +test.test_itertools.TestGC.test_count @ linux-x86_64 +test.test_itertools.TestGC.test_cycle @ linux-x86_64 +test.test_itertools.TestGC.test_dropwhile @ linux-x86_64 +test.test_itertools.TestGC.test_filter @ linux-x86_64 +test.test_itertools.TestGC.test_filterfalse @ linux-x86_64 +test.test_itertools.TestGC.test_groupby @ linux-x86_64 +test.test_itertools.TestGC.test_islice @ linux-x86_64 +test.test_itertools.TestGC.test_issue2246 @ linux-x86_64 +test.test_itertools.TestGC.test_map @ linux-x86_64 +test.test_itertools.TestGC.test_pairwise @ linux-x86_64 +test.test_itertools.TestGC.test_permutations @ linux-x86_64 +test.test_itertools.TestGC.test_product @ linux-x86_64 +test.test_itertools.TestGC.test_repeat @ linux-x86_64 +test.test_itertools.TestGC.test_starmap @ linux-x86_64 +test.test_itertools.TestGC.test_takewhile @ linux-x86_64 +test.test_itertools.TestGC.test_zip @ linux-x86_64 +test.test_itertools.TestGC.test_zip_longest @ linux-x86_64 +test.test_itertools.TestPurePythonRoughEquivalents.test_islice_recipe @ linux-x86_64 +test.test_itertools.TestVariousIteratorArgs.test_accumulate @ linux-x86_64 +test.test_itertools.TestVariousIteratorArgs.test_chain @ linux-x86_64 +test.test_itertools.TestVariousIteratorArgs.test_compress @ linux-x86_64 +test.test_itertools.TestVariousIteratorArgs.test_cycle @ linux-x86_64 +test.test_itertools.TestVariousIteratorArgs.test_dropwhile @ linux-x86_64 +test.test_itertools.TestVariousIteratorArgs.test_filter @ linux-x86_64 +test.test_itertools.TestVariousIteratorArgs.test_filterfalse @ linux-x86_64 +test.test_itertools.TestVariousIteratorArgs.test_groupby @ linux-x86_64 +test.test_itertools.TestVariousIteratorArgs.test_islice @ linux-x86_64 +test.test_itertools.TestVariousIteratorArgs.test_map @ linux-x86_64 +test.test_itertools.TestVariousIteratorArgs.test_pairwise @ linux-x86_64 +test.test_itertools.TestVariousIteratorArgs.test_product @ linux-x86_64 +test.test_itertools.TestVariousIteratorArgs.test_starmap @ linux-x86_64 +test.test_itertools.TestVariousIteratorArgs.test_takewhile @ linux-x86_64 +test.test_itertools.TestVariousIteratorArgs.test_tee @ linux-x86_64 +test.test_itertools.TestVariousIteratorArgs.test_zip @ linux-x86_64 +test.test_itertools.TestVariousIteratorArgs.test_ziplongest @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_json.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_json.txt new file mode 100644 index 0000000000..253411101d --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_json.txt @@ -0,0 +1,162 @@ +DocTestCase.json @ linux-x86_64 +DocTestCase.json.encoder.JSONEncoder.encode @ linux-x86_64 +test.test_json.TestCTest.test_cjson @ linux-x86_64 +test.test_json.TestPyTest.test_pyjson @ linux-x86_64 +test.test_json.test_decode.TestCDecode.test_decimal @ linux-x86_64 +test.test_json.test_decode.TestCDecode.test_decoder_optimizations @ linux-x86_64 +test.test_json.test_decode.TestCDecode.test_empty_objects @ linux-x86_64 +test.test_json.test_decode.TestCDecode.test_extra_data @ linux-x86_64 +test.test_json.test_decode.TestCDecode.test_float @ linux-x86_64 +test.test_json.test_decode.TestCDecode.test_invalid_escape @ linux-x86_64 +test.test_json.test_decode.TestCDecode.test_invalid_input_type @ linux-x86_64 +test.test_json.test_decode.TestCDecode.test_keys_reuse @ linux-x86_64 +test.test_json.test_decode.TestCDecode.test_limit_int @ linux-x86_64 +test.test_json.test_decode.TestCDecode.test_negative_index @ linux-x86_64 +test.test_json.test_decode.TestCDecode.test_object_pairs_hook @ linux-x86_64 +test.test_json.test_decode.TestCDecode.test_string_with_utf8_bom @ linux-x86_64 +test.test_json.test_decode.TestPyDecode.test_decimal @ linux-x86_64 +test.test_json.test_decode.TestPyDecode.test_decoder_optimizations @ linux-x86_64 +test.test_json.test_decode.TestPyDecode.test_empty_objects @ linux-x86_64 +test.test_json.test_decode.TestPyDecode.test_extra_data @ linux-x86_64 +test.test_json.test_decode.TestPyDecode.test_float @ linux-x86_64 +test.test_json.test_decode.TestPyDecode.test_invalid_escape @ linux-x86_64 +test.test_json.test_decode.TestPyDecode.test_invalid_input_type @ linux-x86_64 +test.test_json.test_decode.TestPyDecode.test_keys_reuse @ linux-x86_64 +test.test_json.test_decode.TestPyDecode.test_limit_int @ linux-x86_64 +test.test_json.test_decode.TestPyDecode.test_negative_index @ linux-x86_64 +test.test_json.test_decode.TestPyDecode.test_object_pairs_hook @ linux-x86_64 +test.test_json.test_decode.TestPyDecode.test_string_with_utf8_bom @ linux-x86_64 +test.test_json.test_default.TestCDefault.test_default @ linux-x86_64 +test.test_json.test_default.TestCDefault.test_ordereddict @ linux-x86_64 +test.test_json.test_default.TestPyDefault.test_default @ linux-x86_64 +test.test_json.test_default.TestPyDefault.test_ordereddict @ linux-x86_64 +test.test_json.test_dump.TestCDump.test_dump @ linux-x86_64 +test.test_json.test_dump.TestCDump.test_dump_skipkeys @ linux-x86_64 +test.test_json.test_dump.TestCDump.test_dumps @ linux-x86_64 +test.test_json.test_dump.TestCDump.test_encode_evil_dict @ linux-x86_64 +test.test_json.test_dump.TestCDump.test_encode_mutated @ linux-x86_64 +test.test_json.test_dump.TestCDump.test_encode_truefalse @ linux-x86_64 +test.test_json.test_dump.TestCDump.test_large_list @ linux-x86_64 +test.test_json.test_dump.TestPyDump.test_dump @ linux-x86_64 +test.test_json.test_dump.TestPyDump.test_dump_skipkeys @ linux-x86_64 +test.test_json.test_dump.TestPyDump.test_dumps @ linux-x86_64 +test.test_json.test_dump.TestPyDump.test_encode_evil_dict @ linux-x86_64 +test.test_json.test_dump.TestPyDump.test_encode_mutated @ linux-x86_64 +test.test_json.test_dump.TestPyDump.test_encode_truefalse @ linux-x86_64 +test.test_json.test_encode_basestring_ascii.TestCEncodeBasestringAscii.test_encode_basestring_ascii @ linux-x86_64 +test.test_json.test_encode_basestring_ascii.TestCEncodeBasestringAscii.test_ordered_dict @ linux-x86_64 +test.test_json.test_encode_basestring_ascii.TestCEncodeBasestringAscii.test_sorted_dict @ linux-x86_64 +test.test_json.test_encode_basestring_ascii.TestPyEncodeBasestringAscii.test_encode_basestring_ascii @ linux-x86_64 +test.test_json.test_encode_basestring_ascii.TestPyEncodeBasestringAscii.test_ordered_dict @ linux-x86_64 +test.test_json.test_encode_basestring_ascii.TestPyEncodeBasestringAscii.test_sorted_dict @ linux-x86_64 +test.test_json.test_enum.TestCEnum.test_dict_keys @ linux-x86_64 +test.test_json.test_enum.TestCEnum.test_dict_values @ linux-x86_64 +test.test_json.test_enum.TestCEnum.test_floats @ linux-x86_64 +test.test_json.test_enum.TestCEnum.test_ints @ linux-x86_64 +test.test_json.test_enum.TestCEnum.test_list @ linux-x86_64 +test.test_json.test_enum.TestCEnum.test_weird_floats @ linux-x86_64 +test.test_json.test_enum.TestPyEnum.test_dict_keys @ linux-x86_64 +test.test_json.test_enum.TestPyEnum.test_dict_values @ linux-x86_64 +test.test_json.test_enum.TestPyEnum.test_floats @ linux-x86_64 +test.test_json.test_enum.TestPyEnum.test_ints @ linux-x86_64 +test.test_json.test_enum.TestPyEnum.test_list @ linux-x86_64 +test.test_json.test_enum.TestPyEnum.test_weird_floats @ linux-x86_64 +test.test_json.test_fail.TestCFail.test_extra_data @ linux-x86_64 +test.test_json.test_fail.TestCFail.test_failures @ linux-x86_64 +test.test_json.test_fail.TestCFail.test_linecol @ linux-x86_64 +test.test_json.test_fail.TestCFail.test_non_string_keys_dict @ linux-x86_64 +test.test_json.test_fail.TestCFail.test_not_serializable @ linux-x86_64 +test.test_json.test_fail.TestCFail.test_truncated_input @ linux-x86_64 +test.test_json.test_fail.TestCFail.test_unexpected_data @ linux-x86_64 +test.test_json.test_fail.TestPyFail.test_extra_data @ linux-x86_64 +test.test_json.test_fail.TestPyFail.test_failures @ linux-x86_64 +test.test_json.test_fail.TestPyFail.test_linecol @ linux-x86_64 +test.test_json.test_fail.TestPyFail.test_not_serializable @ linux-x86_64 +test.test_json.test_fail.TestPyFail.test_truncated_input @ linux-x86_64 +test.test_json.test_fail.TestPyFail.test_unexpected_data @ linux-x86_64 +test.test_json.test_float.TestCFloat.test_allow_nan @ linux-x86_64 +test.test_json.test_float.TestCFloat.test_floats @ linux-x86_64 +test.test_json.test_float.TestCFloat.test_ints @ linux-x86_64 +test.test_json.test_float.TestCFloat.test_out_of_range @ linux-x86_64 +test.test_json.test_float.TestPyFloat.test_allow_nan @ linux-x86_64 +test.test_json.test_float.TestPyFloat.test_floats @ linux-x86_64 +test.test_json.test_float.TestPyFloat.test_ints @ linux-x86_64 +test.test_json.test_float.TestPyFloat.test_out_of_range @ linux-x86_64 +test.test_json.test_indent.TestCIndent.test_indent @ linux-x86_64 +test.test_json.test_indent.TestCIndent.test_indent0 @ linux-x86_64 +test.test_json.test_indent.TestPyIndent.test_indent @ linux-x86_64 +test.test_json.test_indent.TestPyIndent.test_indent0 @ linux-x86_64 +test.test_json.test_pass1.TestCPass1.test_parse @ linux-x86_64 +test.test_json.test_pass1.TestPyPass1.test_parse @ linux-x86_64 +test.test_json.test_pass2.TestCPass2.test_parse @ linux-x86_64 +test.test_json.test_pass2.TestPyPass2.test_parse @ linux-x86_64 +test.test_json.test_pass3.TestCPass3.test_parse @ linux-x86_64 +test.test_json.test_pass3.TestPyPass3.test_parse @ linux-x86_64 +test.test_json.test_recursion.TestCRecursion.test_defaultrecursion @ linux-x86_64 +test.test_json.test_recursion.TestCRecursion.test_dictrecursion @ linux-x86_64 +test.test_json.test_recursion.TestCRecursion.test_endless_recursion @ linux-x86_64 +test.test_json.test_recursion.TestCRecursion.test_highly_nested_objects_decoding @ linux-x86_64 +test.test_json.test_recursion.TestCRecursion.test_highly_nested_objects_encoding @ linux-x86_64 +test.test_json.test_recursion.TestCRecursion.test_listrecursion @ linux-x86_64 +test.test_json.test_recursion.TestPyRecursion.test_defaultrecursion @ linux-x86_64 +test.test_json.test_recursion.TestPyRecursion.test_dictrecursion @ linux-x86_64 +test.test_json.test_recursion.TestPyRecursion.test_endless_recursion @ linux-x86_64 +test.test_json.test_recursion.TestPyRecursion.test_highly_nested_objects_decoding @ linux-x86_64 +test.test_json.test_recursion.TestPyRecursion.test_highly_nested_objects_encoding @ linux-x86_64 +test.test_json.test_recursion.TestPyRecursion.test_listrecursion @ linux-x86_64 +test.test_json.test_scanstring.TestCScanstring.test_bad_escapes @ linux-x86_64 +test.test_json.test_scanstring.TestCScanstring.test_overflow @ linux-x86_64 +test.test_json.test_scanstring.TestPyScanstring.test_bad_escapes @ linux-x86_64 +test.test_json.test_scanstring.TestPyScanstring.test_overflow @ linux-x86_64 +test.test_json.test_scanstring.TestPyScanstring.test_scanstring @ linux-x86_64 +test.test_json.test_scanstring.TestPyScanstring.test_surrogates @ linux-x86_64 +test.test_json.test_separators.TestCSeparators.test_illegal_separators @ linux-x86_64 +test.test_json.test_separators.TestCSeparators.test_separators @ linux-x86_64 +test.test_json.test_separators.TestPySeparators.test_illegal_separators @ linux-x86_64 +test.test_json.test_separators.TestPySeparators.test_separators @ linux-x86_64 +test.test_json.test_speedups.TestDecode.test_bad_bool_args @ linux-x86_64 +test.test_json.test_speedups.TestDecode.test_make_scanner @ linux-x86_64 +test.test_json.test_speedups.TestEncode.test_bad_bool_args @ linux-x86_64 +test.test_json.test_speedups.TestEncode.test_bad_markers_argument_to_encoder @ linux-x86_64 +test.test_json.test_speedups.TestEncode.test_bad_str_encoder @ linux-x86_64 +test.test_json.test_speedups.TestEncode.test_make_encoder @ linux-x86_64 +test.test_json.test_speedups.TestEncode.test_unsortable_keys @ linux-x86_64 +test.test_json.test_speedups.TestSpeedups.test_encode_basestring_ascii @ linux-x86_64 +test.test_json.test_speedups.TestSpeedups.test_scanstring @ linux-x86_64 +test.test_json.test_tool.TestTool.test_broken_pipe_error @ linux-x86_64 +test.test_json.test_tool.TestTool.test_compact @ linux-x86_64 +test.test_json.test_tool.TestTool.test_ensure_ascii_default @ linux-x86_64 +test.test_json.test_tool.TestTool.test_help_flag @ linux-x86_64 +test.test_json.test_tool.TestTool.test_indent @ linux-x86_64 +test.test_json.test_tool.TestTool.test_infile_outfile @ linux-x86_64 +test.test_json.test_tool.TestTool.test_infile_stdout @ linux-x86_64 +test.test_json.test_tool.TestTool.test_jsonlines @ linux-x86_64 +test.test_json.test_tool.TestTool.test_no_ensure_ascii_flag @ linux-x86_64 +test.test_json.test_tool.TestTool.test_no_indent @ linux-x86_64 +test.test_json.test_tool.TestTool.test_non_ascii_infile @ linux-x86_64 +test.test_json.test_tool.TestTool.test_sort_keys_flag @ linux-x86_64 +test.test_json.test_tool.TestTool.test_stdin_stdout @ linux-x86_64 +test.test_json.test_tool.TestTool.test_tab @ linux-x86_64 +test.test_json.test_tool.TestTool.test_writing_in_place @ linux-x86_64 +test.test_json.test_unicode.TestCUnicode.test_big_unicode_decode @ linux-x86_64 +test.test_json.test_unicode.TestCUnicode.test_big_unicode_encode @ linux-x86_64 +test.test_json.test_unicode.TestCUnicode.test_bytes_decode @ linux-x86_64 +test.test_json.test_unicode.TestCUnicode.test_bytes_encode @ linux-x86_64 +test.test_json.test_unicode.TestCUnicode.test_encoding3 @ linux-x86_64 +test.test_json.test_unicode.TestCUnicode.test_encoding4 @ linux-x86_64 +test.test_json.test_unicode.TestCUnicode.test_encoding5 @ linux-x86_64 +test.test_json.test_unicode.TestCUnicode.test_encoding6 @ linux-x86_64 +test.test_json.test_unicode.TestCUnicode.test_object_pairs_hook_with_unicode @ linux-x86_64 +test.test_json.test_unicode.TestCUnicode.test_unicode_decode @ linux-x86_64 +test.test_json.test_unicode.TestCUnicode.test_unicode_preservation @ linux-x86_64 +test.test_json.test_unicode.TestPyUnicode.test_big_unicode_decode @ linux-x86_64 +test.test_json.test_unicode.TestPyUnicode.test_big_unicode_encode @ linux-x86_64 +test.test_json.test_unicode.TestPyUnicode.test_bytes_decode @ linux-x86_64 +test.test_json.test_unicode.TestPyUnicode.test_bytes_encode @ linux-x86_64 +test.test_json.test_unicode.TestPyUnicode.test_encoding3 @ linux-x86_64 +test.test_json.test_unicode.TestPyUnicode.test_encoding4 @ linux-x86_64 +test.test_json.test_unicode.TestPyUnicode.test_encoding5 @ linux-x86_64 +test.test_json.test_unicode.TestPyUnicode.test_encoding6 @ linux-x86_64 +test.test_json.test_unicode.TestPyUnicode.test_object_pairs_hook_with_unicode @ linux-x86_64 +test.test_json.test_unicode.TestPyUnicode.test_unicode_decode @ linux-x86_64 +test.test_json.test_unicode.TestPyUnicode.test_unicode_preservation @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_keyword.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_keyword.txt new file mode 100644 index 0000000000..3fe1b825db --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_keyword.txt @@ -0,0 +1,11 @@ +test.test_keyword.Test_iskeyword.test_all_keywords_fail_to_be_used_as_names @ linux-x86_64 +test.test_keyword.Test_iskeyword.test_all_soft_keywords_can_be_used_as_names @ linux-x86_64 +test.test_keyword.Test_iskeyword.test_async_and_await_are_keywords @ linux-x86_64 +test.test_keyword.Test_iskeyword.test_changing_the_kwlist_does_not_affect_iskeyword @ linux-x86_64 +test.test_keyword.Test_iskeyword.test_changing_the_softkwlist_does_not_affect_issoftkeyword @ linux-x86_64 +test.test_keyword.Test_iskeyword.test_keywords_are_sorted @ linux-x86_64 +test.test_keyword.Test_iskeyword.test_match_and_case_are_soft_keywords @ linux-x86_64 +test.test_keyword.Test_iskeyword.test_none_value_is_not_a_keyword @ linux-x86_64 +test.test_keyword.Test_iskeyword.test_softkeywords_are_sorted @ linux-x86_64 +test.test_keyword.Test_iskeyword.test_true_is_a_keyword @ linux-x86_64 +test.test_keyword.Test_iskeyword.test_uppercase_true_is_not_a_keyword @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_keywordonlyarg.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_keywordonlyarg.txt new file mode 100644 index 0000000000..159e8d8ca3 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_keywordonlyarg.txt @@ -0,0 +1,11 @@ +test.test_keywordonlyarg.KeywordOnlyArgTestCase.testFunctionCall @ linux-x86_64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.testKwDefaults @ linux-x86_64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.testRaiseErrorFuncallWithUnexpectedKeywordArgument @ linux-x86_64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.testSyntaxErrorForFunctionCall @ linux-x86_64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.testSyntaxErrorForFunctionDefinition @ linux-x86_64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.testSyntaxForManyArguments @ linux-x86_64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.testTooManyPositionalErrorMessage @ linux-x86_64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.test_default_evaluation_order @ linux-x86_64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.test_issue13343 @ linux-x86_64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.test_kwonly_methods @ linux-x86_64 +test.test_keywordonlyarg.KeywordOnlyArgTestCase.test_mangling @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_largefile.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_largefile.txt new file mode 100644 index 0000000000..81ba48509d --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_largefile.txt @@ -0,0 +1,10 @@ +test.test_largefile.CLargeFileTest.test_lseek @ linux-x86_64 +test.test_largefile.CLargeFileTest.test_osstat @ linux-x86_64 +test.test_largefile.CLargeFileTest.test_seek_read @ linux-x86_64 +test.test_largefile.CLargeFileTest.test_seekable @ linux-x86_64 +test.test_largefile.CLargeFileTest.test_truncate @ linux-x86_64 +test.test_largefile.PyLargeFileTest.test_lseek @ linux-x86_64 +test.test_largefile.PyLargeFileTest.test_osstat @ linux-x86_64 +test.test_largefile.PyLargeFileTest.test_seek_read @ linux-x86_64 +test.test_largefile.PyLargeFileTest.test_seekable @ linux-x86_64 +test.test_largefile.PyLargeFileTest.test_truncate @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_lib2to3.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_lib2to3.txt new file mode 100644 index 0000000000..97122e8d46 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_lib2to3.txt @@ -0,0 +1,660 @@ +lib2to3.tests.test_fixers.Test_apply.test_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_4 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_5 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_6 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_call @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_complex_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_complex_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_complex_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_dotted_name @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_extreme @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_space_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_space_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_subscript @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_4 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_5 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_6 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_6b @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_7 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_8 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_unchanged_9 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_apply.test_weird_comments @ linux-x86_64 +lib2to3.tests.test_fixers.Test_asserts.test_deprecated_names @ linux-x86_64 +lib2to3.tests.test_fixers.Test_asserts.test_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_asserts.test_variants @ linux-x86_64 +lib2to3.tests.test_fixers.Test_basestring.test_basestring @ linux-x86_64 +lib2to3.tests.test_fixers.Test_buffer.test_buffer @ linux-x86_64 +lib2to3.tests.test_fixers.Test_buffer.test_slicing @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_01 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_02 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_03 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_04 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_05 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_06 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_07 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_08 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_09 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_10 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_11 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_12 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_13 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_14 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_15 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_16 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_17 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_18 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_19 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_20 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_21 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_22 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_23 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_24 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_25 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_26 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_27 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_28 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_29 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_30 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_31 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_32 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_prefix_preservation @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_trailing_comment @ linux-x86_64 +lib2to3.tests.test_fixers.Test_dict.test_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_except.test_bare_except @ linux-x86_64 +lib2to3.tests.test_fixers.Test_except.test_bare_except_and_else_finally @ linux-x86_64 +lib2to3.tests.test_fixers.Test_except.test_list_unpack @ linux-x86_64 +lib2to3.tests.test_fixers.Test_except.test_multi_class @ linux-x86_64 +lib2to3.tests.test_fixers.Test_except.test_multi_fixed_excepts_before_bare_except @ linux-x86_64 +lib2to3.tests.test_fixers.Test_except.test_one_line_suites @ linux-x86_64 +lib2to3.tests.test_fixers.Test_except.test_prefix_preservation @ linux-x86_64 +lib2to3.tests.test_fixers.Test_except.test_simple @ linux-x86_64 +lib2to3.tests.test_fixers.Test_except.test_simple_no_space_before_target @ linux-x86_64 +lib2to3.tests.test_fixers.Test_except.test_tuple_unpack @ linux-x86_64 +lib2to3.tests.test_fixers.Test_except.test_unchanged_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_except.test_unchanged_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_except.test_unchanged_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_except.test_weird_target_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_except.test_weird_target_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_except.test_weird_target_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_exec.test_basic @ linux-x86_64 +lib2to3.tests.test_fixers.Test_exec.test_complex_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_exec.test_complex_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_exec.test_prefix_preservation @ linux-x86_64 +lib2to3.tests.test_fixers.Test_exec.test_unchanged_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_exec.test_unchanged_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_exec.test_unchanged_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_exec.test_unchanged_4 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_exec.test_with_globals @ linux-x86_64 +lib2to3.tests.test_fixers.Test_exec.test_with_globals_locals @ linux-x86_64 +lib2to3.tests.test_fixers.Test_execfile.test_conversion @ linux-x86_64 +lib2to3.tests.test_fixers.Test_execfile.test_spacing @ linux-x86_64 +lib2to3.tests.test_fixers.Test_exitfunc.test_comments @ linux-x86_64 +lib2to3.tests.test_fixers.Test_exitfunc.test_complex_expression @ linux-x86_64 +lib2to3.tests.test_fixers.Test_exitfunc.test_in_a_function @ linux-x86_64 +lib2to3.tests.test_fixers.Test_exitfunc.test_names_import @ linux-x86_64 +lib2to3.tests.test_fixers.Test_exitfunc.test_no_sys_import @ linux-x86_64 +lib2to3.tests.test_fixers.Test_exitfunc.test_simple @ linux-x86_64 +lib2to3.tests.test_fixers.Test_exitfunc.test_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_filter.test_filter_basic @ linux-x86_64 +lib2to3.tests.test_fixers.Test_filter.test_filter_nochange @ linux-x86_64 +lib2to3.tests.test_fixers.Test_filter.test_filter_trailers @ linux-x86_64 +lib2to3.tests.test_fixers.Test_filter.test_future_builtins @ linux-x86_64 +lib2to3.tests.test_fixers.Test_filter.test_prefix_preservation @ linux-x86_64 +lib2to3.tests.test_fixers.Test_funcattrs.test @ linux-x86_64 +lib2to3.tests.test_fixers.Test_funcattrs.test_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_future.test_future @ linux-x86_64 +lib2to3.tests.test_fixers.Test_future.test_run_order @ linux-x86_64 +lib2to3.tests.test_fixers.Test_getcwdu.test_basic @ linux-x86_64 +lib2to3.tests.test_fixers.Test_getcwdu.test_comment @ linux-x86_64 +lib2to3.tests.test_fixers.Test_getcwdu.test_indentation @ linux-x86_64 +lib2to3.tests.test_fixers.Test_getcwdu.test_multilation @ linux-x86_64 +lib2to3.tests.test_fixers.Test_getcwdu.test_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_has_key.test_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_has_key.test_10 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_has_key.test_11 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_has_key.test_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_has_key.test_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_has_key.test_4 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_has_key.test_5 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_has_key.test_6 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_has_key.test_7 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_has_key.test_8 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_has_key.test_9 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_idioms.test_eq_expression @ linux-x86_64 +lib2to3.tests.test_fixers.Test_idioms.test_eq_reverse @ linux-x86_64 +lib2to3.tests.test_fixers.Test_idioms.test_eq_simple @ linux-x86_64 +lib2to3.tests.test_fixers.Test_idioms.test_is_expression @ linux-x86_64 +lib2to3.tests.test_fixers.Test_idioms.test_is_not_expression @ linux-x86_64 +lib2to3.tests.test_fixers.Test_idioms.test_is_not_reverse @ linux-x86_64 +lib2to3.tests.test_fixers.Test_idioms.test_is_not_simple @ linux-x86_64 +lib2to3.tests.test_fixers.Test_idioms.test_is_reverse @ linux-x86_64 +lib2to3.tests.test_fixers.Test_idioms.test_is_simple @ linux-x86_64 +lib2to3.tests.test_fixers.Test_idioms.test_ne_expression @ linux-x86_64 +lib2to3.tests.test_fixers.Test_idioms.test_ne_reverse @ linux-x86_64 +lib2to3.tests.test_fixers.Test_idioms.test_ne_simple @ linux-x86_64 +lib2to3.tests.test_fixers.Test_idioms.test_sort_list_call @ linux-x86_64 +lib2to3.tests.test_fixers.Test_idioms.test_sort_simple_expr @ linux-x86_64 +lib2to3.tests.test_fixers.Test_idioms.test_sort_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_idioms.test_type_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_idioms.test_while @ linux-x86_64 +lib2to3.tests.test_fixers.Test_idioms.test_while_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_import.test_already_relative_import @ linux-x86_64 +lib2to3.tests.test_fixers.Test_import.test_comments_and_indent @ linux-x86_64 +lib2to3.tests.test_fixers.Test_import.test_dotted_from @ linux-x86_64 +lib2to3.tests.test_fixers.Test_import.test_dotted_import @ linux-x86_64 +lib2to3.tests.test_fixers.Test_import.test_dotted_import_as @ linux-x86_64 +lib2to3.tests.test_fixers.Test_import.test_files_checked @ linux-x86_64 +lib2to3.tests.test_fixers.Test_import.test_from @ linux-x86_64 +lib2to3.tests.test_fixers.Test_import.test_from_as @ linux-x86_64 +lib2to3.tests.test_fixers.Test_import.test_import @ linux-x86_64 +lib2to3.tests.test_fixers.Test_import.test_import_as @ linux-x86_64 +lib2to3.tests.test_fixers.Test_import.test_import_from_package @ linux-x86_64 +lib2to3.tests.test_fixers.Test_import.test_in_package @ linux-x86_64 +lib2to3.tests.test_fixers.Test_import.test_local_and_absolute @ linux-x86_64 +lib2to3.tests.test_fixers.Test_import.test_not_in_package @ linux-x86_64 +lib2to3.tests.test_fixers.Test_import.test_prefix @ linux-x86_64 +lib2to3.tests.test_fixers.Test_import.test_with_absolute_import_enabled @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports.test_import_from @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports.test_import_from_as @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports.test_import_module @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports.test_import_module_as @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports.test_import_module_usage @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports.test_multiple_imports @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports.test_multiple_imports_as @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports.test_star @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports2.test_import_from @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports2.test_import_from_as @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports2.test_import_module @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports2.test_import_module_as @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports2.test_import_module_usage @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports2.test_star @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports_fixer_order.test_after_local_imports_refactoring @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports_fixer_order.test_import_from @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports_fixer_order.test_import_from_as @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports_fixer_order.test_import_module @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports_fixer_order.test_import_module_as @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports_fixer_order.test_import_module_usage @ linux-x86_64 +lib2to3.tests.test_fixers.Test_imports_fixer_order.test_star @ linux-x86_64 +lib2to3.tests.test_fixers.Test_input.test_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_input.test_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_input.test_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_input.test_4 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_input.test_idempotency @ linux-x86_64 +lib2to3.tests.test_fixers.Test_input.test_prefix_preservation @ linux-x86_64 +lib2to3.tests.test_fixers.Test_input.test_trailing_comment @ linux-x86_64 +lib2to3.tests.test_fixers.Test_intern.test @ linux-x86_64 +lib2to3.tests.test_fixers.Test_intern.test_prefix_preservation @ linux-x86_64 +lib2to3.tests.test_fixers.Test_intern.test_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_isinstance.test_prefix_preservation @ linux-x86_64 +lib2to3.tests.test_fixers.Test_isinstance.test_remove_multiple_items @ linux-x86_64 +lib2to3.tests.test_fixers.Test_isinstance.test_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_itertools.test_0 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_itertools.test_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_itertools.test_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_itertools.test_qualified @ linux-x86_64 +lib2to3.tests.test_fixers.Test_itertools.test_run_order @ linux-x86_64 +lib2to3.tests.test_fixers.Test_itertools.test_space_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_itertools.test_space_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_itertools_imports.test_comments @ linux-x86_64 +lib2to3.tests.test_fixers.Test_itertools_imports.test_ifilter_and_zip_longest @ linux-x86_64 +lib2to3.tests.test_fixers.Test_itertools_imports.test_import_as @ linux-x86_64 +lib2to3.tests.test_fixers.Test_itertools_imports.test_import_star @ linux-x86_64 +lib2to3.tests.test_fixers.Test_itertools_imports.test_none @ linux-x86_64 +lib2to3.tests.test_fixers.Test_itertools_imports.test_reduced @ linux-x86_64 +lib2to3.tests.test_fixers.Test_itertools_imports.test_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_long.test_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_long.test_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_long.test_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_long.test_prefix_preservation @ linux-x86_64 +lib2to3.tests.test_fixers.Test_long.test_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_map.test_None_with_multiple_arguments @ linux-x86_64 +lib2to3.tests.test_fixers.Test_map.test_future_builtins @ linux-x86_64 +lib2to3.tests.test_fixers.Test_map.test_map_basic @ linux-x86_64 +lib2to3.tests.test_fixers.Test_map.test_map_nochange @ linux-x86_64 +lib2to3.tests.test_fixers.Test_map.test_map_trailers @ linux-x86_64 +lib2to3.tests.test_fixers.Test_map.test_prefix_preservation @ linux-x86_64 +lib2to3.tests.test_fixers.Test_map.test_trailing_comment @ linux-x86_64 +lib2to3.tests.test_fixers.Test_metaclass.test_comments @ linux-x86_64 +lib2to3.tests.test_fixers.Test_metaclass.test_meta @ linux-x86_64 +lib2to3.tests.test_fixers.Test_metaclass.test_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_methodattrs.test @ linux-x86_64 +lib2to3.tests.test_fixers.Test_methodattrs.test_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_ne.test_basic @ linux-x86_64 +lib2to3.tests.test_fixers.Test_ne.test_chained @ linux-x86_64 +lib2to3.tests.test_fixers.Test_ne.test_no_spaces @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_4 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_5 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_6 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_assign_to_next @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_assign_to_next_in_list @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_assign_to_next_in_tuple @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_builtin_assign @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_builtin_assign_in_list @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_builtin_assign_in_tuple @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_method_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_method_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_method_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_method_4 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_method_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_noncall_access_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_noncall_access_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_noncall_access_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_prefix_preservation_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_prefix_preservation_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_prefix_preservation_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_prefix_preservation_4 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_prefix_preservation_5 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_prefix_preservation_6 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_assign_list_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_assign_list_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_assign_simple @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_assign_tuple_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_assign_tuple_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_for_simple @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_for_tuple_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_for_tuple_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_funcdef_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_funcdef_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_global_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_global_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_import_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_import_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_import_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_import_from_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_import_from_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_import_from_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_next.test_shadowing_import_from_4 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_nonzero.test_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_nonzero.test_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_nonzero.test_unchanged_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_nonzero.test_unchanged_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_nonzero.test_unchanged_func @ linux-x86_64 +lib2to3.tests.test_fixers.Test_numliterals.test_comments_and_spacing @ linux-x86_64 +lib2to3.tests.test_fixers.Test_numliterals.test_long_hex @ linux-x86_64 +lib2to3.tests.test_fixers.Test_numliterals.test_long_int_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_numliterals.test_long_int_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_numliterals.test_octal_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_complex_bare @ linux-x86_64 +lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_complex_float @ linux-x86_64 +lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_complex_int @ linux-x86_64 +lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_exp @ linux-x86_64 +lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_float @ linux-x86_64 +lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_hex @ linux-x86_64 +lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_int @ linux-x86_64 +lib2to3.tests.test_fixers.Test_numliterals.test_unchanged_octal @ linux-x86_64 +lib2to3.tests.test_fixers.Test_operator.test_bare_isCallable @ linux-x86_64 +lib2to3.tests.test_fixers.Test_operator.test_bare_operator_irepeat @ linux-x86_64 +lib2to3.tests.test_fixers.Test_operator.test_bare_operator_isMappingType @ linux-x86_64 +lib2to3.tests.test_fixers.Test_operator.test_bare_operator_isNumberType @ linux-x86_64 +lib2to3.tests.test_fixers.Test_operator.test_bare_operator_isSequenceType @ linux-x86_64 +lib2to3.tests.test_fixers.Test_operator.test_bare_operator_repeat @ linux-x86_64 +lib2to3.tests.test_fixers.Test_operator.test_bare_sequenceIncludes @ linux-x86_64 +lib2to3.tests.test_fixers.Test_operator.test_operator_irepeat @ linux-x86_64 +lib2to3.tests.test_fixers.Test_operator.test_operator_isCallable @ linux-x86_64 +lib2to3.tests.test_fixers.Test_operator.test_operator_isMappingType @ linux-x86_64 +lib2to3.tests.test_fixers.Test_operator.test_operator_isNumberType @ linux-x86_64 +lib2to3.tests.test_fixers.Test_operator.test_operator_isSequenceType @ linux-x86_64 +lib2to3.tests.test_fixers.Test_operator.test_operator_repeat @ linux-x86_64 +lib2to3.tests.test_fixers.Test_operator.test_operator_sequenceIncludes @ linux-x86_64 +lib2to3.tests.test_fixers.Test_paren.test_0 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_paren.test_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_paren.test_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_paren.test_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_paren.test_4 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_paren.test_5 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_paren.test_6 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_paren.test_unchanged_0 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_paren.test_unchanged_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_paren.test_unchanged_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_paren.test_unchanged_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_paren.test_unchanged_4 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_print.test_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_print.test_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_print.test_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_print.test_4 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_print.test_5 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_print.test_idempotency @ linux-x86_64 +lib2to3.tests.test_fixers.Test_print.test_idempotency_print_as_function @ linux-x86_64 +lib2to3.tests.test_fixers.Test_print.test_no_trailing_comma @ linux-x86_64 +lib2to3.tests.test_fixers.Test_print.test_prefix_preservation @ linux-x86_64 +lib2to3.tests.test_fixers.Test_print.test_spaces_before_file @ linux-x86_64 +lib2to3.tests.test_fixers.Test_print.test_trailing_comma_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_print.test_trailing_comma_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_print.test_trailing_comma_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_print.test_tuple @ linux-x86_64 +lib2to3.tests.test_fixers.Test_print.test_vargs_without_trailing_comma @ linux-x86_64 +lib2to3.tests.test_fixers.Test_print.test_with_future_print_function @ linux-x86_64 +lib2to3.tests.test_fixers.Test_print.test_with_trailing_comma @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raise.test_None_value @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raise.test_basic @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raise.test_prefix_preservation @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raise.test_string_exc @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raise.test_string_exc_val @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raise.test_string_exc_val_tb @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raise.test_tb_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raise.test_tb_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raise.test_tb_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raise.test_tb_4 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raise.test_tb_5 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raise.test_tb_6 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raise.test_tuple_detection @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raise.test_tuple_exc_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raise.test_tuple_exc_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raise.test_tuple_value @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raise.test_with_comments @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raw_input.test_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raw_input.test_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raw_input.test_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raw_input.test_4 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raw_input.test_5 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raw_input.test_6 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raw_input.test_8 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_raw_input.test_prefix_preservation @ linux-x86_64 +lib2to3.tests.test_fixers.Test_reduce.test_bug_7253 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_reduce.test_call_with_lambda @ linux-x86_64 +lib2to3.tests.test_fixers.Test_reduce.test_simple_call @ linux-x86_64 +lib2to3.tests.test_fixers.Test_reduce.test_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_reload.test @ linux-x86_64 +lib2to3.tests.test_fixers.Test_reload.test_comment @ linux-x86_64 +lib2to3.tests.test_fixers.Test_reload.test_space @ linux-x86_64 +lib2to3.tests.test_fixers.Test_reload.test_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_renames.test_import_from @ linux-x86_64 +lib2to3.tests.test_fixers.Test_renames.test_import_from_as @ linux-x86_64 +lib2to3.tests.test_fixers.Test_renames.test_import_module_usage @ linux-x86_64 +lib2to3.tests.test_fixers.Test_repr.test_complex @ linux-x86_64 +lib2to3.tests.test_fixers.Test_repr.test_nested @ linux-x86_64 +lib2to3.tests.test_fixers.Test_repr.test_nested_tuples @ linux-x86_64 +lib2to3.tests.test_fixers.Test_repr.test_prefix_preservation @ linux-x86_64 +lib2to3.tests.test_fixers.Test_repr.test_simple_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_repr.test_simple_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_repr.test_tuple @ linux-x86_64 +lib2to3.tests.test_fixers.Test_set_literal.test_basic @ linux-x86_64 +lib2to3.tests.test_fixers.Test_set_literal.test_comments @ linux-x86_64 +lib2to3.tests.test_fixers.Test_set_literal.test_listcomps @ linux-x86_64 +lib2to3.tests.test_fixers.Test_set_literal.test_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_set_literal.test_whitespace @ linux-x86_64 +lib2to3.tests.test_fixers.Test_standarderror.test @ linux-x86_64 +lib2to3.tests.test_fixers.Test_sys_exc.test_0 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_sys_exc.test_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_sys_exc.test_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_sys_exc.test_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_sys_exc.test_4 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_sys_exc.test_5 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_throw.test_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_throw.test_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_throw.test_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_throw.test_4 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_throw.test_tb_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_throw.test_tb_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_throw.test_tb_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_throw.test_tb_4 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_throw.test_tb_5 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_throw.test_tb_6 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_throw.test_tb_7 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_throw.test_tb_8 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_throw.test_untouched_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_throw.test_untouched_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_throw.test_untouched_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_throw.test_warn_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_throw.test_warn_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_throw.test_warn_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_docstring @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_keywords @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_nested @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_nested_multi_use @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_no_change @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_one_tuple @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_parens_single_arg @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_simple @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_simple_multi_use @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_lambda_simple_reverse @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_multi_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_multi_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_semicolon @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_unchanged_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_unchanged_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_unchanged_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_tuple_params.test_varargs @ linux-x86_64 +lib2to3.tests.test_fixers.Test_unicode.test_bytes_literal_escape_u @ linux-x86_64 +lib2to3.tests.test_fixers.Test_unicode.test_native_literal_escape_u @ linux-x86_64 +lib2to3.tests.test_fixers.Test_unicode.test_native_unicode_literal_escape_u @ linux-x86_64 +lib2to3.tests.test_fixers.Test_unicode.test_unichr @ linux-x86_64 +lib2to3.tests.test_fixers.Test_unicode.test_unicode_call @ linux-x86_64 +lib2to3.tests.test_fixers.Test_unicode.test_unicode_literal_1 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_unicode.test_unicode_literal_2 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_unicode.test_unicode_literal_3 @ linux-x86_64 +lib2to3.tests.test_fixers.Test_unicode.test_unicode_literal_escape_u @ linux-x86_64 +lib2to3.tests.test_fixers.Test_unicode.test_whitespace @ linux-x86_64 +lib2to3.tests.test_fixers.Test_urllib.test_import_from @ linux-x86_64 +lib2to3.tests.test_fixers.Test_urllib.test_import_from_as @ linux-x86_64 +lib2to3.tests.test_fixers.Test_urllib.test_import_module @ linux-x86_64 +lib2to3.tests.test_fixers.Test_urllib.test_import_module_as @ linux-x86_64 +lib2to3.tests.test_fixers.Test_urllib.test_import_module_usage @ linux-x86_64 +lib2to3.tests.test_fixers.Test_urllib.test_indented @ linux-x86_64 +lib2to3.tests.test_fixers.Test_urllib.test_single_import @ linux-x86_64 +lib2to3.tests.test_fixers.Test_urllib.test_star @ linux-x86_64 +lib2to3.tests.test_fixers.Test_xrange.test_in_consuming_context @ linux-x86_64 +lib2to3.tests.test_fixers.Test_xrange.test_in_contains_test @ linux-x86_64 +lib2to3.tests.test_fixers.Test_xrange.test_prefix_preservation @ linux-x86_64 +lib2to3.tests.test_fixers.Test_xrange.test_range_in_for @ linux-x86_64 +lib2to3.tests.test_fixers.Test_xrange.test_single_arg @ linux-x86_64 +lib2to3.tests.test_fixers.Test_xrange.test_three_args @ linux-x86_64 +lib2to3.tests.test_fixers.Test_xrange.test_two_args @ linux-x86_64 +lib2to3.tests.test_fixers.Test_xrange.test_wrap_in_list @ linux-x86_64 +lib2to3.tests.test_fixers.Test_xrange.test_xrange_in_for @ linux-x86_64 +lib2to3.tests.test_fixers.Test_xrange_with_reduce.test_double_transform @ linux-x86_64 +lib2to3.tests.test_fixers.Test_xreadlines.test_attr_ref @ linux-x86_64 +lib2to3.tests.test_fixers.Test_xreadlines.test_call @ linux-x86_64 +lib2to3.tests.test_fixers.Test_xreadlines.test_unchanged @ linux-x86_64 +lib2to3.tests.test_fixers.Test_zip.test_future_builtins @ linux-x86_64 +lib2to3.tests.test_fixers.Test_zip.test_zip_basic @ linux-x86_64 +lib2to3.tests.test_fixers.Test_zip.test_zip_nochange @ linux-x86_64 +lib2to3.tests.test_fixers.Test_zip.test_zip_trailers @ linux-x86_64 +lib2to3.tests.test_parser.TestAsyncAwait.test_async_for @ linux-x86_64 +lib2to3.tests.test_parser.TestAsyncAwait.test_async_generator @ linux-x86_64 +lib2to3.tests.test_parser.TestAsyncAwait.test_async_var @ linux-x86_64 +lib2to3.tests.test_parser.TestAsyncAwait.test_async_with @ linux-x86_64 +lib2to3.tests.test_parser.TestAsyncAwait.test_await_expr @ linux-x86_64 +lib2to3.tests.test_parser.TestClassDef.test_new_syntax @ linux-x86_64 +lib2to3.tests.test_parser.TestDriver.test_formfeed @ linux-x86_64 +lib2to3.tests.test_parser.TestExcept.test_new @ linux-x86_64 +lib2to3.tests.test_parser.TestExcept.test_old @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_1 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_10 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_11 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_12 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_13 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_14 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_15 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_16 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_17 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_18 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_19 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_2 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_20 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_21 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_3 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_4 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_5 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_6 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_7 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_8 @ linux-x86_64 +lib2to3.tests.test_parser.TestFunctionAnnotations.test_9 @ linux-x86_64 +lib2to3.tests.test_parser.TestIdentifier.test_non_ascii_identifiers @ linux-x86_64 +lib2to3.tests.test_parser.TestLiterals.test_multiline_bytes_literals @ linux-x86_64 +lib2to3.tests.test_parser.TestLiterals.test_multiline_bytes_tripquote_literals @ linux-x86_64 +lib2to3.tests.test_parser.TestLiterals.test_multiline_str_literals @ linux-x86_64 +lib2to3.tests.test_parser.TestMatrixMultiplication.test_matrix_multiplication_operator @ linux-x86_64 +lib2to3.tests.test_parser.TestNamedAssignments.test_named_assignment_generator @ linux-x86_64 +lib2to3.tests.test_parser.TestNamedAssignments.test_named_assignment_if @ linux-x86_64 +lib2to3.tests.test_parser.TestNamedAssignments.test_named_assignment_listcomp @ linux-x86_64 +lib2to3.tests.test_parser.TestNamedAssignments.test_named_assignment_while @ linux-x86_64 +lib2to3.tests.test_parser.TestNumericLiterals.test_new_binary_notation @ linux-x86_64 +lib2to3.tests.test_parser.TestNumericLiterals.test_new_octal_notation @ linux-x86_64 +lib2to3.tests.test_parser.TestParserIdempotency.test_all_project_files @ linux-x86_64 +lib2to3.tests.test_parser.TestParserIdempotency.test_extended_unpacking @ linux-x86_64 +lib2to3.tests.test_parser.TestPgen2Caching.test_load_grammar_from_pickle @ linux-x86_64 +!lib2to3.tests.test_parser.TestPgen2Caching.test_load_grammar_from_subprocess @ linux-x86_64 +lib2to3.tests.test_parser.TestPgen2Caching.test_load_grammar_from_txt_file @ linux-x86_64 +lib2to3.tests.test_parser.TestPgen2Caching.test_load_packaged_grammar @ linux-x86_64 +lib2to3.tests.test_parser.TestPickleableException.test_ParseError @ linux-x86_64 +lib2to3.tests.test_parser.TestPositionalOnlyArgs.test_all_markers @ linux-x86_64 +lib2to3.tests.test_parser.TestPositionalOnlyArgs.test_all_with_args_and_kwargs @ linux-x86_64 +lib2to3.tests.test_parser.TestPositionalOnlyArgs.test_lambda_soup @ linux-x86_64 +lib2to3.tests.test_parser.TestPositionalOnlyArgs.test_one_pos_only_arg @ linux-x86_64 +lib2to3.tests.test_parser.TestPositionalOnlyArgs.test_only_positional_or_keyword @ linux-x86_64 +lib2to3.tests.test_parser.TestRaiseChanges.test_2x_style_1 @ linux-x86_64 +lib2to3.tests.test_parser.TestRaiseChanges.test_2x_style_2 @ linux-x86_64 +lib2to3.tests.test_parser.TestRaiseChanges.test_2x_style_3 @ linux-x86_64 +lib2to3.tests.test_parser.TestRaiseChanges.test_2x_style_invalid_1 @ linux-x86_64 +lib2to3.tests.test_parser.TestRaiseChanges.test_3x_style @ linux-x86_64 +lib2to3.tests.test_parser.TestRaiseChanges.test_3x_style_invalid_1 @ linux-x86_64 +lib2to3.tests.test_parser.TestRaiseChanges.test_3x_style_invalid_2 @ linux-x86_64 +lib2to3.tests.test_parser.TestRaiseChanges.test_3x_style_invalid_3 @ linux-x86_64 +lib2to3.tests.test_parser.TestRaiseChanges.test_3x_style_invalid_4 @ linux-x86_64 +lib2to3.tests.test_parser.TestSetLiteral.test_1 @ linux-x86_64 +lib2to3.tests.test_parser.TestSetLiteral.test_2 @ linux-x86_64 +lib2to3.tests.test_parser.TestSetLiteral.test_3 @ linux-x86_64 +lib2to3.tests.test_parser.TestSetLiteral.test_4 @ linux-x86_64 +lib2to3.tests.test_parser.TestStringLiterals.test_lit @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_argument_unpacking_1 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_argument_unpacking_2 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_argument_unpacking_3 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_complex_double_star_expression @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_complex_star_expression @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_dict_display_1 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_dict_display_2 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_double_star_dict_literal @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_double_star_dict_literal_after_keywords @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_double_star_expression @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_list_display @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_mid_positional_star @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_set_display @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_star_expression @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_1 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_2 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_3 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_4 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_5 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_6 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_7 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_8 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_9 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_1 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_2 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_3 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_4 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_5 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_6 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_7 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_8 @ linux-x86_64 +lib2to3.tests.test_parser.TestUnpackingGeneralizations.test_trailing_commas_lambda_9 @ linux-x86_64 +lib2to3.tests.test_parser.TestVarAnnotations.test_1 @ linux-x86_64 +lib2to3.tests.test_parser.TestVarAnnotations.test_2 @ linux-x86_64 +lib2to3.tests.test_parser.TestVarAnnotations.test_3 @ linux-x86_64 +lib2to3.tests.test_parser.TestVarAnnotations.test_4 @ linux-x86_64 +lib2to3.tests.test_parser.TestVarAnnotations.test_5 @ linux-x86_64 +lib2to3.tests.test_parser.TestVarAnnotations.test_6 @ linux-x86_64 +lib2to3.tests.test_parser.TestYieldFrom.test_yield_from @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_changed @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_depth @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_get_suffix @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_instantiate_base @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_leaf @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_leaf_constructor_prefix @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_leaf_equality @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_leaf_next_sibling @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_leaf_prefix @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_leaf_prev_sibling @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_leaf_repr @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_leaf_str @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_leaf_str_numeric_value @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_leaves @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_node @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_node_append_child @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_node_constructor_prefix @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_node_equality @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_node_insert_child @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_node_next_sibling @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_node_prefix @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_node_prev_sibling @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_node_recursive_equality @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_node_repr @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_node_set_child @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_node_str @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_post_order @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_pre_order @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_remove @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_remove_parentless @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_replace @ linux-x86_64 +lib2to3.tests.test_pytree.TestNodes.test_replace_with_list @ linux-x86_64 +lib2to3.tests.test_pytree.TestPatterns.test_basic_patterns @ linux-x86_64 +lib2to3.tests.test_pytree.TestPatterns.test_generate_matches @ linux-x86_64 +lib2to3.tests.test_pytree.TestPatterns.test_has_key_example @ linux-x86_64 +lib2to3.tests.test_pytree.TestPatterns.test_wildcard @ linux-x86_64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_detect_future_features @ linux-x86_64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_exec_function_option @ linux-x86_64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_explicit @ linux-x86_64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_fixer_loading @ linux-x86_64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_fixer_loading_helpers @ linux-x86_64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_get_headnode_dict @ linux-x86_64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_naughty_fixers @ linux-x86_64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_print_function_option @ linux-x86_64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_refactor_dir @ linux-x86_64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_refactor_docstring @ linux-x86_64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_refactor_file @ linux-x86_64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_refactor_file_write_unchanged_file @ linux-x86_64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_refactor_stdin @ linux-x86_64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_refactor_string @ linux-x86_64 +lib2to3.tests.test_refactor.TestRefactoringTool.test_write_unchanged_files_option @ linux-x86_64 +lib2to3.tests.test_util.Test_Attr.test @ linux-x86_64 +lib2to3.tests.test_util.Test_Attr.test_returns @ linux-x86_64 +lib2to3.tests.test_util.Test_Call.test @ linux-x86_64 +lib2to3.tests.test_util.Test_Name.test @ linux-x86_64 +lib2to3.tests.test_util.Test_does_tree_import.test_in_function @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_class_def @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_for @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_for_nested @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_from_import @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_from_import_as @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_from_import_as_with_package @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_from_import_with_package @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_function_def @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_if @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_if_nested @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_import_as @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_import_as_with_package @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_invalid_assignments @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_list_assignment @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_simple_assignment @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_simple_import @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_simple_import_with_package @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_try_except @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_try_except_finally @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_try_except_finally_nested @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_try_except_nested @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_tuple_assignment @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_while @ linux-x86_64 +lib2to3.tests.test_util.Test_find_binding.test_while_nested @ linux-x86_64 +lib2to3.tests.test_util.Test_find_indentation.test_nothing @ linux-x86_64 +lib2to3.tests.test_util.Test_find_indentation.test_simple @ linux-x86_64 +lib2to3.tests.test_util.Test_is_list.test_invalid @ linux-x86_64 +lib2to3.tests.test_util.Test_is_list.test_valid @ linux-x86_64 +lib2to3.tests.test_util.Test_is_tuple.test_invalid @ linux-x86_64 +lib2to3.tests.test_util.Test_is_tuple.test_valid @ linux-x86_64 +lib2to3.tests.test_util.Test_touch_import.test_after_docstring @ linux-x86_64 +lib2to3.tests.test_util.Test_touch_import.test_after_imports @ linux-x86_64 +lib2to3.tests.test_util.Test_touch_import.test_beginning @ linux-x86_64 +lib2to3.tests.test_util.Test_touch_import.test_from_import @ linux-x86_64 +lib2to3.tests.test_util.Test_touch_import.test_name_import @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_linecache.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_linecache.txt new file mode 100644 index 0000000000..36349d56b2 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_linecache.txt @@ -0,0 +1,24 @@ +test.test_linecache.BadUnicode_NoDeclaration.test_getline @ linux-x86_64 +test.test_linecache.BadUnicode_NoDeclaration.test_getlines @ linux-x86_64 +test.test_linecache.BadUnicode_WithDeclaration.test_getline @ linux-x86_64 +test.test_linecache.BadUnicode_WithDeclaration.test_getlines @ linux-x86_64 +test.test_linecache.EmptyFile.test_getline @ linux-x86_64 +test.test_linecache.EmptyFile.test_getlines @ linux-x86_64 +test.test_linecache.GoodUnicode.test_getline @ linux-x86_64 +test.test_linecache.GoodUnicode.test_getlines @ linux-x86_64 +test.test_linecache.LineCacheInvalidationTests.test_checkcache_for_deleted_file @ linux-x86_64 +test.test_linecache.LineCacheInvalidationTests.test_checkcache_for_modified_file @ linux-x86_64 +test.test_linecache.LineCacheInvalidationTests.test_checkcache_with_no_parameter @ linux-x86_64 +test.test_linecache.LineCacheTests.test_checkcache @ linux-x86_64 +test.test_linecache.LineCacheTests.test_clearcache @ linux-x86_64 +test.test_linecache.LineCacheTests.test_getline @ linux-x86_64 +test.test_linecache.LineCacheTests.test_lazycache_already_cached @ linux-x86_64 +test.test_linecache.LineCacheTests.test_lazycache_bad_filename @ linux-x86_64 +test.test_linecache.LineCacheTests.test_lazycache_check @ linux-x86_64 +test.test_linecache.LineCacheTests.test_lazycache_no_globals @ linux-x86_64 +test.test_linecache.LineCacheTests.test_lazycache_provide_after_failed_lookup @ linux-x86_64 +test.test_linecache.LineCacheTests.test_lazycache_smoke @ linux-x86_64 +test.test_linecache.LineCacheTests.test_memoryerror @ linux-x86_64 +test.test_linecache.LineCacheTests.test_no_ending_newline @ linux-x86_64 +test.test_linecache.SingleEmptyLine.test_getline @ linux-x86_64 +test.test_linecache.SingleEmptyLine.test_getlines @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_list.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_list.txt new file mode 100644 index 0000000000..8cf804c93f --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_list.txt @@ -0,0 +1,54 @@ +test.test_list.ListTest.test_addmul @ linux-x86_64 +test.test_list.ListTest.test_append @ linux-x86_64 +test.test_list.ListTest.test_basic @ linux-x86_64 +test.test_list.ListTest.test_clear @ linux-x86_64 +test.test_list.ListTest.test_constructor_exception_handling @ linux-x86_64 +test.test_list.ListTest.test_constructors @ linux-x86_64 +test.test_list.ListTest.test_contains @ linux-x86_64 +test.test_list.ListTest.test_contains_fake @ linux-x86_64 +test.test_list.ListTest.test_contains_order @ linux-x86_64 +test.test_list.ListTest.test_copy @ linux-x86_64 +test.test_list.ListTest.test_count @ linux-x86_64 +test.test_list.ListTest.test_count_index_remove_crashes @ linux-x86_64 +test.test_list.ListTest.test_delitem @ linux-x86_64 +test.test_list.ListTest.test_delslice @ linux-x86_64 +test.test_list.ListTest.test_equal_operator_modifying_operand @ linux-x86_64 +test.test_list.ListTest.test_exhausted_iterator @ linux-x86_64 +test.test_list.ListTest.test_extend @ linux-x86_64 +test.test_list.ListTest.test_extendedslicing @ linux-x86_64 +test.test_list.ListTest.test_getitem @ linux-x86_64 +test.test_list.ListTest.test_getitem_error @ linux-x86_64 +test.test_list.ListTest.test_getitemoverwriteiter @ linux-x86_64 +test.test_list.ListTest.test_getslice @ linux-x86_64 +test.test_list.ListTest.test_iadd @ linux-x86_64 +test.test_list.ListTest.test_identity @ linux-x86_64 +test.test_list.ListTest.test_imul @ linux-x86_64 +test.test_list.ListTest.test_index @ linux-x86_64 +test.test_list.ListTest.test_init @ linux-x86_64 +test.test_list.ListTest.test_insert @ linux-x86_64 +test.test_list.ListTest.test_iterator_pickle @ linux-x86_64 +test.test_list.ListTest.test_keyword_args @ linux-x86_64 +test.test_list.ListTest.test_len @ linux-x86_64 +test.test_list.ListTest.test_list_resize_overflow @ linux-x86_64 +test.test_list.ListTest.test_minmax @ linux-x86_64 +test.test_list.ListTest.test_no_comdat_folding @ linux-x86_64 +test.test_list.ListTest.test_overflow @ linux-x86_64 +test.test_list.ListTest.test_pickle @ linux-x86_64 +test.test_list.ListTest.test_pop @ linux-x86_64 +test.test_list.ListTest.test_remove @ linux-x86_64 +test.test_list.ListTest.test_repeat @ linux-x86_64 +test.test_list.ListTest.test_repr @ linux-x86_64 +!test.test_list.ListTest.test_repr_deep @ linux-x86_64 +test.test_list.ListTest.test_repr_large @ linux-x86_64 +test.test_list.ListTest.test_reverse @ linux-x86_64 +test.test_list.ListTest.test_reversed @ linux-x86_64 +test.test_list.ListTest.test_reversed_pickle @ linux-x86_64 +test.test_list.ListTest.test_set_subscript @ linux-x86_64 +test.test_list.ListTest.test_setitem @ linux-x86_64 +test.test_list.ListTest.test_setitem_error @ linux-x86_64 +test.test_list.ListTest.test_setslice @ linux-x86_64 +test.test_list.ListTest.test_slice @ linux-x86_64 +test.test_list.ListTest.test_sort @ linux-x86_64 +test.test_list.ListTest.test_step_overflow @ linux-x86_64 +test.test_list.ListTest.test_subscript @ linux-x86_64 +test.test_list.ListTest.test_truth @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_listcomps.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_listcomps.txt new file mode 100644 index 0000000000..bcd126d9d0 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_listcomps.txt @@ -0,0 +1 @@ +DocTestCase.test.test_listcomps.__test__.doctests @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_locale.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_locale.txt new file mode 100644 index 0000000000..6b7019e95f --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_locale.txt @@ -0,0 +1,59 @@ +test.test_locale.NormalizeTest.test_c @ linux-x86_64 +test.test_locale.NormalizeTest.test_devanagari_modifier @ linux-x86_64 +test.test_locale.NormalizeTest.test_empty @ linux-x86_64 +test.test_locale.NormalizeTest.test_english @ linux-x86_64 +test.test_locale.NormalizeTest.test_euc_encoding @ linux-x86_64 +test.test_locale.NormalizeTest.test_euro_modifier @ linux-x86_64 +test.test_locale.NormalizeTest.test_hyphenated_encoding @ linux-x86_64 +test.test_locale.NormalizeTest.test_japanese @ linux-x86_64 +test.test_locale.NormalizeTest.test_latin_modifier @ linux-x86_64 +test.test_locale.NormalizeTest.test_locale_alias @ linux-x86_64 +test.test_locale.NormalizeTest.test_valencia_modifier @ linux-x86_64 +test.test_locale.TestCDelocalizeTest.test_atof @ linux-x86_64 +test.test_locale.TestCDelocalizeTest.test_atoi @ linux-x86_64 +test.test_locale.TestCDelocalizeTest.test_delocalize @ linux-x86_64 +test.test_locale.TestCLocalize.test_localize @ linux-x86_64 +test.test_locale.TestCNumberFormatting.test_grouping @ linux-x86_64 +test.test_locale.TestCNumberFormatting.test_grouping_and_padding @ linux-x86_64 +test.test_locale.TestEnUSDelocalize.test_atof @ linux-x86_64 +test.test_locale.TestEnUSDelocalize.test_atoi @ linux-x86_64 +test.test_locale.TestEnUSDelocalize.test_delocalize @ linux-x86_64 +test.test_locale.TestEnUSLocalize.test_localize @ linux-x86_64 +test.test_locale.TestEnUSNumberFormatting.test_complex_formatting @ linux-x86_64 +test.test_locale.TestEnUSNumberFormatting.test_currency @ linux-x86_64 +test.test_locale.TestEnUSNumberFormatting.test_format_deprecation @ linux-x86_64 +test.test_locale.TestEnUSNumberFormatting.test_grouping @ linux-x86_64 +test.test_locale.TestEnUSNumberFormatting.test_grouping_and_padding @ linux-x86_64 +test.test_locale.TestEnUSNumberFormatting.test_integer_grouping @ linux-x86_64 +test.test_locale.TestEnUSNumberFormatting.test_integer_grouping_and_padding @ linux-x86_64 +test.test_locale.TestEnUSNumberFormatting.test_padding @ linux-x86_64 +test.test_locale.TestEnUSNumberFormatting.test_simple @ linux-x86_64 +test.test_locale.TestFormatPatternArg.test_onlyOnePattern @ linux-x86_64 +test.test_locale.TestFrFRNumberFormatting.test_currency @ linux-x86_64 +test.test_locale.TestFrFRNumberFormatting.test_decimal_point @ linux-x86_64 +test.test_locale.TestFrFRNumberFormatting.test_grouping @ linux-x86_64 +test.test_locale.TestFrFRNumberFormatting.test_grouping_and_padding @ linux-x86_64 +test.test_locale.TestFrFRNumberFormatting.test_integer_grouping @ linux-x86_64 +test.test_locale.TestFrFRNumberFormatting.test_integer_grouping_and_padding @ linux-x86_64 +test.test_locale.TestLocaleFormatString.test_mapping @ linux-x86_64 +test.test_locale.TestLocaleFormatString.test_percent_escape @ linux-x86_64 +test.test_locale.TestMiscellaneous.test_defaults_UTF8 @ linux-x86_64 +test.test_locale.TestMiscellaneous.test_getencoding @ linux-x86_64 +test.test_locale.TestMiscellaneous.test_getpreferredencoding @ linux-x86_64 +test.test_locale.TestMiscellaneous.test_getsetlocale_issue1813 @ linux-x86_64 +test.test_locale.TestMiscellaneous.test_invalid_iterable_in_localetuple @ linux-x86_64 +test.test_locale.TestMiscellaneous.test_invalid_locale_format_in_localetuple @ linux-x86_64 +test.test_locale.TestMiscellaneous.test_setlocale_category @ linux-x86_64 +test.test_locale.TestMiscellaneous.test_strcoll_3303 @ linux-x86_64 +test.test_locale.TestNumberFormatting.test_complex_formatting @ linux-x86_64 +test.test_locale.TestNumberFormatting.test_format_deprecation @ linux-x86_64 +test.test_locale.TestNumberFormatting.test_grouping @ linux-x86_64 +test.test_locale.TestNumberFormatting.test_grouping_and_padding @ linux-x86_64 +test.test_locale.TestNumberFormatting.test_integer_grouping @ linux-x86_64 +test.test_locale.TestNumberFormatting.test_integer_grouping_and_padding @ linux-x86_64 +test.test_locale.TestNumberFormatting.test_padding @ linux-x86_64 +test.test_locale.TestNumberFormatting.test_simple @ linux-x86_64 +test.test_locale.TestfrFRDelocalizeTest.test_atof @ linux-x86_64 +test.test_locale.TestfrFRDelocalizeTest.test_atoi @ linux-x86_64 +test.test_locale.TestfrFRDelocalizeTest.test_delocalize @ linux-x86_64 +test.test_locale.TestfrFRLocalize.test_localize @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_logging.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_logging.txt new file mode 100644 index 0000000000..351d580133 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_logging.txt @@ -0,0 +1,216 @@ +test.test_logging.BasicConfigTest.test_critical @ linux-x86_64 +test.test_logging.BasicConfigTest.test_datefmt @ linux-x86_64 +test.test_logging.BasicConfigTest.test_debug @ linux-x86_64 +test.test_logging.BasicConfigTest.test_encoding @ linux-x86_64 +test.test_logging.BasicConfigTest.test_encoding_errors @ linux-x86_64 +test.test_logging.BasicConfigTest.test_encoding_errors_default @ linux-x86_64 +test.test_logging.BasicConfigTest.test_encoding_errors_none @ linux-x86_64 +test.test_logging.BasicConfigTest.test_error @ linux-x86_64 +test.test_logging.BasicConfigTest.test_filemode @ linux-x86_64 +test.test_logging.BasicConfigTest.test_filename @ linux-x86_64 +test.test_logging.BasicConfigTest.test_force @ linux-x86_64 +test.test_logging.BasicConfigTest.test_format @ linux-x86_64 +test.test_logging.BasicConfigTest.test_handlers @ linux-x86_64 +test.test_logging.BasicConfigTest.test_incompatible @ linux-x86_64 +test.test_logging.BasicConfigTest.test_info @ linux-x86_64 +test.test_logging.BasicConfigTest.test_level @ linux-x86_64 +test.test_logging.BasicConfigTest.test_log @ linux-x86_64 +test.test_logging.BasicConfigTest.test_no_kwargs @ linux-x86_64 +test.test_logging.BasicConfigTest.test_stream @ linux-x86_64 +test.test_logging.BasicConfigTest.test_strformatstyle @ linux-x86_64 +test.test_logging.BasicConfigTest.test_stringtemplatestyle @ linux-x86_64 +test.test_logging.BasicConfigTest.test_style @ linux-x86_64 +test.test_logging.BasicConfigTest.test_warning @ linux-x86_64 +test.test_logging.BasicFilterTest.test_callable_filter @ linux-x86_64 +test.test_logging.BasicFilterTest.test_empty_filter @ linux-x86_64 +test.test_logging.BasicFilterTest.test_filter @ linux-x86_64 +test.test_logging.BufferingFormatterTest.test_custom @ linux-x86_64 +test.test_logging.BufferingFormatterTest.test_default @ linux-x86_64 +test.test_logging.BuiltinLevelsTest.test_flat @ linux-x86_64 +test.test_logging.BuiltinLevelsTest.test_issue27935 @ linux-x86_64 +test.test_logging.BuiltinLevelsTest.test_nested_explicit @ linux-x86_64 +test.test_logging.BuiltinLevelsTest.test_nested_inherited @ linux-x86_64 +test.test_logging.BuiltinLevelsTest.test_nested_with_virtual_parent @ linux-x86_64 +test.test_logging.BuiltinLevelsTest.test_regression_22386 @ linux-x86_64 +test.test_logging.BuiltinLevelsTest.test_regression_29220 @ linux-x86_64 +test.test_logging.ChildLoggerTest.test_child_loggers @ linux-x86_64 +test.test_logging.ConfigDictTest.test_90195 @ linux-x86_64 +test.test_logging.ConfigDictTest.test_baseconfig @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config0_ok @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config11_ok @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config12_failure @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config13_failure @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config14_ok @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config15_ok @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config17_ok @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config1_ok @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config2_failure @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config2a_failure @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config2b_failure @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config3_failure @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config4_ok @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config4a_ok @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config5_ok @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config6_failure @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config7_ok @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config_10_ok @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config_8_ok @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config_8a_ok @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config_9_ok @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config_callable_filter_works @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config_filter_method_works @ linux-x86_64 +test.test_logging.ConfigDictTest.test_config_filter_works @ linux-x86_64 +test.test_logging.ConfigDictTest.test_custom_formatter_class_with_validate @ linux-x86_64 +test.test_logging.ConfigDictTest.test_custom_formatter_class_with_validate2 @ linux-x86_64 +test.test_logging.ConfigDictTest.test_custom_formatter_class_with_validate2_with_wrong_fmt @ linux-x86_64 +test.test_logging.ConfigDictTest.test_custom_formatter_class_with_validate3 @ linux-x86_64 +test.test_logging.ConfigDictTest.test_custom_formatter_function_with_validate @ linux-x86_64 +test.test_logging.ConfigDictTest.test_invalid_type_raises @ linux-x86_64 +!test.test_logging.ConfigDictTest.test_listen_config_10_ok @ linux-x86_64 +!test.test_logging.ConfigDictTest.test_listen_config_1_ok @ linux-x86_64 +!test.test_logging.ConfigDictTest.test_listen_verify @ linux-x86_64 +test.test_logging.ConfigDictTest.test_namedtuple @ linux-x86_64 +test.test_logging.ConfigDictTest.test_out_of_order @ linux-x86_64 +test.test_logging.ConfigDictTest.test_out_of_order_with_dollar_style @ linux-x86_64 +test.test_logging.ConfigFileTest.test_config0_ok @ linux-x86_64 +test.test_logging.ConfigFileTest.test_config0_using_cp_ok @ linux-x86_64 +test.test_logging.ConfigFileTest.test_config1_ok @ linux-x86_64 +test.test_logging.ConfigFileTest.test_config2_failure @ linux-x86_64 +test.test_logging.ConfigFileTest.test_config3_failure @ linux-x86_64 +test.test_logging.ConfigFileTest.test_config4_ok @ linux-x86_64 +test.test_logging.ConfigFileTest.test_config5_ok @ linux-x86_64 +test.test_logging.ConfigFileTest.test_config6_ok @ linux-x86_64 +test.test_logging.ConfigFileTest.test_config7_ok @ linux-x86_64 +test.test_logging.ConfigFileTest.test_config8_ok @ linux-x86_64 +test.test_logging.ConfigFileTest.test_config_set_handler_names @ linux-x86_64 +test.test_logging.ConfigFileTest.test_defaults_do_no_interpolation @ linux-x86_64 +test.test_logging.ConfigFileTest.test_exception_if_confg_file_is_empty @ linux-x86_64 +test.test_logging.ConfigFileTest.test_exception_if_confg_file_is_invalid @ linux-x86_64 +test.test_logging.ConfigFileTest.test_exception_if_config_file_does_not_exist @ linux-x86_64 +test.test_logging.ConfigFileTest.test_logger_disabling @ linux-x86_64 +test.test_logging.CustomLevelsAndFiltersTest.test_handler_filter @ linux-x86_64 +test.test_logging.CustomLevelsAndFiltersTest.test_logger_filter @ linux-x86_64 +test.test_logging.CustomLevelsAndFiltersTest.test_specific_filters @ linux-x86_64 +test.test_logging.DatagramHandlerTest.test_output @ linux-x86_64 +test.test_logging.EncodingTest.test_encoding_cyrillic_unicode @ linux-x86_64 +test.test_logging.EncodingTest.test_encoding_plain_file @ linux-x86_64 +test.test_logging.ExceptionTest.test_formatting @ linux-x86_64 +test.test_logging.FileHandlerTest.test_delay @ linux-x86_64 +test.test_logging.FileHandlerTest.test_emit_after_closing_in_write_mode @ linux-x86_64 +test.test_logging.FormatterTest.test_braces @ linux-x86_64 +test.test_logging.FormatterTest.test_default_msec_format_none @ linux-x86_64 +test.test_logging.FormatterTest.test_defaults_parameter @ linux-x86_64 +test.test_logging.FormatterTest.test_dollars @ linux-x86_64 +test.test_logging.FormatterTest.test_format_validate @ linux-x86_64 +test.test_logging.FormatterTest.test_invalid_style @ linux-x86_64 +test.test_logging.FormatterTest.test_issue_89047 @ linux-x86_64 +test.test_logging.FormatterTest.test_percent @ linux-x86_64 +test.test_logging.FormatterTest.test_time @ linux-x86_64 +test.test_logging.HTTPHandlerTest.test_output @ linux-x86_64 +test.test_logging.HandlerTest.test_builtin_handlers @ linux-x86_64 +test.test_logging.HandlerTest.test_name @ linux-x86_64 +test.test_logging.HandlerTest.test_path_objects @ linux-x86_64 +test.test_logging.HandlerTest.test_race @ linux-x86_64 +test.test_logging.IPv6SysLogHandlerTest.test_output @ linux-x86_64 +test.test_logging.IPv6SysLogHandlerTest.test_udp_reconnection @ linux-x86_64 +test.test_logging.LastResortTest.test_last_resort @ linux-x86_64 +test.test_logging.LogRecordFactoryTest.test_logrecord_class @ linux-x86_64 +test.test_logging.LogRecordTest.test_dict_arg @ linux-x86_64 +test.test_logging.LogRecordTest.test_multiprocessing @ linux-x86_64 +test.test_logging.LogRecordTest.test_optional @ linux-x86_64 +test.test_logging.LogRecordTest.test_str_rep @ linux-x86_64 +test.test_logging.LoggerAdapterTest.test_critical @ linux-x86_64 +test.test_logging.LoggerAdapterTest.test_exception @ linux-x86_64 +test.test_logging.LoggerAdapterTest.test_exception_excinfo @ linux-x86_64 +test.test_logging.LoggerAdapterTest.test_has_handlers @ linux-x86_64 +test.test_logging.LoggerAdapterTest.test_is_enabled_for @ linux-x86_64 +test.test_logging.LoggerAdapterTest.test_nested @ linux-x86_64 +test.test_logging.LoggerTest.test_caching @ linux-x86_64 +test.test_logging.LoggerTest.test_exception @ linux-x86_64 +test.test_logging.LoggerTest.test_find_caller_with_stack_info @ linux-x86_64 +test.test_logging.LoggerTest.test_find_caller_with_stacklevel @ linux-x86_64 +test.test_logging.LoggerTest.test_has_handlers @ linux-x86_64 +test.test_logging.LoggerTest.test_has_handlers_no_propagate @ linux-x86_64 +test.test_logging.LoggerTest.test_invalid_names @ linux-x86_64 +test.test_logging.LoggerTest.test_is_enabled_for @ linux-x86_64 +test.test_logging.LoggerTest.test_is_enabled_for_disabled_logger @ linux-x86_64 +test.test_logging.LoggerTest.test_log_invalid_level_no_raise @ linux-x86_64 +test.test_logging.LoggerTest.test_log_invalid_level_with_raise @ linux-x86_64 +test.test_logging.LoggerTest.test_make_record_with_extra_no_overwrite @ linux-x86_64 +test.test_logging.LoggerTest.test_make_record_with_extra_overwrite @ linux-x86_64 +test.test_logging.LoggerTest.test_pickling @ linux-x86_64 +test.test_logging.LoggerTest.test_root_logger_aliases @ linux-x86_64 +test.test_logging.LoggerTest.test_set_invalid_level @ linux-x86_64 +test.test_logging.ManagerTest.test_manager_loggerclass @ linux-x86_64 +test.test_logging.ManagerTest.test_set_log_record_factory @ linux-x86_64 +test.test_logging.MemoryHandlerTest.test_flush @ linux-x86_64 +test.test_logging.MemoryHandlerTest.test_flush_on_close @ linux-x86_64 +test.test_logging.MemoryHandlerTest.test_race_between_set_target_and_flush @ linux-x86_64 +test.test_logging.MemoryTest.test_persistent_loggers @ linux-x86_64 +test.test_logging.MiscTestCase.test__all__ @ linux-x86_64 +test.test_logging.ModuleLevelMiscTest.test_critical @ linux-x86_64 +test.test_logging.ModuleLevelMiscTest.test_debug @ linux-x86_64 +test.test_logging.ModuleLevelMiscTest.test_disable @ linux-x86_64 +test.test_logging.ModuleLevelMiscTest.test_error @ linux-x86_64 +test.test_logging.ModuleLevelMiscTest.test_get_level_names_mapping @ linux-x86_64 +test.test_logging.ModuleLevelMiscTest.test_info @ linux-x86_64 +test.test_logging.ModuleLevelMiscTest.test_log @ linux-x86_64 +test.test_logging.ModuleLevelMiscTest.test_recursion_error @ linux-x86_64 +test.test_logging.ModuleLevelMiscTest.test_set_logger_class @ linux-x86_64 +test.test_logging.ModuleLevelMiscTest.test_subclass_logger_cache @ linux-x86_64 +test.test_logging.ModuleLevelMiscTest.test_warning @ linux-x86_64 +test.test_logging.QueueHandlerTest.test_formatting @ linux-x86_64 +test.test_logging.QueueHandlerTest.test_queue_handler @ linux-x86_64 +test.test_logging.QueueHandlerTest.test_queue_listener @ linux-x86_64 +test.test_logging.QueueHandlerTest.test_queue_listener_with_StreamHandler @ linux-x86_64 +test.test_logging.QueueHandlerTest.test_queue_listener_with_multiple_handlers @ linux-x86_64 +test.test_logging.QueueListenerTest.test_calls_task_done_after_stop @ linux-x86_64 +test.test_logging.QueueListenerTest.test_handle_called_with_mp_queue @ linux-x86_64 +test.test_logging.QueueListenerTest.test_handle_called_with_queue_queue @ linux-x86_64 +test.test_logging.QueueListenerTest.test_no_messages_in_queue_after_stop @ linux-x86_64 +test.test_logging.RotatingFileHandlerTest.test_file_created @ linux-x86_64 +test.test_logging.RotatingFileHandlerTest.test_namer_rotator_inheritance @ linux-x86_64 +test.test_logging.RotatingFileHandlerTest.test_rollover_filenames @ linux-x86_64 +test.test_logging.RotatingFileHandlerTest.test_rotator @ linux-x86_64 +test.test_logging.RotatingFileHandlerTest.test_should_not_rollover @ linux-x86_64 +test.test_logging.RotatingFileHandlerTest.test_should_rollover @ linux-x86_64 +test.test_logging.SMTPHandlerTest.test_basic @ linux-x86_64 +test.test_logging.ShutdownTest.test_no_failure @ linux-x86_64 +test.test_logging.ShutdownTest.test_with_ioerror_in_acquire @ linux-x86_64 +test.test_logging.ShutdownTest.test_with_ioerror_in_close @ linux-x86_64 +test.test_logging.ShutdownTest.test_with_ioerror_in_flush @ linux-x86_64 +test.test_logging.ShutdownTest.test_with_other_error_in_acquire_with_raise @ linux-x86_64 +test.test_logging.ShutdownTest.test_with_other_error_in_acquire_without_raise @ linux-x86_64 +test.test_logging.ShutdownTest.test_with_other_error_in_close_with_raise @ linux-x86_64 +test.test_logging.ShutdownTest.test_with_other_error_in_close_without_raise @ linux-x86_64 +test.test_logging.ShutdownTest.test_with_other_error_in_flush_with_raise @ linux-x86_64 +test.test_logging.ShutdownTest.test_with_other_error_in_flush_without_raise @ linux-x86_64 +test.test_logging.ShutdownTest.test_with_valueerror_in_acquire @ linux-x86_64 +test.test_logging.ShutdownTest.test_with_valueerror_in_close @ linux-x86_64 +test.test_logging.ShutdownTest.test_with_valueerror_in_flush @ linux-x86_64 +test.test_logging.SocketHandlerTest.test_noserver @ linux-x86_64 +test.test_logging.SocketHandlerTest.test_output @ linux-x86_64 +test.test_logging.StreamHandlerTest.test_can_represent_stream_with_int_name @ linux-x86_64 +test.test_logging.StreamHandlerTest.test_error_handling @ linux-x86_64 +test.test_logging.StreamHandlerTest.test_stream_setting @ linux-x86_64 +test.test_logging.SysLogHandlerTest.test_output @ linux-x86_64 +test.test_logging.SysLogHandlerTest.test_udp_reconnection @ linux-x86_64 +test.test_logging.TimedRotatingFileHandlerTest.test_compute_files_to_delete @ linux-x86_64 +test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_D @ linux-x86_64 +test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_H @ linux-x86_64 +test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_M @ linux-x86_64 +test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_MIDNIGHT @ linux-x86_64 +test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_S @ linux-x86_64 +test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_W0 @ linux-x86_64 +test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_daily_attime @ linux-x86_64 +test.test_logging.TimedRotatingFileHandlerTest.test_compute_rollover_weekly_attime @ linux-x86_64 +test.test_logging.TimedRotatingFileHandlerTest.test_invalid @ linux-x86_64 +test.test_logging.TimedRotatingFileHandlerTest.test_rollover @ linux-x86_64 +test.test_logging.TimedRotatingFileHandlerTest.test_should_not_rollover @ linux-x86_64 +test.test_logging.UnixDatagramHandlerTest.test_output @ linux-x86_64 +test.test_logging.UnixSocketHandlerTest.test_noserver @ linux-x86_64 +test.test_logging.UnixSocketHandlerTest.test_output @ linux-x86_64 +test.test_logging.UnixSysLogHandlerTest.test_output @ linux-x86_64 +test.test_logging.UnixSysLogHandlerTest.test_udp_reconnection @ linux-x86_64 +test.test_logging.WarningsTest.test_warnings @ linux-x86_64 +test.test_logging.WarningsTest.test_warnings_no_handlers @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_long.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_long.txt new file mode 100644 index 0000000000..0f67c14d7a --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_long.txt @@ -0,0 +1,34 @@ +test.test_long.LongTest.test__format__ @ linux-x86_64 +test.test_long.LongTest.test_access_to_nonexistent_digit_0 @ linux-x86_64 +test.test_long.LongTest.test_as_integer_ratio @ linux-x86_64 +test.test_long.LongTest.test_big_lshift @ linux-x86_64 +test.test_long.LongTest.test_big_rshift @ linux-x86_64 +test.test_long.LongTest.test_bit_count @ linux-x86_64 +test.test_long.LongTest.test_bit_length @ linux-x86_64 +test.test_long.LongTest.test_bitop_identities @ linux-x86_64 +test.test_long.LongTest.test_conversion @ linux-x86_64 +test.test_long.LongTest.test_division @ linux-x86_64 +test.test_long.LongTest.test_float_conversion @ linux-x86_64 +test.test_long.LongTest.test_float_overflow @ linux-x86_64 +test.test_long.LongTest.test_floordiv @ linux-x86_64 +test.test_long.LongTest.test_format @ linux-x86_64 +test.test_long.LongTest.test_from_bytes @ linux-x86_64 +test.test_long.LongTest.test_huge_rshift @ linux-x86_64 +test.test_long.LongTest.test_karatsuba @ linux-x86_64 +test.test_long.LongTest.test_logs @ linux-x86_64 +test.test_long.LongTest.test_long @ linux-x86_64 +test.test_long.LongTest.test_lshift_of_zero @ linux-x86_64 +test.test_long.LongTest.test_medium_lshift @ linux-x86_64 +test.test_long.LongTest.test_medium_rshift @ linux-x86_64 +test.test_long.LongTest.test_mixed_compares @ linux-x86_64 +test.test_long.LongTest.test_mod_division @ linux-x86_64 +test.test_long.LongTest.test_nan_inf @ linux-x86_64 +test.test_long.LongTest.test_negative_shift_count @ linux-x86_64 +test.test_long.LongTest.test_round @ linux-x86_64 +test.test_long.LongTest.test_shift_bool @ linux-x86_64 +test.test_long.LongTest.test_small_ints @ linux-x86_64 +test.test_long.LongTest.test_small_lshift @ linux-x86_64 +test.test_long.LongTest.test_small_rshift @ linux-x86_64 +test.test_long.LongTest.test_square @ linux-x86_64 +test.test_long.LongTest.test_to_bytes @ linux-x86_64 +test.test_long.LongTest.test_true_division @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_longexp.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_longexp.txt new file mode 100644 index 0000000000..c5c0fdea81 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_longexp.txt @@ -0,0 +1 @@ +test.test_longexp.LongExpText.test_longexp @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_lzma.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_lzma.txt new file mode 100644 index 0000000000..00c3f5d4f1 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_lzma.txt @@ -0,0 +1,112 @@ +test.test_lzma.CompressDecompressFunctionTestCase.test_bad_args @ linux-x86_64 +test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_bad_input @ linux-x86_64 +test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_good_input @ linux-x86_64 +test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_incomplete_input @ linux-x86_64 +test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_memlimit @ linux-x86_64 +test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_multistream @ linux-x86_64 +test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_multistream_trailing_junk @ linux-x86_64 +test.test_lzma.CompressDecompressFunctionTestCase.test_decompress_trailing_junk @ linux-x86_64 +test.test_lzma.CompressDecompressFunctionTestCase.test_roundtrip @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_bad_filter_spec @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_compressor_bigmem @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_after_eof @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_alone @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_auto @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_bad_input @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_bigmem @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_bug_28275 @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_chunks @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_chunks_empty @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_chunks_maxsize @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_inputbuf_1 @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_inputbuf_2 @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_inputbuf_3 @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_memlimit @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_multistream @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_raw_1 @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_raw_2 @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_raw_3 @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_raw_4 @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_unused_data @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_decompressor_xz @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_roundtrip_alone @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_roundtrip_chunks @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_roundtrip_empty_chunks @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_roundtrip_raw @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_roundtrip_raw_empty @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_roundtrip_xz @ linux-x86_64 +test.test_lzma.CompressorDecompressorTestCase.test_simple_bad_args @ linux-x86_64 +test.test_lzma.FileTestCase.test_close @ linux-x86_64 +test.test_lzma.FileTestCase.test_closed @ linux-x86_64 +test.test_lzma.FileTestCase.test_decompress_limited @ linux-x86_64 +test.test_lzma.FileTestCase.test_fileno @ linux-x86_64 +test.test_lzma.FileTestCase.test_init @ linux-x86_64 +test.test_lzma.FileTestCase.test_init_bad_check @ linux-x86_64 +test.test_lzma.FileTestCase.test_init_bad_filter_spec @ linux-x86_64 +test.test_lzma.FileTestCase.test_init_bad_mode @ linux-x86_64 +test.test_lzma.FileTestCase.test_init_bad_preset @ linux-x86_64 +test.test_lzma.FileTestCase.test_init_mode @ linux-x86_64 +test.test_lzma.FileTestCase.test_init_with_PathLike_filename @ linux-x86_64 +test.test_lzma.FileTestCase.test_init_with_filename @ linux-x86_64 +test.test_lzma.FileTestCase.test_init_with_preset_and_filters @ linux-x86_64 +test.test_lzma.FileTestCase.test_init_with_x_mode @ linux-x86_64 +test.test_lzma.FileTestCase.test_issue21872 @ linux-x86_64 +test.test_lzma.FileTestCase.test_issue44439 @ linux-x86_64 +test.test_lzma.FileTestCase.test_iterator @ linux-x86_64 +test.test_lzma.FileTestCase.test_peek @ linux-x86_64 +test.test_lzma.FileTestCase.test_peek_bad_args @ linux-x86_64 +test.test_lzma.FileTestCase.test_read @ linux-x86_64 +test.test_lzma.FileTestCase.test_read1 @ linux-x86_64 +test.test_lzma.FileTestCase.test_read1_0 @ linux-x86_64 +test.test_lzma.FileTestCase.test_read1_10 @ linux-x86_64 +test.test_lzma.FileTestCase.test_read1_bad_args @ linux-x86_64 +test.test_lzma.FileTestCase.test_read1_multistream @ linux-x86_64 +test.test_lzma.FileTestCase.test_read_0 @ linux-x86_64 +test.test_lzma.FileTestCase.test_read_10 @ linux-x86_64 +test.test_lzma.FileTestCase.test_read_bad_args @ linux-x86_64 +test.test_lzma.FileTestCase.test_read_bad_data @ linux-x86_64 +test.test_lzma.FileTestCase.test_read_from_file @ linux-x86_64 +test.test_lzma.FileTestCase.test_read_incomplete @ linux-x86_64 +test.test_lzma.FileTestCase.test_read_multistream @ linux-x86_64 +test.test_lzma.FileTestCase.test_read_multistream_buffer_size_aligned @ linux-x86_64 +test.test_lzma.FileTestCase.test_read_multistream_trailing_junk @ linux-x86_64 +test.test_lzma.FileTestCase.test_read_trailing_junk @ linux-x86_64 +test.test_lzma.FileTestCase.test_read_truncated @ linux-x86_64 +test.test_lzma.FileTestCase.test_readable @ linux-x86_64 +test.test_lzma.FileTestCase.test_readline @ linux-x86_64 +test.test_lzma.FileTestCase.test_readlines @ linux-x86_64 +test.test_lzma.FileTestCase.test_seek_backward @ linux-x86_64 +test.test_lzma.FileTestCase.test_seek_backward_across_streams @ linux-x86_64 +test.test_lzma.FileTestCase.test_seek_backward_relative_to_end @ linux-x86_64 +test.test_lzma.FileTestCase.test_seek_bad_args @ linux-x86_64 +test.test_lzma.FileTestCase.test_seek_forward @ linux-x86_64 +test.test_lzma.FileTestCase.test_seek_forward_across_streams @ linux-x86_64 +test.test_lzma.FileTestCase.test_seek_forward_relative_to_current @ linux-x86_64 +test.test_lzma.FileTestCase.test_seek_forward_relative_to_end @ linux-x86_64 +test.test_lzma.FileTestCase.test_seek_past_end @ linux-x86_64 +test.test_lzma.FileTestCase.test_seek_past_start @ linux-x86_64 +test.test_lzma.FileTestCase.test_seekable @ linux-x86_64 +test.test_lzma.FileTestCase.test_tell @ linux-x86_64 +test.test_lzma.FileTestCase.test_tell_bad_args @ linux-x86_64 +test.test_lzma.FileTestCase.test_writable @ linux-x86_64 +test.test_lzma.FileTestCase.test_write @ linux-x86_64 +test.test_lzma.FileTestCase.test_write_10 @ linux-x86_64 +test.test_lzma.FileTestCase.test_write_append @ linux-x86_64 +test.test_lzma.FileTestCase.test_write_append_to_file @ linux-x86_64 +test.test_lzma.FileTestCase.test_write_bad_args @ linux-x86_64 +test.test_lzma.FileTestCase.test_write_to_file @ linux-x86_64 +test.test_lzma.FileTestCase.test_writelines @ linux-x86_64 +test.test_lzma.MiscellaneousTestCase.test__decode_filter_properties @ linux-x86_64 +test.test_lzma.MiscellaneousTestCase.test__encode_filter_properties @ linux-x86_64 +test.test_lzma.MiscellaneousTestCase.test_filter_properties_roundtrip @ linux-x86_64 +test.test_lzma.MiscellaneousTestCase.test_is_check_supported @ linux-x86_64 +test.test_lzma.OpenTestCase.test_bad_params @ linux-x86_64 +test.test_lzma.OpenTestCase.test_binary_modes @ linux-x86_64 +test.test_lzma.OpenTestCase.test_encoding @ linux-x86_64 +test.test_lzma.OpenTestCase.test_encoding_error_handler @ linux-x86_64 +test.test_lzma.OpenTestCase.test_filename @ linux-x86_64 +test.test_lzma.OpenTestCase.test_format_and_filters @ linux-x86_64 +test.test_lzma.OpenTestCase.test_newline @ linux-x86_64 +test.test_lzma.OpenTestCase.test_text_modes @ linux-x86_64 +test.test_lzma.OpenTestCase.test_with_pathlike_filename @ linux-x86_64 +test.test_lzma.OpenTestCase.test_x_mode @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_mailbox.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_mailbox.txt new file mode 100644 index 0000000000..ea9aa189f9 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_mailbox.txt @@ -0,0 +1,362 @@ +test.test_mailbox.MaildirTestCase.test_empty_maildir @ linux-x86_64 +test.test_mailbox.MaildirTestCase.test_nonempty_maildir_both @ linux-x86_64 +test.test_mailbox.MaildirTestCase.test_nonempty_maildir_cur @ linux-x86_64 +test.test_mailbox.MaildirTestCase.test_nonempty_maildir_new @ linux-x86_64 +test.test_mailbox.MiscTestCase.test__all__ @ linux-x86_64 +test.test_mailbox.TestBabyl.test_add @ linux-x86_64 +test.test_mailbox.TestBabyl.test_add_8bit_body @ linux-x86_64 +test.test_mailbox.TestBabyl.test_add_StringIO_warns @ linux-x86_64 +test.test_mailbox.TestBabyl.test_add_binary_file @ linux-x86_64 +test.test_mailbox.TestBabyl.test_add_binary_nonascii_file @ linux-x86_64 +test.test_mailbox.TestBabyl.test_add_doesnt_rewrite @ linux-x86_64 +test.test_mailbox.TestBabyl.test_add_invalid_8bit_bytes_header @ linux-x86_64 +test.test_mailbox.TestBabyl.test_add_nonascii_StringIO_raises @ linux-x86_64 +test.test_mailbox.TestBabyl.test_add_nonascii_string_header_raises @ linux-x86_64 +test.test_mailbox.TestBabyl.test_add_text_file_warns @ linux-x86_64 +test.test_mailbox.TestBabyl.test_add_that_raises_leaves_mailbox_empty @ linux-x86_64 +test.test_mailbox.TestBabyl.test_clear @ linux-x86_64 +test.test_mailbox.TestBabyl.test_close @ linux-x86_64 +test.test_mailbox.TestBabyl.test_contains @ linux-x86_64 +test.test_mailbox.TestBabyl.test_delitem @ linux-x86_64 +test.test_mailbox.TestBabyl.test_discard @ linux-x86_64 +test.test_mailbox.TestBabyl.test_dump_message @ linux-x86_64 +test.test_mailbox.TestBabyl.test_flush @ linux-x86_64 +test.test_mailbox.TestBabyl.test_get @ linux-x86_64 +test.test_mailbox.TestBabyl.test_get_bytes @ linux-x86_64 +test.test_mailbox.TestBabyl.test_get_file @ linux-x86_64 +test.test_mailbox.TestBabyl.test_get_file_can_be_closed_twice @ linux-x86_64 +test.test_mailbox.TestBabyl.test_get_message @ linux-x86_64 +test.test_mailbox.TestBabyl.test_get_string @ linux-x86_64 +test.test_mailbox.TestBabyl.test_getitem @ linux-x86_64 +test.test_mailbox.TestBabyl.test_invalid_nonascii_header_as_string @ linux-x86_64 +test.test_mailbox.TestBabyl.test_items @ linux-x86_64 +test.test_mailbox.TestBabyl.test_iter @ linux-x86_64 +test.test_mailbox.TestBabyl.test_iteritems @ linux-x86_64 +test.test_mailbox.TestBabyl.test_iterkeys @ linux-x86_64 +test.test_mailbox.TestBabyl.test_itervalues @ linux-x86_64 +test.test_mailbox.TestBabyl.test_keys @ linux-x86_64 +test.test_mailbox.TestBabyl.test_labels @ linux-x86_64 +test.test_mailbox.TestBabyl.test_len @ linux-x86_64 +test.test_mailbox.TestBabyl.test_lock_unlock @ linux-x86_64 +test.test_mailbox.TestBabyl.test_permissions_after_flush @ linux-x86_64 +test.test_mailbox.TestBabyl.test_pop @ linux-x86_64 +test.test_mailbox.TestBabyl.test_popitem @ linux-x86_64 +test.test_mailbox.TestBabyl.test_popitem_and_flush_twice @ linux-x86_64 +test.test_mailbox.TestBabyl.test_remove @ linux-x86_64 +test.test_mailbox.TestBabyl.test_set_item @ linux-x86_64 +test.test_mailbox.TestBabyl.test_update @ linux-x86_64 +test.test_mailbox.TestBabyl.test_values @ linux-x86_64 +test.test_mailbox.TestBabylMessage.test_all_eMM_attributes_exist @ linux-x86_64 +test.test_mailbox.TestBabylMessage.test_become_message @ linux-x86_64 +test.test_mailbox.TestBabylMessage.test_explain_to @ linux-x86_64 +test.test_mailbox.TestBabylMessage.test_initialize_incorrectly @ linux-x86_64 +test.test_mailbox.TestBabylMessage.test_initialize_with_binary_file @ linux-x86_64 +test.test_mailbox.TestBabylMessage.test_initialize_with_eMM @ linux-x86_64 +test.test_mailbox.TestBabylMessage.test_initialize_with_file @ linux-x86_64 +test.test_mailbox.TestBabylMessage.test_initialize_with_nothing @ linux-x86_64 +test.test_mailbox.TestBabylMessage.test_initialize_with_string @ linux-x86_64 +test.test_mailbox.TestBabylMessage.test_labels @ linux-x86_64 +test.test_mailbox.TestBabylMessage.test_visible @ linux-x86_64 +test.test_mailbox.TestFakeMailBox.test_closing_fd @ linux-x86_64 +test.test_mailbox.TestMH.test_add @ linux-x86_64 +test.test_mailbox.TestMH.test_add_8bit_body @ linux-x86_64 +test.test_mailbox.TestMH.test_add_StringIO_warns @ linux-x86_64 +test.test_mailbox.TestMH.test_add_and_remove_folders @ linux-x86_64 +test.test_mailbox.TestMH.test_add_binary_file @ linux-x86_64 +test.test_mailbox.TestMH.test_add_binary_nonascii_file @ linux-x86_64 +test.test_mailbox.TestMH.test_add_invalid_8bit_bytes_header @ linux-x86_64 +test.test_mailbox.TestMH.test_add_nonascii_StringIO_raises @ linux-x86_64 +test.test_mailbox.TestMH.test_add_nonascii_string_header_raises @ linux-x86_64 +test.test_mailbox.TestMH.test_add_text_file_warns @ linux-x86_64 +test.test_mailbox.TestMH.test_add_that_raises_leaves_mailbox_empty @ linux-x86_64 +test.test_mailbox.TestMH.test_clear @ linux-x86_64 +test.test_mailbox.TestMH.test_close @ linux-x86_64 +test.test_mailbox.TestMH.test_contains @ linux-x86_64 +test.test_mailbox.TestMH.test_delitem @ linux-x86_64 +test.test_mailbox.TestMH.test_discard @ linux-x86_64 +test.test_mailbox.TestMH.test_dump_message @ linux-x86_64 +test.test_mailbox.TestMH.test_flush @ linux-x86_64 +test.test_mailbox.TestMH.test_get @ linux-x86_64 +test.test_mailbox.TestMH.test_get_bytes @ linux-x86_64 +test.test_mailbox.TestMH.test_get_file @ linux-x86_64 +test.test_mailbox.TestMH.test_get_file_can_be_closed_twice @ linux-x86_64 +test.test_mailbox.TestMH.test_get_folder @ linux-x86_64 +test.test_mailbox.TestMH.test_get_message @ linux-x86_64 +test.test_mailbox.TestMH.test_get_string @ linux-x86_64 +test.test_mailbox.TestMH.test_getitem @ linux-x86_64 +test.test_mailbox.TestMH.test_invalid_nonascii_header_as_string @ linux-x86_64 +test.test_mailbox.TestMH.test_issue2625 @ linux-x86_64 +test.test_mailbox.TestMH.test_issue7627 @ linux-x86_64 +test.test_mailbox.TestMH.test_items @ linux-x86_64 +test.test_mailbox.TestMH.test_iter @ linux-x86_64 +test.test_mailbox.TestMH.test_iteritems @ linux-x86_64 +test.test_mailbox.TestMH.test_iterkeys @ linux-x86_64 +test.test_mailbox.TestMH.test_itervalues @ linux-x86_64 +test.test_mailbox.TestMH.test_keys @ linux-x86_64 +test.test_mailbox.TestMH.test_len @ linux-x86_64 +test.test_mailbox.TestMH.test_list_folders @ linux-x86_64 +test.test_mailbox.TestMH.test_lock_unlock @ linux-x86_64 +test.test_mailbox.TestMH.test_pack @ linux-x86_64 +test.test_mailbox.TestMH.test_pop @ linux-x86_64 +test.test_mailbox.TestMH.test_popitem @ linux-x86_64 +test.test_mailbox.TestMH.test_popitem_and_flush_twice @ linux-x86_64 +test.test_mailbox.TestMH.test_remove @ linux-x86_64 +test.test_mailbox.TestMH.test_sequences @ linux-x86_64 +test.test_mailbox.TestMH.test_set_item @ linux-x86_64 +test.test_mailbox.TestMH.test_update @ linux-x86_64 +test.test_mailbox.TestMH.test_values @ linux-x86_64 +test.test_mailbox.TestMHMessage.test_all_eMM_attributes_exist @ linux-x86_64 +test.test_mailbox.TestMHMessage.test_become_message @ linux-x86_64 +test.test_mailbox.TestMHMessage.test_explain_to @ linux-x86_64 +test.test_mailbox.TestMHMessage.test_initialize_incorrectly @ linux-x86_64 +test.test_mailbox.TestMHMessage.test_initialize_with_binary_file @ linux-x86_64 +test.test_mailbox.TestMHMessage.test_initialize_with_eMM @ linux-x86_64 +test.test_mailbox.TestMHMessage.test_initialize_with_file @ linux-x86_64 +test.test_mailbox.TestMHMessage.test_initialize_with_nothing @ linux-x86_64 +test.test_mailbox.TestMHMessage.test_initialize_with_string @ linux-x86_64 +test.test_mailbox.TestMHMessage.test_sequences @ linux-x86_64 +test.test_mailbox.TestMMDF.test_add @ linux-x86_64 +test.test_mailbox.TestMMDF.test_add_8bit_body @ linux-x86_64 +test.test_mailbox.TestMMDF.test_add_StringIO_warns @ linux-x86_64 +test.test_mailbox.TestMMDF.test_add_and_close @ linux-x86_64 +test.test_mailbox.TestMMDF.test_add_binary_file @ linux-x86_64 +test.test_mailbox.TestMMDF.test_add_binary_nonascii_file @ linux-x86_64 +test.test_mailbox.TestMMDF.test_add_doesnt_rewrite @ linux-x86_64 +test.test_mailbox.TestMMDF.test_add_from_bytes @ linux-x86_64 +test.test_mailbox.TestMMDF.test_add_from_string @ linux-x86_64 +test.test_mailbox.TestMMDF.test_add_invalid_8bit_bytes_header @ linux-x86_64 +test.test_mailbox.TestMMDF.test_add_mbox_or_mmdf_message @ linux-x86_64 +test.test_mailbox.TestMMDF.test_add_nonascii_StringIO_raises @ linux-x86_64 +test.test_mailbox.TestMMDF.test_add_nonascii_string_header_raises @ linux-x86_64 +test.test_mailbox.TestMMDF.test_add_text_file_warns @ linux-x86_64 +test.test_mailbox.TestMMDF.test_add_that_raises_leaves_mailbox_empty @ linux-x86_64 +test.test_mailbox.TestMMDF.test_clear @ linux-x86_64 +test.test_mailbox.TestMMDF.test_close @ linux-x86_64 +test.test_mailbox.TestMMDF.test_contains @ linux-x86_64 +test.test_mailbox.TestMMDF.test_delitem @ linux-x86_64 +test.test_mailbox.TestMMDF.test_discard @ linux-x86_64 +test.test_mailbox.TestMMDF.test_dump_message @ linux-x86_64 +test.test_mailbox.TestMMDF.test_flush @ linux-x86_64 +test.test_mailbox.TestMMDF.test_get @ linux-x86_64 +test.test_mailbox.TestMMDF.test_get_bytes @ linux-x86_64 +test.test_mailbox.TestMMDF.test_get_bytes_from @ linux-x86_64 +test.test_mailbox.TestMMDF.test_get_file @ linux-x86_64 +test.test_mailbox.TestMMDF.test_get_file_can_be_closed_twice @ linux-x86_64 +test.test_mailbox.TestMMDF.test_get_message @ linux-x86_64 +test.test_mailbox.TestMMDF.test_get_string @ linux-x86_64 +test.test_mailbox.TestMMDF.test_get_string_from @ linux-x86_64 +test.test_mailbox.TestMMDF.test_getitem @ linux-x86_64 +test.test_mailbox.TestMMDF.test_invalid_nonascii_header_as_string @ linux-x86_64 +test.test_mailbox.TestMMDF.test_items @ linux-x86_64 +test.test_mailbox.TestMMDF.test_iter @ linux-x86_64 +test.test_mailbox.TestMMDF.test_iteritems @ linux-x86_64 +test.test_mailbox.TestMMDF.test_iterkeys @ linux-x86_64 +test.test_mailbox.TestMMDF.test_itervalues @ linux-x86_64 +test.test_mailbox.TestMMDF.test_keys @ linux-x86_64 +test.test_mailbox.TestMMDF.test_len @ linux-x86_64 +test.test_mailbox.TestMMDF.test_lock_unlock @ linux-x86_64 +test.test_mailbox.TestMMDF.test_open_close_open @ linux-x86_64 +test.test_mailbox.TestMMDF.test_permissions_after_flush @ linux-x86_64 +test.test_mailbox.TestMMDF.test_pop @ linux-x86_64 +test.test_mailbox.TestMMDF.test_popitem @ linux-x86_64 +test.test_mailbox.TestMMDF.test_popitem_and_flush_twice @ linux-x86_64 +test.test_mailbox.TestMMDF.test_relock @ linux-x86_64 +test.test_mailbox.TestMMDF.test_remove @ linux-x86_64 +test.test_mailbox.TestMMDF.test_set_item @ linux-x86_64 +test.test_mailbox.TestMMDF.test_update @ linux-x86_64 +test.test_mailbox.TestMMDF.test_values @ linux-x86_64 +test.test_mailbox.TestMMDFMessage.test_all_eMM_attributes_exist @ linux-x86_64 +test.test_mailbox.TestMMDFMessage.test_become_message @ linux-x86_64 +test.test_mailbox.TestMMDFMessage.test_explain_to @ linux-x86_64 +test.test_mailbox.TestMMDFMessage.test_flags @ linux-x86_64 +test.test_mailbox.TestMMDFMessage.test_from @ linux-x86_64 +test.test_mailbox.TestMMDFMessage.test_initialize_incorrectly @ linux-x86_64 +test.test_mailbox.TestMMDFMessage.test_initialize_with_binary_file @ linux-x86_64 +test.test_mailbox.TestMMDFMessage.test_initialize_with_eMM @ linux-x86_64 +test.test_mailbox.TestMMDFMessage.test_initialize_with_file @ linux-x86_64 +test.test_mailbox.TestMMDFMessage.test_initialize_with_nothing @ linux-x86_64 +test.test_mailbox.TestMMDFMessage.test_initialize_with_string @ linux-x86_64 +test.test_mailbox.TestMMDFMessage.test_initialize_with_unixfrom @ linux-x86_64 +test.test_mailbox.TestMailboxSuperclass.test_notimplemented @ linux-x86_64 +test.test_mailbox.TestMaildir.test_add @ linux-x86_64 +test.test_mailbox.TestMaildir.test_add_8bit_body @ linux-x86_64 +test.test_mailbox.TestMaildir.test_add_MM @ linux-x86_64 +test.test_mailbox.TestMaildir.test_add_StringIO_warns @ linux-x86_64 +test.test_mailbox.TestMaildir.test_add_and_remove_folders @ linux-x86_64 +test.test_mailbox.TestMaildir.test_add_binary_file @ linux-x86_64 +test.test_mailbox.TestMaildir.test_add_binary_nonascii_file @ linux-x86_64 +test.test_mailbox.TestMaildir.test_add_invalid_8bit_bytes_header @ linux-x86_64 +test.test_mailbox.TestMaildir.test_add_nonascii_StringIO_raises @ linux-x86_64 +test.test_mailbox.TestMaildir.test_add_nonascii_string_header_raises @ linux-x86_64 +test.test_mailbox.TestMaildir.test_add_text_file_warns @ linux-x86_64 +test.test_mailbox.TestMaildir.test_add_that_raises_leaves_mailbox_empty @ linux-x86_64 +test.test_mailbox.TestMaildir.test_clean @ linux-x86_64 +test.test_mailbox.TestMaildir.test_clear @ linux-x86_64 +test.test_mailbox.TestMaildir.test_close @ linux-x86_64 +test.test_mailbox.TestMaildir.test_consistent_factory @ linux-x86_64 +test.test_mailbox.TestMaildir.test_contains @ linux-x86_64 +test.test_mailbox.TestMaildir.test_create_tmp @ linux-x86_64 +test.test_mailbox.TestMaildir.test_delitem @ linux-x86_64 +test.test_mailbox.TestMaildir.test_directory_in_folder @ linux-x86_64 +test.test_mailbox.TestMaildir.test_discard @ linux-x86_64 +test.test_mailbox.TestMaildir.test_dump_message @ linux-x86_64 +test.test_mailbox.TestMaildir.test_file_permissions @ linux-x86_64 +test.test_mailbox.TestMaildir.test_flush @ linux-x86_64 +test.test_mailbox.TestMaildir.test_folder @ linux-x86_64 +test.test_mailbox.TestMaildir.test_folder_file_perms @ linux-x86_64 +test.test_mailbox.TestMaildir.test_get @ linux-x86_64 +test.test_mailbox.TestMaildir.test_get_MM @ linux-x86_64 +test.test_mailbox.TestMaildir.test_get_bytes @ linux-x86_64 +test.test_mailbox.TestMaildir.test_get_file @ linux-x86_64 +test.test_mailbox.TestMaildir.test_get_file_can_be_closed_twice @ linux-x86_64 +test.test_mailbox.TestMaildir.test_get_folder @ linux-x86_64 +test.test_mailbox.TestMaildir.test_get_message @ linux-x86_64 +test.test_mailbox.TestMaildir.test_get_string @ linux-x86_64 +test.test_mailbox.TestMaildir.test_getitem @ linux-x86_64 +test.test_mailbox.TestMaildir.test_initialize_existing @ linux-x86_64 +test.test_mailbox.TestMaildir.test_initialize_new @ linux-x86_64 +test.test_mailbox.TestMaildir.test_invalid_nonascii_header_as_string @ linux-x86_64 +test.test_mailbox.TestMaildir.test_items @ linux-x86_64 +test.test_mailbox.TestMaildir.test_iter @ linux-x86_64 +test.test_mailbox.TestMaildir.test_iteritems @ linux-x86_64 +test.test_mailbox.TestMaildir.test_iterkeys @ linux-x86_64 +test.test_mailbox.TestMaildir.test_itervalues @ linux-x86_64 +test.test_mailbox.TestMaildir.test_keys @ linux-x86_64 +test.test_mailbox.TestMaildir.test_len @ linux-x86_64 +test.test_mailbox.TestMaildir.test_list_folders @ linux-x86_64 +test.test_mailbox.TestMaildir.test_lock_unlock @ linux-x86_64 +test.test_mailbox.TestMaildir.test_lookup @ linux-x86_64 +test.test_mailbox.TestMaildir.test_pop @ linux-x86_64 +test.test_mailbox.TestMaildir.test_popitem @ linux-x86_64 +test.test_mailbox.TestMaildir.test_popitem_and_flush_twice @ linux-x86_64 +test.test_mailbox.TestMaildir.test_refresh @ linux-x86_64 +test.test_mailbox.TestMaildir.test_refresh_after_safety_period @ linux-x86_64 +test.test_mailbox.TestMaildir.test_remove @ linux-x86_64 +test.test_mailbox.TestMaildir.test_reread @ linux-x86_64 +test.test_mailbox.TestMaildir.test_set_MM @ linux-x86_64 +test.test_mailbox.TestMaildir.test_set_item @ linux-x86_64 +test.test_mailbox.TestMaildir.test_update @ linux-x86_64 +test.test_mailbox.TestMaildir.test_values @ linux-x86_64 +test.test_mailbox.TestMaildirMessage.test_all_eMM_attributes_exist @ linux-x86_64 +test.test_mailbox.TestMaildirMessage.test_become_message @ linux-x86_64 +test.test_mailbox.TestMaildirMessage.test_date @ linux-x86_64 +test.test_mailbox.TestMaildirMessage.test_explain_to @ linux-x86_64 +test.test_mailbox.TestMaildirMessage.test_flags @ linux-x86_64 +test.test_mailbox.TestMaildirMessage.test_info @ linux-x86_64 +test.test_mailbox.TestMaildirMessage.test_info_and_flags @ linux-x86_64 +test.test_mailbox.TestMaildirMessage.test_initialize_incorrectly @ linux-x86_64 +test.test_mailbox.TestMaildirMessage.test_initialize_with_binary_file @ linux-x86_64 +test.test_mailbox.TestMaildirMessage.test_initialize_with_eMM @ linux-x86_64 +test.test_mailbox.TestMaildirMessage.test_initialize_with_file @ linux-x86_64 +test.test_mailbox.TestMaildirMessage.test_initialize_with_nothing @ linux-x86_64 +test.test_mailbox.TestMaildirMessage.test_initialize_with_string @ linux-x86_64 +test.test_mailbox.TestMaildirMessage.test_subdir @ linux-x86_64 +test.test_mailbox.TestMbox.test_add @ linux-x86_64 +test.test_mailbox.TestMbox.test_add_8bit_body @ linux-x86_64 +test.test_mailbox.TestMbox.test_add_StringIO_warns @ linux-x86_64 +test.test_mailbox.TestMbox.test_add_and_close @ linux-x86_64 +test.test_mailbox.TestMbox.test_add_binary_file @ linux-x86_64 +test.test_mailbox.TestMbox.test_add_binary_nonascii_file @ linux-x86_64 +test.test_mailbox.TestMbox.test_add_doesnt_rewrite @ linux-x86_64 +test.test_mailbox.TestMbox.test_add_from_bytes @ linux-x86_64 +test.test_mailbox.TestMbox.test_add_from_string @ linux-x86_64 +test.test_mailbox.TestMbox.test_add_invalid_8bit_bytes_header @ linux-x86_64 +test.test_mailbox.TestMbox.test_add_mbox_or_mmdf_message @ linux-x86_64 +test.test_mailbox.TestMbox.test_add_nonascii_StringIO_raises @ linux-x86_64 +test.test_mailbox.TestMbox.test_add_nonascii_string_header_raises @ linux-x86_64 +test.test_mailbox.TestMbox.test_add_text_file_warns @ linux-x86_64 +test.test_mailbox.TestMbox.test_add_that_raises_leaves_mailbox_empty @ linux-x86_64 +test.test_mailbox.TestMbox.test_clear @ linux-x86_64 +test.test_mailbox.TestMbox.test_close @ linux-x86_64 +test.test_mailbox.TestMbox.test_contains @ linux-x86_64 +test.test_mailbox.TestMbox.test_delitem @ linux-x86_64 +test.test_mailbox.TestMbox.test_discard @ linux-x86_64 +test.test_mailbox.TestMbox.test_dump_message @ linux-x86_64 +test.test_mailbox.TestMbox.test_file_perms @ linux-x86_64 +test.test_mailbox.TestMbox.test_flush @ linux-x86_64 +test.test_mailbox.TestMbox.test_get @ linux-x86_64 +test.test_mailbox.TestMbox.test_get_bytes @ linux-x86_64 +test.test_mailbox.TestMbox.test_get_bytes_from @ linux-x86_64 +test.test_mailbox.TestMbox.test_get_file @ linux-x86_64 +test.test_mailbox.TestMbox.test_get_file_can_be_closed_twice @ linux-x86_64 +test.test_mailbox.TestMbox.test_get_message @ linux-x86_64 +test.test_mailbox.TestMbox.test_get_string @ linux-x86_64 +test.test_mailbox.TestMbox.test_get_string_from @ linux-x86_64 +test.test_mailbox.TestMbox.test_getitem @ linux-x86_64 +test.test_mailbox.TestMbox.test_invalid_nonascii_header_as_string @ linux-x86_64 +test.test_mailbox.TestMbox.test_items @ linux-x86_64 +test.test_mailbox.TestMbox.test_iter @ linux-x86_64 +test.test_mailbox.TestMbox.test_iteritems @ linux-x86_64 +test.test_mailbox.TestMbox.test_iterkeys @ linux-x86_64 +test.test_mailbox.TestMbox.test_itervalues @ linux-x86_64 +test.test_mailbox.TestMbox.test_keys @ linux-x86_64 +test.test_mailbox.TestMbox.test_len @ linux-x86_64 +test.test_mailbox.TestMbox.test_lock_unlock @ linux-x86_64 +test.test_mailbox.TestMbox.test_message_separator @ linux-x86_64 +test.test_mailbox.TestMbox.test_open_close_open @ linux-x86_64 +test.test_mailbox.TestMbox.test_permissions_after_flush @ linux-x86_64 +test.test_mailbox.TestMbox.test_pop @ linux-x86_64 +test.test_mailbox.TestMbox.test_popitem @ linux-x86_64 +test.test_mailbox.TestMbox.test_popitem_and_flush_twice @ linux-x86_64 +test.test_mailbox.TestMbox.test_relock @ linux-x86_64 +test.test_mailbox.TestMbox.test_remove @ linux-x86_64 +test.test_mailbox.TestMbox.test_set_item @ linux-x86_64 +test.test_mailbox.TestMbox.test_terminating_newline @ linux-x86_64 +test.test_mailbox.TestMbox.test_update @ linux-x86_64 +test.test_mailbox.TestMbox.test_values @ linux-x86_64 +test.test_mailbox.TestMboxMessage.test_all_eMM_attributes_exist @ linux-x86_64 +test.test_mailbox.TestMboxMessage.test_become_message @ linux-x86_64 +test.test_mailbox.TestMboxMessage.test_explain_to @ linux-x86_64 +test.test_mailbox.TestMboxMessage.test_flags @ linux-x86_64 +test.test_mailbox.TestMboxMessage.test_from @ linux-x86_64 +test.test_mailbox.TestMboxMessage.test_initialize_incorrectly @ linux-x86_64 +test.test_mailbox.TestMboxMessage.test_initialize_with_binary_file @ linux-x86_64 +test.test_mailbox.TestMboxMessage.test_initialize_with_eMM @ linux-x86_64 +test.test_mailbox.TestMboxMessage.test_initialize_with_file @ linux-x86_64 +test.test_mailbox.TestMboxMessage.test_initialize_with_nothing @ linux-x86_64 +test.test_mailbox.TestMboxMessage.test_initialize_with_string @ linux-x86_64 +test.test_mailbox.TestMboxMessage.test_initialize_with_unixfrom @ linux-x86_64 +test.test_mailbox.TestMessage.test_all_eMM_attributes_exist @ linux-x86_64 +test.test_mailbox.TestMessage.test_become_message @ linux-x86_64 +test.test_mailbox.TestMessage.test_explain_to @ linux-x86_64 +test.test_mailbox.TestMessage.test_initialize_incorrectly @ linux-x86_64 +test.test_mailbox.TestMessage.test_initialize_with_binary_file @ linux-x86_64 +test.test_mailbox.TestMessage.test_initialize_with_eMM @ linux-x86_64 +test.test_mailbox.TestMessage.test_initialize_with_file @ linux-x86_64 +test.test_mailbox.TestMessage.test_initialize_with_nothing @ linux-x86_64 +test.test_mailbox.TestMessage.test_initialize_with_string @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_babyl_to_babyl @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_babyl_to_maildir @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_babyl_to_mboxmmdf @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_babyl_to_mh @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_maildir_to_babyl @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_maildir_to_maildir @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_maildir_to_mboxmmdf @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_maildir_to_mh @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_mboxmmdf_to_babyl @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_mboxmmdf_to_maildir @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_mboxmmdf_to_mboxmmdf @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_mboxmmdf_to_mh @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_mh_to_babyl @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_mh_to_maildir @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_mh_to_mboxmmdf @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_mh_to_mh @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_plain_to_x @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_type_specific_attributes_removed_on_conversion @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_x_from_bytes @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_x_to_invalid @ linux-x86_64 +test.test_mailbox.TestMessageConversion.test_x_to_plain @ linux-x86_64 +test.test_mailbox.TestPartialFile.test_close @ linux-x86_64 +test.test_mailbox.TestPartialFile.test_initialize @ linux-x86_64 +test.test_mailbox.TestPartialFile.test_iteration @ linux-x86_64 +test.test_mailbox.TestPartialFile.test_read @ linux-x86_64 +test.test_mailbox.TestPartialFile.test_readline @ linux-x86_64 +test.test_mailbox.TestPartialFile.test_readlines @ linux-x86_64 +test.test_mailbox.TestPartialFile.test_seek_and_tell @ linux-x86_64 +test.test_mailbox.TestProxyFile.test_close @ linux-x86_64 +test.test_mailbox.TestProxyFile.test_initialize @ linux-x86_64 +test.test_mailbox.TestProxyFile.test_iteration @ linux-x86_64 +test.test_mailbox.TestProxyFile.test_read @ linux-x86_64 +test.test_mailbox.TestProxyFile.test_readline @ linux-x86_64 +test.test_mailbox.TestProxyFile.test_readlines @ linux-x86_64 +test.test_mailbox.TestProxyFile.test_seek_and_tell @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_mailcap.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_mailcap.txt new file mode 100644 index 0000000000..dde8262ec9 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_mailcap.txt @@ -0,0 +1,9 @@ +test.test_mailcap.FindmatchTest.test_findmatch @ linux-x86_64 +test.test_mailcap.FindmatchTest.test_test @ linux-x86_64 +test.test_mailcap.FindmatchTest.test_unsafe_mailcap_input @ linux-x86_64 +test.test_mailcap.GetcapsTest.test_mock_getcaps @ linux-x86_64 +test.test_mailcap.GetcapsTest.test_system_mailcap @ linux-x86_64 +test.test_mailcap.HelperFunctionTest.test_listmailcapfiles @ linux-x86_64 +test.test_mailcap.HelperFunctionTest.test_lookup @ linux-x86_64 +test.test_mailcap.HelperFunctionTest.test_readmailcapfile @ linux-x86_64 +test.test_mailcap.HelperFunctionTest.test_subst @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_marshal.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_marshal.txt new file mode 100644 index 0000000000..109e56ef41 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_marshal.txt @@ -0,0 +1,46 @@ +test.test_marshal.BufferTestCase.test_array @ linux-x86_64 +test.test_marshal.BufferTestCase.test_bytearray @ linux-x86_64 +test.test_marshal.BufferTestCase.test_memoryview @ linux-x86_64 +test.test_marshal.BugsTestCase.test_bad_reader @ linux-x86_64 +test.test_marshal.BugsTestCase.test_bug_5888452 @ linux-x86_64 +test.test_marshal.BugsTestCase.test_deterministic_sets @ linux-x86_64 +test.test_marshal.BugsTestCase.test_eof @ linux-x86_64 +test.test_marshal.BugsTestCase.test_exact_type_match @ linux-x86_64 +test.test_marshal.BugsTestCase.test_fuzz @ linux-x86_64 +test.test_marshal.BugsTestCase.test_large_marshal @ linux-x86_64 +test.test_marshal.BugsTestCase.test_loads_recursion @ linux-x86_64 +test.test_marshal.BugsTestCase.test_loads_reject_unicode_strings @ linux-x86_64 +test.test_marshal.BugsTestCase.test_multiple_dumps_and_loads @ linux-x86_64 +test.test_marshal.BugsTestCase.test_patch_873224 @ linux-x86_64 +test.test_marshal.BugsTestCase.test_recursion_limit @ linux-x86_64 +test.test_marshal.BugsTestCase.test_version_argument @ linux-x86_64 +test.test_marshal.CodeTestCase.test_different_filenames @ linux-x86_64 +test.test_marshal.CodeTestCase.test_many_codeobjects @ linux-x86_64 +test.test_marshal.CompatibilityTestCase.test0To3 @ linux-x86_64 +test.test_marshal.CompatibilityTestCase.test1To3 @ linux-x86_64 +test.test_marshal.CompatibilityTestCase.test2To3 @ linux-x86_64 +test.test_marshal.CompatibilityTestCase.test3To3 @ linux-x86_64 +test.test_marshal.ContainerTestCase.test_dict @ linux-x86_64 +test.test_marshal.ContainerTestCase.test_list @ linux-x86_64 +test.test_marshal.ContainerTestCase.test_sets @ linux-x86_64 +test.test_marshal.ContainerTestCase.test_tuple @ linux-x86_64 +test.test_marshal.ExceptionTestCase.test_exceptions @ linux-x86_64 +test.test_marshal.FloatTestCase.test_floats @ linux-x86_64 +test.test_marshal.InstancingTestCase.testBytes @ linux-x86_64 +test.test_marshal.InstancingTestCase.testDict @ linux-x86_64 +test.test_marshal.InstancingTestCase.testFloat @ linux-x86_64 +test.test_marshal.InstancingTestCase.testFrozenSet @ linux-x86_64 +test.test_marshal.InstancingTestCase.testInt @ linux-x86_64 +test.test_marshal.InstancingTestCase.testList @ linux-x86_64 +test.test_marshal.InstancingTestCase.testRecursion @ linux-x86_64 +test.test_marshal.InstancingTestCase.testSet @ linux-x86_64 +test.test_marshal.InstancingTestCase.testStr @ linux-x86_64 +test.test_marshal.InstancingTestCase.testTuple @ linux-x86_64 +test.test_marshal.IntTestCase.test_bool @ linux-x86_64 +test.test_marshal.IntTestCase.test_int64 @ linux-x86_64 +test.test_marshal.IntTestCase.test_ints @ linux-x86_64 +test.test_marshal.InterningTestCase.testIntern @ linux-x86_64 +test.test_marshal.InterningTestCase.testNoIntern @ linux-x86_64 +test.test_marshal.StringTestCase.test_bytes @ linux-x86_64 +test.test_marshal.StringTestCase.test_string @ linux-x86_64 +test.test_marshal.StringTestCase.test_unicode @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_math.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_math.txt new file mode 100644 index 0000000000..d1a42e7a68 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_math.txt @@ -0,0 +1,70 @@ +DocFileCase.ieee754_txt @ linux-x86_64 +test.test_math.IsCloseTests.test_asymmetry @ linux-x86_64 +test.test_math.IsCloseTests.test_decimals @ linux-x86_64 +test.test_math.IsCloseTests.test_eight_decimal_places @ linux-x86_64 +test.test_math.IsCloseTests.test_fractions @ linux-x86_64 +test.test_math.IsCloseTests.test_identical @ linux-x86_64 +test.test_math.IsCloseTests.test_identical_infinite @ linux-x86_64 +test.test_math.IsCloseTests.test_inf_ninf_nan @ linux-x86_64 +test.test_math.IsCloseTests.test_integers @ linux-x86_64 +test.test_math.IsCloseTests.test_near_zero @ linux-x86_64 +test.test_math.IsCloseTests.test_negative_tolerances @ linux-x86_64 +test.test_math.IsCloseTests.test_zero_tolerance @ linux-x86_64 +test.test_math.MathTests.testAcos @ linux-x86_64 +test.test_math.MathTests.testAcosh @ linux-x86_64 +test.test_math.MathTests.testAsin @ linux-x86_64 +test.test_math.MathTests.testAsinh @ linux-x86_64 +test.test_math.MathTests.testAtan @ linux-x86_64 +test.test_math.MathTests.testAtan2 @ linux-x86_64 +test.test_math.MathTests.testAtanh @ linux-x86_64 +test.test_math.MathTests.testCeil @ linux-x86_64 +test.test_math.MathTests.testComb @ linux-x86_64 +test.test_math.MathTests.testConstants @ linux-x86_64 +test.test_math.MathTests.testCopysign @ linux-x86_64 +test.test_math.MathTests.testCos @ linux-x86_64 +test.test_math.MathTests.testCosh @ linux-x86_64 +test.test_math.MathTests.testDegrees @ linux-x86_64 +test.test_math.MathTests.testDist @ linux-x86_64 +test.test_math.MathTests.testExp @ linux-x86_64 +test.test_math.MathTests.testFabs @ linux-x86_64 +test.test_math.MathTests.testFactorial @ linux-x86_64 +test.test_math.MathTests.testFactorialNonIntegers @ linux-x86_64 +test.test_math.MathTests.testFloor @ linux-x86_64 +test.test_math.MathTests.testFmod @ linux-x86_64 +test.test_math.MathTests.testFrexp @ linux-x86_64 +test.test_math.MathTests.testFsum @ linux-x86_64 +test.test_math.MathTests.testGcd @ linux-x86_64 +test.test_math.MathTests.testHypot @ linux-x86_64 +test.test_math.MathTests.testIsfinite @ linux-x86_64 +test.test_math.MathTests.testIsinf @ linux-x86_64 +test.test_math.MathTests.testIsnan @ linux-x86_64 +test.test_math.MathTests.testIsqrt @ linux-x86_64 +test.test_math.MathTests.testLdexp @ linux-x86_64 +test.test_math.MathTests.testLog @ linux-x86_64 +test.test_math.MathTests.testLog10 @ linux-x86_64 +test.test_math.MathTests.testLog1p @ linux-x86_64 +test.test_math.MathTests.testLog2 @ linux-x86_64 +test.test_math.MathTests.testLog2Exact @ linux-x86_64 +test.test_math.MathTests.testModf @ linux-x86_64 +test.test_math.MathTests.testPerm @ linux-x86_64 +test.test_math.MathTests.testPow @ linux-x86_64 +test.test_math.MathTests.testRadians @ linux-x86_64 +test.test_math.MathTests.testRemainder @ linux-x86_64 +test.test_math.MathTests.testSin @ linux-x86_64 +test.test_math.MathTests.testSinh @ linux-x86_64 +test.test_math.MathTests.testSqrt @ linux-x86_64 +test.test_math.MathTests.testTan @ linux-x86_64 +test.test_math.MathTests.testTanh @ linux-x86_64 +test.test_math.MathTests.testTanhSign @ linux-x86_64 +test.test_math.MathTests.test_inf_constant @ linux-x86_64 +test.test_math.MathTests.test_input_exceptions @ linux-x86_64 +test.test_math.MathTests.test_issue39871 @ linux-x86_64 +test.test_math.MathTests.test_lcm @ linux-x86_64 +test.test_math.MathTests.test_math_dist_leak @ linux-x86_64 +test.test_math.MathTests.test_mtestfile @ linux-x86_64 +test.test_math.MathTests.test_nan_constant @ linux-x86_64 +test.test_math.MathTests.test_nextafter @ linux-x86_64 +test.test_math.MathTests.test_prod @ linux-x86_64 +test.test_math.MathTests.test_testfile @ linux-x86_64 +test.test_math.MathTests.test_trunc @ linux-x86_64 +test.test_math.MathTests.test_ulp @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_memoryio.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_memoryio.txt new file mode 100644 index 0000000000..dc8498f942 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_memoryio.txt @@ -0,0 +1,157 @@ +test.test_memoryio.CBytesIOTest.testInit @ linux-x86_64 +test.test_memoryio.CBytesIOTest.testRead @ linux-x86_64 +test.test_memoryio.CBytesIOTest.testReadNoArgs @ linux-x86_64 +test.test_memoryio.CBytesIOTest.testSeek @ linux-x86_64 +test.test_memoryio.CBytesIOTest.testTell @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_bytes_array @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_detach @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_flags @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_flush @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_getstate @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_getvalue @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_init @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_instance_dict_leak @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_issue5449 @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_iterator @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_overseek @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_pickling @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_read @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_read1 @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_readinto @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_readline @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_readlines @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_relative_seek @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_seek @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_setstate @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_subclassing @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_tell @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_truncate @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_unicode @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_write @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_writelines @ linux-x86_64 +test.test_memoryio.CBytesIOTest.test_writelines_error @ linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_issue5265 @ linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_newline_argument @ linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_newline_cr @ linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_newline_crlf @ linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_newline_default @ linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_newline_empty @ linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_newline_lf @ linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_newline_none @ linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_newlines_property @ linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_relative_seek @ linux-x86_64 +test.test_memoryio.CStringIOPickleTest.test_textio_properties @ linux-x86_64 +test.test_memoryio.CStringIOTest.testInit @ linux-x86_64 +test.test_memoryio.CStringIOTest.testRead @ linux-x86_64 +test.test_memoryio.CStringIOTest.testReadNoArgs @ linux-x86_64 +test.test_memoryio.CStringIOTest.testSeek @ linux-x86_64 +test.test_memoryio.CStringIOTest.testTell @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_detach @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_flags @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_flush @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_getstate @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_getvalue @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_init @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_instance_dict_leak @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_issue5265 @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_iterator @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_newline_argument @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_newline_cr @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_newline_crlf @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_newline_default @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_newline_empty @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_newline_lf @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_newline_none @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_newlines_property @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_overseek @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_pickling @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_read @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_readline @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_readlines @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_relative_seek @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_seek @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_setstate @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_subclassing @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_tell @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_textio_properties @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_truncate @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_widechar @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_write @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_writelines @ linux-x86_64 +test.test_memoryio.CStringIOTest.test_writelines_error @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.testInit @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.testRead @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.testReadNoArgs @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.testSeek @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.testTell @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_bytes_array @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_detach @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_flags @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_flush @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_getvalue @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_init @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_instance_dict_leak @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_issue5449 @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_iterator @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_overseek @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_pickling @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_read @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_read1 @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_readinto @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_readline @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_readlines @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_relative_seek @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_seek @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_subclassing @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_tell @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_truncate @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_unicode @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_write @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_writelines @ linux-x86_64 +test.test_memoryio.PyBytesIOTest.test_writelines_error @ linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_issue5265 @ linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_newline_argument @ linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_newline_cr @ linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_newline_crlf @ linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_newline_default @ linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_newline_empty @ linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_newline_lf @ linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_newline_none @ linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_newlines_property @ linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_relative_seek @ linux-x86_64 +test.test_memoryio.PyStringIOPickleTest.test_textio_properties @ linux-x86_64 +test.test_memoryio.PyStringIOTest.testInit @ linux-x86_64 +test.test_memoryio.PyStringIOTest.testRead @ linux-x86_64 +test.test_memoryio.PyStringIOTest.testReadNoArgs @ linux-x86_64 +test.test_memoryio.PyStringIOTest.testSeek @ linux-x86_64 +test.test_memoryio.PyStringIOTest.testTell @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_detach @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_flags @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_flush @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_getvalue @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_init @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_instance_dict_leak @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_issue5265 @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_iterator @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_newline_argument @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_newline_cr @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_newline_crlf @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_newline_default @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_newline_empty @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_newline_lf @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_newline_none @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_newlines_property @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_overseek @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_pickling @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_read @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_readline @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_readlines @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_relative_seek @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_seek @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_subclassing @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_tell @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_textio_properties @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_truncate @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_write @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_writelines @ linux-x86_64 +test.test_memoryio.PyStringIOTest.test_writelines_error @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_memoryview.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_memoryview.txt new file mode 100644 index 0000000000..70524bce56 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_memoryview.txt @@ -0,0 +1,107 @@ +test.test_memoryview.ArrayMemorySliceSliceTest.test_attributes_writable @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_compare @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_contextmanager @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_delitem @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_getbuf_fail @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_getitem @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_hash_writable @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_issue22668 @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_iter @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_release @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_reversed @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_setitem_writable @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_tobytes @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceSliceTest.test_toreadonly @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceTest.test_attributes_writable @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceTest.test_compare @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceTest.test_contextmanager @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceTest.test_delitem @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceTest.test_getbuf_fail @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceTest.test_getitem @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceTest.test_hash_writable @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceTest.test_issue22668 @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceTest.test_iter @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceTest.test_release @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceTest.test_reversed @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceTest.test_setitem_writable @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceTest.test_tobytes @ linux-x86_64 +test.test_memoryview.ArrayMemorySliceTest.test_toreadonly @ linux-x86_64 +test.test_memoryview.ArrayMemoryviewTest.test_array_assign @ linux-x86_64 +test.test_memoryview.ArrayMemoryviewTest.test_attributes_writable @ linux-x86_64 +test.test_memoryview.ArrayMemoryviewTest.test_compare @ linux-x86_64 +test.test_memoryview.ArrayMemoryviewTest.test_contextmanager @ linux-x86_64 +test.test_memoryview.ArrayMemoryviewTest.test_delitem @ linux-x86_64 +test.test_memoryview.ArrayMemoryviewTest.test_getbuf_fail @ linux-x86_64 +test.test_memoryview.ArrayMemoryviewTest.test_getitem @ linux-x86_64 +test.test_memoryview.ArrayMemoryviewTest.test_hash_writable @ linux-x86_64 +test.test_memoryview.ArrayMemoryviewTest.test_issue22668 @ linux-x86_64 +test.test_memoryview.ArrayMemoryviewTest.test_iter @ linux-x86_64 +test.test_memoryview.ArrayMemoryviewTest.test_release @ linux-x86_64 +test.test_memoryview.ArrayMemoryviewTest.test_reversed @ linux-x86_64 +test.test_memoryview.ArrayMemoryviewTest.test_setitem_writable @ linux-x86_64 +test.test_memoryview.ArrayMemoryviewTest.test_tobytes @ linux-x86_64 +test.test_memoryview.ArrayMemoryviewTest.test_toreadonly @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_attributes_readonly @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_attributes_writable @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_compare @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_contextmanager @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_delitem @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_getbuf_fail @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_getbuffer @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_getitem @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_hash @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_hash_writable @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_issue22668 @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_iter @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_release @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_reversed @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_setitem_readonly @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_setitem_writable @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_tobytes @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_tolist @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_toreadonly @ linux-x86_64 +test.test_memoryview.BytesMemorySliceSliceTest.test_writable_readonly @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_attributes_readonly @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_attributes_writable @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_compare @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_contextmanager @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_delitem @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_getbuf_fail @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_getbuffer @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_getitem @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_hash @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_hash_writable @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_issue22668 @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_iter @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_release @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_reversed @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_setitem_readonly @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_setitem_writable @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_tobytes @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_tolist @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_toreadonly @ linux-x86_64 +test.test_memoryview.BytesMemorySliceTest.test_writable_readonly @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_attributes_readonly @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_attributes_writable @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_compare @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_constructor @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_contextmanager @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_delitem @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_getbuf_fail @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_getbuffer @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_getitem @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_hash @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_hash_writable @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_issue22668 @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_iter @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_release @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_reversed @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_setitem_readonly @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_setitem_writable @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_tobytes @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_tolist @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_toreadonly @ linux-x86_64 +test.test_memoryview.BytesMemoryviewTest.test_writable_readonly @ linux-x86_64 +test.test_memoryview.OtherTest.test_copy @ linux-x86_64 +test.test_memoryview.OtherTest.test_memoryview_hex @ linux-x86_64 +test.test_memoryview.OtherTest.test_pickle @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_metaclass.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_metaclass.txt new file mode 100644 index 0000000000..2b9509c9f5 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_metaclass.txt @@ -0,0 +1 @@ +DocTestCase.test.test_metaclass.__test__.doctests @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_mimetypes.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_mimetypes.txt new file mode 100644 index 0000000000..e71077bf05 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_mimetypes.txt @@ -0,0 +1,20 @@ +test.test_mimetypes.MimeTypesTestCase.test_case_sensitivity @ linux-x86_64 +test.test_mimetypes.MimeTypesTestCase.test_data_urls @ linux-x86_64 +test.test_mimetypes.MimeTypesTestCase.test_default_data @ linux-x86_64 +test.test_mimetypes.MimeTypesTestCase.test_encoding @ linux-x86_64 +test.test_mimetypes.MimeTypesTestCase.test_file_parsing @ linux-x86_64 +test.test_mimetypes.MimeTypesTestCase.test_filename_with_url_delimiters @ linux-x86_64 +test.test_mimetypes.MimeTypesTestCase.test_guess_all_types @ linux-x86_64 +test.test_mimetypes.MimeTypesTestCase.test_guess_known_extensions @ linux-x86_64 +test.test_mimetypes.MimeTypesTestCase.test_init_reinitializes @ linux-x86_64 +test.test_mimetypes.MimeTypesTestCase.test_init_stability @ linux-x86_64 +test.test_mimetypes.MimeTypesTestCase.test_keywords_args_api @ linux-x86_64 +test.test_mimetypes.MimeTypesTestCase.test_non_standard_types @ linux-x86_64 +test.test_mimetypes.MimeTypesTestCase.test_path_like_ob @ linux-x86_64 +test.test_mimetypes.MimeTypesTestCase.test_preferred_extension @ linux-x86_64 +test.test_mimetypes.MimeTypesTestCase.test_read_mime_types @ linux-x86_64 +test.test_mimetypes.MimetypesCliTestCase.test_guess_extension @ linux-x86_64 +test.test_mimetypes.MimetypesCliTestCase.test_guess_type @ linux-x86_64 +test.test_mimetypes.MimetypesCliTestCase.test_help_option @ linux-x86_64 +test.test_mimetypes.MimetypesCliTestCase.test_invalid_option @ linux-x86_64 +test.test_mimetypes.MiscTestCase.test__all__ @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_minidom.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_minidom.txt new file mode 100644 index 0000000000..e05f7b0085 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_minidom.txt @@ -0,0 +1,128 @@ +test.test_minidom.MinidomTest.testAAA @ linux-x86_64 +test.test_minidom.MinidomTest.testAAB @ linux-x86_64 +test.test_minidom.MinidomTest.testAddAttr @ linux-x86_64 +test.test_minidom.MinidomTest.testAltNewline @ linux-x86_64 +test.test_minidom.MinidomTest.testAppendChild @ linux-x86_64 +test.test_minidom.MinidomTest.testAppendChildFragment @ linux-x86_64 +test.test_minidom.MinidomTest.testAttrListItem @ linux-x86_64 +test.test_minidom.MinidomTest.testAttrListItemNS @ linux-x86_64 +test.test_minidom.MinidomTest.testAttrListItems @ linux-x86_64 +test.test_minidom.MinidomTest.testAttrListKeys @ linux-x86_64 +test.test_minidom.MinidomTest.testAttrListKeysNS @ linux-x86_64 +test.test_minidom.MinidomTest.testAttrListLength @ linux-x86_64 +test.test_minidom.MinidomTest.testAttrListValues @ linux-x86_64 +test.test_minidom.MinidomTest.testAttrList__getitem__ @ linux-x86_64 +test.test_minidom.MinidomTest.testAttrList__setitem__ @ linux-x86_64 +test.test_minidom.MinidomTest.testAttrModeSetsNonOptionalAttrs @ linux-x86_64 +test.test_minidom.MinidomTest.testAttrModeSetsParamsAsAttrs @ linux-x86_64 +test.test_minidom.MinidomTest.testAttributeRepr @ linux-x86_64 +test.test_minidom.MinidomTest.testBug0777884 @ linux-x86_64 +test.test_minidom.MinidomTest.testBug1433694 @ linux-x86_64 +test.test_minidom.MinidomTest.testChangeAttr @ linux-x86_64 +test.test_minidom.MinidomTest.testChildNodes @ linux-x86_64 +test.test_minidom.MinidomTest.testCloneAttributeDeep @ linux-x86_64 +test.test_minidom.MinidomTest.testCloneAttributeShallow @ linux-x86_64 +test.test_minidom.MinidomTest.testCloneDocumentDeep @ linux-x86_64 +test.test_minidom.MinidomTest.testCloneDocumentShallow @ linux-x86_64 +test.test_minidom.MinidomTest.testCloneDocumentTypeDeepNotOk @ linux-x86_64 +test.test_minidom.MinidomTest.testCloneDocumentTypeDeepOk @ linux-x86_64 +test.test_minidom.MinidomTest.testCloneDocumentTypeShallowNotOk @ linux-x86_64 +test.test_minidom.MinidomTest.testCloneDocumentTypeShallowOk @ linux-x86_64 +test.test_minidom.MinidomTest.testCloneElementDeep @ linux-x86_64 +test.test_minidom.MinidomTest.testCloneElementShallow @ linux-x86_64 +test.test_minidom.MinidomTest.testCloneNodeEntity @ linux-x86_64 +test.test_minidom.MinidomTest.testClonePIDeep @ linux-x86_64 +test.test_minidom.MinidomTest.testClonePIShallow @ linux-x86_64 +test.test_minidom.MinidomTest.testComment @ linux-x86_64 +test.test_minidom.MinidomTest.testContext @ linux-x86_64 +test.test_minidom.MinidomTest.testCreateAttributeNS @ linux-x86_64 +test.test_minidom.MinidomTest.testCreateElementNS @ linux-x86_64 +test.test_minidom.MinidomTest.testDeepcopiedDocument @ linux-x86_64 +test.test_minidom.MinidomTest.testDeleteAttr @ linux-x86_64 +test.test_minidom.MinidomTest.testDocRemoveChild @ linux-x86_64 +test.test_minidom.MinidomTest.testDocumentAsyncAttr @ linux-x86_64 +test.test_minidom.MinidomTest.testDocumentElement @ linux-x86_64 +test.test_minidom.MinidomTest.testElement @ linux-x86_64 +test.test_minidom.MinidomTest.testElementReprAndStr @ linux-x86_64 +test.test_minidom.MinidomTest.testElementReprAndStrUnicode @ linux-x86_64 +test.test_minidom.MinidomTest.testElementReprAndStrUnicodeNS @ linux-x86_64 +test.test_minidom.MinidomTest.testEmptyXMLNSValue @ linux-x86_64 +test.test_minidom.MinidomTest.testExceptionOnSpacesInXMLNSValue @ linux-x86_64 +test.test_minidom.MinidomTest.testFirstChild @ linux-x86_64 +test.test_minidom.MinidomTest.testGetAttrLength @ linux-x86_64 +test.test_minidom.MinidomTest.testGetAttrList @ linux-x86_64 +test.test_minidom.MinidomTest.testGetAttrValues @ linux-x86_64 +test.test_minidom.MinidomTest.testGetAttribute @ linux-x86_64 +test.test_minidom.MinidomTest.testGetAttributeNS @ linux-x86_64 +test.test_minidom.MinidomTest.testGetAttributeNode @ linux-x86_64 +test.test_minidom.MinidomTest.testGetElementsByTagName @ linux-x86_64 +test.test_minidom.MinidomTest.testGetElementsByTagNameNS @ linux-x86_64 +test.test_minidom.MinidomTest.testGetEmptyNodeListFromElementsByTagNameNS @ linux-x86_64 +test.test_minidom.MinidomTest.testHasAttribute @ linux-x86_64 +test.test_minidom.MinidomTest.testHasChildNodes @ linux-x86_64 +test.test_minidom.MinidomTest.testImportDocumentDeep @ linux-x86_64 +test.test_minidom.MinidomTest.testImportDocumentShallow @ linux-x86_64 +test.test_minidom.MinidomTest.testImportDocumentTypeDeep @ linux-x86_64 +test.test_minidom.MinidomTest.testImportDocumentTypeShallow @ linux-x86_64 +test.test_minidom.MinidomTest.testInsertBefore @ linux-x86_64 +test.test_minidom.MinidomTest.testInsertBeforeFragment @ linux-x86_64 +test.test_minidom.MinidomTest.testLegalChildren @ linux-x86_64 +test.test_minidom.MinidomTest.testNamedNodeMapSetItem @ linux-x86_64 +test.test_minidom.MinidomTest.testNodeListItem @ linux-x86_64 +test.test_minidom.MinidomTest.testNonZero @ linux-x86_64 +test.test_minidom.MinidomTest.testNormalize @ linux-x86_64 +test.test_minidom.MinidomTest.testNormalizeCombineAndNextSibling @ linux-x86_64 +test.test_minidom.MinidomTest.testNormalizeDeleteAndCombine @ linux-x86_64 +test.test_minidom.MinidomTest.testNormalizeDeleteWithNextSibling @ linux-x86_64 +test.test_minidom.MinidomTest.testNormalizeDeleteWithPrevSibling @ linux-x86_64 +test.test_minidom.MinidomTest.testNormalizeDeleteWithTwoNonTextSiblings @ linux-x86_64 +test.test_minidom.MinidomTest.testNormalizeRecursion @ linux-x86_64 +test.test_minidom.MinidomTest.testParents @ linux-x86_64 +test.test_minidom.MinidomTest.testParse @ linux-x86_64 +test.test_minidom.MinidomTest.testParseAttributeNamespaces @ linux-x86_64 +test.test_minidom.MinidomTest.testParseAttributes @ linux-x86_64 +test.test_minidom.MinidomTest.testParseElement @ linux-x86_64 +test.test_minidom.MinidomTest.testParseElementNamespaces @ linux-x86_64 +test.test_minidom.MinidomTest.testParseFromBinaryFile @ linux-x86_64 +test.test_minidom.MinidomTest.testParseFromTextFile @ linux-x86_64 +test.test_minidom.MinidomTest.testParseProcessingInstructions @ linux-x86_64 +test.test_minidom.MinidomTest.testParseString @ linux-x86_64 +test.test_minidom.MinidomTest.testPatch1094164 @ linux-x86_64 +test.test_minidom.MinidomTest.testPickledDocument @ linux-x86_64 +test.test_minidom.MinidomTest.testProcessingInstruction @ linux-x86_64 +test.test_minidom.MinidomTest.testProcessingInstructionNameError @ linux-x86_64 +test.test_minidom.MinidomTest.testProcessingInstructionRepr @ linux-x86_64 +test.test_minidom.MinidomTest.testRemoveAttr @ linux-x86_64 +test.test_minidom.MinidomTest.testRemoveAttrNS @ linux-x86_64 +test.test_minidom.MinidomTest.testRemoveAttributeNode @ linux-x86_64 +test.test_minidom.MinidomTest.testRemoveNamedItem @ linux-x86_64 +test.test_minidom.MinidomTest.testRemoveNamedItemNS @ linux-x86_64 +test.test_minidom.MinidomTest.testRenameAttribute @ linux-x86_64 +test.test_minidom.MinidomTest.testRenameElement @ linux-x86_64 +test.test_minidom.MinidomTest.testRenameOther @ linux-x86_64 +test.test_minidom.MinidomTest.testReplaceChildFragment @ linux-x86_64 +test.test_minidom.MinidomTest.testReplaceWholeText @ linux-x86_64 +test.test_minidom.MinidomTest.testSchemaType @ linux-x86_64 +test.test_minidom.MinidomTest.testSerializeCommentNodeWithDoubleHyphen @ linux-x86_64 +test.test_minidom.MinidomTest.testSetAttrValueandNodeValue @ linux-x86_64 +test.test_minidom.MinidomTest.testSetIdAttribute @ linux-x86_64 +test.test_minidom.MinidomTest.testSetIdAttributeNS @ linux-x86_64 +test.test_minidom.MinidomTest.testSetIdAttributeNode @ linux-x86_64 +test.test_minidom.MinidomTest.testSiblings @ linux-x86_64 +test.test_minidom.MinidomTest.testStandalone @ linux-x86_64 +test.test_minidom.MinidomTest.testTextNodeRepr @ linux-x86_64 +test.test_minidom.MinidomTest.testTextRepr @ linux-x86_64 +test.test_minidom.MinidomTest.testTooManyDocumentElements @ linux-x86_64 +test.test_minidom.MinidomTest.testUnlink @ linux-x86_64 +test.test_minidom.MinidomTest.testUserData @ linux-x86_64 +test.test_minidom.MinidomTest.testWholeText @ linux-x86_64 +test.test_minidom.MinidomTest.testWriteText @ linux-x86_64 +test.test_minidom.MinidomTest.testWriteXML @ linux-x86_64 +test.test_minidom.MinidomTest.test_cdata_parsing @ linux-x86_64 +test.test_minidom.MinidomTest.test_minidom_attribute_order @ linux-x86_64 +test.test_minidom.MinidomTest.test_toprettyxml_preserves_content_of_text_node @ linux-x86_64 +test.test_minidom.MinidomTest.test_toprettyxml_with_adjacent_text_nodes @ linux-x86_64 +test.test_minidom.MinidomTest.test_toprettyxml_with_attributes_ordered @ linux-x86_64 +test.test_minidom.MinidomTest.test_toprettyxml_with_cdata @ linux-x86_64 +test.test_minidom.MinidomTest.test_toprettyxml_with_text_nodes @ linux-x86_64 +test.test_minidom.MinidomTest.test_toxml_with_attributes_ordered @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_mmap.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_mmap.txt new file mode 100644 index 0000000000..f941254fe9 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_mmap.txt @@ -0,0 +1,22 @@ +test.test_mmap.LargeMmapTests.test_large_offset @ linux-x86_64 +test.test_mmap.MmapTests.test_anonymous @ linux-x86_64 +test.test_mmap.MmapTests.test_bad_file_desc @ linux-x86_64 +test.test_mmap.MmapTests.test_basic @ linux-x86_64 +test.test_mmap.MmapTests.test_concat_repeat_exception @ linux-x86_64 +test.test_mmap.MmapTests.test_context_manager @ linux-x86_64 +test.test_mmap.MmapTests.test_context_manager_exception @ linux-x86_64 +test.test_mmap.MmapTests.test_double_close @ linux-x86_64 +test.test_mmap.MmapTests.test_empty_file @ linux-x86_64 +test.test_mmap.MmapTests.test_entire_file @ linux-x86_64 +test.test_mmap.MmapTests.test_extended_set_del_slice @ linux-x86_64 +test.test_mmap.MmapTests.test_find_does_not_access_beyond_buffer @ linux-x86_64 +test.test_mmap.MmapTests.test_find_end @ linux-x86_64 +test.test_mmap.MmapTests.test_length_0_large_offset @ linux-x86_64 +test.test_mmap.MmapTests.test_length_0_offset @ linux-x86_64 +test.test_mmap.MmapTests.test_offset @ linux-x86_64 +test.test_mmap.MmapTests.test_prot_readonly @ linux-x86_64 +test.test_mmap.MmapTests.test_read_all @ linux-x86_64 +test.test_mmap.MmapTests.test_read_invalid_arg @ linux-x86_64 +test.test_mmap.MmapTests.test_subclass @ linux-x86_64 +test.test_mmap.MmapTests.test_tougher_find @ linux-x86_64 +test.test_mmap.MmapTests.test_write_returning_the_number_of_bytes_written @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_module.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_module.txt new file mode 100644 index 0000000000..284e45ea81 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_module.txt @@ -0,0 +1,34 @@ +test.test_module.ModuleTests.test_annotations_are_created_correctly @ linux-x86_64 +test.test_module.ModuleTests.test_annotations_getset_raises @ linux-x86_64 +test.test_module.ModuleTests.test_ascii_docstring @ linux-x86_64 +test.test_module.ModuleTests.test_descriptor_errors_propagate @ linux-x86_64 +test.test_module.ModuleTests.test_dont_clear_dict @ linux-x86_64 +test.test_module.ModuleTests.test_lazy_create_annotations @ linux-x86_64 +test.test_module.ModuleTests.test_missing_getattr @ linux-x86_64 +test.test_module.ModuleTests.test_module_dir @ linux-x86_64 +test.test_module.ModuleTests.test_module_dir_errors @ linux-x86_64 +test.test_module.ModuleTests.test_module_getattr @ linux-x86_64 +test.test_module.ModuleTests.test_module_getattr_errors @ linux-x86_64 +test.test_module.ModuleTests.test_module_getattr_tricky @ linux-x86_64 +test.test_module.ModuleTests.test_module_repr_builtin @ linux-x86_64 +test.test_module.ModuleTests.test_module_repr_minimal @ linux-x86_64 +test.test_module.ModuleTests.test_module_repr_source @ linux-x86_64 +test.test_module.ModuleTests.test_module_repr_with_bare_loader @ linux-x86_64 +test.test_module.ModuleTests.test_module_repr_with_bare_loader_and_filename @ linux-x86_64 +test.test_module.ModuleTests.test_module_repr_with_bare_loader_but_no_name @ linux-x86_64 +test.test_module.ModuleTests.test_module_repr_with_filename_only @ linux-x86_64 +test.test_module.ModuleTests.test_module_repr_with_full_loader @ linux-x86_64 +test.test_module.ModuleTests.test_module_repr_with_full_loader_and_filename @ linux-x86_64 +test.test_module.ModuleTests.test_module_repr_with_full_loader_but_no_name @ linux-x86_64 +test.test_module.ModuleTests.test_module_repr_with_loader_as_None @ linux-x86_64 +test.test_module.ModuleTests.test_module_repr_with_name @ linux-x86_64 +test.test_module.ModuleTests.test_module_repr_with_name_and_filename @ linux-x86_64 +test.test_module.ModuleTests.test_no_docstring @ linux-x86_64 +test.test_module.ModuleTests.test_reinit @ linux-x86_64 +test.test_module.ModuleTests.test_repeated_attribute_pops @ linux-x86_64 +test.test_module.ModuleTests.test_setting_annotations @ linux-x86_64 +test.test_module.ModuleTests.test_subclass_with_slots @ linux-x86_64 +test.test_module.ModuleTests.test_unicode_docstring @ linux-x86_64 +test.test_module.ModuleTests.test_uninitialized @ linux-x86_64 +test.test_module.ModuleTests.test_uninitialized_missing_getattr @ linux-x86_64 +test.test_module.ModuleTests.test_weakref @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_multibytecodec.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_multibytecodec.txt new file mode 100644 index 0000000000..ae4b98b3c1 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_multibytecodec.txt @@ -0,0 +1,10 @@ +test.test_multibytecodec.TestStateful.test_encode @ linux-x86_64 +test.test_multibytecodec.Test_ISO2022.test_bug1572832 @ linux-x86_64 +test.test_multibytecodec.Test_IncrementalDecoder.test_dbcs @ linux-x86_64 +test.test_multibytecodec.Test_IncrementalDecoder.test_dbcs_keep_buffer @ linux-x86_64 +test.test_multibytecodec.Test_IncrementalEncoder.test_issue5640 @ linux-x86_64 +test.test_multibytecodec.Test_IncrementalEncoder.test_stateless @ linux-x86_64 +test.test_multibytecodec.Test_MultibyteCodec.test_codingspec @ linux-x86_64 +test.test_multibytecodec.Test_StreamWriter.test_gb18030 @ linux-x86_64 +test.test_multibytecodec.Test_StreamWriter.test_streamwriter_strwrite @ linux-x86_64 +test.test_multibytecodec.Test_StreamWriter.test_utf_8 @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_multiprocessing_spawn.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_multiprocessing_spawn.txt new file mode 100644 index 0000000000..cc75ee9221 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_multiprocessing_spawn.txt @@ -0,0 +1,192 @@ +test.test_multiprocessing_spawn.test_misc.MiscTestCase.test__all__ @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.MiscTestCase.test_spawn_sys_executable_none_allows_import @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.OtherTest.test_answer_challenge_auth_failure @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.OtherTest.test_deliver_challenge_auth_failure @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.SemLockTests.test_semlock_subclass @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestForkAwareThreadLock.test_lock @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestIgnoreEINTR.test_ignore @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestIgnoreEINTR.test_ignore_listener @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestInternalDecorators.test_only_run_in_spawn_testsuite @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestInvalidFamily.test_invalid_family @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestInvalidHandle.test_invalid_handles @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestNamedResource.test_global_named_resource_spawn @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestNoForkBomb.test_noforkbomb @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestPoolNotLeakOnFailure.test_release_unused_processes @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestResourceTracker.test_resource_tracker @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestResourceTracker.test_resource_tracker_reused @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestResourceTracker.test_too_long_name_resource @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSimpleQueue.test_close @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSimpleQueue.test_empty @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestStartMethod.test_get_all @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestStartMethod.test_nested_startmethod @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestStdinBadfiledescriptor.test_flushing @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestStdinBadfiledescriptor.test_pool_in_process @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestStdinBadfiledescriptor.test_queue_in_process @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_array @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_barrier @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_bounded_semaphore @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_condition @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_dict @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_event @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_joinable_queue @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_list @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_namespace @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_pool @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_queue @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_rlock @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_semaphore @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestSyncManagerTypes.test_value @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestTimeouts.test_timeout @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestWait.test_neg_timeout @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestWait.test_wait @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestWait.test_wait_slow @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestWait.test_wait_socket @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestWait.test_wait_socket_slow @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc.TestWait.test_wait_timeout @ linux-x86_64 +test.test_multiprocessing_spawn.test_misc._TestImportStar.test_import @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestArray.test_array @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestArray.test_array_from_size @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestArray.test_getobj_getlock_obj @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestArray.test_rawarray @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestCondition.test_notify @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestCondition.test_notify_all @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestCondition.test_notify_n @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestCondition.test_timeout @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestConnection.test_connection @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestConnection.test_context @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestConnection.test_duplex_false @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestConnection.test_sendbytes @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestConnection.test_spawn_close @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestEvent.test_event @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestEvent.test_repr @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestListener.test_abstract_socket @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestListener.test_context @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestListener.test_multiple_bind @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestListenerClient.test_issue14725 @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestListenerClient.test_issue16955 @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestListenerClient.test_listener_client @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestLock.test_lock @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestLock.test_lock_context @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestLock.test_rlock @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestLogging.test_enable_logging @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestLogging.test_level @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestManagerRestart.test_rapid_restart @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoll.test_boundaries @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoll.test_dont_merge @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoll.test_empty_string @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoll.test_strings @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPollEintr.test_poll_eintr @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_apply @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_async @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_async_timeout @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_context @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_empty_iterable @ linux-x86_64 +!test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_enter @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_imap @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_imap_handle_iterable_exception @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_imap_unordered @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_imap_unordered_handle_iterable_exception @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_make_pool @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map_async @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map_async_callbacks @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map_chunksize @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map_handle_iterable_exception @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_map_no_failfast @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_starmap @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_starmap_async @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_terminate @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_traceback @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPool.test_wrapped_exception @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoolWorkerErrors.test_async_error_callback @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoolWorkerErrors.test_unpickleable_result @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoolWorkerLifetime.test_pool_maxtasksperchild_invalid @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoolWorkerLifetime.test_pool_worker_lifetime @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoolWorkerLifetime.test_pool_worker_lifetime_early_close @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestPoolWorkerLifetime.test_worker_finalization_via_atexit_handler_of_multiprocessing @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_active_children @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_args_argument @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_child_fd_inflation @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_cpu_count @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_current @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_daemon_argument @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_error_on_stdio_flush_1 @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_error_on_stdio_flush_2 @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_kill @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_parent_process @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_parent_process_attributes @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_process @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_recursion @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_sentinel @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_set_executable @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_terminate @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestProcess.test_wait_for_threads @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_closed_queue_put_get_exceptions @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_fork @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_get @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_no_import_lock_contention @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_put @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_qsize @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_queue_feeder_donot_stop_onexc @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_queue_feeder_on_queue_feeder_error @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_task_done @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestQueue.test_timeout @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestSemaphore.test_bounded_semaphore @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestSemaphore.test_semaphore @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestSemaphore.test_timeout @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestSubclassingProcess.test_stderr_flush @ linux-x86_64 +test.test_multiprocessing_spawn.test_processes.WithProcessesTestSubclassingProcess.test_subclassing @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestCondition.test_notify @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestCondition.test_notify_all @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestCondition.test_notify_n @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestCondition.test_timeout @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestConnection.test_connection @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestConnection.test_context @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestConnection.test_duplex_false @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestConnection.test_spawn_close @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestEvent.test_event @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestEvent.test_repr @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestListenerClient.test_issue14725 @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestListenerClient.test_issue16955 @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestListenerClient.test_listener_client @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestLock.test_lock_context @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestLock.test_rlock @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestManagerRestart.test_rapid_restart @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPoll.test_boundaries @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPoll.test_dont_merge @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPoll.test_empty_string @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPoll.test_strings @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_apply @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_async @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_async_timeout @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_context @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_empty_iterable @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_enter @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_imap @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_imap_unordered @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_make_pool @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_map @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_map_async @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_map_async_callbacks @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_map_chunksize @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_map_no_failfast @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_starmap @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_starmap_async @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestPool.test_traceback @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_active_children @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_args_argument @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_cpu_count @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_error_on_stdio_flush_1 @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_error_on_stdio_flush_2 @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_process @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestProcess.test_recursion @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_closed_queue_put_get_exceptions @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_fork @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_get @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_no_import_lock_contention @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_put @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_qsize @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_task_done @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestQueue.test_timeout @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestSemaphore.test_bounded_semaphore @ linux-x86_64 +test.test_multiprocessing_spawn.test_threads.WithThreadsTestSemaphore.test_semaphore @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_named_expressions.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_named_expressions.txt new file mode 100644 index 0000000000..eaec897c19 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_named_expressions.txt @@ -0,0 +1,65 @@ +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_01 @ linux-x86_64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_02 @ linux-x86_64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_03 @ linux-x86_64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_04 @ linux-x86_64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_05 @ linux-x86_64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_06 @ linux-x86_64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_07 @ linux-x86_64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_08 @ linux-x86_64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_09 @ linux-x86_64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_10 @ linux-x86_64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_11 @ linux-x86_64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_12 @ linux-x86_64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_13 @ linux-x86_64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_14 @ linux-x86_64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_15 @ linux-x86_64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_16 @ linux-x86_64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_17 @ linux-x86_64 +test.test_named_expressions.NamedExpressionAssignmentTest.test_named_expression_assignment_18 @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_01 @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_02 @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_03 @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_04 @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_06 @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_07 @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_08 @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_09 @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_10 @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_11 @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_12 @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_13 @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_14 @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_15 @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_16 @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_17 @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_in_class_body @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_list_comprehension_iterable_expression @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_rebinding_list_comprehension_inner_loop @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_rebinding_set_comprehension_inner_loop @ linux-x86_64 +test.test_named_expressions.NamedExpressionInvalidTest.test_named_expression_invalid_set_comprehension_iterable_expression @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_global_scope @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_global_scope_no_global_keyword @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_nonlocal_scope @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_nonlocal_scope_no_nonlocal_keyword @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_01 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_02 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_03 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_04 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_05 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_06 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_07 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_08 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_09 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_10 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_11 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_17 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_18 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_19 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_20 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_21 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_22 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_23 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_24 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_25 @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_scope_in_genexp @ linux-x86_64 +test.test_named_expressions.NamedExpressionScopeTest.test_named_expression_variable_reuse_in_comprehensions @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_netrc.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_netrc.txt new file mode 100644 index 0000000000..145cb4c1f5 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_netrc.txt @@ -0,0 +1,22 @@ +test.test_netrc.NetrcTestCase.test_comment_after_machine_line @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_comment_after_machine_line_hash_only @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_comment_after_machine_line_no_space @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_comment_at_end_of_machine_line @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_comment_at_end_of_machine_line_no_space @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_comment_at_end_of_machine_line_pass_has_hash @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_comment_before_machine_line @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_comment_before_machine_line_hash_only @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_comment_before_machine_line_no_space @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_invalid_tokens @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_macros @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_optional_tokens @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_security @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_token_value_escape @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_token_value_internal_hash @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_token_value_leading_hash @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_token_value_non_ascii @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_token_value_quotes @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_token_value_trailing_hash @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_token_value_whitespace @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_toplevel_non_ordered_tokens @ linux-x86_64 +test.test_netrc.NetrcTestCase.test_toplevel_tokens @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_nntplib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_nntplib.txt new file mode 100644 index 0000000000..139268cb91 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_nntplib.txt @@ -0,0 +1,71 @@ +test.test_nntplib.CapsAfterLoginNNTPv2Tests.test_caps_only_after_login @ linux-x86_64 +test.test_nntplib.LocalServerTests.test_starttls @ linux-x86_64 +test.test_nntplib.MiscTests.test_decode_header @ linux-x86_64 +test.test_nntplib.MiscTests.test_parse_datetime @ linux-x86_64 +test.test_nntplib.MiscTests.test_parse_overview @ linux-x86_64 +test.test_nntplib.MiscTests.test_parse_overview_fmt @ linux-x86_64 +test.test_nntplib.MiscTests.test_ssl_support @ linux-x86_64 +test.test_nntplib.MiscTests.test_unparse_datetime @ linux-x86_64 +test.test_nntplib.MiscTests.test_unparse_datetime_legacy @ linux-x86_64 +test.test_nntplib.MockSocketTests.test_bad_capabilities @ linux-x86_64 +test.test_nntplib.MockSocketTests.test_bad_welcome @ linux-x86_64 +test.test_nntplib.MockSocketTests.test_login_aborted @ linux-x86_64 +test.test_nntplib.MockSocketTests.test_service_permanently_unavailable @ linux-x86_64 +test.test_nntplib.MockSocketTests.test_service_temporarily_unavailable @ linux-x86_64 +test.test_nntplib.MockSslTests.test_bad_capabilities @ linux-x86_64 +test.test_nntplib.MockSslTests.test_bad_welcome @ linux-x86_64 +test.test_nntplib.MockSslTests.test_login_aborted @ linux-x86_64 +test.test_nntplib.MockSslTests.test_service_permanently_unavailable @ linux-x86_64 +test.test_nntplib.MockSslTests.test_service_temporarily_unavailable @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_article @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_article_file @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_authinfo @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_body @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_body_file @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_caps @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_date @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_description @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_descriptions @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_group @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_head @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_head_file @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_help @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_ihave @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_last @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_list @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_newnews @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_next @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_over @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_post @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_quit @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_stat @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_too_long_lines @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_welcome @ linux-x86_64 +test.test_nntplib.NNTPv1Tests.test_xover @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_article @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_article_file @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_authinfo @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_body @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_body_file @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_caps @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_date @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_description @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_descriptions @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_group @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_head @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_head_file @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_help @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_ihave @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_last @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_list @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_newnews @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_next @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_over @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_post @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_quit @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_stat @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_too_long_lines @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_welcome @ linux-x86_64 +test.test_nntplib.NNTPv2Tests.test_xover @ linux-x86_64 +test.test_nntplib.PublicAPITests.test_module_all_attribute @ linux-x86_64 +test.test_nntplib.SendReaderNNTPv2Tests.test_we_are_in_reader_mode_after_connect @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ntpath.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ntpath.txt new file mode 100644 index 0000000000..edcc20c1fe --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ntpath.txt @@ -0,0 +1,63 @@ +test.test_ntpath.NtCommonTest.test_abspath @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_abspath_issue3426 @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_commonprefix @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_exists @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_exists_fd @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_expandvars @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_expandvars_nonascii @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_filetime @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_getsize @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_import @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_isdir @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_isfile @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_join_errors @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_no_argument @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_nonascii_abspath @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_normcase @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_normpath_issue106242 @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_normpath_issue5827 @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_realpath @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_relpath_errors @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_samefile @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_samefile_on_link @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_samefile_on_symlink @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_sameopenfile @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_samestat @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_samestat_on_link @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_samestat_on_symlink @ linux-x86_64 +test.test_ntpath.NtCommonTest.test_splitdrive @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_abspath @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_basename @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_commonpath @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_dirname @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_expanduser @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_expandvars @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_isabs @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_isdir @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_islink @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_ismount @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_join @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_lexists @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_normcase @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_normpath @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_realpath @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_relpath @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_split @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_splitdrive @ linux-x86_64 +test.test_ntpath.PathLikeTests.test_path_splitext @ linux-x86_64 +test.test_ntpath.TestNtpath.test_commonpath @ linux-x86_64 +test.test_ntpath.TestNtpath.test_commonprefix @ linux-x86_64 +test.test_ntpath.TestNtpath.test_expanduser @ linux-x86_64 +test.test_ntpath.TestNtpath.test_expandvars @ linux-x86_64 +test.test_ntpath.TestNtpath.test_expandvars_nonascii @ linux-x86_64 +test.test_ntpath.TestNtpath.test_isabs @ linux-x86_64 +test.test_ntpath.TestNtpath.test_ismount @ linux-x86_64 +test.test_ntpath.TestNtpath.test_join @ linux-x86_64 +test.test_ntpath.TestNtpath.test_normpath @ linux-x86_64 +test.test_ntpath.TestNtpath.test_realpath_curdir @ linux-x86_64 +test.test_ntpath.TestNtpath.test_realpath_pardir @ linux-x86_64 +test.test_ntpath.TestNtpath.test_relpath @ linux-x86_64 +test.test_ntpath.TestNtpath.test_sameopenfile @ linux-x86_64 +test.test_ntpath.TestNtpath.test_split @ linux-x86_64 +test.test_ntpath.TestNtpath.test_splitdrive @ linux-x86_64 +test.test_ntpath.TestNtpath.test_splitext @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_numeric_tower.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_numeric_tower.txt new file mode 100644 index 0000000000..895b05aa22 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_numeric_tower.txt @@ -0,0 +1,9 @@ +test.test_numeric_tower.ComparisonTest.test_complex @ linux-x86_64 +test.test_numeric_tower.ComparisonTest.test_mixed_comparisons @ linux-x86_64 +test.test_numeric_tower.HashTest.test_binary_floats @ linux-x86_64 +test.test_numeric_tower.HashTest.test_bools @ linux-x86_64 +test.test_numeric_tower.HashTest.test_complex @ linux-x86_64 +test.test_numeric_tower.HashTest.test_decimals @ linux-x86_64 +test.test_numeric_tower.HashTest.test_fractions @ linux-x86_64 +test.test_numeric_tower.HashTest.test_hash_normalization @ linux-x86_64 +test.test_numeric_tower.HashTest.test_integers @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_opcache.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_opcache.txt new file mode 100644 index 0000000000..c97e6aa2c1 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_opcache.txt @@ -0,0 +1,26 @@ +test.test_opcache.TestCallCache.test_too_many_defaults_0 @ linux-x86_64 +test.test_opcache.TestCallCache.test_too_many_defaults_1 @ linux-x86_64 +test.test_opcache.TestCallCache.test_too_many_defaults_2 @ linux-x86_64 +test.test_opcache.TestLoadAttrCache.test_descriptor_added_after_optimization @ linux-x86_64 +test.test_opcache.TestLoadAttrCache.test_load_borrowed_slot_should_not_crash @ linux-x86_64 +test.test_opcache.TestLoadAttrCache.test_load_shadowing_slot_should_raise_type_error @ linux-x86_64 +test.test_opcache.TestLoadAttrCache.test_metaclass_del_descriptor_after_optimization @ linux-x86_64 +test.test_opcache.TestLoadAttrCache.test_metaclass_descriptor_added_after_optimization @ linux-x86_64 +test.test_opcache.TestLoadAttrCache.test_metaclass_descriptor_shadows_class_attribute @ linux-x86_64 +test.test_opcache.TestLoadAttrCache.test_metaclass_getattribute @ linux-x86_64 +test.test_opcache.TestLoadAttrCache.test_metaclass_set_descriptor_after_optimization @ linux-x86_64 +test.test_opcache.TestLoadAttrCache.test_metaclass_swap @ linux-x86_64 +test.test_opcache.TestLoadAttrCache.test_store_borrowed_slot_should_not_crash @ linux-x86_64 +test.test_opcache.TestLoadAttrCache.test_store_shadowing_slot_should_raise_type_error @ linux-x86_64 +test.test_opcache.TestLoadAttrCache.test_type_descriptor_shadows_attribute_getset @ linux-x86_64 +test.test_opcache.TestLoadAttrCache.test_type_descriptor_shadows_attribute_member @ linux-x86_64 +test.test_opcache.TestLoadAttrCache.test_type_descriptor_shadows_attribute_method @ linux-x86_64 +test.test_opcache.TestLoadMethodCache.test_descriptor_added_after_optimization @ linux-x86_64 +test.test_opcache.TestLoadMethodCache.test_metaclass_del_descriptor_after_optimization @ linux-x86_64 +test.test_opcache.TestLoadMethodCache.test_metaclass_descriptor_added_after_optimization @ linux-x86_64 +test.test_opcache.TestLoadMethodCache.test_metaclass_descriptor_shadows_class_attribute @ linux-x86_64 +test.test_opcache.TestLoadMethodCache.test_metaclass_getattribute @ linux-x86_64 +test.test_opcache.TestLoadMethodCache.test_metaclass_set_descriptor_after_optimization @ linux-x86_64 +test.test_opcache.TestLoadMethodCache.test_metaclass_swap @ linux-x86_64 +test.test_opcache.TestLoadMethodCache.test_type_descriptor_shadows_attribute_member @ linux-x86_64 +test.test_opcache.TestLoadMethodCache.test_type_descriptor_shadows_attribute_method @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_opcodes.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_opcodes.txt new file mode 100644 index 0000000000..e3a607ffe1 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_opcodes.txt @@ -0,0 +1,8 @@ +test.test_opcodes.OpcodeTest.test_compare_function_objects @ linux-x86_64 +test.test_opcodes.OpcodeTest.test_default_annotations_exist @ linux-x86_64 +test.test_opcodes.OpcodeTest.test_do_not_recreate_annotations @ linux-x86_64 +test.test_opcodes.OpcodeTest.test_modulo_of_string_subclasses @ linux-x86_64 +test.test_opcodes.OpcodeTest.test_raise_class_exceptions @ linux-x86_64 +test.test_opcodes.OpcodeTest.test_setup_annotations_line @ linux-x86_64 +test.test_opcodes.OpcodeTest.test_try_inside_for_loop @ linux-x86_64 +test.test_opcodes.OpcodeTest.test_use_existing_annotations @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_operator.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_operator.txt new file mode 100644 index 0000000000..b5b42cfeac --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_operator.txt @@ -0,0 +1,94 @@ +test.test_operator.CCOperatorPickleTestCase.test_attrgetter @ linux-x86_64 +test.test_operator.CCOperatorPickleTestCase.test_itemgetter @ linux-x86_64 +test.test_operator.CCOperatorPickleTestCase.test_methodcaller @ linux-x86_64 +test.test_operator.COperatorTestCase.test___all__ @ linux-x86_64 +test.test_operator.COperatorTestCase.test_abs @ linux-x86_64 +test.test_operator.COperatorTestCase.test_add @ linux-x86_64 +test.test_operator.COperatorTestCase.test_attrgetter @ linux-x86_64 +test.test_operator.COperatorTestCase.test_bitwise_and @ linux-x86_64 +test.test_operator.COperatorTestCase.test_bitwise_or @ linux-x86_64 +test.test_operator.COperatorTestCase.test_bitwise_xor @ linux-x86_64 +test.test_operator.COperatorTestCase.test_call @ linux-x86_64 +test.test_operator.COperatorTestCase.test_concat @ linux-x86_64 +test.test_operator.COperatorTestCase.test_contains @ linux-x86_64 +test.test_operator.COperatorTestCase.test_countOf @ linux-x86_64 +test.test_operator.COperatorTestCase.test_delitem @ linux-x86_64 +test.test_operator.COperatorTestCase.test_dunder_is_original @ linux-x86_64 +test.test_operator.COperatorTestCase.test_eq @ linux-x86_64 +test.test_operator.COperatorTestCase.test_floordiv @ linux-x86_64 +test.test_operator.COperatorTestCase.test_ge @ linux-x86_64 +test.test_operator.COperatorTestCase.test_getitem @ linux-x86_64 +test.test_operator.COperatorTestCase.test_gt @ linux-x86_64 +test.test_operator.COperatorTestCase.test_indexOf @ linux-x86_64 +test.test_operator.COperatorTestCase.test_inplace @ linux-x86_64 +test.test_operator.COperatorTestCase.test_invert @ linux-x86_64 +test.test_operator.COperatorTestCase.test_is @ linux-x86_64 +test.test_operator.COperatorTestCase.test_is_not @ linux-x86_64 +test.test_operator.COperatorTestCase.test_itemgetter @ linux-x86_64 +test.test_operator.COperatorTestCase.test_le @ linux-x86_64 +test.test_operator.COperatorTestCase.test_length_hint @ linux-x86_64 +test.test_operator.COperatorTestCase.test_lshift @ linux-x86_64 +test.test_operator.COperatorTestCase.test_lt @ linux-x86_64 +test.test_operator.COperatorTestCase.test_matmul @ linux-x86_64 +test.test_operator.COperatorTestCase.test_methodcaller @ linux-x86_64 +test.test_operator.COperatorTestCase.test_mod @ linux-x86_64 +test.test_operator.COperatorTestCase.test_mul @ linux-x86_64 +test.test_operator.COperatorTestCase.test_ne @ linux-x86_64 +test.test_operator.COperatorTestCase.test_neg @ linux-x86_64 +test.test_operator.COperatorTestCase.test_pos @ linux-x86_64 +test.test_operator.COperatorTestCase.test_pow @ linux-x86_64 +test.test_operator.COperatorTestCase.test_rshift @ linux-x86_64 +test.test_operator.COperatorTestCase.test_setitem @ linux-x86_64 +test.test_operator.COperatorTestCase.test_sub @ linux-x86_64 +test.test_operator.COperatorTestCase.test_truediv @ linux-x86_64 +test.test_operator.COperatorTestCase.test_truth @ linux-x86_64 +test.test_operator.CPyOperatorPickleTestCase.test_attrgetter @ linux-x86_64 +test.test_operator.CPyOperatorPickleTestCase.test_itemgetter @ linux-x86_64 +test.test_operator.CPyOperatorPickleTestCase.test_methodcaller @ linux-x86_64 +test.test_operator.PyCOperatorPickleTestCase.test_attrgetter @ linux-x86_64 +test.test_operator.PyCOperatorPickleTestCase.test_itemgetter @ linux-x86_64 +test.test_operator.PyCOperatorPickleTestCase.test_methodcaller @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test___all__ @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_abs @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_add @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_attrgetter @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_bitwise_and @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_bitwise_or @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_bitwise_xor @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_call @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_concat @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_contains @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_countOf @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_delitem @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_dunder_is_original @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_eq @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_floordiv @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_ge @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_getitem @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_gt @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_indexOf @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_inplace @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_invert @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_is @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_is_not @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_itemgetter @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_le @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_length_hint @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_lshift @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_lt @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_matmul @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_methodcaller @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_mod @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_mul @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_ne @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_neg @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_pos @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_pow @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_rshift @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_setitem @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_sub @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_truediv @ linux-x86_64 +test.test_operator.PyOperatorTestCase.test_truth @ linux-x86_64 +test.test_operator.PyPyOperatorPickleTestCase.test_attrgetter @ linux-x86_64 +test.test_operator.PyPyOperatorPickleTestCase.test_itemgetter @ linux-x86_64 +test.test_operator.PyPyOperatorPickleTestCase.test_methodcaller @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_optparse.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_optparse.txt new file mode 100644 index 0000000000..0185a04eca --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_optparse.txt @@ -0,0 +1,151 @@ +test.test_optparse.MiscTestCase.test__all__ @ linux-x86_64 +test.test_optparse.TestBool.test_bool_default @ linux-x86_64 +test.test_optparse.TestBool.test_bool_false @ linux-x86_64 +test.test_optparse.TestBool.test_bool_flicker_on_and_off @ linux-x86_64 +test.test_optparse.TestBool.test_bool_true @ linux-x86_64 +test.test_optparse.TestCallback.test_callback @ linux-x86_64 +test.test_optparse.TestCallback.test_callback_help @ linux-x86_64 +test.test_optparse.TestCallbackCheckAbbrev.test_abbrev_callback_expansion @ linux-x86_64 +test.test_optparse.TestCallbackExtraArgs.test_callback_extra_args @ linux-x86_64 +test.test_optparse.TestCallbackManyArgs.test_many_args @ linux-x86_64 +test.test_optparse.TestCallbackMeddleArgs.test_callback_meddle_args @ linux-x86_64 +test.test_optparse.TestCallbackMeddleArgs.test_callback_meddle_args_separator @ linux-x86_64 +test.test_optparse.TestCallbackVarArgs.test_consume_separator_stop_at_option @ linux-x86_64 +test.test_optparse.TestCallbackVarArgs.test_positional_arg_and_variable_args @ linux-x86_64 +test.test_optparse.TestCallbackVarArgs.test_stop_at_invalid_option @ linux-x86_64 +test.test_optparse.TestCallbackVarArgs.test_stop_at_option @ linux-x86_64 +test.test_optparse.TestCallbackVarArgs.test_variable_args @ linux-x86_64 +test.test_optparse.TestChoice.test_add_choice_option @ linux-x86_64 +test.test_optparse.TestChoice.test_invalid_choice @ linux-x86_64 +test.test_optparse.TestChoice.test_valid_choice @ linux-x86_64 +test.test_optparse.TestConflict.test_conflict_error @ linux-x86_64 +test.test_optparse.TestConflict.test_conflict_error_group @ linux-x86_64 +test.test_optparse.TestConflict.test_no_such_conflict_handler @ linux-x86_64 +test.test_optparse.TestConflictOverride.test_conflict_override_args @ linux-x86_64 +test.test_optparse.TestConflictOverride.test_conflict_override_help @ linux-x86_64 +test.test_optparse.TestConflictOverride.test_conflict_override_opts @ linux-x86_64 +test.test_optparse.TestConflictResolve.test_conflict_resolve @ linux-x86_64 +test.test_optparse.TestConflictResolve.test_conflict_resolve_help @ linux-x86_64 +test.test_optparse.TestConflictResolve.test_conflict_resolve_long_opt @ linux-x86_64 +test.test_optparse.TestConflictResolve.test_conflict_resolve_long_opts @ linux-x86_64 +test.test_optparse.TestConflictResolve.test_conflict_resolve_short_opt @ linux-x86_64 +test.test_optparse.TestConflictingDefaults.test_conflict_default @ linux-x86_64 +test.test_optparse.TestConflictingDefaults.test_conflict_default_none @ linux-x86_64 +test.test_optparse.TestCount.test_count_interspersed_args @ linux-x86_64 +test.test_optparse.TestCount.test_count_no_interspersed_args @ linux-x86_64 +test.test_optparse.TestCount.test_count_no_such_option @ linux-x86_64 +test.test_optparse.TestCount.test_count_one @ linux-x86_64 +test.test_optparse.TestCount.test_count_option_no_value @ linux-x86_64 +test.test_optparse.TestCount.test_count_override_amount @ linux-x86_64 +test.test_optparse.TestCount.test_count_override_quiet @ linux-x86_64 +test.test_optparse.TestCount.test_count_overriding @ linux-x86_64 +test.test_optparse.TestCount.test_count_overriding_default @ linux-x86_64 +test.test_optparse.TestCount.test_count_three @ linux-x86_64 +test.test_optparse.TestCount.test_count_three_apart @ linux-x86_64 +test.test_optparse.TestCount.test_count_with_default @ linux-x86_64 +test.test_optparse.TestCount.test_empty @ linux-x86_64 +test.test_optparse.TestDefaultValues.test_basic_defaults @ linux-x86_64 +test.test_optparse.TestDefaultValues.test_mixed_defaults_post @ linux-x86_64 +test.test_optparse.TestDefaultValues.test_mixed_defaults_pre @ linux-x86_64 +test.test_optparse.TestDefaultValues.test_process_default @ linux-x86_64 +test.test_optparse.TestExpandDefaults.test_alt_expand @ linux-x86_64 +test.test_optparse.TestExpandDefaults.test_default_none_1 @ linux-x86_64 +test.test_optparse.TestExpandDefaults.test_default_none_2 @ linux-x86_64 +test.test_optparse.TestExpandDefaults.test_float_default @ linux-x86_64 +test.test_optparse.TestExpandDefaults.test_no_default @ linux-x86_64 +test.test_optparse.TestExpandDefaults.test_no_expand @ linux-x86_64 +test.test_optparse.TestExpandDefaults.test_option_default @ linux-x86_64 +test.test_optparse.TestExpandDefaults.test_parser_default_1 @ linux-x86_64 +test.test_optparse.TestExpandDefaults.test_parser_default_2 @ linux-x86_64 +test.test_optparse.TestExtendAddActions.test_extend_add_action @ linux-x86_64 +test.test_optparse.TestExtendAddActions.test_extend_add_action_normal @ linux-x86_64 +test.test_optparse.TestExtendAddTypes.test_filetype_noexist @ linux-x86_64 +test.test_optparse.TestExtendAddTypes.test_filetype_notfile @ linux-x86_64 +test.test_optparse.TestExtendAddTypes.test_filetype_ok @ linux-x86_64 +test.test_optparse.TestHelp.test_help @ linux-x86_64 +test.test_optparse.TestHelp.test_help_description_groups @ linux-x86_64 +test.test_optparse.TestHelp.test_help_long_opts_first @ linux-x86_64 +test.test_optparse.TestHelp.test_help_old_usage @ linux-x86_64 +test.test_optparse.TestHelp.test_help_title_formatter @ linux-x86_64 +test.test_optparse.TestHelp.test_help_unicode @ linux-x86_64 +test.test_optparse.TestHelp.test_help_unicode_description @ linux-x86_64 +test.test_optparse.TestHelp.test_wrap_columns @ linux-x86_64 +test.test_optparse.TestMatchAbbrev.test_match_abbrev @ linux-x86_64 +test.test_optparse.TestMatchAbbrev.test_match_abbrev_error @ linux-x86_64 +test.test_optparse.TestMultipleArgs.test_nargs_invalid_float_value @ linux-x86_64 +test.test_optparse.TestMultipleArgs.test_nargs_long_opt @ linux-x86_64 +test.test_optparse.TestMultipleArgs.test_nargs_required_values @ linux-x86_64 +test.test_optparse.TestMultipleArgs.test_nargs_with_positional_args @ linux-x86_64 +test.test_optparse.TestMultipleArgsAppend.test_nargs_append @ linux-x86_64 +test.test_optparse.TestMultipleArgsAppend.test_nargs_append_const @ linux-x86_64 +test.test_optparse.TestMultipleArgsAppend.test_nargs_append_required_values @ linux-x86_64 +test.test_optparse.TestMultipleArgsAppend.test_nargs_append_simple @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_action_invalid @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_attr_invalid @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_bad_choices_list @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_callback_args_no_tuple @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_callback_kwargs_no_dict @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_callback_not_callable @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_no_callback_args_for_action @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_no_callback_for_action @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_no_callback_kwargs_for_action @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_no_choices_for_type @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_no_choices_list @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_no_const_for_action @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_no_nargs_for_action @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_no_single_dash @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_no_type_for_action @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_opt_string_empty @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_opt_string_long_invalid @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_opt_string_short_invalid @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_opt_string_too_short @ linux-x86_64 +test.test_optparse.TestOptionChecks.test_type_invalid @ linux-x86_64 +test.test_optparse.TestOptionGroup.test_add_group_invalid_arguments @ linux-x86_64 +test.test_optparse.TestOptionGroup.test_add_group_no_group @ linux-x86_64 +test.test_optparse.TestOptionGroup.test_add_group_wrong_parser @ linux-x86_64 +test.test_optparse.TestOptionGroup.test_group_manipulate @ linux-x86_64 +test.test_optparse.TestOptionGroup.test_option_group_create_instance @ linux-x86_64 +test.test_optparse.TestOptionParser.test_add_option_invalid_arguments @ linux-x86_64 +test.test_optparse.TestOptionParser.test_add_option_no_Option @ linux-x86_64 +test.test_optparse.TestOptionParser.test_get_option @ linux-x86_64 +test.test_optparse.TestOptionParser.test_get_option_equals @ linux-x86_64 +test.test_optparse.TestOptionParser.test_has_option @ linux-x86_64 +test.test_optparse.TestOptionParser.test_remove_long_opt @ linux-x86_64 +test.test_optparse.TestOptionParser.test_remove_nonexistent @ linux-x86_64 +test.test_optparse.TestOptionParser.test_remove_short_opt @ linux-x86_64 +test.test_optparse.TestOptionValues.test_basics @ linux-x86_64 +test.test_optparse.TestParseNumber.test_numeric_options @ linux-x86_64 +test.test_optparse.TestParseNumber.test_parse_num_fail @ linux-x86_64 +test.test_optparse.TestParseNumber.test_parse_num_ok @ linux-x86_64 +test.test_optparse.TestProgName.test_custom_progname @ linux-x86_64 +test.test_optparse.TestProgName.test_default_progname @ linux-x86_64 +test.test_optparse.TestStandard.test_abbrev_long_option @ linux-x86_64 +test.test_optparse.TestStandard.test_ambiguous_option @ linux-x86_64 +test.test_optparse.TestStandard.test_combined_single_invalid_option @ linux-x86_64 +test.test_optparse.TestStandard.test_defaults @ linux-x86_64 +test.test_optparse.TestStandard.test_empty @ linux-x86_64 +test.test_optparse.TestStandard.test_hyphen_becomes_positional_arg @ linux-x86_64 +test.test_optparse.TestStandard.test_invalid_integer @ linux-x86_64 +test.test_optparse.TestStandard.test_long_invalid_integer @ linux-x86_64 +test.test_optparse.TestStandard.test_long_option_append @ linux-x86_64 +test.test_optparse.TestStandard.test_long_option_argument_joined @ linux-x86_64 +test.test_optparse.TestStandard.test_long_option_argument_split @ linux-x86_64 +test.test_optparse.TestStandard.test_long_option_short_option @ linux-x86_64 +test.test_optparse.TestStandard.test_no_append_versus_append @ linux-x86_64 +test.test_optparse.TestStandard.test_no_such_option @ linux-x86_64 +test.test_optparse.TestStandard.test_option_argument_joined @ linux-x86_64 +test.test_optparse.TestStandard.test_option_argument_joined_integer @ linux-x86_64 +test.test_optparse.TestStandard.test_option_argument_split @ linux-x86_64 +test.test_optparse.TestStandard.test_option_argument_split_negative_integer @ linux-x86_64 +test.test_optparse.TestStandard.test_option_consumes_optionlike_string @ linux-x86_64 +test.test_optparse.TestStandard.test_required_value @ linux-x86_64 +test.test_optparse.TestStandard.test_short_and_long_option_split @ linux-x86_64 +test.test_optparse.TestStandard.test_short_option_consumes_separator @ linux-x86_64 +test.test_optparse.TestStandard.test_short_option_joined_and_separator @ linux-x86_64 +test.test_optparse.TestStandard.test_short_option_split_long_option_append @ linux-x86_64 +test.test_optparse.TestStandard.test_short_option_split_one_positional_arg @ linux-x86_64 +test.test_optparse.TestStandard.test_shortopt_empty_longopt_append @ linux-x86_64 +test.test_optparse.TestTypeAliases.test_str_aliases_string @ linux-x86_64 +test.test_optparse.TestTypeAliases.test_type_object @ linux-x86_64 +test.test_optparse.TestVersion.test_no_version @ linux-x86_64 +test.test_optparse.TestVersion.test_version @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ordered_dict.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ordered_dict.txt new file mode 100644 index 0000000000..fb2dbeaf46 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ordered_dict.txt @@ -0,0 +1,251 @@ +test.test_ordered_dict.CPythonBuiltinDictTests.test_abc @ linux-x86_64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_clear @ linux-x86_64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_delitem @ linux-x86_64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_delitem_hash_collision @ linux-x86_64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_detect_deletion_during_iteration @ linux-x86_64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_highly_nested @ linux-x86_64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_init @ linux-x86_64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_override_update @ linux-x86_64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_popitem @ linux-x86_64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_reinsert @ linux-x86_64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_setitem @ linux-x86_64 +test.test_ordered_dict.CPythonBuiltinDictTests.test_update @ linux-x86_64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_bool @ linux-x86_64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_constructor @ linux-x86_64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_get @ linux-x86_64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_getitem @ linux-x86_64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_items @ linux-x86_64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_keys @ linux-x86_64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_len @ linux-x86_64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_pop @ linux-x86_64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_popitem @ linux-x86_64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_read @ linux-x86_64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_setdefault @ linux-x86_64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_update @ linux-x86_64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_values @ linux-x86_64 +test.test_ordered_dict.CPythonGeneralMappingTests.test_write @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_468 @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_abc @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_clear @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_copying @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_delitem @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_delitem_hash_collision @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_detect_deletion_during_iteration @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_delitem @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_pop @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_popitem @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_setdefault @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_setitem @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_dict_update @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_equality @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_fromkeys @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_highly_nested @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_init @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_init_calls @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_issue24348 @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_issue24667 @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_iterators @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_iterators_empty @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_iterators_pickling @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_merge_operator @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_move_to_end @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_move_to_end_issue25406 @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_overridden_init @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_override_update @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_pickle_recursive @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_pop @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_popitem @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_popitem_last @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_reduce_not_too_fat @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_reinsert @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_repr @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_repr_recursive @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_repr_recursive_values @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_setdefault @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_setitem @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_sizeof @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_sorted_iterators @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_update @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_views @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictSubclassTests.test_yaml_linkage @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_468 @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_abc @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_clear @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_copying @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_delitem @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_delitem_hash_collision @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_detect_deletion_during_iteration @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_dict_delitem @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_dict_pop @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_dict_popitem @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_dict_setdefault @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_dict_setitem @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_dict_update @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_equality @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_fromkeys @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_highly_nested @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_init @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_init_calls @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_issue24348 @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_issue24667 @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_iterators @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_iterators_empty @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_iterators_pickling @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_merge_operator @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_move_to_end @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_move_to_end_issue25406 @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_overridden_init @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_override_update @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_pickle_recursive @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_pop @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_popitem @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_popitem_last @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_reduce_not_too_fat @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_reinsert @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_repr @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_repr_recursive @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_repr_recursive_values @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_setdefault @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_setitem @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_sizeof @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_sorted_iterators @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_update @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_views @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictTests.test_yaml_linkage @ linux-x86_64 +test.test_ordered_dict.CPythonOrderedDictWithSlotsCopyingTests.test_copying @ linux-x86_64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_bool @ linux-x86_64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_constructor @ linux-x86_64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_get @ linux-x86_64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_getitem @ linux-x86_64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_items @ linux-x86_64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_keys @ linux-x86_64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_len @ linux-x86_64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_pop @ linux-x86_64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_popitem @ linux-x86_64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_read @ linux-x86_64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_setdefault @ linux-x86_64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_update @ linux-x86_64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_values @ linux-x86_64 +test.test_ordered_dict.CPythonSubclassMappingTests.test_write @ linux-x86_64 +test.test_ordered_dict.CSimpleLRUCacheTests.test_add_after_full @ linux-x86_64 +test.test_ordered_dict.CSimpleLRUCacheTests.test_change_order_on_get @ linux-x86_64 +test.test_ordered_dict.CSimpleLRUCacheTests.test_popitem @ linux-x86_64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_bool @ linux-x86_64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_constructor @ linux-x86_64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_get @ linux-x86_64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_getitem @ linux-x86_64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_items @ linux-x86_64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_keys @ linux-x86_64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_len @ linux-x86_64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_pop @ linux-x86_64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_popitem @ linux-x86_64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_read @ linux-x86_64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_setdefault @ linux-x86_64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_update @ linux-x86_64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_values @ linux-x86_64 +test.test_ordered_dict.PurePythonGeneralMappingTests.test_write @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_468 @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_abc @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_clear @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_copying @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_delitem @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_delitem_hash_collision @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_detect_deletion_during_iteration @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_delitem @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_pop @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_popitem @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_setdefault @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_setitem @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_dict_update @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_equality @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_fromkeys @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_highly_nested @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_init @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_init_calls @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_issue24348 @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_issue24667 @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_iterators @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_iterators_empty @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_merge_operator @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_move_to_end @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_move_to_end_issue25406 @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_overridden_init @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_override_update @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_pickle_recursive @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_pop @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_popitem @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_popitem_last @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_reduce_not_too_fat @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_reinsert @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_repr @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_repr_recursive @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_repr_recursive_values @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_setdefault @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_setitem @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_sizeof @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_sorted_iterators @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_update @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_views @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictSubclassTests.test_yaml_linkage @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_468 @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_abc @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_clear @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_copying @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_delitem @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_delitem_hash_collision @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_detect_deletion_during_iteration @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_delitem @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_pop @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_popitem @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_setdefault @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_setitem @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_dict_update @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_equality @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_fromkeys @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_highly_nested @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_init @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_init_calls @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_issue24348 @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_issue24667 @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_iterators @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_iterators_empty @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_merge_operator @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_move_to_end @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_move_to_end_issue25406 @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_overridden_init @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_override_update @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_pickle_recursive @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_pop @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_popitem @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_popitem_last @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_reduce_not_too_fat @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_reinsert @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_repr @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_repr_recursive @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_repr_recursive_values @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_setdefault @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_setitem @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_sizeof @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_sorted_iterators @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_update @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_views @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictTests.test_yaml_linkage @ linux-x86_64 +test.test_ordered_dict.PurePythonOrderedDictWithSlotsCopyingTests.test_copying @ linux-x86_64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_bool @ linux-x86_64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_constructor @ linux-x86_64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_get @ linux-x86_64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_getitem @ linux-x86_64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_items @ linux-x86_64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_keys @ linux-x86_64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_len @ linux-x86_64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_pop @ linux-x86_64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_popitem @ linux-x86_64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_read @ linux-x86_64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_setdefault @ linux-x86_64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_update @ linux-x86_64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_values @ linux-x86_64 +test.test_ordered_dict.PurePythonSubclassMappingTests.test_write @ linux-x86_64 +test.test_ordered_dict.PySimpleLRUCacheTests.test_add_after_full @ linux-x86_64 +test.test_ordered_dict.PySimpleLRUCacheTests.test_change_order_on_get @ linux-x86_64 +test.test_ordered_dict.PySimpleLRUCacheTests.test_pop @ linux-x86_64 +test.test_ordered_dict.PySimpleLRUCacheTests.test_popitem @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_os.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_os.txt new file mode 100644 index 0000000000..fd0f9b3ced --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_os.txt @@ -0,0 +1,192 @@ +test.test_os.BlockingTests.test_blocking @ linux-x86_64 +test.test_os.BytesFwalkTests.test_compare_to_walk @ linux-x86_64 +test.test_os.BytesFwalkTests.test_dir_fd @ linux-x86_64 +test.test_os.BytesFwalkTests.test_fd_leak @ linux-x86_64 +test.test_os.BytesFwalkTests.test_file_like_path @ linux-x86_64 +test.test_os.BytesFwalkTests.test_walk_bad_dir @ linux-x86_64 +test.test_os.BytesFwalkTests.test_walk_bottom_up @ linux-x86_64 +test.test_os.BytesFwalkTests.test_walk_prune @ linux-x86_64 +test.test_os.BytesFwalkTests.test_walk_symlink @ linux-x86_64 +test.test_os.BytesFwalkTests.test_walk_topdown @ linux-x86_64 +test.test_os.BytesFwalkTests.test_yields_correct_dir_fd @ linux-x86_64 +test.test_os.BytesWalkTests.test_file_like_path @ linux-x86_64 +test.test_os.BytesWalkTests.test_walk_bad_dir @ linux-x86_64 +test.test_os.BytesWalkTests.test_walk_bottom_up @ linux-x86_64 +test.test_os.BytesWalkTests.test_walk_many_open_files @ linux-x86_64 +test.test_os.BytesWalkTests.test_walk_prune @ linux-x86_64 +test.test_os.BytesWalkTests.test_walk_symlink @ linux-x86_64 +test.test_os.BytesWalkTests.test_walk_topdown @ linux-x86_64 +test.test_os.CPUCountTests.test_cpu_count @ linux-x86_64 +test.test_os.ChownFileTests.test_chown_uid_gid_arguments_must_be_index @ linux-x86_64 +test.test_os.ChownFileTests.test_chown_without_permission @ linux-x86_64 +test.test_os.DevNullTests.test_devnull @ linux-x86_64 +test.test_os.EnvironTests.test___repr__ @ linux-x86_64 +test.test_os.EnvironTests.test_bool @ linux-x86_64 +test.test_os.EnvironTests.test_constructor @ linux-x86_64 +test.test_os.EnvironTests.test_environb @ linux-x86_64 +test.test_os.EnvironTests.test_get @ linux-x86_64 +test.test_os.EnvironTests.test_get_exec_path @ linux-x86_64 +test.test_os.EnvironTests.test_getitem @ linux-x86_64 +test.test_os.EnvironTests.test_ior_operator @ linux-x86_64 +test.test_os.EnvironTests.test_ior_operator_invalid_dicts @ linux-x86_64 +test.test_os.EnvironTests.test_ior_operator_key_value_iterable @ linux-x86_64 +test.test_os.EnvironTests.test_items @ linux-x86_64 +test.test_os.EnvironTests.test_iter_error_when_changing_os_environ @ linux-x86_64 +test.test_os.EnvironTests.test_iter_error_when_changing_os_environ_items @ linux-x86_64 +test.test_os.EnvironTests.test_iter_error_when_changing_os_environ_values @ linux-x86_64 +test.test_os.EnvironTests.test_key_type @ linux-x86_64 +test.test_os.EnvironTests.test_keys @ linux-x86_64 +test.test_os.EnvironTests.test_keyvalue_types @ linux-x86_64 +test.test_os.EnvironTests.test_len @ linux-x86_64 +test.test_os.EnvironTests.test_or_operator @ linux-x86_64 +test.test_os.EnvironTests.test_os_popen_iter @ linux-x86_64 +test.test_os.EnvironTests.test_pop @ linux-x86_64 +test.test_os.EnvironTests.test_popitem @ linux-x86_64 +test.test_os.EnvironTests.test_putenv_unsetenv @ linux-x86_64 +test.test_os.EnvironTests.test_putenv_unsetenv_error @ linux-x86_64 +test.test_os.EnvironTests.test_read @ linux-x86_64 +test.test_os.EnvironTests.test_ror_operator @ linux-x86_64 +test.test_os.EnvironTests.test_setdefault @ linux-x86_64 +test.test_os.EnvironTests.test_update @ linux-x86_64 +test.test_os.EnvironTests.test_update2 @ linux-x86_64 +test.test_os.EnvironTests.test_values @ linux-x86_64 +test.test_os.EnvironTests.test_write @ linux-x86_64 +test.test_os.ExecTests.test_execv_with_bad_arglist @ linux-x86_64 +test.test_os.ExecTests.test_execvpe_with_bad_program @ linux-x86_64 +test.test_os.ExportsTests.test_os_all @ linux-x86_64 +test.test_os.FDInheritanceTests.test_dup @ linux-x86_64 +test.test_os.FDInheritanceTests.test_dup2 @ linux-x86_64 +test.test_os.FDInheritanceTests.test_dup_standard_stream @ linux-x86_64 +test.test_os.FDInheritanceTests.test_get_set_inheritable @ linux-x86_64 +test.test_os.FDInheritanceTests.test_get_set_inheritable_badf @ linux-x86_64 +test.test_os.FDInheritanceTests.test_get_set_inheritable_o_path @ linux-x86_64 +test.test_os.FDInheritanceTests.test_open @ linux-x86_64 +test.test_os.FDInheritanceTests.test_openpty @ linux-x86_64 +test.test_os.FDInheritanceTests.test_pipe @ linux-x86_64 +test.test_os.FSEncodingTests.test_identity @ linux-x86_64 +test.test_os.FSEncodingTests.test_nop @ linux-x86_64 +test.test_os.FileTests.test_access @ linux-x86_64 +test.test_os.FileTests.test_fdopen @ linux-x86_64 +test.test_os.FileTests.test_open_keywords @ linux-x86_64 +test.test_os.FileTests.test_read @ linux-x86_64 +test.test_os.FileTests.test_replace @ linux-x86_64 +test.test_os.FileTests.test_symlink_keywords @ linux-x86_64 +test.test_os.FileTests.test_write @ linux-x86_64 +test.test_os.FwalkTests.test_compare_to_walk @ linux-x86_64 +test.test_os.FwalkTests.test_dir_fd @ linux-x86_64 +test.test_os.FwalkTests.test_fd_leak @ linux-x86_64 +test.test_os.FwalkTests.test_file_like_path @ linux-x86_64 +test.test_os.FwalkTests.test_walk_bad_dir @ linux-x86_64 +test.test_os.FwalkTests.test_walk_bottom_up @ linux-x86_64 +test.test_os.FwalkTests.test_walk_prune @ linux-x86_64 +test.test_os.FwalkTests.test_walk_symlink @ linux-x86_64 +test.test_os.FwalkTests.test_walk_topdown @ linux-x86_64 +test.test_os.FwalkTests.test_yields_correct_dir_fd @ linux-x86_64 +test.test_os.LinkTests.test_link @ linux-x86_64 +test.test_os.LinkTests.test_link_bytes @ linux-x86_64 +test.test_os.LinkTests.test_unicode_name @ linux-x86_64 +test.test_os.MakedirTests.test_exist_ok_existing_directory @ linux-x86_64 +test.test_os.MakedirTests.test_exist_ok_existing_regular_file @ linux-x86_64 +test.test_os.MakedirTests.test_exist_ok_s_isgid_directory @ linux-x86_64 +test.test_os.MakedirTests.test_makedir @ linux-x86_64 +test.test_os.MakedirTests.test_mode @ linux-x86_64 +test.test_os.MiscTests.test_getcwd @ linux-x86_64 +test.test_os.MiscTests.test_getcwd_long_path @ linux-x86_64 +test.test_os.MiscTests.test_getcwdb @ linux-x86_64 +test.test_os.NonLocalSymlinkTests.test_directory_link_nonlocal @ linux-x86_64 +test.test_os.OSErrorTests.test_oserror_filename @ linux-x86_64 +test.test_os.PathTConverterTests.test_path_t_converter @ linux-x86_64 +test.test_os.PathTConverterTests.test_path_t_converter_and_custom_class @ linux-x86_64 +test.test_os.PidTests.test_getppid @ linux-x86_64 +test.test_os.ReadlinkTests.test_bytes @ linux-x86_64 +test.test_os.ReadlinkTests.test_missing_link @ linux-x86_64 +test.test_os.ReadlinkTests.test_not_symlink @ linux-x86_64 +test.test_os.ReadlinkTests.test_pathlike @ linux-x86_64 +test.test_os.ReadlinkTests.test_pathlike_bytes @ linux-x86_64 +test.test_os.RemoveDirsTests.test_remove_all @ linux-x86_64 +test.test_os.RemoveDirsTests.test_remove_nothing @ linux-x86_64 +test.test_os.RemoveDirsTests.test_remove_partial @ linux-x86_64 +test.test_os.StatAttributeTests.test_stat_attributes @ linux-x86_64 +test.test_os.StatAttributeTests.test_stat_attributes_bytes @ linux-x86_64 +test.test_os.StatAttributeTests.test_stat_result_pickle @ linux-x86_64 +test.test_os.StatAttributeTests.test_statvfs_attributes @ linux-x86_64 +test.test_os.StatAttributeTests.test_statvfs_result_pickle @ linux-x86_64 +test.test_os.TestDirEntry.test_uninstantiable @ linux-x86_64 +test.test_os.TestDirEntry.test_unpickable @ linux-x86_64 +test.test_os.TestInvalidFD.test_blocking @ linux-x86_64 +test.test_os.TestInvalidFD.test_dup @ linux-x86_64 +test.test_os.TestInvalidFD.test_dup2 @ linux-x86_64 +test.test_os.TestInvalidFD.test_fchdir @ linux-x86_64 +test.test_os.TestInvalidFD.test_fchmod @ linux-x86_64 +test.test_os.TestInvalidFD.test_fchown @ linux-x86_64 +test.test_os.TestInvalidFD.test_fdatasync @ linux-x86_64 +test.test_os.TestInvalidFD.test_fdopen @ linux-x86_64 +test.test_os.TestInvalidFD.test_fstat @ linux-x86_64 +test.test_os.TestInvalidFD.test_fstatvfs @ linux-x86_64 +test.test_os.TestInvalidFD.test_fsync @ linux-x86_64 +test.test_os.TestInvalidFD.test_ftruncate @ linux-x86_64 +test.test_os.TestInvalidFD.test_inheritable @ linux-x86_64 +test.test_os.TestInvalidFD.test_isatty @ linux-x86_64 +test.test_os.TestInvalidFD.test_lseek @ linux-x86_64 +test.test_os.TestInvalidFD.test_read @ linux-x86_64 +test.test_os.TestInvalidFD.test_tcgetpgrp @ linux-x86_64 +test.test_os.TestInvalidFD.test_ttyname @ linux-x86_64 +test.test_os.TestInvalidFD.test_write @ linux-x86_64 +test.test_os.TestPEP519.test_argument_required @ linux-x86_64 +test.test_os.TestPEP519.test_bad_pathlike @ linux-x86_64 +test.test_os.TestPEP519.test_fsencode_fsdecode @ linux-x86_64 +test.test_os.TestPEP519.test_garbage_in_exception_out @ linux-x86_64 +test.test_os.TestPEP519.test_pathlike @ linux-x86_64 +test.test_os.TestPEP519.test_pathlike_class_getitem @ linux-x86_64 +test.test_os.TestPEP519.test_pathlike_subclasshook @ linux-x86_64 +test.test_os.TestPEP519.test_return_bytes @ linux-x86_64 +test.test_os.TestPEP519.test_return_string @ linux-x86_64 +test.test_os.TestPEP519PurePython.test_argument_required @ linux-x86_64 +test.test_os.TestPEP519PurePython.test_bad_pathlike @ linux-x86_64 +test.test_os.TestPEP519PurePython.test_fsencode_fsdecode @ linux-x86_64 +test.test_os.TestPEP519PurePython.test_garbage_in_exception_out @ linux-x86_64 +test.test_os.TestPEP519PurePython.test_pathlike @ linux-x86_64 +test.test_os.TestPEP519PurePython.test_pathlike_class_getitem @ linux-x86_64 +test.test_os.TestPEP519PurePython.test_pathlike_subclasshook @ linux-x86_64 +test.test_os.TestPEP519PurePython.test_return_bytes @ linux-x86_64 +test.test_os.TestPEP519PurePython.test_return_string @ linux-x86_64 +test.test_os.TestScandir.test_attributes @ linux-x86_64 +test.test_os.TestScandir.test_bad_path_type @ linux-x86_64 +test.test_os.TestScandir.test_broken_symlink @ linux-x86_64 +test.test_os.TestScandir.test_bytes @ linux-x86_64 +test.test_os.TestScandir.test_bytes_like @ linux-x86_64 +test.test_os.TestScandir.test_close @ linux-x86_64 +test.test_os.TestScandir.test_consume_iterator_twice @ linux-x86_64 +test.test_os.TestScandir.test_context_manager @ linux-x86_64 +test.test_os.TestScandir.test_context_manager_close @ linux-x86_64 +test.test_os.TestScandir.test_context_manager_exception @ linux-x86_64 +test.test_os.TestScandir.test_current_directory @ linux-x86_64 +test.test_os.TestScandir.test_empty_path @ linux-x86_64 +test.test_os.TestScandir.test_fd @ linux-x86_64 +test.test_os.TestScandir.test_fspath_protocol @ linux-x86_64 +test.test_os.TestScandir.test_fspath_protocol_bytes @ linux-x86_64 +test.test_os.TestScandir.test_removed_dir @ linux-x86_64 +test.test_os.TestScandir.test_removed_file @ linux-x86_64 +test.test_os.TestScandir.test_repr @ linux-x86_64 +test.test_os.TestScandir.test_uninstantiable @ linux-x86_64 +test.test_os.TestScandir.test_unpickable @ linux-x86_64 +test.test_os.URandomTests.test_urandom_length @ linux-x86_64 +test.test_os.URandomTests.test_urandom_subprocess @ linux-x86_64 +test.test_os.URandomTests.test_urandom_value @ linux-x86_64 +test.test_os.UtimeTests.test_utime @ linux-x86_64 +test.test_os.UtimeTests.test_utime_by_indexed @ linux-x86_64 +test.test_os.UtimeTests.test_utime_by_times @ linux-x86_64 +test.test_os.UtimeTests.test_utime_current @ linux-x86_64 +test.test_os.UtimeTests.test_utime_current_old @ linux-x86_64 +test.test_os.UtimeTests.test_utime_dir_fd @ linux-x86_64 +test.test_os.UtimeTests.test_utime_directory @ linux-x86_64 +test.test_os.UtimeTests.test_utime_fd @ linux-x86_64 +test.test_os.UtimeTests.test_utime_invalid_arguments @ linux-x86_64 +test.test_os.UtimeTests.test_utime_nofollow_symlinks @ linux-x86_64 +test.test_os.WalkTests.test_file_like_path @ linux-x86_64 +test.test_os.WalkTests.test_walk_bad_dir @ linux-x86_64 +test.test_os.WalkTests.test_walk_bottom_up @ linux-x86_64 +test.test_os.WalkTests.test_walk_many_open_files @ linux-x86_64 +test.test_os.WalkTests.test_walk_prune @ linux-x86_64 +test.test_os.WalkTests.test_walk_symlink @ linux-x86_64 +test.test_os.WalkTests.test_walk_topdown @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pathlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pathlib.txt new file mode 100644 index 0000000000..ccf1fdebe2 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pathlib.txt @@ -0,0 +1,312 @@ +test.test_pathlib.CompatiblePathTest.test_rtruediv @ linux-x86_64 +test.test_pathlib.CompatiblePathTest.test_truediv @ linux-x86_64 +test.test_pathlib.NTFlavourTest.test_parse_parts @ linux-x86_64 +test.test_pathlib.NTFlavourTest.test_parse_parts_common @ linux-x86_64 +test.test_pathlib.NTFlavourTest.test_splitroot @ linux-x86_64 +test.test_pathlib.PathTest.test_absolute_common @ linux-x86_64 +test.test_pathlib.PathTest.test_chmod @ linux-x86_64 +test.test_pathlib.PathTest.test_chmod_follow_symlinks_true @ linux-x86_64 +test.test_pathlib.PathTest.test_complex_symlinks_absolute @ linux-x86_64 +test.test_pathlib.PathTest.test_complex_symlinks_relative @ linux-x86_64 +test.test_pathlib.PathTest.test_complex_symlinks_relative_dot_dot @ linux-x86_64 +test.test_pathlib.PathTest.test_concrete_class @ linux-x86_64 +test.test_pathlib.PathTest.test_cwd @ linux-x86_64 +test.test_pathlib.PathTest.test_empty_path @ linux-x86_64 +test.test_pathlib.PathTest.test_exists @ linux-x86_64 +test.test_pathlib.PathTest.test_expanduser_common @ linux-x86_64 +test.test_pathlib.PathTest.test_glob_common @ linux-x86_64 +test.test_pathlib.PathTest.test_glob_dotdot @ linux-x86_64 +test.test_pathlib.PathTest.test_glob_empty_pattern @ linux-x86_64 +test.test_pathlib.PathTest.test_glob_long_symlink @ linux-x86_64 +test.test_pathlib.PathTest.test_glob_many_open_files @ linux-x86_64 +test.test_pathlib.PathTest.test_glob_permissions @ linux-x86_64 +test.test_pathlib.PathTest.test_hardlink_to @ linux-x86_64 +test.test_pathlib.PathTest.test_is_block_device_false @ linux-x86_64 +test.test_pathlib.PathTest.test_is_char_device_false @ linux-x86_64 +test.test_pathlib.PathTest.test_is_char_device_true @ linux-x86_64 +test.test_pathlib.PathTest.test_is_dir @ linux-x86_64 +test.test_pathlib.PathTest.test_is_fifo_false @ linux-x86_64 +test.test_pathlib.PathTest.test_is_file @ linux-x86_64 +test.test_pathlib.PathTest.test_is_mount @ linux-x86_64 +test.test_pathlib.PathTest.test_is_socket_false @ linux-x86_64 +test.test_pathlib.PathTest.test_is_socket_true @ linux-x86_64 +test.test_pathlib.PathTest.test_is_symlink @ linux-x86_64 +test.test_pathlib.PathTest.test_iterdir @ linux-x86_64 +test.test_pathlib.PathTest.test_iterdir_nodir @ linux-x86_64 +test.test_pathlib.PathTest.test_iterdir_symlink @ linux-x86_64 +test.test_pathlib.PathTest.test_link_to @ linux-x86_64 +test.test_pathlib.PathTest.test_lstat @ linux-x86_64 +test.test_pathlib.PathTest.test_lstat_nosymlink @ linux-x86_64 +test.test_pathlib.PathTest.test_mkdir @ linux-x86_64 +test.test_pathlib.PathTest.test_mkdir_concurrent_parent_creation @ linux-x86_64 +test.test_pathlib.PathTest.test_mkdir_exist_ok @ linux-x86_64 +test.test_pathlib.PathTest.test_mkdir_exist_ok_root @ linux-x86_64 +test.test_pathlib.PathTest.test_mkdir_exist_ok_with_parent @ linux-x86_64 +test.test_pathlib.PathTest.test_mkdir_no_parents_file @ linux-x86_64 +test.test_pathlib.PathTest.test_mkdir_parents @ linux-x86_64 +test.test_pathlib.PathTest.test_mkdir_with_child_file @ linux-x86_64 +test.test_pathlib.PathTest.test_open_common @ linux-x86_64 +test.test_pathlib.PathTest.test_parts_interning @ linux-x86_64 +test.test_pathlib.PathTest.test_pickling_common @ linux-x86_64 +test.test_pathlib.PathTest.test_read_write_bytes @ linux-x86_64 +test.test_pathlib.PathTest.test_read_write_text @ linux-x86_64 +test.test_pathlib.PathTest.test_readlink @ linux-x86_64 +test.test_pathlib.PathTest.test_rename @ linux-x86_64 +test.test_pathlib.PathTest.test_replace @ linux-x86_64 +test.test_pathlib.PathTest.test_resolve_common @ linux-x86_64 +test.test_pathlib.PathTest.test_resolve_dot @ linux-x86_64 +test.test_pathlib.PathTest.test_resolve_nonexist_relative_issue38671 @ linux-x86_64 +test.test_pathlib.PathTest.test_rglob_common @ linux-x86_64 +test.test_pathlib.PathTest.test_rglob_symlink_loop @ linux-x86_64 +test.test_pathlib.PathTest.test_rmdir @ linux-x86_64 +test.test_pathlib.PathTest.test_samefile @ linux-x86_64 +test.test_pathlib.PathTest.test_stat @ linux-x86_64 +test.test_pathlib.PathTest.test_stat_no_follow_symlinks @ linux-x86_64 +test.test_pathlib.PathTest.test_stat_no_follow_symlinks_nosymlink @ linux-x86_64 +test.test_pathlib.PathTest.test_symlink_to @ linux-x86_64 +test.test_pathlib.PathTest.test_touch_common @ linux-x86_64 +test.test_pathlib.PathTest.test_touch_nochange @ linux-x86_64 +test.test_pathlib.PathTest.test_unlink @ linux-x86_64 +test.test_pathlib.PathTest.test_unlink_missing_ok @ linux-x86_64 +test.test_pathlib.PathTest.test_unsupported_flavour @ linux-x86_64 +test.test_pathlib.PathTest.test_with @ linux-x86_64 +test.test_pathlib.PathTest.test_write_text_with_newlines @ linux-x86_64 +test.test_pathlib.PosixFlavourTest.test_parse_parts @ linux-x86_64 +test.test_pathlib.PosixFlavourTest.test_parse_parts_common @ linux-x86_64 +test.test_pathlib.PosixFlavourTest.test_splitroot @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_anchor_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_as_bytes_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_as_posix_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_as_uri @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_as_uri_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_as_uri_non_ascii @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_constructor_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_div @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_div_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_drive_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_eq @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_eq_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_equivalences @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_fspath_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_is_absolute @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_is_relative_to_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_is_reserved @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_join @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_join_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_match @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_match_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_name_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_ordering_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_parent_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_parents_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_parts_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_pickling_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_relative_to_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_repr_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_root @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_root_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_stem_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_str_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_str_subclass_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_suffix_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_suffixes_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_with_name_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_with_stem_common @ linux-x86_64 +test.test_pathlib.PosixPathAsPureTest.test_with_suffix_common @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_absolute @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_absolute_common @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_chmod @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_chmod_follow_symlinks_true @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_complex_symlinks_absolute @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_complex_symlinks_relative @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_complex_symlinks_relative_dot_dot @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_cwd @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_empty_path @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_exists @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_expanduser_common @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_glob @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_glob_common @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_glob_dotdot @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_glob_long_symlink @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_glob_many_open_files @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_glob_permissions @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_hardlink_to @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_block_device_false @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_char_device_false @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_char_device_true @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_dir @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_fifo_false @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_file @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_mount @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_socket_false @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_socket_true @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_is_symlink @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_iterdir @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_iterdir_nodir @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_iterdir_symlink @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_link_to @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_lstat @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_lstat_nosymlink @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_mkdir @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_mkdir_concurrent_parent_creation @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_mkdir_exist_ok @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_mkdir_exist_ok_root @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_mkdir_exist_ok_with_parent @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_mkdir_no_parents_file @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_mkdir_parents @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_mkdir_with_child_file @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_open_common @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_open_mode @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_parts_interning @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_pickling_common @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_read_write_bytes @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_read_write_text @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_readlink @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_rename @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_replace @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_resolve_common @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_resolve_dot @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_resolve_loop @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_resolve_nonexist_relative_issue38671 @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_resolve_root @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_rglob @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_rglob_common @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_rglob_symlink_loop @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_rmdir @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_samefile @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_stat @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_stat_no_follow_symlinks @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_stat_no_follow_symlinks_nosymlink @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_symlink_to @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_touch_common @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_touch_mode @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_touch_nochange @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_unlink @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_unlink_missing_ok @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_with @ linux-x86_64 +test.test_pathlib.PosixPathTest.test_write_text_with_newlines @ linux-x86_64 +test.test_pathlib.PurePathTest.test_anchor_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_as_bytes_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_as_posix_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_as_uri_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_concrete_class @ linux-x86_64 +test.test_pathlib.PurePathTest.test_constructor_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_different_flavours_unequal @ linux-x86_64 +test.test_pathlib.PurePathTest.test_different_flavours_unordered @ linux-x86_64 +test.test_pathlib.PurePathTest.test_div_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_drive_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_eq_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_equivalences @ linux-x86_64 +test.test_pathlib.PurePathTest.test_fspath_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_is_relative_to_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_join_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_match_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_name_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_ordering_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_parent_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_parents_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_parts_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_pickling_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_relative_to_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_repr_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_root_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_stem_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_str_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_str_subclass_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_suffix_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_suffixes_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_with_name_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_with_stem_common @ linux-x86_64 +test.test_pathlib.PurePathTest.test_with_suffix_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_anchor_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_as_bytes_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_as_posix_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_as_uri @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_as_uri_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_as_uri_non_ascii @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_constructor_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_div @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_div_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_drive_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_eq @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_eq_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_equivalences @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_fspath_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_is_absolute @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_is_relative_to_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_is_reserved @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_join @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_join_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_match @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_match_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_name_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_ordering_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_parent_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_parents_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_parts_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_pickling_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_relative_to_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_repr_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_root @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_root_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_stem_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_str_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_str_subclass_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_suffix_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_suffixes_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_with_name_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_with_stem_common @ linux-x86_64 +test.test_pathlib.PurePosixPathTest.test_with_suffix_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_anchor @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_anchor_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_as_bytes_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_as_posix_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_as_uri @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_as_uri_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_constructor_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_div @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_div_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_drive @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_drive_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_eq @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_eq_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_equivalences @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_fspath_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_is_absolute @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_is_relative_to @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_is_relative_to_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_is_reserved @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_join @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_join_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_match_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_name @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_name_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_ordering_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_parent @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_parent_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_parents @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_parents_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_parts @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_parts_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_pickling_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_relative_to @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_relative_to_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_repr_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_root @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_root_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_stem @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_stem_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_str @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_str_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_str_subclass @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_str_subclass_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_suffix @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_suffix_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_suffixes @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_suffixes_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_with_name @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_with_name_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_with_stem @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_with_stem_common @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_with_suffix @ linux-x86_64 +test.test_pathlib.PureWindowsPathTest.test_with_suffix_common @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_patma.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_patma.txt new file mode 100644 index 0000000000..7df6273be0 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_patma.txt @@ -0,0 +1,310 @@ +test.test_patma.TestCompiler.test_refleaks @ linux-x86_64 +test.test_patma.TestInheritance.test_late_registration_mapping @ linux-x86_64 +test.test_patma.TestInheritance.test_late_registration_sequence @ linux-x86_64 +test.test_patma.TestInheritance.test_multiple_inheritance_mapping @ linux-x86_64 +test.test_patma.TestInheritance.test_multiple_inheritance_sequence @ linux-x86_64 +test.test_patma.TestPatma.test_patma_000 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_001 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_002 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_003 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_004 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_005 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_006 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_007 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_008 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_009 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_010 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_011 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_012 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_013 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_014 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_015 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_016 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_017 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_018 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_019 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_020 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_021 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_022 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_023 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_024 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_025 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_026 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_027 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_028 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_029 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_030 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_031 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_032 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_033 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_034 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_035 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_036 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_037 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_038 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_039 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_040 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_041 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_042 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_043 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_044 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_045 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_046 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_047 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_048 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_049 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_050 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_051 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_052 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_053 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_054 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_055 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_056 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_057 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_058 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_059 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_060 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_061 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_062 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_063 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_064 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_065 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_066 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_067 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_068 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_069 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_070 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_071 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_072 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_073 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_074 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_075 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_076 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_077 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_078 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_079 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_080 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_081 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_082 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_083 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_084 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_085 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_086 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_087 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_088 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_089 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_090 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_091 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_092 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_093 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_094 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_095 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_096 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_097 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_098 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_099 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_100 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_101 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_102 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_103 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_104 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_105 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_106 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_107 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_108 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_109 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_110 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_111 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_112 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_113 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_114 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_115 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_116 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_117 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_118 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_119 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_120 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_121 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_122 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_123 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_124 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_125 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_126 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_127 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_128 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_129 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_130 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_131 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_132 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_133 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_134 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_135 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_136 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_137 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_138 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_139 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_140 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_141 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_142 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_143 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_144 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_145 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_146 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_147 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_148 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_149 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_150 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_151 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_152 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_153 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_154 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_155 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_156 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_157 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_158 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_159 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_160 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_161 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_162 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_163 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_164 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_165 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_166 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_167 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_168 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_169 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_170 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_171 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_172 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_173 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_174 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_175 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_176 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_177 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_178 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_179 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_180 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_181 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_182 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_183 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_184 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_185 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_186 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_187 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_188 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_189 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_190 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_191 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_192 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_193 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_194 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_195 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_196 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_197 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_198 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_199 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_200 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_201 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_202 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_203 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_204 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_205 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_206 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_207 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_208 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_209 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_210 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_211 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_212 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_213 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_214 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_215 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_216 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_217 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_218 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_219 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_220 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_221 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_222 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_223 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_224 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_225 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_226 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_227 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_228 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_229 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_230 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_231 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_232 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_233 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_234 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_235 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_236 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_237 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_238 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_239 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_240 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_241 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_242 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_243 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_244 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_245 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_246 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_247 @ linux-x86_64 +test.test_patma.TestPatma.test_patma_248 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_alternative_patterns_bind_different_names_0 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_alternative_patterns_bind_different_names_1 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_attribute_name_repeated_in_class_pattern @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_imaginary_number_required_in_complex_literal_0 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_imaginary_number_required_in_complex_literal_1 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_invalid_syntax_0 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_invalid_syntax_1 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_invalid_syntax_2 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_invalid_syntax_3 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_mapping_pattern_duplicate_key @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_mapping_pattern_duplicate_key_edge_case0 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_mapping_pattern_duplicate_key_edge_case1 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_mapping_pattern_duplicate_key_edge_case2 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_mapping_pattern_duplicate_key_edge_case3 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_mapping_pattern_keys_may_only_match_literals_and_attribute_lookups @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_multiple_assignments_to_name_in_pattern_0 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_multiple_assignments_to_name_in_pattern_1 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_multiple_assignments_to_name_in_pattern_2 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_multiple_assignments_to_name_in_pattern_3 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_multiple_assignments_to_name_in_pattern_4 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_multiple_assignments_to_name_in_pattern_5 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_multiple_starred_names_in_sequence_pattern_0 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_multiple_starred_names_in_sequence_pattern_1 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_name_capture_makes_remaining_patterns_unreachable_0 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_name_capture_makes_remaining_patterns_unreachable_1 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_name_capture_makes_remaining_patterns_unreachable_2 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_name_capture_makes_remaining_patterns_unreachable_3 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_name_capture_makes_remaining_patterns_unreachable_4 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_patterns_may_only_match_literals_and_attribute_lookups_0 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_patterns_may_only_match_literals_and_attribute_lookups_1 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_real_number_required_in_complex_literal_0 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_real_number_required_in_complex_literal_1 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_real_number_required_in_complex_literal_2 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_real_number_required_in_complex_literal_3 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_wildcard_makes_remaining_patterns_unreachable_0 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_wildcard_makes_remaining_patterns_unreachable_1 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_wildcard_makes_remaining_patterns_unreachable_2 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_wildcard_makes_remaining_patterns_unreachable_3 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_wildcard_makes_remaining_patterns_unreachable_4 @ linux-x86_64 +test.test_patma.TestSyntaxErrors.test_wildcard_makes_remaining_patterns_unreachable_5 @ linux-x86_64 +test.test_patma.TestTracing.test_default_capture @ linux-x86_64 +test.test_patma.TestTracing.test_default_wildcard @ linux-x86_64 +test.test_patma.TestTracing.test_no_default @ linux-x86_64 +test.test_patma.TestTracing.test_only_default_capture @ linux-x86_64 +test.test_patma.TestTracing.test_only_default_wildcard @ linux-x86_64 +test.test_patma.TestTracing.test_parser_deeply_nested_patterns @ linux-x86_64 +test.test_patma.TestTracing.test_unreachable_code @ linux-x86_64 +test.test_patma.TestTypeErrors.test_accepts_positional_subpatterns_0 @ linux-x86_64 +test.test_patma.TestTypeErrors.test_accepts_positional_subpatterns_1 @ linux-x86_64 +test.test_patma.TestTypeErrors.test_got_multiple_subpatterns_for_attribute_0 @ linux-x86_64 +test.test_patma.TestTypeErrors.test_got_multiple_subpatterns_for_attribute_1 @ linux-x86_64 +test.test_patma.TestTypeErrors.test_match_args_elements_must_be_strings @ linux-x86_64 +test.test_patma.TestTypeErrors.test_match_args_must_be_a_tuple_0 @ linux-x86_64 +test.test_patma.TestTypeErrors.test_match_args_must_be_a_tuple_1 @ linux-x86_64 +test.test_patma.TestTypeErrors.test_match_args_must_be_a_tuple_2 @ linux-x86_64 +test.test_patma.TestValueErrors.test_mapping_pattern_checks_duplicate_key_1 @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pep646_syntax.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pep646_syntax.txt new file mode 100644 index 0000000000..ea3b529610 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pep646_syntax.txt @@ -0,0 +1 @@ +DocTestCase.test.test_pep646_syntax.__test__.doctests @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pickle.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pickle.txt new file mode 100644 index 0000000000..0b4c0b405c --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pickle.txt @@ -0,0 +1,730 @@ +test.test_pickle.CChainDispatchTableTests.test_class_dispatch_table @ linux-x86_64 +test.test_pickle.CChainDispatchTableTests.test_default_dispatch_table @ linux-x86_64 +test.test_pickle.CChainDispatchTableTests.test_instance_dispatch_table @ linux-x86_64 +test.test_pickle.CDispatchTableTests.test_class_dispatch_table @ linux-x86_64 +test.test_pickle.CDispatchTableTests.test_default_dispatch_table @ linux-x86_64 +test.test_pickle.CDispatchTableTests.test_instance_dispatch_table @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_appends_on_non_lists @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_buffer_callback_error @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_buffers_error @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_builtin_exceptions @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_builtin_functions @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_builtin_types @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_bytearray @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_bytearray_memoization_bug @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_bytes @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_c_methods @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_compat_pickle @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_complex_newobj @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_complex_newobj_ex @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_dict_chunking @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_dynamic_class @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_ellipsis @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_evil_class_mutating_dict @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_evil_pickler_mutating_collection @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_float @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_float_format @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_framed_write_sizes_with_delayed_writer @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_framing_large_objects @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_framing_many_objects @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_getinitargs @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_global_ext1 @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_global_ext2 @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_global_ext4 @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_in_band_buffers @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_inband_accept_default_buffers_argument @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_int_pickling_efficiency @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_ints @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_large_pickles @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_list_chunking @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_local_lookup_error @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_long @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_long1 @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_long4 @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_many_puts_and_gets @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_metaclass @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_misc @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_nested_names @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_newobj_generic @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_newobj_list @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_newobj_list_slots @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_newobj_not_class @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_newobj_overridden_new @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_newobj_proxies @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_newobj_tuple @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_notimplemented @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_oob_buffers @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_oob_buffers_writable_to_readonly @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_optional_frames @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_pickle_to_2x @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_picklebuffer_error @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_proto @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_py_methods @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_and_inst @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_key @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_like @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_like_key @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_subclass @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_subclass_and_inst @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_dict_subclass_key @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_frozenset_and_inst @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_frozenset_subclass_and_inst @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_inst @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_inst_state @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_list @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_list_and_inst @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_list_like @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_list_subclass @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_list_subclass_and_inst @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_multi @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_nested_names @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_set @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_set_and_inst @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_set_subclass_and_inst @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_dict @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_dict_key @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_dict_like @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_dict_like_key @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_dict_subclass @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_dict_subclass_key @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_inst @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_inst_state @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_list @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_list_like @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_and_list_subclass @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_recursive_tuple_subclass_and_inst @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_reduce @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_reduce_bad_iterator @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_reduce_calls_base @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_reduce_ex_called @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_reduce_ex_calls_base @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_reduce_ex_overrides_reduce @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_reduce_overrides_default_reduce_ex @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_roundtrip_equality @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_set_chunking @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_setitems_on_non_dicts @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_short_tuples @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_simple_newobj @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_singleton_types @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_singletons @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_structseq @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_unicode @ linux-x86_64 +test.test_pickle.CDumpPickle_LoadPickle.test_unicode_high_plane @ linux-x86_64 +test.test_pickle.CIdPersPicklerTests.test_protocol0_is_ascii_only @ linux-x86_64 +test.test_pickle.CIdPersPicklerTests.test_return_correct_type @ linux-x86_64 +test.test_pickle.CPersPicklerTests.test_persistence @ linux-x86_64 +test.test_pickle.CPickleTests.test_bad_init @ linux-x86_64 +test.test_pickle.CPickleTests.test_callapi @ linux-x86_64 +test.test_pickle.CPickleTests.test_dump_closed_file @ linux-x86_64 +test.test_pickle.CPickleTests.test_dump_load_oob_buffers @ linux-x86_64 +test.test_pickle.CPickleTests.test_dump_text_file @ linux-x86_64 +test.test_pickle.CPickleTests.test_dumps_loads_oob_buffers @ linux-x86_64 +test.test_pickle.CPickleTests.test_highest_protocol @ linux-x86_64 +test.test_pickle.CPickleTests.test_incomplete_input @ linux-x86_64 +test.test_pickle.CPickleTests.test_load_closed_file @ linux-x86_64 +test.test_pickle.CPickleTests.test_load_from_and_dump_to_file @ linux-x86_64 +test.test_pickle.CPickleTests.test_pickler_bad_file @ linux-x86_64 +test.test_pickle.CPickleTests.test_unpickler_bad_file @ linux-x86_64 +test.test_pickle.CPicklerHookTests.test_pickler_hook @ linux-x86_64 +test.test_pickle.CPicklerTests.test_appends_on_non_lists @ linux-x86_64 +test.test_pickle.CPicklerTests.test_buffer_callback_error @ linux-x86_64 +test.test_pickle.CPicklerTests.test_buffers_error @ linux-x86_64 +test.test_pickle.CPicklerTests.test_builtin_exceptions @ linux-x86_64 +test.test_pickle.CPicklerTests.test_builtin_functions @ linux-x86_64 +test.test_pickle.CPicklerTests.test_builtin_types @ linux-x86_64 +test.test_pickle.CPicklerTests.test_bytearray @ linux-x86_64 +test.test_pickle.CPicklerTests.test_bytearray_memoization_bug @ linux-x86_64 +test.test_pickle.CPicklerTests.test_bytes @ linux-x86_64 +test.test_pickle.CPicklerTests.test_c_methods @ linux-x86_64 +test.test_pickle.CPicklerTests.test_compat_pickle @ linux-x86_64 +test.test_pickle.CPicklerTests.test_complex_newobj @ linux-x86_64 +test.test_pickle.CPicklerTests.test_complex_newobj_ex @ linux-x86_64 +test.test_pickle.CPicklerTests.test_dict_chunking @ linux-x86_64 +test.test_pickle.CPicklerTests.test_dynamic_class @ linux-x86_64 +test.test_pickle.CPicklerTests.test_ellipsis @ linux-x86_64 +test.test_pickle.CPicklerTests.test_evil_class_mutating_dict @ linux-x86_64 +test.test_pickle.CPicklerTests.test_evil_pickler_mutating_collection @ linux-x86_64 +test.test_pickle.CPicklerTests.test_float @ linux-x86_64 +test.test_pickle.CPicklerTests.test_float_format @ linux-x86_64 +test.test_pickle.CPicklerTests.test_framed_write_sizes_with_delayed_writer @ linux-x86_64 +test.test_pickle.CPicklerTests.test_framing_large_objects @ linux-x86_64 +test.test_pickle.CPicklerTests.test_framing_many_objects @ linux-x86_64 +test.test_pickle.CPicklerTests.test_getinitargs @ linux-x86_64 +test.test_pickle.CPicklerTests.test_global_ext1 @ linux-x86_64 +test.test_pickle.CPicklerTests.test_global_ext2 @ linux-x86_64 +test.test_pickle.CPicklerTests.test_global_ext4 @ linux-x86_64 +test.test_pickle.CPicklerTests.test_in_band_buffers @ linux-x86_64 +test.test_pickle.CPicklerTests.test_inband_accept_default_buffers_argument @ linux-x86_64 +test.test_pickle.CPicklerTests.test_int_pickling_efficiency @ linux-x86_64 +test.test_pickle.CPicklerTests.test_ints @ linux-x86_64 +test.test_pickle.CPicklerTests.test_large_pickles @ linux-x86_64 +test.test_pickle.CPicklerTests.test_list_chunking @ linux-x86_64 +test.test_pickle.CPicklerTests.test_local_lookup_error @ linux-x86_64 +test.test_pickle.CPicklerTests.test_long @ linux-x86_64 +test.test_pickle.CPicklerTests.test_long1 @ linux-x86_64 +test.test_pickle.CPicklerTests.test_long4 @ linux-x86_64 +test.test_pickle.CPicklerTests.test_many_puts_and_gets @ linux-x86_64 +test.test_pickle.CPicklerTests.test_metaclass @ linux-x86_64 +test.test_pickle.CPicklerTests.test_misc @ linux-x86_64 +test.test_pickle.CPicklerTests.test_nested_names @ linux-x86_64 +test.test_pickle.CPicklerTests.test_newobj_generic @ linux-x86_64 +test.test_pickle.CPicklerTests.test_newobj_list @ linux-x86_64 +test.test_pickle.CPicklerTests.test_newobj_list_slots @ linux-x86_64 +test.test_pickle.CPicklerTests.test_newobj_not_class @ linux-x86_64 +test.test_pickle.CPicklerTests.test_newobj_overridden_new @ linux-x86_64 +test.test_pickle.CPicklerTests.test_newobj_proxies @ linux-x86_64 +test.test_pickle.CPicklerTests.test_newobj_tuple @ linux-x86_64 +test.test_pickle.CPicklerTests.test_notimplemented @ linux-x86_64 +test.test_pickle.CPicklerTests.test_oob_buffers @ linux-x86_64 +test.test_pickle.CPicklerTests.test_oob_buffers_writable_to_readonly @ linux-x86_64 +test.test_pickle.CPicklerTests.test_optional_frames @ linux-x86_64 +test.test_pickle.CPicklerTests.test_pickle_to_2x @ linux-x86_64 +test.test_pickle.CPicklerTests.test_picklebuffer_error @ linux-x86_64 +test.test_pickle.CPicklerTests.test_proto @ linux-x86_64 +test.test_pickle.CPicklerTests.test_py_methods @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_dict @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_dict_and_inst @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_dict_key @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_dict_like @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_dict_like_key @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_dict_subclass @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_dict_subclass_and_inst @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_dict_subclass_key @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_frozenset_and_inst @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_frozenset_subclass_and_inst @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_inst @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_inst_state @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_list @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_list_and_inst @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_list_like @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_list_subclass @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_list_subclass_and_inst @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_multi @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_nested_names @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_set @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_set_and_inst @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_set_subclass_and_inst @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_dict @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_dict_key @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_dict_like @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_dict_like_key @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_dict_subclass @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_dict_subclass_key @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_inst @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_inst_state @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_list @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_list_like @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_tuple_and_list_subclass @ linux-x86_64 +test.test_pickle.CPicklerTests.test_recursive_tuple_subclass_and_inst @ linux-x86_64 +test.test_pickle.CPicklerTests.test_reduce @ linux-x86_64 +test.test_pickle.CPicklerTests.test_reduce_bad_iterator @ linux-x86_64 +test.test_pickle.CPicklerTests.test_reduce_calls_base @ linux-x86_64 +test.test_pickle.CPicklerTests.test_reduce_ex_called @ linux-x86_64 +test.test_pickle.CPicklerTests.test_reduce_ex_calls_base @ linux-x86_64 +test.test_pickle.CPicklerTests.test_reduce_ex_overrides_reduce @ linux-x86_64 +test.test_pickle.CPicklerTests.test_reduce_overrides_default_reduce_ex @ linux-x86_64 +test.test_pickle.CPicklerTests.test_roundtrip_equality @ linux-x86_64 +test.test_pickle.CPicklerTests.test_set_chunking @ linux-x86_64 +test.test_pickle.CPicklerTests.test_setitems_on_non_dicts @ linux-x86_64 +test.test_pickle.CPicklerTests.test_short_tuples @ linux-x86_64 +test.test_pickle.CPicklerTests.test_simple_newobj @ linux-x86_64 +test.test_pickle.CPicklerTests.test_singleton_types @ linux-x86_64 +test.test_pickle.CPicklerTests.test_singletons @ linux-x86_64 +test.test_pickle.CPicklerTests.test_structseq @ linux-x86_64 +test.test_pickle.CPicklerTests.test_unicode @ linux-x86_64 +test.test_pickle.CPicklerTests.test_unicode_high_plane @ linux-x86_64 +test.test_pickle.CPicklerUnpicklerObjectTests.test_clear_pickler_memo @ linux-x86_64 +test.test_pickle.CPicklerUnpicklerObjectTests.test_issue18339 @ linux-x86_64 +test.test_pickle.CPicklerUnpicklerObjectTests.test_multiple_unpicklings_minimal @ linux-x86_64 +test.test_pickle.CPicklerUnpicklerObjectTests.test_multiple_unpicklings_seekable @ linux-x86_64 +test.test_pickle.CPicklerUnpicklerObjectTests.test_multiple_unpicklings_unseekable @ linux-x86_64 +test.test_pickle.CPicklerUnpicklerObjectTests.test_priming_pickler_memo @ linux-x86_64 +test.test_pickle.CPicklerUnpicklerObjectTests.test_priming_unpickler_memo @ linux-x86_64 +test.test_pickle.CPicklerUnpicklerObjectTests.test_reusing_unpickler_objects @ linux-x86_64 +test.test_pickle.CPicklerUnpicklerObjectTests.test_unpickling_buffering_readline @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_bad_mark @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_bad_newobj @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_bad_newobj_ex @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_bad_reduce @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_bad_stack @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_badly_escaped_string @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_badly_quoted_string @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_binbytes @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_binbytes8 @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_binget @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_binunicode8 @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_bytearray8 @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_compat_unpickle @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_constants @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_correctly_quoted_string @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_dup @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_empty_bytestring @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_frame_readline @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_get @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_large_32b_binbytes8 @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_large_32b_binunicode8 @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_large_32b_bytearray8 @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_load_classic_instance @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_load_from_data0 @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_load_from_data1 @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_load_from_data2 @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_load_from_data3 @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_load_from_data4 @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_load_long_python2_str_as_bytes @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_load_python2_str_as_bytes @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_load_python2_unicode_as_str @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_long_binget @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_maxint64 @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_misc_get @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_negative_32b_binbytes @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_negative_32b_binput @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_negative_32b_binunicode @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_negative_put @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_short_binbytes @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_short_binunicode @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_truncated_data @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_unpickle_from_2x @ linux-x86_64 +test.test_pickle.CUnpicklerTests.test_unpickle_module_race @ linux-x86_64 +test.test_pickle.CompatPickleTests.test_exceptions @ linux-x86_64 +test.test_pickle.CompatPickleTests.test_import @ linux-x86_64 +test.test_pickle.CompatPickleTests.test_import_mapping @ linux-x86_64 +test.test_pickle.CompatPickleTests.test_multiprocessing_exceptions @ linux-x86_64 +test.test_pickle.CompatPickleTests.test_name_mapping @ linux-x86_64 +test.test_pickle.CompatPickleTests.test_reverse_import_mapping @ linux-x86_64 +test.test_pickle.CompatPickleTests.test_reverse_name_mapping @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_appends_on_non_lists @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_buffer_callback_error @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_buffers_error @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_builtin_exceptions @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_builtin_functions @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_builtin_types @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_bytearray @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_bytearray_memoization_bug @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_bytes @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_c_methods @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_compat_pickle @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_complex_newobj @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_complex_newobj_ex @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_dict_chunking @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_dynamic_class @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_ellipsis @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_evil_class_mutating_dict @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_evil_pickler_mutating_collection @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_float @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_float_format @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_framed_write_sizes_with_delayed_writer @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_framing_large_objects @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_framing_many_objects @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_getinitargs @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_global_ext1 @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_global_ext2 @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_global_ext4 @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_in_band_buffers @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_inband_accept_default_buffers_argument @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_int_pickling_efficiency @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_ints @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_large_pickles @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_list_chunking @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_local_lookup_error @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_long @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_long1 @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_long4 @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_many_puts_and_gets @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_metaclass @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_misc @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_nested_names @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_newobj_generic @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_newobj_list @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_newobj_list_slots @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_newobj_not_class @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_newobj_overridden_new @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_newobj_proxies @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_newobj_tuple @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_notimplemented @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_oob_buffers @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_oob_buffers_writable_to_readonly @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_optional_frames @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_pickle_to_2x @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_picklebuffer_error @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_proto @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_py_methods @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_and_inst @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_key @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_like @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_like_key @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_subclass @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_subclass_and_inst @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_dict_subclass_key @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_frozenset_and_inst @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_frozenset_subclass_and_inst @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_inst @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_inst_state @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_list @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_list_and_inst @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_list_like @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_list_subclass @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_list_subclass_and_inst @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_multi @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_nested_names @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_set @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_set_and_inst @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_set_subclass_and_inst @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_dict @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_dict_key @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_dict_like @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_dict_like_key @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_dict_subclass @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_dict_subclass_key @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_inst @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_inst_state @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_list @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_list_like @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_and_list_subclass @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_recursive_tuple_subclass_and_inst @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_reduce @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_reduce_bad_iterator @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_reduce_calls_base @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_reduce_ex_called @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_reduce_ex_calls_base @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_reduce_ex_overrides_reduce @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_reduce_overrides_default_reduce_ex @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_roundtrip_equality @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_set_chunking @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_setitems_on_non_dicts @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_short_tuples @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_simple_newobj @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_singleton_types @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_singletons @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_structseq @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_unicode @ linux-x86_64 +test.test_pickle.DumpPickle_CLoadPickle.test_unicode_high_plane @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_appends_on_non_lists @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_bad_mark @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_bad_newobj @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_bad_newobj_ex @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_bad_reduce @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_bad_stack @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_badly_escaped_string @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_badly_quoted_string @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_binbytes @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_binbytes8 @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_binget @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_binunicode8 @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_buffer_callback_error @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_buffers_error @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_builtin_exceptions @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_builtin_functions @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_builtin_types @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_bytearray @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_bytearray8 @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_bytearray_memoization_bug @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_bytes @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_c_methods @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_compat_pickle @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_compat_unpickle @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_complex_newobj @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_complex_newobj_ex @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_constants @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_correctly_quoted_string @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_dict_chunking @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_dup @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_dynamic_class @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_ellipsis @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_empty_bytestring @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_evil_class_mutating_dict @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_float @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_float_format @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_frame_readline @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_framing_large_objects @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_framing_many_objects @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_get @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_getinitargs @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_global_ext1 @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_global_ext2 @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_global_ext4 @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_in_band_buffers @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_inband_accept_default_buffers_argument @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_int_pickling_efficiency @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_ints @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_large_32b_binbytes8 @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_large_32b_binunicode8 @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_large_32b_bytearray8 @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_large_pickles @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_list_chunking @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_load_classic_instance @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_load_from_data0 @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_load_from_data1 @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_load_from_data2 @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_load_from_data3 @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_load_from_data4 @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_load_long_python2_str_as_bytes @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_load_python2_str_as_bytes @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_load_python2_unicode_as_str @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_local_lookup_error @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_long @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_long1 @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_long4 @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_long_binget @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_many_puts_and_gets @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_maxint64 @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_metaclass @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_misc @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_misc_get @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_negative_32b_binbytes @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_negative_32b_binput @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_negative_32b_binunicode @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_negative_put @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_nested_names @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_newobj_generic @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_newobj_list @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_newobj_list_slots @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_newobj_not_class @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_newobj_overridden_new @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_newobj_proxies @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_newobj_tuple @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_notimplemented @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_oob_buffers @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_oob_buffers_writable_to_readonly @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_optional_frames @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_pickle_to_2x @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_picklebuffer_error @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_proto @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_py_methods @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_dict @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_dict_and_inst @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_dict_key @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_dict_like @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_dict_like_key @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_dict_subclass @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_dict_subclass_and_inst @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_dict_subclass_key @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_frozenset_and_inst @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_frozenset_subclass_and_inst @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_inst @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_inst_state @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_list @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_list_and_inst @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_list_like @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_list_subclass @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_list_subclass_and_inst @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_multi @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_nested_names @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_set @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_set_and_inst @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_set_subclass_and_inst @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_dict @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_dict_key @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_dict_like @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_dict_like_key @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_dict_subclass @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_dict_subclass_key @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_inst @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_inst_state @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_list @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_list_like @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_and_list_subclass @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_recursive_tuple_subclass_and_inst @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_reduce @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_reduce_bad_iterator @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_reduce_calls_base @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_reduce_ex_called @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_reduce_ex_calls_base @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_reduce_ex_overrides_reduce @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_reduce_overrides_default_reduce_ex @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_roundtrip_equality @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_set_chunking @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_setitems_on_non_dicts @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_short_binbytes @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_short_binunicode @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_short_tuples @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_simple_newobj @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_singleton_types @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_singletons @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_structseq @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_truncated_data @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_unicode @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_unicode_high_plane @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_unpickle_from_2x @ linux-x86_64 +test.test_pickle.InMemoryPickleTests.test_unpickle_module_race @ linux-x86_64 +test.test_pickle.PyChainDispatchTableTests.test_class_dispatch_table @ linux-x86_64 +test.test_pickle.PyChainDispatchTableTests.test_default_dispatch_table @ linux-x86_64 +test.test_pickle.PyChainDispatchTableTests.test_instance_dispatch_table @ linux-x86_64 +test.test_pickle.PyDispatchTableTests.test_class_dispatch_table @ linux-x86_64 +test.test_pickle.PyDispatchTableTests.test_default_dispatch_table @ linux-x86_64 +test.test_pickle.PyDispatchTableTests.test_instance_dispatch_table @ linux-x86_64 +test.test_pickle.PyIdPersPicklerTests.test_protocol0_is_ascii_only @ linux-x86_64 +test.test_pickle.PyIdPersPicklerTests.test_return_correct_type @ linux-x86_64 +test.test_pickle.PyPersPicklerTests.test_persistence @ linux-x86_64 +test.test_pickle.PyPickleTests.test_bad_init @ linux-x86_64 +test.test_pickle.PyPickleTests.test_callapi @ linux-x86_64 +test.test_pickle.PyPickleTests.test_dump_closed_file @ linux-x86_64 +test.test_pickle.PyPickleTests.test_dump_load_oob_buffers @ linux-x86_64 +test.test_pickle.PyPickleTests.test_dump_text_file @ linux-x86_64 +test.test_pickle.PyPickleTests.test_dumps_loads_oob_buffers @ linux-x86_64 +test.test_pickle.PyPickleTests.test_highest_protocol @ linux-x86_64 +test.test_pickle.PyPickleTests.test_incomplete_input @ linux-x86_64 +test.test_pickle.PyPickleTests.test_load_closed_file @ linux-x86_64 +test.test_pickle.PyPickleTests.test_load_from_and_dump_to_file @ linux-x86_64 +test.test_pickle.PyPickleTests.test_pickler_bad_file @ linux-x86_64 +test.test_pickle.PyPickleTests.test_unpickler_bad_file @ linux-x86_64 +test.test_pickle.PyPicklerHookTests.test_pickler_hook @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_appends_on_non_lists @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_buffer_callback_error @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_buffers_error @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_builtin_exceptions @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_builtin_functions @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_builtin_types @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_bytearray @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_bytearray_memoization_bug @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_bytes @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_c_methods @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_compat_pickle @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_complex_newobj @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_complex_newobj_ex @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_dict_chunking @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_dynamic_class @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_ellipsis @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_evil_class_mutating_dict @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_evil_pickler_mutating_collection @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_float @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_float_format @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_framed_write_sizes_with_delayed_writer @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_framing_large_objects @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_framing_many_objects @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_getinitargs @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_global_ext1 @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_global_ext2 @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_global_ext4 @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_in_band_buffers @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_inband_accept_default_buffers_argument @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_int_pickling_efficiency @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_ints @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_large_pickles @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_list_chunking @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_local_lookup_error @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_long @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_long1 @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_long4 @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_many_puts_and_gets @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_metaclass @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_misc @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_nested_names @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_newobj_generic @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_newobj_list @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_newobj_list_slots @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_newobj_not_class @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_newobj_overridden_new @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_newobj_proxies @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_newobj_tuple @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_notimplemented @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_oob_buffers @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_oob_buffers_writable_to_readonly @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_optional_frames @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_pickle_to_2x @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_picklebuffer_error @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_proto @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_py_methods @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_dict @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_dict_and_inst @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_dict_key @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_dict_like @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_dict_like_key @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_dict_subclass @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_dict_subclass_and_inst @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_dict_subclass_key @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_frozenset_and_inst @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_frozenset_subclass_and_inst @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_inst @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_inst_state @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_list @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_list_and_inst @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_list_like @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_list_subclass @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_list_subclass_and_inst @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_multi @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_nested_names @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_set @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_set_and_inst @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_set_subclass_and_inst @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_dict @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_dict_key @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_dict_like @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_dict_like_key @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_dict_subclass @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_dict_subclass_key @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_inst @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_inst_state @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_list @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_list_like @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_and_list_subclass @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_recursive_tuple_subclass_and_inst @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_reduce @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_reduce_bad_iterator @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_reduce_calls_base @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_reduce_ex_called @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_reduce_ex_calls_base @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_reduce_ex_overrides_reduce @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_reduce_overrides_default_reduce_ex @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_roundtrip_equality @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_set_chunking @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_setitems_on_non_dicts @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_short_tuples @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_simple_newobj @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_singleton_types @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_singletons @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_structseq @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_unicode @ linux-x86_64 +test.test_pickle.PyPicklerTests.test_unicode_high_plane @ linux-x86_64 +test.test_pickle.PyPicklerUnpicklerObjectTests.test_clear_pickler_memo @ linux-x86_64 +test.test_pickle.PyPicklerUnpicklerObjectTests.test_multiple_unpicklings_minimal @ linux-x86_64 +test.test_pickle.PyPicklerUnpicklerObjectTests.test_multiple_unpicklings_seekable @ linux-x86_64 +test.test_pickle.PyPicklerUnpicklerObjectTests.test_multiple_unpicklings_unseekable @ linux-x86_64 +test.test_pickle.PyPicklerUnpicklerObjectTests.test_priming_pickler_memo @ linux-x86_64 +test.test_pickle.PyPicklerUnpicklerObjectTests.test_priming_unpickler_memo @ linux-x86_64 +test.test_pickle.PyPicklerUnpicklerObjectTests.test_reusing_unpickler_objects @ linux-x86_64 +test.test_pickle.PyPicklerUnpicklerObjectTests.test_unpickling_buffering_readline @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_bad_mark @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_bad_newobj @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_bad_newobj_ex @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_bad_reduce @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_bad_stack @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_badly_escaped_string @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_badly_quoted_string @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_binbytes @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_binbytes8 @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_binget @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_binunicode8 @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_bytearray8 @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_compat_unpickle @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_constants @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_correctly_quoted_string @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_dup @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_empty_bytestring @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_frame_readline @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_get @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_large_32b_binbytes8 @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_large_32b_binunicode8 @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_large_32b_bytearray8 @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_load_classic_instance @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_load_from_data0 @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_load_from_data1 @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_load_from_data2 @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_load_from_data3 @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_load_from_data4 @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_load_long_python2_str_as_bytes @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_load_python2_str_as_bytes @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_load_python2_unicode_as_str @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_long_binget @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_maxint64 @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_misc_get @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_negative_32b_binbytes @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_negative_32b_binput @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_negative_32b_binunicode @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_negative_put @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_short_binbytes @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_short_binunicode @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_truncated_data @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_unpickle_from_2x @ linux-x86_64 +test.test_pickle.PyUnpicklerTests.test_unpickle_module_race @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_picklebuffer.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_picklebuffer.txt new file mode 100644 index 0000000000..138f7838a6 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_picklebuffer.txt @@ -0,0 +1,8 @@ +test.test_picklebuffer.PickleBufferTest.test_basics @ linux-x86_64 +test.test_picklebuffer.PickleBufferTest.test_constructor_failure @ linux-x86_64 +test.test_picklebuffer.PickleBufferTest.test_ndarray_2d @ linux-x86_64 +test.test_picklebuffer.PickleBufferTest.test_raw @ linux-x86_64 +test.test_picklebuffer.PickleBufferTest.test_raw_ndarray @ linux-x86_64 +test.test_picklebuffer.PickleBufferTest.test_raw_non_contiguous @ linux-x86_64 +test.test_picklebuffer.PickleBufferTest.test_raw_released @ linux-x86_64 +test.test_picklebuffer.PickleBufferTest.test_release @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pickletools.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pickletools.txt new file mode 100644 index 0000000000..0ee57402fc --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pickletools.txt @@ -0,0 +1,132 @@ +DocTestCase.pickletools.__test__.disassembler_memo_test @ linux-x86_64 +DocTestCase.pickletools.__test__.disassembler_test @ linux-x86_64 +DocTestCase.pickletools.read_bytearray8 @ linux-x86_64 +DocTestCase.pickletools.read_bytes1 @ linux-x86_64 +DocTestCase.pickletools.read_bytes4 @ linux-x86_64 +DocTestCase.pickletools.read_bytes8 @ linux-x86_64 +DocTestCase.pickletools.read_decimalnl_long @ linux-x86_64 +DocTestCase.pickletools.read_decimalnl_short @ linux-x86_64 +DocTestCase.pickletools.read_float8 @ linux-x86_64 +DocTestCase.pickletools.read_floatnl @ linux-x86_64 +DocTestCase.pickletools.read_int4 @ linux-x86_64 +DocTestCase.pickletools.read_long1 @ linux-x86_64 +DocTestCase.pickletools.read_long4 @ linux-x86_64 +DocTestCase.pickletools.read_string1 @ linux-x86_64 +DocTestCase.pickletools.read_string4 @ linux-x86_64 +DocTestCase.pickletools.read_stringnl @ linux-x86_64 +DocTestCase.pickletools.read_stringnl_noescape_pair @ linux-x86_64 +DocTestCase.pickletools.read_uint1 @ linux-x86_64 +DocTestCase.pickletools.read_uint2 @ linux-x86_64 +DocTestCase.pickletools.read_uint4 @ linux-x86_64 +DocTestCase.pickletools.read_uint8 @ linux-x86_64 +DocTestCase.pickletools.read_unicodestring1 @ linux-x86_64 +DocTestCase.pickletools.read_unicodestring4 @ linux-x86_64 +DocTestCase.pickletools.read_unicodestring8 @ linux-x86_64 +DocTestCase.pickletools.read_unicodestringnl @ linux-x86_64 +test.test_pickletools.MiscTestCase.test__all__ @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_appends_on_non_lists @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_buffer_callback_error @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_buffers_error @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_builtin_exceptions @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_builtin_functions @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_builtin_types @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_bytearray @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_bytearray_memoization_bug @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_bytes @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_c_methods @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_compat_pickle @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_complex_newobj @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_complex_newobj_ex @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_dict_chunking @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_dynamic_class @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_ellipsis @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_evil_class_mutating_dict @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_float @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_float_format @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_framing_large_objects @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_framing_many_objects @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_getinitargs @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_global_ext1 @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_global_ext2 @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_global_ext4 @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_in_band_buffers @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_inband_accept_default_buffers_argument @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_int_pickling_efficiency @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_ints @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_large_pickles @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_list_chunking @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_local_lookup_error @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_long @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_long1 @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_long4 @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_many_puts_and_gets @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_metaclass @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_misc @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_nested_names @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_newobj_generic @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_newobj_list @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_newobj_list_slots @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_newobj_not_class @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_newobj_overridden_new @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_newobj_proxies @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_newobj_tuple @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_notimplemented @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_oob_buffers @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_oob_buffers_writable_to_readonly @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_optimize_binput_and_memoize @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_optimize_long_binget @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_optional_frames @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_picklebuffer_error @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_proto @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_py_methods @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_dict @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_dict_and_inst @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_dict_key @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_dict_like @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_dict_like_key @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_dict_subclass @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_dict_subclass_and_inst @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_dict_subclass_key @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_frozenset_and_inst @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_frozenset_subclass_and_inst @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_inst @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_inst_state @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_list @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_list_and_inst @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_list_like @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_list_subclass @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_list_subclass_and_inst @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_multi @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_nested_names @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_set @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_set_and_inst @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_set_subclass_and_inst @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_dict @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_dict_key @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_dict_like @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_dict_like_key @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_dict_subclass @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_dict_subclass_key @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_inst @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_inst_state @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_list @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_list_like @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_and_list_subclass @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_recursive_tuple_subclass_and_inst @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_reduce @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_reduce_bad_iterator @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_reduce_calls_base @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_reduce_ex_called @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_reduce_ex_calls_base @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_reduce_ex_overrides_reduce @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_reduce_overrides_default_reduce_ex @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_roundtrip_equality @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_set_chunking @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_setitems_on_non_dicts @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_short_tuples @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_simple_newobj @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_singleton_types @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_singletons @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_structseq @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_unicode @ linux-x86_64 +test.test_pickletools.OptimizedPickleTests.test_unicode_high_plane @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pipes.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pipes.txt new file mode 100644 index 0000000000..6638e169e7 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pipes.txt @@ -0,0 +1,14 @@ +test.test_pipes.SimplePipeTests.testBadAppendOptions @ linux-x86_64 +test.test_pipes.SimplePipeTests.testBadOpenMode @ linux-x86_64 +test.test_pipes.SimplePipeTests.testBadPrependOptions @ linux-x86_64 +test.test_pipes.SimplePipeTests.testClone @ linux-x86_64 +test.test_pipes.SimplePipeTests.testEmptyPipeline1 @ linux-x86_64 +test.test_pipes.SimplePipeTests.testEmptyPipeline2 @ linux-x86_64 +test.test_pipes.SimplePipeTests.testEmptyPipeline3 @ linux-x86_64 +test.test_pipes.SimplePipeTests.testReadOpenSink @ linux-x86_64 +test.test_pipes.SimplePipeTests.testRepr @ linux-x86_64 +test.test_pipes.SimplePipeTests.testSetDebug @ linux-x86_64 +test.test_pipes.SimplePipeTests.testSimplePipe1 @ linux-x86_64 +test.test_pipes.SimplePipeTests.testSimplePipe2 @ linux-x86_64 +test.test_pipes.SimplePipeTests.testSimplePipe3 @ linux-x86_64 +test.test_pipes.SimplePipeTests.testWriteOpenSource @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pkg.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pkg.txt new file mode 100644 index 0000000000..4c1c41b630 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pkg.txt @@ -0,0 +1,8 @@ +test.test_pkg.TestPkg.test_1 @ linux-x86_64 +test.test_pkg.TestPkg.test_2 @ linux-x86_64 +test.test_pkg.TestPkg.test_3 @ linux-x86_64 +test.test_pkg.TestPkg.test_4 @ linux-x86_64 +test.test_pkg.TestPkg.test_5 @ linux-x86_64 +test.test_pkg.TestPkg.test_6 @ linux-x86_64 +test.test_pkg.TestPkg.test_7 @ linux-x86_64 +test.test_pkg.TestPkg.test_8 @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pkgutil.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pkgutil.txt new file mode 100644 index 0000000000..fc27e3d142 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pkgutil.txt @@ -0,0 +1,26 @@ +test.test_pkgutil.ExtendPathTests.test_iter_importers @ linux-x86_64 +test.test_pkgutil.ExtendPathTests.test_mixed_namespace @ linux-x86_64 +test.test_pkgutil.ExtendPathTests.test_simple @ linux-x86_64 +test.test_pkgutil.ImportlibMigrationTests.test_find_loader_avoids_emulation @ linux-x86_64 +test.test_pkgutil.ImportlibMigrationTests.test_find_loader_missing_module @ linux-x86_64 +test.test_pkgutil.ImportlibMigrationTests.test_get_importer_avoids_emulation @ linux-x86_64 +test.test_pkgutil.ImportlibMigrationTests.test_get_loader_None_in_sys_modules @ linux-x86_64 +test.test_pkgutil.ImportlibMigrationTests.test_get_loader_avoids_emulation @ linux-x86_64 +test.test_pkgutil.ImportlibMigrationTests.test_get_loader_handles_missing_loader_attribute @ linux-x86_64 +test.test_pkgutil.ImportlibMigrationTests.test_get_loader_handles_missing_spec_attribute @ linux-x86_64 +test.test_pkgutil.ImportlibMigrationTests.test_get_loader_handles_spec_attribute_none @ linux-x86_64 +test.test_pkgutil.ImportlibMigrationTests.test_importer_deprecated @ linux-x86_64 +test.test_pkgutil.ImportlibMigrationTests.test_issue44061 @ linux-x86_64 +test.test_pkgutil.ImportlibMigrationTests.test_iter_importers_avoids_emulation @ linux-x86_64 +test.test_pkgutil.ImportlibMigrationTests.test_loader_deprecated @ linux-x86_64 +test.test_pkgutil.NestedNamespacePackageTest.test_nested @ linux-x86_64 +test.test_pkgutil.PkgutilPEP302Tests.test_alreadyloaded @ linux-x86_64 +test.test_pkgutil.PkgutilPEP302Tests.test_getdata_pep302 @ linux-x86_64 +test.test_pkgutil.PkgutilTests.test_getdata_filesys @ linux-x86_64 +test.test_pkgutil.PkgutilTests.test_getdata_zipfile @ linux-x86_64 +test.test_pkgutil.PkgutilTests.test_issue44061_iter_modules @ linux-x86_64 +test.test_pkgutil.PkgutilTests.test_name_resolution @ linux-x86_64 +test.test_pkgutil.PkgutilTests.test_unreadable_dir_on_syspath @ linux-x86_64 +test.test_pkgutil.PkgutilTests.test_walk_packages_raises_on_string_or_bytes_input @ linux-x86_64 +test.test_pkgutil.PkgutilTests.test_walkpackages_filesys @ linux-x86_64 +test.test_pkgutil.PkgutilTests.test_walkpackages_zipfile @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_platform.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_platform.txt new file mode 100644 index 0000000000..d4ee9d3799 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_platform.txt @@ -0,0 +1,26 @@ +test.test_platform.PlatformTest.test_architecture @ linux-x86_64 +test.test_platform.PlatformTest.test_freedesktop_os_release @ linux-x86_64 +test.test_platform.PlatformTest.test_java_ver @ linux-x86_64 +test.test_platform.PlatformTest.test_libc_ver @ linux-x86_64 +test.test_platform.PlatformTest.test_mac_ver @ linux-x86_64 +test.test_platform.PlatformTest.test_machine @ linux-x86_64 +test.test_platform.PlatformTest.test_macos @ linux-x86_64 +test.test_platform.PlatformTest.test_node @ linux-x86_64 +test.test_platform.PlatformTest.test_parse_os_release @ linux-x86_64 +test.test_platform.PlatformTest.test_platform @ linux-x86_64 +test.test_platform.PlatformTest.test_processor @ linux-x86_64 +test.test_platform.PlatformTest.test_release @ linux-x86_64 +test.test_platform.PlatformTest.test_sys_version @ linux-x86_64 +test.test_platform.PlatformTest.test_system @ linux-x86_64 +test.test_platform.PlatformTest.test_system_alias @ linux-x86_64 +test.test_platform.PlatformTest.test_uname @ linux-x86_64 +test.test_platform.PlatformTest.test_uname_asdict @ linux-x86_64 +test.test_platform.PlatformTest.test_uname_cast_to_tuple @ linux-x86_64 +test.test_platform.PlatformTest.test_uname_copy @ linux-x86_64 +test.test_platform.PlatformTest.test_uname_fields @ linux-x86_64 +test.test_platform.PlatformTest.test_uname_pickle @ linux-x86_64 +test.test_platform.PlatformTest.test_uname_processor @ linux-x86_64 +test.test_platform.PlatformTest.test_uname_replace @ linux-x86_64 +test.test_platform.PlatformTest.test_uname_slices @ linux-x86_64 +test.test_platform.PlatformTest.test_version @ linux-x86_64 +test.test_platform.PlatformTest.test_win32_ver @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_plistlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_plistlib.txt new file mode 100644 index 0000000000..566246ccb4 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_plistlib.txt @@ -0,0 +1,55 @@ +test.test_plistlib.MiscTestCase.test__all__ @ linux-x86_64 +test.test_plistlib.TestBinaryPlistlib.test_cycles @ linux-x86_64 +!test.test_plistlib.TestBinaryPlistlib.test_deep_nesting @ linux-x86_64 +test.test_plistlib.TestBinaryPlistlib.test_dump_duplicates @ linux-x86_64 +test.test_plistlib.TestBinaryPlistlib.test_identity @ linux-x86_64 +test.test_plistlib.TestBinaryPlistlib.test_invalid_binary @ linux-x86_64 +test.test_plistlib.TestBinaryPlistlib.test_large_timestamp @ linux-x86_64 +test.test_plistlib.TestBinaryPlistlib.test_load_int @ linux-x86_64 +test.test_plistlib.TestBinaryPlistlib.test_load_singletons @ linux-x86_64 +test.test_plistlib.TestBinaryPlistlib.test_nonstandard_refs_size @ linux-x86_64 +test.test_plistlib.TestBinaryPlistlib.test_unsupported @ linux-x86_64 +test.test_plistlib.TestKeyedArchive.test_keyed_archive_data @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_appleformatting @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_appleformattingfromliteral @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_bytearray @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_bytes @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_bytesio @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_controlcharacters @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_create @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_dict_members @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_dump_invalid_format @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_indentation_array @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_indentation_dict @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_indentation_dict_mix @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_int @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_integer_notations @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_invalid_type @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_invalid_uid @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_invalidarray @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_invaliddict @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_invalidinteger @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_invalidreal @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_io @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_keys_no_string @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_keysort @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_keysort_bytesio @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_list_members @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_load_invalid_file @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_lone_surrogates @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_modified_uid_huge @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_modified_uid_negative @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_non_bmp_characters @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_nondictroot @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_skipkeys @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_tuple_members @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_uid @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_uid_copy @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_uid_data @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_uid_eq @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_uid_hash @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_uid_index @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_uid_pickle @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_uid_repr @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_xml_encodings @ linux-x86_64 +test.test_plistlib.TestPlistlib.test_xml_plist_with_entity_decl @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_popen.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_popen.txt new file mode 100644 index 0000000000..fde6cabdb8 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_popen.txt @@ -0,0 +1,5 @@ +test.test_popen.PopenTest.test_contextmanager @ linux-x86_64 +test.test_popen.PopenTest.test_iterating @ linux-x86_64 +test.test_popen.PopenTest.test_keywords @ linux-x86_64 +test.test_popen.PopenTest.test_popen @ linux-x86_64 +test.test_popen.PopenTest.test_return_code @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_poplib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_poplib.txt new file mode 100644 index 0000000000..732806d516 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_poplib.txt @@ -0,0 +1,70 @@ +test.test_poplib.TestPOP3Class.test_apop_REDOS @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_apop_normal @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_capa @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_dele @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_exceptions @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_getwelcome @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_list @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_noop @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_pass_ @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_quit @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_retr @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_rpop @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_stat @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_stls @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_stls_capa @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_too_long_lines @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_top @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_uidl @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_user @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_utf8 @ linux-x86_64 +test.test_poplib.TestPOP3Class.test_utf8_raises_if_unsupported @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test__all__ @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_apop_REDOS @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_apop_normal @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_capa @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_context @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_dele @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_exceptions @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_getwelcome @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_list @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_noop @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_pass_ @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_quit @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_retr @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_rpop @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_stat @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_stls @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_stls_capa @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_stls_context @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_too_long_lines @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_top @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_uidl @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_user @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_utf8 @ linux-x86_64 +test.test_poplib.TestPOP3_SSLClass.test_utf8_raises_if_unsupported @ linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_apop_REDOS @ linux-x86_64 +!test.test_poplib.TestPOP3_TLSClass.test_apop_normal @ linux-x86_64 +!test.test_poplib.TestPOP3_TLSClass.test_capa @ linux-x86_64 +!test.test_poplib.TestPOP3_TLSClass.test_dele @ linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_exceptions @ linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_getwelcome @ linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_list @ linux-x86_64 +!test.test_poplib.TestPOP3_TLSClass.test_noop @ linux-x86_64 +!test.test_poplib.TestPOP3_TLSClass.test_pass_ @ linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_quit @ linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_retr @ linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_rpop @ linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_stat @ linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_stls @ linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_stls_capa @ linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_stls_context @ linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_too_long_lines @ linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_top @ linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_uidl @ linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_user @ linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_utf8 @ linux-x86_64 +test.test_poplib.TestPOP3_TLSClass.test_utf8_raises_if_unsupported @ linux-x86_64 +test.test_poplib.TestTimeouts.testTimeoutDefault @ linux-x86_64 +test.test_poplib.TestTimeouts.testTimeoutNone @ linux-x86_64 +test.test_poplib.TestTimeouts.testTimeoutValue @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_positional_only_arg.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_positional_only_arg.txt new file mode 100644 index 0000000000..842ab43eaa --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_positional_only_arg.txt @@ -0,0 +1,26 @@ +test.test_positional_only_arg.PositionalOnlyTestCase.test_annotations_in_closures @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_change_default_pos_only @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_closures @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_generator @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_invalid_syntax_errors @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_invalid_syntax_errors_async @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_invalid_syntax_lambda @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_lambdas @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_mangling @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_module_function @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_no_standard_args_usage @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_optional_positional_only_args @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_pos_only_call_via_unpacking @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_pos_only_definition @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_positional_only_and_arg_invalid_calls @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_positional_only_and_kwonlyargs_invalid_calls @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_positional_only_and_optional_arg_invalid_calls @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_positional_only_invalid_calls @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_positional_only_with_optional_invalid_calls @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_posonly_methods @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_same_keyword_as_positional_with_kwargs @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_serialization @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_super @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_syntax_for_many_positional_only @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_too_many_arguments @ linux-x86_64 +test.test_positional_only_arg.PositionalOnlyTestCase.test_use_positional_as_keyword @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_posix.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_posix.txt new file mode 100644 index 0000000000..9c175e9b1e --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_posix.txt @@ -0,0 +1,45 @@ +test.test_posix.PosixTester.testNoArgFunctions @ linux-x86_64 +test.test_posix.PosixTester.test_access @ linux-x86_64 +test.test_posix.PosixTester.test_chdir @ linux-x86_64 +test.test_posix.PosixTester.test_chown @ linux-x86_64 +test.test_posix.PosixTester.test_dup @ linux-x86_64 +test.test_posix.PosixTester.test_dup2 @ linux-x86_64 +test.test_posix.PosixTester.test_environ @ linux-x86_64 +test.test_posix.PosixTester.test_fchown @ linux-x86_64 +test.test_posix.PosixTester.test_fs_holes @ linux-x86_64 +test.test_posix.PosixTester.test_fstat @ linux-x86_64 +test.test_posix.PosixTester.test_fstatvfs @ linux-x86_64 +test.test_posix.PosixTester.test_ftruncate @ linux-x86_64 +test.test_posix.PosixTester.test_getcwd_long_pathnames @ linux-x86_64 +test.test_posix.PosixTester.test_getgroups @ linux-x86_64 +test.test_posix.PosixTester.test_lchown @ linux-x86_64 +test.test_posix.PosixTester.test_listdir @ linux-x86_64 +test.test_posix.PosixTester.test_listdir_bytes @ linux-x86_64 +test.test_posix.PosixTester.test_listdir_bytes_like @ linux-x86_64 +test.test_posix.PosixTester.test_listdir_default @ linux-x86_64 +test.test_posix.PosixTester.test_listdir_fd @ linux-x86_64 +test.test_posix.PosixTester.test_oscloexec @ linux-x86_64 +test.test_posix.PosixTester.test_path_error2 @ linux-x86_64 +test.test_posix.PosixTester.test_path_with_null_byte @ linux-x86_64 +test.test_posix.PosixTester.test_path_with_null_character @ linux-x86_64 +test.test_posix.PosixTester.test_pipe @ linux-x86_64 +test.test_posix.PosixTester.test_putenv @ linux-x86_64 +test.test_posix.PosixTester.test_rtld_constants @ linux-x86_64 +test.test_posix.PosixTester.test_stat @ linux-x86_64 +test.test_posix.PosixTester.test_statvfs @ linux-x86_64 +test.test_posix.PosixTester.test_strerror @ linux-x86_64 +test.test_posix.PosixTester.test_truncate @ linux-x86_64 +test.test_posix.PosixTester.test_umask @ linux-x86_64 +test.test_posix.PosixTester.test_utime @ linux-x86_64 +test.test_posix.PosixTester.test_utime_nofollow_symlinks @ linux-x86_64 +test.test_posix.PosixTester.test_utime_with_fd @ linux-x86_64 +test.test_posix.TestPosixDirFd.test_access_dir_fd @ linux-x86_64 +test.test_posix.TestPosixDirFd.test_chmod_dir_fd @ linux-x86_64 +test.test_posix.TestPosixDirFd.test_mkdir_dir_fd @ linux-x86_64 +test.test_posix.TestPosixDirFd.test_open_dir_fd @ linux-x86_64 +test.test_posix.TestPosixDirFd.test_readlink_dir_fd @ linux-x86_64 +test.test_posix.TestPosixDirFd.test_rename_dir_fd @ linux-x86_64 +test.test_posix.TestPosixDirFd.test_stat_dir_fd @ linux-x86_64 +test.test_posix.TestPosixDirFd.test_symlink_dir_fd @ linux-x86_64 +test.test_posix.TestPosixDirFd.test_unlink_dir_fd @ linux-x86_64 +test.test_posix.TestPosixDirFd.test_utime_dir_fd @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_posixpath.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_posixpath.txt new file mode 100644 index 0000000000..5b60611c71 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_posixpath.txt @@ -0,0 +1,77 @@ +test.test_posixpath.PathLikeTests.test_path_abspath @ linux-x86_64 +test.test_posixpath.PathLikeTests.test_path_basename @ linux-x86_64 +test.test_posixpath.PathLikeTests.test_path_commonpath @ linux-x86_64 +test.test_posixpath.PathLikeTests.test_path_dirname @ linux-x86_64 +test.test_posixpath.PathLikeTests.test_path_expanduser @ linux-x86_64 +test.test_posixpath.PathLikeTests.test_path_expandvars @ linux-x86_64 +test.test_posixpath.PathLikeTests.test_path_isabs @ linux-x86_64 +test.test_posixpath.PathLikeTests.test_path_islink @ linux-x86_64 +test.test_posixpath.PathLikeTests.test_path_ismount @ linux-x86_64 +test.test_posixpath.PathLikeTests.test_path_join @ linux-x86_64 +test.test_posixpath.PathLikeTests.test_path_lexists @ linux-x86_64 +test.test_posixpath.PathLikeTests.test_path_normcase @ linux-x86_64 +test.test_posixpath.PathLikeTests.test_path_normpath @ linux-x86_64 +test.test_posixpath.PathLikeTests.test_path_realpath @ linux-x86_64 +test.test_posixpath.PathLikeTests.test_path_relpath @ linux-x86_64 +test.test_posixpath.PathLikeTests.test_path_split @ linux-x86_64 +test.test_posixpath.PathLikeTests.test_path_splitdrive @ linux-x86_64 +test.test_posixpath.PathLikeTests.test_path_splitext @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_abspath @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_abspath_issue3426 @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_commonprefix @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_exists @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_exists_fd @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_expandvars @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_expandvars_nonascii @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_filetime @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_getsize @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_import @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_isdir @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_isfile @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_join_errors @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_no_argument @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_nonascii_abspath @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_normcase @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_normpath_issue106242 @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_normpath_issue5827 @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_realpath @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_relpath_errors @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_samefile @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_samefile_on_link @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_samefile_on_symlink @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_sameopenfile @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_samestat @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_samestat_on_link @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_samestat_on_symlink @ linux-x86_64 +test.test_posixpath.PosixCommonTest.test_splitdrive @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_basename @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_commonpath @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_dirname @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_expanduser @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_expanduser_home_envvar @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_expanduser_pwd @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_isabs @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_islink @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_ismount @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_ismount_different_device @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_ismount_directory_not_readable @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_ismount_non_existent @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_ismount_symlinks @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_join @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_normpath @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_basic @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_curdir @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_deep_recursion @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_pardir @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_relative @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_repeated_indirect_symlinks @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_resolve_before_normalizing @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_resolve_first @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_resolve_parents @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_strict @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_symlink_loops @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_realpath_symlink_loops_strict @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_relpath @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_relpath_bytes @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_split @ linux-x86_64 +test.test_posixpath.PosixPathTest.test_splitext @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pow.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pow.txt new file mode 100644 index 0000000000..e94e243600 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pow.txt @@ -0,0 +1,7 @@ +test.test_pow.PowTest.test_big_exp @ linux-x86_64 +test.test_pow.PowTest.test_bug643260 @ linux-x86_64 +test.test_pow.PowTest.test_bug705231 @ linux-x86_64 +test.test_pow.PowTest.test_negative_exponent @ linux-x86_64 +test.test_pow.PowTest.test_other @ linux-x86_64 +test.test_pow.PowTest.test_powfloat @ linux-x86_64 +test.test_pow.PowTest.test_powint @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pprint.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pprint.txt new file mode 100644 index 0000000000..aa094ccf63 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pprint.txt @@ -0,0 +1,43 @@ +test.test_pprint.QueryTestCase.test_basic @ linux-x86_64 +test.test_pprint.QueryTestCase.test_basic_line_wrap @ linux-x86_64 +test.test_pprint.QueryTestCase.test_bytearray_wrap @ linux-x86_64 +test.test_pprint.QueryTestCase.test_bytes_wrap @ linux-x86_64 +test.test_pprint.QueryTestCase.test_chainmap @ linux-x86_64 +test.test_pprint.QueryTestCase.test_compact @ linux-x86_64 +test.test_pprint.QueryTestCase.test_compact_width @ linux-x86_64 +test.test_pprint.QueryTestCase.test_container_repr_override_called @ linux-x86_64 +test.test_pprint.QueryTestCase.test_counter @ linux-x86_64 +test.test_pprint.QueryTestCase.test_cyclic_dataclass @ linux-x86_64 +test.test_pprint.QueryTestCase.test_dataclass_no_repr @ linux-x86_64 +test.test_pprint.QueryTestCase.test_dataclass_with_repr @ linux-x86_64 +test.test_pprint.QueryTestCase.test_default_dict @ linux-x86_64 +test.test_pprint.QueryTestCase.test_depth @ linux-x86_64 +test.test_pprint.QueryTestCase.test_deque @ linux-x86_64 +test.test_pprint.QueryTestCase.test_empty_dataclass @ linux-x86_64 +test.test_pprint.QueryTestCase.test_empty_simple_namespace @ linux-x86_64 +test.test_pprint.QueryTestCase.test_init @ linux-x86_64 +test.test_pprint.QueryTestCase.test_integer @ linux-x86_64 +test.test_pprint.QueryTestCase.test_knotted @ linux-x86_64 +test.test_pprint.QueryTestCase.test_larger_dataclass @ linux-x86_64 +test.test_pprint.QueryTestCase.test_mapping_proxy @ linux-x86_64 +test.test_pprint.QueryTestCase.test_nested_indentations @ linux-x86_64 +test.test_pprint.QueryTestCase.test_ordered_dict @ linux-x86_64 +test.test_pprint.QueryTestCase.test_recursive_dataclass @ linux-x86_64 +test.test_pprint.QueryTestCase.test_same_as_repr @ linux-x86_64 +test.test_pprint.QueryTestCase.test_set_reprs @ linux-x86_64 +test.test_pprint.QueryTestCase.test_simple_namespace @ linux-x86_64 +test.test_pprint.QueryTestCase.test_simple_namespace_subclass @ linux-x86_64 +test.test_pprint.QueryTestCase.test_small_dataclass @ linux-x86_64 +test.test_pprint.QueryTestCase.test_small_simple_namespace @ linux-x86_64 +test.test_pprint.QueryTestCase.test_sort_dict @ linux-x86_64 +test.test_pprint.QueryTestCase.test_sort_orderable_and_unorderable_values @ linux-x86_64 +test.test_pprint.QueryTestCase.test_sort_unorderable_values @ linux-x86_64 +test.test_pprint.QueryTestCase.test_sorted_dict @ linux-x86_64 +test.test_pprint.QueryTestCase.test_stdout_is_None @ linux-x86_64 +test.test_pprint.QueryTestCase.test_str_wrap @ linux-x86_64 +test.test_pprint.QueryTestCase.test_subclassing @ linux-x86_64 +test.test_pprint.QueryTestCase.test_unreadable @ linux-x86_64 +test.test_pprint.QueryTestCase.test_user_dict @ linux-x86_64 +test.test_pprint.QueryTestCase.test_user_list @ linux-x86_64 +test.test_pprint.QueryTestCase.test_user_string @ linux-x86_64 +test.test_pprint.QueryTestCase.test_width @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_print.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_print.txt new file mode 100644 index 0000000000..2b1cdf08a9 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_print.txt @@ -0,0 +1,9 @@ +test.test_print.TestPrint.test_print @ linux-x86_64 +test.test_print.TestPrint.test_print_flush @ linux-x86_64 +test.test_print.TestPy2MigrationHint.test_normal_string @ linux-x86_64 +test.test_print.TestPy2MigrationHint.test_stream_redirection_hint_for_py2_migration @ linux-x86_64 +test.test_print.TestPy2MigrationHint.test_string_in_loop_on_same_line @ linux-x86_64 +test.test_print.TestPy2MigrationHint.test_string_with_excessive_whitespace @ linux-x86_64 +test.test_print.TestPy2MigrationHint.test_string_with_leading_whitespace @ linux-x86_64 +test.test_print.TestPy2MigrationHint.test_string_with_semicolon @ linux-x86_64 +test.test_print.TestPy2MigrationHint.test_string_with_soft_space @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_profile.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_profile.txt new file mode 100644 index 0000000000..8e9d7009ce --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_profile.txt @@ -0,0 +1,4 @@ +test.test_profile.ProfileTest.test_output_file_when_changing_directory @ linux-x86_64 +test.test_profile.ProfileTest.test_run @ linux-x86_64 +test.test_profile.ProfileTest.test_run_profile_as_module @ linux-x86_64 +test.test_profile.ProfileTest.test_runctx @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_property.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_property.txt new file mode 100644 index 0000000000..3ac5d5740a --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_property.txt @@ -0,0 +1,21 @@ +test.test_property.PropertySubclassTests.test_docstring_copy @ linux-x86_64 +test.test_property.PropertySubclassTests.test_property_new_getter_new_docstring @ linux-x86_64 +test.test_property.PropertySubclassTests.test_property_setter_copies_getter_docstring @ linux-x86_64 +test.test_property.PropertySubclassTests.test_slots_docstring_copy_exception @ linux-x86_64 +test.test_property.PropertyTests.test_property___isabstractmethod__descriptor @ linux-x86_64 +test.test_property.PropertyTests.test_property_builtin_doc_writable @ linux-x86_64 +test.test_property.PropertyTests.test_property_decorator_baseclass @ linux-x86_64 +test.test_property.PropertyTests.test_property_decorator_baseclass_doc @ linux-x86_64 +test.test_property.PropertyTests.test_property_decorator_doc @ linux-x86_64 +test.test_property.PropertyTests.test_property_decorator_doc_writable @ linux-x86_64 +test.test_property.PropertyTests.test_property_decorator_subclass @ linux-x86_64 +test.test_property.PropertyTests.test_property_decorator_subclass_doc @ linux-x86_64 +test.test_property.PropertyTests.test_property_getter_doc_override @ linux-x86_64 +test.test_property.PropertyTests.test_property_set_name_incorrect_args @ linux-x86_64 +test.test_property.PropertyTests.test_property_setname_on_property_subclass @ linux-x86_64 +test.test_property.PropertyUnreachableAttributeNoName.test_del_property @ linux-x86_64 +test.test_property.PropertyUnreachableAttributeNoName.test_get_property @ linux-x86_64 +test.test_property.PropertyUnreachableAttributeNoName.test_set_property @ linux-x86_64 +test.test_property.PropertyUnreachableAttributeWithName.test_del_property @ linux-x86_64 +test.test_property.PropertyUnreachableAttributeWithName.test_get_property @ linux-x86_64 +test.test_property.PropertyUnreachableAttributeWithName.test_set_property @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pstats.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pstats.txt new file mode 100644 index 0000000000..c27c49eb23 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pstats.txt @@ -0,0 +1,8 @@ +test.test_pstats.AddCallersTestCase.test_combine_results @ linux-x86_64 +test.test_pstats.StatsTestCase.test_SortKey_enum @ linux-x86_64 +test.test_pstats.StatsTestCase.test_add @ linux-x86_64 +test.test_pstats.StatsTestCase.test_sort_starts_mix @ linux-x86_64 +test.test_pstats.StatsTestCase.test_sort_stats_enum @ linux-x86_64 +test.test_pstats.StatsTestCase.test_sort_stats_int @ linux-x86_64 +test.test_pstats.StatsTestCase.test_sort_stats_partial @ linux-x86_64 +test.test_pstats.StatsTestCase.test_sort_stats_string @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pty.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pty.txt new file mode 100644 index 0000000000..e69c02a69e --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pty.txt @@ -0,0 +1,4 @@ +test.test_pty.PtyTest.test_master_read @ linux-x86_64 +test.test_pty.PtyTest.test_openpty @ linux-x86_64 +test.test_pty.SmallPtyTests.test__copy_to_each @ linux-x86_64 +test.test_pty.SmallPtyTests.test__restore_tty_mode_normal_return @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pulldom.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pulldom.txt new file mode 100644 index 0000000000..ebcfcbe615 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pulldom.txt @@ -0,0 +1,11 @@ +test.test_pulldom.PullDOMTestCase.test_comment @ linux-x86_64 +test.test_pulldom.PullDOMTestCase.test_end_document @ linux-x86_64 +test.test_pulldom.PullDOMTestCase.test_expandItem @ linux-x86_64 +test.test_pulldom.PullDOMTestCase.test_external_ges_default @ linux-x86_64 +test.test_pulldom.PullDOMTestCase.test_parse @ linux-x86_64 +test.test_pulldom.PullDOMTestCase.test_parse_semantics @ linux-x86_64 +test.test_pulldom.SAX2DOMTestCase.testSAX2DOM @ linux-x86_64 +test.test_pulldom.SAX2DOMTestCase.test_basic @ linux-x86_64 +test.test_pulldom.ThoroughTestCase.test_sax2dom_fail @ linux-x86_64 +test.test_pulldom.ThoroughTestCase.test_thorough_parse @ linux-x86_64 +test.test_pulldom.ThoroughTestCase.test_thorough_sax2dom @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pwd.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pwd.txt new file mode 100644 index 0000000000..2350c4121e --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pwd.txt @@ -0,0 +1,3 @@ +test.test_pwd.PwdTest.test_errors @ linux-x86_64 +test.test_pwd.PwdTest.test_values @ linux-x86_64 +test.test_pwd.PwdTest.test_values_extended @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_py_compile.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_py_compile.txt new file mode 100644 index 0000000000..c1ca96f9c9 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_py_compile.txt @@ -0,0 +1,32 @@ +test.test_py_compile.PyCompileCLITestCase.test_bad_syntax @ linux-x86_64 +test.test_py_compile.PyCompileCLITestCase.test_bad_syntax_with_quiet @ linux-x86_64 +test.test_py_compile.PyCompileCLITestCase.test_file_not_exists @ linux-x86_64 +test.test_py_compile.PyCompileCLITestCase.test_file_not_exists_with_quiet @ linux-x86_64 +test.test_py_compile.PyCompileCLITestCase.test_stdin @ linux-x86_64 +test.test_py_compile.PyCompileCLITestCase.test_with_files @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_absolute_path @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_bad_coding @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_cache_path @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_cwd @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_do_not_overwrite_nonregular_files @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_do_not_overwrite_symlinks @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_double_dot_no_clobber @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_exceptions_propagate @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_invalidation_mode @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_optimization_path @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_quiet @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_relative_path @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithSourceEpoch.test_source_date_epoch @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_absolute_path @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_bad_coding @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_cache_path @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_cwd @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_do_not_overwrite_nonregular_files @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_do_not_overwrite_symlinks @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_double_dot_no_clobber @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_exceptions_propagate @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_invalidation_mode @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_optimization_path @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_quiet @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_relative_path @ linux-x86_64 +test.test_py_compile.PyCompileTestsWithoutSourceEpoch.test_source_date_epoch @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pyclbr.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pyclbr.txt new file mode 100644 index 0000000000..6ea16c12bb --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pyclbr.txt @@ -0,0 +1,6 @@ +test.test_pyclbr.PyclbrTest.test_decorators @ linux-x86_64 +test.test_pyclbr.PyclbrTest.test_easy @ linux-x86_64 +test.test_pyclbr.PyclbrTest.test_nested @ linux-x86_64 +test.test_pyclbr.PyclbrTest.test_others @ linux-x86_64 +test.test_pyclbr.ReadmoduleTests.test_dotted_name_not_a_package @ linux-x86_64 +test.test_pyclbr.ReadmoduleTests.test_module_has_no_spec @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pydoc.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pydoc.txt new file mode 100644 index 0000000000..a19b686d77 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pydoc.txt @@ -0,0 +1,68 @@ +test.test_pydoc.PydocDocTest.test__future__imports @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_allmethods @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_builtin_no_child @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_builtin_on_metaclasses @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_builtin_with_child @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_builtin_with_grandchild @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_builtin_with_more_than_four_children @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_fail_help_cli @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_fail_help_output_redirect @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_getpager_with_stdin_none @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_input_strip @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_is_package_when_is_package @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_is_package_when_not_package @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_issue8225 @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_mixed_case_module_names_are_lower_cased @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_namedtuple_fields @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_namedtuple_public_underscore @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_non_str_name @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_not_ascii @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_not_here @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_splitdoc_with_description @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_stripid @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_synopsis @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_synopsis_sourceless @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_synopsis_sourceless_empty_doc @ linux-x86_64 +test.test_pydoc.PydocDocTest.test_text_enum_member_with_value_zero @ linux-x86_64 +test.test_pydoc.PydocImportTest.test_apropos_empty_doc @ linux-x86_64 +test.test_pydoc.PydocImportTest.test_apropos_with_bad_package @ linux-x86_64 +test.test_pydoc.PydocImportTest.test_apropos_with_unreadable_dir @ linux-x86_64 +test.test_pydoc.PydocImportTest.test_badimport @ linux-x86_64 +test.test_pydoc.PydocImportTest.test_importfile @ linux-x86_64 +test.test_pydoc.PydocImportTest.test_url_search_package_error @ linux-x86_64 +test.test_pydoc.PydocServerTest.test_server @ linux-x86_64 +test.test_pydoc.PydocUrlHandlerTest.test_content_type_err @ linux-x86_64 +test.test_pydoc.PydocUrlHandlerTest.test_url_requests @ linux-x86_64 +test.test_pydoc.PydocWithMetaClasses.test_buggy_dir @ linux-x86_64 +test.test_pydoc.PydocWithMetaClasses.test_resolve_false @ linux-x86_64 +test.test_pydoc.PydocWithMetaClasses.test_virtualClassAttributeWithOneMeta @ linux-x86_64 +test.test_pydoc.PydocWithMetaClasses.test_virtualClassAttributeWithTwoMeta @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_async_annotation @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_async_generator_annotation @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_bound_builtin_method @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_bound_python_method @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_builtin @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_class @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_custom_data_descriptor @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_custom_non_data_descriptor @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_dict_attr_descriptor @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_field_order_for_named_tuples @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_generic_alias @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_getset_descriptor @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_html_for_https_links @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_member_descriptor @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_module @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_namedtuple_field_descriptor @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_property @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_slot_descriptor @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_special_form @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_staticmethod @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_structseq_member_descriptor @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_typing_pydoc @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_unbound_builtin_method @ linux-x86_64 +test.test_pydoc.TestDescriptions.test_unbound_python_method @ linux-x86_64 +test.test_pydoc.TestHelper.test_keywords @ linux-x86_64 +test.test_pydoc.TestInternalUtilities.test_sys_path_adjustment_adds_missing_curdir @ linux-x86_64 +test.test_pydoc.TestInternalUtilities.test_sys_path_adjustment_protects_pydoc_dir @ linux-x86_64 +test.test_pydoc.TestInternalUtilities.test_sys_path_adjustment_removes_argv0_dir @ linux-x86_64 +test.test_pydoc.TestInternalUtilities.test_sys_path_adjustment_when_curdir_already_included @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pyexpat.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pyexpat.txt new file mode 100644 index 0000000000..b7296c43ce --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_pyexpat.txt @@ -0,0 +1,38 @@ +test.test_pyexpat.BufferTextTest.test1 @ linux-x86_64 +test.test_pyexpat.BufferTextTest.test2 @ linux-x86_64 +test.test_pyexpat.BufferTextTest.test3 @ linux-x86_64 +test.test_pyexpat.BufferTextTest.test4 @ linux-x86_64 +test.test_pyexpat.BufferTextTest.test5 @ linux-x86_64 +test.test_pyexpat.BufferTextTest.test6 @ linux-x86_64 +test.test_pyexpat.BufferTextTest.test7 @ linux-x86_64 +test.test_pyexpat.BufferTextTest.test_buffering_enabled @ linux-x86_64 +test.test_pyexpat.BufferTextTest.test_default_to_disabled @ linux-x86_64 +test.test_pyexpat.ChardataBufferTest.test_1000_bytes @ linux-x86_64 +test.test_pyexpat.ChardataBufferTest.test_1025_bytes @ linux-x86_64 +test.test_pyexpat.ChardataBufferTest.test_change_size_1 @ linux-x86_64 +test.test_pyexpat.ChardataBufferTest.test_change_size_2 @ linux-x86_64 +test.test_pyexpat.ChardataBufferTest.test_disabling_buffer @ linux-x86_64 +test.test_pyexpat.ChardataBufferTest.test_unchanged_size @ linux-x86_64 +test.test_pyexpat.ChardataBufferTest.test_wrong_size @ linux-x86_64 +test.test_pyexpat.ErrorMessageTest.test_codes @ linux-x86_64 +test.test_pyexpat.ErrorMessageTest.test_expaterror @ linux-x86_64 +test.test_pyexpat.ForeignDTDTests.test_ignore_use_foreign_dtd @ linux-x86_64 +test.test_pyexpat.ForeignDTDTests.test_use_foreign_dtd @ linux-x86_64 +test.test_pyexpat.InterningTest.test @ linux-x86_64 +test.test_pyexpat.InterningTest.test_issue9402 @ linux-x86_64 +test.test_pyexpat.MalformedInputTest.test1 @ linux-x86_64 +test.test_pyexpat.MalformedInputTest.test2 @ linux-x86_64 +test.test_pyexpat.NamespaceSeparatorTest.test_illegal @ linux-x86_64 +test.test_pyexpat.NamespaceSeparatorTest.test_legal @ linux-x86_64 +test.test_pyexpat.NamespaceSeparatorTest.test_zero_length @ linux-x86_64 +test.test_pyexpat.ParseTest.test_parse_again @ linux-x86_64 +test.test_pyexpat.ParseTest.test_parse_bytes @ linux-x86_64 +test.test_pyexpat.ParseTest.test_parse_file @ linux-x86_64 +test.test_pyexpat.ParseTest.test_parse_str @ linux-x86_64 +test.test_pyexpat.PositionTest.test @ linux-x86_64 +test.test_pyexpat.SetAttributeTest.test_buffer_text @ linux-x86_64 +test.test_pyexpat.SetAttributeTest.test_invalid_attributes @ linux-x86_64 +test.test_pyexpat.SetAttributeTest.test_namespace_prefixes @ linux-x86_64 +test.test_pyexpat.SetAttributeTest.test_ordered_attributes @ linux-x86_64 +test.test_pyexpat.SetAttributeTest.test_specified_attributes @ linux-x86_64 +test.test_pyexpat.sf1296433Test.test_parse_only_xml_data @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_queue.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_queue.txt new file mode 100644 index 0000000000..0c1c8fcfb2 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_queue.txt @@ -0,0 +1,52 @@ +test.test_queue.CFailingQueueTest.test_failing_queue @ linux-x86_64 +test.test_queue.CLifoQueueTest.test_basic @ linux-x86_64 +test.test_queue.CLifoQueueTest.test_negative_timeout_raises_exception @ linux-x86_64 +test.test_queue.CLifoQueueTest.test_nowait @ linux-x86_64 +test.test_queue.CLifoQueueTest.test_queue_join @ linux-x86_64 +test.test_queue.CLifoQueueTest.test_queue_task_done @ linux-x86_64 +test.test_queue.CLifoQueueTest.test_shrinking_queue @ linux-x86_64 +test.test_queue.CPriorityQueueTest.test_basic @ linux-x86_64 +test.test_queue.CPriorityQueueTest.test_negative_timeout_raises_exception @ linux-x86_64 +test.test_queue.CPriorityQueueTest.test_nowait @ linux-x86_64 +test.test_queue.CPriorityQueueTest.test_queue_join @ linux-x86_64 +test.test_queue.CPriorityQueueTest.test_queue_task_done @ linux-x86_64 +test.test_queue.CPriorityQueueTest.test_shrinking_queue @ linux-x86_64 +test.test_queue.CQueueTest.test_basic @ linux-x86_64 +test.test_queue.CQueueTest.test_negative_timeout_raises_exception @ linux-x86_64 +test.test_queue.CQueueTest.test_nowait @ linux-x86_64 +test.test_queue.CQueueTest.test_queue_join @ linux-x86_64 +test.test_queue.CQueueTest.test_queue_task_done @ linux-x86_64 +test.test_queue.CQueueTest.test_shrinking_queue @ linux-x86_64 +test.test_queue.CSimpleQueueTest.test_basic @ linux-x86_64 +test.test_queue.CSimpleQueueTest.test_is_default @ linux-x86_64 +test.test_queue.CSimpleQueueTest.test_many_threads @ linux-x86_64 +test.test_queue.CSimpleQueueTest.test_many_threads_nonblock @ linux-x86_64 +test.test_queue.CSimpleQueueTest.test_many_threads_timeout @ linux-x86_64 +test.test_queue.CSimpleQueueTest.test_negative_timeout_raises_exception @ linux-x86_64 +test.test_queue.CSimpleQueueTest.test_order @ linux-x86_64 +test.test_queue.CSimpleQueueTest.test_reentrancy @ linux-x86_64 +test.test_queue.PyFailingQueueTest.test_failing_queue @ linux-x86_64 +test.test_queue.PyLifoQueueTest.test_basic @ linux-x86_64 +test.test_queue.PyLifoQueueTest.test_negative_timeout_raises_exception @ linux-x86_64 +test.test_queue.PyLifoQueueTest.test_nowait @ linux-x86_64 +test.test_queue.PyLifoQueueTest.test_queue_join @ linux-x86_64 +test.test_queue.PyLifoQueueTest.test_queue_task_done @ linux-x86_64 +test.test_queue.PyLifoQueueTest.test_shrinking_queue @ linux-x86_64 +test.test_queue.PyPriorityQueueTest.test_basic @ linux-x86_64 +test.test_queue.PyPriorityQueueTest.test_negative_timeout_raises_exception @ linux-x86_64 +test.test_queue.PyPriorityQueueTest.test_nowait @ linux-x86_64 +test.test_queue.PyPriorityQueueTest.test_queue_join @ linux-x86_64 +test.test_queue.PyPriorityQueueTest.test_queue_task_done @ linux-x86_64 +test.test_queue.PyPriorityQueueTest.test_shrinking_queue @ linux-x86_64 +test.test_queue.PyQueueTest.test_basic @ linux-x86_64 +test.test_queue.PyQueueTest.test_negative_timeout_raises_exception @ linux-x86_64 +test.test_queue.PyQueueTest.test_nowait @ linux-x86_64 +test.test_queue.PyQueueTest.test_queue_join @ linux-x86_64 +test.test_queue.PyQueueTest.test_queue_task_done @ linux-x86_64 +test.test_queue.PyQueueTest.test_shrinking_queue @ linux-x86_64 +test.test_queue.PySimpleQueueTest.test_basic @ linux-x86_64 +test.test_queue.PySimpleQueueTest.test_many_threads @ linux-x86_64 +test.test_queue.PySimpleQueueTest.test_many_threads_nonblock @ linux-x86_64 +test.test_queue.PySimpleQueueTest.test_many_threads_timeout @ linux-x86_64 +test.test_queue.PySimpleQueueTest.test_negative_timeout_raises_exception @ linux-x86_64 +test.test_queue.PySimpleQueueTest.test_order @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_quopri.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_quopri.txt new file mode 100644 index 0000000000..6333652793 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_quopri.txt @@ -0,0 +1,11 @@ +test.test_quopri.QuopriTestCase.test_decode @ linux-x86_64 +test.test_quopri.QuopriTestCase.test_decode_header @ linux-x86_64 +test.test_quopri.QuopriTestCase.test_decodestring @ linux-x86_64 +test.test_quopri.QuopriTestCase.test_decodestring_double_equals @ linux-x86_64 +test.test_quopri.QuopriTestCase.test_embedded_ws @ linux-x86_64 +test.test_quopri.QuopriTestCase.test_encode @ linux-x86_64 +test.test_quopri.QuopriTestCase.test_encode_header @ linux-x86_64 +test.test_quopri.QuopriTestCase.test_encodestring @ linux-x86_64 +test.test_quopri.QuopriTestCase.test_idempotent_string @ linux-x86_64 +test.test_quopri.QuopriTestCase.test_scriptdecode @ linux-x86_64 +test.test_quopri.QuopriTestCase.test_scriptencode @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_raise.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_raise.txt new file mode 100644 index 0000000000..7fee0280cd --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_raise.txt @@ -0,0 +1,34 @@ +test.test_raise.TestCause.testCauseSyntax @ linux-x86_64 +test.test_raise.TestCause.test_class_cause @ linux-x86_64 +test.test_raise.TestCause.test_erroneous_cause @ linux-x86_64 +test.test_raise.TestCause.test_instance_cause @ linux-x86_64 +test.test_raise.TestCause.test_invalid_cause @ linux-x86_64 +test.test_raise.TestContext.test_3118 @ linux-x86_64 +test.test_raise.TestContext.test_c_exception_context @ linux-x86_64 +test.test_raise.TestContext.test_c_exception_raise @ linux-x86_64 +test.test_raise.TestContext.test_class_context_class_raise @ linux-x86_64 +test.test_raise.TestContext.test_class_context_instance_raise @ linux-x86_64 +test.test_raise.TestContext.test_context_manager @ linux-x86_64 +test.test_raise.TestContext.test_cycle_broken @ linux-x86_64 +test.test_raise.TestContext.test_instance_context_instance_raise @ linux-x86_64 +test.test_raise.TestContext.test_noraise_finally @ linux-x86_64 +test.test_raise.TestContext.test_not_last @ linux-x86_64 +test.test_raise.TestContext.test_raise_finally @ linux-x86_64 +test.test_raise.TestContext.test_reraise_cycle_broken @ linux-x86_64 +test.test_raise.TestRaise.test_assert_with_tuple_arg @ linux-x86_64 +test.test_raise.TestRaise.test_erroneous_exception @ linux-x86_64 +test.test_raise.TestRaise.test_except_reraise @ linux-x86_64 +test.test_raise.TestRaise.test_finally_reraise @ linux-x86_64 +test.test_raise.TestRaise.test_invalid_reraise @ linux-x86_64 +test.test_raise.TestRaise.test_nested_reraise @ linux-x86_64 +test.test_raise.TestRaise.test_new_returns_invalid_instance @ linux-x86_64 +test.test_raise.TestRaise.test_raise_from_None @ linux-x86_64 +test.test_raise.TestRaise.test_reraise @ linux-x86_64 +test.test_raise.TestRaise.test_with_reraise1 @ linux-x86_64 +test.test_raise.TestRaise.test_with_reraise2 @ linux-x86_64 +test.test_raise.TestRemovedFunctionality.test_strings @ linux-x86_64 +test.test_raise.TestRemovedFunctionality.test_tuples @ linux-x86_64 +test.test_raise.TestTraceback.test_accepts_traceback @ linux-x86_64 +test.test_raise.TestTraceback.test_sets_traceback @ linux-x86_64 +test.test_raise.TestTracebackType.test_attrs @ linux-x86_64 +test.test_raise.TestTracebackType.test_constructor @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_random.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_random.txt new file mode 100644 index 0000000000..80ca585573 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_random.txt @@ -0,0 +1,98 @@ +test.test_random.MersenneTwister_TestBasicOps.test_53_bits_per_float @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_autoseed @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_bigrand @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_bigrand_ranges @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_bug_1727780 @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_bug_27706 @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_bug_31478 @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_bug_31482 @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_bug_9025 @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_choice @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_choice_with_numpy @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_choices @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_choices_algorithms @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_choices_infinite_total @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_choices_negative_total @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_choices_subnormal @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_choices_with_all_zero_weights @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_gauss @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_getrandbits @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_guaranteed_stable @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_long_seed @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_mu_sigma_default_args @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_pickling @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_randbelow_logic @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_randbelow_without_getrandbits @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_randbytes @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_randbytes_getrandbits @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_randrange_bug_1590891 @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_randrange_uses_getrandbits @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_rangelimits @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_referenceImplementation @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_sample @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_sample_counts_equivalence @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_sample_distribution @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_sample_inputs @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_sample_on_dicts @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_sample_on_seqsets @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_sample_on_sets @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_sample_with_counts @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_saverestore @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_seed_no_mutate_bug_44018 @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_seed_when_randomness_source_not_found @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_seedargs @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_setstate_first_arg @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_setstate_middle_arg @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_shuffle @ linux-x86_64 +test.test_random.MersenneTwister_TestBasicOps.test_strong_reference_implementation @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_53_bits_per_float @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_autoseed @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_bigrand @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_bigrand_ranges @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_bug_1727780 @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_bug_9025 @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_choice @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_choice_with_numpy @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_choices @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_choices_infinite_total @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_choices_negative_total @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_choices_subnormal @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_choices_with_all_zero_weights @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_gauss @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_getrandbits @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_mu_sigma_default_args @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_pickling @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_randbelow_logic @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_randbytes @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_randrange_argument_handling @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_randrange_errors @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_randrange_nonunit_step @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_randrange_step @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_rangelimits @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_sample @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_sample_distribution @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_sample_inputs @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_sample_on_dicts @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_sample_on_seqsets @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_sample_on_sets @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_sample_with_counts @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_saverestore @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_seed_no_mutate_bug_44018 @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_seed_when_randomness_source_not_found @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_seedargs @ linux-x86_64 +test.test_random.SystemRandom_TestBasicOps.test_shuffle @ linux-x86_64 +test.test_random.TestDistributions.test_avg_std @ linux-x86_64 +test.test_random.TestDistributions.test_betavariate_return_zero @ linux-x86_64 +test.test_random.TestDistributions.test_constant @ linux-x86_64 +test.test_random.TestDistributions.test_gammavariate_alpha_between_zero_and_one @ linux-x86_64 +test.test_random.TestDistributions.test_gammavariate_alpha_equal_one @ linux-x86_64 +test.test_random.TestDistributions.test_gammavariate_alpha_equal_one_equals_expovariate @ linux-x86_64 +test.test_random.TestDistributions.test_gammavariate_alpha_greater_one @ linux-x86_64 +test.test_random.TestDistributions.test_gammavariate_errors @ linux-x86_64 +test.test_random.TestDistributions.test_von_mises_large_kappa @ linux-x86_64 +test.test_random.TestDistributions.test_von_mises_range @ linux-x86_64 +test.test_random.TestDistributions.test_zeroinputs @ linux-x86_64 +test.test_random.TestModule.testMagicConstants @ linux-x86_64 +test.test_random.TestModule.test__all__ @ linux-x86_64 +test.test_random.TestRandomSubclassing.test_random_subclass_with_kwargs @ linux-x86_64 +test.test_random.TestRandomSubclassing.test_subclasses_overriding_methods @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_range.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_range.txt new file mode 100644 index 0000000000..349ae580da --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_range.txt @@ -0,0 +1,25 @@ +test.test_range.RangeTest.test_attributes @ linux-x86_64 +test.test_range.RangeTest.test_comparison @ linux-x86_64 +test.test_range.RangeTest.test_contains @ linux-x86_64 +test.test_range.RangeTest.test_count @ linux-x86_64 +test.test_range.RangeTest.test_empty @ linux-x86_64 +test.test_range.RangeTest.test_exhausted_iterator_pickling @ linux-x86_64 +test.test_range.RangeTest.test_index @ linux-x86_64 +test.test_range.RangeTest.test_invalid_invocation @ linux-x86_64 +test.test_range.RangeTest.test_issue11845 @ linux-x86_64 +test.test_range.RangeTest.test_iterator_pickling @ linux-x86_64 +test.test_range.RangeTest.test_iterator_pickling_overflowing_index @ linux-x86_64 +test.test_range.RangeTest.test_large_exhausted_iterator_pickling @ linux-x86_64 +test.test_range.RangeTest.test_large_operands @ linux-x86_64 +test.test_range.RangeTest.test_large_range @ linux-x86_64 +test.test_range.RangeTest.test_odd_bug @ linux-x86_64 +test.test_range.RangeTest.test_pickling @ linux-x86_64 +test.test_range.RangeTest.test_range @ linux-x86_64 +test.test_range.RangeTest.test_range_iterators @ linux-x86_64 +test.test_range.RangeTest.test_range_iterators_invocation @ linux-x86_64 +test.test_range.RangeTest.test_repr @ linux-x86_64 +test.test_range.RangeTest.test_reverse_iteration @ linux-x86_64 +test.test_range.RangeTest.test_slice @ linux-x86_64 +test.test_range.RangeTest.test_strided_limits @ linux-x86_64 +test.test_range.RangeTest.test_types @ linux-x86_64 +test.test_range.RangeTest.test_user_index_method @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_re.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_re.txt new file mode 100644 index 0000000000..d670732bf2 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_re.txt @@ -0,0 +1,143 @@ +test.test_re.ExternalTests.test_re_benchmarks @ linux-x86_64 +test.test_re.ExternalTests.test_re_tests @ linux-x86_64 +test.test_re.ImplementationTest.test_overlap_table @ linux-x86_64 +test.test_re.ImplementationTest.test_signedness @ linux-x86_64 +test.test_re.PatternReprTests.test_bytes @ linux-x86_64 +test.test_re.PatternReprTests.test_flags_repr @ linux-x86_64 +test.test_re.PatternReprTests.test_inline_flags @ linux-x86_64 +test.test_re.PatternReprTests.test_locale @ linux-x86_64 +test.test_re.PatternReprTests.test_long_pattern @ linux-x86_64 +test.test_re.PatternReprTests.test_multiple_flags @ linux-x86_64 +test.test_re.PatternReprTests.test_quotes @ linux-x86_64 +test.test_re.PatternReprTests.test_single_flag @ linux-x86_64 +test.test_re.PatternReprTests.test_unicode_flag @ linux-x86_64 +test.test_re.PatternReprTests.test_unknown_flags @ linux-x86_64 +test.test_re.PatternReprTests.test_without_flags @ linux-x86_64 +test.test_re.ReTests.test_ASSERT_NOT_mark_bug @ linux-x86_64 +test.test_re.ReTests.test_MARK_PUSH_macro_bug @ linux-x86_64 +test.test_re.ReTests.test_MIN_REPEAT_ONE_mark_bug @ linux-x86_64 +test.test_re.ReTests.test_MIN_UNTIL_mark_bug @ linux-x86_64 +test.test_re.ReTests.test_REPEAT_ONE_mark_bug @ linux-x86_64 +test.test_re.ReTests.test_anyall @ linux-x86_64 +test.test_re.ReTests.test_ascii_and_unicode_flag @ linux-x86_64 +test.test_re.ReTests.test_atomic_grouping @ linux-x86_64 +test.test_re.ReTests.test_backref_group_name_in_exception @ linux-x86_64 +test.test_re.ReTests.test_basic_re_sub @ linux-x86_64 +test.test_re.ReTests.test_big_codesize @ linux-x86_64 +test.test_re.ReTests.test_bigcharset @ linux-x86_64 +test.test_re.ReTests.test_branching @ linux-x86_64 +test.test_re.ReTests.test_bug_113254 @ linux-x86_64 +test.test_re.ReTests.test_bug_114660 @ linux-x86_64 +test.test_re.ReTests.test_bug_117612 @ linux-x86_64 +test.test_re.ReTests.test_bug_1661 @ linux-x86_64 +test.test_re.ReTests.test_bug_16688 @ linux-x86_64 +test.test_re.ReTests.test_bug_20998 @ linux-x86_64 +test.test_re.ReTests.test_bug_2537 @ linux-x86_64 +test.test_re.ReTests.test_bug_29444 @ linux-x86_64 +test.test_re.ReTests.test_bug_34294 @ linux-x86_64 +test.test_re.ReTests.test_bug_3629 @ linux-x86_64 +test.test_re.ReTests.test_bug_418626 @ linux-x86_64 +test.test_re.ReTests.test_bug_448951 @ linux-x86_64 +test.test_re.ReTests.test_bug_449000 @ linux-x86_64 +test.test_re.ReTests.test_bug_449964 @ linux-x86_64 +test.test_re.ReTests.test_bug_527371 @ linux-x86_64 +test.test_re.ReTests.test_bug_581080 @ linux-x86_64 +test.test_re.ReTests.test_bug_612074 @ linux-x86_64 +test.test_re.ReTests.test_bug_6509 @ linux-x86_64 +test.test_re.ReTests.test_bug_6561 @ linux-x86_64 +test.test_re.ReTests.test_bug_725106 @ linux-x86_64 +test.test_re.ReTests.test_bug_725149 @ linux-x86_64 +test.test_re.ReTests.test_bug_764548 @ linux-x86_64 +test.test_re.ReTests.test_bug_817234 @ linux-x86_64 +test.test_re.ReTests.test_bug_926075 @ linux-x86_64 +test.test_re.ReTests.test_bug_931848 @ linux-x86_64 +test.test_re.ReTests.test_bug_gh106052 @ linux-x86_64 +test.test_re.ReTests.test_bug_gh91616 @ linux-x86_64 +test.test_re.ReTests.test_bytes_str_mixing @ linux-x86_64 +test.test_re.ReTests.test_category @ linux-x86_64 +test.test_re.ReTests.test_character_set_errors @ linux-x86_64 +test.test_re.ReTests.test_comments @ linux-x86_64 +test.test_re.ReTests.test_compile @ linux-x86_64 +test.test_re.ReTests.test_constants @ linux-x86_64 +test.test_re.ReTests.test_copying @ linux-x86_64 +test.test_re.ReTests.test_dollar_matches_twice @ linux-x86_64 +test.test_re.ReTests.test_empty_array @ linux-x86_64 +test.test_re.ReTests.test_enum @ linux-x86_64 +test.test_re.ReTests.test_error @ linux-x86_64 +test.test_re.ReTests.test_expand @ linux-x86_64 +test.test_re.ReTests.test_findall_atomic_grouping @ linux-x86_64 +test.test_re.ReTests.test_findall_possessive_quantifiers @ linux-x86_64 +test.test_re.ReTests.test_finditer @ linux-x86_64 +test.test_re.ReTests.test_flags @ linux-x86_64 +test.test_re.ReTests.test_fullmatch_atomic_grouping @ linux-x86_64 +test.test_re.ReTests.test_fullmatch_possessive_quantifiers @ linux-x86_64 +test.test_re.ReTests.test_getattr @ linux-x86_64 +test.test_re.ReTests.test_group @ linux-x86_64 +test.test_re.ReTests.test_group_name_in_exception @ linux-x86_64 +test.test_re.ReTests.test_groupdict @ linux-x86_64 +test.test_re.ReTests.test_ignore_case @ linux-x86_64 +test.test_re.ReTests.test_ignore_case_range @ linux-x86_64 +test.test_re.ReTests.test_ignore_case_set @ linux-x86_64 +test.test_re.ReTests.test_ignore_spaces @ linux-x86_64 +test.test_re.ReTests.test_inline_flags @ linux-x86_64 +test.test_re.ReTests.test_issue17998 @ linux-x86_64 +test.test_re.ReTests.test_keyword_parameters @ linux-x86_64 +test.test_re.ReTests.test_large_search @ linux-x86_64 +test.test_re.ReTests.test_large_subn @ linux-x86_64 +test.test_re.ReTests.test_locale_flag @ linux-x86_64 +test.test_re.ReTests.test_lookahead @ linux-x86_64 +test.test_re.ReTests.test_lookbehind @ linux-x86_64 +test.test_re.ReTests.test_match_getitem @ linux-x86_64 +test.test_re.ReTests.test_match_repr @ linux-x86_64 +test.test_re.ReTests.test_misc_errors @ linux-x86_64 +test.test_re.ReTests.test_multiple_repeat @ linux-x86_64 +test.test_re.ReTests.test_named_unicode_escapes @ linux-x86_64 +test.test_re.ReTests.test_not_literal @ linux-x86_64 +test.test_re.ReTests.test_nothing_to_repeat @ linux-x86_64 +test.test_re.ReTests.test_other_escapes @ linux-x86_64 +test.test_re.ReTests.test_pattern_compare @ linux-x86_64 +test.test_re.ReTests.test_pattern_compare_bytes @ linux-x86_64 +test.test_re.ReTests.test_pickling @ linux-x86_64 +test.test_re.ReTests.test_possessive_quantifiers @ linux-x86_64 +test.test_re.ReTests.test_possible_set_operations @ linux-x86_64 +test.test_re.ReTests.test_qualified_re_split @ linux-x86_64 +test.test_re.ReTests.test_qualified_re_sub @ linux-x86_64 +test.test_re.ReTests.test_re_escape @ linux-x86_64 +test.test_re.ReTests.test_re_escape_bytes @ linux-x86_64 +test.test_re.ReTests.test_re_escape_non_ascii @ linux-x86_64 +test.test_re.ReTests.test_re_escape_non_ascii_bytes @ linux-x86_64 +test.test_re.ReTests.test_re_findall @ linux-x86_64 +test.test_re.ReTests.test_re_fullmatch @ linux-x86_64 +test.test_re.ReTests.test_re_groupref @ linux-x86_64 +test.test_re.ReTests.test_re_groupref_exists @ linux-x86_64 +test.test_re.ReTests.test_re_groupref_exists_errors @ linux-x86_64 +test.test_re.ReTests.test_re_groupref_exists_validation_bug @ linux-x86_64 +test.test_re.ReTests.test_re_groupref_overflow @ linux-x86_64 +test.test_re.ReTests.test_re_match @ linux-x86_64 +test.test_re.ReTests.test_re_split @ linux-x86_64 +test.test_re.ReTests.test_re_subn @ linux-x86_64 +test.test_re.ReTests.test_regression_gh94675 @ linux-x86_64 +test.test_re.ReTests.test_repeat_minmax @ linux-x86_64 +test.test_re.ReTests.test_repeat_minmax_overflow @ linux-x86_64 +test.test_re.ReTests.test_scanner @ linux-x86_64 +test.test_re.ReTests.test_scoped_flags @ linux-x86_64 +test.test_re.ReTests.test_search_anchor_at_beginning @ linux-x86_64 +test.test_re.ReTests.test_search_coverage @ linux-x86_64 +test.test_re.ReTests.test_search_dot_unicode @ linux-x86_64 +test.test_re.ReTests.test_search_star_plus @ linux-x86_64 +test.test_re.ReTests.test_special_escapes @ linux-x86_64 +test.test_re.ReTests.test_sre_byte_class_literals @ linux-x86_64 +test.test_re.ReTests.test_sre_byte_literals @ linux-x86_64 +test.test_re.ReTests.test_sre_character_class_literals @ linux-x86_64 +test.test_re.ReTests.test_sre_character_literals @ linux-x86_64 +test.test_re.ReTests.test_stack_overflow @ linux-x86_64 +test.test_re.ReTests.test_string_boundaries @ linux-x86_64 +test.test_re.ReTests.test_sub_template_numeric_escape @ linux-x86_64 +test.test_re.ReTests.test_symbolic_groups @ linux-x86_64 +test.test_re.ReTests.test_symbolic_groups_errors @ linux-x86_64 +test.test_re.ReTests.test_symbolic_refs @ linux-x86_64 +test.test_re.ReTests.test_symbolic_refs_errors @ linux-x86_64 +test.test_re.ReTests.test_template_function_and_flag_is_deprecated @ linux-x86_64 +test.test_re.ReTests.test_unlimited_zero_width_repeat @ linux-x86_64 +test.test_re.ReTests.test_weakref @ linux-x86_64 +test.test_re.ReTests.test_zerowidth @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_reprlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_reprlib.txt new file mode 100644 index 0000000000..4904ac5122 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_reprlib.txt @@ -0,0 +1,20 @@ +test.test_reprlib.LongReprTest.test_class @ linux-x86_64 +test.test_reprlib.LongReprTest.test_instance @ linux-x86_64 +test.test_reprlib.LongReprTest.test_method @ linux-x86_64 +test.test_reprlib.LongReprTest.test_module @ linux-x86_64 +test.test_reprlib.LongReprTest.test_type @ linux-x86_64 +test.test_reprlib.ReprTests.test_builtin_function @ linux-x86_64 +test.test_reprlib.ReprTests.test_cell @ linux-x86_64 +test.test_reprlib.ReprTests.test_container @ linux-x86_64 +test.test_reprlib.ReprTests.test_descriptors @ linux-x86_64 +test.test_reprlib.ReprTests.test_frozenset @ linux-x86_64 +test.test_reprlib.ReprTests.test_instance @ linux-x86_64 +test.test_reprlib.ReprTests.test_nesting @ linux-x86_64 +test.test_reprlib.ReprTests.test_numbers @ linux-x86_64 +test.test_reprlib.ReprTests.test_range @ linux-x86_64 +test.test_reprlib.ReprTests.test_set_literal @ linux-x86_64 +test.test_reprlib.ReprTests.test_string @ linux-x86_64 +test.test_reprlib.ReprTests.test_tuple @ linux-x86_64 +test.test_reprlib.ReprTests.test_unsortable @ linux-x86_64 +test.test_reprlib.TestRecursiveRepr.test_assigned_attributes @ linux-x86_64 +test.test_reprlib.TestRecursiveRepr.test_recursive_repr @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_resource.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_resource.txt new file mode 100644 index 0000000000..3e0d697fed --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_resource.txt @@ -0,0 +1,4 @@ +test.test_resource.ResourceTest.test_freebsd_contants @ linux-x86_64 +test.test_resource.ResourceTest.test_getrusage @ linux-x86_64 +test.test_resource.ResourceTest.test_linux_constants @ linux-x86_64 +test.test_resource.ResourceTest.test_pagesize @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_richcmp.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_richcmp.txt new file mode 100644 index 0000000000..49ac537d10 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_richcmp.txt @@ -0,0 +1,11 @@ +test.test_richcmp.DictTest.test_dicts @ linux-x86_64 +test.test_richcmp.ListTest.test_badentry @ linux-x86_64 +test.test_richcmp.ListTest.test_coverage @ linux-x86_64 +test.test_richcmp.ListTest.test_goodentry @ linux-x86_64 +test.test_richcmp.MiscTest.test_exception_message @ linux-x86_64 +test.test_richcmp.MiscTest.test_misbehavin @ linux-x86_64 +test.test_richcmp.MiscTest.test_not @ linux-x86_64 +test.test_richcmp.MiscTest.test_recursion @ linux-x86_64 +test.test_richcmp.NumberTest.test_basic @ linux-x86_64 +test.test_richcmp.NumberTest.test_values @ linux-x86_64 +test.test_richcmp.VectorTest.test_mixed @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_rlcompleter.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_rlcompleter.txt new file mode 100644 index 0000000000..2302309974 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_rlcompleter.txt @@ -0,0 +1,7 @@ +test.test_rlcompleter.TestRlcompleter.test_complete @ linux-x86_64 +test.test_rlcompleter.TestRlcompleter.test_duplicate_globals @ linux-x86_64 +test.test_rlcompleter.TestRlcompleter.test_excessive_getattr @ linux-x86_64 +test.test_rlcompleter.TestRlcompleter.test_global_matches @ linux-x86_64 +test.test_rlcompleter.TestRlcompleter.test_namespace @ linux-x86_64 +test.test_rlcompleter.TestRlcompleter.test_property_method_not_called @ linux-x86_64 +test.test_rlcompleter.TestRlcompleter.test_uncreated_attr @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_robotparser.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_robotparser.txt new file mode 100644 index 0000000000..a4258f35d0 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_robotparser.txt @@ -0,0 +1,63 @@ +test.test_robotparser.AnotherInvalidRequestRateTest.test_bad_urls @ linux-x86_64 +test.test_robotparser.AnotherInvalidRequestRateTest.test_good_urls @ linux-x86_64 +test.test_robotparser.AnotherInvalidRequestRateTest.test_site_maps @ linux-x86_64 +test.test_robotparser.CrawlDelayAndCustomAgentTest.test_bad_urls @ linux-x86_64 +test.test_robotparser.CrawlDelayAndCustomAgentTest.test_good_urls @ linux-x86_64 +test.test_robotparser.CrawlDelayAndCustomAgentTest.test_site_maps @ linux-x86_64 +test.test_robotparser.CrawlDelayAndRequestRateTest.test_bad_urls @ linux-x86_64 +test.test_robotparser.CrawlDelayAndRequestRateTest.test_good_urls @ linux-x86_64 +test.test_robotparser.CrawlDelayAndRequestRateTest.test_request_rate @ linux-x86_64 +test.test_robotparser.CrawlDelayAndRequestRateTest.test_site_maps @ linux-x86_64 +test.test_robotparser.DefaultEntryTest.test_bad_urls @ linux-x86_64 +test.test_robotparser.DefaultEntryTest.test_good_urls @ linux-x86_64 +test.test_robotparser.DefaultEntryTest.test_request_rate @ linux-x86_64 +test.test_robotparser.DefaultEntryTest.test_site_maps @ linux-x86_64 +test.test_robotparser.DifferentAgentTest.test_bad_urls @ linux-x86_64 +test.test_robotparser.DifferentAgentTest.test_good_urls @ linux-x86_64 +test.test_robotparser.DifferentAgentTest.test_request_rate @ linux-x86_64 +test.test_robotparser.DifferentAgentTest.test_site_maps @ linux-x86_64 +test.test_robotparser.DisallowQueryStringTest.test_bad_urls @ linux-x86_64 +test.test_robotparser.DisallowQueryStringTest.test_good_urls @ linux-x86_64 +test.test_robotparser.DisallowQueryStringTest.test_site_maps @ linux-x86_64 +test.test_robotparser.EmptyFileTest.test_bad_urls @ linux-x86_64 +test.test_robotparser.EmptyFileTest.test_good_urls @ linux-x86_64 +test.test_robotparser.EmptyFileTest.test_request_rate @ linux-x86_64 +test.test_robotparser.EmptyFileTest.test_site_maps @ linux-x86_64 +test.test_robotparser.EmptyQueryStringTest.test_bad_urls @ linux-x86_64 +test.test_robotparser.EmptyQueryStringTest.test_good_urls @ linux-x86_64 +test.test_robotparser.EmptyQueryStringTest.test_site_maps @ linux-x86_64 +test.test_robotparser.GoogleURLOrderingTest.test_bad_urls @ linux-x86_64 +test.test_robotparser.GoogleURLOrderingTest.test_good_urls @ linux-x86_64 +test.test_robotparser.GoogleURLOrderingTest.test_site_maps @ linux-x86_64 +test.test_robotparser.InvalidCrawlDelayTest.test_bad_urls @ linux-x86_64 +test.test_robotparser.InvalidCrawlDelayTest.test_good_urls @ linux-x86_64 +test.test_robotparser.InvalidCrawlDelayTest.test_site_maps @ linux-x86_64 +test.test_robotparser.InvalidRequestRateTest.test_bad_urls @ linux-x86_64 +test.test_robotparser.InvalidRequestRateTest.test_good_urls @ linux-x86_64 +test.test_robotparser.InvalidRequestRateTest.test_site_maps @ linux-x86_64 +test.test_robotparser.NetworkTestCase.test_basic @ linux-x86_64 +test.test_robotparser.NetworkTestCase.test_can_fetch @ linux-x86_64 +test.test_robotparser.NetworkTestCase.test_read_404 @ linux-x86_64 +test.test_robotparser.PasswordProtectedSiteTestCase.testPasswordProtectedSite @ linux-x86_64 +test.test_robotparser.RejectAllRobotsTest.test_bad_urls @ linux-x86_64 +test.test_robotparser.RejectAllRobotsTest.test_good_urls @ linux-x86_64 +test.test_robotparser.RejectAllRobotsTest.test_site_maps @ linux-x86_64 +test.test_robotparser.SitemapTest.test_bad_urls @ linux-x86_64 +test.test_robotparser.SitemapTest.test_good_urls @ linux-x86_64 +test.test_robotparser.SitemapTest.test_site_maps @ linux-x86_64 +test.test_robotparser.StringFormattingTest.test_bad_urls @ linux-x86_64 +test.test_robotparser.StringFormattingTest.test_good_urls @ linux-x86_64 +test.test_robotparser.StringFormattingTest.test_site_maps @ linux-x86_64 +test.test_robotparser.StringFormattingTest.test_string_formatting @ linux-x86_64 +test.test_robotparser.UseFirstUserAgentWildcardTest.test_bad_urls @ linux-x86_64 +test.test_robotparser.UseFirstUserAgentWildcardTest.test_good_urls @ linux-x86_64 +test.test_robotparser.UseFirstUserAgentWildcardTest.test_site_maps @ linux-x86_64 +test.test_robotparser.UserAgentGoogleMobileTest.test_bad_urls @ linux-x86_64 +test.test_robotparser.UserAgentGoogleMobileTest.test_good_urls @ linux-x86_64 +test.test_robotparser.UserAgentGoogleMobileTest.test_site_maps @ linux-x86_64 +test.test_robotparser.UserAgentOrderingTest.test_bad_urls @ linux-x86_64 +test.test_robotparser.UserAgentOrderingTest.test_good_urls @ linux-x86_64 +test.test_robotparser.UserAgentOrderingTest.test_site_maps @ linux-x86_64 +test.test_robotparser.UserAgentWildcardTest.test_bad_urls @ linux-x86_64 +test.test_robotparser.UserAgentWildcardTest.test_good_urls @ linux-x86_64 +test.test_robotparser.UserAgentWildcardTest.test_site_maps @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_runpy.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_runpy.txt new file mode 100644 index 0000000000..c349484e35 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_runpy.txt @@ -0,0 +1,31 @@ +test.test_runpy.ExecutionLayerTestCase.test_run_code @ linux-x86_64 +test.test_runpy.ExecutionLayerTestCase.test_run_module_code @ linux-x86_64 +test.test_runpy.RunModuleTestCase.test_explicit_relative_import @ linux-x86_64 +test.test_runpy.RunModuleTestCase.test_invalid_names @ linux-x86_64 +test.test_runpy.RunModuleTestCase.test_library_module @ linux-x86_64 +test.test_runpy.RunModuleTestCase.test_main_relative_import @ linux-x86_64 +test.test_runpy.RunModuleTestCase.test_package_imported_no_warning @ linux-x86_64 +test.test_runpy.RunModuleTestCase.test_pkgutil_walk_packages @ linux-x86_64 +test.test_runpy.RunModuleTestCase.test_run_module @ linux-x86_64 +test.test_runpy.RunModuleTestCase.test_run_module_alter_sys @ linux-x86_64 +test.test_runpy.RunModuleTestCase.test_run_module_in_namespace_package @ linux-x86_64 +test.test_runpy.RunModuleTestCase.test_run_name @ linux-x86_64 +test.test_runpy.RunModuleTestCase.test_run_namespace_package @ linux-x86_64 +test.test_runpy.RunModuleTestCase.test_run_namespace_package_in_namespace_package @ linux-x86_64 +test.test_runpy.RunModuleTestCase.test_run_package @ linux-x86_64 +test.test_runpy.RunModuleTestCase.test_run_package_alter_sys @ linux-x86_64 +test.test_runpy.RunModuleTestCase.test_run_package_in_namespace_package @ linux-x86_64 +test.test_runpy.RunModuleTestCase.test_run_package_init_exceptions @ linux-x86_64 +test.test_runpy.RunModuleTestCase.test_submodule_imported_warning @ linux-x86_64 +test.test_runpy.RunPathTestCase.test_basic_script @ linux-x86_64 +test.test_runpy.RunPathTestCase.test_basic_script_no_suffix @ linux-x86_64 +test.test_runpy.RunPathTestCase.test_basic_script_with_path_object @ linux-x86_64 +test.test_runpy.RunPathTestCase.test_directory @ linux-x86_64 +test.test_runpy.RunPathTestCase.test_directory_compiled @ linux-x86_64 +test.test_runpy.RunPathTestCase.test_directory_error @ linux-x86_64 +test.test_runpy.RunPathTestCase.test_encoding @ linux-x86_64 +test.test_runpy.RunPathTestCase.test_main_recursion_error @ linux-x86_64 +test.test_runpy.RunPathTestCase.test_script_compiled @ linux-x86_64 +test.test_runpy.RunPathTestCase.test_zipfile @ linux-x86_64 +test.test_runpy.RunPathTestCase.test_zipfile_compiled @ linux-x86_64 +test.test_runpy.RunPathTestCase.test_zipfile_error @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sax.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sax.txt new file mode 100644 index 0000000000..771246e9aa --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sax.txt @@ -0,0 +1,175 @@ +test.test_sax.BytesXmlgenTest.test_1463026_1 @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_1463026_1_empty @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_1463026_2 @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_1463026_2_empty @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_1463026_3 @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_1463026_3_empty @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_5027_1 @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_5027_2 @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_no_close_file @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_xmlgen_attr_escape @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_xmlgen_basic @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_xmlgen_basic_empty @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_xmlgen_content @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_xmlgen_content_empty @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_xmlgen_content_escape @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_xmlgen_fragment @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_xmlgen_ignorable @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_xmlgen_ignorable_empty @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_xmlgen_ns @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_xmlgen_ns_empty @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_xmlgen_pi @ linux-x86_64 +test.test_sax.BytesXmlgenTest.test_xmlgen_unencodable @ linux-x86_64 +test.test_sax.CDATAHandlerTest.test_handlers @ linux-x86_64 +test.test_sax.ErrorReportingTest.test_expat_incomplete @ linux-x86_64 +test.test_sax.ErrorReportingTest.test_expat_inpsource_location @ linux-x86_64 +test.test_sax.ErrorReportingTest.test_sax_parse_exception_str @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_attrs_empty @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_attrs_wattr @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_binary_file @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_binary_file_bytes_name @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_binary_file_int_name @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_binary_file_nonascii @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_dtdhandler @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_entityresolver_default @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_entityresolver_enabled @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_external_dtd_default @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_external_dtd_enabled @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_incremental @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_incremental_reset @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_inpsource_byte_stream @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_inpsource_character_stream @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_inpsource_filename @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_inpsource_sysid @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_inpsource_sysid_nonascii @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_locator_noinfo @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_locator_withinfo @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_locator_withinfo_nonascii @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_nsattrs_empty @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_nsattrs_wattr @ linux-x86_64 +test.test_sax.ExpatReaderTest.test_expat_text_file @ linux-x86_64 +test.test_sax.LexicalHandlerTest.test_handlers @ linux-x86_64 +test.test_sax.MakeParserTest.test_make_parser2 @ linux-x86_64 +test.test_sax.MakeParserTest.test_make_parser3 @ linux-x86_64 +test.test_sax.MakeParserTest.test_make_parser4 @ linux-x86_64 +test.test_sax.MakeParserTest.test_make_parser5 @ linux-x86_64 +test.test_sax.ParseTest.test_parseString_text @ linux-x86_64 +test.test_sax.ParseTest.test_parse_close_source @ linux-x86_64 +test.test_sax.ParseTest.test_parse_path_object @ linux-x86_64 +test.test_sax.PrepareInputSourceTest.test_binary_file @ linux-x86_64 +test.test_sax.PrepareInputSourceTest.test_byte_stream @ linux-x86_64 +test.test_sax.PrepareInputSourceTest.test_character_stream @ linux-x86_64 +test.test_sax.PrepareInputSourceTest.test_path_objects @ linux-x86_64 +test.test_sax.PrepareInputSourceTest.test_string @ linux-x86_64 +test.test_sax.PrepareInputSourceTest.test_system_id @ linux-x86_64 +test.test_sax.PrepareInputSourceTest.test_text_file @ linux-x86_64 +test.test_sax.SaxutilsTest.test_double_quoteattr @ linux-x86_64 +test.test_sax.SaxutilsTest.test_escape_all @ linux-x86_64 +test.test_sax.SaxutilsTest.test_escape_basic @ linux-x86_64 +test.test_sax.SaxutilsTest.test_escape_extra @ linux-x86_64 +test.test_sax.SaxutilsTest.test_make_parser @ linux-x86_64 +test.test_sax.SaxutilsTest.test_quoteattr_basic @ linux-x86_64 +test.test_sax.SaxutilsTest.test_single_double_quoteattr @ linux-x86_64 +test.test_sax.SaxutilsTest.test_single_quoteattr @ linux-x86_64 +test.test_sax.SaxutilsTest.test_unescape_all @ linux-x86_64 +test.test_sax.SaxutilsTest.test_unescape_amp_extra @ linux-x86_64 +test.test_sax.SaxutilsTest.test_unescape_basic @ linux-x86_64 +test.test_sax.SaxutilsTest.test_unescape_extra @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_1463026_1 @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_1463026_1_empty @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_1463026_2 @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_1463026_2_empty @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_1463026_3 @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_1463026_3_empty @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_5027_1 @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_5027_2 @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_no_close_file @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_attr_escape @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_basic @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_basic_empty @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_content @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_content_empty @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_content_escape @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_encoding @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_encoding_bytes @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_fragment @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_ignorable @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_ignorable_empty @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_ns @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_ns_empty @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_pi @ linux-x86_64 +test.test_sax.StreamReaderWriterXmlgenTest.test_xmlgen_unencodable @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_1463026_1 @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_1463026_1_empty @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_1463026_2 @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_1463026_2_empty @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_1463026_3 @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_1463026_3_empty @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_5027_1 @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_5027_2 @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_no_close_file @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_attr_escape @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_basic @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_basic_empty @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_content @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_content_empty @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_content_escape @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_encoding @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_encoding_bytes @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_fragment @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_ignorable @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_ignorable_empty @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_ns @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_ns_empty @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_pi @ linux-x86_64 +test.test_sax.StreamWriterXmlgenTest.test_xmlgen_unencodable @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_1463026_1 @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_1463026_1_empty @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_1463026_2 @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_1463026_2_empty @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_1463026_3 @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_1463026_3_empty @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_5027_1 @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_5027_2 @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_no_close_file @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_xmlgen_attr_escape @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_xmlgen_basic @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_xmlgen_basic_empty @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_xmlgen_content @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_xmlgen_content_empty @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_xmlgen_content_escape @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_xmlgen_encoding @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_xmlgen_encoding_bytes @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_xmlgen_fragment @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_xmlgen_ignorable @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_xmlgen_ignorable_empty @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_xmlgen_ns @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_xmlgen_ns_empty @ linux-x86_64 +test.test_sax.StringXmlgenTest.test_xmlgen_pi @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_1463026_1 @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_1463026_1_empty @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_1463026_2 @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_1463026_2_empty @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_1463026_3 @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_1463026_3_empty @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_5027_1 @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_5027_2 @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_no_close_file @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_xmlgen_attr_escape @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_xmlgen_basic @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_xmlgen_basic_empty @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_xmlgen_content @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_xmlgen_content_empty @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_xmlgen_content_escape @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_xmlgen_fragment @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_xmlgen_ignorable @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_xmlgen_ignorable_empty @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_xmlgen_ns @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_xmlgen_ns_empty @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_xmlgen_pi @ linux-x86_64 +test.test_sax.WriterXmlgenTest.test_xmlgen_unencodable @ linux-x86_64 +test.test_sax.XMLFilterBaseTest.test_filter_basic @ linux-x86_64 +test.test_sax.XmlReaderTest.test_attrs_empty @ linux-x86_64 +test.test_sax.XmlReaderTest.test_attrs_wattr @ linux-x86_64 +test.test_sax.XmlReaderTest.test_nsattrs_empty @ linux-x86_64 +test.test_sax.XmlReaderTest.test_nsattrs_wattr @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sched.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sched.txt new file mode 100644 index 0000000000..f448880c0e --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sched.txt @@ -0,0 +1,11 @@ +test.test_sched.TestCase.test_args_kwargs @ linux-x86_64 +test.test_sched.TestCase.test_cancel @ linux-x86_64 +test.test_sched.TestCase.test_cancel_concurrent @ linux-x86_64 +test.test_sched.TestCase.test_cancel_correct_event @ linux-x86_64 +test.test_sched.TestCase.test_empty @ linux-x86_64 +test.test_sched.TestCase.test_enter @ linux-x86_64 +test.test_sched.TestCase.test_enter_concurrent @ linux-x86_64 +test.test_sched.TestCase.test_enterabs @ linux-x86_64 +test.test_sched.TestCase.test_priority @ linux-x86_64 +test.test_sched.TestCase.test_queue @ linux-x86_64 +test.test_sched.TestCase.test_run_non_blocking @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_scope.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_scope.txt new file mode 100644 index 0000000000..bade6f95c8 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_scope.txt @@ -0,0 +1,36 @@ +test.test_scope.ScopeTests.testBoundAndFree @ linux-x86_64 +test.test_scope.ScopeTests.testCellIsArgAndEscapes @ linux-x86_64 +test.test_scope.ScopeTests.testCellIsKwonlyArg @ linux-x86_64 +test.test_scope.ScopeTests.testCellIsLocalAndEscapes @ linux-x86_64 +test.test_scope.ScopeTests.testClassAndGlobal @ linux-x86_64 +test.test_scope.ScopeTests.testClassNamespaceOverridesClosure @ linux-x86_64 +test.test_scope.ScopeTests.testComplexDefinitions @ linux-x86_64 +test.test_scope.ScopeTests.testEvalExecFreeVars @ linux-x86_64 +test.test_scope.ScopeTests.testEvalFreeVars @ linux-x86_64 +test.test_scope.ScopeTests.testExtraNesting @ linux-x86_64 +test.test_scope.ScopeTests.testFreeVarInMethod @ linux-x86_64 +test.test_scope.ScopeTests.testFreeingCell @ linux-x86_64 +test.test_scope.ScopeTests.testGlobalInParallelNestedFunctions @ linux-x86_64 +test.test_scope.ScopeTests.testLambdas @ linux-x86_64 +test.test_scope.ScopeTests.testListCompLocalVars @ linux-x86_64 +test.test_scope.ScopeTests.testLocalsClass @ linux-x86_64 +test.test_scope.ScopeTests.testLocalsFunction @ linux-x86_64 +test.test_scope.ScopeTests.testMixedFreevarsAndCellvars @ linux-x86_64 +test.test_scope.ScopeTests.testNearestEnclosingScope @ linux-x86_64 +test.test_scope.ScopeTests.testNestedNonLocal @ linux-x86_64 +test.test_scope.ScopeTests.testNestingGlobalNoFree @ linux-x86_64 +test.test_scope.ScopeTests.testNestingPlusFreeRefToGlobal @ linux-x86_64 +test.test_scope.ScopeTests.testNestingThroughClass @ linux-x86_64 +test.test_scope.ScopeTests.testNonLocalClass @ linux-x86_64 +test.test_scope.ScopeTests.testNonLocalFunction @ linux-x86_64 +test.test_scope.ScopeTests.testNonLocalGenerator @ linux-x86_64 +test.test_scope.ScopeTests.testNonLocalMethod @ linux-x86_64 +test.test_scope.ScopeTests.testRecursion @ linux-x86_64 +test.test_scope.ScopeTests.testScopeOfGlobalStmt @ linux-x86_64 +test.test_scope.ScopeTests.testSimpleAndRebinding @ linux-x86_64 +test.test_scope.ScopeTests.testSimpleNesting @ linux-x86_64 +test.test_scope.ScopeTests.testTopIsNotSignificant @ linux-x86_64 +test.test_scope.ScopeTests.testUnboundLocal @ linux-x86_64 +test.test_scope.ScopeTests.testUnboundLocal_AfterDel @ linux-x86_64 +test.test_scope.ScopeTests.testUnboundLocal_AugAssign @ linux-x86_64 +test.test_scope.ScopeTests.testUnoptimizedNamespaces @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_script_helper.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_script_helper.txt new file mode 100644 index 0000000000..31af69e0f5 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_script_helper.txt @@ -0,0 +1,10 @@ +test.test_script_helper.TestScriptHelper.test_assert_python_failure @ linux-x86_64 +test.test_script_helper.TestScriptHelper.test_assert_python_failure_raises @ linux-x86_64 +test.test_script_helper.TestScriptHelper.test_assert_python_isolated_when_env_not_required @ linux-x86_64 +test.test_script_helper.TestScriptHelper.test_assert_python_not_isolated_when_env_is_required @ linux-x86_64 +test.test_script_helper.TestScriptHelper.test_assert_python_ok @ linux-x86_64 +test.test_script_helper.TestScriptHelper.test_assert_python_ok_raises @ linux-x86_64 +test.test_script_helper.TestScriptHelperEnvironment.test_interpreter_requires_environment_details @ linux-x86_64 +test.test_script_helper.TestScriptHelperEnvironment.test_interpreter_requires_environment_false @ linux-x86_64 +test.test_script_helper.TestScriptHelperEnvironment.test_interpreter_requires_environment_true @ linux-x86_64 +test.test_script_helper.TestScriptHelperEnvironment.test_interpreter_requires_environment_with_pythonhome @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_secrets.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_secrets.txt new file mode 100644 index 0000000000..b10c80f1b9 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_secrets.txt @@ -0,0 +1,11 @@ +test.test_secrets.Compare_Digest_Tests.test_bad_types @ linux-x86_64 +test.test_secrets.Compare_Digest_Tests.test_bool @ linux-x86_64 +test.test_secrets.Compare_Digest_Tests.test_equal @ linux-x86_64 +test.test_secrets.Compare_Digest_Tests.test_unequal @ linux-x86_64 +test.test_secrets.Random_Tests.test_choice @ linux-x86_64 +test.test_secrets.Random_Tests.test_randbelow @ linux-x86_64 +test.test_secrets.Random_Tests.test_randbits @ linux-x86_64 +test.test_secrets.Token_Tests.test_token_bytes @ linux-x86_64 +test.test_secrets.Token_Tests.test_token_defaults @ linux-x86_64 +test.test_secrets.Token_Tests.test_token_hex @ linux-x86_64 +test.test_secrets.Token_Tests.test_token_urlsafe @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_select.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_select.txt new file mode 100644 index 0000000000..878072b3cb --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_select.txt @@ -0,0 +1,4 @@ +test.test_select.SelectTestCase.test_errno @ linux-x86_64 +test.test_select.SelectTestCase.test_error_conditions @ linux-x86_64 +test.test_select.SelectTestCase.test_returned_list_identity @ linux-x86_64 +test.test_select.SelectTestCase.test_select_mutated @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_selectors.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_selectors.txt new file mode 100644 index 0000000000..52f57b21e0 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_selectors.txt @@ -0,0 +1,34 @@ +test.test_selectors.DefaultSelectorTestCase.test_close @ linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_context_manager @ linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_empty_select @ linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_fileno @ linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_get_key @ linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_get_map @ linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_modify @ linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_register @ linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_select @ linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_select_interrupt_noraise @ linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_select_read_write @ linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_selector @ linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_timeout @ linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_unregister @ linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_unregister_after_fd_close @ linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_unregister_after_fd_close_and_reuse @ linux-x86_64 +test.test_selectors.DefaultSelectorTestCase.test_unregister_after_socket_close @ linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_close @ linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_context_manager @ linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_empty_select @ linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_fileno @ linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_get_key @ linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_get_map @ linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_modify @ linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_register @ linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_select @ linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_select_interrupt_noraise @ linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_select_read_write @ linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_selector @ linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_timeout @ linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_unregister @ linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_unregister_after_fd_close @ linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_unregister_after_fd_close_and_reuse @ linux-x86_64 +test.test_selectors.SelectSelectorTestCase.test_unregister_after_socket_close @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_set.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_set.txt new file mode 100644 index 0000000000..94d682776b --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_set.txt @@ -0,0 +1,486 @@ +test.test_set.TestBasicOpsBytes.test_copy @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_empty_difference @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_empty_difference_rev @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_empty_intersection @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_empty_isdisjoint @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_empty_symmetric_difference @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_empty_union @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_equivalent_equality @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_intersection_empty @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_isdisjoint_empty @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_issue_37219 @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_iteration @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_length @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_pickling @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_repr @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_self_difference @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_self_equality @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_self_intersection @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_self_isdisjoint @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_self_symmetric_difference @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_self_union @ linux-x86_64 +test.test_set.TestBasicOpsBytes.test_union_empty @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_copy @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_empty_difference @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_empty_difference_rev @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_empty_intersection @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_empty_isdisjoint @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_empty_symmetric_difference @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_empty_union @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_equivalent_equality @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_intersection_empty @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_isdisjoint_empty @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_issue_37219 @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_iteration @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_length @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_pickling @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_repr @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_self_difference @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_self_equality @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_self_intersection @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_self_isdisjoint @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_self_symmetric_difference @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_self_union @ linux-x86_64 +test.test_set.TestBasicOpsEmpty.test_union_empty @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_copy @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_empty_difference @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_empty_difference_rev @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_empty_intersection @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_empty_isdisjoint @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_empty_symmetric_difference @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_empty_union @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_equivalent_equality @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_intersection_empty @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_isdisjoint_empty @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_issue_37219 @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_iteration @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_length @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_pickling @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_repr @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_self_difference @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_self_equality @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_self_intersection @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_self_isdisjoint @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_self_symmetric_difference @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_self_union @ linux-x86_64 +test.test_set.TestBasicOpsMixedStringBytes.test_union_empty @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_copy @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_empty_difference @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_empty_difference_rev @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_empty_intersection @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_empty_isdisjoint @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_empty_symmetric_difference @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_empty_union @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_equivalent_equality @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_in @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_intersection_empty @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_isdisjoint_empty @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_issue_37219 @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_iteration @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_length @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_not_in @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_pickling @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_repr @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_self_difference @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_self_equality @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_self_intersection @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_self_isdisjoint @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_self_symmetric_difference @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_self_union @ linux-x86_64 +test.test_set.TestBasicOpsSingleton.test_union_empty @ linux-x86_64 +test.test_set.TestBasicOpsString.test_copy @ linux-x86_64 +test.test_set.TestBasicOpsString.test_empty_difference @ linux-x86_64 +test.test_set.TestBasicOpsString.test_empty_difference_rev @ linux-x86_64 +test.test_set.TestBasicOpsString.test_empty_intersection @ linux-x86_64 +test.test_set.TestBasicOpsString.test_empty_isdisjoint @ linux-x86_64 +test.test_set.TestBasicOpsString.test_empty_symmetric_difference @ linux-x86_64 +test.test_set.TestBasicOpsString.test_empty_union @ linux-x86_64 +test.test_set.TestBasicOpsString.test_equivalent_equality @ linux-x86_64 +test.test_set.TestBasicOpsString.test_intersection_empty @ linux-x86_64 +test.test_set.TestBasicOpsString.test_isdisjoint_empty @ linux-x86_64 +test.test_set.TestBasicOpsString.test_issue_37219 @ linux-x86_64 +test.test_set.TestBasicOpsString.test_iteration @ linux-x86_64 +test.test_set.TestBasicOpsString.test_length @ linux-x86_64 +test.test_set.TestBasicOpsString.test_pickling @ linux-x86_64 +test.test_set.TestBasicOpsString.test_repr @ linux-x86_64 +test.test_set.TestBasicOpsString.test_self_difference @ linux-x86_64 +test.test_set.TestBasicOpsString.test_self_equality @ linux-x86_64 +test.test_set.TestBasicOpsString.test_self_intersection @ linux-x86_64 +test.test_set.TestBasicOpsString.test_self_isdisjoint @ linux-x86_64 +test.test_set.TestBasicOpsString.test_self_symmetric_difference @ linux-x86_64 +test.test_set.TestBasicOpsString.test_self_union @ linux-x86_64 +test.test_set.TestBasicOpsString.test_union_empty @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_copy @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_empty_difference @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_empty_difference_rev @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_empty_intersection @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_empty_isdisjoint @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_empty_symmetric_difference @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_empty_union @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_equivalent_equality @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_intersection_empty @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_isdisjoint_empty @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_issue_37219 @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_iteration @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_length @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_pickling @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_repr @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_self_difference @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_self_equality @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_self_intersection @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_self_isdisjoint @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_self_symmetric_difference @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_self_union @ linux-x86_64 +test.test_set.TestBasicOpsTriple.test_union_empty @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_copy @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_empty_difference @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_empty_difference_rev @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_empty_intersection @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_empty_isdisjoint @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_empty_symmetric_difference @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_empty_union @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_equivalent_equality @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_in @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_intersection_empty @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_isdisjoint_empty @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_issue_37219 @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_iteration @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_length @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_not_in @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_pickling @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_repr @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_self_difference @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_self_equality @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_self_intersection @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_self_isdisjoint @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_self_symmetric_difference @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_self_union @ linux-x86_64 +test.test_set.TestBasicOpsTuple.test_union_empty @ linux-x86_64 +test.test_set.TestBinaryOps.test_eq @ linux-x86_64 +test.test_set.TestBinaryOps.test_intersection_non_overlap @ linux-x86_64 +test.test_set.TestBinaryOps.test_intersection_overlap @ linux-x86_64 +test.test_set.TestBinaryOps.test_intersection_subset @ linux-x86_64 +test.test_set.TestBinaryOps.test_intersection_superset @ linux-x86_64 +test.test_set.TestBinaryOps.test_isdisjoint_non_overlap @ linux-x86_64 +test.test_set.TestBinaryOps.test_isdisjoint_overlap @ linux-x86_64 +test.test_set.TestBinaryOps.test_isdisjoint_subset @ linux-x86_64 +test.test_set.TestBinaryOps.test_isdisjoint_superset @ linux-x86_64 +test.test_set.TestBinaryOps.test_sym_difference_non_overlap @ linux-x86_64 +test.test_set.TestBinaryOps.test_sym_difference_overlap @ linux-x86_64 +test.test_set.TestBinaryOps.test_sym_difference_subset @ linux-x86_64 +test.test_set.TestBinaryOps.test_sym_difference_superset @ linux-x86_64 +test.test_set.TestBinaryOps.test_union_non_overlap @ linux-x86_64 +test.test_set.TestBinaryOps.test_union_overlap @ linux-x86_64 +test.test_set.TestBinaryOps.test_union_subset @ linux-x86_64 +test.test_set.TestBinaryOps.test_union_superset @ linux-x86_64 +test.test_set.TestCopyingEmpty.test_copy @ linux-x86_64 +test.test_set.TestCopyingEmpty.test_deep_copy @ linux-x86_64 +test.test_set.TestCopyingNested.test_copy @ linux-x86_64 +test.test_set.TestCopyingNested.test_deep_copy @ linux-x86_64 +test.test_set.TestCopyingSingleton.test_copy @ linux-x86_64 +test.test_set.TestCopyingSingleton.test_deep_copy @ linux-x86_64 +test.test_set.TestCopyingTriple.test_copy @ linux-x86_64 +test.test_set.TestCopyingTriple.test_deep_copy @ linux-x86_64 +test.test_set.TestCopyingTuple.test_copy @ linux-x86_64 +test.test_set.TestCopyingTuple.test_deep_copy @ linux-x86_64 +test.test_set.TestExceptionPropagation.test_changingSizeWhileIterating @ linux-x86_64 +test.test_set.TestExceptionPropagation.test_instanceWithException @ linux-x86_64 +test.test_set.TestExceptionPropagation.test_instancesWithoutException @ linux-x86_64 +test.test_set.TestFrozenSet.test_and @ linux-x86_64 +test.test_set.TestFrozenSet.test_badcmp @ linux-x86_64 +test.test_set.TestFrozenSet.test_constructor_identity @ linux-x86_64 +test.test_set.TestFrozenSet.test_contains @ linux-x86_64 +test.test_set.TestFrozenSet.test_copy @ linux-x86_64 +test.test_set.TestFrozenSet.test_cyclical_repr @ linux-x86_64 +test.test_set.TestFrozenSet.test_deepcopy @ linux-x86_64 +test.test_set.TestFrozenSet.test_difference @ linux-x86_64 +test.test_set.TestFrozenSet.test_do_not_rehash_dict_keys @ linux-x86_64 +test.test_set.TestFrozenSet.test_equality @ linux-x86_64 +test.test_set.TestFrozenSet.test_frozen_as_dictkey @ linux-x86_64 +test.test_set.TestFrozenSet.test_gc @ linux-x86_64 +test.test_set.TestFrozenSet.test_hash @ linux-x86_64 +test.test_set.TestFrozenSet.test_hash_caching @ linux-x86_64 +test.test_set.TestFrozenSet.test_hash_effectiveness @ linux-x86_64 +test.test_set.TestFrozenSet.test_init @ linux-x86_64 +test.test_set.TestFrozenSet.test_intersection @ linux-x86_64 +test.test_set.TestFrozenSet.test_isdisjoint @ linux-x86_64 +test.test_set.TestFrozenSet.test_iterator_pickling @ linux-x86_64 +test.test_set.TestFrozenSet.test_len @ linux-x86_64 +test.test_set.TestFrozenSet.test_new_or_init @ linux-x86_64 +test.test_set.TestFrozenSet.test_or @ linux-x86_64 +test.test_set.TestFrozenSet.test_pickling @ linux-x86_64 +test.test_set.TestFrozenSet.test_setOfFrozensets @ linux-x86_64 +test.test_set.TestFrozenSet.test_sub @ linux-x86_64 +test.test_set.TestFrozenSet.test_sub_and_super @ linux-x86_64 +test.test_set.TestFrozenSet.test_subclass_with_custom_hash @ linux-x86_64 +test.test_set.TestFrozenSet.test_symmetric_difference @ linux-x86_64 +test.test_set.TestFrozenSet.test_union @ linux-x86_64 +test.test_set.TestFrozenSet.test_uniquification @ linux-x86_64 +test.test_set.TestFrozenSet.test_xor @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_and @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_badcmp @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_constructor_identity @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_contains @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_copy @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_cyclical_repr @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_deepcopy @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_difference @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_do_not_rehash_dict_keys @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_equality @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_frozen_as_dictkey @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_gc @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_hash @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_hash_caching @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_hash_effectiveness @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_init @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_intersection @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_isdisjoint @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_iterator_pickling @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_len @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_nested_empty_constructor @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_new_or_init @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_or @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_pickling @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_setOfFrozensets @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_singleton_empty_frozenset @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_sub @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_sub_and_super @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_subclass_with_custom_hash @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_symmetric_difference @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_union @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_uniquification @ linux-x86_64 +test.test_set.TestFrozenSetSubclass.test_xor @ linux-x86_64 +test.test_set.TestFrozenSetSubclassWithSlots.test_pickling @ linux-x86_64 +test.test_set.TestGraphs.test_cube @ linux-x86_64 +test.test_set.TestGraphs.test_cuboctahedron @ linux-x86_64 +test.test_set.TestIdentities.test_binopsVsSubsets @ linux-x86_64 +test.test_set.TestIdentities.test_commutativity @ linux-x86_64 +test.test_set.TestIdentities.test_exclusion @ linux-x86_64 +test.test_set.TestIdentities.test_summations @ linux-x86_64 +test.test_set.TestMutate.test_add_absent @ linux-x86_64 +test.test_set.TestMutate.test_add_present @ linux-x86_64 +test.test_set.TestMutate.test_add_until_full @ linux-x86_64 +test.test_set.TestMutate.test_clear @ linux-x86_64 +test.test_set.TestMutate.test_discard_absent @ linux-x86_64 +test.test_set.TestMutate.test_discard_present @ linux-x86_64 +test.test_set.TestMutate.test_pop @ linux-x86_64 +test.test_set.TestMutate.test_remove_absent @ linux-x86_64 +test.test_set.TestMutate.test_remove_present @ linux-x86_64 +test.test_set.TestMutate.test_remove_until_empty @ linux-x86_64 +test.test_set.TestMutate.test_update_empty_tuple @ linux-x86_64 +test.test_set.TestMutate.test_update_unit_tuple_non_overlap @ linux-x86_64 +test.test_set.TestMutate.test_update_unit_tuple_overlap @ linux-x86_64 +test.test_set.TestOnlySetsDict.test_difference @ linux-x86_64 +test.test_set.TestOnlySetsDict.test_difference_update @ linux-x86_64 +test.test_set.TestOnlySetsDict.test_difference_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsDict.test_eq_ne @ linux-x86_64 +test.test_set.TestOnlySetsDict.test_ge_gt_le_lt @ linux-x86_64 +test.test_set.TestOnlySetsDict.test_intersection @ linux-x86_64 +test.test_set.TestOnlySetsDict.test_intersection_update @ linux-x86_64 +test.test_set.TestOnlySetsDict.test_intersection_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsDict.test_sym_difference @ linux-x86_64 +test.test_set.TestOnlySetsDict.test_sym_difference_update @ linux-x86_64 +test.test_set.TestOnlySetsDict.test_sym_difference_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsDict.test_union @ linux-x86_64 +test.test_set.TestOnlySetsDict.test_update @ linux-x86_64 +test.test_set.TestOnlySetsDict.test_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsGenerator.test_difference @ linux-x86_64 +test.test_set.TestOnlySetsGenerator.test_difference_update @ linux-x86_64 +test.test_set.TestOnlySetsGenerator.test_difference_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsGenerator.test_eq_ne @ linux-x86_64 +test.test_set.TestOnlySetsGenerator.test_ge_gt_le_lt @ linux-x86_64 +test.test_set.TestOnlySetsGenerator.test_intersection @ linux-x86_64 +test.test_set.TestOnlySetsGenerator.test_intersection_update @ linux-x86_64 +test.test_set.TestOnlySetsGenerator.test_intersection_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsGenerator.test_sym_difference @ linux-x86_64 +test.test_set.TestOnlySetsGenerator.test_sym_difference_update @ linux-x86_64 +test.test_set.TestOnlySetsGenerator.test_sym_difference_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsGenerator.test_union @ linux-x86_64 +test.test_set.TestOnlySetsGenerator.test_update @ linux-x86_64 +test.test_set.TestOnlySetsGenerator.test_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsNumeric.test_difference @ linux-x86_64 +test.test_set.TestOnlySetsNumeric.test_difference_update @ linux-x86_64 +test.test_set.TestOnlySetsNumeric.test_difference_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsNumeric.test_eq_ne @ linux-x86_64 +test.test_set.TestOnlySetsNumeric.test_ge_gt_le_lt @ linux-x86_64 +test.test_set.TestOnlySetsNumeric.test_intersection @ linux-x86_64 +test.test_set.TestOnlySetsNumeric.test_intersection_update @ linux-x86_64 +test.test_set.TestOnlySetsNumeric.test_intersection_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsNumeric.test_sym_difference @ linux-x86_64 +test.test_set.TestOnlySetsNumeric.test_sym_difference_update @ linux-x86_64 +test.test_set.TestOnlySetsNumeric.test_sym_difference_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsNumeric.test_union @ linux-x86_64 +test.test_set.TestOnlySetsNumeric.test_update @ linux-x86_64 +test.test_set.TestOnlySetsNumeric.test_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsOperator.test_difference @ linux-x86_64 +test.test_set.TestOnlySetsOperator.test_difference_update @ linux-x86_64 +test.test_set.TestOnlySetsOperator.test_difference_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsOperator.test_eq_ne @ linux-x86_64 +test.test_set.TestOnlySetsOperator.test_ge_gt_le_lt @ linux-x86_64 +test.test_set.TestOnlySetsOperator.test_intersection @ linux-x86_64 +test.test_set.TestOnlySetsOperator.test_intersection_update @ linux-x86_64 +test.test_set.TestOnlySetsOperator.test_intersection_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsOperator.test_sym_difference @ linux-x86_64 +test.test_set.TestOnlySetsOperator.test_sym_difference_update @ linux-x86_64 +test.test_set.TestOnlySetsOperator.test_sym_difference_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsOperator.test_union @ linux-x86_64 +test.test_set.TestOnlySetsOperator.test_update @ linux-x86_64 +test.test_set.TestOnlySetsOperator.test_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsString.test_difference @ linux-x86_64 +test.test_set.TestOnlySetsString.test_difference_update @ linux-x86_64 +test.test_set.TestOnlySetsString.test_difference_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsString.test_eq_ne @ linux-x86_64 +test.test_set.TestOnlySetsString.test_ge_gt_le_lt @ linux-x86_64 +test.test_set.TestOnlySetsString.test_intersection @ linux-x86_64 +test.test_set.TestOnlySetsString.test_intersection_update @ linux-x86_64 +test.test_set.TestOnlySetsString.test_intersection_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsString.test_sym_difference @ linux-x86_64 +test.test_set.TestOnlySetsString.test_sym_difference_update @ linux-x86_64 +test.test_set.TestOnlySetsString.test_sym_difference_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsString.test_union @ linux-x86_64 +test.test_set.TestOnlySetsString.test_update @ linux-x86_64 +test.test_set.TestOnlySetsString.test_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsTuple.test_difference @ linux-x86_64 +test.test_set.TestOnlySetsTuple.test_difference_update @ linux-x86_64 +test.test_set.TestOnlySetsTuple.test_difference_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsTuple.test_eq_ne @ linux-x86_64 +test.test_set.TestOnlySetsTuple.test_ge_gt_le_lt @ linux-x86_64 +test.test_set.TestOnlySetsTuple.test_intersection @ linux-x86_64 +test.test_set.TestOnlySetsTuple.test_intersection_update @ linux-x86_64 +test.test_set.TestOnlySetsTuple.test_intersection_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsTuple.test_sym_difference @ linux-x86_64 +test.test_set.TestOnlySetsTuple.test_sym_difference_update @ linux-x86_64 +test.test_set.TestOnlySetsTuple.test_sym_difference_update_operator @ linux-x86_64 +test.test_set.TestOnlySetsTuple.test_union @ linux-x86_64 +test.test_set.TestOnlySetsTuple.test_update @ linux-x86_64 +test.test_set.TestOnlySetsTuple.test_update_operator @ linux-x86_64 +test.test_set.TestSet.test_add @ linux-x86_64 +test.test_set.TestSet.test_and @ linux-x86_64 +test.test_set.TestSet.test_badcmp @ linux-x86_64 +test.test_set.TestSet.test_clear @ linux-x86_64 +test.test_set.TestSet.test_constructor_identity @ linux-x86_64 +test.test_set.TestSet.test_contains @ linux-x86_64 +test.test_set.TestSet.test_copy @ linux-x86_64 +test.test_set.TestSet.test_cyclical_repr @ linux-x86_64 +test.test_set.TestSet.test_deepcopy @ linux-x86_64 +test.test_set.TestSet.test_difference @ linux-x86_64 +test.test_set.TestSet.test_difference_update @ linux-x86_64 +test.test_set.TestSet.test_discard @ linux-x86_64 +test.test_set.TestSet.test_do_not_rehash_dict_keys @ linux-x86_64 +test.test_set.TestSet.test_equality @ linux-x86_64 +test.test_set.TestSet.test_gc @ linux-x86_64 +test.test_set.TestSet.test_hash @ linux-x86_64 +test.test_set.TestSet.test_iand @ linux-x86_64 +test.test_set.TestSet.test_init @ linux-x86_64 +test.test_set.TestSet.test_inplace_on_self @ linux-x86_64 +test.test_set.TestSet.test_intersection @ linux-x86_64 +test.test_set.TestSet.test_intersection_update @ linux-x86_64 +test.test_set.TestSet.test_ior @ linux-x86_64 +test.test_set.TestSet.test_isdisjoint @ linux-x86_64 +test.test_set.TestSet.test_isub @ linux-x86_64 +test.test_set.TestSet.test_iterator_pickling @ linux-x86_64 +test.test_set.TestSet.test_ixor @ linux-x86_64 +test.test_set.TestSet.test_len @ linux-x86_64 +test.test_set.TestSet.test_new_or_init @ linux-x86_64 +test.test_set.TestSet.test_or @ linux-x86_64 +test.test_set.TestSet.test_pickling @ linux-x86_64 +test.test_set.TestSet.test_pop @ linux-x86_64 +test.test_set.TestSet.test_remove @ linux-x86_64 +test.test_set.TestSet.test_remove_keyerror_set @ linux-x86_64 +test.test_set.TestSet.test_remove_keyerror_unpacking @ linux-x86_64 +test.test_set.TestSet.test_rich_compare @ linux-x86_64 +test.test_set.TestSet.test_setOfFrozensets @ linux-x86_64 +test.test_set.TestSet.test_set_literal @ linux-x86_64 +test.test_set.TestSet.test_set_literal_evaluation_order @ linux-x86_64 +test.test_set.TestSet.test_set_literal_insertion_order @ linux-x86_64 +test.test_set.TestSet.test_sub @ linux-x86_64 +test.test_set.TestSet.test_sub_and_super @ linux-x86_64 +test.test_set.TestSet.test_subclass_with_custom_hash @ linux-x86_64 +test.test_set.TestSet.test_symmetric_difference @ linux-x86_64 +test.test_set.TestSet.test_symmetric_difference_update @ linux-x86_64 +test.test_set.TestSet.test_union @ linux-x86_64 +test.test_set.TestSet.test_uniquification @ linux-x86_64 +test.test_set.TestSet.test_update @ linux-x86_64 +test.test_set.TestSet.test_xor @ linux-x86_64 +test.test_set.TestSetOfSets.test_constructor @ linux-x86_64 +test.test_set.TestSetSubclass.test_add @ linux-x86_64 +test.test_set.TestSetSubclass.test_and @ linux-x86_64 +test.test_set.TestSetSubclass.test_badcmp @ linux-x86_64 +test.test_set.TestSetSubclass.test_clear @ linux-x86_64 +test.test_set.TestSetSubclass.test_constructor_identity @ linux-x86_64 +test.test_set.TestSetSubclass.test_contains @ linux-x86_64 +test.test_set.TestSetSubclass.test_copy @ linux-x86_64 +test.test_set.TestSetSubclass.test_cyclical_repr @ linux-x86_64 +test.test_set.TestSetSubclass.test_deepcopy @ linux-x86_64 +test.test_set.TestSetSubclass.test_difference @ linux-x86_64 +test.test_set.TestSetSubclass.test_difference_update @ linux-x86_64 +test.test_set.TestSetSubclass.test_discard @ linux-x86_64 +test.test_set.TestSetSubclass.test_do_not_rehash_dict_keys @ linux-x86_64 +test.test_set.TestSetSubclass.test_equality @ linux-x86_64 +test.test_set.TestSetSubclass.test_gc @ linux-x86_64 +test.test_set.TestSetSubclass.test_hash @ linux-x86_64 +test.test_set.TestSetSubclass.test_iand @ linux-x86_64 +test.test_set.TestSetSubclass.test_init @ linux-x86_64 +test.test_set.TestSetSubclass.test_inplace_on_self @ linux-x86_64 +test.test_set.TestSetSubclass.test_intersection @ linux-x86_64 +test.test_set.TestSetSubclass.test_intersection_update @ linux-x86_64 +test.test_set.TestSetSubclass.test_ior @ linux-x86_64 +test.test_set.TestSetSubclass.test_isdisjoint @ linux-x86_64 +test.test_set.TestSetSubclass.test_isub @ linux-x86_64 +test.test_set.TestSetSubclass.test_iterator_pickling @ linux-x86_64 +test.test_set.TestSetSubclass.test_ixor @ linux-x86_64 +test.test_set.TestSetSubclass.test_keywords_in_subclass @ linux-x86_64 +test.test_set.TestSetSubclass.test_len @ linux-x86_64 +test.test_set.TestSetSubclass.test_new_or_init @ linux-x86_64 +test.test_set.TestSetSubclass.test_or @ linux-x86_64 +test.test_set.TestSetSubclass.test_pickling @ linux-x86_64 +test.test_set.TestSetSubclass.test_pop @ linux-x86_64 +test.test_set.TestSetSubclass.test_remove @ linux-x86_64 +test.test_set.TestSetSubclass.test_remove_keyerror_set @ linux-x86_64 +test.test_set.TestSetSubclass.test_remove_keyerror_unpacking @ linux-x86_64 +test.test_set.TestSetSubclass.test_rich_compare @ linux-x86_64 +test.test_set.TestSetSubclass.test_setOfFrozensets @ linux-x86_64 +test.test_set.TestSetSubclass.test_set_literal @ linux-x86_64 +test.test_set.TestSetSubclass.test_set_literal_evaluation_order @ linux-x86_64 +test.test_set.TestSetSubclass.test_set_literal_insertion_order @ linux-x86_64 +test.test_set.TestSetSubclass.test_sub @ linux-x86_64 +test.test_set.TestSetSubclass.test_sub_and_super @ linux-x86_64 +test.test_set.TestSetSubclass.test_subclass_with_custom_hash @ linux-x86_64 +test.test_set.TestSetSubclass.test_symmetric_difference @ linux-x86_64 +test.test_set.TestSetSubclass.test_symmetric_difference_update @ linux-x86_64 +test.test_set.TestSetSubclass.test_union @ linux-x86_64 +test.test_set.TestSetSubclass.test_uniquification @ linux-x86_64 +test.test_set.TestSetSubclass.test_update @ linux-x86_64 +test.test_set.TestSetSubclass.test_xor @ linux-x86_64 +test.test_set.TestSetSubclassWithSlots.test_pickling @ linux-x86_64 +test.test_set.TestSubsetEmptyNonEmpty.test_issubset @ linux-x86_64 +test.test_set.TestSubsetEqualEmpty.test_issubset @ linux-x86_64 +test.test_set.TestSubsetEqualNonEmpty.test_issubset @ linux-x86_64 +test.test_set.TestSubsetNonOverlap.test_issubset @ linux-x86_64 +test.test_set.TestSubsetPartial.test_issubset @ linux-x86_64 +test.test_set.TestUpdateOps.test_difference_method_call @ linux-x86_64 +test.test_set.TestUpdateOps.test_difference_non_overlap @ linux-x86_64 +test.test_set.TestUpdateOps.test_difference_overlap @ linux-x86_64 +test.test_set.TestUpdateOps.test_difference_subset @ linux-x86_64 +test.test_set.TestUpdateOps.test_difference_superset @ linux-x86_64 +test.test_set.TestUpdateOps.test_intersection_method_call @ linux-x86_64 +test.test_set.TestUpdateOps.test_intersection_non_overlap @ linux-x86_64 +test.test_set.TestUpdateOps.test_intersection_overlap @ linux-x86_64 +test.test_set.TestUpdateOps.test_intersection_subset @ linux-x86_64 +test.test_set.TestUpdateOps.test_intersection_superset @ linux-x86_64 +test.test_set.TestUpdateOps.test_sym_difference_method_call @ linux-x86_64 +test.test_set.TestUpdateOps.test_sym_difference_non_overlap @ linux-x86_64 +test.test_set.TestUpdateOps.test_sym_difference_overlap @ linux-x86_64 +test.test_set.TestUpdateOps.test_sym_difference_subset @ linux-x86_64 +test.test_set.TestUpdateOps.test_sym_difference_superset @ linux-x86_64 +test.test_set.TestUpdateOps.test_union_method_call @ linux-x86_64 +test.test_set.TestUpdateOps.test_union_non_overlap @ linux-x86_64 +test.test_set.TestUpdateOps.test_union_overlap @ linux-x86_64 +test.test_set.TestUpdateOps.test_union_subset @ linux-x86_64 +test.test_set.TestUpdateOps.test_union_superset @ linux-x86_64 +test.test_set.TestVariousIteratorArgs.test_constructor @ linux-x86_64 +test.test_set.TestVariousIteratorArgs.test_inline_methods @ linux-x86_64 +test.test_set.TestVariousIteratorArgs.test_inplace_methods @ linux-x86_64 +test.test_set.TestWeirdBugs.test_8420_set_merge @ linux-x86_64 +test.test_set.TestWeirdBugs.test_iter_and_mutate @ linux-x86_64 +test.test_set.TestWeirdBugs.test_merge_and_mutate @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_setcomps.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_setcomps.txt new file mode 100644 index 0000000000..f8ef442fba --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_setcomps.txt @@ -0,0 +1 @@ +DocTestCase.test.test_setcomps.__test__.doctests @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_shelve.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_shelve.txt new file mode 100644 index 0000000000..78ac459080 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_shelve.txt @@ -0,0 +1,182 @@ +test.test_shelve.TestCase.test_ascii_file_shelf @ linux-x86_64 +test.test_shelve.TestCase.test_binary_file_shelf @ linux-x86_64 +test.test_shelve.TestCase.test_bytes_path_file_shelf @ linux-x86_64 +test.test_shelve.TestCase.test_close @ linux-x86_64 +test.test_shelve.TestCase.test_default_protocol @ linux-x86_64 +test.test_shelve.TestCase.test_in_memory_shelf @ linux-x86_64 +test.test_shelve.TestCase.test_keyencoding @ linux-x86_64 +test.test_shelve.TestCase.test_mutable_entry @ linux-x86_64 +test.test_shelve.TestCase.test_open_template @ linux-x86_64 +test.test_shelve.TestCase.test_pathlib_bytes_path_file_shelf @ linux-x86_64 +test.test_shelve.TestCase.test_pathlib_path_file_shelf @ linux-x86_64 +test.test_shelve.TestCase.test_proto2_file_shelf @ linux-x86_64 +test.test_shelve.TestCase.test_with @ linux-x86_64 +test.test_shelve.TestCase.test_writeback_also_writes_immediately @ linux-x86_64 +test.test_shelve.TestProto0File_dumbShelve.test_bool @ linux-x86_64 +test.test_shelve.TestProto0File_dumbShelve.test_constructor @ linux-x86_64 +test.test_shelve.TestProto0File_dumbShelve.test_get @ linux-x86_64 +test.test_shelve.TestProto0File_dumbShelve.test_getitem @ linux-x86_64 +test.test_shelve.TestProto0File_dumbShelve.test_items @ linux-x86_64 +test.test_shelve.TestProto0File_dumbShelve.test_keys @ linux-x86_64 +test.test_shelve.TestProto0File_dumbShelve.test_len @ linux-x86_64 +test.test_shelve.TestProto0File_dumbShelve.test_pop @ linux-x86_64 +test.test_shelve.TestProto0File_dumbShelve.test_popitem @ linux-x86_64 +test.test_shelve.TestProto0File_dumbShelve.test_read @ linux-x86_64 +test.test_shelve.TestProto0File_dumbShelve.test_setdefault @ linux-x86_64 +test.test_shelve.TestProto0File_dumbShelve.test_update @ linux-x86_64 +test.test_shelve.TestProto0File_dumbShelve.test_values @ linux-x86_64 +test.test_shelve.TestProto0File_dumbShelve.test_write @ linux-x86_64 +test.test_shelve.TestProto0MemShelve.test_bool @ linux-x86_64 +test.test_shelve.TestProto0MemShelve.test_constructor @ linux-x86_64 +test.test_shelve.TestProto0MemShelve.test_get @ linux-x86_64 +test.test_shelve.TestProto0MemShelve.test_getitem @ linux-x86_64 +test.test_shelve.TestProto0MemShelve.test_items @ linux-x86_64 +test.test_shelve.TestProto0MemShelve.test_keys @ linux-x86_64 +test.test_shelve.TestProto0MemShelve.test_len @ linux-x86_64 +test.test_shelve.TestProto0MemShelve.test_pop @ linux-x86_64 +test.test_shelve.TestProto0MemShelve.test_popitem @ linux-x86_64 +test.test_shelve.TestProto0MemShelve.test_read @ linux-x86_64 +test.test_shelve.TestProto0MemShelve.test_setdefault @ linux-x86_64 +test.test_shelve.TestProto0MemShelve.test_update @ linux-x86_64 +test.test_shelve.TestProto0MemShelve.test_values @ linux-x86_64 +test.test_shelve.TestProto0MemShelve.test_write @ linux-x86_64 +test.test_shelve.TestProto1File_dumbShelve.test_bool @ linux-x86_64 +test.test_shelve.TestProto1File_dumbShelve.test_constructor @ linux-x86_64 +test.test_shelve.TestProto1File_dumbShelve.test_get @ linux-x86_64 +test.test_shelve.TestProto1File_dumbShelve.test_getitem @ linux-x86_64 +test.test_shelve.TestProto1File_dumbShelve.test_items @ linux-x86_64 +test.test_shelve.TestProto1File_dumbShelve.test_keys @ linux-x86_64 +test.test_shelve.TestProto1File_dumbShelve.test_len @ linux-x86_64 +test.test_shelve.TestProto1File_dumbShelve.test_pop @ linux-x86_64 +test.test_shelve.TestProto1File_dumbShelve.test_popitem @ linux-x86_64 +test.test_shelve.TestProto1File_dumbShelve.test_read @ linux-x86_64 +test.test_shelve.TestProto1File_dumbShelve.test_setdefault @ linux-x86_64 +test.test_shelve.TestProto1File_dumbShelve.test_update @ linux-x86_64 +test.test_shelve.TestProto1File_dumbShelve.test_values @ linux-x86_64 +test.test_shelve.TestProto1File_dumbShelve.test_write @ linux-x86_64 +test.test_shelve.TestProto1MemShelve.test_bool @ linux-x86_64 +test.test_shelve.TestProto1MemShelve.test_constructor @ linux-x86_64 +test.test_shelve.TestProto1MemShelve.test_get @ linux-x86_64 +test.test_shelve.TestProto1MemShelve.test_getitem @ linux-x86_64 +test.test_shelve.TestProto1MemShelve.test_items @ linux-x86_64 +test.test_shelve.TestProto1MemShelve.test_keys @ linux-x86_64 +test.test_shelve.TestProto1MemShelve.test_len @ linux-x86_64 +test.test_shelve.TestProto1MemShelve.test_pop @ linux-x86_64 +test.test_shelve.TestProto1MemShelve.test_popitem @ linux-x86_64 +test.test_shelve.TestProto1MemShelve.test_read @ linux-x86_64 +test.test_shelve.TestProto1MemShelve.test_setdefault @ linux-x86_64 +test.test_shelve.TestProto1MemShelve.test_update @ linux-x86_64 +test.test_shelve.TestProto1MemShelve.test_values @ linux-x86_64 +test.test_shelve.TestProto1MemShelve.test_write @ linux-x86_64 +test.test_shelve.TestProto2File_dumbShelve.test_bool @ linux-x86_64 +test.test_shelve.TestProto2File_dumbShelve.test_constructor @ linux-x86_64 +test.test_shelve.TestProto2File_dumbShelve.test_get @ linux-x86_64 +test.test_shelve.TestProto2File_dumbShelve.test_getitem @ linux-x86_64 +test.test_shelve.TestProto2File_dumbShelve.test_items @ linux-x86_64 +test.test_shelve.TestProto2File_dumbShelve.test_keys @ linux-x86_64 +test.test_shelve.TestProto2File_dumbShelve.test_len @ linux-x86_64 +test.test_shelve.TestProto2File_dumbShelve.test_pop @ linux-x86_64 +test.test_shelve.TestProto2File_dumbShelve.test_popitem @ linux-x86_64 +test.test_shelve.TestProto2File_dumbShelve.test_read @ linux-x86_64 +test.test_shelve.TestProto2File_dumbShelve.test_setdefault @ linux-x86_64 +test.test_shelve.TestProto2File_dumbShelve.test_update @ linux-x86_64 +test.test_shelve.TestProto2File_dumbShelve.test_values @ linux-x86_64 +test.test_shelve.TestProto2File_dumbShelve.test_write @ linux-x86_64 +test.test_shelve.TestProto2MemShelve.test_bool @ linux-x86_64 +test.test_shelve.TestProto2MemShelve.test_constructor @ linux-x86_64 +test.test_shelve.TestProto2MemShelve.test_get @ linux-x86_64 +test.test_shelve.TestProto2MemShelve.test_getitem @ linux-x86_64 +test.test_shelve.TestProto2MemShelve.test_items @ linux-x86_64 +test.test_shelve.TestProto2MemShelve.test_keys @ linux-x86_64 +test.test_shelve.TestProto2MemShelve.test_len @ linux-x86_64 +test.test_shelve.TestProto2MemShelve.test_pop @ linux-x86_64 +test.test_shelve.TestProto2MemShelve.test_popitem @ linux-x86_64 +test.test_shelve.TestProto2MemShelve.test_read @ linux-x86_64 +test.test_shelve.TestProto2MemShelve.test_setdefault @ linux-x86_64 +test.test_shelve.TestProto2MemShelve.test_update @ linux-x86_64 +test.test_shelve.TestProto2MemShelve.test_values @ linux-x86_64 +test.test_shelve.TestProto2MemShelve.test_write @ linux-x86_64 +test.test_shelve.TestProto3File_dumbShelve.test_bool @ linux-x86_64 +test.test_shelve.TestProto3File_dumbShelve.test_constructor @ linux-x86_64 +test.test_shelve.TestProto3File_dumbShelve.test_get @ linux-x86_64 +test.test_shelve.TestProto3File_dumbShelve.test_getitem @ linux-x86_64 +test.test_shelve.TestProto3File_dumbShelve.test_items @ linux-x86_64 +test.test_shelve.TestProto3File_dumbShelve.test_keys @ linux-x86_64 +test.test_shelve.TestProto3File_dumbShelve.test_len @ linux-x86_64 +test.test_shelve.TestProto3File_dumbShelve.test_pop @ linux-x86_64 +test.test_shelve.TestProto3File_dumbShelve.test_popitem @ linux-x86_64 +test.test_shelve.TestProto3File_dumbShelve.test_read @ linux-x86_64 +test.test_shelve.TestProto3File_dumbShelve.test_setdefault @ linux-x86_64 +test.test_shelve.TestProto3File_dumbShelve.test_update @ linux-x86_64 +test.test_shelve.TestProto3File_dumbShelve.test_values @ linux-x86_64 +test.test_shelve.TestProto3File_dumbShelve.test_write @ linux-x86_64 +test.test_shelve.TestProto3MemShelve.test_bool @ linux-x86_64 +test.test_shelve.TestProto3MemShelve.test_constructor @ linux-x86_64 +test.test_shelve.TestProto3MemShelve.test_get @ linux-x86_64 +test.test_shelve.TestProto3MemShelve.test_getitem @ linux-x86_64 +test.test_shelve.TestProto3MemShelve.test_items @ linux-x86_64 +test.test_shelve.TestProto3MemShelve.test_keys @ linux-x86_64 +test.test_shelve.TestProto3MemShelve.test_len @ linux-x86_64 +test.test_shelve.TestProto3MemShelve.test_pop @ linux-x86_64 +test.test_shelve.TestProto3MemShelve.test_popitem @ linux-x86_64 +test.test_shelve.TestProto3MemShelve.test_read @ linux-x86_64 +test.test_shelve.TestProto3MemShelve.test_setdefault @ linux-x86_64 +test.test_shelve.TestProto3MemShelve.test_update @ linux-x86_64 +test.test_shelve.TestProto3MemShelve.test_values @ linux-x86_64 +test.test_shelve.TestProto3MemShelve.test_write @ linux-x86_64 +test.test_shelve.TestProto4File_dumbShelve.test_bool @ linux-x86_64 +test.test_shelve.TestProto4File_dumbShelve.test_constructor @ linux-x86_64 +test.test_shelve.TestProto4File_dumbShelve.test_get @ linux-x86_64 +test.test_shelve.TestProto4File_dumbShelve.test_getitem @ linux-x86_64 +test.test_shelve.TestProto4File_dumbShelve.test_items @ linux-x86_64 +test.test_shelve.TestProto4File_dumbShelve.test_keys @ linux-x86_64 +test.test_shelve.TestProto4File_dumbShelve.test_len @ linux-x86_64 +test.test_shelve.TestProto4File_dumbShelve.test_pop @ linux-x86_64 +test.test_shelve.TestProto4File_dumbShelve.test_popitem @ linux-x86_64 +test.test_shelve.TestProto4File_dumbShelve.test_read @ linux-x86_64 +test.test_shelve.TestProto4File_dumbShelve.test_setdefault @ linux-x86_64 +test.test_shelve.TestProto4File_dumbShelve.test_update @ linux-x86_64 +test.test_shelve.TestProto4File_dumbShelve.test_values @ linux-x86_64 +test.test_shelve.TestProto4File_dumbShelve.test_write @ linux-x86_64 +test.test_shelve.TestProto4MemShelve.test_bool @ linux-x86_64 +test.test_shelve.TestProto4MemShelve.test_constructor @ linux-x86_64 +test.test_shelve.TestProto4MemShelve.test_get @ linux-x86_64 +test.test_shelve.TestProto4MemShelve.test_getitem @ linux-x86_64 +test.test_shelve.TestProto4MemShelve.test_items @ linux-x86_64 +test.test_shelve.TestProto4MemShelve.test_keys @ linux-x86_64 +test.test_shelve.TestProto4MemShelve.test_len @ linux-x86_64 +test.test_shelve.TestProto4MemShelve.test_pop @ linux-x86_64 +test.test_shelve.TestProto4MemShelve.test_popitem @ linux-x86_64 +test.test_shelve.TestProto4MemShelve.test_read @ linux-x86_64 +test.test_shelve.TestProto4MemShelve.test_setdefault @ linux-x86_64 +test.test_shelve.TestProto4MemShelve.test_update @ linux-x86_64 +test.test_shelve.TestProto4MemShelve.test_values @ linux-x86_64 +test.test_shelve.TestProto4MemShelve.test_write @ linux-x86_64 +test.test_shelve.TestProto5File_dumbShelve.test_bool @ linux-x86_64 +test.test_shelve.TestProto5File_dumbShelve.test_constructor @ linux-x86_64 +test.test_shelve.TestProto5File_dumbShelve.test_get @ linux-x86_64 +test.test_shelve.TestProto5File_dumbShelve.test_getitem @ linux-x86_64 +test.test_shelve.TestProto5File_dumbShelve.test_items @ linux-x86_64 +test.test_shelve.TestProto5File_dumbShelve.test_keys @ linux-x86_64 +test.test_shelve.TestProto5File_dumbShelve.test_len @ linux-x86_64 +test.test_shelve.TestProto5File_dumbShelve.test_pop @ linux-x86_64 +test.test_shelve.TestProto5File_dumbShelve.test_popitem @ linux-x86_64 +test.test_shelve.TestProto5File_dumbShelve.test_read @ linux-x86_64 +test.test_shelve.TestProto5File_dumbShelve.test_setdefault @ linux-x86_64 +test.test_shelve.TestProto5File_dumbShelve.test_update @ linux-x86_64 +test.test_shelve.TestProto5File_dumbShelve.test_values @ linux-x86_64 +test.test_shelve.TestProto5File_dumbShelve.test_write @ linux-x86_64 +test.test_shelve.TestProto5MemShelve.test_bool @ linux-x86_64 +test.test_shelve.TestProto5MemShelve.test_constructor @ linux-x86_64 +test.test_shelve.TestProto5MemShelve.test_get @ linux-x86_64 +test.test_shelve.TestProto5MemShelve.test_getitem @ linux-x86_64 +test.test_shelve.TestProto5MemShelve.test_items @ linux-x86_64 +test.test_shelve.TestProto5MemShelve.test_keys @ linux-x86_64 +test.test_shelve.TestProto5MemShelve.test_len @ linux-x86_64 +test.test_shelve.TestProto5MemShelve.test_pop @ linux-x86_64 +test.test_shelve.TestProto5MemShelve.test_popitem @ linux-x86_64 +test.test_shelve.TestProto5MemShelve.test_read @ linux-x86_64 +test.test_shelve.TestProto5MemShelve.test_setdefault @ linux-x86_64 +test.test_shelve.TestProto5MemShelve.test_update @ linux-x86_64 +test.test_shelve.TestProto5MemShelve.test_values @ linux-x86_64 +test.test_shelve.TestProto5MemShelve.test_write @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_shlex.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_shlex.txt new file mode 100644 index 0000000000..764d525fd5 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_shlex.txt @@ -0,0 +1,18 @@ +test.test_shlex.ShlexTest.testCompat @ linux-x86_64 +test.test_shlex.ShlexTest.testEmptyStringHandling @ linux-x86_64 +test.test_shlex.ShlexTest.testJoin @ linux-x86_64 +test.test_shlex.ShlexTest.testJoinRoundtrip @ linux-x86_64 +test.test_shlex.ShlexTest.testPunctuationCharsReadOnly @ linux-x86_64 +test.test_shlex.ShlexTest.testPunctuationInWordChars @ linux-x86_64 +test.test_shlex.ShlexTest.testPunctuationWithPosix @ linux-x86_64 +test.test_shlex.ShlexTest.testPunctuationWithWhitespaceSplit @ linux-x86_64 +test.test_shlex.ShlexTest.testQuote @ linux-x86_64 +test.test_shlex.ShlexTest.testSplitNoneDeprecation @ linux-x86_64 +test.test_shlex.ShlexTest.testSplitPosix @ linux-x86_64 +test.test_shlex.ShlexTest.testSyntaxSplitAmpersandAndPipe @ linux-x86_64 +test.test_shlex.ShlexTest.testSyntaxSplitCustom @ linux-x86_64 +test.test_shlex.ShlexTest.testSyntaxSplitParen @ linux-x86_64 +test.test_shlex.ShlexTest.testSyntaxSplitRedirect @ linux-x86_64 +test.test_shlex.ShlexTest.testSyntaxSplitSemicolon @ linux-x86_64 +test.test_shlex.ShlexTest.testTokenTypes @ linux-x86_64 +test.test_shlex.ShlexTest.testUnicodeHandling @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_shutil.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_shutil.txt new file mode 100644 index 0000000000..a3f4758b9d --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_shutil.txt @@ -0,0 +1,122 @@ +test.test_shutil.PublicAPITests.test_module_all_attribute @ linux-x86_64 +test.test_shutil.TestArchives.test_make_archive @ linux-x86_64 +test.test_shutil.TestArchives.test_make_archive_cwd @ linux-x86_64 +test.test_shutil.TestArchives.test_make_archive_owner_group @ linux-x86_64 +test.test_shutil.TestArchives.test_make_tarball @ linux-x86_64 +test.test_shutil.TestArchives.test_make_tarfile_in_curdir @ linux-x86_64 +test.test_shutil.TestArchives.test_make_tarfile_rootdir_nodir @ linux-x86_64 +test.test_shutil.TestArchives.test_make_zipfile @ linux-x86_64 +test.test_shutil.TestArchives.test_make_zipfile_in_curdir @ linux-x86_64 +test.test_shutil.TestArchives.test_make_zipfile_rootdir_nodir @ linux-x86_64 +test.test_shutil.TestArchives.test_register_archive_format @ linux-x86_64 +test.test_shutil.TestArchives.test_tarfile_vs_tar @ linux-x86_64 +test.test_shutil.TestArchives.test_unpack_archive_bztar @ linux-x86_64 +test.test_shutil.TestArchives.test_unpack_archive_gztar @ linux-x86_64 +test.test_shutil.TestArchives.test_unpack_archive_tar @ linux-x86_64 +test.test_shutil.TestArchives.test_unpack_archive_xztar @ linux-x86_64 +test.test_shutil.TestArchives.test_unpack_archive_zip @ linux-x86_64 +test.test_shutil.TestArchives.test_unpack_registry @ linux-x86_64 +test.test_shutil.TestArchives.test_unzip_zipfile @ linux-x86_64 +test.test_shutil.TestArchives.test_zipfile_vs_zip @ linux-x86_64 +test.test_shutil.TestCopy.test_copy @ linux-x86_64 +test.test_shutil.TestCopy.test_copy2 @ linux-x86_64 +test.test_shutil.TestCopy.test_copy2_dir @ linux-x86_64 +test.test_shutil.TestCopy.test_copy2_symlinks @ linux-x86_64 +test.test_shutil.TestCopy.test_copy_dir @ linux-x86_64 +test.test_shutil.TestCopy.test_copy_return_value @ linux-x86_64 +test.test_shutil.TestCopy.test_copy_symlinks @ linux-x86_64 +test.test_shutil.TestCopy.test_copyfile_copy_dir @ linux-x86_64 +test.test_shutil.TestCopy.test_copyfile_nonexistent_dir @ linux-x86_64 +test.test_shutil.TestCopy.test_copyfile_return_value @ linux-x86_64 +test.test_shutil.TestCopy.test_copyfile_same_file @ linux-x86_64 +test.test_shutil.TestCopy.test_copyfile_symlinks @ linux-x86_64 +test.test_shutil.TestCopy.test_copymode_follow_symlinks @ linux-x86_64 +test.test_shutil.TestCopy.test_copymode_symlink_to_symlink_wo_lchmod @ linux-x86_64 +test.test_shutil.TestCopy.test_copystat_symlinks @ linux-x86_64 +test.test_shutil.TestCopy.test_dont_copy_file_onto_link_to_itself @ linux-x86_64 +test.test_shutil.TestCopy.test_dont_copy_file_onto_symlink_to_itself @ linux-x86_64 +test.test_shutil.TestCopyFile.test_w_dest_close_fails @ linux-x86_64 +test.test_shutil.TestCopyFile.test_w_dest_open_fails @ linux-x86_64 +test.test_shutil.TestCopyFile.test_w_source_close_fails @ linux-x86_64 +test.test_shutil.TestCopyFile.test_w_source_open_fails @ linux-x86_64 +test.test_shutil.TestCopyFileObj.test_content @ linux-x86_64 +test.test_shutil.TestCopyFileObj.test_file_not_closed @ linux-x86_64 +test.test_shutil.TestCopyFileObj.test_file_offset @ linux-x86_64 +test.test_shutil.TestCopyTree.test_copytree_arg_types_of_ignore @ linux-x86_64 +test.test_shutil.TestCopyTree.test_copytree_custom_copy_function @ linux-x86_64 +test.test_shutil.TestCopyTree.test_copytree_dangling_symlinks @ linux-x86_64 +test.test_shutil.TestCopyTree.test_copytree_dirs_exist_ok @ linux-x86_64 +test.test_shutil.TestCopyTree.test_copytree_retains_permissions @ linux-x86_64 +test.test_shutil.TestCopyTree.test_copytree_return_value @ linux-x86_64 +test.test_shutil.TestCopyTree.test_copytree_simple @ linux-x86_64 +test.test_shutil.TestCopyTree.test_copytree_special_func @ linux-x86_64 +test.test_shutil.TestCopyTree.test_copytree_subdirectory @ linux-x86_64 +test.test_shutil.TestCopyTree.test_copytree_symlink_dir @ linux-x86_64 +test.test_shutil.TestCopyTree.test_copytree_symlinks @ linux-x86_64 +test.test_shutil.TestCopyTree.test_copytree_winerror @ linux-x86_64 +test.test_shutil.TestCopyTree.test_copytree_with_exclude @ linux-x86_64 +test.test_shutil.TestGetTerminalSize.test_bad_environ @ linux-x86_64 +test.test_shutil.TestGetTerminalSize.test_does_not_crash @ linux-x86_64 +test.test_shutil.TestGetTerminalSize.test_fallback @ linux-x86_64 +test.test_shutil.TestGetTerminalSize.test_os_environ_first @ linux-x86_64 +test.test_shutil.TestMisc.test_disk_usage @ linux-x86_64 +test.test_shutil.TestMove.test_destinsrc_false_negative @ linux-x86_64 +test.test_shutil.TestMove.test_destinsrc_false_positive @ linux-x86_64 +test.test_shutil.TestMove.test_dont_move_dir_in_itself @ linux-x86_64 +test.test_shutil.TestMove.test_existing_file_inside_dest_dir @ linux-x86_64 +test.test_shutil.TestMove.test_move_as_rename_return_value @ linux-x86_64 +test.test_shutil.TestMove.test_move_dangling_symlink @ linux-x86_64 +test.test_shutil.TestMove.test_move_dir @ linux-x86_64 +test.test_shutil.TestMove.test_move_dir_caseinsensitive @ linux-x86_64 +test.test_shutil.TestMove.test_move_dir_other_fs @ linux-x86_64 +test.test_shutil.TestMove.test_move_dir_sep_to_dir @ linux-x86_64 +test.test_shutil.TestMove.test_move_dir_special_function @ linux-x86_64 +test.test_shutil.TestMove.test_move_dir_symlink @ linux-x86_64 +test.test_shutil.TestMove.test_move_dir_to_dir @ linux-x86_64 +test.test_shutil.TestMove.test_move_dir_to_dir_other_fs @ linux-x86_64 +test.test_shutil.TestMove.test_move_file @ linux-x86_64 +test.test_shutil.TestMove.test_move_file_other_fs @ linux-x86_64 +test.test_shutil.TestMove.test_move_file_special_function @ linux-x86_64 +test.test_shutil.TestMove.test_move_file_symlink @ linux-x86_64 +test.test_shutil.TestMove.test_move_file_symlink_to_dir @ linux-x86_64 +test.test_shutil.TestMove.test_move_file_to_dir @ linux-x86_64 +test.test_shutil.TestMove.test_move_file_to_dir_other_fs @ linux-x86_64 +test.test_shutil.TestMove.test_move_file_to_dir_pathlike_dst @ linux-x86_64 +test.test_shutil.TestMove.test_move_file_to_dir_pathlike_src @ linux-x86_64 +test.test_shutil.TestMove.test_move_return_value @ linux-x86_64 +test.test_shutil.TestRmTree.test_on_error @ linux-x86_64 +test.test_shutil.TestRmTree.test_rmtree_does_not_choke_on_failing_lstat @ linux-x86_64 +test.test_shutil.TestRmTree.test_rmtree_dont_delete_file @ linux-x86_64 +test.test_shutil.TestRmTree.test_rmtree_errors @ linux-x86_64 +test.test_shutil.TestRmTree.test_rmtree_fails_on_symlink @ linux-x86_64 +test.test_shutil.TestRmTree.test_rmtree_on_symlink @ linux-x86_64 +test.test_shutil.TestRmTree.test_rmtree_uses_safe_fd_version_if_available @ linux-x86_64 +test.test_shutil.TestRmTree.test_rmtree_with_dir_fd @ linux-x86_64 +test.test_shutil.TestRmTree.test_rmtree_works_on_bytes @ linux-x86_64 +test.test_shutil.TestRmTree.test_rmtree_works_on_symlinks @ linux-x86_64 +test.test_shutil.TestWhich.test_absolute_cmd @ linux-x86_64 +test.test_shutil.TestWhich.test_basic @ linux-x86_64 +test.test_shutil.TestWhich.test_cwd @ linux-x86_64 +test.test_shutil.TestWhich.test_empty_path @ linux-x86_64 +test.test_shutil.TestWhich.test_empty_path_no_PATH @ linux-x86_64 +test.test_shutil.TestWhich.test_environ_path @ linux-x86_64 +test.test_shutil.TestWhich.test_environ_path_cwd @ linux-x86_64 +test.test_shutil.TestWhich.test_environ_path_empty @ linux-x86_64 +test.test_shutil.TestWhich.test_environ_path_missing @ linux-x86_64 +test.test_shutil.TestWhich.test_non_matching_mode @ linux-x86_64 +test.test_shutil.TestWhich.test_nonexistent_file @ linux-x86_64 +test.test_shutil.TestWhich.test_relative_cmd @ linux-x86_64 +test.test_shutil.TestWhich.test_relative_path @ linux-x86_64 +test.test_shutil.TestWhichBytes.test_absolute_cmd @ linux-x86_64 +test.test_shutil.TestWhichBytes.test_basic @ linux-x86_64 +test.test_shutil.TestWhichBytes.test_cwd @ linux-x86_64 +test.test_shutil.TestWhichBytes.test_empty_path @ linux-x86_64 +test.test_shutil.TestWhichBytes.test_empty_path_no_PATH @ linux-x86_64 +test.test_shutil.TestWhichBytes.test_environ_path @ linux-x86_64 +test.test_shutil.TestWhichBytes.test_environ_path_cwd @ linux-x86_64 +test.test_shutil.TestWhichBytes.test_environ_path_empty @ linux-x86_64 +test.test_shutil.TestWhichBytes.test_environ_path_missing @ linux-x86_64 +test.test_shutil.TestWhichBytes.test_non_matching_mode @ linux-x86_64 +test.test_shutil.TestWhichBytes.test_nonexistent_file @ linux-x86_64 +test.test_shutil.TestWhichBytes.test_relative_cmd @ linux-x86_64 +test.test_shutil.TestWhichBytes.test_relative_path @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_signal.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_signal.txt new file mode 100644 index 0000000000..1325360e70 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_signal.txt @@ -0,0 +1,7 @@ +test.test_signal.GenericTests.test_enums @ linux-x86_64 +test.test_signal.GenericTests.test_functions_module_attr @ linux-x86_64 +test.test_signal.ItimerTest.test_setitimer_tiny @ linux-x86_64 +test.test_signal.PosixTests.test_getsignal @ linux-x86_64 +test.test_signal.PosixTests.test_setting_signal_handler_to_none_raises_error @ linux-x86_64 +test.test_signal.PosixTests.test_valid_signals @ linux-x86_64 +test.test_signal.SiginterruptTest.test_siginterrupt_off @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_site.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_site.txt new file mode 100644 index 0000000000..6439b71adf --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_site.txt @@ -0,0 +1,26 @@ +test.test_site.HelperFunctionsTests.test__getuserbase @ linux-x86_64 +test.test_site.HelperFunctionsTests.test_addpackage @ linux-x86_64 +test.test_site.HelperFunctionsTests.test_addpackage_empty_lines @ linux-x86_64 +test.test_site.HelperFunctionsTests.test_addpackage_import_bad_exec @ linux-x86_64 +test.test_site.HelperFunctionsTests.test_addpackage_import_bad_pth_file @ linux-x86_64 +test.test_site.HelperFunctionsTests.test_addpackage_import_bad_syntax @ linux-x86_64 +test.test_site.HelperFunctionsTests.test_addsitedir @ linux-x86_64 +test.test_site.HelperFunctionsTests.test_get_path @ linux-x86_64 +test.test_site.HelperFunctionsTests.test_getsitepackages @ linux-x86_64 +test.test_site.HelperFunctionsTests.test_getuserbase @ linux-x86_64 +test.test_site.HelperFunctionsTests.test_getusersitepackages @ linux-x86_64 +test.test_site.HelperFunctionsTests.test_init_pathinfo @ linux-x86_64 +test.test_site.HelperFunctionsTests.test_makepath @ linux-x86_64 +test.test_site.HelperFunctionsTests.test_no_home_directory @ linux-x86_64 +test.test_site.HelperFunctionsTests.test_s_option @ linux-x86_64 +test.test_site.HelperFunctionsTests.test_trace @ linux-x86_64 +test.test_site.ImportSideEffectTests.test_abs_paths_cached_None @ linux-x86_64 +test.test_site.ImportSideEffectTests.test_license_exists_at_url @ linux-x86_64 +test.test_site.ImportSideEffectTests.test_no_duplicate_paths @ linux-x86_64 +test.test_site.ImportSideEffectTests.test_setting_copyright @ linux-x86_64 +test.test_site.ImportSideEffectTests.test_setting_help @ linux-x86_64 +test.test_site.ImportSideEffectTests.test_setting_quit @ linux-x86_64 +test.test_site.ImportSideEffectTests.test_sitecustomize_executed @ linux-x86_64 +test.test_site.StartupImportTests.test_startup_interactivehook @ linux-x86_64 +test.test_site.StartupImportTests.test_startup_interactivehook_isolated @ linux-x86_64 +test.test_site.StartupImportTests.test_startup_interactivehook_isolated_explicit @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_slice.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_slice.txt new file mode 100644 index 0000000000..1fa0f1150d --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_slice.txt @@ -0,0 +1,10 @@ +test.test_slice.SliceTest.test_cmp @ linux-x86_64 +test.test_slice.SliceTest.test_constructor @ linux-x86_64 +test.test_slice.SliceTest.test_copy @ linux-x86_64 +test.test_slice.SliceTest.test_deepcopy @ linux-x86_64 +test.test_slice.SliceTest.test_hash @ linux-x86_64 +test.test_slice.SliceTest.test_indices @ linux-x86_64 +test.test_slice.SliceTest.test_members @ linux-x86_64 +test.test_slice.SliceTest.test_pickle @ linux-x86_64 +test.test_slice.SliceTest.test_repr @ linux-x86_64 +test.test_slice.SliceTest.test_setslice_without_getslice @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_smtpd.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_smtpd.txt new file mode 100644 index 0000000000..ca22feab86 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_smtpd.txt @@ -0,0 +1,153 @@ +test.test_smtpd.DebuggingServerTest.test_process_SMTPUTF8_message_with_enable_SMTPUTF8_true @ linux-x86_64 +test.test_smtpd.DebuggingServerTest.test_process_message_with_decode_data_false @ linux-x86_64 +test.test_smtpd.DebuggingServerTest.test_process_message_with_decode_data_true @ linux-x86_64 +test.test_smtpd.DebuggingServerTest.test_process_message_with_enable_SMTPUTF8_true @ linux-x86_64 +test.test_smtpd.MiscTestCase.test__all__ @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_DATA_syntax @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_EHLO @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_EHLO_HELO_duplicate @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_EHLO_bad_syntax @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_EHLO_duplicate @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_EXPN_not_implemented @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELO @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_EHLO_duplicate @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_NOOP @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_QUIT @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_RSET @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_bad_syntax @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_duplicate @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELO_parameter_rejected_when_extensions_not_enabled @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELP @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELP_command @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_HELP_command_unknown @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_RCPT_unknown_parameters @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_allows_space_after_colon @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_chevrons @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_command_limit_extended_with_SIZE @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_command_rejects_SMTPUTF8_by_default @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_empty_chevrons @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_invalid_size_parameter @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_missing_address @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_quoted_localpart @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_quoted_localpart_no_angles @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_quoted_localpart_with_size @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_quoted_localpart_with_size_no_angles @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_size_parameter @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_size_parameter_larger_than_default_data_size_limit @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_syntax_EHLO @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_MAIL_syntax_HELO @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_NOOP @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_NOOP_bad_syntax @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_QUIT @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_QUIT_arg_ignored @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_RCPT_lowercase_to_OK @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_RCPT_syntax_EHLO @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_RCPT_syntax_HELO @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_RSET @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_RSET_syntax @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_VRFY @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_VRFY_syntax @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_attribute_deprecations @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_bad_state @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_broken_connect @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_command_too_long @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_data_dialog @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_data_longer_than_default_data_size_limit @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_data_transparency_section_4_5_2 @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_decode_data_and_enable_SMTPUTF8_raises @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_extended_MAIL_allows_space_after_colon @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_manual_status @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_missing_data @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_multiple_RCPT @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_need_MAIL @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_need_RCPT @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_nested_MAIL @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_no_HELO_DATA @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_no_HELO_MAIL @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_no_HELO_RCPT @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_server_accept @ linux-x86_64 +test.test_smtpd.SMTPDChannelIPv6Test.test_unknown_command @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_DATA_syntax @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_EHLO @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_EHLO_HELO_duplicate @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_EHLO_bad_syntax @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_EHLO_duplicate @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_EXPN_not_implemented @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_HELO @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_HELO_EHLO_duplicate @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_HELO_NOOP @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_HELO_QUIT @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_HELO_RSET @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_HELO_bad_syntax @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_HELO_duplicate @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_HELO_parameter_rejected_when_extensions_not_enabled @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_HELP @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_HELP_command @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_HELP_command_unknown @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_RCPT_unknown_parameters @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_allows_space_after_colon @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_chevrons @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_command_limit_extended_with_SIZE @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_command_rejects_SMTPUTF8_by_default @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_empty_chevrons @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_invalid_size_parameter @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_missing_address @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_quoted_localpart @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_quoted_localpart_no_angles @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_quoted_localpart_with_size @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_quoted_localpart_with_size_no_angles @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_size_parameter @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_size_parameter_larger_than_default_data_size_limit @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_syntax_EHLO @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_MAIL_syntax_HELO @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_NOOP @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_NOOP_bad_syntax @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_QUIT @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_QUIT_arg_ignored @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_RCPT_lowercase_to_OK @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_RCPT_syntax_EHLO @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_RCPT_syntax_HELO @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_RSET @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_RSET_syntax @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_VRFY @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_VRFY_syntax @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_attribute_deprecations @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_bad_state @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_broken_connect @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_command_too_long @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_data_dialog @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_data_longer_than_default_data_size_limit @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_data_transparency_section_4_5_2 @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_decode_data_and_enable_SMTPUTF8_raises @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_extended_MAIL_allows_space_after_colon @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_manual_status @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_missing_data @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_multiple_RCPT @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_need_MAIL @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_need_RCPT @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_nested_MAIL @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_no_HELO_DATA @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_no_HELO_MAIL @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_no_HELO_RCPT @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_server_accept @ linux-x86_64 +test.test_smtpd.SMTPDChannelTest.test_unknown_command @ linux-x86_64 +test.test_smtpd.SMTPDChannelTestWithEnableSMTPUTF8True.test_MAIL_command_accepts_SMTPUTF8_when_announced @ linux-x86_64 +test.test_smtpd.SMTPDChannelTestWithEnableSMTPUTF8True.test_MAIL_command_limit_extended_with_SIZE_and_SMTPUTF8 @ linux-x86_64 +test.test_smtpd.SMTPDChannelTestWithEnableSMTPUTF8True.test_multiple_emails_with_extended_command_length @ linux-x86_64 +test.test_smtpd.SMTPDChannelTestWithEnableSMTPUTF8True.test_process_smtputf8_message @ linux-x86_64 +test.test_smtpd.SMTPDChannelTestWithEnableSMTPUTF8True.test_utf8_data @ linux-x86_64 +test.test_smtpd.SMTPDChannelWithDataSizeLimitTest.test_data_limit_dialog @ linux-x86_64 +test.test_smtpd.SMTPDChannelWithDataSizeLimitTest.test_data_limit_dialog_too_much_data @ linux-x86_64 +test.test_smtpd.SMTPDChannelWithDecodeDataFalse.test_ascii_data @ linux-x86_64 +test.test_smtpd.SMTPDChannelWithDecodeDataFalse.test_utf8_data @ linux-x86_64 +test.test_smtpd.SMTPDChannelWithDecodeDataTrue.test_ascii_data @ linux-x86_64 +test.test_smtpd.SMTPDChannelWithDecodeDataTrue.test_utf8_data @ linux-x86_64 +test.test_smtpd.SMTPDServerTest.test_decode_data_and_enable_SMTPUTF8_raises @ linux-x86_64 +test.test_smtpd.SMTPDServerTest.test_process_message_unimplemented @ linux-x86_64 +test.test_smtpd.TestFamilyDetection.test_socket_uses_IPv4 @ linux-x86_64 +test.test_smtpd.TestFamilyDetection.test_socket_uses_IPv6 @ linux-x86_64 +test.test_smtpd.TestMailOptionParsing.test_with_decode_data_false @ linux-x86_64 +test.test_smtpd.TestMailOptionParsing.test_with_decode_data_true @ linux-x86_64 +test.test_smtpd.TestMailOptionParsing.test_with_enable_smtputf8_true @ linux-x86_64 +test.test_smtpd.TestRcptOptionParsing.test_nothing_accepted @ linux-x86_64 +test.test_smtpd.TestRcptOptionParsing.test_params_rejected @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_smtplib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_smtplib.txt new file mode 100644 index 0000000000..c5e3f75ed9 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_smtplib.txt @@ -0,0 +1,82 @@ +test.test_smtplib.BadHELOServerTests.testFailingHELO @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testBasic @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testELHO @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testEXPNNotImplemented @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testHELP @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testNOOP @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testRSET @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testSecondHELO @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testSend @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testSendBinary @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testSendMessage @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testSendMessageMultipleResentRaises @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testSendMessageResent @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testSendMessageWithAddresses @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testSendMessageWithMultipleFrom @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testSendMessageWithSomeAddresses @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testSendMessageWithSpecifiedAddresses @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testSendNeedingDotQuote @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testSendNullSender @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testSourceAddress @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.testVRFY @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.test_issue43124_escape_localhostname @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.test_issue43124_escape_options @ linux-x86_64 +test.test_smtplib.DebuggingServerTests.test_issue43124_putcmd_escapes_newline @ linux-x86_64 +test.test_smtplib.DefaultArgumentsTests.testSendMessage @ linux-x86_64 +test.test_smtplib.DefaultArgumentsTests.testSendMessageWithMailOptions @ linux-x86_64 +test.test_smtplib.LMTPGeneralTests.testBasic1 @ linux-x86_64 +test.test_smtplib.LMTPGeneralTests.testBasic2 @ linux-x86_64 +test.test_smtplib.LMTPGeneralTests.testLocalHostName @ linux-x86_64 +test.test_smtplib.LMTPGeneralTests.testQuoteData @ linux-x86_64 +test.test_smtplib.LMTPGeneralTests.testSourceAddress @ linux-x86_64 +test.test_smtplib.LMTPGeneralTests.testTimeoutDefault @ linux-x86_64 +test.test_smtplib.LMTPGeneralTests.testTimeoutNone @ linux-x86_64 +test.test_smtplib.LMTPGeneralTests.testTimeoutValue @ linux-x86_64 +test.test_smtplib.LMTPGeneralTests.testTimeoutZero @ linux-x86_64 +test.test_smtplib.LMTPGeneralTests.testUnixDomainSocketTimeoutDefault @ linux-x86_64 +test.test_smtplib.LMTPGeneralTests.test_debuglevel @ linux-x86_64 +test.test_smtplib.LMTPGeneralTests.test_debuglevel_2 @ linux-x86_64 +test.test_smtplib.NonConnectingTests.testNonnumericPort @ linux-x86_64 +test.test_smtplib.NonConnectingTests.testNotConnected @ linux-x86_64 +test.test_smtplib.NonConnectingTests.testSockAttributeExists @ linux-x86_64 +test.test_smtplib.SMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_auth @ linux-x86_64 +test.test_smtplib.SMTPAUTHInitialResponseSimTests.testAUTH_PLAIN_initial_response_login @ linux-x86_64 +test.test_smtplib.SMTPGeneralTests.testBasic1 @ linux-x86_64 +test.test_smtplib.SMTPGeneralTests.testBasic2 @ linux-x86_64 +test.test_smtplib.SMTPGeneralTests.testLocalHostName @ linux-x86_64 +test.test_smtplib.SMTPGeneralTests.testQuoteData @ linux-x86_64 +test.test_smtplib.SMTPGeneralTests.testSourceAddress @ linux-x86_64 +test.test_smtplib.SMTPGeneralTests.testTimeoutDefault @ linux-x86_64 +test.test_smtplib.SMTPGeneralTests.testTimeoutNone @ linux-x86_64 +test.test_smtplib.SMTPGeneralTests.testTimeoutValue @ linux-x86_64 +test.test_smtplib.SMTPGeneralTests.testTimeoutZero @ linux-x86_64 +test.test_smtplib.SMTPGeneralTests.test_debuglevel @ linux-x86_64 +test.test_smtplib.SMTPGeneralTests.test_debuglevel_2 @ linux-x86_64 +test.test_smtplib.SMTPSimTests.testAUTH_BUGGY @ linux-x86_64 +test.test_smtplib.SMTPSimTests.testAUTH_CRAM_MD5 @ linux-x86_64 +test.test_smtplib.SMTPSimTests.testAUTH_LOGIN @ linux-x86_64 +test.test_smtplib.SMTPSimTests.testAUTH_LOGIN_initial_response_notok @ linux-x86_64 +test.test_smtplib.SMTPSimTests.testAUTH_LOGIN_initial_response_ok @ linux-x86_64 +test.test_smtplib.SMTPSimTests.testAUTH_PLAIN @ linux-x86_64 +test.test_smtplib.SMTPSimTests.testAUTH_multiple @ linux-x86_64 +test.test_smtplib.SMTPSimTests.testBasic @ linux-x86_64 +test.test_smtplib.SMTPSimTests.testEHLO @ linux-x86_64 +test.test_smtplib.SMTPSimTests.testEXPN @ linux-x86_64 +test.test_smtplib.SMTPSimTests.testVRFY @ linux-x86_64 +test.test_smtplib.SMTPSimTests.test_421_from_data_cmd @ linux-x86_64 +test.test_smtplib.SMTPSimTests.test_421_from_mail_cmd @ linux-x86_64 +test.test_smtplib.SMTPSimTests.test_421_from_rcpt_cmd @ linux-x86_64 +test.test_smtplib.SMTPSimTests.test__rest_from_mail_cmd @ linux-x86_64 +test.test_smtplib.SMTPSimTests.test_auth_function @ linux-x86_64 +test.test_smtplib.SMTPSimTests.test_name_field_not_included_in_envelop_addresses @ linux-x86_64 +test.test_smtplib.SMTPSimTests.test_quit_resets_greeting @ linux-x86_64 +test.test_smtplib.SMTPSimTests.test_send_message_error_on_non_ascii_addrs_if_no_smtputf8 @ linux-x86_64 +test.test_smtplib.SMTPSimTests.test_send_unicode_without_SMTPUTF8 @ linux-x86_64 +test.test_smtplib.SMTPSimTests.test_smtputf8_NotSupportedError_if_no_server_support @ linux-x86_64 +test.test_smtplib.SMTPSimTests.test_with_statement @ linux-x86_64 +test.test_smtplib.SMTPSimTests.test_with_statement_QUIT_failure @ linux-x86_64 +test.test_smtplib.SMTPUTF8SimTests.test_send_message_uses_smtputf8_if_addrs_non_ascii @ linux-x86_64 +test.test_smtplib.SMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_low_level_API @ linux-x86_64 +test.test_smtplib.SMTPUTF8SimTests.test_send_unicode_with_SMTPUTF8_via_sendmail @ linux-x86_64 +test.test_smtplib.SMTPUTF8SimTests.test_test_server_supports_extensions @ linux-x86_64 +test.test_smtplib.TooLongLineTests.testLineTooLong @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sndhdr.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sndhdr.txt new file mode 100644 index 0000000000..aa65b146aa --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sndhdr.txt @@ -0,0 +1,2 @@ +test.test_sndhdr.TestFormats.test_data @ linux-x86_64 +test.test_sndhdr.TestFormats.test_pickleable @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_socket.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_socket.txt new file mode 100644 index 0000000000..b01c6cac08 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_socket.txt @@ -0,0 +1,218 @@ +test.test_socket.BasicSocketPairTest.testDefaults @ linux-x86_64 +test.test_socket.BasicSocketPairTest.testRecv @ linux-x86_64 +test.test_socket.BasicSocketPairTest.testSend @ linux-x86_64 +test.test_socket.BasicTCPTest.testDetach @ linux-x86_64 +test.test_socket.BasicTCPTest.testDup @ linux-x86_64 +test.test_socket.BasicTCPTest.testFromFd @ linux-x86_64 +test.test_socket.BasicTCPTest.testOverFlowRecv @ linux-x86_64 +test.test_socket.BasicTCPTest.testOverFlowRecvFrom @ linux-x86_64 +test.test_socket.BasicTCPTest.testRecv @ linux-x86_64 +test.test_socket.BasicTCPTest.testRecvFrom @ linux-x86_64 +test.test_socket.BasicTCPTest.testSendAll @ linux-x86_64 +test.test_socket.BasicTCPTest.testShutdown @ linux-x86_64 +test.test_socket.BasicTCPTest2.testDetach @ linux-x86_64 +test.test_socket.BasicTCPTest2.testDup @ linux-x86_64 +test.test_socket.BasicTCPTest2.testFromFd @ linux-x86_64 +test.test_socket.BasicTCPTest2.testOverFlowRecv @ linux-x86_64 +test.test_socket.BasicTCPTest2.testOverFlowRecvFrom @ linux-x86_64 +test.test_socket.BasicTCPTest2.testRecv @ linux-x86_64 +test.test_socket.BasicTCPTest2.testRecvFrom @ linux-x86_64 +test.test_socket.BasicTCPTest2.testSendAll @ linux-x86_64 +test.test_socket.BasicTCPTest2.testShutdown @ linux-x86_64 +test.test_socket.BasicUDPTest.testRecvFrom @ linux-x86_64 +test.test_socket.BasicUDPTest.testRecvFromNegative @ linux-x86_64 +test.test_socket.BasicUDPTest.testSendtoAndRecv @ linux-x86_64 +test.test_socket.BufferIOTest.testRecvFromIntoArray @ linux-x86_64 +test.test_socket.BufferIOTest.testRecvFromIntoBytearray @ linux-x86_64 +test.test_socket.BufferIOTest.testRecvFromIntoEmptyBuffer @ linux-x86_64 +test.test_socket.BufferIOTest.testRecvFromIntoMemoryview @ linux-x86_64 +test.test_socket.BufferIOTest.testRecvFromIntoSmallBuffer @ linux-x86_64 +test.test_socket.BufferIOTest.testRecvIntoArray @ linux-x86_64 +test.test_socket.BufferIOTest.testRecvIntoBytearray @ linux-x86_64 +test.test_socket.BufferIOTest.testRecvIntoMemoryview @ linux-x86_64 +test.test_socket.ContextManagersTest.testCreateConnectionBase @ linux-x86_64 +test.test_socket.ContextManagersTest.testCreateConnectionClose @ linux-x86_64 +test.test_socket.CreateServerFunctionalTest.test_dual_stack_client_v4 @ linux-x86_64 +test.test_socket.CreateServerFunctionalTest.test_dual_stack_client_v6 @ linux-x86_64 +test.test_socket.CreateServerFunctionalTest.test_tcp4 @ linux-x86_64 +test.test_socket.CreateServerFunctionalTest.test_tcp6 @ linux-x86_64 +test.test_socket.CreateServerTest.test_address @ linux-x86_64 +test.test_socket.CreateServerTest.test_dualstack_ipv6_family @ linux-x86_64 +test.test_socket.CreateServerTest.test_family_and_type @ linux-x86_64 +test.test_socket.CreateServerTest.test_ipv6_only_default @ linux-x86_64 +test.test_socket.CreateServerTest.test_reuse_port @ linux-x86_64 +test.test_socket.FileObjectClassTestCase.testAttributes @ linux-x86_64 +test.test_socket.FileObjectClassTestCase.testCloseAfterMakefile @ linux-x86_64 +test.test_socket.FileObjectClassTestCase.testClosedAttr @ linux-x86_64 +test.test_socket.FileObjectClassTestCase.testFullRead @ linux-x86_64 +test.test_socket.FileObjectClassTestCase.testMakefileAfterMakefileClose @ linux-x86_64 +test.test_socket.FileObjectClassTestCase.testReadAfterTimeout @ linux-x86_64 +test.test_socket.FileObjectClassTestCase.testReadline @ linux-x86_64 +test.test_socket.FileObjectClassTestCase.testRealClose @ linux-x86_64 +test.test_socket.FileObjectClassTestCase.testSmallRead @ linux-x86_64 +test.test_socket.FileObjectClassTestCase.testUnbufferedRead @ linux-x86_64 +test.test_socket.GeneralModuleTests.testCloseException @ linux-x86_64 +test.test_socket.GeneralModuleTests.testCrucialConstants @ linux-x86_64 +test.test_socket.GeneralModuleTests.testCrucialIpProtoConstants @ linux-x86_64 +test.test_socket.GeneralModuleTests.testDefaultTimeout @ linux-x86_64 +test.test_socket.GeneralModuleTests.testGetServBy @ linux-x86_64 +test.test_socket.GeneralModuleTests.testGetSockOpt @ linux-x86_64 +test.test_socket.GeneralModuleTests.testHostnameRes @ linux-x86_64 +test.test_socket.GeneralModuleTests.testIPv4_inet_aton_fourbytes @ linux-x86_64 +test.test_socket.GeneralModuleTests.testIPv4toString @ linux-x86_64 +test.test_socket.GeneralModuleTests.testIPv6toString @ linux-x86_64 +test.test_socket.GeneralModuleTests.testInterpreterCrash @ linux-x86_64 +test.test_socket.GeneralModuleTests.testNewAttributes @ linux-x86_64 +test.test_socket.GeneralModuleTests.testNtoH @ linux-x86_64 +test.test_socket.GeneralModuleTests.testRefCountGetNameInfo @ linux-x86_64 +test.test_socket.GeneralModuleTests.testSendAfterClose @ linux-x86_64 +test.test_socket.GeneralModuleTests.testSendtoErrors @ linux-x86_64 +test.test_socket.GeneralModuleTests.testSetSockOpt @ linux-x86_64 +test.test_socket.GeneralModuleTests.testSockName @ linux-x86_64 +test.test_socket.GeneralModuleTests.testSocketError @ linux-x86_64 +test.test_socket.GeneralModuleTests.testStringToIPv4 @ linux-x86_64 +test.test_socket.GeneralModuleTests.testStringToIPv6 @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_SocketType_is_socketobject @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_addressfamily_enum @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_addressinfo_enum @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_csocket_repr @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_flowinfo @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_getaddrinfo_ipv6_basic @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_getfqdn_filter_localhost @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_getnameinfo @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_getsockaddrarg @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_host_resolution @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_host_resolution_bad_address @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_idna @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_listen_backlog @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_makefile_invalid_mode @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_makefile_mode @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_msgflag_enum @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_name_closed_socketio @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_pickle @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_repr @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_socket_close @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_socket_consistent_sock_type @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_socket_fileno @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_socket_fileno_rejects_float @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_socket_fileno_rejects_invalid_socket @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_socket_fileno_rejects_negative @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_socket_fileno_rejects_other_types @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_socket_fileno_requires_socket_fd @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_socket_fileno_requires_valid_fd @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_socket_methods @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_socketkind_enum @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_str_for_enums @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_unknown_socket_family_repr @ linux-x86_64 +test.test_socket.GeneralModuleTests.test_unusable_closed_socketio @ linux-x86_64 +test.test_socket.InheritanceTest.test_default_inheritable @ linux-x86_64 +test.test_socket.InheritanceTest.test_dup @ linux-x86_64 +test.test_socket.InheritanceTest.test_set_inheritable @ linux-x86_64 +test.test_socket.InheritanceTest.test_socketpair @ linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testAttributes @ linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testCloseAfterMakefile @ linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testClosedAttr @ linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testFullRead @ linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testMakefileAfterMakefileClose @ linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testReadAfterTimeout @ linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testReadline @ linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testRealClose @ linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testSmallRead @ linux-x86_64 +test.test_socket.LineBufferedFileObjectClassTestCase.testUnbufferedRead @ linux-x86_64 +test.test_socket.NetworkConnectionAttributesTest.testFamily @ linux-x86_64 +test.test_socket.NetworkConnectionAttributesTest.testSourceAddress @ linux-x86_64 +test.test_socket.NetworkConnectionAttributesTest.testTimeoutDefault @ linux-x86_64 +test.test_socket.NetworkConnectionAttributesTest.testTimeoutNone @ linux-x86_64 +test.test_socket.NetworkConnectionAttributesTest.testTimeoutValueNamed @ linux-x86_64 +test.test_socket.NetworkConnectionAttributesTest.testTimeoutValueNonamed @ linux-x86_64 +test.test_socket.NetworkConnectionBehaviourTest.testInsideTimeout @ linux-x86_64 +test.test_socket.NetworkConnectionBehaviourTest.testOutsideTimeout @ linux-x86_64 +test.test_socket.NetworkConnectionNoServer.test_connect @ linux-x86_64 +test.test_socket.NetworkConnectionNoServer.test_create_connection @ linux-x86_64 +test.test_socket.NetworkConnectionNoServer.test_create_connection_all_errors @ linux-x86_64 +test.test_socket.NetworkConnectionNoServer.test_create_connection_timeout @ linux-x86_64 +test.test_socket.NonBlockingTCPTests.testAccept @ linux-x86_64 +test.test_socket.NonBlockingTCPTests.testInheritFlagsBlocking @ linux-x86_64 +test.test_socket.NonBlockingTCPTests.testInheritFlagsTimeout @ linux-x86_64 +test.test_socket.NonBlockingTCPTests.testRecv @ linux-x86_64 +test.test_socket.SendfileUsingSendTest.testCount @ linux-x86_64 +test.test_socket.SendfileUsingSendTest.testCountSmall @ linux-x86_64 +test.test_socket.SendfileUsingSendTest.testCountWithOffset @ linux-x86_64 +test.test_socket.SendfileUsingSendTest.testEmptyFileSend @ linux-x86_64 +test.test_socket.SendfileUsingSendTest.testNonBlocking @ linux-x86_64 +test.test_socket.SendfileUsingSendTest.testNonRegularFile @ linux-x86_64 +test.test_socket.SendfileUsingSendTest.testOffset @ linux-x86_64 +test.test_socket.SendfileUsingSendTest.testRegularFile @ linux-x86_64 +test.test_socket.SendfileUsingSendTest.testWithTimeout @ linux-x86_64 +test.test_socket.SendfileUsingSendTest.testWithTimeoutTriggeredSend @ linux-x86_64 +test.test_socket.SendfileUsingSendTest.test_errors @ linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testAttributes @ linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testCloseAfterMakefile @ linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testClosedAttr @ linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testFullRead @ linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testMakefileAfterMakefileClose @ linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testReadAfterTimeout @ linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testReadline @ linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testRealClose @ linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testSmallRead @ linux-x86_64 +test.test_socket.SmallBufferedFileObjectClassTestCase.testUnbufferedRead @ linux-x86_64 +test.test_socket.TCPCloserTest.testClose @ linux-x86_64 +test.test_socket.TCPTimeoutTest.testTCPTimeout @ linux-x86_64 +test.test_socket.TCPTimeoutTest.testTimeoutZero @ linux-x86_64 +test.test_socket.TestExceptions.testExceptionTree @ linux-x86_64 +test.test_socket.TestExceptions.test_setblocking_invalidfd @ linux-x86_64 +test.test_socket.TestLinuxAbstractNamespace.testAutobind @ linux-x86_64 +test.test_socket.TestLinuxAbstractNamespace.testBytearrayName @ linux-x86_64 +test.test_socket.TestLinuxAbstractNamespace.testLinuxAbstractNamespace @ linux-x86_64 +test.test_socket.TestLinuxAbstractNamespace.testMaxName @ linux-x86_64 +test.test_socket.TestLinuxAbstractNamespace.testNameOverflow @ linux-x86_64 +test.test_socket.TestLinuxAbstractNamespace.testStrName @ linux-x86_64 +test.test_socket.TestUnixDomain.testBytesAddr @ linux-x86_64 +test.test_socket.TestUnixDomain.testStrAddr @ linux-x86_64 +test.test_socket.TestUnixDomain.testUnbound @ linux-x86_64 +test.test_socket.UDPTimeoutTest.testTimeoutZero @ linux-x86_64 +test.test_socket.UDPTimeoutTest.testUDPTimeout @ linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testAttributes @ linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testCloseAfterMakefile @ linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testClosedAttr @ linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testFullRead @ linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testMakefileAfterMakefileClose @ linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testMakefileClose @ linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testReadAfterTimeout @ linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testReadline @ linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testRealClose @ linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testSmallRead @ linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testSmallReadNonBlocking @ linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testUnbufferedRead @ linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testUnbufferedReadline @ linux-x86_64 +test.test_socket.UnbufferedFileObjectClassTestCase.testWriteNonBlocking @ linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testAttributes @ linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testCloseAfterMakefile @ linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testClosedAttr @ linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testFullRead @ linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testMakefileAfterMakefileClose @ linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testReadAfterTimeout @ linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testReadline @ linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testRealClose @ linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testSmallRead @ linux-x86_64 +test.test_socket.UnicodeReadFileObjectClassTestCase.testUnbufferedRead @ linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testAttributes @ linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testCloseAfterMakefile @ linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testClosedAttr @ linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testFullRead @ linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testMakefileAfterMakefileClose @ linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testReadAfterTimeout @ linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testReadline @ linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testRealClose @ linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testSmallRead @ linux-x86_64 +test.test_socket.UnicodeReadWriteFileObjectClassTestCase.testUnbufferedRead @ linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testAttributes @ linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testCloseAfterMakefile @ linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testClosedAttr @ linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testFullRead @ linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testMakefileAfterMakefileClose @ linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testReadAfterTimeout @ linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testReadline @ linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testRealClose @ linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testSmallRead @ linux-x86_64 +test.test_socket.UnicodeWriteFileObjectClassTestCase.testUnbufferedRead @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_socketserver.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_socketserver.txt new file mode 100644 index 0000000000..2b11afc3a0 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_socketserver.txt @@ -0,0 +1,20 @@ +test.test_socketserver.ErrorHandlerTest.test_sync_handled @ linux-x86_64 +test.test_socketserver.ErrorHandlerTest.test_sync_not_handled @ linux-x86_64 +test.test_socketserver.ErrorHandlerTest.test_threading_handled @ linux-x86_64 +test.test_socketserver.ErrorHandlerTest.test_threading_not_handled @ linux-x86_64 +test.test_socketserver.MiscTestCase.test_all @ linux-x86_64 +test.test_socketserver.MiscTestCase.test_shutdown_request_called_if_verify_request_false @ linux-x86_64 +test.test_socketserver.MiscTestCase.test_threads_reaped @ linux-x86_64 +test.test_socketserver.SocketServerTest.test_TCPServer @ linux-x86_64 +test.test_socketserver.SocketServerTest.test_ThreadingTCPServer @ linux-x86_64 +test.test_socketserver.SocketServerTest.test_ThreadingUDPServer @ linux-x86_64 +test.test_socketserver.SocketServerTest.test_ThreadingUnixDatagramServer @ linux-x86_64 +test.test_socketserver.SocketServerTest.test_ThreadingUnixStreamServer @ linux-x86_64 +test.test_socketserver.SocketServerTest.test_UDPServer @ linux-x86_64 +test.test_socketserver.SocketServerTest.test_UnixDatagramServer @ linux-x86_64 +test.test_socketserver.SocketServerTest.test_UnixStreamServer @ linux-x86_64 +test.test_socketserver.SocketServerTest.test_close_immediately @ linux-x86_64 +test.test_socketserver.SocketServerTest.test_context_manager @ linux-x86_64 +test.test_socketserver.SocketServerTest.test_shutdown @ linux-x86_64 +test.test_socketserver.SocketServerTest.test_tcpserver_bind_leak @ linux-x86_64 +test.test_socketserver.SocketWriterTest.test_basics @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sort.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sort.txt new file mode 100644 index 0000000000..dc83bf1315 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sort.txt @@ -0,0 +1,19 @@ +test.test_sort.TestBase.testStressfully @ linux-x86_64 +test.test_sort.TestBugs.test_bug453523 @ linux-x86_64 +test.test_sort.TestBugs.test_undetected_mutation @ linux-x86_64 +test.test_sort.TestDecorateSortUndecorate.test_baddecorator @ linux-x86_64 +test.test_sort.TestDecorateSortUndecorate.test_decorated @ linux-x86_64 +test.test_sort.TestDecorateSortUndecorate.test_key_with_exception @ linux-x86_64 +test.test_sort.TestDecorateSortUndecorate.test_key_with_mutating_del_and_exception @ linux-x86_64 +test.test_sort.TestDecorateSortUndecorate.test_key_with_mutation @ linux-x86_64 +test.test_sort.TestDecorateSortUndecorate.test_reverse @ linux-x86_64 +test.test_sort.TestDecorateSortUndecorate.test_reverse_stability @ linux-x86_64 +test.test_sort.TestDecorateSortUndecorate.test_stability @ linux-x86_64 +test.test_sort.TestOptimizedCompares.test_none_in_tuples @ linux-x86_64 +test.test_sort.TestOptimizedCompares.test_not_all_tuples @ linux-x86_64 +test.test_sort.TestOptimizedCompares.test_safe_object_compare @ linux-x86_64 +test.test_sort.TestOptimizedCompares.test_unsafe_float_compare @ linux-x86_64 +test.test_sort.TestOptimizedCompares.test_unsafe_latin_compare @ linux-x86_64 +test.test_sort.TestOptimizedCompares.test_unsafe_long_compare @ linux-x86_64 +test.test_sort.TestOptimizedCompares.test_unsafe_object_compare @ linux-x86_64 +test.test_sort.TestOptimizedCompares.test_unsafe_tuple_compare @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_source_encoding.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_source_encoding.txt new file mode 100644 index 0000000000..767bad5431 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_source_encoding.txt @@ -0,0 +1,40 @@ +test.test_source_encoding.BytesSourceEncodingTest.test_crcrcrlf @ linux-x86_64 +test.test_source_encoding.BytesSourceEncodingTest.test_crcrcrlf2 @ linux-x86_64 +test.test_source_encoding.BytesSourceEncodingTest.test_crcrlf @ linux-x86_64 +test.test_source_encoding.BytesSourceEncodingTest.test_crlf @ linux-x86_64 +test.test_source_encoding.BytesSourceEncodingTest.test_default_coding @ linux-x86_64 +test.test_source_encoding.BytesSourceEncodingTest.test_double_coding_line @ linux-x86_64 +test.test_source_encoding.BytesSourceEncodingTest.test_double_coding_same_line @ linux-x86_64 +test.test_source_encoding.BytesSourceEncodingTest.test_first_coding_line @ linux-x86_64 +test.test_source_encoding.BytesSourceEncodingTest.test_first_non_utf8_coding_line @ linux-x86_64 +test.test_source_encoding.BytesSourceEncodingTest.test_second_coding_line @ linux-x86_64 +test.test_source_encoding.BytesSourceEncodingTest.test_second_non_utf8_coding_line @ linux-x86_64 +test.test_source_encoding.BytesSourceEncodingTest.test_third_coding_line @ linux-x86_64 +test.test_source_encoding.BytesSourceEncodingTest.test_utf8_bom @ linux-x86_64 +test.test_source_encoding.BytesSourceEncodingTest.test_utf8_bom_and_utf8_coding_line @ linux-x86_64 +test.test_source_encoding.FileSourceEncodingTest.test_crcrcrlf @ linux-x86_64 +test.test_source_encoding.FileSourceEncodingTest.test_crcrcrlf2 @ linux-x86_64 +test.test_source_encoding.FileSourceEncodingTest.test_crcrlf @ linux-x86_64 +test.test_source_encoding.FileSourceEncodingTest.test_crlf @ linux-x86_64 +test.test_source_encoding.FileSourceEncodingTest.test_default_coding @ linux-x86_64 +test.test_source_encoding.FileSourceEncodingTest.test_double_coding_line @ linux-x86_64 +test.test_source_encoding.FileSourceEncodingTest.test_double_coding_same_line @ linux-x86_64 +test.test_source_encoding.FileSourceEncodingTest.test_first_coding_line @ linux-x86_64 +test.test_source_encoding.FileSourceEncodingTest.test_first_non_utf8_coding_line @ linux-x86_64 +test.test_source_encoding.FileSourceEncodingTest.test_second_coding_line @ linux-x86_64 +test.test_source_encoding.FileSourceEncodingTest.test_second_non_utf8_coding_line @ linux-x86_64 +test.test_source_encoding.FileSourceEncodingTest.test_third_coding_line @ linux-x86_64 +test.test_source_encoding.FileSourceEncodingTest.test_utf8_bom @ linux-x86_64 +test.test_source_encoding.FileSourceEncodingTest.test_utf8_bom_and_utf8_coding_line @ linux-x86_64 +test.test_source_encoding.MiscSourceEncodingTest.test_20731 @ linux-x86_64 +test.test_source_encoding.MiscSourceEncodingTest.test_bad_coding @ linux-x86_64 +test.test_source_encoding.MiscSourceEncodingTest.test_bad_coding2 @ linux-x86_64 +test.test_source_encoding.MiscSourceEncodingTest.test_compilestring @ linux-x86_64 +test.test_source_encoding.MiscSourceEncodingTest.test_error_message @ linux-x86_64 +test.test_source_encoding.MiscSourceEncodingTest.test_exec_valid_coding @ linux-x86_64 +test.test_source_encoding.MiscSourceEncodingTest.test_file_parse @ linux-x86_64 +test.test_source_encoding.MiscSourceEncodingTest.test_issue2301 @ linux-x86_64 +test.test_source_encoding.MiscSourceEncodingTest.test_issue3297 @ linux-x86_64 +test.test_source_encoding.MiscSourceEncodingTest.test_issue4626 @ linux-x86_64 +test.test_source_encoding.MiscSourceEncodingTest.test_issue7820 @ linux-x86_64 +test.test_source_encoding.MiscSourceEncodingTest.test_pep263 @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sqlite3.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sqlite3.txt new file mode 100644 index 0000000000..4f1f57421d --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sqlite3.txt @@ -0,0 +1,416 @@ +test.test_sqlite3.test_backup.BackupTests.test_bad_source_closed_connection @ linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_bad_target @ linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_bad_target_closed_connection @ linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_bad_target_filename @ linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_bad_target_in_transaction @ linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_bad_target_same_connection @ linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_database_source_name @ linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_failing_progress @ linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_keyword_only_args @ linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_modifying_progress @ linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_non_callable_progress @ linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_progress @ linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_progress_all_pages_at_once_1 @ linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_progress_all_pages_at_once_2 @ linux-x86_64 +test.test_sqlite3.test_backup.BackupTests.test_simple @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_32bit_rowid @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_closed @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_closed_db_read @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_context_manager @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_context_manager_reraise_exceptions @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_get_empty_slice @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_get_item @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_get_item_error @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_get_slice @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_get_slice_negative_index @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_get_slice_with_skip @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_is_a_blob @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_length @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_mapping_invalid_index_type @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_open_error @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_read @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_read_advance_offset @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_read_at_offset @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_read_error_row_changed @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_read_oversized @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_seek_and_tell @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_seek_error @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_sequence_not_supported @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_empty_slice @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_item @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_item_error @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_item_negative_index @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_item_with_offset @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_slice @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_slice_buffer_object @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_slice_error @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_set_slice_with_skip @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_write @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_write_advance_offset @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_write_at_offset @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_write_error_length @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_write_error_readonly @ linux-x86_64 +test.test_sqlite3.test_dbapi.BlobTests.test_blob_write_error_row_changed @ linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_call @ linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_con_commit @ linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_con_cursor @ linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_con_rollback @ linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_create_aggregate @ linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_create_function @ linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_cur_execute @ linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_set_authorizer @ linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedConTests.test_closed_set_progress_callback @ linux-x86_64 +test.test_sqlite3.test_dbapi.ClosedCurTests.test_closed @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_close @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_commit @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_commit_after_no_changes @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_bad_limit_category @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_bad_reinit @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_exceptions @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_init_bad_isolation_level @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_init_good_isolation_levels @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_connection_limits @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_cursor @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_drop_unused_refs @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_exceptions @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_failed_open @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_in_transaction @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_in_transaction_ro @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_interrupt @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_interrupt_on_closed_db @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_rollback @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_rollback_after_no_changes @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConnectionTests.test_use_after_close @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConstructorTests.test_binary @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConstructorTests.test_date @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConstructorTests.test_date_from_ticks @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConstructorTests.test_time @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConstructorTests.test_time_from_ticks @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConstructorTests.test_timestamp @ linux-x86_64 +test.test_sqlite3.test_dbapi.ConstructorTests.test_timestamp_from_ticks @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_array_size @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_close @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_column_count @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_cursor_connection @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_cursor_wrong_class @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_arg_float @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_arg_int @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_arg_string @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_arg_string_with_zero_byte @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_dict_mapping @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_dict_mapping_mapping @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_dict_mapping_no_args @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_dict_mapping_too_little_args @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_dict_mapping_unnamed @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_illegal_sql @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_many_iterator @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_many_not_iterable @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_many_select @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_many_sequence @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_many_wrong_sql_arg @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_multiple_statements @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_no_args @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_non_iterable @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_param_list @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_param_sequence @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_param_sequence_bad_len @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_too_many_params @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_with_appended_comments @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_wrong_no_of_args1 @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_wrong_no_of_args2 @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_wrong_no_of_args3 @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_execute_wrong_sql_arg @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_fetch_iter @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_fetchall @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_fetchmany @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_fetchmany_kw_arg @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_fetchone @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_fetchone_no_statement @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_last_row_id_insert_o_r @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_last_row_id_on_ignore @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_last_row_id_on_replace @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_rowcount_execute @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_rowcount_executemany @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_rowcount_prefixed_with_comment @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_rowcount_select @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_rowcount_update_returning @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_rowcount_vaccuum @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_same_query_in_multiple_cursors @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_setinputsizes @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_setoutputsize @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_setoutputsize_no_column @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_total_changes @ linux-x86_64 +test.test_sqlite3.test_dbapi.CursorTests.test_wrong_cursor_callable @ linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_connection_execute @ linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_connection_executemany @ linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_connection_executescript @ linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_cursor_executescript_as_bytes @ linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_cursor_executescript_too_large_script @ linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_cursor_executescript_tx_control @ linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_cursor_executescript_with_null_characters @ linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_cursor_executescript_with_surrogates @ linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_script_error_normal @ linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_script_string_sql @ linux-x86_64 +test.test_sqlite3.test_dbapi.ExtensionTests.test_script_syntax_error @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_api_level @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_complete_statement @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_data_error @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_database_error @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_disallow_instantiation @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_error @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_error_code_on_exception @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_extended_error_code_on_exception @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_integrity_error @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_interface_error @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_internal_error @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_module_constants @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_not_supported_error @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_operational_error @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_param_style @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_programming_error @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_shared_cache_deprecated @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_thread_safety @ linux-x86_64 +test.test_sqlite3.test_dbapi.ModuleTests.test_warning @ linux-x86_64 +test.test_sqlite3.test_dbapi.MultiprocessTests.test_ctx_mgr_rollback_if_commit_failed @ linux-x86_64 +test.test_sqlite3.test_dbapi.OpenTests.test_database_keyword @ linux-x86_64 +test.test_sqlite3.test_dbapi.OpenTests.test_factory_database_arg @ linux-x86_64 +test.test_sqlite3.test_dbapi.OpenTests.test_open_undecodable_uri @ linux-x86_64 +test.test_sqlite3.test_dbapi.OpenTests.test_open_unquoted_uri @ linux-x86_64 +test.test_sqlite3.test_dbapi.OpenTests.test_open_uri @ linux-x86_64 +test.test_sqlite3.test_dbapi.OpenTests.test_open_uri_readonly @ linux-x86_64 +test.test_sqlite3.test_dbapi.OpenTests.test_open_with_path_like_object @ linux-x86_64 +test.test_sqlite3.test_dbapi.OpenTests.test_open_with_undecodable_path @ linux-x86_64 +test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_abort_raises_with_explicit_transactions @ linux-x86_64 +test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_abort_raises_without_transactions @ linux-x86_64 +test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_fail @ linux-x86_64 +test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_ignore @ linux-x86_64 +test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_replace @ linux-x86_64 +test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_rollback_with_explicit_transaction @ linux-x86_64 +test.test_sqlite3.test_dbapi.SqliteOnConflictTests.test_on_conflict_rollback_without_transaction @ linux-x86_64 +test.test_sqlite3.test_dbapi.ThreadTests.test_check_connection_thread @ linux-x86_64 +test.test_sqlite3.test_dbapi.ThreadTests.test_check_cursor_thread @ linux-x86_64 +test.test_sqlite3.test_dbapi.ThreadTests.test_dont_check_same_thread @ linux-x86_64 +test.test_sqlite3.test_dbapi.UninitialisedConnectionTests.test_uninit_operations @ linux-x86_64 +test.test_sqlite3.test_dump.DumpTests.test_dump_autoincrement @ linux-x86_64 +test.test_sqlite3.test_dump.DumpTests.test_table_dump @ linux-x86_64 +test.test_sqlite3.test_dump.DumpTests.test_unorderable_row @ linux-x86_64 +test.test_sqlite3.test_factory.ConnectionFactoryTests.test_connection_factories @ linux-x86_64 +test.test_sqlite3.test_factory.ConnectionFactoryTests.test_connection_factory_as_positional_arg @ linux-x86_64 +test.test_sqlite3.test_factory.ConnectionFactoryTests.test_connection_factory_relayed_call @ linux-x86_64 +test.test_sqlite3.test_factory.CursorFactoryTests.test_invalid_factory @ linux-x86_64 +test.test_sqlite3.test_factory.CursorFactoryTests.test_is_instance @ linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_custom_factory @ linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_fake_cursor_class @ linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_as_dict @ linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_as_sequence @ linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_as_tuple @ linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_hash_cmp @ linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_index @ linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_index_unicode @ linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_iter @ linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_keys @ linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTests.test_sqlite_row_slice @ linux-x86_64 +test.test_sqlite3.test_factory.RowFactoryTestsBackwardsCompat.test_is_produced_by_factory @ linux-x86_64 +test.test_sqlite3.test_factory.TextFactoryTests.test_custom @ linux-x86_64 +test.test_sqlite3.test_factory.TextFactoryTests.test_optimized_unicode @ linux-x86_64 +test.test_sqlite3.test_factory.TextFactoryTests.test_string @ linux-x86_64 +test.test_sqlite3.test_factory.TextFactoryTests.test_unicode @ linux-x86_64 +test.test_sqlite3.test_factory.TextFactoryTestsWithEmbeddedZeroBytes.test_bytearray @ linux-x86_64 +test.test_sqlite3.test_factory.TextFactoryTestsWithEmbeddedZeroBytes.test_bytes @ linux-x86_64 +test.test_sqlite3.test_factory.TextFactoryTestsWithEmbeddedZeroBytes.test_custom @ linux-x86_64 +test.test_sqlite3.test_factory.TextFactoryTestsWithEmbeddedZeroBytes.test_string @ linux-x86_64 +test.test_sqlite3.test_hooks.CollationTests.test_collation_is_used @ linux-x86_64 +test.test_sqlite3.test_hooks.CollationTests.test_collation_register_twice @ linux-x86_64 +test.test_sqlite3.test_hooks.CollationTests.test_collation_returns_large_integer @ linux-x86_64 +test.test_sqlite3.test_hooks.CollationTests.test_create_collation_bad_upper @ linux-x86_64 +test.test_sqlite3.test_hooks.CollationTests.test_create_collation_not_ascii @ linux-x86_64 +test.test_sqlite3.test_hooks.CollationTests.test_create_collation_not_callable @ linux-x86_64 +test.test_sqlite3.test_hooks.CollationTests.test_create_collation_not_string @ linux-x86_64 +test.test_sqlite3.test_hooks.CollationTests.test_deregister_collation @ linux-x86_64 +test.test_sqlite3.test_hooks.ProgressTests.test_cancel_operation @ linux-x86_64 +test.test_sqlite3.test_hooks.ProgressTests.test_clear_handler @ linux-x86_64 +test.test_sqlite3.test_hooks.ProgressTests.test_error_in_progress_handler @ linux-x86_64 +test.test_sqlite3.test_hooks.ProgressTests.test_error_in_progress_handler_result @ linux-x86_64 +test.test_sqlite3.test_hooks.ProgressTests.test_opcode_count @ linux-x86_64 +test.test_sqlite3.test_hooks.ProgressTests.test_progress_handler_used @ linux-x86_64 +test.test_sqlite3.test_hooks.TraceCallbackTests.test_clear_trace_callback @ linux-x86_64 +test.test_sqlite3.test_hooks.TraceCallbackTests.test_trace_bad_handler @ linux-x86_64 +test.test_sqlite3.test_hooks.TraceCallbackTests.test_trace_callback_content @ linux-x86_64 +test.test_sqlite3.test_hooks.TraceCallbackTests.test_trace_callback_used @ linux-x86_64 +test.test_sqlite3.test_hooks.TraceCallbackTests.test_trace_too_much_expanded_sql @ linux-x86_64 +test.test_sqlite3.test_hooks.TraceCallbackTests.test_unicode_content @ linux-x86_64 +test.test_sqlite3.test_regression.RecursiveUseOfCursors.test_recursive_cursor_close @ linux-x86_64 +test.test_sqlite3.test_regression.RecursiveUseOfCursors.test_recursive_cursor_init @ linux-x86_64 +test.test_sqlite3.test_regression.RecursiveUseOfCursors.test_recursive_cursor_iter @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_auto_commit @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_bind_mutating_list @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_bpo31770 @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_bpo37347 @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_collation @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_column_name_with_spaces @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_commit_cursor_reset @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_connection_call @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_connection_constructor_call_check @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_convert_timestamp_microsecond_padding @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_cursor_constructor_call_check @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_custom_cursor_object_crash_gh_99886 @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_del_isolation_level_segfault @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_empty_statement @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_executescript_step_through_select @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_invalid_isolation_level_type @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_large_sql @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_null_character @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_on_conflict_rollback @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_pragma_autocommit @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_pragma_schema_version @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_pragma_user_version @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_recursive_cursor_use @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_register_adapter @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_return_empty_bytestring @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_set_isolation_level @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_statement_finalization_on_close_db @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_statement_reset @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_str_subclass @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_surrogates @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_type_map_usage @ linux-x86_64 +test.test_sqlite3.test_regression.RegressionTests.test_workaround_for_buggy_sqlite_transfer_bindings @ linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelFromInit.test_isolation_level_begin @ linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelFromInit.test_isolation_level_default @ linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelFromInit.test_isolation_level_deferred @ linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelFromInit.test_isolation_level_exclusive @ linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelFromInit.test_isolation_level_immediate @ linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelFromInit.test_isolation_level_none @ linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelPostInit.test_isolation_level_begin @ linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelPostInit.test_isolation_level_default @ linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelPostInit.test_isolation_level_deferrred @ linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelPostInit.test_isolation_level_exclusive @ linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelPostInit.test_isolation_level_immediate @ linux-x86_64 +test.test_sqlite3.test_transactions.IsolationLevelPostInit.test_isolation_level_none @ linux-x86_64 +test.test_sqlite3.test_transactions.RollbackTests.test_no_duplicate_rows_after_rollback_close_cursor @ linux-x86_64 +test.test_sqlite3.test_transactions.RollbackTests.test_no_duplicate_rows_after_rollback_del_cursor @ linux-x86_64 +test.test_sqlite3.test_transactions.RollbackTests.test_no_duplicate_rows_after_rollback_new_query @ linux-x86_64 +test.test_sqlite3.test_transactions.SpecialCommandTests.test_drop_table @ linux-x86_64 +test.test_sqlite3.test_transactions.SpecialCommandTests.test_pragma @ linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_delete_starts_transaction @ linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_dml_does_not_auto_commit_before @ linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_insert_starts_transaction @ linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_locking @ linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_multiple_cursors_and_iternext @ linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_raise_timeout @ linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_replace_starts_transaction @ linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_rollback_cursor_consistency @ linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_toggle_auto_commit @ linux-x86_64 +test.test_sqlite3.test_transactions.TransactionTests.test_update_starts_transaction @ linux-x86_64 +test.test_sqlite3.test_transactions.TransactionalDDL.test_ddl_does_not_autostart_transaction @ linux-x86_64 +test.test_sqlite3.test_transactions.TransactionalDDL.test_immediate_transactional_ddl @ linux-x86_64 +test.test_sqlite3.test_transactions.TransactionalDDL.test_transactional_ddl @ linux-x86_64 +test.test_sqlite3.test_types.BinaryConverterTests.test_binary_input_for_converter @ linux-x86_64 +test.test_sqlite3.test_types.ColNamesTests.test_case_in_converter_name @ linux-x86_64 +test.test_sqlite3.test_types.ColNamesTests.test_col_name @ linux-x86_64 +test.test_sqlite3.test_types.ColNamesTests.test_cursor_description_insert @ linux-x86_64 +test.test_sqlite3.test_types.ColNamesTests.test_cursor_description_no_row @ linux-x86_64 +test.test_sqlite3.test_types.ColNamesTests.test_decl_type_not_used @ linux-x86_64 +test.test_sqlite3.test_types.ColNamesTests.test_none @ linux-x86_64 +test.test_sqlite3.test_types.CommonTableExpressionTests.test_cursor_description_cte @ linux-x86_64 +test.test_sqlite3.test_types.CommonTableExpressionTests.test_cursor_description_cte_multiple_columns @ linux-x86_64 +test.test_sqlite3.test_types.CommonTableExpressionTests.test_cursor_description_cte_simple @ linux-x86_64 +test.test_sqlite3.test_types.DateTimeTests.test_date_time_sub_seconds @ linux-x86_64 +test.test_sqlite3.test_types.DateTimeTests.test_date_time_sub_seconds_floating_point @ linux-x86_64 +test.test_sqlite3.test_types.DateTimeTests.test_sql_timestamp @ linux-x86_64 +test.test_sqlite3.test_types.DateTimeTests.test_sqlite_date @ linux-x86_64 +test.test_sqlite3.test_types.DateTimeTests.test_sqlite_timestamp @ linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_blob @ linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_bool @ linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_convert_zero_sized_blob @ linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_error_in_conform @ linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_float @ linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_foo @ linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_large_int @ linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_number1 @ linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_number2 @ linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_small_int @ linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_string @ linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_unicode @ linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_unsupported_dict @ linux-x86_64 +test.test_sqlite3.test_types.DeclTypesTests.test_unsupported_seq @ linux-x86_64 +test.test_sqlite3.test_types.ObjectAdaptationTests.test_adapt @ linux-x86_64 +test.test_sqlite3.test_types.ObjectAdaptationTests.test_adapt_alt @ linux-x86_64 +test.test_sqlite3.test_types.ObjectAdaptationTests.test_caster_is_used @ linux-x86_64 +test.test_sqlite3.test_types.ObjectAdaptationTests.test_custom_proto @ linux-x86_64 +test.test_sqlite3.test_types.ObjectAdaptationTests.test_defect_proto @ linux-x86_64 +test.test_sqlite3.test_types.ObjectAdaptationTests.test_defect_self_adapt @ linux-x86_64 +test.test_sqlite3.test_types.ObjectAdaptationTests.test_missing_adapter @ linux-x86_64 +test.test_sqlite3.test_types.ObjectAdaptationTests.test_missing_protocol @ linux-x86_64 +test.test_sqlite3.test_types.SqliteTypeTests.test_blob @ linux-x86_64 +test.test_sqlite3.test_types.SqliteTypeTests.test_float @ linux-x86_64 +test.test_sqlite3.test_types.SqliteTypeTests.test_large_int @ linux-x86_64 +test.test_sqlite3.test_types.SqliteTypeTests.test_small_int @ linux-x86_64 +test.test_sqlite3.test_types.SqliteTypeTests.test_string @ linux-x86_64 +test.test_sqlite3.test_types.SqliteTypeTests.test_string_with_null_character @ linux-x86_64 +test.test_sqlite3.test_types.SqliteTypeTests.test_string_with_surrogates @ linux-x86_64 +test.test_sqlite3.test_types.SqliteTypeTests.test_too_large_int @ linux-x86_64 +test.test_sqlite3.test_types.SqliteTypeTests.test_unicode_execute @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_aggr_sum @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_param_blob @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_param_float @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_param_int @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_param_none @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_param_str @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_check_params_int @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_error_on_create @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_exception_in_finalize @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_exception_in_init @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_exception_in_step @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_no_finalize @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_no_match @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_no_step @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AggregateTests.test_aggr_text @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerIllegalTypeTests.test_clear_authorizer @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerIllegalTypeTests.test_column_access @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerIllegalTypeTests.test_table_access @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerLargeIntegerTests.test_clear_authorizer @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerLargeIntegerTests.test_column_access @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerLargeIntegerTests.test_table_access @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerRaiseExceptionTests.test_clear_authorizer @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerRaiseExceptionTests.test_column_access @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerRaiseExceptionTests.test_table_access @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerTests.test_clear_authorizer @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerTests.test_column_access @ linux-x86_64 +test.test_sqlite3.test_userfunctions.AuthorizerTests.test_table_access @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_any_arguments @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_empty_blob @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_deterministic @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_deterministic_keyword_only @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_error_on_create @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_exception @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_memory_error @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_non_deterministic @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_overflow_error @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_params @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_ref_count @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_blob @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_float @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_illegal_value @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_int @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_long_long @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_nan @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_null @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_text @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_text_with_null_char @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_too_large_int @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_return_unicode @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_func_too_many_args @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_function_destructor_via_gc @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_nan_float @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_non_contiguous_blob @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_return_non_contiguous_blob @ linux-x86_64 +test.test_sqlite3.test_userfunctions.FunctionTests.test_too_large_int @ linux-x86_64 +test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_clear_function @ linux-x86_64 +test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_error_on_create @ linux-x86_64 +test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_error_value_return @ linux-x86_64 +test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_exception_in_finalize @ linux-x86_64 +test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_exception_in_method @ linux-x86_64 +test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_missing_finalize @ linux-x86_64 +test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_missing_method @ linux-x86_64 +test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_redefine_function @ linux-x86_64 +test.test_sqlite3.test_userfunctions.WindowFunctionTests.test_win_sum_int @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ssl.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ssl.txt new file mode 100644 index 0000000000..2260f5510b --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ssl.txt @@ -0,0 +1,108 @@ +test.test_ssl.BasicSocketTests.test_DER_to_PEM @ linux-x86_64 +test.test_ssl.BasicSocketTests.test_cert_time_to_seconds @ linux-x86_64 +test.test_ssl.BasicSocketTests.test_connect_ex_error @ linux-x86_64 +test.test_ssl.BasicSocketTests.test_empty_cert @ linux-x86_64 +test.test_ssl.BasicSocketTests.test_errors_sslwrap @ linux-x86_64 +test.test_ssl.BasicSocketTests.test_get_default_verify_paths @ linux-x86_64 +test.test_ssl.BasicSocketTests.test_malformed_cert @ linux-x86_64 +test.test_ssl.BasicSocketTests.test_malformed_key @ linux-x86_64 +test.test_ssl.BasicSocketTests.test_parse_cert @ linux-x86_64 +test.test_ssl.BasicSocketTests.test_parse_cert_CVE_2019_5010 @ linux-x86_64 +test.test_ssl.BasicSocketTests.test_private_init @ linux-x86_64 +test.test_ssl.BasicSocketTests.test_purpose_enum @ linux-x86_64 +test.test_ssl.BasicSocketTests.test_read_write_zero @ linux-x86_64 +test.test_ssl.BasicSocketTests.test_server_side @ linux-x86_64 +test.test_ssl.BasicSocketTests.test_str_for_enums @ linux-x86_64 +test.test_ssl.BasicSocketTests.test_timeout @ linux-x86_64 +test.test_ssl.BasicSocketTests.test_unknown_channel_binding @ linux-x86_64 +test.test_ssl.BasicSocketTests.test_unsupported_dtls @ linux-x86_64 +test.test_ssl.BasicSocketTests.test_wrapped_unconnected @ linux-x86_64 +test.test_ssl.ContextTests.test__create_stdlib_context @ linux-x86_64 +test.test_ssl.ContextTests.test_cert_store_stats @ linux-x86_64 +test.test_ssl.ContextTests.test_check_hostname @ linux-x86_64 +test.test_ssl.ContextTests.test_ciphers @ linux-x86_64 +test.test_ssl.ContextTests.test_constructor @ linux-x86_64 +test.test_ssl.ContextTests.test_context_client_server @ linux-x86_64 +test.test_ssl.ContextTests.test_context_custom_class @ linux-x86_64 +test.test_ssl.ContextTests.test_create_default_context @ linux-x86_64 +test.test_ssl.ContextTests.test_get_ca_certs @ linux-x86_64 +test.test_ssl.ContextTests.test_get_ciphers @ linux-x86_64 +test.test_ssl.ContextTests.test_hostname_checks_common_name @ linux-x86_64 +test.test_ssl.ContextTests.test_load_cert_chain @ linux-x86_64 +test.test_ssl.ContextTests.test_load_default_certs @ linux-x86_64 +test.test_ssl.ContextTests.test_load_default_certs_env @ linux-x86_64 +test.test_ssl.ContextTests.test_load_verify_cadata @ linux-x86_64 +test.test_ssl.ContextTests.test_load_verify_locations @ linux-x86_64 +test.test_ssl.ContextTests.test_min_max_version @ linux-x86_64 +test.test_ssl.ContextTests.test_options @ linux-x86_64 +test.test_ssl.ContextTests.test_set_default_verify_paths @ linux-x86_64 +test.test_ssl.ContextTests.test_verify_mode_protocol @ linux-x86_64 +test.test_ssl.MemoryBIOTests.test_buffer_types @ linux-x86_64 +test.test_ssl.MemoryBIOTests.test_eof @ linux-x86_64 +test.test_ssl.MemoryBIOTests.test_error_types @ linux-x86_64 +test.test_ssl.MemoryBIOTests.test_pending @ linux-x86_64 +test.test_ssl.MemoryBIOTests.test_read_write @ linux-x86_64 +test.test_ssl.SSLErrorTests.test_bad_server_hostname @ linux-x86_64 +test.test_ssl.SSLErrorTests.test_str @ linux-x86_64 +test.test_ssl.SSLErrorTests.test_subclass @ linux-x86_64 +test.test_ssl.SSLObjectTests.test_private_init @ linux-x86_64 +test.test_ssl.SSLObjectTests.test_unwrap @ linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_bio_handshake @ linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_bio_read_write_data @ linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_ciphers @ linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_connect_cadata @ linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_connect_capath @ linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_connect_ex @ linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_connect_fail @ linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_connect_with_context_fail @ linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_get_server_certificate @ linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_get_server_certificate_fail @ linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_makefile_close @ linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_non_blocking_connect_ex @ linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_non_blocking_handshake @ linux-x86_64 +test.test_ssl.SimpleBackgroundTests.test_transport_eof @ linux-x86_64 +test.test_ssl.TestEnumerations.test_alertdescription @ linux-x86_64 +test.test_ssl.TestEnumerations.test_options @ linux-x86_64 +test.test_ssl.TestEnumerations.test_sslerrornumber @ linux-x86_64 +test.test_ssl.TestEnumerations.test_sslmethod @ linux-x86_64 +test.test_ssl.TestEnumerations.test_tlsalerttype @ linux-x86_64 +test.test_ssl.TestEnumerations.test_tlscontenttype @ linux-x86_64 +test.test_ssl.TestEnumerations.test_tlsmessagetype @ linux-x86_64 +test.test_ssl.TestEnumerations.test_tlsversion @ linux-x86_64 +test.test_ssl.TestEnumerations.test_verifyflags @ linux-x86_64 +test.test_ssl.TestEnumerations.test_verifymode @ linux-x86_64 +test.test_ssl.TestPreHandshakeClose.test_https_client_non_tls_response_ignored @ linux-x86_64 +test.test_ssl.TestPreHandshakeClose.test_preauth_data_to_tls_client @ linux-x86_64 +test.test_ssl.TestPreHandshakeClose.test_preauth_data_to_tls_server @ linux-x86_64 +test.test_ssl.ThreadedTests.test_asyncore_server @ linux-x86_64 +test.test_ssl.ThreadedTests.test_check_hostname @ linux-x86_64 +test.test_ssl.ThreadedTests.test_check_hostname_idn @ linux-x86_64 +test.test_ssl.ThreadedTests.test_compression @ linux-x86_64 +test.test_ssl.ThreadedTests.test_compression_disabled @ linux-x86_64 +test.test_ssl.ThreadedTests.test_crl_check @ linux-x86_64 +test.test_ssl.ThreadedTests.test_default_ecdh_curve @ linux-x86_64 +test.test_ssl.ThreadedTests.test_do_handshake_enotconn @ linux-x86_64 +test.test_ssl.ThreadedTests.test_dual_rsa_ecc @ linux-x86_64 +test.test_ssl.ThreadedTests.test_ecc_cert @ linux-x86_64 +test.test_ssl.ThreadedTests.test_getpeercert @ linux-x86_64 +test.test_ssl.ThreadedTests.test_getpeercert_enotconn @ linux-x86_64 +test.test_ssl.ThreadedTests.test_handshake_timeout @ linux-x86_64 +test.test_ssl.ThreadedTests.test_nonblocking_send @ linux-x86_64 +test.test_ssl.ThreadedTests.test_npn_protocols @ linux-x86_64 +test.test_ssl.ThreadedTests.test_read_write_after_close_raises_valuerror @ linux-x86_64 +test.test_ssl.ThreadedTests.test_recv_into_buffer_protocol_len @ linux-x86_64 +test.test_ssl.ThreadedTests.test_recv_send @ linux-x86_64 +test.test_ssl.ThreadedTests.test_recv_zero @ linux-x86_64 +test.test_ssl.ThreadedTests.test_rude_shutdown @ linux-x86_64 +test.test_ssl.ThreadedTests.test_selected_alpn_protocol @ linux-x86_64 +test.test_ssl.ThreadedTests.test_selected_alpn_protocol_if_server_uses_alpn @ linux-x86_64 +test.test_ssl.ThreadedTests.test_sendfile @ linux-x86_64 +test.test_ssl.ThreadedTests.test_server_accept @ linux-x86_64 +test.test_ssl.ThreadedTests.test_shared_ciphers @ linux-x86_64 +test.test_ssl.ThreadedTests.test_socketserver @ linux-x86_64 +test.test_ssl.ThreadedTests.test_ssl_cert_verify_error @ linux-x86_64 +test.test_ssl.ThreadedTests.test_starttls @ linux-x86_64 +test.test_ssl.ThreadedTests.test_tls1_3 @ linux-x86_64 +test.test_ssl.ThreadedTests.test_version_basic @ linux-x86_64 +test.test_ssl.ThreadedTests.test_wrong_cert_tls12 @ linux-x86_64 +test.test_ssl.ThreadedTests.test_wrong_cert_tls13 @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_stat.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_stat.txt new file mode 100644 index 0000000000..99820f262d --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_stat.txt @@ -0,0 +1,5 @@ +test.test_stat.TestFilemodePyStat.test_devices @ linux-x86_64 +test.test_stat.TestFilemodePyStat.test_directory @ linux-x86_64 +test.test_stat.TestFilemodePyStat.test_link @ linux-x86_64 +test.test_stat.TestFilemodePyStat.test_mode @ linux-x86_64 +test.test_stat.TestFilemodePyStat.test_module_attributes @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_statistics.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_statistics.txt new file mode 100644 index 0000000000..e7c8591ed5 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_statistics.txt @@ -0,0 +1,347 @@ +DocTestCase.test.test_statistics.NumericTestCase.assertApproxEqual @ linux-x86_64 +DocTestCase.test.test_statistics._DoNothing @ linux-x86_64 +DocTestCase.test.test_statistics._calc_errors @ linux-x86_64 +DocTestCase.test.test_statistics._nan_equal @ linux-x86_64 +DocTestCase.test.test_statistics.approx_equal @ linux-x86_64 +test.test_statistics.ApproxEqualExactTest.test_exactly_equal_absolute @ linux-x86_64 +test.test_statistics.ApproxEqualExactTest.test_exactly_equal_absolute_decimals @ linux-x86_64 +test.test_statistics.ApproxEqualExactTest.test_exactly_equal_both @ linux-x86_64 +test.test_statistics.ApproxEqualExactTest.test_exactly_equal_decimals @ linux-x86_64 +test.test_statistics.ApproxEqualExactTest.test_exactly_equal_floats @ linux-x86_64 +test.test_statistics.ApproxEqualExactTest.test_exactly_equal_fractions @ linux-x86_64 +test.test_statistics.ApproxEqualExactTest.test_exactly_equal_ints @ linux-x86_64 +test.test_statistics.ApproxEqualExactTest.test_exactly_equal_relative @ linux-x86_64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_absolute_decimals @ linux-x86_64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_absolute_floats @ linux-x86_64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_absolute_fractions @ linux-x86_64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_absolute_ints @ linux-x86_64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_both1 @ linux-x86_64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_both2 @ linux-x86_64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_both3 @ linux-x86_64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_both4 @ linux-x86_64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_relative_decimals @ linux-x86_64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_relative_floats @ linux-x86_64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_relative_fractions @ linux-x86_64 +test.test_statistics.ApproxEqualInexactTest.test_approx_equal_relative_ints @ linux-x86_64 +test.test_statistics.ApproxEqualInexactTest.test_cross_zero @ linux-x86_64 +test.test_statistics.ApproxEqualSpecialsTest.test_decimal_zeroes @ linux-x86_64 +test.test_statistics.ApproxEqualSpecialsTest.test_float_zeroes @ linux-x86_64 +test.test_statistics.ApproxEqualSpecialsTest.test_inf @ linux-x86_64 +test.test_statistics.ApproxEqualSpecialsTest.test_nan @ linux-x86_64 +test.test_statistics.ApproxEqualSymmetryTest.test_relative_symmetry @ linux-x86_64 +test.test_statistics.ApproxEqualSymmetryTest.test_symmetry @ linux-x86_64 +test.test_statistics.ApproxEqualUnequalTest.test_exactly_unequal_decimals @ linux-x86_64 +test.test_statistics.ApproxEqualUnequalTest.test_exactly_unequal_floats @ linux-x86_64 +test.test_statistics.ApproxEqualUnequalTest.test_exactly_unequal_fractions @ linux-x86_64 +test.test_statistics.ApproxEqualUnequalTest.test_exactly_unequal_ints @ linux-x86_64 +test.test_statistics.CoerceTest.test_bool @ linux-x86_64 +test.test_statistics.CoerceTest.test_decimal @ linux-x86_64 +test.test_statistics.CoerceTest.test_float @ linux-x86_64 +test.test_statistics.CoerceTest.test_fraction @ linux-x86_64 +test.test_statistics.CoerceTest.test_incompatible_types @ linux-x86_64 +test.test_statistics.CoerceTest.test_int @ linux-x86_64 +test.test_statistics.CoerceTest.test_non_numeric_types @ linux-x86_64 +test.test_statistics.ConvertTest.test_decimal @ linux-x86_64 +test.test_statistics.ConvertTest.test_float @ linux-x86_64 +test.test_statistics.ConvertTest.test_fraction @ linux-x86_64 +test.test_statistics.ConvertTest.test_inf @ linux-x86_64 +test.test_statistics.ConvertTest.test_int @ linux-x86_64 +test.test_statistics.ConvertTest.test_invalid_input_type @ linux-x86_64 +test.test_statistics.ConvertTest.test_nan @ linux-x86_64 +test.test_statistics.DecimalToRatioTest.test_infinity @ linux-x86_64 +test.test_statistics.DecimalToRatioTest.test_nan @ linux-x86_64 +test.test_statistics.DecimalToRatioTest.test_negative_exponent @ linux-x86_64 +test.test_statistics.DecimalToRatioTest.test_positive_exponent @ linux-x86_64 +test.test_statistics.DecimalToRatioTest.test_regression_20536 @ linux-x86_64 +test.test_statistics.DecimalToRatioTest.test_sign @ linux-x86_64 +test.test_statistics.DocTests.test_doc_tests @ linux-x86_64 +test.test_statistics.ExactRatioTest.test_decimal @ linux-x86_64 +test.test_statistics.ExactRatioTest.test_decimal_nan @ linux-x86_64 +test.test_statistics.ExactRatioTest.test_float @ linux-x86_64 +test.test_statistics.ExactRatioTest.test_float_nan @ linux-x86_64 +test.test_statistics.ExactRatioTest.test_fraction @ linux-x86_64 +test.test_statistics.ExactRatioTest.test_inf @ linux-x86_64 +test.test_statistics.ExactRatioTest.test_int @ linux-x86_64 +test.test_statistics.FailNegTest.test_error_msg @ linux-x86_64 +test.test_statistics.FailNegTest.test_negatives_raise @ linux-x86_64 +test.test_statistics.FailNegTest.test_pass_through @ linux-x86_64 +test.test_statistics.GlobalsTest.test_check_all @ linux-x86_64 +test.test_statistics.GlobalsTest.test_meta @ linux-x86_64 +test.test_statistics.IsFiniteTest.test_finite @ linux-x86_64 +test.test_statistics.IsFiniteTest.test_infinity @ linux-x86_64 +test.test_statistics.IsFiniteTest.test_nan @ linux-x86_64 +test.test_statistics.StatisticsErrorTest.test_has_exception @ linux-x86_64 +test.test_statistics.SumSpecialValues.test_decimal_basiccontext_mismatched_infs_to_nan @ linux-x86_64 +test.test_statistics.SumSpecialValues.test_decimal_extendedcontext_mismatched_infs_to_nan @ linux-x86_64 +test.test_statistics.SumSpecialValues.test_decimal_inf @ linux-x86_64 +test.test_statistics.SumSpecialValues.test_decimal_snan_raises @ linux-x86_64 +test.test_statistics.SumSpecialValues.test_float_inf @ linux-x86_64 +test.test_statistics.SumSpecialValues.test_float_mismatched_infs @ linux-x86_64 +test.test_statistics.SumSpecialValues.test_nan @ linux-x86_64 +test.test_statistics.SumTortureTest.test_torture @ linux-x86_64 +test.test_statistics.TestApproxEqualErrors.test_bad_rel @ linux-x86_64 +test.test_statistics.TestApproxEqualErrors.test_bad_tol @ linux-x86_64 +test.test_statistics.TestBivariateStatistics.test_small_sample_error @ linux-x86_64 +test.test_statistics.TestBivariateStatistics.test_unequal_size_error @ linux-x86_64 +test.test_statistics.TestCorrelationAndCovariance.test_different_scales @ linux-x86_64 +test.test_statistics.TestCorrelationAndCovariance.test_results @ linux-x86_64 +test.test_statistics.TestFMean.test_basics @ linux-x86_64 +test.test_statistics.TestFMean.test_error_cases @ linux-x86_64 +test.test_statistics.TestFMean.test_special_values @ linux-x86_64 +test.test_statistics.TestFMean.test_weights @ linux-x86_64 +test.test_statistics.TestGeometricMean.test_basics @ linux-x86_64 +test.test_statistics.TestGeometricMean.test_big_and_small @ linux-x86_64 +test.test_statistics.TestGeometricMean.test_mixed_int_and_float @ linux-x86_64 +test.test_statistics.TestGeometricMean.test_special_values @ linux-x86_64 +test.test_statistics.TestGeometricMean.test_various_input_types @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_bad_arg_types @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_decimals_exact @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_doubled_data @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_empty_data @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_floats_exact @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_fractions @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_inf @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_ints @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_invalid_type_error @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_multiply_data_points @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_nan @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_negative_error @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_no_args @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_no_inplace_modifications @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_order_doesnt_matter @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_range_data @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_repeated_single_value @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_single_value @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_singleton_lists @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_type_of_data_collection @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_type_of_data_element @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_types_conserved @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_with_weights @ linux-x86_64 +test.test_statistics.TestHarmonicMean.test_zero @ linux-x86_64 +test.test_statistics.TestLinearRegression.test_constant_input_error @ linux-x86_64 +test.test_statistics.TestLinearRegression.test_proportional @ linux-x86_64 +test.test_statistics.TestLinearRegression.test_results @ linux-x86_64 +test.test_statistics.TestMean.test_bad_arg_types @ linux-x86_64 +test.test_statistics.TestMean.test_big_data @ linux-x86_64 +test.test_statistics.TestMean.test_decimals @ linux-x86_64 +test.test_statistics.TestMean.test_doubled_data @ linux-x86_64 +test.test_statistics.TestMean.test_empty_data @ linux-x86_64 +test.test_statistics.TestMean.test_floats @ linux-x86_64 +test.test_statistics.TestMean.test_fractions @ linux-x86_64 +test.test_statistics.TestMean.test_inf @ linux-x86_64 +test.test_statistics.TestMean.test_ints @ linux-x86_64 +test.test_statistics.TestMean.test_mismatched_infs @ linux-x86_64 +test.test_statistics.TestMean.test_nan @ linux-x86_64 +test.test_statistics.TestMean.test_no_args @ linux-x86_64 +test.test_statistics.TestMean.test_no_inplace_modifications @ linux-x86_64 +test.test_statistics.TestMean.test_order_doesnt_matter @ linux-x86_64 +test.test_statistics.TestMean.test_range_data @ linux-x86_64 +test.test_statistics.TestMean.test_regression_20561 @ linux-x86_64 +test.test_statistics.TestMean.test_regression_25177 @ linux-x86_64 +test.test_statistics.TestMean.test_repeated_single_value @ linux-x86_64 +test.test_statistics.TestMean.test_single_value @ linux-x86_64 +test.test_statistics.TestMean.test_torture_pep @ linux-x86_64 +test.test_statistics.TestMean.test_type_of_data_collection @ linux-x86_64 +test.test_statistics.TestMean.test_type_of_data_element @ linux-x86_64 +test.test_statistics.TestMean.test_types_conserved @ linux-x86_64 +test.test_statistics.TestMedian.test_bad_arg_types @ linux-x86_64 +test.test_statistics.TestMedian.test_empty_data @ linux-x86_64 +test.test_statistics.TestMedian.test_even_decimals @ linux-x86_64 +test.test_statistics.TestMedian.test_even_fractions @ linux-x86_64 +test.test_statistics.TestMedian.test_even_ints @ linux-x86_64 +test.test_statistics.TestMedian.test_no_args @ linux-x86_64 +test.test_statistics.TestMedian.test_no_inplace_modifications @ linux-x86_64 +test.test_statistics.TestMedian.test_odd_decimals @ linux-x86_64 +test.test_statistics.TestMedian.test_odd_fractions @ linux-x86_64 +test.test_statistics.TestMedian.test_odd_ints @ linux-x86_64 +test.test_statistics.TestMedian.test_order_doesnt_matter @ linux-x86_64 +test.test_statistics.TestMedian.test_range_data @ linux-x86_64 +test.test_statistics.TestMedian.test_repeated_single_value @ linux-x86_64 +test.test_statistics.TestMedian.test_single_value @ linux-x86_64 +test.test_statistics.TestMedian.test_type_of_data_collection @ linux-x86_64 +test.test_statistics.TestMedian.test_type_of_data_element @ linux-x86_64 +test.test_statistics.TestMedianDataType.test_types_conserved @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_bad_arg_types @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_data_type_error @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_empty_data @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_even_decimals @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_even_fractions @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_even_ints @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_even_number_repeated @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_interval @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_no_args @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_no_inplace_modifications @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_odd_decimals @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_odd_fractions @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_odd_ints @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_odd_number_repeated @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_order_doesnt_matter @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_range_data @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_repeated_single_value @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_single_value @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_type_of_data_collection @ linux-x86_64 +test.test_statistics.TestMedianGrouped.test_type_of_data_element @ linux-x86_64 +test.test_statistics.TestMedianHigh.test_bad_arg_types @ linux-x86_64 +test.test_statistics.TestMedianHigh.test_empty_data @ linux-x86_64 +test.test_statistics.TestMedianHigh.test_even_decimals @ linux-x86_64 +test.test_statistics.TestMedianHigh.test_even_fractions @ linux-x86_64 +test.test_statistics.TestMedianHigh.test_even_ints @ linux-x86_64 +test.test_statistics.TestMedianHigh.test_no_args @ linux-x86_64 +test.test_statistics.TestMedianHigh.test_no_inplace_modifications @ linux-x86_64 +test.test_statistics.TestMedianHigh.test_odd_decimals @ linux-x86_64 +test.test_statistics.TestMedianHigh.test_odd_fractions @ linux-x86_64 +test.test_statistics.TestMedianHigh.test_odd_ints @ linux-x86_64 +test.test_statistics.TestMedianHigh.test_order_doesnt_matter @ linux-x86_64 +test.test_statistics.TestMedianHigh.test_range_data @ linux-x86_64 +test.test_statistics.TestMedianHigh.test_repeated_single_value @ linux-x86_64 +test.test_statistics.TestMedianHigh.test_single_value @ linux-x86_64 +test.test_statistics.TestMedianHigh.test_type_of_data_collection @ linux-x86_64 +test.test_statistics.TestMedianHigh.test_type_of_data_element @ linux-x86_64 +test.test_statistics.TestMedianHigh.test_types_conserved @ linux-x86_64 +test.test_statistics.TestMedianLow.test_bad_arg_types @ linux-x86_64 +test.test_statistics.TestMedianLow.test_empty_data @ linux-x86_64 +test.test_statistics.TestMedianLow.test_even_decimals @ linux-x86_64 +test.test_statistics.TestMedianLow.test_even_fractions @ linux-x86_64 +test.test_statistics.TestMedianLow.test_even_ints @ linux-x86_64 +test.test_statistics.TestMedianLow.test_no_args @ linux-x86_64 +test.test_statistics.TestMedianLow.test_no_inplace_modifications @ linux-x86_64 +test.test_statistics.TestMedianLow.test_odd_decimals @ linux-x86_64 +test.test_statistics.TestMedianLow.test_odd_fractions @ linux-x86_64 +test.test_statistics.TestMedianLow.test_odd_ints @ linux-x86_64 +test.test_statistics.TestMedianLow.test_order_doesnt_matter @ linux-x86_64 +test.test_statistics.TestMedianLow.test_range_data @ linux-x86_64 +test.test_statistics.TestMedianLow.test_repeated_single_value @ linux-x86_64 +test.test_statistics.TestMedianLow.test_single_value @ linux-x86_64 +test.test_statistics.TestMedianLow.test_type_of_data_collection @ linux-x86_64 +test.test_statistics.TestMedianLow.test_type_of_data_element @ linux-x86_64 +test.test_statistics.TestMedianLow.test_types_conserved @ linux-x86_64 +test.test_statistics.TestMode.test_bad_arg_types @ linux-x86_64 +test.test_statistics.TestMode.test_bimodal_data @ linux-x86_64 +test.test_statistics.TestMode.test_counter_data @ linux-x86_64 +test.test_statistics.TestMode.test_discrete_data @ linux-x86_64 +test.test_statistics.TestMode.test_empty_data @ linux-x86_64 +test.test_statistics.TestMode.test_no_args @ linux-x86_64 +test.test_statistics.TestMode.test_no_inplace_modifications @ linux-x86_64 +test.test_statistics.TestMode.test_nominal_data @ linux-x86_64 +test.test_statistics.TestMode.test_none_data @ linux-x86_64 +test.test_statistics.TestMode.test_order_doesnt_matter @ linux-x86_64 +test.test_statistics.TestMode.test_range_data @ linux-x86_64 +test.test_statistics.TestMode.test_repeated_single_value @ linux-x86_64 +test.test_statistics.TestMode.test_single_value @ linux-x86_64 +test.test_statistics.TestMode.test_type_of_data_collection @ linux-x86_64 +test.test_statistics.TestMode.test_type_of_data_element @ linux-x86_64 +test.test_statistics.TestMode.test_types_conserved @ linux-x86_64 +test.test_statistics.TestMode.test_unique_data @ linux-x86_64 +test.test_statistics.TestModules.test_py_functions @ linux-x86_64 +test.test_statistics.TestMultiMode.test_basics @ linux-x86_64 +test.test_statistics.TestNormalDistPython.test_alternative_constructor @ linux-x86_64 +test.test_statistics.TestNormalDistPython.test_cdf @ linux-x86_64 +test.test_statistics.TestNormalDistPython.test_copy @ linux-x86_64 +test.test_statistics.TestNormalDistPython.test_equality @ linux-x86_64 +test.test_statistics.TestNormalDistPython.test_hashability @ linux-x86_64 +test.test_statistics.TestNormalDistPython.test_instantiation_and_attributes @ linux-x86_64 +test.test_statistics.TestNormalDistPython.test_inv_cdf @ linux-x86_64 +test.test_statistics.TestNormalDistPython.test_pdf @ linux-x86_64 +test.test_statistics.TestNormalDistPython.test_pickle @ linux-x86_64 +test.test_statistics.TestNormalDistPython.test_properties @ linux-x86_64 +test.test_statistics.TestNormalDistPython.test_quantiles @ linux-x86_64 +test.test_statistics.TestNormalDistPython.test_repr @ linux-x86_64 +test.test_statistics.TestNormalDistPython.test_same_type_addition_and_subtraction @ linux-x86_64 +test.test_statistics.TestNormalDistPython.test_sample_generation @ linux-x86_64 +test.test_statistics.TestNormalDistPython.test_slots @ linux-x86_64 +test.test_statistics.TestNormalDistPython.test_translation_and_scaling @ linux-x86_64 +test.test_statistics.TestNormalDistPython.test_unary_operations @ linux-x86_64 +test.test_statistics.TestNormalDistPython.test_zscore @ linux-x86_64 +test.test_statistics.TestNumericTestCase.test_error_msg_numeric @ linux-x86_64 +test.test_statistics.TestNumericTestCase.test_error_msg_sequence @ linux-x86_64 +test.test_statistics.TestNumericTestCase.test_numerictestcase_is_testcase @ linux-x86_64 +test.test_statistics.TestPStdev.test_bad_arg_types @ linux-x86_64 +test.test_statistics.TestPStdev.test_center_not_at_mean @ linux-x86_64 +test.test_statistics.TestPStdev.test_compare_to_variance @ linux-x86_64 +test.test_statistics.TestPStdev.test_domain_error_regression @ linux-x86_64 +test.test_statistics.TestPStdev.test_empty_data @ linux-x86_64 +test.test_statistics.TestPStdev.test_iter_list_same @ linux-x86_64 +test.test_statistics.TestPStdev.test_no_args @ linux-x86_64 +test.test_statistics.TestPStdev.test_no_inplace_modifications @ linux-x86_64 +test.test_statistics.TestPStdev.test_order_doesnt_matter @ linux-x86_64 +test.test_statistics.TestPStdev.test_range_data @ linux-x86_64 +test.test_statistics.TestPStdev.test_repeated_single_value @ linux-x86_64 +test.test_statistics.TestPStdev.test_shift_data @ linux-x86_64 +test.test_statistics.TestPStdev.test_shift_data_exact @ linux-x86_64 +test.test_statistics.TestPStdev.test_single_value @ linux-x86_64 +test.test_statistics.TestPStdev.test_type_of_data_collection @ linux-x86_64 +test.test_statistics.TestPStdev.test_type_of_data_element @ linux-x86_64 +test.test_statistics.TestPVariance.test_accuracy_bug_20499 @ linux-x86_64 +test.test_statistics.TestPVariance.test_bad_arg_types @ linux-x86_64 +test.test_statistics.TestPVariance.test_decimals @ linux-x86_64 +test.test_statistics.TestPVariance.test_domain_error_regression @ linux-x86_64 +test.test_statistics.TestPVariance.test_empty_data @ linux-x86_64 +test.test_statistics.TestPVariance.test_exact_uniform @ linux-x86_64 +test.test_statistics.TestPVariance.test_fractions @ linux-x86_64 +test.test_statistics.TestPVariance.test_ints @ linux-x86_64 +test.test_statistics.TestPVariance.test_iter_list_same @ linux-x86_64 +test.test_statistics.TestPVariance.test_no_args @ linux-x86_64 +test.test_statistics.TestPVariance.test_no_inplace_modifications @ linux-x86_64 +test.test_statistics.TestPVariance.test_order_doesnt_matter @ linux-x86_64 +test.test_statistics.TestPVariance.test_range_data @ linux-x86_64 +test.test_statistics.TestPVariance.test_repeated_single_value @ linux-x86_64 +test.test_statistics.TestPVariance.test_shift_data @ linux-x86_64 +test.test_statistics.TestPVariance.test_shift_data_exact @ linux-x86_64 +test.test_statistics.TestPVariance.test_single_value @ linux-x86_64 +test.test_statistics.TestPVariance.test_type_of_data_collection @ linux-x86_64 +test.test_statistics.TestPVariance.test_type_of_data_element @ linux-x86_64 +test.test_statistics.TestPVariance.test_types_conserved @ linux-x86_64 +test.test_statistics.TestQuantiles.test_equal_inputs @ linux-x86_64 +test.test_statistics.TestQuantiles.test_equal_sized_groups @ linux-x86_64 +test.test_statistics.TestQuantiles.test_error_cases @ linux-x86_64 +test.test_statistics.TestQuantiles.test_specific_cases @ linux-x86_64 +test.test_statistics.TestQuantiles.test_specific_cases_inclusive @ linux-x86_64 +test.test_statistics.TestSign.testZeroes @ linux-x86_64 +test.test_statistics.TestSqrtHelpers.test_decimal_sqrt_of_frac @ linux-x86_64 +test.test_statistics.TestSqrtHelpers.test_float_sqrt_of_frac @ linux-x86_64 +test.test_statistics.TestSqrtHelpers.test_integer_sqrt_of_frac_rto @ linux-x86_64 +test.test_statistics.TestStdev.test_bad_arg_types @ linux-x86_64 +test.test_statistics.TestStdev.test_center_not_at_mean @ linux-x86_64 +test.test_statistics.TestStdev.test_compare_to_variance @ linux-x86_64 +test.test_statistics.TestStdev.test_domain_error_regression @ linux-x86_64 +test.test_statistics.TestStdev.test_empty_data @ linux-x86_64 +test.test_statistics.TestStdev.test_iter_list_same @ linux-x86_64 +test.test_statistics.TestStdev.test_no_args @ linux-x86_64 +test.test_statistics.TestStdev.test_no_inplace_modifications @ linux-x86_64 +test.test_statistics.TestStdev.test_order_doesnt_matter @ linux-x86_64 +test.test_statistics.TestStdev.test_range_data @ linux-x86_64 +test.test_statistics.TestStdev.test_repeated_single_value @ linux-x86_64 +test.test_statistics.TestStdev.test_shift_data @ linux-x86_64 +test.test_statistics.TestStdev.test_shift_data_exact @ linux-x86_64 +test.test_statistics.TestStdev.test_single_value @ linux-x86_64 +test.test_statistics.TestStdev.test_type_of_data_collection @ linux-x86_64 +test.test_statistics.TestStdev.test_type_of_data_element @ linux-x86_64 +test.test_statistics.TestSum.test_bytes_fail @ linux-x86_64 +test.test_statistics.TestSum.test_compare_with_math_fsum @ linux-x86_64 +test.test_statistics.TestSum.test_decimals @ linux-x86_64 +test.test_statistics.TestSum.test_empty_data @ linux-x86_64 +test.test_statistics.TestSum.test_floats @ linux-x86_64 +test.test_statistics.TestSum.test_fractions @ linux-x86_64 +test.test_statistics.TestSum.test_ints @ linux-x86_64 +test.test_statistics.TestSum.test_mixed_sum @ linux-x86_64 +test.test_statistics.TestSum.test_strings_fail @ linux-x86_64 +test.test_statistics.TestVariance.test_accuracy_bug_20499 @ linux-x86_64 +test.test_statistics.TestVariance.test_bad_arg_types @ linux-x86_64 +test.test_statistics.TestVariance.test_center_not_at_mean @ linux-x86_64 +test.test_statistics.TestVariance.test_decimals @ linux-x86_64 +test.test_statistics.TestVariance.test_domain_error_regression @ linux-x86_64 +test.test_statistics.TestVariance.test_empty_data @ linux-x86_64 +test.test_statistics.TestVariance.test_fractions @ linux-x86_64 +test.test_statistics.TestVariance.test_ints @ linux-x86_64 +test.test_statistics.TestVariance.test_iter_list_same @ linux-x86_64 +test.test_statistics.TestVariance.test_no_args @ linux-x86_64 +test.test_statistics.TestVariance.test_no_inplace_modifications @ linux-x86_64 +test.test_statistics.TestVariance.test_order_doesnt_matter @ linux-x86_64 +test.test_statistics.TestVariance.test_range_data @ linux-x86_64 +test.test_statistics.TestVariance.test_repeated_single_value @ linux-x86_64 +test.test_statistics.TestVariance.test_shift_data @ linux-x86_64 +test.test_statistics.TestVariance.test_shift_data_exact @ linux-x86_64 +test.test_statistics.TestVariance.test_single_value @ linux-x86_64 +test.test_statistics.TestVariance.test_type_of_data_collection @ linux-x86_64 +test.test_statistics.TestVariance.test_type_of_data_element @ linux-x86_64 +test.test_statistics.TestVariance.test_types_conserved @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_strftime.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_strftime.txt new file mode 100644 index 0000000000..74ab95bcf9 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_strftime.txt @@ -0,0 +1,4 @@ +test.test_strftime.StrftimeTest.test_strftime @ linux-x86_64 +test.test_strftime.Y1900Tests.test_y_1900 @ linux-x86_64 +test.test_strftime.Y1900Tests.test_y_after_1900 @ linux-x86_64 +test.test_strftime.Y1900Tests.test_y_before_1900 @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_string.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_string.txt new file mode 100644 index 0000000000..9c816c61b8 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_string.txt @@ -0,0 +1,38 @@ +test.test_string.ModuleTest.test_attrs @ linux-x86_64 +test.test_string.ModuleTest.test_auto_numbering @ linux-x86_64 +test.test_string.ModuleTest.test_basic_formatter @ linux-x86_64 +test.test_string.ModuleTest.test_capwords @ linux-x86_64 +test.test_string.ModuleTest.test_check_unused_args @ linux-x86_64 +test.test_string.ModuleTest.test_conversion_specifiers @ linux-x86_64 +test.test_string.ModuleTest.test_format_keyword_arguments @ linux-x86_64 +test.test_string.ModuleTest.test_index_lookup @ linux-x86_64 +test.test_string.ModuleTest.test_name_lookup @ linux-x86_64 +test.test_string.ModuleTest.test_override_convert_field @ linux-x86_64 +test.test_string.ModuleTest.test_override_format_field @ linux-x86_64 +test.test_string.ModuleTest.test_override_get_value @ linux-x86_64 +test.test_string.ModuleTest.test_override_parse @ linux-x86_64 +test.test_string.ModuleTest.test_vformat_recursion_limit @ linux-x86_64 +test.test_string.TestTemplate.test_SafeTemplate @ linux-x86_64 +test.test_string.TestTemplate.test_braced_override @ linux-x86_64 +test.test_string.TestTemplate.test_braced_override_safe @ linux-x86_64 +test.test_string.TestTemplate.test_delimiter_override @ linux-x86_64 +test.test_string.TestTemplate.test_escapes @ linux-x86_64 +test.test_string.TestTemplate.test_flags_override @ linux-x86_64 +test.test_string.TestTemplate.test_get_identifiers @ linux-x86_64 +test.test_string.TestTemplate.test_idpattern_override @ linux-x86_64 +test.test_string.TestTemplate.test_idpattern_override_inside_outside @ linux-x86_64 +test.test_string.TestTemplate.test_idpattern_override_inside_outside_invalid_unbraced @ linux-x86_64 +test.test_string.TestTemplate.test_invalid_placeholders @ linux-x86_64 +test.test_string.TestTemplate.test_invalid_with_no_lines @ linux-x86_64 +test.test_string.TestTemplate.test_is_valid @ linux-x86_64 +test.test_string.TestTemplate.test_keyword_arguments @ linux-x86_64 +test.test_string.TestTemplate.test_keyword_arguments_safe @ linux-x86_64 +test.test_string.TestTemplate.test_pattern_override @ linux-x86_64 +test.test_string.TestTemplate.test_percents @ linux-x86_64 +test.test_string.TestTemplate.test_regular_templates @ linux-x86_64 +test.test_string.TestTemplate.test_regular_templates_with_braces @ linux-x86_64 +test.test_string.TestTemplate.test_regular_templates_with_non_letters @ linux-x86_64 +test.test_string.TestTemplate.test_regular_templates_with_upper_case @ linux-x86_64 +test.test_string.TestTemplate.test_stringification @ linux-x86_64 +test.test_string.TestTemplate.test_tupleargs @ linux-x86_64 +test.test_string.TestTemplate.test_unicode_values @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_string_literals.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_string_literals.txt new file mode 100644 index 0000000000..b32b52c380 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_string_literals.txt @@ -0,0 +1,17 @@ +test.test_string_literals.TestLiterals.test_eval_bytes_incomplete @ linux-x86_64 +test.test_string_literals.TestLiterals.test_eval_bytes_invalid_escape @ linux-x86_64 +test.test_string_literals.TestLiterals.test_eval_bytes_normal @ linux-x86_64 +test.test_string_literals.TestLiterals.test_eval_bytes_raw @ linux-x86_64 +test.test_string_literals.TestLiterals.test_eval_str_incomplete @ linux-x86_64 +test.test_string_literals.TestLiterals.test_eval_str_invalid_escape @ linux-x86_64 +test.test_string_literals.TestLiterals.test_eval_str_normal @ linux-x86_64 +test.test_string_literals.TestLiterals.test_eval_str_raw @ linux-x86_64 +test.test_string_literals.TestLiterals.test_eval_str_u @ linux-x86_64 +test.test_string_literals.TestLiterals.test_file_iso_8859_1 @ linux-x86_64 +test.test_string_literals.TestLiterals.test_file_latin9 @ linux-x86_64 +test.test_string_literals.TestLiterals.test_file_latin_1 @ linux-x86_64 +test.test_string_literals.TestLiterals.test_file_utf8 @ linux-x86_64 +test.test_string_literals.TestLiterals.test_file_utf_8 @ linux-x86_64 +test.test_string_literals.TestLiterals.test_file_utf_8_error @ linux-x86_64 +test.test_string_literals.TestLiterals.test_template @ linux-x86_64 +test.test_string_literals.TestLiterals.test_uppercase_prefixes @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_stringprep.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_stringprep.txt new file mode 100644 index 0000000000..e2f25ed430 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_stringprep.txt @@ -0,0 +1 @@ +test.test_stringprep.StringprepTests.test @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_strptime.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_strptime.txt new file mode 100644 index 0000000000..19cadf94f5 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_strptime.txt @@ -0,0 +1,42 @@ +test.test_strptime.CacheTests.test_TimeRE_recreation_locale @ linux-x86_64 +test.test_strptime.CacheTests.test_new_localetime @ linux-x86_64 +test.test_strptime.CacheTests.test_regex_cleanup @ linux-x86_64 +test.test_strptime.CacheTests.test_time_re_recreation @ linux-x86_64 +test.test_strptime.CalculationTests.test_week_0 @ linux-x86_64 +test.test_strptime.JulianTests.test_all_julian_days @ linux-x86_64 +test.test_strptime.LocaleTime_Tests.test_am_pm @ linux-x86_64 +test.test_strptime.LocaleTime_Tests.test_date_time @ linux-x86_64 +test.test_strptime.LocaleTime_Tests.test_lang @ linux-x86_64 +test.test_strptime.LocaleTime_Tests.test_month @ linux-x86_64 +test.test_strptime.LocaleTime_Tests.test_timezone @ linux-x86_64 +test.test_strptime.LocaleTime_Tests.test_weekday @ linux-x86_64 +test.test_strptime.Strptime12AMPMTests.test_twelve_noon_midnight @ linux-x86_64 +test.test_strptime.StrptimeTests.test_ValueError @ linux-x86_64 +test.test_strptime.StrptimeTests.test_bad_offset @ linux-x86_64 +test.test_strptime.StrptimeTests.test_caseinsensitive @ linux-x86_64 +test.test_strptime.StrptimeTests.test_date @ linux-x86_64 +test.test_strptime.StrptimeTests.test_date_time @ linux-x86_64 +test.test_strptime.StrptimeTests.test_day @ linux-x86_64 +test.test_strptime.StrptimeTests.test_defaults @ linux-x86_64 +test.test_strptime.StrptimeTests.test_escaping @ linux-x86_64 +test.test_strptime.StrptimeTests.test_feb29_on_leap_year_without_year @ linux-x86_64 +test.test_strptime.StrptimeTests.test_fraction @ linux-x86_64 +test.test_strptime.StrptimeTests.test_hour @ linux-x86_64 +test.test_strptime.StrptimeTests.test_julian @ linux-x86_64 +test.test_strptime.StrptimeTests.test_mar1_comes_after_feb29_even_when_omitting_the_year @ linux-x86_64 +test.test_strptime.StrptimeTests.test_minute @ linux-x86_64 +test.test_strptime.StrptimeTests.test_month @ linux-x86_64 +test.test_strptime.StrptimeTests.test_offset @ linux-x86_64 +test.test_strptime.StrptimeTests.test_percent @ linux-x86_64 +test.test_strptime.StrptimeTests.test_second @ linux-x86_64 +test.test_strptime.StrptimeTests.test_strptime_exception_context @ linux-x86_64 +test.test_strptime.StrptimeTests.test_time @ linux-x86_64 +test.test_strptime.StrptimeTests.test_unconverteddata @ linux-x86_64 +test.test_strptime.StrptimeTests.test_year @ linux-x86_64 +test.test_strptime.TimeRETests.test_blankpattern @ linux-x86_64 +test.test_strptime.TimeRETests.test_locale_data_w_regex_metacharacters @ linux-x86_64 +test.test_strptime.TimeRETests.test_matching_with_escapes @ linux-x86_64 +test.test_strptime.TimeRETests.test_pattern @ linux-x86_64 +test.test_strptime.TimeRETests.test_pattern_escaping @ linux-x86_64 +test.test_strptime.TimeRETests.test_whitespace_substitution @ linux-x86_64 +test.test_strptime.getlang_Tests.test_basic @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_strtod.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_strtod.txt new file mode 100644 index 0000000000..a2fa1b0d6a --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_strtod.txt @@ -0,0 +1,8 @@ +test.test_strtod.StrtodTests.test_bigcomp @ linux-x86_64 +test.test_strtod.StrtodTests.test_boundaries @ linux-x86_64 +test.test_strtod.StrtodTests.test_halfway_cases @ linux-x86_64 +test.test_strtod.StrtodTests.test_large_exponents @ linux-x86_64 +test.test_strtod.StrtodTests.test_parsing @ linux-x86_64 +test.test_strtod.StrtodTests.test_particular @ linux-x86_64 +test.test_strtod.StrtodTests.test_short_halfway_cases @ linux-x86_64 +test.test_strtod.StrtodTests.test_underflow_boundary @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_struct.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_struct.txt new file mode 100644 index 0000000000..5f8800bf43 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_struct.txt @@ -0,0 +1,30 @@ +test.test_struct.StructTest.test_1530559 @ linux-x86_64 +test.test_struct.StructTest.test_705836 @ linux-x86_64 +test.test_struct.StructTest.test_Struct_reinitialization @ linux-x86_64 +test.test_struct.StructTest.test_bool @ linux-x86_64 +test.test_struct.StructTest.test_boundary_error_message @ linux-x86_64 +test.test_struct.StructTest.test_boundary_error_message_with_large_offset @ linux-x86_64 +test.test_struct.StructTest.test_boundary_error_message_with_negative_offset @ linux-x86_64 +test.test_struct.StructTest.test_calcsize @ linux-x86_64 +test.test_struct.StructTest.test_consistence @ linux-x86_64 +test.test_struct.StructTest.test_format_attr @ linux-x86_64 +test.test_struct.StructTest.test_integers @ linux-x86_64 +test.test_struct.StructTest.test_isbigendian @ linux-x86_64 +test.test_struct.StructTest.test_issue29802 @ linux-x86_64 +test.test_struct.StructTest.test_issue35714 @ linux-x86_64 +test.test_struct.StructTest.test_nN_code @ linux-x86_64 +test.test_struct.StructTest.test_new_features @ linux-x86_64 +test.test_struct.StructTest.test_p_code @ linux-x86_64 +test.test_struct.StructTest.test_pack_into @ linux-x86_64 +test.test_struct.StructTest.test_pack_into_fn @ linux-x86_64 +test.test_struct.StructTest.test_trailing_counter @ linux-x86_64 +test.test_struct.StructTest.test_transitiveness @ linux-x86_64 +test.test_struct.StructTest.test_unpack_from @ linux-x86_64 +test.test_struct.StructTest.test_unpack_with_buffer @ linux-x86_64 +test.test_struct.UnpackIteratorTest.test_arbitrary_buffer @ linux-x86_64 +test.test_struct.UnpackIteratorTest.test_construct @ linux-x86_64 +test.test_struct.UnpackIteratorTest.test_half_float @ linux-x86_64 +test.test_struct.UnpackIteratorTest.test_iterate @ linux-x86_64 +test.test_struct.UnpackIteratorTest.test_length_hint @ linux-x86_64 +test.test_struct.UnpackIteratorTest.test_module_func @ linux-x86_64 +test.test_struct.UnpackIteratorTest.test_uninstantiable @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_structseq.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_structseq.txt new file mode 100644 index 0000000000..4476e422b9 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_structseq.txt @@ -0,0 +1,15 @@ +test.test_structseq.StructSeqTest.test_cmp @ linux-x86_64 +test.test_structseq.StructSeqTest.test_concat @ linux-x86_64 +test.test_structseq.StructSeqTest.test_constructor @ linux-x86_64 +test.test_structseq.StructSeqTest.test_contains @ linux-x86_64 +test.test_structseq.StructSeqTest.test_copying @ linux-x86_64 +test.test_structseq.StructSeqTest.test_copying_with_unnamed_fields @ linux-x86_64 +test.test_structseq.StructSeqTest.test_eviltuple @ linux-x86_64 +test.test_structseq.StructSeqTest.test_extended_getslice @ linux-x86_64 +test.test_structseq.StructSeqTest.test_fields @ linux-x86_64 +test.test_structseq.StructSeqTest.test_hash @ linux-x86_64 +test.test_structseq.StructSeqTest.test_pickling @ linux-x86_64 +test.test_structseq.StructSeqTest.test_pickling_with_unnamed_fields @ linux-x86_64 +test.test_structseq.StructSeqTest.test_repeat @ linux-x86_64 +test.test_structseq.StructSeqTest.test_repr @ linux-x86_64 +test.test_structseq.StructSeqTest.test_tuple @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_subclassinit.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_subclassinit.txt new file mode 100644 index 0000000000..1e3a8fc825 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_subclassinit.txt @@ -0,0 +1,17 @@ +test.test_subclassinit.Test.test_errors @ linux-x86_64 +test.test_subclassinit.Test.test_errors_changed_pep487 @ linux-x86_64 +test.test_subclassinit.Test.test_init_subclass @ linux-x86_64 +test.test_subclassinit.Test.test_init_subclass_diamond @ linux-x86_64 +test.test_subclassinit.Test.test_init_subclass_dict @ linux-x86_64 +test.test_subclassinit.Test.test_init_subclass_error @ linux-x86_64 +test.test_subclassinit.Test.test_init_subclass_kwargs @ linux-x86_64 +test.test_subclassinit.Test.test_init_subclass_skipped @ linux-x86_64 +test.test_subclassinit.Test.test_init_subclass_wrong @ linux-x86_64 +test.test_subclassinit.Test.test_set_name @ linux-x86_64 +test.test_subclassinit.Test.test_set_name_error @ linux-x86_64 +test.test_subclassinit.Test.test_set_name_init_subclass @ linux-x86_64 +test.test_subclassinit.Test.test_set_name_lookup @ linux-x86_64 +test.test_subclassinit.Test.test_set_name_metaclass @ linux-x86_64 +test.test_subclassinit.Test.test_set_name_modifying_dict @ linux-x86_64 +test.test_subclassinit.Test.test_set_name_wrong @ linux-x86_64 +test.test_subclassinit.Test.test_type @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_subprocess.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_subprocess.txt new file mode 100644 index 0000000000..747e33cd93 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_subprocess.txt @@ -0,0 +1,170 @@ +test.test_subprocess.ContextManagerTests.test_broken_pipe_cleanup @ linux-x86_64 +test.test_subprocess.ContextManagerTests.test_communicate_stdin @ linux-x86_64 +test.test_subprocess.ContextManagerTests.test_invalid_args @ linux-x86_64 +test.test_subprocess.ContextManagerTests.test_pipe @ linux-x86_64 +test.test_subprocess.ContextManagerTests.test_returncode @ linux-x86_64 +test.test_subprocess.MiscTests.test__all__ @ linux-x86_64 +test.test_subprocess.MiscTests.test_call_keyboardinterrupt_no_kill @ linux-x86_64 +test.test_subprocess.MiscTests.test_context_manager_keyboardinterrupt_no_kill @ linux-x86_64 +test.test_subprocess.MiscTests.test_getoutput @ linux-x86_64 +test.test_subprocess.MiscTests.test_run_keyboardinterrupt_no_kill @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_CalledProcessError_str_non_zero @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_CalledProcessError_str_signal @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_CalledProcessError_str_unknown_signal @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_args_string @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_bytes_program @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_call_string @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_close_fd_0 @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_close_fd_1 @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_close_fd_2 @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_close_fds_0_1 @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_close_fds_0_1_2 @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_close_fds_0_2 @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_close_fds_1_2 @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_close @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_close_with_timeout @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_flush @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_write @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_communicate_repeated_call_after_stdout_close @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_exception_bad_args_0 @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_exception_bad_executable @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_exception_cwd @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_exception_errpipe_bad_data @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_exception_errpipe_normal @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_extra_groups_error @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_group_error @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_invalid_args @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_kill @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_kill_dead @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_remapping_std_fds @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_select_unbuffered @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_send_signal @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_send_signal_dead @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_send_signal_race @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_send_signal_race2 @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_shell_sequence @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_shell_string @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_small_errpipe_write_fd @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_specific_shell @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_start_new_session @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_stderr_stdin_are_single_inout_fd @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_stdout_stderr_are_single_inout_fd @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_stdout_stdin_are_single_inout_fd @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_stopped @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_swap_fds @ linux-x86_64 +!test.test_subprocess.POSIXProcessTestCase.test_swap_std_fds_with_one_closed @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_terminate_dead @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_user_error @ linux-x86_64 +test.test_subprocess.POSIXProcessTestCase.test_wait_when_sigchild_ignored @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_bufsize_equal_one_binary_mode @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_bufsize_equal_one_text_mode @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_bufsize_is_none @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_bytes_executable @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_bytes_executable_replaces_shell @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_call_kwargs @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_call_seq @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_call_timeout @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_check_call_nonzero @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_check_call_zero @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_check_output @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_check_output_input_arg @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_check_output_input_none @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_check_output_input_none_encoding_errors @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_check_output_input_none_text @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_check_output_input_none_universal_newlines @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_check_output_nonzero @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_check_output_stderr @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_check_output_stdin_arg @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_check_output_stdin_with_input_arg @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_check_output_stdout_arg @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_class_getitems @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_eintr @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_epipe @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_epipe_only_stdin @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_errors @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_pipe_buf @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_pipe_fd_leak @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_returns @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_stderr @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_stdin @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_stdout @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_timeout @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_communicate_timeout_large_output @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_cwd @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_cwd_with_absolute_arg @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_cwd_with_bytes @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_cwd_with_pathlike @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_cwd_with_relative_arg @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_cwd_with_relative_executable @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_double_close_on_error @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_empty_env @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_env @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_executable @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_executable_replaces_shell @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_executable_takes_precedence @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_executable_with_cwd @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_executable_without_cwd @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_failed_child_execute_fd_leak @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_file_not_found_includes_filename @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_file_not_found_with_bad_cwd @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_handles_closed_on_exception @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_invalid_args @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_invalid_bufsize @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_invalid_cmd @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_invalid_env @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_io_buffered_by_default @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_io_unbuffered_works @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_issue8780 @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_leaking_fds_on_error @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_list2cmdline @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_pathlike_executable @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_pathlike_executable_replaces_shell @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_poll @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_repr @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stderr_devnull @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stderr_filedes @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stderr_fileobj @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stderr_none @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stderr_pipe @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stderr_redirect_with_no_stdout_redirect @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdin_devnull @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdin_filedes @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdin_fileobj @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdin_none @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdin_pipe @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdout_devnull @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdout_filedes @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdout_filedes_of_stdout @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdout_fileobj @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdout_none @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdout_pipe @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdout_stderr_file @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_stdout_stderr_pipe @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_threadsafe_wait @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_universal_newlines_and_text @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_universal_newlines_communicate @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_universal_newlines_communicate_encodings @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_universal_newlines_communicate_input_none @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_universal_newlines_communicate_stdin @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_universal_newlines_communicate_stdin_stdout_stderr @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_wait @ linux-x86_64 +test.test_subprocess.ProcessTestCase.test_writes_before_communicate @ linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_capture_output @ linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_capture_stderr @ linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_capture_stdout @ linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_check @ linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_check_output_input_arg @ linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_check_output_stdin_arg @ linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_check_output_stdin_with_input_arg @ linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_check_zero @ linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_encoding_warning @ linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_returncode @ linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_run_kwargs @ linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_run_with_bytes_path_and_arguments @ linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_run_with_pathlike_path @ linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_run_with_pathlike_path_and_arguments @ linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_run_with_shell_timeout_and_capture_output @ linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_stderr_with_capture_output_arg @ linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_stdout_with_capture_output_arg @ linux-x86_64 +test.test_subprocess.RunFuncTestCase.test_timeout @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sundry.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sundry.txt new file mode 100644 index 0000000000..c4f66e6af7 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sundry.txt @@ -0,0 +1 @@ +test.test_sundry.TestUntestedModules.test_untested_modules_can_be_imported @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_super.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_super.txt new file mode 100644 index 0000000000..7934a15c8a --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_super.txt @@ -0,0 +1,18 @@ +test.test_super.TestSuper.test___class___classmethod @ linux-x86_64 +test.test_super.TestSuper.test___class___delayed @ linux-x86_64 +test.test_super.TestSuper.test___class___instancemethod @ linux-x86_64 +test.test_super.TestSuper.test___class___new @ linux-x86_64 +test.test_super.TestSuper.test___class___staticmethod @ linux-x86_64 +test.test_super.TestSuper.test___classcell___expected_behaviour @ linux-x86_64 +test.test_super.TestSuper.test___classcell___overwrite @ linux-x86_64 +test.test_super.TestSuper.test_basics_working @ linux-x86_64 +test.test_super.TestSuper.test_cell_as_self @ linux-x86_64 +test.test_super.TestSuper.test_class_getattr_working @ linux-x86_64 +test.test_super.TestSuper.test_class_methods_still_working @ linux-x86_64 +test.test_super.TestSuper.test_obscure_super_errors @ linux-x86_64 +test.test_super.TestSuper.test_subclass_no_override_working @ linux-x86_64 +test.test_super.TestSuper.test_super_in_class_methods_working @ linux-x86_64 +test.test_super.TestSuper.test_super_init_leaks @ linux-x86_64 +test.test_super.TestSuper.test_super_with_closure @ linux-x86_64 +test.test_super.TestSuper.test_unbound_method_transfer_working @ linux-x86_64 +test.test_super.TestSuper.test_various___class___pathologies @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_support.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_support.txt new file mode 100644 index 0000000000..b8d3805bb1 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_support.txt @@ -0,0 +1,41 @@ +test.test_support.TestSupport.test_CleanImport @ linux-x86_64 +test.test_support.TestSupport.test_DirsOnSysPath @ linux-x86_64 +test.test_support.TestSupport.test_HOST @ linux-x86_64 +test.test_support.TestSupport.test_bind_port @ linux-x86_64 +test.test_support.TestSupport.test_captured_stderr @ linux-x86_64 +test.test_support.TestSupport.test_captured_stdin @ linux-x86_64 +test.test_support.TestSupport.test_captured_stdout @ linux-x86_64 +test.test_support.TestSupport.test_change_cwd @ linux-x86_64 +test.test_support.TestSupport.test_change_cwd__chdir_warning @ linux-x86_64 +test.test_support.TestSupport.test_change_cwd__non_existent_dir @ linux-x86_64 +test.test_support.TestSupport.test_change_cwd__non_existent_dir__quiet_true @ linux-x86_64 +test.test_support.TestSupport.test_check__all__ @ linux-x86_64 +test.test_support.TestSupport.test_check_syntax_error @ linux-x86_64 +test.test_support.TestSupport.test_detect_api_mismatch @ linux-x86_64 +test.test_support.TestSupport.test_detect_api_mismatch__ignore @ linux-x86_64 +test.test_support.TestSupport.test_fd_count @ linux-x86_64 +test.test_support.TestSupport.test_find_unused_port @ linux-x86_64 +test.test_support.TestSupport.test_forget @ linux-x86_64 +test.test_support.TestSupport.test_gc_collect @ linux-x86_64 +test.test_support.TestSupport.test_get_attribute @ linux-x86_64 +test.test_support.TestSupport.test_has_strftime_extensions @ linux-x86_64 +test.test_support.TestSupport.test_ignored_deprecations_are_silent @ linux-x86_64 +test.test_support.TestSupport.test_import_fresh_module @ linux-x86_64 +test.test_support.TestSupport.test_import_module @ linux-x86_64 +test.test_support.TestSupport.test_make_bad_fd @ linux-x86_64 +test.test_support.TestSupport.test_parse_memlimit @ linux-x86_64 +test.test_support.TestSupport.test_print_warning @ linux-x86_64 +test.test_support.TestSupport.test_python_is_optimized @ linux-x86_64 +test.test_support.TestSupport.test_rmtree @ linux-x86_64 +test.test_support.TestSupport.test_set_memlimit @ linux-x86_64 +test.test_support.TestSupport.test_sortdict @ linux-x86_64 +test.test_support.TestSupport.test_swap_attr @ linux-x86_64 +test.test_support.TestSupport.test_swap_item @ linux-x86_64 +test.test_support.TestSupport.test_temp_cwd @ linux-x86_64 +test.test_support.TestSupport.test_temp_cwd__name_none @ linux-x86_64 +test.test_support.TestSupport.test_temp_dir @ linux-x86_64 +test.test_support.TestSupport.test_temp_dir__existing_dir__quiet_default @ linux-x86_64 +test.test_support.TestSupport.test_temp_dir__existing_dir__quiet_true @ linux-x86_64 +test.test_support.TestSupport.test_temp_dir__path_none @ linux-x86_64 +test.test_support.TestSupport.test_unlink @ linux-x86_64 +test.test_support.TestSupport.test_unload @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_syntax.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_syntax.txt new file mode 100644 index 0000000000..9daf680aec --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_syntax.txt @@ -0,0 +1,27 @@ +DocTestCase.test.test_syntax @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_assign_call @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_assign_del @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_bad_outdent @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_barry_as_flufl_with_syntax_errors @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_break_outside_loop @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_case_call_does_not_raise_syntax_error @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_continuation_bad_indentation @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_continue_outside_loop @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_curly_brace_after_primary_raises_immediately @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_empty_line_after_linecont @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_error_string_literal @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_except_star_then_except @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_except_then_except_star @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_expression_with_assignment @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_generator_in_function_call @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_global_param_err_first @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_invalid_line_continuation_left_recursive @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_kwargs_last @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_kwargs_last2 @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_kwargs_last3 @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_match_call_does_not_raise_syntax_error @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_no_indent @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_nonlocal_param_err_first @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_return_outside_function @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_unexpected_indent @ linux-x86_64 +test.test_syntax.SyntaxTestCase.test_yield_outside_function @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sys.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sys.txt new file mode 100644 index 0000000000..46b062ae4d --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sys.txt @@ -0,0 +1,39 @@ +test.test_sys.ActiveExceptionTests.test_exc_info_no_exception @ linux-x86_64 +test.test_sys.ActiveExceptionTests.test_exc_info_with_exception_instance @ linux-x86_64 +test.test_sys.ActiveExceptionTests.test_exc_info_with_exception_type @ linux-x86_64 +test.test_sys.ActiveExceptionTests.test_sys_exception_no_exception @ linux-x86_64 +test.test_sys.ActiveExceptionTests.test_sys_exception_with_exception_instance @ linux-x86_64 +test.test_sys.ActiveExceptionTests.test_sys_exception_with_exception_type @ linux-x86_64 +test.test_sys.DisplayHookTest.test_custom_displayhook @ linux-x86_64 +test.test_sys.DisplayHookTest.test_lost_displayhook @ linux-x86_64 +test.test_sys.DisplayHookTest.test_original_displayhook @ linux-x86_64 +test.test_sys.ExceptHookTest.test_excepthook @ linux-x86_64 +test.test_sys.ExceptHookTest.test_excepthook_bytes_filename @ linux-x86_64 +test.test_sys.ExceptHookTest.test_original_excepthook @ linux-x86_64 +test.test_sys.SysModuleTest.test_43581 @ linux-x86_64 +test.test_sys.SysModuleTest.test_attributes @ linux-x86_64 +test.test_sys.SysModuleTest.test_c_locale_surrogateescape @ linux-x86_64 +test.test_sys.SysModuleTest.test_dlopenflags @ linux-x86_64 +test.test_sys.SysModuleTest.test_executable @ linux-x86_64 +test.test_sys.SysModuleTest.test_exit @ linux-x86_64 +test.test_sys.SysModuleTest.test_getdefaultencoding @ linux-x86_64 +test.test_sys.SysModuleTest.test_getfilesystemencoding @ linux-x86_64 +test.test_sys.SysModuleTest.test_getframe @ linux-x86_64 +test.test_sys.SysModuleTest.test_getrecursionlimit @ linux-x86_64 +test.test_sys.SysModuleTest.test_implementation @ linux-x86_64 +test.test_sys.SysModuleTest.test_intern @ linux-x86_64 +test.test_sys.SysModuleTest.test_ioencoding @ linux-x86_64 +test.test_sys.SysModuleTest.test_module_names @ linux-x86_64 +test.test_sys.SysModuleTest.test_no_duplicates_in_meta_path @ linux-x86_64 +test.test_sys.SysModuleTest.test_orig_argv @ linux-x86_64 +test.test_sys.SysModuleTest.test_posix_locale_surrogateescape @ linux-x86_64 +test.test_sys.SysModuleTest.test_recursionlimit_recovery @ linux-x86_64 +test.test_sys.SysModuleTest.test_setrecursionlimit @ linux-x86_64 +test.test_sys.SysModuleTest.test_stdlib_dir @ linux-x86_64 +test.test_sys.SysModuleTest.test_switchinterval @ linux-x86_64 +test.test_sys.SysModuleTest.test_sys_flags @ linux-x86_64 +test.test_sys.SysModuleTest.test_sys_flags_no_instantiation @ linux-x86_64 +test.test_sys.SysModuleTest.test_sys_ignores_cleaning_up_user_data @ linux-x86_64 +test.test_sys.SysModuleTest.test_sys_tracebacklimit @ linux-x86_64 +test.test_sys.SysModuleTest.test_sys_version_info_no_instantiation @ linux-x86_64 +test.test_sys.SysModuleTest.test_thread_info @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sysconfig.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sysconfig.txt new file mode 100644 index 0000000000..620a3a68d6 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_sysconfig.txt @@ -0,0 +1,18 @@ +test.test_sysconfig.MakefileTests.test_parse_makefile @ linux-x86_64 +test.test_sysconfig.TestSysConfig.test_EXT_SUFFIX_in_vars @ linux-x86_64 +test.test_sysconfig.TestSysConfig.test_get_config_h_filename @ linux-x86_64 +test.test_sysconfig.TestSysConfig.test_get_config_vars @ linux-x86_64 +test.test_sysconfig.TestSysConfig.test_get_default_scheme @ linux-x86_64 +test.test_sysconfig.TestSysConfig.test_get_path @ linux-x86_64 +test.test_sysconfig.TestSysConfig.test_get_path_names @ linux-x86_64 +test.test_sysconfig.TestSysConfig.test_get_paths @ linux-x86_64 +test.test_sysconfig.TestSysConfig.test_get_platform @ linux-x86_64 +test.test_sysconfig.TestSysConfig.test_get_preferred_schemes @ linux-x86_64 +test.test_sysconfig.TestSysConfig.test_get_scheme_names @ linux-x86_64 +test.test_sysconfig.TestSysConfig.test_ldshared_value @ linux-x86_64 +test.test_sysconfig.TestSysConfig.test_main @ linux-x86_64 +test.test_sysconfig.TestSysConfig.test_nt_venv_scheme @ linux-x86_64 +test.test_sysconfig.TestSysConfig.test_posix_venv_scheme @ linux-x86_64 +test.test_sysconfig.TestSysConfig.test_srcdir_independent_of_cwd @ linux-x86_64 +test.test_sysconfig.TestSysConfig.test_user_similar @ linux-x86_64 +test.test_sysconfig.TestSysConfig.test_venv_scheme @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tabnanny.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tabnanny.txt new file mode 100644 index 0000000000..3612533e2f --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tabnanny.txt @@ -0,0 +1,19 @@ +test.test_tabnanny.TestCheck.test_correct_directory @ linux-x86_64 +test.test_tabnanny.TestCheck.test_correct_directory_verbose @ linux-x86_64 +test.test_tabnanny.TestCheck.test_correct_file @ linux-x86_64 +test.test_tabnanny.TestCheck.test_errored_directory @ linux-x86_64 +test.test_tabnanny.TestCheck.test_when_nannynag_error @ linux-x86_64 +test.test_tabnanny.TestCheck.test_when_nannynag_error_verbose @ linux-x86_64 +test.test_tabnanny.TestCheck.test_when_no_file @ linux-x86_64 +test.test_tabnanny.TestCheck.test_when_tokenize_tokenerror @ linux-x86_64 +test.test_tabnanny.TestCheck.test_when_wrong_indented @ linux-x86_64 +test.test_tabnanny.TestCommandLine.test_double_verbose_mode @ linux-x86_64 +test.test_tabnanny.TestCommandLine.test_quiet_flag @ linux-x86_64 +test.test_tabnanny.TestCommandLine.test_verbose_mode @ linux-x86_64 +test.test_tabnanny.TestCommandLine.test_with_error_free_file @ linux-x86_64 +test.test_tabnanny.TestCommandLine.test_with_errored_file @ linux-x86_64 +test.test_tabnanny.TestErrPrint.test_errprint @ linux-x86_64 +test.test_tabnanny.TestFormatWitnesses.test_format_witnesses @ linux-x86_64 +test.test_tabnanny.TestNannyNag.test_all_methods @ linux-x86_64 +test.test_tabnanny.TestProcessTokens.test_with_correct_code @ linux-x86_64 +test.test_tabnanny.TestProcessTokens.test_with_errored_codes_samples @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tarfile.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tarfile.txt new file mode 100644 index 0000000000..e903613266 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tarfile.txt @@ -0,0 +1,552 @@ +test.test_tarfile.AppendTest.test_empty @ linux-x86_64 +test.test_tarfile.AppendTest.test_empty_fileobj @ linux-x86_64 +test.test_tarfile.AppendTest.test_existing @ linux-x86_64 +test.test_tarfile.AppendTest.test_fileobj @ linux-x86_64 +test.test_tarfile.AppendTest.test_incomplete @ linux-x86_64 +test.test_tarfile.AppendTest.test_invalid @ linux-x86_64 +test.test_tarfile.AppendTest.test_non_existing @ linux-x86_64 +test.test_tarfile.AppendTest.test_null @ linux-x86_64 +test.test_tarfile.AppendTest.test_premature_eof @ linux-x86_64 +test.test_tarfile.AppendTest.test_trailing_garbage @ linux-x86_64 +test.test_tarfile.Bz2AppendTest.test_append_compressed @ linux-x86_64 +test.test_tarfile.Bz2CreateTest.test_create @ linux-x86_64 +test.test_tarfile.Bz2CreateTest.test_create_existing @ linux-x86_64 +test.test_tarfile.Bz2CreateTest.test_create_existing_taropen @ linux-x86_64 +test.test_tarfile.Bz2CreateTest.test_create_pathlike_name @ linux-x86_64 +test.test_tarfile.Bz2CreateTest.test_create_taropen @ linux-x86_64 +test.test_tarfile.Bz2CreateTest.test_create_taropen_pathlike_name @ linux-x86_64 +test.test_tarfile.Bz2CreateTest.test_create_with_compresslevel @ linux-x86_64 +test.test_tarfile.Bz2CreateTest.test_eof_marker @ linux-x86_64 +test.test_tarfile.Bz2CreateTest.test_fileobj_no_close @ linux-x86_64 +test.test_tarfile.Bz2DetectReadTest.test_detect_file @ linux-x86_64 +test.test_tarfile.Bz2DetectReadTest.test_detect_fileobj @ linux-x86_64 +test.test_tarfile.Bz2DetectReadTest.test_detect_stream_bz2 @ linux-x86_64 +test.test_tarfile.Bz2ListTest.test_list @ linux-x86_64 +test.test_tarfile.Bz2ListTest.test_list_members @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_check_members @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_empty_name_attribute @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_empty_tarfile @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_extract_directory @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_extract_hardlink @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_extract_pathlike_name @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_extractall @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_extractall_pathlike_name @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_fail_comp @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_fileobj_with_offset @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_find_members @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_ignore_zeros @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_illegal_mode_arg @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_init_close_fobj @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_int_name_attribute @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_is_tarfile_erroneous @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_is_tarfile_keeps_position @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_is_tarfile_valid @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_length_zero_header @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_next_on_empty_tarfile @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_no_name_attribute @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_non_existent_tarfile @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_null_tarfile @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_parallel_iteration @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_pathlike_name @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_premature_end_of_archive @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_v7_dirtype @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_xstar_type @ linux-x86_64 +test.test_tarfile.Bz2MiscReadTest.test_zlib_error_does_not_leak @ linux-x86_64 +test.test_tarfile.Bz2PartialReadTest.test_partial_input @ linux-x86_64 +test.test_tarfile.Bz2PartialReadTest.test_partial_input_bz2 @ linux-x86_64 +test.test_tarfile.Bz2StreamReadTest.test_compare_members @ linux-x86_64 +test.test_tarfile.Bz2StreamReadTest.test_empty_tarfile @ linux-x86_64 +test.test_tarfile.Bz2StreamReadTest.test_fileobj_regular_file @ linux-x86_64 +test.test_tarfile.Bz2StreamReadTest.test_ignore_zeros @ linux-x86_64 +test.test_tarfile.Bz2StreamReadTest.test_is_tarfile_erroneous @ linux-x86_64 +test.test_tarfile.Bz2StreamReadTest.test_is_tarfile_keeps_position @ linux-x86_64 +test.test_tarfile.Bz2StreamReadTest.test_is_tarfile_valid @ linux-x86_64 +test.test_tarfile.Bz2StreamReadTest.test_length_zero_header @ linux-x86_64 +test.test_tarfile.Bz2StreamReadTest.test_non_existent_tarfile @ linux-x86_64 +test.test_tarfile.Bz2StreamReadTest.test_null_tarfile @ linux-x86_64 +test.test_tarfile.Bz2StreamReadTest.test_premature_end_of_archive @ linux-x86_64 +test.test_tarfile.Bz2StreamReadTest.test_provoke_stream_error @ linux-x86_64 +test.test_tarfile.Bz2StreamReadTest.test_read_through @ linux-x86_64 +test.test_tarfile.Bz2StreamWriteTest.test_eof_marker @ linux-x86_64 +test.test_tarfile.Bz2StreamWriteTest.test_file_mode @ linux-x86_64 +test.test_tarfile.Bz2StreamWriteTest.test_fileobj_no_close @ linux-x86_64 +test.test_tarfile.Bz2StreamWriteTest.test_stream_padding @ linux-x86_64 +test.test_tarfile.Bz2UstarReadTest.test_add_dir_getmember @ linux-x86_64 +test.test_tarfile.Bz2UstarReadTest.test_fileobj_iter @ linux-x86_64 +test.test_tarfile.Bz2UstarReadTest.test_fileobj_link1 @ linux-x86_64 +test.test_tarfile.Bz2UstarReadTest.test_fileobj_link2 @ linux-x86_64 +test.test_tarfile.Bz2UstarReadTest.test_fileobj_readlines @ linux-x86_64 +test.test_tarfile.Bz2UstarReadTest.test_fileobj_regular_file @ linux-x86_64 +test.test_tarfile.Bz2UstarReadTest.test_fileobj_seek @ linux-x86_64 +test.test_tarfile.Bz2UstarReadTest.test_fileobj_symlink1 @ linux-x86_64 +test.test_tarfile.Bz2UstarReadTest.test_fileobj_symlink2 @ linux-x86_64 +test.test_tarfile.Bz2UstarReadTest.test_fileobj_text @ linux-x86_64 +test.test_tarfile.Bz2UstarReadTest.test_issue14160 @ linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_100_char_name @ linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_abs_pathnames @ linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_add_self @ linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_cwd @ linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_directory_size @ linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_eof_marker @ linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_extractall_symlinks @ linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_file_size @ linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_fileobj_no_close @ linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_filter @ linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_gettarinfo_pathlike_name @ linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_link_size @ linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_open_nonwritable_fileobj @ linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_ordered_recursion @ linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_pathnames @ linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_symlink_size @ linux-x86_64 +test.test_tarfile.Bz2WriteTest.test_tar_size @ linux-x86_64 +test.test_tarfile.CommandLineTest.test_bad_use @ linux-x86_64 +test.test_tarfile.CommandLineTest.test_create_command @ linux-x86_64 +test.test_tarfile.CommandLineTest.test_create_command_compressed @ linux-x86_64 +test.test_tarfile.CommandLineTest.test_create_command_dot_started_filename @ linux-x86_64 +test.test_tarfile.CommandLineTest.test_create_command_dotless_filename @ linux-x86_64 +test.test_tarfile.CommandLineTest.test_create_command_verbose @ linux-x86_64 +test.test_tarfile.CommandLineTest.test_extract_command @ linux-x86_64 +test.test_tarfile.CommandLineTest.test_extract_command_different_directory @ linux-x86_64 +test.test_tarfile.CommandLineTest.test_extract_command_filter @ linux-x86_64 +test.test_tarfile.CommandLineTest.test_extract_command_invalid_file @ linux-x86_64 +test.test_tarfile.CommandLineTest.test_extract_command_verbose @ linux-x86_64 +test.test_tarfile.CommandLineTest.test_list_command @ linux-x86_64 +test.test_tarfile.CommandLineTest.test_list_command_invalid_file @ linux-x86_64 +test.test_tarfile.CommandLineTest.test_list_command_verbose @ linux-x86_64 +test.test_tarfile.CommandLineTest.test_test_command @ linux-x86_64 +test.test_tarfile.CommandLineTest.test_test_command_invalid_file @ linux-x86_64 +test.test_tarfile.CommandLineTest.test_test_command_verbose @ linux-x86_64 +test.test_tarfile.ContextManagerTest.test_basic @ linux-x86_64 +test.test_tarfile.ContextManagerTest.test_closed @ linux-x86_64 +test.test_tarfile.ContextManagerTest.test_eof @ linux-x86_64 +test.test_tarfile.ContextManagerTest.test_exception @ linux-x86_64 +test.test_tarfile.ContextManagerTest.test_fileobj @ linux-x86_64 +test.test_tarfile.ContextManagerTest.test_no_eof @ linux-x86_64 +test.test_tarfile.CreateTest.test_create @ linux-x86_64 +test.test_tarfile.CreateTest.test_create_existing @ linux-x86_64 +test.test_tarfile.CreateTest.test_create_existing_taropen @ linux-x86_64 +test.test_tarfile.CreateTest.test_create_pathlike_name @ linux-x86_64 +test.test_tarfile.CreateTest.test_create_taropen @ linux-x86_64 +test.test_tarfile.CreateTest.test_create_taropen_pathlike_name @ linux-x86_64 +test.test_tarfile.CreateTest.test_eof_marker @ linux-x86_64 +test.test_tarfile.CreateTest.test_fileobj_no_close @ linux-x86_64 +test.test_tarfile.CreateWithXModeTest.test_create @ linux-x86_64 +test.test_tarfile.CreateWithXModeTest.test_create_existing @ linux-x86_64 +test.test_tarfile.CreateWithXModeTest.test_create_pathlike_name @ linux-x86_64 +test.test_tarfile.CreateWithXModeTest.test_create_taropen_pathlike_name @ linux-x86_64 +test.test_tarfile.CreateWithXModeTest.test_eof_marker @ linux-x86_64 +test.test_tarfile.CreateWithXModeTest.test_fileobj_no_close @ linux-x86_64 +test.test_tarfile.DetectReadTest.test_detect_file @ linux-x86_64 +test.test_tarfile.DetectReadTest.test_detect_fileobj @ linux-x86_64 +test.test_tarfile.DeviceHeaderTest.test_eof_marker @ linux-x86_64 +test.test_tarfile.DeviceHeaderTest.test_fileobj_no_close @ linux-x86_64 +test.test_tarfile.DeviceHeaderTest.test_headers_written_only_for_device_files @ linux-x86_64 +test.test_tarfile.GNUReadTest.test_header_offset @ linux-x86_64 +test.test_tarfile.GNUReadTest.test_longname_directory @ linux-x86_64 +test.test_tarfile.GNUReadTest.test_read_longlink @ linux-x86_64 +test.test_tarfile.GNUReadTest.test_read_longname @ linux-x86_64 +test.test_tarfile.GNUReadTest.test_truncated_longname @ linux-x86_64 +test.test_tarfile.GNUUnicodeTest.test_bad_pax_header @ linux-x86_64 +test.test_tarfile.GNUUnicodeTest.test_iso8859_1_filename @ linux-x86_64 +test.test_tarfile.GNUUnicodeTest.test_uname_unicode @ linux-x86_64 +test.test_tarfile.GNUUnicodeTest.test_unicode_argument @ linux-x86_64 +test.test_tarfile.GNUUnicodeTest.test_unicode_filename_error @ linux-x86_64 +test.test_tarfile.GNUUnicodeTest.test_utf7_filename @ linux-x86_64 +test.test_tarfile.GNUUnicodeTest.test_utf8_filename @ linux-x86_64 +test.test_tarfile.GNUWriteTest.test_longlink_1023 @ linux-x86_64 +test.test_tarfile.GNUWriteTest.test_longlink_1024 @ linux-x86_64 +test.test_tarfile.GNUWriteTest.test_longlink_1025 @ linux-x86_64 +test.test_tarfile.GNUWriteTest.test_longname_1023 @ linux-x86_64 +test.test_tarfile.GNUWriteTest.test_longname_1024 @ linux-x86_64 +test.test_tarfile.GNUWriteTest.test_longname_1025 @ linux-x86_64 +test.test_tarfile.GNUWriteTest.test_longnamelink_1023 @ linux-x86_64 +test.test_tarfile.GNUWriteTest.test_longnamelink_1024 @ linux-x86_64 +test.test_tarfile.GNUWriteTest.test_longnamelink_1025 @ linux-x86_64 +test.test_tarfile.GzipAppendTest.test_append_compressed @ linux-x86_64 +test.test_tarfile.GzipBrokenHeaderCorrectException.runTest @ linux-x86_64 +test.test_tarfile.GzipCreateTest.test_create @ linux-x86_64 +test.test_tarfile.GzipCreateTest.test_create_existing @ linux-x86_64 +test.test_tarfile.GzipCreateTest.test_create_existing_taropen @ linux-x86_64 +test.test_tarfile.GzipCreateTest.test_create_pathlike_name @ linux-x86_64 +test.test_tarfile.GzipCreateTest.test_create_taropen @ linux-x86_64 +test.test_tarfile.GzipCreateTest.test_create_taropen_pathlike_name @ linux-x86_64 +test.test_tarfile.GzipCreateTest.test_create_with_compresslevel @ linux-x86_64 +test.test_tarfile.GzipCreateTest.test_eof_marker @ linux-x86_64 +test.test_tarfile.GzipCreateTest.test_fileobj_no_close @ linux-x86_64 +test.test_tarfile.GzipDetectReadTest.test_detect_file @ linux-x86_64 +test.test_tarfile.GzipDetectReadTest.test_detect_fileobj @ linux-x86_64 +test.test_tarfile.GzipListTest.test_list @ linux-x86_64 +test.test_tarfile.GzipListTest.test_list_members @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_bytes_name_attribute @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_check_members @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_empty_name_attribute @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_empty_tarfile @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_extract_directory @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_extract_hardlink @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_extract_pathlike_name @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_extractall @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_extractall_pathlike_name @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_fail_comp @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_fileobj_with_offset @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_find_members @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_ignore_zeros @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_illegal_mode_arg @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_init_close_fobj @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_int_name_attribute @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_is_tarfile_erroneous @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_is_tarfile_keeps_position @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_is_tarfile_valid @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_length_zero_header @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_next_on_empty_tarfile @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_no_name_argument @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_no_name_attribute @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_non_existent_tarfile @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_null_tarfile @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_parallel_iteration @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_pathlike_name @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_premature_end_of_archive @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_v7_dirtype @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_xstar_type @ linux-x86_64 +test.test_tarfile.GzipMiscReadTest.test_zlib_error_does_not_leak @ linux-x86_64 +test.test_tarfile.GzipStreamReadTest.test_compare_members @ linux-x86_64 +test.test_tarfile.GzipStreamReadTest.test_empty_tarfile @ linux-x86_64 +test.test_tarfile.GzipStreamReadTest.test_fileobj_regular_file @ linux-x86_64 +test.test_tarfile.GzipStreamReadTest.test_ignore_zeros @ linux-x86_64 +test.test_tarfile.GzipStreamReadTest.test_is_tarfile_erroneous @ linux-x86_64 +test.test_tarfile.GzipStreamReadTest.test_is_tarfile_keeps_position @ linux-x86_64 +test.test_tarfile.GzipStreamReadTest.test_is_tarfile_valid @ linux-x86_64 +test.test_tarfile.GzipStreamReadTest.test_length_zero_header @ linux-x86_64 +test.test_tarfile.GzipStreamReadTest.test_non_existent_tarfile @ linux-x86_64 +test.test_tarfile.GzipStreamReadTest.test_null_tarfile @ linux-x86_64 +test.test_tarfile.GzipStreamReadTest.test_premature_end_of_archive @ linux-x86_64 +test.test_tarfile.GzipStreamReadTest.test_provoke_stream_error @ linux-x86_64 +test.test_tarfile.GzipStreamReadTest.test_read_through @ linux-x86_64 +test.test_tarfile.GzipStreamWriteTest.test_eof_marker @ linux-x86_64 +test.test_tarfile.GzipStreamWriteTest.test_file_mode @ linux-x86_64 +test.test_tarfile.GzipStreamWriteTest.test_fileobj_no_close @ linux-x86_64 +test.test_tarfile.GzipStreamWriteTest.test_source_directory_not_leaked @ linux-x86_64 +test.test_tarfile.GzipStreamWriteTest.test_stream_padding @ linux-x86_64 +test.test_tarfile.GzipUstarReadTest.test_add_dir_getmember @ linux-x86_64 +test.test_tarfile.GzipUstarReadTest.test_fileobj_iter @ linux-x86_64 +test.test_tarfile.GzipUstarReadTest.test_fileobj_link1 @ linux-x86_64 +test.test_tarfile.GzipUstarReadTest.test_fileobj_link2 @ linux-x86_64 +test.test_tarfile.GzipUstarReadTest.test_fileobj_readlines @ linux-x86_64 +test.test_tarfile.GzipUstarReadTest.test_fileobj_regular_file @ linux-x86_64 +test.test_tarfile.GzipUstarReadTest.test_fileobj_seek @ linux-x86_64 +test.test_tarfile.GzipUstarReadTest.test_fileobj_symlink1 @ linux-x86_64 +test.test_tarfile.GzipUstarReadTest.test_fileobj_symlink2 @ linux-x86_64 +test.test_tarfile.GzipUstarReadTest.test_fileobj_text @ linux-x86_64 +test.test_tarfile.GzipUstarReadTest.test_issue14160 @ linux-x86_64 +test.test_tarfile.GzipWriteTest.test_100_char_name @ linux-x86_64 +test.test_tarfile.GzipWriteTest.test_abs_pathnames @ linux-x86_64 +test.test_tarfile.GzipWriteTest.test_add_self @ linux-x86_64 +test.test_tarfile.GzipWriteTest.test_cwd @ linux-x86_64 +test.test_tarfile.GzipWriteTest.test_directory_size @ linux-x86_64 +test.test_tarfile.GzipWriteTest.test_eof_marker @ linux-x86_64 +test.test_tarfile.GzipWriteTest.test_extractall_symlinks @ linux-x86_64 +test.test_tarfile.GzipWriteTest.test_file_size @ linux-x86_64 +test.test_tarfile.GzipWriteTest.test_fileobj_no_close @ linux-x86_64 +test.test_tarfile.GzipWriteTest.test_filter @ linux-x86_64 +test.test_tarfile.GzipWriteTest.test_gettarinfo_pathlike_name @ linux-x86_64 +test.test_tarfile.GzipWriteTest.test_link_size @ linux-x86_64 +test.test_tarfile.GzipWriteTest.test_open_nonwritable_fileobj @ linux-x86_64 +test.test_tarfile.GzipWriteTest.test_ordered_recursion @ linux-x86_64 +test.test_tarfile.GzipWriteTest.test_pathnames @ linux-x86_64 +test.test_tarfile.GzipWriteTest.test_symlink_size @ linux-x86_64 +test.test_tarfile.GzipWriteTest.test_tar_size @ linux-x86_64 +test.test_tarfile.HardlinkTest.test_add_hardlink @ linux-x86_64 +test.test_tarfile.HardlinkTest.test_add_twice @ linux-x86_64 +test.test_tarfile.HardlinkTest.test_dereference_hardlink @ linux-x86_64 +test.test_tarfile.LimitsTest.test_gnu_limits @ linux-x86_64 +test.test_tarfile.LimitsTest.test_pax_limits @ linux-x86_64 +test.test_tarfile.LimitsTest.test_ustar_limits @ linux-x86_64 +test.test_tarfile.ListTest.test_list @ linux-x86_64 +test.test_tarfile.ListTest.test_list_members @ linux-x86_64 +test.test_tarfile.LzmaAppendTest.test_append_compressed @ linux-x86_64 +test.test_tarfile.LzmaCreateTest.test_create @ linux-x86_64 +test.test_tarfile.LzmaCreateTest.test_create_existing @ linux-x86_64 +test.test_tarfile.LzmaCreateTest.test_create_existing_taropen @ linux-x86_64 +test.test_tarfile.LzmaCreateTest.test_create_pathlike_name @ linux-x86_64 +test.test_tarfile.LzmaCreateTest.test_create_taropen @ linux-x86_64 +test.test_tarfile.LzmaCreateTest.test_create_taropen_pathlike_name @ linux-x86_64 +test.test_tarfile.LzmaCreateTest.test_create_with_preset @ linux-x86_64 +test.test_tarfile.LzmaCreateTest.test_eof_marker @ linux-x86_64 +test.test_tarfile.LzmaCreateTest.test_fileobj_no_close @ linux-x86_64 +test.test_tarfile.LzmaDetectReadTest.test_detect_file @ linux-x86_64 +test.test_tarfile.LzmaDetectReadTest.test_detect_fileobj @ linux-x86_64 +test.test_tarfile.LzmaListTest.test_list @ linux-x86_64 +test.test_tarfile.LzmaListTest.test_list_members @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_check_members @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_empty_name_attribute @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_empty_tarfile @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_extract_directory @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_extract_hardlink @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_extract_pathlike_name @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_extractall @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_extractall_pathlike_name @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_fail_comp @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_fileobj_with_offset @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_find_members @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_ignore_zeros @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_illegal_mode_arg @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_init_close_fobj @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_int_name_attribute @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_is_tarfile_erroneous @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_is_tarfile_keeps_position @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_is_tarfile_valid @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_length_zero_header @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_next_on_empty_tarfile @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_no_name_attribute @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_non_existent_tarfile @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_null_tarfile @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_parallel_iteration @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_pathlike_name @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_premature_end_of_archive @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_v7_dirtype @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_xstar_type @ linux-x86_64 +test.test_tarfile.LzmaMiscReadTest.test_zlib_error_does_not_leak @ linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_compare_members @ linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_empty_tarfile @ linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_fileobj_regular_file @ linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_ignore_zeros @ linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_is_tarfile_erroneous @ linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_is_tarfile_keeps_position @ linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_is_tarfile_valid @ linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_length_zero_header @ linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_non_existent_tarfile @ linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_null_tarfile @ linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_premature_end_of_archive @ linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_provoke_stream_error @ linux-x86_64 +test.test_tarfile.LzmaStreamReadTest.test_read_through @ linux-x86_64 +test.test_tarfile.LzmaStreamWriteTest.test_eof_marker @ linux-x86_64 +test.test_tarfile.LzmaStreamWriteTest.test_file_mode @ linux-x86_64 +test.test_tarfile.LzmaStreamWriteTest.test_fileobj_no_close @ linux-x86_64 +test.test_tarfile.LzmaStreamWriteTest.test_stream_padding @ linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_add_dir_getmember @ linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_fileobj_iter @ linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_fileobj_link1 @ linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_fileobj_link2 @ linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_fileobj_readlines @ linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_fileobj_regular_file @ linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_fileobj_seek @ linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_fileobj_symlink1 @ linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_fileobj_symlink2 @ linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_fileobj_text @ linux-x86_64 +test.test_tarfile.LzmaUstarReadTest.test_issue14160 @ linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_100_char_name @ linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_abs_pathnames @ linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_add_self @ linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_cwd @ linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_directory_size @ linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_eof_marker @ linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_extractall_symlinks @ linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_file_size @ linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_fileobj_no_close @ linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_filter @ linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_gettarinfo_pathlike_name @ linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_link_size @ linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_open_nonwritable_fileobj @ linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_ordered_recursion @ linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_pathnames @ linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_symlink_size @ linux-x86_64 +test.test_tarfile.LzmaWriteTest.test_tar_size @ linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_blktype @ linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_chrtype @ linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_conttype @ linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_dirtype @ linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_dirtype_with_size @ linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_fifotype @ linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_gnusparse @ linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_gnusparse_00 @ linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_gnusparse_01 @ linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_gnusparse_10 @ linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_lnktype @ linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_pax_umlauts @ linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_regtype @ linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_regtype_oldv7 @ linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_sparse @ linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_symtype @ linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_umlauts @ linux-x86_64 +test.test_tarfile.MemberReadTest.test_find_ustar_longname @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_bytes_name_attribute @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_check_members @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_empty_name_attribute @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_empty_tarfile @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_extract_directory @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_extract_hardlink @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_extract_pathlike_name @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_extractall @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_extractall_pathlike_name @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_fileobj_with_offset @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_find_members @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_ignore_zeros @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_illegal_mode_arg @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_init_close_fobj @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_int_name_attribute @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_is_tarfile_erroneous @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_is_tarfile_keeps_position @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_is_tarfile_valid @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_length_zero_header @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_next_on_empty_tarfile @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_no_name_argument @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_no_name_attribute @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_non_existent_tarfile @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_null_tarfile @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_parallel_iteration @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_pathlike_name @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_premature_end_of_archive @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_v7_dirtype @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_xstar_type @ linux-x86_64 +test.test_tarfile.MiscReadTest.test_zlib_error_does_not_leak @ linux-x86_64 +test.test_tarfile.MiscTest.test__all__ @ linux-x86_64 +test.test_tarfile.MiscTest.test_char_fields @ linux-x86_64 +test.test_tarfile.MiscTest.test_number_field_limits @ linux-x86_64 +test.test_tarfile.MiscTest.test_read_number_fields @ linux-x86_64 +test.test_tarfile.MiscTest.test_useful_error_message_when_modules_missing @ linux-x86_64 +test.test_tarfile.MiscTest.test_write_number_fields @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_gid @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_gname @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_mode @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_mtime @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_ownership @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_uid @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Data.test_extractall_none_uname @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_gid @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_gname @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_mode @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_mtime @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_ownership @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_uid @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Default.test_extractall_none_uname @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_gid @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_gname @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_mode @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_mtime @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_ownership @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_uid @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_FullyTrusted.test_extractall_none_uname @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_gid @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_gname @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_mode @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_mtime @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_ownership @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_uid @ linux-x86_64 +test.test_tarfile.NoneInfoExtractTests_Tar.test_extractall_none_uname @ linux-x86_64 +test.test_tarfile.NoneInfoTests_Misc.test_add @ linux-x86_64 +test.test_tarfile.NoneInfoTests_Misc.test_list @ linux-x86_64 +test.test_tarfile.NumericOwnerTest.test_extract_with_numeric_owner @ linux-x86_64 +test.test_tarfile.NumericOwnerTest.test_extractall_with_numeric_owner @ linux-x86_64 +test.test_tarfile.NumericOwnerTest.test_keyword_only @ linux-x86_64 +test.test_tarfile.PAXUnicodeTest.test_binary_header @ linux-x86_64 +test.test_tarfile.PAXUnicodeTest.test_iso8859_1_filename @ linux-x86_64 +test.test_tarfile.PAXUnicodeTest.test_uname_unicode @ linux-x86_64 +test.test_tarfile.PAXUnicodeTest.test_unicode_argument @ linux-x86_64 +test.test_tarfile.PAXUnicodeTest.test_utf7_filename @ linux-x86_64 +test.test_tarfile.PAXUnicodeTest.test_utf8_filename @ linux-x86_64 +test.test_tarfile.PaxReadTest.test_header_offset @ linux-x86_64 +test.test_tarfile.PaxReadTest.test_longname_directory @ linux-x86_64 +test.test_tarfile.PaxReadTest.test_pax_global_headers @ linux-x86_64 +test.test_tarfile.PaxReadTest.test_pax_number_fields @ linux-x86_64 +test.test_tarfile.PaxReadTest.test_read_longlink @ linux-x86_64 +test.test_tarfile.PaxReadTest.test_read_longname @ linux-x86_64 +test.test_tarfile.PaxReadTest.test_truncated_longname @ linux-x86_64 +test.test_tarfile.PaxWriteTest.test_create_pax_header @ linux-x86_64 +test.test_tarfile.PaxWriteTest.test_longlink_1023 @ linux-x86_64 +test.test_tarfile.PaxWriteTest.test_longlink_1024 @ linux-x86_64 +test.test_tarfile.PaxWriteTest.test_longlink_1025 @ linux-x86_64 +test.test_tarfile.PaxWriteTest.test_longname_1023 @ linux-x86_64 +test.test_tarfile.PaxWriteTest.test_longname_1024 @ linux-x86_64 +test.test_tarfile.PaxWriteTest.test_longname_1025 @ linux-x86_64 +test.test_tarfile.PaxWriteTest.test_longnamelink_1023 @ linux-x86_64 +test.test_tarfile.PaxWriteTest.test_longnamelink_1024 @ linux-x86_64 +test.test_tarfile.PaxWriteTest.test_longnamelink_1025 @ linux-x86_64 +test.test_tarfile.PaxWriteTest.test_pax_extended_header @ linux-x86_64 +test.test_tarfile.PaxWriteTest.test_pax_global_header @ linux-x86_64 +test.test_tarfile.ReplaceTests.test_replace_all @ linux-x86_64 +test.test_tarfile.ReplaceTests.test_replace_deep @ linux-x86_64 +test.test_tarfile.ReplaceTests.test_replace_internal @ linux-x86_64 +test.test_tarfile.ReplaceTests.test_replace_name @ linux-x86_64 +test.test_tarfile.ReplaceTests.test_replace_shallow @ linux-x86_64 +test.test_tarfile.StreamReadTest.test_compare_members @ linux-x86_64 +test.test_tarfile.StreamReadTest.test_empty_tarfile @ linux-x86_64 +test.test_tarfile.StreamReadTest.test_fileobj_regular_file @ linux-x86_64 +test.test_tarfile.StreamReadTest.test_ignore_zeros @ linux-x86_64 +test.test_tarfile.StreamReadTest.test_is_tarfile_erroneous @ linux-x86_64 +test.test_tarfile.StreamReadTest.test_is_tarfile_keeps_position @ linux-x86_64 +test.test_tarfile.StreamReadTest.test_is_tarfile_valid @ linux-x86_64 +test.test_tarfile.StreamReadTest.test_length_zero_header @ linux-x86_64 +test.test_tarfile.StreamReadTest.test_non_existent_tarfile @ linux-x86_64 +test.test_tarfile.StreamReadTest.test_null_tarfile @ linux-x86_64 +test.test_tarfile.StreamReadTest.test_premature_end_of_archive @ linux-x86_64 +test.test_tarfile.StreamReadTest.test_provoke_stream_error @ linux-x86_64 +test.test_tarfile.StreamReadTest.test_read_through @ linux-x86_64 +test.test_tarfile.StreamWriteTest.test_eof_marker @ linux-x86_64 +test.test_tarfile.StreamWriteTest.test_file_mode @ linux-x86_64 +test.test_tarfile.StreamWriteTest.test_fileobj_no_close @ linux-x86_64 +test.test_tarfile.StreamWriteTest.test_stream_padding @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_absolute @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_absolute_hardlink @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_absolute_symlink @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_bad_filter_name @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_benign_file @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_chains @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_change_default_filter_on_class @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_change_default_filter_on_instance @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_change_default_filter_on_subclass @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_change_default_filter_to_string @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_custom_filter @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_data_filter @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_deep_symlink @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_default_filter_warns_not @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_errorlevel @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_fully_trusted_filter @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_parent_symlink @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_parent_symlink2 @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_pipe @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_sly_relative0 @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_sly_relative2 @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_special_files @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_stateful_filter @ linux-x86_64 +test.test_tarfile.TestExtractionFilters.test_tar_filter @ linux-x86_64 +test.test_tarfile.UstarReadTest.test_add_dir_getmember @ linux-x86_64 +test.test_tarfile.UstarReadTest.test_fileobj_iter @ linux-x86_64 +test.test_tarfile.UstarReadTest.test_fileobj_link1 @ linux-x86_64 +test.test_tarfile.UstarReadTest.test_fileobj_link2 @ linux-x86_64 +test.test_tarfile.UstarReadTest.test_fileobj_readlines @ linux-x86_64 +test.test_tarfile.UstarReadTest.test_fileobj_regular_file @ linux-x86_64 +test.test_tarfile.UstarReadTest.test_fileobj_seek @ linux-x86_64 +test.test_tarfile.UstarReadTest.test_fileobj_symlink1 @ linux-x86_64 +test.test_tarfile.UstarReadTest.test_fileobj_symlink2 @ linux-x86_64 +test.test_tarfile.UstarReadTest.test_fileobj_text @ linux-x86_64 +test.test_tarfile.UstarReadTest.test_issue14160 @ linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_iso8859_1_filename @ linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_uname_unicode @ linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_argument @ linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_filename_error @ linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_link1 @ linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_link2 @ linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_longname1 @ linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_longname2 @ linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_longname3 @ linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_longname4 @ linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_name1 @ linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_unicode_name2 @ linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_utf7_filename @ linux-x86_64 +test.test_tarfile.UstarUnicodeTest.test_utf8_filename @ linux-x86_64 +test.test_tarfile.WriteTest.test_100_char_name @ linux-x86_64 +test.test_tarfile.WriteTest.test_abs_pathnames @ linux-x86_64 +test.test_tarfile.WriteTest.test_add_self @ linux-x86_64 +test.test_tarfile.WriteTest.test_cwd @ linux-x86_64 +test.test_tarfile.WriteTest.test_directory_size @ linux-x86_64 +test.test_tarfile.WriteTest.test_eof_marker @ linux-x86_64 +test.test_tarfile.WriteTest.test_extractall_symlinks @ linux-x86_64 +test.test_tarfile.WriteTest.test_file_size @ linux-x86_64 +test.test_tarfile.WriteTest.test_fileobj_no_close @ linux-x86_64 +test.test_tarfile.WriteTest.test_filter @ linux-x86_64 +test.test_tarfile.WriteTest.test_gettarinfo_pathlike_name @ linux-x86_64 +test.test_tarfile.WriteTest.test_link_size @ linux-x86_64 +test.test_tarfile.WriteTest.test_open_nonwritable_fileobj @ linux-x86_64 +test.test_tarfile.WriteTest.test_ordered_recursion @ linux-x86_64 +test.test_tarfile.WriteTest.test_pathnames @ linux-x86_64 +test.test_tarfile.WriteTest.test_symlink_size @ linux-x86_64 +test.test_tarfile.WriteTest.test_tar_size @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_telnetlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_telnetlib.txt new file mode 100644 index 0000000000..64870de1a7 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_telnetlib.txt @@ -0,0 +1,19 @@ +test.test_telnetlib.ExpectTests.test_expect @ linux-x86_64 +test.test_telnetlib.GeneralTests.testBasic @ linux-x86_64 +test.test_telnetlib.GeneralTests.testContextManager @ linux-x86_64 +test.test_telnetlib.GeneralTests.testGetters @ linux-x86_64 +test.test_telnetlib.GeneralTests.testTimeoutDefault @ linux-x86_64 +test.test_telnetlib.GeneralTests.testTimeoutNone @ linux-x86_64 +test.test_telnetlib.GeneralTests.testTimeoutOpen @ linux-x86_64 +test.test_telnetlib.GeneralTests.testTimeoutValue @ linux-x86_64 +test.test_telnetlib.OptionTests.test_IAC_commands @ linux-x86_64 +test.test_telnetlib.OptionTests.test_SB_commands @ linux-x86_64 +test.test_telnetlib.OptionTests.test_debug_accepts_str_port @ linux-x86_64 +test.test_telnetlib.OptionTests.test_debuglevel_reads @ linux-x86_64 +test.test_telnetlib.OptionTests.test_debuglevel_write @ linux-x86_64 +test.test_telnetlib.ReadTests.test_read_all @ linux-x86_64 +test.test_telnetlib.ReadTests.test_read_eager @ linux-x86_64 +test.test_telnetlib.ReadTests.test_read_lazy @ linux-x86_64 +test.test_telnetlib.ReadTests.test_read_some @ linux-x86_64 +test.test_telnetlib.ReadTests.test_read_until @ linux-x86_64 +test.test_telnetlib.WriteTests.test_write @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tempfile.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tempfile.txt new file mode 100644 index 0000000000..76c664093e --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tempfile.txt @@ -0,0 +1,94 @@ +test.test_tempfile.TestCandidateTempdirList.test_nonempty_list @ linux-x86_64 +test.test_tempfile.TestCandidateTempdirList.test_wanted_dirs @ linux-x86_64 +test.test_tempfile.TestExports.test_exports @ linux-x86_64 +test.test_tempfile.TestGetCandidateNames.test_retval @ linux-x86_64 +test.test_tempfile.TestGetCandidateNames.test_same_thing @ linux-x86_64 +test.test_tempfile.TestGetDefaultTempdir.test_no_files_left_behind @ linux-x86_64 +test.test_tempfile.TestGetTempDir.test_case_sensitive @ linux-x86_64 +test.test_tempfile.TestGetTempDir.test_directory_exists @ linux-x86_64 +test.test_tempfile.TestGetTempDir.test_directory_writable @ linux-x86_64 +test.test_tempfile.TestGetTempDir.test_same_thing @ linux-x86_64 +test.test_tempfile.TestGetTempPrefix.test_sane_template @ linux-x86_64 +test.test_tempfile.TestGetTempPrefix.test_usable_template @ linux-x86_64 +test.test_tempfile.TestLowLevelInternals.test_infer_return_type_multiples @ linux-x86_64 +test.test_tempfile.TestLowLevelInternals.test_infer_return_type_multiples_and_none @ linux-x86_64 +test.test_tempfile.TestLowLevelInternals.test_infer_return_type_pathlib @ linux-x86_64 +test.test_tempfile.TestLowLevelInternals.test_infer_return_type_pathlike @ linux-x86_64 +test.test_tempfile.TestLowLevelInternals.test_infer_return_type_singles @ linux-x86_64 +test.test_tempfile.TestMkdtemp.test_basic @ linux-x86_64 +test.test_tempfile.TestMkdtemp.test_basic_many @ linux-x86_64 +test.test_tempfile.TestMkdtemp.test_basic_with_bytes_names @ linux-x86_64 +test.test_tempfile.TestMkdtemp.test_choose_directory @ linux-x86_64 +test.test_tempfile.TestMkdtemp.test_collision_with_existing_directory @ linux-x86_64 +test.test_tempfile.TestMkdtemp.test_collision_with_existing_file @ linux-x86_64 +test.test_tempfile.TestMkdtemp.test_for_tempdir_is_bytes_issue40701_api_warts @ linux-x86_64 +test.test_tempfile.TestMkdtemp.test_mode @ linux-x86_64 +test.test_tempfile.TestMkdtemp.test_non_directory @ linux-x86_64 +test.test_tempfile.TestMkdtemp.test_nonexisting_directory @ linux-x86_64 +test.test_tempfile.TestMkdtemp.test_read_only_directory @ linux-x86_64 +test.test_tempfile.TestMkstemp.test_basic @ linux-x86_64 +test.test_tempfile.TestMkstemp.test_basic_with_bytes_names @ linux-x86_64 +test.test_tempfile.TestMkstemp.test_choose_directory @ linux-x86_64 +test.test_tempfile.TestMkstemp.test_for_tempdir_is_bytes_issue40701_api_warts @ linux-x86_64 +test.test_tempfile.TestMkstempInner.test_basic @ linux-x86_64 +test.test_tempfile.TestMkstempInner.test_basic_many @ linux-x86_64 +test.test_tempfile.TestMkstempInner.test_basic_with_bytes_names @ linux-x86_64 +test.test_tempfile.TestMkstempInner.test_collision_with_existing_directory @ linux-x86_64 +test.test_tempfile.TestMkstempInner.test_collision_with_existing_file @ linux-x86_64 +test.test_tempfile.TestMkstempInner.test_file_mode @ linux-x86_64 +test.test_tempfile.TestMkstempInner.test_non_directory @ linux-x86_64 +test.test_tempfile.TestMkstempInner.test_nonexisting_directory @ linux-x86_64 +test.test_tempfile.TestMkstempInner.test_read_only_directory @ linux-x86_64 +test.test_tempfile.TestNamedTemporaryFile.test_bad_encoding @ linux-x86_64 +test.test_tempfile.TestNamedTemporaryFile.test_bad_mode @ linux-x86_64 +test.test_tempfile.TestNamedTemporaryFile.test_basic @ linux-x86_64 +test.test_tempfile.TestNamedTemporaryFile.test_context_manager @ linux-x86_64 +test.test_tempfile.TestNamedTemporaryFile.test_creates_named @ linux-x86_64 +test.test_tempfile.TestNamedTemporaryFile.test_del_on_close @ linux-x86_64 +test.test_tempfile.TestNamedTemporaryFile.test_dis_del_on_close @ linux-x86_64 +test.test_tempfile.TestNamedTemporaryFile.test_iter @ linux-x86_64 +test.test_tempfile.TestNamedTemporaryFile.test_method_lookup @ linux-x86_64 +test.test_tempfile.TestNamedTemporaryFile.test_multiple_close @ linux-x86_64 +test.test_tempfile.TestNamedTemporaryFile.test_unexpected_error @ linux-x86_64 +test.test_tempfile.TestRandomNameSequence.test_get_eight_char_str @ linux-x86_64 +test.test_tempfile.TestRandomNameSequence.test_many @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_basic @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_bound_methods @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_class_getitem @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_context_manager_after_rollover @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_context_manager_before_rollover @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_context_manager_during_rollover @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_del_on_close @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_del_rolled_file @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_del_unrolled_file @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_fileno @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_iobase_interface @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_is_iobase @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_multiple_close_after_rollover @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_multiple_close_before_rollover @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_properties @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_rewrite_small @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_sparse @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_text_mode @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_text_newline_and_encoding @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_truncate_with_size_parameter @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_write_sequential @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_writelines @ linux-x86_64 +test.test_tempfile.TestSpooledTemporaryFile.test_writelines_sequential @ linux-x86_64 +test.test_tempfile.TestTemporaryDirectory.test_cleanup_with_symlink_to_a_directory @ linux-x86_64 +test.test_tempfile.TestTemporaryDirectory.test_context_manager @ linux-x86_64 +test.test_tempfile.TestTemporaryDirectory.test_del_on_shutdown @ linux-x86_64 +test.test_tempfile.TestTemporaryDirectory.test_del_on_shutdown_ignore_errors @ linux-x86_64 +test.test_tempfile.TestTemporaryDirectory.test_exit_on_shutdown @ linux-x86_64 +test.test_tempfile.TestTemporaryDirectory.test_explicit_cleanup @ linux-x86_64 +test.test_tempfile.TestTemporaryDirectory.test_explict_cleanup_ignore_errors @ linux-x86_64 +test.test_tempfile.TestTemporaryDirectory.test_mkdtemp_failure @ linux-x86_64 +test.test_tempfile.TestTemporaryDirectory.test_modes @ linux-x86_64 +test.test_tempfile.TestTemporaryDirectory.test_multiple_close @ linux-x86_64 +test.test_tempfile.TestTemporaryFile.test_bad_encoding @ linux-x86_64 +test.test_tempfile.TestTemporaryFile.test_bad_mode @ linux-x86_64 +test.test_tempfile.TestTemporaryFile.test_basic @ linux-x86_64 +test.test_tempfile.TestTemporaryFile.test_has_no_name @ linux-x86_64 +test.test_tempfile.TestTemporaryFile.test_mode_and_encoding @ linux-x86_64 +test.test_tempfile.TestTemporaryFile.test_multiple_close @ linux-x86_64 +test.test_tempfile.TestTemporaryFile.test_unexpected_error @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_termios.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_termios.txt new file mode 100644 index 0000000000..7735e458a0 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_termios.txt @@ -0,0 +1,18 @@ +test.test_termios.TestFunctions.test_tcdrain @ linux-x86_64 +test.test_termios.TestFunctions.test_tcdrain_errors @ linux-x86_64 +test.test_termios.TestFunctions.test_tcflow @ linux-x86_64 +test.test_termios.TestFunctions.test_tcflow_errors @ linux-x86_64 +test.test_termios.TestFunctions.test_tcflush @ linux-x86_64 +test.test_termios.TestFunctions.test_tcflush_errors @ linux-x86_64 +test.test_termios.TestFunctions.test_tcgetattr @ linux-x86_64 +test.test_termios.TestFunctions.test_tcgetattr_errors @ linux-x86_64 +test.test_termios.TestFunctions.test_tcgetwinsize @ linux-x86_64 +test.test_termios.TestFunctions.test_tcgetwinsize_errors @ linux-x86_64 +test.test_termios.TestFunctions.test_tcsendbreak @ linux-x86_64 +test.test_termios.TestFunctions.test_tcsendbreak_errors @ linux-x86_64 +test.test_termios.TestFunctions.test_tcsetattr @ linux-x86_64 +test.test_termios.TestFunctions.test_tcsetattr_errors @ linux-x86_64 +test.test_termios.TestFunctions.test_tcsetwinsize @ linux-x86_64 +test.test_termios.TestFunctions.test_tcsetwinsize_errors @ linux-x86_64 +test.test_termios.TestModule.test_constants @ linux-x86_64 +test.test_termios.TestModule.test_exception @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_textwrap.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_textwrap.txt new file mode 100644 index 0000000000..32ee862849 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_textwrap.txt @@ -0,0 +1,66 @@ +test.test_textwrap.DedentTestCase.test_dedent_declining @ linux-x86_64 +test.test_textwrap.DedentTestCase.test_dedent_even @ linux-x86_64 +test.test_textwrap.DedentTestCase.test_dedent_nomargin @ linux-x86_64 +test.test_textwrap.DedentTestCase.test_dedent_preserve_internal_tabs @ linux-x86_64 +test.test_textwrap.DedentTestCase.test_dedent_preserve_margin_tabs @ linux-x86_64 +test.test_textwrap.DedentTestCase.test_dedent_uneven @ linux-x86_64 +test.test_textwrap.IndentTestCase.test_indent_all_lines @ linux-x86_64 +test.test_textwrap.IndentTestCase.test_indent_default @ linux-x86_64 +test.test_textwrap.IndentTestCase.test_indent_empty_lines @ linux-x86_64 +test.test_textwrap.IndentTestCase.test_indent_explicit_default @ linux-x86_64 +test.test_textwrap.IndentTestCase.test_indent_no_lines @ linux-x86_64 +test.test_textwrap.IndentTestCase.test_indent_nomargin_all_lines @ linux-x86_64 +test.test_textwrap.IndentTestCase.test_indent_nomargin_default @ linux-x86_64 +test.test_textwrap.IndentTestCase.test_indent_nomargin_explicit_default @ linux-x86_64 +test.test_textwrap.IndentTestCase.test_roundtrip_mixed @ linux-x86_64 +test.test_textwrap.IndentTestCase.test_roundtrip_spaces @ linux-x86_64 +test.test_textwrap.IndentTestCase.test_roundtrip_tabs @ linux-x86_64 +test.test_textwrap.IndentTestCases.test_fill @ linux-x86_64 +test.test_textwrap.IndentTestCases.test_initial_indent @ linux-x86_64 +test.test_textwrap.IndentTestCases.test_subsequent_indent @ linux-x86_64 +test.test_textwrap.LongWordTestCase.test_break_long @ linux-x86_64 +test.test_textwrap.LongWordTestCase.test_max_lines_long @ linux-x86_64 +test.test_textwrap.LongWordTestCase.test_nobreak_long @ linux-x86_64 +test.test_textwrap.LongWordWithHyphensTestCase.test_break_long_words_not_on_hyphen @ linux-x86_64 +test.test_textwrap.LongWordWithHyphensTestCase.test_break_long_words_on_hyphen @ linux-x86_64 +test.test_textwrap.LongWordWithHyphensTestCase.test_break_on_hyphen_but_not_long_words @ linux-x86_64 +test.test_textwrap.LongWordWithHyphensTestCase.test_do_not_break_long_words_or_on_hyphens @ linux-x86_64 +test.test_textwrap.MaxLinesTestCase.test_placeholder @ linux-x86_64 +test.test_textwrap.MaxLinesTestCase.test_placeholder_backtrack @ linux-x86_64 +test.test_textwrap.MaxLinesTestCase.test_simple @ linux-x86_64 +test.test_textwrap.MaxLinesTestCase.test_spaces @ linux-x86_64 +test.test_textwrap.ShortenTestCase.test_empty_string @ linux-x86_64 +test.test_textwrap.ShortenTestCase.test_first_word_too_long_but_placeholder_fits @ linux-x86_64 +test.test_textwrap.ShortenTestCase.test_placeholder @ linux-x86_64 +test.test_textwrap.ShortenTestCase.test_simple @ linux-x86_64 +test.test_textwrap.ShortenTestCase.test_whitespace @ linux-x86_64 +test.test_textwrap.ShortenTestCase.test_width_too_small_for_placeholder @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_bad_width @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_break_on_hyphens @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_drop_whitespace_false @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_drop_whitespace_false_whitespace_only @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_drop_whitespace_false_whitespace_only_with_indent @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_drop_whitespace_leading_whitespace @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_drop_whitespace_whitespace_indent @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_drop_whitespace_whitespace_line @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_drop_whitespace_whitespace_only @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_drop_whitespace_whitespace_only_with_indent @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_em_dash @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_empty_string @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_empty_string_with_initial_indent @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_fix_sentence_endings @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_funky_hyphens @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_funky_parens @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_hyphenated @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_hyphenated_numbers @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_narrow_non_breaking_space @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_no_split_at_umlaut @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_non_breaking_space @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_punct_hyphens @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_simple @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_split @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_umlaut_followed_by_dash @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_unix_options @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_whitespace @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_wrap_short @ linux-x86_64 +test.test_textwrap.WrapTestCase.test_wrap_short_1line @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_thread.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_thread.txt new file mode 100644 index 0000000000..b74b8246e5 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_thread.txt @@ -0,0 +1,20 @@ +test.test_thread.BarrierTest.test_barrier @ linux-x86_64 +test.test_thread.LockTests.test_acquire_contended @ linux-x86_64 +test.test_thread.LockTests.test_acquire_destroy @ linux-x86_64 +test.test_thread.LockTests.test_acquire_release @ linux-x86_64 +test.test_thread.LockTests.test_constructor @ linux-x86_64 +test.test_thread.LockTests.test_different_thread @ linux-x86_64 +test.test_thread.LockTests.test_locked_repr @ linux-x86_64 +test.test_thread.LockTests.test_reacquire @ linux-x86_64 +test.test_thread.LockTests.test_repr @ linux-x86_64 +test.test_thread.LockTests.test_state_after_timeout @ linux-x86_64 +test.test_thread.LockTests.test_thread_leak @ linux-x86_64 +test.test_thread.LockTests.test_timeout @ linux-x86_64 +test.test_thread.LockTests.test_try_acquire @ linux-x86_64 +test.test_thread.LockTests.test_try_acquire_contended @ linux-x86_64 +test.test_thread.LockTests.test_weakref_exists @ linux-x86_64 +test.test_thread.LockTests.test_with @ linux-x86_64 +test.test_thread.ThreadRunningTests.test__count @ linux-x86_64 +test.test_thread.ThreadRunningTests.test_nt_and_posix_stack_size @ linux-x86_64 +test.test_thread.ThreadRunningTests.test_stack_size @ linux-x86_64 +test.test_thread.ThreadRunningTests.test_starting_threads @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_threadedtempfile.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_threadedtempfile.txt new file mode 100644 index 0000000000..5b419df28f --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_threadedtempfile.txt @@ -0,0 +1 @@ +test.test_threadedtempfile.ThreadedTempFileTest.test_main @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_threading.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_threading.txt new file mode 100644 index 0000000000..d5be4bb77f --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_threading.txt @@ -0,0 +1,158 @@ +test.test_threading.AtexitTests.test_atexit_called_once @ linux-x86_64 +test.test_threading.AtexitTests.test_atexit_output @ linux-x86_64 +test.test_threading.BarrierTests.test_abort @ linux-x86_64 +test.test_threading.BarrierTests.test_abort_and_reset @ linux-x86_64 +test.test_threading.BarrierTests.test_action @ linux-x86_64 +test.test_threading.BarrierTests.test_barrier @ linux-x86_64 +test.test_threading.BarrierTests.test_barrier_10 @ linux-x86_64 +test.test_threading.BarrierTests.test_default_timeout @ linux-x86_64 +test.test_threading.BarrierTests.test_repr @ linux-x86_64 +test.test_threading.BarrierTests.test_reset @ linux-x86_64 +test.test_threading.BarrierTests.test_single_thread @ linux-x86_64 +test.test_threading.BarrierTests.test_timeout @ linux-x86_64 +test.test_threading.BarrierTests.test_wait_return @ linux-x86_64 +test.test_threading.BoundedSemaphoreTests.test_acquire @ linux-x86_64 +test.test_threading.BoundedSemaphoreTests.test_acquire_contended @ linux-x86_64 +test.test_threading.BoundedSemaphoreTests.test_acquire_destroy @ linux-x86_64 +test.test_threading.BoundedSemaphoreTests.test_acquire_timeout @ linux-x86_64 +test.test_threading.BoundedSemaphoreTests.test_constructor @ linux-x86_64 +test.test_threading.BoundedSemaphoreTests.test_default_value @ linux-x86_64 +test.test_threading.BoundedSemaphoreTests.test_multirelease @ linux-x86_64 +test.test_threading.BoundedSemaphoreTests.test_release_unacquired @ linux-x86_64 +test.test_threading.BoundedSemaphoreTests.test_repr @ linux-x86_64 +test.test_threading.BoundedSemaphoreTests.test_try_acquire @ linux-x86_64 +test.test_threading.BoundedSemaphoreTests.test_try_acquire_contended @ linux-x86_64 +test.test_threading.BoundedSemaphoreTests.test_with @ linux-x86_64 +test.test_threading.CRLockTests.test__is_owned @ linux-x86_64 +test.test_threading.CRLockTests.test_acquire_contended @ linux-x86_64 +test.test_threading.CRLockTests.test_acquire_destroy @ linux-x86_64 +test.test_threading.CRLockTests.test_acquire_release @ linux-x86_64 +test.test_threading.CRLockTests.test_constructor @ linux-x86_64 +test.test_threading.CRLockTests.test_different_thread @ linux-x86_64 +test.test_threading.CRLockTests.test_locked_repr @ linux-x86_64 +test.test_threading.CRLockTests.test_reacquire @ linux-x86_64 +test.test_threading.CRLockTests.test_recursion_count @ linux-x86_64 +test.test_threading.CRLockTests.test_release_save_unacquired @ linux-x86_64 +test.test_threading.CRLockTests.test_release_unacquired @ linux-x86_64 +test.test_threading.CRLockTests.test_repr @ linux-x86_64 +test.test_threading.CRLockTests.test_thread_leak @ linux-x86_64 +test.test_threading.CRLockTests.test_timeout @ linux-x86_64 +test.test_threading.CRLockTests.test_try_acquire @ linux-x86_64 +test.test_threading.CRLockTests.test_try_acquire_contended @ linux-x86_64 +test.test_threading.CRLockTests.test_weakref_exists @ linux-x86_64 +test.test_threading.CRLockTests.test_with @ linux-x86_64 +test.test_threading.ConditionAsRLockTests.test__is_owned @ linux-x86_64 +test.test_threading.ConditionAsRLockTests.test_acquire_contended @ linux-x86_64 +test.test_threading.ConditionAsRLockTests.test_acquire_destroy @ linux-x86_64 +test.test_threading.ConditionAsRLockTests.test_acquire_release @ linux-x86_64 +test.test_threading.ConditionAsRLockTests.test_constructor @ linux-x86_64 +test.test_threading.ConditionAsRLockTests.test_different_thread @ linux-x86_64 +test.test_threading.ConditionAsRLockTests.test_locked_repr @ linux-x86_64 +test.test_threading.ConditionAsRLockTests.test_reacquire @ linux-x86_64 +test.test_threading.ConditionAsRLockTests.test_release_save_unacquired @ linux-x86_64 +test.test_threading.ConditionAsRLockTests.test_release_unacquired @ linux-x86_64 +test.test_threading.ConditionAsRLockTests.test_repr @ linux-x86_64 +test.test_threading.ConditionAsRLockTests.test_thread_leak @ linux-x86_64 +test.test_threading.ConditionAsRLockTests.test_timeout @ linux-x86_64 +test.test_threading.ConditionAsRLockTests.test_try_acquire @ linux-x86_64 +test.test_threading.ConditionAsRLockTests.test_try_acquire_contended @ linux-x86_64 +test.test_threading.ConditionAsRLockTests.test_weakref_exists @ linux-x86_64 +test.test_threading.ConditionAsRLockTests.test_with @ linux-x86_64 +test.test_threading.ConditionTests.test_acquire @ linux-x86_64 +test.test_threading.ConditionTests.test_notify @ linux-x86_64 +test.test_threading.ConditionTests.test_timeout @ linux-x86_64 +test.test_threading.ConditionTests.test_unacquired_notify @ linux-x86_64 +test.test_threading.ConditionTests.test_unacquired_wait @ linux-x86_64 +test.test_threading.ConditionTests.test_waitfor @ linux-x86_64 +test.test_threading.ConditionTests.test_waitfor_timeout @ linux-x86_64 +test.test_threading.EventTests.test_is_set @ linux-x86_64 +test.test_threading.EventTests.test_notify @ linux-x86_64 +test.test_threading.EventTests.test_repr @ linux-x86_64 +test.test_threading.EventTests.test_set_and_clear @ linux-x86_64 +test.test_threading.EventTests.test_timeout @ linux-x86_64 +test.test_threading.ExceptHookTests.test_custom_excepthook @ linux-x86_64 +test.test_threading.ExceptHookTests.test_custom_excepthook_fail @ linux-x86_64 +test.test_threading.ExceptHookTests.test_excepthook @ linux-x86_64 +test.test_threading.ExceptHookTests.test_original_excepthook @ linux-x86_64 +test.test_threading.ExceptHookTests.test_system_exit @ linux-x86_64 +test.test_threading.InterruptMainTests.test_interrupt_main_noerror @ linux-x86_64 +test.test_threading.LockTests.test_acquire_contended @ linux-x86_64 +test.test_threading.LockTests.test_acquire_destroy @ linux-x86_64 +test.test_threading.LockTests.test_acquire_release @ linux-x86_64 +test.test_threading.LockTests.test_constructor @ linux-x86_64 +test.test_threading.LockTests.test_different_thread @ linux-x86_64 +test.test_threading.LockTests.test_locked_repr @ linux-x86_64 +test.test_threading.LockTests.test_reacquire @ linux-x86_64 +test.test_threading.LockTests.test_repr @ linux-x86_64 +test.test_threading.LockTests.test_state_after_timeout @ linux-x86_64 +test.test_threading.LockTests.test_thread_leak @ linux-x86_64 +test.test_threading.LockTests.test_timeout @ linux-x86_64 +test.test_threading.LockTests.test_try_acquire @ linux-x86_64 +test.test_threading.LockTests.test_try_acquire_contended @ linux-x86_64 +test.test_threading.LockTests.test_weakref_exists @ linux-x86_64 +test.test_threading.LockTests.test_with @ linux-x86_64 +test.test_threading.MiscTestCase.test__all__ @ linux-x86_64 +test.test_threading.PyRLockTests.test__is_owned @ linux-x86_64 +test.test_threading.PyRLockTests.test_acquire_contended @ linux-x86_64 +test.test_threading.PyRLockTests.test_acquire_destroy @ linux-x86_64 +test.test_threading.PyRLockTests.test_acquire_release @ linux-x86_64 +test.test_threading.PyRLockTests.test_constructor @ linux-x86_64 +test.test_threading.PyRLockTests.test_different_thread @ linux-x86_64 +test.test_threading.PyRLockTests.test_locked_repr @ linux-x86_64 +test.test_threading.PyRLockTests.test_reacquire @ linux-x86_64 +test.test_threading.PyRLockTests.test_recursion_count @ linux-x86_64 +test.test_threading.PyRLockTests.test_release_save_unacquired @ linux-x86_64 +test.test_threading.PyRLockTests.test_release_unacquired @ linux-x86_64 +test.test_threading.PyRLockTests.test_repr @ linux-x86_64 +test.test_threading.PyRLockTests.test_thread_leak @ linux-x86_64 +test.test_threading.PyRLockTests.test_timeout @ linux-x86_64 +test.test_threading.PyRLockTests.test_try_acquire @ linux-x86_64 +test.test_threading.PyRLockTests.test_try_acquire_contended @ linux-x86_64 +test.test_threading.PyRLockTests.test_weakref_exists @ linux-x86_64 +test.test_threading.PyRLockTests.test_with @ linux-x86_64 +test.test_threading.SemaphoreTests.test_acquire @ linux-x86_64 +test.test_threading.SemaphoreTests.test_acquire_contended @ linux-x86_64 +test.test_threading.SemaphoreTests.test_acquire_destroy @ linux-x86_64 +test.test_threading.SemaphoreTests.test_acquire_timeout @ linux-x86_64 +test.test_threading.SemaphoreTests.test_constructor @ linux-x86_64 +test.test_threading.SemaphoreTests.test_default_value @ linux-x86_64 +test.test_threading.SemaphoreTests.test_multirelease @ linux-x86_64 +test.test_threading.SemaphoreTests.test_release_unacquired @ linux-x86_64 +test.test_threading.SemaphoreTests.test_repr @ linux-x86_64 +test.test_threading.SemaphoreTests.test_try_acquire @ linux-x86_64 +test.test_threading.SemaphoreTests.test_try_acquire_contended @ linux-x86_64 +test.test_threading.SemaphoreTests.test_with @ linux-x86_64 +!test.test_threading.ThreadJoinOnShutdown.test_4_daemon_threads @ linux-x86_64 +test.test_threading.ThreadTests.test_BoundedSemaphore_limit @ linux-x86_64 +test.test_threading.ThreadTests.test_args_argument @ linux-x86_64 +test.test_threading.ThreadTests.test_boolean_target @ linux-x86_64 +test.test_threading.ThreadTests.test_daemon_param @ linux-x86_64 +test.test_threading.ThreadTests.test_enumerate_after_join @ linux-x86_64 +!test.test_threading.ThreadTests.test_finalization_shutdown @ linux-x86_64 +!test.test_threading.ThreadTests.test_finalize_with_trace @ linux-x86_64 +test.test_threading.ThreadTests.test_foreign_thread @ linux-x86_64 +test.test_threading.ThreadTests.test_getprofile @ linux-x86_64 +test.test_threading.ThreadTests.test_gettrace @ linux-x86_64 +test.test_threading.ThreadTests.test_ident_of_no_threading_threads @ linux-x86_64 +!test.test_threading.ThreadTests.test_import_from_another_thread @ linux-x86_64 +!test.test_threading.ThreadTests.test_join_nondaemon_on_shutdown @ linux-x86_64 +test.test_threading.ThreadTests.test_leak_without_join @ linux-x86_64 +test.test_threading.ThreadTests.test_limbo_cleanup @ linux-x86_64 +test.test_threading.ThreadTests.test_main_thread @ linux-x86_64 +test.test_threading.ThreadTests.test_old_threading_api @ linux-x86_64 +test.test_threading.ThreadTests.test_repr_daemon @ linux-x86_64 +test.test_threading.ThreadTests.test_repr_stopped @ linux-x86_64 +test.test_threading.ThreadTests.test_tstate_lock @ linux-x86_64 +test.test_threading.ThreadTests.test_various_ops @ linux-x86_64 +test.test_threading.ThreadTests.test_various_ops_large_stack @ linux-x86_64 +test.test_threading.ThreadTests.test_various_ops_small_stack @ linux-x86_64 +test.test_threading.ThreadingExceptionTests.test_bare_raise_in_brand_new_thread @ linux-x86_64 +test.test_threading.ThreadingExceptionTests.test_daemonize_active_thread @ linux-x86_64 +test.test_threading.ThreadingExceptionTests.test_joining_current_thread @ linux-x86_64 +test.test_threading.ThreadingExceptionTests.test_joining_inactive_thread @ linux-x86_64 +test.test_threading.ThreadingExceptionTests.test_multithread_modify_file_noerror @ linux-x86_64 +!test.test_threading.ThreadingExceptionTests.test_print_exception @ linux-x86_64 +!test.test_threading.ThreadingExceptionTests.test_print_exception_stderr_is_none_1 @ linux-x86_64 +!test.test_threading.ThreadingExceptionTests.test_print_exception_stderr_is_none_2 @ linux-x86_64 +test.test_threading.ThreadingExceptionTests.test_start_thread_again @ linux-x86_64 +test.test_threading.TimerTests.test_init_immutable_default_args @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_threading_local.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_threading_local.txt new file mode 100644 index 0000000000..401bc5f565 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_threading_local.txt @@ -0,0 +1,15 @@ +!DocTestCase._threading_local @ linux-x86_64 +test.test_threading_local.PyThreadingLocalTest.test_arguments @ linux-x86_64 +test.test_threading_local.PyThreadingLocalTest.test_derived @ linux-x86_64 +test.test_threading_local.PyThreadingLocalTest.test_derived_cycle_dealloc @ linux-x86_64 +test.test_threading_local.PyThreadingLocalTest.test_dict_attribute @ linux-x86_64 +test.test_threading_local.PyThreadingLocalTest.test_dict_attribute_subclass @ linux-x86_64 +test.test_threading_local.PyThreadingLocalTest.test_threading_local @ linux-x86_64 +test.test_threading_local.PyThreadingLocalTest.test_threading_local_subclass @ linux-x86_64 +test.test_threading_local.ThreadLocalTest.test_arguments @ linux-x86_64 +test.test_threading_local.ThreadLocalTest.test_derived @ linux-x86_64 +test.test_threading_local.ThreadLocalTest.test_derived_cycle_dealloc @ linux-x86_64 +test.test_threading_local.ThreadLocalTest.test_dict_attribute @ linux-x86_64 +test.test_threading_local.ThreadLocalTest.test_dict_attribute_subclass @ linux-x86_64 +test.test_threading_local.ThreadLocalTest.test_threading_local @ linux-x86_64 +test.test_threading_local.ThreadLocalTest.test_threading_local_subclass @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_threadsignals.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_threadsignals.txt new file mode 100644 index 0000000000..f00fb4dab4 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_threadsignals.txt @@ -0,0 +1,3 @@ +test.test_threadsignals.ThreadSignals.test_lock_acquire_retries_on_intr @ linux-x86_64 +test.test_threadsignals.ThreadSignals.test_rlock_acquire_retries_on_intr @ linux-x86_64 +test.test_threadsignals.ThreadSignals.test_signals @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_time.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_time.txt new file mode 100644 index 0000000000..0f81dc29a6 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_time.txt @@ -0,0 +1,32 @@ +test.test_time.TestAsctime4dyear.test_large_year @ linux-x86_64 +test.test_time.TestAsctime4dyear.test_negative @ linux-x86_64 +test.test_time.TestAsctime4dyear.test_year @ linux-x86_64 +test.test_time.TestLocale.test_bug_3061 @ linux-x86_64 +test.test_time.TestPytime.test_localtime_timezone @ linux-x86_64 +test.test_time.TestPytime.test_short_times @ linux-x86_64 +test.test_time.TestStrftime4dyear.test_large_year @ linux-x86_64 +test.test_time.TestStrftime4dyear.test_negative @ linux-x86_64 +test.test_time.TestStrftime4dyear.test_year @ linux-x86_64 +test.test_time.TimeTestCase.test_asctime @ linux-x86_64 +test.test_time.TimeTestCase.test_asctime_bounding_check @ linux-x86_64 +test.test_time.TimeTestCase.test_conversions @ linux-x86_64 +test.test_time.TimeTestCase.test_ctime @ linux-x86_64 +test.test_time.TimeTestCase.test_ctime_without_arg @ linux-x86_64 +test.test_time.TimeTestCase.test_data_attributes @ linux-x86_64 +test.test_time.TimeTestCase.test_default_values_for_zero @ linux-x86_64 +test.test_time.TimeTestCase.test_epoch @ linux-x86_64 +test.test_time.TimeTestCase.test_get_clock_info @ linux-x86_64 +test.test_time.TimeTestCase.test_insane_timestamps @ linux-x86_64 +test.test_time.TimeTestCase.test_mktime @ linux-x86_64 +test.test_time.TimeTestCase.test_monotonic @ linux-x86_64 +test.test_time.TimeTestCase.test_perf_counter @ linux-x86_64 +test.test_time.TimeTestCase.test_process_time @ linux-x86_64 +test.test_time.TimeTestCase.test_sleep @ linux-x86_64 +test.test_time.TimeTestCase.test_strftime @ linux-x86_64 +test.test_time.TimeTestCase.test_strftime_bounding_check @ linux-x86_64 +test.test_time.TimeTestCase.test_strftime_format_check @ linux-x86_64 +test.test_time.TimeTestCase.test_strptime_bytes @ linux-x86_64 +test.test_time.TimeTestCase.test_strptime_exception_context @ linux-x86_64 +test.test_time.TimeTestCase.test_thread_time @ linux-x86_64 +test.test_time.TimeTestCase.test_time @ linux-x86_64 +test.test_time.TimeTestCase.test_time_ns_type @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_timeit.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_timeit.txt new file mode 100644 index 0000000000..c878cc9509 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_timeit.txt @@ -0,0 +1,39 @@ +test.test_timeit.TestTimeit.test_autorange @ linux-x86_64 +test.test_timeit.TestTimeit.test_autorange_second @ linux-x86_64 +test.test_timeit.TestTimeit.test_autorange_with_callback @ linux-x86_64 +test.test_timeit.TestTimeit.test_main_bad_switch @ linux-x86_64 +test.test_timeit.TestTimeit.test_main_exception @ linux-x86_64 +test.test_timeit.TestTimeit.test_main_exception_fixed_reps @ linux-x86_64 +test.test_timeit.TestTimeit.test_main_fixed_iters @ linux-x86_64 +test.test_timeit.TestTimeit.test_main_fixed_reps @ linux-x86_64 +test.test_timeit.TestTimeit.test_main_help @ linux-x86_64 +test.test_timeit.TestTimeit.test_main_microseconds @ linux-x86_64 +test.test_timeit.TestTimeit.test_main_milliseconds @ linux-x86_64 +test.test_timeit.TestTimeit.test_main_multiple_setups @ linux-x86_64 +test.test_timeit.TestTimeit.test_main_negative_reps @ linux-x86_64 +test.test_timeit.TestTimeit.test_main_seconds @ linux-x86_64 +test.test_timeit.TestTimeit.test_main_setup @ linux-x86_64 +test.test_timeit.TestTimeit.test_main_verbose @ linux-x86_64 +test.test_timeit.TestTimeit.test_main_very_verbose @ linux-x86_64 +test.test_timeit.TestTimeit.test_main_with_time_unit @ linux-x86_64 +test.test_timeit.TestTimeit.test_print_exc @ linux-x86_64 +test.test_timeit.TestTimeit.test_reindent_empty @ linux-x86_64 +test.test_timeit.TestTimeit.test_reindent_multi @ linux-x86_64 +test.test_timeit.TestTimeit.test_reindent_multi_empty @ linux-x86_64 +test.test_timeit.TestTimeit.test_reindent_single @ linux-x86_64 +test.test_timeit.TestTimeit.test_repeat_callable_setup @ linux-x86_64 +test.test_timeit.TestTimeit.test_repeat_callable_stmt @ linux-x86_64 +test.test_timeit.TestTimeit.test_repeat_callable_stmt_and_setup @ linux-x86_64 +test.test_timeit.TestTimeit.test_repeat_few_reps_and_iters @ linux-x86_64 +test.test_timeit.TestTimeit.test_repeat_function_zero_iters @ linux-x86_64 +test.test_timeit.TestTimeit.test_repeat_function_zero_reps @ linux-x86_64 +test.test_timeit.TestTimeit.test_repeat_zero_iters @ linux-x86_64 +test.test_timeit.TestTimeit.test_repeat_zero_reps @ linux-x86_64 +test.test_timeit.TestTimeit.test_timeit_callable_setup @ linux-x86_64 +test.test_timeit.TestTimeit.test_timeit_callable_stmt @ linux-x86_64 +test.test_timeit.TestTimeit.test_timeit_callable_stmt_and_setup @ linux-x86_64 +test.test_timeit.TestTimeit.test_timeit_few_iters @ linux-x86_64 +test.test_timeit.TestTimeit.test_timeit_function_zero_iters @ linux-x86_64 +test.test_timeit.TestTimeit.test_timeit_globals_args @ linux-x86_64 +test.test_timeit.TestTimeit.test_timeit_zero_iters @ linux-x86_64 +test.test_timeit.TestTimeit.test_timer_empty_stmt @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_timeout.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_timeout.txt new file mode 100644 index 0000000000..5807452fbc --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_timeout.txt @@ -0,0 +1,12 @@ +test.test_timeout.CreationTestCase.testBlockingThenTimeout @ linux-x86_64 +test.test_timeout.CreationTestCase.testFloatReturnValue @ linux-x86_64 +test.test_timeout.CreationTestCase.testObjectCreation @ linux-x86_64 +test.test_timeout.CreationTestCase.testRangeCheck @ linux-x86_64 +test.test_timeout.CreationTestCase.testReturnType @ linux-x86_64 +test.test_timeout.CreationTestCase.testTimeoutThenBlocking @ linux-x86_64 +test.test_timeout.CreationTestCase.testTypeCheck @ linux-x86_64 +test.test_timeout.TCPTimeoutTestCase.testAcceptTimeout @ linux-x86_64 +test.test_timeout.TCPTimeoutTestCase.testSend @ linux-x86_64 +test.test_timeout.TCPTimeoutTestCase.testSendall @ linux-x86_64 +test.test_timeout.TCPTimeoutTestCase.testSendto @ linux-x86_64 +test.test_timeout.UDPTimeoutTestCase.testRecvfromTimeout @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tokenize.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tokenize.txt new file mode 100644 index 0000000000..2049643a32 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tokenize.txt @@ -0,0 +1,95 @@ +test.test_tokenize.CTokenizeTest.test_additive @ linux-x86_64 +test.test_tokenize.CTokenizeTest.test_async @ linux-x86_64 +test.test_tokenize.CTokenizeTest.test_comparison @ linux-x86_64 +test.test_tokenize.CTokenizeTest.test_continuation_lines_indentation @ linux-x86_64 +test.test_tokenize.CTokenizeTest.test_float @ linux-x86_64 +test.test_tokenize.CTokenizeTest.test_function @ linux-x86_64 +test.test_tokenize.CTokenizeTest.test_int @ linux-x86_64 +test.test_tokenize.CTokenizeTest.test_invalid_syntax @ linux-x86_64 +test.test_tokenize.CTokenizeTest.test_max_indent @ linux-x86_64 +test.test_tokenize.CTokenizeTest.test_method @ linux-x86_64 +test.test_tokenize.CTokenizeTest.test_multiplicative @ linux-x86_64 +test.test_tokenize.CTokenizeTest.test_selector @ linux-x86_64 +test.test_tokenize.CTokenizeTest.test_string @ linux-x86_64 +test.test_tokenize.CTokenizeTest.test_tabs @ linux-x86_64 +test.test_tokenize.CTokenizeTest.test_unary @ linux-x86_64 +test.test_tokenize.CTokenizerBufferTests.test_newline_at_the_end_of_buffer @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_additive @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_async @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_basic @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_comparison @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_float @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_function @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_implicit_newline @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_int @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_long @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_method @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_multiplicative @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_non_ascii_identifiers @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_selector @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_shift @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_string @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_tabs @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_unary @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_underscore_literals @ linux-x86_64 +test.test_tokenize.GenerateTokensTest.test_unicode @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_bom_no_cookie @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_cookie_first_line_no_bom @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_cookie_second_line_commented_first_line @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_cookie_second_line_empty_first_line @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_cookie_second_line_no_bom @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_cookie_second_line_noncommented_first_line @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_false_encoding @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_filename_in_exception @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_latin1_normalization @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_matched_bom_and_cookie_first_line @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_matched_bom_and_cookie_second_line @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_mismatched_bom_and_cookie_first_line_raises_syntaxerror @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_mismatched_bom_and_cookie_second_line_raises_syntaxerror @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_no_bom_no_encoding_cookie @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_open @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_open_error @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_short_files @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_syntaxerror_latin1 @ linux-x86_64 +test.test_tokenize.TestDetectEncoding.test_utf8_normalization @ linux-x86_64 +test.test_tokenize.TestMisc.test_decistmt @ linux-x86_64 +test.test_tokenize.TestRoundtrip.test_backslash_continuation @ linux-x86_64 +test.test_tokenize.TestRoundtrip.test_continuation @ linux-x86_64 +test.test_tokenize.TestRoundtrip.test_indentation_semantics_retained @ linux-x86_64 +test.test_tokenize.TestRoundtrip.test_random_files @ linux-x86_64 +test.test_tokenize.TestRoundtrip.test_roundtrip @ linux-x86_64 +test.test_tokenize.TestRoundtrip.test_string_concatenation @ linux-x86_64 +test.test_tokenize.TestTokenize.test_comment_at_the_end_of_the_source_without_newline @ linux-x86_64 +test.test_tokenize.TestTokenize.test_exact_type @ linux-x86_64 +test.test_tokenize.TestTokenize.test_oneline_defs @ linux-x86_64 +test.test_tokenize.TestTokenize.test_pathological_trailing_whitespace @ linux-x86_64 +test.test_tokenize.TestTokenize.test_tokenize @ linux-x86_64 +test.test_tokenize.TestTokenizerAdheresToPep0263.test_bad_coding_cookie @ linux-x86_64 +test.test_tokenize.TestTokenizerAdheresToPep0263.test_latin1_coding_cookie_and_utf8_bom @ linux-x86_64 +test.test_tokenize.TestTokenizerAdheresToPep0263.test_no_coding_cookie_and_utf8_bom @ linux-x86_64 +test.test_tokenize.TestTokenizerAdheresToPep0263.test_utf8_coding_cookie_and_no_utf8_bom @ linux-x86_64 +test.test_tokenize.TestTokenizerAdheresToPep0263.test_utf8_coding_cookie_and_utf8_bom @ linux-x86_64 +test.test_tokenize.Test_Tokenize.test__tokenize_decodes_with_specified_encoding @ linux-x86_64 +test.test_tokenize.Test_Tokenize.test__tokenize_does_not_decode_with_encoding_none @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_additive @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_async @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_basic @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_comparison @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_float @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_function @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_implicit_newline @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_int @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_long @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_method @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_multiplicative @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_non_ascii_identifiers @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_selector @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_shift @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_string @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_tabs @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_unary @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_underscore_literals @ linux-x86_64 +test.test_tokenize.TokenizeTest.test_unicode @ linux-x86_64 +test.test_tokenize.UntokenizeTest.test_backslash_continuation @ linux-x86_64 +test.test_tokenize.UntokenizeTest.test_bad_input_order @ linux-x86_64 +test.test_tokenize.UntokenizeTest.test_iter_compat @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tomllib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tomllib.txt new file mode 100644 index 0000000000..5c1232c654 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tomllib.txt @@ -0,0 +1,13 @@ +test.test_tomllib.test_data.TestData.test_invalid @ linux-x86_64 +test.test_tomllib.test_data.TestData.test_valid @ linux-x86_64 +test.test_tomllib.test_error.TestError.test_invalid_char_quotes @ linux-x86_64 +test.test_tomllib.test_error.TestError.test_invalid_parse_float @ linux-x86_64 +test.test_tomllib.test_error.TestError.test_line_and_col @ linux-x86_64 +test.test_tomllib.test_error.TestError.test_missing_value @ linux-x86_64 +test.test_tomllib.test_error.TestError.test_module_name @ linux-x86_64 +test.test_tomllib.test_misc.TestMiscellaneous.test_deepcopy @ linux-x86_64 +test.test_tomllib.test_misc.TestMiscellaneous.test_incorrect_load @ linux-x86_64 +test.test_tomllib.test_misc.TestMiscellaneous.test_inline_array_recursion_limit @ linux-x86_64 +test.test_tomllib.test_misc.TestMiscellaneous.test_inline_table_recursion_limit @ linux-x86_64 +test.test_tomllib.test_misc.TestMiscellaneous.test_load @ linux-x86_64 +test.test_tomllib.test_misc.TestMiscellaneous.test_parse_float @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_traceback.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_traceback.txt new file mode 100644 index 0000000000..40ad824561 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_traceback.txt @@ -0,0 +1,92 @@ +test.test_traceback.LimitTests.test_extract_stack @ linux-x86_64 +test.test_traceback.LimitTests.test_extract_tb @ linux-x86_64 +test.test_traceback.LimitTests.test_format_exception @ linux-x86_64 +test.test_traceback.MiscTest.test_all @ linux-x86_64 +test.test_traceback.MiscTracebackCases.test_extract_stack @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_cause @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_cause_and_context @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_cause_recursive @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_context @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_context_suppression @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_exception_bad__str__ @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_exception_group_basic @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_exception_group_cause @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_exception_group_context_with_context @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_exception_group_depth_limit @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_exception_group_nested @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_exception_group_width_limit @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_exception_group_with_multiple_notes @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_exception_group_with_notes @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_exception_modulename @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_exception_modulename_not_unicode @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_exception_qualname @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_exception_with_invalid_notes @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_exception_with_multiple_notes @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_exception_with_note @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_message_none @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_simple @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_syntax_error_no_lineno @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_syntax_error_offset_at_eol @ linux-x86_64 +test.test_traceback.PyExcReportingTests.test_syntax_error_various_offsets @ linux-x86_64 +test.test_traceback.TestFrame.test_explicit_line @ linux-x86_64 +test.test_traceback.TestFrame.test_len @ linux-x86_64 +test.test_traceback.TestFrame.test_no_line @ linux-x86_64 +test.test_traceback.TestStack.test_custom_format_frame @ linux-x86_64 +test.test_traceback.TestStack.test_dropping_frames @ linux-x86_64 +test.test_traceback.TestStack.test_extract_stack @ linux-x86_64 +test.test_traceback.TestStack.test_extract_stack_limit @ linux-x86_64 +test.test_traceback.TestStack.test_format_locals @ linux-x86_64 +test.test_traceback.TestStack.test_format_smoke @ linux-x86_64 +test.test_traceback.TestStack.test_from_list @ linux-x86_64 +test.test_traceback.TestStack.test_from_list_edited_stack @ linux-x86_64 +test.test_traceback.TestStack.test_locals @ linux-x86_64 +test.test_traceback.TestStack.test_no_locals @ linux-x86_64 +test.test_traceback.TestStack.test_walk_stack @ linux-x86_64 +test.test_traceback.TestStack.test_walk_tb @ linux-x86_64 +test.test_traceback.TestTracebackException.test_cause @ linux-x86_64 +test.test_traceback.TestTracebackException.test_compact_no_cause @ linux-x86_64 +test.test_traceback.TestTracebackException.test_compact_with_cause @ linux-x86_64 +test.test_traceback.TestTracebackException.test_comparison_basic @ linux-x86_64 +test.test_traceback.TestTracebackException.test_comparison_equivalent_exceptions_are_equal @ linux-x86_64 +test.test_traceback.TestTracebackException.test_comparison_params_variations @ linux-x86_64 +test.test_traceback.TestTracebackException.test_context @ linux-x86_64 +test.test_traceback.TestTracebackException.test_from_exception @ linux-x86_64 +test.test_traceback.TestTracebackException.test_limit @ linux-x86_64 +test.test_traceback.TestTracebackException.test_locals @ linux-x86_64 +test.test_traceback.TestTracebackException.test_long_context_chain @ linux-x86_64 +test.test_traceback.TestTracebackException.test_no_locals @ linux-x86_64 +test.test_traceback.TestTracebackException.test_no_refs_to_exception_and_traceback_objects @ linux-x86_64 +test.test_traceback.TestTracebackException.test_smoke @ linux-x86_64 +test.test_traceback.TestTracebackException.test_traceback_header @ linux-x86_64 +test.test_traceback.TestTracebackException.test_unhashable @ linux-x86_64 +test.test_traceback.TestTracebackException_ExceptionGroups.test_comparison @ linux-x86_64 +test.test_traceback.TestTracebackException_ExceptionGroups.test_exception_group_construction @ linux-x86_64 +test.test_traceback.TestTracebackException_ExceptionGroups.test_exception_group_format_exception_only @ linux-x86_64 +test.test_traceback.TestTracebackException_ExceptionGroups.test_max_group_depth @ linux-x86_64 +test.test_traceback.TestTracebackException_ExceptionGroups.test_max_group_width @ linux-x86_64 +test.test_traceback.TracebackCases.test_base_exception @ linux-x86_64 +test.test_traceback.TracebackCases.test_caret @ linux-x86_64 +test.test_traceback.TracebackCases.test_encoded_file @ linux-x86_64 +test.test_traceback.TracebackCases.test_exception_is_None @ linux-x86_64 +test.test_traceback.TracebackCases.test_format_exception_exc @ linux-x86_64 +test.test_traceback.TracebackCases.test_format_exception_only_bad__str__ @ linux-x86_64 +test.test_traceback.TracebackCases.test_format_exception_only_exc @ linux-x86_64 +test.test_traceback.TracebackCases.test_no_caret_with_no_debug_ranges_flag @ linux-x86_64 +test.test_traceback.TracebackCases.test_nocaret @ linux-x86_64 +test.test_traceback.TracebackCases.test_print_exception @ linux-x86_64 +test.test_traceback.TracebackCases.test_print_exception_exc @ linux-x86_64 +test.test_traceback.TracebackCases.test_recursion_error_during_traceback @ linux-x86_64 +test.test_traceback.TracebackCases.test_signatures @ linux-x86_64 +test.test_traceback.TracebackErrorLocationCaretTests.test_basic_caret @ linux-x86_64 +test.test_traceback.TracebackErrorLocationCaretTests.test_byte_offset_multiline @ linux-x86_64 +test.test_traceback.TracebackErrorLocationCaretTests.test_caret_exception_group @ linux-x86_64 +test.test_traceback.TracebackErrorLocationCaretTests.test_caret_in_type_annotation @ linux-x86_64 +test.test_traceback.TracebackErrorLocationCaretTests.test_caret_multiline_expression @ linux-x86_64 +test.test_traceback.TracebackErrorLocationCaretTests.test_caret_multiline_expression_bin_op @ linux-x86_64 +test.test_traceback.TracebackErrorLocationCaretTests.test_traceback_specialization_with_syntax_error @ linux-x86_64 +test.test_traceback.TracebackErrorLocationCaretTests.test_traceback_very_long_line @ linux-x86_64 +test.test_traceback.TracebackFormatTests.test_exception_group_deep_recursion_traceback @ linux-x86_64 +test.test_traceback.TracebackFormatTests.test_format_stack @ linux-x86_64 +test.test_traceback.TracebackFormatTests.test_print_exception_bad_type_python @ linux-x86_64 +test.test_traceback.TracebackFormatTests.test_print_stack @ linux-x86_64 +test.test_traceback.TracebackFormatTests.test_stack_format @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tracemalloc.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tracemalloc.txt new file mode 100644 index 0000000000..d8a82207d5 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tracemalloc.txt @@ -0,0 +1,19 @@ +test.test_tracemalloc.TestCommandLine.test_pymem_alloc0 @ linux-x86_64 +test.test_tracemalloc.TestFilters.test_filter_attributes @ linux-x86_64 +test.test_tracemalloc.TestFilters.test_filter_match @ linux-x86_64 +test.test_tracemalloc.TestFilters.test_filter_match_filename @ linux-x86_64 +test.test_tracemalloc.TestFilters.test_filter_match_filename_joker @ linux-x86_64 +test.test_tracemalloc.TestFilters.test_filter_match_trace @ linux-x86_64 +test.test_tracemalloc.TestSnapshot.test_filter_traces @ linux-x86_64 +test.test_tracemalloc.TestSnapshot.test_filter_traces_domain @ linux-x86_64 +test.test_tracemalloc.TestSnapshot.test_filter_traces_domain_filter @ linux-x86_64 +test.test_tracemalloc.TestSnapshot.test_format_traceback @ linux-x86_64 +test.test_tracemalloc.TestSnapshot.test_slices @ linux-x86_64 +test.test_tracemalloc.TestSnapshot.test_snapshot_group_by_cumulative @ linux-x86_64 +test.test_tracemalloc.TestSnapshot.test_snapshot_group_by_file @ linux-x86_64 +test.test_tracemalloc.TestSnapshot.test_snapshot_group_by_line @ linux-x86_64 +test.test_tracemalloc.TestSnapshot.test_snapshot_group_by_traceback @ linux-x86_64 +test.test_tracemalloc.TestSnapshot.test_statistic_diff_format @ linux-x86_64 +test.test_tracemalloc.TestSnapshot.test_statistic_format @ linux-x86_64 +test.test_tracemalloc.TestSnapshot.test_trace_format @ linux-x86_64 +test.test_tracemalloc.TestTraceback.test_repr @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tty.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tty.txt new file mode 100644 index 0000000000..b0bda1f877 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tty.txt @@ -0,0 +1,2 @@ +test.test_tty.TestTty.test_setcbreak @ linux-x86_64 +test.test_tty.TestTty.test_setraw @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tuple.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tuple.txt new file mode 100644 index 0000000000..01e26e0d6f --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_tuple.txt @@ -0,0 +1,28 @@ +test.test_tuple.TupleTest.test_addmul @ linux-x86_64 +test.test_tuple.TupleTest.test_constructors @ linux-x86_64 +test.test_tuple.TupleTest.test_contains @ linux-x86_64 +test.test_tuple.TupleTest.test_contains_fake @ linux-x86_64 +test.test_tuple.TupleTest.test_contains_order @ linux-x86_64 +test.test_tuple.TupleTest.test_count @ linux-x86_64 +test.test_tuple.TupleTest.test_getitem @ linux-x86_64 +test.test_tuple.TupleTest.test_getitem_error @ linux-x86_64 +test.test_tuple.TupleTest.test_getitemoverwriteiter @ linux-x86_64 +test.test_tuple.TupleTest.test_getslice @ linux-x86_64 +test.test_tuple.TupleTest.test_hash_optional @ linux-x86_64 +test.test_tuple.TupleTest.test_iadd @ linux-x86_64 +test.test_tuple.TupleTest.test_imul @ linux-x86_64 +test.test_tuple.TupleTest.test_index @ linux-x86_64 +test.test_tuple.TupleTest.test_iterator_pickle @ linux-x86_64 +test.test_tuple.TupleTest.test_keyword_args @ linux-x86_64 +test.test_tuple.TupleTest.test_len @ linux-x86_64 +test.test_tuple.TupleTest.test_lexicographic_ordering @ linux-x86_64 +test.test_tuple.TupleTest.test_minmax @ linux-x86_64 +test.test_tuple.TupleTest.test_no_comdat_folding @ linux-x86_64 +test.test_tuple.TupleTest.test_pickle @ linux-x86_64 +test.test_tuple.TupleTest.test_repeat @ linux-x86_64 +test.test_tuple.TupleTest.test_repr @ linux-x86_64 +test.test_tuple.TupleTest.test_repr_large @ linux-x86_64 +test.test_tuple.TupleTest.test_reversed_pickle @ linux-x86_64 +test.test_tuple.TupleTest.test_subscript @ linux-x86_64 +test.test_tuple.TupleTest.test_truth @ linux-x86_64 +test.test_tuple.TupleTest.test_tupleresizebug @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_type_annotations.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_type_annotations.txt new file mode 100644 index 0000000000..1f01fe5fb3 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_type_annotations.txt @@ -0,0 +1,8 @@ +test.test_type_annotations.TestSetupAnnotations.test_blocks @ linux-x86_64 +test.test_type_annotations.TestSetupAnnotations.test_top_level @ linux-x86_64 +test.test_type_annotations.TestSetupAnnotations.test_try @ linux-x86_64 +test.test_type_annotations.TypeAnnotationTests.test_annotations_are_created_correctly @ linux-x86_64 +test.test_type_annotations.TypeAnnotationTests.test_annotations_getset_raises @ linux-x86_64 +test.test_type_annotations.TypeAnnotationTests.test_descriptor_still_works @ linux-x86_64 +test.test_type_annotations.TypeAnnotationTests.test_lazy_create_annotations @ linux-x86_64 +test.test_type_annotations.TypeAnnotationTests.test_setting_annotations @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_type_comments.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_type_comments.txt new file mode 100644 index 0000000000..2ee79ee6b2 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_type_comments.txt @@ -0,0 +1,16 @@ +test.test_type_comments.TypeCommentTests.test_asynccomp @ linux-x86_64 +test.test_type_comments.TypeCommentTests.test_asyncdef @ linux-x86_64 +test.test_type_comments.TypeCommentTests.test_asyncvar @ linux-x86_64 +test.test_type_comments.TypeCommentTests.test_forstmt @ linux-x86_64 +test.test_type_comments.TypeCommentTests.test_fstring @ linux-x86_64 +test.test_type_comments.TypeCommentTests.test_func_type_input @ linux-x86_64 +test.test_type_comments.TypeCommentTests.test_funcdef @ linux-x86_64 +test.test_type_comments.TypeCommentTests.test_ignores @ linux-x86_64 +test.test_type_comments.TypeCommentTests.test_inappropriate_type_comments @ linux-x86_64 +test.test_type_comments.TypeCommentTests.test_longargs @ linux-x86_64 +test.test_type_comments.TypeCommentTests.test_matmul @ linux-x86_64 +test.test_type_comments.TypeCommentTests.test_nonasciidef @ linux-x86_64 +test.test_type_comments.TypeCommentTests.test_redundantdef @ linux-x86_64 +test.test_type_comments.TypeCommentTests.test_underscorednumber @ linux-x86_64 +test.test_type_comments.TypeCommentTests.test_vardecl @ linux-x86_64 +test.test_type_comments.TypeCommentTests.test_withstmt @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_typechecks.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_typechecks.txt new file mode 100644 index 0000000000..1fec90ebed --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_typechecks.txt @@ -0,0 +1,6 @@ +test.test_typechecks.TypeChecksTest.testIsInstanceActual @ linux-x86_64 +test.test_typechecks.TypeChecksTest.testIsInstanceBuiltin @ linux-x86_64 +test.test_typechecks.TypeChecksTest.testIsSubclassActual @ linux-x86_64 +test.test_typechecks.TypeChecksTest.testIsSubclassBuiltin @ linux-x86_64 +test.test_typechecks.TypeChecksTest.testIsSubclassInternal @ linux-x86_64 +test.test_typechecks.TypeChecksTest.testSubclassBehavior @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_types.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_types.txt new file mode 100644 index 0000000000..5b14241ccc --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_types.txt @@ -0,0 +1,99 @@ +test.test_types.ClassCreationTests.test_bad___prepare__ @ linux-x86_64 +test.test_types.ClassCreationTests.test_metaclass_derivation @ linux-x86_64 +test.test_types.ClassCreationTests.test_metaclass_new_error @ linux-x86_64 +test.test_types.ClassCreationTests.test_metaclass_override_callable @ linux-x86_64 +test.test_types.ClassCreationTests.test_metaclass_override_function @ linux-x86_64 +test.test_types.ClassCreationTests.test_new_class_basics @ linux-x86_64 +test.test_types.ClassCreationTests.test_new_class_defaults @ linux-x86_64 +test.test_types.ClassCreationTests.test_new_class_exec_body @ linux-x86_64 +test.test_types.ClassCreationTests.test_new_class_meta @ linux-x86_64 +test.test_types.ClassCreationTests.test_new_class_meta_with_base @ linux-x86_64 +test.test_types.ClassCreationTests.test_new_class_metaclass_keywords @ linux-x86_64 +test.test_types.ClassCreationTests.test_new_class_subclass @ linux-x86_64 +test.test_types.ClassCreationTests.test_new_class_with_mro_entry @ linux-x86_64 +test.test_types.ClassCreationTests.test_new_class_with_mro_entry_error @ linux-x86_64 +test.test_types.ClassCreationTests.test_new_class_with_mro_entry_genericalias @ linux-x86_64 +test.test_types.ClassCreationTests.test_new_class_with_mro_entry_multiple @ linux-x86_64 +test.test_types.ClassCreationTests.test_new_class_with_mro_entry_multiple_2 @ linux-x86_64 +test.test_types.ClassCreationTests.test_new_class_with_mro_entry_none @ linux-x86_64 +test.test_types.ClassCreationTests.test_prepare_class @ linux-x86_64 +test.test_types.ClassCreationTests.test_resolve_bases @ linux-x86_64 +test.test_types.ClassCreationTests.test_resolve_bases_with_mro_entry @ linux-x86_64 +test.test_types.CoroutineTests.test_duck_coro @ linux-x86_64 +test.test_types.CoroutineTests.test_duck_corogen @ linux-x86_64 +test.test_types.CoroutineTests.test_non_gen_values @ linux-x86_64 +test.test_types.CoroutineTests.test_wrapper_object @ linux-x86_64 +test.test_types.CoroutineTests.test_wrong_args @ linux-x86_64 +test.test_types.MappingProxyTests.test_chainmap @ linux-x86_64 +test.test_types.MappingProxyTests.test_constructor @ linux-x86_64 +test.test_types.MappingProxyTests.test_contains @ linux-x86_64 +test.test_types.MappingProxyTests.test_copy @ linux-x86_64 +test.test_types.MappingProxyTests.test_customdict @ linux-x86_64 +test.test_types.MappingProxyTests.test_get @ linux-x86_64 +test.test_types.MappingProxyTests.test_iterators @ linux-x86_64 +test.test_types.MappingProxyTests.test_len @ linux-x86_64 +test.test_types.MappingProxyTests.test_methods @ linux-x86_64 +test.test_types.MappingProxyTests.test_missing @ linux-x86_64 +test.test_types.MappingProxyTests.test_reversed @ linux-x86_64 +test.test_types.MappingProxyTests.test_union @ linux-x86_64 +test.test_types.MappingProxyTests.test_views @ linux-x86_64 +test.test_types.SimpleNamespaceTests.test_as_dict @ linux-x86_64 +test.test_types.SimpleNamespaceTests.test_attrdel @ linux-x86_64 +test.test_types.SimpleNamespaceTests.test_attrget @ linux-x86_64 +test.test_types.SimpleNamespaceTests.test_attrset @ linux-x86_64 +test.test_types.SimpleNamespaceTests.test_constructor @ linux-x86_64 +test.test_types.SimpleNamespaceTests.test_equal @ linux-x86_64 +test.test_types.SimpleNamespaceTests.test_fake_namespace_compare @ linux-x86_64 +test.test_types.SimpleNamespaceTests.test_nested @ linux-x86_64 +test.test_types.SimpleNamespaceTests.test_pickle @ linux-x86_64 +test.test_types.SimpleNamespaceTests.test_recursive @ linux-x86_64 +test.test_types.SimpleNamespaceTests.test_subclass @ linux-x86_64 +test.test_types.SimpleNamespaceTests.test_unbound @ linux-x86_64 +test.test_types.SimpleNamespaceTests.test_underlying_dict @ linux-x86_64 +test.test_types.TypesTests.test_boolean_ops @ linux-x86_64 +test.test_types.TypesTests.test_comparisons @ linux-x86_64 +test.test_types.TypesTests.test_ellipsis_type @ linux-x86_64 +test.test_types.TypesTests.test_float__format__ @ linux-x86_64 +test.test_types.TypesTests.test_float__format__locale @ linux-x86_64 +test.test_types.TypesTests.test_float_constructor @ linux-x86_64 +test.test_types.TypesTests.test_float_to_string @ linux-x86_64 +test.test_types.TypesTests.test_floats @ linux-x86_64 +test.test_types.TypesTests.test_format_spec_errors @ linux-x86_64 +test.test_types.TypesTests.test_int__format__ @ linux-x86_64 +test.test_types.TypesTests.test_int__format__locale @ linux-x86_64 +test.test_types.TypesTests.test_method_wrapper_types @ linux-x86_64 +test.test_types.TypesTests.test_none_type @ linux-x86_64 +test.test_types.TypesTests.test_normal_integers @ linux-x86_64 +test.test_types.TypesTests.test_notimplemented_type @ linux-x86_64 +test.test_types.TypesTests.test_numeric_types @ linux-x86_64 +test.test_types.TypesTests.test_slot_wrapper_types @ linux-x86_64 +test.test_types.TypesTests.test_strings @ linux-x86_64 +test.test_types.TypesTests.test_traceback_and_frame_types @ linux-x86_64 +test.test_types.TypesTests.test_truth_values @ linux-x86_64 +test.test_types.TypesTests.test_type_function @ linux-x86_64 +test.test_types.TypesTests.test_zero_division @ linux-x86_64 +test.test_types.UnionTests.test_bad_instancecheck @ linux-x86_64 +test.test_types.UnionTests.test_bad_subclasscheck @ linux-x86_64 +test.test_types.UnionTests.test_hash @ linux-x86_64 +test.test_types.UnionTests.test_instancecheck_and_subclasscheck @ linux-x86_64 +test.test_types.UnionTests.test_instancecheck_and_subclasscheck_order @ linux-x86_64 +test.test_types.UnionTests.test_or_type_operator_with_Alias @ linux-x86_64 +test.test_types.UnionTests.test_or_type_operator_with_IO @ linux-x86_64 +test.test_types.UnionTests.test_or_type_operator_with_Literal @ linux-x86_64 +test.test_types.UnionTests.test_or_type_operator_with_NamedTuple @ linux-x86_64 +test.test_types.UnionTests.test_or_type_operator_with_NewType @ linux-x86_64 +test.test_types.UnionTests.test_or_type_operator_with_Protocol @ linux-x86_64 +test.test_types.UnionTests.test_or_type_operator_with_SpecialForm @ linux-x86_64 +test.test_types.UnionTests.test_or_type_operator_with_TypeVar @ linux-x86_64 +test.test_types.UnionTests.test_or_type_operator_with_TypedDict @ linux-x86_64 +test.test_types.UnionTests.test_or_type_operator_with_bad_module @ linux-x86_64 +test.test_types.UnionTests.test_or_type_operator_with_forward @ linux-x86_64 +test.test_types.UnionTests.test_or_type_operator_with_genericalias @ linux-x86_64 +test.test_types.UnionTests.test_or_type_repr @ linux-x86_64 +test.test_types.UnionTests.test_or_types_operator @ linux-x86_64 +test.test_types.UnionTests.test_union_args @ linux-x86_64 +test.test_types.UnionTests.test_union_copy @ linux-x86_64 +test.test_types.UnionTests.test_union_parameter_chaining @ linux-x86_64 +test.test_types.UnionTests.test_union_parameter_substitution @ linux-x86_64 +test.test_types.UnionTests.test_union_parameter_substitution_errors @ linux-x86_64 +test.test_types.UnionTests.test_union_pickle @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ucn.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ucn.txt new file mode 100644 index 0000000000..8c47d62fd2 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_ucn.txt @@ -0,0 +1,12 @@ +test.test_ucn.UnicodeNamesTest.test_aliases @ linux-x86_64 +test.test_ucn.UnicodeNamesTest.test_aliases_names_in_pua_range @ linux-x86_64 +test.test_ucn.UnicodeNamesTest.test_ascii_letters @ linux-x86_64 +test.test_ucn.UnicodeNamesTest.test_cjk_unified_ideographs @ linux-x86_64 +test.test_ucn.UnicodeNamesTest.test_errors @ linux-x86_64 +test.test_ucn.UnicodeNamesTest.test_general @ linux-x86_64 +test.test_ucn.UnicodeNamesTest.test_hangul_syllables @ linux-x86_64 +test.test_ucn.UnicodeNamesTest.test_misc_symbols @ linux-x86_64 +test.test_ucn.UnicodeNamesTest.test_named_sequences_full @ linux-x86_64 +test.test_ucn.UnicodeNamesTest.test_named_sequences_names_in_pua_range @ linux-x86_64 +test.test_ucn.UnicodeNamesTest.test_named_sequences_sample @ linux-x86_64 +test.test_ucn.UnicodeNamesTest.test_strict_error_handling @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unary.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unary.txt new file mode 100644 index 0000000000..2be7122090 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unary.txt @@ -0,0 +1,6 @@ +test.test_unary.UnaryOpTestCase.test_bad_types @ linux-x86_64 +test.test_unary.UnaryOpTestCase.test_invert @ linux-x86_64 +test.test_unary.UnaryOpTestCase.test_negation_of_exponentiation @ linux-x86_64 +test.test_unary.UnaryOpTestCase.test_negative @ linux-x86_64 +test.test_unary.UnaryOpTestCase.test_no_overflow @ linux-x86_64 +test.test_unary.UnaryOpTestCase.test_positive @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unicode.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unicode.txt new file mode 100644 index 0000000000..d1f2972e75 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unicode.txt @@ -0,0 +1,112 @@ +test.test_unicode.StringModuleTest.test_formatter_field_name_split @ linux-x86_64 +test.test_unicode.StringModuleTest.test_formatter_parser @ linux-x86_64 +test.test_unicode.StringModuleTest.test_str_subclass_attr @ linux-x86_64 +test.test_unicode.UnicodeTest.test___contains__ @ linux-x86_64 +test.test_unicode.UnicodeTest.test_additional_rsplit @ linux-x86_64 +test.test_unicode.UnicodeTest.test_additional_split @ linux-x86_64 +test.test_unicode.UnicodeTest.test_ascii @ linux-x86_64 +test.test_unicode.UnicodeTest.test_bug1001011 @ linux-x86_64 +test.test_unicode.UnicodeTest.test_bytes_comparison @ linux-x86_64 +test.test_unicode.UnicodeTest.test_capitalize @ linux-x86_64 +test.test_unicode.UnicodeTest.test_casefold @ linux-x86_64 +test.test_unicode.UnicodeTest.test_center @ linux-x86_64 +test.test_unicode.UnicodeTest.test_codecs @ linux-x86_64 +test.test_unicode.UnicodeTest.test_codecs_errors @ linux-x86_64 +test.test_unicode.UnicodeTest.test_codecs_idna @ linux-x86_64 +test.test_unicode.UnicodeTest.test_codecs_utf7 @ linux-x86_64 +test.test_unicode.UnicodeTest.test_codecs_utf8 @ linux-x86_64 +test.test_unicode.UnicodeTest.test_compare @ linux-x86_64 +test.test_unicode.UnicodeTest.test_comparison @ linux-x86_64 +test.test_unicode.UnicodeTest.test_concatenation @ linux-x86_64 +test.test_unicode.UnicodeTest.test_constructor @ linux-x86_64 +test.test_unicode.UnicodeTest.test_constructor_defaults @ linux-x86_64 +test.test_unicode.UnicodeTest.test_constructor_keyword_args @ linux-x86_64 +test.test_unicode.UnicodeTest.test_contains @ linux-x86_64 +test.test_unicode.UnicodeTest.test_conversion @ linux-x86_64 +test.test_unicode.UnicodeTest.test_count @ linux-x86_64 +test.test_unicode.UnicodeTest.test_endswith @ linux-x86_64 +test.test_unicode.UnicodeTest.test_exhausted_iterator @ linux-x86_64 +test.test_unicode.UnicodeTest.test_expandtabs @ linux-x86_64 +test.test_unicode.UnicodeTest.test_extended_getslice @ linux-x86_64 +test.test_unicode.UnicodeTest.test_find @ linux-x86_64 +test.test_unicode.UnicodeTest.test_find_etc_raise_correct_error_messages @ linux-x86_64 +test.test_unicode.UnicodeTest.test_find_periodic_pattern @ linux-x86_64 +test.test_unicode.UnicodeTest.test_find_shift_table_overflow @ linux-x86_64 +test.test_unicode.UnicodeTest.test_fixtype @ linux-x86_64 +test.test_unicode.UnicodeTest.test_floatformatting @ linux-x86_64 +test.test_unicode.UnicodeTest.test_format @ linux-x86_64 +test.test_unicode.UnicodeTest.test_format_auto_numbering @ linux-x86_64 +test.test_unicode.UnicodeTest.test_format_float @ linux-x86_64 +test.test_unicode.UnicodeTest.test_format_huge_item_number @ linux-x86_64 +test.test_unicode.UnicodeTest.test_format_huge_precision @ linux-x86_64 +test.test_unicode.UnicodeTest.test_format_huge_width @ linux-x86_64 +test.test_unicode.UnicodeTest.test_format_map @ linux-x86_64 +test.test_unicode.UnicodeTest.test_format_subclass @ linux-x86_64 +test.test_unicode.UnicodeTest.test_formatting @ linux-x86_64 +test.test_unicode.UnicodeTest.test_formatting_huge_precision @ linux-x86_64 +test.test_unicode.UnicodeTest.test_formatting_huge_width @ linux-x86_64 +test.test_unicode.UnicodeTest.test_formatting_with_enum @ linux-x86_64 +test.test_unicode.UnicodeTest.test_getnewargs @ linux-x86_64 +test.test_unicode.UnicodeTest.test_hash @ linux-x86_64 +test.test_unicode.UnicodeTest.test_index @ linux-x86_64 +test.test_unicode.UnicodeTest.test_inplace_rewrites @ linux-x86_64 +test.test_unicode.UnicodeTest.test_invalid_cb_for_2bytes_seq @ linux-x86_64 +test.test_unicode.UnicodeTest.test_invalid_cb_for_4bytes_seq @ linux-x86_64 +test.test_unicode.UnicodeTest.test_invalid_start_byte @ linux-x86_64 +test.test_unicode.UnicodeTest.test_isalnum @ linux-x86_64 +test.test_unicode.UnicodeTest.test_isalpha @ linux-x86_64 +test.test_unicode.UnicodeTest.test_isascii @ linux-x86_64 +test.test_unicode.UnicodeTest.test_isdecimal @ linux-x86_64 +test.test_unicode.UnicodeTest.test_isdigit @ linux-x86_64 +test.test_unicode.UnicodeTest.test_isidentifier @ linux-x86_64 +test.test_unicode.UnicodeTest.test_islower @ linux-x86_64 +test.test_unicode.UnicodeTest.test_isnumeric @ linux-x86_64 +test.test_unicode.UnicodeTest.test_isprintable @ linux-x86_64 +test.test_unicode.UnicodeTest.test_isspace @ linux-x86_64 +test.test_unicode.UnicodeTest.test_isspace_invariant @ linux-x86_64 +test.test_unicode.UnicodeTest.test_issue18183 @ linux-x86_64 +test.test_unicode.UnicodeTest.test_issue28598_strsubclass_rhs @ linux-x86_64 +test.test_unicode.UnicodeTest.test_issue8271 @ linux-x86_64 +test.test_unicode.UnicodeTest.test_istitle @ linux-x86_64 +test.test_unicode.UnicodeTest.test_isupper @ linux-x86_64 +test.test_unicode.UnicodeTest.test_iteration @ linux-x86_64 +test.test_unicode.UnicodeTest.test_iterators @ linux-x86_64 +test.test_unicode.UnicodeTest.test_iterators_invocation @ linux-x86_64 +test.test_unicode.UnicodeTest.test_join @ linux-x86_64 +test.test_unicode.UnicodeTest.test_literals @ linux-x86_64 +test.test_unicode.UnicodeTest.test_ljust @ linux-x86_64 +test.test_unicode.UnicodeTest.test_lower @ linux-x86_64 +test.test_unicode.UnicodeTest.test_maketrans_translate @ linux-x86_64 +test.test_unicode.UnicodeTest.test_mul @ linux-x86_64 +test.test_unicode.UnicodeTest.test_none_arguments @ linux-x86_64 +test.test_unicode.UnicodeTest.test_partition @ linux-x86_64 +test.test_unicode.UnicodeTest.test_pickle_iterator @ linux-x86_64 +test.test_unicode.UnicodeTest.test_removeprefix @ linux-x86_64 +test.test_unicode.UnicodeTest.test_removesuffix @ linux-x86_64 +test.test_unicode.UnicodeTest.test_repeat_id_preserving @ linux-x86_64 +test.test_unicode.UnicodeTest.test_replace @ linux-x86_64 +test.test_unicode.UnicodeTest.test_repr @ linux-x86_64 +test.test_unicode.UnicodeTest.test_rfind @ linux-x86_64 +test.test_unicode.UnicodeTest.test_rindex @ linux-x86_64 +test.test_unicode.UnicodeTest.test_rjust @ linux-x86_64 +test.test_unicode.UnicodeTest.test_rpartition @ linux-x86_64 +test.test_unicode.UnicodeTest.test_rsplit @ linux-x86_64 +test.test_unicode.UnicodeTest.test_slice @ linux-x86_64 +test.test_unicode.UnicodeTest.test_split @ linux-x86_64 +test.test_unicode.UnicodeTest.test_splitlines @ linux-x86_64 +test.test_unicode.UnicodeTest.test_startswith @ linux-x86_64 +test.test_unicode.UnicodeTest.test_startswith_endswith_errors @ linux-x86_64 +test.test_unicode.UnicodeTest.test_strip @ linux-x86_64 +test.test_unicode.UnicodeTest.test_strip_whitespace @ linux-x86_64 +test.test_unicode.UnicodeTest.test_subclass_add @ linux-x86_64 +test.test_unicode.UnicodeTest.test_subscript @ linux-x86_64 +test.test_unicode.UnicodeTest.test_surrogates @ linux-x86_64 +test.test_unicode.UnicodeTest.test_swapcase @ linux-x86_64 +test.test_unicode.UnicodeTest.test_title @ linux-x86_64 +test.test_unicode.UnicodeTest.test_ucs4 @ linux-x86_64 +test.test_unicode.UnicodeTest.test_unexpected_end_of_data @ linux-x86_64 +test.test_unicode.UnicodeTest.test_unicode_repr @ linux-x86_64 +test.test_unicode.UnicodeTest.test_upper @ linux-x86_64 +test.test_unicode.UnicodeTest.test_utf8_decode_invalid_sequences @ linux-x86_64 +test.test_unicode.UnicodeTest.test_utf8_decode_valid_sequences @ linux-x86_64 +test.test_unicode.UnicodeTest.test_zfill @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unicode_file_functions.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unicode_file_functions.txt new file mode 100644 index 0000000000..9054e05080 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unicode_file_functions.txt @@ -0,0 +1,30 @@ +test.test_unicode_file_functions.UnicodeFileTests.test_directory @ linux-x86_64 +test.test_unicode_file_functions.UnicodeFileTests.test_failures @ linux-x86_64 +test.test_unicode_file_functions.UnicodeFileTests.test_listdir @ linux-x86_64 +test.test_unicode_file_functions.UnicodeFileTests.test_normalize @ linux-x86_64 +test.test_unicode_file_functions.UnicodeFileTests.test_open @ linux-x86_64 +test.test_unicode_file_functions.UnicodeFileTests.test_rename @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFCFileTests.test_directory @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFCFileTests.test_failures @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFCFileTests.test_listdir @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFCFileTests.test_normalize @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFCFileTests.test_open @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFCFileTests.test_rename @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFDFileTests.test_directory @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFDFileTests.test_failures @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFDFileTests.test_listdir @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFDFileTests.test_normalize @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFDFileTests.test_open @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFDFileTests.test_rename @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFKCFileTests.test_directory @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFKCFileTests.test_failures @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFKCFileTests.test_listdir @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFKCFileTests.test_normalize @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFKCFileTests.test_open @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFKCFileTests.test_rename @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFKDFileTests.test_directory @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFKDFileTests.test_failures @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFKDFileTests.test_listdir @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFKDFileTests.test_normalize @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFKDFileTests.test_open @ linux-x86_64 +test.test_unicode_file_functions.UnicodeNFKDFileTests.test_rename @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unicodedata.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unicodedata.txt new file mode 100644 index 0000000000..80b5d020d5 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unicodedata.txt @@ -0,0 +1,21 @@ +test.test_unicodedata.NormalizationTest.test_bug_834676 @ linux-x86_64 +test.test_unicodedata.NormalizationTest.test_edge_cases @ linux-x86_64 +test.test_unicodedata.NormalizationTest.test_normalization @ linux-x86_64 +test.test_unicodedata.UnicodeFunctionsTest.test_category @ linux-x86_64 +test.test_unicodedata.UnicodeFunctionsTest.test_combining @ linux-x86_64 +test.test_unicodedata.UnicodeFunctionsTest.test_decimal @ linux-x86_64 +test.test_unicodedata.UnicodeFunctionsTest.test_decomposition @ linux-x86_64 +test.test_unicodedata.UnicodeFunctionsTest.test_digit @ linux-x86_64 +test.test_unicodedata.UnicodeFunctionsTest.test_east_asian_width @ linux-x86_64 +test.test_unicodedata.UnicodeFunctionsTest.test_east_asian_width_9_0_changes @ linux-x86_64 +test.test_unicodedata.UnicodeFunctionsTest.test_issue10254 @ linux-x86_64 +test.test_unicodedata.UnicodeFunctionsTest.test_issue29456 @ linux-x86_64 +test.test_unicodedata.UnicodeFunctionsTest.test_mirrored @ linux-x86_64 +test.test_unicodedata.UnicodeFunctionsTest.test_numeric @ linux-x86_64 +test.test_unicodedata.UnicodeFunctionsTest.test_pr29 @ linux-x86_64 +test.test_unicodedata.UnicodeMiscTest.test_bug_1704793 @ linux-x86_64 +test.test_unicodedata.UnicodeMiscTest.test_bug_4971 @ linux-x86_64 +test.test_unicodedata.UnicodeMiscTest.test_bug_5828 @ linux-x86_64 +test.test_unicodedata.UnicodeMiscTest.test_decimal_numeric_consistent @ linux-x86_64 +test.test_unicodedata.UnicodeMiscTest.test_digit_numeric_consistent @ linux-x86_64 +test.test_unicodedata.UnicodeMiscTest.test_ucd_510 @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unittest.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unittest.txt new file mode 100644 index 0000000000..4f945bbf80 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unittest.txt @@ -0,0 +1,457 @@ +unittest.test.test_assertions.TestLongMessage.testAlmostEqual @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertDictContainsSubset @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertDictEqual @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertFalse @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertGreater @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertGreaterEqual @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertIn @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertIs @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertIsNone @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertIsNot @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertIsNotNone @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertLess @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertLessEqual @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertMultiLineEqual @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertNotIn @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertNotRegex @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertRaises @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertRaisesRegex @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertRegex @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertSequenceEqual @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertSetEqual @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertTrue @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertWarns @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testAssertWarnsRegex @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testDefault @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testNotAlmostEqual @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.testNotEqual @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.test_baseAssertEqual @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.test_formatMessage_unicode_error @ linux-x86_64 +unittest.test.test_assertions.TestLongMessage.test_formatMsg @ linux-x86_64 +unittest.test.test_assertions.Test_Assertions.testAssertNotRegex @ linux-x86_64 +unittest.test.test_assertions.Test_Assertions.test_AlmostEqual @ linux-x86_64 +unittest.test.test_assertions.Test_Assertions.test_AmostEqualWithDelta @ linux-x86_64 +unittest.test.test_assertions.Test_Assertions.test_assertRaises @ linux-x86_64 +!unittest.test.test_assertions.Test_Assertions.test_assertRaises_frames_survival @ linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_base_exception_from_async_method @ linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_cleanups_interleave_order @ linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_exception_in_setup @ linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_exception_in_tear_clean_up @ linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_exception_in_tear_down @ linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_exception_in_test @ linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_full_cycle @ linux-x86_64 +unittest.test.test_async_case.TestAsyncCase.test_setup_get_event_loop @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAddTypeEqualityFunc @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertCountEqual @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertDictContainsSubset @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertDictEqualTruncates @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertEqual @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertEqualSingleLine @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertEqual_diffThreshold @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertEqual_shorten @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertIn @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertIs @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertIsInstance @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertIsNone @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertIsNot @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertLogsDefaults @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertLogsFailureLevelTooHigh @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertLogsFailureLevelTooHigh_FilterInRootLogger @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertLogsFailureMismatchingLogger @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertLogsFailureNoLogs @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertLogsPerLevel @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertLogsPerLogger @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertLogsTwoMatchingMessages @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertLogsUnexpectedException @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertMultiLineEqual @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertMultiLineEqualTruncates @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertNoLogsDefault @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertNoLogsFailureFoundLogs @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertNoLogsFailurePerLevel @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertNoLogsFailurePerLogger @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertNoLogsPerLevel @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertNoLogsPerLogger @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertNoLogsUnexpectedException @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertNoLogsYieldsNone @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertNotIsInstance @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertNotRaisesRegex @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertRaisesCallable @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertRaisesContext @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertRaisesExcValue @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertRaisesNoExceptionType @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertRaisesRefcount @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertRaisesRegex @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertRaisesRegexInvalidRegex @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertRaisesRegexMismatch @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertRaisesRegexNoExceptionType @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertRegex @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertSequenceEqualMaxDiff @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertSetEqual @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertWarnsCallable @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertWarnsContext @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertWarnsModifySysModules @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertWarnsNoExceptionType @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertWarnsRegexCallable @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertWarnsRegexContext @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertWarnsRegexInvalidRegex @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testAssertWarnsRegexNoExceptionType @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testDeepcopy @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testDeprecatedMethodNames @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testEquality @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testEqualityBytesWarning @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testInequality @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testKeyboardInterrupt @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testPickle @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testShortDescriptionWhitespaceTrimming @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testShortDescriptionWithMultiLineDocstring @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testShortDescriptionWithOneLineDocstring @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testShortDescriptionWithoutDocstring @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testSkippingEverywhere @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testSystemExit @ linux-x86_64 +unittest.test.test_case.Test_TestCase.testTruncateMessage @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_call__invoking_an_instance_delegates_to_run @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_countTestCases @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_defaultTestResult @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_deprecation_of_return_val_from_test @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_eq @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_failureException__default @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_failureException__subclassing__explicit_raise @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_failureException__subclassing__implicit_raise @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_hash @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_id @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_init__no_test_name @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_init__test_name__invalid @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_init__test_name__valid @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_ne @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_run__returns_given_result @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_run__uses_defaultTestResult @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_run_call_order__error_in_setUp @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_run_call_order__error_in_setUp_default_result @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_run_call_order__error_in_tearDown @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_run_call_order__error_in_tearDown_default_result @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_run_call_order__error_in_test @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_run_call_order__error_in_test_default_result @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_run_call_order__failure_in_test @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_run_call_order__failure_in_test_default_result @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_run_call_order__subtests @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_run_call_order__subtests_failfast @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_run_call_order__subtests_legacy @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_run_call_order__subtests_success @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_run_call_order__subtests_success_legacy @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_run_call_order_default_result @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_setUp @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_subtests_debug @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_subtests_failfast @ linux-x86_64 +unittest.test.test_case.Test_TestCase.test_tearDown @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_command_line_handling_discover_by_default @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_command_line_handling_discover_by_default_with_options @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_command_line_handling_do_discovery_calls_loader @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_command_line_handling_do_discovery_too_many_arguments @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_command_line_handling_do_discovery_uses_default_loader @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_command_line_handling_parseArgs @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_detect_module_clash @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_discover @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_discover_start_dir_is_package_calls_package_load_tests @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_discover_with_init_module_that_raises_SkipTest_on_import @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_discover_with_init_modules_that_fail_to_import @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_discover_with_module_that_raises_SkipTest_on_import @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_discover_with_modules_that_fail_to_import @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_discovery_failed_discovery @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_discovery_from_dotted_path @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_discovery_from_dotted_path_builtin_modules @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_find_tests @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_find_tests_customize_via_package_pattern @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_find_tests_default_calls_package_load_tests @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_find_tests_socket @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_find_tests_with_package @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_get_name_from_path @ linux-x86_64 +unittest.test.test_discovery.TestDiscovery.test_module_symlink_ok @ linux-x86_64 +unittest.test.test_functiontestcase.Test_FunctionTestCase.test_countTestCases @ linux-x86_64 +unittest.test.test_functiontestcase.Test_FunctionTestCase.test_id @ linux-x86_64 +unittest.test.test_functiontestcase.Test_FunctionTestCase.test_run_call_order__error_in_setUp @ linux-x86_64 +unittest.test.test_functiontestcase.Test_FunctionTestCase.test_run_call_order__error_in_tearDown @ linux-x86_64 +unittest.test.test_functiontestcase.Test_FunctionTestCase.test_run_call_order__error_in_test @ linux-x86_64 +unittest.test.test_functiontestcase.Test_FunctionTestCase.test_run_call_order__failure_in_test @ linux-x86_64 +unittest.test.test_functiontestcase.Test_FunctionTestCase.test_shortDescription__no_docstring @ linux-x86_64 +unittest.test.test_functiontestcase.Test_FunctionTestCase.test_shortDescription__singleline_docstring @ linux-x86_64 +unittest.test.test_loader.TestObsoleteFunctions.test_findTestCases @ linux-x86_64 +unittest.test.test_loader.TestObsoleteFunctions.test_getTestCaseNames @ linux-x86_64 +unittest.test.test_loader.TestObsoleteFunctions.test_makeSuite @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test___init__ @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_getTestCaseNames @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_getTestCaseNames__inheritance @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_getTestCaseNames__no_tests @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_getTestCaseNames__not_a_TestCase @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_getTestCaseNames__testNamePatterns @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_getTestCaseNames__testNamePatterns__attribute_access_regression @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__TestCase_subclass @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__TestCase_subclass_internals @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__faulty_load_tests @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__load_tests @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__no_TestCase_instances @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__no_TestCase_tests @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__not_a_module @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__pattern @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__too_many_positional_args @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__use_load_tests_deprecated_keyword @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__use_load_tests_deprecated_positional @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromModule__use_load_tests_other_bad_keyword @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__callable__TestCase_instance @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__callable__TestCase_instance_ProperSuiteClass @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__callable__TestSuite @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__callable__wrong_type @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__empty_name @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__function_with_different_name_than_method @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__malformed_name @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__module_not_loaded @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_TestCase_subclass @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_TestSuite @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_bad_object @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_empty_name @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_malformed_name @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_not_a_module @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_testmethod @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_testmethod_ProperSuiteClass @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__relative_unknown_name @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__unknown_attr_name_on_module @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__unknown_attr_name_on_package @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromName__unknown_module_name @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__callable__TestCase_instance @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__callable__TestSuite @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__callable__call_staticmethod @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__callable__wrong_type @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__empty_name @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__empty_name_list @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__malformed_name @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__module_not_loaded @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_TestCase_subclass @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_TestSuite @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_bad_object @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_empty_name @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_empty_name_list @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_malformed_name @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_not_a_module @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__relative_testmethod @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__unknown_attr_name @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__unknown_module_name @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__unknown_name_relative_1 @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromNames__unknown_name_relative_2 @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromTestCase @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromTestCase__TestSuite_subclass @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromTestCase__default_method_name @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromTestCase__from_FunctionTestCase @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromTestCase__from_TestCase @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_loadTestsFromTestCase__no_matches @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_partial_functions @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__None @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__default_value @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__getTestCaseNames @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__loadTestsFromModule @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__loadTestsFromName @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__loadTestsFromNames @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_sortTestMethodsUsing__loadTestsFromTestCase @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_suiteClass__default_value @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_suiteClass__loadTestsFromModule @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_suiteClass__loadTestsFromName @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_suiteClass__loadTestsFromNames @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_suiteClass__loadTestsFromTestCase @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_testMethodPrefix__default_value @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_testMethodPrefix__loadTestsFromModule @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_testMethodPrefix__loadTestsFromName @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_testMethodPrefix__loadTestsFromNames @ linux-x86_64 +unittest.test.test_loader.Test_TestLoader.test_testMethodPrefix__loadTestsFromTestCase @ linux-x86_64 +unittest.test.test_program.TestCommandLineArgs.testBufferCatchFailfast @ linux-x86_64 +unittest.test.test_program.TestCommandLineArgs.testCatchBreakInstallsHandler @ linux-x86_64 +unittest.test.test_program.TestCommandLineArgs.testParseArgsAbsolutePathsThatCanBeConverted @ linux-x86_64 +unittest.test.test_program.TestCommandLineArgs.testParseArgsAbsolutePathsThatCannotBeConverted @ linux-x86_64 +unittest.test.test_program.TestCommandLineArgs.testParseArgsFileNames @ linux-x86_64 +unittest.test.test_program.TestCommandLineArgs.testParseArgsFilePaths @ linux-x86_64 +unittest.test.test_program.TestCommandLineArgs.testParseArgsNonExistentFiles @ linux-x86_64 +unittest.test.test_program.TestCommandLineArgs.testParseArgsSelectedTestNames @ linux-x86_64 +unittest.test.test_program.TestCommandLineArgs.testRunTestsOldRunnerClass @ linux-x86_64 +unittest.test.test_program.TestCommandLineArgs.testRunTestsRunnerClass @ linux-x86_64 +unittest.test.test_program.TestCommandLineArgs.testRunTestsRunnerInstance @ linux-x86_64 +unittest.test.test_program.TestCommandLineArgs.testSelectedTestNamesFunctionalTest @ linux-x86_64 +unittest.test.test_program.TestCommandLineArgs.testVerbosity @ linux-x86_64 +unittest.test.test_program.TestCommandLineArgs.testWarning @ linux-x86_64 +unittest.test.test_program.TestCommandLineArgs.test_locals @ linux-x86_64 +unittest.test.test_program.Test_TestProgram.testNoExit @ linux-x86_64 +unittest.test.test_program.Test_TestProgram.test_Exit @ linux-x86_64 +unittest.test.test_program.Test_TestProgram.test_ExitAsDefault @ linux-x86_64 +unittest.test.test_program.Test_TestProgram.test_NonExit @ linux-x86_64 +unittest.test.test_program.Test_TestProgram.test_defaultTest_with_iterable @ linux-x86_64 +unittest.test.test_program.Test_TestProgram.test_defaultTest_with_string @ linux-x86_64 +unittest.test.test_program.Test_TestProgram.test_discovery_from_dotted_path @ linux-x86_64 +unittest.test.test_result.TestOutputBuffering.testBufferDoClassCleanups @ linux-x86_64 +unittest.test.test_result.TestOutputBuffering.testBufferDoCleanups @ linux-x86_64 +unittest.test.test_result.TestOutputBuffering.testBufferDoModuleCleanups @ linux-x86_64 +unittest.test.test_result.TestOutputBuffering.testBufferOutputAddErrorOrFailure @ linux-x86_64 +unittest.test.test_result.TestOutputBuffering.testBufferOutputOff @ linux-x86_64 +unittest.test.test_result.TestOutputBuffering.testBufferOutputStartTestAddSuccess @ linux-x86_64 +unittest.test.test_result.TestOutputBuffering.testBufferSetUp @ linux-x86_64 +unittest.test.test_result.TestOutputBuffering.testBufferSetUpModule @ linux-x86_64 +unittest.test.test_result.TestOutputBuffering.testBufferSetUpModule_DoModuleCleanups @ linux-x86_64 +unittest.test.test_result.TestOutputBuffering.testBufferSetUp_DoCleanups @ linux-x86_64 +unittest.test.test_result.TestOutputBuffering.testBufferSetupClass @ linux-x86_64 +unittest.test.test_result.TestOutputBuffering.testBufferSetupClass_DoClassCleanups @ linux-x86_64 +unittest.test.test_result.TestOutputBuffering.testBufferTearDown @ linux-x86_64 +unittest.test.test_result.TestOutputBuffering.testBufferTearDownClass @ linux-x86_64 +unittest.test.test_result.TestOutputBuffering.testBufferTearDownClass_DoClassCleanups @ linux-x86_64 +unittest.test.test_result.TestOutputBuffering.testBufferTearDownModule @ linux-x86_64 +unittest.test.test_result.TestOutputBuffering.testBufferTearDownModule_DoModuleCleanups @ linux-x86_64 +unittest.test.test_result.TestOutputBuffering.testBufferTearDown_DoCleanups @ linux-x86_64 +unittest.test.test_result.Test_OldTestResult.testOldResultWithRunner @ linux-x86_64 +unittest.test.test_result.Test_OldTestResult.testOldTestResult @ linux-x86_64 +unittest.test.test_result.Test_OldTestResult.testOldTestResultClass @ linux-x86_64 +unittest.test.test_result.Test_OldTestResult.testOldTestTesultSetup @ linux-x86_64 +unittest.test.test_result.Test_TestResult.testFailFast @ linux-x86_64 +unittest.test.test_result.Test_TestResult.testFailFastSetByRunner @ linux-x86_64 +unittest.test.test_result.Test_TestResult.testStackFrameTrimming @ linux-x86_64 +unittest.test.test_result.Test_TestResult.test_addError @ linux-x86_64 +unittest.test.test_result.Test_TestResult.test_addError_locals @ linux-x86_64 +unittest.test.test_result.Test_TestResult.test_addFailure @ linux-x86_64 +unittest.test.test_result.Test_TestResult.test_addFailure_filter_traceback_frames @ linux-x86_64 +unittest.test.test_result.Test_TestResult.test_addFailure_filter_traceback_frames_chained_exception_cycle @ linux-x86_64 +unittest.test.test_result.Test_TestResult.test_addFailure_filter_traceback_frames_chained_exception_self_loop @ linux-x86_64 +unittest.test.test_result.Test_TestResult.test_addFailure_filter_traceback_frames_context @ linux-x86_64 +unittest.test.test_result.Test_TestResult.test_addSubTest @ linux-x86_64 +unittest.test.test_result.Test_TestResult.test_addSuccess @ linux-x86_64 +unittest.test.test_result.Test_TestResult.test_init @ linux-x86_64 +unittest.test.test_result.Test_TestResult.test_startTest @ linux-x86_64 +unittest.test.test_result.Test_TestResult.test_startTestRun_stopTestRun @ linux-x86_64 +unittest.test.test_result.Test_TestResult.test_stop @ linux-x86_64 +unittest.test.test_result.Test_TestResult.test_stopTest @ linux-x86_64 +unittest.test.test_result.Test_TextTestResult.testDotsOutput @ linux-x86_64 +unittest.test.test_result.Test_TextTestResult.testDotsOutputSubTestMixed @ linux-x86_64 +unittest.test.test_result.Test_TextTestResult.testDotsOutputSubTestSuccess @ linux-x86_64 +unittest.test.test_result.Test_TextTestResult.testDotsOutputTearDownFail @ linux-x86_64 +unittest.test.test_result.Test_TextTestResult.testGetDescriptionWithMultiLineDocstring @ linux-x86_64 +unittest.test.test_result.Test_TextTestResult.testGetDescriptionWithOneLineDocstring @ linux-x86_64 +unittest.test.test_result.Test_TextTestResult.testGetDescriptionWithoutDocstring @ linux-x86_64 +unittest.test.test_result.Test_TextTestResult.testGetDuplicatedNestedSubTestDescriptionWithoutDocstring @ linux-x86_64 +unittest.test.test_result.Test_TextTestResult.testGetNestedSubTestDescriptionWithoutDocstring @ linux-x86_64 +unittest.test.test_result.Test_TextTestResult.testGetSubTestDescriptionForFalsyValues @ linux-x86_64 +unittest.test.test_result.Test_TextTestResult.testGetSubTestDescriptionWithMultiLineDocstring @ linux-x86_64 +unittest.test.test_result.Test_TextTestResult.testGetSubTestDescriptionWithOneLineDocstring @ linux-x86_64 +unittest.test.test_result.Test_TextTestResult.testGetSubTestDescriptionWithoutDocstring @ linux-x86_64 +unittest.test.test_result.Test_TextTestResult.testGetSubTestDescriptionWithoutDocstringAndParams @ linux-x86_64 +unittest.test.test_result.Test_TextTestResult.testLongOutput @ linux-x86_64 +unittest.test.test_result.Test_TextTestResult.testLongOutputSubTestMixed @ linux-x86_64 +unittest.test.test_result.Test_TextTestResult.testLongOutputSubTestSuccess @ linux-x86_64 +unittest.test.test_result.Test_TextTestResult.testLongOutputTearDownFail @ linux-x86_64 +unittest.test.test_runner.TestClassCleanup.test_addClassCleanUp @ linux-x86_64 +unittest.test.test_runner.TestClassCleanup.test_debug_executes_classCleanUp @ linux-x86_64 +unittest.test.test_runner.TestClassCleanup.test_debug_executes_classCleanUp_when_teardown_exception @ linux-x86_64 +unittest.test.test_runner.TestClassCleanup.test_doClassCleanups_with_errors_addClassCleanUp @ linux-x86_64 +unittest.test.test_runner.TestClassCleanup.test_enterClassContext @ linux-x86_64 +unittest.test.test_runner.TestClassCleanup.test_enterClassContext_arg_errors @ linux-x86_64 +unittest.test.test_runner.TestClassCleanup.test_run_class_cleanUp @ linux-x86_64 +unittest.test.test_runner.TestClassCleanup.test_run_class_cleanUp_without_tearDownClass @ linux-x86_64 +unittest.test.test_runner.TestClassCleanup.test_run_nested_test @ linux-x86_64 +unittest.test.test_runner.TestClassCleanup.test_run_with_errors_addClassCleanUp @ linux-x86_64 +unittest.test.test_runner.TestClassCleanup.test_with_errors_addCleanUp @ linux-x86_64 +unittest.test.test_runner.TestClassCleanup.test_with_errors_in_addClassCleanup_and_setUps @ linux-x86_64 +unittest.test.test_runner.TestClassCleanup.test_with_errors_in_tearDownClass @ linux-x86_64 +unittest.test.test_runner.TestCleanUp.testCleanUp @ linux-x86_64 +unittest.test.test_runner.TestCleanUp.testCleanUpWithErrors @ linux-x86_64 +unittest.test.test_runner.TestCleanUp.testCleanupInRun @ linux-x86_64 +unittest.test.test_runner.TestCleanUp.testTestCaseDebugExecutesCleanups @ linux-x86_64 +unittest.test.test_runner.TestCleanUp.test_enterContext @ linux-x86_64 +unittest.test.test_runner.TestCleanUp.test_enterContext_arg_errors @ linux-x86_64 +unittest.test.test_runner.TestModuleCleanUp.test_addClassCleanup_arg_errors @ linux-x86_64 +unittest.test.test_runner.TestModuleCleanUp.test_addCleanup_arg_errors @ linux-x86_64 +unittest.test.test_runner.TestModuleCleanUp.test_addModuleCleanup_arg_errors @ linux-x86_64 +unittest.test.test_runner.TestModuleCleanUp.test_add_and_do_ModuleCleanup @ linux-x86_64 +unittest.test.test_runner.TestModuleCleanUp.test_debug_module_cleanUp_when_teardown_exception @ linux-x86_64 +unittest.test.test_runner.TestModuleCleanUp.test_debug_module_executes_cleanUp @ linux-x86_64 +unittest.test.test_runner.TestModuleCleanUp.test_doModuleCleanup_with_errors_in_addModuleCleanup @ linux-x86_64 +unittest.test.test_runner.TestModuleCleanUp.test_enterModuleContext @ linux-x86_64 +unittest.test.test_runner.TestModuleCleanUp.test_enterModuleContext_arg_errors @ linux-x86_64 +unittest.test.test_runner.TestModuleCleanUp.test_module_cleanUp_with_multiple_classes @ linux-x86_64 +unittest.test.test_runner.TestModuleCleanUp.test_run_module_cleanUp @ linux-x86_64 +unittest.test.test_runner.TestModuleCleanUp.test_run_module_cleanUp_when_teardown_exception @ linux-x86_64 +unittest.test.test_runner.TestModuleCleanUp.test_run_module_cleanUp_without_teardown @ linux-x86_64 +unittest.test.test_runner.TestModuleCleanUp.test_run_multiple_module_cleanUp @ linux-x86_64 +unittest.test.test_runner.TestModuleCleanUp.test_with_errors_in_addClassCleanup @ linux-x86_64 +unittest.test.test_runner.TestModuleCleanUp.test_with_errors_in_addCleanup @ linux-x86_64 +unittest.test.test_runner.TestModuleCleanUp.test_with_errors_in_addModuleCleanup_and_setUps @ linux-x86_64 +unittest.test.test_runner.Test_TextTestRunner.testBufferAndFailfast @ linux-x86_64 +unittest.test.test_runner.Test_TextTestRunner.testRunnerRegistersResult @ linux-x86_64 +unittest.test.test_runner.Test_TextTestRunner.testSpecifiedStreamUsed @ linux-x86_64 +unittest.test.test_runner.Test_TextTestRunner.testStdErrLookedUpAtInstantiationTime @ linux-x86_64 +unittest.test.test_runner.Test_TextTestRunner.test_init @ linux-x86_64 +unittest.test.test_runner.Test_TextTestRunner.test_locals @ linux-x86_64 +unittest.test.test_runner.Test_TextTestRunner.test_multiple_inheritance @ linux-x86_64 +unittest.test.test_runner.Test_TextTestRunner.test_pickle_unpickle @ linux-x86_64 +unittest.test.test_runner.Test_TextTestRunner.test_resultclass @ linux-x86_64 +unittest.test.test_runner.Test_TextTestRunner.test_startTestRun_stopTestRun_called @ linux-x86_64 +unittest.test.test_runner.Test_TextTestRunner.test_warnings @ linux-x86_64 +unittest.test.test_runner.Test_TextTestRunner.test_works_with_result_without_startTestRun_stopTestRun @ linux-x86_64 +unittest.test.test_setups.TestSetups.test_class_not_setup_or_torndown_when_skipped @ linux-x86_64 +unittest.test.test_setups.TestSetups.test_class_not_torndown_when_setup_fails @ linux-x86_64 +unittest.test.test_setups.TestSetups.test_error_in_setup_module @ linux-x86_64 +unittest.test.test_setups.TestSetups.test_error_in_setupclass @ linux-x86_64 +unittest.test.test_setups.TestSetups.test_error_in_teardown_class @ linux-x86_64 +unittest.test.test_setups.TestSetups.test_error_in_teardown_module @ linux-x86_64 +unittest.test.test_setups.TestSetups.test_setup_class @ linux-x86_64 +unittest.test.test_setups.TestSetups.test_setup_module @ linux-x86_64 +unittest.test.test_setups.TestSetups.test_setup_teardown_order_with_pathological_suite @ linux-x86_64 +unittest.test.test_setups.TestSetups.test_skiptest_in_setupclass @ linux-x86_64 +unittest.test.test_setups.TestSetups.test_skiptest_in_setupmodule @ linux-x86_64 +unittest.test.test_setups.TestSetups.test_suite_debug_executes_setups_and_teardowns @ linux-x86_64 +unittest.test.test_setups.TestSetups.test_suite_debug_propagates_exceptions @ linux-x86_64 +unittest.test.test_setups.TestSetups.test_teardown_class @ linux-x86_64 +unittest.test.test_setups.TestSetups.test_teardown_class_two_classes @ linux-x86_64 +unittest.test.test_setups.TestSetups.test_teardown_module @ linux-x86_64 +unittest.test.test_setups.TestSetups.test_testcase_with_missing_module @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_debug_skipping @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_debug_skipping_class @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_debug_skipping_subtests @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_decorated_skip @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_expected_failure @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_expected_failure_and_fail_in_cleanup @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_expected_failure_and_skip_in_cleanup @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_expected_failure_subtests @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_expected_failure_with_wrapped_class @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_expected_failure_with_wrapped_subclass @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_failure_and_skip_in_cleanup @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_skip_class @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_skip_doesnt_run_setup @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_skip_in_cleanup @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_skip_in_setup @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_skip_non_unittest_class @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_skip_without_reason @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_skipping @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_skipping_and_fail_in_cleanup @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_skipping_decorators @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_skipping_subtests @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_unexpected_success @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_unexpected_success_and_fail_in_cleanup @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_unexpected_success_and_skip_in_cleanup @ linux-x86_64 +unittest.test.test_skipping.Test_TestSkipping.test_unexpected_success_subtests @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_addTest__TestCase @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_addTest__TestSuite @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_addTest__casesuiteclass @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_addTest__noncallable @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_addTest__noniterable @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_addTests @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_addTests__string @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_basetestsuite @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_countTestCases_nested @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_countTestCases_simple @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_countTestCases_zero_nested @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_countTestCases_zero_simple @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_eq @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_function_in_suite @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_init__TestSuite_instances_in_tests @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_init__empty_tests @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_init__tests_from_any_iterable @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_init__tests_optional @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_iter @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_ne @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_overriding_call @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_remove_test_at_index @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_remove_test_at_index_not_indexable @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_run @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_run__empty_suite @ linux-x86_64 +unittest.test.test_suite.Test_TestSuite.test_run__requires_result @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_univnewlines.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_univnewlines.txt new file mode 100644 index 0000000000..bc9f469ab4 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_univnewlines.txt @@ -0,0 +1,34 @@ +test.test_univnewlines.CTestCRLFNewlines.test_read @ linux-x86_64 +test.test_univnewlines.CTestCRLFNewlines.test_readline @ linux-x86_64 +test.test_univnewlines.CTestCRLFNewlines.test_readlines @ linux-x86_64 +test.test_univnewlines.CTestCRLFNewlines.test_seek @ linux-x86_64 +test.test_univnewlines.CTestCRLFNewlines.test_tell @ linux-x86_64 +test.test_univnewlines.CTestCRNewlines.test_read @ linux-x86_64 +test.test_univnewlines.CTestCRNewlines.test_readline @ linux-x86_64 +test.test_univnewlines.CTestCRNewlines.test_readlines @ linux-x86_64 +test.test_univnewlines.CTestCRNewlines.test_seek @ linux-x86_64 +test.test_univnewlines.CTestLFNewlines.test_read @ linux-x86_64 +test.test_univnewlines.CTestLFNewlines.test_readline @ linux-x86_64 +test.test_univnewlines.CTestLFNewlines.test_readlines @ linux-x86_64 +test.test_univnewlines.CTestLFNewlines.test_seek @ linux-x86_64 +test.test_univnewlines.CTestMixedNewlines.test_read @ linux-x86_64 +test.test_univnewlines.CTestMixedNewlines.test_readline @ linux-x86_64 +test.test_univnewlines.CTestMixedNewlines.test_readlines @ linux-x86_64 +test.test_univnewlines.CTestMixedNewlines.test_seek @ linux-x86_64 +test.test_univnewlines.PyTestCRLFNewlines.test_read @ linux-x86_64 +test.test_univnewlines.PyTestCRLFNewlines.test_readline @ linux-x86_64 +test.test_univnewlines.PyTestCRLFNewlines.test_readlines @ linux-x86_64 +test.test_univnewlines.PyTestCRLFNewlines.test_seek @ linux-x86_64 +test.test_univnewlines.PyTestCRLFNewlines.test_tell @ linux-x86_64 +test.test_univnewlines.PyTestCRNewlines.test_read @ linux-x86_64 +test.test_univnewlines.PyTestCRNewlines.test_readline @ linux-x86_64 +test.test_univnewlines.PyTestCRNewlines.test_readlines @ linux-x86_64 +test.test_univnewlines.PyTestCRNewlines.test_seek @ linux-x86_64 +test.test_univnewlines.PyTestLFNewlines.test_read @ linux-x86_64 +test.test_univnewlines.PyTestLFNewlines.test_readline @ linux-x86_64 +test.test_univnewlines.PyTestLFNewlines.test_readlines @ linux-x86_64 +test.test_univnewlines.PyTestLFNewlines.test_seek @ linux-x86_64 +test.test_univnewlines.PyTestMixedNewlines.test_read @ linux-x86_64 +test.test_univnewlines.PyTestMixedNewlines.test_readline @ linux-x86_64 +test.test_univnewlines.PyTestMixedNewlines.test_readlines @ linux-x86_64 +test.test_univnewlines.PyTestMixedNewlines.test_seek @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unpack.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unpack.txt new file mode 100644 index 0000000000..9c5a305397 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unpack.txt @@ -0,0 +1,2 @@ +DocTestCase.test.test_unpack.__test__.doctests @ linux-x86_64 +test.test_unpack.TestCornerCases.test_extended_oparg_not_ignored @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unparse.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unparse.txt new file mode 100644 index 0000000000..56c60efd09 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_unparse.txt @@ -0,0 +1,57 @@ +test.test_unparse.CosmeticTestCase.test_class_bases_and_keywords @ linux-x86_64 +test.test_unparse.CosmeticTestCase.test_docstrings @ linux-x86_64 +test.test_unparse.CosmeticTestCase.test_docstrings_negative_cases @ linux-x86_64 +test.test_unparse.CosmeticTestCase.test_fstrings @ linux-x86_64 +test.test_unparse.CosmeticTestCase.test_lambda_parameters @ linux-x86_64 +test.test_unparse.CosmeticTestCase.test_multiquote_joined_string @ linux-x86_64 +test.test_unparse.CosmeticTestCase.test_simple_expressions_parens @ linux-x86_64 +test.test_unparse.CosmeticTestCase.test_slices @ linux-x86_64 +test.test_unparse.CosmeticTestCase.test_star_expr_assign_target @ linux-x86_64 +test.test_unparse.CosmeticTestCase.test_star_expr_assign_target_multiple @ linux-x86_64 +test.test_unparse.CosmeticTestCase.test_unary_op_factor @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_annotations @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_bytes @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_chained_comparisons @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_class_decorators @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_class_definition @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_del_statement @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_dict_comprehension @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_dict_unpacking_in_dict @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_docstrings @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_elifs @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_empty_set @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_for_else @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_fstrings @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_fstrings_complicated @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_fstrings_special_chars @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_function_arguments @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_function_type @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_huge_float @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_imaginary_literals @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_import_from_level_none @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_integer_parens @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_invalid_fstring_backslash @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_invalid_fstring_value @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_invalid_raise @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_invalid_yield_from @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_lambda_parentheses @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_min_int @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_nan @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_nonlocal @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_raise_from @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_relative_import @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_set_comprehension @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_set_literal @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_shifts @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_slices @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_starred_assignment @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_strings @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_try_except_finally @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_try_except_star_finally @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_type_comments @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_type_ignore @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_unary_parens @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_while_else @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_with_as @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_with_simple @ linux-x86_64 +test.test_unparse.UnparseTestCase.test_with_two_items @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urllib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urllib.txt new file mode 100644 index 0000000000..4cc01df8a8 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urllib.txt @@ -0,0 +1,101 @@ +test.test_urllib.PathName2URLTests.test_converting_drive_letter @ linux-x86_64 +test.test_urllib.PathName2URLTests.test_converting_when_no_drive_letter @ linux-x86_64 +test.test_urllib.PathName2URLTests.test_long_drive_letter @ linux-x86_64 +test.test_urllib.PathName2URLTests.test_roundtrip_pathname2url @ linux-x86_64 +test.test_urllib.PathName2URLTests.test_simple_compare @ linux-x86_64 +test.test_urllib.Pathname_Tests.test_basic @ linux-x86_64 +test.test_urllib.Pathname_Tests.test_quoting @ linux-x86_64 +test.test_urllib.ProxyTests.test_getproxies_environment_keep_no_proxies @ linux-x86_64 +test.test_urllib.ProxyTests.test_proxy_bypass_environment_always_match @ linux-x86_64 +test.test_urllib.ProxyTests.test_proxy_bypass_environment_host_match @ linux-x86_64 +test.test_urllib.ProxyTests.test_proxy_bypass_environment_newline @ linux-x86_64 +test.test_urllib.ProxyTests.test_proxy_cgi_ignore @ linux-x86_64 +test.test_urllib.ProxyTests_withOrderedEnv.test_getproxies_environment_prefer_lowercase @ linux-x86_64 +test.test_urllib.QuotingTests.test_default_quoting @ linux-x86_64 +test.test_urllib.QuotingTests.test_default_safe @ linux-x86_64 +test.test_urllib.QuotingTests.test_never_quote @ linux-x86_64 +test.test_urllib.QuotingTests.test_quote_bytes @ linux-x86_64 +test.test_urllib.QuotingTests.test_quote_plus_with_unicode @ linux-x86_64 +test.test_urllib.QuotingTests.test_quote_with_unicode @ linux-x86_64 +test.test_urllib.QuotingTests.test_quoting_plus @ linux-x86_64 +test.test_urllib.QuotingTests.test_quoting_space @ linux-x86_64 +test.test_urllib.QuotingTests.test_safe @ linux-x86_64 +test.test_urllib.RequestTests.test_default_values @ linux-x86_64 +test.test_urllib.RequestTests.test_with_method_arg @ linux-x86_64 +test.test_urllib.URL2PathNameTests.test_converting_drive_letter @ linux-x86_64 +test.test_urllib.URL2PathNameTests.test_converting_when_no_drive_letter @ linux-x86_64 +test.test_urllib.URL2PathNameTests.test_non_ascii_drive_letter @ linux-x86_64 +test.test_urllib.URL2PathNameTests.test_roundtrip_url2pathname @ linux-x86_64 +test.test_urllib.URL2PathNameTests.test_simple_compare @ linux-x86_64 +test.test_urllib.URLopener_Tests.test_local_file_open @ linux-x86_64 +test.test_urllib.URLopener_Tests.test_quoted_open @ linux-x86_64 +test.test_urllib.URLopener_Tests.test_urlopener_retrieve_file @ linux-x86_64 +test.test_urllib.URLopener_Tests.test_urlopener_retrieve_remote @ linux-x86_64 +test.test_urllib.UnquotingTests.test_unquote_to_bytes @ linux-x86_64 +test.test_urllib.UnquotingTests.test_unquote_with_unicode @ linux-x86_64 +test.test_urllib.UnquotingTests.test_unquoting @ linux-x86_64 +test.test_urllib.UnquotingTests.test_unquoting_badpercent @ linux-x86_64 +test.test_urllib.UnquotingTests.test_unquoting_mixed_case @ linux-x86_64 +test.test_urllib.UnquotingTests.test_unquoting_parts @ linux-x86_64 +test.test_urllib.UnquotingTests.test_unquoting_plus @ linux-x86_64 +test.test_urllib.UnquotingTests.test_unquoting_with_bytes_input @ linux-x86_64 +test.test_urllib.Utility_Tests.test_thishost @ linux-x86_64 +test.test_urllib.urlencode_Tests.test_doseq @ linux-x86_64 +test.test_urllib.urlencode_Tests.test_empty_sequence @ linux-x86_64 +test.test_urllib.urlencode_Tests.test_nonstring_seq_values @ linux-x86_64 +test.test_urllib.urlencode_Tests.test_nonstring_values @ linux-x86_64 +test.test_urllib.urlencode_Tests.test_quoting @ linux-x86_64 +test.test_urllib.urlencode_Tests.test_urlencode_bytes @ linux-x86_64 +test.test_urllib.urlencode_Tests.test_urlencode_encoding @ linux-x86_64 +test.test_urllib.urlencode_Tests.test_urlencode_encoding_doseq @ linux-x86_64 +test.test_urllib.urlencode_Tests.test_urlencode_encoding_safe_parameter @ linux-x86_64 +test.test_urllib.urlencode_Tests.test_using_mapping @ linux-x86_64 +test.test_urllib.urlencode_Tests.test_using_sequence @ linux-x86_64 +test.test_urllib.urlopen_DataTests.test_geturl @ linux-x86_64 +test.test_urllib.urlopen_DataTests.test_info @ linux-x86_64 +test.test_urllib.urlopen_DataTests.test_interface @ linux-x86_64 +test.test_urllib.urlopen_DataTests.test_invalid_base64_data @ linux-x86_64 +test.test_urllib.urlopen_DataTests.test_missing_comma @ linux-x86_64 +test.test_urllib.urlopen_DataTests.test_read_image @ linux-x86_64 +test.test_urllib.urlopen_DataTests.test_read_text @ linux-x86_64 +test.test_urllib.urlopen_DataTests.test_read_text_base64 @ linux-x86_64 +test.test_urllib.urlopen_FileTests.test_close @ linux-x86_64 +test.test_urllib.urlopen_FileTests.test_fileno @ linux-x86_64 +test.test_urllib.urlopen_FileTests.test_getcode @ linux-x86_64 +test.test_urllib.urlopen_FileTests.test_geturl @ linux-x86_64 +test.test_urllib.urlopen_FileTests.test_headers @ linux-x86_64 +test.test_urllib.urlopen_FileTests.test_info @ linux-x86_64 +test.test_urllib.urlopen_FileTests.test_interface @ linux-x86_64 +test.test_urllib.urlopen_FileTests.test_iter @ linux-x86_64 +test.test_urllib.urlopen_FileTests.test_read @ linux-x86_64 +test.test_urllib.urlopen_FileTests.test_readline @ linux-x86_64 +test.test_urllib.urlopen_FileTests.test_readlines @ linux-x86_64 +test.test_urllib.urlopen_FileTests.test_relativelocalfile @ linux-x86_64 +test.test_urllib.urlopen_FileTests.test_status @ linux-x86_64 +test.test_urllib.urlopen_FileTests.test_url @ linux-x86_64 +test.test_urllib.urlopen_HttpTests.test_URLopener_deprecation @ linux-x86_64 +test.test_urllib.urlopen_HttpTests.test_cafile_and_context @ linux-x86_64 +test.test_urllib.urlopen_HttpTests.test_empty_socket @ linux-x86_64 +test.test_urllib.urlopen_HttpTests.test_file_notexists @ linux-x86_64 +test.test_urllib.urlopen_HttpTests.test_ftp_cache_pruning @ linux-x86_64 +test.test_urllib.urlopen_HttpTests.test_invalid_redirect @ linux-x86_64 +test.test_urllib.urlopen_HttpTests.test_missing_localfile @ linux-x86_64 +test.test_urllib.urlopen_HttpTests.test_read_0_9 @ linux-x86_64 +test.test_urllib.urlopen_HttpTests.test_read_1_0 @ linux-x86_64 +test.test_urllib.urlopen_HttpTests.test_read_1_1 @ linux-x86_64 +test.test_urllib.urlopen_HttpTests.test_read_bogus @ linux-x86_64 +test.test_urllib.urlopen_HttpTests.test_redirect_limit_independent @ linux-x86_64 +test.test_urllib.urlopen_HttpTests.test_url_fragment @ linux-x86_64 +test.test_urllib.urlopen_HttpTests.test_url_path_with_control_char_rejected @ linux-x86_64 +test.test_urllib.urlopen_HttpTests.test_url_path_with_newline_header_injection_rejected @ linux-x86_64 +test.test_urllib.urlopen_HttpTests.test_userpass_inurl @ linux-x86_64 +test.test_urllib.urlopen_HttpTests.test_userpass_inurl_w_spaces @ linux-x86_64 +test.test_urllib.urlopen_HttpTests.test_willclose @ linux-x86_64 +test.test_urllib.urlretrieve_FileTests.test_basic @ linux-x86_64 +test.test_urllib.urlretrieve_FileTests.test_copy @ linux-x86_64 +test.test_urllib.urlretrieve_FileTests.test_reporthook @ linux-x86_64 +test.test_urllib.urlretrieve_FileTests.test_reporthook_0_bytes @ linux-x86_64 +test.test_urllib.urlretrieve_FileTests.test_reporthook_5_bytes @ linux-x86_64 +test.test_urllib.urlretrieve_FileTests.test_reporthook_8193_bytes @ linux-x86_64 +test.test_urllib.urlretrieve_HttpTests.test_short_content_raises_ContentTooShortError @ linux-x86_64 +test.test_urllib.urlretrieve_HttpTests.test_short_content_raises_ContentTooShortError_without_reporthook @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urllib2.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urllib2.txt new file mode 100644 index 0000000000..6588b112f7 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urllib2.txt @@ -0,0 +1,68 @@ +test.test_urllib2.HandlerTests.test_basic_and_digest_auth_handlers @ linux-x86_64 +test.test_urllib2.HandlerTests.test_basic_auth @ linux-x86_64 +test.test_urllib2.HandlerTests.test_basic_prior_auth_auto_send @ linux-x86_64 +test.test_urllib2.HandlerTests.test_basic_prior_auth_send_after_first_success @ linux-x86_64 +test.test_urllib2.HandlerTests.test_cookie_redirect @ linux-x86_64 +test.test_urllib2.HandlerTests.test_cookies @ linux-x86_64 +test.test_urllib2.HandlerTests.test_errors @ linux-x86_64 +test.test_urllib2.HandlerTests.test_file @ linux-x86_64 +test.test_urllib2.HandlerTests.test_fixpath_in_weirdurls @ linux-x86_64 +test.test_urllib2.HandlerTests.test_ftp @ linux-x86_64 +test.test_urllib2.HandlerTests.test_full_url_deleter @ linux-x86_64 +test.test_urllib2.HandlerTests.test_full_url_setter @ linux-x86_64 +test.test_urllib2.HandlerTests.test_http @ linux-x86_64 +test.test_urllib2.HandlerTests.test_http_body_array @ linux-x86_64 +test.test_urllib2.HandlerTests.test_http_body_empty_seq @ linux-x86_64 +test.test_urllib2.HandlerTests.test_http_body_file @ linux-x86_64 +test.test_urllib2.HandlerTests.test_http_body_fileobj @ linux-x86_64 +test.test_urllib2.HandlerTests.test_http_body_iterable @ linux-x86_64 +test.test_urllib2.HandlerTests.test_http_body_pipe @ linux-x86_64 +test.test_urllib2.HandlerTests.test_http_closed @ linux-x86_64 +test.test_urllib2.HandlerTests.test_http_doubleslash @ linux-x86_64 +test.test_urllib2.HandlerTests.test_http_handler_debuglevel @ linux-x86_64 +test.test_urllib2.HandlerTests.test_invalid_closed @ linux-x86_64 +test.test_urllib2.HandlerTests.test_invalid_redirect @ linux-x86_64 +test.test_urllib2.HandlerTests.test_proxy @ linux-x86_64 +test.test_urllib2.HandlerTests.test_proxy_basic_auth @ linux-x86_64 +test.test_urllib2.HandlerTests.test_proxy_https @ linux-x86_64 +test.test_urllib2.HandlerTests.test_proxy_https_proxy_authorization @ linux-x86_64 +test.test_urllib2.HandlerTests.test_proxy_no_proxy @ linux-x86_64 +test.test_urllib2.HandlerTests.test_proxy_no_proxy_all @ linux-x86_64 +test.test_urllib2.HandlerTests.test_redirect @ linux-x86_64 +test.test_urllib2.HandlerTests.test_redirect_fragment @ linux-x86_64 +test.test_urllib2.HandlerTests.test_relative_redirect @ linux-x86_64 +test.test_urllib2.HandlerTests.test_unsupported_auth_basic_handler @ linux-x86_64 +test.test_urllib2.HandlerTests.test_unsupported_auth_digest_handler @ linux-x86_64 +test.test_urllib2.MiscTests.test_HTTPError_interface @ linux-x86_64 +test.test_urllib2.MiscTests.test_build_opener @ linux-x86_64 +test.test_urllib2.MiscTests.test_gh_98778 @ linux-x86_64 +test.test_urllib2.MiscTests.test_parse_proxy @ linux-x86_64 +test.test_urllib2.MiscTests.test_unsupported_algorithm @ linux-x86_64 +test.test_urllib2.OpenerDirectorTests.test_add_non_handler @ linux-x86_64 +test.test_urllib2.OpenerDirectorTests.test_badly_named_methods @ linux-x86_64 +test.test_urllib2.OpenerDirectorTests.test_handled @ linux-x86_64 +test.test_urllib2.OpenerDirectorTests.test_handler_order @ linux-x86_64 +test.test_urllib2.OpenerDirectorTests.test_http_error @ linux-x86_64 +test.test_urllib2.OpenerDirectorTests.test_processors @ linux-x86_64 +test.test_urllib2.OpenerDirectorTests.test_raise @ linux-x86_64 +test.test_urllib2.RequestHdrsTests.test_password_manager @ linux-x86_64 +test.test_urllib2.RequestHdrsTests.test_password_manager_default_port @ linux-x86_64 +test.test_urllib2.RequestHdrsTests.test_request_headers_dict @ linux-x86_64 +test.test_urllib2.RequestHdrsTests.test_request_headers_methods @ linux-x86_64 +test.test_urllib2.RequestTests.test_data @ linux-x86_64 +test.test_urllib2.RequestTests.test_deleting_data_should_remove_content_length @ linux-x86_64 +test.test_urllib2.RequestTests.test_get_full_url @ linux-x86_64 +test.test_urllib2.RequestTests.test_get_host @ linux-x86_64 +test.test_urllib2.RequestTests.test_get_host_unquote @ linux-x86_64 +test.test_urllib2.RequestTests.test_get_type @ linux-x86_64 +test.test_urllib2.RequestTests.test_method @ linux-x86_64 +test.test_urllib2.RequestTests.test_proxy @ linux-x86_64 +test.test_urllib2.RequestTests.test_selector @ linux-x86_64 +test.test_urllib2.RequestTests.test_setting_data_should_remove_content_length @ linux-x86_64 +test.test_urllib2.RequestTests.test_url_fragment @ linux-x86_64 +test.test_urllib2.RequestTests.test_url_fullurl_get_full_url @ linux-x86_64 +test.test_urllib2.RequestTests.test_wrapped_url @ linux-x86_64 +test.test_urllib2.TrivialTests.test_URLError_reasonstr @ linux-x86_64 +test.test_urllib2.TrivialTests.test___all__ @ linux-x86_64 +test.test_urllib2.TrivialTests.test_parse_http_list @ linux-x86_64 +test.test_urllib2.TrivialTests.test_trivial @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urllib2_localnet.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urllib2_localnet.txt new file mode 100644 index 0000000000..aeedfebbd1 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urllib2_localnet.txt @@ -0,0 +1,21 @@ +test.test_urllib2_localnet.BasicAuthTests.test_basic_auth_httperror @ linux-x86_64 +test.test_urllib2_localnet.ProxyAuthTests.test_proxy_qop_auth_int_works_or_throws_urlerror @ linux-x86_64 +test.test_urllib2_localnet.ProxyAuthTests.test_proxy_qop_auth_works @ linux-x86_64 +test.test_urllib2_localnet.ProxyAuthTests.test_proxy_with_bad_password_raises_httperror @ linux-x86_64 +test.test_urllib2_localnet.ProxyAuthTests.test_proxy_with_no_password_raises_httperror @ linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_200 @ linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_200_with_parameters @ linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_404 @ linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_basic @ linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_chunked @ linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_geturl @ linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_https @ linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_https_with_cadefault @ linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_https_with_cafile @ linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_info @ linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_issue16464 @ linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_iteration @ linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_line_iteration @ linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_redirection @ linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_sending_headers @ linux-x86_64 +test.test_urllib2_localnet.TestUrlopen.test_sending_headers_camel @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urllib2net.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urllib2net.txt new file mode 100644 index 0000000000..111928a3a2 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urllib2net.txt @@ -0,0 +1,10 @@ +test.test_urllib2net.CloseSocketTest.test_close @ linux-x86_64 +test.test_urllib2net.OtherNetworkTests.test_custom_headers @ linux-x86_64 +test.test_urllib2net.OtherNetworkTests.test_file @ linux-x86_64 +!test.test_urllib2net.OtherNetworkTests.test_ftp @ linux-x86_64 +test.test_urllib2net.OtherNetworkTests.test_redirect_url_withfrag @ linux-x86_64 +test.test_urllib2net.OtherNetworkTests.test_urlwithfrag @ linux-x86_64 +test.test_urllib2net.TimeoutTest.test_http_basic @ linux-x86_64 +test.test_urllib2net.TimeoutTest.test_http_default_timeout @ linux-x86_64 +test.test_urllib2net.TimeoutTest.test_http_no_timeout @ linux-x86_64 +test.test_urllib2net.TimeoutTest.test_http_timeout @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urllib_response.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urllib_response.txt new file mode 100644 index 0000000000..56c0d090df --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urllib_response.txt @@ -0,0 +1,4 @@ +test.test_urllib_response.TestResponse.test_addclosehook @ linux-x86_64 +test.test_urllib_response.TestResponse.test_addinfo @ linux-x86_64 +test.test_urllib_response.TestResponse.test_addinfourl @ linux-x86_64 +test.test_urllib_response.TestResponse.test_with @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urllibnet.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urllibnet.txt new file mode 100644 index 0000000000..88801ca7ee --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urllibnet.txt @@ -0,0 +1,12 @@ +test.test_urllibnet.URLTimeoutTest.testURLread @ linux-x86_64 +test.test_urllibnet.urlopenNetworkTests.test_bad_address @ linux-x86_64 +test.test_urllibnet.urlopenNetworkTests.test_basic @ linux-x86_64 +test.test_urllibnet.urlopenNetworkTests.test_getcode @ linux-x86_64 +test.test_urllibnet.urlopenNetworkTests.test_geturl @ linux-x86_64 +test.test_urllibnet.urlopenNetworkTests.test_info @ linux-x86_64 +test.test_urllibnet.urlopenNetworkTests.test_readlines @ linux-x86_64 +test.test_urllibnet.urlretrieveNetworkTests.test_basic @ linux-x86_64 +test.test_urllibnet.urlretrieveNetworkTests.test_data_header @ linux-x86_64 +test.test_urllibnet.urlretrieveNetworkTests.test_header @ linux-x86_64 +test.test_urllibnet.urlretrieveNetworkTests.test_reporthook @ linux-x86_64 +test.test_urllibnet.urlretrieveNetworkTests.test_specified_path @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urlparse.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urlparse.txt new file mode 100644 index 0000000000..82ef9813da --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_urlparse.txt @@ -0,0 +1,71 @@ +test.test_urlparse.DeprecationTest.test_Quoter_deprecation @ linux-x86_64 +test.test_urlparse.DeprecationTest.test_splitattr_deprecation @ linux-x86_64 +test.test_urlparse.DeprecationTest.test_splithost_deprecation @ linux-x86_64 +test.test_urlparse.DeprecationTest.test_splitnport_deprecation @ linux-x86_64 +test.test_urlparse.DeprecationTest.test_splitpasswd_deprecation @ linux-x86_64 +test.test_urlparse.DeprecationTest.test_splitport_deprecation @ linux-x86_64 +test.test_urlparse.DeprecationTest.test_splitquery_deprecation @ linux-x86_64 +test.test_urlparse.DeprecationTest.test_splittag_deprecation @ linux-x86_64 +test.test_urlparse.DeprecationTest.test_splittype_deprecation @ linux-x86_64 +test.test_urlparse.DeprecationTest.test_splituser_deprecation @ linux-x86_64 +test.test_urlparse.DeprecationTest.test_splitvalue_deprecation @ linux-x86_64 +test.test_urlparse.DeprecationTest.test_to_bytes_deprecation @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_Quoter_repr @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_RFC1808 @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_RFC2368 @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_RFC2396 @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_RFC2732 @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_RFC3986 @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_all @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_anyscheme @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_attributes_bad_port @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_attributes_bad_scheme @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_attributes_without_netloc @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_clear_cache_for_code_coverage @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_default_scheme @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_http_roundtrips @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_invalid_bracketed_hosts @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_issue14072 @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_mixed_types_rejected @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_noslash @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_parse_fragments @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_parse_qs_encoding @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_parse_qs_separator @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_parse_qsl_encoding @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_parse_qsl_max_num_fields @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_parse_qsl_separator @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_port_casting_failure_message @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_portseparator @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_qs @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_qsl @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_quote_errors @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_quote_from_bytes @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_result_pairs @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_roundtrips @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_splitting_bracketed_hosts @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_telurl_params @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_unparse_parse @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_unquote_to_bytes @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_urldefrag @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_urlencode_quote_via @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_urlencode_sequences @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_urljoins @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_urllib_parse_getattr_failure @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_urlsplit_attributes @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_urlsplit_remove_unsafe_bytes @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_urlsplit_scoped_IPv6 @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_urlsplit_strip_url @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_usingsys @ linux-x86_64 +test.test_urlparse.UrlParseTestCase.test_withoutscheme @ linux-x86_64 +test.test_urlparse.Utility_Tests.test_splitattr @ linux-x86_64 +test.test_urlparse.Utility_Tests.test_splithost @ linux-x86_64 +test.test_urlparse.Utility_Tests.test_splitnport @ linux-x86_64 +test.test_urlparse.Utility_Tests.test_splitpasswd @ linux-x86_64 +test.test_urlparse.Utility_Tests.test_splitport @ linux-x86_64 +test.test_urlparse.Utility_Tests.test_splitquery @ linux-x86_64 +test.test_urlparse.Utility_Tests.test_splittag @ linux-x86_64 +test.test_urlparse.Utility_Tests.test_splittype @ linux-x86_64 +test.test_urlparse.Utility_Tests.test_splituser @ linux-x86_64 +test.test_urlparse.Utility_Tests.test_splitvalue @ linux-x86_64 +test.test_urlparse.Utility_Tests.test_to_bytes @ linux-x86_64 +test.test_urlparse.Utility_Tests.test_unwrap @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_userdict.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_userdict.txt new file mode 100644 index 0000000000..d5f657be62 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_userdict.txt @@ -0,0 +1,24 @@ +test.test_userdict.UserDictTest.test_all @ linux-x86_64 +test.test_userdict.UserDictTest.test_bool @ linux-x86_64 +test.test_userdict.UserDictTest.test_clear @ linux-x86_64 +test.test_userdict.UserDictTest.test_constructor @ linux-x86_64 +test.test_userdict.UserDictTest.test_contains @ linux-x86_64 +test.test_userdict.UserDictTest.test_copy @ linux-x86_64 +test.test_userdict.UserDictTest.test_eq @ linux-x86_64 +test.test_userdict.UserDictTest.test_fromkeys @ linux-x86_64 +test.test_userdict.UserDictTest.test_get @ linux-x86_64 +test.test_userdict.UserDictTest.test_getitem @ linux-x86_64 +test.test_userdict.UserDictTest.test_init @ linux-x86_64 +test.test_userdict.UserDictTest.test_items @ linux-x86_64 +test.test_userdict.UserDictTest.test_keys @ linux-x86_64 +test.test_userdict.UserDictTest.test_len @ linux-x86_64 +test.test_userdict.UserDictTest.test_missing @ linux-x86_64 +test.test_userdict.UserDictTest.test_mutatingiteration @ linux-x86_64 +test.test_userdict.UserDictTest.test_pop @ linux-x86_64 +test.test_userdict.UserDictTest.test_popitem @ linux-x86_64 +test.test_userdict.UserDictTest.test_read @ linux-x86_64 +test.test_userdict.UserDictTest.test_repr @ linux-x86_64 +test.test_userdict.UserDictTest.test_setdefault @ linux-x86_64 +test.test_userdict.UserDictTest.test_update @ linux-x86_64 +test.test_userdict.UserDictTest.test_values @ linux-x86_64 +test.test_userdict.UserDictTest.test_write @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_userlist.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_userlist.txt new file mode 100644 index 0000000000..7e870e2ce7 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_userlist.txt @@ -0,0 +1,47 @@ +test.test_userlist.UserListTest.test_add_specials @ linux-x86_64 +test.test_userlist.UserListTest.test_addmul @ linux-x86_64 +test.test_userlist.UserListTest.test_append @ linux-x86_64 +test.test_userlist.UserListTest.test_clear @ linux-x86_64 +test.test_userlist.UserListTest.test_constructor_exception_handling @ linux-x86_64 +test.test_userlist.UserListTest.test_constructors @ linux-x86_64 +test.test_userlist.UserListTest.test_contains @ linux-x86_64 +test.test_userlist.UserListTest.test_contains_fake @ linux-x86_64 +test.test_userlist.UserListTest.test_contains_order @ linux-x86_64 +test.test_userlist.UserListTest.test_copy @ linux-x86_64 +test.test_userlist.UserListTest.test_count @ linux-x86_64 +test.test_userlist.UserListTest.test_delitem @ linux-x86_64 +test.test_userlist.UserListTest.test_delslice @ linux-x86_64 +test.test_userlist.UserListTest.test_exhausted_iterator @ linux-x86_64 +test.test_userlist.UserListTest.test_extend @ linux-x86_64 +test.test_userlist.UserListTest.test_extendedslicing @ linux-x86_64 +test.test_userlist.UserListTest.test_getitem @ linux-x86_64 +test.test_userlist.UserListTest.test_getitem_error @ linux-x86_64 +test.test_userlist.UserListTest.test_getitemoverwriteiter @ linux-x86_64 +test.test_userlist.UserListTest.test_getslice @ linux-x86_64 +test.test_userlist.UserListTest.test_iadd @ linux-x86_64 +test.test_userlist.UserListTest.test_imul @ linux-x86_64 +test.test_userlist.UserListTest.test_index @ linux-x86_64 +test.test_userlist.UserListTest.test_init @ linux-x86_64 +test.test_userlist.UserListTest.test_insert @ linux-x86_64 +test.test_userlist.UserListTest.test_len @ linux-x86_64 +test.test_userlist.UserListTest.test_minmax @ linux-x86_64 +test.test_userlist.UserListTest.test_mixedadd @ linux-x86_64 +test.test_userlist.UserListTest.test_mixedcmp @ linux-x86_64 +test.test_userlist.UserListTest.test_pickle @ linux-x86_64 +test.test_userlist.UserListTest.test_pop @ linux-x86_64 +test.test_userlist.UserListTest.test_radd_specials @ linux-x86_64 +test.test_userlist.UserListTest.test_remove @ linux-x86_64 +test.test_userlist.UserListTest.test_repeat @ linux-x86_64 +test.test_userlist.UserListTest.test_repr @ linux-x86_64 +test.test_userlist.UserListTest.test_reverse @ linux-x86_64 +test.test_userlist.UserListTest.test_reversed @ linux-x86_64 +test.test_userlist.UserListTest.test_set_subscript @ linux-x86_64 +test.test_userlist.UserListTest.test_setitem @ linux-x86_64 +test.test_userlist.UserListTest.test_setitem_error @ linux-x86_64 +test.test_userlist.UserListTest.test_setslice @ linux-x86_64 +test.test_userlist.UserListTest.test_slice @ linux-x86_64 +test.test_userlist.UserListTest.test_slice_type @ linux-x86_64 +test.test_userlist.UserListTest.test_sort @ linux-x86_64 +test.test_userlist.UserListTest.test_subscript @ linux-x86_64 +test.test_userlist.UserListTest.test_truth @ linux-x86_64 +test.test_userlist.UserListTest.test_userlist_copy @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_userstring.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_userstring.txt new file mode 100644 index 0000000000..0defdf79c7 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_userstring.txt @@ -0,0 +1,55 @@ +test.test_userstring.UserStringTest.test___contains__ @ linux-x86_64 +test.test_userstring.UserStringTest.test_additional_rsplit @ linux-x86_64 +test.test_userstring.UserStringTest.test_additional_split @ linux-x86_64 +test.test_userstring.UserStringTest.test_capitalize @ linux-x86_64 +test.test_userstring.UserStringTest.test_center @ linux-x86_64 +test.test_userstring.UserStringTest.test_count @ linux-x86_64 +test.test_userstring.UserStringTest.test_encode_default_args @ linux-x86_64 +test.test_userstring.UserStringTest.test_encode_explicit_none_args @ linux-x86_64 +test.test_userstring.UserStringTest.test_endswith @ linux-x86_64 +test.test_userstring.UserStringTest.test_expandtabs @ linux-x86_64 +test.test_userstring.UserStringTest.test_extended_getslice @ linux-x86_64 +test.test_userstring.UserStringTest.test_find @ linux-x86_64 +test.test_userstring.UserStringTest.test_find_etc_raise_correct_error_messages @ linux-x86_64 +test.test_userstring.UserStringTest.test_find_periodic_pattern @ linux-x86_64 +test.test_userstring.UserStringTest.test_find_shift_table_overflow @ linux-x86_64 +test.test_userstring.UserStringTest.test_fixtype @ linux-x86_64 +test.test_userstring.UserStringTest.test_floatformatting @ linux-x86_64 +test.test_userstring.UserStringTest.test_formatting @ linux-x86_64 +test.test_userstring.UserStringTest.test_hash @ linux-x86_64 +test.test_userstring.UserStringTest.test_index @ linux-x86_64 +test.test_userstring.UserStringTest.test_inplace_rewrites @ linux-x86_64 +test.test_userstring.UserStringTest.test_isalnum @ linux-x86_64 +test.test_userstring.UserStringTest.test_isalpha @ linux-x86_64 +test.test_userstring.UserStringTest.test_isascii @ linux-x86_64 +test.test_userstring.UserStringTest.test_isdigit @ linux-x86_64 +test.test_userstring.UserStringTest.test_islower @ linux-x86_64 +test.test_userstring.UserStringTest.test_isspace @ linux-x86_64 +test.test_userstring.UserStringTest.test_istitle @ linux-x86_64 +test.test_userstring.UserStringTest.test_isupper @ linux-x86_64 +test.test_userstring.UserStringTest.test_join @ linux-x86_64 +test.test_userstring.UserStringTest.test_ljust @ linux-x86_64 +test.test_userstring.UserStringTest.test_lower @ linux-x86_64 +test.test_userstring.UserStringTest.test_mul @ linux-x86_64 +test.test_userstring.UserStringTest.test_none_arguments @ linux-x86_64 +test.test_userstring.UserStringTest.test_partition @ linux-x86_64 +test.test_userstring.UserStringTest.test_removeprefix @ linux-x86_64 +test.test_userstring.UserStringTest.test_removesuffix @ linux-x86_64 +test.test_userstring.UserStringTest.test_replace @ linux-x86_64 +test.test_userstring.UserStringTest.test_rfind @ linux-x86_64 +test.test_userstring.UserStringTest.test_rindex @ linux-x86_64 +test.test_userstring.UserStringTest.test_rjust @ linux-x86_64 +test.test_userstring.UserStringTest.test_rmod @ linux-x86_64 +test.test_userstring.UserStringTest.test_rpartition @ linux-x86_64 +test.test_userstring.UserStringTest.test_rsplit @ linux-x86_64 +test.test_userstring.UserStringTest.test_slice @ linux-x86_64 +test.test_userstring.UserStringTest.test_split @ linux-x86_64 +test.test_userstring.UserStringTest.test_splitlines @ linux-x86_64 +test.test_userstring.UserStringTest.test_startswith @ linux-x86_64 +test.test_userstring.UserStringTest.test_strip @ linux-x86_64 +test.test_userstring.UserStringTest.test_strip_whitespace @ linux-x86_64 +test.test_userstring.UserStringTest.test_subscript @ linux-x86_64 +test.test_userstring.UserStringTest.test_swapcase @ linux-x86_64 +test.test_userstring.UserStringTest.test_title @ linux-x86_64 +test.test_userstring.UserStringTest.test_upper @ linux-x86_64 +test.test_userstring.UserStringTest.test_zfill @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_utf8_mode.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_utf8_mode.txt new file mode 100644 index 0000000000..ca970c16fc --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_utf8_mode.txt @@ -0,0 +1,4 @@ +test.test_utf8_mode.UTF8ModeTests.test_filesystemencoding @ linux-x86_64 +test.test_utf8_mode.UTF8ModeTests.test_io @ linux-x86_64 +test.test_utf8_mode.UTF8ModeTests.test_io_encoding @ linux-x86_64 +test.test_utf8_mode.UTF8ModeTests.test_pyio_encoding @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_utf8source.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_utf8source.txt new file mode 100644 index 0000000000..2dc3b5803f --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_utf8source.txt @@ -0,0 +1,3 @@ +test.test_utf8source.BuiltinCompileTests.test_latin1 @ linux-x86_64 +test.test_utf8source.PEP3120Test.test_badsyntax @ linux-x86_64 +test.test_utf8source.PEP3120Test.test_pep3120 @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_uu.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_uu.txt new file mode 100644 index 0000000000..5fc858b1b3 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_uu.txt @@ -0,0 +1,2 @@ +test.test_uu.UUTest.test_missingbegin @ linux-x86_64 +test.test_uu.UUTest.test_no_directory_traversal @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_uuid.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_uuid.txt new file mode 100644 index 0000000000..7d2d6e6cff --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_uuid.txt @@ -0,0 +1,20 @@ +test.test_uuid.TestInternalsWithoutExtModule.test_find_mac_near_keyword @ linux-x86_64 +test.test_uuid.TestInternalsWithoutExtModule.test_find_under_heading @ linux-x86_64 +test.test_uuid.TestInternalsWithoutExtModule.test_find_under_heading_ipv6 @ linux-x86_64 +test.test_uuid.TestInternalsWithoutExtModule.test_ip_getnode @ linux-x86_64 +test.test_uuid.TestInternalsWithoutExtModule.test_parse_mac @ linux-x86_64 +test.test_uuid.TestInternalsWithoutExtModule.test_parse_mac_aix @ linux-x86_64 +test.test_uuid.TestInternalsWithoutExtModule.test_random_getnode @ linux-x86_64 +test.test_uuid.TestUUIDWithoutExtModule.test_UUID @ linux-x86_64 +test.test_uuid.TestUUIDWithoutExtModule.test_exceptions @ linux-x86_64 +test.test_uuid.TestUUIDWithoutExtModule.test_getnode @ linux-x86_64 +test.test_uuid.TestUUIDWithoutExtModule.test_pickle_roundtrip @ linux-x86_64 +test.test_uuid.TestUUIDWithoutExtModule.test_safe_uuid_enum @ linux-x86_64 +test.test_uuid.TestUUIDWithoutExtModule.test_unpickle_previous_python_versions @ linux-x86_64 +test.test_uuid.TestUUIDWithoutExtModule.test_uuid1 @ linux-x86_64 +test.test_uuid.TestUUIDWithoutExtModule.test_uuid1_eui64 @ linux-x86_64 +test.test_uuid.TestUUIDWithoutExtModule.test_uuid1_time @ linux-x86_64 +test.test_uuid.TestUUIDWithoutExtModule.test_uuid3 @ linux-x86_64 +test.test_uuid.TestUUIDWithoutExtModule.test_uuid4 @ linux-x86_64 +test.test_uuid.TestUUIDWithoutExtModule.test_uuid5 @ linux-x86_64 +test.test_uuid.TestUUIDWithoutExtModule.test_uuid_weakref @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_venv.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_venv.txt new file mode 100644 index 0000000000..04358f1fcc --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_venv.txt @@ -0,0 +1,15 @@ +test.test_venv.BasicTest.test_deactivate_with_strict_bash_opts @ linux-x86_64 +test.test_venv.BasicTest.test_executable @ linux-x86_64 +test.test_venv.BasicTest.test_executable_symlinks @ linux-x86_64 +test.test_venv.BasicTest.test_isolation @ linux-x86_64 +test.test_venv.BasicTest.test_overwrite_existing @ linux-x86_64 +test.test_venv.BasicTest.test_pathsep_error @ linux-x86_64 +test.test_venv.BasicTest.test_prefixes @ linux-x86_64 +test.test_venv.BasicTest.test_prompt @ linux-x86_64 +test.test_venv.BasicTest.test_symlinking @ linux-x86_64 +test.test_venv.BasicTest.test_unoverwritable_fails @ linux-x86_64 +test.test_venv.BasicTest.test_upgrade @ linux-x86_64 +test.test_venv.BasicTest.test_upgrade_dependencies @ linux-x86_64 +test.test_venv.EnsurePipTest.test_devnull @ linux-x86_64 +test.test_venv.EnsurePipTest.test_explicit_no_pip @ linux-x86_64 +test.test_venv.EnsurePipTest.test_no_pip_by_default @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_warnings.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_warnings.txt new file mode 100644 index 0000000000..dabb10b455 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_warnings.txt @@ -0,0 +1,113 @@ +test.test_warnings.BootstrapTest.test_issue_8766 @ linux-x86_64 +test.test_warnings.CCatchWarningTests.test_catch_warnings_defaults @ linux-x86_64 +test.test_warnings.CCatchWarningTests.test_catch_warnings_recording @ linux-x86_64 +test.test_warnings.CCatchWarningTests.test_catch_warnings_reentry_guard @ linux-x86_64 +test.test_warnings.CCatchWarningTests.test_catch_warnings_restore @ linux-x86_64 +test.test_warnings.CCatchWarningTests.test_check_warnings @ linux-x86_64 +test.test_warnings.CCatchWarningTests.test_record_override_showwarning_before @ linux-x86_64 +test.test_warnings.CCatchWarningTests.test_record_override_showwarning_inside @ linux-x86_64 +test.test_warnings.CEnvironmentVariableTests.test_comma_separated_warnings @ linux-x86_64 +test.test_warnings.CEnvironmentVariableTests.test_conflicting_envvar_and_command_line @ linux-x86_64 +test.test_warnings.CEnvironmentVariableTests.test_default_filter_configuration @ linux-x86_64 +test.test_warnings.CEnvironmentVariableTests.test_envvar_and_command_line @ linux-x86_64 +test.test_warnings.CEnvironmentVariableTests.test_nonascii @ linux-x86_64 +test.test_warnings.CEnvironmentVariableTests.test_single_warning @ linux-x86_64 +test.test_warnings.CFilterTests.test_always @ linux-x86_64 +test.test_warnings.CFilterTests.test_always_after_default @ linux-x86_64 +test.test_warnings.CFilterTests.test_append_duplicate @ linux-x86_64 +test.test_warnings.CFilterTests.test_catchwarnings_with_simplefilter_error @ linux-x86_64 +test.test_warnings.CFilterTests.test_catchwarnings_with_simplefilter_ignore @ linux-x86_64 +test.test_warnings.CFilterTests.test_default @ linux-x86_64 +test.test_warnings.CFilterTests.test_error @ linux-x86_64 +test.test_warnings.CFilterTests.test_error_after_default @ linux-x86_64 +test.test_warnings.CFilterTests.test_filterwarnings @ linux-x86_64 +test.test_warnings.CFilterTests.test_filterwarnings_duplicate_filters @ linux-x86_64 +test.test_warnings.CFilterTests.test_ignore @ linux-x86_64 +test.test_warnings.CFilterTests.test_ignore_after_default @ linux-x86_64 +test.test_warnings.CFilterTests.test_inheritance @ linux-x86_64 +test.test_warnings.CFilterTests.test_message_matching @ linux-x86_64 +test.test_warnings.CFilterTests.test_module @ linux-x86_64 +test.test_warnings.CFilterTests.test_module_globals @ linux-x86_64 +test.test_warnings.CFilterTests.test_mutate_filter_list @ linux-x86_64 +test.test_warnings.CFilterTests.test_once @ linux-x86_64 +test.test_warnings.CFilterTests.test_ordering @ linux-x86_64 +test.test_warnings.CFilterTests.test_simplefilter_duplicate_filters @ linux-x86_64 +test.test_warnings.CPublicAPITests.test_module_all_attribute @ linux-x86_64 +test.test_warnings.CWCmdLineTests.test_import_from_module @ linux-x86_64 +test.test_warnings.CWCmdLineTests.test_improper_input @ linux-x86_64 +test.test_warnings.CWarnTests.test_accelerated @ linux-x86_64 +test.test_warnings.CWarnTests.test_bad_str @ linux-x86_64 +test.test_warnings.CWarnTests.test_exec_filename @ linux-x86_64 +test.test_warnings.CWarnTests.test_filename @ linux-x86_64 +test.test_warnings.CWarnTests.test_message @ linux-x86_64 +test.test_warnings.CWarnTests.test_stacklevel @ linux-x86_64 +test.test_warnings.CWarnTests.test_warn_explicit_non_ascii_filename @ linux-x86_64 +test.test_warnings.CWarnTests.test_warn_explicit_type_errors @ linux-x86_64 +test.test_warnings.CWarnTests.test_warn_nonstandard_types @ linux-x86_64 +test.test_warnings.CWarnTests.test_warning_classes @ linux-x86_64 +test.test_warnings.CWarningsDisplayTests.test_formatwarning @ linux-x86_64 +test.test_warnings.CWarningsDisplayTests.test_formatwarning_override @ linux-x86_64 +test.test_warnings.CWarningsDisplayTests.test_showwarning @ linux-x86_64 +test.test_warnings.PyCatchWarningTests.test_catch_warnings_defaults @ linux-x86_64 +test.test_warnings.PyCatchWarningTests.test_catch_warnings_recording @ linux-x86_64 +test.test_warnings.PyCatchWarningTests.test_catch_warnings_reentry_guard @ linux-x86_64 +test.test_warnings.PyCatchWarningTests.test_catch_warnings_restore @ linux-x86_64 +test.test_warnings.PyCatchWarningTests.test_check_warnings @ linux-x86_64 +test.test_warnings.PyCatchWarningTests.test_record_override_showwarning_before @ linux-x86_64 +test.test_warnings.PyCatchWarningTests.test_record_override_showwarning_inside @ linux-x86_64 +test.test_warnings.PyEnvironmentVariableTests.test_comma_separated_warnings @ linux-x86_64 +test.test_warnings.PyEnvironmentVariableTests.test_conflicting_envvar_and_command_line @ linux-x86_64 +test.test_warnings.PyEnvironmentVariableTests.test_default_filter_configuration @ linux-x86_64 +test.test_warnings.PyEnvironmentVariableTests.test_envvar_and_command_line @ linux-x86_64 +test.test_warnings.PyEnvironmentVariableTests.test_nonascii @ linux-x86_64 +test.test_warnings.PyEnvironmentVariableTests.test_single_warning @ linux-x86_64 +test.test_warnings.PyFilterTests.test_always @ linux-x86_64 +test.test_warnings.PyFilterTests.test_always_after_default @ linux-x86_64 +test.test_warnings.PyFilterTests.test_append_duplicate @ linux-x86_64 +test.test_warnings.PyFilterTests.test_catchwarnings_with_simplefilter_error @ linux-x86_64 +test.test_warnings.PyFilterTests.test_catchwarnings_with_simplefilter_ignore @ linux-x86_64 +test.test_warnings.PyFilterTests.test_default @ linux-x86_64 +test.test_warnings.PyFilterTests.test_error @ linux-x86_64 +test.test_warnings.PyFilterTests.test_error_after_default @ linux-x86_64 +test.test_warnings.PyFilterTests.test_filterwarnings @ linux-x86_64 +test.test_warnings.PyFilterTests.test_filterwarnings_duplicate_filters @ linux-x86_64 +test.test_warnings.PyFilterTests.test_ignore @ linux-x86_64 +test.test_warnings.PyFilterTests.test_ignore_after_default @ linux-x86_64 +test.test_warnings.PyFilterTests.test_inheritance @ linux-x86_64 +test.test_warnings.PyFilterTests.test_message_matching @ linux-x86_64 +test.test_warnings.PyFilterTests.test_module @ linux-x86_64 +test.test_warnings.PyFilterTests.test_module_globals @ linux-x86_64 +test.test_warnings.PyFilterTests.test_mutate_filter_list @ linux-x86_64 +test.test_warnings.PyFilterTests.test_once @ linux-x86_64 +test.test_warnings.PyFilterTests.test_ordering @ linux-x86_64 +test.test_warnings.PyFilterTests.test_simplefilter_duplicate_filters @ linux-x86_64 +test.test_warnings.PyPublicAPITests.test_module_all_attribute @ linux-x86_64 +test.test_warnings.PyWCmdLineTests.test_import_from_module @ linux-x86_64 +test.test_warnings.PyWCmdLineTests.test_improper_input @ linux-x86_64 +test.test_warnings.PyWCmdLineTests.test_improper_option @ linux-x86_64 +test.test_warnings.PyWCmdLineTests.test_warnings_bootstrap @ linux-x86_64 +test.test_warnings.PyWarnTests.test_bad_str @ linux-x86_64 +test.test_warnings.PyWarnTests.test_exec_filename @ linux-x86_64 +test.test_warnings.PyWarnTests.test_filename @ linux-x86_64 +test.test_warnings.PyWarnTests.test_message @ linux-x86_64 +test.test_warnings.PyWarnTests.test_pure_python @ linux-x86_64 +test.test_warnings.PyWarnTests.test_stacklevel @ linux-x86_64 +test.test_warnings.PyWarnTests.test_warn_explicit_non_ascii_filename @ linux-x86_64 +test.test_warnings.PyWarnTests.test_warn_explicit_type_errors @ linux-x86_64 +test.test_warnings.PyWarnTests.test_warn_nonstandard_types @ linux-x86_64 +test.test_warnings.PyWarnTests.test_warning_classes @ linux-x86_64 +test.test_warnings.PyWarningsDisplayTests.test_formatwarning @ linux-x86_64 +test.test_warnings.PyWarningsDisplayTests.test_formatwarning_override @ linux-x86_64 +test.test_warnings.PyWarningsDisplayTests.test_showwarning @ linux-x86_64 +test.test_warnings._DeprecatedTest.test_RuntimeError @ linux-x86_64 +test.test_warnings._DeprecatedTest.test_warning @ linux-x86_64 +test.test_warnings._WarningsTests.test_default_action @ linux-x86_64 +test.test_warnings._WarningsTests.test_filename_none @ linux-x86_64 +test.test_warnings._WarningsTests.test_filter @ linux-x86_64 +test.test_warnings._WarningsTests.test_issue31285 @ linux-x86_64 +test.test_warnings._WarningsTests.test_onceregistry @ linux-x86_64 +test.test_warnings._WarningsTests.test_show_warning_output @ linux-x86_64 +test.test_warnings._WarningsTests.test_showwarning_missing @ linux-x86_64 +test.test_warnings._WarningsTests.test_showwarning_not_callable @ linux-x86_64 +test.test_warnings._WarningsTests.test_showwarnmsg_missing @ linux-x86_64 +test.test_warnings._WarningsTests.test_stderr_none @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_wave.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_wave.txt new file mode 100644 index 0000000000..2d35c10018 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_wave.txt @@ -0,0 +1,90 @@ +test.test_wave.MiscTestCase.test__all__ @ linux-x86_64 +test.test_wave.WaveLowLevelTest.test_read_no_chunks @ linux-x86_64 +test.test_wave.WaveLowLevelTest.test_read_no_data_chunk @ linux-x86_64 +test.test_wave.WaveLowLevelTest.test_read_no_fmt_chunk @ linux-x86_64 +test.test_wave.WaveLowLevelTest.test_read_no_fmt_no_data_chunk @ linux-x86_64 +test.test_wave.WaveLowLevelTest.test_read_no_riff_chunk @ linux-x86_64 +test.test_wave.WaveLowLevelTest.test_read_not_wave @ linux-x86_64 +test.test_wave.WaveLowLevelTest.test_read_wrong_form @ linux-x86_64 +test.test_wave.WaveLowLevelTest.test_read_wrong_number_of_channels @ linux-x86_64 +test.test_wave.WaveLowLevelTest.test_read_wrong_sample_width @ linux-x86_64 +test.test_wave.WavePCM16Test.test_close @ linux-x86_64 +test.test_wave.WavePCM16Test.test_context_manager_with_filename @ linux-x86_64 +test.test_wave.WavePCM16Test.test_context_manager_with_open_file @ linux-x86_64 +test.test_wave.WavePCM16Test.test_copy @ linux-x86_64 +test.test_wave.WavePCM16Test.test_incompleted_write @ linux-x86_64 +test.test_wave.WavePCM16Test.test_multiple_writes @ linux-x86_64 +test.test_wave.WavePCM16Test.test_overflowed_write @ linux-x86_64 +test.test_wave.WavePCM16Test.test_read @ linux-x86_64 +test.test_wave.WavePCM16Test.test_read_not_from_start @ linux-x86_64 +test.test_wave.WavePCM16Test.test_read_params @ linux-x86_64 +test.test_wave.WavePCM16Test.test_unseekable_incompleted_write @ linux-x86_64 +test.test_wave.WavePCM16Test.test_unseekable_overflowed_write @ linux-x86_64 +test.test_wave.WavePCM16Test.test_unseekable_read @ linux-x86_64 +test.test_wave.WavePCM16Test.test_unseekable_write @ linux-x86_64 +test.test_wave.WavePCM16Test.test_write @ linux-x86_64 +test.test_wave.WavePCM16Test.test_write_array @ linux-x86_64 +test.test_wave.WavePCM16Test.test_write_bytearray @ linux-x86_64 +test.test_wave.WavePCM16Test.test_write_context_manager_calls_close @ linux-x86_64 +test.test_wave.WavePCM16Test.test_write_memoryview @ linux-x86_64 +test.test_wave.WavePCM16Test.test_write_params @ linux-x86_64 +test.test_wave.WavePCM24Test.test_close @ linux-x86_64 +test.test_wave.WavePCM24Test.test_context_manager_with_filename @ linux-x86_64 +test.test_wave.WavePCM24Test.test_context_manager_with_open_file @ linux-x86_64 +test.test_wave.WavePCM24Test.test_copy @ linux-x86_64 +test.test_wave.WavePCM24Test.test_incompleted_write @ linux-x86_64 +test.test_wave.WavePCM24Test.test_multiple_writes @ linux-x86_64 +test.test_wave.WavePCM24Test.test_overflowed_write @ linux-x86_64 +test.test_wave.WavePCM24Test.test_read @ linux-x86_64 +test.test_wave.WavePCM24Test.test_read_not_from_start @ linux-x86_64 +test.test_wave.WavePCM24Test.test_read_params @ linux-x86_64 +test.test_wave.WavePCM24Test.test_unseekable_incompleted_write @ linux-x86_64 +test.test_wave.WavePCM24Test.test_unseekable_overflowed_write @ linux-x86_64 +test.test_wave.WavePCM24Test.test_unseekable_read @ linux-x86_64 +test.test_wave.WavePCM24Test.test_unseekable_write @ linux-x86_64 +test.test_wave.WavePCM24Test.test_write @ linux-x86_64 +test.test_wave.WavePCM24Test.test_write_array @ linux-x86_64 +test.test_wave.WavePCM24Test.test_write_bytearray @ linux-x86_64 +test.test_wave.WavePCM24Test.test_write_context_manager_calls_close @ linux-x86_64 +test.test_wave.WavePCM24Test.test_write_memoryview @ linux-x86_64 +test.test_wave.WavePCM24Test.test_write_params @ linux-x86_64 +test.test_wave.WavePCM32Test.test_close @ linux-x86_64 +test.test_wave.WavePCM32Test.test_context_manager_with_filename @ linux-x86_64 +test.test_wave.WavePCM32Test.test_context_manager_with_open_file @ linux-x86_64 +test.test_wave.WavePCM32Test.test_copy @ linux-x86_64 +test.test_wave.WavePCM32Test.test_incompleted_write @ linux-x86_64 +test.test_wave.WavePCM32Test.test_multiple_writes @ linux-x86_64 +test.test_wave.WavePCM32Test.test_overflowed_write @ linux-x86_64 +test.test_wave.WavePCM32Test.test_read @ linux-x86_64 +test.test_wave.WavePCM32Test.test_read_not_from_start @ linux-x86_64 +test.test_wave.WavePCM32Test.test_read_params @ linux-x86_64 +test.test_wave.WavePCM32Test.test_unseekable_incompleted_write @ linux-x86_64 +test.test_wave.WavePCM32Test.test_unseekable_overflowed_write @ linux-x86_64 +test.test_wave.WavePCM32Test.test_unseekable_read @ linux-x86_64 +test.test_wave.WavePCM32Test.test_unseekable_write @ linux-x86_64 +test.test_wave.WavePCM32Test.test_write @ linux-x86_64 +test.test_wave.WavePCM32Test.test_write_array @ linux-x86_64 +test.test_wave.WavePCM32Test.test_write_bytearray @ linux-x86_64 +test.test_wave.WavePCM32Test.test_write_context_manager_calls_close @ linux-x86_64 +test.test_wave.WavePCM32Test.test_write_memoryview @ linux-x86_64 +test.test_wave.WavePCM32Test.test_write_params @ linux-x86_64 +test.test_wave.WavePCM8Test.test_close @ linux-x86_64 +test.test_wave.WavePCM8Test.test_context_manager_with_filename @ linux-x86_64 +test.test_wave.WavePCM8Test.test_context_manager_with_open_file @ linux-x86_64 +test.test_wave.WavePCM8Test.test_copy @ linux-x86_64 +test.test_wave.WavePCM8Test.test_incompleted_write @ linux-x86_64 +test.test_wave.WavePCM8Test.test_multiple_writes @ linux-x86_64 +test.test_wave.WavePCM8Test.test_overflowed_write @ linux-x86_64 +test.test_wave.WavePCM8Test.test_read @ linux-x86_64 +test.test_wave.WavePCM8Test.test_read_not_from_start @ linux-x86_64 +test.test_wave.WavePCM8Test.test_read_params @ linux-x86_64 +test.test_wave.WavePCM8Test.test_unseekable_incompleted_write @ linux-x86_64 +test.test_wave.WavePCM8Test.test_unseekable_overflowed_write @ linux-x86_64 +test.test_wave.WavePCM8Test.test_unseekable_read @ linux-x86_64 +test.test_wave.WavePCM8Test.test_unseekable_write @ linux-x86_64 +test.test_wave.WavePCM8Test.test_write @ linux-x86_64 +test.test_wave.WavePCM8Test.test_write_array @ linux-x86_64 +test.test_wave.WavePCM8Test.test_write_bytearray @ linux-x86_64 +test.test_wave.WavePCM8Test.test_write_context_manager_calls_close @ linux-x86_64 +test.test_wave.WavePCM8Test.test_write_memoryview @ linux-x86_64 +test.test_wave.WavePCM8Test.test_write_params @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_weakref.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_weakref.txt new file mode 100644 index 0000000000..03fc77d16a --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_weakref.txt @@ -0,0 +1,86 @@ +DocTestCase.test.test_weakref.__test__.libreftest @ linux-x86_64 +test.test_weakref.FinalizeTestCase.test_arg_errors @ linux-x86_64 +test.test_weakref.FinalizeTestCase.test_finalize @ linux-x86_64 +test.test_weakref.MappingTestCase.test_make_weak_keyed_dict_from_dict @ linux-x86_64 +test.test_weakref.MappingTestCase.test_make_weak_keyed_dict_from_weak_keyed_dict @ linux-x86_64 +test.test_weakref.MappingTestCase.test_make_weak_keyed_dict_repr @ linux-x86_64 +test.test_weakref.MappingTestCase.test_make_weak_valued_dict_from_dict @ linux-x86_64 +test.test_weakref.MappingTestCase.test_make_weak_valued_dict_from_weak_valued_dict @ linux-x86_64 +test.test_weakref.MappingTestCase.test_make_weak_valued_dict_misc @ linux-x86_64 +test.test_weakref.MappingTestCase.test_make_weak_valued_dict_repr @ linux-x86_64 +test.test_weakref.MappingTestCase.test_threaded_weak_key_dict_copy @ linux-x86_64 +test.test_weakref.MappingTestCase.test_threaded_weak_value_dict_copy @ linux-x86_64 +test.test_weakref.MappingTestCase.test_threaded_weak_value_dict_deepcopy @ linux-x86_64 +test.test_weakref.MappingTestCase.test_threaded_weak_valued_consistency @ linux-x86_64 +test.test_weakref.MappingTestCase.test_threaded_weak_valued_pop @ linux-x86_64 +test.test_weakref.MappingTestCase.test_threaded_weak_valued_setdefault @ linux-x86_64 +test.test_weakref.MappingTestCase.test_weak_keyed_delitem @ linux-x86_64 +test.test_weakref.MappingTestCase.test_weak_keyed_dict_popitem @ linux-x86_64 +test.test_weakref.MappingTestCase.test_weak_keyed_dict_setdefault @ linux-x86_64 +test.test_weakref.MappingTestCase.test_weak_keyed_dict_update @ linux-x86_64 +test.test_weakref.MappingTestCase.test_weak_keyed_iters @ linux-x86_64 +test.test_weakref.MappingTestCase.test_weak_valued_delitem @ linux-x86_64 +test.test_weakref.MappingTestCase.test_weak_valued_dict_popitem @ linux-x86_64 +test.test_weakref.MappingTestCase.test_weak_valued_dict_setdefault @ linux-x86_64 +test.test_weakref.MappingTestCase.test_weak_valued_dict_update @ linux-x86_64 +test.test_weakref.MappingTestCase.test_weak_valued_iters @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_basic_callback @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_basic_proxy @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_basic_ref @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_callback_different_classes @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_callback_gcs @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_callback_in_cycle @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_callback_reachable_one_way @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_callbacks_protected @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_constructor_kwargs @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_hashing @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_init @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_multiple_callbacks @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_multiple_selfref_callbacks @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_newstyle_number_ops @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_ordering @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_proxy_bool @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_proxy_deletion @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_proxy_div @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_proxy_index @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_proxy_iter @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_proxy_next @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_proxy_reversed @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_proxy_unicode @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_ref_created_during_del @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_set_callback_attribute @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_sf_bug_840829 @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_shared_ref_without_callback @ linux-x86_64 +test.test_weakref.ReferencesTestCase.test_trashcan_16602 @ linux-x86_64 +test.test_weakref.SubclassableWeakrefTestCase.test_subclass_refs_with_cycle @ linux-x86_64 +test.test_weakref.SubclassableWeakrefTestCase.test_subclass_refs_with_slots @ linux-x86_64 +test.test_weakref.WeakKeyDictionaryTestCase.test_bool @ linux-x86_64 +test.test_weakref.WeakKeyDictionaryTestCase.test_constructor @ linux-x86_64 +test.test_weakref.WeakKeyDictionaryTestCase.test_get @ linux-x86_64 +test.test_weakref.WeakKeyDictionaryTestCase.test_getitem @ linux-x86_64 +test.test_weakref.WeakKeyDictionaryTestCase.test_items @ linux-x86_64 +test.test_weakref.WeakKeyDictionaryTestCase.test_keys @ linux-x86_64 +test.test_weakref.WeakKeyDictionaryTestCase.test_len @ linux-x86_64 +test.test_weakref.WeakKeyDictionaryTestCase.test_pop @ linux-x86_64 +test.test_weakref.WeakKeyDictionaryTestCase.test_popitem @ linux-x86_64 +test.test_weakref.WeakKeyDictionaryTestCase.test_read @ linux-x86_64 +test.test_weakref.WeakKeyDictionaryTestCase.test_setdefault @ linux-x86_64 +test.test_weakref.WeakKeyDictionaryTestCase.test_update @ linux-x86_64 +test.test_weakref.WeakKeyDictionaryTestCase.test_values @ linux-x86_64 +test.test_weakref.WeakKeyDictionaryTestCase.test_write @ linux-x86_64 +test.test_weakref.WeakMethodTestCase.test_alive @ linux-x86_64 +test.test_weakref.WeakMethodTestCase.test_equality @ linux-x86_64 +test.test_weakref.WeakValueDictionaryTestCase.test_bool @ linux-x86_64 +test.test_weakref.WeakValueDictionaryTestCase.test_constructor @ linux-x86_64 +test.test_weakref.WeakValueDictionaryTestCase.test_get @ linux-x86_64 +test.test_weakref.WeakValueDictionaryTestCase.test_getitem @ linux-x86_64 +test.test_weakref.WeakValueDictionaryTestCase.test_items @ linux-x86_64 +test.test_weakref.WeakValueDictionaryTestCase.test_keys @ linux-x86_64 +test.test_weakref.WeakValueDictionaryTestCase.test_len @ linux-x86_64 +test.test_weakref.WeakValueDictionaryTestCase.test_pop @ linux-x86_64 +test.test_weakref.WeakValueDictionaryTestCase.test_popitem @ linux-x86_64 +test.test_weakref.WeakValueDictionaryTestCase.test_read @ linux-x86_64 +test.test_weakref.WeakValueDictionaryTestCase.test_setdefault @ linux-x86_64 +test.test_weakref.WeakValueDictionaryTestCase.test_update @ linux-x86_64 +test.test_weakref.WeakValueDictionaryTestCase.test_values @ linux-x86_64 +test.test_weakref.WeakValueDictionaryTestCase.test_write @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_weakset.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_weakset.txt new file mode 100644 index 0000000000..99e3e83139 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_weakset.txt @@ -0,0 +1,36 @@ +test.test_weakset.TestWeakSet.test_abc @ linux-x86_64 +test.test_weakset.TestWeakSet.test_and @ linux-x86_64 +test.test_weakset.TestWeakSet.test_clear @ linux-x86_64 +test.test_weakset.TestWeakSet.test_constructor_identity @ linux-x86_64 +test.test_weakset.TestWeakSet.test_copy @ linux-x86_64 +test.test_weakset.TestWeakSet.test_copying @ linux-x86_64 +test.test_weakset.TestWeakSet.test_difference @ linux-x86_64 +test.test_weakset.TestWeakSet.test_difference_update @ linux-x86_64 +test.test_weakset.TestWeakSet.test_discard @ linux-x86_64 +test.test_weakset.TestWeakSet.test_eq @ linux-x86_64 +test.test_weakset.TestWeakSet.test_gc @ linux-x86_64 +test.test_weakset.TestWeakSet.test_gt @ linux-x86_64 +test.test_weakset.TestWeakSet.test_hash @ linux-x86_64 +test.test_weakset.TestWeakSet.test_iand @ linux-x86_64 +test.test_weakset.TestWeakSet.test_init @ linux-x86_64 +test.test_weakset.TestWeakSet.test_inplace_on_self @ linux-x86_64 +test.test_weakset.TestWeakSet.test_intersection_update @ linux-x86_64 +test.test_weakset.TestWeakSet.test_ior @ linux-x86_64 +test.test_weakset.TestWeakSet.test_isdisjoint @ linux-x86_64 +test.test_weakset.TestWeakSet.test_isub @ linux-x86_64 +test.test_weakset.TestWeakSet.test_ixor @ linux-x86_64 +test.test_weakset.TestWeakSet.test_lt @ linux-x86_64 +test.test_weakset.TestWeakSet.test_methods @ linux-x86_64 +test.test_weakset.TestWeakSet.test_ne @ linux-x86_64 +test.test_weakset.TestWeakSet.test_new_or_init @ linux-x86_64 +test.test_weakset.TestWeakSet.test_or @ linux-x86_64 +test.test_weakset.TestWeakSet.test_pop @ linux-x86_64 +test.test_weakset.TestWeakSet.test_remove @ linux-x86_64 +test.test_weakset.TestWeakSet.test_repr @ linux-x86_64 +test.test_weakset.TestWeakSet.test_sub @ linux-x86_64 +test.test_weakset.TestWeakSet.test_sub_and_super @ linux-x86_64 +test.test_weakset.TestWeakSet.test_subclass_with_custom_hash @ linux-x86_64 +test.test_weakset.TestWeakSet.test_symmetric_difference_update @ linux-x86_64 +test.test_weakset.TestWeakSet.test_update @ linux-x86_64 +test.test_weakset.TestWeakSet.test_update_set @ linux-x86_64 +test.test_weakset.TestWeakSet.test_xor @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_webbrowser.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_webbrowser.txt new file mode 100644 index 0000000000..9ce63b4ec5 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_webbrowser.txt @@ -0,0 +1,32 @@ +test.test_webbrowser.BackgroundBrowserCommandTest.test_open @ linux-x86_64 +test.test_webbrowser.BrowserRegistrationTest.test_register @ linux-x86_64 +test.test_webbrowser.BrowserRegistrationTest.test_register_default @ linux-x86_64 +test.test_webbrowser.BrowserRegistrationTest.test_register_preferred @ linux-x86_64 +test.test_webbrowser.ChromeCommandTest.test_open @ linux-x86_64 +test.test_webbrowser.ChromeCommandTest.test_open_new @ linux-x86_64 +test.test_webbrowser.ChromeCommandTest.test_open_new_tab @ linux-x86_64 +test.test_webbrowser.ChromeCommandTest.test_open_with_autoraise_false @ linux-x86_64 +test.test_webbrowser.ELinksCommandTest.test_open @ linux-x86_64 +test.test_webbrowser.ELinksCommandTest.test_open_new @ linux-x86_64 +test.test_webbrowser.ELinksCommandTest.test_open_new_tab @ linux-x86_64 +test.test_webbrowser.ELinksCommandTest.test_open_with_autoraise_false @ linux-x86_64 +test.test_webbrowser.GaleonCommandTest.test_open @ linux-x86_64 +test.test_webbrowser.GaleonCommandTest.test_open_new @ linux-x86_64 +test.test_webbrowser.GaleonCommandTest.test_open_new_tab @ linux-x86_64 +test.test_webbrowser.GaleonCommandTest.test_open_with_autoraise_false @ linux-x86_64 +test.test_webbrowser.GenericBrowserCommandTest.test_open @ linux-x86_64 +test.test_webbrowser.ImportTest.test_get @ linux-x86_64 +test.test_webbrowser.ImportTest.test_register @ linux-x86_64 +test.test_webbrowser.ImportTest.test_synthesize @ linux-x86_64 +test.test_webbrowser.MozillaCommandTest.test_open @ linux-x86_64 +test.test_webbrowser.MozillaCommandTest.test_open_new @ linux-x86_64 +test.test_webbrowser.MozillaCommandTest.test_open_new_tab @ linux-x86_64 +test.test_webbrowser.MozillaCommandTest.test_open_with_autoraise_false @ linux-x86_64 +test.test_webbrowser.NetscapeCommandTest.test_open @ linux-x86_64 +test.test_webbrowser.NetscapeCommandTest.test_open_new @ linux-x86_64 +test.test_webbrowser.NetscapeCommandTest.test_open_new_tab @ linux-x86_64 +test.test_webbrowser.NetscapeCommandTest.test_open_with_autoraise_false @ linux-x86_64 +test.test_webbrowser.OperaCommandTest.test_open @ linux-x86_64 +test.test_webbrowser.OperaCommandTest.test_open_new @ linux-x86_64 +test.test_webbrowser.OperaCommandTest.test_open_new_tab @ linux-x86_64 +test.test_webbrowser.OperaCommandTest.test_open_with_autoraise_false @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_with.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_with.txt new file mode 100644 index 0000000000..ddd297e7b9 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_with.txt @@ -0,0 +1,50 @@ +test.test_with.AssignmentTargetTestCase.testMultipleComplexTargets @ linux-x86_64 +test.test_with.AssignmentTargetTestCase.testSingleComplexTarget @ linux-x86_64 +test.test_with.AssignmentTargetTestCase.testWithExtendedTargets @ linux-x86_64 +test.test_with.ExceptionalTestCase.testErrorsInBool @ linux-x86_64 +test.test_with.ExceptionalTestCase.testExceptionNormalized @ linux-x86_64 +test.test_with.ExceptionalTestCase.testMultipleResourcesInSingleStatement @ linux-x86_64 +test.test_with.ExceptionalTestCase.testNestedExceptionAfterInnerStatement @ linux-x86_64 +test.test_with.ExceptionalTestCase.testNestedExceptionBeforeInnerStatement @ linux-x86_64 +test.test_with.ExceptionalTestCase.testNestedSingleStatements @ linux-x86_64 +test.test_with.ExceptionalTestCase.testRaisedGeneratorExit1 @ linux-x86_64 +test.test_with.ExceptionalTestCase.testRaisedGeneratorExit2 @ linux-x86_64 +test.test_with.ExceptionalTestCase.testRaisedStopIteration1 @ linux-x86_64 +test.test_with.ExceptionalTestCase.testRaisedStopIteration2 @ linux-x86_64 +test.test_with.ExceptionalTestCase.testRaisedStopIteration3 @ linux-x86_64 +test.test_with.ExceptionalTestCase.testSingleResource @ linux-x86_64 +test.test_with.ExitSwallowsExceptionTestCase.testExitFalseDoesntSwallowException @ linux-x86_64 +test.test_with.ExitSwallowsExceptionTestCase.testExitTrueSwallowsException @ linux-x86_64 +test.test_with.FailureTestCase.testAssignmentToNoneError @ linux-x86_64 +test.test_with.FailureTestCase.testAssignmentToTupleContainingNoneError @ linux-x86_64 +test.test_with.FailureTestCase.testAssignmentToTupleOnlyContainingNoneError @ linux-x86_64 +test.test_with.FailureTestCase.testEnterAttributeError1 @ linux-x86_64 +test.test_with.FailureTestCase.testEnterAttributeError2 @ linux-x86_64 +test.test_with.FailureTestCase.testEnterThrows @ linux-x86_64 +test.test_with.FailureTestCase.testExitAttributeError @ linux-x86_64 +test.test_with.FailureTestCase.testExitThrows @ linux-x86_64 +test.test_with.FailureTestCase.testNameError @ linux-x86_64 +test.test_with.NestedNonexceptionalTestCase.testMultipleArgBound @ linux-x86_64 +test.test_with.NestedNonexceptionalTestCase.testMultipleArgUnbound @ linux-x86_64 +test.test_with.NestedNonexceptionalTestCase.testSingleArgBoundToMultipleElementTupleError @ linux-x86_64 +test.test_with.NestedNonexceptionalTestCase.testSingleArgBoundToNonTuple @ linux-x86_64 +test.test_with.NestedNonexceptionalTestCase.testSingleArgBoundToSingleElementParenthesizedList @ linux-x86_64 +test.test_with.NestedNonexceptionalTestCase.testSingleArgInlineGeneratorSyntax @ linux-x86_64 +test.test_with.NestedNonexceptionalTestCase.testSingleArgUnbound @ linux-x86_64 +test.test_with.NestedWith.testEnterReturnsTuple @ linux-x86_64 +test.test_with.NestedWith.testExceptionInEnter @ linux-x86_64 +test.test_with.NestedWith.testExceptionInExit @ linux-x86_64 +test.test_with.NestedWith.testExceptionInExprList @ linux-x86_64 +test.test_with.NestedWith.testNoExceptions @ linux-x86_64 +test.test_with.NonLocalFlowControlTestCase.testWithBreak @ linux-x86_64 +test.test_with.NonLocalFlowControlTestCase.testWithContinue @ linux-x86_64 +test.test_with.NonLocalFlowControlTestCase.testWithRaise @ linux-x86_64 +test.test_with.NonLocalFlowControlTestCase.testWithReturn @ linux-x86_64 +test.test_with.NonLocalFlowControlTestCase.testWithYield @ linux-x86_64 +test.test_with.NonexceptionalTestCase.testBoundGenerator @ linux-x86_64 +test.test_with.NonexceptionalTestCase.testInlineGeneratorBoundSyntax @ linux-x86_64 +test.test_with.NonexceptionalTestCase.testInlineGeneratorBoundToDottedVariable @ linux-x86_64 +test.test_with.NonexceptionalTestCase.testInlineGeneratorBoundToExistingVariable @ linux-x86_64 +test.test_with.NonexceptionalTestCase.testInlineGeneratorSyntax @ linux-x86_64 +test.test_with.NonexceptionalTestCase.testNestedSingleStatements @ linux-x86_64 +test.test_with.NonexceptionalTestCase.testUnboundGenerator @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_wsgiref.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_wsgiref.txt new file mode 100644 index 0000000000..cc046fd695 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_wsgiref.txt @@ -0,0 +1,34 @@ +test.test_wsgiref.HandlerTests.testAbstractMethods @ linux-x86_64 +test.test_wsgiref.HandlerTests.testBasicErrorOutput @ linux-x86_64 +test.test_wsgiref.HandlerTests.testBytesData @ linux-x86_64 +test.test_wsgiref.HandlerTests.testCGIEnviron @ linux-x86_64 +test.test_wsgiref.HandlerTests.testClientConnectionTerminations @ linux-x86_64 +test.test_wsgiref.HandlerTests.testCloseOnError @ linux-x86_64 +test.test_wsgiref.HandlerTests.testContentLength @ linux-x86_64 +test.test_wsgiref.HandlerTests.testDontResetInternalStateOnException @ linux-x86_64 +test.test_wsgiref.HandlerTests.testEnviron @ linux-x86_64 +test.test_wsgiref.HandlerTests.testErrorAfterOutput @ linux-x86_64 +test.test_wsgiref.HandlerTests.testHeaderFormats @ linux-x86_64 +test.test_wsgiref.HandlerTests.testPartialWrite @ linux-x86_64 +test.test_wsgiref.HandlerTests.testScheme @ linux-x86_64 +test.test_wsgiref.HeaderTests.testExtras @ linux-x86_64 +test.test_wsgiref.HeaderTests.testMappingInterface @ linux-x86_64 +test.test_wsgiref.HeaderTests.testRequireList @ linux-x86_64 +test.test_wsgiref.IntegrationTests.test_bytes_validation @ linux-x86_64 +test.test_wsgiref.IntegrationTests.test_cp1252_url @ linux-x86_64 +test.test_wsgiref.IntegrationTests.test_environ @ linux-x86_64 +test.test_wsgiref.IntegrationTests.test_plain_hello @ linux-x86_64 +test.test_wsgiref.IntegrationTests.test_request_length @ linux-x86_64 +test.test_wsgiref.IntegrationTests.test_simple_validation_error @ linux-x86_64 +test.test_wsgiref.IntegrationTests.test_status_validation_errors @ linux-x86_64 +test.test_wsgiref.IntegrationTests.test_validated_hello @ linux-x86_64 +test.test_wsgiref.IntegrationTests.test_wsgi_input @ linux-x86_64 +test.test_wsgiref.UtilityTests.testAppURIs @ linux-x86_64 +test.test_wsgiref.UtilityTests.testCrossDefaults @ linux-x86_64 +test.test_wsgiref.UtilityTests.testDefaults @ linux-x86_64 +test.test_wsgiref.UtilityTests.testFileWrapper @ linux-x86_64 +test.test_wsgiref.UtilityTests.testGuessScheme @ linux-x86_64 +test.test_wsgiref.UtilityTests.testHopByHop @ linux-x86_64 +test.test_wsgiref.UtilityTests.testNormalizedShifts @ linux-x86_64 +test.test_wsgiref.UtilityTests.testReqURIs @ linux-x86_64 +test.test_wsgiref.UtilityTests.testSimpleShifts @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_xdrlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_xdrlib.txt new file mode 100644 index 0000000000..5d7a2df0a3 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_xdrlib.txt @@ -0,0 +1,6 @@ +test.test_xdrlib.ConversionErrorTest.test_double @ linux-x86_64 +test.test_xdrlib.ConversionErrorTest.test_float @ linux-x86_64 +test.test_xdrlib.ConversionErrorTest.test_pack_int @ linux-x86_64 +test.test_xdrlib.ConversionErrorTest.test_pack_uint @ linux-x86_64 +test.test_xdrlib.ConversionErrorTest.test_uhyper @ linux-x86_64 +test.test_xdrlib.XDRTest.test_xdr @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_xml_dom_minicompat.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_xml_dom_minicompat.txt new file mode 100644 index 0000000000..efaf1164e3 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_xml_dom_minicompat.txt @@ -0,0 +1,11 @@ +test.test_xml_dom_minicompat.EmptyNodeListTestCase.test_emptynodelist___add__ @ linux-x86_64 +test.test_xml_dom_minicompat.EmptyNodeListTestCase.test_emptynodelist___radd__ @ linux-x86_64 +test.test_xml_dom_minicompat.EmptyNodeListTestCase.test_emptynodelist_item @ linux-x86_64 +test.test_xml_dom_minicompat.EmptyNodeListTestCase.test_emptynodelist_length @ linux-x86_64 +test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist___add__ @ linux-x86_64 +test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist___radd__ @ linux-x86_64 +test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist_copy @ linux-x86_64 +test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist_deepcopy @ linux-x86_64 +test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist_item @ linux-x86_64 +test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist_length @ linux-x86_64 +test.test_xml_dom_minicompat.NodeListTestCase.test_nodelist_pickle_roundtrip @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_xml_etree.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_xml_etree.txt new file mode 100644 index 0000000000..7a77c4bd33 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_xml_etree.txt @@ -0,0 +1,181 @@ +test.test_xml_etree.BadElementPathTest.test_find_with_error @ linux-x86_64 +test.test_xml_etree.BadElementPathTest.test_find_with_mutating @ linux-x86_64 +test.test_xml_etree.BadElementPathTest.test_findall_with_error @ linux-x86_64 +test.test_xml_etree.BadElementPathTest.test_findall_with_mutating @ linux-x86_64 +test.test_xml_etree.BadElementPathTest.test_findtext_with_error @ linux-x86_64 +test.test_xml_etree.BadElementPathTest.test_findtext_with_falsey_text_attribute @ linux-x86_64 +test.test_xml_etree.BadElementPathTest.test_findtext_with_mutating @ linux-x86_64 +test.test_xml_etree.BadElementPathTest.test_findtext_with_none_text_attribute @ linux-x86_64 +test.test_xml_etree.BadElementTest.test_ass_subscr @ linux-x86_64 +test.test_xml_etree.BadElementTest.test_element_get_tail @ linux-x86_64 +test.test_xml_etree.BadElementTest.test_element_get_text @ linux-x86_64 +test.test_xml_etree.BadElementTest.test_extend_mutable_list @ linux-x86_64 +test.test_xml_etree.BadElementTest.test_extend_mutable_list2 @ linux-x86_64 +test.test_xml_etree.BadElementTest.test_recursive_repr @ linux-x86_64 +test.test_xml_etree.BadElementTest.test_remove_with_mutating @ linux-x86_64 +test.test_xml_etree.BadElementTest.test_subscr @ linux-x86_64 +test.test_xml_etree.BadElementTest.test_treebuilder_end @ linux-x86_64 +test.test_xml_etree.BadElementTest.test_treebuilder_start @ linux-x86_64 +test.test_xml_etree.BasicElementTest.test___copy__ @ linux-x86_64 +test.test_xml_etree.BasicElementTest.test___deepcopy__ @ linux-x86_64 +test.test_xml_etree.BasicElementTest.test___init__ @ linux-x86_64 +test.test_xml_etree.BasicElementTest.test_augmentation_type_errors @ linux-x86_64 +test.test_xml_etree.BasicElementTest.test_copy @ linux-x86_64 +!test.test_xml_etree.BasicElementTest.test_cyclic_gc @ linux-x86_64 +test.test_xml_etree.BasicElementTest.test_get_keyword_args @ linux-x86_64 +test.test_xml_etree.BasicElementTest.test_pickle @ linux-x86_64 +test.test_xml_etree.BasicElementTest.test_pickle_issue18997 @ linux-x86_64 +test.test_xml_etree.BasicElementTest.test_weakref @ linux-x86_64 +test.test_xml_etree.BugsTest.test_39495_treebuilder_start @ linux-x86_64 +test.test_xml_etree.BugsTest.test_bug_1534630 @ linux-x86_64 +test.test_xml_etree.BugsTest.test_bug_200708_close @ linux-x86_64 +test.test_xml_etree.BugsTest.test_bug_200708_newline @ linux-x86_64 +test.test_xml_etree.BugsTest.test_bug_200709_default_namespace @ linux-x86_64 +test.test_xml_etree.BugsTest.test_bug_200709_element_comment @ linux-x86_64 +test.test_xml_etree.BugsTest.test_bug_200709_element_insert @ linux-x86_64 +test.test_xml_etree.BugsTest.test_bug_200709_iter_comment @ linux-x86_64 +test.test_xml_etree.BugsTest.test_bug_200709_register_namespace @ linux-x86_64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkit21 @ linux-x86_64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkit25 @ linux-x86_64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkit28 @ linux-x86_64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkit39 @ linux-x86_64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkit54 @ linux-x86_64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkit55 @ linux-x86_64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkit60 @ linux-x86_64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkit62 @ linux-x86_64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkit63 @ linux-x86_64 +test.test_xml_etree.BugsTest.test_bug_xmltoolkitX1 @ linux-x86_64 +test.test_xml_etree.BugsTest.test_expat224_utf8_bug @ linux-x86_64 +test.test_xml_etree.BugsTest.test_expat224_utf8_bug_file @ linux-x86_64 +test.test_xml_etree.BugsTest.test_issue10777 @ linux-x86_64 +test.test_xml_etree.BugsTest.test_issue6233 @ linux-x86_64 +test.test_xml_etree.BugsTest.test_issue6565 @ linux-x86_64 +test.test_xml_etree.BugsTest.test_lost_tail @ linux-x86_64 +test.test_xml_etree.BugsTest.test_lost_text @ linux-x86_64 +test.test_xml_etree.C14NTest.test_c14n_exclusion @ linux-x86_64 +test.test_xml_etree.C14NTest.test_simple_roundtrip @ linux-x86_64 +test.test_xml_etree.ElementFindTest.test_bad_find @ linux-x86_64 +test.test_xml_etree.ElementFindTest.test_find_simple @ linux-x86_64 +test.test_xml_etree.ElementFindTest.test_find_through_ElementTree @ linux-x86_64 +test.test_xml_etree.ElementFindTest.test_find_xpath @ linux-x86_64 +test.test_xml_etree.ElementFindTest.test_findall @ linux-x86_64 +test.test_xml_etree.ElementFindTest.test_findall_different_nsmaps @ linux-x86_64 +test.test_xml_etree.ElementFindTest.test_findall_wildcard @ linux-x86_64 +test.test_xml_etree.ElementFindTest.test_test_find_with_ns @ linux-x86_64 +test.test_xml_etree.ElementIterTest.test_basic @ linux-x86_64 +test.test_xml_etree.ElementIterTest.test_copy @ linux-x86_64 +test.test_xml_etree.ElementIterTest.test_corners @ linux-x86_64 +test.test_xml_etree.ElementIterTest.test_iter_by_tag @ linux-x86_64 +test.test_xml_etree.ElementIterTest.test_pickle @ linux-x86_64 +test.test_xml_etree.ElementSlicingTest.test_delslice @ linux-x86_64 +test.test_xml_etree.ElementSlicingTest.test_getslice_negative_steps @ linux-x86_64 +test.test_xml_etree.ElementSlicingTest.test_getslice_range @ linux-x86_64 +test.test_xml_etree.ElementSlicingTest.test_getslice_single_index @ linux-x86_64 +test.test_xml_etree.ElementSlicingTest.test_getslice_steps @ linux-x86_64 +test.test_xml_etree.ElementSlicingTest.test_setslice_range @ linux-x86_64 +test.test_xml_etree.ElementSlicingTest.test_setslice_single_index @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_attlist_default @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_attrib @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_cdata @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_children @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_copy @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_custom_builder @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_custom_builder_only_end_ns @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_doctype_public @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_dump_attribute_order @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_entity @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_file_init @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_html_empty_elems_serialization @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_indent @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_indent_level @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_indent_space @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_indent_space_caching @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_initialize_parser_without_target @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_interface @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_issue18347 @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_iterparse @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_makeelement @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_methods @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_namespace @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_parsefile @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_parseliteral @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_path_cache @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_processinginstruction @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_qname @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_set_attribute @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_tostring_default_namespace @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_tostring_default_namespace_different_namespace @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_tostring_default_namespace_original_no_namespace @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_tostring_no_xml_declaration @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_tostring_xml_declaration @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_tostring_xml_declaration_cases @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_tostring_xml_declaration_unicode_encoding @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_tostringlist_default_namespace @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_tostringlist_xml_declaration @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_tree_write_attribute_order @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_writefile @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_writestring @ linux-x86_64 +test.test_xml_etree.ElementTreeTest.test_xpath_tokenizer @ linux-x86_64 +test.test_xml_etree.ElementTreeTypeTest.test_Element_subclass_constructor @ linux-x86_64 +test.test_xml_etree.ElementTreeTypeTest.test_Element_subclass_find @ linux-x86_64 +test.test_xml_etree.ElementTreeTypeTest.test_Element_subclass_new_method @ linux-x86_64 +test.test_xml_etree.ElementTreeTypeTest.test_Element_subclass_trivial @ linux-x86_64 +test.test_xml_etree.ElementTreeTypeTest.test_istype @ linux-x86_64 +test.test_xml_etree.IOTest.test_read_from_bytesio @ linux-x86_64 +test.test_xml_etree.IOTest.test_read_from_stringio @ linux-x86_64 +test.test_xml_etree.IOTest.test_read_from_user_binary_reader @ linux-x86_64 +test.test_xml_etree.IOTest.test_read_from_user_text_reader @ linux-x86_64 +test.test_xml_etree.IOTest.test_short_empty_elements @ linux-x86_64 +test.test_xml_etree.IOTest.test_tostringlist_invariant @ linux-x86_64 +test.test_xml_etree.IOTest.test_write_to_binary_file @ linux-x86_64 +test.test_xml_etree.IOTest.test_write_to_binary_file_with_encoding @ linux-x86_64 +test.test_xml_etree.IOTest.test_write_to_bytesio @ linux-x86_64 +test.test_xml_etree.IOTest.test_write_to_filename @ linux-x86_64 +test.test_xml_etree.IOTest.test_write_to_filename_as_unicode @ linux-x86_64 +test.test_xml_etree.IOTest.test_write_to_filename_with_encoding @ linux-x86_64 +test.test_xml_etree.IOTest.test_write_to_stringio @ linux-x86_64 +test.test_xml_etree.IOTest.test_write_to_text_file @ linux-x86_64 +test.test_xml_etree.IOTest.test_write_to_user_binary_writer @ linux-x86_64 +test.test_xml_etree.IOTest.test_write_to_user_text_writer @ linux-x86_64 +test.test_xml_etree.KeywordArgsTest.test_issue14818 @ linux-x86_64 +test.test_xml_etree.ModuleTest.test_all @ linux-x86_64 +test.test_xml_etree.ModuleTest.test_sanity @ linux-x86_64 +test.test_xml_etree.NamespaceParseTest.test_find_with_namespace @ linux-x86_64 +test.test_xml_etree.NoAcceleratorTest.test_correct_import_pyET @ linux-x86_64 +test.test_xml_etree.ParseErrorTest.test_error_code @ linux-x86_64 +test.test_xml_etree.ParseErrorTest.test_error_position @ linux-x86_64 +test.test_xml_etree.ParseErrorTest.test_subclass @ linux-x86_64 +test.test_xml_etree.TreeBuilderTest.test_builder_lookup_errors @ linux-x86_64 +test.test_xml_etree.TreeBuilderTest.test_doctype @ linux-x86_64 +test.test_xml_etree.TreeBuilderTest.test_dummy_builder @ linux-x86_64 +test.test_xml_etree.TreeBuilderTest.test_element_factory @ linux-x86_64 +test.test_xml_etree.TreeBuilderTest.test_element_factory_pure_python_subclass @ linux-x86_64 +test.test_xml_etree.TreeBuilderTest.test_element_factory_subclass @ linux-x86_64 +test.test_xml_etree.TreeBuilderTest.test_late_tail @ linux-x86_64 +test.test_xml_etree.TreeBuilderTest.test_late_tail_mix_pi_comments @ linux-x86_64 +test.test_xml_etree.TreeBuilderTest.test_subclass @ linux-x86_64 +test.test_xml_etree.TreeBuilderTest.test_subclass_comment_pi @ linux-x86_64 +test.test_xml_etree.TreeBuilderTest.test_treebuilder_comment @ linux-x86_64 +test.test_xml_etree.TreeBuilderTest.test_treebuilder_elementfactory_none @ linux-x86_64 +test.test_xml_etree.TreeBuilderTest.test_treebuilder_pi @ linux-x86_64 +test.test_xml_etree.XIncludeTest.test_xinclude @ linux-x86_64 +test.test_xml_etree.XIncludeTest.test_xinclude_default @ linux-x86_64 +test.test_xml_etree.XIncludeTest.test_xinclude_failures @ linux-x86_64 +test.test_xml_etree.XIncludeTest.test_xinclude_repeated @ linux-x86_64 +test.test_xml_etree.XMLParserTest.test_constructor_args @ linux-x86_64 +test.test_xml_etree.XMLParserTest.test_doctype_warning @ linux-x86_64 +test.test_xml_etree.XMLParserTest.test_inherited_doctype @ linux-x86_64 +test.test_xml_etree.XMLParserTest.test_parse_string @ linux-x86_64 +test.test_xml_etree.XMLParserTest.test_subclass @ linux-x86_64 +test.test_xml_etree.XMLParserTest.test_subclass_doctype @ linux-x86_64 +test.test_xml_etree.XMLPullParserTest.test_events @ linux-x86_64 +test.test_xml_etree.XMLPullParserTest.test_events_comment @ linux-x86_64 +test.test_xml_etree.XMLPullParserTest.test_events_pi @ linux-x86_64 +test.test_xml_etree.XMLPullParserTest.test_events_sequence @ linux-x86_64 +test.test_xml_etree.XMLPullParserTest.test_feed_while_iterating @ linux-x86_64 +test.test_xml_etree.XMLPullParserTest.test_ns_events @ linux-x86_64 +test.test_xml_etree.XMLPullParserTest.test_ns_events_start @ linux-x86_64 +test.test_xml_etree.XMLPullParserTest.test_ns_events_start_end @ linux-x86_64 +test.test_xml_etree.XMLPullParserTest.test_simple_xml @ linux-x86_64 +test.test_xml_etree.XMLPullParserTest.test_simple_xml_with_ns @ linux-x86_64 +test.test_xml_etree.XMLPullParserTest.test_unknown_event @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_xml_etree_c.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_xml_etree_c.txt new file mode 100644 index 0000000000..4bfbf45fa6 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_xml_etree_c.txt @@ -0,0 +1,181 @@ +test.test_xml_etree_c.BadElementPathTest.test_find_with_error @ linux-x86_64 +test.test_xml_etree_c.BadElementPathTest.test_find_with_mutating @ linux-x86_64 +test.test_xml_etree_c.BadElementPathTest.test_findall_with_error @ linux-x86_64 +test.test_xml_etree_c.BadElementPathTest.test_findall_with_mutating @ linux-x86_64 +test.test_xml_etree_c.BadElementPathTest.test_findtext_with_error @ linux-x86_64 +test.test_xml_etree_c.BadElementPathTest.test_findtext_with_falsey_text_attribute @ linux-x86_64 +test.test_xml_etree_c.BadElementPathTest.test_findtext_with_mutating @ linux-x86_64 +test.test_xml_etree_c.BadElementPathTest.test_findtext_with_none_text_attribute @ linux-x86_64 +test.test_xml_etree_c.BadElementTest.test_ass_subscr @ linux-x86_64 +test.test_xml_etree_c.BadElementTest.test_element_get_tail @ linux-x86_64 +test.test_xml_etree_c.BadElementTest.test_element_get_text @ linux-x86_64 +test.test_xml_etree_c.BadElementTest.test_extend_mutable_list @ linux-x86_64 +test.test_xml_etree_c.BadElementTest.test_extend_mutable_list2 @ linux-x86_64 +test.test_xml_etree_c.BadElementTest.test_recursive_repr @ linux-x86_64 +test.test_xml_etree_c.BadElementTest.test_remove_with_mutating @ linux-x86_64 +test.test_xml_etree_c.BadElementTest.test_subscr @ linux-x86_64 +test.test_xml_etree_c.BadElementTest.test_treebuilder_end @ linux-x86_64 +test.test_xml_etree_c.BadElementTest.test_treebuilder_start @ linux-x86_64 +test.test_xml_etree_c.BasicElementTest.test___copy__ @ linux-x86_64 +test.test_xml_etree_c.BasicElementTest.test___deepcopy__ @ linux-x86_64 +test.test_xml_etree_c.BasicElementTest.test___init__ @ linux-x86_64 +test.test_xml_etree_c.BasicElementTest.test_augmentation_type_errors @ linux-x86_64 +test.test_xml_etree_c.BasicElementTest.test_copy @ linux-x86_64 +!test.test_xml_etree_c.BasicElementTest.test_cyclic_gc @ linux-x86_64 +test.test_xml_etree_c.BasicElementTest.test_get_keyword_args @ linux-x86_64 +test.test_xml_etree_c.BasicElementTest.test_pickle @ linux-x86_64 +test.test_xml_etree_c.BasicElementTest.test_pickle_issue18997 @ linux-x86_64 +test.test_xml_etree_c.BasicElementTest.test_weakref @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_39495_treebuilder_start @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_bug_1534630 @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_bug_200708_close @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_bug_200708_newline @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_bug_200709_default_namespace @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_bug_200709_element_comment @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_bug_200709_element_insert @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_bug_200709_iter_comment @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_bug_200709_register_namespace @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit21 @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit25 @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit28 @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit39 @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit54 @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit55 @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit60 @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit62 @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkit63 @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_bug_xmltoolkitX1 @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_expat224_utf8_bug @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_expat224_utf8_bug_file @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_issue10777 @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_issue6233 @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_issue6565 @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_lost_tail @ linux-x86_64 +test.test_xml_etree_c.BugsTest.test_lost_text @ linux-x86_64 +test.test_xml_etree_c.C14NTest.test_c14n_exclusion @ linux-x86_64 +test.test_xml_etree_c.C14NTest.test_simple_roundtrip @ linux-x86_64 +test.test_xml_etree_c.ElementFindTest.test_bad_find @ linux-x86_64 +test.test_xml_etree_c.ElementFindTest.test_find_simple @ linux-x86_64 +test.test_xml_etree_c.ElementFindTest.test_find_through_ElementTree @ linux-x86_64 +test.test_xml_etree_c.ElementFindTest.test_find_xpath @ linux-x86_64 +test.test_xml_etree_c.ElementFindTest.test_findall @ linux-x86_64 +test.test_xml_etree_c.ElementFindTest.test_findall_different_nsmaps @ linux-x86_64 +test.test_xml_etree_c.ElementFindTest.test_findall_wildcard @ linux-x86_64 +test.test_xml_etree_c.ElementFindTest.test_test_find_with_ns @ linux-x86_64 +test.test_xml_etree_c.ElementIterTest.test_basic @ linux-x86_64 +test.test_xml_etree_c.ElementIterTest.test_copy @ linux-x86_64 +test.test_xml_etree_c.ElementIterTest.test_corners @ linux-x86_64 +test.test_xml_etree_c.ElementIterTest.test_iter_by_tag @ linux-x86_64 +test.test_xml_etree_c.ElementIterTest.test_pickle @ linux-x86_64 +test.test_xml_etree_c.ElementSlicingTest.test_delslice @ linux-x86_64 +test.test_xml_etree_c.ElementSlicingTest.test_getslice_negative_steps @ linux-x86_64 +test.test_xml_etree_c.ElementSlicingTest.test_getslice_range @ linux-x86_64 +test.test_xml_etree_c.ElementSlicingTest.test_getslice_single_index @ linux-x86_64 +test.test_xml_etree_c.ElementSlicingTest.test_getslice_steps @ linux-x86_64 +test.test_xml_etree_c.ElementSlicingTest.test_setslice_range @ linux-x86_64 +test.test_xml_etree_c.ElementSlicingTest.test_setslice_single_index @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_attlist_default @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_attrib @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_cdata @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_children @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_copy @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_custom_builder @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_custom_builder_only_end_ns @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_doctype_public @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_dump_attribute_order @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_entity @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_file_init @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_html_empty_elems_serialization @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_indent @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_indent_level @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_indent_space @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_indent_space_caching @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_initialize_parser_without_target @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_interface @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_issue18347 @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_iterparse @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_makeelement @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_methods @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_namespace @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_parsefile @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_parseliteral @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_path_cache @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_processinginstruction @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_qname @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_set_attribute @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_tostring_default_namespace @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_tostring_default_namespace_different_namespace @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_tostring_default_namespace_original_no_namespace @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_tostring_no_xml_declaration @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_tostring_xml_declaration @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_tostring_xml_declaration_cases @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_tostring_xml_declaration_unicode_encoding @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_tostringlist_default_namespace @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_tostringlist_xml_declaration @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_tree_write_attribute_order @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_writefile @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_writestring @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTest.test_xpath_tokenizer @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTypeTest.test_Element_subclass_constructor @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTypeTest.test_Element_subclass_find @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTypeTest.test_Element_subclass_new_method @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTypeTest.test_Element_subclass_trivial @ linux-x86_64 +test.test_xml_etree_c.ElementTreeTypeTest.test_istype @ linux-x86_64 +test.test_xml_etree_c.IOTest.test_read_from_bytesio @ linux-x86_64 +test.test_xml_etree_c.IOTest.test_read_from_stringio @ linux-x86_64 +test.test_xml_etree_c.IOTest.test_read_from_user_binary_reader @ linux-x86_64 +test.test_xml_etree_c.IOTest.test_read_from_user_text_reader @ linux-x86_64 +test.test_xml_etree_c.IOTest.test_short_empty_elements @ linux-x86_64 +test.test_xml_etree_c.IOTest.test_tostringlist_invariant @ linux-x86_64 +test.test_xml_etree_c.IOTest.test_write_to_binary_file @ linux-x86_64 +test.test_xml_etree_c.IOTest.test_write_to_binary_file_with_encoding @ linux-x86_64 +test.test_xml_etree_c.IOTest.test_write_to_bytesio @ linux-x86_64 +test.test_xml_etree_c.IOTest.test_write_to_filename @ linux-x86_64 +test.test_xml_etree_c.IOTest.test_write_to_filename_as_unicode @ linux-x86_64 +test.test_xml_etree_c.IOTest.test_write_to_filename_with_encoding @ linux-x86_64 +test.test_xml_etree_c.IOTest.test_write_to_stringio @ linux-x86_64 +test.test_xml_etree_c.IOTest.test_write_to_text_file @ linux-x86_64 +test.test_xml_etree_c.IOTest.test_write_to_user_binary_writer @ linux-x86_64 +test.test_xml_etree_c.IOTest.test_write_to_user_text_writer @ linux-x86_64 +test.test_xml_etree_c.KeywordArgsTest.test_issue14818 @ linux-x86_64 +test.test_xml_etree_c.ModuleTest.test_all @ linux-x86_64 +test.test_xml_etree_c.ModuleTest.test_sanity @ linux-x86_64 +test.test_xml_etree_c.NamespaceParseTest.test_find_with_namespace @ linux-x86_64 +test.test_xml_etree_c.NoAcceleratorTest.test_correct_import_pyET @ linux-x86_64 +test.test_xml_etree_c.ParseErrorTest.test_error_code @ linux-x86_64 +test.test_xml_etree_c.ParseErrorTest.test_error_position @ linux-x86_64 +test.test_xml_etree_c.ParseErrorTest.test_subclass @ linux-x86_64 +test.test_xml_etree_c.TreeBuilderTest.test_builder_lookup_errors @ linux-x86_64 +test.test_xml_etree_c.TreeBuilderTest.test_doctype @ linux-x86_64 +test.test_xml_etree_c.TreeBuilderTest.test_dummy_builder @ linux-x86_64 +test.test_xml_etree_c.TreeBuilderTest.test_element_factory @ linux-x86_64 +test.test_xml_etree_c.TreeBuilderTest.test_element_factory_pure_python_subclass @ linux-x86_64 +test.test_xml_etree_c.TreeBuilderTest.test_element_factory_subclass @ linux-x86_64 +test.test_xml_etree_c.TreeBuilderTest.test_late_tail @ linux-x86_64 +test.test_xml_etree_c.TreeBuilderTest.test_late_tail_mix_pi_comments @ linux-x86_64 +test.test_xml_etree_c.TreeBuilderTest.test_subclass @ linux-x86_64 +test.test_xml_etree_c.TreeBuilderTest.test_subclass_comment_pi @ linux-x86_64 +test.test_xml_etree_c.TreeBuilderTest.test_treebuilder_comment @ linux-x86_64 +test.test_xml_etree_c.TreeBuilderTest.test_treebuilder_elementfactory_none @ linux-x86_64 +test.test_xml_etree_c.TreeBuilderTest.test_treebuilder_pi @ linux-x86_64 +test.test_xml_etree_c.XIncludeTest.test_xinclude @ linux-x86_64 +test.test_xml_etree_c.XIncludeTest.test_xinclude_default @ linux-x86_64 +test.test_xml_etree_c.XIncludeTest.test_xinclude_failures @ linux-x86_64 +test.test_xml_etree_c.XIncludeTest.test_xinclude_repeated @ linux-x86_64 +test.test_xml_etree_c.XMLParserTest.test_constructor_args @ linux-x86_64 +test.test_xml_etree_c.XMLParserTest.test_doctype_warning @ linux-x86_64 +test.test_xml_etree_c.XMLParserTest.test_inherited_doctype @ linux-x86_64 +test.test_xml_etree_c.XMLParserTest.test_parse_string @ linux-x86_64 +test.test_xml_etree_c.XMLParserTest.test_subclass @ linux-x86_64 +test.test_xml_etree_c.XMLParserTest.test_subclass_doctype @ linux-x86_64 +test.test_xml_etree_c.XMLPullParserTest.test_events @ linux-x86_64 +test.test_xml_etree_c.XMLPullParserTest.test_events_comment @ linux-x86_64 +test.test_xml_etree_c.XMLPullParserTest.test_events_pi @ linux-x86_64 +test.test_xml_etree_c.XMLPullParserTest.test_events_sequence @ linux-x86_64 +test.test_xml_etree_c.XMLPullParserTest.test_feed_while_iterating @ linux-x86_64 +test.test_xml_etree_c.XMLPullParserTest.test_ns_events @ linux-x86_64 +test.test_xml_etree_c.XMLPullParserTest.test_ns_events_start @ linux-x86_64 +test.test_xml_etree_c.XMLPullParserTest.test_ns_events_start_end @ linux-x86_64 +test.test_xml_etree_c.XMLPullParserTest.test_simple_xml @ linux-x86_64 +test.test_xml_etree_c.XMLPullParserTest.test_simple_xml_with_ns @ linux-x86_64 +test.test_xml_etree_c.XMLPullParserTest.test_unknown_event @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_xmlrpc.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_xmlrpc.txt new file mode 100644 index 0000000000..f9b3ea5fa4 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_xmlrpc.txt @@ -0,0 +1,92 @@ +test.test_xmlrpc.BinaryTestCase.test_decode @ linux-x86_64 +test.test_xmlrpc.BinaryTestCase.test_default @ linux-x86_64 +test.test_xmlrpc.BinaryTestCase.test_string @ linux-x86_64 +test.test_xmlrpc.CGIHandlerTestCase.test_cgi_get @ linux-x86_64 +test.test_xmlrpc.CGIHandlerTestCase.test_cgi_xmlrpc_response @ linux-x86_64 +test.test_xmlrpc.DateTimeTestCase.test_comparison @ linux-x86_64 +test.test_xmlrpc.DateTimeTestCase.test_datetime_datetime @ linux-x86_64 +test.test_xmlrpc.DateTimeTestCase.test_decode @ linux-x86_64 +test.test_xmlrpc.DateTimeTestCase.test_default @ linux-x86_64 +test.test_xmlrpc.DateTimeTestCase.test_repr @ linux-x86_64 +test.test_xmlrpc.DateTimeTestCase.test_time @ linux-x86_64 +test.test_xmlrpc.DateTimeTestCase.test_time_struct @ linux-x86_64 +test.test_xmlrpc.DateTimeTestCase.test_time_tuple @ linux-x86_64 +test.test_xmlrpc.FailingServerTestCase.test_basic @ linux-x86_64 +test.test_xmlrpc.FailingServerTestCase.test_fail_no_info @ linux-x86_64 +test.test_xmlrpc.FailingServerTestCase.test_fail_with_info @ linux-x86_64 +test.test_xmlrpc.FaultTestCase.test_dotted_attribute @ linux-x86_64 +test.test_xmlrpc.FaultTestCase.test_dump_fault @ linux-x86_64 +test.test_xmlrpc.FaultTestCase.test_repr @ linux-x86_64 +test.test_xmlrpc.GzipServerTestCase.test_bad_gzip_request @ linux-x86_64 +test.test_xmlrpc.GzipServerTestCase.test_gzip_request @ linux-x86_64 +test.test_xmlrpc.GzipServerTestCase.test_gzip_response @ linux-x86_64 +test.test_xmlrpc.GzipUtilTestCase.test_gzip_decode_limit @ linux-x86_64 +test.test_xmlrpc.HeadersServerTestCase.test_header @ linux-x86_64 +test.test_xmlrpc.HeadersServerTestCase.test_header_empty @ linux-x86_64 +test.test_xmlrpc.HeadersServerTestCase.test_header_items @ linux-x86_64 +test.test_xmlrpc.HeadersServerTestCase.test_header_many @ linux-x86_64 +test.test_xmlrpc.HelperTestCase.test_escape @ linux-x86_64 +test.test_xmlrpc.KeepaliveServerTestCase1.test_two @ linux-x86_64 +test.test_xmlrpc.KeepaliveServerTestCase2.test_close @ linux-x86_64 +test.test_xmlrpc.KeepaliveServerTestCase2.test_transport @ linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_empty_path @ linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_empty_path_fragment @ linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_empty_path_query @ linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_invalid_path @ linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_path1 @ linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_path2 @ linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_path3 @ linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_path_fragment @ linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_path_query @ linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_path_query_fragment @ linux-x86_64 +test.test_xmlrpc.MultiPathServerTestCase.test_root_path @ linux-x86_64 +test.test_xmlrpc.ServerProxyTestCase.test_close @ linux-x86_64 +test.test_xmlrpc.ServerProxyTestCase.test_transport @ linux-x86_64 +test.test_xmlrpc.SimpleServerEncodingTestCase.test_server_encoding @ linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_404 @ linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_allow_dotted_names_true @ linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_client_encoding @ linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_context_manager @ linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_context_manager_method_error @ linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_dotted_attribute @ linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_introspection1 @ linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_introspection2 @ linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_introspection3 @ linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_introspection4 @ linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_multicall @ linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_non_existing_multicall @ linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_nonascii @ linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_nonascii_methodname @ linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_partial_post @ linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_simple1 @ linux-x86_64 +test.test_xmlrpc.SimpleServerTestCase.test_unicode_host @ linux-x86_64 +test.test_xmlrpc.SimpleXMLRPCDispatcherTestCase.test_call_dispatch_func @ linux-x86_64 +test.test_xmlrpc.SimpleXMLRPCDispatcherTestCase.test_call_instance_func @ linux-x86_64 +test.test_xmlrpc.SimpleXMLRPCDispatcherTestCase.test_call_registered_func @ linux-x86_64 +test.test_xmlrpc.SimpleXMLRPCDispatcherTestCase.test_cannot_locate_func @ linux-x86_64 +test.test_xmlrpc.SimpleXMLRPCDispatcherTestCase.test_instance_has_no_func @ linux-x86_64 +test.test_xmlrpc.SimpleXMLRPCDispatcherTestCase.test_registered_func_is_none @ linux-x86_64 +test.test_xmlrpc.UseBuiltinTypesTestCase.test_cgihandler_has_use_builtin_types_flag @ linux-x86_64 +test.test_xmlrpc.UseBuiltinTypesTestCase.test_use_builtin_types @ linux-x86_64 +test.test_xmlrpc.UseBuiltinTypesTestCase.test_xmlrpcserver_has_use_builtin_types_flag @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_bug_1164912 @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_datetime_before_1900 @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_bad_dict @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_bare_datetime @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_big_int @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_big_long @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_bytes @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_double @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_encoding @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_load @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_none @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_recursive_dict @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_dump_recursive_seq @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_get_host_info @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_keepalive_disconnect @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_limit_int @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_load_extension_types @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_load_standard_types @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_loads_unsupported @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_newstyle_class @ linux-x86_64 +test.test_xmlrpc.XMLRPCTestCase.test_ssl_presence @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_yield_from.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_yield_from.txt new file mode 100644 index 0000000000..fd317e5e31 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_yield_from.txt @@ -0,0 +1,32 @@ +test.test_yield_from.TestPEP380Operation.test_attempted_yield_from_loop @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_attempting_to_send_to_non_generator @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_broken_getattr_handling @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_catching_exception_from_subgen_and_returning @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_close_with_cleared_frame @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_conversion_of_sendNone_to_next @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_delegating_close @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_delegating_generators_claim_to_be_running @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_delegating_throw @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_delegating_throw_to_non_generator @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_delegation_of_close_to_non_generator @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_delegation_of_initial_next_to_subgenerator @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_delegation_of_next_call_to_subgenerator @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_delegation_of_next_to_non_generator @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_delegation_of_send @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_delegator_is_visible_to_debugger @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_exception_in_initial_next_call @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_exception_value_crash @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_generator_return_value @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_handing_exception_while_delegating_close @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_handling_exception_while_delegating_send @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_next_and_return_with_value @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_raising_exception_in_delegated_next_call @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_raising_exception_in_initial_next_call @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_returning_value_from_delegated_throw @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_send_and_return_with_value @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_send_tuple_with_custom_generator @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_throwing_GeneratorExit_into_subgen_that_raises @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_throwing_GeneratorExit_into_subgen_that_returns @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_throwing_GeneratorExit_into_subgenerator_that_yields @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_value_attribute_of_StopIteration_exception @ linux-x86_64 +test.test_yield_from.TestPEP380Operation.test_yield_from_empty @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zipapp.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zipapp.txt new file mode 100644 index 0000000000..457627136f --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zipapp.txt @@ -0,0 +1,31 @@ +test.test_zipapp.ZipAppCmdlineTest.test_cmdline_copy @ linux-x86_64 +test.test_zipapp.ZipAppCmdlineTest.test_cmdline_copy_change_main @ linux-x86_64 +test.test_zipapp.ZipAppCmdlineTest.test_cmdline_copy_inplace @ linux-x86_64 +test.test_zipapp.ZipAppCmdlineTest.test_cmdline_create @ linux-x86_64 +test.test_zipapp.ZipAppCmdlineTest.test_info_command @ linux-x86_64 +test.test_zipapp.ZipAppCmdlineTest.test_info_error @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_content_of_copied_archive @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_create_archive @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_create_archive_default_target @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_create_archive_filter_exclude_dir @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_create_archive_with_compression @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_create_archive_with_filter @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_create_archive_with_pathlib @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_create_archive_with_subdirs @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_custom_interpreter @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_default_no_shebang @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_main_and_main_py @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_main_only_written_once @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_main_validation @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_main_written @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_modify_shebang @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_no_main @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_no_shebang_is_not_executable @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_pack_to_fileobj @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_read_from_fileobj @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_read_from_pathobj @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_read_missing_shebang @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_read_shebang @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_remove_shebang @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_shebang_is_executable @ linux-x86_64 +test.test_zipapp.ZipAppTest.test_write_shebang_to_fileobj @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zipfile.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zipfile.txt new file mode 100644 index 0000000000..0b07ed155f --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zipfile.txt @@ -0,0 +1,280 @@ +test.test_zipfile.Bzip2BadCrcTests.test_read_with_bad_crc @ linux-x86_64 +test.test_zipfile.Bzip2BadCrcTests.test_testzip_with_bad_crc @ linux-x86_64 +test.test_zipfile.Bzip2TestZip64InSmallFiles.test_basic @ linux-x86_64 +test.test_zipfile.Bzip2TestZip64InSmallFiles.test_too_many_files @ linux-x86_64 +test.test_zipfile.Bzip2TestZip64InSmallFiles.test_too_many_files_append @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithRandomBinaryFiles.test_open @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithRandomBinaryFiles.test_random_open @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithRandomBinaryFiles.test_read @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_basic @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_compresslevel_basic @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_iterlines @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_low_compression @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_open @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_open_with_pathlike @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_per_file_compresslevel @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_random_open @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_read1 @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_read1_10 @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_read_return_size @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_readline @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_readline_read @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_readlines @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_repr @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_truncated_zipfile @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_writestr_compression @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_writestr_compresslevel @ linux-x86_64 +test.test_zipfile.Bzip2TestsWithSourceFile.test_writing_errors @ linux-x86_64 +test.test_zipfile.Bzip2WriterTests.test_close_after_close @ linux-x86_64 +test.test_zipfile.Bzip2WriterTests.test_issue44439 @ linux-x86_64 +test.test_zipfile.Bzip2WriterTests.test_write_after_close @ linux-x86_64 +test.test_zipfile.CommandLineTest.test_bad_use @ linux-x86_64 +test.test_zipfile.CommandLineTest.test_create_command @ linux-x86_64 +test.test_zipfile.CommandLineTest.test_extract_command @ linux-x86_64 +test.test_zipfile.CommandLineTest.test_list_command @ linux-x86_64 +test.test_zipfile.CommandLineTest.test_test_command @ linux-x86_64 +test.test_zipfile.DecryptionTests.test_bad_password @ linux-x86_64 +test.test_zipfile.DecryptionTests.test_good_password @ linux-x86_64 +test.test_zipfile.DecryptionTests.test_no_password @ linux-x86_64 +test.test_zipfile.DecryptionTests.test_seek_tell @ linux-x86_64 +test.test_zipfile.DecryptionTests.test_unicode_password @ linux-x86_64 +test.test_zipfile.DeflateBadCrcTests.test_read_with_bad_crc @ linux-x86_64 +test.test_zipfile.DeflateBadCrcTests.test_testzip_with_bad_crc @ linux-x86_64 +test.test_zipfile.DeflateTestZip64InSmallFiles.test_basic @ linux-x86_64 +test.test_zipfile.DeflateTestZip64InSmallFiles.test_too_many_files @ linux-x86_64 +test.test_zipfile.DeflateTestZip64InSmallFiles.test_too_many_files_append @ linux-x86_64 +test.test_zipfile.DeflateTestsWithRandomBinaryFiles.test_open @ linux-x86_64 +test.test_zipfile.DeflateTestsWithRandomBinaryFiles.test_random_open @ linux-x86_64 +test.test_zipfile.DeflateTestsWithRandomBinaryFiles.test_read @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_basic @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_compresslevel_basic @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_iterlines @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_low_compression @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_open @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_open_with_pathlike @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_per_file_compression @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_per_file_compresslevel @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_random_open @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_read1 @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_read1_10 @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_read_return_size @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_readline @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_readline_read @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_readlines @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_repr @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_truncated_zipfile @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_writestr_compression @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_writestr_compresslevel @ linux-x86_64 +test.test_zipfile.DeflateTestsWithSourceFile.test_writing_errors @ linux-x86_64 +test.test_zipfile.DeflateWriterTests.test_close_after_close @ linux-x86_64 +test.test_zipfile.DeflateWriterTests.test_issue44439 @ linux-x86_64 +test.test_zipfile.DeflateWriterTests.test_write_after_close @ linux-x86_64 +test.test_zipfile.EncodedMetadataTests.test_cli_with_metadata_encoding @ linux-x86_64 +test.test_zipfile.EncodedMetadataTests.test_cli_with_metadata_encoding_extract @ linux-x86_64 +test.test_zipfile.EncodedMetadataTests.test_read_after_append @ linux-x86_64 +test.test_zipfile.EncodedMetadataTests.test_read_with_incorrect_metadata_encoding @ linux-x86_64 +test.test_zipfile.EncodedMetadataTests.test_read_with_metadata_encoding @ linux-x86_64 +test.test_zipfile.EncodedMetadataTests.test_read_with_unsuitable_metadata_encoding @ linux-x86_64 +test.test_zipfile.EncodedMetadataTests.test_read_without_metadata_encoding @ linux-x86_64 +test.test_zipfile.EncodedMetadataTests.test_write_with_metadata_encoding @ linux-x86_64 +test.test_zipfile.ExtractTests.test_extract @ linux-x86_64 +test.test_zipfile.ExtractTests.test_extract_all @ linux-x86_64 +test.test_zipfile.ExtractTests.test_extract_all_with_target @ linux-x86_64 +test.test_zipfile.ExtractTests.test_extract_all_with_target_pathlike @ linux-x86_64 +test.test_zipfile.ExtractTests.test_extract_hackers_arcnames_common_cases @ linux-x86_64 +test.test_zipfile.ExtractTests.test_extract_hackers_arcnames_posix_only @ linux-x86_64 +test.test_zipfile.ExtractTests.test_extract_with_target @ linux-x86_64 +test.test_zipfile.ExtractTests.test_extract_with_target_pathlike @ linux-x86_64 +test.test_zipfile.ExtractTests.test_sanitize_windows_name @ linux-x86_64 +test.test_zipfile.LzmaBadCrcTests.test_read_with_bad_crc @ linux-x86_64 +test.test_zipfile.LzmaBadCrcTests.test_testzip_with_bad_crc @ linux-x86_64 +test.test_zipfile.LzmaTestZip64InSmallFiles.test_basic @ linux-x86_64 +test.test_zipfile.LzmaTestZip64InSmallFiles.test_too_many_files @ linux-x86_64 +test.test_zipfile.LzmaTestZip64InSmallFiles.test_too_many_files_append @ linux-x86_64 +test.test_zipfile.LzmaTestsWithRandomBinaryFiles.test_open @ linux-x86_64 +test.test_zipfile.LzmaTestsWithRandomBinaryFiles.test_random_open @ linux-x86_64 +test.test_zipfile.LzmaTestsWithRandomBinaryFiles.test_read @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_basic @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_compresslevel_basic @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_iterlines @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_low_compression @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_open @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_open_with_pathlike @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_per_file_compresslevel @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_random_open @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_read1 @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_read1_10 @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_read_return_size @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_readline @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_readline_read @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_readlines @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_repr @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_truncated_zipfile @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_writestr_compression @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_writestr_compresslevel @ linux-x86_64 +test.test_zipfile.LzmaTestsWithSourceFile.test_writing_errors @ linux-x86_64 +test.test_zipfile.LzmaWriterTests.test_close_after_close @ linux-x86_64 +test.test_zipfile.LzmaWriterTests.test_issue44439 @ linux-x86_64 +test.test_zipfile.LzmaWriterTests.test_write_after_close @ linux-x86_64 +test.test_zipfile.OtherTests.test_bad_compression_mode @ linux-x86_64 +test.test_zipfile.OtherTests.test_bad_constructor_mode @ linux-x86_64 +test.test_zipfile.OtherTests.test_bad_open_mode @ linux-x86_64 +test.test_zipfile.OtherTests.test_change_comment_in_empty_archive @ linux-x86_64 +test.test_zipfile.OtherTests.test_change_comment_in_nonempty_archive @ linux-x86_64 +test.test_zipfile.OtherTests.test_close @ linux-x86_64 +test.test_zipfile.OtherTests.test_close_erroneous_file @ linux-x86_64 +test.test_zipfile.OtherTests.test_close_on_exception @ linux-x86_64 +test.test_zipfile.OtherTests.test_closed_zip_raises_ValueError @ linux-x86_64 +test.test_zipfile.OtherTests.test_comments @ linux-x86_64 +test.test_zipfile.OtherTests.test_create_empty_zipinfo_default_attributes @ linux-x86_64 +test.test_zipfile.OtherTests.test_create_empty_zipinfo_repr @ linux-x86_64 +test.test_zipfile.OtherTests.test_create_non_existent_file_for_append @ linux-x86_64 +test.test_zipfile.OtherTests.test_create_zipinfo_before_1980 @ linux-x86_64 +test.test_zipfile.OtherTests.test_damaged_zipfile @ linux-x86_64 +test.test_zipfile.OtherTests.test_decompress_without_3rd_party_library @ linux-x86_64 +test.test_zipfile.OtherTests.test_empty_file_raises_BadZipFile @ linux-x86_64 +test.test_zipfile.OtherTests.test_empty_zipfile @ linux-x86_64 +test.test_zipfile.OtherTests.test_exclusive_create_zip_file @ linux-x86_64 +test.test_zipfile.OtherTests.test_is_zip_erroneous_file @ linux-x86_64 +test.test_zipfile.OtherTests.test_is_zip_valid_file @ linux-x86_64 +test.test_zipfile.OtherTests.test_negative_central_directory_offset_raises_BadZipFile @ linux-x86_64 +test.test_zipfile.OtherTests.test_non_existent_file_raises_OSError @ linux-x86_64 +test.test_zipfile.OtherTests.test_null_byte_in_filename @ linux-x86_64 +test.test_zipfile.OtherTests.test_open_conflicting_handles @ linux-x86_64 +test.test_zipfile.OtherTests.test_open_empty_file @ linux-x86_64 +test.test_zipfile.OtherTests.test_open_non_existent_item @ linux-x86_64 +test.test_zipfile.OtherTests.test_open_via_zip_info @ linux-x86_64 +test.test_zipfile.OtherTests.test_read0 @ linux-x86_64 +test.test_zipfile.OtherTests.test_read_after_write_unicode_filenames @ linux-x86_64 +test.test_zipfile.OtherTests.test_read_unicode_filenames @ linux-x86_64 +test.test_zipfile.OtherTests.test_seek_tell @ linux-x86_64 +test.test_zipfile.OtherTests.test_struct_sizes @ linux-x86_64 +test.test_zipfile.OtherTests.test_unicode_comment @ linux-x86_64 +test.test_zipfile.OtherTests.test_unsupported_compression @ linux-x86_64 +test.test_zipfile.OtherTests.test_unsupported_version @ linux-x86_64 +test.test_zipfile.OtherTests.test_write_unicode_filenames @ linux-x86_64 +test.test_zipfile.OtherTests.test_writestr_extended_local_header_issue1202 @ linux-x86_64 +test.test_zipfile.OtherTests.test_zipfile_with_short_extra_field @ linux-x86_64 +test.test_zipfile.PyZipFileTests.test_write_non_pyfile @ linux-x86_64 +test.test_zipfile.PyZipFileTests.test_write_pathlike @ linux-x86_64 +test.test_zipfile.PyZipFileTests.test_write_pyfile @ linux-x86_64 +test.test_zipfile.PyZipFileTests.test_write_pyfile_bad_syntax @ linux-x86_64 +test.test_zipfile.PyZipFileTests.test_write_python_directory @ linux-x86_64 +test.test_zipfile.PyZipFileTests.test_write_python_directory_filtered @ linux-x86_64 +test.test_zipfile.PyZipFileTests.test_write_python_package @ linux-x86_64 +test.test_zipfile.PyZipFileTests.test_write_with_optimization @ linux-x86_64 +test.test_zipfile.StoredBadCrcTests.test_read_with_bad_crc @ linux-x86_64 +test.test_zipfile.StoredBadCrcTests.test_testzip_with_bad_crc @ linux-x86_64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_absolute_arcnames @ linux-x86_64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_append @ linux-x86_64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_bad_zip64_extra @ linux-x86_64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_basic @ linux-x86_64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_force_zip64 @ linux-x86_64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_generated_valid_zip64_extra @ linux-x86_64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_large_file_exception @ linux-x86_64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_too_many_files @ linux-x86_64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_too_many_files_append @ linux-x86_64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_unseekable_zip_known_filesize @ linux-x86_64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_unseekable_zip_unknown_filesize @ linux-x86_64 +test.test_zipfile.StoredTestZip64InSmallFiles.test_zip64_required_not_allowed_fail @ linux-x86_64 +test.test_zipfile.StoredTestsWithRandomBinaryFiles.test_open @ linux-x86_64 +test.test_zipfile.StoredTestsWithRandomBinaryFiles.test_random_open @ linux-x86_64 +test.test_zipfile.StoredTestsWithRandomBinaryFiles.test_read @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_absolute_arcnames @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_add_file_before_1980 @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_append_to_concatenated_zip_file @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_append_to_non_zip_file @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_append_to_zip_file @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_basic @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_compresslevel_basic @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_ignores_newline_at_end @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_ignores_stuff_appended_past_comments @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_io_on_closed_zipextfile @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_iterlines @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_open @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_open_with_pathlike @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_per_file_compresslevel @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_random_open @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_read1 @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_read1_10 @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_read_concatenated_zip_file @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_read_return_size @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_readline @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_readline_read @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_readlines @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_repr @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_truncated_zipfile @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_write_default_name @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_write_to_readonly @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_writestr_compression @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_writestr_compresslevel @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_writestr_permissions @ linux-x86_64 +test.test_zipfile.StoredTestsWithSourceFile.test_writing_errors @ linux-x86_64 +test.test_zipfile.StoredWriterTests.test_close_after_close @ linux-x86_64 +test.test_zipfile.StoredWriterTests.test_issue44439 @ linux-x86_64 +test.test_zipfile.StoredWriterTests.test_write_after_close @ linux-x86_64 +test.test_zipfile.StripExtraTests.test_multiples @ linux-x86_64 +test.test_zipfile.StripExtraTests.test_no_data @ linux-x86_64 +test.test_zipfile.StripExtraTests.test_too_short @ linux-x86_64 +test.test_zipfile.StripExtraTests.test_with_data @ linux-x86_64 +test.test_zipfile.TestExecutablePrependedZip.test_read_zip64_with_exe_prepended @ linux-x86_64 +test.test_zipfile.TestExecutablePrependedZip.test_read_zip_with_exe_prepended @ linux-x86_64 +test.test_zipfile.TestPath.test_dir_parent @ linux-x86_64 +test.test_zipfile.TestPath.test_encoding_warnings @ linux-x86_64 +test.test_zipfile.TestPath.test_extract_orig_with_implied_dirs @ linux-x86_64 +test.test_zipfile.TestPath.test_filename @ linux-x86_64 +test.test_zipfile.TestPath.test_implied_dirs_performance @ linux-x86_64 +test.test_zipfile.TestPath.test_inheritance @ linux-x86_64 +test.test_zipfile.TestPath.test_is_file_missing @ linux-x86_64 +test.test_zipfile.TestPath.test_iterdir_and_types @ linux-x86_64 +test.test_zipfile.TestPath.test_iterdir_on_file @ linux-x86_64 +test.test_zipfile.TestPath.test_joinpath @ linux-x86_64 +test.test_zipfile.TestPath.test_joinpath_constant_time @ linux-x86_64 +test.test_zipfile.TestPath.test_joinpath_multiple @ linux-x86_64 +test.test_zipfile.TestPath.test_missing_dir_parent @ linux-x86_64 +test.test_zipfile.TestPath.test_mutability @ linux-x86_64 +test.test_zipfile.TestPath.test_open @ linux-x86_64 +test.test_zipfile.TestPath.test_open_binary_invalid_args @ linux-x86_64 +test.test_zipfile.TestPath.test_open_encoding_errors @ linux-x86_64 +test.test_zipfile.TestPath.test_open_encoding_utf16 @ linux-x86_64 +test.test_zipfile.TestPath.test_open_extant_directory @ linux-x86_64 +test.test_zipfile.TestPath.test_open_missing_directory @ linux-x86_64 +test.test_zipfile.TestPath.test_open_write @ linux-x86_64 +test.test_zipfile.TestPath.test_parent @ linux-x86_64 +test.test_zipfile.TestPath.test_pathlike_construction @ linux-x86_64 +test.test_zipfile.TestPath.test_read @ linux-x86_64 +test.test_zipfile.TestPath.test_read_does_not_close @ linux-x86_64 +test.test_zipfile.TestPath.test_root_name @ linux-x86_64 +test.test_zipfile.TestPath.test_root_parent @ linux-x86_64 +test.test_zipfile.TestPath.test_root_unnamed @ linux-x86_64 +test.test_zipfile.TestPath.test_stem @ linux-x86_64 +test.test_zipfile.TestPath.test_subclass @ linux-x86_64 +test.test_zipfile.TestPath.test_subdir_is_dir @ linux-x86_64 +test.test_zipfile.TestPath.test_suffix @ linux-x86_64 +test.test_zipfile.TestPath.test_suffix_no_filename @ linux-x86_64 +test.test_zipfile.TestPath.test_suffixes @ linux-x86_64 +test.test_zipfile.TestPath.test_traverse_pathlike @ linux-x86_64 +test.test_zipfile.TestPath.test_traverse_simplediv @ linux-x86_64 +test.test_zipfile.TestPath.test_traverse_truediv @ linux-x86_64 +test.test_zipfile.TestWithDirectory.test_bug_6050 @ linux-x86_64 +test.test_zipfile.TestWithDirectory.test_create_directory_with_write @ linux-x86_64 +test.test_zipfile.TestWithDirectory.test_extract_dir @ linux-x86_64 +test.test_zipfile.TestWithDirectory.test_mkdir @ linux-x86_64 +test.test_zipfile.TestWithDirectory.test_write_dir @ linux-x86_64 +test.test_zipfile.TestWithDirectory.test_writestr_dir @ linux-x86_64 +test.test_zipfile.TestsWithMultipleOpens.test_different_file @ linux-x86_64 +test.test_zipfile.TestsWithMultipleOpens.test_interleaved @ linux-x86_64 +!test.test_zipfile.TestsWithMultipleOpens.test_many_opens @ linux-x86_64 +test.test_zipfile.TestsWithMultipleOpens.test_read_after_close @ linux-x86_64 +test.test_zipfile.TestsWithMultipleOpens.test_read_after_write @ linux-x86_64 +test.test_zipfile.TestsWithMultipleOpens.test_same_file @ linux-x86_64 +test.test_zipfile.TestsWithMultipleOpens.test_write_after_read @ linux-x86_64 +test.test_zipfile.TestsWithMultipleOpens.test_write_while_reading @ linux-x86_64 +test.test_zipfile.UnseekableTests.test_open_write @ linux-x86_64 +test.test_zipfile.UnseekableTests.test_write @ linux-x86_64 +test.test_zipfile.UnseekableTests.test_writestr @ linux-x86_64 +test.test_zipfile.ZipInfoTests.test_from_dir @ linux-x86_64 +test.test_zipfile.ZipInfoTests.test_from_file @ linux-x86_64 +test.test_zipfile.ZipInfoTests.test_from_file_bytes @ linux-x86_64 +test.test_zipfile.ZipInfoTests.test_from_file_fileno @ linux-x86_64 +test.test_zipfile.ZipInfoTests.test_from_file_pathlike @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zipfile64.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zipfile64.txt new file mode 100644 index 0000000000..d72ab1bdab --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zipfile64.txt @@ -0,0 +1,3 @@ +test.test_zipfile64.OtherTests.testMoreThan64kFiles @ linux-x86_64 +test.test_zipfile64.OtherTests.testMoreThan64kFilesAppend @ linux-x86_64 +test.test_zipfile64.TestsWithSourceFile.testDeflated @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zipimport.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zipimport.txt new file mode 100644 index 0000000000..7e6f56ffc9 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zipimport.txt @@ -0,0 +1,71 @@ +test.test_zipimport.BadFileZipImportTestCase.testBadArgs @ linux-x86_64 +test.test_zipimport.BadFileZipImportTestCase.testEmptyFile @ linux-x86_64 +test.test_zipimport.BadFileZipImportTestCase.testEmptyFilename @ linux-x86_64 +test.test_zipimport.BadFileZipImportTestCase.testFileUnreadable @ linux-x86_64 +test.test_zipimport.BadFileZipImportTestCase.testFilenameTooLong @ linux-x86_64 +test.test_zipimport.BadFileZipImportTestCase.testNoFile @ linux-x86_64 +test.test_zipimport.BadFileZipImportTestCase.testNotZipFile @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.test2038MTime @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testBadMTime @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testBadMagic @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testBadMagic2 @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testBeginningCruftAndComment @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testBoth @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testBytesPath @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testComment @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testDefaultOptimizationLevel @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testDoctestFile @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testDoctestSuite @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testEmptyPy @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testGetCompiledSource @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testGetData @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testGetSource @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testImport_WithStuff @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testImporterAttr @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testInvalidateCaches @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testLargestPossibleComment @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testMixedNamespacePackage @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testNamespacePackage @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testPackage @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testPy @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testPyc @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testSubNamespacePackage @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testSubPackage @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testTraceback @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testUncheckedHashBasedPyc @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testUnencodable @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testZipImporterMethods @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.testZipImporterMethodsInSubDirectory @ linux-x86_64 +test.test_zipimport.CompressedZipImportTestCase.test_checked_hash_based_change_pyc @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.test2038MTime @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testBadMTime @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testBadMagic @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testBadMagic2 @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testBeginningCruftAndComment @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testBoth @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testBytesPath @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testComment @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testDefaultOptimizationLevel @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testDoctestFile @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testDoctestSuite @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testEmptyPy @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testGetCompiledSource @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testGetData @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testGetSource @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testImport_WithStuff @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testImporterAttr @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testInvalidateCaches @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testLargestPossibleComment @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testMixedNamespacePackage @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testNamespacePackage @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testPackage @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testPy @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testPyc @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testSubNamespacePackage @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testSubPackage @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testTraceback @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testUncheckedHashBasedPyc @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testUnencodable @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testZipImporterMethods @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.testZipImporterMethodsInSubDirectory @ linux-x86_64 +test.test_zipimport.UncompressedZipImportTestCase.test_checked_hash_based_change_pyc @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zipimport_support.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zipimport_support.txt new file mode 100644 index 0000000000..890269b8d0 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zipimport_support.txt @@ -0,0 +1,3 @@ +test.test_zipimport_support.ZipSupportTests.test_doctest_main_issue4197 @ linux-x86_64 +test.test_zipimport_support.ZipSupportTests.test_inspect_getsource_issue4223 @ linux-x86_64 +test.test_zipimport_support.ZipSupportTests.test_pdb_issue4201 @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zlib.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zlib.txt new file mode 100644 index 0000000000..b3e3f2bba6 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zlib.txt @@ -0,0 +1,54 @@ +test.test_zlib.ChecksumTestCase.test_adler32empty @ linux-x86_64 +test.test_zlib.ChecksumTestCase.test_adler32start @ linux-x86_64 +test.test_zlib.ChecksumTestCase.test_crc32_adler32_unsigned @ linux-x86_64 +test.test_zlib.ChecksumTestCase.test_crc32empty @ linux-x86_64 +test.test_zlib.ChecksumTestCase.test_crc32start @ linux-x86_64 +test.test_zlib.ChecksumTestCase.test_penguins @ linux-x86_64 +test.test_zlib.ChecksumTestCase.test_same_as_binascii_crc32 @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_badcompresscopy @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_baddecompresscopy @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_big_compress_buffer @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_big_decompress_buffer @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_clear_unconsumed_tail @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_compresscopy @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_compressincremental @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_compressoptions @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_decompimax @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_decompinc @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_decompincflush @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_decompress_eof @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_decompress_eof_incomplete_stream @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_decompress_incomplete_stream @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_decompress_raw_with_dictionary @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_decompress_unused_data @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_decompresscopy @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_decompressmaxlen @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_decompressmaxlenflush @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_dictionary @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_dictionary_streaming @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_empty_flush @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_flush_custom_length @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_flush_large_length @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_flush_with_freed_input @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_flushes @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_keywords @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_maxlen_custom @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_maxlen_large @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_maxlenmisc @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_odd_flush @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_pair @ linux-x86_64 +test.test_zlib.CompressObjectTestCase.test_wbits @ linux-x86_64 +test.test_zlib.CompressTestCase.test_big_compress_buffer @ linux-x86_64 +test.test_zlib.CompressTestCase.test_big_decompress_buffer @ linux-x86_64 +test.test_zlib.CompressTestCase.test_custom_bufsize @ linux-x86_64 +test.test_zlib.CompressTestCase.test_incomplete_stream @ linux-x86_64 +test.test_zlib.CompressTestCase.test_keywords @ linux-x86_64 +test.test_zlib.CompressTestCase.test_large_bufsize @ linux-x86_64 +test.test_zlib.CompressTestCase.test_speech @ linux-x86_64 +test.test_zlib.CompressTestCase.test_speech128 @ linux-x86_64 +test.test_zlib.ExceptionTestCase.test_badargs @ linux-x86_64 +test.test_zlib.ExceptionTestCase.test_badcompressobj @ linux-x86_64 +test.test_zlib.ExceptionTestCase.test_baddecompressobj @ linux-x86_64 +test.test_zlib.ExceptionTestCase.test_badlevel @ linux-x86_64 +test.test_zlib.ExceptionTestCase.test_decompressobj_badflush @ linux-x86_64 +test.test_zlib.VersionTestCase.test_library_version @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zoneinfo.txt b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zoneinfo.txt new file mode 100644 index 0000000000..cb2fcfcfaa --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/test_zoneinfo.txt @@ -0,0 +1,184 @@ +test.test_zoneinfo.test_zoneinfo.CCallingConventionTest.test_clear_cache @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CCallingConventionTest.test_from_file @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CTZStrTest.test_extreme_tzstr @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CTZStrTest.test_invalid_tzstr @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CTZStrTest.test_tzstr_from_utc @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CTZStrTest.test_tzstr_localized @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CTestModule.test_available_timezones @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CTestModule.test_available_timezones_weirdzone @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CTestModule.test_dir_contains_all @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CTestModule.test_dir_unique @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CTestModule.test_exclude_posixrules @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CTestModule.test_folder_exclusions @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CTestModule.test_getattr_error @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CTzPathTest.test_env_variable @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CTzPathTest.test_env_variable_relative_paths @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CTzPathTest.test_reset_tzpath_kwarg @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CTzPathTest.test_reset_tzpath_relative_paths @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CTzPathTest.test_tzpath_attribute @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CTzPathTest.test_tzpath_type_error @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_empty_zone @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_fixed_offset_phantom_transition @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_no_tz_str @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_one_transition @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_one_zone_dst @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_tz_before_only @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CWeirdZoneTest.test_zone_very_large_timestamp @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_cache_reset_tzpath @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_clear_cache_explicit_none @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_clear_cache_one_key @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_clear_cache_two_keys @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_ephemeral_zones @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_no_cache @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoCacheTest.test_strong_refs @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_bad_keys @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_bad_keys_paths @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_bad_zones @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_fold_mutate @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_folds_and_gaps @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_folds_from_utc @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_fromutc_errors @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_key_attribute @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_repr @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_str @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_time_fixed_offset @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_time_variable_offset @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_unambiguous @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoDatetimeSubclassTest.test_utc @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoPickleTest.test_cache_hit @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoPickleTest.test_cache_miss @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoPickleTest.test_from_file @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoPickleTest.test_no_cache @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoPickleTest.test_pickle_after_from_file @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_bad_keys @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_bad_keys_paths @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_bad_zones @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_folds_and_gaps @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_folds_from_utc @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_fromutc_errors @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_key_attribute @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_repr @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_str @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_subclass_own_cache @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_time_fixed_offset @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_time_variable_offset @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_unambiguous @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoSubclassTest.test_utc @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_bad_keys @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_bad_keys_paths @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_bad_zones @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_fold_mutate @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_folds_and_gaps @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_folds_from_utc @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_fromutc_errors @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_key_attribute @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_repr @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_str @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_time_fixed_offset @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_time_variable_offset @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_unambiguous @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoTest.test_utc @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_bad_keys @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_bad_keys_paths @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_bad_zones @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_folds_and_gaps @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_folds_from_utc @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_fromutc_errors @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_key_attribute @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_repr @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_str @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_time_fixed_offset @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_time_variable_offset @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_unambiguous @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CZoneInfoV1Test.test_utc @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CallingConventionTest.test_clear_cache @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.CallingConventionTest.test_from_file @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.TZStrTest.test_extreme_tzstr @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.TZStrTest.test_invalid_tzstr @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.TZStrTest.test_tzstr_from_utc @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.TZStrTest.test_tzstr_localized @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.TestModule.test_available_timezones @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.TestModule.test_available_timezones_weirdzone @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.TestModule.test_dir_contains_all @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.TestModule.test_dir_unique @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.TestModule.test_exclude_posixrules @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.TestModule.test_folder_exclusions @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.TestModule.test_getattr_error @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.TzPathTest.test_env_variable @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.TzPathTest.test_env_variable_relative_paths @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.TzPathTest.test_reset_tzpath_kwarg @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.TzPathTest.test_reset_tzpath_relative_paths @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.TzPathTest.test_tzpath_attribute @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.TzPathTest.test_tzpath_type_error @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_empty_zone @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_fixed_offset_phantom_transition @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_no_tz_str @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_one_transition @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_one_zone_dst @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_tz_before_only @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.WeirdZoneTest.test_zone_very_large_timestamp @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_cache_reset_tzpath @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_clear_cache_explicit_none @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_clear_cache_one_key @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_clear_cache_two_keys @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_ephemeral_zones @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_no_cache @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoCacheTest.test_strong_refs @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_bad_keys @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_bad_keys_paths @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_bad_zones @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_folds_and_gaps @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_folds_from_utc @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_fromutc_errors @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_key_attribute @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_repr @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_str @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_time_fixed_offset @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_time_variable_offset @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_unambiguous @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoDatetimeSubclassTest.test_utc @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoPickleTest.test_cache_hit @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoPickleTest.test_cache_miss @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoPickleTest.test_from_file @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoPickleTest.test_no_cache @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoPickleTest.test_pickle_after_from_file @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_bad_keys @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_bad_keys_paths @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_bad_zones @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_folds_and_gaps @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_folds_from_utc @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_fromutc_errors @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_key_attribute @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_repr @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_str @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_subclass_own_cache @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_time_fixed_offset @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_time_variable_offset @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_unambiguous @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoSubclassTest.test_utc @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_bad_keys @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_bad_keys_paths @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_bad_zones @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_folds_and_gaps @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_folds_from_utc @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_fromutc_errors @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_key_attribute @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_repr @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_str @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_time_fixed_offset @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_time_variable_offset @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_unambiguous @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoTest.test_utc @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_bad_keys @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_bad_keys_paths @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_bad_zones @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_folds_and_gaps @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_folds_from_utc @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_fromutc_errors @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_key_attribute @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_repr @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_str @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_time_fixed_offset @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_time_variable_offset @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_unambiguous @ linux-x86_64 +test.test_zoneinfo.test_zoneinfo.ZoneInfoV1Test.test_utc @ linux-x86_64 diff --git a/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/todo.sh b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/todo.sh new file mode 100755 index 0000000000..264b146ad3 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tests/unittest_tags_bytecode_dsl/todo.sh @@ -0,0 +1,58 @@ +#!/bin/bash +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# The Universal Permissive License (UPL), Version 1.0 +# +# Subject to the condition set forth below, permission is hereby granted to any +# person obtaining a copy of this software, associated documentation and/or +# data (collectively the "Software"), free of charge and under any and all +# copyright rights in the Software, and any and all patent rights owned or +# freely licensable by each licensor hereunder covering either (i) the +# unmodified Software as contributed to or provided by such licensor, or (ii) +# the Larger Works (as defined below), to deal in both +# +# (a) the Software, and +# +# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +# one is included with the Software each a "Larger Work" to which the Software +# is contributed by such licensors), +# +# without restriction, including without limitation the rights to copy, create +# derivative works of, display, perform, and distribute the Software and make, +# use, sell, offer for sale, import, export, have made, and have sold the +# Software and the Larger Work(s), and to sublicense the foregoing rights on +# either these or other terms. +# +# This license is subject to the following condition: +# +# The above copyright notice and either this complete permission notice or at a +# minimum a reference to the UPL must be included in all copies or substantial +# portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +# Lists all the amd64-linux tags that are in the baseline tagged files +# and not here, i.e., the TODO list for Bytecode DSL interpreter + +parent_dir=$(dirname "$(readlink -f "$0")") +parent2_dir=$(dirname "$parent_dir") +baseline_dir="$parent2_dir/unittest_tags/" + +for path in $(ls $parent_dir/*.txt); do + f=$(basename "$path") + comm -3 <(grep 'linux-x86_64' $baseline_dir/$f | egrep -v '^(#|!)' | sed 's/@.*//' | sort) <(egrep -v '^(#|!)' $f | sed 's/@.*//' | sort) +done + +for path in $(ls $baseline_dir/*.txt); do + f=$(basename "$path") + if [ ! -f "$parent_dir/$f" ]; then + echo "COMPLETE SUITE: $f" + fi +done diff --git a/graalpython/com.oracle.graal.python.test/src/tests/util.py b/graalpython/com.oracle.graal.python.test/src/tests/util.py index 1523eb7b8a..07ce36ae5c 100644 --- a/graalpython/com.oracle.graal.python.test/src/tests/util.py +++ b/graalpython/com.oracle.graal.python.test/src/tests/util.py @@ -36,7 +36,6 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. - import sys @@ -57,4 +56,4 @@ def assert_raises(err, fn, *args, err_check=None, **kwargs): assert err_check in str(e), f"Substring '{err_check}' not found in '{str(e)}'" else: assert err_check(e) - assert raised \ No newline at end of file + assert raised diff --git a/graalpython/com.oracle.graal.python.test/src/tox/Makefile b/graalpython/com.oracle.graal.python.test/src/tox/Makefile new file mode 100644 index 0000000000..b52d77ef04 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tox/Makefile @@ -0,0 +1,13 @@ +.PHONY: clean default + +# do nothing by default +default: + +# this is why this Makefile can be useful: 'mx clean' will call this +clean: + rm -rf virtualenv + rm -rf leftpad/dist + rm -rf leftpad/build + rm -rf leftpad/.tox + rm -rf leftpad/src/leftpad.egg-info + rm -rf leftpad/tests/__pycache__ diff --git a/graalpython/com.oracle.graal.python.test/src/tox/leftpad/LICENSE.txt b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/LICENSE.txt new file mode 100644 index 0000000000..0a30a92e8b --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/LICENSE.txt @@ -0,0 +1,76 @@ +Product License - GraalVM Community Edition 20.0 Python Language +Component + +This is a release of GraalVM Community Edition 20.0 Python Language Component. +This particular copy of the software is released under Universal Permissive +License (UPL) v. 1.0. +Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved + +=========================================================================== + Universal Permissive License v. 1.0. +Copyright (c) 2018, Oracle and/or its affiliates +The Universal Permissive License (UPL), Version 1.0 +Subject to the condition set forth below, permission is hereby granted to any +person obtaining a copy of this software, associated documentation and/or data +(collectively the "Software"), free of charge and under any and all copyright +rights in the Software, and any and all patent rights owned or freely +licensable by each licensor hereunder covering either (i) the unmodified +Software as contributed to or provided by such licensor, or (ii) the Larger +Works (as defined below), to deal in both +(a) the Software, and +(b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +one is included with the Software (each a “Larger Work” to which the +Software is contributed by such licensors) +without restriction, including without limitation the rights to copy, create +derivative works of, display, perform, and distribute the Software and make, +use, sell, offer for sale, import, export, have made, and have sold the +Software and the Larger Work(s), and to sublicense the foregoing rights on +either these or other terms. +This license is subject to the following condition: +The above copyright notice and either this complete permission notice or at a +minimum a reference to the UPL must be included in all copies or substantial +portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +=========================================================================== + + WRITTEN OFFER FOR SOURCE CODE +For any software that you receive from Oracle in binary form which is licensed +under an open source license that gives you the right to receive the source +code for that binary, you can obtain a copy of the applicable source code by +visiting http://www.oracle.com/goto/opensourcecode. If the source code for the +binary was not provided to you with the binary, you can also receive a copy of +the source code on physical media by submitting a written request to the +address listed below or by sending an email to Oracle using the following link: + http://www.oracle.com/goto/opensourcecode/request. + +Oracle America, Inc. +Attn: Senior Vice President +Development and Engineering Legal +500 Oracle Parkway, 10th Floor +Redwood Shores, CA 94065 + +Your request should include: + • The name of the binary for which you are requesting the source code + • The name and version number of the Oracle product containing the binary + • The date you received the Oracle product + • Your name + • Your company name (if applicable) + • Your return mailing address and email, and + • A telephone number in the event we need to reach you. + +We may charge you a fee to cover the cost of physical media and processing. +Your request must be sent + a. within three (3) years of the date you received the Oracle product that +included the binary that is the subject of your request, or + b. in the case of code licensed under the GPL v3 for as long as Oracle +offers spare parts or customer support for that product model. + +=========================================================================== + diff --git a/graalpython/com.oracle.graal.python.test/src/tox/leftpad/MANIFEST.in b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/MANIFEST.in new file mode 100644 index 0000000000..70d63d0273 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/MANIFEST.in @@ -0,0 +1,2 @@ +include pyproject.toml +include LICENSE.txt diff --git a/graalpython/com.oracle.graal.python.test/src/tox/leftpad/pyproject.toml b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/pyproject.toml new file mode 100644 index 0000000000..c90151113d --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/pyproject.toml @@ -0,0 +1,5 @@ +[build-system] +# We pin the setuptools version to avoid any surprises from upstream +# We stick to the version that is bundled with GraalPy in ensurepip +requires = ["setuptools==47.1.0", "wheel==0.37.1"] +build-backend = "setuptools.build_meta" diff --git a/graalpython/com.oracle.graal.python.test/src/tox/leftpad/setup.cfg b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/setup.cfg new file mode 100644 index 0000000000..ef9e2d189a --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/setup.cfg @@ -0,0 +1,2 @@ +[metadata] +license_files = LICENSE.txt diff --git a/graalpython/com.oracle.graal.python.test/src/tox/leftpad/setup.py b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/setup.py new file mode 100644 index 0000000000..85d91e7180 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/setup.py @@ -0,0 +1,10 @@ +# Dummy package for testing the tox support +from setuptools import setup, find_packages +setup( + name='leftpad', + version='1.0.0', + author='GraalPy developers', + author_email='graalvm-users@oss.oracle.com', + package_dir={'': 'src'}, + packages=find_packages(where='src'), +) diff --git a/graalpython/com.oracle.graal.python.test/src/tox/leftpad/src/leftpad.egg-info/PKG-INFO b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/src/leftpad.egg-info/PKG-INFO new file mode 100644 index 0000000000..b679f9e5e6 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/src/leftpad.egg-info/PKG-INFO @@ -0,0 +1,6 @@ +Metadata-Version: 2.1 +Name: leftpad +Version: 1.0.0 +Author: GraalPy developers +Author-email: graalvm-users@oss.oracle.com +License-File: LICENSE.txt diff --git a/graalpython/com.oracle.graal.python.test/src/tox/leftpad/src/leftpad.egg-info/SOURCES.txt b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/src/leftpad.egg-info/SOURCES.txt new file mode 100644 index 0000000000..e0b7be308a --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/src/leftpad.egg-info/SOURCES.txt @@ -0,0 +1,10 @@ +LICENSE.txt +MANIFEST.in +pyproject.toml +setup.cfg +setup.py +src/leftpad/__init__.py +src/leftpad.egg-info/PKG-INFO +src/leftpad.egg-info/SOURCES.txt +src/leftpad.egg-info/dependency_links.txt +src/leftpad.egg-info/top_level.txt \ No newline at end of file diff --git a/graalpython/com.oracle.graal.python.test/src/tox/leftpad/src/leftpad.egg-info/dependency_links.txt b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/src/leftpad.egg-info/dependency_links.txt new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/src/leftpad.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/graalpython/com.oracle.graal.python.test/src/tox/leftpad/src/leftpad.egg-info/top_level.txt b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/src/leftpad.egg-info/top_level.txt new file mode 100644 index 0000000000..2abbfaae96 --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/src/leftpad.egg-info/top_level.txt @@ -0,0 +1 @@ +leftpad diff --git a/graalpython/com.oracle.graal.python.test/src/tox/leftpad/src/leftpad/__init__.py b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/src/leftpad/__init__.py new file mode 100644 index 0000000000..cb5284efbd --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/src/leftpad/__init__.py @@ -0,0 +1,7 @@ +def leftpad(s, n): + """ + Pads the string with spaces (from left) so that the resulting length is 'n'. + Longer strings are left unchanged. + """ + padlen = max(0, n - len(s)) + return ' ' * padlen + s diff --git a/graalpython/com.oracle.graal.python.test/src/tox/leftpad/tests/test_leftpad.py b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/tests/test_leftpad.py new file mode 100644 index 0000000000..a7f54b5adb --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/tests/test_leftpad.py @@ -0,0 +1,15 @@ +import leftpad +import os + +def test_leftpad_exact(): + assert leftpad.leftpad("hello", 5) == "hello" + +def test_leftpad_shorter(): + assert leftpad.leftpad("hello", 15) == " hello" + +def test_leftpad_longer(): + assert leftpad.leftpad("hello world", 5) == "hello world" + +def test_leftpad_failing(): + if 'GRAALPY_LEFTPAD_FAIL' in os.environ: + assert leftpad.leftpad("hello", 5) == "hello world" diff --git a/graalpython/com.oracle.graal.python.test/src/tox/leftpad/tox.ini b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/tox.ini new file mode 100644 index 0000000000..25d4bb489c --- /dev/null +++ b/graalpython/com.oracle.graal.python.test/src/tox/leftpad/tox.ini @@ -0,0 +1,15 @@ +[tox] +envlist = graalpy + +[testenv] +deps = + pytest==6.0.1 +commands = + pytest --assert=plain tests {posargs} + +[testenv:graalpy] +basepython=graalpy +setenv= + PIP_INDEX_URL=https://ol-graal.oraclecorp.com/nexus-cache/repository/pypi-proxy/simple/ + PIP_TRUSTED_HOST=ol-graal.oraclecorp.com +passenv = GRAALPY_LEFTPAD_FAIL GRAAL_PYTHON_ARGS diff --git a/graalpython/com.oracle.graal.python/src/META-INF/native-image/org.graalvm.py/native-image.properties b/graalpython/com.oracle.graal.python/src/META-INF/native-image/org.graalvm.py/native-image.properties deleted file mode 100644 index 8fcfded464..0000000000 --- a/graalpython/com.oracle.graal.python/src/META-INF/native-image/org.graalvm.py/native-image.properties +++ /dev/null @@ -1,6 +0,0 @@ -# This file contains native-image arguments needed to build graalpython -Args = -H:MaxRuntimeCompileMethods=20000 \ - --initialize-at-build-time=com.oracle.graal.python,com.oracle.truffle.regex,jline,org.fusesource \ - --features=com.oracle.graal.python.BouncyCastleFeature,com.oracle.graal.python.JNIFeature \ - --add-exports=org.graalvm.nativeimage/org.graalvm.nativeimage.impl=org.graalvm.py \ - --add-exports=org.graalvm.nativeimage/org.graalvm.nativeimage.impl=ALL-UNNAMED diff --git a/graalpython/com.oracle.graal.python/src/META-INF/native-image/org.graalvm.python/python-language/native-image.properties b/graalpython/com.oracle.graal.python/src/META-INF/native-image/org.graalvm.python/python-language/native-image.properties new file mode 100644 index 0000000000..0771ed8aaf --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/META-INF/native-image/org.graalvm.python/python-language/native-image.properties @@ -0,0 +1,6 @@ +# This file contains native-image arguments needed to build graalpython +Args = -H:MaxRuntimeCompileMethods=20000 \ + --initialize-at-build-time=com.oracle.graal.python,com.oracle.truffle.regex,jline,org.fusesource \ + --features=com.oracle.graal.python.BouncyCastleFeature \ + --add-exports=org.graalvm.nativeimage/org.graalvm.nativeimage.impl=org.graalvm.py \ + --add-exports=org.graalvm.nativeimage/org.graalvm.nativeimage.impl=ALL-UNNAMED diff --git a/graalpython/com.oracle.graal.python/src/META-INF/native-image/org.graalvm.py/reflect-config.json b/graalpython/com.oracle.graal.python/src/META-INF/native-image/org.graalvm.python/python-language/reflect-config.json similarity index 100% rename from graalpython/com.oracle.graal.python/src/META-INF/native-image/org.graalvm.py/reflect-config.json rename to graalpython/com.oracle.graal.python/src/META-INF/native-image/org.graalvm.python/python-language/reflect-config.json diff --git a/graalpython/com.oracle.graal.python/src/META-INF/native-image/org.graalvm.py/resource-config.json b/graalpython/com.oracle.graal.python/src/META-INF/native-image/org.graalvm.python/python-language/resource-config.json similarity index 100% rename from graalpython/com.oracle.graal.python/src/META-INF/native-image/org.graalvm.py/resource-config.json rename to graalpython/com.oracle.graal.python/src/META-INF/native-image/org.graalvm.python/python-language/resource-config.json diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/BouncyCastleFeature.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/BouncyCastleFeature.java index b870ff47d4..0d7146f58f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/BouncyCastleFeature.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/BouncyCastleFeature.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -62,6 +62,7 @@ public void afterRegistration(AfterRegistrationAccess access) { // Register runtime reflection here, not in a config, so it can be easily disabled String[] reflectiveClasses = new String[]{ + // BouncyCastle looks up the classes below "org.bouncycastle.jcajce.provider.asymmetric.COMPOSITE$Mappings", "org.bouncycastle.jcajce.provider.asymmetric.DH$Mappings", "org.bouncycastle.jcajce.provider.asymmetric.DSA$Mappings", @@ -160,9 +161,37 @@ public void afterRegistration(AfterRegistrationAccess access) { for (String name : reflectiveClasses) { try { - RuntimeReflection.register(Class.forName(name).getConstructor()); - } catch (NoSuchMethodException | SecurityException | ClassNotFoundException e) { - throw new RuntimeException("Could not register " + name + " constructor for reflective access!", e); + RuntimeReflection.register(Class.forName(name)); + RuntimeReflection.register(Class.forName(name).getConstructors()); + } catch (SecurityException | ClassNotFoundException e) { + throw new RuntimeException("Could not register " + name + " for reflective access!", e); + } + } + + // SSLBasicKeyDerivation looks up the classes below reflectively since jdk-25+23 + // See https://github.com/openjdk/jdk/pull/24393 + reflectiveClasses = new String[]{ + "com.sun.crypto.provider.HKDFKeyDerivation$HKDFSHA256", + "com.sun.crypto.provider.HKDFKeyDerivation$HKDFSHA384", + "com.sun.crypto.provider.HKDFKeyDerivation$HKDFSHA512", + "sun.security.pkcs11.P11HKDF", + }; + for (String name : reflectiveClasses) { + try { + Class.forName(name); + } catch (SecurityException | ClassNotFoundException e) { + return; + } + } + // For backwards compatibility with older JDKs, we only do this if we found + // all those classes + Security.addProvider(Security.getProvider("SunJCE")); + for (String name : reflectiveClasses) { + try { + RuntimeReflection.register(Class.forName(name)); + RuntimeReflection.register(Class.forName(name).getConstructors()); + } catch (SecurityException | ClassNotFoundException e) { + throw new RuntimeException("Could not register " + name + " for reflective access!", e); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/JNIFeature.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/JNIFeature.java deleted file mode 100644 index 68d162e6d7..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/JNIFeature.java +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python; - -import com.oracle.graal.python.runtime.PythonImageBuildOptions; -import org.graalvm.nativeimage.hosted.Feature; -import org.graalvm.nativeimage.hosted.RuntimeJNIAccess; - -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNIContext; - -public final class JNIFeature implements Feature { - @Override - public void afterRegistration(AfterRegistrationAccess access) { - if (!PythonImageBuildOptions.WITHOUT_JNI) { - try { - // {{start jni upcall config}} - // @formatter:off - // Checkstyle: stop - // DO NOT EDIT THIS PART! - // This part is automatically generated by hpy.tools.autogen.graalpy.autogen_svm_jni_upcall_config - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxDup", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxClose", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLongFromInt32t", int.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLongFromUInt32t", int.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLongFromInt64t", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLongFromUInt64t", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLongFromSizet", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLongFromSsizet", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLongAsInt32t", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLongAsUInt32t", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLongAsUInt32tMask", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLongAsInt64t", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLongAsUInt64t", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLongAsUInt64tMask", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLongAsSizet", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLongAsSsizet", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLongAsVoidPtr", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLongAsDouble", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxFloatFromDouble", double.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxFloatAsDouble", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxBoolFromBool", boolean.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLength", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxNumberCheck", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxAdd", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxSubtract", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxMultiply", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxMatrixMultiply", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxFloorDivide", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxTrueDivide", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxRemainder", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxDivmod", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxPower", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxNegative", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxPositive", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxAbsolute", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxInvert", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLshift", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxRshift", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxAnd", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxXor", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxOr", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxIndex", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLong", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxFloat", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxInPlaceAdd", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxInPlaceSubtract", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxInPlaceMultiply", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxInPlaceMatrixMultiply", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxInPlaceFloorDivide", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxInPlaceTrueDivide", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxInPlaceRemainder", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxInPlacePower", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxInPlaceLshift", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxInPlaceRshift", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxInPlaceAnd", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxInPlaceXor", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxInPlaceOr", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxCallableCheck", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxCallTupleDict", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxCall", long.class, long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxCallMethod", long.class, long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxFatalError", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxErrSetString", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxErrSetObject", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxErrSetFromErrnoWithFilename", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxErrSetFromErrnoWithFilenameObjects", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxErrOccurred")); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxErrExceptionMatches", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxErrNoMemory")); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxErrClear")); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxErrNewException", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxErrNewExceptionWithDoc", long.class, long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxErrWarnEx", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxErrWriteUnraisable", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxIsTrue", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxTypeFromSpec", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxTypeGenericNew", long.class, long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxGetAttr", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxHasAttr", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxHasAttrs", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxSetAttr", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxSetAttrs", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxGetItem", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxGetItemi", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxContains", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxSetItem", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxSetItemi", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxDelItem", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxDelItemi", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxDelItems", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxType", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxTypeCheck", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxTypeGetName", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxTypeIsSubtype", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxIs", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxAsStructObject", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxAsStructLegacy", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxAsStructType", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxAsStructLong", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxAsStructFloat", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxAsStructUnicode", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxAsStructTuple", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxAsStructList", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxTypeGetBuiltinShape", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxNew", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxRepr", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxStr", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxASCII", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxBytes", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxRichCompare", long.class, long.class, int.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxRichCompareBool", long.class, long.class, int.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxHash", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxBytesCheck", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxBytesSize", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxBytesGETSIZE", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxBytesAsString", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxBytesASSTRING", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxBytesFromString", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxBytesFromStringAndSize", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxUnicodeFromString", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxUnicodeCheck", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxUnicodeAsASCIIString", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxUnicodeAsLatin1String", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxUnicodeAsUTF8String", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxUnicodeAsUTF8AndSize", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxUnicodeFromWideChar", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxUnicodeDecodeFSDefault", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxUnicodeDecodeFSDefaultAndSize", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxUnicodeEncodeFSDefault", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxUnicodeReadChar", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxUnicodeDecodeASCII", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxUnicodeDecodeLatin1", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxUnicodeFromEncodedObject", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxUnicodeSubstring", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxListCheck", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxListNew", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxListAppend", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxDictCheck", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxDictNew")); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxDictKeys", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxDictCopy", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxTupleCheck", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxSliceUnpack", long.class, long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxImportImportModule", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxCapsuleNew", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxCapsuleGet", long.class, int.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxCapsuleIsValid", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxCapsuleSet", long.class, int.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxFromPyObject", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxAsPyObject", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxListBuilderNew", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxListBuilderSet", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxListBuilderBuild", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxListBuilderCancel", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxTupleBuilderNew", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxTupleBuilderSet", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxTupleBuilderBuild", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxTupleBuilderCancel", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxFieldLoad", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxReenterPythonExecution", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxLeavePythonExecution")); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxGlobalLoad", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxDump", long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxCompiles", long.class, long.class, int.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxEvalCode", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxContextVarNew", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxContextVarSet", long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxSetCallFunction", long.class, long.class)); - // @formatter:on - // Checkstyle: resume - // {{end jni upcall config}} - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("getHPyDebugContext")); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("getHPyTraceContext")); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxGetItems", long.class, String.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxSetItems", long.class, String.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxGetAttrs", long.class, String.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxBulkClose", long.class, int.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxUnicodeFromJCharArray", char[].class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxSequenceFromArray", long[].class, boolean.class, boolean.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxContextVarGet", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxFieldStore", long.class, long.class, long.class)); - RuntimeJNIAccess.register(GraalHPyJNIContext.class.getDeclaredMethod("ctxGlobalStore", long.class, long.class)); - } catch (NoSuchMethodException e) { - throw new RuntimeException("Could not register method for JNI access!", e); - } - try { - RuntimeJNIAccess.register(GraalHPyContext.class.getDeclaredField("hpyHandleTable")); - RuntimeJNIAccess.register(GraalHPyContext.class.getDeclaredField("hpyGlobalsTable")); - RuntimeJNIAccess.register(GraalHPyContext.class.getDeclaredField("nextHandle")); - } catch (SecurityException | NoSuchFieldException e) { - throw new RuntimeException("Could not register field for JNI access!", e); - } - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java index d15703872f..e3889b0893 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2015, Regents of the University of California * * All rights reserved. @@ -37,7 +37,6 @@ import java.io.IOException; import java.io.InputStream; import java.lang.invoke.VarHandle; -import java.lang.ref.WeakReference; import java.nio.charset.StandardCharsets; import java.nio.file.InvalidPathException; import java.util.ArrayList; @@ -53,7 +52,6 @@ import java.util.logging.Level; import org.graalvm.home.Version; -import org.graalvm.nativeimage.ImageInfo; import org.graalvm.options.OptionDescriptors; import org.graalvm.options.OptionKey; import org.graalvm.options.OptionValues; @@ -67,27 +65,27 @@ import com.oracle.graal.python.builtins.objects.PythonAbstractObject; import com.oracle.graal.python.builtins.objects.ellipsis.PEllipsis; import com.oracle.graal.python.builtins.objects.frame.PFrame; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor; import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.tuple.StructSequence; -import com.oracle.graal.python.builtins.objects.tuple.StructSequence.BuiltinTypeDescriptor; -import com.oracle.graal.python.builtins.objects.tuple.StructSequence.Descriptor; -import com.oracle.graal.python.builtins.objects.tuple.StructSequence.DescriptorCallTargets; import com.oracle.graal.python.builtins.objects.type.MroShape; import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; +import com.oracle.graal.python.compiler.BytecodeCodeUnit; import com.oracle.graal.python.compiler.CodeUnit; import com.oracle.graal.python.compiler.CompilationUnit; import com.oracle.graal.python.compiler.Compiler; import com.oracle.graal.python.compiler.RaisePythonExceptionErrorCallback; +import com.oracle.graal.python.compiler.bytecode_dsl.BytecodeDSLCompiler; +import com.oracle.graal.python.compiler.bytecode_dsl.BytecodeDSLCompiler.BytecodeDSLCompilerResult; import com.oracle.graal.python.nodes.HiddenAttr; import com.oracle.graal.python.nodes.bytecode.PBytecodeRootNode; +import com.oracle.graal.python.nodes.bytecode_dsl.BytecodeDSLCodeUnit; +import com.oracle.graal.python.nodes.call.CallDispatchers; import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.call.GenericInvokeNode; import com.oracle.graal.python.nodes.exception.TopLevelExceptionHandler; import com.oracle.graal.python.nodes.frame.GetFrameLocalsNode; import com.oracle.graal.python.nodes.frame.MaterializeFrameNode; @@ -107,7 +105,7 @@ import com.oracle.graal.python.runtime.PythonImageBuildOptions; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.Function; import com.oracle.graal.python.util.PythonUtils; import com.oracle.graal.python.util.Supplier; @@ -124,8 +122,10 @@ import com.oracle.truffle.api.TruffleLanguage; import com.oracle.truffle.api.TruffleLogger; import com.oracle.truffle.api.debug.DebuggerTags; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Idempotent; import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.instrumentation.AllocationReporter; import com.oracle.truffle.api.instrumentation.ProvidedTags; import com.oracle.truffle.api.instrumentation.StandardTags; import com.oracle.truffle.api.interop.InteropLibrary; @@ -172,6 +172,7 @@ StandardTags.WriteVariableTag.class, DebuggerTags.AlwaysHalt.class }) +@Bind.DefaultExpression("get($node)") public final class PythonLanguage extends TruffleLanguage { public static final String J_GRAALPYTHON_ID = "graalpy"; public static final TruffleString T_GRAALPYTHON_ID = tsLiteral(J_GRAALPYTHON_ID); @@ -183,20 +184,21 @@ public final class PythonLanguage extends TruffleLanguage { public static final int MICRO = 7; public static final int RELEASE_LEVEL_ALPHA = 0xA; public static final int RELEASE_LEVEL_BETA = 0xB; - public static final int RELEASE_LEVEL_GAMMA = 0xC; + public static final int RELEASE_LEVEL_CANDIDATE = 0xC; public static final int RELEASE_LEVEL_FINAL = 0xF; - public static final int RELEASE_LEVEL = RELEASE_LEVEL_ALPHA; + public static final int RELEASE_LEVEL; public static final TruffleString RELEASE_LEVEL_STRING; public static final String FROZEN_FILENAME_PREFIX = " { private static final int VERSION_BASE = '!'; static { - switch (RELEASE_LEVEL) { - case RELEASE_LEVEL_ALPHA: - RELEASE_LEVEL_STRING = tsLiteral("alpha"); - break; - case RELEASE_LEVEL_BETA: - RELEASE_LEVEL_STRING = tsLiteral("beta"); - break; - case RELEASE_LEVEL_GAMMA: - RELEASE_LEVEL_STRING = tsLiteral("rc"); - break; - case RELEASE_LEVEL_FINAL: - default: - RELEASE_LEVEL_STRING = tsLiteral("final"); - } - + // The resource file is built by mx from "graalpy-versions" project using mx substitutions. + // The actual values of the versions are computed by mx helper functions py_version_short, + // graal_version_short, and dev_tag defined in mx_graalpython.py try (InputStream is = PythonLanguage.class.getResourceAsStream("/graalpy_versions")) { int ch; if (MAJOR != (ch = is.read() - VERSION_BASE)) { @@ -235,7 +225,22 @@ public final class PythonLanguage extends TruffleLanguage { } GRAALVM_MAJOR = is.read() - VERSION_BASE; GRAALVM_MINOR = is.read() - VERSION_BASE; - is.read(); // skip GraalVM micro version + GRAALVM_MICRO = is.read() - VERSION_BASE; + RELEASE_LEVEL = is.read() - VERSION_BASE; + switch (RELEASE_LEVEL) { + case RELEASE_LEVEL_ALPHA: + RELEASE_LEVEL_STRING = tsLiteral("alpha"); + break; + case RELEASE_LEVEL_BETA: + RELEASE_LEVEL_STRING = tsLiteral("beta"); + break; + case RELEASE_LEVEL_CANDIDATE: + RELEASE_LEVEL_STRING = tsLiteral("candidate"); + break; + case RELEASE_LEVEL_FINAL: + default: + RELEASE_LEVEL_STRING = tsLiteral("final"); + } // see mx.graalpython/mx_graalpython.py:dev_tag byte[] rev = new byte[3 /* 'dev' */ + 10 /* revision */]; if (is.read(rev) == rev.length) { @@ -251,7 +256,7 @@ public final class PythonLanguage extends TruffleLanguage { public static final int VERSION_HEX = MAJOR << 24 | MINOR << 16 | MICRO << 8 | - RELEASE_LEVEL_ALPHA << 4 | + RELEASE_LEVEL << 4 | RELEASE_SERIAL; public static final String VERSION = MAJOR + "." + MINOR + "." + MICRO; // Rarely updated version of the C API, we should take it from the imported CPython version @@ -305,10 +310,24 @@ private static boolean mimeTypesComplete(ArrayList mimeJavaStrings) { public static final TruffleString[] T_DEFAULT_PYTHON_EXTENSIONS = new TruffleString[]{T_PY_EXTENSION, tsLiteral(".pyc")}; - private static final TruffleLogger LOGGER = TruffleLogger.getLogger(ID, PythonLanguage.class); + public static final TruffleLogger LOGGER = TruffleLogger.getLogger(ID, PythonLanguage.class); private static final LanguageReference REFERENCE = LanguageReference.create(PythonLanguage.class); + // Should be removed when GR-59720 - allow null location for safepoint is implemented + @CompilationFinal public RootNode unavailableSafepointLocation; + + private static final class DummyRootNode extends RootNode { + protected DummyRootNode(TruffleLanguage language) { + super(language); + } + + @Override + public Object execute(VirtualFrame frame) { + return null; + } + } + /** * This assumption will be valid if no context set a trace or profile function at any point. * Calling sys.settrace(None) or sys.setprofile(None) will not invalidate it @@ -328,6 +347,11 @@ public boolean isSingleContext() { */ public final Assumption singleThreadedAssumption = Truffle.getRuntime().createAssumption("Only a single thread is active"); + /** + * This assumption is valid as long as there is no registered class for custom interop behavior. + */ + public final Assumption noInteropTypeRegisteredAssumption = Truffle.getRuntime().createAssumption("No class for interop registered"); + /** * A thread-safe map to retrieve (and cache) singleton instances of call targets, e.g., for * Arithmetic operations, wrappers, named cext functions, etc. This reduces the number of call @@ -338,46 +362,6 @@ public boolean isSingleContext() { @CompilationFinal(dimensions = 1) private final RootCallTarget[] builtinSlotsCallTargets; - /** - * Weak hash map of call targets for builtin functions associated with named tuples generated at - * runtime from C extensions. We hold the cached call targets also weakly, because otherwise we - * would have a cycle from the value (call targets reference builtin nodes which wrap the - * descriptor) to the key. The key should be GC'ed when the corresponding generated named tuple - * class is GC'ed. - */ - private final WeakHashMap> structSequenceTargets = new WeakHashMap<>(); - - /** - * The same as {@link #structSequenceTargets}, but for builtin named tuples. There is a bounded - * statically known number of builtin named tuples. - */ - private final ConcurrentHashMap structSequenceBuiltinTargets = new ConcurrentHashMap<>(); - - public StructSequence.DescriptorCallTargets getOrCreateStructSequenceCallTargets(StructSequence.Descriptor descriptor, - Function factory) { - if (singleContext) { - return factory.apply(descriptor); - } - if (descriptor instanceof BuiltinTypeDescriptor builtinDescriptor) { - // There must be finite set of objects initialized at build time, no need for a weak map - assert !ImageInfo.inImageCode() || builtinDescriptor.wasInitializedAtBuildTime(); - return structSequenceBuiltinTargets.computeIfAbsent(builtinDescriptor, factory); - } - return getOrCreateStructSeqNonBuiltinTargets(descriptor, factory); - } - - private DescriptorCallTargets getOrCreateStructSeqNonBuiltinTargets(Descriptor descriptor, Function factory) { - synchronized (structSequenceTargets) { - WeakReference weakResult = structSequenceTargets.computeIfAbsent(descriptor, d -> new WeakReference<>(factory.apply(d))); - DescriptorCallTargets result = weakResult.get(); - if (result == null) { - result = factory.apply(descriptor); - structSequenceTargets.put(descriptor, new WeakReference<>(result)); - } - return result; - } - } - /** * We cannot initialize call targets in language ctor and the next suitable hook is context * initialization, but that is called multiple times. We use this flag to run the language @@ -385,14 +369,6 @@ private DescriptorCallTargets getOrCreateStructSeqNonBuiltinTargets(Descriptor d */ private volatile boolean isLanguageInitialized; - /** - * A map to retrieve call targets of special slot methods for a given BuiltinMethodDescriptor. - * Used to perform uncached calls to slots. The call targets are not directly part of - * descriptors because that would make them specific to a language instance. We want to have - * them global in order to be able to efficiently compare them in guards. - */ - private final ConcurrentHashMap descriptorCallTargets = new ConcurrentHashMap<>(); - private final Shape emptyShape = Shape.newBuilder().allowImplicitCastIntToDouble(false).allowImplicitCastIntToLong(true).shapeFlags(0).propertyAssumptions(true).build(); @CompilationFinal(dimensions = 1) private final Shape[] builtinTypeInstanceShapes = new Shape[PythonBuiltinClassType.VALUES.length]; @@ -415,6 +391,7 @@ private DescriptorCallTargets getOrCreateStructSeqNonBuiltinTargets(Descriptor d @CompilationFinal(dimensions = 1) private volatile Object[] engineOptionsStorage; @CompilationFinal private volatile OptionValues engineOptions; + @CompilationFinal private AllocationReporter allocationReporter; /** For fast access to the PythonThreadState object by the owning thread. */ private final ContextThreadLocal threadState = locals.createContextThreadLocal(PythonContext.PythonThreadState::new); @@ -456,7 +433,6 @@ protected void finalizeContext(PythonContext context) { context.finalizeContext(); super.finalizeContext(context); // trigger cleanup of stale entries in weak hash maps - structSequenceTargets.size(); indirectCallDataMap.size(); } @@ -471,6 +447,7 @@ protected boolean patchContext(PythonContext context, Env newEnv) { Python3Core.writeInfo("Cannot use preinitialized context."); return false; } + context.resetPerfCounter(); context.initializeHomeAndPrefixPaths(newEnv, getLanguageHome()); Python3Core.writeInfo("Using preinitialized context."); context.patch(newEnv); @@ -496,6 +473,13 @@ protected PythonContext createContext(Env env) { assert areOptionsCompatible(options, PythonOptions.createEngineOptions(env)) : "invalid engine options"; } + if (allocationReporter == null) { + allocationReporter = env.lookup(AllocationReporter.class); + } else { + // GR-61960 + // assert allocationReporter == env.lookup(AllocationReporter.class); + } + return context; } @@ -509,6 +493,11 @@ public T getEngineOption(OptionKey key) { } } + public AllocationReporter getAllocationReporter() { + assert allocationReporter != null; + return allocationReporter; + } + @Override protected OptionDescriptors getOptionDescriptors() { return PythonOptions.DESCRIPTORS; @@ -525,6 +514,7 @@ protected void initializeContext(PythonContext context) { private synchronized void initializeLanguage() { if (!isLanguageInitialized) { TpSlots.initializeBuiltinSlots(this); + unavailableSafepointLocation = new DummyRootNode(this); isLanguageInitialized = true; } } @@ -567,7 +557,7 @@ protected CallTarget parse(ParsingRequest request) { } if (MIME_TYPE_BYTECODE.equals(source.getMimeType())) { byte[] bytes = source.getBytes().toByteArray(); - CodeUnit code = MarshalModuleBuiltins.deserializeCodeUnit(bytes); + CodeUnit code = MarshalModuleBuiltins.deserializeCodeUnit(null, context, bytes); boolean internal = shouldMarkSourceInternal(context); // The original file path should be passed as the name String name = source.getName(); @@ -592,7 +582,18 @@ protected CallTarget parse(ParsingRequest request) { if (internal && !source.isInternal()) { source = Source.newBuilder(source).internal(true).build(); } - PBytecodeRootNode rootNode = PBytecodeRootNode.create(this, code, source); + RootNode rootNode = null; + + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + if (source.hasBytes()) { + // Force a character-based source so that source sections work as expected. + source = Source.newBuilder(source).content(Source.CONTENT_NONE).build(); + } + rootNode = ((BytecodeDSLCodeUnit) code).createRootNode(context, source); + } else { + rootNode = PBytecodeRootNode.create(this, (BytecodeCodeUnit) code, source); + } + return PythonUtils.getOrCreateCallTarget(rootNode); } @@ -631,10 +632,13 @@ public RootCallTarget parse(PythonContext context, Source source, InputType type EnumSet futureFeatures) { RaisePythonExceptionErrorCallback errorCb = new RaisePythonExceptionErrorCallback(source, PythonOptions.isPExceptionWithJavaStacktrace(this)); try { + if (context.getEnv().getOptions().get(PythonOptions.ParserLogFiles)) { + LOGGER.log(Level.FINE, () -> "parse '" + source.getName() + "'"); + } Parser parser = Compiler.createParser(source.getCharacters().toString(), errorCb, type, interactiveTerminal); ModTy mod = (ModTy) parser.parse(); assert mod != null; - return compileForBytecodeInterpreter(context, mod, source, topLevel, optimize, argumentNames, errorCb, futureFeatures); + return compileModule(context, mod, source, topLevel, optimize, argumentNames, errorCb, futureFeatures); } catch (PException e) { if (topLevel) { PythonUtils.getOrCreateCallTarget(new TopLevelExceptionHandler(this, e)).call(); @@ -644,20 +648,19 @@ public RootCallTarget parse(PythonContext context, Source source, InputType type } @TruffleBoundary - public RootCallTarget compileForBytecodeInterpreter(PythonContext context, ModTy mod, Source source, boolean topLevel, int optimize, List argumentNames, + public RootCallTarget compileModule(PythonContext context, ModTy modIn, Source source, boolean topLevel, int optimize, List argumentNames, RaisePythonExceptionErrorCallback errorCallback, int flags) { - return compileForBytecodeInterpreter(context, mod, source, topLevel, optimize, argumentNames, errorCallback, FutureFeature.fromFlags(flags)); + return compileModule(context, modIn, source, topLevel, optimize, argumentNames, errorCallback, FutureFeature.fromFlags(flags)); } @TruffleBoundary - public RootCallTarget compileForBytecodeInterpreter(PythonContext context, ModTy modIn, Source source, boolean topLevel, int optimize, List argumentNames, + public RootCallTarget compileModule(PythonContext context, ModTy modIn, Source source, boolean topLevel, int optimize, List argumentNames, RaisePythonExceptionErrorCallback errorCallback, EnumSet futureFeatures) { RaisePythonExceptionErrorCallback errorCb = errorCallback; if (errorCb == null) { errorCb = new RaisePythonExceptionErrorCallback(source, PythonOptions.isPExceptionWithJavaStacktrace(this)); } try { - Compiler compiler = new Compiler(errorCb); boolean hasArguments = argumentNames != null && !argumentNames.isEmpty(); final ModTy mod; if (hasArguments) { @@ -665,9 +668,14 @@ public RootCallTarget compileForBytecodeInterpreter(PythonContext context, ModTy } else { mod = modIn; } - CompilationUnit cu = compiler.compile(mod, EnumSet.noneOf(Compiler.Flags.class), optimize, futureFeatures); - CodeUnit co = cu.assemble(); - RootNode rootNode = PBytecodeRootNode.create(this, co, source, errorCb); + + RootNode rootNode; + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + rootNode = compileForBytecodeDSLInterpreter(context, mod, source, optimize, errorCb, futureFeatures); + } else { + rootNode = compileForBytecodeInterpreter(mod, source, optimize, errorCb, futureFeatures); + } + if (topLevel) { GilNode gil = GilNode.getUncached(); boolean wasAcquired = gil.acquire(context, rootNode); @@ -692,6 +700,19 @@ public RootCallTarget compileForBytecodeInterpreter(PythonContext context, ModTy } } + private RootNode compileForBytecodeInterpreter(ModTy mod, Source source, int optimize, RaisePythonExceptionErrorCallback errorCallback, EnumSet futureFeatures) { + Compiler compiler = new Compiler(errorCallback); + CompilationUnit cu = compiler.compile(mod, EnumSet.noneOf(Compiler.Flags.class), optimize, futureFeatures); + BytecodeCodeUnit co = cu.assemble(); + return PBytecodeRootNode.create(this, co, source, errorCallback); + } + + private RootNode compileForBytecodeDSLInterpreter(PythonContext context, ModTy mod, Source source, int optimize, + RaisePythonExceptionErrorCallback errorCallback, EnumSet futureFeatures) { + BytecodeDSLCompilerResult result = BytecodeDSLCompiler.compile(this, context, mod, source, optimize, errorCallback, futureFeatures); + return result.rootNode(); + } + private static ModTy transformASTForExecutionWithArguments(List argumentNames, ModTy mod) { NodeFactory nodeFactory = new NodeFactory(); ArgTy[] astArgArray = new ArgTy[argumentNames.size()]; @@ -753,7 +774,7 @@ public ExecutableNode parse(InlineParsingRequest request) { RootCallTarget callTarget = parse(context, request.getSource(), InputType.EVAL, false, 0, false, null, EnumSet.noneOf(FutureFeature.class)); return new ExecutableNode(this) { @Child private GilNode gilNode = GilNode.create(); - @Child private GenericInvokeNode invokeNode = GenericInvokeNode.create(); + @Child private CallDispatchers.SimpleIndirectInvokeNode invokeNode = CallDispatchers.SimpleIndirectInvokeNode.create(); @Child private MaterializeFrameNode materializeFrameNode = MaterializeFrameNode.create(); @Child private GetFrameLocalsNode getFrameLocalsNode = GetFrameLocalsNode.create(); @@ -767,7 +788,7 @@ public Object execute(VirtualFrame frame) { PArguments.setGlobals(arguments, PArguments.getGlobals(frame)); boolean wasAcquired = gilNode.acquire(); try { - return invokeNode.execute(callTarget, arguments); + return invokeNode.executeCached(frame, callTarget, arguments); } finally { gilNode.release(wasAcquired); } @@ -778,8 +799,8 @@ public Object execute(VirtualFrame frame) { @Override protected Object getLanguageView(PythonContext context, Object value) { assert !(value instanceof PythonAbstractObject); - PythonObjectFactory factory = PythonObjectFactory.getUncached(); InteropLibrary interopLib = InteropLibrary.getFactory().getUncached(value); + PythonLanguage language = context.getLanguage(); try { if (interopLib.isBoolean(value)) { if (interopLib.asBoolean(value)) { @@ -788,21 +809,21 @@ protected Object getLanguageView(PythonContext context, Object value) { return context.getFalse(); } } else if (interopLib.isString(value)) { - return factory.createString(interopLib.asTruffleString(value).switchEncodingUncached(TS_ENCODING)); + return PFactory.createString(language, interopLib.asTruffleString(value).switchEncodingUncached(TS_ENCODING)); } else if (value instanceof Byte || value instanceof Short || value instanceof Integer || value instanceof Long) { // TODO: (tfel) once the interop protocol allows us to // distinguish fixed point from floating point reliably, we can // remove this branch - return factory.createInt(interopLib.asLong(value)); + return PFactory.createInt(language, interopLib.asLong(value)); } else if (value instanceof Float || value instanceof Double) { // TODO: (tfel) once the interop protocol allows us to // distinguish fixed point from floating point reliably, we can // remove this branch - return factory.createFloat(interopLib.asDouble(value)); + return PFactory.createFloat(language, interopLib.asDouble(value)); } else if (interopLib.fitsInLong(value)) { - return factory.createInt(interopLib.asLong(value)); + return PFactory.createInt(language, interopLib.asLong(value)); } else if (interopLib.fitsInDouble(value)) { - return factory.createFloat(interopLib.asDouble(value)); + return PFactory.createFloat(language, interopLib.asDouble(value)); } else { return new ForeignLanguageView(value); } @@ -946,7 +967,7 @@ public static Source newSource(PythonContext ctxt, TruffleFile src, String name) } private static Source newSource(PythonContext context, SourceBuilder srcBuilder) throws IOException { - if (getPythonOS() == PLATFORM_WIN32 && ImageInfo.inImageBuildtimeCode()) { + if (getPythonOS() == PLATFORM_WIN32 && context.getEnv().isPreInitialization()) { // canonicalization on windows means something else than on linux and causes issues // with paths srcBuilder.canonicalizePath(false); @@ -1004,7 +1025,7 @@ protected void initializeThread(PythonContext context, Thread thread) { @Override protected void disposeThread(PythonContext context, Thread thread) { - context.disposeThread(thread); + context.disposeThread(thread, false); } public Shape getEmptyShape() { @@ -1028,13 +1049,19 @@ public Shape getBuiltinTypeInstanceShape(PythonBuiltinClassType type) { Shape shape = builtinTypeInstanceShapes[ordinal]; if (shape == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); - Shape.DerivedBuilder shapeBuilder = Shape.newBuilder(getEmptyShape()).addConstantProperty(HiddenAttr.getClassHiddenKey(), type, 0); - if (!type.isBuiltinWithDict()) { - shapeBuilder.shapeFlags(PythonObject.HAS_SLOTS_BUT_NO_DICT_FLAG); - } - shape = shapeBuilder.build(); - builtinTypeInstanceShapes[ordinal] = shape; + shape = createBuiltinShape(type, ordinal); + } + return shape; + } + + private Shape createBuiltinShape(PythonBuiltinClassType type, int ordinal) { + Shape shape; + Shape.DerivedBuilder shapeBuilder = Shape.newBuilder(getEmptyShape()).addConstantProperty(HiddenAttr.getClassHiddenKey(), type, 0); + if (!type.isBuiltinWithDict()) { + shapeBuilder.shapeFlags(PythonObject.HAS_SLOTS_BUT_NO_DICT_FLAG); } + shape = shapeBuilder.build(); + builtinTypeInstanceShapes[ordinal] = shape; return shape; } @@ -1088,11 +1115,16 @@ public RootCallTarget createCachedCallTarget(Function } public RootCallTarget createCachedCallTarget(Function rootNodeFunction, Class nodeClass1, Class nodeClass2, String name) { - // for slot wrappers: the root node may be wrapping a helper wrapper node implementing the - // wrapper logic and the bare slot node itself + // for slot call targets and wrappers: the root node may be wrapping a helper wrapper node + // implementing the slot wrapper logic and the bare slot node itself return createCachedCallTargetUnsafe(rootNodeFunction, true, nodeClass1, nodeClass2, name); } + public RootCallTarget createCachedCallTarget(Function rootNodeFunction, Class nodeClass1, Class nodeClass2, PythonBuiltinClassType type, String name) { + // for slot wrappers: the type is used for validation of "self" type + return createCachedCallTargetUnsafe(rootNodeFunction, true, nodeClass1, nodeClass2, type, name); + } + /** * Caches call targets for external C functions created by extensions at runtime. *

      @@ -1148,28 +1180,12 @@ private RootCallTarget createCachedCallTargetUnsafe(Function { - T boundToObject(PythonBuiltinClassType binding, PythonObjectFactory factory); + T boundToObject(PythonBuiltinClassType binding, PythonLanguage language); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Builtin.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Builtin.java index 18ac9d4ed0..a99c4ccccd 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Builtin.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Builtin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -45,10 +45,6 @@ */ PythonOS os() default PythonOS.PLATFORM_ANY; - PythonBuiltinClassType constructsClass() default PythonBuiltinClassType.nil; - - PythonBuiltinClassType[] base() default {}; - int minNumOfPositionalArgs() default 0; int maxNumOfPositionalArgs() default -1; @@ -63,16 +59,12 @@ boolean takesVarArgs() default false; - boolean varArgsMarker() default false; - boolean takesVarKeywordArgs() default false; String[] parameterNames() default {}; String[] keywordOnlyNames() default {}; - boolean isPublic() default true; - boolean isClassmethod() default false; boolean isStaticmethod() default false; @@ -97,15 +89,6 @@ */ boolean declaresExplicitSelf() default false; - /** - * Declares that this builtin needs to reverse the first and second argument it receives. This - * implements the reverse operation wrappers from CPython. This only applies to binary and - * ternary nodes. - * - * @see com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode BuiltinFunctionRootNode - */ - boolean reverseOperation() default false; - String raiseErrorName() default StringLiterals.J_EMPTY_STRING; boolean forceSplitDirectCalls() default false; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/CoreFunctions.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/CoreFunctions.java index fedb82582b..9e9bf4955b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/CoreFunctions.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/CoreFunctions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -40,11 +40,7 @@ */ PythonOS os() default PythonOS.PLATFORM_ANY; - String publicName() default ""; - PythonBuiltinClassType[] extendClasses() default {}; - String pythonFile() default ""; - boolean isEager() default false; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java index 0d28f5e6e1..20b24d7a73 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -32,19 +32,27 @@ import static com.oracle.graal.python.nodes.BuiltinNames.T_NT; import static com.oracle.graal.python.nodes.BuiltinNames.T_STDERR; import static com.oracle.graal.python.nodes.BuiltinNames.T_SYS; +import static com.oracle.graal.python.nodes.BuiltinNames.T_UNICODEDATA; +import static com.oracle.graal.python.nodes.BuiltinNames.T_ZIPIMPORT; +import static com.oracle.graal.python.nodes.BuiltinNames.T__SRE; +import static com.oracle.graal.python.nodes.BuiltinNames.T__SYSCONFIG; import static com.oracle.graal.python.nodes.BuiltinNames.T__WEAKREF; import static com.oracle.graal.python.nodes.BuiltinNames.T___BUILTINS__; +import static com.oracle.graal.python.nodes.BuiltinNames.T___GRAALPYTHON__; import static com.oracle.graal.python.nodes.BuiltinNames.T___IMPORT__; +import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DOC__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___PACKAGE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REPR__; import static com.oracle.graal.python.nodes.StringLiterals.J_PY_EXTENSION; import static com.oracle.graal.python.nodes.StringLiterals.T_DOT; import static com.oracle.graal.python.nodes.StringLiterals.T_GRAALPYTHON; +import static com.oracle.graal.python.nodes.StringLiterals.T_JAVA; import static com.oracle.graal.python.nodes.StringLiterals.T_REF; import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; @@ -53,18 +61,14 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.ServiceLoader; import java.util.logging.Level; -import org.graalvm.nativeimage.ImageInfo; - import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.AbcModuleBuiltins; import com.oracle.graal.python.builtins.modules.ArrayModuleBuiltins; import com.oracle.graal.python.builtins.modules.AsyncioModuleBuiltins; import com.oracle.graal.python.builtins.modules.AtexitModuleBuiltins; import com.oracle.graal.python.builtins.modules.BinasciiModuleBuiltins; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors; import com.oracle.graal.python.builtins.modules.BuiltinFunctions; import com.oracle.graal.python.builtins.modules.CmathModuleBuiltins; import com.oracle.graal.python.builtins.modules.CodecsModuleBuiltins; @@ -76,16 +80,12 @@ import com.oracle.graal.python.builtins.modules.FaulthandlerModuleBuiltins; import com.oracle.graal.python.builtins.modules.FcntlModuleBuiltins; import com.oracle.graal.python.builtins.modules.GcModuleBuiltins; -import com.oracle.graal.python.builtins.modules.GraalHPyDebugModuleBuiltins; -import com.oracle.graal.python.builtins.modules.GraalHPyTraceModuleBuiltins; -import com.oracle.graal.python.builtins.modules.GraalHPyUniversalModuleBuiltins; import com.oracle.graal.python.builtins.modules.GraalPythonModuleBuiltins; import com.oracle.graal.python.builtins.modules.ImpModuleBuiltins; import com.oracle.graal.python.builtins.modules.ItertoolsModuleBuiltins; import com.oracle.graal.python.builtins.modules.JArrayModuleBuiltins; import com.oracle.graal.python.builtins.modules.JavaModuleBuiltins; import com.oracle.graal.python.builtins.modules.LocaleModuleBuiltins; -import com.oracle.graal.python.builtins.modules.LsprofModuleBuiltins; import com.oracle.graal.python.builtins.modules.MMapModuleBuiltins; import com.oracle.graal.python.builtins.modules.MarshalModuleBuiltins; import com.oracle.graal.python.builtins.modules.MathModuleBuiltins; @@ -97,7 +97,6 @@ import com.oracle.graal.python.builtins.modules.PosixShMemModuleBuiltins; import com.oracle.graal.python.builtins.modules.PosixSubprocessModuleBuiltins; import com.oracle.graal.python.builtins.modules.PwdModuleBuiltins; -import com.oracle.graal.python.builtins.modules.PyExpatModuleBuiltins; import com.oracle.graal.python.builtins.modules.QueueModuleBuiltins; import com.oracle.graal.python.builtins.modules.RandomModuleBuiltins; import com.oracle.graal.python.builtins.modules.ReadlineModuleBuiltins; @@ -107,6 +106,7 @@ import com.oracle.graal.python.builtins.modules.SelectModuleBuiltins; import com.oracle.graal.python.builtins.modules.SignalModuleBuiltins; import com.oracle.graal.python.builtins.modules.SocketModuleBuiltins; +import com.oracle.graal.python.builtins.modules.StatResultBuiltins; import com.oracle.graal.python.builtins.modules.StringModuleBuiltins; import com.oracle.graal.python.builtins.modules.StructModuleBuiltins; import com.oracle.graal.python.builtins.modules.SysModuleBuiltins; @@ -166,7 +166,6 @@ import com.oracle.graal.python.builtins.modules.functools.PartialBuiltins; import com.oracle.graal.python.builtins.modules.hashlib.Blake2ModuleBuiltins; import com.oracle.graal.python.builtins.modules.hashlib.Blake2bObjectBuiltins; -import com.oracle.graal.python.builtins.modules.hashlib.Blake2sObjectBuiltins; import com.oracle.graal.python.builtins.modules.hashlib.DigestObjectBuiltins; import com.oracle.graal.python.builtins.modules.hashlib.HashObjectBuiltins; import com.oracle.graal.python.builtins.modules.hashlib.HashlibModuleBuiltins; @@ -197,6 +196,8 @@ import com.oracle.graal.python.builtins.modules.json.JSONEncoderBuiltins; import com.oracle.graal.python.builtins.modules.json.JSONModuleBuiltins; import com.oracle.graal.python.builtins.modules.json.JSONScannerBuiltins; +import com.oracle.graal.python.builtins.modules.lsprof.LsprofModuleBuiltins; +import com.oracle.graal.python.builtins.modules.lsprof.ProfilerBuiltins; import com.oracle.graal.python.builtins.modules.lzma.LZMACompressorBuiltins; import com.oracle.graal.python.builtins.modules.lzma.LZMADecompressorBuiltins; import com.oracle.graal.python.builtins.modules.lzma.LZMAModuleBuiltins; @@ -235,6 +236,8 @@ import com.oracle.graal.python.builtins.objects.contextvars.TokenBuiltins; import com.oracle.graal.python.builtins.objects.deque.DequeBuiltins; import com.oracle.graal.python.builtins.objects.deque.DequeIterBuiltins; +import com.oracle.graal.python.builtins.objects.deque.DequeIterCommonBuiltins; +import com.oracle.graal.python.builtins.objects.deque.DequeRevIterBuiltins; import com.oracle.graal.python.builtins.objects.dict.DefaultDictBuiltins; import com.oracle.graal.python.builtins.objects.dict.DictBuiltins; import com.oracle.graal.python.builtins.objects.dict.DictReprBuiltin; @@ -243,6 +246,7 @@ import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.ellipsis.EllipsisBuiltins; import com.oracle.graal.python.builtins.objects.enumerate.EnumerateBuiltins; +import com.oracle.graal.python.builtins.objects.exception.AttributeErrorBuiltins; import com.oracle.graal.python.builtins.objects.exception.BaseExceptionBuiltins; import com.oracle.graal.python.builtins.objects.exception.BaseExceptionGroupBuiltins; import com.oracle.graal.python.builtins.objects.exception.ImportErrorBuiltins; @@ -257,6 +261,12 @@ import com.oracle.graal.python.builtins.objects.exception.UnicodeTranslateErrorBuiltins; import com.oracle.graal.python.builtins.objects.floats.FloatBuiltins; import com.oracle.graal.python.builtins.objects.floats.PFloat; +import com.oracle.graal.python.builtins.objects.foreign.ForeignAbstractClassBuiltins; +import com.oracle.graal.python.builtins.objects.foreign.ForeignBooleanBuiltins; +import com.oracle.graal.python.builtins.objects.foreign.ForeignExecutableBuiltins; +import com.oracle.graal.python.builtins.objects.foreign.ForeignInstantiableBuiltins; +import com.oracle.graal.python.builtins.objects.foreign.ForeignIterableBuiltins; +import com.oracle.graal.python.builtins.objects.foreign.ForeignNumberBuiltins; import com.oracle.graal.python.builtins.objects.foreign.ForeignObjectBuiltins; import com.oracle.graal.python.builtins.objects.frame.FrameBuiltins; import com.oracle.graal.python.builtins.objects.function.AbstractFunctionBuiltins; @@ -274,13 +284,13 @@ import com.oracle.graal.python.builtins.objects.getsetdescriptor.MemberDescriptorBuiltins; import com.oracle.graal.python.builtins.objects.ints.IntBuiltins; import com.oracle.graal.python.builtins.objects.ints.PInt; -import com.oracle.graal.python.builtins.objects.iterator.ForeignIteratorBuiltins; import com.oracle.graal.python.builtins.objects.iterator.IteratorBuiltins; -import com.oracle.graal.python.builtins.objects.iterator.PZipBuiltins; import com.oracle.graal.python.builtins.objects.iterator.SentinelIteratorBuiltins; +import com.oracle.graal.python.builtins.objects.iterator.ZipBuiltins; import com.oracle.graal.python.builtins.objects.itertools.AccumulateBuiltins; import com.oracle.graal.python.builtins.objects.itertools.ChainBuiltins; import com.oracle.graal.python.builtins.objects.itertools.CombinationsBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.CombinationsWithReplacementBuiltins; import com.oracle.graal.python.builtins.objects.itertools.CompressBuiltins; import com.oracle.graal.python.builtins.objects.itertools.CountBuiltins; import com.oracle.graal.python.builtins.objects.itertools.CycleBuiltins; @@ -308,6 +318,7 @@ import com.oracle.graal.python.builtins.objects.method.BuiltinClassmethodBuiltins; import com.oracle.graal.python.builtins.objects.method.BuiltinFunctionOrMethodBuiltins; import com.oracle.graal.python.builtins.objects.method.ClassmethodBuiltins; +import com.oracle.graal.python.builtins.objects.method.ClassmethodCommonBuiltins; import com.oracle.graal.python.builtins.objects.method.DecoratedMethodBuiltins; import com.oracle.graal.python.builtins.objects.method.InstancemethodBuiltins; import com.oracle.graal.python.builtins.objects.method.MethodBuiltins; @@ -345,16 +356,18 @@ import com.oracle.graal.python.builtins.objects.struct.StructBuiltins; import com.oracle.graal.python.builtins.objects.struct.StructUnpackIteratorBuiltins; import com.oracle.graal.python.builtins.objects.superobject.SuperBuiltins; -import com.oracle.graal.python.builtins.objects.thread.LockBuiltins; +import com.oracle.graal.python.builtins.objects.thread.CommonLockBuiltins; +import com.oracle.graal.python.builtins.objects.thread.LockTypeBuiltins; import com.oracle.graal.python.builtins.objects.thread.RLockBuiltins; -import com.oracle.graal.python.builtins.objects.thread.ThreadBuiltins; import com.oracle.graal.python.builtins.objects.thread.ThreadLocalBuiltins; import com.oracle.graal.python.builtins.objects.tokenize.TokenizerIterBuiltins; import com.oracle.graal.python.builtins.objects.traceback.TracebackBuiltins; +import com.oracle.graal.python.builtins.objects.tuple.InstantiableStructSequenceBuiltins; +import com.oracle.graal.python.builtins.objects.tuple.StructSequenceBuiltins; import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins; import com.oracle.graal.python.builtins.objects.tuple.TupleGetterBuiltins; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeBuiltins; import com.oracle.graal.python.builtins.objects.types.GenericAliasBuiltins; @@ -365,16 +378,18 @@ import com.oracle.graal.python.nodes.BuiltinNames; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromPythonObjectNode; import com.oracle.graal.python.nodes.attributes.WriteAttributeToPythonObjectNode; -import com.oracle.graal.python.nodes.call.GenericInvokeNode; +import com.oracle.graal.python.nodes.call.CallDispatchers; +import com.oracle.graal.python.nodes.object.GetForeignObjectClassNode; import com.oracle.graal.python.nodes.statement.AbstractImportNode; import com.oracle.graal.python.pegparser.FutureFeature; import com.oracle.graal.python.pegparser.InputType; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonImageBuildOptions; import com.oracle.graal.python.runtime.PythonOptions; +import com.oracle.graal.python.runtime.exception.ExceptionUtils; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.interop.PythonMapScope; -import com.oracle.graal.python.runtime.object.PythonObjectSlowPathFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.Supplier; import com.oracle.truffle.api.CallTarget; @@ -383,15 +398,17 @@ import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.TruffleFile; +import com.oracle.truffle.api.TruffleLanguage; import com.oracle.truffle.api.TruffleLanguage.Env; import com.oracle.truffle.api.TruffleLogger; +import com.oracle.truffle.api.TruffleOptions; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.object.Shape; import com.oracle.truffle.api.source.Source; import com.oracle.truffle.api.strings.TruffleString; /** - * The core is intended to the immutable part of the interpreter, including most modules and most - * types. The core is embedded, using inheritance, into {@link PythonContext} to avoid indirection - * through an extra field in the context. + * The core is a historical artifact and PythonContext and Python3Core should be merged. */ public abstract class Python3Core { private static final int REC_LIM = 1000; @@ -407,40 +424,32 @@ public abstract class Python3Core { private static TruffleString[] initializeCoreFiles() { // Order matters! - List coreFiles = new ArrayList<>(Arrays.asList( - toTruffleStringUncached("__graalpython__"), - toTruffleStringUncached("_weakref"), - toTruffleStringUncached("unicodedata"), - toTruffleStringUncached("_sre"), - toTruffleStringUncached("_sysconfig"), - toTruffleStringUncached("java"), - toTruffleStringUncached("pip_hook"))); - // add service loader defined python file extensions - if (!ImageInfo.inImageRuntimeCode()) { - ServiceLoader providers = ServiceLoader.load(PythonBuiltins.class, Python3Core.class.getClassLoader()); - PythonOS currentOs = PythonOS.getPythonOS(); - for (PythonBuiltins builtin : providers) { - CoreFunctions annotation = builtin.getClass().getAnnotation(CoreFunctions.class); - if (!annotation.pythonFile().isEmpty() && - (annotation.os() == PythonOS.PLATFORM_ANY || annotation.os() == currentOs)) { - coreFiles.add(toTruffleStringUncached(annotation.pythonFile())); - } - } + List coreFiles = List.of( + T___GRAALPYTHON__, + T__WEAKREF, + T_UNICODEDATA, + T__SRE, + T__SYSCONFIG, + T_JAVA, + toTruffleStringUncached("pip_hook")); + if (PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32) { + coreFiles = new ArrayList<>(coreFiles); + coreFiles.add(toTruffleStringUncached("_nt")); } - coreFiles.removeAll(Arrays.asList(new TruffleString[]{null})); - return coreFiles.toArray(new TruffleString[coreFiles.size()]); + + return coreFiles.toArray(new TruffleString[0]); } private final PythonBuiltins[] builtins; - private static final boolean hasProfilerTool; + public static final boolean HAS_PROFILER_TOOL; static { Class c = null; try { c = Class.forName("com.oracle.truffle.tools.profiler.CPUSampler"); } catch (LinkageError | ClassNotFoundException e) { } - hasProfilerTool = c != null; + HAS_PROFILER_TOOL = c != null; c = null; } @@ -460,12 +469,13 @@ private static void filterBuiltins(List builtins) { builtins.removeAll(toRemove); } - private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed, boolean socketIOAllowed) { - List builtins = new ArrayList<>(Arrays.asList(new BuiltinConstructors(), + private static PythonBuiltins[] initializeBuiltins(TruffleLanguage.Env env) { + List builtins = new ArrayList<>(Arrays.asList( new AbcModuleBuiltins(), new BuiltinFunctions(), new DecoratedMethodBuiltins(), new ClassmethodBuiltins(), + new ClassmethodCommonBuiltins(), new StaticmethodBuiltins(), new InstancemethodBuiltins(), new SimpleNamespaceBuiltins(), @@ -481,6 +491,12 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed, new TypeBuiltins(), new IntBuiltins(), new ForeignObjectBuiltins(), + new ForeignNumberBuiltins(), + new ForeignBooleanBuiltins(), + new ForeignAbstractClassBuiltins(), + new ForeignExecutableBuiltins(), + new ForeignInstantiableBuiltins(), + new ForeignIterableBuiltins(), new ListBuiltins(), new DictBuiltins(), new DictReprBuiltin(), @@ -489,20 +505,21 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed, new RangeBuiltins(), new SliceBuiltins(), new TupleBuiltins(), + new StructSequenceBuiltins(), + new InstantiableStructSequenceBuiltins(), new StringBuiltins(), new BaseSetBuiltins(), new SetBuiltins(), new FrozenSetBuiltins(), new IteratorBuiltins(), new ReversedBuiltins(), - new PZipBuiltins(), + new ZipBuiltins(), new EnumerateBuiltins(), new MapBuiltins(), new NotImplementedBuiltins(), new NoneBuiltins(), new EllipsisBuiltins(), new SentinelIteratorBuiltins(), - new ForeignIteratorBuiltins(), new GeneratorBuiltins(), new CoroutineBuiltins(), new CoroutineWrapperBuiltins(), @@ -535,6 +552,7 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed, new CryptModuleBuiltins(), new ScandirIteratorBuiltins(), new DirEntryBuiltins(), + new StatResultBuiltins(), new ImpModuleBuiltins(), new ArrayModuleBuiltins(), new ArrayBuiltins(), @@ -558,6 +576,7 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed, new GenericAliasIteratorBuiltins(), new com.oracle.graal.python.builtins.objects.types.UnionTypeBuiltins(), // exceptions + new AttributeErrorBuiltins(), new SystemExitBuiltins(), new ImportErrorBuiltins(), new StopIterationBuiltins(), @@ -617,7 +636,9 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed, new CodecsModuleBuiltins(), new CodecsTruffleModuleBuiltins(), new DequeBuiltins(), + new DequeIterCommonBuiltins(), new DequeIterBuiltins(), + new DequeRevIterBuiltins(), new OrderedDictBuiltins(), new OrderedDictKeysBuiltins(), new OrderedDictValuesBuiltins(), @@ -632,9 +653,9 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed, new JSONModuleBuiltins(), new SREModuleBuiltins(), new AstModuleBuiltins(), - PythonImageBuildOptions.WITHOUT_NATIVE_POSIX && (PythonImageBuildOptions.WITHOUT_JAVA_INET || !socketIOAllowed) ? null : new SelectModuleBuiltins(), - PythonImageBuildOptions.WITHOUT_NATIVE_POSIX && (PythonImageBuildOptions.WITHOUT_JAVA_INET || !socketIOAllowed) ? null : new SocketModuleBuiltins(), - PythonImageBuildOptions.WITHOUT_NATIVE_POSIX && (PythonImageBuildOptions.WITHOUT_JAVA_INET || !socketIOAllowed) ? null : new SocketBuiltins(), + PythonImageBuildOptions.WITHOUT_NATIVE_POSIX && (PythonImageBuildOptions.WITHOUT_JAVA_INET || !env.isSocketIOAllowed()) ? null : new SelectModuleBuiltins(), + PythonImageBuildOptions.WITHOUT_NATIVE_POSIX && (PythonImageBuildOptions.WITHOUT_JAVA_INET || !env.isSocketIOAllowed()) ? null : new SocketModuleBuiltins(), + PythonImageBuildOptions.WITHOUT_NATIVE_POSIX && (PythonImageBuildOptions.WITHOUT_JAVA_INET || !env.isSocketIOAllowed()) ? null : new SocketBuiltins(), PythonImageBuildOptions.WITHOUT_PLATFORM_ACCESS ? null : new SignalModuleBuiltins(), new TracebackBuiltins(), new GcModuleBuiltins(), @@ -667,14 +688,12 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed, PythonImageBuildOptions.WITHOUT_DIGEST ? null : new HashObjectBuiltins(), PythonImageBuildOptions.WITHOUT_DIGEST ? null : new ShakeDigestObjectBuiltins(), PythonImageBuildOptions.WITHOUT_DIGEST ? null : new Blake2bObjectBuiltins(), - PythonImageBuildOptions.WITHOUT_DIGEST ? null : new Blake2sObjectBuiltins(), PythonImageBuildOptions.WITHOUT_DIGEST ? null : new HashlibModuleBuiltins(), - new PyExpatModuleBuiltins(), - // itertools new AccumulateBuiltins(), new CombinationsBuiltins(), + new CombinationsWithReplacementBuiltins(), new CompressBuiltins(), new DropwhileBuiltins(), new ChainBuiltins(), @@ -705,9 +724,9 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed, new SimpleQueueBuiltins(), new QueueModuleBuiltins(), new ThreadModuleBuiltins(), - new ThreadBuiltins(), new ThreadLocalBuiltins(), - new LockBuiltins(), + new CommonLockBuiltins(), + new LockTypeBuiltins(), new RLockBuiltins(), new PwdModuleBuiltins(), new ResourceModuleBuiltins(), @@ -768,11 +787,6 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed, new PyCPointerBuiltins(), new CDataBuiltins(), - // _hpy_universal, _hpy_debug, and _hpy_trace - new GraalHPyUniversalModuleBuiltins(), - new GraalHPyDebugModuleBuiltins(), - new GraalHPyTraceModuleBuiltins(), - new StructModuleBuiltins(), new StructBuiltins(), new StructUnpackIteratorBuiltins(), @@ -786,19 +800,15 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed, // _tokenizer new TokenizeModuleBuiltins(), new TokenizerIterBuiltins())); - if (hasProfilerTool) { + if (HAS_PROFILER_TOOL) { builtins.add(new LsprofModuleBuiltins()); - builtins.add(LsprofModuleBuiltins.newProfilerBuiltins()); + builtins.add(new ProfilerBuiltins()); } - if (!PythonImageBuildOptions.WITHOUT_COMPRESSION_LIBRARIES && (nativeAccessAllowed || ImageInfo.inImageBuildtimeCode())) { + if (!PythonImageBuildOptions.WITHOUT_COMPRESSION_LIBRARIES && (env.isNativeAccessAllowed() || env.isPreInitialization())) { builtins.add(new BZ2CompressorBuiltins()); builtins.add(new BZ2DecompressorBuiltins()); builtins.add(new BZ2ModuleBuiltins()); } - ServiceLoader providers = ServiceLoader.load(PythonBuiltins.class, Python3Core.class.getClassLoader()); - for (PythonBuiltins builtin : providers) { - builtins.add(builtin); - } filterBuiltins(builtins); return builtins.toArray(new PythonBuiltins[builtins.size()]); } @@ -817,6 +827,8 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed, @CompilationFinal private PInt pyFalse; @CompilationFinal private PFloat pyNaN; + @CompilationFinal(dimensions = 1) public final PythonManagedClass[] polyglotForeignClasses = new PythonManagedClass[GetForeignObjectClassNode.Trait.COMBINATIONS]; + private final SysModuleState sysModuleState = new SysModuleState(); @CompilationFinal private Object globalScopeObject; @@ -828,17 +840,16 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed, private volatile boolean initialized; private final PythonLanguage language; - @CompilationFinal private PythonObjectSlowPathFactory objectFactory; - public Python3Core(PythonLanguage language, boolean isNativeSupportAllowed, boolean socketIOAllowed) { + public Python3Core(PythonLanguage language, TruffleLanguage.Env env) { this.language = language; - this.builtins = initializeBuiltins(isNativeSupportAllowed, socketIOAllowed); + this.builtins = initializeBuiltins(env); this.coreFiles = initializeCoreFiles(); } @CompilerDirectives.ValueType public static class SysModuleState { - private int recursionLimit = ImageInfo.inImageCode() ? NATIVE_REC_LIM : REC_LIM; + private int recursionLimit = TruffleOptions.AOT ? NATIVE_REC_LIM : REC_LIM; private int checkInterval = 100; private double switchInterval = 0.005; @@ -877,10 +888,29 @@ public final PythonContext getContext() { return (PythonContext) this; } + /** + * Return the language corresponding to this context. In runtime compiled code, prefer + * {@link #getLanguage(Node)}. + */ public final PythonLanguage getLanguage() { return language; } + /** + * Return the language corresponding to this context. + * + * @param node And adopted node that can make the lookup fold in compiled code in even in + * multi-context mode. Can be null. + */ + public final PythonLanguage getLanguage(Node node) { + // The condition is always true in the interpreter + if (CompilerDirectives.isPartialEvaluationConstant(language)) { + return language; + } + // This will make it PE-constant in multi-context mode + return PythonLanguage.get(node); + } + /** * Checks whether the core is initialized. */ @@ -892,19 +922,16 @@ public final boolean isCoreInitialized() { * Load the core library and prepare all builtin classes and modules. */ public final void initialize(PythonContext context) { - objectFactory = new PythonObjectSlowPathFactory(context.getAllocationReporter(), context.getLanguage()); initializeJavaCore(); initializeImportlib(); context.applyModuleOptions(); initializePython3Core(context.getCoreHomeOrFail()); - assert SpecialMethodSlot.checkSlotOverrides(this); initialized = true; } private void initializeJavaCore() { initializeTypes(); populateBuiltins(); - SpecialMethodSlot.initializeBuiltinsSpecialMethodSlots(this); publishBuiltinModules(); builtinsModule = builtinModules.get(BuiltinNames.T_BUILTINS); } @@ -912,6 +939,7 @@ private void initializeJavaCore() { private void initializeImportlib() { PythonModule bootstrap = ImpModuleBuiltins.importFrozenModuleObject(this, T__FROZEN_IMPORTLIB, false); PythonModule bootstrapExternal; + boolean useFrozenModules = bootstrap != null; PyObjectCallMethodObjArgs callNode = PyObjectCallMethodObjArgs.getUncached(); WriteAttributeToPythonObjectNode writeNode = WriteAttributeToPythonObjectNode.getUncached(); @@ -921,8 +949,7 @@ private void initializeImportlib() { // first, a workaround since postInitialize hasn't run yet for the _weakref module aliases writeNode.execute(lookupBuiltinModule(T__WEAKREF), T_REF, lookupType(PythonBuiltinClassType.PReferenceType)); - if (bootstrap == null) { - // true when the frozen module is not available + if (!useFrozenModules) { bootstrapExternal = createModule(T_IMPORTLIB_BOOTSTRAP_EXTERNAL); bootstrap = createModule(T_IMPORTLIB_BOOTSTRAP); loadFile(toTruffleStringUncached("importlib/_bootstrap_external"), getContext().getStdlibHome(), bootstrapExternal); @@ -947,11 +974,6 @@ private void initializeImportlib() { importFunc = (PFunction) __import__; importlib = bootstrap; - PythonBuiltinClass moduleType = lookupType(PythonBuiltinClassType.PythonModule); - writeNode.execute(moduleType, T___REPR__, readNode.execute(bootstrap, toTruffleStringUncached("_module_repr"))); - - SpecialMethodSlot.reinitializeSpecialMethodSlots(moduleType, getLanguage()); - // see CPython's init_importlib_external callNode.execute(null, null, bootstrap, toTruffleStringUncached("_install_external_importers")); if (!PythonImageBuildOptions.WITHOUT_COMPRESSION_LIBRARIES) { @@ -962,11 +984,25 @@ private void initializeImportlib() { LOGGER.log(Level.FINE, () -> "initializing zipimport failed"); } else { LOGGER.log(Level.FINE, () -> "# installing zipimport hook"); + // when frozen modules are not used, we need to load from file directly PythonModule zipimport = null; try { - zipimport = AbstractImportNode.importModule(toTruffleStringUncached("zipimport")); - } catch (PException e) { - LOGGER.log(Level.FINE, () -> "# can't import zipimport"); + if (useFrozenModules) { + zipimport = AbstractImportNode.importModule(T_ZIPIMPORT); + } else { + // load zipimport from file, and since postInitialize hasn't run yet we + // cannot use the normal import machinery without frozen modules at this + // point + zipimport = createModule(T_ZIPIMPORT); + loadFile(T_ZIPIMPORT, getContext().getStdlibHome(), zipimport); + setItem.execute(null, null, sysModules, T_ZIPIMPORT, zipimport); + } + } catch (RuntimeException e) { + LOGGER.log(Level.FINE, () -> { + StringWriter tb = new StringWriter(); + ExceptionUtils.printPythonLikeStackTrace(new PrintWriter(tb), e); + return tb.toString() + System.lineSeparator() + "# can't import zipimport"; + }); } if (zipimport != null) { writeNode.execute(zipimport, T___BUILTINS__, getBuiltins()); @@ -994,10 +1030,10 @@ private void initializePython3Core(TruffleString coreHome) { /** * Run post-initialization code that needs a fully working Python environment. This will be run * eagerly when the context is initialized on the JVM or a new context is created on SVM, but is - * omitted when the native image is generated. + * omitted when creating a pre-initialized context. */ - public final void postInitialize() { - if (!ImageInfo.inImageBuildtimeCode() || ImageInfo.inImageRuntimeCode()) { + public final void postInitialize(Env env) { + if (!env.isPreInitialization()) { initialized = false; for (PythonBuiltins builtin : builtins) { @@ -1014,9 +1050,9 @@ public final void postInitialize() { * fallback to another _bz2 implementation (e.g. LLVM or maybe some Java lib). This * needs to be done here and cannot be done in 'initializeBuiltins' because then we * would never include the intrinsified _bz2 module in the native image since native - * access is never allowed during native image build time. + * access is never allowed during context pre-initialization. */ - if (!PythonImageBuildOptions.WITHOUT_COMPRESSION_LIBRARIES && ImageInfo.inImageCode() && !getContext().isNativeAccessAllowed()) { + if (!PythonImageBuildOptions.WITHOUT_COMPRESSION_LIBRARIES && TruffleOptions.AOT && !getContext().isNativeAccessAllowed()) { removeBuiltinModule(BuiltinNames.T_BZ2); } @@ -1037,9 +1073,6 @@ public void run() { } } - // import special interop predefined behavior - loadFile(toTruffleStringUncached("_interop_behavior"), getContext().getCoreHomeOrFail()); - initialized = true; } } @@ -1173,9 +1206,11 @@ private void initializeTypes() { } } // now initialize well-known objects - pyTrue = factory().createInt(PythonBuiltinClassType.Boolean, BigInteger.ONE); - pyFalse = factory().createInt(PythonBuiltinClassType.Boolean, BigInteger.ZERO); - pyNaN = factory().createFloat(Double.NaN); + PythonBuiltinClassType booleanType = PythonBuiltinClassType.Boolean; + Shape booleanShape = booleanType.getInstanceShape(getLanguage()); + pyTrue = PFactory.createInt(getLanguage(), booleanType, booleanShape, BigInteger.ONE); + pyFalse = PFactory.createInt(getLanguage(), booleanType, booleanShape, BigInteger.ZERO); + pyNaN = PFactory.createFloat(getLanguage(), Double.NaN); } private void populateBuiltins() { @@ -1200,11 +1235,12 @@ private void populateBuiltins() { } } - Map> wrapped = new HashMap<>(); for (PythonBuiltinClassType klass : PythonBuiltinClassType.VALUES) { - wrapped.clear(); - TpSlots.addOperatorsToBuiltin(wrapped, this, klass); - PythonBuiltins.addFunctionsToModuleObject(wrapped, lookupType(klass), factory()); + PythonBuiltinClass pbc = lookupType(klass); + TpSlots.addOperatorsToBuiltin(this, klass, pbc); + if (klass.getDoc() != null && pbc.getAttribute(T___DOC__) instanceof PNone) { + pbc.setAttribute(T___DOC__, klass.getDoc()); + } } // core machinery @@ -1226,7 +1262,7 @@ private void addBuiltinModule(TruffleString name, PythonModule module) { private PythonModule createModule(TruffleString name, PythonBuiltins moduleBuiltins) { PythonModule mod = builtinModules.get(name); if (mod == null) { - mod = factory().createPythonModule(name); + mod = PFactory.createPythonModule(getLanguage(), name); if (moduleBuiltins != null) { mod.setBuiltins(moduleBuiltins); } @@ -1237,7 +1273,7 @@ private PythonModule createModule(TruffleString name, PythonBuiltins moduleBuilt private void addBuiltinsTo(PythonObject obj, PythonBuiltins builtinsForObj) { builtinsForObj.addConstantsToModuleObject(obj); - builtinsForObj.addFunctionsToModuleObject(obj, objectFactory); + builtinsForObj.addFunctionsToModuleObject(obj, getLanguage()); } @TruffleBoundary @@ -1263,7 +1299,7 @@ private void loadFile(TruffleString s, TruffleString prefix) { PythonModule mod = lookupBuiltinModule(s); if (mod == null) { // use an anonymous module for the side-effects - mod = factory().createPythonModule(T___ANONYMOUS__); + mod = PFactory.createPythonModule(getLanguage(), T___ANONYMOUS__); } loadFile(s, prefix, mod); } @@ -1273,16 +1309,14 @@ private void loadFile(TruffleString s, TruffleString prefix, PythonModule mod) { LOGGER.log(Level.FINE, () -> "import '" + s + "' # "); return; } + + LOGGER.log(Level.FINE, () -> "import '" + s + "'"); Supplier getCode = () -> { Source source = getInternalSource(s, prefix); return getLanguage().parse(getContext(), source, InputType.FILE, false, 0, false, null, EnumSet.noneOf(FutureFeature.class)); }; RootCallTarget callTarget = (RootCallTarget) getLanguage().cacheCode(s, getCode); - GenericInvokeNode.getUncached().execute(callTarget, PArguments.withGlobals(mod)); - } - - public final PythonObjectSlowPathFactory factory() { - return objectFactory; + CallDispatchers.SimpleIndirectInvokeNode.executeUncached(callTarget, PArguments.withGlobals(mod)); } public final PInt getTrue() { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltinClassType.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltinClassType.java index 1b82934ae4..0b6b90a9b1 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltinClassType.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltinClassType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -25,50 +25,6 @@ */ package com.oracle.graal.python.builtins; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.ARRAY_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.ASYNC_GENERATOR_ASEND_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.ASYNC_GENERATOR_ATHROW_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.ASYNC_GENERATOR_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.BOOLEAN_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.BYTES_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.BYTE_ARRAY_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.COMPLEX_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.CONTEXT_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.COROUTINE_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.DEFAULTDICT_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.DEFAULT_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.DEQUE_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.DICTITEMSVIEW_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.DICTKEYSVIEW_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.DICTVALUESVIEW_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.DICT_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.FLOAT_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.FOREIGNOBJECT_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.FROZENSET_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.GENERATOR_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.GENERIC_ALIAS_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.INT_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.LIST_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.MAPPINGPROXY_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.MEMORYVIEW_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.MMAP_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NONE_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.PYCARRAYTYPE_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.PYCARRAY_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.PYCFUNCPTRTYPE_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.PYCFUNCPTR_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.PYCPOINTERTYPE_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.PYCPOINTER_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.PYCSIMPLETYPE_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.PYCSTRUCTTYPE_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.RANGE_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.SET_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.SIMPLECDATA_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.STRING_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.TUPLE_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.TYPE_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.UNIONTYPE_M_FLAGS; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.UNION_TYPE_M_FLAGS; import static com.oracle.graal.python.nodes.BuiltinNames.J_BUILTINS; import static com.oracle.graal.python.nodes.BuiltinNames.J_DEFAULTDICT; import static com.oracle.graal.python.nodes.BuiltinNames.J_DEQUE; @@ -83,7 +39,6 @@ import static com.oracle.graal.python.nodes.BuiltinNames.J_DICT_REVERSE_VALUEITERATOR; import static com.oracle.graal.python.nodes.BuiltinNames.J_DICT_VALUEITERATOR; import static com.oracle.graal.python.nodes.BuiltinNames.J_DICT_VALUES; -import static com.oracle.graal.python.nodes.BuiltinNames.J_FOREIGN; import static com.oracle.graal.python.nodes.BuiltinNames.J_LRU_CACHE_WRAPPER; import static com.oracle.graal.python.nodes.BuiltinNames.J_MEMBER_DESCRIPTOR; import static com.oracle.graal.python.nodes.BuiltinNames.J_ORDERED_DICT; @@ -112,64 +67,207 @@ import java.util.stream.Collectors; import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.HashNotImplemented; import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.builtins.modules.StatResultBuiltins; import com.oracle.graal.python.builtins.modules.WeakRefModuleBuiltins; +import com.oracle.graal.python.builtins.modules.ast.AstBuiltins; +import com.oracle.graal.python.builtins.modules.bz2.BZ2CompressorBuiltins; +import com.oracle.graal.python.builtins.modules.bz2.BZ2DecompressorBuiltins; +import com.oracle.graal.python.builtins.modules.cjkcodecs.MultibyteIncrementalDecoderBuiltins; +import com.oracle.graal.python.builtins.modules.cjkcodecs.MultibyteIncrementalEncoderBuiltins; +import com.oracle.graal.python.builtins.modules.cjkcodecs.MultibyteStreamReaderBuiltins; +import com.oracle.graal.python.builtins.modules.cjkcodecs.MultibyteStreamWriterBuiltins; +import com.oracle.graal.python.builtins.modules.csv.CSVDialectBuiltins; +import com.oracle.graal.python.builtins.modules.csv.CSVReaderBuiltins; +import com.oracle.graal.python.builtins.modules.ctypes.CArgObjectBuiltins; +import com.oracle.graal.python.builtins.modules.ctypes.CDataBuiltins; import com.oracle.graal.python.builtins.modules.ctypes.CDataTypeSequenceBuiltins; import com.oracle.graal.python.builtins.modules.ctypes.CFieldBuiltins; import com.oracle.graal.python.builtins.modules.ctypes.PyCArrayBuiltins; +import com.oracle.graal.python.builtins.modules.ctypes.PyCArrayTypeBuiltins; import com.oracle.graal.python.builtins.modules.ctypes.PyCFuncPtrBuiltins; +import com.oracle.graal.python.builtins.modules.ctypes.PyCFuncPtrTypeBuiltins; import com.oracle.graal.python.builtins.modules.ctypes.PyCPointerBuiltins; +import com.oracle.graal.python.builtins.modules.ctypes.PyCPointerTypeBuiltins; +import com.oracle.graal.python.builtins.modules.ctypes.PyCSimpleTypeBuiltins; import com.oracle.graal.python.builtins.modules.ctypes.PyCStructTypeBuiltins; import com.oracle.graal.python.builtins.modules.ctypes.SimpleCDataBuiltins; import com.oracle.graal.python.builtins.modules.ctypes.StgDictBuiltins; +import com.oracle.graal.python.builtins.modules.ctypes.StructUnionTypeBuiltins; +import com.oracle.graal.python.builtins.modules.ctypes.StructureBuiltins; +import com.oracle.graal.python.builtins.modules.functools.KeyWrapperBuiltins; import com.oracle.graal.python.builtins.modules.functools.LruCacheWrapperBuiltins; +import com.oracle.graal.python.builtins.modules.functools.PartialBuiltins; +import com.oracle.graal.python.builtins.modules.hashlib.Blake2bObjectBuiltins; +import com.oracle.graal.python.builtins.modules.hashlib.HashObjectBuiltins; +import com.oracle.graal.python.builtins.modules.hashlib.Sha3Builtins; +import com.oracle.graal.python.builtins.modules.io.BufferedIOMixinBuiltins; +import com.oracle.graal.python.builtins.modules.io.BufferedRWPairBuiltins; +import com.oracle.graal.python.builtins.modules.io.BufferedRandomBuiltins; +import com.oracle.graal.python.builtins.modules.io.BufferedReaderBuiltins; +import com.oracle.graal.python.builtins.modules.io.BufferedReaderMixinBuiltins; +import com.oracle.graal.python.builtins.modules.io.BufferedWriterBuiltins; +import com.oracle.graal.python.builtins.modules.io.BytesIOBuiltins; +import com.oracle.graal.python.builtins.modules.io.FileIOBuiltins; +import com.oracle.graal.python.builtins.modules.io.IOBaseBuiltins; +import com.oracle.graal.python.builtins.modules.io.IncrementalNewlineDecoderBuiltins; +import com.oracle.graal.python.builtins.modules.io.StringIOBuiltins; +import com.oracle.graal.python.builtins.modules.io.TextIOWrapperBuiltins; +import com.oracle.graal.python.builtins.modules.json.JSONEncoderBuiltins; +import com.oracle.graal.python.builtins.modules.json.JSONScannerBuiltins; +import com.oracle.graal.python.builtins.modules.lsprof.ProfilerBuiltins; +import com.oracle.graal.python.builtins.modules.lzma.LZMACompressorBuiltins; +import com.oracle.graal.python.builtins.modules.lzma.LZMADecompressorBuiltins; +import com.oracle.graal.python.builtins.modules.multiprocessing.GraalPySemLockBuiltins; +import com.oracle.graal.python.builtins.modules.multiprocessing.SemLockBuiltins; +import com.oracle.graal.python.builtins.modules.pickle.PickleBufferBuiltins; +import com.oracle.graal.python.builtins.modules.pickle.PicklerBuiltins; +import com.oracle.graal.python.builtins.modules.pickle.PicklerMemoProxyBuiltins; +import com.oracle.graal.python.builtins.modules.pickle.UnpicklerBuiltins; +import com.oracle.graal.python.builtins.modules.pickle.UnpicklerMemoProxyBuiltins; import com.oracle.graal.python.builtins.objects.NoneBuiltins; +import com.oracle.graal.python.builtins.objects.NotImplementedBuiltins; import com.oracle.graal.python.builtins.objects.array.ArrayBuiltins; +import com.oracle.graal.python.builtins.objects.asyncio.ANextAwaitableBuiltins; +import com.oracle.graal.python.builtins.objects.asyncio.AsyncGenSendBuiltins; +import com.oracle.graal.python.builtins.objects.asyncio.AsyncGenThrowBuiltins; +import com.oracle.graal.python.builtins.objects.asyncio.AsyncGeneratorBuiltins; +import com.oracle.graal.python.builtins.objects.asyncio.CoroutineWrapperBuiltins; +import com.oracle.graal.python.builtins.objects.bool.BoolBuiltins; import com.oracle.graal.python.builtins.objects.bytes.ByteArrayBuiltins; import com.oracle.graal.python.builtins.objects.bytes.BytesBuiltins; import com.oracle.graal.python.builtins.objects.bytes.BytesCommonBuiltins; +import com.oracle.graal.python.builtins.objects.cell.CellBuiltins; +import com.oracle.graal.python.builtins.objects.code.CodeBuiltins; import com.oracle.graal.python.builtins.objects.complex.ComplexBuiltins; import com.oracle.graal.python.builtins.objects.contextvars.ContextBuiltins; +import com.oracle.graal.python.builtins.objects.contextvars.ContextIteratorBuiltins; +import com.oracle.graal.python.builtins.objects.contextvars.ContextVarBuiltins; +import com.oracle.graal.python.builtins.objects.contextvars.TokenBuiltins; import com.oracle.graal.python.builtins.objects.deque.DequeBuiltins; +import com.oracle.graal.python.builtins.objects.deque.DequeIterBuiltins; +import com.oracle.graal.python.builtins.objects.deque.DequeIterCommonBuiltins; +import com.oracle.graal.python.builtins.objects.deque.DequeRevIterBuiltins; +import com.oracle.graal.python.builtins.objects.dict.DefaultDictBuiltins; import com.oracle.graal.python.builtins.objects.dict.DictBuiltins; +import com.oracle.graal.python.builtins.objects.dict.DictReprBuiltin; import com.oracle.graal.python.builtins.objects.dict.DictValuesBuiltins; import com.oracle.graal.python.builtins.objects.dict.DictViewBuiltins; +import com.oracle.graal.python.builtins.objects.ellipsis.EllipsisBuiltins; +import com.oracle.graal.python.builtins.objects.enumerate.EnumerateBuiltins; +import com.oracle.graal.python.builtins.objects.exception.AttributeErrorBuiltins; +import com.oracle.graal.python.builtins.objects.exception.BaseExceptionBuiltins; +import com.oracle.graal.python.builtins.objects.exception.BaseExceptionGroupBuiltins; +import com.oracle.graal.python.builtins.objects.exception.ImportErrorBuiltins; +import com.oracle.graal.python.builtins.objects.exception.KeyErrorBuiltins; +import com.oracle.graal.python.builtins.objects.exception.OsErrorBuiltins; +import com.oracle.graal.python.builtins.objects.exception.StopIterationBuiltins; +import com.oracle.graal.python.builtins.objects.exception.SyntaxErrorBuiltins; +import com.oracle.graal.python.builtins.objects.exception.SystemExitBuiltins; +import com.oracle.graal.python.builtins.objects.exception.UnicodeDecodeErrorBuiltins; +import com.oracle.graal.python.builtins.objects.exception.UnicodeEncodeErrorBuiltins; +import com.oracle.graal.python.builtins.objects.exception.UnicodeTranslateErrorBuiltins; import com.oracle.graal.python.builtins.objects.floats.FloatBuiltins; +import com.oracle.graal.python.builtins.objects.foreign.ForeignBooleanBuiltins; +import com.oracle.graal.python.builtins.objects.foreign.ForeignExecutableBuiltins; +import com.oracle.graal.python.builtins.objects.foreign.ForeignInstantiableBuiltins; +import com.oracle.graal.python.builtins.objects.foreign.ForeignIterableBuiltins; +import com.oracle.graal.python.builtins.objects.foreign.ForeignNumberBuiltins; import com.oracle.graal.python.builtins.objects.foreign.ForeignObjectBuiltins; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor; +import com.oracle.graal.python.builtins.objects.frame.FrameBuiltins; +import com.oracle.graal.python.builtins.objects.function.AbstractFunctionBuiltins; import com.oracle.graal.python.builtins.objects.function.FunctionBuiltins; import com.oracle.graal.python.builtins.objects.function.MethodDescriptorBuiltins; import com.oracle.graal.python.builtins.objects.function.WrapperDescriptorBuiltins; +import com.oracle.graal.python.builtins.objects.generator.CoroutineBuiltins; +import com.oracle.graal.python.builtins.objects.generator.GeneratorBuiltins; import com.oracle.graal.python.builtins.objects.getsetdescriptor.GetSetDescriptorTypeBuiltins; import com.oracle.graal.python.builtins.objects.getsetdescriptor.MemberDescriptorBuiltins; import com.oracle.graal.python.builtins.objects.ints.IntBuiltins; +import com.oracle.graal.python.builtins.objects.iterator.IteratorBuiltins; +import com.oracle.graal.python.builtins.objects.iterator.SentinelIteratorBuiltins; +import com.oracle.graal.python.builtins.objects.iterator.ZipBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.AccumulateBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.ChainBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.CombinationsBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.CombinationsWithReplacementBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.CompressBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.CountBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.CycleBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.DropwhileBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.FilterfalseBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.GroupByBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.GrouperBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.IsliceBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.PairwiseBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.PermutationsBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.ProductBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.RepeatBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.StarmapBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.TakewhileBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.TeeBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.TeeDataObjectBuiltins; +import com.oracle.graal.python.builtins.objects.itertools.ZipLongestBuiltins; import com.oracle.graal.python.builtins.objects.list.ListBuiltins; +import com.oracle.graal.python.builtins.objects.map.MapBuiltins; import com.oracle.graal.python.builtins.objects.mappingproxy.MappingproxyBuiltins; import com.oracle.graal.python.builtins.objects.memoryview.MemoryViewBuiltins; +import com.oracle.graal.python.builtins.objects.method.AbstractMethodBuiltins; +import com.oracle.graal.python.builtins.objects.method.BuiltinClassmethodBuiltins; +import com.oracle.graal.python.builtins.objects.method.BuiltinFunctionOrMethodBuiltins; import com.oracle.graal.python.builtins.objects.method.ClassmethodBuiltins; +import com.oracle.graal.python.builtins.objects.method.ClassmethodCommonBuiltins; import com.oracle.graal.python.builtins.objects.method.InstancemethodBuiltins; import com.oracle.graal.python.builtins.objects.method.MethodBuiltins; +import com.oracle.graal.python.builtins.objects.method.MethodWrapperBuiltins; import com.oracle.graal.python.builtins.objects.method.StaticmethodBuiltins; import com.oracle.graal.python.builtins.objects.mmap.MMapBuiltins; import com.oracle.graal.python.builtins.objects.module.ModuleBuiltins; +import com.oracle.graal.python.builtins.objects.namespace.SimpleNamespaceBuiltins; import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins; +import com.oracle.graal.python.builtins.objects.ordereddict.OrderedDictBuiltins; +import com.oracle.graal.python.builtins.objects.ordereddict.OrderedDictItemsBuiltins; +import com.oracle.graal.python.builtins.objects.ordereddict.OrderedDictIteratorBuiltins; +import com.oracle.graal.python.builtins.objects.ordereddict.OrderedDictKeysBuiltins; +import com.oracle.graal.python.builtins.objects.ordereddict.OrderedDictValuesBuiltins; +import com.oracle.graal.python.builtins.objects.posix.DirEntryBuiltins; +import com.oracle.graal.python.builtins.objects.posix.ScandirIteratorBuiltins; import com.oracle.graal.python.builtins.objects.property.PropertyBuiltins; +import com.oracle.graal.python.builtins.objects.queue.SimpleQueueBuiltins; +import com.oracle.graal.python.builtins.objects.random.RandomBuiltins; import com.oracle.graal.python.builtins.objects.range.RangeBuiltins; +import com.oracle.graal.python.builtins.objects.referencetype.ReferenceTypeBuiltins; +import com.oracle.graal.python.builtins.objects.reversed.ReversedBuiltins; import com.oracle.graal.python.builtins.objects.set.BaseSetBuiltins; +import com.oracle.graal.python.builtins.objects.set.FrozenSetBuiltins; +import com.oracle.graal.python.builtins.objects.set.SetBuiltins; +import com.oracle.graal.python.builtins.objects.slice.SliceBuiltins; +import com.oracle.graal.python.builtins.objects.socket.SocketBuiltins; +import com.oracle.graal.python.builtins.objects.ssl.MemoryBIOBuiltins; +import com.oracle.graal.python.builtins.objects.ssl.SSLContextBuiltins; +import com.oracle.graal.python.builtins.objects.ssl.SSLErrorBuiltins; import com.oracle.graal.python.builtins.objects.str.StringBuiltins; +import com.oracle.graal.python.builtins.objects.struct.StructBuiltins; +import com.oracle.graal.python.builtins.objects.struct.StructUnpackIteratorBuiltins; import com.oracle.graal.python.builtins.objects.superobject.SuperBuiltins; +import com.oracle.graal.python.builtins.objects.thread.CommonLockBuiltins; +import com.oracle.graal.python.builtins.objects.thread.LockTypeBuiltins; +import com.oracle.graal.python.builtins.objects.thread.RLockBuiltins; import com.oracle.graal.python.builtins.objects.thread.ThreadLocalBuiltins; +import com.oracle.graal.python.builtins.objects.tokenize.TokenizerIterBuiltins; +import com.oracle.graal.python.builtins.objects.traceback.TracebackBuiltins; +import com.oracle.graal.python.builtins.objects.tuple.InstantiableStructSequenceBuiltins; +import com.oracle.graal.python.builtins.objects.tuple.StructSequenceBuiltins; import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins; import com.oracle.graal.python.builtins.objects.tuple.TupleGetterBuiltins; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.builtins.objects.type.TpSlots; -import com.oracle.graal.python.builtins.objects.type.TpSlots.Builder; import com.oracle.graal.python.builtins.objects.type.TypeBuiltins; import com.oracle.graal.python.builtins.objects.types.GenericAliasBuiltins; +import com.oracle.graal.python.builtins.objects.types.GenericAliasIteratorBuiltins; import com.oracle.graal.python.builtins.objects.types.UnionTypeBuiltins; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.TruffleOptions; import com.oracle.truffle.api.interop.TruffleObject; @@ -185,400 +283,954 @@ @ExportLibrary(ReflectionLibrary.class) public enum PythonBuiltinClassType implements TruffleObject { - ForeignObject(J_FOREIGN, Flags.PRIVATE_DERIVED_WODICT, FOREIGNOBJECT_M_FLAGS, ForeignObjectBuiltins.SLOTS), - Boolean("bool", J_BUILTINS, Flags.PUBLIC_DERIVED_WODICT, BOOLEAN_M_FLAGS), - PArray("array", "array", ARRAY_M_FLAGS, ArrayBuiltins.SLOTS), - PArrayIterator("arrayiterator", Flags.PRIVATE_DERIVED_WODICT), - PIterator("iterator", Flags.PRIVATE_DERIVED_WODICT), + PythonObject("object", null, newBuilder().publishInModule(J_BUILTINS).basetype().slots(ObjectBuiltins.SLOTS).doc(""" + The base class of the class hierarchy. + + When called, it accepts no arguments and returns a new featureless + instance that has no instance attributes and cannot be given any. + """)), + PythonClass("type", PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().addDict().slots(TypeBuiltins.SLOTS).doc(""" + type(object) -> the object's type + type(name, bases, dict, **kwds) -> a new type""")), + PArray("array", PythonObject, newBuilder().publishInModule("array").basetype().slots(ArrayBuiltins.SLOTS)), + PArrayIterator("arrayiterator", PythonObject, newBuilder().disallowInstantiation().slots(IteratorBuiltins.SLOTS)), + PIterator("iterator", PythonObject, newBuilder().disallowInstantiation().slots(IteratorBuiltins.SLOTS)), /** See {@link com.oracle.graal.python.builtins.objects.function.PBuiltinFunction} */ - PBuiltinFunction("method_descriptor", Flags.PRIVATE_DERIVED_WODICT, MethodDescriptorBuiltins.SLOTS), + PBuiltinFunction("method_descriptor", PythonObject, newBuilder().disallowInstantiation().slots(AbstractFunctionBuiltins.SLOTS, MethodDescriptorBuiltins.SLOTS)), /** See {@link com.oracle.graal.python.builtins.objects.method.PBuiltinMethod} */ - PBuiltinFunctionOrMethod("builtin_function_or_method", Flags.PRIVATE_DERIVED_WODICT), + PBuiltinFunctionOrMethod( + "builtin_function_or_method", + PythonObject, + newBuilder().disallowInstantiation().slots(AbstractMethodBuiltins.SLOTS, BuiltinFunctionOrMethodBuiltins.SLOTS)), /** See {@link com.oracle.graal.python.builtins.objects.function.PBuiltinFunction} */ - WrapperDescriptor(J_WRAPPER_DESCRIPTOR, Flags.PRIVATE_DERIVED_WODICT, WrapperDescriptorBuiltins.SLOTS), + WrapperDescriptor(J_WRAPPER_DESCRIPTOR, PythonObject, newBuilder().disallowInstantiation().slots(AbstractFunctionBuiltins.SLOTS, WrapperDescriptorBuiltins.SLOTS)), /** See {@link com.oracle.graal.python.builtins.objects.method.PBuiltinMethod} */ - MethodWrapper("method-wrapper", Flags.PRIVATE_DERIVED_WODICT), + MethodWrapper("method-wrapper", PythonObject, newBuilder().slots(AbstractMethodBuiltins.SLOTS, MethodWrapperBuiltins.SLOTS)), /** See {@link com.oracle.graal.python.builtins.objects.method.PBuiltinMethod} */ - PBuiltinMethod("builtin_method", Flags.PRIVATE_DERIVED_WODICT), - PBuiltinClassMethod("classmethod_descriptor", Flags.PRIVATE_DERIVED_WODICT, ClassmethodBuiltins.SLOTS), - GetSetDescriptor("getset_descriptor", Flags.PRIVATE_DERIVED_WODICT, GetSetDescriptorTypeBuiltins.SLOTS), - MemberDescriptor(J_MEMBER_DESCRIPTOR, Flags.PRIVATE_DERIVED_WODICT, MemberDescriptorBuiltins.SLOTS), - PByteArray("bytearray", J_BUILTINS, BYTE_ARRAY_M_FLAGS, TpSlots.merge(BytesCommonBuiltins.SLOTS, ByteArrayBuiltins.SLOTS)), - PBytes("bytes", J_BUILTINS, BYTES_M_FLAGS, TpSlots.merge(BytesCommonBuiltins.SLOTS, BytesBuiltins.SLOTS)), - PCell("cell", Flags.PRIVATE_DERIVED_WODICT), - PSimpleNamespace("SimpleNamespace", null, "types", Flags.PUBLIC_BASE_WDICT), - PKeyWrapper("KeyWrapper", "_functools", "functools", Flags.PUBLIC_DERIVED_WODICT), - PPartial(J_PARTIAL, "_functools", "functools", Flags.PUBLIC_BASE_WDICT), - PLruListElem("_lru_list_elem", null, "functools", Flags.PUBLIC_DERIVED_WODICT), - PLruCacheWrapper(J_LRU_CACHE_WRAPPER, "_functools", "functools", Flags.PUBLIC_BASE_WDICT, LruCacheWrapperBuiltins.SLOTS), - PDefaultDict(J_DEFAULTDICT, "_collections", "collections", Flags.PUBLIC_BASE_WODICT, DEFAULTDICT_M_FLAGS, DictBuiltins.SLOTS), - PDeque(J_DEQUE, "_collections", Flags.PUBLIC_BASE_WODICT, DEQUE_M_FLAGS, DequeBuiltins.SLOTS), - PTupleGetter(J_TUPLE_GETTER, "_collections", Flags.PUBLIC_BASE_WODICT, TupleGetterBuiltins.SLOTS), - PDequeIter(J_DEQUE_ITER, "_collections", Flags.PUBLIC_DERIVED_WODICT), - PDequeRevIter(J_DEQUE_REV_ITER, "_collections", Flags.PUBLIC_DERIVED_WODICT), - POrderedDict(J_ORDERED_DICT, "_collections", Flags.PUBLIC_BASE_WDICT, DICT_M_FLAGS), - POrderedDictKeys("odict_keys", Flags.PRIVATE_DERIVED_WODICT, DICTKEYSVIEW_M_FLAGS), - POrderedDictValues("odict_values", Flags.PRIVATE_DERIVED_WODICT, DICTVALUESVIEW_M_FLAGS), - POrderedDictItems("odict_items", Flags.PRIVATE_DERIVED_WODICT, DICTITEMSVIEW_M_FLAGS), - POrderedDictIterator("odict_iterator", Flags.PRIVATE_DERIVED_WODICT), - PComplex("complex", J_BUILTINS, COMPLEX_M_FLAGS, ComplexBuiltins.SLOTS), - PDict("dict", J_BUILTINS, DICT_M_FLAGS, DictBuiltins.SLOTS), - PDictItemIterator(J_DICT_ITEMITERATOR, Flags.PRIVATE_DERIVED_WODICT), - PDictReverseItemIterator(J_DICT_REVERSE_ITEMITERATOR, Flags.PRIVATE_DERIVED_WODICT), - PDictItemsView(J_DICT_ITEMS, Flags.PRIVATE_DERIVED_WODICT, DICTITEMSVIEW_M_FLAGS, DictViewBuiltins.SLOTS), - PDictKeyIterator(J_DICT_KEYITERATOR, Flags.PRIVATE_DERIVED_WODICT), - PDictReverseKeyIterator(J_DICT_REVERSE_KEYITERATOR, Flags.PRIVATE_DERIVED_WODICT), - PDictKeysView(J_DICT_KEYS, Flags.PRIVATE_DERIVED_WODICT, DICTKEYSVIEW_M_FLAGS, DictViewBuiltins.SLOTS), - PDictValueIterator(J_DICT_VALUEITERATOR, Flags.PRIVATE_DERIVED_WODICT), - PDictReverseValueIterator(J_DICT_REVERSE_VALUEITERATOR, Flags.PRIVATE_DERIVED_WODICT), - PDictValuesView(J_DICT_VALUES, Flags.PRIVATE_DERIVED_WODICT, DICTVALUESVIEW_M_FLAGS, DictValuesBuiltins.SLOTS), - PEllipsis("ellipsis", Flags.PRIVATE_DERIVED_WODICT), - PEnumerate("enumerate", J_BUILTINS), - PMap("map", J_BUILTINS), - PFloat("float", J_BUILTINS, FLOAT_M_FLAGS, FloatBuiltins.SLOTS), - PFrame("frame", Flags.PRIVATE_DERIVED_WODICT), - PFrozenSet("frozenset", J_BUILTINS, FROZENSET_M_FLAGS, BaseSetBuiltins.SLOTS), - PFunction("function", Flags.PRIVATE_DERIVED_WDICT, FunctionBuiltins.SLOTS), - PGenerator("generator", Flags.PRIVATE_DERIVED_WODICT, GENERATOR_M_FLAGS), - PCoroutine("coroutine", Flags.PRIVATE_DERIVED_WODICT, COROUTINE_M_FLAGS), - PCoroutineWrapper("coroutine_wrapper", Flags.PRIVATE_DERIVED_WODICT), - PAsyncGenerator("async_generator", Flags.PRIVATE_DERIVED_WODICT, ASYNC_GENERATOR_M_FLAGS), - PInt("int", J_BUILTINS, INT_M_FLAGS, IntBuiltins.SLOTS), - PList("list", J_BUILTINS, LIST_M_FLAGS, ListBuiltins.SLOTS), - PMappingproxy("mappingproxy", Flags.PRIVATE_DERIVED_WODICT, MAPPINGPROXY_M_FLAGS, MappingproxyBuiltins.SLOTS), - PMemoryView("memoryview", J_BUILTINS, Flags.PUBLIC_DERIVED_WODICT, MEMORYVIEW_M_FLAGS, MemoryViewBuiltins.SLOTS), - PAsyncGenASend("async_generator_asend", Flags.PRIVATE_DERIVED_WODICT, ASYNC_GENERATOR_ASEND_M_FLAGS), - PAsyncGenAThrow("async_generator_athrow", Flags.PRIVATE_DERIVED_WODICT, ASYNC_GENERATOR_ATHROW_M_FLAGS), - PAsyncGenAWrappedValue("async_generator_wrapped_value", Flags.PRIVATE_DERIVED_WODICT), - PMethod("method", Flags.PRIVATE_DERIVED_WODICT, MethodBuiltins.SLOTS), - PMMap("mmap", "mmap", MMAP_M_FLAGS, MMapBuiltins.SLOTS), - PNone("NoneType", Flags.PRIVATE_DERIVED_WODICT, NONE_M_FLAGS, NoneBuiltins.SLOTS), - PNotImplemented("NotImplementedType", Flags.PRIVATE_DERIVED_WODICT), - PProperty(J_PROPERTY, J_BUILTINS, Flags.PUBLIC_BASE_WODICT, PropertyBuiltins.SLOTS), - PSimpleQueue(J_SIMPLE_QUEUE, "_queue", Flags.PUBLIC_BASE_WODICT), - PRandom("Random", "_random"), - PRange("range", J_BUILTINS, Flags.PUBLIC_DERIVED_WODICT, RANGE_M_FLAGS, RangeBuiltins.SLOTS), - PReferenceType("ReferenceType", "_weakref"), - PSentinelIterator("callable_iterator", Flags.PRIVATE_DERIVED_WODICT), - PForeignArrayIterator("foreign_iterator"), - PReverseIterator("reversed", J_BUILTINS), - PSet("set", J_BUILTINS, SET_M_FLAGS, BaseSetBuiltins.SLOTS), - PSlice("slice", J_BUILTINS), - PString("str", J_BUILTINS, STRING_M_FLAGS, StringBuiltins.SLOTS), - PTraceback("traceback"), - PTuple("tuple", J_BUILTINS, TUPLE_M_FLAGS, TupleBuiltins.SLOTS), - PythonClass("type", J_BUILTINS, Flags.PUBLIC_BASE_WDICT, TYPE_M_FLAGS, TypeBuiltins.SLOTS), - PythonModule("module", Flags.PRIVATE_BASE_WDICT, ModuleBuiltins.SLOTS), - PythonModuleDef("moduledef", Flags.PRIVATE_DERIVED_WODICT), - PythonObject("object", J_BUILTINS, ObjectBuiltins.SLOTS), - Super("super", J_BUILTINS, SuperBuiltins.SLOTS), - PCode("code", Flags.PRIVATE_DERIVED_WODICT), - PGenericAlias("GenericAlias", J_TYPES, Flags.PUBLIC_BASE_WODICT, GENERIC_ALIAS_M_FLAGS, GenericAliasBuiltins.SLOTS), - PGenericAliasIterator("generic_alias_iterator", Flags.PRIVATE_DERIVED_WODICT), - PUnionType("UnionType", J_TYPES, Flags.PUBLIC_DERIVED_WODICT, UNION_TYPE_M_FLAGS, UnionTypeBuiltins.SLOTS), - PZip("zip", J_BUILTINS), - PThread("start_new_thread", J__THREAD), - PThreadLocal("_local", J__THREAD, ThreadLocalBuiltins.SLOTS), - PLock("LockType", J__THREAD), - PRLock("RLock", J__THREAD), - PSemLock("SemLock", "_multiprocessing"), - PGraalPySemLock("SemLock", "_multiprocessing_graalpy"), - PSocket("socket", J__SOCKET), - PStaticmethod("staticmethod", J_BUILTINS, Flags.PUBLIC_BASE_WDICT, StaticmethodBuiltins.SLOTS), - PClassmethod("classmethod", J_BUILTINS, Flags.PUBLIC_BASE_WDICT, ClassmethodBuiltins.SLOTS), - PInstancemethod("instancemethod", Flags.PUBLIC_BASE_WDICT, InstancemethodBuiltins.SLOTS), - PScandirIterator("ScandirIterator", J_POSIX, Flags.PRIVATE_DERIVED_WODICT), - PDirEntry("DirEntry", J_POSIX, Flags.PUBLIC_DERIVED_WODICT), - LsprofProfiler("Profiler", "_lsprof"), - PStruct("Struct", J__STRUCT), - PStructUnpackIterator("unpack_iterator", J__STRUCT), - Pickler("Pickler", "_pickle"), - PicklerMemoProxy("PicklerMemoProxy", "_pickle"), - UnpicklerMemoProxy("UnpicklerMemoProxy", "_pickle"), - Unpickler("Unpickler", "_pickle"), - PickleBuffer("PickleBuffer", "_pickle"), + PBuiltinMethod("builtin_method", PBuiltinFunctionOrMethod, newBuilder()), + PBuiltinClassMethod("classmethod_descriptor", PythonObject, newBuilder().slots(ClassmethodCommonBuiltins.SLOTS, BuiltinClassmethodBuiltins.SLOTS)), + GetSetDescriptor("getset_descriptor", PythonObject, newBuilder().disallowInstantiation().slots(GetSetDescriptorTypeBuiltins.SLOTS)), + MemberDescriptor(J_MEMBER_DESCRIPTOR, PythonObject, newBuilder().disallowInstantiation().slots(MemberDescriptorBuiltins.SLOTS)), + PByteArray( + "bytearray", + PythonObject, + newBuilder().publishInModule(J_BUILTINS).basetype().slots(BytesCommonBuiltins.SLOTS, ByteArrayBuiltins.SLOTS).doc(""" + bytearray(iterable_of_ints) -> bytearray + bytearray(string, encoding[, errors]) -> bytearray + bytearray(bytes_or_buffer) -> mutable copy of bytes_or_buffer + bytearray(int) -> bytes array of size given by the parameter initialized with null bytes + bytearray() -> empty bytes array + + Construct a mutable bytearray object from: + - an iterable yielding integers in range(256) + - a text string encoded using the specified encoding + - a bytes or a buffer object + - any object implementing the buffer API. + - an integer""")), + PBytes("bytes", PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().slots(BytesCommonBuiltins.SLOTS, BytesBuiltins.SLOTS).doc(""" + bytes(iterable_of_ints) -> bytes + bytes(string, encoding[, errors]) -> bytes + bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer + bytes(int) -> bytes object of size given by the parameter initialized with null bytes + bytes() -> empty bytes object + + Construct an immutable array of bytes from: + - an iterable yielding integers in range(256) + - a text string encoded using the specified encoding + - any object implementing the buffer API. + - an integer""")), + PCell("cell", PythonObject, newBuilder().slots(CellBuiltins.SLOTS)), + PSimpleNamespace("SimpleNamespace", PythonObject, newBuilder().publishInModule("types").basetype().addDict().slots(SimpleNamespaceBuiltins.SLOTS).doc(""" + A simple attribute-based namespace. + + SimpleNamespace(**kwargs)""")), + PKeyWrapper("KeyWrapper", PythonObject, newBuilder().moduleName("functools").publishInModule("_functools").disallowInstantiation().slots(KeyWrapperBuiltins.SLOTS)), + PPartial(J_PARTIAL, PythonObject, newBuilder().moduleName("functools").publishInModule("_functools").basetype().addDict().slots(PartialBuiltins.SLOTS).doc(""" + partial(func, *args, **keywords) - new function with partial application + of the given arguments and keywords. + """)), + PLruListElem("_lru_list_elem", PythonObject, newBuilder().publishInModule("functools").disallowInstantiation()), + PLruCacheWrapper(J_LRU_CACHE_WRAPPER, PythonObject, newBuilder().moduleName("functools").publishInModule("_functools").basetype().addDict().slots(LruCacheWrapperBuiltins.SLOTS).doc(""" + Create a cached callable that wraps another function. + + user_function: the function being cached + + maxsize: 0 for no caching + None for unlimited cache size + n for a bounded cache + + typed: False cache f(3) and f(3.0) as identical calls + True cache f(3) and f(3.0) as distinct calls + + cache_info_type: namedtuple class with the fields: + hits misses currsize maxsize + """)), + PDeque(J_DEQUE, PythonObject, newBuilder().publishInModule("_collections").basetype().slots(DequeBuiltins.SLOTS)), + PTupleGetter(J_TUPLE_GETTER, PythonObject, newBuilder().publishInModule("_collections").basetype().slots(TupleGetterBuiltins.SLOTS)), + PDequeIter(J_DEQUE_ITER, PythonObject, newBuilder().publishInModule("_collections").slots(DequeIterCommonBuiltins.SLOTS, DequeIterBuiltins.SLOTS)), + PDequeRevIter(J_DEQUE_REV_ITER, PythonObject, newBuilder().publishInModule("_collections").slots(DequeIterCommonBuiltins.SLOTS, DequeRevIterBuiltins.SLOTS)), + PComplex("complex", PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().slots(ComplexBuiltins.SLOTS).doc(""" + Create a complex number from a real part and an optional imaginary part. + + This is equivalent to (real + imag*1j) where imag defaults to 0.""")), + PDict("dict", PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().slots(DictBuiltins.SLOTS, DictReprBuiltin.SLOTS).doc(""" + dict() -> new empty dictionary + dict(mapping) -> new dictionary initialized from a mapping object's + (key, value) pairs + dict(iterable) -> new dictionary initialized as if via: + d = {} + for k, v in iterable: + d[k] = v + dict(**kwargs) -> new dictionary initialized with the name=value pairs + in the keyword argument list. For example: dict(one=1, two=2)""")), + PDefaultDict(J_DEFAULTDICT, PDict, newBuilder().moduleName("collections").publishInModule("_collections").basetype().slots(DefaultDictBuiltins.SLOTS)), + POrderedDict(J_ORDERED_DICT, PDict, newBuilder().publishInModule("_collections").basetype().addDict().slots(OrderedDictBuiltins.SLOTS)), + PDictItemIterator(J_DICT_ITEMITERATOR, PythonObject, newBuilder().disallowInstantiation().slots(IteratorBuiltins.SLOTS)), + PDictReverseItemIterator(J_DICT_REVERSE_ITEMITERATOR, PythonObject, newBuilder().slots(IteratorBuiltins.SLOTS)), + PDictItemsView(J_DICT_ITEMS, PythonObject, newBuilder().disallowInstantiation().slots(DictViewBuiltins.SLOTS, DictReprBuiltin.SLOTS)), + PDictKeyIterator(J_DICT_KEYITERATOR, PythonObject, newBuilder().disallowInstantiation().slots(IteratorBuiltins.SLOTS)), + PDictReverseKeyIterator(J_DICT_REVERSE_KEYITERATOR, PythonObject, newBuilder().slots(IteratorBuiltins.SLOTS)), + PDictKeysView(J_DICT_KEYS, PythonObject, newBuilder().disallowInstantiation().slots(DictViewBuiltins.SLOTS, DictReprBuiltin.SLOTS)), + PDictValueIterator(J_DICT_VALUEITERATOR, PythonObject, newBuilder().disallowInstantiation().slots(IteratorBuiltins.SLOTS)), + PDictReverseValueIterator(J_DICT_REVERSE_VALUEITERATOR, PythonObject, newBuilder().slots(IteratorBuiltins.SLOTS)), + PDictValuesView(J_DICT_VALUES, PythonObject, newBuilder().disallowInstantiation().slots(DictValuesBuiltins.SLOTS, DictReprBuiltin.SLOTS)), + POrderedDictKeys("odict_keys", PDictKeysView, newBuilder().slots(OrderedDictKeysBuiltins.SLOTS)), + POrderedDictValues("odict_values", PDictValuesView, newBuilder().slots(OrderedDictValuesBuiltins.SLOTS)), + POrderedDictItems("odict_items", PDictItemsView, newBuilder().slots(OrderedDictItemsBuiltins.SLOTS)), + POrderedDictIterator("odict_iterator", PythonObject, newBuilder().slots(OrderedDictIteratorBuiltins.SLOTS)), + PEllipsis("ellipsis", PythonObject, newBuilder().slots(EllipsisBuiltins.SLOTS)), + PEnumerate("enumerate", PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().slots(EnumerateBuiltins.SLOTS).doc(""" + Return an enumerate object. + + iterable + an object supporting iteration + + The enumerate object yields pairs containing a count (from start, which + defaults to zero) and a value yielded by the iterable argument. + + enumerate is useful for obtaining an indexed list: + (0, seq[0]), (1, seq[1]), (2, seq[2]), ...""")), + PMap("map", PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().slots(MapBuiltins.SLOTS).doc(""" + map(func, *iterables) --> map object + + Make an iterator that computes the function using arguments from + each of the iterables. Stops when the shortest iterable is exhausted.""")), + PFloat( + "float", + PythonObject, + newBuilder().publishInModule(J_BUILTINS).basetype().slots(FloatBuiltins.SLOTS).doc(""" + Convert a string or number to a floating point number, if possible.""")), + PFrame("frame", PythonObject, newBuilder().disallowInstantiation().slots(FrameBuiltins.SLOTS)), + PFrozenSet( + "frozenset", + PythonObject, + newBuilder().publishInModule(J_BUILTINS).basetype().slots(BaseSetBuiltins.SLOTS, FrozenSetBuiltins.SLOTS).doc(""" + frozenset() -> empty frozenset object + frozenset(iterable) -> frozenset object + + Build an immutable unordered collection of unique elements.""")), + PFunction("function", PythonObject, newBuilder().addDict().slots(AbstractFunctionBuiltins.SLOTS, FunctionBuiltins.SLOTS)), + PGenerator("generator", PythonObject, newBuilder().disallowInstantiation().slots(GeneratorBuiltins.SLOTS)), + PCoroutine("coroutine", PythonObject, newBuilder().slots(CoroutineBuiltins.SLOTS)), + PCoroutineWrapper("coroutine_wrapper", PythonObject, newBuilder().slots(CoroutineWrapperBuiltins.SLOTS)), + PAsyncGenerator("async_generator", PythonObject, newBuilder().slots(AsyncGeneratorBuiltins.SLOTS)), + PAnextAwaitable("anext_awaitable", PythonObject, newBuilder().slots(ANextAwaitableBuiltins.SLOTS)), + PInt("int", PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().slots(IntBuiltins.SLOTS).doc(""" + int([x]) -> integer + int(x, base=10) -> integer + + Convert a number or string to an integer, or return 0 if no arguments + are given. If x is a number, return x.__int__(). For floating point + numbers, this truncates towards zero. + + If x is not a number or if base is given, then x must be a string, + bytes, or bytearray instance representing an integer literal in the + given base. The literal can be preceded by '+' or '-' and be surrounded + by whitespace. The base defaults to 10. Valid bases are 0 and 2-36. + Base 0 means to interpret the base from the string as an integer literal.""")), + Boolean("bool", PInt, newBuilder().publishInModule(J_BUILTINS).slots(BoolBuiltins.SLOTS).doc(""" + bool(x) -> bool + + Returns True when the argument x is true, False otherwise. + The builtins True and False are the only two instances of the class bool. + The class bool is a subclass of the class int, and cannot be subclassed.""")), + PList("list", PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().slots(ListBuiltins.SLOTS).doc(""" + Built-in mutable sequence. + + If no argument is given, the constructor creates a new empty list. + The argument must be an iterable if specified.""")), + PMappingproxy("mappingproxy", PythonObject, newBuilder().slots(MappingproxyBuiltins.SLOTS)), + PMemoryView( + "memoryview", + PythonObject, + newBuilder().publishInModule(J_BUILTINS).slots(MemoryViewBuiltins.SLOTS).doc(""" + Create a new memoryview object which references the given object.""")), + PAsyncGenASend("async_generator_asend", PythonObject, newBuilder().slots(AsyncGenSendBuiltins.SLOTS)), + PAsyncGenAThrow("async_generator_athrow", PythonObject, newBuilder().slots(AsyncGenThrowBuiltins.SLOTS)), + PAsyncGenAWrappedValue("async_generator_wrapped_value", PythonObject, newBuilder()), + PMethod("method", PythonObject, newBuilder().slots(AbstractMethodBuiltins.SLOTS, MethodBuiltins.SLOTS).doc(""" + Create a bound instance method object.""")), + PMMap("mmap", PythonObject, newBuilder().publishInModule("mmap").basetype().slots(MMapBuiltins.SLOTS)), + PNone("NoneType", PythonObject, newBuilder().slots(NoneBuiltins.SLOTS)), + PNotImplemented("NotImplementedType", PythonObject, newBuilder().slots(NotImplementedBuiltins.SLOTS)), + PProperty(J_PROPERTY, PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().slots(PropertyBuiltins.SLOTS).doc(""" + Property attribute. + + fget + function to be used for getting an attribute value + fset + function to be used for setting an attribute value + fdel + function to be used for del'ing an attribute + doc + docstring + + Typical use is to define a managed attribute x: + + class C(object): + def getx(self): return self._x + def setx(self, value): self._x = value + def delx(self): del self._x + x = property(getx, setx, delx, "I'm the 'x' property.") + + Decorators make defining new properties or modifying existing ones easy: + + class C(object): + @property + def x(self): + "I am the 'x' property." + return self._x + @x.setter + def x(self, value): + self._x = value + @x.deleter + def x(self): + del self._x""")), + PSimpleQueue( + J_SIMPLE_QUEUE, + PythonObject, + newBuilder().publishInModule("_queue").basetype().slots(SimpleQueueBuiltins.SLOTS).doc(""" + SimpleQueue() + -- + + Simple, unbounded, reentrant FIFO queue.""")), + PRandom("Random", PythonObject, newBuilder().publishInModule("_random").basetype().slots(RandomBuiltins.SLOTS)), + PRange("range", PythonObject, newBuilder().publishInModule(J_BUILTINS).slots(RangeBuiltins.SLOTS).doc(""" + range(stop) -> range object + range(start, stop[, step]) -> range object + + Return an object that produces a sequence of integers from start (inclusive) + to stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1. + start defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3. + These are exactly the valid indices for a list of 4 elements. + When step is given, it specifies the increment (or decrement).""")), + PReferenceType("ReferenceType", PythonObject, newBuilder().publishInModule("_weakref").basetype().slots(ReferenceTypeBuiltins.SLOTS)), + PSentinelIterator("callable_iterator", PythonObject, newBuilder().disallowInstantiation().slots(SentinelIteratorBuiltins.SLOTS)), + PReverseIterator("reversed", PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().slots(ReversedBuiltins.SLOTS).doc(""" + Return a reverse iterator over the values of the given sequence.""")), + PSet("set", PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().slots(BaseSetBuiltins.SLOTS, SetBuiltins.SLOTS).doc(""" + set() -> new empty set object + set(iterable) -> new set object + + Build an unordered collection of unique elements.""")), + PSlice("slice", PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().slots(SliceBuiltins.SLOTS).doc(""" + slice(stop) + slice(start, stop[, step]) + + Create a slice object. This is used for extended slicing (e.g. a[0:10:2]).""")), + PString("str", PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().slots(StringBuiltins.SLOTS).doc(""" + str(object='') -> str + str(bytes_or_buffer[, encoding[, errors]]) -> str + + Create a new string object from the given object. If encoding or + errors is specified, then the object must expose a data buffer + that will be decoded using the given encoding and error handler. + Otherwise, returns the result of object.__str__() (if defined) + or repr(object). + encoding defaults to sys.getdefaultencoding(). + errors defaults to 'strict'.""")), + PTraceback("traceback", PythonObject, newBuilder().basetype().slots(TracebackBuiltins.SLOTS)), + PTuple("tuple", PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().slots(TupleBuiltins.SLOTS).doc(""" + Built-in immutable sequence. + + If no argument is given, the constructor returns an empty tuple. + If iterable is specified the tuple is initialized from iterable's items. + + If the argument is a tuple, the return value is the same object.""")), + PythonModule("module", PythonObject, newBuilder().basetype().addDict().slots(ModuleBuiltins.SLOTS).doc(""" + Create a module object. + + The name must be a string; the optional doc argument can have any type.""")), + PythonModuleDef("moduledef", PythonObject, newBuilder()), + Super("super", PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().slots(SuperBuiltins.SLOTS).doc(""" + super() -> same as super(__class__, ) + super(type) -> unbound super object + super(type, obj) -> bound super object; requires isinstance(obj, type) + super(type, type2) -> bound super object; requires issubclass(type2, type) + Typical use to call a cooperative superclass method: + class C(B): + def meth(self, arg): + super().meth(arg) + This works for class methods too: + class C(B): + @classmethod + def cmeth(cls, arg): + super().cmeth(arg)""")), + PCode("code", PythonObject, newBuilder().slots(CodeBuiltins.SLOTS)), + PGenericAlias("GenericAlias", PythonObject, newBuilder().publishInModule(J_TYPES).basetype().slots(GenericAliasBuiltins.SLOTS)), + PGenericAliasIterator("generic_alias_iterator", PythonObject, newBuilder().slots(GenericAliasIteratorBuiltins.SLOTS)), + PUnionType("UnionType", PythonObject, newBuilder().publishInModule(J_TYPES).slots(UnionTypeBuiltins.SLOTS)), + PZip( + "zip", + PythonObject, + newBuilder().publishInModule(J_BUILTINS).basetype().slots(ZipBuiltins.SLOTS).doc(""" + zip(*iterables, strict=False) --> Yield tuples until an input is exhausted. + + >>> list(zip('abcdefg', range(3), range(4))) + [('a', 0, 0), ('b', 1, 1), ('c', 2, 2)] + + The zip object yields n-length tuples, where n is the number of iterables + passed as positional arguments to zip(). The i-th element in every tuple + comes from the i-th iterable argument to zip(). This continues until the + shortest argument is exhausted. + + If strict is true and one of the arguments is exhausted before the others, + raise a ValueError.""")), + PThreadLocal("_local", PythonObject, newBuilder().publishInModule(J__THREAD).basetype().slots(ThreadLocalBuiltins.SLOTS)), + PLock("LockType", PythonObject, newBuilder().publishInModule(J__THREAD).disallowInstantiation().slots(CommonLockBuiltins.SLOTS, LockTypeBuiltins.SLOTS)), + PRLock("RLock", PythonObject, newBuilder().publishInModule(J__THREAD).basetype().slots(CommonLockBuiltins.SLOTS, RLockBuiltins.SLOTS)), + PSemLock("SemLock", PythonObject, newBuilder().publishInModule("_multiprocessing").basetype().slots(SemLockBuiltins.SLOTS)), + PGraalPySemLock("SemLock", PythonObject, newBuilder().publishInModule("_multiprocessing_graalpy").basetype().slots(GraalPySemLockBuiltins.SLOTS)), + PSocket("socket", PythonObject, newBuilder().publishInModule(J__SOCKET).basetype().slots(SocketBuiltins.SLOTS)), + PStaticmethod("staticmethod", PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().addDict().slots(StaticmethodBuiltins.SLOTS).doc(""" + staticmethod(function) -> method + + Convert a function to be a static method. + + A static method does not receive an implicit first argument. + To declare a static method, use this idiom: + + class C: + @staticmethod + def f(arg1, arg2, argN): + ... + + It can be called either on the class (e.g. C.f()) or on an instance + (e.g. C().f()). Both the class and the instance are ignored, and + neither is passed implicitly as the first argument to the method. + + Static methods in Python are similar to those found in Java or C++. + For a more advanced concept, see the classmethod builtin.""")), + PClassmethod("classmethod", PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().addDict().slots(ClassmethodCommonBuiltins.SLOTS, ClassmethodBuiltins.SLOTS).doc(""" + classmethod(function) -> method + + Convert a function to be a class method. + + A class method receives the class as implicit first argument, + just like an instance method receives the instance. + To declare a class method, use this idiom: + + class C: + @classmethod + def f(cls, arg1, arg2, argN): + ... + + It can be called either on the class (e.g. C.f()) or on an instance + (e.g. C().f()). The instance is ignored except for its class. + If a class method is called for a derived class, the derived class + object is passed as the implied first argument. + + Class methods are different than C++ or Java static methods. + If you want those, see the staticmethod builtin.""")), + PInstancemethod("instancemethod", PythonObject, newBuilder().basetype().addDict().slots(InstancemethodBuiltins.SLOTS).doc(""" + instancemethod(function) + + Bind a function to a class.""")), + PScandirIterator("ScandirIterator", PythonObject, newBuilder().moduleName(J_POSIX).disallowInstantiation().slots(ScandirIteratorBuiltins.SLOTS)), + PDirEntry("DirEntry", PythonObject, newBuilder().publishInModule(J_POSIX).disallowInstantiation().slots(DirEntryBuiltins.SLOTS)), + LsprofProfiler("Profiler", PythonObject, newBuilder().publishInModule("_lsprof").basetype().slots(ProfilerBuiltins.SLOTS)), + PStruct("Struct", PythonObject, newBuilder().publishInModule(J__STRUCT).basetype().slots(StructBuiltins.SLOTS)), + PStructUnpackIterator("unpack_iterator", PythonObject, newBuilder().publishInModule(J__STRUCT).basetype().slots(StructUnpackIteratorBuiltins.SLOTS)), + Pickler("Pickler", PythonObject, newBuilder().publishInModule("_pickle").basetype().slots(PicklerBuiltins.SLOTS)), + PicklerMemoProxy("PicklerMemoProxy", PythonObject, newBuilder().publishInModule("_pickle").basetype().slots(PicklerMemoProxyBuiltins.SLOTS)), + UnpicklerMemoProxy("UnpicklerMemoProxy", PythonObject, newBuilder().publishInModule("_pickle").basetype().slots(UnpicklerMemoProxyBuiltins.SLOTS)), + Unpickler("Unpickler", PythonObject, newBuilder().publishInModule("_pickle").basetype().slots(UnpicklerBuiltins.SLOTS)), + PickleBuffer("PickleBuffer", PythonObject, newBuilder().publishInModule("_pickle").basetype().slots(PickleBufferBuiltins.SLOTS)), + + // Errors and exceptions: + + // everything after BaseException is considered to be an exception + PBaseException("BaseException", PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().addDict().slots(BaseExceptionBuiltins.SLOTS).doc(""" + Common base class for all exceptions""")), + PBaseExceptionGroup("BaseExceptionGroup", PBaseException, newBuilder().publishInModule(J_BUILTINS).basetype().addDict().slots(BaseExceptionGroupBuiltins.SLOTS).doc(""" + A combination of multiple unrelated exceptions.""")), + SystemExit("SystemExit", PBaseException, newBuilder().publishInModule(J_BUILTINS).basetype().addDict().slots(SystemExitBuiltins.SLOTS)), + KeyboardInterrupt("KeyboardInterrupt", PBaseException, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + GeneratorExit("GeneratorExit", PBaseException, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + Exception("Exception", PBaseException, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + ReferenceError("ReferenceError", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + RuntimeError("RuntimeError", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + NotImplementedError("NotImplementedError", RuntimeError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + SyntaxError("SyntaxError", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict().slots(SyntaxErrorBuiltins.SLOTS)), + IndentationError("IndentationError", SyntaxError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict().slots(SyntaxErrorBuiltins.SLOTS)), + TabError("TabError", IndentationError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict().slots(SyntaxErrorBuiltins.SLOTS)), + SystemError("SystemError", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + TypeError("TypeError", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + ValueError("ValueError", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + StopIteration("StopIteration", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict().slots(StopIterationBuiltins.SLOTS)), + StopAsyncIteration("StopAsyncIteration", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + ArithmeticError("ArithmeticError", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + FloatingPointError("FloatingPointError", ArithmeticError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + OverflowError("OverflowError", ArithmeticError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + ZeroDivisionError("ZeroDivisionError", ArithmeticError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + AssertionError("AssertionError", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + AttributeError("AttributeError", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict().slots(AttributeErrorBuiltins.SLOTS)), + BufferError("BufferError", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + EOFError("EOFError", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + ImportError("ImportError", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict().slots(ImportErrorBuiltins.SLOTS)), + ModuleNotFoundError("ModuleNotFoundError", ImportError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + LookupError("LookupError", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + IndexError("IndexError", LookupError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + KeyError("KeyError", LookupError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict().slots(KeyErrorBuiltins.SLOTS)), + MemoryError("MemoryError", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + NameError("NameError", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + UnboundLocalError("UnboundLocalError", NameError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + OSError("OSError", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict().slots(OsErrorBuiltins.SLOTS)), + BlockingIOError("BlockingIOError", OSError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + ChildProcessError("ChildProcessError", OSError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + ConnectionError("ConnectionError", OSError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + BrokenPipeError("BrokenPipeError", ConnectionError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + ConnectionAbortedError("ConnectionAbortedError", ConnectionError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + ConnectionRefusedError("ConnectionRefusedError", ConnectionError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + ConnectionResetError("ConnectionResetError", ConnectionError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + FileExistsError("FileExistsError", OSError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + FileNotFoundError("FileNotFoundError", OSError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + InterruptedError("InterruptedError", OSError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + IsADirectoryError("IsADirectoryError", OSError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + NotADirectoryError("NotADirectoryError", OSError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + PermissionError("PermissionError", OSError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + ProcessLookupError("ProcessLookupError", OSError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + TimeoutError("TimeoutError", OSError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + ZLibError("error", Exception, newBuilder().publishInModule("zlib").basetype().addDict()), + CSVError("Error", Exception, newBuilder().publishInModule("_csv").basetype().addDict()), + LZMAError("LZMAError", Exception, newBuilder().publishInModule("_lzma").basetype().addDict()), + StructError("StructError", Exception, newBuilder().publishInModule(J__STRUCT).basetype().addDict()), + PickleError("PickleError", Exception, newBuilder().publishInModule("_pickle").basetype().addDict()), + PicklingError("PicklingError", PickleError, newBuilder().publishInModule("_pickle").basetype().addDict()), + UnpicklingError("UnpicklingError", PickleError, newBuilder().publishInModule("_pickle").basetype().addDict()), + SocketGAIError("gaierror", OSError, newBuilder().publishInModule(J__SOCKET).basetype().addDict()), + SocketHError("herror", OSError, newBuilder().publishInModule(J__SOCKET).basetype().addDict()), + BinasciiError("Error", ValueError, newBuilder().publishInModule("binascii").basetype().addDict()), + BinasciiIncomplete("Incomplete", Exception, newBuilder().publishInModule("binascii").basetype().addDict()), + SSLError("SSLError", OSError, newBuilder().publishInModule(J__SSL).basetype().addDict().slots(SSLErrorBuiltins.SLOTS)), + SSLZeroReturnError("SSLZeroReturnError", SSLError, newBuilder().publishInModule(J__SSL).basetype().addDict()), + SSLWantReadError("SSLWantReadError", SSLError, newBuilder().publishInModule(J__SSL).basetype().addDict()), + SSLWantWriteError("SSLWantWriteError", SSLError, newBuilder().publishInModule(J__SSL).basetype().addDict()), + SSLSyscallError("SSLSyscallError", SSLError, newBuilder().publishInModule(J__SSL).basetype().addDict()), + SSLEOFError("SSLEOFError", SSLError, newBuilder().publishInModule(J__SSL).basetype().addDict()), + SSLCertVerificationError("SSLCertVerificationError", SSLError, newBuilder().publishInModule(J__SSL).basetype().addDict()), + + // todo: all OS errors + + UnicodeError("UnicodeError", ValueError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + UnicodeDecodeError("UnicodeDecodeError", UnicodeError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict().slots(UnicodeDecodeErrorBuiltins.SLOTS)), + UnicodeEncodeError("UnicodeEncodeError", UnicodeError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict().slots(UnicodeEncodeErrorBuiltins.SLOTS)), + UnicodeTranslateError("UnicodeTranslateError", UnicodeError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict().slots(UnicodeTranslateErrorBuiltins.SLOTS)), + RecursionError("RecursionError", RuntimeError, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + + /* + * _io.UnsupportedOperation inherits from ValueError and OSError done currently within + * IOModuleBuiltins class + */ + IOUnsupportedOperation("UnsupportedOperation", OSError, newBuilder().publishInModule("io").basetype().addDict()), + + Empty("Empty", Exception, newBuilder().publishInModule("_queue").basetype().addDict()), + + UnsupportedMessage("UnsupportedMessage", Exception, newBuilder().publishInModule(J_POLYGLOT).basetype().addDict()), + + // warnings + Warning("Warning", Exception, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + BytesWarning("BytesWarning", Warning, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + DeprecationWarning("DeprecationWarning", Warning, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + FutureWarning("FutureWarning", Warning, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + ImportWarning("ImportWarning", Warning, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + PendingDeprecationWarning("PendingDeprecationWarning", Warning, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + ResourceWarning("ResourceWarning", Warning, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + RuntimeWarning("RuntimeWarning", Warning, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + SyntaxWarning("SyntaxWarning", Warning, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + UnicodeWarning("UnicodeWarning", Warning, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + UserWarning("UserWarning", Warning, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + EncodingWarning("EncodingWarning", Warning, newBuilder().publishInModule(J_BUILTINS).basetype().addDict()), + + // Foreign + ForeignObject("ForeignObject", PythonObject, newBuilder().publishInModule(J_POLYGLOT).basetype().addDict().disallowInstantiation().slots(ForeignObjectBuiltins.SLOTS)), + ForeignNumber( + "ForeignNumber", + ForeignObject, + newBuilder().publishInModule(J_POLYGLOT).basetype().addDict().disallowInstantiation().slots(ForeignNumberBuiltins.SLOTS)), + ForeignBoolean( + "ForeignBoolean", + ForeignNumber, + newBuilder().publishInModule(J_POLYGLOT).basetype().addDict().disallowInstantiation().slots(ForeignBooleanBuiltins.SLOTS)), + ForeignAbstractClass("ForeignAbstractClass", ForeignObject, newBuilder().publishInModule(J_POLYGLOT).basetype().addDict().disallowInstantiation()), + ForeignExecutable("ForeignExecutable", ForeignObject, newBuilder().publishInModule(J_POLYGLOT).basetype().addDict().disallowInstantiation().slots(ForeignExecutableBuiltins.SLOTS)), + ForeignInstantiable("ForeignInstantiable", ForeignObject, newBuilder().publishInModule(J_POLYGLOT).basetype().addDict().slots(ForeignInstantiableBuiltins.SLOTS)), + ForeignIterable("ForeignIterable", ForeignObject, newBuilder().publishInModule(J_POLYGLOT).basetype().addDict().disallowInstantiation().slots(ForeignIterableBuiltins.SLOTS)), // bz2 - BZ2Compressor("BZ2Compressor", "_bz2"), - BZ2Decompressor("BZ2Decompressor", "_bz2"), + BZ2Compressor("BZ2Compressor", PythonObject, newBuilder().publishInModule("_bz2").basetype().slots(BZ2CompressorBuiltins.SLOTS)), + BZ2Decompressor("BZ2Decompressor", PythonObject, newBuilder().publishInModule("_bz2").basetype().slots(BZ2DecompressorBuiltins.SLOTS)), // lzma - PLZMACompressor("LZMACompressor", "_lzma"), - PLZMADecompressor("LZMADecompressor", "_lzma"), + PLZMACompressor("LZMACompressor", PythonObject, newBuilder().publishInModule("_lzma").basetype().slots(LZMACompressorBuiltins.SLOTS)), + PLZMADecompressor("LZMADecompressor", PythonObject, newBuilder().publishInModule("_lzma").basetype().slots(LZMADecompressorBuiltins.SLOTS)), // zlib - ZlibCompress("Compress", "zlib"), - ZlibDecompress("Decompress", "zlib"), + ZlibCompress("Compress", PythonObject, newBuilder().publishInModule("zlib").disallowInstantiation()), + ZlibDecompress("Decompress", PythonObject, newBuilder().publishInModule("zlib").disallowInstantiation()), // io - PIOBase("_IOBase", "_io", Flags.PUBLIC_BASE_WDICT), - PRawIOBase("_RawIOBase", "_io"), - PTextIOBase("_TextIOBase", "_io"), - PBufferedIOBase("_BufferedIOBase", "_io"), - PBufferedReader("BufferedReader", "_io", Flags.PUBLIC_BASE_WDICT), - PBufferedWriter("BufferedWriter", "_io", Flags.PUBLIC_BASE_WDICT), - PBufferedRWPair("BufferedRWPair", "_io", Flags.PUBLIC_BASE_WDICT), - PBufferedRandom("BufferedRandom", "_io", Flags.PUBLIC_BASE_WDICT), - PFileIO("FileIO", "_io", Flags.PUBLIC_BASE_WDICT), - PTextIOWrapper("TextIOWrapper", "_io", Flags.PUBLIC_BASE_WDICT), - PIncrementalNewlineDecoder("IncrementalNewlineDecoder", "_io", Flags.PUBLIC_BASE_WODICT), - PStringIO("StringIO", "_io", Flags.PUBLIC_BASE_WDICT), - PBytesIO("BytesIO", "_io", Flags.PUBLIC_BASE_WDICT), - PBytesIOBuf("_BytesIOBuffer", "_io", Flags.PRIVATE_BASE_WODICT), - - PStatResult("stat_result", "os", Flags.PUBLIC_DERIVED_WODICT, TUPLE_M_FLAGS), - PStatvfsResult("statvfs_result", "os", Flags.PUBLIC_DERIVED_WODICT, TUPLE_M_FLAGS), - PTerminalSize("terminal_size", "os", Flags.PUBLIC_DERIVED_WODICT, TUPLE_M_FLAGS), - PUnameResult("uname_result", J_POSIX, Flags.PUBLIC_DERIVED_WODICT, TUPLE_M_FLAGS), - PStructTime("struct_time", "time", Flags.PUBLIC_DERIVED_WODICT, TUPLE_M_FLAGS), - PProfilerEntry("profiler_entry", "_lsprof", Flags.PUBLIC_DERIVED_WODICT, TUPLE_M_FLAGS), - PProfilerSubentry("profiler_subentry", "_lsprof", Flags.PUBLIC_DERIVED_WODICT, TUPLE_M_FLAGS), - PStructPasswd("struct_passwd", "pwd", Flags.PUBLIC_DERIVED_WODICT, TUPLE_M_FLAGS), - PStructRusage("struct_rusage", "resource", Flags.PUBLIC_DERIVED_WODICT, TUPLE_M_FLAGS), - PVersionInfo("version_info", "sys", Flags.PUBLIC_DERIVED_WODICT, TUPLE_M_FLAGS), - PWindowsVersion("windowsversion", "sys", Flags.PUBLIC_DERIVED_WODICT, TUPLE_M_FLAGS), - PFlags("flags", "sys", Flags.PUBLIC_DERIVED_WODICT, TUPLE_M_FLAGS), - PFloatInfo("float_info", "sys", Flags.PUBLIC_DERIVED_WODICT, TUPLE_M_FLAGS), - PIntInfo("int_info", "sys", Flags.PUBLIC_DERIVED_WODICT, TUPLE_M_FLAGS), - PHashInfo("hash_info", "sys", Flags.PUBLIC_DERIVED_WODICT, TUPLE_M_FLAGS), - PThreadInfo("thread_info", "sys", Flags.PUBLIC_DERIVED_WODICT, TUPLE_M_FLAGS), - PUnraisableHookArgs("UnraisableHookArgs", "sys", Flags.PUBLIC_DERIVED_WODICT, TUPLE_M_FLAGS), - - PSSLSession("SSLSession", J__SSL), - PSSLContext("_SSLContext", J__SSL), - PSSLSocket("_SSLSocket", J__SSL), - PMemoryBIO("MemoryBIO", J__SSL), + PIOBase("_IOBase", PythonObject, newBuilder().publishInModule("_io").basetype().addDict().slots(IOBaseBuiltins.SLOTS)), + PRawIOBase("_RawIOBase", PIOBase, newBuilder().publishInModule("_io").basetype().slots(IOBaseBuiltins.SLOTS)), + PTextIOBase("_TextIOBase", PIOBase, newBuilder().publishInModule("_io").basetype().slots(IOBaseBuiltins.SLOTS)), + PBufferedIOBase("_BufferedIOBase", PIOBase, newBuilder().publishInModule("_io").basetype().slots(IOBaseBuiltins.SLOTS)), + PBufferedReader( + "BufferedReader", + PBufferedIOBase, + newBuilder().publishInModule("_io").basetype().addDict().slots(BufferedReaderMixinBuiltins.SLOTS, BufferedIOMixinBuiltins.SLOTS, BufferedReaderBuiltins.SLOTS)), + PBufferedWriter("BufferedWriter", PBufferedIOBase, newBuilder().publishInModule("_io").basetype().addDict().slots(BufferedIOMixinBuiltins.SLOTS, BufferedWriterBuiltins.SLOTS)), + PBufferedRWPair("BufferedRWPair", PBufferedIOBase, newBuilder().publishInModule("_io").basetype().addDict().slots(BufferedRWPairBuiltins.SLOTS)), + PBufferedRandom( + "BufferedRandom", + PBufferedIOBase, + newBuilder().publishInModule("_io").basetype().addDict().slots(BufferedReaderMixinBuiltins.SLOTS, BufferedIOMixinBuiltins.SLOTS, BufferedRandomBuiltins.SLOTS)), + PWindowsConsoleIO("_WindowsConsoleIO", PRawIOBase, newBuilder().moduleName("_io").basetype()), + PFileIO("FileIO", PRawIOBase, newBuilder().publishInModule("_io").basetype().addDict().slots(FileIOBuiltins.SLOTS)), + PTextIOWrapper("TextIOWrapper", PTextIOBase, newBuilder().publishInModule("_io").basetype().addDict().slots(TextIOWrapperBuiltins.SLOTS)), + PIncrementalNewlineDecoder("IncrementalNewlineDecoder", PythonObject, newBuilder().publishInModule("_io").basetype().slots(IncrementalNewlineDecoderBuiltins.SLOTS)), + PStringIO("StringIO", PTextIOBase, newBuilder().publishInModule("_io").basetype().addDict().slots(StringIOBuiltins.SLOTS)), + PBytesIO("BytesIO", PBufferedIOBase, newBuilder().publishInModule("_io").basetype().addDict().slots(BytesIOBuiltins.SLOTS)), + PBytesIOBuf("_BytesIOBuffer", PythonObject, newBuilder().moduleName("_io").basetype()), + + PStatResult( + "stat_result", + PTuple, + newBuilder().publishInModule("os").slots(StructSequenceBuiltins.SLOTS, StatResultBuiltins.SLOTS).doc(""" + stat_result: Result from stat, fstat, or lstat. + + This object may be accessed either as a tuple of + (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) + or via the attributes st_mode, st_ino, st_dev, st_nlink, st_uid, and so on. + + Posix/windows: If your platform supports st_blksize, st_blocks, st_rdev, + or st_flags, they are available as attributes only. + + See os.stat for more information.""")), + PStatvfsResult("statvfs_result", PTuple, newBuilder().publishInModule("os").slots(StructSequenceBuiltins.SLOTS, InstantiableStructSequenceBuiltins.SLOTS).doc(""" + statvfs_result: Result from statvfs or fstatvfs. + + This object may be accessed either as a tuple of + (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax), + or via the attributes f_bsize, f_frsize, f_blocks, f_bfree, and so on. + + See os.statvfs for more information.""")), + PTerminalSize("terminal_size", PTuple, newBuilder().publishInModule("os").slots(StructSequenceBuiltins.SLOTS, InstantiableStructSequenceBuiltins.SLOTS).doc(""" + A tuple of (columns, lines) for holding terminal window size""")), + PUnameResult("uname_result", PTuple, newBuilder().publishInModule(J_POSIX).slots(StructSequenceBuiltins.SLOTS, InstantiableStructSequenceBuiltins.SLOTS).doc(""" + uname_result: Result from os.uname(). + + This object may be accessed either as a tuple of + (sysname, nodename, release, version, machine), + or via the attributes sysname, nodename, release, version, and machine. + + See os.uname for more information.""")), + PStructTime("struct_time", PTuple, newBuilder().publishInModule("time").slots(StructSequenceBuiltins.SLOTS, InstantiableStructSequenceBuiltins.SLOTS).doc(""" + The time value as returned by gmtime(), localtime(), and strptime(), and + accepted by asctime(), mktime() and strftime(). May be considered as a + sequence of 9 integers. + + Note that several fields' values are not the same as those defined by + the C language standard for struct tm. For example, the value of the + field tm_year is the actual year, not year - 1900. See individual + fields' descriptions for details.""")), + PProfilerEntry("profiler_entry", PTuple, newBuilder().publishInModule("_lsprof").slots(StructSequenceBuiltins.SLOTS, InstantiableStructSequenceBuiltins.SLOTS)), + PProfilerSubentry("profiler_subentry", PTuple, newBuilder().publishInModule("_lsprof").slots(StructSequenceBuiltins.SLOTS, InstantiableStructSequenceBuiltins.SLOTS)), + PStructPasswd("struct_passwd", PTuple, newBuilder().publishInModule("pwd").slots(StructSequenceBuiltins.SLOTS, InstantiableStructSequenceBuiltins.SLOTS).doc(""" + pwd.struct_passwd: Results from getpw*() routines. + + This object may be accessed either as a tuple of + (pw_name,pw_passwd,pw_uid,pw_gid,pw_gecos,pw_dir,pw_shell) + or via the object attributes as named in the above tuple.""")), + PStructRusage("struct_rusage", PTuple, newBuilder().publishInModule("resource").slots(StructSequenceBuiltins.SLOTS, InstantiableStructSequenceBuiltins.SLOTS).doc(""" + struct_rusage: Result from getrusage. + + This object may be accessed either as a tuple of + (utime,stime,maxrss,ixrss,idrss,isrss,minflt,majflt, + nswap,inblock,oublock,msgsnd,msgrcv,nsignals,nvcsw,nivcsw) + or via the attributes ru_utime, ru_stime, ru_maxrss, and so on.""")), + PVersionInfo("version_info", PTuple, newBuilder().publishInModule("sys").disallowInstantiation().slots(StructSequenceBuiltins.SLOTS).doc(""" + sys.version_info + + Version information as a named tuple.""")), + PWindowsVersion("windowsversion", PTuple, newBuilder().publishInModule("sys").disallowInstantiation().slots(StructSequenceBuiltins.SLOTS).doc(""" + sys.getwindowsversion + + Return info about the running version of Windows as a named tuple.""")), + PFlags("flags", PTuple, newBuilder().publishInModule("sys").disallowInstantiation().slots(StructSequenceBuiltins.SLOTS).doc(""" + sys.flags + + Flags provided through command line arguments or environment vars.""")), + PFloatInfo("float_info", PTuple, newBuilder().publishInModule("sys").slots(StructSequenceBuiltins.SLOTS, InstantiableStructSequenceBuiltins.SLOTS).doc(""" + sys.float_info + + A named tuple holding information about the float type. It contains low level + information about the precision and internal representation. Please study + your system's :file:`float.h` for more information.""")), + PIntInfo("int_info", PTuple, newBuilder().publishInModule("sys").slots(StructSequenceBuiltins.SLOTS, InstantiableStructSequenceBuiltins.SLOTS).doc(""" + sys.int_info + + A named tuple that holds information about Python's + internal representation of integers. The attributes are read only.""")), + PHashInfo("hash_info", PTuple, newBuilder().publishInModule("sys").slots(StructSequenceBuiltins.SLOTS, InstantiableStructSequenceBuiltins.SLOTS).doc(""" + hash_info + + A named tuple providing parameters used for computing + hashes. The attributes are read only.""")), + PThreadInfo("thread_info", PTuple, newBuilder().publishInModule("sys").slots(StructSequenceBuiltins.SLOTS, InstantiableStructSequenceBuiltins.SLOTS).doc(""" + sys.thread_info + + A named tuple holding information about the thread implementation.""")), + PUnraisableHookArgs( + "UnraisableHookArgs", + PTuple, + newBuilder().publishInModule("sys").slots(StructSequenceBuiltins.SLOTS, InstantiableStructSequenceBuiltins.SLOTS).doc(""" + UnraisableHookArgs + + Type used to pass arguments to sys.unraisablehook.""")), + + PSSLSession("SSLSession", PythonObject, newBuilder().publishInModule(J__SSL).disallowInstantiation()), + PSSLContext("_SSLContext", PythonObject, newBuilder().publishInModule(J__SSL).basetype().slots(SSLContextBuiltins.SLOTS)), + PSSLSocket("_SSLSocket", PythonObject, newBuilder().publishInModule(J__SSL).basetype()), + PMemoryBIO("MemoryBIO", PythonObject, newBuilder().publishInModule(J__SSL).basetype().slots(MemoryBIOBuiltins.SLOTS)), // itertools - PTee("_tee", "itertools", Flags.PUBLIC_DERIVED_WODICT), - PTeeDataObject("_tee_dataobject", "itertools", Flags.PUBLIC_DERIVED_WODICT), - PAccumulate("accumulate", "itertools"), - PCombinations("combinations", "itertools"), - PCombinationsWithReplacement("combinations_with_replacement", "itertools"), - PCompress("compress", "itertools"), - PCycle("cycle", "itertools"), - PDropwhile("dropwhile", "itertools"), - PFilterfalse("filterfalse", "itertools"), - PGroupBy("groupby", "itertools"), - PGrouper("grouper", "itertools", Flags.PUBLIC_DERIVED_WODICT), - PPairwise("pairwise", "itertools"), - PPermutations("permutations", "itertools"), - PProduct("product", "itertools"), - PRepeat("repeat", "itertools"), - PChain("chain", "itertools"), - PCount("count", "itertools"), - PIslice("islice", "itertools"), - PStarmap("starmap", "itertools"), - PTakewhile("takewhile", "itertools"), - PZipLongest("zip_longest", "itertools"), + PTee("_tee", PythonObject, newBuilder().publishInModule("itertools").slots(TeeBuiltins.SLOTS)), + PTeeDataObject("_tee_dataobject", PythonObject, newBuilder().publishInModule("itertools").slots(TeeDataObjectBuiltins.SLOTS)), + PAccumulate("accumulate", PythonObject, newBuilder().publishInModule("itertools").basetype().slots(AccumulateBuiltins.SLOTS).doc(""" + accumulate(iterable) --> accumulate object + + Return series of accumulated sums.""")), + PCombinations("combinations", PythonObject, newBuilder().publishInModule("itertools").basetype().slots(CombinationsBuiltins.SLOTS).doc(""" + combinations(iterable, r) --> combinations object + + Return successive r-length combinations of elements in the iterable. + + combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)""")), + PCombinationsWithReplacement( + "combinations_with_replacement", + PythonObject, + newBuilder().publishInModule("itertools").basetype().slots(CombinationsBuiltins.SLOTS, CombinationsWithReplacementBuiltins.SLOTS).doc(""" + combinations_with_replacement(iterable, r) --> combinations_with_replacement object + + Return successive r-length combinations of elements in the iterable + allowing individual elements to have successive repeats. + combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC""")), + PCompress("compress", PythonObject, newBuilder().publishInModule("itertools").basetype().slots(CompressBuiltins.SLOTS).doc(""" + Make an iterator that filters elements from *data* returning + only those that have a corresponding element in *selectors* that evaluates to + ``True``. Stops when either the *data* or *selectors* iterables has been + exhausted. + Equivalent to:: + + \tdef compress(data, selectors): + \t\t# compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F + \t\treturn (d for d, s in zip(data, selectors) if s)""")), + PCycle("cycle", PythonObject, newBuilder().publishInModule("itertools").basetype().slots(CycleBuiltins.SLOTS).doc(""" + Make an iterator returning elements from the iterable and + saving a copy of each. When the iterable is exhausted, return + elements from the saved copy. Repeats indefinitely. + + Equivalent to : + + def cycle(iterable): + \tsaved = [] + \tfor element in iterable: + \t\tyield element + \t\tsaved.append(element) + \twhile saved: + \t\tfor element in saved: + \t\t\tyield element""")), + PDropwhile("dropwhile", PythonObject, newBuilder().publishInModule("itertools").basetype().slots(DropwhileBuiltins.SLOTS).doc(""" + dropwhile(predicate, iterable) --> dropwhile object + + Drop items from the iterable while predicate(item) is true. + Afterwards, return every element until the iterable is exhausted.""")), + PFilterfalse("filterfalse", PythonObject, newBuilder().publishInModule("itertools").basetype().slots(FilterfalseBuiltins.SLOTS).doc(""" + filterfalse(function or None, sequence) --> filterfalse object + + Return those items of sequence for which function(item) is false. + If function is None, return the items that are false.""")), + PGroupBy("groupby", PythonObject, newBuilder().publishInModule("itertools").basetype().slots(GroupByBuiltins.SLOTS).doc(""" + Make an iterator that returns consecutive keys and groups from the + iterable. The key is a function computing a key value for each + element. If not specified or is None, key defaults to an identity + function and returns the element unchanged. Generally, the + iterable needs to already be sorted on the same key function. + + The returned group is itself an iterator that shares the + underlying iterable with groupby(). Because the source is shared, + when the groupby object is advanced, the previous group is no + longer visible. So, if that data is needed later, it should be + stored as a list: + + \tgroups = [] + \tuniquekeys = [] + \tfor k, g in groupby(data, keyfunc): + \t\tgroups.append(list(g)) # Store group iterator as a list + \t\tuniquekeys.append(k)""")), + PGrouper("grouper", PythonObject, newBuilder().publishInModule("itertools").slots(GrouperBuiltins.SLOTS)), + PPairwise("pairwise", PythonObject, newBuilder().publishInModule("itertools").basetype().slots(PairwiseBuiltins.SLOTS).doc(""" + Return an iterator of overlapping pairs taken from the input iterator. + + s -> (s0,s1), (s1,s2), (s2, s3), ...""")), + PPermutations("permutations", PythonObject, newBuilder().publishInModule("itertools").basetype().slots(PermutationsBuiltins.SLOTS).doc(""" + permutations(iterable[, r]) --> permutations object + + Return successive r-length permutations of elements in the iterable. + + permutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)""")), + PProduct("product", PythonObject, newBuilder().publishInModule("itertools").basetype().slots(ProductBuiltins.SLOTS).doc(""" + Cartesian product of input iterables. + + Equivalent to nested for-loops in a generator expression. For example, + ``product(A, B)`` returns the same as ``((x,y) for x in A for y in B)``. + + The nested loops cycle like an odometer with the rightmost element advancing + on every iteration. This pattern creates a lexicographic ordering so that if + the input's iterables are sorted, the product tuples are emitted in sorted + order. + + To compute the product of an iterable with itself, specify the number of + repetitions with the optional *repeat* keyword argument. For example, + ``product(A, repeat=4)`` means the same as ``product(A, A, A, A)``. + + This function is equivalent to the following code, except that the + actual implementation does not build up intermediate results in memory:: + + def product(*args, **kwds): + \t# product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy + \t# product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111 + \tpools = map(tuple, args) * kwds.get('repeat', 1) + \tresult = [[]] + \tfor pool in pools: + \t\tresult = [x+[y] for x in result for y in pool] + \tfor prod in result: + \t\tyield tuple(prod)""")), + PRepeat("repeat", PythonObject, newBuilder().publishInModule("itertools").basetype().slots(RepeatBuiltins.SLOTS).doc(""" + repeat(object [,times]) -> create an iterator which returns the object + for the specified number of times. If not specified, returns the object + endlessly.""")), + PChain("chain", PythonObject, newBuilder().publishInModule("itertools").basetype().slots(ChainBuiltins.SLOTS).doc(""" + Return a chain object whose .__next__() method returns elements from the + first iterable until it is exhausted, then elements from the next + iterable, until all of the iterables are exhausted.""")), + PCount("count", PythonObject, newBuilder().publishInModule("itertools").basetype().slots(CountBuiltins.SLOTS)), + PIslice("islice", PythonObject, newBuilder().publishInModule("itertools").basetype().slots(IsliceBuiltins.SLOTS)), + PStarmap("starmap", PythonObject, newBuilder().publishInModule("itertools").basetype().slots(StarmapBuiltins.SLOTS).doc(""" + starmap(function, sequence) --> starmap object + + Return an iterator whose values are returned from the function evaluated + with an argument tuple taken from the given sequence.""")), + PTakewhile("takewhile", PythonObject, newBuilder().publishInModule("itertools").basetype().slots(TakewhileBuiltins.SLOTS).doc(""" + Make an iterator that returns elements from the iterable as + long as the predicate is true. + + Equivalent to : + + def takewhile(predicate, iterable): + \tfor x in iterable: + \t\tif predicate(x): + \t\t\tyield x + \t\telse: + \t\t\tbreak""")), + PZipLongest("zip_longest", PythonObject, newBuilder().publishInModule("itertools").basetype().slots(ZipLongestBuiltins.SLOTS).doc(""" + zip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> zip_longest object + + Return a zip_longest object whose .next() method returns a tuple where + the i-th element comes from the i-th iterable argument. The .next() + method continues until the longest iterable in the argument sequence + is exhausted and then it raises StopIteration. When the shorter iterables + are exhausted, the fillvalue is substituted in their place. The fillvalue + defaults to None or can be specified by a keyword argument.""")), // json - JSONScanner("Scanner", "_json", Flags.PUBLIC_BASE_WODICT), - JSONEncoder("Encoder", "_json", Flags.PUBLIC_BASE_WODICT), + JSONScanner( + "Scanner", + PythonObject, + newBuilder().publishInModule("_json").basetype().slots(JSONScannerBuiltins.SLOTS).doc(""" + JSON scanner object""")), + JSONEncoder( + "Encoder", + PythonObject, + newBuilder().publishInModule("_json").basetype().slots(JSONEncoderBuiltins.SLOTS).doc(""" + _iterencode(obj, _current_indent_level) -> iterable""")), // csv - CSVDialect("Dialect", "_csv", Flags.PUBLIC_BASE_WODICT), - CSVReader("Reader", "_csv", Flags.PUBLIC_BASE_WODICT), - CSVWriter("Writer", "_csv", Flags.PUBLIC_BASE_WODICT), + CSVDialect("Dialect", PythonObject, newBuilder().publishInModule("_csv").basetype().slots(CSVDialectBuiltins.SLOTS)), + CSVReader("Reader", PythonObject, newBuilder().publishInModule("_csv").basetype().disallowInstantiation().slots(CSVReaderBuiltins.SLOTS)), + CSVWriter("Writer", PythonObject, newBuilder().publishInModule("_csv").basetype().disallowInstantiation()), // codecs - PEncodingMap("EncodingMap", Flags.PRIVATE_DERIVED_WODICT), + PEncodingMap("EncodingMap", PythonObject, newBuilder().disallowInstantiation()), // hashlib - MD5Type("md5", "_md5", Flags.PUBLIC_BASE_WODICT), - SHA1Type("sha1", "_sha1", Flags.PUBLIC_BASE_WODICT), - SHA224Type("sha224", "_sha256", Flags.PUBLIC_BASE_WODICT), - SHA256Type("sha256", "_sha256", Flags.PUBLIC_BASE_WODICT), - SHA384Type("sha384", "_sha512", Flags.PUBLIC_BASE_WODICT), - SHA512Type("sha512", "_sha512", Flags.PUBLIC_BASE_WODICT), - Sha3SHA224Type("sha3_224", "_sha3", Flags.PUBLIC_BASE_WODICT), - Sha3SHA256Type("sha3_256", "_sha3", Flags.PUBLIC_BASE_WODICT), - Sha3SHA384Type("sha3_384", "_sha3", Flags.PUBLIC_BASE_WODICT), - Sha3SHA512Type("sha3_512", "_sha3", Flags.PUBLIC_BASE_WODICT), - Sha3Shake128Type("shake_128", "_sha3", Flags.PUBLIC_BASE_WODICT), - Sha3Shake256Type("shake_256", "_sha3", Flags.PUBLIC_BASE_WODICT), - Blake2bType("blake2b", "_blake2", Flags.PUBLIC_BASE_WODICT), - Blake2sType("blake2s", "_blake2", Flags.PUBLIC_BASE_WODICT), - HashlibHash("HASH", "_hashlib", Flags.PUBLIC_BASE_WODICT), - HashlibHashXof("HASHXOF", "_hashlib", Flags.PUBLIC_DERIVED_WODICT), - HashlibHmac("HMAC", "_hashlib", Flags.PUBLIC_BASE_WODICT), - UnsupportedDigestmodError("UnsupportedDigestmodError", "_hashlib", Flags.EXCEPTION), + MD5Type("md5", PythonObject, newBuilder().publishInModule("_md5").basetype().disallowInstantiation()), + SHA1Type("sha1", PythonObject, newBuilder().publishInModule("_sha1").basetype().disallowInstantiation()), + SHA224Type("sha224", PythonObject, newBuilder().publishInModule("_sha256").basetype().disallowInstantiation()), + SHA256Type("sha256", PythonObject, newBuilder().publishInModule("_sha256").basetype().disallowInstantiation()), + SHA384Type("sha384", PythonObject, newBuilder().publishInModule("_sha512").basetype().disallowInstantiation()), + SHA512Type("sha512", PythonObject, newBuilder().publishInModule("_sha512").basetype().disallowInstantiation()), + Sha3SHA224Type("sha3_224", PythonObject, newBuilder().publishInModule("_sha3").basetype().slots(Sha3Builtins.SLOTS)), + Sha3SHA256Type("sha3_256", PythonObject, newBuilder().publishInModule("_sha3").basetype().slots(Sha3Builtins.SLOTS)), + Sha3SHA384Type("sha3_384", PythonObject, newBuilder().publishInModule("_sha3").basetype().slots(Sha3Builtins.SLOTS)), + Sha3SHA512Type("sha3_512", PythonObject, newBuilder().publishInModule("_sha3").basetype().slots(Sha3Builtins.SLOTS)), + Sha3Shake128Type("shake_128", PythonObject, newBuilder().publishInModule("_sha3").basetype().slots(Sha3Builtins.SLOTS)), + Sha3Shake256Type("shake_256", PythonObject, newBuilder().publishInModule("_sha3").basetype().slots(Sha3Builtins.SLOTS)), + Blake2bType("blake2b", PythonObject, newBuilder().publishInModule("_blake2").basetype().slots(Blake2bObjectBuiltins.SLOTS)), + /* Note we reuse the blake2b slots */ + Blake2sType("blake2s", PythonObject, newBuilder().publishInModule("_blake2").basetype().slots(Blake2bObjectBuiltins.SLOTS)), + HashlibHash("HASH", PythonObject, newBuilder().publishInModule("_hashlib").basetype().disallowInstantiation().slots(HashObjectBuiltins.SLOTS)), + HashlibHashXof("HASHXOF", HashlibHash, newBuilder().publishInModule("_hashlib").disallowInstantiation()), + HashlibHmac("HMAC", PythonObject, newBuilder().publishInModule("_hashlib").basetype().disallowInstantiation().slots(HashObjectBuiltins.SLOTS)), + UnsupportedDigestmodError("UnsupportedDigestmodError", ValueError, newBuilder().publishInModule("_hashlib").basetype().addDict()), // _ast (rest of the classes are not builtin, they are generated in AstModuleBuiltins) - AST("AST", "_ast", "ast", Flags.PUBLIC_BASE_WDICT), + AST("AST", PythonObject, newBuilder().moduleName("ast").publishInModule("_ast").basetype().addDict().slots(AstBuiltins.SLOTS)), // _ctype - CArgObject("CArgObject", Flags.PUBLIC_BASE_WODICT), - CThunkObject("CThunkObject", J__CTYPES, Flags.PUBLIC_BASE_WODICT), - StgDict("StgDict", Flags.PRIVATE_DERIVED_WODICT, DICT_M_FLAGS, StgDictBuiltins.SLOTS), - PyCStructType("PyCStructType", J__CTYPES, Flags.PUBLIC_BASE_WODICT, PYCSTRUCTTYPE_M_FLAGS, TpSlots.merge(CDataTypeSequenceBuiltins.SLOTS, PyCStructTypeBuiltins.SLOTS)), + CArgObject("CArgObject", PythonObject, newBuilder().basetype().slots(CArgObjectBuiltins.SLOTS)), + CThunkObject("CThunkObject", PythonObject, newBuilder().publishInModule(J__CTYPES).basetype()), + StgDict("StgDict", PDict, newBuilder().slots(StgDictBuiltins.SLOTS)), + PyCStructType( + "PyCStructType", + PythonClass, + newBuilder().publishInModule(J__CTYPES).basetype().slots(CDataTypeSequenceBuiltins.SLOTS, StructUnionTypeBuiltins.SLOTS, PyCStructTypeBuiltins.SLOTS)), UnionType( "UnionType", - J__CTYPES, - Flags.PUBLIC_BASE_WODICT, - UNIONTYPE_M_FLAGS, - TpSlots.merge(CDataTypeSequenceBuiltins.SLOTS, com.oracle.graal.python.builtins.modules.ctypes.UnionTypeBuiltins.SLOTS)), - PyCPointerType("PyCPointerType", J__CTYPES, Flags.PUBLIC_BASE_WODICT, PYCPOINTERTYPE_M_FLAGS, CDataTypeSequenceBuiltins.SLOTS), - PyCArrayType("PyCArrayType", J__CTYPES, Flags.PUBLIC_BASE_WODICT, PYCARRAYTYPE_M_FLAGS, CDataTypeSequenceBuiltins.SLOTS), - PyCSimpleType("PyCSimpleType", J__CTYPES, Flags.PUBLIC_BASE_WODICT, PYCSIMPLETYPE_M_FLAGS, CDataTypeSequenceBuiltins.SLOTS), - PyCFuncPtrType("PyCFuncPtrType", J__CTYPES, Flags.PUBLIC_BASE_WODICT, PYCFUNCPTRTYPE_M_FLAGS, CDataTypeSequenceBuiltins.SLOTS), - Structure("Structure", J__CTYPES, Flags.PUBLIC_BASE_WODICT), /*- type = PyCStructType */ - Union("Union", J__CTYPES, Flags.PUBLIC_BASE_WODICT), /*- type = UnionType */ - PyCPointer("_Pointer", J__CTYPES, Flags.PUBLIC_BASE_WODICT, PYCPOINTER_M_FLAGS, PyCPointerBuiltins.SLOTS), /*- type = PyCPointerType */ - PyCArray("Array", J__CTYPES, Flags.PUBLIC_BASE_WODICT, PYCARRAY_M_FLAGS, PyCArrayBuiltins.SLOTS), /*- type = PyCArrayType */ - PyCData("_CData", J__CTYPES, Flags.PUBLIC_BASE_WODICT), /*- type = PyCStructType */ - SimpleCData("_SimpleCData", J__CTYPES, Flags.PUBLIC_BASE_WODICT, SIMPLECDATA_M_FLAGS, SimpleCDataBuiltins.SLOTS), /*- type = PyCStructType */ - PyCFuncPtr("PyCFuncPtr", J__CTYPES, Flags.PUBLIC_BASE_WODICT, PYCFUNCPTR_M_FLAGS, PyCFuncPtrBuiltins.SLOTS), /*- type = PyCFuncPtrType */ - CField("CField", J__CTYPES, Flags.PUBLIC_BASE_WODICT, CFieldBuiltins.SLOTS), - DictRemover("DictRemover", J__CTYPES, Flags.PUBLIC_BASE_WODICT), - StructParam("StructParam_Type", J__CTYPES, Flags.PUBLIC_BASE_WODICT), - ArgError("ArgumentError", J__CTYPES, Flags.EXCEPTION), + PythonClass, + newBuilder().publishInModule(J__CTYPES).basetype().slots( + CDataTypeSequenceBuiltins.SLOTS, StructUnionTypeBuiltins.SLOTS, + com.oracle.graal.python.builtins.modules.ctypes.UnionTypeBuiltins.SLOTS)), + PyCPointerType( + "PyCPointerType", + PythonClass, + newBuilder().publishInModule(J__CTYPES).basetype().slots(CDataTypeSequenceBuiltins.SLOTS, PyCPointerTypeBuiltins.SLOTS)), + PyCArrayType( + "PyCArrayType", + PythonClass, + newBuilder().publishInModule(J__CTYPES).basetype().slots(CDataTypeSequenceBuiltins.SLOTS, PyCArrayTypeBuiltins.SLOTS)), + PyCSimpleType( + "PyCSimpleType", + PythonClass, + newBuilder().publishInModule(J__CTYPES).basetype().slots(CDataTypeSequenceBuiltins.SLOTS, PyCPointerTypeBuiltins.SLOTS, PyCSimpleTypeBuiltins.SLOTS)), + PyCFuncPtrType( + "PyCFuncPtrType", + PythonClass, + newBuilder().publishInModule(J__CTYPES).basetype().slots(CDataTypeSequenceBuiltins.SLOTS, PyCFuncPtrTypeBuiltins.SLOTS)), + PyCData("_CData", PythonObject, newBuilder().publishInModule(J__CTYPES).basetype().slots(CDataBuiltins.SLOTS)), /*- type = PyCStructType */ + Structure("Structure", PyCData, newBuilder().publishInModule(J__CTYPES).basetype().slots(StructureBuiltins.SLOTS)), /*- type = PyCStructType */ + Union("Union", PyCData, newBuilder().publishInModule(J__CTYPES).basetype().slots(StructureBuiltins.SLOTS)), /*- type = UnionType */ + PyCPointer("_Pointer", PyCData, newBuilder().publishInModule(J__CTYPES).basetype().slots(PyCPointerBuiltins.SLOTS)), /*- type = PyCPointerType */ + PyCArray("Array", PyCData, newBuilder().publishInModule(J__CTYPES).basetype().slots(PyCArrayBuiltins.SLOTS)), /*- type = PyCArrayType */ + SimpleCData("_SimpleCData", PyCData, newBuilder().publishInModule(J__CTYPES).basetype().slots(SimpleCDataBuiltins.SLOTS)), /*- type = PyCStructType */ + PyCFuncPtr("PyCFuncPtr", PyCData, newBuilder().publishInModule(J__CTYPES).basetype().slots(PyCFuncPtrBuiltins.SLOTS)), /*- type = PyCFuncPtrType */ + CField("CField", PythonObject, newBuilder().publishInModule(J__CTYPES).basetype().slots(CFieldBuiltins.SLOTS)), + DictRemover("DictRemover", PythonObject, newBuilder().publishInModule(J__CTYPES).basetype()), + StructParam("StructParam_Type", PythonObject, newBuilder().publishInModule(J__CTYPES).basetype()), + ArgError("ArgumentError", PBaseException, newBuilder().publishInModule(J__CTYPES).basetype().addDict()), // _multibytecodec - MultibyteCodec("MultibyteCodec", "_multibytecodec", Flags.PUBLIC_BASE_WDICT), - MultibyteIncrementalEncoder("MultibyteIncrementalEncoder", "_multibytecodec", Flags.PUBLIC_BASE_WDICT), - MultibyteIncrementalDecoder("MultibyteIncrementalDecoder", "_multibytecodec", Flags.PUBLIC_BASE_WDICT), - MultibyteStreamReader("MultibyteStreamReader", "_multibytecodec", Flags.PUBLIC_BASE_WDICT), - MultibyteStreamWriter("MultibyteStreamWriter", "_multibytecodec", Flags.PUBLIC_BASE_WDICT), + MultibyteCodec("MultibyteCodec", PythonObject, newBuilder().publishInModule("_multibytecodec").basetype().addDict().disallowInstantiation()), + MultibyteIncrementalEncoder("MultibyteIncrementalEncoder", PythonObject, newBuilder().publishInModule("_multibytecodec").basetype().addDict().slots(MultibyteIncrementalEncoderBuiltins.SLOTS)), + MultibyteIncrementalDecoder("MultibyteIncrementalDecoder", PythonObject, newBuilder().publishInModule("_multibytecodec").basetype().addDict().slots(MultibyteIncrementalDecoderBuiltins.SLOTS)), + MultibyteStreamReader("MultibyteStreamReader", PythonObject, newBuilder().publishInModule("_multibytecodec").basetype().addDict().slots(MultibyteStreamReaderBuiltins.SLOTS)), + MultibyteStreamWriter("MultibyteStreamWriter", PythonObject, newBuilder().publishInModule("_multibytecodec").basetype().addDict().slots(MultibyteStreamWriterBuiltins.SLOTS)), - // Errors and exceptions: - - // everything after BaseException is considered to be an exception - PBaseException("BaseException", J_BUILTINS, Flags.EXCEPTION), - PBaseExceptionGroup("BaseExceptionGroup", J_BUILTINS, Flags.EXCEPTION), - SystemExit("SystemExit", J_BUILTINS, Flags.EXCEPTION), - KeyboardInterrupt("KeyboardInterrupt", J_BUILTINS, Flags.EXCEPTION), - GeneratorExit("GeneratorExit", J_BUILTINS, Flags.EXCEPTION), - Exception("Exception", J_BUILTINS, Flags.EXCEPTION), - StopIteration("StopIteration", J_BUILTINS, Flags.EXCEPTION), - StopAsyncIteration("StopAsyncIteration", J_BUILTINS, Flags.EXCEPTION), - ArithmeticError("ArithmeticError", J_BUILTINS, Flags.EXCEPTION), - FloatingPointError("FloatingPointError", J_BUILTINS, Flags.EXCEPTION), - OverflowError("OverflowError", J_BUILTINS, Flags.EXCEPTION), - ZeroDivisionError("ZeroDivisionError", J_BUILTINS, Flags.EXCEPTION), - AssertionError("AssertionError", J_BUILTINS, Flags.EXCEPTION), - AttributeError("AttributeError", J_BUILTINS, Flags.EXCEPTION), - BufferError("BufferError", J_BUILTINS, Flags.EXCEPTION), - EOFError("EOFError", J_BUILTINS, Flags.EXCEPTION), - ImportError("ImportError", J_BUILTINS, Flags.EXCEPTION), - ModuleNotFoundError("ModuleNotFoundError", J_BUILTINS, Flags.EXCEPTION), - LookupError("LookupError", J_BUILTINS, Flags.EXCEPTION), - IndexError("IndexError", J_BUILTINS, Flags.EXCEPTION), - KeyError("KeyError", J_BUILTINS, Flags.EXCEPTION), - MemoryError("MemoryError", J_BUILTINS, Flags.EXCEPTION), - NameError("NameError", J_BUILTINS, Flags.EXCEPTION), - UnboundLocalError("UnboundLocalError", J_BUILTINS, Flags.EXCEPTION), - OSError("OSError", J_BUILTINS, Flags.EXCEPTION), - BlockingIOError("BlockingIOError", J_BUILTINS, Flags.EXCEPTION), - ChildProcessError("ChildProcessError", J_BUILTINS, Flags.EXCEPTION), - ConnectionError("ConnectionError", J_BUILTINS, Flags.EXCEPTION), - BrokenPipeError("BrokenPipeError", J_BUILTINS, Flags.EXCEPTION), - ConnectionAbortedError("ConnectionAbortedError", J_BUILTINS, Flags.EXCEPTION), - ConnectionRefusedError("ConnectionRefusedError", J_BUILTINS, Flags.EXCEPTION), - ConnectionResetError("ConnectionResetError", J_BUILTINS, Flags.EXCEPTION), - FileExistsError("FileExistsError", J_BUILTINS, Flags.EXCEPTION), - FileNotFoundError("FileNotFoundError", J_BUILTINS, Flags.EXCEPTION), - InterruptedError("InterruptedError", J_BUILTINS, Flags.EXCEPTION), - IsADirectoryError("IsADirectoryError", J_BUILTINS, Flags.EXCEPTION), - NotADirectoryError("NotADirectoryError", J_BUILTINS, Flags.EXCEPTION), - PermissionError("PermissionError", J_BUILTINS, Flags.EXCEPTION), - ProcessLookupError("ProcessLookupError", J_BUILTINS, Flags.EXCEPTION), - TimeoutError("TimeoutError", J_BUILTINS, Flags.EXCEPTION), - ZLibError("error", "zlib", Flags.EXCEPTION), - CSVError("Error", "_csv", Flags.EXCEPTION), - LZMAError("LZMAError", "_lzma", Flags.EXCEPTION), - StructError("StructError", J__STRUCT, Flags.EXCEPTION), - PickleError("PickleError", "_pickle", Flags.EXCEPTION), - PicklingError("PicklingError", "_pickle", Flags.EXCEPTION), - UnpicklingError("UnpicklingError", "_pickle", Flags.EXCEPTION), - SocketGAIError("gaierror", J__SOCKET, Flags.EXCEPTION), - SocketHError("herror", J__SOCKET, Flags.EXCEPTION), - BinasciiError("Error", "binascii", Flags.EXCEPTION), - BinasciiIncomplete("Incomplete", "binascii", Flags.EXCEPTION), - SSLError("SSLError", J__SSL, Flags.EXCEPTION), - SSLZeroReturnError("SSLZeroReturnError", J__SSL, Flags.EXCEPTION), - SSLWantReadError("SSLWantReadError", J__SSL, Flags.EXCEPTION), - SSLWantWriteError("SSLWantWriteError", J__SSL, Flags.EXCEPTION), - SSLSyscallError("SSLSyscallError", J__SSL, Flags.EXCEPTION), - SSLEOFError("SSLEOFError", J__SSL, Flags.EXCEPTION), - SSLCertVerificationError("SSLCertVerificationError", J__SSL, Flags.EXCEPTION), - PForeignException("ForeignException", J_POLYGLOT, Flags.FOREIGN_EXCEPTION), - - // todo: all OS errors - - ReferenceError("ReferenceError", J_BUILTINS, Flags.EXCEPTION), - RuntimeError("RuntimeError", J_BUILTINS, Flags.EXCEPTION), - NotImplementedError("NotImplementedError", J_BUILTINS, Flags.EXCEPTION), - SyntaxError("SyntaxError", J_BUILTINS, Flags.EXCEPTION), - IndentationError("IndentationError", J_BUILTINS, Flags.EXCEPTION), - TabError("TabError", J_BUILTINS, Flags.EXCEPTION), - SystemError("SystemError", J_BUILTINS, Flags.EXCEPTION), - TypeError("TypeError", J_BUILTINS, Flags.EXCEPTION), - ValueError("ValueError", J_BUILTINS, Flags.EXCEPTION), - UnicodeError("UnicodeError", J_BUILTINS, Flags.EXCEPTION), - UnicodeDecodeError("UnicodeDecodeError", J_BUILTINS, Flags.EXCEPTION), - UnicodeEncodeError("UnicodeEncodeError", J_BUILTINS, Flags.EXCEPTION), - UnicodeTranslateError("UnicodeTranslateError", J_BUILTINS, Flags.EXCEPTION), - RecursionError("RecursionError", J_BUILTINS, Flags.EXCEPTION), + // contextvars + ContextVarsToken("Token", PythonObject, newBuilder().publishInModule(J__CONTEXTVARS).slots(TokenBuiltins.SLOTS)), + ContextVarsContext("Context", PythonObject, newBuilder().publishInModule(J__CONTEXTVARS).slots(ContextBuiltins.SLOTS)), + ContextVar("ContextVar", PythonObject, newBuilder().publishInModule(J__CONTEXTVARS).slots(ContextVarBuiltins.SLOTS)), + // CPython uses separate keys, values, items python types for the iterators. + ContextIterator("context_iterator", PythonObject, newBuilder().publishInModule(J__CONTEXTVARS).slots(ContextIteratorBuiltins.SLOTS)), - IOUnsupportedOperation("UnsupportedOperation", "io", Flags.EXCEPTION), + Capsule("PyCapsule", PythonObject, newBuilder().basetype()), - Empty("Empty", "_queue", Flags.EXCEPTION), + PTokenizerIter("TokenizerIter", PythonObject, newBuilder().publishInModule("_tokenize").basetype().slots(TokenizerIterBuiltins.SLOTS)); - UnsupportedMessage("UnsupportedMessage", J_POLYGLOT, Flags.EXCEPTION), + private static TypeBuilder newBuilder() { + return new TypeBuilder(); + } - // warnings - Warning("Warning", J_BUILTINS, Flags.EXCEPTION), - BytesWarning("BytesWarning", J_BUILTINS, Flags.EXCEPTION), - DeprecationWarning("DeprecationWarning", J_BUILTINS, Flags.EXCEPTION), - FutureWarning("FutureWarning", J_BUILTINS, Flags.EXCEPTION), - ImportWarning("ImportWarning", J_BUILTINS, Flags.EXCEPTION), - PendingDeprecationWarning("PendingDeprecationWarning", J_BUILTINS, Flags.EXCEPTION), - ResourceWarning("ResourceWarning", J_BUILTINS, Flags.EXCEPTION), - RuntimeWarning("RuntimeWarning", J_BUILTINS, Flags.EXCEPTION), - SyntaxWarning("SyntaxWarning", J_BUILTINS, Flags.EXCEPTION), - UnicodeWarning("UnicodeWarning", J_BUILTINS, Flags.EXCEPTION), - UserWarning("UserWarning", J_BUILTINS, Flags.EXCEPTION), - EncodingWarning("EncodingWarning", J_BUILTINS, Flags.EXCEPTION), + private static final class TypeBuilder { + private String publishInModule; + private String moduleName; + private boolean basetype; + private boolean addDict; + private boolean disallowInstantiation; + private TpSlots slots; + private String doc; + + public TypeBuilder publishInModule(String publishInModule) { + this.publishInModule = publishInModule; + if (moduleName == null) { + this.moduleName = publishInModule; + } + return this; + } - // contextvars - ContextVarsToken("Token", J__CONTEXTVARS, Flags.PUBLIC_DERIVED_WODICT), - ContextVarsContext("Context", J__CONTEXTVARS, Flags.PUBLIC_DERIVED_WODICT, CONTEXT_M_FLAGS, ContextBuiltins.SLOTS), - ContextVar("ContextVar", J__CONTEXTVARS, Flags.PUBLIC_DERIVED_WODICT), - // CPython uses separate keys, values, items python types for the iterators. - ContextIterator("context_iterator", J__CONTEXTVARS, Flags.PUBLIC_DERIVED_WODICT), + public TypeBuilder moduleName(String moduleName) { + this.moduleName = moduleName; + return this; + } - Capsule("capsule"), + public TypeBuilder basetype() { + this.basetype = true; + return this; + } - PTokenizerIter("TokenizerIter", "_tokenize"), + public TypeBuilder addDict() { + this.addDict = true; + return this; + } - // A marker for @Builtin that is not a class. Must always come last. - nil("nil"); + public TypeBuilder disallowInstantiation() { + this.disallowInstantiation = true; + return this; + } - private static class Flags { + public TypeBuilder slots(TpSlots slots) { + this.slots = slots; + return this; + } - static final Flags EXCEPTION = new Flags(true, true, true); - static final Flags FOREIGN_EXCEPTION = new Flags(false, false, true); - static final Flags PRIVATE_DERIVED_WDICT = new Flags(false, false, true); - static final Flags PRIVATE_BASE_WDICT = new Flags(false, true, true); - static final Flags PRIVATE_BASE_WODICT = new Flags(false, true, false); - static final Flags PUBLIC_BASE_WDICT = new Flags(true, true, true); - static final Flags PUBLIC_BASE_WODICT = new Flags(true, true, false); - static final Flags PUBLIC_DERIVED_WODICT = new Flags(true, false, false); - static final Flags PRIVATE_DERIVED_WODICT = new Flags(false, false, false); + public TypeBuilder slots(TpSlots slots1, TpSlots slots2) { + this.slots = slots1.copy().overrideIgnoreGroups(slots2).build(); + return this; + } - final boolean isPublic; - final boolean isBaseType; - final boolean isBuiltinWithDict; + public TypeBuilder slots(TpSlots slots1, TpSlots slots2, TpSlots slots3) { + this.slots = slots1.copy().overrideIgnoreGroups(slots2).overrideIgnoreGroups(slots3).build(); + return this; + } - Flags(boolean isPublic, boolean isBaseType, boolean isBuiltinWithDict) { - this.isPublic = isPublic; - this.isBaseType = isBaseType; - this.isBuiltinWithDict = isBuiltinWithDict; + public TypeBuilder doc(String doc) { + this.doc = doc; + return this; } } private final TruffleString name; + private final PythonBuiltinClassType base; private final TruffleString publishInModule; private final TruffleString moduleName; // This is the name qualified by module used for printing. But the actual __qualname__ is just @@ -586,112 +1238,55 @@ private static class Flags { private final TruffleString printName; private final boolean basetype; private final boolean isBuiltinWithDict; + private final boolean disallowInstantiation; + private final TruffleString doc; // initialized in static constructor @CompilationFinal private PythonBuiltinClassType type; - @CompilationFinal private PythonBuiltinClassType base; @CompilationFinal private int weaklistoffset; - /** - * @see #redefinesSlot(SpecialMethodSlot) - */ - private SpecialMethodSlot[] redefinedSlots; - - /** - * Lookup cache for special slots defined in {@link SpecialMethodSlot}. Use - * {@link SpecialMethodSlot} to access the values. Unlike the cache in - * {@link com.oracle.graal.python.builtins.objects.type.PythonManagedClass}, this caches only - * builtin context independent values, most notably instances of {@link BuiltinMethodDescriptor} - * . - */ - private Object[] specialMethodSlots; - /** * The slots defined directly on the builtin class. */ private final TpSlots declaredSlots; /** - * The actual slots including slots inherited from base classes. The value is computed in the - * static ctor. + * The actual slots including slots inherited from base classes */ - @CompilationFinal private TpSlots slots; - private final long methodsFlags; + private final TpSlots slots; - PythonBuiltinClassType(String name, String module, Flags flags) { - this(name, module, module, flags); - } - - PythonBuiltinClassType(String name, String module, Flags flags, TpSlots slots) { - this(name, module, module, flags, DEFAULT_M_FLAGS, slots); - } - - PythonBuiltinClassType(String name, String module, Flags flags, long methodsFlags) { - this(name, module, module, flags, methodsFlags, TpSlots.createEmpty()); - } - - PythonBuiltinClassType(String name, String module, Flags flags, long methodsFlags, TpSlots slots) { - this(name, module, module, flags, methodsFlags, slots); - } - - PythonBuiltinClassType(String name, String publishInModule, String moduleName, Flags flags) { - this(name, publishInModule, moduleName, flags, DEFAULT_M_FLAGS, TpSlots.createEmpty()); - } - - PythonBuiltinClassType(String name, String publishInModule, String moduleName, Flags flags, TpSlots slots) { - this(name, publishInModule, moduleName, flags, DEFAULT_M_FLAGS, slots); - } - - PythonBuiltinClassType(String name, String publishInModule, String moduleName, Flags flags, long methodsFlags, TpSlots declaredSlots) { + PythonBuiltinClassType(String name, PythonBuiltinClassType base, TypeBuilder builder) { this.name = toTruffleStringUncached(name); - this.publishInModule = toTruffleStringUncached(publishInModule); - this.moduleName = flags.isPublic && moduleName != null ? toTruffleStringUncached(moduleName) : null; - if (moduleName != null && moduleName != J_BUILTINS) { - printName = toTruffleStringUncached(moduleName + "." + name); + this.base = base; + this.publishInModule = toTruffleStringUncached(builder.publishInModule); + this.moduleName = builder.moduleName != null ? toTruffleStringUncached(builder.moduleName) : null; + if (builder.moduleName != null && !J_BUILTINS.equals(builder.moduleName)) { + printName = toTruffleStringUncached(builder.moduleName + "." + name); } else { printName = this.name; } - this.basetype = flags.isBaseType; - this.isBuiltinWithDict = flags.isBuiltinWithDict; - this.methodsFlags = methodsFlags; + this.basetype = builder.basetype; + this.isBuiltinWithDict = builder.addDict; this.weaklistoffset = -1; - this.declaredSlots = declaredSlots; - } - - PythonBuiltinClassType(String name, String module) { - this(name, module, Flags.PUBLIC_BASE_WODICT); - } - - PythonBuiltinClassType(String name, String module, TpSlots slots) { - this(name, module, Flags.PUBLIC_BASE_WODICT, slots); - } - - PythonBuiltinClassType(String name, String module, long methodsFlags) { - this(name, module, Flags.PUBLIC_BASE_WODICT, methodsFlags); - } - - PythonBuiltinClassType(String name, String module, long methodsFlags, TpSlots slots) { - this(name, module, Flags.PUBLIC_BASE_WODICT, methodsFlags, slots); - } - - PythonBuiltinClassType(String name, Flags flags) { - this(name, null, flags); - } - - PythonBuiltinClassType(String name, Flags flags, TpSlots slots) { - this(name, null, flags, slots); - } - - PythonBuiltinClassType(String name, Flags flags, long methodsFlags) { - this(name, null, flags, methodsFlags); - } - - PythonBuiltinClassType(String name, Flags flags, long methodsFlags, TpSlots slots) { - this(name, null, flags, methodsFlags, slots); - } - - PythonBuiltinClassType(String name) { - this(name, null, Flags.PRIVATE_BASE_WODICT); + this.declaredSlots = builder.slots != null ? builder.slots : TpSlots.createEmpty(); + boolean disallowInstantiation = builder.disallowInstantiation; + // logic from type_ready_set_new + // base.base == null is a roundabout way to check for base == object + if (declaredSlots.tp_new() == null && base.base == null) { + disallowInstantiation = true; + } + if (base == null) { + this.slots = declaredSlots; + } else { + var slotBuilder = base.slots.copy(); + slotBuilder.overrideIgnoreGroups(declaredSlots); + if (disallowInstantiation) { + slotBuilder.set(TpSlots.TpSlotMeta.TP_NEW, null); + } + this.slots = slotBuilder.build(); + } + this.disallowInstantiation = disallowInstantiation; + this.doc = toTruffleStringUncached(builder.doc); } public boolean isAcceptableBase() { @@ -718,6 +1313,10 @@ public boolean isBuiltinWithDict() { return isBuiltinWithDict; } + public boolean disallowInstantiation() { + return disallowInstantiation; + } + public TruffleString getPublishInModule() { return publishInModule; } @@ -726,11 +1325,8 @@ public TruffleString getModuleName() { return moduleName; } - /** - * Access the values using methods in {@link SpecialMethodSlot}. - */ - public Object[] getSpecialMethodSlots() { - return specialMethodSlots; + public TruffleString getDoc() { + return doc; } public TpSlots getSlots() { @@ -741,38 +1337,10 @@ public TpSlots getDeclaredSlots() { return declaredSlots; } - public void setSpecialMethodSlots(Object[] slots) { - assert specialMethodSlots == null; // should be assigned only once per VM - specialMethodSlots = slots; - } - - public long getMethodsFlags() { - return methodsFlags; - } - public int getWeaklistoffset() { return weaklistoffset; } - /** - * Returns {@code true} if this method slot is redefined in Python code during initialization. - * Values of such slots cannot be cached in {@link #specialMethodSlots}, because they are not - * context independent. - */ - public boolean redefinesSlot(SpecialMethodSlot slot) { - if (redefinedSlots != null) { - for (SpecialMethodSlot redefSlot : redefinedSlots) { - if (redefSlot == slot) { - return true; - } - } - } - if (base != null) { - return base.redefinesSlot(slot); - } - return false; - } - @Override public String toString() { CompilerAsserts.neverPartOfCompilation(); @@ -780,219 +1348,19 @@ public String toString() { } public final Shape getInstanceShape(PythonLanguage lang) { - if (name == null) { - throw CompilerDirectives.shouldNotReachHere("incorrect use of Python builtin type marker"); - } return lang.getBuiltinTypeInstanceShape(this); } - @CompilationFinal(dimensions = 1) public static final PythonBuiltinClassType[] VALUES = Arrays.copyOf(values(), values().length - 1); + @CompilationFinal(dimensions = 1) public static final PythonBuiltinClassType[] VALUES = Arrays.copyOf(values(), values().length); static { - // fill the overridden slots - SpecialMethodSlot[] repr = new SpecialMethodSlot[]{SpecialMethodSlot.Repr}; - SpecialMethodSlot[] reprAndNew = new SpecialMethodSlot[]{SpecialMethodSlot.Repr, SpecialMethodSlot.New}; - - Boolean.redefinedSlots = new SpecialMethodSlot[]{SpecialMethodSlot.And}; - PythonModule.redefinedSlots = Super.redefinedSlots = repr; - SyntaxError.redefinedSlots = new SpecialMethodSlot[]{SpecialMethodSlot.Str}; - UnicodeEncodeError.redefinedSlots = new SpecialMethodSlot[]{SpecialMethodSlot.Str}; - UnicodeDecodeError.redefinedSlots = new SpecialMethodSlot[]{SpecialMethodSlot.Str}; - UnicodeTranslateError.redefinedSlots = new SpecialMethodSlot[]{SpecialMethodSlot.Str}; - OSError.redefinedSlots = new SpecialMethodSlot[]{SpecialMethodSlot.Str}; - PStructUnpackIterator.redefinedSlots = new SpecialMethodSlot[]{SpecialMethodSlot.Next, SpecialMethodSlot.Iter, SpecialMethodSlot.LengthHint}; - - // These slots actually contain context independent values, but they are initialized in - // StructSequence to artificial PBuiltinFunctions with artificial builtin node factories, - // which are different for each context. We'd have to turn those factories into singletons - // to guarantee their identity across contexts. For the sake of simplicity, we just ignore - // those slots for now. - PStruct.type = PythonClass; - PStructRusage.redefinedSlots = reprAndNew; - PStructPasswd.redefinedSlots = reprAndNew; - PUnameResult.redefinedSlots = reprAndNew; - PUnraisableHookArgs.redefinedSlots = reprAndNew; - PIntInfo.redefinedSlots = reprAndNew; - PHashInfo.redefinedSlots = reprAndNew; - PStructTime.redefinedSlots = reprAndNew; - PProfilerEntry.redefinedSlots = reprAndNew; - PProfilerSubentry.redefinedSlots = reprAndNew; - PThreadInfo.redefinedSlots = reprAndNew; - PStatResult.redefinedSlots = repr; - PStatvfsResult.redefinedSlots = repr; - PFloatInfo.redefinedSlots = reprAndNew; - PVersionInfo.redefinedSlots = repr; - PWindowsVersion.redefinedSlots = repr; - PFlags.redefinedSlots = repr; - PTerminalSize.redefinedSlots = reprAndNew; - PythonObject.type = PythonClass; - PythonObject.base = null; - - PBuiltinMethod.base = PBuiltinFunctionOrMethod; - - Boolean.base = PInt; - - PBaseExceptionGroup.base = PBaseException; - SystemExit.base = PBaseException; - KeyboardInterrupt.base = PBaseException; - GeneratorExit.base = PBaseException; - Exception.base = PBaseException; - StopIteration.base = Exception; - StopAsyncIteration.base = Exception; - ArithmeticError.base = Exception; - FloatingPointError.base = ArithmeticError; - OverflowError.base = ArithmeticError; - ZeroDivisionError.base = ArithmeticError; - AssertionError.base = Exception; - AttributeError.base = Exception; - BufferError.base = Exception; - EOFError.base = Exception; - ImportError.base = Exception; - ModuleNotFoundError.base = ImportError; - LookupError.base = Exception; - IndexError.base = LookupError; - KeyError.base = LookupError; - MemoryError.base = Exception; - NameError.base = Exception; - UnboundLocalError.base = NameError; - OSError.base = Exception; - BlockingIOError.base = OSError; - ChildProcessError.base = OSError; - ConnectionError.base = OSError; - BrokenPipeError.base = ConnectionError; - ConnectionAbortedError.base = ConnectionError; - ConnectionRefusedError.base = ConnectionError; - ConnectionResetError.base = ConnectionError; - FileExistsError.base = OSError; - FileNotFoundError.base = OSError; - InterruptedError.base = OSError; - IsADirectoryError.base = OSError; - NotADirectoryError.base = OSError; - PermissionError.base = OSError; - ProcessLookupError.base = OSError; - TimeoutError.base = OSError; - ZLibError.base = Exception; - CSVError.base = Exception; - LZMAError.base = Exception; - SocketGAIError.base = OSError; - SocketHError.base = OSError; - - SSLError.base = OSError; - SSLZeroReturnError.base = SSLError; - SSLWantReadError.base = SSLError; - SSLWantWriteError.base = SSLError; - SSLSyscallError.base = SSLError; - SSLCertVerificationError.base = SSLError; - SSLEOFError.base = SSLError; - - ReferenceError.base = Exception; - RuntimeError.base = Exception; - NotImplementedError.base = RuntimeError; - SyntaxError.base = Exception; - IndentationError.base = SyntaxError; - TabError.base = IndentationError; - SystemError.base = Exception; - TypeError.base = Exception; - ValueError.base = Exception; - UnicodeError.base = ValueError; - UnicodeDecodeError.base = UnicodeError; - UnicodeEncodeError.base = UnicodeError; - UnicodeTranslateError.base = UnicodeError; - RecursionError.base = RuntimeError; - StructError.base = Exception; - BinasciiError.base = ValueError; - BinasciiIncomplete.base = Exception; - PickleError.base = Exception; - PicklingError.base = PickleError; - UnpicklingError.base = PickleError; - - PForeignException.base = PBaseException; - - // warnings - Warning.base = Exception; - BytesWarning.base = Warning; - DeprecationWarning.base = Warning; - FutureWarning.base = Warning; - ImportWarning.base = Warning; - PendingDeprecationWarning.base = Warning; - ResourceWarning.base = Warning; - RuntimeWarning.base = Warning; - SyntaxWarning.base = Warning; - UnicodeWarning.base = Warning; - UserWarning.base = Warning; - EncodingWarning.base = Warning; - - PStatResult.base = PTuple; - PStatvfsResult.base = PTuple; - PTerminalSize.base = PTuple; - PUnameResult.base = PTuple; - PStructTime.base = PTuple; - PProfilerEntry.base = PTuple; - PProfilerSubentry.base = PTuple; - PStructPasswd.base = PTuple; - PStructRusage.base = PTuple; - PVersionInfo.base = PTuple; - PWindowsVersion.base = PTuple; - PFlags.base = PTuple; - PFloatInfo.base = PTuple; - PIntInfo.base = PTuple; - PHashInfo.base = PTuple; - PThreadInfo.base = PTuple; - PUnraisableHookArgs.base = PTuple; - PDefaultDict.base = PDict; - POrderedDict.base = PDict; - POrderedDictKeys.base = PDictKeysView; - POrderedDictValues.base = PDictValuesView; - POrderedDictItems.base = PDictItemsView; - - PArrayIterator.type = PythonClass; - PSocket.type = PythonClass; - - // _io.UnsupportedOperation inherits from ValueError and OSError - // done currently within IOModuleBuiltins class - IOUnsupportedOperation.base = OSError; - - PRawIOBase.base = PIOBase; - PTextIOBase.base = PIOBase; - PBufferedIOBase.base = PIOBase; - PBufferedReader.base = PBufferedIOBase; - PBufferedWriter.base = PBufferedIOBase; - PBufferedRWPair.base = PBufferedIOBase; - PBufferedRandom.base = PBufferedIOBase; - PBytesIO.base = PBufferedIOBase; - PFileIO.base = PRawIOBase; - PTextIOWrapper.base = PTextIOBase; - PStringIO.base = PTextIOBase; - - // hashlib - UnsupportedDigestmodError.base = ValueError; - HashlibHashXof.base = HashlibHash; - - // _ctypes - StgDict.base = PDict; - PyCStructType.base = PythonClass; - UnionType.base = PythonClass; - PyCPointerType.base = PythonClass; - PyCArrayType.base = PythonClass; - PyCSimpleType.base = PythonClass; - PyCFuncPtrType.base = PythonClass; Structure.type = PyCStructType; - Structure.base = PyCData; Union.type = UnionType; - Union.base = PyCData; PyCPointer.type = PyCPointerType; - PyCPointer.base = PyCData; PyCArray.type = PyCArrayType; - PyCArray.base = PyCData; SimpleCData.type = PyCSimpleType; - SimpleCData.base = PyCData; PyCFuncPtr.type = PyCFuncPtrType; - PyCFuncPtr.base = PyCData; - ArgError.base = PBaseException; - - Empty.base = Exception; - UnsupportedMessage.base = Exception; boolean assertionsEnabled = false; assert (assertionsEnabled = true) == true; @@ -1001,11 +1369,6 @@ public final Shape getInstanceShape(PythonLanguage lang) { // check uniqueness assert set.add("" + type.moduleName + "." + type.name) : type.name(); - /* Initialize type.base (defaults to PythonObject unless that's us) */ - if (type.base == null && type != PythonObject) { - type.base = PythonObject; - } - /* * Now the only way base can still be null is if type is PythonObject. */ @@ -1022,23 +1385,6 @@ public final Shape getInstanceShape(PythonLanguage lang) { type.type = PythonClass; } } - - for (PythonBuiltinClassType t : values()) { - initSlots(t); - } - } - - private static void initSlots(PythonBuiltinClassType type) { - if (type.base == null) { - type.slots = type.declaredSlots; - return; - } - if (type.base.getSlots() == null) { - initSlots(type.base); - } - var slots = type.base.slots.copy(); - slots.overrideIgnoreGroups(type.declaredSlots); - type.slots = slots.build(); } /** @@ -1052,10 +1398,6 @@ private static void initSlots(PythonBuiltinClassType type) { * {@link PythonBuiltins} classes annotated with {@link CoreFunctions#extendClasses()} that * contains the {@link PythonBuiltinClassType}. *

      - * If a {@link PythonBuiltinClassType#declaredSlots} should be initialized to a merge of slots - * from multiple {@link CoreFunctions}, use the helper methods, such as - * {@link TpSlots#merge(TpSlots, TpSlots)}. - *

      * Note: this is all done so that the generated slots code is referenced only from the class * that contains the {@link Slot} annotation and that we can initialize the * {@link PythonBuiltinClassType#slots} in static ctor and bake the values into native-image @@ -1105,11 +1447,11 @@ static boolean verifySlotsConventions(PythonBuiltins[] allBuiltins) { assert getSlotsFieldValue(builtins.get(0)) == type.declaredSlots; } else { // Multiple @CoreFunctions => PBCT.declaredSlots must be equal to their merge - Builder builder = TpSlots.newBuilder(); + TpSlots.Builder builder = TpSlots.newBuilder(); for (PythonBuiltins builtin : builtins) { TpSlots slots = getSlotsFieldValue(builtin); if (slots != null) { - builder.merge(slots); + builder.overrideIgnoreGroups(slots); } } assert type.declaredSlots.areEqualTo(builder.build()) : String.format("%s.declaredSlots are not equal to the merge of SLOTS " + @@ -1121,6 +1463,9 @@ static boolean verifySlotsConventions(PythonBuiltins[] allBuiltins) { } private static boolean hasSlotNodes(PythonBuiltins builtin) { + if (builtin.getClass().getAnnotation(HashNotImplemented.class) != null) { + return true; + } for (Class innerClass : builtin.getClass().getDeclaredClasses()) { if (innerClass.getDeclaredAnnotationsByType(Slot.class).length > 0) { return true; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltins.java index 89f6cc235b..5db6d64e43 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -26,86 +26,6 @@ package com.oracle.graal.python.builtins; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DOC__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ABS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ADD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___AITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___AND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ANEXT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___AWAIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___BOOL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CONTAINS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DELATTR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DELETE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DELITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DEL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DIVMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOAT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOORDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GETATTRIBUTE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GETATTR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GET__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IADD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IAND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IFLOORDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ILSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IMATMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INDEX__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INVERT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IPOW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IRSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ISUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITRUEDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IXOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LEN__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___MATMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___MOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___MUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEG__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___POS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___POW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RADD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RAND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RDIVMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RFLOORDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RLSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RMATMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RPOW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RRSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RSUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RTRUEDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RXOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETATTR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SET__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___TRUEDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___XOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEW__; import static com.oracle.graal.python.nodes.truffle.TruffleStringMigrationHelpers.assertNoJavaString; import static com.oracle.graal.python.nodes.truffle.TruffleStringMigrationHelpers.ensureNoJavaString; import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; @@ -114,20 +34,20 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.Set; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.builtins.modules.ImpModuleBuiltins.ExecBuiltin; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; -import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.runtime.object.PythonObjectSlowPathFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.BiConsumer; import com.oracle.truffle.api.RootCallTarget; +import com.oracle.truffle.api.TruffleLanguage.Env; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.strings.TruffleString; @@ -160,79 +80,47 @@ public void initialize(Python3Core core) { initializeEachFactoryWith((factory, builtin) -> { CoreFunctions annotation = getClass().getAnnotation(CoreFunctions.class); final boolean declaresExplicitSelf; - PythonBuiltinClassType constructsClass = builtin.constructsClass(); - if ((annotation.defineModule().length() > 0 || annotation.extendsModule().length() > 0) && constructsClass == PythonBuiltinClassType.nil) { + if ((annotation.defineModule().length() > 0 || annotation.extendsModule().length() > 0)) { assert !builtin.isGetter(); assert !builtin.isSetter(); assert annotation.extendClasses().length == 0; // for module functions, explicit self is false by default declaresExplicitSelf = builtin.declaresExplicitSelf(); - } else if (builtin.constructsClass() != PythonBuiltinClassType.nil) { - declaresExplicitSelf = false; } else { declaresExplicitSelf = true; } TruffleString tsName = toTruffleStringUncached(builtin.name()); - RootCallTarget callTarget = core.getLanguage().initBuiltinCallTarget(l -> new BuiltinFunctionRootNode(l, builtin, factory, declaresExplicitSelf), factory.getNodeClass(), + PythonLanguage language = core.getLanguage(); + RootCallTarget callTarget = language.initBuiltinCallTarget(l -> new BuiltinFunctionRootNode(l, builtin, factory, declaresExplicitSelf), factory.getNodeClass(), builtin.name()); Object builtinDoc = builtin.doc().isEmpty() ? PNone.NONE : toTruffleStringUncached(builtin.doc()); int flags = PBuiltinFunction.getFlags(builtin, callTarget); - if (constructsClass != PythonBuiltinClassType.nil) { - assert !builtin.isGetter() && !builtin.isSetter() && !builtin.isClassmethod() && !builtin.isStaticmethod(); - // we explicitly do not make these "staticmethods" here, since CPython also doesn't - // for builtin types - PBuiltinFunction newFunc = core.factory().createBuiltinFunction(T___NEW__, constructsClass, numDefaults(builtin), flags, callTarget); - PBuiltinMethod newMethod = core.factory().createBuiltinMethod(constructsClass, newFunc); - PythonBuiltinClass builtinClass = core.lookupType(constructsClass); - builtinClass.setAttributeUnsafe(T___NEW__, newMethod); - final Object currentBuiltinDoc = builtinClass.getAttribute(T___DOC__); - if (PGuards.isPNone(currentBuiltinDoc)) { - builtinClass.setAttribute(T___DOC__, builtinDoc); - } - } else { - PBuiltinFunction function; - if (isSlotMethod(builtin)) { - // HACK: TODO: we should not see any slots here anymore once all are converted - // to slots, then we can make the slot field in PBuiltinFunction final, for now, - // we patch it in TpSlots#wrapBuiltinSlots - function = core.factory().createWrapperDescriptor(tsName, null, numDefaults(builtin), flags, callTarget, null, null); - } else { - function = core.factory().createBuiltinFunction(tsName, null, numDefaults(builtin), flags, callTarget); - } - function.setAttribute(T___DOC__, builtinDoc); - BoundBuiltinCallable callable = function; - if (builtin.isGetter() || builtin.isSetter()) { - assert !builtin.isClassmethod() && !builtin.isStaticmethod(); - PBuiltinFunction get = builtin.isGetter() ? function : null; - PBuiltinFunction set = builtin.isSetter() ? function : null; - callable = core.factory().createGetSetDescriptor(get, set, tsName, null, builtin.allowsDelete()); - } else if (builtin.isClassmethod()) { - assert !builtin.isStaticmethod(); - callable = core.factory().createBuiltinClassmethodFromCallableObj(function); - } else if (builtin.isStaticmethod()) { - callable = core.factory().createStaticmethodFromCallableObj(function); - } - builtinFunctions.put(toTruffleStringUncached(builtin.name()), callable); + PBuiltinFunction function = PFactory.createBuiltinFunction(language, tsName, null, numDefaults(builtin), flags, callTarget); + function.setAttribute(T___DOC__, builtinDoc); + BoundBuiltinCallable callable = function; + if (builtin.isGetter() || builtin.isSetter()) { + assert !builtin.isClassmethod() && !builtin.isStaticmethod(); + PBuiltinFunction get = builtin.isGetter() ? function : null; + PBuiltinFunction set = builtin.isSetter() ? function : null; + callable = PFactory.createGetSetDescriptor(language, get, set, tsName, null, builtin.allowsDelete()); + } else if (builtin.isClassmethod()) { + assert !builtin.isStaticmethod(); + callable = PFactory.createBuiltinClassmethodFromCallableObj(language, function); + } else if (builtin.isStaticmethod()) { + callable = PFactory.createStaticmethodFromCallableObj(language, function); } + builtinFunctions.put(toTruffleStringUncached(builtin.name()), callable); }); } - // All methods that are really slots in CPython - private static final Set SLOTS = Set.of(J___ABS__, J___ADD__, J___AITER__, J___AND__, J___ANEXT__, J___AWAIT__, J___BOOL__, J___CALL__, J___CONTAINS__, J___DELATTR__, J___DELETE__, - J___DELITEM__, J___DEL__, J___DIVMOD__, J___EQ__, J___FLOAT__, J___FLOORDIV__, J___GETATTRIBUTE__, J___GETATTR__, J___GETITEM__, J___GET__, J___GE__, J___GT__, J___HASH__, - J___IADD__, J___IAND__, J___IFLOORDIV__, J___ILSHIFT__, J___IMATMUL__, J___IMOD__, J___IMUL__, J___INDEX__, J___INIT__, J___INT__, J___INVERT__, J___IOR__, J___IPOW__, - J___IRSHIFT__, J___ISUB__, J___ITER__, J___ITRUEDIV__, J___IXOR__, J___LEN__, J___LE__, J___LSHIFT__, J___LT__, J___MATMUL__, J___MOD__, J___MUL__, J___NEG__, J___NEW__, - J___NEXT__, J___NE__, J___OR__, J___POS__, J___POW__, J___RADD__, J___RAND__, J___RDIVMOD__, J___REPR__, J___RFLOORDIV__, J___RLSHIFT__, J___RMATMUL__, J___RMOD__, J___RMUL__, - J___ROR__, J___RPOW__, J___RRSHIFT__, J___RSHIFT__, J___RSUB__, J___RTRUEDIV__, J___RXOR__, J___SETATTR__, J___SETITEM__, J___SET__, J___STR__, J___SUB__, J___TRUEDIV__, - J___XOR__); - - private static boolean isSlotMethod(Builtin builtin) { - return builtin.name().startsWith("__") && SLOTS.contains(builtin.name()); - } - /** * Run any actions that can only be run in the post-initialization step, that is, if we're * actually going to start running rather than just pre-initializing. + *

      + * See {@link Python3Core#postInitialize(Env)} as postInitialize() is only run under some + * conditions. See also {@link ExecBuiltin}, tough that does not get called if the built-in + * module is actually shadowed by a frozen one, or if the built-in module is actually added to + * sys.modules during context initialization before the importlib exists, etc. */ public void postInitialize(@SuppressWarnings("unused") Python3Core core) { // nothing to do by default @@ -275,10 +163,18 @@ public static int numDefaults(Builtin builtin) { return maxNumPosArgs - builtin.minNumOfPositionalArgs(); } + /** + * May only be used in {@link #initialize} or before. Use {@link PythonObject#setAttribute} + * instead in {@link #postInitialize}. + */ protected final void addBuiltinConstant(String name, Object value) { addBuiltinConstant(toTruffleStringUncached(name), value); } + /** + * May only be used in {@link #initialize} or before. Use {@link PythonObject#setAttribute} + * instead in {@link #postInitialize}. + */ protected final void addBuiltinConstant(TruffleString name, Object value) { builtinConstants.put(name, ensureNoJavaString(value)); } @@ -294,18 +190,18 @@ void addConstantsToModuleObject(PythonObject obj) { } } - void addFunctionsToModuleObject(PythonObject obj, PythonObjectSlowPathFactory factory) { - addFunctionsToModuleObject(builtinFunctions, obj, factory); + void addFunctionsToModuleObject(PythonObject obj, PythonLanguage language) { + addFunctionsToModuleObject(builtinFunctions, obj, language); } - static void addFunctionsToModuleObject(Map> builtinFunctions, PythonObject obj, PythonObjectSlowPathFactory factory) { + static void addFunctionsToModuleObject(Map> builtinFunctions, PythonObject obj, PythonLanguage language) { + assert obj instanceof PythonModule || obj instanceof PythonBuiltinClass : "unexpected object while adding builtins"; for (Entry> entry : builtinFunctions.entrySet()) { Object value; - assert obj instanceof PythonModule || obj instanceof PythonBuiltinClass : "unexpected object while adding builtins"; if (obj instanceof PythonModule) { - value = factory.createBuiltinMethod(obj, (PBuiltinFunction) entry.getValue()); + value = PFactory.createBuiltinMethod(language, obj, (PBuiltinFunction) entry.getValue()); } else { - value = entry.getValue().boundToObject(((PythonBuiltinClass) obj).getType(), factory); + value = entry.getValue().boundToObject(((PythonBuiltinClass) obj).getType(), language); } obj.setAttribute(entry.getKey(), value); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonOS.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonOS.java index 67114eb762..338e50f1ab 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonOS.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonOS.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,25 +45,31 @@ import com.oracle.truffle.api.strings.TruffleString; public enum PythonOS { - PLATFORM_JAVA("java"), - PLATFORM_CYGWIN("cygwin"), - PLATFORM_LINUX("linux"), - PLATFORM_DARWIN("darwin"), - PLATFORM_WIN32("win32"), - PLATFORM_SUNOS("sunos"), - PLATFORM_FREEBSD("freebsd"), - PLATFORM_ANY(null); + PLATFORM_JAVA("java", "Java"), + PLATFORM_CYGWIN("cygwin", "CYGWIN"), + PLATFORM_LINUX("linux", "Linux"), + PLATFORM_DARWIN("darwin", "Darwin"), + PLATFORM_WIN32("win32", "Windows"), + PLATFORM_SUNOS("sunos", "SunOS"), + PLATFORM_FREEBSD("freebsd", "FreeBSD"), + PLATFORM_ANY(null, null); private final TruffleString name; + private final TruffleString uname; - PythonOS(String name) { + PythonOS(String name, String uname) { this.name = toTruffleStringUncached(name); + this.uname = toTruffleStringUncached(uname); } public TruffleString getName() { return name; } + public TruffleString getUname() { + return uname; + } + private static final PythonOS current; static { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/AbcModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/AbcModuleBuiltins.java index 18b4c9bb56..ac6be1a5ce 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/AbcModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/AbcModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -58,10 +58,10 @@ import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetSubclassesAsArrayNode; import com.oracle.graal.python.lib.PyObjectLookupAttr; +import com.oracle.graal.python.lib.PyObjectSetAttr; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.HiddenAttr; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.attributes.DeleteAttributeNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; @@ -70,7 +70,6 @@ import com.oracle.graal.python.runtime.PythonContext; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; @@ -94,8 +93,7 @@ abstract static class AbcInitCollectionFlagsNode extends PythonUnaryBuiltinNode @TruffleBoundary @Specialization static Object init(Object object, - @Bind("this") Node inliningTarget, - @Cached DeleteAttributeNode deleteAttributeNode) { + @Bind("this") Node inliningTarget) { if (TypeNodes.IsTypeNode.executeUncached(object)) { Object flags = PyObjectLookupAttr.executeUncached(object, ABC_TPFLAGS); long val; @@ -105,7 +103,7 @@ static Object init(Object object, return PNone.NONE; } if ((val & COLLECTION_FLAGS) == COLLECTION_FLAGS) { - throw PRaiseNode.raiseUncached(inliningTarget, TypeError, ErrorMessages.ABC_FLAGS_CANNOT_BE_SEQUENCE_AND_MAPPING); + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.ABC_FLAGS_CANNOT_BE_SEQUENCE_AND_MAPPING); } long tpFlags = TypeNodes.GetTypeFlagsNode.getUncached().execute(object); tpFlags |= (val & COLLECTION_FLAGS); @@ -117,7 +115,7 @@ static Object init(Object object, type = (PythonAbstractObject) object; } HiddenAttr.WriteNode.executeUncached(type, HiddenAttr.FLAGS, tpFlags); - deleteAttributeNode.execute(null, inliningTarget, object, ABC_TPFLAGS); + PyObjectSetAttr.deleteUncached(object, ABC_TPFLAGS); } return PNone.NONE; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ArrayModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ArrayModuleBuiltins.java index ce713d1aa2..687b9202d3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ArrayModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ArrayModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -27,75 +27,44 @@ import static com.oracle.graal.python.nodes.BuiltinNames.J_ARRAY; import static com.oracle.graal.python.nodes.BuiltinNames.T_ARRAY; -import static com.oracle.graal.python.nodes.ErrorMessages.S_TAKES_AT_LEAST_D_ARGUMENTS_D_GIVEN; -import static com.oracle.graal.python.nodes.ErrorMessages.S_TAKES_AT_MOST_D_ARGUMENTS_D_GIVEN; -import static com.oracle.graal.python.nodes.ErrorMessages.S_TAKES_NO_KEYWORD_ARGS; import static com.oracle.graal.python.nodes.SpecialMethodNames.T_DECODE; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.MemoryError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.nio.ByteOrder; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.array.ArrayBuiltins; -import com.oracle.graal.python.builtins.objects.array.ArrayNodes; import com.oracle.graal.python.builtins.objects.array.PArray; import com.oracle.graal.python.builtins.objects.array.PArray.MachineFormat; import com.oracle.graal.python.builtins.objects.bytes.PBytes; -import com.oracle.graal.python.builtins.objects.bytes.PBytesLike; -import com.oracle.graal.python.builtins.objects.common.SequenceNodes; -import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; -import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.module.PythonModule; -import com.oracle.graal.python.builtins.objects.range.PIntRange; -import com.oracle.graal.python.builtins.objects.str.StringNodes.CastToTruffleStringCheckedNode; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; -import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassExactProfile; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; -import com.oracle.graal.python.nodes.util.SplitArgsNode; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.runtime.sequence.PSequence; -import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.BufferFormat; -import com.oracle.graal.python.util.OverflowException; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.Fallback; -import com.oracle.truffle.api.dsl.GenerateCached; -import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateNodeFactory; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.profiles.ValueProfile; import com.oracle.truffle.api.strings.TruffleString; @@ -115,225 +84,6 @@ public void postInitialize(Python3Core core) { arrayModule.setAttribute(tsLiteral("typecodes"), tsLiteral("bBuhHiIlLqQfd")); } - // array.array(typecode[, initializer]) - @Builtin(name = J_ARRAY, minNumOfPositionalArgs = 1, constructsClass = PythonBuiltinClassType.PArray, takesVarArgs = true, takesVarKeywordArgs = true, declaresExplicitSelf = true) - @GenerateNodeFactory - abstract static class ArrayNode extends PythonVarargsBuiltinNode { - @Child private SplitArgsNode splitArgsNode; - - @Specialization(guards = "args.length == 1 || args.length == 2") - static Object array2(VirtualFrame frame, Object cls, Object[] args, PKeyword[] kwargs, - @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile hasInitializerProfile, - @Cached IsBuiltinClassExactProfile isNotSubtypeProfile, - @Cached CastToTruffleStringCheckedNode cast, - @Cached ArrayNodeInternal arrayNodeInternal, - @Cached PRaiseNode.Lazy raise) { - if (isNotSubtypeProfile.profileClass(inliningTarget, cls, PythonBuiltinClassType.PArray)) { - if (kwargs.length != 0) { - throw raise.get(inliningTarget).raise(TypeError, S_TAKES_NO_KEYWORD_ARGS, "array.array()"); - } - } - Object initializer = hasInitializerProfile.profile(inliningTarget, args.length == 2) ? args[1] : PNone.NO_VALUE; - return arrayNodeInternal.execute(frame, inliningTarget, cls, cast.cast(inliningTarget, args[0], ErrorMessages.ARG_1_MUST_BE_UNICODE_NOT_P, args[0]), initializer); - } - - @Fallback - @SuppressWarnings("unused") - Object error(Object cls, Object[] args, PKeyword[] kwargs) { - if (args.length < 2) { - throw raise(TypeError, S_TAKES_AT_LEAST_D_ARGUMENTS_D_GIVEN, T_ARRAY, 2, args.length); - } else { - throw raise(TypeError, S_TAKES_AT_MOST_D_ARGUMENTS_D_GIVEN, T_ARRAY, 3, args.length); - } - } - - @Override - public final Object varArgExecute(VirtualFrame frame, @SuppressWarnings("unused") Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported { - if (splitArgsNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - splitArgsNode = insert(SplitArgsNode.create()); - } - return execute(frame, arguments[0], splitArgsNode.executeCached(arguments), keywords); - } - - // multiple non-inlined specializations share nodes - @SuppressWarnings("truffle-interpreted-performance") - @ImportStatic(PGuards.class) - @GenerateInline - @GenerateCached(false) - abstract static class ArrayNodeInternal extends Node { - - public abstract PArray execute(VirtualFrame frame, Node inliningTarget, Object cls, TruffleString typeCode, Object initializer); - - @Specialization(guards = "isNoValue(initializer)") - static PArray array(Node inliningTarget, Object cls, TruffleString typeCode, @SuppressWarnings("unused") PNone initializer, - @Shared @Cached GetFormatCheckedNode getFormatCheckedNode, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - BufferFormat format = getFormatCheckedNode.execute(inliningTarget, typeCode); - return factory.createArray(cls, typeCode, format); - } - - @Specialization - @InliningCutoff - static PArray arrayWithRangeInitializer(Node inliningTarget, Object cls, TruffleString typeCode, PIntRange range, - @Shared @Cached GetFormatCheckedNode getFormatCheckedNode, - @Shared @Cached(inline = false) PythonObjectFactory factory, - @Exclusive @Cached ArrayNodes.PutValueNode putValueNode) { - BufferFormat format = getFormatCheckedNode.execute(inliningTarget, typeCode); - PArray array; - try { - array = factory.createArray(cls, typeCode, format, range.getIntLength()); - } catch (OverflowException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, MemoryError); - } - - int start = range.getIntStart(); - int step = range.getIntStep(); - int len = range.getIntLength(); - - for (int index = 0, value = start; index < len; index++, value += step) { - putValueNode.execute(null, inliningTarget, array, index, value); - } - - return array; - } - - @Specialization - static PArray arrayWithBytesInitializer(VirtualFrame frame, Node inliningTarget, Object cls, TruffleString typeCode, PBytesLike bytes, - @Shared @Cached GetFormatCheckedNode getFormatCheckedNode, - @Shared @Cached(inline = false) PythonObjectFactory factory, - @Cached(inline = false) ArrayBuiltins.FromBytesNode fromBytesNode) { - BufferFormat format = getFormatCheckedNode.execute(inliningTarget, typeCode); - PArray array = factory.createArray(cls, typeCode, format); - fromBytesNode.executeWithoutClinic(frame, array, bytes); - return array; - } - - @Specialization(guards = "isString(initializer)") - @InliningCutoff - static PArray arrayWithStringInitializer(VirtualFrame frame, Node inliningTarget, Object cls, TruffleString typeCode, Object initializer, - @Shared @Cached GetFormatCheckedNode getFormatCheckedNode, - @Shared @Cached(inline = false) PythonObjectFactory factory, - @Cached(inline = false) ArrayBuiltins.FromUnicodeNode fromUnicodeNode, - @Cached PRaiseNode.Lazy raise) { - BufferFormat format = getFormatCheckedNode.execute(inliningTarget, typeCode); - if (format != BufferFormat.UNICODE) { - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.CANNOT_USE_STR_TO_INITIALIZE_ARRAY, typeCode); - } - PArray array = factory.createArray(cls, typeCode, format); - fromUnicodeNode.execute(frame, array, initializer); - return array; - } - - @Specialization - @InliningCutoff - static PArray arrayArrayInitializer(VirtualFrame frame, Node inliningTarget, Object cls, TruffleString typeCode, PArray initializer, - @Shared @Cached GetFormatCheckedNode getFormatCheckedNode, - @Shared @Cached(inline = false) PythonObjectFactory factory, - @Exclusive @Cached ArrayNodes.PutValueNode putValueNode, - @Cached ArrayNodes.GetValueNode getValueNode) { - BufferFormat format = getFormatCheckedNode.execute(inliningTarget, typeCode); - try { - int length = initializer.getLength(); - PArray array = factory.createArray(cls, typeCode, format, length); - for (int i = 0; i < length; i++) { - putValueNode.execute(frame, inliningTarget, array, i, getValueNode.execute(inliningTarget, initializer, i)); - } - return array; - } catch (OverflowException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, MemoryError); - } - } - - @Specialization(guards = "!isBytes(initializer)") - @InliningCutoff - static PArray arraySequenceInitializer(VirtualFrame frame, Node inliningTarget, Object cls, TruffleString typeCode, PSequence initializer, - @Shared @Cached GetFormatCheckedNode getFormatCheckedNode, - @Shared @Cached(inline = false) PythonObjectFactory factory, - @Exclusive @Cached ArrayNodes.PutValueNode putValueNode, - @Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode, - @Cached SequenceStorageNodes.GetItemScalarNode getItemNode) { - BufferFormat format = getFormatCheckedNode.execute(inliningTarget, typeCode); - SequenceStorage storage = getSequenceStorageNode.execute(inliningTarget, initializer); - int length = storage.length(); - try { - PArray array = factory.createArray(cls, typeCode, format, length); - for (int i = 0; i < length; i++) { - putValueNode.execute(frame, inliningTarget, array, i, getItemNode.execute(inliningTarget, storage, i)); - } - return array; - } catch (OverflowException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, MemoryError); - } - } - - @Specialization(guards = {"!isBytes(initializer)", "!isString(initializer)", "!isPSequence(initializer)"}) - @InliningCutoff - static PArray arrayIteratorInitializer(VirtualFrame frame, Node inliningTarget, Object cls, TruffleString typeCode, Object initializer, - @Cached PyObjectGetIter getIter, - @Shared @Cached GetFormatCheckedNode getFormatCheckedNode, - @Shared @Cached(inline = false) PythonObjectFactory factory, - @Exclusive @Cached ArrayNodes.PutValueNode putValueNode, - @Cached(inline = false) GetNextNode nextNode, - @Cached IsBuiltinObjectProfile errorProfile, - @Cached ArrayNodes.SetLengthNode setLengthNode, - @Cached ArrayNodes.EnsureCapacityNode ensureCapacityNode) { - Object iter = getIter.execute(frame, inliningTarget, initializer); - - BufferFormat format = getFormatCheckedNode.execute(inliningTarget, typeCode); - PArray array = factory.createArray(cls, typeCode, format); - - int length = 0; - while (true) { - Object nextValue; - try { - nextValue = nextNode.execute(frame, iter); - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - break; - } - try { - length = PythonUtils.addExact(length, 1); - ensureCapacityNode.execute(inliningTarget, array, length); - } catch (OverflowException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, MemoryError); - } - putValueNode.execute(frame, inliningTarget, array, length - 1, nextValue); - } - - setLengthNode.execute(inliningTarget, array, length); - return array; - } - - @GenerateInline - @GenerateCached(false) - abstract static class GetFormatCheckedNode extends Node { - abstract BufferFormat execute(Node inliningTarget, TruffleString typeCode); - - @Specialization - static BufferFormat get(Node inliningTarget, TruffleString typeCode, - @Cached(inline = false) TruffleString.CodePointLengthNode lengthNode, - @Cached(inline = false) TruffleString.CodePointAtIndexNode atIndexNode, - @Cached PRaiseNode.Lazy raise, - @Cached(value = "createIdentityProfile()", inline = false) ValueProfile valueProfile) { - if (lengthNode.execute(typeCode, TS_ENCODING) != 1) { - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.ARRAY_ARG_1_MUST_BE_UNICODE); - } - BufferFormat format = BufferFormat.forArray(typeCode, lengthNode, atIndexNode); - if (format == null) { - throw raise.get(inliningTarget).raise(ValueError, ErrorMessages.BAD_TYPECODE); - } - return valueProfile.profile(format); - } - } - } - } - @Builtin(name = "_array_reconstructor", minNumOfPositionalArgs = 4, numOfPositionalOnlyArgs = 4, parameterNames = {"arrayType", "typeCode", "mformatCode", "items"}) @ArgumentClinic(name = "typeCode", conversion = ArgumentClinic.ClinicConversion.TString) @ArgumentClinic(name = "mformatCode", conversion = ArgumentClinic.ClinicConversion.Index) @@ -349,18 +99,20 @@ static Object reconstructCached(VirtualFrame frame, Object arrayType, TruffleStr @Exclusive @Cached PyObjectCallMethodObjArgs callDecode, @Exclusive @Cached ArrayBuiltins.FromBytesNode fromBytesNode, @Exclusive @Cached ArrayBuiltins.FromUnicodeNode fromUnicodeNode, + @Exclusive @Cached TypeNodes.IsTypeNode isTypeNode, @Exclusive @Cached IsSubtypeNode isSubtypeNode, @Exclusive @Cached ArrayBuiltins.ByteSwapNode byteSwapNode, @Exclusive @Cached TruffleString.CodePointLengthNode lengthNode, @Exclusive @Cached TruffleString.CodePointAtIndexNode atIndexNode, - @Exclusive @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Exclusive @Cached PRaiseNode raiseNode) { BufferFormat format = BufferFormat.forArray(typeCode, lengthNode, atIndexNode); if (format == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.BAD_TYPECODE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.BAD_TYPECODE); } - return doReconstruct(frame, inliningTarget, arrayType, typeCode, cachedCode, bytes, callDecode, fromBytesNode, fromUnicodeNode, isSubtypeNode, byteSwapNode, formatProfile.profile(format), - factory, raiseNode); + return doReconstruct(frame, inliningTarget, arrayType, typeCode, cachedCode, bytes, callDecode, fromBytesNode, fromUnicodeNode, isTypeNode, isSubtypeNode, byteSwapNode, + formatProfile.profile(format), + getInstanceShape, raiseNode); } @Specialization(replaces = "reconstructCached") @@ -369,35 +121,41 @@ static Object reconstruct(VirtualFrame frame, Object arrayType, TruffleString ty @Exclusive @Cached PyObjectCallMethodObjArgs callDecode, @Exclusive @Cached ArrayBuiltins.FromBytesNode fromBytesNode, @Exclusive @Cached ArrayBuiltins.FromUnicodeNode fromUnicodeNode, + @Exclusive @Cached TypeNodes.IsTypeNode isTypeNode, @Exclusive @Cached IsSubtypeNode isSubtypeNode, @Exclusive @Cached ArrayBuiltins.ByteSwapNode byteSwapNode, @Exclusive @Cached TruffleString.CodePointLengthNode lengthNode, @Exclusive @Cached TruffleString.CodePointAtIndexNode atIndexNode, - @Exclusive @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Exclusive @Cached PRaiseNode raiseNode) { BufferFormat format = BufferFormat.forArray(typeCode, lengthNode, atIndexNode); if (format == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.BAD_TYPECODE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.BAD_TYPECODE); } - return doReconstruct(frame, inliningTarget, arrayType, typeCode, mformatCode, bytes, callDecode, fromBytesNode, fromUnicodeNode, isSubtypeNode, byteSwapNode, format, factory, raiseNode); + return doReconstruct(frame, inliningTarget, arrayType, typeCode, mformatCode, bytes, callDecode, fromBytesNode, fromUnicodeNode, isTypeNode, isSubtypeNode, byteSwapNode, format, + getInstanceShape, + raiseNode); } private static Object doReconstruct(VirtualFrame frame, Node inliningTarget, Object arrayType, TruffleString typeCode, int mformatCode, PBytes bytes, PyObjectCallMethodObjArgs callDecode, - ArrayBuiltins.FromBytesNode fromBytesNode, ArrayBuiltins.FromUnicodeNode fromUnicodeNode, IsSubtypeNode isSubtypeNode, + ArrayBuiltins.FromBytesNode fromBytesNode, ArrayBuiltins.FromUnicodeNode fromUnicodeNode, TypeNodes.IsTypeNode isTypeNode, IsSubtypeNode isSubtypeNode, ArrayBuiltins.ByteSwapNode byteSwapNode, BufferFormat format, - PythonObjectFactory factory, PRaiseNode.Lazy raiseNode) { - if (!isSubtypeNode.execute(frame, arrayType, PythonBuiltinClassType.PArray)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.N_NOT_SUBTYPE_OF_ARRAY, arrayType); + TypeNodes.GetInstanceShape getInstanceShape, PRaiseNode raiseNode) { + if (!isTypeNode.execute(inliningTarget, arrayType)) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.FIRST_ARGUMENT_MUST_BE_A_TYPE_OBJECT_NOT_P, arrayType); + } + if (!isSubtypeNode.execute(arrayType, PythonBuiltinClassType.PArray)) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.N_NOT_SUBTYPE_OF_ARRAY, arrayType); } MachineFormat machineFormat = MachineFormat.fromCode(mformatCode); if (machineFormat != null) { PArray array; if (machineFormat == MachineFormat.forFormat(format)) { - array = factory.createArray(arrayType, typeCode, machineFormat.format); + array = PFactory.createArray(PythonLanguage.get(inliningTarget), arrayType, getInstanceShape.execute(arrayType), typeCode, machineFormat.format); fromBytesNode.executeWithoutClinic(frame, array, bytes); } else { TruffleString newTypeCode = machineFormat.format == format ? typeCode : machineFormat.format.baseTypeCode; - array = factory.createArray(arrayType, newTypeCode, machineFormat.format); + array = PFactory.createArray(PythonLanguage.get(inliningTarget), arrayType, getInstanceShape.execute(arrayType), newTypeCode, machineFormat.format); if (machineFormat.unicodeEncoding != null) { Object decoded = callDecode.execute(frame, inliningTarget, bytes, T_DECODE, machineFormat.unicodeEncoding); fromUnicodeNode.execute(frame, array, decoded); @@ -410,15 +168,15 @@ private static Object doReconstruct(VirtualFrame frame, Node inliningTarget, Obj } return array; } else { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.THIRD_ARG_MUST_BE_A_VALID_MACHINE_CODE_FMT); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.THIRD_ARG_MUST_BE_A_VALID_MACHINE_CODE_FMT); } } @Specialization(guards = "!isPBytes(value)") @SuppressWarnings("unused") static Object error(Object arrayType, TruffleString typeCode, int mformatCode, Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.FOURTH_ARG_SHOULD_BE_BYTES, value); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.FOURTH_ARG_SHOULD_BE_BYTES, value); } protected static boolean isPBytes(Object obj) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/AsyncioModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/AsyncioModuleBuiltins.java index 65a17842dd..c6a9900c1c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/AsyncioModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/AsyncioModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -69,7 +69,8 @@ import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.statement.AbstractImportNode; -import com.oracle.graal.python.runtime.object.PythonObjectSlowPathFactory; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -92,11 +93,13 @@ protected List> getNodeFa @GenerateNodeFactory public abstract static class GetRunningLoop extends PythonBuiltinNode { @Specialization - public Object getCurrentLoop( + static Object getCurrentLoop( + @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached PRaiseNode raise) { - Object eventLoop = getContext().getThreadState(getLanguage()).getRunningEventLoop(); + Object eventLoop = context.getThreadState(context.getLanguage(inliningTarget)).getRunningEventLoop(); if (eventLoop == null) { - throw raise.raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.NO_RUNNING_EVENT_LOOP); + throw raise.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.NO_RUNNING_EVENT_LOOP); } else { return eventLoop; } @@ -107,8 +110,10 @@ public Object getCurrentLoop( @GenerateNodeFactory public abstract static class InternalGetRunningLoop extends PythonBuiltinNode { @Specialization - public Object getCurrentLoop() { - Object eventLoop = getContext().getThreadState(getLanguage()).getRunningEventLoop(); + static Object getCurrentLoop( + @Bind("this") Node inliningTarget, + @Bind PythonContext context) { + Object eventLoop = context.getThreadState(context.getLanguage(inliningTarget)).getRunningEventLoop(); return eventLoop == null ? PNone.NONE : eventLoop; } @@ -118,8 +123,10 @@ public Object getCurrentLoop() { @GenerateNodeFactory public abstract static class InternalSetRunningLoop extends PythonUnaryBuiltinNode { @Specialization - public Object setCurrentLoop(Object loop) { - getContext().getThreadState(getLanguage()).setRunningEventLoop(loop == PNone.NONE ? null : loop); + static Object setCurrentLoop(Object loop, + @Bind("this") Node inliningTarget, + @Bind PythonContext context) { + context.getThreadState(context.getLanguage(inliningTarget)).setRunningEventLoop(loop == PNone.NONE ? null : loop); return PNone.NONE; } } @@ -134,15 +141,17 @@ public Object setCurrentLoop(Object loop) { public abstract static class GetEventLoop extends PythonUnaryBuiltinNode { @Specialization - public Object getCurrentLoop(VirtualFrame frame, Object ignored, + static Object getCurrentLoop(VirtualFrame frame, Object ignored, + @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached CallNode callGetPolicy, @Cached CallNode callGetLoop, @Cached AbstractImportNode.ImportName importName, @Cached(parameters = "T_GET_EVENT_LOOP") GetAttributeNode.GetFixedAttributeNode getGetLoop, @Cached(parameters = "T_GET_EVENT_LOOP_POLICY") GetAttributeNode.GetFixedAttributeNode getGetLoopPolicy) { - Object eventLoop = getContext().getThreadState(getLanguage()).getRunningEventLoop(); + Object eventLoop = context.getThreadState(context.getLanguage(inliningTarget)).getRunningEventLoop(); if (eventLoop == null) { - Object asyncio = importName.execute(frame, getContext(), getContext().getBuiltins(), T_ASYNCIO_EVENTS, PNone.NONE, PythonUtils.EMPTY_TRUFFLESTRING_ARRAY, 0); + Object asyncio = importName.execute(frame, context, context.getBuiltins(), T_ASYNCIO_EVENTS, PNone.NONE, PythonUtils.EMPTY_TRUFFLESTRING_ARRAY, 0); Object asyncioGetPolicy = getGetLoopPolicy.execute(frame, asyncio); Object policy = callGetPolicy.execute(frame, asyncioGetPolicy); Object getLoop = getGetLoop.execute(frame, policy); @@ -180,7 +189,7 @@ public Object enterTask(VirtualFrame frame, PythonModule self, Object loop, Obje if (item == null) { set.execute(frame, inliningTarget, dict, loop, task); } else { - throw raise.raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.CANT_ENTER_TASK_ALREADY_RUNNING, task, item); + throw raise.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.CANT_ENTER_TASK_ALREADY_RUNNING, task, item); } return PNone.NONE; } @@ -201,7 +210,7 @@ public Object leaveTask(VirtualFrame frame, PythonModule self, Object loop, Obje item = PNone.NONE; } if (item != task) { - throw raise.raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.TASK_NOT_ENTERED, task, item); + throw raise.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.TASK_NOT_ENTERED, task, item); } del.execute(frame, inliningTarget, dict, loop); return PNone.NONE; @@ -244,9 +253,8 @@ public Object unregisterTask(VirtualFrame frame, PythonModule self, Object task, @Override public void postInitialize(Python3Core core) { - PythonObjectSlowPathFactory factory = core.factory(); PythonModule self = core.lookupBuiltinModule(T__ASYNCIO); - self.setAttribute(CURRENT_TASKS_ATTR, factory.createDict()); + self.setAttribute(CURRENT_TASKS_ATTR, PFactory.createDict(core.getLanguage())); Object weakref = AbstractImportNode.importModule(WEAKREF); Object weakSetCls = PyObjectGetAttr.executeUncached(weakref, WEAKSET); Object weakSet = CallNode.executeUncached(weakSetCls); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/AtexitModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/AtexitModuleBuiltins.java index 7d801aac5f..b5ae843f2e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/AtexitModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/AtexitModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -132,9 +132,10 @@ private static void handleException(PythonContext context, PException e) { @TruffleBoundary @Specialization - Object register(Object callable, Object[] arguments, PKeyword[] keywords) { - RootCallTarget callTarget = getLanguage().createCachedCallTarget(AtExitRootNode::new, AtExitRootNode.class); - getContext().registerAtexitHook(callable, arguments, keywords, callTarget); + static Object register(Object callable, Object[] arguments, PKeyword[] keywords) { + PythonContext context = PythonContext.get(null); + RootCallTarget callTarget = context.getLanguage().createCachedCallTarget(AtExitRootNode::new, AtExitRootNode.class); + context.registerAtexitHook(callable, arguments, keywords, callTarget); return callable; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BinasciiModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BinasciiModuleBuiltins.java index 4e4a44c626..aae17200d2 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BinasciiModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BinasciiModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -54,6 +54,7 @@ import java.util.Base64; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ClinicConverterFactory; import com.oracle.graal.python.builtins.Builtin; @@ -75,7 +76,8 @@ import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.IndirectCallData; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; @@ -106,10 +108,12 @@ protected List> getNodeFa abstract static class AsciiBufferConverter extends ArgumentCastNode { @Specialization(guards = "acquireLib.hasBuffer(value)", limit = "getCallSiteInlineCacheMaxDepth()") - Object doObject(VirtualFrame frame, Object value, + static Object doObject(VirtualFrame frame, Object value, + @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("value") PythonBufferAcquireLibrary acquireLib) { - return acquireLib.acquireReadonly(value, frame, getContext(), getLanguage(), indirectCallData); + return acquireLib.acquireReadonly(value, frame, context, context.getLanguage(inliningTarget), indirectCallData); } @ExportLibrary(PythonBufferAccessLibrary.class) @@ -150,9 +154,9 @@ static Object asciiString(TruffleString value, @Specialization(guards = "!isAscii(value, getCodeRangeNode)") static Object nonAsciiString(@SuppressWarnings("unused") TruffleString value, - @Shared("getCodeRange") @Cached @SuppressWarnings("unused") TruffleString.GetCodeRangeNode getCodeRangeNode, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.STRING_ARG_SHOULD_CONTAIN_ONLY_ASCII); + @Bind("this") Node inliningTarget, + @Shared("getCodeRange") @Cached @SuppressWarnings("unused") TruffleString.GetCodeRangeNode getCodeRangeNode) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.STRING_ARG_SHOULD_CONTAIN_ONLY_ASCII); } @Specialization @@ -160,20 +164,19 @@ static Object string(PString value, @Bind("this") Node inliningTarget, @Cached CastToTruffleStringNode cast, @Shared("getCodeRange") @Cached @SuppressWarnings("unused") TruffleString.GetCodeRangeNode getCodeRangeNode, - @Cached InlinedConditionProfile asciiProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached InlinedConditionProfile asciiProfile) { TruffleString ts = cast.execute(inliningTarget, value); if (asciiProfile.profile(inliningTarget, isAscii(ts, getCodeRangeNode))) { return asciiString(ts, getCodeRangeNode); } else { - return nonAsciiString(ts, getCodeRangeNode, raiseNode.get(inliningTarget)); + return nonAsciiString(ts, inliningTarget, getCodeRangeNode); } } @Fallback static Object error(@SuppressWarnings("unused") Object value, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.ARG_SHOULD_BE_BYTES_BUFFER_OR_ASCII_NOT_P, value); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.ARG_SHOULD_BE_BYTES_BUFFER_OR_ASCII_NOT_P, value); } @ClinicConverterFactory @@ -192,10 +195,10 @@ abstract static class A2bBase64Node extends PythonBinaryClinicBuiltinNode { PBytes doConvert(VirtualFrame frame, Object buffer, boolean strictMode, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { try { ByteSequenceStorage storage = b64decode(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer), strictMode); - return factory.createBytes(storage); + return PFactory.createBytes(language, storage); } finally { bufferLib.release(buffer, frame, indirectCallData); } @@ -223,19 +226,19 @@ private ByteSequenceStorage b64decode(byte[] data, int dataLen, boolean strictMo } else if (c == '=') { padding++; } else if (strictMode) { - throw PRaiseNode.raiseUncached(this, BinasciiError, ErrorMessages.ONLY_BASE64_DATA_IS_ALLOWED); + throw PRaiseNode.raiseStatic(this, BinasciiError, ErrorMessages.ONLY_BASE64_DATA_IS_ALLOWED); } } int expectedPadding = 0; if (base64chars % 4 == 1) { - throw PRaiseNode.raiseUncached(this, BinasciiError, ErrorMessages.INVALID_BASE64_ENCODED_STRING); + throw PRaiseNode.raiseStatic(this, BinasciiError, ErrorMessages.INVALID_BASE64_ENCODED_STRING); } else if (base64chars % 4 == 2) { expectedPadding = 2; } else if (base64chars % 4 == 3) { expectedPadding = 1; } if (padding < expectedPadding) { - throw PRaiseNode.raiseUncached(this, BinasciiError, ErrorMessages.INCORRECT_PADDING); + throw PRaiseNode.raiseStatic(this, BinasciiError, ErrorMessages.INCORRECT_PADDING); } // Find the end of the expected padding, if any int decodeLen = lastBase64Char + 1; @@ -259,7 +262,7 @@ private ByteSequenceStorage b64decode(byte[] data, int dataLen, boolean strictMo ByteBuffer result = decoder.decode(ByteBuffer.wrap(data, 0, decodeLen)); return new ByteSequenceStorage(result.array(), result.limit()); } catch (IllegalArgumentException e) { - throw PRaiseNode.raiseUncached(this, BinasciiError, e); + throw PRaiseNode.raiseStatic(this, BinasciiError, e); } } @@ -277,10 +280,10 @@ abstract static class A2bHexNode extends PythonUnaryClinicBuiltinNode { PBytes a2b(VirtualFrame frame, Object buffer, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { try { byte[] bytes = a2b(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer)); - return factory.createBytes(bytes); + return PFactory.createBytes(language, bytes); } finally { bufferLib.release(buffer, frame, indirectCallData); } @@ -289,7 +292,7 @@ PBytes a2b(VirtualFrame frame, Object buffer, @TruffleBoundary private byte[] a2b(byte[] bytes, int length) { if (length % 2 != 0) { - throw PRaiseNode.raiseUncached(this, BinasciiError, ErrorMessages.ODD_LENGTH_STRING); + throw PRaiseNode.raiseStatic(this, BinasciiError, ErrorMessages.ODD_LENGTH_STRING); } byte[] output = new byte[length / 2]; for (int i = 0; i < length / 2; i++) { @@ -306,7 +309,7 @@ private int digitValue(char b) { } else if (b >= 'A' && b <= 'F') { return b - 'A' + 10; } else { - throw PRaiseNode.raiseUncached(this, BinasciiError, ErrorMessages.NON_HEX_DIGIT_FOUND); + throw PRaiseNode.raiseStatic(this, BinasciiError, ErrorMessages.NON_HEX_DIGIT_FOUND); } } @@ -322,28 +325,28 @@ protected ArgumentClinicProvider getArgumentClinic() { @GenerateNodeFactory abstract static class B2aBase64Node extends PythonClinicBuiltinNode { @TruffleBoundary - private PBytes b2a(byte[] data, int lenght, int newline, PythonObjectFactory factory) { + private PBytes b2a(byte[] data, int lenght, int newline, PythonLanguage language) { ByteBuffer encoded; try { encoded = Base64.getEncoder().encode(ByteBuffer.wrap(data, 0, lenght)); } catch (IllegalArgumentException e) { - throw PRaiseNode.raiseUncached(this, BinasciiError, e); + throw PRaiseNode.raiseStatic(this, BinasciiError, e); } if (newline != 0) { byte[] encodedWithNL = Arrays.copyOf(encoded.array(), encoded.limit() + 1); encodedWithNL[encodedWithNL.length - 1] = '\n'; - return factory.createBytes(encodedWithNL); + return PFactory.createBytes(language, encodedWithNL); } - return factory.createBytes(encoded.array(), encoded.limit()); + return PFactory.createBytes(language, encoded.array(), encoded.limit()); } @Specialization(limit = "3") PBytes b2aBuffer(VirtualFrame frame, Object buffer, int newline, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { try { - return b2a(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer), newline, factory); + return b2a(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer), newline, language); } finally { bufferLib.release(buffer, frame, indirectCallData); } @@ -368,28 +371,28 @@ static PBytes b2a(VirtualFrame frame, Object buffer, Object sep, int bytesPerSep @Bind("this") Node inliningTarget, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { if (sep != PNone.NO_VALUE || bytesPerSep != 1) { // TODO implement sep and bytes_per_sep - throw raiseNode.get(inliningTarget).raise(NotImplementedError); + throw raiseNode.raise(inliningTarget, NotImplementedError); } try { - return b2a(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer), factory); + return b2a(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer), language); } finally { bufferLib.release(buffer, frame, indirectCallData); } } @TruffleBoundary - private static PBytes b2a(byte[] bytes, int length, PythonObjectFactory factory) { + private static PBytes b2a(byte[] bytes, int length, PythonLanguage language) { byte[] output = new byte[length * 2]; for (int i = 0; i < length; i++) { int v = bytes[i] & 0xff; output[i * 2] = HEX_DIGITS[v >> 4]; output[i * 2 + 1] = HEX_DIGITS[v & 0xf]; } - return factory.createBytes(output); + return PFactory.createBytes(language, output); } @Override diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinConstructors.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinConstructors.java deleted file mode 100644 index ad074c0df6..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinConstructors.java +++ /dev/null @@ -1,3497 +0,0 @@ -/* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. - * Copyright (c) 2013, Regents of the University of California - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.oracle.graal.python.builtins.modules; - -import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_BYTES_SUBTYPE_NEW; -import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_OBJECT_NEW; -import static com.oracle.graal.python.nodes.BuiltinNames.J_BOOL; -import static com.oracle.graal.python.nodes.BuiltinNames.J_BYTEARRAY; -import static com.oracle.graal.python.nodes.BuiltinNames.J_BYTES; -import static com.oracle.graal.python.nodes.BuiltinNames.J_CLASSMETHOD; -import static com.oracle.graal.python.nodes.BuiltinNames.J_COMPLEX; -import static com.oracle.graal.python.nodes.BuiltinNames.J_DICT; -import static com.oracle.graal.python.nodes.BuiltinNames.J_DICT_ITEMITERATOR; -import static com.oracle.graal.python.nodes.BuiltinNames.J_DICT_ITEMS; -import static com.oracle.graal.python.nodes.BuiltinNames.J_DICT_KEYITERATOR; -import static com.oracle.graal.python.nodes.BuiltinNames.J_DICT_KEYS; -import static com.oracle.graal.python.nodes.BuiltinNames.J_DICT_VALUEITERATOR; -import static com.oracle.graal.python.nodes.BuiltinNames.J_DICT_VALUES; -import static com.oracle.graal.python.nodes.BuiltinNames.J_ENUMERATE; -import static com.oracle.graal.python.nodes.BuiltinNames.J_FLOAT; -import static com.oracle.graal.python.nodes.BuiltinNames.J_FROZENSET; -import static com.oracle.graal.python.nodes.BuiltinNames.J_GETSET_DESCRIPTOR; -import static com.oracle.graal.python.nodes.BuiltinNames.J_INSTANCEMETHOD; -import static com.oracle.graal.python.nodes.BuiltinNames.J_INT; -import static com.oracle.graal.python.nodes.BuiltinNames.J_LIST; -import static com.oracle.graal.python.nodes.BuiltinNames.J_MAP; -import static com.oracle.graal.python.nodes.BuiltinNames.J_MEMBER_DESCRIPTOR; -import static com.oracle.graal.python.nodes.BuiltinNames.J_MEMORYVIEW; -import static com.oracle.graal.python.nodes.BuiltinNames.J_MODULE; -import static com.oracle.graal.python.nodes.BuiltinNames.J_OBJECT; -import static com.oracle.graal.python.nodes.BuiltinNames.J_PROPERTY; -import static com.oracle.graal.python.nodes.BuiltinNames.J_RANGE; -import static com.oracle.graal.python.nodes.BuiltinNames.J_REVERSED; -import static com.oracle.graal.python.nodes.BuiltinNames.J_SET; -import static com.oracle.graal.python.nodes.BuiltinNames.J_STATICMETHOD; -import static com.oracle.graal.python.nodes.BuiltinNames.J_STR; -import static com.oracle.graal.python.nodes.BuiltinNames.J_SUPER; -import static com.oracle.graal.python.nodes.BuiltinNames.J_TUPLE; -import static com.oracle.graal.python.nodes.BuiltinNames.J_TYPE; -import static com.oracle.graal.python.nodes.BuiltinNames.J_WRAPPER_DESCRIPTOR; -import static com.oracle.graal.python.nodes.BuiltinNames.J_ZIP; -import static com.oracle.graal.python.nodes.BuiltinNames.T_EXCEPTION_GROUP; -import static com.oracle.graal.python.nodes.BuiltinNames.T_GETSET_DESCRIPTOR; -import static com.oracle.graal.python.nodes.BuiltinNames.T_LAMBDA_NAME; -import static com.oracle.graal.python.nodes.BuiltinNames.T_MEMBER_DESCRIPTOR; -import static com.oracle.graal.python.nodes.BuiltinNames.T_NOT_IMPLEMENTED; -import static com.oracle.graal.python.nodes.BuiltinNames.T_WRAPPER_DESCRIPTOR; -import static com.oracle.graal.python.nodes.BuiltinNames.T_ZIP; -import static com.oracle.graal.python.nodes.ErrorMessages.ARG_MUST_NOT_BE_ZERO; -import static com.oracle.graal.python.nodes.PGuards.isInteger; -import static com.oracle.graal.python.nodes.PGuards.isNoValue; -import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___ABSTRACTMETHODS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INDEX__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___TRUNC__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T_JOIN; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T_SORT; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___BYTES__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___COMPLEX__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MRO_ENTRIES__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___TRUNC__; -import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA_SPACE; -import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; -import static com.oracle.graal.python.nodes.StringLiterals.T_STRICT; -import static com.oracle.graal.python.nodes.StringLiterals.T_UTF8; -import static com.oracle.graal.python.nodes.truffle.TruffleStringMigrationHelpers.assertNoJavaString; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.DeprecationWarning; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.NotImplementedError; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.OverflowError; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.RuntimeError; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; -import static com.oracle.graal.python.util.PythonUtils.addExact; -import static com.oracle.graal.python.util.PythonUtils.multiplyExact; -import static com.oracle.graal.python.util.PythonUtils.negateExact; -import static com.oracle.graal.python.util.PythonUtils.objectArrayToTruffleStringArray; -import static com.oracle.graal.python.util.PythonUtils.subtractExact; - -import java.math.BigInteger; -import java.util.List; - -import com.oracle.graal.python.annotations.ArgumentClinic; -import com.oracle.graal.python.builtins.Builtin; -import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.modules.BuiltinConstructorsFactory.FloatNodeFactory.NonPrimitiveFloatNodeGen; -import com.oracle.graal.python.builtins.modules.BuiltinConstructorsFactory.ObjectNodeFactory.ReportAbstractClassNodeGen; -import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins.WarnNode; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.PNotImplemented; -import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; -import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary; -import com.oracle.graal.python.builtins.objects.bytes.BytesNodes; -import com.oracle.graal.python.builtins.objects.bytes.PByteArray; -import com.oracle.graal.python.builtins.objects.bytes.PBytes; -import com.oracle.graal.python.builtins.objects.bytes.PBytesLike; -import com.oracle.graal.python.builtins.objects.cell.PCell; -import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; -import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr; -import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes; -import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PCallCapiFunction; -import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes; -import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol; -import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.NativeToPythonTransferNode; -import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode; -import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CByteArrayWrapper; -import com.oracle.graal.python.builtins.objects.code.CodeNodes; -import com.oracle.graal.python.builtins.objects.code.PCode; -import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes; -import com.oracle.graal.python.builtins.objects.common.HashingStorage; -import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetObjectArrayNode; -import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; -import com.oracle.graal.python.builtins.objects.complex.PComplex; -import com.oracle.graal.python.builtins.objects.dict.PDict; -import com.oracle.graal.python.builtins.objects.ellipsis.PEllipsis; -import com.oracle.graal.python.builtins.objects.enumerate.PEnumerate; -import com.oracle.graal.python.builtins.objects.floats.FloatUtils; -import com.oracle.graal.python.builtins.objects.floats.PFloat; -import com.oracle.graal.python.builtins.objects.frame.PFrame; -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.function.PFunction; -import com.oracle.graal.python.builtins.objects.function.PKeyword; -import com.oracle.graal.python.builtins.objects.ints.PInt; -import com.oracle.graal.python.builtins.objects.iterator.PBigRangeIterator; -import com.oracle.graal.python.builtins.objects.iterator.PZip; -import com.oracle.graal.python.builtins.objects.list.PList; -import com.oracle.graal.python.builtins.objects.map.PMap; -import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView; -import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; -import com.oracle.graal.python.builtins.objects.namespace.PSimpleNamespace; -import com.oracle.graal.python.builtins.objects.object.ObjectBuiltinsFactory; -import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.graal.python.builtins.objects.property.PProperty; -import com.oracle.graal.python.builtins.objects.range.PBigRange; -import com.oracle.graal.python.builtins.objects.range.PIntRange; -import com.oracle.graal.python.builtins.objects.range.RangeNodes; -import com.oracle.graal.python.builtins.objects.range.RangeNodes.LenOfIntRangeNodeExact; -import com.oracle.graal.python.builtins.objects.set.PFrozenSet; -import com.oracle.graal.python.builtins.objects.set.PSet; -import com.oracle.graal.python.builtins.objects.str.PString; -import com.oracle.graal.python.builtins.objects.traceback.PTraceback; -import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; -import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.builtins.objects.type.TypeBuiltins; -import com.oracle.graal.python.builtins.objects.type.TypeFlags; -import com.oracle.graal.python.builtins.objects.type.TypeNodes; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.CreateTypeNode; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsAcceptableBaseNode; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.NeedsNativeAllocationNode; -import com.oracle.graal.python.builtins.objects.types.PGenericAlias; -import com.oracle.graal.python.lib.CanBeDoubleNode; -import com.oracle.graal.python.lib.PyBytesCheckNode; -import com.oracle.graal.python.lib.PyCallableCheckNode; -import com.oracle.graal.python.lib.PyComplexCheckExactNode; -import com.oracle.graal.python.lib.PyFloatAsDoubleNode; -import com.oracle.graal.python.lib.PyFloatFromString; -import com.oracle.graal.python.lib.PyIndexCheckNode; -import com.oracle.graal.python.lib.PyLongCheckExactNode; -import com.oracle.graal.python.lib.PyLongFromDoubleNode; -import com.oracle.graal.python.lib.PyMappingCheckNode; -import com.oracle.graal.python.lib.PyMemoryViewFromObject; -import com.oracle.graal.python.lib.PyNumberAsSizeNode; -import com.oracle.graal.python.lib.PyNumberFloatNode; -import com.oracle.graal.python.lib.PyNumberIndexNode; -import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; -import com.oracle.graal.python.lib.PyObjectGetAttr; -import com.oracle.graal.python.lib.PyObjectGetIter; -import com.oracle.graal.python.lib.PyObjectIsTrueNode; -import com.oracle.graal.python.lib.PyObjectLookupAttr; -import com.oracle.graal.python.lib.PyObjectSizeNode; -import com.oracle.graal.python.lib.PyObjectStrAsObjectNode; -import com.oracle.graal.python.lib.PySequenceCheckNode; -import com.oracle.graal.python.lib.PySequenceSizeNode; -import com.oracle.graal.python.lib.PySliceNew; -import com.oracle.graal.python.lib.PyUnicodeCheckExactNode; -import com.oracle.graal.python.nodes.BuiltinNames; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PGuards; -import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; -import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; -import com.oracle.graal.python.nodes.builtins.ListNodes; -import com.oracle.graal.python.nodes.builtins.TupleNodes; -import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallTernaryNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; -import com.oracle.graal.python.nodes.classes.IsSubtypeNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsAnyBuiltinClassProfile; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassExactProfile; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.util.CannotCastException; -import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; -import com.oracle.graal.python.nodes.util.CastToJavaStringNode; -import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.nodes.util.SplitArgsNode; -import com.oracle.graal.python.runtime.IndirectCallData; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.runtime.object.PythonObjectSlowPathFactory; -import com.oracle.graal.python.util.OverflowException; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.Assumption; -import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; -import com.oracle.truffle.api.Truffle; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.Fallback; -import com.oracle.truffle.api.dsl.GenerateCached; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.GenerateNodeFactory; -import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.ReportPolymorphism; -import com.oracle.truffle.api.dsl.ReportPolymorphism.Megamorphic; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.library.CachedLibrary; -import com.oracle.truffle.api.nodes.LoopNode; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedBranchProfile; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; -import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile; -import com.oracle.truffle.api.strings.TruffleString; - -@CoreFunctions(defineModule = BuiltinNames.J_BUILTINS, isEager = true) -public final class BuiltinConstructors extends PythonBuiltins { - - @Override - protected List> getNodeFactories() { - return BuiltinConstructorsFactory.getFactories(); - } - - @Override - public void initialize(Python3Core core) { - super.initialize(core); - addBuiltinConstant(T_NOT_IMPLEMENTED, PNotImplemented.NOT_IMPLEMENTED); - } - - // bytes([source[, encoding[, errors]]]) - @Builtin(name = J_BYTES, minNumOfPositionalArgs = 1, parameterNames = {"$self", "source", "encoding", "errors"}, constructsClass = PythonBuiltinClassType.PBytes, doc = """ - bytes(iterable_of_ints) -> bytes - bytes(string, encoding[, errors]) -> bytes - bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer - bytes(int) -> bytes object of size given by the parameter initialized with null bytes - bytes() -> empty bytes object - - Construct an immutable array of bytes from: - - an iterable yielding integers in range(256) - - a text string encoded using the specified encoding - - any object implementing the buffer API. - - an integer""") - @ArgumentClinic(name = "encoding", conversionClass = BytesNodes.ExpectStringNode.class, args = "\"bytes()\"") - @ArgumentClinic(name = "errors", conversionClass = BytesNodes.ExpectStringNode.class, args = "\"bytes()\"") - @GenerateNodeFactory - @ImportStatic(SpecialMethodSlot.class) - public abstract static class BytesNode extends PythonQuaternaryClinicBuiltinNode { - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return BuiltinConstructorsClinicProviders.BytesNodeClinicProviderGen.INSTANCE; - } - - @SuppressWarnings("unused") - @Specialization(guards = "isNoValue(source)") - static Object doEmpty(Object cls, PNone source, PNone encoding, PNone errors, - @Bind("this") Node inliningTarget, - @Exclusive @Cached CreateBytes createBytes) { - return createBytes.execute(inliningTarget, cls, PythonUtils.EMPTY_BYTE_ARRAY); - } - - @Specialization(guards = "!isNoValue(source)") - static Object doCallBytes(VirtualFrame frame, Object cls, Object source, PNone encoding, PNone errors, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached InlinedConditionProfile hasBytes, - @Cached("create(Bytes)") LookupSpecialMethodSlotNode lookupBytes, - @Cached CallUnaryMethodNode callBytes, - @Cached BytesNodes.ToBytesNode toBytesNode, - @Cached PyBytesCheckNode check, - @Exclusive @Cached BytesNodes.BytesInitNode bytesInitNode, - @Exclusive @Cached CreateBytes createBytes, - @Cached PRaiseNode.Lazy raiseNode) { - Object bytesMethod = lookupBytes.execute(frame, getClassNode.execute(inliningTarget, source), source); - if (hasBytes.profile(inliningTarget, bytesMethod != PNone.NO_VALUE)) { - Object bytes = callBytes.executeObject(frame, bytesMethod, source); - if (check.execute(inliningTarget, bytes)) { - if (cls == PythonBuiltinClassType.PBytes) { - return bytes; - } else { - return createBytes.execute(inliningTarget, cls, toBytesNode.execute(frame, bytes)); - } - } else { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.RETURNED_NONBYTES, T___BYTES__, bytes); - } - } - return createBytes.execute(inliningTarget, cls, bytesInitNode.execute(frame, inliningTarget, source, encoding, errors)); - } - - @Specialization(guards = {"isNoValue(source) || (!isNoValue(encoding) || !isNoValue(errors))"}) - static Object dontCallBytes(VirtualFrame frame, Object cls, Object source, Object encoding, Object errors, - @Bind("this") Node inliningTarget, - @Exclusive @Cached BytesNodes.BytesInitNode bytesInitNode, - @Exclusive @Cached CreateBytes createBytes) { - return createBytes.execute(inliningTarget, cls, bytesInitNode.execute(frame, inliningTarget, source, encoding, errors)); - } - - @GenerateInline - @GenerateCached(false) - abstract static class CreateBytes extends PNodeWithContext { - abstract Object execute(Node inliningTarget, Object cls, byte[] bytes); - - @Specialization(guards = "!needsNativeAllocationNode.execute(inliningTarget, cls)") - static PBytes doManaged(@SuppressWarnings("unused") Node inliningTarget, Object cls, byte[] bytes, - @SuppressWarnings("unused") @Shared @Cached TypeNodes.NeedsNativeAllocationNode needsNativeAllocationNode, - @Cached(inline = false) PythonObjectFactory factory) { - return factory.createBytes(cls, bytes); - } - - @Specialization(guards = "needsNativeAllocationNode.execute(inliningTarget, cls)") - static Object doNative(@SuppressWarnings("unused") Node inliningTarget, Object cls, byte[] bytes, - @SuppressWarnings("unused") @Shared @Cached TypeNodes.NeedsNativeAllocationNode needsNativeAllocationNode, - @Cached(inline = false) PythonToNativeNode toNative, - @Cached(inline = false) NativeToPythonTransferNode toPython, - @Cached(inline = false) PCallCapiFunction call) { - CByteArrayWrapper wrapper = new CByteArrayWrapper(bytes); - try { - return toPython.execute(call.call(FUN_BYTES_SUBTYPE_NEW, toNative.execute(cls), wrapper, bytes.length)); - } finally { - wrapper.free(); - } - } - } - } - - @Builtin(name = J_BYTEARRAY, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PByteArray, doc = """ - bytearray(iterable_of_ints) -> bytearray - bytearray(string, encoding[, errors]) -> bytearray - bytearray(bytes_or_buffer) -> mutable copy of bytes_or_buffer - bytearray(int) -> bytes array of size given by the parameter initialized with null bytes - bytearray() -> empty bytes array - - Construct a mutable bytearray object from: - - an iterable yielding integers in range(256) - - a text string encoded using the specified encoding - - a bytes or a buffer object - - any object implementing the buffer API. - - an integer""") - @GenerateNodeFactory - public abstract static class ByteArrayNode extends PythonBuiltinNode { - @Specialization - public PByteArray setEmpty(Object cls, @SuppressWarnings("unused") Object arg, - @Cached PythonObjectFactory factory) { - // data filled in subsequent __init__ call - see BytesCommonBuiltins.InitNode - return factory.createByteArray(cls, PythonUtils.EMPTY_BYTE_ARRAY); - } - - // TODO: native allocation? - } - - // complex([real[, imag]]) - @Builtin(name = J_COMPLEX, minNumOfPositionalArgs = 1, constructsClass = PythonBuiltinClassType.PComplex, parameterNames = {"$cls", "real", "imag"}, doc = """ - Create a complex number from a real part and an optional imaginary part. - - This is equivalent to (real + imag*1j) where imag defaults to 0.""") - @GenerateNodeFactory - public abstract static class ComplexNode extends PythonTernaryBuiltinNode { - @Child private LookupAndCallUnaryNode callReprNode; - @Child private LookupAndCallUnaryNode callComplexNode; - @Child private WarnNode warnNode; - - @GenerateInline - @GenerateCached(false) - @GenerateUncached - abstract static class CreateComplexNode extends Node { - public abstract Object execute(Node inliningTarget, Object cls, double real, double imaginary); - - public static Object executeUncached(Object cls, double real, double imaginary) { - return BuiltinConstructorsFactory.ComplexNodeFactory.CreateComplexNodeGen.getUncached().execute(null, cls, real, imaginary); - } - - @Specialization(guards = "!needsNativeAllocationNode.execute(inliningTarget, cls)", limit = "1") - static PComplex doManaged(@SuppressWarnings("unused") Node inliningTarget, Object cls, double real, double imaginary, - @SuppressWarnings("unused") @Cached NeedsNativeAllocationNode needsNativeAllocationNode, - @Cached(inline = false) PythonObjectFactory factory) { - return factory.createComplex(cls, real, imaginary); - } - - @Fallback - static Object doNative(Node inliningTarget, Object cls, double real, double imaginary, - @Cached(inline = false) PCallCapiFunction callCapiFunction, - @Cached(inline = false) PythonToNativeNode toNativeNode, - @Cached(inline = false) NativeToPythonTransferNode toPythonNode, - @Cached(inline = false) ExternalFunctionNodes.DefaultCheckFunctionResultNode checkFunctionResultNode) { - NativeCAPISymbol symbol = NativeCAPISymbol.FUN_COMPLEX_SUBTYPE_FROM_DOUBLES; - Object nativeResult = callCapiFunction.call(symbol, toNativeNode.execute(cls), real, imaginary); - return toPythonNode.execute(checkFunctionResultNode.execute(PythonContext.get(inliningTarget), symbol.getTsName(), nativeResult)); - } - } - - @Specialization(guards = {"isNoValue(real)", "isNoValue(imag)"}) - @SuppressWarnings("unused") - static Object complexFromNone(Object cls, PNone real, PNone imag, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode) { - return createComplexNode.execute(inliningTarget, cls, 0, 0); - } - - @Specialization - static Object complexFromIntInt(Object cls, int real, int imaginary, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode) { - return createComplexNode.execute(inliningTarget, cls, real, imaginary); - } - - @Specialization - static Object complexFromLongLong(Object cls, long real, long imaginary, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode) { - return createComplexNode.execute(inliningTarget, cls, real, imaginary); - } - - @Specialization - static Object complexFromLongLong(Object cls, PInt real, PInt imaginary, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode) { - return createComplexNode.execute(inliningTarget, cls, real.doubleValueWithOverflow(inliningTarget), - imaginary.doubleValueWithOverflow(inliningTarget)); - } - - @Specialization - static Object complexFromDoubleDouble(Object cls, double real, double imaginary, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode) { - return createComplexNode.execute(inliningTarget, cls, real, imaginary); - } - - @Specialization(guards = "isNoValue(imag)") - static Object complexFromDouble(Object cls, double real, @SuppressWarnings("unused") PNone imag, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode) { - return createComplexNode.execute(inliningTarget, cls, real, 0); - } - - @Specialization(guards = "isNoValue(imag)") - Object complexFromDouble(VirtualFrame frame, Object cls, PFloat real, @SuppressWarnings("unused") PNone imag, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode, - @Shared @Cached CanBeDoubleNode canBeDoubleNode, - @Shared("floatAsDouble") @Cached PyFloatAsDoubleNode asDoubleNode, - @Shared("isComplex") @Cached PyComplexCheckExactNode isComplexType, - @Shared("isComplexResult") @Cached PyComplexCheckExactNode isResultComplexType, - @Shared("isPrimitive") @Cached IsBuiltinClassExactProfile isPrimitiveProfile, - @Shared("isBuiltinObj") @Cached PyComplexCheckExactNode isBuiltinObjectProfile, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - return complexFromObject(frame, cls, real, imag, inliningTarget, createComplexNode, canBeDoubleNode, asDoubleNode, isComplexType, isResultComplexType, isPrimitiveProfile, - isBuiltinObjectProfile, factory, - raiseNode); - } - - @Specialization(guards = "isNoValue(imag)") - static Object complexFromInt(Object cls, int real, @SuppressWarnings("unused") PNone imag, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode) { - return createComplexNode.execute(inliningTarget, cls, real, 0); - } - - @Specialization(guards = "isNoValue(imag)") - static Object complexFromLong(Object cls, long real, @SuppressWarnings("unused") PNone imag, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode) { - return createComplexNode.execute(inliningTarget, cls, real, 0); - } - - @Specialization(guards = "isNoValue(imag)") - Object complexFromLong(VirtualFrame frame, Object cls, PInt real, @SuppressWarnings("unused") PNone imag, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode, - @Shared @Cached CanBeDoubleNode canBeDoubleNode, - @Shared("floatAsDouble") @Cached PyFloatAsDoubleNode asDoubleNode, - @Shared("isComplex") @Cached PyComplexCheckExactNode isComplexType, - @Shared("isComplexResult") @Cached PyComplexCheckExactNode isResultComplexType, - @Shared("isPrimitive") @Cached IsBuiltinClassExactProfile isPrimitiveProfile, - @Shared("isBuiltinObj") @Cached PyComplexCheckExactNode complexCheck, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - return complexFromObject(frame, cls, real, imag, inliningTarget, createComplexNode, canBeDoubleNode, asDoubleNode, isComplexType, isResultComplexType, isPrimitiveProfile, complexCheck, - factory, raiseNode); - } - - @Specialization(guards = {"isNoValue(imag)", "!isNoValue(number)", "!isString(number)"}) - Object complexFromObject(VirtualFrame frame, Object cls, Object number, @SuppressWarnings("unused") PNone imag, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode, - @Shared @Cached CanBeDoubleNode canBeDoubleNode, - @Shared("floatAsDouble") @Cached PyFloatAsDoubleNode asDoubleNode, - @Shared("isComplex") @Cached PyComplexCheckExactNode isComplexType, - @Shared("isComplexResult") @Cached PyComplexCheckExactNode isResultComplexType, - @Shared("isPrimitive") @Cached IsBuiltinClassExactProfile isPrimitiveProfile, - @Shared("isBuiltinObj") @Cached PyComplexCheckExactNode complexCheck, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - PComplex value = getComplexNumberFromObject(frame, number, inliningTarget, isComplexType, isResultComplexType, raiseNode); - if (value == null) { - if (canBeDoubleNode.execute(inliningTarget, number)) { - return createComplexNode.execute(inliningTarget, cls, asDoubleNode.execute(frame, inliningTarget, number), 0.0); - } else { - throw raiseFirstArgError(number, raiseNode.get(inliningTarget)); - } - } - if (isPrimitiveProfile.profileClass(inliningTarget, cls, PythonBuiltinClassType.PComplex)) { - if (complexCheck.execute(inliningTarget, value)) { - return value; - } - return factory.createComplex(value.getReal(), value.getImag()); - } - return createComplexNode.execute(inliningTarget, cls, value.getReal(), value.getImag()); - } - - @Specialization - static Object complexFromLongComplex(Object cls, long one, PComplex two, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode) { - return createComplexNode.execute(inliningTarget, cls, one - two.getImag(), two.getReal()); - } - - @Specialization - static Object complexFromPIntComplex(Object cls, PInt one, PComplex two, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode) { - return createComplexNode.execute(inliningTarget, cls, one.doubleValueWithOverflow(inliningTarget) - two.getImag(), two.getReal()); - } - - @Specialization - static Object complexFromDoubleComplex(Object cls, double one, PComplex two, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode) { - return createComplexNode.execute(inliningTarget, cls, one - two.getImag(), two.getReal()); - } - - @Specialization(guards = "!isString(one)") - Object complexFromComplexLong(VirtualFrame frame, Object cls, Object one, long two, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode, - @Shared @Cached CanBeDoubleNode canBeDoubleNode, - @Shared("floatAsDouble") @Cached PyFloatAsDoubleNode asDoubleNode, - @Shared("isComplex") @Cached PyComplexCheckExactNode isComplexType, - @Shared("isComplexResult") @Cached PyComplexCheckExactNode isResultComplexType, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - PComplex value = getComplexNumberFromObject(frame, one, inliningTarget, isComplexType, isResultComplexType, raiseNode); - if (value == null) { - if (canBeDoubleNode.execute(inliningTarget, one)) { - return createComplexNode.execute(inliningTarget, cls, asDoubleNode.execute(frame, inliningTarget, one), two); - } else { - throw raiseFirstArgError(one, raiseNode.get(inliningTarget)); - } - } - return createComplexNode.execute(inliningTarget, cls, value.getReal(), value.getImag() + two); - } - - @Specialization(guards = "!isString(one)") - Object complexFromComplexDouble(VirtualFrame frame, Object cls, Object one, double two, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode, - @Shared @Cached CanBeDoubleNode canBeDoubleNode, - @Shared("floatAsDouble") @Cached PyFloatAsDoubleNode asDoubleNode, - @Shared("isComplex") @Cached PyComplexCheckExactNode isComplexType, - @Shared("isComplexResult") @Cached PyComplexCheckExactNode isResultComplexType, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - PComplex value = getComplexNumberFromObject(frame, one, inliningTarget, isComplexType, isResultComplexType, raiseNode); - if (value == null) { - if (canBeDoubleNode.execute(inliningTarget, one)) { - return createComplexNode.execute(inliningTarget, cls, asDoubleNode.execute(frame, inliningTarget, one), two); - } else { - throw raiseFirstArgError(one, raiseNode.get(inliningTarget)); - } - } - return createComplexNode.execute(inliningTarget, cls, value.getReal(), value.getImag() + two); - } - - @Specialization(guards = "!isString(one)") - Object complexFromComplexPInt(VirtualFrame frame, Object cls, Object one, PInt two, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode, - @Shared @Cached CanBeDoubleNode canBeDoubleNode, - @Shared("floatAsDouble") @Cached PyFloatAsDoubleNode asDoubleNode, - @Shared("isComplex") @Cached PyComplexCheckExactNode isComplexType, - @Shared("isComplexResult") @Cached PyComplexCheckExactNode isResultComplexType, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - PComplex value = getComplexNumberFromObject(frame, one, inliningTarget, isComplexType, isResultComplexType, raiseNode); - if (value == null) { - if (canBeDoubleNode.execute(inliningTarget, one)) { - return createComplexNode.execute(inliningTarget, cls, asDoubleNode.execute(frame, inliningTarget, one), two.doubleValueWithOverflow(this)); - } else { - throw raiseFirstArgError(one, raiseNode.get(inliningTarget)); - } - } - return createComplexNode.execute(inliningTarget, cls, value.getReal(), value.getImag() + two.doubleValueWithOverflow(this)); - } - - @Specialization(guards = "!isString(one)") - Object complexFromComplexComplex(VirtualFrame frame, Object cls, Object one, PComplex two, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode, - @Shared @Cached CanBeDoubleNode canBeDoubleNode, - @Shared("floatAsDouble") @Cached PyFloatAsDoubleNode asDoubleNode, - @Shared("isComplex") @Cached PyComplexCheckExactNode isComplexType, - @Shared("isComplexResult") @Cached PyComplexCheckExactNode isResultComplexType, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - PComplex value = getComplexNumberFromObject(frame, one, inliningTarget, isComplexType, isResultComplexType, raiseNode); - if (value == null) { - if (canBeDoubleNode.execute(inliningTarget, one)) { - return createComplexNode.execute(inliningTarget, cls, asDoubleNode.execute(frame, inliningTarget, one) - two.getImag(), two.getReal()); - } else { - throw raiseFirstArgError(one, raiseNode.get(inliningTarget)); - } - } - return createComplexNode.execute(inliningTarget, cls, value.getReal() - two.getImag(), value.getImag() + two.getReal()); - } - - @Specialization(guards = {"!isString(one)", "!isNoValue(two)", "!isPComplex(two)"}) - @SuppressWarnings("truffle-static-method") - Object complexFromComplexObject(VirtualFrame frame, Object cls, Object one, Object two, - @Bind("this") Node inliningTarget, - @Shared @Cached CreateComplexNode createComplexNode, - @Shared @Cached CanBeDoubleNode canBeDoubleNode, - @Shared("floatAsDouble") @Cached PyFloatAsDoubleNode asDoubleNode, - @Shared("isComplex") @Cached PyComplexCheckExactNode isComplexType, - @Shared("isComplexResult") @Cached PyComplexCheckExactNode isResultComplexType, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - PComplex oneValue = getComplexNumberFromObject(frame, one, inliningTarget, isComplexType, isResultComplexType, raiseNode); - if (canBeDoubleNode.execute(inliningTarget, two)) { - double twoValue = asDoubleNode.execute(frame, inliningTarget, two); - if (oneValue == null) { - if (canBeDoubleNode.execute(inliningTarget, one)) { - return createComplexNode.execute(inliningTarget, cls, asDoubleNode.execute(frame, inliningTarget, one), twoValue); - } else { - throw raiseFirstArgError(one, raiseNode.get(inliningTarget)); - } - } - return createComplexNode.execute(inliningTarget, cls, oneValue.getReal(), oneValue.getImag() + twoValue); - } else { - throw raiseSecondArgError(two, raiseNode.get(inliningTarget)); - } - } - - @Specialization - Object complexFromString(VirtualFrame frame, Object cls, TruffleString real, Object imaginary, - @Bind("this") Node inliningTarget, - @Cached TruffleString.ToJavaStringNode toJavaStringNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - if (imaginary != PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.COMPLEX_CANT_TAKE_ARG); - } - return convertStringToComplex(frame, inliningTarget, toJavaStringNode.execute(real), cls, real, raiseNode); - } - - @Specialization - Object complexFromString(VirtualFrame frame, Object cls, PString real, Object imaginary, - @Bind("this") Node inliningTarget, - @Cached CastToJavaStringNode castToStringNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - if (imaginary != PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.COMPLEX_CANT_TAKE_ARG); - } - return convertStringToComplex(frame, inliningTarget, castToStringNode.execute(real), cls, real, raiseNode); - } - - private Object callComplex(VirtualFrame frame, Object object) { - if (callComplexNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - callComplexNode = insert(LookupAndCallUnaryNode.create(T___COMPLEX__)); - } - return callComplexNode.executeObject(frame, object); - } - - private WarnNode getWarnNode() { - if (warnNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - warnNode = insert(WarnNode.create()); - } - return warnNode; - } - - private static PException raiseFirstArgError(Object x, PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.ARG_MUST_BE_STRING_OR_NUMBER, "complex() first", x); - } - - private static PException raiseSecondArgError(Object x, PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.ARG_MUST_BE_NUMBER, "complex() second", x); - } - - private PComplex getComplexNumberFromObject(VirtualFrame frame, Object object, Node inliningTarget, - PyComplexCheckExactNode isComplexType, PyComplexCheckExactNode isResultComplexType, PRaiseNode.Lazy raiseNode) { - if (isComplexType.execute(inliningTarget, object)) { - return (PComplex) object; - } else { - Object result = callComplex(frame, object); - if (result instanceof PComplex) { - if (!isResultComplexType.execute(inliningTarget, result)) { - getWarnNode().warnFormat(frame, null, PythonBuiltinClassType.DeprecationWarning, 1, - ErrorMessages.WARN_P_RETURNED_NON_P, - object, "__complex__", "complex", result, "complex"); - } - return (PComplex) result; - } else if (result != PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.COMPLEX_RETURNED_NON_COMPLEX, result); - } - if (object instanceof PComplex) { - // the class extending PComplex but doesn't have __complex__ method - return (PComplex) object; - } - return null; - } - } - - @Fallback - @SuppressWarnings("unused") - static Object complexGeneric(Object cls, Object realObj, Object imaginaryObj, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "complex.__new__(X): X", cls); - } - - // Adapted from CPython's complex_subtype_from_string - private Object convertStringToComplex(VirtualFrame frame, Node inliningTarget, String src, Object cls, Object origObj, PRaiseNode.Lazy raiseNode) { - String str = FloatUtils.removeUnicodeAndUnderscores(src); - if (str == null) { - if (callReprNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - callReprNode = insert(LookupAndCallUnaryNode.create(SpecialMethodSlot.Repr)); - } - Object strStr = callReprNode.executeObject(frame, origObj); - if (PGuards.isString(strStr)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.COULD_NOT_CONVERT_STRING_TO_COMPLEX, strStr); - } else { - // During the formatting of "ValueError: invalid literal ..." exception, - // CPython attempts to raise "TypeError: __repr__ returned non-string", - // which gets later overwitten with the original "ValueError", - // but without any message (since the message formatting failed) - throw raiseNode.get(inliningTarget).raise(ValueError); - } - } - Object c = convertStringToComplexOrNull(str, cls); - if (c == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.COMPLEX_ARG_IS_MALFORMED_STR); - } - return c; - } - - // Adapted from CPython's complex_from_string_inner - @TruffleBoundary - private Object convertStringToComplexOrNull(String str, Object cls) { - int len = str.length(); - - // position on first nonblank - int i = FloatUtils.skipAsciiWhitespace(str, 0, len); - - boolean gotBracket; - if (i < len && str.charAt(i) == '(') { - // Skip over possible bracket from repr(). - gotBracket = true; - i = FloatUtils.skipAsciiWhitespace(str, i + 1, len); - } else { - gotBracket = false; - } - - double x, y; - boolean expectJ; - - // first look for forms starting with - FloatUtils.StringToDoubleResult res1 = FloatUtils.stringToDouble(str, i, len); - if (res1 != null) { - // all 4 forms starting with land here - i = res1.position; - char ch = i < len ? str.charAt(i) : '\0'; - if (ch == '+' || ch == '-') { - // j | j - x = res1.value; - FloatUtils.StringToDoubleResult res2 = FloatUtils.stringToDouble(str, i, len); - if (res2 != null) { - // j - y = res2.value; - i = res2.position; - } else { - // j - y = ch == '+' ? 1.0 : -1.0; - i++; - } - expectJ = true; - } else if (ch == 'j' || ch == 'J') { - // j - i++; - y = res1.value; - x = 0; - expectJ = false; - } else { - // - x = res1.value; - y = 0; - expectJ = false; - } - } else { - // not starting with ; must be j or j - char ch = i < len ? str.charAt(i) : '\0'; - if (ch == '+' || ch == '-') { - // j - y = ch == '+' ? 1.0 : -1.0; - i++; - } else { - // j - y = 1.0; - } - x = 0; - expectJ = true; - } - - if (expectJ) { - char ch = i < len ? str.charAt(i) : '\0'; - if (!(ch == 'j' || ch == 'J')) { - return null; - } - i++; - } - - // trailing whitespace and closing bracket - i = FloatUtils.skipAsciiWhitespace(str, i, len); - if (gotBracket) { - // if there was an opening parenthesis, then the corresponding - // closing parenthesis should be right here - if (i >= len || str.charAt(i) != ')') { - return null; - } - i = FloatUtils.skipAsciiWhitespace(str, i + 1, len); - } - - // we should now be at the end of the string - if (i != len) { - return null; - } - return CreateComplexNode.executeUncached(cls, x, y); - } - } - - // dict(**kwarg) - // dict(mapping, **kwarg) - // dict(iterable, **kwarg) - @Builtin(name = J_DICT, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PDict, doc = """ - dict() -> new empty dictionary - dict(mapping) -> new dictionary initialized from a mapping object's - (key, value) pairs - dict(iterable) -> new dictionary initialized as if via: - d = {} - for k, v in iterable: - d[k] = v - dict(**kwargs) -> new dictionary initialized with the name=value pairs - in the keyword argument list. For example: dict(one=1, two=2)""") - @GenerateNodeFactory - public abstract static class DictionaryNode extends PythonBuiltinNode { - @Specialization(guards = "isBuiltinDict(cls)") - @SuppressWarnings("unused") - static PDict builtinDict(Object cls, Object[] args, PKeyword[] keywordArgs, - @Shared @Cached PythonObjectFactory factory) { - return factory.createDict(); - } - - @Specialization(replaces = "builtinDict") - @SuppressWarnings("unused") - static PDict dict(Object cls, Object[] args, PKeyword[] keywordArgs, - @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile orderedProfile, - @Cached IsSubtypeNode isSubtypeNode, - @Shared @Cached PythonObjectFactory factory) { - if (orderedProfile.profile(inliningTarget, isSubtypeNode.execute(cls, PythonBuiltinClassType.POrderedDict))) { - return factory.createOrderedDict(cls); - } - return factory.createDict(cls); - } - - protected static boolean isBuiltinDict(Object cls) { - return cls == PythonBuiltinClassType.PDict; - } - } - - // enumerate(iterable, start=0) - @Builtin(name = J_ENUMERATE, minNumOfPositionalArgs = 2, parameterNames = {"cls", "iterable", "start"}, constructsClass = PythonBuiltinClassType.PEnumerate, doc = """ - Return an enumerate object. - - iterable - an object supporting iteration - - The enumerate object yields pairs containing a count (from start, which - defaults to zero) and a value yielded by the iterable argument. - - enumerate is useful for obtaining an indexed list: - (0, seq[0]), (1, seq[1]), (2, seq[2]), ...""") - @GenerateNodeFactory - public abstract static class EnumerateNode extends PythonBuiltinNode { - - @Specialization - static PEnumerate doNone(VirtualFrame frame, Object cls, Object iterable, @SuppressWarnings("unused") PNone keywordArg, - @Bind("this") Node inliningTarget, - @Shared("getIter") @Cached PyObjectGetIter getIter, - @Shared @Cached PythonObjectFactory factory) { - return factory.createEnumerate(cls, getIter.execute(frame, inliningTarget, iterable), 0); - } - - @Specialization - static PEnumerate doInt(VirtualFrame frame, Object cls, Object iterable, int start, - @Bind("this") Node inliningTarget, - @Shared("getIter") @Cached PyObjectGetIter getIter, - @Shared @Cached PythonObjectFactory factory) { - return factory.createEnumerate(cls, getIter.execute(frame, inliningTarget, iterable), start); - } - - @Specialization - static PEnumerate doLong(VirtualFrame frame, Object cls, Object iterable, long start, - @Bind("this") Node inliningTarget, - @Shared("getIter") @Cached PyObjectGetIter getIter, - @Shared @Cached PythonObjectFactory factory) { - return factory.createEnumerate(cls, getIter.execute(frame, inliningTarget, iterable), start); - } - - @Specialization - static PEnumerate doPInt(VirtualFrame frame, Object cls, Object iterable, PInt start, - @Bind("this") Node inliningTarget, - @Shared("getIter") @Cached PyObjectGetIter getIter, - @Shared @Cached PythonObjectFactory factory) { - return factory.createEnumerate(cls, getIter.execute(frame, inliningTarget, iterable), start); - } - - static boolean isIntegerIndex(Object idx) { - return isInteger(idx) || idx instanceof PInt; - } - - @Specialization(guards = "!isIntegerIndex(start)") - static void enumerate(@SuppressWarnings("unused") Object cls, @SuppressWarnings("unused") Object iterable, Object start, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, start); - } - } - - // reversed(seq) - @Builtin(name = J_REVERSED, minNumOfPositionalArgs = 2, constructsClass = PythonBuiltinClassType.PReverseIterator, doc = "Return a reverse iterator over the values of the given sequence.") - @GenerateNodeFactory - @ImportStatic(SpecialMethodSlot.class) - public abstract static class ReversedNode extends PythonBuiltinNode { - - @Specialization - static PythonObject reversed(@SuppressWarnings("unused") Object cls, PIntRange range, - @Bind("this") Node inliningTarget, - @Cached InlinedBranchProfile overflowProfile, - @Shared @Cached PythonObjectFactory factory) { - int lstart = range.getIntStart(); - int lstep = range.getIntStep(); - int ulen = range.getIntLength(); - try { - int new_stop = subtractExact(lstart, lstep); - int new_start = addExact(new_stop, multiplyExact(ulen, lstep)); - return factory.createIntRangeIterator(new_start, new_stop, negateExact(lstep), ulen); - } catch (OverflowException e) { - overflowProfile.enter(inliningTarget); - return handleOverflow(lstart, lstep, ulen, PythonContext.get(inliningTarget).factory()); - } - } - - @TruffleBoundary - private static PBigRangeIterator handleOverflow(int lstart, int lstep, int ulen, PythonObjectSlowPathFactory factory) { - BigInteger bstart = BigInteger.valueOf(lstart); - BigInteger bstep = BigInteger.valueOf(lstep); - BigInteger blen = BigInteger.valueOf(ulen); - BigInteger new_stop = bstart.subtract(bstep); - BigInteger new_start = new_stop.add(blen.multiply(bstep)); - - return factory.createBigRangeIterator(new_start, new_stop, bstep.negate(), blen); - } - - @Specialization - @TruffleBoundary - PythonObject reversed(@SuppressWarnings("unused") Object cls, PBigRange range) { - BigInteger lstart = range.getBigIntegerStart(); - BigInteger lstep = range.getBigIntegerStep(); - BigInteger ulen = range.getBigIntegerLength(); - - BigInteger new_stop = lstart.subtract(lstep); - BigInteger new_start = new_stop.add(ulen.multiply(lstep)); - - return getContext().factory().createBigRangeIterator(new_start, new_stop, lstep.negate(), ulen); - } - - @Specialization - static PythonObject reversed(Object cls, PString value, - @Bind("this") Node inliningTarget, - @Cached CastToTruffleStringNode castToStringNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createStringReverseIterator(cls, castToStringNode.execute(inliningTarget, value)); - } - - @Specialization - static PythonObject reversed(Object cls, TruffleString value, - @Shared @Cached PythonObjectFactory factory) { - return factory.createStringReverseIterator(cls, value); - } - - @Specialization(guards = {"!isString(sequence)", "!isPRange(sequence)"}) - static Object reversed(VirtualFrame frame, Object cls, Object sequence, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached("create(Reversed)") LookupSpecialMethodSlotNode lookupReversed, - @Cached CallUnaryMethodNode callReversed, - @Cached PySequenceSizeNode pySequenceSizeNode, - @Cached InlinedConditionProfile noReversedProfile, - @Cached PySequenceCheckNode pySequenceCheck, - @Shared @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - Object sequenceKlass = getClassNode.execute(inliningTarget, sequence); - Object reversed = lookupReversed.execute(frame, sequenceKlass, sequence); - if (noReversedProfile.profile(inliningTarget, reversed == PNone.NO_VALUE)) { - if (!pySequenceCheck.execute(inliningTarget, sequence)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.OBJ_ISNT_REVERSIBLE, sequence); - } else { - int lengthHint = pySequenceSizeNode.execute(frame, inliningTarget, sequence); - return factory.createSequenceReverseIterator(cls, sequence, lengthHint); - } - } else { - return callReversed.executeObject(frame, reversed, sequence); - } - } - } - - // float([x]) - @Builtin(name = J_FLOAT, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, constructsClass = PythonBuiltinClassType.PFloat, doc = "Convert a string or number to a floating point number, if possible.") - @GenerateNodeFactory - abstract static class FloatNode extends PythonBinaryBuiltinNode { - - @Child NonPrimitiveFloatNode nonPrimitiveFloatNode; - - @Specialization - Object doIt(VirtualFrame frame, Object cls, Object arg, - @Bind("this") Node inliningTarget, - @Cached IsBuiltinClassExactProfile isPrimitiveFloatProfile, - @Cached PrimitiveFloatNode primitiveFloatNode, - @Cached NeedsNativeAllocationNode needsNativeAllocationNode) { - if (isPrimitiveFloat(inliningTarget, cls, isPrimitiveFloatProfile)) { - return primitiveFloatNode.execute(frame, inliningTarget, arg); - } else { - boolean needsNativeAllocation = needsNativeAllocationNode.execute(inliningTarget, cls); - if (nonPrimitiveFloatNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - nonPrimitiveFloatNode = insert(NonPrimitiveFloatNodeGen.create()); - } - return nonPrimitiveFloatNode.execute(frame, cls, arg, needsNativeAllocation); - } - } - - @GenerateCached(false) - @GenerateInline - @ImportStatic(PGuards.class) - abstract static class PrimitiveFloatNode extends Node { - abstract double execute(VirtualFrame frame, Node inliningTarget, Object arg); - - @Specialization - static double floatFromDouble(double arg) { - return arg; - } - - @Specialization - static double floatFromInt(int arg) { - return arg; - } - - @Specialization - static double floatFromLong(long arg) { - return arg; - } - - @Specialization - static double floatFromBoolean(boolean arg) { - return arg ? 1d : 0d; - } - - @Specialization(guards = "isNoValue(obj)") - static double floatFromNoValue(@SuppressWarnings("unused") PNone obj) { - return 0.0; - } - - @Fallback - @InliningCutoff - static double floatFromObject(VirtualFrame frame, Node inliningTarget, Object obj, - @Cached PyUnicodeCheckExactNode stringCheck, - @Cached PyFloatFromString fromString, - @Cached PyNumberFloatNode pyNumberFloat) { - if (stringCheck.execute(inliningTarget, obj)) { - return fromString.execute(frame, inliningTarget, obj); - } - return pyNumberFloat.execute(frame, inliningTarget, obj); - } - } - - @ImportStatic(PGuards.class) - @GenerateInline(false) // intentionally lazy - abstract static class NonPrimitiveFloatNode extends Node { - abstract Object execute(VirtualFrame frame, Object cls, Object arg, boolean needsNativeAllocation); - - @Specialization(guards = {"!needsNativeAllocation", "isNoValue(obj)"}) - @InliningCutoff - Object floatFromNoneManagedSubclass(Object cls, PNone obj, - @SuppressWarnings("unused") boolean needsNativeAllocation, - @Shared @Cached PythonObjectFactory factory) { - return factory.createFloat(cls, PrimitiveFloatNode.floatFromNoValue(obj)); - } - - @Specialization(guards = "!needsNativeAllocation") - @InliningCutoff - Object floatFromObjectManagedSubclass(VirtualFrame frame, Object cls, Object obj, @SuppressWarnings("unused") boolean needsNativeAllocation, - @Bind("this") @SuppressWarnings("unused") Node inliningTarget, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PrimitiveFloatNode recursiveCallNode) { - return factory.createFloat(cls, recursiveCallNode.execute(frame, inliningTarget, obj)); - } - - // logic similar to float_subtype_new(PyTypeObject *type, PyObject *x) from CPython - // floatobject.c we have to first create a temporary float, then fill it into - // a natively allocated subtype structure - @Specialization(guards = {"needsNativeAllocation", // - "isSubtypeOfFloat(frame, isSubtype, cls)"}, limit = "1") - @InliningCutoff - static Object floatFromObjectNativeSubclass(VirtualFrame frame, Object cls, Object obj, @SuppressWarnings("unused") boolean needsNativeAllocation, - @Bind("this") @SuppressWarnings("unused") Node inliningTarget, - @Cached @SuppressWarnings("unused") IsSubtypeNode isSubtype, - @Cached CExtNodes.FloatSubtypeNew subtypeNew, - @Shared @Cached PrimitiveFloatNode recursiveCallNode) { - return subtypeNew.call(cls, recursiveCallNode.execute(frame, inliningTarget, obj)); - } - - protected static boolean isSubtypeOfFloat(VirtualFrame frame, IsSubtypeNode isSubtypeNode, Object cls) { - return isSubtypeNode.execute(frame, cls, PythonBuiltinClassType.PFloat); - } - } - - protected static boolean isPrimitiveFloat(Node inliningTarget, Object cls, IsBuiltinClassExactProfile isPrimitiveProfile) { - return isPrimitiveProfile.profileClass(inliningTarget, cls, PythonBuiltinClassType.PFloat); - } - } - - // frozenset([iterable]) - @Builtin(name = J_FROZENSET, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, constructsClass = PythonBuiltinClassType.PFrozenSet, doc = """ - frozenset() -> empty frozenset object - frozenset(iterable) -> frozenset object - - Build an immutable unordered collection of unique elements.""") - @GenerateNodeFactory - public abstract static class FrozenSetNode extends PythonBinaryBuiltinNode { - - @Specialization(guards = "isNoValue(arg)") - static PFrozenSet frozensetEmpty(Object cls, @SuppressWarnings("unused") PNone arg, - @Shared @Cached PythonObjectFactory factory) { - return factory.createFrozenSet(cls); - } - - @Specialization(guards = "isBuiltinClass.profileIsAnyBuiltinClass(inliningTarget, cls)") - static PFrozenSet frozensetIdentity(@SuppressWarnings("unused") Object cls, PFrozenSet arg, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @Shared("isBuiltinProfile") @SuppressWarnings("unused") @Cached IsAnyBuiltinClassProfile isBuiltinClass) { - return arg; - } - - @Specialization(guards = "!isBuiltinClass.profileIsAnyBuiltinClass(inliningTarget, cls)") - static PFrozenSet subFrozensetIdentity(Object cls, PFrozenSet arg, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @Shared("isBuiltinProfile") @SuppressWarnings("unused") @Cached IsAnyBuiltinClassProfile isBuiltinClass, - @Shared @Cached PythonObjectFactory factory) { - return factory.createFrozenSet(cls, arg.getDictStorage()); - } - - @Specialization(guards = {"!isNoValue(iterable)", "!isPFrozenSet(iterable)"}) - static PFrozenSet frozensetIterable(VirtualFrame frame, Object cls, Object iterable, - @Bind("this") Node inliningTarget, - @Cached HashingCollectionNodes.GetClonedHashingStorageNode getHashingStorageNode, - @Shared @Cached PythonObjectFactory factory) { - HashingStorage storage = getHashingStorageNode.doNoValue(frame, inliningTarget, iterable); - return factory.createFrozenSet(cls, storage); - } - } - - // int(x=0) - // int(x, base=10) - @Builtin(name = J_INT, minNumOfPositionalArgs = 1, parameterNames = {"cls", "x", "base"}, numOfPositionalOnlyArgs = 2, constructsClass = PythonBuiltinClassType.PInt, doc = """ - int([x]) -> integer - int(x, base=10) -> integer - - Convert a number or string to an integer, or return 0 if no arguments - are given. If x is a number, return x.__int__(). For floating point - numbers, this truncates towards zero. - - If x is not a number or if base is given, then x must be a string, - bytes, or bytearray instance representing an integer literal in the - given base. The literal can be preceded by '+' or '-' and be surrounded - by whitespace. The base defaults to 10. Valid bases are 0 and 2-36. - Base 0 means to interpret the base from the string as an integer literal.""") - @GenerateNodeFactory - public abstract static class IntNode extends PythonTernaryBuiltinNode { - @Child private BytesNodes.ToBytesNode toByteArrayNode; - @Child private LookupAndCallUnaryNode callIndexNode; - @Child private LookupAndCallUnaryNode callTruncNode; - @Child private LookupAndCallUnaryNode callReprNode; - @Child private LookupAndCallUnaryNode callIntNode; - @Child private WarnNode warnNode; - - public final Object executeWith(VirtualFrame frame, Object number) { - return execute(frame, PythonBuiltinClassType.PInt, number, 10); - } - - public final Object executeWith(VirtualFrame frame, Object number, Object base) { - return execute(frame, PythonBuiltinClassType.PInt, number, base); - } - - @TruffleBoundary - private static Object stringToIntInternal(String num, int base, PythonContext context) { - try { - BigInteger bi = asciiToBigInteger(num, base, context); - if (bi == null) { - return null; - } - if (bi.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) > 0 || bi.compareTo(BigInteger.valueOf(Integer.MIN_VALUE)) < 0) { - return bi; - } else { - return bi.intValue(); - } - } catch (NumberFormatException e) { - return null; - } - } - - private Object stringToInt(VirtualFrame frame, Object cls, String number, int base, Object origObj, - Node inliningTarget, IsBuiltinClassExactProfile isPrimitiveIntProfile, - InlinedBranchProfile notSimpleDecimalLiteralProfile, InlinedBranchProfile invalidValueProfile, - InlinedBranchProfile bigIntegerProfile, InlinedBranchProfile primitiveIntProfile, InlinedBranchProfile fullIntProfile, - PythonObjectFactory factory, PRaiseNode.Lazy raiseNode) { - if (base == 0 || base == 10) { - Object value = parseSimpleDecimalLiteral(number, 0, number.length()); - if (value != null) { - return createInt(cls, value, inliningTarget, isPrimitiveIntProfile, bigIntegerProfile, primitiveIntProfile, fullIntProfile, factory); - } - } - notSimpleDecimalLiteralProfile.enter(inliningTarget); - Object value = stringToIntInternal(number, base, getContext()); - if (value == null) { - invalidValueProfile.enter(inliningTarget); - if (callReprNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - callReprNode = insert(LookupAndCallUnaryNode.create(SpecialMethodSlot.Repr)); - } - Object str = callReprNode.executeObject(frame, origObj); - if (PGuards.isString(str)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.INVALID_LITERAL_FOR_INT_WITH_BASE, base, str); - } else { - // During the formatting of "ValueError: invalid literal ..." exception, - // CPython attempts to raise "TypeError: __repr__ returned non-string", - // which gets later overwitten with the original "ValueError", - // but without any message (since the message formatting failed) - throw raiseNode.get(inliningTarget).raise(ValueError); - } - } - return createInt(cls, value, inliningTarget, isPrimitiveIntProfile, bigIntegerProfile, primitiveIntProfile, fullIntProfile, factory); - } - - private static Object createInt(Object cls, Object value, Node inliningTarget, IsBuiltinClassExactProfile isPrimitiveIntProfile, - InlinedBranchProfile bigIntegerProfile, InlinedBranchProfile primitiveIntProfile, InlinedBranchProfile fullIntProfile, - PythonObjectFactory factory) { - if (value instanceof BigInteger) { - bigIntegerProfile.enter(inliningTarget); - return factory.createInt(cls, (BigInteger) value); - } else if (isPrimitiveInt(inliningTarget, cls, isPrimitiveIntProfile)) { - primitiveIntProfile.enter(inliningTarget); - return value; - } else { - fullIntProfile.enter(inliningTarget); - if (value instanceof Integer) { - return factory.createInt(cls, (Integer) value); - } else if (value instanceof Long) { - return factory.createInt(cls, (Long) value); - } else if (value instanceof Boolean) { - return factory.createInt(cls, (Boolean) value ? 1 : 0); - } else if (value instanceof PInt) { - return factory.createInt(cls, ((PInt) value).getValue()); - } - } - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("Unexpected type"); - } - - private static void checkBase(int base, Node inliningTarget, InlinedConditionProfile invalidBase, PRaiseNode.Lazy raiseNode) { - if (invalidBase.profile(inliningTarget, (base < 2 || base > 36) && base != 0)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.BASE_OUT_OF_RANGE_FOR_INT); - } - } - - private static void checkBase(PInt base, Node inliningTarget, InlinedConditionProfile invalidBase, PRaiseNode.Lazy raiseNode) { - int ibase; - try { - ibase = base.intValueExact(); - } catch (OverflowException e) { - // this should just trigger the error - ibase = 1; - } - checkBase(ibase, inliningTarget, invalidBase, raiseNode); - } - - // Adapted from Jython - private static BigInteger asciiToBigInteger(String str, int possibleBase, PythonContext context) throws NumberFormatException { - CompilerAsserts.neverPartOfCompilation(); - int base = possibleBase; - int b = 0; - int e = str.length(); - - while (b < e && Character.isWhitespace(str.charAt(b))) { - b++; - } - - while (e > b && Character.isWhitespace(str.charAt(e - 1))) { - e--; - } - - boolean acceptUnderscore = false; - boolean raiseIfNotZero = false; - char sign = 0; - if (b < e) { - sign = str.charAt(b); - if (sign == '-' || sign == '+') { - b++; - } - - if (base == 16) { - if (str.charAt(b) == '0') { - if (b < e - 1 && Character.toUpperCase(str.charAt(b + 1)) == 'X') { - b += 2; - acceptUnderscore = true; - } - } - } else if (base == 0) { - if (str.charAt(b) == '0') { - if (b < e - 1 && Character.toUpperCase(str.charAt(b + 1)) == 'X') { - base = 16; - b += 2; - acceptUnderscore = true; - } else if (b < e - 1 && Character.toUpperCase(str.charAt(b + 1)) == 'O') { - base = 8; - b += 2; - acceptUnderscore = true; - } else if (b < e - 1 && Character.toUpperCase(str.charAt(b + 1)) == 'B') { - base = 2; - b += 2; - acceptUnderscore = true; - } else { - raiseIfNotZero = true; - } - } - } else if (base == 8) { - if (b < e - 1 && Character.toUpperCase(str.charAt(b + 1)) == 'O') { - b += 2; - acceptUnderscore = true; - } - } else if (base == 2) { - if (b < e - 1 && Character.toUpperCase(str.charAt(b + 1)) == 'B') { - b += 2; - acceptUnderscore = true; - } - } - } - - if (base == 0) { - base = 10; - } - - // reject invalid characters without going to BigInteger - for (int i = b; i < e; i++) { - char c = str.charAt(i); - if (c == '_') { - if (!acceptUnderscore || i == e - 1) { - throw new NumberFormatException("Illegal underscore in int literal"); - } else { - acceptUnderscore = false; - } - } else { - acceptUnderscore = true; - if (Character.digit(c, base) == -1) { - // invalid char - return null; - } - } - } - - String s = str; - if (b > 0 || e < str.length()) { - s = str.substring(b, e); - } - s = s.replace("_", ""); - - checkMaxDigits(context, s.length(), base); - - BigInteger bi; - if (sign == '-') { - bi = new BigInteger("-" + s, base); - } else { - bi = new BigInteger(s, base); - } - - if (raiseIfNotZero && !bi.equals(BigInteger.ZERO)) { - throw new NumberFormatException("Obsolete octal int literal"); - } - return bi; - } - - private static void checkMaxDigits(PythonContext context, int digits, int base) { - if (digits > SysModuleBuiltins.INT_MAX_STR_DIGITS_THRESHOLD && Integer.bitCount(base) != 1) { - int maxDigits = context.getIntMaxStrDigits(); - if (maxDigits > 0 && digits > maxDigits) { - throw PRaiseNode.getUncached().raise(ValueError, ErrorMessages.EXCEEDS_THE_LIMIT_FOR_INTEGER_STRING_CONVERSION_D, maxDigits, digits); - } - } - } - - /** - * Fast path parser of integer literals. Accepts only a subset of allowed literals - no - * underscores, no leading zeros, no plus sign, no spaces, only ascii digits and the result - * must be small enough to fit into long. - * - * @param arg the string to parse - * @return parsed integer, long or null if the literal is not simple enough - */ - public static Object parseSimpleDecimalLiteral(String arg, int offset, int remaining) { - if (remaining <= 0) { - return null; - } - int start = arg.charAt(offset) == '-' ? 1 : 0; - if (remaining <= start || remaining > 18 + start) { - return null; - } - if (arg.charAt(start + offset) == '0') { - if (remaining > start + 1) { - return null; - } - return 0; - } - long value = 0; - for (int i = start; i < remaining; i++) { - char c = arg.charAt(i + offset); - if (c < '0' || c > '9') { - return null; - } - value = value * 10 + (c - '0'); - } - if (start != 0) { - value = -value; - } - if (value >= Integer.MIN_VALUE && value <= Integer.MAX_VALUE) { - return (int) value; - } - return value; - } - - protected static boolean isPrimitiveInt(Node inliningTarget, Object cls, IsBuiltinClassExactProfile profile) { - return profile.profileClass(inliningTarget, cls, PythonBuiltinClassType.PInt); - } - - @Specialization - static Object parseInt(Object cls, boolean arg, @SuppressWarnings("unused") PNone base, - @Bind("this") Node inliningTarget, - @Shared("primitiveInt") @Cached IsBuiltinClassExactProfile isPrimitiveIntProfile, - @Shared @Cached PythonObjectFactory factory) { - if (isPrimitiveInt(inliningTarget, cls, isPrimitiveIntProfile)) { - return arg ? 1 : 0; - } else { - return factory.createInt(cls, arg ? 1 : 0); - } - } - - @Specialization(guards = "isNoValue(base)") - static Object createInt(Object cls, int arg, @SuppressWarnings("unused") PNone base, - @Bind("this") Node inliningTarget, - @Shared("primitiveInt") @Cached IsBuiltinClassExactProfile isPrimitiveIntProfile, - // Dummy argument just so that it can be @Shared in the other - // specialization, which generated better code for interpreter - @SuppressWarnings("unused") @Shared @Cached InlinedConditionProfile isIntProfile, - @Shared @Cached PythonObjectFactory factory) { - if (isPrimitiveInt(inliningTarget, cls, isPrimitiveIntProfile)) { - return arg; - } - return factory.createInt(cls, arg); - } - - @Specialization(guards = "isNoValue(base)") - static Object createInt(Object cls, long arg, @SuppressWarnings("unused") PNone base, - @Bind("this") Node inliningTarget, - @Shared("primitiveInt") @Cached IsBuiltinClassExactProfile isPrimitiveIntProfile, - @Shared @Cached InlinedConditionProfile isIntProfile, - @Shared @Cached PythonObjectFactory factory) { - if (isPrimitiveInt(inliningTarget, cls, isPrimitiveIntProfile)) { - int intValue = (int) arg; - if (isIntProfile.profile(inliningTarget, intValue == arg)) { - return intValue; - } else { - return arg; - } - } - return factory.createInt(cls, arg); - } - - @Specialization(guards = "isNoValue(base)") - static Object createInt(Object cls, double arg, @SuppressWarnings("unused") PNone base, - @Bind("this") Node inliningTarget, - @Exclusive @Cached IsBuiltinClassExactProfile isPrimitiveIntProfile, - @Cached PyLongFromDoubleNode pyLongFromDoubleNode, - @Exclusive @Cached InlinedBranchProfile bigIntegerProfile, - @Exclusive @Cached InlinedBranchProfile primitiveIntProfile, - @Exclusive @Cached InlinedBranchProfile fullIntProfile, - @Shared @Cached PythonObjectFactory factory) { - Object result = pyLongFromDoubleNode.execute(inliningTarget, arg); - return createInt(cls, result, inliningTarget, isPrimitiveIntProfile, bigIntegerProfile, primitiveIntProfile, fullIntProfile, factory); - } - - // String - - @Specialization - @Megamorphic - @InliningCutoff - @SuppressWarnings("truffle-static-method") - Object parseTStringError(VirtualFrame frame, Object cls, TruffleString number, Object base, - @Bind("this") Node inliningTarget, - @Exclusive @Cached InlinedBranchProfile baseIsNoneBranchProfile, - @Exclusive @Cached InlinedBranchProfile baseIsIntBranchProfile, - @Exclusive @Cached IsBuiltinClassExactProfile isPrimitiveIntProfile, - @Exclusive @Cached PyNumberAsSizeNode asSizeNode, - @Exclusive @Cached TruffleString.ToJavaStringNode toJavaStringNode, - @Exclusive @Cached InlinedConditionProfile invalidBase, - @Exclusive @Cached InlinedBranchProfile notSimpleDecimalLiteralProfile, - @Exclusive @Cached InlinedBranchProfile invalidValueProfile, - @Exclusive @Cached InlinedBranchProfile bigIntegerProfile, - @Exclusive @Cached InlinedBranchProfile primitiveIntProfile, - @Exclusive @Cached InlinedBranchProfile fullIntProfile, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - int intBase; - if (PGuards.isNoValue(base)) { - baseIsNoneBranchProfile.enter(inliningTarget); - intBase = 10; - } else if (base instanceof Integer) { - baseIsIntBranchProfile.enter(inliningTarget); - intBase = (int) base; - } else { - intBase = asSizeNode.executeLossy(frame, inliningTarget, base); - } - checkBase(intBase, inliningTarget, invalidBase, raiseNode); - return stringToInt(frame, cls, toJavaStringNode.execute(number), intBase, number, - inliningTarget, isPrimitiveIntProfile, notSimpleDecimalLiteralProfile, invalidValueProfile, - bigIntegerProfile, primitiveIntProfile, fullIntProfile, factory, raiseNode); - } - - // PIBytesLike - @Specialization(guards = "isNoValue(base) || isInt(base)") - @InliningCutoff - @Megamorphic - Object parseBytesError(VirtualFrame frame, Object cls, PBytesLike arg, Object base, - @Bind("this") Node inliningTarget, - @Exclusive @Cached InlinedConditionProfile baseIsNoneBranchProfile, - @Exclusive @Cached IsBuiltinClassExactProfile isPrimitiveIntProfile, - @Exclusive @Cached InlinedConditionProfile invalidBase, - @Exclusive @Cached InlinedBranchProfile notSimpleDecimalLiteralProfile, - @Exclusive @Cached InlinedBranchProfile invalidValueProfile, - @Exclusive @Cached InlinedBranchProfile bigIntegerProfile, - @Exclusive @Cached InlinedBranchProfile primitiveIntProfile, - @Exclusive @Cached InlinedBranchProfile fullIntProfile, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - int intBase; - if (baseIsNoneBranchProfile.profile(inliningTarget, PGuards.isNoValue(base))) { - intBase = 10; - } else { - intBase = (int) base; - checkBase(intBase, inliningTarget, invalidBase, raiseNode); - } - return stringToInt(frame, cls, toString(arg), intBase, arg, inliningTarget, - isPrimitiveIntProfile, notSimpleDecimalLiteralProfile, invalidValueProfile, bigIntegerProfile, - primitiveIntProfile, fullIntProfile, factory, raiseNode); - } - - // PString - static boolean isNoValueOrIntOrPInt(Object x) { - return isNoValue(x) || x instanceof Integer || x instanceof PInt; - } - - @Specialization(guards = "isNoValueOrIntOrPInt(base)") - @InliningCutoff - @Megamorphic - @SuppressWarnings("truffle-static-method") - Object parsePString(VirtualFrame frame, Object cls, PString arg, Object base, - @Bind("this") Node inliningTarget, - @Exclusive @Cached IsBuiltinClassExactProfile isPrimitiveIntProfile, - @Exclusive @Cached CastToJavaStringNode castToStringNode, - @Exclusive @Cached InlinedConditionProfile invalidBase, - @Exclusive @Cached InlinedBranchProfile notSimpleDecimalLiteralProfile, - @Exclusive @Cached InlinedBranchProfile invalidValueProfile, - @Exclusive @Cached InlinedBranchProfile bigIntegerProfile, - @Exclusive @Cached InlinedBranchProfile primitiveIntProfile, - @Exclusive @Cached InlinedBranchProfile fullIntProfile, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - int intBase; - if (PGuards.isNoValue(base)) { - intBase = 10; - } else if (base instanceof Integer) { - intBase = (int) base; - checkBase(intBase, inliningTarget, invalidBase, raiseNode); - } else { - assert base instanceof PInt; - PInt pintBase = (PInt) base; - checkBase(pintBase, inliningTarget, invalidBase, raiseNode); - intBase = (pintBase).intValue(); - } - Object result = callInt(frame, inliningTarget, arg, raiseNode); - if (result != PNone.NO_VALUE) { - return result; - } - return stringToInt(frame, cls, castToStringNode.execute(arg), intBase, arg, inliningTarget, - isPrimitiveIntProfile, notSimpleDecimalLiteralProfile, invalidValueProfile, bigIntegerProfile, - primitiveIntProfile, fullIntProfile, factory, raiseNode); - } - - // other - - @Specialization(guards = "isNoValue(base)") - static Object createInt(Object cls, PythonNativeVoidPtr arg, @SuppressWarnings("unused") PNone base, - @Bind("this") Node inliningTarget, - @Shared("primitiveInt") @Cached IsBuiltinClassExactProfile isPrimitiveIntProfile) { - if (isPrimitiveInt(inliningTarget, cls, isPrimitiveIntProfile)) { - return arg; - } else { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("cannot wrap void ptr in int subclass"); - } - } - - @Specialization(guards = "isNoValue(none)") - static Object createInt(Object cls, @SuppressWarnings("unused") PNone none, @SuppressWarnings("unused") PNone base, - @Bind("this") Node inliningTarget, - @Shared("primitiveInt") @Cached IsBuiltinClassExactProfile isPrimitiveIntProfile, - @Shared @Cached PythonObjectFactory factory) { - if (isPrimitiveInt(inliningTarget, cls, isPrimitiveIntProfile)) { - return 0; - } - return factory.createInt(cls, 0); - } - - @SuppressWarnings("unused") - @Specialization(guards = {"!isString(arg)", "!isBytes(arg)", "!isNoValue(base)"}) - static Object fail(Object cls, Object arg, Object base, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.INT_CANT_CONVERT_STRING_WITH_EXPL_BASE); - } - - @Specialization(guards = {"isNoValue(base)", "!isNoValue(obj)", "!isHandledType(obj)"}) - @SuppressWarnings("truffle-static-method") - @InliningCutoff - @Megamorphic - Object createIntGeneric(VirtualFrame frame, Object cls, Object obj, @SuppressWarnings("unused") PNone base, - @Bind("this") Node inliningTarget, - @Cached("createFor(this)") IndirectCallData indirectCallData, - @Cached PyIndexCheckNode indexCheckNode, - @Cached PyLongCheckExactNode longCheckExact, - @Exclusive @Cached IsBuiltinClassExactProfile isPrimitiveIntProfile, - @CachedLibrary(limit = "3") PythonBufferAcquireLibrary bufferAcquireLib, - @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, - @Exclusive @Cached InlinedBranchProfile notSimpleDecimalLiteralProfile, - @Exclusive @Cached InlinedBranchProfile invalidValueProfile, - @Exclusive @Cached InlinedBranchProfile bigIntegerProfile, - @Exclusive @Cached InlinedBranchProfile primitiveIntProfile, - @Exclusive @Cached InlinedBranchProfile fullIntProfile, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - /* - * This method (together with callInt and callIndex) reflects the logic of PyNumber_Long - * in CPython. We don't use PythonObjectLibrary here since the original CPython function - * does not use any of the conversion functions (such as _PyLong_AsInt or - * PyNumber_Index) either, but it reimplements the logic in a slightly different way - * (e.g. trying __int__ before __index__ whereas _PyLong_AsInt does it the other way) - * and also with specific exception messages which are expected by Python unittests. - * This unfortunately means that this method relies on the internal logic of NO_VALUE - * return values representing missing magic methods which should be ideally hidden by - * PythonObjectLibrary. - */ - Object result = callInt(frame, inliningTarget, obj, raiseNode); - if (result == PNone.NO_VALUE) { - result = callIndex(frame, inliningTarget, obj, raiseNode); - if (result == PNone.NO_VALUE) { - Object truncResult = callTrunc(frame, inliningTarget, obj, indexCheckNode, raiseNode); - if (truncResult == PNone.NO_VALUE) { - Object buffer; - try { - buffer = bufferAcquireLib.acquireReadonly(obj, frame, indirectCallData); - } catch (PException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.ARG_MUST_BE_STRING_OR_BYTELIKE_OR_NUMBER, "int()", obj); - } - try { - String number = newString(bufferLib.getInternalOrCopiedByteArray(buffer), 0, bufferLib.getBufferLength(buffer)); - return stringToInt(frame, cls, number, 10, obj, inliningTarget, isPrimitiveIntProfile, - notSimpleDecimalLiteralProfile, invalidValueProfile, bigIntegerProfile, primitiveIntProfile, fullIntProfile, factory, raiseNode); - } finally { - bufferLib.release(buffer, frame, indirectCallData); - } - } - if (isIntegerType(truncResult)) { - result = truncResult; - } else { - result = callIndex(frame, inliningTarget, truncResult, raiseNode); - if (result == PNone.NO_VALUE) { - result = callInt(frame, inliningTarget, truncResult, raiseNode); - if (result == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.RETURNED_NON_INTEGRAL, "__trunc__", truncResult); - } - } - } - } - } - - // If a subclass of int is returned by __int__ or __index__, a conversion to int is - // performed and a DeprecationWarning should be triggered (see PyNumber_Long). - if (!longCheckExact.execute(inliningTarget, result)) { - getWarnNode().warnFormat(frame, null, PythonBuiltinClassType.DeprecationWarning, 1, - ErrorMessages.WARN_P_RETURNED_NON_P, - obj, "__int__/__index__", "int", result, "int"); - if (PGuards.isPInt(result)) { - result = ((PInt) result).getValue(); - } else if (PGuards.isBoolean(result)) { - result = (boolean) result ? 1 : 0; - } - } - return createInt(cls, result, inliningTarget, isPrimitiveIntProfile, bigIntegerProfile, primitiveIntProfile, fullIntProfile, factory); - } - - protected static boolean isIntegerType(Object obj) { - return PGuards.isBoolean(obj) || PGuards.isInteger(obj) || PGuards.isPInt(obj); - } - - protected static boolean isHandledType(Object obj) { - return PGuards.isInteger(obj) || obj instanceof Double || obj instanceof Boolean || PGuards.isString(obj) || PGuards.isBytes(obj) || obj instanceof PythonNativeVoidPtr; - } - - private Object callIndex(VirtualFrame frame, Node inliningTarget, Object obj, PRaiseNode.Lazy raiseNode) { - if (callIndexNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - callIndexNode = insert(LookupAndCallUnaryNode.create(SpecialMethodSlot.Index)); - } - Object result = callIndexNode.executeObject(frame, obj); - // the case when the result is NO_VALUE (i.e. the object does not provide __index__) - // is handled in createIntGeneric - if (result != PNone.NO_VALUE && !isIntegerType(result)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.RETURNED_NON_INT, J___INDEX__, result); - } - return result; - } - - private Object callTrunc(VirtualFrame frame, Node inliningTarget, Object obj, PyIndexCheckNode indexCheckNode, PRaiseNode.Lazy raiseNode) { - if (callTruncNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - callTruncNode = insert(LookupAndCallUnaryNode.create(T___TRUNC__)); - } - Object result = callTruncNode.executeObject(frame, obj); - if (result != PNone.NO_VALUE) { - getWarnNode().warnEx(frame, DeprecationWarning, ErrorMessages.WARN_DELEGATION_OF_INT_TO_TRUNC_IS_DEPRECATED, 1); - if (indexCheckNode.execute(inliningTarget, result)) { - return callIndex(frame, inliningTarget, result, raiseNode); - } else { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.RETURNED_NON_INTEGRAL, J___TRUNC__, result); - } - } - return result; - } - - private Object callInt(VirtualFrame frame, Node inliningTarget, Object object, PRaiseNode.Lazy raiseNode) { - if (callIntNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - callIntNode = insert(LookupAndCallUnaryNode.create(SpecialMethodSlot.Int)); - } - Object result = callIntNode.executeObject(frame, object); - if (result != PNone.NO_VALUE && !isIntegerType(result)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.RETURNED_NON_INT, T___INT__, result); - } - return result; - } - - private WarnNode getWarnNode() { - if (warnNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - warnNode = insert(WarnNode.create()); - } - return warnNode; - } - - private String toString(PBytesLike pByteArray) { - if (toByteArrayNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - toByteArrayNode = insert(BytesNodes.ToBytesNode.create()); - } - return newString(toByteArrayNode.execute(pByteArray)); - } - - @TruffleBoundary(allowInlining = true) - private static String newString(byte[] bytes) { - return new String(bytes); - } - - @TruffleBoundary(allowInlining = true) - private static String newString(byte[] bytes, int offset, int length) { - return new String(bytes, offset, length); - } - } - - // bool([x]) - @Builtin(name = J_BOOL, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, constructsClass = PythonBuiltinClassType.Boolean, base = PythonBuiltinClassType.PInt, doc = """ - bool(x) -> bool - - Returns True when the argument x is true, False otherwise. - The builtins True and False are the only two instances of the class bool. - The class bool is a subclass of the class int, and cannot be subclassed.""") - @GenerateNodeFactory - public abstract static class BoolNode extends PythonBinaryBuiltinNode { - @Specialization - public static boolean bool(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object obj, - @Bind("this") Node inliningTarget, - @Cached PyObjectIsTrueNode isTrue) { - return isTrue.execute(frame, inliningTarget, obj); - } - } - - // list([iterable]) - @Builtin(name = J_LIST, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PList, doc = """ - Built-in mutable sequence. - - If no argument is given, the constructor creates a new empty list. - The argument must be an iterable if specified.""") - @GenerateNodeFactory - public abstract static class ListNode extends PythonVarargsBuiltinNode { - @Specialization - protected PList constructList(Object cls, @SuppressWarnings("unused") Object[] arguments, @SuppressWarnings("unused") PKeyword[] keywords, - @Cached PythonObjectFactory factory) { - return factory.createList(cls); - } - } - - // object() - @Builtin(name = J_OBJECT, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PythonObject, doc = """ - The base class of the class hierarchy. - - When called, it accepts no arguments and returns a new featureless - instance that has no instance attributes and cannot be given any. - """) - @GenerateNodeFactory - public abstract static class ObjectNode extends PythonVarargsBuiltinNode { - - @Child private SplitArgsNode splitArgsNode; - @Child private ReportAbstractClassNode reportAbstractClassNode; - - @GenerateInline(false) // Used lazily - abstract static class ReportAbstractClassNode extends PNodeWithContext { - public abstract PException execute(VirtualFrame frame, Object type); - - @Specialization - static PException report(VirtualFrame frame, Object type, - @Bind("this") Node inliningTarget, - @Cached PyObjectCallMethodObjArgs callSort, - @Cached PyObjectCallMethodObjArgs callJoin, - @Cached PyObjectSizeNode sizeNode, - @Cached ReadAttributeFromObjectNode readAttributeFromObjectNode, - @Cached CastToTruffleStringNode cast, - @Cached ListNodes.ConstructListNode constructListNode, - @Cached PRaiseNode raiseNode) { - PList list = constructListNode.execute(frame, readAttributeFromObjectNode.execute(type, T___ABSTRACTMETHODS__)); - int methodCount = sizeNode.execute(frame, inliningTarget, list); - callSort.execute(frame, inliningTarget, list, T_SORT); - TruffleString joined = cast.execute(inliningTarget, callJoin.execute(frame, inliningTarget, T_COMMA_SPACE, T_JOIN, list)); - throw raiseNode.raise(TypeError, ErrorMessages.CANT_INSTANTIATE_ABSTRACT_CLASS_WITH_ABSTRACT_METHODS, type, methodCount > 1 ? "s" : "", joined); - } - } - - @GenerateInline - @GenerateCached(false) - @ImportStatic(SpecialMethodSlot.class) - abstract static class CheckExcessArgsNode extends Node { - abstract void execute(Node inliningTarget, Object type, Object[] args, PKeyword[] kwargs); - - @Specialization(guards = {"args.length == 0", "kwargs.length == 0"}) - @SuppressWarnings("unused") - static void doNothing(Object type, Object[] args, PKeyword[] kwargs) { - } - - @Fallback - @SuppressWarnings("unused") - static void check(Node inliningTarget, Object type, Object[] args, PKeyword[] kwargs, - @Cached(parameters = "Init", inline = false) LookupCallableSlotInMRONode lookupInit, - @Cached(parameters = "New", inline = false) LookupCallableSlotInMRONode lookupNew, - @Cached TypeNodes.CheckCallableIsSpecificBuiltinNode checkSlotIs, - @Cached PRaiseNode.Lazy raiseNode) { - if (!checkSlotIs.execute(inliningTarget, lookupNew.execute(type), BuiltinConstructorsFactory.ObjectNodeFactory.getInstance())) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.NEW_TAKES_ONE_ARG); - } - if (checkSlotIs.execute(inliningTarget, lookupInit.execute(type), ObjectBuiltinsFactory.InitNodeFactory.getInstance())) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.NEW_TAKES_NO_ARGS, type); - } - } - } - - @Override - public final Object varArgExecute(VirtualFrame frame, @SuppressWarnings("unused") Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported { - if (splitArgsNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - splitArgsNode = insert(SplitArgsNode.create()); - } - return execute(frame, arguments[0], splitArgsNode.executeCached(arguments), keywords); - } - - @Specialization(guards = {"!self.needsNativeAllocation()"}) - Object doManagedObject(VirtualFrame frame, PythonManagedClass self, Object[] varargs, PKeyword[] kwargs, - @Bind("this") Node inliningTarget, - @Shared @Cached CheckExcessArgsNode checkExcessArgsNode, - @Shared @Cached PythonObjectFactory factory) { - checkExcessArgsNode.execute(inliningTarget, self, varargs, kwargs); - if (self.isAbstractClass()) { - throw reportAbstractClass(frame, self); - } - return factory.createPythonObject(self); - } - - @Specialization - static Object doBuiltinTypeType(PythonBuiltinClassType self, Object[] varargs, PKeyword[] kwargs, - @Bind("this") Node inliningTarget, - @Shared @Cached CheckExcessArgsNode checkExcessArgsNode, - @Shared @Cached PythonObjectFactory factory) { - checkExcessArgsNode.execute(inliningTarget, self, varargs, kwargs); - return factory.createPythonObject(self); - } - - @Specialization(guards = "self.needsNativeAllocation()") - @SuppressWarnings("truffle-static-method") - @InliningCutoff - Object doNativeObjectIndirect(VirtualFrame frame, PythonManagedClass self, Object[] varargs, PKeyword[] kwargs, - @Bind("this") Node inliningTarget, - @Shared @Cached CheckExcessArgsNode checkExcessArgsNode, - @Shared @Cached CallNativeGenericNewNode callNativeGenericNewNode) { - checkExcessArgsNode.execute(inliningTarget, self, varargs, kwargs); - if (self.isAbstractClass()) { - throw reportAbstractClass(frame, self); - } - return callNativeGenericNewNode.execute(inliningTarget, self); - } - - @Specialization(guards = "isNativeClass(self)") - @SuppressWarnings("truffle-static-method") - @InliningCutoff - Object doNativeObjectDirect(VirtualFrame frame, Object self, Object[] varargs, PKeyword[] kwargs, - @Bind("this") Node inliningTarget, - @Shared @Cached CheckExcessArgsNode checkExcessArgsNode, - @Exclusive @Cached TypeNodes.GetTypeFlagsNode getTypeFlagsNode, - @Shared @Cached CallNativeGenericNewNode callNativeGenericNewNode) { - checkExcessArgsNode.execute(inliningTarget, self, varargs, kwargs); - if ((getTypeFlagsNode.execute(self) & TypeFlags.IS_ABSTRACT) != 0) { - throw reportAbstractClass(frame, self); - } - return callNativeGenericNewNode.execute(inliningTarget, self); - } - - @GenerateInline - @GenerateCached(false) - protected abstract static class CallNativeGenericNewNode extends Node { - abstract Object execute(Node inliningTarget, Object cls); - - @Specialization - static Object call(Object cls, - @Cached(inline = false) PythonToNativeNode toNativeNode, - @Cached(inline = false) NativeToPythonTransferNode toPythonNode, - @Cached(inline = false) PCallCapiFunction callCapiFunction) { - return toPythonNode.execute(callCapiFunction.call(FUN_PY_OBJECT_NEW, toNativeNode.execute(cls))); - } - } - - @SuppressWarnings("unused") - @Fallback - Object fallback(Object o, Object[] varargs, PKeyword[] kwargs) { - throw raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "object.__new__(X): X", o); - } - - @InliningCutoff - private PException reportAbstractClass(VirtualFrame frame, Object type) { - if (reportAbstractClassNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - reportAbstractClassNode = insert(ReportAbstractClassNodeGen.create()); - } - return reportAbstractClassNode.execute(frame, type); - } - } - - // range(stop) - // range(start, stop[, step]) - @Builtin(name = J_RANGE, minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 4, constructsClass = PythonBuiltinClassType.PRange, doc = """ - range(stop) -> range object - range(start, stop[, step]) -> range object - - Return an object that produces a sequence of integers from start (inclusive) - to stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1. - start defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3. - These are exactly the valid indices for a list of 4 elements. - When step is given, it specifies the increment (or decrement).""") - @GenerateNodeFactory - @ReportPolymorphism - public abstract static class RangeNode extends PythonQuaternaryBuiltinNode { - // stop - @Specialization(guards = "isStop(start, stop, step)") - static Object doIntStop(Object cls, int stop, @SuppressWarnings("unused") PNone start, @SuppressWarnings("unused") PNone step, - @Bind("this") Node inliningTarget, - @Shared("exceptionProfile") @Cached InlinedBranchProfile exceptionProfile, - @Shared("lenOfRangeNodeExact") @Cached LenOfIntRangeNodeExact lenOfRangeNodeExact, - @Shared("createBigRangeNode") @Cached RangeNodes.CreateBigRangeNode createBigRangeNode, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - return doInt(cls, 0, stop, 1, inliningTarget, exceptionProfile, lenOfRangeNodeExact, createBigRangeNode, factory, raiseNode); - } - - @Specialization(guards = "isStop(start, stop, step)") - static Object doPintStop(Object cls, PInt stop, @SuppressWarnings("unused") PNone start, @SuppressWarnings("unused") PNone step, - @Bind("this") Node inliningTarget, - @Shared("lenOfRangeNode") @Cached RangeNodes.LenOfRangeNode lenOfRangeNode, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - return doPint(cls, factory.createInt(0), stop, factory.createInt(1), inliningTarget, lenOfRangeNode, factory, raiseNode); - } - - @Specialization(guards = "isStop(start, stop, step)") - static Object doGenericStop(VirtualFrame frame, Object cls, Object stop, @SuppressWarnings("unused") PNone start, @SuppressWarnings("unused") PNone step, - @Bind("this") Node inliningTarget, - @Shared("exceptionProfile") @Cached InlinedBranchProfile exceptionProfile, - @Shared("lenOfRangeNodeExact") @Cached LenOfIntRangeNodeExact lenOfRangeNodeExact, - @Shared("createBigRangeNode") @Cached RangeNodes.CreateBigRangeNode createBigRangeNode, - @Shared("cast") @Cached CastToJavaIntExactNode cast, - @Shared("overflowProfile") @Cached IsBuiltinObjectProfile overflowProfile, - @Shared("indexNode") @Cached PyNumberIndexNode indexNode, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - return doGeneric(frame, cls, 0, stop, 1, inliningTarget, exceptionProfile, lenOfRangeNodeExact, createBigRangeNode, cast, overflowProfile, indexNode, factory, raiseNode); - } - - // start stop - @Specialization(guards = "isStartStop(start, stop, step)") - static Object doIntStartStop(Object cls, int start, int stop, @SuppressWarnings("unused") PNone step, - @Bind("this") Node inliningTarget, - @Shared("exceptionProfile") @Cached InlinedBranchProfile exceptionProfile, - @Shared("lenOfRangeNodeExact") @Cached LenOfIntRangeNodeExact lenOfRangeNodeExact, - @Shared("createBigRangeNode") @Cached RangeNodes.CreateBigRangeNode createBigRangeNode, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - return doInt(cls, start, stop, 1, inliningTarget, exceptionProfile, lenOfRangeNodeExact, createBigRangeNode, factory, raiseNode); - } - - @Specialization(guards = "isStartStop(start, stop, step)") - static Object doPintStartStop(Object cls, PInt start, PInt stop, @SuppressWarnings("unused") PNone step, - @Bind("this") Node inliningTarget, - @Shared("lenOfRangeNode") @Cached RangeNodes.LenOfRangeNode lenOfRangeNode, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - return doPint(cls, start, stop, factory.createInt(1), inliningTarget, lenOfRangeNode, factory, raiseNode); - } - - @Specialization(guards = "isStartStop(start, stop, step)") - static Object doGenericStartStop(VirtualFrame frame, Object cls, Object start, Object stop, @SuppressWarnings("unused") PNone step, - @Bind("this") Node inliningTarget, - @Shared("exceptionProfile") @Cached InlinedBranchProfile exceptionProfile, - @Shared("lenOfRangeNodeExact") @Cached LenOfIntRangeNodeExact lenOfRangeNodeExact, - @Shared("createBigRangeNode") @Cached RangeNodes.CreateBigRangeNode createBigRangeNode, - @Shared("cast") @Cached CastToJavaIntExactNode cast, - @Shared("overflowProfile") @Cached IsBuiltinObjectProfile overflowProfile, - @Shared("indexNode") @Cached PyNumberIndexNode indexNode, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - return doGeneric(frame, cls, start, stop, 1, inliningTarget, exceptionProfile, lenOfRangeNodeExact, createBigRangeNode, cast, overflowProfile, indexNode, factory, raiseNode); - } - - // start stop step - @Specialization - static Object doInt(@SuppressWarnings("unused") Object cls, int start, int stop, int step, - @Bind("this") Node inliningTarget, - @Shared("exceptionProfile") @Cached InlinedBranchProfile exceptionProfile, - @Shared("lenOfRangeNodeExact") @Cached LenOfIntRangeNodeExact lenOfRangeNode, - @Shared("createBigRangeNode") @Cached RangeNodes.CreateBigRangeNode createBigRangeNode, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - if (step == 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ARG_MUST_NOT_BE_ZERO, "range()", 3); - } - try { - int len = lenOfRangeNode.executeInt(inliningTarget, start, stop, step); - return factory.createIntRange(start, stop, step, len); - } catch (OverflowException e) { - exceptionProfile.enter(inliningTarget); - return createBigRangeNode.execute(inliningTarget, start, stop, step); - } - } - - @Specialization - static Object doPint(@SuppressWarnings("unused") Object cls, PInt start, PInt stop, PInt step, - @Bind("this") Node inliningTarget, - @Shared("lenOfRangeNode") @Cached RangeNodes.LenOfRangeNode lenOfRangeNode, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - if (step.isZero()) { - throw raiseNode.get(inliningTarget).raise(ValueError, ARG_MUST_NOT_BE_ZERO, "range()", 3); - } - BigInteger len = lenOfRangeNode.execute(inliningTarget, start.getValue(), stop.getValue(), step.getValue()); - return factory.createBigRange(start, stop, step, factory.createInt(len)); - } - - @Specialization(guards = "isStartStopStep(start, stop, step)") - static Object doGeneric(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object start, Object stop, Object step, - @Bind("this") Node inliningTarget, - @Shared("exceptionProfile") @Cached InlinedBranchProfile exceptionProfile, - @Shared("lenOfRangeNodeExact") @Cached LenOfIntRangeNodeExact lenOfRangeNodeExact, - @Shared("createBigRangeNode") @Cached RangeNodes.CreateBigRangeNode createBigRangeNode, - @Shared("cast") @Cached CastToJavaIntExactNode cast, - @Shared("overflowProfile") @Cached IsBuiltinObjectProfile overflowProfile, - @Shared("indexNode") @Cached PyNumberIndexNode indexNode, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - Object lstart = indexNode.execute(frame, inliningTarget, start); - Object lstop = indexNode.execute(frame, inliningTarget, stop); - Object lstep = indexNode.execute(frame, inliningTarget, step); - - try { - int istart = cast.execute(inliningTarget, lstart); - int istop = cast.execute(inliningTarget, lstop); - int istep = cast.execute(inliningTarget, lstep); - return doInt(cls, istart, istop, istep, inliningTarget, exceptionProfile, lenOfRangeNodeExact, createBigRangeNode, factory, raiseNode); - } catch (PException e) { - e.expect(inliningTarget, OverflowError, overflowProfile); - return createBigRangeNode.execute(inliningTarget, lstart, lstop, lstep); - } - } - - protected static boolean isStop(Object start, Object stop, Object step) { - return isNoValue(start) && !isNoValue(stop) && isNoValue(step); - } - - protected static boolean isStartStop(Object start, Object stop, Object step) { - return !isNoValue(start) && !isNoValue(stop) && isNoValue(step); - } - - protected static boolean isStartStopStep(Object start, Object stop, Object step) { - return !isNoValue(start) && !isNoValue(stop) && !isNoValue(step); - } - } - - // set([iterable]) - @Builtin(name = J_SET, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PSet, doc = """ - set() -> new empty set object - set(iterable) -> new set object - - Build an unordered collection of unique elements.""") - @GenerateNodeFactory - public abstract static class SetNode extends PythonBuiltinNode { - - @Specialization - public PSet setEmpty(Object cls, @SuppressWarnings("unused") Object arg, - @Cached PythonObjectFactory factory) { - return factory.createSet(cls); - } - - } - - // str(object='') - // str(object=b'', encoding='utf-8', errors='strict') - @Builtin(name = J_STR, minNumOfPositionalArgs = 1, parameterNames = {"cls", "object", "encoding", "errors"}, constructsClass = PythonBuiltinClassType.PString, doc = """ - str(object='') -> str - str(bytes_or_buffer[, encoding[, errors]]) -> str - - Create a new string object from the given object. If encoding or - errors is specified, then the object must expose a data buffer - that will be decoded using the given encoding and error handler. - Otherwise, returns the result of object.__str__() (if defined) - or repr(object). - encoding defaults to sys.getdefaultencoding(). - errors defaults to 'strict'.""") - @GenerateNodeFactory - public abstract static class StrNode extends PythonBuiltinNode { - - public final Object executeWith(Object arg) { - return executeWith(null, PythonBuiltinClassType.PString, arg, PNone.NO_VALUE, PNone.NO_VALUE); - } - - public final Object executeWith(VirtualFrame frame, Object arg) { - return executeWith(frame, PythonBuiltinClassType.PString, arg, PNone.NO_VALUE, PNone.NO_VALUE); - } - - public abstract Object executeWith(VirtualFrame frame, Object cls, Object arg, Object encoding, Object errors); - - @Specialization(guards = {"!needsNativeAllocationNode.execute(inliningTarget, cls)", "isNoValue(arg)"}, limit = "1") - @SuppressWarnings("unused") - static Object strNoArgs(Object cls, PNone arg, Object encoding, Object errors, - @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached TypeNodes.NeedsNativeAllocationNode needsNativeAllocationNode, - @Exclusive @Cached IsBuiltinClassExactProfile isPrimitiveProfile, - @Shared @Cached PythonObjectFactory factory) { - return asPString(cls, T_EMPTY_STRING, inliningTarget, isPrimitiveProfile, factory); - } - - @Specialization(guards = {"!needsNativeAllocationNode.execute(inliningTarget, cls)", "!isNoValue(obj)", "isNoValue(encoding)", "isNoValue(errors)"}, limit = "1") - static Object strOneArg(VirtualFrame frame, Object cls, Object obj, @SuppressWarnings("unused") PNone encoding, @SuppressWarnings("unused") PNone errors, - @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached TypeNodes.NeedsNativeAllocationNode needsNativeAllocationNode, - @Exclusive @Cached IsBuiltinClassExactProfile isPrimitiveProfile, - @Exclusive @Cached InlinedConditionProfile isStringProfile, - @Cached CastToTruffleStringNode castToTruffleStringNode, - @Exclusive @Cached PyObjectStrAsObjectNode strNode, - @Shared @Cached PythonObjectFactory factory) { - Object result = strNode.execute(frame, inliningTarget, obj); - - // try to return a primitive if possible - assertNoJavaString(result); - if (isStringProfile.profile(inliningTarget, result instanceof TruffleString)) { - return asPString(cls, (TruffleString) result, inliningTarget, isPrimitiveProfile, factory); - } - - if (isPrimitiveProfile.profileClass(inliningTarget, cls, PythonBuiltinClassType.PString)) { - // PyObjectStrAsObjectNode guarantees that the returned object is an instanceof of - // 'str' - return result; - } else { - try { - return asPString(cls, castToTruffleStringNode.execute(inliningTarget, result), inliningTarget, isPrimitiveProfile, factory); - } catch (CannotCastException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("asPstring result not castable to String"); - } - } - } - - @Specialization(guards = {"!needsNativeAllocationNode.execute(inliningTarget, cls)", "!isNoValue(encoding) || !isNoValue(errors)"}, limit = "3") - static Object doBuffer(VirtualFrame frame, Object cls, Object obj, Object encoding, Object errors, - @Bind("this") Node inliningTarget, - @Cached("createFor(this)") IndirectCallData indirectCallData, - @SuppressWarnings("unused") @Exclusive @Cached TypeNodes.NeedsNativeAllocationNode needsNativeAllocationNode, - @Exclusive @Cached IsBuiltinClassExactProfile isPrimitiveProfile, - @Exclusive @Cached InlinedConditionProfile isStringProfile, - @Exclusive @Cached InlinedConditionProfile isPStringProfile, - @CachedLibrary("obj") PythonBufferAcquireLibrary acquireLib, - @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Cached("create(T_DECODE)") LookupAndCallTernaryNode callDecodeNode, - @Shared @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - Object buffer; - try { - buffer = acquireLib.acquireReadonly(obj, frame, indirectCallData); - } catch (PException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.NEED_BYTELIKE_OBJ, obj); - } - try { - // TODO(fa): we should directly call '_codecs.decode' - // TODO don't copy, CPython creates a memoryview - PBytes bytesObj = factory.createBytes(bufferLib.getCopiedByteArray(buffer)); - Object en = encoding == PNone.NO_VALUE ? T_UTF8 : encoding; - Object result = assertNoJavaString(callDecodeNode.execute(frame, bytesObj, en, errors)); - if (isStringProfile.profile(inliningTarget, result instanceof TruffleString)) { - return asPString(cls, (TruffleString) result, inliningTarget, isPrimitiveProfile, factory); - } else if (isPStringProfile.profile(inliningTarget, result instanceof PString)) { - return result; - } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.P_S_RETURNED_NON_STRING, bytesObj, "decode", result); - } finally { - bufferLib.release(buffer, frame, indirectCallData); - } - } - - /** - * logic similar to - * {@code unicode_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)} from - * CPython {@code unicodeobject.c} we have to first create a temporary string, then fill it - * into a natively allocated subtype structure - */ - @Specialization(guards = {"needsNativeAllocationNode.execute(inliningTarget, cls)", "isSubtypeOfString(frame, isSubtype, cls)", // - "isNoValue(encoding)", "isNoValue(errors)"}, limit = "1") - static Object doNativeSubclass(VirtualFrame frame, Object cls, Object obj, @SuppressWarnings("unused") Object encoding, @SuppressWarnings("unused") Object errors, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached TypeNodes.NeedsNativeAllocationNode needsNativeAllocationNode, - @Cached @SuppressWarnings("unused") IsSubtypeNode isSubtype, - @Exclusive @Cached PyObjectStrAsObjectNode strNode, - @Cached CExtNodes.StringSubtypeNew subtypeNew) { - if (obj == PNone.NO_VALUE) { - return subtypeNew.call(cls, T_EMPTY_STRING); - } else { - return subtypeNew.call(cls, strNode.execute(frame, inliningTarget, obj)); - } - } - - protected static boolean isSubtypeOfString(VirtualFrame frame, IsSubtypeNode isSubtypeNode, Object cls) { - return isSubtypeNode.execute(frame, cls, PythonBuiltinClassType.PString); - } - - private static Object asPString(Object cls, TruffleString str, Node inliningTarget, IsBuiltinClassExactProfile isPrimitiveProfile, - PythonObjectFactory factory) { - if (isPrimitiveProfile.profileClass(inliningTarget, cls, PythonBuiltinClassType.PString)) { - return str; - } else { - return factory.createString(cls, str); - } - } - - @NeverDefault - public static StrNode create() { - return BuiltinConstructorsFactory.StrNodeFactory.create(null); - } - } - - // tuple([iterable]) - @Builtin(name = J_TUPLE, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, constructsClass = PythonBuiltinClassType.PTuple, doc = """ - Built-in immutable sequence. - - If no argument is given, the constructor returns an empty tuple. - If iterable is specified the tuple is initialized from iterable's items. - - If the argument is a tuple, the return value is the same object.""") - @GenerateNodeFactory - public abstract static class TupleNode extends PythonBinaryBuiltinNode { - - @Specialization(guards = "!needsNativeAllocationNode.execute(inliningTarget, cls)") - static PTuple constructTuple(VirtualFrame frame, Object cls, Object iterable, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Shared @Cached TypeNodes.NeedsNativeAllocationNode needsNativeAllocationNode, - @Cached TupleNodes.ConstructTupleNode constructTupleNode) { - return constructTupleNode.execute(frame, cls, iterable); - } - - // delegate to tuple_subtype_new(PyTypeObject *type, PyObject *x) - @Specialization(guards = {"needsNativeAllocationNode.execute(inliningTarget, cls)", "isSubtypeOfTuple(frame, isSubtype, cls)"}, limit = "1") - @InliningCutoff - static Object doNative(@SuppressWarnings("unused") VirtualFrame frame, Object cls, Object iterable, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Shared @Cached TypeNodes.NeedsNativeAllocationNode needsNativeAllocationNode, - @Cached @SuppressWarnings("unused") IsSubtypeNode isSubtype, - @Cached CExtNodes.TupleSubtypeNew subtypeNew) { - return subtypeNew.call(cls, iterable); - } - - protected static boolean isSubtypeOfTuple(VirtualFrame frame, IsSubtypeNode isSubtypeNode, Object cls) { - return isSubtypeNode.execute(frame, cls, PythonBuiltinClassType.PTuple); - } - - @Fallback - static PTuple tupleObject(Object cls, @SuppressWarnings("unused") Object arg, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - } - - // zip(*iterables) - @Builtin(name = J_ZIP, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PZip, doc = """ - zip(*iterables, strict=False) --> Yield tuples until an input is exhausted. - - >>> list(zip('abcdefg', range(3), range(4))) - [('a', 0, 0), ('b', 1, 1), ('c', 2, 2)] - - The zip object yields n-length tuples, where n is the number of iterables - passed as positional arguments to zip(). The i-th element in every tuple - comes from the i-th iterable argument to zip(). This continues until the - shortest argument is exhausted. - - If strict is true and one of the arguments is exhausted before the others, - raise a ValueError.""") - @GenerateNodeFactory - public abstract static class ZipNode extends PythonBuiltinNode { - static boolean isNoneOrEmptyPKeyword(Object value) { - return PGuards.isPNone(value) || (value instanceof PKeyword[] kw && kw.length == 0); - } - - @Specialization(guards = "isNoneOrEmptyPKeyword(kw)") - static PZip zip(VirtualFrame frame, Object cls, Object[] args, @SuppressWarnings("unused") Object kw, - @Bind("this") Node inliningTarget, - @Exclusive @Cached PyObjectGetIter getIter, - @Shared @Cached PythonObjectFactory factory) { - return zip(frame, inliningTarget, cls, args, false, getIter, factory); - } - - @Specialization(guards = "kw.length == 1") - static PZip zip(VirtualFrame frame, Object cls, Object[] args, PKeyword[] kw, - @Bind("this") Node inliningTarget, - @Cached TruffleString.EqualNode eqNode, - @Exclusive @Cached PyObjectGetIter getIter, - @Cached PyObjectIsTrueNode isTrueNode, - @Cached InlinedConditionProfile profile, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - if (profile.profile(inliningTarget, eqNode.execute(kw[0].getName(), T_STRICT, TS_ENCODING))) { - return zip(frame, inliningTarget, cls, args, isTrueNode.execute(frame, inliningTarget, kw[0].getValue()), getIter, factory); - } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_IS_AN_INVALID_ARG_FOR_S, kw[0].getName(), T_ZIP); - } - - @Specialization(guards = "kw.length != 1") - static Object zip(@SuppressWarnings("unused") Object cls, @SuppressWarnings("unused") Object[] args, PKeyword[] kw, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.S_TAKES_AT_MOST_ONE_KEYWORD_ARGUMENT_D_GIVEN, T_ZIP, kw.length); - } - - private static PZip zip(VirtualFrame frame, Node inliningTarget, Object cls, Object[] args, boolean strict, PyObjectGetIter getIter, PythonObjectFactory factory) { - Object[] iterables = new Object[args.length]; - LoopNode.reportLoopCount(inliningTarget, args.length); - for (int i = 0; i < args.length; i++) { - Object item = args[i]; - iterables[i] = getIter.execute(frame, inliningTarget, item); - } - return factory.createZip(cls, iterables, strict); - } - } - - // function(code, globals[, name[, argdefs[, closure]]]) - @Builtin(name = "function", minNumOfPositionalArgs = 3, parameterNames = {"$cls", "code", "globals", "name", "argdefs", - "closure"}, constructsClass = PythonBuiltinClassType.PFunction, isPublic = false) - @GenerateNodeFactory - public abstract static class FunctionNode extends PythonBuiltinNode { - - @Specialization - static PFunction function(@SuppressWarnings("unused") Object cls, PCode code, PDict globals, TruffleString name, @SuppressWarnings("unused") PNone defaultArgs, - @SuppressWarnings("unused") PNone closure, - @Shared @Cached PythonObjectFactory factory) { - return factory.createFunction(name, code, globals, null); - } - - @Specialization - static PFunction function(@SuppressWarnings("unused") Object cls, PCode code, PDict globals, @SuppressWarnings("unused") PNone name, @SuppressWarnings("unused") PNone defaultArgs, - PTuple closure, - @Bind("this") Node inliningTarget, - @Shared("getObjectArrayNode") @Cached GetObjectArrayNode getObjectArrayNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createFunction(T_LAMBDA_NAME, code, globals, PCell.toCellArray(getObjectArrayNode.execute(inliningTarget, closure))); - } - - @Specialization - static PFunction function(@SuppressWarnings("unused") Object cls, PCode code, PDict globals, @SuppressWarnings("unused") PNone name, @SuppressWarnings("unused") PNone defaultArgs, - @SuppressWarnings("unused") PNone closure, - @SuppressWarnings("unused") @Shared("getObjectArrayNode") @Cached GetObjectArrayNode getObjectArrayNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createFunction(T_LAMBDA_NAME, code, globals, null); - } - - @Specialization - static PFunction function(@SuppressWarnings("unused") Object cls, PCode code, PDict globals, TruffleString name, @SuppressWarnings("unused") PNone defaultArgs, PTuple closure, - @Bind("this") Node inliningTarget, - @Shared("getObjectArrayNode") @Cached GetObjectArrayNode getObjectArrayNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createFunction(name, code, globals, PCell.toCellArray(getObjectArrayNode.execute(inliningTarget, closure))); - } - - @Specialization - static PFunction function(@SuppressWarnings("unused") Object cls, PCode code, PDict globals, @SuppressWarnings("unused") PNone name, PTuple defaultArgs, - @SuppressWarnings("unused") PNone closure, - @Bind("this") Node inliningTarget, - @Shared("getObjectArrayNode") @Cached GetObjectArrayNode getObjectArrayNode, - @Shared @Cached PythonObjectFactory factory) { - // TODO split defaults of positional args from kwDefaults - return factory.createFunction(code.getName(), code, globals, getObjectArrayNode.execute(inliningTarget, defaultArgs), null, null); - } - - @Specialization - static PFunction function(@SuppressWarnings("unused") Object cls, PCode code, PDict globals, TruffleString name, PTuple defaultArgs, @SuppressWarnings("unused") PNone closure, - @Bind("this") Node inliningTarget, - @Shared("getObjectArrayNode") @Cached GetObjectArrayNode getObjectArrayNode, - @Shared @Cached PythonObjectFactory factory) { - // TODO split defaults of positional args from kwDefaults - return factory.createFunction(name, code, globals, getObjectArrayNode.execute(inliningTarget, defaultArgs), null, null); - } - - @Specialization - static PFunction function(@SuppressWarnings("unused") Object cls, PCode code, PDict globals, TruffleString name, PTuple defaultArgs, PTuple closure, - @Bind("this") Node inliningTarget, - @Shared("getObjectArrayNode") @Cached GetObjectArrayNode getObjectArrayNode, - @Shared @Cached PythonObjectFactory factory) { - // TODO split defaults of positional args from kwDefaults - return factory.createFunction(name, code, globals, getObjectArrayNode.execute(inliningTarget, defaultArgs), null, PCell.toCellArray(getObjectArrayNode.execute(inliningTarget, closure))); - } - - @Fallback - @SuppressWarnings("unused") - static PFunction function(@SuppressWarnings("unused") Object cls, Object code, Object globals, Object name, Object defaultArgs, Object closure, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.FUNC_CONSTRUCTION_NOT_SUPPORTED, cls, code, globals, name, defaultArgs, closure); - } - } - - // builtin-function(method-def, self, module) - @Builtin(name = "method_descriptor", minNumOfPositionalArgs = 3, maxNumOfPositionalArgs = 6, constructsClass = PythonBuiltinClassType.PBuiltinFunction, isPublic = false) - @GenerateNodeFactory - public abstract static class BuiltinFunctionNode extends PythonBuiltinNode { - @Specialization - @SuppressWarnings("unused") - static PFunction function(Object cls, Object method_def, Object def, Object name, Object module, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, "method_descriptor"); - } - } - - // type(object, bases, dict) - @Builtin(name = J_TYPE, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, needsFrame = true, constructsClass = PythonBuiltinClassType.PythonClass) - @GenerateNodeFactory - public abstract static class TypeNode extends PythonVarargsBuiltinNode { - @Child private IsSubtypeNode isSubtypeNode; - @Child private IsAcceptableBaseNode isAcceptableBaseNode; - - public abstract Object execute(VirtualFrame frame, Object cls, Object name, Object bases, Object dict, PKeyword[] kwds); - - @Override - public final Object execute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) { - if (arguments.length == 3) { - return execute(frame, self, arguments[0], arguments[1], arguments[2], keywords); - } else { - throw raise(TypeError, ErrorMessages.TAKES_EXACTLY_D_ARGUMENTS_D_GIVEN, "type.__new__", 3, arguments.length); - } - } - - @Override - public Object varArgExecute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) { - if (arguments.length == 4) { - return execute(frame, arguments[0], arguments[1], arguments[2], arguments[3], keywords); - } else if (arguments.length == 3) { - return execute(frame, self, arguments[0], arguments[1], arguments[2], keywords); - } else { - throw raise(TypeError, ErrorMessages.TAKES_EXACTLY_D_ARGUMENTS_D_GIVEN, "type.__new__", 3, arguments.length); - } - } - - @Specialization(guards = "isString(wName)") - @SuppressWarnings("truffle-static-method") - Object typeNew(VirtualFrame frame, Object cls, Object wName, PTuple bases, PDict namespaceOrig, PKeyword[] kwds, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached("create(New)") LookupCallableSlotInMRONode getNewFuncNode, - @Cached TypeBuiltins.BindNew bindNew, - @Exclusive @Cached IsTypeNode isTypeNode, - @Cached PyObjectLookupAttr lookupMroEntriesNode, - @Cached CastToTruffleStringNode castStr, - @Cached CallNode callNewFuncNode, - @Cached CreateTypeNode createType, - @Cached GetObjectArrayNode getObjectArrayNode) { - // Determine the proper metatype to deal with this - TruffleString name = castStr.execute(inliningTarget, wName); - Object metaclass = cls; - Object winner = calculateMetaclass(frame, inliningTarget, metaclass, bases, getClassNode, isTypeNode, lookupMroEntriesNode, getObjectArrayNode); - if (winner != metaclass) { - Object newFunc = getNewFuncNode.execute(winner); - if (newFunc instanceof PBuiltinMethod && (((PBuiltinMethod) newFunc).getBuiltinFunction().getFunctionRootNode().getCallTarget() == getRootNode().getCallTarget())) { - metaclass = winner; - // the new metaclass has the same __new__ function as we are in, continue - } else { - // Pass it to the winner - return callNewFuncNode.execute(frame, bindNew.execute(frame, inliningTarget, newFunc, winner), new Object[]{winner, name, bases, namespaceOrig}, kwds); - } - } - - return createType.execute(frame, namespaceOrig, name, bases, metaclass, kwds); - } - - @Fallback - Object generic(@SuppressWarnings("unused") Object cls, @SuppressWarnings("unused") Object name, Object bases, Object namespace, @SuppressWarnings("unused") PKeyword[] kwds) { - if (!(bases instanceof PTuple)) { - throw raise(TypeError, ErrorMessages.ARG_D_MUST_BE_S_NOT_P, "type.__new__()", 2, "tuple", bases); - } else if (!(namespace instanceof PDict)) { - throw raise(TypeError, ErrorMessages.ARG_D_MUST_BE_S_NOT_P, "type.__new__()", 3, "dict", bases); - } else { - throw CompilerDirectives.shouldNotReachHere("type fallback reached incorrectly"); - } - } - - private Object calculateMetaclass(VirtualFrame frame, Node inliningTarget, Object cls, PTuple bases, GetClassNode getClassNode, IsTypeNode isTypeNode, - PyObjectLookupAttr lookupMroEntries, GetObjectArrayNode getObjectArrayNode) { - Object winner = cls; - for (Object base : getObjectArrayNode.execute(inliningTarget, bases)) { - if (!isTypeNode.execute(inliningTarget, base) && lookupMroEntries.execute(frame, inliningTarget, base, T___MRO_ENTRIES__) != PNone.NO_VALUE) { - throw raise(TypeError, ErrorMessages.TYPE_DOESNT_SUPPORT_MRO_ENTRY_RESOLUTION); - } - if (!ensureIsAcceptableBaseNode().execute(base)) { - throw raise(TypeError, ErrorMessages.TYPE_IS_NOT_ACCEPTABLE_BASE_TYPE, base); - } - Object typ = getClassNode.execute(inliningTarget, base); - if (isSubType(frame, winner, typ)) { - continue; - } else if (isSubType(frame, typ, winner)) { - winner = typ; - continue; - } - throw raise(TypeError, ErrorMessages.METACLASS_CONFLICT); - } - return winner; - } - - protected boolean isSubType(VirtualFrame frame, Object subclass, Object superclass) { - if (isSubtypeNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - isSubtypeNode = insert(IsSubtypeNode.create()); - } - return isSubtypeNode.execute(frame, subclass, superclass); - } - - @NeverDefault - public static TypeNode create() { - return BuiltinConstructorsFactory.TypeNodeFactory.create(); - } - - @Specialization(guards = {"!isNoValue(bases)", "!isNoValue(dict)"}) - Object typeGeneric(VirtualFrame frame, Object cls, Object name, Object bases, Object dict, PKeyword[] kwds, - @Bind("this") Node inliningTarget, - @Cached TypeNode nextTypeNode, - @Exclusive @Cached IsTypeNode isTypeNode) { - if (!(name instanceof TruffleString || name instanceof PString)) { - throw raise(TypeError, ErrorMessages.MUST_BE_STRINGS_NOT_P, "type() argument 1", name); - } else if (!(bases instanceof PTuple)) { - throw raise(TypeError, ErrorMessages.MUST_BE_STRINGS_NOT_P, "type() argument 2", bases); - } else if (!(dict instanceof PDict)) { - throw raise(TypeError, ErrorMessages.MUST_BE_STRINGS_NOT_P, "type() argument 3", dict); - } else if (!isTypeNode.execute(inliningTarget, cls)) { - // TODO: this is actually allowed, deal with it - throw raise(NotImplementedError, ErrorMessages.CREATING_CLASS_NON_CLS_META_CLS); - } - return nextTypeNode.execute(frame, cls, name, bases, dict, kwds); - } - - private IsAcceptableBaseNode ensureIsAcceptableBaseNode() { - if (isAcceptableBaseNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - isAcceptableBaseNode = insert(IsAcceptableBaseNode.create()); - } - return isAcceptableBaseNode; - } - } - - @Builtin(name = J_MODULE, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PythonModule, isPublic = false, doc = """ - Create a module object. - - The name must be a string; the optional doc argument can have any type.""") - @GenerateNodeFactory - public abstract static class ModuleNode extends PythonBuiltinNode { - @Specialization - @SuppressWarnings("unused") - static Object doType(PythonBuiltinClass self, Object[] varargs, PKeyword[] kwargs, - @Shared @Cached PythonObjectFactory factory) { - return factory.createPythonModule(self.getType()); - } - - @Specialization(guards = "!isPythonBuiltinClass(self)") - @SuppressWarnings("unused") - static Object doManaged(PythonManagedClass self, Object[] varargs, PKeyword[] kwargs, - @Shared @Cached PythonObjectFactory factory) { - return factory.createPythonModule(self); - } - - @Specialization - @SuppressWarnings("unused") - static Object doType(PythonBuiltinClassType self, Object[] varargs, PKeyword[] kwargs, - @Shared @Cached PythonObjectFactory factory) { - return factory.createPythonModule(self); - } - - @Specialization(guards = "isTypeNode.execute(inliningTarget, self)", limit = "1") - @SuppressWarnings("unused") - static Object doNative(PythonAbstractNativeObject self, Object[] varargs, PKeyword[] kwargs, - @Bind("this") Node inliningTarget, - @Cached IsTypeNode isTypeNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createPythonModule(self); - } - } - - @Builtin(name = "NotImplementedType", minNumOfPositionalArgs = 1, constructsClass = PythonBuiltinClassType.PNotImplemented, isPublic = false) - @GenerateNodeFactory - public abstract static class NotImplementedTypeNode extends PythonBuiltinNode { - @SuppressWarnings("unused") - @Specialization - public static PNotImplemented module(Object cls) { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - - @Builtin(name = "ellipsis", minNumOfPositionalArgs = 1, constructsClass = PythonBuiltinClassType.PEllipsis, isPublic = false) - @GenerateNodeFactory - public abstract static class EllipsisTypeNode extends PythonBuiltinNode { - @SuppressWarnings("unused") - @Specialization - public static PEllipsis call(Object cls) { - return PEllipsis.INSTANCE; - } - } - - @Builtin(name = "NoneType", minNumOfPositionalArgs = 1, constructsClass = PythonBuiltinClassType.PNone, isPublic = false) - @GenerateNodeFactory - public abstract static class NoneTypeNode extends PythonBuiltinNode { - @SuppressWarnings("unused") - @Specialization - public static PNone module(Object cls) { - return PNone.NONE; - } - } - - @Builtin(name = J_DICT_KEYS, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PDictKeysView, isPublic = false) - @GenerateNodeFactory - public abstract static class DictKeysTypeNode extends PythonBuiltinNode { - @SuppressWarnings("unused") - @Specialization - static Object dictKeys(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, J_DICT_KEYS); - } - } - - @Builtin(name = J_DICT_KEYITERATOR, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PDictKeyIterator, isPublic = false) - @GenerateNodeFactory - public abstract static class DictKeysIteratorTypeNode extends PythonBuiltinNode { - @SuppressWarnings("unused") - @Specialization - static Object dictKeys(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, J_DICT_KEYITERATOR); - } - } - - @Builtin(name = J_DICT_VALUES, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PDictValuesView, isPublic = false) - @GenerateNodeFactory - public abstract static class DictValuesTypeNode extends PythonBuiltinNode { - @SuppressWarnings("unused") - @Specialization - static Object dictKeys(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, J_DICT_VALUES); - } - } - - @Builtin(name = J_DICT_VALUEITERATOR, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PDictValueIterator, isPublic = false) - @GenerateNodeFactory - public abstract static class DictValuesIteratorTypeNode extends PythonBuiltinNode { - @SuppressWarnings("unused") - @Specialization - static Object dictKeys(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, J_DICT_VALUEITERATOR); - } - } - - @Builtin(name = J_DICT_ITEMS, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PDictItemsView, isPublic = false) - @GenerateNodeFactory - public abstract static class DictItemsTypeNode extends PythonBuiltinNode { - @SuppressWarnings("unused") - @Specialization - static Object dictKeys(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, J_DICT_ITEMS); - } - } - - @Builtin(name = J_DICT_ITEMITERATOR, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PDictItemIterator, isPublic = false) - @GenerateNodeFactory - public abstract static class DictItemsIteratorTypeNode extends PythonBuiltinNode { - @SuppressWarnings("unused") - @Specialization - static Object dictKeys(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, J_DICT_ITEMITERATOR); - } - } - - @Builtin(name = "iterator", takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PIterator, isPublic = false) - @GenerateNodeFactory - public abstract static class IteratorTypeNode extends PythonBuiltinNode { - @SuppressWarnings("unused") - @Specialization - static Object iterator(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, "iterator"); - } - } - - @Builtin(name = "arrayiterator", takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PArrayIterator, isPublic = false) - @GenerateNodeFactory - public abstract static class ArrayIteratorTypeNode extends PythonBuiltinNode { - @SuppressWarnings("unused") - @Specialization - static Object iterator(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, "arrayiterator"); - } - } - - @Builtin(name = "callable_iterator", takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PSentinelIterator, isPublic = false) - @GenerateNodeFactory - public abstract static class CallableIteratorTypeNode extends PythonBuiltinNode { - @SuppressWarnings("unused") - @Specialization - static Object iterator(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, "callable_iterator"); - } - } - - @Builtin(name = "foreign_iterator", takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PForeignArrayIterator, isPublic = false) - @GenerateNodeFactory - public abstract static class ForeignIteratorTypeNode extends PythonBuiltinNode { - @SuppressWarnings("unused") - @Specialization - static Object iterator(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, "foreign_iterator"); - } - } - - @Builtin(name = "generator", takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PGenerator, isPublic = false) - @GenerateNodeFactory - public abstract static class GeneratorTypeNode extends PythonBuiltinNode { - @SuppressWarnings("unused") - @Specialization - static Object generator(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, "generator"); - } - } - - @Builtin(name = "method", minNumOfPositionalArgs = 3, constructsClass = PythonBuiltinClassType.PMethod, isPublic = false, doc = "Create a bound instance method object.") - @GenerateNodeFactory - public abstract static class MethodTypeNode extends PythonTernaryBuiltinNode { - @Specialization - static Object method(Object cls, PFunction func, Object self, - @Shared @Cached PythonObjectFactory factory) { - return factory.createMethod(cls, self, func); - } - - @Specialization - static Object methodBuiltin(@SuppressWarnings("unused") Object cls, PBuiltinFunction func, Object self, - @Shared @Cached PythonObjectFactory factory) { - return factory.createMethod(self, func); - } - - @Specialization - static Object methodGeneric(@SuppressWarnings("unused") Object cls, Object func, Object self, - @Bind("this") Node inliningTarget, - @Cached PyCallableCheckNode callableCheck, - @Shared @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (callableCheck.execute(inliningTarget, func)) { - return factory.createMethod(self, func); - } else { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.FIRST_ARG_MUST_BE_CALLABLE_S, ""); - } - } - } - - @Builtin(name = "builtin_function_or_method", minNumOfPositionalArgs = 3, constructsClass = PythonBuiltinClassType.PBuiltinFunctionOrMethod, isPublic = false) - @GenerateNodeFactory - public abstract static class BuiltinMethodTypeNode extends PythonBuiltinNode { - @Specialization - Object method(Object cls, Object self, PBuiltinFunction func, - @Cached PythonObjectFactory factory) { - return factory.createBuiltinMethod(cls, self, func); - } - } - - @Builtin(name = "frame", constructsClass = PythonBuiltinClassType.PFrame, isPublic = false) - @GenerateNodeFactory - public abstract static class FrameTypeNode extends PythonBuiltinNode { - @Specialization - static Object call( - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(RuntimeError, ErrorMessages.CANNOT_CALL_CTOR_OF, "frame type"); - } - } - - @Builtin(name = "TracebackType", constructsClass = PythonBuiltinClassType.PTraceback, isPublic = false, minNumOfPositionalArgs = 5, parameterNames = {"$cls", "tb_next", "tb_frame", "tb_lasti", - "tb_lineno"}) - @ArgumentClinic(name = "tb_lasti", conversion = ArgumentClinic.ClinicConversion.Index) - @ArgumentClinic(name = "tb_lineno", conversion = ArgumentClinic.ClinicConversion.Index) - @GenerateNodeFactory - public abstract static class TracebackTypeNode extends PythonClinicBuiltinNode { - @Specialization - static Object createTraceback(@SuppressWarnings("unused") Object cls, PTraceback next, PFrame pframe, int lasti, int lineno, - @Shared @Cached PythonObjectFactory factory) { - return factory.createTracebackWithLasti(pframe, lineno, lasti, next); - } - - @Specialization - static Object createTraceback(@SuppressWarnings("unused") Object cls, @SuppressWarnings("unused") PNone next, PFrame pframe, int lasti, int lineno, - @Shared @Cached PythonObjectFactory factory) { - return factory.createTracebackWithLasti(pframe, lineno, lasti, null); - } - - @Specialization(guards = {"!isPTraceback(next)", "!isNone(next)"}) - @SuppressWarnings("unused") - static Object errorNext(Object cls, Object next, Object frame, Object lasti, Object lineno, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.EXPECTED_TRACEBACK_OBJ_OR_NONE, next); - } - - @Specialization(guards = "!isPFrame(frame)") - @SuppressWarnings("unused") - static Object errorFrame(Object cls, Object next, Object frame, Object lasti, Object lineno, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.TRACEBACK_TYPE_ARG_MUST_BE_FRAME, frame); - } - - protected static boolean isPFrame(Object obj) { - return obj instanceof PFrame; - } - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return BuiltinConstructorsClinicProviders.TracebackTypeNodeClinicProviderGen.INSTANCE; - } - } - - @Builtin(name = "code", constructsClass = PythonBuiltinClassType.PCode, isPublic = false, minNumOfPositionalArgs = 16, numOfPositionalOnlyArgs = 18, parameterNames = { - "$cls", "argcount", "posonlyargcount", "kwonlyargcount", "nlocals", "stacksize", "flags", "codestring", - "constants", "names", "varnames", "filename", "name", "qualname", "firstlineno", - "linetable", "exceptiontable", "freevars", "cellvars"}) - @ArgumentClinic(name = "argcount", conversion = ArgumentClinic.ClinicConversion.Int) - @ArgumentClinic(name = "posonlyargcount", conversion = ArgumentClinic.ClinicConversion.Int) - @ArgumentClinic(name = "kwonlyargcount", conversion = ArgumentClinic.ClinicConversion.Int) - @ArgumentClinic(name = "nlocals", conversion = ArgumentClinic.ClinicConversion.Int) - @ArgumentClinic(name = "stacksize", conversion = ArgumentClinic.ClinicConversion.Int) - @ArgumentClinic(name = "flags", conversion = ArgumentClinic.ClinicConversion.Int) - @ArgumentClinic(name = "filename", conversion = ArgumentClinic.ClinicConversion.TString) - @ArgumentClinic(name = "name", conversion = ArgumentClinic.ClinicConversion.TString) - @ArgumentClinic(name = "qualname", conversion = ArgumentClinic.ClinicConversion.TString) - @ArgumentClinic(name = "firstlineno", conversion = ArgumentClinic.ClinicConversion.Int) - @GenerateNodeFactory - public abstract static class CodeConstructorNode extends PythonClinicBuiltinNode { - @Specialization - PCode call(VirtualFrame frame, @SuppressWarnings("unused") Object cls, int argcount, - int posonlyargcount, int kwonlyargcount, - int nlocals, int stacksize, int flags, - PBytes codestring, PTuple constants, PTuple names, PTuple varnames, - TruffleString filename, TruffleString name, TruffleString qualname, - int firstlineno, PBytes linetable, @SuppressWarnings("unused") PBytes exceptiontable, - PTuple freevars, PTuple cellvars, - @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Cached CodeNodes.CreateCodeNode createCodeNode, - @Cached GetObjectArrayNode getObjectArrayNode, - @Cached CastToTruffleStringNode castToTruffleStringNode) { - byte[] codeBytes = bufferLib.getCopiedByteArray(codestring); - byte[] linetableBytes = bufferLib.getCopiedByteArray(linetable); - - Object[] constantsArr = getObjectArrayNode.execute(inliningTarget, constants); - TruffleString[] namesArr = objectArrayToTruffleStringArray(inliningTarget, getObjectArrayNode.execute(inliningTarget, names), castToTruffleStringNode); - TruffleString[] varnamesArr = objectArrayToTruffleStringArray(inliningTarget, getObjectArrayNode.execute(inliningTarget, varnames), castToTruffleStringNode); - TruffleString[] freevarsArr = objectArrayToTruffleStringArray(inliningTarget, getObjectArrayNode.execute(inliningTarget, freevars), castToTruffleStringNode); - TruffleString[] cellcarsArr = objectArrayToTruffleStringArray(inliningTarget, getObjectArrayNode.execute(inliningTarget, cellvars), castToTruffleStringNode); - - return createCodeNode.execute(frame, argcount, posonlyargcount, kwonlyargcount, - nlocals, stacksize, flags, - codeBytes, constantsArr, namesArr, - varnamesArr, freevarsArr, cellcarsArr, - filename, name, qualname, - firstlineno, linetableBytes); - } - - @Fallback - @SuppressWarnings("unused") - static PCode call(Object cls, Object argcount, Object kwonlyargcount, Object posonlyargcount, - Object nlocals, Object stacksize, Object flags, - Object codestring, Object constants, Object names, Object varnames, - Object filename, Object name, Object qualname, - Object firstlineno, Object linetable, Object exceptiontable, - Object freevars, Object cellvars, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.INVALID_ARGS, "code"); - } - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return BuiltinConstructorsClinicProviders.CodeConstructorNodeClinicProviderGen.INSTANCE; - } - } - - @Builtin(name = "cell", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, constructsClass = PythonBuiltinClassType.PCell, isPublic = false) - @GenerateNodeFactory - public abstract static class CellTypeNode extends PythonBinaryBuiltinNode { - @CompilationFinal private Assumption sharedAssumption; - - private Assumption getAssumption() { - if (sharedAssumption == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - sharedAssumption = Truffle.getRuntime().createAssumption("cell is effectively final"); - } - if (CompilerDirectives.inCompiledCode()) { - return sharedAssumption; - } else { - return Truffle.getRuntime().createAssumption("cell is effectively final"); - } - } - - @Specialization - Object newCell(@SuppressWarnings("unused") Object cls, Object contents, - @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, - @Cached InlinedConditionProfile nonEmptyProfile) { - Assumption assumption = getAssumption(); - PCell cell = factory.createCell(assumption); - if (nonEmptyProfile.profile(inliningTarget, !isNoValue(contents))) { - cell.setRef(contents, assumption); - } - return cell; - } - } - - @Builtin(name = "BaseException", constructsClass = PythonBuiltinClassType.PBaseException, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, doc = "Common base class for all exceptions") - @GenerateNodeFactory - public abstract static class BaseExceptionNode extends PythonVarargsBuiltinNode { - @Override - public final Object varArgExecute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported { - if (arguments.length == 0) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw VarargsBuiltinDirectInvocationNotSupported.INSTANCE; - } - if (arguments.length == 1) { - return execute(frame, arguments[0], PythonUtils.EMPTY_OBJECT_ARRAY, keywords); - } - Object[] argsWithoutSelf = PythonUtils.arrayCopyOfRange(arguments, 1, arguments.length); - return execute(frame, arguments[0], argsWithoutSelf, keywords); - } - - @Specialization(guards = "!needsNativeAllocationNode.execute(inliningTarget, cls)", limit = "1") - static Object doManaged(Object cls, @SuppressWarnings("unused") Object[] args, @SuppressWarnings("unused") PKeyword[] kwargs, - @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached TypeNodes.NeedsNativeAllocationNode needsNativeAllocationNode, - @Shared @Cached PythonObjectFactory factory, - @Cached InlinedConditionProfile argsProfile) { - PTuple argsTuple; - if (argsProfile.profile(inliningTarget, args.length == 0)) { - argsTuple = null; - } else { - argsTuple = factory.createTuple(args); - } - return factory.createBaseException(cls, null, argsTuple); - } - - @Specialization(guards = "needsNativeAllocationNode.execute(inliningTarget, cls)", limit = "1") - static Object doNativeSubtype(Object cls, Object[] args, @SuppressWarnings("unused") PKeyword[] kwargs, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached TypeNodes.NeedsNativeAllocationNode needsNativeAllocationNode, - @Shared @Cached PythonObjectFactory factory, - @Cached PCallCapiFunction callCapiFunction, - @Cached PythonToNativeNode toNativeNode, - @Cached NativeToPythonTransferNode toPythonNode, - @Cached ExternalFunctionNodes.DefaultCheckFunctionResultNode checkFunctionResultNode) { - Object argsTuple = args.length > 0 ? factory.createTuple(args) : factory.createEmptyTuple(); - Object nativeResult = callCapiFunction.call(NativeCAPISymbol.FUN_EXCEPTION_SUBTYPE_NEW, toNativeNode.execute(cls), toNativeNode.execute(argsTuple)); - return toPythonNode.execute(checkFunctionResultNode.execute(PythonContext.get(inliningTarget), NativeCAPISymbol.FUN_EXCEPTION_SUBTYPE_NEW.getTsName(), nativeResult)); - } - } - - @Builtin(name = "BaseExceptionGroup", constructsClass = PythonBuiltinClassType.PBaseExceptionGroup, minNumOfPositionalArgs = 3, doc = "A combination of multiple unrelated exceptions.") - @GenerateNodeFactory - public abstract static class BaseExceptionGroupNode extends PythonTernaryBuiltinNode { - - @Specialization - static Object doManaged(VirtualFrame frame, Object cls, Object messageObj, Object exceptionsObj, - @Bind("this") Node inliningTarget, - @Cached CastToTruffleStringNode castToStringNode, - @Cached PythonObjectFactory factory, - @Cached PySequenceCheckNode sequenceCheckNode, - @Cached TupleNodes.ConstructTupleNode toTupleNode, - @Cached SequenceStorageNodes.ToArrayNode toArrayNode, - @Cached PyObjectGetAttr getAttr, - @Cached InlinedLoopConditionProfile loopConditionProfile, - @Cached GetClassNode getClassNode, - @Cached BuiltinClassProfiles.IsBuiltinClassProfile exceptionProfile, - @Cached BuiltinClassProfiles.IsBuiltinClassProfile baseExceptionProfile, - @Cached TypeNodes.IsSameTypeNode isSameTypeNode, - @Cached PRaiseNode.Lazy raiseNode) { - TruffleString message; - try { - message = castToStringNode.execute(inliningTarget, messageObj); - } catch (CannotCastException ex) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.ARG_D_MUST_BE_S_NOT_P, "BaseExceptionGroup", 1, "str", messageObj); - } - if (!sequenceCheckNode.execute(inliningTarget, exceptionsObj)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.SECOND_ARGUMENT_EXCEPTIONS_MUST_BE_A_SEQUENCE); - } - PTuple exceptionsTuple = toTupleNode.execute(frame, exceptionsObj); - Object[] exceptions = toArrayNode.execute(inliningTarget, exceptionsTuple.getSequenceStorage()); - if (exceptions.length == 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.SECOND_ARGUMENT_EXCEPTIONS_MUST_BE_A_NON_EMPTY_SEQUENCE); - } - PythonContext context = PythonContext.get(inliningTarget); - Object exceptionGroupType = getAttr.execute(inliningTarget, context.getBuiltins(), T_EXCEPTION_GROUP); - boolean nestedBaseExceptions = false; - loopConditionProfile.profileCounted(inliningTarget, exceptions.length); - for (int i = 0; loopConditionProfile.inject(inliningTarget, i < exceptions.length); i++) { - Object exceptionType = getClassNode.execute(inliningTarget, exceptions[i]); - if (exceptionProfile.profileClass(inliningTarget, exceptionType, PythonBuiltinClassType.Exception)) { - continue; - } - if (baseExceptionProfile.profileClass(inliningTarget, exceptionType, PythonBuiltinClassType.PBaseException)) { - nestedBaseExceptions = true; - } else { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.ITEM_D_OF_SECOND_ARGUMENT_EXCEPTIONS_IS_NOT_AN_EXCEPTION, i); - } - } - if (isSameTypeNode.execute(inliningTarget, cls, PythonBuiltinClassType.PBaseExceptionGroup)) { - if (!nestedBaseExceptions) { - /* - * All nested exceptions are Exception subclasses, wrap them in an - * ExceptionGroup - */ - cls = exceptionGroupType; - } - } else if (isSameTypeNode.execute(inliningTarget, cls, exceptionGroupType)) { - if (nestedBaseExceptions) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANNOT_NEST_BASE_EXCEPTIONS_IN_AN_EXCEPTION_GROUP); - } - } else { - /* user-defined subclass */ - if (nestedBaseExceptions && exceptionProfile.profileClass(inliningTarget, cls, PythonBuiltinClassType.Exception)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANNOT_NEST_BASE_EXCEPTIONS_IN_N, cls); - } - } - return factory.createBaseExceptionGroup(cls, message, exceptions, new Object[]{messageObj, exceptionsObj}); - } - } - - @Builtin(name = "mappingproxy", constructsClass = PythonBuiltinClassType.PMappingproxy, isPublic = false, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class MappingproxyNode extends PythonBinaryBuiltinNode { - @Specialization(guards = "!isNoValue(obj)") - static Object doMapping(Object klass, Object obj, - @Bind("this") Node inliningTarget, - @Cached PyMappingCheckNode mappingCheckNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - // descrobject.c mappingproxy_check_mapping() - if (!(obj instanceof PList || obj instanceof PTuple) && mappingCheckNode.execute(inliningTarget, obj)) { - return factory.createMappingproxy(klass, obj); - } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_ARG_MUST_BE_S_NOT_P, "mappingproxy()", "mapping", obj); - } - - @Specialization(guards = "isNoValue(none)") - @SuppressWarnings("unused") - static Object doMissing(Object klass, PNone none, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.MISSING_D_REQUIRED_S_ARGUMENT_S_POS, "mappingproxy()", "mapping", 1); - } - } - - abstract static class DescriptorNode extends PythonBuiltinNode { - @TruffleBoundary - protected final void denyInstantiationAfterInitialization(TruffleString name) { - if (getContext().isCoreInitialized()) { - throw PRaiseNode.raiseUncached(this, TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, name); - } - } - - protected static Object ensure(Object value) { - return value == PNone.NO_VALUE ? null : value; - } - } - - @Builtin(name = J_GETSET_DESCRIPTOR, constructsClass = PythonBuiltinClassType.GetSetDescriptor, isPublic = false, minNumOfPositionalArgs = 1, // - parameterNames = {"cls", "fget", "fset", "name", "owner"}) - @GenerateNodeFactory - public abstract static class GetSetDescriptorNode extends DescriptorNode { - @Specialization(guards = "isPythonClass(owner)") - @TruffleBoundary - Object call(@SuppressWarnings("unused") Object clazz, Object get, Object set, TruffleString name, Object owner) { - denyInstantiationAfterInitialization(T_GETSET_DESCRIPTOR); - return PythonObjectFactory.getUncached().createGetSetDescriptor(ensure(get), ensure(set), name, owner); - } - } - - @Builtin(name = J_MEMBER_DESCRIPTOR, constructsClass = PythonBuiltinClassType.MemberDescriptor, isPublic = false, minNumOfPositionalArgs = 1, // - parameterNames = {"cls", "fget", "fset", "name", "owner"}) - @GenerateNodeFactory - public abstract static class MemberDescriptorNode extends DescriptorNode { - @Specialization(guards = "isPythonClass(owner)") - @TruffleBoundary - Object doGeneric(@SuppressWarnings("unused") Object clazz, Object get, Object set, TruffleString name, Object owner) { - denyInstantiationAfterInitialization(T_MEMBER_DESCRIPTOR); - return PythonObjectFactory.getUncached().createGetSetDescriptor(ensure(get), ensure(set), name, owner); - } - } - - @Builtin(name = J_WRAPPER_DESCRIPTOR, constructsClass = PythonBuiltinClassType.WrapperDescriptor, isPublic = false, minNumOfPositionalArgs = 1, // - parameterNames = {"cls", "fget", "fset", "name", "owner"}) - @GenerateNodeFactory - public abstract static class WrapperDescriptorNode extends DescriptorNode { - @Specialization(guards = "isPythonClass(owner)") - @TruffleBoundary - Object doGeneric(@SuppressWarnings("unused") Object clazz, Object get, Object set, TruffleString name, Object owner) { - denyInstantiationAfterInitialization(T_WRAPPER_DESCRIPTOR); - return PythonObjectFactory.getUncached().createGetSetDescriptor(ensure(get), ensure(set), name, owner); - } - } - - // slice(stop) - // slice(start, stop[, step]) - @Builtin(name = "slice", minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 4, constructsClass = PythonBuiltinClassType.PSlice, doc = """ - slice(stop) - slice(start, stop[, step]) - - Create a slice object. This is used for extended slicing (e.g. a[0:10:2]).""") - @GenerateNodeFactory - abstract static class SliceNode extends PythonQuaternaryBuiltinNode { - @Specialization(guards = {"isNoValue(second)"}) - @SuppressWarnings("unused") - static Object singleArg(Object cls, Object first, Object second, Object third, - @Bind("this") Node inliningTarget, - @Shared @Cached PySliceNew sliceNode) { - return sliceNode.execute(inliningTarget, PNone.NONE, first, PNone.NONE); - } - - @Specialization(guards = {"!isNoValue(stop)", "isNoValue(step)"}) - @SuppressWarnings("unused") - static Object twoArgs(Object cls, Object start, Object stop, Object step, - @Bind("this") Node inliningTarget, - @Shared @Cached PySliceNew sliceNode) { - return sliceNode.execute(inliningTarget, start, stop, PNone.NONE); - } - - @Fallback - static Object threeArgs(@SuppressWarnings("unused") Object cls, Object start, Object stop, Object step, - @Bind("this") Node inliningTarget, - @Shared @Cached PySliceNew sliceNode) { - return sliceNode.execute(inliningTarget, start, stop, step); - } - } - - // memoryview(obj) - @Builtin(name = J_MEMORYVIEW, minNumOfPositionalArgs = 2, parameterNames = {"$cls", "object"}, constructsClass = PythonBuiltinClassType.PMemoryView, // - doc = "Create a new memoryview object which references the given object.") - @GenerateNodeFactory - public abstract static class MemoryViewNode extends PythonBuiltinNode { - - public abstract PMemoryView execute(VirtualFrame frame, Object cls, Object object); - - public final PMemoryView execute(VirtualFrame frame, Object object) { - return execute(frame, PythonBuiltinClassType.PMemoryView, object); - } - - @Specialization - PMemoryView fromObject(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object object, - @Cached PyMemoryViewFromObject memoryViewFromObject) { - return memoryViewFromObject.execute(frame, object); - } - - @NeverDefault - public static MemoryViewNode create() { - return BuiltinConstructorsFactory.MemoryViewNodeFactory.create(null); - } - } - - // super() - @Builtin(name = J_SUPER, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 3, constructsClass = PythonBuiltinClassType.Super, doc = """ - super() -> same as super(__class__, ) - super(type) -> unbound super object - super(type, obj) -> bound super object; requires isinstance(obj, type) - super(type, type2) -> bound super object; requires issubclass(type2, type) - Typical use to call a cooperative superclass method: - class C(B): - def meth(self, arg): - super().meth(arg) - This works for class methods too: - class C(B): - @classmethod - def cmeth(cls, arg): - super().cmeth(arg)""") - @GenerateNodeFactory - public abstract static class SuperInitNode extends PythonTernaryBuiltinNode { - @Specialization - static Object doObjectIndirect(Object self, @SuppressWarnings("unused") Object type, @SuppressWarnings("unused") Object object, - @Cached PythonObjectFactory factory) { - return factory.createSuperObject(self); - } - } - - @Builtin(name = J_CLASSMETHOD, minNumOfPositionalArgs = 2, constructsClass = PythonBuiltinClassType.PClassmethod, doc = """ - classmethod(function) -> method - - Convert a function to be a class method. - - A class method receives the class as implicit first argument, - just like an instance method receives the instance. - To declare a class method, use this idiom: - - class C: - @classmethod - def f(cls, arg1, arg2, argN): - ... - - It can be called either on the class (e.g. C.f()) or on an instance - (e.g. C().f()). The instance is ignored except for its class. - If a class method is called for a derived class, the derived class - object is passed as the implied first argument. - - Class methods are different than C++ or Java static methods. - If you want those, see the staticmethod builtin.""") - @GenerateNodeFactory - public abstract static class ClassmethodNode extends PythonBinaryBuiltinNode { - @Specialization - static Object doObjectIndirect(Object self, @SuppressWarnings("unused") Object callable, - @Cached PythonObjectFactory factory) { - return factory.createClassmethod(self); - } - } - - @Builtin(name = J_INSTANCEMETHOD, minNumOfPositionalArgs = 2, constructsClass = PythonBuiltinClassType.PInstancemethod, isPublic = false, doc = "instancemethod(function)\n\nBind a function to a class.") - @GenerateNodeFactory - public abstract static class InstancemethodNode extends PythonBinaryBuiltinNode { - @Specialization - static Object doObjectIndirect(Object self, @SuppressWarnings("unused") Object callable, - @Cached PythonObjectFactory factory) { - return factory.createInstancemethod(self); - } - } - - @Builtin(name = J_STATICMETHOD, minNumOfPositionalArgs = 2, constructsClass = PythonBuiltinClassType.PStaticmethod, doc = """ - staticmethod(function) -> method - - Convert a function to be a static method. - - A static method does not receive an implicit first argument. - To declare a static method, use this idiom: - - class C: - @staticmethod - def f(arg1, arg2, argN): - ... - - It can be called either on the class (e.g. C.f()) or on an instance - (e.g. C().f()). Both the class and the instance are ignored, and - neither is passed implicitly as the first argument to the method. - - Static methods in Python are similar to those found in Java or C++. - For a more advanced concept, see the classmethod builtin.""") - @GenerateNodeFactory - public abstract static class StaticmethodNode extends PythonBinaryBuiltinNode { - @Specialization - static Object doObjectIndirect(Object self, @SuppressWarnings("unused") Object callable, - @Cached PythonObjectFactory factory) { - return factory.createStaticmethod(self); - } - } - - @Builtin(name = J_MAP, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PMap, doc = """ - map(func, *iterables) --> map object - - Make an iterator that computes the function using arguments from - each of the iterables. Stops when the shortest iterable is exhausted.""") - @GenerateNodeFactory - public abstract static class MapNode extends PythonVarargsBuiltinNode { - @Specialization - static PMap doit(VirtualFrame frame, Object cls, Object[] args, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Cached(inline = false /* uncommon path */) TypeNodes.HasObjectInitNode hasObjectInitNode, - @Cached InlinedLoopConditionProfile loopProfile, - @Cached PyObjectGetIter getIter, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (keywords.length > 0 && hasObjectInitNode.executeCached(cls)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "map()"); - } - if (args.length < 2) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MAP_MUST_HAVE_AT_LEAST_TWO_ARGUMENTS); - } - PMap map = factory.createMap(cls); - map.setFunction(args[0]); - Object[] iterators = new Object[args.length - 1]; - loopProfile.profileCounted(inliningTarget, iterators.length); - for (int i = 0; loopProfile.inject(inliningTarget, i < iterators.length); i++) { - iterators[i] = getIter.execute(frame, inliningTarget, args[i + 1]); - } - map.setIterators(iterators); - return map; - } - } - - @Builtin(name = J_PROPERTY, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PProperty, doc = """ - Property attribute. - - fget - function to be used for getting an attribute value - fset - function to be used for setting an attribute value - fdel - function to be used for del'ing an attribute - doc - docstring - - Typical use is to define a managed attribute x: - - class C(object): - def getx(self): return self._x - def setx(self, value): self._x = value - def delx(self): del self._x - x = property(getx, setx, delx, "I'm the 'x' property.") - - Decorators make defining new properties or modifying existing ones easy: - - class C(object): - @property - def x(self): - "I am the 'x' property." - return self._x - @x.setter - def x(self, value): - self._x = value - @x.deleter - def x(self): - del self._x""") - @GenerateNodeFactory - public abstract static class PropertyNode extends PythonVarargsBuiltinNode { - @Specialization - static PProperty doit(Object self, @SuppressWarnings("unused") Object[] args, @SuppressWarnings("unused") PKeyword[] keywords, - @Cached PythonObjectFactory factory) { - return factory.createProperty(self); - } - } - - @Builtin(name = "SimpleNamespace", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, isPublic = false, constructsClass = PythonBuiltinClassType.PSimpleNamespace, doc = "A simple attribute-based namespace.\n" + - "\n" + - "SimpleNamespace(**kwargs)") - @GenerateNodeFactory - public abstract static class SimpleNamespaceNode extends PythonVarargsBuiltinNode { - @Specialization - static PSimpleNamespace doit(Object self, @SuppressWarnings("unused") Object[] args, @SuppressWarnings("unused") PKeyword[] keywords, - @Cached PythonObjectFactory factory) { - return factory.createSimpleNamespace(self); - } - } - - @Builtin(name = "GenericAlias", minNumOfPositionalArgs = 3, constructsClass = PythonBuiltinClassType.PGenericAlias) - @GenerateNodeFactory - abstract static class GenericAliasNode extends PythonTernaryBuiltinNode { - @Specialization - static PGenericAlias doit(Object cls, Object origin, Object arguments, - @Cached PythonObjectFactory factory) { - return factory.createGenericAlias(cls, origin, arguments, false); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java index 0879085729..4eb603c884 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -27,11 +27,12 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.DeprecationWarning; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.RuntimeError; +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.StopIteration; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SyntaxError; import static com.oracle.graal.python.builtins.modules.io.IONodes.T_FLUSH; import static com.oracle.graal.python.builtins.modules.io.IONodes.T_WRITE; +import static com.oracle.graal.python.builtins.objects.PNone.NONE; import static com.oracle.graal.python.builtins.objects.PNone.NO_VALUE; -import static com.oracle.graal.python.builtins.objects.PNotImplemented.NOT_IMPLEMENTED; import static com.oracle.graal.python.compiler.RaisePythonExceptionErrorCallback.raiseSyntaxError; import static com.oracle.graal.python.nodes.BuiltinNames.J_ABS; import static com.oracle.graal.python.nodes.BuiltinNames.J_ALL; @@ -74,6 +75,7 @@ import static com.oracle.graal.python.nodes.BuiltinNames.T_BREAKPOINTHOOK; import static com.oracle.graal.python.nodes.BuiltinNames.T_EVAL; import static com.oracle.graal.python.nodes.BuiltinNames.T_EXEC; +import static com.oracle.graal.python.nodes.BuiltinNames.T_NOT_IMPLEMENTED; import static com.oracle.graal.python.nodes.BuiltinNames.T_STDOUT; import static com.oracle.graal.python.nodes.BuiltinNames.T_SYS; import static com.oracle.graal.python.nodes.BuiltinNames.T___BUILTINS__; @@ -83,7 +85,6 @@ import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DICT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FORMAT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MRO_ENTRIES__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEXT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ROUND__; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; import static com.oracle.graal.python.nodes.StringLiterals.T_FALSE; @@ -108,6 +109,7 @@ import java.util.Arrays; import java.util.EnumSet; import java.util.List; +import java.util.logging.Level; import com.oracle.graal.python.PythonFileDetector; import com.oracle.graal.python.PythonLanguage; @@ -122,6 +124,7 @@ import com.oracle.graal.python.builtins.modules.io.IOModuleBuiltins; import com.oracle.graal.python.builtins.modules.io.IONodes; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.PNotImplemented; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary; import com.oracle.graal.python.builtins.objects.bytes.PByteArray; @@ -141,34 +144,43 @@ import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetObjectArrayNode; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.builtins.objects.dict.PDict; -import com.oracle.graal.python.builtins.objects.floats.FloatBuiltins; +import com.oracle.graal.python.builtins.objects.ellipsis.EllipsisBuiltins; +import com.oracle.graal.python.builtins.objects.ellipsis.PEllipsis; import com.oracle.graal.python.builtins.objects.frame.PFrame; import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.builtins.objects.function.PFunction; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.builtins.objects.iterator.PDoubleSequenceIterator; +import com.oracle.graal.python.builtins.objects.iterator.PIntegerSequenceIterator; +import com.oracle.graal.python.builtins.objects.iterator.PLongSequenceIterator; import com.oracle.graal.python.builtins.objects.list.ListBuiltins; import com.oracle.graal.python.builtins.objects.list.ListBuiltins.ListSortNode; import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.builtins.objects.object.ObjectNodes; -import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.builtins.objects.type.TypeBuiltins; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.CallSlotTpIterNextNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotUnaryFunc.CallSlotUnaryNode; import com.oracle.graal.python.compiler.Compiler; import com.oracle.graal.python.compiler.RaisePythonExceptionErrorCallback; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.lib.IteratorExhausted; import com.oracle.graal.python.lib.PyCallableCheckNode; import com.oracle.graal.python.lib.PyEvalGetGlobals; import com.oracle.graal.python.lib.PyEvalGetLocals; +import com.oracle.graal.python.lib.PyIterCheckNode; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyMappingCheckNode; +import com.oracle.graal.python.lib.PyNumberAbsoluteNode; import com.oracle.graal.python.lib.PyNumberAddNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; +import com.oracle.graal.python.lib.PyNumberDivmodNode; import com.oracle.graal.python.lib.PyNumberIndexNode; +import com.oracle.graal.python.lib.PyNumberPowerNode; import com.oracle.graal.python.lib.PyObjectAsciiNode; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.lib.PyObjectDir; @@ -180,12 +192,14 @@ import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.lib.PyObjectLookupAttrO; import com.oracle.graal.python.lib.PyObjectReprAsObjectNode; +import com.oracle.graal.python.lib.PyObjectRichCompareBool; import com.oracle.graal.python.lib.PyObjectSetAttrO; import com.oracle.graal.python.lib.PyObjectSetItem; import com.oracle.graal.python.lib.PyObjectSizeNode; import com.oracle.graal.python.lib.PyObjectStrAsObjectNode; import com.oracle.graal.python.lib.PyObjectStrAsTruffleStringNode; import com.oracle.graal.python.lib.PyUnicodeFSDecoderNode; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.BuiltinNames; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PConstructAndRaiseNode; @@ -196,28 +210,20 @@ import com.oracle.graal.python.nodes.SpecialMethodNames; import com.oracle.graal.python.nodes.StringLiterals; import com.oracle.graal.python.nodes.argument.ReadArgumentNode; -import com.oracle.graal.python.nodes.attributes.DeleteAttributeNode; import com.oracle.graal.python.nodes.attributes.GetAttributeNode; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; import com.oracle.graal.python.nodes.builtins.ListNodes; import com.oracle.graal.python.nodes.builtins.ListNodes.ConstructListNode; import com.oracle.graal.python.nodes.bytecode.GetAIterNode; import com.oracle.graal.python.nodes.bytecode.PBytecodeRootNode; -import com.oracle.graal.python.nodes.call.CallDispatchNode; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode; +import com.oracle.graal.python.nodes.call.CallDispatchers; import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.call.GenericInvokeNode; import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode; import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallTernaryNode; import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; +import com.oracle.graal.python.nodes.call.special.SpecialMethodNotFound; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; -import com.oracle.graal.python.nodes.expression.BinaryArithmetic; -import com.oracle.graal.python.nodes.expression.BinaryComparisonNode; -import com.oracle.graal.python.nodes.expression.BinaryOpNode; -import com.oracle.graal.python.nodes.expression.CoerceToBooleanNode; -import com.oracle.graal.python.nodes.expression.TernaryArithmetic; import com.oracle.graal.python.nodes.frame.GetFrameLocalsNode; import com.oracle.graal.python.nodes.frame.ReadCallerFrameNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; @@ -229,10 +235,11 @@ import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; +import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassExactProfile; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.object.GetOrCreateDictNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaLongExactNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; @@ -249,11 +256,12 @@ import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.BoolSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.IntSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.CharsetMapping; +import com.oracle.graal.python.util.OverflowException; import com.oracle.graal.python.util.PythonUtils; import com.oracle.graal.python.util.Supplier; import com.oracle.truffle.api.CallTarget; @@ -264,6 +272,7 @@ import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.TruffleLanguage.Env; +import com.oracle.truffle.api.bytecode.OperationProxy; import com.oracle.truffle.api.debug.Debugger; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -289,7 +298,6 @@ import com.oracle.truffle.api.nodes.LoopNode; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.RootNode; -import com.oracle.truffle.api.nodes.UnexpectedResultException; import com.oracle.truffle.api.profiles.ConditionProfile; import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.profiles.InlinedConditionProfile; @@ -299,7 +307,6 @@ import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.strings.TruffleString.Encoding; import com.oracle.truffle.api.strings.TruffleStringBuilder; -import com.oracle.truffle.api.utilities.TriState; @CoreFunctions(defineModule = J_BUILTINS, isEager = true) public final class BuiltinFunctions extends PythonBuiltins { @@ -315,6 +322,8 @@ public void initialize(Python3Core core) { addBuiltinConstant(T_NONE, PNone.NONE); addBuiltinConstant(T_FALSE, false); addBuiltinConstant(T_TRUE, true); + addBuiltinConstant(T_NOT_IMPLEMENTED, PNotImplemented.NOT_IMPLEMENTED); + addBuiltinConstant(EllipsisBuiltins.T_ELLIPSIS, PEllipsis.INSTANCE); super.initialize(core); } @@ -329,26 +338,11 @@ public void postInitialize(Python3Core core) { @Builtin(name = J_ABS, minNumOfPositionalArgs = 1, numOfPositionalOnlyArgs = 1, parameterNames = "x") @GenerateNodeFactory public abstract static class AbsNode extends PythonUnaryBuiltinNode { - @Specialization - static Object absInt(int arg) { - return PInt.abs(arg); - } - - @Specialization - static double absDouble(double arg) { - return Math.abs(arg); - } @Specialization static Object absObject(VirtualFrame frame, Object object, - @Bind("this") Node inliningTarget, - @Cached("create(T___ABS__)") LookupAndCallUnaryNode callAbs, - @Cached PRaiseNode.Lazy raiseNode) { - Object result = callAbs.executeObject(frame, object); - if (result == NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.BAD_OPERAND_FOR, "", "abs()", object); - } - return result; + @Cached PyNumberAbsoluteNode absoluteNode) { + return absoluteNode.execute(frame, object); } } @@ -415,11 +409,11 @@ static boolean doGenericSequence(VirtualFrame frame, Node inliningTarget, Sequen for (int i = 0; loopConditionProfile.profile(inliningTarget, i < seqLength); i++) { if (nodeType == AnyOrAllNodeType.ALL && - earlyExitProfile.profile(inliningTarget, !isTrueNode.execute(frame, inliningTarget, getItem.execute(inliningTarget, sequenceStorage, i)))) { + earlyExitProfile.profile(inliningTarget, !isTrueNode.execute(frame, getItem.execute(inliningTarget, sequenceStorage, i)))) { LoopNode.reportLoopCount(inliningTarget, i); return false; } else if (nodeType == AnyOrAllNodeType.ANY && - earlyExitProfile.profile(inliningTarget, isTrueNode.execute(frame, inliningTarget, getItem.execute(inliningTarget, sequenceStorage, i)))) { + earlyExitProfile.profile(inliningTarget, isTrueNode.execute(frame, getItem.execute(inliningTarget, sequenceStorage, i)))) { LoopNode.reportLoopCount(inliningTarget, i); return true; } @@ -448,10 +442,10 @@ protected boolean doHashStorage(VirtualFrame frame, HashingStorage hashingStorag while (loopConditionProfile.profile(inliningTarget, getIterNext.execute(inliningTarget, hashingStorage, it))) { Object key = getIterKey.execute(inliningTarget, hashingStorage, it); if (nodeType == AnyOrAllNodeType.ALL) { - if (!isTrueNode.execute(frame, inliningTarget, key)) { + if (!isTrueNode.execute(frame, key)) { return false; } - } else if (nodeType == AnyOrAllNodeType.ANY && isTrueNode.execute(frame, inliningTarget, key)) { + } else if (nodeType == AnyOrAllNodeType.ANY && isTrueNode.execute(frame, key)) { return true; } } @@ -487,21 +481,19 @@ static boolean doHashColl(VirtualFrame frame, PHashingCollection object, static boolean doObject(VirtualFrame frame, Object object, @Bind("this") Node inliningTarget, @Cached PyObjectGetIter getIter, - @Cached GetNextNode nextNode, - @Cached IsBuiltinObjectProfile errorProfile, + @Cached PyIterNextNode nextNode, @Cached PyObjectIsTrueNode isTrueNode) { Object iterator = getIter.execute(frame, inliningTarget, object); int nbrIter = 0; while (true) { try { - Object next = nextNode.execute(frame, iterator); + Object next = nextNode.execute(frame, inliningTarget, iterator); nbrIter++; - if (!isTrueNode.execute(frame, inliningTarget, next)) { + if (!isTrueNode.execute(frame, next)) { return false; } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); + } catch (IteratorExhausted e) { break; } finally { LoopNode.reportLoopCount(inliningTarget, nbrIter); @@ -540,21 +532,19 @@ static boolean doHashColl(VirtualFrame frame, PHashingCollection object, static boolean doObject(VirtualFrame frame, Object object, @Bind("this") Node inliningTarget, @Cached PyObjectGetIter getIter, - @Cached GetNextNode nextNode, - @Cached IsBuiltinObjectProfile errorProfile, + @Cached PyIterNextNode nextNode, @Cached PyObjectIsTrueNode isTrueNode) { Object iterator = getIter.execute(frame, inliningTarget, object); int nbrIter = 0; while (true) { try { - Object next = nextNode.execute(frame, iterator); + Object next = nextNode.execute(frame, inliningTarget, iterator); nbrIter++; - if (isTrueNode.execute(frame, inliningTarget, next)) { + if (isTrueNode.execute(frame, next)) { return true; } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); + } catch (IteratorExhausted e) { break; } finally { LoopNode.reportLoopCount(inliningTarget, nbrIter); @@ -567,7 +557,7 @@ static boolean doObject(VirtualFrame frame, Object object, @GenerateInline @GenerateCached(false) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerTypes.class) abstract static class BinOctHexHelperNode extends Node { @FunctionalInterface @@ -608,13 +598,6 @@ static TruffleString doL(Node inliningTarget, long x, TruffleString prefix, int return buildString(x < 0, prefix, fromJavaStringNode.execute(longToString.convert(Math.abs(x)), TS_ENCODING)); } - @Specialization - @SuppressWarnings("unused") - static TruffleString doD(double x, TruffleString prefix, int radix, LongToString longToString, - @Cached(inline = false) PRaiseNode raise) { - throw raise.raiseIntegerInterpretationError(x); - } - @Specialization static TruffleString doPI(PInt x, TruffleString prefix, int radix, @SuppressWarnings("unused") LongToString longToString, @Shared @Cached(inline = false) TruffleString.FromJavaStringNode fromJavaStringNode) { @@ -622,7 +605,7 @@ static TruffleString doPI(PInt x, TruffleString prefix, int radix, @SuppressWarn return buildString(value.signum() < 0, prefix, fromJavaStringNode.execute(bigToString(radix, PInt.abs(value)), TS_ENCODING)); } - @Specialization(replaces = {"doL", "doD", "doPI"}) + @Specialization(replaces = {"doL", "doPI"}) static TruffleString doO(VirtualFrame frame, Node inliningTarget, Object x, TruffleString prefix, int radix, LongToString longToString, @Exclusive @Cached InlinedConditionProfile isMinLong, @Cached PyNumberIndexNode indexNode, @@ -643,14 +626,13 @@ static TruffleString doO(VirtualFrame frame, Node inliningTarget, Object x, Truf return doPI((PInt) index, prefix, radix, longToString, fromJavaStringNode); } else { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, PythonBuiltinClassType.NotImplementedError, toTruffleStringUncached("bin/oct/hex with native integer subclasses")); + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.NotImplementedError, toTruffleStringUncached("bin/oct/hex with native integer subclasses")); } } } // bin(object) @Builtin(name = J_BIN, minNumOfPositionalArgs = 1) - @TypeSystemReference(PythonArithmeticTypes.class) @GenerateNodeFactory public abstract static class BinNode extends PythonUnaryBuiltinNode { static final TruffleString T_BIN_PREFIX = tsLiteral("0b"); @@ -670,7 +652,6 @@ private static String longToString(long x) { // oct(object) @Builtin(name = J_OCT, minNumOfPositionalArgs = 1) - @TypeSystemReference(PythonArithmeticTypes.class) @GenerateNodeFactory public abstract static class OctNode extends PythonUnaryBuiltinNode { static final TruffleString T_OCT_PREFIX = tsLiteral("0o"); @@ -690,7 +671,6 @@ private static String longToString(long x) { // hex(object) @Builtin(name = J_HEX, minNumOfPositionalArgs = 1) - @TypeSystemReference(PythonArithmeticTypes.class) @GenerateNodeFactory public abstract static class HexNode extends PythonUnaryBuiltinNode { static final TruffleString T_HEX_PREFIX = tsLiteral("0x"); @@ -735,11 +715,11 @@ public abstract static class ChrNode extends PythonUnaryClinicBuiltinNode { static TruffleString charFromInt(int arg, @Bind("this") Node inliningTarget, @Cached TruffleString.FromCodePointNode fromCodePointNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (arg >= 0 && arg <= Character.MAX_CODE_POINT) { return fromCodePointNode.execute(arg, TS_ENCODING, true); } else { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.ARG_NOT_IN_RANGE, "chr()", "0x110000"); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.ARG_NOT_IN_RANGE, "chr()", "0x110000"); } } @@ -791,232 +771,127 @@ static Object dir(VirtualFrame frame, Object object, // divmod(a, b) @Builtin(name = J_DIVMOD, minNumOfPositionalArgs = 2) - @TypeSystemReference(PythonArithmeticTypes.class) @GenerateNodeFactory - @ImportStatic(BinaryArithmetic.class) public abstract static class DivModNode extends PythonBinaryBuiltinNode { - @Specialization(guards = "b != 0") - static PTuple doLong(long a, long b, - @Shared @Cached PythonObjectFactory factory) { - return factory.createTuple(new Object[]{Math.floorDiv(a, b), Math.floorMod(a, b)}); - } - - @Specialization(replaces = "doLong") - static PTuple doLongZero(long a, long b, - @Bind("this") Node inliningTarget, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - if (b == 0) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.ZeroDivisionError, ErrorMessages.INTEGER_DIVISION_BY_ZERO); - } - return factory.createTuple(new Object[]{Math.floorDiv(a, b), Math.floorMod(a, b)}); - } - - @Specialization - static PTuple doDouble(double a, double b, - @Bind("this") Node inliningTarget, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - if (b == 0) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.ZeroDivisionError, ErrorMessages.DIVISION_BY_ZERO); - } - double q = Math.floor(a / b); - return factory.createTuple(new Object[]{q, FloatBuiltins.ModNode.mod(a, b)}); - } @Specialization static Object doObject(VirtualFrame frame, Object a, Object b, - @Cached("DivMod.create()") BinaryOpNode callDivmod) { - return callDivmod.executeObject(frame, a, b); + @Bind("this") Node inliningTarget, + @Cached PyNumberDivmodNode divmodNode) { + return divmodNode.execute(frame, inliningTarget, a, b); } } - // eval(expression, globals=None, locals=None) - @Builtin(name = J_EVAL, minNumOfPositionalArgs = 1, parameterNames = {"expression", "globals", "locals"}) - @GenerateNodeFactory - public abstract static class EvalNode extends PythonBuiltinNode { - @Child protected CompileNode compileNode; - @Child private GenericInvokeNode invokeNode = GenericInvokeNode.create(); - @Child private GetOrCreateDictNode getOrCreateDictNode; - - final void assertNoFreeVars(Node inliningTarget, PCode code, PRaiseNode.Lazy raiseNode) { - Object[] freeVars = code.getFreeVars(); - if (freeVars.length > 0) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.CODE_OBJ_NO_FREE_VARIABLES, getMode()); - } - } - - protected TruffleString getMode() { - return T_EVAL; - } - - static boolean isMapping(Node inliningTarget, PyMappingCheckNode mappingCheckNode, Object object) { - return mappingCheckNode.execute(inliningTarget, object); - } - - static boolean isAnyNone(Object object) { - return object instanceof PNone; - } - - final PCode createAndCheckCode(VirtualFrame frame, Node inliningTarget, Object source, PRaiseNode.Lazy raiseNode) { - PCode code = getCompileNode().compile(frame, source, T_STRING_SOURCE, getMode(), -1, -1); - assertNoFreeVars(inliningTarget, code, raiseNode); - return code; - } - - private static void inheritGlobals(PFrame callerFrame, Object[] args) { - PArguments.setGlobals(args, callerFrame.getGlobals()); - } - - private static void inheritLocals(Node inliningTarget, PFrame callerFrame, Object[] args, GetFrameLocalsNode getFrameLocalsNode) { - Object callerLocals = getFrameLocalsNode.execute(inliningTarget, callerFrame); - setCustomLocals(args, callerLocals); - } - - private static void setCustomLocals(Object[] args, Object locals) { - PArguments.setSpecialArgument(args, locals); - } - - private void setBuiltinsInGlobals(VirtualFrame frame, Node inliningTarget, PDict globals, HashingCollectionNodes.SetItemNode setBuiltins, PythonModule builtins) { - if (builtins != null) { - PDict builtinsDict = getOrCreateDictNode(builtins); - setBuiltins.execute(frame, inliningTarget, globals, T___BUILTINS__, builtinsDict); - } else { - // This happens during context initialization - return; - } - } - - private void setCustomGlobals(VirtualFrame frame, Node inliningTarget, PDict globals, HashingCollectionNodes.SetItemNode setBuiltins, Object[] args) { - PythonModule builtins = getContext().getBuiltins(); - setBuiltinsInGlobals(frame, inliningTarget, globals, setBuiltins, builtins); - PArguments.setGlobals(args, globals); - } + @GenerateInline + @GenerateCached(false) + abstract static class CreateEvalExecArgumentsNode extends Node { + public abstract Object[] execute(VirtualFrame frame, Node inliningTarget, Object globals, Object locals, TruffleString mode); @Specialization - @SuppressWarnings("truffle-static-method") - Object execInheritGlobalsInheritLocals(VirtualFrame frame, Object source, @SuppressWarnings("unused") PNone globals, @SuppressWarnings("unused") PNone locals, - @Bind("this") Node inliningTarget, + static Object[] inheritGlobals(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") PNone globals, Object locals, TruffleString mode, @Exclusive @Cached ReadCallerFrameNode readCallerFrameNode, - @Exclusive @Cached CodeNodes.GetCodeCallTargetNode getCt, - @Cached GetFrameLocalsNode getFrameLocalsNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - PCode code = createAndCheckCode(frame, inliningTarget, source, raiseNode); + @Exclusive @Cached InlinedConditionProfile haveLocals, + @Exclusive @Cached PyMappingCheckNode mappingCheckNode, + @Exclusive @Cached GetFrameLocalsNode getFrameLocalsNode, + @Exclusive @Cached PRaiseNode raiseNode) { PFrame callerFrame = readCallerFrameNode.executeWith(frame, 0); Object[] args = PArguments.create(); - inheritGlobals(callerFrame, args); - inheritLocals(inliningTarget, callerFrame, args, getFrameLocalsNode); - - return invokeNode.execute(frame, getCt.execute(inliningTarget, code), args); + PArguments.setGlobals(args, callerFrame.getGlobals()); + if (haveLocals.profile(inliningTarget, locals instanceof PNone)) { + Object callerLocals = getFrameLocalsNode.execute(inliningTarget, callerFrame); + setCustomLocals(args, callerLocals); + } else { + if (!mappingCheckNode.execute(inliningTarget, locals)) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.LOCALS_MUST_BE_MAPPING, mode, locals); + } + setCustomLocals(args, locals); + } + return args; } @Specialization - Object execCustomGlobalsGlobalLocals(VirtualFrame frame, Object source, PDict globals, @SuppressWarnings("unused") PNone locals, - @Bind("this") Node inliningTarget, - @Shared @Cached HashingCollectionNodes.SetItemNode setBuiltins, - @Shared("getCt") @Cached CodeNodes.GetCodeCallTargetNode getCt, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - PCode code = createAndCheckCode(frame, inliningTarget, source, raiseNode); + static Object[] customGlobals(VirtualFrame frame, Node inliningTarget, PDict globals, Object locals, TruffleString mode, + @Bind PythonContext context, + @Exclusive @Cached InlinedConditionProfile haveLocals, + @Exclusive @Cached PyMappingCheckNode mappingCheckNode, + @Exclusive @Cached GetOrCreateDictNode getOrCreateDictNode, + @Exclusive @Cached HashingCollectionNodes.SetItemNode setBuiltins, + @Exclusive @Cached PRaiseNode raiseNode) { Object[] args = PArguments.create(); - setCustomGlobals(frame, inliningTarget, globals, setBuiltins, args); - setCustomLocals(args, globals); - RootCallTarget rootCallTarget = getCt.execute(inliningTarget, code); - if (rootCallTarget == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.CANNOT_CREATE_CALL_TARGET, code); + PythonModule builtins = context.getBuiltins(); + // Builtins may be null during context initialization + if (builtins != null) { + PDict builtinsDict = getOrCreateDictNode.execute(inliningTarget, builtins); + setBuiltins.execute(frame, inliningTarget, globals, T___BUILTINS__, builtinsDict); + } + PArguments.setGlobals(args, globals); + if (haveLocals.profile(inliningTarget, locals instanceof PNone)) { + setCustomLocals(args, globals); + } else { + if (!mappingCheckNode.execute(inliningTarget, locals)) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.LOCALS_MUST_BE_MAPPING, mode, locals); + } + setCustomLocals(args, locals); } - return invokeNode.execute(frame, rootCallTarget, args); - } - - @Specialization(guards = {"isMapping(inliningTarget, mappingCheckNode, locals)"}) - @SuppressWarnings("truffle-static-method") - Object execInheritGlobalsCustomLocals(VirtualFrame frame, Object source, @SuppressWarnings("unused") PNone globals, Object locals, - @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Shared @Cached PyMappingCheckNode mappingCheckNode, - @Exclusive @Cached ReadCallerFrameNode readCallerFrameNode, - @Shared("getCt") @Cached CodeNodes.GetCodeCallTargetNode getCt, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - PCode code = createAndCheckCode(frame, inliningTarget, source, raiseNode); - PFrame callerFrame = readCallerFrameNode.executeWith(frame, 0); - Object[] args = PArguments.create(); - inheritGlobals(callerFrame, args); - setCustomLocals(args, locals); - - return invokeNode.execute(frame, getCt.execute(inliningTarget, code), args); + return args; } - @Specialization(guards = {"isMapping(inliningTarget, mappingCheckNode, locals)"}) - @SuppressWarnings("truffle-static-method") - Object execCustomGlobalsCustomLocals(VirtualFrame frame, Object source, PDict globals, Object locals, - @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Shared @Cached PyMappingCheckNode mappingCheckNode, - @Shared @Cached HashingCollectionNodes.SetItemNode setBuiltins, - @Shared("getCt") @Cached CodeNodes.GetCodeCallTargetNode getCt, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - PCode code = createAndCheckCode(frame, inliningTarget, source, raiseNode); - Object[] args = PArguments.create(); - setCustomGlobals(frame, inliningTarget, globals, setBuiltins, args); - setCustomLocals(args, locals); - - return invokeNode.execute(frame, getCt.execute(inliningTarget, code), args); + @Fallback + static Object[] badGlobals(Node inliningTarget, Object globals, @SuppressWarnings("unused") Object locals, TruffleString mode) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.GLOBALS_MUST_BE_DICT, mode, globals); } - @Specialization(guards = {"!isAnyNone(globals)", "!isDict(globals)"}) - @SuppressWarnings({"unused", "truffle-static-method"}) - PNone badGlobals(Object source, Object globals, Object locals, - @Shared("raise") @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.GLOBALS_MUST_BE_DICT, getMode(), globals); + private static void setCustomLocals(Object[] args, Object locals) { + PArguments.setSpecialArgument(args, locals); } + } - @Specialization(guards = {"isAnyNone(globals) || isDict(globals)", "!isAnyNone(locals)", "!isMapping(inliningTarget, mappingCheckNode, locals)"}) - @SuppressWarnings({"unused", "truffle-static-method"}) - PNone badLocals(Object source, PDict globals, Object locals, - @Bind("this") Node inliningTarget, - @Shared @Cached PyMappingCheckNode mappingCheckNode, - @Shared("raise") @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.LOCALS_MUST_BE_MAPPING, getMode(), locals); - } + @GenerateInline + @GenerateCached(false) + abstract static class EvalExecNode extends Node { + abstract Object execute(VirtualFrame frame, Node inliningTarget, Object source, Object globals, Object locals, TruffleString mode, boolean shouldStripLeadingWhitespace); - private CompileNode getCompileNode() { - if (compileNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - compileNode = insert(CompileNode.create(false, shouldStripLeadingWhitespace())); + @Specialization + static Object eval(VirtualFrame frame, Node inliningTarget, Object source, Object globals, Object locals, TruffleString mode, @SuppressWarnings("unused") boolean shouldStripLeadingWhitespace, + @Cached("create(false, shouldStripLeadingWhitespace)") CompileNode compileNode, + @Cached CreateEvalExecArgumentsNode createArguments, + @Cached CodeNodes.GetCodeCallTargetNode getCallTarget, + @Cached CallDispatchers.CallTargetCachedInvokeNode invoke, + @Cached PRaiseNode raiseNode) { + PCode code = compileNode.compile(frame, source, T_STRING_SOURCE, mode, -1, -1); + if (code.getFreeVars().length > 0) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.CODE_OBJ_NO_FREE_VARIABLES, mode); } - return compileNode; + Object[] args = createArguments.execute(frame, inliningTarget, globals, locals, mode); + RootCallTarget callTarget = getCallTarget.execute(inliningTarget, code); + return invoke.execute(frame, inliningTarget, callTarget, args); } + } - private PDict getOrCreateDictNode(PythonObject object) { - if (getOrCreateDictNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - getOrCreateDictNode = insert(GetOrCreateDictNode.create()); - } - return getOrCreateDictNode.executeCached(object); - } + // eval(expression, globals=None, locals=None) + @Builtin(name = J_EVAL, minNumOfPositionalArgs = 1, parameterNames = {"expression", "globals", "locals"}) + @GenerateNodeFactory + public abstract static class EvalNode extends PythonBuiltinNode { - protected boolean shouldStripLeadingWhitespace() { - return true; + @Specialization + static Object eval(VirtualFrame frame, Object source, Object globals, Object locals, + @Bind Node inliningTarget, + @Cached EvalExecNode evalNode) { + return evalNode.execute(frame, inliningTarget, source, globals, locals, T_EVAL, true); } } @Builtin(name = J_EXEC, minNumOfPositionalArgs = 1, parameterNames = {"source", "globals", "locals"}) @GenerateNodeFactory - abstract static class ExecNode extends EvalNode { - protected abstract Object executeInternal(VirtualFrame frame); - - @Override - protected TruffleString getMode() { - return T_EXEC; - } - - @Override - public final Object execute(VirtualFrame frame) { - executeInternal(frame); - return PNone.NONE; - } + public abstract static class ExecNode extends PythonBuiltinNode { - @Override - protected boolean shouldStripLeadingWhitespace() { - return false; + @Specialization + static Object exec(VirtualFrame frame, Object source, Object globals, Object locals, + @Bind Node inliningTarget, + @Cached EvalExecNode evalNode) { + evalNode.execute(frame, inliningTarget, source, globals, locals, T_EXEC, false); + return NONE; } } @@ -1082,18 +957,17 @@ protected abstract Object executeInternal(VirtualFrame frame, Object source, Tru Object doCompile(VirtualFrame frame, TruffleString expression, TruffleString filename, TruffleString mode, int flags, boolean dontInherit, int optimize, int featureVersion, @Shared @Cached ReadCallerFrameNode readCallerFrame, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { if (!dontInherit) { PFrame fr = readCallerFrame.executeWith(frame, 0); - PCode code = factory.createCode(fr.getTarget()); + PCode code = PFactory.createCode(language, fr.getTarget()); flags |= code.getFlags() & PyCF_MASK; } - return compile(expression, filename, mode, flags, dontInherit, optimize, featureVersion, factory); + return compile(expression, filename, mode, flags, dontInherit, optimize, featureVersion); } @TruffleBoundary - Object compile(TruffleString expression, TruffleString filename, TruffleString mode, int flags, @SuppressWarnings("unused") boolean dontInherit, int optimize, int featureVersion, - PythonObjectFactory factory) { + Object compile(TruffleString expression, TruffleString filename, TruffleString mode, int flags, @SuppressWarnings("unused") boolean dontInherit, int optimize, int featureVersion) { checkFlags(flags); checkOptimize(optimize, optimize); checkSource(expression); @@ -1103,7 +977,7 @@ Object compile(TruffleString expression, TruffleString filename, TruffleString m InputType type = getParserInputType(mode, flags); if (type == InputType.FUNCTION_TYPE) { if ((flags & PyCF_ONLY_AST) == 0) { - throw PRaiseNode.raiseUncached(this, ValueError, ErrorMessages.COMPILE_MODE_FUNC_TYPE_REQUIED_FLAG_ONLY_AST); + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.COMPILE_MODE_FUNC_TYPE_REQUIED_FLAG_ONLY_AST); } } if (lstrip && !code.isEmpty()) { @@ -1114,7 +988,7 @@ Object compile(TruffleString expression, TruffleString filename, TruffleString m } if ((flags & PyCF_ONLY_AST) != 0) { Source source = PythonLanguage.newSource(context, code, filename, mayBeFromFile, PythonLanguage.MIME_TYPE); - RaisePythonExceptionErrorCallback errorCb = new RaisePythonExceptionErrorCallback(source, PythonOptions.isPExceptionWithJavaStacktrace(getLanguage())); + RaisePythonExceptionErrorCallback errorCb = new RaisePythonExceptionErrorCallback(source, PythonOptions.isPExceptionWithJavaStacktrace(context.getLanguage())); EnumSet compilerFlags = EnumSet.noneOf(AbstractParser.Flags.class); if ((flags & PyCF_TYPE_COMMENTS) != 0) { @@ -1126,6 +1000,9 @@ Object compile(TruffleString expression, TruffleString filename, TruffleString m if (featureVersion < 7) { compilerFlags.add(AbstractParser.Flags.ASYNC_HACKS); } + if (context.getEnv().getOptions().get(PythonOptions.ParserLogFiles)) { + PythonLanguage.LOGGER.log(Level.FINE, () -> "parse '" + source.getName() + "'"); + } Parser parser = Compiler.createParser(code.toJavaStringUncached(), errorCb, type, compilerFlags, featureVersion); ModTy mod = (ModTy) parser.parse(); errorCb.triggerDeprecationWarnings(); @@ -1150,7 +1027,7 @@ Object compile(TruffleString expression, TruffleString filename, TruffleString m } else { ct = getContext().getLanguage().cacheCode(filename, createCode); } - return wrapRootCallTarget((RootCallTarget) ct, factory); + return wrapRootCallTarget((RootCallTarget) ct); } @Specialization(limit = "3") @@ -1158,6 +1035,7 @@ Object compile(TruffleString expression, TruffleString filename, TruffleString m Object generic(VirtualFrame frame, Object wSource, Object wFilename, TruffleString mode, int flags, @SuppressWarnings("unused") boolean dontInherit, int optimize, int featureVersion, @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, + @Bind PythonContext context, @Bind("this") Node inliningTarget, @Cached("createFor(this)") IndirectCallData indirectCallData, @Cached CodecsModuleBuiltins.HandleDecodingErrorNode handleDecodingErrorNode, @@ -1168,8 +1046,7 @@ Object generic(VirtualFrame frame, Object wSource, Object wFilename, TruffleStri @Cached TruffleString.FromByteArrayNode fromByteArrayNode, @Cached TruffleString.SwitchEncodingNode switchEncodingNode, @Shared @Cached ReadCallerFrameNode readCallerFrame, - @Shared @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (wSource instanceof PCode) { return wSource; } @@ -1192,28 +1069,32 @@ Object generic(VirtualFrame frame, Object wSource, Object wFilename, TruffleStri if (!dontInherit) { PFrame fr = readCallerFrame.executeWith(frame, 0); - PCode code = factory.createCode(fr.getTarget()); + PCode code = PFactory.createCode(PythonLanguage.get(inliningTarget), fr.getTarget()); flags |= code.getFlags() & PyCF_MASK; } - if (AstModuleBuiltins.isAst(getContext(), wSource)) { - ModTy mod = AstModuleBuiltins.obj2sst(getContext(), wSource, getParserInputType(mode, flags)); + if (AstModuleBuiltins.isAst(context, wSource)) { + ModTy mod = AstModuleBuiltins.obj2sst(inliningTarget, context, wSource, getParserInputType(mode, flags)); Source source = PythonUtils.createFakeSource(filename); - RootCallTarget rootCallTarget = getLanguage().compileForBytecodeInterpreter(getContext(), mod, source, false, optimize, null, null, flags); - return wrapRootCallTarget(rootCallTarget, factory); + RootCallTarget rootCallTarget = context.getLanguage(inliningTarget).compileModule(context, mod, source, false, optimize, null, null, flags); + return wrapRootCallTarget(rootCallTarget); } - TruffleString source = sourceAsString(frame, inliningTarget, wSource, filename, interopLib, acquireLib, bufferLib, handleDecodingErrorNode, asStrNode, switchEncodingNode, factory, + TruffleString source = sourceAsString(frame, inliningTarget, wSource, filename, interopLib, acquireLib, bufferLib, handleDecodingErrorNode, asStrNode, switchEncodingNode, raiseNode, indirectCallData); checkSource(source); - return compile(source, filename, mode, flags, dontInherit, optimize, featureVersion, factory); + return compile(source, filename, mode, flags, dontInherit, optimize, featureVersion); } - private static PCode wrapRootCallTarget(RootCallTarget rootCallTarget, PythonObjectFactory factory) { + private static PCode wrapRootCallTarget(RootCallTarget rootCallTarget) { RootNode rootNode = rootCallTarget.getRootNode(); - if (rootNode instanceof PBytecodeRootNode) { - ((PBytecodeRootNode) rootNode).triggerDeferredDeprecationWarnings(); + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + if (rootNode instanceof PBytecodeDSLRootNode bytecodeDSLRootNode) { + bytecodeDSLRootNode.triggerDeferredDeprecationWarnings(); + } + } else if (rootNode instanceof PBytecodeRootNode bytecodeRootNode) { + bytecodeRootNode.triggerDeferredDeprecationWarnings(); } - return factory.createCode(rootCallTarget); + return PFactory.createCode(PythonLanguage.get(null), rootCallTarget); } @TruffleBoundary @@ -1226,14 +1107,14 @@ private void checkSource(TruffleString source) throws PException { @TruffleBoundary private void checkOptimize(int optimize, Object kwOptimize) throws PException { if (optimize < -1 || optimize > 2) { - throw PRaiseNode.raiseUncached(this, TypeError, ErrorMessages.INVALID_OPTIMIZE_VALUE, kwOptimize); + throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.INVALID_OPTIMIZE_VALUE, kwOptimize); } } @TruffleBoundary private void checkFlags(int flags) { if ((flags & ~(PyCF_MASK | PyCF_MASK_OBSOLETE | PyCF_COMPILE_MASK)) != 0) { - throw PRaiseNode.raiseUncached(this, ValueError, null, NO_VALUE, ErrorMessages.UNRECOGNIZED_FLAGS, PythonUtils.EMPTY_OBJECT_ARRAY); + throw PRaiseNode.raiseStatic(this, ValueError, null, NO_VALUE, ErrorMessages.UNRECOGNIZED_FLAGS, PythonUtils.EMPTY_OBJECT_ARRAY); } } @@ -1249,9 +1130,9 @@ private InputType getParserInputType(TruffleString mode, int flags) { return InputType.FUNCTION_TYPE; } else { if ((flags & PyCF_ONLY_AST) != 0) { - throw PRaiseNode.raiseUncached(this, ValueError, ErrorMessages.COMPILE_MODE_MUST_BE_AST_ONLY); + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.COMPILE_MODE_MUST_BE_AST_ONLY); } else { - throw PRaiseNode.raiseUncached(this, ValueError, ErrorMessages.COMPILE_MODE_MUST_BE); + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.COMPILE_MODE_MUST_BE); } } } @@ -1259,7 +1140,7 @@ private InputType getParserInputType(TruffleString mode, int flags) { // modeled after _Py_SourceAsString TruffleString sourceAsString(VirtualFrame frame, Node inliningTarget, Object source, TruffleString filename, InteropLibrary interopLib, PythonBufferAcquireLibrary acquireLib, PythonBufferAccessLibrary bufferLib, CodecsModuleBuiltins.HandleDecodingErrorNode handleDecodingErrorNode, PyObjectStrAsTruffleStringNode asStrNode, - TruffleString.SwitchEncodingNode switchEncodingNode, PythonObjectFactory factory, PRaiseNode.Lazy raiseNode, IndirectCallData indirectCallData) { + TruffleString.SwitchEncodingNode switchEncodingNode, PRaiseNode raiseNode, IndirectCallData indirectCallData) { if (interopLib.isString(source)) { try { return switchEncodingNode.execute(interopLib.asTruffleString(source), TS_ENCODING); @@ -1273,7 +1154,7 @@ TruffleString sourceAsString(VirtualFrame frame, Node inliningTarget, Object sou try { buffer = acquireLib.acquireReadonly(source, frame, indirectCallData); } catch (PException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.ARG_D_MUST_BE_S, "compile()", 1, "string, bytes or AST object"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ARG_D_MUST_BE_S, "compile()", 1, "string, bytes or AST object"); } try { byte[] bytes = bufferLib.getInternalOrCopiedByteArray(source); @@ -1283,7 +1164,7 @@ TruffleString sourceAsString(VirtualFrame frame, Node inliningTarget, Object sou CodecsModuleBuiltins.TruffleDecoder decoder = new CodecsModuleBuiltins.TruffleDecoder(pythonEncodingNameFromJavaName, charset, bytes, bytesLen, CodingErrorAction.REPORT); if (!decoder.decodingStep(true)) { try { - handleDecodingErrorNode.execute(frame, decoder, T_STRICT, factory.createBytes(bytes, bytesLen)); + handleDecodingErrorNode.execute(frame, decoder, T_STRICT, PFactory.createBytes(PythonLanguage.get(inliningTarget), bytes, bytesLen)); throw CompilerDirectives.shouldNotReachHere(); } catch (PException e) { throw raiseInvalidSyntax(filename, "(unicode error) %s", asStrNode.execute(frame, inliningTarget, e.getEscapedException())); @@ -1329,8 +1210,8 @@ abstract static class DelAttrNode extends PythonBinaryBuiltinNode { @Specialization Object delattr(VirtualFrame frame, Object object, Object name, @Bind("this") Node inliningTarget, - @Cached DeleteAttributeNode delNode) { - delNode.execute(frame, inliningTarget, object, name); + @Cached PyObjectSetAttrO setAttr) { + setAttr.execute(frame, inliningTarget, object, name, NO_VALUE); return PNone.NONE; } } @@ -1445,8 +1326,8 @@ static boolean doRecursiveWithLoop(VirtualFrame frame, Object instance, PTuple c @Cached("createFor(this)") IndirectCallData indirectCallData, @Shared @Cached GetObjectArrayNode getObjectArrayNode, @Cached("createNonRecursive()") RecursiveBinaryCheckBaseNode node) { - PythonLanguage language = PythonLanguage.get(inliningTarget); PythonContext context = PythonContext.get(inliningTarget); + PythonLanguage language = context.getLanguage(inliningTarget); Object state = IndirectCallContext.enter(frame, language, context, indirectCallData); try { // Note: we need actual recursion to trigger the stack overflow error like CPython @@ -1498,39 +1379,33 @@ public IsInstanceNode createRecursive(byte newDepth) { return BuiltinFunctionsFactory.IsInstanceNodeFactory.create(newDepth); } - private static TriState isInstanceCheckInternal(VirtualFrame frame, Node inliningTarget, Object instance, Object cls, LookupAndCallBinaryNode instanceCheckNode, - CoerceToBooleanNode castToBooleanNode) { - Object instanceCheckResult = instanceCheckNode.executeObject(frame, cls, instance); - if (instanceCheckResult == NOT_IMPLEMENTED) { - return TriState.UNDEFINED; - } - return TriState.valueOf(castToBooleanNode.executeBoolean(frame, inliningTarget, instanceCheckResult)); - } - - @Specialization(guards = "isPythonClass(cls)") - static boolean isInstance(VirtualFrame frame, Object instance, Object cls, - @Bind("this") Node inliningTarget, - @Shared("instanceCheck") @Cached("create(InstanceCheck)") LookupAndCallBinaryNode instanceCheckNode, - @Exclusive @Cached CoerceToBooleanNode.YesNode castToBooleanNode, - @Cached GetClassNode getClassNode, - @Cached IsSameTypeNode isSameTypeNode, - @Cached IsSubtypeNode isSubtypeNode) { - Object instanceClass = getClassNode.execute(inliningTarget, instance); - return isSameTypeNode.execute(inliningTarget, instanceClass, cls) || isSubtypeNode.execute(frame, instanceClass, cls)// - || isInstanceCheckInternal(frame, inliningTarget, instance, cls, instanceCheckNode, castToBooleanNode) == TriState.TRUE; - } - - @Specialization(guards = {"!isPTuple(cls)", "!isPythonClass(cls)"}) + @Specialization(guards = "!isPTuple(cls)") static boolean isInstance(VirtualFrame frame, Object instance, Object cls, - @Bind("this") Node inliningTarget, - @Shared("instanceCheck") @Cached("create(InstanceCheck)") LookupAndCallBinaryNode instanceCheckNode, - @Exclusive @Cached CoerceToBooleanNode.YesNode castToBooleanNode, - @Cached TypeBuiltins.InstanceCheckNode typeInstanceCheckNode) { - TriState check = isInstanceCheckInternal(frame, inliningTarget, instance, cls, instanceCheckNode, castToBooleanNode); - if (check == TriState.UNDEFINED) { - return typeInstanceCheckNode.executeWith(frame, cls, instance); + @Bind Node inliningTarget, + @Cached GetClassNode getClsClassNode, + @Cached IsBuiltinClassExactProfile classProfile, + @Cached GetClassNode getInstanceClassNode, + @Cached TypeNodes.IsSameTypeNode isSameTypeNode, + @Cached("create(T___INSTANCECHECK__)") LookupAndCallBinaryNode instanceCheckNode, + @Cached PyObjectIsTrueNode isTrueNode, + @Cached TypeNodes.GenericInstanceCheckNode genericInstanceCheckNode, + @Cached InlinedBranchProfile noInstanceCheckProfile) { + if (isSameTypeNode.execute(inliningTarget, getInstanceClassNode.execute(inliningTarget, instance), cls)) { + // Exact match, don't call __instancecheck__ + return true; + } + if (classProfile.profileClass(inliningTarget, getClsClassNode.execute(inliningTarget, cls), PythonBuiltinClassType.PythonClass)) { + // Avoid the lookup and call overhead when we know we're calling + // type.__instancecheck__ + return genericInstanceCheckNode.execute(frame, inliningTarget, instance, cls); + } + try { + Object result = instanceCheckNode.executeObject(frame, cls, instance); + return isTrueNode.execute(frame, result); + } catch (SpecialMethodNotFound ignore) { + noInstanceCheckProfile.enter(inliningTarget); + return genericInstanceCheckNode.execute(frame, inliningTarget, instance, cls); } - return check == TriState.TRUE; } } @@ -1555,15 +1430,25 @@ public IsSubClassNode createRecursive(byte newDepth) { @Specialization(guards = "!isPTuple(cls)") static boolean isSubclass(VirtualFrame frame, Object derived, Object cls, - @Bind("this") Node inliningTarget, - @Cached("create(Subclasscheck)") LookupAndCallBinaryNode subclassCheckNode, - @Cached CoerceToBooleanNode.YesNode castToBooleanNode, - @Cached IsSubtypeNode isSubtypeNode) { - Object instanceCheckResult = subclassCheckNode.executeObject(frame, cls, derived); - if (instanceCheckResult != NOT_IMPLEMENTED) { - return castToBooleanNode.executeBoolean(frame, inliningTarget, instanceCheckResult); + @Bind Node inliningTarget, + @Cached GetClassNode getClsClassNode, + @Cached IsBuiltinClassExactProfile classProfile, + @Cached("create(T___SUBCLASSCHECK__)") LookupAndCallBinaryNode subclassCheckNode, + @Cached PyObjectIsTrueNode isTrueNode, + @Cached TypeNodes.GenericSubclassCheckNode genericSubclassCheckNode, + @Cached InlinedBranchProfile noInstanceCheckProfile) { + if (classProfile.profileClass(inliningTarget, getClsClassNode.execute(inliningTarget, cls), PythonBuiltinClassType.PythonClass)) { + // Avoid the lookup and call overhead when we know we're calling + // type.__subclasscheck__ + return genericSubclassCheckNode.execute(frame, inliningTarget, derived, cls); + } + try { + Object result = subclassCheckNode.executeObject(frame, cls, derived); + return isTrueNode.execute(frame, result); + } catch (SpecialMethodNotFound ignore) { + noInstanceCheckProfile.enter(inliningTarget); + return genericSubclassCheckNode.execute(frame, inliningTarget, derived, cls); } - return isSubtypeNode.execute(frame, derived, cls); } @NeverDefault @@ -1588,15 +1473,15 @@ static Object iter(VirtualFrame frame, Object object, @SuppressWarnings("unused" static Object iter(Object callable, Object sentinel, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Cached PyCallableCheckNode callableCheck, - @Cached PythonObjectFactory factory) { - return factory.createSentinelIterator(callable, sentinel); + @Bind PythonLanguage language) { + return PFactory.createSentinelIterator(language, callable, sentinel); } @Fallback @SuppressWarnings("unused") static Object iterNotCallable(Object callable, Object sentinel, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.ITER_V_MUST_BE_CALLABLE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.ITER_V_MUST_BE_CALLABLE); } } @@ -1616,103 +1501,76 @@ public int len(VirtualFrame frame, Object obj, @GenerateCached(false) public abstract static class MinMaxNode extends Node { - abstract Object execute(VirtualFrame frame, Node inliningTarget, Object arg1, Object[] args, Object keywordArgIn, Object defaultVal, String name, BinaryComparisonNode comparisonNode); + abstract Object execute(VirtualFrame frame, Node inliningTarget, Object arg1, Object[] args, Object keywordArgIn, Object defaultVal, String name, RichCmpOp op); @Specialization(guards = "args.length == 0") static Object minmaxSequenceWithKey(VirtualFrame frame, Node inliningTarget, Object arg1, @SuppressWarnings("unused") Object[] args, Object keywordArgIn, Object defaultVal, String name, - BinaryComparisonNode compare, + RichCmpOp op, + @Exclusive @Cached PyObjectRichCompareBool compareNode, @Exclusive @Cached PyObjectGetIter getIter, - @Cached(inline = false) GetNextNode nextNode, - @Exclusive @Cached CoerceToBooleanNode.YesNode castToBooleanNode, + @Exclusive @Cached PyIterNextNode nextNode, @Exclusive @Cached CallNode.Lazy keyCall, - @Exclusive @Cached InlinedBranchProfile seenNonBoolean, @Exclusive @Cached InlinedConditionProfile keywordArgIsNone, - @Exclusive @Cached IsBuiltinObjectProfile errorProfile1, - @Exclusive @Cached IsBuiltinObjectProfile errorProfile2, @Exclusive @Cached InlinedConditionProfile hasDefaultProfile, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { boolean kwArgsAreNone = keywordArgIsNone.profile(inliningTarget, PGuards.isPNone(keywordArgIn)); Object keywordArg = kwArgsAreNone ? null : keywordArgIn; Object iterator = getIter.execute(frame, inliningTarget, arg1); Object currentValue; try { - currentValue = nextNode.execute(frame, iterator); - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile1); + currentValue = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { if (hasDefaultProfile.profile(inliningTarget, isNoValue(defaultVal))) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.ValueError, ErrorMessages.ARG_IS_EMPTY_SEQ, name); + throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ErrorMessages.ARG_IS_EMPTY_SEQ, name); } else { return defaultVal; } } Object currentKey = applyKeyFunction(frame, inliningTarget, keywordArg, keyCall, currentValue); int loopCount = 0; - try { - while (true) { - Object nextValue; - try { - nextValue = nextNode.execute(frame, iterator); - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile2); - break; - } + while (true) { + try { + Object nextValue = nextNode.execute(frame, inliningTarget, iterator); Object nextKey = applyKeyFunction(frame, inliningTarget, keywordArg, keyCall, nextValue); - boolean isTrue; - if (!seenNonBoolean.wasEntered(inliningTarget)) { - try { - isTrue = compare.executeBool(frame, nextKey, currentKey); - } catch (UnexpectedResultException e) { - seenNonBoolean.enter(inliningTarget); - isTrue = castToBooleanNode.executeBoolean(frame, inliningTarget, e.getResult()); - } - } else { - isTrue = castToBooleanNode.executeBoolean(frame, inliningTarget, compare.executeObject(frame, nextKey, currentKey)); - } + boolean isTrue = compareNode.execute(frame, inliningTarget, nextKey, currentKey, op); if (isTrue) { currentKey = nextKey; currentValue = nextValue; } loopCount++; + } catch (IteratorExhausted e) { + break; + } finally { + LoopNode.reportLoopCount(inliningTarget, loopCount < 0 ? Integer.MAX_VALUE : loopCount); } - } finally { - LoopNode.reportLoopCount(inliningTarget, loopCount < 0 ? Integer.MAX_VALUE : loopCount); } + return currentValue; } @Specialization(guards = {"args.length != 0"}) - static Object minmaxBinaryWithKey(VirtualFrame frame, Node inliningTarget, Object arg1, Object[] args, Object keywordArgIn, Object defaultVal, String name, BinaryComparisonNode compare, + static Object minmaxBinaryWithKey(VirtualFrame frame, Node inliningTarget, Object arg1, Object[] args, Object keywordArgIn, Object defaultVal, String name, + RichCmpOp op, + @Exclusive @Cached PyObjectRichCompareBool compareNode, @Exclusive @Cached CallNode.Lazy keyCall, - @Exclusive @Cached CoerceToBooleanNode.YesNode castToBooleanNode, - @Exclusive @Cached InlinedBranchProfile seenNonBoolean, @Exclusive @Cached InlinedConditionProfile keywordArgIsNone, @Exclusive @Cached InlinedConditionProfile moreThanTwo, @Exclusive @Cached InlinedLoopConditionProfile loopProfile, @Exclusive @Cached InlinedConditionProfile hasDefaultProfile, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { boolean kwArgsAreNone = keywordArgIsNone.profile(inliningTarget, PGuards.isPNone(keywordArgIn)); Object keywordArg = kwArgsAreNone ? null : keywordArgIn; if (!hasDefaultProfile.profile(inliningTarget, isNoValue(defaultVal))) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_SPECIFY_DEFAULT_FOR_S, name); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_SPECIFY_DEFAULT_FOR_S, name); } Object currentValue = arg1; Object currentKey = applyKeyFunction(frame, inliningTarget, keywordArg, keyCall, currentValue); Object nextValue = args[0]; Object nextKey = applyKeyFunction(frame, inliningTarget, keywordArg, keyCall, nextValue); - boolean isTrue; - if (!seenNonBoolean.wasEntered(inliningTarget)) { - try { - isTrue = compare.executeBool(frame, nextKey, currentKey); - } catch (UnexpectedResultException e) { - seenNonBoolean.enter(inliningTarget); - isTrue = castToBooleanNode.executeBoolean(frame, inliningTarget, e.getResult()); - } - } else { - isTrue = castToBooleanNode.executeBoolean(frame, inliningTarget, compare.executeObject(frame, nextKey, currentKey)); - } + boolean isTrue = compareNode.execute(frame, inliningTarget, nextKey, currentKey, op); if (isTrue) { currentKey = nextKey; currentValue = nextValue; @@ -1723,16 +1581,7 @@ static Object minmaxBinaryWithKey(VirtualFrame frame, Node inliningTarget, Objec for (int i = 0; loopProfile.inject(inliningTarget, i < args.length); i++) { nextValue = args[i]; nextKey = applyKeyFunction(frame, inliningTarget, keywordArg, keyCall, nextValue); - if (!seenNonBoolean.wasEntered(inliningTarget)) { - try { - isTrue = compare.executeBool(frame, nextKey, currentKey); - } catch (UnexpectedResultException e) { - seenNonBoolean.enter(inliningTarget); - isTrue = castToBooleanNode.executeBoolean(frame, inliningTarget, e.getResult()); - } - } else { - isTrue = castToBooleanNode.executeBoolean(frame, inliningTarget, compare.executeObject(frame, nextKey, currentKey)); - } + isTrue = compareNode.execute(frame, inliningTarget, nextKey, currentKey, op); if (isTrue) { currentKey = nextKey; currentValue = nextValue; @@ -1758,9 +1607,8 @@ public abstract static class MaxNode extends PythonBuiltinNode { @Specialization static Object max(VirtualFrame frame, Object arg1, Object[] args, Object keywordArgIn, Object defaultVal, @Bind("this") Node inliningTarget, - @Cached MinMaxNode minMaxNode, - @Cached BinaryComparisonNode.GtNode gtNode) { - return minMaxNode.execute(frame, inliningTarget, arg1, args, keywordArgIn, defaultVal, "max", gtNode); + @Cached MinMaxNode minMaxNode) { + return minMaxNode.execute(frame, inliningTarget, arg1, args, keywordArgIn, defaultVal, "max", RichCmpOp.Py_GT); } } @@ -1772,49 +1620,48 @@ public abstract static class MinNode extends PythonBuiltinNode { @Specialization static Object min(VirtualFrame frame, Object arg1, Object[] args, Object keywordArgIn, Object defaultVal, @Bind("this") Node inliningTarget, - @Cached MinMaxNode minMaxNode, - @Cached BinaryComparisonNode.LtNode ltNode) { - return minMaxNode.execute(frame, inliningTarget, arg1, args, keywordArgIn, defaultVal, "min", ltNode); + @Cached MinMaxNode minMaxNode) { + return minMaxNode.execute(frame, inliningTarget, arg1, args, keywordArgIn, defaultVal, "min", RichCmpOp.Py_LT); } } // next(iterator[, default]) - @SuppressWarnings("unused") @Builtin(name = J_NEXT, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2) @GenerateNodeFactory - public abstract static class NextNode extends PythonBinaryBuiltinNode { + abstract static class NextNode extends PythonBinaryBuiltinNode { @Specialization - public Object next(VirtualFrame frame, Object iterator, Object defaultObject, + static Object next(VirtualFrame frame, Object iterator, Object defaultObject, @Bind("this") Node inliningTarget, @Cached InlinedConditionProfile defaultIsNoValue, - @Cached("createNextCall()") LookupAndCallUnaryNode callNode, - @Cached IsBuiltinObjectProfile errorProfile) { - if (defaultIsNoValue.profile(inliningTarget, isNoValue(defaultObject))) { - return callNode.executeObject(frame, iterator); - } else { - try { - return callNode.executeObject(frame, iterator); - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); + @Cached GetObjectSlotsNode getSlots, + @Cached CallSlotTpIterNextNode callIterNext, + @Cached PRaiseNode raiseTypeError, + @Cached PRaiseNode raiseStopIteration, + @Cached IsBuiltinObjectProfile stopIterationProfile) { + TpSlots slots = getSlots.execute(inliningTarget, iterator); + if (!PyIterCheckNode.checkSlots(slots)) { + throw raiseTypeError.raise(inliningTarget, TypeError, ErrorMessages.OBJ_ISNT_ITERATOR, iterator); + } + try { + return callIterNext.execute(frame, inliningTarget, slots.tp_iternext(), iterator); + } catch (IteratorExhausted e) { + if (defaultIsNoValue.profile(inliningTarget, defaultObject == NO_VALUE)) { + throw raiseStopIteration.raise(inliningTarget, StopIteration); + } else { return defaultObject; } - } - } - - @NeverDefault - protected LookupAndCallUnaryNode createNextCall() { - return LookupAndCallUnaryNode.create(T___NEXT__, () -> new LookupAndCallUnaryNode.NoAttributeHandler() { - @Child PRaiseNode raiseNode = PRaiseNode.create(); - - @Override - public Object execute(Object iterator) { - throw raiseNode.raise(TypeError, ErrorMessages.OBJ_ISNT_ITERATOR, iterator); + } catch (PException e) { + if (defaultIsNoValue.profile(inliningTarget, defaultObject == NO_VALUE)) { + throw e; + } else { + e.expectStopIteration(inliningTarget, stopIterationProfile); + return defaultObject; } - }); + } } } - // ord(c) +// ord(c) @Builtin(name = J_ORD, minNumOfPositionalArgs = 1) @GenerateNodeFactory @ImportStatic(PGuards.class) @@ -1826,7 +1673,7 @@ static int ord(Object chrObj, @Cached CastToTruffleStringNode castToStringNode, @Cached TruffleString.CodePointLengthNode codePointLengthNode, @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { TruffleString chr; try { chr = castToStringNode.execute(inliningTarget, chrObj); @@ -1835,7 +1682,7 @@ static int ord(Object chrObj, } int len = codePointLengthNode.execute(chr, TS_ENCODING); if (len != 1) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.EXPECTED_CHARACTER_BUT_STRING_FOUND, "ord()", len); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.EXPECTED_CHARACTER_BUT_STRING_FOUND, "ord()", len); } return codePointAtIndexNode.execute(chr, 0, TS_ENCODING); } @@ -1845,22 +1692,22 @@ static long ord(PBytesLike chr, @Bind("this") Node inliningTarget, @Cached CastToJavaLongExactNode castNode, @Cached SequenceStorageNodes.GetItemNode getItemNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { int len = chr.getSequenceStorage().length(); if (len != 1) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.EXPECTED_CHARACTER_BUT_STRING_FOUND, "ord()", len); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.EXPECTED_CHARACTER_BUT_STRING_FOUND, "ord()", len); } return castNode.execute(inliningTarget, getItemNode.execute(chr.getSequenceStorage(), 0)); } @Specialization(guards = {"!isString(obj)", "!isBytes(obj)"}) static Object ord(@SuppressWarnings("unused") Object obj, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.S_EXPECTED_STRING_OF_LEN_BUT_P, "ord()", "1", "obj"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.S_EXPECTED_STRING_OF_LEN_BUT_P, "ord()", "1", "obj"); } } - // print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) +// print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) @Builtin(name = J_PRINT, takesVarArgs = true, keywordOnlyNames = {"sep", "end", "file", "flush"}, doc = "\n" + "print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\n" + "\n" + @@ -1884,6 +1731,10 @@ PNone printNoKeywords(VirtualFrame frame, Object[] values, PNone sep, PNone end, @Shared("callFlush") @Cached PyObjectCallMethodObjArgs callFlush, @Shared("strNode") @Cached PyObjectStrAsObjectNode strNode) { Object stdout = getStdout(); + // Allowed when stdout is not connected + if (stdout == NONE) { + return NONE; + } return printAllGiven(frame, values, T_SPACE, T_NEWLINE, stdout, false, inliningTarget, getWriteMethod, callWrite, callFlush, strNode); } @@ -1918,29 +1769,33 @@ PNone printGeneric(VirtualFrame frame, Object[] values, Object sepIn, Object end @Bind("this") Node inliningTarget, @Cached CastToTruffleStringNode castSep, @Cached CastToTruffleStringNode castEnd, - @Cached CoerceToBooleanNode.YesNode castFlush, + @Cached PyObjectIsTrueNode castFlush, @Exclusive @Cached PyObjectGetAttr getWriteMethod, @Exclusive @Cached CallNode callWrite, @Exclusive @Cached PyObjectCallMethodObjArgs callFlush, @Exclusive @Cached PyObjectStrAsObjectNode strNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { TruffleString sep; try { sep = sepIn instanceof PNone ? T_SPACE : castSep.execute(inliningTarget, sepIn); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.SEP_MUST_BE_NONE_OR_STRING, sepIn); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.SEP_MUST_BE_NONE_OR_STRING, sepIn); } TruffleString end; try { end = endIn instanceof PNone ? T_NEWLINE : castEnd.execute(inliningTarget, endIn); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.S_MUST_BE_NONE_OR_STRING, "end", sepIn); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.S_MUST_BE_NONE_OR_STRING, "end", sepIn); } Object file; if (fileIn instanceof PNone) { file = getStdout(); + // Allowed when stdout is not connected + if (file == NONE) { + return NONE; + } } else { file = fileIn; } @@ -1948,7 +1803,7 @@ PNone printGeneric(VirtualFrame frame, Object[] values, Object sepIn, Object end if (flushIn instanceof PNone) { flush = false; } else { - flush = castFlush.executeBoolean(frame, inliningTarget, flushIn); + flush = castFlush.execute(frame, flushIn); } return printAllGiven(frame, values, sep, end, file, flush, inliningTarget, getWriteMethod, callWrite, callFlush, strNode); } @@ -1973,9 +1828,9 @@ private Object getStdout() { readStdout = insert(ReadAttributeFromObjectNode.create()); } Object stdout = readStdout.execute(sys, T_STDOUT); - if (stdout instanceof PNone) { + if (stdout == NO_VALUE) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(this, RuntimeError, ErrorMessages.LOST_SYSSTDOUT); + throw PRaiseNode.raiseStatic(this, RuntimeError, ErrorMessages.LOST_SYSSTDOUT); } return stdout; } @@ -1997,24 +1852,26 @@ static Object repr(VirtualFrame frame, Object obj, // format(object, [format_spec]) @Builtin(name = J_FORMAT, minNumOfPositionalArgs = 1, parameterNames = {"object", "format_spec"}) @GenerateNodeFactory + @OperationProxy.Proxyable @ImportStatic(PGuards.class) public abstract static class FormatNode extends PythonBinaryBuiltinNode { @Specialization public static Object format(VirtualFrame frame, Object obj, Object formatSpec, @Bind("this") Node inliningTarget, - @Cached("create(Format)") LookupAndCallBinaryNode callFormat, + @Cached("create(T___FORMAT__)") LookupAndCallBinaryNode callFormat, @Cached InlinedConditionProfile formatIsNoValueProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object format = formatIsNoValueProfile.profile(inliningTarget, isNoValue(formatSpec)) ? T_EMPTY_STRING : formatSpec; - Object res = callFormat.executeObject(frame, obj, format); - if (res == NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.TYPE_DOESNT_DEFINE_FORMAT, obj); - } - if (!PGuards.isString(res)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_MUST_RETURN_S_NOT_P, T___FORMAT__, "str", res); + try { + Object res = callFormat.executeObject(frame, obj, format); + if (!PGuards.isString(res)) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_MUST_RETURN_S_NOT_P, T___FORMAT__, "str", res); + } + return res; + } catch (SpecialMethodNotFound ignore) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.TYPE_DOESNT_DEFINE_FORMAT, obj); } - return res; } @NeverDefault @@ -2043,11 +1900,11 @@ public abstract static class RoundNode extends PythonBuiltinNode { @Specialization static Object round(VirtualFrame frame, Object x, @SuppressWarnings("unused") PNone n, @Bind("this") Node inliningTarget, - @Cached("create(Round)") LookupAndCallUnaryNode callRound, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Cached("create(T___ROUND__)") LookupAndCallUnaryNode callRound, + @Shared @Cached PRaiseNode raiseNode) { Object result = callRound.executeObject(frame, x); if (result == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.TYPE_DOESNT_DEFINE_METHOD, x, T___ROUND__); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.TYPE_DOESNT_DEFINE_METHOD, x, T___ROUND__); } return result; } @@ -2055,13 +1912,13 @@ static Object round(VirtualFrame frame, Object x, @SuppressWarnings("unused") PN @Specialization(guards = "!isPNone(n)") static Object round(VirtualFrame frame, Object x, Object n, @Bind("this") Node inliningTarget, - @Cached("create(Round)") LookupAndCallBinaryNode callRound, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - Object result = callRound.executeObject(frame, x, n); - if (result == NOT_IMPLEMENTED) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.TYPE_DOESNT_DEFINE_METHOD, x, T___ROUND__); + @Cached("create(T___ROUND__)") LookupAndCallBinaryNode callRound, + @Shared @Cached PRaiseNode raiseNode) { + try { + return callRound.executeObject(frame, x, n); + } catch (SpecialMethodNotFound ignore) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.TYPE_DOESNT_DEFINE_METHOD, x, T___ROUND__); } - return result; } } @@ -2123,7 +1980,7 @@ public abstract static class BreakPointNode extends PythonBuiltinNode { Object doIt(VirtualFrame frame, Object[] args, PKeyword[] kwargs, @Bind("this") Node inliningTarget, @Cached HashingStorageGetItem getItem, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (getDebuggerSessionCount() > 0) { // we already have a Truffle debugger attached, it'll stop here return PNone.NONE; @@ -2137,7 +1994,7 @@ Object doIt(VirtualFrame frame, Object[] args, PKeyword[] kwargs, Object sysModule = getItem.execute(inliningTarget, sysModules.getDictStorage(), T_SYS); Object breakpointhook = getBreakpointhookNode.execute(sysModule, T_BREAKPOINTHOOK); if (breakpointhook == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.LOST_SYSBREAKPOINTHOOK); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.LOST_SYSBREAKPOINTHOOK); } return callNode.execute(frame, breakpointhook, args, kwargs); } else { @@ -2154,143 +2011,209 @@ private int getDebuggerSessionCount() { @Builtin(name = J_POW, minNumOfPositionalArgs = 2, numOfPositionalOnlyArgs = 0, parameterNames = {"base", "exp", "mod"}) @GenerateNodeFactory public abstract static class PowNode extends PythonTernaryBuiltinNode { - @NeverDefault - static BinaryOpNode binaryPow() { - return BinaryArithmetic.Pow.create(); - } - - @NeverDefault - static LookupAndCallTernaryNode ternaryPow() { - return TernaryArithmetic.Pow.create(); - } @Specialization - Object binary(VirtualFrame frame, Object x, Object y, @SuppressWarnings("unused") PNone z, - @Cached("binaryPow()") BinaryOpNode powNode) { - return powNode.executeObject(frame, x, y); - } - - @Specialization(guards = "!isPNone(z)") Object ternary(VirtualFrame frame, Object x, Object y, Object z, - @Cached("ternaryPow()") LookupAndCallTernaryNode powNode) { - return powNode.execute(frame, x, y, z); + @Cached PyNumberPowerNode power) { + return power.execute(frame, x, y, z); } } // sum(iterable[, start]) @Builtin(name = J_SUM, minNumOfPositionalArgs = 1, parameterNames = {"iterable", "start"}) @GenerateNodeFactory - public abstract static class SumFunctionNode extends PythonBuiltinNode { + public abstract static class SumFunctionNode extends PythonBinaryBuiltinNode { - @Child private LookupAndCallUnaryNode next = LookupAndCallUnaryNode.create(SpecialMethodSlot.Next); - - @Specialization(guards = "isNoValue(start)", rewriteOn = UnexpectedResultException.class) - int sumIntNone(VirtualFrame frame, Object arg1, @SuppressWarnings("unused") PNone start, - @Bind("this") Node inliningTarget, - @Shared @Cached PyNumberAddNode addNode, - @Shared @Cached IsBuiltinObjectProfile errorProfile, - @Shared("getIter") @Cached PyObjectGetIter getIter) throws UnexpectedResultException { - return sumIntInternal(frame, inliningTarget, arg1, 0, addNode, getIter, errorProfile); - } - - @Specialization(rewriteOn = UnexpectedResultException.class) - int sumIntInt(VirtualFrame frame, Object arg1, int start, - @Bind("this") Node inliningTarget, - @Shared @Cached PyNumberAddNode addNode, - @Shared @Cached IsBuiltinObjectProfile errorProfile, - @Shared("getIter") @Cached PyObjectGetIter getIter) throws UnexpectedResultException { - return sumIntInternal(frame, inliningTarget, arg1, start, addNode, getIter, errorProfile); - } - - private int sumIntInternal(VirtualFrame frame, Node inliningTarget, Object arg1, int start, PyNumberAddNode add, PyObjectGetIter getIter, - IsBuiltinObjectProfile errorProfile) throws UnexpectedResultException { - Object iterator = getIter.execute(frame, inliningTarget, arg1); - int value = start; - while (true) { - int nextValue; - try { - nextValue = PGuards.expectInteger(next.executeObject(frame, iterator)); - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - return value; - } catch (UnexpectedResultException e) { - Object newValue = add.execute(frame, inliningTarget, value, e.getResult()); - throw new UnexpectedResultException(iterateGeneric(frame, inliningTarget, iterator, newValue, add, errorProfile)); + @Specialization + Object sum(VirtualFrame frame, Object iterable, Object start, + @Bind Node inliningTarget, + @Cached InlinedConditionProfile defaultStart, + @Cached PRaiseNode raiseNode, + @Cached PyObjectGetIter getIter, + @Cached SumIteratorNode sumIteratorNode) { + if (defaultStart.profile(inliningTarget, start == NO_VALUE)) { + start = 0; + } else if (PGuards.isString(start)) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANT_SUM_STRINGS); + } else if (start instanceof PBytes) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANT_SUM_BYTES); + } else if (start instanceof PByteArray) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANT_SUM_BYTEARRAY); + } + Object iterator = getIter.execute(frame, inliningTarget, iterable); + return sumIteratorNode.execute(frame, inliningTarget, iterator, start); + } + + @GenerateInline + @GenerateCached(false) + @ImportStatic(PGuards.class) + abstract static class SumIteratorNode extends Node { + public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object iterator, Object start); + + @Specialization + static Object sumIntIterator(VirtualFrame frame, Node inliningTarget, PIntegerSequenceIterator iterator, int start, + @Shared @Cached InlinedLoopConditionProfile loopProfilePrimitive, + @Shared @Cached InlinedLoopConditionProfile loopProfileGeneric, + @Shared @Cached InlinedBranchProfile overflowProfile, + @Shared @Cached PyNumberAddNode addNode, + @Shared @Cached InlinedConditionProfile resultFitsInInt) { + long longResult = start; + while (loopProfilePrimitive.profile(inliningTarget, iterator.hasNext())) { + long next = iterator.next(); + try { + longResult = PythonUtils.addExact(longResult, next); + } catch (OverflowException e) { + overflowProfile.enter(inliningTarget); + Object objectResult = addNode.execute(frame, longResult, next); + while (loopProfileGeneric.profile(inliningTarget, iterator.hasNext())) { + objectResult = addNode.execute(frame, objectResult, iterator.next()); + } + return objectResult; + } } - try { - value = add.executeInt(frame, inliningTarget, value, nextValue); - } catch (UnexpectedResultException e) { - throw new UnexpectedResultException(iterateGeneric(frame, inliningTarget, iterator, e.getResult(), add, errorProfile)); + return maybeInt(inliningTarget, resultFitsInInt, longResult); + } + + @Specialization + static Object sumLongIterator(VirtualFrame frame, Node inliningTarget, PLongSequenceIterator iterator, int start, + @Shared @Cached InlinedLoopConditionProfile loopProfilePrimitive, + @Shared @Cached InlinedLoopConditionProfile loopProfileGeneric, + @Shared @Cached InlinedBranchProfile overflowProfile, + @Shared @Cached PyNumberAddNode addNode, + @Shared @Cached InlinedConditionProfile resultFitsInInt) { + long longResult = start; + while (loopProfilePrimitive.profile(inliningTarget, iterator.hasNext())) { + long next = iterator.next(); + try { + longResult = PythonUtils.addExact(longResult, next); + } catch (OverflowException e) { + overflowProfile.enter(inliningTarget); + Object objectResult = addNode.execute(frame, longResult, next); + while (loopProfileGeneric.profile(inliningTarget, iterator.hasNext())) { + objectResult = addNode.execute(frame, objectResult, iterator.next()); + } + return objectResult; + } } + return maybeInt(inliningTarget, resultFitsInInt, longResult); + } + + @Specialization(guards = "isDouble(start) || isInt(start)") + static Object sumDoubleIterator(Node inliningTarget, PDoubleSequenceIterator iterator, Object start, + @Cached InlinedConditionProfile startIsDouble, + @Shared @Cached InlinedLoopConditionProfile loopProfilePrimitive) { + /* + * Need to make sure we keep start type if the iterator was empty + */ + if (!iterator.hasNext()) { + return start; + } + double result = startIsDouble.profile(inliningTarget, start instanceof Double) ? (double) start : (int) start; + while (loopProfilePrimitive.profile(inliningTarget, iterator.hasNext())) { + result += iterator.next(); + } + return result; } - } - @Specialization(rewriteOn = UnexpectedResultException.class) - double sumDoubleDouble(VirtualFrame frame, Object arg1, double start, - @Bind("this") Node inliningTarget, - @Shared @Cached PyNumberAddNode addNode, - @Shared @Cached IsBuiltinObjectProfile errorProfile, - // dummy inline profile, so it can be @Shared, to optimize generated code: - @SuppressWarnings("unused") @Shared @Cached InlinedConditionProfile hasStart, - @Shared("getIter") @Cached PyObjectGetIter getIter, - // dummy raiseNode, so it can be @Shared, to optimize generated code: - @SuppressWarnings("unused") @Shared @Cached PRaiseNode.Lazy raiseNode) throws UnexpectedResultException { - return sumDoubleInternal(frame, inliningTarget, arg1, start, addNode, getIter, errorProfile); - } - - private double sumDoubleInternal(VirtualFrame frame, Node inliningTarget, Object arg1, double start, PyNumberAddNode add, PyObjectGetIter getIter, - IsBuiltinObjectProfile errorProfile) throws UnexpectedResultException { - Object iterator = getIter.execute(frame, inliningTarget, arg1); - double value = start; - while (true) { - double nextValue; + @Fallback + static Object sumGeneric(VirtualFrame frame, Node inliningTarget, Object iterator, Object start, + @Shared @Cached InlinedLoopConditionProfile loopProfilePrimitive, + @Shared @Cached InlinedLoopConditionProfile loopProfileGeneric, + @Cached PyIterNextNode nextNode, + @Shared @Cached PyNumberAddNode addNode, + @Shared @Cached InlinedConditionProfile resultFitsInInt, + @Exclusive @Cached InlinedBranchProfile seenObject, + @Exclusive @Cached InlinedBranchProfile seenInt, + @Exclusive @Cached InlinedBranchProfile seenDouble, + @Exclusive @Cached InlinedBranchProfile genericBranch) { + /* + * Peel the first iteration to see what's the type. + */ + Object next; try { - nextValue = PGuards.expectDouble(next.executeObject(frame, iterator)); - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - return value; - } catch (UnexpectedResultException e) { - Object newValue = add.execute(frame, inliningTarget, value, e.getResult()); - throw new UnexpectedResultException(iterateGeneric(frame, inliningTarget, iterator, newValue, add, errorProfile)); + next = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { + return start; } - try { - value = add.executeDouble(frame, inliningTarget, value, nextValue); - } catch (UnexpectedResultException e) { - throw new UnexpectedResultException(iterateGeneric(frame, inliningTarget, iterator, e.getResult(), add, errorProfile)); + Object acc = addNode.execute(frame, start, next); + /* + * We try to process integers/longs/doubles as long as we can. Then we always fall + * through to the generic path. `next` and `acc` are always properly set so that the + * generic path can check if there are remaining items and resume if necessary. + */ + if (acc instanceof Integer || acc instanceof Long) { + seenInt.enter(inliningTarget); + long longAcc = acc instanceof Integer ? (int) acc : (long) acc; + boolean exitLoop = false, exhausted = false; + while (loopProfilePrimitive.profile(inliningTarget, !exitLoop)) { + try { + next = nextNode.execute(frame, inliningTarget, iterator); + if (next instanceof Integer nextInt) { + longAcc = PythonUtils.addExact(longAcc, nextInt); + } else if (next instanceof Long nextLong) { + longAcc = PythonUtils.addExact(longAcc, nextLong); + } else { + exitLoop = true; + } + } catch (OverflowException e) { + exitLoop = true; + } catch (IteratorExhausted e) { + exitLoop = true; + exhausted = true; + } + } + if (exhausted) { + return maybeInt(inliningTarget, resultFitsInInt, longAcc); + } + genericBranch.enter(inliningTarget); + acc = longAcc; + } else if (acc instanceof Double doubleAcc) { + seenDouble.enter(inliningTarget); + boolean exitLoop = false, exhausted = false; + while (loopProfilePrimitive.profile(inliningTarget, !exitLoop)) { + try { + next = nextNode.execute(frame, inliningTarget, iterator); + if (next instanceof Double nextDouble) { + doubleAcc += nextDouble; + } else { + exitLoop = true; + } + } catch (IteratorExhausted e) { + exitLoop = true; + exhausted = true; + } + } + if (exhausted) { + return doubleAcc; + } + genericBranch.enter(inliningTarget); + acc = doubleAcc; + } else { + seenObject.enter(inliningTarget); + try { + next = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { + return acc; + } } + boolean exhausted = false; + do { + acc = addNode.execute(frame, acc, next); + try { + next = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { + exhausted = true; + } + } while (loopProfileGeneric.profile(inliningTarget, !exhausted)); + return acc; } - } - - @Specialization(replaces = {"sumIntNone", "sumIntInt", "sumDoubleDouble"}) - Object sum(VirtualFrame frame, Object arg1, Object start, - @Bind("this") Node inliningTarget, - @Shared @Cached PyNumberAddNode addNode, - @Shared @Cached IsBuiltinObjectProfile errorProfile, - @Shared("getIter") @Cached PyObjectGetIter getIter, - @Shared @Cached InlinedConditionProfile hasStart, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - if (PGuards.isString(start)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANT_SUM_STRINGS); - } else if (start instanceof PBytes) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANT_SUM_BYTES); - } else if (start instanceof PByteArray) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANT_SUM_BYTEARRAY); - } - Object iterator = getIter.execute(frame, inliningTarget, arg1); - return iterateGeneric(frame, inliningTarget, iterator, hasStart.profile(inliningTarget, start != NO_VALUE) ? start : 0, addNode, errorProfile); - } - private Object iterateGeneric(VirtualFrame frame, Node inliningTarget, Object iterator, Object start, PyNumberAddNode add, IsBuiltinObjectProfile errorProfile) { - Object value = start; - while (true) { - Object nextValue; - try { - nextValue = next.executeObject(frame, iterator); - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - return value; + private static long maybeInt(Node inliningTarget, InlinedConditionProfile resultFitsInInt, long result) { + if (resultFitsInInt.profile(inliningTarget, PInt.isIntRange(result))) { + return (int) result; + } else { + return result; } - value = add.execute(frame, inliningTarget, value, nextValue); } } } @@ -2341,10 +2264,10 @@ static Object vars(VirtualFrame frame, @SuppressWarnings("unused") PNone none, static Object vars(VirtualFrame frame, Object obj, @Bind("this") Node inliningTarget, @Cached PyObjectLookupAttr lookupAttr, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object dict = lookupAttr.execute(frame, inliningTarget, obj, T___DICT__); if (dict == NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.VARS_ARGUMENT_MUST_HAVE_DICT); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.VARS_ARGUMENT_MUST_HAVE_DICT); } return dict; } @@ -2382,10 +2305,10 @@ abstract static class UpdateBasesNode extends Node { @Specialization static PTuple update(PTuple bases, Object[] arguments, int nargs, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached PyObjectLookupAttr getMroEntries, @Cached CallUnaryMethodNode callMroEntries, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { CompilerAsserts.neverPartOfCompilation(); ArrayList newBases = null; for (int i = 0; i < nargs; i++) { @@ -2408,7 +2331,7 @@ static PTuple update(PTuple bases, Object[] arguments, int nargs, } Object newBase = callMroEntries.executeObject(null, meth, bases); if (!PGuards.isPTuple(newBase)) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.MRO_ENTRIES_MUST_RETURN_TUPLE); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.MRO_ENTRIES_MUST_RETURN_TUPLE); } PTuple newBaseTuple = (PTuple) newBase; if (newBases == null) { @@ -2427,7 +2350,7 @@ static PTuple update(PTuple bases, Object[] arguments, int nargs, if (newBases == null) { return bases; } - return factory.createTuple(newBases.toArray()); + return PFactory.createTuple(language, newBases.toArray()); } } @@ -2443,7 +2366,7 @@ static Object calculate(Object metatype, PTuple bases, @Cached GetClassNode getClass, @Cached IsSubtypeNode isSubType, @Cached IsSubtypeNode isSubTypeReverse, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { CompilerAsserts.neverPartOfCompilation(); /* * Determine the proper metatype to deal with this, and check for metatype conflicts @@ -2462,7 +2385,7 @@ static Object calculate(Object metatype, PTuple bases, } else if (isSubTypeReverse.execute(tmpType, winner)) { winner = tmpType; } else { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.METACLASS_CONFLICT); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.METACLASS_CONFLICT); } } return winner; @@ -2471,7 +2394,6 @@ static Object calculate(Object metatype, PTuple bases, @Builtin(name = J___BUILD_CLASS__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory - @ImportStatic(SpecialMethodSlot.class) public abstract static class BuildClassNode extends PythonVarargsBuiltinNode { private static final TruffleString T_METACLASS = tsLiteral("metaclass"); public static final TruffleString T_BUILD_JAVA_CLASS = tsLiteral("build_java_class"); @@ -2485,12 +2407,13 @@ private static Object buildJavaClass(Object namespace, TruffleString name, Objec } @InliningCutoff - private static Object buildJavaClass(VirtualFrame frame, PythonLanguage language, PFunction function, Object[] arguments, PythonObjectFactory factory, CallDispatchNode callBody, + private static Object buildJavaClass(VirtualFrame frame, Node inliningTarget, PythonLanguage language, PFunction function, Object[] arguments, + CallDispatchers.FunctionCachedInvokeNode invokeBody, TruffleString name) { - PDict ns = factory.createDict(new DynamicObjectStorage(language)); + PDict ns = PFactory.createDict(language, new DynamicObjectStorage(language)); Object[] args = PArguments.create(0); PArguments.setSpecialArgument(args, ns); - callBody.executeCall(frame, function, args); + invokeBody.execute(frame, inliningTarget, function, args); return buildJavaClass(ns, name, arguments[1]); } @@ -2499,41 +2422,42 @@ protected Object doItNonFunction(VirtualFrame frame, Object function, Object[] a @Bind("this") Node inliningTarget, @Cached CastToTruffleStringNode castToTruffleStringNode, @Cached("createFor(this)") IndirectCallData indirectCallData, - @Cached PythonObjectFactory factory, @Cached CalculateMetaclassNode calculateMetaClass, @Cached("create(T___PREPARE__)") GetAttributeNode getPrepare, @Cached PyMappingCheckNode pyMappingCheckNode, - @Cached CallVarargsMethodNode callPrep, - @Cached CallVarargsMethodNode callType, - @Cached CallDispatchNode callBody, + @Cached CallNode callPrep, + @Cached CallNode callType, + @Cached CallDispatchers.FunctionCachedInvokeNode invokeBody, @Cached UpdateBasesNode update, @Cached PyObjectSetItem setOrigBases, @Cached GetClassNode getClass, - @Cached IsBuiltinObjectProfile noAttributeProfile) { + @Cached IsBuiltinObjectProfile noAttributeProfile, + @Cached PRaiseNode raiseNode) { if (arguments.length < 1) { - throw raise(PythonErrorType.TypeError, ErrorMessages.BUILD_CLS_NOT_ENOUGH_ARGS); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.BUILD_CLS_NOT_ENOUGH_ARGS); } if (!PGuards.isFunction(function)) { - throw raise(PythonErrorType.TypeError, ErrorMessages.BUILD_CLS_FUNC_MUST_BE_FUNC); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.BUILD_CLS_FUNC_MUST_BE_FUNC); } TruffleString name; try { name = castToTruffleStringNode.execute(inliningTarget, arguments[0]); } catch (CannotCastException e) { - throw raise(PythonErrorType.TypeError, ErrorMessages.BUILD_CLS_NAME_NOT_STRING); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.BUILD_CLS_NAME_NOT_STRING); } + PythonContext ctx = PythonContext.get(inliningTarget); + Env env = ctx.getEnv(); + PythonLanguage language = ctx.getLanguage(inliningTarget); + Object[] basesArray = Arrays.copyOfRange(arguments, 1, arguments.length); - PTuple origBases = factory.createTuple(basesArray); + PTuple origBases = PFactory.createTuple(language, basesArray); - PythonContext ctx = PythonContext.get(calculateMetaClass); - Env env = ctx.getEnv(); - PythonLanguage language = PythonLanguage.get(inliningTarget); if (arguments.length == 2 && env.isHostObject(arguments[1]) && env.asHostObject(arguments[1]) instanceof Class) { // we want to subclass a Java class - return buildJavaClass(frame, language, (PFunction) function, arguments, factory, callBody, name); + return buildJavaClass(frame, inliningTarget, language, (PFunction) function, arguments, invokeBody, name); } class InitializeBuildClass { @@ -2595,14 +2519,14 @@ class InitializeBuildClass { ns = callPrep.execute(frame, prep, new Object[]{name, init.bases}, init.mkw); } catch (PException p) { p.expectAttributeError(inliningTarget, noAttributeProfile); - ns = factory.createDict(new DynamicObjectStorage(language)); + ns = PFactory.createDict(language, new DynamicObjectStorage(language)); } if (!pyMappingCheckNode.execute(inliningTarget, ns)) { throw raiseNoMapping(init.isClass, init.meta, ns); } Object[] bodyArguments = PArguments.create(0); PArguments.setSpecialArgument(bodyArguments, ns); - callBody.executeCall(frame, (PFunction) function, bodyArguments); + invokeBody.execute(frame, inliningTarget, (PFunction) function, bodyArguments); if (init.bases != origBases) { setOrigBases.execute(frame, inliningTarget, ns, SpecialAttributeNames.T___ORIG_BASES__, origBases); } @@ -2618,31 +2542,32 @@ class InitializeBuildClass { @InliningCutoff private PException raiseNoMapping(boolean isClass, Object meta, Object ns) { if (isClass) { - throw raise(PythonErrorType.TypeError, ErrorMessages.N_PREPARE_MUST_RETURN_MAPPING, meta, ns); + throw PRaiseNode.raiseStatic(this, PythonErrorType.TypeError, ErrorMessages.N_PREPARE_MUST_RETURN_MAPPING, meta, ns); } else { - throw raise(PythonErrorType.TypeError, ErrorMessages.MTCLS_PREPARE_MUST_RETURN_MAPPING, ns); + throw PRaiseNode.raiseStatic(this, PythonErrorType.TypeError, ErrorMessages.MTCLS_PREPARE_MUST_RETURN_MAPPING, ns); } } } - @Builtin(name = "anext", minNumOfPositionalArgs = 1) + @Builtin(name = "anext", minNumOfPositionalArgs = 1, numOfPositionalOnlyArgs = 2, parameterNames = {"aiterator", "default"}) @GenerateNodeFactory - public abstract static class ANext extends PythonUnaryBuiltinNode { + public abstract static class ANext extends PythonBinaryBuiltinNode { @Specialization - public Object doGeneric(VirtualFrame frame, Object asyncIter, - @Bind("this") Node inliningTarget, - @Cached(parameters = "ANext") LookupSpecialMethodSlotNode getANext, - @Cached GetClassNode getAsyncIterType, - @Cached PRaiseNode.Lazy raiseNoANext, - @Cached CallUnaryMethodNode callANext, - @Cached TypeNodes.GetNameNode getName) { - // TODO: two argument anext - Object type = getAsyncIterType.execute(inliningTarget, asyncIter); - Object getter = getANext.execute(frame, type, asyncIter); - if (getter == NO_VALUE) { - throw raiseNoANext.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.OBJECT_NOT_ASYNCGEN, getName.execute(inliningTarget, type)); - } - return callANext.executeObject(frame, getter, asyncIter); + static Object doGeneric(VirtualFrame frame, Object asyncIter, Object defaultValue, + @Bind("this") Node inliningTarget, + @Cached GetObjectSlotsNode getSlots, + @Cached CallSlotUnaryNode callSlot, + @Cached InlinedConditionProfile hasDefault, + @Cached PRaiseNode raiseNoANext) { + TpSlots slots = getSlots.execute(inliningTarget, asyncIter); + if (slots.am_anext() == null) { + throw raiseNoANext.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.OBJECT_NOT_ASYNCGEN, asyncIter); + } + if (hasDefault.profile(inliningTarget, defaultValue == NO_VALUE)) { + return callSlot.execute(frame, inliningTarget, slots.am_anext(), asyncIter); + } else { + return PFactory.createANextAwaitable(PythonLanguage.get(inliningTarget), asyncIter, defaultValue); + } } } @@ -2650,8 +2575,8 @@ public Object doGeneric(VirtualFrame frame, Object asyncIter, @GenerateNodeFactory public abstract static class AIter extends PythonUnaryBuiltinNode { @Specialization - public Object doGeneric(VirtualFrame frame, Object arg, - @Cached(neverDefault = true) GetAIterNode aiter) { + static Object doGeneric(VirtualFrame frame, Object arg, + @Cached GetAIterNode aiter) { return aiter.execute(frame, arg); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CmathModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CmathModuleBuiltins.java index fe32d28808..105027ab46 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CmathModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CmathModuleBuiltins.java @@ -1,4 +1,4 @@ -/* Copyright (c) 2020, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2020, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2020 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -10,6 +10,7 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -27,9 +28,9 @@ import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; +import com.oracle.graal.python.nodes.truffle.PythonIntegerAndFloatTypes; import com.oracle.graal.python.nodes.util.CoerceToComplexNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; @@ -78,14 +79,14 @@ public void initialize(Python3Core core) { addBuiltinConstant("tau", 2 * Math.PI); addBuiltinConstant("inf", Double.POSITIVE_INFINITY); addBuiltinConstant("nan", Double.NaN); - addBuiltinConstant("infj", core.factory().createComplex(0, Double.POSITIVE_INFINITY)); - addBuiltinConstant("nanj", core.factory().createComplex(0, Double.NaN)); + addBuiltinConstant("infj", PFactory.createComplex(core.getLanguage(), 0, Double.POSITIVE_INFINITY)); + addBuiltinConstant("nanj", PFactory.createComplex(core.getLanguage(), 0, Double.NaN)); super.initialize(core); } - static PComplex specialValue(PythonObjectFactory factory, ComplexValue[][] table, double real, double imag) { + static PComplex specialValue(PythonLanguage language, ComplexValue[][] table, double real, double imag) { ComplexValue v = specialValue(table, real, imag); - return v == null ? null : v.toPComplex(factory); + return v == null ? null : v.toPComplex(language); } static ComplexValue specialValue(ComplexValue[][] table, double real, double imag) { @@ -122,8 +123,8 @@ static class ComplexValue { this.imag = imag; } - PComplex toPComplex(PythonObjectFactory factory) { - return factory.createComplex(real, imag); + PComplex toPComplex(PythonLanguage language) { + return PFactory.createComplex(language, real, imag); } } @@ -166,48 +167,48 @@ static SpecialType ofDouble(double d) { @GenerateInline @GenerateCached(false) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @ImportStatic(MathGuards.class) abstract static class CmathComplexUnaryHelperNode extends Node { @FunctionalInterface interface Op { - ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode.Lazy raiseNode); + ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode raiseNode); } abstract PComplex execute(VirtualFrame frame, Node inliningTarget, Object value, Op op); @Specialization static PComplex doL(Node inliningTarget, long value, Op op, - @Shared @Cached(inline = false) PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - return op.compute(inliningTarget, value, 0, raiseNode).toPComplex(factory); + @Bind PythonLanguage language, + @Shared @Cached PRaiseNode raiseNode) { + return op.compute(inliningTarget, value, 0, raiseNode).toPComplex(language); } @Specialization static PComplex doD(Node inliningTarget, double value, Op op, - @Shared @Cached(inline = false) PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - return op.compute(inliningTarget, value, 0, raiseNode).toPComplex(factory); + @Bind PythonLanguage language, + @Shared @Cached PRaiseNode raiseNode) { + return op.compute(inliningTarget, value, 0, raiseNode).toPComplex(language); } @Specialization static PComplex doC(Node inliningTarget, PComplex value, Op op, - @Shared @Cached(inline = false) PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - return op.compute(inliningTarget, value.getReal(), value.getImag(), raiseNode).toPComplex(factory); + @Bind PythonLanguage language, + @Shared @Cached PRaiseNode raiseNode) { + return op.compute(inliningTarget, value.getReal(), value.getImag(), raiseNode).toPComplex(language); } @Specialization static PComplex doGeneral(VirtualFrame frame, Node inliningTarget, Object value, Op op, @Cached CoerceToComplexNode coerceToComplex, - @Shared @Cached(inline = false) PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - return doC(inliningTarget, coerceToComplex.execute(frame, inliningTarget, value), op, factory, raiseNode); + @Bind PythonLanguage language, + @Exclusive @Cached PRaiseNode raiseNode) { + return doC(inliningTarget, coerceToComplex.execute(frame, inliningTarget, value), op, language, raiseNode); } } - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @ImportStatic(MathGuards.class) @GenerateInline @GenerateCached(false) @@ -276,7 +277,7 @@ static boolean doIt(VirtualFrame frame, Object o, } @Builtin(name = "phase", minNumOfPositionalArgs = 1) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @ImportStatic(MathGuards.class) @GenerateNodeFactory abstract static class PhaseNode extends PythonUnaryBuiltinNode { @@ -305,28 +306,28 @@ static double doGeneral(VirtualFrame frame, Object value, } @Builtin(name = "polar", minNumOfPositionalArgs = 1) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @ImportStatic(MathGuards.class) @GenerateNodeFactory abstract static class PolarNode extends PythonUnaryBuiltinNode { @Specialization static PTuple doL(long value, - @Shared @Cached PythonObjectFactory factory) { - return doD(value, factory); + @Bind PythonLanguage language) { + return doD(value, language); } @Specialization static PTuple doD(double value, - @Shared @Cached PythonObjectFactory factory) { - return factory.createTuple(new Object[]{Math.abs(value), value < 0 ? Math.PI : 0}); + @Bind PythonLanguage language) { + return PFactory.createTuple(language, new Object[]{Math.abs(value), value < 0 ? Math.PI : 0}); } @Specialization static PTuple doC(PComplex value, @Shared @Cached ComplexBuiltins.AbsNode absNode, - @Shared @Cached PythonObjectFactory factory) { - return toPolar(value, absNode, factory); + @Bind PythonLanguage language) { + return toPolar(value, absNode, language); } @Specialization @@ -334,18 +335,18 @@ static PTuple doGeneral(VirtualFrame frame, Object value, @Bind("this") Node inliningTarget, @Cached CoerceToComplexNode coerceToComplex, @Shared @Cached ComplexBuiltins.AbsNode absNode, - @Shared @Cached PythonObjectFactory factory) { - return toPolar(coerceToComplex.execute(frame, inliningTarget, value), absNode, factory); + @Bind PythonLanguage language) { + return toPolar(coerceToComplex.execute(frame, inliningTarget, value), absNode, language); } - private static PTuple toPolar(PComplex value, ComplexBuiltins.AbsNode absNode, PythonObjectFactory factory) { + private static PTuple toPolar(PComplex value, ComplexBuiltins.AbsNode absNode, PythonLanguage language) { double r = absNode.executeDouble(value); - return factory.createTuple(new Object[]{r, Math.atan2(value.getImag(), value.getReal())}); + return PFactory.createTuple(language, new Object[]{r, Math.atan2(value.getImag(), value.getReal())}); } } @Builtin(name = "rect", minNumOfPositionalArgs = 2) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @ImportStatic(MathGuards.class) @GenerateNodeFactory abstract static class RectNode extends PythonBinaryBuiltinNode { @@ -393,12 +394,12 @@ static PComplex doGeneral(VirtualFrame frame, Object r, Object phi, @TruffleBoundary private static PComplex rect(Node raisingNode, double r, double phi) { - PythonObjectFactory factory = PythonObjectFactory.getUncached(); + PythonLanguage language = PythonLanguage.get(null); // deal with special values if (!Double.isFinite(r) || !Double.isFinite(phi)) { // need to raise an exception if r is a nonzero number and phi is infinite if (r != 0.0 && !Double.isNaN(r) && Double.isInfinite(phi)) { - throw PRaiseNode.raiseUncached(raisingNode, ValueError, ErrorMessages.MATH_DOMAIN_ERROR); + throw PRaiseNode.raiseStatic(raisingNode, ValueError, ErrorMessages.MATH_DOMAIN_ERROR); } // if r is +/-infinity and phi is finite but nonzero then @@ -408,19 +409,19 @@ private static PComplex rect(Node raisingNode, double r, double phi) { double real = Math.copySign(Double.POSITIVE_INFINITY, Math.cos(phi)); double imag = Math.copySign(Double.POSITIVE_INFINITY, Math.sin(phi)); if (r > 0) { - return factory.createComplex(real, imag); + return PFactory.createComplex(language, real, imag); } else { - return factory.createComplex(-real, -imag); + return PFactory.createComplex(language, -real, -imag); } } - return specialValue(factory, SPECIAL_VALUES, r, phi); + return specialValue(language, SPECIAL_VALUES, r, phi); } - return factory.createComplex(r * Math.cos(phi), r * Math.sin(phi)); + return PFactory.createComplex(language, r * Math.cos(phi), r * Math.sin(phi)); } } @Builtin(name = "log", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @ImportStatic(MathGuards.class) @GenerateNodeFactory abstract static class LogNode extends PythonBinaryBuiltinNode { @@ -446,15 +447,15 @@ static LogNode create() { @Specialization(guards = "isNoValue(y)") PComplex doComplexNone(PComplex x, @SuppressWarnings("unused") PNone y, - @Shared @Cached PythonObjectFactory factory) { - return log(x, factory); + @Bind PythonLanguage language) { + return log(x, language); } @Specialization PComplex doComplexComplex(VirtualFrame frame, PComplex x, PComplex y, @Shared @Cached ComplexBuiltins.DivNode divNode, - @Shared @Cached PythonObjectFactory factory) { - return divNode.executeComplex(frame, log(x, factory), log(y, factory)); + @Bind PythonLanguage language) { + return divNode.executeComplex(frame, log(x, language), log(y, language)); } @Specialization(guards = "isNoValue(yObj)") @@ -462,9 +463,9 @@ PComplex doGeneral(VirtualFrame frame, Object xObj, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @Shared @Cached CoerceToComplexNode coerceXToComplex, // unused node to avoid mixing shared and non-shared inlined nodes - @SuppressWarnings("unsued") @Shared @Cached CoerceToComplexNode coerceYToComplex, - @Shared @Cached PythonObjectFactory factory) { - return log(coerceXToComplex.execute(frame, inliningTarget, xObj), factory); + @SuppressWarnings("unused") @Shared @Cached CoerceToComplexNode coerceYToComplex, + @Bind PythonLanguage language) { + return log(coerceXToComplex.execute(frame, inliningTarget, xObj), language); } @Specialization(guards = "!isNoValue(yObj)") @@ -473,20 +474,20 @@ PComplex doGeneral(VirtualFrame frame, Object xObj, Object yObj, @Shared @Cached CoerceToComplexNode coerceXToComplex, @Shared @Cached CoerceToComplexNode coerceYToComplex, @Shared @Cached ComplexBuiltins.DivNode divNode, - @Shared @Cached PythonObjectFactory factory) { - PComplex x = log(coerceXToComplex.execute(frame, inliningTarget, xObj), factory); - PComplex y = log(coerceYToComplex.execute(frame, inliningTarget, yObj), factory); + @Bind PythonLanguage language) { + PComplex x = log(coerceXToComplex.execute(frame, inliningTarget, xObj), language); + PComplex y = log(coerceYToComplex.execute(frame, inliningTarget, yObj), language); return divNode.executeComplex(frame, x, y); } - private PComplex log(PComplex z, PythonObjectFactory factory) { - PComplex r = specialValue(factory, SPECIAL_VALUES, z.getReal(), z.getImag()); + private PComplex log(PComplex z, PythonLanguage language) { + PComplex r = specialValue(language, SPECIAL_VALUES, z.getReal(), z.getImag()); if (r != null) { return r; } double real = computeRealPart(z.getReal(), z.getImag()); double imag = Math.atan2(z.getImag(), z.getReal()); - return factory.createComplex(real, imag); + return PFactory.createComplex(language, real, imag); } @TruffleBoundary @@ -502,7 +503,7 @@ private double computeRealPart(double real, double imag) { final double scaleUp = 0x1.0p53; return Math.log(Math.hypot(ax * scaleUp, ay * scaleUp)) - 53 * LN_2; } - throw PRaiseNode.raiseUncached(this, ValueError, ErrorMessages.MATH_DOMAIN_ERROR); + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.MATH_DOMAIN_ERROR); } double h = Math.hypot(ax, ay); if (0.71 <= h && h <= 1.73) { @@ -515,7 +516,7 @@ private double computeRealPart(double real, double imag) { } @Builtin(name = "log10", minNumOfPositionalArgs = 1) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @ImportStatic(MathGuards.class) @GenerateNodeFactory abstract static class Log10Node extends PythonUnaryBuiltinNode { @@ -523,17 +524,17 @@ abstract static class Log10Node extends PythonUnaryBuiltinNode { @Specialization PComplex doComplex(VirtualFrame frame, PComplex z, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { PComplex r = logNode.executeComplex(frame, z, PNone.NO_VALUE); - return factory.createComplex(r.getReal() / LN_10, r.getImag() / LN_10); + return PFactory.createComplex(language, r.getReal() / LN_10, r.getImag() / LN_10); } @Specialization PComplex doGeneral(VirtualFrame frame, Object zObj, @Bind("this") Node inliningTarget, @Cached CoerceToComplexNode coerceXToComplex, - @Shared @Cached PythonObjectFactory factory) { - return doComplex(frame, coerceXToComplex.execute(frame, inliningTarget, zObj), factory); + @Bind PythonLanguage language) { + return doComplex(frame, coerceXToComplex.execute(frame, inliningTarget, zObj), language); } } @@ -561,7 +562,7 @@ static PComplex doIt(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, SqrtNode::compute); } - static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode.Lazy raiseNode) { + static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode raiseNode) { ComplexValue result = specialValue(SPECIAL_VALUES, real, imag); if (result != null) { return result; @@ -615,7 +616,7 @@ static PComplex doIt(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, AcosNode::compute); } - static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode.Lazy raiseNode) { + static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode raiseNode) { ComplexValue result = specialValue(SPECIAL_VALUES, real, imag); if (result != null) { return result; @@ -665,7 +666,7 @@ static PComplex doIt(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, AcoshNode::compute); } - static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode.Lazy raiseNode) { + static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode raiseNode) { ComplexValue result = specialValue(SPECIAL_VALUES, real, imag); if (result != null) { return result; @@ -696,7 +697,7 @@ static PComplex doIt(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, AsinNode::compute); } - static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode.Lazy raiseNode) { + static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode raiseNode) { ComplexValue s = AsinhNode.compute(inliningTarget, -imag, real, raiseNode); return new ComplexValue(s.imag, -s.real); } @@ -726,7 +727,7 @@ static PComplex doIt(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, AsinhNode::compute); } - static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode.Lazy raiseNode) { + static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode raiseNode) { ComplexValue result = specialValue(SPECIAL_VALUES, real, imag); if (result != null) { return result; @@ -762,7 +763,7 @@ static PComplex doIt(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, AtanNode::compute); } - static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode.Lazy raiseNode) { + static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode raiseNode) { ComplexValue s = AtanhNode.compute(inliningTarget, -imag, real, raiseNode); return new ComplexValue(s.imag, -s.real); } @@ -795,7 +796,7 @@ static PComplex doIt(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, AtanhNode::compute); } - static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode.Lazy raiseNode) { + static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode raiseNode) { ComplexValue result = specialValue(SPECIAL_VALUES, real, imag); if (result != null) { return result; @@ -806,7 +807,7 @@ static ComplexValue compute(Node inliningTarget, double real, double imag, PRais return computeWithRealPositive(inliningTarget, real, imag, 1.0, raiseNode); } - private static ComplexValue computeWithRealPositive(Node inliningTarget, double real, double imag, double resultScale, PRaiseNode.Lazy raiseNode) { + private static ComplexValue computeWithRealPositive(Node inliningTarget, double real, double imag, double resultScale, PRaiseNode raiseNode) { double rreal; double rimag; double ay = Math.abs(imag); @@ -816,7 +817,7 @@ private static ComplexValue computeWithRealPositive(Node inliningTarget, double rimag = -Math.copySign(Math.PI / 2.0, -imag); } else if (real == 1.0 && ay < CM_SQRT_DBL_MIN) { if (ay == 0.0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MATH_DOMAIN_ERROR); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MATH_DOMAIN_ERROR); } rreal = -Math.log(Math.sqrt(ay) / Math.sqrt(Math.hypot(ay, 2.0))); rimag = Math.copySign(Math.atan2(2.0, -ay) / 2, imag); @@ -852,7 +853,7 @@ static PComplex doIt(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, ExpNode::compute); } - static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode.Lazy raiseNode) { + static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode raiseNode) { if (!Double.isFinite(real) || !Double.isFinite(imag)) { ComplexValue r; if (Double.isInfinite(real) && Double.isFinite(imag) && imag != 0.0) { @@ -865,7 +866,7 @@ static ComplexValue compute(Node inliningTarget, double real, double imag, PRais r = specialValue(SPECIAL_VALUES, real, imag); } if (Double.isInfinite(imag) && (Double.isFinite(real) || (Double.isInfinite(real) && real > 0))) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MATH_DOMAIN_ERROR); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MATH_DOMAIN_ERROR); } return r; } @@ -881,7 +882,7 @@ static ComplexValue compute(Node inliningTarget, double real, double imag, PRais rimag = l * Math.sin(imag); } if (Double.isInfinite(rreal) || Double.isInfinite(rimag)) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.MATH_RANGE_ERROR); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.MATH_RANGE_ERROR); } return new ComplexValue(rreal, rimag); } @@ -898,7 +899,7 @@ static PComplex doIt(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, CosNode::compute); } - static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode.Lazy raiseNode) { + static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode raiseNode) { return CoshNode.compute(inliningTarget, -imag, real, raiseNode); } } @@ -927,10 +928,10 @@ static PComplex doIt(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, CoshNode::compute); } - static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode.Lazy raiseNode) { + static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode raiseNode) { if (!Double.isFinite(real) || !Double.isFinite(imag)) { if (Double.isInfinite(imag) && !Double.isNaN(real)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MATH_DOMAIN_ERROR); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MATH_DOMAIN_ERROR); } if (Double.isInfinite(real) && Double.isFinite(imag) && imag != 0.0) { double r = Math.copySign(INF, Math.sin(imag)); @@ -950,7 +951,7 @@ static ComplexValue compute(Node inliningTarget, double real, double imag, PRais rimag = Math.sin(imag) * Math.sinh(real); } if (Double.isInfinite(rreal) || Double.isInfinite(rimag)) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.MATH_RANGE_ERROR); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.MATH_RANGE_ERROR); } return new ComplexValue(rreal, rimag); } @@ -967,7 +968,7 @@ static PComplex doIt(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, SinNode::compute); } - static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode.Lazy raiseNode) { + static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode raiseNode) { ComplexValue s = SinhNode.compute(inliningTarget, -imag, real, raiseNode); return new ComplexValue(s.imag, -s.real); } @@ -997,10 +998,10 @@ static PComplex doIt(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, SinhNode::compute); } - static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode.Lazy raiseNode) { + static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode raiseNode) { if (!Double.isFinite(real) || !Double.isFinite(imag)) { if (Double.isInfinite(imag) && !Double.isNaN(real)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MATH_DOMAIN_ERROR); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MATH_DOMAIN_ERROR); } if (Double.isInfinite(real) && Double.isFinite(imag) && imag != 0.0) { double r = Math.copySign(INF, Math.cos(imag)); @@ -1020,7 +1021,7 @@ static ComplexValue compute(Node inliningTarget, double real, double imag, PRais rimag = Math.sin(imag) * Math.cosh(real); } if (Double.isInfinite(rreal) || Double.isInfinite(rimag)) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.MATH_RANGE_ERROR); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.MATH_RANGE_ERROR); } return new ComplexValue(rreal, rimag); } @@ -1037,7 +1038,7 @@ static PComplex doIt(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, TanNode::compute); } - static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode.Lazy raiseNode) { + static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode raiseNode) { ComplexValue s = TanhNode.compute(inliningTarget, -imag, real, raiseNode); return new ComplexValue(s.imag, -s.real); } @@ -1067,10 +1068,10 @@ static PComplex doIt(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, TanhNode::compute); } - static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode.Lazy raiseNode) { + static ComplexValue compute(Node inliningTarget, double real, double imag, PRaiseNode raiseNode) { if (!Double.isFinite(real) || !Double.isFinite(imag)) { if (Double.isInfinite(imag) && Double.isFinite(real)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MATH_DOMAIN_ERROR); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MATH_DOMAIN_ERROR); } if (Double.isInfinite(real) && Double.isFinite(imag) && imag != 0.0) { return new ComplexValue(real > 0 ? 1.0 : -1.0, Math.copySign(0.0, 2.0 * Math.sin(imag) * Math.cos(imag))); @@ -1091,8 +1092,8 @@ static ComplexValue compute(Node inliningTarget, double real, double imag, PRais } } - @Builtin(name = "isclose", minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 2, varArgsMarker = true, keywordOnlyNames = {"rel_tol", "abs_tol"}) - @TypeSystemReference(PythonArithmeticTypes.class) + @Builtin(name = "isclose", minNumOfPositionalArgs = 2, parameterNames = {"a", "b"}, keywordOnlyNames = {"rel_tol", "abs_tol"}) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @ImportStatic(MathGuards.class) @GenerateNodeFactory abstract static class IsCloseNode extends PythonBuiltinNode { @@ -1103,20 +1104,18 @@ abstract static class IsCloseNode extends PythonBuiltinNode { @Specialization static boolean doCCDD(PComplex a, PComplex b, double relTolObj, double absTolObj, @Bind("this") Node inliningTarget, - @Shared @Cached PythonObjectFactory factory, @Shared @Cached AbsNode absNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - return isClose(inliningTarget, a, b, relTolObj, absTolObj, factory, absNode, raiseNode); + @Shared @Cached PRaiseNode raiseNode) { + return isClose(inliningTarget, a, b, relTolObj, absTolObj, absNode, raiseNode); } @Specialization @SuppressWarnings("unused") static boolean doCCNN(PComplex a, PComplex b, PNone relTolObj, PNone absTolObj, @Bind("this") Node inliningTarget, - @Shared @Cached PythonObjectFactory factory, @Shared @Cached AbsNode absNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - return isClose(inliningTarget, a, b, DEFAULT_REL_TOL, DEFAULT_ABS_TOL, factory, absNode, raiseNode); + @Shared @Cached PRaiseNode raiseNode) { + return isClose(inliningTarget, a, b, DEFAULT_REL_TOL, DEFAULT_ABS_TOL, absNode, raiseNode); } @Specialization @@ -1126,19 +1125,18 @@ static boolean doGeneral(VirtualFrame frame, Object aObj, Object bObj, Object re @Cached CoerceToComplexNode coerceBToComplex, @Cached PyFloatAsDoubleNode relAsDoubleNode, @Cached PyFloatAsDoubleNode absAsDoubleNode, - @Shared @Cached PythonObjectFactory factory, @Shared @Cached AbsNode absNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { PComplex a = coerceAToComplex.execute(frame, inliningTarget, aObj); PComplex b = coerceBToComplex.execute(frame, inliningTarget, bObj); double relTol = PGuards.isNoValue(relTolObj) ? DEFAULT_REL_TOL : relAsDoubleNode.execute(frame, inliningTarget, relTolObj); double absTol = PGuards.isPNone(absTolObj) ? DEFAULT_ABS_TOL : absAsDoubleNode.execute(frame, inliningTarget, absTolObj); - return isClose(inliningTarget, a, b, relTol, absTol, factory, absNode, raiseNode); + return isClose(inliningTarget, a, b, relTol, absTol, absNode, raiseNode); } - private static boolean isClose(Node inliningTarget, PComplex a, PComplex b, double relTol, double absTol, PythonObjectFactory factory, AbsNode absNode, PRaiseNode.Lazy raiseNode) { + private static boolean isClose(Node inliningTarget, PComplex a, PComplex b, double relTol, double absTol, AbsNode absNode, PRaiseNode raiseNode) { if (relTol < 0.0 || absTol < 0.0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.TOLERANCE_MUST_NON_NEGATIVE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.TOLERANCE_MUST_NON_NEGATIVE); } if (a.getReal() == b.getReal() && a.getImag() == b.getImag()) { return true; @@ -1147,7 +1145,7 @@ private static boolean isClose(Node inliningTarget, PComplex a, PComplex b, doub Double.isInfinite(b.getReal()) || Double.isInfinite(b.getImag())) { return false; } - PComplex diff = factory.createComplex(a.getReal() - b.getReal(), a.getImag() - b.getImag()); + PComplex diff = PFactory.createComplex(PythonLanguage.get(inliningTarget), a.getReal() - b.getReal(), a.getImag() - b.getImag()); double len = absNode.executeDouble(diff); return len <= absTol || len <= relTol * absNode.executeDouble(b) || len <= relTol * absNode.executeDouble(a); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CodecsModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CodecsModuleBuiltins.java index 278d9fc109..efa6107b20 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CodecsModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CodecsModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -96,6 +96,7 @@ import java.nio.charset.CodingErrorAction; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; @@ -136,7 +137,6 @@ import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode; import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryBuiltinNode; @@ -151,7 +151,7 @@ import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.CharsetMapping; @@ -221,7 +221,7 @@ static void handle(Node inliningTarget, TruffleEncoder encoder, TruffleString er @Cached InlinedConditionProfile surrogatepassProfile, @Cached InlinedConditionProfile surrogateescapeProfile, @Cached InlinedConditionProfile xmlcharrefreplaceProfile, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached(inline = false) TruffleString.EqualNode equalNode, // TODO: (blocked by GR-46101) make this CallNode.Lazy @Cached(inline = false) CallNode lazyCallNode) { @@ -239,24 +239,24 @@ static void handle(Node inliningTarget, TruffleEncoder encoder, TruffleString er } else if (xmlcharrefreplaceProfile.profile(inliningTarget, equalNode.execute(T_XMLCHARREFREPLACE, errorAction, TS_ENCODING))) { fixed = xmlcharrefreplace(encoder); } else { - throw raiseNode.get(inliningTarget).raise(LookupError, ErrorMessages.UNKNOWN_ERROR_HANDLER, errorAction); + throw raiseNode.raise(inliningTarget, LookupError, ErrorMessages.UNKNOWN_ERROR_HANDLER, errorAction); } } catch (OutOfMemoryError e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, MemoryError); + throw PRaiseNode.raiseStatic(inliningTarget, MemoryError); } if (!fixed) { int start = encoder.getInputPosition(); int end = start + encoder.getErrorLength(); Object exception = lazyCallNode.executeWithoutFrame(UnicodeEncodeError, encoder.getEncodingName(), inputObject, start, end, encoder.getErrorReason()); if (exception instanceof PBaseException) { - throw raiseNode.get(inliningTarget).raiseExceptionObject((PBaseException) exception); + throw raiseNode.raiseExceptionObject(inliningTarget, (PBaseException) exception); } else { // Shouldn't happen unless the user manually replaces the method, which is // really // unexpected and shouldn't be permitted at all, but currently it is CompilerDirectives.transferToInterpreterAndInvalidate(); - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.SHOULD_HAVE_RETURNED_EXCEPTION, UnicodeEncodeError, exception); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.SHOULD_HAVE_RETURNED_EXCEPTION, UnicodeEncodeError, exception); } } } @@ -367,7 +367,7 @@ public Object raise(Node inliningTarget, TruffleDecoder decoder, Object inputObj @Specialization static Object doRaise(Node inliningTarget, TruffleDecoder decoder, Object inputObject, boolean justMakeExcept, @Cached(inline = false) CallNode callNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int start = decoder.getInputPosition(); int end = start + decoder.getErrorLength(); Object exception = callNode.executeWithoutFrame(UnicodeDecodeError, decoder.getEncodingName(), inputObject, start, end, decoder.getErrorReason()); @@ -375,12 +375,12 @@ static Object doRaise(Node inliningTarget, TruffleDecoder decoder, Object inputO return exception; } if (exception instanceof PBaseException) { - throw raiseNode.get(inliningTarget).raiseExceptionObject(exception); + throw raiseNode.raiseExceptionObject(inliningTarget, exception); } else { // Shouldn't happen unless the user manually replaces the method, which is really // unexpected and shouldn't be permitted at all, but currently it is CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, TypeError, ErrorMessages.SHOULD_HAVE_RETURNED_EXCEPTION, UnicodeDecodeError, exception); + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.SHOULD_HAVE_RETURNED_EXCEPTION, UnicodeDecodeError, exception); } } } @@ -440,7 +440,7 @@ void doBackslashreplace(TruffleDecoder decoder, @SuppressWarnings("unused") Truf } } catch (OutOfMemoryError e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - PRaiseNode.raiseUncached(this, MemoryError); + PRaiseNode.raiseStatic(this, MemoryError); } } @@ -456,7 +456,7 @@ static void doSurrogatepass(TruffleDecoder decoder, @SuppressWarnings("unused") } } catch (OutOfMemoryError e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, MemoryError); + throw PRaiseNode.raiseStatic(inliningTarget, MemoryError); } } @@ -471,7 +471,7 @@ static void doSurrogateescape(TruffleDecoder decoder, @SuppressWarnings("unused" } } catch (OutOfMemoryError e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, MemoryError); + throw PRaiseNode.raiseStatic(inliningTarget, MemoryError); } } @@ -486,23 +486,23 @@ static void doCustom(VirtualFrame frame, TruffleDecoder decoder, TruffleString e @Cached PyLongAsIntNode asIntNode, @Exclusive @Cached RaiseDecodingErrorNode raiseDecodingErrorNode, @Cached PyCodecLookupErrorNode lookupErrorNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { Object errorHandler = lookupErrorNode.execute(inliningTarget, errorAction); if (errorHandler == null) { - throw raiseNode.get(inliningTarget).raise(LookupError, UNKNOWN_ERROR_HANDLER, errorAction); + throw raiseNode.raise(inliningTarget, LookupError, UNKNOWN_ERROR_HANDLER, errorAction); } Object exceptionObject = raiseDecodingErrorNode.makeDecodeException(inliningTarget, decoder, inputObject); Object restuple = callNode.execute(frame, errorHandler, exceptionObject); if (!PGuards.isPTuple(restuple)) { - throw raiseNode.get(inliningTarget).raise(TypeError, DECODING_ERROR_HANDLER_MUST_RETURN_STR_INT_TUPLE); + throw raiseNode.raise(inliningTarget, TypeError, DECODING_ERROR_HANDLER_MUST_RETURN_STR_INT_TUPLE); } SequenceStorage storage = ((PTuple) restuple).getSequenceStorage(); Object[] t = getArray.execute(inliningTarget, storage); if (storage.length() != 2) { - throw raiseNode.get(inliningTarget).raise(TypeError, DECODING_ERROR_HANDLER_MUST_RETURN_STR_INT_TUPLE); + throw raiseNode.raise(inliningTarget, TypeError, DECODING_ERROR_HANDLER_MUST_RETURN_STR_INT_TUPLE); } int newpos = asIntNode.execute(null, inliningTarget, t[1]); /*- Copy back the bytes variables, which might have been modified by the callback */ @@ -516,16 +516,16 @@ static void doCustom(VirtualFrame frame, TruffleDecoder decoder, TruffleString e newpos = insize + newpos; } if (newpos < 0 || newpos > insize) { - throw raiseNode.get(inliningTarget).raise(IndexError, POSITION_D_FROM_ERROR_HANDLER_OUT_OF_BOUNDS, newpos); + throw raiseNode.raise(inliningTarget, IndexError, POSITION_D_FROM_ERROR_HANDLER_OUT_OF_BOUNDS, newpos); } if (!custom(decoder, input, insize, newpos)) { - throw raiseNode.get(inliningTarget).raise(SystemError); + throw raiseNode.raise(inliningTarget, SystemError); } } catch (OutOfMemoryError e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, MemoryError); + throw PRaiseNode.raiseStatic(inliningTarget, MemoryError); } } @@ -607,14 +607,14 @@ byte[] encode(Object self, TruffleString encoding, TruffleString errors, @Cached CastToJavaStringNode castStr, @Cached TruffleString.EqualNode equalNode, @Cached HandleEncodingErrorNode errorHandler, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached NormalizeEncodingNameNode normalizeEncodingNameNode) { String input = castStr.execute(self); CodingErrorAction errorAction = convertCodingErrorAction(errors, equalNode); TruffleString normalizedEncoding = normalizeEncodingNameNode.execute(inliningTarget, encoding); Charset charset = CharsetMapping.getCharsetNormalized(normalizedEncoding); if (charset == null) { - throw raiseNode.get(inliningTarget).raise(LookupError, ErrorMessages.UNKNOWN_ENCODING, encoding); + throw raiseNode.raise(inliningTarget, LookupError, ErrorMessages.UNKNOWN_ENCODING, encoding); } TruffleEncoder encoder; try { @@ -624,7 +624,7 @@ byte[] encode(Object self, TruffleString encoding, TruffleString errors, } } catch (OutOfMemoryError e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(this, MemoryError); + throw PRaiseNode.raiseStatic(this, MemoryError); } return encoder.getBytes(); } @@ -646,20 +646,19 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(guards = {"isString(self)"}) static Object encode(Object self, TruffleString encoding, TruffleString errors, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached CastToTruffleStringNode castStr, @Cached TruffleString.CodePointLengthNode codePointLengthNode, - @Cached CodecsEncodeToJavaBytesNode encode, - @Cached PythonObjectFactory factory) { + @Cached CodecsEncodeToJavaBytesNode encode) { TruffleString input = castStr.execute(inliningTarget, self); - PBytes bytes = factory.createBytes(encode.execute(self, encoding, errors)); - return factory.createTuple(new Object[]{bytes, codePointLengthNode.execute(input, TS_ENCODING)}); + PBytes bytes = PFactory.createBytes(language, encode.execute(self, encoding, errors)); + return PFactory.createTuple(language, new Object[]{bytes, codePointLengthNode.execute(input, TS_ENCODING)}); } @Fallback static Object encode(Object str, @SuppressWarnings("unused") Object encoding, @SuppressWarnings("unused") Object errors, - @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANT_CONVERT_TO_STR_IMPLICITLY, str); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CANT_CONVERT_TO_STR_IMPLICITLY, str); } } @@ -683,6 +682,7 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(limit = "3") static Object decode(VirtualFrame frame, Object input, TruffleString encoding, TruffleString errors, boolean finalData, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("input") PythonBufferAcquireLibrary acquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, @@ -690,8 +690,7 @@ static Object decode(VirtualFrame frame, Object input, TruffleString encoding, T @Cached NormalizeEncodingNameNode normalizeEncodingNameNode, @Cached InternErrorAction internErrorAction, @Cached HandleDecodingErrorNode errorHandler, - @Cached PRaiseNode raiseNode, - @Cached PythonObjectFactory factory) { + @Cached PRaiseNode raiseNode) { Object buffer = acquireLib.acquireReadonly(input, frame, indirectCallData); try { int len = bufferLib.getBufferLength(buffer); @@ -700,19 +699,19 @@ static Object decode(VirtualFrame frame, Object input, TruffleString encoding, T TruffleString normalizedEncoding = normalizeEncodingNameNode.execute(inliningTarget, encoding); Charset charset = CharsetMapping.getCharsetForDecodingNormalized(normalizedEncoding, bytes, len); if (charset == null) { - throw raiseNode.raise(LookupError, ErrorMessages.UNKNOWN_ENCODING, encoding); + throw raiseNode.raise(inliningTarget, LookupError, ErrorMessages.UNKNOWN_ENCODING, encoding); } TruffleDecoder decoder; try { decoder = new TruffleDecoder(normalizedEncoding, charset, bytes, len, errorAction); while (!decoder.decodingStep(finalData)) { - errorHandler.execute(frame, decoder, internErrorAction.execute(inliningTarget, errors), factory.createBytes(bytes, len)); + errorHandler.execute(frame, decoder, internErrorAction.execute(inliningTarget, errors), PFactory.createBytes(language, bytes, len)); } } catch (OutOfMemoryError e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw raiseNode.raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } - return factory.createTuple(new Object[]{decoder.getString(), decoder.getInputPosition()}); + return PFactory.createTuple(language, new Object[]{decoder.getString(), decoder.getInputPosition()}); } finally { bufferLib.release(buffer, frame, indirectCallData); } @@ -733,26 +732,26 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization Object decodeByteArray(byte[] bytes, TruffleString errors, - @Shared @Cached PythonObjectFactory factory) { - return decodeBytes(bytes, bytes.length, errors, factory); + @Bind PythonLanguage language) { + return decodeBytes(bytes, bytes.length, errors, language); } @Specialization(limit = "3") Object decode(VirtualFrame frame, Object buffer, TruffleString errors, + @Bind PythonLanguage language, @Cached("createFor(this)") IndirectCallData indirectCallData, - @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib, - @Shared @Cached PythonObjectFactory factory) { + @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib) { try { int len = bufferLib.getBufferLength(buffer); - return decodeBytes(bufferLib.getInternalOrCopiedByteArray(buffer), len, errors, factory); + return decodeBytes(bufferLib.getInternalOrCopiedByteArray(buffer), len, errors, language); } finally { bufferLib.release(buffer, frame, indirectCallData); } } - private Object decodeBytes(byte[] bytes, int len, TruffleString errors, PythonObjectFactory factory) { + private Object decodeBytes(byte[] bytes, int len, TruffleString errors, PythonLanguage language) { ByteArrayBuffer result = doDecode(bytes, len, errors); - return factory.createTuple(new Object[]{factory.createBytes(result.getInternalBytes(), result.getLength()), len}); + return PFactory.createTuple(language, new Object[]{PFactory.createBytes(language, result.getInternalBytes(), result.getLength()), len}); } @TruffleBoundary @@ -767,7 +766,7 @@ private ByteArrayBuffer doDecode(byte[] bytes, int bytesLen, TruffleString error i++; if (i >= bytesLen) { - throw PRaiseNode.raiseUncached(this, ValueError, ErrorMessages.TRAILING_S_IN_STR, "\\"); + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.TRAILING_S_IN_STR, "\\"); } chr = (char) bytes[i]; @@ -842,14 +841,14 @@ private ByteArrayBuffer doDecode(byte[] bytes, int bytesLen, TruffleString error } // invalid hexadecimal digits if (T_STRICT.equalsUncached(errors, TS_ENCODING)) { - throw PRaiseNode.raiseUncached(this, ValueError, INVALID_ESCAPE_AT, "\\x", i - 2); + throw PRaiseNode.raiseStatic(this, ValueError, INVALID_ESCAPE_AT, "\\x", i - 2); } if (T_REPLACE.equalsUncached(errors, TS_ENCODING)) { buffer.append('?'); } else if (T_IGNORE.equalsUncached(errors, TS_ENCODING)) { // do nothing } else { - throw PRaiseNode.raiseUncached(this, ValueError, ENCODING_ERROR_WITH_CODE, errors); + throw PRaiseNode.raiseStatic(this, ValueError, ENCODING_ERROR_WITH_CODE, errors); } // skip \x @@ -885,8 +884,8 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization Object encode(PBytes data, @SuppressWarnings("unused") TruffleString errors, @Bind("this") Node inliningTarget, - @Cached GetInternalByteArrayNode getInternalByteArrayNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @Cached GetInternalByteArrayNode getInternalByteArrayNode) { byte[] bytes = getInternalByteArrayNode.execute(inliningTarget, data.getSequenceStorage()); int size = data.getSequenceStorage().length(); ByteArrayBuffer buffer = new ByteArrayBuffer(); @@ -917,16 +916,16 @@ Object encode(PBytes data, @SuppressWarnings("unused") TruffleString errors, } } - return factory.createTuple(new Object[]{ - factory.createBytes(buffer.getByteArray()), + return PFactory.createTuple(language, new Object[]{ + PFactory.createBytes(language, buffer.getByteArray()), size }); } @Fallback static Object encode(Object data, @SuppressWarnings("unused") Object errors, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, BYTESLIKE_OBJ_REQUIRED, data); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, BYTESLIKE_OBJ_REQUIRED, data); } } @@ -981,7 +980,7 @@ static PTuple lookup(VirtualFrame frame, Node inliningTarget, TruffleString enco @Cached InlinedConditionProfile hasTruffleEncodingProfile, @Cached InlinedConditionProfile isTupleProfile, @Cached NormalizeEncodingNameNode normalizeEncodingNameNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { TruffleString normalizedEncoding = normalizeEncodingNameNode.execute(inliningTarget, encoding); PythonContext context = PythonContext.get(inliningTarget); ensureRegistryInitialized(context); @@ -991,14 +990,14 @@ static PTuple lookup(VirtualFrame frame, Node inliningTarget, TruffleString enco } if (hasTruffleEncodingProfile.profile(inliningTarget, hasTruffleEncodingNormalized(normalizedEncoding))) { PythonModule codecs = context.lookupBuiltinModule(T__CODECS_TRUFFLE); - result = CodecsTruffleModuleBuiltins.codecsInfo(codecs, encoding, context, context.factory()); + result = CodecsTruffleModuleBuiltins.codecsInfo(codecs, encoding, context); } else { Object[] searchPaths = getSearchPaths(context); for (Object func : searchPaths) { Object obj = callNode.executeObject(func, normalizedEncoding); if (obj != PNone.NONE) { if (isTupleProfile.profile(inliningTarget, !isTupleInstanceCheck(frame, inliningTarget, obj, 4, typeCheck, sizeNode))) { - throw raiseNode.get(inliningTarget).raise(TypeError, CODEC_SEARCH_MUST_RETURN_4); + throw raiseNode.raise(inliningTarget, TypeError, CODEC_SEARCH_MUST_RETURN_4); } result = (PTuple) obj; break; @@ -1009,7 +1008,7 @@ static PTuple lookup(VirtualFrame frame, Node inliningTarget, TruffleString enco putSearchPath(context, normalizedEncoding, result); return result; } - throw raiseNode.get(inliningTarget).raise(LookupError, UNKNOWN_ENCODING, encoding); + throw raiseNode.raise(inliningTarget, LookupError, UNKNOWN_ENCODING, encoding); } @TruffleBoundary @@ -1044,14 +1043,14 @@ abstract static class RegisterNode extends PythonUnaryBuiltinNode { static Object lookup(Object searchFunction, @Bind("this") Node inliningTarget, @Cached PyCallableCheckNode callableCheckNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (callableCheckNode.execute(inliningTarget, searchFunction)) { PythonContext context = PythonContext.get(inliningTarget); ensureRegistryInitialized(context); add(context, searchFunction); return PNone.NONE; } else { - throw raiseNode.get(inliningTarget).raise(TypeError, ARG_MUST_BE_CALLABLE); + throw raiseNode.raise(inliningTarget, TypeError, ARG_MUST_BE_CALLABLE); } } @@ -1156,11 +1155,11 @@ static Object encode(VirtualFrame frame, Object obj, TruffleString encoding, Tru @Cached PyObjectSizeNode sizeNode, @Cached PyObjectTypeCheck typeCheck, @Cached InlinedConditionProfile isTupleProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object encoder = CodecsModuleBuiltins.encoder(frame, encoding, lookupNode, getItemNode); Object result = callEncoderNode.executeObject(encoder, obj, errors); if (isTupleProfile.profile(inliningTarget, !isTupleInstanceCheck(frame, inliningTarget, result, 2, typeCheck, sizeNode))) { - throw raiseNode.get(inliningTarget).raise(TypeError, S_MUST_RETURN_TUPLE, "encoder"); + throw raiseNode.raise(inliningTarget, TypeError, S_MUST_RETURN_TUPLE, "encoder"); } return getResultItemNode.execute(((PTuple) result).getSequenceStorage(), 0); } @@ -1189,11 +1188,11 @@ static Object decode(VirtualFrame frame, Object obj, TruffleString encoding, Tru @Cached PyObjectSizeNode sizeNode, @Cached PyObjectTypeCheck typeCheck, @Cached InlinedConditionProfile isTupleProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object decoder = CodecsModuleBuiltins.decoder(frame, encoding, lookupNode, getItemNode); Object result = callEncoderNode.executeObject(decoder, obj, errors); if (isTupleProfile.profile(inliningTarget, !isTupleInstanceCheck(frame, inliningTarget, result, 2, typeCheck, sizeNode))) { - throw raiseNode.get(inliningTarget).raise(TypeError, S_MUST_RETURN_TUPLE, "decoder"); + throw raiseNode.raise(inliningTarget, TypeError, S_MUST_RETURN_TUPLE, "decoder"); } return getResultItemNode.execute(((PTuple) result).getSequenceStorage(), 0); } @@ -1318,8 +1317,8 @@ abstract static class UTF16EXDecodeNode extends PythonQuaternaryBuiltinNode { @SuppressWarnings("unused") @Specialization static Object encode(VirtualFrame frame, Object obj, Object errors, Object byteorder, Object ffinal, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(NotImplementedError, toTruffleStringUncached("utf_16_ex_decode")); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, toTruffleStringUncached("utf_16_ex_decode")); } } @@ -1390,7 +1389,7 @@ abstract static class UTF32EXDecodeNode extends PythonQuaternaryBuiltinNode { @Specialization @TruffleBoundary Object encode(Object obj, Object errors, Object byteorder, Object ffinal) { - throw PRaiseNode.raiseUncached(this, NotImplementedError, toTruffleStringUncached("utf_32_ex_decode")); + throw PRaiseNode.raiseStatic(this, NotImplementedError, toTruffleStringUncached("utf_32_ex_decode")); } } @@ -1401,7 +1400,7 @@ abstract static class UnicodeInternalEncodeNode extends PythonBinaryBuiltinNode @Specialization @TruffleBoundary Object encode(Object obj, Object errors) { - throw PRaiseNode.raiseUncached(this, NotImplementedError, toTruffleStringUncached("unicode_internal_encode")); + throw PRaiseNode.raiseStatic(this, NotImplementedError, toTruffleStringUncached("unicode_internal_encode")); } } @@ -1412,7 +1411,7 @@ abstract static class UnicodeInternalDecodeNode extends PythonBinaryBuiltinNode @Specialization @TruffleBoundary Object encode(Object obj, Object errors) { - throw PRaiseNode.raiseUncached(this, NotImplementedError, toTruffleStringUncached("unicode_internal_decode")); + throw PRaiseNode.raiseStatic(this, NotImplementedError, toTruffleStringUncached("unicode_internal_decode")); } } @@ -1510,12 +1509,12 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization Object doIt(VirtualFrame frame, TruffleString str, TruffleString errors, Object mapping, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached TruffleString.CodePointLengthNode codePointLengthNode, - @Cached PyUnicodeEncodeCharmapNode encodeCharmapNode, - @Cached PythonObjectFactory factory) { + @Cached PyUnicodeEncodeCharmapNode encodeCharmapNode) { int len = codePointLengthNode.execute(str, TS_ENCODING); - PBytes result = factory.createBytes(encodeCharmapNode.execute(frame, inliningTarget, str, errors, mapping)); - return factory.createTuple(new Object[]{result, len}); + PBytes result = PFactory.createBytes(language, encodeCharmapNode.execute(frame, inliningTarget, str, errors, mapping)); + return PFactory.createTuple(language, new Object[]{result, len}); } } @@ -1531,12 +1530,13 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(limit = "3") Object doIt(VirtualFrame frame, Object data, TruffleString errors, Object mapping, + @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("data") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, - @Cached PyUnicodeDecodeCharmapNode pyUnicodeDecodeCharmapNode, - @Cached PythonObjectFactory factory) { - Object dataBuffer = bufferAcquireLib.acquireReadonly(data, frame, getContext(), getLanguage(), indirectCallData); + @Cached PyUnicodeDecodeCharmapNode pyUnicodeDecodeCharmapNode) { + Object dataBuffer = bufferAcquireLib.acquireReadonly(data, frame, context, context.getLanguage(inliningTarget), indirectCallData); int len; try { len = bufferLib.getBufferLength(dataBuffer); @@ -1544,7 +1544,7 @@ Object doIt(VirtualFrame frame, Object data, TruffleString errors, Object mappin bufferLib.release(dataBuffer, frame, indirectCallData); } TruffleString result = len == 0 ? T_EMPTY_STRING : pyUnicodeDecodeCharmapNode.execute(frame, data, errors, mapping); - return factory.createTuple(new Object[]{result, len}); + return PFactory.createTuple(context.getLanguage(inliningTarget), new Object[]{result, len}); } } @@ -1555,7 +1555,7 @@ abstract static class ReadbufferEncodeNode extends PythonBinaryBuiltinNode { @Specialization @TruffleBoundary Object encode(Object obj, Object errors) { - throw PRaiseNode.raiseUncached(this, NotImplementedError, toTruffleStringUncached("readbuffer_encode")); + throw PRaiseNode.raiseStatic(this, NotImplementedError, toTruffleStringUncached("readbuffer_encode")); } } @@ -1591,7 +1591,7 @@ abstract static class OEMEncodeNode extends PythonBinaryBuiltinNode { @Specialization @TruffleBoundary Object encode(Object obj, Object errors) { - throw PRaiseNode.raiseUncached(this, NotImplementedError, toTruffleStringUncached("oem_encode")); + throw PRaiseNode.raiseStatic(this, NotImplementedError, toTruffleStringUncached("oem_encode")); } } @@ -1601,8 +1601,8 @@ abstract static class OEMDecodeNode extends PythonTernaryBuiltinNode { @SuppressWarnings("unused") @Specialization static Object decode(Object obj, Object errors, Object ffinal, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(NotImplementedError, toTruffleStringUncached("oem_decode")); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, toTruffleStringUncached("oem_decode")); } } @@ -1612,8 +1612,8 @@ abstract static class CodePageEncodeNode extends PythonTernaryBuiltinNode { @SuppressWarnings("unused") @Specialization static Object encode(Object code_page, Object string, Object errors, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(NotImplementedError, toTruffleStringUncached("code_page_encode")); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, toTruffleStringUncached("code_page_encode")); } } @@ -1623,8 +1623,8 @@ abstract static class CodePageDecodeNode extends PythonQuaternaryBuiltinNode { @SuppressWarnings("unused") @Specialization static Object decode(Object code_page, Object obj, Object errors, Object ffinal, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(NotImplementedError, toTruffleStringUncached("code_page_decode")); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, toTruffleStringUncached("code_page_decode")); } } @@ -1646,17 +1646,6 @@ Object doIt(VirtualFrame frame, TruffleString map, } } - @Builtin(name = "EncodingMap", takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PEncodingMap, isPublic = false) - @GenerateNodeFactory - abstract static class EncodingMapNode extends PythonBuiltinNode { - @Specialization - @SuppressWarnings("unused") - static Object encodingMap(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, "EncodingMap"); - } - } - static class TruffleEncoder { private final TruffleString encodingName; private final CharsetEncoder encoder; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CodecsTruffleModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CodecsTruffleModuleBuiltins.java index d5b12188a1..450d2465f5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CodecsTruffleModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CodecsTruffleModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -53,7 +53,6 @@ import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T_DECODE; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INIT__; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.util.ArrayList; @@ -80,7 +79,10 @@ import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; import com.oracle.graal.python.builtins.objects.type.PythonClass; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetBaseClassNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotVarargs; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.lib.PyObjectSetAttr; @@ -91,7 +93,6 @@ import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; @@ -99,7 +100,7 @@ import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; import com.oracle.graal.python.nodes.statement.AbstractImportNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; @@ -158,15 +159,13 @@ protected List> getNodeFa } private static PythonClass initClass(TruffleString className, TruffleString superClassName, BuiltinDescr[] descrs, PythonModule codecsTruffleModule, PythonModule codecsModule, - PythonLanguage language, - PythonObjectFactory factory) { + PythonLanguage language) { PythonAbstractClass superClass = (PythonAbstractClass) codecsModule.getAttribute(superClassName); - return initClass(className, superClass, descrs, codecsTruffleModule, language, factory); + return initClass(className, superClass, descrs, codecsTruffleModule, language); } - private static PythonClass initClass(TruffleString className, PythonAbstractClass superClass, BuiltinDescr[] descrs, PythonModule codecsTruffleModule, PythonLanguage language, - PythonObjectFactory factory) { - PythonClass clazz = factory.createPythonClassAndFixupSlots(language, PythonBuiltinClassType.PythonClass, className, superClass, new PythonAbstractClass[]{superClass}); + private static PythonClass initClass(TruffleString className, PythonAbstractClass superClass, BuiltinDescr[] descrs, PythonModule codecsTruffleModule, PythonLanguage language) { + PythonClass clazz = PFactory.createPythonClassAndFixupSlots(language, className, superClass, new PythonAbstractClass[]{superClass}); for (BuiltinDescr d : descrs) { PythonUtils.createMethod(language, clazz, d.nodeFactory(), d.enclosingType ? clazz : null, 1); } @@ -180,42 +179,47 @@ private record BuiltinDescr(NodeFactory nodeFac } @TruffleBoundary - static PTuple codecsInfo(PythonModule self, TruffleString encoding, PythonContext context, PythonObjectFactory factory) { + static PTuple codecsInfo(PythonModule self, TruffleString encoding, PythonContext context) { PythonModule codecsModule = AbstractImportNode.importModule(T_CODECS); CodecsTruffleModuleBuiltins codecsTruffleBuiltins = (CodecsTruffleModuleBuiltins) self.getBuiltins(); if (self.getAttribute(T_TRUFFLE_CODEC) instanceof PNone) { - initCodecClasses(self, codecsModule, context, factory); + initCodecClasses(self, codecsModule, context); } + PythonLanguage language = context.getLanguage(); // encode/decode methods for codecs.CodecInfo - PythonObject truffleCodec = factory.createPythonObject(codecsTruffleBuiltins.truffleCodecClass); + PythonObject truffleCodec = createPythonObject(language, codecsTruffleBuiltins.truffleCodecClass); truffleCodec.setAttribute(T_ATTR_ENCODING, encoding); Object encodeMethod = PyObjectGetAttr.executeUncached(truffleCodec, T_ENCODE); Object decodeMethod = PyObjectGetAttr.executeUncached(truffleCodec, T_DECODE); // incrementalencoder factory function for codecs.CodecInfo - PythonObject tie = factory.createPythonObject(codecsTruffleBuiltins.applyEncodingClass); + PythonObject tie = createPythonObject(language, codecsTruffleBuiltins.applyEncodingClass); tie.setAttribute(T_ATTR_FN, codecsTruffleBuiltins.truffleIncrementalEncoderClass); tie.setAttribute(T_ATTR_ENCODING, encoding); // incrementaldecoder factory function for codecs.CodecInfo - PythonObject tid = factory.createPythonObject(codecsTruffleBuiltins.applyEncodingClass); + PythonObject tid = createPythonObject(language, codecsTruffleBuiltins.applyEncodingClass); tid.setAttribute(T_ATTR_FN, codecsTruffleBuiltins.truffleIncrementalDecoderClass); tid.setAttribute(T_ATTR_ENCODING, encoding); // streamwriter factory function for codecs.CodecInfo - PythonObject sr = factory.createPythonObject(codecsTruffleBuiltins.applyEncodingClass); + PythonObject sr = createPythonObject(language, codecsTruffleBuiltins.applyEncodingClass); sr.setAttribute(T_ATTR_FN, codecsTruffleBuiltins.truffleStreamReaderClass); sr.setAttribute(T_ATTR_ENCODING, encoding); // streamreader factory function for codecs.CodecInfo - PythonObject sw = factory.createPythonObject(codecsTruffleBuiltins.applyEncodingClass); + PythonObject sw = createPythonObject(language, codecsTruffleBuiltins.applyEncodingClass); sw.setAttribute(T_ATTR_FN, codecsTruffleBuiltins.truffleStreamWriterClass); sw.setAttribute(T_ATTR_ENCODING, encoding); // codecs.CodecInfo PythonAbstractClass codecInfoClass = (PythonAbstractClass) codecsModule.getAttribute(T_CODEC_INFO_NAME); - return (PTuple) CallVarargsMethodNode.getUncached().execute(null, codecInfoClass, new Object[]{}, createCodecInfoArgs(encoding, encodeMethod, decodeMethod, tie, tid, sr, sw)); + return (PTuple) CallNode.getUncached().execute(null, codecInfoClass, new Object[]{}, createCodecInfoArgs(encoding, encodeMethod, decodeMethod, tie, tid, sr, sw)); + } + + private static PythonObject createPythonObject(PythonLanguage language, PythonClass cls) { + return PFactory.createPythonObject(language, cls, cls.getInstanceShape()); } private static PKeyword[] createCodecInfoArgs(TruffleString encoding, Object encodeMethod, Object decodeMethod, PythonObject tie, PythonObject tid, PythonObject sr, PythonObject sw) { @@ -234,12 +238,12 @@ private static PKeyword[] createCodecInfoArgs(TruffleString encoding, Object enc * create classes based on types declared in lib/3/codes.py */ // @formatter:off - private static void initCodecClasses(PythonModule codecsTruffleModule, PythonModule codecsModule, PythonContext context, PythonObjectFactory factory) { + private static void initCodecClasses(PythonModule codecsTruffleModule, PythonModule codecsModule, PythonContext context) { // TODO - the incremental codec and reader/writer won't work well with stateful // encodings, like some of the CJK encodings CodecsTruffleModuleBuiltins codecsTruffleBuiltins = (CodecsTruffleModuleBuiltins) codecsTruffleModule.getBuiltins(); - PythonLanguage language = PythonLanguage.get(null); + PythonLanguage language = context.getLanguage(); // class TruffleCodec(codecs.Codec): // def encode(self, input, errors='strict'): @@ -250,7 +254,7 @@ private static void initCodecClasses(PythonModule codecsTruffleModule, PythonMod new BuiltinDescr[]{ new BuiltinDescr(EncodeNodeFactory.getInstance(), false), new BuiltinDescr(CodecDecodeNodeFactory.getInstance(), true)}, - codecsTruffleModule, language, factory); + codecsTruffleModule, language); // class TruffleIncrementalEncoder(codecs.IncrementalEncoder): // def __init__(self, encoding, *args, **kwargs): @@ -262,7 +266,7 @@ private static void initCodecClasses(PythonModule codecsTruffleModule, PythonMod new BuiltinDescr[]{ new BuiltinDescr(CodecInitNodeFactory.getInstance(), false), new BuiltinDescr(IncrementalEncodeNodeFactory.getInstance(), true)}, - codecsTruffleModule, codecsModule, language, factory); + codecsTruffleModule, codecsModule, language); // class TruffleIncrementalDecoder(codecs.BufferedIncrementalDecoder): // def __init__(self, encoding, *args, **kwargs): @@ -274,7 +278,7 @@ private static void initCodecClasses(PythonModule codecsTruffleModule, PythonMod new BuiltinDescr[]{ new BuiltinDescr(CodecInitNodeFactory.getInstance(), false), new BuiltinDescr(IncrementalDecodeNodeFactory.getInstance(), true)}, - codecsTruffleModule, codecsModule, language, factory); + codecsTruffleModule, codecsModule, language); // class TruffleStreamWriter(codecs.StreamWriter): // def __init__(self, encoding, *args, **kwargs): @@ -286,7 +290,7 @@ private static void initCodecClasses(PythonModule codecsTruffleModule, PythonMod new BuiltinDescr[]{ new BuiltinDescr(CodecInitNodeFactory.getInstance(), false), new BuiltinDescr(EncodeNodeFactory.getInstance(), true)}, - codecsTruffleModule, codecsModule, language, factory); + codecsTruffleModule, codecsModule, language); // class TruffleStreamReader(codecs.StreamReader): // def __init__(self, encoding, *args, **kwargs): @@ -298,7 +302,7 @@ private static void initCodecClasses(PythonModule codecsTruffleModule, PythonMod new BuiltinDescr[]{ new BuiltinDescr(CodecInitNodeFactory.getInstance(), false), new BuiltinDescr(StreamDecodeNodeFactory.getInstance(), true)}, - codecsTruffleModule, codecsModule, language, factory); + codecsTruffleModule, codecsModule, language); // serves as factory function for CodecInfo-s incrementalencoder/decode and streamwriter/reader // class apply_encoding: @@ -306,7 +310,7 @@ private static void initCodecClasses(PythonModule codecsTruffleModule, PythonMod // return self.fn(self.encoding, *args, **kwargs) codecsTruffleBuiltins.applyEncodingClass = initClass(T_APPLY_ENCODING, context.lookupType(PythonBuiltinClassType.PythonObject), new BuiltinDescr[]{new BuiltinDescr(CallApplyNodeFactory.getInstance(), false)}, - codecsTruffleModule, language, factory); + codecsTruffleModule, language); } // @formatter:on @@ -314,22 +318,17 @@ private static void initCodecClasses(PythonModule codecsTruffleModule, PythonMod @GenerateNodeFactory protected abstract static class CodecInitNode extends PythonVarargsBuiltinNode { @Specialization - Object init(VirtualFrame frame, PythonObject self, Object[] args, PKeyword[] kw, + static Object init(VirtualFrame frame, PythonObject self, Object[] args, PKeyword[] kw, @Bind("this") Node inliningTarget, - @Cached PyObjectGetAttr getAttrNode, @Cached PyObjectSetAttr setAttrNode, @Cached GetPythonObjectClassNode getClass, @Cached GetBaseClassNode getBaseClassNode, - @Cached CallNode callNode) { + @Cached GetCachedTpSlotsNode getSlots, + @Cached TpSlotVarargs.CallSlotTpInitNode callInit) { assert args.length > 0; Object base = getBaseClassNode.execute(inliningTarget, getClass.execute(inliningTarget, self)); - Object superInit = getAttrNode.execute(frame, inliningTarget, base, T___INIT__); - Object[] callArgs = new Object[args.length]; - callArgs[0] = self; - if (args.length > 1) { - PythonUtils.arraycopy(args, 1, callArgs, 1, args.length - 1); - } - callNode.execute(frame, superInit, callArgs, kw); + TpSlots baseSlots = getSlots.execute(inliningTarget, base); + callInit.execute(frame, inliningTarget, baseSlots.tp_init(), self, PythonUtils.arrayCopyOfRange(args, 1, args.length), kw); setAttrNode.execute(frame, inliningTarget, self, T_ATTR_ENCODING, args[0]); return PNone.NONE; } @@ -342,7 +341,7 @@ protected abstract static class CallApplyNode extends PythonVarargsBuiltinNode { Object call(VirtualFrame frame, PythonObject self, Object[] args, PKeyword[] kw, @Bind("this") Node inliningTarget, @Cached PyObjectGetAttr getAttrNode, - @Cached CallVarargsMethodNode callNode) { + @Cached CallNode callNode) { Object[] callArgs = new Object[args.length + 1]; callArgs[0] = getAttrNode.execute(frame, inliningTarget, self, T_ATTR_ENCODING); PythonUtils.arraycopy(args, 0, callArgs, 1, args.length); @@ -429,7 +428,7 @@ Object lookup(VirtualFrame frame, TruffleString encoding, TruffleString alternat PTuple codecInfo = lookupNode.execute(frame, inliningTarget, encoding); Object isTextObj = getAttributeNode.execute(frame, inliningTarget, codecInfo, T_IS_TEXT_ENCODING); if (!((isTextObj instanceof Boolean) && (boolean) isTextObj)) { - throw raiseNode.raise(LookupError, IS_NOT_TEXT_ENCODING, encoding, alternateCommand); + throw raiseNode.raise(inliningTarget, LookupError, IS_NOT_TEXT_ENCODING, encoding, alternateCommand); } return codecInfo; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CollectionsModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CollectionsModuleBuiltins.java index 801772f68c..9866cf8ada 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CollectionsModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CollectionsModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,159 +40,18 @@ */ package com.oracle.graal.python.builtins.modules; -import static com.oracle.graal.python.nodes.BuiltinNames.J_DEFAULTDICT; -import static com.oracle.graal.python.nodes.BuiltinNames.J_DEQUE; -import static com.oracle.graal.python.nodes.BuiltinNames.J_DEQUE_ITER; -import static com.oracle.graal.python.nodes.BuiltinNames.J_DEQUE_REV_ITER; -import static com.oracle.graal.python.nodes.BuiltinNames.J_TUPLE_GETTER; - +import java.util.Collections; import java.util.List; -import com.oracle.graal.python.annotations.ArgumentClinic; -import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.deque.DequeIterBuiltins.DequeIterNextNode; -import com.oracle.graal.python.builtins.objects.deque.PDeque; -import com.oracle.graal.python.builtins.objects.deque.PDequeIter; -import com.oracle.graal.python.builtins.objects.dict.PDefaultDict; -import com.oracle.graal.python.builtins.objects.function.PKeyword; -import com.oracle.graal.python.lib.PyNumberIndexNode; -import com.oracle.graal.python.nodes.BuiltinNames; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; @CoreFunctions(defineModule = "_collections") public final class CollectionsModuleBuiltins extends PythonBuiltins { @Override protected List> getNodeFactories() { - return CollectionsModuleBuiltinsFactory.getFactories(); - } - - // _collections.deque - @Builtin(name = J_DEQUE, minNumOfPositionalArgs = 1, constructsClass = PythonBuiltinClassType.PDeque, takesVarArgs = true, takesVarKeywordArgs = true) - @GenerateNodeFactory - abstract static class DequeNode extends PythonVarargsBuiltinNode { - - @Override - public Object varArgExecute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported { - if (arguments.length >= 1) { - return doGeneric(arguments[0], null, null); - } - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw VarargsBuiltinDirectInvocationNotSupported.INSTANCE; - } - - @Specialization - @SuppressWarnings("unused") - PDeque doGeneric(Object cls, Object[] args, PKeyword[] kwargs) { - return factory().createDeque(cls); - } - } - - // _collections._deque_iterator - @Builtin(name = J_DEQUE_ITER, constructsClass = PythonBuiltinClassType.PDequeIter, // - minNumOfPositionalArgs = 2, parameterNames = {"$self", "iterable", "index"}) - @GenerateNodeFactory - abstract static class DequeIterNode extends PythonTernaryBuiltinNode { - - @Specialization - static PDequeIter doGeneric(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object deque, Object indexObj, - @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile dequeProfile, - @Cached InlinedConditionProfile indexNoneProfile, - @Cached PyNumberIndexNode toIndexNode, - @Cached CastToJavaIntExactNode castToJavaIntExactNode, - @Cached DequeIterNextNode getNextNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!dequeProfile.profile(inliningTarget, deque instanceof PDeque)) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.EXPECTED_OBJ_TYPE_S_GOT_P, BuiltinNames.T_DEQUE, deque); - } - PDequeIter dequeIter = factory.createDequeIter((PDeque) deque); - if (indexNoneProfile.profile(inliningTarget, indexObj != PNone.NO_VALUE)) { - int index = castToJavaIntExactNode.execute(inliningTarget, toIndexNode.execute(frame, inliningTarget, indexObj)); - for (int i = 0; i < index; i++) { - getNextNode.execute(dequeIter); - } - } - return dequeIter; - } - } - - // _collections._deque_reverse_iterator - @Builtin(name = J_DEQUE_REV_ITER, constructsClass = PythonBuiltinClassType.PDequeRevIter, // - minNumOfPositionalArgs = 2, parameterNames = {"$self", "iterable", "index"}) - @GenerateNodeFactory - abstract static class DequeRevIterNode extends PythonTernaryBuiltinNode { - @Specialization - static PDequeIter doGeneric(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object deque, Object indexObj, - @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile dequeProfile, - @Cached InlinedConditionProfile indexNoneProfile, - @Cached PyNumberIndexNode toIndexNode, - @Cached CastToJavaIntExactNode castToJavaIntExactNode, - @Cached DequeIterNextNode getNextNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!dequeProfile.profile(inliningTarget, deque instanceof PDeque)) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.EXPECTED_OBJ_TYPE_S_GOT_P, BuiltinNames.T_DEQUE, deque); - } - PDequeIter dequeIter = factory.createDequeRevIter((PDeque) deque); - if (indexNoneProfile.profile(inliningTarget, indexObj != PNone.NO_VALUE)) { - int index = castToJavaIntExactNode.execute(inliningTarget, toIndexNode.execute(frame, inliningTarget, indexObj)); - for (int i = 0; i < index; i++) { - getNextNode.execute(dequeIter); - } - } - return dequeIter; - } - } - - // _collections.defaultdict - @Builtin(name = J_DEFAULTDICT, minNumOfPositionalArgs = 1, constructsClass = PythonBuiltinClassType.PDefaultDict, takesVarArgs = true, takesVarKeywordArgs = true) - @GenerateNodeFactory - abstract static class DefaultDictNode extends PythonVarargsBuiltinNode { - @Specialization - @SuppressWarnings("unused") - PDefaultDict doGeneric(Object cls, Object[] args, PKeyword[] kwargs, - @Cached PythonObjectFactory factory) { - return factory.createDefaultDict(cls); - } - } - - // _collections._tuplegetter - @Builtin(name = J_TUPLE_GETTER, parameterNames = {"cls", "index", "doc"}, constructsClass = PythonBuiltinClassType.PTupleGetter) - @ArgumentClinic(name = "index", conversion = ArgumentClinic.ClinicConversion.Index) - @GenerateNodeFactory - abstract static class TupleGetterNode extends PythonTernaryClinicBuiltinNode { - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return CollectionsModuleBuiltinsClinicProviders.TupleGetterNodeClinicProviderGen.INSTANCE; - } - - @Specialization - Object construct(Object cls, int index, Object doc, - @Cached PythonObjectFactory factory) { - return factory.createTupleGetter(cls, index, doc); - } + return Collections.emptyList(); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ContextvarsModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ContextvarsModuleBuiltins.java index 23dc550b09..986c74ed29 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ContextvarsModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ContextvarsModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,34 +41,22 @@ package com.oracle.graal.python.builtins.modules; import static com.oracle.graal.python.nodes.BuiltinNames.J__CONTEXTVARS; -import static com.oracle.graal.python.nodes.PGuards.isNoValue; import java.util.List; -import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.objects.contextvars.PContextVar; import com.oracle.graal.python.builtins.objects.contextvars.PContextVarsContext; import com.oracle.graal.python.lib.PyContextCopyCurrent; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; -import com.oracle.truffle.api.strings.TruffleString; @CoreFunctions(defineModule = J__CONTEXTVARS) public final class ContextvarsModuleBuiltins extends PythonBuiltins { @@ -88,46 +76,4 @@ protected static PContextVarsContext copyCtx( return copyCurrent.execute(inliningTarget); } } - - @Builtin(name = "ContextVar", minNumOfPositionalArgs = 2, parameterNames = {"cls", "name", "default"}, constructsClass = PythonBuiltinClassType.ContextVar) - @ArgumentClinic(name = "name", conversion = ArgumentClinic.ClinicConversion.TString) - @GenerateNodeFactory - public abstract static class ContextVarNode extends PythonTernaryClinicBuiltinNode { - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return ContextvarsModuleBuiltinsClinicProviders.ContextVarNodeClinicProviderGen.INSTANCE; - } - - @Specialization - protected static Object constructDef(@SuppressWarnings("unused") Object cls, TruffleString name, Object def, - @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile noValueProfile, - @Cached PythonObjectFactory factory) { - if (noValueProfile.profile(inliningTarget, isNoValue(def))) { - def = PContextVar.NO_DEFAULT; - } - return factory.createContextVar(name, def); - } - } - - @Builtin(name = "Context", minNumOfPositionalArgs = 1, constructsClass = PythonBuiltinClassType.ContextVarsContext) - @GenerateNodeFactory - public abstract static class ContextNode extends PythonUnaryBuiltinNode { - @Specialization - static Object construct(@SuppressWarnings("unused") Object cls, - @Cached PythonObjectFactory factory) { - return factory.createContextVarsContext(); - } - } - - @Builtin(name = "Token", minNumOfPositionalArgs = 1, constructsClass = PythonBuiltinClassType.ContextVarsToken) - @GenerateNodeFactory - public abstract static class TokenNode extends PythonUnaryBuiltinNode { - @Specialization - Object construct(@SuppressWarnings("unused") Object cls, - @Cached PRaiseNode raise) { - throw raise.raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.TOKEN_ONLY_BY_CONTEXTVAR); - } - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ErrnoModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ErrnoModuleBuiltins.java index 2972ac9617..47a4fd0c59 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ErrnoModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ErrnoModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -51,8 +51,8 @@ import com.oracle.graal.python.builtins.objects.common.EconomicMapStorage; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum; -import com.oracle.graal.python.lib.PyObjectHashNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.strings.TruffleString; @@ -75,12 +75,12 @@ public void initialize(Python3Core core) { } // publish the dictionary with mapping code -> string name - PDict errorCode = core.factory().createDict(storage); + PDict errorCode = PFactory.createDict(core.getLanguage(), storage); addBuiltinConstant("errorcode", errorCode); } private void addConstant(int number, TruffleString name, EconomicMapStorage storage) { addBuiltinConstant(name, number); - storage.putUncachedWithJavaEq(number, PyObjectHashNode.hash(number), name); + storage.putUncached(number, name); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/FaulthandlerModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/FaulthandlerModuleBuiltins.java index 2e0b515eee..32fdbb47c6 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/FaulthandlerModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/FaulthandlerModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -113,8 +113,8 @@ abstract static class DumpTracebackNode extends PythonClinicBuiltinNode { @Specialization PNone doit(VirtualFrame frame, Object file, boolean allThreads, @Cached("createFor(this)") IndirectCallData indirectCallData) { - PythonLanguage language = PythonLanguage.get(this); PythonContext context = getContext(); + PythonLanguage language = context.getLanguage(this); Object state = IndirectCallContext.enter(frame, language, context, indirectCallData); try { // it's not important for this to be fast at all @@ -136,7 +136,7 @@ private static void dump(PythonLanguage language, PythonContext context, Object } if (allThreads) { - if (PythonOptions.isWithJavaStacktrace(language)) { + if (PythonOptions.isPExceptionWithJavaStacktrace(language)) { PrintWriter err = new PrintWriter(context.getStandardErr()); Thread[] ths = context.getThreads(); for (Map.Entry e : Thread.getAllStackTraces().entrySet()) { @@ -165,7 +165,7 @@ protected void perform(ThreadLocalAction.Access access) { } }); } else { - if (PythonOptions.isWithJavaStacktrace(language)) { + if (PythonOptions.isPExceptionWithJavaStacktrace(language)) { PrintWriter err = new PrintWriter(context.getStandardErr()); err.println(); err.println(Thread.currentThread()); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/FcntlModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/FcntlModuleBuiltins.java index 6e20c9bea8..947eca1ea7 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/FcntlModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/FcntlModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -79,8 +79,9 @@ import com.oracle.graal.python.runtime.PosixConstants.IntConstant; import com.oracle.graal.python.runtime.PosixSupportLibrary; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; +import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -152,7 +153,7 @@ PNone lockf(VirtualFrame frame, int fd, int code, Object lenObj, Object startObj @Cached SysModuleBuiltins.AuditNode auditNode, @CachedLibrary("getPosixSupport()") PosixSupportLibrary posix, @Cached PyLongAsLongNode asLongNode, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { auditNode.audit(inliningTarget, "fcntl.lockf", fd, code, lenObj != PNone.NO_VALUE ? lenObj : PNone.NONE, startObj != PNone.NO_VALUE ? startObj : PNone.NONE, whence); int lockType; @@ -163,7 +164,7 @@ PNone lockf(VirtualFrame frame, int fd, int code, Object lenObj, Object startObj } else if ((code & LOCK_EX.value) != 0) { lockType = F_WRLCK.getValueIfDefined(); } else { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.UNRECOGNIZED_LOCKF_ARGUMENT); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.UNRECOGNIZED_LOCKF_ARGUMENT); } long start = 0; if (startObj != PNone.NO_VALUE) { @@ -198,7 +199,8 @@ abstract static class IoctlNode extends PythonClinicBuiltinNode { @Specialization Object ioctl(VirtualFrame frame, int fd, long request, Object arg, boolean mutateArg, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @Cached("createFor(this)") IndirectCallData indirectCallData, @@ -207,9 +209,8 @@ Object ioctl(VirtualFrame frame, int fd, long request, Object arg, boolean mutat @Cached TruffleString.SwitchEncodingNode switchEncodingNode, @Cached TruffleString.CopyToByteArrayNode copyToByteArrayNode, @Cached GilNode gilNode, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory, @Cached SysModuleBuiltins.AuditNode auditNode) { auditNode.audit(inliningTarget, "fcnt.ioctl", fd, request, arg); @@ -248,7 +249,7 @@ Object ioctl(VirtualFrame frame, int fd, long request, Object arg, boolean mutat } } else { if (len > IOCTL_BUFSZ) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.IOCTL_STRING_ARG_TOO_LONG); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.IOCTL_STRING_ARG_TOO_LONG); } } if (ioctlArg == null) { @@ -260,7 +261,7 @@ Object ioctl(VirtualFrame frame, int fd, long request, Object arg, boolean mutat if (writable && mutateArg) { return ret; } else { - return factory.createBytes(ioctlArg, len); + return PFactory.createBytes(context.getLanguage(inliningTarget), ioctlArg, len); } } finally { if (writeBack) { @@ -284,12 +285,12 @@ Object ioctl(VirtualFrame frame, int fd, long request, Object arg, boolean mutat stringArg = switchEncodingNode.execute(stringArg, utf8); int len = stringArg.byteLength(utf8); if (len > IOCTL_BUFSZ) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.IOCTL_STRING_ARG_TOO_LONG); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.IOCTL_STRING_ARG_TOO_LONG); } byte[] ioctlArg = new byte[len + 1]; copyToByteArrayNode.execute(stringArg, 0, ioctlArg, 0, len, utf8); callIoctlBytes(frame, inliningTarget, fd, request, ioctlArg, true, posixLib, gilNode, constructAndRaiseNode); - return factory.createBytes(ioctlArg, len); + return PFactory.createBytes(context.getLanguage(inliningTarget), ioctlArg, len); } // int arg diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GcModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GcModuleBuiltins.java index e1f9b2f0de..caa88e7f40 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GcModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GcModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -29,26 +29,45 @@ import java.lang.management.ManagementFactory; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.modules.GcModuleBuiltinsClinicProviders.GcCollectNodeClinicProviderGen; +import com.oracle.graal.python.builtins.modules.GcModuleBuiltinsClinicProviders.SetDebugNodeClinicProviderGen; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject; +import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.CheckPrimitiveFunctionResultNode; +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionInvokeNode; +import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; +import com.oracle.graal.python.builtins.objects.cext.structs.CFields; +import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.lib.IteratorExhausted; import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.runtime.GilNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode; +import com.oracle.graal.python.runtime.PythonContext.PythonThreadState; +import com.oracle.graal.python.runtime.PythonOptions; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; @@ -70,6 +89,11 @@ public final class GcModuleBuiltins extends PythonBuiltins { private static final TruffleString GENERATION = PythonUtils.tsLiteral("generation"); private static final TruffleString COLLECTED = PythonUtils.tsLiteral("collected"); private static final TruffleString UNCOLLECTABLE = PythonUtils.tsLiteral("uncollectable"); + private static final int DEBUG_STATS = 1; + private static final int DEBUG_COLLECTABLE = 1 << 1; + private static final int DEBUG_UNCOLLECTABLE = 1 << 2; + private static final int DEBUG_SAVEALL = 1 << 5; + private static final int DEBUG_LEAK = DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_SAVEALL; @Override protected List> getNodeFactories() { @@ -78,55 +102,91 @@ protected List> getNodeFa @Override public void initialize(Python3Core core) { - addBuiltinConstant("DEBUG_LEAK", 0); - addBuiltinConstant("DEBUG_UNCOLLECTABLE", 0); - addBuiltinConstant("DEBUG_UNCOLLECTABLE", 0); - addBuiltinConstant(CALLBACKS, PythonObjectFactory.getUncached().createList()); + addBuiltinConstant("DEBUG_STATS", DEBUG_STATS); + addBuiltinConstant("DEBUG_COLLECTABLE", DEBUG_COLLECTABLE); + addBuiltinConstant("DEBUG_UNCOLLECTABLE", DEBUG_UNCOLLECTABLE); + addBuiltinConstant("DEBUG_SAVEALL", DEBUG_SAVEALL); + addBuiltinConstant("DEBUG_LEAK", DEBUG_LEAK); + addBuiltinConstant(CALLBACKS, PFactory.createList(core.getLanguage())); super.initialize(core); } - @Builtin(name = "collect", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, declaresExplicitSelf = true) + @Builtin(name = "collect", parameterNames = {"$self", "generation"}, declaresExplicitSelf = true) + @ArgumentClinic(name = "generation", conversion = ClinicConversion.Int, defaultValue = "2") @GenerateNodeFactory - abstract static class GcCollectNode extends PythonBuiltinNode { + abstract static class GcCollectNode extends PythonBinaryClinicBuiltinNode { + private static final NativeCAPISymbol SYMBOL = NativeCAPISymbol.FUN_GRAALPY_GC_COLLECT; + private static final CApiTiming C_API_TIMING = CApiTiming.create(true, SYMBOL.getName()); + + @Override + protected ArgumentClinicProvider getArgumentClinic() { + return GcCollectNodeClinicProviderGen.INSTANCE; + } + @Specialization - static PNone collect(VirtualFrame frame, PythonModule self, @SuppressWarnings("unused") Object level, + static long collect(VirtualFrame frame, PythonModule self, @SuppressWarnings("unused") Object level, @Bind("this") Node inliningTarget, @Cached PyObjectGetAttr getAttr, @Cached PyObjectGetIter getIter, @Cached(neverDefault = true) PyIterNextNode next, - @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached CallBinaryMethodNode call, - @Cached GilNode gil) { + @Cached GilNode gil, + @Cached GetThreadStateNode getThreadStateNode, + @Cached ExternalFunctionInvokeNode invokeNode, + @Cached CheckPrimitiveFunctionResultNode checkPrimitiveFunctionResultNode) { Object callbacks = getAttr.execute(frame, inliningTarget, self, CALLBACKS); Object iter = getIter.execute(frame, inliningTarget, callbacks); - Object cb = next.execute(frame, iter); TruffleString phase = null; - Object info = null; - if (cb != null) { + Object info; + long res = 0; + Object cb; + try { + cb = next.execute(frame, inliningTarget, iter); phase = START; - info = factory.createDict(new PKeyword[]{ + info = PFactory.createDict(language, new PKeyword[]{ new PKeyword(GENERATION, 2), new PKeyword(COLLECTED, 0), new PKeyword(UNCOLLECTABLE, 0), }); - do { - call.executeObject(frame, cb, phase, info); - } while ((cb = next.execute(frame, iter)) != null); + while (true) { + try { + call.executeObject(frame, cb, phase, info); + cb = next.execute(frame, inliningTarget, iter); + } catch (IteratorExhausted e) { + break; + } + } + } catch (IteratorExhausted e) { + // fallthrough } long freedMemory = javaCollect(inliningTarget, gil); + PythonContext pythonContext = PythonContext.get(inliningTarget); + // call native 'gc_collect' if C API context is already available + if (pythonContext.getCApiContext() != null && pythonContext.getLanguage(inliningTarget).getEngineOption(PythonOptions.PythonGC)) { + Object executable = CApiContext.getNativeSymbol(inliningTarget, SYMBOL); + PythonThreadState threadState = getThreadStateNode.execute(inliningTarget); + Object result = invokeNode.call(frame, inliningTarget, threadState, C_API_TIMING, SYMBOL.getTsName(), executable, level); + res = checkPrimitiveFunctionResultNode.executeLong(threadState, SYMBOL.getTsName(), result); + } if (phase != null) { phase = STOP; - info = factory.createDict(new PKeyword[]{ + info = PFactory.createDict(language, new PKeyword[]{ new PKeyword(GENERATION, 2), new PKeyword(COLLECTED, freedMemory), new PKeyword(UNCOLLECTABLE, 0), }); iter = getIter.execute(frame, inliningTarget, callbacks); - while ((cb = next.execute(frame, iter)) != null) { - call.executeObject(frame, cb, phase, info); + while (true) { + try { + cb = next.execute(frame, inliningTarget, iter); + call.executeObject(frame, cb, phase, info); + } catch (IteratorExhausted e) { + break; + } } } - return PNone.NONE; + return res; } @TruffleBoundary @@ -160,8 +220,8 @@ static long javaCollect(Node inliningTarget, GilNode gil) { @GenerateNodeFactory abstract static class GcIsEnabledNode extends PythonBuiltinNode { @Specialization - boolean isenabled() { - return getContext().isGcEnabled(); + boolean doGeneric() { + return getContext().getGcState().isEnabled(); } } @@ -169,8 +229,14 @@ boolean isenabled() { @GenerateNodeFactory abstract static class DisableNode extends PythonBuiltinNode { @Specialization - PNone disable() { - getContext().setGcEnabled(false); + @TruffleBoundary + static PNone disable() { + PythonContext context = PythonContext.get(null); + context.getGcState().setEnabled(false); + CApiContext cApiContext = context.getCApiContext(); + if (cApiContext != null) { + CStructAccess.WriteIntNode.writeUncached(cApiContext.getGCState(), CFields.GCState__enabled, 0); + } return PNone.NONE; } } @@ -179,8 +245,14 @@ PNone disable() { @GenerateNodeFactory abstract static class EnableNode extends PythonBuiltinNode { @Specialization - PNone enable() { - getContext().setGcEnabled(true); + @TruffleBoundary + static PNone enable() { + PythonContext context = PythonContext.get(null); + context.getGcState().setEnabled(true); + CApiContext cApiContext = context.getCApiContext(); + if (cApiContext != null) { + CStructAccess.WriteIntNode.writeUncached(cApiContext.getGCState(), CFields.GCState__enabled, 1); + } return PNone.NONE; } } @@ -190,15 +262,28 @@ PNone enable() { abstract static class GetDebugNode extends PythonBuiltinNode { @Specialization int getDebug() { - return 0; + return getContext().getGcState().getDebug(); } } - @Builtin(name = "set_debug", minNumOfPositionalArgs = 1) + @Builtin(name = "set_debug", minNumOfPositionalArgs = 1, parameterNames = {"flags"}) @GenerateNodeFactory - abstract static class SetDebugNode extends PythonBuiltinNode { + @ArgumentClinic(name = "flags", conversion = ClinicConversion.Int) + abstract static class SetDebugNode extends PythonUnaryClinicBuiltinNode { + @Override + protected ArgumentClinicProvider getArgumentClinic() { + return SetDebugNodeClinicProviderGen.INSTANCE; + } + @Specialization - PNone setDebug(@SuppressWarnings("unused") Object ignored) { + @TruffleBoundary + static PNone doGeneric(int flags) { + PythonContext context = PythonContext.get(null); + context.getGcState().setDebug(flags); + CApiContext cApiContext = context.getCApiContext(); + if (cApiContext != null) { + CStructAccess.WriteIntNode.writeUncached(cApiContext.getGCState(), CFields.GCState__debug, flags); + } return PNone.NONE; } } @@ -208,7 +293,7 @@ PNone setDebug(@SuppressWarnings("unused") Object ignored) { abstract static class GcCountNode extends PythonBuiltinNode { @Specialization @TruffleBoundary - public PTuple count() { + static PTuple count() { List garbageCollectorMXBeans = ManagementFactory.getGarbageCollectorMXBeans(); long count = 0; for (GarbageCollectorMXBean gcbean : garbageCollectorMXBeans) { @@ -217,7 +302,7 @@ public PTuple count() { count += cc; } } - return PythonObjectFactory.getUncached().createTuple(new Object[]{count, 0, 0}); + return PFactory.createTuple(PythonLanguage.get(null), new Object[]{count, 0, 0}); } } @@ -225,12 +310,12 @@ public PTuple count() { @GenerateNodeFactory abstract static class GcIsTrackedNode extends PythonBuiltinNode { @Specialization - public boolean isTracked(@SuppressWarnings("unused") PythonNativeObject object) { + static boolean doNative(@SuppressWarnings("unused") PythonNativeObject object) { return false; } @Fallback - public boolean isTracked(@SuppressWarnings("unused") Object object) { + static boolean doManaged(@SuppressWarnings("unused") Object object) { return true; } } @@ -243,7 +328,7 @@ abstract static class GcGetReferentsNode extends PythonBuiltinNode { static PList getReferents(@SuppressWarnings("unused") Object objects) { // TODO: this is just a dummy implementation; for native objects, this should actually // use 'tp_traverse' - return PythonContext.get(null).factory().createList(); + return PFactory.createList(PythonLanguage.get(null)); } } @@ -254,7 +339,7 @@ abstract static class GcGetReferrersNode extends PythonBuiltinNode { @TruffleBoundary static PList doGeneric(@SuppressWarnings("unused") Object objects) { // dummy implementation - return PythonContext.get(null).factory().createList(); + return PFactory.createList(PythonLanguage.get(null)); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalHPyDebugModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalHPyDebugModuleBuiltins.java deleted file mode 100644 index 7fbf2ab87f..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalHPyDebugModuleBuiltins.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.modules; - -import static com.oracle.graal.python.nodes.StringLiterals.J_DEBUG; -import static com.oracle.graal.python.util.PythonUtils.tsLiteral; - -import java.io.IOException; -import java.util.Collections; -import java.util.List; - -import com.oracle.graal.python.builtins.Builtin; -import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ApiInitException; -import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ImportException; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext; -import com.oracle.graal.python.builtins.objects.dict.PDict; -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; -import com.oracle.graal.python.builtins.objects.module.PythonModule; -import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinNode; -import com.oracle.graal.python.nodes.object.GetDictIfExistsNode; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.graal.python.util.PythonUtils.PrototypeNodeFactory; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.RootCallTarget; -import com.oracle.truffle.api.dsl.GenerateNodeFactory; -import com.oracle.truffle.api.dsl.NodeFactory; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.strings.TruffleString; - -@CoreFunctions(defineModule = GraalHPyDebugModuleBuiltins.J_HPY_DEBUG) -@GenerateNodeFactory -public final class GraalHPyDebugModuleBuiltins extends PythonBuiltins { - - public static final String J_HPY_DEBUG = "_hpy_debug"; - - static final String J_NOT_AVAILABLE = "_not_available"; - - private static final TruffleString T_NEW_GENERATION = tsLiteral("new_generation"); - private static final TruffleString T_GET_OPEN_HANDLES = tsLiteral("get_open_handles"); - private static final TruffleString T_GET_CLOSED_HANDLES = tsLiteral("get_closed_handles"); - private static final TruffleString T_GET_QUEUE_MAX_SIZE = tsLiteral("get_closed_handles_queue_max_size"); - private static final TruffleString T_SET_QUEUE_MAX_SIZE = tsLiteral("set_closed_handles_queue_max_size"); - private static final TruffleString T_GET_DATA_MAX_SIZE = tsLiteral("get_protected_raw_data_max_size"); - private static final TruffleString T_SET_DATA_MAX_SIZE = tsLiteral("set_protected_raw_data_max_size"); - private static final TruffleString T_SET_ON_INVALID_HANDLE = tsLiteral("set_on_invalid_handle"); - private static final TruffleString T_STACK_TRACE_LIMIT = tsLiteral("set_handle_stack_trace_limit"); - - @Override - protected List> getNodeFactories() { - return Collections.emptyList(); - } - - @Override - public void postInitialize(Python3Core core) { - PythonModule hpyDebugModule = core.lookupBuiltinModule(PythonUtils.tsLiteral(J_HPY_DEBUG)); - TruffleString[] keys = new TruffleString[]{T_NEW_GENERATION, T_GET_OPEN_HANDLES, T_GET_CLOSED_HANDLES, T_GET_QUEUE_MAX_SIZE, T_SET_QUEUE_MAX_SIZE, T_GET_DATA_MAX_SIZE, T_SET_DATA_MAX_SIZE, - T_SET_ON_INVALID_HANDLE, T_STACK_TRACE_LIMIT}; - try { - GraalHPyContext hpyContext = GraalHPyContext.ensureHPyWasLoaded(null, core.getContext(), null, null); - PythonModule nativeDebugModule = hpyContext.getHPyDebugModule(); - PDict nativeDebugDict = GetDictIfExistsNode.getUncached().execute(nativeDebugModule); - for (TruffleString tkey : keys) { - hpyDebugModule.setAttribute(tkey, nativeDebugDict.getItem(tkey)); - } - } catch (IOException | ApiInitException | ImportException e) { - /* - * Error case: install "not_available" for everything. So, loading still works, but you - * cannot use it. - */ - PythonBuiltinObject notAvailableObj = createFunction(core, hpyDebugModule); - for (TruffleString tkey : keys) { - hpyDebugModule.setAttribute(tkey, notAvailableObj); - } - } - } - - @Builtin(name = J_NOT_AVAILABLE, autoRegister = false, takesVarArgs = true, takesVarKeywordArgs = true) - static final class NotAvailable extends PythonBuiltinNode { - private static final NodeFactory NODE_FACTORY = new PrototypeNodeFactory<>(new NotAvailable()); - - @Override - public Object execute(VirtualFrame frame) { - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.RuntimeError, ErrorMessages.HPY_S_MODE_NOT_AVAILABLE, J_DEBUG); - } - } - - @TruffleBoundary - static PBuiltinMethod createFunction(Python3Core core, PythonModule module) { - Builtin builtin = NotAvailable.class.getAnnotation(Builtin.class); - RootCallTarget callTarget = core.getLanguage().createCachedCallTarget(l -> new BuiltinFunctionRootNode(l, builtin, NotAvailable.NODE_FACTORY, false), NotAvailable.class, - builtin.name()); - int flags = PBuiltinFunction.getFlags(builtin, callTarget); - TruffleString name = PythonUtils.toTruffleStringUncached(builtin.name()); - PBuiltinFunction fun = core.factory().createBuiltinFunction(name, null, 0, flags, callTarget); - return core.factory().createBuiltinMethod(module, fun); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalHPyTraceModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalHPyTraceModuleBuiltins.java deleted file mode 100644 index 4cd1c216ca..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalHPyTraceModuleBuiltins.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.modules; - -import static com.oracle.graal.python.util.PythonUtils.tsLiteral; - -import java.io.IOException; -import java.util.Collections; -import java.util.List; - -import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ApiInitException; -import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ImportException; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext; -import com.oracle.graal.python.builtins.objects.dict.PDict; -import com.oracle.graal.python.builtins.objects.module.PythonModule; -import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; -import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.object.GetDictIfExistsNode; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.dsl.GenerateNodeFactory; -import com.oracle.truffle.api.dsl.NodeFactory; -import com.oracle.truffle.api.strings.TruffleString; - -@CoreFunctions(defineModule = GraalHPyTraceModuleBuiltins.J_HPY_TRACE) -@GenerateNodeFactory -public final class GraalHPyTraceModuleBuiltins extends PythonBuiltins { - - public static final String J_HPY_TRACE = "_hpy_trace"; - - private static final TruffleString T_GET_DURATIONS = tsLiteral("get_durations"); - private static final TruffleString T_GET_CALL_COUNTS = tsLiteral("get_call_counts"); - private static final TruffleString T_SET_TRACE_FUNCTIONS = tsLiteral("set_trace_functions"); - private static final TruffleString T_GET_FREQUENCY = tsLiteral("get_frequency"); - - @Override - protected List> getNodeFactories() { - return Collections.emptyList(); - } - - @Override - public void postInitialize(Python3Core core) { - PythonModule hpyTraceModule = core.lookupBuiltinModule(PythonUtils.tsLiteral(J_HPY_TRACE)); - TruffleString[] keys = new TruffleString[]{T_GET_DURATIONS, T_GET_CALL_COUNTS, T_SET_TRACE_FUNCTIONS, T_GET_FREQUENCY}; - try { - GraalHPyContext hpyContext = GraalHPyContext.ensureHPyWasLoaded(null, core.getContext(), null, null); - PythonModule nativeTraceModule = hpyContext.getHPyTraceModule(); - PDict nativeTraceDict = GetDictIfExistsNode.getUncached().execute(nativeTraceModule); - for (TruffleString tkey : keys) { - hpyTraceModule.setAttribute(tkey, nativeTraceDict.getItem(tkey)); - } - } catch (IOException | ApiInitException | ImportException e) { - /* - * Error case: install "not_available" for everything. So, loading still works, but you - * cannot use it. - */ - PythonBuiltinObject notAvailableObj = GraalHPyDebugModuleBuiltins.createFunction(core, hpyTraceModule); - for (TruffleString tkey : keys) { - hpyTraceModule.setAttribute(tkey, notAvailableObj); - } - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalHPyUniversalModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalHPyUniversalModuleBuiltins.java deleted file mode 100644 index 071adbc8a0..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalHPyUniversalModuleBuiltins.java +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.modules; - -import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___ALL__; -import static com.oracle.graal.python.util.PythonUtils.tsLiteral; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.annotations.ArgumentClinic; -import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; -import com.oracle.graal.python.builtins.Builtin; -import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.modules.GraalHPyUniversalModuleBuiltinsClinicProviders.HPyUniversalLoadBootstrapNodeClinicProviderGen; -import com.oracle.graal.python.builtins.modules.GraalHPyUniversalModuleBuiltinsClinicProviders.HPyUniversalLoadNodeClinicProviderGen; -import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ApiInitException; -import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ImportException; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyMode; -import com.oracle.graal.python.builtins.objects.module.PythonModule; -import com.oracle.graal.python.lib.PyObjectGetItem; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PConstructAndRaiseNode; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.SpecialAttributeNames; -import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; -import com.oracle.graal.python.nodes.util.CannotCastException; -import com.oracle.graal.python.nodes.util.CastToJavaStringNode; -import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext; -import com.oracle.graal.python.runtime.IndirectCallData; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.GenerateNodeFactory; -import com.oracle.truffle.api.dsl.NodeFactory; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.strings.TruffleString; - -@CoreFunctions(defineModule = GraalHPyUniversalModuleBuiltins.J_HPY_UNIVERSAL) -@GenerateNodeFactory -public final class GraalHPyUniversalModuleBuiltins extends PythonBuiltins { - - static final String J_HPY_UNIVERSAL = "_hpy_universal"; - private static final TruffleString T_HPY_UNIVERSAL = tsLiteral(J_HPY_UNIVERSAL); - private static final TruffleString T_HPY = tsLiteral("HPY"); - - private static final TruffleString[] ALL_ARRAY; - - static { - List allList = new ArrayList<>(); - for (HPyMode mode : HPyMode.values()) { - allList.add(tsLiteral(mode.name())); - } - allList.add(tsLiteral("load")); - allList.add(tsLiteral("_load_bootstrap")); - ALL_ARRAY = allList.toArray(new TruffleString[0]); - } - - @Override - protected List> getNodeFactories() { - return GraalHPyUniversalModuleBuiltinsFactory.getFactories(); - } - - @Override - public void initialize(Python3Core core) { - for (HPyMode mode : HPyMode.values()) { - addBuiltinConstant(mode.name(), mode.getValue()); - } - super.initialize(core); - } - - @Override - public void postInitialize(Python3Core core) { - PythonModule module = core.lookupBuiltinModule(T_HPY_UNIVERSAL); - module.setAttribute(T___ALL__, core.factory().createTuple(ALL_ARRAY)); - } - - @Builtin(name = "load", parameterNames = {"name", "path", "spec", "debug", "mode"}, minNumOfPositionalArgs = 3) - @GenerateNodeFactory - @ArgumentClinic(name = "name", conversion = ClinicConversion.TString) - @ArgumentClinic(name = "path", conversion = ClinicConversion.TString) - @ArgumentClinic(name = "debug", conversion = ClinicConversion.Boolean, defaultValue = "false") - @ArgumentClinic(name = "mode", conversion = ClinicConversion.Int, defaultValue = "-1") - abstract static class HPyUniversalLoadNode extends PythonClinicBuiltinNode { - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return HPyUniversalLoadNodeClinicProviderGen.INSTANCE; - } - - @Specialization - static Object doGeneric(VirtualFrame frame, TruffleString name, TruffleString path, Object spec, boolean debug, int mode, - @Bind("this") Node inliningTarget, - @Cached("createFor(this)") IndirectCallData indirectCallData, - @Cached TruffleString.EqualNode eqNode, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { - PythonContext context = PythonContext.get(inliningTarget); - PythonLanguage language = PythonLanguage.get(inliningTarget); - Object state = IndirectCallContext.enter(frame, language, context, indirectCallData); - try { - HPyMode hmode = debug ? HPyMode.MODE_DEBUG : HPyMode.MODE_UNIVERSAL; - // 'mode' just overwrites 'debug' - if (mode > 0) { - hmode = HPyMode.fromValue(mode); - } - return GraalHPyContext.loadHPyModule(inliningTarget, context, name, path, spec, hmode); - } catch (ApiInitException ie) { - throw ie.reraise(frame, inliningTarget, constructAndRaiseNode); - } catch (ImportException ie) { - throw ie.reraise(frame, inliningTarget, constructAndRaiseNode); - } catch (IOException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSError(frame, e, eqNode); - } finally { - IndirectCallContext.exit(frame, language, context, state); - } - } - } - - @Builtin(name = "_load_bootstrap", parameterNames = {"name", "ext_name", "package", "file", "loader", "spec", "env"}) - @GenerateNodeFactory - @ArgumentClinic(name = "name", conversion = ClinicConversion.TString) - @ArgumentClinic(name = "ext_name", conversion = ClinicConversion.TString) - @ArgumentClinic(name = "file", conversion = ClinicConversion.TString) - abstract static class HPyUniversalLoadBootstrapNode extends PythonClinicBuiltinNode { - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return HPyUniversalLoadBootstrapNodeClinicProviderGen.INSTANCE; - } - - @Specialization - static Object doGeneric(VirtualFrame frame, TruffleString name, TruffleString extName, Object pkg, TruffleString file, Object loader, Object spec, Object env, - @Bind("this") Node inliningTarget, - @Cached("createFor(this)") IndirectCallData indirectCallData, - @Cached TruffleString.EqualNode eqNode, - @Cached WriteAttributeToObjectNode writeAttrNode, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PRaiseNode.Lazy raiseNode) { - Object module; - - PythonContext context = PythonContext.get(inliningTarget); - PythonLanguage language = PythonLanguage.get(inliningTarget); - Object state = IndirectCallContext.enter(frame, language, context, indirectCallData); - try { - HPyMode hmode = getHPyModeFromEnviron(name, env); - module = GraalHPyContext.loadHPyModule(inliningTarget, context, name, file, spec, hmode); - } catch (CannotCastException e) { - // thrown by getHPyModeFromEnviron if value is not a string - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.HPY_MODE_VALUE_MUST_BE_STRING); - } catch (ApiInitException ie) { - throw ie.reraise(frame, inliningTarget, constructAndRaiseNode); - } catch (ImportException ie) { - throw ie.reraise(frame, inliningTarget, constructAndRaiseNode); - } catch (IOException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSError(frame, e, eqNode); - } finally { - IndirectCallContext.exit(frame, language, context, state); - } - - writeAttrNode.execute(module, SpecialAttributeNames.T___FILE__, file); - writeAttrNode.execute(module, SpecialAttributeNames.T___LOADER__, loader); - writeAttrNode.execute(module, SpecialAttributeNames.T___NAME__, extName); - writeAttrNode.execute(module, SpecialAttributeNames.T___PACKAGE__, pkg); - writeAttrNode.execute(spec, ImpModuleBuiltins.T_ORIGIN, file); - writeAttrNode.execute(module, SpecialAttributeNames.T___SPEC__, spec); - return module; - } - - /** - *
      -         *     HPY_MODE := MODE | (MODULE_NAME ':' MODE { ',' MODULE_NAME ':' MODE })
      -         *     MODULE_NAME :=
      -         *     IDENTIFIER MODE := 'debug' | 'trace' | 'universal'
      -         * 
      - */ - @TruffleBoundary - private static HPyMode getHPyModeFromEnviron(TruffleString moduleName, Object env) throws CannotCastException { - Object result; - try { - result = PyObjectGetItem.executeUncached(env, T_HPY); - } catch (PException e) { - e.expect(null, PythonBuiltinClassType.KeyError, IsBuiltinObjectProfile.getUncached()); - // this is not an error; it just means that the key was not present in 'env' - return HPyMode.MODE_UNIVERSAL; - } - - String s = CastToJavaStringNode.getUncached().execute(result); - - int colonIdx = s.indexOf(':'); - if (colonIdx != -1) { - // case 2: modes are specified per module - String[] moduleParts = s.split(","); - String sModuleName = moduleName.toJavaStringUncached(); - for (String modulePars : moduleParts) { - String[] def = modulePars.split(":"); - if (sModuleName.equals(def[0])) { - return HPyMode.valueOf("MODE_" + def[1].toUpperCase()); - } - } - } else { - // case 1: mode was globally specified - return HPyMode.valueOf("MODE_" + s.toUpperCase()); - } - return HPyMode.MODE_UNIVERSAL; - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalPythonModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalPythonModuleBuiltins.java index f0f616ce35..9330b1765c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalPythonModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalPythonModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,7 +40,12 @@ */ package com.oracle.graal.python.builtins.modules; +import static com.oracle.graal.python.PythonLanguage.GRAALVM_MAJOR; +import static com.oracle.graal.python.PythonLanguage.GRAALVM_MICRO; +import static com.oracle.graal.python.PythonLanguage.GRAALVM_MINOR; import static com.oracle.graal.python.PythonLanguage.J_GRAALPYTHON_ID; +import static com.oracle.graal.python.PythonLanguage.RELEASE_LEVEL; +import static com.oracle.graal.python.PythonLanguage.RELEASE_LEVEL_FINAL; import static com.oracle.graal.python.nodes.BuiltinNames.J_EXTEND; import static com.oracle.graal.python.nodes.BuiltinNames.J___GRAALPYTHON__; import static com.oracle.graal.python.nodes.BuiltinNames.T_SHA3; @@ -48,10 +53,8 @@ import static com.oracle.graal.python.nodes.BuiltinNames.T___MAIN__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T_INSERT; -import static com.oracle.graal.python.nodes.StringLiterals.J_LLVM_LANGUAGE; import static com.oracle.graal.python.nodes.StringLiterals.T_COLON; import static com.oracle.graal.python.nodes.StringLiterals.T_JAVA; -import static com.oracle.graal.python.nodes.StringLiterals.T_LLVM_LANGUAGE; import static com.oracle.graal.python.nodes.StringLiterals.T_NATIVE; import static com.oracle.graal.python.nodes.StringLiterals.T_PATH; import static com.oracle.graal.python.nodes.StringLiterals.T_STRICT; @@ -78,11 +81,6 @@ import java.util.List; import java.util.logging.Level; -import com.oracle.graal.python.nodes.util.ToNativePrimitiveStorageNode; -import com.oracle.graal.python.runtime.sequence.storage.NativePrimitiveSequenceStorage; -import org.graalvm.home.Version; -import org.graalvm.nativeimage.ImageInfo; - import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; @@ -91,13 +89,21 @@ import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.modules.GraalPythonModuleBuiltinsFactory.DebugNodeFactory; +import com.oracle.graal.python.builtins.modules.cext.PythonCextCapsuleBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.array.PArray; import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.bytes.PBytesLike; +import com.oracle.graal.python.builtins.objects.capsule.PyCapsule; import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; import com.oracle.graal.python.builtins.objects.cext.capi.PySequenceArrayWrapper.ToNativeStorageNode; +import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonObjectReference; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.GetNativeWrapperNode; +import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers; +import com.oracle.graal.python.builtins.objects.cext.copying.NativeLibraryLocator; import com.oracle.graal.python.builtins.objects.code.CodeNodes; import com.oracle.graal.python.builtins.objects.code.PCode; import com.oracle.graal.python.builtins.objects.common.DynamicObjectStorage; @@ -109,6 +115,7 @@ import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum; import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum.ErrorAndMessagePair; +import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; import com.oracle.graal.python.builtins.objects.function.PFunction; import com.oracle.graal.python.builtins.objects.function.PKeyword; @@ -117,19 +124,22 @@ import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; import com.oracle.graal.python.builtins.objects.method.PMethod; import com.oracle.graal.python.builtins.objects.module.PythonModule; +import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins; import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.set.PSet; +import com.oracle.graal.python.builtins.objects.str.PString; import com.oracle.graal.python.builtins.objects.str.StringUtils; import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.type.PythonClass; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.CreateTypeNode; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.lib.PyObjectGetItem; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PConstructAndRaiseNode; import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.arrow.ArrowArray; +import com.oracle.graal.python.nodes.arrow.ArrowSchema; import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetCallTargetNode; import com.oracle.graal.python.nodes.bytecode.PBytecodeRootNode; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode; import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode; @@ -137,21 +147,23 @@ import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.nodes.object.GetOrCreateDictNode; import com.oracle.graal.python.nodes.statement.AbstractImportNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; +import com.oracle.graal.python.nodes.util.ToNativePrimitiveStorageNode; +import com.oracle.graal.python.runtime.ExecutionContext; import com.oracle.graal.python.runtime.PosixSupportLibrary; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonImageBuildOptions; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonExitException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.PSequence; +import com.oracle.graal.python.runtime.sequence.storage.NativePrimitiveSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.NativeSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.PythonUtils; @@ -163,6 +175,7 @@ import com.oracle.truffle.api.TruffleFile; import com.oracle.truffle.api.TruffleLanguage.Env; import com.oracle.truffle.api.TruffleLogger; +import com.oracle.truffle.api.TruffleOptions; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; @@ -171,19 +184,20 @@ import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.InvalidArrayIndexException; +import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.interop.UnknownIdentifierException; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.CachedLibrary; -import com.oracle.truffle.api.nodes.LanguageInfo; +import com.oracle.truffle.api.library.ExportLibrary; +import com.oracle.truffle.api.library.ExportMessage; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.NodeUtil; import com.oracle.truffle.api.nodes.RootNode; import com.oracle.truffle.api.source.Source; import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.llvm.api.Toolchain; @CoreFunctions(defineModule = J___GRAALPYTHON__, isEager = true) public final class GraalPythonModuleBuiltins extends PythonBuiltins { @@ -203,7 +217,8 @@ protected List> getNodeFa @Override public void initialize(Python3Core core) { super.initialize(core); - addBuiltinConstant("is_native", ImageInfo.inImageCode()); + addBuiltinConstant("is_native", TruffleOptions.AOT); + addBuiltinConstant("is_bytecode_dsl_interpreter", PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER); PythonContext ctx = core.getContext(); TruffleString encodingOpt = ctx.getLanguage().getEngineOption(PythonOptions.StandardStreamEncoding); TruffleString standardStreamEncoding = null; @@ -238,11 +253,10 @@ public void postInitialize(Python3Core core) { PythonContext context = core.getContext(); PythonModule mod = core.lookupBuiltinModule(T___GRAALPYTHON__); PythonLanguage language = context.getLanguage(); - if (!ImageInfo.inImageBuildtimeCode()) { + if (!context.getEnv().isPreInitialization()) { mod.setAttribute(tsLiteral("home"), context.getLanguageHome()); } - mod.setAttribute(tsLiteral("in_image_buildtime"), ImageInfo.inImageBuildtimeCode()); - mod.setAttribute(tsLiteral("in_image"), ImageInfo.inImageCode()); + mod.setAttribute(tsLiteral("in_preinitialization"), context.getEnv().isPreInitialization()); TruffleString coreHome = context.getCoreHome(); TruffleString stdlibHome = context.getStdlibHome(); TruffleString capiHome = context.getCAPIHome(); @@ -251,14 +265,11 @@ public void postInitialize(Python3Core core) { mod.setAttribute(tsLiteral("core_home"), coreHome); mod.setAttribute(tsLiteral("stdlib_home"), stdlibHome); mod.setAttribute(tsLiteral("capi_home"), capiHome); - mod.setAttribute(tsLiteral("jni_home"), context.getJNIHome()); Object[] arr = convertToObjectArray(PythonOptions.getExecutableList(context)); - PList executableList = PythonObjectFactory.getUncached().createList(arr); + PList executableList = PFactory.createList(language, arr); mod.setAttribute(tsLiteral("executable_list"), executableList); mod.setAttribute(tsLiteral("venvlauncher_command"), context.getOption(PythonOptions.VenvlauncherCommand)); mod.setAttribute(tsLiteral("ForeignType"), core.lookupType(PythonBuiltinClassType.ForeignObject)); - mod.setAttribute(tsLiteral("use_system_toolchain"), context.getOption(PythonOptions.UseSystemToolchain)); - mod.setAttribute(tsLiteral("ext_mode"), context.getOption(PythonOptions.NativeModules) ? T_NATIVE : T_LLVM_LANGUAGE); if (!context.getOption(PythonOptions.EnableDebuggingBuiltins)) { mod.setAttribute(tsLiteral("dump_truffle_ast"), PNone.NO_VALUE); @@ -267,6 +278,11 @@ public void postInitialize(Python3Core core) { mod.setAttribute(tsLiteral("storage_to_native"), PNone.NO_VALUE); mod.setAttribute(tsLiteral("dump_heap"), PNone.NO_VALUE); mod.setAttribute(tsLiteral("is_native_object"), PNone.NO_VALUE); + mod.setAttribute(tsLiteral("get_handle_table_id"), PNone.NO_VALUE); + mod.setAttribute(tsLiteral("is_strong_handle_table_ref"), PNone.NO_VALUE); + mod.setAttribute(tsLiteral("clear_interop_type_registry"), PNone.NO_VALUE); + mod.setAttribute(tsLiteral("foreign_number_list"), PNone.NO_VALUE); + mod.setAttribute(tsLiteral("foreign_wrapper"), PNone.NO_VALUE); } if (PythonImageBuildOptions.WITHOUT_PLATFORM_ACCESS || !context.getOption(PythonOptions.RunViaLauncher)) { mod.setAttribute(tsLiteral("list_files"), PNone.NO_VALUE); @@ -300,8 +316,8 @@ PNone run() { * other paths through pymain_run_python are handled in GraalPythonMain and the path * prepending is done in PythonLanguage in those other cases */ - assert !ImageInfo.inImageBuildtimeCode(); PythonContext context = getContext(); + assert !context.getEnv().isPreInitialization(); TruffleString inputFilePath = context.getOption(PythonOptions.InputFilePath); PythonModule sysModule = context.getSysModule(); boolean needsMainImporter = !inputFilePath.isEmpty() && getImporter(sysModule, inputFilePath); @@ -334,7 +350,7 @@ private void runFile(PythonContext context, TruffleString inputFilePath) { TruffleFile file = context.getPublicTruffleFileRelaxed(inputFilePath); builder = Source.newBuilder(PythonLanguage.ID, file); } - source = builder.mimeType(PythonLanguage.MIME_TYPE).build(); + source = builder.mimeType(PythonLanguage.getCompileMimeType(0, 0)).build(); // TODO we should handle non-IO errors better } catch (IOException e) { ErrorAndMessagePair error = OSErrorEnum.fromException(e, TruffleString.EqualNode.getUncached()); @@ -348,8 +364,21 @@ private void runFile(PythonContext context, TruffleString inputFilePath) { // The exit value is hardcoded in CPython too throw new PythonExitException(this, 2); } + PythonLanguage language = context.getLanguage(); CallTarget callTarget = context.getEnv().parsePublic(source); - callTarget.call(PythonUtils.EMPTY_OBJECT_ARRAY); + Object[] arguments = PArguments.create(); + PythonModule mainModule = context.getMainModule(); + PDict mainDict = GetOrCreateDictNode.executeUncached(mainModule); + PArguments.setGlobals(arguments, mainModule); + PArguments.setSpecialArgument(arguments, mainDict); + PArguments.setException(arguments, PException.NO_EXCEPTION); + context.initializeMainModule(inputFilePath); + Object state = ExecutionContext.IndirectCalleeContext.enterIndirect(language, context, arguments); + try { + callTarget.call(arguments); + } finally { + ExecutionContext.IndirectCalleeContext.exit(language, context, state); + } } // Equivalent of CPython's pymain_run_module @@ -402,15 +431,15 @@ public abstract static class ReadFileNode extends PythonUnaryBuiltinNode { @Specialization PBytes doString(VirtualFrame frame, Object filenameObj, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached CastToTruffleStringNode castToTruffleStringNode, @Cached TruffleString.EqualNode eqNode, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { TruffleString filename = castToTruffleStringNode.execute(inliningTarget, filenameObj); - TruffleFile file = getContext().getPublicTruffleFileRelaxed(filename, PythonLanguage.T_DEFAULT_PYTHON_EXTENSIONS); + TruffleFile file = context.getPublicTruffleFileRelaxed(filename, PythonLanguage.T_DEFAULT_PYTHON_EXTENSIONS); byte[] bytes = file.readAllBytes(); - return factory.createBytes(bytes); + return PFactory.createBytes(context.getLanguage(inliningTarget), bytes); } catch (Exception ex) { ErrorAndMessagePair errAndMsg = OSErrorEnum.fromException(ex, eqNode); throw constructAndRaiseNode.get(inliningTarget).raiseOSError(frame, errAndMsg.oserror.getNumber(), errAndMsg.message); @@ -504,8 +533,8 @@ public abstract static class BuiltinNode extends PythonUnaryBuiltinNode { @Specialization public Object doIt(VirtualFrame frame, PFunction func, @Bind("this") Node inliningTarget, - @Cached PyObjectGetItem getItem, - @Cached PythonObjectFactory factory) { + @Bind PythonContext context, + @Cached PyObjectGetItem getItem) { PFunction builtinFunc = convertToBuiltin(func); PythonObject globals = func.getGlobals(); PythonModule builtinModule; @@ -513,17 +542,21 @@ public Object doIt(VirtualFrame frame, PFunction func, builtinModule = (PythonModule) globals; } else { TruffleString moduleName = (TruffleString) getItem.execute(frame, inliningTarget, globals, T___NAME__); - builtinModule = getContext().lookupBuiltinModule(moduleName); + builtinModule = context.lookupBuiltinModule(moduleName); assert builtinModule != null; } - return factory.createBuiltinMethod(builtinModule, builtinFunc); + return PFactory.createBuiltinMethod(context.getLanguage(inliningTarget), builtinModule, builtinFunc); } @TruffleBoundary public synchronized PFunction convertToBuiltin(PFunction func) { RootNode rootNode = CodeNodes.GetCodeRootNode.executeUncached(func.getCode()); - if (rootNode instanceof PBytecodeRootNode) { - ((PBytecodeRootNode) rootNode).setPythonInternal(true); + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + if (rootNode instanceof PBytecodeDSLRootNode r) { + r.setPythonInternal(true); + } + } else if (rootNode instanceof PBytecodeRootNode r) { + r.setPythonInternal(true); } func.setBuiltin(true); return func; @@ -538,8 +571,12 @@ public Object doIt(PFunction func, @Bind("this") Node inliningTarget, @Cached CodeNodes.GetCodeRootNode getRootNode) { RootNode rootNode = getRootNode.execute(inliningTarget, func.getCode()); - if (rootNode instanceof PBytecodeRootNode) { - ((PBytecodeRootNode) rootNode).setPythonInternal(true); + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + if (rootNode instanceof PBytecodeDSLRootNode r) { + r.setPythonInternal(true); + } + } else if (rootNode instanceof PBytecodeRootNode r) { + r.setPythonInternal(true); } return func; } @@ -555,146 +592,6 @@ public Object doIt(PFunction func) { } } - @Builtin(name = "get_toolchain_tools_for_venv") - @TypeSystemReference(PythonArithmeticTypes.class) - @GenerateNodeFactory - public abstract static class GetToolchainToolsForVenv extends PythonBuiltinNode { - private static final class Tool { - final String name; - final boolean isVariableName; - final Object[] targets; - - public Tool(String name, boolean isVariableName, Object[] targets) { - this.name = name; - this.isVariableName = isVariableName; - this.targets = targets; - } - - static Tool forVariable(String name, Object... targets) { - return new Tool(name, true, targets); - } - - static Tool forBinary(String name, Object... targets) { - return new Tool(name, true, targets); - } - } - - static final Tool[] tools = new Tool[]{ - Tool.forVariable("AR", tsLiteral("ar")), - Tool.forVariable("RANLIB", tsLiteral("ranlib")), - Tool.forVariable("NM", tsLiteral("nm")), - Tool.forVariable("LD", tsLiteral("ld.lld"), tsLiteral("ld"), tsLiteral("lld")), - Tool.forVariable("CC", tsLiteral("clang"), tsLiteral("cc")), - Tool.forVariable("CXX", tsLiteral("clang++"), tsLiteral("c++")), - Tool.forVariable("FC", tsLiteral("graalvm-flang"), tsLiteral("flang-new"), tsLiteral("flang")), - Tool.forBinary("llvm-as", tsLiteral("as")), - Tool.forBinary("clang-cl", tsLiteral("cl")), - Tool.forBinary("clang-cpp", tsLiteral("cpp")), - }; - - @Specialization - @TruffleBoundary - Object getToolPath() { - PythonObjectFactory factory = PythonObjectFactory.getUncached(); - Env env = getContext().getEnv(); - LanguageInfo llvmInfo = env.getInternalLanguages().get(J_LLVM_LANGUAGE); - Toolchain toolchain = env.lookup(llvmInfo, Toolchain.class); - List toolchainPaths = toolchain.getPaths("PATH"); - EconomicMapStorage storage = EconomicMapStorage.create(tools.length); - for (Tool tool : tools) { - String path = null; - if (tool.isVariableName) { - TruffleFile toolPath = toolchain.getToolPath(tool.name); - if (toolPath != null) { - path = toolPath.getAbsoluteFile().getPath(); - } - } else { - for (TruffleFile toolchainPath : toolchainPaths) { - LOGGER.finest(() -> " Testing path " + toolchainPath.getPath() + " for tool " + tool.name); - TruffleFile pathToTest = toolchainPath.resolve(tool.name); - if (pathToTest.exists()) { - path = pathToTest.getAbsoluteFile().getPath(); - break; - } - } - } - if (path != null) { - storage.putUncached(toTruffleStringUncached(path), factory.createTuple(tool.targets)); - } else { - LOGGER.fine("Could not locate tool " + tool.name); - } - } - return factory.createDict(storage); - } - } - - /* - * Internal check used in tests only to check that we are running through managed launcher. - */ - @Builtin(name = "is_managed_launcher") - @TypeSystemReference(PythonArithmeticTypes.class) - @GenerateNodeFactory - public abstract static class IsManagedLauncher extends PythonBuiltinNode { - @Specialization - @TruffleBoundary - protected boolean isManaged() { - // The best approximation for now - return !getContext().getEnv().isNativeAccessAllowed() && getContext().getOption(PythonOptions.RunViaLauncher); - } - } - - @Builtin(name = "get_toolchain_tool_path", minNumOfPositionalArgs = 1) - @TypeSystemReference(PythonArithmeticTypes.class) - @GenerateNodeFactory - public abstract static class GetToolPathNode extends PythonUnaryBuiltinNode { - @Specialization - @TruffleBoundary - protected Object getToolPath(TruffleString tool) { - Env env = getContext().getEnv(); - LanguageInfo llvmInfo = env.getInternalLanguages().get(J_LLVM_LANGUAGE); - Toolchain toolchain = env.lookup(llvmInfo, Toolchain.class); - TruffleFile toolPath = toolchain.getToolPath(tool.toJavaStringUncached()); - if (toolPath == null) { - return PNone.NONE; - } - return toTruffleStringUncached(toolPath.toString().replace("\\", "/")); - } - } - - @Builtin(name = "get_platform_id", minNumOfPositionalArgs = 0) - @TypeSystemReference(PythonArithmeticTypes.class) - @GenerateNodeFactory - public abstract static class GetPlatformId extends PythonBuiltinNode { - @Specialization - @TruffleBoundary - protected TruffleString getPlatformId() { - return getContext().getPlatformId(); - } - - } - - @Builtin(name = "get_toolchain_paths", minNumOfPositionalArgs = 1) - @TypeSystemReference(PythonArithmeticTypes.class) - @GenerateNodeFactory - public abstract static class GetToolchainPathsNode extends PythonUnaryBuiltinNode { - @Specialization - @TruffleBoundary - protected Object getToolPath(TruffleString tool) { - Env env = getContext().getEnv(); - LanguageInfo llvmInfo = env.getInternalLanguages().get(J_LLVM_LANGUAGE); - Toolchain toolchain = env.lookup(llvmInfo, Toolchain.class); - List toolPaths = toolchain.getPaths(tool.toJavaStringUncached()); - if (toolPaths == null) { - return PNone.NONE; - } - Object[] pathNames = new Object[toolPaths.size()]; - for (int i = 0; i < pathNames.length; i++) { - pathNames[i] = toTruffleStringUncached(toolPaths.get(i).toString().replace("\\", "/")); - } - return PythonObjectFactory.getUncached().createList(pathNames); - } - } - @Builtin(name = "determine_system_toolchain", maxNumOfPositionalArgs = 1) @GenerateNodeFactory public abstract static class DetermineSystemToolchain extends PythonUnaryBuiltinNode { @@ -715,8 +612,8 @@ public abstract static class DetermineSystemToolchain extends PythonUnaryBuiltin @Specialization static PDict doGeneric(@SuppressWarnings("unused") Object unused, - @Cached PythonObjectFactory factory) { - return factory.createDict(fromToolchain()); + @Bind PythonLanguage language) { + return PFactory.createDict(language, fromToolchain()); } @TruffleBoundary @@ -814,13 +711,13 @@ private HashingStorage getStrategy(TruffleString tname, PythonLanguage lang) { case "economicmap": return EconomicMapStorage.create(); default: - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.ValueError, ErrorMessages.UNKNOWN_STORAGE_STRATEGY); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.ValueError, ErrorMessages.UNKNOWN_STORAGE_STRATEGY); } } private void validate(HashingStorage dictStorage) { if (HashingStorageLen.executeUncached(dictStorage) != 0) { - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.ValueError, ErrorMessages.SHOULD_BE_USED_ONLY_NEW_SETS); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.ValueError, ErrorMessages.SHOULD_BE_USED_ONLY_NEW_SETS); } } } @@ -832,7 +729,7 @@ abstract static class StorageToNative extends PythonUnaryBuiltinNode { @Specialization @TruffleBoundary Object toNative(PArray array) { - CApiContext.ensureCapiWasLoaded(); + CApiContext.ensureCapiWasLoaded("internal API"); NativeSequenceStorage newStorage = ToNativeStorageNode.executeUncached(array.getSequenceStorage(), true); array.setSequenceStorage(newStorage); return array; @@ -841,7 +738,7 @@ Object toNative(PArray array) { @Specialization @TruffleBoundary Object toNative(PSequence sequence) { - CApiContext.ensureCapiWasLoaded(); + CApiContext.ensureCapiWasLoaded("internal API"); NativeSequenceStorage newStorage = ToNativeStorageNode.executeUncached(sequence.getSequenceStorage(), sequence instanceof PBytesLike); sequence.setSequenceStorage(newStorage); return sequence; @@ -855,25 +752,25 @@ public abstract static class JavaExtendNode extends PythonUnaryBuiltinNode { static Object doIt(Object value, @Bind("this") Node inliningTarget, @CachedLibrary(limit = "3") InteropLibrary lib, - @Cached PRaiseNode.Lazy raiseNode) { - if (ImageInfo.inImageBuildtimeCode()) { + @Cached PRaiseNode raiseNode) { + if (getContext(inliningTarget).getEnv().isPreInitialization()) { CompilerDirectives.transferToInterpreterAndInvalidate(); throw new UnsupportedOperationException(ErrorMessages.CANT_EXTEND_JAVA_CLASS_NOT_JVM.toJavaStringUncached()); } - if (ImageInfo.inImageRuntimeCode()) { + if (TruffleOptions.AOT) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw raiseNode.get(inliningTarget).raise(SystemError, ErrorMessages.CANT_EXTEND_JAVA_CLASS_NOT_JVM); + throw raiseNode.raise(inliningTarget, SystemError, ErrorMessages.CANT_EXTEND_JAVA_CLASS_NOT_JVM); } Env env = PythonContext.get(inliningTarget).getEnv(); if (!isType(value, env, lib)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANT_EXTEND_JAVA_CLASS_NOT_TYPE, value); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANT_EXTEND_JAVA_CLASS_NOT_TYPE, value); } try { return env.createHostAdapter(new Object[]{value}); } catch (Exception ex) { - throw raiseNode.get(inliningTarget).raise(TypeError, PythonUtils.getMessage(ex), ex); + throw raiseNode.raise(inliningTarget, TypeError, PythonUtils.getMessage(ex), ex); } } @@ -936,18 +833,6 @@ Object doIt(Object value) { @Builtin(name = "which", minNumOfPositionalArgs = 1) @GenerateNodeFactory abstract static class WhichNode extends PythonUnaryBuiltinNode { - @Specialization - @TruffleBoundary - Object which(PBuiltinFunction object) { - RootCallTarget callTarget = object.getCallTarget(); - return toTruffleStringUncached(String.format("%s(%s)", object.getClass().getName(), whichCallTarget(callTarget))); - } - - @Specialization - @TruffleBoundary - Object which(PBuiltinMethod object) { - return toTruffleStringUncached(String.format("%s(%s)", object.getClass().getName(), whichCallTarget(object.getBuiltinFunction().getCallTarget()))); - } private static String whichCallTarget(RootCallTarget callTarget) { RootNode rootNode = callTarget.getRootNode(); @@ -962,8 +847,33 @@ private static String whichCallTarget(RootCallTarget callTarget) { @Specialization @TruffleBoundary - Object which(Object object) { - return toTruffleStringUncached(object.getClass().getName()); + // This is a builtin for debugging, so it also includes things that should never end up in + // python value space + static Object which(Object object) { + if (object == null) { + return "null"; + } + String name = object.getClass().getName(); + Object detail = null; + try { + if (object instanceof PNone) { + detail = "NO_VALUE"; + } else if (object instanceof PBuiltinFunction fn) { + detail = whichCallTarget(fn.getCallTarget()); + } else if (object instanceof PBuiltinMethod fn) { + detail = whichCallTarget(fn.getBuiltinFunction().getCallTarget()); + } else if (object instanceof PSequence sequence && !(object instanceof PString)) { + detail = sequence.getSequenceStorage(); + } else if (object instanceof PArray array) { + detail = array.getSequenceStorage(); + } else if (object instanceof PythonAbstractNativeObject nativeObject) { + detail = PythonUtils.formatPointer(nativeObject.getPtr()); + } + } catch (Throwable t) { + detail = "Detail computation threw exception: " + t; + } + String which = detail != null ? String.format("%s(%s)", name, detail) : name; + return toTruffleStringUncached(which); } } @@ -1015,25 +925,46 @@ boolean isNative(@SuppressWarnings("unused") Object obj) { } - // This is only used from HPy - @Builtin(name = "PyTruffle_CreateType", minNumOfPositionalArgs = 4) + @Builtin(name = "get_handle_table_id", minNumOfPositionalArgs = 1) @GenerateNodeFactory - abstract static class PyTruffle_CreateType extends PythonQuaternaryBuiltinNode { + abstract static class GetHandleTableID extends PythonUnaryBuiltinNode { @Specialization - static PythonClass createType(VirtualFrame frame, TruffleString name, PTuple bases, PDict namespaceOrig, Object metaclass, - @Cached CreateTypeNode createType) { - return createType.execute(frame, namespaceOrig, name, bases, metaclass, PKeyword.EMPTY_KEYWORDS); + @TruffleBoundary + static int doManaged(Object object) { + if (object instanceof PythonAbstractNativeObject) { + return -1; + } + PythonNativeWrapper nativeWrapper = GetNativeWrapperNode.executeUncached(object); + return nativeWrapper.ref.getHandleTableIndex(); + } + } + + @Builtin(name = "is_strong_handle_table_ref", minNumOfPositionalArgs = 1) + @GenerateNodeFactory + abstract static class IsWeakHandleTableRef extends PythonUnaryBuiltinNode { + @Specialization + @TruffleBoundary + static boolean doGeneric(int id) { + PythonObjectReference ref = CApiTransitions.nativeStubLookupGet(PythonContext.get(null).nativeContext, 0, id); + return ref != null && ref.isStrongReference(); } } @Builtin(name = "get_graalvm_version", minNumOfPositionalArgs = 0) @GenerateNodeFactory abstract static class GetGraalVmVersion extends PythonBuiltinNode { - @TruffleBoundary + private static final TruffleString VERSION_STRING; + static { + String version = String.format("%d.%d.%d", GRAALVM_MAJOR, GRAALVM_MINOR, GRAALVM_MICRO); + if (RELEASE_LEVEL != RELEASE_LEVEL_FINAL) { + version += "-dev"; + } + VERSION_STRING = TruffleString.fromJavaStringUncached(version, TS_ENCODING); + } + @Specialization TruffleString get() { - Version current = Version.getCurrent(); - return TruffleString.fromJavaStringUncached(current.toString(), TS_ENCODING); + return VERSION_STRING; } } @@ -1113,4 +1044,207 @@ static Object doSequence(PSequence sequence, return sequence; } } + + @Builtin(name = "clear_interop_type_registry", maxNumOfPositionalArgs = 0) + @GenerateNodeFactory + public abstract static class ClearInteropTypeRegistry extends PythonBuiltinNode { + + @Specialization + @TruffleBoundary + Object doClear() { + getContext().interopTypeRegistry.clear(); + PolyglotModuleBuiltins.clearInteropTypeRegistryCache(getContext()); + return PNone.NONE; + } + } + + @Builtin(name = "get_current_rss", maxNumOfPositionalArgs = 0) + @GenerateNodeFactory + public abstract static class GetCurrentRSS extends PythonBuiltinNode { + + @Specialization + @TruffleBoundary + Object currentRSS() { + return getContext().getCApiContext().getCurrentRSS(); + } + } + + @Builtin(name = "replicate_extensions_in_venv", minNumOfPositionalArgs = 2) + @GenerateNodeFactory + public abstract static class ReplicateExtNode extends PythonBuiltinNode { + @Specialization + @TruffleBoundary + static Object replicate(TruffleString venvPath, int count, + @Bind("$node") Node node, + @Bind PythonContext context) { + try { + NativeLibraryLocator.replicate(context.getEnv().getPublicTruffleFile(venvPath.toJavaStringUncached()), context, count); + } catch (IOException | InterruptedException e) { + throw PRaiseNode.raiseStatic(node, PythonBuiltinClassType.ValueError, e); + } + return PNone.NONE; + } + } + + @Builtin(name = "foreign_number_list", maxNumOfPositionalArgs = 1) + @GenerateNodeFactory + public abstract static class ForeignNumberListNode extends PythonBuiltinNode { + + @Specialization + @TruffleBoundary + Object foreignNumberList(Object number) { + return new ForeignNumberList(number); + } + + @ExportLibrary(value = InteropLibrary.class, delegateTo = "number") + static final class ForeignNumberList implements TruffleObject { + final Object number; + + ForeignNumberList(Object number) { + this.number = number; + } + + @ExportMessage + boolean hasArrayElements() { + return true; + } + + @ExportMessage + boolean isArrayElementReadable(long index) { + return index == 0; + } + + @TruffleBoundary + @ExportMessage + Object readArrayElement(long index) throws InvalidArrayIndexException { + if (!isArrayElementReadable(index)) { + throw InvalidArrayIndexException.create(index); + } + return number; + } + + @ExportMessage + long getArraySize() { + return 1; + } + } + } + + @Builtin(name = "foreign_wrapper", maxNumOfPositionalArgs = 1) + @GenerateNodeFactory + public abstract static class ForeignWrapperNode extends PythonBuiltinNode { + + @Specialization + @TruffleBoundary + Object foreignWrapper(Object object) { + return new ForeignWrapper(object); + } + + @SuppressWarnings("unused") + @ExportLibrary(value = InteropLibrary.class, delegateTo = "object") + static final class ForeignWrapper implements TruffleObject { + final Object object; + + ForeignWrapper(Object object) { + this.object = object; + } + + /* + * Hide members as we want to treat the object solely by using its interop traits & + * trait-specific messages and not unintentionally read or invoke one of its members + * (methods or fields). + */ + + @ExportMessage + boolean hasMembers() { + return false; + } + + @ExportMessage + boolean isMemberReadable(String member) { + return false; + } + + @ExportMessage + boolean isMemberModifiable(String member) { + return false; + } + + @ExportMessage + boolean isMemberInsertable(String member) { + return false; + } + + @ExportMessage + boolean isMemberRemovable(String member) { + return false; + } + + @ExportMessage + boolean isMemberInvocable(String member) { + return false; + } + + @ExportMessage + Object getMembers(boolean includeInternal) throws UnsupportedMessageException { + throw UnsupportedMessageException.create(); + } + + @ExportMessage + Object readMember(String member) throws UnsupportedMessageException { + throw UnsupportedMessageException.create(); + } + + @ExportMessage + void writeMember(String member, Object value) throws UnsupportedMessageException { + throw UnsupportedMessageException.create(); + } + + @ExportMessage + void removeMember(String member) throws UnsupportedMessageException { + throw UnsupportedMessageException.create(); + } + + @ExportMessage + Object invokeMember(String member, Object[] arguments) throws UnsupportedMessageException { + throw UnsupportedMessageException.create(); + } + } + } + + @Builtin(name = "create_arrow_py_capsule", minNumOfPositionalArgs = 2) + @GenerateNodeFactory + public abstract static class CreateArrowPyCapsule extends PythonBinaryBuiltinNode { + + @Specialization + static PTuple doCreate(long arrowArrayAddr, long arrowSchemaAddr, + @Bind("this") Node inliningTarget, + @Cached PythonCextCapsuleBuiltins.PyCapsuleNewNode pyCapsuleNewNode) { + var ctx = getContext(inliningTarget); + + long arrayDestructor = ctx.arrowSupport.getArrowArrayDestructor(); + var arrayCapsuleName = new CArrayWrappers.CByteArrayWrapper(ArrowArray.CAPSULE_NAME); + PyCapsule arrowArrayCapsule = pyCapsuleNewNode.execute(inliningTarget, arrowArrayAddr, arrayCapsuleName, arrayDestructor); + + long schemaDestructor = ctx.arrowSupport.getArrowSchemaDestructor(); + var schemaCapsuleName = new CArrayWrappers.CByteArrayWrapper(ArrowSchema.CAPSULE_NAME); + PyCapsule arrowSchemaCapsule = pyCapsuleNewNode.execute(inliningTarget, arrowSchemaAddr, schemaCapsuleName, schemaDestructor); + return PFactory.createTuple(ctx.getLanguage(inliningTarget), new Object[]{arrowSchemaCapsule, arrowArrayCapsule}); + } + } + + /** + * Used from datetime module to create new instances of objects that we allow subclassing from + * native. It's necessary, because the __new__ wrapper would reject native subclasses that + * override tp_new. + */ + @Builtin(name = "unsafe_object_new", minNumOfPositionalArgs = 1) + @GenerateNodeFactory + abstract static class UnsafeObjectNewNode extends PythonUnaryBuiltinNode { + @Specialization + static Object create(VirtualFrame frame, Object cls, + @Cached ObjectBuiltins.ObjectNode objectNode) { + return objectNode.execute(frame, cls, PythonUtils.EMPTY_OBJECT_ARRAY, PKeyword.EMPTY_KEYWORDS); + } + } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ImpModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ImpModuleBuiltins.java index e24b7a14c9..66145d87a9 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ImpModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ImpModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -61,8 +61,6 @@ import java.util.List; import java.util.concurrent.locks.ReentrantLock; -import org.graalvm.nativeimage.ImageInfo; - import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; @@ -71,23 +69,21 @@ import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.MemoryViewNode; import com.oracle.graal.python.builtins.modules.MarshalModuleBuiltins.Marshal.MarshalError; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; import com.oracle.graal.python.builtins.objects.bytes.BytesNodes; import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; +import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext.ModuleSpec; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ExecModuleNode; import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodesFactory.DefaultCheckFunctionResultNodeGen; import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.CheckFunctionResultNode; -import com.oracle.graal.python.builtins.objects.cext.common.CExtContext; -import com.oracle.graal.python.builtins.objects.cext.common.CExtContext.ModuleSpec; import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ApiInitException; import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ImportException; -import com.oracle.graal.python.builtins.objects.code.CodeNodes; import com.oracle.graal.python.builtins.objects.code.PCode; import com.oracle.graal.python.builtins.objects.function.PArguments; +import com.oracle.graal.python.builtins.objects.memoryview.MemoryViewBuiltins.MemoryViewNode; import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView; import com.oracle.graal.python.builtins.objects.module.FrozenModules; import com.oracle.graal.python.builtins.objects.module.PythonFrozenModule; @@ -104,7 +100,7 @@ import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromPythonObjectNode; import com.oracle.graal.python.nodes.attributes.WriteAttributeToPythonObjectNode; -import com.oracle.graal.python.nodes.call.GenericInvokeNode; +import com.oracle.graal.python.nodes.call.CallDispatchers; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; @@ -118,10 +114,11 @@ import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.RootCallTarget; +import com.oracle.truffle.api.TruffleSafepoint; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; @@ -216,7 +213,7 @@ public abstract static class AcquireLock extends PythonBuiltinNode { public Object run(@Cached GilNode gil) { gil.release(true); try { - getContext().getImportLock().lock(); + TruffleSafepoint.setBlockedThreadInterruptible(this, ReentrantLock::lock, getContext().getImportLock()); } finally { gil.acquire(); } @@ -260,8 +257,6 @@ public abstract static class GetMagic extends PythonBuiltinNode { MAGIC_NUMBER_BYTES[3] = '\n'; } - @Child PythonObjectFactory factory = PythonObjectFactory.create(); // GR-47032 - @Specialization(guards = "isSingleContext()") PBytes runCachedSingleContext( @Cached(value = "getMagicNumberPBytes()", weak = true) PBytes magicBytes) { @@ -269,12 +264,13 @@ PBytes runCachedSingleContext( } @Specialization(replaces = "runCachedSingleContext") - PBytes run() { - return factory.createBytes(MAGIC_NUMBER_BYTES); + PBytes run( + @Bind PythonLanguage language) { + return PFactory.createBytes(language, MAGIC_NUMBER_BYTES); } protected PBytes getMagicNumberPBytes() { - return factory.createBytes(MAGIC_NUMBER_BYTES); + return PFactory.createBytes(PythonLanguage.get(this), MAGIC_NUMBER_BYTES); } } @@ -289,6 +285,7 @@ public abstract static class CreateDynamic extends PythonBinaryBuiltinNode { @Specialization Object run(VirtualFrame frame, PythonObject moduleSpec, @SuppressWarnings("unused") Object filename, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached("createFor(this)") IndirectCallData indirectCallData, @Cached ReadAttributeFromPythonObjectNode readNameNode, @Cached ReadAttributeFromPythonObjectNode readOriginNode, @@ -298,8 +295,7 @@ Object run(VirtualFrame frame, PythonObject moduleSpec, @SuppressWarnings("unuse TruffleString name = castToTruffleStringNode.execute(inliningTarget, readNameNode.execute(moduleSpec, T_NAME)); TruffleString path = castToTruffleStringNode.execute(inliningTarget, readOriginNode.execute(moduleSpec, T_ORIGIN)); - PythonContext context = getContext(); - PythonLanguage language = getLanguage(); + PythonLanguage language = context.getLanguage(inliningTarget); Object state = IndirectCallContext.enter(frame, language, context, indirectCallData); try { return run(context, new ModuleSpec(name, path, moduleSpec)); @@ -320,10 +316,10 @@ private Object run(PythonContext context, ModuleSpec spec) throws IOException, A if (existingModule != null) { return existingModule; } - return CExtContext.loadCExtModule(this, context, spec, getCheckResultNode()); + return CApiContext.loadCExtModule(this, context, spec, getCheckResultNode()); } - private PythonModule findExtension(PythonContext context, ModuleSpec spec) { + private static PythonModule findExtension(PythonContext context, ModuleSpec spec) { CApiContext cApiContext = context.getCApiContext(); if (cApiContext == null) { return null; @@ -351,7 +347,7 @@ static int doPythonModule(VirtualFrame frame, PythonModule extensionModule, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary(limit = "1") InteropLibrary lib, @Cached ExecModuleNode execModuleNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object nativeModuleDef = extensionModule.getNativeModuleDef(); if (nativeModuleDef == null) { return 0; @@ -368,14 +364,14 @@ static int doPythonModule(VirtualFrame frame, PythonModule extensionModule, PythonContext context = PythonContext.get(inliningTarget); if (!context.hasCApiContext()) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.SystemError, ErrorMessages.CAPI_NOT_YET_INITIALIZED); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.SystemError, ErrorMessages.CAPI_NOT_YET_INITIALIZED); } /* * ExecModuleNode will run the module definition's exec function which may run arbitrary * C code. So we need to setup an indirect call. */ - PythonLanguage language = PythonLanguage.get(inliningTarget); + PythonLanguage language = context.getLanguage(inliningTarget); Object state = IndirectCallContext.enter(frame, language, context, indirectCallData); try { return execModuleNode.execute(context.getCApiContext(), extensionModule, nativeModuleDef); @@ -449,7 +445,7 @@ static Object run(VirtualFrame frame, PythonObject moduleSpec, return builtinModule; } CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, NotImplementedError, toTruffleStringUncached("_imp.create_builtin")); + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, toTruffleStringUncached("_imp.create_builtin")); } } @@ -459,13 +455,13 @@ public abstract static class ExecBuiltin extends PythonBuiltinNode { @Specialization @TruffleBoundary public Object exec(PythonModule pythonModule) { - final Python3Core core = getContext(); - if (!ImageInfo.inImageBuildtimeCode()) { + final PythonContext context = getContext(); + if (!context.getEnv().isPreInitialization()) { final PythonBuiltins builtins = pythonModule.getBuiltins(); assert builtins != null; // this is a builtin, therefore its builtins must have been // set at this point if (!builtins.isInitialized()) { - doPostInit(core, builtins); + doPostInit(context, builtins); builtins.setInitialized(true); } } @@ -540,12 +536,13 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static Object run(VirtualFrame frame, TruffleString name, Object dataObj, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, @Cached TruffleString.EqualNode equalNode, @Cached InlinedConditionProfile isCodeObjectProfile, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { FrozenInfo info; if (dataObj != PNone.NONE) { try { @@ -558,7 +555,7 @@ static Object run(VirtualFrame frame, TruffleString name, Object dataObj, raiseFrozenError(frame, FROZEN_INVALID, name, constructAndRaiseNode.get(inliningTarget)); } } else { - FrozenResult result = findFrozen(PythonContext.get(inliningTarget), name, equalNode); + FrozenResult result = findFrozen(context, name, equalNode); FrozenStatus status = result.status; info = result.info; raiseFrozenError(frame, status, name, constructAndRaiseNode.get(inliningTarget)); @@ -567,20 +564,20 @@ static Object run(VirtualFrame frame, TruffleString name, Object dataObj, Object code = null; try { - code = MarshalModuleBuiltins.Marshal.load(info.data, info.size); + code = MarshalModuleBuiltins.Marshal.load(context, info.data, info.size); } catch (MarshalError | NumberFormatException e) { raiseFrozenError(frame, FROZEN_INVALID, name, constructAndRaiseNode.get(inliningTarget)); } if (!isCodeObjectProfile.profile(inliningTarget, code instanceof PCode)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.NOT_A_CODE_OBJECT, name); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.NOT_A_CODE_OBJECT, name); } return code; } } - @Builtin(name = "find_frozen", parameterNames = {"name", "withData"}, minNumOfPositionalArgs = 1, isPublic = false, doc = "find_frozen($module, name, /, *, withdata=False)\n" + + @Builtin(name = "find_frozen", parameterNames = {"name", "withData"}, minNumOfPositionalArgs = 1, doc = "find_frozen($module, name, /, *, withdata=False)\n" + "--\n" + "\n" + "Return info about the corresponding frozen module (if there is one) or None.\n" + @@ -603,12 +600,13 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - Object run(VirtualFrame frame, TruffleString name, boolean withData, + static Object run(VirtualFrame frame, TruffleString name, boolean withData, + @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached MemoryViewNode memoryViewNode, @Cached TruffleString.EqualNode equalNode, - @Cached PConstructAndRaiseNode constructAndRaiseNode, - @Cached PythonObjectFactory factory) { - FrozenResult result = findFrozen(getContext(), name, equalNode); + @Cached PConstructAndRaiseNode constructAndRaiseNode) { + FrozenResult result = findFrozen(context, name, equalNode); FrozenStatus status = result.status; FrozenInfo info = result.info; @@ -624,7 +622,7 @@ Object run(VirtualFrame frame, TruffleString name, boolean withData, PMemoryView data = null; if (withData) { - data = memoryViewNode.execute(frame, factory.createBytes(info.data)); + data = memoryViewNode.execute(frame, PFactory.createBytes(context.getLanguage(inliningTarget), info.data)); } Object[] returnValues = new Object[]{ @@ -633,7 +631,7 @@ Object run(VirtualFrame frame, TruffleString name, boolean withData, info.origName == null ? PNone.NONE : info.origName }; - return factory.createTuple(returnValues); + return PFactory.createTuple(context.getLanguage(inliningTarget), returnValues); } } @@ -689,17 +687,17 @@ public static PythonModule importFrozenModuleObject(Python3Core core, TruffleStr } } - PCode code = (PCode) MarshalModuleBuiltins.Marshal.load(info.data, info.size); + PCode code = (PCode) MarshalModuleBuiltins.Marshal.load(core.getContext(), info.data, info.size); - PythonModule module = globals == null ? core.factory().createPythonModule(name) : globals; + PythonModule module = globals == null ? PFactory.createPythonModule(core.getLanguage(), name) : globals; if (info.isPackage) { /* Set __path__ to the empty list */ - WriteAttributeToPythonObjectNode.getUncached().execute(module, T___PATH__, core.factory().createList()); + WriteAttributeToPythonObjectNode.getUncached().execute(module, T___PATH__, PFactory.createList(core.getLanguage())); } - RootCallTarget callTarget = CodeNodes.GetCodeCallTargetNode.executeUncached(code); - GenericInvokeNode.getUncached().execute(callTarget, PArguments.withGlobals(module)); + RootCallTarget callTarget = code.getRootCallTarget(); + CallDispatchers.SimpleIndirectInvokeNode.executeUncached(callTarget, PArguments.withGlobals(module)); Object origName = info.origName == null ? PNone.NONE : info.origName; WriteAttributeToPythonObjectNode.getUncached().execute(module, T___ORIGNAME__, origName); @@ -767,10 +765,10 @@ public abstract static class SourceHashNode extends PythonBinaryClinicBuiltinNod @Specialization static PBytes run(long magicNumber, Object sourceBuffer, @Bind("this") Node inliningTarget, - @Cached BytesNodes.HashBufferNode hashBufferNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @Cached BytesNodes.HashBufferNode hashBufferNode) { long sourceHash = hashBufferNode.execute(inliningTarget, sourceBuffer); - return factory.createBytes(computeHash(magicNumber, sourceHash)); + return PFactory.createBytes(language, computeHash(magicNumber, sourceHash)); } @TruffleBoundary @@ -814,8 +812,8 @@ public Object run(PCode code, TruffleString path) { public abstract static class ExtensionSuffixesNode extends PythonBuiltinNode { @Specialization Object run( - @Cached PythonObjectFactory factory) { - return factory.createList(new Object[]{PythonContext.get(this).getSoAbi(), T_EXT_SO, T_EXT_PYD}); + @Bind PythonLanguage language) { + return PFactory.createList(language, new Object[]{PythonContext.get(this).getSoAbi(), T_EXT_SO, T_EXT_PYD}); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ItertoolsModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ItertoolsModuleBuiltins.java index cca35cc329..291fc4f1b9 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ItertoolsModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ItertoolsModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -25,94 +25,37 @@ */ package com.oracle.graal.python.builtins.modules; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError; -import static com.oracle.graal.python.nodes.ErrorMessages.ARG_CANNOT_BE_NEGATIVE; -import static com.oracle.graal.python.nodes.ErrorMessages.EXPECTED_INT_AS_R; -import static com.oracle.graal.python.nodes.ErrorMessages.ISLICE_WRONG_ARGS; -import static com.oracle.graal.python.nodes.ErrorMessages.MUST_BE_NON_NEGATIVE; -import static com.oracle.graal.python.nodes.ErrorMessages.NUMBER_IS_REQUIRED; -import static com.oracle.graal.python.nodes.ErrorMessages.STEP_FOR_ISLICE_MUST_BE; -import static com.oracle.graal.python.nodes.ErrorMessages.S_EXPECTED_GOT_P; -import static com.oracle.graal.python.nodes.ErrorMessages.S_FOR_ISLICE_MUST_BE; import static com.oracle.graal.python.nodes.ErrorMessages.S_MUST_BE_S; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___COPY__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FLOAT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INDEX__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INT__; -import java.util.ArrayList; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.modules.BuiltinFunctions.IterNode; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.function.PKeyword; -import com.oracle.graal.python.builtins.objects.iterator.IteratorNodes.ToArrayNode; -import com.oracle.graal.python.builtins.objects.itertools.PAccumulate; -import com.oracle.graal.python.builtins.objects.itertools.PChain; -import com.oracle.graal.python.builtins.objects.itertools.PCombinations; -import com.oracle.graal.python.builtins.objects.itertools.PCombinationsWithReplacement; -import com.oracle.graal.python.builtins.objects.itertools.PCompress; -import com.oracle.graal.python.builtins.objects.itertools.PCount; -import com.oracle.graal.python.builtins.objects.itertools.PCycle; -import com.oracle.graal.python.builtins.objects.itertools.PDropwhile; -import com.oracle.graal.python.builtins.objects.itertools.PFilterfalse; -import com.oracle.graal.python.builtins.objects.itertools.PGroupBy; -import com.oracle.graal.python.builtins.objects.itertools.PGrouper; -import com.oracle.graal.python.builtins.objects.itertools.PIslice; -import com.oracle.graal.python.builtins.objects.itertools.PPairwise; -import com.oracle.graal.python.builtins.objects.itertools.PPermutations; -import com.oracle.graal.python.builtins.objects.itertools.PProduct; -import com.oracle.graal.python.builtins.objects.itertools.PRepeat; -import com.oracle.graal.python.builtins.objects.itertools.PStarmap; -import com.oracle.graal.python.builtins.objects.itertools.PTakewhile; import com.oracle.graal.python.builtins.objects.itertools.PTeeDataObject; -import com.oracle.graal.python.builtins.objects.itertools.PZipLongest; -import com.oracle.graal.python.builtins.objects.type.TypeNodes; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode; import com.oracle.graal.python.lib.PyCallableCheckNode; -import com.oracle.graal.python.lib.PyLongAsIntNode; -import com.oracle.graal.python.lib.PyNumberAsSizeNode; -import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.lib.PyObjectLookupAttr; -import com.oracle.graal.python.lib.PyObjectTypeCheck; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode; +import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.util.CannotCastException; -import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.LoopNode; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.InlinedBranchProfile; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; -import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile; -import com.oracle.truffle.api.profiles.LoopConditionProfile; @CoreFunctions(defineModule = "itertools") public final class ItertoolsModuleBuiltins extends PythonBuiltins { @@ -122,382 +65,6 @@ protected List> getNodeFa return ItertoolsModuleBuiltinsFactory.getFactories(); } - @Builtin(name = "accumulate", minNumOfPositionalArgs = 2, varArgsMarker = true, parameterNames = {"cls", "iterable", "func"}, keywordOnlyNames = { - "initial"}, constructsClass = PythonBuiltinClassType.PAccumulate, doc = "accumulate(iterable) --> accumulate object\n\nReturn series of accumulated sums.") - @GenerateNodeFactory - public abstract static class AccumulateNode extends PythonBuiltinNode { - - @Specialization(guards = "isTypeNode.execute(inliningTarget, cls)") - protected static PAccumulate construct(VirtualFrame frame, Object cls, Object iterable, @SuppressWarnings("unused") PNone func, @SuppressWarnings("unused") PNone initial, - @Bind("this") Node inliningTarget, - @Shared("getIter") @Cached PyObjectGetIter getIter, - @SuppressWarnings("unused") @Shared("typeNode") @Cached IsTypeNode isTypeNode, - @Shared @Cached PythonObjectFactory factory) { - return create(frame, inliningTarget, cls, iterable, null, null, getIter, factory); - } - - @Specialization(guards = {"isTypeNode.execute(inliningTarget, cls)", "!isNone(initial)"}) - protected static PAccumulate construct(VirtualFrame frame, Object cls, Object iterable, @SuppressWarnings("unused") PNone func, Object initial, - @Bind("this") Node inliningTarget, - @Shared("getIter") @Cached PyObjectGetIter getIter, - @SuppressWarnings("unused") @Shared("typeNode") @Cached IsTypeNode isTypeNode, - @Shared @Cached PythonObjectFactory factory) { - return create(frame, inliningTarget, cls, iterable, null, initial, getIter, factory); - } - - @Specialization(guards = {"isTypeNode.execute(inliningTarget, cls)", "!isNone(func)"}) - protected static PAccumulate construct(VirtualFrame frame, Object cls, Object iterable, Object func, @SuppressWarnings("unused") PNone initial, - @Bind("this") Node inliningTarget, - @Shared("getIter") @Cached PyObjectGetIter getIter, - @SuppressWarnings("unused") @Shared("typeNode") @Cached IsTypeNode isTypeNode, - @Shared @Cached PythonObjectFactory factory) { - return create(frame, inliningTarget, cls, iterable, func, null, getIter, factory); - } - - @Specialization(guards = {"isTypeNode.execute(inliningTarget, cls)", "!isNone(func)", "!isNone(initial)"}) - protected static PAccumulate construct(VirtualFrame frame, Object cls, Object iterable, Object func, Object initial, - @Bind("this") Node inliningTarget, - @Shared("getIter") @Cached PyObjectGetIter getIter, - @SuppressWarnings("unused") @Shared("typeNode") @Cached IsTypeNode isTypeNode, - @Shared @Cached PythonObjectFactory factory) { - return create(frame, inliningTarget, cls, iterable, func, initial, getIter, factory); - } - - private static PAccumulate create(VirtualFrame frame, Node inliningTarget, Object cls, Object iterable, Object func, Object initial, PyObjectGetIter getIter, PythonObjectFactory factory) { - PAccumulate self = factory.createAccumulate(cls); - self.setIterable(getIter.execute(frame, inliningTarget, iterable)); - self.setFunc(func instanceof PNone ? null : func); - self.setTotal(null); - self.setInitial(initial instanceof PNone ? null : initial); - return self; - } - - @Specialization(guards = "!isTypeNode.execute(inliningTarget, cls)") - @SuppressWarnings("unused") - static Object notype(Object cls, Object iterable, Object func, Object initial, - @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Shared("typeNode") @Cached IsTypeNode isTypeNode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - } - - @Builtin(name = "combinations", minNumOfPositionalArgs = 3, constructsClass = PythonBuiltinClassType.PCombinations, parameterNames = {"cls", "iterable", - "r"}, doc = "combinations(iterable, r) --> combinations object\n\n" + - "Return successive r-length combinations of elements in the iterable.\n\n" + - "combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)") - @ArgumentClinic(name = "r", conversion = ArgumentClinic.ClinicConversion.Int) - @GenerateNodeFactory - public abstract static class CombinationsNode extends PythonTernaryClinicBuiltinNode { - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return ItertoolsModuleBuiltinsClinicProviders.CombinationsNodeClinicProviderGen.INSTANCE; - } - - @Specialization - static Object construct(VirtualFrame frame, Object cls, Object iterable, int r, - @Bind("this") Node inliningTarget, - @Cached IsTypeNode isTypeNode, - @Cached ToArrayNode toArrayNode, - @Cached LoopConditionProfile indicesLoopProfile, - @Cached InlinedConditionProfile wrongTypeProfile, - @Cached InlinedConditionProfile negativeProfile, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!wrongTypeProfile.profile(inliningTarget, isTypeNode.execute(inliningTarget, cls))) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - if (negativeProfile.profile(inliningTarget, r < 0)) { - throw raiseNode.get(inliningTarget).raise(ValueError, MUST_BE_NON_NEGATIVE, "r"); - } - - PCombinations self = factory.createCombinations(cls); - self.setPool(toArrayNode.execute(frame, iterable)); - - int[] indices = new int[r]; - indicesLoopProfile.profileCounted(r); - for (int i = 0; indicesLoopProfile.inject(i < r); i++) { - indices[i] = i; - } - self.setIndices(indices); - self.setR(r); - self.setLastResult(null); - self.setStopped(r > self.getPool().length); - - return self; - } - } - - @Builtin(name = "combinations_with_replacement", minNumOfPositionalArgs = 3, constructsClass = PythonBuiltinClassType.PCombinationsWithReplacement, parameterNames = {"cls", "iterable", - "r"}, doc = "combinations_with_replacement(iterable, r) --> combinations_with_replacement object\n\n" + - "Return successive r-length combinations of elements in the iterable\n" + - "allowing individual elements to have successive repeats.\n" + - " combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC") - @ArgumentClinic(name = "r", conversion = ArgumentClinic.ClinicConversion.Int) - @GenerateNodeFactory - public abstract static class CombinationsWithReplacementNode extends PythonTernaryClinicBuiltinNode { - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return ItertoolsModuleBuiltinsClinicProviders.CombinationsWithReplacementNodeClinicProviderGen.INSTANCE; - } - - @Specialization - static Object construct(VirtualFrame frame, Object cls, Object iterable, int r, - @Bind("this") Node inliningTarget, - @Cached IsTypeNode isTypeNode, - @Cached ToArrayNode toArrayNode, - @Cached InlinedConditionProfile wrongTypeProfile, - @Cached InlinedConditionProfile negativeProfile, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!wrongTypeProfile.profile(inliningTarget, isTypeNode.execute(inliningTarget, cls))) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - if (negativeProfile.profile(inliningTarget, r < 0)) { - throw raiseNode.get(inliningTarget).raise(ValueError, MUST_BE_NON_NEGATIVE, "r"); - } - PCombinationsWithReplacement self = factory.createCombinationsWithReplacement(cls); - self.setPool(toArrayNode.execute(frame, iterable)); - self.setR(r); - - self.setIndices(new int[r]); - self.setLastResult(null); - self.setStopped(self.getPool().length == 0 && r > 0); - - return self; - } - } - - @Builtin(name = "compress", minNumOfPositionalArgs = 3, constructsClass = PythonBuiltinClassType.PCompress, parameterNames = {"cls", "data", - "selectors"}, doc = "Make an iterator that filters elements from *data* returning\n" + - "only those that have a corresponding element in *selectors* that evaluates to\n" + - "``True``. Stops when either the *data* or *selectors* iterables has been\n" + - "exhausted.\n" + - "Equivalent to::\n\n" + - "\tdef compress(data, selectors):\n" + - "\t\t# compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F\n" + - "\t\treturn (d for d, s in zip(data, selectors) if s)") - @GenerateNodeFactory - public abstract static class CompressNode extends PythonTernaryBuiltinNode { - @Specialization - static PCompress construct(VirtualFrame frame, Object cls, Object data, Object selectors, - @Bind("this") Node inliningTarget, - @Cached PyObjectGetIter getIter, - @Cached IsTypeNode isTypeNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!isTypeNode.execute(inliningTarget, cls)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - PCompress self = factory.createCompress(cls); - self.setData(getIter.execute(frame, inliningTarget, data)); - self.setSelectors(getIter.execute(frame, inliningTarget, selectors)); - return self; - } - } - - @Builtin(name = "cycle", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PCycle, doc = "Make an iterator returning elements from the iterable and\n" + - " saving a copy of each. When the iterable is exhausted, return\n" + - " elements from the saved copy. Repeats indefinitely.\n\n" + - " Equivalent to :\n\n" + - " def cycle(iterable):\n" + - " \tsaved = []\n" + - " \tfor element in iterable:\n" + - " \t\tyield element\n" + - " \t\tsaved.append(element)\n" + - " \twhile saved:\n" + - " \t\tfor element in saved:\n" + - " \t\t\tyield element") - @GenerateNodeFactory - public abstract static class CycleNode extends PythonVarargsBuiltinNode { - - @Specialization - static PCycle construct(VirtualFrame frame, Object cls, Object[] args, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Cached(inline = false /* uncommon path */) TypeNodes.HasObjectInitNode hasObjectInitNode, - @Cached PyObjectGetIter getIter, - @Cached IsTypeNode isTypeNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!isTypeNode.execute(inliningTarget, cls)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - if (keywords.length > 0 && hasObjectInitNode.executeCached(cls)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "cycle()"); - } - if (args.length != 1) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_EXPECTED_D_ARGS, "cycle", 1); - } - Object iterable = args[0]; - PCycle self = factory.createCycle(cls); - self.setSaved(new ArrayList<>()); - self.setIterable(getIter.execute(frame, inliningTarget, iterable)); - self.setIndex(0); - self.setFirstpass(false); - return self; - } - } - - @Builtin(name = "dropwhile", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PDropwhile, doc = "dropwhile(predicate, iterable) --> dropwhile object\n\n" + - "Drop items from the iterable while predicate(item) is true.\n" + - "Afterwards, return every element until the iterable is exhausted.") - @GenerateNodeFactory - public abstract static class DropwhileNode extends PythonVarargsBuiltinNode { - @Specialization - static PDropwhile construct(VirtualFrame frame, Object cls, Object[] args, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Cached(inline = false /* uncommon path */) TypeNodes.HasObjectInitNode hasObjectInitNode, - @Cached PyObjectGetIter getIter, - @Cached IsTypeNode isTypeNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!isTypeNode.execute(inliningTarget, cls)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - if (keywords.length > 0 && hasObjectInitNode.executeCached(cls)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "dropwhile()"); - } - if (args.length != 2) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_EXPECTED_D_ARGS, "dropwhile", 2); - } - Object predicate = args[0]; - Object iterable = args[1]; - PDropwhile self = factory.createDropwhile(cls); - self.setPredicate(predicate); - self.setIterable(getIter.execute(frame, inliningTarget, iterable)); - self.setDoneDropping(false); - return self; - } - } - - @Builtin(name = "filterfalse", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PFilterfalse, doc = "filterfalse(function or None, sequence) --> filterfalse object\n\n" + - "Return those items of sequence for which function(item) is false.\n" + - "If function is None, return the items that are false.") - @GenerateNodeFactory - public abstract static class FilterFalseNode extends PythonVarargsBuiltinNode { - - @Specialization - static PFilterfalse construct(VirtualFrame frame, Object cls, Object[] args, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Cached(inline = false /* uncommon path */) TypeNodes.HasObjectInitNode hasObjectInitNode, - @Cached PyObjectGetIter getIter, - @Cached IsTypeNode isTypeNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!isTypeNode.execute(inliningTarget, cls)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - if (keywords.length > 0 && hasObjectInitNode.executeCached(cls)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "filterfalse()"); - } - if (args.length != 2) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_EXPECTED_D_ARGS, "filterfalse", 2); - } - Object func = args[0]; - Object sequence = args[1]; - PFilterfalse self = factory.createFilterfalse(cls); - self.setFunc(PGuards.isPNone(func) ? null : func); - self.setSequence(getIter.execute(frame, inliningTarget, sequence)); - return self; - } - } - - @Builtin(name = "groupby", minNumOfPositionalArgs = 2, constructsClass = PythonBuiltinClassType.PGroupBy, parameterNames = {"cls", "iterable", - "key"}, doc = "Make an iterator that returns consecutive keys and groups from the\n" + - "iterable. The key is a function computing a key value for each\n" + - "element. If not specified or is None, key defaults to an identity\n" + - "function and returns the element unchanged. Generally, the\n" + - "iterable needs to already be sorted on the same key function.\n\n" + - "The returned group is itself an iterator that shares the\n" + - "underlying iterable with groupby(). Because the source is shared,\n" + - "when the groupby object is advanced, the previous group is no\n" + - "longer visible. So, if that data is needed later, it should be\n" + - "stored as a list:\n\n" + - "\tgroups = []\n" + - "\tuniquekeys = []\n" + - "\tfor k, g in groupby(data, keyfunc):\n" + - "\t\tgroups.append(list(g)) # Store group iterator as a list\n" + - "\t\tuniquekeys.append(k)") - @ArgumentClinic(name = "key", defaultValue = "PNone.NONE") - @GenerateNodeFactory - public abstract static class GroupByNode extends PythonTernaryClinicBuiltinNode { - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return ItertoolsModuleBuiltinsClinicProviders.GroupByNodeClinicProviderGen.INSTANCE; - } - - @Specialization - static PGroupBy construct(VirtualFrame frame, Object cls, Object iterable, Object key, - @Bind("this") Node inliningTarget, - @Cached PyObjectGetIter getIter, - @Cached IsTypeNode isTypeNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!isTypeNode.execute(inliningTarget, cls)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - PGroupBy self = factory.createGroupBy(cls); - self.setKeyFunc(PGuards.isNone(key) ? null : key); - self.setIt(getIter.execute(frame, inliningTarget, iterable)); - return self; - } - } - - @Builtin(name = "_grouper", minNumOfPositionalArgs = 2, constructsClass = PythonBuiltinClassType.PGrouper, parameterNames = {"$self", "parent", "tgtkey"}) - @GenerateNodeFactory - public abstract static class GrouperNode extends PythonTernaryBuiltinNode { - @Specialization - static PGrouper construct(Object cls, Object parent, Object tgtKey, - @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile wrongTypeProfile, - @Cached InlinedConditionProfile isPGroupByProfile, - @Cached IsTypeNode isTypeNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!wrongTypeProfile.profile(inliningTarget, isTypeNode.execute(inliningTarget, cls))) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - if (!isPGroupByProfile.profile(inliningTarget, parent instanceof PGroupBy)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.INCORRECT_USAGE_OF_INTERNAL_GROUPER); - } - return factory.createGrouper((PGroupBy) parent, tgtKey); - } - } - - @Builtin(name = "takewhile", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PTakewhile, doc = "Make an iterator that returns elements from the iterable as\n" + - "long as the predicate is true.\n\nEquivalent to :\n\ndef takewhile(predicate, iterable):\n\tfor x in iterable:\n\t\tif predicate(x):\n\t\t\tyield x\n" + - "\t\telse:\n\t\t\tbreak") - @GenerateNodeFactory - public abstract static class TakewhileNode extends PythonVarargsBuiltinNode { - @Specialization - static PTakewhile construct(VirtualFrame frame, Object cls, Object[] args, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Cached(inline = false /* uncommon path */) TypeNodes.HasObjectInitNode hasObjectInitNode, - @Cached PyObjectGetIter getIter, - @Cached IsTypeNode isTypeNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!isTypeNode.execute(inliningTarget, cls)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - if (keywords.length > 0 && hasObjectInitNode.executeCached(cls)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "takewhile()"); - } - if (args.length != 2) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_EXPECTED_D_ARGS, "takewhile", 2); - } - Object predicate = args[0]; - Object iterable = args[1]; - PTakewhile self = factory.createTakewhile(cls); - self.setPredicate(predicate); - self.setIterable(getIter.execute(frame, inliningTarget, iterable)); - return self; - } - } - @Builtin(name = "tee", minNumOfPositionalArgs = 1, parameterNames = {"iterable", "n"}) @ArgumentClinic(name = "n", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "2") @GenerateNodeFactory @@ -510,15 +77,15 @@ protected ArgumentClinicProvider getArgumentClinic() { @SuppressWarnings("unused") @Specialization(guards = "n < 0") static Object negativeN(Object iterable, int n, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, S_MUST_BE_S, "n", ">=0"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, S_MUST_BE_S, "n", ">=0"); } @SuppressWarnings("unused") @Specialization(guards = "n == 0") static Object zeroN(Object iterable, int n, - @Shared @Cached PythonObjectFactory factory) { - return factory.createTuple(PythonUtils.EMPTY_OBJECT_ARRAY); + @Bind PythonLanguage language) { + return PFactory.createTuple(language, PythonUtils.EMPTY_OBJECT_ARRAY); } @Specialization(guards = "n > 0") @@ -527,16 +94,16 @@ static Object tee(VirtualFrame frame, Object iterable, int n, @Cached IterNode iterNode, @Cached PyObjectLookupAttr getAttrNode, @Cached PyCallableCheckNode callableCheckNode, - @Cached CallVarargsMethodNode callNode, + @Cached CallNode callNode, @Cached InlinedBranchProfile notCallableProfile, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { Object it = iterNode.execute(frame, iterable, PNone.NO_VALUE); Object copyCallable = getAttrNode.execute(frame, inliningTarget, it, T___COPY__); if (!callableCheckNode.execute(inliningTarget, copyCallable)) { notCallableProfile.enter(inliningTarget); // as in Tee.__NEW__() - PTeeDataObject dataObj = factory.createTeeDataObject(it); - it = factory.createTee(dataObj, 0); + PTeeDataObject dataObj = PFactory.createTeeDataObject(language, it); + it = PFactory.createTee(language, dataObj, 0); } // return tuple([it] + [it.__copy__() for i in range(1, n)]) @@ -545,573 +112,9 @@ static Object tee(VirtualFrame frame, Object iterable, int n, copyCallable = getAttrNode.execute(frame, inliningTarget, it, T___COPY__); for (int i = 1; i < n; i++) { - tupleObjs[i] = callNode.execute(frame, copyCallable, PythonUtils.EMPTY_OBJECT_ARRAY, PKeyword.EMPTY_KEYWORDS); - } - return factory.createTuple(tupleObjs); - } - - } - - @Builtin(name = "_tee_dataobject", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PTeeDataObject) - @GenerateNodeFactory - public abstract static class TeeDataObjectNode extends PythonVarargsBuiltinNode { - @SuppressWarnings("unused") - @Specialization - PTeeDataObject construct(Object cls, Object[] arguments, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Cached IsTypeNode isTypeNode, - @Cached InlinedBranchProfile errorProfile, - @Cached PythonObjectFactory factory) { - if (!isTypeNode.execute(inliningTarget, cls)) { - errorProfile.enter(inliningTarget); - throw raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - return factory.createTeeDataObject(); - } - } - - @Builtin(name = "permutations", minNumOfPositionalArgs = 2, constructsClass = PythonBuiltinClassType.PPermutations, parameterNames = {"cls", "iterable", - "r"}, doc = "permutations(iterable[, r]) --> permutations object\n\n" + - "Return successive r-length permutations of elements in the iterable.\n\n" + "permutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)") - @ArgumentClinic(name = "r", defaultValue = "PNone.NONE") - @GenerateNodeFactory - public abstract static class PermutationsNode extends PythonTernaryClinicBuiltinNode { - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return ItertoolsModuleBuiltinsClinicProviders.PermutationsNodeClinicProviderGen.INSTANCE; - } - - @Specialization - static Object construct(VirtualFrame frame, Object cls, Object iterable, Object rArg, - @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile rIsNoneProfile, - @Cached ToArrayNode toArrayNode, - @Cached CastToJavaIntExactNode castToInt, - @Cached InlinedConditionProfile wrongTypeProfile, - @Cached InlinedBranchProfile wrongRprofile, - @Cached InlinedBranchProfile negRprofile, - @Cached InlinedConditionProfile nrProfile, - @Cached InlinedLoopConditionProfile indicesLoopProfile, - @Cached InlinedLoopConditionProfile cyclesLoopProfile, - @Cached IsTypeNode isTypeNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!wrongTypeProfile.profile(inliningTarget, isTypeNode.execute(inliningTarget, cls))) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - int r; - Object[] pool = toArrayNode.execute(frame, iterable); - if (rIsNoneProfile.profile(inliningTarget, PGuards.isNone(rArg))) { - r = pool.length; - } else { - try { - r = castToInt.execute(inliningTarget, rArg); - } catch (CannotCastException e) { - wrongRprofile.enter(inliningTarget); - throw raiseNode.get(inliningTarget).raise(TypeError, EXPECTED_INT_AS_R); - } - if (r < 0) { - negRprofile.enter(inliningTarget); - throw raiseNode.get(inliningTarget).raise(ValueError, MUST_BE_NON_NEGATIVE, "r"); - } - } - PPermutations self = factory.createPermutations(cls); - self.setPool(pool); - self.setR(r); - int n = pool.length; - self.setN(n); - int nMinusR = n - r; - if (nrProfile.profile(inliningTarget, nMinusR < 0)) { - self.setStopped(true); - self.setRaisedStopIteration(true); - } else { - self.setStopped(false); - int[] indices = new int[n]; - indicesLoopProfile.profileCounted(inliningTarget, indices.length); - LoopNode.reportLoopCount(inliningTarget, indices.length); - for (int i = 0; indicesLoopProfile.inject(inliningTarget, i < indices.length); i++) { - indices[i] = i; - } - self.setIndices(indices); - int[] cycles = new int[r]; - int idx = 0; - cyclesLoopProfile.profileCounted(inliningTarget, r); - LoopNode.reportLoopCount(inliningTarget, r); - for (int i = n; cyclesLoopProfile.inject(inliningTarget, i > nMinusR); i--) { - cycles[idx++] = i; - } - self.setCycles(cycles); - self.setRaisedStopIteration(false); - self.setStarted(false); - return self; + tupleObjs[i] = callNode.execute(frame, copyCallable); } - return self; + return PFactory.createTuple(language, tupleObjs); } } - - @Builtin(name = "product", minNumOfPositionalArgs = 1, takesVarArgs = true, constructsClass = PythonBuiltinClassType.PProduct, keywordOnlyNames = { - "repeat"}, doc = "Cartesian product of input iterables.\n\n" + - "Equivalent to nested for-loops in a generator expression. For example,\n ``product(A, B)`` returns the same as ``((x,y) for x in A for y in B)``.\n\n" + - "The nested loops cycle like an odometer with the rightmost element advancing\n on every iteration. This pattern creates a lexicographic ordering so that if\n" + - " the input's iterables are sorted, the product tuples are emitted in sorted\n order.\n\nTo compute the product of an iterable with itself, specify the number of\n" + - " repetitions with the optional *repeat* keyword argument. For example,\n ``product(A, repeat=4)`` means the same as ``product(A, A, A, A)``.\n\n" + - "This function is equivalent to the following code, except that the\n actual implementation does not build up intermediate results in memory::\n\n" + - "def product(*args, **kwds):\n\t# product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy\n\t# product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111\n" + - "\tpools = map(tuple, args) * kwds.get('repeat', 1)\n\tresult = [[]]\n\tfor pool in pools:\n\t\tresult = [x+[y] for x in result for y in pool]\n" + - "\tfor prod in result:\n\t\tyield tuple(prod)") - @GenerateNodeFactory - public abstract static class ProductNode extends PythonBuiltinNode { - - @Specialization(guards = "isTypeNode.execute(inliningTarget, cls)") - static Object constructNoneRepeat(VirtualFrame frame, Object cls, Object[] iterables, @SuppressWarnings("unused") PNone repeat, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @Shared @Cached ToArrayNode toArrayNode, - @SuppressWarnings("unused") @Shared("typeNode") @Cached IsTypeNode isTypeNode, - @Shared @Cached PythonObjectFactory factory) { - PProduct self = factory.createProduct(cls); - constructOneRepeat(frame, self, iterables, toArrayNode); - return self; - } - - @Specialization(guards = {"isTypeNode.execute(inliningTarget, cls)", "repeat == 1"}, limit = "1") - static Object constructOneRepeat(VirtualFrame frame, Object cls, Object[] iterables, @SuppressWarnings("unused") int repeat, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @Shared @Cached ToArrayNode toArrayNode, - @SuppressWarnings("unused") @Exclusive @Cached IsTypeNode isTypeNode, - @Shared @Cached PythonObjectFactory factory) { - PProduct self = factory.createProduct(cls); - constructOneRepeat(frame, self, iterables, toArrayNode); - return self; - } - - @Specialization(guards = {"isTypeNode.execute(inliningTarget, cls)", "repeat > 1"}, limit = "1") - static Object construct(VirtualFrame frame, Object cls, Object[] iterables, int repeat, - @Bind("this") Node inliningTarget, - @Shared @Cached ToArrayNode toArrayNode, - @Cached InlinedLoopConditionProfile loopProfile, - @SuppressWarnings("unused") @Exclusive @Cached IsTypeNode isTypeNode, - @Shared @Cached PythonObjectFactory factory) { - Object[][] lists = unpackIterables(frame, iterables, toArrayNode); - Object[][] gears = new Object[lists.length * repeat][]; - loopProfile.profileCounted(inliningTarget, repeat); - LoopNode.reportLoopCount(inliningTarget, repeat); - for (int i = 0; loopProfile.inject(inliningTarget, i < repeat); i++) { - PythonUtils.arraycopy(lists, 0, gears, i * lists.length, lists.length); - } - PProduct self = factory.createProduct(cls); - construct(self, gears); - return self; - } - - @Specialization(guards = {"isTypeNode.execute(inliningTarget, cls)", "repeat == 0"}, limit = "1") - static Object constructNoRepeat(Object cls, @SuppressWarnings("unused") Object[] iterables, @SuppressWarnings("unused") int repeat, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached IsTypeNode isTypeNode, - @Shared @Cached PythonObjectFactory factory) { - PProduct self = factory.createProduct(cls); - self.setGears(new Object[0][]); - self.setIndices(new int[0]); - self.setLst(null); - self.setStopped(false); - return self; - } - - @SuppressWarnings("unused") - @Specialization(guards = {"isTypeNode.execute(inliningTarget, cls)", "repeat < 0"}, limit = "1") - static Object constructNeg(Object cls, Object[] iterables, int repeat, - @Bind("this") Node inliningTarget, - @Exclusive @Cached IsTypeNode isTypeNode, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ARG_CANNOT_BE_NEGATIVE, "repeat"); - } - - private static void constructOneRepeat(VirtualFrame frame, PProduct self, Object[] iterables, ToArrayNode toArrayNode) { - Object[][] gears = unpackIterables(frame, iterables, toArrayNode); - construct(self, gears); - } - - private static void construct(PProduct self, Object[][] gears) { - self.setGears(gears); - for (int i = 0; i < gears.length; i++) { - if (gears[i].length == 0) { - self.setIndices(null); - self.setLst(null); - self.setStopped(true); - return; - } - } - self.setIndices(new int[gears.length]); - self.setLst(null); - self.setStopped(false); - } - - private static Object[][] unpackIterables(VirtualFrame frame, Object[] iterables, ToArrayNode toArrayNode) { - Object[][] lists = new Object[iterables.length][]; - for (int i = 0; i < lists.length; i++) { - lists[i] = toArrayNode.execute(frame, iterables[i]); - } - return lists; - } - - @Specialization(guards = "!isTypeNode.execute(inliningTarget, cls)") - @SuppressWarnings("unused") - static Object construct(Object cls, Object iterables, Object repeat, - @Bind("this") Node inliningTarget, - @Shared("typeNode") @Cached IsTypeNode isTypeNode, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - } - - @Builtin(name = "repeat", minNumOfPositionalArgs = 2, parameterNames = {"$self", "object", - "times"}, constructsClass = PythonBuiltinClassType.PRepeat, doc = "repeat(object [,times]) -> create an iterator which returns the object\n" + - "for the specified number of times. If not specified, returns the object\nendlessly.") - @ArgumentClinic(name = "times", defaultValue = "PNone.NONE", useDefaultForNone = true) - @GenerateNodeFactory - public abstract static class RepeatNode extends PythonTernaryClinicBuiltinNode { - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return ItertoolsModuleBuiltinsClinicProviders.RepeatNodeClinicProviderGen.INSTANCE; - } - - @Specialization(guards = "isTypeNode.execute(inliningTarget, cls)") - static Object constructNone(Object cls, Object object, @SuppressWarnings("unused") PNone times, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Shared("typeNode") @Cached IsTypeNode isTypeNode, - @Shared @Cached PythonObjectFactory factory) { - PRepeat self = factory.createRepeat(cls); - self.setElement(object); - self.setCnt(-1); - return self; - } - - @Specialization(guards = {"isTypeNode.execute(inliningTarget, cls)", "times < 0"}) - static Object constructNeg(Object cls, Object object, @SuppressWarnings("unused") int times, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Shared("typeNode") @Cached IsTypeNode isTypeNode, - @Shared @Cached PythonObjectFactory factory) { - PRepeat self = factory.createRepeat(cls); - self.setElement(object); - self.setCnt(0); - return self; - } - - @Specialization(guards = {"isTypeNode.execute(inliningTarget, cls)", "times >= 0"}) - static Object construct(Object cls, Object object, int times, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Shared("typeNode") @Cached IsTypeNode isTypeNode, - @Shared @Cached PythonObjectFactory factory) { - PRepeat self = factory.createRepeat(cls); - self.setElement(object); - self.setCnt(times); - return self; - } - - @Specialization(guards = {"isTypeNode.execute(inliningTarget, cls)", "times >= 0"}, limit = "1") - static Object construct(VirtualFrame frame, Object cls, Object object, long times, - @Bind("this") Node inliningTarget, - @Cached PyLongAsIntNode asIntNode, - @SuppressWarnings("unused") @Exclusive @Cached IsTypeNode isTypeNode, - @Shared @Cached PythonObjectFactory factory) { - PRepeat self = factory.createRepeat(cls); - self.setElement(object); - self.setCnt(asIntNode.execute(frame, inliningTarget, times)); - return self; - } - - @Specialization(guards = {"isTypeNode.execute(inliningTarget, cls)", "!isNone(times)", "!isInt(times)", "!isLong(times)"}) - @SuppressWarnings("unused") - static Object construct(Object cls, Object object, Object times, - @Bind("this") Node inliningTarget, - @Shared("typeNode") @Cached IsTypeNode isTypeNode, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, S_EXPECTED_GOT_P, "integer", times); - } - - @Specialization(guards = "!isTypeNode.execute(inliningTarget, cls)") - @SuppressWarnings("unused") - static Object notype(Object cls, Object object, Object times, - @Bind("this") Node inliningTarget, - @Shared("typeNode") @Cached IsTypeNode isTypeNode, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - - } - - @Builtin(name = "chain", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PChain, doc = "Return a chain object whose .__next__() method returns elements from the\n" + - "first iterable until it is exhausted, then elements from the next\niterable, until all of the iterables are exhausted.") - @GenerateNodeFactory - public abstract static class ChainNode extends PythonVarargsBuiltinNode { - - @Specialization - static PChain construct(VirtualFrame frame, Object cls, Object[] args, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Cached(inline = false /* uncommon path */) TypeNodes.HasObjectInitNode hasObjectInitNode, - @Cached PyObjectGetIter getIter, - @Cached IsTypeNode isTypeNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!isTypeNode.execute(inliningTarget, cls)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - if (keywords.length > 0 && hasObjectInitNode.executeCached(cls)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "chain()"); - } - PChain self = factory.createChain(cls); - self.setSource(getIter.execute(frame, inliningTarget, factory.createList(args))); - self.setActive(PNone.NONE); - return self; - } - } - - @Builtin(name = "count", minNumOfPositionalArgs = 1, constructsClass = PythonBuiltinClassType.PCount, parameterNames = {"cls", "start", "step"}) - @ArgumentClinic(name = "start", defaultValue = "0", useDefaultForNone = true) - @ArgumentClinic(name = "step", defaultValue = "1", useDefaultForNone = true) - @GenerateNodeFactory - public abstract static class CountNode extends PythonTernaryClinicBuiltinNode { - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return ItertoolsModuleBuiltinsClinicProviders.CountNodeClinicProviderGen.INSTANCE; - } - - @Specialization - static Object construct(VirtualFrame frame, Object cls, Object start, Object step, - @Bind("this") Node inliningTarget, - @Cached PyObjectTypeCheck typeCheckNode, - @Cached PyObjectLookupAttr lookupAttrNode, - @Cached InlinedBranchProfile startNumberProfile, - @Cached InlinedBranchProfile stepNumberProfile, - @Cached IsTypeNode isTypeNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!isTypeNode.execute(inliningTarget, cls)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - PCount self = factory.createCount(cls); - checkType(frame, inliningTarget, start, typeCheckNode, lookupAttrNode, startNumberProfile, raiseNode); - checkType(frame, inliningTarget, step, typeCheckNode, lookupAttrNode, stepNumberProfile, raiseNode); - self.setCnt(start); - self.setStep(step); - return self; - } - - private static void checkType(VirtualFrame frame, Node inliningTarget, Object obj, PyObjectTypeCheck typeCheckNode, PyObjectLookupAttr lookupAttrNode, InlinedBranchProfile isNumberProfile, - PRaiseNode.Lazy raiseNode) { - if (typeCheckNode.execute(inliningTarget, obj, PythonBuiltinClassType.PComplex) || - lookupAttrNode.execute(frame, inliningTarget, obj, T___INDEX__) != PNone.NO_VALUE || - lookupAttrNode.execute(frame, inliningTarget, obj, T___FLOAT__) != PNone.NO_VALUE || - lookupAttrNode.execute(frame, inliningTarget, obj, T___INT__) != PNone.NO_VALUE) { - isNumberProfile.enter(inliningTarget); - return; - } - throw raiseNode.get(inliningTarget).raise(TypeError, NUMBER_IS_REQUIRED); - } - } - - @Builtin(name = "starmap", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PStarmap, doc = "starmap(function, sequence) --> starmap object\n\n" + - "Return an iterator whose values are returned from the function evaluated\n" + - "with an argument tuple taken from the given sequence.") - @GenerateNodeFactory - public abstract static class StarmapNode extends PythonVarargsBuiltinNode { - @Specialization - static PStarmap construct(VirtualFrame frame, Object cls, Object[] args, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Cached(inline = false /* uncommon path */) TypeNodes.HasObjectInitNode hasObjectInitNode, - @Cached PyObjectGetIter getIter, - @Cached IsTypeNode isTypeNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!isTypeNode.execute(inliningTarget, cls)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - if (keywords.length > 0 && hasObjectInitNode.executeCached(cls)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "starmap()"); - } - if (args.length != 2) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_EXPECTED_D_ARGS, "starmap", 2); - } - Object fun = args[0]; - Object iterable = args[1]; - PStarmap self = factory.createStarmap(cls); - self.setFun(fun); - self.setIterable(getIter.execute(frame, inliningTarget, iterable)); - return self; - } - } - - @Builtin(name = "islice", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PIslice) - @GenerateNodeFactory - public abstract static class IsliceNode extends PythonVarargsBuiltinNode { - @Specialization - static Object constructOne(VirtualFrame frame, Object cls, Object[] args, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Cached(inline = false /* uncommon path */) TypeNodes.HasObjectInitNode hasObjectInitNode, - @Cached PyObjectGetIter getIter, - @Cached PyNumberAsSizeNode asIntNode, - @Cached InlinedBranchProfile hasStart, - @Cached InlinedBranchProfile hasStop, - @Cached InlinedBranchProfile hasStep, - @Cached InlinedBranchProfile stopNotInt, - @Cached InlinedBranchProfile startNotInt, - @Cached InlinedBranchProfile stopWrongValue, - @Cached InlinedBranchProfile stepWrongValue, - @Cached InlinedBranchProfile wrongValue, - @Cached InlinedBranchProfile overflowBranch, - @Cached InlinedConditionProfile argsLen1, - @Cached InlinedConditionProfile argsLen2, - @Cached InlinedConditionProfile argsLen3, - @Cached InlinedBranchProfile wrongTypeBranch, - @Cached InlinedBranchProfile wrongArgsBranch, - @Cached IsTypeNode isTypeNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!isTypeNode.execute(inliningTarget, cls)) { - wrongTypeBranch.enter(inliningTarget); - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - if (keywords.length > 0 && hasObjectInitNode.executeCached(cls)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "islice()"); - } - if (args.length < 2 || args.length > 4) { - wrongArgsBranch.enter(inliningTarget); - throw raiseNode.get(inliningTarget).raise(TypeError, ISLICE_WRONG_ARGS); - } - int start = 0; - int step = 1; - int stop = -1; - if (argsLen1.profile(inliningTarget, args.length == 2)) { - if (args[1] != PNone.NONE) { - hasStop.enter(inliningTarget); - try { - stop = asIntNode.executeExact(frame, inliningTarget, args[1], OverflowError); - } catch (PException e) { - stopNotInt.enter(inliningTarget); - throw raiseNode.get(inliningTarget).raise(ValueError, S_FOR_ISLICE_MUST_BE, "Indices"); - } - } - if (stop < -1 || stop > SysModuleBuiltins.MAXSIZE) { - stopWrongValue.enter(inliningTarget); - throw raiseNode.get(inliningTarget).raise(ValueError, S_FOR_ISLICE_MUST_BE, "Indices"); - } - } else if (argsLen2.profile(inliningTarget, args.length == 3) || argsLen3.profile(inliningTarget, args.length == 4)) { - if (args[1] != PNone.NONE) { - hasStart.enter(inliningTarget); - try { - start = asIntNode.executeExact(frame, inliningTarget, args[1], OverflowError); - } catch (PException e) { - startNotInt.enter(inliningTarget); - throw raiseNode.get(inliningTarget).raise(ValueError, S_FOR_ISLICE_MUST_BE, "Indices"); - } - } - if (args[2] != PNone.NONE) { - hasStop.enter(inliningTarget); - try { - stop = asIntNode.executeExact(frame, inliningTarget, args[2], OverflowError); - } catch (PException e) { - stopNotInt.enter(inliningTarget); - throw raiseNode.get(inliningTarget).raise(ValueError, S_FOR_ISLICE_MUST_BE, "Stop argument"); - } - } - if (start < 0 || stop < -1 || start > SysModuleBuiltins.MAXSIZE || stop > SysModuleBuiltins.MAXSIZE) { - wrongValue.enter(inliningTarget); - throw raiseNode.get(inliningTarget).raise(ValueError, S_FOR_ISLICE_MUST_BE, "Indices"); - } - } - if (argsLen3.profile(inliningTarget, args.length == 4)) { - if (args[3] != PNone.NONE) { - hasStep.enter(inliningTarget); - try { - step = asIntNode.executeExact(frame, inliningTarget, args[3], OverflowError); - } catch (PException e) { - overflowBranch.enter(inliningTarget); - step = -1; - } - } - if (step < 1) { - stepWrongValue.enter(inliningTarget); - throw raiseNode.get(inliningTarget).raise(ValueError, STEP_FOR_ISLICE_MUST_BE); - } - } - Object iterable = args[0]; - PIslice self = factory.createIslice(cls); - self.setIterable(getIter.execute(frame, inliningTarget, iterable)); - self.setNext(start); - self.setStop(stop); - self.setStep(step); - self.setCnt(0); - return self; - } - } - - @Builtin(name = "zip_longest", minNumOfPositionalArgs = 1, takesVarArgs = true, constructsClass = PythonBuiltinClassType.PZipLongest, keywordOnlyNames = { - "fillvalue"}, doc = "zip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> zip_longest object\n\n" + - "Return a zip_longest object whose .next() method returns a tuple where\n" + - "the i-th element comes from the i-th iterable argument. The .next()\n" + - "method continues until the longest iterable in the argument sequence\n" + - "is exhausted and then it raises StopIteration. When the shorter iterables\n" + - "are exhausted, the fillvalue is substituted in their place. The fillvalue\n" + - "defaults to None or can be specified by a keyword argument.") - @GenerateNodeFactory - public abstract static class ZipLongestNode extends PythonBuiltinNode { - @Specialization - static Object construct(VirtualFrame frame, Object cls, Object[] args, Object fillValueIn, - @Bind("this") Node inliningTarget, - @Cached PyObjectGetIter getIterNode, - @Cached InlinedConditionProfile fillIsNone, - @Cached InlinedLoopConditionProfile loopProfile, - @Cached IsTypeNode isTypeNode, - @Cached InlinedBranchProfile errorProfile, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!isTypeNode.execute(inliningTarget, cls)) { - // Note: @Fallback or other @Specialization generate data-class - errorProfile.enter(inliningTarget); - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - - Object fillValue = fillValueIn; - if (fillIsNone.profile(inliningTarget, PGuards.isPNone(fillValue))) { - fillValue = null; - } - - PZipLongest self = factory.createZipLongest(cls); - self.setFillValue(fillValue); - self.setNumActive(args.length); - - Object[] itTuple = new Object[args.length]; - loopProfile.profileCounted(inliningTarget, itTuple.length); - LoopNode.reportLoopCount(inliningTarget, itTuple.length); - for (int i = 0; loopProfile.inject(inliningTarget, i < itTuple.length); i++) { - itTuple[i] = getIterNode.execute(frame, inliningTarget, args[i]); - } - self.setItTuple(itTuple); - return self; - } - } - - @Builtin(name = "pairwise", minNumOfPositionalArgs = 2, constructsClass = PythonBuiltinClassType.PPairwise, doc = "Return an iterator of overlapping pairs taken from the input iterator.\n\n" + - " s -> (s0,s1), (s1,s2), (s2, s3), ...") - @GenerateNodeFactory - public abstract static class PairwaiseNode extends PythonBinaryBuiltinNode { - @Specialization - static PPairwise construct(VirtualFrame frame, Object cls, Object iterable, - @Bind("this") Node inliningTarget, - @Cached PyObjectGetIter getIter, - @Cached IsTypeNode isTypeNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!isTypeNode.execute(inliningTarget, cls)) { - // Note: @Fallback or other @Specialization generate data-class - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); - } - - PPairwise self = factory.createPairwise(cls); - self.setIterable(getIter.execute(frame, inliningTarget, iterable)); - return self; - } - } - } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/JArrayModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/JArrayModuleBuiltins.java index 263d6183e9..5f236f1b85 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/JArrayModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/JArrayModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -150,8 +150,8 @@ static Object d(int length, @SuppressWarnings("unused") String typeCode) { @Fallback @SuppressWarnings("unused") static Object error(int length, String typeCode, - @Cached(inline = false) PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.INVALID_TYPE_CODE, typeCode); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.INVALID_TYPE_CODE, typeCode); } protected static boolean eq(String a, String b) { @@ -178,7 +178,7 @@ static Object fromTypeCode(int length, Object typeCodeObj, @Specialization(guards = "!isString(classObj)") static Object fromClass(int length, Object classObj, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { TruffleLanguage.Env env = PythonContext.get(inliningTarget).getEnv(); if (env.isHostObject(classObj)) { Object clazz = env.asHostObject(classObj); @@ -187,7 +187,7 @@ static Object fromClass(int length, Object classObj, return env.asGuestValue(array); } } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.SECOND_ARG_MUST_BE_STR_OR_JAVA_CLS, classObj); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.SECOND_ARG_MUST_BE_STR_OR_JAVA_CLS, classObj); } @Override @@ -206,7 +206,7 @@ static Object fromSequence(PSequence sequence, Object type, @Shared @Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode, @Shared @Cached SequenceStorageNodes.GetItemScalarNode getItemScalarNode, @Shared @Cached ZerosNode zerosNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { SequenceStorage storage = getSequenceStorageNode.execute(inliningTarget, sequence); int length = storage.length(); Object array = zerosNode.execute(length, type); @@ -215,7 +215,7 @@ static Object fromSequence(PSequence sequence, Object type, try { lib.writeArrayElement(array, i, value); } catch (UnsupportedTypeException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.TYPE_P_NOT_SUPPORTED_BY_FOREIGN_OBJ, value); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.TYPE_P_NOT_SUPPORTED_BY_FOREIGN_OBJ, value); } catch (UnsupportedMessageException | InvalidArrayIndexException e) { throw CompilerDirectives.shouldNotReachHere("failed to set array item"); } @@ -231,7 +231,7 @@ static Object fromIterable(VirtualFrame frame, Object sequence, Object type, @Shared @Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode, @Shared @Cached SequenceStorageNodes.GetItemScalarNode getItemScalarNode, @Shared @Cached ZerosNode zerosNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { PList list = constructListNode.execute(frame, sequence); return fromSequence(list, type, inliningTarget, lib, getSequenceStorageNode, getItemScalarNode, zerosNode, raiseNode); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/JavaModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/JavaModuleBuiltins.java index 4f9f74f27b..f3a83edf88 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/JavaModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/JavaModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -128,10 +128,10 @@ abstract static class TypeNode extends PythonUnaryBuiltinNode { static Object type(Object name, @Bind("this") Node inliningTarget, @Cached CastToJavaStringNode castToStringNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Env env = PythonContext.get(inliningTarget).getEnv(); if (!env.isHostLookupAllowed()) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.NotImplementedError, ErrorMessages.HOST_LOOKUP_NOT_ALLOWED); + throw raiseNode.raise(inliningTarget, PythonErrorType.NotImplementedError, ErrorMessages.HOST_LOOKUP_NOT_ALLOWED); } String javaString = castToStringNode.execute(name); Object hostValue; @@ -141,7 +141,7 @@ static Object type(Object name, hostValue = null; } if (hostValue == null) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.KeyError, ErrorMessages.HOST_SYM_NOT_DEFINED, javaString); + throw raiseNode.raise(inliningTarget, PythonErrorType.KeyError, ErrorMessages.HOST_SYM_NOT_DEFINED, javaString); } else { return hostValue; } @@ -149,8 +149,8 @@ static Object type(Object name, @Fallback static Object doError(Object object, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_P, object); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_P, object); } } @@ -161,10 +161,10 @@ abstract static class AddToClassPathNode extends PythonBuiltinNode { static PNone add(Object[] args, @Bind("this") Node inliningTarget, @Cached CastToTruffleStringNode castToString, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Env env = PythonContext.get(inliningTarget).getEnv(); if (!env.isHostLookupAllowed()) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.NotImplementedError, ErrorMessages.HOST_ACCESS_NOT_ALLOWED); + throw raiseNode.raise(inliningTarget, PythonErrorType.NotImplementedError, ErrorMessages.HOST_ACCESS_NOT_ALLOWED); } for (int i = 0; i < args.length; i++) { Object arg = args[i]; @@ -175,9 +175,9 @@ static PNone add(Object[] args, // implicitly env.addToHostClassPath(PythonContext.get(inliningTarget).getPublicTruffleFileRelaxed(entry, T_JAR)); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.CLASSPATH_ARG_MUST_BE_STRING, i + 1, arg); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.CLASSPATH_ARG_MUST_BE_STRING, i + 1, arg); } catch (SecurityException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.INVALD_OR_UNREADABLE_CLASSPATH, entry, e); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.INVALD_OR_UNREADABLE_CLASSPATH, entry, e); } } return PNone.NONE; @@ -232,7 +232,7 @@ static boolean check(Object object, Object klass, @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared("isForeign1") @Cached IsForeignObjectNode isForeign1, @SuppressWarnings("unused") @Shared("isForeign2") @Cached IsForeignObjectNode isForeign2, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { Env env = PythonContext.get(inliningTarget).getEnv(); try { Object hostKlass = env.asHostObject(klass); @@ -240,7 +240,7 @@ static boolean check(Object object, Object klass, return ((Class) hostKlass).isInstance(object); } } catch (ClassCastException cce) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.KLASS_ARG_IS_NOT_HOST_OBJ, klass); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.KLASS_ARG_IS_NOT_HOST_OBJ, klass); } return false; } @@ -250,7 +250,7 @@ static boolean checkForeign(Object object, Object klass, @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared("isForeign1") @Cached IsForeignObjectNode isForeign1, @SuppressWarnings("unused") @Shared("isForeign2") @Cached IsForeignObjectNode isForeign2, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { Env env = PythonContext.get(inliningTarget).getEnv(); try { Object hostObject = env.asHostObject(object); @@ -259,15 +259,15 @@ static boolean checkForeign(Object object, Object klass, return ((Class) hostKlass).isInstance(hostObject); } } catch (ClassCastException cce) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.OBJ_OR_KLASS_ARGS_IS_NOT_HOST_OBJ, object, klass); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.OBJ_OR_KLASS_ARGS_IS_NOT_HOST_OBJ, object, klass); } return false; } @Fallback static boolean fallback(Object object, Object klass, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.UNSUPPORTED_INSTANCEOF, object, klass); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.UNSUPPORTED_INSTANCEOF, object, klass); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/LocaleModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/LocaleModuleBuiltins.java index 4bef0e0f31..24a7747f03 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/LocaleModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/LocaleModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -53,6 +53,7 @@ import java.util.List; import java.util.Locale; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -72,7 +73,7 @@ import com.oracle.graal.python.runtime.exception.PythonErrorType; import com.oracle.graal.python.runtime.locale.LocaleUtils; import com.oracle.graal.python.runtime.locale.PythonLocale; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -117,7 +118,7 @@ public abstract static class LocaleConvNode extends PythonBuiltinNode { @TruffleBoundary static PDict localeconv() { PythonContext ctx = PythonContext.get(null); - PythonObjectFactory factory = ctx.factory(); + PythonLanguage language = ctx.getLanguage(); LinkedHashMap dict = new LinkedHashMap<>(20); final PythonLocale currentPythonLocale = ctx.getCurrentLocale(); @@ -128,7 +129,7 @@ static PDict localeconv() { dict.put("decimal_point", TruffleString.fromCodePointUncached(decimalFormatSymbols.getDecimalSeparator(), TS_ENCODING)); dict.put("thousands_sep", TruffleString.fromCodePointUncached(decimalFormatSymbols.getGroupingSeparator(), TS_ENCODING)); - dict.put("grouping", getDecimalFormatGrouping(factory, numericLocaleNumFormat)); + dict.put("grouping", getDecimalFormatGrouping(language, numericLocaleNumFormat)); // LC_MONETARY Locale monetaryLocale = currentPythonLocale.category(LC_MONETARY); @@ -140,7 +141,7 @@ static PDict localeconv() { dict.put("currency_symbol", toTruffleStringUncached(decimalFormatSymbols.getCurrencySymbol())); dict.put("mon_decimal_point", TruffleString.fromCodePointUncached(decimalFormatSymbols.getMonetaryDecimalSeparator(), TS_ENCODING)); dict.put("mon_thousands_sep", TruffleString.fromCodePointUncached(decimalFormatSymbols.getGroupingSeparator(), TS_ENCODING)); - dict.put("mon_grouping", getDecimalFormatGrouping(factory, monetaryNumFormat)); + dict.put("mon_grouping", getDecimalFormatGrouping(language, monetaryNumFormat)); // TODO: reasonable default, but not the current locale setting dict.put("positive_sign", ""); dict.put("negative_sign", TruffleString.fromCodePointUncached(decimalFormatSymbols.getMinusSign(), TS_ENCODING)); @@ -153,21 +154,21 @@ static PDict localeconv() { dict.put("p_sign_posn", PNone.NONE); dict.put("n_sign_posn", PNone.NONE); - return factory.createDictFromMap(dict); + return PFactory.createDictFromMap(language, dict); } private static DecimalFormatSymbols getDecimalFormatSymbols(Locale locale, NumberFormat numberFormat) { return numberFormat instanceof DecimalFormat decimalFormat ? decimalFormat.getDecimalFormatSymbols() : new DecimalFormatSymbols(locale); } - private static PList getDecimalFormatGrouping(PythonObjectFactory factory, NumberFormat numberFormat) { + private static PList getDecimalFormatGrouping(PythonLanguage language, NumberFormat numberFormat) { if (numberFormat instanceof DecimalFormat decimalFormat) { // TODO: this does not support groupings with variable size groups like in India // Possible approach: decimalFormat.toPattern() gives a generic pattern (e.g., // #,#00.0#) that would have to be parsed to extract the group sizes from it - return factory.createList(new Object[]{decimalFormat.getGroupingSize(), 0}); + return PFactory.createList(language, new Object[]{decimalFormat.getGroupingSize(), 0}); } else { - return factory.createList(); + return PFactory.createList(language); } } } @@ -191,7 +192,7 @@ private static String setCurrent(PythonContext ctx, int category, String posixLo if (newLocale != null) { ctx.setCurrentLocale(current.withCategory(category, newLocale)); } else { - throw PRaiseNode.raiseUncached(nodeForRaise, PythonErrorType.ValueError, ErrorMessages.UNSUPPORTED_LOCALE_SETTING); + throw PRaiseNode.raiseStatic(nodeForRaise, PythonErrorType.ValueError, ErrorMessages.UNSUPPORTED_LOCALE_SETTING); } return LocaleUtils.toPosix(newLocale); } @@ -203,10 +204,10 @@ static TruffleString doGeneric(VirtualFrame frame, Object category, Object posix @Cached CastToTruffleStringNode castToStringNode, @Cached FromJavaStringNode resultAsTruffleStringNode, @Cached ToJavaStringNode toJavaStringNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { long l = asLongNode.execute(frame, inliningTarget, category); if (!isValidCategory(l)) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.ValueError, ErrorMessages.INVALID_LOCALE_CATEGORY); + throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ErrorMessages.INVALID_LOCALE_CATEGORY); } TruffleString posixLocaleIDStr = null; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/LsprofModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/LsprofModuleBuiltins.java deleted file mode 100644 index 0c91bb9359..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/LsprofModuleBuiltins.java +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.modules; - -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import com.oracle.graal.python.builtins.Builtin; -import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.function.PKeyword; -import com.oracle.graal.python.builtins.objects.list.PList; -import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; -import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.tuple.StructSequence; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinNode; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.runtime.object.PythonObjectSlowPathFactory; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.InstrumentInfo; -import com.oracle.truffle.api.TruffleLanguage.Env; -import com.oracle.truffle.api.dsl.GenerateNodeFactory; -import com.oracle.truffle.api.dsl.NodeFactory; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.instrumentation.SourceSectionFilter; -import com.oracle.truffle.api.object.Shape; -import com.oracle.truffle.api.source.SourceSection; -import com.oracle.truffle.tools.profiler.CPUSampler; -import com.oracle.truffle.tools.profiler.CPUSampler.Payload; -import com.oracle.truffle.tools.profiler.CPUSamplerData; -import com.oracle.truffle.tools.profiler.ProfilerNode; -import com.oracle.truffle.tools.profiler.impl.CPUSamplerInstrument; - -@CoreFunctions(defineModule = "_lsprof") -public final class LsprofModuleBuiltins extends PythonBuiltins { - - static final StructSequence.BuiltinTypeDescriptor PROFILER_ENTRY_DESC = new StructSequence.BuiltinTypeDescriptor( - PythonBuiltinClassType.PProfilerEntry, - null, - 6, - new String[]{ - "code", "callcount", "reccallcount", "totaltime", "inlinetime", "calls" - }, - new String[]{ - "code object or built-in function name", - "how many times this was called", - "how many times called recursively", - "total time in this entry", - "inline time in this entry (not in subcalls)", - "details of the calls" - }); - - static final StructSequence.BuiltinTypeDescriptor PROFILER_SUBENTRY_DESC = new StructSequence.BuiltinTypeDescriptor( - PythonBuiltinClassType.PProfilerSubentry, - null, - 5, - new String[]{ - "code", "callcount", "reccallcount", "totaltime", "inlinetime" - }, - new String[]{ - "called code object or built-in function name", - "how many times this is called", - "how many times this is called recursively", - "total time spent in this call", - "inline time (not in further subcalls)" - }); - - @Override - protected List> getNodeFactories() { - return LsprofModuleBuiltinsFactory.getFactories(); - } - - @Override - public void initialize(Python3Core core) { - super.initialize(core); - StructSequence.initType(core, PROFILER_ENTRY_DESC); - StructSequence.initType(core, PROFILER_SUBENTRY_DESC); - } - - public static PythonBuiltins newProfilerBuiltins() { - return new ProfilerBuiltins(); - } - - @Builtin(name = "Profiler", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.LsprofProfiler) - @GenerateNodeFactory - abstract static class LsprofNew extends PythonBuiltinNode { - @Specialization - @TruffleBoundary - Profiler doit(Object cls, @SuppressWarnings("unused") Object[] args, @SuppressWarnings("unused") PKeyword[] kwargs) { - Env env = getContext().getEnv(); - Map instruments = env.getInstruments(); - InstrumentInfo instrumentInfo = instruments.get(CPUSamplerInstrument.ID); - if (instrumentInfo != null) { - CPUSampler sampler = env.lookup(instrumentInfo, CPUSampler.class); - if (sampler != null) { - PythonObjectFactory factory = PythonObjectFactory.getUncached(); - return factory.trace(new Profiler(cls, factory.getShape(cls), sampler)); - } - } - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.NotImplementedError, ErrorMessages.COVERAGE_TRACKER_NOT_AVAILABLE); - } - } -} - -class Profiler extends PythonBuiltinObject { - boolean subcalls; - boolean builtins; - double timeunit; - Object externalTimer; - double time; - final CPUSampler sampler; - - public Profiler(Object cls, Shape instanceShape, CPUSampler sampler) { - super(cls, instanceShape); - this.sampler = sampler; - this.sampler.setFilter(SourceSectionFilter.newBuilder().includeInternal(true).build()); - this.sampler.setPeriod(1); - } -} - -@CoreFunctions(extendClasses = PythonBuiltinClassType.LsprofProfiler) -class ProfilerBuiltins extends PythonBuiltins { - @Override - protected List> getNodeFactories() { - return ProfilerBuiltinsFactory.getFactories(); - } - - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, parameterNames = {"$self", "timer", "timeunit", "subcalls", "builtins"}) - @GenerateNodeFactory - abstract static class Init extends PythonBuiltinNode { - @Specialization - PNone doit(Profiler self, Object timer, double timeunit, long subcalls, long builtins) { - self.subcalls = subcalls > 0; - self.builtins = builtins > 0; - self.timeunit = timeunit; - self.externalTimer = timer; - return PNone.NONE; - } - - @Specialization - @SuppressWarnings("unused") - PNone doit(Profiler self, Object timer, PNone timeunit, PNone subcalls, PNone builtins) { - self.subcalls = true; - self.builtins = true; - self.timeunit = -1; - self.externalTimer = timer; - return PNone.NONE; - } - } - - @Builtin(name = "enable", minNumOfPositionalArgs = 1, parameterNames = {"$self", "subcalls", "builtins"}) - @GenerateNodeFactory - abstract static class Enable extends PythonBuiltinNode { - @Specialization - @TruffleBoundary - PNone doit(Profiler self, long subcalls, long builtins) { - self.subcalls = subcalls > 0; - self.builtins = builtins > 0; - // TODO: deal with any arguments - self.time = System.currentTimeMillis(); - self.sampler.setCollecting(true); - return PNone.NONE; - } - - @Specialization - PNone doit(Profiler self, long subcalls, @SuppressWarnings("unused") PNone builtins) { - return doit(self, subcalls, self.builtins ? 1 : 0); - } - - @Specialization - PNone doit(Profiler self, @SuppressWarnings("unused") PNone subcalls, long builtins) { - return doit(self, self.subcalls ? 1 : 0, builtins); - } - - @Specialization - PNone doit(Profiler self, @SuppressWarnings("unused") PNone subcalls, @SuppressWarnings("unused") PNone builtins) { - return doit(self, self.subcalls ? 1 : 0, self.builtins ? 1 : 0); - } - } - - @Builtin(name = "disable", minNumOfPositionalArgs = 1) - @GenerateNodeFactory - abstract static class Disable extends PythonBuiltinNode { - @Specialization - @TruffleBoundary - PNone doit(Profiler self) { - self.sampler.setCollecting(false); - self.time = (System.currentTimeMillis() - self.time) / 1000D; - return PNone.NONE; - } - } - - @Builtin(name = "clear", minNumOfPositionalArgs = 1) - @GenerateNodeFactory - abstract static class Clear extends PythonBuiltinNode { - @Specialization - @TruffleBoundary - PNone doit(Profiler self) { - self.sampler.clearData(); - return PNone.NONE; - } - } - - @Builtin(name = "getstats", minNumOfPositionalArgs = 1, doc = "" + - "getstats() -> list of profiler_entry objects\n" + - "\n" + - "Return all information collected by the profiler.\n" + - "Each profiler_entry is a tuple-like object with the\n" + - "following attributes:\n" + - "\n" + - " code code object or functionname\n" + - " callcount how many times this was called\n" + - " reccallcount how many times called recursively\n" + - " totaltime total time in this entry\n" + - " inlinetime inline time in this entry (not in subcalls)\n" + - " calls details of the calls\n" + - "\n" + - "The calls attribute is either None or a list of\n" + - "profiler_subentry objects:\n" + - "\n" + - " code called code object\n" + - " callcount how many times this is called\n" + - " reccallcount how many times this is called recursively\n" + - " totaltime total time spent in this call\n" + - " inlinetime inline time (not in further subcalls)\n") - @GenerateNodeFactory - abstract static class GetStats extends PythonBuiltinNode { - @Specialization - @TruffleBoundary - static PList doit(Profiler self) { - double avgSampleSeconds = self.sampler.getPeriod() / 1000D; - List entries = new ArrayList<>(); - for (CPUSamplerData data : self.sampler.getDataList()) { - Map>> threads = data.getThreadData(); - for (Thread thread : threads.keySet()) { - for (ProfilerNode node : threads.get(thread)) { - countNode(entries, node, avgSampleSeconds); - } - } - } - - self.sampler.close(); - return PythonObjectFactory.getUncached().createList(entries.toArray()); - } - - private static void countNode(List entries, ProfilerNode node, double avgSampleTime) { - PythonObjectSlowPathFactory factory = PythonContext.get(null).factory(); - Collection> children = node.getChildren(); - Object[] profilerEntry = getProfilerEntry(node, avgSampleTime); - Object[] calls = new Object[children.size()]; - int callIdx = 0; - for (ProfilerNode childNode : children) { - countNode(entries, childNode, avgSampleTime); - calls[callIdx++] = factory.createStructSeq(LsprofModuleBuiltins.PROFILER_SUBENTRY_DESC, getProfilerEntry(childNode, avgSampleTime)); - } - assert callIdx == calls.length; - profilerEntry = Arrays.copyOf(profilerEntry, 6); - profilerEntry[profilerEntry.length - 1] = factory.createList(calls); - entries.add(factory.createStructSeq(LsprofModuleBuiltins.PROFILER_ENTRY_DESC, profilerEntry)); - } - - private static Object[] getProfilerEntry(ProfilerNode node, double avgSampleTime) { - SourceSection sec = node.getSourceSection(); - String rootName; - if (sec == null) { - rootName = node.getRootName(); - } else { - rootName = sec.getSource().getName() + ":" + sec.getStartLine() + "(" + node.getRootName() + ")"; - } - if (rootName == null) { - rootName = ""; - } - int otherHitCount = node.getPayload().getHitCount(); - int selfHitCount = node.getPayload().getSelfHitCount(); - long hitCount = (long) otherHitCount + selfHitCount; - Object[] profilerEntry = new Object[]{ - toTruffleStringUncached(rootName), - hitCount, - 0, - otherHitCount * avgSampleTime, - selfHitCount * avgSampleTime - }; - return profilerEntry; - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/MMapModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/MMapModuleBuiltins.java index e576c697c7..b3a25f9bc0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/MMapModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/MMapModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,50 +40,22 @@ */ package com.oracle.graal.python.builtins.modules; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError; -import static com.oracle.graal.python.runtime.PosixConstants.MAP_ANONYMOUS; -import static com.oracle.graal.python.runtime.PosixConstants.MAP_PRIVATE; -import static com.oracle.graal.python.runtime.PosixConstants.MAP_SHARED; -import static com.oracle.graal.python.runtime.PosixConstants.PROT_READ; -import static com.oracle.graal.python.runtime.PosixConstants.PROT_WRITE; -import static com.oracle.graal.python.runtime.PosixSupportLibrary.ST_SIZE; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; +import java.util.Collections; import java.util.List; -import com.oracle.graal.python.annotations.ArgumentClinic; -import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; -import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.modules.MMapModuleBuiltinsClinicProviders.MMapNodeClinicProviderGen; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes; import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode; import com.oracle.graal.python.builtins.objects.mmap.PMMap; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PConstructAndRaiseNode; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.runtime.PosixConstants; -import com.oracle.graal.python.runtime.PosixSupport; -import com.oracle.graal.python.runtime.PosixSupportLibrary; -import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.library.CachedLibrary; -import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @CoreFunctions(defineModule = "mmap") @@ -93,7 +65,7 @@ public final class MMapModuleBuiltins extends PythonBuiltins { @Override protected List> getNodeFactories() { - return MMapModuleBuiltinsFactory.getFactories(); + return Collections.emptyList(); } public MMapModuleBuiltins() { @@ -138,133 +110,4 @@ public void postInitialize(Python3Core core) { CExtNodes.PCallCapiFunction.callUncached(NativeCAPISymbol.FUN_MMAP_INIT_BUFFERPROTOCOL, PythonToNativeNode.executeUncached(PythonBuiltinClassType.PMMap)); }); } - - @Builtin(name = "mmap", minNumOfPositionalArgs = 3, parameterNames = {"cls", "fd", "length", "flags", "prot", "access", "offset"}, constructsClass = PythonBuiltinClassType.PMMap) - @GenerateNodeFactory - // Note: it really should not call fileno on fd as per Python spec - @ArgumentClinic(name = "fd", conversion = ClinicConversion.Int) - @ArgumentClinic(name = "length", conversion = ClinicConversion.LongIndex) - @ArgumentClinic(name = "flags", conversion = ClinicConversion.Int, defaultValue = "FLAGS_DEFAULT") - @ArgumentClinic(name = "prot", conversion = ClinicConversion.Int, defaultValue = "PROT_DEFAULT") - @ArgumentClinic(name = "access", conversion = ClinicConversion.Int, defaultValue = "ACCESS_ARG_DEFAULT") - @ArgumentClinic(name = "offset", conversion = ClinicConversion.Long, defaultValue = "0") - public abstract static class MMapNode extends PythonClinicBuiltinNode { - protected static final int ACCESS_ARG_DEFAULT = PMMap.ACCESS_DEFAULT; - protected static final int FLAGS_DEFAULT = MAP_SHARED.value; - protected static final int PROT_DEFAULT = PROT_WRITE.value | PROT_READ.value; - - private static final int ANONYMOUS_FD = -1; - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return MMapNodeClinicProviderGen.INSTANCE; - } - - // mmap(fileno, length, tagname=None, access=ACCESS_DEFAULT[, offset=0]) - @Specialization(guards = "!isIllegal(fd)") - static PMMap doFile(VirtualFrame frame, Object clazz, int fd, long lengthIn, int flagsIn, int protIn, @SuppressWarnings("unused") int accessIn, long offset, - @Bind("this") Node inliningTarget, - @Cached SysModuleBuiltins.AuditNode auditNode, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixSupport, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (lengthIn < 0) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.MEM_MAPPED_LENGTH_MUST_BE_POSITIVE); - } - if (offset < 0) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.MEM_MAPPED_OFFSET_MUST_BE_POSITIVE); - } - int flags = flagsIn; - int prot = protIn; - int access = accessIn; - switch (access) { - case PMMap.ACCESS_READ: - flags = MAP_SHARED.value; - prot = PROT_READ.value; - break; - case PMMap.ACCESS_WRITE: - flags = MAP_SHARED.value; - prot = PROT_READ.value | PROT_WRITE.value; - break; - case PMMap.ACCESS_COPY: - flags = MAP_PRIVATE.value; - prot = PROT_READ.value | PROT_WRITE.value; - break; - case PMMap.ACCESS_DEFAULT: - // map prot to access type - if (((prot & PROT_READ.value) != 0) && ((prot & PROT_WRITE.value) != 0)) { - // ACCESS_DEFAULT - } else if ((prot & PROT_WRITE.value) != 0) { - access = PMMap.ACCESS_WRITE; - } else { - access = PMMap.ACCESS_READ; - } - break; - default: - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MEM_MAPPED_OFFSET_INVALID_ACCESS); - } - - auditNode.audit(inliningTarget, "mmap.__new__", fd, lengthIn, access, offset); - - // For file mappings we use fstat to validate the length or to initialize the length if - // it is 0 meaning that we should find it out for the user - long length = lengthIn; - PosixSupport posixSupport1 = PosixSupport.get(inliningTarget); - if (fd != ANONYMOUS_FD) { - long[] fstatResult = null; - try { - fstatResult = posixSupport.fstat(posixSupport1, fd); - } catch (PosixException ignored) { - } - if (fstatResult != null && length == 0) { - if (fstatResult[ST_SIZE] == 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.CANNOT_MMAP_AN_EMPTY_FILE); - } - if (offset >= fstatResult[ST_SIZE]) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MMAP_S_IS_GREATER_THAN_FILE_SIZE, "offset"); - } - // Unlike in CPython, this always fits in the long range - length = fstatResult[ST_SIZE] - offset; - } else if (fstatResult != null && (offset > fstatResult[ST_SIZE] || fstatResult[ST_SIZE] - offset < length)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MMAP_S_IS_GREATER_THAN_FILE_SIZE, "length"); - } - } - - // Fixup the flags if we want to use anonymous map - int dupFd; - if (fd == ANONYMOUS_FD) { - dupFd = ANONYMOUS_FD; - flags |= MAP_ANONYMOUS.value; - // TODO: CPython uses mapping to "/dev/zero" on systems that do not support - // MAP_ANONYMOUS, maybe this can be detected and handled by the POSIX layer - } else { - try { - dupFd = posixSupport.dup(posixSupport1, fd); - } catch (PosixException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); - } - } - - Object mmapHandle; - try { - mmapHandle = posixSupport.mmap(posixSupport1, length, prot, flags, dupFd, offset); - } catch (PosixException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); - } - return factory.createMMap(PythonContext.get(inliningTarget), clazz, mmapHandle, dupFd, length, access); - } - - @Specialization(guards = "isIllegal(fd)") - @SuppressWarnings("unused") - static PMMap doIllegal(Object clazz, int fd, long lengthIn, int flagsIn, int protIn, int accessIn, long offset, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.OSError); - } - - protected static boolean isIllegal(int fd) { - return fd < -1; - } - - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/MarshalModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/MarshalModuleBuiltins.java index 32ddad0ee3..646f9e5f82 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/MarshalModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/MarshalModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -35,6 +35,11 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.DataInput; +import java.io.DataInputStream; +import java.io.DataOutput; +import java.io.DataOutputStream; +import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.math.BigInteger; @@ -43,7 +48,9 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.function.Supplier; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; import com.oracle.graal.python.builtins.Builtin; @@ -73,13 +80,16 @@ import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetInternalObjectArrayNode; import com.oracle.graal.python.builtins.objects.complex.PComplex; import com.oracle.graal.python.builtins.objects.dict.PDict; +import com.oracle.graal.python.builtins.objects.ellipsis.PEllipsis; import com.oracle.graal.python.builtins.objects.floats.PFloat; +import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.set.PBaseSet; import com.oracle.graal.python.builtins.objects.str.PString; import com.oracle.graal.python.builtins.objects.str.StringNodes; import com.oracle.graal.python.builtins.objects.str.StringNodes.IsInternedStringNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode; +import com.oracle.graal.python.compiler.BytecodeCodeUnit; import com.oracle.graal.python.compiler.CodeUnit; import com.oracle.graal.python.compiler.Compiler; import com.oracle.graal.python.lib.PyComplexCheckExactNode; @@ -95,6 +105,9 @@ import com.oracle.graal.python.lib.PyUnicodeCheckExactNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.bytecode_dsl.BytecodeDSLCodeUnit; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNodeGen; import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; @@ -105,13 +118,19 @@ import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext; import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.PythonOptions; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.bytecode.BytecodeConfig; +import com.oracle.truffle.api.bytecode.BytecodeRootNodes; +import com.oracle.truffle.api.bytecode.serialization.BytecodeDeserializer; +import com.oracle.truffle.api.bytecode.serialization.BytecodeSerializer; +import com.oracle.truffle.api.bytecode.serialization.SerializationUtils; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -122,13 +141,14 @@ import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.memory.ByteArraySupport; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.source.Source; import com.oracle.truffle.api.strings.InternalByteArray; import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.strings.TruffleString.Encoding; @CoreFunctions(defineModule = "marshal") public final class MarshalModuleBuiltins extends PythonBuiltins { - static final int CURRENT_VERSION = 4; + static final int CURRENT_VERSION = 5; @Override protected List> getNodeFactories() { @@ -150,28 +170,27 @@ protected ArgumentClinicProvider getArgumentClinic() { return DumpNodeClinicProviderGen.INSTANCE; } - @NeverDefault - protected static LookupAndCallBinaryNode createCallWriteNode() { - return LookupAndCallBinaryNode.create(T_WRITE); - } - @Specialization static Object doit(VirtualFrame frame, Object value, Object file, int version, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached("createFor(this)") IndirectCallData indirectCallData, - @Cached("createCallWriteNode()") LookupAndCallBinaryNode callNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - Object savedState = IndirectCallContext.enter(frame, indirectCallData); + @Cached PyObjectCallMethodObjArgs callMethod, + @Cached PRaiseNode raiseNode) { + PythonLanguage language = context.getLanguage(inliningTarget); + PythonContext.PythonThreadState threadState = context.getThreadState(language); + Object savedState = IndirectCallContext.enter(frame, threadState, indirectCallData); + byte[] data; try { - return callNode.executeObject(frame, file, factory.createBytes(Marshal.dump(value, version, PythonContext.get(inliningTarget)))); + data = Marshal.dump(context, value, version); } catch (IOException e) { throw CompilerDirectives.shouldNotReachHere(e); } catch (Marshal.MarshalError me) { - throw raiseNode.get(inliningTarget).raise(me.type, me.message, me.arguments); + throw raiseNode.raise(inliningTarget, me.type, me.message, me.arguments); } finally { - IndirectCallContext.exit(frame, indirectCallData, savedState); + IndirectCallContext.exit(frame, threadState, savedState); } + return callMethod.execute(frame, inliningTarget, file, T_WRITE, PFactory.createBytes(language, data)); } } @@ -187,18 +206,20 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static Object doit(VirtualFrame frame, Object value, int version, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached("createFor(this)") IndirectCallData indirectCallData, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - Object savedState = IndirectCallContext.enter(frame, indirectCallData); + @Cached PRaiseNode raiseNode) { + PythonLanguage language = context.getLanguage(inliningTarget); + PythonContext.PythonThreadState threadState = context.getThreadState(language); + Object savedState = IndirectCallContext.enter(frame, threadState, indirectCallData); try { - return factory.createBytes(Marshal.dump(value, version, PythonContext.get(inliningTarget))); + return PFactory.createBytes(language, Marshal.dump(context, value, version)); } catch (IOException e) { throw CompilerDirectives.shouldNotReachHere(e); } catch (Marshal.MarshalError me) { - throw raiseNode.get(inliningTarget).raise(me.type, me.message, me.arguments); + throw raiseNode.raise(inliningTarget, me.type, me.message, me.arguments); } finally { - IndirectCallContext.exit(frame, indirectCallData, savedState); + IndirectCallContext.exit(frame, threadState, savedState); } } } @@ -214,19 +235,20 @@ protected static LookupAndCallBinaryNode createCallReadNode() { @Specialization static Object doit(VirtualFrame frame, Object file, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached("createCallReadNode()") LookupAndCallBinaryNode callNode, @CachedLibrary(limit = "3") PythonBufferAcquireLibrary bufferLib, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object buffer = callNode.executeObject(frame, file, 0); if (!bufferLib.hasBuffer(buffer)) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.READ_RETURNED_NOT_BYTES, buffer); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.READ_RETURNED_NOT_BYTES, buffer); } try { - return Marshal.loadFile(file); + return Marshal.loadFile(context, file); } catch (NumberFormatException e) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.BAD_MARSHAL_DATA_S, e.getMessage()); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.BAD_MARSHAL_DATA_S, e.getMessage()); } catch (Marshal.MarshalError me) { - throw raiseNode.get(inliningTarget).raise(me.type, me.message, me.arguments); + throw raiseNode.raise(inliningTarget, me.type, me.message, me.arguments); } } } @@ -239,15 +261,16 @@ abstract static class LoadsNode extends PythonUnaryClinicBuiltinNode { @Specialization static Object doit(VirtualFrame frame, Object buffer, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { - return Marshal.load(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer)); + return Marshal.load(context, bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer)); } catch (NumberFormatException e) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.BAD_MARSHAL_DATA_S, e.getMessage()); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.BAD_MARSHAL_DATA_S, e.getMessage()); } catch (Marshal.MarshalError me) { - throw raiseNode.get(inliningTarget).raise(me.type, me.message, me.arguments); + throw raiseNode.raise(inliningTarget, me.type, me.message, me.arguments); } finally { bufferLib.release(buffer, frame, indirectCallData); } @@ -298,6 +321,10 @@ static final class Marshal { private static final char TYPE_GRAALPYTHON_CODE_UNIT = 'U'; private static final char TYPE_BIG_INTEGER = 'B'; private static final char TYPE_ARRAY = ']'; + // These are constants that show up in the Bytecode DSL interpreter. + private static final char TYPE_GRAALPYTHON_DSL_CODE_UNIT = 'D'; + private static final char TYPE_DSL_SOURCE = '$'; + private static final char TYPE_DSL_EMPTY_KEYWORDS = 'k'; private static final char ARRAY_TYPE_OBJECT = 'o'; private static final char ARRAY_TYPE_INT = 'i'; @@ -346,15 +373,15 @@ public final Throwable fillInStackTrace() { } @TruffleBoundary - static byte[] dump(Object value, int version, Python3Core core) throws IOException, MarshalError { - Marshal outMarshal = new Marshal(version, core.getTrue(), core.getFalse()); + static byte[] dump(PythonContext context, Object value, int version) throws IOException, MarshalError { + Marshal outMarshal = new Marshal(context, version, context.getTrue(), context.getFalse()); outMarshal.writeObject(value); - return outMarshal.out.toByteArray(); + return outMarshal.outData.toByteArray(); } @TruffleBoundary - static Object load(byte[] ary, int length) throws NumberFormatException, MarshalError { - Marshal inMarshal = new Marshal(ary, length); + static Object load(PythonContext context, byte[] ary, int length) throws NumberFormatException, MarshalError { + Marshal inMarshal = new Marshal(context, ary, length); Object result = inMarshal.readObject(); if (result == null) { throw new MarshalError(PythonBuiltinClassType.TypeError, ErrorMessages.BAD_MARSHAL_DATA_NULL); @@ -363,8 +390,8 @@ static Object load(byte[] ary, int length) throws NumberFormatException, Marshal } @TruffleBoundary - static Object loadFile(Object file) throws NumberFormatException, MarshalError { - Marshal inMarshal = new Marshal(file); + static Object loadFile(PythonContext context, Object file) throws NumberFormatException, MarshalError { + Marshal inMarshal = new Marshal(context, file); Object result = inMarshal.readObject(); if (result == null) { throw new MarshalError(PythonBuiltinClassType.TypeError, ErrorMessages.BAD_MARSHAL_DATA_NULL); @@ -387,7 +414,7 @@ static final class FileLikeInputStream extends InputStream { this.fileLike = fileLike; this.asSize = PyNumberAsSizeNode.getUncached(); this.singleByteStore = new ByteSequenceStorage(new byte[1]); - this.buffer = PythonObjectFactory.getUncached().createByteArray(singleByteStore); + this.buffer = PFactory.createByteArray(PythonLanguage.get(null), singleByteStore); } @Override @@ -418,11 +445,12 @@ public int read(byte[] b, int off, int len) { } } - private static final PythonObjectFactory factory = PythonObjectFactory.getUncached(); + private final PythonContext context; final HashMap refMap; final ArrayList refList; - final ByteArrayOutputStream out; - final InputStream in; + final ByteArrayOutputStream outData; + final DataOutput out; + final DataInput in; final int version; final PInt pyTrue; final PInt pyFalse; @@ -430,50 +458,88 @@ public int read(byte[] b, int off, int len) { final ByteArraySupport baSupport = ByteArraySupport.littleEndian(); byte[] buffer = new byte[Long.BYTES]; int depth = 0; + /* + * A DSL node needs access to its Source during deserialization, but we do not wish to + * actually encode it in the serialized representation. Instead, we supply a Source to the + * Marshal object and return it when the source is needed. + */ + Source source = null; - Marshal(int version, PInt pyTrue, PInt pyFalse) { + Marshal(PythonContext context, int version, PInt pyTrue, PInt pyFalse) { + this.context = context; this.version = version; this.pyTrue = pyTrue; this.pyFalse = pyFalse; - this.out = new ByteArrayOutputStream(); + this.outData = new ByteArrayOutputStream(); + this.out = new DataOutputStream(outData); this.refMap = new HashMap<>(); this.in = null; this.refList = null; } - Marshal(byte[] in, int length) { - this.in = new ByteArrayInputStream(in, 0, length); - this.refList = new ArrayList<>(); - this.version = -1; - this.pyTrue = null; - this.pyFalse = null; - this.out = null; - this.refMap = null; + Marshal(PythonContext context, int version, PInt pyTrue, PInt pyFalse, DataOutput out) { + this.context = context; + this.version = version; + this.pyTrue = pyTrue; + this.pyFalse = pyFalse; + this.outData = null; + this.out = out; + this.refMap = new HashMap<>(); + this.in = null; + this.refList = null; } - Marshal(Object in) { - this.in = new FileLikeInputStream(in); + Marshal(PythonContext context, byte[] in, int length) { + this(context, new DataInputStream(new ByteArrayInputStream(in, 0, length)), null); + } + + Marshal(PythonContext context, Object in) { + this(context, new DataInputStream(new FileLikeInputStream(in)), null); + } + + Marshal(PythonContext context, DataInput in, Source source) { + this.context = context; + this.in = in; + this.source = source; this.refList = new ArrayList<>(); this.version = -1; this.pyTrue = null; this.pyFalse = null; + this.outData = null; this.out = null; this.refMap = null; } + private PythonLanguage getLanguage() { + return context.getLanguage(); + } + private void writeByte(int v) { - out.write(v); + try { + out.write(v); + } catch (IOException e) { + // The underlying output streams we use should not throw IOExceptions. + throw CompilerDirectives.shouldNotReachHere(); + } } - private int readByte() { - int nextByte; + private void writeBytes(byte[] b, int off, int len) { try { - nextByte = in.read(); + out.write(b, off, len); } catch (IOException e) { + // The underlying output streams we use should not throw IOExceptions. throw CompilerDirectives.shouldNotReachHere(); } - if (nextByte < 0) { + } + + private int readByte() { + int nextByte; + try { + nextByte = in.readUnsignedByte(); + } catch (EOFException e) { throw new MarshalError(PythonBuiltinClassType.EOFError, ErrorMessages.BAD_MARSHAL_DATA_EOF); + } catch (IOException e) { + throw CompilerDirectives.shouldNotReachHere(); } return nextByte; } @@ -517,15 +583,13 @@ private byte[] readNBytes(int sz, byte[] output) { if (sz == 0) { return output; } - int read; try { - read = in.read(output, 0, sz); + in.readFully(output, 0, sz); + } catch (EOFException e) { + throw new MarshalError(PythonBuiltinClassType.EOFError, ErrorMessages.BAD_MARSHAL_DATA_EOF); } catch (IOException e) { throw CompilerDirectives.shouldNotReachHere(); } - if (read < sz) { - throw new MarshalError(PythonBuiltinClassType.EOFError, ErrorMessages.BAD_MARSHAL_DATA_EOF); - } return output; } @@ -536,13 +600,13 @@ private byte[] readBytes() { private void writeInt(int v) { for (int i = 0; i < Integer.SIZE; i += Byte.SIZE) { - out.write((v >> i) & 0xff); + writeByte((v >> i) & 0xff); } } private void writeShort(short v) { for (int i = 0; i < Short.SIZE; i += Byte.SIZE) { - out.write((v >> i) & 0xff); + writeByte((v >> i) & 0xff); } } @@ -556,7 +620,7 @@ private short readShort() { private void writeLong(long v) { for (int i = 0; i < Long.SIZE; i += Byte.SIZE) { - out.write((int) ((v >>> i) & 0xff)); + writeByte((int) ((v >>> i) & 0xff)); } } @@ -582,7 +646,7 @@ private void writeBigInteger(BigInteger v) { } for (int digit : digits) { for (int i = 0; i < Short.SIZE; i += Byte.SIZE) { - out.write((digit >> i) & 0xff); + writeByte((digit >> i) & 0xff); } } } @@ -677,7 +741,7 @@ private void writeObject(Object v) throws IOException { writeByte(TYPE_NOVALUE); } else if (IsSameTypeNode.executeUncached(v, PythonBuiltinClassType.StopIteration)) { writeByte(TYPE_STOPITER); - } else if (IsSameTypeNode.executeUncached(v, PythonBuiltinClassType.PEllipsis)) { + } else if (v == PEllipsis.INSTANCE) { writeByte(TYPE_ELLIPSIS); } else if (v == Boolean.TRUE || v == pyTrue) { writeByte(TYPE_TRUE); @@ -826,6 +890,9 @@ private void writeComplexObject(Object v, int flag) { writeByte(TYPE_ARRAY | flag); writeByte(ARRAY_TYPE_STRING); writeStringArray((TruffleString[]) v); + } else if (v instanceof PKeyword[]) { + assert v == PKeyword.EMPTY_KEYWORDS; + writeByte(TYPE_DSL_EMPTY_KEYWORDS); } else if (v instanceof Object[]) { writeByte(TYPE_ARRAY | flag); writeByte(ARRAY_TYPE_OBJECT); @@ -845,8 +912,16 @@ private void writeComplexObject(Object v, int flag) { } writeBytes(lnotab); } else if (v instanceof CodeUnit) { - writeByte(TYPE_GRAALPYTHON_CODE_UNIT | flag); - writeCodeUnit((CodeUnit) v); + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + writeByte(TYPE_GRAALPYTHON_DSL_CODE_UNIT | flag); + writeBytecodeDSLCodeUnit((BytecodeDSLCodeUnit) v); + } else { + writeByte(TYPE_GRAALPYTHON_CODE_UNIT | flag); + writeBytecodeCodeUnit((BytecodeCodeUnit) v); + } + } else if (v instanceof Source s) { + writeByte(TYPE_DSL_SOURCE | flag); + setSource(s); } else { PythonBufferAcquireLibrary acquireLib = PythonBufferAcquireLibrary.getFactory().getUncached(v); if (acquireLib.hasBuffer(v)) { @@ -967,7 +1042,7 @@ private Object readObject(int type, AddRefAndReturn addRef) throws NumberFormatE case TYPE_STOPITER: return PythonBuiltinClassType.StopIteration; case TYPE_ELLIPSIS: - return PythonBuiltinClassType.PEllipsis; + return PEllipsis.INSTANCE; case TYPE_FALSE: return false; case TYPE_TRUE: @@ -979,17 +1054,17 @@ private Object readObject(int type, AddRefAndReturn addRef) throws NumberFormatE case TYPE_BIG_INTEGER: return readBigInteger(); case TYPE_LONG: - return addRef.run(factory.createInt(readBigInteger())); + return addRef.run(PFactory.createInt(getLanguage(), readBigInteger())); case TYPE_FLOAT: return addRef.run(readDoubleString()); case TYPE_BINARY_FLOAT: return addRef.run(readDouble()); case TYPE_COMPLEX: - return addRef.run(factory.createComplex(readDoubleString(), readDoubleString())); + return addRef.run(PFactory.createComplex(getLanguage(), readDoubleString(), readDoubleString())); case TYPE_BINARY_COMPLEX: - return addRef.run(factory.createComplex(readDouble(), readDouble())); + return addRef.run(PFactory.createComplex(getLanguage(), readDouble(), readDouble())); case TYPE_STRING: - return addRef.run(factory.createBytes(readBytes())); + return addRef.run(PFactory.createBytes(getLanguage(), readBytes())); case TYPE_ASCII_INTERNED: return addRef.run(readAscii(readSize(), true)); case TYPE_ASCII: @@ -1005,24 +1080,24 @@ private Object readObject(int type, AddRefAndReturn addRef) throws NumberFormatE case TYPE_SMALL_TUPLE: int smallTupleSize = readByteSize(); Object[] smallTupleItems = new Object[smallTupleSize]; - Object smallTuple = addRef.run(factory.createTuple(smallTupleItems)); + Object smallTuple = addRef.run(PFactory.createTuple(getLanguage(), smallTupleItems)); readArray(smallTupleItems); return smallTuple; case TYPE_TUPLE: int tupleSize = readSize(); Object[] tupleItems = new Object[tupleSize]; - Object tuple = addRef.run(factory.createTuple(tupleItems)); + Object tuple = addRef.run(PFactory.createTuple(getLanguage(), tupleItems)); readArray(tupleItems); return tuple; case TYPE_LIST: int listSize = readSize(); Object[] listItems = new Object[listSize]; - Object list = addRef.run(factory.createList(listItems)); + Object list = addRef.run(PFactory.createList(getLanguage(), listItems)); readArray(listItems); return list; case TYPE_DICT: HashingStorage store = PDict.createNewStorage(0); - PDict dict = factory.createDict(store); + PDict dict = PFactory.createDict(getLanguage(), store); addRef.run(dict); while (true) { Object key = readObject(); @@ -1042,9 +1117,9 @@ private Object readObject(int type, AddRefAndReturn addRef) throws NumberFormatE HashingStorage setStore = EconomicMapStorage.create(setSz); PBaseSet set; if (type == TYPE_FROZENSET) { - set = factory.createFrozenSet(setStore); + set = PFactory.createFrozenSet(getLanguage(), setStore); } else { - set = factory.createSet(setStore); + set = PFactory.createSet(getLanguage(), setStore); } addRef.run(set); for (int i = 0; i < setSz; i++) { @@ -1059,10 +1134,15 @@ private Object readObject(int type, AddRefAndReturn addRef) throws NumberFormatE case TYPE_GRAALPYTHON_CODE: return addRef.run(readCode()); case TYPE_GRAALPYTHON_CODE_UNIT: - return addRef.run(readCodeUnit()); - case TYPE_ARRAY: { + return addRef.run(readBytecodeCodeUnit()); + case TYPE_GRAALPYTHON_DSL_CODE_UNIT: + return addRef.run(readBytecodeDSLCodeUnit()); + case TYPE_DSL_SOURCE: + return getSource(); + case TYPE_DSL_EMPTY_KEYWORDS: + return PKeyword.EMPTY_KEYWORDS; + case TYPE_ARRAY: return addRef.run(readJavaArray()); - } default: throw new MarshalError(ValueError, ErrorMessages.BAD_MARSHAL_DATA); } @@ -1082,7 +1162,7 @@ private void writeString(TruffleString v) { } InternalByteArray ba = v.switchEncodingUncached(encoding).getInternalByteArrayUncached(encoding); writeSize(ba.getLength()); - out.write(ba.getArray(), ba.getOffset(), ba.getLength()); + writeBytes(ba.getArray(), ba.getOffset(), ba.getLength()); } private TruffleString readString() { @@ -1215,6 +1295,24 @@ private Object[] readObjectArray() { return a; } + private void setSource(Source s) { + if (source == null) { + source = s; + } else if (source != s) { + throw CompilerDirectives.shouldNotReachHere("attempted to serialize with multiple Source objects"); + } + } + + private Source getSource() { + if (source != null) { + return source; + } else { + // This should never happen when deserializing a bytecode DSL code unit, but could + // happen if the user tries to deserialize arbitrary bytes. + throw new MarshalError(ValueError, ErrorMessages.BAD_MARSHAL_DATA); + } + } + private void writeSparseTable(int[][] table) { writeInt(table.length); for (int i = 0; i < table.length; i++) { @@ -1239,6 +1337,21 @@ private int[][] readSparseTable() { } private CodeUnit readCodeUnit() { + int codeUnitType = readByte(); + return switch (codeUnitType) { + case TYPE_GRAALPYTHON_CODE_UNIT -> readBytecodeCodeUnit(); + case TYPE_GRAALPYTHON_DSL_CODE_UNIT -> readBytecodeDSLCodeUnit(); + default -> throw CompilerDirectives.shouldNotReachHere(); + }; + } + + private BytecodeCodeUnit readBytecodeCodeUnit() { + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + throw new MarshalError(ValueError, + PythonUtils.tsLiteral( + "Attempted to deserialize a code object from the manual bytecode interpreter, but the DSL interpreter is enabled. Consider clearing or setting a different pycache folder.")); + } + int fileVersion = readByte(); if (fileVersion != Compiler.BYTECODE_VERSION) { throw new MarshalError(ValueError, ErrorMessages.BYTECODE_VERSION_MISMATCH, Compiler.BYTECODE_VERSION, fileVersion); @@ -1272,13 +1385,57 @@ private CodeUnit readCodeUnit() { byte[] variableShouldUnbox = readBytes(); int[][] generalizeInputsMap = readSparseTable(); int[][] generalizeVarsMap = readSparseTable(); - return new CodeUnit(name, qualname, argCount, kwOnlyArgCount, positionalOnlyArgCount, stacksize, code, srcOffsetTable, - flags, names, varnames, cellvars, freevars, cell2arg, constants, primitiveConstants, exceptionHandlerRanges, conditionProfileCount, - startLine, startColumn, endLine, endColumn, + return new BytecodeCodeUnit(name, qualname, argCount, kwOnlyArgCount, positionalOnlyArgCount, flags, names, varnames, + cellvars, freevars, cell2arg, constants, startLine, startColumn, endLine, endColumn, code, srcOffsetTable, + primitiveConstants, exceptionHandlerRanges, stacksize, conditionProfileCount, outputCanQuicken, variableShouldUnbox, generalizeInputsMap, generalizeVarsMap); } + private BytecodeDSLCodeUnit readBytecodeDSLCodeUnit() { + if (!PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + throw new MarshalError(ValueError, + PythonUtils.tsLiteral( + "Attempted to deserialize a code object from the Bytecode DSL interpreter, but the manual interpreter is enabled. Consider clearing or setting a different pycache folder.")); + } + + byte[] serialized = readBytes(); + TruffleString name = readString(); + TruffleString qualname = readString(); + int argCount = readInt(); + int kwOnlyArgCount = readInt(); + int positionalOnlyArgCount = readInt(); + int flags = readInt(); + TruffleString[] names = readStringArray(); + TruffleString[] varnames = readStringArray(); + TruffleString[] cellvars = readStringArray(); + TruffleString[] freevars = readStringArray(); + int[] cell2arg = readIntArray(); + if (cell2arg.length == 0) { + cell2arg = null; + } + Object[] constants = readObjectArray(); + int startLine = readInt(); + int startColumn = readInt(); + int endLine = readInt(); + int endColumn = readInt(); + int classcellIndex = readInt(); + int selfIndex = readInt(); + + return new BytecodeDSLCodeUnit(name, qualname, argCount, kwOnlyArgCount, positionalOnlyArgCount, flags, names, varnames, cellvars, freevars, cell2arg, constants, + startLine, startColumn, endLine, endColumn, classcellIndex, selfIndex, serialized, null); + } + private void writeCodeUnit(CodeUnit code) throws IOException { + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + writeByte(TYPE_GRAALPYTHON_DSL_CODE_UNIT); + writeBytecodeDSLCodeUnit((BytecodeDSLCodeUnit) code); + } else { + writeByte(TYPE_GRAALPYTHON_CODE_UNIT); + writeBytecodeCodeUnit((BytecodeCodeUnit) code); + } + } + + private void writeBytecodeCodeUnit(BytecodeCodeUnit code) throws IOException { writeByte(Compiler.BYTECODE_VERSION); writeString(code.name); writeString(code.qualname); @@ -1286,7 +1443,7 @@ private void writeCodeUnit(CodeUnit code) throws IOException { writeInt(code.kwOnlyArgCount); writeInt(code.positionalOnlyArgCount); writeInt(code.stacksize); - writeBytes(code.code); + writeBytes(code.getBytecodeForSerialization()); writeBytes(code.srcOffsetTable); writeInt(code.flags); writeStringArray(code.names); @@ -1312,6 +1469,34 @@ private void writeCodeUnit(CodeUnit code) throws IOException { writeSparseTable(code.generalizeVarsMap); } + @SuppressWarnings("unchecked") + private void writeBytecodeDSLCodeUnit(BytecodeDSLCodeUnit code) throws IOException { + byte[] serialized = code.getSerialized(context); + writeBytes(serialized); + writeString(code.name); + writeString(code.qualname); + writeInt(code.argCount); + writeInt(code.kwOnlyArgCount); + writeInt(code.positionalOnlyArgCount); + writeInt(code.flags); + writeStringArray(code.names); + writeStringArray(code.varnames); + writeStringArray(code.cellvars); + writeStringArray(code.freevars); + if (code.cell2arg != null) { + writeIntArray(code.cell2arg); + } else { + writeIntArray(PythonUtils.EMPTY_INT_ARRAY); + } + writeObjectArray(code.constants); + writeInt(code.startLine); + writeInt(code.startColumn); + writeInt(code.endLine); + writeInt(code.endColumn); + writeInt(code.classcellIndex); + writeInt(code.selfIndex); + } + private PCode readCode() { TruffleString fileName = readString(); int flags = readInt(); @@ -1319,14 +1504,13 @@ private PCode readCode() { int codeLen = readSize(); byte[] codeString = new byte[codeLen + Long.BYTES]; try { - in.read(codeString, 0, codeLen); + in.readFully(codeString, 0, codeLen); } catch (IOException e) { throw CompilerDirectives.shouldNotReachHere(); } // get a new ID every time we deserialize the same filename in the same context. We use // slow-path context lookup, since this code is likely dominated by the deserialization // time - PythonContext context = PythonContext.get(null); ByteBuffer.wrap(codeString).putLong(codeLen, context.getDeserializationId(fileName)); int firstLineNo = readInt(); byte[] lnoTab = readBytes(); @@ -1335,27 +1519,71 @@ private PCode readCode() { } @TruffleBoundary - public static byte[] serializeCodeUnit(CodeUnit code) { + public static byte[] serializeCodeUnit(Node node, PythonContext context, CodeUnit code) { try { - Marshal marshal = new Marshal(CURRENT_VERSION, null, null); + Marshal marshal = new Marshal(context, CURRENT_VERSION, null, null); marshal.writeCodeUnit(code); - return marshal.out.toByteArray(); + return marshal.outData.toByteArray(); } catch (IOException e) { throw CompilerDirectives.shouldNotReachHere(e); } catch (Marshal.MarshalError me) { - throw PRaiseNode.getUncached().raise(me.type, me.message, me.arguments); + throw PRaiseNode.raiseStatic(node, me.type, me.message, me.arguments); } } @TruffleBoundary - public static CodeUnit deserializeCodeUnit(byte[] bytes) { + public static CodeUnit deserializeCodeUnit(Node node, PythonContext context, byte[] bytes) { try { - Marshal marshal = new Marshal(bytes, bytes.length); + Marshal marshal = new Marshal(context, bytes, bytes.length); return marshal.readCodeUnit(); } catch (Marshal.MarshalError me) { - throw PRaiseNode.getUncached().raise(me.type, me.message, me.arguments); + throw PRaiseNode.raiseStatic(node, me.type, me.message, me.arguments); } catch (NumberFormatException e) { - throw PRaiseNode.getUncached().raise(ValueError, ErrorMessages.BAD_MARSHAL_DATA_S, e.getMessage()); + throw PRaiseNode.raiseStatic(node, ValueError, ErrorMessages.BAD_MARSHAL_DATA_S, e.getMessage()); + } + } + + public static BytecodeRootNodes deserializeBytecodeNodes(PythonContext context, Source source, byte[] serialized) { + try { + Supplier supplier = () -> SerializationUtils.createDataInput(ByteBuffer.wrap(serialized)); + return PBytecodeDSLRootNodeGen.deserialize(context.getLanguage(), BytecodeConfig.WITH_SOURCE, supplier, new MarshalModuleBuiltins.PBytecodeDSLDeserializer(context, source)); + } catch (IOException e) { + throw CompilerDirectives.shouldNotReachHere("Deserialization error."); + } + } + + public static class PBytecodeDSLSerializer implements BytecodeSerializer { + private final PythonContext pythonContext; + + public PBytecodeDSLSerializer(PythonContext context) { + this.pythonContext = context; + } + + public void serialize(SerializerContext context, DataOutput buffer, Object object) throws IOException { + /* + * NB: Since the deserializer uses a fresh Marshal instance for each object (see below) + * we must also do the same here. Otherwise, the encoding may be different (e.g., a + * reference for an already-emitted object). + */ + new Marshal(pythonContext, CURRENT_VERSION, pythonContext.getTrue(), pythonContext.getFalse(), buffer).writeObject(object); + } + } + + public static class PBytecodeDSLDeserializer implements BytecodeDeserializer { + private final PythonContext pythonContext; + final Source source; + + public PBytecodeDSLDeserializer(PythonContext context, Source source) { + this.pythonContext = context; + this.source = source; + } + + public Object deserialize(DeserializerContext context, DataInput buffer) throws IOException { + /* + * NB: Since a DSL node may reparse multiple times, we cannot reuse a common Marshal + * object across calls (each call may take a different buffer). + */ + return new Marshal(pythonContext, buffer, source).readObject(); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/MathModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/MathModuleBuiltins.java index 9266b8f0cd..1796bd1994 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/MathModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/MathModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -37,6 +37,7 @@ import java.util.Arrays; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; @@ -49,12 +50,14 @@ import com.oracle.graal.python.builtins.objects.ints.IntBuiltins; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.lib.IteratorExhausted; import com.oracle.graal.python.lib.PyFloatAsDoubleNode; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyLongAsLongAndOverflowNode; import com.oracle.graal.python.lib.PyLongFromDoubleNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyNumberIndexNode; +import com.oracle.graal.python.lib.PyNumberMultiplyNode; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; @@ -64,9 +67,6 @@ import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodNode; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; -import com.oracle.graal.python.nodes.expression.BinaryArithmetic; -import com.oracle.graal.python.nodes.expression.BinaryComparisonNode; -import com.oracle.graal.python.nodes.expression.BinaryOpNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; @@ -76,13 +76,12 @@ import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; +import com.oracle.graal.python.nodes.truffle.PythonIntegerAndFloatTypes; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; import com.oracle.graal.python.nodes.util.CastToJavaLongLossyNode; import com.oracle.graal.python.nodes.util.NarrowBigIntegerNode; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.OverflowException; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; @@ -124,63 +123,63 @@ public MathModuleBuiltins() { addBuiltinConstant("nan", Double.NaN); } - static void checkMathRangeError(boolean con, Node inliningTarget, PRaiseNode.Lazy raiseNode) { + static void checkMathRangeError(boolean con, Node inliningTarget, PRaiseNode raiseNode) { if (con) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.MATH_RANGE_ERROR); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.MATH_RANGE_ERROR); } } - static void checkMathDomainError(boolean con, Node inliningTarget, PRaiseNode.Lazy raiseNode) { + static void checkMathDomainError(boolean con, Node inliningTarget, PRaiseNode raiseNode) { if (con) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MATH_DOMAIN_ERROR); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MATH_DOMAIN_ERROR); } } static void checkMathDomainErrorUncached(boolean con, Node raisingNode) { if (con) { - throw PRaiseNode.raiseUncached(raisingNode, ValueError, ErrorMessages.MATH_DOMAIN_ERROR); + throw PRaiseNode.raiseStatic(raisingNode, ValueError, ErrorMessages.MATH_DOMAIN_ERROR); } } @GenerateInline @GenerateCached(false) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @ImportStatic(MathGuards.class) public abstract static class MathUnaryHelperNode extends Node { @FunctionalInterface interface Op { - double compute(Node inliningTarget, double arg, PRaiseNode.Lazy raiseNode); + double compute(Node inliningTarget, double arg, PRaiseNode raiseNode); } abstract double execute(VirtualFrame frame, Node inliningTarget, Object value, Op op); @Specialization static double doL(Node inliningTarget, long value, Op op, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { return computeAndCheckDomain(inliningTarget, value, op, raiseNode); } @Specialization static double doD(Node inliningTarget, double value, Op op, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { return computeAndCheckDomain(inliningTarget, value, op, raiseNode); } @Specialization static double doPI(Node inliningTarget, PInt value, Op op, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { return computeAndCheckDomain(inliningTarget, value.doubleValueWithOverflow(inliningTarget), op, raiseNode); } @Specialization(guards = "!isNumber(value)") static double doGeneral(VirtualFrame frame, Node inliningTarget, Object value, Op op, @Cached PyFloatAsDoubleNode asDoubleNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { return computeAndCheckDomain(inliningTarget, asDoubleNode.execute(frame, inliningTarget, value), op, raiseNode); } - private static double computeAndCheckDomain(Node inliningTarget, double arg, Op op, PRaiseNode.Lazy raiseNode) { + private static double computeAndCheckDomain(Node inliningTarget, double arg, Op op, PRaiseNode raiseNode) { double res = op.compute(inliningTarget, arg, raiseNode); checkMathDomainError(Double.isNaN(res) && !Double.isNaN(arg), inliningTarget, raiseNode); return res; @@ -237,7 +236,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, SqrtNode::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { checkMathDomainError(value < 0, inliningTarget, raiseNode); return Math.sqrt(value); } @@ -254,7 +253,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, ExpNode::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { double result = Math.exp(value); checkMathRangeError(Double.isFinite(value) && Double.isInfinite(result), inliningTarget, raiseNode); return result; @@ -272,7 +271,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, Expm1Node::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { double result = Math.expm1(value); checkMathRangeError(Double.isFinite(value) && Double.isInfinite(result), inliningTarget, raiseNode); return result; @@ -351,8 +350,8 @@ private static BigInteger factorialPart(long start, long n) { @Specialization(guards = {"value < 0"}) static long factorialNegativeInt(@SuppressWarnings("unused") int value, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.FACTORIAL_NOT_DEFINED_FOR_NEGATIVE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.FACTORIAL_NOT_DEFINED_FOR_NEGATIVE); } @Specialization(guards = {"0 <= value", "value < SMALL_FACTORIALS.length"}) @@ -362,14 +361,14 @@ static long factorialSmallInt(int value) { @Specialization(guards = {"value >= SMALL_FACTORIALS.length"}) static PInt factorialInt(int value, - @Shared @Cached PythonObjectFactory factory) { - return factory.createInt(factorialPart(1, value)); + @Bind PythonLanguage language) { + return PFactory.createInt(language, factorialPart(1, value)); } @Specialization(guards = {"value < 0"}) static long factorialNegativeLong(@SuppressWarnings("unused") long value, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.FACTORIAL_NOT_DEFINED_FOR_NEGATIVE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.FACTORIAL_NOT_DEFINED_FOR_NEGATIVE); } @Specialization(guards = {"0 <= value", "value < SMALL_FACTORIALS.length"}) @@ -379,8 +378,8 @@ static long factorialSmallLong(long value) { @Specialization(guards = {"value >= SMALL_FACTORIALS.length"}) static PInt factorialLong(long value, - @Shared @Cached PythonObjectFactory factory) { - return factory.createInt(factorialPart(1, value)); + @Bind PythonLanguage language) { + return PFactory.createInt(language, factorialPart(1, value)); } @Fallback @@ -389,14 +388,14 @@ static Object factorialObject(VirtualFrame frame, Object value, @Cached PyLongAsLongAndOverflowNode convert, @Cached PyNumberAsSizeNode asSizeNode, @Cached FactorialNode recursiveNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { return recursiveNode.execute(frame, convert.execute(frame, inliningTarget, value)); } catch (OverflowException e) { if (asSizeNode.executeLossy(frame, inliningTarget, value) >= 0) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.FACTORIAL_ARGUMENT_SHOULD_NOT_EXCEED_D, Long.MAX_VALUE); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.FACTORIAL_ARGUMENT_SHOULD_NOT_EXCEED_D, Long.MAX_VALUE); } else { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.FACTORIAL_NOT_DEFINED_FOR_NEGATIVE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.FACTORIAL_NOT_DEFINED_FOR_NEGATIVE); } } } @@ -404,7 +403,7 @@ static Object factorialObject(VirtualFrame frame, Object value, } @Builtin(name = "comb", minNumOfPositionalArgs = 2) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @GenerateNodeFactory @ImportStatic(MathGuards.class) public abstract static class CombNode extends PythonBinaryBuiltinNode { @@ -412,10 +411,10 @@ public abstract static class CombNode extends PythonBinaryBuiltinNode { @TruffleBoundary private BigInteger calculateComb(BigInteger n, BigInteger k) { if (n.signum() < 0) { - throw PRaiseNode.raiseUncached(this, ValueError, ErrorMessages.MUST_BE_NON_NEGATIVE_INTEGER, "n"); + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.MUST_BE_NON_NEGATIVE_INTEGER, "n"); } if (k.signum() < 0) { - throw PRaiseNode.raiseUncached(this, ValueError, ErrorMessages.MUST_BE_NON_NEGATIVE_INTEGER, "k"); + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.MUST_BE_NON_NEGATIVE_INTEGER, "k"); } BigInteger factors = k.min(n.subtract(k)); @@ -439,26 +438,26 @@ private BigInteger calculateComb(BigInteger n, BigInteger k) { @Specialization PInt comb(long n, long k, - @Shared @Cached PythonObjectFactory factory) { - return factory.createInt(calculateComb(PInt.longToBigInteger(n), PInt.longToBigInteger(k))); + @Bind PythonLanguage language) { + return PFactory.createInt(language, calculateComb(PInt.longToBigInteger(n), PInt.longToBigInteger(k))); } @Specialization PInt comb(long n, PInt k, - @Shared @Cached PythonObjectFactory factory) { - return factory.createInt(calculateComb(PInt.longToBigInteger(n), k.getValue())); + @Bind PythonLanguage language) { + return PFactory.createInt(language, calculateComb(PInt.longToBigInteger(n), k.getValue())); } @Specialization PInt comb(PInt n, long k, - @Shared @Cached PythonObjectFactory factory) { - return factory.createInt(calculateComb(n.getValue(), PInt.longToBigInteger(k))); + @Bind PythonLanguage language) { + return PFactory.createInt(language, calculateComb(n.getValue(), PInt.longToBigInteger(k))); } @Specialization PInt comb(PInt n, PInt k, - @Shared @Cached PythonObjectFactory factory) { - return factory.createInt(calculateComb(n.getValue(), k.getValue())); + @Bind PythonLanguage language) { + return PFactory.createInt(language, calculateComb(n.getValue(), k.getValue())); } @Specialization @@ -474,7 +473,7 @@ static Object comb(VirtualFrame frame, Object n, Object k, } @Builtin(name = "perm", minNumOfPositionalArgs = 1, parameterNames = {"n", "k"}) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @GenerateNodeFactory @ImportStatic(MathGuards.class) public abstract static class PermNode extends PythonBinaryBuiltinNode { @@ -482,10 +481,10 @@ public abstract static class PermNode extends PythonBinaryBuiltinNode { @TruffleBoundary private BigInteger calculatePerm(BigInteger n, BigInteger k) { if (n.signum() < 0) { - throw PRaiseNode.raiseUncached(this, ValueError, ErrorMessages.MUST_BE_NON_NEGATIVE_INTEGER, "n"); + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.MUST_BE_NON_NEGATIVE_INTEGER, "n"); } if (k.signum() < 0) { - throw PRaiseNode.raiseUncached(this, ValueError, ErrorMessages.MUST_BE_NON_NEGATIVE_INTEGER, "k"); + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.MUST_BE_NON_NEGATIVE_INTEGER, "k"); } if (n.compareTo(k) < 0) { return BigInteger.ZERO; @@ -510,26 +509,26 @@ private BigInteger calculatePerm(BigInteger n, BigInteger k) { @Specialization PInt perm(long n, long k, - @Shared @Cached PythonObjectFactory factory) { - return factory.createInt(calculatePerm(PInt.longToBigInteger(n), PInt.longToBigInteger(k))); + @Bind PythonLanguage language) { + return PFactory.createInt(language, calculatePerm(PInt.longToBigInteger(n), PInt.longToBigInteger(k))); } @Specialization PInt perm(long n, PInt k, - @Shared @Cached PythonObjectFactory factory) { - return factory.createInt(calculatePerm(PInt.longToBigInteger(n), k.getValue())); + @Bind PythonLanguage language) { + return PFactory.createInt(language, calculatePerm(PInt.longToBigInteger(n), k.getValue())); } @Specialization PInt perm(PInt n, long k, - @Shared @Cached PythonObjectFactory factory) { - return factory.createInt(calculatePerm(n.getValue(), PInt.longToBigInteger(k))); + @Bind PythonLanguage language) { + return PFactory.createInt(language, calculatePerm(n.getValue(), PInt.longToBigInteger(k))); } @Specialization PInt perm(PInt n, PInt k, - @Shared @Cached PythonObjectFactory factory) { - return factory.createInt(calculatePerm(n.getValue(), k.getValue())); + @Bind PythonLanguage language) { + return PFactory.createInt(language, calculatePerm(n.getValue(), k.getValue())); } @Specialization @@ -589,15 +588,15 @@ static double fmodDD(double left, double right, @Bind("this") Node inliningTarget, @Cached InlinedConditionProfile infProfile, @Cached InlinedConditionProfile zeroProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { raiseMathDomainError(inliningTarget, Double.isInfinite(left), infProfile, raiseNode); raiseMathDomainError(inliningTarget, right == 0, zeroProfile, raiseNode); return left % right; } - static void raiseMathDomainError(Node inliningTarget, boolean con, InlinedConditionProfile profile, PRaiseNode.Lazy raiseNode) { + static void raiseMathDomainError(Node inliningTarget, boolean con, InlinedConditionProfile profile, PRaiseNode raiseNode) { if (profile.profile(inliningTarget, con)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MATH_DOMAIN_ERROR); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MATH_DOMAIN_ERROR); } } @@ -616,10 +615,10 @@ public abstract static class RemainderNode extends PythonBinaryClinicBuiltinNode @Specialization static double remainderDD(double x, double y, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (Double.isFinite(x) && Double.isFinite(y)) { if (y == 0.0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MATH_DOMAIN_ERROR); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MATH_DOMAIN_ERROR); } double absx = Math.abs(x); double absy = Math.abs(y); @@ -642,7 +641,7 @@ static double remainderDD(double x, double y, return y; } if (Double.isInfinite(x)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MATH_DOMAIN_ERROR); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MATH_DOMAIN_ERROR); } return x; } @@ -701,12 +700,12 @@ public static double[] frexp(double value) { @Specialization static PTuple frexpD(double value, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { Object[] content = new Object[2]; double[] primContent = frexp(value); content[0] = primContent[0]; content[1] = (int) primContent[1]; - return factory.createTuple(content); + return PFactory.createTuple(language, content); } @Override @@ -716,7 +715,7 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Builtin(name = "isnan", minNumOfPositionalArgs = 1) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @ImportStatic(MathGuards.class) @GenerateNodeFactory public abstract static class IsNanNode extends PythonUnaryBuiltinNode { @@ -753,11 +752,11 @@ public abstract static class IsCloseNode extends PythonClinicBuiltinNode { @Specialization static boolean isCloseDouble(double a, double b, double rel_tol, double abs_tol, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { double diff; if (rel_tol < 0.0 || abs_tol < 0.0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.TOLERANCE_MUST_NON_NEGATIVE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.TOLERANCE_MUST_NON_NEGATIVE); } if (a == b) { @@ -782,7 +781,7 @@ protected ArgumentClinicProvider getArgumentClinic() { @Builtin(name = "ldexp", minNumOfPositionalArgs = 2, numOfPositionalOnlyArgs = 2, parameterNames = {"x", "i"}) @ArgumentClinic(name = "x", conversion = ArgumentClinic.ClinicConversion.Double) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @GenerateNodeFactory public abstract static class LdexpNode extends PythonBinaryClinicBuiltinNode { @@ -796,9 +795,9 @@ private static int makeInt(long x) { return (int) result; } - private static double exceptInfinity(Node inliningTarget, double result, double arg, PRaiseNode.Lazy raiseNode) { + private static double exceptInfinity(Node inliningTarget, double result, double arg, PRaiseNode raiseNode) { if (Double.isInfinite(result) && !Double.isInfinite(arg)) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.MATH_RANGE_ERROR); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.MATH_RANGE_ERROR); } else { return result; } @@ -807,7 +806,7 @@ private static double exceptInfinity(Node inliningTarget, double result, double @Specialization static double ldexp(double mantissa, long exp, @Bind("this") Node inliningTarget, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { return exceptInfinity(inliningTarget, Math.scalb(mantissa, makeInt(exp)), mantissa, raiseNode); } @@ -818,12 +817,12 @@ static double ldexp(VirtualFrame frame, double mantissa, Object exp, @Cached IsSubtypeNode isSubtypeNode, @Cached PyNumberIndexNode indexNode, @Cached CastToJavaLongLossyNode cast, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (isSubtypeNode.execute(getClassNode.execute(inliningTarget, exp), PythonBuiltinClassType.PInt)) { long longExp = cast.execute(inliningTarget, indexNode.execute(frame, inliningTarget, exp)); return ldexp(mantissa, longExp, inliningTarget, raiseNode); } else { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.EXPECTED_INT_MESSAGE); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.EXPECTED_INT_MESSAGE); } } @@ -839,17 +838,17 @@ protected ArgumentClinicProvider getArgumentClinic() { public abstract static class ModfNode extends PythonUnaryClinicBuiltinNode { @Specialization static PTuple modfD(double value, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { if (!Double.isFinite(value)) { if (Double.isInfinite(value)) { - return factory.createTuple(new Object[]{Math.copySign(0., value), value}); + return PFactory.createTuple(language, new Object[]{Math.copySign(0., value), value}); } else if (Double.isNaN(value)) { - return factory.createTuple(new Object[]{value, value}); + return PFactory.createTuple(language, new Object[]{value, value}); } } double fraction = value % 1; double integral = value - fraction; - return factory.createTuple(new Object[]{fraction, integral}); + return PFactory.createTuple(language, new Object[]{fraction, integral}); } @Override @@ -866,82 +865,78 @@ public abstract static class FsumNode extends PythonUnaryBuiltinNode { static double doIt(VirtualFrame frame, Object iterable, @Bind("this") Node inliningTarget, @Cached PyObjectGetIter getIter, - @Cached("create(Next)") LookupAndCallUnaryNode callNextNode, + @Cached PyIterNextNode nextNode, @Cached PyFloatAsDoubleNode asDoubleNode, - @Cached IsBuiltinObjectProfile stopProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached InlinedLoopConditionProfile loopProfile, + @Cached PRaiseNode raiseNode) { + /* + * This implementation is taken from CPython. The performance is not good. Should be + * faster. It can be easily replace with much simpler code based on BigDecimal: + * + * BigDecimal result = BigDecimal.ZERO; + * + * in cycle just: result = result.add(BigDecimal.valueof(x); ... The current + * implementation is little bit faster. The testFSum in test_math.py takes in different + * implementations: CPython ~0.6s CurrentImpl: ~14.3s Using BigDecimal: ~15.1 + */ Object iterator = getIter.execute(frame, inliningTarget, iterable); - return fsum(frame, iterator, callNextNode, asDoubleNode, inliningTarget, stopProfile, raiseNode); - } - - /* - * This implementation is taken from CPython. The performance is not good. Should be faster. - * It can be easily replace with much simpler code based on BigDecimal: - * - * BigDecimal result = BigDecimal.ZERO; - * - * in cycle just: result = result.add(BigDecimal.valueof(x); ... The current implementation - * is little bit faster. The testFSum in test_math.py takes in different implementations: - * CPython ~0.6s CurrentImpl: ~14.3s Using BigDecimal: ~15.1 - */ - private static double fsum(VirtualFrame frame, Object iterator, LookupAndCallUnaryNode next, - PyFloatAsDoubleNode asDoubleNode, Node inliningTarget, IsBuiltinObjectProfile stopProfile, PRaiseNode.Lazy raiseNode) { double x, y, t, hi, lo = 0, yr, inf_sum = 0, special_sum = 0, sum; double xsave; int i, j, n = 0, arayLength = 32; double[] p = new double[arayLength]; - while (true) { + boolean exhausted = false; + while (loopProfile.profile(inliningTarget, !exhausted)) { try { - x = asDoubleNode.execute(frame, inliningTarget, next.executeObject(frame, iterator)); - } catch (PException e) { - e.expectStopIteration(inliningTarget, stopProfile); - break; - } - xsave = x; - for (i = j = 0; j < n; j++) { /* for y in partials */ - y = p[j]; - if (Math.abs(x) < Math.abs(y)) { - t = x; - x = y; - y = t; - } - hi = x + y; - yr = hi - x; - lo = y - yr; - if (lo != 0.0) { - p[i++] = lo; + Object next = nextNode.execute(frame, inliningTarget, iterator); + x = asDoubleNode.execute(frame, inliningTarget, next); + xsave = x; + for (i = j = 0; j < n; j++) { /* for y in partials */ + y = p[j]; + if (Math.abs(x) < Math.abs(y)) { + t = x; + x = y; + y = t; + } + hi = x + y; + yr = hi - x; + lo = y - yr; + if (lo != 0.0) { + p[i++] = lo; + } + x = hi; } - x = hi; - } - n = i; - if (x != 0.0) { - if (!Double.isFinite(x)) { - /* - * a nonfinite x could arise either as a result of intermediate overflow, or - * as a result of a nan or inf in the summands - */ - if (Double.isFinite(xsave)) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.INTERMEDIATE_OVERFLOW_IN, "fsum"); - } - if (Double.isInfinite(xsave)) { - inf_sum += xsave; + n = i; + if (x != 0.0) { + if (!Double.isFinite(x)) { + /* + * a nonfinite x could arise either as a result of intermediate + * overflow, or as a result of a nan or inf in the summands + */ + if (Double.isFinite(xsave)) { + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.INTERMEDIATE_OVERFLOW_IN, "fsum"); + } + if (Double.isInfinite(xsave)) { + inf_sum += xsave; + } + special_sum += xsave; + /* reset partials */ + n = 0; + } else if (n >= arayLength) { + arayLength += arayLength; + p = Arrays.copyOf(p, arayLength); + } else { + p[n++] = x; } - special_sum += xsave; - /* reset partials */ - n = 0; - } else if (n >= arayLength) { - arayLength += arayLength; - p = Arrays.copyOf(p, arayLength); - } else { - p[n++] = x; } + } catch (IteratorExhausted e) { + exhausted = true; } } if (special_sum != 0.0) { if (Double.isNaN(inf_sum)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.NEG_INF_PLUS_INF_IN); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NEG_INF_PLUS_INF_IN); } else { sum = special_sum; return sum; @@ -994,11 +989,6 @@ private static int compareAsBigDecimal(double y, double yr) { @GenerateNodeFactory public abstract static class GcdNode extends PythonVarargsBuiltinNode { - @Override - public Object varArgExecute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported { - return execute(frame, self, arguments, keywords); - } - @Specialization(guards = {"args.length > 1", "keywords.length == 0"}) public static Object gcd(VirtualFrame frame, @SuppressWarnings("unused") Object self, Object[] args, @SuppressWarnings("unused") PKeyword[] keywords, @Cached Gcd2Node gdcNode, @@ -1028,11 +1018,11 @@ public static int gcdEmpty(Object self, Object[] args, PKeyword[] keywords) { @Specialization(guards = "keywords.length != 0") @SuppressWarnings("unused") public int gcdKeywords(Object self, Object[] args, PKeyword[] keywords) { - throw raise(PythonBuiltinClassType.TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "gcd()"); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "gcd()"); } } - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @ImportStatic(MathGuards.class) public abstract static class Gcd2Node extends Node { @@ -1058,14 +1048,14 @@ static long gcd(long x, long y) { @Specialization static PInt gcd(long x, PInt y, - @Shared("factory") @Cached PythonObjectFactory factory) { - return factory.createInt(op(PInt.longToBigInteger(x), y.getValue())); + @Bind PythonLanguage language) { + return PFactory.createInt(language, op(PInt.longToBigInteger(x), y.getValue())); } @Specialization static PInt gcd(PInt x, long y, - @Shared("factory") @Cached PythonObjectFactory factory) { - return factory.createInt(op(x.getValue(), PInt.longToBigInteger(y))); + @Bind PythonLanguage language) { + return PFactory.createInt(language, op(x.getValue(), PInt.longToBigInteger(y))); } @TruffleBoundary @@ -1075,38 +1065,38 @@ private static BigInteger op(BigInteger x, BigInteger y) { @Specialization PInt gcd(PInt x, PInt y, - @Shared("factory") @Cached PythonObjectFactory factory) { - return factory.createInt(op(x.getValue(), y.getValue())); + @Bind PythonLanguage language) { + return PFactory.createInt(language, op(x.getValue(), y.getValue())); } @Specialization static int gcd(@SuppressWarnings("unused") double x, @SuppressWarnings("unused") double y, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, "float"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, "float"); } @Specialization static int gcd(@SuppressWarnings("unused") long x, @SuppressWarnings("unused") double y, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, "float"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, "float"); } @Specialization static int gcd(@SuppressWarnings("unused") double x, @SuppressWarnings("unused") long y, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, "float"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, "float"); } @Specialization static int gcd(@SuppressWarnings("unused") double x, @SuppressWarnings("unused") PInt y, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, "float"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, "float"); } @Specialization(guards = "!isRecursive") static int gcd(@SuppressWarnings("unused") PInt x, @SuppressWarnings("unused") double y, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, "float"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, "float"); } @Specialization(guards = {"!isRecursive", "!isNumber(x) || !isNumber(y)"}) @@ -1122,7 +1112,7 @@ static Object gcd(VirtualFrame frame, Object x, Object y, @Specialization Object gcdNative(@SuppressWarnings("unused") PythonAbstractNativeObject a, @SuppressWarnings("unused") Object b) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(this, SystemError, ErrorMessages.GCD_FOR_NATIVE_NOT_SUPPORTED); + throw PRaiseNode.raiseStatic(this, SystemError, ErrorMessages.GCD_FOR_NATIVE_NOT_SUPPORTED); } @NeverDefault @@ -1138,26 +1128,22 @@ public static Gcd2Node create(boolean isRecursive) { @Builtin(name = "lcm", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, declaresExplicitSelf = true) @GenerateNodeFactory public abstract static class LcmNode extends PythonVarargsBuiltinNode { - @Override - public Object varArgExecute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported { - return execute(frame, self, arguments, keywords); - } @Specialization(guards = {"args.length > 1", "keywords.length == 0"}) - public static Object gcd(VirtualFrame frame, @SuppressWarnings("unused") Object self, Object[] args, @SuppressWarnings("unused") PKeyword[] keywords, + static Object gcd(VirtualFrame frame, @SuppressWarnings("unused") Object self, Object[] args, @SuppressWarnings("unused") PKeyword[] keywords, @Bind("this") Node inliningTarget, @Cached LoopConditionProfile profile, + @Cached IsZeroNode isZeroNode, @Shared @Cached PyNumberIndexNode indexNode, @Cached Gcd2Node gcdNode, @Cached IntBuiltins.FloorDivNode floorDivNode, @Cached IntBuiltins.MulNode mulNode, - @Cached BinaryComparisonNode.EqNode eqNode, @Shared @Cached BuiltinFunctions.AbsNode absNode) { Object a = indexNode.execute(frame, inliningTarget, args[0]); profile.profileCounted(args.length); for (int i = 1; profile.inject(i < args.length); i++) { Object b = indexNode.execute(frame, inliningTarget, args[i]); - if ((boolean) eqNode.executeObject(frame, a, 0)) { + if (isZeroNode.execute(inliningTarget, a)) { continue; } Object g = gcdNode.execute(frame, a, b); @@ -1185,14 +1171,47 @@ public static int gcdEmpty(Object self, Object[] args, PKeyword[] keywords) { @Specialization(guards = "keywords.length != 0") @SuppressWarnings("unused") public int gcdKeywords(Object self, Object[] args, PKeyword[] keywords) { - throw raise(PythonBuiltinClassType.TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "gcd()"); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "gcd()"); + } + + // Fast-path from CPython uses identity comparison to 0 as best effort check + @TypeSystemReference(PythonIntegerTypes.class) + @GenerateInline + @GenerateCached(false) + abstract static class IsZeroNode extends Node { + abstract boolean execute(Node inliningTarget, Object value); + + @Specialization(guards = "a == 0") + static boolean isLongZero(long a) { + return true; + } + + @Specialization(guards = "a != 0") + static boolean isLongNonZero(long a) { + return false; + } + + @Specialization(guards = "i.isZero()") + static boolean isPIntZero(PInt i) { + return true; + } + + @Specialization(guards = "!i.isZero()") + static boolean isPIntNonZero(PInt i) { + return false; + } + + @Fallback + static boolean others(Object o) { + return false; + } } } @Builtin(name = "nextafter", minNumOfPositionalArgs = 2, parameterNames = {"start", "direction"}) @ArgumentClinic(name = "start", conversion = ArgumentClinic.ClinicConversion.Double) @ArgumentClinic(name = "direction", conversion = ArgumentClinic.ClinicConversion.Double) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @GenerateNodeFactory @ImportStatic(MathGuards.class) public abstract static class NextAfterNode extends PythonBinaryClinicBuiltinNode { @@ -1210,7 +1229,7 @@ static double nextAfter(double start, double direction) { @Builtin(name = "ulp", minNumOfPositionalArgs = 1, parameterNames = {"x"}) @ArgumentClinic(name = "x", conversion = ArgumentClinic.ClinicConversion.Double) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @GenerateNodeFactory @ImportStatic(MathGuards.class) public abstract static class UlpNode extends PythonUnaryClinicBuiltinNode { @@ -1249,7 +1268,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, AcosNode::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { checkMathDomainError(Double.isInfinite(value) || -1 > value || value > 1, inliningTarget, raiseNode); return Math.acos(value); } @@ -1283,7 +1302,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, AcoshNode::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { checkMathDomainError(value < 1, inliningTarget, raiseNode); return MathUtils.acosh(value); } @@ -1300,7 +1319,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, AsinNode::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { checkMathDomainError(value < -1 || value > 1, inliningTarget, raiseNode); return Math.asin(value); } @@ -1317,7 +1336,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, CosNode::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { return Math.cos(value); } } @@ -1333,7 +1352,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, CoshNode::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { double result = Math.cosh(value); checkMathRangeError(Double.isInfinite(result) && Double.isFinite(value), inliningTarget, raiseNode); return result; @@ -1351,7 +1370,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, SinNode::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { return Math.sin(value); } } @@ -1367,7 +1386,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, SinhNode::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { double result = Math.sinh(value); checkMathRangeError(Double.isInfinite(result) && Double.isFinite(value), inliningTarget, raiseNode); return result; @@ -1385,7 +1404,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, TanNode::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { return Math.tan(value); } } @@ -1401,7 +1420,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, TanhNode::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { return Math.tanh(value); } } @@ -1417,7 +1436,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, AtanNode::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { return Math.atan(value); } } @@ -1433,7 +1452,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, AtanhNode::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { double abs = Math.abs(value); checkMathDomainError(abs >= 1.0, inliningTarget, raiseNode); return MathUtils.atanh(value); @@ -1441,7 +1460,7 @@ private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy } @Builtin(name = "asinh", minNumOfPositionalArgs = 1, doc = "Return the inverse hyperbolic sine of x.") - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @ImportStatic(MathGuards.class) @GenerateNodeFactory public abstract static class AsinhNode extends PythonUnaryBuiltinNode { @@ -1453,7 +1472,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, AsinhNode::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { return MathUtils.asinh(value); } @@ -1463,7 +1482,7 @@ public static AsinhNode create() { } @Builtin(name = "isfinite", minNumOfPositionalArgs = 1) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @ImportStatic(MathGuards.class) @GenerateNodeFactory public abstract static class IsFiniteNode extends PythonUnaryBuiltinNode { @@ -1492,7 +1511,7 @@ public static boolean isinf(VirtualFrame frame, Object value, } @Builtin(name = "isinf", minNumOfPositionalArgs = 1) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @ImportStatic(MathGuards.class) @GenerateNodeFactory public abstract static class IsInfNode extends PythonUnaryBuiltinNode { @@ -1521,7 +1540,7 @@ public static boolean isinf(VirtualFrame frame, Object value, } @Builtin(name = "log", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @ImportStatic(MathGuards.class) @GenerateNodeFactory @SuppressWarnings("truffle-static-method") @@ -1548,18 +1567,18 @@ protected static double logBigInteger(BigInteger val) { return blex > 0 ? res + blex * LOG2 : res; } - private static double countBase(double base, Node inliningTarget, InlinedConditionProfile divByZero, PRaiseNode.Lazy raiseNode) { + private static double countBase(double base, Node inliningTarget, InlinedConditionProfile divByZero, PRaiseNode raiseNode) { double logBase = Math.log(base); if (divByZero.profile(inliningTarget, logBase == 0)) { - throw raiseNode.get(inliningTarget).raise(ZeroDivisionError, ErrorMessages.S_DIVISION_BY_ZERO, "float"); + throw raiseNode.raise(inliningTarget, ZeroDivisionError, ErrorMessages.S_DIVISION_BY_ZERO, "float"); } return logBase; } - private static double countBase(BigInteger base, Node inliningTarget, InlinedConditionProfile divByZero, PRaiseNode.Lazy raiseNode) { + private static double countBase(BigInteger base, Node inliningTarget, InlinedConditionProfile divByZero, PRaiseNode raiseNode) { double logBase = logBigInteger(base); if (divByZero.profile(inliningTarget, logBase == 0)) { - throw raiseNode.get(inliningTarget).raise(ZeroDivisionError, ErrorMessages.S_DIVISION_BY_ZERO, "float"); + throw raiseNode.raise(inliningTarget, ZeroDivisionError, ErrorMessages.S_DIVISION_BY_ZERO, "float"); } return logBase; } @@ -1568,7 +1587,7 @@ private static double countBase(BigInteger base, Node inliningTarget, InlinedCon static double log(long value, PNone novalue, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile doNotFit, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { return logDN(value, novalue, inliningTarget, doNotFit, raiseNode); } @@ -1576,7 +1595,7 @@ static double log(long value, PNone novalue, static double logDN(double value, @SuppressWarnings("unused") PNone novalue, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile doNotFit, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { raiseMathError(inliningTarget, doNotFit, value <= 0, raiseNode); return Math.log(value); } @@ -1586,7 +1605,7 @@ static double logDN(double value, @SuppressWarnings("unused") PNone novalue, static double logPIN(PInt value, @SuppressWarnings("unused") PNone novalue, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile doNotFit, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { BigInteger bValue = value.getValue(); raiseMathError(inliningTarget, doNotFit, bValue.compareTo(BigInteger.ZERO) < 0, raiseNode); return logBigInteger(bValue); @@ -1597,7 +1616,7 @@ static double logLL(long value, long base, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile doNotFit, @Shared @Cached InlinedConditionProfile divByZero, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { return logDD(value, base, inliningTarget, doNotFit, divByZero, raiseNode); } @@ -1606,7 +1625,7 @@ static double logDL(double value, long base, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile doNotFit, @Shared @Cached InlinedConditionProfile divByZero, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { return logDD(value, base, inliningTarget, doNotFit, divByZero, raiseNode); } @@ -1615,7 +1634,7 @@ static double logLD(long value, double base, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile doNotFit, @Shared @Cached InlinedConditionProfile divByZero, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { return logDD(value, base, inliningTarget, doNotFit, divByZero, raiseNode); } @@ -1624,7 +1643,7 @@ static double logDD(double value, double base, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile doNotFit, @Shared @Cached InlinedConditionProfile divByZero, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { raiseMathError(inliningTarget, doNotFit, value < 0 || base <= 0, raiseNode); double logBase = countBase(base, inliningTarget, divByZero, raiseNode); return Math.log(value) / logBase; @@ -1636,7 +1655,7 @@ static double logDPI(double value, PInt base, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile doNotFit, @Shared @Cached InlinedConditionProfile divByZero, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { BigInteger bBase = base.getValue(); raiseMathError(inliningTarget, doNotFit, value < 0 || bBase.compareTo(BigInteger.ZERO) <= 0, raiseNode); double logBase = countBase(bBase, inliningTarget, divByZero, raiseNode); @@ -1648,7 +1667,7 @@ static double logPIL(PInt value, long base, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile doNotFit, @Shared @Cached InlinedConditionProfile divByZero, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { return logPID(value, base, inliningTarget, doNotFit, divByZero, raiseNode); } @@ -1658,7 +1677,7 @@ static double logPID(PInt value, double base, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile doNotFit, @Shared @Cached InlinedConditionProfile divByZero, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { BigInteger bValue = value.getValue(); raiseMathError(inliningTarget, doNotFit, bValue.compareTo(BigInteger.ZERO) < 0 || base <= 0, raiseNode); double logBase = countBase(base, inliningTarget, divByZero, raiseNode); @@ -1671,7 +1690,7 @@ static double logLPI(long value, PInt base, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile doNotFit, @Shared @Cached InlinedConditionProfile divByZero, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { BigInteger bBase = base.getValue(); raiseMathError(inliningTarget, doNotFit, value < 0 || bBase.compareTo(BigInteger.ZERO) <= 0, raiseNode); double logBase = countBase(bBase, inliningTarget, divByZero, raiseNode); @@ -1684,7 +1703,7 @@ static double logPIPI(PInt value, PInt base, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile doNotFit, @Shared @Cached InlinedConditionProfile divByZero, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { BigInteger bValue = value.getValue(); BigInteger bBase = base.getValue(); raiseMathError(inliningTarget, doNotFit, bValue.compareTo(BigInteger.ZERO) < 0 || bBase.compareTo(BigInteger.ZERO) <= 0, raiseNode); @@ -1727,9 +1746,9 @@ static double logPIPI(PInt value, PInt base, return executeRecursiveLogNode(frame, value, asDoubleNode.execute(frame, inliningTarget, base)); } - private static void raiseMathError(Node inliningTarget, InlinedConditionProfile doNotFit, boolean con, PRaiseNode.Lazy raiseNode) { + private static void raiseMathError(Node inliningTarget, InlinedConditionProfile doNotFit, boolean con, PRaiseNode raiseNode) { if (doNotFit.profile(inliningTarget, con)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MATH_DOMAIN_ERROR); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MATH_DOMAIN_ERROR); } } @@ -1749,7 +1768,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, Log1pNode::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { if (value == 0 || value == Double.POSITIVE_INFINITY || Double.isNaN(value)) { return value; } @@ -1785,7 +1804,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, Log2Node::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { checkMathDomainError(value <= 0, inliningTarget, raiseNode); double[] frexpR = FrexpNode.frexp(value); double m = frexpR[0]; @@ -1832,7 +1851,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, Log10Node::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { checkMathDomainError(value <= 0, inliningTarget, raiseNode); return Math.log10(value); } @@ -1861,7 +1880,7 @@ public abstract static class PowNode extends PythonBinaryClinicBuiltinNode { @Specialization static double pow(double left, double right, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { double result = 0; if (!Double.isFinite(left) || !Double.isFinite(right)) { if (Double.isNaN(left)) { @@ -1892,12 +1911,12 @@ static double pow(double left, double right, result = Math.pow(left, right); if (!Double.isFinite(result)) { if (Double.isNaN(result)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MATH_DOMAIN_ERROR); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MATH_DOMAIN_ERROR); } else if (Double.isInfinite(result)) { if (left == 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MATH_DOMAIN_ERROR); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MATH_DOMAIN_ERROR); } else { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.MATH_RANGE_ERROR); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.MATH_RANGE_ERROR); } } } @@ -1919,10 +1938,10 @@ public abstract static class TruncNode extends PythonUnaryBuiltinNode { static Object trunc(VirtualFrame frame, Object obj, @Bind("this") Node inliningTarget, @Cached("create(T___TRUNC__)") LookupAndCallUnaryNode callTrunc, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object result = callTrunc.executeObject(frame, obj); if (result == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.TYPE_DOESNT_DEFINE_METHOD, obj, "__trunc__"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.TYPE_DOESNT_DEFINE_METHOD, obj, "__trunc__"); } return result; } @@ -1956,7 +1975,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, DegreesNode::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { return value * RAD_TO_DEG; } } @@ -1973,29 +1992,25 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, RadiansNode::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { return value * DEG_TO_RAD; } } @Builtin(name = "hypot", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, declaresExplicitSelf = true) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @GenerateNodeFactory @ImportStatic(MathGuards.class) public abstract static class HypotNode extends PythonVarargsBuiltinNode { - @Override - public Object varArgExecute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported { - return execute(frame, self, arguments, keywords); - } - @Specialization(guards = "arguments.length == 2") public double hypot2(VirtualFrame frame, @SuppressWarnings("unused") Object self, Object[] arguments, PKeyword[] keywords, @Bind("this") Node inliningTarget, + @Exclusive @Cached PRaiseNode raiseNode, @Exclusive @Cached PyFloatAsDoubleNode xAsDouble, @Exclusive @Cached PyFloatAsDoubleNode yAsDouble) { if (keywords.length != 0) { - throw raise(PythonBuiltinClassType.TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "hypot()"); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "hypot()"); } double x = xAsDouble.execute(frame, inliningTarget, arguments[0]); double y = yAsDouble.execute(frame, inliningTarget, arguments[1]); @@ -2006,9 +2021,10 @@ public double hypot2(VirtualFrame frame, @SuppressWarnings("unused") Object self @SuppressWarnings("truffle-static-method") double hypotGeneric(VirtualFrame frame, @SuppressWarnings("unused") Object self, Object[] arguments, PKeyword[] keywords, @Bind("this") Node inliningTarget, + @Exclusive @Cached PRaiseNode raiseNode, @Exclusive @Cached PyFloatAsDoubleNode asDoubleNode) { if (keywords.length != 0) { - throw raise(PythonBuiltinClassType.TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "hypot()"); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "hypot()"); } double max = 0.0; boolean foundNan = false; @@ -2113,7 +2129,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, ErfNode::compute); } - private static double compute(Node inliningTarget, double value, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double value, PRaiseNode raiseNode) { double absx, cf; if (Double.isNaN(value)) { @@ -2140,7 +2156,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, ErfcNode::compute); } - private static double compute(Node inliningTarget, double x, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double x, PRaiseNode raiseNode) { double absx, cf; if (Double.isNaN(x)) { @@ -2260,7 +2276,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, GammaNode::compute); } - private static double compute(Node inliningTarget, double x, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double x, PRaiseNode raiseNode) { double absx, r, y, z, sqrtpow; /* special cases */ @@ -2353,7 +2369,7 @@ static double doGeneric(VirtualFrame frame, Object value, return helperNode.execute(frame, inliningTarget, value, LgammaNode::compute); } - private static double compute(Node inliningTarget, double x, PRaiseNode.Lazy raiseNode) { + private static double compute(Node inliningTarget, double x, PRaiseNode raiseNode) { double r; double absx; @@ -2397,7 +2413,7 @@ private static double compute(Node inliningTarget, double x, PRaiseNode.Lazy rai } @Builtin(name = "isqrt", minNumOfPositionalArgs = 1) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) @GenerateNodeFactory @ImportStatic(MathGuards.class) public abstract static class IsqrtNode extends PythonUnaryBuiltinNode { @@ -2406,7 +2422,7 @@ public abstract static class IsqrtNode extends PythonUnaryBuiltinNode { static Object isqrtLong(long x, @Bind("this") Node inliningTarget, @Shared @Cached NarrowBigIntegerNode makeInt, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { raiseIfNegative(inliningTarget, x < 0, raiseNode); return makeInt.execute(inliningTarget, op(PInt.longToBigInteger(x))); } @@ -2415,7 +2431,7 @@ static Object isqrtLong(long x, static Object isqrtPInt(PInt x, @Bind("this") Node inliningTarget, @Shared @Cached NarrowBigIntegerNode makeInt, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { raiseIfNegative(inliningTarget, x.isNegative(), raiseNode); return makeInt.execute(inliningTarget, op(x.getValue())); } @@ -2454,9 +2470,9 @@ private static BigInteger op(BigInteger x) { return result; } - private static void raiseIfNegative(Node inliningTarget, boolean condition, PRaiseNode.Lazy raiseNode) { + private static void raiseIfNegative(Node inliningTarget, boolean condition, PRaiseNode raiseNode) { if (condition) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MUST_BE_NON_NEGATIVE, "isqrt() argument"); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MUST_BE_NON_NEGATIVE, "isqrt() argument"); } } } @@ -2465,28 +2481,27 @@ private static void raiseIfNegative(Node inliningTarget, boolean condition, PRai @GenerateNodeFactory public abstract static class ProdNode extends PythonBuiltinNode { - @Child private LookupAndCallUnaryNode callNextNode = LookupAndCallUnaryNode.create(SpecialMethodSlot.Next); - @Child private BinaryOpNode mul = BinaryArithmetic.Mul.create(); - @Specialization public Object doGeneric(VirtualFrame frame, Object iterable, Object startIn, @Bind("this") Node inliningTarget, - @Cached IsBuiltinObjectProfile errorProfile, @Cached InlinedConditionProfile startIsNoValueProfile, - @Cached PyObjectGetIter getIter) { + @Cached PyObjectGetIter getIter, + @Cached PyIterNextNode nextNode, + @Cached PyNumberMultiplyNode multiplyNode, + @Cached InlinedLoopConditionProfile loopProfile) { Object start = startIsNoValueProfile.profile(inliningTarget, PGuards.isNoValue(startIn)) ? 1 : startIn; Object iterator = getIter.execute(frame, inliningTarget, iterable); - Object value = start; - while (true) { - Object nextValue; + Object acc = start; + boolean exhausted = false; + while (loopProfile.profile(inliningTarget, !exhausted)) { try { - nextValue = callNextNode.executeObject(frame, iterator); - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - return value; + Object next = nextNode.execute(frame, inliningTarget, iterator); + acc = multiplyNode.execute(frame, acc, next); + } catch (IteratorExhausted e) { + exhausted = true; } - value = mul.executeObject(frame, value, nextValue); } + return acc; } } @@ -2505,13 +2520,13 @@ static double doGeneric(VirtualFrame frame, Object p, Object q, @Cached InlinedConditionProfile infProfile, @Cached InlinedConditionProfile nanProfile, @Cached InlinedConditionProfile trivialProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { // adapted from CPython math_dist_impl and vector_norm Object[] ps = getObjectArray.execute(inliningTarget, tupleCtor.execute(frame, p)); Object[] qs = getObjectArray.execute(inliningTarget, tupleCtor.execute(frame, q)); int len = ps.length; if (len != qs.length) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.BOTH_POINTS_MUST_HAVE_THE_SAME_NUMBER_OF_DIMENSIONS); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.BOTH_POINTS_MUST_HAVE_THE_SAME_NUMBER_OF_DIMENSIONS); } double[] diffs = new double[len]; double max = 0.0; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/NtModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/NtModuleBuiltins.java index 2f003dff72..738f1bb76d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/NtModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/NtModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,6 +47,7 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; import com.oracle.graal.python.builtins.Builtin; @@ -65,7 +66,7 @@ import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaStringNode; import com.oracle.graal.python.runtime.PosixSupportLibrary; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; @@ -123,12 +124,12 @@ abstract static class PathSplitRootNode extends PythonUnaryClinicBuiltinNode { Object splitroot(PosixPath path) { // TODO should call WINAPI PathCchSkipRoot - PythonObjectFactory factory = PythonObjectFactory.getUncached(); + PythonLanguage language = PythonLanguage.get(null); TruffleString pathString = PosixSupportLibrary.getUncached().getPathAsString(getPosixSupport(), path.value); int len = pathString.codePointLengthUncached(TS_ENCODING); int index = pathString.indexOfCodePointUncached(':', 0, len, TS_ENCODING); if (index <= 0) { - return factory.createTuple(new Object[]{T_EMPTY_STRING, pathString}); + return PFactory.createTuple(language, new Object[]{T_EMPTY_STRING, pathString}); } else { index++; int first = pathString.codePointAtIndexUncached(index, TS_ENCODING); @@ -137,7 +138,7 @@ Object splitroot(PosixPath path) { } TruffleString root = pathString.substringUncached(0, index, TS_ENCODING, false); TruffleString rest = pathString.substringUncached(index, len - index, TS_ENCODING, false); - return factory.createTuple(new Object[]{root, rest}); + return PFactory.createTuple(language, new Object[]{root, rest}); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/OperatorModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/OperatorModuleBuiltins.java index 683953d681..8bf4f26af4 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/OperatorModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/OperatorModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -54,13 +54,13 @@ import com.oracle.graal.python.lib.PyNumberMultiplyNode; import com.oracle.graal.python.lib.PyObjectGetItem; import com.oracle.graal.python.lib.PyObjectIsTrueNode; -import com.oracle.graal.python.lib.PySequenceConcat; +import com.oracle.graal.python.lib.PySequenceConcatNode; +import com.oracle.graal.python.lib.PySequenceInPlaceConcatNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaStringNode; import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext; @@ -71,7 +71,6 @@ import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; @@ -91,9 +90,8 @@ protected List> getNodeFa abstract static class TruthNode extends PythonUnaryBuiltinNode { @Specialization static Object doObject(VirtualFrame frame, Object object, - @Bind("this") Node inliningTarget, @Cached PyObjectIsTrueNode isTrueNode) { - return isTrueNode.execute(frame, inliningTarget, object); + return isTrueNode.execute(frame, object); } } @@ -114,7 +112,18 @@ abstract static class ConcatNode extends PythonBinaryBuiltinNode { @Specialization static Object doObject(VirtualFrame frame, Object left, Object right, @Bind("this") Node inliningTarget, - @Cached PySequenceConcat concatNode) { + @Cached PySequenceConcatNode concatNode) { + return concatNode.execute(frame, inliningTarget, left, right); + } + } + + @Builtin(name = "iconcat", minNumOfPositionalArgs = 2) + @GenerateNodeFactory + abstract static class IConcatNode extends PythonBinaryBuiltinNode { + @Specialization + static Object doObject(VirtualFrame frame, Object left, Object right, + @Bind("this") Node inliningTarget, + @Cached PySequenceInPlaceConcatNode concatNode) { return concatNode.execute(frame, inliningTarget, left, right); } } @@ -124,15 +133,13 @@ static Object doObject(VirtualFrame frame, Object left, Object right, abstract static class MulNode extends PythonBinaryBuiltinNode { @Specialization static Object doObject(VirtualFrame frame, Object left, Object right, - @Bind("this") Node inliningTarget, @Cached PyNumberMultiplyNode mulNode) { - return mulNode.execute(frame, inliningTarget, left, right); + return mulNode.execute(frame, left, right); } } // _compare_digest @Builtin(name = "_compare_digest", minNumOfPositionalArgs = 2) - @TypeSystemReference(PythonArithmeticTypes.class) @GenerateNodeFactory abstract static class CompareDigestNode extends PythonBinaryBuiltinNode { @@ -143,14 +150,14 @@ static boolean compare(VirtualFrame frame, Object left, Object right, @Cached CastToJavaStringNode cast, @CachedLibrary(limit = "3") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { String leftString = cast.execute(left); String rightString = cast.execute(right); return tscmp(leftString, rightString); } catch (CannotCastException e) { if (!bufferAcquireLib.hasBuffer(left) || !bufferAcquireLib.hasBuffer(right)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_OR_COMBINATION_OF_TYPES, left, right); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_OR_COMBINATION_OF_TYPES, left, right); } Object savedState = IndirectCallContext.enter(frame, indirectCallData); Object leftBuffer = bufferAcquireLib.acquireReadonly(left); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PolyglotModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PolyglotModuleBuiltins.java index b825c6e106..9f2a8457b8 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PolyglotModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PolyglotModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,10 +41,9 @@ package com.oracle.graal.python.builtins.modules; import static com.oracle.graal.python.nodes.BuiltinNames.J_GET_REGISTERED_INTEROP_BEHAVIOR; -import static com.oracle.graal.python.nodes.BuiltinNames.J_INTEROP_BEHAVIOR; -import static com.oracle.graal.python.nodes.BuiltinNames.J_REGISTER_INTEROP_BEHAVIOR; -import static com.oracle.graal.python.nodes.BuiltinNames.T_REGISTER_INTEROP_BEHAVIOR; import static com.oracle.graal.python.nodes.ErrorMessages.ARG_MUST_BE_NUMBER; +import static com.oracle.graal.python.nodes.ErrorMessages.INTEROP_TYPE_ALREADY_REGISTERED; +import static com.oracle.graal.python.nodes.ErrorMessages.INTEROP_TYPE_NOT_MERGABLE; import static com.oracle.graal.python.nodes.ErrorMessages.S_ARG_MUST_BE_S_NOT_P; import static com.oracle.graal.python.nodes.ErrorMessages.S_CANNOT_HAVE_S; import static com.oracle.graal.python.nodes.ErrorMessages.S_DOES_NOT_TAKE_VARARGS; @@ -61,6 +60,7 @@ import static com.oracle.graal.python.nodes.StringLiterals.T_READABLE; import static com.oracle.graal.python.nodes.StringLiterals.T_WRITABLE; import static com.oracle.graal.python.nodes.truffle.TruffleStringMigrationHelpers.isJavaString; +import static com.oracle.graal.python.runtime.exception.PythonErrorType.KeyError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.OSError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.RuntimeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; @@ -68,74 +68,66 @@ import static com.oracle.graal.python.util.PythonUtils.EMPTY_BYTE_ARRAY; import static com.oracle.graal.python.util.PythonUtils.EMPTY_OBJECT_ARRAY; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; -import static com.oracle.graal.python.util.PythonUtils.tsArray; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.io.IOException; -import java.util.ArrayList; import java.util.List; import java.util.Map; import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.modules.PolyglotModuleBuiltinsClinicProviders.RegisterInteropTypeNodeClinicProviderGen; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.PythonAbstractObject; import com.oracle.graal.python.builtins.objects.bytes.PBytesLike; -import com.oracle.graal.python.builtins.objects.common.HashingStorage; -import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes; -import com.oracle.graal.python.builtins.objects.function.PArguments; +import com.oracle.graal.python.builtins.objects.common.ObjectHashMap; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; import com.oracle.graal.python.builtins.objects.function.PFunction; -import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.function.Signature; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; import com.oracle.graal.python.builtins.objects.method.PMethod; import com.oracle.graal.python.builtins.objects.module.PythonModule; -import com.oracle.graal.python.builtins.objects.set.PSet; import com.oracle.graal.python.builtins.objects.type.PythonClass; -import com.oracle.graal.python.builtins.objects.type.TypeBuiltins; +import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; import com.oracle.graal.python.builtins.objects.type.TypeNodes; -import com.oracle.graal.python.lib.PyObjectGetAttr; -import com.oracle.graal.python.lib.PyObjectGetAttrO; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.HiddenAttr; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.PRootNode; import com.oracle.graal.python.nodes.SpecialAttributeNames; import com.oracle.graal.python.nodes.attributes.GetAttributeNode; -import com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.interop.InteropBehavior; import com.oracle.graal.python.nodes.interop.InteropBehaviorMethod; import com.oracle.graal.python.nodes.interop.PForeignToPTypeNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; +import com.oracle.graal.python.nodes.object.GetForeignObjectClassNode; +import com.oracle.graal.python.nodes.statement.AbstractImportNode; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaStringNode; -import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.ExecutionContext; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.PSequence; import com.oracle.graal.python.runtime.sequence.storage.ArrayBasedSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.EmptySequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; -import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.TruffleFile; -import com.oracle.truffle.api.TruffleLanguage; import com.oracle.truffle.api.TruffleLanguage.Env; import com.oracle.truffle.api.TruffleLogger; import com.oracle.truffle.api.dsl.Bind; @@ -170,6 +162,7 @@ public final class PolyglotModuleBuiltins extends PythonBuiltins { private static final TruffleString T_MODIFIABLE = tsLiteral("modifiable"); private static final TruffleString T_INVOKABLE = tsLiteral("invokable"); private static final TruffleString T_INTERNAL = tsLiteral("internal"); + private static final TruffleString T_INTERNAL_POLYGLOT_MODULE = tsLiteral("_polyglot"); @Override protected List> getNodeFactories() { @@ -193,6 +186,16 @@ public void initialize(Python3Core core) { } } + @Override + public void postInitialize(Python3Core core) { + super.postInitialize(core); + + GetForeignObjectClassNode.getUncached().defineSingleTraitClasses(core.getContext()); + + // import polyglot decorators which are defined in Python code + AbstractImportNode.importModule(T_INTERNAL_POLYGLOT_MODULE); + } + @Builtin(name = "import_value", minNumOfPositionalArgs = 1, parameterNames = {"name"}) @GenerateNodeFactory public abstract static class ImportNode extends PythonBuiltinNode { @@ -202,7 +205,7 @@ Object importSymbol(TruffleString name, @Cached PForeignToPTypeNode convert) { Env env = getContext().getEnv(); if (!env.isPolyglotBindingsAccessAllowed()) { - throw PRaiseNode.raiseUncached(this, PythonErrorType.NotImplementedError, ErrorMessages.POLYGLOT_ACCESS_NOT_ALLOWED); + throw PRaiseNode.raiseStatic(this, PythonErrorType.NotImplementedError, ErrorMessages.POLYGLOT_ACCESS_NOT_ALLOWED); } Object object = env.importSymbol(name.toJavaStringUncached()); if (object == null) { @@ -219,19 +222,19 @@ abstract static class EvalInteropNode extends PythonTernaryBuiltinNode { @Specialization Object eval(Object pathObj, Object stringObj, Object languageObj) { if (languageObj instanceof PNone) { - throw PRaiseNode.raiseUncached(this, ValueError, ErrorMessages.POLYGLOT_EVAL_MUST_PASS_LANG); + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.POLYGLOT_EVAL_MUST_PASS_LANG_AND_STRING_OR_PATH); } boolean hasString = !(stringObj instanceof PNone); boolean hasPath = !(pathObj instanceof PNone); if (!hasString && !hasPath || hasString && hasPath) { - throw PRaiseNode.raiseUncached(this, ValueError, ErrorMessages.POLYGLOT_EVAL_MUST_PASS_STRING_OR_PATH); + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.POLYGLOT_EVAL_MUST_PASS_LANG_AND_STRING_OR_PATH); } String languageName = toJavaString(languageObj, "language"); String string = hasString ? toJavaString(stringObj, "string") : null; String path = hasPath ? toJavaString(pathObj, "path") : null; Env env = getContext().getEnv(); if (!env.isPolyglotEvalAllowed(null)) { - throw PRaiseNode.raiseUncached(this, RuntimeError, ErrorMessages.POLYGLOT_ACCESS_NOT_ALLOWED); + throw PRaiseNode.raiseStatic(this, RuntimeError, ErrorMessages.POLYGLOT_ACCESS_NOT_ALLOWED); } Map languages = env.getPublicLanguages(); String mimeType = null; @@ -241,10 +244,10 @@ Object eval(Object pathObj, Object stringObj, Object languageObj) { } LanguageInfo language = languages.get(languageName); if (language == null) { - throw PRaiseNode.raiseUncached(this, ValueError, ErrorMessages.POLYGLOT_LANGUAGE_S_NOT_FOUND, languageName); + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.POLYGLOT_LANGUAGE_S_NOT_FOUND, languageName); } if (!env.isPolyglotEvalAllowed(language)) { - throw PRaiseNode.raiseUncached(this, RuntimeError, ErrorMessages.POLYGLOT_ACCESS_NOT_ALLOWED_FOR_LANGUAGE_S, languageName); + throw PRaiseNode.raiseStatic(this, RuntimeError, ErrorMessages.POLYGLOT_ACCESS_NOT_ALLOWED_FOR_LANGUAGE_S, languageName); } try { SourceBuilder builder; @@ -261,9 +264,9 @@ Object eval(Object pathObj, Object stringObj, Object languageObj) { } catch (AbstractTruffleException e) { throw e; } catch (IOException e) { - throw PRaiseNode.raiseUncached(this, OSError, ErrorMessages.S, e); + throw PRaiseNode.raiseStatic(this, OSError, ErrorMessages.S, e); } catch (RuntimeException e) { - throw PRaiseNode.raiseUncached(this, RuntimeError, e); + throw PRaiseNode.raiseStatic(this, RuntimeError, e); } } @@ -271,7 +274,7 @@ private String toJavaString(Object object, String parameterName) { try { return CastToJavaStringNode.getUncached().execute(object); } catch (CannotCastException e) { - throw PRaiseNode.raiseUncached(this, TypeError, ErrorMessages.S_BRACKETS_ARG_S_MUST_BE_S_NOT_P, "polyglot.eval", parameterName, "str", object); + throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.S_BRACKETS_ARG_S_MUST_BE_S_NOT_P, "polyglot.eval", parameterName, "str", object); } } @@ -301,7 +304,7 @@ public abstract static class ExportSymbolNode extends PythonBuiltinNode { Object exportSymbolKeyValue(TruffleString name, Object value) { Env env = getContext().getEnv(); if (!env.isPolyglotBindingsAccessAllowed()) { - throw PRaiseNode.raiseUncached(this, PythonErrorType.NotImplementedError, ErrorMessages.POLYGLOT_ACCESS_NOT_ALLOWED); + throw PRaiseNode.raiseStatic(this, PythonErrorType.NotImplementedError, ErrorMessages.POLYGLOT_ACCESS_NOT_ALLOWED); } env.exportSymbol(name.toJavaStringUncached(), value); return value; @@ -329,7 +332,7 @@ Object exportSymbolAmbiguous(Object arg1, TruffleString arg2) { Object exportSymbol(PFunction fun, @SuppressWarnings("unused") PNone name) { Env env = getContext().getEnv(); if (!env.isPolyglotBindingsAccessAllowed()) { - throw PRaiseNode.raiseUncached(this, PythonErrorType.NotImplementedError, ErrorMessages.POLYGLOT_ACCESS_NOT_ALLOWED); + throw PRaiseNode.raiseStatic(this, PythonErrorType.NotImplementedError, ErrorMessages.POLYGLOT_ACCESS_NOT_ALLOWED); } env.exportSymbol(fun.getName().toJavaStringUncached(), fun); return fun; @@ -340,7 +343,7 @@ Object exportSymbol(PFunction fun, @SuppressWarnings("unused") PNone name) { Object exportSymbol(PBuiltinFunction fun, @SuppressWarnings("unused") PNone name) { Env env = getContext().getEnv(); if (!env.isPolyglotBindingsAccessAllowed()) { - throw PRaiseNode.raiseUncached(this, PythonErrorType.NotImplementedError, ErrorMessages.POLYGLOT_ACCESS_NOT_ALLOWED); + throw PRaiseNode.raiseStatic(this, PythonErrorType.NotImplementedError, ErrorMessages.POLYGLOT_ACCESS_NOT_ALLOWED); } env.exportSymbol(fun.getName().toJavaStringUncached(), fun); return fun; @@ -351,13 +354,13 @@ static Object exportSymbol(VirtualFrame frame, Object fun, @SuppressWarnings("un @Bind("this") Node inliningTarget, @Cached("create(T___NAME__)") GetAttributeNode.GetFixedAttributeNode getNameAttributeNode, @Cached CastToJavaStringNode castToStringNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object attrNameValue = getNameAttributeNode.executeObject(frame, fun); String methodName; try { methodName = castToStringNode.execute(attrNameValue); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.METHOD_NAME_MUST_BE, attrNameValue); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.METHOD_NAME_MUST_BE, attrNameValue); } export(inliningTarget, methodName, fun); return fun; @@ -365,8 +368,8 @@ static Object exportSymbol(VirtualFrame frame, Object fun, @SuppressWarnings("un @Fallback static Object exportSymbol(Object value, Object name, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.EXPECTED_ARG_TYPES_S_S_BUT_NOT_P_P, "function", "object, str", value, name); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.EXPECTED_ARG_TYPES_S_S_BUT_NOT_P_P, "function", "object, str", value, name); } protected static boolean isModuleMethod(Object o) { @@ -377,7 +380,7 @@ protected static boolean isModuleMethod(Object o) { private static void export(Node raisingNode, String name, Object obj) { Env env = PythonContext.get(raisingNode).getEnv(); if (!env.isPolyglotBindingsAccessAllowed()) { - throw PRaiseNode.raiseUncached(raisingNode, PythonErrorType.NotImplementedError, ErrorMessages.POLYGLOT_ACCESS_NOT_ALLOWED); + throw PRaiseNode.raiseStatic(raisingNode, PythonErrorType.NotImplementedError, ErrorMessages.POLYGLOT_ACCESS_NOT_ALLOWED); } env.exportSymbol(name, obj); } @@ -404,8 +407,8 @@ static boolean isWhole(double number) { @Specialization(guards = {"!isSupportedNumber(number)"}) static boolean unsupported(PythonAbstractObject number, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ARG_MUST_BE_NUMBER, "given", number); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ARG_MUST_BE_NUMBER, "given", number); } } @@ -629,120 +632,21 @@ public abstract static class GetRegisteredInteropBehaviorNode extends PythonUnar PList get(PythonAbstractObject klass, @Bind("this") Node inliningTarget, @Cached TypeNodes.IsTypeNode isTypeNode, - @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached PRaiseNode raiseNode, @Cached HiddenAttr.ReadNode readHiddenAttrNode) { if (isTypeNode.execute(inliningTarget, klass)) { Object value = readHiddenAttrNode.execute(inliningTarget, klass, HiddenAttr.HOST_INTEROP_BEHAVIOR, null); if (value instanceof InteropBehavior behavior) { - return factory.createList(behavior.getDefinedMethods()); + return PFactory.createList(language, behavior.getDefinedMethods()); } - return factory.createList(); + return PFactory.createList(language); } - throw raiseNode.raise(ValueError, S_ARG_MUST_BE_S_NOT_P, "first", "a type", klass); + throw raiseNode.raise(inliningTarget, ValueError, S_ARG_MUST_BE_S_NOT_P, "first", "a type", klass); } } - @Builtin(name = J_INTEROP_BEHAVIOR, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 1) - @GenerateNodeFactory - public abstract static class InteropBehaviorDecoratorNode extends PythonUnaryBuiltinNode { - static final TruffleString WRAPPER = tsLiteral("wrapper"); - public static final TruffleString KW_RECEIVER = tsLiteral("$receiver"); - - static class RegisterWrapperRootNode extends PRootNode { - static final TruffleString[] KEYWORDS_HIDDEN_RECEIVER = new TruffleString[]{KW_RECEIVER}; - private static final Signature SIGNATURE = new Signature(1, false, -1, false, tsArray("supplierClass"), KEYWORDS_HIDDEN_RECEIVER); - private static final TruffleString MODULE_POLYGLOT = tsLiteral("polyglot"); - @Child private ExecutionContext.CalleeContext calleeContext = ExecutionContext.CalleeContext.create(); - @Child private PRaiseNode raiseNode = PRaiseNode.create(); - @Child private TypeBuiltins.DirNode dirNode = TypeBuiltins.DirNode.create(); - @Child private PyObjectGetAttr getAttr = PyObjectGetAttr.create(); - @Child private CallVarargsMethodNode callVarargsMethod = CallVarargsMethodNode.create(); - - protected RegisterWrapperRootNode(TruffleLanguage language) { - super(language); - } - - @Override - public Object execute(VirtualFrame frame) { - calleeContext.enter(frame); - Object[] frameArguments = frame.getArguments(); - Object supplierClass = PArguments.getArgument(frameArguments, 0); - // note: the hidden kwargs are stored at the end of the positional args - Object receiver = PArguments.getArgument(frameArguments, 1); - try { - if (supplierClass instanceof PythonClass klass) { - // extract methods and do the registration on the receiver type - PSet names = dirNode.execute(frame, klass); - PKeyword[] kwargs = getFunctionsAsKwArgs(names.getDictStorage(), supplierClass); - PythonModule polyglotModule = PythonContext.get(this).lookupBuiltinModule(MODULE_POLYGLOT); - Object register = getAttr.executeCached(frame, polyglotModule, T_REGISTER_INTEROP_BEHAVIOR); - callVarargsMethod.execute(frame, register, new Object[]{receiver}, kwargs); - return klass; - } - throw raiseNode.raise(ValueError, S_ARG_MUST_BE_S_NOT_P, "first", "a python class", supplierClass); - } finally { - calleeContext.exit(frame, this); - } - } - - @TruffleBoundary - private PKeyword[] getFunctionsAsKwArgs(HashingStorage namesStorage, Object supplierClass) { - ArrayList functions = new ArrayList<>(); - HashingStorageNodes.HashingStorageIterator iterator = HashingStorageNodes.HashingStorageGetIterator.executeUncached(namesStorage); - while (HashingStorageNodes.HashingStorageIteratorNext.executeUncached(namesStorage, iterator)) { - Object name = HashingStorageNodes.HashingStorageIteratorKey.executeUncached(namesStorage, iterator); - Object value = PyObjectGetAttrO.executeUncached(supplierClass, name); - if (value instanceof PFunction function) { - functions.add(new PKeyword(CastToTruffleStringNode.executeUncached(name), function)); - } - } - return functions.toArray(PKeyword.EMPTY_KEYWORDS); - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - - @Override - public boolean isPythonInternal() { - return true; - } - - @Override - public boolean isInternal() { - return true; - } - - @Override - public boolean setsUpCalleeContext() { - return true; - } - } - - @Specialization - @TruffleBoundary - public Object decorate(PythonAbstractObject receiver, - @Bind("this") Node inliningTarget, - @Cached TypeNodes.IsTypeNode isTypeNode, - @Cached PRaiseNode raiseNode, - @Cached PythonObjectFactory factory) { - if (isTypeNode.execute(inliningTarget, receiver)) { - RootCallTarget callTarget = getContext().getLanguage().createCachedCallTarget(RegisterWrapperRootNode::new, RegisterWrapperRootNode.class); - return factory.createBuiltinFunction(WRAPPER, null, PythonUtils.EMPTY_OBJECT_ARRAY, createKwDefaults(receiver), 0, callTarget); - } - throw raiseNode.raise(ValueError, S_ARG_MUST_BE_S_NOT_P, "first", "a type", receiver); - } - - public static PKeyword[] createKwDefaults(Object receiver) { - // the receiver is passed in a hidden keyword argument - // in a pure python decorator this would be passed as a cell - return new PKeyword[]{new PKeyword(KW_RECEIVER, receiver)}; - } - } - - @Builtin(name = J_REGISTER_INTEROP_BEHAVIOR, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 1, takesVarKeywordArgs = true, keywordOnlyNames = {"is_boolean", "is_date", + @Builtin(name = "register_interop_behavior", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 1, takesVarKeywordArgs = true, keywordOnlyNames = {"is_boolean", "is_date", "is_duration", "is_iterator", "is_number", "is_string", "is_time", "is_time_zone", "is_executable", "fits_in_big_integer", "fits_in_byte", "fits_in_double", "fits_in_float", "fits_in_int", "fits_in_long", "fits_in_short", "as_big_integer", "as_boolean", "as_byte", "as_date", "as_double", "as_duration", "as_float", "as_int", "as_long", "as_short", "as_string", "as_time", "as_time_zone", "execute", "read_array_element", "get_array_size", "has_array_elements", "is_array_element_readable", "is_array_element_modifiable", @@ -782,17 +686,17 @@ void handleArg(Object value, InteropBehaviorMethod method, InteropBehavior inter Signature signature = function.getCode().getSignature(); // validate the function if (function.getKwDefaults().length != 0) { - throw raiseNode.raise(ValueError, S_TAKES_NO_KEYWORD_ARGS, method.name); + throw raiseNode.raise(this, ValueError, S_TAKES_NO_KEYWORD_ARGS, method.name); } else if (function.getCode().getCellVars().length != 0) { - throw raiseNode.raise(ValueError, S_CANNOT_HAVE_S, method.name, "cell vars"); + throw raiseNode.raise(this, ValueError, S_CANNOT_HAVE_S, method.name, "cell vars"); } else if (function.getCode().getFreeVars().length != 0) { - throw raiseNode.raise(ValueError, S_CANNOT_HAVE_S, method.name, "free vars"); + throw raiseNode.raise(this, ValueError, S_CANNOT_HAVE_S, method.name, "free vars"); } else { // check signature if (method.takesVarArgs != signature.takesVarArgs()) { - throw raiseNode.raise(ValueError, method.takesVarArgs ? S_TAKES_VARARGS : S_DOES_NOT_TAKE_VARARGS, method.name); + throw raiseNode.raise(this, ValueError, method.takesVarArgs ? S_TAKES_VARARGS : S_DOES_NOT_TAKE_VARARGS, method.name); } else if (signature.getMaxNumOfPositionalArgs() != method.getNumPositionalArguments()) { - throw raiseNode.raise(ValueError, S_TAKES_EXACTLY_D_ARGS, method.name, method.getNumPositionalArguments(), signature.getMaxNumOfPositionalArgs()); + throw raiseNode.raise(this, ValueError, S_TAKES_EXACTLY_D_ARGS, method.name, method.getNumPositionalArguments(), signature.getMaxNumOfPositionalArgs()); } } } @@ -873,10 +777,159 @@ Object register(PythonAbstractObject receiver, Object is_boolean, Object is_date HiddenAttr.WriteNode.executeUncached(receiver, HiddenAttr.HOST_INTEROP_BEHAVIOR, interopBehavior); return PNone.NONE; } - throw raiseNode.raise(ValueError, S_ARG_MUST_BE_S_NOT_P, "first", "a type", receiver); + throw raiseNode.raise(inliningTarget, ValueError, S_ARG_MUST_BE_S_NOT_P, "first", "a type", receiver); } } + @Builtin(name = "register_interop_type", minNumOfPositionalArgs = 2, parameterNames = {"foreign_class", "python_class"}, takesVarKeywordArgs = true, keywordOnlyNames = { + "allow_method_overwrites"}, doc = """ + register_interop_type(foreign_class, python_class, allow_method_overwrites=False) + + Registers the python class for the given foreign_class. + Every instance of foreign_class or its subclasses will be treated as an instance of pythonClass. + + Multiple registrations per foreign_class are allowed. + If two registered classes for the same foreign_class define the same method, an error will be raised. + If allow_method_overwrites=True, defining the same method is explicitly allowed. + In case of method conflicts, the newest registered class "wins". + + Example registering a custom interop type for the java class YourClass + + >>> from polyglot import register_interop_type + >>> import java + + >>> class JYourClass: + ... def __str__(self): + ... return self.getClass().getSimpleName() + + >>> YourClass = java.type("fully.qualified.package.path.YourClass") + >>> register_interop_type(YourClass, JYourClass) + >>> yourClassObject = YourClass() + >>> print(yourClassObject) + YourClass + + Per default registering classes with the same methods for one foreign_class raises an error. + If you want to overwrite methods defined in JYourClass use "allow_method_overwrites=True": + + >>> class NewJYourClass: + ... def __str__(self): + ... return self.getClass().getName() + + >>> register_interop_type(YourClass, NewJYourClass, allow_method_overwrites=True) + + >>> print(yourClassObject) # Note: yourClassObject is still the same instance + fully.qualified.package.path.YourClass + """) + @GenerateNodeFactory + @ArgumentClinic(name = "allow_method_overwrites", conversion = ClinicConversion.Boolean, defaultValue = "false", useDefaultForNone = true) + public abstract static class RegisterInteropTypeNode extends PythonClinicBuiltinNode { + @Override + protected ArgumentClinicProvider getArgumentClinic() { + return RegisterInteropTypeNodeClinicProviderGen.INSTANCE; + } + + @Specialization + @TruffleBoundary + Object register(Object foreignClass, PythonClass pythonClass, boolean allowMethodOverwrites, + @Bind("this") Node inliningTarget, + @Cached TypeNodes.IsTypeNode isClassTypeNode, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interopLibrary, + @Cached ObjectHashMap.PutNode putNode, + @Cached ObjectHashMap.GetNode getNode, + @Cached PRaiseNode raiseNode) { + foreignClass = checkAndCleanForeignClass(inliningTarget, foreignClass, interopLibrary, raiseNode, getContext().getEnv()); + + if (!isClassTypeNode.execute(inliningTarget, pythonClass)) { + throw raiseNode.raise(inliningTarget, ValueError, S_ARG_MUST_BE_S_NOT_P, "second", "a python class", pythonClass); + } + // Contains foreignClasses as keys and PythonClass[] as values + ObjectHashMap interopTypeRegistry = getContext().interopTypeRegistry; + + try { + // possible Types: null, no registered class yet | PythonClass[], at least one + // registered + var possibleClasses = getNode.execute(null, inliningTarget, interopTypeRegistry, foreignClass, interopLibrary.identityHashCode(foreignClass)); + + if (possibleClasses == null) { + // nothing registered yet + putNode.put(null, inliningTarget, interopTypeRegistry, foreignClass, interopLibrary.identityHashCode(foreignClass), new PythonClass[]{pythonClass}); + } else if (possibleClasses instanceof PythonManagedClass[] registeredClasses) { + // found one or more classes for the key, insert the new class in at first place + // The logic for the class lookup should be LIFO + if (checkIfAlreadyRegistered(pythonClass, registeredClasses, interopLibrary)) { + throw raiseNode.raise(inliningTarget, KeyError, INTEROP_TYPE_ALREADY_REGISTERED, interopLibrary.getMetaQualifiedName(foreignClass)); + } + if (!allowMethodOverwrites) { + // method overwrite not allowed, check if there is a conflict + checkForMethodConflict(inliningTarget, pythonClass, registeredClasses, raiseNode); + } + var newClasses = new PythonManagedClass[registeredClasses.length + 1]; + newClasses[0] = pythonClass; + System.arraycopy(registeredClasses, 0, newClasses, 1, registeredClasses.length); + putNode.put(null, inliningTarget, interopTypeRegistry, foreignClass, interopLibrary.identityHashCode(foreignClass), newClasses); + } else { + // well, possibleClasses should be null | Array, looks like some edge case + // missed + throw CompilerDirectives.shouldNotReachHere(); + } + // clear all generated classes and invalidate the assumption for inline caches + clearInteropTypeRegistryCache(getContext()); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + return PNone.NONE; + } + + private static boolean checkIfAlreadyRegistered(PythonManagedClass pythonManagedClass, PythonManagedClass[] registeredClasses, InteropLibrary interopLibrary) { + for (PythonManagedClass registeredClass : registeredClasses) { + if (interopLibrary.isIdentical(registeredClass, pythonManagedClass, interopLibrary)) { + return true; + } + } + return false; + } + + private static void checkForMethodConflict(Node inliningTarget, PythonManagedClass toCheck, PythonManagedClass[] registeredClasses, PRaiseNode raiseNode) { + for (TruffleString name : toCheck.getAttributeNames()) { + if (toCheck.getAttribute(name) instanceof PFunction) { + for (PythonManagedClass registeredClass : registeredClasses) { + if (registeredClass.getAttribute(name) instanceof PFunction) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.AttributeError, INTEROP_TYPE_NOT_MERGABLE, toCheck, registeredClass, name); + } + } + } + } + } + + private static Object checkAndCleanForeignClass(Node inliningTarget, Object object, InteropLibrary interopLibrary, PRaiseNode raiseNode, Env env) { + if (!interopLibrary.isMetaObject(object)) { + throw raiseNode.raise(inliningTarget, ValueError, S_ARG_MUST_BE_S_NOT_P, "first", "a class or interface", object); + } + if (!env.isHostObject(object)) { + return object; + } + final String memberClass = "class"; + try { + // If the meta object is a host object, convert it to a non-static class + // Otherwise it would be useless as a key, because parent classes queried by the + // InteropLibrary are non-static + if (interopLibrary.isMemberExisting(object, memberClass) && interopLibrary.isMemberReadable(object, memberClass)) { + object = interopLibrary.readMember(object, memberClass); + } + } catch (UnsupportedMessageException | UnknownIdentifierException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + return object; + } + + } + + public static void clearInteropTypeRegistryCache(PythonContext pythonContext) { + pythonContext.getLanguage().noInteropTypeRegisteredAssumption.invalidate(); + pythonContext.interopTypeRegistryCacheValidAssumption.invalidate(); + pythonContext.interopGeneratedClassCache.clear(); + } + @Builtin(name = "__read__", minNumOfPositionalArgs = 2) @GenerateNodeFactory public abstract static class ReadNode extends PythonBuiltinNode { @@ -891,10 +944,10 @@ Object read(Object receiver, Object key) { } else if (key instanceof Number) { return getInterop().readArrayElement(receiver, ((Number) key).longValue()); } else { - throw PRaiseNode.raiseUncached(this, PythonErrorType.AttributeError, ErrorMessages.UNKNOWN_ATTR, key); + throw PRaiseNode.raiseStatic(this, PythonErrorType.AttributeError, ErrorMessages.UNKNOWN_ATTR, key); } } catch (UnknownIdentifierException | UnsupportedMessageException | InvalidArrayIndexException e) { - throw PRaiseNode.raiseUncached(this, PythonErrorType.AttributeError, e); + throw PRaiseNode.raiseStatic(this, PythonErrorType.AttributeError, e); } } } @@ -913,10 +966,10 @@ Object write(Object receiver, Object key, Object value) { } else if (key instanceof Number) { getInterop().writeArrayElement(receiver, ((Number) key).longValue(), value); } else { - throw PRaiseNode.raiseUncached(this, PythonErrorType.AttributeError, ErrorMessages.UNKNOWN_ATTR, key); + throw PRaiseNode.raiseStatic(this, PythonErrorType.AttributeError, ErrorMessages.UNKNOWN_ATTR, key); } } catch (UnknownIdentifierException | UnsupportedMessageException | UnsupportedTypeException | InvalidArrayIndexException e) { - throw PRaiseNode.raiseUncached(this, PythonErrorType.AttributeError, e); + throw PRaiseNode.raiseStatic(this, PythonErrorType.AttributeError, e); } return PNone.NONE; } @@ -936,10 +989,10 @@ Object remove(Object receiver, Object key) { } else if (key instanceof Number) { getInterop().removeArrayElement(receiver, ((Number) key).longValue()); } else { - throw PRaiseNode.raiseUncached(this, PythonErrorType.AttributeError, ErrorMessages.UNKNOWN_ATTR, key); + throw PRaiseNode.raiseStatic(this, PythonErrorType.AttributeError, ErrorMessages.UNKNOWN_ATTR, key); } } catch (UnknownIdentifierException | UnsupportedMessageException | InvalidArrayIndexException e) { - throw PRaiseNode.raiseUncached(this, PythonErrorType.AttributeError, e); + throw PRaiseNode.raiseStatic(this, PythonErrorType.AttributeError, e); } return PNone.NONE; } @@ -951,11 +1004,11 @@ public abstract static class executeNode extends PythonBuiltinNode { @Specialization static Object exec(Object receiver, Object[] arguments, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { return getInterop().execute(receiver, arguments); } catch (UnsupportedMessageException | UnsupportedTypeException | ArityException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.AttributeError, e); + throw raiseNode.raise(inliningTarget, PythonErrorType.AttributeError, e); } } } @@ -966,11 +1019,11 @@ public abstract static class newNode extends PythonBuiltinNode { @Specialization static Object instantiate(Object receiver, Object[] arguments, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { return getInterop().instantiate(receiver, arguments); } catch (UnsupportedMessageException | UnsupportedTypeException | ArityException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.AttributeError, e); + throw raiseNode.raise(inliningTarget, PythonErrorType.AttributeError, e); } } } @@ -982,11 +1035,11 @@ public abstract static class invokeNode extends PythonBuiltinNode { static Object invoke(Object receiver, TruffleString key, Object[] arguments, @Bind("this") Node inliningTarget, @Cached TruffleString.ToJavaStringNode toJavaStringNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { return getInterop().invokeMember(receiver, toJavaStringNode.execute(key), arguments); } catch (UnsupportedMessageException | UnsupportedTypeException | ArityException | UnknownIdentifierException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.AttributeError, e); + throw raiseNode.raise(inliningTarget, PythonErrorType.AttributeError, e); } } } @@ -1015,11 +1068,11 @@ public abstract static class GetSizeNode extends PythonBuiltinNode { @Specialization static Object getSize(Object receiver, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { return getInterop().getArraySize(receiver); } catch (UnsupportedMessageException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, e); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, e); } } } @@ -1082,18 +1135,18 @@ public abstract static class KeysNode extends PythonBuiltinNode { @Specialization static Object remove(Object receiver, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { return getInterop().getMembers(receiver); } catch (UnsupportedMessageException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, e); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, e); } } } @Builtin(name = "__element_info__", minNumOfPositionalArgs = 3) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerTypes.class) public abstract static class ArrayElementInfoNode extends PythonBuiltinNode { @Specialization static boolean keyInfo(Object receiver, long member, TruffleString info, @@ -1118,7 +1171,6 @@ static boolean keyInfo(Object receiver, long member, TruffleString info, @Builtin(name = "storage", minNumOfPositionalArgs = 1) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) public abstract static class StorageNode extends PythonUnaryBuiltinNode { @Specialization @TruffleBoundary @@ -1131,15 +1183,15 @@ static Object doSequence(PSequence seq, } else if (storage instanceof ArrayBasedSequenceStorage basicStorage) { arrayObject = basicStorage.getInternalArrayObject(); } else { - throw PRaiseNode.raiseUncached(inliningTarget, PythonBuiltinClassType.NotImplementedError, ErrorMessages.GETTING_POLYGLOT_STORAGE_FOR_NATIVE_STORAGE_NOT_IMPLEMENTED); + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.NotImplementedError, ErrorMessages.GETTING_POLYGLOT_STORAGE_FOR_NATIVE_STORAGE_NOT_IMPLEMENTED); } return PythonContext.get(inliningTarget).getEnv().asGuestValue(arrayObject); } @Fallback static Object doError(Object object, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_P, object); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_P, object); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PosixModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PosixModuleBuiltins.java index 33ff0286fc..67b859e10a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PosixModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PosixModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -43,11 +43,14 @@ import java.math.BigInteger; import java.security.SecureRandom; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; import com.oracle.graal.python.annotations.ArgumentClinic.PrimitiveType; @@ -66,8 +69,6 @@ import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary; import com.oracle.graal.python.builtins.objects.bytes.BytesNodes; import com.oracle.graal.python.builtins.objects.bytes.PBytes; -import com.oracle.graal.python.builtins.objects.common.EconomicMapStorage; -import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes; import com.oracle.graal.python.builtins.objects.common.SequenceNodes.LenNode; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetItemNode; @@ -86,9 +87,12 @@ import com.oracle.graal.python.lib.PyLongAsLongAndOverflowNode; import com.oracle.graal.python.lib.PyLongAsLongNode; import com.oracle.graal.python.lib.PyLongCheckNode; +import com.oracle.graal.python.lib.PyNumberDivmodNode; import com.oracle.graal.python.lib.PyNumberIndexNode; import com.oracle.graal.python.lib.PyOSFSPathNode; import com.oracle.graal.python.lib.PyObjectAsFileDescriptor; +import com.oracle.graal.python.lib.PyObjectGetAttr; +import com.oracle.graal.python.lib.PyObjectGetItem; import com.oracle.graal.python.lib.PyObjectSizeNode; import com.oracle.graal.python.lib.PyUnicodeCheckNode; import com.oracle.graal.python.nodes.ErrorMessages; @@ -96,19 +100,16 @@ import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; -import com.oracle.graal.python.nodes.expression.BinaryArithmetic; -import com.oracle.graal.python.nodes.expression.BinaryOpNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentCastNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; import com.oracle.graal.python.nodes.util.CastToJavaLongLossyNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.GilNode; @@ -121,18 +122,19 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary.OpenPtyResult; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PosixSupportLibrary.Timeval; +import com.oracle.graal.python.runtime.PosixSupportLibrary.UnsupportedPosixFeatureException; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonExitException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.PSequence; import com.oracle.graal.python.runtime.sequence.storage.LongSequenceStorage; -import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.OverflowException; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.ThreadLocalAction; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; @@ -144,7 +146,6 @@ import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; @@ -158,17 +159,6 @@ public final class PosixModuleBuiltins extends PythonBuiltins { static final StructSequence.BuiltinTypeDescriptor STAT_RESULT_DESC = new StructSequence.BuiltinTypeDescriptor( PythonBuiltinClassType.PStatResult, - // @formatter:off The formatter joins these lines making it less readable - "stat_result: Result from stat, fstat, or lstat.\n\n" + - "This object may be accessed either as a tuple of\n" + - " (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n" + - "or via the attributes st_mode, st_ino, st_dev, st_nlink, st_uid, and so on.\n" + - "\n" + - "Posix/windows: If your platform supports st_blksize, st_blocks, st_rdev,\n" + - "or st_flags, they are available as attributes only.\n" + - "\n" + - "See os.stat for more information.", - // @formatter:on 10, new String[]{ "st_mode", "st_ino", "st_dev", "st_nlink", "st_uid", "st_gid", "st_size", @@ -186,14 +176,6 @@ public final class PosixModuleBuiltins extends PythonBuiltins { static final StructSequence.BuiltinTypeDescriptor STATVFS_RESULT_DESC = new StructSequence.BuiltinTypeDescriptor( PythonBuiltinClassType.PStatvfsResult, - // @formatter:off The formatter joins these lines making it less readable - "statvfs_result: Result from statvfs or fstatvfs.\n\n" + - "This object may be accessed either as a tuple of\n" + - " (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax),\n" + - "or via the attributes f_bsize, f_frsize, f_blocks, f_bfree, and so on.\n" + - "\n" + - "See os.statvfs for more information.", - // @formatter:on 10, new String[]{ "f_bsize", "f_frsize", "f_blocks", "f_bfree", "f_bavail", "f_files", @@ -203,21 +185,12 @@ public final class PosixModuleBuiltins extends PythonBuiltins { private static final StructSequence.BuiltinTypeDescriptor TERMINAL_SIZE_DESC = new StructSequence.BuiltinTypeDescriptor( PythonBuiltinClassType.PTerminalSize, - "A tuple of (columns, lines) for holding terminal window size", 2, new String[]{"columns", "lines"}, new String[]{"width of the terminal window in characters", "height of the terminal window in characters"}); private static final StructSequence.BuiltinTypeDescriptor UNAME_RESULT_DESC = new StructSequence.BuiltinTypeDescriptor( PythonBuiltinClassType.PUnameResult, - // @formatter:off The formatter joins these lines making it less readable - "uname_result: Result from os.uname().\n\n" + - "This object may be accessed either as a tuple of\n" + - " (sysname, nodename, release, version, machine),\n" + - "or via the attributes sysname, nodename, release, version, and machine.\n" + - "\n" + - "See os.uname for more information.", - // @formatter:on 5, new String[]{"sysname", "nodename", "release", "version", "machine"}, new String[]{ @@ -225,6 +198,9 @@ public final class PosixModuleBuiltins extends PythonBuiltins { "operating system release", "operating system version", "hardware identifier" }); + // WNOHANG is not defined on windows, but emulated backend should support it even there + public static final int EMULATED_WNOHANG = 1; + @Override protected List> getNodeFactories() { return PosixModuleBuiltinsFactory.getFactories(); @@ -275,9 +251,24 @@ public void initialize(Python3Core core) { haveFunctions.add(tsLiteral("HAVE_FTRUNCATE")); haveFunctions.add(tsLiteral("MS_WINDOWS")); } - addBuiltinConstant("_have_functions", core.factory().createList(haveFunctions.toArray())); - addBuiltinConstant("environ", core.factory().createDict()); - addBuiltinConstant("sysconf_names", core.factory().createDict()); + PythonLanguage language = core.getLanguage(); + addBuiltinConstant("_have_functions", PFactory.createList(language, haveFunctions.toArray())); + addBuiltinConstant("environ", PFactory.createDict(language)); + + LinkedHashMap sysconfigNames = new LinkedHashMap<>(); + for (IntConstant name : PosixConstants.sysconfigNames) { + if (name.defined) { + // add the constant without the leading underscore + String pythonName; + if (name.name.startsWith("_")) { + pythonName = name.name.substring(1); + } else { + pythonName = name.name; + } + sysconfigNames.put(pythonName, name.getValueIfDefined()); + } + } + addBuiltinConstant("sysconf_names", PFactory.createDictFromMap(language, sysconfigNames)); StructSequence.initType(core, STAT_RESULT_DESC); StructSequence.initType(core, STATVFS_RESULT_DESC); @@ -310,11 +301,12 @@ public void postInitialize(Python3Core core) { PosixSupportLibrary posixLib = PosixSupportLibrary.getUncached(); Object posixSupport = core.getContext().getPosixSupport(); + PythonLanguage language = core.getLanguage(); // fill the environ dictionary with the current environment // TODO we should probably use PosixSupportLibrary to get environ - Map getenv = System.getenv(); - PDict environ = core.factory().createDict(); + Map getenv = core.getContext().getEnv().getEnvironment(); + PDict environ = PFactory.createDict(language); String pyenvLauncherKey = "__PYVENV_LAUNCHER__"; for (Entry entry : getenv.entrySet()) { if (entry.getKey().equals("GRAAL_PYTHON_ARGS") && entry.getValue().endsWith("\013")) { @@ -324,9 +316,13 @@ public void postInitialize(Python3Core core) { } Object key, val; if (PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32) { + if (entry.getKey().startsWith("=")) { + // Hidden variable, shouldn't be visible to python + continue; + } key = toTruffleStringUncached(entry.getKey()); } else { - key = core.factory().createBytes(entry.getKey().getBytes()); + key = PFactory.createBytes(language, entry.getKey().getBytes()); } if (pyenvLauncherKey.equals(entry.getKey())) { // On Mac, the CPython launcher uses this env variable to specify the real Python @@ -342,13 +338,13 @@ public void postInitialize(Python3Core core) { if (PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32) { val = value; } else { - val = core.factory().createBytes(value.toJavaStringUncached().getBytes()); + val = PFactory.createBytes(language, value.toJavaStringUncached().getBytes()); } } else { if (PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32) { val = toTruffleStringUncached(entry.getValue()); } else { - val = core.factory().createBytes((entry.getValue().getBytes())); + val = PFactory.createBytes(language, (entry.getValue().getBytes())); } } environ.setItem(key, val); @@ -356,15 +352,6 @@ public void postInitialize(Python3Core core) { if (PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32) { // XXX: Until we fix pip environ.setItem(toTruffleStringUncached("PIP_NO_CACHE_DIR"), toTruffleStringUncached("0")); - // XXX: Until we have working winapi and winreg modules for MSVC discovery - environ.setItem(toTruffleStringUncached("DISTUTILS_USE_SDK"), toTruffleStringUncached("1")); - if (getenv.get("MSSdk") == null) { - String sdkdir = getenv.get("WindowsSdkDir"); - if (sdkdir == null) { - sdkdir = "unset"; - } - environ.setItem(toTruffleStringUncached("MSSdk"), toTruffleStringUncached(sdkdir)); - } } PythonModule posix; if (PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32) { @@ -375,44 +362,12 @@ public void postInitialize(Python3Core core) { Object environAttr = posix.getAttribute(tsLiteral("environ")); ((PDict) environAttr).setDictStorage(environ.getDictStorage()); - PDict sysconfNamesAttr = (PDict) posix.getAttribute(tsLiteral("sysconf_names")); - sysconfNamesAttr.setDictStorage(HashingStorageNodes.HashingStorageCopy.executeUncached(SysconfNode.SYSCONF_NAMES)); - if (posixLib.getBackend(posixSupport).toJavaStringUncached().equals("java")) { posix.setAttribute(toTruffleStringUncached("statvfs"), PNone.NO_VALUE); posix.setAttribute(toTruffleStringUncached("geteuid"), PNone.NO_VALUE); posix.setAttribute(toTruffleStringUncached("getegid"), PNone.NO_VALUE); - } - } - - @Builtin(name = "stat_result", minNumOfPositionalArgs = 1, parameterNames = {"$cls", "sequence", "dict"}, constructsClass = PythonBuiltinClassType.PStatResult) - @ImportStatic(PosixModuleBuiltins.class) - @GenerateNodeFactory - public abstract static class StatResultNode extends PythonTernaryBuiltinNode { - - @Specialization - public static PTuple generic(VirtualFrame frame, Object cls, Object sequence, Object dict, - @Cached("create(STAT_RESULT_DESC)") StructSequence.NewNode newNode) { - PTuple p = (PTuple) newNode.execute(frame, cls, sequence, dict); - Object[] data = CompilerDirectives.castExact(p.getSequenceStorage(), ObjectSequenceStorage.class).getInternalObjectArray(); - for (int i = 7; i <= 9; i++) { - if (data[i + 3] == PNone.NONE) { - data[i + 3] = data[i]; - } - } - return p; - } - } - - @Builtin(name = "statvfs_result", minNumOfPositionalArgs = 1, parameterNames = {"$cls", "sequence", "dict"}, constructsClass = PythonBuiltinClassType.PStatvfsResult) - @ImportStatic(PosixModuleBuiltins.class) - @GenerateNodeFactory - public abstract static class StatvfsResultNode extends PythonTernaryBuiltinNode { - @Specialization - public static Object generic(VirtualFrame frame, Object cls, Object sequence, Object dict, - @Cached("create(STATVFS_RESULT_DESC)") StructSequence.NewNode newNode) { - return newNode.execute(frame, cls, sequence, dict); + posix.setAttribute(toTruffleStringUncached("WNOHANG"), EMULATED_WNOHANG); } } @@ -432,15 +387,16 @@ static PNone putenv(VirtualFrame frame, PBytes nameBytes, PBytes valueBytes, @Bind("this") Node inliningTarget, @Cached BytesNodes.ToBytesNode toBytesNode, @Cached SysModuleBuiltins.AuditNode auditNode, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { // Unlike in other posix builtins, we go through str -> bytes -> byte[] -> String // conversions for emulated backend because the bytes version after fsencode conversion // is subject to sys.audit. byte[] name = toBytesNode.execute(nameBytes); byte[] value = toBytesNode.execute(valueBytes); - PosixSupport posixSupport = PosixSupport.get(inliningTarget); + PosixSupport posixSupport = context.getPosixSupport(); Object nameOpaque = checkNull(inliningTarget, posixLib.createPathFromBytes(posixSupport, name), raiseNode); Object valueOpaque = checkNull(inliningTarget, posixLib.createPathFromBytes(posixSupport, value), raiseNode); checkEqualSign(inliningTarget, name, raiseNode); @@ -453,17 +409,17 @@ static PNone putenv(VirtualFrame frame, PBytes nameBytes, PBytes valueBytes, return PNone.NONE; } - private static Object checkNull(Node inliningTarget, Object value, PRaiseNode.Lazy raiseNode) { + private static Object checkNull(Node inliningTarget, Object value, PRaiseNode raiseNode) { if (value == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.EMBEDDED_NULL_BYTE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.EMBEDDED_NULL_BYTE); } return value; } - private static void checkEqualSign(Node inliningTarget, byte[] bytes, PRaiseNode.Lazy raiseNode) { + private static void checkEqualSign(Node inliningTarget, byte[] bytes, PRaiseNode raiseNode) { for (byte b : bytes) { if (b == '=') { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.ILLEGAL_ENVIRONMENT_VARIABLE_NAME); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.ILLEGAL_ENVIRONMENT_VARIABLE_NAME); } } } @@ -480,27 +436,28 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PNone putenv(VirtualFrame frame, PBytes nameBytes, + static PNone putenv(VirtualFrame frame, PBytes nameBytes, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached BytesNodes.ToBytesNode toBytesNode, @Cached SysModuleBuiltins.AuditNode auditNode, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { byte[] name = toBytesNode.execute(nameBytes); - Object nameOpaque = checkNull(inliningTarget, posixLib.createPathFromBytes(getPosixSupport(), name), raiseNode); + Object nameOpaque = checkNull(inliningTarget, posixLib.createPathFromBytes(context.getPosixSupport(), name), raiseNode); auditNode.audit(inliningTarget, "os.unsetenv", nameBytes); try { - posixLib.unsetenv(getPosixSupport(), nameOpaque); + posixLib.unsetenv(context.getPosixSupport(), nameOpaque); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } return PNone.NONE; } - private static Object checkNull(Node inliningTarget, Object value, PRaiseNode.Lazy raiseNode) { + private static Object checkNull(Node inliningTarget, Object value, PRaiseNode raiseNode) { if (value == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.EMBEDDED_NULL_BYTE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.EMBEDDED_NULL_BYTE); } return value; } @@ -519,50 +476,53 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static Object execvArgsList(VirtualFrame frame, PosixPath path, PList argv, @Bind("this") Node inliningTarget, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared @Cached ToArrayNode toArrayNode, @Shared @Cached ObjectToOpaquePathNode toOpaquePathNode, @Shared @Cached SysModuleBuiltins.AuditNode auditNode, @Shared @Cached GilNode gil, @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - execv(frame, path, argv, argv.getSequenceStorage(), inliningTarget, posixLib, toArrayNode, toOpaquePathNode, auditNode, gil, constructAndRaiseNode, raiseNode); + @Shared @Cached PRaiseNode raiseNode) { + execv(frame, path, argv, argv.getSequenceStorage(), inliningTarget, posixLib, context.getPosixSupport(), toArrayNode, toOpaquePathNode, auditNode, gil, constructAndRaiseNode, raiseNode); throw CompilerDirectives.shouldNotReachHere("execv should not return normally"); } @Specialization static Object execvArgsTuple(VirtualFrame frame, PosixPath path, PTuple argv, @Bind("this") Node inliningTarget, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared @Cached ToArrayNode toArrayNode, @Shared @Cached ObjectToOpaquePathNode toOpaquePathNode, @Shared @Cached AuditNode auditNode, @Shared @Cached GilNode gil, @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - execv(frame, path, argv, argv.getSequenceStorage(), inliningTarget, posixLib, toArrayNode, toOpaquePathNode, auditNode, gil, constructAndRaiseNode, raiseNode); + @Shared @Cached PRaiseNode raiseNode) { + execv(frame, path, argv, argv.getSequenceStorage(), inliningTarget, posixLib, context.getPosixSupport(), toArrayNode, toOpaquePathNode, auditNode, gil, constructAndRaiseNode, raiseNode); throw CompilerDirectives.shouldNotReachHere("execv should not return normally"); } @Specialization(guards = {"!isList(argv)", "!isPTuple(argv)"}) @SuppressWarnings("unused") static Object execvInvalidArgs(VirtualFrame frame, PosixPath path, Object argv, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.ARG_D_MUST_BE_S, "execv()", 2, "tuple or list"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.ARG_D_MUST_BE_S, "execv()", 2, "tuple or list"); } private static void execv(VirtualFrame frame, PosixPath path, Object argv, SequenceStorage argvStorage, Node inliningTarget, PosixSupportLibrary posixLib, + PosixSupport posixSupport, SequenceStorageNodes.ToArrayNode toArrayNode, ObjectToOpaquePathNode toOpaquePathNode, SysModuleBuiltins.AuditNode auditNode, GilNode gil, PConstructAndRaiseNode.Lazy constructAndRaiseNode, - PRaiseNode.Lazy raiseNode) { + PRaiseNode raiseNode) { Object[] args = toArrayNode.execute(inliningTarget, argvStorage); if (args.length < 1) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.ARG_MUST_NOT_BE_EMPTY, "execv()", 2); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.ARG_MUST_NOT_BE_EMPTY, "execv()", 2); } Object[] opaqueArgs = new Object[args.length]; for (int i = 0; i < args.length; ++i) { @@ -574,7 +534,7 @@ private static void execv(VirtualFrame frame, PosixPath path, Object argv, Seque gil.release(true); try { - posixLib.execv(PosixSupport.get(inliningTarget), path.value, opaqueArgs); + posixLib.execv(posixSupport, path.value, opaqueArgs); } catch (PosixException e) { gil.acquire(); throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); @@ -589,8 +549,9 @@ private static void execv(VirtualFrame frame, PosixPath path, Object argv, Seque @GenerateNodeFactory public abstract static class GetPidNode extends PythonBuiltinNode { @Specialization - long getPid(@CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { - return posixLib.getpid(getPosixSupport()); + static long getPid(@Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { + return posixLib.getpid(context.getPosixSupport()); } } @@ -598,8 +559,9 @@ long getPid(@CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { @GenerateNodeFactory public abstract static class GetUidNode extends PythonBuiltinNode { @Specialization - long getUid(@CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { - return posixLib.getuid(getPosixSupport()); + static long getUid(@Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { + return posixLib.getuid(context.getPosixSupport()); } } @@ -607,8 +569,9 @@ long getUid(@CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { @GenerateNodeFactory public abstract static class GetEUidNode extends PythonBuiltinNode { @Specialization - long getUid(@CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib) { - return posixLib.geteuid(getPosixSupport()); + static long getUid(@Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { + return posixLib.geteuid(context.getPosixSupport()); } } @@ -616,8 +579,9 @@ long getUid(@CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib) { @GenerateNodeFactory public abstract static class GetGidNode extends PythonBuiltinNode { @Specialization - long getGid(@CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { - return posixLib.getgid(getPosixSupport()); + static long getGid(@Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { + return posixLib.getgid(context.getPosixSupport()); } } @@ -625,8 +589,9 @@ long getGid(@CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { @GenerateNodeFactory public abstract static class GetEGidNode extends PythonBuiltinNode { @Specialization - long getGid(@CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { - return posixLib.getegid(getPosixSupport()); + static long getGid(@Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { + return posixLib.getegid(context.getPosixSupport()); } } @@ -634,8 +599,9 @@ long getGid(@CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { @GenerateNodeFactory public abstract static class GetPpidNode extends PythonBuiltinNode { @Specialization - long getPpid(@CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { - return posixLib.getppid(getPosixSupport()); + static long getPpid(@Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { + return posixLib.getppid(context.getPosixSupport()); } } @@ -652,17 +618,17 @@ public abstract static class GetLoadAvgNode extends PythonBuiltinNode { */ @TruffleBoundary @Specialization - PTuple getloadavg(@Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory) { + static PTuple getloadavg(@Bind("this") Node inliningTarget, + @Bind PythonLanguage language) { double load = -1.0; // (mq) without native call we can only obtain system load average for the last minute. if (ManagementFactory.getOperatingSystemMXBean() != null) { load = ManagementFactory.getOperatingSystemMXBean().getSystemLoadAverage(); } if (load < 0) { - PRaiseNode.raiseUncached(inliningTarget, OSError); + PRaiseNode.raiseStatic(inliningTarget, OSError); } - return factory.createTuple(new Object[]{load, load, load}); + return PFactory.createTuple(language, new Object[]{load, load, load}); } } @@ -676,12 +642,13 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - long getPgid(VirtualFrame frame, long pid, + static long getPgid(VirtualFrame frame, long pid, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - return posixLib.getpgid(getPosixSupport(), pid); + return posixLib.getpgid(context.getPosixSupport(), pid); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -699,12 +666,13 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - Object setPgid(VirtualFrame frame, long pid, long pgid, + static Object setPgid(VirtualFrame frame, long pid, long pgid, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - posixLib.setpgid(getPosixSupport(), pid, pgid); + posixLib.setpgid(context.getPosixSupport(), pid, pgid); return PNone.NONE; } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); @@ -716,12 +684,13 @@ Object setPgid(VirtualFrame frame, long pid, long pgid, @GenerateNodeFactory public abstract static class SetPgrpdNode extends PythonBuiltinNode { @Specialization - Object getPpid(VirtualFrame frame, + static Object getPpid(VirtualFrame frame, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - posixLib.setpgid(getPosixSupport(), 0, 0); + posixLib.setpgid(context.getPosixSupport(), 0, 0); return PNone.NONE; } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); @@ -733,8 +702,9 @@ Object getPpid(VirtualFrame frame, @GenerateNodeFactory public abstract static class GetPgrpNode extends PythonBuiltinNode { @Specialization - long getPpid(@CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib) { - return posixLib.getpgrp(getPosixSupport()); + static long getPpid(@Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { + return posixLib.getpgrp(context.getPosixSupport()); } } @@ -748,12 +718,13 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - long getSid(VirtualFrame frame, long pid, + static long getSid(VirtualFrame frame, long pid, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - return posixLib.getsid(getPosixSupport(), pid); + return posixLib.getsid(context.getPosixSupport(), pid); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -765,12 +736,13 @@ long getSid(VirtualFrame frame, long pid, public abstract static class SetSidNode extends PythonBuiltinNode { @Specialization - Object setsid(VirtualFrame frame, + static Object setsid(VirtualFrame frame, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - posixLib.setsid(getPosixSupport()); + posixLib.setsid(context.getPosixSupport()); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -782,14 +754,14 @@ Object setsid(VirtualFrame frame, @GenerateNodeFactory abstract static class GetGroupsNode extends PythonBuiltinNode { @Specialization - Object getgroups(VirtualFrame frame, + static Object getgroups(VirtualFrame frame, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - long[] groups = posixLib.getgroups(getPosixSupport()); - return factory.createList(new LongSequenceStorage(groups)); + long[] groups = posixLib.getgroups(context.getPosixSupport()); + return PFactory.createList(context.getLanguage(inliningTarget), new LongSequenceStorage(groups)); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -801,16 +773,16 @@ Object getgroups(VirtualFrame frame, public abstract static class OpenPtyNode extends PythonBuiltinNode { @Specialization - Object openpty(VirtualFrame frame, + static Object openpty(VirtualFrame frame, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - OpenPtyResult result = posixLib.openpty(getPosixSupport()); - posixLib.setInheritable(getPosixSupport(), result.masterFd(), false); - posixLib.setInheritable(getPosixSupport(), result.slaveFd(), false); - return factory.createTuple(new int[]{result.masterFd(), result.slaveFd()}); + OpenPtyResult result = posixLib.openpty(context.getPosixSupport()); + posixLib.setInheritable(context.getPosixSupport(), result.masterFd(), false); + posixLib.setInheritable(context.getPosixSupport(), result.slaveFd(), false); + return PFactory.createTuple(context.getLanguage(inliningTarget), new int[]{result.masterFd(), result.slaveFd()}); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -831,9 +803,10 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - int open(VirtualFrame frame, PosixPath path, int flags, int mode, int dirFd, + static int open(VirtualFrame frame, PosixPath path, int flags, int mode, int dirFd, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached SysModuleBuiltins.AuditNode auditNode, @Cached InlinedBranchProfile errorProfile, @Cached GilNode gil, @@ -847,11 +820,11 @@ int open(VirtualFrame frame, PosixPath path, int flags, int mode, int dirFd, try { while (true) { try { - return posixLib.openat(getPosixSupport(), dirFd, path.value, fixedFlags, mode); + return posixLib.openat(context.getPosixSupport(), dirFd, path.value, fixedFlags, mode); } catch (PosixException e) { errorProfile.enter(inliningTarget); if (e.getErrorCode() == OSErrorEnum.EINTR.getNumber()) { - PythonContext.triggerAsyncActions(this); + PythonContext.triggerAsyncActions(inliningTarget); } else { gil.acquire(); // need GIL to construct OSError throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, path.originalObject); @@ -875,19 +848,19 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PNone close(VirtualFrame frame, int fd, + static PNone close(VirtualFrame frame, int fd, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached GilNode gil, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - PythonContext ctx = getContext(); - if (ctx.getSharedMultiprocessingData().decrementFDRefCount(fd)) { + if (context.getSharedMultiprocessingData().decrementFDRefCount(fd)) { return PNone.NONE; } gil.release(true); try { - posixLib.close(getPosixSupport(), fd); + posixLib.close(context.getPosixSupport(), fd); } finally { gil.acquire(); } @@ -910,45 +883,46 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PBytes doRead(VirtualFrame frame, int fd, int length, + static PBytes doRead(VirtualFrame frame, int fd, int length, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached InlinedBranchProfile errorProfile1, @Cached InlinedBranchProfile errorProfile2, @Cached GilNode gil, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { if (length < 0) { int error = OSErrorEnum.EINVAL.getNumber(); - throw constructAndRaiseNode.get(inliningTarget).raiseOSError(frame, error, posixLib.strerror(getPosixSupport(), error)); + throw constructAndRaiseNode.get(inliningTarget).raiseOSError(frame, error, posixLib.strerror(context.getPosixSupport(), error)); } try { - return read(fd, length, inliningTarget, posixLib, errorProfile1, gil, factory); + return read(fd, length, inliningTarget, posixLib, context.getPosixSupport(), errorProfile1, gil); } catch (PosixException e) { errorProfile2.enter(inliningTarget); throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } } - public PBytes read(int fd, int length, + public static PBytes read(int fd, int length, Node inliningTarget, PosixSupportLibrary posixLib, - InlinedBranchProfile errorProfile, GilNode gil, PythonObjectFactory factory) throws PosixException { + PosixSupport posixSupport, + InlinedBranchProfile errorProfile, GilNode gil) throws PosixException { gil.release(true); try { while (true) { try { - Buffer result = posixLib.read(getPosixSupport(), fd, length); + Buffer result = posixLib.read(posixSupport, fd, length); if (result.length > Integer.MAX_VALUE) { // sanity check that it is safe to cast result.length to int, to be // removed once we support large arrays throw CompilerDirectives.shouldNotReachHere("Posix read() returned more bytes than requested"); } - return factory.createBytes(result.data, 0, (int) result.length); + return PFactory.createBytes(PythonLanguage.get(inliningTarget), result.data, (int) result.length); } catch (PosixException e) { errorProfile.enter(inliningTarget); if (e.getErrorCode() == OSErrorEnum.EINTR.getNumber()) { - PythonContext.triggerAsyncActions(this); + PythonContext.triggerAsyncActions(inliningTarget); } else { throw e; } @@ -976,12 +950,13 @@ static long doWrite(VirtualFrame frame, int fd, Object dataBuffer, @Bind("this") Node inliningTarget, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("dataBuffer") PythonBufferAccessLibrary bufferLib, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached InlinedBranchProfile errorProfile, @Cached GilNode gil, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - return write(fd, bufferLib.getInternalOrCopiedByteArray(dataBuffer), bufferLib.getBufferLength(dataBuffer), inliningTarget, posixLib, errorProfile, gil); + return write(fd, bufferLib.getInternalOrCopiedByteArray(dataBuffer), bufferLib.getBufferLength(dataBuffer), inliningTarget, posixLib, context.getPosixSupport(), errorProfile, gil); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } finally { @@ -990,13 +965,13 @@ static long doWrite(VirtualFrame frame, int fd, Object dataBuffer, } public static long write(int fd, byte[] dataBytes, - int dataLen, Node inliningTarget, PosixSupportLibrary posixLib, + int dataLen, Node inliningTarget, PosixSupportLibrary posixLib, PosixSupport posixSupport, InlinedBranchProfile errorProfile, GilNode gil) throws PosixException { gil.release(true); try { while (true) { try { - return posixLib.write(PosixSupport.get(inliningTarget), fd, new Buffer(dataBytes, dataLen)); + return posixLib.write(posixSupport, fd, new Buffer(dataBytes, dataLen)); } catch (PosixException e) { errorProfile.enter(inliningTarget); if (e.getErrorCode() == OSErrorEnum.EINTR.getNumber()) { @@ -1023,12 +998,13 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - int dup(VirtualFrame frame, int fd, + static int dup(VirtualFrame frame, int fd, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - return posixLib.dup(getPosixSupport(), fd); + return posixLib.dup(context.getPosixSupport(), fd); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -1048,19 +1024,20 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - int dup2(VirtualFrame frame, int fd, int fd2, boolean inheritable, + static int dup2(VirtualFrame frame, int fd, int fd2, boolean inheritable, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { if (fd < 0 || fd2 < 0) { // CPython does not set errno here and raises a 'random' OSError // (possibly with errno=0 Success) int error = OSErrorEnum.EINVAL.getNumber(); - throw constructAndRaiseNode.get(inliningTarget).raiseOSError(frame, error, posixLib.strerror(getPosixSupport(), error)); + throw constructAndRaiseNode.get(inliningTarget).raiseOSError(frame, error, posixLib.strerror(context.getPosixSupport(), error)); } try { - return posixLib.dup2(getPosixSupport(), fd, fd2, inheritable); + return posixLib.dup2(context.getPosixSupport(), fd, fd2, inheritable); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -1078,12 +1055,13 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - boolean getInheritable(VirtualFrame frame, int fd, + static boolean getInheritable(VirtualFrame frame, int fd, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - return posixLib.getInheritable(getPosixSupport(), fd); + return posixLib.getInheritable(context.getPosixSupport(), fd); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -1102,13 +1080,14 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PNone setInheritable(VirtualFrame frame, int fd, int inheritable, + static PNone setInheritable(VirtualFrame frame, int fd, int inheritable, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { // not sure why inheritable is not a boolean, but that is how they do it in CPython - posixLib.setInheritable(getPosixSupport(), fd, inheritable != 0); + posixLib.setInheritable(context.getPosixSupport(), fd, inheritable != 0); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -1121,23 +1100,23 @@ PNone setInheritable(VirtualFrame frame, int fd, int inheritable, abstract static class PipeNode extends PythonBuiltinNode { @Specialization - PTuple pipe(VirtualFrame frame, + static PTuple pipe(VirtualFrame frame, @Bind("this") Node inliningTarget, @Cached GilNode gil, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { int[] pipe; gil.release(true); try { - pipe = posixLib.pipe(getPosixSupport()); + pipe = posixLib.pipe(context.getPosixSupport()); } catch (PosixException e) { gil.acquire(); // need to acquire the gil to construct the OSError object throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } finally { gil.acquire(); } - return factory.createTuple(new Object[]{pipe[0], pipe[1]}); + return PFactory.createTuple(context.getLanguage(inliningTarget), new Object[]{pipe[0], pipe[1]}); } } @@ -1168,12 +1147,13 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - long lseek(VirtualFrame frame, int fd, long pos, int how, + static long lseek(VirtualFrame frame, int fd, long pos, int how, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - return posixLib.lseek(getPosixSupport(), fd, pos, mapPythonSeekWhenceToPosix(how)); + return posixLib.lseek(context.getPosixSupport(), fd, pos, mapPythonSeekWhenceToPosix(how)); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -1194,8 +1174,8 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static PNone ftruncate(VirtualFrame frame, int fd, long length, @Bind("this") Node inliningTarget, - @Bind("getPosixSupport()") PosixSupport posixSupport, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached SysModuleBuiltins.AuditNode auditNode, @Cached GilNode gil, @Cached InlinedBranchProfile errorProfile, @@ -1205,7 +1185,7 @@ static PNone ftruncate(VirtualFrame frame, int fd, long length, try { gil.release(true); try { - posixLib.ftruncate(posixSupport, fd, length); + posixLib.ftruncate(context.getPosixSupport(), fd, length); } finally { gil.acquire(); } @@ -1236,8 +1216,8 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static PNone truncate(VirtualFrame frame, PosixPath path, long length, @Bind("this") Node inliningTarget, - @Bind("getPosixSupport()") PosixSupport posixSupport, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared @Cached SysModuleBuiltins.AuditNode auditNode, @Shared @Cached GilNode gil, @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { @@ -1245,7 +1225,7 @@ static PNone truncate(VirtualFrame frame, PosixPath path, long length, try { gil.release(true); try { - posixLib.truncate(posixSupport, path.value, length); + posixLib.truncate(context.getPosixSupport(), path.value, length); } finally { gil.acquire(); } @@ -1258,13 +1238,13 @@ static PNone truncate(VirtualFrame frame, PosixPath path, long length, @Specialization static PNone ftruncate(VirtualFrame frame, PosixFd fd, long length, @Bind("this") Node inliningTarget, - @Bind("getPosixSupport()") PosixSupport posixSupport, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared @Cached SysModuleBuiltins.AuditNode auditNode, @Shared @Cached GilNode gil, @Cached InlinedBranchProfile errorProfile, @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { - return FtruncateNode.ftruncate(frame, fd.fd, length, inliningTarget, posixSupport, posixLib, auditNode, gil, errorProfile, constructAndRaiseNode); + return FtruncateNode.ftruncate(frame, fd.fd, length, inliningTarget, context, posixLib, auditNode, gil, errorProfile, constructAndRaiseNode); } } @@ -1279,19 +1259,20 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PNone fsync(VirtualFrame frame, int fd, + static PNone fsync(VirtualFrame frame, int fd, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached InlinedBranchProfile errorProfile, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { while (true) { try { - posixLib.fsync(getPosixSupport(), fd); + posixLib.fsync(context.getPosixSupport(), fd); return PNone.NONE; } catch (PosixException e) { errorProfile.enter(inliningTarget); if (e.getErrorCode() == OSErrorEnum.EINTR.getNumber()) { - PythonContext.triggerAsyncActions(this); + PythonContext.triggerAsyncActions(inliningTarget); } else { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -1311,12 +1292,13 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - boolean getBlocking(VirtualFrame frame, int fd, + static boolean getBlocking(VirtualFrame frame, int fd, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - return posixLib.getBlocking(getPosixSupport(), fd); + return posixLib.getBlocking(context.getPosixSupport(), fd); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -1335,12 +1317,13 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PNone setBlocking(VirtualFrame frame, int fd, boolean blocking, + static PNone setBlocking(VirtualFrame frame, int fd, boolean blocking, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - posixLib.setBlocking(getPosixSupport(), fd, blocking); + posixLib.setBlocking(context.getPosixSupport(), fd, blocking); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -1359,15 +1342,15 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PTuple getTerminalSize(VirtualFrame frame, int fd, + static PTuple getTerminalSize(VirtualFrame frame, int fd, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { // TODO default value should be fileno(stdout) try { - int[] result = posixLib.getTerminalSize(getPosixSupport(), fd); - return factory.createStructSeq(TERMINAL_SIZE_DESC, result[0], result[1]); + int[] result = posixLib.getTerminalSize(context.getPosixSupport(), fd); + return PFactory.createStructSeq(context.getLanguage(inliningTarget), TERMINAL_SIZE_DESC, result[0], result[1]); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -1387,15 +1370,15 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PTuple doStatPath(VirtualFrame frame, PosixPath path, int dirFd, boolean followSymlinks, + static PTuple doStatPath(VirtualFrame frame, PosixPath path, int dirFd, boolean followSymlinks, @Bind("this") Node inliningTarget, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared("positive") @Cached InlinedConditionProfile positiveLongProfile, - @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Shared @Cached PythonObjectFactory factory) { + @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - long[] out = posixLib.fstatat(getPosixSupport(), dirFd, path.value, followSymlinks); - return createStatResult(inliningTarget, factory, positiveLongProfile, out); + long[] out = posixLib.fstatat(context.getPosixSupport(), dirFd, path.value, followSymlinks); + return createStatResult(inliningTarget, context.getLanguage(inliningTarget), positiveLongProfile, out); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, path.originalObject); } @@ -1404,27 +1387,27 @@ PTuple doStatPath(VirtualFrame frame, PosixPath path, int dirFd, boolean followS @Specialization(guards = "!isDefault(dirFd)") @SuppressWarnings("unused") static PTuple doStatFdWithDirFd(PosixFd fd, int dirFd, boolean followSymlinks, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.CANT_SPECIFY_DIRFD_WITHOUT_PATH, "stat"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.CANT_SPECIFY_DIRFD_WITHOUT_PATH, "stat"); } @Specialization(guards = {"isDefault(dirFd)", "!followSymlinks"}) @SuppressWarnings("unused") static PTuple doStatFdWithFollowSymlinks(VirtualFrame frame, PosixFd fd, int dirFd, boolean followSymlinks, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.CANNOT_USE_FD_AND_FOLLOW_SYMLINKS_TOGETHER, "stat"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.CANNOT_USE_FD_AND_FOLLOW_SYMLINKS_TOGETHER, "stat"); } @Specialization(guards = {"isDefault(dirFd)", "followSymlinks"}) - PTuple doStatFd(VirtualFrame frame, PosixFd fd, @SuppressWarnings("unused") int dirFd, @SuppressWarnings("unused") boolean followSymlinks, + static PTuple doStatFd(VirtualFrame frame, PosixFd fd, @SuppressWarnings("unused") int dirFd, @SuppressWarnings("unused") boolean followSymlinks, @Bind("this") Node inliningTarget, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared("positive") @Cached InlinedConditionProfile positiveLongProfile, - @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Shared @Cached PythonObjectFactory factory) { + @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - long[] out = posixLib.fstat(getPosixSupport(), fd.fd); - return createStatResult(inliningTarget, factory, positiveLongProfile, out); + long[] out = posixLib.fstat(context.getPosixSupport(), fd.fd); + return createStatResult(inliningTarget, context.getLanguage(inliningTarget), positiveLongProfile, out); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, fd.originalObject); } @@ -1447,16 +1430,16 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PTuple doStatPath(VirtualFrame frame, PosixPath path, int dirFd, + static PTuple doStatPath(VirtualFrame frame, PosixPath path, int dirFd, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached InlinedConditionProfile positiveLongProfile, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { // TODO we used to return all zeros when the filename was equal to sys.executable - long[] out = posixLib.fstatat(getPosixSupport(), dirFd, path.value, false); - return createStatResult(inliningTarget, factory, positiveLongProfile, out); + long[] out = posixLib.fstatat(context.getPosixSupport(), dirFd, path.value, false); + return createStatResult(inliningTarget, context.getLanguage(inliningTarget), positiveLongProfile, out); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, path.originalObject); } @@ -1474,21 +1457,21 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PTuple doStatFd(VirtualFrame frame, int fd, + static PTuple doStatFd(VirtualFrame frame, int fd, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached InlinedConditionProfile positiveLongProfile, @Cached InlinedBranchProfile errorProfile, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { while (true) { try { - long[] out = posixLib.fstat(getPosixSupport(), fd); - return createStatResult(inliningTarget, factory, positiveLongProfile, out); + long[] out = posixLib.fstat(context.getPosixSupport(), fd); + return createStatResult(inliningTarget, context.getLanguage(inliningTarget), positiveLongProfile, out); } catch (PosixException e) { errorProfile.enter(inliningTarget); if (e.getErrorCode() == OSErrorEnum.EINTR.getNumber()) { - PythonContext.triggerAsyncActions(this); + PythonContext.triggerAsyncActions(inliningTarget); } else { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -1497,12 +1480,12 @@ PTuple doStatFd(VirtualFrame frame, int fd, } } - private static PTuple createStatvfsResult(Node inliningTarget, long[] out, InlinedConditionProfile positiveLongProfile, PythonObjectFactory factory) { + private static PTuple createStatvfsResult(Node inliningTarget, long[] out, InlinedConditionProfile positiveLongProfile, PythonLanguage language) { Object[] res = new Object[out.length]; for (int i = 0; i < out.length; i++) { - res[i] = PInt.createPythonIntFromUnsignedLong(inliningTarget, factory, positiveLongProfile, out[i]); + res[i] = PInt.createPythonIntFromUnsignedLong(inliningTarget, language, positiveLongProfile, out[i]); } - return factory.createStructSeq(STATVFS_RESULT_DESC, res); + return PFactory.createStructSeq(language, STATVFS_RESULT_DESC, res); } @Builtin(name = "statvfs", minNumOfPositionalArgs = 1, parameterNames = {"path"}) @@ -1516,24 +1499,24 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PTuple doStatvfs(VirtualFrame frame, PosixFileHandle posixFileHandle, + static PTuple doStatvfs(VirtualFrame frame, PosixFileHandle posixFileHandle, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached InlinedConditionProfile posixPathProfile, @Cached InlinedConditionProfile positiveLongProfile, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { long[] out; try { if (posixPathProfile.profile(inliningTarget, posixFileHandle instanceof PosixPath)) { - out = posixLib.statvfs(getPosixSupport(), ((PosixPath) posixFileHandle).value); + out = posixLib.statvfs(context.getPosixSupport(), ((PosixPath) posixFileHandle).value); } else { - out = posixLib.fstatvfs(getPosixSupport(), ((PosixFd) posixFileHandle).fd); + out = posixLib.fstatvfs(context.getPosixSupport(), ((PosixFd) posixFileHandle).fd); } } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, posixFileHandle.originalObject); } - return createStatvfsResult(inliningTarget, out, positiveLongProfile, factory); + return createStatvfsResult(inliningTarget, out, positiveLongProfile, context.getLanguage(inliningTarget)); } } @@ -1543,19 +1526,19 @@ PTuple doStatvfs(VirtualFrame frame, PosixFileHandle posixFileHandle, abstract static class FStatvfsNode extends PythonUnaryClinicBuiltinNode { @Specialization - PTuple doStatvfs(VirtualFrame frame, int fd, + static PTuple doStatvfs(VirtualFrame frame, int fd, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached InlinedConditionProfile positiveLongProfile, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { long[] out; try { - out = posixLib.fstatvfs(getPosixSupport(), fd); + out = posixLib.fstatvfs(context.getPosixSupport(), fd); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, fd); } - return createStatvfsResult(inliningTarget, out, positiveLongProfile, factory); + return createStatvfsResult(inliningTarget, out, positiveLongProfile, context.getLanguage(inliningTarget)); } @Override @@ -1570,20 +1553,20 @@ protected ArgumentClinicProvider getArgumentClinic() { abstract static class UnameNode extends PythonBuiltinNode { @Specialization - PTuple uname(VirtualFrame frame, + static PTuple uname(VirtualFrame frame, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - return factory.createStructSeq(UNAME_RESULT_DESC, posixLib.uname(getPosixSupport())); + return PFactory.createStructSeq(context.getLanguage(inliningTarget), UNAME_RESULT_DESC, posixLib.uname(context.getPosixSupport())); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } } } - @Builtin(name = "unlink", minNumOfPositionalArgs = 1, parameterNames = {"path"}, varArgsMarker = true, keywordOnlyNames = {"dir_fd"}) + @Builtin(name = "unlink", minNumOfPositionalArgs = 1, parameterNames = {"path"}, keywordOnlyNames = {"dir_fd"}) @ArgumentClinic(name = "path", conversionClass = PathConversionNode.class, args = {"false", "false"}) @ArgumentClinic(name = "dir_fd", conversionClass = DirFdConversionNode.class) @GenerateNodeFactory @@ -1595,14 +1578,15 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PNone unlink(VirtualFrame frame, PosixPath path, int dirFd, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + static PNone unlink(VirtualFrame frame, PosixPath path, int dirFd, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Bind("this") Node inliningTarget, @Cached SysModuleBuiltins.AuditNode auditNode, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { auditNode.audit(inliningTarget, "os.remove", path.originalObject, dirFdForAudit(dirFd)); try { - posixLib.unlinkat(getPosixSupport(), dirFd, path.value, false); + posixLib.unlinkat(context.getPosixSupport(), dirFd, path.value, false); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, path.originalObject); } @@ -1610,7 +1594,7 @@ PNone unlink(VirtualFrame frame, PosixPath path, int dirFd, } } - @Builtin(name = "remove", minNumOfPositionalArgs = 1, parameterNames = {"path"}, varArgsMarker = true, keywordOnlyNames = {"dir_fd"}) + @Builtin(name = "remove", minNumOfPositionalArgs = 1, parameterNames = {"path"}, keywordOnlyNames = {"dir_fd"}) @ArgumentClinic(name = "path", conversionClass = PathConversionNode.class, args = {"false", "false"}) @ArgumentClinic(name = "dir_fd", conversionClass = DirFdConversionNode.class) @GenerateNodeFactory @@ -1640,12 +1624,13 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PNone link(VirtualFrame frame, PosixPath src, PosixPath dst, int srcDirFd, int dstDirFd, boolean followSymlinks, + static PNone link(VirtualFrame frame, PosixPath src, PosixPath dst, int srcDirFd, int dstDirFd, boolean followSymlinks, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - posixLib.linkat(getPosixSupport(), srcDirFd, src.value, dstDirFd, dst.value, followSymlinks ? AT_SYMLINK_FOLLOW.value : 0); + posixLib.linkat(context.getPosixSupport(), srcDirFd, src.value, dstDirFd, dst.value, followSymlinks ? AT_SYMLINK_FOLLOW.value : 0); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, src.originalObject, dst.originalObject); } @@ -1667,12 +1652,13 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PNone symlink(VirtualFrame frame, PosixPath src, PosixPath dst, @SuppressWarnings("unused") boolean targetIsDir, int dirFd, + static PNone symlink(VirtualFrame frame, PosixPath src, PosixPath dst, @SuppressWarnings("unused") boolean targetIsDir, int dirFd, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - posixLib.symlinkat(getPosixSupport(), src.value, dirFd, dst.value); + posixLib.symlinkat(context.getPosixSupport(), src.value, dirFd, dst.value); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, src.originalObject, dst.originalObject); } @@ -1693,14 +1679,15 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PNone mkdir(VirtualFrame frame, PosixPath path, int mode, int dirFd, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + static PNone mkdir(VirtualFrame frame, PosixPath path, int mode, int dirFd, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Bind("this") Node inliningTarget, @Cached SysModuleBuiltins.AuditNode auditNode, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { auditNode.audit(inliningTarget, "os.mkdir", path.originalObject, mode, dirFdForAudit(dirFd)); try { - posixLib.mkdirat(getPosixSupport(), dirFd, path.value, mode); + posixLib.mkdirat(context.getPosixSupport(), dirFd, path.value, mode); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, path.originalObject); } @@ -1720,14 +1707,15 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PNone rmdir(VirtualFrame frame, PosixPath path, int dirFd, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + static PNone rmdir(VirtualFrame frame, PosixPath path, int dirFd, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Bind("this") Node inliningTarget, @Cached SysModuleBuiltins.AuditNode auditNode, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { auditNode.audit(inliningTarget, "os.rmdir", path.originalObject, dirFdForAudit(dirFd)); try { - posixLib.unlinkat(getPosixSupport(), dirFd, path.value, true); + posixLib.unlinkat(context.getPosixSupport(), dirFd, path.value, true); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, path.originalObject); } @@ -1739,12 +1727,13 @@ PNone rmdir(VirtualFrame frame, PosixPath path, int dirFd, @GenerateNodeFactory abstract static class GetcwdNode extends PythonBuiltinNode { @Specialization - TruffleString getcwd(VirtualFrame frame, + static TruffleString getcwd(VirtualFrame frame, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - return posixLib.getPathAsString(getPosixSupport(), posixLib.getcwd(getPosixSupport())); + return posixLib.getPathAsString(context.getPosixSupport(), posixLib.getcwd(context.getPosixSupport())); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -1755,13 +1744,14 @@ TruffleString getcwd(VirtualFrame frame, @GenerateNodeFactory abstract static class GetcwdbNode extends PythonBuiltinNode { @Specialization - PBytes getcwdb(VirtualFrame frame, + static PBytes getcwdb(VirtualFrame frame, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - return opaquePathToBytes(posixLib.getcwd(getPosixSupport()), posixLib, getPosixSupport(), factory); + Object path = posixLib.getcwd(context.getPosixSupport()); + return opaquePathToBytes(path, posixLib, context.getPosixSupport(), context.getLanguage(inliningTarget)); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -1779,12 +1769,13 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PNone chdirPath(VirtualFrame frame, PosixPath path, + static PNone chdirPath(VirtualFrame frame, PosixPath path, @Bind("this") Node inliningTarget, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - posixLib.chdir(getPosixSupport(), path.value); + posixLib.chdir(context.getPosixSupport(), path.value); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, path.originalObject); } @@ -1792,12 +1783,13 @@ PNone chdirPath(VirtualFrame frame, PosixPath path, } @Specialization - PNone chdirFd(VirtualFrame frame, PosixFd fd, + static PNone chdirFd(VirtualFrame frame, PosixFd fd, @Bind("this") Node inliningTarget, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - posixLib.fchdir(getPosixSupport(), fd.fd); + posixLib.fchdir(context.getPosixSupport(), fd.fd); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, fd.originalObject); } @@ -1816,19 +1808,20 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PNone fchdir(VirtualFrame frame, int fd, + static PNone fchdir(VirtualFrame frame, int fd, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached InlinedBranchProfile errorProfile, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { while (true) { try { - posixLib.fchdir(getPosixSupport(), fd); + posixLib.fchdir(context.getPosixSupport(), fd); return PNone.NONE; } catch (PosixException e) { errorProfile.enter(inliningTarget); if (e.getErrorCode() == OSErrorEnum.EINTR.getNumber()) { - PythonContext.triggerAsyncActions(this); + PythonContext.triggerAsyncActions(inliningTarget); } else { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -1848,40 +1841,19 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - boolean isatty(int fd, + static boolean isatty(int fd, @Cached GilNode gil, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { gil.release(true); try { - return posixLib.isatty(getPosixSupport(), fd); + return posixLib.isatty(context.getPosixSupport(), fd); } finally { gil.acquire(); } } } - @Builtin(name = "ScandirIterator", takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PScandirIterator, isPublic = false) - @GenerateNodeFactory - abstract static class ScandirIteratorNode extends PythonBuiltinNode { - @Specialization - @SuppressWarnings("unused") - static Object scandirIterator(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, "posix.ScandirIterator"); - } - } - - @Builtin(name = "DirEntry", takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PDirEntry, isPublic = true) - @GenerateNodeFactory - abstract static class DirEntryNode extends PythonBuiltinNode { - @Specialization - @SuppressWarnings("unused") - static Object dirEntry(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, "posix.DirEntry"); - } - } - @Builtin(name = "scandir", minNumOfPositionalArgs = 0, parameterNames = {"path"}) @ArgumentClinic(name = "path", conversionClass = PathConversionNode.class, args = {"true", "true"}) @GenerateNodeFactory @@ -1893,30 +1865,30 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PScandirIterator scandirPath(VirtualFrame frame, PosixPath path, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + static PScandirIterator scandirPath(VirtualFrame frame, PosixPath path, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Bind("this") Node inliningTarget, @Shared @Cached SysModuleBuiltins.AuditNode auditNode, - @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Shared @Cached PythonObjectFactory factory) { + @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { auditNode.audit(inliningTarget, "os.scandir", path.originalObject == null ? PNone.NONE : path.originalObject); try { - return factory.createScandirIterator(getContext(), posixLib.opendir(getPosixSupport(), path.value), path, false); + return PFactory.createScandirIterator(context.getLanguage(inliningTarget), context, posixLib.opendir(context.getPosixSupport(), path.value), path, false); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, path.originalObject); } } @Specialization - PScandirIterator scandirFd(VirtualFrame frame, PosixFd fd, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + static PScandirIterator scandirFd(VirtualFrame frame, PosixFd fd, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Bind("this") Node inliningTarget, @Shared @Cached SysModuleBuiltins.AuditNode auditNode, - @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Shared @Cached PythonObjectFactory factory) { + @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { auditNode.audit(inliningTarget, "os.scandir", fd.originalObject); - Object dirStream = dupAndFdopendir(frame, inliningTarget, posixLib, getPosixSupport(), fd, constructAndRaiseNode); - return factory.createScandirIterator(getContext(), dirStream, fd, true); + Object dirStream = dupAndFdopendir(frame, inliningTarget, posixLib, context.getPosixSupport(), fd, constructAndRaiseNode); + return PFactory.createScandirIterator(context.getLanguage(inliningTarget), context, dirStream, fd, true); } } @@ -1931,56 +1903,57 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PList listdirPath(VirtualFrame frame, PosixPath path, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + static PList listdirPath(VirtualFrame frame, PosixPath path, @Bind("this") Node inliningTarget, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared @Cached SysModuleBuiltins.AuditNode auditNode, - @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Shared @Cached PythonObjectFactory factory) { + @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { auditNode.audit(inliningTarget, "os.listdir", path.originalObject == null ? PNone.NONE : path.originalObject); try { - return listdir(frame, inliningTarget, posixLib.opendir(getPosixSupport(), path.value), path.wasBufferLike, false, posixLib, constructAndRaiseNode, factory); + return listdir(frame, inliningTarget, posixLib.opendir(context.getPosixSupport(), path.value), path.wasBufferLike, false, posixLib, constructAndRaiseNode, + context.getLanguage(inliningTarget), context.getPosixSupport()); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, path.originalObject); } } @Specialization - PList listdirFd(VirtualFrame frame, PosixFd fd, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + static PList listdirFd(VirtualFrame frame, PosixFd fd, @Bind("this") Node inliningTarget, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared @Cached SysModuleBuiltins.AuditNode auditNode, - @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Shared @Cached PythonObjectFactory factory) { + @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { auditNode.audit(inliningTarget, "os.listdir", fd.originalObject); - Object dirStream = dupAndFdopendir(frame, inliningTarget, posixLib, getPosixSupport(), fd, constructAndRaiseNode); - return listdir(frame, inliningTarget, dirStream, false, true, posixLib, constructAndRaiseNode, factory); + Object dirStream = dupAndFdopendir(frame, inliningTarget, posixLib, context.getPosixSupport(), fd, constructAndRaiseNode); + return listdir(frame, inliningTarget, dirStream, false, true, posixLib, constructAndRaiseNode, context.getLanguage(inliningTarget), context.getPosixSupport()); } - private PList listdir(VirtualFrame frame, Node inliningTarget, Object dirStream, boolean produceBytes, boolean needsRewind, PosixSupportLibrary posixLib, - PConstructAndRaiseNode.Lazy constructAndRaiseNode, PythonObjectFactory factory) { + private static PList listdir(VirtualFrame frame, Node inliningTarget, Object dirStream, boolean produceBytes, boolean needsRewind, PosixSupportLibrary posixLib, + PConstructAndRaiseNode.Lazy constructAndRaiseNode, PythonLanguage language, PosixSupport posixSupport) { List list = new ArrayList<>(); try { while (true) { - Object dirEntry = posixLib.readdir(getPosixSupport(), dirStream); + Object dirEntry = posixLib.readdir(posixSupport, dirStream); if (dirEntry == null) { - return factory.createList(listToArray(list)); + return PFactory.createList(language, listToArray(list)); } - Object name = posixLib.dirEntryGetName(getPosixSupport(), dirEntry); + Object name = posixLib.dirEntryGetName(posixSupport, dirEntry); if (produceBytes) { - addToList(list, opaquePathToBytes(name, posixLib, getPosixSupport(), factory)); + addToList(list, opaquePathToBytes(name, posixLib, posixSupport, language)); } else { - addToList(list, posixLib.getPathAsString(getPosixSupport(), name)); + addToList(list, posixLib.getPathAsString(posixSupport, name)); } } } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } finally { if (needsRewind) { - posixLib.rewinddir(getPosixSupport(), dirStream); + posixLib.rewinddir(posixSupport, dirStream); } try { - posixLib.closedir(getPosixSupport(), dirStream); + posixLib.closedir(posixSupport, dirStream); } catch (PosixException e) { // ignored (CPython does not check the return value of closedir) } @@ -2038,7 +2011,7 @@ static long[] times(VirtualFrame frame, PTuple times, @SuppressWarnings("unused" @Exclusive @Cached LenNode lenNode, @Shared @Cached("createNotNormalized()") GetItemNode getItemNode, @Cached ObjectToTimespecNode objectToTimespecNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { return convertToTimespec(frame, inliningTarget, times, lenNode, getItemNode, objectToTimespecNode, raiseNode); } @@ -2048,42 +2021,43 @@ static long[] ns(VirtualFrame frame, @SuppressWarnings("unused") PNone times, PT @Exclusive @Cached LenNode lenNode, @Shared @Cached("createNotNormalized()") GetItemNode getItemNode, @Cached SplitLongToSAndNsNode splitLongToSAndNsNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { return convertToTimespec(frame, inliningTarget, ns, lenNode, getItemNode, splitLongToSAndNsNode, raiseNode); } @Specialization(guards = {"!isPNone(times)", "!isNoValue(ns)"}) @SuppressWarnings("unused") static long[] bothSpecified(VirtualFrame frame, Object times, Object ns, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.YOU_MAY_SPECIFY_EITHER_OR_BUT_NOT_BOTH, "utime", "times", "ns"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.YOU_MAY_SPECIFY_EITHER_OR_BUT_NOT_BOTH, "utime", "times", "ns"); } @Specialization(guards = {"!isPNone(times)", "!isPTuple(times)", "isNoValue(ns)"}) @SuppressWarnings("unused") static long[] timesNotATuple(VirtualFrame frame, Object times, PNone ns, - @Shared @Cached PRaiseNode raiseNode) { - throw timesTupleError(raiseNode); + @Bind("this") Node inliningTarget, + @Cached PRaiseNode raiseNode) { + throw timesTupleError(inliningTarget, raiseNode); } @Specialization(guards = {"!isNoValue(ns)", "!isPTuple(ns)"}) @SuppressWarnings("unused") static long[] nsNotATuple(VirtualFrame frame, PNone times, Object ns, - @Shared @Cached PRaiseNode raiseNode) { + @Bind("this") Node inliningTarget) { // ns can actually also contain objects implementing __divmod__, but CPython produces // this error message - throw raiseNode.raise(TypeError, ErrorMessages.MUST_BE, "utime", "ns", "a tuple of two ints"); + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.MUST_BE, "utime", "ns", "a tuple of two ints"); } - private static PException timesTupleError(PRaiseNode raiseNode) { + private static PException timesTupleError(Node inliningTarget, PRaiseNode raiseNode) { // times can actually also contain floats, but CPython produces this error message - throw raiseNode.raise(TypeError, ErrorMessages.MUST_BE_EITHER_OR, "utime", "times", "a tuple of two ints", "None"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MUST_BE_EITHER_OR, "utime", "times", "a tuple of two ints", "None"); } private static long[] convertToTimespec(VirtualFrame frame, Node inliningTarget, PTuple times, LenNode lenNode, GetItemNode getItemNode, ConvertToTimespecBaseNode convertToTimespecBaseNode, - PRaiseNode.Lazy raiseNode) { + PRaiseNode raiseNode) { if (lenNode.execute(inliningTarget, times) != 2) { - throw timesTupleError(raiseNode.get(inliningTarget)); + throw timesTupleError(inliningTarget, raiseNode); } long[] timespec = new long[4]; convertToTimespecBaseNode.execute(frame, inliningTarget, getItemNode.execute(times.getSequenceStorage(), 0), timespec, 0); @@ -2092,7 +2066,7 @@ private static long[] convertToTimespec(VirtualFrame frame, Node inliningTarget, } } - @Builtin(name = "utime", minNumOfPositionalArgs = 1, parameterNames = {"path", "times"}, varArgsMarker = true, keywordOnlyNames = {"ns", "dir_fd", "follow_symlinks"}) + @Builtin(name = "utime", minNumOfPositionalArgs = 1, parameterNames = {"path", "times"}, keywordOnlyNames = {"ns", "dir_fd", "follow_symlinks"}) @ArgumentClinic(name = "path", conversionClass = PathConversionNode.class, args = {"false", "true"}) @ArgumentClinic(name = "dir_fd", conversionClass = DirFdConversionNode.class) @ArgumentClinic(name = "follow_symlinks", conversion = ClinicConversion.Boolean, defaultValue = "true") @@ -2114,12 +2088,13 @@ static PNone utimensat(VirtualFrame frame, PosixPath path, Object times, Object @Bind("this") Node inliningTarget, @Shared @Cached UtimeArgsToTimespecNode timespecNode, @Shared @Cached SysModuleBuiltins.AuditNode auditNode, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { long[] timespec = timespecNode.execute(frame, times, ns); auditNode.audit(inliningTarget, "os.utime", path.originalObject, checkNone(times), checkNone(ns), dirFdForAudit(dirFd)); try { - posixLib.utimensat(PosixSupport.get(inliningTarget), dirFd, path.value, timespec, followSymlinks); + posixLib.utimensat(context.getPosixSupport(), dirFd, path.value, timespec, followSymlinks); } catch (PosixException e) { // filename is intentionally not included, see CPython's os_utime_impl throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); @@ -2132,12 +2107,13 @@ static PNone utimes(VirtualFrame frame, PosixPath path, Object times, Object ns, @Bind("this") Node inliningTarget, @Shared @Cached UtimeArgsToTimespecNode timespecNode, @Shared @Cached SysModuleBuiltins.AuditNode auditNode, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { Timeval[] timeval = timespecNode.toTimeval(frame, times, ns); auditNode.audit(inliningTarget, "os.utime", path.originalObject, checkNone(times), checkNone(ns), dirFdForAudit(dirFd)); try { - posixLib.utimes(PosixSupport.get(inliningTarget), path.value, timeval); + posixLib.utimes(context.getPosixSupport(), path.value, timeval); } catch (PosixException e) { // filename is intentionally not included, see CPython's os_utime_impl throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); @@ -2150,12 +2126,13 @@ static PNone lutimes(VirtualFrame frame, PosixPath path, Object times, Object ns @Bind("this") Node inliningTarget, @Shared @Cached UtimeArgsToTimespecNode timespecNode, @Shared @Cached SysModuleBuiltins.AuditNode auditNode, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { Timeval[] timeval = timespecNode.toTimeval(frame, times, ns); auditNode.audit(inliningTarget, "os.utime", path.originalObject, checkNone(times), checkNone(ns), dirFdForAudit(dirFd)); try { - posixLib.lutimes(PosixSupport.get(inliningTarget), path.value, timeval); + posixLib.lutimes(context.getPosixSupport(), path.value, timeval); } catch (PosixException e) { // filename is intentionally not included, see CPython's os_utime_impl throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); @@ -2166,15 +2143,15 @@ static PNone lutimes(VirtualFrame frame, PosixPath path, Object times, Object ns @Specialization(guards = {"!HAVE_UTIMENSAT.value", "!isDefault(dirFd)", "followSymlinks"}) @SuppressWarnings("unused") static PNone dirFdNotSupported(VirtualFrame frame, PosixPath path, Object times, Object ns, int dirFd, boolean followSymlinks, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(NotImplementedError, ErrorMessages.UNAVAILABLE_ON_THIS_PLATFORM_NO_FUNC, "dir_fd"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, ErrorMessages.UNAVAILABLE_ON_THIS_PLATFORM_NO_FUNC, "dir_fd"); } @Specialization(guards = {"!HAVE_UTIMENSAT.value", "!isDefault(dirFd)", "!followSymlinks"}) @SuppressWarnings("unused") static PNone dirFdAndFollowSymlinksNotSupported(VirtualFrame frame, PosixPath path, Object times, Object ns, int dirFd, boolean followSymlinks, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.UTIME_CANNOT_USE_DIR_FD_AND_FOLLOW_SYMLINKS, "dir_fd"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.UTIME_CANNOT_USE_DIR_FD_AND_FOLLOW_SYMLINKS, "dir_fd"); } @Specialization(guards = {"HAVE_FUTIMENS.value", "isDefault(dirFd)", "followSymlinks"}) @@ -2182,12 +2159,13 @@ static PNone futimens(VirtualFrame frame, PosixFd fd, Object times, Object ns, i @Bind("this") Node inliningTarget, @Shared @Cached UtimeArgsToTimespecNode timespecNode, @Shared @Cached SysModuleBuiltins.AuditNode auditNode, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { long[] timespec = timespecNode.execute(frame, times, ns); auditNode.audit(inliningTarget, "os.utime", fd.originalObject, checkNone(times), checkNone(ns), dirFdForAudit(dirFd)); try { - posixLib.futimens(PosixSupport.get(inliningTarget), fd.fd, timespec); + posixLib.futimens(context.getPosixSupport(), fd.fd, timespec); } catch (PosixException e) { // filename is intentionally not included, see CPython's os_utime_impl throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); @@ -2200,12 +2178,13 @@ static PNone futimes(VirtualFrame frame, PosixFd fd, Object times, Object ns, in @Bind("this") Node inliningTarget, @Shared @Cached UtimeArgsToTimespecNode timespecNode, @Shared @Cached SysModuleBuiltins.AuditNode auditNode, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { Timeval[] timeval = timespecNode.toTimeval(frame, times, ns); auditNode.audit(inliningTarget, "os.utime", fd.originalObject, checkNone(times), checkNone(ns), dirFdForAudit(dirFd)); try { - posixLib.futimes(PosixSupport.get(inliningTarget), fd.fd, timeval); + posixLib.futimes(context.getPosixSupport(), fd.fd, timeval); } catch (PosixException e) { // filename is intentionally not included, see CPython's os_utime_impl throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); @@ -2216,15 +2195,15 @@ static PNone futimes(VirtualFrame frame, PosixFd fd, Object times, Object ns, in @Specialization(guards = {"isPNone(times) || isNoValue(ns)", "!isDefault(dirFd)"}) @SuppressWarnings("unused") static PNone fdWithDirFd(VirtualFrame frame, PosixFd fd, Object times, Object ns, int dirFd, boolean followSymlinks, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.CANT_SPECIFY_DIRFD_WITHOUT_PATH, "utime"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.CANT_SPECIFY_DIRFD_WITHOUT_PATH, "utime"); } @Specialization(guards = {"isPNone(times) || isNoValue(ns)", "isDefault(dirFd)", "!followSymlinks"}) @SuppressWarnings("unused") static PNone fdWithFollowSymlinks(VirtualFrame frame, PosixFd fd, Object times, Object ns, int dirFd, boolean followSymlinks, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.CANNOT_USE_FD_AND_FOLLOW_SYMLINKS_TOGETHER, "utime"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.CANNOT_USE_FD_AND_FOLLOW_SYMLINKS_TOGETHER, "utime"); } protected static boolean isDefault(int dirFd) { @@ -2232,7 +2211,7 @@ protected static boolean isDefault(int dirFd) { } } - @Builtin(name = "rename", minNumOfPositionalArgs = 2, parameterNames = {"src", "dst"}, varArgsMarker = true, keywordOnlyNames = {"src_dir_fd", "dst_dir_fd"}) + @Builtin(name = "rename", minNumOfPositionalArgs = 2, parameterNames = {"src", "dst"}, keywordOnlyNames = {"src_dir_fd", "dst_dir_fd"}) @ArgumentClinic(name = "src", conversionClass = PathConversionNode.class, args = {"false", "false"}) @ArgumentClinic(name = "dst", conversionClass = PathConversionNode.class, args = {"false", "false"}) @ArgumentClinic(name = "src_dir_fd", conversionClass = DirFdConversionNode.class) @@ -2246,14 +2225,15 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PNone rename(VirtualFrame frame, PosixPath src, PosixPath dst, int srcDirFd, int dstDirFd, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + static PNone rename(VirtualFrame frame, PosixPath src, PosixPath dst, int srcDirFd, int dstDirFd, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Bind("this") Node inliningTarget, @Cached SysModuleBuiltins.AuditNode auditNode, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { auditNode.audit(inliningTarget, "os.rename", src.originalObject, dst.originalObject, dirFdForAudit(srcDirFd), dirFdForAudit(dstDirFd)); try { - posixLib.renameat(getPosixSupport(), srcDirFd, src.value, dstDirFd, dst.value); + posixLib.renameat(context.getPosixSupport(), srcDirFd, src.value, dstDirFd, dst.value); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, src.originalObject, dst.originalObject); } @@ -2261,7 +2241,7 @@ PNone rename(VirtualFrame frame, PosixPath src, PosixPath dst, int srcDirFd, int } } - @Builtin(name = "replace", minNumOfPositionalArgs = 2, parameterNames = {"src", "dst"}, varArgsMarker = true, keywordOnlyNames = {"src_dir_fd", "dst_dir_fd"}) + @Builtin(name = "replace", minNumOfPositionalArgs = 2, parameterNames = {"src", "dst"}, keywordOnlyNames = {"src_dir_fd", "dst_dir_fd"}) @ArgumentClinic(name = "src", conversionClass = PathConversionNode.class, args = {"false", "false"}) @ArgumentClinic(name = "dst", conversionClass = PathConversionNode.class, args = {"false", "false"}) @ArgumentClinic(name = "src_dir_fd", conversionClass = DirFdConversionNode.class) @@ -2278,7 +2258,7 @@ protected ArgumentClinicProvider getArgumentClinic() { } } - @Builtin(name = "access", minNumOfPositionalArgs = 2, parameterNames = {"path", "mode"}, varArgsMarker = true, keywordOnlyNames = {"dir_fd", "effective_ids", "follow_symlinks"}) + @Builtin(name = "access", minNumOfPositionalArgs = 2, parameterNames = {"path", "mode"}, keywordOnlyNames = {"dir_fd", "effective_ids", "follow_symlinks"}) @ArgumentClinic(name = "path", conversionClass = PathConversionNode.class, args = {"false", "false"}) @ArgumentClinic(name = "mode", conversion = ClinicConversion.Int) @ArgumentClinic(name = "dir_fd", conversionClass = DirFdConversionNode.class) @@ -2293,9 +2273,10 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - boolean access(PosixPath path, int mode, int dirFd, boolean effectiveIds, boolean followSymlinks, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { - return posixLib.faccessat(getPosixSupport(), dirFd, path.value, mode, effectiveIds, followSymlinks); + static boolean access(PosixPath path, int mode, int dirFd, boolean effectiveIds, boolean followSymlinks, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { + return posixLib.faccessat(context.getPosixSupport(), dirFd, path.value, mode, effectiveIds, followSymlinks); } } @@ -2310,14 +2291,15 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PNone fchmod(VirtualFrame frame, int fd, int mode, + static PNone fchmod(VirtualFrame frame, int fd, int mode, @Bind("this") Node inliningTarget, @Cached SysModuleBuiltins.AuditNode auditNode, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { auditNode.audit(inliningTarget, "os.chmod", fd, mode, -1); try { - posixLib.fchmod(getPosixSupport(), fd, mode); + posixLib.fchmod(context.getPosixSupport(), fd, mode); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, fd); } @@ -2325,7 +2307,7 @@ PNone fchmod(VirtualFrame frame, int fd, int mode, } } - @Builtin(name = "chmod", minNumOfPositionalArgs = 2, parameterNames = {"path", "mode"}, varArgsMarker = true, keywordOnlyNames = {"dir_fd", "follow_symlinks"}) + @Builtin(name = "chmod", minNumOfPositionalArgs = 2, parameterNames = {"path", "mode"}, keywordOnlyNames = {"dir_fd", "follow_symlinks"}) @ArgumentClinic(name = "path", conversionClass = PathConversionNode.class, args = {"false", "true"}) @ArgumentClinic(name = "mode", conversion = ClinicConversion.Int) @ArgumentClinic(name = "dir_fd", conversionClass = DirFdConversionNode.class) @@ -2342,19 +2324,20 @@ protected ArgumentClinicProvider getArgumentClinic() { static PNone chmodFollow(VirtualFrame frame, PosixPath path, int mode, int dirFd, boolean followSymlinks, @Bind("this") Node inliningTarget, @Shared @Cached SysModuleBuiltins.AuditNode auditNode, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { auditNode.audit(inliningTarget, "os.chmod", path.originalObject, mode, dirFdForAudit(dirFd)); try { - posixLib.fchmodat(PosixSupport.get(inliningTarget), dirFd, path.value, mode, followSymlinks); + posixLib.fchmodat(context.getPosixSupport(), dirFd, path.value, mode, followSymlinks); } catch (PosixException e) { // TODO CPython checks for ENOTSUP as well if (e.getErrorCode() == OSErrorEnum.EOPNOTSUPP.getNumber() && !followSymlinks) { if (dirFd != AT_FDCWD.value) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.CANNOT_USE_FD_AND_FOLLOW_SYMLINKS_TOGETHER, "chmod"); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.CANNOT_USE_FD_AND_FOLLOW_SYMLINKS_TOGETHER, "chmod"); } else { - throw raiseNode.get(inliningTarget).raise(NotImplementedError, ErrorMessages.UNAVAILABLE_ON_THIS_PLATFORM, "chmod", "follow_symlinks"); + throw raiseNode.raise(inliningTarget, NotImplementedError, ErrorMessages.UNAVAILABLE_ON_THIS_PLATFORM, "chmod", "follow_symlinks"); } } throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, path.originalObject); @@ -2363,20 +2346,21 @@ static PNone chmodFollow(VirtualFrame frame, PosixPath path, int mode, int dirFd } @Specialization - PNone chmodFollow(VirtualFrame frame, PosixFd fd, int mode, int dirFd, @SuppressWarnings("unused") boolean followSymlinks, + static PNone chmodFollow(VirtualFrame frame, PosixFd fd, int mode, int dirFd, @SuppressWarnings("unused") boolean followSymlinks, @Bind("this") Node inliningTarget, @Shared @Cached SysModuleBuiltins.AuditNode auditNode, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, // unused node to avoid mixing shared and non-shared inlined nodes - @SuppressWarnings("unused") @Shared @Cached PRaiseNode.Lazy raiseNode) { + @SuppressWarnings("unused") @Shared @Cached PRaiseNode raiseNode) { auditNode.audit(inliningTarget, "os.chmod", fd.originalObject, mode, dirFdForAudit(dirFd)); // Unlike stat and utime which raise CANT_SPECIFY_DIRFD_WITHOUT_PATH or // CANNOT_USE_FD_AND_FOLLOW_SYMLINKS_TOGETHER when an inappropriate combination of // arguments is used, CPython's implementation of chmod simply ignores dir_fd and // follow_symlinks if a fd is specified instead of a path. try { - posixLib.fchmod(getPosixSupport(), fd.fd, mode); + posixLib.fchmod(context.getPosixSupport(), fd.fd, mode); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, fd.originalObject); } @@ -2391,17 +2375,18 @@ PNone chmodFollow(VirtualFrame frame, PosixFd fd, int mode, int dirFd, @Suppress @GenerateNodeFactory abstract static class FChownNode extends PythonTernaryClinicBuiltinNode { @Specialization - Object chown(VirtualFrame frame, int fd, long uid, long gid, + static Object chown(VirtualFrame frame, int fd, long uid, long gid, @Bind("this") Node inliningTarget, @Cached SysModuleBuiltins.AuditNode auditNode, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached GilNode gil, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { auditNode.audit(inliningTarget, "os.chown", fd, uid, gid, -1); try { gil.release(true); try { - posixLib.fchown(getPosixSupport(), fd, uid, gid); + posixLib.fchown(context.getPosixSupport(), fd, uid, gid); } finally { gil.acquire(); } @@ -2424,17 +2409,18 @@ protected ArgumentClinicProvider getArgumentClinic() { @GenerateNodeFactory abstract static class LChownNode extends PythonTernaryClinicBuiltinNode { @Specialization - Object chown(VirtualFrame frame, PosixPath path, long uid, long gid, + static Object chown(VirtualFrame frame, PosixPath path, long uid, long gid, @Bind("this") Node inliningTarget, @Cached SysModuleBuiltins.AuditNode auditNode, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached GilNode gil, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { auditNode.audit(inliningTarget, "os.chown", path.originalObject, uid, gid, -1); try { gil.release(true); try { - posixLib.fchownat(getPosixSupport(), AT_FDCWD.value, path.value, uid, gid, false); + posixLib.fchownat(context.getPosixSupport(), AT_FDCWD.value, path.value, uid, gid, false); } finally { gil.acquire(); } @@ -2462,16 +2448,17 @@ abstract static class ChownNode extends PythonClinicBuiltinNode { static Object chown(VirtualFrame frame, PosixPath path, long uid, long gid, int dirFd, boolean followSymlinks, @Bind("this") Node inliningTarget, @Shared @Cached SysModuleBuiltins.AuditNode auditNode, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared @Cached GilNode gil, @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, // unused node to avoid mixing shared and non-shared inlined nodes - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { auditNode.audit(inliningTarget, "os.chown", path.originalObject, uid, gid, dirFd != AT_FDCWD.value ? dirFd : -1); try { gil.release(true); try { - posixLib.fchownat(PosixSupport.get(inliningTarget), dirFd, path.value, uid, gid, followSymlinks); + posixLib.fchownat(context.getPosixSupport(), dirFd, path.value, uid, gid, followSymlinks); } finally { gil.acquire(); } @@ -2485,21 +2472,22 @@ static Object chown(VirtualFrame frame, PosixPath path, long uid, long gid, int static Object chown(VirtualFrame frame, PosixFd fd, long uid, long gid, int dirFd, boolean followSymlinks, @Bind("this") Node inliningTarget, @Shared @Cached SysModuleBuiltins.AuditNode auditNode, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared @Cached GilNode gil, @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { if (dirFd != AT_FDCWD.value) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.CANT_SPECIFY_BOTH_DIR_FD_AND_FD); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.CANT_SPECIFY_BOTH_DIR_FD_AND_FD); } if (followSymlinks) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.CANNOT_USE_FD_AND_FOLLOW_SYMLINKS_TOGETHER, "chown"); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.CANNOT_USE_FD_AND_FOLLOW_SYMLINKS_TOGETHER, "chown"); } auditNode.audit(inliningTarget, "os.chown", fd.originalObject, uid, gid, -1); try { gil.release(true); try { - posixLib.fchown(PosixSupport.get(inliningTarget), fd.fd, uid, gid); + posixLib.fchown(context.getPosixSupport(), fd.fd, uid, gid); } finally { gil.acquire(); } @@ -2515,7 +2503,7 @@ protected ArgumentClinicProvider getArgumentClinic() { } } - @Builtin(name = "readlink", minNumOfPositionalArgs = 1, parameterNames = {"path"}, varArgsMarker = true, keywordOnlyNames = {"dir_fd"}, doc = "readlink(path, *, dir_fd=None) -> path\n" + + @Builtin(name = "readlink", minNumOfPositionalArgs = 1, parameterNames = {"path"}, keywordOnlyNames = {"dir_fd"}, doc = "readlink(path, *, dir_fd=None) -> path\n" + "\nReturn a string representing the path to which the symbolic link points.\n") @ArgumentClinic(name = "path", conversionClass = PathConversionNode.class, args = {"false", "false"}) @ArgumentClinic(name = "dir_fd", conversionClass = DirFdConversionNode.class) @@ -2528,18 +2516,18 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - Object readlinkAsBytes(VirtualFrame frame, PosixPath path, int dirFd, + static Object readlinkAsBytes(VirtualFrame frame, PosixPath path, int dirFd, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached InlinedConditionProfile wasBufferLikeProfile, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - Object link = posixLib.readlinkat(getPosixSupport(), dirFd, path.value); + Object link = posixLib.readlinkat(context.getPosixSupport(), dirFd, path.value); if (wasBufferLikeProfile.profile(inliningTarget, path.wasBufferLike)) { - return opaquePathToBytes(link, posixLib, getPosixSupport(), factory); + return opaquePathToBytes(link, posixLib, context.getPosixSupport(), context.getLanguage(inliningTarget)); } else { - return posixLib.getPathAsString(getPosixSupport(), link); + return posixLib.getPathAsString(context.getPosixSupport(), link); } } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, path.originalObject); @@ -2558,21 +2546,49 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - TruffleString getStrError(int code, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { - return posixLib.strerror(getPosixSupport(), code); + static TruffleString getStrError(int code, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { + return posixLib.strerror(context.getPosixSupport(), code); } } - @Builtin(name = "_exit", minNumOfPositionalArgs = 1) + @Builtin(name = "_exit", minNumOfPositionalArgs = 1, parameterNames = {"status"}) + @ArgumentClinic(name = "status", conversion = ClinicConversion.Int) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) - public abstract static class ExitNode extends PythonUnaryBuiltinNode { + public abstract static class ExitNode extends PythonUnaryClinicBuiltinNode { @TruffleBoundary @Specialization Object exit(int status) { - // TODO: use a safepoint action to throw this exception to all running threads - throw new PythonExitException(this, status); + PythonContext context = getContext(); + if (context.getOption(PythonOptions.RunViaLauncher)) { + Runtime.getRuntime().halt(status); + } + List otherThreads = new ArrayList<>(Arrays.asList(context.getThreads())); + otherThreads.remove(context.getMainThread()); + otherThreads.remove(Thread.currentThread()); + context.getEnv().submitThreadLocal(otherThreads.toArray(new Thread[0]), new ThreadLocalAction(true, false) { + @Override + protected void perform(Access access) { + throw new ThreadDeath(); + } + }); + if (Thread.currentThread() == context.getMainThread()) { + throw new PythonExitException(this, status); + } else { + context.getEnv().submitThreadLocal(new Thread[]{context.getMainThread()}, new ThreadLocalAction(true, false) { + @Override + protected void perform(Access access) { + throw new PythonExitException(ExitNode.this, status); + } + }); + } + throw new ThreadDeath(); + } + + @Override + protected ArgumentClinicProvider getArgumentClinic() { + return PosixModuleBuiltinsClinicProviders.ExitNodeClinicProviderGen.INSTANCE; } } @@ -2587,27 +2603,29 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PTuple waitpid(VirtualFrame frame, long pid, int options, + static PTuple waitpid(VirtualFrame frame, long pid, int options, @Bind("this") Node inliningTarget, @Cached GilNode gil, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached InlinedBranchProfile errorProfile, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { gil.release(true); try { while (true) { try { - long[] result = posixLib.waitpid(getPosixSupport(), pid, options); - return factory.createTuple(new Object[]{result[0], result[1]}); + long[] result = posixLib.waitpid(context.getPosixSupport(), pid, options); + return PFactory.createTuple(context.getLanguage(inliningTarget), new Object[]{result[0], result[1]}); } catch (PosixException e) { errorProfile.enter(inliningTarget); if (e.getErrorCode() == OSErrorEnum.EINTR.getNumber()) { - PythonContext.triggerAsyncActions(this); + PythonContext.triggerAsyncActions(inliningTarget); } else { gil.acquire(); throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } + } catch (UnsupportedPosixFeatureException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorUnsupported(frame, e); } } } finally { @@ -2621,31 +2639,32 @@ PTuple waitpid(VirtualFrame frame, long pid, int options, abstract static class WaitstatusToExitcodeNode extends PythonUnaryBuiltinNode { @Specialization static int waitstatusToExitcode(VirtualFrame frame, Object statusObj, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Bind("this") Node inliningTarget, @Cached PyLongAsIntNode longAsInt, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int status = longAsInt.execute(frame, inliningTarget, statusObj); - PosixSupport posixSupport = PosixSupport.get(inliningTarget); + PosixSupport posixSupport = context.getPosixSupport(); if (posixLib.wifexited(posixSupport, status)) { int exitcode = posixLib.wexitstatus(posixSupport, status); if (exitcode < 0) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.INVALID_WEXITSTATUS, exitcode); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.INVALID_WEXITSTATUS, exitcode); } return exitcode; } if (posixLib.wifsignaled(posixSupport, status)) { int signum = posixLib.wtermsig(posixSupport, status); if (signum <= 0) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.INVALID_WTERMSIG, signum); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.INVALID_WTERMSIG, signum); } return -signum; } if (posixLib.wifstopped(posixSupport, status)) { int signum = posixLib.wstopsig(posixSupport, status); - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.PROCESS_STOPPED_BY_DELIVERY_OF_SIGNAL, signum); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.PROCESS_STOPPED_BY_DELIVERY_OF_SIGNAL, signum); } - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.INVALID_WAIT_STATUS, status); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.INVALID_WAIT_STATUS, status); } } @@ -2659,9 +2678,10 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - boolean wcoredump(int status, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { - return posixLib.wcoredump(getPosixSupport(), status); + static boolean wcoredump(int status, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { + return posixLib.wcoredump(context.getPosixSupport(), status); } } @@ -2675,9 +2695,10 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - boolean wifcontinued(int status, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { - return posixLib.wifcontinued(getPosixSupport(), status); + static boolean wifcontinued(int status, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { + return posixLib.wifcontinued(context.getPosixSupport(), status); } } @@ -2691,9 +2712,10 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - boolean wifstopped(int status, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { - return posixLib.wifstopped(getPosixSupport(), status); + static boolean wifstopped(int status, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { + return posixLib.wifstopped(context.getPosixSupport(), status); } } @@ -2707,9 +2729,10 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - boolean wifsignaled(int status, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { - return posixLib.wifsignaled(getPosixSupport(), status); + static boolean wifsignaled(int status, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { + return posixLib.wifsignaled(context.getPosixSupport(), status); } } @@ -2723,9 +2746,10 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - boolean wifexited(int status, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { - return posixLib.wifexited(getPosixSupport(), status); + static boolean wifexited(int status, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { + return posixLib.wifexited(context.getPosixSupport(), status); } } @@ -2739,9 +2763,10 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - int wexitstatus(int status, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { - return posixLib.wexitstatus(getPosixSupport(), status); + static int wexitstatus(int status, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { + return posixLib.wexitstatus(context.getPosixSupport(), status); } } @@ -2756,8 +2781,9 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization int wtermsig(int status, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { - return posixLib.wtermsig(getPosixSupport(), status); + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { + return posixLib.wtermsig(context.getPosixSupport(), status); } } @@ -2771,9 +2797,10 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - int wstopsig(int status, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { - return posixLib.wstopsig(getPosixSupport(), status); + static int wstopsig(int status, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { + return posixLib.wstopsig(context.getPosixSupport(), status); } } @@ -2787,11 +2814,12 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - int system(PBytes command, + static int system(PBytes command, @Bind("this") Node inliningTarget, @Cached BytesNodes.ToBytesNode toBytesNode, @Cached SysModuleBuiltins.AuditNode auditNode, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached GilNode gil) { // Unlike in other posix builtins, we go through str -> bytes -> byte[] -> String // conversions for emulated backend because the bytes version after fsencode conversion @@ -2800,8 +2828,8 @@ int system(PBytes command, byte[] bytes = toBytesNode.execute(command); gil.release(true); try { - Object cmdOpaque = posixLib.createPathFromBytes(getPosixSupport(), bytes); - return posixLib.system(getPosixSupport(), cmdOpaque); + Object cmdOpaque = posixLib.createPathFromBytes(context.getPosixSupport(), bytes); + return posixLib.system(context.getPosixSupport(), cmdOpaque); } finally { gil.acquire(); } @@ -2811,20 +2839,20 @@ int system(PBytes command, @Builtin(name = "urandom", minNumOfPositionalArgs = 1, numOfPositionalOnlyArgs = 1, parameterNames = {"size"}) @ArgumentClinic(name = "size", conversion = ClinicConversion.Index) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class URandomNode extends PythonUnaryClinicBuiltinNode { @Specialization(guards = "size >= 0") - PBytes urandom(int size, - @Cached PythonObjectFactory factory) { + static PBytes urandom(int size, + @Bind("this") Node inliningTarget, + @Bind PythonContext context) { byte[] bytes = new byte[size]; - nextBytes(getContext().getSecureRandom(), bytes); - return factory.createBytes(bytes); + nextBytes(context.getSecureRandom(), bytes); + return PFactory.createBytes(context.getLanguage(inliningTarget), bytes); } @Specialization(guards = "size < 0") static Object urandomNeg(@SuppressWarnings("unused") int size, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.NEG_ARG_NOT_ALLOWED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.NEG_ARG_NOT_ALLOWED); } @TruffleBoundary @@ -2848,50 +2876,43 @@ static int getCpuCount() { } } - @Builtin(name = "sysconf", minNumOfPositionalArgs = 1, parameterNames = {"name"}) + @Builtin(name = "sysconf", minNumOfPositionalArgs = 2, parameterNames = {"$self", "name"}, declaresExplicitSelf = true) @GenerateNodeFactory - abstract static class SysconfNode extends PythonUnaryBuiltinNode { + abstract static class SysconfNode extends PythonBinaryBuiltinNode { - public static final TruffleString T_SC_CLK_TCK = tsLiteral("SC_CLK_TCK"); - public static final TruffleString T_SC_NPROCESSORS_ONLN = tsLiteral("SC_NPROCESSORS_ONLN"); - public static final int SC_CLK_TCK = 2; - public static final int SC_NPROCESSORS_ONLN = 84; - public static final EconomicMapStorage SYSCONF_NAMES = EconomicMapStorage.create(); - static { - // TODO populate from constants - SYSCONF_NAMES.putUncachedWithJavaEq(T_SC_CLK_TCK, SC_CLK_TCK); - SYSCONF_NAMES.putUncachedWithJavaEq(T_SC_NPROCESSORS_ONLN, SC_NPROCESSORS_ONLN); - } + private static final TruffleString T_SYSCONF_NAMES = tsLiteral("sysconf_names"); @Specialization - static int sysconf(VirtualFrame frame, Object arg, + static long sysconf(VirtualFrame frame, PythonModule self, Object arg, @Bind("this") Node inliningTarget, @Cached PyLongCheckNode longCheckNode, @Cached PyLongAsIntNode asIntNode, @Cached PyUnicodeCheckNode unicodeCheckNode, - @Cached HashingStorageNodes.HashingStorageGetItem getItem, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PyObjectGetAttr getAttr, + @Cached PyObjectGetItem getItem, + @Cached PRaiseNode raiseNode, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { int id; if (longCheckNode.execute(inliningTarget, arg)) { id = asIntNode.execute(frame, inliningTarget, arg); } else if (unicodeCheckNode.execute(inliningTarget, arg)) { - Object idObj = getItem.execute(frame, inliningTarget, SYSCONF_NAMES, arg); - if (idObj instanceof Integer idInt) { - id = idInt; - } else { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.UNRECOGNIZED_CONF_NAME); + try { + Object sysconfigNamesObject = getAttr.execute(frame, inliningTarget, self, T_SYSCONF_NAMES); + Object idObj = getItem.execute(frame, inliningTarget, sysconfigNamesObject, arg); + id = asIntNode.execute(frame, inliningTarget, idObj); + } catch (PException e) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.UNRECOGNIZED_CONF_NAME); } } else { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CONFIGURATION_NAMES_MUST_BE_STRINGS_OR_INTEGERS); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CONFIGURATION_NAMES_MUST_BE_STRINGS_OR_INTEGERS); } - if (id == SC_CLK_TCK) { - return 100; // it's 100 on most default kernel configs. TODO: use real value through - // NFI - } else if (id == SC_NPROCESSORS_ONLN) { - return CpuCountNode.getCpuCount(); + try { + return posixLib.sysconf(context.getPosixSupport(), id); + } catch (PosixException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } - throw constructAndRaiseNode.get(inliningTarget).raiseOSError(frame, OSErrorEnum.EINVAL); } } @@ -2906,12 +2927,13 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - int umask(VirtualFrame frame, int mask, + static int umask(VirtualFrame frame, int mask, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - return posixLib.umask(getPosixSupport(), mask); + return posixLib.umask(context.getPosixSupport(), mask); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -2922,12 +2944,13 @@ int umask(VirtualFrame frame, int mask, @GenerateNodeFactory abstract static class CtermId extends PythonBuiltinNode { @Specialization - TruffleString ctermid(VirtualFrame frame, + static TruffleString ctermid(VirtualFrame frame, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - return posixLib.ctermid(getPosixSupport()); + return posixLib.ctermid(context.getPosixSupport()); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -2945,17 +2968,20 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PNone kill(VirtualFrame frame, long pid, int signal, + static PNone kill(VirtualFrame frame, long pid, int signal, @Bind("this") Node inliningTarget, @Cached SysModuleBuiltins.AuditNode auditNode, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { auditNode.audit(inliningTarget, "kill", pid, signal); try { - posixLib.kill(getPosixSupport(), pid, signal); + posixLib.kill(context.getPosixSupport(), pid, signal); return PNone.NONE; } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); + } catch (UnsupportedPosixFeatureException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorUnsupported(frame, e); } } } @@ -2971,17 +2997,20 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - PNone kill(VirtualFrame frame, long pid, int signal, + static PNone kill(VirtualFrame frame, long pid, int signal, @Bind("this") Node inliningTarget, @Cached SysModuleBuiltins.AuditNode auditNode, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { auditNode.audit(inliningTarget, "killpg", pid, signal); try { - posixLib.killpg(getPosixSupport(), pid, signal); + posixLib.killpg(context.getPosixSupport(), pid, signal); return PNone.NONE; } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); + } catch (UnsupportedPosixFeatureException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorUnsupported(frame, e); } } } @@ -3003,7 +3032,7 @@ static Object doTrivial(VirtualFrame frame, Object value, abstract static class RegisterAtForkNode extends PythonBuiltinNode { @Specialization @SuppressWarnings("unused") - Object register(Object before, Object afterInChild, Object afterInParent) { + static Object register(Object before, Object afterInChild, Object afterInParent) { // TODO should we at least call multiprocessing.util.register_after_fork? return PNone.NONE; } @@ -3023,15 +3052,15 @@ public abstract static class StringOrBytesToBytesNode extends Node { @Specialization(guards = "isString(strObj)") static PBytes doString(Node inliningTarget, Object strObj, + @Bind PythonLanguage language, @Cached CastToTruffleStringNode castToStringNode, @Cached(inline = false) TruffleString.SwitchEncodingNode switchEncodingNode, - @Cached(inline = false) TruffleString.CopyToByteArrayNode copyToByteArrayNode, - @Cached(inline = false) PythonObjectFactory factory) { + @Cached(inline = false) TruffleString.CopyToByteArrayNode copyToByteArrayNode) { TruffleString str = castToStringNode.execute(inliningTarget, strObj); TruffleString utf8 = switchEncodingNode.execute(str, Encoding.UTF_8); byte[] bytes = new byte[utf8.byteLength(Encoding.UTF_8)]; copyToByteArrayNode.execute(utf8, 0, bytes, 0, bytes.length, Encoding.UTF_8); - return factory.createBytes(bytes); + return PFactory.createBytes(language, bytes); } @Specialization @@ -3054,23 +3083,25 @@ abstract static class StringOrBytesToOpaquePathNode extends Node { @Specialization(guards = "isString(strObj)") static Object doString(Node inliningTarget, Object strObj, @Cached CastToTruffleStringNode castToStringNode, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Exclusive @Cached PRaiseNode raiseNode) { TruffleString str = castToStringNode.execute(inliningTarget, strObj); - return checkPath(inliningTarget, posixLib.createPathFromString(PosixSupport.get(inliningTarget), str), raiseNode); + return checkPath(inliningTarget, posixLib.createPathFromString(context.getPosixSupport(), str), raiseNode); } @Specialization static Object doBytes(Node inliningTarget, PBytes bytes, @Cached(inline = false) BytesNodes.ToBytesNode toBytesNode, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - return checkPath(inliningTarget, posixLib.createPathFromBytes(PosixSupport.get(inliningTarget), toBytesNode.execute(bytes)), raiseNode); + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Exclusive @Cached PRaiseNode raiseNode) { + return checkPath(inliningTarget, posixLib.createPathFromBytes(context.getPosixSupport(), toBytesNode.execute(bytes)), raiseNode); } - private static Object checkPath(Node inliningTarget, Object path, PRaiseNode.Lazy raiseNode) { + private static Object checkPath(Node inliningTarget, Object path, PRaiseNode raiseNode) { if (path == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.EMBEDDED_NULL_BYTE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.EMBEDDED_NULL_BYTE); } return path; } @@ -3097,10 +3128,10 @@ static Object withCheck(VirtualFrame frame, Node inliningTarget, Object obj, @Su @Exclusive @Cached PyOSFSPathNode fspathNode, @Cached PyObjectSizeNode sizeNode, @Exclusive @Cached StringOrBytesToOpaquePathNode stringOrBytesToOpaquePathNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object stringOrBytes = fspathNode.execute(frame, inliningTarget, obj); if (sizeNode.execute(frame, inliningTarget, obj) == 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.EXECV_ARG2_FIRST_ELEMENT_CANNOT_BE_EMPTY); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.EXECV_ARG2_FIRST_ELEMENT_CANNOT_BE_EMPTY); } return stringOrBytesToOpaquePathNode.execute(inliningTarget, stringOrBytes); } @@ -3120,9 +3151,9 @@ abstract static class ObjectToTimespecNode extends ConvertToTimespecBaseNode { @Specialization static void doDouble(Node inliningTarget, double value, long[] timespec, int offset, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { if (Double.isNaN(value)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.INVALID_VALUE_NAN); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.INVALID_VALUE_NAN); } double denominator = 1000000000.0; @@ -3139,7 +3170,7 @@ static void doDouble(Node inliningTarget, double value, long[] timespec, int off } assert 0.0 <= floatPart && floatPart < denominator; if (!MathGuards.fitLong(intPart)) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.TIMESTAMP_OUT_OF_RANGE); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.TIMESTAMP_OUT_OF_RANGE); } timespec[offset] = (long) intPart; timespec[offset + 1] = (long) floatPart; @@ -3148,7 +3179,7 @@ static void doDouble(Node inliningTarget, double value, long[] timespec, int off @Specialization static void doPFloat(Node inliningTarget, PFloat obj, long[] timespec, int offset, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { doDouble(inliningTarget, obj.getValue(), timespec, offset, raiseNode); } @@ -3167,11 +3198,11 @@ static void doLong(long value, long[] timespec, int offset) { @Specialization(guards = {"!isDouble(value)", "!isPFloat(value)", "!isInteger(value)"}) static void doGeneric(VirtualFrame frame, Node inliningTarget, Object value, long[] timespec, int offset, @Cached PyLongAsLongAndOverflowNode asLongNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { try { timespec[offset] = asLongNode.execute(frame, inliningTarget, value); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.TIMESTAMP_OUT_OF_RANGE); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.TIMESTAMP_OUT_OF_RANGE); } timespec[offset + 1] = 0; } @@ -3182,7 +3213,7 @@ static void doGeneric(VirtualFrame frame, Node inliningTarget, Object value, lon */ @GenerateInline @GenerateCached(false) - @ImportStatic({BinaryArithmetic.class, PGuards.class}) + @ImportStatic(PGuards.class) abstract static class SplitLongToSAndNsNode extends ConvertToTimespecBaseNode { private static final long BILLION = 1000000000; @@ -3200,14 +3231,14 @@ static void doLong(long value, long[] timespec, int offset) { @Specialization(guards = {"!isInteger(value)"}) static void doGeneric(VirtualFrame frame, Node inliningTarget, Object value, long[] timespec, int offset, - @Cached(value = "DivMod.create()", inline = false) BinaryOpNode callDivmod, + @Cached PyNumberDivmodNode divmodNode, @Cached LenNode lenNode, @Cached(value = "createNotNormalized()", inline = false) GetItemNode getItemNode, @Cached PyLongAsLongNode asLongNode, - @Cached PRaiseNode.Lazy raiseNode) { - Object divmod = callDivmod.executeObject(frame, value, BILLION); + @Cached PRaiseNode raiseNode) { + Object divmod = divmodNode.execute(frame, inliningTarget, value, BILLION); if (!PGuards.isPTuple(divmod) || lenNode.execute(inliningTarget, (PSequence) divmod) != 2) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MUST_RETURN_2TUPLE, value, divmod); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MUST_RETURN_2TUPLE, value, divmod); } SequenceStorage storage = ((PTuple) divmod).getSequenceStorage(); timespec[offset] = asLongNode.execute(frame, inliningTarget, getItemNode.execute(storage, 0)); @@ -3219,10 +3250,10 @@ static int dirFdForAudit(int dirFd) { return dirFd == AT_FDCWD.value ? -1 : dirFd; } - public static PTuple createStatResult(Node inliningTarget, PythonObjectFactory factory, InlinedConditionProfile positiveLongProfile, long[] out) { + public static PTuple createStatResult(Node inliningTarget, PythonLanguage language, InlinedConditionProfile positiveLongProfile, long[] out) { Object[] res = new Object[16]; for (int i = 0; i < 7; i++) { - res[i] = PInt.createPythonIntFromUnsignedLong(inliningTarget, factory, positiveLongProfile, out[i]); + res[i] = PInt.createPythonIntFromUnsignedLong(inliningTarget, language, positiveLongProfile, out[i]); } res[6] = out[6]; for (int i = 7; i < 10; i++) { @@ -3230,9 +3261,9 @@ public static PTuple createStatResult(Node inliningTarget, PythonObjectFactory f long nsFraction = out[i + 3]; res[i] = seconds; res[i + 3] = seconds + nsFraction * 1.0e-9; - res[i + 6] = factory.createInt(convertToNanoseconds(seconds, nsFraction)); + res[i + 6] = PFactory.createInt(language, convertToNanoseconds(seconds, nsFraction)); } - return factory.createStructSeq(STAT_RESULT_DESC, res); + return PFactory.createStructSeq(language, STAT_RESULT_DESC, res); } @TruffleBoundary @@ -3243,14 +3274,14 @@ private static BigInteger convertToNanoseconds(long sec, long ns) { return r.add(BigInteger.valueOf(ns)); } - public static PBytes opaquePathToBytes(Object opaquePath, PosixSupportLibrary posixLib, Object posixSupport, PythonObjectFactory factory) { + public static PBytes opaquePathToBytes(Object opaquePath, PosixSupportLibrary posixLib, Object posixSupport, PythonLanguage language) { Buffer buf = posixLib.getPathAsBytes(posixSupport, opaquePath); if (buf.length > Integer.MAX_VALUE) { // sanity check that it is safe to cast result.length to int, to be removed once // we support large arrays throw CompilerDirectives.shouldNotReachHere("Posix path cannot fit into a Java array"); } - return factory.createBytes(buf.data, 0, (int) buf.length); + return PFactory.createBytes(language, buf.data, (int) buf.length); } // ------------------ @@ -3294,43 +3325,43 @@ static int doFdInt(int value) { } @Specialization - int doFdLong(long value, + static int doFdLong(long value, @Bind("this") Node inliningTarget, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { return longToFd(inliningTarget, value, raiseNode); } @Specialization @SuppressWarnings("truffle-static-method") - int doFdPInt(PInt value, + static int doFdPInt(PInt value, @Bind("this") Node inliningTarget, @Exclusive @Cached CastToJavaLongLossyNode castToLongNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { return doFdLong(castToLongNode.execute(inliningTarget, value), inliningTarget, raiseNode); } @Specialization(guards = {"!isPNone(value)", "!canBeInteger(value)"}) @SuppressWarnings("truffle-static-method") - int doIndex(VirtualFrame frame, Object value, + static int doIndex(VirtualFrame frame, Object value, @Bind("this") Node inliningTarget, @Cached PyIndexCheckNode indexCheckNode, @Cached PyNumberIndexNode indexNode, @Exclusive @Cached CastToJavaLongLossyNode castToLongNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (indexCheckNode.execute(inliningTarget, value)) { Object o = indexNode.execute(frame, inliningTarget, value); return doFdLong(castToLongNode.execute(inliningTarget, o), inliningTarget, raiseNode); } else { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.ARG_SHOULD_BE_INT_OR_NONE, value); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ARG_SHOULD_BE_INT_OR_NONE_T, value); } } - private static int longToFd(Node inliningTarget, long value, PRaiseNode.Lazy raiseNode) { + private static int longToFd(Node inliningTarget, long value, PRaiseNode raiseNode) { if (value > Integer.MAX_VALUE) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.FD_IS_GREATER_THAN_MAXIMUM); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.FD_IS_GREATER_THAN_MAXIMUM); } if (value < Integer.MIN_VALUE) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.FD_IS_LESS_THAN_MINIMUM); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.FD_IS_LESS_THAN_MINIMUM); } return (int) value; } @@ -3363,9 +3394,10 @@ public PathConversionNode(String functionName, String argumentName, boolean null @Specialization(guards = "nullable") PosixFileHandle doNone(@SuppressWarnings("unused") PNone value, @Bind("this") Node inliningTarget, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - Object path = posixLib.createPathFromString(PosixSupport.get(inliningTarget), T_DOT); + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Exclusive @Cached PRaiseNode raiseNode) { + Object path = posixLib.createPathFromString(context.getPosixSupport(), T_DOT); return new PosixPath(null, checkPath(inliningTarget, path, raiseNode), false); } @@ -3382,7 +3414,7 @@ static PosixFileHandle doFdInt(int value) { @Specialization(guards = "allowFd") static PosixFileHandle doFdLong(long value, @Bind("this") Node inliningTarget, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { return new PosixFd(value, DirFdConversionNode.longToFd(inliningTarget, value, raiseNode)); } @@ -3390,7 +3422,7 @@ static PosixFileHandle doFdLong(long value, static PosixFileHandle doFdPInt(PInt value, @Bind("this") Node inliningTarget, @Exclusive @Cached CastToJavaLongLossyNode castToLongNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { return new PosixFd(value, DirFdConversionNode.longToFd(inliningTarget, castToLongNode.execute(inliningTarget, value), raiseNode)); } @@ -3399,10 +3431,11 @@ static PosixFileHandle doFdPInt(PInt value, PosixFileHandle doUnicode(Object value, @Bind("this") Node inliningTarget, @Exclusive @Cached CastToTruffleStringNode castToStringNode, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Exclusive @Cached PRaiseNode raiseNode) { TruffleString str = castToStringNode.execute(inliningTarget, value); - Object path = posixLib.createPathFromString(PosixSupport.get(inliningTarget), str); + Object path = posixLib.createPathFromString(context.getPosixSupport(), str); return new PosixPath(value, checkPath(inliningTarget, path, raiseNode), false); } @@ -3411,9 +3444,10 @@ PosixFileHandle doUnicode(Object value, PosixFileHandle doBytes(PBytes value, @Bind("this") Node inliningTarget, @Exclusive @Cached BytesNodes.ToBytesNode toByteArrayNode, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - Object path = posixLib.createPathFromBytes(PosixSupport.get(inliningTarget), toByteArrayNode.execute(value)); + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Exclusive @Cached PRaiseNode raiseNode) { + Object path = posixLib.createPathFromBytes(context.getPosixSupport(), toByteArrayNode.execute(value)); return new PosixPath(value, checkPath(inliningTarget, path, raiseNode), true); } @@ -3421,20 +3455,22 @@ PosixFileHandle doBytes(PBytes value, @SuppressWarnings("truffle-static-method") PosixFileHandle doBuffer(VirtualFrame frame, Object value, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("value") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached WarningsModuleBuiltins.WarnNode warningNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - Object buffer = bufferAcquireLib.acquireReadonly(value, frame, getContext(), getLanguage(), indirectCallData); + @Exclusive @Cached PRaiseNode raiseNode) { + PythonLanguage language = context.getLanguage(inliningTarget); + Object buffer = bufferAcquireLib.acquireReadonly(value, frame, context, language, indirectCallData); try { warningNode.warnFormat(frame, null, PythonBuiltinClassType.DeprecationWarning, 1, ErrorMessages.S_S_SHOULD_BE_S_NOT_P, functionNameWithColon, argumentName, getAllowedTypes(), value); - Object path = posixLib.createPathFromBytes(PosixSupport.get(inliningTarget), bufferLib.getCopiedByteArray(value)); + Object path = posixLib.createPathFromBytes(context.getPosixSupport(), bufferLib.getCopiedByteArray(value)); return new PosixPath(value, checkPath(inliningTarget, path, raiseNode), true); } finally { - bufferLib.release(buffer, frame, getContext(), getLanguage(), indirectCallData); + bufferLib.release(buffer, frame, context, language, indirectCallData); } } @@ -3446,7 +3482,7 @@ PosixFileHandle doIndex(VirtualFrame frame, Object value, @SuppressWarnings("unused") @Exclusive @Cached PyIndexCheckNode indexCheckNode, @Cached PyNumberIndexNode indexNode, @Exclusive @Cached CastToJavaLongLossyNode castToLongNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { Object o = indexNode.execute(frame, inliningTarget, value); return new PosixFd(value, DirFdConversionNode.longToFd(inliningTarget, castToLongNode.execute(inliningTarget, o), raiseNode)); } @@ -3460,22 +3496,23 @@ PosixFileHandle doGeneric(VirtualFrame frame, Object value, @Cached("create(T___FSPATH__)") LookupAndCallUnaryNode callFSPath, @Exclusive @Cached BytesNodes.ToBytesNode toByteArrayNode, @Exclusive @Cached CastToTruffleStringNode castToStringNode, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Exclusive @Cached PRaiseNode raiseNode) { Object pathObject = callFSPath.executeObject(frame, value); if (pathObject == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_S_SHOULD_BE_S_NOT_P, functionNameWithColon, argumentName, + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_S_SHOULD_BE_S_NOT_P, functionNameWithColon, argumentName, getAllowedTypes(), value); } // 'pathObject' replaces 'value' as the PosixPath.originalObject for auditing purposes // by design if (pathObject instanceof PBytes) { - return doBytes((PBytes) pathObject, inliningTarget, toByteArrayNode, posixLib, raiseNode); + return doBytes((PBytes) pathObject, inliningTarget, toByteArrayNode, context, posixLib, raiseNode); } if (PGuards.isString(pathObject)) { - return doUnicode(pathObject, inliningTarget, castToStringNode, posixLib, raiseNode); + return doUnicode(pathObject, inliningTarget, castToStringNode, context, posixLib, raiseNode); } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.EXPECTED_FSPATH_TO_RETURN_STR_OR_BYTES, value, pathObject); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.EXPECTED_FSPATH_TO_RETURN_STR_OR_BYTES, value, pathObject); } protected boolean isHandled(Object value) { @@ -3487,9 +3524,9 @@ private String getAllowedTypes() { : allowFd ? "string, bytes, os.PathLike or integer" : nullable ? "string, bytes, os.PathLike or None" : "string, bytes or os.PathLike"; } - private Object checkPath(Node inliningTarget, Object path, PRaiseNode.Lazy raiseNode) { + private Object checkPath(Node inliningTarget, Object path, PRaiseNode raiseNode) { if (path == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.S_EMBEDDED_NULL_CHARACTER_IN_S, functionNameWithColon, argumentName); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.S_EMBEDDED_NULL_CHARACTER_IN_S, functionNameWithColon, argumentName); } return path; } @@ -3591,14 +3628,14 @@ public abstract static class AbstractIdConversionNode extends ArgumentCastNode { @Specialization long doInt(int value, @Bind("this") Node inliningTarget, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { return checkValue(inliningTarget, value, raiseNode); } @Specialization long doLong(long value, @Bind("this") Node inliningTarget, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { return checkValue(inliningTarget, value, raiseNode); } @@ -3608,12 +3645,12 @@ long doGeneric(VirtualFrame frame, Object value, @Bind("this") Node inliningTarget, @Cached PyNumberIndexNode pyNumberIndexNode, @Cached PyLongAsLongNode asLongNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { Object index; try { index = pyNumberIndexNode.execute(frame, inliningTarget, value); } catch (PException ex) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_SHOULD_BE_INTEGER_NOT_P, getIdName(), value); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_SHOULD_BE_INTEGER_NOT_P, getIdName(), value); } /* * We have no means to distinguish overflow/underflow, so we just let any OverflowError @@ -3623,13 +3660,13 @@ long doGeneric(VirtualFrame frame, Object value, return checkValue(inliningTarget, asLongNode.execute(frame, inliningTarget, index), raiseNode); } - private long checkValue(Node inliningTarget, long value, PRaiseNode.Lazy raiseNode) { + private long checkValue(Node inliningTarget, long value, PRaiseNode raiseNode) { // Note that -1 is intentionally allowed if (value < -1) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.S_IS_LESS_THAN_MINIMUM, getIdName()); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.S_IS_LESS_THAN_MINIMUM, getIdName()); } else if (value > MAX_UINT32) { /* uid_t is uint32_t on Linux */ - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.S_IS_GREATER_THAN_MAXIUMUM, getIdName()); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.S_IS_GREATER_THAN_MAXIUMUM, getIdName()); } return value; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PosixSubprocessModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PosixSubprocessModuleBuiltins.java index 32a9f4c2b8..e78b40382a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PosixSubprocessModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PosixSubprocessModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -126,13 +126,13 @@ static Object[] doSequence(VirtualFrame frame, Object processArgs, @Cached IsBuiltinObjectProfile isBuiltinClassProfile, @Cached ObjectToOpaquePathNode objectToOpaquePathNode, @Cached("createNotNormalized()") GetItemNode getItemNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { PSequence argsSequence; try { argsSequence = fastConstructListNode.execute(frame, inliningTarget, processArgs); } catch (PException e) { e.expect(inliningTarget, TypeError, isBuiltinClassProfile); - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_MUST_BE_S, "argv", "a tuple"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_MUST_BE_S, "argv", "a tuple"); } SequenceStorage argsStorage = getSequenceStorageNode.execute(inliningTarget, argsSequence); @@ -142,7 +142,7 @@ static Object[] doSequence(VirtualFrame frame, Object processArgs, SequenceStorage newStorage = getSequenceStorageNode.execute(inliningTarget, argsSequence); if (newStorage != argsStorage || newStorage.length() != len) { // TODO write a test for this - throw raiseNode.get(inliningTarget).raise(RuntimeError, ErrorMessages.ARGS_CHANGED_DURING_ITERATION); + throw raiseNode.raise(inliningTarget, RuntimeError, ErrorMessages.ARGS_CHANGED_DURING_ITERATION); } Object o = getItemNode.execute(argsStorage, i); argsArray[i] = objectToOpaquePathNode.execute(frame, inliningTarget, o, false); @@ -166,20 +166,21 @@ static Object doNone(@SuppressWarnings("unused") PNone env) { @Specialization(guards = "!isPNone(env)") static Object doSequence(VirtualFrame frame, Object env, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached PyObjectSizeNode sizeNode, @Cached ToBytesNode toBytesNode, @Cached PyObjectGetItem getItem, - @CachedLibrary("getContext().getPosixSupport()") PosixSupportLibrary posixLib, - @Cached PRaiseNode.Lazy raiseNode) { + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Cached PRaiseNode raiseNode) { // TODO unlike CPython, this accepts a dict (if the keys are integers (0, 1, ..., len-1) int length = sizeNode.execute(frame, inliningTarget, env); Object[] result = new Object[length]; for (int i = 0; i < length; ++i) { Object o = getItem.execute(frame, inliningTarget, env, i); byte[] bytes = toBytesNode.execute(frame, o); - Object o1 = posixLib.createPathFromBytes(PythonContext.get(inliningTarget).getPosixSupport(), bytes); + Object o1 = posixLib.createPathFromBytes(context.getPosixSupport(), bytes); if (o1 == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.EMBEDDED_NULL_BYTE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.EMBEDDED_NULL_BYTE); } result[i] = o1; } @@ -229,13 +230,13 @@ private static byte[] fsEncode(String s) { return s.getBytes(); } - private static Object createPathFromBytes(Node inliningTarget, byte[] bytes, PosixSupportLibrary posixLib, PRaiseNode.Lazy raiseNode) { + private static Object createPathFromBytes(Node inliningTarget, byte[] bytes, PosixSupportLibrary posixLib, PRaiseNode raiseNode) { Object o = posixLib.createPathFromBytes(PosixSupport.get(inliningTarget), bytes); if (o == null) { // TODO reconsider the contract of PosixSupportLibrary#createPathFromBytes w.r.t. // embedded null checks (we need to review that anyway since PosixSupportLibrary // cannot do Python-specific fsencode) - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.EMBEDDED_NULL_BYTE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.EMBEDDED_NULL_BYTE); } return o; } @@ -258,15 +259,15 @@ static int forkExec(VirtualFrame frame, Object[] args, Object executableList, bo @Cached GilNode gil, @Cached ToBytesNode toBytesNode, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (!(preexecFn instanceof PNone)) { - throw raiseNode.get(inliningTarget).raise(RuntimeError, ErrorMessages.S_NOT_SUPPORTED, "preexec_fn"); + throw raiseNode.raise(inliningTarget, RuntimeError, ErrorMessages.S_NOT_SUPPORTED, "preexec_fn"); } if (closeFds && errPipeWrite < 3) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.S_MUST_BE_S, "errpipe_write", ">= 3"); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.S_MUST_BE_S, "errpipe_write", ">= 3"); } if (!(fdsToKeepObj instanceof PTuple)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.ARG_D_MUST_BE_S_NOT_P, "fork_exec()", 4, "tuple", fdsToKeepObj); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ARG_D_MUST_BE_S_NOT_P, "fork_exec()", 4, "tuple", fdsToKeepObj); } Object[] processArgs = args; int[] fdsToKeep = convertFdSequence(inliningTarget, (PTuple) fdsToKeepObj, tupleGetItem, castToIntNode, raiseNode); @@ -283,7 +284,7 @@ static int forkExec(VirtualFrame frame, Object[] args, Object executableList, bo if (Arrays.equals(bytes, sysExecutable)) { TruffleString[] additionalArgs = PythonOptions.getExecutableList(context); if (length != 1 && additionalArgs.length != 1) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.UNSUPPORTED_USE_OF_SYS_EXECUTABLE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.UNSUPPORTED_USE_OF_SYS_EXECUTABLE); } Object[] extendedArgs = new Object[additionalArgs.length + (processArgs.length == 0 ? 0 : processArgs.length - 1)]; for (int j = 0; j < additionalArgs.length; ++j) { @@ -318,7 +319,7 @@ static int forkExec(VirtualFrame frame, Object[] args, Object executableList, bo * Checks that the tuple contains only valid fds (positive integers fitting into an int) in * ascending order. */ - private static int[] convertFdSequence(Node inliningTarget, PTuple fdSequence, GetItemNode getItemNode, CastToJavaIntExactNode castToIntNode, PRaiseNode.Lazy raiseNode) { + private static int[] convertFdSequence(Node inliningTarget, PTuple fdSequence, GetItemNode getItemNode, CastToJavaIntExactNode castToIntNode, PRaiseNode raiseNode) { SequenceStorage storage = fdSequence.getSequenceStorage(); int len = storage.length(); int[] fds = new int[len]; @@ -333,7 +334,7 @@ private static int[] convertFdSequence(Node inliningTarget, PTuple fdSequence, G } catch (PException | CannotCastException e) { // 'handled' by raise() below } - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.BAD_VALUES_IN_FDS_TO_KEEP); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.BAD_VALUES_IN_FDS_TO_KEEP); } return fds; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PwdModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PwdModuleBuiltins.java index a79a3d1df3..ccf89d943b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PwdModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PwdModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,6 +46,7 @@ import java.util.Arrays; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; import com.oracle.graal.python.builtins.Builtin; @@ -75,7 +76,7 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary.PwdResult; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -93,12 +94,6 @@ public final class PwdModuleBuiltins extends PythonBuiltins { private static final TruffleString T_NOT_AVAILABLE = tsLiteral("NOT_AVAILABLE"); static final StructSequence.BuiltinTypeDescriptor STRUCT_PASSWD_DESC = new StructSequence.BuiltinTypeDescriptor( PythonBuiltinClassType.PStructPasswd, - // @formatter:off The formatter joins these lines making it less readable - "pwd.struct_passwd: Results from getpw*() routines.\n\n" + - "This object may be accessed either as a tuple of\n" + - " (pw_name,pw_passwd,pw_uid,pw_gid,pw_gecos,pw_dir,pw_shell)\n" + - "or via the object attributes as named in the above tuple.", - // @formatter:on 7, new String[]{ "pw_name", "pw_passwd", "pw_uid", "pw_gid", "pw_gecos", "pw_dir", "pw_shell", @@ -126,12 +121,12 @@ public void initialize(Python3Core core) { StructSequence.initType(core, STRUCT_PASSWD_DESC); } - private static Object[] createPwuidObject(Node inliningTarget, PwdResult pwd, PythonObjectFactory factory, InlinedConditionProfile unsignedConversionProfile) { + private static Object[] createPwuidObject(Node inliningTarget, PwdResult pwd, PythonLanguage language, InlinedConditionProfile unsignedConversionProfile) { return new Object[]{ pwd.name, T_NOT_AVAILABLE, - PInt.createPythonIntFromUnsignedLong(inliningTarget, factory, unsignedConversionProfile, pwd.uid), - PInt.createPythonIntFromUnsignedLong(inliningTarget, factory, unsignedConversionProfile, pwd.gid), + PInt.createPythonIntFromUnsignedLong(inliningTarget, language, unsignedConversionProfile, pwd.uid), + PInt.createPythonIntFromUnsignedLong(inliningTarget, language, unsignedConversionProfile, pwd.gid), /* gecos: */ T_EMPTY_STRING, pwd.dir, pwd.shell @@ -144,26 +139,25 @@ public abstract static class GetpwuidNode extends PythonUnaryBuiltinNode { @Specialization static Object doGetpwuid(VirtualFrame frame, Object uidObj, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached UidConversionNode uidConversionNode, @Cached IsBuiltinObjectProfile classProfile, @Cached GilNode gil, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached InlinedConditionProfile unsignedConversionProfile, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { long uid; try { uid = uidConversionNode.executeLong(frame, uidObj); } catch (PException ex) { if (classProfile.profileException(inliningTarget, ex, PythonBuiltinClassType.OverflowError)) { - throw raiseUidNotFound(raiseNode.get(inliningTarget)); + throw raiseUidNotFound(inliningTarget, raiseNode); } throw ex; } PwdResult pwd; try { - PythonContext context = PythonContext.get(inliningTarget); gil.release(true); try { pwd = posixLib.getpwuid(context.getPosixSupport(), uid); @@ -174,13 +168,14 @@ static Object doGetpwuid(VirtualFrame frame, Object uidObj, throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } if (pwd == null) { - throw raiseUidNotFound(raiseNode.get(inliningTarget)); + throw raiseUidNotFound(inliningTarget, raiseNode); } - return factory.createStructSeq(STRUCT_PASSWD_DESC, createPwuidObject(inliningTarget, pwd, factory, unsignedConversionProfile)); + PythonLanguage language = context.getLanguage(inliningTarget); + return PFactory.createStructSeq(language, STRUCT_PASSWD_DESC, createPwuidObject(inliningTarget, pwd, language, unsignedConversionProfile)); } - private static PException raiseUidNotFound(PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.KeyError, ErrorMessages.GETPWUID_NOT_FOUND); + private static PException raiseUidNotFound(Node inliningTarget, PRaiseNode raiseNode) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.KeyError, ErrorMessages.GETPWUID_NOT_FOUND); } } @@ -197,20 +192,20 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static Object doGetpwname(VirtualFrame frame, TruffleString name, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached GilNode gil, @Cached StringOrBytesToOpaquePathNode encodeFSDefault, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached InlinedConditionProfile unsignedConversionProfile, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { // Note: CPython also takes only Strings, not bytes, and then encodes the String // StringOrBytesToOpaquePathNode already checks for embedded '\0' Object nameEncoded = encodeFSDefault.execute(inliningTarget, name); PwdResult pwd; try { gil.release(true); - PythonContext context = PythonContext.get(inliningTarget); try { pwd = posixLib.getpwnam(context.getPosixSupport(), nameEncoded); } finally { @@ -220,9 +215,9 @@ static Object doGetpwname(VirtualFrame frame, TruffleString name, throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } if (pwd == null) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.KeyError, ErrorMessages.GETPWNAM_NAME_NOT_FOUND, name); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.KeyError, ErrorMessages.GETPWNAM_NAME_NOT_FOUND, name); } - return factory.createStructSeq(STRUCT_PASSWD_DESC, createPwuidObject(inliningTarget, pwd, factory, unsignedConversionProfile)); + return PFactory.createStructSeq(language, STRUCT_PASSWD_DESC, createPwuidObject(inliningTarget, pwd, context.getLanguage(inliningTarget), unsignedConversionProfile)); } } @@ -230,24 +225,25 @@ static Object doGetpwname(VirtualFrame frame, TruffleString name, @GenerateNodeFactory public abstract static class GetpwallNode extends PythonBuiltinNode { @Specialization - Object doGetpall(VirtualFrame frame, + static Object doGetpall(VirtualFrame frame, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached InlinedConditionProfile unsignedConversionProfile, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { // We cannot release the GIL, because the underlying POSIX calls are not thread safe PwdResult[] entries; try { - entries = posixLib.getpwentries(getPosixSupport()); + entries = posixLib.getpwentries(context.getPosixSupport()); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } + PythonLanguage language = context.getLanguage(inliningTarget); Object[] result = new Object[entries.length]; for (int i = 0; i < result.length; i++) { - result[i] = factory.createStructSeq(STRUCT_PASSWD_DESC, createPwuidObject(inliningTarget, entries[i], factory, unsignedConversionProfile)); + result[i] = PFactory.createStructSeq(language, STRUCT_PASSWD_DESC, createPwuidObject(inliningTarget, entries[i], language, unsignedConversionProfile)); } - return factory.createList(result); + return PFactory.createList(language, result); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PyExpatModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PyExpatModuleBuiltins.java deleted file mode 100644 index b6ef48b0b8..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PyExpatModuleBuiltins.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.modules; - -import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; - -import java.util.List; - -import com.oracle.graal.python.builtins.Builtin; -import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.PythonOS; -import com.oracle.graal.python.builtins.objects.common.EconomicMapStorage; -import com.oracle.graal.python.builtins.objects.module.PythonModule; -import com.oracle.graal.python.lib.PyObjectHashNode; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.GenerateNodeFactory; -import com.oracle.truffle.api.dsl.NodeFactory; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.api.strings.TruffleString.HashCodeNode; - -@CoreFunctions(defineModule = "pyexpat", os = PythonOS.PLATFORM_WIN32) -public final class PyExpatModuleBuiltins extends PythonBuiltins { - @Override - protected List> getNodeFactories() { - return PyExpatModuleBuiltinsFactory.getFactories(); - } - - private static enum ContentModelConstant { - XML_CQUANT_NONE(0), - XML_CQUANT_OPT(1), - XML_CQUANT_PLUS(3), - XML_CQUANT_REP(2), - XML_CTYPE_ANY(2), - XML_CTYPE_CHOICE(5), - XML_CTYPE_EMPTY(1), - XML_CTYPE_MIXED(3), - XML_CTYPE_NAME(4), - XML_CTYPE_SEQ(6); - - private final int number; - - private ContentModelConstant(int number) { - this.number = number; - } - } - - private static enum ErrorConstant { - XML_ERROR_NO_MEMORY("out of memory"), - XML_ERROR_SYNTAX("syntax error"), - XML_ERROR_NO_ELEMENTS("no element found"), - XML_ERROR_INVALID_TOKEN("not well-formed (invalid token)"), - XML_ERROR_UNCLOSED_TOKEN("unclosed token"), - XML_ERROR_PARTIAL_CHAR("partial character"), - XML_ERROR_TAG_MISMATCH("mismatched tag"), - XML_ERROR_DUPLICATE_ATTRIBUTE("duplicate attribute"), - XML_ERROR_JUNK_AFTER_DOC_ELEMENT("junk after document element"), - XML_ERROR_PARAM_ENTITY_REF("illegal parameter entity reference"), - XML_ERROR_UNDEFINED_ENTITY("undefined entity"), - XML_ERROR_RECURSIVE_ENTITY_REF("recursive entity reference"), - XML_ERROR_ASYNC_ENTITY("asynchronous entity"), - XML_ERROR_BAD_CHAR_REF("reference to invalid character number"), - XML_ERROR_BINARY_ENTITY_REF("reference to binary entity"), - XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF("reference to external entity in attribute"), - XML_ERROR_MISPLACED_XML_PI("XML or text declaration not at start of entity"), - XML_ERROR_UNKNOWN_ENCODING("unknown encoding"), - XML_ERROR_INCORRECT_ENCODING("encoding specified in XML declaration is incorrect"), - XML_ERROR_UNCLOSED_CDATA_SECTION("unclosed CDATA section"), - XML_ERROR_EXTERNAL_ENTITY_HANDLING("error in processing external entity reference"), - XML_ERROR_NOT_STANDALONE("document is not standalone"), - XML_ERROR_UNEXPECTED_STATE("unexpected parser state - please send a bug report"), - XML_ERROR_ENTITY_DECLARED_IN_PE("entity declared in parameter entity"), - XML_ERROR_FEATURE_REQUIRES_XML_DTD("requested feature requires XML_DTD support in Expat"), - XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING("cannot change setting once parsing has begun"), - XML_ERROR_UNBOUND_PREFIX("unbound prefix"), - XML_ERROR_UNDECLARING_PREFIX("must not undeclare prefix"), - XML_ERROR_INCOMPLETE_PE("incomplete markup in parameter entity"), - XML_ERROR_XML_DECL("XML declaration not well-formed"), - XML_ERROR_TEXT_DECL("text declaration not well-formed"), - XML_ERROR_PUBLICID("illegal character(s) in public id"), - XML_ERROR_SUSPENDED("parser suspended"), - XML_ERROR_NOT_SUSPENDED("parser not suspended"), - XML_ERROR_ABORTED("parsing aborted"), - XML_ERROR_FINISHED("parsing finished"), - XML_ERROR_SUSPEND_PE("cannot suspend in external parameter entity"); - - private final String message; - - private ErrorConstant(String message) { - this.message = message; - } - } - - @Override - public void initialize(Python3Core core) { - super.initialize(core); - PythonModule model = core.factory().createPythonModule(toTruffleStringUncached("pyexpat.model")); - for (ContentModelConstant v : ContentModelConstant.values()) { - model.setAttribute(toTruffleStringUncached(v.name()), v.number); - } - addBuiltinConstant("model", model); - - PythonModule errors = core.factory().createPythonModule(toTruffleStringUncached("pyexpat.errors")); - EconomicMapStorage codes = EconomicMapStorage.create(ErrorConstant.values().length); - EconomicMapStorage messages = EconomicMapStorage.create(ErrorConstant.values().length); - for (ErrorConstant c : ErrorConstant.values()) { - TruffleString messageTs = toTruffleStringUncached(c.message); - errors.setAttribute(toTruffleStringUncached(c.name()), messageTs); - int id = c.ordinal() + 1; - codes.putUncachedWithJavaEq(messageTs, PyObjectHashNode.hash(messageTs, HashCodeNode.getUncached()), id); - messages.putUncachedWithJavaEq(id, PyObjectHashNode.hash(id), c.message); - } - errors.setAttribute(toTruffleStringUncached("messages"), core.factory().createDict(messages)); - errors.setAttribute(toTruffleStringUncached("codes"), core.factory().createDict(codes)); - addBuiltinConstant("errors", errors); - } - - @Builtin(name = "ParserCreate", parameterNames = {"encoding", "namespace_separator", "intern"}, doc = "Return a new XML parser object.") - @GenerateNodeFactory - abstract static class ParserCreateNode extends PythonTernaryBuiltinNode { - @SuppressWarnings("unused") - @Specialization - @TruffleBoundary - Object fail(Object encoding, Object namespace_separator, Object intern) { - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.NotImplementedError, toTruffleStringUncached("XML pyexpat parser is not implemented")); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/QueueModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/QueueModuleBuiltins.java index 60ac362574..76ed5ed096 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/QueueModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/QueueModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,30 +40,22 @@ */ package com.oracle.graal.python.builtins.modules; -import static com.oracle.graal.python.nodes.BuiltinNames.J_SIMPLE_QUEUE; - +import java.util.Collections; import java.util.List; -import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.objects.queue.PSimpleQueue; import com.oracle.graal.python.nodes.BuiltinNames; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; -import com.oracle.truffle.api.dsl.Specialization; @CoreFunctions(defineModule = "_queue") public final class QueueModuleBuiltins extends PythonBuiltins { @Override protected List> getNodeFactories() { - return QueueModuleBuiltinsFactory.getFactories(); + return Collections.emptyList(); } @Override @@ -71,18 +63,4 @@ public void initialize(Python3Core core) { super.initialize(core); addBuiltinConstant(BuiltinNames.T_EMPTY_CLASS_NAME, core.lookupType(PythonBuiltinClassType.Empty)); } - - // _queue.SimpleQueue - @Builtin(name = J_SIMPLE_QUEUE, constructsClass = PythonBuiltinClassType.PSimpleQueue, // - minNumOfPositionalArgs = 1, // - doc = "SimpleQueue()\n--\n\nSimple, unbounded, reentrant FIFO queue.") - @GenerateNodeFactory - abstract static class SimpleQueueNode extends PythonUnaryBuiltinNode { - - @Specialization - static PSimpleQueue doGeneric(Object cls, - @Cached PythonObjectFactory factory) { - return factory.createSimpleQueue(cls); - } - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/RandomModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/RandomModuleBuiltins.java index 810cc61d65..88668696bc 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/RandomModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/RandomModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -25,49 +25,19 @@ */ package com.oracle.graal.python.builtins.modules; -import static com.oracle.graal.python.util.PythonUtils.tsLiteral; - +import java.util.Collections; import java.util.List; -import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.random.PRandom; -import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.strings.TruffleString; @CoreFunctions(defineModule = "_random") public final class RandomModuleBuiltins extends PythonBuiltins { @Override protected List> getNodeFactories() { - return RandomModuleBuiltinsFactory.getFactories(); - } - - // _random.Random([seed]) - @Builtin(name = "Random", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, constructsClass = PythonBuiltinClassType.PRandom, takesVarKeywordArgs = true) - @GenerateNodeFactory - abstract static class PRandomNode extends PythonBuiltinNode { - private static final TruffleString T_SEED = tsLiteral("seed"); - - @Child LookupAndCallBinaryNode setSeed = LookupAndCallBinaryNode.create(T_SEED); - - @Specialization - PRandom random(VirtualFrame frame, Object cls, Object seed, - @Cached PythonObjectFactory factory) { - PRandom random = factory.createRandom(cls); - setSeed.executeObject(frame, random, seed != PNone.NO_VALUE ? seed : PNone.NONE); - return random; - } + return Collections.emptyList(); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ReadlineModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ReadlineModuleBuiltins.java index 97c29ed086..61e8a92340 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ReadlineModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ReadlineModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -49,13 +49,11 @@ import java.io.IOException; import java.nio.file.StandardOpenOption; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.module.PythonModule; @@ -88,7 +86,6 @@ protected List> getNodeFa } private static final class LocalData { - private final HashMap bindings = new HashMap<>(); private final List history = new ArrayList<>(); protected Object completer = null; protected boolean autoHistory = true; @@ -130,16 +127,9 @@ PNone setCompleter(PythonModule self, Object callable) { @GenerateNodeFactory abstract static class ParseAndBindNode extends PythonBinaryBuiltinNode { @Specialization - @TruffleBoundary - PNone setCompleter(PythonModule self, TruffleString tspec) { - String spec = tspec.toJavaStringUncached(); - if (spec.startsWith("tab:")) { - LocalData data = self.getModuleState(LocalData.class); - data.bindings.put("tab", spec.split(":")[1].trim()); - return PNone.NONE; - } else { - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.NotImplementedError, toTruffleStringUncached("any other binding than 'tab'")); - } + static PNone parseAndBind(@SuppressWarnings("unused") PythonModule self, @SuppressWarnings("unused") TruffleString tspec) { + // TODO implement + return PNone.NONE; } } @@ -148,8 +138,8 @@ PNone setCompleter(PythonModule self, TruffleString tspec) { abstract static class ReadInitNode extends PythonUnaryBuiltinNode { @Specialization static PNone setCompleter(@SuppressWarnings("unused") PythonModule self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.OSError, ErrorMessages.NOT_IMPLEMENTED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.OSError, ErrorMessages.NOT_IMPLEMENTED); } } @@ -174,7 +164,7 @@ TruffleString setCompleter(PythonModule self, int index) { try { return data.history.get(index); } catch (IndexOutOfBoundsException e) { - throw PRaiseNode.raiseUncached(this, PythonErrorType.IndexError, ErrorMessages.INDEX_OUT_OF_BOUNDS); + throw PRaiseNode.raiseStatic(this, PythonErrorType.IndexError, ErrorMessages.INDEX_OUT_OF_BOUNDS); } } } @@ -196,7 +186,7 @@ TruffleString setCompleter(PythonModule self, int index, TruffleString string) { try { return data.history.set(index, string); } catch (IndexOutOfBoundsException e) { - throw PRaiseNode.raiseUncached(this, PythonErrorType.IndexError, ErrorMessages.INDEX_OUT_OF_BOUNDS); + throw PRaiseNode.raiseStatic(this, PythonErrorType.IndexError, ErrorMessages.INDEX_OUT_OF_BOUNDS); } } } @@ -211,7 +201,7 @@ TruffleString setCompleter(PythonModule self, int index) { try { return data.history.remove(index); } catch (IndexOutOfBoundsException e) { - throw PRaiseNode.raiseUncached(this, PythonErrorType.IndexError, ErrorMessages.INDEX_OUT_OF_BOUNDS); + throw PRaiseNode.raiseStatic(this, PythonErrorType.IndexError, ErrorMessages.INDEX_OUT_OF_BOUNDS); } } } @@ -258,7 +248,7 @@ PNone setCompleter(PythonModule self, TruffleString path) { } reader.close(); } catch (IOException e) { - throw PRaiseNode.raiseUncached(this, PythonErrorType.IOError, e); + throw PRaiseNode.raiseStatic(this, PythonErrorType.IOError, e); } return PNone.NONE; } @@ -286,7 +276,7 @@ PNone setCompleter(PythonModule self, TruffleString path) { } writer.close(); } catch (IOException e) { - throw PRaiseNode.raiseUncached(this, PythonErrorType.IOError, e); + throw PRaiseNode.raiseStatic(this, PythonErrorType.IOError, e); } return PNone.NONE; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ResourceModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ResourceModuleBuiltins.java index 1fd1a2df14..e094283568 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ResourceModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ResourceModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,6 +44,7 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -62,7 +63,8 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PosixSupportLibrary.RusageResult; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -91,13 +93,6 @@ public final class ResourceModuleBuiltins extends PythonBuiltins { static final StructSequence.BuiltinTypeDescriptor STRUCT_RUSAGE_DESC = new StructSequence.BuiltinTypeDescriptor( PythonBuiltinClassType.PStructRusage, - // @formatter:off The formatter joins these lines making it less readable - "struct_rusage: Result from getrusage.\n\n" + - "This object may be accessed either as a tuple of\n" + - " (utime,stime,maxrss,ixrss,idrss,isrss,minflt,majflt,\n" + - " nswap,inblock,oublock,msgsnd,msgrcv,nsignals,nvcsw,nivcsw)\n" + - "or via the attributes ru_utime, ru_stime, ru_maxrss, and so on.", - // @formatter:on 16, new String[]{ "ru_utime", "ru_stime", "ru_maxrss", @@ -159,22 +154,23 @@ abstract static class GetRuUsageNode extends PythonBuiltinNode { @Specialization static PTuple getruusage(VirtualFrame frame, int who, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PRaiseNode.Lazy raiseNode) { - PosixSupport posixSupport = PosixSupport.get(inliningTarget); + @Cached PRaiseNode raiseNode) { + PosixSupport posixSupport = context.getPosixSupport(); RusageResult rusage; try { rusage = posixLib.getrusage(posixSupport, who); } catch (PosixException e) { if (e.getErrorCode() == OSErrorEnum.EINVAL.getNumber()) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.RUSAGE_INVALID_WHO); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.RUSAGE_INVALID_WHO); } else { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } } - return PythonObjectFactory.getUncached().createStructSeq(STRUCT_RUSAGE_DESC, + return PFactory.createStructSeq(context.getLanguage(inliningTarget), STRUCT_RUSAGE_DESC, rusage.ru_utime(), rusage.ru_stime(), rusage.ru_maxrss(), rusage.ru_ixrss(), rusage.ru_idrss(), rusage.ru_isrss(), rusage.ru_minflt(), rusage.ru_majflt(), rusage.ru_nswap(), rusage.ru_inblock(), rusage.ru_oublock(), @@ -196,9 +192,9 @@ static int getPageSize() { abstract static class GetRLimitNode extends PythonBuiltinNode { @Specialization static PTuple getPageSize(@SuppressWarnings("unused") int which, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { // dummy implementation - report "unrestricted" for everything - return factory.createTuple(new Object[]{RLIM_INFINITY, RLIM_INFINITY}); + return PFactory.createTuple(language, new Object[]{RLIM_INFINITY, RLIM_INFINITY}); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SREModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SREModuleBuiltins.java index 8ba102f635..f451ab7bb2 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SREModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SREModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -54,41 +54,43 @@ import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.array.PArray; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary; +import com.oracle.graal.python.builtins.objects.bytes.BytesNodes; import com.oracle.graal.python.builtins.objects.cext.common.NativePointer; import com.oracle.graal.python.builtins.objects.exception.PBaseException; +import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView; +import com.oracle.graal.python.builtins.objects.mmap.PMMap; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.slice.SliceNodes; -import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.lib.PyLongAsIntNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyNumberIndexNode; import com.oracle.graal.python.lib.PyObjectGetItem; import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.lib.PyObjectSizeNode; +import com.oracle.graal.python.lib.PyUnicodeCheckNode; import com.oracle.graal.python.nodes.BuiltinNames; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.HiddenAttr; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.attributes.GetAttributeNode; +import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonSenaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; @@ -103,11 +105,11 @@ import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.ReportPolymorphism; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.interop.ArityException; import com.oracle.truffle.api.interop.ExceptionType; import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.interop.UnknownIdentifierException; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.interop.UnsupportedTypeException; @@ -137,7 +139,7 @@ public void initialize(Python3Core core) { super.initialize(core); } - public enum PythonMethod { + public enum PythonMethod implements TruffleObject { Search(tsLiteral("search")), Match(tsLiteral("match")), FullMatch(tsLiteral("fullmatch")); @@ -193,7 +195,7 @@ public static final class TRegexCache { private static final int FLAG_ASCII = 256; @TruffleBoundary - public TRegexCache(Object pattern, int flags) { + public TRegexCache(Node node, Object pattern, int flags) { this.originalPattern = pattern; String patternStr; boolean binary = true; @@ -205,7 +207,7 @@ public TRegexCache(Object pattern, int flags) { try { buffer = PythonBufferAcquireLibrary.getUncached().acquireReadonly(pattern); } catch (PException e) { - throw PRaiseNode.getUncached().raise(TypeError, ErrorMessages.EXPECTED_STR_OR_BYTESLIKE_OBJ); + throw PRaiseNode.raiseStatic(node, TypeError, ErrorMessages.EXPECTED_STR_OR_BYTESLIKE_OBJ); } PythonBufferAccessLibrary bufferLib = PythonBufferAccessLibrary.getUncached(); try { @@ -381,7 +383,7 @@ private String getTRegexOptions(String encoding, PythonMethod pythonMethod, bool } @TruffleBoundary - public Object compile(PythonContext context, PythonMethod method, boolean mustAdvance, TruffleString locale) { + public Object compile(Node node, PythonContext context, PythonMethod method, boolean mustAdvance, TruffleString locale) { String encoding = isBinary() ? ENCODING_LATIN_1 : ENCODING_UTF_32; String options = getTRegexOptions(encoding, method, mustAdvance, locale); InteropLibrary lib = InteropLibrary.getUncached(); @@ -395,7 +397,7 @@ public Object compile(PythonContext context, PythonMethod method, boolean mustAd regexp = compiledRegex; } } catch (RuntimeException e) { - throw handleCompilationError(e, lib, context); + throw handleCompilationError(node, e, lib, context); } if (isLocaleSensitive()) { setLocaleSensitiveRegexp(method, mustAdvance, locale, regexp); @@ -405,7 +407,7 @@ public Object compile(PythonContext context, PythonMethod method, boolean mustAd return regexp; } - private RuntimeException handleCompilationError(RuntimeException e, InteropLibrary lib, PythonContext context) { + private RuntimeException handleCompilationError(Node node, RuntimeException e, InteropLibrary lib, PythonContext context) { try { if (lib.isException(e)) { if (lib.getExceptionType(e) == ExceptionType.PARSE_ERROR) { @@ -414,14 +416,14 @@ private RuntimeException handleCompilationError(RuntimeException e, InteropLibra reason.equalsUncached(T_VALUE_ERROR_LOCALE_FLAG_STR_PATTERN, TS_ENCODING) || reason.equalsUncached(T_VALUE_ERROR_ASCII_UNICODE_INCOMPATIBLE, TS_ENCODING) || reason.equalsUncached(T_VALUE_ERROR_ASCII_LOCALE_INCOMPATIBLE, TS_ENCODING)) { - return PRaiseNode.getUncached().raise(ValueError, reason); + return PRaiseNode.raiseStatic(node, ValueError, reason); } else { SourceSection sourceSection = lib.getSourceLocation(e); int position = sourceSection.getCharIndex(); PythonModule module = context.lookupBuiltinModule(BuiltinNames.T__SRE); Object errorConstructor = PyObjectLookupAttr.executeUncached(module, T_ERROR); PBaseException exception = (PBaseException) CallNode.executeUncached(errorConstructor, reason, originalPattern, position); - return PRaiseNode.getUncached().raiseExceptionObject(exception); + return PRaiseNode.raiseExceptionObject(node, exception); } } } @@ -460,7 +462,6 @@ public int hashCode() { } @Builtin(name = "tregex_init_cache", minNumOfPositionalArgs = 3) - @TypeSystemReference(PythonArithmeticTypes.class) @GenerateNodeFactory abstract static class TRegexInitCache extends PythonTernaryBuiltinNode { @@ -470,14 +471,13 @@ Object call(VirtualFrame frame, PythonObject patternObject, Object pattern, Obje @Cached PyLongAsIntNode flagsToIntNode, @Cached HiddenAttr.WriteNode writeCacheNode) { int flagsStr = flagsToIntNode.execute(frame, inliningTarget, flags); - TRegexCache tRegexCache = new TRegexCache(pattern, flagsStr); + TRegexCache tRegexCache = new TRegexCache(inliningTarget, pattern, flagsStr); writeCacheNode.execute(inliningTarget, patternObject, HiddenAttr.TREGEX_CACHE, tRegexCache); return PNone.NONE; } } @Builtin(name = "tregex_compile", minNumOfPositionalArgs = 3) - @TypeSystemReference(PythonArithmeticTypes.class) @GenerateNodeFactory @ImportStatic(PythonMethod.class) abstract static class TRegexCompile extends PythonTernaryBuiltinNode { @@ -512,7 +512,7 @@ Object localeNonSensitive(PythonObject pattern, PythonMethod method, boolean mus if (tRegex != null) { return tRegex; } else { - return tRegexCache.compile(getContext(), method, mustAdvance, null); + return tRegexCache.compile(this, getContext(), method, mustAdvance, null); } } @@ -531,7 +531,7 @@ Object localeSensitive(VirtualFrame frame, PythonObject pattern, PythonMethod me if (tRegex != null) { return tRegex; } else { - return tRegexCache.compile(getContext(), method, mustAdvance, locale); + return tRegexCache.compile(this, getContext(), method, mustAdvance, locale); } } @@ -557,32 +557,26 @@ abstract static class RECheckInputTypeNode extends Node { public abstract void execute(VirtualFrame frame, Object input, boolean expectBytes); @Specialization - static void check(VirtualFrame frame, Object input, boolean expectBytes, + static void check(Object input, boolean expectBytes, @Bind("this") Node inliningTarget, - @Cached("getSupportedBinaryInputTypes()") PTuple supportedBinaryInputTypes, - @Cached BuiltinFunctions.IsInstanceNode isStringNode, - @Cached BuiltinFunctions.IsInstanceNode isBytesNode, - @Cached InlinedConditionProfile unsupportedInputTypeProfile, - @Cached InlinedConditionProfile unexpectedInputTypeProfile, - @Cached PRaiseNode.Lazy raiseNode) { - boolean isString = (boolean) isStringNode.execute(frame, input, PythonBuiltinClassType.PString); - boolean isBytes = !isString && (boolean) isBytesNode.execute(frame, input, supportedBinaryInputTypes); - if (unsupportedInputTypeProfile.profile(inliningTarget, !isString && !isBytes)) { - throw raiseNode.get(inliningTarget).raise(TypeError, T_UNSUPPORTED_INPUT_TYPE); - } - if (unexpectedInputTypeProfile.profile(inliningTarget, expectBytes != isBytes)) { + @Cached PyUnicodeCheckNode unicodeCheckNode, + @Cached BytesNodes.BytesLikeCheck bytesLikeCheck, + @Cached PRaiseNode unexpectedStrRaise, + @Cached PRaiseNode unexpectedBytesRaise, + @Cached PRaiseNode unexpectedTypeRaise) { + if (unicodeCheckNode.execute(inliningTarget, input)) { if (expectBytes) { - throw raiseNode.get(inliningTarget).raise(TypeError, T_UNEXPECTED_STR); - } else { - throw raiseNode.get(inliningTarget).raise(TypeError, T_UNEXPECTED_BYTES); + throw unexpectedStrRaise.raise(inliningTarget, TypeError, T_UNEXPECTED_STR); } + return; } - } - - @NeverDefault - protected PTuple getSupportedBinaryInputTypes() { - return PythonObjectFactory.getUncached().createTuple(new Object[]{PythonBuiltinClassType.PBytes, PythonBuiltinClassType.PByteArray, PythonBuiltinClassType.PMMap, - PythonBuiltinClassType.PMemoryView, PythonBuiltinClassType.PArray}); + if (bytesLikeCheck.execute(inliningTarget, input) || input instanceof PMMap || input instanceof PMemoryView || input instanceof PArray) { + if (!expectBytes) { + throw unexpectedBytesRaise.raise(inliningTarget, TypeError, T_UNEXPECTED_BYTES); + } + return; + } + throw unexpectedTypeRaise.raise(inliningTarget, TypeError, T_UNSUPPORTED_INPUT_TYPE); } } @@ -597,7 +591,7 @@ abstract static class CreateMatchFromTRegexResultNode extends PNodeWithContext { @Specialization static Object createMatch(VirtualFrame frame, Node inliningTarget, Object pattern, int pos, int endPos, Object regexResult, Object input, - @Cached("lookupMatchConstructor()") Object matchConstructor, + @Cached GetMatchConstructorNode getConstructor, @Cached InlinedConditionProfile matchProfile, @CachedLibrary(limit = "1") InteropLibrary libResult, @Cached PyObjectLookupAttr lookupIndexGroupNode, @@ -605,7 +599,7 @@ static Object createMatch(VirtualFrame frame, Node inliningTarget, Object patter try { if (matchProfile.profile(inliningTarget, (boolean) libResult.readMember(regexResult, "isMatch"))) { Object indexGroup = lookupIndexGroupNode.execute(frame, inliningTarget, pattern, T__PATTERN__INDEXGROUP); - return constructResultNode.execute(frame, matchConstructor, pattern, pos, endPos, regexResult, input, indexGroup); + return constructResultNode.execute(frame, getConstructor.execute(inliningTarget), pattern, pos, endPos, regexResult, input, indexGroup); } else { return PNone.NONE; } @@ -614,16 +608,35 @@ static Object createMatch(VirtualFrame frame, Node inliningTarget, Object patter } } - @TruffleBoundary - @NeverDefault - protected Object lookupMatchConstructor() { - PythonModule module = getContext().lookupBuiltinModule(BuiltinNames.T__SRE); - return PyObjectLookupAttr.executeUncached(module, T_MATCH_CONSTRUCTOR); + @GenerateInline + @GenerateCached(false) + abstract static class GetMatchConstructorNode extends PNodeWithContext { + public abstract Object execute(Node inliningTarget); + + @Specialization(guards = "isSingleContext()") + static Object doSingleContext( + @Cached("lookupMatchConstructor()") Object constructor) { + return constructor; + } + + @Specialization(replaces = "doSingleContext") + static Object doRead( + @Bind PythonContext context, + @Cached ReadAttributeFromObjectNode read) { + PythonModule module = context.lookupBuiltinModule(BuiltinNames.T__SRE); + return read.execute(module, T_MATCH_CONSTRUCTOR); + } + + @TruffleBoundary + @NeverDefault + protected static Object lookupMatchConstructor() { + PythonModule module = PythonContext.get(null).lookupBuiltinModule(BuiltinNames.T__SRE); + return PyObjectLookupAttr.executeUncached(module, T_MATCH_CONSTRUCTOR); + } } } @Builtin(name = "tregex_search", minNumOfPositionalArgs = 6) - @TypeSystemReference(PythonArithmeticTypes.class) @GenerateNodeFactory @ImportStatic(PythonMethod.class) abstract static class TRegexSearch extends PythonSenaryBuiltinNode { @@ -781,7 +794,6 @@ private PyObjectGetItem getGetItemNode() { } @Builtin(name = "tregex_call_exec", minNumOfPositionalArgs = 3) - @TypeSystemReference(PythonArithmeticTypes.class) @GenerateNodeFactory abstract static class TRegexCallExec extends PythonTernaryBuiltinNode { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SSLModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SSLModuleBuiltins.java index e03d62c3fd..c72e2d4d63 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SSLModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SSLModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -67,8 +67,8 @@ import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; +import com.oracle.graal.python.runtime.PythonContext; import org.bouncycastle.util.encoders.DecoderException; -import org.graalvm.nativeimage.ImageInfo; import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; @@ -98,7 +98,7 @@ import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.TruffleFile; import com.oracle.truffle.api.TruffleLogger; @@ -163,10 +163,10 @@ protected List> getNodeFa return SSLModuleBuiltinsFactory.getFactories(); } - private static synchronized void loadDefaults() { - if (ImageInfo.inImageBuildtimeCode()) { + private static synchronized void loadDefaults(PythonContext pythonContext) { + if (pythonContext.getEnv().isPreInitialization()) { // The values are dependent on system properties, don't bake them into the image - throw new AssertionError("SSL module initialized at build time"); + throw new AssertionError("SSL module initialized during pre-initialization"); } try { SSLContext context = SSLContext.getInstance("TLS"); @@ -218,11 +218,10 @@ private static boolean tryProtocolAvailability(SSLContext context, SSLProtocol p @Override public void postInitialize(Python3Core core) { super.postInitialize(core); - loadDefaults(); + loadDefaults(core.getContext()); PythonModule module = core.lookupBuiltinModule(T__SSL); - PythonObjectFactory factory = core.factory(); module.setAttribute(tsLiteral("OPENSSL_VERSION_NUMBER"), 0); - PTuple versionInfo = factory.createTuple(new int[]{0, 0, 0, 0, 0}); + PTuple versionInfo = PFactory.createTuple(core.getLanguage(), new int[]{0, 0, 0, 0, 0}); module.setAttribute(tsLiteral("OPENSSL_VERSION_INFO"), versionInfo); module.setAttribute(tsLiteral("OPENSSL_VERSION"), toTruffleStringUncached("GraalVM JSSE")); module.setAttribute(tsLiteral("_DEFAULT_CIPHERS"), T_DEFAULT_CIPHER_STRING); @@ -310,15 +309,15 @@ abstract static class Txt2ObjNode extends PythonBinaryClinicBuiltinNode { static Object txt2obj(TruffleString txt, boolean name, @Bind("this") Node inliningTarget, @Cached TruffleString.EqualNode equalNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { // TODO implement properly if (equalNode.execute(T_OID_TLS_SERVER, txt, TS_ENCODING)) { - return factory.createTuple(new Object[]{129, T_SERVER_AUTH, T_TLS_WEB_SERVER_AUTHENTICATION, txt}); + return PFactory.createTuple(language, new Object[]{129, T_SERVER_AUTH, T_TLS_WEB_SERVER_AUTHENTICATION, txt}); } else if (equalNode.execute(T_OID_TLS_CLIENT, txt, TS_ENCODING)) { - return factory.createTuple(new Object[]{130, T_CLIENT_AUTH, T_TLS_WEB_CLIENT_AUTHENTICATION, txt}); + return PFactory.createTuple(language, new Object[]{130, T_CLIENT_AUTH, T_TLS_WEB_CLIENT_AUTHENTICATION, txt}); } - throw raiseNode.get(inliningTarget).raise(NotImplementedError); + throw raiseNode.raise(inliningTarget, NotImplementedError); } @Override @@ -333,8 +332,8 @@ abstract static class Nid2ObjNode extends PythonUnaryBuiltinNode { @Specialization @SuppressWarnings("unused") static Object nid2obj(Object nid, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(NotImplementedError); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError); } } @@ -343,8 +342,8 @@ static Object nid2obj(Object nid, abstract static class RandStatusNode extends PythonBuiltinNode { @Specialization static Object randStatus( - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(NotImplementedError); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError); } } @@ -354,8 +353,8 @@ abstract static class RandAddNode extends PythonBinaryBuiltinNode { @Specialization @SuppressWarnings("unused") static Object randAdd(Object string, Object entropy, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(NotImplementedError); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError); } } @@ -365,8 +364,8 @@ abstract static class RandBytesNode extends PythonUnaryBuiltinNode { @Specialization @SuppressWarnings("unused") static Object randBytes(Object n, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(NotImplementedError); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError); } } @@ -376,8 +375,8 @@ abstract static class RandPseudoBytesNode extends PythonUnaryBuiltinNode { @Specialization @SuppressWarnings("unused") static Object randPseudoBytes(Object n, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(NotImplementedError); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError); } } @@ -389,11 +388,11 @@ abstract static class GetDefaultVerifyPathsNode extends PythonBuiltinNode { @Specialization Object getDefaultPaths( - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { // there is no default location given by graalpython // in case the env variables SSL_CERT_FILE or SSL_CERT_DIR // are provided, ssl.py#get_default_verify_paths will take care of it - return factory.createTuple(new Object[]{T_SSL_CERT_FILE, T_EMPTY_STRING, T_SSL_CERT_DIR, T_EMPTY_STRING}); + return PFactory.createTuple(language, new Object[]{T_SSL_CERT_FILE, T_EMPTY_STRING, T_SSL_CERT_DIR, T_EMPTY_STRING}); } } @@ -409,8 +408,8 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static Object fail(TruffleString argument, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PermissionError); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PermissionError); } } @@ -438,7 +437,7 @@ private Object decode(TruffleFile file) throws PException { if (!(cert instanceof X509Certificate)) { throw PConstructAndRaiseNode.raiseUncachedSSLError(SSL_ERR_DECODING_PEM_FILE_UNEXPECTED_S, cert.getClass().getName()); } - return CertUtils.decodeCertificate(getContext().factory(), (X509Certificate) certs.get(0)); + return CertUtils.decodeCertificate((X509Certificate) certs.get(0), PythonLanguage.get(null)); } catch (IOException | DecoderException ex) { throw PConstructAndRaiseNode.raiseUncachedSSLError(SSL_CANT_OPEN_FILE_S, ex.toString()); } catch (CertificateException | CRLException ex) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SelectModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SelectModuleBuiltins.java index 1214db605d..28281d1d0d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SelectModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SelectModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,6 +46,7 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -74,7 +75,7 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary.SelectResult; import com.oracle.graal.python.runtime.PosixSupportLibrary.Timeval; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.PSequence; import com.oracle.graal.python.util.ArrayBuilder; import com.oracle.graal.python.util.IntArrayBuilder; @@ -132,8 +133,8 @@ static PTuple doGeneric(VirtualFrame frame, Object rlist, Object wlist, Object x @Cached InlinedBranchProfile notSelectableBranch, @Cached GilNode gil, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { ObjAndFDList readFDs = seq2set(frame, inliningTarget, rlist, sizeNode, asFileDescriptor, callGetItemNode, constructListNode, raiseNode); ObjAndFDList writeFDs = seq2set(frame, inliningTarget, wlist, sizeNode, asFileDescriptor, callGetItemNode, constructListNode, raiseNode); ObjAndFDList xFDs = seq2set(frame, inliningTarget, xlist, sizeNode, asFileDescriptor, callGetItemNode, constructListNode, raiseNode); @@ -143,7 +144,7 @@ static PTuple doGeneric(VirtualFrame frame, Object rlist, Object wlist, Object x isNotNoneTimeout.enter(inliningTarget); timeoutval = TimeUtils.pyTimeAsTimeval(pyTimeFromObjectNode.execute(frame, inliningTarget, timeout, RoundType.TIMEOUT, SEC_TO_NS)); if (timeoutval.getSeconds() < 0) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.MUST_BE_NON_NEGATIVE, "timeout"); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.MUST_BE_NON_NEGATIVE, "timeout"); } } @@ -161,18 +162,18 @@ static PTuple doGeneric(VirtualFrame frame, Object rlist, Object wlist, Object x // GraalPython hack: if one of the channels is not selectable (can happen only in // the emulated mode), we just return everything. notSelectableBranch.enter(inliningTarget); - return factory.createTuple(new Object[]{rlist, wlist, xlist}); + return PFactory.createTuple(language, new Object[]{rlist, wlist, xlist}); } - return factory.createTuple(new PList[]{ - toList(result.getReadFds(), readFDs, factory), - toList(result.getWriteFds(), writeFDs, factory), - toList(result.getErrorFds(), xFDs, factory)}); + return PFactory.createTuple(language, new PList[]{ + toList(result.getReadFds(), readFDs, language), + toList(result.getWriteFds(), writeFDs, language), + toList(result.getErrorFds(), xFDs, language)}); } /** * Also maps the returned FDs back to their original Python level objects. */ - private static PList toList(boolean[] result, ObjAndFDList fds, PythonObjectFactory factory) { + private static PList toList(boolean[] result, ObjAndFDList fds, PythonLanguage language) { Object[] resultObjs = new Object[result.length]; int resultObjsIdx = 0; for (int i = 0; i < fds.fds.length; i++) { @@ -180,12 +181,12 @@ private static PList toList(boolean[] result, ObjAndFDList fds, PythonObjectFact resultObjs[resultObjsIdx++] = fds.objects[i]; } } - return factory.createList(PythonUtils.arrayCopyOf(resultObjs, resultObjsIdx)); + return PFactory.createList(language, PythonUtils.arrayCopyOf(resultObjs, resultObjsIdx)); } private static ObjAndFDList seq2set(VirtualFrame frame, Node inliningTarget, Object sequence, PyObjectSizeNode sizeNode, PyObjectAsFileDescriptor asFileDescriptor, PyObjectGetItem callGetItemNode, - FastConstructListNode constructListNode, PRaiseNode.Lazy raiseNode) { + FastConstructListNode constructListNode, PRaiseNode raiseNode) { // We cannot assume any size of those two arrays, because the sequence may change as a // side effect of the invocation of fileno. We also need to call PyObjectSizeNode // repeatedly in the loop condition @@ -197,7 +198,7 @@ private static ObjAndFDList seq2set(VirtualFrame frame, Node inliningTarget, Obj objects.add(pythonObject); int fd = asFileDescriptor.execute(frame, inliningTarget, pythonObject); if (fd >= FD_SETSIZE.value) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.FILE_DESCRIPTOR_OUT_OF_RANGE_IN_SELECT); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.FILE_DESCRIPTOR_OUT_OF_RANGE_IN_SELECT); } fds.add(fd); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SignalModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SignalModuleBuiltins.java index f2d5e0d939..47853da8ef 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SignalModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SignalModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,9 +41,12 @@ package com.oracle.graal.python.builtins.modules; import static com.oracle.graal.python.nodes.BuiltinNames.T__SIGNAL; +import static com.oracle.graal.python.nodes.StringLiterals.T_JAVA; +import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import static com.oracle.graal.python.util.TimeUtils.SEC_TO_US; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -54,8 +57,7 @@ import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; -import org.graalvm.nativeimage.ImageInfo; - +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; @@ -82,10 +84,12 @@ import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; import com.oracle.graal.python.runtime.AsyncHandler; +import com.oracle.graal.python.runtime.PosixSupportLibrary; +import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -122,11 +126,23 @@ public void initialize(Python3Core core) { addBuiltinConstant("ITIMER_VIRTUAL", ITIMER_VIRTUAL); addBuiltinConstant("ITIMER_PROF", ITIMER_PROF); addBuiltinConstant("NSIG", Signals.SIGMAX + 1); - for (int i = 0; i < Signals.SIGNAL_NAMES.length; i++) { - String name = Signals.SIGNAL_NAMES[i]; - if (name != null) { - addBuiltinConstant("SIG" + name, i); - } + } + + /* + * When using emulated posix mode (where we esentially emulate Linux), we rely on some signals + * being present even if they don't exist on the underlying platform, i.e. SIGKILL doesn't exist + * on Windows, but we still need to pass it to emulated kill. + */ + private enum EmulatedSignal { + TERM(15), + KILL(9); + + public final TruffleString name; + public final int number; + + EmulatedSignal(int number) { + this.name = tsLiteral("SIG" + name()); + this.number = number; } } @@ -138,7 +154,25 @@ public void postInitialize(Python3Core core) { ModuleData moduleData = new ModuleData(); signalModule.setModuleState(moduleData); - core.getContext().registerAsyncAction(() -> { + for (int i = 0; i < Signals.PYTHON_SIGNAL_NAMES.length; i++) { + TruffleString name = Signals.PYTHON_SIGNAL_NAMES[i]; + if (name != null) { + moduleData.signals.put(Signals.SIGNAL_NAMES[i], i); + signalModule.setAttribute(name, i); + } + } + + var context = core.getContext(); + if (PosixSupportLibrary.getUncached().getBackend(context.getPosixSupport()).equalsUncached(T_JAVA, TS_ENCODING)) { + for (EmulatedSignal signal : EmulatedSignal.values()) { + if (signalModule.getAttribute(signal.name) == PNone.NO_VALUE) { + moduleData.signals.put(signal.name(), signal.number); + signalModule.setAttribute(signal.name, signal.number); + } + } + } + + context.registerAsyncAction(() -> { SignalTriggerAction poll = moduleData.signalQueue.poll(); if (PythonOptions.AUTOMATIC_ASYNC_ACTIONS) { try { @@ -153,13 +187,19 @@ public void postInitialize(Python3Core core) { return poll; }); - if (!ImageInfo.inImageBuildtimeCode() && core.getContext().getOption(PythonOptions.InstallSignalHandlers)) { + if (!context.getEnv().isPreInitialization() && context.getOption(PythonOptions.InstallSignalHandlers)) { Object defaultSigintHandler = signalModule.getAttribute(T_DEFAULT_INT_HANDLER); assert defaultSigintHandler != PNone.NO_VALUE; SignalNode.signal(null, new Signal("INT").getNumber(), defaultSigintHandler, moduleData); } } + @TruffleBoundary + public static int signalFromName(PythonContext context, String name) { + PythonModule mod = context.lookupBuiltinModule(T__SIGNAL); + return mod.getModuleState(ModuleData.class).signals.getOrDefault(name, -1); + } + public static void resetSignalHandlers(PythonModule mod) { ModuleData data = mod.getModuleState(ModuleData.class); if (data != null) { @@ -201,7 +241,7 @@ public int frameIndex() { abstract static class ValidSignalsNode extends PythonBuiltinNode { @Specialization static Object validSignals( - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { int signalCount = 0; for (int i = 0; i < Signals.SIGNAL_NAMES.length; i++) { if (Signals.SIGNAL_NAMES[i] != null) { @@ -216,7 +256,7 @@ static Object validSignals( } } - return factory.createTuple(validSignals); + return PFactory.createTuple(language, validSignals); } } @@ -293,8 +333,8 @@ protected ArgumentClinicProvider getArgumentClinic() { abstract static class DefaultIntHandlerNode extends PythonBuiltinNode { @Specialization static Object defaultIntHandler(@SuppressWarnings("unused") Object[] args, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.KeyboardInterrupt); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.KeyboardInterrupt); } } @@ -335,7 +375,7 @@ static Object signal(Node raisingNode, int signum, Object handler, ModuleData da data.signalSema.release(); }); } catch (IllegalArgumentException e) { - throw PRaiseNode.raiseUncached(raisingNode, PythonErrorType.ValueError, e); + throw PRaiseNode.raiseStatic(raisingNode, PythonErrorType.ValueError, e); } Object result = handlerToPython(oldHandler, signum, data); data.signalHandlers.put(signum, handler); @@ -352,7 +392,7 @@ private static Object signal(Node raisingNode, int signum, int id, ModuleData da oldHandler = Signals.setSignalHandler(signum, id); } } catch (IllegalArgumentException e) { - throw PRaiseNode.raiseUncached(raisingNode, PythonErrorType.TypeError, ErrorMessages.SIGNAL_MUST_BE_SIGIGN_SIGDFL_OR_CALLABLE_OBJ); + throw PRaiseNode.raiseStatic(raisingNode, PythonErrorType.TypeError, ErrorMessages.SIGNAL_MUST_BE_SIGIGN_SIGDFL_OR_CALLABLE_OBJ); } Object result = handlerToPython(oldHandler, signum, data); data.signalHandlers.remove(signum); @@ -424,14 +464,14 @@ Object doIt(VirtualFrame frame, PythonModule self, int which, Object seconds, Ob @Bind("this") Node inliningTarget, @Cached PyTimeFromObjectNode timeFromObjectNode, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { ModuleData moduleData = self.getModuleState(ModuleData.class); long usDelay = toMicroseconds(frame, inliningTarget, seconds, timeFromObjectNode); long usInterval = toMicroseconds(frame, inliningTarget, interval, timeFromObjectNode); if (which != ITIMER_REAL) { throw constructAndRaiseNode.get(inliningTarget).raiseOSError(frame, OSErrorEnum.EINVAL); } - PTuple resultTuple = GetitimerNode.createResultTuple(factory, moduleData); + PTuple resultTuple = GetitimerNode.createResultTuple(language, moduleData); setitimer(moduleData, usDelay, usInterval); return resultTuple; } @@ -492,18 +532,18 @@ protected ArgumentClinicProvider getArgumentClinic() { static Object doIt(VirtualFrame frame, PythonModule self, int which, @Bind("this") Node inliningTarget, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { ModuleData moduleData = self.getModuleState(ModuleData.class); if (which != ITIMER_REAL) { throw constructAndRaiseNode.get(inliningTarget).raiseOSError(frame, OSErrorEnum.EINVAL); } - return createResultTuple(factory, moduleData); + return createResultTuple(language, moduleData); } - static PTuple createResultTuple(PythonObjectFactory factory, ModuleData moduleData) { + static PTuple createResultTuple(PythonLanguage language, ModuleData moduleData) { long oldInterval = moduleData.itimerInterval; long oldDelay = getOldDelay(moduleData); - return factory.createTuple(new Object[]{oldDelay / (double) SEC_TO_US, oldInterval / (double) SEC_TO_US}); + return PFactory.createTuple(language, new Object[]{oldDelay / (double) SEC_TO_US, oldInterval / (double) SEC_TO_US}); } @TruffleBoundary @@ -520,6 +560,7 @@ static long getOldDelay(ModuleData moduleData) { } private static final class ModuleData { + final Map signals = new HashMap<>(); final ConcurrentHashMap signalHandlers = new ConcurrentHashMap<>(); final ConcurrentHashMap defaultSignalHandlers = new ConcurrentHashMap<>(); final ConcurrentLinkedDeque signalQueue = new ConcurrentLinkedDeque<>(); @@ -542,6 +583,7 @@ final class Signals { static final int SIG_IGN = 1; static final int SIGMAX = 64; static final String[] SIGNAL_NAMES = new String[SIGMAX + 1]; + static final TruffleString[] PYTHON_SIGNAL_NAMES = new TruffleString[SIGMAX + 1]; static { for (String signal : new String[]{"HUP", "INT", "BREAK", "QUIT", "ILL", "TRAP", "IOT", "ABRT", "EMT", "FPE", @@ -554,6 +596,7 @@ final class Signals { continue; } SIGNAL_NAMES[number] = signal; + PYTHON_SIGNAL_NAMES[number] = tsLiteral("SIG" + signal); } catch (IllegalArgumentException e) { // Ignore } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SocketModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SocketModuleBuiltins.java index f9e39499f6..736785ab08 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SocketModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SocketModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -67,6 +67,7 @@ import java.nio.ByteOrder; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; @@ -80,7 +81,6 @@ import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum; -import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.builtins.objects.socket.SocketNodes; @@ -99,7 +99,6 @@ import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; @@ -116,11 +115,11 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PosixSupportLibrary.UniversalSockAddr; import com.oracle.graal.python.runtime.PosixSupportLibrary.UniversalSockAddrLibrary; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.TimeUtils; -import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -153,7 +152,7 @@ static int findProtocolByName(Node raisingNode, String protocolName) { return constant.getValueIfDefined(); } } - throw PRaiseNode.raiseUncached(raisingNode, OSError, ErrorMessages.SERVICE_PROTO_NOT_FOUND); + throw PRaiseNode.raiseStatic(raisingNode, OSError, ErrorMessages.SERVICE_PROTO_NOT_FOUND); } @Override @@ -206,26 +205,6 @@ private void addConstant(PosixConstants.IntConstant constant) { } } - // socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) - @Builtin(name = "socket", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PSocket) - @GenerateNodeFactory - public abstract static class SocketNode extends PythonVarargsBuiltinNode { - // All the "real" work is done by __init__ - @Specialization - Object socket(Object cls) { - return factory().createSocket(cls); - } - - @Override - public Object varArgExecute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported { - if (self == PNone.NO_VALUE && arguments.length > 0) { - return socket(arguments[0]); - } - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw VarargsBuiltinDirectInvocationNotSupported.INSTANCE; - } - } - @Builtin(name = "getdefaulttimeout", minNumOfPositionalArgs = 1, declaresExplicitSelf = true) @GenerateNodeFactory public abstract static class GetDefaultTimeoutNode extends PythonUnaryBuiltinNode { @@ -253,8 +232,9 @@ static Object set(VirtualFrame frame, PythonModule module, Object value, @GenerateNodeFactory public abstract static class GetHostnameNode extends PythonBuiltinNode { @Specialization - TruffleString doGeneric(VirtualFrame frame, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + static TruffleString doGeneric(VirtualFrame frame, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Bind("this") Node inliningTarget, @Cached SysModuleBuiltins.AuditNode auditNode, @Cached GilNode gil, @@ -263,7 +243,7 @@ TruffleString doGeneric(VirtualFrame frame, try { gil.release(true); try { - return posixLib.getPathAsString(getPosixSupport(), posixLib.gethostname(getPosixSupport())); + return posixLib.getPathAsString(context.getPosixSupport(), posixLib.gethostname(context.getPosixSupport())); } finally { gil.acquire(); } @@ -277,8 +257,9 @@ TruffleString doGeneric(VirtualFrame frame, @GenerateNodeFactory public abstract static class GetHostByAddrNode extends PythonUnaryBuiltinNode { @Specialization - Object doGeneric(VirtualFrame frame, Object ip, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + static Object doGeneric(VirtualFrame frame, Object ip, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @CachedLibrary(limit = "1") AddrInfoCursorLibrary addrInfoCursorLib, @CachedLibrary(limit = "1") UniversalSockAddrLibrary sockAddrLibrary, @Bind("this") Node inliningTarget, @@ -288,8 +269,7 @@ Object doGeneric(VirtualFrame frame, Object ip, @Cached SocketNodes.MakeIpAddrNode makeIpAddrNode, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, @Cached SysModuleBuiltins.AuditNode auditNode, - @Cached GilNode gil, - @Cached PythonObjectFactory factory) { + @Cached GilNode gil) { /* * TODO this uses getnameinfo and getaddrinfo to emulate the legacy gethostbyaddr. We * might want to use the legacy API in the future @@ -298,8 +278,8 @@ Object doGeneric(VirtualFrame frame, Object ip, UniversalSockAddr addr = setIpAddrNode.execute(frame, idnaConverter.execute(frame, ip), AF_UNSPEC.value); int family = sockAddrLibrary.getFamily(addr); try { - Object[] getnameinfoResult = posixLib.getnameinfo(getPosixSupport(), addr, NI_NAMEREQD.value); - TruffleString hostname = posixLib.getPathAsString(getPosixSupport(), getnameinfoResult[0]); + Object[] getnameinfoResult = posixLib.getnameinfo(context.getPosixSupport(), addr, NI_NAMEREQD.value); + TruffleString hostname = posixLib.getPathAsString(context.getPosixSupport(), getnameinfoResult[0]); SequenceStorage storage = new ObjectSequenceStorage(5); @@ -307,7 +287,7 @@ Object doGeneric(VirtualFrame frame, Object ip, AddrInfoCursor cursor; gil.release(true); try { - cursor = posixLib.getaddrinfo(getPosixSupport(), getnameinfoResult[0], posixLib.createPathFromString(getPosixSupport(), T_ZERO), + cursor = posixLib.getaddrinfo(context.getPosixSupport(), getnameinfoResult[0], posixLib.createPathFromString(context.getPosixSupport(), T_ZERO), family, 0, 0, 0); } finally { gil.acquire(); @@ -323,7 +303,8 @@ Object doGeneric(VirtualFrame frame, Object ip, } catch (GetAddrInfoException e1) { // Ignore failing forward lookup and return at least the hostname } - return factory.createTuple(new Object[]{hostname, factory.createList(), factory.createList(storage)}); + PythonLanguage language = context.getLanguage(inliningTarget); + return PFactory.createTuple(language, new Object[]{hostname, PFactory.createList(language), PFactory.createList(language, storage)}); } catch (GetAddrInfoException e) { // TODO convert error code from gaierror to herror throw constructAndRaiseNode.get(inliningTarget).executeWithArgsOnly(frame, SocketHError, new Object[]{1, e.getMessageAsTruffleString()}); @@ -340,21 +321,21 @@ protected static IdnaFromStringOrBytesConverterNode createIdnaConverter() { @GenerateNodeFactory public abstract static class GetHostByNameNode extends PythonUnaryBuiltinNode { @Specialization - TruffleString getHostByName(VirtualFrame frame, Object nameObj, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + static TruffleString getHostByName(VirtualFrame frame, Object nameObj, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @CachedLibrary(limit = "1") UniversalSockAddrLibrary addrLib, @Bind("this") Node inliningTarget, @Cached("createIdnaConverter()") IdnaFromStringOrBytesConverterNode idnaConverter, @Cached SysModuleBuiltins.AuditNode auditNode, @Cached SocketNodes.SetIpAddrNode setIpAddrNode, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { byte[] name = idnaConverter.execute(frame, nameObj); - auditNode.audit(inliningTarget, "socket.gethostbyname", factory.createTuple(new Object[]{nameObj})); + auditNode.audit(inliningTarget, "socket.gethostbyname", PFactory.createTuple(context.getLanguage(inliningTarget), new Object[]{nameObj})); UniversalSockAddr addr = setIpAddrNode.execute(frame, name, AF_INET.value); Inet4SockAddr inet4SockAddr = addrLib.asInet4SockAddr(addr); try { - return posixLib.getPathAsString(getPosixSupport(), posixLib.inet_ntop(getPosixSupport(), AF_INET.value, inet4SockAddr.getAddressAsBytes())); + return posixLib.getPathAsString(context.getPosixSupport(), posixLib.inet_ntop(context.getPosixSupport(), AF_INET.value, inet4SockAddr.getAddressAsBytes())); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -370,35 +351,36 @@ protected static IdnaFromStringOrBytesConverterNode createIdnaConverter() { @GenerateNodeFactory public abstract static class GetHostByNameExNode extends PythonUnaryBuiltinNode { @Specialization - Object get(VirtualFrame frame, Object nameObj, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + static Object get(VirtualFrame frame, Object nameObj, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @CachedLibrary(limit = "1") UniversalSockAddrLibrary addrLib, @CachedLibrary(limit = "1") AddrInfoCursorLibrary addrInfoCursorLib, @Bind("this") Node inliningTarget, @Cached("createIdnaConverter()") IdnaFromStringOrBytesConverterNode idnaConverter, @Cached SysModuleBuiltins.AuditNode auditNode, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { byte[] name = idnaConverter.execute(frame, nameObj); // The event name is really without the _ex, it's not a copy-paste error - auditNode.audit(inliningTarget, "socket.gethostbyname", factory.createTuple(new Object[]{nameObj})); + auditNode.audit(inliningTarget, "socket.gethostbyname", PFactory.createTuple(context.getLanguage(inliningTarget), new Object[]{nameObj})); /* * TODO this uses getaddrinfo to emulate the legacy gethostbyname. It doesn't support * aliases and multiple addresses. We might want to use the legacy gethostbyname_r API * in the future */ try { - AddrInfoCursor cursor = posixLib.getaddrinfo(getPosixSupport(), posixLib.createPathFromBytes(getPosixSupport(), name), + PosixSupport posixSupport = context.getPosixSupport(); + AddrInfoCursor cursor = posixLib.getaddrinfo(posixSupport, posixLib.createPathFromBytes(posixSupport, name), null, AF_INET.value, 0, 0, AI_CANONNAME.value); try { - TruffleString canonName = posixLib.getPathAsString(getPosixSupport(), addrInfoCursorLib.getCanonName(cursor)); + TruffleString canonName = posixLib.getPathAsString(posixSupport, addrInfoCursorLib.getCanonName(cursor)); Inet4SockAddr inet4SockAddr = addrLib.asInet4SockAddr(addrInfoCursorLib.getSockAddr(cursor)); - TruffleString addr = posixLib.getPathAsString(getPosixSupport(), posixLib.inet_ntop(getPosixSupport(), AF_INET.value, inet4SockAddr.getAddressAsBytes())); + TruffleString addr = posixLib.getPathAsString(posixSupport, posixLib.inet_ntop(posixSupport, AF_INET.value, inet4SockAddr.getAddressAsBytes())); // getaddrinfo doesn't support aliases - PList aliases = factory.createList(); + PList aliases = PFactory.createList(context.getLanguage(inliningTarget)); // we support just one address for now - PList addrs = factory.createList(new Object[]{addr}); - return factory.createTuple(new Object[]{canonName, aliases, addrs}); + PList addrs = PFactory.createList(context.getLanguage(inliningTarget), new Object[]{addr}); + return PFactory.createTuple(context.getLanguage(inliningTarget), new Object[]{canonName, aliases, addrs}); } finally { addrInfoCursorLib.release(cursor); } @@ -424,13 +406,14 @@ public abstract static class GetServByNameNode extends PythonBinaryClinicBuiltin static Object getServByName(TruffleString serviceName, Object protocolNameObj, @Bind("this") Node inliningTarget, @Cached InlinedConditionProfile noneProtocol, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @CachedLibrary(limit = "1") AddrInfoCursorLibrary addrInfoCursorLib, @CachedLibrary(limit = "1") UniversalSockAddrLibrary sockAddrLibrary, @Cached TruffleString.ToJavaStringNode toJavaStringNode, @Cached SysModuleBuiltins.AuditNode auditNode, @Cached GilNode gil, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { TruffleString protocolName; if (noneProtocol.profile(inliningTarget, PGuards.isNoValue(protocolNameObj))) { protocolName = null; @@ -454,7 +437,7 @@ static Object getServByName(TruffleString serviceName, Object protocolNameObj, gil.release(true); AddrInfoCursor cursor; try { - PosixSupport posixSupport = PosixSupport.get(inliningTarget); + PosixSupport posixSupport = context.getPosixSupport(); cursor = posixLib.getaddrinfo(posixSupport, null, posixLib.createPathFromString(posixSupport, serviceName), AF_INET.value, 0, protocol, 0); } finally { gil.acquire(); @@ -466,7 +449,7 @@ static Object getServByName(TruffleString serviceName, Object protocolNameObj, addrInfoCursorLib.release(cursor); } } catch (GetAddrInfoException e) { - throw raiseNode.get(inliningTarget).raise(OSError, ErrorMessages.SERVICE_PROTO_NOT_FOUND); + throw raiseNode.raise(inliningTarget, OSError, ErrorMessages.SERVICE_PROTO_NOT_FOUND); } } @@ -492,7 +475,7 @@ Object getServByPort(int port, Object protocolNameObj, @Cached TruffleString.EqualNode equalNode, @Cached SysModuleBuiltins.AuditNode auditNode, @Cached GilNode gil, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { TruffleString protocolName; if (nonProtocol.profile(inliningTarget, PGuards.isNoValue(protocolNameObj))) { protocolName = null; @@ -506,7 +489,7 @@ Object getServByPort(int port, Object protocolNameObj, * the legacy API in the future */ if (port < 0 || port > 0xffff) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.S_PORT_RANGE, "getservbyport"); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.S_PORT_RANGE, "getservbyport"); } auditNode.audit(inliningTarget, "socket.getservbyport", port, protocolName != null ? protocolName : ""); @@ -526,14 +509,14 @@ Object getServByPort(int port, Object protocolNameObj, gil.acquire(); } } catch (GetAddrInfoException e) { - throw raiseNode.get(inliningTarget).raise(OSError, ErrorMessages.SERVICE_PROTO_NOT_FOUND); + throw raiseNode.raise(inliningTarget, OSError, ErrorMessages.SERVICE_PROTO_NOT_FOUND); } } @TruffleBoundary private void checkName(TruffleString name) { if (name.toJavaStringUncached().matches("^\\d+$")) { - throw PRaiseNode.raiseUncached(this, OSError, ErrorMessages.SERVICE_PROTO_NOT_FOUND); + throw PRaiseNode.raiseStatic(this, OSError, ErrorMessages.SERVICE_PROTO_NOT_FOUND); } } @@ -550,7 +533,8 @@ public abstract static class GetNameInfoNode extends PythonBinaryClinicBuiltinNo @Specialization static Object getNameInfo(VirtualFrame frame, PTuple sockaddr, int flags, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @CachedLibrary(limit = "1") AddrInfoCursorLibrary addrInfoCursorLib, @CachedLibrary(limit = "1") UniversalSockAddrLibrary sockAddrLibrary, @Cached GilNode gil, @@ -560,12 +544,11 @@ static Object getNameInfo(VirtualFrame frame, PTuple sockaddr, int flags, @Cached SysModuleBuiltins.AuditNode auditNode, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, @Cached TruffleString.FromLongNode fromLongNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { SequenceStorage addr = sockaddr.getSequenceStorage(); int addrLen = addr.length(); if (addrLen < 2 || addrLen > 4) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.ILLEGAL_SOCKET_ADDR_ARG, "getnameinfo()"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ILLEGAL_SOCKET_ADDR_ARG, "getnameinfo()"); } TruffleString address; int port, flowinfo = 0, scopeid = 0; @@ -573,13 +556,13 @@ static Object getNameInfo(VirtualFrame frame, PTuple sockaddr, int flags, try { address = castAddress.execute(inliningTarget, arg0); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MUST_BE_STR_NOT_P, arg0); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MUST_BE_STR_NOT_P, arg0); } port = asIntNode.execute(frame, inliningTarget, getItem.execute(inliningTarget, addr, 1)); if (addrLen > 2) { flowinfo = asIntNode.execute(frame, inliningTarget, getItem.execute(inliningTarget, addr, 2)); if (flowinfo < 0 || flowinfo > 0xfffff) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.S_FLOWINFO_RANGE, "getnameinfo"); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.S_FLOWINFO_RANGE, "getnameinfo"); } } if (addrLen > 3) { @@ -593,7 +576,7 @@ static Object getNameInfo(VirtualFrame frame, PTuple sockaddr, int flags, int family; // TODO getaddrinfo lock? gil.release(true); - PosixSupport posixSupport = PosixSupport.get(inliningTarget); + PosixSupport posixSupport = context.getPosixSupport(); try { AddrInfoCursor cursor = posixLib.getaddrinfo(posixSupport, posixLib.createPathFromString(posixSupport, address), posixLib.createPathFromString(posixSupport, fromLongNode.execute(port, TS_ENCODING, false)), @@ -602,7 +585,7 @@ static Object getNameInfo(VirtualFrame frame, PTuple sockaddr, int flags, family = addrInfoCursorLib.getFamily(cursor); resolvedAddr = addrInfoCursorLib.getSockAddr(cursor); if (addrInfoCursorLib.next(cursor)) { - throw raiseNode.get(inliningTarget).raise(OSError, ErrorMessages.SOCKADDR_RESOLVED_TO_MULTIPLE_ADDRESSES); + throw raiseNode.raise(inliningTarget, OSError, ErrorMessages.SOCKADDR_RESOLVED_TO_MULTIPLE_ADDRESSES); } } finally { addrInfoCursorLib.release(cursor); @@ -614,19 +597,19 @@ static Object getNameInfo(VirtualFrame frame, PTuple sockaddr, int flags, UniversalSockAddr queryAddr; if (family == AF_INET.value) { if (addrLen != 2) { - throw raiseNode.get(inliningTarget).raise(OSError, ErrorMessages.IPV4_MUST_BE_2_TUPLE); + throw raiseNode.raise(inliningTarget, OSError, ErrorMessages.IPV4_MUST_BE_2_TUPLE); } queryAddr = posixLib.createUniversalSockAddrInet4(posixSupport, new Inet4SockAddr(port, sockAddrLibrary.asInet4SockAddr(resolvedAddr).getAddress())); } else if (family == AF_INET6.value) { queryAddr = posixLib.createUniversalSockAddrInet6(posixSupport, new Inet6SockAddr(port, sockAddrLibrary.asInet6SockAddr(resolvedAddr).getAddress(), flowinfo, scopeid)); } else { - throw raiseNode.get(inliningTarget).raise(OSError, ErrorMessages.UNKNOWN_FAMILY); + throw raiseNode.raise(inliningTarget, OSError, ErrorMessages.UNKNOWN_FAMILY); } Object[] getnameinfo = posixLib.getnameinfo(posixSupport, queryAddr, flags); TruffleString host = posixLib.getPathAsString(posixSupport, getnameinfo[0]); TruffleString service = posixLib.getPathAsString(posixSupport, getnameinfo[1]); - return factory.createTuple(new Object[]{host, service}); + return PFactory.createTuple(context.getLanguage(inliningTarget), new Object[]{host, service}); } catch (GetAddrInfoException e) { throw constructAndRaiseNode.get(inliningTarget).executeWithArgsOnly(frame, SocketGAIError, new Object[]{e.getErrorCode(), e.getMessageAsTruffleString()}); } @@ -635,8 +618,8 @@ static Object getNameInfo(VirtualFrame frame, PTuple sockaddr, int flags, @Fallback @SuppressWarnings("unused") static Object error(Object sockaddr, Object flags, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.GETNAMEINFO_ARG1_MUST_BE_TUPLE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.GETNAMEINFO_ARG1_MUST_BE_TUPLE); } @Override @@ -655,7 +638,8 @@ public abstract static class GetAddrInfoNode extends PythonClinicBuiltinNode { @Specialization static Object getAddrInfo(VirtualFrame frame, Object hostObject, Object portObject, int family, int type, int proto, int flags, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @CachedLibrary(limit = "1") AddrInfoCursorLibrary cursorLib, @Cached InlinedExactClassProfile profile, @Cached("createIdna()") IdnaFromStringOrBytesConverterNode idna, @@ -668,10 +652,9 @@ static Object getAddrInfo(VirtualFrame frame, Object hostObject, Object portObje @Cached SequenceStorageNodes.AppendNode appendNode, @Cached TruffleString.FromLongNode fromLongNode, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object host = null; - PosixSupport posixSupport = PosixSupport.get(inliningTarget); + PosixSupport posixSupport = context.getPosixSupport(); if (hostObject != PNone.NONE) { host = posixLib.createPathFromBytes(posixSupport, idna.execute(frame, hostObject)); } @@ -687,7 +670,7 @@ static Object getAddrInfo(VirtualFrame frame, Object hostObject, Object portObje } else if (portObject == PNone.NONE) { port = null; } else { - throw raiseNode.get(inliningTarget).raise(OSError, ErrorMessages.INT_OR_STRING_EXPECTED); + throw raiseNode.raise(inliningTarget, OSError, ErrorMessages.INT_OR_STRING_EXPECTED); } auditNode.audit(inliningTarget, "socket.getaddrinfo", hostObject, portObjectProfiled, family, type, proto, flags); @@ -712,10 +695,11 @@ static Object getAddrInfo(VirtualFrame frame, Object hostObject, Object portObje if (cursorLib.getCanonName(cursor) != null) { canonName = posixLib.getPathAsString(posixSupport, cursorLib.getCanonName(cursor)); } - PTuple tuple = factory.createTuple(new Object[]{cursorLib.getFamily(cursor), cursorLib.getSockType(cursor), cursorLib.getProtocol(cursor), canonName, addr}); + PTuple tuple = PFactory.createTuple(context.getLanguage(inliningTarget), + new Object[]{cursorLib.getFamily(cursor), cursorLib.getSockType(cursor), cursorLib.getProtocol(cursor), canonName, addr}); storage = appendNode.execute(inliningTarget, storage, tuple, SequenceStorageNodes.ListGeneralizationNode.SUPPLIER); } while (cursorLib.next(cursor)); - return factory.createList(storage); + return PFactory.createList(context.getLanguage(inliningTarget), storage); } finally { cursorLib.release(cursor); } @@ -736,8 +720,9 @@ protected ArgumentClinicProvider getArgumentClinic() { @GenerateNodeFactory abstract static class CloseNode extends PythonUnaryBuiltinNode { @Specialization - Object close(VirtualFrame frame, Object fdObj, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + static Object close(VirtualFrame frame, Object fdObj, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Bind("this") Node inliningTarget, @Cached GilNode gil, @Cached PyLongAsIntNode asIntNode, @@ -746,7 +731,7 @@ Object close(VirtualFrame frame, Object fdObj, try { gil.release(true); try { - posixLib.close(getPosixSupport(), fd); + posixLib.close(context.getPosixSupport(), fd); } finally { gil.acquire(); } @@ -764,8 +749,9 @@ Object close(VirtualFrame frame, Object fdObj, @GenerateNodeFactory abstract static class DupNode extends PythonUnaryBuiltinNode { @Specialization - Object close(VirtualFrame frame, Object fdObj, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + static Object close(VirtualFrame frame, Object fdObj, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Bind("this") Node inliningTarget, @Cached GilNode gil, @Cached PyLongAsIntNode asIntNode, @@ -774,12 +760,12 @@ Object close(VirtualFrame frame, Object fdObj, try { gil.release(true); try { - int dup = posixLib.dup(getPosixSupport(), fd); + int dup = posixLib.dup(context.getPosixSupport(), fd); try { - posixLib.setInheritable(getPosixSupport(), dup, false); + posixLib.setInheritable(context.getPosixSupport(), dup, false); } catch (PosixException e1) { try { - posixLib.close(getPosixSupport(), dup); + posixLib.close(context.getPosixSupport(), dup); } catch (PosixException e2) { // ignore } @@ -801,17 +787,17 @@ abstract static class InetAtoNNode extends PythonUnaryClinicBuiltinNode { @Specialization static PBytes doConvert(TruffleString addr, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Cached PRaiseNode raiseNode) { try { - PosixSupport posixSupport = PosixSupport.get(inliningTarget); + PosixSupport posixSupport = context.getPosixSupport(); int converted = posixLib.inet_aton(posixSupport, posixLib.createPathFromString(posixSupport, addr)); byte[] bytes = new byte[4]; ByteArraySupport.bigEndian().putInt(bytes, 0, converted); - return factory.createBytes(bytes); + return PFactory.createBytes(context.getLanguage(inliningTarget), bytes); } catch (PosixSupportLibrary.InvalidAddressException e) { - throw raiseNode.get(inliningTarget).raise(OSError, ErrorMessages.ILLEGAL_IP_ADDR_STRING_TO_INET_ATON); + throw raiseNode.raise(inliningTarget, OSError, ErrorMessages.ILLEGAL_IP_ADDR_STRING_TO_INET_ATON); } } @@ -830,16 +816,17 @@ static TruffleString doGeneric(VirtualFrame frame, Object addr, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("addr") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Cached PRaiseNode raiseNode) { Object buffer = bufferAcquireLib.acquireReadonly(addr, frame, indirectCallData); try { byte[] bytes = bufferLib.getInternalOrCopiedByteArray(buffer); int len = bufferLib.getBufferLength(buffer); if (len != 4) { - throw raiseNode.get(inliningTarget).raise(OSError, ErrorMessages.PACKED_IP_WRONG_LENGTH, "inet_ntoa"); + throw raiseNode.raise(inliningTarget, OSError, ErrorMessages.PACKED_IP_WRONG_LENGTH, "inet_ntoa"); } - PosixSupport posixSupport = PosixSupport.get(inliningTarget); + PosixSupport posixSupport = context.getPosixSupport(); Object result = posixLib.inet_ntoa(posixSupport, ByteArraySupport.bigEndian().getInt(bytes, 0)); return posixLib.getPathAsString(posixSupport, result); } finally { @@ -856,18 +843,18 @@ abstract static class InetPtoNNode extends PythonBinaryClinicBuiltinNode { @Specialization static PBytes doConvert(VirtualFrame frame, int family, TruffleString addr, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { - PosixSupport posixSupport = PosixSupport.get(inliningTarget); + PosixSupport posixSupport = context.getPosixSupport(); byte[] bytes = posixLib.inet_pton(posixSupport, family, posixLib.createPathFromString(posixSupport, addr)); - return factory.createBytes(bytes); + return PFactory.createBytes(context.getLanguage(inliningTarget), bytes); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } catch (PosixSupportLibrary.InvalidAddressException e) { - throw raiseNode.get(inliningTarget).raise(OSError, ErrorMessages.ILLEGAL_IP_ADDR_STRING_TO_INET_PTON); + throw raiseNode.raise(inliningTarget, OSError, ErrorMessages.ILLEGAL_IP_ADDR_STRING_TO_INET_PTON); } } @@ -887,26 +874,27 @@ static TruffleString doGeneric(VirtualFrame frame, int family, Object obj, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("obj") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object buffer = bufferAcquireLib.acquireReadonly(obj, frame, indirectCallData); try { byte[] bytes = bufferLib.getInternalOrCopiedByteArray(buffer); int len = bufferLib.getBufferLength(buffer); if (family == AF_INET.value) { if (len != 4) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.ILLEGAL_LENGTH_OF_PACKED_IP_ADDRS); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.ILLEGAL_LENGTH_OF_PACKED_IP_ADDRS); } } else if (family == AF_INET6.value) { if (len != 16) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.ILLEGAL_LENGTH_OF_PACKED_IP_ADDRS); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.ILLEGAL_LENGTH_OF_PACKED_IP_ADDRS); } } else { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.UNKNOWN_ADDR_FAMILY, family); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.UNKNOWN_ADDR_FAMILY, family); } try { - PosixSupport posixSupport = PosixSupport.get(inliningTarget); + PosixSupport posixSupport = context.getPosixSupport(); Object result = posixLib.inet_ntop(posixSupport, family, bytes); return posixLib.getPathAsString(posixSupport, result); } catch (PosixException e) { @@ -932,10 +920,10 @@ static int convert(VirtualFrame frame, Object xObj, @Bind("this") Node inliningTarget, @Cached PyLongAsIntNode asIntNode, @Cached WarningsModuleBuiltins.WarnNode warnNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int x = asIntNode.execute(frame, inliningTarget, xObj); if (x < 0) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.NTOHS_CANT_CONVERT_NEG_PYTHON_INT); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.NTOHS_CANT_CONVERT_NEG_PYTHON_INT); } if (x > 0xFFFF) { warnNode.warnEx(frame, DeprecationWarning, ErrorMessages.NTOH_PYTHON_STRING_TOO_LARGE_TO_CONVERT, 1); @@ -956,13 +944,13 @@ abstract static class NToHLNode extends PythonUnaryBuiltinNode { static long convert(VirtualFrame frame, Object xObj, @Bind("this") Node inliningTarget, @Cached PyLongAsLongNode asLongNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { long x = asLongNode.execute(frame, inliningTarget, xObj); if (x < 0) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.CANNOT_CONVERT_NEGATIVE_VALUE_TO_UNSIGNED_INT); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.CANNOT_CONVERT_NEGATIVE_VALUE_TO_UNSIGNED_INT); } if (x > 0xFFFFFFFFL) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.INT_LATGER_THAN_32_BITS); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.INT_LATGER_THAN_32_BITS); } int i = (int) x; if (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/StatResultBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/StatResultBuiltins.java new file mode 100644 index 0000000000..d4cc52277b --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/StatResultBuiltins.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.builtins.modules; + +import java.util.List; + +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; +import com.oracle.graal.python.builtins.CoreFunctions; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.tuple.InstantiableStructSequenceBuiltins; +import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; +import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; + +@CoreFunctions(extendClasses = PythonBuiltinClassType.PStatResult) +public class StatResultBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = StatResultBuiltinsSlotsGen.SLOTS; + + @Override + protected List> getNodeFactories() { + return StatResultBuiltinsFactory.getFactories(); + } + + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "stat_result", minNumOfPositionalArgs = 1, parameterNames = {"$cls", "sequence", "dict"}) + @GenerateNodeFactory + public abstract static class StatResultNode extends PythonTernaryBuiltinNode { + + @Specialization + public static PTuple generic(VirtualFrame frame, Object cls, Object sequence, Object dict, + @Cached InstantiableStructSequenceBuiltins.NewNode newNode) { + PTuple p = (PTuple) newNode.execute(frame, cls, sequence, dict); + Object[] data = CompilerDirectives.castExact(p.getSequenceStorage(), ObjectSequenceStorage.class).getInternalObjectArray(); + for (int i = 7; i <= 9; i++) { + if (data[i + 3] == PNone.NONE) { + data[i + 3] = data[i]; + } + } + return p; + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/StringModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/StringModuleBuiltins.java index 9218bd4061..92086f7152 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/StringModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/StringModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -59,7 +59,7 @@ import com.oracle.graal.python.runtime.ExecutionContext; import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; @@ -85,28 +85,27 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization PSequenceIterator formatterParser(VirtualFrame frame, TruffleString self, - @Cached("createFor(this)") IndirectCallData indirectCallData, - @Cached PythonObjectFactory factory) { + @Cached("createFor(this)") IndirectCallData indirectCallData) { TemplateFormatter formatter = new TemplateFormatter(self); List parserList; - PythonLanguage language = PythonLanguage.get(this); PythonContext context = PythonContext.get(this); + PythonLanguage language = context.getLanguage(this); Object state = ExecutionContext.IndirectCallContext.enter(frame, language, context, indirectCallData); try { parserList = formatter.formatterParser(this); } finally { ExecutionContext.IndirectCallContext.exit(frame, language, context, state); } - return parserListToIterator(parserList, factory); + return parserListToIterator(parserList, language); } } - private static PSequenceIterator parserListToIterator(List parserList, PythonObjectFactory factory) { + private static PSequenceIterator parserListToIterator(List parserList, PythonLanguage language) { Object[] tuples = new Object[parserList.size()]; for (int i = 0; i < tuples.length; i++) { - tuples[i] = factory.createTuple(parserList.get(i)); + tuples[i] = PFactory.createTuple(language, parserList.get(i)); } - return factory.createSequenceIterator(factory.createList(tuples)); + return PFactory.createSequenceIterator(language, PFactory.createList(language, tuples)); } @Builtin(name = J_FORMATTER_FIELD_NAME_SPLIT, minNumOfPositionalArgs = 1, parameterNames = {"self"}) @@ -120,19 +119,18 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization Object formatterParser(VirtualFrame frame, TruffleString self, - @Cached("createFor(this)") IndirectCallData indirectCallData, - @Cached PythonObjectFactory factory) { + @Cached("createFor(this)") IndirectCallData indirectCallData) { TemplateFormatter formatter = new TemplateFormatter(self); TemplateFormatter.FieldNameSplitResult result; - PythonLanguage language = PythonLanguage.get(this); PythonContext context = PythonContext.get(this); + PythonLanguage language = context.getLanguage(this); Object state = ExecutionContext.IndirectCallContext.enter(frame, language, context, indirectCallData); try { result = formatter.formatterFieldNameSplit(this); } finally { ExecutionContext.IndirectCallContext.exit(frame, language, context, state); } - return factory.createTuple(new Object[]{result.first, parserListToIterator(result.parserList, factory)}); + return PFactory.createTuple(language, new Object[]{result.first, parserListToIterator(result.parserList, language)}); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/StructModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/StructModuleBuiltins.java index 55787472b2..49223653ac 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/StructModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/StructModuleBuiltins.java @@ -1,89 +1,31 @@ -/* Copyright (c) 2020, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2020, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2020 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 */ package com.oracle.graal.python.builtins.modules; -import static com.oracle.graal.python.nodes.ErrorMessages.ARG_MUST_BE_STR_OR_BYTES; -import static com.oracle.graal.python.nodes.ErrorMessages.BAD_CHR_IN_STRUCT_FMT; -import static com.oracle.graal.python.nodes.ErrorMessages.REPEAT_COUNT_WITHOUT_FMT; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_BOOL; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_CHAR; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_DOUBLE; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_FLOAT; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_HALF_FLOAT; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_INT; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_LONG; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_LONG_LONG; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_PAD_BYTE; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_PASCAL_STRING; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_SHORT; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_SIGNED_CHAR; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_SIZE_T; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_STRING; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_UNSIGNED_CHAR; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_UNSIGNED_INT; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_UNSIGNED_LONG; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_UNSIGNED_LONG_LONG; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_UNSIGNED_SHORT; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_UNSIGNED_SIZE_T; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_VOID_PTR; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_BOOL; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_CHAR; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_DOUBLE; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_FLOAT; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_HALF_FLOAT; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_INT; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_LONG; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_LONG_LONG; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_PAD_BYTE; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_PASCAL_STRING; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_SHORT; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_SIGNED_CHAR; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_SIZE_T; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_STRING; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_UNSIGNED_CHAR; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_UNSIGNED_INT; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_UNSIGNED_LONG; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_UNSIGNED_LONG_LONG; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_UNSIGNED_SHORT; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_UNSIGNED_SIZE_T; -import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_VOID_PTR; import static com.oracle.graal.python.nodes.BuiltinNames.J__STRUCT; import static com.oracle.graal.python.nodes.BuiltinNames.T__STRUCT; -import static com.oracle.graal.python.nodes.ErrorMessages.EMBEDDED_NULL_CHARACTER; import static com.oracle.graal.python.runtime.exception.PythonErrorType.StructError; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; -import java.nio.ByteOrder; import java.util.Arrays; -import java.util.HashSet; import java.util.List; -import java.util.Set; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.PythonOS; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.module.PythonModule; -import com.oracle.graal.python.builtins.objects.str.PString; -import com.oracle.graal.python.builtins.objects.struct.FormatAlignment; -import com.oracle.graal.python.builtins.objects.struct.FormatCode; -import com.oracle.graal.python.builtins.objects.struct.FormatDef; import com.oracle.graal.python.builtins.objects.struct.PStruct; import com.oracle.graal.python.builtins.objects.struct.StructBuiltins; -import com.oracle.graal.python.util.LRUCache; -import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; @@ -92,13 +34,9 @@ import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.graal.python.util.LRUCache; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -140,294 +78,7 @@ public void postInitialize(Python3Core core) { structModule.setModuleState(cache); } - @ImportStatic(PythonUtils.class) - @Builtin(name = "Struct", minNumOfPositionalArgs = 2, constructsClass = PythonBuiltinClassType.PStruct) - @GenerateNodeFactory - public abstract static class ConstructStructNode extends PythonBinaryBuiltinNode { - public static final int NUM_BYTES_LIMIT; - - private static final int SHORT_ALIGN = Short.BYTES; - private static final int INT_ALIGN = Integer.BYTES; - private static final int LONG_ALIGN = Long.BYTES; - private static final int FLOAT_ALIGN = Float.BYTES; - private static final int DOUBLE_ALIGN = Double.BYTES; - - private static final char ALIGNMENT_NATIVE_NATIVE = '@'; - private static final char ALIGNMENT_NATIVE_STD = '='; - private static final char ALIGNMENT_LE_STD = '<'; - private static final char ALIGNMENT_BE_STD = '>'; - private static final char ALIGNMENT_NET_BE_STD = '!'; - private static final char DEFAULT_ALIGNMENT = ALIGNMENT_NATIVE_NATIVE; - // format def tables - private static final FormatDef[] FMT_TABLE = new FormatDef[128]; - private static final FormatDef[] FMT_TABLE_NATIVE = new FormatDef[128]; - static { - Set numBytes = new HashSet<>(); - - setFormatDefEntry(FMT_TABLE, FMT_PAD_BYTE, T_LBL_PAD_BYTE, 1, numBytes); - setFormatDefEntry(FMT_TABLE, FMT_SIGNED_CHAR, T_LBL_SIGNED_CHAR, 1, numBytes); - setFormatDefEntry(FMT_TABLE, FMT_UNSIGNED_CHAR, T_LBL_UNSIGNED_CHAR, 1, numBytes); - setFormatDefEntry(FMT_TABLE, FMT_CHAR, T_LBL_CHAR, 1, numBytes); - setFormatDefEntry(FMT_TABLE, FMT_STRING, T_LBL_STRING, 1, numBytes); - setFormatDefEntry(FMT_TABLE, FMT_PASCAL_STRING, T_LBL_PASCAL_STRING, 1, numBytes); - setFormatDefEntry(FMT_TABLE, FMT_SHORT, T_LBL_SHORT, 2, numBytes); - setFormatDefEntry(FMT_TABLE, FMT_UNSIGNED_SHORT, T_LBL_UNSIGNED_SHORT, 2, numBytes); - setFormatDefEntry(FMT_TABLE, FMT_INT, T_LBL_INT, 4, numBytes); - setFormatDefEntry(FMT_TABLE, FMT_UNSIGNED_INT, T_LBL_UNSIGNED_INT, 4, numBytes); - setFormatDefEntry(FMT_TABLE, FMT_LONG, T_LBL_LONG, 4, numBytes); - setFormatDefEntry(FMT_TABLE, FMT_UNSIGNED_LONG, T_LBL_UNSIGNED_LONG, 4, numBytes); - setFormatDefEntry(FMT_TABLE, FMT_LONG_LONG, T_LBL_LONG_LONG, 8, numBytes); - setFormatDefEntry(FMT_TABLE, FMT_UNSIGNED_LONG_LONG, T_LBL_UNSIGNED_LONG_LONG, 8, numBytes); - setFormatDefEntry(FMT_TABLE, FMT_BOOL, T_LBL_BOOL, 1, numBytes); - setFormatDefEntry(FMT_TABLE, FMT_HALF_FLOAT, T_LBL_HALF_FLOAT, 2, numBytes); - setFormatDefEntry(FMT_TABLE, FMT_FLOAT, T_LBL_FLOAT, 4, numBytes); - setFormatDefEntry(FMT_TABLE, FMT_DOUBLE, T_LBL_DOUBLE, 8, numBytes); - - // native format table - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_PAD_BYTE, T_LBL_PAD_BYTE, Byte.BYTES, numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_SIGNED_CHAR, T_LBL_SIGNED_CHAR, Byte.BYTES, numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_UNSIGNED_CHAR, T_LBL_UNSIGNED_CHAR, Byte.BYTES, numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_CHAR, T_LBL_CHAR, Byte.BYTES, numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_STRING, T_LBL_STRING, Byte.BYTES, numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_PASCAL_STRING, T_LBL_PASCAL_STRING, Byte.BYTES, numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_SHORT, T_LBL_SHORT, Short.BYTES, SHORT_ALIGN, numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_UNSIGNED_SHORT, T_LBL_UNSIGNED_SHORT, Short.BYTES, SHORT_ALIGN, numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_INT, T_LBL_INT, Integer.BYTES, INT_ALIGN, numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_UNSIGNED_INT, T_LBL_UNSIGNED_INT, Integer.BYTES, INT_ALIGN, numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_LONG, T_LBL_LONG, - PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32 ? Integer.BYTES : Long.BYTES, - PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32 ? INT_ALIGN : LONG_ALIGN, - numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_UNSIGNED_LONG, T_LBL_UNSIGNED_LONG, - PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32 ? Integer.BYTES : Long.BYTES, - PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32 ? INT_ALIGN : LONG_ALIGN, - numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_SIZE_T, T_LBL_SIZE_T, Long.BYTES, LONG_ALIGN, numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_UNSIGNED_SIZE_T, T_LBL_UNSIGNED_SIZE_T, Long.BYTES, LONG_ALIGN, numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_LONG_LONG, T_LBL_LONG_LONG, Long.BYTES, LONG_ALIGN, numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_UNSIGNED_LONG_LONG, T_LBL_UNSIGNED_LONG_LONG, Long.BYTES, LONG_ALIGN, numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_BOOL, T_LBL_BOOL, Byte.BYTES, 0, numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_HALF_FLOAT, T_LBL_HALF_FLOAT, Float.BYTES / 2, SHORT_ALIGN, numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_FLOAT, T_LBL_FLOAT, Float.BYTES, FLOAT_ALIGN, numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_DOUBLE, T_LBL_DOUBLE, Double.BYTES, DOUBLE_ALIGN, numBytes); - setFormatDefEntry(FMT_TABLE_NATIVE, FMT_VOID_PTR, T_LBL_VOID_PTR, Long.BYTES, LONG_ALIGN, numBytes); - - NUM_BYTES_LIMIT = numBytes.size(); - } - - static void setFormatDefEntry(FormatDef[] table, char format, TruffleString label, int size, Set numBytes) { - setFormatDefEntry(table, format, label, size, 0, numBytes); - } - - static void setFormatDefEntry(FormatDef[] table, char format, TruffleString label, int size, int alignment, Set numBytes) { - table[format] = new FormatDef(format, label, size, alignment); - numBytes.add(size); - } - - public final PStruct execute(Object format) { - return execute(PythonBuiltinClassType.PStruct, format); - } - - public abstract PStruct execute(Object cls, Object format); - - @Specialization(guards = "isAscii(format, getCodeRangeNode)") - static PStruct struct(@SuppressWarnings("unused") Object cls, TruffleString format, - @Bind("this") Node inliningTarget, - @Shared @Cached TruffleString.CopyToByteArrayNode copyToByteArrayNode, - @Shared @Cached TruffleString.SwitchEncodingNode switchEncodingNode, - @SuppressWarnings("unused") @Shared @Cached TruffleString.GetCodeRangeNode getCodeRangeNode, - @Shared @Cached PythonObjectFactory factory) { - byte[] fmt = PythonUtils.getAsciiBytes(format, copyToByteArrayNode, switchEncodingNode); - return factory.createStruct(createStructInternal(inliningTarget, fmt)); - } - - @Specialization - static PStruct struct(Object cls, PString format, - @Bind("this") Node inliningTarget, - @Cached CastToTruffleStringNode castToTruffleStringNode, - @Shared @Cached TruffleString.CopyToByteArrayNode copyToByteArrayNode, - @Shared @Cached TruffleString.SwitchEncodingNode switchEncodingNode, - @SuppressWarnings("unused") @Shared @Cached TruffleString.GetCodeRangeNode getCodeRangeNode, - @Shared @Cached PythonObjectFactory factory) { - return struct(cls, castToTruffleStringNode.execute(inliningTarget, format), inliningTarget, copyToByteArrayNode, switchEncodingNode, getCodeRangeNode, factory); - } - - @Specialization(limit = "1") - static PStruct struct(@SuppressWarnings("unused") Object cls, PBytes format, - @Bind("this") Node inliningTarget, - @CachedLibrary("format") PythonBufferAccessLibrary bufferLib, - @Shared @Cached PythonObjectFactory factory) { - byte[] fmt = bufferLib.getCopiedByteArray(format); - return factory.createStruct(createStructInternal(inliningTarget, fmt)); - } - - @Specialization(guards = {"!isPBytes(format)", "!isPString(format)", "!isAsciiTruffleString(format, getCodeRangeNode)"}) - static PStruct fallback(@SuppressWarnings("unused") Object cls, Object format, - @SuppressWarnings("unused") @Shared @Cached TruffleString.GetCodeRangeNode getCodeRangeNode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(StructError, ARG_MUST_BE_STR_OR_BYTES, "Struct()", format); - } - - protected static boolean isAsciiTruffleString(Object o, TruffleString.GetCodeRangeNode getCodeRangeNode) { - return o instanceof TruffleString && PythonUtils.isAscii((TruffleString) o, getCodeRangeNode); - } - - @TruffleBoundary - private static PStruct.StructInfo createStructInternal(Node raisingNode, byte[] format) { - int size = 0; - int len = 0; - int nCodes = 0; - int num; - - if (containsNullCharacter(format)) { - throw PRaiseNode.raiseUncached(raisingNode, PythonBuiltinClassType.StructError, EMBEDDED_NULL_CHARACTER); - } - - char alignment = DEFAULT_ALIGNMENT; - int start = 0; - - if (format.length > 0 && isAlignment((char) format[0])) { - alignment = (char) format[0]; - start = 1; - } - - final FormatAlignment formatAlignment = whichAlignment(alignment); - FormatDef[] formatTable = (formatAlignment.nativeSizing) ? FMT_TABLE_NATIVE : FMT_TABLE; - - // first pass: validation - for (int i = start; i < format.length; i++) { - char c = (char) format[i]; - if (c == ' ') { - continue; - } else if ('0' <= c && c <= '9') { - num = c - '0'; - while (++i < format.length && '0' <= (c = (char) format[i]) && c <= '9') { - if (num >= Integer.MAX_VALUE / 10 && (num > Integer.MAX_VALUE / 10 || (c - '0') > Integer.MAX_VALUE % 10)) { - throw PRaiseNode.raiseUncached(raisingNode, StructError, ErrorMessages.STRUCT_SIZE_TOO_LONG); - } - num = num * 10 + (c - '0'); - } - if (i == format.length) { - throw PRaiseNode.raiseUncached(raisingNode, StructError, REPEAT_COUNT_WITHOUT_FMT); - } - } else { - num = 1; - } - - FormatDef formatDef = getEntry(raisingNode, c, formatTable); - - switch (c) { - case 's': // fall through - case 'p': - len++; - nCodes++; - break; - case 'x': - break; - default: - len += num; - if (num != 0) { - nCodes++; - } - break; - } - - int itemSize = formatDef.size; - size = align(size, c, formatDef); - if (size == -1) { - throw PRaiseNode.raiseUncached(raisingNode, StructError, ErrorMessages.STRUCT_SIZE_TOO_LONG); - } - - if (num > (Integer.MAX_VALUE - size) / itemSize) { - throw PRaiseNode.raiseUncached(raisingNode, StructError, ErrorMessages.STRUCT_SIZE_TOO_LONG); - } - size += num * itemSize; - } - - // second pass - fill in the codes (no validation needed) - FormatCode[] codes = new FormatCode[nCodes]; - int structSize = size; - int structLen = len; - - int j = 0; - size = 0; - for (int i = start; i < format.length; i++) { - char c = (char) format[i]; - if (c == ' ') { - continue; - } else if ('0' <= c && c <= '9') { - num = c - '0'; - while (++i < format.length && '0' <= (c = (char) format[i]) && c <= '9') { - num = num * 10 + (c - '0'); - } - } else { - num = 1; - } - - FormatDef formatDef = getEntry(raisingNode, c, formatTable); - size = align(size, c, formatDef); - if (c == 's' || c == 'p') { - codes[j++] = new FormatCode(formatDef, size, num, 1); - size += num; - } else if (c == 'x') { - size += num; - } else if (num != 0) { - codes[j++] = new FormatCode(formatDef, size, formatDef.size, num); - size += formatDef.size * num; - } - } - - return new PStruct.StructInfo(format, structSize, structLen, formatAlignment, codes); - } - - private static FormatDef getEntry(Node raisingNode, char format, FormatDef[] table) { - FormatDef formatDef = table[format]; - if (formatDef != null) { - return formatDef; - } - throw PRaiseNode.raiseUncached(raisingNode, StructError, BAD_CHR_IN_STRUCT_FMT, format); - } - - private static boolean isAlignment(char alignment) { - return alignment == ALIGNMENT_LE_STD || - alignment == ALIGNMENT_BE_STD || - alignment == ALIGNMENT_NET_BE_STD || - alignment == ALIGNMENT_NATIVE_STD || - alignment == ALIGNMENT_NATIVE_NATIVE; - } - - private static FormatAlignment whichAlignment(char alignment) { - switch (alignment) { - case ALIGNMENT_LE_STD: - return new FormatAlignment(false, false); - case ALIGNMENT_BE_STD: - case ALIGNMENT_NET_BE_STD: - return new FormatAlignment(true, false); - case ALIGNMENT_NATIVE_STD: - return new FormatAlignment(ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN, false); - case ALIGNMENT_NATIVE_NATIVE: - default: - return new FormatAlignment(ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN, true); - } - } - - private static int align(int size, char c, FormatDef formatDef) { - int extra; - int alignedSize = size; - if (formatDef.format == c) { - if (formatDef.alignment > 0 && alignedSize > 0) { - extra = (formatDef.alignment - 1) - (alignedSize - 1) % (formatDef.alignment); - if (extra > Integer.MAX_VALUE - alignedSize) { - return -1; - } - alignedSize += extra; - } - } - return alignedSize; - } - } - - protected static PStruct getStruct(PythonModule structModule, Object format, ConstructStructNode constructStructNode) { + protected static PStruct getStruct(PythonModule structModule, Object format, StructBuiltins.ConstructStructNode constructStructNode) { LRUStructCache cache = structModule.getModuleState(LRUStructCache.class); PStruct pStruct = cache.get(format); if (pStruct == null) { @@ -441,9 +92,9 @@ protected static PStruct getStruct(PythonModule structModule, Object format, Con @GenerateCached(false) @ImportStatic({Arrays.class}) abstract static class GetStructNode extends PNodeWithContext { - abstract PStruct execute(Node inliningTarget, PythonModule module, Object format, ConstructStructNode constructStructNode); + abstract PStruct execute(Node inliningTarget, PythonModule module, Object format, StructBuiltins.ConstructStructNode constructStructNode); - protected PStruct getStructInternal(PythonModule module, Object format, ConstructStructNode constructStructNode) { + protected PStruct getStructInternal(PythonModule module, Object format, StructBuiltins.ConstructStructNode constructStructNode) { return getStruct(module, format, constructStructNode); } @@ -453,7 +104,7 @@ protected boolean eq(TruffleString s1, TruffleString s2, TruffleString.EqualNode @Specialization(guards = {"isSingleContext()", "eq(format, cachedFormat, eqNode)"}, limit = "1") @SuppressWarnings("unused") - static PStruct doCachedString(PythonModule module, TruffleString format, ConstructStructNode constructStructNode, + static PStruct doCachedString(PythonModule module, TruffleString format, StructBuiltins.ConstructStructNode constructStructNode, @Cached("format") TruffleString cachedFormat, @Cached(inline = false) TruffleString.EqualNode eqNode, @Cached(value = "getStructInternal(module, format, constructStructNode)", weak = true) PStruct cachedStruct) { @@ -462,7 +113,7 @@ static PStruct doCachedString(PythonModule module, TruffleString format, Constru @Specialization(guards = {"isSingleContext()", "equals(bufferLib.getCopiedByteArray(format), cachedFormat)"}, limit = "1") @SuppressWarnings("unused") - static PStruct doCachedBytes(PythonModule module, PBytes format, ConstructStructNode constructStructNode, + static PStruct doCachedBytes(PythonModule module, PBytes format, StructBuiltins.ConstructStructNode constructStructNode, @CachedLibrary("format") PythonBufferAccessLibrary bufferLib, @Cached(value = "bufferLib.getCopiedByteArray(format)", dimensions = 1) byte[] cachedFormat, @Cached(value = "getStructInternal(module, format, constructStructNode)", weak = true) PStruct cachedStruct) { @@ -470,7 +121,7 @@ static PStruct doCachedBytes(PythonModule module, PBytes format, ConstructStruct } @Specialization(replaces = {"doCachedString", "doCachedBytes"}) - static PStruct doGeneric(PythonModule module, Object format, ConstructStructNode constructStructNode) { + static PStruct doGeneric(PythonModule module, Object format, StructBuiltins.ConstructStructNode constructStructNode) { return getStruct(module, format, constructStructNode); } } @@ -481,7 +132,7 @@ abstract static class PackNode extends PythonBuiltinNode { @Specialization static Object pack(VirtualFrame frame, PythonModule self, Object format, Object[] args, @Bind("this") Node inliningTarget, - @Cached ConstructStructNode constructStructNode, + @Cached StructBuiltins.ConstructStructNode constructStructNode, @Cached GetStructNode getStructNode, @Cached StructBuiltins.StructPackNode structPackNode) { PStruct struct = getStructNode.execute(inliningTarget, self, format, constructStructNode); @@ -502,7 +153,7 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static Object packInto(VirtualFrame frame, PythonModule self, Object format, Object buffer, int offset, Object[] args, @Bind("this") Node inliningTarget, - @Cached ConstructStructNode constructStructNode, + @Cached StructBuiltins.ConstructStructNode constructStructNode, @Cached GetStructNode getStructNode, @Cached StructBuiltins.StructPackIntoNode structPackNode) { PStruct struct = getStructNode.execute(inliningTarget, self, format, constructStructNode); @@ -523,7 +174,7 @@ protected ArgumentClinicProvider getArgumentClinic() { static Object unpack(VirtualFrame frame, PythonModule self, Object format, Object buffer, @Bind("this") Node inliningTarget, @Cached GetStructNode getStructNode, - @Cached ConstructStructNode constructStructNode, + @Cached StructBuiltins.ConstructStructNode constructStructNode, @Cached StructBuiltins.StructUnpackNode structUnpackNode) { PStruct struct = getStructNode.execute(inliningTarget, self, format, constructStructNode); return structUnpackNode.execute(frame, struct, buffer); @@ -542,7 +193,7 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static Object iterUnpack(VirtualFrame frame, PythonModule self, Object format, Object buffer, @Bind("this") Node inliningTarget, - @Cached ConstructStructNode constructStructNode, + @Cached StructBuiltins.ConstructStructNode constructStructNode, @Cached GetStructNode getStructNode, @Cached StructBuiltins.StructIterUnpackNode iterUnpackNode) { PStruct struct = getStructNode.execute(inliningTarget, self, format, constructStructNode); @@ -563,7 +214,7 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static Object unpackFrom(VirtualFrame frame, PythonModule self, Object format, Object buffer, int offset, @Bind("this") Node inliningTarget, - @Cached ConstructStructNode constructStructNode, + @Cached StructBuiltins.ConstructStructNode constructStructNode, @Cached GetStructNode getStructNode, @Cached StructBuiltins.StructUnpackFromNode structUnpackNode) { PStruct struct = getStructNode.execute(inliningTarget, self, format, constructStructNode); @@ -577,7 +228,7 @@ abstract static class CalcSizeNode extends PythonBinaryBuiltinNode { @Specialization static Object calcSize(PythonModule self, Object format, @Bind("this") Node inliningTarget, - @Cached ConstructStructNode constructStructNode, + @Cached StructBuiltins.ConstructStructNode constructStructNode, @Cached GetStructNode getStructNode) { PStruct struct = getStructNode.execute(inliningTarget, self, format, constructStructNode); return struct.getSize(); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SysModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SysModuleBuiltins.java index aeccc72d52..2028255add 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SysModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SysModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,6 +41,8 @@ package com.oracle.graal.python.builtins.modules; import static com.oracle.graal.python.PythonLanguage.J_GRAALPYTHON_ID; +import static com.oracle.graal.python.PythonLanguage.RELEASE_LEVEL; +import static com.oracle.graal.python.PythonLanguage.RELEASE_SERIAL; import static com.oracle.graal.python.PythonLanguage.T_GRAALPYTHON_ID; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.AttributeError; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.DeprecationWarning; @@ -112,6 +114,7 @@ import static com.oracle.graal.python.nodes.SpecialMethodNames.T_GET; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SIZEOF__; import static com.oracle.graal.python.nodes.StringLiterals.T_BACKSLASHREPLACE; +import static com.oracle.graal.python.nodes.StringLiterals.T_BASE_PREFIX; import static com.oracle.graal.python.nodes.StringLiterals.T_BIG; import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA; import static com.oracle.graal.python.nodes.StringLiterals.T_DASH; @@ -120,6 +123,7 @@ import static com.oracle.graal.python.nodes.StringLiterals.T_JAVA; import static com.oracle.graal.python.nodes.StringLiterals.T_LITTLE; import static com.oracle.graal.python.nodes.StringLiterals.T_NEWLINE; +import static com.oracle.graal.python.nodes.StringLiterals.T_PREFIX; import static com.oracle.graal.python.nodes.StringLiterals.T_STRICT; import static com.oracle.graal.python.nodes.StringLiterals.T_STRING_SOURCE; import static com.oracle.graal.python.nodes.StringLiterals.T_SURROGATEESCAPE; @@ -127,7 +131,6 @@ import static com.oracle.graal.python.nodes.StringLiterals.T_VERSION; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; -import static com.oracle.graal.python.util.PythonUtils.tsArray; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.io.IOException; @@ -139,8 +142,6 @@ import java.util.List; import java.util.Set; -import org.graalvm.nativeimage.ImageInfo; - import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; @@ -152,7 +153,6 @@ import com.oracle.graal.python.builtins.PythonOS; import com.oracle.graal.python.builtins.modules.SysModuleBuiltinsClinicProviders.GetFrameNodeClinicProviderGen; import com.oracle.graal.python.builtins.modules.SysModuleBuiltinsClinicProviders.SetDlopenFlagsClinicProviderGen; -import com.oracle.graal.python.builtins.modules.SysModuleBuiltinsFactory.ExcInfoNodeFactory; import com.oracle.graal.python.builtins.modules.io.BufferedReaderBuiltins; import com.oracle.graal.python.builtins.modules.io.BufferedWriterBuiltins; import com.oracle.graal.python.builtins.modules.io.FileIOBuiltins; @@ -171,7 +171,6 @@ import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.exception.ExceptionNodes; import com.oracle.graal.python.builtins.objects.exception.GetEscapedExceptionNode; -import com.oracle.graal.python.builtins.objects.exception.PBaseException; import com.oracle.graal.python.builtins.objects.frame.PFrame; import com.oracle.graal.python.builtins.objects.frame.PFrame.Reference; import com.oracle.graal.python.builtins.objects.function.PArguments; @@ -231,11 +230,12 @@ import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.formatting.IntegerFormatter; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.CharsetMapping; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.CompilerDirectives.ValueType; import com.oracle.truffle.api.Truffle; import com.oracle.truffle.api.TruffleLanguage.Env; import com.oracle.truffle.api.dsl.Bind; @@ -253,6 +253,7 @@ import com.oracle.truffle.api.frame.MaterializedFrame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.BranchProfile; import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.strings.TruffleString; @@ -286,32 +287,21 @@ public final class SysModuleBuiltins extends PythonBuiltins { COMPILE_TIME = compile_time; } - private static final TruffleString[] SYS_PREFIX_ATTRIBUTES = tsArray("prefix", "exec_prefix"); - private static final TruffleString[] BASE_PREFIX_ATTRIBUTES = tsArray("base_prefix", "base_exec_prefix"); + private static final TruffleString[] SYS_PREFIX_ATTRIBUTES = new TruffleString[]{T_PREFIX, tsLiteral("exec_prefix")}; + private static final TruffleString[] BASE_PREFIX_ATTRIBUTES = new TruffleString[]{T_BASE_PREFIX, tsLiteral("base_exec_prefix")}; static final StructSequence.BuiltinTypeDescriptor VERSION_INFO_DESC = new StructSequence.BuiltinTypeDescriptor( PythonBuiltinClassType.PVersionInfo, - // @formatter:off The formatter joins these lines making it less readable - "sys.version_info\n" + - "\n" + - "Version information as a named tuple.", - // @formatter:on 5, new String[]{ "major", "minor", "micro", "releaselevel", "serial"}, new String[]{ "Major release number", "Minor release number", "Patch release number", - "'alpha', 'beta', 'candidate', or 'final'", "Serial release number"}, - false); + "'alpha', 'beta', 'candidate', or 'final'", "Serial release number"}); static final StructSequence.BuiltinTypeDescriptor WINDOWS_VER_DESC = new StructSequence.BuiltinTypeDescriptor( PythonBuiltinClassType.PWindowsVersion, - // @formatter:off The formatter joins these lines making it less readable - "sys.getwindowsversion\n" + - "\n" + - "Return info about the running version of Windows as a named tuple.", - // @formatter:on 5, new String[]{ "major", "minor", "build", @@ -323,16 +313,10 @@ public final class SysModuleBuiltins extends PythonBuiltins { "Operating system platform", "Latest Service Pack installed on the system", "Service Pack major version number", "Service Pack minor version number", "Bit mask identifying available product suites", - "System product type", "Diagnostic version number"}, - false); + "System product type", "Diagnostic version number"}); static final StructSequence.BuiltinTypeDescriptor FLAGS_DESC = new StructSequence.BuiltinTypeDescriptor( PythonBuiltinClassType.PFlags, - // @formatter:off The formatter joins these lines making it less readable - "sys.flags\n" + - "\n" + - "Flags provided through command line arguments or environment vars.", - // @formatter:on 18, new String[]{ "debug", @@ -373,18 +357,10 @@ public final class SysModuleBuiltins extends PythonBuiltins { "-X warn_default_encoding", "-P", "-X int_max_str_digits", - }, - false); + }); static final StructSequence.BuiltinTypeDescriptor FLOAT_INFO_DESC = new StructSequence.BuiltinTypeDescriptor( PythonBuiltinClassType.PFloatInfo, - // @formatter:off The formatter joins these lines making it less readable - "sys.float_info\n" + - "\n" + - "A named tuple holding information about the float type. It contains low level\n" + - "information about the precision and internal representation. Please study\n" + - "your system's :file:`float.h` for more information.", - // @formatter:on 11, new String[]{ "max", @@ -413,12 +389,6 @@ public final class SysModuleBuiltins extends PythonBuiltins { static final StructSequence.BuiltinTypeDescriptor INT_INFO_DESC = new StructSequence.BuiltinTypeDescriptor( PythonBuiltinClassType.PIntInfo, - // @formatter:off The formatter joins these lines making it less readable - "sys.int_info\n" + - "\n" + - "A named tuple that holds information about Python's\n" + - "internal representation of integers. The attributes are read only.", - // @formatter:on 4, new String[]{ "bits_per_digit", "sizeof_digit", "default_max_str_digits", "str_digits_check_threshold"}, @@ -430,12 +400,6 @@ public final class SysModuleBuiltins extends PythonBuiltins { static final StructSequence.BuiltinTypeDescriptor HASH_INFO_DESC = new StructSequence.BuiltinTypeDescriptor( PythonBuiltinClassType.PHashInfo, - // @formatter:off The formatter joins these lines making it less readable - "hash_info\n" + - "\n" + - "A named tuple providing parameters used for computing\n" + - "hashes. The attributes are read only.", - // @formatter:on 9, new String[]{ "width", "modulus", "inf", "nan", "imag", "algorithm", "hash_bits", @@ -453,11 +417,6 @@ public final class SysModuleBuiltins extends PythonBuiltins { static final StructSequence.BuiltinTypeDescriptor THREAD_INFO_DESC = new StructSequence.BuiltinTypeDescriptor( PythonBuiltinClassType.PThreadInfo, - // @formatter:off The formatter joins these lines making it less readable - "sys.thread_info\n" + - "\n" + - "A named tuple holding information about the thread implementation.", - // @formatter:on 3, new String[]{ "name", "lock", "version"}, @@ -467,11 +426,6 @@ public final class SysModuleBuiltins extends PythonBuiltins { public static final StructSequence.BuiltinTypeDescriptor UNRAISABLEHOOK_ARGS_DESC = new StructSequence.BuiltinTypeDescriptor( PythonBuiltinClassType.PUnraisableHookArgs, - // @formatter:off The formatter joins these lines making it less readable - "UnraisableHookArgs\n" + - "\n" + - "Type used to pass arguments to sys.unraisablehook.", - // @formatter:on 5, new String[]{ "exc_type", "exc_value", "exc_traceback", @@ -507,21 +461,22 @@ protected List> getNodeFa return SysModuleBuiltinsFactory.getFactories(); } - protected static PSimpleNamespace makeImplementation(PythonObjectFactory factory, PTuple versionInfo, TruffleString gmultiarch) { - final PSimpleNamespace ns = factory.createSimpleNamespace(); + private static PSimpleNamespace makeImplementation(PythonLanguage language, PTuple graalpyVersionInfo, TruffleString gmultiarch) { + final PSimpleNamespace ns = PFactory.createSimpleNamespace(language); ns.setAttribute(tsLiteral("name"), T_GRAALPYTHON_ID); /*- 'cache_tag' must match the format of mx.graalpython/mx_graalpython.py:graalpy_ext */ ns.setAttribute(T_CACHE_TAG, toTruffleStringUncached(J_GRAALPYTHON_ID + PythonLanguage.GRAALVM_MAJOR + PythonLanguage.GRAALVM_MINOR + PythonLanguage.DEV_TAG + "-" + PythonLanguage.MAJOR + PythonLanguage.MINOR)); - ns.setAttribute(T_VERSION, versionInfo); + ns.setAttribute(T_VERSION, graalpyVersionInfo); ns.setAttribute(T__MULTIARCH, gmultiarch); - ns.setAttribute(tsLiteral("hexversion"), PythonLanguage.VERSION_HEX); + ns.setAttribute(tsLiteral("hexversion"), PythonLanguage.GRAALVM_MAJOR << 24 | PythonLanguage.GRAALVM_MINOR << 16 | PythonLanguage.GRAALVM_MICRO << 8 | RELEASE_LEVEL << 4 | RELEASE_SERIAL); return ns; } @Override public void initialize(Python3Core core) { + PythonLanguage language = core.getLanguage(); StructSequence.initType(core, VERSION_INFO_DESC); if (PythonOS.getPythonOS() == PLATFORM_WIN32) { StructSequence.initType(core, WINDOWS_VER_DESC); @@ -536,19 +491,18 @@ public void initialize(Python3Core core) { addBuiltinConstant("abiflags", T_EMPTY_STRING); addBuiltinConstant("byteorder", ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN ? T_LITTLE : T_BIG); addBuiltinConstant("copyright", T_LICENSE); - final PythonObjectFactory factory = PythonObjectFactory.getUncached(); - addBuiltinConstant(T_MODULES, factory.createDict()); - addBuiltinConstant("path", factory.createList()); - addBuiltinConstant("builtin_module_names", factory.createTuple(core.builtinModuleNames())); + addBuiltinConstant(T_MODULES, PFactory.createDict(language)); + addBuiltinConstant("path", PFactory.createList(language)); + addBuiltinConstant("builtin_module_names", PFactory.createTuple(language, core.builtinModuleNames())); addBuiltinConstant("maxsize", MAXSIZE); - final PTuple versionInfo = factory.createStructSeq(VERSION_INFO_DESC, PythonLanguage.MAJOR, PythonLanguage.MINOR, PythonLanguage.MICRO, PythonLanguage.RELEASE_LEVEL_STRING, + final PTuple versionInfo = PFactory.createStructSeq(language, VERSION_INFO_DESC, PythonLanguage.MAJOR, PythonLanguage.MINOR, PythonLanguage.MICRO, PythonLanguage.RELEASE_LEVEL_STRING, PythonLanguage.RELEASE_SERIAL); addBuiltinConstant("version_info", versionInfo); addBuiltinConstant("api_version", PythonLanguage.API_VERSION); addBuiltinConstant("version", toTruffleStringUncached(PythonLanguage.VERSION + " (" + COMPILE_TIME + ")" + "\n[Graal, " + Truffle.getRuntime().getName() + ", Java " + System.getProperty("java.version") + " (" + System.getProperty("os.arch") + ")]")); - addBuiltinConstant("float_info", factory.createStructSeq(FLOAT_INFO_DESC, + addBuiltinConstant("float_info", PFactory.createStructSeq(language, FLOAT_INFO_DESC, Double.MAX_VALUE, // DBL_MAX Double.MAX_EXPONENT + 1, // DBL_MAX_EXP 308, // DBL_MIN_10_EXP @@ -561,8 +515,8 @@ public void initialize(Python3Core core) { 2, // FLT_RADIX 1 // FLT_ROUNDS )); - addBuiltinConstant("int_info", factory.createStructSeq(INT_INFO_DESC, 32, 4, INT_DEFAULT_MAX_STR_DIGITS, INT_MAX_STR_DIGITS_THRESHOLD)); - addBuiltinConstant("hash_info", factory.createStructSeq(HASH_INFO_DESC, + addBuiltinConstant("int_info", PFactory.createStructSeq(language, INT_INFO_DESC, 32, 4, INT_DEFAULT_MAX_STR_DIGITS, INT_MAX_STR_DIGITS_THRESHOLD)); + addBuiltinConstant("hash_info", PFactory.createStructSeq(language, HASH_INFO_DESC, 64, // width HASH_MODULUS, // modulus HASH_INF, // inf @@ -573,7 +527,7 @@ public void initialize(Python3Core core) { 0, // seed_bits 0 // cutoff )); - addBuiltinConstant("thread_info", factory.createStructSeq(THREAD_INFO_DESC, PNone.NONE, PNone.NONE, PNone.NONE)); + addBuiltinConstant("thread_info", PFactory.createStructSeq(language, THREAD_INFO_DESC, PNone.NONE, PNone.NONE, PNone.NONE)); addBuiltinConstant("maxunicode", IntegerFormatter.LIMIT_UNICODE.intValue() - 1); PythonOS os = getPythonOS(); @@ -584,22 +538,15 @@ public void initialize(Python3Core core) { final TruffleString gmultiarch = cat(PythonUtils.getPythonArch(), T_DASH, os.getName()); addBuiltinConstant("__gmultiarch", gmultiarch); - PFileIO stdin = factory.createFileIO(PythonBuiltinClassType.PFileIO); - FileIOBuiltins.FileIOInit.internalInit(stdin, toTruffleStringUncached(""), 0, IOMode.R); - addBuiltinConstant(T_STDIN, stdin); - addBuiltinConstant(T___STDIN__, stdin); - - PFileIO stdout = factory.createFileIO(PythonBuiltinClassType.PFileIO); - FileIOBuiltins.FileIOInit.internalInit(stdout, toTruffleStringUncached(""), 1, IOMode.W); - addBuiltinConstant(T_STDOUT, stdout); - addBuiltinConstant(T___STDOUT__, stdout); - - PFileIO stderr = factory.createFileIO(PythonBuiltinClassType.PFileIO); - stderr.setUTF8Write(true); - FileIOBuiltins.FileIOInit.internalInit(stderr, toTruffleStringUncached(""), 2, IOMode.W); - addBuiltinConstant(T_STDERR, stderr); - addBuiltinConstant(T___STDERR__, stderr); - addBuiltinConstant("implementation", makeImplementation(factory, versionInfo, gmultiarch)); + // Initialized later in postInitialize + addBuiltinConstant(T_STDIN, PNone.NONE); + addBuiltinConstant(T_STDOUT, PNone.NONE); + addBuiltinConstant(T_STDERR, PNone.NONE); + + PTuple graalpyVersion = PFactory.createStructSeq(language, VERSION_INFO_DESC, PythonLanguage.GRAALVM_MAJOR, PythonLanguage.GRAALVM_MINOR, PythonLanguage.GRAALVM_MICRO, + PythonLanguage.RELEASE_LEVEL_STRING, PythonLanguage.RELEASE_SERIAL); + addBuiltinConstant("graalpy_version_info", graalpyVersion); + addBuiltinConstant("implementation", makeImplementation(language, graalpyVersion, gmultiarch)); addBuiltinConstant("hexversion", PythonLanguage.VERSION_HEX); if (os == PLATFORM_WIN32) { @@ -607,9 +554,9 @@ public void initialize(Python3Core core) { } addBuiltinConstant("float_repr_style", "short"); - addBuiltinConstant("meta_path", factory.createList()); - addBuiltinConstant("path_hooks", factory.createList()); - addBuiltinConstant("path_importer_cache", factory.createDict()); + addBuiltinConstant("meta_path", PFactory.createList(language)); + addBuiltinConstant("path_hooks", PFactory.createList(language)); + addBuiltinConstant("path_importer_cache", PFactory.createDict(language)); // default prompt for interactive shell addBuiltinConstant("ps1", ">>> "); @@ -617,7 +564,7 @@ public void initialize(Python3Core core) { addBuiltinConstant("ps2", "... "); // CPython builds for distros report empty strings too, because they are built from // tarballs, not git - addBuiltinConstant("_git", factory.createTuple(new Object[]{T_GRAALPYTHON_ID, T_EMPTY_STRING, T_EMPTY_STRING})); + addBuiltinConstant("_git", PFactory.createTuple(language, new Object[]{T_GRAALPYTHON_ID, T_EMPTY_STRING, T_EMPTY_STRING})); if (PythonOS.getPythonOS() == PLATFORM_WIN32) { addBuiltinConstant("_vpath", ""); @@ -633,12 +580,12 @@ public void postInitialize0(Python3Core core) { super.postInitialize(core); PythonModule sys = core.lookupBuiltinModule(T_SYS); PythonContext context = core.getContext(); + PythonLanguage language = core.getLanguage(); String[] args = context.getEnv().getApplicationArguments(); - final PythonObjectFactory factory = PythonObjectFactory.getUncached(); - sys.setAttribute(tsLiteral("argv"), factory.createList(convertToObjectArray(args))); - sys.setAttribute(tsLiteral("orig_argv"), factory.createList(convertToObjectArray(PythonOptions.getOrigArgv(core.getContext())))); + sys.setAttribute(tsLiteral("argv"), PFactory.createList(language, convertToObjectArray(args))); + sys.setAttribute(tsLiteral("orig_argv"), PFactory.createList(language, convertToObjectArray(PythonOptions.getOrigArgv(core.getContext())))); - sys.setAttribute(tsLiteral("stdlib_module_names"), createStdLibModulesSet(factory)); + sys.setAttribute(tsLiteral("stdlib_module_names"), createStdLibModulesSet(language)); TruffleString prefix = context.getSysPrefix(); for (TruffleString name : SysModuleBuiltins.SYS_PREFIX_ATTRIBUTES) { @@ -656,7 +603,7 @@ public void postInitialize0(Python3Core core) { TruffleString stdlibHome = context.getStdlibHome(); TruffleString capiHome = context.getCAPIHome(); - if (!ImageInfo.inImageBuildtimeCode()) { + if (!context.getEnv().isPreInitialization()) { TruffleString executable = context.getOption(PythonOptions.Executable); TruffleString baseExecutable = context.getOption(PythonOptions.BaseExecutable); sys.setAttribute(tsLiteral("executable"), executable); @@ -664,6 +611,9 @@ public void postInitialize0(Python3Core core) { } sys.setAttribute(tsLiteral("dont_write_bytecode"), context.getOption(PythonOptions.DontWriteBytecodeFlag)); TruffleString pycachePrefix = context.getOption(PythonOptions.PyCachePrefix); + if (pycachePrefix.isEmpty() && PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER && System.getenv("CI") == null) { + pycachePrefix = PythonUtils.toTruffleStringUncached("__bci_dsl_pycache__"); + } sys.setAttribute(tsLiteral("pycache_prefix"), pycachePrefix.isEmpty() ? PNone.NONE : pycachePrefix); sys.setAttribute(tsLiteral("_stdlib_dir"), stdlibHome); @@ -676,7 +626,7 @@ public void postInitialize0(Python3Core core) { } else { warnoptions = PythonUtils.EMPTY_OBJECT_ARRAY; } - sys.setAttribute(tsLiteral("warnoptions"), factory.createList(warnoptions)); + sys.setAttribute(tsLiteral("warnoptions"), PFactory.createList(language, warnoptions)); Env env = context.getEnv(); TruffleString pythonPath = context.getOption(PythonOptions.PythonPath); @@ -705,9 +655,9 @@ public void postInitialize0(Python3Core core) { // include our native modules on the path path[pathIdx++] = toTruffleStringUncached(capiHome + env.getFileNameSeparator() + "modules"); } - PList sysPaths = factory.createList(path); + PList sysPaths = PFactory.createList(language, path); sys.setAttribute(tsLiteral("path"), sysPaths); - sys.setAttribute(tsLiteral("flags"), factory.createStructSeq(SysModuleBuiltins.FLAGS_DESC, + sys.setAttribute(tsLiteral("flags"), PFactory.createStructSeq(language, SysModuleBuiltins.FLAGS_DESC, PInt.intValue(!context.getOption(PythonOptions.PythonOptimizeFlag)), // debug PInt.intValue(context.getOption(PythonOptions.InspectFlag)), // inspect PInt.intValue(context.getOption(PythonOptions.TerminalIsInteractive)), // interactive @@ -733,18 +683,18 @@ public void postInitialize0(Python3Core core) { sys.setAttribute(T___BREAKPOINTHOOK__, sys.getAttribute(T_BREAKPOINTHOOK)); } - private static PFrozenSet createStdLibModulesSet(PythonObjectFactory factory) { + private static PFrozenSet createStdLibModulesSet(PythonLanguage language) { EconomicMapStorage storage = EconomicMapStorage.create(STDLIB_MODULE_NAMES.length); for (String s : STDLIB_MODULE_NAMES) { - storage.putUncachedWithJavaEq(s, PNone.NONE); + storage.putUncached(s, PNone.NONE); } - return factory.createFrozenSet(storage); + return PFactory.createFrozenSet(language, storage); } /** * Like {@link PythonUtils#toTruffleStringArrayUncached(String[])}, but creates an array of * {@link Object}'s. The intended use of this method is in slow-path in calls to methods like - * {@link PythonObjectFactory#createTuple(Object[])}. + * {@link PFactory#createTuple}. */ private static Object[] convertToObjectArray(String[] src) { if (src == null) { @@ -774,37 +724,52 @@ public void postInitialize(Python3Core core) { } @TruffleBoundary - public void initStd(Python3Core core) { - PythonObjectFactory factory = core.factory(); + static void initStd(Python3Core core) { + PythonContext context = core.getContext(); + PythonLanguage language = core.getLanguage(); // wrap std in/out/err GraalPythonModuleBuiltins gp = (GraalPythonModuleBuiltins) core.lookupBuiltinModule(T___GRAALPYTHON__).getBuiltins(); TruffleString stdioEncoding = gp.getStdIOEncoding(); TruffleString stdioError = gp.getStdIOError(); - Object posixSupport = core.getContext().getPosixSupport(); + Object posixSupport = context.getPosixSupport(); PosixSupportLibrary posixLib = PosixSupportLibrary.getUncached(); PythonModule sysModule = core.lookupBuiltinModule(T_SYS); - PBuffered reader = factory.createBufferedReader(PythonBuiltinClassType.PBufferedReader); - BufferedReaderBuiltins.BufferedReaderInit.internalInit(reader, (PFileIO) getBuiltinConstant(T_STDIN), BufferedReaderBuiltins.DEFAULT_BUFFER_SIZE, factory, posixSupport, - posixLib); - setWrapper(T_STDIN, T___STDIN__, T_R, stdioEncoding, stdioError, reader, sysModule, factory); + // Note that stdin is always buffered, this only applies to stdout and stderr + boolean buffering = !context.getOption(PythonOptions.UnbufferedIO); - PBuffered writer = factory.createBufferedWriter(PythonBuiltinClassType.PBufferedWriter); - BufferedWriterBuiltins.BufferedWriterInit.internalInit(writer, (PFileIO) getBuiltinConstant(T_STDOUT), BufferedReaderBuiltins.DEFAULT_BUFFER_SIZE, factory, posixSupport, - posixLib); - setWrapper(T_STDOUT, T___STDOUT__, T_W, stdioEncoding, stdioError, writer, sysModule, factory); + PFileIO stdinFileIO = PFactory.createFileIO(language); + FileIOBuiltins.FileIOInit.internalInit(stdinFileIO, toTruffleStringUncached(""), 0, IOMode.RB); + PBuffered stdinBuffer = PFactory.createBufferedReader(language); + BufferedReaderBuiltins.BufferedReaderInit.internalInit(stdinBuffer, stdinFileIO, BufferedReaderBuiltins.DEFAULT_BUFFER_SIZE, language, posixSupport, posixLib); + setWrapper(T_STDIN, T___STDIN__, T_R, stdioEncoding, stdioError, stdinBuffer, sysModule, language, true); - writer = factory.createBufferedWriter(PythonBuiltinClassType.PBufferedWriter); - BufferedWriterBuiltins.BufferedWriterInit.internalInit(writer, (PFileIO) getBuiltinConstant(T_STDERR), BufferedReaderBuiltins.DEFAULT_BUFFER_SIZE, factory, posixSupport, - posixLib); - setWrapper(T_STDERR, T___STDERR__, T_W, stdioEncoding, T_BACKSLASHREPLACE, writer, sysModule, factory); + PFileIO stdoutFileIO = PFactory.createFileIO(language); + FileIOBuiltins.FileIOInit.internalInit(stdoutFileIO, toTruffleStringUncached(""), 1, IOMode.WB); + Object stdoutBuffer = createBufferedIO(buffering, language, stdoutFileIO, posixSupport, posixLib); + setWrapper(T_STDOUT, T___STDOUT__, T_W, stdioEncoding, stdioError, stdoutBuffer, sysModule, language, buffering); + + PFileIO stderr = PFactory.createFileIO(language); + FileIOBuiltins.FileIOInit.internalInit(stderr, toTruffleStringUncached(""), 2, IOMode.WB); + Object stderrBuffer = createBufferedIO(buffering, language, stderr, posixSupport, posixLib); + setWrapper(T_STDERR, T___STDERR__, T_W, stdioEncoding, T_BACKSLASHREPLACE, stderrBuffer, sysModule, language, buffering); + } + + private static Object createBufferedIO(boolean buffering, PythonLanguage language, PFileIO fileIo, Object posixSupport, PosixSupportLibrary posixLib) { + if (!buffering) { + return fileIo; + } + PBuffered writer = PFactory.createBufferedWriter(language); + BufferedWriterBuiltins.BufferedWriterInit.internalInit(writer, fileIo, BufferedReaderBuiltins.DEFAULT_BUFFER_SIZE, language, posixSupport, posixLib); + return writer; } - private static PTextIO setWrapper(TruffleString name, TruffleString specialName, TruffleString mode, TruffleString encoding, TruffleString error, PBuffered buffered, PythonModule sysModule, - PythonObjectFactory factory) { - PTextIO textIOWrapper = factory.createTextIO(PythonBuiltinClassType.PTextIOWrapper); - TextIOWrapperInitNodeGen.getUncached().execute(null, null, textIOWrapper, buffered, encoding, error, PNone.NONE, true, true); + private static PTextIO setWrapper(TruffleString name, TruffleString specialName, TruffleString mode, TruffleString encoding, TruffleString error, Object buffer, PythonModule sysModule, + PythonLanguage language, boolean buffering) { + PTextIO textIOWrapper = PFactory.createTextIO(language); + TextIOWrapperInitNodeGen.getUncached().execute(null, null, textIOWrapper, buffer, encoding, error, PNone.NONE, + /* line_buffering */ buffering, /* write_through */ !buffering); setAttribute(textIOWrapper, T_MODE, mode); setAttribute(sysModule, name, textIOWrapper); @@ -845,23 +810,36 @@ static PTuple run(VirtualFrame frame, @Cached GetEscapedExceptionNode getEscapedExceptionNode, @Cached GetCaughtExceptionNode getCaughtExceptionNode, @Cached ExceptionNodes.GetTracebackNode getTracebackNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { AbstractTruffleException currentException = getCaughtExceptionNode.execute(frame); assert currentException != PException.NO_EXCEPTION; if (currentException == null) { - return factory.createTuple(new PNone[]{PNone.NONE, PNone.NONE, PNone.NONE}); + return PFactory.createTuple(language, new PNone[]{PNone.NONE, PNone.NONE, PNone.NONE}); } else { Object exceptionObject = getEscapedExceptionNode.execute(inliningTarget, currentException); Object traceback = getTracebackNode.execute(inliningTarget, exceptionObject); - return factory.createTuple(new Object[]{getClassNode.execute(inliningTarget, exceptionObject), exceptionObject, traceback}); + return PFactory.createTuple(language, new Object[]{getClassNode.execute(inliningTarget, exceptionObject), exceptionObject, traceback}); } } + } - @NeverDefault - public static ExcInfoNode create() { - return ExcInfoNodeFactory.create(null); - } + @Builtin(name = "exception", needsFrame = true) + @GenerateNodeFactory + abstract static class ExceptionNode extends PythonBuiltinNode { + @Specialization + static Object run(VirtualFrame frame, + @Bind("this") Node inliningTarget, + @Cached GetEscapedExceptionNode getEscapedExceptionNode, + @Cached GetCaughtExceptionNode getCaughtExceptionNode) { + AbstractTruffleException currentException = getCaughtExceptionNode.execute(frame); + assert currentException != PException.NO_EXCEPTION; + if (currentException == null) { + return PNone.NONE; + } else { + return getEscapedExceptionNode.execute(inliningTarget, currentException); + } + } } // ATTENTION: this is intentionally a PythonBuiltinNode and not PythonUnaryBuiltinNode, @@ -881,10 +859,10 @@ static PFrame counted(VirtualFrame frame, int num, @Bind("this") Node inliningTarget, @Cached ReadCallerFrameNode readCallerNode, @Cached InlinedConditionProfile callStackDepthProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { PFrame requested = escapeFrame(frame, num, readCallerNode); if (callStackDepthProfile.profile(inliningTarget, requested == null)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.CALL_STACK_NOT_DEEP_ENOUGH); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.CALL_STACK_NOT_DEEP_ENOUGH); } return requested; } @@ -907,13 +885,13 @@ Object currentFrames(VirtualFrame frame, @Cached WarningsModuleBuiltins.WarnNode warnNode, @Cached ReadCallerFrameNode readCallerFrameNode, @Cached HashingStorageSetItem setHashingStorageItem, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { auditNode.audit(inliningTarget, "sys._current_frames"); if (!getLanguage().singleThreadedAssumption.isValid()) { warnNode.warn(frame, RuntimeWarning, ErrorMessages.WARN_CURRENT_FRAMES_MULTITHREADED); } PFrame currentFrame = readCallerFrameNode.executeWith(frame, 0); - PDict result = factory.createDict(); + PDict result = PFactory.createDict(language); result.setDictStorage(setHashingStorageItem.execute(frame, inliningTarget, result.getDictStorage(), PThread.getThreadId(Thread.currentThread()), currentFrame)); return result; } @@ -949,18 +927,18 @@ public abstract static class InternNode extends PythonUnaryBuiltinNode { static Object doPString(Object s, @Bind("this") Node inliningTarget, @Cached StringNodes.InternStringNode internNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { final PString interned = internNode.execute(inliningTarget, s); if (interned == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANNOT_INTERN_P, s); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANNOT_INTERN_P, s); } return interned; } @Fallback static Object doOthers(Object obj, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.S_ARG_MUST_BE_S_NOT_P, "intern()", "str", obj); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.S_ARG_MUST_BE_S_NOT_P, "intern()", "str", obj); } } @@ -1012,7 +990,7 @@ static Object doGeneric(VirtualFrame frame, Object object, @SuppressWarnings("un @Bind("this") Node inliningTarget, @Shared @Cached PyNumberAsSizeNode asSizeNode, @Cached("createWithError()") LookupAndCallUnaryNode callSizeofNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { return checkResult(frame, inliningTarget, asSizeNode, callSizeofNode.executeObject(frame, object), raiseNode); } @@ -1021,7 +999,7 @@ static Object doGeneric(VirtualFrame frame, Object object, Object dflt, @Bind("this") Node inliningTarget, @Shared @Cached PyNumberAsSizeNode asSizeNode, @Cached("createWithoutError()") LookupAndCallUnaryNode callSizeofNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { Object result = callSizeofNode.executeObject(frame, object); if (result == PNone.NO_VALUE) { return dflt; @@ -1029,10 +1007,10 @@ static Object doGeneric(VirtualFrame frame, Object object, Object dflt, return checkResult(frame, inliningTarget, asSizeNode, result, raiseNode); } - private static Object checkResult(VirtualFrame frame, Node inliningTarget, PyNumberAsSizeNode asSizeNode, Object result, PRaiseNode.Lazy raiseNode) { + private static Object checkResult(VirtualFrame frame, Node inliningTarget, PyNumberAsSizeNode asSizeNode, Object result, PRaiseNode raiseNode) { int value = asSizeNode.executeExact(frame, inliningTarget, result); if (value < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.SHOULD_RETURN, "__sizeof__()", ">= 0"); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.SHOULD_RETURN, "__sizeof__()", ">= 0"); } return value; } @@ -1040,11 +1018,12 @@ private static Object checkResult(VirtualFrame frame, Node inliningTarget, PyNum @NeverDefault protected LookupAndCallUnaryNode createWithError() { return LookupAndCallUnaryNode.create(T___SIZEOF__, () -> new NoAttributeHandler() { - @Child private PRaiseNode raiseNode = PRaiseNode.create(); + private final BranchProfile errorProfile = BranchProfile.create(); @Override public Object execute(Object receiver) { - throw raiseNode.raise(TypeError, ErrorMessages.TYPE_DOESNT_DEFINE_METHOD, receiver, T___SIZEOF__); + errorProfile.enter(); + throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.TYPE_DOESNT_DEFINE_METHOD, receiver, T___SIZEOF__); } }); } @@ -1120,10 +1099,11 @@ boolean doGeneric() { @GenerateNodeFactory abstract static class SetTrace extends PythonBuiltinNode { @Specialization - Object settrace(Object function) { - PythonContext ctx = getContext(); - PythonLanguage language = getLanguage(); - PythonContext.PythonThreadState state = ctx.getThreadState(language); + static Object settrace(Object function, + @Bind("this") Node inliningTarget, + @Bind PythonContext context) { + PythonLanguage language = context.getLanguage(inliningTarget); + PythonContext.PythonThreadState state = context.getThreadState(language); if (function == PNone.NONE) { state.setTraceFun(null, language); } else { @@ -1138,10 +1118,11 @@ Object settrace(Object function) { @GenerateNodeFactory abstract static class SetProfile extends PythonBuiltinNode { @Specialization - Object settrace(Object function) { - PythonContext ctx = getContext(); - PythonLanguage language = getLanguage(); - PythonContext.PythonThreadState state = ctx.getThreadState(language); + static Object settrace(Object function, + @Bind("this") Node inliningTarget, + @Bind PythonContext context) { + PythonLanguage language = context.getLanguage(inliningTarget); + PythonContext.PythonThreadState state = context.getThreadState(language); if (function == PNone.NONE) { state.setProfileFun(null, language); } else { @@ -1155,9 +1136,10 @@ Object settrace(Object function) { @GenerateNodeFactory abstract static class GetTrace extends PythonBuiltinNode { @Specialization - Object gettrace() { - PythonContext ctx = getContext(); - PythonContext.PythonThreadState state = ctx.getThreadState(getLanguage()); + static Object gettrace( + @Bind("this") Node inliningTarget, + @Bind PythonContext context) { + PythonContext.PythonThreadState state = context.getThreadState(context.getLanguage(inliningTarget)); Object trace = state.getTraceFun(); return trace == null ? PNone.NONE : trace; @@ -1168,9 +1150,10 @@ Object gettrace() { @GenerateNodeFactory abstract static class GetProfile extends PythonBuiltinNode { @Specialization - Object getProfile() { - PythonContext ctx = getContext(); - PythonContext.PythonThreadState state = ctx.getThreadState(getLanguage()); + static Object getProfile( + @Bind("this") Node inliningTarget, + @Bind PythonContext context) { + PythonContext.PythonThreadState state = context.getThreadState(context.getLanguage(inliningTarget)); Object trace = state.getProfileFun(); return trace == null ? PNone.NONE : trace; } @@ -1180,11 +1163,13 @@ Object getProfile() { @GenerateNodeFactory abstract static class SetAsyncgenHooks extends PythonBuiltinNode { @Specialization - Object setAsyncgenHooks(Object firstIter, Object finalizer) { + static Object setAsyncgenHooks(Object firstIter, Object finalizer, + @Bind("this") Node inliningTarget, + @Bind PythonContext context) { if (firstIter != PNone.NO_VALUE && firstIter != PNone.NONE) { - getContext().getThreadState(getLanguage()).setAsyncgenFirstIter(firstIter); + context.getThreadState(context.getLanguage(inliningTarget)).setAsyncgenFirstIter(firstIter); } else if (firstIter == PNone.NONE) { - getContext().getThreadState(getLanguage()).setAsyncgenFirstIter(null); + context.getThreadState(context.getLanguage(inliningTarget)).setAsyncgenFirstIter(null); } // Ignore finalizer, since we don't have a useful place to call it return PNone.NONE; @@ -1195,12 +1180,14 @@ Object setAsyncgenHooks(Object firstIter, Object finalizer) { @GenerateNodeFactory abstract static class GetAsyncgenHooks extends PythonBuiltinNode { @Specialization - Object setAsyncgenHooks( - @Cached PythonObjectFactory factory) { + static Object setAsyncgenHooks( + @Bind("this") Node inliningTarget, + @Bind PythonContext context, + @Bind PythonLanguage language) { // TODO: use asyncgen_hooks object - PythonContext.PythonThreadState threadState = getContext().getThreadState(getLanguage()); + PythonContext.PythonThreadState threadState = context.getThreadState(context.getLanguage(inliningTarget)); Object firstiter = threadState.getAsyncgenFirstIter(); - return factory.createTuple(new Object[]{firstiter == null ? PNone.NONE : firstiter, PNone.NONE}); + return PFactory.createTuple(language, new Object[]{firstiter == null ? PNone.NONE : firstiter, PNone.NONE}); } } @@ -1209,7 +1196,7 @@ Object setAsyncgenHooks( abstract static class GetCoroOriginTrackingDepth extends PythonBuiltinNode { @Specialization - Object getCoroDepth() { + static Object getCoroDepth() { // TODO: Implement return 0; } @@ -1220,7 +1207,7 @@ Object getCoroDepth() { abstract static class SetCoroOriginTrackingDepth extends PythonUnaryBuiltinNode { @Specialization - Object setCoroDepth(Object newValue) { + static Object setCoroDepth(Object newValue) { // TODO: Implement return PNone.NONE; } @@ -1316,10 +1303,10 @@ private void writeUnraisableExc(MaterializedFrame frame, PythonModule sys, Objec Object doit(VirtualFrame frame, PythonModule sys, Object args, @Bind("this") Node inliningTarget, @Cached PyTupleGetItem getItemNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { final Object cls = getObjectClass(args); if (cls != PythonBuiltinClassType.PUnraisableHookArgs) { - throw raiseNode.get(inliningTarget).raise(TypeError, ARG_TYPE_MUST_BE, "sys.unraisablehook", "UnraisableHookArgs"); + throw raiseNode.raise(inliningTarget, TypeError, ARG_TYPE_MUST_BE, "sys.unraisablehook", "UnraisableHookArgs"); } final Object excType = getItemNode.execute(inliningTarget, args, 0); final Object excValue = getItemNode.execute(inliningTarget, args, 1); @@ -1360,7 +1347,7 @@ private void printTraceBack(VirtualFrame frame, PythonModule sys, Object out, Ob pyTraceBackPrintNode.execute(frame, sys, out, tb); } - @CompilerDirectives.ValueType + @ValueType static final class SyntaxErrData { final Object message; final TruffleString fileName; @@ -1516,15 +1503,14 @@ void printExceptionRecursive(MaterializedFrame frame, PythonModule sys, Object o protected void printException(MaterializedFrame frame, PythonModule sys, Object out, Object excValue) { Object value = excValue; final Object type = getObjectClass(value); - if (!PGuards.isPBaseException(value)) { + if (!PyExceptionInstanceCheckNode.executeUncached(value)) { fileWriteString(frame, out, "TypeError: print_exception(): Exception expected for value, "); fileWriteString(frame, out, getTypeName(type)); fileWriteString(frame, out, " found\n"); return; } - final PBaseException exc = (PBaseException) value; - final Object tb = getExceptionTraceback(exc); + final Object tb = getExceptionTraceback(value); if (tb instanceof PTraceback) { printTraceBack(frame, sys, out, tb); } @@ -1573,7 +1559,7 @@ protected void printException(MaterializedFrame frame, PythonModule sys, Object // only print colon if the str() of the object is not the empty string v = objectStr(frame, value); TruffleString s = tryCastToString(v); - if (v == null) { + if (v == PNone.NONE) { fileWriteString(frame, out, ": "); } else if (!PGuards.isString(v) || (s != null && !s.isEmpty())) { fileWriteString(frame, out, ": "); @@ -1662,10 +1648,10 @@ static Object doHook(VirtualFrame frame, PythonModule sys, Object obj, @Cached CastToTruffleStringNode castToStringNode, @Cached PyUnicodeAsEncodedString pyUnicodeAsEncodedString, @Cached PyUnicodeFromEncodedObject pyUnicodeFromEncodedObject, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { final PythonModule builtins = PythonContext.get(inliningTarget).getBuiltins(); if (builtins == null) { - throw raiseNode.get(inliningTarget).raise(RuntimeError, LOST_S, "builtins module"); + throw raiseNode.raise(inliningTarget, RuntimeError, LOST_S, "builtins module"); } // Print value except if None // After printing, also assign to '_' @@ -1677,7 +1663,7 @@ static Object doHook(VirtualFrame frame, PythonModule sys, Object obj, setAttr.execute(frame, inliningTarget, builtins, T___, PNone.NONE); Object stdOut = objectLookupAttr(frame, inliningTarget, sys, T_STDOUT, lookupAttr); if (PGuards.isPNone(stdOut)) { - throw raiseNode.get(inliningTarget).raise(RuntimeError, LOST_S, "sys.stdout"); + throw raiseNode.raise(inliningTarget, RuntimeError, LOST_S, "sys.stdout"); } Object reprVal = null; @@ -1830,9 +1816,9 @@ static Object setRecLim(VirtualFrame frame, @SuppressWarnings("unused") PythonMo @Bind("this") Node inliningTarget, @Cached PyLongAsIntNode longAsIntNode, @Cached PyFloatCheckExactNode floatCheckExactNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (floatCheckExactNode.execute(inliningTarget, limit)) { - throw raiseNode.get(inliningTarget).raise(TypeError, S_EXPECTED_GOT_P, "integer", limit); + throw raiseNode.raise(inliningTarget, TypeError, S_EXPECTED_GOT_P, "integer", limit); } int newLimit; @@ -1843,7 +1829,7 @@ static Object setRecLim(VirtualFrame frame, @SuppressWarnings("unused") PythonMo } if (newLimit < 1) { - throw raiseNode.get(inliningTarget).raise(ValueError, REC_LIMIT_GREATER_THAN_1); + throw raiseNode.raise(inliningTarget, ValueError, REC_LIMIT_GREATER_THAN_1); } // TODO: check to see if Issue #25274 applies @@ -1883,9 +1869,9 @@ static Object setCheckInterval(VirtualFrame frame, @SuppressWarnings("unused") P @Cached WarningsModuleBuiltins.WarnNode warnNode, @Cached PyLongAsIntNode longAsIntNode, @Cached PyFloatCheckExactNode floatCheckExactNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (floatCheckExactNode.execute(inliningTarget, arg)) { - throw raiseNode.get(inliningTarget).raise(TypeError, S_EXPECTED_GOT_P, "integer", arg); + throw raiseNode.raise(inliningTarget, TypeError, S_EXPECTED_GOT_P, "integer", arg); } try { @@ -1931,10 +1917,10 @@ abstract static class SetSwitchIntervalNode extends PythonBuiltinNode { static Object setCheckInterval(VirtualFrame frame, @SuppressWarnings("unused") PythonModule sys, Object arg, @Bind("this") Node inliningTarget, @Cached PyFloatAsDoubleNode floatAsDoubleNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { double interval = floatAsDoubleNode.execute(frame, inliningTarget, arg); if (interval <= 0.0) { - throw raiseNode.get(inliningTarget).raise(ValueError, SWITCH_INTERVAL_MUST_BE_POSITIVE); + throw raiseNode.raise(inliningTarget, ValueError, SWITCH_INTERVAL_MUST_BE_POSITIVE); } PythonContext.get(inliningTarget).getSysModuleState().setSwitchInterval(FACTOR * interval); return PNone.NONE; @@ -1955,8 +1941,8 @@ abstract static class ExitNode extends PythonBinaryBuiltinNode { @Specialization @SuppressWarnings("unused") static Object exitNoCode(PythonModule sys, PNone status, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raiseSystemExit(PNone.NONE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseSystemExitStatic(inliningTarget, PNone.NONE); } @Specialization(guards = "!isPNone(status)") @@ -1964,15 +1950,14 @@ static Object exit(VirtualFrame frame, @SuppressWarnings("unused") PythonModule @Bind("this") Node inliningTarget, @Cached PyTupleCheckNode tupleCheckNode, @Cached TupleBuiltins.LenNode tupleLenNode, - @Cached PyTupleGetItem getItemNode, - @Shared @Cached PRaiseNode raiseNode) { + @Cached PyTupleGetItem getItemNode) { Object code = status; if (tupleCheckNode.execute(inliningTarget, status)) { if (tupleLenNode.executeInt(frame, status) == 1) { code = getItemNode.execute(inliningTarget, status, 0); } } - throw raiseNode.raiseSystemExit(code); + throw PRaiseNode.raiseSystemExitStatic(inliningTarget, code); } } @@ -2033,14 +2018,15 @@ abstract static class Getwindowsversion extends PythonBuiltinNode { static int PLATFORM = 2; @Specialization - PTuple getVersion(@Cached PythonObjectFactory factory) { + PTuple getVersion( + @Bind PythonLanguage language) { if (CACHED_VERSION_INFO == null) { cacheVersion(); } - return factory.createStructSeq(WINDOWS_VER_DESC, + return PFactory.createStructSeq(language, WINDOWS_VER_DESC, CACHED_VERSION_INFO[0], CACHED_VERSION_INFO[1], CACHED_VERSION_INFO[2], PLATFORM, T_EMPTY_STRING, 0, 0, 0, 1, - factory.createTuple(CACHED_VERSION_INFO)); + PFactory.createTuple(language, CACHED_VERSION_INFO)); } @TruffleBoundary diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ThreadModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ThreadModuleBuiltins.java index 8a50577f63..d6a34eb6a1 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ThreadModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ThreadModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -49,6 +49,7 @@ import java.lang.ref.WeakReference; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; @@ -59,9 +60,8 @@ import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.builtins.objects.thread.PLock; -import com.oracle.graal.python.builtins.objects.thread.PRLock; import com.oracle.graal.python.builtins.objects.thread.PThread; -import com.oracle.graal.python.builtins.objects.thread.PThreadLocal; +import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.WriteUnraisableNode; @@ -71,25 +71,25 @@ import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; import com.oracle.graal.python.runtime.GilNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonThreadKillException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.TruffleLanguage; import com.oracle.truffle.api.TruffleThreadBuilder; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @@ -110,44 +110,14 @@ public void initialize(Python3Core core) { super.initialize(core); } - @Builtin(name = "_local", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PThreadLocal) - @GenerateNodeFactory - abstract static class ThreadLocalNode extends PythonBuiltinNode { - @Specialization - PThreadLocal construct(Object cls, Object[] args, PKeyword[] keywordArgs, - @Cached PythonObjectFactory factory) { - return factory.createThreadLocal(cls, args, keywordArgs); - } - } - @Builtin(name = "allocate_lock", maxNumOfPositionalArgs = 2) @GenerateNodeFactory public abstract static class AllocateLockNode extends PythonBinaryBuiltinNode { @Specialization @SuppressWarnings("unused") PLock construct(Object self, Object unused, - @Cached PythonObjectFactory factory) { - return factory.createLock(PythonBuiltinClassType.PLock); - } - } - - @Builtin(name = "LockType", minNumOfPositionalArgs = 1, constructsClass = PythonBuiltinClassType.PLock) - @GenerateNodeFactory - abstract static class ConstructLockNode extends PythonUnaryBuiltinNode { - @Specialization - PLock construct(Object cls, - @Cached PythonObjectFactory factory) { - return factory.createLock(cls); - } - } - - @Builtin(name = "RLock", minNumOfPositionalArgs = 1, constructsClass = PythonBuiltinClassType.PRLock) - @GenerateNodeFactory - abstract static class ConstructRLockNode extends PythonUnaryBuiltinNode { - @Specialization - PRLock construct(Object cls, - @Cached PythonObjectFactory factory) { - return factory.createRLock(cls); + @Bind PythonLanguage language) { + return PFactory.createLock(language); } } @@ -183,41 +153,41 @@ long getCount(PythonModule self) { @Builtin(name = "stack_size", minNumOfPositionalArgs = 0, maxNumOfPositionalArgs = 1) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class GetThreadStackSizeNode extends PythonUnaryBuiltinNode { - @Specialization + @Specialization(guards = "isNoValue(stackSize)") long getStackSize(@SuppressWarnings("unused") PNone stackSize) { return getContext().getPythonThreadStackSize(); } - @Specialization - static long getStackSize(long stackSize, + @Fallback + static long getStackSize(VirtualFrame frame, Object stackSizeObj, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PyNumberAsSizeNode asSizeNode, + @Cached PRaiseNode raiseNode) { + int stackSize = asSizeNode.executeExact(frame, inliningTarget, stackSizeObj); if (stackSize < 0) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.SIZE_MUST_BE_D_OR_S, 0, "a positive value"); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.SIZE_MUST_BE_D_OR_S, 0, "a positive value"); } return PythonContext.get(inliningTarget).getAndSetPythonsThreadStackSize(stackSize); } } - @Builtin(name = "start_new_thread", minNumOfPositionalArgs = 3, maxNumOfPositionalArgs = 4, constructsClass = PythonBuiltinClassType.PThread) - @Builtin(name = "start_new", minNumOfPositionalArgs = 3, maxNumOfPositionalArgs = 4) + @Builtin(name = "start_new_thread", minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 3) + @Builtin(name = "start_new", minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 3) @GenerateNodeFactory - abstract static class StartNewThreadNode extends PythonBuiltinNode { + abstract static class StartNewThreadNode extends PythonTernaryBuiltinNode { private static final TruffleString IN_THREAD_STARTED_BY = tsLiteral("in thread started by"); @Specialization @SuppressWarnings("try") - long start(VirtualFrame frame, Object cls, Object callable, Object args, Object kwargs, + static long start(VirtualFrame frame, Object callable, Object args, Object kwargs, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached CallNode callNode, @Cached ExecutePositionalStarargsNode getArgsNode, - @Cached ExpandKeywordStarargsNode getKwArgsNode, - @Cached PythonObjectFactory factory) { - PythonContext context = getContext(); + @Cached ExpandKeywordStarargsNode getKwArgsNode) { TruffleLanguage.Env env = context.getEnv(); PythonModule threadModule = context.lookupBuiltinModule(T__THREAD); @@ -252,9 +222,14 @@ long start(VirtualFrame frame, Object cls, Object callable, Object args, Object } }).context(env.getContext()).threadGroup(context.getThreadGroup()); - PThread pThread = factory.createPythonThread(cls, threadBuilder.build()); - pThread.start(); - return pThread.getId(); + Thread thread = threadBuilder.build(); + startThread(thread); + return thread.getId(); + } + + @TruffleBoundary + private static void startThread(Thread thread) { + thread.start(); } } @@ -264,8 +239,9 @@ abstract static class SetSentinelNode extends PythonBuiltinNode { @Specialization @TruffleBoundary Object setSentinel() { - PLock sentinelLock = PythonObjectFactory.getUncached().createLock(); - PythonContext.get(this).setSentinelLockWeakref(new WeakReference<>(sentinelLock)); + PythonContext context = PythonContext.get(null); + PLock sentinelLock = PFactory.createLock(context.getLanguage()); + context.setSentinelLockWeakref(new WeakReference<>(sentinelLock)); return sentinelLock; } } @@ -298,8 +274,8 @@ protected ArgumentClinicProvider getArgumentClinic() { abstract static class ExitThreadNode extends PythonBuiltinNode { @Specialization static Object exit( - @Cached PRaiseNode raiseNode) { - throw raiseNode.raiseSystemExit(PNone.NONE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseSystemExitStatic(inliningTarget, PNone.NONE); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/TimeModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/TimeModuleBuiltins.java index 49e2f83b07..3f9b4a15d2 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/TimeModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/TimeModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -49,8 +49,7 @@ import java.util.List; import java.util.TimeZone; -import org.graalvm.nativeimage.ImageInfo; - +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; @@ -85,15 +84,17 @@ import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; +import com.oracle.graal.python.nodes.statement.AbstractImportNode; +import com.oracle.graal.python.nodes.truffle.PythonIntegerAndFloatTypes; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaDoubleNode; import com.oracle.graal.python.runtime.GilNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonImageBuildOptions; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.TruffleOptions; import com.oracle.truffle.api.TruffleSafepoint; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -120,15 +121,6 @@ public final class TimeModuleBuiltins extends PythonBuiltins { private static final StructSequence.BuiltinTypeDescriptor STRUCT_TIME_DESC = new StructSequence.BuiltinTypeDescriptor( PythonBuiltinClassType.PStructTime, - // @formatter:off The formatter joins these lines making it less readable - "The time value as returned by gmtime(), localtime(), and strptime(), and\n" + - " accepted by asctime(), mktime() and strftime(). May be considered as a\n" + - " sequence of 9 integers.\n\n" + - " Note that several fields' values are not the same as those defined by\n" + - " the C language standard for struct tm. For example, the value of the\n" + - " field tm_year is the actual year, not year - 1900. See individual\n" + - " fields' descriptions for details.", - // @formatter:on 9, new String[]{ "tm_year", "tm_mon", "tm_mday", "tm_hour", "tm_min", "tm_sec", @@ -153,6 +145,7 @@ public final class TimeModuleBuiltins extends PythonBuiltins { public static final TruffleString T_DAYLIGHT = tsLiteral("daylight"); public static final TruffleString T_TIMEZONE = tsLiteral("timezone"); public static final TruffleString T_ALTZONE = tsLiteral("altzone"); + public static final TruffleString T_POLYGLOT_TIME = tsLiteral("_polyglot_time"); @Override protected List> getNodeFactories() { @@ -183,15 +176,18 @@ public void postInitialize(Python3Core core) { boolean hasDaylightSaving = !noDaylightSavingZone.equalsUncached(daylightSavingZone, TS_ENCODING); if (hasDaylightSaving) { - timeModule.setAttribute(T_TZNAME, core.factory().createTuple(new Object[]{noDaylightSavingZone, daylightSavingZone})); + timeModule.setAttribute(T_TZNAME, PFactory.createTuple(core.getLanguage(), new Object[]{noDaylightSavingZone, daylightSavingZone})); } else { - timeModule.setAttribute(T_TZNAME, core.factory().createTuple(new Object[]{noDaylightSavingZone})); + timeModule.setAttribute(T_TZNAME, PFactory.createTuple(core.getLanguage(), new Object[]{noDaylightSavingZone})); } timeModule.setAttribute(T_DAYLIGHT, PInt.intValue(hasDaylightSaving)); int rawOffsetSeconds = defaultTimeZone.getRawOffset() / -1000; timeModule.setAttribute(T_TIMEZONE, rawOffsetSeconds); timeModule.setAttribute(T_ALTZONE, rawOffsetSeconds - 3600); + + // register_interop_behavior() for time.struct_time + AbstractImportNode.importModule(T_POLYGLOT_TIME); } @TruffleBoundary @@ -265,21 +261,21 @@ static long doNone(VirtualFrame frame, Node inliningTarget, PNone none) { @Specialization static long doLong(Node inliningTarget, long t, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { check(inliningTarget, t, raiseNode); return t; } @Specialization static long doDouble(Node inliningTarget, double t, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { check(inliningTarget, t, raiseNode); return (long) t; } @Specialization(guards = "!isPNone(obj)") static long doObject(VirtualFrame frame, Node inliningTarget, Object obj, - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Cached CastToJavaDoubleNode castToDouble, @Cached PyLongAsLongNode asLongNode) { long t; @@ -296,9 +292,9 @@ private static boolean isValidTime(double t) { return t >= MIN_TIME && t <= MAX_TIME; } - private static void check(Node inliningTarget, double time, PRaiseNode.Lazy raiseNode) { + private static void check(Node inliningTarget, double time, PRaiseNode raiseNode) { if (!isValidTime(time)) { - throw raiseNode.get(inliningTarget).raise(OverflowError, TIMESTAMP_OUT_OF_RANGE); + throw raiseNode.raise(inliningTarget, OverflowError, TIMESTAMP_OUT_OF_RANGE); } } } @@ -306,15 +302,14 @@ private static void check(Node inliningTarget, double time, PRaiseNode.Lazy rais // time.gmtime([seconds]) @Builtin(name = "gmtime", maxNumOfPositionalArgs = 1) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) public abstract static class PythonGMTimeNode extends PythonBuiltinNode { @Specialization static PTuple gmtime(VirtualFrame frame, Object seconds, @Bind("this") Node inliningTarget, @Cached ToLongTime toLongTime, - @Cached PythonObjectFactory factory) { - return factory.createStructSeq(STRUCT_TIME_DESC, getTimeStruct(GMT, toLongTime.execute(frame, inliningTarget, seconds))); + @Bind PythonLanguage language) { + return PFactory.createStructSeq(language, STRUCT_TIME_DESC, getTimeStruct(GMT, toLongTime.execute(frame, inliningTarget, seconds))); } } @@ -333,7 +328,7 @@ Object tzset() { } TimeZone.setDefault(TimeZone.getTimeZone(tzEnv)); } else { - PRaiseNode.raiseUncached(this, PythonBuiltinClassType.AttributeError, SET_TIMEZONE_ERROR); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.AttributeError, SET_TIMEZONE_ERROR); } return PNone.NONE; } @@ -342,16 +337,15 @@ Object tzset() { // time.localtime([seconds]) @Builtin(name = "localtime", maxNumOfPositionalArgs = 2, declaresExplicitSelf = true) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) public abstract static class PythonLocalTimeNode extends PythonBinaryBuiltinNode { @Specialization static PTuple localtime(VirtualFrame frame, PythonModule module, Object seconds, @Bind("this") Node inliningTarget, @Cached ToLongTime toLongTime, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { ModuleState moduleState = module.getModuleState(ModuleState.class); - return factory.createStructSeq(STRUCT_TIME_DESC, getTimeStruct(moduleState.currentZoneId, toLongTime.execute(frame, inliningTarget, seconds))); + return PFactory.createStructSeq(language, STRUCT_TIME_DESC, getTimeStruct(moduleState.currentZoneId, toLongTime.execute(frame, inliningTarget, seconds))); } } @@ -446,7 +440,6 @@ public long counter() { @Builtin(name = "process_time", minNumOfPositionalArgs = 1, declaresExplicitSelf = true) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class ProcessTimeNode extends PythonBuiltinNode { @Specialization @TruffleBoundary @@ -458,7 +451,6 @@ Object getProcesTime(PythonModule self) { @Builtin(name = "process_time_ns", minNumOfPositionalArgs = 1, declaresExplicitSelf = true) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class ProcessTimeNsNode extends PythonBuiltinNode { @Specialization @TruffleBoundary @@ -470,29 +462,27 @@ Object getProcesNsTime(PythonModule self) { @Builtin(name = "thread_time") @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class ThreadTimeNode extends PythonBuiltinNode { @Specialization @TruffleBoundary Object getProcesTime() { - return !ImageInfo.inImageCode() ? (ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime()) / 1000_000_000.0 : 0; + return !TruffleOptions.AOT ? (ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime()) / 1000_000_000.0 : 0; } } @Builtin(name = "thread_time_ns") @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class ThreadTimeNsNode extends PythonBuiltinNode { @Specialization @TruffleBoundary Object getProcesNsTime() { - return !ImageInfo.inImageCode() ? ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime() : 0; + return !TruffleOptions.AOT ? ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime() : 0; } } @Builtin(name = "sleep", minNumOfPositionalArgs = 2, declaresExplicitSelf = true) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerAndFloatTypes.class) abstract static class SleepNode extends PythonBuiltinNode { // see: https://github.com/python/cpython/blob/master/Modules/timemodule.c#L1741 @@ -511,15 +501,14 @@ Object sleep(PythonModule self, long seconds, ModuleState moduleState = self.getModuleState(ModuleState.class); moduleState.timeSlept = nanoTime() - t + moduleState.timeSlept; } - PythonContext.triggerAsyncActions(this); return PNone.NONE; } @SuppressWarnings("unused") @Specialization(guards = "!isPositive(seconds)") static Object err(PythonModule self, long seconds, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, MUST_BE_NON_NEGATIVE, "sleep length"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, MUST_BE_NON_NEGATIVE, "sleep length"); } @Specialization(guards = "isPositive(seconds)") @@ -542,8 +531,8 @@ Object sleep(PythonModule self, double seconds, @SuppressWarnings("unused") @Specialization(guards = "!isPositive(seconds)") static Object err(PythonModule self, double seconds, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, MUST_BE_NON_NEGATIVE, "sleep length"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, MUST_BE_NON_NEGATIVE, "sleep length"); } @Specialization(guards = "!isInteger(secondsObj)") @@ -581,8 +570,8 @@ private static void doSleep(Node node, double seconds, double deadline) { try { Thread.sleep(millis, nanos); } catch (InterruptedException ignored) { + // Truffle would otherwise execute the action again after interrupt Thread.currentThread().interrupt(); - return; } }, secs); secs = deadline - timeSeconds(); @@ -625,10 +614,10 @@ private static String timeFormat(int[] date) { protected static int[] checkStructtime(VirtualFrame frame, Node inliningTarget, PTuple time, SequenceStorageNodes.GetInternalObjectArrayNode getInternalObjectArrayNode, PyNumberAsSizeNode asSizeNode, - PRaiseNode.Lazy raiseNode) { + PRaiseNode raiseNode) { Object[] otime = getInternalObjectArrayNode.execute(inliningTarget, time.getSequenceStorage()); if (time.getSequenceStorage().length() != 9) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_ILLEGAL_TIME_TUPLE_ARG, "asctime()"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_ILLEGAL_TIME_TUPLE_ARG, "asctime()"); } int[] date = new int[9]; for (int i = 0; i < 9; i++) { @@ -637,37 +626,37 @@ protected static int[] checkStructtime(VirtualFrame frame, Node inliningTarget, // This is specific to java if (date[TM_YEAR] < Year.MIN_VALUE || date[TM_YEAR] > Year.MAX_VALUE) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.YEAR_OUT_OF_RANGE); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.YEAR_OUT_OF_RANGE); } if (date[TM_MON] == 0) { date[TM_MON] = 1; } else if (date[TM_MON] < 0 || date[TM_MON] > 12) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MONTH_OUT_OF_RANGE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MONTH_OUT_OF_RANGE); } if (date[TM_MDAY] == 0) { date[TM_MDAY] = 1; } else if (date[TM_MDAY] < 0 || date[TM_MDAY] > 31) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.DAY_OF_MONTH_OUT_OF_RANGE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.DAY_OF_MONTH_OUT_OF_RANGE); } if (date[TM_HOUR] < 0 || date[TM_HOUR] > 23) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.HOUR_OUT_OF_RANGE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.HOUR_OUT_OF_RANGE); } if (date[TM_MIN] < 0 || date[TM_MIN] > 59) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MINUTE_OUT_OF_RANGE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MINUTE_OUT_OF_RANGE); } if (date[TM_SEC] < 0 || date[TM_SEC] > 61) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.SECONDS_OUT_OF_RANGE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.SECONDS_OUT_OF_RANGE); } if (date[TM_WDAY] == -1) { date[TM_WDAY] = 6; } else if (date[TM_WDAY] < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.DAY_OF_WEEK_OUT_OF_RANGE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.DAY_OF_WEEK_OUT_OF_RANGE); } else if (date[TM_WDAY] > 6) { date[TM_WDAY] = date[TM_WDAY] % 7; } @@ -675,7 +664,7 @@ protected static int[] checkStructtime(VirtualFrame frame, Node inliningTarget, if (date[TM_YDAY] == 0) { date[TM_YDAY] = 1; } else if (date[TM_YDAY] < 0 || date[TM_YDAY] > 366) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.DAY_OF_YEAR_OUT_OF_RANGE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.DAY_OF_YEAR_OUT_OF_RANGE); } if (date[TM_ISDST] < -1) { @@ -940,9 +929,9 @@ static TruffleString formatTime(PythonModule module, TruffleString format, @Supp @Shared("byteIndexOfCp") @Cached TruffleString.ByteIndexOfCodePointNode byteIndexOfCodePointNode, @Shared("ts2js") @Cached TruffleString.ToJavaStringNode toJavaStringNode, @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (byteIndexOfCodePointNode.execute(format, 0, 0, format.byteLength(TS_ENCODING), TS_ENCODING) >= 0) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.EMBEDDED_NULL_CHARACTER); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.EMBEDDED_NULL_CHARACTER); } ModuleState moduleState = module.getModuleState(ModuleState.class); return format(toJavaStringNode.execute(format), getIntLocalTimeStruct(moduleState.currentZoneId, (long) timeSeconds()), fromJavaStringNode); @@ -956,9 +945,9 @@ static TruffleString formatTime(VirtualFrame frame, @SuppressWarnings("unused") @Shared("byteIndexOfCp") @Cached TruffleString.ByteIndexOfCodePointNode byteIndexOfCodePointNode, @Shared("ts2js") @Cached TruffleString.ToJavaStringNode toJavaStringNode, @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (byteIndexOfCodePointNode.execute(format, 0, 0, format.byteLength(TS_ENCODING), TS_ENCODING) >= 0) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.EMBEDDED_NULL_CHARACTER); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.EMBEDDED_NULL_CHARACTER); } int[] date = checkStructtime(frame, inliningTarget, time, getArray, asSizeNode, raiseNode); return format(toJavaStringNode.execute(format), date, fromJavaStringNode); @@ -967,8 +956,8 @@ static TruffleString formatTime(VirtualFrame frame, @SuppressWarnings("unused") @Specialization @SuppressWarnings("unused") static TruffleString formatTime(PythonModule module, TruffleString format, Object time, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.TUPLE_OR_STRUCT_TIME_ARG_REQUIRED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.TUPLE_OR_STRUCT_TIME_ARG_REQUIRED); } } @@ -987,10 +976,10 @@ static double mktime(VirtualFrame frame, PythonModule module, PTuple tuple, @Bind("this") Node inliningTarget, @Cached PyNumberAsSizeNode asSizeNode, @Cached GetObjectArrayNode getObjectArrayNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object[] items = getObjectArrayNode.execute(inliningTarget, tuple); if (items.length != ELEMENT_COUNT) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.FUNC_TAKES_EXACTLY_D_ARGS, ELEMENT_COUNT, items.length); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.FUNC_TAKES_EXACTLY_D_ARGS, ELEMENT_COUNT, items.length); } int[] integers = new int[ELEMENT_COUNT]; for (int i = 0; i < ELEMENT_COUNT; i++) { @@ -1053,15 +1042,15 @@ static TruffleString localtime(VirtualFrame frame, @SuppressWarnings("unused") P @Cached SequenceStorageNodes.GetInternalObjectArrayNode getArray, @Cached PyNumberAsSizeNode asSizeNode, @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { return format(StrfTimeNode.checkStructtime(frame, inliningTarget, time, getArray, asSizeNode, raiseNode), fromJavaStringNode); } @Fallback @SuppressWarnings("unused") static Object localtime(Object module, Object time, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.TUPLE_OR_STRUCT_TIME_ARG_REQUIRED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.TUPLE_OR_STRUCT_TIME_ARG_REQUIRED); } protected static TruffleString format(int[] tm, TruffleString.FromJavaStringNode fromJavaStringNode) { @@ -1109,8 +1098,8 @@ static Object getClockInfo(TruffleString name, @Bind("this") Node inliningTarget, @Cached WriteAttributeToPythonObjectNode writeAttrNode, @Cached TruffleString.EqualNode equalNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { final boolean adjustable; final boolean monotonic; @@ -1122,10 +1111,10 @@ static Object getClockInfo(TruffleString name, adjustable = true; monotonic = false; } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, UNKNOWN_CLOCK); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, UNKNOWN_CLOCK); } - final PSimpleNamespace ns = factory.createSimpleNamespace(); + final PSimpleNamespace ns = PFactory.createSimpleNamespace(language); writeAttrNode.execute(ns, T_ADJUSTABLE, adjustable); writeAttrNode.execute(ns, T_IMPLEMENTATION, name); writeAttrNode.execute(ns, T_MONOTONIC, monotonic); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/TokenizeModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/TokenizeModuleBuiltins.java index 5edfab4e64..8f9919ff71 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/TokenizeModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/TokenizeModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,49 +40,20 @@ */ package com.oracle.graal.python.builtins.modules; +import java.util.Collections; import java.util.List; -import com.oracle.graal.python.annotations.ArgumentClinic; -import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; -import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.modules.TokenizeModuleBuiltinsClinicProviders.TokenizerIterNodeClinicProviderGen; -import com.oracle.graal.python.builtins.objects.tokenize.PTokenizerIter; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.strings.TruffleString; @CoreFunctions(defineModule = "_tokenize", isEager = true) public final class TokenizeModuleBuiltins extends PythonBuiltins { @Override protected List> getNodeFactories() { - return TokenizeModuleBuiltinsFactory.getFactories(); + return Collections.emptyList(); } - @Builtin(name = "TokenizerIter", minNumOfPositionalArgs = 2, parameterNames = {"$cls", "source"}, constructsClass = PythonBuiltinClassType.PTokenizerIter) - @ArgumentClinic(name = "source", conversion = ClinicConversion.TString) - @GenerateNodeFactory - abstract static class TokenizerIterNode extends PythonBinaryClinicBuiltinNode { - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return TokenizerIterNodeClinicProviderGen.INSTANCE; - } - - @Specialization - static PTokenizerIter tokenizerIter(Object cls, TruffleString source, - @Cached TruffleString.ToJavaStringNode toJavaStringNode, - @Cached PythonObjectFactory factory) { - return factory.createTokenizerIter(cls, toJavaStringNode.execute(source)); - } - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/TracemallocModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/TracemallocModuleBuiltins.java index 7ba1ed0fbc..ae552073fa 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/TracemallocModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/TracemallocModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -52,10 +52,11 @@ import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; -import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; @CoreFunctions(defineModule = J__TRACEMALLOC) public final class TracemallocModuleBuiltins extends PythonBuiltins { @@ -75,8 +76,8 @@ public void initialize(Python3Core core) { abstract static class GetObjectTracebackNode extends PythonBuiltinNode { @Specialization static Object getObjectTraceback(Object obj, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.NotImplementedError); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.NotImplementedError); } } @@ -85,8 +86,8 @@ static Object getObjectTraceback(Object obj, abstract static class GetTracesNode extends PythonBuiltinNode { @Specialization static Object getTraces( - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.NotImplementedError); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.NotImplementedError); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/UnicodeDataModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/UnicodeDataModuleBuiltins.java index b99c52573e..b7266e6953 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/UnicodeDataModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/UnicodeDataModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,14 +40,19 @@ */ package com.oracle.graal.python.builtins.modules; +import static com.oracle.graal.python.nodes.BuiltinNames.J_UNICODEDATA; +import static com.oracle.graal.python.nodes.BuiltinNames.T_UNICODEDATA; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; +import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; -import java.text.Normalizer; import java.util.List; +import com.oracle.graal.python.builtins.objects.module.PythonModule; import org.graalvm.shadowed.com.ibm.icu.lang.UCharacter; import org.graalvm.shadowed.com.ibm.icu.lang.UProperty; +import org.graalvm.shadowed.com.ibm.icu.text.Normalizer2; +import org.graalvm.shadowed.com.ibm.icu.util.VersionInfo; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; @@ -64,104 +69,27 @@ import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; -@CoreFunctions(defineModule = "unicodedata") +@CoreFunctions(defineModule = J_UNICODEDATA, isEager = true) public final class UnicodeDataModuleBuiltins extends PythonBuiltins { @Override protected List> getNodeFactories() { return UnicodeDataModuleBuiltinsFactory.getFactories(); } - public static String getUnicodeVersion() { - - // Preliminary Unicode 11 data obtained from - // . - if (Character.getType('\u0560') != Character.UNASSIGNED) { - return "11.0.0"; // 11.0, June 2018. - } - - if (Character.getType('\u0860') != Character.UNASSIGNED) { - return "10.0.0"; // 10.0, June 2017. - } - - if (Character.getType('\u08b6') != Character.UNASSIGNED) { - return "9.0.0"; // 9.0, June 2016. - } - - if (Character.getType('\u08b3') != Character.UNASSIGNED) { - return "8.0.0"; // 8.0, June 2015. - } - - if (Character.getType('\u037f') != Character.UNASSIGNED) { - return "7.0.0"; // 7.0, June 2014. - } - - if (Character.getType('\u061c') != Character.UNASSIGNED) { - return "6.3.0"; // 6.3, September 2013. - } - - if (Character.getType('\u20ba') != Character.UNASSIGNED) { - return "6.2.0"; // 6.2, September 2012. - } - - if (Character.getType('\u058f') != Character.UNASSIGNED) { - return "6.1.0"; // 6.1, January 2012. - } - - if (Character.getType('\u0526') != Character.UNASSIGNED) { - return "6.0.0"; // 6.0, October 2010. - } - - if (Character.getType('\u0524') != Character.UNASSIGNED) { - return "5.2.0"; // 5.2, October 2009. - } - - if (Character.getType('\u0370') != Character.UNASSIGNED) { - return "5.1.0"; // 5.1, March 2008. - } - - if (Character.getType('\u0242') != Character.UNASSIGNED) { - return "5.0.0"; // 5.0, July 2006. - } - - if (Character.getType('\u0237') != Character.UNASSIGNED) { - return "4.1.0"; // 4.1, March 2005. - } - - if (Character.getType('\u0221') != Character.UNASSIGNED) { - return "4.0.0"; // 4.0, April 2003. - } - - if (Character.getType('\u0220') != Character.UNASSIGNED) { - return "3.2.0"; // 3.2, March 2002. - } - - if (Character.getType('\u03f4') != Character.UNASSIGNED) { - return "3.1.0"; // 3.1, March 2001. - } - - if (Character.getType('\u01f6') != Character.UNASSIGNED) { - return "3.0.0"; // 3.0, September 1999. - } - - if (Character.getType('\u20ac') != Character.UNASSIGNED) { - return "2.1.0"; // 2.1, May 1998. - } - - if (Character.getType('\u0591') != Character.UNASSIGNED) { - return "2.0.0"; // 2.0, July 1996. - } - - if (Character.getType('\u0000') != Character.UNASSIGNED) { - return "1.1.0"; // 1.1, June 1993. - } - - return "1.0.0"; // 1.0 + // Must not be used at image build time because ICU is --initialize-at-run-time + private static String getUnicodeVersion() { + VersionInfo version = UCharacter.getUnicodeVersion(); + return Integer.toString(version.getMajor()) + '.' + + version.getMinor() + '.' + + version.getMicro(); } /** @@ -181,9 +109,23 @@ private static String getUnicodeNameTB(int cp) { } @Override - public void initialize(Python3Core core) { - super.initialize(core); - addBuiltinConstant("unidata_version", getUnicodeVersion()); + public void postInitialize(Python3Core core) { + super.postInitialize(core); + PythonModule self = core.lookupBuiltinModule(T_UNICODEDATA); + self.setAttribute(toTruffleStringUncached("unidata_version"), toTruffleStringUncached(getUnicodeVersion())); + } + + static final int NORMALIZER_FORM_COUNT = 4; + + @TruffleBoundary + static Normalizer2 getNormalizer(TruffleString form) { + return switch (form.toJavaStringUncached()) { + case "NFC" -> Normalizer2.getNFCInstance(); + case "NFKC" -> Normalizer2.getNFKCInstance(); + case "NFD" -> Normalizer2.getNFDInstance(); + case "NFKD" -> Normalizer2.getNFKDInstance(); + default -> null; + }; } // unicodedata.normalize(form, unistr) @@ -191,34 +133,26 @@ public void initialize(Python3Core core) { @ArgumentClinic(name = "form", conversion = ArgumentClinic.ClinicConversion.TString) @ArgumentClinic(name = "unistr", conversion = ArgumentClinic.ClinicConversion.TString) @GenerateNodeFactory + @ImportStatic(UnicodeDataModuleBuiltins.class) public abstract static class NormalizeNode extends PythonBinaryClinicBuiltinNode { - @TruffleBoundary - protected Normalizer.Form getForm(TruffleString form) { - try { - return Normalizer.Form.valueOf(form.toJavaStringUncached()); - } catch (IllegalArgumentException e) { - return null; - } - } - - @Specialization(guards = {"stringEquals(form, cachedForm, equalNode)"}, limit = "4") + @Specialization(guards = {"cachedNormalizer != null", "stringEquals(form, cachedForm, equalNode)"}, limit = "NORMALIZER_FORM_COUNT") static TruffleString normalize(@SuppressWarnings("unused") TruffleString form, TruffleString unistr, - @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Cached("form") TruffleString cachedForm, - @Cached("getForm(cachedForm)") Normalizer.Form cachedNormForm, + @Cached("getNormalizer(cachedForm)") Normalizer2 cachedNormalizer, @SuppressWarnings("unused") @Cached TruffleString.EqualNode equalNode, @Cached TruffleString.ToJavaStringNode toJavaStringNode, - @Cached TruffleString.FromJavaStringNode fromJavaStringNode, - @Cached PRaiseNode.Lazy raiseNode) { - if (cachedNormForm == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.INVALID_NORMALIZATION_FORM); - } - return fromJavaStringNode.execute(normalize(toJavaStringNode.execute(unistr), cachedNormForm), TS_ENCODING); + @Exclusive @Cached TruffleString.FromJavaStringNode fromJavaStringNode) { + return fromJavaStringNode.execute(normalize(toJavaStringNode.execute(unistr), cachedNormalizer), TS_ENCODING); + } + + @Specialization(guards = "getNormalizer(form) == null") + TruffleString invalidForm(@SuppressWarnings("unused") TruffleString form, @SuppressWarnings("unused") TruffleString unistr) { + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.INVALID_NORMALIZATION_FORM); } @TruffleBoundary - private static String normalize(String str, Normalizer.Form normForm) { - return Normalizer.normalize(str, normForm); + private static String normalize(String str, Normalizer2 normalizer) { + return normalizer.normalize(str); } @Override @@ -232,26 +166,20 @@ protected ArgumentClinicProvider getArgumentClinic() { @ArgumentClinic(name = "form", conversion = ArgumentClinic.ClinicConversion.TString) @ArgumentClinic(name = "unistr", conversion = ArgumentClinic.ClinicConversion.TString) @GenerateNodeFactory + @ImportStatic(UnicodeDataModuleBuiltins.class) public abstract static class IsNormalizedNode extends PythonBinaryClinicBuiltinNode { - @TruffleBoundary - protected Normalizer.Form getForm(TruffleString form) { - try { - return Normalizer.Form.valueOf(form.toJavaStringUncached()); - } catch (IllegalArgumentException e) { - return null; - } - } - - @Specialization(guards = {"stringEquals(form, cachedForm, equalNode)"}, limit = "4") + @Specialization(guards = {"cachedNormalizer != null", "stringEquals(form, cachedForm, equalNode)"}, limit = "NORMALIZER_FORM_COUNT") @TruffleBoundary boolean isNormalized(@SuppressWarnings("unused") TruffleString form, TruffleString unistr, @SuppressWarnings("unused") @Cached("form") TruffleString cachedForm, - @Cached("getForm(cachedForm)") Normalizer.Form cachedNormForm, + @Cached("getNormalizer(cachedForm)") Normalizer2 cachedNormalizer, @SuppressWarnings("unused") @Cached TruffleString.EqualNode equalNode) { - if (cachedNormForm == null) { - throw PRaiseNode.raiseUncached(this, ValueError, ErrorMessages.INVALID_NORMALIZATION_FORM); - } - return Normalizer.isNormalized(unistr.toJavaStringUncached(), cachedNormForm); + return cachedNormalizer.isNormalized(unistr.toJavaStringUncached()); + } + + @Specialization(guards = "getNormalizer(form) == null") + TruffleString invalidForm(@SuppressWarnings("unused") TruffleString form, @SuppressWarnings("unused") TruffleString unistr) { + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.INVALID_NORMALIZATION_FORM); } @Override @@ -270,11 +198,11 @@ public abstract static class NameNode extends PythonBinaryClinicBuiltinNode { static Object name(int cp, Object defaultValue, @Bind("this") Node inliningTarget, @Cached TruffleString.FromJavaStringNode fromJavaStringNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { String result = getUnicodeName(cp); if (result == null) { if (defaultValue == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.NO_SUCH_NAME); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NO_SUCH_NAME); } return defaultValue; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/WarningsModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/WarningsModuleBuiltins.java index 7896f58fdf..24a4dff276 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/WarningsModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/WarningsModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -96,7 +96,7 @@ import com.oracle.graal.python.lib.PyObjectIsTrueNode; import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode; -import com.oracle.graal.python.lib.PyObjectRichCompareBool; +import com.oracle.graal.python.lib.PyObjectRichCompareBool.CachedPyObjectRichCompareBool; import com.oracle.graal.python.lib.PyObjectSetItem; import com.oracle.graal.python.lib.PyObjectStrAsObjectNode; import com.oracle.graal.python.nodes.ErrorMessages; @@ -122,8 +122,7 @@ import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.formatting.ErrorMessageFormatter; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.runtime.object.PythonObjectSlowPathFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; @@ -176,9 +175,9 @@ public void initialize(Python3Core core) { // we need to copy the attrs, since they must still be available even if the user `del`s the // attrs addBuiltinConstant("_defaultaction", T_DEFAULT); - PDict onceregistry = core.factory().createDict(); + PDict onceregistry = PFactory.createDict(core.getLanguage()); addBuiltinConstant("_onceregistry", onceregistry); - PList filters = initFilters(core.factory()); + PList filters = initFilters(core.getLanguage()); addBuiltinConstant("filters", filters); ModuleState moduleState = new ModuleState(); moduleState.filtersVersion = 0L; @@ -189,28 +188,26 @@ public void initialize(Python3Core core) { super.initialize(core); } - private static PTuple createFilter(PythonObjectSlowPathFactory factory, PythonBuiltinClassType cat, TruffleString id, Object mod) { - return factory.createTuple(new Object[]{id, PNone.NONE, cat, mod, 0}); + private static PTuple createFilter(PythonLanguage language, PythonBuiltinClassType cat, TruffleString id, Object mod) { + return PFactory.createTuple(language, new Object[]{id, PNone.NONE, cat, mod, 0}); } // init_filters - private static PList initFilters(PythonObjectSlowPathFactory factory) { - return factory.createList(new Object[]{ - createFilter(factory, PythonBuiltinClassType.DeprecationWarning, T_DEFAULT, T___MAIN__), - createFilter(factory, PythonBuiltinClassType.DeprecationWarning, T_IGNORE, PNone.NONE), - createFilter(factory, PythonBuiltinClassType.PendingDeprecationWarning, T_IGNORE, PNone.NONE), - createFilter(factory, PythonBuiltinClassType.ImportWarning, T_IGNORE, PNone.NONE), - createFilter(factory, PythonBuiltinClassType.ResourceWarning, T_IGNORE, PNone.NONE)}); + private static PList initFilters(PythonLanguage language) { + return PFactory.createList(language, new Object[]{ + createFilter(language, PythonBuiltinClassType.DeprecationWarning, T_DEFAULT, T___MAIN__), + createFilter(language, PythonBuiltinClassType.DeprecationWarning, T_IGNORE, PNone.NONE), + createFilter(language, PythonBuiltinClassType.PendingDeprecationWarning, T_IGNORE, PNone.NONE), + createFilter(language, PythonBuiltinClassType.ImportWarning, T_IGNORE, PNone.NONE), + createFilter(language, PythonBuiltinClassType.ResourceWarning, T_IGNORE, PNone.NONE)}); } static final class WarningsModuleNode extends Node { @Child CastToTruffleStringNode castStr; - @Child PRaiseNode raiseNode; - @Child PyObjectRichCompareBool.EqNode eqNode; + @Child CachedPyObjectRichCompareBool eqNode; @Child GetClassNode getClassNode; @Child PyNumberAsSizeNode asSizeNode; @Child PyObjectIsTrueNode isTrueNode; - @Child PythonObjectFactory factory; @Child IsSubClassNode isSubClassNode; @Child GetOrCreateDictNode getDictNode; @Child GetDictFromGlobalsNode getDictFromGlobalsNode; @@ -237,18 +234,14 @@ private static Object tryImport() { return AbstractImportNode.importModule(T_WARNINGS); } - private PythonLanguage getLanguage() { - return PythonLanguage.get(this); - } - private PythonContext getContext() { return PythonContext.get(this); } - private PyObjectRichCompareBool.EqNode getEqNode() { + private CachedPyObjectRichCompareBool getEqNode() { if (eqNode == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); - eqNode = insert(PyObjectRichCompareBool.EqNode.create()); + eqNode = insert(CachedPyObjectRichCompareBool.create()); } return eqNode; } @@ -382,24 +375,6 @@ private TruffleString.SubstringNode getSubstringNode() { return substringNode; } - private PRaiseNode getRaise() { - if (raiseNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - reportPolymorphicSpecialize(); - raiseNode = insert(PRaiseNode.create()); - } - return raiseNode; - } - - private PythonObjectFactory getFactory() { - if (factory == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - reportPolymorphicSpecialize(); - factory = insert(PythonObjectFactory.create()); - } - return factory; - } - private IsSubClassNode getIsSubClass() { if (isSubClassNode == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); @@ -480,11 +455,11 @@ private boolean checkMatched(VirtualFrame frame, Object obj, Object arg) { return getEqualNode().execute(objStr, getCastStr().executeCached(arg), TS_ENCODING); } catch (CannotCastException e) { // Python calls PyUnicode_Compare directly, which raises this error - throw getRaise().raise(PythonBuiltinClassType.TypeError, ErrorMessages.CANT_COMPARE, obj, arg); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.TypeError, ErrorMessages.CANT_COMPARE, obj, arg); } } catch (CannotCastException e) { Object result = getCallMethodNode().executeCached(frame, obj, T_MATCH, arg); - return getIsTrueNode().executeCached(frame, result); + return getIsTrueNode().execute(frame, result); } } @@ -544,7 +519,7 @@ private static PDict getOnceRegistry(Node node, PythonContext context, PythonMod registry = getStateOnceRegistry(module); } if (!(registry instanceof PDict)) { - throw PRaiseNode.raiseUncached(node, PythonBuiltinClassType.TypeError, ErrorMessages.WARN_ONCE_REG_MUST_BE_DICT, registry); + throw PRaiseNode.raiseStatic(node, PythonBuiltinClassType.TypeError, ErrorMessages.WARN_ONCE_REG_MUST_BE_DICT, registry); } return (PDict) registry; } @@ -560,7 +535,7 @@ private TruffleString getDefaultAction(VirtualFrame frame, PythonModule module) try { return getCastStr().executeCached(defaultAction); } catch (CannotCastException e) { - throw getRaise().raise(PythonBuiltinClassType.TypeError, ErrorMessages.WARN_DEF_ACTION_MUST_BE_STRING, defaultAction); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.TypeError, ErrorMessages.WARN_DEF_ACTION_MUST_BE_STRING, defaultAction); } } @@ -575,18 +550,18 @@ private TruffleString getFilter(VirtualFrame frame, PythonModule _warnings, Obje filters = getStateFilters(_warnings); } if (!(filters instanceof PList)) { - throw getRaise().raise(PythonBuiltinClassType.ValueError, ErrorMessages.WARN_FILTERS_MUST_BE_LIST); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.ValueError, ErrorMessages.WARN_FILTERS_MUST_BE_LIST); } SequenceStorage filtersStorage = ((PList) filters).getSequenceStorage(); SequenceStorageNodes.GetItemScalarNode sequenceGetItem = getSequenceGetItemNode(); for (int i = 0; i < filtersStorage.length(); i++) { Object tmpItem = sequenceGetItem.executeCached(filtersStorage, i); if (!(tmpItem instanceof PTuple)) { - throw getRaise().raise(PythonBuiltinClassType.ValueError, ErrorMessages.WARN_FILTERS_IETM_ISNT_5TUPLE, i); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.ValueError, ErrorMessages.WARN_FILTERS_IETM_ISNT_5TUPLE, i); } SequenceStorage tmpStorage = ((PTuple) tmpItem).getSequenceStorage(); if (tmpStorage.length() != 5) { - throw getRaise().raise(PythonBuiltinClassType.ValueError, ErrorMessages.WARN_FILTERS_IETM_ISNT_5TUPLE, i); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.ValueError, ErrorMessages.WARN_FILTERS_IETM_ISNT_5TUPLE, i); } Object actionObj = sequenceGetItem.executeCached(tmpStorage, 0); @@ -596,7 +571,7 @@ private TruffleString getFilter(VirtualFrame frame, PythonModule _warnings, Obje } catch (CannotCastException e) { // CPython does this check after the other __getitem__ calls, but we know it's a // tuple so... - throw getRaise().raise(PythonBuiltinClassType.TypeError, ErrorMessages.ACTION_MUST_BE_STRING, actionObj); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.TypeError, ErrorMessages.ACTION_MUST_BE_STRING, actionObj); } Object msg = sequenceGetItem.executeCached(tmpStorage, 1); Object cat = sequenceGetItem.executeCached(tmpStorage, 2); @@ -634,24 +609,24 @@ private boolean alreadyWarnedShouldNotSet(VirtualFrame frame, PythonModule _warn * warnings will be printed. */ private static boolean alreadyWarnedShouldSet(PythonModule _warnings, PDict registry, Object key) { - return alreadyWarned(null, _warnings, registry, key, true, PyObjectRichCompareBool.EqNode.getUncached(), PyObjectCallMethodObjArgs.getUncached(), PyDictGetItem.getUncached(), + return alreadyWarned(null, _warnings, registry, key, true, CachedPyObjectRichCompareBool.getUncached(), PyObjectCallMethodObjArgs.getUncached(), PyDictGetItem.getUncached(), PyObjectSetItem.getUncached(), PyObjectIsTrueNode.getUncached()); } /** * Used on both fast and slow path. */ - private static boolean alreadyWarned(VirtualFrame frame, PythonModule _warnings, PDict registry, Object key, boolean shouldSet, PyObjectRichCompareBool.EqNode eqNode, + private static boolean alreadyWarned(VirtualFrame frame, PythonModule _warnings, PDict registry, Object key, boolean shouldSet, CachedPyObjectRichCompareBool eqNode, PyObjectCallMethodObjArgs callMethod, PyDictGetItem getItem, PyObjectSetItem setItem, PyObjectIsTrueNode isTrueNode) { Object versionObj = getItem.executeCached(frame, registry, T_VERSION); long stateFiltersVersion = getStateFiltersVersion(_warnings); - if (versionObj == null || !eqNode.compareCached(frame, stateFiltersVersion, versionObj)) { + if (versionObj == null || !eqNode.executeEq(frame, stateFiltersVersion, versionObj)) { callMethod.executeCached(frame, registry, T_CLEAR); setItem.executeCached(frame, registry, T_VERSION, stateFiltersVersion); } else { Object alreadyWarned = getItem.executeCached(frame, registry, key); if (alreadyWarned != null) { - return isTrueNode.executeCached(frame, alreadyWarned); + return isTrueNode.execute(frame, alreadyWarned); } } if (shouldSet) { @@ -679,12 +654,12 @@ private TruffleString normalizeModule(TruffleString filename) { } @TruffleBoundary - private static boolean updateRegistry(PythonObjectSlowPathFactory factory, PythonModule _warnings, PDict registry, Object text, Object category, boolean addZero) { + private static boolean updateRegistry(PythonLanguage language, PythonModule _warnings, PDict registry, Object text, Object category, boolean addZero) { PTuple altKey; if (addZero) { - altKey = factory.createTuple(new Object[]{text, category, 0}); + altKey = PFactory.createTuple(language, new Object[]{text, category, 0}); } else { - altKey = factory.createTuple(new Object[]{text, category}); + altKey = PFactory.createTuple(language, new Object[]{text, category}); } return alreadyWarnedShouldSet(_warnings, registry, altKey); } @@ -728,10 +703,8 @@ private static void showWarning(Object filename, int lineno, Object text, Object } @TruffleBoundary - private static void callShowWarning(PythonContext context, Object category, Object text, Object message, + private void callShowWarning(PythonContext context, Object category, Object text, Object message, TruffleString filename, int lineno, TruffleString sourceline, Object sourceIn) { - PRaiseNode raise = PRaiseNode.getUncached(); - Object showFn = getWarningsAttr(context, T__SHOWWARNMSG, sourceIn != null); if (showFn == null) { showWarning(filename, lineno, text, category, sourceline); @@ -739,12 +712,12 @@ private static void callShowWarning(PythonContext context, Object category, Obje } if (!PyCallableCheckNode.executeUncached(showFn)) { - throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.WARN_MUST_BE_SET_CALLABLE); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.TypeError, ErrorMessages.WARN_MUST_BE_SET_CALLABLE); } Object warnmsgCls = getWarningsAttr(context, T_WARNING_MESSAGE, false); if (warnmsgCls == null) { - throw raise.raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.UNABLE_GET_WARN_MSG); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.RuntimeError, ErrorMessages.UNABLE_GET_WARN_MSG); } Object source = sourceIn == null ? PNone.NONE : sourceIn; @@ -780,7 +753,7 @@ private void warnExplicit(VirtualFrame frame, PythonModule warnings, } else if (registryObj instanceof PDict) { registry = (PDict) registryObj; } else { - throw getRaise().raise(PythonBuiltinClassType.TypeError, ErrorMessages.REGISTRY_MUST_BE_DICT); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.TypeError, ErrorMessages.REGISTRY_MUST_BE_DICT); } if (module == null) { @@ -798,7 +771,7 @@ private void warnExplicit(VirtualFrame frame, PythonModule warnings, message = getCallNode().execute(frame, category, message); } - Object key = getFactory().createTuple(new Object[]{text, category, lineno}); + Object key = PFactory.createTuple(PythonLanguage.get(this), new Object[]{text, category, lineno}); if (registry != null) { if (alreadyWarnedShouldNotSet(frame, warnings, registry, key)) { return; @@ -817,24 +790,25 @@ private void warnExplicit(VirtualFrame frame, PythonModule warnings, // the rest of this function is behind a TruffleBoundary, since we don't care so much // about performance when warnings are enabled. - Object state = IndirectCallContext.enter(frame, getLanguage(), getContext(), indirectCallData); + PythonContext context = getContext(); + PythonLanguage language = context.getLanguage(this); + Object state = IndirectCallContext.enter(frame, language, context, indirectCallData); try { - warnExplicitPart2(PythonContext.get(this), this, warnings, filename, lineno, registry, globals, source, category, message, text, key, item[0], action); + warnExplicitPart2(context, warnings, filename, lineno, registry, globals, source, category, message, text, key, item[0], action); } finally { - IndirectCallContext.exit(frame, getLanguage(), getContext(), state); + IndirectCallContext.exit(frame, language, context, state); } } @TruffleBoundary - private static void warnExplicitPart2(PythonContext context, Node node, PythonModule warnings, TruffleString filename, int lineno, PDict registry, PDict globals, Object source, + private void warnExplicitPart2(PythonContext context, PythonModule warnings, TruffleString filename, int lineno, PDict registry, PDict globals, Object source, Object category, Object message, Object text, Object key, Object item, TruffleString action) { if (action.equalsUncached(T_ERROR, TS_ENCODING)) { if (!PyExceptionInstanceCheckNode.executeUncached(message)) { - throw PRaiseNode.raiseUncached(node, PythonBuiltinClassType.SystemError, ErrorMessages.EXCEPTION_NOT_BASEEXCEPTION, - PyObjectReprAsTruffleStringNode.executeUncached(message)); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.SystemError, ErrorMessages.EXCEPTION_NOT_BASEEXCEPTION, PyObjectReprAsTruffleStringNode.executeUncached(message)); } else { - throw PRaiseNode.raiseExceptionObject(node, message); + throw PRaiseNode.raiseExceptionObject(this, message); } } @@ -846,17 +820,17 @@ private static void warnExplicitPart2(PythonContext context, Node node, PythonMo boolean alreadyWarned = false; if (action.equalsUncached(T_ONCE, TS_ENCODING)) { if (registry == null) { - PDict currentRegistry = getOnceRegistry(node, context, warnings); - alreadyWarned = updateRegistry(context.factory(), warnings, currentRegistry, text, category, false); + PDict currentRegistry = getOnceRegistry(this, context, warnings); + alreadyWarned = updateRegistry(context.getLanguage(), warnings, currentRegistry, text, category, false); } else { - alreadyWarned = updateRegistry(context.factory(), warnings, registry, text, category, false); + alreadyWarned = updateRegistry(context.getLanguage(), warnings, registry, text, category, false); } } else if (action.equalsUncached(T_MODULE, TS_ENCODING)) { if (registry != null) { - alreadyWarned = updateRegistry(context.factory(), warnings, registry, text, category, false); + alreadyWarned = updateRegistry(context.getLanguage(), warnings, registry, text, category, false); } } else if (!action.equalsUncached(T_DEFAULT, TS_ENCODING)) { - throw PRaiseNode.raiseUncached(node, PythonBuiltinClassType.RuntimeError, ErrorMessages.UNRECOGNIZED_ACTION_IN_WARNINGS, action, + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.RuntimeError, ErrorMessages.UNRECOGNIZED_ACTION_IN_WARNINGS, action, PyObjectReprAsTruffleStringNode.executeUncached(item)); } @@ -869,7 +843,7 @@ private static void warnExplicitPart2(PythonContext context, Node node, PythonMo // to delay it TruffleString sourceline = null; if (globals != null) { - sourceline = getSourceLine(node, globals, lineno); + sourceline = getSourceLine(this, globals, lineno); } callShowWarning(context, category, text, message, filename, lineno, sourceline, source); @@ -900,7 +874,7 @@ private void setupContext(VirtualFrame frame, int stackLevel, TruffleString[] fi registry[0] = getDictGetItemNode().executeCached(frame, globals, T___WARNINGREGISTRY__); if (registry[0] == null) { - registry[0] = getFactory().createDict(); + registry[0] = PFactory.createDict(PythonLanguage.get(this)); getSetItemNode().executeCached(frame, globals, T___WARNINGREGISTRY__, registry[0]); } Object moduleObj = getDictGetItemNode().executeCached(frame, globals, SpecialAttributeNames.T___NAME__); @@ -925,7 +899,7 @@ private Object getCategory(VirtualFrame frame, Object message, Object category) } else if (category == null || category == PNone.NONE) { return PythonBuiltinClassType.UserWarning; } else if (!getIsTypeNode().executeCached(category) || !getIsSubClass().executeBoolean(frame, category, PythonBuiltinClassType.Warning)) { - throw getRaise().raise(PythonBuiltinClassType.TypeError, ErrorMessages.CATEGORY_MUST_BE_WARN_SUBCLS, category); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.TypeError, ErrorMessages.CATEGORY_MUST_BE_WARN_SUBCLS, category); } else { return category; } @@ -971,13 +945,13 @@ private static TruffleString getSourceLine(Node node, PDict globals, int lineno) try { src = CastToJavaStringNode.getUncached().execute(source); } catch (CannotCastException e) { - throw PRaiseNode.raiseUncached(node, PythonBuiltinClassType.TypeError, ErrorMessages.EXPECTED_S_NOT_P, "str", source); + throw PRaiseNode.raiseStatic(node, PythonBuiltinClassType.TypeError, ErrorMessages.EXPECTED_S_NOT_P, "str", source); } String[] lines = src.split("\n"); if (lines.length >= lineno) { return toTruffleStringUncached(lines[lineno - 1]); } else { - throw PRaiseNode.raiseUncached(node, PythonBuiltinClassType.IndexError, ErrorMessages.INDEX_OUT_OF_BOUNDS); + throw PRaiseNode.raiseStatic(node, PythonBuiltinClassType.IndexError, ErrorMessages.INDEX_OUT_OF_BOUNDS); } } } @@ -1023,12 +997,12 @@ static Object doWarn(VirtualFrame frame, PythonModule mod, Object message, Objec @Cached("createFor(this)") IndirectCallData indirectCallData, @Cached CastToTruffleStringNode castStr, @Cached WarningsModuleNode moduleFunctionsNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { TruffleString filename; try { filename = castStr.execute(inliningTarget, flname); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ARG_D_MUST_BE_S_NOT_P, "warn_explicit()", 3, "str", flname); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ARG_D_MUST_BE_S_NOT_P, "warn_explicit()", 3, "str", flname); } PDict globalsDict; if (globals instanceof PNone) { @@ -1036,7 +1010,7 @@ static Object doWarn(VirtualFrame frame, PythonModule mod, Object message, Objec } else if (globals instanceof PDict) { globalsDict = (PDict) globals; } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.MOD_GLOBALS_MUST_BE_DICT, globals); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.MOD_GLOBALS_MUST_BE_DICT, globals); } // CPython calls get_source_line here. But since that's potentially slow, maybe we can // get away with doing that lazily diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/WeakRefModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/WeakRefModuleBuiltins.java index 5820456298..0206b92821 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/WeakRefModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/WeakRefModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,13 +41,10 @@ package com.oracle.graal.python.builtins.modules; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.removeNativeWeakRef; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_weaklistoffset; import static com.oracle.graal.python.nodes.BuiltinNames.J__WEAKREF; import static com.oracle.graal.python.nodes.BuiltinNames.T__WEAKREF; -import static com.oracle.graal.python.nodes.HiddenAttr.WEAKLIST; import static com.oracle.graal.python.nodes.HiddenAttr.WEAK_REF_QUEUE; import static com.oracle.graal.python.nodes.StringLiterals.T_REF; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.lang.ref.Reference; @@ -61,45 +58,25 @@ import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.PythonAbstractObject; -import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; -import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass; -import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; -import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.builtins.objects.referencetype.PReferenceType; import com.oracle.graal.python.builtins.objects.referencetype.PReferenceType.WeakRefStorage; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; -import com.oracle.graal.python.builtins.objects.type.PythonClass; import com.oracle.graal.python.builtins.objects.type.TypeFlags; import com.oracle.graal.python.builtins.objects.type.TypeNodes; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetMroNode; -import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.HiddenAttr; -import com.oracle.graal.python.nodes.PGuards; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.WriteUnraisableNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassExactProfile; -import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.AsyncHandler; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateNodeFactory; -import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @CoreFunctions(defineModule = J__WEAKREF, isEager = true) @@ -209,7 +186,7 @@ public void postInitialize(Python3Core core) { TypeNodes.SetTypeFlagsNode.executeUncached(weakrefModule.getAttribute(T_CALLABLE_PROXY_TYPE), TypeFlags.DEFAULT | TypeFlags.HAVE_GC); final PythonContext ctx = core.getContext(); core.getContext().registerAsyncAction(() -> { - if (!ctx.isGcEnabled()) { + if (!ctx.getGcState().isEnabled()) { return null; } Reference reference = null; @@ -245,132 +222,6 @@ public void postInitialize(Python3Core core) { }); } - // ReferenceType constructor - @Builtin(name = "ReferenceType", minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 3, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PReferenceType) - @GenerateNodeFactory - public abstract static class ReferenceTypeNode extends PythonBuiltinNode { - @Child private CStructAccess.ReadI64Node getTpWeaklistoffsetNode; - - public abstract PReferenceType execute(Object cls, Object object, Object callback); - - @Specialization(guards = "!isNativeObject(object)") - static PReferenceType refType(Object cls, Object object, @SuppressWarnings("unused") PNone none, - @Bind("this") Node inliningTarget, - @Exclusive @Cached GetClassNode getClassNode, - @Cached HiddenAttr.ReadNode readWeaklistNode, - @Cached HiddenAttr.WriteNode writeWeakListNode, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached HiddenAttr.ReadNode readQueueNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - Object obj = object; - if (object instanceof PythonBuiltinClassType tobj) { - obj = PythonContext.get(inliningTarget).getCore().lookupType(tobj); - } - - Object clazz = getClassNode.execute(inliningTarget, obj); - boolean allowed = true; - if (clazz instanceof PythonBuiltinClassType type) { - allowed = type.getWeaklistoffset() != 0; - } - if (!allowed) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANNOT_CREATE_WEAK_REFERENCE_TO, obj); - } - assert obj instanceof PythonAbstractObject; - Object wr = readWeaklistNode.execute(inliningTarget, (PythonAbstractObject) obj, WEAKLIST, null); - if (wr != null) { - return (PReferenceType) wr; // is must be a PReferenceType instance. - } - - PReferenceType ref = factory.createReferenceType(cls, obj, null, getWeakReferenceQueue(inliningTarget, readQueueNode)); - writeWeakListNode.execute(inliningTarget, (PythonAbstractObject) obj, WEAKLIST, ref); - return ref; - } - - @Specialization(guards = {"!isNativeObject(object)", "!isPNone(callback)"}) - static PReferenceType refTypeWithCallback(Object cls, Object object, Object callback, - @Bind("this") Node inliningTarget, - @Exclusive @Cached HiddenAttr.ReadNode readQueueNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createReferenceType(cls, object, callback, getWeakReferenceQueue(inliningTarget, readQueueNode)); - } - - @Specialization - @SuppressWarnings("truffle-static-method") - PReferenceType refType(Object cls, PythonAbstractNativeObject pythonObject, Object callback, - @Bind("this") Node inliningTarget, - @Exclusive @Cached GetClassNode getClassNode, - @Cached IsBuiltinClassExactProfile profile, - @Cached GetMroNode getMroNode, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached HiddenAttr.ReadNode readQueueNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - Object actualCallback = callback instanceof PNone ? null : callback; - Object clazz = getClassNode.execute(inliningTarget, pythonObject); - - // if the object is a type, a weak ref is allowed - boolean allowed = false; - if (profile.profileClass(inliningTarget, clazz, PythonBuiltinClassType.PythonClass)) { - allowed = true; - } else { - // if the object's type is a native type, we need to consider 'tp_weaklistoffset' - if (PGuards.isNativeClass(clazz) || clazz instanceof PythonClass && ((PythonClass) clazz).needsNativeAllocation()) { - for (Object base : getMroNode.execute(inliningTarget, clazz)) { - if (PGuards.isNativeClass(base)) { - if (getTpWeaklistoffsetNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - getTpWeaklistoffsetNode = insert(CStructAccess.ReadI64Node.create()); - } - long tpWeaklistoffset = getTpWeaklistoffsetNode.readFromObj((PythonNativeClass) base, PyTypeObject__tp_weaklistoffset); - if (tpWeaklistoffset != 0) { - allowed = true; - break; - } - } else if (base instanceof PythonClass /* not PythonBuiltinClass */) { - // any subclass of a normal (non-builtin) class supports weakrefs - allowed = true; - break; - } - } - } - } - if (allowed) { - CApiTransitions.addNativeWeakRef(getContext(), pythonObject); - return factory.createReferenceType(cls, pythonObject, actualCallback, getWeakReferenceQueue(inliningTarget, readQueueNode)); - } else { - return refType(cls, pythonObject, actualCallback, raiseNode.get(inliningTarget)); - } - } - - @Fallback - static PReferenceType refType(@SuppressWarnings("unused") Object cls, Object object, @SuppressWarnings("unused") Object callback, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_CREATE_WEAK_REFERENCE_TO, object); - } - - @SuppressWarnings("unchecked") - private static ReferenceQueue getWeakReferenceQueue(Node inliningTarget, HiddenAttr.ReadNode readNode) { - PythonContext context = PythonContext.get(inliningTarget); - Object queueObject = readNode.execute(inliningTarget, context.lookupType(PythonBuiltinClassType.PReferenceType), WEAK_REF_QUEUE, null); - if (queueObject != null) { - return (ReferenceQueue) queueObject; - } else { - if (context.isCoreInitialized()) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("the weak reference queue was modified!"); - } else { - // returning a null reference queue is fine, it just means - // that the finalizer won't run - return null; - } - } - } - - @NeverDefault - public static ReferenceTypeNode create() { - return WeakRefModuleBuiltinsFactory.ReferenceTypeNodeFactory.create(null); - } - } - // getweakrefcount(obj) @Builtin(name = "getweakrefcount", minNumOfPositionalArgs = 1) @GenerateNodeFactory diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/WinregModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/WinregModuleBuiltins.java index e72c7c79d2..49ab1f7d64 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/WinregModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/WinregModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,6 +42,7 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; @@ -55,7 +56,7 @@ import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -103,10 +104,10 @@ protected ArgumentClinicProvider getArgumentClinic() { static Object openKey(VirtualFrame frame, Object key, Object subKey, Object reserved, Object access, @Bind("this") Node inliningTarget, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { if (key instanceof Integer intKey) { if (intKey == HKEY_CLASSES_ROOT) { - return factory.createLock(); + return PFactory.createLock(language); } } throw constructAndRaiseNode.get(inliningTarget).raiseOSError(frame, OSErrorEnum.ENOENT); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/AstBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/AstBuiltins.java index 446ae216fa..a036d11eed 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/AstBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/AstBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,7 +46,6 @@ import static com.oracle.graal.python.nodes.ErrorMessages.S_CONSTRUCTOR_TAKES_AT_MOST_D_POSITIONAL_ARGUMENT_S; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___DICT__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DICT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.util.PythonUtils.EMPTY_OBJECT_ARRAY; @@ -54,6 +53,10 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -63,6 +66,8 @@ import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.object.PythonObject; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.lib.PyObjectSetAttrO; import com.oracle.graal.python.nodes.ErrorMessages; @@ -74,7 +79,7 @@ import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.object.GetOrCreateDictNode; import com.oracle.graal.python.nodes.object.SetDictNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.PSequence; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; @@ -88,12 +93,29 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.AST) public final class AstBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = AstBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return AstBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "AST", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class AstNode extends PythonVarargsBuiltinNode { + + @Specialization + static PythonObject generic(Object cls, @SuppressWarnings("unused") Object[] varargs, @SuppressWarnings("unused") PKeyword[] kwargs, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createPythonObject(language, cls, getInstanceShape.execute(cls)); + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory abstract static class InitNode extends PythonVarargsBuiltinNode { @@ -107,26 +129,27 @@ protected Object doIt(VirtualFrame frame, Object self, Object[] args, PKeyword[] @Cached PyObjectLookupAttr lookupAttrNode, @Cached SequenceNodes.GetObjectArrayNode getObjectArrayNode, @Cached PyObjectSetAttrO setAttrNode, - @Cached TruffleString.EqualNode equalNode) { + @Cached TruffleString.EqualNode equalNode, + @Cached PRaiseNode raiseNode) { Object fieldsObj = lookupAttrNode.execute(frame, inliningTarget, self, T__FIELDS); Object[] fields; if (fieldsObj == PNone.NO_VALUE) { fields = EMPTY_OBJECT_ARRAY; } else { if (!(fieldsObj instanceof PSequence)) { - throw raise(TypeError, IS_NOT_A_SEQUENCE, fieldsObj); + throw raiseNode.raise(inliningTarget, TypeError, IS_NOT_A_SEQUENCE, fieldsObj); } fields = getObjectArrayNode.execute(inliningTarget, fieldsObj); } if (fields.length < args.length) { - throw raise(TypeError, S_CONSTRUCTOR_TAKES_AT_MOST_D_POSITIONAL_ARGUMENT_S, self, fields.length, fields.length == 1 ? "" : "s"); + throw raiseNode.raise(inliningTarget, TypeError, S_CONSTRUCTOR_TAKES_AT_MOST_D_POSITIONAL_ARGUMENT_S, self, fields.length, fields.length == 1 ? "" : "s"); } for (int i = 0; i < args.length; ++i) { setAttrNode.execute(frame, inliningTarget, self, fields[i], args[i]); } for (PKeyword kwArg : kwArgs) { if (contains(fields, args.length, kwArg.getName(), equalNode)) { - throw raise(TypeError, P_GOT_MULTIPLE_VALUES_FOR_ARGUMENT_S, self, kwArg.getName()); + throw raiseNode.raise(inliningTarget, TypeError, P_GOT_MULTIPLE_VALUES_FOR_ARGUMENT_S, self, kwArg.getName()); } setAttrNode.execute(frame, inliningTarget, self, kwArg.getName(), kwArg.getValue()); } @@ -166,8 +189,8 @@ static Object dict(PythonObject self, PDict dict, @Specialization(guards = {"!isNoValue(d)", "!isDict(d)"}) @SuppressWarnings("unused") static Object setDict(PythonObject self, Object d, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, d); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, d); } } @@ -180,10 +203,10 @@ static Object doit(VirtualFrame frame, PythonObject self, Object ignored, @Bind("this") Node inliningTarget, @Cached GetClassNode getClassNode, @Cached PyObjectLookupAttr lookupAttr, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { Object clazz = getClassNode.execute(inliningTarget, self); Object dict = lookupAttr.execute(frame, inliningTarget, self, T___DICT__); - return factory.createTuple(new Object[]{clazz, factory.createTuple(EMPTY_OBJECT_ARRAY), dict}); + return PFactory.createTuple(language, new Object[]{clazz, PFactory.createTuple(language, EMPTY_OBJECT_ARRAY), dict}); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/AstModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/AstModuleBuiltins.java index ac5040e41c..9c5f7a65b6 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/AstModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/AstModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,35 +45,29 @@ import static com.oracle.graal.python.builtins.modules.BuiltinFunctions.CompileNode.PyCF_TYPE_COMMENTS; import static com.oracle.graal.python.nodes.ErrorMessages.EXPECTED_S_NODE_GOT_P; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___MATCH_ARGS__; -import static com.oracle.graal.python.util.PythonUtils.EMPTY_OBJECT_ARRAY; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import static com.oracle.truffle.api.CompilerDirectives.shouldNotReachHere; +import java.util.Collections; import java.util.List; -import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.module.PythonModule; -import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; import com.oracle.graal.python.builtins.objects.type.PythonClass; +import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.pegparser.InputType; import com.oracle.graal.python.pegparser.sst.ModTy; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @CoreFunctions(defineModule = AstModuleBuiltins.J__AST, isEager = true) @@ -87,7 +81,7 @@ public final class AstModuleBuiltins extends PythonBuiltins { @Override protected List> getNodeFactories() { - return AstModuleBuiltinsFactory.getFactories(); + return Collections.emptyList(); } @Override @@ -98,7 +92,7 @@ public void initialize(Python3Core core) { addBuiltinConstant("PyCF_ALLOW_TOP_LEVEL_AWAIT", PyCF_ALLOW_TOP_LEVEL_AWAIT); PythonBuiltinClass clsAst = core.lookupType(PythonBuiltinClassType.AST); - PTuple emptyTuple = core.factory().createTuple(EMPTY_OBJECT_ARRAY); + PTuple emptyTuple = PFactory.createEmptyTuple(core.getLanguage()); clsAst.setAttribute(T__FIELDS, emptyTuple); clsAst.setAttribute(T__ATTRIBUTES, emptyTuple); clsAst.setAttribute(T___MATCH_ARGS__, emptyTuple); @@ -108,29 +102,11 @@ public void initialize(Python3Core core) { public void postInitialize(Python3Core core) { super.postInitialize(core); PythonModule astModule = core.lookupBuiltinModule(T__AST); - AstTypeFactory astTypeFactory = new AstTypeFactory(core.getLanguage(), core.factory(), astModule); + AstTypeFactory astTypeFactory = new AstTypeFactory(core.getLanguage(), astModule); AstState state = new AstState(astTypeFactory, core.lookupType(PythonBuiltinClassType.AST)); astModule.setModuleState(state); } - @Builtin(name = "AST", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.AST) - @GenerateNodeFactory - public abstract static class AstNode extends PythonVarargsBuiltinNode { - @Override - public final Object varArgExecute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported { - if (self == PNone.NO_VALUE && arguments.length > 0) { - return factory().createPythonObject(arguments[0]); - } - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw VarargsBuiltinDirectInvocationNotSupported.INSTANCE; - } - - @Specialization - PythonObject generic(Object cls, @SuppressWarnings("unused") Object[] varargs, @SuppressWarnings("unused") PKeyword[] kwargs) { - return factory().createPythonObject(cls); - } - } - private static AstState getAstState(PythonContext context) { return context.lookupBuiltinModule(T__AST).getModuleState(AstState.class); } @@ -141,7 +117,7 @@ public static Object sst2Obj(PythonContext context, ModTy mod) { } @TruffleBoundary - public static ModTy obj2sst(PythonContext context, Object obj, InputType type) { + public static ModTy obj2sst(Node node, PythonContext context, Object obj, InputType type) { AstState state = getAstState(context); PythonClass expectedClass; switch (type) { @@ -158,11 +134,12 @@ public static ModTy obj2sst(PythonContext context, Object obj, InputType type) { throw shouldNotReachHere(); } if (!Obj2SstBase.isInstanceOf(obj, expectedClass)) { - throw Obj2SstBase.raiseTypeError(EXPECTED_S_NODE_GOT_P, expectedClass.getName(), obj); + Object[] arguments = new Object[]{expectedClass.getName(), obj}; + throw PRaiseNode.raiseStatic(node, PythonBuiltinClassType.TypeError, EXPECTED_S_NODE_GOT_P, arguments); } - ModTy mod = new Obj2Sst(state).obj2ModTy(obj); - Validator.validateMod(mod); + ModTy mod = new Obj2Sst(node, state).obj2ModTy(obj); + Validator.validateMod(node, mod); return mod; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/AstState.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/AstState.java index b416484a6c..29ba5b10cb 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/AstState.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/AstState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/AstTypeFactory.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/AstTypeFactory.java index 89ed1bee7d..00bbb68146 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/AstTypeFactory.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/AstTypeFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -49,13 +49,12 @@ import static com.oracle.graal.python.util.PythonUtils.convertToObjectArray; import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; import com.oracle.graal.python.builtins.objects.type.PythonClass; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.strings.TruffleString; /** @@ -64,23 +63,21 @@ final class AstTypeFactory { private final PythonLanguage language; - private final PythonObjectFactory factory; private final PythonModule astModule; - AstTypeFactory(PythonLanguage language, PythonObjectFactory factory, PythonModule astModule) { + AstTypeFactory(PythonLanguage language, PythonModule astModule) { this.language = language; - this.factory = factory; this.astModule = astModule; } PythonClass makeType(TruffleString name, PythonAbstractClass base, TruffleString[] fields, TruffleString[] attributes, TruffleString[] optional, TruffleString docString) { - PythonClass newType = factory.createPythonClassAndFixupSlots(language, PythonBuiltinClassType.PythonClass, name, base, new PythonAbstractClass[]{base}); + PythonClass newType = PFactory.createPythonClassAndFixupSlots(language, name, base, new PythonAbstractClass[]{base}); newType.setAttribute(T___MODULE__, T_AST); newType.setAttribute(T___DOC__, docString); - newType.setAttribute(T__FIELDS, factory.createTuple(convertToObjectArray(fields))); - newType.setAttribute(T___MATCH_ARGS__, factory.createTuple(convertToObjectArray(fields))); + newType.setAttribute(T__FIELDS, PFactory.createTuple(language, convertToObjectArray(fields))); + newType.setAttribute(T___MATCH_ARGS__, PFactory.createTuple(language, convertToObjectArray(fields))); if (attributes != null) { - newType.setAttribute(T__ATTRIBUTES, factory.createTuple(convertToObjectArray(attributes))); + newType.setAttribute(T__ATTRIBUTES, PFactory.createTuple(language, convertToObjectArray(attributes))); } for (TruffleString n : optional) { newType.setAttribute(n, PNone.NONE); @@ -90,6 +87,6 @@ PythonClass makeType(TruffleString name, PythonAbstractClass base, TruffleString } PythonObject createSingleton(PythonClass cls) { - return factory.createPythonObject(cls); + return PFactory.createPythonObject(language, cls, cls.getInstanceShape()); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Obj2Sst.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Obj2Sst.java index 0592423a9d..1166363cdf 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Obj2Sst.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Obj2Sst.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,6 +45,7 @@ // Generated from Python.asdl by main_asdl_gen.py package com.oracle.graal.python.builtins.modules.ast; +import com.oracle.truffle.api.nodes.Node; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.pegparser.sst.ConstantValue; import com.oracle.graal.python.pegparser.sst.ModTy; @@ -69,8 +70,8 @@ final class Obj2Sst extends Obj2SstBase { - Obj2Sst(AstState state) { - super(state); + Obj2Sst(Node node, AstState state) { + super(node, state); } ModTy obj2ModTy(Object obj) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Obj2SstBase.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Obj2SstBase.java index 9f41864f94..5396eebd76 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Obj2SstBase.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Obj2SstBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -68,11 +68,12 @@ import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.str.PString; import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.lib.IteratorExhausted; import com.oracle.graal.python.lib.PyBytesCheckExactNode; import com.oracle.graal.python.lib.PyComplexCheckExactNode; import com.oracle.graal.python.lib.PyFloatCheckExactNode; import com.oracle.graal.python.lib.PyFrozenSetCheckExactNode; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyLongAsIntNode; import com.oracle.graal.python.lib.PyLongCheckNode; import com.oracle.graal.python.lib.PyObjectGetIter; @@ -84,20 +85,22 @@ import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.SpecialMethodNames; import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaBooleanNode; import com.oracle.graal.python.nodes.util.CastToJavaStringNode; import com.oracle.graal.python.pegparser.sst.ConstantValue; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; +import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; abstract class Obj2SstBase { final AstState state; + private final Node node; - protected Obj2SstBase(AstState state) { + protected Obj2SstBase(Node node, AstState state) { + this.node = node; this.state = state; } @@ -287,13 +290,12 @@ ConstantValue obj2ConstantValue(Object obj) { boolean isTuple = PyTupleCheckExactNode.executeUncached(obj); if (isTuple || PyFrozenSetCheckExactNode.executeUncached(obj)) { Object iter = PyObjectGetIter.executeUncached(obj); - GetNextNode nextNode = GetNextNode.getUncached(); ArrayList list = new ArrayList<>(); while (true) { try { - list.add(obj2ConstantValue(nextNode.execute(iter))); - } catch (PException e) { - e.expectStopIteration(null, IsBuiltinObjectProfile.getUncached()); + Object item = PyIterNextNode.executeUncached(iter); + list.add(obj2ConstantValue(item)); + } catch (IteratorExhausted e) { break; } } @@ -305,7 +307,7 @@ ConstantValue obj2ConstantValue(Object obj) { throw raiseTypeError(ErrorMessages.GOT_AN_INVALID_TYPE_IN_CONSTANT, obj); } - static PException unexpectedNodeType(TruffleString expected, Object obj) { + protected PException unexpectedNodeType(TruffleString expected, Object obj) { throw raiseTypeError(EXPECTED_SOME_SORT_OF_S_BUT_GOT_S, expected, repr(obj)); } @@ -317,15 +319,15 @@ private static TruffleString repr(Object o) { return PyObjectReprAsTruffleStringNode.executeUncached(o); } - private static PException raise(PythonBuiltinClassType type, TruffleString format, Object... arguments) { - throw PRaiseNode.getUncached().raise(type, format, arguments); + private PException raise(PythonBuiltinClassType type, TruffleString format, Object... arguments) { + throw PRaiseNode.raiseStatic(node, type, format, arguments); } - static PException raiseTypeError(TruffleString format, Object... arguments) { + protected PException raiseTypeError(TruffleString format, Object... arguments) { throw raise(PythonBuiltinClassType.TypeError, format, arguments); } - private static PException raiseValueError(TruffleString format, Object... arguments) { + protected PException raiseValueError(TruffleString format, Object... arguments) { throw raise(PythonBuiltinClassType.ValueError, format, arguments); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Sst2ObjVisitor.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Sst2ObjVisitor.java index d21cebcb1c..e698ae2164 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Sst2ObjVisitor.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Sst2ObjVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -77,7 +77,7 @@ final class Sst2ObjVisitor extends Sst2ObjVisitorBase { @Override public Object visit(ModTy.Module node) { - PythonObject o = factory.createPythonObject(state.clsModule); + PythonObject o = createPythonObject(state.clsModule); o.setAttribute(AstState.T_F_BODY, seq2List(node.body)); o.setAttribute(AstState.T_F_TYPE_IGNORES, seq2List(node.typeIgnores)); return o; @@ -85,21 +85,21 @@ public Object visit(ModTy.Module node) { @Override public Object visit(ModTy.Interactive node) { - PythonObject o = factory.createPythonObject(state.clsInteractive); + PythonObject o = createPythonObject(state.clsInteractive); o.setAttribute(AstState.T_F_BODY, seq2List(node.body)); return o; } @Override public Object visit(ModTy.Expression node) { - PythonObject o = factory.createPythonObject(state.clsExpression); + PythonObject o = createPythonObject(state.clsExpression); o.setAttribute(AstState.T_F_BODY, visitNonNull(node.body)); return o; } @Override public Object visit(ModTy.FunctionType node) { - PythonObject o = factory.createPythonObject(state.clsFunctionType); + PythonObject o = createPythonObject(state.clsFunctionType); o.setAttribute(AstState.T_F_ARGTYPES, seq2List(node.argTypes)); o.setAttribute(AstState.T_F_RETURNS, visitNonNull(node.returns)); return o; @@ -107,7 +107,7 @@ public Object visit(ModTy.FunctionType node) { @Override public Object visit(StmtTy.FunctionDef node) { - PythonObject o = factory.createPythonObject(state.clsFunctionDef); + PythonObject o = createPythonObject(state.clsFunctionDef); o.setAttribute(AstState.T_F_NAME, visitNonNull(node.name)); o.setAttribute(AstState.T_F_ARGS, visitNonNull(node.args)); o.setAttribute(AstState.T_F_BODY, seq2List(node.body)); @@ -120,7 +120,7 @@ public Object visit(StmtTy.FunctionDef node) { @Override public Object visit(StmtTy.AsyncFunctionDef node) { - PythonObject o = factory.createPythonObject(state.clsAsyncFunctionDef); + PythonObject o = createPythonObject(state.clsAsyncFunctionDef); o.setAttribute(AstState.T_F_NAME, visitNonNull(node.name)); o.setAttribute(AstState.T_F_ARGS, visitNonNull(node.args)); o.setAttribute(AstState.T_F_BODY, seq2List(node.body)); @@ -133,7 +133,7 @@ public Object visit(StmtTy.AsyncFunctionDef node) { @Override public Object visit(StmtTy.ClassDef node) { - PythonObject o = factory.createPythonObject(state.clsClassDef); + PythonObject o = createPythonObject(state.clsClassDef); o.setAttribute(AstState.T_F_NAME, visitNonNull(node.name)); o.setAttribute(AstState.T_F_BASES, seq2List(node.bases)); o.setAttribute(AstState.T_F_KEYWORDS, seq2List(node.keywords)); @@ -145,7 +145,7 @@ public Object visit(StmtTy.ClassDef node) { @Override public Object visit(StmtTy.Return node) { - PythonObject o = factory.createPythonObject(state.clsReturn); + PythonObject o = createPythonObject(state.clsReturn); o.setAttribute(AstState.T_F_VALUE, visitNullable(node.value)); fillSourceRangeAttributes(o, node.getSourceRange()); return o; @@ -153,7 +153,7 @@ public Object visit(StmtTy.Return node) { @Override public Object visit(StmtTy.Delete node) { - PythonObject o = factory.createPythonObject(state.clsDelete); + PythonObject o = createPythonObject(state.clsDelete); o.setAttribute(AstState.T_F_TARGETS, seq2List(node.targets)); fillSourceRangeAttributes(o, node.getSourceRange()); return o; @@ -161,7 +161,7 @@ public Object visit(StmtTy.Delete node) { @Override public Object visit(StmtTy.Assign node) { - PythonObject o = factory.createPythonObject(state.clsAssign); + PythonObject o = createPythonObject(state.clsAssign); o.setAttribute(AstState.T_F_TARGETS, seq2List(node.targets)); o.setAttribute(AstState.T_F_VALUE, visitNonNull(node.value)); o.setAttribute(AstState.T_F_TYPE_COMMENT, visitNullableStringOrByteArray(node.typeComment)); @@ -171,7 +171,7 @@ public Object visit(StmtTy.Assign node) { @Override public Object visit(StmtTy.AugAssign node) { - PythonObject o = factory.createPythonObject(state.clsAugAssign); + PythonObject o = createPythonObject(state.clsAugAssign); o.setAttribute(AstState.T_F_TARGET, visitNonNull(node.target)); o.setAttribute(AstState.T_F_OP, visitNonNull(node.op)); o.setAttribute(AstState.T_F_VALUE, visitNonNull(node.value)); @@ -181,7 +181,7 @@ public Object visit(StmtTy.AugAssign node) { @Override public Object visit(StmtTy.AnnAssign node) { - PythonObject o = factory.createPythonObject(state.clsAnnAssign); + PythonObject o = createPythonObject(state.clsAnnAssign); o.setAttribute(AstState.T_F_TARGET, visitNonNull(node.target)); o.setAttribute(AstState.T_F_ANNOTATION, visitNonNull(node.annotation)); o.setAttribute(AstState.T_F_VALUE, visitNullable(node.value)); @@ -192,7 +192,7 @@ public Object visit(StmtTy.AnnAssign node) { @Override public Object visit(StmtTy.For node) { - PythonObject o = factory.createPythonObject(state.clsFor); + PythonObject o = createPythonObject(state.clsFor); o.setAttribute(AstState.T_F_TARGET, visitNonNull(node.target)); o.setAttribute(AstState.T_F_ITER, visitNonNull(node.iter)); o.setAttribute(AstState.T_F_BODY, seq2List(node.body)); @@ -204,7 +204,7 @@ public Object visit(StmtTy.For node) { @Override public Object visit(StmtTy.AsyncFor node) { - PythonObject o = factory.createPythonObject(state.clsAsyncFor); + PythonObject o = createPythonObject(state.clsAsyncFor); o.setAttribute(AstState.T_F_TARGET, visitNonNull(node.target)); o.setAttribute(AstState.T_F_ITER, visitNonNull(node.iter)); o.setAttribute(AstState.T_F_BODY, seq2List(node.body)); @@ -216,7 +216,7 @@ public Object visit(StmtTy.AsyncFor node) { @Override public Object visit(StmtTy.While node) { - PythonObject o = factory.createPythonObject(state.clsWhile); + PythonObject o = createPythonObject(state.clsWhile); o.setAttribute(AstState.T_F_TEST, visitNonNull(node.test)); o.setAttribute(AstState.T_F_BODY, seq2List(node.body)); o.setAttribute(AstState.T_F_ORELSE, seq2List(node.orElse)); @@ -226,7 +226,7 @@ public Object visit(StmtTy.While node) { @Override public Object visit(StmtTy.If node) { - PythonObject o = factory.createPythonObject(state.clsIf); + PythonObject o = createPythonObject(state.clsIf); o.setAttribute(AstState.T_F_TEST, visitNonNull(node.test)); o.setAttribute(AstState.T_F_BODY, seq2List(node.body)); o.setAttribute(AstState.T_F_ORELSE, seq2List(node.orElse)); @@ -236,7 +236,7 @@ public Object visit(StmtTy.If node) { @Override public Object visit(StmtTy.With node) { - PythonObject o = factory.createPythonObject(state.clsWith); + PythonObject o = createPythonObject(state.clsWith); o.setAttribute(AstState.T_F_ITEMS, seq2List(node.items)); o.setAttribute(AstState.T_F_BODY, seq2List(node.body)); o.setAttribute(AstState.T_F_TYPE_COMMENT, visitNullableStringOrByteArray(node.typeComment)); @@ -246,7 +246,7 @@ public Object visit(StmtTy.With node) { @Override public Object visit(StmtTy.AsyncWith node) { - PythonObject o = factory.createPythonObject(state.clsAsyncWith); + PythonObject o = createPythonObject(state.clsAsyncWith); o.setAttribute(AstState.T_F_ITEMS, seq2List(node.items)); o.setAttribute(AstState.T_F_BODY, seq2List(node.body)); o.setAttribute(AstState.T_F_TYPE_COMMENT, visitNullableStringOrByteArray(node.typeComment)); @@ -256,7 +256,7 @@ public Object visit(StmtTy.AsyncWith node) { @Override public Object visit(StmtTy.Match node) { - PythonObject o = factory.createPythonObject(state.clsMatch); + PythonObject o = createPythonObject(state.clsMatch); o.setAttribute(AstState.T_F_SUBJECT, visitNonNull(node.subject)); o.setAttribute(AstState.T_F_CASES, seq2List(node.cases)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -265,7 +265,7 @@ public Object visit(StmtTy.Match node) { @Override public Object visit(StmtTy.Raise node) { - PythonObject o = factory.createPythonObject(state.clsRaise); + PythonObject o = createPythonObject(state.clsRaise); o.setAttribute(AstState.T_F_EXC, visitNullable(node.exc)); o.setAttribute(AstState.T_F_CAUSE, visitNullable(node.cause)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -274,7 +274,7 @@ public Object visit(StmtTy.Raise node) { @Override public Object visit(StmtTy.Try node) { - PythonObject o = factory.createPythonObject(state.clsTry); + PythonObject o = createPythonObject(state.clsTry); o.setAttribute(AstState.T_F_BODY, seq2List(node.body)); o.setAttribute(AstState.T_F_HANDLERS, seq2List(node.handlers)); o.setAttribute(AstState.T_F_ORELSE, seq2List(node.orElse)); @@ -285,7 +285,7 @@ public Object visit(StmtTy.Try node) { @Override public Object visit(StmtTy.TryStar node) { - PythonObject o = factory.createPythonObject(state.clsTryStar); + PythonObject o = createPythonObject(state.clsTryStar); o.setAttribute(AstState.T_F_BODY, seq2List(node.body)); o.setAttribute(AstState.T_F_HANDLERS, seq2List(node.handlers)); o.setAttribute(AstState.T_F_ORELSE, seq2List(node.orElse)); @@ -296,7 +296,7 @@ public Object visit(StmtTy.TryStar node) { @Override public Object visit(StmtTy.Assert node) { - PythonObject o = factory.createPythonObject(state.clsAssert); + PythonObject o = createPythonObject(state.clsAssert); o.setAttribute(AstState.T_F_TEST, visitNonNull(node.test)); o.setAttribute(AstState.T_F_MSG, visitNullable(node.msg)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -305,7 +305,7 @@ public Object visit(StmtTy.Assert node) { @Override public Object visit(StmtTy.Import node) { - PythonObject o = factory.createPythonObject(state.clsImport); + PythonObject o = createPythonObject(state.clsImport); o.setAttribute(AstState.T_F_NAMES, seq2List(node.names)); fillSourceRangeAttributes(o, node.getSourceRange()); return o; @@ -313,7 +313,7 @@ public Object visit(StmtTy.Import node) { @Override public Object visit(StmtTy.ImportFrom node) { - PythonObject o = factory.createPythonObject(state.clsImportFrom); + PythonObject o = createPythonObject(state.clsImportFrom); o.setAttribute(AstState.T_F_MODULE, visitNullable(node.module)); o.setAttribute(AstState.T_F_NAMES, seq2List(node.names)); o.setAttribute(AstState.T_F_LEVEL, visitNullable(node.level)); @@ -323,7 +323,7 @@ public Object visit(StmtTy.ImportFrom node) { @Override public Object visit(StmtTy.Global node) { - PythonObject o = factory.createPythonObject(state.clsGlobal); + PythonObject o = createPythonObject(state.clsGlobal); o.setAttribute(AstState.T_F_NAMES, seq2List(node.names)); fillSourceRangeAttributes(o, node.getSourceRange()); return o; @@ -331,7 +331,7 @@ public Object visit(StmtTy.Global node) { @Override public Object visit(StmtTy.Nonlocal node) { - PythonObject o = factory.createPythonObject(state.clsNonlocal); + PythonObject o = createPythonObject(state.clsNonlocal); o.setAttribute(AstState.T_F_NAMES, seq2List(node.names)); fillSourceRangeAttributes(o, node.getSourceRange()); return o; @@ -339,7 +339,7 @@ public Object visit(StmtTy.Nonlocal node) { @Override public Object visit(StmtTy.Expr node) { - PythonObject o = factory.createPythonObject(state.clsExpr); + PythonObject o = createPythonObject(state.clsExpr); o.setAttribute(AstState.T_F_VALUE, visitNonNull(node.value)); fillSourceRangeAttributes(o, node.getSourceRange()); return o; @@ -347,28 +347,28 @@ public Object visit(StmtTy.Expr node) { @Override public Object visit(StmtTy.Pass node) { - PythonObject o = factory.createPythonObject(state.clsPass); + PythonObject o = createPythonObject(state.clsPass); fillSourceRangeAttributes(o, node.getSourceRange()); return o; } @Override public Object visit(StmtTy.Break node) { - PythonObject o = factory.createPythonObject(state.clsBreak); + PythonObject o = createPythonObject(state.clsBreak); fillSourceRangeAttributes(o, node.getSourceRange()); return o; } @Override public Object visit(StmtTy.Continue node) { - PythonObject o = factory.createPythonObject(state.clsContinue); + PythonObject o = createPythonObject(state.clsContinue); fillSourceRangeAttributes(o, node.getSourceRange()); return o; } @Override public Object visit(ExprTy.BoolOp node) { - PythonObject o = factory.createPythonObject(state.clsBoolOp); + PythonObject o = createPythonObject(state.clsBoolOp); o.setAttribute(AstState.T_F_OP, visitNonNull(node.op)); o.setAttribute(AstState.T_F_VALUES, seq2List(node.values)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -377,7 +377,7 @@ public Object visit(ExprTy.BoolOp node) { @Override public Object visit(ExprTy.NamedExpr node) { - PythonObject o = factory.createPythonObject(state.clsNamedExpr); + PythonObject o = createPythonObject(state.clsNamedExpr); o.setAttribute(AstState.T_F_TARGET, visitNonNull(node.target)); o.setAttribute(AstState.T_F_VALUE, visitNonNull(node.value)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -386,7 +386,7 @@ public Object visit(ExprTy.NamedExpr node) { @Override public Object visit(ExprTy.BinOp node) { - PythonObject o = factory.createPythonObject(state.clsBinOp); + PythonObject o = createPythonObject(state.clsBinOp); o.setAttribute(AstState.T_F_LEFT, visitNonNull(node.left)); o.setAttribute(AstState.T_F_OP, visitNonNull(node.op)); o.setAttribute(AstState.T_F_RIGHT, visitNonNull(node.right)); @@ -396,7 +396,7 @@ public Object visit(ExprTy.BinOp node) { @Override public Object visit(ExprTy.UnaryOp node) { - PythonObject o = factory.createPythonObject(state.clsUnaryOp); + PythonObject o = createPythonObject(state.clsUnaryOp); o.setAttribute(AstState.T_F_OP, visitNonNull(node.op)); o.setAttribute(AstState.T_F_OPERAND, visitNonNull(node.operand)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -405,7 +405,7 @@ public Object visit(ExprTy.UnaryOp node) { @Override public Object visit(ExprTy.Lambda node) { - PythonObject o = factory.createPythonObject(state.clsLambda); + PythonObject o = createPythonObject(state.clsLambda); o.setAttribute(AstState.T_F_ARGS, visitNonNull(node.args)); o.setAttribute(AstState.T_F_BODY, visitNonNull(node.body)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -414,7 +414,7 @@ public Object visit(ExprTy.Lambda node) { @Override public Object visit(ExprTy.IfExp node) { - PythonObject o = factory.createPythonObject(state.clsIfExp); + PythonObject o = createPythonObject(state.clsIfExp); o.setAttribute(AstState.T_F_TEST, visitNonNull(node.test)); o.setAttribute(AstState.T_F_BODY, visitNonNull(node.body)); o.setAttribute(AstState.T_F_ORELSE, visitNonNull(node.orElse)); @@ -424,7 +424,7 @@ public Object visit(ExprTy.IfExp node) { @Override public Object visit(ExprTy.Dict node) { - PythonObject o = factory.createPythonObject(state.clsDict); + PythonObject o = createPythonObject(state.clsDict); o.setAttribute(AstState.T_F_KEYS, seq2List(node.keys)); o.setAttribute(AstState.T_F_VALUES, seq2List(node.values)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -433,7 +433,7 @@ public Object visit(ExprTy.Dict node) { @Override public Object visit(ExprTy.Set node) { - PythonObject o = factory.createPythonObject(state.clsSet); + PythonObject o = createPythonObject(state.clsSet); o.setAttribute(AstState.T_F_ELTS, seq2List(node.elements)); fillSourceRangeAttributes(o, node.getSourceRange()); return o; @@ -441,7 +441,7 @@ public Object visit(ExprTy.Set node) { @Override public Object visit(ExprTy.ListComp node) { - PythonObject o = factory.createPythonObject(state.clsListComp); + PythonObject o = createPythonObject(state.clsListComp); o.setAttribute(AstState.T_F_ELT, visitNonNull(node.element)); o.setAttribute(AstState.T_F_GENERATORS, seq2List(node.generators)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -450,7 +450,7 @@ public Object visit(ExprTy.ListComp node) { @Override public Object visit(ExprTy.SetComp node) { - PythonObject o = factory.createPythonObject(state.clsSetComp); + PythonObject o = createPythonObject(state.clsSetComp); o.setAttribute(AstState.T_F_ELT, visitNonNull(node.element)); o.setAttribute(AstState.T_F_GENERATORS, seq2List(node.generators)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -459,7 +459,7 @@ public Object visit(ExprTy.SetComp node) { @Override public Object visit(ExprTy.DictComp node) { - PythonObject o = factory.createPythonObject(state.clsDictComp); + PythonObject o = createPythonObject(state.clsDictComp); o.setAttribute(AstState.T_F_KEY, visitNonNull(node.key)); o.setAttribute(AstState.T_F_VALUE, visitNonNull(node.value)); o.setAttribute(AstState.T_F_GENERATORS, seq2List(node.generators)); @@ -469,7 +469,7 @@ public Object visit(ExprTy.DictComp node) { @Override public Object visit(ExprTy.GeneratorExp node) { - PythonObject o = factory.createPythonObject(state.clsGeneratorExp); + PythonObject o = createPythonObject(state.clsGeneratorExp); o.setAttribute(AstState.T_F_ELT, visitNonNull(node.element)); o.setAttribute(AstState.T_F_GENERATORS, seq2List(node.generators)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -478,7 +478,7 @@ public Object visit(ExprTy.GeneratorExp node) { @Override public Object visit(ExprTy.Await node) { - PythonObject o = factory.createPythonObject(state.clsAwait); + PythonObject o = createPythonObject(state.clsAwait); o.setAttribute(AstState.T_F_VALUE, visitNonNull(node.value)); fillSourceRangeAttributes(o, node.getSourceRange()); return o; @@ -486,7 +486,7 @@ public Object visit(ExprTy.Await node) { @Override public Object visit(ExprTy.Yield node) { - PythonObject o = factory.createPythonObject(state.clsYield); + PythonObject o = createPythonObject(state.clsYield); o.setAttribute(AstState.T_F_VALUE, visitNullable(node.value)); fillSourceRangeAttributes(o, node.getSourceRange()); return o; @@ -494,7 +494,7 @@ public Object visit(ExprTy.Yield node) { @Override public Object visit(ExprTy.YieldFrom node) { - PythonObject o = factory.createPythonObject(state.clsYieldFrom); + PythonObject o = createPythonObject(state.clsYieldFrom); o.setAttribute(AstState.T_F_VALUE, visitNonNull(node.value)); fillSourceRangeAttributes(o, node.getSourceRange()); return o; @@ -502,7 +502,7 @@ public Object visit(ExprTy.YieldFrom node) { @Override public Object visit(ExprTy.Compare node) { - PythonObject o = factory.createPythonObject(state.clsCompare); + PythonObject o = createPythonObject(state.clsCompare); o.setAttribute(AstState.T_F_LEFT, visitNonNull(node.left)); o.setAttribute(AstState.T_F_OPS, seq2List(node.ops)); o.setAttribute(AstState.T_F_COMPARATORS, seq2List(node.comparators)); @@ -512,7 +512,7 @@ public Object visit(ExprTy.Compare node) { @Override public Object visit(ExprTy.Call node) { - PythonObject o = factory.createPythonObject(state.clsCall); + PythonObject o = createPythonObject(state.clsCall); o.setAttribute(AstState.T_F_FUNC, visitNonNull(node.func)); o.setAttribute(AstState.T_F_ARGS, seq2List(node.args)); o.setAttribute(AstState.T_F_KEYWORDS, seq2List(node.keywords)); @@ -522,7 +522,7 @@ public Object visit(ExprTy.Call node) { @Override public Object visit(ExprTy.FormattedValue node) { - PythonObject o = factory.createPythonObject(state.clsFormattedValue); + PythonObject o = createPythonObject(state.clsFormattedValue); o.setAttribute(AstState.T_F_VALUE, visitNonNull(node.value)); o.setAttribute(AstState.T_F_CONVERSION, visitNonNull(node.conversion)); o.setAttribute(AstState.T_F_FORMAT_SPEC, visitNullable(node.formatSpec)); @@ -532,7 +532,7 @@ public Object visit(ExprTy.FormattedValue node) { @Override public Object visit(ExprTy.JoinedStr node) { - PythonObject o = factory.createPythonObject(state.clsJoinedStr); + PythonObject o = createPythonObject(state.clsJoinedStr); o.setAttribute(AstState.T_F_VALUES, seq2List(node.values)); fillSourceRangeAttributes(o, node.getSourceRange()); return o; @@ -540,7 +540,7 @@ public Object visit(ExprTy.JoinedStr node) { @Override public Object visit(ExprTy.Constant node) { - PythonObject o = factory.createPythonObject(state.clsConstant); + PythonObject o = createPythonObject(state.clsConstant); o.setAttribute(AstState.T_F_VALUE, visitNonNull(node.value)); o.setAttribute(AstState.T_F_KIND, visitNullableStringOrByteArray(node.kind)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -549,7 +549,7 @@ public Object visit(ExprTy.Constant node) { @Override public Object visit(ExprTy.Attribute node) { - PythonObject o = factory.createPythonObject(state.clsAttribute); + PythonObject o = createPythonObject(state.clsAttribute); o.setAttribute(AstState.T_F_VALUE, visitNonNull(node.value)); o.setAttribute(AstState.T_F_ATTR, visitNonNull(node.attr)); o.setAttribute(AstState.T_F_CTX, visitNonNull(node.context)); @@ -559,7 +559,7 @@ public Object visit(ExprTy.Attribute node) { @Override public Object visit(ExprTy.Subscript node) { - PythonObject o = factory.createPythonObject(state.clsSubscript); + PythonObject o = createPythonObject(state.clsSubscript); o.setAttribute(AstState.T_F_VALUE, visitNonNull(node.value)); o.setAttribute(AstState.T_F_SLICE, visitNonNull(node.slice)); o.setAttribute(AstState.T_F_CTX, visitNonNull(node.context)); @@ -569,7 +569,7 @@ public Object visit(ExprTy.Subscript node) { @Override public Object visit(ExprTy.Starred node) { - PythonObject o = factory.createPythonObject(state.clsStarred); + PythonObject o = createPythonObject(state.clsStarred); o.setAttribute(AstState.T_F_VALUE, visitNonNull(node.value)); o.setAttribute(AstState.T_F_CTX, visitNonNull(node.context)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -578,7 +578,7 @@ public Object visit(ExprTy.Starred node) { @Override public Object visit(ExprTy.Name node) { - PythonObject o = factory.createPythonObject(state.clsName); + PythonObject o = createPythonObject(state.clsName); o.setAttribute(AstState.T_F_ID, visitNonNull(node.id)); o.setAttribute(AstState.T_F_CTX, visitNonNull(node.context)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -587,7 +587,7 @@ public Object visit(ExprTy.Name node) { @Override public Object visit(ExprTy.List node) { - PythonObject o = factory.createPythonObject(state.clsList); + PythonObject o = createPythonObject(state.clsList); o.setAttribute(AstState.T_F_ELTS, seq2List(node.elements)); o.setAttribute(AstState.T_F_CTX, visitNonNull(node.context)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -596,7 +596,7 @@ public Object visit(ExprTy.List node) { @Override public Object visit(ExprTy.Tuple node) { - PythonObject o = factory.createPythonObject(state.clsTuple); + PythonObject o = createPythonObject(state.clsTuple); o.setAttribute(AstState.T_F_ELTS, seq2List(node.elements)); o.setAttribute(AstState.T_F_CTX, visitNonNull(node.context)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -605,7 +605,7 @@ public Object visit(ExprTy.Tuple node) { @Override public Object visit(ExprTy.Slice node) { - PythonObject o = factory.createPythonObject(state.clsSlice); + PythonObject o = createPythonObject(state.clsSlice); o.setAttribute(AstState.T_F_LOWER, visitNullable(node.lower)); o.setAttribute(AstState.T_F_UPPER, visitNullable(node.upper)); o.setAttribute(AstState.T_F_STEP, visitNullable(node.step)); @@ -715,7 +715,7 @@ public Object visitNonNull(CmpOpTy v) { @Override public Object visit(ComprehensionTy node) { - PythonObject o = factory.createPythonObject(state.clsComprehensionTy); + PythonObject o = createPythonObject(state.clsComprehensionTy); o.setAttribute(AstState.T_F_TARGET, visitNonNull(node.target)); o.setAttribute(AstState.T_F_ITER, visitNonNull(node.iter)); o.setAttribute(AstState.T_F_IFS, seq2List(node.ifs)); @@ -725,7 +725,7 @@ public Object visit(ComprehensionTy node) { @Override public Object visit(ExceptHandlerTy.ExceptHandler node) { - PythonObject o = factory.createPythonObject(state.clsExceptHandler); + PythonObject o = createPythonObject(state.clsExceptHandler); o.setAttribute(AstState.T_F_TYPE, visitNullable(node.type)); o.setAttribute(AstState.T_F_NAME, visitNullable(node.name)); o.setAttribute(AstState.T_F_BODY, seq2List(node.body)); @@ -735,7 +735,7 @@ public Object visit(ExceptHandlerTy.ExceptHandler node) { @Override public Object visit(ArgumentsTy node) { - PythonObject o = factory.createPythonObject(state.clsArgumentsTy); + PythonObject o = createPythonObject(state.clsArgumentsTy); o.setAttribute(AstState.T_F_POSONLYARGS, seq2List(node.posOnlyArgs)); o.setAttribute(AstState.T_F_ARGS, seq2List(node.args)); o.setAttribute(AstState.T_F_VARARG, visitNullable(node.varArg)); @@ -748,7 +748,7 @@ public Object visit(ArgumentsTy node) { @Override public Object visit(ArgTy node) { - PythonObject o = factory.createPythonObject(state.clsArgTy); + PythonObject o = createPythonObject(state.clsArgTy); o.setAttribute(AstState.T_F_ARG, visitNonNull(node.arg)); o.setAttribute(AstState.T_F_ANNOTATION, visitNullable(node.annotation)); o.setAttribute(AstState.T_F_TYPE_COMMENT, visitNullableStringOrByteArray(node.typeComment)); @@ -758,7 +758,7 @@ public Object visit(ArgTy node) { @Override public Object visit(KeywordTy node) { - PythonObject o = factory.createPythonObject(state.clsKeywordTy); + PythonObject o = createPythonObject(state.clsKeywordTy); o.setAttribute(AstState.T_F_ARG, visitNullable(node.arg)); o.setAttribute(AstState.T_F_VALUE, visitNonNull(node.value)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -767,7 +767,7 @@ public Object visit(KeywordTy node) { @Override public Object visit(AliasTy node) { - PythonObject o = factory.createPythonObject(state.clsAliasTy); + PythonObject o = createPythonObject(state.clsAliasTy); o.setAttribute(AstState.T_F_NAME, visitNonNull(node.name)); o.setAttribute(AstState.T_F_ASNAME, visitNullable(node.asName)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -776,7 +776,7 @@ public Object visit(AliasTy node) { @Override public Object visit(WithItemTy node) { - PythonObject o = factory.createPythonObject(state.clsWithItemTy); + PythonObject o = createPythonObject(state.clsWithItemTy); o.setAttribute(AstState.T_F_CONTEXT_EXPR, visitNonNull(node.contextExpr)); o.setAttribute(AstState.T_F_OPTIONAL_VARS, visitNullable(node.optionalVars)); return o; @@ -784,7 +784,7 @@ public Object visit(WithItemTy node) { @Override public Object visit(MatchCaseTy node) { - PythonObject o = factory.createPythonObject(state.clsMatchCaseTy); + PythonObject o = createPythonObject(state.clsMatchCaseTy); o.setAttribute(AstState.T_F_PATTERN, visitNonNull(node.pattern)); o.setAttribute(AstState.T_F_GUARD, visitNullable(node.guard)); o.setAttribute(AstState.T_F_BODY, seq2List(node.body)); @@ -793,7 +793,7 @@ public Object visit(MatchCaseTy node) { @Override public Object visit(PatternTy.MatchValue node) { - PythonObject o = factory.createPythonObject(state.clsMatchValue); + PythonObject o = createPythonObject(state.clsMatchValue); o.setAttribute(AstState.T_F_VALUE, visitNonNull(node.value)); fillSourceRangeAttributes(o, node.getSourceRange()); return o; @@ -801,7 +801,7 @@ public Object visit(PatternTy.MatchValue node) { @Override public Object visit(PatternTy.MatchSingleton node) { - PythonObject o = factory.createPythonObject(state.clsMatchSingleton); + PythonObject o = createPythonObject(state.clsMatchSingleton); o.setAttribute(AstState.T_F_VALUE, visitNonNull(node.value)); fillSourceRangeAttributes(o, node.getSourceRange()); return o; @@ -809,7 +809,7 @@ public Object visit(PatternTy.MatchSingleton node) { @Override public Object visit(PatternTy.MatchSequence node) { - PythonObject o = factory.createPythonObject(state.clsMatchSequence); + PythonObject o = createPythonObject(state.clsMatchSequence); o.setAttribute(AstState.T_F_PATTERNS, seq2List(node.patterns)); fillSourceRangeAttributes(o, node.getSourceRange()); return o; @@ -817,7 +817,7 @@ public Object visit(PatternTy.MatchSequence node) { @Override public Object visit(PatternTy.MatchMapping node) { - PythonObject o = factory.createPythonObject(state.clsMatchMapping); + PythonObject o = createPythonObject(state.clsMatchMapping); o.setAttribute(AstState.T_F_KEYS, seq2List(node.keys)); o.setAttribute(AstState.T_F_PATTERNS, seq2List(node.patterns)); o.setAttribute(AstState.T_F_REST, visitNullable(node.rest)); @@ -827,7 +827,7 @@ public Object visit(PatternTy.MatchMapping node) { @Override public Object visit(PatternTy.MatchClass node) { - PythonObject o = factory.createPythonObject(state.clsMatchClass); + PythonObject o = createPythonObject(state.clsMatchClass); o.setAttribute(AstState.T_F_CLS, visitNonNull(node.cls)); o.setAttribute(AstState.T_F_PATTERNS, seq2List(node.patterns)); o.setAttribute(AstState.T_F_KWD_ATTRS, seq2List(node.kwdAttrs)); @@ -838,7 +838,7 @@ public Object visit(PatternTy.MatchClass node) { @Override public Object visit(PatternTy.MatchStar node) { - PythonObject o = factory.createPythonObject(state.clsMatchStar); + PythonObject o = createPythonObject(state.clsMatchStar); o.setAttribute(AstState.T_F_NAME, visitNullable(node.name)); fillSourceRangeAttributes(o, node.getSourceRange()); return o; @@ -846,7 +846,7 @@ public Object visit(PatternTy.MatchStar node) { @Override public Object visit(PatternTy.MatchAs node) { - PythonObject o = factory.createPythonObject(state.clsMatchAs); + PythonObject o = createPythonObject(state.clsMatchAs); o.setAttribute(AstState.T_F_PATTERN, visitNullable(node.pattern)); o.setAttribute(AstState.T_F_NAME, visitNullable(node.name)); fillSourceRangeAttributes(o, node.getSourceRange()); @@ -855,7 +855,7 @@ public Object visit(PatternTy.MatchAs node) { @Override public Object visit(PatternTy.MatchOr node) { - PythonObject o = factory.createPythonObject(state.clsMatchOr); + PythonObject o = createPythonObject(state.clsMatchOr); o.setAttribute(AstState.T_F_PATTERNS, seq2List(node.patterns)); fillSourceRangeAttributes(o, node.getSourceRange()); return o; @@ -863,7 +863,7 @@ public Object visit(PatternTy.MatchOr node) { @Override public Object visit(TypeIgnoreTy.TypeIgnore node) { - PythonObject o = factory.createPythonObject(state.clsTypeIgnore); + PythonObject o = createPythonObject(state.clsTypeIgnore); o.setAttribute(AstState.T_F_LINENO, visitNonNull(node.lineNo)); o.setAttribute(AstState.T_F_TAG, visitNonNullStringOrByteArray(node.tag)); return o; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Sst2ObjVisitorBase.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Sst2ObjVisitorBase.java index 9d106b646d..fe054561f2 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Sst2ObjVisitorBase.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Sst2ObjVisitorBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,15 +46,17 @@ import static com.oracle.graal.python.builtins.modules.ast.AstState.T_F_LINENO; import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.object.PythonObject; +import com.oracle.graal.python.builtins.objects.type.PythonClass; import com.oracle.graal.python.pegparser.sst.CmpOpTy; import com.oracle.graal.python.pegparser.sst.ConstantValue; import com.oracle.graal.python.pegparser.sst.SSTNode; import com.oracle.graal.python.pegparser.sst.SSTreeVisitor; import com.oracle.graal.python.pegparser.tokenizer.SourceRange; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.strings.TruffleString; @@ -63,10 +65,10 @@ */ abstract class Sst2ObjVisitorBase implements SSTreeVisitor { - final PythonObjectFactory factory; + final PythonLanguage language; Sst2ObjVisitorBase() { - factory = PythonObjectFactory.getUncached(); + language = PythonLanguage.get(null); } static int visitNullable(int i) { @@ -106,11 +108,11 @@ Object visitNonNullStringOrByteArray(Object o) { return toTruffleStringUncached((String) o); } assert o instanceof byte[]; - return factory.createBytes((byte[]) o); + return PFactory.createBytes(language, (byte[]) o); } final Object visitNonNull(ConstantValue v) { - return PythonUtils.pythonObjectFromConstantValue(v, factory); + return PythonUtils.pythonObjectFromConstantValue(v); } abstract Object visitNonNull(CmpOpTy op); @@ -121,41 +123,45 @@ final Object visitNonNull(SSTNode node) { final PList seq2List(String[] seq) { if (seq == null || seq.length == 0) { - return factory.createList(); + return PFactory.createList(language); } Object[] objs = new Object[seq.length]; for (int i = 0; i < objs.length; ++i) { objs[i] = visitNullable(seq[i]); } - return factory.createList(objs); + return PFactory.createList(language, objs); } final PList seq2List(CmpOpTy[] seq) { if (seq == null || seq.length == 0) { - return factory.createList(); + return PFactory.createList(language); } Object[] objs = new Object[seq.length]; for (int i = 0; i < objs.length; ++i) { objs[i] = visitNullable(seq[i]); } - return factory.createList(objs); + return PFactory.createList(language, objs); } final PList seq2List(SSTNode[] seq) { if (seq == null || seq.length == 0) { - return factory.createList(); + return PFactory.createList(language); } Object[] objs = new Object[seq.length]; for (int i = 0; i < objs.length; ++i) { objs[i] = visitNullable(seq[i]); } - return factory.createList(objs); + return PFactory.createList(language, objs); } - static final void fillSourceRangeAttributes(PythonObject o, SourceRange sourceRange) { + static void fillSourceRangeAttributes(PythonObject o, SourceRange sourceRange) { o.setAttribute(T_F_LINENO, sourceRange.startLine); o.setAttribute(T_F_COL_OFFSET, sourceRange.startColumn); o.setAttribute(T_F_END_LINENO, sourceRange.endLine); o.setAttribute(T_F_END_COL_OFFSET, sourceRange.endColumn); } + + protected PythonObject createPythonObject(PythonClass cls) { + return PFactory.createPythonObject(language, cls, cls.getInstanceShape()); + } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Validator.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Validator.java index 0c6265010d..c6259fbf05 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Validator.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Validator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -93,13 +93,17 @@ import com.oracle.graal.python.pegparser.sst.UnaryOpTy; import com.oracle.graal.python.pegparser.sst.WithItemTy; import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; final class Validator implements SSTreeVisitor { private static final String[] FORBIDDEN_NAMES = {"None", "True", "False"}; - private Validator() { + private final Node node; + + private Validator(Node node) { + this.node = node; } /*- @@ -107,9 +111,9 @@ private Validator() { */ // Equivalent of _PyAST_Validate - entry point of the validation - static void validateMod(ModTy mod) { + static void validateMod(Node node, ModTy mod) { // TODO recursion checks - mod.accept(new Validator()); + mod.accept(new Validator(node)); } @Override @@ -754,7 +758,7 @@ private void validatePatternMatchValue(ExprTy expr) { throw raiseValueError(ErrorMessages.PATTERNS_MAY_ONLY_MATCH_LITERALS_AND_ATTRIBUTE_LOOKUPS); } - private static void validateCapture(String name) { + private void validateCapture(String name) { if (name.equals("_")) { throw raiseValueError(ErrorMessages.CANT_CAPTURE_NAME_UNDERSCORE_IN_PATTERNS); } @@ -1023,7 +1027,7 @@ private void validateAssignList(ExprTy[] targets, ExprContextTy ctx) { } // Equivalent of _validate_nonempty_seq - private static void validateNonEmptySeq(Object[] seq, TruffleString what, TruffleString owner) { + private void validateNonEmptySeq(Object[] seq, TruffleString what, TruffleString owner) { if (seqLen(seq) == 0) { throw raiseValueError(ErrorMessages.EMPTY_S_ON_S, what, owner); } @@ -1049,7 +1053,7 @@ private static int seqLen(Object[] seq) { } // Equivalent of validate_name - private static void validateName(String id) { + private void validateName(String id) { for (String f : FORBIDDEN_NAMES) { if (f.equals(id)) { throw raiseValueError(ErrorMessages.IDENTIFIER_FIELD_CANT_REPRESENT_S_CONSTANT, f); @@ -1062,11 +1066,11 @@ private void validateConstant(@SuppressWarnings("unused") ConstantValue value) { // Already done in Obj2SstBase#obj2ConstantValue() } - private static PException raiseValueError(TruffleString format, Object... args) { - throw PRaiseNode.getUncached().raise(PythonBuiltinClassType.ValueError, format, args); + private PException raiseValueError(TruffleString format, Object... args) { + throw PRaiseNode.raiseStatic(node, PythonBuiltinClassType.ValueError, format, args); } - private static PException raiseTypeError(TruffleString format, Object... args) { - throw PRaiseNode.getUncached().raise(PythonBuiltinClassType.TypeError, format, args); + private PException raiseTypeError(TruffleString format, Object... args) { + throw PRaiseNode.raiseStatic(node, PythonBuiltinClassType.TypeError, format, args); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/bz2/BZ2CompressorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/bz2/BZ2CompressorBuiltins.java index f63ae127f2..d97282f490 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/bz2/BZ2CompressorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/bz2/BZ2CompressorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,12 +47,15 @@ import static com.oracle.graal.python.nodes.ErrorMessages.COMPRESSLEVEL_MUST_BE_BETWEEN_1_AND_9; import static com.oracle.graal.python.nodes.ErrorMessages.COMPRESSOR_HAS_BEEN_FLUSHED; import static com.oracle.graal.python.nodes.ErrorMessages.REPEATED_CALL_TO_FLUSH; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltins; @@ -61,8 +64,10 @@ import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.bytes.PBytesLike; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; @@ -71,7 +76,7 @@ import com.oracle.graal.python.runtime.NFIBz2Support; import com.oracle.graal.python.runtime.NativeLibrary; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; @@ -84,12 +89,28 @@ @CoreFunctions(extendClasses = BZ2Compressor) public final class BZ2CompressorBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = BZ2CompressorBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return BZ2CompressorBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, parameterNames = {"$self", "compresslevel"}) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "BZ2Compressor", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class BZ2CompressorNode extends PythonBuiltinNode { + @Specialization + static BZ2Object.BZ2Compressor doNew(@SuppressWarnings("unused") Object cls, @SuppressWarnings("unused") Object arg, + @Bind PythonLanguage language) { + // data filled in subsequent __init__ call - see BZ2CompressorBuiltins.InitNode + return PFactory.createBZ2Compressor(language); + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "BZ2Compressor", minNumOfPositionalArgs = 1, parameterNames = {"$self", "compresslevel"}) @ArgumentClinic(name = "compresslevel", conversion = ClinicConversion.Int, defaultValue = "9", useDefaultForNone = true) @GenerateNodeFactory public abstract static class InitNode extends PythonBinaryClinicBuiltinNode { @@ -105,14 +126,14 @@ PNone init(BZ2Object.BZ2Compressor self, int compresslevel, @Cached NativeLibrary.InvokeNativeFunction createStream, @Cached NativeLibrary.InvokeNativeFunction compressInit, @Cached GilNode gil, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { gil.release(true); try { NFIBz2Support bz2Support = PythonContext.get(this).getNFIBz2Support(); Object bzst = bz2Support.createStream(createStream); int err = bz2Support.compressInit(bzst, compresslevel, compressInit); if (err != BZ_OK) { - errorHandling(err, raiseNode.get(inliningTarget)); + errorHandling(inliningTarget, err, raiseNode); } self.init(bzst, bz2Support); return PNone.NONE; @@ -124,8 +145,8 @@ PNone init(BZ2Object.BZ2Compressor self, int compresslevel, @SuppressWarnings("unused") @Fallback static Object err(Object self, Object compresslevel, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, COMPRESSLEVEL_MUST_BE_BETWEEN_1_AND_9); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, COMPRESSLEVEL_MUST_BE_BETWEEN_1_AND_9); } } @@ -134,31 +155,32 @@ static Object err(Object self, Object compresslevel, abstract static class CompressNode extends PythonBinaryBuiltinNode { @Specialization(guards = {"!self.isFlushed()"}) - PBytes doNativeBytes(BZ2Object.BZ2Compressor self, PBytesLike data, + static PBytes doNativeBytes(BZ2Object.BZ2Compressor self, PBytesLike data, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached SequenceStorageNodes.GetInternalByteArrayNode toBytes, - @Shared("c") @Cached Bz2Nodes.Bz2NativeCompress compress, - @Shared @Cached PythonObjectFactory factory) { + @Shared("c") @Cached Bz2Nodes.Bz2NativeCompress compress) { byte[] bytes = toBytes.execute(inliningTarget, data.getSequenceStorage()); int len = data.getSequenceStorage().length(); - return factory.createBytes(compress.compress(self, PythonContext.get(this), bytes, len)); + return PFactory.createBytes(context.getLanguage(inliningTarget), compress.compress(self, context, bytes, len)); } @Specialization(guards = {"!self.isFlushed()"}) - PBytes doNativeObject(VirtualFrame frame, BZ2Object.BZ2Compressor self, Object data, + static PBytes doNativeObject(VirtualFrame frame, BZ2Object.BZ2Compressor self, Object data, + @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached BytesNodes.ToBytesNode toBytes, - @Shared("c") @Cached Bz2Nodes.Bz2NativeCompress compress, - @Shared @Cached PythonObjectFactory factory) { + @Shared("c") @Cached Bz2Nodes.Bz2NativeCompress compress) { byte[] bytes = toBytes.execute(frame, data); int len = bytes.length; - return factory.createBytes(compress.compress(self, PythonContext.get(this), bytes, len)); + return PFactory.createBytes(context.getLanguage(inliningTarget), compress.compress(self, context, bytes, len)); } @SuppressWarnings("unused") @Specialization(guards = "self.isFlushed()") static PNone error(BZ2Object.BZ2Compressor self, Object data, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, COMPRESSOR_HAS_BEEN_FLUSHED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, COMPRESSOR_HAS_BEEN_FLUSHED); } } @@ -167,18 +189,19 @@ static PNone error(BZ2Object.BZ2Compressor self, Object data, abstract static class FlushNode extends PythonUnaryBuiltinNode { @Specialization(guards = {"!self.isFlushed()"}) - PBytes doit(BZ2Object.BZ2Compressor self, - @Cached Bz2Nodes.Bz2NativeCompress compress, - @Cached PythonObjectFactory factory) { + static PBytes doit(BZ2Object.BZ2Compressor self, + @Bind("this") Node inliningTarget, + @Bind PythonContext context, + @Cached Bz2Nodes.Bz2NativeCompress compress) { self.setFlushed(); - return factory.createBytes(compress.flush(self, PythonContext.get(this))); + return PFactory.createBytes(context.getLanguage(inliningTarget), compress.flush(self, context)); } @SuppressWarnings("unused") @Specialization(guards = "self.isFlushed()") static PNone error(BZ2Object.BZ2Compressor self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, REPEATED_CALL_TO_FLUSH); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, REPEATED_CALL_TO_FLUSH); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/bz2/BZ2DecompressorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/bz2/BZ2DecompressorBuiltins.java index 502e057287..2b7a14f087 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/bz2/BZ2DecompressorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/bz2/BZ2DecompressorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,11 +45,14 @@ import static com.oracle.graal.python.builtins.modules.bz2.Bz2Nodes.BZ_OK; import static com.oracle.graal.python.builtins.modules.bz2.Bz2Nodes.errorHandling; import static com.oracle.graal.python.nodes.ErrorMessages.END_OF_STREAM_ALREADY_REACHED; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltins; @@ -58,19 +61,20 @@ import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.bytes.PBytesLike; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.runtime.NFIBz2Support; import com.oracle.graal.python.runtime.NativeLibrary; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; @@ -79,12 +83,28 @@ @CoreFunctions(extendClasses = BZ2Decompressor) public final class BZ2DecompressorBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = BZ2DecompressorBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return BZ2DecompressorBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, parameterNames = {"$self"}) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "BZ2Decompressor", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class BZ2DecompressorNode extends PythonBuiltinNode { + @Specialization + static BZ2Object.BZ2Decompressor doNew(@SuppressWarnings("unused") Object cls, @SuppressWarnings("unused") Object arg, + @Bind PythonLanguage language) { + // data filled in subsequent __init__ call - see BZ2DecompressorBuiltins.InitNode + return PFactory.createBZ2Decompressor(language); + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "BZDecompressor", minNumOfPositionalArgs = 1, parameterNames = {"$self"}) @GenerateNodeFactory public abstract static class InitNode extends PythonUnaryBuiltinNode { @@ -93,12 +113,12 @@ static PNone init(BZ2Object.BZ2Decompressor self, @Bind("this") Node inliningTarget, @Cached NativeLibrary.InvokeNativeFunction createStream, @Cached NativeLibrary.InvokeNativeFunction compressInit, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { NFIBz2Support bz2Support = PythonContext.get(inliningTarget).getNFIBz2Support(); Object bzst = bz2Support.createStream(createStream); int err = bz2Support.decompressInit(bzst, compressInit); if (err != BZ_OK) { - errorHandling(err, raiseNode.get(inliningTarget)); + errorHandling(inliningTarget, err, raiseNode); } self.init(bzst, bz2Support); return PNone.NONE; @@ -118,34 +138,34 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(guards = {"!self.isEOF()"}) static PBytes doNativeBytes(BZ2Object.BZ2Decompressor self, PBytesLike data, int maxLength, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached SequenceStorageNodes.GetInternalByteArrayNode toBytes, - @Exclusive @Cached Bz2Nodes.Bz2NativeDecompress decompress, - @Shared @Cached PythonObjectFactory factory) { + @Exclusive @Cached Bz2Nodes.Bz2NativeDecompress decompress) { synchronized (self) { byte[] bytes = toBytes.execute(inliningTarget, data.getSequenceStorage()); int len = data.getSequenceStorage().length(); - return factory.createBytes(decompress.execute(inliningTarget, self, bytes, len, maxLength)); + return PFactory.createBytes(language, decompress.execute(inliningTarget, self, bytes, len, maxLength)); } } @Specialization(guards = {"!self.isEOF()"}) static PBytes doNativeObject(VirtualFrame frame, BZ2Object.BZ2Decompressor self, Object data, int maxLength, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached BytesNodes.ToBytesNode toBytes, - @Exclusive @Cached Bz2Nodes.Bz2NativeDecompress decompress, - @Shared @Cached PythonObjectFactory factory) { + @Exclusive @Cached Bz2Nodes.Bz2NativeDecompress decompress) { synchronized (self) { byte[] bytes = toBytes.execute(frame, data); int len = bytes.length; - return factory.createBytes(decompress.execute(inliningTarget, self, bytes, len, maxLength)); + return PFactory.createBytes(language, decompress.execute(inliningTarget, self, bytes, len, maxLength)); } } @SuppressWarnings("unused") @Specialization(guards = {"self.isEOF()"}) static Object err(BZ2Object.BZ2Decompressor self, PBytesLike data, int maxLength, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(EOFError, END_OF_STREAM_ALREADY_REACHED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, EOFError, END_OF_STREAM_ALREADY_REACHED); } } @@ -154,8 +174,8 @@ static Object err(BZ2Object.BZ2Decompressor self, PBytesLike data, int maxLength abstract static class UnusedDataNode extends PythonUnaryBuiltinNode { @Specialization static PBytes doit(BZ2Object.BZ2Decompressor self, - @Cached PythonObjectFactory factory) { - return factory.createBytes(self.getUnusedData()); + @Bind PythonLanguage language) { + return PFactory.createBytes(language, self.getUnusedData()); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/bz2/BZ2ModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/bz2/BZ2ModuleBuiltins.java index 4d72367d0d..6ac3c04334 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/bz2/BZ2ModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/bz2/BZ2ModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,57 +40,19 @@ */ package com.oracle.graal.python.builtins.modules.bz2; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.BZ2Compressor; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.BZ2Decompressor; - +import java.util.Collections; import java.util.List; -import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.nodes.BuiltinNames; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; -import com.oracle.truffle.api.dsl.Specialization; @CoreFunctions(defineModule = BuiltinNames.J_BZ2) public final class BZ2ModuleBuiltins extends PythonBuiltins { @Override protected List> getNodeFactories() { - return BZ2ModuleBuiltinsFactory.getFactories(); - } - - protected static final int INITIAL_BUFFER_SIZE = 8192; - - @Override - public void initialize(Python3Core core) { - super.initialize(core); - } - - @Builtin(name = "BZ2Compressor", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = BZ2Compressor) - @GenerateNodeFactory - public abstract static class BZ2CompressorNode extends PythonBuiltinNode { - @Specialization - static BZ2Object.BZ2Compressor doNew(Object cls, @SuppressWarnings("unused") Object arg, - @Cached PythonObjectFactory factory) { - // data filled in subsequent __init__ call - see BZ2CompressorBuiltins.InitNode - return factory.createBZ2Compressor(cls); - } - } - - @Builtin(name = "BZ2Decompressor", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = BZ2Decompressor) - @GenerateNodeFactory - public abstract static class BZ2DecompressorNode extends PythonBuiltinNode { - @Specialization - static BZ2Object.BZ2Decompressor doNew(Object cls, @SuppressWarnings("unused") Object arg, - @Cached PythonObjectFactory factory) { - // data filled in subsequent __init__ call - see BZ2DecompressorBuiltins.InitNode - return factory.createBZ2Decompressor(cls); - } + return Collections.emptyList(); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/bz2/Bz2Nodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/bz2/Bz2Nodes.java index dcc065e578..4e3a527479 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/bz2/Bz2Nodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/bz2/Bz2Nodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,7 +42,6 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.EOFError; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError; -import static com.oracle.graal.python.builtins.modules.bz2.BZ2ModuleBuiltins.INITIAL_BUFFER_SIZE; import static com.oracle.graal.python.nodes.ErrorMessages.COMPRESSED_FILE_ENDED_BEFORE_EOS; import static com.oracle.graal.python.nodes.ErrorMessages.INVALID_DATA_STREAM; import static com.oracle.graal.python.nodes.ErrorMessages.INVALID_PARAMETERS_PASSED_TO_LIBBZIP2; @@ -94,6 +93,8 @@ public class Bz2Nodes { protected static final int BZ_OUTBUFF_FULL = (-8); protected static final int BZ_CONFIG_ERROR = (-9); + protected static final int INITIAL_BUFFER_SIZE = 8192; + @SuppressWarnings("truffle-inlining") // footprint reduction 40 -> 21 public abstract static class Bz2NativeCompress extends Node { @@ -112,12 +113,12 @@ static byte[] nativeCompress(BZ2Object.BZ2Compressor self, PythonContext context @Bind("this") Node inliningTarget, @Cached NativeLibrary.InvokeNativeFunction compress, @Cached GetOutputNativeBufferNode getBuffer, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { NFIBz2Support bz2Support = context.getNFIBz2Support(); Object inGuest = context.getEnv().asGuestValue(bytes); int err = bz2Support.compress(self.getBzs(), inGuest, len, action, INITIAL_BUFFER_SIZE, compress); if (err != BZ_OK) { - errorHandling(err, raiseNode.get(inliningTarget)); + errorHandling(inliningTarget, err, raiseNode); } return getBuffer.execute(inliningTarget, self.getBzs(), context); } @@ -236,7 +237,7 @@ static byte[] nativeInternalDecompress(BZ2Object.BZ2Decompressor self, int maxLe @Cached GetOutputNativeBufferNode getBuffer, @Cached InlinedConditionProfile errProfile, @Cached InlinedBranchProfile ofProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { PythonContext context = PythonContext.get(inliningTarget); NFIBz2Support bz2Support = context.getNFIBz2Support(); Object inGuest = self.getNextInGuest(context); @@ -249,12 +250,12 @@ static byte[] nativeInternalDecompress(BZ2Object.BZ2Decompressor self, int maxLe self.setBzsAvailInReal(bzsAvailInReal); } catch (OverflowException of) { ofProfile.enter(inliningTarget); - throw raiseNode.get(inliningTarget).raise(SystemError, VALUE_TOO_LARGE_TO_FIT_INTO_INDEX); + throw raiseNode.raise(inliningTarget, SystemError, VALUE_TOO_LARGE_TO_FIT_INTO_INDEX); } if (err == BZ_STREAM_END) { self.setEOF(); } else if (errProfile.profile(inliningTarget, err != BZ_OK)) { - errorHandling(err, raiseNode.get(inliningTarget)); + errorHandling(inliningTarget, err, raiseNode); } return getBuffer.execute(inliningTarget, self.getBzs(), context); } @@ -271,14 +272,14 @@ static byte[] getBuffer(Node inliningTarget, Object bzst, PythonContext context, @Cached(inline = false) NativeLibrary.InvokeNativeFunction getBufferSize, @Cached(inline = false) NativeLibrary.InvokeNativeFunction getBuffer, @Cached InlinedBranchProfile ofProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { NFIBz2Support bz2Support = context.getNFIBz2Support(); int size; try { size = PInt.intValueExact(bz2Support.getOutputBufferSize(bzst, getBufferSize)); } catch (OverflowException of) { ofProfile.enter(inliningTarget); - throw raiseNode.get(inliningTarget).raise(SystemError, VALUE_TOO_LARGE_TO_FIT_INTO_INDEX); + throw raiseNode.raise(inliningTarget, SystemError, VALUE_TOO_LARGE_TO_FIT_INTO_INDEX); } if (size == 0) { return PythonUtils.EMPTY_BYTE_ARRAY; @@ -291,25 +292,25 @@ static byte[] getBuffer(Node inliningTarget, Object bzst, PythonContext context, } } - protected static void errorHandling(int bzerror, PRaiseNode raise) { + protected static void errorHandling(Node inliningTarget, int bzerror, PRaiseNode raise) { switch (bzerror) { case BZ_PARAM_ERROR: - throw raise.raise(ValueError, INVALID_PARAMETERS_PASSED_TO_LIBBZIP2); + throw raise.raise(inliningTarget, ValueError, INVALID_PARAMETERS_PASSED_TO_LIBBZIP2); case BZ_MEM_ERROR: - throw raise.raise(MemoryError); + throw raise.raise(inliningTarget, MemoryError); case BZ_DATA_ERROR: case BZ_DATA_ERROR_MAGIC: - throw raise.raise(OSError, INVALID_DATA_STREAM); + throw raise.raise(inliningTarget, OSError, INVALID_DATA_STREAM); case BZ_IO_ERROR: - throw raise.raise(OSError, UNKNOWN_IO_ERROR); + throw raise.raise(inliningTarget, OSError, UNKNOWN_IO_ERROR); case BZ_UNEXPECTED_EOF: - throw raise.raise(EOFError, COMPRESSED_FILE_ENDED_BEFORE_EOS); + throw raise.raise(inliningTarget, EOFError, COMPRESSED_FILE_ENDED_BEFORE_EOS); case BZ_SEQUENCE_ERROR: - throw raise.raise(RuntimeError, INVALID_SEQUENCE_OF_COMMANDS); + throw raise.raise(inliningTarget, RuntimeError, INVALID_SEQUENCE_OF_COMMANDS); case BZ_CONFIG_ERROR: - throw raise.raise(ValueError, LIBBZIP2_WAS_NOT_COMPILED_CORRECTLY); + throw raise.raise(inliningTarget, ValueError, LIBBZIP2_WAS_NOT_COMPILED_CORRECTLY); default: - throw raise.raise(OSError, UNRECOGNIZED_ERROR_FROM_LIBBZIP2_D, bzerror); + throw raise.raise(inliningTarget, OSError, UNRECOGNIZED_ERROR_FROM_LIBBZIP2_D, bzerror); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextAbstractBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextAbstractBuiltins.java index 1a776fbc27..ca111c38f4 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextAbstractBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextAbstractBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -60,18 +60,10 @@ import static com.oracle.graal.python.nodes.SpecialMethodNames.T_KEYS; import static com.oracle.graal.python.nodes.SpecialMethodNames.T_VALUES; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IADD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IMUL__; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.StrNode; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.TupleNode; -import com.oracle.graal.python.builtins.modules.BuiltinFunctions.AbsNode; import com.oracle.graal.python.builtins.modules.BuiltinFunctions.BinNode; -import com.oracle.graal.python.builtins.modules.BuiltinFunctions.DivModNode; import com.oracle.graal.python.builtins.modules.BuiltinFunctions.HexNode; -import com.oracle.graal.python.builtins.modules.BuiltinFunctions.NextNode; import com.oracle.graal.python.builtins.modules.BuiltinFunctions.OctNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; @@ -82,7 +74,6 @@ import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AsCharPointerNode; -import com.oracle.graal.python.builtins.objects.cext.capi.PrimitiveNativeWrapper; import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CStringWrapper; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.ItemsNode; @@ -95,25 +86,58 @@ import com.oracle.graal.python.builtins.objects.iterator.IteratorNodes; import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; +import com.oracle.graal.python.builtins.objects.slice.PSlice; +import com.oracle.graal.python.builtins.objects.str.StringBuiltins; +import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins.TupleNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode; -import com.oracle.graal.python.lib.GetNextNode; -import com.oracle.graal.python.lib.PyIndexCheckNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotMpAssSubscript.CallSlotMpAssSubscriptNode; +import com.oracle.graal.python.lib.IteratorExhausted; import com.oracle.graal.python.lib.PyIterCheckNode; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyNumberAddNode; -import com.oracle.graal.python.lib.PyNumberCheckNode; +import com.oracle.graal.python.lib.PyNumberAndNode; +import com.oracle.graal.python.lib.PyNumberDivmodNode; import com.oracle.graal.python.lib.PyNumberFloatNode; +import com.oracle.graal.python.lib.PyNumberFloorDivideNode; +import com.oracle.graal.python.lib.PyNumberInPlaceAddNode; +import com.oracle.graal.python.lib.PyNumberInPlaceAndNode; +import com.oracle.graal.python.lib.PyNumberInPlaceFloorDivideNode; +import com.oracle.graal.python.lib.PyNumberInPlaceLshiftNode; +import com.oracle.graal.python.lib.PyNumberInPlaceMatrixMultiplyNode; +import com.oracle.graal.python.lib.PyNumberInPlaceMultiplyNode; +import com.oracle.graal.python.lib.PyNumberInPlaceOrNode; +import com.oracle.graal.python.lib.PyNumberInPlacePowerNode; +import com.oracle.graal.python.lib.PyNumberInPlaceRemainderNode; +import com.oracle.graal.python.lib.PyNumberInPlaceRshiftNode; +import com.oracle.graal.python.lib.PyNumberInPlaceSubtractNode; +import com.oracle.graal.python.lib.PyNumberInPlaceTrueDivideNode; +import com.oracle.graal.python.lib.PyNumberInPlaceXorNode; import com.oracle.graal.python.lib.PyNumberIndexNode; +import com.oracle.graal.python.lib.PyNumberLongNode; +import com.oracle.graal.python.lib.PyNumberLshiftNode; +import com.oracle.graal.python.lib.PyNumberMatrixMultiplyNode; import com.oracle.graal.python.lib.PyNumberMultiplyNode; +import com.oracle.graal.python.lib.PyNumberOrNode; +import com.oracle.graal.python.lib.PyNumberPowerNode; +import com.oracle.graal.python.lib.PyNumberRemainderNode; +import com.oracle.graal.python.lib.PyNumberRshiftNode; +import com.oracle.graal.python.lib.PyNumberSubtractNode; +import com.oracle.graal.python.lib.PyNumberTrueDivideNode; +import com.oracle.graal.python.lib.PyNumberXorNode; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.lib.PyObjectGetItem; import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.lib.PySequenceCheckNode; -import com.oracle.graal.python.lib.PySequenceConcat; +import com.oracle.graal.python.lib.PySequenceConcatNode; import com.oracle.graal.python.lib.PySequenceContainsNode; import com.oracle.graal.python.lib.PySequenceDelItemNode; import com.oracle.graal.python.lib.PySequenceGetItemNode; +import com.oracle.graal.python.lib.PySequenceInPlaceConcatNode; +import com.oracle.graal.python.lib.PySequenceInPlaceRepeatNode; import com.oracle.graal.python.lib.PySequenceIterSearchNode; import com.oracle.graal.python.lib.PySequenceSetItemNode; import com.oracle.graal.python.lib.PySequenceSizeNode; @@ -123,20 +147,11 @@ import com.oracle.graal.python.nodes.attributes.WriteAttributeToPythonObjectNode; import com.oracle.graal.python.nodes.builtins.ListNodes.ConstructListNode; import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallTernaryNode; -import com.oracle.graal.python.nodes.expression.BinaryArithmetic; -import com.oracle.graal.python.nodes.expression.BinaryOpNode; -import com.oracle.graal.python.nodes.expression.InplaceArithmetic; -import com.oracle.graal.python.nodes.expression.LookupAndCallInplaceNode; -import com.oracle.graal.python.nodes.expression.TernaryArithmetic; -import com.oracle.graal.python.nodes.expression.UnaryArithmetic; -import com.oracle.graal.python.nodes.expression.UnaryOpNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.truffle.PythonTypes; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.graal.python.runtime.exception.PythonErrorType; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.TruffleLogger; import com.oracle.truffle.api.dsl.Bind; @@ -144,39 +159,15 @@ import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; -import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; public final class PythonCextAbstractBuiltins { - /////// PyIndex /////// - - @CApiBuiltin(ret = Int, args = {PyObject}, call = Direct) - abstract static class PyIndex_Check extends CApiUnaryBuiltinNode { - @Specialization - static Object check(Object obj, - @Bind("this") Node inliningTarget, - @Cached PyIndexCheckNode checkNode) { - return checkNode.execute(inliningTarget, obj) ? 1 : 0; - } - } - /////// PyNumber /////// - @CApiBuiltin(ret = Int, args = {PyObject}, call = Direct) - abstract static class PyNumber_Check extends CApiUnaryBuiltinNode { - @Specialization - static Object check(Object obj, - @Bind("this") Node inliningTarget, - @Cached PyNumberCheckNode checkNode) { - return PInt.intValue(checkNode.execute(inliningTarget, obj)); - } - } - @CApiBuiltin(name = "_PyNumber_Index", ret = PyObjectTransfer, args = {PyObject}, call = Direct) @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject}, call = Direct) abstract static class PyNumber_Index extends CApiUnaryBuiltinNode { @@ -184,7 +175,7 @@ abstract static class PyNumber_Index extends CApiUnaryBuiltinNode { static Object index(Object obj, @Bind("this") Node inliningTarget, @Cached PyNumberIndexNode indexNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { checkNonNullArg(inliningTarget, obj, raiseNode); return indexNode.execute(null, inliningTarget, obj); } @@ -194,37 +185,10 @@ static Object index(Object obj, abstract static class PyNumber_Long extends CApiUnaryBuiltinNode { @Specialization - static int nlong(int i) { - return i; - } - - @Specialization - static long nlong(long i) { - return i; - } - - @Fallback - static Object nlong(Object obj, - @Cached BuiltinConstructors.IntNode intNode) { - return intNode.executeWith(null, obj, PNone.NO_VALUE); - } - } - - @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject}, call = Direct) - abstract static class PyNumber_Absolute extends CApiUnaryBuiltinNode { - @Specialization - static Object abs(Object obj, - @Cached AbsNode absNode) { - return absNode.execute(null, obj); - } - } - - @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Direct) - abstract static class PyNumber_Divmod extends CApiBinaryBuiltinNode { - @Specialization - static Object div(Object a, Object b, - @Cached DivModNode divNode) { - return divNode.execute(null, a, b); + static Object nlong(Object object, + @Bind("this") Node inliningTarget, + @Cached PyNumberLongNode pyNumberLongNode) { + return pyNumberLongNode.execute(null, inliningTarget, object); } } @@ -249,7 +213,7 @@ static Object toBase(Object n, @SuppressWarnings("unused") int base, static Object toBase(Object n, @SuppressWarnings("unused") int base, @Bind("this") Node inliningTarget, @Shared @Cached PyNumberIndexNode indexNode, - @Cached StrNode strNode) { + @Cached StringBuiltins.StrNewNode strNode) { Object i = indexNode.execute(null, inliningTarget, n); if (i instanceof Boolean) { i = ((boolean) i) ? 1 : 0; @@ -267,8 +231,8 @@ static Object toBase(Object n, @SuppressWarnings("unused") int base, @Specialization(guards = "!checkBase(base)") static Object toBase(@SuppressWarnings("unused") Object n, @SuppressWarnings("unused") int base, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(SystemError, BASE_MUST_BE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, BASE_MUST_BE); } protected boolean checkBase(int base) { @@ -297,177 +261,273 @@ static Object doGeneric(Object object, } } - @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, Int}, call = Ignored) - abstract static class PyTruffleNumber_UnaryOp extends CApiBinaryBuiltinNode { - static int MAX_CACHE_SIZE = UnaryArithmetic.values().length; - - @Specialization(guards = {"cachedOp == op"}, limit = "MAX_CACHE_SIZE") - static Object doIntLikePrimitiveWrapper(Object left, @SuppressWarnings("unused") int op, - @Cached("op") @SuppressWarnings("unused") int cachedOp, - @Cached("createCallNode(op)") UnaryOpNode callNode) { - return callNode.executeCached(null, left); - } - - /** - * This needs to stay in sync with {@code abstract.c: enum e_unaryop}. - */ - static UnaryOpNode createCallNode(int op) { - UnaryArithmetic unaryArithmetic; - switch (op) { - case 0: - unaryArithmetic = UnaryArithmetic.Pos; - break; - case 1: - unaryArithmetic = UnaryArithmetic.Neg; - break; - case 2: - unaryArithmetic = UnaryArithmetic.Invert; - break; - default: - throw CompilerDirectives.shouldNotReachHere("invalid unary operator"); - } - return unaryArithmetic.create(); - } - } - - @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject, Int}, call = Ignored) - abstract static class PyTruffleNumber_BinOp extends CApiTernaryBuiltinNode { - static int MAX_CACHE_SIZE = BinaryArithmetic.values().length; - - @Specialization(guards = {"cachedOp == op"}, limit = "MAX_CACHE_SIZE") - static Object doIntLikePrimitiveWrapper(Object left, Object right, @SuppressWarnings("unused") int op, - @Cached("op") @SuppressWarnings("unused") int cachedOp, - @Cached("createCallNode(op)") BinaryOpNode callNode) { - return callNode.executeObject(null, left, right); - } - - /** - * This needs to stay in sync with {@code abstract.c: enum e_binop}. - */ - static BinaryOpNode createCallNode(int op) { - return getBinaryArithmetic(op).create(); - } - - private static BinaryArithmetic getBinaryArithmetic(int op) { - switch (op) { - case 0: - return BinaryArithmetic.Add; - case 1: - return BinaryArithmetic.Sub; - case 2: - return BinaryArithmetic.Mul; - case 3: - return BinaryArithmetic.TrueDiv; - case 4: - return BinaryArithmetic.LShift; - case 5: - return BinaryArithmetic.RShift; - case 6: - return BinaryArithmetic.Or; - case 7: - return BinaryArithmetic.And; - case 8: - return BinaryArithmetic.Xor; - case 9: - return BinaryArithmetic.FloorDiv; - case 10: - return BinaryArithmetic.Mod; - case 12: - return BinaryArithmetic.MatMul; - default: - throw CompilerDirectives.shouldNotReachHere("invalid binary operator"); - } + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_Add extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberAddNode addNode) { + return addNode.execute(null, o1, o2); } + } + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_Subtract extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberSubtractNode subtractNode) { + return subtractNode.execute(null, o1, o2); + } } - @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject, Int}, call = Ignored) - abstract static class PyTruffleNumber_InPlaceBinOp extends CApiTernaryBuiltinNode { - static int MAX_CACHE_SIZE = InplaceArithmetic.values().length; - - @Specialization(guards = {"cachedOp == op"}, limit = "MAX_CACHE_SIZE") - static Object doIntLikePrimitiveWrapper(Object left, Object right, @SuppressWarnings("unused") int op, - @Cached("op") @SuppressWarnings("unused") int cachedOp, - @Cached("createCallNode(op)") LookupAndCallInplaceNode callNode) { - return callNode.execute(null, left, right); - } - - /** - * This needs to stay in sync with {@code abstract.c: enum e_binop}. - */ - static LookupAndCallInplaceNode createCallNode(int op) { - return getInplaceArithmetic(op).create(); - } - - private static InplaceArithmetic getInplaceArithmetic(int op) { - switch (op) { - case 0: - return InplaceArithmetic.IAdd; - case 1: - return InplaceArithmetic.ISub; - case 2: - return InplaceArithmetic.IMul; - case 3: - return InplaceArithmetic.ITrueDiv; - case 4: - return InplaceArithmetic.ILShift; - case 5: - return InplaceArithmetic.IRShift; - case 6: - return InplaceArithmetic.IOr; - case 7: - return InplaceArithmetic.IAnd; - case 8: - return InplaceArithmetic.IXor; - case 9: - return InplaceArithmetic.IFloorDiv; - case 10: - return InplaceArithmetic.IMod; - case 12: - return InplaceArithmetic.IMatMul; - default: - throw CompilerDirectives.shouldNotReachHere("invalid binary operator"); - } + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_Multiply extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberMultiplyNode multiplyNode) { + return multiplyNode.execute(null, o1, o2); + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_Remainder extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberRemainderNode remainderNode) { + return remainderNode.execute(null, o1, o2); } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_TrueDivide extends CApiBinaryBuiltinNode { + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberTrueDivideNode trueDivideNode) { + return trueDivideNode.execute(null, o1, o2); + } } - @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject, PyObject}, call = Direct) - abstract static class PyNumber_InPlacePower extends CApiTernaryBuiltinNode { + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_FloorDivide extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberFloorDivideNode floorDivideNode) { + return floorDivideNode.execute(null, o1, o2); + } + } - @Specialization(guards = {"o1.isIntLike()", "o2.isIntLike()", "o3.isIntLike()"}) - static Object doIntLikePrimitiveWrapper(PrimitiveNativeWrapper o1, PrimitiveNativeWrapper o2, PrimitiveNativeWrapper o3, - @Shared @Cached("createIPow()") LookupAndCallInplaceNode callNode) { - return callNode.executeTernary(null, o1.getLong(), o2.getLong(), o3.getLong()); + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_Divmod extends CApiBinaryBuiltinNode { + @Specialization + static Object div(Object a, Object b, + @Bind Node inliningTarget, + @Cached PyNumberDivmodNode divmodNode) { + return divmodNode.execute(null, inliningTarget, a, b); } + } - @Specialization(replaces = "doIntLikePrimitiveWrapper") - static Object doGeneric(Object o1, Object o2, Object o3, - @Shared @Cached("createIPow()") LookupAndCallInplaceNode callNode) { - return callNode.executeTernary(null, o1, o2, o3); + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_And extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberAndNode andNode) { + return andNode.execute(null, o1, o2); } + } - @NeverDefault - static LookupAndCallInplaceNode createIPow() { - return InplaceArithmetic.IPow.create(); + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_Or extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberOrNode orNode) { + return orNode.execute(null, o1, o2); } } - @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject, PyObject}, call = Direct) - abstract static class PyNumber_Power extends CApiTernaryBuiltinNode { - @Child private LookupAndCallTernaryNode callNode; + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_Xor extends CApiBinaryBuiltinNode { @Specialization - Object doGeneric(Object o1, Object o2, Object o3) { - return ensureCallNode().execute(null, o1, o2, o3); + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberXorNode xorNode) { + return xorNode.execute(null, o1, o2); } + } - private LookupAndCallTernaryNode ensureCallNode() { - if (callNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - callNode = insert(TernaryArithmetic.Pow.create()); - } - return callNode; + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_Lshift extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberLshiftNode lshiftNode) { + return lshiftNode.execute(null, o1, o2); + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_Rshift extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberRshiftNode rshiftNode) { + return rshiftNode.execute(null, o1, o2); + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_MatrixMultiply extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberMatrixMultiplyNode matrixMultiplyNode) { + return matrixMultiplyNode.execute(null, o1, o2); + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_InPlaceAdd extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberInPlaceAddNode addNode) { + return addNode.execute(null, o1, o2); + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_InPlaceSubtract extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberInPlaceSubtractNode subtractNode) { + return subtractNode.execute(null, o1, o2); + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_InPlaceMultiply extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberInPlaceMultiplyNode multiplyNode) { + return multiplyNode.execute(null, o1, o2); + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_InPlaceRemainder extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberInPlaceRemainderNode remainderNode) { + return remainderNode.execute(null, o1, o2); + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_InPlaceTrueDivide extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberInPlaceTrueDivideNode trueDivideNode) { + return trueDivideNode.execute(null, o1, o2); + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_InPlaceFloorDivide extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberInPlaceFloorDivideNode floorDivideNode) { + return floorDivideNode.execute(null, o1, o2); + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_InPlaceAnd extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberInPlaceAndNode andNode) { + return andNode.execute(null, o1, o2); + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_InPlaceOr extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberInPlaceOrNode orNode) { + return orNode.execute(null, o1, o2); + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_InPlaceXor extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberInPlaceXorNode xorNode) { + return xorNode.execute(null, o1, o2); + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_InPlaceLshift extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberInPlaceLshiftNode lshiftNode) { + return lshiftNode.execute(null, o1, o2); + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_InPlaceRshift extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberInPlaceRshiftNode rshiftNode) { + return rshiftNode.execute(null, o1, o2); + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_InPlaceMatrixMultiply extends CApiBinaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, + @Cached PyNumberInPlaceMatrixMultiplyNode matrixMultiplyNode) { + return matrixMultiplyNode.execute(null, o1, o2); + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_InPlacePower extends CApiTernaryBuiltinNode { + + @Specialization + static Object doGeneric(Object o1, Object o2, Object o3, + @Cached PyNumberInPlacePowerNode powerNode) { + return powerNode.execute(null, o1, o2, o3); + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject, PyObject}, call = Ignored) + abstract static class PyTrufflePyNumber_Power extends CApiTernaryBuiltinNode { + + @Specialization + Object doGeneric(Object o1, Object o2, Object o3, + @Cached PyNumberPowerNode powerNode) { + return powerNode.execute(null, o1, o2, o3); } } @@ -505,15 +565,14 @@ static Object setItem(Object obj, long key, Object value, @Bind("this") Node inliningTarget, @Cached PySequenceSetItemNode setItemNode) { if ((int) key != key) { - throw PRaiseNode.raiseUncached(inliningTarget, OverflowError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, key); + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.OverflowError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, key); } - setItemNode.execute(obj, (int) key, value); + setItemNode.execute(null, inliningTarget, obj, (int) key, value); return 0; } } @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, Py_ssize_t, Py_ssize_t}, call = Direct) - @TypeSystemReference(PythonTypes.class) abstract static class PySequence_GetSlice extends CApiTernaryBuiltinNode { @Specialization(guards = "checkNode.execute(inliningTarget, obj)", limit = "1") @@ -529,10 +588,9 @@ static Object getSlice(Object obj, long iLow, long iHigh, @Specialization(guards = "!checkNode.execute(inliningTarget, obj)", limit = "1") static Object getSlice(Object obj, @SuppressWarnings("unused") Object key, @SuppressWarnings("unused") Object value, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Exclusive @Cached PySequenceCheckNode checkNode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.OBJ_IS_UNSLICEABLE, obj); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.OBJ_IS_UNSLICEABLE, obj); } } @@ -549,27 +607,15 @@ static int contains(Object haystack, Object needle, @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, Py_ssize_t}, call = Direct) abstract static class PySequence_InPlaceRepeat extends CApiBinaryBuiltinNode { - @Specialization(guards = {"checkNode.execute(inliningTarget, obj)"}, limit = "1") + @Specialization static Object repeat(Object obj, long n, @Bind("this") Node inliningTarget, - @Cached PyObjectLookupAttr lookupNode, - @Cached CallNode callNode, - @Cached("createMul()") PyNumberMultiplyNode mulNode, - @SuppressWarnings("unused") @Exclusive @Cached PySequenceCheckNode checkNode) { - Object imulCallable = lookupNode.execute(null, inliningTarget, obj, T___IMUL__); - if (imulCallable != PNone.NO_VALUE) { - Object ret = callNode.executeWithoutFrame(imulCallable, n); - return ret; + @Cached PRaiseNode raiseNode, + @Cached PySequenceInPlaceRepeatNode repeat) { + if (!PInt.isIntRange(n)) { + throw raiseNode.raise(inliningTarget, OverflowError); } - return mulNode.execute(null, inliningTarget, obj, n); - } - - @Specialization(guards = "!checkNode.execute(inliningTarget, obj)", limit = "1") - static Object repeat(Object obj, @SuppressWarnings("unused") Object n, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached PySequenceCheckNode checkNode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.OBJ_CANT_BE_REPEATED, obj); + return repeat.execute(null, inliningTarget, obj, (int) n); } } @@ -578,7 +624,7 @@ abstract static class PySequence_Concat extends CApiBinaryBuiltinNode { @Specialization Object doIt(Object s1, Object s2, @Bind("this") Node inliningTarget, - @Cached PySequenceConcat pySeqConcat) { + @Cached PySequenceConcatNode pySeqConcat) { return pySeqConcat.execute(null, inliningTarget, s1, s2); } } @@ -586,26 +632,11 @@ Object doIt(Object s1, Object s2, @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject}, call = Direct) abstract static class PySequence_InPlaceConcat extends CApiBinaryBuiltinNode { - @Specialization(guards = {"checkNode.execute(inliningTarget, s1)"}, limit = "1") + @Specialization static Object concat(Object s1, Object s2, @Bind("this") Node inliningTarget, - @Cached PyObjectLookupAttr lookupNode, - @Cached CallNode callNode, - @Cached PyNumberAddNode addNode, - @SuppressWarnings("unused") @Exclusive @Cached PySequenceCheckNode checkNode) { - Object iaddCallable = lookupNode.execute(null, inliningTarget, s1, T___IADD__); - if (iaddCallable != PNone.NO_VALUE) { - return callNode.executeWithoutFrame(iaddCallable, s2); - } - return addNode.execute(null, inliningTarget, s1, s2); - } - - @Specialization(guards = "!checkNode.execute(inliningTarget, s1)", limit = "1") - static Object concat(Object s1, @SuppressWarnings("unused") Object s2, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached PySequenceCheckNode checkNode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.OBJ_CANT_BE_CONCATENATED, s1); + @Cached PySequenceInPlaceConcatNode concat) { + return concat.execute(null, inliningTarget, s1, s2); } } @@ -616,9 +647,9 @@ static Object run(Object o, long i, @Bind("this") Node inliningTarget, @Cached PySequenceDelItemNode delItemNode) { if ((int) i != i) { - throw PRaiseNode.raiseUncached(inliningTarget, OverflowError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, i); + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.OverflowError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, i); } - delItemNode.execute(o, (int) i); + delItemNode.execute(null, inliningTarget, o, (int) i); return 0; } } @@ -630,7 +661,7 @@ static Object doManaged(Object delegate, long position, @Bind("this") Node inliningTarget, @Cached PySequenceGetItemNode getItemNode) { if ((int) position != position) { - throw PRaiseNode.raiseUncached(inliningTarget, OverflowError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, position); + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.OverflowError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, position); } return getItemNode.execute(null, delegate, (int) position); } @@ -652,10 +683,18 @@ abstract static class PySequence_SetSlice extends CApiQuaternaryBuiltinNode { @Specialization static int setSlice(Object sequence, Object iLow, Object iHigh, Object s, @Bind("this") Node inliningTarget, - @Cached("create(SetItem)") LookupAndCallTernaryNode setItemNode, - @Cached PySliceNew sliceNode) { - setItemNode.execute(null, sequence, sliceNode.execute(inliningTarget, iLow, iHigh, PNone.NONE), s); - return 0; + @Cached GetObjectSlotsNode getSlotsNode, + @Cached CallSlotMpAssSubscriptNode callSetItem, + @Cached PySliceNew sliceNode, + @Cached PRaiseNode raiseNode) { + TpSlots slots = getSlotsNode.execute(inliningTarget, sequence); + if (slots.mp_ass_subscript() != null) { + PSlice slice = sliceNode.execute(inliningTarget, iLow, iHigh, PNone.NONE); + callSetItem.execute(null, inliningTarget, slots.mp_ass_subscript(), sequence, slice, s); + return 0; + } else { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.P_OBJECT_DOESNT_SUPPORT_SLICE_ASSIGNMENT, sequence); + } } } @@ -664,10 +703,18 @@ abstract static class PySequence_DelSlice extends CApiTernaryBuiltinNode { @Specialization static int setSlice(Object sequence, Object iLow, Object iHigh, @Bind("this") Node inliningTarget, - @Cached("create(DelItem)") LookupAndCallBinaryNode delItemNode, - @Cached PySliceNew sliceNode) { - delItemNode.executeObject(null, sequence, sliceNode.execute(inliningTarget, iLow, iHigh, PNone.NONE)); - return 0; + @Cached GetObjectSlotsNode getSlotsNode, + @Cached CallSlotMpAssSubscriptNode callSetItem, + @Cached PySliceNew sliceNode, + @Cached PRaiseNode raiseNode) { + TpSlots slots = getSlotsNode.execute(inliningTarget, sequence); + if (slots.mp_ass_subscript() != null) { + PSlice slice = sliceNode.execute(inliningTarget, iLow, iHigh, PNone.NONE); + callSetItem.execute(null, inliningTarget, slots.mp_ass_subscript(), sequence, slice, PNone.NO_VALUE); + return 0; + } else { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.P_OBJECT_DOESNT_SUPPORT_SLICE_DELETION, sequence); + } } } @@ -799,7 +846,7 @@ static Object values(Object obj, @Cached PyObjectGetAttr getAttrNode, @Cached CallNode callNode, @Shared @Cached ConstructListNode listNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { checkNonNullArg(inliningTarget, obj, raiseNode); Object attr = getAttrNode.execute(inliningTarget, obj, T_VALUES); return listNode.execute(null, callNode.executeWithoutFrame(attr)); @@ -818,12 +865,12 @@ static int doMapping(Object obj, @Cached com.oracle.graal.python.lib.PyObjectSizeNode sizeNode, @Cached IsSameTypeNode isSameType, @Cached GetClassNode getClassNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object cls = getClassNode.execute(inliningTarget, obj); if (isSameType.execute(inliningTarget, cls, PythonBuiltinClassType.PSet) || isSameType.execute(inliningTarget, cls, PythonBuiltinClassType.PFrozenSet) || isSameType.execute(inliningTarget, cls, PythonBuiltinClassType.PDeque)) { - throw raiseNode.get(inliningTarget).raise(TypeError, OBJ_ISNT_MAPPING, obj); + throw raiseNode.raise(inliningTarget, TypeError, OBJ_ISNT_MAPPING, obj); } else { return sizeNode.execute(null, inliningTarget, obj); } @@ -836,17 +883,12 @@ static int doMapping(Object obj, abstract static class PyIter_Next extends CApiUnaryBuiltinNode { @Specialization Object check(Object object, - @Bind("this") Node inliningTarget, - @Cached NextNode nextNode, - @Cached IsBuiltinObjectProfile isClassProfile) { + @Bind Node inliningTarget, + @Cached PyIterNextNode nextNode) { try { - return nextNode.execute(null, object, PNone.NO_VALUE); - } catch (PException e) { - if (isClassProfile.profileException(inliningTarget, e, PythonBuiltinClassType.StopIteration)) { - return getNativeNull(); - } else { - throw e; - } + return nextNode.execute(null, inliningTarget, object); + } catch (IteratorExhausted e) { + return getNativeNull(); } } } @@ -858,19 +900,20 @@ Object send(Object iter, Object arg, @Bind("this") Node inliningTarget, @Cached PyIterCheckNode pyiterCheck, @Cached PyObjectCallMethodObjArgs callMethodNode, - @Cached GetNextNode getNextNode, + @Cached PyIterNextNode nextNode, @Cached IsBuiltinObjectProfile isClassProfile) { - try { - if (arg instanceof PNone && pyiterCheck.execute(inliningTarget, iter)) { - return getNextNode.execute(iter); - } else { - return callMethodNode.execute(null, inliningTarget, iter, T_SEND, arg); + if (arg instanceof PNone && pyiterCheck.execute(inliningTarget, iter)) { + try { + return nextNode.execute(null, inliningTarget, iter); + } catch (IteratorExhausted e) { + return getNativeNull(); } - } catch (PException e) { - if (isClassProfile.profileException(inliningTarget, e, PythonBuiltinClassType.StopIteration)) { + } else { + try { + return callMethodNode.execute(null, inliningTarget, iter, T_SEND, arg); + } catch (PException e) { + e.expectStopIteration(inliningTarget, isClassProfile); return getNativeNull(); - } else { - throw e; } } } @@ -924,10 +967,11 @@ static int set(GetSetDescriptor obj, Object value, static int set(PythonAbstractNativeObject type, Object value, @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Cached IsTypeNode isType, + @Cached TruffleString.SwitchEncodingNode switchEncoding, @Cached CStructAccess.WritePointerNode writePointerNode) { Object cValue; if (value instanceof TruffleString stringValue) { - cValue = new CStringWrapper(stringValue); + cValue = new CStringWrapper(switchEncoding.execute(stringValue, TruffleString.Encoding.UTF_8), TruffleString.Encoding.UTF_8); } else { cValue = PythonContext.get(inliningTarget).getNativeNull(); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBuiltins.java index b8f76b0453..f88c7a2d80 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,6 +46,8 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError; import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Direct; import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Ignored; +import static com.oracle.graal.python.builtins.objects.cext.capi.CApiContext.GC_LOGGER; +import static com.oracle.graal.python.builtins.objects.cext.capi.CApiGCSupport.NEXT_MASK_UNREACHABLE; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.CHAR_PTR; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.ConstCharPtrAsTruffleString; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int; @@ -62,6 +64,8 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.UINTPTR_T; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.UNSIGNED_INT; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Void; +import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.GraalPyGC_CycleNode__item; +import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.GraalPyGC_CycleNode__next; import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyGetSetDef__closure; import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyGetSetDef__doc; import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyGetSetDef__get; @@ -77,8 +81,6 @@ import static com.oracle.graal.python.nodes.ErrorMessages.INDEX_OUT_OF_RANGE; import static com.oracle.graal.python.nodes.ErrorMessages.NATIVE_S_SUBTYPES_NOT_IMPLEMENTED; import static com.oracle.graal.python.nodes.HiddenAttr.NATIVE_SLOTS; -import static com.oracle.graal.python.nodes.StringLiterals.J_LLVM_LANGUAGE; -import static com.oracle.graal.python.nodes.StringLiterals.J_NATIVE; import static com.oracle.graal.python.nodes.StringLiterals.J_NFI_LANGUAGE; import static com.oracle.graal.python.util.PythonUtils.EMPTY_OBJECT_ARRAY; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; @@ -93,7 +95,6 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.nio.ByteBuffer; -import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -103,6 +104,7 @@ import org.graalvm.collections.Pair; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.modules.GraalPythonModuleBuiltins.DebugNode; @@ -115,17 +117,22 @@ import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass; import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; import com.oracle.graal.python.builtins.objects.cext.capi.CApiFunction; +import com.oracle.graal.python.builtins.objects.cext.capi.CApiGCSupport.PyObjectGCDelNode; import com.oracle.graal.python.builtins.objects.cext.capi.CApiGuards; -import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ClearNativeWrapperNode; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.FromCharPointerNode; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.FromCharPointerNodeGen; -import com.oracle.graal.python.builtins.objects.cext.capi.PyTruffleObjectFree; import com.oracle.graal.python.builtins.objects.cext.capi.PythonClassNativeWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper.PythonAbstractObjectNativeWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; -import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CArrayWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.GcNativePtrToPythonNode; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.HandleContext; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.HandlePointerConverter; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.NativePtrToPythonWrapperNode; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.UpdateStrongRefNode; +import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.CoerceNativePointerToLongNode; import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.TransformExceptionToNativeNode; import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodesFactory.TransformExceptionToNativeNodeGen; import com.oracle.graal.python.builtins.objects.cext.common.CExtToJavaNode; @@ -134,6 +141,7 @@ import com.oracle.graal.python.builtins.objects.cext.structs.CConstants; import com.oracle.graal.python.builtins.objects.cext.structs.CFields; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; +import com.oracle.graal.python.builtins.objects.cext.structs.CStructs; import com.oracle.graal.python.builtins.objects.code.PCode; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.exception.PBaseException; @@ -141,14 +149,17 @@ import com.oracle.graal.python.builtins.objects.frame.PFrame.Reference; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.memoryview.BufferLifecycleManager; import com.oracle.graal.python.builtins.objects.memoryview.MemoryViewNodes; import com.oracle.graal.python.builtins.objects.memoryview.NativeBufferLifecycleManager; import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView; import com.oracle.graal.python.builtins.objects.mmap.PMMap; +import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.str.PString; +import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; import com.oracle.graal.python.builtins.objects.type.PythonClass; @@ -173,18 +184,16 @@ import com.oracle.graal.python.nodes.statement.AbstractImportNode; import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; import com.oracle.graal.python.runtime.GilNode; -import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.PosixSupportLibrary; -import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.ExceptionUtils; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.MroSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.NativeByteSequenceStorage; +import com.oracle.graal.python.runtime.sequence.storage.NativeSequenceStorage; import com.oracle.graal.python.util.BufferFormat; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CallTarget; @@ -192,16 +201,15 @@ import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.Truffle; -import com.oracle.truffle.api.TruffleLanguage.Env; import com.oracle.truffle.api.TruffleLogger; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.Idempotent; import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NonIdempotent; import com.oracle.truffle.api.dsl.ReportPolymorphism; @@ -211,7 +219,6 @@ import com.oracle.truffle.api.frame.FrameInstanceVisitor; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.InvalidBufferOffsetException; import com.oracle.truffle.api.interop.TruffleObject; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.CachedLibrary; @@ -219,13 +226,11 @@ import com.oracle.truffle.api.library.ExportMessage; import com.oracle.truffle.api.nodes.ExplodeLoop; import com.oracle.truffle.api.nodes.IndirectCallNode; -import com.oracle.truffle.api.nodes.LanguageInfo; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.RootNode; import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.source.Source; import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.llvm.api.Toolchain; import com.oracle.truffle.nfi.api.SignatureLibrary; public final class PythonCextBuiltins { @@ -247,26 +252,26 @@ public abstract static class PromoteBorrowedValue extends Node { @Specialization static PString doString(TruffleString str, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - return factory.createString(str); + @Bind PythonLanguage language) { + return PFactory.createString(language, str); } @Specialization static PythonBuiltinObject doInteger(int i, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - return factory.createInt(i); + @Bind PythonLanguage language) { + return PFactory.createInt(language, i); } @Specialization static PythonBuiltinObject doLong(long i, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - return factory.createInt(i); + @Bind PythonLanguage language) { + return PFactory.createInt(language, i); } @Specialization(guards = "!isNaN(d)") static PythonBuiltinObject doDouble(double d, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - return factory.createFloat(d); + @Bind PythonLanguage language) { + return PFactory.createFloat(language, d); } static boolean isNaN(double d) { @@ -292,12 +297,12 @@ public static PException checkThrowableBeforeNative(Throwable t, String where1, CompilerDirectives.transferToInterpreter(); PythonContext context = PythonContext.get(null); context.ensureGilAfterFailure(); - PBaseException newException = context.factory().createBaseException(RecursionError, ErrorMessages.MAXIMUM_RECURSION_DEPTH_EXCEEDED, EMPTY_OBJECT_ARRAY); + PBaseException newException = PFactory.createBaseException(context.getLanguage(), RecursionError, ErrorMessages.MAXIMUM_RECURSION_DEPTH_EXCEEDED, EMPTY_OBJECT_ARRAY); throw ExceptionUtils.wrapJavaException(soe, null, newException); } if (t instanceof OutOfMemoryError oome) { CompilerDirectives.transferToInterpreter(); - PBaseException newException = PythonContext.get(null).factory().createBaseException(MemoryError); + PBaseException newException = PFactory.createBaseException(PythonLanguage.get(null), MemoryError); throw ExceptionUtils.wrapJavaException(oome, null, newException); } // everything else: log and convert to PException (SystemError) @@ -318,7 +323,7 @@ public static PException checkThrowableBeforeNative(Throwable t, String where1, out.println("ERROR: Native API called without Truffle context. This can happen when called from C-level atexit, C++ global destructor or an unregistered native thread"); } out.flush(); - throw PRaiseNode.raiseUncached(null, SystemError, ErrorMessages.INTERNAL_EXCEPTION_OCCURED); + throw PRaiseNode.raiseStatic(null, SystemError, ErrorMessages.INTERNAL_EXCEPTION_OCCURED); } public abstract static class CApiBuiltinNode extends PNodeWithContext { @@ -369,7 +374,12 @@ protected final CApiContext getCApiContext() { protected final PException badInternalCall(String argName) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(this, SystemError, ErrorMessages.S_S_BAD_ARG_TO_INTERNAL_FUNC, getName(), argName); + throw PRaiseNode.raiseStatic(this, SystemError, ErrorMessages.S_S_BAD_ARG_TO_INTERNAL_FUNC, getName(), argName); + } + + @NonIdempotent + protected final boolean isNativeAccessAllowed() { + return getContext().isNativeAccessAllowed(); } private String getName() { @@ -384,25 +394,25 @@ private String getName() { @TruffleBoundary protected PException raiseFallback(Object obj, PythonBuiltinClassType type) { if (obj == PNone.NO_VALUE) { - throw PRaiseNode.raiseUncached(this, SystemError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC_S, getName()); + throw PRaiseNode.raiseStatic(this, SystemError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC_S, getName()); } if (IsSubtypeNode.getUncached().execute(GetClassNode.executeUncached(obj), type)) { - throw PRaiseNode.raiseUncached(this, NotImplementedError, NATIVE_S_SUBTYPES_NOT_IMPLEMENTED, type.getName()); + throw PRaiseNode.raiseStatic(this, NotImplementedError, NATIVE_S_SUBTYPES_NOT_IMPLEMENTED, type.getName()); } else { - throw PRaiseNode.raiseUncached(this, SystemError, ErrorMessages.EXPECTED_S_NOT_P, type.getName(), obj); + throw PRaiseNode.raiseStatic(this, SystemError, ErrorMessages.EXPECTED_S_NOT_P, type.getName(), obj); } } @TruffleBoundary protected PException raiseFallback(Object obj, PythonBuiltinClassType type1, PythonBuiltinClassType type2) { if (obj == PNone.NO_VALUE) { - throw PRaiseNode.raiseUncached(this, SystemError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC_S, getName()); + throw PRaiseNode.raiseStatic(this, SystemError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC_S, getName()); } Object objType = GetClassNode.executeUncached(obj); if (IsSubtypeNode.getUncached().execute(objType, type1) || IsSubtypeNode.getUncached().execute(objType, type2)) { - throw PRaiseNode.raiseUncached(this, NotImplementedError, NATIVE_S_SUBTYPES_NOT_IMPLEMENTED, type1.getName()); + throw PRaiseNode.raiseStatic(this, NotImplementedError, NATIVE_S_SUBTYPES_NOT_IMPLEMENTED, type1.getName()); } else { - throw PRaiseNode.raiseUncached(this, SystemError, ErrorMessages.EXPECTED_S_NOT_P, type1.getName(), obj); + throw PRaiseNode.raiseStatic(this, SystemError, ErrorMessages.EXPECTED_S_NOT_P, type1.getName(), obj); } } @@ -415,18 +425,18 @@ protected final int castToInt(long elementSize) { return (int) elementSize; } CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(this, SystemError, INDEX_OUT_OF_RANGE); + throw PRaiseNode.raiseStatic(this, SystemError, INDEX_OUT_OF_RANGE); } - protected static void checkNonNullArg(Node inliningTarget, Object obj, PRaiseNode.Lazy raiseNode) { + protected static void checkNonNullArg(Node inliningTarget, Object obj, PRaiseNode raiseNode) { if (obj == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(SystemError, ErrorMessages.NULL_ARG_INTERNAL); + throw raiseNode.raise(inliningTarget, SystemError, ErrorMessages.NULL_ARG_INTERNAL); } } - protected static void checkNonNullArg(Node inliningTarget, Object obj1, Object obj2, PRaiseNode.Lazy raiseNode) { + protected static void checkNonNullArg(Node inliningTarget, Object obj1, Object obj2, PRaiseNode raiseNode) { if (obj1 == PNone.NO_VALUE || obj2 == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(SystemError, ErrorMessages.NULL_ARG_INTERNAL); + throw raiseNode.raise(inliningTarget, SystemError, ErrorMessages.NULL_ARG_INTERNAL); } } } @@ -881,9 +891,9 @@ public enum CApiCallPath { */ Direct, /** - * This builtin has an explicit C implementation that can be executed both from native and - * from Sulong - no automatic stub will be generated. Further, there *MUST NOT* be a C API - * builtin that would implement the function in Java. + * This builtin has an explicit C implementation that can be executed both from native - no + * automatic stub will be generated. Further, there *MUST NOT* be a C API builtin that would + * implement the function in Java. */ CImpl, /** @@ -917,7 +927,7 @@ public enum CApiCallPath { * marked with this annotation. The information in the annotation allows code generation, * argument conversions (based on {@link ArgDescriptor}s), and verification of the C API * implementation in general. - * + *

      * Apart from being placed on classes that implement {@link CApiBuiltinNode}, this annotation is * also used in {@link CApiFunction} to list all functions that are implemented in C code or * that are not currently implemented. @@ -982,7 +992,7 @@ abstract static class PyTruffle_Type extends CApiUnaryBuiltinNode { static Object doI(TruffleString typeName, @Bind("this") Node inliningTarget, @Cached TruffleString.EqualNode eqNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Python3Core core = PythonContext.get(inliningTarget); for (PythonBuiltinClassType type : PythonBuiltinClassType.VALUES) { if (eqNode.execute(type.getName(), typeName, TS_ENCODING)) { @@ -995,7 +1005,7 @@ static Object doI(TruffleString typeName, return attribute; } } - throw raiseNode.get(inliningTarget).raise(PythonErrorType.KeyError, ErrorMessages.APOSTROPHE_S, typeName); + throw raiseNode.raise(inliningTarget, PythonErrorType.KeyError, ErrorMessages.APOSTROPHE_S, typeName); } } @@ -1043,7 +1053,7 @@ abstract static class PyTruffle_AddInheritedSlots extends CApiUnaryBuiltinNode { * custom slots at a time where the C API is not yet loaded. So we need to check if any of * the base classes defines custom slots and adapt the basicsize to allocate space for the * slots and add the native member slot descriptors. - * + *

      * Additionally, at this point the native slots have been inherited on the native side, here * we transfer the result of that inheritance process to the slots mirror on the managed * side. @@ -1132,14 +1142,14 @@ private static Object[] collect(MroSequenceStorage mro, int idx) { abstract static class PyFrame_New extends CApiQuaternaryBuiltinNode { @Specialization static Object newFrame(Object threadState, PCode code, PythonObject globals, Object locals, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { Object frameLocals; if (locals == null || PGuards.isPNone(locals)) { - frameLocals = factory.createDict(); + frameLocals = PFactory.createDict(language); } else { frameLocals = locals; } - return factory.createPFrame(threadState, code, globals, frameLocals); + return PFactory.createPFrame(language, threadState, code, globals, frameLocals); } } @@ -1160,7 +1170,7 @@ static Object wrap(Object bufferStructPointer, Object ownerObj, long lenObj, @Cached CastToJavaIntExactNode castToIntNode, @Cached TruffleString.CodePointLengthNode lengthNode, @Cached TruffleString.CodePointAtIndexNode atIndexNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { int ndim = castToIntNode.execute(inliningTarget, ndimObj); int itemsize = castToIntNode.execute(inliningTarget, itemsizeObj); int len = castToIntNode.execute(inliningTarget, lenObj); @@ -1191,7 +1201,7 @@ static Object wrap(Object bufferStructPointer, Object ownerObj, long lenObj, if (!lib.isNull(bufferStructPointer)) { bufferLifecycleManager = new NativeBufferLifecycleManager.NativeBufferLifecycleManagerFromType(bufferStructPointer); } - return factory.createMemoryView(PythonContext.get(inliningTarget), bufferLifecycleManager, buffer, owner, len, readonly, itemsize, + return PFactory.createMemoryView(language, PythonContext.get(inliningTarget), bufferLifecycleManager, buffer, owner, len, readonly, itemsize, BufferFormat.forMemoryView(format, lengthNode, atIndexNode), format, ndim, bufPointer, 0, shape, strides, suboffsets, flags); } } @@ -1276,178 +1286,357 @@ Object trigger(long delay) { @CApiBuiltin(ret = Void, args = {Pointer}, call = Ignored) @ImportStatic(CApiGuards.class) - abstract static class PyTruffle_Object_Free extends CApiUnaryBuiltinNode { - private static final TruffleLogger LOGGER = CApiContext.getLogger(PyTruffle_Object_Free.class); + abstract static class PyTruffleObject_GC_Del extends CApiUnaryBuiltinNode { - @Specialization(guards = "!isCArrayWrapper(nativeWrapper)") - static PNone doNativeWrapper(PythonNativeWrapper nativeWrapper, + @Specialization(limit = "3") + static PNone doObject(Object ptr, @Bind("this") Node inliningTarget, - @Cached ClearNativeWrapperNode clearNativeWrapperNode, - @Cached PyTruffleObjectFree freeNode) { - // if (nativeWrapper.getRefCount() > 0) { - // CompilerDirectives.transferToInterpreterAndInvalidate(); - // throw new IllegalStateException("deallocating native object with refcnt > 0"); - // } - - // clear native wrapper - Object delegate = nativeWrapper.getDelegate(); - clearNativeWrapperNode.execute(inliningTarget, delegate, nativeWrapper); - - freeNode.execute(inliningTarget, nativeWrapper); + @Cached PyObjectGCDelNode pyObjectGCDelNode, + @CachedLibrary("ptr") InteropLibrary lib) { + // we expect a pointer object here because this is called from native + assert CApiTransitions.isBackendPointerObject(ptr); + if (lib.isPointer(ptr)) { + try { + pyObjectGCDelNode.execute(inliningTarget, lib.asPointer(ptr)); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } return PNone.NO_VALUE; } + } + + @CApiBuiltin(ret = Void, args = {UNSIGNED_INT, UINTPTR_T, SIZE_T}, call = Ignored) + abstract static class PyTruffleTraceMalloc_Track extends CApiTernaryBuiltinNode { + private static final TruffleLogger LOGGER = CApiContext.getLogger(PyTruffleTraceMalloc_Track.class); @Specialization - static PNone arrayWrapper(@SuppressWarnings("unused") CArrayWrapper object) { - // It's a pointer to a managed object but doesn't need special handling, so we just - // ignore it. + @TruffleBoundary + static Object doCachedDomainIdx(int domain, long ptrVal, long size) { + // this will also be called if the allocation failed + if (ptrVal != 0) { + LOGGER.fine(() -> PythonUtils.formatJString("Tracking memory (domain: %d, size: %d): %s", domain, size, CApiContext.asHex(ptrVal))); + } return PNone.NO_VALUE; } + } - @Specialization(guards = "!isNativeWrapper(object)") - static PNone doOther(@SuppressWarnings("unused") Object object) { - throw CompilerDirectives.shouldNotReachHere("Attempted to free a managed object"); - } + @CApiBuiltin(ret = Void, args = {UNSIGNED_INT, UINTPTR_T}, call = Ignored) + abstract static class PyTruffleTraceMalloc_Untrack extends CApiBinaryBuiltinNode { + private static final TruffleLogger LOGGER = CApiContext.getLogger(PyTruffleTraceMalloc_Untrack.class); - protected static boolean isCArrayWrapper(Object obj) { - return obj instanceof CArrayWrapper; + @Specialization + @TruffleBoundary + Object doCachedDomainIdx(int domain, long ptrVal) { + LOGGER.fine(() -> PythonUtils.formatJString("Untracking memory (domain: %d): %s", domain, CApiContext.asHex(ptrVal))); + return PNone.NO_VALUE; } } - @CApiBuiltin(ret = Int, args = {UNSIGNED_INT, UINTPTR_T, SIZE_T}, call = Direct) - @ImportStatic(CApiGuards.class) - abstract static class PyTraceMalloc_Track extends CApiTernaryBuiltinNode { - private static final TruffleLogger LOGGER = CApiContext.getLogger(PyTraceMalloc_Track.class); + @GenerateCached(false) + abstract static class PyTruffleGcTracingNode extends CApiUnaryBuiltinNode { - @Specialization(guards = {"isSingleContext()", "domain == cachedDomain"}, limit = "3") - static int doCachedDomainIdx(@SuppressWarnings("unused") int domain, Object pointerObject, long size, - @Bind("this") Node inliningTarget, - @Shared @Cached("createFor(this)") IndirectCallData indirectCallData, - @Shared @Cached GetThreadStateNode getThreadStateNode, - @CachedLibrary("pointerObject") InteropLibrary lib, - @Cached("domain") @SuppressWarnings("unused") long cachedDomain, - @Cached("lookupDomain(inliningTarget, domain)") int cachedDomainIdx) { + @Specialization(guards = "!traceMem(language)") + static Object doNothing(@SuppressWarnings("unused") Object ptr, + @SuppressWarnings("unused") @Bind PythonLanguage language) { + // do nothing + return PNone.NO_VALUE; + } - // this will also be called if the allocation failed - if (!lib.isNull(pointerObject)) { - CApiContext cApiContext = getCApiContext(inliningTarget); - Object key = CApiContext.asPointer(pointerObject, lib); - cApiContext.getTraceMallocDomain(cachedDomainIdx).track(key, size); - cApiContext.increaseMemoryPressure(null, inliningTarget, getThreadStateNode, indirectCallData, size); - if (LOGGER.isLoggable(Level.FINE)) { - LOGGER.fine(() -> PythonUtils.formatJString("Tracking memory (size: %d): %s", size, CApiContext.asHex(key))); - } + @Fallback + Object doNativeWrapper(Object ptr, + @Bind("this") Node inliningTarget, + @Bind PythonContext context, + @Cached GetCurrentFrameRef getCurrentFrameRef, + @CachedLibrary(limit = "3") InteropLibrary lib) { + PFrame.Reference ref = null; + if (context.getOption(PythonOptions.TraceNativeMemoryCalls)) { + ref = getCurrentFrameRef.execute(null, inliningTarget); } - return 0; + trace(context, CApiContext.asPointer(ptr, lib), ref, null); + return PNone.NO_VALUE; } - @Specialization(replaces = "doCachedDomainIdx", limit = "3") - static int doGeneric(int domain, Object pointerObject, long size, - @Bind("this") Node inliningTarget, - @Shared @Cached("createFor(this)") IndirectCallData indirectCallData, - @CachedLibrary("pointerObject") InteropLibrary lib, - @Shared @Cached GetThreadStateNode getThreadStateNode) { - return doCachedDomainIdx(domain, pointerObject, size, inliningTarget, indirectCallData, getThreadStateNode, lib, domain, lookupDomain(inliningTarget, domain)); + @Idempotent + boolean traceMem(PythonLanguage language) { + return language.getEngineOption(PythonOptions.TraceNativeMemory); + } + + protected abstract void trace(PythonContext context, Object ptr, Reference ref, TruffleString className); + } + + @CApiBuiltin(ret = Void, args = {Pointer}, call = Ignored) + abstract static class PyTruffleObject_GC_UnTrack extends PyTruffleGcTracingNode { + @Override + protected void trace(PythonContext context, Object ptr, Reference ref, TruffleString className) { + GC_LOGGER.finer(() -> PythonUtils.formatJString("Untracking container object at %s", CApiContext.asHex(ptr))); + context.getCApiContext().untrackObject(ptr, ref, className); } + } - static int lookupDomain(Node inliningTarget, int domain) { - return getCApiContext(inliningTarget).findOrCreateTraceMallocDomain(domain); + @CApiBuiltin(ret = Void, args = {Pointer}, call = Ignored) + abstract static class PyTruffleObject_GC_Track extends PyTruffleGcTracingNode { + @Override + protected void trace(PythonContext context, Object ptr, Reference ref, TruffleString className) { + GC_LOGGER.finer(() -> PythonUtils.formatJString("Tracking container object at %s", CApiContext.asHex(ptr))); + context.getCApiContext().trackObject(ptr, ref, className); } } - @CApiBuiltin(ret = Int, args = {UNSIGNED_INT, UINTPTR_T}, call = Direct) - @ImportStatic(CApiGuards.class) - abstract static class PyTraceMalloc_Untrack extends CApiBinaryBuiltinNode { - private static final TruffleLogger LOGGER = CApiContext.getLogger(PyTraceMalloc_Untrack.class); - - @Specialization(guards = {"isSingleContext()", "domain == cachedDomain"}, limit = "3") - int doCachedDomainIdx(@SuppressWarnings("unused") int domain, Object pointerObject, - @Cached("domain") @SuppressWarnings("unused") long cachedDomain, - @Cached("lookupDomain(domain)") int cachedDomainIdx, - @CachedLibrary("pointerObject") InteropLibrary lib) { - - CApiContext cApiContext = getCApiContext(); - Object key = CApiContext.asPointer(pointerObject, lib); - long trackedMemorySize = cApiContext.getTraceMallocDomain(cachedDomainIdx).untrack(key); - cApiContext.reduceMemoryPressure(trackedMemorySize); - if (LOGGER.isLoggable(Level.FINE)) { - LOGGER.fine(() -> PythonUtils.formatJString("Untracking memory (size: %d): %s", trackedMemorySize, CApiContext.asHex(key))); + /** + * Replicates native references in Java. + *

      + * This upcall is the core function for Python GC support. It replicates native references in + * Java such that the Java GC sees all references (and also cycles) and can properly collect + * everything. + *

      + *

      + * In order to save managed-native round trips, this upcall function expects the native pointer + * of a primary object and the pointer to a single linked list (node type + * {@link CStructs#GraalPyGC_CycleNode}) that contains the referents. The referents are usually + * determined by traversing the primary object. + *

      + *

      + * If the primary object is a native object, a Python module (with native module state) or a + * list/tuple with a native storage, the native references will be replicated. Other object + * types may be added if they also have some native memory that may contain object references + * (e.g. a module object may store references in its native module state). + *

      + *

      + * The pointers of the referents in the single linked list are resolved (in particular, this + * means that it ensures the existence of a {@link PythonAbstractNativeObject} for each native + * object) and then stored in a Java object array which is then attached to the primary object. + *

      + */ + @CApiBuiltin(ret = Void, args = {Pointer, Pointer, Int}, call = Ignored) + abstract static class PyTruffleObject_ReplicateNativeReferences extends CApiTernaryBuiltinNode { + private static final Level LEVEL = Level.FINER; + + @Specialization(guards = "isNativeAccessAllowed()") + static Object doGeneric(Object pointer, Object listHead, int n, + @Bind("this") Node inliningTarget, + @Cached CStructAccess.ReadObjectNode readObjectNode, + @Cached CStructAccess.ReadPointerNode readPointerNode, + @Cached CoerceNativePointerToLongNode coerceNativePointerToLongNode, + @Cached GcNativePtrToPythonNode gcNativePtrToPythonNode) { + assert PythonLanguage.get(inliningTarget).getEngineOption(PythonOptions.PythonGC); + + boolean loggable = GC_LOGGER.isLoggable(LEVEL); + long lPointer = coerceNativePointerToLongNode.execute(inliningTarget, pointer); + assert lPointer != 0; + Object object = gcNativePtrToPythonNode.execute(inliningTarget, lPointer); + + /* + * If 'object' is null, there is no 'PythonAbstractNativeObject' wrapper for the native + * object. This means that the native object is not referenced from managed code. So, we + * don't need to replicate native references. + */ + + Object repr = object; + Object[] referents = null; + if (object instanceof PythonAbstractNativeObject || object instanceof PythonModule || isTupleWithNativeStorage(object) || isListWithNativeStorage(object)) { + /* + * Note: it is important that we first collect the objects such that we have strong + * Java references to them on the Java stack and then we overwrite the + * 'replicatedNativeReferences' field. This is because the referents may already be + * weakly referenced from the handle table and such referents may already be in the + * previous array and then it could happen, that they die during list processing. + */ + Object[] oldReferents; + referents = new Object[n]; + if (object instanceof PythonAbstractNativeObject nativeObject) { + if (loggable) { + repr = nativeObject.toStringWithContext(); + } + oldReferents = nativeObject.getReplicatedNativeReferences(); + nativeObject.setReplicatedNativeReferences(referents); + } else if (object instanceof PythonModule module) { + oldReferents = module.getReplicatedNativeReferences(); + module.setReplicatedNativeReferences(referents); + } else { + assert isTupleWithNativeStorage(object) || isListWithNativeStorage(object); + NativeSequenceStorage nativeSequenceStorage = getNativeSequenceStorage(object); + oldReferents = nativeSequenceStorage.getReplicatedNativeReferences(); + nativeSequenceStorage.setReplicatedNativeReferences(referents); + } + // Collect referents (traverse native list and resolve pointers) + Object cur = listHead; + for (int i = 0; i < n; i++) { + referents[i] = readObjectNode.read(cur, GraalPyGC_CycleNode__item); + cur = readPointerNode.read(cur, GraalPyGC_CycleNode__next); + } + + /* + * As described above: Ensure that the 'old' replicated references are strong until + * this point. Otherwise, weakly referenced managed objects could die. + */ + java.lang.ref.Reference.reachabilityFence(oldReferents); + + if (loggable) { + GC_LOGGER.log(LEVEL, PythonUtils.formatJString("Replicated native refs of %s to managed: %s", repr, arraysToString(referents))); + } + } else if (object == null && loggable) { + GC_LOGGER.log(LEVEL, PythonUtils.formatJString("Did not replicate native refs of %s: no wrapper", CApiContext.asHex(lPointer))); } - return 0; + return PNone.NO_VALUE; } - @Specialization(replaces = "doCachedDomainIdx") - int doGeneric(int domain, Object pointerObject, - @CachedLibrary(limit = "3") InteropLibrary lib) { - return doCachedDomainIdx(domain, pointerObject, domain, lookupDomain(domain), lib); + private static NativeSequenceStorage getNativeSequenceStorage(Object object) { + NativeSequenceStorage nativeSequenceStorage; + if (object instanceof PTuple tuple) { + // cast is ensured by 'isTupleWithNativeStorage' + nativeSequenceStorage = (NativeSequenceStorage) tuple.getSequenceStorage(); + } else { + assert object instanceof PList; + // casts are ensured by 'isListWithNativeStorage' + nativeSequenceStorage = (NativeSequenceStorage) ((PList) object).getSequenceStorage(); + } + return nativeSequenceStorage; } - int lookupDomain(int domain) { - return getCApiContext().findOrCreateTraceMallocDomain(domain); + @Specialization(guards = "!isNativeAccessAllowed()") + @SuppressWarnings("unused") + static Object doManaged(Object pointer, Object listHead, int n) { + return PNone.NO_VALUE; } - } - abstract static class PyTruffleGcTracingNode extends CApiUnaryBuiltinNode { + @TruffleBoundary + private static String arraysToString(Object[] arr) { + return Arrays.toString(arr); + } - @Specialization(guards = {"!traceCalls(getContext())", "traceMem(getContext())"}) - Object doNativeWrapper(Object ptr, - @Shared("lib") @CachedLibrary(limit = "3") InteropLibrary lib) { - trace(getContext(), CApiContext.asPointer(ptr, lib), null, null); - return PNone.NO_VALUE; + private static boolean isTupleWithNativeStorage(Object object) { + return object instanceof PTuple tuple && tuple.getSequenceStorage() instanceof NativeSequenceStorage; + } + + private static boolean isListWithNativeStorage(Object object) { + return object instanceof PList list && list.getSequenceStorage() instanceof NativeSequenceStorage; } + } - @Specialization(guards = {"traceCalls(getContext())", "traceMem(getContext())"}) - Object doNativeWrapperTraceCall(Object ptr, + /** + * Iterates over all objects in the given GC list and makes all + * {@link com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonObjectReference + * handle table references} of the denoted objects weak. This is used to break reference cycles + * that involve managed objects. + */ + @CApiBuiltin(ret = Void, args = {Pointer}, call = Ignored) + abstract static class PyTruffleObject_GC_EnsureWeak extends CApiUnaryBuiltinNode { + @Specialization(guards = "isNativeAccessAllowed()") + static Object doNative(Object weakCandidates, @Bind("this") Node inliningTarget, - @Cached GetCurrentFrameRef getCurrentFrameRef, - @Shared("lib") @CachedLibrary(limit = "3") InteropLibrary lib) { + @Cached CoerceNativePointerToLongNode coerceToLongNode, + @Cached CStructAccess.ReadI64Node readI64Node, + @Cached CStructAccess.WriteLongNode writeLongNode, + @Cached NativePtrToPythonWrapperNode nativePtrToPythonWrapperNode, + @Cached UpdateStrongRefNode updateRefNode) { + // guaranteed by the guard + assert PythonContext.get(inliningTarget).isNativeAccessAllowed(); + assert PythonLanguage.get(inliningTarget).getEngineOption(PythonOptions.PythonGC); + + /* + * The list's head is a dummy node that can not be a tagged pointer because it is not an + * object and always allocated in native. + */ + long head = coerceToLongNode.execute(inliningTarget, weakCandidates); + assert !HandlePointerConverter.pointsToPyHandleSpace(head); + + // PyGC_Head *gc = GC_NEXT(head) + long gc = readI64Node.read(head, CFields.PyGC_Head___gc_next); + /* + * The list's head is not polluted with NEXT_MASK_UNREACHABLE. See 'move_weak_reachable' + * at the end of the function. + */ + assert (gc & NEXT_MASK_UNREACHABLE) == 0; + while (gc != head) { + assert (gc & NEXT_MASK_UNREACHABLE) == 0; + + // PyObject *op = FROM_GC(gc) + long op = gc + CStructs.PyGC_Head.size(); + + PythonNativeWrapper wrapper = nativePtrToPythonWrapperNode.execute(inliningTarget, op, true); + if (wrapper instanceof PythonAbstractObjectNativeWrapper abstractObjectNativeWrapper) { + if (GC_LOGGER.isLoggable(Level.FINE)) { + GC_LOGGER.fine(PythonUtils.formatJString("Transitioning to weak reference to break a reference cycle for %s, refcount=%d", + abstractObjectNativeWrapper.ref, abstractObjectNativeWrapper.getRefCount())); + } + updateRefNode.clearStrongRef(inliningTarget, abstractObjectNativeWrapper); + } - PFrame.Reference ref = getCurrentFrameRef.execute(null, inliningTarget); - trace(getContext(), CApiContext.asPointer(ptr, lib), ref, null); + // next = GC_NEXT(gc) + long gcUntagged = HandlePointerConverter.pointerToStub(gc); + long nextTaggedWithMask = readI64Node.read(gcUntagged, CFields.PyGC_Head___gc_next); + // remove NEXT_MASK_UNREACHABLE flag + long next = nextTaggedWithMask & ~NEXT_MASK_UNREACHABLE; + /* + * We expect to process 'weak_candidates' which all have NEXT_MASK_UNREACHABLE set + * except of the list head (which is a dummy node) + */ + assert next == head || (nextTaggedWithMask & NEXT_MASK_UNREACHABLE) != 0; + + /* + * This is a "dirty" untrack since we just overwrite '_gc_prev' and '_gc_next' with + * zero. Here it is fine because (a) managed objects will never have flags set in + * '_gc_prev' that need to be preserved, and (b) because we untrack all objects in + * this list anyway. + */ + writeLongNode.write(gcUntagged, CFields.PyGC_Head___gc_next, 0); + writeLongNode.write(gcUntagged, CFields.PyGC_Head___gc_prev, 0); + + gc = next; + } return PNone.NO_VALUE; } - @Specialization(guards = "!traceMem(getContext())") - static Object doNothing(@SuppressWarnings("unused") Object ptr) { - // do nothing + @Specialization(guards = "!isNativeAccessAllowed()") + static Object doNative(@SuppressWarnings("unused") Object weakCandidates) { return PNone.NO_VALUE; } + } - @NonIdempotent - static boolean traceMem(PythonContext context) { - return context.getOption(PythonOptions.TraceNativeMemory); - } + @CApiBuiltin(ret = Int, args = {Pointer}, call = Ignored) + abstract static class PyTruffle_IsReferencedFromManaged extends CApiUnaryBuiltinNode { + @Specialization(guards = "isNativeAccessAllowed()") + static int doNative(Object pointer, + @Bind("this") Node inliningTarget, + @Cached CoerceNativePointerToLongNode coerceToLongNode, + @Cached GcNativePtrToPythonNode gcNativePtrToPythonNode) { + // guaranteed by the guard + assert PythonContext.get(inliningTarget).isNativeAccessAllowed(); + assert PythonLanguage.get(inliningTarget).getEngineOption(PythonOptions.PythonGC); - @NonIdempotent - static boolean traceCalls(PythonContext context) { - return context.getOption(PythonOptions.TraceNativeMemoryCalls); + long lPointer = coerceToLongNode.execute(inliningTarget, pointer); + // this upcall doesn't make sense for managed objects + assert !HandlePointerConverter.pointsToPyHandleSpace(lPointer); + + Object object = gcNativePtrToPythonNode.execute(inliningTarget, lPointer); + return PInt.intValue(object != null); } - @SuppressWarnings("unused") - protected void trace(PythonContext context, Object ptr, Reference ref, TruffleString className) { - throw CompilerDirectives.shouldNotReachHere(); + @Specialization(guards = "!isNativeAccessAllowed()") + static Object doManaged(@SuppressWarnings("unused") Object pointer) { + return PInt.intValue(false); } } - @CApiBuiltin(ret = Void, args = {Pointer}, call = Ignored) - abstract static class PyTruffleObject_GC_UnTrack extends PyTruffleGcTracingNode { - private static final TruffleLogger LOGGER = CApiContext.getLogger(PyTruffleObject_GC_UnTrack.class); - - @Override - protected void trace(PythonContext context, Object ptr, Reference ref, TruffleString className) { - LOGGER.finer(() -> PythonUtils.formatJString("Untracking container object at %s", CApiContext.asHex(ptr))); - context.getCApiContext().untrackObject(ptr, ref, className); + @CApiBuiltin(ret = Void, call = Ignored) + abstract static class PyTruffle_EnableReferneceQueuePolling extends CApiNullaryBuiltinNode { + @Specialization + static Object doGeneric(@Bind("this") Node inliningTarget) { + assert PythonLanguage.get(inliningTarget).getEngineOption(PythonOptions.PythonGC); + HandleContext handleContext = PythonContext.get(inliningTarget).nativeContext; + CApiTransitions.enableReferenceQueuePolling(handleContext); + return PNone.NO_VALUE; } } - @CApiBuiltin(ret = Void, args = {Pointer}, call = Ignored) - abstract static class PyTruffleObject_GC_Track extends PyTruffleGcTracingNode { - private static final TruffleLogger LOGGER = CApiContext.getLogger(PyTruffleObject_GC_Track.class); - - @Override - protected void trace(PythonContext context, Object ptr, Reference ref, TruffleString className) { - LOGGER.finer(() -> PythonUtils.formatJString("Tracking container object at %s", CApiContext.asHex(ptr))); - context.getCApiContext().trackObject(ptr, ref, className); + @CApiBuiltin(ret = Int, call = Ignored) + abstract static class PyTruffle_DisableReferneceQueuePolling extends CApiNullaryBuiltinNode { + @Specialization + static int doGeneric(@Bind("this") Node inliningTarget) { + assert PythonLanguage.get(inliningTarget).getEngineOption(PythonOptions.PythonGC); + HandleContext handleContext = PythonContext.get(inliningTarget).nativeContext; + return PInt.intValue(CApiTransitions.disableReferenceQueuePolling(handleContext)); } } @@ -1457,15 +1646,24 @@ protected void trace(PythonContext context, Object ptr, Reference ref, TruffleSt private static final int LOG_FINE = 0x8; private static final int LOG_FINER = 0x10; private static final int LOG_FINEST = 0x20; - private static final int DEBUG_CAPI = 0x30; - + private static final int DEBUG_CAPI = 0x40; + private static final int PYTHON_GC = 0x80; + + /* + * These should be kept so they can be shared across multiple contexts in the same engine, if + * they are stored in a static field on the native side. We have to ensure that this is + * generally fine. In practice, this means that options should either be marked + * with @EngineOption so they are sure to be the same, or that options differing is benign. + */ @CApiBuiltin(ret = Int, call = Ignored) abstract static class PyTruffle_Native_Options extends CApiNullaryBuiltinNode { @Specialization + @TruffleBoundary int getNativeOptions() { int options = 0; - if (getContext().getOption(PythonOptions.TraceNativeMemory)) { + PythonLanguage language = PythonLanguage.get(null); + if (language.getEngineOption(PythonOptions.TraceNativeMemory)) { options |= TRACE_MEM; } if (LOGGER.isLoggable(Level.INFO)) { @@ -1486,6 +1684,9 @@ int getNativeOptions() { if (PythonContext.DEBUG_CAPI) { options |= DEBUG_CAPI; } + if (language.getEngineOption(PythonOptions.PythonGC)) { + options |= PYTHON_GC; + } return options; } } @@ -1576,16 +1777,7 @@ int doIt(Object object) { } return 1; } - if (!getContext().getOption(PythonOptions.NativeModules)) { - Env env = getContext().getEnv(); - LanguageInfo llvmInfo = env.getInternalLanguages().get(J_LLVM_LANGUAGE); - Toolchain toolchain = env.lookup(llvmInfo, Toolchain.class); - if (J_NATIVE.equals(toolchain.getIdentifier())) { - InteropLibrary.getUncached().toNative(object); - } - } else { - InteropLibrary.getUncached().toNative(object); - } + InteropLibrary.getUncached().toNative(object); return 0; } } @@ -1721,92 +1913,18 @@ private static PythonManagedClass lookupBuiltinTypeWithName(PythonContext contex } } - /** - * A native wrapper for arbitrary byte arrays (i.e. the store of a Python Bytes object) to be - * used like a {@code char*} pointer. - */ - @ExportLibrary(InteropLibrary.class) - @SuppressWarnings("truffle-abstract-export") - public static final class PMMapWrapper implements TruffleObject { - - private final PMMap delegate; - - public PMMapWrapper(PMMap delegate) { - this.delegate = delegate; - } - - @ExportMessage - @SuppressWarnings("static-method") - boolean hasBufferElements() { - return true; - } - - @ExportMessage - long getBufferSize() { - return delegate.getLength(); - } - - private final void checkIndex(long idx) throws InvalidBufferOffsetException { - long len = delegate.getLength(); - if (idx < 0 || idx >= len) { - throw InvalidBufferOffsetException.create(idx, len); - } - } - - @ExportMessage - byte readBufferByte(long idx, - @Bind("$node") Node inliningTarget, - @CachedLibrary(limit = "1") PosixSupportLibrary posixSupportLib, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) throws InvalidBufferOffsetException { - checkIndex(idx); - try { - return (posixSupportLib.mmapReadByte(PythonContext.get(posixSupportLib).getPosixSupport(), delegate.getPosixSupportHandle(), idx)); - } catch (PosixException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSError(null, e.getErrorCode(), e.getMessageAsTruffleString()); - } - } - - @ExportMessage - @SuppressWarnings({"static-method", "unused"}) - short readBufferShort(ByteOrder order, long byteOffset) throws UnsupportedMessageException { - throw UnsupportedMessageException.create(); - } - - @ExportMessage - @SuppressWarnings({"static-method", "unused"}) - int readBufferInt(ByteOrder order, long byteOffset) throws UnsupportedMessageException { - throw UnsupportedMessageException.create(); - } - - @ExportMessage - @SuppressWarnings({"static-method", "unused"}) - long readBufferLong(ByteOrder order, long byteOffset) throws UnsupportedMessageException { - throw UnsupportedMessageException.create(); - } - - @ExportMessage - @SuppressWarnings({"static-method", "unused"}) - float readBufferFloat(ByteOrder order, long byteOffset) throws UnsupportedMessageException { - throw UnsupportedMessageException.create(); - } - - @ExportMessage - @SuppressWarnings({"static-method", "unused"}) - double readBufferDouble(ByteOrder order, long byteOffset) throws UnsupportedMessageException { - throw UnsupportedMessageException.create(); - } - } - @CApiBuiltin(ret = CHAR_PTR, args = {PyObject}, call = Ignored) abstract static class PyTruffle_GetMMapData extends CApiUnaryBuiltinNode { @Specialization Object get(PMMap object, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib) { + @Bind("this") Node inliningTarget, + @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Cached PConstructAndRaiseNode.Lazy raiseNode) { try { return posixLib.mmapGetPointer(getPosixSupport(), object.getPosixSupportHandle()); } catch (PosixSupportLibrary.UnsupportedPosixFeatureException e) { - return new PMMapWrapper(object); + throw raiseNode.get(inliningTarget).raiseOSErrorUnsupported(null, e); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextByteArrayBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextByteArrayBuiltins.java index 8cfbb409bb..fbe4cc493a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextByteArrayBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextByteArrayBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -78,17 +78,17 @@ static Object doNative(PythonAbstractNativeObject obj, @Cached GetPythonObjectClassNode getClassNode, @Cached IsSubtypeNode isSubtypeNode, @Cached CStructAccess.GetElementPtrNode getArray, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (isSubtypeNode.execute(getClassNode.execute(inliningTarget, obj), PythonBuiltinClassType.PByteArray)) { return getArray.getElementPtr(obj.getPtr(), CFields.PyByteArrayObject__ob_start); } - return doError(obj, raiseNode.get(inliningTarget)); + return doError(obj, raiseNode); } @Fallback static Object doError(Object obj, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.EXPECTED_S_P_FOUND, "bytearray", obj); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.TypeError, ErrorMessages.EXPECTED_S_P_FOUND, "bytearray", obj); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBytesBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBytesBuiltins.java index e146727e9e..7dd9b9c07f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBytesBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBytesBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -53,13 +53,11 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Py_ssize_t; import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyVarObject__ob_size; -import static com.oracle.graal.python.nodes.ErrorMessages.CANNOT_CONVERT_P_OBJ_TO_S; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ITER__; import java.util.Arrays; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.BytesNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath; @@ -87,17 +85,14 @@ import com.oracle.graal.python.builtins.objects.str.StringBuiltins.ModNode; import com.oracle.graal.python.lib.PyBytesCheckNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; -import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.lib.PyObjectSizeNode; import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; -import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; import com.oracle.graal.python.nodes.util.CastToByteNode; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.OverflowException; @@ -141,7 +136,7 @@ static long doOther(PythonAbstractNativeObject obj, @TruffleBoundary static long fallback(Object obj, @Bind("this") Node inliningTarget) { - throw PRaiseNode.raiseUncached(inliningTarget, TypeError, ErrorMessages.EXPECTED_BYTES_P_FOUND, obj); + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.EXPECTED_BYTES_P_FOUND, obj); } } @@ -176,33 +171,17 @@ static Object fromFormat(TruffleString fmt, Object args, @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject}, call = Direct) abstract static class PyBytes_FromObject extends CApiUnaryBuiltinNode { - @Specialization - static Object fromObject(Object obj, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached IsSubtypeNode isSubtypeNode, - @Cached BytesNode bytesNode, - @Cached PyObjectLookupAttr lookupAttrNode, - @Cached PRaiseNode.Lazy raiseNode) { - if (PGuards.isPBytes(obj)) { - return obj; - } else { - Object klass = getClassNode.execute(inliningTarget, obj); - if (isSubtypeNode.execute(klass, PythonBuiltinClassType.PBytes)) { - return obj; - } else if (isAcceptedSubtype(inliningTarget, obj, klass, isSubtypeNode, lookupAttrNode)) { - return bytesNode.execute(null, PythonBuiltinClassType.PBytes, obj, PNone.NO_VALUE, PNone.NO_VALUE); - } else { - throw raiseNode.get(inliningTarget).raise(TypeError, CANNOT_CONVERT_P_OBJ_TO_S, obj, "bytes"); - } - } + @Specialization(guards = "isBuiltinBytes(bytes)") + static Object bytes(PBytes bytes) { + return bytes; } - private static boolean isAcceptedSubtype(Node inliningTarget, Object obj, Object klass, IsSubtypeNode isSubtypeNode, PyObjectLookupAttr lookupAttrNode) { - return isSubtypeNode.execute(klass, PythonBuiltinClassType.PList) || - isSubtypeNode.execute(klass, PythonBuiltinClassType.PTuple) || - isSubtypeNode.execute(klass, PythonBuiltinClassType.PMemoryView) || - (!isSubtypeNode.execute(klass, PythonBuiltinClassType.PString) && lookupAttrNode.execute(null, inliningTarget, obj, T___ITER__) != PNone.NO_VALUE); + @Fallback + static Object fromObject(Object obj, + @Bind("this") Node inliningTarget, + @Cached BytesNodes.BytesFromObject fromObject) { + byte[] bytes = fromObject.execute(null, obj); + return PFactory.createBytes(PythonLanguage.get(inliningTarget), bytes); } } @@ -217,30 +196,30 @@ abstract static class PyTruffleBytes_FromStringAndSize extends CApiBinaryBuiltin @Specialization static Object doGeneric(PythonNativeWrapper object, long size, + @Bind PythonLanguage language, @Cached NativeToPythonNode asPythonObjectNode, - @Exclusive @Cached BytesNodes.ToBytesNode getByteArrayNode, - @Shared @Cached PythonObjectFactory factory) { + @Exclusive @Cached BytesNodes.ToBytesNode getByteArrayNode) { byte[] ary = getByteArrayNode.execute(null, asPythonObjectNode.execute(object)); if (size >= 0 && size < ary.length) { // cast to int is guaranteed because of 'size < ary.length' - return factory.createBytes(Arrays.copyOf(ary, (int) size)); + return PFactory.createBytes(language, Arrays.copyOf(ary, (int) size)); } else { - return factory.createBytes(ary); + return PFactory.createBytes(language, ary); } } @Specialization(guards = "!isNativeWrapper(nativePointer)") static Object doNativePointer(Object nativePointer, long size, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Exclusive @Cached GetByteArrayNode getByteArrayNode, - @Shared @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { - return factory.createBytes(getByteArrayNode.execute(inliningTarget, nativePointer, size)); + return PFactory.createBytes(language, getByteArrayNode.execute(inliningTarget, nativePointer, size)); } catch (InteropException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.M, e); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.M, e); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.SystemError, ErrorMessages.NEGATIVE_SIZE_PASSED); + throw raiseNode.raise(inliningTarget, PythonErrorType.SystemError, ErrorMessages.NEGATIVE_SIZE_PASSED); } } } @@ -250,30 +229,30 @@ static Object doNativePointer(Object nativePointer, long size, abstract static class PyTruffleByteArray_FromStringAndSize extends CApiBinaryBuiltinNode { @Specialization static Object doGeneric(PythonNativeWrapper object, long size, + @Bind PythonLanguage language, @Cached NativeToPythonNode asPythonObjectNode, - @Exclusive @Cached BytesNodes.ToBytesNode getByteArrayNode, - @Shared @Cached PythonObjectFactory factory) { + @Exclusive @Cached BytesNodes.ToBytesNode getByteArrayNode) { byte[] ary = getByteArrayNode.execute(null, asPythonObjectNode.execute(object)); if (size >= 0 && size < ary.length) { // cast to int is guaranteed because of 'size < ary.length' - return factory.createByteArray(Arrays.copyOf(ary, (int) size)); + return PFactory.createByteArray(language, Arrays.copyOf(ary, (int) size)); } else { - return factory.createByteArray(ary); + return PFactory.createByteArray(language, ary); } } @Specialization(guards = "!isNativeWrapper(nativePointer)") static Object doNativePointer(Object nativePointer, long size, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Exclusive @Cached GetByteArrayNode getByteArrayNode, - @Shared @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { - return factory.createByteArray(getByteArrayNode.execute(inliningTarget, nativePointer, size)); + return PFactory.createByteArray(language, getByteArrayNode.execute(inliningTarget, nativePointer, size)); } catch (InteropException e) { - return raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.M, e); + return raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.M, e); } catch (OverflowException e) { - return raiseNode.get(inliningTarget).raise(PythonErrorType.SystemError, ErrorMessages.NEGATIVE_SIZE_PASSED); + return raiseNode.raise(inliningTarget, PythonErrorType.SystemError, ErrorMessages.NEGATIVE_SIZE_PASSED); } } } @@ -302,8 +281,8 @@ static int resize(PBytesLike self, long newSizeL, @Fallback static int fallback(Object self, @SuppressWarnings("unused") Object o, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(SystemError, ErrorMessages.EXPECTED_S_NOT_P, "a bytes object", self); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, ErrorMessages.EXPECTED_S_NOT_P, "a bytes object", self); } } @@ -312,43 +291,43 @@ abstract static class PyTruffle_Bytes_EmptyWithCapacity extends CApiUnaryBuiltin @Specialization static PBytes doInt(int size, - @Shared @Cached PythonObjectFactory factory) { - return factory.createBytes(new byte[size]); + @Bind PythonLanguage language) { + return PFactory.createBytes(language, new byte[size]); } @Specialization(rewriteOn = OverflowException.class) static PBytes doLong(long size, - @Shared @Cached PythonObjectFactory factory) throws OverflowException { - return doInt(PInt.intValueExact(size), factory); + @Bind PythonLanguage language) throws OverflowException { + return doInt(PInt.intValueExact(size), language); } @Specialization(replaces = "doLong") static PBytes doLongOvf(long size, @Bind("this") Node inliningTarget, - @Shared @Cached PythonObjectFactory factory, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Shared("raiseNode") @Cached PRaiseNode raiseNode) { try { - return doInt(PInt.intValueExact(size), factory); + return doInt(PInt.intValueExact(size), language); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raiseNumberTooLarge(IndexError, size); + throw raiseNode.raise(inliningTarget, IndexError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, size); } } @Specialization(rewriteOn = OverflowException.class) static PBytes doPInt(PInt size, - @Shared @Cached PythonObjectFactory factory) throws OverflowException { - return doInt(size.intValueExact(), factory); + @Bind PythonLanguage language) throws OverflowException { + return doInt(size.intValueExact(), language); } @Specialization(replaces = "doPInt") static PBytes doPIntOvf(PInt size, @Bind("this") Node inliningTarget, - @Shared @Cached PythonObjectFactory factory, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Shared("raiseNode") @Cached PRaiseNode raiseNode) { try { - return doInt(size.intValueExact(), factory); + return doInt(size.intValueExact(), language); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raiseNumberTooLarge(IndexError, size); + throw raiseNode.raise(inliningTarget, IndexError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, size); } } } @@ -358,43 +337,43 @@ abstract static class PyTruffle_ByteArray_EmptyWithCapacity extends CApiUnaryBui @Specialization static PByteArray doInt(int size, - @Shared @Cached PythonObjectFactory factory) { - return factory.createByteArray(new byte[size]); + @Bind PythonLanguage language) { + return PFactory.createByteArray(language, new byte[size]); } @Specialization(rewriteOn = OverflowException.class) static PByteArray doLong(long size, - @Shared @Cached PythonObjectFactory factory) throws OverflowException { - return doInt(PInt.intValueExact(size), factory); + @Bind PythonLanguage language) throws OverflowException { + return doInt(PInt.intValueExact(size), language); } @Specialization(replaces = "doLong") static PByteArray doLongOvf(long size, @Bind("this") Node inliningTarget, - @Shared @Cached PythonObjectFactory factory, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Shared("raiseNode") @Cached PRaiseNode raiseNode) { try { - return doInt(PInt.intValueExact(size), factory); + return doInt(PInt.intValueExact(size), language); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raiseNumberTooLarge(IndexError, size); + throw raiseNode.raise(inliningTarget, IndexError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, size); } } @Specialization(rewriteOn = OverflowException.class) static PByteArray doPInt(PInt size, - @Shared @Cached PythonObjectFactory factory) throws OverflowException { - return doInt(size.intValueExact(), factory); + @Bind PythonLanguage language) throws OverflowException { + return doInt(size.intValueExact(), language); } @Specialization(replaces = "doPInt") static PByteArray doPIntOvf(PInt size, @Bind("this") Node inliningTarget, - @Shared @Cached PythonObjectFactory factory, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Shared("raiseNode") @Cached PRaiseNode raiseNode) { try { - return doInt(size.intValueExact(), factory); + return doInt(size.intValueExact(), language); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raiseNumberTooLarge(IndexError, size); + throw raiseNode.raise(inliningTarget, IndexError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, size); } } } @@ -435,17 +414,17 @@ static Object doNative(PythonAbstractNativeObject obj, @Cached GetPythonObjectClassNode getClassNode, @Cached IsSubtypeNode isSubtypeNode, @Cached CStructAccess.GetElementPtrNode getArray, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (isSubtypeNode.execute(getClassNode.execute(inliningTarget, obj), PythonBuiltinClassType.PBytes)) { return getArray.getElementPtr(obj.getPtr(), CFields.PyBytesObject__ob_sval); } - return doError(obj, raiseNode.get(inliningTarget)); + return doError(obj, raiseNode); } @Fallback static Object doError(Object obj, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.EXPECTED_S_P_FOUND, "bytes", obj); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.TypeError, ErrorMessages.EXPECTED_S_P_FOUND, "bytes", obj); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextCEvalBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextCEvalBuiltins.java index 6492abf827..f8c63811ea 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextCEvalBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextCEvalBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -51,7 +51,6 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyThreadState; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Void; -import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApi11BuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiNullaryBuiltinNode; @@ -71,7 +70,7 @@ import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.nodes.argument.CreateArgumentsNode; -import com.oracle.graal.python.nodes.call.GenericInvokeNode; +import com.oracle.graal.python.nodes.call.CallDispatchers; import com.oracle.graal.python.nodes.frame.GetCurrentFrameRef; import com.oracle.graal.python.nodes.frame.ReadCallerFrameNode; import com.oracle.graal.python.nodes.object.GetDictIfExistsNode; @@ -93,9 +92,10 @@ abstract static class PyEval_SaveThread extends CApiNullaryBuiltinNode { private static final TruffleLogger LOGGER = CApiContext.getLogger(PyEval_SaveThread.class); @Specialization - static Object save(@Cached GilNode gil) { - PythonContext context = PythonContext.get(gil); - Object threadState = PThreadState.getOrCreateNativeThreadState(PythonLanguage.get(gil), context); + static Object save(@Cached GilNode gil, + @Bind("this") Node inliningTarget, + @Bind PythonContext context) { + Object threadState = PThreadState.getOrCreateNativeThreadState(context.getLanguage(inliningTarget), context); LOGGER.fine("C extension releases GIL"); gil.release(context, true); return threadState; @@ -108,13 +108,14 @@ abstract static class PyEval_RestoreThread extends CApiUnaryBuiltinNode { @Specialization static Object restore(@SuppressWarnings("unused") Object ptr, + @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached GilNode gil) { - PythonContext context = PythonContext.get(gil); /* * The thread state is not really used but fetching it checks if we are shutting down * and will handle that properly. */ - context.getThreadState(PythonLanguage.get(gil)); + context.getThreadState(context.getLanguage(inliningTarget)); LOGGER.fine("C extension acquires GIL"); gil.acquire(context); return PNone.NO_VALUE; @@ -156,8 +157,8 @@ static Object doGeneric(PCode code, Object globals, Object locals, @Cached SequenceNodes.GetObjectArrayNode getObjectArrayNode, @Cached CodeNodes.GetCodeSignatureNode getSignatureNode, @Cached CodeNodes.GetCodeCallTargetNode getCallTargetNode, - @Cached CreateArgumentsNode.CreateAndCheckArgumentsNode createAndCheckArgumentsNode, - @Cached GenericInvokeNode invokeNode) { + @Cached CreateArgumentsNode createArgumentsNode, + @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) { Object[] defaults = readNode.readPyObjectArray(defaultValueArrayPtr, defaultValueCount); PKeyword[] kwdefaults = castKwargsNode.execute(inliningTarget, kwdefaultsWrapper); PCell[] closure = null; @@ -176,7 +177,7 @@ static Object doGeneric(PCode code, Object globals, Object locals, // prepare Python frame arguments Object[] userArguments = readNode.readPyObjectArray(argumentArrayPtr, argumentCount); Signature signature = getSignatureNode.execute(inliningTarget, code); - Object[] pArguments = createAndCheckArgumentsNode.execute(inliningTarget, code, userArguments, keywords, signature, null, null, defaults, kwdefaults, false); + Object[] pArguments = createArgumentsNode.execute(inliningTarget, code, userArguments, keywords, signature, null, null, defaults, kwdefaults, false); // set custom locals if (!(locals instanceof PNone)) { @@ -193,7 +194,7 @@ static Object doGeneric(PCode code, Object globals, Object locals, } RootCallTarget rootCallTarget = getCallTargetNode.execute(inliningTarget, code); - return invokeNode.execute(rootCallTarget, pArguments); + return invoke.execute(null, inliningTarget, rootCallTarget, pArguments); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextCapsuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextCapsuleBuiltins.java index 4959c1422b..acf80b9b04 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextCapsuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextCapsuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,56 +44,69 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError; import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Direct; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.ConstCharPtr; -import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.ConstCharPtrAsTruffleString; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PY_CAPSULE_DESTRUCTOR; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Pointer; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer; +import static com.oracle.graal.python.nodes.ErrorMessages.CALLED_WITH_INCORRECT_NAME; import static com.oracle.graal.python.nodes.ErrorMessages.CALLED_WITH_INVALID_PY_CAPSULE_OBJECT; +import static com.oracle.graal.python.nodes.ErrorMessages.CALLED_WITH_NULL_POINTER; import static com.oracle.graal.python.nodes.ErrorMessages.PY_CAPSULE_IMPORT_S_IS_NOT_VALID; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiTernaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; -import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.capsule.PyCapsule; import com.oracle.graal.python.builtins.objects.capsule.PyCapsuleNameMatchesNode; -import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CStringWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.StringLiterals; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; import com.oracle.graal.python.nodes.statement.AbstractImportNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.api.strings.TruffleString.Encoding; -import com.oracle.truffle.api.strings.TruffleString.GetInternalNativePointerNode; public final class PythonCextCapsuleBuiltins { - @CApiBuiltin(ret = PyObjectTransfer, args = {Pointer, ConstCharPtrAsTruffleString, PY_CAPSULE_DESTRUCTOR}, call = Direct) + @CApiBuiltin(ret = PyObjectTransfer, args = {Pointer, ConstCharPtr, PY_CAPSULE_DESTRUCTOR}, call = Direct) abstract static class PyCapsule_New extends CApiTernaryBuiltinNode { @Specialization - static Object doGeneric(Object pointer, Object name, Object destructor, + static Object doGeneric(Object pointer, Object namePtr, Object destructor, @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "2") InteropLibrary interopLibrary, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PyCapsuleNewNode pyCapsuleNewNode) { + return pyCapsuleNewNode.execute(inliningTarget, pointer, namePtr, destructor); + } + } + + @GenerateCached(false) + @GenerateInline + public abstract static class PyCapsuleNewNode extends Node { + + public abstract PyCapsule execute(Node inliningTarget, Object pointer, Object name, Object destructor); + + @Specialization + static PyCapsule doGeneric(Node inliningTarget, Object pointer, Object namePtr, Object destructor, + @CachedLibrary(limit = "1") InteropLibrary interopLibrary, + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { if (interopLibrary.isNull(pointer)) { - throw raiseNode.get(inliningTarget).raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT); + throw raiseNode.raise(inliningTarget, ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT); } - Object n = interopLibrary.isNull(name) ? null : name; - PyCapsule capsule = factory.createCapsule(pointer, n); + PyCapsule capsule = PFactory.createCapsuleNativeName(language, pointer, interopLibrary.isNull(namePtr) ? null : namePtr); if (!interopLibrary.isNull(destructor)) { capsule.registerDestructor(destructor); } @@ -101,16 +114,16 @@ static Object doGeneric(Object pointer, Object name, Object destructor, } } - @CApiBuiltin(ret = Int, args = {PyObject, ConstCharPtrAsTruffleString}, call = Direct) - public abstract static class PyCapsule_IsValid extends CApiBinaryBuiltinNode { + @CApiBuiltin(ret = Int, args = {PyObject, ConstCharPtr}, call = Direct) + abstract static class PyCapsule_IsValid extends CApiBinaryBuiltinNode { @Specialization - public static int doCapsule(PyCapsule o, TruffleString name, + static int doCapsule(PyCapsule o, Object namePtr, @Bind("this") Node inliningTarget, @Cached PyCapsuleNameMatchesNode nameMatchesNode) { if (o.getPointer() == null) { return 0; } - if (!nameMatchesNode.execute(inliningTarget, name, o.getName())) { + if (!nameMatchesNode.execute(inliningTarget, namePtr, o.getNamePtr())) { return 0; } return 1; @@ -122,84 +135,59 @@ static Object doError(@SuppressWarnings("unused") Object o, @SuppressWarnings("u } } - @CApiBuiltin(ret = Pointer, args = {PyObject, ConstCharPtrAsTruffleString}, call = Direct) + @CApiBuiltin(ret = Pointer, args = {PyObject, ConstCharPtr}, call = Direct) abstract static class PyCapsule_GetPointer extends CApiBinaryBuiltinNode { @Specialization - static Object doCapsule(PyCapsule o, Object name, + static Object doCapsule(Object o, Object name, @Bind("this") Node inliningTarget, + @Cached PyCapsuleGetPointerNode pyCapsuleGetPointerNode) { + return pyCapsuleGetPointerNode.execute(inliningTarget, o, name); + } + } + + @GenerateCached(false) + @GenerateInline + @GenerateUncached + public abstract static class PyCapsuleGetPointerNode extends Node { + + public abstract Object execute(Node inliningTarget, Object capsule, Object name); + + @Specialization + static Object doCapsule(Node inliningTarget, PyCapsule o, Object name, @Cached PyCapsuleNameMatchesNode nameMatchesNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (o.getPointer() == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_GetPointer"); + throw raiseNode.raise(inliningTarget, ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_GetPointer"); } - if (!nameMatchesNode.execute(inliningTarget, name, o.getName())) { - throw raiseNode.get(inliningTarget).raise(ValueError, PY_CAPSULE_IMPORT_S_IS_NOT_VALID); + if (!nameMatchesNode.execute(inliningTarget, name, o.getNamePtr())) { + throw raiseNode.raise(inliningTarget, ValueError, CALLED_WITH_INCORRECT_NAME, "PyCapsule_GetPointer"); } return o.getPointer(); } @Fallback - static Object doError(@SuppressWarnings("unused") Object o, @SuppressWarnings("unused") Object name, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_GetPointer"); + static Object doError(Node inliningTarget, @SuppressWarnings("unused") Object o, @SuppressWarnings("unused") Object name) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_GetPointer"); } } @CApiBuiltin(ret = ConstCharPtr, args = {PyObject}, call = Direct) abstract static class PyCapsule_GetName extends CApiUnaryBuiltinNode { - private static void checkLegalCapsule(Node inliningTarget, PyCapsule capsule, PRaiseNode.Lazy raiseNode) { - if (capsule.getPointer() == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_GetName"); - } - } - - private static Object tsToNative(TruffleString tname, GetInternalNativePointerNode getInternalNativePointerNode) { - if (tname.isNative()) { - /* - * We assume encoding UTF-8 because it's the most common one and also specified in - * HPy. However, CPython does not actually specify an encoding. - */ - return getInternalNativePointerNode.execute(tname, Encoding.UTF_8); - } - return new CStringWrapper(tname); - } - - @Specialization(guards = "isTruffleString(name)") - static Object doTruffleString(PyCapsule o, - @Bind("this") Node inliningTarget, - @Bind("o.getName()") Object name, - @Shared("a") @Cached GetInternalNativePointerNode getInternalNativePointerNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - checkLegalCapsule(inliningTarget, o, raiseNode); - - // cast to TruffleString guaranteed by the guard - return tsToNative((TruffleString) name, getInternalNativePointerNode); - } - @Specialization(replaces = "doTruffleString") - Object doGeneric(PyCapsule o, + @Specialization + Object get(PyCapsule o, @Bind("this") Node inliningTarget, - @Bind("o.getName()") Object name, - @Shared("a") @Cached GetInternalNativePointerNode getInternalNativePointerNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - checkLegalCapsule(inliningTarget, o, raiseNode); - if (name == null) { - return getNULL(); - } - if (name instanceof TruffleString) { - return tsToNative((TruffleString) name, getInternalNativePointerNode); + @Cached PRaiseNode raiseNode) { + if (o.getPointer() == null) { + throw raiseNode.raise(inliningTarget, ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_GetName"); } - /* - * If 'name' is not a TruffleString, we assume it is a native pointer and return it - * without further conversion. - */ - return name; + return o.getNamePtr() == null ? getNULL() : o.getNamePtr(); } @Fallback static Object doit(@SuppressWarnings("unused") Object o, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_GetName"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_GetName"); } } @@ -208,9 +196,9 @@ abstract static class PyCapsule_GetDestructor extends CApiUnaryBuiltinNode { @Specialization Object doCapsule(PyCapsule o, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (o.getPointer() == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_GetDestructor"); + throw raiseNode.raise(inliningTarget, ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_GetDestructor"); } if (o.getDestructor() == null) { return getNULL(); @@ -220,8 +208,8 @@ Object doCapsule(PyCapsule o, @Fallback static Object doError(@SuppressWarnings("unused") Object o, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_GetPointer"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_GetPointer"); } } @@ -230,9 +218,9 @@ abstract static class PyCapsule_GetContext extends CApiUnaryBuiltinNode { @Specialization Object doCapsule(PyCapsule o, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (o.getPointer() == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_GetContext"); + throw raiseNode.raise(inliningTarget, ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_GetContext"); } if (o.getContext() == null) { return getNULL(); @@ -242,8 +230,8 @@ Object doCapsule(PyCapsule o, @Fallback static Object doError(@SuppressWarnings("unused") Object o, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_GetPointer"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_GetPointer"); } } @@ -253,13 +241,13 @@ abstract static class PyCapsule_SetPointer extends CApiBinaryBuiltinNode { static int doCapsule(PyCapsule o, Object pointer, @Bind("this") Node inliningTarget, @CachedLibrary(limit = "2") InteropLibrary interopLibrary, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (interopLibrary.isNull(pointer)) { - throw raiseNode.get(inliningTarget).raise(ValueError, PY_CAPSULE_IMPORT_S_IS_NOT_VALID); + throw raiseNode.raise(inliningTarget, ValueError, CALLED_WITH_NULL_POINTER, "PyCapsule_SetPointer"); } if (o.getPointer() == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_SetPointer"); + throw raiseNode.raise(inliningTarget, ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_SetPointer"); } o.setPointer(pointer); @@ -268,39 +256,29 @@ static int doCapsule(PyCapsule o, Object pointer, @Fallback static Object doError(@SuppressWarnings("unused") Object o, @SuppressWarnings("unused") Object name, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_SetPointer"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_SetPointer"); } } - @CApiBuiltin(ret = Int, args = {PyObject, ConstCharPtrAsTruffleString}, call = Direct) + @CApiBuiltin(ret = Int, args = {PyObject, ConstCharPtr}, call = Direct) abstract static class PyCapsule_SetName extends CApiBinaryBuiltinNode { @Specialization - static int doCapsuleTruffleString(PyCapsule o, TruffleString name, - @Bind("this") Node inliningTarget, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - if (o.getPointer() == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_SetName"); - } - o.setName(name); - return 0; - } - - @Specialization(guards = "isNoValue(name)") - static int doCapsuleNone(PyCapsule o, @SuppressWarnings("unused") PNone name, + static int set(PyCapsule o, Object namePtr, @Bind("this") Node inliningTarget, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @CachedLibrary(limit = "1") InteropLibrary lib, + @Cached PRaiseNode raiseNode) { if (o.getPointer() == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_SetName"); + throw raiseNode.raise(inliningTarget, ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_SetName"); } - o.setName(null); + o.setNamePtr(lib.isNull(namePtr) ? null : namePtr); return 0; } @Fallback static Object doError(@SuppressWarnings("unused") Object o, @SuppressWarnings("unused") Object name, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_SetName"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_SetName"); } } @@ -310,9 +288,9 @@ abstract static class PyCapsule_SetDestructor extends CApiBinaryBuiltinNode { static int doCapsule(PyCapsule o, Object destructor, @Bind("this") Node inliningTarget, @CachedLibrary(limit = "1") InteropLibrary lib, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (o.getPointer() == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_SetDestructor"); + throw raiseNode.raise(inliningTarget, ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_SetDestructor"); } o.registerDestructor(lib.isNull(destructor) ? null : destructor); return 0; @@ -320,8 +298,8 @@ static int doCapsule(PyCapsule o, Object destructor, @Fallback static Object doError(@SuppressWarnings("unused") Object o, @SuppressWarnings("unused") Object name, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_SetDestructor"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_SetDestructor"); } } @@ -330,9 +308,9 @@ abstract static class PyCapsule_SetContext extends CApiBinaryBuiltinNode { @Specialization static int doCapsule(PyCapsule o, Object context, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (o.getPointer() == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_SetContext"); + throw raiseNode.raise(inliningTarget, ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_SetContext"); } o.setContext(context); return 0; @@ -340,22 +318,24 @@ static int doCapsule(PyCapsule o, Object context, @Fallback static Object doError(@SuppressWarnings("unused") Object o, @SuppressWarnings("unused") Object name, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_SetContext"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, CALLED_WITH_INVALID_PY_CAPSULE_OBJECT, "PyCapsule_SetContext"); } } - @CApiBuiltin(ret = Pointer, args = {ConstCharPtrAsTruffleString, Int}, call = Direct) + @CApiBuiltin(ret = Pointer, args = {ConstCharPtr, Int}, call = Direct) abstract static class PyCapsule_Import extends CApiBinaryBuiltinNode { @Specialization - static Object doGeneric(TruffleString name, @SuppressWarnings("unused") int noBlock, + static Object doGeneric(Object namePtr, @SuppressWarnings("unused") int noBlock, @Bind("this") Node inliningTarget, + @Cached CApiTransitions.CharPtrToPythonNode charPtrToPythonNode, @Cached PyCapsuleNameMatchesNode nameMatchesNode, @Cached TruffleString.CodePointLengthNode codePointLengthNode, @Cached TruffleString.IndexOfStringNode indexOfStringNode, @Cached TruffleString.SubstringNode substringNode, @Cached ReadAttributeFromObjectNode getAttrNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { + TruffleString name = (TruffleString) charPtrToPythonNode.execute(namePtr); TruffleString trace = name; Object object = null; while (trace != null) { @@ -377,10 +357,10 @@ static Object doGeneric(TruffleString name, @SuppressWarnings("unused") int noBl /* compare attribute name to module.name by hand */ PyCapsule capsule = object instanceof PyCapsule ? (PyCapsule) object : null; - if (capsule != null && PyCapsule_IsValid.doCapsule(capsule, name, inliningTarget, nameMatchesNode) == 1) { + if (capsule != null && PyCapsule_IsValid.doCapsule(capsule, namePtr, inliningTarget, nameMatchesNode) == 1) { return capsule.getPointer(); } else { - throw raiseNode.get(inliningTarget).raise(AttributeError, PY_CAPSULE_IMPORT_S_IS_NOT_VALID, name); + throw raiseNode.raise(inliningTarget, AttributeError, PY_CAPSULE_IMPORT_S_IS_NOT_VALID, name); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextClassBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextClassBuiltins.java index 65c58365f9..d542cf7d3b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextClassBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextClassBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,13 +44,13 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; import com.oracle.graal.python.builtins.objects.method.PDecoratedMethod; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; @@ -63,10 +63,10 @@ abstract static class PyInstanceMethod_New extends CApiUnaryBuiltinNode { @Specialization static Object staticmethod(Object func, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { checkNonNullArg(inliningTarget, func, raiseNode); - PDecoratedMethod res = factory.createInstancemethod(PythonBuiltinClassType.PInstancemethod); + PDecoratedMethod res = PFactory.createInstancemethod(language); res.setCallable(func); return res; } @@ -77,12 +77,12 @@ abstract static class PyMethod_New extends CApiBinaryBuiltinNode { @Specialization static Object methodNew(Object func, Object self, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { checkNonNullArg(inliningTarget, func, self, raiseNode); // Note: CPython also constructs the object directly, without running the constructor or // checking the inputs - return factory.createMethod(self, func); + return PFactory.createMethod(language, self, func); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextCodeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextCodeBuiltins.java index 4c53354244..cd67388846 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextCodeBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextCodeBuiltins.java @@ -117,7 +117,7 @@ static int addr2line(PCode code, int lasti) { if (lasti < 0) { return code.co_firstlineno(); } - return code.bciToLine(code.lastiToBci(lasti)); + return code.lastiToLine(lasti); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextComplexBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextComplexBuiltins.java index 6797e32c2e..000150245d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextComplexBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextComplexBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -50,8 +50,8 @@ import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FLOAT__; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.ComplexNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; @@ -59,6 +59,7 @@ import com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor; import com.oracle.graal.python.builtins.objects.cext.structs.CFields; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; +import com.oracle.graal.python.builtins.objects.complex.ComplexBuiltins; import com.oracle.graal.python.builtins.objects.complex.PComplex; import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.nodes.PRaiseNode; @@ -66,7 +67,7 @@ import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; @@ -90,7 +91,7 @@ static int asComplex(PComplex c, Object out, @Specialization(guards = "!isPComplex(obj)") static int doGeneric(Object obj, Object out, - @Cached ComplexNode complexNode, + @Cached ComplexBuiltins.ComplexNewNode complexNode, @Shared @Cached CStructAccess.WriteDoubleNode writeDoubleNode) { PComplex c = (PComplex) complexNode.execute(null, PythonBuiltinClassType.PComplex, obj, PNone.NO_VALUE); writeDoubleNode.write(out, CFields.Py_complex__real, c.getReal()); @@ -122,7 +123,7 @@ static Object asDouble(Object obj, @Cached CallNode callNode, @Cached GetClassNode getClassNode, @Cached IsSubtypeNode isSubtypeNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { TruffleString name; if (isComplexSubtypeProfile.profile(inliningTarget, isComplexSubtype(inliningTarget, obj, getClassNode, isSubtypeNode))) { name = T_REAL; @@ -132,7 +133,7 @@ static Object asDouble(Object obj, try { return callNode.executeWithoutFrame(getAttr.execute(null, inliningTarget, obj, name)); } catch (PException e) { - throw raiseNode.get(inliningTarget).raise(TypeError); + throw raiseNode.raise(inliningTarget, TypeError); } } } @@ -173,8 +174,8 @@ abstract static class PyComplex_FromDoubles extends CApiBinaryBuiltinNode { @Specialization static PComplex asDouble(double r, double i, - @Cached PythonObjectFactory factory) { - return factory.createComplex(r, i); + @Bind PythonLanguage language) { + return PFactory.createComplex(language, r, i); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextContextBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextContextBuiltins.java index c1394f11b2..18842442b5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextContextBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextContextBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -66,7 +66,7 @@ import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -105,13 +105,14 @@ static Object doGeneric(PNone name, @SuppressWarnings("unused") Object def) { @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject, Pointer}, call = Ignored) abstract static class PyTruffleContextVar_Get extends CApiTernaryBuiltinNode { @Specialization - Object doGeneric(Object var, Object def, Object marker, + static Object doGeneric(Object var, Object def, Object marker, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached PRaiseNativeNode.Lazy raiseNative) { if (!(var instanceof PContextVar)) { return raiseNative.get(inliningTarget).raise(null, marker, PythonBuiltinClassType.TypeError, ErrorMessages.INSTANCE_OF_CONTEXTVAR_EXPECTED); } - PythonContext.PythonThreadState threadState = getContext().getThreadState(getLanguage()); + PythonContext.PythonThreadState threadState = context.getThreadState(context.getLanguage(inliningTarget)); Object result = ((PContextVar) var).getValue(threadState); if (result == null) { if (def == PNone.NO_VALUE) { @@ -133,16 +134,16 @@ abstract static class PyContextVar_Set extends CApiBinaryBuiltinNode { @Specialization static Object doGeneric(Object var, Object val, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (!(var instanceof PContextVar)) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.INSTANCE_OF_CONTEXTVAR_EXPECTED); + @Bind PythonContext pythonContext, + @Cached PRaiseNode raiseNode) { + if (!(var instanceof PContextVar pvar)) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.INSTANCE_OF_CONTEXTVAR_EXPECTED); } - PythonContext.PythonThreadState threadState = PythonContext.get(inliningTarget).getThreadState(PythonLanguage.get(inliningTarget)); - PContextVar pvar = (PContextVar) var; + PythonLanguage language = pythonContext.getLanguage(inliningTarget); + PythonContext.PythonThreadState threadState = pythonContext.getThreadState(language); Object oldValue = pvar.getValue(threadState); pvar.setValue(threadState, val); - return factory.createContextVarsToken(pvar, oldValue); + return PFactory.createContextVarsToken(language, pvar, oldValue); } } @@ -160,8 +161,8 @@ static Object doGeneric( abstract static class PyContext_Copy extends CApiUnaryBuiltinNode { @Specialization static Object doGeneric(PContextVarsContext context, - @Cached PythonObjectFactory factory) { - return factory.copyContextVarsContext(context); + @Bind PythonLanguage language) { + return PFactory.copyContextVarsContext(language, context); } } @@ -169,8 +170,8 @@ static Object doGeneric(PContextVarsContext context, abstract static class PyContext_New extends CApiNullaryBuiltinNode { @Specialization static Object doGeneric( - @Cached PythonObjectFactory factory) { - return factory.createContextVarsContext(); + @Bind PythonLanguage language) { + return PFactory.createContextVarsContext(language); } } @@ -179,9 +180,9 @@ abstract static class PyContext_Enter extends CApiUnaryBuiltinNode { @Specialization static Object doGeneric(PContextVarsContext context, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { - PythonLanguage language = PythonLanguage.get(inliningTarget); - PythonContext.PythonThreadState threadState = getContext(inliningTarget).getThreadState(language); + @Bind PythonContext pythonContext, + @Cached PRaiseNode raiseNode) { + PythonContext.PythonThreadState threadState = pythonContext.getThreadState(pythonContext.getLanguage(inliningTarget)); context.enter(inliningTarget, threadState, raiseNode); return 0; } @@ -191,9 +192,9 @@ static Object doGeneric(PContextVarsContext context, abstract static class PyContext_Exit extends CApiUnaryBuiltinNode { @Specialization static Object doGeneric(PContextVarsContext context, - @Bind("this") Node inliningTarget) { - PythonLanguage language = PythonLanguage.get(inliningTarget); - PythonContext.PythonThreadState threadState = getContext(inliningTarget).getThreadState(language); + @Bind("this") Node inliningTarget, + @Bind PythonContext pythonContext) { + PythonContext.PythonThreadState threadState = pythonContext.getThreadState(pythonContext.getLanguage(inliningTarget)); context.leave(threadState); return 0; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextDateTimeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextDateTimeBuiltins.java index a66ff56b03..86de332a2f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextDateTimeBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextDateTimeBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -66,7 +66,7 @@ import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.nodes.argument.keywords.ExpandKeywordStarargsNode; import com.oracle.graal.python.nodes.argument.positional.ExecutePositionalStarargsNode; -import com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode; +import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; @@ -81,8 +81,8 @@ public final class PythonCextDateTimeBuiltins { abstract static class PyTruffleDateTimeCAPI_Date_FromDate extends CApiQuaternaryBuiltinNode { @Specialization static Object values(int year, int month, int day, Object type, - @Cached CallVarargsMethodNode call) { - return call.execute(null, type, new Object[]{year, month, day}, PKeyword.EMPTY_KEYWORDS); + @Cached CallNode call) { + return call.execute(null, type, year, month, day); } } @@ -90,8 +90,8 @@ static Object values(int year, int month, int day, Object type, abstract static class PyTruffleDateTimeCAPI_DateTime_FromDateAndTime extends CApi9BuiltinNode { @Specialization static Object values(int year, int month, int day, int hour, int minute, int second, int usecond, Object tzinfo, Object type, - @Cached CallVarargsMethodNode call) { - return call.execute(null, type, new Object[]{year, month, day, hour, minute, second, usecond, tzinfo}, PKeyword.EMPTY_KEYWORDS); + @Cached CallNode call) { + return call.execute(null, type, year, month, day, hour, minute, second, usecond, tzinfo); } } @@ -99,8 +99,8 @@ static Object values(int year, int month, int day, int hour, int minute, int sec abstract static class PyTruffleDateTimeCAPI_Time_FromTime extends CApi6BuiltinNode { @Specialization static Object values(int hour, int minute, int second, int usecond, Object tzinfo, Object type, - @Cached CallVarargsMethodNode call) { - return call.execute(null, type, new Object[]{hour, minute, second, usecond, tzinfo}, PKeyword.EMPTY_KEYWORDS); + @Cached CallNode call) { + return call.execute(null, type, hour, minute, second, usecond, tzinfo); } } @@ -108,9 +108,9 @@ static Object values(int hour, int minute, int second, int usecond, Object tzinf abstract static class PyTruffleDateTimeCAPI_Delta_FromDelta extends CApi5BuiltinNode { @Specialization static Object values(int days, int seconds, int useconds, @SuppressWarnings("unused") int normalize, Object type, - @Cached CallVarargsMethodNode call) { + @Cached CallNode call) { // TODO: "normalize" is ignored for the time being - return call.execute(null, type, new Object[]{days, seconds, useconds}, PKeyword.EMPTY_KEYWORDS); + return call.execute(null, type, days, seconds, useconds); } } @@ -118,8 +118,8 @@ static Object values(int days, int seconds, int useconds, @SuppressWarnings("unu abstract static class PyTruffleDateTimeCAPI_TimeZone_FromTimeZone extends CApiBinaryBuiltinNode { @Specialization Object values(Object offset, Object name, - @Cached CallVarargsMethodNode call) { - return call.execute(null, getCApiContext().timezoneType, new Object[]{offset, name}, PKeyword.EMPTY_KEYWORDS); + @Cached CallNode call) { + return call.execute(null, getCApiContext().timezoneType, offset, name); } } @@ -131,7 +131,7 @@ static Object values(Object type, Object args, Object kwargs, @Cached ExecutePositionalStarargsNode starArgsNode, @Cached ExpandKeywordStarargsNode kwArgsNode, @Cached PyObjectLookupAttr lookupNode, - @Cached CallVarargsMethodNode call) { + @Cached CallNode call) { Object[] callArgs = starArgsNode.executeWith(null, args); PKeyword[] kwds = kwArgsNode.execute(inliningTarget, kwargs); Object fromTSCallable = lookupNode.execute(null, inliningTarget, type, T_FROMTIMESTAMP); @@ -146,10 +146,10 @@ static Object values(Object type, Object args, @Bind("this") Node inliningTarget, @Cached ExecutePositionalStarargsNode starArgsNode, @Cached PyObjectLookupAttr lookupNode, - @Cached CallVarargsMethodNode call) { + @Cached CallNode call) { Object[] callArgs = starArgsNode.executeWith(null, args); Object fromTSCallable = lookupNode.execute(null, inliningTarget, type, T_FROMTIMESTAMP); - return call.execute(null, fromTSCallable, callArgs, PKeyword.EMPTY_KEYWORDS); + return call.execute(null, fromTSCallable, callArgs); } } @@ -157,7 +157,7 @@ static Object values(Object type, Object args, abstract static class PyTruffleDateTimeCAPI_DateTime_FromDateAndTimeAndFold extends CApi10BuiltinNode { @Specialization static Object values(int year, int month, int day, int hour, int minute, int second, int usecond, Object tzinfo, int fold, Object type, - @Cached CallVarargsMethodNode call) { + @Cached CallNode call) { return call.execute(null, type, new Object[]{year, month, day, hour, minute, second, usecond, tzinfo}, new PKeyword[]{new PKeyword(T_FOLD, fold)}); } } @@ -166,7 +166,7 @@ static Object values(int year, int month, int day, int hour, int minute, int sec abstract static class PyTruffleDateTimeCAPI_Time_FromTimeAndFold extends CApi7BuiltinNode { @Specialization static Object values(int hour, int minute, int second, int usecond, Object tzinfo, int fold, Object type, - @Cached CallVarargsMethodNode call) { + @Cached CallNode call) { return call.execute(null, type, new Object[]{hour, minute, second, usecond, tzinfo}, new PKeyword[]{new PKeyword(T_FOLD, fold)}); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextDescrBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextDescrBuiltins.java index ff8493c9e0..ae83c51388 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextDescrBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextDescrBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -50,15 +50,16 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyTypeObject; import static com.oracle.graal.python.builtins.objects.cext.common.CExtContext.isClassOrStaticMethod; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApi6BuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApi7BuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextTypeBuiltins.CreateGetSetNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextTypeBuiltins.NewClassMethodNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.builtins.objects.mappingproxy.MappingproxyBuiltins; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; @@ -71,7 +72,7 @@ public final class PythonCextDescrBuiltins { abstract static class PyDictProxy_New extends CApiUnaryBuiltinNode { @Specialization static Object values(Object obj, - @Cached BuiltinConstructors.MappingproxyNode mappingNode) { + @Cached MappingproxyBuiltins.MappingproxyNode mappingNode) { return mappingNode.execute(null, PythonBuiltinClassType.PMappingproxy, obj); } } @@ -94,14 +95,14 @@ abstract static class PyTruffleDescr_NewClassMethod extends CApi7BuiltinNode { static Object doNativeCallable(Object methodDefPtr, TruffleString name, Object doc, int flags, Object wrapper, Object methObj, Object type, @Bind("this") Node inliningTarget, @Cached NewClassMethodNode newClassMethodNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { Object func = newClassMethodNode.execute(inliningTarget, methodDefPtr, name, methObj, flags, wrapper, type, doc); if (!isClassOrStaticMethod(flags)) { /* * NewClassMethodNode only wraps method with METH_CLASS and METH_STATIC set but we * need to do so here. */ - func = factory.createClassmethodFromCallableObj(func); + func = PFactory.createClassmethodFromCallableObj(language, func); } return func; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextDictBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextDictBuiltins.java index e1e5b27a08..f8a2d152f8 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextDictBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextDictBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,6 +43,7 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.AttributeError; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError; import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Direct; +import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Ignored; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PY_HASH_T_PTR; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PY_SSIZE_T_PTR; @@ -59,8 +60,10 @@ import static com.oracle.graal.python.nodes.SpecialMethodNames.T_KEYS; import static com.oracle.graal.python.nodes.SpecialMethodNames.T_UPDATE; +import java.util.logging.Level; + +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.StrNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApi5BuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; @@ -70,12 +73,15 @@ import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.PromoteBorrowedValue; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; import com.oracle.graal.python.builtins.objects.common.EconomicMapStorage; import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes.SetItemNode; import com.oracle.graal.python.builtins.objects.common.HashingStorage; +import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageCopy; +import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageForEachCallback; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetItem; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetItemWithHash; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetIterator; @@ -89,29 +95,34 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItemWithHash; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetItemNode; import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.ClearNode; -import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.DelItemNode; import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.PopNode; import com.oracle.graal.python.builtins.objects.dict.DictNodes; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.list.PList; +import com.oracle.graal.python.builtins.objects.str.StringBuiltins; +import com.oracle.graal.python.lib.PyDictDelItem; import com.oracle.graal.python.lib.PyDictSetDefault; import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.lib.PyObjectHashNode; -import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.builtins.ListNodes.ConstructListNode; import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.util.CastToJavaLongExactNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; +import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.Frame; +import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; @@ -124,8 +135,9 @@ public final class PythonCextDictBuiltins { abstract static class PyDict_New extends CApiNullaryBuiltinNode { @Specialization - static Object run(@Cached PythonObjectFactory factory) { - return factory.createDict(); + static Object run( + @Bind PythonLanguage language) { + return PFactory.createDict(language); } } @@ -229,7 +241,7 @@ static int next(PDict dict, Object posPtr, Object keyPtr, Object valuePtr, Objec writePointerNode.write(valuePtr, toNativeNode.execute(value)); } if (!lib.isNull(hashPtr)) { - long hash = itKeyHash.execute(inliningTarget, storage, it); + long hash = itKeyHash.execute(null, inliningTarget, storage, it); writeLongNode.write(hashPtr, hash); } return 1; @@ -277,8 +289,8 @@ abstract static class PyDict_Copy extends CApiUnaryBuiltinNode { static Object copy(PDict dict, @Bind("this") Node inliningTarget, @Cached HashingStorageCopy copyNode, - @Cached PythonObjectFactory factory) { - return factory.createDict(copyNode.execute(inliningTarget, dict.getDictStorage())); + @Bind PythonLanguage language) { + return PFactory.createDict(language, copyNode.execute(inliningTarget, dict.getDictStorage())); } @Fallback @@ -317,9 +329,9 @@ static Object getItem(PDict dict, Object key, @Specialization(guards = "!isDict(obj)") static Object getItem(Object obj, @SuppressWarnings("unused") Object key, - @Cached StrNode strNode, - @Cached PRaiseNode raiseNode) { - return raiseNode.raise(SystemError, BAD_ARG_TO_INTERNAL_FUNC_WAS_S_P, strNode.executeWith(null, obj), obj); + @Bind("this") Node inliningTarget, + @Cached StringBuiltins.StrNewNode strNode) { + return PRaiseNode.raiseStatic(inliningTarget, SystemError, BAD_ARG_TO_INTERNAL_FUNC_WAS_S_P, strNode.executeWith(null, obj), obj); } protected boolean isDict(Object obj) { @@ -381,10 +393,10 @@ static int setItem(PDict dict, Object key, Object value, Object givenHash, @Cached CastToJavaLongExactNode castToLong, @Cached SetItemNode setItemNode, @Cached InlinedBranchProfile wrongHashProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (hashNode.execute(null, inliningTarget, key) != castToLong.execute(inliningTarget, givenHash)) { wrongHashProfile.enter(inliningTarget); - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.AssertionError, HASH_MISMATCH); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.AssertionError, HASH_MISMATCH); } setItemNode.execute(null, inliningTarget, dict, key, value); return 0; @@ -416,8 +428,9 @@ public Object fallback(Object dict, @SuppressWarnings("unused") Object key, @Sup abstract static class PyDict_DelItem extends CApiBinaryBuiltinNode { @Specialization static int delItem(PDict dict, Object key, - @Cached DelItemNode delItemNode) { - delItemNode.execute(null, dict, key); + @Bind("this") Node inliningTarget, + @Cached PyDictDelItem delItemNode) { + delItemNode.execute(null, inliningTarget, dict, key); return 0; } @@ -476,8 +489,8 @@ abstract static class PyDict_Keys extends CApiUnaryBuiltinNode { @Specialization static Object keys(PDict dict, @Cached ConstructListNode listNode, - @Cached PythonObjectFactory factory) { - return listNode.execute(null, factory.createDictKeysView(dict)); + @Bind PythonLanguage language) { + return listNode.execute(null, PFactory.createDictKeysView(language, dict)); } @Fallback @@ -491,8 +504,8 @@ abstract static class PyDict_Values extends CApiUnaryBuiltinNode { @Specialization static Object values(PDict dict, @Cached ConstructListNode listNode, - @Cached PythonObjectFactory factory) { - return listNode.execute(null, factory.createDictValuesView(dict)); + @Bind PythonLanguage language) { + return listNode.execute(null, PFactory.createDictValuesView(language, dict)); } @Fallback @@ -507,15 +520,15 @@ abstract static class PyDict_Merge extends CApiTernaryBuiltinNode { @Specialization(guards = {"override != 0"}) static int merge(PDict a, Object b, @SuppressWarnings("unused") int override, @Bind("this") Node inliningTarget, - @Cached PyObjectLookupAttr lookupKeys, - @Cached PyObjectLookupAttr lookupAttr, + @Shared @Cached PyObjectGetAttr getKeys, + @Cached PyObjectGetAttr getUpdate, @Shared @Cached CallNode callNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { // lookup "keys" to raise the right error: - if (lookupKeys.execute(null, inliningTarget, b, T_KEYS) == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(AttributeError, OBJ_P_HAS_NO_ATTR_S, b, T_KEYS); + if (getKeys.execute(null, inliningTarget, b, T_KEYS) == PNone.NO_VALUE) { + throw raiseNode.raise(inliningTarget, AttributeError, OBJ_P_HAS_NO_ATTR_S, b, T_KEYS); } - Object updateCallable = lookupAttr.execute(null, inliningTarget, a, T_UPDATE); + Object updateCallable = getUpdate.execute(null, inliningTarget, a, T_UPDATE); callNode.executeWithoutFrame(updateCallable, new Object[]{b}); return 0; } @@ -536,7 +549,7 @@ static int merge(PDict a, PDict b, @SuppressWarnings("unused") int override, HashingStorage aStorage = a.getDictStorage(); while (loopProfile.profile(inliningTarget, itBNext.execute(inliningTarget, bStorage, bIt))) { Object key = itBKey.execute(inliningTarget, bStorage, bIt); - long hash = itBKeyHash.execute(inliningTarget, bStorage, bIt); + long hash = itBKeyHash.execute(null, inliningTarget, bStorage, bIt); if (getAItem.execute(null, inliningTarget, aStorage, key, hash) != null) { setAItem.execute(null, inliningTarget, aStorage, key, hash, itBValue.execute(inliningTarget, bStorage, bIt)); } @@ -547,7 +560,7 @@ static int merge(PDict a, PDict b, @SuppressWarnings("unused") int override, @Specialization(guards = {"override == 0", "!isDict(b)"}) static int merge(PDict a, Object b, @SuppressWarnings("unused") int override, @Bind("this") Node inliningTarget, - @Cached PyObjectGetAttr getAttrNode, + @Shared @Cached PyObjectGetAttr getKeys, @Shared @Cached CallNode callNode, @Cached ConstructListNode listNode, @Cached GetItemNode getKeyNode, @@ -556,7 +569,7 @@ static int merge(PDict a, Object b, @SuppressWarnings("unused") int override, @Cached HashingStorageSetItem setItemA, @Exclusive @Cached InlinedLoopConditionProfile loopProfile, @Cached InlinedBranchProfile noKeyProfile) { - Object attr = getAttrNode.execute(null, inliningTarget, a, T_KEYS); + Object attr = getKeys.execute(null, inliningTarget, a, T_KEYS); PList keys = listNode.execute(null, callNode.execute(null, attr)); SequenceStorage keysStorage = keys.getSequenceStorage(); @@ -580,4 +593,65 @@ int fallback(Object dict, @SuppressWarnings("unused") Object b, @SuppressWarning throw raiseFallback(dict, PythonBuiltinClassType.PDict); } } + + @CApiBuiltin(ret = Int, args = {PyObject}, call = Ignored) + abstract static class PyTruffleDict_MaybeUntrack extends CApiUnaryBuiltinNode { + + @Specialization + static int doPDict(@SuppressWarnings("unused") PDict self, + @Bind("this") Node inliningTarget, + @Cached HashingStorageNodes.HashingStorageForEach forEachNode, + @Cached DictTraverseCallback traverseCallback) { + HashingStorage dictStorage = self.getDictStorage(); + boolean res = forEachNode.execute(null, inliningTarget, dictStorage, traverseCallback, false); + if (CApiContext.GC_LOGGER.isLoggable(Level.FINE)) { + CApiContext.GC_LOGGER.fine(PythonUtils.formatJString("Maybe untrack dict %s: %s", self, res)); + } + return PInt.intValue(res); + } + } + + @GenerateInline + @GenerateCached(false) + abstract static class DictTraverseCallback extends HashingStorageForEachCallback { + + @Override + public abstract Boolean execute(Frame frame, Node inliningTarget, HashingStorage storage, HashingStorageIterator it, Boolean s); + + @Specialization + static Boolean doGeneric(@SuppressWarnings("unused") VirtualFrame frame, Node inliningTarget, HashingStorage storage, HashingStorageIterator it, Boolean accumulator, + @Cached HashingStorageIteratorKey nextKey, + @Cached HashingStorageIteratorValue nextValue) { + if (!accumulator) { + return false; + } + + Object key = nextKey.execute(inliningTarget, storage, it); + if (isTracked(key, null)) { + return false; + } + + Object value = nextValue.execute(inliningTarget, storage, it); + if (isTracked(value, null)) { + return false; + } + return true; + } + + /* + * #define _PyObject_GC_MAY_BE_TRACKED(obj) \ (PyObject_IS_GC(obj) && \ + * (!PyTuple_CheckExact(obj) || _PyObject_GC_IS_TRACKED(obj))) + */ + static boolean isTracked(Object object, CStructAccess.ReadI64Node readI64Node) { + // TODO(fa): implement properly + return true; + // #define _PyObject_GC_IS_TRACKED(o) (_PyGCHead_UNTAG(_Py_AS_GC(o))->_gc_next != 0) + // long gcNext = readI64Node.read(gcUntagged, CFields.PyGC_Head___gc_prev); + // if (_PyObject_GC_IS_TRACKED(op)) + // if (gcNext != 0) { + // return true; + // } + // return false; + } + } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextErrBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextErrBuiltins.java index ea7bab3baf..b3780db8a3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextErrBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextErrBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -67,12 +67,12 @@ import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.TypeNode; import com.oracle.graal.python.builtins.modules.BuiltinFunctions.IsInstanceNode; import com.oracle.graal.python.builtins.modules.BuiltinFunctions.IsSubClassNode; import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins.ExitNode; import com.oracle.graal.python.builtins.modules.SysModuleBuiltins; import com.oracle.graal.python.builtins.modules.SysModuleBuiltins.ExcInfoNode; +import com.oracle.graal.python.builtins.modules.SysModuleBuiltinsFactory.ExcInfoNodeFactory; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiNullaryBuiltinNode; @@ -91,7 +91,6 @@ import com.oracle.graal.python.builtins.objects.cext.common.NativePointer; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetItem; -import com.oracle.graal.python.builtins.objects.dict.DictBuiltins.SetItemNode; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.exception.ExceptionNodes; import com.oracle.graal.python.builtins.objects.exception.GetEscapedExceptionNode; @@ -102,7 +101,9 @@ import com.oracle.graal.python.builtins.objects.traceback.LazyTraceback; import com.oracle.graal.python.builtins.objects.traceback.PTraceback; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TypeBuiltins.TypeNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode; +import com.oracle.graal.python.lib.PyDictSetItem; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.lib.PyObjectLookupAttr; @@ -123,7 +124,7 @@ import com.oracle.graal.python.runtime.exception.ExceptionUtils; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; @@ -169,6 +170,7 @@ abstract static class _PyErr_ChainExceptions extends CApiTernaryBuiltinNode { @Specialization static Object run(Object typ, Object val, Object tb, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached GetThreadStateNode getThreadStateNode, @Cached PrepareExceptionNode prepareExceptionNode, @Cached ExceptionNodes.SetTracebackNode setTracebackNode, @@ -176,7 +178,7 @@ static Object run(Object typ, Object val, Object tb, @Cached GetEscapedExceptionNode getEscapedExceptionNode, @Cached TransformExceptionToNativeNode transformExceptionToNativeNode) { if (typ != PNone.NO_VALUE) { - PythonContext.PythonThreadState threadState = getThreadStateNode.execute(inliningTarget, PythonContext.get(inliningTarget)); + PythonContext.PythonThreadState threadState = getThreadStateNode.execute(inliningTarget, context); Object exception; exception = prepareExceptionNode.execute(null, typ, val); if (threadState.getCurrentException() != null) { @@ -187,7 +189,7 @@ static Object run(Object typ, Object val, Object tb, Object currentExceptionObject = getEscapedExceptionNode.execute(inliningTarget, currentException); setContextNode.execute(inliningTarget, currentExceptionObject, exception); } else { - PException e = PException.fromExceptionInfo(exception, PythonOptions.isPExceptionWithJavaStacktrace(PythonLanguage.get(inliningTarget))); + PException e = PException.fromExceptionInfo(exception, PythonOptions.isPExceptionWithJavaStacktrace(context.getLanguage(inliningTarget))); transformExceptionToNativeNode.execute(inliningTarget, e, tb instanceof PTraceback ptb ? new LazyTraceback(ptb) : null); } } @@ -258,17 +260,19 @@ Object run(Object threadStatePtr, abstract static class PyErr_SetExcInfo extends CApiTernaryBuiltinNode { @Specialization @SuppressWarnings("unused") - Object doClear(Object typ, PNone val, Object tb) { - PythonContext pythonContext = getContext(); - PythonLanguage lang = getLanguage(); - pythonContext.getThreadState(lang).setCaughtException(PException.NO_EXCEPTION); + Object doClear(Object typ, PNone val, Object tb, + @Bind("this") Node inliningTarget, + @Bind PythonContext context) { + PythonLanguage lang = context.getLanguage(inliningTarget); + context.getThreadState(lang).setCaughtException(PException.NO_EXCEPTION); return PNone.NONE; } @Specialization - Object doFull(@SuppressWarnings("unused") Object typ, PBaseException val, @SuppressWarnings("unused") Object tb) { - PythonContext context = getContext(); - PythonLanguage language = getLanguage(); + Object doFull(@SuppressWarnings("unused") Object typ, PBaseException val, @SuppressWarnings("unused") Object tb, + @Bind("this") Node inliningTarget, + @Bind PythonContext context) { + PythonLanguage language = context.getLanguage(inliningTarget); PException e = PException.fromExceptionInfo(val, PythonOptions.isPExceptionWithJavaStacktrace(language)); context.getThreadState(language).setCaughtException(e); return PNone.NONE; @@ -304,11 +308,10 @@ Object run(Object typ, PBaseException val, Object tb) { abstract static class _PyTruffleErr_CreateAndSetException extends CApiBinaryBuiltinNode { @Specialization(guards = "!isExceptionClass(inliningTarget, type, isTypeNode, isSubClassNode)") static Object create(Object type, @SuppressWarnings("unused") Object value, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached IsTypeNode isTypeNode, @SuppressWarnings("unused") @Shared @Cached IsSubClassNode isSubClassNode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.SystemError, EXCEPTION_NOT_BASEEXCEPTION, new Object[]{type}); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.SystemError, EXCEPTION_NOT_BASEEXCEPTION, new Object[]{type}); } @Specialization(guards = "isExceptionClass(inliningTarget, type, isTypeNode, isSubClassNode)") @@ -332,38 +335,38 @@ abstract static class PyErr_NewException extends CApiTernaryBuiltinNode { @Specialization static Object newEx(TruffleString name, Object base, Object dict, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached HashingStorageGetItem getItem, @Cached TruffleString.IndexOfCodePointNode indexOfCodepointNode, @Cached TruffleString.CodePointLengthNode codePointLengthNode, @Cached TruffleString.SubstringNode substringNode, - @Cached SetItemNode setItemNode, + @Cached PyDictSetItem setItemNode, @Cached TypeNode typeNode, @Cached InlinedBranchProfile notDotProfile, @Cached InlinedBranchProfile notModuleProfile, @Cached InlinedConditionProfile baseProfile, - @Cached PythonObjectFactory.Lazy factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (base == PNone.NO_VALUE) { base = PythonErrorType.Exception; } if (dict == PNone.NO_VALUE) { - dict = factory.get(inliningTarget).createDict(); + dict = PFactory.createDict(language); } int length = codePointLengthNode.execute(name, TS_ENCODING); int dotIdx = indexOfCodepointNode.execute(name, '.', 0, length, TS_ENCODING); if (dotIdx < 0) { notDotProfile.enter(inliningTarget); - throw raiseNode.get(inliningTarget).raise(SystemError, MUST_BE_MODULE_CLASS, "PyErr_NewException", "name"); + throw raiseNode.raise(inliningTarget, SystemError, MUST_BE_MODULE_CLASS, "PyErr_NewException", "name"); } if (getItem.execute(null, inliningTarget, ((PDict) dict).getDictStorage(), base) == null) { notModuleProfile.enter(inliningTarget); - setItemNode.execute(null, dict, T___MODULE__, substringNode.execute(name, 0, dotIdx, TS_ENCODING, false)); + setItemNode.execute(null, inliningTarget, (PDict) dict, T___MODULE__, substringNode.execute(name, 0, dotIdx, TS_ENCODING, false)); } PTuple bases; if (baseProfile.profile(inliningTarget, base instanceof PTuple)) { bases = (PTuple) base; } else { - bases = factory.get(inliningTarget).createTuple(new Object[]{base}); + bases = PFactory.createTuple(language, new Object[]{base}); } return typeNode.execute(null, PythonBuiltinClassType.PythonClass, substringNode.execute(name, dotIdx + 1, length - dotIdx - 1, TS_ENCODING, false), bases, dict, PKeyword.EMPTY_KEYWORDS); @@ -377,12 +380,12 @@ abstract static class PyErr_NewExceptionWithDoc extends CApiQuaternaryBuiltinNod static Object raise(TruffleString name, Object doc, Object base, Object dict, @Cached PyErr_NewException newExNode, @Cached WriteAttributeToObjectNode writeAtrrNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { if (base == PNone.NO_VALUE) { base = PythonErrorType.Exception; } if (dict == PNone.NO_VALUE) { - dict = factory.createDict(); + dict = PFactory.createDict(language); } Object ex = newExNode.execute(name, base, dict); if (doc != PNone.NO_VALUE) { @@ -402,7 +405,7 @@ Object info( @Cached ExceptionNodes.GetTracebackNode getTracebackNode, @Cached InlinedBranchProfile noExceptionProfile, @Cached GetEscapedExceptionNode getEscapedExceptionNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { AbstractTruffleException currentException = getCaughtExceptionNode.executeFromNative(); if (currentException == null) { noExceptionProfile.enter(inliningTarget); @@ -411,7 +414,7 @@ Object info( assert currentException != PException.NO_EXCEPTION; Object exception = getEscapedExceptionNode.execute(inliningTarget, currentException); Object traceback = noneToNativeNull(inliningTarget, getTracebackNode.execute(inliningTarget, exception)); - return factory.createTuple(new Object[]{getClassNode.execute(inliningTarget, exception), exception, traceback}); + return PFactory.createTuple(language, new Object[]{getClassNode.execute(inliningTarget, exception), exception, traceback}); } } @@ -444,11 +447,15 @@ static Object write(Object msg, Object obj, @CApiBuiltin(ret = Void, args = {Int}, call = Direct) abstract static class PyErr_PrintEx extends CApiUnaryBuiltinNode { + static ExcInfoNode createExcInfoNode() { + return ExcInfoNodeFactory.create(null); + } + @TruffleBoundary @Specialization static Object raise(int set_sys_last_vars, @Cached IsInstanceNode isInstanceNode, - @Cached ExcInfoNode excInfoNode, + @Cached(neverDefault = true, value = "createExcInfoNode()") ExcInfoNode excInfoNode, @Cached PyErr_Restore restoreNode, @Cached PyFile_WriteObject writeFileNode, @Cached ExitNode exitNode, @@ -456,7 +463,7 @@ static Object raise(int set_sys_last_vars, PythonContext context = PythonContext.get(null); NativePointer nativeNull = context.getNativeNull(); - PythonThreadState threadState = context.getThreadState(PythonLanguage.get(null)); + PythonThreadState threadState = context.getThreadState(context.getLanguage()); Object err = PyErrOccurredNode.executeUncached(threadState); PythonModule sys = context.getSysModule(); if (err != nativeNull && IsBuiltinObjectProfile.profileObjectUncached(err, PythonBuiltinClassType.SystemExit)) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextFileBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextFileBuiltins.java index 4bf832f020..cb78a79e85 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextFileBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextFileBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,11 +45,11 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.StrNode; import com.oracle.graal.python.builtins.modules.BuiltinFunctions.ReprNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiTernaryBuiltinNode; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.str.StringBuiltins; import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.StringLiterals; @@ -67,11 +67,11 @@ abstract static class PyFile_WriteObject extends CApiTernaryBuiltinNode { @Specialization static int writeStr(Object obj, Object f, int flags, @Bind("this") Node inliningTarget, - @Cached StrNode strNode, + @Cached StringBuiltins.StrNewNode strNode, @Cached ReprNode reprNode, @Cached PyObjectGetAttr getAttr, @Cached CallNode callNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { checkNonNullArg(inliningTarget, obj, raiseNode); checkNonNullArg(inliningTarget, f, raiseNode); Object value; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextFloatBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextFloatBuiltins.java index bdbaa62a28..855c106f90 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextFloatBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextFloatBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -48,10 +48,10 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer; import static com.oracle.graal.python.nodes.ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC_WAS_S_P; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.StrNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor; +import com.oracle.graal.python.builtins.objects.str.StringBuiltins; import com.oracle.graal.python.lib.PyFloatAsDoubleNode; import com.oracle.graal.python.lib.PyFloatFromString; import com.oracle.graal.python.nodes.PRaiseNode; @@ -73,10 +73,10 @@ static double fromDouble(double d) { @Specialization(guards = "!isDouble(obj)") static Object fromDouble(Object obj, - @Cached StrNode strNode, - @Cached PRaiseNode raiseNode) { + @Bind("this") Node inliningTarget, + @Cached StringBuiltins.StrNewNode strNode) { // cpython PyFloat_FromDouble takes only 'double' - throw raiseNode.raise(SystemError, BAD_ARG_TO_INTERNAL_FUNC_WAS_S_P, strNode.executeWith(null, obj), obj); + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, BAD_ARG_TO_INTERNAL_FUNC_WAS_S_P, strNode.executeWith(null, obj), obj); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextFuncBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextFuncBuiltins.java index 0aeeef07f6..9835b61b3a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextFuncBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextFuncBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,7 +47,7 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DOC__; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; @@ -56,10 +56,10 @@ import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; import com.oracle.graal.python.builtins.objects.method.PDecoratedMethod; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.strings.TruffleString; @@ -69,8 +69,8 @@ public final class PythonCextFuncBuiltins { abstract static class PyStaticMethod_New extends CApiUnaryBuiltinNode { @Specialization static Object staticmethod(Object func, - @Cached PythonObjectFactory factory) { - PDecoratedMethod res = factory.createStaticmethod(PythonBuiltinClassType.PStaticmethod); + @Bind PythonLanguage language) { + PDecoratedMethod res = PFactory.createStaticmethod(language); res.setCallable(func); return res; } @@ -80,8 +80,8 @@ static Object staticmethod(Object func, abstract static class PyClassMethod_New extends CApiUnaryBuiltinNode { @Specialization static Object staticmethod(Object callable, - @Cached PythonObjectFactory factory) { - return factory.createClassmethodFromCallableObj(callable); + @Bind PythonLanguage language) { + return PFactory.createClassmethodFromCallableObj(language, callable); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextGenericAliasBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextGenericAliasBuiltins.java index 0b54f33287..bb8895a010 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextGenericAliasBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextGenericAliasBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,10 +44,11 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.dsl.Cached; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Specialization; public final class PythonCextGenericAliasBuiltins { @@ -56,8 +57,8 @@ public final class PythonCextGenericAliasBuiltins { abstract static class Py_GenericAlias extends CApiBinaryBuiltinNode { @Specialization static Object genericAlias(Object origin, Object args, - @Cached PythonObjectFactory factory) { - return factory.createGenericAlias(origin, args); + @Bind PythonLanguage language) { + return PFactory.createGenericAlias(language, origin, args); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextImportBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextImportBuiltins.java index 99d73944c0..3730f7e3f8 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextImportBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextImportBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -139,7 +139,7 @@ Object getModule(Object name, try { Object spec = getAttr.execute(null, inliningTarget, m, T___SPEC__); Object initializingObj = getAttr.execute(null, inliningTarget, spec, T___INITIALIZING__); - if (isTrueNode.execute(null, inliningTarget, initializingObj)) { + if (isTrueNode.execute(null, initializingObj)) { initializing = true; } } catch (PException e) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextIterBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextIterBuiltins.java index e9eeca74f2..b08b938c62 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextIterBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextIterBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,13 +45,14 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.BuiltinFunctions.IterNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; import com.oracle.graal.python.builtins.objects.iterator.PSequenceIterator; import com.oracle.graal.python.lib.PyIterCheckNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; @@ -73,8 +74,8 @@ static int check(Object obj, abstract static class PySeqIter_New extends CApiUnaryBuiltinNode { @Specialization static PSequenceIterator call(Object seq, - @Cached PythonObjectFactory factory) { - return factory.createSequenceIterator(seq); + @Bind PythonLanguage language) { + return PFactory.createSequenceIterator(language, seq); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextListBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextListBuiltins.java index 09c27f29f1..57603cb639 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextListBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextListBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,7 +43,10 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.IndexError; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError; import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Direct; +import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Ignored; +import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.INT64_T; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int; +import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Pointer; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyListObject; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectBorrowed; @@ -53,6 +56,7 @@ import java.util.Arrays; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; @@ -61,6 +65,10 @@ import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.PromoteBorrowedValue; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; +import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.XDecRefPointerNode; +import com.oracle.graal.python.builtins.objects.cext.capi.PySequenceArrayWrapper; +import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetItemScalarNode; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ListGeneralizationNode; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.SetItemScalarNode; @@ -74,38 +82,37 @@ import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.builtins.ListNodes.AppendNode; import com.oracle.graal.python.nodes.builtins.TupleNodes.ConstructTupleNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.graal.python.runtime.sequence.storage.NativeObjectSequenceStorage; +import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; -import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; public final class PythonCextListBuiltins { - ///////////// list ///////////// @CApiBuiltin(ret = PyObjectTransfer, args = {Py_ssize_t}, call = Direct) abstract static class PyList_New extends CApiUnaryBuiltinNode { @Specialization(guards = "size < 0") static Object newListError(long size, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(SystemError, BAD_ARG_TO_INTERNAL_FUNC_S, size); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, BAD_ARG_TO_INTERNAL_FUNC_S, size); } @SuppressWarnings("unused") @Specialization(guards = "size == 0") static Object newEmptyList(long size, - @Shared @Cached PythonObjectFactory factory) { - return factory.createList(PythonUtils.EMPTY_OBJECT_ARRAY); + @Bind PythonLanguage language) { + return PFactory.createList(language); } @Specialization(guards = "size > 0") static Object newList(long size, - @Shared @Cached PythonObjectFactory factory) { - return factory.createList(array(size)); + @Bind PythonLanguage language) { + return PFactory.createList(language, array(size)); } private static Object[] array(long size) { @@ -125,11 +132,11 @@ static Object doPList(PList list, long key, @Cached ListGeneralizationNode generalizationNode, @Cached SetItemScalarNode setItemNode, @Cached GetItemScalarNode getItemNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { SequenceStorage sequenceStorage = list.getSequenceStorage(); // we must do a bounds-check but we must not normalize the index if (key < 0 || key >= sequenceStorage.length()) { - throw raiseNode.get(inliningTarget).raise(IndexError, ErrorMessages.LIST_INDEX_OUT_OF_RANGE); + throw raiseNode.raise(inliningTarget, IndexError, ErrorMessages.LIST_INDEX_OUT_OF_RANGE); } Object result = getItemNode.execute(inliningTarget, sequenceStorage, (int) key); Object promotedValue = promoteNode.execute(inliningTarget, result); @@ -204,9 +211,9 @@ abstract static class PyList_SetSlice extends CApiQuaternaryBuiltinNode { @Specialization static int getSlice(PList list, Object iLow, Object iHigh, Object s, @Bind("this") Node inliningTarget, - @Cached com.oracle.graal.python.builtins.objects.list.ListBuiltins.SetItemNode setItemNode, + @Cached ListBuiltins.SetSubscriptNode setItemNode, @Cached PySliceNew sliceNode) { - setItemNode.execute(null, list, sliceNode.execute(inliningTarget, iLow, iHigh, PNone.NONE), s); + setItemNode.executeVoid(null, list, sliceNode.execute(inliningTarget, iLow, iHigh, PNone.NONE), s); return 0; } @@ -287,4 +294,62 @@ static int reverse(PList self, return 0; } } + + @CApiBuiltin(ret = INT64_T, args = {PyObject, Pointer}, call = Ignored) + abstract static class PyTruffleList_ClearManagedOrGetItems extends CApiBinaryBuiltinNode { + + @Specialization + static long doGeneric(PList self, Object outItems, + @Bind("this") Node inliningTarget, + @Cached CStructAccess.WritePointerNode writePointerNode, + @Cached XDecRefPointerNode xDecRefPointerNode) { + SequenceStorage sequenceStorage = self.getSequenceStorage(); + if (sequenceStorage instanceof NativeObjectSequenceStorage nativeStorage) { + writePointerNode.write(outItems, nativeStorage.getPtr()); + int length = nativeStorage.length(); + nativeStorage.setNewLength(0); + return length; + } else { + assert sequenceStorage instanceof ObjectSequenceStorage; + ObjectSequenceStorage objectStorage = (ObjectSequenceStorage) sequenceStorage; + + for (int i = objectStorage.length(); --i >= 0;) { + Object item = objectStorage.getObjectItemNormalized(i); + if (item instanceof PythonAbstractNativeObject nativeObject) { + xDecRefPointerNode.execute(inliningTarget, nativeObject.getPtr()); + // replace the item to avoid re-visiting + objectStorage.setObjectItemNormalized(i, PNone.NONE); + } + } + } + return 0; + } + } + + @CApiBuiltin(ret = INT64_T, args = {PyObject, Pointer}, call = Ignored) + abstract static class PyTruffleList_TryGetItems extends CApiBinaryBuiltinNode { + + @Specialization + static long doGeneric(PList self, Object outItems, + @Bind("this") Node inliningTarget, + @Cached CStructAccess.WritePointerNode writePointerNode, + @Cached PySequenceArrayWrapper.ToNativeStorageNode toNativeStorageNode) { + SequenceStorage sequenceStorage = self.getSequenceStorage(); + if (sequenceStorage instanceof ObjectSequenceStorage objectStorage) { + sequenceStorage = toNativeStorageNode.execute(inliningTarget, objectStorage, false); + self.setSequenceStorage(sequenceStorage); + } + if (sequenceStorage instanceof NativeObjectSequenceStorage nativeStorage) { + writePointerNode.write(outItems, nativeStorage.getPtr()); + return nativeStorage.length(); + } + return 0; + } + + @SuppressWarnings("unused") + @Specialization + static long doGeneric(PNone none, Object ignore) { + return 0; + } + } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextLongBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextLongBuiltins.java index af83eba523..9552018377 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextLongBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextLongBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,12 +44,12 @@ import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Direct; import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Ignored; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.CONST_UNSIGNED_CHAR_PTR; +import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.CharPtrAsTruffleString; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.LONG_LONG; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Pointer; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyLongObject; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject; -import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectAsTruffleString; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.SIZE_T; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.UNSIGNED_CHAR_PTR; @@ -59,9 +59,8 @@ import java.math.BigInteger; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.IntNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApi5BuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; @@ -77,17 +76,16 @@ import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodesFactory.TransformExceptionToNativeNodeGen; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; import com.oracle.graal.python.builtins.objects.ints.IntBuiltins; -import com.oracle.graal.python.builtins.objects.ints.IntBuiltins.NegNode; import com.oracle.graal.python.builtins.objects.ints.IntNodes; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.lib.PyLongFromDoubleNode; +import com.oracle.graal.python.lib.PyLongFromUnicodeObject; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.truffle.PythonTypes; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.OverflowException; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; @@ -98,7 +96,6 @@ import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.CachedLibrary; @@ -106,7 +103,6 @@ import com.oracle.truffle.api.nodes.UnexpectedResultException; import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.profiles.InlinedConditionProfile; -import com.oracle.truffle.api.strings.TruffleString; public final class PythonCextLongBuiltins { @@ -212,21 +208,14 @@ static Object fromDouble(double d, } } - @CApiBuiltin(ret = PyObjectTransfer, args = {PyObjectAsTruffleString, Int, Int}, call = Ignored) - @TypeSystemReference(PythonTypes.class) - abstract static class PyTruffleLong_FromString extends CApiTernaryBuiltinNode { + @CApiBuiltin(ret = PyObjectTransfer, args = {CharPtrAsTruffleString, Int}, call = Ignored) + abstract static class PyTruffleLong_FromString extends CApiBinaryBuiltinNode { - @Specialization(guards = "negative == 0") - Object fromString(Object s, int base, @SuppressWarnings("unused") int negative, - @Shared @Cached BuiltinConstructors.IntNode intNode) { - return intNode.executeWith(null, s, base); - } - - @Specialization(guards = "negative != 0") - Object fromString(Object s, int base, @SuppressWarnings("unused") int negative, - @Shared @Cached BuiltinConstructors.IntNode intNode, - @Cached NegNode negNode) { - return negNode.execute(null, intNode.executeWith(null, s, base)); + @Specialization + Object fromString(Object s, int base, + @Bind("this") Node inliningTarget, + @Cached PyLongFromUnicodeObject fromUnicodeObject) { + return fromUnicodeObject.execute(inliningTarget, s, base); } } @@ -240,7 +229,7 @@ static Object doGeneric(Object object, int mode, long targetTypeSize, @Cached GetClassNode getClassNode, @Cached ConvertPIntToPrimitiveNode convertPIntToPrimitiveNode, @Cached CastToNativeLongNode castToNativeLongNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { /* * The 'mode' parameter is usually a constant since this function is primarily used @@ -248,7 +237,7 @@ static Object doGeneric(Object object, int mode, long targetTypeSize, * profile the value and even if it is not constant, it is profiled implicitly. */ if (requiredPInt(mode) && !isSubtypeNode.execute(getClassNode.execute(inliningTarget, object), PythonBuiltinClassType.PInt)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.INTEGER_REQUIRED); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.INTEGER_REQUIRED); } // the 'ConvertPIntToPrimitiveNode' uses 'AsNativePrimitive' which does coercion Object coerced = convertPIntToPrimitiveNode.execute(inliningTarget, object, signed(mode), PInt.intValueExact(targetTypeSize), exact(mode)); @@ -287,16 +276,16 @@ static long doSignedLong(long n) { @Specialization(guards = "!isInteger(pointer)", limit = "2") static Object doPointer(Object pointer, @CachedLibrary("pointer") InteropLibrary lib, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { // We capture the native pointer at the time when we create the wrapper if it exists. if (lib.isPointer(pointer)) { try { - return factory.createNativeVoidPtr(pointer, lib.asPointer(pointer)); + return PFactory.createNativeVoidPtr(language, pointer, lib.asPointer(pointer)); } catch (UnsupportedMessageException e) { throw CompilerDirectives.shouldNotReachHere(e); } } - return factory.createNativeVoidPtr(pointer); + return PFactory.createNativeVoidPtr(language, pointer); } } @@ -320,23 +309,23 @@ static Object doUnsignedLongPositive(long n) { @Specialization(guards = "n < 0") static Object doUnsignedLongNegative(long n, - @Shared @Cached PythonObjectFactory factory) { - return factory.createInt(convertToBigInteger(n)); + @Bind PythonLanguage language) { + return PFactory.createInt(language, convertToBigInteger(n)); } @Specialization(guards = "!isInteger(pointer)", limit = "2") static Object doPointer(Object pointer, @CachedLibrary("pointer") InteropLibrary lib, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { // We capture the native pointer at the time when we create the wrapper if it exists. if (lib.isPointer(pointer)) { try { - return factory.createNativeVoidPtr(pointer, lib.asPointer(pointer)); + return PFactory.createNativeVoidPtr(language, pointer, lib.asPointer(pointer)); } catch (UnsupportedMessageException e) { throw CompilerDirectives.shouldNotReachHere(e); } } - return factory.createNativeVoidPtr(pointer); + return PFactory.createNativeVoidPtr(language, pointer); } @TruffleBoundary @@ -364,13 +353,13 @@ static long doPointer(long n) { long doPointer(PInt n, @Bind("this") Node inliningTarget, @Cached InlinedBranchProfile overflowProfile, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { try { return n.longValueExact(); } catch (OverflowException e) { overflowProfile.enter(inliningTarget); try { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "C long"); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "C long"); } catch (PException pe) { ensureTransformExcNode().executeCached(pe); return 0; @@ -386,7 +375,7 @@ static Object doPointer(PythonNativeVoidPtr n) { @Fallback long doGeneric(Object n, @Bind("this") Node inliningTarget, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (asPrimitiveNode == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); asPrimitiveNode = insert(ConvertPIntToPrimitiveNodeGen.create()); @@ -395,7 +384,7 @@ long doGeneric(Object n, try { return asPrimitiveNode.executeLongCached(n, 0, Long.BYTES); } catch (UnexpectedResultException e) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "C long"); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "C long"); } } catch (PException e) { ensureTransformExcNode().executeCached(e); @@ -414,10 +403,10 @@ private TransformExceptionToNativeNode ensureTransformExcNode() { @CApiBuiltin(ret = Int, args = {PyLongObject, UNSIGNED_CHAR_PTR, SIZE_T, Int, Int}, call = Direct) abstract static class _PyLong_AsByteArray extends CApi5BuiltinNode { - private static void checkSign(Node inliningTarget, boolean negative, int isSigned, PRaiseNode.Lazy raiseNode) { + private static void checkSign(Node inliningTarget, boolean negative, int isSigned, PRaiseNode raiseNode) { if (negative) { if (isSigned == 0) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.MESSAGE_CONVERT_NEGATIVE); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.MESSAGE_CONVERT_NEGATIVE); } } } @@ -427,7 +416,7 @@ static Object get(int value, Object bytes, long n, int littleEndian, int isSigne @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile profile, @Shared @Cached CStructAccess.WriteByteNode write, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { checkSign(inliningTarget, value < 0, isSigned, raiseNode); byte[] array = IntBuiltins.ToBytesNode.fromLong(value, PythonUtils.toIntError(n), littleEndian == 0, isSigned != 0, inliningTarget, profile, raiseNode); write.writeByteArray(bytes, array); @@ -439,7 +428,7 @@ static Object get(long value, Object bytes, long n, int littleEndian, int isSign @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile profile, @Shared @Cached CStructAccess.WriteByteNode write, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { checkSign(inliningTarget, value < 0, isSigned, raiseNode); byte[] array = IntBuiltins.ToBytesNode.fromLong(value, PythonUtils.toIntError(n), littleEndian == 0, isSigned != 0, inliningTarget, profile, raiseNode); write.writeByteArray(bytes, array); @@ -451,7 +440,7 @@ static Object get(PInt value, Object bytes, long n, int littleEndian, int isSign @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile profile, @Shared @Cached CStructAccess.WriteByteNode write, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { checkSign(inliningTarget, value.isNegative(), isSigned, raiseNode); byte[] array = IntBuiltins.ToBytesNode.fromBigInteger(value, PythonUtils.toIntError(n), littleEndian == 0, isSigned != 0, inliningTarget, profile, raiseNode); write.writeByteArray(bytes, array); @@ -459,12 +448,13 @@ static Object get(PInt value, Object bytes, long n, int littleEndian, int isSign } } - @CApiBuiltin(ret = PyObjectTransfer, args = {PyObjectAsTruffleString, Int}, call = Direct) + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, Int}, call = Direct) abstract static class PyLong_FromUnicodeObject extends CApiBinaryBuiltinNode { @Specialization - static Object convert(TruffleString s, int base, - @Cached IntNode intNode) { - return intNode.executeWith(null, s, base); + static Object convert(Object s, int base, + @Bind("this") Node inliningTarget, + @Cached PyLongFromUnicodeObject pyLongFromUnicodeObject) { + return pyLongFromUnicodeObject.execute(inliningTarget, s, base); } } @@ -475,12 +465,21 @@ static Object convert(Object charPtr, long size, int littleEndian, int signed, @Bind("this") Node inliningTarget, @Cached CStructAccess.ReadByteNode readByteNode, @Cached IntNodes.PyLongFromByteArray fromByteArray, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (size != (int) size) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.BYTE_ARRAY_TOO_LONG_TO_CONVERT_TO_INT); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.BYTE_ARRAY_TOO_LONG_TO_CONVERT_TO_INT); } byte[] bytes = readByteNode.readByteArray(charPtr, (int) size); return fromByteArray.execute(inliningTarget, bytes, littleEndian != 0, signed != 0); } } + + @CApiBuiltin(ret = SIZE_T, args = {PyObject}, call = Direct) + abstract static class _PyLong_NumBits extends CApiUnaryBuiltinNode { + @Specialization + static long numBits(Object obj, + @Cached IntBuiltins.BitLengthNode bitLengthNode) { + return bitLengthNode.execute(obj); + } + } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextMemoryViewBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextMemoryViewBuiltins.java index a2c42d09ae..4a3b96e430 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextMemoryViewBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextMemoryViewBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -85,7 +85,7 @@ static Object get(Object obj, int buffertype, byte orderByte, @Cached ContiguousNode contiguousNode, @Cached TruffleString.EqualNode eqNode, @Cached TruffleString.FromCodePointNode fromCodePointNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { assert buffertype == PY_BUF_READ || buffertype == PY_BUF_WRITE; char order = (char) orderByte; assert order == 'C' || order == 'F' || order == 'A'; @@ -94,14 +94,14 @@ static Object get(Object obj, int buffertype, byte orderByte, boolean release = true; try { if (buffertype == PY_BUF_WRITE && mv.isReadOnly()) { - throw raiseNode.get(inliningTarget).raise(BufferError, UNDERLYING_BUFFER_IS_NOT_WRITABLE); + throw raiseNode.raise(inliningTarget, BufferError, UNDERLYING_BUFFER_IS_NOT_WRITABLE); } if ((boolean) contiguousNode.execute(null, mv)) { release = false; return mv; } if (buffertype == PY_BUF_WRITE) { - throw raiseNode.get(inliningTarget).raise(BufferError, WRITABLE_CONTIGUES_FOR_NON_CONTIGUOUS); + throw raiseNode.raise(inliningTarget, BufferError, WRITABLE_CONTIGUES_FOR_NON_CONTIGUOUS); } PMemoryView mvBytes = memoryViewFromObject.execute(null, toBytesNode.execute(null, mv, fromCodePointNode.execute(order, TS_ENCODING, true))); if (eqNode.execute(T_UINT_8_TYPE_CODE, mv.getFormatString(), TS_ENCODING)) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextMethodBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextMethodBuiltins.java index 5529b70771..3860972a83 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextMethodBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextMethodBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -52,6 +52,7 @@ import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___MODULE__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApi9BuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; import com.oracle.graal.python.builtins.objects.PNone; @@ -60,7 +61,7 @@ import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; import com.oracle.graal.python.nodes.HiddenAttr; import com.oracle.graal.python.nodes.attributes.WriteAttributeToPythonObjectNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; @@ -90,7 +91,7 @@ final Object execute(Node inliningTarget, Object methodDefPtr, TruffleString nam @Specialization static Object doNativeCallable(Node inliningTarget, Object methodDefPtr, TruffleString name, Object methObj, Object flags, int wrapper, Object self, Object module, Object cls, Object doc, - @Cached(inline = false) PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached CreateFunctionNode createFunctionNode, @Cached HiddenAttr.WriteNode writeHiddenAttrNode, @Cached(inline = false) WriteAttributeToPythonObjectNode writeAttrNode) { @@ -102,9 +103,9 @@ static Object doNativeCallable(Node inliningTarget, Object methodDefPtr, Truffle writeAttrNode.execute(func, T___DOC__, doc); PBuiltinMethod method; if (cls != PNone.NO_VALUE) { - method = factory.createBuiltinMethod(self, func, cls); + method = PFactory.createBuiltinMethod(language, self, func, cls); } else { - method = factory.createBuiltinMethod(self, func); + method = PFactory.createBuiltinMethod(language, self, func); } writeAttrNode.execute(method, T___MODULE__, module); return method; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextModuleBuiltins.java index c92621bb46..32091dfcb4 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -53,9 +53,11 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer; import static com.oracle.graal.python.nodes.ErrorMessages.S_NEEDS_S_AS_FIRST_ARG; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DOC__; +import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___FILE__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___PACKAGE__; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; +import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApi7BuiltinNode; @@ -64,13 +66,23 @@ import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiTernaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextMethodBuiltins.CFunctionNewExMethodNode; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.CheckPrimitiveFunctionResultNode; +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionInvokeNode; +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode; +import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.EnsureExecutableNode; +import com.oracle.graal.python.builtins.objects.cext.structs.CFields; +import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins; import com.oracle.graal.python.builtins.objects.str.StringBuiltins.PrefixSuffixNode; import com.oracle.graal.python.lib.PyUnicodeCheckNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.StringLiterals; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromPythonObjectNode; import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode; @@ -78,12 +90,17 @@ import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode; +import com.oracle.graal.python.runtime.PythonContext.PythonThreadState; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; +import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @@ -106,7 +123,7 @@ abstract static class PyModule_NewObject extends CApiUnaryBuiltinNode { @Specialization static Object run(TruffleString name, @Cached CallNode callNode) { - return callNode.executeWithoutFrame(PythonBuiltinClassType.PythonModule, new Object[]{name}); + return callNode.executeWithoutFrame(PythonBuiltinClassType.PythonModule, name); } } @@ -163,7 +180,7 @@ static Object getName(PythonModule module, Object nameAttr = read.execute(module, T___NAME__); if (!pyUnicodeCheckNode.execute(inliningTarget, nameAttr)) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, SystemError, ErrorMessages.NAMELESS_MODULE); + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, ErrorMessages.NAMELESS_MODULE); } Object promotedName = promoteBorrowedValue.execute(inliningTarget, nameAttr); if (promotedName == null) { @@ -176,7 +193,7 @@ static Object getName(PythonModule module, } static boolean isModuleSubtype(Node inliningTarget, Object obj, GetClassNode getClassNode, IsSubtypeNode isSubtypeNode) { - return isSubtypeNode.execute(null, getClassNode.execute(inliningTarget, obj), PythonBuiltinClassType.PythonModule); + return isSubtypeNode.execute(getClassNode.execute(inliningTarget, obj), PythonBuiltinClassType.PythonModule); } @CApiBuiltin(ret = Int, args = {PyObject, ConstCharPtrAsTruffleString, PyObject}, call = Direct) @@ -195,11 +212,10 @@ static Object addObject(Object m, TruffleString k, Object o, @SuppressWarnings("unused") @Specialization(guards = "!isModuleSubtype(inliningTarget, m, getClassNode, isSubtypeNode)") static Object pop(Object m, Object key, Object defaultValue, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, S_NEEDS_S_AS_FIRST_ARG, "PyModule_AddObjectRef", "module"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, S_NEEDS_S_AS_FIRST_ARG, "PyModule_AddObjectRef", "module"); } } @@ -218,11 +234,10 @@ static Object addObject(Object m, TruffleString k, long o, @Specialization(guards = "!isModuleSubtype(inliningTarget, m, getClassNode, isSubtypeNode)") static Object pop(@SuppressWarnings("unused") Object m, @SuppressWarnings("unused") Object key, @SuppressWarnings("unused") Object defaultValue, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, S_NEEDS_S_AS_FIRST_ARG, "PyModule_AddIntConstant", "module"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, S_NEEDS_S_AS_FIRST_ARG, "PyModule_AddIntConstant", "module"); } } @@ -242,4 +257,69 @@ static Object moduleFunction(Object methodDefPtr, PythonModule mod, TruffleStrin return 0; } } + + @CApiBuiltin(ret = Int, args = {PyObject, Pointer, Pointer}, call = Ignored) + abstract static class PyTruffleModule_Traverse extends CApiTernaryBuiltinNode { + private static final String J__M_TRAVERSE = "m_traverse"; + private static final TruffleString T__M_TRAVERSE = tsLiteral(J__M_TRAVERSE); + private static final CApiTiming TIMING = CApiTiming.create(true, J__M_TRAVERSE); + + @Specialization + static int doGeneric(PythonModule self, Object visitFun, Object arg, + @Bind("this") Node inliningTarget, + @Cached CStructAccess.ReadPointerNode readPointerNode, + @Cached CStructAccess.ReadI64Node readI64Node, + @CachedLibrary(limit = "1") InteropLibrary lib, + @Cached EnsureExecutableNode ensureExecutableNode, + @Cached GetThreadStateNode getThreadStateNode, + @Cached ExternalFunctionInvokeNode externalFunctionInvokeNode, + @Cached CheckPrimitiveFunctionResultNode checkPrimitiveFunctionResultNode, + @Cached PythonToNativeNode toNativeNode) { + + /* + * As in 'moduleobject.c: module_traverse': 'if (m->md_def && m->md_def->m_traverse && + * (m->md_def->m_size <= 0 || m->md_state != NULL))' + */ + Object mdDef = self.getNativeModuleDef(); + if (mdDef != null) { + Object mTraverse = readPointerNode.read(mdDef, CFields.PyModuleDef__m_traverse); + if (!lib.isNull(mTraverse)) { + long mSize = readI64Node.read(mdDef, CFields.PyModuleDef__m_size); + Object mdState = self.getNativeModuleState(); + if (mSize <= 0 || (mdState != null && !lib.isNull(mdState))) { + PythonThreadState threadState = getThreadStateNode.execute(inliningTarget); + Object traverseExecutable = ensureExecutableNode.execute(inliningTarget, mTraverse, PExternalFunctionWrapper.TRAVERSEPROC); + Object res = externalFunctionInvokeNode.call(null, inliningTarget, threadState, TIMING, T__M_TRAVERSE, traverseExecutable, toNativeNode.execute(self), visitFun, arg); + int ires = (int) checkPrimitiveFunctionResultNode.executeLong(threadState, StringLiterals.T_VISIT, res); + if (ires != 0) { + return ires; + } + } + } + } + return 0; + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject}, call = Direct) + abstract static class PyModule_GetFilenameObject extends CApiUnaryBuiltinNode { + @Specialization + static Object getFilename(PythonModule module, + @Bind Node inliningTarget, + @Cached ReadAttributeFromObjectNode read, + @Cached PyUnicodeCheckNode check, + @Cached PRaiseNode raiseNode) { + Object file = read.execute(module, T___FILE__); + if (file != PNone.NO_VALUE && check.execute(inliningTarget, file)) { + return file; + } + throw raiseNode.raise(inliningTarget, SystemError, ErrorMessages.MODULE_FILENAME_MISSING); + } + + @Fallback + static Object error(@SuppressWarnings("unused") Object module, + @Bind Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC); + } + } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextNamespaceBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextNamespaceBuiltins.java index 85cb7bd4f3..3973656710 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextNamespaceBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextNamespaceBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,6 +45,7 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer; import static com.oracle.graal.python.nodes.truffle.TruffleStringMigrationHelpers.assertNoJavaString; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; import com.oracle.graal.python.builtins.objects.common.HashingStorage; @@ -57,7 +58,7 @@ import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.namespace.PSimpleNamespace; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; @@ -77,16 +78,15 @@ static Object impDict(PDict dict, @Shared("itNext") @Cached HashingStorageIteratorNext itNext, @Shared("itKey") @Cached HashingStorageIteratorKey itKey, @Shared("itVal") @Cached HashingStorageIteratorValue itValue, - @Shared("dylib") @CachedLibrary(limit = "1") DynamicObjectLibrary dyLib, - @Shared @Cached PythonObjectFactory factory) { + @Shared("dylib") @CachedLibrary(limit = "1") DynamicObjectLibrary dyLib) { HashingStorage storage = dict.getDictStorage(); - return impl(inliningTarget, storage, getIterator, itNext, itKey, itValue, dyLib, factory); + return impl(inliningTarget, storage, getIterator, itNext, itKey, itValue, dyLib); } private static Object impl(Node inliningTarget, HashingStorage storage, HashingStorageGetIterator getIterator, HashingStorageIteratorNext itNext, HashingStorageIteratorKey itKey, HashingStorageIteratorValue itValue, - DynamicObjectLibrary dyLib, PythonObjectFactory factory) { - PSimpleNamespace ns = factory.createSimpleNamespace(); + DynamicObjectLibrary dyLib) { + PSimpleNamespace ns = PFactory.createSimpleNamespace(PythonLanguage.get(inliningTarget)); HashingStorageNodes.HashingStorageIterator it = getIterator.execute(inliningTarget, storage); while (itNext.execute(inliningTarget, storage, it)) { Object key = itKey.execute(inliningTarget, storage, it); @@ -104,10 +104,9 @@ static Object impGeneric(Object dict, @Shared("itNext") @Cached HashingStorageIteratorNext itNext, @Shared("itKey") @Cached HashingStorageIteratorKey itKey, @Shared("itVal") @Cached HashingStorageIteratorValue itValue, - @Shared("dylib") @CachedLibrary(limit = "1") DynamicObjectLibrary dyLib, - @Shared @Cached PythonObjectFactory factory) { + @Shared("dylib") @CachedLibrary(limit = "1") DynamicObjectLibrary dyLib) { HashingStorage hs = initNode.execute(null, dict, PKeyword.EMPTY_KEYWORDS); - return impl(inliningTarget, hs, getIterator, itNext, itKey, itValue, dyLib, factory); + return impl(inliningTarget, hs, getIterator, itNext, itKey, itValue, dyLib); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextObjectBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextObjectBuiltins.java index 576e52f7e3..63e79683bd 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextObjectBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextObjectBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,6 +40,8 @@ */ package com.oracle.graal.python.builtins.modules.cext; +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.NotImplementedError; +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Direct; import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Ignored; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.ConstCharPtrAsTruffleString; @@ -47,6 +49,7 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Pointer; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectConstPtr; +import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectRawPointer; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectWrapper; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyThreadState; @@ -63,8 +66,8 @@ import java.io.PrintWriter; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.BytesNode; import com.oracle.graal.python.builtins.modules.BuiltinFunctions.FormatNode; import com.oracle.graal.python.builtins.modules.BuiltinFunctions.IsInstanceNode; import com.oracle.graal.python.builtins.modules.BuiltinFunctions.IsSubClassNode; @@ -77,12 +80,11 @@ import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CastArgsNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CastKwargsNode; -import com.oracle.graal.python.builtins.modules.cext.PythonCextBytesBuiltins.PyBytes_FromObject; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.bytes.BytesNodes; import com.oracle.graal.python.builtins.objects.bytes.BytesUtils; -import com.oracle.graal.python.builtins.objects.bytes.PBytesLike; -import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; +import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.cext.capi.CApiGuards; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ResolvePointerNode; import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper; @@ -92,6 +94,7 @@ import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.NativeToPythonNode; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.ToPythonWrapperNode; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.UpdateStrongRefNode; import com.oracle.graal.python.builtins.objects.cext.common.GetNextVaArgNode; import com.oracle.graal.python.builtins.objects.cext.structs.CFields; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; @@ -103,6 +106,7 @@ import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins.SetattrNode; import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.lib.PyBytesCheckNode; import com.oracle.graal.python.lib.PyCallableCheckNode; import com.oracle.graal.python.lib.PyLongCheckNode; import com.oracle.graal.python.lib.PyObjectAsFileDescriptor; @@ -114,27 +118,28 @@ import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.lib.PyObjectHashNode; import com.oracle.graal.python.lib.PyObjectIsTrueNode; -import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.lib.PyObjectLookupAttrO; import com.oracle.graal.python.lib.PyObjectReprAsObjectNode; import com.oracle.graal.python.lib.PyObjectSetItem; import com.oracle.graal.python.lib.PyObjectStrAsObjectNode; import com.oracle.graal.python.nodes.BuiltinNames; +import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.StringLiterals; import com.oracle.graal.python.nodes.argument.keywords.ExpandKeywordStarargsNode; import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.classes.IsSubtypeNode; +import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; +import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.object.GetOrCreateDictNode; +import com.oracle.graal.python.nodes.object.IsNode; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaStringNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.PosixSupportLibrary; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.PSequence; import com.oracle.graal.python.runtime.sequence.storage.ArrayBasedSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.EmptySequenceStorage; @@ -145,7 +150,7 @@ import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; +import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.interop.InteropException; import com.oracle.truffle.api.interop.InteropLibrary; @@ -165,9 +170,11 @@ abstract static class PyTruffle_NotifyRefCount extends CApiBinaryBuiltinNode { @Specialization static Object doGeneric(PythonAbstractObjectNativeWrapper wrapper, long refCount, @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile hasRefProfile) { + @Cached UpdateStrongRefNode updateRefNode) { assert CApiTransitions.readNativeRefCount(HandlePointerConverter.pointerToStub(wrapper.getNativePointer())) == refCount; - wrapper.updateRef(inliningTarget, refCount, hasRefProfile); + // refcounting on an immortal object should be a NOP + assert refCount != PythonAbstractObjectNativeWrapper.IMMORTAL_REFCNT; + updateRefNode.execute(inliningTarget, wrapper, refCount); return PNone.NO_VALUE; } } @@ -178,13 +185,13 @@ abstract static class PyTruffle_BulkNotifyRefCount extends CApiBinaryBuiltinNode @Specialization static Object doGeneric(Object arrayPointer, int len, @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile hasRefProfile, + @Cached UpdateStrongRefNode updateRefNode, @Cached CStructAccess.ReadPointerNode readPointerNode, @Cached ToPythonWrapperNode toPythonWrapperNode) { /* * It may happen that due to several inc- and decrefs applied to a borrowed reference, - * that the same pointer is in the list several times. To avoid crashed, we do the + * that the same pointer is in the list several times. To avoid crashes, we do the * processing in two phases: first, we resolve the pointers to wrappers and second, we * update the reference counts. In this way, we avoid that a reference is made weak when * processed the first time and may then be invalid if processed the second time. @@ -197,7 +204,9 @@ static Object doGeneric(Object arrayPointer, int len, for (int i = 0; i < resolved.length; i++) { if (resolved[i] instanceof PythonAbstractObjectNativeWrapper objectNativeWrapper) { long refCount = CApiTransitions.readNativeRefCount(HandlePointerConverter.pointerToStub(objectNativeWrapper.getNativePointer())); - objectNativeWrapper.updateRef(inliningTarget, refCount, hasRefProfile); + // refcounting on an immortal object should be a NOP + assert refCount != PythonAbstractObjectNativeWrapper.IMMORTAL_REFCNT; + updateRefNode.execute(inliningTarget, objectNativeWrapper, refCount); } } return PNone.NO_VALUE; @@ -427,14 +436,16 @@ static Object asFileDescriptor(Object obj, @Cached PyLongCheckNode longCheckNode, @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, @Cached TruffleString.EqualNode eqNode, - @Cached PyObjectAsFileDescriptor asFileDescriptorNode) { + @Cached PyObjectAsFileDescriptor asFileDescriptorNode, + @Cached PRaiseNode raiseNode) { if (!longCheckNode.execute(inliningTarget, obj)) { Object posixSupport = PythonContext.get(inliningTarget).getPosixSupport(); if (eqNode.execute(T_JAVA, posixLib.getBackend(posixSupport), TS_ENCODING)) { - // For non Python `int' objects, we refuse to hand out the fileno - // field when using the emulated Posix backend, because it is likely - // a fake. - return -1; + /* + * For non Python 'int' objects, we refuse to hand out the fileno field when + * using the emulated Posix backend, because it is likely a fake. + */ + throw raiseNode.raise(inliningTarget, NotImplementedError, ErrorMessages.S_NOT_SUPPORTED_ON_JAVA_POSIX_BACKEND, "PyObject_AsFileDescriptor"); } } return asFileDescriptorNode.execute(null, inliningTarget, obj); @@ -481,8 +492,8 @@ static int hasAttr(Object obj, Object attr, abstract static class PyObject_HashNotImplemented extends CApiUnaryBuiltinNode { @Specialization static Object unhashable(Object obj, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, UNHASHABLE_TYPE_P, obj); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, UNHASHABLE_TYPE_P, obj); } } @@ -490,63 +501,49 @@ static Object unhashable(Object obj, abstract static class PyObject_IsTrue extends CApiUnaryBuiltinNode { @Specialization static int isTrue(Object obj, - @Bind("this") Node inliningTarget, @Cached PyObjectIsTrueNode isTrueNode) { - return isTrueNode.execute(null, inliningTarget, obj) ? 1 : 0; + return isTrueNode.execute(null, obj) ? 1 : 0; } } @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject}, call = Direct) abstract static class PyObject_Bytes extends CApiUnaryBuiltinNode { - @Specialization - static Object bytes(PBytesLike bytes) { + @Specialization(guards = "isBuiltinBytes(bytes)") + static Object bytes(PBytes bytes) { return bytes; } - @Specialization(guards = {"!isBytes(bytes)", "isBytesSubtype(inliningTarget, bytes, getClassNode, isSubtypeNode)"}, limit = "1") - static Object bytes(Object bytes, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached GetClassNode getClassNode, - @SuppressWarnings("unused") @Exclusive @Cached IsSubtypeNode isSubtypeNode) { - return bytes; - } - - @Specialization(guards = {"!isBytes(obj)", "!isBytesSubtype(this, obj, getClassNode, isSubtypeNode)", "!isNoValue(obj)", "hasBytes(inliningTarget, obj, lookupAttrNode)"}, limit = "1") - static Object bytes(Object obj, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached GetClassNode getClassNode, - @SuppressWarnings("unused") @Exclusive @Cached IsSubtypeNode isSubtypeNode, - @SuppressWarnings("unused") @Exclusive @Cached PyObjectLookupAttr lookupAttrNode, - @Cached BytesNode bytesNode) { - return bytesNode.execute(null, PythonBuiltinClassType.PBytes, obj, PNone.NO_VALUE, PNone.NO_VALUE); - } - - @Specialization(guards = {"!isBytes(obj)", "!isBytesSubtype(this, obj, getClassNode, isSubtypeNode)", "!isNoValue(obj)", "!hasBytes(inliningTarget, obj, lookupAttrNode)"}, limit = "1") - static Object bytes(Object obj, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached GetClassNode getClassNode, - @SuppressWarnings("unused") @Exclusive @Cached IsSubtypeNode isSubtypeNode, - @SuppressWarnings("unused") @Exclusive @Cached PyObjectLookupAttr lookupAttrNode, - @Cached PyBytes_FromObject fromObjectNode) { - return fromObjectNode.execute(obj); - } - @Specialization(guards = "isNoValue(obj)") static Object bytesNoValue(@SuppressWarnings("unused") Object obj, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { /* * Note: CPython calls PyBytes_FromString("") but we do not directly have it. * Therefore, we directly create the bytes object with string "" here. */ - return factory.createBytes(BytesUtils.NULL_STRING); - } - - protected static boolean hasBytes(Node inliningTarget, Object obj, PyObjectLookupAttr lookupAttrNode) { - return lookupAttrNode.execute(null, inliningTarget, obj, T___BYTES__) != PNone.NO_VALUE; + return PFactory.createBytes(language, BytesUtils.NULL_STRING); } - protected static boolean isBytesSubtype(Node inliningTarget, Object obj, GetClassNode getClassNode, IsSubtypeNode isSubtypeNode) { - return isSubtypeNode.execute(getClassNode.execute(inliningTarget, obj), PythonBuiltinClassType.PBytes); + @Fallback + static Object doGeneric(Object obj, + @Bind("this") Node inliningTarget, + @Cached GetClassNode getClassNode, + @Cached InlinedConditionProfile hasBytes, + @Cached("create(T___BYTES__)") LookupSpecialMethodNode lookupBytes, + @Cached CallUnaryMethodNode callBytes, + @Cached PyBytesCheckNode check, + @Cached BytesNodes.BytesFromObject fromObject, + @Cached PRaiseNode raiseNode) { + Object bytesMethod = lookupBytes.execute(null, getClassNode.execute(inliningTarget, obj), obj); + if (hasBytes.profile(inliningTarget, bytesMethod != PNone.NO_VALUE)) { + Object bytes = callBytes.executeObject(null, bytesMethod, obj); + if (check.execute(inliningTarget, bytes)) { + return bytes; + } else { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.RETURNED_NONBYTES, T___BYTES__, bytes); + } + } + byte[] bytes = fromObject.execute(null, obj); + return PFactory.createBytes(PythonLanguage.get(inliningTarget), bytes); } } @@ -601,8 +598,17 @@ static PNone set(PSequence obj, long size, } } - @CApiBuiltin(ret = Void, args = {PyObjectWrapper}, call = Direct) - abstract static class _PyObject_Dump extends CApiUnaryBuiltinNode { + @CApiBuiltin(ret = Int, args = {PyObjectRawPointer}, call = Ignored) + abstract static class _PyTruffleObject_IsFreed extends CApiUnaryBuiltinNode { + @Specialization + int doGeneric(Object pointer, + @Cached ToPythonWrapperNode toPythonWrapperNode) { + return toPythonWrapperNode.executeWrapper(pointer, false) == null ? 1 : 0; + } + } + + @CApiBuiltin(ret = Void, args = {PyObjectWrapper}, call = Ignored) + abstract static class _PyTruffleObject_Dump extends CApiUnaryBuiltinNode { @Specialization @TruffleBoundary @@ -610,8 +616,6 @@ int doGeneric(Object ptrObject, @Cached CStructAccess.ReadI64Node readI64) { PythonContext context = getContext(); PrintWriter stderr = new PrintWriter(context.getStandardErr()); - CApiContext cApiContext = context.getCApiContext(); - InteropLibrary lib = InteropLibrary.getUncached(ptrObject); // There are three cases we need to distinguish: // 1) The pointer object is a native pointer and is NOT a handle @@ -620,21 +624,6 @@ int doGeneric(Object ptrObject, boolean isWrapper = CApiGuards.isNativeWrapper(ptrObject); - boolean pointsToHandleSpace = !isWrapper; // TODO: use CApiTransitions here - boolean isValidHandle = pointsToHandleSpace; - - /* - * If the pointer points to the handle space but it's not a valid handle or if we do - * memory tracing and we know that the pointer is not allocated (was free'd), we assumed - * it's a use-after-free. - */ - boolean traceNativeMemory = context.getOption(PythonOptions.TraceNativeMemory); - if (pointsToHandleSpace && !isValidHandle || traceNativeMemory && !isWrapper && !cApiContext.isAllocated(ptrObject)) { - stderr.println(PythonUtils.formatJString("", CApiContext.asPointer(ptrObject, lib))); - stderr.flush(); - return 0; - } - /* * At this point we don't know if the pointer is invalid, so we try to resolve it to an * object. @@ -750,4 +739,13 @@ static Object getDict(Object object, return getDict.execute(inliningTarget, object); } } + + @CApiBuiltin(ret = Int, args = {PyObject, PyObject}, call = Ignored) + abstract static class PyTruffle_Is extends CApiBinaryBuiltinNode { + @Specialization + static int isTrue(Object a, Object b, + @Cached IsNode isNode) { + return isNode.execute(a, b) ? 1 : 0; + } + } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextPickleBufferBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextPickleBufferBuiltins.java index 34e56c14f5..e3e6b1731e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextPickleBufferBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextPickleBufferBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -65,13 +65,13 @@ abstract static class PyTruffle_PickleBuffer_viewobj extends CApiUnaryBuiltinNod static Object getviewobj(PPickleBuffer object, @Bind("this") Node inliningTarget, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object owner = null; if (object.getView() != null) { owner = bufferLib.getOwner(object.getView()); } if (owner == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.OP_FORBIDDEN_ON_OBJECT, "PickleBuffer"); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.OP_FORBIDDEN_ON_OBJECT, "PickleBuffer"); } return owner; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextPyStateBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextPyStateBuiltins.java index 3f3987b8e5..36a161c79b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextPyStateBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextPyStateBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,34 +45,45 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Pointer; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyFrameObjectTransfer; +import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectBorrowed; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyThreadState; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Py_ssize_t; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Void; +import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiNullaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; import com.oracle.graal.python.builtins.objects.cext.capi.PThreadState; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.frame.PFrame; import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.builtins.objects.thread.PThread; +import com.oracle.graal.python.nodes.PGuards; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.PRootNode; import com.oracle.graal.python.nodes.frame.GetCurrentFrameRef; import com.oracle.graal.python.nodes.frame.ReadCallerFrameNode; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.runtime.GilNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonContext.PythonThreadState; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.OverflowException; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.ThreadLocalAction; +import com.oracle.truffle.api.TruffleLogger; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.nodes.RootNode; public final class PythonCextPyStateBuiltins { @@ -110,9 +121,11 @@ static Object restore( abstract static class PyTruffleThreadState_Get extends CApiUnaryBuiltinNode { @Specialization(limit = "1") - Object get(Object tstateCurrentPtr, + static Object get(Object tstateCurrentPtr, + @Bind("this") Node inliningTarget, + @Bind PythonContext context, @CachedLibrary("tstateCurrentPtr") InteropLibrary lib) { - PythonThreadState pythonThreadState = getContext().getThreadState(getLanguage()); + PythonThreadState pythonThreadState = context.getThreadState(context.getLanguage(inliningTarget)); if (!lib.isNull(tstateCurrentPtr)) { pythonThreadState.setNativeThreadLocalVarPointer(tstateCurrentPtr); } @@ -120,23 +133,86 @@ Object get(Object tstateCurrentPtr, } } + @CApiBuiltin(ret = Void, args = {}, call = Ignored) + abstract static class PyTruffleBeforeThreadDetach extends CApiNullaryBuiltinNode { + @Specialization + @TruffleBoundary + Object doIt() { + getContext().disposeThread(Thread.currentThread(), true); + return PNone.NO_VALUE; + } + } + @CApiBuiltin(ret = PyObjectBorrowed, args = {}, call = Direct) abstract static class PyThreadState_GetDict extends CApiNullaryBuiltinNode { @Specialization @TruffleBoundary - PDict get(@Cached PythonObjectFactory factory) { - - PythonThreadState threadState = getContext().getThreadState(getLanguage()); + static PDict get( + @Bind("this") Node inliningTarget, + @Bind PythonContext context) { + PythonThreadState threadState = context.getThreadState(context.getLanguage(inliningTarget)); PDict threadStateDict = threadState.getDict(); if (threadStateDict == null) { - threadStateDict = factory.createDict(); + threadStateDict = PFactory.createDict(context.getLanguage()); threadState.setDict(threadStateDict); } return threadStateDict; } } + @CApiBuiltin(ret = Int, args = {ArgDescriptor.UNSIGNED_LONG, PyObject}, call = Direct) + abstract static class PyThreadState_SetAsyncExc extends CApiBinaryBuiltinNode { + public static final TruffleLogger LOGGER = CApiContext.getLogger(PyThreadState_SetAsyncExc.class); + + @Specialization + @TruffleBoundary + int doIt(long id, Object exceptionObject) { + for (Thread thread : getContext().getThreads()) { + if (PThread.getThreadId(thread) == id) { + if (PGuards.isNoValue(exceptionObject)) { + LOGGER.warning("The application used PyThreadState_SetAsyncExc to clear an exception on another thread. " + + "This is not supported and ignored by GraalPy."); + return 1; + } + ThreadLocalAction action = new ThreadLocalAction(true, false) { + static final int MAX_MISSED_COUNT = 20; + int missedCount = 0; + + @Override + protected void perform(Access access) { + if (missedCount == MAX_MISSED_COUNT) { + throw PRaiseNode.raiseExceptionObject(null, exceptionObject); + } + // If possible, we do not want to raise in some internal code, it could + // corrupt internal data structures. + Node location = access.getLocation(); + if (location != null) { + RootNode rootNode = location.getRootNode(); + if (rootNode instanceof PRootNode && !rootNode.isInternal()) { + throw PRaiseNode.raiseExceptionObject(null, exceptionObject); + } + } + // Heuristic fabricated out of thin air: + if (missedCount++ < MAX_MISSED_COUNT) { + if (missedCount % 2 == 0) { + try { + Thread.sleep(1); + } catch (InterruptedException ignored) { + } + } + getContext().getEnv().submitThreadLocal(new Thread[]{thread}, this); + } + } + }; + getContext().getEnv().submitThreadLocal(new Thread[]{thread}, action); + return 1; + } + } + return 0; + } + } + @CApiBuiltin(ret = PyFrameObjectTransfer, args = {PyThreadState}, call = Direct) abstract static class PyThreadState_GetFrame extends CApiUnaryBuiltinNode { @Specialization diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextPyThreadBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextPyThreadBuiltins.java index df9a34215a..1c813ea024 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextPyThreadBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextPyThreadBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -49,7 +49,7 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Void; import static com.oracle.graal.python.builtins.objects.ints.PInt.intValue; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiNullaryBuiltinNode; @@ -58,7 +58,7 @@ import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor; import com.oracle.graal.python.builtins.objects.thread.PLock; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Specialization; @@ -77,7 +77,7 @@ abstract static class PyThread_allocate_lock extends CApiNullaryBuiltinNode { long allocate() { CApiContext context = getCApiContext(); long id = context.lockId.incrementAndGet() ^ LOCK_MASK; - PLock lock = PythonObjectFactory.getUncached().createLock(PythonBuiltinClassType.PLock); + PLock lock = PFactory.createLock(PythonLanguage.get(null)); context.locks.put(id, lock); return id; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextPythonRunBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextPythonRunBuiltins.java index df7d577fd7..69a83f53f5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextPythonRunBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextPythonRunBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -69,7 +69,6 @@ import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @@ -89,7 +88,7 @@ static Object run(Object source, int type, Object globals, Object locals, @Suppr @SuppressWarnings("unused") @Exclusive @Cached PyMappingCheckNode isMapping, @Cached PyObjectLookupAttr lookupNode, @Cached CallNode callNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { PythonModule builtins = PythonContext.get(inliningTarget).getBuiltins(); Object compileCallable = lookupNode.execute(null, inliningTarget, builtins, T_COMPILE); TruffleString stype; @@ -100,7 +99,7 @@ static Object run(Object source, int type, Object globals, Object locals, @Suppr } else if (type == Py_eval_input) { stype = StringLiterals.T_EVAL; } else { - throw raiseNode.get(inliningTarget).raise(SystemError, BAD_ARG_TO_INTERNAL_FUNC); + throw raiseNode.raise(inliningTarget, SystemError, BAD_ARG_TO_INTERNAL_FUNC); } Object code = callNode.executeWithoutFrame(compileCallable, source, stype, stype); Object execCallable = lookupNode.execute(null, inliningTarget, builtins, type == Py_eval_input ? T_EVAL : T_EXEC); @@ -110,17 +109,16 @@ static Object run(Object source, int type, Object globals, Object locals, @Suppr @Specialization(guards = "!isString(source) || !isDict(globals)") static Object run(@SuppressWarnings("unused") Object source, @SuppressWarnings("unused") int type, @SuppressWarnings("unused") Object globals, @SuppressWarnings("unused") Object locals, @SuppressWarnings("unused") Object flags, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(SystemError, BAD_ARG_TO_INTERNAL_FUNC); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, BAD_ARG_TO_INTERNAL_FUNC); } @Specialization(guards = {"isString(source)", "isDict(globals)", "!isMapping.execute(inliningTarget, locals)"}, limit = "1") static Object run(@SuppressWarnings("unused") Object source, @SuppressWarnings("unused") int type, @SuppressWarnings("unused") Object globals, Object locals, @SuppressWarnings("unused") Object flags, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached PyMappingCheckNode isMapping, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, P_OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT, locals); + @Bind("this") Node inliningTarget, + @SuppressWarnings("unused") @Exclusive @Cached PyMappingCheckNode isMapping) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, P_OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT, locals); } protected static boolean checkArgs(Object source, Object globals, Object locals, Node inliningTarget, PyMappingCheckNode isMapping) { @@ -133,7 +131,7 @@ abstract static class Py_CompileString extends CApiTernaryBuiltinNode { @Specialization(guards = {"isString(source)", "isString(filename)"}) static Object compile(Object source, Object filename, int type, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached PyObjectLookupAttr lookupNode, @Cached CallNode callNode) { return Py_CompileStringExFlags.compile(source, filename, type, null, -1, inliningTarget, raiseNode, lookupNode, callNode); @@ -142,8 +140,8 @@ static Object compile(Object source, Object filename, int type, @SuppressWarnings("unused") @Specialization(guards = "!isString(source) || !isString(filename)") static Object fail(Object source, Object filename, Object type, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(SystemError, BAD_ARG_TO_INTERNAL_FUNC); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, BAD_ARG_TO_INTERNAL_FUNC); } } @@ -153,7 +151,7 @@ abstract static class Py_CompileStringExFlags extends CApi5BuiltinNode { static Object compile(Object source, Object filename, int type, @SuppressWarnings("unused") Object flags, int optimizationLevel, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached PyObjectLookupAttr lookupNode, @Cached CallNode callNode) { PythonModule builtins = PythonContext.get(lookupNode).getCore().getBuiltins(); @@ -166,7 +164,7 @@ static Object compile(Object source, Object filename, int type, } else if (type == Py_eval_input) { stype = StringLiterals.T_EVAL; } else { - throw raiseNode.get(inliningTarget).raise(SystemError, BAD_ARG_TO_INTERNAL_FUNC); + throw raiseNode.raise(inliningTarget, SystemError, BAD_ARG_TO_INTERNAL_FUNC); } int defaultFlags = 0; boolean dontInherit = false; @@ -176,8 +174,8 @@ static Object compile(Object source, Object filename, int type, @SuppressWarnings("unused") @Specialization(guards = "!isString(source) || !isString(filename)") static Object fail(Object source, Object filename, Object type, Object flags, Object optimizationLevel, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(SystemError, BAD_ARG_TO_INTERNAL_FUNC); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, BAD_ARG_TO_INTERNAL_FUNC); } } @@ -188,7 +186,7 @@ static Object compile(Object source, Object filename, int type, @SuppressWarnings("unused") Object flags, int optimizationLevel, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached PyObjectLookupAttr lookupNode, @Cached CallNode callNode) { return Py_CompileStringExFlags.compile(source, filename, type, null, optimizationLevel, inliningTarget, raiseNode, lookupNode, callNode); @@ -197,8 +195,8 @@ static Object compile(Object source, Object filename, int type, @SuppressWarnings("unused") @Specialization(guards = "!isString(source)") static Object fail(Object source, Object filename, Object type, Object flags, Object optimizationLevel, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(SystemError, BAD_ARG_TO_INTERNAL_FUNC); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, BAD_ARG_TO_INTERNAL_FUNC); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextSetBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextSetBuiltins.java index 4c1b039c21..52629d244d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextSetBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextSetBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -51,9 +51,8 @@ import static com.oracle.graal.python.nodes.ErrorMessages.EXPECTED_S_NOT_P; import static com.oracle.graal.python.nodes.ErrorMessages.NATIVE_S_SUBTYPES_NOT_IMPLEMENTED; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.FrozenSetNode; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.StrNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; @@ -68,24 +67,24 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIteratorNext; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageLen; import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.builtins.objects.set.FrozenSetBuiltins.FrozenSetNode; import com.oracle.graal.python.builtins.objects.set.PBaseSet; import com.oracle.graal.python.builtins.objects.set.PFrozenSet; import com.oracle.graal.python.builtins.objects.set.PSet; import com.oracle.graal.python.builtins.objects.set.SetBuiltins.ClearNode; import com.oracle.graal.python.builtins.objects.set.SetNodes.ConstructSetNode; import com.oracle.graal.python.builtins.objects.set.SetNodes.DiscardNode; +import com.oracle.graal.python.builtins.objects.str.StringBuiltins; import com.oracle.graal.python.lib.PyObjectSizeNode; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.truffle.PythonTypes; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile; @@ -96,13 +95,13 @@ abstract static class PySet_New extends CApiUnaryBuiltinNode { @Specialization(guards = {"!isNone(iterable)", "!isNoValue(iterable)"}) static Object newSet(Object iterable, @Cached ConstructSetNode constructSetNode) { - return constructSetNode.executeWith(null, iterable); + return constructSetNode.execute(null, iterable); } @Specialization static Object newSet(@SuppressWarnings("unused") PNone iterable, - @Cached PythonObjectFactory factory) { - return factory.createSet(); + @Bind PythonLanguage language) { + return PFactory.createSet(language); } } @@ -133,7 +132,6 @@ int fallback(@SuppressWarnings("unused") Object anyset, @SuppressWarnings("unuse } @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, Py_ssize_t}, call = Ignored) - @TypeSystemReference(PythonTypes.class) abstract static class _PyTruffleSet_NextEntry extends CApiBinaryBuiltinNode { @Specialization(guards = "pos < size(inliningTarget, set, sizeNode)") static Object nextEntry(PSet set, long pos, @@ -143,9 +141,8 @@ static Object nextEntry(PSet set, long pos, @Shared @Cached HashingStorageIteratorNext itNext, @Shared @Cached HashingStorageIteratorKey itKey, @Shared @Cached HashingStorageIteratorKeyHash itKeyHash, - @Shared @Cached InlinedLoopConditionProfile loopProfile, - @Shared @Cached PythonObjectFactory.Lazy factory) { - return next(inliningTarget, (int) pos, set.getDictStorage(), getIterator, itNext, itKey, itKeyHash, loopProfile, factory); + @Shared @Cached InlinedLoopConditionProfile loopProfile) { + return next(inliningTarget, (int) pos, set.getDictStorage(), getIterator, itNext, itKey, itKeyHash, loopProfile); } @Specialization(guards = "pos < size(inliningTarget, set, sizeNode)") @@ -156,9 +153,8 @@ static Object nextEntry(PFrozenSet set, long pos, @Shared @Cached HashingStorageIteratorNext itNext, @Shared @Cached HashingStorageIteratorKey itKey, @Shared @Cached HashingStorageIteratorKeyHash itKeyHash, - @Shared @Cached InlinedLoopConditionProfile loopProfile, - @Shared @Cached PythonObjectFactory.Lazy factory) { - return next(inliningTarget, (int) pos, set.getDictStorage(), getIterator, itNext, itKey, itKeyHash, loopProfile, factory); + @Shared @Cached InlinedLoopConditionProfile loopProfile) { + return next(inliningTarget, (int) pos, set.getDictStorage(), getIterator, itNext, itKey, itKeyHash, loopProfile); } @Specialization(guards = {"isPSet(set) || isPFrozenSet(set)", "pos >= size(inliningTarget, set, sizeNode)"}) @@ -170,21 +166,19 @@ static Object nextEntry(@SuppressWarnings("unused") Object set, @SuppressWarning @Specialization(guards = {"!isPSet(anyset)", "!isPFrozenSet(anyset)", "isSetSubtype(inliningTarget, anyset, getClassNode, isSubtypeNode)"}) static Object nextNative(@SuppressWarnings("unused") Object anyset, @SuppressWarnings("unused") Object pos, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.NotImplementedError, NATIVE_S_SUBTYPES_NOT_IMPLEMENTED, "set"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.NotImplementedError, NATIVE_S_SUBTYPES_NOT_IMPLEMENTED, "set"); } @Specialization(guards = {"!isPSet(anyset)", "!isPFrozenSet(anyset)", "!isSetSubtype(inliningTarget, anyset, getClassNode, isSubtypeNode)"}) static Object nextEntry(Object anyset, @SuppressWarnings("unused") Object pos, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Cached StrNode strNode, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(SystemError, BAD_ARG_TO_INTERNAL_FUNC_WAS_S_P, strNode.executeWith(anyset), anyset); + @Cached StringBuiltins.StrNewNode strNode, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, BAD_ARG_TO_INTERNAL_FUNC_WAS_S_P, strNode.executeWith(anyset), anyset); } protected boolean isSetSubtype(Node inliningTarget, Object obj, GetClassNode getClassNode, IsSubtypeNode isSubtypeNode) { @@ -198,7 +192,7 @@ protected int size(Node inliningTarget, Object set, PyObjectSizeNode sizeNode) { private static Object next(Node inliningTarget, int pos, HashingStorage storage, HashingStorageGetIterator getIterator, HashingStorageIteratorNext itNext, HashingStorageIteratorKey itKey, HashingStorageIteratorKeyHash itKeyHash, - InlinedLoopConditionProfile loopProfile, PythonObjectFactory.Lazy factory) { + InlinedLoopConditionProfile loopProfile) { HashingStorageIterator it = getIterator.execute(inliningTarget, storage); loopProfile.profileCounted(inliningTarget, pos); for (int i = 0; loopProfile.inject(inliningTarget, i <= pos); i++) { @@ -207,8 +201,8 @@ private static Object next(Node inliningTarget, int pos, HashingStorage storage, } } Object key = itKey.execute(inliningTarget, storage, it); - long hash = itKeyHash.execute(inliningTarget, storage, it); - return factory.get(inliningTarget).createTuple(new Object[]{key, hash}); + long hash = itKeyHash.execute(null, inliningTarget, storage, it); + return PFactory.createTuple(PythonLanguage.get(inliningTarget), new Object[]{key, hash}); } } @@ -237,8 +231,8 @@ static Object newFrozenSet(Object iterable, @SuppressWarnings("unused") @Specialization static Object newFrozenSet(PNone iterable, - @Cached PythonObjectFactory factory) { - return factory.createFrozenSet(PythonBuiltinClassType.PFrozenSet); + @Bind PythonLanguage language) { + return PFactory.createFrozenSet(language); } } @@ -286,8 +280,8 @@ static int add(PBaseSet self, Object o, @Specialization(guards = "!isAnySet(self)") static int add(Object self, @SuppressWarnings("unused") Object o, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(SystemError, EXPECTED_S_NOT_P, "a set object", self); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, EXPECTED_S_NOT_P, "a set object", self); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextSlotBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextSlotBuiltins.java index f230f95cdc..fd2cc47631 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextSlotBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextSlotBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -474,7 +474,6 @@ static int get(@SuppressWarnings("unused") Object object) { abstract static class Py_get_PyGetSetDef_doc extends CApiUnaryBuiltinNode { @Specialization Object get(PythonObject object, - @Bind("this") Node inliningTarget, @Cached(parameters = "T___DOC__") GetFixedAttributeNode getAttrNode, @Cached AsCharPointerNode asCharPointerNode) { Object doc = getAttrNode.execute(null, object); @@ -498,7 +497,6 @@ static int get(@SuppressWarnings("unused") Object object) { abstract static class Py_get_PyGetSetDef_name extends CApiUnaryBuiltinNode { @Specialization Object get(PythonObject object, - @Bind("this") Node inliningTarget, @Cached(parameters = "T___NAME__") GetFixedAttributeNode getAttrNode, @Cached AsCharPointerNode asCharPointerNode) { Object name = getAttrNode.execute(null, object); @@ -616,7 +614,6 @@ static Object get(PythonModule object) { abstract static class Py_get_PyModuleObject_md_dict extends CApiUnaryBuiltinNode { @Specialization static Object get(Object object, - @Bind("this") Node inliningTarget, @Exclusive @Cached(parameters = "T___DICT__") GetFixedAttributeNode getDictNode) { return getDictNode.execute(null, object); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextStructSeqBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextStructSeqBuiltins.java index 3e8a392940..b71081e15b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextStructSeqBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextStructSeqBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -67,7 +67,9 @@ import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.tuple.StructSequence; +import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; import com.oracle.graal.python.builtins.objects.type.PythonClass; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.nodes.BuiltinNames; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; @@ -76,7 +78,9 @@ import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; @@ -95,7 +99,7 @@ abstract static class PyTruffleStructSequence_InitType2 extends CApiTernaryBuilt @Specialization @TruffleBoundary - static int doGeneric(Object klass, Object fields, int nInSequence, + static int doGeneric(PythonAbstractClass klass, Object fields, int nInSequence, @CachedLibrary(limit = "3") InteropLibrary lib, @Cached CStructAccess.ReadPointerNode readNode, @Cached FromCharPointerNode fromCharPtr) { @@ -120,8 +124,8 @@ static int doGeneric(Object klass, Object fields, int nInSequence, TruffleString[] fieldNames = names.toArray(TruffleString[]::new); TruffleString[] fieldDocs = docs.toArray(TruffleString[]::new); - StructSequence.Descriptor d = new StructSequence.Descriptor(null, nInSequence, fieldNames, fieldDocs); - StructSequence.initType(PythonLanguage.get(readNode), klass, d); + StructSequence.Descriptor d = new StructSequence.Descriptor(nInSequence, fieldNames, fieldDocs); + StructSequence.initType(PythonContext.get(readNode), klass, d); return 0; } } @@ -136,10 +140,10 @@ Object doGeneric(TruffleString typeName, TruffleString typeDoc, Object fields, i @Cached ReadAttributeFromObjectNode readTypeBuiltinNode, @CachedLibrary(limit = "1") DynamicObjectLibrary dylib, @Cached CallNode callTypeNewNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { Object typeBuiltin = readTypeBuiltinNode.execute(getCore().getBuiltins(), BuiltinNames.T_TYPE); - PTuple bases = factory.createTuple(new Object[]{PythonBuiltinClassType.PTuple}); - PDict namespace = factory.createDict(new PKeyword[]{new PKeyword(SpecialAttributeNames.T___DOC__, typeDoc)}); + PTuple bases = PFactory.createTuple(language, new Object[]{PythonBuiltinClassType.PTuple}); + PDict namespace = PFactory.createDict(language, new PKeyword[]{new PKeyword(SpecialAttributeNames.T___DOC__, typeDoc)}); Object cls = callTypeNewNode.executeWithoutFrame(typeBuiltin, typeName, bases, namespace); initNode.execute(cls, fields, nInSequence); if (cls instanceof PythonClass) { @@ -157,17 +161,18 @@ static Object doGeneric(Object cls, @Bind("this") Node inliningTarget, @Cached("createForceType()") ReadAttributeFromObjectNode readRealSizeNode, @Cached CastToJavaIntExactNode castToIntNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Cached PRaiseNode raiseNode) { try { Object realSizeObj = readRealSizeNode.execute(cls, StructSequence.T_N_FIELDS); if (realSizeObj == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(SystemError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC, EMPTY_OBJECT_ARRAY); + throw raiseNode.raise(inliningTarget, SystemError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC, EMPTY_OBJECT_ARRAY); } else { int realSize = castToIntNode.execute(inliningTarget, realSizeObj); Object[] values = new Object[realSize]; Arrays.fill(values, PNone.NO_VALUE); // Initialize to C NULL - return factory.createTuple(cls, values); + return PFactory.createTuple(language, cls, getInstanceShape.execute(cls), new ObjectSequenceStorage(values)); } } catch (CannotCastException e) { throw CompilerDirectives.shouldNotReachHere("attribute 'n_fields' is expected to be a Java int"); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextSysBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextSysBuiltins.java index fe7238ade3..af20724bff 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextSysBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextSysBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,18 +41,31 @@ package com.oracle.graal.python.builtins.modules.cext; import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Direct; +import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Ignored; +import static com.oracle.graal.python.builtins.modules.io.IONodes.T_WRITE; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.ConstCharPtrAsTruffleString; +import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectBorrowed; +import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.VA_LIST_PTR; +import static com.oracle.graal.python.nodes.BuiltinNames.T_STDERR; +import static com.oracle.graal.python.nodes.BuiltinNames.T_STDOUT; import static com.oracle.graal.python.nodes.BuiltinNames.T_SYS; +import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; +import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiTernaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.PromoteBorrowedValue; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.UnicodeFromFormatNode; import com.oracle.graal.python.builtins.objects.module.PythonModule; +import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.lib.PyObjectSetAttr; +import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.truffle.api.CompilerAsserts; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; @@ -89,4 +102,46 @@ Object getObject(TruffleString name, } } } + + private static Object selectOut(int fd) { + CompilerAsserts.neverPartOfCompilation(); + Object file; + PythonModule sys = PythonContext.get(null).lookupBuiltinModule(T_SYS); + if (fd == 0) { + file = sys.getAttribute(T_STDOUT); + } else { + file = sys.getAttribute(T_STDERR); + } + return file; + } + + @CApiBuiltin(ret = Int, args = {Int, ConstCharPtrAsTruffleString}, call = Ignored) + abstract static class PyTruffleSys_WriteStd extends CApiBinaryBuiltinNode { + @Specialization + @TruffleBoundary + static Object doGeneric(int fd, TruffleString msg) { + try { + PyObjectCallMethodObjArgs.executeUncached(selectOut(fd), T_WRITE, msg); + return 0; + } catch (PException e) { + return -1; + } + } + } + + @CApiBuiltin(ret = Int, args = {Int, ConstCharPtrAsTruffleString, VA_LIST_PTR}, call = Ignored) + abstract static class PyTruffleSys_FormatStd extends CApiTernaryBuiltinNode { + @Specialization + @TruffleBoundary + static Object doGeneric(int fd, TruffleString format, Object vaList) { + try { + Object msg = UnicodeFromFormatNode.executeUncached(format, vaList); + PyObjectCallMethodObjArgs.executeUncached(selectOut(fd), T_WRITE, msg); + return 0; + } catch (PException e) { + // do not propagate any exception to native + return -1; + } + } + } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextTracebackBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextTracebackBuiltins.java index 54ca6de591..556612a663 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextTracebackBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextTracebackBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -57,7 +57,7 @@ import com.oracle.graal.python.builtins.objects.traceback.MaterializeLazyTracebackNode; import com.oracle.graal.python.builtins.objects.traceback.PTraceback; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; @@ -73,8 +73,8 @@ abstract static class _PyTraceback_Add extends CApiTernaryBuiltinNode { static Object tbHere(TruffleString funcname, TruffleString filename, int lineno, @Cached PyCode_NewEmpty newCode, @Cached PyTraceBack_Here pyTraceBackHereNode, - @Cached PythonObjectFactory factory) { - PFrame frame = factory.createPFrame(null, newCode.execute(filename, funcname, lineno), factory.createDict(), factory.createDict()); + @Bind PythonLanguage language) { + PFrame frame = PFactory.createPFrame(language, null, newCode.execute(filename, funcname, lineno), PFactory.createDict(language), PFactory.createDict(language)); pyTraceBackHereNode.execute(frame); return PNone.NONE; } @@ -85,17 +85,16 @@ abstract static class PyTraceBack_Here extends CApiUnaryBuiltinNode { @Specialization static int tbHere(PFrame frame, @Bind("this") Node inliningTarget, - @Cached MaterializeLazyTracebackNode materializeLazyTracebackNode, - @Cached PythonObjectFactory factory) { - PythonLanguage language = PythonLanguage.get(inliningTarget); - PythonContext.PythonThreadState threadState = PythonContext.get(inliningTarget).getThreadState(language); + @Bind PythonContext context, + @Cached MaterializeLazyTracebackNode materializeLazyTracebackNode) { + PythonContext.PythonThreadState threadState = context.getThreadState(context.getLanguage(inliningTarget)); AbstractTruffleException currentException = threadState.getCurrentException(); if (currentException != null) { PTraceback currentTraceback = null; if (threadState.getCurrentTraceback() != null) { currentTraceback = materializeLazyTracebackNode.execute(inliningTarget, threadState.getCurrentTraceback()); } - PTraceback newTraceback = factory.createTraceback(frame, frame.getLine(), currentTraceback); + PTraceback newTraceback = PFactory.createTraceback(PythonLanguage.get(inliningTarget), frame, frame.getLine(), currentTraceback); threadState.setCurrentTraceback(new LazyTraceback(newTraceback)); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextTupleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextTupleBuiltins.java index b1ae9aa248..54e78caeaf 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextTupleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextTupleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,9 +45,11 @@ import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Ignored; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectBorrowed; +import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectPtr; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Py_ssize_t; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; @@ -58,18 +60,21 @@ import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; +import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.EnsureCapacityNode; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetItemNode; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetItemScalarNode; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ListGeneralizationNode; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.SetItemScalarNode; +import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.SetLenNode; import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.lib.PySliceNew; import com.oracle.graal.python.lib.PyTupleSizeNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.builtins.TupleNodes.GetNativeTupleStorage; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.NativeObjectSequenceStorage; +import com.oracle.graal.python.runtime.sequence.storage.NativeSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -86,12 +91,12 @@ abstract static class PyTuple_New extends CApiUnaryBuiltinNode { @Specialization static PTuple doGeneric(long longSize, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode, + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode, @Cached CStructAccess.AllocateNode alloc) { int size = (int) longSize; if (longSize != size) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.MemoryError); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.MemoryError); } /* * Already allocate the tuple with native memory, since it has to be populated from the @@ -99,7 +104,7 @@ static PTuple doGeneric(long longSize, */ Object mem = alloc.alloc((longSize + 1) * CStructAccess.POINTER_SIZE); NativeObjectSequenceStorage storage = NativeObjectSequenceStorage.create(mem, size, size, true); - return factory.createTuple(storage); + return PFactory.createTuple(language, storage); } } @@ -115,7 +120,7 @@ static Object doPTuple(PTuple tuple, long key, @Cached ListGeneralizationNode generalizationNode, @Shared @Cached SetItemScalarNode setItemNode, @Shared @Cached GetItemScalarNode getItemNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { SequenceStorage sequenceStorage = tuple.getSequenceStorage(); int index = checkIndex(inliningTarget, key, sequenceStorage, raiseNode); Object result = getItemNode.execute(inliningTarget, sequenceStorage, index); @@ -137,7 +142,7 @@ static Object doNative(PythonAbstractNativeObject tuple, long key, @Shared("promote") @Cached PromoteBorrowedValue promoteNode, @Shared @Cached SetItemScalarNode setItemNode, @Shared @Cached GetItemScalarNode getItemNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { SequenceStorage sequenceStorage = asNativeStorage.execute(tuple); int index = checkIndex(inliningTarget, key, sequenceStorage, raiseNode); Object result = getItemNode.execute(inliningTarget, sequenceStorage, index); @@ -157,10 +162,10 @@ Object fallback(Object tuple, @SuppressWarnings("unused") Object pos) { throw raiseFallback(tuple, PythonBuiltinClassType.PTuple); } - private static int checkIndex(Node inliningTarget, long key, SequenceStorage sequenceStorage, PRaiseNode.Lazy raiseNode) { + private static int checkIndex(Node inliningTarget, long key, SequenceStorage sequenceStorage, PRaiseNode raiseNode) { // we must do a bounds-check but we must not normalize the index if (key < 0 || key >= sequenceStorage.length()) { - throw raiseNode.get(inliningTarget).raise(IndexError, ErrorMessages.TUPLE_OUT_OF_BOUNDS); + throw raiseNode.raise(inliningTarget, IndexError, ErrorMessages.TUPLE_OUT_OF_BOUNDS); } return (int) key; } @@ -205,4 +210,23 @@ private static Object doGetSlice(SequenceStorage storage, Node inliningTarget, O return getItemNode.execute(null, storage, sliceNode.execute(inliningTarget, iLow, iHigh, PNone.NONE)); } } + + @CApiBuiltin(ret = PyObjectPtr, args = {PyObject, Py_ssize_t, PyObjectPtr}, call = Ignored) + abstract static class PyTruffleTuple_Resize extends CApiTernaryBuiltinNode { + @Specialization + public static Object size(PTuple tuple, long size, Object obItemsPtr, + @Bind("this") Node inliningTarget, + @Cached EnsureCapacityNode ensureCapacityNode, + @Cached SetLenNode setLenNode) { + SequenceStorage store = tuple.getSequenceStorage(); + int newLength = (int) Math.min(size, Integer.MAX_VALUE); + ensureCapacityNode.execute(inliningTarget, store, newLength); + setLenNode.execute(inliningTarget, store, newLength); + if (store instanceof NativeSequenceStorage nativeStore) { + return nativeStore.getPtr(); + } else { + return obItemsPtr; + } + } + } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextTypeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextTypeBuiltins.java index d9536cd332..962ed16f74 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextTypeBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextTypeBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,6 +42,7 @@ import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Direct; import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Ignored; +import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PYOBJECT_HASH_NOT_IMPLEMENTED; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.ConstCharPtrAsTruffleString; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Pointer; @@ -51,11 +52,12 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyTypeObject; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Py_ssize_t; import static com.oracle.graal.python.builtins.objects.cext.common.CExtContext.METH_CLASS; +import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_name; import static com.oracle.graal.python.nodes.HiddenAttr.METHOD_DEF_PTR; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DOC__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___HASH__; import static com.oracle.graal.python.util.PythonUtils.EMPTY_OBJECT_ARRAY; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApi7BuiltinNode; @@ -63,7 +65,6 @@ import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath; -import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiTernaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.PyObjectSetAttrNode; import com.oracle.graal.python.builtins.objects.PNone; @@ -78,7 +79,9 @@ import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.GetterRoot; import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.SetterRoot; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor; import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CArrayWrapper; +import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.EnsureExecutableNode; import com.oracle.graal.python.builtins.objects.cext.common.CExtContext; import com.oracle.graal.python.builtins.objects.cext.structs.CFields; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; @@ -87,12 +90,9 @@ import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; import com.oracle.graal.python.builtins.objects.getsetdescriptor.GetSetDescriptor; -import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyDictGetItem; @@ -101,14 +101,11 @@ import com.oracle.graal.python.nodes.HiddenAttr; import com.oracle.graal.python.nodes.SpecialAttributeNames; import com.oracle.graal.python.nodes.attributes.WriteAttributeToPythonObjectNode; -import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.object.GetDictIfExistsNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.MroSequenceStorage; -import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.Function; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; @@ -123,14 +120,12 @@ import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.RootNode; import com.oracle.truffle.api.object.DynamicObject; import com.oracle.truffle.api.object.DynamicObjectLibrary; import com.oracle.truffle.api.object.Shape; -import com.oracle.truffle.api.profiles.InlinedExactClassProfile; import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.utilities.CyclicAssumption; @@ -189,25 +184,15 @@ Object doGeneric(Object type, Object name, } } - @CApiBuiltin(ret = Int, args = {PyTypeObject, PyTypeObject}, call = Ignored, inlined = true) - @ImportStatic(PythonOptions.class) - abstract static class PyTruffleType_IsSubtype extends CApiBinaryBuiltinNode { - - @Specialization - static int doGeneric(Object a, Object b, - @Cached IsSubtypeNode isSubtypeNode) { - return PInt.intValue(isSubtypeNode.execute(a, b)); - } - } - @CApiBuiltin(ret = PyObjectTransfer, args = {PyTypeObject, ConstCharPtrAsTruffleString}, call = Ignored) abstract static class PyTruffle_Compute_Mro extends CApiBinaryBuiltinNode { @Specialization @TruffleBoundary - static Object doIt(PythonNativeClass self, TruffleString className) { - PythonAbstractClass[] doSlowPath = TypeNodes.ComputeMroNode.doSlowPath(self); - return PythonObjectFactory.getUncached().createTuple(new MroSequenceStorage(className, doSlowPath)); + static Object doIt(PythonNativeClass self, TruffleString className, + @Bind("this") Node inliningTarget) { + PythonAbstractClass[] doSlowPath = TypeNodes.ComputeMroNode.doSlowPath(inliningTarget, self); + return PFactory.createTuple(PythonLanguage.get(null), new MroSequenceStorage(className, doSlowPath)); } } @@ -225,81 +210,46 @@ abstract static class PyTruffle_NewTypeDict extends CApiUnaryBuiltinNode { static PDict doGeneric(PythonNativeClass nativeClass) { PythonLanguage language = PythonLanguage.get(null); NativeTypeDictStorage nativeTypeStore = new NativeTypeDictStorage(language.getEmptyShape()); - PDict dict = PythonObjectFactory.getUncached().createDict(new DynamicObjectStorage(nativeTypeStore)); + PDict dict = PFactory.createDict(language, new DynamicObjectStorage(nativeTypeStore)); HiddenAttr.WriteNode.executeUncached(dict, HiddenAttr.INSTANCESHAPE, language.getShapeForClass(nativeClass)); return dict; } } - @CApiBuiltin(ret = Int, args = {PyTypeObject, ConstCharPtrAsTruffleString, PyObject}, call = Ignored) - abstract static class PyTruffle_Type_Modified extends CApiTernaryBuiltinNode { - - @TruffleBoundary - @Specialization(guards = "isNoValue(mroTuple)") - int doIt(PythonNativeClass clazz, TruffleString name, @SuppressWarnings("unused") PNone mroTuple) { - CyclicAssumption nativeClassStableAssumption = getContext().getNativeClassStableAssumption(clazz, false); - if (nativeClassStableAssumption != null) { - nativeClassStableAssumption.invalidate("PyType_Modified(\"" + name.toJavaStringUncached() + "\") (without MRO) called"); - } - SpecialMethodSlot.reinitializeSpecialMethodSlots(PythonNativeClass.cast(clazz), getLanguage()); - // TODO: this is called from two places: at the end of PyType_Ready, and theoretically - // could be called from: - // - // void PyType_Modified(PyTypeObject* type) -> GraalPyTruffle_Type_Modified(type, - // type->tp_name, type->tp_mro); - // - // in unlikely (impossible?) case that type->tp_mro was NULL. Should we distinguish - // the two cases? As a cleanup if it is impossible situation (separate two different - // upcalls), or because at the end of PyType_Ready, we do not want to call - // TpSlots.updateAllSlots(clazz), but from PyType_Modified we do. - return 0; - } - + @CApiBuiltin(ret = ArgDescriptor.Void, args = {PyTypeObject}, call = Direct) + abstract static class PyType_Modified extends CApiUnaryBuiltinNode { @TruffleBoundary @Specialization - int doIt(PythonNativeClass clazz, TruffleString name, PTuple mroTuple, - @Bind("this") Node inliningTarget, - @Cached InlinedExactClassProfile profile) { - CyclicAssumption nativeClassStableAssumption = getContext().getNativeClassStableAssumption(clazz, false); - if (nativeClassStableAssumption != null) { - nativeClassStableAssumption.invalidate("PyType_Modified(\"" + name.toJavaStringUncached() + "\") called"); - } - SequenceStorage sequenceStorage = profile.profile(inliningTarget, mroTuple.getSequenceStorage()); - if (sequenceStorage instanceof MroSequenceStorage) { - ((MroSequenceStorage) sequenceStorage).lookupChanged(); + static Object doIt(PythonAbstractClass object, + @Bind("this") Node inliningTarget) { + if (object instanceof PythonAbstractNativeObject clazz) { + PythonContext context = PythonContext.get(inliningTarget); + CyclicAssumption nativeClassStableAssumption = context.getNativeClassStableAssumption(clazz, false); + if (nativeClassStableAssumption != null) { + nativeClassStableAssumption.invalidate("PyType_Modified(\"" + TypeNodes.GetNameNode.executeUncached(clazz).toJavaStringUncached() + "\") called"); + } + MroSequenceStorage mroStorage = TypeNodes.GetMroStorageNode.executeUncached(clazz); + mroStorage.lookupChanged(); + // Reload slots from native, which also invalidates cached slot lookups + clazz.setTpSlots(TpSlots.fromNative(clazz, context)); } else { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("invalid MRO object for native type \"" + name.toJavaStringUncached() + "\""); + MroSequenceStorage mroStorage = TypeNodes.GetMroStorageNode.executeUncached(object); + mroStorage.lookupChanged(); } - SpecialMethodSlot.reinitializeSpecialMethodSlots(PythonNativeClass.cast(clazz), getLanguage()); - TpSlots.updateAllSlots(clazz); - return 0; + return PNone.NO_VALUE; } } - @CApiBuiltin(ret = Int, args = {Pointer, Pointer}, call = Ignored) - abstract static class PyTruffle_Trace_Type extends CApiBinaryBuiltinNode { + @CApiBuiltin(ret = Int, args = {Pointer}, call = Ignored) + abstract static class PyTruffle_Trace_Type extends CApiUnaryBuiltinNode { private static final TruffleLogger LOGGER = CApiContext.getLogger(PyTruffle_Trace_Type.class); - @Specialization(limit = "3") - int trace(Object ptr, Object classNameObj, - @CachedLibrary("ptr") InteropLibrary ptrLib, - @CachedLibrary("classNameObj") InteropLibrary nameLib, - @Cached TruffleString.SwitchEncodingNode switchEncodingNode) { - final TruffleString className; - if (nameLib.isString(classNameObj)) { - try { - className = switchEncodingNode.execute(nameLib.asTruffleString(classNameObj), TS_ENCODING); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - } else { - className = null; - } - PythonContext context = getContext(); - Object primitivePtr = CApiContext.asPointer(ptr, ptrLib); - context.getCApiContext().traceStaticMemory(primitivePtr, null, className); - LOGGER.fine(() -> PythonUtils.formatJString("Initializing native type %s (ptr = %s)", className, CApiContext.asHex(primitivePtr))); + @Specialization + @TruffleBoundary + int trace(Object ptr) { + LOGGER.fine(() -> PythonUtils.formatJString("Initializing native type %s (ptr = %s)", + CStructAccess.ReadCharPtrNode.getUncached().read(ptr, PyTypeObject__tp_name), + CApiContext.asHex(CApiContext.asPointer(ptr, InteropLibrary.getUncached())))); return 0; } } @@ -313,7 +263,7 @@ abstract static class NewClassMethodNode extends Node { @Specialization(guards = "isClassOrStaticMethod(flags)") static Object classOrStatic(Node inliningTarget, Object methodDefPtr, TruffleString name, Object methObj, int flags, int wrapper, Object type, Object doc, - @Cached(inline = false) PythonObjectFactory factory, + @Bind PythonLanguage language, @Exclusive @Cached HiddenAttr.WriteNode writeHiddenAttrNode, @Cached(inline = false) WriteAttributeToPythonObjectNode writeAttrNode, @Exclusive @Cached CreateFunctionNode createFunctionNode) { @@ -321,9 +271,9 @@ static Object classOrStatic(Node inliningTarget, Object methodDefPtr, TruffleStr writeHiddenAttrNode.execute(inliningTarget, func, METHOD_DEF_PTR, methodDefPtr); PythonObject function; if ((flags & METH_CLASS) != 0) { - function = factory.createClassmethodFromCallableObj(func); + function = PFactory.createClassmethodFromCallableObj(language, func); } else { - function = factory.createStaticmethodFromCallableObj(func); + function = PFactory.createStaticmethodFromCallableObj(language, func); } writeAttrNode.execute(function, T___NAME__, name); writeAttrNode.execute(function, T___DOC__, doc); @@ -371,6 +321,12 @@ static int addSlot(Object clazz, PDict tpDict, TruffleString memberName, Object // slots declared on the PyTypeObject. However, one could maybe "steal" a manged slot // and stash it into a native type, so we play it safe a check both eventualities in // CreateFunctionNode + if (memberName.equalsUncached(T___HASH__, PythonUtils.TS_ENCODING)) { + if (CApiContext.isIdenticalToSymbol(cfunc, FUN_PYOBJECT_HASH_NOT_IMPLEMENTED)) { + PyDictSetDefault.executeUncached(tpDict, T___HASH__, PNone.NONE); + return 0; + } + } if (HashingStorageGetItem.hasKeyUncached(tpDict.getDictStorage(), memberName)) { // Following typeobject.c:add_operators we skip a slot if we already create a // function for it from another slot that was earlier or if the dict already @@ -402,7 +358,7 @@ public static int addMember(Object clazz, PDict tpDict, TruffleString memberName } // create member descriptor - GetSetDescriptor memberDescriptor = PythonObjectFactory.getUncached().createMemberDescriptor(getterObject, setterObject, memberName, clazz); + GetSetDescriptor memberDescriptor = PFactory.createMemberDescriptor(language, getterObject, setterObject, memberName, clazz); WriteAttributeToPythonObjectNode.getUncached().execute(memberDescriptor, SpecialAttributeNames.T___DOC__, memberDoc); // add member descriptor to tp_dict @@ -420,27 +376,27 @@ abstract static class CreateGetSetNode extends Node { @Specialization @TruffleBoundary static GetSetDescriptor createGetSet(Node inliningTarget, TruffleString name, Object cls, Object getter, Object setter, Object doc, Object closure, - @Cached(inline = false) PythonObjectFactory factory, @CachedLibrary(limit = "2") InteropLibrary interopLibrary) { assert !(doc instanceof CArrayWrapper); // note: 'doc' may be NULL; in this case, we would store 'None' PBuiltinFunction get = null; + PythonLanguage language = PythonLanguage.get(inliningTarget); if (!interopLibrary.isNull(getter)) { - RootCallTarget getterCT = getterCallTarget(name, PythonLanguage.get(inliningTarget)); - getter = CExtContext.ensureExecutable(getter, PExternalFunctionWrapper.GETTER); - get = factory.createBuiltinFunction(name, cls, EMPTY_OBJECT_ARRAY, ExternalFunctionNodes.createKwDefaults(getter, closure), 0, getterCT); + RootCallTarget getterCT = getterCallTarget(name, language); + getter = EnsureExecutableNode.executeUncached(getter, PExternalFunctionWrapper.GETTER); + get = PFactory.createBuiltinFunction(language, name, cls, EMPTY_OBJECT_ARRAY, ExternalFunctionNodes.createKwDefaults(getter, closure), 0, getterCT); } PBuiltinFunction set = null; boolean hasSetter = !interopLibrary.isNull(setter); if (hasSetter) { - RootCallTarget setterCT = setterCallTarget(name, PythonLanguage.get(inliningTarget)); - setter = CExtContext.ensureExecutable(setter, PExternalFunctionWrapper.SETTER); - set = factory.createBuiltinFunction(name, cls, EMPTY_OBJECT_ARRAY, ExternalFunctionNodes.createKwDefaults(setter, closure), 0, setterCT); + RootCallTarget setterCT = setterCallTarget(name, language); + setter = EnsureExecutableNode.executeUncached(setter, PExternalFunctionWrapper.SETTER); + set = PFactory.createBuiltinFunction(language, name, cls, EMPTY_OBJECT_ARRAY, ExternalFunctionNodes.createKwDefaults(setter, closure), 0, setterCT); } // create get-set descriptor - GetSetDescriptor descriptor = factory.createGetSetDescriptor(get, set, name, cls, hasSetter); + GetSetDescriptor descriptor = PFactory.createGetSetDescriptor(language, get, set, name, cls, hasSetter); WriteAttributeToPythonObjectNode.executeUncached(descriptor, T___DOC__, doc); return descriptor; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextUnicodeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextUnicodeBuiltins.java index bb47fb61b3..d6667c0762 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextUnicodeBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextUnicodeBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -84,11 +84,12 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.StrNode; import com.oracle.graal.python.builtins.modules.BuiltinFunctions.ChrNode; import com.oracle.graal.python.builtins.modules.CodecsModuleBuiltins; import com.oracle.graal.python.builtins.modules.CodecsModuleBuiltins.CodecsEncodeNode; +import com.oracle.graal.python.builtins.modules.CodecsTruffleModuleBuiltins; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApi5BuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApi6BuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; @@ -102,6 +103,7 @@ import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; +import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.UnicodeFromFormatNode; import com.oracle.graal.python.builtins.objects.cext.capi.PySequenceArrayWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.UnicodeObjectNodes.UnicodeAsWideCharNode; @@ -121,9 +123,7 @@ import com.oracle.graal.python.builtins.objects.str.StringBuiltins; import com.oracle.graal.python.builtins.objects.str.StringBuiltins.EncodeNode; import com.oracle.graal.python.builtins.objects.str.StringBuiltins.EndsWithNode; -import com.oracle.graal.python.builtins.objects.str.StringBuiltins.EqNode; import com.oracle.graal.python.builtins.objects.str.StringBuiltins.FindNode; -import com.oracle.graal.python.builtins.objects.str.StringBuiltins.LtNode; import com.oracle.graal.python.builtins.objects.str.StringBuiltins.ModNode; import com.oracle.graal.python.builtins.objects.str.StringBuiltins.RFindNode; import com.oracle.graal.python.builtins.objects.str.StringBuiltins.ReplaceNode; @@ -135,6 +135,7 @@ import com.oracle.graal.python.lib.PyTupleGetItem; import com.oracle.graal.python.lib.PyUnicodeCheckExactNode; import com.oracle.graal.python.lib.PyUnicodeFromEncodedObject; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; @@ -142,13 +143,11 @@ import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; -import com.oracle.graal.python.nodes.truffle.PythonTypes; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.OverflowException; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -158,7 +157,6 @@ import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.interop.InteropException; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.library.CachedLibrary; @@ -216,7 +214,7 @@ static PString fromObject(PString s, @Specialization(guards = {"!isPStringType(inliningTarget, obj, getClassNode)", "isStringSubtype(inliningTarget, obj, getClassNode, isSubtypeNode)"}) static Object fromObject(Object obj, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @Cached StrNode strNode, + @Cached StringBuiltins.StrNewNode strNode, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode) { return strNode.executeWith(obj); @@ -224,11 +222,10 @@ static Object fromObject(Object obj, @Specialization(guards = {"!isStringSubtype(inliningTarget, obj, getClassNode, isSubtypeNode)"}) static Object fromObject(Object obj, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANT_CONVERT_TO_STR_IMPLICITLY, obj); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CANT_CONVERT_TO_STR_IMPLICITLY, obj); } protected boolean isPStringType(Node inliningTarget, Object obj, GetClassNode getClassNode) { @@ -252,20 +249,18 @@ static Object concat(Object left, Object right, @Specialization(guards = {"!isString(left)", "!isStringSubtype(inliningTarget, left, getClassNode, isSubtypeNode)"}) static Object leftNotString(Object left, @SuppressWarnings("unused") Object right, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.MUST_BE_STR_NOT_P, left); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.MUST_BE_STR_NOT_P, left); } @Specialization(guards = {"!isString(right)", "!isStringSubtype(inliningTarget, right, getClassNode, isSubtypeNode)"}) static Object rightNotString(@SuppressWarnings("unused") Object left, Object right, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.MUST_BE_STR_NOT_P, right); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.MUST_BE_STR_NOT_P, right); } } @@ -298,7 +293,7 @@ static Object doGeneric(Object obj, Object encodingObj, Object errorsObj, errors = (TruffleString) errorsObjProfiled; } if (nullProfile.profile(inliningTarget, obj == PNone.NO_VALUE)) { - throw PRaiseNode.raiseUncached(inliningTarget, SystemError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC); + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC); } return decodeNode.execute(null, inliningTarget, obj, encoding, errors); } @@ -315,8 +310,7 @@ static Object withPString(PString str, @Cached StringNodes.IsInternedStringNode isInternedStringNode, @Cached StringNodes.InternStringNode internNode, @Cached HashingStorageGetItem getItem, - @Cached HashingStorageSetItem setItem, - @Cached PythonObjectFactory.Lazy factory) { + @Cached HashingStorageSetItem setItem) { if (!unicodeCheckExactNode.execute(inliningTarget, str)) { return getNativeNull(inliningTarget); } @@ -329,10 +323,11 @@ static Object withPString(PString str, return str; } TruffleString ts = cast.execute(inliningTarget, str); - PDict dict = getCApiContext(inliningTarget).getInternedUnicode(); + CApiContext cApiContext = getCApiContext(inliningTarget); + PDict dict = cApiContext.getInternedUnicode(); if (dict == null) { - dict = factory.get(inliningTarget).createDict(); - getCApiContext(inliningTarget).setInternedUnicode(dict); + dict = PFactory.createDict(cApiContext.getContext().getLanguage(internNode)); + cApiContext.setInternedUnicode(dict); } Object interned = getItem.execute(inliningTarget, dict.getDictStorage(), ts); if (interned == null) { @@ -361,7 +356,7 @@ static Object find(Object format, Object args, @Cached ModNode modNode, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { checkNonNullArg(inliningTarget, format, args, raiseNode); return modNode.execute(null, format, args); } @@ -371,18 +366,17 @@ static Object find(Object format, @SuppressWarnings("unused") Object args, @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { checkNonNullArg(inliningTarget, format, args, raiseNode); - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MUST_BE_STR_NOT_P, format); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MUST_BE_STR_NOT_P, format); } } @CApiBuiltin(ret = Py_ssize_t, args = {PyObject, PY_UCS4, Py_ssize_t, Py_ssize_t, Int}, call = Direct) - @TypeSystemReference(PythonTypes.class) @ImportStatic(PythonCextUnicodeBuiltins.class) abstract static class PyUnicode_FindChar extends CApi5BuiltinNode { @Specialization(guards = {"isString(string) || isStringSubtype(inliningTarget, string, getClassNode, isSubtypeNode)", "direction > 0"}) - static Object find(Object string, Object c, long start, long end, @SuppressWarnings("unused") long direction, + static Object find(Object string, Object c, long start, long end, @SuppressWarnings("unused") int direction, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @Shared @Cached ChrNode chrNode, @Cached FindNode findNode, @@ -392,7 +386,7 @@ static Object find(Object string, Object c, long start, long end, @SuppressWarni } @Specialization(guards = {"isString(string) || isStringSubtype(inliningTarget, string, getClassNode, isSubtypeNode)", "direction <= 0"}) - static Object find(Object string, Object c, long start, long end, @SuppressWarnings("unused") long direction, + static Object find(Object string, Object c, long start, long end, @SuppressWarnings("unused") int direction, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @Shared @Cached ChrNode chrNode, @Cached RFindNode rFindNode, @@ -404,16 +398,14 @@ static Object find(Object string, Object c, long start, long end, @SuppressWarni @Specialization(guards = {"!isTruffleString(string)", "!isStringSubtype(inliningTarget, string, getClassNode, isSubtypeNode)"}) static Object find(Object string, @SuppressWarnings("unused") Object c, @SuppressWarnings("unused") Object start, @SuppressWarnings("unused") Object end, @SuppressWarnings("unused") Object direction, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.MUST_BE_STR_NOT_P, string); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.MUST_BE_STR_NOT_P, string); } } @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, Py_ssize_t, Py_ssize_t}, call = Direct) - @TypeSystemReference(PythonTypes.class) @ImportStatic(PythonCextUnicodeBuiltins.class) abstract static class PyUnicode_Substring extends CApiTernaryBuiltinNode { @Specialization(guards = {"isString(s) || isStringSubtype(s, inliningTarget, getClassNode, isSubtypeNode)"}, limit = "1") @@ -426,7 +418,7 @@ static Object doString(Object s, long start, long end, @SuppressWarnings("unused") @Exclusive @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode) { if (profile.profile(inliningTarget, start < 0 || end < 0)) { - throw PRaiseNode.raiseUncached(inliningTarget, PythonBuiltinClassType.IndexError, ErrorMessages.STRING_INDEX_OUT_OF_RANGE); + throw PRaiseNode.raiseStatic(inliningTarget, IndexError, ErrorMessages.STRING_INDEX_OUT_OF_RANGE); } Object getItemCallable = lookupAttrNode.execute(null, inliningTarget, s, T___GETITEM__); return callNode.executeWithoutFrame(getItemCallable, sliceNode.execute(inliningTarget, start, end, PNone.NONE)); @@ -434,11 +426,10 @@ static Object doString(Object s, long start, long end, @Specialization(guards = {"!isTruffleString(s)", "isStringSubtype(s, inliningTarget, getClassNode, isSubtypeNode)"}, limit = "1") static Object doError(Object s, @SuppressWarnings("unused") Object start, @SuppressWarnings("unused") Object end, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Exclusive @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.MUST_BE_STR_NOT_P, s); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.MUST_BE_STR_NOT_P, s); } protected static boolean isStringSubtype(Object obj, Node n, GetClassNode getClassNode, IsSubtypeNode isSubtypeNode) { @@ -460,11 +451,10 @@ static Object find(Object separator, Object seq, @Specialization(guards = {"!isTruffleString(separator)", "isStringSubtype(inliningTarget, separator, getClassNode, isSubtypeNode)"}) static Object find(Object separator, @SuppressWarnings("unused") Object seq, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.MUST_BE_STR_NOT_P, separator); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.MUST_BE_STR_NOT_P, separator); } } @@ -477,18 +467,17 @@ static Object compare(Object left, Object right, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Cached EqNode eqNode, + @Cached StringBuiltins.StringRichCmpNode eqNode, @Cached PyObjectIsTrueNode isTrue) { - return PInt.intValue(isTrue.execute(null, inliningTarget, eqNode.execute(null, left, right))); + return PInt.intValue(isTrue.execute(null, eqNode.execute(null, left, right, RichCmpOp.Py_EQ))); } @Specialization(guards = {"!isAnyString(inliningTarget, left, getClassNode, isSubtypeNode) || !isAnyString(inliningTarget, right, getClassNode, isSubtypeNode)"}) static Object compare(Object left, Object right, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANT_COMPARE, left, right); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CANT_COMPARE, left, right); } } @@ -511,32 +500,30 @@ static Object compare(Object left, Object right, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Cached EqNode eqNode, - @Cached LtNode ltNode, + @Cached StringBuiltins.StringRichCmpNode eqNode, + @Cached StringBuiltins.StringRichCmpNode ltNode, @Cached InlinedConditionProfile eqProfile) { - if (eqProfile.profile(inliningTarget, (boolean) eqNode.execute(null, left, right))) { + if (eqProfile.profile(inliningTarget, (boolean) eqNode.execute(null, left, right, RichCmpOp.Py_EQ))) { return 0; } else { - return (boolean) ltNode.execute(null, left, right) ? -1 : 1; + return (boolean) ltNode.execute(null, left, right, RichCmpOp.Py_LT) ? -1 : 1; } } @Specialization(guards = {"!isAnyString(inliningTarget, left, getClassNode, isSubtypeNode) || !isAnyString(inliningTarget, right, getClassNode, isSubtypeNode)"}) static Object compare(Object left, Object right, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANT_COMPARE, left, right); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CANT_COMPARE, left, right); } } @CApiBuiltin(ret = Py_ssize_t, args = {PyObject, PyObject, Py_ssize_t, Py_ssize_t, Int}, call = Direct) - @TypeSystemReference(PythonTypes.class) @ImportStatic(PythonCextUnicodeBuiltins.class) abstract static class PyUnicode_Tailmatch extends CApi5BuiltinNode { @Specialization(guards = {"isAnyString(inliningTarget, string, getClassNode, isSubtypeNode)", "isAnyString(inliningTarget, substring, getClassNode, isSubtypeNode)", "direction > 0"}) - static int tailmatch(Object string, Object substring, long start, long end, @SuppressWarnings("unused") long direction, + static int tailmatch(Object string, Object substring, long start, long end, @SuppressWarnings("unused") int direction, @Bind("this") Node inliningTarget, @Shared @Cached PyObjectLookupAttr lookupAttrNode, @Shared @Cached PySliceNew sliceNode, @@ -550,7 +537,7 @@ static int tailmatch(Object string, Object substring, long start, long end, @Sup } @Specialization(guards = {"isAnyString(inliningTarget, string, getClassNode, isSubtypeNode)", "isAnyString(inliningTarget, substring, getClassNode, isSubtypeNode)", "direction <= 0"}) - static int tailmatch(Object string, Object substring, long start, long end, @SuppressWarnings("unused") long direction, + static int tailmatch(Object string, Object substring, long start, long end, @SuppressWarnings("unused") int direction, @Bind("this") Node inliningTarget, @Shared @Cached PyObjectLookupAttr lookupAttrNode, @Shared @Cached PySliceNew sliceNode, @@ -566,11 +553,10 @@ static int tailmatch(Object string, Object substring, long start, long end, @Sup @SuppressWarnings("unused") @Specialization(guards = {"!isAnyString(inliningTarget, string, getClassNode, isSubtypeNode) || !isAnyString(inliningTarget, substring, getClassNode, isSubtypeNode)"}) static Object find(Object string, Object substring, Object start, Object end, Object direction, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @Shared @Cached GetClassNode getClassNode, @Shared @Cached IsSubtypeNode isSubtypeNode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.MUST_BE_STR_NOT_P, string); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.MUST_BE_STR_NOT_P, string); } } @@ -588,16 +574,14 @@ static Object encode(Object obj, Object encoding, Object errors, @Specialization(guards = {"!isString(obj)", "!isStringSubtype(inliningTarget, obj, getClassNode, isSubtypeNode)"}) static Object encode(@SuppressWarnings("unused") Object obj, @SuppressWarnings("unused") Object encoding, @SuppressWarnings("unused") Object errors, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, BAD_ARG_TYPE_FOR_BUILTIN_OP); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, BAD_ARG_TYPE_FOR_BUILTIN_OP); } } @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, PyObject, PyObject, Py_ssize_t}, call = Direct) - @TypeSystemReference(PythonTypes.class) @ImportStatic(PythonCextUnicodeBuiltins.class) abstract static class PyUnicode_Replace extends CApiQuaternaryBuiltinNode { @Specialization(guards = {"isString(s)", "isString(substr)", "isString(replstr)"}) @@ -654,11 +638,10 @@ static Object escape(Object s, @Specialization(guards = {"!isString(obj)", "!isStringSubtype(inliningTarget, obj, getClassNode, isSubtypeNode)"}) static Object escape(@SuppressWarnings("unused") Object obj, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, BAD_ARG_TYPE_FOR_BUILTIN_OP); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, BAD_ARG_TYPE_FOR_BUILTIN_OP); } } @@ -670,19 +653,19 @@ static int doGeneric(Object type, long lindex, @Cached CastToTruffleStringNode castToStringNode, @Cached TruffleString.CodePointLengthNode lengthNode, @Cached TruffleString.CodePointAtIndexNode codepointAtIndexNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { TruffleString s = castToStringNode.execute(inliningTarget, type); int index = PInt.intValueExact(lindex); // avoid StringIndexOutOfBoundsException if (index < 0 || index >= lengthNode.execute(s, TS_ENCODING)) { - throw raiseNode.get(inliningTarget).raise(IndexError, ErrorMessages.STRING_INDEX_OUT_OF_RANGE); + throw raiseNode.raise(inliningTarget, IndexError, ErrorMessages.STRING_INDEX_OUT_OF_RANGE); } return codepointAtIndexNode.execute(s, index, TS_ENCODING); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(IndexError, ErrorMessages.STRING_INDEX_OUT_OF_RANGE); + throw raiseNode.raise(inliningTarget, IndexError, ErrorMessages.STRING_INDEX_OUT_OF_RANGE); } } } @@ -691,35 +674,30 @@ static int doGeneric(Object type, long lindex, abstract static class PyTruffleUnicode_New extends CApiQuaternaryBuiltinNode { @Specialization static Object doGeneric(Object ptr, long elements, long elementSize, int isAscii, - @Cached PythonObjectFactory factory) { - return factory.createString(new NativeCharSequence(ptr, (int) elements, (int) elementSize, isAscii != 0)); + @Bind PythonLanguage language) { + return PFactory.createString(language, new NativeCharSequence(ptr, (int) elements, (int) elementSize, isAscii != 0)); } } @CApiBuiltin(ret = PyObjectTransfer, args = {Pointer, Py_ssize_t, Int}, call = Ignored) abstract static class PyTruffleUnicode_FromUCS extends CApiTernaryBuiltinNode { - private static Encoding encodingFromKind(Node inliningTarget, int kind, PRaiseNode.Lazy raiseNode) throws PException { + private static Encoding encodingFromKind(Node inliningTarget, int kind, PRaiseNode raiseNode) throws PException { return switch (kind) { case 1 -> ISO_8859_1; case 2 -> UTF_16; case 4 -> TS_ENCODING; - default -> throw raiseNode.get(inliningTarget).raiseBadInternalCall(); + default -> throw raiseNode.raiseBadInternalCall(inliningTarget); }; } - private static PString asPString(TruffleString ts, SwitchEncodingNode switchEncodingNode, PythonObjectFactory factory) { - return factory.createString(switchEncodingNode.execute(ts, TS_ENCODING)); - } - @Specialization(guards = "ptrLib.isPointer(ptr)") static Object doNative(Object ptr, long byteLength, int kind, @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared("ptrLib") @CachedLibrary(limit = "1") InteropLibrary ptrLib, @Cached FromNativePointerNode fromNativePointerNode, @Shared("switchEncodingNode") @Cached SwitchEncodingNode switchEncodingNode, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { try { int iByteLength = PInt.intValueExact(byteLength); Encoding srcEncoding = encodingFromKind(inliningTarget, kind, raiseNode); @@ -729,9 +707,9 @@ static Object doNative(Object ptr, long byteLength, int kind, * For now, we use ISO-8859-1 and UTF-16 but that's not entirely correct. */ TruffleString ts = fromNativePointerNode.execute(ptr, 0, iByteLength, srcEncoding, true); - return asPString(ts, switchEncodingNode, factory); + return PFactory.createString(PythonLanguage.get(inliningTarget), switchEncodingNode.execute(ts, TS_ENCODING)); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } } @@ -742,21 +720,20 @@ static Object doManaged(Object ptr, long byteLength, int kind, @Cached GetByteArrayNode getByteArrayNode, @Cached FromByteArrayNode fromByteArrayNode, @Shared("switchEncodingNode") @Cached SwitchEncodingNode switchEncodingNode, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { try { Encoding srcEncoding = encodingFromKind(inliningTarget, kind, raiseNode); byte[] ucsBytes = getByteArrayNode.execute(inliningTarget, ptr, byteLength); TruffleString ts = fromByteArrayNode.execute(ucsBytes, srcEncoding); - return asPString(ts, switchEncodingNode, factory); + return PFactory.createString(PythonLanguage.get(inliningTarget), switchEncodingNode.execute(ts, TS_ENCODING)); } catch (InteropException e) { /* * This means that we cannot read the array-like foreign object or the foreign * elements cannot be interpreted as bytes. In any case, that's a fatal error. */ - throw raiseNode.get(inliningTarget).raise(SystemError, ErrorMessages.M, e); + throw raiseNode.raise(inliningTarget, SystemError, ErrorMessages.M, e); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } } } @@ -764,34 +741,29 @@ static Object doManaged(Object ptr, long byteLength, int kind, @CApiBuiltin(ret = PyObjectTransfer, args = {Pointer, Py_ssize_t, Int}, call = Ignored) abstract static class PyTruffleUnicode_FromUTF extends CApiTernaryBuiltinNode { - private static Encoding encodingFromKind(Node inliningTarget, int kind, PRaiseNode.Lazy raiseNode) throws PException { + private static Encoding encodingFromKind(Node inliningTarget, int kind, PRaiseNode raiseNode) throws PException { return switch (kind) { case 1 -> UTF_8; case 2 -> UTF_16LE; case 4 -> UTF_32LE; - default -> throw raiseNode.get(inliningTarget).raiseBadInternalCall(); + default -> throw raiseNode.raiseBadInternalCall(inliningTarget); }; } - private static PString asPString(TruffleString ts, SwitchEncodingNode switchEncodingNode, PythonObjectFactory factory) { - return factory.createString(switchEncodingNode.execute(ts, TS_ENCODING)); - } - @Specialization(guards = "ptrLib.isPointer(ptr)") static Object doNative(Object ptr, long byteLength, int kind, @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared("ptrLib") @CachedLibrary(limit = "1") InteropLibrary ptrLib, @Cached FromNativePointerNode fromNativePointerNode, @Shared("switchEncodingNode") @Cached SwitchEncodingNode switchEncodingNode, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { try { int iByteLength = PInt.intValueExact(byteLength); Encoding srcEncoding = encodingFromKind(inliningTarget, kind, raiseNode); TruffleString ts = fromNativePointerNode.execute(ptr, 0, iByteLength, srcEncoding, true); - return asPString(ts, switchEncodingNode, factory); + return PFactory.createString(PythonLanguage.get(inliningTarget), switchEncodingNode.execute(ts, TS_ENCODING)); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } } @@ -802,21 +774,20 @@ static Object doManaged(Object ptr, long byteLength, int kind, @Cached GetByteArrayNode getByteArrayNode, @Cached FromByteArrayNode fromByteArrayNode, @Shared("switchEncodingNode") @Cached SwitchEncodingNode switchEncodingNode, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { try { Encoding srcEncoding = encodingFromKind(inliningTarget, kind, raiseNode); byte[] ucsBytes = getByteArrayNode.execute(inliningTarget, ptr, byteLength); TruffleString ts = fromByteArrayNode.execute(ucsBytes, srcEncoding); - return asPString(ts, switchEncodingNode, factory); + return PFactory.createString(PythonLanguage.get(inliningTarget), switchEncodingNode.execute(ts, TS_ENCODING)); } catch (InteropException e) { /* * This means that we cannot read the array-like foreign object or the foreign * elements cannot be interpreted as bytes. In any case, that's a fatal error. */ - throw raiseNode.get(inliningTarget).raise(SystemError, ErrorMessages.M, e); + throw raiseNode.raise(inliningTarget, SystemError, ErrorMessages.M, e); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } } } @@ -825,8 +796,8 @@ static Object doManaged(Object ptr, long byteLength, int kind, abstract static class PyUnicode_FromString extends CApiUnaryBuiltinNode { @Specialization static PString run(TruffleString str, - @Cached PythonObjectFactory factory) { - return factory.createString(str); + @Bind PythonLanguage language) { + return PFactory.createString(language, str); } @Specialization @@ -858,17 +829,17 @@ abstract static class PyTruffleUnicode_DecodeUTF8Stateful extends CApiQuaternary @Specialization static Object doUtf8Decode(Object cByteArray, long size, TruffleString errors, int reportConsumed, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached GetByteArrayNode getByteArrayNode, @Cached CodecsModuleBuiltins.CodecsDecodeNode decode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { - PBytes bytes = factory.createBytes(getByteArrayNode.execute(inliningTarget, cByteArray, size)); + PBytes bytes = PFactory.createBytes(language, getByteArrayNode.execute(inliningTarget, cByteArray, size)); return decode.call(null, bytes, T_UTF8, errors, reportConsumed == 0); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.SystemError, ErrorMessages.INPUT_TOO_LONG); + throw raiseNode.raise(inliningTarget, PythonErrorType.SystemError, ErrorMessages.INPUT_TOO_LONG); } catch (InteropException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.M, e); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.M, e); } } } @@ -879,12 +850,12 @@ abstract static class PyTruffleUnicode_DecodeUTF16Stateful extends CApi5BuiltinN @Specialization static Object decode(Object cByteArray, long size, TruffleString errors, int byteorder, int reportConsumed, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached GetByteArrayNode getByteArrayNode, @Cached CodecsModuleBuiltins.CodecsDecodeNode decode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { - PBytes bytes = factory.createBytes(getByteArrayNode.execute(inliningTarget, cByteArray, size)); + PBytes bytes = PFactory.createBytes(language, getByteArrayNode.execute(inliningTarget, cByteArray, size)); TruffleString encoding; if (byteorder == 0) { encoding = T_UTF_16; @@ -895,9 +866,9 @@ static Object decode(Object cByteArray, long size, TruffleString errors, int byt } return decode.call(null, bytes, encoding, errors, reportConsumed == 0); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.SystemError, ErrorMessages.INPUT_TOO_LONG); + throw raiseNode.raise(inliningTarget, PythonErrorType.SystemError, ErrorMessages.INPUT_TOO_LONG); } catch (InteropException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.M, e); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.M, e); } } } @@ -908,12 +879,12 @@ abstract static class PyTruffleUnicode_DecodeUTF32Stateful extends CApi5BuiltinN @Specialization static Object decode(Object cByteArray, long size, TruffleString errors, int byteorder, int reportConsumed, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached GetByteArrayNode getByteArrayNode, @Cached CodecsModuleBuiltins.CodecsDecodeNode decode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { - PBytes bytes = factory.createBytes(getByteArrayNode.execute(inliningTarget, cByteArray, size)); + PBytes bytes = PFactory.createBytes(language, getByteArrayNode.execute(inliningTarget, cByteArray, size)); TruffleString encoding; if (byteorder == 0) { encoding = T_UTF_32; @@ -924,9 +895,9 @@ static Object decode(Object cByteArray, long size, TruffleString errors, int byt } return decode.call(null, bytes, encoding, errors, reportConsumed == 0); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.SystemError, ErrorMessages.INPUT_TOO_LONG); + throw raiseNode.raise(inliningTarget, PythonErrorType.SystemError, ErrorMessages.INPUT_TOO_LONG); } catch (InteropException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.M, e); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.M, e); } } } @@ -947,10 +918,21 @@ abstract static class PyUnicode_EncodeFSDefault extends CApiUnaryBuiltinNode { static PBytes fromObject(Object s, @Bind("this") Node inliningTarget, @Cached CastToTruffleStringNode castStr, - @Cached EncodeNativeStringNode encode, - @Cached PythonObjectFactory factory) { + @Cached EncodeNativeStringNode encode) { byte[] array = encode.execute(StandardCharsets.UTF_8, castStr.execute(inliningTarget, s), T_REPLACE); - return factory.createBytes(array); + return PFactory.createBytes(PythonLanguage.get(inliningTarget), array); + } + } + + @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, ConstCharPtrAsTruffleString}, call = Direct) + abstract static class PyUnicode_EncodeLocale extends CApiBinaryBuiltinNode { + @Specialization + static Object encode(Object s, Object errors, + @Bind("this") Node inliningTarget, + @Cached CastToTruffleStringNode cast, + @Cached CodecsTruffleModuleBuiltins.GetEncodingNode getEncodingNode, + @Cached CodecsModuleBuiltins.EncodeNode encodeNode) { + return encodeNode.execute(null, cast.execute(inliningTarget, s), getEncodingNode.execute(null), errors); } } @@ -960,10 +942,9 @@ abstract static class PyUnicode_FromWideChar extends CApiBinaryBuiltinNode { Object doInt(Object arr, long size, @Bind("this") Node inliningTarget, @Cached ReadUnicodeArrayNode readArray, - @Cached TruffleString.FromIntArrayUTF32Node fromArray, - @Cached PythonObjectFactory factory) { + @Cached TruffleString.FromIntArrayUTF32Node fromArray) { assert TS_ENCODING == Encoding.UTF_32 : "needs switch_encoding otherwise"; - return factory.createString(fromArray.execute(readArray.execute(inliningTarget, arr, castToInt(size), CStructs.wchar_t.size()))); + return PFactory.createString(PythonLanguage.get(inliningTarget), fromArray.execute(readArray.execute(inliningTarget, arr, castToInt(size), CStructs.wchar_t.size()))); } } @@ -976,22 +957,20 @@ protected NativeEncoderNode(Charset charset) { @Specialization(guards = "isNoValue(errors)") Object doUnicode(Object s, @SuppressWarnings("unused") PNone errors, - @Shared("encodeNode") @Cached EncodeNativeStringNode encodeNativeStringNode, - @Shared @Cached PythonObjectFactory factory) { - return doUnicode(s, T_STRICT, encodeNativeStringNode, factory); + @Shared("encodeNode") @Cached EncodeNativeStringNode encodeNativeStringNode) { + return doUnicode(s, T_STRICT, encodeNativeStringNode); } @Specialization Object doUnicode(Object s, TruffleString errors, - @Shared("encodeNode") @Cached EncodeNativeStringNode encodeNativeStringNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createBytes(encodeNativeStringNode.execute(charset, s, errors)); + @Shared("encodeNode") @Cached EncodeNativeStringNode encodeNativeStringNode) { + return PFactory.createBytes(PythonLanguage.get(this), encodeNativeStringNode.execute(charset, s, errors)); } @Fallback static Object doUnicode(@SuppressWarnings("unused") Object s, @SuppressWarnings("unused") Object errors, - @Cached PRaiseNode raiseNode) { - return raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.TypeError, ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP); } } @@ -1046,8 +1025,8 @@ static Object doUnicode(PString s, Object sizePtr, @Fallback @SuppressWarnings("unused") static Object doError(Object s, Object sizePtr, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, BAD_ARG_TYPE_FOR_BUILTIN_OP); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, BAD_ARG_TYPE_FOR_BUILTIN_OP); } } @@ -1097,8 +1076,8 @@ static Object doUnicode(PString s, Object sizePtr, @Fallback @SuppressWarnings("unused") static Object doError(Object s, Object sizePtr, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, BAD_ARG_TYPE_FOR_BUILTIN_OP); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, BAD_ARG_TYPE_FOR_BUILTIN_OP); } } @@ -1127,24 +1106,23 @@ static Object doNative(PythonAbstractNativeObject s, } @CApiBuiltin(ret = PyObjectTransfer, args = {PyObject, Int}, call = Ignored) - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class PyTruffle_Unicode_AsWideChar extends CApiBinaryBuiltinNode { @Specialization - static Object doUnicode(Object s, long elementSize, + static Object doUnicode(Object s, int elementSize, @Bind("this") Node inliningTarget, @Cached UnicodeAsWideCharNode asWideCharNode, @Cached CastToTruffleStringNode castStr, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { PBytes wchars = asWideCharNode.executeLittleEndian(inliningTarget, castStr.execute(inliningTarget, s), elementSize); if (wchars != null) { return wchars; } else { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.ValueError, ErrorMessages.UNSUPPORTED_SIZE_WAS, "wchar", elementSize); + throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ErrorMessages.UNSUPPORTED_SIZE_WAS, "wchar", elementSize); } } catch (IllegalArgumentException e) { // TODO - throw raiseNode.get(inliningTarget).raise(PythonErrorType.LookupError, ErrorMessages.M, e); + throw raiseNode.raise(inliningTarget, PythonErrorType.LookupError, ErrorMessages.M, e); } } } @@ -1177,19 +1155,18 @@ static Object doNull(@SuppressWarnings("unused") PNone noValue) { @CApiBuiltin(ret = PyObjectTransfer, args = {ConstCharPtrAsTruffleString, ConstCharPtr, Py_ssize_t, Py_ssize_t, Py_ssize_t, ConstCharPtrAsTruffleString}, call = Direct) abstract static class PyUnicodeDecodeError_Create extends CApi6BuiltinNode { @Specialization - static Object doit(Object encoding, Object object, int length, int start, int end, Object reason, + static Object doit(Object encoding, Object object, long length, long start, long end, Object reason, @Bind("this") Node inliningTarget, @Cached GetByteArrayNode getByteArrayNode, @Cached CallNode callNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { PBytes bytes; try { - bytes = factory.createBytes(getByteArrayNode.execute(inliningTarget, object, length)); + bytes = PFactory.createBytes(PythonLanguage.get(inliningTarget), getByteArrayNode.execute(inliningTarget, object, length)); } catch (InteropException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.M, e); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.M, e); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.SystemError, ErrorMessages.NEGATIVE_SIZE_PASSED); + throw raiseNode.raise(inliningTarget, PythonErrorType.SystemError, ErrorMessages.NEGATIVE_SIZE_PASSED); } return callNode.executeWithoutFrame(UnicodeDecodeError, encoding, bytes, start, end, reason); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextWeakrefBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextWeakrefBuiltins.java index 1785af8402..05d36d63a1 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextWeakrefBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextWeakrefBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,15 +44,16 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectBorrowed; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer; +import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PYWEAKREFERENCE_PTR; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Void; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.modules.WeakRefModuleBuiltins.ReferenceTypeNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBinaryBuiltinNode; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin; import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.referencetype.PReferenceType; +import com.oracle.graal.python.builtins.objects.referencetype.ReferenceTypeBuiltins.ReferenceTypeNode; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; @@ -79,8 +80,25 @@ static Object refType(Object object, Object callback, @CApiBuiltin(ret = PyObjectBorrowed, args = {PyObject}, call = Direct) abstract static class PyWeakref_GetObject extends CApiUnaryBuiltinNode { @Specialization - static Object call(PReferenceType self) { - return self.getPyObject(); + static Object call(Object reference) { + if (reference instanceof PReferenceType ref) { + return ref.getPyObject(); + } + /* + * This weak reference has died in the managed side due to its referent being collected. + */ + return PNone.NONE; + } + } + + @CApiBuiltin(name = "_PyWeakref_ClearRef", ret = Void, args = {PYWEAKREFERENCE_PTR}, call = Direct) + abstract static class PyWeakref_ClearRef extends CApiUnaryBuiltinNode { + @Specialization + static Object call(Object reference) { + if (reference instanceof PReferenceType ref) { + ref.clearRef(); + } + return PNone.NONE; } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecCtxBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecCtxBuiltins.java index d92537ce8c..cae8468c93 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecCtxBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecCtxBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -97,13 +97,13 @@ static Object codecctxErrorsSet(MultibyteStatefulCodecContext self, Object value @Cached TruffleString.EqualNode isEqual, @Cached CastToTruffleStringNode castToStringNode, @Cached PyUnicodeCheckNode unicodeCheckNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (value == PNone.NONE) { - throw raiseNode.get(inliningTarget).raise(AttributeError, CANNOT_DELETE); + throw raiseNode.raise(inliningTarget, AttributeError, CANNOT_DELETE); } if (!unicodeCheckNode.execute(inliningTarget, value)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ERRORS_MUST_BE_A_STRING); + throw raiseNode.raise(inliningTarget, TypeError, ERRORS_MUST_BE_A_STRING); } TruffleString str = castToStringNode.execute(inliningTarget, value); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsCNModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsCNModuleBuiltins.java index fb8d60305a..8a0a6123e9 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsCNModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsCNModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -53,6 +53,7 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -60,14 +61,13 @@ import com.oracle.graal.python.builtins.modules.cjkcodecs.DBCSMap.MappingType; import com.oracle.graal.python.builtins.modules.cjkcodecs.MultibyteCodec.CodecType; import com.oracle.graal.python.builtins.objects.capsule.PyCapsule; -import com.oracle.graal.python.builtins.objects.capsule.PyCapsuleNameMatchesNode; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.lib.PyUnicodeCheckNode; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -104,15 +104,15 @@ public void initialize(Python3Core core) { @Override public void postInitialize(Python3Core core) { super.postInitialize(core); - PythonObjectFactory factory = core.factory(); + PythonLanguage language = core.getLanguage(); PythonModule codec = core.lookupBuiltinModule(T__CODECS_CN); - registerCodec("gb2312", 0, CodecType.STATELESS, 0, MappingType.DECONLY, MAPPING_LIST, CODEC_LIST, codec, factory); - registerCodec("gbk", 1, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, factory); - registerCodec("gb18030", 2, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, factory); - registerCodec("hz", 3, CodecType.STATEFUL, -1, null, null, CODEC_LIST, codec, factory); - registerCodec("gbkext", -1, null, 1, MappingType.DECONLY, MAPPING_LIST, null, codec, factory); - registerCodec("gbcommon", -1, null, 2, MappingType.ENCONLY, MAPPING_LIST, null, codec, factory); - registerCodec("gb18030ext", -1, null, 3, MappingType.ENCDEC, MAPPING_LIST, null, codec, factory); + registerCodec("gb2312", 0, CodecType.STATELESS, 0, MappingType.DECONLY, MAPPING_LIST, CODEC_LIST, codec, language); + registerCodec("gbk", 1, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, language); + registerCodec("gb18030", 2, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, language); + registerCodec("hz", 3, CodecType.STATEFUL, -1, null, null, CODEC_LIST, codec, language); + registerCodec("gbkext", -1, null, 1, MappingType.DECONLY, MAPPING_LIST, null, codec, language); + registerCodec("gbcommon", -1, null, 2, MappingType.ENCONLY, MAPPING_LIST, null, codec, language); + registerCodec("gb18030ext", -1, null, 3, MappingType.ENCDEC, MAPPING_LIST, null, codec, language); } @Builtin(name = "getcodec", minNumOfPositionalArgs = 1) @@ -125,21 +125,20 @@ static Object getcodec(Object encoding, @Cached TruffleString.EqualNode isEqual, @Cached PyUnicodeCheckNode unicodeCheckNode, @Cached CastToTruffleStringNode asUTF8Node, - @Cached PyCapsuleNameMatchesNode nameMatchesNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { if (!unicodeCheckNode.execute(inliningTarget, encoding)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ENCODING_NAME_MUST_BE_A_STRING); + throw raiseNode.raise(inliningTarget, TypeError, ENCODING_NAME_MUST_BE_A_STRING); } MultibyteCodec codec = findCodec(CODEC_LIST, asUTF8Node.execute(inliningTarget, encoding), isEqual); if (codec == null) { - throw raiseNode.get(inliningTarget).raise(LookupError, NO_SUCH_CODEC_IS_SUPPORTED); + throw raiseNode.raise(inliningTarget, LookupError, NO_SUCH_CODEC_IS_SUPPORTED); } - PyCapsule codecobj = factory.createCapsule(codec, PyMultibyteCodec_CAPSULE_NAME); - return createCodec(inliningTarget, codecobj, nameMatchesNode, factory, raiseNode); + PyCapsule codecobj = PFactory.createCapsuleJavaName(language, codec, PyMultibyteCodec_CAPSULE_NAME); + return createCodec(inliningTarget, codecobj, raiseNode); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsHKModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsHKModuleBuiltins.java index 3223e52e4e..c1a8c13e16 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsHKModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsHKModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -53,6 +53,7 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -60,14 +61,13 @@ import com.oracle.graal.python.builtins.modules.cjkcodecs.DBCSMap.MappingType; import com.oracle.graal.python.builtins.modules.cjkcodecs.MultibyteCodec.CodecType; import com.oracle.graal.python.builtins.objects.capsule.PyCapsule; -import com.oracle.graal.python.builtins.objects.capsule.PyCapsuleNameMatchesNode; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.lib.PyUnicodeCheckNode; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -100,11 +100,11 @@ public void initialize(Python3Core core) { @Override public void postInitialize(Python3Core core) { super.postInitialize(core); - PythonObjectFactory factory = core.factory(); + PythonLanguage language = core.getLanguage(); PythonModule codec = core.lookupBuiltinModule(T__CODECS_HK); - registerCodec("big5hkscs", 0, CodecType.STATELESS_WINIT, 0, MappingType.DECONLY, MAPPING_LIST, CODEC_LIST, codec, factory); - registerCodec("big5hkscs_bmp", -1, null, 1, MappingType.ENCONLY, MAPPING_LIST, CODEC_LIST, codec, factory); - registerCodec("big5hkscs_nonbmp", -1, null, 2, MappingType.ENCONLY, MAPPING_LIST, CODEC_LIST, codec, factory); + registerCodec("big5hkscs", 0, CodecType.STATELESS_WINIT, 0, MappingType.DECONLY, MAPPING_LIST, CODEC_LIST, codec, language); + registerCodec("big5hkscs_bmp", -1, null, 1, MappingType.ENCONLY, MAPPING_LIST, CODEC_LIST, codec, language); + registerCodec("big5hkscs_nonbmp", -1, null, 2, MappingType.ENCONLY, MAPPING_LIST, CODEC_LIST, codec, language); } @Builtin(name = "getcodec", minNumOfPositionalArgs = 1) @@ -117,21 +117,20 @@ static Object getcodec(Object encoding, @Cached TruffleString.EqualNode isEqual, @Cached PyUnicodeCheckNode unicodeCheckNode, @Cached CastToTruffleStringNode asUTF8Node, - @Cached PyCapsuleNameMatchesNode nameMatchesNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { if (!unicodeCheckNode.execute(inliningTarget, encoding)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ENCODING_NAME_MUST_BE_A_STRING); + throw raiseNode.raise(inliningTarget, TypeError, ENCODING_NAME_MUST_BE_A_STRING); } MultibyteCodec codec = findCodec(CODEC_LIST, asUTF8Node.execute(inliningTarget, encoding), isEqual); if (codec == null) { - throw raiseNode.get(inliningTarget).raise(LookupError, NO_SUCH_CODEC_IS_SUPPORTED); + throw raiseNode.raise(inliningTarget, LookupError, NO_SUCH_CODEC_IS_SUPPORTED); } - PyCapsule codecobj = factory.createCapsule(codec, PyMultibyteCodec_CAPSULE_NAME); - return createCodec(inliningTarget, codecobj, nameMatchesNode, factory, raiseNode); + PyCapsule codecobj = PFactory.createCapsuleJavaName(language, codec, PyMultibyteCodec_CAPSULE_NAME); + return createCodec(inliningTarget, codecobj, raiseNode); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsISO2022ModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsISO2022ModuleBuiltins.java index c1c3277193..a6ce7e5163 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsISO2022ModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsISO2022ModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -53,20 +53,20 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.modules.cjkcodecs.MultibyteCodec.CodecType; import com.oracle.graal.python.builtins.objects.capsule.PyCapsule; -import com.oracle.graal.python.builtins.objects.capsule.PyCapsuleNameMatchesNode; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.lib.PyUnicodeCheckNode; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -100,16 +100,16 @@ protected List> getNodeFa @Override public void postInitialize(Python3Core core) { super.postInitialize(core); - PythonObjectFactory factory = core.factory(); + PythonLanguage language = core.getLanguage(); PythonModule codec = core.lookupBuiltinModule(T__CODECS_ISO2022); int i = 0; - registerCodec("iso2022_kr", i++, CodecType.ISO2022, -1, null, null, CODEC_LIST, codec, factory); - registerCodec("iso2022_jp", i++, CodecType.ISO2022, -1, null, null, CODEC_LIST, codec, factory); - registerCodec("iso2022_jp_1", i++, CodecType.ISO2022, -1, null, null, CODEC_LIST, codec, factory); - registerCodec("iso2022_jp_2", i++, CodecType.ISO2022, -1, null, null, CODEC_LIST, codec, factory); - registerCodec("iso2022_jp_2004", i++, CodecType.ISO2022, -1, null, null, CODEC_LIST, codec, factory); - registerCodec("iso2022_jp_3", i++, CodecType.ISO2022, -1, null, null, CODEC_LIST, codec, factory); - registerCodec("iso2022_jp_ext", i, CodecType.ISO2022, -1, null, null, CODEC_LIST, codec, factory); + registerCodec("iso2022_kr", i++, CodecType.ISO2022, -1, null, null, CODEC_LIST, codec, language); + registerCodec("iso2022_jp", i++, CodecType.ISO2022, -1, null, null, CODEC_LIST, codec, language); + registerCodec("iso2022_jp_1", i++, CodecType.ISO2022, -1, null, null, CODEC_LIST, codec, language); + registerCodec("iso2022_jp_2", i++, CodecType.ISO2022, -1, null, null, CODEC_LIST, codec, language); + registerCodec("iso2022_jp_2004", i++, CodecType.ISO2022, -1, null, null, CODEC_LIST, codec, language); + registerCodec("iso2022_jp_3", i++, CodecType.ISO2022, -1, null, null, CODEC_LIST, codec, language); + registerCodec("iso2022_jp_ext", i, CodecType.ISO2022, -1, null, null, CODEC_LIST, codec, language); } @Override @@ -127,21 +127,20 @@ static Object getcodec(Object encoding, @Cached TruffleString.EqualNode isEqual, @Cached PyUnicodeCheckNode unicodeCheckNode, @Cached CastToTruffleStringNode asUTF8Node, - @Cached PyCapsuleNameMatchesNode nameMatchesNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { if (!unicodeCheckNode.execute(inliningTarget, encoding)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ENCODING_NAME_MUST_BE_A_STRING); + throw raiseNode.raise(inliningTarget, TypeError, ENCODING_NAME_MUST_BE_A_STRING); } MultibyteCodec codec = findCodec(CODEC_LIST, asUTF8Node.execute(inliningTarget, encoding), isEqual); if (codec == null) { - throw raiseNode.get(inliningTarget).raise(LookupError, NO_SUCH_CODEC_IS_SUPPORTED); + throw raiseNode.raise(inliningTarget, LookupError, NO_SUCH_CODEC_IS_SUPPORTED); } - PyCapsule codecobj = factory.createCapsule(codec, PyMultibyteCodec_CAPSULE_NAME); - return createCodec(inliningTarget, codecobj, nameMatchesNode, factory, raiseNode); + PyCapsule codecobj = PFactory.createCapsuleJavaName(language, codec, PyMultibyteCodec_CAPSULE_NAME); + return createCodec(inliningTarget, codecobj, raiseNode); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsJPModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsJPModuleBuiltins.java index c2aa63c7e0..59352af1c5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsJPModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsJPModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -53,6 +53,7 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -60,14 +61,13 @@ import com.oracle.graal.python.builtins.modules.cjkcodecs.DBCSMap.MappingType; import com.oracle.graal.python.builtins.modules.cjkcodecs.MultibyteCodec.CodecType; import com.oracle.graal.python.builtins.objects.capsule.PyCapsule; -import com.oracle.graal.python.builtins.objects.capsule.PyCapsuleNameMatchesNode; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.lib.PyUnicodeCheckNode; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -109,29 +109,29 @@ protected List> getNodeFa @Override public void postInitialize(Python3Core core) { super.postInitialize(core); - PythonObjectFactory factory = core.factory(); + PythonLanguage language = core.getLanguage(); PythonModule codec = core.lookupBuiltinModule(T__CODECS_JP); int i = 0; - registerCodec("shift_jis", i++, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, factory); - registerCodec("cp932", i++, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, factory); - registerCodec("euc_jp", i++, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, factory); - registerCodec("shift_jis_2004", i++, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, factory); - registerCodec("euc_jis_2004", i++, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, factory); - registerCodec("euc_jisx0213", i++, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, factory); - registerCodec("shift_jisx0213", i, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, factory); + registerCodec("shift_jis", i++, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, language); + registerCodec("cp932", i++, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, language); + registerCodec("euc_jp", i++, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, language); + registerCodec("shift_jis_2004", i++, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, language); + registerCodec("euc_jis_2004", i++, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, language); + registerCodec("euc_jisx0213", i++, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, language); + registerCodec("shift_jisx0213", i, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, language); i = 0; - registerCodec("jisx0208", -1, null, i++, MappingType.DECONLY, MAPPING_LIST, null, codec, factory); - registerCodec("jisx0212", -1, null, i++, MappingType.DECONLY, MAPPING_LIST, null, codec, factory); - registerCodec("jisxcommon", -1, null, i++, MappingType.ENCONLY, MAPPING_LIST, null, codec, factory); - registerCodec("jisx0213_1_bmp", -1, null, i++, MappingType.DECONLY, MAPPING_LIST, null, codec, factory); - registerCodec("jisx0213_2_bmp", -1, null, i++, MappingType.DECONLY, MAPPING_LIST, null, codec, factory); - registerCodec("jisx0213_bmp", -1, null, i++, MappingType.ENCONLY, MAPPING_LIST, null, codec, factory); - registerCodec("jisx0213_1_emp", -1, null, i++, MappingType.DECONLY, MAPPING_LIST, null, codec, factory); - registerCodec("jisx0213_2_emp", -1, null, i++, MappingType.DECONLY, MAPPING_LIST, null, codec, factory); - registerCodec("jisx0213_emp", -1, null, i++, MappingType.ENCONLY, MAPPING_LIST, null, codec, factory); - registerCodec("jisx0213_pair", -1, null, i++, MappingType.ENCDEC, MAPPING_LIST, null, codec, factory); - registerCodec("cp932ext", -1, null, i, MappingType.ENCDEC, MAPPING_LIST, null, codec, factory); + registerCodec("jisx0208", -1, null, i++, MappingType.DECONLY, MAPPING_LIST, null, codec, language); + registerCodec("jisx0212", -1, null, i++, MappingType.DECONLY, MAPPING_LIST, null, codec, language); + registerCodec("jisxcommon", -1, null, i++, MappingType.ENCONLY, MAPPING_LIST, null, codec, language); + registerCodec("jisx0213_1_bmp", -1, null, i++, MappingType.DECONLY, MAPPING_LIST, null, codec, language); + registerCodec("jisx0213_2_bmp", -1, null, i++, MappingType.DECONLY, MAPPING_LIST, null, codec, language); + registerCodec("jisx0213_bmp", -1, null, i++, MappingType.ENCONLY, MAPPING_LIST, null, codec, language); + registerCodec("jisx0213_1_emp", -1, null, i++, MappingType.DECONLY, MAPPING_LIST, null, codec, language); + registerCodec("jisx0213_2_emp", -1, null, i++, MappingType.DECONLY, MAPPING_LIST, null, codec, language); + registerCodec("jisx0213_emp", -1, null, i++, MappingType.ENCONLY, MAPPING_LIST, null, codec, language); + registerCodec("jisx0213_pair", -1, null, i++, MappingType.ENCDEC, MAPPING_LIST, null, codec, language); + registerCodec("cp932ext", -1, null, i, MappingType.ENCDEC, MAPPING_LIST, null, codec, language); } @Override @@ -149,21 +149,20 @@ static Object getcodec(Object encoding, @Cached TruffleString.EqualNode isEqual, @Cached PyUnicodeCheckNode unicodeCheckNode, @Cached CastToTruffleStringNode asUTF8Node, - @Cached PyCapsuleNameMatchesNode nameMatchesNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { if (!unicodeCheckNode.execute(inliningTarget, encoding)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ENCODING_NAME_MUST_BE_A_STRING); + throw raiseNode.raise(inliningTarget, TypeError, ENCODING_NAME_MUST_BE_A_STRING); } MultibyteCodec codec = findCodec(CODEC_LIST, asUTF8Node.execute(inliningTarget, encoding), isEqual); if (codec == null) { - throw raiseNode.get(inliningTarget).raise(LookupError, NO_SUCH_CODEC_IS_SUPPORTED); + throw raiseNode.raise(inliningTarget, LookupError, NO_SUCH_CODEC_IS_SUPPORTED); } - PyCapsule codecobj = factory.createCapsule(codec, PyMultibyteCodec_CAPSULE_NAME); - return createCodec(inliningTarget, codecobj, nameMatchesNode, factory, raiseNode); + PyCapsule codecobj = PFactory.createCapsuleJavaName(language, codec, PyMultibyteCodec_CAPSULE_NAME); + return createCodec(inliningTarget, codecobj, raiseNode); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsKRModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsKRModuleBuiltins.java index 32bf408788..33e5a58157 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsKRModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsKRModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -53,6 +53,7 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -60,14 +61,13 @@ import com.oracle.graal.python.builtins.modules.cjkcodecs.DBCSMap.MappingType; import com.oracle.graal.python.builtins.modules.cjkcodecs.MultibyteCodec.CodecType; import com.oracle.graal.python.builtins.objects.capsule.PyCapsule; -import com.oracle.graal.python.builtins.objects.capsule.PyCapsuleNameMatchesNode; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.lib.PyUnicodeCheckNode; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -97,14 +97,14 @@ protected List> getNodeFa @Override public void postInitialize(Python3Core core) { super.postInitialize(core); - PythonObjectFactory factory = core.factory(); + PythonLanguage language = core.getLanguage(); PythonModule codec = core.lookupBuiltinModule(T__CODECS_KR); - registerCodec("euc_kr", 0, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, factory); - registerCodec("cp949", 1, CodecType.STATELESS, 1, MappingType.ENCONLY, MAPPING_LIST, CODEC_LIST, codec, factory); - registerCodec("johab", 2, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, factory); + registerCodec("euc_kr", 0, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, language); + registerCodec("cp949", 1, CodecType.STATELESS, 1, MappingType.ENCONLY, MAPPING_LIST, CODEC_LIST, codec, language); + registerCodec("johab", 2, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, language); - registerCodec("ksx1001", -1, null, 0, MappingType.DECONLY, MAPPING_LIST, null, codec, factory); - registerCodec("cp949ext", -1, null, 2, MappingType.DECONLY, MAPPING_LIST, null, codec, factory); + registerCodec("ksx1001", -1, null, 0, MappingType.DECONLY, MAPPING_LIST, null, codec, language); + registerCodec("cp949ext", -1, null, 2, MappingType.DECONLY, MAPPING_LIST, null, codec, language); } @Override @@ -122,21 +122,20 @@ static Object getcodec(Object encoding, @Cached TruffleString.EqualNode isEqual, @Cached PyUnicodeCheckNode unicodeCheckNode, @Cached CastToTruffleStringNode asUTF8Node, - @Cached PyCapsuleNameMatchesNode nameMatchesNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { if (!unicodeCheckNode.execute(inliningTarget, encoding)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ENCODING_NAME_MUST_BE_A_STRING); + throw raiseNode.raise(inliningTarget, TypeError, ENCODING_NAME_MUST_BE_A_STRING); } MultibyteCodec codec = findCodec(CODEC_LIST, asUTF8Node.execute(inliningTarget, encoding), isEqual); if (codec == null) { - throw raiseNode.get(inliningTarget).raise(LookupError, NO_SUCH_CODEC_IS_SUPPORTED); + throw raiseNode.raise(inliningTarget, LookupError, NO_SUCH_CODEC_IS_SUPPORTED); } - PyCapsule codecobj = factory.createCapsule(codec, PyMultibyteCodec_CAPSULE_NAME); - return createCodec(inliningTarget, codecobj, nameMatchesNode, factory, raiseNode); + PyCapsule codecobj = PFactory.createCapsuleJavaName(language, codec, PyMultibyteCodec_CAPSULE_NAME); + return createCodec(inliningTarget, codecobj, raiseNode); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsTWModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsTWModuleBuiltins.java index c3368eb863..283810add0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsTWModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/CodecsTWModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -53,6 +53,7 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -60,14 +61,13 @@ import com.oracle.graal.python.builtins.modules.cjkcodecs.DBCSMap.MappingType; import com.oracle.graal.python.builtins.modules.cjkcodecs.MultibyteCodec.CodecType; import com.oracle.graal.python.builtins.objects.capsule.PyCapsule; -import com.oracle.graal.python.builtins.objects.capsule.PyCapsuleNameMatchesNode; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.lib.PyUnicodeCheckNode; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -95,11 +95,11 @@ protected List> getNodeFa @Override public void postInitialize(Python3Core core) { super.postInitialize(core); - PythonObjectFactory factory = core.factory(); + PythonLanguage language = core.getLanguage(); PythonModule codec = core.lookupBuiltinModule(T__CODECS_TW); - registerCodec("big5", 0, CodecType.STATELESS, 0, MappingType.ENCDEC, MAPPING_LIST, CODEC_LIST, codec, factory); - registerCodec("cp950", 1, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, factory); - registerCodec("cp950ext", -1, null, 1, MappingType.ENCDEC, MAPPING_LIST, null, codec, factory); + registerCodec("big5", 0, CodecType.STATELESS, 0, MappingType.ENCDEC, MAPPING_LIST, CODEC_LIST, codec, language); + registerCodec("cp950", 1, CodecType.STATELESS, -1, null, null, CODEC_LIST, codec, language); + registerCodec("cp950ext", -1, null, 1, MappingType.ENCDEC, MAPPING_LIST, null, codec, language); } @Override @@ -117,21 +117,20 @@ static Object getcodec(Object encoding, @Cached TruffleString.EqualNode isEqual, @Cached PyUnicodeCheckNode unicodeCheckNode, @Cached CastToTruffleStringNode asUTF8Node, - @Cached PyCapsuleNameMatchesNode nameMatchesNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { if (!unicodeCheckNode.execute(inliningTarget, encoding)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ENCODING_NAME_MUST_BE_A_STRING); + throw raiseNode.raise(inliningTarget, TypeError, ENCODING_NAME_MUST_BE_A_STRING); } MultibyteCodec codec = findCodec(CODEC_LIST, asUTF8Node.execute(inliningTarget, encoding), isEqual); if (codec == null) { - throw raiseNode.get(inliningTarget).raise(LookupError, NO_SUCH_CODEC_IS_SUPPORTED); + throw raiseNode.raise(inliningTarget, LookupError, NO_SUCH_CODEC_IS_SUPPORTED); } - PyCapsule codecobj = factory.createCapsule(codec, PyMultibyteCodec_CAPSULE_NAME); - return createCodec(inliningTarget, codecobj, nameMatchesNode, factory, raiseNode); + PyCapsule codecobj = PFactory.createCapsuleJavaName(language, codec, PyMultibyteCodec_CAPSULE_NAME); + return createCodec(inliningTarget, codecobj, raiseNode); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteCodecBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteCodecBuiltins.java index 6995a40711..6a31839447 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteCodecBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteCodecBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -52,6 +52,7 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; @@ -64,7 +65,7 @@ import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; @@ -119,16 +120,16 @@ static Object ts(VirtualFrame frame, MultibyteCodecObject self, TruffleString uc @Exclusive @Cached MultibyteCodecUtil.EncodeNode encodeNode, @Shared @Cached TruffleString.CodePointLengthNode codePointLengthNode, @Shared @Cached TruffleString.EqualNode isEqual, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { TruffleString errorcb = internalErrorCallback(errors, isEqual); MultibyteCodecState state = self.codec.encinit(errorcb); int datalen = codePointLengthNode.execute(ucvt, TS_ENCODING); - PBytes r = encodeEmptyInput(datalen, MBENC_FLUSH | MBENC_RESET, factory); + PBytes r = encodeEmptyInput(inliningTarget, datalen, MBENC_FLUSH | MBENC_RESET); if (r == null) { MultibyteEncodeBuffer buf = new MultibyteEncodeBuffer(ucvt); - r = encodeNode.execute(frame, inliningTarget, self.codec, state, buf, errorcb, MBENC_FLUSH | MBENC_RESET, factory); + r = encodeNode.execute(frame, inliningTarget, self.codec, state, buf, errorcb, MBENC_FLUSH | MBENC_RESET); } - return factory.createTuple(new Object[]{r, datalen}); + return PFactory.createTuple(language, new Object[]{r, datalen}); } @Specialization(guards = "!isTruffleString(input)") @@ -140,18 +141,18 @@ static Object notTS(VirtualFrame frame, MultibyteCodecObject self, Object input, @Exclusive @Cached MultibyteCodecUtil.EncodeNode encodeNode, @Shared @Cached TruffleString.CodePointLengthNode codePointLengthNode, @Shared @Cached TruffleString.EqualNode isEqual, - @Shared @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { Object ucvt = input; if (!unicodeCheck.execute(inliningTarget, input)) { ucvt = strNode.execute(frame, inliningTarget, input); if (!unicodeCheck.execute(inliningTarget, ucvt)) { - throw raiseNode.get(inliningTarget).raise(TypeError, COULDN_T_CONVERT_THE_OBJECT_TO_UNICODE); + throw raiseNode.raise(inliningTarget, TypeError, COULDN_T_CONVERT_THE_OBJECT_TO_UNICODE); } } TruffleString str = toTruffleStringNode.execute(inliningTarget, ucvt); - return ts(frame, self, str, errors, inliningTarget, encodeNode, codePointLengthNode, isEqual, factory); + return ts(frame, self, str, errors, inliningTarget, encodeNode, codePointLengthNode, isEqual, language); } } @@ -186,13 +187,13 @@ protected ArgumentClinicProvider getArgumentClinic() { Object decode(VirtualFrame frame, MultibyteCodecObject self, byte[] input, TruffleString errors, @Cached MultibyteCodecUtil.DecodeErrorNode decodeErrorNode, @Cached TruffleString.EqualNode isEqual, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { int datalen = input.length; TruffleString errorcb = internalErrorCallback(errors, isEqual); if (datalen == 0) { - return factory.createTuple(new Object[]{T_EMPTY_STRING, 0}); + return PFactory.createTuple(language, new Object[]{T_EMPTY_STRING, 0}); } MultibyteDecodeBuffer buf = new MultibyteDecodeBuffer(input); MultibyteCodecState state = self.codec.decinit(errorcb); @@ -205,7 +206,7 @@ Object decode(VirtualFrame frame, MultibyteCodecObject self, byte[] input, Truff } } - return factory.createTuple(new Object[]{buf.toTString(), datalen}); + return PFactory.createTuple(language, new Object[]{buf.toTString(), datalen}); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteCodecUtil.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteCodecUtil.java index b48118e590..a62459db0f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteCodecUtil.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteCodecUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -71,6 +71,7 @@ import java.nio.CharBuffer; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.codecs.CodecsRegistry.PyCodecLookupErrorNode; import com.oracle.graal.python.builtins.objects.bytes.BytesNodes; import com.oracle.graal.python.builtins.objects.bytes.PBytes; @@ -86,7 +87,7 @@ import com.oracle.graal.python.nodes.util.CastToJavaStringNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -170,7 +171,7 @@ static int encerror(VirtualFrame frame, MultibyteCodec codec, MultibyteCodecState state, MultibyteEncodeBuffer buf, Object errors, int e, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached BaseExceptionAttrNode attrNode, @Cached SequenceStorageNodes.GetInternalObjectArrayNode getArray, @Cached PyUnicodeCheckNode unicodeCheckNode, @@ -182,7 +183,7 @@ static int encerror(VirtualFrame frame, MultibyteCodec codec, @Cached(inline = true) CallErrorCallbackNode callErrorCallbackNode, @Cached BytesNodes.ToBytesNode toBytesNode, @Cached EncodeNode encodeNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { TruffleString reason = ILLEGAL_MULTIBYTE_SEQUENCE; int esize = e; @@ -196,9 +197,9 @@ static int encerror(VirtualFrame frame, MultibyteCodec codec, esize = buf.getInpos(); break; case MBERR_INTERNAL: - throw raiseNode.get(inliningTarget).raise(RuntimeError, INTERNAL_CODEC_ERROR); + throw raiseNode.raise(inliningTarget, RuntimeError, INTERNAL_CODEC_ERROR); default: - throw raiseNode.get(inliningTarget).raise(RuntimeError, UNKNOWN_RUNTIME_ERROR); + throw raiseNode.raise(inliningTarget, RuntimeError, UNKNOWN_RUNTIME_ERROR); } } @@ -233,10 +234,10 @@ static int encerror(VirtualFrame frame, MultibyteCodec codec, /* use cached exception object if available */ if (buf.excobj == null) { - buf.excobj = factory.createBaseException(UnicodeEncodeError); + buf.excobj = PFactory.createBaseException(language, UnicodeEncodeError); TruffleString encoding = codec.encoding; Object[] args = new Object[]{encoding, buf.toTString(), start, end, reason}; - buf.excobj.setArgs(factory.createTuple(args)); + buf.excobj.setArgs(PFactory.createTuple(language, args)); buf.excobj.setExceptionAttributes(args); } else { attrNode.execute(buf.excobj, start, IDX_START, UNICODE_ERROR_ATTR_FACTORY); @@ -245,7 +246,7 @@ static int encerror(VirtualFrame frame, MultibyteCodec codec, } if (errors == ERROR_STRICT) { - throw raiseNode.get(inliningTarget).raiseExceptionObject(buf.excobj); + throw raiseNode.raiseExceptionObject(inliningTarget, buf.excobj); // PyCodec_StrictErrors(buf.excobj); } @@ -270,18 +271,17 @@ static int encerror(VirtualFrame frame, MultibyteCodec codec, } if (isError) { - throw raiseNode.get(inliningTarget).raise(TypeError, ENCODING_ERROR_HANDLER_MUST_RETURN); + throw raiseNode.raise(inliningTarget, TypeError, ENCODING_ERROR_HANDLER_MUST_RETURN); } PBytes retstr; if (isUnicode) { TruffleString str = toTString.execute(inliningTarget, tobj); int datalen = codePointLengthNode.execute(str, TS_ENCODING); - retstr = encodeEmptyInput(datalen, MBENC_FLUSH, factory); + retstr = encodeEmptyInput(inliningTarget, datalen, MBENC_FLUSH); if (retstr == null) { MultibyteEncodeBuffer tmpbuf = new MultibyteEncodeBuffer(str); - retstr = encodeNode.execute(frame, inliningTarget, codec, state, tmpbuf, ERROR_STRICT, MBENC_FLUSH, - factory); + retstr = encodeNode.execute(frame, inliningTarget, codec, state, tmpbuf, ERROR_STRICT, MBENC_FLUSH); } } else { retstr = (PBytes) tobj; @@ -301,10 +301,10 @@ static int encerror(VirtualFrame frame, MultibyteCodec codec, newpos += buf.getInlen(); } } catch (PException exception) { - throw raiseNode.get(inliningTarget).raise(IndexError, POSITION_D_FROM_ERROR_HANDLER_OUT_OF_BOUNDS, newpos); + throw raiseNode.raise(inliningTarget, IndexError, POSITION_D_FROM_ERROR_HANDLER_OUT_OF_BOUNDS, newpos); } if (newpos < 0 || newpos > buf.getInlen()) { - throw raiseNode.get(inliningTarget).raise(IndexError, POSITION_D_FROM_ERROR_HANDLER_OUT_OF_BOUNDS, newpos); + throw raiseNode.raise(inliningTarget, IndexError, POSITION_D_FROM_ERROR_HANDLER_OUT_OF_BOUNDS, newpos); } buf.setInpos(newpos); @@ -326,7 +326,7 @@ static void decerror(VirtualFrame frame, MultibyteCodec codec, // MultibyteCodecState state, MultibyteDecodeBuffer buf, TruffleString errors, int e, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached BaseExceptionAttrNode attrNode, @Cached SequenceStorageNodes.GetInternalObjectArrayNode getArray, @Cached PyUnicodeCheckNode unicodeCheckNode, @@ -334,7 +334,7 @@ static void decerror(VirtualFrame frame, MultibyteCodec codec, @Cached PyLongAsIntNode asSizeNode, @Cached CastToJavaStringNode toString, @Cached(inline = true) CallErrorCallbackNode callErrorCallbackNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { TruffleString reason = ILLEGAL_MULTIBYTE_SEQUENCE; int esize = e; @@ -349,9 +349,9 @@ static void decerror(VirtualFrame frame, MultibyteCodec codec, esize = buf.remaining(); break; case MBERR_INTERNAL: - throw raiseNode.get(inliningTarget).raise(RuntimeError, INTERNAL_CODEC_ERROR); + throw raiseNode.raise(inliningTarget, RuntimeError, INTERNAL_CODEC_ERROR); default: - throw raiseNode.get(inliningTarget).raise(RuntimeError, UNKNOWN_RUNTIME_ERROR); + throw raiseNode.raise(inliningTarget, RuntimeError, UNKNOWN_RUNTIME_ERROR); } } @@ -368,11 +368,11 @@ static void decerror(VirtualFrame frame, MultibyteCodec codec, /* use cached exception object if available */ if (buf.excobj == null) { - buf.excobj = factory.createBaseException(UnicodeDecodeError); - PBytes inbuf = buf.createPBytes(factory); + buf.excobj = PFactory.createBaseException(language, UnicodeDecodeError); + PBytes inbuf = PFactory.createBytes(language, buf.inputBuffer.array(), buf.getInpos()); TruffleString encoding = codec.encoding; Object[] args = new Object[]{encoding, inbuf, buf.getInpos(), start, end, reason}; - buf.excobj.setArgs(factory.createTuple(args)); + buf.excobj.setArgs(PFactory.createTuple(language, args)); buf.excobj.setExceptionAttributes(args); } else { attrNode.execute(buf.excobj, start, IDX_START, UNICODE_ERROR_ATTR_FACTORY); @@ -381,7 +381,7 @@ static void decerror(VirtualFrame frame, MultibyteCodec codec, } if (errors == ERROR_STRICT) { - throw raiseNode.get(inliningTarget).raiseExceptionObject(buf.excobj); + throw raiseNode.raiseExceptionObject(inliningTarget, buf.excobj); // PyCodec_StrictErrors(buf.excobj); } @@ -404,7 +404,7 @@ static void decerror(VirtualFrame frame, MultibyteCodec codec, } if (isError) { - throw raiseNode.get(inliningTarget).raise(TypeError, DECODING_ERROR_HANDLER_MUST_RETURN); + throw raiseNode.raise(inliningTarget, TypeError, DECODING_ERROR_HANDLER_MUST_RETURN); } buf.writeStr(toString.execute(retuni)); @@ -416,20 +416,19 @@ static void decerror(VirtualFrame frame, MultibyteCodec codec, newpos += buf.getInpos(); } } catch (PException ee) { - throw raiseNode.get(inliningTarget).raise(IndexError, POSITION_D_FROM_ERROR_HANDLER_OUT_OF_BOUNDS, newpos); + throw raiseNode.raise(inliningTarget, IndexError, POSITION_D_FROM_ERROR_HANDLER_OUT_OF_BOUNDS, newpos); } if (newpos > buf.getInSize()) { - throw raiseNode.get(inliningTarget).raise(IndexError, POSITION_D_FROM_ERROR_HANDLER_OUT_OF_BOUNDS, newpos); + throw raiseNode.raise(inliningTarget, IndexError, POSITION_D_FROM_ERROR_HANDLER_OUT_OF_BOUNDS, newpos); } buf.setInpos(newpos); } } - protected static PBytes encodeEmptyInput(int len, int flags, - PythonObjectFactory factory) { + protected static PBytes encodeEmptyInput(Node inliningTarget, int len, int flags) { if (len == 0 && (flags & MBENC_RESET) == 0) { - return factory.createEmptyBytes(); + return PFactory.createEmptyBytes(PythonLanguage.get(inliningTarget)); } return null; } @@ -438,22 +437,20 @@ protected static PBytes encodeEmptyInput(int len, int flags, @GenerateCached(false) abstract static class EncodeNode extends Node { - abstract PBytes execute(VirtualFrame frame, Node inliningTarget, MultibyteCodec codec, MultibyteCodecState state, MultibyteEncodeBuffer buf, Object errors, int flags, - PythonObjectFactory factory); + abstract PBytes execute(VirtualFrame frame, Node inliningTarget, MultibyteCodec codec, MultibyteCodecState state, MultibyteEncodeBuffer buf, Object errors, int flags); // multibytecodec_encode @Specialization static PBytes encode(VirtualFrame frame, Node inliningTarget, MultibyteCodec codec, MultibyteCodecState state, MultibyteEncodeBuffer buf, Object errors, int flags, - PythonObjectFactory factory, @Cached(inline = false) EncodeErrorNode encodeErrorNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { // if (buf.inlen == 0 && (flags & MBENC_RESET) == 0) { - // return factory.createBytes(EMPTY_BYTE_ARRAY); + // return PFactory.createBytes(language, EMPTY_BYTE_ARRAY); // } if (buf.getInlen() > (MAXSIZE - 16) / 2) { - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } while (!buf.isFull()) { @@ -486,7 +483,7 @@ static PBytes encode(VirtualFrame frame, Node inliningTarget, MultibyteCodec cod } } - return buf.createPBytes(factory); + return buf.createPBytes(); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteDecodeBuffer.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteDecodeBuffer.java index 20edfb8590..265d0c66d8 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteDecodeBuffer.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteDecodeBuffer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -48,10 +48,8 @@ import java.nio.ByteBuffer; import java.nio.CharBuffer; -import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.exception.PBaseException; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @@ -102,10 +100,6 @@ protected boolean isFull() { return !inputBuffer.hasRemaining(); } - protected PBytes createPBytes(PythonObjectFactory factory) { - return factory.createBytes(inputBuffer.array(), getInpos()); - } - @TruffleBoundary protected void replaceInbuf(byte[] inbuf) { inputBuffer = ByteBuffer.wrap(inbuf); @@ -135,7 +129,7 @@ protected TruffleString toTString() { protected void grow(Node raisingNode) { int newCapacity = 2 * writer.capacity() + 1; if (newCapacity < 0) { - throw PRaiseNode.raiseUncached(raisingNode, MemoryError); + throw PRaiseNode.raiseStatic(raisingNode, MemoryError); } CharBuffer newBuffer = CharBuffer.allocate(newCapacity); writer.flip(); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteEncodeBuffer.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteEncodeBuffer.java index 39e1b48d56..8bcaaaadce 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteEncodeBuffer.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteEncodeBuffer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,10 +46,11 @@ import java.nio.ByteBuffer; import java.nio.CharBuffer; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.exception.PBaseException; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @@ -127,7 +128,7 @@ protected void expandOutputBuffer(int esize, Node raisingNode) { int orgsize = outputBuffer.capacity(); int incsize = esize < (orgsize >> 1) ? (orgsize >> 1) | 1 : esize; if (orgsize > MAXSIZE - incsize) { - throw PRaiseNode.raiseUncached(raisingNode, MemoryError); + throw PRaiseNode.raiseStatic(raisingNode, MemoryError); } ByteBuffer newBuffer = ByteBuffer.allocate(incsize); outputBuffer.flip(); @@ -138,8 +139,8 @@ protected void expandOutputBuffer(int esize, Node raisingNode) { } @TruffleBoundary - protected PBytes createPBytes(PythonObjectFactory factory) { - outobj = factory.createBytes(outputBuffer.array(), outputBuffer.position()); + protected PBytes createPBytes() { + outobj = PFactory.createBytes(PythonLanguage.get(null), outputBuffer.array(), outputBuffer.position()); return outobj; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteIncrementalDecoderBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteIncrementalDecoderBuiltins.java index 236c749107..e48b04cc2c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteIncrementalDecoderBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteIncrementalDecoderBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -48,16 +48,19 @@ import static com.oracle.graal.python.nodes.ErrorMessages.CODEC_IS_UNEXPECTED_TYPE; import static com.oracle.graal.python.nodes.ErrorMessages.PENDING_BUFFER_OVERFLOW; import static com.oracle.graal.python.nodes.ErrorMessages.PENDING_BUFFER_TOO_LARGE; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.MemoryError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.UnicodeError; +import java.math.BigInteger; import java.util.Arrays; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltins; @@ -67,6 +70,8 @@ import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.nodes.HiddenAttr; import com.oracle.graal.python.nodes.PRaiseNode; @@ -79,7 +84,7 @@ import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -93,12 +98,15 @@ @CoreFunctions(extendClasses = MultibyteIncrementalDecoder) public final class MultibyteIncrementalDecoderBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = MultibyteIncrementalDecoderBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return MultibyteIncrementalDecoderBuiltinsFactory.getFactories(); } - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, parameterNames = {"$cls", "errors"}) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, parameterNames = {"$cls", "errors"}) @GenerateNodeFactory protected abstract static class NewNode extends PythonBinaryBuiltinNode { @@ -108,18 +116,19 @@ static Object mbstreamreaderNew(VirtualFrame frame, Object type, Object err, @Cached CastToTruffleStringNode castToStringNode, @Cached PyObjectGetAttr getAttr, @Cached TruffleString.EqualNode isEqual, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { // "|s:IncrementalDecoder" + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Cached PRaiseNode raiseNode) { // "|s:IncrementalDecoder" TruffleString errors = null; if (err != PNone.NO_VALUE) { errors = castToStringNode.execute(inliningTarget, err); } - MultibyteIncrementalDecoderObject self = factory.createMultibyteIncrementalDecoderObject(type); + MultibyteIncrementalDecoderObject self = PFactory.createMultibyteIncrementalDecoderObject(language, type, getInstanceShape.execute(type)); Object codec = getAttr.execute(frame, inliningTarget, type, StringLiterals.T_CODEC); if (!(codec instanceof MultibyteCodecObject)) { - throw raiseNode.get(inliningTarget).raise(TypeError, CODEC_IS_UNEXPECTED_TYPE); + throw raiseNode.raise(inliningTarget, TypeError, CODEC_IS_UNEXPECTED_TYPE); } self.codec = ((MultibyteCodecObject) codec).codec; @@ -130,7 +139,8 @@ static Object mbstreamreaderNew(VirtualFrame frame, Object type, Object err, } } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, parameterNames = {"$self"}) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "MultibyteIncrementalDecoder", minNumOfPositionalArgs = 1, parameterNames = {"$self"}) @GenerateNodeFactory public abstract static class InitNode extends PythonUnaryBuiltinNode { @@ -160,7 +170,7 @@ protected ArgumentClinicProvider getArgumentClinic() { static Object decode(VirtualFrame frame, MultibyteIncrementalDecoderObject self, byte[] input, int end, @Bind("this") Node inliningTarget, @Cached MultibyteCodecUtil.DecodeErrorNode decodeErrorNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { byte[] data = input; int size = input.length; @@ -170,7 +180,7 @@ static Object decode(VirtualFrame frame, MultibyteIncrementalDecoderObject self, byte[] wdata = data; if (self.pendingsize != 0) { if (size > MAXSIZE - self.pendingsize) { - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } wsize = size + self.pendingsize; wdata = new byte[wsize]; @@ -204,11 +214,11 @@ static Object decode(VirtualFrame frame, MultibyteIncrementalDecoderObject self, static int decoderAppendPending(Node inliningTarge, MultibyteStatefulDecoderContext ctx, MultibyteDecodeBuffer buf, - PRaiseNode.Lazy raiseNode) { + PRaiseNode raiseNode) { int npendings = buf.remaining(); if (npendings + ctx.pendingsize > MAXDECPENDING || npendings > MAXSIZE - ctx.pendingsize) { - throw raiseNode.get(inliningTarge).raise(UnicodeError, PENDING_BUFFER_OVERFLOW); + throw raiseNode.raise(inliningTarge, UnicodeError, PENDING_BUFFER_OVERFLOW); } buf.getRemaining(ctx.pending, ctx.pendingsize, npendings); ctx.pendingsize += npendings; @@ -240,12 +250,12 @@ abstract static class GetStateNode extends PythonUnaryBuiltinNode { @Specialization static Object getstate(MultibyteIncrementalDecoderObject self, @Bind("this") Node inliningTarget, - @Cached HiddenAttr.WriteNode writeHiddenAttrNode, - @Cached PythonObjectFactory factory) { - PBytes buffer = factory.createBytes(Arrays.copyOf(self.pending, self.pendingsize)); - PInt statelong = factory.createInt(0); + @Bind PythonLanguage language, + @Cached HiddenAttr.WriteNode writeHiddenAttrNode) { + PBytes buffer = PFactory.createBytes(language, Arrays.copyOf(self.pending, self.pendingsize)); + PInt statelong = PFactory.createInt(language, BigInteger.ZERO); writeHiddenAttrNode.execute(inliningTarget, statelong, HiddenAttr.DECODER_OBJECT, self.state); - return factory.createTuple(new Object[]{buffer, statelong}); + return PFactory.createTuple(language, new Object[]{buffer, statelong}); } } @@ -266,7 +276,7 @@ static Object setstate(VirtualFrame frame, MultibyteIncrementalDecoderObject sel @Cached HiddenAttr.ReadNode readHiddenAttrNode, @Cached BytesNodes.ToBytesNode toBytesNode, @Cached SequenceStorageNodes.GetInternalObjectArrayNode getArray, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object[] array = getArray.execute(inliningTarget, state.getSequenceStorage()); Object buffer = array[0]; Object statelong = array[1]; @@ -274,7 +284,7 @@ static Object setstate(VirtualFrame frame, MultibyteIncrementalDecoderObject sel byte[] bufferstr = toBytesNode.execute(frame, buffer); int buffersize = bufferstr.length; if (buffersize > MAXDECPENDING) { - throw raiseNode.get(inliningTarget).raise(UnicodeError, PENDING_BUFFER_TOO_LARGE); + throw raiseNode.raise(inliningTarget, UnicodeError, PENDING_BUFFER_TOO_LARGE); } self.pendingsize = buffersize; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteIncrementalEncoderBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteIncrementalEncoderBuiltins.java index 8b13e3d60d..b71edd6a1a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteIncrementalEncoderBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteIncrementalEncoderBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -50,8 +50,6 @@ import static com.oracle.graal.python.nodes.ErrorMessages.COULDN_T_CONVERT_THE_OBJECT_TO_STR; import static com.oracle.graal.python.nodes.ErrorMessages.PENDING_BUFFER_OVERFLOW; import static com.oracle.graal.python.nodes.ErrorMessages.PENDING_BUFFER_TOO_LARGE; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; import static com.oracle.graal.python.nodes.StringLiterals.T_STRICT; import static com.oracle.graal.python.nodes.StringLiterals.T_UTF8; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; @@ -65,7 +63,11 @@ import java.nio.charset.StandardCharsets; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltins; @@ -74,6 +76,8 @@ import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.ints.IntNodes; import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.lib.PyObjectStrAsObjectNode; import com.oracle.graal.python.lib.PyUnicodeCheckNode; @@ -87,7 +91,7 @@ import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; @@ -107,12 +111,15 @@ public final class MultibyteIncrementalEncoderBuiltins extends PythonBuiltins { private static final int MAXENCPENDING = 2; + public static final TpSlots SLOTS = MultibyteIncrementalEncoderBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return MultibyteIncrementalEncoderBuiltinsFactory.getFactories(); } - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, parameterNames = {"$cls", "errors"}) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, parameterNames = {"$cls", "errors"}) @GenerateNodeFactory protected abstract static class NewNode extends PythonBinaryBuiltinNode { @@ -122,19 +129,20 @@ static Object mbstreamreaderNew(VirtualFrame frame, Object type, Object err, @Cached CastToTruffleStringNode castToStringNode, @Cached PyObjectGetAttr getAttr, @Cached TruffleString.EqualNode isEqual, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { // "|s:IncrementalEncoder" + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Cached PRaiseNode raiseNode) { // "|s:IncrementalEncoder" TruffleString errors = null; if (err != PNone.NO_VALUE) { errors = castToStringNode.execute(inliningTarget, err); } - MultibyteIncrementalEncoderObject self = factory.createMultibyteIncrementalEncoderObject(type); + MultibyteIncrementalEncoderObject self = PFactory.createMultibyteIncrementalEncoderObject(language, type, getInstanceShape.execute(type)); Object codec = getAttr.execute(frame, inliningTarget, type, StringLiterals.T_CODEC); if (!(codec instanceof MultibyteCodecObject)) { - throw raiseNode.get(inliningTarget).raise(TypeError, CODEC_IS_UNEXPECTED_TYPE); + throw raiseNode.raise(inliningTarget, TypeError, CODEC_IS_UNEXPECTED_TYPE); } self.codec = ((MultibyteCodecObject) codec).codec; @@ -145,7 +153,8 @@ static Object mbstreamreaderNew(VirtualFrame frame, Object type, Object err, } } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, parameterNames = {"$self"}) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "MultibyteIncrementalEncoder", minNumOfPositionalArgs = 1, parameterNames = {"$self"}) @GenerateNodeFactory public abstract static class InitNode extends PythonUnaryBuiltinNode { @@ -159,19 +168,17 @@ static PNone init(@SuppressWarnings("unused") MultibyteIncrementalEncoderObject @SuppressWarnings("truffle-inlining") // footprint reduction 44 -> 25 protected abstract static class EncodeStatefulNode extends Node { - abstract Object execute(VirtualFrame frame, MultibyteStatefulEncoderContext ctx, Object unistr, int end, - PythonObjectFactory factory); + abstract Object execute(VirtualFrame frame, MultibyteStatefulEncoderContext ctx, Object unistr, int end); // encoder_encode_stateful @Specialization static Object ts(VirtualFrame frame, MultibyteStatefulEncoderContext ctx, TruffleString ucvt, int end, - PythonObjectFactory factory, @Bind("this") Node inliningTarget, @Exclusive @Cached MultibyteCodecUtil.EncodeNode encodeNode, @Shared @Cached TruffleString.ConcatNode concatNode, @Shared @Cached TruffleString.CodePointLengthNode codePointLengthNode, @Shared @Cached TruffleString.SubstringNode substringNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { TruffleString inbuf = ucvt; TruffleString origpending = null; if (ctx.pending != null) { @@ -183,16 +190,15 @@ static Object ts(VirtualFrame frame, MultibyteStatefulEncoderContext ctx, Truffl int datalen = codePointLengthNode.execute(inbuf, TS_ENCODING); PBytes r; try { - r = encodeEmptyInput(datalen, MBENC_FLUSH | MBENC_RESET, factory); + r = encodeEmptyInput(inliningTarget, datalen, MBENC_FLUSH | MBENC_RESET); if (r == null) { MultibyteEncodeBuffer buf = new MultibyteEncodeBuffer(inbuf); r = encodeNode.execute(frame, inliningTarget, ctx.codec, ctx.state, buf, - ctx.errors, end != 0 ? MBENC_FLUSH | MBENC_RESET : 0, - factory); + ctx.errors, end != 0 ? MBENC_FLUSH | MBENC_RESET : 0); if (buf.getInpos() < datalen) { if (datalen - buf.getInpos() > MAXENCPENDING) { /* normal codecs can't reach here */ - throw raiseNode.get(inliningTarget).raise(UnicodeError, PENDING_BUFFER_OVERFLOW); + throw raiseNode.raise(inliningTarget, UnicodeError, PENDING_BUFFER_OVERFLOW); } ctx.pending = substringNode.execute(inbuf, buf.getInpos(), datalen, TS_ENCODING, false); } @@ -208,7 +214,6 @@ static Object ts(VirtualFrame frame, MultibyteStatefulEncoderContext ctx, Truffl @Specialization(guards = "!isTruffleString(unistr)") static Object notTS(VirtualFrame frame, MultibyteStatefulEncoderContext ctx, Object unistr, int end, - PythonObjectFactory factory, @Bind("this") Node inliningTarget, @Cached PyObjectStrAsObjectNode strNode, @Cached PyUnicodeCheckNode unicodeCheckNode, @@ -217,16 +222,16 @@ static Object notTS(VirtualFrame frame, MultibyteStatefulEncoderContext ctx, Obj @Shared @Cached TruffleString.ConcatNode concatNode, @Shared @Cached TruffleString.CodePointLengthNode codePointLengthNode, @Shared @Cached TruffleString.SubstringNode substringNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { Object ucvt = unistr; if (!unicodeCheckNode.execute(inliningTarget, unistr)) { ucvt = strNode.execute(frame, inliningTarget, unistr); if (!unicodeCheckNode.execute(inliningTarget, unistr)) { - throw raiseNode.get(inliningTarget).raise(TypeError, COULDN_T_CONVERT_THE_OBJECT_TO_STR); + throw raiseNode.raise(inliningTarget, TypeError, COULDN_T_CONVERT_THE_OBJECT_TO_STR); } } TruffleString str = toTruffleStringNode.execute(inliningTarget, ucvt); - return ts(frame, ctx, str, end, factory, inliningTarget, encodeNode, concatNode, codePointLengthNode, substringNode, raiseNode); + return ts(frame, ctx, str, end, inliningTarget, encodeNode, concatNode, codePointLengthNode, substringNode, raiseNode); } } @@ -244,9 +249,8 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static Object encode(VirtualFrame frame, MultibyteStatefulEncoderContext ctx, Object unistr, int end, - @Cached EncodeStatefulNode encodeStatefulNode, - @Cached PythonObjectFactory factory) { - return encodeStatefulNode.execute(frame, ctx, unistr, end, factory); + @Cached EncodeStatefulNode encodeStatefulNode) { + return encodeStatefulNode.execute(frame, ctx, unistr, end); } } @@ -261,7 +265,7 @@ static Object getstate(MultibyteIncrementalEncoderObject self, @Cached HiddenAttr.WriteNode writeHiddenAttrNode, @Cached CodecsModuleBuiltins.CodecsEncodeToJavaBytesNode asUTF8AndSize, @Cached IntNodes.PyLongFromByteArray fromByteArray, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { /* * state made up of 1 byte for buffer size, up to MAXENCPENDING*4 bytes for UTF-8 * encoded buffer (each character can use up to 4 bytes), and required bytes for @@ -276,7 +280,7 @@ static Object getstate(MultibyteIncrementalEncoderObject self, byte[] pendingbuffer = asUTF8AndSize.execute(self.pending, T_UTF8, T_STRICT); int pendingsize = pendingbuffer.length; if (pendingsize > MAXENCPENDING * 4) { - throw raiseNode.get(inliningTarget).raise(UnicodeError, PENDING_BUFFER_TOO_LARGE); + throw raiseNode.raise(inliningTarget, UnicodeError, PENDING_BUFFER_TOO_LARGE); } statebytes[0] = (byte) pendingsize; PythonUtils.arraycopy(pendingbuffer, 0, statebytes, 1, pendingsize); @@ -303,13 +307,13 @@ static Object setstate(MultibyteIncrementalEncoderObject self, PInt statelong, @Bind("this") Node inliningTarget, @Cached HiddenAttr.ReadNode readHiddenAttrNode, @Cached IntNodes.PyLongAsByteArray asByteArray, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int sizeOfStateBytes = 1 + MAXENCPENDING * 4 + MULTIBYTECODECSTATE; byte[] statebytes = asByteArray.execute(inliningTarget, statelong, sizeOfStateBytes, false); if (statebytes[0] > MAXENCPENDING * 4) { - throw raiseNode.get(inliningTarget).raise(UnicodeError, PENDING_BUFFER_TOO_LARGE); + throw raiseNode.raise(inliningTarget, UnicodeError, PENDING_BUFFER_TOO_LARGE); } self.pending = decodeUTF8(statebytes, 1, statebytes[0]); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteStreamReaderBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteStreamReaderBuiltins.java index 3603962382..bca771eabb 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteStreamReaderBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteStreamReaderBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,15 +46,17 @@ import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibyteIncrementalDecoderBuiltins.DecodeNode.decoderFeedBuffer; import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.MBERR_TOOFEW; import static com.oracle.graal.python.nodes.ErrorMessages.CODEC_IS_UNEXPECTED_TYPE; -import static com.oracle.graal.python.nodes.ErrorMessages.STREAM_FUNCTION_RETURNED_A_NON_BYTES_OBJECT_S; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; +import static com.oracle.graal.python.nodes.ErrorMessages.STREAM_FUNCTION_RETURNED_A_NON_BYTES_OBJECT_P; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltins; @@ -62,6 +64,7 @@ import com.oracle.graal.python.builtins.objects.bytes.BytesNodes; import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.str.StringBuiltins; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyBytesCheckNode; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; @@ -74,9 +77,8 @@ import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -91,12 +93,15 @@ @CoreFunctions(extendClasses = MultibyteStreamReader) public final class MultibyteStreamReaderBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = MultibyteStreamReaderBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return MultibyteStreamReaderBuiltinsFactory.getFactories(); } - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 2, parameterNames = {"$cls", "stream", "errors"}) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 2, parameterNames = {"$cls", "stream", "errors"}) @GenerateNodeFactory protected abstract static class NewNode extends PythonTernaryBuiltinNode { @@ -106,18 +111,19 @@ static Object mbstreamreaderNew(VirtualFrame frame, Object type, Object stream, @Cached CastToTruffleStringNode castToStringNode, @Cached PyObjectGetAttr getAttr, @Cached TruffleString.EqualNode isEqual, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { // "O|s:StreamReader" + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Cached PRaiseNode raiseNode) { // "O|s:StreamReader" TruffleString errors = null; if (err != PNone.NO_VALUE) { errors = castToStringNode.execute(inliningTarget, err); } - MultibyteStreamReaderObject self = factory.createMultibyteStreamReaderObject(type); + MultibyteStreamReaderObject self = PFactory.createMultibyteStreamReaderObject(language, type, getInstanceShape.execute(type)); Object codec = getAttr.execute(frame, inliningTarget, type, StringLiterals.T_CODEC); if (!(codec instanceof MultibyteCodecObject)) { - throw raiseNode.get(inliningTarget).raise(TypeError, CODEC_IS_UNEXPECTED_TYPE); + throw raiseNode.raise(inliningTarget, TypeError, CODEC_IS_UNEXPECTED_TYPE); } self.codec = ((MultibyteCodecObject) codec).codec; @@ -129,7 +135,8 @@ static Object mbstreamreaderNew(VirtualFrame frame, Object type, Object stream, } } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, parameterNames = {"$self"}) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "MultibyteStreamReader", minNumOfPositionalArgs = 1, parameterNames = {"$self"}) @GenerateNodeFactory public abstract static class InitNode extends PythonUnaryBuiltinNode { @@ -149,12 +156,10 @@ abstract static class IReadNode extends PNodeWithContext { static TruffleString iread(VirtualFrame frame, MultibyteStreamReaderObject self, TruffleString method, long sizehint, @Bind("this") Node inliningTarget, @Cached PyObjectCallMethodObjArgs callMethod, - @Cached GetClassNode getClassNode, @Cached PyBytesCheckNode bytesCheckNode, @Cached BytesNodes.ToBytesNode toBytesNode, - @Cached TypeNodes.GetNameNode getNameNode, @Cached MultibyteCodecUtil.DecodeErrorNode decodeErrorNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (sizehint == 0) { return T_EMPTY_STRING; @@ -169,9 +174,8 @@ static TruffleString iread(VirtualFrame frame, MultibyteStreamReaderObject self, } if (!(cres instanceof PBytes)) { - Object crestType = getClassNode.execute(inliningTarget, cres); - if (!bytesCheckNode.execute(inliningTarget, crestType)) { - throw raiseNode.get(inliningTarget).raise(TypeError, STREAM_FUNCTION_RETURNED_A_NON_BYTES_OBJECT_S, getNameNode.execute(inliningTarget, cres)); + if (!bytesCheckNode.execute(inliningTarget, cres)) { + throw raiseNode.raise(inliningTarget, TypeError, STREAM_FUNCTION_RETURNED_A_NON_BYTES_OBJECT_P, cres); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteStreamWriterBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteStreamWriterBuiltins.java index 22cabe1b6c..6a9caa43ce 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteStreamWriterBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibyteStreamWriterBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,14 +47,16 @@ import static com.oracle.graal.python.builtins.modules.cjkcodecs.MultibytecodecModuleBuiltins.MBENC_FLUSH; import static com.oracle.graal.python.nodes.ErrorMessages.ARG_MUST_BE_A_SEQUENCE_OBJECT; import static com.oracle.graal.python.nodes.ErrorMessages.CODEC_IS_UNEXPECTED_TYPE; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltins; @@ -62,6 +64,8 @@ import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.common.SequenceNodes; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.nodes.PRaiseNode; @@ -71,7 +75,7 @@ import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.PSequence; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.dsl.Bind; @@ -87,6 +91,8 @@ @CoreFunctions(extendClasses = MultibyteStreamWriter) public final class MultibyteStreamWriterBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = MultibyteStreamWriterBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return MultibyteStreamWriterBuiltinsFactory.getFactories(); @@ -94,7 +100,8 @@ protected List> getNodeFa private static final TruffleString WRITE = tsLiteral("write"); - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory protected abstract static class NewNode extends PythonBuiltinNode { @@ -104,18 +111,19 @@ static Object mbstreamwriterNew(VirtualFrame frame, Object type, Object stream, @Cached CastToTruffleStringNode castToStringNode, @Cached PyObjectGetAttr getAttr, @Cached TruffleString.EqualNode isEqual, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { // "O|s:StreamWriter" + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Cached PRaiseNode raiseNode) { // "O|s:StreamWriter" TruffleString errors = null; if (err != PNone.NO_VALUE) { errors = castToStringNode.execute(inliningTarget, err); } - MultibyteStreamWriterObject self = factory.createMultibyteStreamWriterObject(type); + MultibyteStreamWriterObject self = PFactory.createMultibyteStreamWriterObject(language, type, getInstanceShape.execute(type)); Object codec = getAttr.execute(frame, inliningTarget, type, StringLiterals.T_CODEC); if (!(codec instanceof MultibyteCodecObject)) { - throw raiseNode.get(inliningTarget).raise(TypeError, CODEC_IS_UNEXPECTED_TYPE); + throw raiseNode.raise(inliningTarget, TypeError, CODEC_IS_UNEXPECTED_TYPE); } self.codec = ((MultibyteCodecObject) codec).codec; @@ -128,7 +136,8 @@ static Object mbstreamwriterNew(VirtualFrame frame, Object type, Object stream, } } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, parameterNames = {"$self"}) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "MultibyteStreamWriter", minNumOfPositionalArgs = 1, parameterNames = {"$self"}) @GenerateNodeFactory public abstract static class InitNode extends PythonUnaryBuiltinNode { @@ -147,10 +156,9 @@ abstract static class WriteNode extends PythonBinaryBuiltinNode { static Object write(VirtualFrame frame, MultibyteStreamWriterObject self, Object strobj, @Bind("this") Node inliningTarget, @Cached MultibyteIncrementalEncoderBuiltins.EncodeStatefulNode encodeStatefulNode, - @Cached PyObjectCallMethodObjArgs callMethod, - @Cached PythonObjectFactory factory) { + @Cached PyObjectCallMethodObjArgs callMethod) { // mbstreamwriter_iwrite - Object str = encodeStatefulNode.execute(frame, self, strobj, 0, factory); + Object str = encodeStatefulNode.execute(frame, self, strobj, 0); callMethod.execute(frame, inliningTarget, self.stream, WRITE, str); return PNone.NONE; } @@ -167,15 +175,14 @@ static Object writelines(VirtualFrame frame, MultibyteStreamWriterObject self, P @Cached MultibyteIncrementalEncoderBuiltins.EncodeStatefulNode encodeStatefulNode, @Cached SequenceNodes.GetSequenceStorageNode getStorage, @Cached SequenceStorageNodes.GetItemNode getItem, - @Cached PyObjectCallMethodObjArgs callMethod, - @Cached PythonObjectFactory factory) { + @Cached PyObjectCallMethodObjArgs callMethod) { SequenceStorage sq = getStorage.execute(inliningTarget, lines); for (int i = 0; i < sq.length(); i++) { /* length can be changed even within this loop */ Object strobj = getItem.execute(sq, i); // mbstreamwriter_iwrite - Object str = encodeStatefulNode.execute(frame, self, strobj, 0, factory); + Object str = encodeStatefulNode.execute(frame, self, strobj, 0); callMethod.execute(frame, inliningTarget, self.stream, WRITE, str); } return PNone.NONE; @@ -184,8 +191,8 @@ static Object writelines(VirtualFrame frame, MultibyteStreamWriterObject self, P // assuming !pySequenceCheck.execute(lines) @Fallback static Object writelines(@SuppressWarnings("unused") Object self, @SuppressWarnings("unused") Object lines, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ARG_MUST_BE_A_SEQUENCE_OBJECT); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ARG_MUST_BE_A_SEQUENCE_OBJECT); } } @@ -199,18 +206,16 @@ static Object reset(VirtualFrame frame, MultibyteStreamWriterObject self, @Bind("this") Node inliningTarget, @Cached PyObjectCallMethodObjArgs callMethod, @Cached TruffleString.CodePointLengthNode codePointLengthNode, - @Cached MultibyteCodecUtil.EncodeNode encodeNode, - @Cached PythonObjectFactory factory) { + @Cached MultibyteCodecUtil.EncodeNode encodeNode) { if (self.pending == null) { return PNone.NONE; } int datalen = codePointLengthNode.execute(self.pending, TS_ENCODING); - PBytes pwrt = encodeEmptyInput(datalen, MBENC_FLUSH | MBENC_RESET, factory); + PBytes pwrt = encodeEmptyInput(inliningTarget, datalen, MBENC_FLUSH | MBENC_RESET); if (pwrt == null) { MultibyteEncodeBuffer buf = new MultibyteEncodeBuffer(self.pending); pwrt = encodeNode.execute(frame, inliningTarget, self.codec, self.state, buf, - self.errors, MBENC_FLUSH | MBENC_RESET, - factory); + self.errors, MBENC_FLUSH | MBENC_RESET); } /* * some pending buffer can be truncated when UnicodeEncodeError is raised on 'strict' diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibytecodecModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibytecodecModuleBuiltins.java index b12c885d96..0089eb2fcb 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibytecodecModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cjkcodecs/MultibytecodecModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,26 +46,23 @@ import static com.oracle.graal.python.nodes.StringLiterals.T_STRICT; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; -import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.nio.charset.Charset; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.modules.cext.PythonCextCapsuleBuiltins.PyCapsule_IsValid; import com.oracle.graal.python.builtins.modules.cjkcodecs.DBCSMap.MappingType; import com.oracle.graal.python.builtins.modules.cjkcodecs.MultibyteCodec.CodecType; import com.oracle.graal.python.builtins.objects.capsule.PyCapsule; -import com.oracle.graal.python.builtins.objects.capsule.PyCapsuleNameMatchesNode; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.CharsetMapping; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -80,7 +77,7 @@ @CoreFunctions(defineModule = "_multibytecodec") public final class MultibytecodecModuleBuiltins extends PythonBuiltins { - static final TruffleString PyMultibyteCodec_CAPSULE_NAME = tsLiteral("multibytecodec.__map_*"); + static final byte[] PyMultibyteCodec_CAPSULE_NAME = PyCapsule.capsuleName("multibytecodec.__map_*"); /** insufficient output buffer space */ protected static final int MBERR_TOOSMALL = -1; /** incomplete input buffer */ @@ -102,7 +99,7 @@ protected List> getNodeFa protected static void registerCodec(String name, int cidx, CodecType ct, int midx, MappingType mt, DBCSMap[] maps, MultibyteCodec[] codecs, - PythonModule codec, PythonObjectFactory factory) { + PythonModule codec, PythonLanguage language) { TruffleString tsName = toTruffleStringUncached(name); TruffleString normalizedEncoding = CharsetMapping.normalizeUncached(tsName); Charset charset = CharsetMapping.getCharsetNormalized(normalizedEncoding); @@ -113,7 +110,7 @@ protected static void registerCodec(String name, int cidx, CodecType ct, int mid if (midx != -1) { DBCSMap h = maps[midx] = new DBCSMap(name, tsName, charset, mt); codec.setAttribute(toTruffleStringUncached(h.charsetMapName), - factory.createCapsule(h, PyMultibyteCodec_CAPSULE_NAME)); + PFactory.createCapsuleJavaName(language, h, PyMultibyteCodec_CAPSULE_NAME)); } } } @@ -130,29 +127,25 @@ abstract static class CreateCodecNode extends PythonUnaryBuiltinNode { @Specialization static Object createCodec(PyCapsule arg, @Bind("this") Node inliningTarget, - @Cached PyCapsuleNameMatchesNode nameMatchesNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - return createCodec(inliningTarget, arg, nameMatchesNode, factory, raiseNode); + @Cached PRaiseNode raiseNode) { + return createCodec(inliningTarget, arg, raiseNode); } static Object createCodec(Node inliningTarget, PyCapsule arg, - PyCapsuleNameMatchesNode nameMatchesNode, - PythonObjectFactory factory, - PRaiseNode.Lazy raiseNode) { - if (PyCapsule_IsValid.doCapsule(arg, PyMultibyteCodec_CAPSULE_NAME, inliningTarget, nameMatchesNode) == 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ARGUMENT_TYPE_INVALID); + PRaiseNode raiseNode) { + if (!PyCapsule.capsuleJavaNameIs(arg, PyMultibyteCodec_CAPSULE_NAME)) { + throw raiseNode.raise(inliningTarget, ValueError, ARGUMENT_TYPE_INVALID); } MultibyteCodec codec; codec = (MultibyteCodec) arg.getPointer(); codec.codecinit(); - return factory.createMultibyteCodecObject(PythonBuiltinClassType.MultibyteCodec, codec); + return PFactory.createMultibyteCodecObject(PythonLanguage.get(inliningTarget), codec); } @Fallback static Object createCodec(@SuppressWarnings("unused") VirtualFrame frame, @SuppressWarnings("unused") Object arg, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ARGUMENT_TYPE_INVALID); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ARGUMENT_TYPE_INVALID); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/CharmapNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/CharmapNodes.java index 6eae0678b2..813b5abc0e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/CharmapNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/CharmapNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -83,7 +83,7 @@ import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.ByteArrayBuilder; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -120,11 +120,10 @@ static Object doIt(VirtualFrame frame, Node inliningTarget, TruffleString map, @Cached(inline = false) TruffleString.CodePointLengthNode codePointLengthNode, @Cached(inline = false) TruffleString.CodePointAtIndexNode codePointAtIndexNode, @Cached(inline = false) HashingStorageSetItem setItemNode, - @Cached PRaiseNode.Lazy raiseNode, - @Cached(inline = false) PythonObjectFactory factory) { + @Cached PRaiseNode raiseNode) { int len = Math.min(codePointLengthNode.execute(map, TS_ENCODING), 256); if (len == 0) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP); } byte[] level1 = new byte[32]; byte[] level2 = new byte[512]; @@ -134,12 +133,12 @@ static Object doIt(VirtualFrame frame, Node inliningTarget, TruffleString map, Arrays.fill(level1, (byte) 0xFF); Arrays.fill(level2, (byte) 0xFF); if (codePointAtIndexNode.execute(map, 0, TS_ENCODING, ErrorHandling.BEST_EFFORT) != 0) { - return doDict(frame, inliningTarget, map, len, codePointAtIndexNode, setItemNode, factory); + return doDict(frame, inliningTarget, map, len, codePointAtIndexNode, setItemNode); } for (int i = 1; i < len; ++i) { int cp = codePointAtIndexNode.execute(map, i, TS_ENCODING, ErrorHandling.BEST_EFFORT); if (cp == 0 || cp > 0xFFFF) { - return doDict(frame, inliningTarget, map, len, codePointAtIndexNode, setItemNode, factory); + return doDict(frame, inliningTarget, map, len, codePointAtIndexNode, setItemNode); } if (cp == 0xFFFE) { continue; @@ -154,7 +153,7 @@ static Object doIt(VirtualFrame frame, Node inliningTarget, TruffleString map, } } if (count2 >= 0xFF || count3 >= 0xFF) { - return doDict(frame, inliningTarget, map, len, codePointAtIndexNode, setItemNode, factory); + return doDict(frame, inliningTarget, map, len, codePointAtIndexNode, setItemNode); } byte[] level23 = new byte[16 * count2 + 128 * count3]; @@ -176,17 +175,16 @@ static Object doIt(VirtualFrame frame, Node inliningTarget, TruffleString map, int i3 = 128 * (level23[i2] & 0xFF) + o3; level23[l3Start + i3] = (byte) i; } - return factory.createEncodingMap(count2, count3, level1, level23); + return PFactory.createEncodingMap(PythonLanguage.get(inliningTarget), count2, count3, level1, level23); } - private static Object doDict(VirtualFrame frame, Node inliningTarget, TruffleString map, int len, TruffleString.CodePointAtIndexNode codePointAtIndexNode, HashingStorageSetItem setItemNode, - PythonObjectFactory factory) { + private static Object doDict(VirtualFrame frame, Node inliningTarget, TruffleString map, int len, TruffleString.CodePointAtIndexNode codePointAtIndexNode, HashingStorageSetItem setItemNode) { HashingStorage store = PDict.createNewStorage(len); for (int i = 0; i < len; ++i) { int cp = codePointAtIndexNode.execute(map, i, TS_ENCODING, ErrorHandling.BEST_EFFORT); store = setItemNode.execute(frame, inliningTarget, store, cp, i); } - return factory.createDict(store); + return PFactory.createDict(PythonLanguage.get(inliningTarget), store); } } @@ -198,9 +196,9 @@ public abstract static class PyUnicodeEncodeCharmapNode extends Node { @Specialization static byte[] doLatin1(TruffleString src, TruffleString errors, PNone mapping, - @Cached(inline = false) PRaiseNode raiseNode) { + @Bind("this") Node inliningTarget) { // TODO latin1 - throw raiseNode.raise(NotImplementedError, toTruffleStringUncached("latin1")); + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, toTruffleStringUncached("latin1")); } @Fallback @@ -330,7 +328,7 @@ static Object doIt(VirtualFrame frame, Node inliningTarget, int cp, Object mappi @Cached PyLongCheckNode pyLongCheckNode, @Cached PyLongAsLongNode pyLongAsLongNode, @Cached PyBytesCheckNode pyBytesCheckNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object item; try { item = pyObjectGetItemNode.execute(frame, inliningTarget, mapping, cp); @@ -344,14 +342,14 @@ static Object doIt(VirtualFrame frame, Node inliningTarget, int cp, Object mappi if (pyLongCheckNode.execute(inliningTarget, item)) { long value = pyLongAsLongNode.execute(frame, inliningTarget, item); if (value < 0 || value > 255) { - raiseNode.get(inliningTarget).raise(TypeError, CHARACTER_MAPPING_MUST_BE_IN_RANGE_256); + raiseNode.raise(inliningTarget, TypeError, CHARACTER_MAPPING_MUST_BE_IN_RANGE_256); } return value; } if (pyBytesCheckNode.execute(inliningTarget, item)) { return item; } - throw raiseNode.get(inliningTarget).raise(TypeError, CHARACTER_MAPPING_MUST_RETURN_INT_BYTES_OR_NONE_NOT_P, item); + throw raiseNode.raise(inliningTarget, TypeError, CHARACTER_MAPPING_MUST_RETURN_INT_BYTES_OR_NONE_NOT_P, item); } } @@ -364,14 +362,16 @@ public abstract static class PyUnicodeDecodeCharmapNode extends PNodeWithContext public abstract TruffleString execute(VirtualFrame frame, Object data, TruffleString errors, Object mapping); @Specialization(limit = "3") - TruffleString decodeLatin1(VirtualFrame frame, Object data, @SuppressWarnings("unused") TruffleString errors, @SuppressWarnings("unused") PNone mapping, + static TruffleString decodeLatin1(VirtualFrame frame, Object data, @SuppressWarnings("unused") TruffleString errors, @SuppressWarnings("unused") PNone mapping, + @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Shared @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("data") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "3") @Shared PythonBufferAccessLibrary bufferLib, @Cached TruffleString.FromByteArrayNode fromByteArrayNode, @Cached TruffleString.SwitchEncodingNode switchEncodingNode) { // equivalent of PyUnicode_DecodeLatin1 - Object dataBuffer = bufferAcquireLib.acquireReadonly(data, frame, getContext(), getLanguage(), indirectCallData); + Object dataBuffer = bufferAcquireLib.acquireReadonly(data, frame, context, context.getLanguage(inliningTarget), indirectCallData); try { int len = bufferLib.getBufferLength(dataBuffer); byte[] src = bufferLib.getInternalOrCopiedByteArray(dataBuffer); @@ -398,7 +398,7 @@ static TruffleString decodeStringMapping(VirtualFrame frame, Object data, Truffl @Cached @Exclusive CallDecodingErrorHandlerNode callErrorHandlerNode) { // equivalent of charmap_decode_string PythonContext context = PythonContext.get(inliningTarget); - PythonLanguage language = PythonLanguage.get(inliningTarget); + PythonLanguage language = context.getLanguage(inliningTarget); ErrorHandlerCache cache = new ErrorHandlerCache(); Object srcObj = data; @@ -463,10 +463,10 @@ static TruffleString decodeGenericMapping(VirtualFrame frame, Object data, Truff @Cached InlinedConditionProfile longValuesProfile, @Cached InlinedConditionProfile strValuesProfile, @Cached InlinedConditionProfile errProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { // equivalent of charmap_decode_mapping PythonContext context = PythonContext.get(inliningTarget); - PythonLanguage language = PythonLanguage.get(inliningTarget); + PythonLanguage language = context.getLanguage(inliningTarget); ErrorHandlerCache cache = new ErrorHandlerCache(); Object srcObj = data; @@ -501,7 +501,7 @@ static TruffleString decodeGenericMapping(VirtualFrame frame, Object data, Truff break; } if (value < 0 || value > Character.MAX_CODE_POINT) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CHARACTER_MAPPING_MUST_BE_IN_RANGE, PInt.toHexString(Character.MAX_CODE_POINT + 1)); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CHARACTER_MAPPING_MUST_BE_IN_RANGE, PInt.toHexString(Character.MAX_CODE_POINT + 1)); } else { appendCodePointNode.execute(tsb, (int) value, 1, true); } @@ -518,7 +518,7 @@ static TruffleString decodeGenericMapping(VirtualFrame frame, Object data, Truff appendStringNode.execute(tsb, castToTruffleStringNode.execute(inliningTarget, item)); } } else { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CHARACTER_MAPPING_MUST_RETURN_INT_NONE_OR_STR); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CHARACTER_MAPPING_MUST_RETURN_INT_NONE_OR_STR); } } } finally { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/CodecsRegistry.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/CodecsRegistry.java index 205bbde344..66ff758337 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/CodecsRegistry.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/CodecsRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -93,7 +93,7 @@ public abstract static class PyCodecLookupErrorNode extends Node { @Specialization static Object lookup(Node inliningTarget, TruffleString name, @Cached InlinedConditionProfile resultProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { PythonContext context = PythonContext.get(inliningTarget); ensureRegistryInitialized(context); if (name == null) { @@ -101,7 +101,7 @@ static Object lookup(Node inliningTarget, TruffleString name, } Object result = getErrorHandler(context, name); if (resultProfile.profile(inliningTarget, result == null)) { - throw raiseNode.get(inliningTarget).raise(LookupError, UNKNOWN_ERROR_HANDLER, name); + throw raiseNode.raise(inliningTarget, LookupError, UNKNOWN_ERROR_HANDLER, name); } return result; } @@ -124,9 +124,8 @@ static void register(Node inliningTarget, TruffleString name, Object handler, @Specialization(guards = "!callableCheckNode.execute(inliningTarget, handler)") static void registerNoCallable(@SuppressWarnings("unused") Node inliningTarget, @SuppressWarnings("unused") TruffleString name, @SuppressWarnings("unused") Object handler, - @SuppressWarnings("unused") @Cached @Shared("callableCheck") PyCallableCheckNode callableCheckNode, - @Cached(inline = false) PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, HANDLER_MUST_BE_CALLABLE); + @SuppressWarnings("unused") @Cached @Shared("callableCheck") PyCallableCheckNode callableCheckNode) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, HANDLER_MUST_BE_CALLABLE); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/ErrorHandlers.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/ErrorHandlers.java index 3dec02aeec..112036bd11 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/ErrorHandlers.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/ErrorHandlers.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -60,6 +60,7 @@ import java.nio.ByteOrder; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.modules.codecs.CodecsRegistry.PyCodecLookupErrorNode; @@ -91,7 +92,7 @@ import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.ValueType; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -257,8 +258,8 @@ static boolean isNeither(Node inliningTarget, Object o, PyObjectTypeCheck pyObje return !isDecode(inliningTarget, o, pyObjectTypeCheck) && !isEncode(inliningTarget, o, pyObjectTypeCheck) && !isTranslate(inliningTarget, o, pyObjectTypeCheck); } - static PException wrongExceptionType(Object o, PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.DONT_KNOW_HOW_TO_HANDLE_P_IN_ERROR_CALLBACK, o); + static PException wrongExceptionType(Node inliningTarget, Object o) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.DONT_KNOW_HOW_TO_HANDLE_P_IN_ERROR_CALLBACK, o); } } @@ -267,14 +268,14 @@ static PException wrongExceptionType(Object o, PRaiseNode raiseNode) { abstract static class StrictErrorHandlerNode extends ErrorHandlerBaseNode { @Specialization static Object doException(PBaseException exception, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raiseExceptionObject(exception); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseExceptionObject(inliningTarget, exception); } @Fallback static Object doFallback(@SuppressWarnings("unused") Object o, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CODEC_MUST_PASS_EXCEPTION_INSTANCE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CODEC_MUST_PASS_EXCEPTION_INSTANCE); } } @@ -284,27 +285,26 @@ abstract static class IgnoreErrorHandlerNode extends ErrorHandlerBaseNode { @Specialization(guards = "isDecode(inliningTarget, exception, pyObjectTypeCheck)", limit = "1") static Object doDecodeException(PBaseException exception, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck, - @Cached PyUnicodeDecodeErrorGetEndNode getEndNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createTuple(new Object[]{T_EMPTY_STRING, getEndNode.execute(inliningTarget, exception)}); + @Cached PyUnicodeDecodeErrorGetEndNode getEndNode) { + return PFactory.createTuple(language, new Object[]{T_EMPTY_STRING, getEndNode.execute(inliningTarget, exception)}); } @Specialization(guards = "isEncodeOrTranslate(inliningTarget, exception, pyObjectTypeCheck)", limit = "1") static Object doEncodeOrTranslateException(PBaseException exception, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck, - @Cached PyUnicodeEncodeOrTranslateErrorGetEndNode getEndNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createTuple(new Object[]{T_EMPTY_STRING, getEndNode.execute(inliningTarget, exception)}); + @Cached PyUnicodeEncodeOrTranslateErrorGetEndNode getEndNode) { + return PFactory.createTuple(language, new Object[]{T_EMPTY_STRING, getEndNode.execute(inliningTarget, exception)}); } @Specialization(guards = "isNeither(inliningTarget, o, pyObjectTypeCheck)", limit = "1") static Object doFallback(Object o, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck, - @Cached PRaiseNode raiseNode) { - throw wrongExceptionType(o, raiseNode); + @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck) { + throw wrongExceptionType(inliningTarget, o); } } @@ -317,35 +317,34 @@ abstract static class ReplaceErrorHandlerNode extends ErrorHandlerBaseNode { @Specialization(guards = "isDecode(inliningTarget, exception, pyObjectTypeCheck)", limit = "1") static Object doDecodeException(PBaseException exception, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck, - @Cached PyUnicodeDecodeErrorGetEndNode getEndNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createTuple(new Object[]{T_REPLACEMENT, getEndNode.execute(inliningTarget, exception)}); + @Cached PyUnicodeDecodeErrorGetEndNode getEndNode) { + return PFactory.createTuple(language, new Object[]{T_REPLACEMENT, getEndNode.execute(inliningTarget, exception)}); } @Specialization(guards = "isEncodeOrTranslate(inliningTarget, exception, pyObjectTypeCheck)", limit = "1") static Object doEncodeOrTranslateException(PBaseException exception, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck, @Cached PyUnicodeEncodeOrTranslateErrorGetStartNode getStartNode, @Cached PyUnicodeEncodeOrTranslateErrorGetEndNode getEndNode, - @Cached TruffleString.RepeatNode repeatNode, - @Shared @Cached PythonObjectFactory factory) { + @Cached TruffleString.RepeatNode repeatNode) { TruffleString replacement = isEncode(inliningTarget, exception, pyObjectTypeCheck) ? T_QUESTIONMARK : T_REPLACEMENT; int start = getStartNode.execute(inliningTarget, exception); int end = getEndNode.execute(inliningTarget, exception); int n = end - start; // CPython raises SystemError for negative values, we return an empty string TruffleString result = n < 1 ? T_EMPTY_STRING : repeatNode.execute(replacement, n, TS_ENCODING); - return factory.createTuple(new Object[]{result, end}); + return PFactory.createTuple(language, new Object[]{result, end}); } @Specialization(guards = "isNeither(inliningTarget, o, pyObjectTypeCheck)", limit = "1") static Object doFallback(Object o, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck, - @Cached PRaiseNode raiseNode) { - throw wrongExceptionType(o, raiseNode); + @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck) { + throw wrongExceptionType(inliningTarget, o); } } @@ -356,14 +355,14 @@ abstract static class XmlCharRefReplaceErrorHandlerNode extends ErrorHandlerBase @Specialization(guards = "isEncode(inliningTarget, exception, pyObjectTypeCheck)", limit = "1") static Object doEncode(PBaseException exception, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck, @Cached PyUnicodeEncodeOrTranslateErrorGetObjectNode getObjectNode, @Cached PyUnicodeEncodeOrTranslateErrorGetStartNode getStartNode, @Cached PyUnicodeEncodeOrTranslateErrorGetEndNode getEndNode, @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode, @Cached TruffleString.FromByteArrayNode fromByteArrayNode, - @Cached TruffleString.SwitchEncodingNode switchEncodingNode, - @Cached PythonObjectFactory factory) { + @Cached TruffleString.SwitchEncodingNode switchEncodingNode) { TruffleString src = getObjectNode.execute(inliningTarget, exception); int start = getStartNode.execute(inliningTarget, exception); int end = getEndNode.execute(inliningTarget, exception); @@ -377,15 +376,14 @@ static Object doEncode(PBaseException exception, pos = appendXmlCharRefReplacement(replacement, pos, codePointAtIndexNode.execute(src, i, TS_ENCODING, ErrorHandling.BEST_EFFORT)); } TruffleString resultAscii = fromByteArrayNode.execute(replacement, Encoding.US_ASCII, false); - return factory.createTuple(new Object[]{switchEncodingNode.execute(resultAscii, TS_ENCODING), end}); + return PFactory.createTuple(language, new Object[]{switchEncodingNode.execute(resultAscii, TS_ENCODING), end}); } @Specialization(guards = "!isEncode(inliningTarget, o, pyObjectTypeCheck)", limit = "1") static Object doFallback(Object o, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck, - @Cached PRaiseNode raiseNode) { - throw wrongExceptionType(o, raiseNode); + @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck) { + throw wrongExceptionType(inliningTarget, o); } } @@ -396,6 +394,7 @@ abstract static class BackslashReplaceErrorHandlerNode extends ErrorHandlerBaseN @Specialization(guards = "isDecode(inliningTarget, exception, pyObjectTypeCheck)", limit = "1") static Object doDecodeException(VirtualFrame frame, PBaseException exception, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached("createFor(this)") IndirectCallData indirectCallData, @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck, @Cached PyUnicodeDecodeErrorGetObjectNode getObjectNode, @@ -404,13 +403,12 @@ static Object doDecodeException(VirtualFrame frame, PBaseException exception, @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib, @CachedLibrary(limit = "3") PythonBufferAccessLibrary accessLib, @Cached @Shared TruffleString.FromByteArrayNode fromByteArrayNode, - @Cached @Shared TruffleString.SwitchEncodingNode switchEncodingNode, - @Shared @Cached PythonObjectFactory factory) { + @Cached @Shared TruffleString.SwitchEncodingNode switchEncodingNode) { int start = getStartNode.execute(inliningTarget, exception); int end = getEndNode.execute(inliningTarget, exception); Object object = getObjectNode.execute(inliningTarget, exception); if (start >= end) { - return factory.createTuple(new Object[]{T_EMPTY_STRING, end}); + return PFactory.createTuple(language, new Object[]{T_EMPTY_STRING, end}); } byte[] replacement = new byte[4 * (end - start)]; int pos = 0; @@ -424,25 +422,25 @@ static Object doDecodeException(VirtualFrame frame, PBaseException exception, accessLib.release(srcBuf, frame, indirectCallData); } TruffleString resultAscii = fromByteArrayNode.execute(replacement, Encoding.US_ASCII, false); - return factory.createTuple(new Object[]{switchEncodingNode.execute(resultAscii, TS_ENCODING), end}); + return PFactory.createTuple(language, new Object[]{switchEncodingNode.execute(resultAscii, TS_ENCODING), end}); } @Specialization(guards = "isEncodeOrTranslate(inliningTarget, exception, pyObjectTypeCheck)", limit = "1") static Object doEncodeOrTranslateException(PBaseException exception, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck, @Cached PyUnicodeEncodeOrTranslateErrorGetObjectNode getObjectNode, @Cached PyUnicodeEncodeOrTranslateErrorGetStartNode getStartNode, @Cached PyUnicodeEncodeOrTranslateErrorGetEndNode getEndNode, @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode, @Cached @Shared TruffleString.FromByteArrayNode fromByteArrayNode, - @Cached @Shared TruffleString.SwitchEncodingNode switchEncodingNode, - @Shared @Cached PythonObjectFactory factory) { + @Cached @Shared TruffleString.SwitchEncodingNode switchEncodingNode) { int start = getStartNode.execute(inliningTarget, exception); int end = getEndNode.execute(inliningTarget, exception); TruffleString src = getObjectNode.execute(inliningTarget, exception); if (start >= end) { - return factory.createTuple(new Object[]{T_EMPTY_STRING, end}); + return PFactory.createTuple(language, new Object[]{T_EMPTY_STRING, end}); } int len = 0; for (int i = start; i < end; ++i) { @@ -462,15 +460,14 @@ static Object doEncodeOrTranslateException(PBaseException exception, pos = BytesUtils.unicodeNonAsciiEscape(cp, pos, replacement, true); } TruffleString resultAscii = fromByteArrayNode.execute(replacement, Encoding.US_ASCII, false); - return factory.createTuple(new Object[]{switchEncodingNode.execute(resultAscii, TS_ENCODING), end}); + return PFactory.createTuple(language, new Object[]{switchEncodingNode.execute(resultAscii, TS_ENCODING), end}); } @Specialization(guards = "isNeither(inliningTarget, o, pyObjectTypeCheck)", limit = "1") static Object doFallback(Object o, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck, - @Cached PRaiseNode raiseNode) { - throw wrongExceptionType(o, raiseNode); + @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck) { + throw wrongExceptionType(inliningTarget, o); } } @@ -481,6 +478,7 @@ abstract static class NameReplaceErrorHandlerNode extends ErrorHandlerBaseNode { @Specialization(guards = "isEncode(inliningTarget, exception, pyObjectTypeCheck)", limit = "1") static Object doEncode(PBaseException exception, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck, @Cached PyUnicodeEncodeOrTranslateErrorGetObjectNode getObjectNode, @Cached PyUnicodeEncodeOrTranslateErrorGetStartNode getStartNode, @@ -491,13 +489,12 @@ static Object doEncode(PBaseException exception, @Cached TruffleString.FromJavaStringNode fromJavaStringNode, @Cached TruffleStringBuilder.AppendStringNode appendStringNode, @Cached TruffleStringBuilder.AppendCodePointNode appendCodePointNode, - @Cached TruffleStringBuilder.ToStringNode toStringNode, - @Cached PythonObjectFactory factory) { + @Cached TruffleStringBuilder.ToStringNode toStringNode) { TruffleString src = getObjectNode.execute(inliningTarget, exception); int start = getStartNode.execute(inliningTarget, exception); int end = getEndNode.execute(inliningTarget, exception); if (start >= end) { - return factory.createTuple(new Object[]{T_EMPTY_STRING, start}); + return PFactory.createTuple(language, new Object[]{T_EMPTY_STRING, start}); } TruffleStringBuilder tsb = TruffleStringBuilder.create(TS_ENCODING); byte[] buf = new byte[1 + 1 + 8]; // \UNNNNNNNN @@ -515,15 +512,14 @@ static Object doEncode(PBaseException exception, appendStringNode.execute(tsb, switchEncodingNode.execute(fromByteArrayNode.execute(buf, 0, len, Encoding.US_ASCII, true), TS_ENCODING)); } } - return factory.createTuple(new Object[]{toStringNode.execute(tsb), end}); + return PFactory.createTuple(language, new Object[]{toStringNode.execute(tsb), end}); } @Specialization(guards = "!isEncode(inliningTarget, o, pyObjectTypeCheck)", limit = "1") static Object doFallback(Object o, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck, - @Cached PRaiseNode raiseNode) { - throw wrongExceptionType(o, raiseNode); + @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck) { + throw wrongExceptionType(inliningTarget, o); } } @@ -534,6 +530,7 @@ abstract static class SurrogatePassErrorHandlerNode extends ErrorHandlerBaseNode @Specialization(guards = "isEncode(inliningTarget, exception, pyObjectTypeCheck)", limit = "1") static Object doEncode(PBaseException exception, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @SuppressWarnings("unused") @Exclusive @Cached PyObjectTypeCheck pyObjectTypeCheck, @Cached PyUnicodeEncodeOrTranslateErrorGetObjectNode getObjectNode, @Cached PyUnicodeEncodeOrTranslateErrorGetStartNode getStartNode, @@ -541,35 +538,35 @@ static Object doEncode(PBaseException exception, @Cached PyUnicodeEncodeErrorGetEncodingNode getEncodingNode, @Exclusive @Cached GetStandardEncodingNode getStandardEncodingNode, @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { int start = getStartNode.execute(inliningTarget, exception); int end = getEndNode.execute(inliningTarget, exception); TruffleString src = getObjectNode.execute(inliningTarget, exception); TruffleString encodingName = getEncodingNode.execute(inliningTarget, exception); StandardEncoding encoding = getStandardEncodingNode.execute(inliningTarget, encodingName); if (encoding == StandardEncoding.UNKNOWN) { - throw raiseNode.get(inliningTarget).raiseExceptionObject(exception); + throw raiseNode.raiseExceptionObject(inliningTarget, exception); } if (start >= end) { - return factory.createTuple(new Object[]{factory.createBytes(new byte[0]), end}); + return PFactory.createTuple(language, new Object[]{PFactory.createBytes(language, new byte[0]), end}); } byte[] result = new byte[encoding.byteLength * (end - start)]; int pos = 0; for (int i = start; i < end; ++i) { int cp = codePointAtIndexNode.execute(src, i, TS_ENCODING, ErrorHandling.BEST_EFFORT); if (!isSurrogate(cp)) { - throw raiseNode.get(inliningTarget).raiseExceptionObject(exception); + throw raiseNode.raiseExceptionObject(inliningTarget, exception); } encodeCodepoint(encoding, result, pos, cp); pos += encoding.byteLength; } - return factory.createTuple(new Object[]{factory.createBytes(result), end}); + return PFactory.createTuple(language, new Object[]{PFactory.createBytes(language, result), end}); } @Specialization(guards = "isDecode(inliningTarget, exception, pyObjectTypeCheck)", limit = "1") static Object doDecode(VirtualFrame frame, PBaseException exception, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached("createFor(this)") IndirectCallData indirectCallData, @SuppressWarnings("unused") @Exclusive @Cached PyObjectTypeCheck pyObjectTypeCheck, @Cached PyUnicodeDecodeErrorGetObjectNode getObjectNode, @@ -580,15 +577,14 @@ static Object doDecode(VirtualFrame frame, PBaseException exception, @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib, @CachedLibrary(limit = "3") PythonBufferAccessLibrary accessLib, @Cached TruffleString.FromCodePointNode fromCodePointNode, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { int start = getStartNode.execute(inliningTarget, exception); getEndNode.execute(inliningTarget, exception); // called for side effects only Object object = getObjectNode.execute(inliningTarget, exception); TruffleString encodingName = getEncodingNode.execute(inliningTarget, exception); StandardEncoding encoding = getStandardEncodingNode.execute(inliningTarget, encodingName); if (encoding == StandardEncoding.UNKNOWN) { - throw raiseNode.get(inliningTarget).raiseExceptionObject(exception); + throw raiseNode.raiseExceptionObject(inliningTarget, exception); } Object srcBuf = acquireLib.acquireReadonly(object, frame, indirectCallData); try { @@ -598,9 +594,9 @@ static Object doDecode(VirtualFrame frame, PBaseException exception, cp = decodeCodepoint(encoding, accessLib.getInternalOrCopiedByteArray(srcBuf), start); } if (!isSurrogate(cp)) { - throw raiseNode.get(inliningTarget).raiseExceptionObject(exception); + throw raiseNode.raiseExceptionObject(inliningTarget, exception); } - return factory.createTuple(new Object[]{fromCodePointNode.execute(cp, TS_ENCODING, true), start + encoding.byteLength}); + return PFactory.createTuple(language, new Object[]{fromCodePointNode.execute(cp, TS_ENCODING, true), start + encoding.byteLength}); } finally { accessLib.release(srcBuf, frame, indirectCallData); } @@ -609,9 +605,8 @@ static Object doDecode(VirtualFrame frame, PBaseException exception, @Specialization(guards = "!isEncodeOrDecode(inliningTarget, o, pyObjectTypeCheck)", limit = "1") static Object doFallback(Object o, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck, - @Cached PRaiseNode raiseNode) { - throw wrongExceptionType(o, raiseNode); + @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck) { + throw wrongExceptionType(inliningTarget, o); } private static void encodeCodepoint(StandardEncoding encoding, byte[] result, int pos, int cp) { @@ -671,34 +666,35 @@ abstract static class SurrogateEscapeErrorHandlerNode extends ErrorHandlerBaseNo @Specialization(guards = "isEncode(inliningTarget, exception, pyObjectTypeCheck)", limit = "1") static Object doEncode(PBaseException exception, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @SuppressWarnings("unused") @Exclusive @Cached PyObjectTypeCheck pyObjectTypeCheck, @Cached PyUnicodeEncodeOrTranslateErrorGetObjectNode getObjectNode, @Cached PyUnicodeEncodeOrTranslateErrorGetStartNode getStartNode, @Cached PyUnicodeEncodeOrTranslateErrorGetEndNode getEndNode, @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { int start = getStartNode.execute(inliningTarget, exception); int end = getEndNode.execute(inliningTarget, exception); TruffleString src = getObjectNode.execute(inliningTarget, exception); if (start >= end) { - return factory.createTuple(new Object[]{factory.createBytes(new byte[0]), end}); + return PFactory.createTuple(language, new Object[]{PFactory.createBytes(language, new byte[0]), end}); } byte[] result = new byte[end - start]; int pos = 0; for (int i = start; i < end; ++i) { int cp = codePointAtIndexNode.execute(src, i, TS_ENCODING, ErrorHandling.BEST_EFFORT); if (cp < 0xdc80 || cp > 0xdcff) { - throw raiseNode.get(inliningTarget).raiseExceptionObject(exception); + throw raiseNode.raiseExceptionObject(inliningTarget, exception); } result[pos++] = (byte) (cp - 0xdc00); } - return factory.createTuple(new Object[]{factory.createBytes(result), end}); + return PFactory.createTuple(language, new Object[]{PFactory.createBytes(language, result), end}); } @Specialization(guards = "isDecode(inliningTarget, exception, pyObjectTypeCheck)", limit = "1") static Object doDecode(VirtualFrame frame, PBaseException exception, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached("createFor(this)") IndirectCallData indirectCallData, @SuppressWarnings("unused") @Exclusive @Cached PyObjectTypeCheck pyObjectTypeCheck, @Cached PyUnicodeDecodeErrorGetObjectNode getObjectNode, @@ -708,8 +704,7 @@ static Object doDecode(VirtualFrame frame, PBaseException exception, @CachedLibrary(limit = "3") PythonBufferAccessLibrary accessLib, @Cached TruffleStringBuilder.AppendCodePointNode appendCodePointNode, @Cached TruffleStringBuilder.ToStringNode toStringNode, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { int start = getStartNode.execute(inliningTarget, exception); int end = getEndNode.execute(inliningTarget, exception); Object object = getObjectNode.execute(inliningTarget, exception); @@ -727,9 +722,9 @@ static Object doDecode(VirtualFrame frame, PBaseException exception, consumed++; } if (consumed == 0) { - throw raiseNode.get(inliningTarget).raiseExceptionObject(exception); + throw raiseNode.raiseExceptionObject(inliningTarget, exception); } - return factory.createTuple(new Object[]{toStringNode.execute(tsb), start + consumed}); + return PFactory.createTuple(language, new Object[]{toStringNode.execute(tsb), start + consumed}); } finally { accessLib.release(srcBuf, frame, indirectCallData); } @@ -738,9 +733,8 @@ static Object doDecode(VirtualFrame frame, PBaseException exception, @Specialization(guards = "!isEncodeOrDecode(inliningTarget, o, pyObjectTypeCheck)", limit = "1") static Object doFallback(Object o, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck, - @Cached PRaiseNode raiseNode) { - throw wrongExceptionType(o, raiseNode); + @SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck) { + throw wrongExceptionType(inliningTarget, o); } } @@ -860,9 +854,9 @@ static DecodingErrorHandlerResult doTuple(Node inliningTarget, PTuple result, @Cached SequenceNodes.GetObjectArrayNode getObjectArrayNode, @Cached CastToTruffleStringCheckedNode castToTruffleStringCheckedNode, @Cached CastToJavaIntExactNode castToJavaIntExactNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (lenNode.execute(inliningTarget, result) != 2) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.DECODING_ERROR_HANDLER_MUST_RETURN_STR_INT_TUPLE); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.DECODING_ERROR_HANDLER_MUST_RETURN_STR_INT_TUPLE); } Object[] array = getObjectArrayNode.execute(inliningTarget, result); TruffleString str = castToTruffleStringCheckedNode.cast(inliningTarget, array[0], ErrorMessages.DECODING_ERROR_HANDLER_MUST_RETURN_STR_INT_TUPLE); @@ -871,9 +865,8 @@ static DecodingErrorHandlerResult doTuple(Node inliningTarget, PTuple result, } @Fallback - static DecodingErrorHandlerResult doOther(Node inliningTarget, @SuppressWarnings("unused") Object result, - @Cached(inline = false) PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.DECODING_ERROR_HANDLER_MUST_RETURN_STR_INT_TUPLE); + static DecodingErrorHandlerResult doOther(Node inliningTarget, @SuppressWarnings("unused") Object result) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.DECODING_ERROR_HANDLER_MUST_RETURN_STR_INT_TUPLE); } } @@ -894,7 +887,7 @@ static DecodingErrorHandlerResult doIt(VirtualFrame frame, Node inliningTarget, @Cached ParseDecodingErrorHandlerResultNode parseResultNode, @Cached PyUnicodeDecodeErrorGetObjectNode getObjectNode, @Cached PyObjectSizeNode sizeNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { cache.errorHandlerObject = cache.errorHandlerObject == null ? lookupErrorNode.execute(inliningTarget, errors) : cache.errorHandlerObject; cache.exceptionObject = makeDecodeExceptionNode.execute(frame, inliningTarget, cache.exceptionObject, encoding, srcObj, startPos, endPos, reason); Object resultObj = callNode.execute(frame, cache.errorHandlerObject, cache.exceptionObject); @@ -931,9 +924,9 @@ static EncodingErrorHandlerResult doTuple(Node inliningTarget, PTuple result, @Cached CastToJavaIntExactNode castToJavaIntExactNode, @Cached PyUnicodeCheckNode pyUnicodeCheckNode, @Cached PyBytesCheckNode pyBytesCheckNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (lenNode.execute(inliningTarget, result) != 2) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ENCODING_ERROR_HANDLER_MUST_RETURN_STR_BYTES_INT_TUPLE); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ENCODING_ERROR_HANDLER_MUST_RETURN_STR_BYTES_INT_TUPLE); } Object[] array = getObjectArrayNode.execute(inliningTarget, result); boolean isUnicode; @@ -942,16 +935,15 @@ static EncodingErrorHandlerResult doTuple(Node inliningTarget, PTuple result, } else if (pyBytesCheckNode.execute(inliningTarget, array[0])) { isUnicode = false; } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ENCODING_ERROR_HANDLER_MUST_RETURN_STR_BYTES_INT_TUPLE); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ENCODING_ERROR_HANDLER_MUST_RETURN_STR_BYTES_INT_TUPLE); } int pos = castToJavaIntExactNode.execute(inliningTarget, array[1]); return new EncodingErrorHandlerResult(array[0], pos, isUnicode); } @Fallback - static EncodingErrorHandlerResult doOther(Node inliningTarget, @SuppressWarnings("unused") Object result, - @Cached(inline = false) PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.ENCODING_ERROR_HANDLER_MUST_RETURN_STR_BYTES_INT_TUPLE); + static EncodingErrorHandlerResult doOther(Node inliningTarget, @SuppressWarnings("unused") Object result) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ENCODING_ERROR_HANDLER_MUST_RETURN_STR_BYTES_INT_TUPLE); } } @@ -971,7 +963,7 @@ static EncodingErrorHandlerResult doIt(VirtualFrame frame, Node inliningTarget, @Cached(inline = false) CallNode callNode, @Cached ParseEncodingErrorHandlerResultNode parseResultNode, @Cached(inline = false) TruffleString.CodePointLengthNode codePointLengthNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { cache.errorHandlerObject = cache.errorHandlerObject == null ? lookupErrorNode.execute(inliningTarget, errors) : cache.errorHandlerObject; int len = codePointLengthNode.execute(srcObj, TS_ENCODING); cache.exceptionObject = makeEncodeExceptionNode.execute(frame, inliningTarget, cache.exceptionObject, encoding, srcObj, startPos, endPos, reason); @@ -992,18 +984,18 @@ abstract static class RaiseEncodeException extends Node { @Specialization static void doIt(VirtualFrame frame, Node inliningTarget, ErrorHandlerCache cache, TruffleString encoding, TruffleString srcObj, int startPos, int endPos, TruffleString reason, @Cached MakeEncodeExceptionNode makeEncodeExceptionNode, - @Cached(inline = false) PRaiseNode raiseNode) { + @Cached PRaiseNode raiseNode) { cache.exceptionObject = makeEncodeExceptionNode.execute(frame, inliningTarget, cache.exceptionObject, encoding, srcObj, startPos, endPos, reason); raiseNode.raiseExceptionObject(cache.exceptionObject); } } - private static int adjustAndCheckPos(int newPos, int len, Node inliningTarget, PRaiseNode.Lazy raiseNode) { + private static int adjustAndCheckPos(int newPos, int len, Node inliningTarget, PRaiseNode raiseNode) { if (newPos < 0) { newPos += len; } if (newPos < 0 || newPos > len) { - throw raiseNode.get(inliningTarget).raise(IndexError, ErrorMessages.POSITION_D_FROM_ERROR_HANDLER_OUT_OF_BOUNDS, newPos); + throw raiseNode.raise(inliningTarget, IndexError, ErrorMessages.POSITION_D_FROM_ERROR_HANDLER_OUT_OF_BOUNDS, newPos); } return newPos; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/csv/CSVDialectBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/csv/CSVDialectBuiltins.java index 358b23b4dc..1c3baa3c4b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/csv/CSVDialectBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/csv/CSVDialectBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,37 +41,398 @@ package com.oracle.graal.python.builtins.modules.csv; import static com.oracle.graal.python.builtins.modules.csv.CSVModuleBuiltins.J_ATTR_DELIMITER; -import static com.oracle.graal.python.builtins.modules.csv.CSVModuleBuiltins.J_ATTR_DOUBLEQUOTE; -import static com.oracle.graal.python.builtins.modules.csv.CSVModuleBuiltins.J_ATTR_ESCAPECHAR; -import static com.oracle.graal.python.builtins.modules.csv.CSVModuleBuiltins.J_ATTR_LINETERMINATOR; -import static com.oracle.graal.python.builtins.modules.csv.CSVModuleBuiltins.J_ATTR_QUOTECHAR; -import static com.oracle.graal.python.builtins.modules.csv.CSVModuleBuiltins.J_ATTR_QUOTING; -import static com.oracle.graal.python.builtins.modules.csv.CSVModuleBuiltins.J_ATTR_SKIPINITIALSPACE; -import static com.oracle.graal.python.builtins.modules.csv.CSVModuleBuiltins.J_ATTR_STRICT; import static com.oracle.graal.python.builtins.modules.csv.CSVModuleBuiltins.NOT_SET_CODEPOINT; +import static com.oracle.graal.python.builtins.modules.csv.CSVModuleBuiltins.T__CSV; +import static com.oracle.graal.python.builtins.modules.csv.QuoteStyle.QUOTE_MINIMAL; +import static com.oracle.graal.python.builtins.modules.csv.QuoteStyle.QUOTE_NONE; +import static com.oracle.graal.python.nodes.StringLiterals.J_STRICT; +import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA; +import static com.oracle.graal.python.nodes.StringLiterals.T_CRLF; +import static com.oracle.graal.python.nodes.StringLiterals.T_DOUBLE_QUOTE; +import static com.oracle.graal.python.nodes.StringLiterals.T_STRICT; +import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; +import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; +import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.module.PythonModule; +import com.oracle.graal.python.builtins.objects.str.PString; +import com.oracle.graal.python.builtins.objects.type.PythonClass; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.lib.PyLongAsIntNode; +import com.oracle.graal.python.lib.PyLongCheckExactNode; +import com.oracle.graal.python.lib.PyObjectIsTrueNode; +import com.oracle.graal.python.lib.PyObjectLookupAttr; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.nodes.util.CannotCastException; +import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @CoreFunctions(extendClasses = PythonBuiltinClassType.CSVDialect) public final class CSVDialectBuiltins extends PythonBuiltins { + private static final String J_ATTR_DOUBLEQUOTE = "doublequote"; + private static final String J_ATTR_ESCAPECHAR = "escapechar"; + private static final String J_ATTR_LINETERMINATOR = "lineterminator"; + private static final String J_ATTR_QUOTING = "quoting"; + private static final String J_ATTR_QUOTECHAR = "quotechar"; + private static final String J_ATTR_SKIPINITIALSPACE = "skipinitialspace"; + private static final String J_ATTR_STRICT = J_STRICT; + private static final TruffleString T_ATTR_SKIPINITIALSPACE = tsLiteral(J_ATTR_SKIPINITIALSPACE); + private static final TruffleString T_ATTR_QUOTECHAR = tsLiteral(J_ATTR_QUOTECHAR); + private static final TruffleString T_ATTR_QUOTING = tsLiteral(J_ATTR_QUOTING); + private static final TruffleString T_ATTR_LINETERMINATOR = tsLiteral(J_ATTR_LINETERMINATOR); + private static final TruffleString T_ATTR_ESCAPECHAR = tsLiteral(J_ATTR_ESCAPECHAR); + private static final TruffleString T_ATTR_DOUBLEQUOTE = tsLiteral(J_ATTR_DOUBLEQUOTE); + private static final TruffleString T_ATTR_DELIMITER = tsLiteral(J_ATTR_DELIMITER); + private static final TruffleString T_ATTR_STRICT = T_STRICT; + private static final TruffleString T_NOT_SET = tsLiteral("NOT_SET"); + + public static final TpSlots SLOTS = CSVDialectBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return CSVDialectBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "CSVDialect", parameterNames = {"class", "dialect", "delimiter", "doublequote", "escapechar", + "lineterminator", "quotechar", + "quoting", "skipinitialspace", "strict"}) + @GenerateNodeFactory + public abstract static class DialectNode extends PythonBuiltinNode { + + @Specialization + @SuppressWarnings("unused") + static Object doCSVDialectWithoutKeywords(PythonBuiltinClassType cls, CSVDialect dialect, PNone delimiter, PNone doublequote, PNone escapechar, + PNone lineterminator, PNone quotechar, PNone quoting, PNone skipinitialspace, PNone strict) { + return dialect; + } + + @Specialization + @SuppressWarnings("unused") + static CSVDialect doStringWithoutKeywords(VirtualFrame frame, PythonBuiltinClassType cls, TruffleString dialectName, PNone delimiter, PNone doublequote, PNone escapechar, + PNone lineterminator, PNone quotechar, PNone quoting, PNone skipinitialspace, PNone strict, + @Bind("this") Node inliningTarget, + @Exclusive @Cached CSVModuleBuiltins.CSVGetDialectNode getDialect) { + PythonModule module = PythonContext.get(inliningTarget).lookupBuiltinModule(T__CSV); + return getDialect.execute(frame, module, dialectName); + } + + @Specialization + static Object doNoDialectObj(VirtualFrame frame, PythonBuiltinClassType cls, @SuppressWarnings("unused") PNone dialectObj, Object delimiterObj, Object doublequoteObj, Object escapecharObj, + Object lineterminatorObj, Object quotecharObj, Object quotingObj, Object skipinitialspaceObj, Object strictObj, + @Bind("this") Node inliningTarget, + @Exclusive @Cached PyObjectIsTrueNode isTrueNode, + @Exclusive @Cached PyLongCheckExactNode pyLongCheckExactNode, + @Exclusive @Cached PyLongAsIntNode pyLongAsIntNode, + @Exclusive @Cached PRaiseNode raiseNode) { + return createCSVDialect(frame, inliningTarget, cls, delimiterObj, doublequoteObj, escapecharObj, lineterminatorObj, + quotecharObj, quotingObj, skipinitialspaceObj, strictObj, isTrueNode, pyLongCheckExactNode, pyLongAsIntNode, raiseNode); + } + + @Specialization + static Object doStringWithKeywords(VirtualFrame frame, PythonBuiltinClassType cls, TruffleString dialectName, Object delimiterObj, Object doublequoteObj, Object escapecharObj, + Object lineterminatorObj, Object quotecharObj, Object quotingObj, Object skipinitialspaceObj, Object strictObj, + @Bind("this") Node inliningTarget, + @Exclusive @Cached CSVModuleBuiltins.CSVGetDialectNode getDialect, + @Exclusive @Cached PyObjectIsTrueNode isTrueNode, + @Exclusive @Cached PyLongCheckExactNode pyLongCheckExactNode, + @Exclusive @Cached PyLongAsIntNode pyLongAsIntNode, + @Exclusive @Cached PRaiseNode raiseNode) { + PythonModule module = PythonContext.get(inliningTarget).lookupBuiltinModule(T__CSV); + CSVDialect dialectObj = getDialect.execute(frame, module, dialectName); + + if (delimiterObj == PNone.NO_VALUE) { + delimiterObj = dialectObj.delimiter; + } + if (doublequoteObj == PNone.NO_VALUE) { + doublequoteObj = dialectObj.doubleQuote; + } + if (escapecharObj == PNone.NO_VALUE) { + escapecharObj = dialectObj.escapeChar; + } + if (lineterminatorObj == PNone.NO_VALUE) { + lineterminatorObj = dialectObj.lineTerminator; + } + if (quotingObj == PNone.NO_VALUE) { + quotingObj = dialectObj.quoting; + } + if (quotecharObj == PNone.NO_VALUE) { + quotecharObj = dialectObj.quoteChar; + } + if (skipinitialspaceObj == PNone.NO_VALUE) { + skipinitialspaceObj = dialectObj.skipInitialSpace; + } + if (strictObj == PNone.NO_VALUE) { + strictObj = dialectObj.strict; + } + + return createCSVDialect(frame, inliningTarget, cls, delimiterObj, doublequoteObj, escapecharObj, lineterminatorObj, + quotecharObj, quotingObj, skipinitialspaceObj, strictObj, isTrueNode, pyLongCheckExactNode, pyLongAsIntNode, raiseNode); + } + + @Specialization + static Object doDialectClassWithKeywords(VirtualFrame frame, PythonBuiltinClassType cls, PythonClass dialectObj, Object delimiterObj, Object doublequoteObj, Object escapecharObj, + Object lineterminatorObj, Object quotecharObj, Object quotingObj, Object skipinitialspaceObj, Object strictObj, + @Bind("this") Node inliningTarget, + @Exclusive @Cached PyObjectLookupAttr getFirstAttributesNode, + @Exclusive @Cached PyObjectLookupAttr getSecondAttributesNode, + @Exclusive @Cached PyObjectLookupAttr getThirdAttributesNode, + @Exclusive @Cached PyObjectIsTrueNode isTrueNode, + @Exclusive @Cached PyLongCheckExactNode pyLongCheckExactNode, + @Exclusive @Cached PyLongAsIntNode pyLongAsIntNode, + @Exclusive @Cached PRaiseNode raiseNode) { + + // We use multiple AttributeNodes to be able to cache all attributes as current + // CACHE_SIZE is 3. + delimiterObj = getAttributeValue(frame, inliningTarget, dialectObj, delimiterObj, T_ATTR_DELIMITER, getFirstAttributesNode); + doublequoteObj = getAttributeValue(frame, inliningTarget, dialectObj, doublequoteObj, T_ATTR_DOUBLEQUOTE, getFirstAttributesNode); + escapecharObj = getAttributeValue(frame, inliningTarget, dialectObj, escapecharObj, T_ATTR_ESCAPECHAR, getFirstAttributesNode); + lineterminatorObj = getAttributeValue(frame, inliningTarget, dialectObj, lineterminatorObj, T_ATTR_LINETERMINATOR, getSecondAttributesNode); + quotecharObj = getAttributeValue(frame, inliningTarget, dialectObj, quotecharObj, T_ATTR_QUOTECHAR, getSecondAttributesNode); + quotingObj = getAttributeValue(frame, inliningTarget, dialectObj, quotingObj, T_ATTR_QUOTING, getSecondAttributesNode); + skipinitialspaceObj = getAttributeValue(frame, inliningTarget, dialectObj, skipinitialspaceObj, T_ATTR_SKIPINITIALSPACE, getThirdAttributesNode); + strictObj = getAttributeValue(frame, inliningTarget, dialectObj, strictObj, T_ATTR_STRICT, getThirdAttributesNode); + + return createCSVDialect(frame, inliningTarget, cls, delimiterObj, doublequoteObj, escapecharObj, lineterminatorObj, + quotecharObj, quotingObj, skipinitialspaceObj, strictObj, isTrueNode, pyLongCheckExactNode, pyLongAsIntNode, raiseNode); + } + + @Specialization + static Object doPStringWithKeywords(VirtualFrame frame, PythonBuiltinClassType cls, PString dialectName, Object delimiterObj, Object doublequoteObj, Object escapecharObj, + Object lineterminatorObj, Object quotecharObj, Object quotingObj, Object skipinitialspaceObj, Object strictObj, + @Bind("this") Node inliningTarget, + @Exclusive @Cached CSVModuleBuiltins.CSVGetDialectNode getDialect, + @Cached CastToTruffleStringNode castToStringNode, + @Exclusive @Cached PyObjectIsTrueNode isTrueNode, + @Exclusive @Cached PyLongCheckExactNode pyLongCheckExactNode, + @Exclusive @Cached PyLongAsIntNode pyLongAsIntNode, + @Exclusive @Cached PRaiseNode raiseNode) { + + TruffleString dialectNameStr = castToStringNode.execute(inliningTarget, dialectName); + PythonModule module = PythonContext.get(inliningTarget).lookupBuiltinModule(T__CSV); + CSVDialect dialectObj = getDialect.execute(frame, module, dialectNameStr); + + if (delimiterObj == PNone.NO_VALUE) { + delimiterObj = dialectObj.delimiter; + } + if (doublequoteObj == PNone.NO_VALUE) { + doublequoteObj = dialectObj.doubleQuote; + } + if (escapecharObj == PNone.NO_VALUE) { + escapecharObj = dialectObj.escapeChar; + } + if (lineterminatorObj == PNone.NO_VALUE) { + lineterminatorObj = dialectObj.lineTerminator; + } + if (quotingObj == PNone.NO_VALUE) { + quotingObj = dialectObj.quoting; + } + if (quotecharObj == PNone.NO_VALUE) { + quotecharObj = dialectObj.quoteChar; + } + if (skipinitialspaceObj == PNone.NO_VALUE) { + skipinitialspaceObj = dialectObj.skipInitialSpace; + } + if (strictObj == PNone.NO_VALUE) { + strictObj = dialectObj.strict; + } + + return createCSVDialect(frame, inliningTarget, cls, delimiterObj, doublequoteObj, escapecharObj, lineterminatorObj, + quotecharObj, quotingObj, skipinitialspaceObj, strictObj, isTrueNode, pyLongCheckExactNode, pyLongAsIntNode, raiseNode); + } + + @Specialization(guards = {"!isCSVDialect(dialectObj)", "!isPythonClass(dialectObj)", "!isString(dialectObj)", "!isPNone(dialectObj)"}) + static Object doGeneric(VirtualFrame frame, Object cls, Object dialectObj, Object delimiterObj, Object doublequoteObj, Object escapecharObj, Object lineterminatorObj, + Object quotecharObj, Object quotingObj, Object skipinitialspaceObj, Object strictObj, + @Bind("this") Node inliningTarget, + @Exclusive @Cached PyObjectLookupAttr getFirstAttributesNode, + @Exclusive @Cached PyObjectLookupAttr getSecondAttributesNode, + @Exclusive @Cached PyObjectLookupAttr getThirdAttributesNode, + @Exclusive @Cached PyObjectIsTrueNode isTrueNode, + @Exclusive @Cached PyLongCheckExactNode pyLongCheckExactNode, + @Exclusive @Cached PyLongAsIntNode pyLongAsIntNode, + @Exclusive @Cached PRaiseNode raiseNode) { + + delimiterObj = getAttributeValue(frame, inliningTarget, dialectObj, delimiterObj, T_ATTR_DELIMITER, getFirstAttributesNode); + doublequoteObj = getAttributeValue(frame, inliningTarget, dialectObj, doublequoteObj, T_ATTR_DOUBLEQUOTE, getFirstAttributesNode); + escapecharObj = getAttributeValue(frame, inliningTarget, dialectObj, escapecharObj, T_ATTR_ESCAPECHAR, getFirstAttributesNode); + lineterminatorObj = getAttributeValue(frame, inliningTarget, dialectObj, lineterminatorObj, T_ATTR_LINETERMINATOR, getSecondAttributesNode); + quotingObj = getAttributeValue(frame, inliningTarget, dialectObj, quotingObj, T_ATTR_QUOTING, getSecondAttributesNode); + quotecharObj = getAttributeValue(frame, inliningTarget, dialectObj, quotecharObj, T_ATTR_QUOTECHAR, getSecondAttributesNode); + skipinitialspaceObj = getAttributeValue(frame, inliningTarget, dialectObj, skipinitialspaceObj, T_ATTR_SKIPINITIALSPACE, getThirdAttributesNode); + strictObj = getAttributeValue(frame, inliningTarget, dialectObj, strictObj, T_ATTR_STRICT, getThirdAttributesNode); + + return createCSVDialect(frame, inliningTarget, cls, delimiterObj, doublequoteObj, escapecharObj, lineterminatorObj, + quotecharObj, quotingObj, skipinitialspaceObj, strictObj, isTrueNode, pyLongCheckExactNode, pyLongAsIntNode, raiseNode); + } + + protected static boolean isCSVDialect(Object dialect) { + return dialect instanceof CSVDialect; + } + + private static Object createCSVDialect(VirtualFrame frame, Node inliningTarget, Object cls, Object delimiterObj, Object doublequoteObj, Object escapecharObj, + Object lineterminatorObj, Object quotecharObj, Object quotingObj, Object skipinitialspaceObj, Object strictObj, + PyObjectIsTrueNode isTrueNode, PyLongCheckExactNode pyLongCheckExactNode, PyLongAsIntNode pyLongAsIntNode, PRaiseNode raiseNode) { + TruffleString delimiter = getChar(inliningTarget, T_ATTR_DELIMITER, delimiterObj, T_COMMA, false); + boolean doubleQuote = getBoolean(frame, doublequoteObj, true, isTrueNode); + TruffleString escapeChar = getChar(inliningTarget, T_ATTR_ESCAPECHAR, escapecharObj, T_NOT_SET, true); + TruffleString lineTerminator = getString(inliningTarget, T_ATTR_LINETERMINATOR, lineterminatorObj, T_CRLF); + TruffleString quoteChar = getChar(inliningTarget, T_ATTR_QUOTECHAR, quotecharObj, T_DOUBLE_QUOTE, true); + QuoteStyle quoting = getQuotingValue(frame, inliningTarget, T_ATTR_QUOTING, quotingObj, QUOTE_MINIMAL, pyLongCheckExactNode, pyLongAsIntNode, raiseNode); + boolean skipInitialSpace = getBoolean(frame, skipinitialspaceObj, false, isTrueNode); + boolean strict = getBoolean(frame, strictObj, false, isTrueNode); + if (quotecharObj == PNone.NONE && quotingObj == PNone.NO_VALUE) { + quoting = QUOTE_NONE; + } + return createCSVDialect(inliningTarget, cls, delimiter, doubleQuote, escapeChar, lineTerminator, quoteChar, quoting, skipInitialSpace, strict); + } + + @TruffleBoundary + private static Object createCSVDialect(Node raisingNode, Object cls, TruffleString delimiter, boolean doubleQuote, TruffleString escapeChar, TruffleString lineTerminator, + TruffleString quoteChar, QuoteStyle quoting, boolean skipInitialSpace, boolean strict) { + if (TruffleString.EqualNode.getUncached().execute(delimiter, T_NOT_SET, TS_ENCODING)) { + throw PRaiseNode.raiseStatic(raisingNode, TypeError, ErrorMessages.DELIMITER_MUST_BE_ONE_CHAR_STRING); + } + + if (quoting != QUOTE_NONE && TruffleString.EqualNode.getUncached().execute(quoteChar, T_NOT_SET, TS_ENCODING)) { + throw PRaiseNode.raiseStatic(raisingNode, TypeError, ErrorMessages.QUOTECHAR_MUST_BE_SET_IF_QUOTING_ENABLED); + } + + if (lineTerminator == null) { + throw PRaiseNode.raiseStatic(raisingNode, TypeError, ErrorMessages.LINETERMINATOR_MUST_BE_SET); + } + + // delimiter cannot be NOT_SET + int delimiterCodePoint = TruffleString.CodePointAtIndexNode.getUncached().execute(delimiter, 0, TS_ENCODING); + int escapeCharCodePoint = TruffleString.EqualNode.getUncached().execute(escapeChar, T_NOT_SET, TS_ENCODING) ? NOT_SET_CODEPOINT + : TruffleString.CodePointAtIndexNode.getUncached().execute(escapeChar, 0, TS_ENCODING); + int quoteCharCodePoint = TruffleString.EqualNode.getUncached().execute(quoteChar, T_NOT_SET, TS_ENCODING) ? NOT_SET_CODEPOINT + : TruffleString.CodePointAtIndexNode.getUncached().execute(quoteChar, 0, TS_ENCODING); + + return PFactory.createCSVDialect(PythonLanguage.get(null), cls, TypeNodes.GetInstanceShape.executeUncached(cls), delimiter, delimiterCodePoint, doubleQuote, + escapeChar, escapeCharCodePoint, lineTerminator, quoteChar, quoteCharCodePoint, quoting, + skipInitialSpace, strict); + } + + private static Object getAttributeValue(VirtualFrame frame, Node inliningTarget, Object dialect, Object inputValue, TruffleString attributeName, PyObjectLookupAttr getAttributeNode) { + if (inputValue != PNone.NO_VALUE) { + return inputValue; + } + return getAttributeNode.execute(frame, inliningTarget, dialect, attributeName); + } + + @TruffleBoundary + private static TruffleString getChar(Node raisingNode, TruffleString name, Object valueObj, TruffleString defaultValue, boolean optional) { + if (valueObj == PNone.NO_VALUE) { + return defaultValue; + } + if (optional && valueObj == PNone.NONE) { + return T_NOT_SET; + } + + TruffleString charValue; + + try { + charValue = CastToTruffleStringNode.executeUncached(valueObj); + } catch (CannotCastException e) { + TruffleString format = optional ? ErrorMessages.S_MUST_BE_STRING_OR_NONE_NOT_S : ErrorMessages.S_MUST_BE_STRING_NOT_S; + throw PRaiseNode.raiseStatic(raisingNode, TypeError, format, name, GetClassNode.executeUncached(valueObj)); + } + + if (optional && TruffleString.EqualNode.getUncached().execute(charValue, T_NOT_SET, TS_ENCODING)) { + return T_NOT_SET; + } + + if (TruffleString.CodePointLengthNode.getUncached().execute(charValue, TS_ENCODING) != 1) { + throw PRaiseNode.raiseStatic(raisingNode, TypeError, ErrorMessages.MUST_BE_ONE_CHARACTER_STRING, name); + } + + return charValue; + } + + private static boolean getBoolean(VirtualFrame frame, Object valueObj, boolean defaultValue, PyObjectIsTrueNode isTrueNode) { + if (valueObj == PNone.NO_VALUE) { + return defaultValue; + } + + return isTrueNode.execute(frame, valueObj); + } + + @TruffleBoundary + private static TruffleString getString(Node raisingNode, TruffleString attribute, Object valueObj, TruffleString defaultValue) { + if (valueObj == PNone.NO_VALUE) { + return defaultValue; + } + + if (valueObj == PNone.NONE) { + return null; + } + + TruffleString value; + + try { + value = CastToTruffleStringNode.executeUncached(valueObj); + } catch (CannotCastException e) { + throw PRaiseNode.raiseStatic(raisingNode, TypeError, ErrorMessages.MUST_BE_STRING_QUOTED, attribute); + } + + return value; + } + + private static QuoteStyle getQuotingValue(VirtualFrame frame, Node inliningTarget, TruffleString name, Object valueObj, QuoteStyle defaultValue, + PyLongCheckExactNode pyLongCheckExactNode, PyLongAsIntNode pyLongAsIntNode, PRaiseNode raiseNode) { + + if (valueObj == PNone.NO_VALUE) { + return defaultValue; + } + + if (valueObj instanceof QuoteStyle) { + return (QuoteStyle) valueObj; + } + + if (!pyLongCheckExactNode.execute(inliningTarget, valueObj)) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MUST_BE_INTEGER_QUOTED_ATTR, name); + } + + int value = pyLongAsIntNode.execute(frame, inliningTarget, valueObj); + + if (!QuoteStyle.containsOrdinalValue(value)) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.BAD_QUOTING_VALUE); + } + + return QuoteStyle.getQuoteStyle(value); + } + } + @Builtin(name = J_ATTR_DELIMITER, minNumOfPositionalArgs = 1, isGetter = true) @GenerateNodeFactory abstract static class DelimiterNode extends PythonUnaryBuiltinNode { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/csv/CSVModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/csv/CSVModuleBuiltins.java index db26e7050b..231304a7db 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/csv/CSVModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/csv/CSVModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,17 +45,11 @@ import static com.oracle.graal.python.builtins.modules.csv.QuoteStyle.QUOTE_NONE; import static com.oracle.graal.python.builtins.modules.csv.QuoteStyle.QUOTE_NONNUMERIC; import static com.oracle.graal.python.builtins.modules.io.IONodes.T_WRITE; -import static com.oracle.graal.python.nodes.StringLiterals.J_STRICT; -import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA; -import static com.oracle.graal.python.nodes.StringLiterals.T_CRLF; -import static com.oracle.graal.python.nodes.StringLiterals.T_DOUBLE_QUOTE; -import static com.oracle.graal.python.nodes.StringLiterals.T_STRICT; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -67,17 +61,13 @@ import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.module.PythonModule; -import com.oracle.graal.python.builtins.objects.str.PString; -import com.oracle.graal.python.builtins.objects.type.PythonClass; import com.oracle.graal.python.lib.PyCallableCheckNode; import com.oracle.graal.python.lib.PyDictDelItem; import com.oracle.graal.python.lib.PyDictGetItem; import com.oracle.graal.python.lib.PyDictSetItem; -import com.oracle.graal.python.lib.PyLongAsIntNode; import com.oracle.graal.python.lib.PyLongAsLongNode; import com.oracle.graal.python.lib.PyLongCheckExactNode; import com.oracle.graal.python.lib.PyObjectGetIter; -import com.oracle.graal.python.lib.PyObjectIsTrueNode; import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; @@ -87,15 +77,11 @@ import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; -import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.NodeFactory; @@ -109,26 +95,10 @@ public final class CSVModuleBuiltins extends PythonBuiltins { private static final TruffleString T__DIALECTS = tsLiteral("_dialects"); static final String J_ATTR_DELIMITER = "delimiter"; - private static final TruffleString T_ATTR_DELIMITER = tsLiteral(J_ATTR_DELIMITER); - static final String J_ATTR_DOUBLEQUOTE = "doublequote"; - private static final TruffleString T_ATTR_DOUBLEQUOTE = tsLiteral(J_ATTR_DOUBLEQUOTE); - static final String J_ATTR_ESCAPECHAR = "escapechar"; - private static final TruffleString T_ATTR_ESCAPECHAR = tsLiteral(J_ATTR_ESCAPECHAR); - static final String J_ATTR_LINETERMINATOR = "lineterminator"; - private static final TruffleString T_ATTR_LINETERMINATOR = tsLiteral(J_ATTR_LINETERMINATOR); - static final String J_ATTR_QUOTING = "quoting"; - private static final TruffleString T_ATTR_QUOTING = tsLiteral(J_ATTR_QUOTING); - static final String J_ATTR_QUOTECHAR = "quotechar"; - private static final TruffleString T_ATTR_QUOTECHAR = tsLiteral(J_ATTR_QUOTECHAR); - static final String J_ATTR_SKIPINITIALSPACE = "skipinitialspace"; - private static final TruffleString T_ATTR_SKIPINITIALSPACE = tsLiteral(J_ATTR_SKIPINITIALSPACE); - static final String J_ATTR_STRICT = J_STRICT; - private static final TruffleString T_ATTR_STRICT = T_STRICT; static final String J__CSV = "_csv"; static final TruffleString T__CSV = tsLiteral(J__CSV); - private static final TruffleString T_NOT_SET = tsLiteral("NOT_SET"); static final int NOT_SET_CODEPOINT = -1; long fieldLimit = 128 * 1024; // max parsed field size @@ -146,7 +116,7 @@ public void initialize(Python3Core core) { addBuiltinConstant("QUOTE_ALL", QUOTE_ALL.ordinal()); addBuiltinConstant("QUOTE_NONNUMERIC", QUOTE_NONNUMERIC.ordinal()); addBuiltinConstant("QUOTE_NONE", QUOTE_NONE.ordinal()); - addBuiltinConstant(T__DIALECTS, core.factory().createDict()); + addBuiltinConstant(T__DIALECTS, PFactory.createDict(core.getLanguage())); super.initialize(core); } @@ -163,12 +133,12 @@ static PNone register(VirtualFrame frame, PythonModule module, Object nameObj, O @Cached ReadAttributeFromObjectNode readNode, @Cached CallNode callNode, @Cached PyDictSetItem setItem, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { TruffleString name; try { name = nameNode.execute(inliningTarget, nameObj); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.MUST_BE_STRING, "dialect name"); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.MUST_BE_STRING, "dialect name"); } Object result = callNode.execute(frame, PythonBuiltinClassType.CSVDialect, new Object[]{dialectObj}, keywords); @@ -193,7 +163,7 @@ static PNone unregister(VirtualFrame frame, PythonModule module, Object nameObj, @Cached ReadAttributeFromObjectNode readNode, @Cached PyDictDelItem delItem, @Cached HashingStorageGetItem getItem, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { // TODO GR-38165: unchecked cast to PDict PDict dialects = (PDict) readNode.execute(module, T__DIALECTS); @@ -201,7 +171,7 @@ static PNone unregister(VirtualFrame frame, PythonModule module, Object nameObj, if (getItem.hasKey(frame, inliningTarget, (dialects).getDictStorage(), nameObj)) { delItem.execute(frame, inliningTarget, dialects, nameObj); } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.CSVError, ErrorMessages.UNKNOWN_DIALECT); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.CSVError, ErrorMessages.UNKNOWN_DIALECT); } return PNone.NONE; @@ -225,7 +195,7 @@ static CSVDialect get(VirtualFrame frame, PythonModule module, Object nameObj, @Bind("this") Node inliningTarget, @Cached PyDictGetItem getItemNode, @Cached ReadAttributeFromObjectNode readNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { // TODO GR-38165: unchecked cast to PDict PDict dialects = (PDict) readNode.execute(module, T__DIALECTS); @@ -233,7 +203,7 @@ static CSVDialect get(VirtualFrame frame, PythonModule module, Object nameObj, CSVDialect dialect = (CSVDialect) getItemNode.execute(frame, inliningTarget, dialects, nameObj); if (dialect == null) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.CSVError, ErrorMessages.UNKNOWN_DIALECT); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.CSVError, ErrorMessages.UNKNOWN_DIALECT); } return dialect; @@ -262,10 +232,10 @@ static Object createReader(VirtualFrame frame, Object csvfile, Object dialectObj @Bind("this") Node inliningTarget, @Cached PyObjectGetIter getIter, @Cached CallNode callNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { Object inputIter = getIter.execute(frame, inliningTarget, csvfile); CSVDialect dialect = (CSVDialect) callNode.execute(frame, PythonBuiltinClassType.CSVDialect, new Object[]{dialectObj}, kwargs); - return factory.createCSVReader(PythonBuiltinClassType.CSVReader, inputIter, dialect); + return PFactory.createCSVReader(language, inputIter, dialect); } } @@ -278,14 +248,14 @@ static Object createReader(VirtualFrame frame, Object outputFile, Object dialect @Cached CallNode callNode, @Cached PyObjectLookupAttr lookupAttr, @Cached PyCallableCheckNode checkCallable, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { Object write = lookupAttr.execute(frame, inliningTarget, outputFile, T_WRITE); if (write == PNone.NO_VALUE || !checkCallable.execute(inliningTarget, write)) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.S_MUST_HAVE_WRITE_METHOD, "argument 1"); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.S_MUST_HAVE_WRITE_METHOD, "argument 1"); } CSVDialect dialect = (CSVDialect) callNode.execute(frame, PythonBuiltinClassType.CSVDialect, new Object[]{dialectObj}, kwargs); - return factory.createCSVWriter(PythonBuiltinClassType.CSVWriter, write, dialect); + return PFactory.createCSVWriter(language, write, dialect); } } @@ -301,13 +271,13 @@ static long getOrSetFieldSizeLimit(VirtualFrame frame, PythonModule self, Object @Bind("this") Node inliningTarget, @Cached PyLongCheckExactNode checkLongNode, @Cached PyLongAsLongNode castToLong, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { CSVModuleBuiltins csvModuleBuiltins = (CSVModuleBuiltins) self.getBuiltins(); long oldLimit = csvModuleBuiltins.fieldLimit; if (newLimit != PNone.NO_VALUE) { if (!checkLongNode.execute(inliningTarget, newLimit)) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.MUST_BE_INTEGER, "limit"); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.MUST_BE_INTEGER, "limit"); } csvModuleBuiltins.fieldLimit = castToLong.execute(frame, inliningTarget, newLimit); } @@ -315,316 +285,6 @@ static long getOrSetFieldSizeLimit(VirtualFrame frame, PythonModule self, Object } } - @Builtin(name = "CSVDialect", constructsClass = PythonBuiltinClassType.CSVDialect, parameterNames = {"class", "dialect", "delimiter", "doublequote", "escapechar", "lineterminator", "quotechar", - "quoting", "skipinitialspace", "strict"}) - @GenerateNodeFactory - public abstract static class DialectNode extends PythonBuiltinNode { - - @Specialization - @SuppressWarnings("unused") - static Object doCSVDialectWithoutKeywords(PythonBuiltinClassType cls, CSVDialect dialect, PNone delimiter, PNone doublequote, PNone escapechar, - PNone lineterminator, PNone quotechar, PNone quoting, PNone skipinitialspace, PNone strict) { - return dialect; - } - - @Specialization - @SuppressWarnings("unused") - static CSVDialect doStringWithoutKeywords(VirtualFrame frame, PythonBuiltinClassType cls, TruffleString dialectName, PNone delimiter, PNone doublequote, PNone escapechar, - PNone lineterminator, PNone quotechar, PNone quoting, PNone skipinitialspace, PNone strict, - @Bind("this") Node inliningTarget, - @Exclusive @Cached CSVModuleBuiltins.CSVGetDialectNode getDialect) { - PythonModule module = PythonContext.get(inliningTarget).lookupBuiltinModule(T__CSV); - return getDialect.execute(frame, module, dialectName); - } - - @Specialization - static Object doNoDialectObj(VirtualFrame frame, PythonBuiltinClassType cls, @SuppressWarnings("unused") PNone dialectObj, Object delimiterObj, Object doublequoteObj, Object escapecharObj, - Object lineterminatorObj, Object quotecharObj, Object quotingObj, Object skipinitialspaceObj, Object strictObj, - @Bind("this") Node inliningTarget, - @Exclusive @Cached PyObjectIsTrueNode isTrueNode, - @Exclusive @Cached PyLongCheckExactNode pyLongCheckExactNode, - @Exclusive @Cached PyLongAsIntNode pyLongAsIntNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - return createCSVDialect(frame, inliningTarget, cls, delimiterObj, doublequoteObj, escapecharObj, lineterminatorObj, - quotecharObj, quotingObj, skipinitialspaceObj, strictObj, isTrueNode, pyLongCheckExactNode, pyLongAsIntNode, raiseNode); - } - - @Specialization - static Object doStringWithKeywords(VirtualFrame frame, PythonBuiltinClassType cls, TruffleString dialectName, Object delimiterObj, Object doublequoteObj, Object escapecharObj, - Object lineterminatorObj, Object quotecharObj, Object quotingObj, Object skipinitialspaceObj, Object strictObj, - @Bind("this") Node inliningTarget, - @Exclusive @Cached CSVModuleBuiltins.CSVGetDialectNode getDialect, - @Exclusive @Cached PyObjectIsTrueNode isTrueNode, - @Exclusive @Cached PyLongCheckExactNode pyLongCheckExactNode, - @Exclusive @Cached PyLongAsIntNode pyLongAsIntNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - PythonModule module = PythonContext.get(inliningTarget).lookupBuiltinModule(T__CSV); - CSVDialect dialectObj = getDialect.execute(frame, module, dialectName); - - if (delimiterObj == PNone.NO_VALUE) { - delimiterObj = dialectObj.delimiter; - } - if (doublequoteObj == PNone.NO_VALUE) { - doublequoteObj = dialectObj.doubleQuote; - } - if (escapecharObj == PNone.NO_VALUE) { - escapecharObj = dialectObj.escapeChar; - } - if (lineterminatorObj == PNone.NO_VALUE) { - lineterminatorObj = dialectObj.lineTerminator; - } - if (quotingObj == PNone.NO_VALUE) { - quotingObj = dialectObj.quoting; - } - if (quotecharObj == PNone.NO_VALUE) { - quotecharObj = dialectObj.quoteChar; - } - if (skipinitialspaceObj == PNone.NO_VALUE) { - skipinitialspaceObj = dialectObj.skipInitialSpace; - } - if (strictObj == PNone.NO_VALUE) { - strictObj = dialectObj.strict; - } - - return createCSVDialect(frame, inliningTarget, cls, delimiterObj, doublequoteObj, escapecharObj, lineterminatorObj, - quotecharObj, quotingObj, skipinitialspaceObj, strictObj, isTrueNode, pyLongCheckExactNode, pyLongAsIntNode, raiseNode); - } - - @Specialization - static Object doDialectClassWithKeywords(VirtualFrame frame, PythonBuiltinClassType cls, PythonClass dialectObj, Object delimiterObj, Object doublequoteObj, Object escapecharObj, - Object lineterminatorObj, Object quotecharObj, Object quotingObj, Object skipinitialspaceObj, Object strictObj, - @Bind("this") Node inliningTarget, - @Exclusive @Cached PyObjectLookupAttr getFirstAttributesNode, - @Exclusive @Cached PyObjectLookupAttr getSecondAttributesNode, - @Exclusive @Cached PyObjectLookupAttr getThirdAttributesNode, - @Exclusive @Cached PyObjectIsTrueNode isTrueNode, - @Exclusive @Cached PyLongCheckExactNode pyLongCheckExactNode, - @Exclusive @Cached PyLongAsIntNode pyLongAsIntNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - - // We use multiple AttributeNodes to be able to cache all attributes as current - // CACHE_SIZE is 3. - delimiterObj = getAttributeValue(frame, inliningTarget, dialectObj, delimiterObj, T_ATTR_DELIMITER, getFirstAttributesNode); - doublequoteObj = getAttributeValue(frame, inliningTarget, dialectObj, doublequoteObj, T_ATTR_DOUBLEQUOTE, getFirstAttributesNode); - escapecharObj = getAttributeValue(frame, inliningTarget, dialectObj, escapecharObj, T_ATTR_ESCAPECHAR, getFirstAttributesNode); - lineterminatorObj = getAttributeValue(frame, inliningTarget, dialectObj, lineterminatorObj, T_ATTR_LINETERMINATOR, getSecondAttributesNode); - quotecharObj = getAttributeValue(frame, inliningTarget, dialectObj, quotecharObj, T_ATTR_QUOTECHAR, getSecondAttributesNode); - quotingObj = getAttributeValue(frame, inliningTarget, dialectObj, quotingObj, T_ATTR_QUOTING, getSecondAttributesNode); - skipinitialspaceObj = getAttributeValue(frame, inliningTarget, dialectObj, skipinitialspaceObj, T_ATTR_SKIPINITIALSPACE, getThirdAttributesNode); - strictObj = getAttributeValue(frame, inliningTarget, dialectObj, strictObj, T_ATTR_STRICT, getThirdAttributesNode); - - return createCSVDialect(frame, inliningTarget, cls, delimiterObj, doublequoteObj, escapecharObj, lineterminatorObj, - quotecharObj, quotingObj, skipinitialspaceObj, strictObj, isTrueNode, pyLongCheckExactNode, pyLongAsIntNode, raiseNode); - } - - @Specialization - static Object doPStringWithKeywords(VirtualFrame frame, PythonBuiltinClassType cls, PString dialectName, Object delimiterObj, Object doublequoteObj, Object escapecharObj, - Object lineterminatorObj, Object quotecharObj, Object quotingObj, Object skipinitialspaceObj, Object strictObj, - @Bind("this") Node inliningTarget, - @Exclusive @Cached CSVModuleBuiltins.CSVGetDialectNode getDialect, - @Cached CastToTruffleStringNode castToStringNode, - @Exclusive @Cached PyObjectIsTrueNode isTrueNode, - @Exclusive @Cached PyLongCheckExactNode pyLongCheckExactNode, - @Exclusive @Cached PyLongAsIntNode pyLongAsIntNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - - TruffleString dialectNameStr = castToStringNode.execute(inliningTarget, dialectName); - PythonModule module = PythonContext.get(inliningTarget).lookupBuiltinModule(T__CSV); - CSVDialect dialectObj = getDialect.execute(frame, module, dialectNameStr); - - if (delimiterObj == PNone.NO_VALUE) { - delimiterObj = dialectObj.delimiter; - } - if (doublequoteObj == PNone.NO_VALUE) { - doublequoteObj = dialectObj.doubleQuote; - } - if (escapecharObj == PNone.NO_VALUE) { - escapecharObj = dialectObj.escapeChar; - } - if (lineterminatorObj == PNone.NO_VALUE) { - lineterminatorObj = dialectObj.lineTerminator; - } - if (quotingObj == PNone.NO_VALUE) { - quotingObj = dialectObj.quoting; - } - if (quotecharObj == PNone.NO_VALUE) { - quotecharObj = dialectObj.quoteChar; - } - if (skipinitialspaceObj == PNone.NO_VALUE) { - skipinitialspaceObj = dialectObj.skipInitialSpace; - } - if (strictObj == PNone.NO_VALUE) { - strictObj = dialectObj.strict; - } - - return createCSVDialect(frame, inliningTarget, cls, delimiterObj, doublequoteObj, escapecharObj, lineterminatorObj, - quotecharObj, quotingObj, skipinitialspaceObj, strictObj, isTrueNode, pyLongCheckExactNode, pyLongAsIntNode, raiseNode); - } - - @Specialization(guards = {"!isCSVDialect(dialectObj)", "!isPythonClass(dialectObj)", "!isString(dialectObj)", "!isPNone(dialectObj)"}) - static Object doGeneric(VirtualFrame frame, PythonBuiltinClassType cls, Object dialectObj, Object delimiterObj, Object doublequoteObj, Object escapecharObj, Object lineterminatorObj, - Object quotecharObj, Object quotingObj, Object skipinitialspaceObj, Object strictObj, - @Bind("this") Node inliningTarget, - @Exclusive @Cached PyObjectLookupAttr getFirstAttributesNode, - @Exclusive @Cached PyObjectLookupAttr getSecondAttributesNode, - @Exclusive @Cached PyObjectLookupAttr getThirdAttributesNode, - @Exclusive @Cached PyObjectIsTrueNode isTrueNode, - @Exclusive @Cached PyLongCheckExactNode pyLongCheckExactNode, - @Exclusive @Cached PyLongAsIntNode pyLongAsIntNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - - delimiterObj = getAttributeValue(frame, inliningTarget, dialectObj, delimiterObj, T_ATTR_DELIMITER, getFirstAttributesNode); - doublequoteObj = getAttributeValue(frame, inliningTarget, dialectObj, doublequoteObj, T_ATTR_DOUBLEQUOTE, getFirstAttributesNode); - escapecharObj = getAttributeValue(frame, inliningTarget, dialectObj, escapecharObj, T_ATTR_ESCAPECHAR, getFirstAttributesNode); - lineterminatorObj = getAttributeValue(frame, inliningTarget, dialectObj, lineterminatorObj, T_ATTR_LINETERMINATOR, getSecondAttributesNode); - quotingObj = getAttributeValue(frame, inliningTarget, dialectObj, quotingObj, T_ATTR_QUOTING, getSecondAttributesNode); - quotecharObj = getAttributeValue(frame, inliningTarget, dialectObj, quotecharObj, T_ATTR_QUOTECHAR, getSecondAttributesNode); - skipinitialspaceObj = getAttributeValue(frame, inliningTarget, dialectObj, skipinitialspaceObj, T_ATTR_SKIPINITIALSPACE, getThirdAttributesNode); - strictObj = getAttributeValue(frame, inliningTarget, dialectObj, strictObj, T_ATTR_STRICT, getThirdAttributesNode); - - return createCSVDialect(frame, inliningTarget, cls, delimiterObj, doublequoteObj, escapecharObj, lineterminatorObj, - quotecharObj, quotingObj, skipinitialspaceObj, strictObj, isTrueNode, pyLongCheckExactNode, pyLongAsIntNode, raiseNode); - } - - protected static boolean isCSVDialect(Object dialect) { - return dialect instanceof CSVDialect; - } - - private static Object createCSVDialect(VirtualFrame frame, Node inliningTarget, PythonBuiltinClassType cls, Object delimiterObj, Object doublequoteObj, Object escapecharObj, - Object lineterminatorObj, Object quotecharObj, Object quotingObj, Object skipinitialspaceObj, Object strictObj, - PyObjectIsTrueNode isTrueNode, PyLongCheckExactNode pyLongCheckExactNode, PyLongAsIntNode pyLongAsIntNode, PRaiseNode.Lazy raiseNode) { - TruffleString delimiter = getChar(inliningTarget, T_ATTR_DELIMITER, delimiterObj, T_COMMA, false); - boolean doubleQuote = getBoolean(frame, inliningTarget, doublequoteObj, true, isTrueNode); - TruffleString escapeChar = getChar(inliningTarget, T_ATTR_ESCAPECHAR, escapecharObj, T_NOT_SET, true); - TruffleString lineTerminator = getString(inliningTarget, T_ATTR_LINETERMINATOR, lineterminatorObj, T_CRLF); - TruffleString quoteChar = getChar(inliningTarget, T_ATTR_QUOTECHAR, quotecharObj, T_DOUBLE_QUOTE, true); - QuoteStyle quoting = getQuotingValue(frame, inliningTarget, T_ATTR_QUOTING, quotingObj, QUOTE_MINIMAL, pyLongCheckExactNode, pyLongAsIntNode, raiseNode); - boolean skipInitialSpace = getBoolean(frame, inliningTarget, skipinitialspaceObj, false, isTrueNode); - boolean strict = getBoolean(frame, inliningTarget, strictObj, false, isTrueNode); - if (quotecharObj == PNone.NONE && quotingObj == PNone.NO_VALUE) { - quoting = QUOTE_NONE; - } - return createCSVDialect(inliningTarget, cls, delimiter, doubleQuote, escapeChar, lineTerminator, quoteChar, quoting, skipInitialSpace, strict); - } - - @TruffleBoundary - private static Object createCSVDialect(Node raisingNode, PythonBuiltinClassType cls, TruffleString delimiter, boolean doubleQuote, TruffleString escapeChar, TruffleString lineTerminator, - TruffleString quoteChar, QuoteStyle quoting, boolean skipInitialSpace, boolean strict) { - if (TruffleString.EqualNode.getUncached().execute(delimiter, T_NOT_SET, TS_ENCODING)) { - throw PRaiseNode.raiseUncached(raisingNode, TypeError, ErrorMessages.DELIMITER_MUST_BE_ONE_CHAR_STRING); - } - - if (quoting != QUOTE_NONE && TruffleString.EqualNode.getUncached().execute(quoteChar, T_NOT_SET, TS_ENCODING)) { - throw PRaiseNode.raiseUncached(raisingNode, TypeError, ErrorMessages.QUOTECHAR_MUST_BE_SET_IF_QUOTING_ENABLED); - } - - if (lineTerminator == null) { - throw PRaiseNode.raiseUncached(raisingNode, TypeError, ErrorMessages.LINETERMINATOR_MUST_BE_SET); - } - - // delimiter cannot be NOT_SET - int delimiterCodePoint = TruffleString.CodePointAtIndexNode.getUncached().execute(delimiter, 0, TS_ENCODING); - int escapeCharCodePoint = TruffleString.EqualNode.getUncached().execute(escapeChar, T_NOT_SET, TS_ENCODING) ? NOT_SET_CODEPOINT - : TruffleString.CodePointAtIndexNode.getUncached().execute(escapeChar, 0, TS_ENCODING); - int quoteCharCodePoint = TruffleString.EqualNode.getUncached().execute(quoteChar, T_NOT_SET, TS_ENCODING) ? NOT_SET_CODEPOINT - : TruffleString.CodePointAtIndexNode.getUncached().execute(quoteChar, 0, TS_ENCODING); - - return PythonObjectFactory.getUncached().createCSVDialect(cls, delimiter, delimiterCodePoint, doubleQuote, - escapeChar, escapeCharCodePoint, lineTerminator, quoteChar, quoteCharCodePoint, quoting, - skipInitialSpace, strict); - } - - private static Object getAttributeValue(VirtualFrame frame, Node inliningTarget, Object dialect, Object inputValue, TruffleString attributeName, PyObjectLookupAttr getAttributeNode) { - if (inputValue != PNone.NO_VALUE) { - return inputValue; - } - return getAttributeNode.execute(frame, inliningTarget, dialect, attributeName); - } - - @TruffleBoundary - private static TruffleString getChar(Node raisingNode, TruffleString name, Object valueObj, TruffleString defaultValue, boolean optional) { - if (valueObj == PNone.NO_VALUE) { - return defaultValue; - } - if (optional && valueObj == PNone.NONE) { - return T_NOT_SET; - } - - TruffleString charValue; - - try { - charValue = CastToTruffleStringNode.executeUncached(valueObj); - } catch (CannotCastException e) { - throw PRaiseNode.raiseUncached(raisingNode, TypeError, optional ? ErrorMessages.S_MUST_BE_STRING_OR_NONE_NOT_S : ErrorMessages.S_MUST_BE_STRING_NOT_S, name, - GetClassNode.executeUncached(valueObj)); - } - - if (optional && TruffleString.EqualNode.getUncached().execute(charValue, T_NOT_SET, TS_ENCODING)) { - return T_NOT_SET; - } - - if (TruffleString.CodePointLengthNode.getUncached().execute(charValue, TS_ENCODING) != 1) { - throw PRaiseNode.raiseUncached(raisingNode, TypeError, ErrorMessages.MUST_BE_ONE_CHARACTER_STRING, name); - } - - return charValue; - } - - private static boolean getBoolean(VirtualFrame frame, Node inliningTarget, Object valueObj, boolean defaultValue, PyObjectIsTrueNode isTrueNode) { - if (valueObj == PNone.NO_VALUE) { - return defaultValue; - } - - return isTrueNode.execute(frame, inliningTarget, valueObj); - } - - @TruffleBoundary - private static TruffleString getString(Node raisingNode, TruffleString attribute, Object valueObj, TruffleString defaultValue) { - if (valueObj == PNone.NO_VALUE) { - return defaultValue; - } - - if (valueObj == PNone.NONE) { - return null; - } - - TruffleString value; - - try { - value = CastToTruffleStringNode.executeUncached(valueObj); - } catch (CannotCastException e) { - throw PRaiseNode.raiseUncached(raisingNode, TypeError, ErrorMessages.MUST_BE_STRING_QUOTED, attribute); - } - - return value; - } - - private static QuoteStyle getQuotingValue(VirtualFrame frame, Node inliningTarget, TruffleString name, Object valueObj, QuoteStyle defaultValue, - PyLongCheckExactNode pyLongCheckExactNode, PyLongAsIntNode pyLongAsIntNode, PRaiseNode.Lazy raiseNode) { - - if (valueObj == PNone.NO_VALUE) { - return defaultValue; - } - - if (valueObj instanceof QuoteStyle) { - return (QuoteStyle) valueObj; - } - - if (!pyLongCheckExactNode.execute(inliningTarget, valueObj)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MUST_BE_INTEGER_QUOTED_ATTR, name); - } - - int value = pyLongAsIntNode.execute(frame, inliningTarget, valueObj); - - if (!QuoteStyle.containsOrdinalValue(value)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.BAD_QUOTING_VALUE); - } - - return QuoteStyle.getQuoteStyle(value); - } - - } - private static final String CSV_DOC = "CSV parsing and writing.\n" + "\n" + "This module provides classes that assist in the reading and writing\n" + diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/csv/CSVReaderBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/csv/CSVReaderBuiltins.java index 0812632635..1e05de1a4b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/csv/CSVReaderBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/csv/CSVReaderBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -51,32 +51,34 @@ import static com.oracle.graal.python.builtins.modules.csv.CSVReader.ReaderState.START_RECORD; import static com.oracle.graal.python.builtins.modules.csv.QuoteStyle.QUOTE_NONE; import static com.oracle.graal.python.builtins.modules.csv.QuoteStyle.QUOTE_NONNUMERIC; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.modules.csv.CSVReader.ReaderState; import com.oracle.graal.python.builtins.objects.list.PList; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyNumberFloatNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.builtins.ListNodes.AppendNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -93,13 +95,14 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.CSVReader) public final class CSVReaderBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = CSVReaderBuiltinsSlotsGen.SLOTS; @Override protected List> getNodeFactories() { return CSVReaderBuiltinsFactory.getFactories(); } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory public abstract static class IterReaderNode extends PythonUnaryBuiltinNode { @Specialization @@ -108,9 +111,9 @@ Object iter(CSVReader self) { } } - @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iternext, isComplex = true) @GenerateNodeFactory - public abstract static class NextReaderNode extends PythonUnaryBuiltinNode { + public abstract static class NextReaderNode extends TpIterNextBuiltin { private static final int EOL = -2; private static final int NEWLINE_CODEPOINT = '\n'; @@ -120,42 +123,38 @@ public abstract static class NextReaderNode extends PythonUnaryBuiltinNode { @Specialization static Object nextPos(VirtualFrame frame, CSVReader self, @Bind("this") Node inliningTarget, - @Cached TruffleString.ByteIndexOfCodePointNode byteIndexOfCodePointNode, @Cached TruffleString.CreateCodePointIteratorNode createCodePointIteratorNode, - @Cached TruffleStringIterator.NextNode nextNode, + @Cached TruffleStringIterator.NextNode stringNextNode, @Cached TruffleStringBuilder.AppendCodePointNode appendCodePointNode, @Cached TruffleStringBuilder.ToStringNode toStringNode, @Cached PyNumberFloatNode pyNumberFloatNode, @Cached AppendNode appendNode, - @Cached GetNextNode getNextNode, + @Cached PyIterNextNode nextNode, @Cached CastToTruffleStringNode castToStringNode, @Cached GetClassNode getClassNode, - @Cached IsBuiltinObjectProfile isBuiltinClassProfile, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - PList fields = factory.createList(); + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { + PList fields = PFactory.createList(language); CSVModuleBuiltins csvModuleBuiltins = (CSVModuleBuiltins) PythonContext.get(inliningTarget).lookupBuiltinModule(T__CSV).getBuiltins(); self.parseReset(); do { Object lineObj; try { - lineObj = getNextNode.execute(frame, self.inputIter); - } catch (PException e) { - e.expectStopIteration(inliningTarget, isBuiltinClassProfile); + lineObj = nextNode.execute(frame, inliningTarget, self.inputIter); + } catch (IteratorExhausted e) { self.fieldLimit = csvModuleBuiltins.fieldLimit; if (!self.field.isEmpty() || self.state == IN_QUOTED_FIELD) { if (self.dialect.strict) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.CSVError, ErrorMessages.UNEXPECTED_END_OF_DATA); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.CSVError, ErrorMessages.UNEXPECTED_END_OF_DATA); } else { try { parseSaveField(inliningTarget, self, fields, toStringNode, pyNumberFloatNode, appendNode); } catch (AbstractTruffleException ignored) { - throw e; } break; } } - throw raiseNode.get(inliningTarget).raiseStopIteration(); + throw iteratorExhausted(); } self.fieldLimit = csvModuleBuiltins.fieldLimit; @@ -163,13 +162,13 @@ static Object nextPos(VirtualFrame frame, CSVReader self, try { line = castToStringNode.execute(inliningTarget, lineObj); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.CSVError, ErrorMessages.WRONG_ITERATOR_RETURN_TYPE, getClassNode.execute(inliningTarget, lineObj)); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.CSVError, ErrorMessages.WRONG_ITERATOR_RETURN_TYPE, getClassNode.execute(inliningTarget, lineObj)); } self.lineNum++; TruffleStringIterator tsi = createCodePointIteratorNode.execute(line, TS_ENCODING); while (tsi.hasNext()) { - final int codepoint = nextNode.execute(tsi); + final int codepoint = stringNextNode.execute(tsi); parseProcessCodePoint(inliningTarget, self, fields, codepoint, appendCodePointNode, toStringNode, pyNumberFloatNode, appendNode, raiseNode); } parseProcessCodePoint(inliningTarget, self, fields, EOL, appendCodePointNode, toStringNode, pyNumberFloatNode, appendNode, raiseNode); @@ -180,7 +179,7 @@ static Object nextPos(VirtualFrame frame, CSVReader self, @SuppressWarnings("fallthrough") private static void parseProcessCodePoint(Node inliningTarget, CSVReader self, PList fields, int codePoint, AppendCodePointNode appendCodePointNode, ToStringNode toStringNode, - PyNumberFloatNode pyNumberFloatNode, AppendNode appendNode, PRaiseNode.Lazy raiseNode) { + PyNumberFloatNode pyNumberFloatNode, AppendNode appendNode, PRaiseNode raiseNode) { CSVDialect dialect = self.dialect; switch (self.state) { @@ -315,7 +314,7 @@ private static void parseProcessCodePoint(Node inliningTarget, CSVReader self, P self.state = IN_FIELD; } else { /* illegal */ - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.CSVError, ErrorMessages.S_EXPECTED_AFTER_S, dialect.delimiter, dialect.quoteChar); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.CSVError, ErrorMessages.S_EXPECTED_AFTER_S, dialect.delimiter, dialect.quoteChar); } break; @@ -325,7 +324,7 @@ private static void parseProcessCodePoint(Node inliningTarget, CSVReader self, P } else if (codePoint == EOL) { self.state = START_RECORD; } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.CSVError, ErrorMessages.NEWLINE_IN_UNQOUTED_FIELD); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.CSVError, ErrorMessages.NEWLINE_IN_UNQOUTED_FIELD); } break; } @@ -342,11 +341,11 @@ private static void parseSaveField(Node inliningTarget, CSVReader self, PList fi } } - private static void parseAddCodePoint(Node inliningTarget, CSVReader self, int codePoint, TruffleStringBuilder.AppendCodePointNode appendCodePointNode, PRaiseNode.Lazy raise) { + private static void parseAddCodePoint(Node inliningTarget, CSVReader self, int codePoint, TruffleStringBuilder.AppendCodePointNode appendCodePointNode, PRaiseNode raise) { assert TS_ENCODING == TruffleString.Encoding.UTF_32; int cpLen = self.field.byteLength() / 4; // assumes UTF-32 if (cpLen + 1 > self.fieldLimit) { - throw raise.get(inliningTarget).raise(PythonBuiltinClassType.CSVError, ErrorMessages.LARGER_THAN_FIELD_SIZE_LIMIT, self.fieldLimit); + throw raise.raise(inliningTarget, PythonBuiltinClassType.CSVError, ErrorMessages.LARGER_THAN_FIELD_SIZE_LIMIT, self.fieldLimit); } appendCodePointNode.execute(self.field, codePoint, 1, true); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/csv/CSVWriterBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/csv/CSVWriterBuiltins.java index 1a11fd9916..b1987de1f0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/csv/CSVWriterBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/csv/CSVWriterBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -51,7 +51,8 @@ import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyNumberCheckNode; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.lib.PyObjectStrAsTruffleStringNode; @@ -94,23 +95,22 @@ static Object doIt(VirtualFrame frame, CSVWriter self, Object seq, @Cached IsBuiltinObjectProfile errorProfile, @Cached CallUnaryMethodNode callNode, @Cached TruffleString.CreateCodePointIteratorNode createCodePointIteratorNode, - @Cached TruffleStringIterator.NextNode nextNode, + @Cached TruffleStringIterator.NextNode stringNextNode, @Cached TruffleString.ByteIndexOfCodePointNode byteIndexOfCodePointNode, @Cached TruffleStringBuilder.AppendCodePointNode appendCodePointNode, @Cached TruffleStringBuilder.AppendStringNode appendStringNode, @Cached TruffleStringBuilder.ToStringNode toStringNode, @Cached PyObjectStrAsTruffleStringNode objectStrAsTruffleStringNode, @Cached PyNumberCheckNode pyNumberCheckNode, - @Cached GetNextNode getNextNode, - @Cached IsBuiltinObjectProfile isBuiltinClassProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PyIterNextNode nextNode, + @Cached PRaiseNode raiseNode) { Object iter; try { iter = getIter.execute(frame, inliningTarget, seq); } catch (PException e) { e.expect(inliningTarget, PythonBuiltinClassType.TypeError, errorProfile); - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.CSVError, ErrorMessages.EXPECTED_ITERABLE_NOT_S, getClass.execute(inliningTarget, seq)); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.CSVError, ErrorMessages.EXPECTED_ITERABLE_NOT_S, getClass.execute(inliningTarget, seq)); } // Join all fields of passed in sequence in internal buffer. @@ -118,26 +118,26 @@ static Object doIt(VirtualFrame frame, CSVWriter self, Object seq, CSVDialect dialect = self.dialect; boolean first = true; while (true) { + Object field; try { - Object field = getNextNode.execute(frame, iter); - /* If this is not the first field we need a field separator */ - if (!first) { - appendStringNode.execute(sb, dialect.delimiter); - } else { - first = false; - } - joinField(inliningTarget, sb, dialect, field, createCodePointIteratorNode, nextNode, byteIndexOfCodePointNode, appendCodePointNode, appendStringNode, objectStrAsTruffleStringNode, - pyNumberCheckNode, raiseNode); - } catch (PException e) { - e.expectStopIteration(inliningTarget, isBuiltinClassProfile); + field = nextNode.execute(frame, inliningTarget, iter); + } catch (IteratorExhausted e) { break; } + /* If this is not the first field we need a field separator */ + if (!first) { + appendStringNode.execute(sb, dialect.delimiter); + } else { + first = false; + } + joinField(inliningTarget, sb, dialect, field, createCodePointIteratorNode, stringNextNode, byteIndexOfCodePointNode, appendCodePointNode, appendStringNode, + objectStrAsTruffleStringNode, pyNumberCheckNode, raiseNode); } if (!first && sb.isEmpty()) { if (dialect.quoting == QUOTE_NONE) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.CSVError, ErrorMessages.EMPTY_FIELD_RECORD_MUST_BE_QUOTED); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.CSVError, ErrorMessages.EMPTY_FIELD_RECORD_MUST_BE_QUOTED); } - joinAppend(inliningTarget, sb, dialect, null, true, createCodePointIteratorNode, nextNode, byteIndexOfCodePointNode, appendCodePointNode, appendStringNode, raiseNode); + joinAppend(inliningTarget, sb, dialect, null, true, createCodePointIteratorNode, stringNextNode, byteIndexOfCodePointNode, appendCodePointNode, appendStringNode, raiseNode); } appendStringNode.execute(sb, dialect.lineTerminator); return callNode.executeObject(frame, self.write, toStringNode.execute(sb)); @@ -146,7 +146,7 @@ static Object doIt(VirtualFrame frame, CSVWriter self, Object seq, private static void joinField(Node inliningTarget, TruffleStringBuilder sb, CSVDialect dialect, Object field, TruffleString.CreateCodePointIteratorNode createCodePointIteratorNode, TruffleStringIterator.NextNode nextNode, TruffleString.ByteIndexOfCodePointNode byteIndexOfCodePointNode, TruffleStringBuilder.AppendCodePointNode appendCodePointNode, TruffleStringBuilder.AppendStringNode appendStringNode, PyObjectStrAsTruffleStringNode objectStrAsTruffleStringNode, PyNumberCheckNode pyNumberCheckNode, - PRaiseNode.Lazy raiseNode) { + PRaiseNode raiseNode) { boolean quoted; switch (dialect.quoting) { @@ -171,7 +171,7 @@ private static void joinField(Node inliningTarget, TruffleStringBuilder sb, CSVD private static void joinAppend(Node inliningTarget, TruffleStringBuilder sb, CSVDialect dialect, TruffleString field, boolean quoted, TruffleString.CreateCodePointIteratorNode createCodePointIteratorNode, TruffleStringIterator.NextNode nextNode, TruffleString.ByteIndexOfCodePointNode byteIndexOfCodePointNode, - TruffleStringBuilder.AppendCodePointNode appendCodePointNode, TruffleStringBuilder.AppendStringNode appendStringNode, PRaiseNode.Lazy raiseNode) { + TruffleStringBuilder.AppendCodePointNode appendCodePointNode, TruffleStringBuilder.AppendStringNode appendStringNode, PRaiseNode raiseNode) { /* * If we don't already know that the field must be quoted due to dialect settings, check * if the field contains characters due to which it must be quoted. @@ -214,7 +214,7 @@ private static void joinAppend(Node inliningTarget, TruffleStringBuilder sb, CSV } if (wantEscape) { if (dialect.escapeCharCodePoint == NOT_SET_CODEPOINT) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.CSVError, ErrorMessages.ESCAPE_WITHOUT_ESCAPECHAR); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.CSVError, ErrorMessages.ESCAPE_WITHOUT_ESCAPECHAR); } appendStringNode.execute(sb, dialect.escapeChar); } @@ -259,21 +259,17 @@ public abstract static class WriteRowsNode extends PythonBinaryBuiltinNode { Object doIt(VirtualFrame frame, CSVWriter self, Object seq, @Bind("this") Node inliningTarget, @Cached PyObjectGetIter getIter, - @Cached GetNextNode getNext, - @Cached IsBuiltinObjectProfile isBuiltinClassProfile, + @Cached PyIterNextNode nextNode, @Cached WriteRowNode writeRow) { - Object iter, row; - - iter = getIter.execute(frame, inliningTarget, seq); - + Object iter = getIter.execute(frame, inliningTarget, seq); while (true) { + Object row; try { - row = getNext.execute(frame, iter); - writeRow.execute(frame, self, row); - } catch (PException e) { - e.expectStopIteration(inliningTarget, isBuiltinClassProfile); + row = nextNode.execute(frame, inliningTarget, iter); + } catch (IteratorExhausted e) { break; } + writeRow.execute(frame, self, row); } return PNone.NONE; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CArgObjectBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CArgObjectBuiltins.java index 79144207e7..d3df325b45 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CArgObjectBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CArgObjectBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,11 +40,13 @@ */ package com.oracle.graal.python.builtins.modules.ctypes; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -53,9 +55,10 @@ import com.oracle.graal.python.builtins.modules.ctypes.memory.Pointer; import com.oracle.graal.python.builtins.modules.ctypes.memory.PointerNodes; import com.oracle.graal.python.builtins.objects.PythonAbstractObject; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Bind; @@ -72,6 +75,8 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.CArgObject) public final class CArgObjectBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = CArgObjectBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return CArgObjectBuiltinsFactory.getFactories(); @@ -96,7 +101,7 @@ static boolean isLiteralChar(char c) { return c < 128 && isPrintable(c) && c != '\\' && c != '\''; } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @@ -162,9 +167,9 @@ abstract static class ParamFuncNode extends Node { @Specialization static PyCArgObject paramFunc(CDataObject self, StgDictObject stgDict, - @Cached(inline = false) PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached(inline = false) TruffleString.CodePointAtIndexNode codePointAtIndexNode) { - PyCArgObject parg = factory.createCArgObject(); + PyCArgObject parg = PFactory.createCArgObject(language); switch (stgDict.paramfunc) { // Corresponds to PyCArrayType_paramfunc case PyCArrayTypeParamFunc -> { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CDataBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CDataBuiltins.java index a7deaae0c6..01af8e177d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CDataBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CDataBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,9 +47,8 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_TRUFFLE_CDATA_INIT_BUFFER_PROTOCOL; import static com.oracle.graal.python.nodes.BuiltinNames.T__CTYPES; import static com.oracle.graal.python.nodes.ErrorMessages.CTYPES_OBJECTS_CONTAINING_POINTERS_CANNOT_BE_PICKLED; -import static com.oracle.graal.python.nodes.ErrorMessages.S_DICT_MUST_BE_A_DICTIONARY_NOT_S; +import static com.oracle.graal.python.nodes.ErrorMessages.P_DICT_MUST_BE_A_DICTIONARY_NOT_P; import static com.oracle.graal.python.nodes.ErrorMessages.UNHASHABLE_TYPE; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.NotImplementedError; @@ -59,6 +58,9 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -73,7 +75,8 @@ import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.HashBuiltinNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; @@ -81,12 +84,11 @@ import com.oracle.graal.python.nodes.attributes.GetAttributeNode; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromPythonObjectNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Bind; @@ -101,6 +103,8 @@ @CoreFunctions(extendClasses = PyCData) public final class CDataBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = CDataBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return CDataBuiltinsFactory.getFactories(); @@ -152,13 +156,13 @@ static Object PyCData_from_outparam(CDataObject self) { } } - @Builtin(name = J___HASH__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_hash, isComplex = true) @GenerateNodeFactory - protected abstract static class HashNode extends PythonBuiltinNode { + protected abstract static class HashNode extends HashBuiltinNode { @Specialization static long hash(@SuppressWarnings("unused") CDataObject self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, UNHASHABLE_TYPE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, UNHASHABLE_TYPE); } } @@ -169,30 +173,30 @@ protected abstract static class BaseReduceNode extends PythonUnaryBuiltinNode { @Specialization static Object reduce(VirtualFrame frame, CDataObject self, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached PyObjectStgDictNode pyObjectStgDictNode, @Cached("create(T___DICT__)") GetAttributeNode getAttributeNode, @Cached ReadAttributeFromPythonObjectNode readAttrNode, @Cached PointerNodes.ReadBytesNode readBytesNode, @Cached GetClassNode getClassNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { StgDictObject stgDict = pyObjectStgDictNode.execute(inliningTarget, self); if ((stgDict.flags & (TYPEFLAG_ISPOINTER | TYPEFLAG_HASPOINTER)) != 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, CTYPES_OBJECTS_CONTAINING_POINTERS_CANNOT_BE_PICKLED); + throw raiseNode.raise(inliningTarget, ValueError, CTYPES_OBJECTS_CONTAINING_POINTERS_CANNOT_BE_PICKLED); } Object dict = getAttributeNode.executeObject(frame, self); Object[] t1 = new Object[]{dict, null}; - t1[1] = factory.createBytes(readBytesNode.execute(inliningTarget, self.b_ptr, self.b_size)); + t1[1] = PFactory.createBytes(language, readBytesNode.execute(inliningTarget, self.b_ptr, self.b_size)); Object clazz = getClassNode.execute(inliningTarget, self); - Object[] t2 = new Object[]{clazz, factory.createTuple(t1)}; + Object[] t2 = new Object[]{clazz, PFactory.createTuple(language, t1)}; PythonModule ctypes = PythonContext.get(inliningTarget).lookupBuiltinModule(T__CTYPES); Object unpickle = readAttrNode.execute(ctypes, T_UNPICKLE, null); if (unpickle == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, NotImplementedError, toTruffleStringUncached("unpickle isn't supported yet.")); + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, toTruffleStringUncached("unpickle isn't supported yet.")); } - Object[] t3 = new Object[]{unpickle, factory.createTuple(t2)}; - return factory.createTuple(t3); // "O(O(NN))" + Object[] t3 = new Object[]{unpickle, PFactory.createTuple(language, t2)}; + return PFactory.createTuple(language, t3); // "O(O(NN))" } } @@ -206,15 +210,13 @@ static Object PyCData_setstate(VirtualFrame frame, CDataObject self, PTuple args @Bind("this") Node inliningTarget, @Cached SequenceStorageNodes.GetInternalObjectArrayNode getArray, @Cached("create(T___DICT__)") GetAttributeNode getAttributeNode, - @Cached GetClassNode getClassNode, - @Cached GetNameNode getNameNode, @Cached PyNumberAsSizeNode asSizeNode, @Cached HashingStorageAddAllToOther addAllToOtherNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { SequenceStorage storage = args.getSequenceStorage(); Object[] array = getArray.execute(inliningTarget, storage); if (storage.length() < 3 || !PGuards.isDict(array[0]) || !PGuards.isInteger(array[2])) { - throw raiseNode.get(inliningTarget).raise(TypeError); + throw raiseNode.raise(inliningTarget, TypeError); } PDict dict = (PDict) array[0]; Object data = array[1]; @@ -227,9 +229,7 @@ static Object PyCData_setstate(VirtualFrame frame, CDataObject self, PTuple args memmove(inliningTarget, self.b_ptr, data, len); Object mydict = getAttributeNode.executeObject(frame, self); if (!PGuards.isDict(mydict)) { - throw raiseNode.get(inliningTarget).raise(TypeError, S_DICT_MUST_BE_A_DICTIONARY_NOT_S, - getNameNode.execute(inliningTarget, getClassNode.execute(inliningTarget, self)), - getNameNode.execute(inliningTarget, getClassNode.execute(inliningTarget, mydict))); + throw raiseNode.raise(inliningTarget, TypeError, P_DICT_MUST_BE_A_DICTIONARY_NOT_P, self, mydict); } PDict selfDict = (PDict) mydict; addAllToOtherNode.execute(frame, inliningTarget, dict.getDictStorage(), selfDict); @@ -239,7 +239,7 @@ static Object PyCData_setstate(VirtualFrame frame, CDataObject self, PTuple args @SuppressWarnings("unused") private static void memmove(Node raisingNode, Object dest, Object src, int len) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(raisingNode, NotImplementedError, toTruffleStringUncached("memmove is partially supported.")); // TODO + throw PRaiseNode.raiseStatic(raisingNode, NotImplementedError, toTruffleStringUncached("memmove is partially supported.")); // TODO } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CDataTypeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CDataTypeBuiltins.java index 7e848296df..792672b3f5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CDataTypeBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CDataTypeBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -60,13 +60,13 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors; import com.oracle.graal.python.builtins.modules.BuiltinFunctions.IsInstanceNode; import com.oracle.graal.python.builtins.modules.SysModuleBuiltins.AuditNode; import com.oracle.graal.python.builtins.modules.ctypes.CFieldBuiltins.GetFuncNode; @@ -84,6 +84,7 @@ import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItem; import com.oracle.graal.python.builtins.objects.dict.PDict; +import com.oracle.graal.python.builtins.objects.memoryview.MemoryViewBuiltins; import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetBaseClassNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode; @@ -99,7 +100,7 @@ import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -156,7 +157,7 @@ static Object CDataType_from_param(VirtualFrame frame, Object type, Object value @Cached PyTypeStgDictNode pyTypeStgDictNode, @Cached PyObjectLookupAttr lookupAttr, @Cached IsInstanceNode isInstanceNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (isInstanceNode.executeWith(frame, value, type)) { return value; } @@ -174,7 +175,7 @@ static Object CDataType_from_param(VirtualFrame frame, Object type, Object value return value; } } - throw raiseNode.get(inliningTarget).raise(TypeError, EXPECTED_P_INSTANCE_INSTEAD_OF_POINTER_TO_P, type, ob != null ? ob : PNone.NONE); + throw raiseNode.raise(inliningTarget, TypeError, EXPECTED_P_INSTANCE_INSTEAD_OF_POINTER_TO_P, type, ob != null ? ob : PNone.NONE); } Object as_parameter = lookupAttr.execute(frame, inliningTarget, value, T__AS_PARAMETER_); @@ -183,7 +184,7 @@ static Object CDataType_from_param(VirtualFrame frame, Object type, Object value return CDataType_from_param(frame, type, as_parameter, inliningTarget, pyTypeStgDictNode, lookupAttr, isInstanceNode, raiseNode); } - throw raiseNode.get(inliningTarget).raise(TypeError, EXPECTED_P_INSTANCE_INSTEAD_OF_P, type, value); + throw raiseNode.raise(inliningTarget, TypeError, EXPECTED_P_INSTANCE_INSTEAD_OF_P, type, value); } } @@ -226,30 +227,30 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static Object CDataType_from_buffer(VirtualFrame frame, Object type, Object obj, int offset, @Bind("this") Node inliningTarget, - @Cached BuiltinConstructors.MemoryViewNode memoryViewNode, + @Cached MemoryViewBuiltins.MemoryViewNode memoryViewNode, @Cached PyTypeStgDictNode pyTypeStgDictNode, @Cached PyCDataAtAddress atAddress, @Cached KeepRefNode keepRefNode, @Cached AuditNode auditNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { StgDictObject dict = pyTypeStgDictNode.checkAbstractClass(inliningTarget, type, raiseNode); PMemoryView mv = memoryViewNode.execute(frame, obj); if (mv.isReadOnly()) { - throw raiseNode.get(inliningTarget).raise(TypeError, UNDERLYING_BUFFER_IS_NOT_WRITABLE); + throw raiseNode.raise(inliningTarget, TypeError, UNDERLYING_BUFFER_IS_NOT_WRITABLE); } if (!mv.isCContiguous()) { - throw raiseNode.get(inliningTarget).raise(TypeError, UNDERLYING_BUFFER_IS_NOT_C_CONTIGUOUS); + throw raiseNode.raise(inliningTarget, TypeError, UNDERLYING_BUFFER_IS_NOT_C_CONTIGUOUS); } if (offset < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, OFFSET_CANNOT_BE_NEGATIVE); + throw raiseNode.raise(inliningTarget, ValueError, OFFSET_CANNOT_BE_NEGATIVE); } if (dict.size > mv.getLength() - offset) { - throw raiseNode.get(inliningTarget).raise(ValueError, BUFFER_SIZE_TOO_SMALL_D_INSTEAD_OF_AT_LEAST_D_BYTES, mv.getLength(), dict.size + offset); + throw raiseNode.raise(inliningTarget, ValueError, BUFFER_SIZE_TOO_SMALL_D_INSTEAD_OF_AT_LEAST_D_BYTES, mv.getLength(), dict.size + offset); } auditNode.audit(inliningTarget, "ctypes.cdata/buffer", mv, mv.getLength(), offset); @@ -282,18 +283,18 @@ static Object CDataType_from_buffer_copy(Object type, Object buffer, int offset, @Cached AuditNode auditNode, @Cached CtypesNodes.GenericPyCDataNewNode pyCDataNewNode, @Cached PyTypeStgDictNode pyTypeStgDictNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { StgDictObject dict = pyTypeStgDictNode.checkAbstractClass(inliningTarget, type, raiseNode); if (offset < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, OFFSET_CANNOT_BE_NEGATIVE); + throw raiseNode.raise(inliningTarget, ValueError, OFFSET_CANNOT_BE_NEGATIVE); } int bufferLen = bufferLib.getBufferLength(buffer); if (dict.size > bufferLen - offset) { - throw raiseNode.get(inliningTarget).raise(ValueError, BUFFER_SIZE_TOO_SMALL_D_INSTEAD_OF_AT_LEAST_D_BYTES, bufferLen, dict.size + offset); + throw raiseNode.raise(inliningTarget, ValueError, BUFFER_SIZE_TOO_SMALL_D_INSTEAD_OF_AT_LEAST_D_BYTES, bufferLen, dict.size + offset); } // This prints the raw pointer in C, so just print 0 @@ -331,17 +332,17 @@ static Object CDataType_in_dll(VirtualFrame frame, Object type, Object dll, Truf @Cached AuditNode auditNode, @Cached PointerNodes.PointerFromLongNode pointerFromLongNode, @Cached CtypesDlSymNode dlSymNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { auditNode.audit(inliningTarget, "ctypes.dlsym", dll, name); Object obj = getAttributeNode.executeObject(frame, dll); if (!longCheckNode.execute(inliningTarget, obj)) { - throw raiseNode.get(inliningTarget).raise(TypeError, THE_HANDLE_ATTRIBUTE_OF_THE_SECOND_ARGUMENT_MUST_BE_AN_INTEGER); + throw raiseNode.raise(inliningTarget, TypeError, THE_HANDLE_ATTRIBUTE_OF_THE_SECOND_ARGUMENT_MUST_BE_AN_INTEGER); } Pointer handlePtr; try { handlePtr = pointerFromLongNode.execute(inliningTarget, obj); } catch (PException e) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.COULD_NOT_CONVERT_THE_HANDLE_ATTRIBUTE_TO_A_POINTER); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.COULD_NOT_CONVERT_THE_HANDLE_ATTRIBUTE_TO_A_POINTER); } Object address = dlSymNode.execute(frame, handlePtr, name, ValueError); if (address instanceof PythonNativeVoidPtr ptr) { @@ -365,7 +366,7 @@ static CDataObject PyCData_AtAddress(Object type, Pointer pointer, @Cached PyTypeCheck pyTypeCheck, @Cached PyTypeStgDictNode pyTypeStgDictNode, @Cached CtypesNodes.CreateCDataObjectNode createCDataObjectNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { // auditNode.audit("ctypes.cdata", buf); // assert(PyType_Check(type)); StgDictObject stgdict = pyTypeStgDictNode.checkAbstractClass(inliningTarget, type, raiseNode); @@ -420,6 +421,7 @@ protected abstract static class PyCDataSetNode extends Node { @Specialization static void PyCData_set(VirtualFrame frame, CDataObject dst, Object type, FieldSet setfunc, Object value, int index, int size, Pointer ptr, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached SetFuncNode setFuncNode, @Cached CallNode callNode, @Cached PyTypeCheck pyTypeCheck, @@ -429,14 +431,13 @@ static void PyCData_set(VirtualFrame frame, CDataObject dst, Object type, FieldS @Cached KeepRefNode keepRefNode, @Cached PointerNodes.MemcpyNode memcpyNode, @Cached PointerNodes.WritePointerNode writePointerNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (!pyTypeCheck.isCDataObject(inliningTarget, dst)) { - throw raiseNode.get(inliningTarget).raise(TypeError, NOT_A_CTYPE_INSTANCE); + throw raiseNode.raise(inliningTarget, TypeError, NOT_A_CTYPE_INSTANCE); } Object result = PyCDataSetInternal(frame, inliningTarget, type, setfunc, value, size, ptr, - factory, + language, pyTypeCheck, setFuncNode, callNode, @@ -455,7 +456,7 @@ static void PyCData_set(VirtualFrame frame, CDataObject dst, Object type, FieldS */ // corresponds to _PyCData_set static Object PyCDataSetInternal(VirtualFrame frame, Node inliningTarget, Object type, FieldSet setfunc, Object value, int size, Pointer ptr, - PythonObjectFactory factory, + PythonLanguage language, PyTypeCheck pyTypeCheck, SetFuncNode setFuncNode, CallNode callNode, @@ -464,7 +465,7 @@ static Object PyCDataSetInternal(VirtualFrame frame, Node inliningTarget, Object PyObjectStgDictNode pyObjectStgDictNode, PointerNodes.MemcpyNode memcpyNode, PointerNodes.WritePointerNode writePointerNode, - PRaiseNode.Lazy raiseNode) { + PRaiseNode raiseNode) { if (setfunc != FieldSet.nil) { return setFuncNode.execute(frame, setfunc, ptr, value, size); } @@ -480,7 +481,7 @@ static Object PyCDataSetInternal(VirtualFrame frame, Node inliningTarget, Object if (PGuards.isPTuple(value)) { Object ob = callNode.execute(frame, type, value); return PyCDataSetInternal(frame, inliningTarget, type, setfunc, ob, size, ptr, - factory, + language, pyTypeCheck, setFuncNode, callNode, @@ -494,14 +495,14 @@ static Object PyCDataSetInternal(VirtualFrame frame, Node inliningTarget, Object writePointerNode.execute(inliningTarget, ptr, Pointer.NULL); return PNone.NONE; } else { - throw raiseNode.get(inliningTarget).raise(TypeError, EXPECTED_P_INSTANCE_GOT_P, type, value); + throw raiseNode.raise(inliningTarget, TypeError, EXPECTED_P_INSTANCE_GOT_P, type, value); } } CDataObject src = (CDataObject) value; if (isInstanceNode.executeWith(frame, value, type)) { memcpyNode.execute(inliningTarget, ptr, src.b_ptr, size); - return GetKeepedObjects(src, factory); + return GetKeepedObjects(src, language); } if (pyTypeCheck.isPyCPointerTypeObject(inliningTarget, type) && pyTypeCheck.isArrayObject(inliningTarget, value)) { @@ -511,12 +512,12 @@ static Object PyCDataSetInternal(VirtualFrame frame, Node inliningTarget, Object assert p2 != null : "Cannot be NULL for pointer types"; if (p1.proto != p2.proto) { - throw raiseNode.get(inliningTarget).raise(TypeError, INCOMPATIBLE_TYPES_P_INSTANCE_INSTEAD_OF_P_INSTANCE, value, type); + throw raiseNode.raise(inliningTarget, TypeError, INCOMPATIBLE_TYPES_P_INSTANCE_INSTEAD_OF_P_INSTANCE, value, type); } writePointerNode.execute(inliningTarget, ptr, src.b_ptr); - Object keep = GetKeepedObjects(src, factory); + Object keep = GetKeepedObjects(src, language); /* * We are assigning an array object to a field which represents a pointer. This has @@ -525,9 +526,9 @@ static Object PyCDataSetInternal(VirtualFrame frame, Node inliningTarget, Object * it's object list. So we create a tuple, containing b_objects list PLUS the array * itself, and return that! */ - return factory.createTuple(new Object[]{keep, value}); + return PFactory.createTuple(language, new Object[]{keep, value}); } - throw raiseNode.get(inliningTarget).raise(TypeError, INCOMPATIBLE_TYPES_P_INSTANCE_INSTEAD_OF_P_INSTANCE, value, type); + throw raiseNode.raise(inliningTarget, TypeError, INCOMPATIBLE_TYPES_P_INSTANCE_INSTEAD_OF_P_INSTANCE, value, type); } } @@ -536,14 +537,14 @@ static Object PyCDataSetInternal(VirtualFrame frame, Node inliningTarget, Object * Code to keep needed objects alive */ - protected static CDataObject PyCData_GetContainer(CDataObject leaf, PythonObjectFactory factory) { + protected static CDataObject PyCData_GetContainer(CDataObject leaf, PythonLanguage language) { CDataObject self = leaf; while (self.b_base != null) { self = self.b_base; } if (self.b_objects == null) { if (self.b_length != 0) { - self.b_objects = factory.createDict(); + self.b_objects = PFactory.createDict(language); } else { self.b_objects = PNone.NONE; } @@ -551,8 +552,8 @@ protected static CDataObject PyCData_GetContainer(CDataObject leaf, PythonObject return self; } - static Object GetKeepedObjects(CDataObject target, PythonObjectFactory factory) { - return PyCData_GetContainer(target, factory).b_objects; + static Object GetKeepedObjects(CDataObject target, PythonLanguage language) { + return PyCData_GetContainer(target, language).b_objects; } /* @@ -585,13 +586,13 @@ static void none(CDataObject target, int index, PNone keep) { @Specialization(guards = "!isNone(keep)") static void KeepRef(VirtualFrame frame, Node inliningTarget, CDataObject target, int index, Object keep, + @Bind PythonLanguage language, @Cached(inline = false) TruffleStringBuilder.AppendStringNode appendStringNode, @Cached(inline = false) TruffleStringBuilder.ToStringNode toStringNode, @Cached(inline = false) TruffleString.FromJavaStringNode fromJavaStringNode, @Cached HashingStorageSetItem setItem, - @Cached(inline = false) PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - CDataObject ob = PyCData_GetContainer(target, factory); + @Cached PRaiseNode raiseNode) { + CDataObject ob = PyCData_GetContainer(target, language); if (!PGuards.isDict(ob.b_objects)) { ob.b_objects = keep; return; @@ -605,7 +606,7 @@ static void KeepRef(VirtualFrame frame, Node inliningTarget, CDataObject target, private static final int MAX_KEY_SIZE = 256; static TruffleString unique_key(Node inliningTarget, CDataObject cdata, int index, - PRaiseNode.Lazy raiseNode, TruffleStringBuilder.AppendStringNode appendStringNode, + PRaiseNode raiseNode, TruffleStringBuilder.AppendStringNode appendStringNode, TruffleStringBuilder.ToStringNode toStringNode, TruffleString.FromJavaStringNode fromJavaStringNode) { assert TS_ENCODING == Encoding.UTF_32; final int bytesPerCodepoint = 4; // assumes utf-32 @@ -617,7 +618,7 @@ static TruffleString unique_key(Node inliningTarget, CDataObject cdata, int inde int bytesLeft = MAX_KEY_SIZE - sb.byteLength() / bytesPerCodepoint - 1; /* Hex format needs 2 characters per byte */ if (bytesLeft < Integer.BYTES * 2) { - throw raiseNode.get(inliningTarget).raise(ValueError, CTYPES_OBJECT_STRUCTURE_TOO_DEEP); + throw raiseNode.raise(inliningTarget, ValueError, CTYPES_OBJECT_STRUCTURE_TOO_DEEP); } appendStringNode.execute(sb, T_COLON); appendStringNode.execute(sb, fromJavaStringNode.execute(toHex(target.b_index), TS_ENCODING)); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CDataTypeSequenceBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CDataTypeSequenceBuiltins.java index b5524c2374..c522f5fee0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CDataTypeSequenceBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CDataTypeSequenceBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -77,7 +77,7 @@ import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -110,27 +110,28 @@ abstract static class RepeatNode extends SqRepeatBuiltinNode { @Specialization(guards = "length >= 0") static Object PyCArrayType_from_ctype(VirtualFrame frame, Object itemtype, int length, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached HashingStorageSetItem setItem, @Cached HashingStorageGetItem getItem, @Cached CallNode callNode, @Cached IsTypeNode isTypeNode, @Cached GetNameNode getNameNode, @Cached SimpleTruffleStringFormatNode simpleFormatNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - Object key = factory.createTuple(new Object[]{itemtype, length}); - CtypesThreadState ctypes = CtypesThreadState.get(PythonContext.get(inliningTarget), PythonLanguage.get(inliningTarget)); + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { + Object key = PFactory.createTuple(language, new Object[]{itemtype, length}); + CtypesThreadState ctypes = CtypesThreadState.get(context, context.getLanguage(inliningTarget)); Object result = getItem.execute(frame, inliningTarget, ctypes.cache, key); if (result != null) { return result; } if (!isTypeNode.execute(inliningTarget, itemtype)) { - throw raiseNode.get(inliningTarget).raise(TypeError, EXPECTED_A_TYPE_OBJECT); + throw raiseNode.raise(inliningTarget, TypeError, EXPECTED_A_TYPE_OBJECT); } TruffleString name = simpleFormatNode.format("%s_Array_%d", getNameNode.execute(inliningTarget, itemtype), length); - PDict dict = factory.createDict(new PKeyword[]{new PKeyword(T__LENGTH_, length), new PKeyword(T__TYPE_, itemtype)}); - PTuple tuple = factory.createTuple(new Object[]{PyCArray}); + PDict dict = PFactory.createDict(language, new PKeyword[]{new PKeyword(T__LENGTH_, length), new PKeyword(T__TYPE_, itemtype)}); + PTuple tuple = PFactory.createTuple(language, new Object[]{PyCArray}); result = callNode.execute(frame, PyCArrayType, name, tuple, dict); HashingStorage newStorage = setItem.execute(frame, inliningTarget, ctypes.cache, key, result); assert newStorage == ctypes.cache; @@ -139,8 +140,8 @@ static Object PyCArrayType_from_ctype(VirtualFrame frame, Object itemtype, int l @Specialization(guards = "length < 0") static Object error(@SuppressWarnings("unused") Object self, int length, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ARRAY_LENGTH_MUST_BE_0_NOT_D, length); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ARRAY_LENGTH_MUST_BE_0_NOT_D, length); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CFieldBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CFieldBuiltins.java index ae5dcfd813..858baed7f6 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CFieldBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CFieldBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,17 +45,16 @@ import static com.oracle.graal.python.nodes.ErrorMessages.CANT_DELETE_ATTRIBUTE; import static com.oracle.graal.python.nodes.ErrorMessages.HAS_NO_STGINFO; import static com.oracle.graal.python.nodes.ErrorMessages.NOT_A_CTYPE_INSTANCE; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.NotImplementedError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; import static com.oracle.graal.python.util.PythonUtils.ARRAY_ACCESSOR_SWAPPED; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; -import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; @@ -95,7 +94,7 @@ import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; @@ -154,19 +153,19 @@ static void doit(VirtualFrame frame, CFieldObject self, Object inst, Object valu @Bind("this") Node inliningTarget, @Cached PyTypeCheck pyTypeCheck, @Cached PyCDataSetNode cDataSetNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (!pyTypeCheck.isCDataObject(inliningTarget, inst)) { - throw raiseNode.get(inliningTarget).raise(TypeError, NOT_A_CTYPE_INSTANCE); + throw raiseNode.raise(inliningTarget, TypeError, NOT_A_CTYPE_INSTANCE); } CDataObject dst = (CDataObject) inst; cDataSetNode.execute(frame, dst, self.proto, self.setfunc, value, self.index, self.size, dst.b_ptr.withOffset(self.offset)); } - @Specialization(guards = "!isNoValue(value)") + @Specialization(guards = "isNoValue(value)") @InliningCutoff static void doit(CFieldObject self, Object inst, Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, CANT_DELETE_ATTRIBUTE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, CANT_DELETE_ATTRIBUTE); } } @@ -181,19 +180,19 @@ static Object doit(CFieldObject self, Object inst, @SuppressWarnings("unused") O @Cached InlinedConditionProfile instIsNoValueProfile, @Cached PyCDataGetNode pyCDataGetNode, @Cached PyTypeCheck pyTypeCheck, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (instIsNoValueProfile.profile(inliningTarget, inst == PNone.NO_VALUE)) { return self; } if (!pyTypeCheck.isCDataObject(inliningTarget, inst)) { - throw raiseNode.get(inliningTarget).raise(TypeError, NOT_A_CTYPE_INSTANCE); + throw raiseNode.raise(inliningTarget, TypeError, NOT_A_CTYPE_INSTANCE); } CDataObject src = (CDataObject) inst; return pyCDataGetNode.execute(inliningTarget, self.proto, self.getfunc, src, self.index, self.size, src.b_ptr.withOffset(self.offset)); } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @@ -238,17 +237,18 @@ TruffleString PyCField_repr(CFieldObject self, @SuppressWarnings("fallthrough") abstract static class PyCFieldFromDesc extends Node { - abstract CFieldObject execute(Node inliningTarget, Object desc, int index, int bitsize, int pack, boolean big_endian, int[] props, PythonObjectFactory factory); + abstract CFieldObject execute(Node inliningTarget, Object desc, int index, int bitsize, int pack, boolean big_endian, int[] props); @Specialization - static CFieldObject PyCField_FromDesc(Node inliningTarget, Object desc, int index, int bitsize, int pack, boolean big_endian, int[] props, PythonObjectFactory factory, + static CFieldObject PyCField_FromDesc(Node inliningTarget, Object desc, int index, int bitsize, int pack, boolean big_endian, int[] props, + @Bind PythonLanguage language, @Cached PyTypeCheck pyTypeCheck, @Cached PyTypeStgDictNode pyTypeStgDictNode, - @Cached PRaiseNode.Lazy raiseNode) { - CFieldObject self = factory.createCFieldObject(PythonBuiltinClassType.CField); + @Cached PRaiseNode raiseNode) { + CFieldObject self = PFactory.createCFieldObject(language); StgDictObject dict = pyTypeStgDictNode.execute(inliningTarget, desc); if (dict == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, HAS_NO_STGINFO); + throw raiseNode.raise(inliningTarget, TypeError, HAS_NO_STGINFO); } int fieldtype; if (bitsize != 0 /* this is a bitfield request */ @@ -288,7 +288,7 @@ static CFieldObject PyCField_FromDesc(Node inliningTarget, Object desc, int inde if (adict != null && adict.proto != null) { StgDictObject idict = pyTypeStgDictNode.execute(inliningTarget, adict.proto); if (idict == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, HAS_NO_STGINFO); + throw raiseNode.raise(inliningTarget, TypeError, HAS_NO_STGINFO); } if (idict.getfunc == FieldDesc.c.getfunc) { FieldDesc fd = FieldDesc.s; @@ -474,7 +474,7 @@ static Object vBOOL_set(VirtualFrame frame, @SuppressWarnings("unused") FieldSet @Shared @Cached PyObjectIsTrueNode isTrueNode, @Shared @Cached PointerNodes.WriteShortNode writeShortNode) { short val; - if (!isTrueNode.execute(frame, inliningTarget, value)) { + if (!isTrueNode.execute(frame, value)) { val = VARIANT_FALSE; } else { val = VARIANT_TRUE; @@ -488,7 +488,7 @@ static Object bool_set(VirtualFrame frame, @SuppressWarnings("unused") FieldSet @Bind("this") Node inliningTarget, @Shared @Cached PyObjectIsTrueNode isTrueNode, @Shared @Cached PointerNodes.WriteByteNode writeByteNode) { - byte val = (byte) (isTrueNode.execute(frame, inliningTarget, value) ? 1 : 0); + byte val = (byte) (isTrueNode.execute(frame, value) ? 1 : 0); writeByteNode.execute(inliningTarget, ptr, val); return PNone.NONE; } @@ -560,8 +560,7 @@ static Object f_set_sw(VirtualFrame frame, @SuppressWarnings("unused") FieldSet @SuppressWarnings("unused") static Object O_set(@SuppressWarnings("unused") FieldSet setfunc, Pointer ptr, Object value, @SuppressWarnings("unused") int size, @Bind("this") Node inliningTarget, - @Exclusive @Cached PointerNodes.WritePointerNode writePointerNode, - @Shared @Cached PythonObjectFactory factory) { + @Exclusive @Cached PointerNodes.WritePointerNode writePointerNode) { writePointerNode.execute(inliningTarget, ptr, Pointer.pythonObject(value)); return PNone.NONE; } @@ -571,7 +570,7 @@ static Object c_set(@SuppressWarnings("unused") FieldSet setfunc, Pointer ptr, O @Bind("this") Node inliningTarget, @Cached GetInternalByteArrayNode getBytes, @Exclusive @Cached PointerNodes.WriteByteNode writeByteNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (PGuards.isBytes(value)) { PBytesLike bytes = (PBytesLike) value; if (bytes.getSequenceStorage().length() == 1) { @@ -588,7 +587,7 @@ static Object c_set(@SuppressWarnings("unused") FieldSet setfunc, Pointer ptr, O } } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.ONE_CHARACTER_BYTES_BYTEARRAY_INTEGER_EXPECTED); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ONE_CHARACTER_BYTES_BYTEARRAY_INTEGER_EXPECTED); } /* u - a single wchar_t character */ @@ -599,14 +598,14 @@ static Object u_set(@SuppressWarnings("unused") FieldSet setfunc, Pointer ptr, O @Shared @Cached TruffleString.SwitchEncodingNode switchEncodingNode, @Shared @Cached TruffleString.GetInternalByteArrayNode getInternalByteArrayNode, @Exclusive @Cached PointerNodes.WriteBytesNode writeBytesNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { // CTYPES_UNICODE + @Exclusive @Cached PRaiseNode raiseNode) { // CTYPES_UNICODE if (!PGuards.isString(value)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.UNICODE_STRING_EXPECTED_INSTEAD_OF_P_INSTANCE, value); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.UNICODE_STRING_EXPECTED_INSTEAD_OF_P_INSTANCE, value); } TruffleString str = switchEncodingNode.execute(toString.execute(inliningTarget, value), WCHAR_T_ENCODING); InternalByteArray bytes = getInternalByteArrayNode.execute(str, WCHAR_T_ENCODING); if (bytes.getLength() != WCHAR_T_SIZE) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.ONE_CHARACTER_UNICODE_EXPECTED); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ONE_CHARACTER_UNICODE_EXPECTED); } writeBytesNode.execute(inliningTarget, ptr, bytes.getArray(), bytes.getOffset(), bytes.getLength()); return PNone.NONE; @@ -619,15 +618,15 @@ static Object U_set(@SuppressWarnings("unused") FieldSet setfunc, Pointer ptr, O @Shared @Cached TruffleString.SwitchEncodingNode switchEncodingNode, @Shared @Cached TruffleString.GetInternalByteArrayNode getInternalByteArrayNode, @Exclusive @Cached PointerNodes.WriteBytesNode writeBytesNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { // CTYPES_UNICODE + @Exclusive @Cached PRaiseNode raiseNode) { // CTYPES_UNICODE if (!PGuards.isString(value)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.UNICODE_STRING_EXPECTED_INSTEAD_OF_P_INSTANCE, value); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.UNICODE_STRING_EXPECTED_INSTEAD_OF_P_INSTANCE, value); } TruffleString str = switchEncodingNode.execute(toString.execute(inliningTarget, value), WCHAR_T_ENCODING); InternalByteArray bytes = getInternalByteArrayNode.execute(str, WCHAR_T_ENCODING); if (bytes.getLength() > size) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.STR_TOO_LONG, bytes.getLength(), size); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.STR_TOO_LONG, bytes.getLength(), size); } writeBytesNode.execute(inliningTarget, ptr, bytes.getArray(), bytes.getOffset(), bytes.getLength()); return value; @@ -638,9 +637,9 @@ static Object s_set(@SuppressWarnings("unused") FieldSet setfunc, Pointer ptr, O @Bind("this") Node inliningTarget, @Cached ToBytesWithoutFrameNode getBytes, @Exclusive @Cached PointerNodes.WriteBytesNode writeBytesNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (!PGuards.isPBytes(value)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.EXPECTED_BYTES_P_FOUND, value); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.EXPECTED_BYTES_P_FOUND, value); } byte[] data = getBytes.execute(inliningTarget, value); @@ -651,7 +650,7 @@ static Object s_set(@SuppressWarnings("unused") FieldSet setfunc, Pointer ptr, O */ ++size; } else if (size > length) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.BYTES_TOO_LONG, size, length); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.BYTES_TOO_LONG, size, length); } writeBytesNode.execute(inliningTarget, ptr, data); @@ -665,7 +664,7 @@ static Object z_set(@SuppressWarnings("unused") FieldSet setfunc, Pointer ptr, O @Exclusive @Cached PointerNodes.PointerFromLongNode pointerFromLongNode, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, @Exclusive @Cached PointerNodes.WritePointerNode writePointerNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (value == PNone.NONE) { writePointerNode.execute(inliningTarget, ptr, Pointer.NULL); return PNone.NONE; @@ -687,20 +686,20 @@ static Object z_set(@SuppressWarnings("unused") FieldSet setfunc, Pointer ptr, O new PointerReference(value, valuePtr, PythonContext.get(inliningTarget).getSharedFinalizer()); return value; } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.BYTES_OR_INT_ADDR_EXPECTED_INSTEAD_OF_P, value); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.BYTES_OR_INT_ADDR_EXPECTED_INSTEAD_OF_P, value); } @Specialization(guards = "setfunc == Z_set") static Object Z_set(@SuppressWarnings("unused") FieldSet setfunc, Pointer ptr, Object value, @SuppressWarnings("unused") int size, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Exclusive @Cached CastToTruffleStringNode toString, @Exclusive @Cached PyLongCheckNode longCheckNode, @Exclusive @Cached PointerNodes.PointerFromLongNode pointerFromLongNode, @Shared @Cached TruffleString.SwitchEncodingNode switchEncodingNode, @Cached TruffleString.CopyToByteArrayNode copyToByteArrayNode, @Exclusive @Cached PointerNodes.WritePointerNode writePointerNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode, - @Shared @Cached PythonObjectFactory factory) { // CTYPES_UNICODE + @Exclusive @Cached PRaiseNode raiseNode) { // CTYPES_UNICODE if (value == PNone.NONE) { writePointerNode.execute(inliningTarget, ptr, Pointer.NULL); return PNone.NONE; @@ -709,7 +708,7 @@ static Object Z_set(@SuppressWarnings("unused") FieldSet setfunc, Pointer ptr, O return PNone.NONE; } if (!PGuards.isString(value)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.UNICODE_STR_OR_INT_ADDR_EXPECTED_INSTEAD_OF_P, value); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.UNICODE_STR_OR_INT_ADDR_EXPECTED_INSTEAD_OF_P, value); } TruffleString str = switchEncodingNode.execute(toString.execute(inliningTarget, value), WCHAR_T_ENCODING); @@ -720,41 +719,37 @@ static Object Z_set(@SuppressWarnings("unused") FieldSet setfunc, Pointer ptr, O /* ptr is a char**, we need to add the indirection */ Pointer valuePtr = Pointer.bytes(bytes); writePointerNode.execute(inliningTarget, ptr, valuePtr); - return createPyMemCapsule(valuePtr, factory); + return createPyMemCapsule(valuePtr, context, inliningTarget); } @Specialization(guards = "setfunc == P_set") static Object P_set(@SuppressWarnings("unused") FieldSet setfunc, Pointer ptr, Object value, @SuppressWarnings("unused") int size, @Bind("this") Node inliningTarget, - @Exclusive @Cached PyLongCheckNode longCheckNode, @Exclusive @Cached PointerNodes.PointerFromLongNode pointerFromLongNode, - @Exclusive @Cached PointerNodes.WritePointerNode writePointerNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PointerNodes.WritePointerNode writePointerNode) { Pointer valuePtr; if (value == PNone.NONE) { valuePtr = Pointer.NULL; - } else if (longCheckNode.execute(inliningTarget, value)) { - valuePtr = pointerFromLongNode.execute(inliningTarget, value); } else { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANNOT_BE_CONVERTED_TO_POINTER); + valuePtr = pointerFromLongNode.execute(inliningTarget, value); } - writePointerNode.execute(inliningTarget, ptr, valuePtr); return PNone.NONE; } @SuppressWarnings("unused") @Fallback - static Object error(VirtualFrame frame, FieldSet setfunc, Pointer ptr, Object value, int size) { + static Object error(VirtualFrame frame, FieldSet setfunc, Pointer ptr, Object value, int size, + @Bind("this") Node inliningTarget) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.getUncached().raise(NotImplementedError, toTruffleStringUncached("Field setter %s is not supported yet."), setfunc.name()); + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, toTruffleStringUncached("Field setter %s is not supported yet."), setfunc.name()); } - private static TruffleString CTYPES_CFIELD_CAPSULE_NAME_PYMEM = tsLiteral("_ctypes/cfield.c pymem"); + private static final byte[] CTYPES_CFIELD_CAPSULE_NAME_PYMEM = PyCapsule.capsuleName("_ctypes/cfield.c pymem"); - private static PyCapsule createPyMemCapsule(Pointer pointer, PythonObjectFactory factory) { - PyCapsule capsule = factory.createCapsule(pointer, CTYPES_CFIELD_CAPSULE_NAME_PYMEM); - new PointerReference(capsule, pointer, PythonContext.get(factory).getSharedFinalizer()); + private static PyCapsule createPyMemCapsule(Pointer pointer, PythonContext context, Node inliningTarget) { + PyCapsule capsule = PFactory.createCapsuleJavaName(context.getLanguage(inliningTarget), pointer, CTYPES_CFIELD_CAPSULE_NAME_PYMEM); + new PointerReference(capsule, pointer, context.getSharedFinalizer()); return capsule; } } @@ -880,21 +875,21 @@ static Object l_get_sw(@SuppressWarnings("unused") FieldGet getfunc, Pointer ptr @Specialization(guards = "getfunc == L_get") static Object L_get(@SuppressWarnings("unused") FieldGet getfunc, Pointer ptr, @SuppressWarnings("unused") int size, @Bind("this") Node inliningTarget, - @Shared @Cached PointerNodes.ReadLongNode readLongNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @Shared @Cached PointerNodes.ReadLongNode readLongNode) { long val = readLongNode.execute(inliningTarget, ptr); // GET_BITFIELD(val, size); - return val < 0 ? factory.createInt(PInt.longToUnsignedBigInteger(val)) : val; + return val < 0 ? PFactory.createInt(language, PInt.longToUnsignedBigInteger(val)) : val; } @Specialization(guards = "getfunc == L_get_sw") static Object L_get_sw(@SuppressWarnings("unused") FieldGet getfunc, Pointer ptr, @SuppressWarnings("unused") int size, @Bind("this") Node inliningTarget, - @Shared @Cached PointerNodes.ReadLongNode readLongNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @Shared @Cached PointerNodes.ReadLongNode readLongNode) { long val = SWAP_8(readLongNode.execute(inliningTarget, ptr)); // GET_BITFIELD(val, size); - return val < 0 ? factory.createInt(PInt.longToUnsignedBigInteger(val)) : val; + return val < 0 ? PFactory.createInt(language, PInt.longToUnsignedBigInteger(val)) : val; } @Specialization(guards = "getfunc == d_get") @@ -935,7 +930,7 @@ static Object O_get(@SuppressWarnings("unused") FieldGet getfunc, Pointer ptr, @ @Cached PRaiseNode raiseNode) { Pointer valuePtr = readPointerNode.execute(inliningTarget, ptr); if (valuePtr.isNull()) { - throw raiseNode.raise(ValueError, ErrorMessages.PY_OBJ_IS_NULL); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.PY_OBJ_IS_NULL); } return readPythonObject.execute(inliningTarget, valuePtr); } @@ -943,9 +938,9 @@ static Object O_get(@SuppressWarnings("unused") FieldGet getfunc, Pointer ptr, @ @Specialization(guards = "getfunc == c_get") static Object c_get(@SuppressWarnings("unused") FieldGet getfunc, Pointer ptr, @SuppressWarnings("unused") int size, @Bind("this") Node inliningTarget, - @Shared @Cached PointerNodes.ReadByteNode readByteNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createBytes(new byte[]{readByteNode.execute(inliningTarget, ptr)}); + @Bind PythonLanguage language, + @Shared @Cached PointerNodes.ReadByteNode readByteNode) { + return PFactory.createBytes(language, new byte[]{readByteNode.execute(inliningTarget, ptr)}); } @Specialization(guards = "getfunc == u_get") @@ -974,17 +969,17 @@ static Object U_get(@SuppressWarnings("unused") FieldGet getfunc, Pointer ptr, i @Specialization(guards = "getfunc == s_get") static Object s_get(@SuppressWarnings("unused") FieldGet getfunc, Pointer ptr, int size, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Shared @Cached PointerNodes.StrLenNode strLenNode, - @Shared @Cached PointerNodes.ReadBytesNode readBytesNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createBytes(readBytesNode.execute(inliningTarget, ptr, strLenNode.execute(inliningTarget, ptr, size))); + @Shared @Cached PointerNodes.ReadBytesNode readBytesNode) { + return PFactory.createBytes(language, readBytesNode.execute(inliningTarget, ptr, strLenNode.execute(inliningTarget, ptr, size))); } @Specialization(guards = "getfunc == z_get") static Object z_get(@SuppressWarnings("unused") FieldGet getfunc, Pointer ptr, @SuppressWarnings("unused") int size, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Shared @Cached PointerNodes.ReadPointerNode readPointerNode, - @Shared @Cached PythonObjectFactory factory, @Shared @Cached PointerNodes.StrLenNode strLenNode, @Shared @Cached PointerNodes.ReadBytesNode readBytesNode) { // ptr is a char**, we need to deref it to get char* @@ -993,7 +988,7 @@ static Object z_get(@SuppressWarnings("unused") FieldGet getfunc, Pointer ptr, @ return PNone.NONE; } byte[] bytes = readBytesNode.execute(inliningTarget, valuePtr, strLenNode.execute(inliningTarget, valuePtr)); - return factory.createBytes(bytes); + return PFactory.createBytes(language, bytes); } @Specialization(guards = "getfunc == Z_get") @@ -1016,9 +1011,9 @@ static Object Z_get(@SuppressWarnings("unused") FieldGet getfunc, Pointer ptr, @ @Specialization(guards = "getfunc == P_get") static Object P_get(@SuppressWarnings("unused") FieldGet getfunc, Pointer ptr, @SuppressWarnings("unused") int size, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Exclusive @Cached PointerNodes.ReadPointerNode readPointerNode, - @Cached PointerNodes.GetPointerValueAsObjectNode getPointerValueAsObjectNode, - @Shared @Cached PythonObjectFactory factory) { + @Cached PointerNodes.GetPointerValueAsObjectNode getPointerValueAsObjectNode) { Pointer valuePtr = readPointerNode.execute(inliningTarget, ptr); if (valuePtr.isNull()) { return 0L; @@ -1026,9 +1021,9 @@ static Object P_get(@SuppressWarnings("unused") FieldGet getfunc, Pointer ptr, @ Object p = getPointerValueAsObjectNode.execute(inliningTarget, valuePtr); if (p instanceof Long) { long val = (long) p; - return val < 0 ? factory.createInt(PInt.longToUnsignedBigInteger(val)) : val; + return val < 0 ? PFactory.createInt(language, PInt.longToUnsignedBigInteger(val)) : val; } - return factory.createNativeVoidPtr(p); + return PFactory.createNativeVoidPtr(language, p); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CThunkObject.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CThunkObject.java index 5c8fe53714..307dd8fc86 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CThunkObject.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CThunkObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -167,7 +167,7 @@ Object execute(Object[] pArgs, memcpyNode.execute(inliningTarget, obj.b_ptr, value, dict.size); arglist[i] = obj; } else { - throw raiseNode.raise(TypeError, CANNOT_BUILD_PARAMETER); + throw raiseNode.raise(inliningTarget, TypeError, CANNOT_BUILD_PARAMETER); // PrintError("Parsing argument %zd\n", i); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CtypesModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CtypesModuleBuiltins.java index 65aeb1171c..1a0df16b23 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CtypesModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CtypesModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,6 +44,7 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PyCFuncPtr; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PyCPointer; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PyCPointerType; +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError; import static com.oracle.graal.python.builtins.modules.ctypes.CDataTypeBuiltins.PyCData_GetContainer; import static com.oracle.graal.python.builtins.modules.ctypes.CtypesNodes.WCHAR_T_ENCODING; import static com.oracle.graal.python.builtins.modules.ctypes.CtypesNodes.WCHAR_T_SIZE; @@ -52,8 +53,8 @@ import static com.oracle.graal.python.nodes.BuiltinNames.J__CTYPES; import static com.oracle.graal.python.nodes.BuiltinNames.T__CTYPES; import static com.oracle.graal.python.nodes.ErrorMessages.ARGUMENT_D; -import static com.oracle.graal.python.nodes.ErrorMessages.BYREF_ARGUMENT_MUST_BE_A_CTYPES_INSTANCE_NOT_S; -import static com.oracle.graal.python.nodes.ErrorMessages.CAST_ARGUMENT_2_MUST_BE_A_POINTER_TYPE_NOT_S; +import static com.oracle.graal.python.nodes.ErrorMessages.BYREF_ARGUMENT_MUST_BE_A_CTYPES_INSTANCE_NOT_P; +import static com.oracle.graal.python.nodes.ErrorMessages.CAST_ARGUMENT_2_MUST_BE_A_POINTER_TYPE_NOT_N; import static com.oracle.graal.python.nodes.ErrorMessages.DON_T_KNOW_HOW_TO_CONVERT_PARAMETER_D; import static com.oracle.graal.python.nodes.ErrorMessages.EXCEPTED_CTYPES_INSTANCE; import static com.oracle.graal.python.nodes.ErrorMessages.FFI_CALL_FAILED; @@ -70,9 +71,7 @@ import static com.oracle.graal.python.nodes.ErrorMessages.TOO_MANY_ARGUMENTS_D_MAXIMUM_IS_D; import static com.oracle.graal.python.nodes.StringLiterals.J_DEFAULT; import static com.oracle.graal.python.nodes.StringLiterals.J_EMPTY_STRING; -import static com.oracle.graal.python.nodes.StringLiterals.J_LLVM_LANGUAGE; import static com.oracle.graal.python.nodes.StringLiterals.J_NFI_LANGUAGE; -import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; import static com.oracle.graal.python.nodes.StringLiterals.T_LPAREN; import static com.oracle.graal.python.runtime.PosixConstants.RTLD_GLOBAL; import static com.oracle.graal.python.runtime.PosixConstants.RTLD_LOCAL; @@ -87,7 +86,6 @@ import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; -import java.io.IOException; import java.util.List; import java.util.logging.Level; @@ -103,12 +101,12 @@ import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins.FsConverterNode; import com.oracle.graal.python.builtins.modules.SysModuleBuiltins.AuditNode; import com.oracle.graal.python.builtins.modules.ctypes.CFieldBuiltins.GetFuncNode; +import com.oracle.graal.python.builtins.modules.ctypes.CtypesModuleBuiltinsClinicProviders.DyldSharedCacheContainsPathClinicProviderGen; import com.oracle.graal.python.builtins.modules.ctypes.CtypesNodes.PyTypeCheck; import com.oracle.graal.python.builtins.modules.ctypes.FFIType.FFI_TYPES; import com.oracle.graal.python.builtins.modules.ctypes.FFIType.FieldGet; import com.oracle.graal.python.builtins.modules.ctypes.StgDictBuiltins.PyObjectStgDictNode; import com.oracle.graal.python.builtins.modules.ctypes.StgDictBuiltins.PyTypeStgDictNode; -import com.oracle.graal.python.builtins.modules.ctypes.CtypesModuleBuiltinsClinicProviders.DyldSharedCacheContainsPathClinicProviderGen; import com.oracle.graal.python.builtins.modules.ctypes.memory.Pointer; import com.oracle.graal.python.builtins.modules.ctypes.memory.PointerNodes; import com.oracle.graal.python.builtins.modules.ctypes.memory.PointerReference; @@ -121,9 +119,6 @@ import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CByteArrayWrapper; -import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ApiInitException; -import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ImportException; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNIContext; import com.oracle.graal.python.builtins.objects.common.EconomicMapStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetItem; @@ -132,7 +127,6 @@ import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.module.PythonModule; -import com.oracle.graal.python.builtins.objects.str.StringBuiltins.PrefixSuffixNode; import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetBaseClassNode; @@ -149,7 +143,6 @@ import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.SpecialMethodNames; import com.oracle.graal.python.nodes.StringLiterals; import com.oracle.graal.python.nodes.attributes.GetAttributeNode; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; @@ -168,9 +161,8 @@ import com.oracle.graal.python.nodes.util.CastToJavaStringNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; @@ -205,7 +197,6 @@ import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.source.Source; import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.api.strings.TruffleString.CodePointLengthNode; import com.oracle.truffle.api.strings.TruffleString.EqualNode; import com.oracle.truffle.api.strings.TruffleStringBuilder; import com.oracle.truffle.nfi.api.SignatureLibrary; @@ -227,8 +218,6 @@ protected List> getNodeFa private DLHandler rtldDefault; private Object dyldSharedCacheContainsPathFunction; - @CompilationFinal private Object strlenFunction; - @CompilationFinal private Object memcpyFunction; protected static final int FUNCFLAG_STDCALL = 0x0; protected static final int FUNCFLAG_CDECL = 0x1; @@ -245,7 +234,7 @@ protected List> getNodeFa @Override public void initialize(Python3Core core) { super.initialize(core); - addBuiltinConstant("_pointer_type_cache", core.factory().createDict()); + addBuiltinConstant("_pointer_type_cache", PFactory.createDict(core.getLanguage())); if (PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32) { addBuiltinConstant("FUNCFLAG_STDCALL", FUNCFLAG_STDCALL); } @@ -262,73 +251,38 @@ public void initialize(Python3Core core) { @Override public void postInitialize(Python3Core core) { super.postInitialize(core); - PythonObjectFactory factory = core.factory(); + PythonLanguage language = core.getLanguage(); PythonModule ctypesModule = core.lookupBuiltinModule(T__CTYPES); - ctypesModule.setAttribute(tsLiteral("_string_at_addr"), factory.createNativeVoidPtr(StringAtFunction.create())); - ctypesModule.setAttribute(tsLiteral("_cast_addr"), factory.createNativeVoidPtr(CastFunction.create())); - ctypesModule.setAttribute(tsLiteral("_wstring_at_addr"), factory.createNativeVoidPtr(WStringAtFunction.create())); + ctypesModule.setAttribute(tsLiteral("_string_at_addr"), PFactory.createNativeVoidPtr(language, StringAtFunction.create())); + ctypesModule.setAttribute(tsLiteral("_cast_addr"), PFactory.createNativeVoidPtr(language, CastFunction.create())); + ctypesModule.setAttribute(tsLiteral("_wstring_at_addr"), PFactory.createNativeVoidPtr(language, WStringAtFunction.create())); int rtldLocal = RTLD_LOCAL.getValueIfDefined(); ctypesModule.setAttribute(tsLiteral("RTLD_LOCAL"), rtldLocal); ctypesModule.setAttribute(tsLiteral("RTLD_GLOBAL"), RTLD_GLOBAL.getValueIfDefined()); PythonContext context = core.getContext(); - DLHandler handle; + DLHandler handle = null; + // We use directly native if available if (context.getEnv().isNativeAccessAllowed()) { handle = DlOpenNode.loadNFILibrary(context, NFIBackend.NATIVE, J_DEFAULT_LIBRARY, rtldLocal); - setCtypeNFIHelpers(this, context, handle); - if (PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32) { PythonModule sysModule = context.getSysModule(); Object loadLibraryMethod = ReadAttributeFromObjectNode.getUncached().execute(ctypesModule, toTruffleStringUncached("LoadLibrary")); - Object pythonLib = CallNode.executeUncached(loadLibraryMethod, toTruffleStringUncached(GraalHPyJNIContext.getJNILibrary()), 0); + Object pythonLib = CallNode.executeUncached(loadLibraryMethod, toTruffleStringUncached(PythonContext.getSupportLibName("python-native")), 0); WriteAttributeToPythonObjectNode.getUncached().execute(sysModule, toTruffleStringUncached("dllhandle"), pythonLib); } - } else { - try { - CApiContext cApiContext = CApiContext.ensureCapiWasLoaded(null, context, T_EMPTY_STRING, T_EMPTY_STRING); - handle = new DLHandler(cApiContext.getLLVMLibrary(), 0, J_EMPTY_STRING, true); - setCtypeLLVMHelpers(this, handle); - } catch (ApiInitException e) { - throw e.reraise(null, null, PConstructAndRaiseNode.Lazy.getUncached()); - } catch (ImportException e) { - throw e.reraise(null, null, PConstructAndRaiseNode.Lazy.getUncached()); - } catch (IOException e) { - throw PConstructAndRaiseNode.getUncached().raiseOSError(null, e, EqualNode.getUncached()); - } - } - NativeFunction memmove = MemMoveFunction.create(handle, context); - ctypesModule.setAttribute(tsLiteral("_memmove_addr"), factory.createNativeVoidPtr(memmove, memmove.adr)); - NativeFunction memset = MemSetFunction.create(handle, context); - ctypesModule.setAttribute(tsLiteral("_memset_addr"), factory.createNativeVoidPtr(memset, memset.adr)); - rtldDefault = handle; - } - - Object getStrlenFunction() { - return strlenFunction; - } - - Object getMemcpyFunction() { - return memcpyFunction; - } - - private static void setCtypeLLVMHelpers(CtypesModuleBuiltins ctypesModuleBuiltins, DLHandler h) { - try { - InteropLibrary lib = InteropLibrary.getUncached(h.library); - ctypesModuleBuiltins.strlenFunction = lib.readMember(h.library, NativeCAPISymbol.FUN_STRLEN.getName()); - ctypesModuleBuiltins.memcpyFunction = lib.readMember(h.library, NativeCAPISymbol.FUN_MEMCPY.getName()); - } catch (UnsupportedMessageException | UnknownIdentifierException e) { - throw CompilerDirectives.shouldNotReachHere(); } - } - - private static void setCtypeNFIHelpers(CtypesModuleBuiltins ctypesModuleBuiltins, PythonContext context, DLHandler h) { - try { - ctypesModuleBuiltins.strlenFunction = createNFIHelperFunction(context, h, "strlen", "(POINTER):UINT32"); - ctypesModuleBuiltins.memcpyFunction = createNFIHelperFunction(context, h, "memcpy", "([UINT8], POINTER, UINT32):POINTER"); - } catch (UnsupportedMessageException | UnknownIdentifierException e) { - throw CompilerDirectives.shouldNotReachHere(); + if (handle != null) { + NativeFunction memmove = MemMoveFunction.create(handle, context); + ctypesModule.setAttribute(tsLiteral("_memmove_addr"), PFactory.createNativeVoidPtr(language, memmove, memmove.adr)); + NativeFunction memset = MemSetFunction.create(handle, context); + ctypesModule.setAttribute(tsLiteral("_memset_addr"), PFactory.createNativeVoidPtr(language, memset, memset.adr)); } + // If handle == null, and we don't set the attributes, ctypes module is going to fail in + // __init__.py on importing those attributes from _ctypes. This way the failure will happen + // only when ctypes are actually imported + rtldDefault = handle; } @TruffleBoundary @@ -379,10 +333,6 @@ protected boolean isManaged() { return isManaged; } - protected boolean isLLVM() { - return sym instanceof CallLLVMFunction; - } - protected boolean isManaged(long address) { return adr == address; } @@ -481,15 +431,12 @@ static CtypesThreadState get(PythonContext context, PythonLanguage language) { protected abstract static class GetErrnoNode extends PythonUnaryBuiltinNode { @Specialization - Object getErrno(@SuppressWarnings("unused") PythonModule module, + static Object getErrno(@SuppressWarnings("unused") PythonModule module, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached AuditNode auditNode) { auditNode.audit(inliningTarget, "ctypes.get_errno"); - return get_errno(getContext(), getLanguage()); - } - - static Object get_errno(PythonContext context, PythonLanguage language) { - CtypesThreadState ctypes = CtypesThreadState.get(context, language); + CtypesThreadState ctypes = CtypesThreadState.get(context, context.getLanguage(inliningTarget)); return ctypes.errno; } } @@ -506,11 +453,12 @@ protected ArgumentClinicProvider getArgumentClinic() { } @Specialization - Object setErrno(int newErrno, + static Object setErrno(int newErrno, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached AuditNode auditNode) { auditNode.audit(inliningTarget, "ctypes.set_errno", newErrno); - return set_errno(newErrno, getContext(), getLanguage()); + return set_errno(newErrno, context, context.getLanguage(inliningTarget)); } static Object set_errno(int newErrno, PythonContext context, PythonLanguage language) { @@ -528,6 +476,7 @@ protected abstract static class PointerTypeNode extends PythonUnaryBuiltinNode { @Specialization static Object POINTER(VirtualFrame frame, Object cls, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached HashingStorageGetItem getItem, @Cached HashingStorageSetItem setItem, @Cached IsTypeNode isTypeNode, @@ -535,9 +484,9 @@ static Object POINTER(VirtualFrame frame, Object cls, @Cached GetNameNode getNameNode, @Cached CastToTruffleStringNode toTruffleStringNode, @Cached SimpleTruffleStringFormatNode formatNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - CtypesThreadState ctypes = CtypesThreadState.get(PythonContext.get(inliningTarget), PythonLanguage.get(inliningTarget)); + @Cached PRaiseNode raiseNode) { + PythonLanguage language = context.getLanguage(inliningTarget); + CtypesThreadState ctypes = CtypesThreadState.get(context, language); Object result = getItem.execute(frame, inliningTarget, ctypes.ptrtype_cache, cls); if (result != null) { return result; @@ -546,17 +495,17 @@ static Object POINTER(VirtualFrame frame, Object cls, if (PGuards.isString(cls)) { TruffleString name = toTruffleStringNode.execute(inliningTarget, cls); TruffleString buf = formatNode.format("LP_%s", name); - Object[] args = new Object[]{buf, PyCPointer, factory.createDict()}; + Object[] args = new Object[]{buf, PyCPointer, PFactory.createDict(language)}; result = callNode.execute(frame, PyCPointerType, args, PKeyword.EMPTY_KEYWORDS); - key = factory.createNativeVoidPtr(result); + key = PFactory.createNativeVoidPtr(language, result); } else if (isTypeNode.execute(inliningTarget, cls)) { TruffleString buf = formatNode.format("LP_%s", getNameNode.execute(inliningTarget, cls)); - PTuple bases = factory.createTuple(new Object[]{PyCPointer}); - Object[] args = new Object[]{buf, bases, factory.createDict(new PKeyword[]{new PKeyword(T__TYPE_, cls)})}; + PTuple bases = PFactory.createTuple(language, new Object[]{PyCPointer}); + Object[] args = new Object[]{buf, bases, PFactory.createDict(language, new PKeyword[]{new PKeyword(T__TYPE_, cls)})}; result = callNode.execute(frame, PyCPointerType, args, PKeyword.EMPTY_KEYWORDS); key = cls; } else { - throw raiseNode.get(inliningTarget).raise(TypeError, MUST_BE_A_CTYPES_TYPE); + throw raiseNode.raise(inliningTarget, TypeError, MUST_BE_A_CTYPES_TYPE); } HashingStorage newStorage = setItem.execute(frame, inliningTarget, ctypes.ptrtype_cache, key, result); assert newStorage == ctypes.ptrtype_cache; @@ -569,13 +518,14 @@ static Object POINTER(VirtualFrame frame, Object cls, protected abstract static class PointerObjectNode extends PythonUnaryBuiltinNode { @Specialization - Object pointer(VirtualFrame frame, Object arg, + static Object pointer(VirtualFrame frame, Object arg, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached HashingStorageGetItem getItem, @Cached PointerTypeNode callPOINTER, @Cached CallNode callNode, @Cached GetClassNode getClassNode) { - CtypesThreadState ctypes = CtypesThreadState.get(getContext(), getLanguage()); + CtypesThreadState ctypes = CtypesThreadState.get(context, context.getLanguage(inliningTarget)); Object typ = getItem.execute(frame, inliningTarget, ctypes.ptrtype_cache, getClassNode.execute(inliningTarget, arg)); if (typ != null) { return callNode.execute(frame, typ, arg); @@ -585,7 +535,6 @@ Object pointer(VirtualFrame frame, Object arg, } } - @ImportStatic(SpecialMethodNames.class) @Builtin(name = J_UNPICKLE, minNumOfPositionalArgs = 2) @GenerateNodeFactory protected abstract static class UnpickleNode extends PythonBinaryBuiltinNode { @@ -593,7 +542,9 @@ protected abstract static class UnpickleNode extends PythonBinaryBuiltinNode { @Specialization Object unpickle(VirtualFrame frame, Object typ, PTuple state, @Cached CallNode callNode, - @Cached("create(New)") LookupAndCallUnaryNode lookupAndCallUnaryNode, + // This shouldn't call the slot directly to make sure the check in the + // wrapper runs + @Cached("create(T___NEW__)") LookupAndCallUnaryNode lookupAndCallUnaryNode, @Cached("create(T___SETSTATE__)") GetAttributeNode setStateAttr) { Object obj = lookupAndCallUnaryNode.executeObject(frame, typ); Object meth = setStateAttr.executeObject(frame, obj); @@ -612,21 +563,21 @@ static Object buffer_info(Object arg, @Bind("this") Node inliningTarget, @Cached PyTypeStgDictNode pyTypeStgDictNode, @Cached PyObjectStgDictNode pyObjectStgDictNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { StgDictObject dict = pyTypeStgDictNode.execute(inliningTarget, arg); if (dict == null) { dict = pyObjectStgDictNode.execute(inliningTarget, arg); } if (dict == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, NOT_A_CTYPES_TYPE_OR_OBJECT); + throw raiseNode.raise(inliningTarget, TypeError, NOT_A_CTYPES_TYPE_OR_OBJECT); } Object[] shape = new Object[dict.ndim]; for (int i = 0; i < dict.ndim; ++i) { shape[i] = dict.shape[i]; } - return factory.createTuple(new Object[]{dict.format, dict.ndim, factory.createTuple(shape)}); + return PFactory.createTuple(language, new Object[]{dict.format, dict.ndim, PFactory.createTuple(language, shape)}); } } @@ -644,16 +595,16 @@ protected ArgumentClinicProvider getArgumentClinic() { static Object resize(CDataObject obj, int size, @Bind("this") Node inliningTarget, @Cached PyObjectStgDictNode pyObjectStgDictNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { StgDictObject dict = pyObjectStgDictNode.execute(inliningTarget, obj); if (dict == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, EXCEPTED_CTYPES_INSTANCE); + throw raiseNode.raise(inliningTarget, TypeError, EXCEPTED_CTYPES_INSTANCE); } if (size < dict.size) { - throw raiseNode.get(inliningTarget).raise(ValueError, MINIMUM_SIZE_IS_D, dict.size); + throw raiseNode.raise(inliningTarget, ValueError, MINIMUM_SIZE_IS_D, dict.size); } if (obj.b_needsfree) { - throw raiseNode.get(inliningTarget).raise(ValueError, MEMORY_CANNOT_BE_RESIZED_BECAUSE_THIS_OBJECT_DOESN_T_OWN_IT); + throw raiseNode.raise(inliningTarget, ValueError, MEMORY_CANNOT_BE_RESIZED_BECAUSE_THIS_OBJECT_DOESN_T_OWN_IT); } obj.b_size = size; return PNone.NONE; @@ -711,17 +662,6 @@ private static Object load(PythonContext context, String src, String name) { return context.getEnv().parseInternal(loadSrc).call(); } - @TruffleBoundary - protected static Object loadLLVMLibrary(PythonContext context, Node nodeForRaise, TruffleString path) throws ImportException, ApiInitException, IOException { - context.ensureLLVMLanguage(nodeForRaise); - if (path.isEmpty()) { - CApiContext cApiContext = CApiContext.ensureCapiWasLoaded(null, context, T_EMPTY_STRING, T_EMPTY_STRING); - return cApiContext.getLLVMLibrary(); - } - Source loadSrc = Source.newBuilder(J_LLVM_LANGUAGE, context.getPublicTruffleFileRelaxed(path)).build(); - return context.getEnv().parseInternal(loadSrc).call(); - } - @TruffleBoundary private static TruffleString getErrMsg(Exception e) { String errmsg = e != null ? e.getMessage() : null; @@ -731,54 +671,42 @@ private static TruffleString getErrMsg(Exception e) { return toTruffleStringUncached(errmsg); } + @TruffleBoundary @Specialization - static Object py_dl_open(VirtualFrame frame, PythonModule self, TruffleString name, int m, + static Object py_dl_open(PythonModule self, TruffleString name, int m, @Bind("this") Node inliningTarget, - @Cached PyObjectHashNode hashNode, - @Cached AuditNode auditNode, - @Cached CodePointLengthNode codePointLengthNode, - @Cached PrefixSuffixNode prefixSuffixNode, - @Cached EqualNode eqNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached AuditNode auditNode) { + PythonContext context = PythonContext.get(inliningTarget); + PythonLanguage language = context.getLanguage(inliningTarget); auditNode.audit(inliningTarget, "ctypes.dlopen", name); if (name.isEmpty()) { - return factory.createNativeVoidPtr(((CtypesModuleBuiltins) self.getBuiltins()).rtldDefault); + return PFactory.createNativeVoidPtr(language, ((CtypesModuleBuiltins) self.getBuiltins()).rtldDefault); } // The loaded library can link against libpython, so we have to make sure it is loaded - CApiContext.ensureCapiWasLoaded(); + CApiContext.ensureCapiWasLoaded("support ctypes module"); int mode = m != Integer.MIN_VALUE ? m : RTLD_LOCAL.getValueIfDefined(); mode |= RTLD_NOW.getValueIfDefined(); - PythonContext context = PythonContext.get(inliningTarget); DLHandler handle; Exception exception = null; - boolean loadWithLLVM = !context.getEnv().isNativeAccessAllowed() || // - (!context.getOption(PythonOptions.UseSystemToolchain) && - prefixSuffixNode.endsWith(name, context.getSoAbi(), 0, codePointLengthNode.execute(name, TS_ENCODING))); try { - if (loadWithLLVM) { - Object handler = loadLLVMLibrary(context, inliningTarget, name); - long adr = hashNode.execute(frame, inliningTarget, handler); - handle = new DLHandler(handler, adr, name.toJavaStringUncached(), true); - registerAddress(context, handle.adr, handle); - return factory.createNativeVoidPtr(handle); - } else { - CtypesThreadState ctypes = CtypesThreadState.get(context, PythonLanguage.get(inliningTarget)); + if (context.getEnv().isNativeAccessAllowed()) { + CtypesThreadState ctypes = CtypesThreadState.get(context, context.getLanguage()); /*- TODO: (mq) cryptography in macos isn't always compatible with ctypes. */ + EqualNode eqNode = EqualNode.getUncached(); if (!eqNode.execute(name, MACOS_Security_LIB, TS_ENCODING) && !eqNode.execute(name, MACOS_CoreFoundation_LIB, TS_ENCODING)) { handle = loadNFILibrary(context, ctypes.backendType, name.toJavaStringUncached(), mode); registerAddress(context, handle.adr, handle); - return factory.createNativeVoidPtr(handle, handle.adr); + return PFactory.createNativeVoidPtr(language, handle, handle.adr); } } } catch (Exception e) { exception = e; } - throw raiseNode.get(inliningTarget).raise(OSError, getErrMsg(exception)); + throw PRaiseNode.raiseStatic(inliningTarget, OSError, getErrMsg(exception)); } } @@ -790,13 +718,13 @@ protected abstract static class DlCloseNode extends PythonUnaryBuiltinNode { static Object py_dl_close(Object pointerObj, @Bind("this") Node inliningTarget, @Cached CtypesNodes.HandleFromLongNode handleFromLongNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { DLHandler handle = handleFromLongNode.getDLHandler(inliningTarget, pointerObj); if (handle != null) { handle.isClosed = true; return PNone.NONE; } - throw raiseNode.get(inliningTarget).raise(OSError, T_DL_ERROR); + throw raiseNode.raise(inliningTarget, OSError, T_DL_ERROR); } } @@ -808,32 +736,26 @@ protected abstract static class CtypesDlSymNode extends PNodeWithContext { @Specialization static Object ctypes_dlsym(VirtualFrame frame, Pointer handlePtr, Object n, PythonBuiltinClassType error, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached CtypesNodes.HandleFromPointerNode handleFromPointerNode, @Cached PyObjectHashNode hashNode, @Cached CastToJavaStringNode asString, @CachedLibrary(limit = "1") InteropLibrary ilib, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { DLHandler handle = handleFromPointerNode.getDLHandler(inliningTarget, handlePtr); String name = asString.execute(n); if (handle == null || handle.isClosed) { - throw raiseNode.get(inliningTarget).raise(error, T_DL_ERROR); + throw raiseNode.raise(inliningTarget, error, T_DL_ERROR); } try { Object sym = ilib.readMember(handle.library, name); - boolean isManaged = handle.isManaged; - long adr = isManaged ? hashNode.execute(frame, inliningTarget, sym) : ilib.asPointer(sym); - sym = isManaged ? CallLLVMFunction.create(sym, ilib) : sym; - NativeFunction func = new NativeFunction(sym, adr, name, isManaged); - registerAddress(PythonContext.get(inliningTarget), adr, func); + long adr = ilib.asPointer(sym); + NativeFunction func = new NativeFunction(sym, adr, name, false); + registerAddress(context, adr, func); // PyLong_FromVoidPtr(ptr); - if (!isManaged) { - return factory.createNativeVoidPtr(func, adr); - } else { - return factory.createNativeVoidPtr(func); - } + return PFactory.createNativeVoidPtr(context.getLanguage(inliningTarget), func, adr); } catch (UnsupportedMessageException | UnknownIdentifierException e) { - throw raiseNode.get(inliningTarget).raise(error, e); + throw raiseNode.raise(inliningTarget, error, e); } } } @@ -896,9 +818,9 @@ static Object doBytes(PythonModule self, PBytes path, @Cached ToBytesNode toBytesNode, @CachedLibrary(limit = "1") InteropLibrary ilib, @CachedLibrary(limit = "1") InteropLibrary resultLib, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (!hasDynamicLoaderCache()) { - throw raiseNode.get(inliningTarget).raise(NotImplementedError, S_SYMBOL_IS_MISSING, DYLD_SHARED_CACHE_CONTAINS_PATH); + throw raiseNode.raise(inliningTarget, NotImplementedError, S_SYMBOL_IS_MISSING, DYLD_SHARED_CACHE_CONTAINS_PATH); } CtypesModuleBuiltins builtins = (CtypesModuleBuiltins) self.getBuiltins(); @@ -952,7 +874,7 @@ static Object align_func(Object obj, @Bind("this") Node inliningTarget, @Cached PyTypeStgDictNode pyTypeStgDictNode, @Cached PyObjectStgDictNode pyObjectStgDictNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { StgDictObject dict = pyTypeStgDictNode.execute(inliningTarget, obj); if (dict != null) { return dict.align; @@ -963,7 +885,7 @@ static Object align_func(Object obj, return dict.align; } - throw raiseNode.get(inliningTarget).raise(TypeError, NO_ALIGNMENT_INFO); + throw raiseNode.raise(inliningTarget, TypeError, NO_ALIGNMENT_INFO); } } @@ -976,7 +898,7 @@ static Object doit(Object obj, @Bind("this") Node inliningTarget, @Cached PyTypeCheck pyTypeCheck, @Cached PyTypeStgDictNode pyTypeStgDictNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { StgDictObject dict = pyTypeStgDictNode.execute(inliningTarget, obj); if (dict != null) { return dict.size; @@ -985,7 +907,7 @@ static Object doit(Object obj, if (pyTypeCheck.isCDataObject(inliningTarget, obj)) { return ((CDataObject) obj).b_size; } - throw raiseNode.get(inliningTarget).raise(TypeError, THIS_TYPE_HAS_NO_SIZE); + throw raiseNode.raise(inliningTarget, TypeError, THIS_TYPE_HAS_NO_SIZE); } } @@ -1002,14 +924,13 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization Object doit(CDataObject obj, int offset, @Bind("this") Node inliningTarget, - @Exclusive @Cached GetClassNode getClassNode, @Cached PyTypeCheck pyTypeCheck, - @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Exclusive @Cached PRaiseNode raiseNode) { if (!pyTypeCheck.isCDataObject(inliningTarget, obj)) { - return error(null, obj, offset, inliningTarget, getClassNode, raiseNode); + return error(null, obj, offset, inliningTarget, raiseNode); } - PyCArgObject parg = factory.createCArgObject(); + PyCArgObject parg = PFactory.createCArgObject(language); parg.tag = 'P'; parg.pffi_type = FFIType.ffi_type_pointer; parg.obj = obj; @@ -1022,11 +943,8 @@ Object doit(CDataObject obj, int offset, @Fallback static Object error(VirtualFrame frame, Object obj, Object off, @Bind("this") Node inliningTarget, - @Exclusive @Cached GetClassNode getClassNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - Object clazz = getClassNode.execute(inliningTarget, obj); - TruffleString name = GetNameNode.executeUncached(clazz); - throw raiseNode.get(inliningTarget).raise(TypeError, BYREF_ARGUMENT_MUST_BE_A_CTYPES_INSTANCE_NOT_S, name); + @Exclusive @Cached PRaiseNode raiseNode) { + throw raiseNode.raise(inliningTarget, TypeError, BYREF_ARGUMENT_MUST_BE_A_CTYPES_INSTANCE_NOT_P, obj); } } @@ -1067,21 +985,21 @@ protected abstract static class AddressOfNode extends PythonUnaryBuiltinNode { @Specialization static Object doit(CDataObject obj, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached PyTypeCheck pyTypeCheck, @Cached AuditNode auditNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (!pyTypeCheck.isCDataObject(inliningTarget, obj)) { - return error(obj, raiseNode.get(inliningTarget)); + return error(obj, raiseNode); } auditNode.audit(inliningTarget, "ctypes.addressof", obj); - return factory.createNativeVoidPtr(obj.b_ptr); + return PFactory.createNativeVoidPtr(language, obj.b_ptr); } @Fallback static Object error(@SuppressWarnings("unused") Object o, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, INVALID_TYPE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, INVALID_TYPE); } } @@ -1113,8 +1031,8 @@ static Object call_function(VirtualFrame frame, Object pointerObj, PTuple argume protected abstract static class FormatErrorNode extends PythonUnaryBuiltinNode { @Specialization static Object doit(@SuppressWarnings("unused") Object errorCode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(NotImplementedError); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError); } } @@ -1184,10 +1102,10 @@ Object _ctypes_callproc(VirtualFrame frame, NativeFunction pProc, Object[] argar @Cached CallNode callNode, @Cached GetResultNode getResultNode, @CachedLibrary(limit = "1") InteropLibrary ilib, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int argcount = argarray.length; if (argcount > CTYPES_MAX_ARGCOUNT) { - throw raiseNode.get(inliningTarget).raise(ArgError, TOO_MANY_ARGUMENTS_D_MAXIMUM_IS_D, argcount, CTYPES_MAX_ARGCOUNT); + throw raiseNode.raise(inliningTarget, ArgError, TOO_MANY_ARGUMENTS_D_MAXIMUM_IS_D, argcount, CTYPES_MAX_ARGCOUNT); } CTypesCallArgument[] args = new CTypesCallArgument[argcount]; @@ -1198,11 +1116,7 @@ Object _ctypes_callproc(VirtualFrame frame, NativeFunction pProc, Object[] argar /* Convert the arguments */ BackendMode mode = BackendMode.NFI; if (pProc.isManaged()) { - if (pProc.isLLVM()) { - mode = BackendMode.LLVM; - } else { - mode = BackendMode.INTRINSIC; - } + mode = BackendMode.INTRINSIC; } for (int i = 0; i < argcount; ++i) { args[i] = new CTypesCallArgument(); @@ -1216,7 +1130,7 @@ Object _ctypes_callproc(VirtualFrame frame, NativeFunction pProc, Object[] argar try { v = callNode.execute(frame, converters[i], arg); } catch (PException e) { - throw raiseNode.get(inliningTarget).raise(ArgError, ARGUMENT_D, i + 1); + throw raiseNode.raise(inliningTarget, ArgError, ARGUMENT_D, i + 1); } } convParamNode.execute(frame, v, i + 1, args[i]); @@ -1239,7 +1153,7 @@ Object _ctypes_callproc(VirtualFrame frame, NativeFunction pProc, Object[] argar if (mode == BackendMode.NFI) { result = callNativeFunction(inliningTarget, pProc, avalues, atypes, rtype, ilib, raiseNode); } else { - result = callManagedFunction(inliningTarget, pProc, avalues, ilib, raiseNode); + result = callManagedFunction(inliningTarget, pProc, avalues, ilib); if (mode == BackendMode.INTRINSIC) { /* * We don't want result conversion for functions implemented in Java, they @@ -1252,18 +1166,18 @@ Object _ctypes_callproc(VirtualFrame frame, NativeFunction pProc, Object[] argar return getResultNode.execute(frame, restype, rtype, result, checker); } - static Object callManagedFunction(Node inliningTarget, NativeFunction pProc, Object[] argarray, InteropLibrary ilib, PRaiseNode.Lazy raiseNode) { + static Object callManagedFunction(Node inliningTarget, NativeFunction pProc, Object[] argarray, InteropLibrary ilib) { try { return ilib.execute(pProc.sym, argarray); } catch (PException e) { throw e; } catch (UnsupportedTypeException | ArityException | UnsupportedMessageException | AbstractTruffleException e) { CompilerDirectives.transferToInterpreter(); - throw PRaiseNode.raiseUncached(inliningTarget, RuntimeError, FFI_CALL_FAILED); + throw PRaiseNode.raiseStatic(inliningTarget, RuntimeError, FFI_CALL_FAILED); } catch (UnsupportedSpecializationException ee) { // TODO: llvm/GR-??? CompilerDirectives.transferToInterpreter(); - throw PRaiseNode.raiseUncached(inliningTarget, NotImplementedError, toTruffleStringUncached("require backend support.")); + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, toTruffleStringUncached("require backend support.")); } } @@ -1278,7 +1192,7 @@ protected Object getFunction(NativeFunction pProc, String signature) throws Exce * NFI compatible native function calls (temporary replacement) */ Object callNativeFunction(Node inliningTarget, NativeFunction pProc, Object[] avalues, FFIType[] atypes, FFIType restype, - InteropLibrary ilib, PRaiseNode.Lazy raiseNode) { + InteropLibrary ilib, PRaiseNode raiseNode) { Object function; if (pProc.function != null && equals(atypes, pProc.atypes) && restype == pProc.rtype) { function = pProc.function; @@ -1287,7 +1201,7 @@ Object callNativeFunction(Node inliningTarget, NativeFunction pProc, Object[] av try { function = getFunction(pProc, signature.toJavaStringUncached()); } catch (Exception e) { - throw raiseNode.get(inliningTarget).raise(RuntimeError, FFI_PREP_CIF_FAILED); + throw raiseNode.raise(inliningTarget, RuntimeError, FFI_PREP_CIF_FAILED); } pProc.atypes = atypes; pProc.rtype = restype; @@ -1298,7 +1212,7 @@ Object callNativeFunction(Node inliningTarget, NativeFunction pProc, Object[] av return ilib.execute(function, avalues); } catch (UnsupportedTypeException | ArityException | UnsupportedMessageException e) { CompilerDirectives.transferToInterpreter(); - throw PRaiseNode.raiseUncached(inliningTarget, RuntimeError, FFI_CALL_FAILED); + throw PRaiseNode.raiseStatic(inliningTarget, RuntimeError, FFI_CALL_FAILED); } } @@ -1399,7 +1313,7 @@ static Object none(Object restype, FFIType rtype, Object result, Object checker) @Specialization(guards = {"restype != null", "!isNone(restype)", "dict == null"}, limit = "1") static Object callResType(VirtualFrame frame, Object restype, @SuppressWarnings("unused") FFIType rtype, Object result, @SuppressWarnings("unused") Object checker, - @Bind("this") Node inliningTarget, + @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @CachedLibrary("result") InteropLibrary ilib, @SuppressWarnings("unused") @Exclusive @Cached PyTypeStgDictNode pyTypeStgDictNode, @SuppressWarnings("unused") @Bind("getStgDict(inliningTarget, restype, pyTypeStgDictNode)") StgDictObject dict, @@ -1433,7 +1347,22 @@ static Object callGetFunc(VirtualFrame frame, Object restype, FFIType rtype, Obj case FFI_TYPE_FLOAT -> Pointer.create(rtype, rtype.size, ilib.asFloat(result), 0); case FFI_TYPE_DOUBLE -> Pointer.create(rtype, rtype.size, ilib.asDouble(result), 0); case FFI_TYPE_VOID -> Pointer.NULL; - case FFI_TYPE_POINTER, FFI_TYPE_STRUCT -> { + case FFI_TYPE_STRUCT -> { + // TODO: NFI support for structs + // In case of struct, depending on the ABI the value returned from the + // function may be actual struct memory (<16B and some other constraints on + // SystemV AMD64 ABI, returned in two registers) or a pointer to caller + // allocated buffer prepared for struct contents (larger structs), in which + // case, however, the caller must allocate and pass the buffer as (hidden) + // argument. We cannot get away with just using NFI pointer type as return + // value for large structs, because NFI still needs to allocate and pass the + // buffer for the result to the callee. + CompilerDirectives.transferToInterpreterAndInvalidate(); + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, ErrorMessages.RETURNING_STRUCT_BY_VALUE_NOT_SUPPORTED); + } + case FFI_TYPE_POINTER -> { + // NOTE: we are returning pointer to the result buffer and the result buffer + // data itself is a pointer Pointer pointer; if (ilib.isNull(result)) { pointer = Pointer.NULL; @@ -1504,7 +1433,7 @@ void convParam(VirtualFrame frame, Object obj, int index, CTypesCallArgument pa, @Cached PyObjectStgDictNode pyObjectStgDictNode, @Cached CArgObjectBuiltins.ParamFuncNode paramFuncNode, @Cached ConvParamNode recursive, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (obj instanceof CDataObject cdata) { pa.stgDict = pyObjectStgDictNode.execute(inliningTarget, cdata); PyCArgObject carg = paramFuncNode.execute(inliningTarget, cdata, pa.stgDict); @@ -1537,7 +1466,7 @@ void convParam(VirtualFrame frame, Object obj, int index, CTypesCallArgument pa, pa.valuePointer = Pointer.create(pa.ffi_type, pa.ffi_type.size, asInt.executeExact(frame, inliningTarget, obj), 0); } catch (PException e) { e.expectOverflowError(inliningTarget, profile); - throw raiseNode.get(inliningTarget).raise(OverflowError, INT_TOO_LONG_TO_CONVERT); + throw raiseNode.raise(inliningTarget, OverflowError, INT_TOO_LONG_TO_CONVERT); } return; } @@ -1577,7 +1506,7 @@ void convParam(VirtualFrame frame, Object obj, int index, CTypesCallArgument pa, recursive.execute(frame, arg, index, pa, false); return; } - throw raiseNode.get(inliningTarget).raise(TypeError, DON_T_KNOW_HOW_TO_CONVERT_PARAMETER_D, index); + throw raiseNode.raise(inliningTarget, TypeError, DON_T_KNOW_HOW_TO_CONVERT_PARAMETER_D, index); } } @@ -1657,9 +1586,8 @@ static Object doIntrinsicPointer(Node inliningTarget, CTypesCallArgument arg, @S @Specialization(guards = {"mode == NFI", "isFFIType(arg, FFI_TYPE_STRUCT)"}) @SuppressWarnings("unused") - static Object doNFIStruct(Node inliningTarget, CTypesCallArgument arg, @SuppressWarnings("unused") BackendMode mode, - @Cached(inline = false) PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.NotImplementedError, ErrorMessages.PASSING_STRUCTS_BY_VALUE_NOT_SUPPORTED); + static Object doNFIStruct(Node inliningTarget, CTypesCallArgument arg, @SuppressWarnings("unused") BackendMode mode) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.NotImplementedError, ErrorMessages.PASSING_STRUCTS_BY_VALUE_NOT_SUPPORTED); } @Specialization(guards = {"mode == LLVM", "isFFIType(arg, FFI_TYPE_STRUCT)"}) @@ -1703,7 +1631,7 @@ protected abstract static class PyINCREFNode extends PythonUnaryBuiltinNode { @Specialization @TruffleBoundary static Object doGeneric(Object arg) { - CApiContext.ensureCapiWasLoaded(); + CApiContext.ensureCapiWasLoaded("support ctypes module"); CApiTransitions.PythonToNativeNewRefNode.executeUncached(arg); return arg; } @@ -1716,7 +1644,7 @@ protected abstract static class PyDECREFNode extends PythonUnaryBuiltinNode { @Specialization @TruffleBoundary static Object doGeneric(Object arg) { - CApiContext.ensureCapiWasLoaded(); + CApiContext.ensureCapiWasLoaded("support ctypes module"); Object nativePointer = CApiTransitions.PythonToNativeNode.executeUncached(arg); CExtNodes.XDecRefPointerNode.executeUncached(nativePointer); return arg; @@ -1747,6 +1675,7 @@ boolean isExecutable() { @ExportMessage Object execute(Object[] arguments, + @Bind("$node") Node inliningTarget, @Cached TruffleString.ToJavaStringNode toJavaStringNode, @CachedLibrary("this.llvmSym") InteropLibrary ilib) { try { @@ -1757,7 +1686,7 @@ Object execute(Object[] arguments, } return ilib.execute(llvmSym, arguments); } catch (UnsupportedTypeException | ArityException | UnsupportedMessageException e) { - throw PRaiseNode.getUncached().raise(RuntimeError, e); + throw PRaiseNode.raiseStatic(inliningTarget, RuntimeError, e); } } } @@ -1772,10 +1701,9 @@ static void raiseError(Object arg, @Cached PRaiseNode raiseNode, @Cached IsTypeNode isTypeNode, @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached GetNameNode getNameNode) { + @Cached GetClassNode getClassNode) { Object clazz = isTypeNode.execute(inliningTarget, arg) ? arg : getClassNode.execute(inliningTarget, arg); - throw raiseNode.raise(TypeError, CAST_ARGUMENT_2_MUST_BE_A_POINTER_TYPE_NOT_S, getNameNode.execute(inliningTarget, clazz)); + throw raiseNode.raise(inliningTarget, TypeError, CAST_ARGUMENT_2_MUST_BE_A_POINTER_TYPE_NOT_N, clazz); } } @@ -1831,9 +1759,9 @@ protected abstract static class CastFunctionNode extends Node { @Specialization Object cast(Pointer ptr, Pointer srcObj, Pointer ctypeObj, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached HashingStorageSetItem setItem, @Cached PyTypeCheck pyTypeCheck, - @Cached PythonObjectFactory factory, @Cached CallNode callNode, @Cached CastCheckPtrTypeNode castCheckPtrTypeNode, @Cached PointerNodes.ReadPythonObject readPythonObject, @@ -1854,16 +1782,16 @@ Object cast(Pointer ptr, Pointer srcObj, Pointer ctypeObj, * PyCData_GetContainer will initialize src.b_objects, we need this so it can be * shared */ - PyCData_GetContainer(cdata, factory); + PyCData_GetContainer(cdata, language); if (cdata.b_objects == null) { - cdata.b_objects = factory.createDict(); + cdata.b_objects = PFactory.createDict(language); } result.b_objects = cdata.b_objects; if (PGuards.isDict(result.b_objects)) { // PyLong_FromVoidPtr((void *)src); PDict dict = (PDict) result.b_objects; - Object index = factory.createNativeVoidPtr(cdata); + Object index = PFactory.createNativeVoidPtr(language, cdata); dict.setDictStorage(setItem.execute(null, inliningTarget, dict.getDictStorage(), index, cdata)); } } @@ -1903,10 +1831,10 @@ protected abstract static class MemmoveNode extends Node { @Specialization static Object memmove(Node inliningTarget, Pointer destPtr, Pointer srcPtr, long size, - @Cached PointerNodes.MemcpyNode memcpyNode, - @Cached(inline = false) PythonObjectFactory factory) { + @Bind PythonLanguage language, + @Cached PointerNodes.MemcpyNode memcpyNode) { memcpyNode.execute(inliningTarget, destPtr, srcPtr, (int) size); - return factory.createNativeVoidPtr(destPtr); + return PFactory.createNativeVoidPtr(language, destPtr); } } @@ -1965,9 +1893,9 @@ protected abstract static class MemsetNode extends Node { @Specialization static Object memset(Node inliningTarget, Pointer ptr, int value, long size, + @Bind PythonLanguage language, @Cached PointerNodes.WriteLongNode writeLongNode, - @Cached PointerNodes.WriteByteNode writeByteNode, - @Cached(inline = false) PythonObjectFactory factory) { + @Cached PointerNodes.WriteByteNode writeByteNode) { byte b = (byte) value; long fill = 0; for (int i = 0; i < Long.BYTES * 8; i += 8) { @@ -1985,7 +1913,7 @@ static Object memset(Node inliningTarget, Pointer ptr, int value, long size, for (; i < size; i++) { writeByteNode.execute(inliningTarget, ptr.withOffset(i), b); } - return factory.createNativeVoidPtr(ptr); + return PFactory.createNativeVoidPtr(language, ptr); } } @@ -2043,15 +1971,15 @@ protected abstract static class StringAtFunctionNode extends Node { @Specialization static Object string_at(Pointer ptr, int size, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached PointerNodes.ReadBytesNode read, @Cached PointerNodes.StrLenNode strLenNode, @Cached AuditNode auditNode) { - auditNode.audit(inliningTarget, "ctypes.string_at", factory.createNativeVoidPtr(ptr), size); + auditNode.audit(inliningTarget, "ctypes.string_at", PFactory.createNativeVoidPtr(language, ptr), size); if (size == -1) { size = strLenNode.execute(inliningTarget, ptr); } - return factory.createBytes(read.execute(inliningTarget, ptr, size)); + return PFactory.createBytes(language, read.execute(inliningTarget, ptr, size)); } } @@ -2086,13 +2014,13 @@ protected abstract static class WStringAtFunctionNode extends Node { @Specialization static TruffleString wstring_at(Pointer ptr, int size, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached AuditNode auditNode, @Cached PointerNodes.ReadBytesNode read, @Cached PointerNodes.WCsLenNode wCsLenNode, @Cached TruffleString.FromByteArrayNode fromByteArrayNode, @Cached TruffleString.SwitchEncodingNode switchEncodingNode) { - auditNode.audit(inliningTarget, "ctypes.wstring_at", factory.createNativeVoidPtr(ptr), size); + auditNode.audit(inliningTarget, "ctypes.wstring_at", PFactory.createNativeVoidPtr(language, ptr), size); if (size == -1) { size = wCsLenNode.execute(inliningTarget, ptr); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CtypesNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CtypesNodes.java index 6b706257f4..90ce8009fa 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CtypesNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CtypesNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -57,6 +57,7 @@ import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.truffle.api.strings.TruffleString.Encoding.US_ASCII; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonOS; import com.oracle.graal.python.builtins.modules.ctypes.FFIType.FFI_TYPES; @@ -66,6 +67,7 @@ import com.oracle.graal.python.builtins.objects.cext.common.NativePointer; import com.oracle.graal.python.builtins.objects.cext.structs.CFields; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetBaseClassNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode; import com.oracle.graal.python.lib.PyObjectTypeCheck; @@ -73,9 +75,10 @@ import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; @@ -313,7 +316,7 @@ public abstract static class PyCDataFromBaseObjNode extends Node { @Specialization static CDataObject PyCData_FromBaseObj(Node inliningTarget, Object type, CDataObject base, int index, Pointer adr, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached StgDictBuiltins.PyTypeStgDictNode pyTypeStgDictNode, @Cached CreateCDataObjectNode createCDataObjectNode, @Cached PyCDataMallocBufferNode mallocBufferNode, @@ -344,12 +347,13 @@ public abstract static class CreateCDataObjectNode extends Node { @Specialization static CDataObject doCreate(Node inliningTarget, Object type, Pointer pointer, int size, boolean needsfree, @Cached(inline = false) IsSubtypeNode isSubtypeNode, - @Cached(inline = false) PythonObjectFactory factory) { + @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Bind PythonLanguage language) { CDataObject result; if (isSubtypeNode.execute(type, PyCFuncPtr)) { - result = factory.createPyCFuncPtrObject(type, pointer, size, needsfree); + result = PFactory.createPyCFuncPtrObject(language, type, getInstanceShape.execute(type), pointer, size, needsfree); } else { - result = factory.createCDataObject(type, pointer, size, needsfree); + result = PFactory.createCDataObject(language, type, getInstanceShape.execute(type), pointer, size, needsfree); } if (needsfree) { new PointerReference(result, pointer, PythonContext.get(inliningTarget).getSharedFinalizer()); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/LazyPyCArrayTypeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/LazyPyCArrayTypeBuiltins.java index d5ba1bf969..956b8676c9 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/LazyPyCArrayTypeBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/LazyPyCArrayTypeBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -76,9 +76,7 @@ import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.IndirectCallData; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.runtime.object.PythonObjectSlowPathFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; @@ -133,10 +131,9 @@ private static void createGetSet(PythonLanguage language, Object type, NodeFacto l -> new BuiltinFunctionRootNode(l, builtin, factory, true), factory.getNodeClass(), builtin.name()); - PythonObjectSlowPathFactory f = PythonContext.get(null).factory(); int flags = PBuiltinFunction.getFlags(builtin, rawCallTarget); - PBuiltinFunction getter = f.createBuiltinFunction(name, type, 1, flags, rawCallTarget); - GetSetDescriptor callable = f.createGetSetDescriptor(getter, getter, name, type, false); + PBuiltinFunction getter = PFactory.createBuiltinFunction(language, name, type, 1, flags, rawCallTarget); + GetSetDescriptor callable = PFactory.createGetSetDescriptor(language, getter, getter, name, type, false); callable.setAttribute(T___DOC__, toTruffleStringUncached(builtin.doc())); WriteAttributeToObjectNode.getUncached(true).execute(type, name, callable); } @@ -147,10 +144,10 @@ abstract static class CharArrayRawNode extends PythonBinaryBuiltinNode { @Specialization(guards = "isNoValue(value)") static PBytes doGet(CDataObject self, @SuppressWarnings("unused") PNone value, + @Bind PythonLanguage language, @Bind("this") Node inliningTarget, - @Cached PointerNodes.ReadBytesNode read, - @Cached PythonObjectFactory factory) { - return factory.createBytes(read.execute(inliningTarget, self.b_ptr, self.b_size)); + @Cached PointerNodes.ReadBytesNode read) { + return PFactory.createBytes(language, read.execute(inliningTarget, self.b_ptr, self.b_size)); } @Specialization(limit = "3") @@ -160,13 +157,13 @@ static Object doSet(VirtualFrame frame, CDataObject self, Object value, @CachedLibrary("value") PythonBufferAcquireLibrary acquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, @Cached PointerNodes.WriteBytesNode writeBytesNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object buffer = acquireLib.acquire(value, BufferFlags.PyBUF_SIMPLE, frame, indirectCallData); try { byte[] bytes = bufferLib.getInternalOrCopiedByteArray(buffer); int len = bufferLib.getBufferLength(buffer); if (len > self.b_size) { - throw raiseNode.get(inliningTarget).raise(ValueError, BYTE_STRING_TOO_LONG); + throw raiseNode.raise(inliningTarget, ValueError, BYTE_STRING_TOO_LONG); } writeBytesNode.execute(inliningTarget, self.b_ptr, bytes, 0, len); return PNone.NONE; @@ -183,10 +180,10 @@ abstract static class CharArrayValueNode extends PythonBinaryBuiltinNode { @Specialization(guards = "isNoValue(value)") static PBytes doGet(CDataObject self, @SuppressWarnings("unused") PNone value, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached PointerNodes.StrLenNode strLenNode, - @Cached PointerNodes.ReadBytesNode read, - @Cached PythonObjectFactory factory) { - return factory.createBytes(read.execute(inliningTarget, self.b_ptr, strLenNode.execute(inliningTarget, self.b_ptr))); + @Cached PointerNodes.ReadBytesNode read) { + return PFactory.createBytes(language, read.execute(inliningTarget, self.b_ptr, strLenNode.execute(inliningTarget, self.b_ptr))); } @Specialization @@ -194,11 +191,11 @@ static Object doSet(CDataObject self, PBytes value, @Bind("this") Node inliningTarget, @Cached GetInternalByteArrayNode getBytes, @Cached PointerNodes.WriteBytesNode writeBytesNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { SequenceStorage storage = value.getSequenceStorage(); int len = storage.length(); if (len > self.b_size) { - throw raiseNode.get(inliningTarget).raise(ValueError, BYTE_STRING_TOO_LONG); + throw raiseNode.raise(inliningTarget, ValueError, BYTE_STRING_TOO_LONG); } byte[] bytes = getBytes.execute(inliningTarget, storage); writeBytesNode.execute(inliningTarget, self.b_ptr, bytes, 0, len); @@ -207,8 +204,8 @@ static Object doSet(CDataObject self, PBytes value, @Fallback static Object error(@SuppressWarnings("unused") Object self, Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, BYTES_EXPECTED_INSTEAD_OF_P_INSTANCE, value); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, BYTES_EXPECTED_INSTEAD_OF_P_INSTANCE, value); } } @@ -235,11 +232,11 @@ static Object doSet(CDataObject self, Object value, @Shared @Cached TruffleString.SwitchEncodingNode switchEncodingNode, @Cached TruffleString.GetInternalByteArrayNode getInternalByteArrayNode, @Cached PointerNodes.WriteBytesNode writeBytesNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { TruffleString str = switchEncodingNode.execute(toTruffleStringNode.execute(inliningTarget, value), WCHAR_T_ENCODING); int len = str.byteLength(WCHAR_T_ENCODING); if (len > self.b_size) { - throw raiseNode.get(inliningTarget).raise(ValueError, STRING_TOO_LONG); + throw raiseNode.raise(inliningTarget, ValueError, STRING_TOO_LONG); } InternalByteArray bytes = getInternalByteArrayNode.execute(str, WCHAR_T_ENCODING); writeBytesNode.execute(inliningTarget, self.b_ptr, bytes.getArray(), bytes.getOffset(), bytes.getLength()); @@ -248,8 +245,8 @@ static Object doSet(CDataObject self, Object value, @Fallback static Object error(@SuppressWarnings("unused") Object self, Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, UNICODE_STRING_EXPECTED_INSTEAD_OF_P_INSTANCE, value); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, UNICODE_STRING_EXPECTED_INSTEAD_OF_P_INSTANCE, value); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/LazyPyCSimpleTypeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/LazyPyCSimpleTypeBuiltins.java index cf3d3e988d..2315806713 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/LazyPyCSimpleTypeBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/LazyPyCSimpleTypeBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -77,15 +77,13 @@ import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.runtime.object.PythonObjectSlowPathFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NodeFactory; @@ -102,28 +100,28 @@ protected List> getNodeFa } @TruffleBoundary - protected static void addCVoidPFromParam(PythonObjectSlowPathFactory factory, PythonLanguage language, Object type) { + protected static void addCVoidPFromParam(PythonLanguage language, Object type) { NodeFactory rawFactory = CVoidPFromParamNodeFactory.getInstance(); Builtin rawNodeBuiltin = CVoidPFromParamNode.class.getAnnotation(Builtin.class); - addClassMethod(factory, language, type, rawFactory, rawNodeBuiltin); + addClassMethod(language, type, rawFactory, rawNodeBuiltin); } @TruffleBoundary - protected static void addCCharPFromParam(PythonObjectSlowPathFactory factory, PythonLanguage language, Object type) { + protected static void addCCharPFromParam(PythonLanguage language, Object type) { NodeFactory rawFactory = CCharPFromParamNodeFactory.getInstance(); Builtin rawNodeBuiltin = CCharPFromParamNode.class.getAnnotation(Builtin.class); - addClassMethod(factory, language, type, rawFactory, rawNodeBuiltin); + addClassMethod(language, type, rawFactory, rawNodeBuiltin); } @TruffleBoundary - protected static void addCWCharPFromParam(PythonObjectSlowPathFactory factory, PythonLanguage language, Object type) { + protected static void addCWCharPFromParam(PythonLanguage language, Object type) { NodeFactory rawFactory = CWCharPFromParamNodeFactory.getInstance(); Builtin rawNodeBuiltin = CWCharPFromParamNode.class.getAnnotation(Builtin.class); - addClassMethod(factory, language, type, rawFactory, rawNodeBuiltin); + addClassMethod(language, type, rawFactory, rawNodeBuiltin); } @TruffleBoundary - private static void addClassMethod(PythonObjectSlowPathFactory objectFactory, PythonLanguage language, Object type, NodeFactory nodeFactory, Builtin builtin) { + private static void addClassMethod(PythonLanguage language, Object type, NodeFactory nodeFactory, Builtin builtin) { TruffleString name = toTruffleStringUncached(builtin.name()); Object builtinDoc = PNone.NONE; RootCallTarget callTarget = language.createCachedCallTarget( @@ -131,8 +129,8 @@ private static void addClassMethod(PythonObjectSlowPathFactory objectFactory, Py nodeFactory.getNodeClass(), builtin.name()); int flags = PBuiltinFunction.getFlags(builtin, callTarget); - PBuiltinFunction function = objectFactory.createBuiltinFunction(name, type, 1, flags, callTarget); - PDecoratedMethod classMethod = objectFactory.createClassmethodFromCallableObj(function); + PBuiltinFunction function = PFactory.createBuiltinFunction(language, name, type, 1, flags, callTarget); + PDecoratedMethod classMethod = PFactory.createClassmethodFromCallableObj(language, function); function.setAttribute(T___DOC__, builtinDoc); WriteAttributeToObjectNode.getUncached(true).execute(type, name, classMethod); } @@ -159,10 +157,9 @@ static Object c_wchar_p_from_param(VirtualFrame frame, Object type, Object value @Cached PyObjectStgDictNode pyObjectStgDictNode, @Cached CWCharPFromParamNode cwCharPFromParamNode, @Cached PyObjectLookupAttr lookupAttr, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (PGuards.isString(value)) { - PyCArgObject parg = factory.createCArgObject(); + PyCArgObject parg = PFactory.createCArgObject(PythonLanguage.get(inliningTarget)); parg.pffi_type = ffi_type_pointer; parg.tag = 'Z'; parg.valuePointer = Pointer.allocate(parg.pffi_type, parg.pffi_type.size); @@ -195,7 +192,7 @@ static Object c_wchar_p_from_param(VirtualFrame frame, Object type, Object value if (as_parameter != PNone.NO_VALUE) { return cwCharPFromParamNode.execute(frame, type, as_parameter); } - throw raiseNode.get(inliningTarget).raise(TypeError, WRONG_TYPE); + throw raiseNode.raise(inliningTarget, TypeError, WRONG_TYPE); } } @@ -220,9 +217,9 @@ static Object voidPtr(@SuppressWarnings("unused") Object type, Object value, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Exclusive @Cached PyLongCheckNode longCheckNode, @Exclusive @Cached SetFuncNode setFuncNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { /* int, long */ - PyCArgObject parg = factory.createCArgObject(); + PyCArgObject parg = PFactory.createCArgObject(language); parg.pffi_type = ffi_type_pointer; parg.tag = 'P'; parg.valuePointer = Pointer.allocate(parg.pffi_type, parg.pffi_type.size); @@ -234,9 +231,9 @@ static Object voidPtr(@SuppressWarnings("unused") Object type, Object value, @Specialization static Object bytes(@SuppressWarnings("unused") Object type, PBytes value, @Exclusive @Cached SetFuncNode setFuncNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { /* bytes */ - PyCArgObject parg = factory.createCArgObject(); + PyCArgObject parg = PFactory.createCArgObject(language); parg.pffi_type = ffi_type_pointer; parg.tag = 'z'; parg.valuePointer = Pointer.allocate(parg.pffi_type, parg.pffi_type.size); @@ -248,9 +245,9 @@ static Object bytes(@SuppressWarnings("unused") Object type, PBytes value, @Specialization static Object string(@SuppressWarnings("unused") Object type, TruffleString value, @Exclusive @Cached SetFuncNode setFuncNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { /* unicode */ - PyCArgObject parg = factory.createCArgObject(); + PyCArgObject parg = PFactory.createCArgObject(language); parg.pffi_type = ffi_type_pointer; parg.tag = 'Z'; parg.valuePointer = Pointer.allocate(parg.pffi_type, parg.pffi_type.size); @@ -269,8 +266,8 @@ static Object c_void_p_from_param(VirtualFrame frame, Object type, Object value, @Cached CVoidPFromParamNode cVoidPFromParamNode, @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode, @Cached PyObjectLookupAttr lookupAttr, - @Shared @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { /* c_void_p instance (or subclass) */ boolean res = isInstanceNode.executeWith(frame, value, type); if (res) { @@ -292,7 +289,7 @@ static Object c_void_p_from_param(VirtualFrame frame, Object type, Object value, } /* function pointer */ if (value instanceof PyCFuncPtrObject func && pyTypeCheck.isPyCFuncPtrObject(inliningTarget, value)) { - PyCArgObject parg = factory.createCArgObject(); + PyCArgObject parg = PFactory.createCArgObject(language); parg.pffi_type = ffi_type_pointer; parg.tag = 'P'; parg.valuePointer = func.b_ptr; @@ -305,7 +302,7 @@ static Object c_void_p_from_param(VirtualFrame frame, Object type, Object value, int code = codePointAtIndexNode.execute((TruffleString) stgd.proto, 0, TS_ENCODING); /* c_char_p, c_wchar_p */ if (code == 'z' || code == 'Z') { - PyCArgObject parg = factory.createCArgObject(); + PyCArgObject parg = PFactory.createCArgObject(language); parg.pffi_type = ffi_type_pointer; parg.tag = 'Z'; parg.obj = value; @@ -319,7 +316,7 @@ static Object c_void_p_from_param(VirtualFrame frame, Object type, Object value, if (as_parameter != PNone.NO_VALUE) { return cVoidPFromParamNode.execute(frame, type, as_parameter); } - throw raiseNode.get(inliningTarget).raise(TypeError, WRONG_TYPE); + throw raiseNode.raise(inliningTarget, TypeError, WRONG_TYPE); } } @@ -338,8 +335,8 @@ static Object none(Object type, PNone value) { @Specialization static Object bytes(@SuppressWarnings("unused") Object type, PBytes value, @Cached SetFuncNode setFuncNode, - @Cached PythonObjectFactory factory) { - PyCArgObject parg = factory.createCArgObject(); + @Bind PythonLanguage language) { + PyCArgObject parg = PFactory.createCArgObject(language); parg.pffi_type = ffi_type_pointer; parg.tag = 'z'; parg.valuePointer = Pointer.allocate(parg.pffi_type, parg.pffi_type.size); @@ -357,7 +354,7 @@ static Object c_char_p_from_param(VirtualFrame frame, Object type, Object value, @Cached PyObjectStgDictNode pyObjectStgDictNode, @Cached CCharPFromParamNode cCharPFromParamNode, @Cached PyObjectLookupAttr lookupAttr, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { boolean res = isInstanceNode.executeWith(frame, value, type); if (res) { return value; @@ -384,7 +381,7 @@ static Object c_char_p_from_param(VirtualFrame frame, Object type, Object value, if (as_parameter != PNone.NO_VALUE) { return cCharPFromParamNode.execute(frame, type, as_parameter); } - throw raiseNode.get(inliningTarget).raise(TypeError, WRONG_TYPE); + throw raiseNode.raise(inliningTarget, TypeError, WRONG_TYPE); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCArrayBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCArrayBuiltins.java index 4b44012f12..b1f802596b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCArrayBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCArrayBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -48,9 +48,6 @@ import static com.oracle.graal.python.nodes.ErrorMessages.INDICES_MUST_BE_INTEGERS; import static com.oracle.graal.python.nodes.ErrorMessages.INVALID_INDEX; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CLASS_GETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETITEM__; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; import static com.oracle.graal.python.runtime.exception.PythonErrorType.IndexError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; @@ -59,8 +56,10 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -81,7 +80,9 @@ import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.MpSubscriptBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotMpAssSubscript.MpAssSubscriptBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqItemBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqAssItem; import com.oracle.graal.python.lib.PyIndexCheckNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyNumberIndexNode; @@ -89,12 +90,11 @@ import com.oracle.graal.python.lib.PyObjectSetItem; import com.oracle.graal.python.lib.PyObjectSizeNode; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.PRaiseNode.Lazy; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; @@ -126,7 +126,8 @@ public void postInitialize(Python3Core core) { core.getContext().registerCApiHook(() -> PCallCapiFunction.callUncached(FUN_PY_TRUFFLE_CDATA_INIT_BUFFER_PROTOCOL, PythonToNativeNode.executeUncached(PyCArray))); } - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory protected abstract static class NewNode extends PythonBuiltinNode { @Specialization @@ -134,15 +135,16 @@ static Object newCData(Object type, @SuppressWarnings("unused") Object[] args, @ @Bind("this") Node inliningTarget, @Cached PyTypeStgDictNode pyTypeStgDictNode, @Cached CtypesNodes.GenericPyCDataNewNode newNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { StgDictObject dict = pyTypeStgDictNode.checkAbstractClass(inliningTarget, type, raiseNode); return newNode.execute(inliningTarget, type, dict); } } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory - protected abstract static class InitNode extends PythonBuiltinNode { + protected abstract static class InitNode extends PythonVarargsBuiltinNode { @Specialization static Object Array_init(VirtualFrame frame, CDataObject self, Object[] args, @SuppressWarnings("unused") PKeyword[] kwds, @@ -156,88 +158,86 @@ static Object Array_init(VirtualFrame frame, CDataObject self, Object[] args, @S } } - @Builtin(name = J___SETITEM__, minNumOfPositionalArgs = 3) + @Slot(value = SlotKind.sq_ass_item, isComplex = true) @GenerateNodeFactory - abstract static class PyCArraySetItemNode extends PythonTernaryBuiltinNode { + abstract static class PyCArraySetItemNode extends TpSlotSqAssItem.SqAssItemBuiltinNode { - @Specialization(guards = "!isPNone(value)") - static Object Array_ass_item(VirtualFrame frame, CDataObject self, int index, Object value, + @Specialization(guards = "!isNoValue(value)") + static void Array_ass_item(VirtualFrame frame, CDataObject self, int index, Object value, @Bind("this") Node inliningTarget, - @Exclusive @Cached PyObjectStgDictNode pyObjectStgDictNode, - @Shared @Cached PyCDataSetNode pyCDataSetNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Cached PyObjectStgDictNode pyObjectStgDictNode, + @Cached PyCDataSetNode pyCDataSetNode, + @Cached PRaiseNode raiseNode) { StgDictObject stgdict = pyObjectStgDictNode.execute(inliningTarget, self); assert stgdict != null : "Cannot be NULL for array object instances"; if (index < 0 || index >= stgdict.length) { - throw raiseNode.get(inliningTarget).raise(IndexError, INVALID_INDEX); + throw raiseNode.raise(inliningTarget, IndexError, INVALID_INDEX); } int size = stgdict.size / stgdict.length; // self.b_ptr.createStorage(stgdict.ffi_type_pointer, stgdict.size, value); int offset = index * size; pyCDataSetNode.execute(frame, self, stgdict.proto, stgdict.setfunc, value, index, size, self.b_ptr.withOffset(offset)); - return PNone.NONE; } @SuppressWarnings("unused") - @Specialization(guards = {"!isPNone(value)", "!isPSlice(item)"}) - static Object Array_ass_subscript(VirtualFrame frame, CDataObject self, Object item, Object value, + @Specialization(guards = "isNoValue(value)") + static void error(CDataObject self, int index, PNone value, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ARRAY_DOES_NOT_SUPPORT_ITEM_DELETION); + } + } + + @Slot(value = SlotKind.mp_ass_subscript, isComplex = true) + @GenerateNodeFactory + abstract static class PyCArraySetSubscriptNode extends MpAssSubscriptBuiltinNode { + + @Specialization(guards = {"!isNoValue(value)", "!isPSlice(indexObj)"}) + static void Array_ass_subscript(VirtualFrame frame, CDataObject self, Object indexObj, Object value, @Bind("this") Node inliningTarget, @Cached PyIndexCheckNode indexCheckNode, @Cached PyNumberAsSizeNode asSint, - @Exclusive @Cached PyObjectStgDictNode pyObjectStgDictNode, - @Shared @Cached PyCDataSetNode pyCDataSetNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - if (indexCheckNode.execute(inliningTarget, item)) { - int i = asSint.executeExact(frame, inliningTarget, item, IndexError); - if (i < 0) { - i += self.b_length; + @Shared @Cached PyCArraySetItemNode setItemNode, + @Exclusive @Cached PRaiseNode raiseNode) { + if (indexCheckNode.execute(inliningTarget, indexObj)) { + int index = asSint.executeExact(frame, inliningTarget, indexObj, IndexError); + if (index < 0) { + index += self.b_length; } - Array_ass_item(frame, self, i, value, inliningTarget, - pyObjectStgDictNode, - pyCDataSetNode, - raiseNode); + setItemNode.executeIntKey(frame, self, index, value); } else { - throw raiseNode.get(inliningTarget).raise(TypeError, INDICES_MUST_BE_INTEGER); + throw raiseNode.raise(inliningTarget, TypeError, INDICES_MUST_BE_INTEGER); } - return PNone.NONE; } - @SuppressWarnings("unused") - @Specialization(guards = "!isPNone(value)") - static Object Array_ass_subscript(VirtualFrame frame, CDataObject self, PSlice slice, Object value, + @Specialization(guards = "!isNoValue(value)") + static void Array_ass_subscript(VirtualFrame frame, CDataObject self, PSlice slice, Object value, @Bind("this") Node inliningTarget, @Cached PyObjectSizeNode pySequenceLength, @Cached PyObjectGetItem pySequenceGetItem, @Cached SliceUnpack sliceUnpack, @Cached AdjustIndices adjustIndices, - @Exclusive @Cached PyObjectStgDictNode pyObjectStgDictNode, - @Shared @Cached PyCDataSetNode pyCDataSetNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PyCArraySetItemNode setItemNode, + @Exclusive @Cached PRaiseNode raiseNode) { PSlice.SliceInfo sliceInfo = adjustIndices.execute(inliningTarget, self.b_length, sliceUnpack.execute(inliningTarget, slice)); - int start = sliceInfo.start, stop = sliceInfo.stop, step = sliceInfo.step; + int start = sliceInfo.start, step = sliceInfo.step; int slicelen = sliceInfo.sliceLength; - // if ((step < 0 && start < stop) || (step > 0 && start > stop)) - // stop = start; int otherlen = pySequenceLength.execute(frame, inliningTarget, value); if (otherlen != slicelen) { - throw raiseNode.get(inliningTarget).raise(ValueError, CAN_ONLY_ASSIGN_SEQUENCE_OF_SAME_SIZE); + throw raiseNode.raise(inliningTarget, ValueError, CAN_ONLY_ASSIGN_SEQUENCE_OF_SAME_SIZE); } for (int cur = start, i = 0; i < otherlen; cur += step, i++) { - Array_ass_item(frame, self, cur, pySequenceGetItem.execute(frame, inliningTarget, value, i), inliningTarget, - pyObjectStgDictNode, - pyCDataSetNode, - raiseNode); + Object item = pySequenceGetItem.execute(frame, inliningTarget, value, i); + setItemNode.executeIntKey(frame, self, cur, item); } - return PNone.NONE; } @SuppressWarnings("unused") - @Specialization - static Object error(CDataObject self, Object item, PNone value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ARRAY_DOES_NOT_SUPPORT_ITEM_DELETION); + @Specialization(guards = "isNoValue(value)") + static void error(CDataObject self, Object index, PNone value, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ARRAY_DOES_NOT_SUPPORT_ITEM_DELETION); } } @@ -247,7 +247,7 @@ abstract static class PyCArrayGetItemNode extends SqItemBuiltinNode { @Specialization static Object doIt(CDataObject self, int index, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached PyCDataGetNode pyCDataGetNode, @Cached PyObjectStgDictNode pyObjectStgDictNode) { checkIndex(inliningTarget, self, index, raiseNode); @@ -262,15 +262,15 @@ static Object getItem(Node inliningTarget, CDataObject self, int index, PyCDataG return pyCDataGetNode.execute(inliningTarget, stgdict.proto, stgdict.getfunc, self, index, size, self.b_ptr.withOffset(offset)); } - private static void checkIndex(Node inliningTarget, CDataObject self, int index, Lazy raiseNode) { + private static void checkIndex(Node inliningTarget, CDataObject self, int index, PRaiseNode raiseNode) { if (index < 0 || index >= self.b_length) { raiseInvalidIndex(inliningTarget, raiseNode); } } @InliningCutoff - private static void raiseInvalidIndex(Node inliningTarget, Lazy raiseNode) { - throw raiseNode.get(inliningTarget).raise(IndexError, INVALID_INDEX); + private static void raiseInvalidIndex(Node inliningTarget, PRaiseNode raiseNode) { + throw raiseNode.raise(inliningTarget, IndexError, INVALID_INDEX); } } @@ -294,14 +294,14 @@ static Object doInt(CDataObject self, int index, static Object doSlice(CDataObject self, PSlice slice, @CachedLibrary("self") PythonBufferAccessLibrary bufferLib, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Exclusive @Cached PyCDataGetNode pyCDataGetNode, @Exclusive @Cached PyTypeStgDictNode pyTypeStgDictNode, @Exclusive @Cached PyObjectStgDictNode pyObjectStgDictNode, @Cached SliceUnpack sliceUnpack, @Cached AdjustIndices adjustIndices, @Cached TruffleString.FromByteArrayNode fromByteArrayNode, - @Cached TruffleString.SwitchEncodingNode switchEncodingNode, - @Cached PythonObjectFactory factory) { + @Cached TruffleString.SwitchEncodingNode switchEncodingNode) { StgDictObject stgdict = pyObjectStgDictNode.execute(inliningTarget, self); assert stgdict != null : "Cannot be NULL for array object instances"; Object proto = stgdict.proto; @@ -315,17 +315,17 @@ static Object doSlice(CDataObject self, PSlice slice, byte[] ptr = bufferLib.getInternalOrCopiedByteArray(self); if (slicelen <= 0) { - return factory.createEmptyBytes(); + return PFactory.createEmptyBytes(language); } - if (sliceInfo.step == 1) { - return factory.createBytes(ptr, sliceInfo.start, slicelen); + if (sliceInfo.start == 0 && sliceInfo.step == 1) { + return PFactory.createBytes(language, ptr, slicelen); } byte[] dest = new byte[slicelen]; for (int cur = sliceInfo.start, i = 0; i < slicelen; cur += sliceInfo.step, i++) { dest[i] = ptr[cur]; } - return factory.createBytes(dest); + return PFactory.createBytes(language, dest); } if (itemdict.getfunc == FieldDesc.u.getfunc) { // CTYPES_UNICODE byte[] ptr = bufferLib.getInternalOrCopiedByteArray(self); @@ -351,7 +351,7 @@ static Object doSlice(CDataObject self, PSlice slice, for (int cur = sliceInfo.start, i = 0; i < slicelen; cur += sliceInfo.step, i++) { np[i] = doInt(self, cur, inliningTarget, pyCDataGetNode, pyObjectStgDictNode); } - return factory.createList(np); + return PFactory.createList(language, np); } @Specialization(guards = "!isPSlice(item)", replaces = "doInt") @@ -363,9 +363,9 @@ static Object doGeneric(VirtualFrame frame, CDataObject self, Object item, @Cached InlinedConditionProfile negativeIndexProfile, @Exclusive @Cached PyCDataGetNode pyCDataGetNode, @Exclusive @Cached PyObjectStgDictNode pyObjectStgDictNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (!indexCheckNode.execute(inliningTarget, item)) { - throw raiseNode.get(inliningTarget).raise(TypeError, INDICES_MUST_BE_INTEGERS); + throw raiseNode.raise(inliningTarget, TypeError, INDICES_MUST_BE_INTEGERS); } Object idx = indexNode.execute(frame, inliningTarget, item); int index = asSizeNode.executeExact(frame, inliningTarget, idx); @@ -394,8 +394,8 @@ static int Array_length(CDataObject self) { public abstract static class ClassGetItemNode extends PythonBinaryBuiltinNode { @Specialization static Object classGetItem(Object cls, Object key, - @Cached PythonObjectFactory factory) { - return factory.createGenericAlias(cls, key); + @Bind PythonLanguage language) { + return PFactory.createGenericAlias(language, cls, key); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCArrayTypeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCArrayTypeBuiltins.java index d86a887fd2..89ba5e9f88 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCArrayTypeBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCArrayTypeBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -50,7 +50,6 @@ import static com.oracle.graal.python.nodes.ErrorMessages.THE_LENGTH_ATTRIBUTE_MUST_BE_AN_INTEGER; import static com.oracle.graal.python.nodes.ErrorMessages.THE_LENGTH_ATTRIBUTE_MUST_NOT_BE_NEGATIVE; import static com.oracle.graal.python.nodes.ErrorMessages.TYPE_MUST_HAVE_STORAGE_INFO; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.OverflowError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; @@ -60,11 +59,12 @@ import java.util.List; import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.TypeNode; import com.oracle.graal.python.builtins.modules.ctypes.FFIType.FieldDesc; import com.oracle.graal.python.builtins.modules.ctypes.StgDictBuiltins.PyTypeStgDictNode; import com.oracle.graal.python.builtins.objects.PNone; @@ -72,6 +72,8 @@ import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.object.PythonObject; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeBuiltins.TypeNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.nodes.PRaiseNode; @@ -82,7 +84,7 @@ import com.oracle.graal.python.nodes.object.GetDictIfExistsNode; import com.oracle.graal.python.nodes.object.SetDictNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -96,6 +98,8 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PyCArrayType) public final class PyCArrayTypeBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = PyCArrayTypeBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return PyCArrayTypeBuiltinsFactory.getFactories(); @@ -104,7 +108,8 @@ protected List> getNodeFa protected static final TruffleString T__LENGTH_ = tsLiteral("_length_"); @ImportStatic({PyCPointerTypeBuiltins.class, PyCArrayTypeBuiltins.class, SpecialMethodNames.class}) - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory protected abstract static class PyCArrayTypeNewNode extends PythonBuiltinNode { @@ -120,15 +125,15 @@ static Object PyCArrayType_new(VirtualFrame frame, Object type, Object[] args, P @Cached SetDictNode setDict, @Cached HashingStorageAddAllToOther addAllToOtherNode, @Cached PyTypeStgDictNode pyTypeStgDictNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { /* * create the new instance (which is a class, since we are a metatype!) */ Object result = typeNew.execute(frame, type, args[0], args[1], args[2], kwds); Object length_attr = lookupAttrLength.execute(frame, inliningTarget, result, T__LENGTH_); if (length_attr == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(AttributeError, CLASS_MUST_DEFINE_A_LENGTH_ATTRIBUTE); + throw raiseNode.raise(inliningTarget, AttributeError, CLASS_MUST_DEFINE_A_LENGTH_ATTRIBUTE); } int length; @@ -136,26 +141,26 @@ static Object PyCArrayType_new(VirtualFrame frame, Object type, Object[] args, P length = asSizeNode.executeExact(frame, inliningTarget, length_attr); } catch (PException e) { if (e.expectTypeOrOverflowError(inliningTarget, profile)) { - throw raiseNode.get(inliningTarget).raise(OverflowError, THE_LENGTH_ATTRIBUTE_IS_TOO_LARGE); + throw raiseNode.raise(inliningTarget, OverflowError, THE_LENGTH_ATTRIBUTE_IS_TOO_LARGE); } else { - throw raiseNode.get(inliningTarget).raise(TypeError, THE_LENGTH_ATTRIBUTE_MUST_BE_AN_INTEGER); + throw raiseNode.raise(inliningTarget, TypeError, THE_LENGTH_ATTRIBUTE_MUST_BE_AN_INTEGER); } } if (length < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, THE_LENGTH_ATTRIBUTE_MUST_NOT_BE_NEGATIVE); + throw raiseNode.raise(inliningTarget, ValueError, THE_LENGTH_ATTRIBUTE_MUST_NOT_BE_NEGATIVE); } Object type_attr = lookupAttrType.execute(frame, inliningTarget, result, T__TYPE_); if (type_attr == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(AttributeError, CLASS_MUST_DEFINE_A_TYPE_ATTRIBUTE); + throw raiseNode.raise(inliningTarget, AttributeError, CLASS_MUST_DEFINE_A_TYPE_ATTRIBUTE); } - StgDictObject stgdict = factory.createStgDictObject(PythonBuiltinClassType.StgDict); + StgDictObject stgdict = PFactory.createStgDictObject(language); StgDictObject itemdict = pyTypeStgDictNode.execute(inliningTarget, type_attr); if (itemdict == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, TYPE_MUST_HAVE_STORAGE_INFO); + throw raiseNode.raise(inliningTarget, TypeError, TYPE_MUST_HAVE_STORAGE_INFO); } assert itemdict.format != null; @@ -171,7 +176,7 @@ static Object PyCArrayType_new(VirtualFrame frame, Object type, Object[] args, P int itemsize = itemdict.size; if (itemsize != 0 && length > Integer.MAX_VALUE / itemsize) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ARRAY_TOO_LARGE); + throw raiseNode.raise(inliningTarget, OverflowError, ARRAY_TOO_LARGE); } int itemalign = itemdict.align; @@ -193,7 +198,7 @@ static Object PyCArrayType_new(VirtualFrame frame, Object type, Object[] args, P /* replace the class dict by our updated spam dict */ PDict resDict = getDict.execute(result); if (resDict == null) { - resDict = factory.createDictFixedStorage((PythonObject) result); + resDict = PFactory.createDictFixedStorage(language, (PythonObject) result); } addAllToOtherNode.execute(frame, inliningTarget, resDict.getDictStorage(), stgdict); setDict.execute(inliningTarget, (PythonObject) result, stgdict); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCFuncPtrBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCFuncPtrBuiltins.java index 710ced01fa..68691583e6 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCFuncPtrBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCFuncPtrBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -60,7 +60,8 @@ import static com.oracle.graal.python.nodes.ErrorMessages.INVALID_RESULT_TYPE_FOR_CALLBACK_FUNCTION; import static com.oracle.graal.python.nodes.ErrorMessages.NOT_ENOUGH_ARGUMENTS; import static com.oracle.graal.python.nodes.ErrorMessages.NULL_STGDICT_UNEXPECTED; -import static com.oracle.graal.python.nodes.ErrorMessages.OUT_PARAMETER_D_MUST_BE_A_POINTER_TYPE_NOT_S; +import static com.oracle.graal.python.nodes.ErrorMessages.N_OUT_PARAMETER_MUST_BE_PASSED_AS_DEFAULT_VALUE; +import static com.oracle.graal.python.nodes.ErrorMessages.OUT_PARAMETER_D_MUST_BE_A_POINTER_TYPE_NOT_N; import static com.oracle.graal.python.nodes.ErrorMessages.PARAMFLAGS_MUST_BE_A_SEQUENCE_OF_INT_STRING_VALUE_TUPLES; import static com.oracle.graal.python.nodes.ErrorMessages.PARAMFLAGS_MUST_BE_A_TUPLE_OR_NONE; import static com.oracle.graal.python.nodes.ErrorMessages.PARAMFLAGS_MUST_HAVE_THE_SAME_LENGTH_AS_ARGTYPES; @@ -68,14 +69,10 @@ import static com.oracle.graal.python.nodes.ErrorMessages.PARAMFLAG_VALUE_D_NOT_SUPPORTED; import static com.oracle.graal.python.nodes.ErrorMessages.REQUIRED_ARGUMENT_S_MISSING; import static com.oracle.graal.python.nodes.ErrorMessages.RESTYPE_MUST_BE_A_TYPE_A_CALLABLE_OR_NONE; -import static com.oracle.graal.python.nodes.ErrorMessages.S_OUT_PARAMETER_MUST_BE_PASSED_AS_DEFAULT_VALUE; import static com.oracle.graal.python.nodes.ErrorMessages.THE_ERRCHECK_ATTRIBUTE_MUST_BE_CALLABLE; import static com.oracle.graal.python.nodes.ErrorMessages.THE_HANDLE_ATTRIBUTE_OF_THE_SECOND_ARGUMENT_MUST_BE_AN_INTEGER; import static com.oracle.graal.python.nodes.ErrorMessages.THIS_FUNCTION_TAKES_AT_LEAST_D_ARGUMENT_S_D_GIVEN; import static com.oracle.graal.python.nodes.ErrorMessages.THIS_FUNCTION_TAKES_D_ARGUMENT_S_D_GIVEN; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.nodes.StringLiterals.J_NFI_LANGUAGE; import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; @@ -84,8 +81,10 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -134,7 +133,7 @@ import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; @@ -181,7 +180,8 @@ public void postInitialize(Python3Core core) { * object (with an integer handle)), paramflags "is|..." - vtable index, method name, creates * callable calling COM vtbl */ - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory protected abstract static class PyCFuncPtrNewNode extends PythonBuiltinNode { @@ -198,7 +198,7 @@ static Object simple(Object type, @SuppressWarnings("unused") Object[] args, @Su @Bind("this") Node inliningTarget, @Exclusive @Cached PyTypeStgDictNode pyTypeStgDictNode, @Exclusive @Cached CtypesNodes.GenericPyCDataNewNode pyCDataNewNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { StgDictObject dict = pyTypeStgDictNode.checkAbstractClass(inliningTarget, type, raiseNode); return pyCDataNewNode.execute(inliningTarget, type, dict); } @@ -217,7 +217,7 @@ static Object usingNativePointer(Object type, Object[] args, @SuppressWarnings(" @Exclusive @Cached PointerNodes.WritePointerNode writePointerNode, @Exclusive @Cached PyTypeStgDictNode pyTypeStgDictNode, @Exclusive @Cached CtypesNodes.GenericPyCDataNewNode pyCDataNewNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { StgDictObject dict = pyTypeStgDictNode.checkAbstractClass(inliningTarget, type, raiseNode); CDataObject cdata = pyCDataNewNode.execute(inliningTarget, type, dict); Pointer value = pointerFromLongNode.execute(inliningTarget, args[0]); @@ -234,15 +234,15 @@ static Object callback(VirtualFrame frame, Object type, Object[] args, @Suppress @Cached PyCallableCheckNode callableCheck, @Exclusive @Cached PyTypeStgDictNode pyTypeStgDictNode, @Exclusive @Cached CtypesNodes.GenericPyCDataNewNode pyCDataNewNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { Object callable = args[0]; if (!callableCheck.execute(inliningTarget, callable)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ARGUMENT_MUST_BE_CALLABLE_OR_INTEGER_FUNCTION_ADDRESS); + throw raiseNode.raise(inliningTarget, TypeError, ARGUMENT_MUST_BE_CALLABLE_OR_INTEGER_FUNCTION_ADDRESS); } StgDictObject dict = pyTypeStgDictNode.checkAbstractClass(inliningTarget, type, raiseNode); if (dict == null || dict.argtypes == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, CANNOT_CONSTRUCT_INSTANCE_OF_THIS_CLASS_NO_ARGTYPES); + throw raiseNode.raise(inliningTarget, TypeError, CANNOT_CONSTRUCT_INSTANCE_OF_THIS_CLASS_NO_ARGTYPES); } CThunkObject thunk = _ctypes_alloc_callback(inliningTarget, callable, dict.argtypes, dict.restype, dict.flags); PyCFuncPtrObject self = (PyCFuncPtrObject) pyCDataNewNode.execute(inliningTarget, type, dict); @@ -255,14 +255,13 @@ static Object callback(VirtualFrame frame, Object type, Object[] args, @Suppress @Specialization(guards = {"args.length > 1", "!isPTuple(args)", "isLong(this, args, longCheckNode)"}, limit = "1") static Object error(@SuppressWarnings("unused") Object type, @SuppressWarnings("unused") Object[] args, @SuppressWarnings("unused") PKeyword[] kwds, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Exclusive @Cached PyLongCheckNode longCheckNode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ARGUMENT_MUST_BE_CALLABLE_OR_INTEGER_FUNCTION_ADDRESS); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ARGUMENT_MUST_BE_CALLABLE_OR_INTEGER_FUNCTION_ADDRESS); } static CThunkObject CThunkObjectNew(int nArgs) { - CThunkObject p = PythonObjectFactory.getUncached().createCThunkObject(PythonBuiltinClassType.CThunkObject, nArgs); + CThunkObject p = PFactory.createCThunkObject(PythonLanguage.get(null), nArgs); p.pcl_write = null; p.pcl_exec = null; @@ -310,7 +309,7 @@ static CThunkObject _ctypes_alloc_callback(Node raisingNode, Object callable, Ob } else { StgDictObject dict = PyTypeStgDictNode.executeUncached(restype); if (dict == null || dict.setfunc == FieldSet.nil) { - throw PRaiseNode.raiseUncached(raisingNode, TypeError, INVALID_RESULT_TYPE_FOR_CALLBACK_FUNCTION); + throw PRaiseNode.raiseStatic(raisingNode, TypeError, INVALID_RESULT_TYPE_FOR_CALLBACK_FUNCTION); } thunk.setfunc = dict.setfunc; thunk.ffi_restype = dict.ffi_type_pointer; @@ -355,9 +354,9 @@ Object PyCFuncPtr_get_errcheck(PyCFuncPtrObject self, @SuppressWarnings("unused" static Object PyCFuncPtr_set_errcheck(PyCFuncPtrObject self, Object value, @Bind("this") Node inliningTarget, @Cached PyCallableCheckNode callableCheck, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (value != PNone.NONE && !callableCheck.execute(inliningTarget, value)) { - throw raiseNode.get(inliningTarget).raise(TypeError, THE_ERRCHECK_ATTRIBUTE_MUST_BE_CALLABLE); + throw raiseNode.raise(inliningTarget, TypeError, THE_ERRCHECK_ATTRIBUTE_MUST_BE_CALLABLE); } self.errcheck = value; return PNone.NONE; @@ -391,14 +390,14 @@ static Object PyCFuncPtr_set_restype(VirtualFrame frame, PyCFuncPtrObject self, @Cached PyObjectLookupAttr lookupAttr, @Cached PyTypeStgDictNode pyTypeStgDictNode, @Cached PyCallableCheckNode callableCheck, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (value == PNone.NONE) { self.checker = null; self.restype = null; return PNone.NONE; } if (pyTypeStgDictNode.execute(inliningTarget, value) == null && !callableCheck.execute(inliningTarget, value)) { - throw raiseNode.get(inliningTarget).raise(TypeError, RESTYPE_MUST_BE_A_TYPE_A_CALLABLE_OR_NONE); + throw raiseNode.raise(inliningTarget, TypeError, RESTYPE_MUST_BE_A_TYPE_A_CALLABLE_OR_NONE); } if (!PGuards.isPFunction(value)) { Object checker = lookupAttr.execute(frame, inliningTarget, value, T__CHECK_RETVAL_); @@ -415,19 +414,19 @@ protected abstract static class PointerArgTypesNode extends PythonBinaryBuiltinN @Specialization(guards = {"isNoValue(value)", "self.argtypes != null"}) static Object PyCFuncPtr_get_argtypes(PyCFuncPtrObject self, @SuppressWarnings("unused") PNone value, - @Shared @Cached PythonObjectFactory factory) { - return factory.createTuple(self.argtypes); + @Bind PythonLanguage language) { + return PFactory.createTuple(language, self.argtypes); } @Specialization(guards = {"isNoValue(value)", "self.argtypes == null"}) static Object PyCFuncPtr_get_argtypes(PyCFuncPtrObject self, @SuppressWarnings("unused") PNone value, @Bind("this") Node inliningTarget, @Cached PyObjectStgDictNode pyObjectStgDictNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { StgDictObject dict = pyObjectStgDictNode.execute(inliningTarget, self); assert dict != null : "Cannot be NULL for PyCFuncPtrObject instances"; if (dict.argtypes != null) { - return factory.createTuple(dict.argtypes); + return PFactory.createTuple(language, dict.argtypes); } else { return PNone.NONE; } @@ -445,7 +444,7 @@ static Object PyCFuncPtr_set_argtypes(VirtualFrame frame, PyCFuncPtrObject self, @Bind("this") Node inliningTarget, @Shared @Cached PyObjectLookupAttr lookupAttr, @Shared @Cached GetInternalObjectArrayNode getArray, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { SequenceStorage storage = value.getSequenceStorage(); Object[] ob = getArray.execute(inliningTarget, value.getSequenceStorage()); self.converters = converters_from_argtypes(frame, inliningTarget, ob, storage.length(), raiseNode, lookupAttr); @@ -458,7 +457,7 @@ static Object PyCFuncPtr_set_argtypes(VirtualFrame frame, PyCFuncPtrObject self, @Bind("this") Node inliningTarget, @Shared @Cached PyObjectLookupAttr lookupAttr, @Shared @Cached GetInternalObjectArrayNode getArray, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { SequenceStorage storage = value.getSequenceStorage(); Object[] ob = getArray.execute(inliningTarget, value.getSequenceStorage()); self.converters = converters_from_argtypes(frame, inliningTarget, ob, storage.length(), raiseNode, lookupAttr); @@ -468,13 +467,13 @@ static Object PyCFuncPtr_set_argtypes(VirtualFrame frame, PyCFuncPtrObject self, @Fallback static Object error(@SuppressWarnings("unused") Object self, @SuppressWarnings("unused") Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ARGTYPES_MUST_BE_A_SEQUENCE_OF_TYPES); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ARGTYPES_MUST_BE_A_SEQUENCE_OF_TYPES); } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @@ -490,7 +489,8 @@ TruffleString PyCFuncPtr_repr(CDataObject self, } } - @Builtin(name = J___CALL__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_call, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory protected abstract static class PyCFuncPtrCallNode extends PythonVarargsBuiltinNode { @@ -504,12 +504,12 @@ Object PyCFuncPtr_call(VirtualFrame frame, PyCFuncPtrObject self, Object[] inarg @Cached CastToJavaIntExactNode castToJavaIntExactNode, @Cached CastToTruffleStringNode castToTruffleStringNode, @Cached PyTypeStgDictNode pyTypeStgDictNode, - @Cached GetNameNode getNameNode, @Cached PyObjectCallMethodObjArgs callMethodObjArgs, @Cached CallProcNode callProcNode, @Cached TruffleString.EqualNode equalNode, @Cached PointerNodes.ReadPointerNode readPointerNode, - @Cached CtypesNodes.HandleFromPointerNode handleFromPointerNode) { + @Cached CtypesNodes.HandleFromPointerNode handleFromPointerNode, + @Cached PRaiseNode raiseNode) { StgDictObject dict = pyObjectStgDictNode.execute(inliningTarget, self); assert dict != null : "Cannot be NULL for PyCFuncPtrObject instances"; Object restype = self.restype != null ? self.restype : dict.restype; @@ -527,10 +527,10 @@ Object PyCFuncPtr_call(VirtualFrame frame, PyCFuncPtrObject self, Object[] inarg * TODO this happens in a numpy tests that use structs with function pointers: * numpy/core/tests/test_ufunc.py::TestLowlevelAPIAccess::test_loop_access */ - throw PRaiseNode.raiseUncached(inliningTarget, NotImplementedError, ErrorMessages.CTYPES_FUNCTION_CALL_COULD_NOT_OBTAIN_FUNCTION_POINTER); + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, ErrorMessages.CTYPES_FUNCTION_CALL_COULD_NOT_OBTAIN_FUNCTION_POINTER); } Object[] callargs = _build_callargs(frame, inliningTarget, self, argtypes, inargs, kwds, props, - pyTypeCheck, getArray, castToJavaIntExactNode, castToTruffleStringNode, pyTypeStgDictNode, callNode, getNameNode, equalNode); + pyTypeCheck, getArray, castToJavaIntExactNode, castToTruffleStringNode, pyTypeStgDictNode, callNode, equalNode, raiseNode); int inoutmask = props[pinoutmask_idx]; int outmask = props[poutmask_idx]; int numretvals = props[pnumretvals_idx]; @@ -545,11 +545,11 @@ Object PyCFuncPtr_call(VirtualFrame frame, PyCFuncPtrObject self, Object[] inarg * argtypes tuple. */ if (required > actual) { - throw raise(TypeError, THIS_FUNCTION_TAKES_AT_LEAST_D_ARGUMENT_S_D_GIVEN, + throw raiseNode.raise(inliningTarget, TypeError, THIS_FUNCTION_TAKES_AT_LEAST_D_ARGUMENT_S_D_GIVEN, required, required == 1 ? "" : "s", actual); } } else if (required != actual) { - throw raise(TypeError, THIS_FUNCTION_TAKES_D_ARGUMENT_S_D_GIVEN, + throw raiseNode.raise(inliningTarget, TypeError, THIS_FUNCTION_TAKES_D_ARGUMENT_S_D_GIVEN, required, required == 1 ? "" : "s", actual); } } @@ -575,7 +575,7 @@ Object PyCFuncPtr_call(VirtualFrame frame, PyCFuncPtrObject self, Object[] inarg return _build_result(frame, inliningTarget, result, callargs, outmask, inoutmask, numretvals, callMethodObjArgs); } - protected Object _get_arg(int[] pindex, TruffleString name, Object defval, Object[] inargs, PKeyword[] kwds, TruffleString.EqualNode equalNode) { + protected Object _get_arg(Node inliningTarget, int[] pindex, TruffleString name, Object defval, Object[] inargs, PKeyword[] kwds, TruffleString.EqualNode equalNode, PRaiseNode raiseNode) { if (pindex[0] < inargs.length) { return inargs[pindex[0]++]; } @@ -591,9 +591,9 @@ protected Object _get_arg(int[] pindex, TruffleString name, Object defval, Objec } /* we can't currently emit a better error message */ if (name != null) { - throw raise(TypeError, REQUIRED_ARGUMENT_S_MISSING, name); + throw raiseNode.raise(inliningTarget, TypeError, REQUIRED_ARGUMENT_S_MISSING, name); } else { - throw raise(TypeError, NOT_ENOUGH_ARGUMENTS); + throw raiseNode.raise(inliningTarget, TypeError, NOT_ENOUGH_ARGUMENTS); } } @@ -625,8 +625,7 @@ Object[] _build_callargs(VirtualFrame frame, Node inliningTarget, PyCFuncPtrObje CastToTruffleStringNode castToTruffleStringNode, PyTypeStgDictNode pyTypeStgDictNode, CallNode callNode, - GetNameNode getNameNode, - TruffleString.EqualNode equalNode) { + TruffleString.EqualNode equalNode, PRaiseNode raiseNode) { /* * It's a little bit difficult to determine how many arguments the function call * requires/accepts. For simplicity, we count the consumed args and compare this to the @@ -675,7 +674,7 @@ Object[] _build_callargs(VirtualFrame frame, Node inliningTarget, PyCFuncPtrObje case 0: case PARAMFLAG_FIN: /* 'in' parameter. Copy it from inargs. */ - ob = _get_arg(inargs_index, name, defval, inargs, kwds, equalNode); + ob = _get_arg(inliningTarget, inargs_index, name, defval, inargs, kwds, equalNode, raiseNode); callargs[i] = ob; break; case PARAMFLAG_FOUT: @@ -701,10 +700,10 @@ Object[] _build_callargs(VirtualFrame frame, Node inliningTarget, PyCFuncPtrObje /* * Cannot happen: _validate_paramflags() would not accept such an object */ - throw raise(RuntimeError, NULL_STGDICT_UNEXPECTED); + throw raiseNode.raise(inliningTarget, RuntimeError, NULL_STGDICT_UNEXPECTED); } if (PGuards.isString(dict.proto)) { // TODO Py_TPFLAGS_UNICODE_SUBCLASS - throw raise(TypeError, S_OUT_PARAMETER_MUST_BE_PASSED_AS_DEFAULT_VALUE, getNameNode.execute(inliningTarget, ob)); + throw raiseNode.raise(inliningTarget, TypeError, N_OUT_PARAMETER_MUST_BE_PASSED_AS_DEFAULT_VALUE, ob); } if (pyTypeCheck.isPyCArrayTypeObject(inliningTarget, ob)) { ob = callNode.execute(frame, ob); @@ -721,7 +720,7 @@ Object[] _build_callargs(VirtualFrame frame, Node inliningTarget, PyCFuncPtrObje props[pnumretvals_idx]++; break; default: - throw raise(ValueError, PARAMFLAG_D_NOT_YET_IMPLEMENTED, flag); + throw raiseNode.raise(inliningTarget, ValueError, PARAMFLAG_D_NOT_YET_IMPLEMENTED, flag); } } @@ -737,7 +736,7 @@ Object[] _build_callargs(VirtualFrame frame, Node inliningTarget, PyCFuncPtrObje * When we have default values or named parameters, this error message is * misleading. See unittests/test_paramflags.py */ - throw raise(TypeError, CALL_TAKES_EXACTLY_D_ARGUMENTS_D_GIVEN, inargs_index, actual_args); + throw raiseNode.raise(inliningTarget, TypeError, CALL_TAKES_EXACTLY_D_ARGUMENTS_D_GIVEN, inargs_index, actual_args); } /* @@ -821,7 +820,7 @@ static Object PyCFuncPtr_FromDll(VirtualFrame frame, Object type, Object[] args, @Cached CtypesNodes.GenericPyCDataNewNode pyCDataNewNode, @Cached AuditNode auditNode, @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { // PyArg_ParseTuple(args, "O|O", &tuple, ¶mflags); PTuple tuple = (PTuple) args[0]; Object[] paramflags = null; @@ -837,13 +836,13 @@ static Object PyCFuncPtr_FromDll(VirtualFrame frame, Object type, Object[] args, Object obj = getAttributeNode.execute(frame, inliningTarget, dll, T__HANDLE); if (!longCheckNode.execute(inliningTarget, obj)) { // PyLong_Check - throw raiseNode.get(inliningTarget).raise(TypeError, THE_HANDLE_ATTRIBUTE_OF_THE_SECOND_ARGUMENT_MUST_BE_AN_INTEGER); + throw raiseNode.raise(inliningTarget, TypeError, THE_HANDLE_ATTRIBUTE_OF_THE_SECOND_ARGUMENT_MUST_BE_AN_INTEGER); } Pointer handlePtr; try { handlePtr = pointerFromLongNode.execute(inliningTarget, obj); } catch (PException e) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.COULD_NOT_CONVERT_THE_HANDLE_ATTRIBUTE_TO_A_POINTER); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.COULD_NOT_CONVERT_THE_HANDLE_ATTRIBUTE_TO_A_POINTER); } Object address = dlSymNode.execute(frame, handlePtr, name, AttributeError); _validate_paramflags(inliningTarget, type, paramflags, pyTypeCheck, getArray, pyTypeStgDictNode, codePointAtIndexNode, raiseNode); @@ -866,7 +865,7 @@ static void _validate_paramflags(Node inliningTarget, Object type, Object[] para GetInternalObjectArrayNode getArray, PyTypeStgDictNode pyTypeStgDictNode, TruffleString.CodePointAtIndexNode codePointAtIndexNode, - PRaiseNode.Lazy raiseNode) { + PRaiseNode raiseNode) { StgDictObject dict = pyTypeStgDictNode.checkAbstractClass(inliningTarget, type, raiseNode); Object[] argtypes = dict.argtypes; @@ -875,12 +874,12 @@ static void _validate_paramflags(Node inliningTarget, Object type, Object[] para } if (!PGuards.isPTuple(paramflags)) { - throw raiseNode.get(inliningTarget).raise(TypeError, PARAMFLAGS_MUST_BE_A_TUPLE_OR_NONE); + throw raiseNode.raise(inliningTarget, TypeError, PARAMFLAGS_MUST_BE_A_TUPLE_OR_NONE); } int len = paramflags.length; if (len != dict.argtypes.length) { - throw raiseNode.get(inliningTarget).raise(ValueError, PARAMFLAGS_MUST_HAVE_THE_SAME_LENGTH_AS_ARGTYPES); + throw raiseNode.raise(inliningTarget, ValueError, PARAMFLAGS_MUST_HAVE_THE_SAME_LENGTH_AS_ARGTYPES); } for (int i = 0; i < len; ++i) { @@ -890,7 +889,7 @@ static void _validate_paramflags(Node inliningTarget, Object type, Object[] para int flag = (int) array[0]; if (array.length > 1) { if (!PGuards.isString(array[1])) { - throw raiseNode.get(inliningTarget).raise(TypeError, PARAMFLAGS_MUST_BE_A_SEQUENCE_OF_INT_STRING_VALUE_TUPLES); + throw raiseNode.raise(inliningTarget, TypeError, PARAMFLAGS_MUST_BE_A_SEQUENCE_OF_INT_STRING_VALUE_TUPLES); } } Object typ = argtypes[i]; @@ -904,7 +903,7 @@ static void _validate_paramflags(Node inliningTarget, Object type, Object[] para _check_outarg_type(inliningTarget, typ, i + 1, pyTypeCheck, pyTypeStgDictNode, codePointAtIndexNode, raiseNode); break; default: - throw raiseNode.get(inliningTarget).raise(TypeError, PARAMFLAG_VALUE_D_NOT_SUPPORTED, flag); + throw raiseNode.raise(inliningTarget, TypeError, PARAMFLAG_VALUE_D_NOT_SUPPORTED, flag); } } } @@ -914,7 +913,7 @@ static void _check_outarg_type(Node inliningTarget, Object arg, int index, PyTypeCheck pyTypeCheck, PyTypeStgDictNode pyTypeStgDictNode, TruffleString.CodePointAtIndexNode codePointAtIndexNode, - PRaiseNode.Lazy raiseNode) { + PRaiseNode raiseNode) { if (pyTypeCheck.isPyCPointerTypeObject(inliningTarget, arg)) { return; } @@ -934,7 +933,7 @@ && strchr(PzZ, codePointAtIndexNode.execute((TruffleString) dict.proto, 0, TS_EN return; } - throw raiseNode.get(inliningTarget).raise(TypeError, OUT_PARAMETER_D_MUST_BE_A_POINTER_TYPE_NOT_S, index, GetNameNode.executeUncached(arg)); + throw raiseNode.raise(inliningTarget, TypeError, OUT_PARAMETER_D_MUST_BE_A_POINTER_TYPE_NOT_N, index, arg); } protected static boolean strchr(char[] chars, int code) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCFuncPtrTypeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCFuncPtrTypeBuiltins.java index b0e2a51ef0..4e6e997408 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCFuncPtrTypeBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCFuncPtrTypeBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,17 +46,18 @@ import static com.oracle.graal.python.nodes.ErrorMessages.CLASS_MUST_DEFINE_FLAGS_WHICH_MUST_BE_AN_INTEGER; import static com.oracle.graal.python.nodes.ErrorMessages.ITEM_D_IN_ARGTYPES_HAS_NO_FROM_PARAM_METHOD; import static com.oracle.graal.python.nodes.ErrorMessages.RESTYPE_MUST_BE_A_TYPE_A_CALLABLE_OR_NONE1; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.util.List; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.TypeNode; import com.oracle.graal.python.builtins.modules.ctypes.FFIType.FieldDesc; import com.oracle.graal.python.builtins.modules.ctypes.FFIType.FieldSet; import com.oracle.graal.python.builtins.modules.ctypes.StgDictBuiltins.PyTypeStgDictNode; @@ -68,6 +69,8 @@ import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeBuiltins.TypeNode; import com.oracle.graal.python.lib.PyCallableCheckNode; import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.nodes.PGuards; @@ -77,7 +80,7 @@ import com.oracle.graal.python.nodes.object.GetDictIfExistsNode; import com.oracle.graal.python.nodes.object.SetDictNode; import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -92,6 +95,8 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PyCFuncPtrType) public final class PyCFuncPtrTypeBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = PyCFuncPtrTypeBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return PyCFuncPtrTypeBuiltinsFactory.getFactories(); @@ -110,7 +115,8 @@ protected List> getNodeFa private static final TruffleString T_X_BRACES = tsLiteral("X{}"); @ImportStatic(PyCPointerTypeBuiltins.class) - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory protected abstract static class PyCFuncPtrTypeNewNode extends PythonBuiltinNode { @@ -127,9 +133,9 @@ static Object PyCFuncPtrType_new(VirtualFrame frame, Object type, Object[] args, @Cached PyCallableCheckNode callableCheck, @Cached HashingStorageGetItem getItem, @Cached HashingStorageAddAllToOther addAllToOtherNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - StgDictObject stgdict = factory.createStgDictObject(PythonBuiltinClassType.StgDict); + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { + StgDictObject stgdict = PFactory.createStgDictObject(language); stgdict.paramfunc = CArgObjectBuiltins.PyCFuncPtrTypeParamFunc; /* @@ -147,7 +153,7 @@ static Object PyCFuncPtrType_new(VirtualFrame frame, Object type, Object[] args, /* replace the class dict by our updated storage dict */ PDict resDict = getDict.execute(result); if (resDict == null) { - resDict = factory.createDictFixedStorage((PythonObject) result); + resDict = PFactory.createDictFixedStorage(language, (PythonObject) result); } addAllToOtherNode.execute(frame, inliningTarget, resDict.getDictStorage(), stgdict); setDict.execute(inliningTarget, result, stgdict); @@ -159,7 +165,7 @@ static Object PyCFuncPtrType_new(VirtualFrame frame, Object type, Object[] args, Object ob = getItem.execute(inliningTarget, stgdict.getDictStorage(), T_FLAGS_); if (!PGuards.isInteger(ob)) { - throw raiseNode.get(inliningTarget).raise(TypeError, CLASS_MUST_DEFINE_FLAGS_WHICH_MUST_BE_AN_INTEGER); + throw raiseNode.raise(inliningTarget, TypeError, CLASS_MUST_DEFINE_FLAGS_WHICH_MUST_BE_AN_INTEGER); } stgdict.flags = asNumber.execute(inliningTarget, ob) | TYPEFLAG_ISPOINTER; @@ -167,7 +173,7 @@ static Object PyCFuncPtrType_new(VirtualFrame frame, Object type, Object[] args, ob = getItem.execute(inliningTarget, stgdict.getDictStorage(), T_ARGTYPES_); if (ob != null) { if (!PGuards.isPTuple(ob)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ARGTYPES_MUST_BE_A_SEQUENCE_OF_TYPES); + throw raiseNode.raise(inliningTarget, TypeError, ARGTYPES_MUST_BE_A_SEQUENCE_OF_TYPES); } SequenceStorage storage = ((PTuple) ob).getSequenceStorage(); Object[] obtuple = getArray.execute(inliningTarget, storage); @@ -180,7 +186,7 @@ static Object PyCFuncPtrType_new(VirtualFrame frame, Object type, Object[] args, if (!PGuards.isPNone(ob)) { StgDictObject dict = pyTypeStgDictNode.execute(inliningTarget, ob); if (dict == null && !callableCheck.execute(inliningTarget, ob)) { - throw raiseNode.get(inliningTarget).raise(TypeError, RESTYPE_MUST_BE_A_TYPE_A_CALLABLE_OR_NONE1); + throw raiseNode.raise(inliningTarget, TypeError, RESTYPE_MUST_BE_A_TYPE_A_CALLABLE_OR_NONE1); } stgdict.restype = ob; Object checker = lookupAttr.execute(frame, inliningTarget, ob, T__CHECK_RETVAL_); @@ -191,7 +197,7 @@ static Object PyCFuncPtrType_new(VirtualFrame frame, Object type, Object[] args, } static Object[] converters_from_argtypes(VirtualFrame frame, Node inliningTarget, Object[] args, int nArgs, - PRaiseNode.Lazy raiseNode, + PRaiseNode raiseNode, PyObjectLookupAttr lookupAttr) { Object[] converters = new Object[nArgs]; @@ -201,7 +207,7 @@ static Object[] converters_from_argtypes(VirtualFrame frame, Node inliningTarget cnv = lookupAttr.execute(frame, inliningTarget, tp, T_FROM_PARAM); if (cnv == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(TypeError, ITEM_D_IN_ARGTYPES_HAS_NO_FROM_PARAM_METHOD, i + 1); + throw raiseNode.raise(inliningTarget, TypeError, ITEM_D_IN_ARGTYPES_HAS_NO_FROM_PARAM_METHOD, i + 1); } converters[i] = cnv; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCPointerBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCPointerBuiltins.java index 0de13dfaf3..4e8546fb23 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCPointerBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCPointerBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -51,9 +51,6 @@ import static com.oracle.graal.python.nodes.ErrorMessages.SLICE_START_IS_REQUIRED_FOR_STEP_0; import static com.oracle.graal.python.nodes.ErrorMessages.SLICE_STEP_CANNOT_BE_ZERO; import static com.oracle.graal.python.nodes.ErrorMessages.SLICE_STOP_IS_REQUIRED; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETITEM__; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; import static com.oracle.graal.python.runtime.exception.PythonErrorType.IndexError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; @@ -62,8 +59,10 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -87,15 +86,15 @@ import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.MpSubscriptBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.NbBoolBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqItemBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqAssItem.SqAssItemBuiltinNode; import com.oracle.graal.python.lib.PyIndexCheckNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.PRaiseNode.Lazy; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -133,15 +132,15 @@ abstract static class PointerSetContentsNode extends Node { @Specialization static void set(VirtualFrame frame, Node inliningTarget, CDataObject self, Object value, + @Bind PythonLanguage language, @Cached PyTypeCheck pyTypeCheck, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached PyObjectStgDictNode pyObjectStgDictNode, @Cached(inline = false) IsInstanceNode isInstanceNode, @Cached KeepRefNode keepRefNode, - @Cached PointerNodes.WritePointerNode writePointerNode, - @Cached(inline = false) PythonObjectFactory factory) { + @Cached PointerNodes.WritePointerNode writePointerNode) { if (value == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, POINTER_DOES_NOT_SUPPORT_ITEM_DELETION); + throw raiseNode.raise(inliningTarget, TypeError, POINTER_DOES_NOT_SUPPORT_ITEM_DELETION); } StgDictObject stgdict = pyObjectStgDictNode.execute(inliningTarget, self); assert stgdict != null : "Cannot be NULL for pointer instances"; @@ -149,7 +148,7 @@ static void set(VirtualFrame frame, Node inliningTarget, CDataObject self, Objec if (!pyTypeCheck.isCDataObject(inliningTarget, value)) { boolean res = isInstanceNode.executeWith(frame, value, stgdict.proto); if (!res) { - raiseNode.get(inliningTarget).raise(TypeError, EXPECTED_N_INSTEAD_OF_P, stgdict.proto, value); + raiseNode.raise(inliningTarget, TypeError, EXPECTED_N_INSTEAD_OF_P, stgdict.proto, value); } } @@ -163,12 +162,13 @@ static void set(VirtualFrame frame, Node inliningTarget, CDataObject self, Objec */ keepRefNode.execute(frame, inliningTarget, self, 1, value); - Object keep = GetKeepedObjects(dst, factory); + Object keep = GetKeepedObjects(dst, language); keepRefNode.execute(frame, inliningTarget, self, 0, keep); } } - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory protected abstract static class NewNode extends PythonBuiltinNode { @Specialization @@ -176,18 +176,19 @@ static Object Pointer_new(Object type, @SuppressWarnings("unused") Object[] args @Bind("this") Node inliningTarget, @Cached PyTypeStgDictNode pyTypeStgDictNode, @Cached CtypesNodes.GenericPyCDataNewNode pyCDataNewNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { StgDictObject dict = pyTypeStgDictNode.checkAbstractClass(inliningTarget, type, raiseNode); if (dict.proto == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, CANNOT_CREATE_INSTANCE_HAS_NO_TYPE); + throw raiseNode.raise(inliningTarget, TypeError, CANNOT_CREATE_INSTANCE_HAS_NO_TYPE); } return pyCDataNewNode.execute(inliningTarget, type, dict); } } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory - protected abstract static class InitNode extends PythonBuiltinNode { + protected abstract static class InitNode extends PythonVarargsBuiltinNode { @Specialization static Object Pointer_init(VirtualFrame frame, CDataObject self, Object[] args, @SuppressWarnings("unused") PKeyword[] kwds, @@ -210,9 +211,9 @@ static Object get_contents(CDataObject self, @SuppressWarnings("unused") PNone v @Cached PyObjectStgDictNode pyObjectStgDictNode, @Cached CtypesNodes.PyCDataFromBaseObjNode fromBaseObjNode, @Cached PointerNodes.ReadPointerNode readPointerNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (self.b_ptr.isNull()) { - throw raiseNode.get(inliningTarget).raise(ValueError, NULL_POINTER_ACCESS); + throw raiseNode.raise(inliningTarget, ValueError, NULL_POINTER_ACCESS); } StgDictObject stgdict = pyObjectStgDictNode.execute(inliningTarget, self); @@ -242,24 +243,24 @@ boolean Pointer_bool(CDataObject self) { } } - @Builtin(name = J___SETITEM__, minNumOfPositionalArgs = 3) + @Slot(value = SlotKind.sq_ass_item, isComplex = true) @GenerateNodeFactory - abstract static class PointerSetItemNode extends PythonTernaryBuiltinNode { + abstract static class PointerSetItemNode extends SqAssItemBuiltinNode { @Specialization - static Object Pointer_ass_item(VirtualFrame frame, CDataObject self, int index, Object value, + static void Pointer_ass_item(VirtualFrame frame, CDataObject self, int index, Object value, @Bind("this") Node inliningTarget, @Cached PyCDataSetNode pyCDataSetNode, @Cached PyObjectStgDictNode pyObjectStgDictNode, @Cached PyTypeStgDictNode pyTypeStgDictNode, @Cached PointerNodes.ReadPointerNode readPointerNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (value == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(TypeError, POINTER_DOES_NOT_SUPPORT_ITEM_DELETION); + throw raiseNode.raise(inliningTarget, TypeError, POINTER_DOES_NOT_SUPPORT_ITEM_DELETION); } if (self.b_ptr.isNull()) { - throw raiseNode.get(inliningTarget).raise(ValueError, NULL_POINTER_ACCESS); + throw raiseNode.raise(inliningTarget, ValueError, NULL_POINTER_ACCESS); } StgDictObject stgdict = pyObjectStgDictNode.execute(inliningTarget, self); @@ -275,7 +276,6 @@ static Object Pointer_ass_item(VirtualFrame frame, CDataObject self, int index, int offset = index * itemdict.size; pyCDataSetNode.execute(frame, self, proto, stgdict.setfunc, value, index, size, readPointerNode.execute(inliningTarget, self.b_ptr).withOffset(offset)); - return PNone.NONE; } } @@ -290,7 +290,7 @@ static Object Pointer_item(CDataObject self, int index, @Exclusive @Cached PyTypeStgDictNode pyTypeStgDictNode, @Exclusive @Cached PyObjectStgDictNode pyObjectStgDictNode, @Exclusive @Cached PointerNodes.ReadPointerNode readPointerNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (self.b_ptr.isNull()) { raiseNullPtr(inliningTarget, raiseNode); } @@ -310,8 +310,8 @@ static Object Pointer_item(CDataObject self, int index, } @InliningCutoff - private static void raiseNullPtr(Node inliningTarget, Lazy raiseNode) { - throw raiseNode.get(inliningTarget).raise(ValueError, NULL_POINTER_ACCESS); + private static void raiseNullPtr(Node inliningTarget, PRaiseNode raiseNode) { + throw raiseNode.raise(inliningTarget, ValueError, NULL_POINTER_ACCESS); } } @@ -326,7 +326,7 @@ static Object doInt(CDataObject self, int index, @Exclusive @Cached PyTypeStgDictNode pyTypeStgDictNode, @Exclusive @Cached PyObjectStgDictNode pyObjectStgDictNode, @Exclusive @Cached PointerNodes.ReadPointerNode readPointerNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { return PointerGetItemNode.Pointer_item(self, index, inliningTarget, pyCDataGetNode, pyTypeStgDictNode, pyObjectStgDictNode, readPointerNode, raiseNode); } @@ -334,6 +334,7 @@ static Object doInt(CDataObject self, int index, @Specialization(limit = "1") static Object doSubscript(VirtualFrame frame, CDataObject self, PSlice slice, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @CachedLibrary("self") PythonBufferAccessLibrary bufferLib, @Exclusive @Cached PyCDataGetNode pyCDataGetNode, @Exclusive @Cached PyObjectStgDictNode pyObjectStgDictNode, @@ -342,8 +343,7 @@ static Object doSubscript(VirtualFrame frame, CDataObject self, PSlice slice, @Exclusive @Cached PyNumberAsSizeNode asSizeNode, @Cached TruffleString.FromByteArrayNode fromByteArrayNode, @Cached TruffleString.SwitchEncodingNode switchEncodingNode, - @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { /* * Since pointers have no length, and we want to apply different semantics to negative * indices than normal slicing, we have to dissect the slice object ourselves. @@ -354,19 +354,19 @@ static Object doSubscript(VirtualFrame frame, CDataObject self, PSlice slice, } else { step = asSizeNode.executeExact(frame, inliningTarget, slice.getStep(), ValueError); if (step == 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, SLICE_STEP_CANNOT_BE_ZERO); + throw raiseNode.raise(inliningTarget, ValueError, SLICE_STEP_CANNOT_BE_ZERO); } } if (slice.getStart() == PNone.NONE) { if (step < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, SLICE_START_IS_REQUIRED_FOR_STEP_0); + throw raiseNode.raise(inliningTarget, ValueError, SLICE_START_IS_REQUIRED_FOR_STEP_0); } start = 0; } else { start = asSizeNode.executeExact(frame, inliningTarget, slice.getStart(), ValueError); } if (slice.getStop() == PNone.NONE) { - throw raiseNode.get(inliningTarget).raise(ValueError, SLICE_STOP_IS_REQUIRED); + throw raiseNode.raise(inliningTarget, ValueError, SLICE_STOP_IS_REQUIRED); } stop = asSizeNode.executeExact(frame, inliningTarget, slice.getStop(), ValueError); int len; @@ -389,16 +389,16 @@ static Object doSubscript(VirtualFrame frame, CDataObject self, PSlice slice, byte[] ptr = bufferLib.getInternalOrCopiedByteArray(self); if (len <= 0) { - return factory.createEmptyBytes(); + return PFactory.createEmptyBytes(language); } - if (step == 1) { - return factory.createBytes(ptr, start, len); + if (start == 0 && step == 1) { + return PFactory.createBytes(language, ptr, len); } byte[] dest = new byte[len]; for (int cur = start, i = 0; i < len; cur += step, i++) { dest[i] = ptr[cur]; } - return factory.createBytes(dest); + return PFactory.createBytes(language, dest); } if (itemdict.getfunc == FieldDesc.u.getfunc) { // CTYPES_UNICODE byte[] ptr = bufferLib.getInternalOrCopiedByteArray(self); @@ -421,7 +421,7 @@ static Object doSubscript(VirtualFrame frame, CDataObject self, PSlice slice, for (int cur = start, i = 0; i < len; cur += step, i++) { np[i] = PointerGetItemNode.Pointer_item(self, cur, inliningTarget, pyCDataGetNode, pyTypeStgDictNode, pyObjectStgDictNode, readPointerNode, raiseNode); } - return factory.createList(np); + return PFactory.createList(language, np); } @Specialization(guards = "!isPSlice(item)", replaces = "doInt") @@ -433,12 +433,12 @@ static Object doGeneric(VirtualFrame frame, CDataObject self, Object item, @Exclusive @Cached PointerNodes.ReadPointerNode readPointerNode, @Exclusive @Cached PyNumberAsSizeNode asSizeNode, @Cached PyIndexCheckNode indexCheckNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (indexCheckNode.execute(inliningTarget, item)) { int i = asSizeNode.executeExact(frame, inliningTarget, item, IndexError); return PointerGetItemNode.Pointer_item(self, i, inliningTarget, pyCDataGetNode, pyTypeStgDictNode, pyObjectStgDictNode, readPointerNode, raiseNode); } - throw raiseNode.get(inliningTarget).raise(TypeError, POINTER_INDICES_MUST_BE_INTEGER); + throw raiseNode.raise(inliningTarget, TypeError, POINTER_INDICES_MUST_BE_INTEGER); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCPointerTypeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCPointerTypeBuiltins.java index 7bfb019725..ce5b44704d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCPointerTypeBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCPointerTypeBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -49,17 +49,19 @@ import static com.oracle.graal.python.nodes.ErrorMessages.EXPECTED_CDATA_INSTANCE; import static com.oracle.graal.python.nodes.ErrorMessages.TYPE_MUST_BE_A_TYPE; import static com.oracle.graal.python.nodes.ErrorMessages.TYPE_MUST_HAVE_STORAGE_INFO; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; import static com.oracle.graal.python.nodes.StringLiterals.T_AMPERSAND; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.TypeNode; import com.oracle.graal.python.builtins.modules.BuiltinFunctions.IsInstanceNode; import com.oracle.graal.python.builtins.modules.BuiltinFunctions.IsSubClassNode; import com.oracle.graal.python.builtins.modules.ctypes.CDataTypeBuiltins.CDataTypeFromParamNode; @@ -75,6 +77,8 @@ import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.str.StringUtils; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeBuiltins.TypeNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; @@ -84,7 +88,7 @@ import com.oracle.graal.python.nodes.object.SetDictNode; import com.oracle.graal.python.nodes.util.CastToJavaBooleanNode; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -99,6 +103,8 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PyCPointerType) public final class PyCPointerTypeBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = PyCPointerTypeBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return PyCPointerTypeBuiltinsFactory.getFactories(); @@ -111,7 +117,8 @@ protected List> getNodeFa protected static final TruffleString T_UPPER_T_LEFTBRACE = tsLiteral("T{"); @ImportStatic(PyCPointerTypeBuiltins.class) - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory protected abstract static class PyCPointerTypeNewNode extends PythonBuiltinNode { @@ -128,13 +135,13 @@ static Object PyCPointerType_new(VirtualFrame frame, Object type, Object[] args, @Cached TruffleStringBuilder.AppendStringNode appendStringNode, @Cached TruffleStringBuilder.ToStringNode toStringNode, @Cached StringUtils.SimpleTruffleStringFormatNode formatNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { /* * stgdict items size, align, length contain info about pointers itself, stgdict.proto * has info about the pointed to type! */ - StgDictObject stgdict = factory.createStgDictObject(PythonBuiltinClassType.StgDict); + StgDictObject stgdict = PFactory.createStgDictObject(language); stgdict.size = StgDictObject.VOID_PTR_SIZE; stgdict.align = FieldDesc.P.pffi_type.alignment; stgdict.length = 1; @@ -168,7 +175,7 @@ static Object PyCPointerType_new(VirtualFrame frame, Object type, Object[] args, /* replace the class dict by our updated spam dict */ PDict resDict = getDict.execute(result); if (resDict == null) { - resDict = factory.createDictFixedStorage((PythonObject) result); + resDict = PFactory.createDictFixedStorage(language, (PythonObject) result); } addAllToOtherNode.execute(frame, inliningTarget, resDict.getDictStorage(), stgdict); setDict.execute(inliningTarget, result, stgdict); @@ -185,15 +192,14 @@ protected abstract static class FromParamNode extends PythonBinaryBuiltinNode { /* _byref consumes a refcount to its argument */ static PyCArgObject byref(Node inliningTarget, Object obj, PyTypeCheck pyTypeCheck, - PythonObjectFactory factory, - PRaiseNode.Lazy raiseNode) { + PRaiseNode raiseNode) { if (!pyTypeCheck.isCDataObject(inliningTarget, obj)) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, EXPECTED_CDATA_INSTANCE); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, EXPECTED_CDATA_INSTANCE); } CDataObject cdata = (CDataObject) obj; - PyCArgObject parg = factory.createCArgObject(); + PyCArgObject parg = PFactory.createCArgObject(PythonLanguage.get(inliningTarget)); parg.tag = 'P'; parg.pffi_type = ffi_type_pointer; parg.obj = cdata; @@ -217,15 +223,14 @@ static Object PyCPointerType_from_param(VirtualFrame frame, Object type, Object @Cached PyObjectStgDictNode pyObjectStgDictNode, @Cached PyTypeStgDictNode pyTypeStgDictNode, @Cached CDataTypeFromParamNode fromParamNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { StgDictObject typedict = pyTypeStgDictNode.checkAbstractClass(inliningTarget, type, raiseNode); /* * If we expect POINTER(), but receive a instance, accept it by calling * byref(). */ if (isInstanceNode.executeWith(frame, value, typedict.proto)) { - return byref(inliningTarget, value, pyTypeCheck, factory, raiseNode); + return byref(inliningTarget, value, pyTypeCheck, raiseNode); } if (pyTypeCheck.isPointerObject(inliningTarget, value) || pyTypeCheck.isArrayObject(inliningTarget, value)) { @@ -252,7 +257,7 @@ static Object PyCPointerType_set_type(Object self, TruffleString type, @Cached HashingStorageSetItem setItem, @Cached IsTypeNode isTypeNode, @Cached PyTypeStgDictNode pyTypeStgDictNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { StgDictObject dict = pyTypeStgDictNode.checkAbstractClass(inliningTarget, self, raiseNode); PyCPointerType_SetProto(inliningTarget, dict, type, isTypeNode, pyTypeStgDictNode, raiseNode); dict.setDictStorage(setItem.execute(inliningTarget, dict.getDictStorage(), T__TYPE_, type)); @@ -262,8 +267,8 @@ static Object PyCPointerType_set_type(Object self, TruffleString type, @SuppressWarnings("unused") @Specialization(guards = "!isString(type)") static Object error(Object self, Object type, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, TYPE_MUST_BE_A_TYPE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, TYPE_MUST_BE_A_TYPE); } } @@ -282,12 +287,12 @@ static Object error(Object self, Object type, static void PyCPointerType_SetProto(Node inliningTarget, StgDictObject stgdict, Object proto, IsTypeNode isTypeNode, PyTypeStgDictNode pyTypeStgDictNode, - PRaiseNode.Lazy raiseNode) { + PRaiseNode raiseNode) { if (proto == null || !isTypeNode.execute(inliningTarget, proto)) { - throw raiseNode.get(inliningTarget).raise(TypeError, TYPE_MUST_BE_A_TYPE); + throw raiseNode.raise(inliningTarget, TypeError, TYPE_MUST_BE_A_TYPE); } if (pyTypeStgDictNode.execute(inliningTarget, proto) == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, TYPE_MUST_HAVE_STORAGE_INFO); + throw raiseNode.raise(inliningTarget, TypeError, TYPE_MUST_HAVE_STORAGE_INFO); } stgdict.proto = proto; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCSimpleTypeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCSimpleTypeBuiltins.java index 4aecce7044..7701e9ffbe 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCSimpleTypeBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCSimpleTypeBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,7 +42,6 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PyCSimpleType; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SimpleCData; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.StgDict; import static com.oracle.graal.python.builtins.modules.ctypes.CDataTypeBuiltins.J_FROM_PARAM; import static com.oracle.graal.python.builtins.modules.ctypes.CDataTypeBuiltins.T__AS_PARAMETER_; import static com.oracle.graal.python.builtins.modules.ctypes.CtypesModuleBuiltins.TYPEFLAG_ISPOINTER; @@ -53,7 +52,6 @@ import static com.oracle.graal.python.nodes.ErrorMessages.TYPE_S_NOT_SUPPORTED; import static com.oracle.graal.python.nodes.ErrorMessages.WHICH_MUST_BE_A_SINGLE_CHARACTER_STRING_CONTAINING_ONE_OF_S; import static com.oracle.graal.python.nodes.ErrorMessages.WRONG_TYPE; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; @@ -63,12 +61,13 @@ import java.util.List; import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.PythonOS; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.TypeNode; import com.oracle.graal.python.builtins.modules.BuiltinFunctions.IsInstanceNode; import com.oracle.graal.python.builtins.modules.ctypes.CFieldBuiltins.SetFuncNode; import com.oracle.graal.python.builtins.modules.ctypes.FFIType.FieldDesc; @@ -83,6 +82,8 @@ import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.str.StringNodes.InternStringNode; import com.oracle.graal.python.builtins.objects.str.StringUtils; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeBuiltins.TypeNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetBaseClassNode; import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.lib.PyObjectSetAttr; @@ -96,8 +97,7 @@ import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.runtime.object.PythonObjectSlowPathFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -125,13 +125,16 @@ public final class PyCSimpleTypeBuiltins extends PythonBuiltins { protected static final TruffleString T_CTYPE_BE = tsLiteral("__ctype_be__"); protected static final TruffleString T_CTYPE_LE = tsLiteral("__ctype_le__"); + public static final TpSlots SLOTS = PyCSimpleTypeBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return PyCSimpleTypeBuiltinsFactory.getFactories(); } @ImportStatic(PyCPointerTypeBuiltins.class) - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory protected abstract static class PyCSimpleTypeNewNode extends PythonBuiltinNode { @@ -154,8 +157,8 @@ static Object PyCSimpleType_new(VirtualFrame frame, Object type, Object[] args, @Cached TruffleString.SwitchEncodingNode switchEncodingNode, @Cached TruffleString.EqualNode eqNode, @Cached TruffleString.FromCharArrayUTF16Node fromCharArrayNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { /* * create the new instance (which is a class, since we are a metatype!) @@ -164,7 +167,7 @@ static Object PyCSimpleType_new(VirtualFrame frame, Object type, Object[] args, Object proto = lookupAttrType.execute(frame, inliningTarget, result, T__TYPE_); if (proto == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(AttributeError, CLASS_MUST_DEFINE_A_TYPE_ATTRIBUTE); + throw raiseNode.raise(inliningTarget, AttributeError, CLASS_MUST_DEFINE_A_TYPE_ATTRIBUTE); } TruffleString proto_str; int proto_len; @@ -172,22 +175,22 @@ static Object PyCSimpleType_new(VirtualFrame frame, Object type, Object[] args, proto_str = toTruffleStringNode.execute(inliningTarget, proto); proto_len = codePointLengthNode.execute(proto_str, TS_ENCODING); } else { - throw raiseNode.get(inliningTarget).raise(TypeError, CLASS_MUST_DEFINE_A_TYPE_STRING_ATTRIBUTE); + throw raiseNode.raise(inliningTarget, TypeError, CLASS_MUST_DEFINE_A_TYPE_STRING_ATTRIBUTE); } if (proto_len != 1) { - throw raiseNode.get(inliningTarget).raise(ValueError, A_TYPE_ATTRIBUTE_WHICH_MUST_BE_A_STRING_OF_LENGTH_1); + throw raiseNode.raise(inliningTarget, ValueError, A_TYPE_ATTRIBUTE_WHICH_MUST_BE_A_STRING_OF_LENGTH_1); } if (indexOfStringNode.execute(T_SIMPLE_TYPE_CHARS, proto_str, 0, SIMPLE_TYPE_CHARS_LENGTH, TS_ENCODING) < 0) { - throw raiseNode.get(inliningTarget).raise(AttributeError, WHICH_MUST_BE_A_SINGLE_CHARACTER_STRING_CONTAINING_ONE_OF_S, T_SIMPLE_TYPE_CHARS); + throw raiseNode.raise(inliningTarget, AttributeError, WHICH_MUST_BE_A_SINGLE_CHARACTER_STRING_CONTAINING_ONE_OF_S, T_SIMPLE_TYPE_CHARS); } char code = (char) codePointAtIndexNode.execute(proto_str, 0, TS_ENCODING); FieldDesc fmt = FFIType._ctypes_get_fielddesc(code); if (fmt == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, TYPE_S_NOT_SUPPORTED, proto_str); + throw raiseNode.raise(inliningTarget, ValueError, TYPE_S_NOT_SUPPORTED, proto_str); } - StgDictObject stgdict = factory.createStgDictObject(StgDict); + StgDictObject stgdict = PFactory.createStgDictObject(language); stgdict.ffi_type_pointer = fmt.pffi_type; stgdict.align = fmt.pffi_type.alignment; @@ -205,7 +208,7 @@ static Object PyCSimpleType_new(VirtualFrame frame, Object type, Object[] args, /* replace the class dict by our updated spam dict */ PDict resDict = getDict.execute(result); if (resDict == null) { - resDict = factory.createDictFixedStorage((PythonObject) result); + resDict = PFactory.createDictFixedStorage(language, (PythonObject) result); } addAllToOtherNode.execute(frame, inliningTarget, resDict.getDictStorage(), stgdict); setDict.execute(inliningTarget, (PythonObject) result, stgdict); @@ -214,19 +217,17 @@ static Object PyCSimpleType_new(VirtualFrame frame, Object type, Object[] args, * Install from_param class methods in ctypes base classes. Overrides the * PyCSimpleType_from_param generic method. */ - Python3Core core = PythonContext.get(inliningTarget); - PythonObjectSlowPathFactory slowPathFactory = core.factory(); - if (getBaseClassNode.execute(inliningTarget, result) == core.lookupType(SimpleCData)) { - PythonLanguage language = PythonLanguage.get(internStringNode); + PythonContext context = PythonContext.get(inliningTarget); + if (getBaseClassNode.execute(inliningTarget, result) == context.lookupType(SimpleCData)) { if (eqNode.execute(T_LOWER_Z, proto_str, TS_ENCODING)) { /* c_char_p */ - LazyPyCSimpleTypeBuiltins.addCCharPFromParam(slowPathFactory, language, result); + LazyPyCSimpleTypeBuiltins.addCCharPFromParam(language, result); stgdict.flags |= TYPEFLAG_ISPOINTER; } else if (eqNode.execute(T_UPPER_Z, proto_str, TS_ENCODING)) { /* c_wchar_p */ - LazyPyCSimpleTypeBuiltins.addCWCharPFromParam(slowPathFactory, language, result); + LazyPyCSimpleTypeBuiltins.addCWCharPFromParam(language, result); stgdict.flags |= TYPEFLAG_ISPOINTER; } else if (eqNode.execute(T_UPPER_P, proto_str, TS_ENCODING)) { /* c_void_p */ - LazyPyCSimpleTypeBuiltins.addCVoidPFromParam(slowPathFactory, language, result); + LazyPyCSimpleTypeBuiltins.addCVoidPFromParam(language, result); stgdict.flags |= TYPEFLAG_ISPOINTER; } else if (eqNode.execute(T_LOWER_S, proto_str, TS_ENCODING) || eqNode.execute(T_UPPER_X, proto_str, TS_ENCODING) || @@ -242,8 +243,7 @@ static Object PyCSimpleType_new(VirtualFrame frame, Object type, Object[] args, toTruffleStringNode, getDict, setDict, - addAllToOtherNode, - factory); + addAllToOtherNode); StgDictObject sw_dict = pyTypeStgDictNode.execute(inliningTarget, swapped); setAttrString.execute(frame, inliningTarget, result, T_CTYPE_BE, swapped); setAttrString.execute(frame, inliningTarget, result, T_CTYPE_LE, result); @@ -263,8 +263,7 @@ private static Object CreateSwappedType(VirtualFrame frame, Node inliningTarget, CastToTruffleStringNode toString, GetDictIfExistsNode getDict, SetDictNode setDict, - HashingStorageAddAllToOther addAllToOther, - PythonObjectFactory factory) { + HashingStorageAddAllToOther addAllToOther) { int argsLen = args.length; Object[] swapped_args = new Object[argsLen]; TruffleString suffix = toString.execute(inliningTarget, internStringNode.execute(inliningTarget, T__BE)); @@ -278,7 +277,8 @@ private static Object CreateSwappedType(VirtualFrame frame, Node inliningTarget, * create the new instance (which is a class, since we are a metatype!) */ Object result = typeNew.execute(frame, type, swapped_args[0], swapped_args[1], swapped_args[2], kwds); - StgDictObject stgdict = factory.createStgDictObject(StgDict); + PythonLanguage language = PythonLanguage.get(inliningTarget); + StgDictObject stgdict = PFactory.createStgDictObject(language); stgdict.ffi_type_pointer = fmt.pffi_type; stgdict.align = fmt.pffi_type.alignment; stgdict.length = 0; @@ -291,7 +291,7 @@ private static Object CreateSwappedType(VirtualFrame frame, Node inliningTarget, /* replace the class dict by our updated spam dict */ PDict resDict = getDict.execute(result); if (resDict == null) { - resDict = factory.createDictFixedStorage((PythonObject) result); + resDict = PFactory.createDictFixedStorage(language, (PythonObject) result); } addAllToOther.execute(frame, inliningTarget, resDict.getDictStorage(), stgdict); setDict.execute(inliningTarget, (PythonObject) result, stgdict); @@ -315,8 +315,7 @@ static Object PyCSimpleType_from_param(VirtualFrame frame, Object type, Object v @Cached PyTypeStgDictNode pyTypeStgDictNode, @Cached PyObjectLookupAttr lookupAsParam, @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { /* * If the value is already an instance of the requested type, we can use it as is */ @@ -334,7 +333,7 @@ static Object PyCSimpleType_from_param(VirtualFrame frame, Object type, Object v FieldDesc fd = FFIType._ctypes_get_fielddesc(code); assert fd != null; - PyCArgObject parg = factory.createCArgObject(); + PyCArgObject parg = PFactory.createCArgObject(PythonLanguage.get(inliningTarget)); parg.tag = code; parg.pffi_type = fd.pffi_type; parg.valuePointer = Pointer.allocate(parg.pffi_type, dict.size); @@ -348,11 +347,11 @@ static Object PyCSimpleType_from_param(VirtualFrame frame, Object type, Object v Object as_parameter = lookupAsParam.execute(frame, inliningTarget, value, T__AS_PARAMETER_); if (as_parameter != PNone.NO_VALUE) { // Py_EnterRecursiveCall("while processing _as_parameter_"); TODO - Object r = PyCSimpleType_from_param(frame, type, as_parameter, inliningTarget, setFuncNode, isInstanceNode, pyTypeStgDictNode, lookupAsParam, codePointAtIndexNode, factory, raiseNode); + Object r = PyCSimpleType_from_param(frame, type, as_parameter, inliningTarget, setFuncNode, isInstanceNode, pyTypeStgDictNode, lookupAsParam, codePointAtIndexNode, raiseNode); // Py_LeaveRecursiveCall(); return r; } - throw raiseNode.get(inliningTarget).raise(TypeError, WRONG_TYPE); + throw raiseNode.raise(inliningTarget, TypeError, WRONG_TYPE); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCStructTypeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCStructTypeBuiltins.java index 04d9ba26cb..c169e46ab1 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCStructTypeBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/PyCStructTypeBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,25 +41,21 @@ package com.oracle.graal.python.builtins.modules.ctypes; import static com.oracle.graal.python.nodes.ErrorMessages.ATTR_NAME_MUST_BE_STRING; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import java.util.List; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; -import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.modules.ctypes.StructUnionTypeBuiltins.PyCStructUnionTypeUpdateStgDict; -import com.oracle.graal.python.builtins.modules.ctypes.StructUnionTypeBuiltins.StructUnionTypeNewNode; import com.oracle.graal.python.builtins.objects.str.StringNodes.CastToTruffleStringCheckedNode; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeBuiltins; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSetAttr.SetAttrBuiltinNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -80,11 +76,6 @@ protected List> getNodeFa return PyCStructTypeBuiltinsFactory.getFactories(); } - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) - @GenerateNodeFactory - protected abstract static class NewNode extends StructUnionTypeNewNode { - } - @Slot(value = SlotKind.tp_setattro, isComplex = true) @GenerateNodeFactory protected abstract static class SetattrNode extends SetAttrBuiltinNode { @@ -92,13 +83,12 @@ protected abstract static class SetattrNode extends SetAttrBuiltinNode { void doStringKey(VirtualFrame frame, Object object, TruffleString key, Object value, @Shared @Cached TypeBuiltins.SetattrNode typeSetAttr, @Shared @Cached TruffleString.EqualNode equalNode, - @Shared @Cached PyCStructUnionTypeUpdateStgDict updateStgDict, - @Shared @Cached PythonObjectFactory factory) { + @Shared @Cached PyCStructUnionTypeUpdateStgDict updateStgDict) { // CPython just delegates to "PyType_Type.tp_setattro" with the comment: /* XXX Should we disallow deleting _fields_? */ typeSetAttr.executeSetAttr(frame, object, key, value); if (equalNode.execute(key, StructUnionTypeBuiltins.T__FIELDS_, TS_ENCODING)) { - updateStgDict.execute(frame, object, value, true, factory); + updateStgDict.execute(frame, object, value, true); } } @@ -109,10 +99,9 @@ void doGeneric(VirtualFrame frame, Object object, Object keyObject, Object value @Cached CastToTruffleStringCheckedNode castKeyToStringNode, @Shared @Cached TypeBuiltins.SetattrNode typeSetAttr, @Shared @Cached TruffleString.EqualNode equalNode, - @Shared @Cached PyCStructUnionTypeUpdateStgDict updateStgDict, - @Shared @Cached PythonObjectFactory factory) { + @Shared @Cached PyCStructUnionTypeUpdateStgDict updateStgDict) { TruffleString key = castKeyToStringNode.cast(inliningTarget, keyObject, ATTR_NAME_MUST_BE_STRING, keyObject); - doStringKey(frame, object, key, value, typeSetAttr, equalNode, updateStgDict, factory); + doStringKey(frame, object, key, value, typeSetAttr, equalNode, updateStgDict); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/SimpleCDataBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/SimpleCDataBuiltins.java index 1b6d2405f8..e427764671 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/SimpleCDataBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/SimpleCDataBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,9 +44,6 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_TRUFFLE_CDATA_INIT_BUFFER_PROTOCOL; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode; import static com.oracle.graal.python.nodes.ErrorMessages.CANT_DELETE_ATTRIBUTE; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; @@ -54,6 +51,7 @@ import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -81,6 +79,7 @@ import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; @@ -110,13 +109,13 @@ public void postInitialize(Python3Core core) { } static void Simple_set_value(VirtualFrame frame, Node inliningTarget, CDataObject self, Object value, - PRaiseNode.Lazy raiseNode, + PRaiseNode raiseNode, PyObjectStgDictNode pyObjectStgDictNode, SetFuncNode setFuncNode, KeepRefNode keepRefNode) { StgDictObject dict = pyObjectStgDictNode.execute(inliningTarget, self); if (value == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, CANT_DELETE_ATTRIBUTE); + throw raiseNode.raise(inliningTarget, TypeError, CANT_DELETE_ATTRIBUTE); } assert dict != null : "Cannot be NULL for CDataObject instances"; assert dict.setfunc != FieldSet.nil; @@ -125,7 +124,8 @@ static void Simple_set_value(VirtualFrame frame, Node inliningTarget, CDataObjec keepRefNode.execute(frame, inliningTarget, self, 0, result); } - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory protected abstract static class NewNode extends PythonBuiltinNode { @Specialization @@ -133,15 +133,16 @@ static Object newCData(Object type, @SuppressWarnings("unused") Object[] args, @ @Bind("this") Node inliningTarget, @Cached PyTypeStgDictNode pyTypeStgDictNode, @Cached CtypesNodes.GenericPyCDataNewNode pyCDataNewNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { StgDictObject dict = pyTypeStgDictNode.checkAbstractClass(inliningTarget, type, raiseNode); return pyCDataNewNode.execute(inliningTarget, type, dict); } } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory - protected abstract static class InitNode extends PythonBuiltinNode { + protected abstract static class InitNode extends PythonVarargsBuiltinNode { @Specialization static Object Simple_init(VirtualFrame frame, CDataObject self, Object[] args, @SuppressWarnings("unused") PKeyword[] kwds, @@ -149,7 +150,7 @@ static Object Simple_init(VirtualFrame frame, CDataObject self, Object[] args, @ @Cached SetFuncNode setFuncNode, @Cached KeepRefNode keepRefNode, @Cached PyObjectStgDictNode pyObjectStgDictNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (args.length > 0) { Simple_set_value(frame, inliningTarget, self, args[0], raiseNode, pyObjectStgDictNode, setFuncNode, keepRefNode); } @@ -178,7 +179,7 @@ static Object set_value(VirtualFrame frame, CDataObject self, Object value, @Cached SetFuncNode setFuncNode, @Cached KeepRefNode keepRefNode, @Exclusive @Cached PyObjectStgDictNode pyObjectStgDictNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Simple_set_value(frame, inliningTarget, self, value, raiseNode, pyObjectStgDictNode, setFuncNode, keepRefNode); return PNone.NONE; } @@ -229,7 +230,7 @@ static boolean Simple_bool(CDataObject self, } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/StgDictBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/StgDictBuiltins.java index 76437f4936..cd284528a9 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/StgDictBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/StgDictBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,7 +46,6 @@ import static com.oracle.graal.python.nodes.ErrorMessages.FIELDS_MUST_BE_A_SEQUENCE; import static com.oracle.graal.python.nodes.ErrorMessages.S_IS_SPECIFIED_IN_ANONYMOUS_BUT_NOT_IN_FIELDS; import static com.oracle.graal.python.nodes.ErrorMessages.UNEXPECTED_TYPE; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SIZEOF__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; @@ -56,6 +55,9 @@ import java.util.List; import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -63,6 +65,7 @@ import com.oracle.graal.python.builtins.modules.ctypes.StgDictBuiltinsFactory.PyTypeStgDictNodeGen; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetInternalObjectArrayNode; +import com.oracle.graal.python.builtins.objects.dict.DictBuiltins; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins; @@ -79,19 +82,16 @@ import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.SpecialMethodNames; import com.oracle.graal.python.nodes.attributes.GetAttributeNode; -import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.object.GetDictIfExistsNode; import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext; import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.util.PythonUtils; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -108,7 +108,7 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.StgDict) public final class StgDictBuiltins extends PythonBuiltins { - public static final TpSlots SLOTS = TpSlots.createEmpty(); + public static final TpSlots SLOTS = StgDictBuiltinsSlotsGen.SLOTS; @Override protected List> getNodeFactories() { @@ -117,25 +117,15 @@ protected List> getNodeFa protected static final TruffleString T__ANONYMOUS_ = tsLiteral("_anonymous_"); - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory - protected abstract static class InitNode extends PythonBuiltinNode { + protected abstract static class InitNode extends PythonVarargsBuiltinNode { @Specialization - Object init(VirtualFrame frame, StgDictObject self, Object[] args, PKeyword[] kwargs, - @Bind("this") Node inliningTarget, - @Cached PyObjectLookupAttr lookup, - @Cached CallNode callNode) { - Object initMethod = lookup.execute(frame, inliningTarget, PythonBuiltinClassType.PDict, SpecialMethodNames.T___INIT__); - Object[] dictArgs; - if (args.length > 0) { - dictArgs = new Object[args.length + 1]; - dictArgs[0] = self; - PythonUtils.arraycopy(args, 0, dictArgs, 1, args.length); - } else { - dictArgs = new Object[]{self}; - } - callNode.execute(frame, initMethod, dictArgs, kwargs); + static Object init(VirtualFrame frame, StgDictObject self, Object[] args, PKeyword[] kwargs, + @Cached DictBuiltins.InitNode dictInit) { + dictInit.execute(frame, self, args, kwargs); self.format = null; self.ndim = 0; self.shape = null; @@ -171,12 +161,12 @@ Object doit(VirtualFrame frame, StgDictObject self, @SuppressWarnings("truffle-inlining") // footprint reduction 112 -> 94 protected abstract static class MakeFieldsNode extends PNodeWithContext { - abstract void execute(VirtualFrame frame, Object type, CFieldObject descr, int index, int offset, PythonObjectFactory factory); + abstract void execute(VirtualFrame frame, Object type, CFieldObject descr, int index, int offset); @TruffleBoundary - private void executeBoundary(Object type, CFieldObject descr, int index, int offset, PythonObjectFactory factory) { + private void executeBoundary(Object type, CFieldObject descr, int index, int offset) { // recursive calls are done as boundary calls to avoid too many deopts - execute(null, type, descr, index, offset, factory); + execute(null, type, descr, index, offset); } /* @@ -185,7 +175,7 @@ private void executeBoundary(Object type, CFieldObject descr, int index, int off * into type. */ @Specialization - static void MakeFields(VirtualFrame frame, Object type, CFieldObject descr, int index, int offset, PythonObjectFactory factory, + static void MakeFields(VirtualFrame frame, Object type, CFieldObject descr, int index, int offset, @Bind("this") Node inliningTarget, @Cached GetClassNode getClassNode, @Cached PyObjectGetAttrO getAttributeNode, @@ -197,13 +187,14 @@ static void MakeFields(VirtualFrame frame, Object type, CFieldObject descr, int @Cached("create(T__FIELDS_)") GetAttributeNode getAttrString, @Cached MakeFieldsNode recursiveNode, @Cached("createFor(this)") IndirectCallData indirectCallData, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object fields = getAttrString.executeObject(frame, descr.proto); if (!sequenceCheckNode.execute(inliningTarget, fields)) { - throw raiseNode.get(inliningTarget).raise(TypeError, FIELDS_MUST_BE_A_SEQUENCE); + throw raiseNode.raise(inliningTarget, TypeError, FIELDS_MUST_BE_A_SEQUENCE); } PythonContext context = PythonContext.get(inliningTarget); + PythonLanguage language = context.getLanguage(inliningTarget); for (int i = 0; i < sizeNode.execute(frame, inliningTarget, fields); ++i) { PTuple pair = (PTuple) getItemNode.execute(frame, inliningTarget, fields, i); /* * borrowed @@ -214,19 +205,18 @@ static void MakeFields(VirtualFrame frame, Object type, CFieldObject descr, int Object fname = array[0]; CFieldObject fdescr = (CFieldObject) getAttributeNode.execute(frame, inliningTarget, descr.proto, fname); if (getClassNode.execute(inliningTarget, fdescr) != context.lookupType(CField)) { - throw raiseNode.get(inliningTarget).raise(TypeError, UNEXPECTED_TYPE); + throw raiseNode.raise(inliningTarget, TypeError, UNEXPECTED_TYPE); } if (fdescr.anonymous != 0) { - PythonLanguage language = PythonLanguage.get(inliningTarget); Object state = IndirectCallContext.enter(frame, language, context, indirectCallData); try { - recursiveNode.executeBoundary(type, fdescr, index + fdescr.index, offset + fdescr.offset, context.factory()); + recursiveNode.executeBoundary(type, fdescr, index + fdescr.index, offset + fdescr.offset); } finally { IndirectCallContext.exit(frame, language, context, state); } continue; } - CFieldObject new_descr = factory.createCFieldObject(CField); + CFieldObject new_descr = PFactory.createCFieldObject(language); // assert (Py_TYPE(new_descr) == PythonBuiltinClassType.CField); new_descr.size = fdescr.size; new_descr.offset = fdescr.offset + offset; @@ -252,10 +242,10 @@ static StgDictObject executeUncached(Object type) { return PyTypeStgDictNodeGen.getUncached().execute(null, type); } - protected StgDictObject checkAbstractClass(Node inliningTarget, Object type, PRaiseNode.Lazy raiseNode) { + protected StgDictObject checkAbstractClass(Node inliningTarget, Object type, PRaiseNode raiseNode) { StgDictObject dict = execute(inliningTarget, type); if (dict == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, ABSTRACT_CLASS); + throw raiseNode.raise(inliningTarget, TypeError, ABSTRACT_CLASS); } return dict; } @@ -305,13 +295,13 @@ static StgDictObject PyObject_stgdict(Node inliningTarget, Object self, @SuppressWarnings("truffle-inlining") // footprint reduction 132 -> 115 protected abstract static class MakeAnonFieldsNode extends Node { - abstract void execute(VirtualFrame frame, Object type, PythonObjectFactory factory); + abstract void execute(VirtualFrame frame, Object type); /* * Iterate over the names in the type's _anonymous_ attribute, if present, */ @Specialization - static void MakeAnonFields(VirtualFrame frame, Object type, PythonObjectFactory factory, + static void MakeAnonFields(VirtualFrame frame, Object type, @Bind("this") Node inliningTarget, @Cached PySequenceCheckNode sequenceCheckNode, @Cached PyObjectSizeNode sizeNode, @@ -320,25 +310,25 @@ static void MakeAnonFields(VirtualFrame frame, Object type, PythonObjectFactory @Cached GetClassNode getClassNode, @Cached PyObjectGetAttrO getAttr, @Cached PyObjectLookupAttr lookupAnon, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object anon = lookupAnon.execute(frame, inliningTarget, type, T__ANONYMOUS_); if (PGuards.isPNone(anon)) { return; } if (!sequenceCheckNode.execute(inliningTarget, anon)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ANONYMOUS_MUST_BE_A_SEQUENCE); + throw raiseNode.raise(inliningTarget, TypeError, ANONYMOUS_MUST_BE_A_SEQUENCE); } for (int i = 0; i < sizeNode.execute(frame, inliningTarget, anon); ++i) { Object fname = getItemNode.execute(frame, inliningTarget, anon, i); /* borrowed */ CFieldObject descr = (CFieldObject) getAttr.execute(frame, inliningTarget, type, fname); if (getClassNode.execute(inliningTarget, descr) != CField) { - throw raiseNode.get(inliningTarget).raise(AttributeError, S_IS_SPECIFIED_IN_ANONYMOUS_BUT_NOT_IN_FIELDS, fname); + throw raiseNode.raise(inliningTarget, AttributeError, S_IS_SPECIFIED_IN_ANONYMOUS_BUT_NOT_IN_FIELDS, fname); } descr.anonymous = 1; /* descr is in the field descriptor. */ - makeFieldsNode.execute(frame, type, descr, descr.index, descr.offset, factory); + makeFieldsNode.execute(frame, type, descr, descr.index, descr.offset); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/StructUnionTypeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/StructUnionTypeBuiltins.java index ec38eb8b2a..8f571b09e6 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/StructUnionTypeBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/StructUnionTypeBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -49,7 +49,7 @@ import static com.oracle.graal.python.builtins.modules.ctypes.PyCPointerTypeBuiltins.T_UPPER_B; import static com.oracle.graal.python.builtins.modules.ctypes.PyCPointerTypeBuiltins.T_UPPER_T_LEFTBRACE; import static com.oracle.graal.python.builtins.modules.ctypes.StgDictObject.DICTFLAG_FINAL; -import static com.oracle.graal.python.nodes.ErrorMessages.BIT_FIELDS_NOT_ALLOWED_FOR_TYPE_S; +import static com.oracle.graal.python.nodes.ErrorMessages.BIT_FIELDS_NOT_ALLOWED_FOR_TYPE_N; import static com.oracle.graal.python.nodes.ErrorMessages.FIELDS_IS_FINAL; import static com.oracle.graal.python.nodes.ErrorMessages.FIELDS_MUST_BE_A_SEQUENCE_OF_NAME_C_TYPE_PAIRS; import static com.oracle.graal.python.nodes.ErrorMessages.FIELDS_MUST_BE_A_SEQUENCE_OF_PAIRS; @@ -57,7 +57,6 @@ import static com.oracle.graal.python.nodes.ErrorMessages.PACK_MUST_BE_A_NON_NEGATIVE_INTEGER; import static com.oracle.graal.python.nodes.ErrorMessages.SECOND_ITEM_IN_FIELDS_TUPLE_INDEX_D_MUST_BE_A_C_TYPE; import static com.oracle.graal.python.nodes.ErrorMessages.STRUCTURE_OR_UNION_CANNOT_CONTAIN_ITSELF; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; import static com.oracle.graal.python.nodes.StringLiterals.T_RBRACE; import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; @@ -66,11 +65,13 @@ import java.util.List; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors.TypeNode; import com.oracle.graal.python.builtins.modules.ctypes.CFieldBuiltins.PyCFieldFromDesc; import com.oracle.graal.python.builtins.modules.ctypes.CtypesNodes.PyTypeCheck; import com.oracle.graal.python.builtins.modules.ctypes.FFIType.FFI_TYPES; @@ -87,8 +88,9 @@ import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.str.StringUtils; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeBuiltins.TypeNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetBaseClassNode; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyObjectGetItem; import com.oracle.graal.python.lib.PyObjectLookupAttr; @@ -104,7 +106,7 @@ import com.oracle.graal.python.nodes.object.SetDictNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -123,6 +125,8 @@ }) public final class StructUnionTypeBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = StructUnionTypeBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return StructUnionTypeBuiltinsFactory.getFactories(); @@ -137,7 +141,8 @@ protected List> getNodeFa protected static final TruffleString T__PACK_ = tsLiteral("_pack_"); @ImportStatic(StructUnionTypeBuiltins.class) - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory public abstract static class StructUnionTypeNewNode extends PythonBuiltinNode { @@ -148,6 +153,7 @@ protected boolean isStruct() { @Specialization protected Object StructUnionTypeNew(VirtualFrame frame, Object type, Object[] args, PKeyword[] kwds, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached HashingStorageAddAllToOther addAllToOtherNode, @Cached HashingStorageGetItem getItemResDict, @Cached HashingStorageGetItem getItemStgDict, @@ -156,8 +162,7 @@ protected Object StructUnionTypeNew(VirtualFrame frame, Object type, Object[] ar @Cached GetDictIfExistsNode getDict, @Cached SetDictNode setDict, @Cached GetBaseClassNode getBaseClassNode, - @Cached PyObjectSetAttr setFieldsAttributeNode, - @Cached PythonObjectFactory factory) { + @Cached PyObjectSetAttr setFieldsAttributeNode) { /* * create the new instance (which is a class, since we are a metatype!) */ @@ -165,13 +170,13 @@ protected Object StructUnionTypeNew(VirtualFrame frame, Object type, Object[] ar PDict resDict = getDict.execute(result); if (resDict == null) { - resDict = factory.createDictFixedStorage((PythonObject) result); + resDict = PFactory.createDictFixedStorage(language, (PythonObject) result); } if (getItemResDict.hasKey(inliningTarget, resDict.getDictStorage(), T__ABSTRACT_)) { return result; } - StgDictObject dict = factory.createStgDictObject(PythonBuiltinClassType.StgDict); + StgDictObject dict = PFactory.createStgDictObject(language); if (!isStruct()) { dict.flags |= TYPEFLAG_HASUNION; } @@ -205,7 +210,7 @@ protected Object StructUnionTypeNew(VirtualFrame frame, Object type, Object[] ar @ImportStatic(StructUnionTypeBuiltins.class) @SuppressWarnings("truffle-inlining") // footprint reduction 292 -> 275 protected abstract static class PyCStructUnionTypeUpdateStgDict extends Node { - abstract void execute(VirtualFrame frame, Object type, Object fields, boolean isStruct, PythonObjectFactory factory); + abstract void execute(VirtualFrame frame, Object type, Object fields, boolean isStruct); /* * Retrieve the (optional) _pack_ attribute from a type, the _fields_ attribute, and create @@ -213,12 +218,11 @@ protected abstract static class PyCStructUnionTypeUpdateStgDict extends Node { */ @SuppressWarnings("fallthrough") @Specialization - static void PyCStructUnionType_update_stgdict(VirtualFrame frame, Object type, Object fields, boolean isStruct, PythonObjectFactory factory, + static void PyCStructUnionType_update_stgdict(VirtualFrame frame, Object type, Object fields, boolean isStruct, @Bind("this") Node inliningTarget, @Cached PyTypeCheck pyTypeCheck, @Cached GetInternalObjectArrayNode getArray, @Cached PyCFieldFromDesc cFieldFromDesc, - @Cached GetNameNode getNameNode, @Cached CheckIsSequenceNode isSequenceNode, @Cached PyObjectGetItem getItemNode, @Cached PyObjectSizeNode sizeNode, @@ -235,7 +239,7 @@ static void PyCStructUnionType_update_stgdict(VirtualFrame frame, Object type, O @Cached CastToTruffleStringNode castToTruffleStringNode, @Cached TruffleStringBuilder.AppendStringNode appendStringNode, @Cached TruffleStringBuilder.ToStringNode toStringNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { /* * HACK Alert: I cannot be bothered to fix ctypes.com, so there has to be a way to use * the old, broken semantics: _fields_ are not extended but replaced in subclasses. @@ -259,7 +263,7 @@ static void PyCStructUnionType_update_stgdict(VirtualFrame frame, Object type, O pack = asSizeNode.executeLossy(frame, inliningTarget, tmp); } catch (PException e) { e.expectTypeOrOverflowError(inliningTarget, isBuiltinClassProfile); - throw raiseNode.get(inliningTarget).raise(ValueError, PACK_MUST_BE_A_NON_NEGATIVE_INTEGER); + throw raiseNode.raise(inliningTarget, ValueError, PACK_MUST_BE_A_NON_NEGATIVE_INTEGER); } } @@ -269,14 +273,14 @@ static void PyCStructUnionType_update_stgdict(VirtualFrame frame, Object type, O len = sizeNode.execute(frame, inliningTarget, fields); } catch (PException e) { e.expectTypeError(inliningTarget, isBuiltinClassProfile); - throw raiseNode.get(inliningTarget).raise(TypeError, FIELDS_MUST_BE_A_SEQUENCE_OF_PAIRS); + throw raiseNode.raise(inliningTarget, TypeError, FIELDS_MUST_BE_A_SEQUENCE_OF_PAIRS); } StgDictObject stgdict = pyTypeStgDictNode.execute(inliningTarget, type); /* If this structure/union is already marked final we cannot assign _fields_ anymore. */ if ((stgdict.flags & DICTFLAG_FINAL) != 0) { /* is final ? */ - throw raiseNode.get(inliningTarget).raise(AttributeError, FIELDS_IS_FINAL); + throw raiseNode.raise(inliningTarget, AttributeError, FIELDS_IS_FINAL); } stgdict.format = null; @@ -321,7 +325,6 @@ static void PyCStructUnionType_update_stgdict(VirtualFrame frame, Object type, O for (int idx = 0; idx < len + 1; idx++) { stgdict.ffi_type_pointer.elements[idx] = new FFIType(); } - */ ffi_ofs = 0; } @@ -346,13 +349,13 @@ static void PyCStructUnionType_update_stgdict(VirtualFrame frame, Object type, O Object pair = getItemNode.execute(frame, inliningTarget, fields, i); // !PyArg_ParseTuple(pair, "UO|i", & name, &desc, &bitsize) if (!PGuards.isPTuple(pair)) { - fieldsError(raiseNode.get(inliningTarget)); + fieldsError(inliningTarget, raiseNode); } SequenceStorage storage = ((PTuple) pair).getSequenceStorage(); Object[] tuple = getArray.execute(inliningTarget, storage); int tupleLen = storage.length(); if (tupleLen < 2 || !PGuards.isString(tuple[0]) || (tupleLen > 2 && !PGuards.isInteger(tuple[2]))) { - fieldsError(raiseNode.get(inliningTarget)); + fieldsError(inliningTarget, raiseNode); } Object name = tuple[0]; Object desc = tuple[1]; @@ -363,7 +366,7 @@ static void PyCStructUnionType_update_stgdict(VirtualFrame frame, Object type, O } StgDictObject dict = pyTypeStgDictNode.execute(inliningTarget, desc); if (dict == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, SECOND_ITEM_IN_FIELDS_TUPLE_INDEX_D_MUST_BE_A_C_TYPE, i); + throw raiseNode.raise(inliningTarget, TypeError, SECOND_ITEM_IN_FIELDS_TUPLE_INDEX_D_MUST_BE_A_C_TYPE, i); } stgdict.ffi_type_pointer.elements[ffi_ofs + i] = dict.ffi_type_pointer; if ((dict.flags & (TYPEFLAG_ISPOINTER | TYPEFLAG_HASPOINTER)) != 0) { @@ -389,10 +392,10 @@ static void PyCStructUnionType_update_stgdict(VirtualFrame frame, Object type, O } /* else fall through */ default: - throw raiseNode.get(inliningTarget).raise(TypeError, BIT_FIELDS_NOT_ALLOWED_FOR_TYPE_S, getNameNode.execute(inliningTarget, desc)); + throw raiseNode.raise(inliningTarget, TypeError, BIT_FIELDS_NOT_ALLOWED_FOR_TYPE_N, desc); } if (bitsize <= 0 || bitsize > dict.size * 8) { - throw raiseNode.get(inliningTarget).raise(ValueError, NUMBER_OF_BITS_INVALID_FOR_BIT_FIELD); + throw raiseNode.raise(inliningTarget, ValueError, NUMBER_OF_BITS_INVALID_FOR_BIT_FIELD); } } else { bitsize = 0; @@ -412,7 +415,7 @@ static void PyCStructUnionType_update_stgdict(VirtualFrame frame, Object type, O CFieldObject prop; if (isStruct) { int[] props = new int[]{field_size, bitofs, size, offset, align}; - prop = cFieldFromDesc.execute(inliningTarget, desc, i, bitsize, pack, big_endian, props, factory); + prop = cFieldFromDesc.execute(inliningTarget, desc, i, bitsize, pack, big_endian, props); field_size = props[0]; bitofs = props[1]; size = props[2]; @@ -426,7 +429,7 @@ static void PyCStructUnionType_update_stgdict(VirtualFrame frame, Object type, O offset = 0; align = 0; int[] props = new int[]{field_size, bitofs, size, offset, align}; - prop = cFieldFromDesc.execute(inliningTarget, desc, i, bitsize, pack, big_endian, props, factory); + prop = cFieldFromDesc.execute(inliningTarget, desc, i, bitsize, pack, big_endian, props); field_size = props[0]; bitofs = props[1]; size = props[2]; @@ -516,7 +519,6 @@ static void PyCStructUnionType_update_stgdict(VirtualFrame frame, Object type, O fieldsError(); } Object desc = tuple[1]; - StgDictObject dict = pyTypeStgDictNode.execute(desc); if (dict == null) { throw raise(TypeError, SECOND_ITEM_IN_FIELDS_TUPLE_INDEX_D_MUST_BE_A_C_TYPE, i); @@ -557,19 +559,19 @@ static void PyCStructUnionType_update_stgdict(VirtualFrame frame, Object type, O */ // !PyArg_ParseTuple(pair, "UO|i", & name, &desc, &bitsize) if (!PGuards.isPTuple(pair)) { - fieldsError(raiseNode.get(inliningTarget)); + fieldsError(inliningTarget, raiseNode); } SequenceStorage storage = ((PTuple) pair).getSequenceStorage(); Object[] tuple = getArray.execute(inliningTarget, storage); int tupleLen = storage.length(); if (tupleLen < 2 || !PGuards.isString(tuple[0]) || (tupleLen > 2 && !PGuards.isInteger(tuple[2]))) { - fieldsError(raiseNode.get(inliningTarget)); + fieldsError(inliningTarget, raiseNode); } Object desc = tuple[1]; StgDictObject dict = pyTypeStgDictNode.execute(inliningTarget, desc); /* Possibly this check could be avoided, but see above comment. */ if (dict == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, SECOND_ITEM_IN_FIELDS_TUPLE_INDEX_D_MUST_BE_A_C_TYPE, i); + throw raiseNode.raise(inliningTarget, TypeError, SECOND_ITEM_IN_FIELDS_TUPLE_INDEX_D_MUST_BE_A_C_TYPE, i); } assert (element_index < (ffi_ofs + len)); /* will be used below */ if (!pyTypeCheck.isPyCArrayTypeObject(inliningTarget, desc)) { @@ -579,7 +581,7 @@ static void PyCStructUnionType_update_stgdict(VirtualFrame frame, Object type, O int length = dict.length; StgDictObject edict = pyTypeStgDictNode.execute(inliningTarget, dict.proto); if (edict == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, SECOND_ITEM_IN_FIELDS_TUPLE_INDEX_D_MUST_BE_A_C_TYPE, i); + throw raiseNode.raise(inliningTarget, TypeError, SECOND_ITEM_IN_FIELDS_TUPLE_INDEX_D_MUST_BE_A_C_TYPE, i); } FFIType ffiType = new FFIType( length * edict.ffi_type_pointer.size, @@ -608,15 +610,15 @@ static void PyCStructUnionType_update_stgdict(VirtualFrame frame, Object type, O * We did check that this flag was NOT set above, it must not have been set until now. */ if ((stgdict.flags & DICTFLAG_FINAL) != 0) { - throw raiseNode.get(inliningTarget).raise(AttributeError, STRUCTURE_OR_UNION_CANNOT_CONTAIN_ITSELF); + throw raiseNode.raise(inliningTarget, AttributeError, STRUCTURE_OR_UNION_CANNOT_CONTAIN_ITSELF); } stgdict.flags |= DICTFLAG_FINAL; - makeAnonFieldsNode.execute(frame, type, factory); + makeAnonFieldsNode.execute(frame, type); } - static void fieldsError(PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, FIELDS_MUST_BE_A_SEQUENCE_OF_NAME_C_TYPE_PAIRS); + static void fieldsError(Node inliningTarget, PRaiseNode raiseNode) { + throw raiseNode.raise(inliningTarget, TypeError, FIELDS_MUST_BE_A_SEQUENCE_OF_NAME_C_TYPE_PAIRS); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/StructureBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/StructureBuiltins.java index b778fed0c6..b87ba9c02b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/StructureBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/StructureBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,13 +46,13 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_TRUFFLE_CDATA_INIT_BUFFER_PROTOCOL; import static com.oracle.graal.python.nodes.ErrorMessages.DUPLICATE_VALUES_FOR_FIELD_S; import static com.oracle.graal.python.nodes.ErrorMessages.TOO_MANY_INITIALIZERS; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import java.util.List; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -66,12 +66,14 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodesFactory.HashingStorageGetItemNodeGen; import com.oracle.graal.python.builtins.objects.common.KeywordsStorage; import com.oracle.graal.python.builtins.objects.function.PKeyword; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetBaseClassNode; import com.oracle.graal.python.lib.PyObjectGetItem; import com.oracle.graal.python.lib.PyObjectSetAttr; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext; @@ -90,6 +92,8 @@ @CoreFunctions(extendClasses = {PythonBuiltinClassType.Structure, PythonBuiltinClassType.Union}) public final class StructureBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = StructureBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return StructureBuiltinsFactory.getFactories(); @@ -104,7 +108,8 @@ public void postInitialize(Python3Core core) { }); } - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory protected abstract static class NewNode extends PythonBuiltinNode { @@ -113,15 +118,16 @@ static Object GenericPyCDataNew(Object type, @SuppressWarnings("unused") Object[ @Bind("this") Node inliningTarget, @Cached PyTypeStgDictNode pyTypeStgDictNode, @Cached CtypesNodes.GenericPyCDataNewNode pyCDataNewNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { StgDictObject dict = pyTypeStgDictNode.checkAbstractClass(inliningTarget, type, raiseNode); return pyCDataNewNode.execute(inliningTarget, type, dict); } } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory - protected abstract static class InitNode extends PythonBuiltinNode { + protected abstract static class InitNode extends PythonVarargsBuiltinNode { private static final int RECURSION_LIMIT = 5; @Specialization @@ -136,12 +142,12 @@ static Object Struct_init(VirtualFrame frame, CDataObject self, Object[] args, P @Cached PyTypeStgDictNode pyTypeStgDictNode, @Cached GetBaseClassNode getBaseClassNode, @Cached TruffleString.EqualNode equalNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (args.length > 0) { int res = _init_pos_args(frame, inliningTarget, self, getClassNode.execute(inliningTarget, self), args, kwds, 0, indirectCallData, setAttr, getItemNode, toString, getItem, pyTypeStgDictNode, getBaseClassNode, equalNode, raiseNode, RECURSION_LIMIT); if (res < args.length) { - throw raiseNode.get(inliningTarget).raise(TypeError, TOO_MANY_INITIALIZERS); + throw raiseNode.raise(inliningTarget, TypeError, TOO_MANY_INITIALIZERS); } } @@ -173,7 +179,7 @@ static int _init_pos_args(VirtualFrame frame, Node inliningTarget, Object self, PyTypeStgDictNode pyTypeStgDictNode, GetBaseClassNode getBaseClassNode, EqualNode equalNode, - PRaiseNode.Lazy raiseNode, + PRaiseNode raiseNode, int recursionLimit) { Object fields; int index = idx; @@ -206,9 +212,7 @@ static int _init_pos_args(VirtualFrame frame, Node inliningTarget, Object self, Object val = args[i + index]; if (kwds.length > 0) { if (KeywordsStorage.findStringKey(kwds, name, equalNode) != -1) { - // using execute() instead of raise() because we need to pass raisingNode - // explicitly (raiseNode might be uncached) - throw raiseNode.get(inliningTarget).execute(inliningTarget, TypeError, null, PNone.NO_VALUE, DUPLICATE_VALUES_FOR_FIELD_S, new Object[]{name}); + throw raiseNode.raise(inliningTarget, TypeError, DUPLICATE_VALUES_FOR_FIELD_S, name); } } @@ -225,7 +229,7 @@ static int _init_pos_args_boundary(Object self, Object type, Object[] args, PKey return _init_pos_args(null, null, self, type, args, kwds, idx, indirectCallData, setAttr, getItemNode, CastToTruffleStringNode.getUncached(), HashingStorageGetItemNodeGen.getUncached(), PyTypeStgDictNodeGen.getUncached(), - GetBaseClassNode.getUncached(), TruffleString.EqualNode.getUncached(), PRaiseNode.Lazy.getUncached(), 0); + GetBaseClassNode.getUncached(), TruffleString.EqualNode.getUncached(), PRaiseNode.getUncached(), 0); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/UnionTypeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/UnionTypeBuiltins.java index ead295e817..75e142bd84 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/UnionTypeBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/UnionTypeBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,14 +40,13 @@ */ package com.oracle.graal.python.builtins.modules.ctypes; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import java.util.List; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; @@ -61,10 +60,10 @@ import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; @@ -83,7 +82,8 @@ protected List> getNodeFa return UnionTypeBuiltinsFactory.getFactories(); } - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory protected abstract static class NewNode extends StructUnionTypeNewNode { @Override @@ -98,35 +98,34 @@ protected abstract static class SetattrNode extends SetAttrBuiltinNode { @Specialization static void doStringKey(VirtualFrame frame, Object object, TruffleString key, Object value, @Bind("this") Node inliningTarget, - @Shared @Cached ObjectNodes.GenericSetAttrNode genericSetAttrNode, + @Exclusive @Cached ObjectNodes.GenericSetAttrNode genericSetAttrNode, @Shared @Cached WriteAttributeToObjectNode write, @Shared @Cached TruffleString.EqualNode equalNode, - @Shared @Cached PyCStructUnionTypeUpdateStgDict updateStgDict, - @Shared @Cached PythonObjectFactory factory) { + @Shared @Cached PyCStructUnionTypeUpdateStgDict updateStgDict) { genericSetAttrNode.execute(inliningTarget, frame, object, key, value, write); - updateStgDictIfNecessary(frame, object, key, value, equalNode, updateStgDict, factory); + updateStgDictIfNecessary(frame, object, key, value, equalNode, updateStgDict); } + // @Exclusive to address warning @Specialization @InliningCutoff static void doGenericKey(VirtualFrame frame, Object object, Object keyObject, Object value, @Bind("this") Node inliningTarget, @Cached CastToTruffleStringNode castKeyNode, - @Cached PRaiseNode.Lazy raiseNode, - @Shared @Cached ObjectNodes.GenericSetAttrNode genericSetAttrNode, + @Cached PRaiseNode raiseNode, + @Exclusive @Cached ObjectNodes.GenericSetAttrNode genericSetAttrNode, @Shared @Cached WriteAttributeToObjectNode write, @Shared @Cached TruffleString.EqualNode equalNode, - @Shared @Cached PyCStructUnionTypeUpdateStgDict updateStgDict, - @Shared @Cached PythonObjectFactory factory) { + @Shared @Cached PyCStructUnionTypeUpdateStgDict updateStgDict) { TruffleString key = GenericSetAttrNode.castAttributeKey(inliningTarget, keyObject, castKeyNode, raiseNode); genericSetAttrNode.execute(inliningTarget, frame, object, key, value, write); - updateStgDictIfNecessary(frame, object, key, value, equalNode, updateStgDict, factory); + updateStgDictIfNecessary(frame, object, key, value, equalNode, updateStgDict); } private static void updateStgDictIfNecessary(VirtualFrame frame, Object object, TruffleString key, Object value, - EqualNode equalNode, PyCStructUnionTypeUpdateStgDict updateStgDict, PythonObjectFactory factory) { + EqualNode equalNode, PyCStructUnionTypeUpdateStgDict updateStgDict) { if (equalNode.execute(key, StructUnionTypeBuiltins.T__FIELDS_, TS_ENCODING)) { - updateStgDict.execute(frame, object, value, false, factory); + updateStgDict.execute(frame, object, value, false); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/memory/PointerNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/memory/PointerNodes.java index f018dbe61e..5ce63f3b5b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/memory/PointerNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/memory/PointerNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,9 +41,12 @@ package com.oracle.graal.python.builtins.modules.ctypes.memory; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.NotImplementedError; +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError; import static com.oracle.graal.python.builtins.modules.ctypes.CtypesNodes.WCHAR_T_SIZE; import static com.oracle.graal.python.util.PythonUtils.ARRAY_ACCESSOR; +import java.math.BigInteger; + import com.oracle.graal.python.builtins.modules.ctypes.memory.Pointer.ByteArrayStorage; import com.oracle.graal.python.builtins.modules.ctypes.memory.Pointer.LongPointerStorage; import com.oracle.graal.python.builtins.modules.ctypes.memory.Pointer.MemoryBlock; @@ -58,14 +61,15 @@ import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; +import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.util.CastToJavaUnsignedLongNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; @@ -671,7 +675,7 @@ static long doMemoryView(Node inliningTarget, MemoryBlock memory, MemoryViewStor throw CompilerDirectives.shouldNotReachHere(e); } } else { - throw PRaiseNode.raiseUncached(inliningTarget, NotImplementedError, ErrorMessages.MEMORYVIEW_CANNOT_BE_CONVERTED_TO_NATIVE_MEMORY); + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, ErrorMessages.MEMORYVIEW_CANNOT_BE_CONVERTED_TO_NATIVE_MEMORY); } memory.storage = new LongPointerStorage(nativePointer); return nativePointer + offset; @@ -689,7 +693,7 @@ static long doPythonObject(Node inliningTarget, @SuppressWarnings("unused") Memo if (!lib.isPointer(nativeObject)) { lib.toNative(nativeObject); if (!lib.isPointer(nativeObject)) { - throw PRaiseNode.raiseUncached(inliningTarget, NotImplementedError, ErrorMessages.CANNOT_CONVERT_OBJECT_POINTER_TO_NATIVE); + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, ErrorMessages.CANNOT_CONVERT_OBJECT_POINTER_TO_NATIVE); } } try { @@ -716,7 +720,7 @@ public final Object execute(Node inliningTarget, Pointer ptr) { @Specialization static Object doObjectPointer(Node inliningTarget, @SuppressWarnings("unused") MemoryBlock memory, ObjectPointerStorage storage, int offset) { if (offset != 0) { - throw PRaiseNode.raiseUncached(inliningTarget, NotImplementedError, ErrorMessages.CANNOT_APPLY_OFFSET_TO_AN_OBJECT_POINTER); + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, ErrorMessages.CANNOT_APPLY_OFFSET_TO_AN_OBJECT_POINTER); } return storage.pointer; } @@ -734,7 +738,7 @@ public final long execute(Node inliningTarget, Pointer ptr) { @Specialization @SuppressWarnings("unused") static long doObjectPointer(Node inliningTarget, MemoryBlock memory, ObjectPointerStorage storage, int offset) { - throw PRaiseNode.raiseUncached(inliningTarget, NotImplementedError, ErrorMessages.CANNOT_CONVERT_OBJECT_POINTER_TO_NATIVE); + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, ErrorMessages.CANNOT_CONVERT_OBJECT_POINTER_TO_NATIVE); } } @@ -790,11 +794,36 @@ static Pointer doNativeVoidPtr(PythonNativeVoidPtr value) { return Pointer.nativeMemory(pointerObject); } - @Fallback - static Pointer doLong(Node inliningTarget, Object value, - @Cached CastToJavaUnsignedLongNode cast) { - long pointer = cast.execute(inliningTarget, value); - return Pointer.nativeMemory(pointer); + @Specialization + static Pointer doBool(Node inliningTarget, boolean value) { + return Pointer.nativeMemory(value ? 1 : 0); + } + + @Specialization + static Pointer doLong(Node inliningTarget, long value) { + return Pointer.nativeMemory(value); + } + + @Specialization + static Pointer doPInt(Node inliningTarget, PInt value) { + return Pointer.nativeMemory(value.longValue()); + } + + @Specialization + @TruffleBoundary + @InliningCutoff + static Pointer doGeneric(Node inliningTarget, Object value, + @CachedLibrary(limit = "1") InteropLibrary lib) { + if (lib.fitsInBigInteger(value)) { + BigInteger bi; + try { + bi = lib.asBigInteger(value); + return doLong(inliningTarget, bi.longValue()); + } catch (UnsupportedMessageException e) { + // fall through to error + } + } + throw PRaiseNode.raiseStatic(inliningTarget, OverflowError, ErrorMessages.CANNOT_BE_CONVERTED_TO_POINTER); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/FunctoolsModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/FunctoolsModuleBuiltins.java index 80fa1baef0..f8e6e90532 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/FunctoolsModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/FunctoolsModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -49,12 +49,14 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; @@ -65,7 +67,7 @@ import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -100,7 +102,7 @@ public void initialize(Python3Core core) { "\n" + // "cache_info_type: namedtuple class with the fields:\n" + // " hits misses currsize maxsize\n"); - core.lookupBuiltinModule(T_FUNCTOOLS).setModuleState(core.factory().createPythonObject(PythonObject)); + core.lookupBuiltinModule(T_FUNCTOOLS).setModuleState(PFactory.createPythonObject(core.getLanguage(), PythonObject, PythonObject.getInstanceShape(core.getLanguage()))); } // functools.reduce(function, iterable[, initializer]) @@ -118,19 +120,18 @@ public abstract static class ReduceNode extends PythonTernaryBuiltinNode { Object doReduce(VirtualFrame frame, Object function, Object sequence, Object initialIn, @Bind("this") Node inliningTarget, @Cached PyObjectGetIter getIter, - @Cached GetNextNode nextNode, + @Cached PyIterNextNode nextNode, @Cached CallNode callNode, @Cached InlinedConditionProfile initialNoValueProfile, - @Cached IsBuiltinObjectProfile stopIterProfile, @Cached IsBuiltinObjectProfile typeError, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object initial = initialNoValueProfile.profile(inliningTarget, PGuards.isNoValue(initialIn)) ? null : initialIn; Object seqIterator, result = initial; try { seqIterator = getIter.execute(frame, inliningTarget, sequence); } catch (PException pe) { pe.expectTypeError(inliningTarget, typeError); - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, S_ARG_N_MUST_SUPPORT_ITERATION, "reduce()", 2); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, S_ARG_N_MUST_SUPPORT_ITERATION, "reduce()", 2); } Object[] args = new Object[2]; @@ -139,27 +140,26 @@ Object doReduce(VirtualFrame frame, Object function, Object sequence, Object ini while (true) { Object op2; try { - op2 = nextNode.execute(frame, seqIterator); - if (result == null) { - result = op2; - } else { - // Update the args tuple in-place - args[0] = result; - args[1] = op2; - result = callNode.execute(frame, function, args); - } - if (CompilerDirectives.hasNextTier()) { - count++; - } - } catch (PException e) { - e.expectStopIteration(inliningTarget, stopIterProfile); + op2 = nextNode.execute(frame, inliningTarget, seqIterator); + } catch (IteratorExhausted e) { break; } + if (result == null) { + result = op2; + } else { + // Update the args tuple in-place + args[0] = result; + args[1] = op2; + result = callNode.execute(frame, function, args); + } + if (CompilerDirectives.hasNextTier()) { + count++; + } } reportLoopCount(this, count >= 0 ? count : Integer.MAX_VALUE); if (result == null) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, REDUCE_EMPTY_SEQ); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, REDUCE_EMPTY_SEQ); } return result; @@ -172,8 +172,8 @@ Object doReduce(VirtualFrame frame, Object function, Object sequence, Object ini public abstract static class CmpToKeyNode extends PythonUnaryBuiltinNode { @Specialization static Object doConvert(Object myCmp, - @Cached PythonObjectFactory factory) { - return factory.createKeyWrapper(myCmp); + @Bind PythonLanguage language) { + return PFactory.createKeyWrapper(language, myCmp); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/KeyWrapperBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/KeyWrapperBuiltins.java index 6366544179..99a2b88ef6 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/KeyWrapperBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/KeyWrapperBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,30 +41,30 @@ package com.oracle.graal.python.builtins.modules.functools; import static com.oracle.graal.python.nodes.ErrorMessages.OTHER_ARG_MUST_BE_KEY; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___HASH__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.HashNotImplemented; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare; import com.oracle.graal.python.lib.PyObjectIsTrueNode; +import com.oracle.graal.python.lib.PyObjectRichCompare; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.expression.BinaryComparisonNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; @@ -75,7 +75,10 @@ import com.oracle.truffle.api.nodes.Node; @CoreFunctions(extendClasses = PythonBuiltinClassType.PKeyWrapper) +@HashNotImplemented public final class KeyWrapperBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = KeyWrapperBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return KeyWrapperBuiltinsFactory.getFactories(); @@ -84,101 +87,37 @@ protected List> getNodeFa @Override public void initialize(Python3Core core) { super.initialize(core); - core.lookupType(PythonBuiltinClassType.PKeyWrapper).setAttribute(T___HASH__, PNone.NONE); } - abstract static class WrapperKeyCompareNode extends PythonBinaryBuiltinNode { - @Child private BinaryComparisonNode comparisonNode; - @Child private CallNode callNode; - - protected BinaryComparisonNode ensureComparisonNode() { - if (comparisonNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - comparisonNode = insert(createCmp()); - } - return comparisonNode; - } - - protected CallNode ensureCallNode() { - if (callNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - callNode = insert(CallNode.create()); - } - return callNode; - } - - BinaryComparisonNode createCmp() { - throw CompilerDirectives.shouldNotReachHere(); - } - + @Slot(value = SlotKind.tp_richcompare, isComplex = true) + @GenerateNodeFactory + abstract static class KeyWrapperRichCmpNode extends TpSlotRichCompare.RichCmpBuiltinNode { @Specialization - boolean doCompare(VirtualFrame frame, PKeyWrapper self, PKeyWrapper other, + boolean doCompare(VirtualFrame frame, PKeyWrapper self, PKeyWrapper other, RichCmpOp op, @Bind("this") Node inliningTarget, + @Cached CallNode callNode, + @Cached PyObjectRichCompare richCompareNode, @Cached PyObjectIsTrueNode isTrueNode) { - final Object cmpResult = ensureCallNode().execute(frame, self.getCmp(), self.getObject(), other.getObject()); - return isTrueNode.execute(frame, inliningTarget, ensureComparisonNode().executeObject(frame, cmpResult, 0)); + final Object cmpResult = callNode.execute(frame, self.getCmp(), self.getObject(), other.getObject()); + return isTrueNode.execute(frame, richCompareNode.execute(frame, inliningTarget, cmpResult, 0, op)); } @Fallback @SuppressWarnings("unused") - static boolean fallback(Object self, Object other, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, OTHER_ARG_MUST_BE_KEY); - } - } - - @Builtin(name = J___LE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class KWLeNode extends WrapperKeyCompareNode { - @Override - BinaryComparisonNode createCmp() { - return BinaryComparisonNode.LeNode.create(); - } - } - - @Builtin(name = J___LT__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class KWLtNode extends WrapperKeyCompareNode { - @Override - BinaryComparisonNode createCmp() { - return BinaryComparisonNode.LtNode.create(); - } - } - - @Builtin(name = J___GE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class KWGeNode extends WrapperKeyCompareNode { - @Override - BinaryComparisonNode createCmp() { - return BinaryComparisonNode.GeNode.create(); - } - } - - @Builtin(name = J___GT__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class KWGtNode extends WrapperKeyCompareNode { - @Override - BinaryComparisonNode createCmp() { - return BinaryComparisonNode.GtNode.create(); - } - } - - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class KWEqNode extends WrapperKeyCompareNode { - @Override - BinaryComparisonNode createCmp() { - return BinaryComparisonNode.EqNode.create(); + static boolean fallback(Object self, Object other, RichCmpOp op, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, OTHER_ARG_MUST_BE_KEY); } } - @Builtin(name = J___CALL__, minNumOfPositionalArgs = 2, declaresExplicitSelf = true, parameterNames = {"$self", "obj"}) + @Slot(value = SlotKind.tp_call, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 2, parameterNames = {"$self", "obj"}) @GenerateNodeFactory public abstract static class KWCallNode extends PythonBinaryBuiltinNode { @Specialization static Object call(PKeyWrapper self, Object obj, - @Cached PythonObjectFactory factory) { - final PKeyWrapper keyWrapper = factory.createKeyWrapper(self.getCmp()); + @Bind PythonLanguage language) { + final PKeyWrapper keyWrapper = PFactory.createKeyWrapper(language, self.getCmp()); keyWrapper.setObject(obj); return keyWrapper; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/LruCacheWrapperBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/LruCacheWrapperBuiltins.java index 99a8b38fa2..9042a2bbe0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/LruCacheWrapperBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/LruCacheWrapperBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,19 +47,19 @@ import static com.oracle.graal.python.nodes.ErrorMessages.THE_FIRST_ARGUMENT_MUST_BE_CALLABLE; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___DICT__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___QUALNAME__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CLEAR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___COPY__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DEEPCOPY__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -71,6 +71,7 @@ import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode; import com.oracle.graal.python.lib.PyCallableCheckNode; import com.oracle.graal.python.lib.PyIndexCheckNode; @@ -82,7 +83,7 @@ import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode; +import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; @@ -93,7 +94,7 @@ import com.oracle.graal.python.nodes.object.GetOrCreateDictNode; import com.oracle.graal.python.nodes.object.SetDictNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; @@ -115,22 +116,9 @@ protected List> getNodeFa return LruCacheWrapperBuiltinsFactory.getFactories(); } - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 5, takesVarArgs = true, takesVarKeywordArgs = true, // - constructsClass = PythonBuiltinClassType.PLruCacheWrapper, // - parameterNames = {"$cls", "user_function", "maxsize", "typed", "cache_info_type"}, // - doc = "Create a cached callable that wraps another function.\n" + // - "\n" + // - "user_function: the function being cached\n" + // - "\n" + // - "maxsize: 0 for no caching\n" + // - " None for unlimited cache size\n" + // - " n for a bounded cache\n" + // - "\n" + // - "typed: False cache f(3) and f(3.0) as identical calls\n" + // - " True cache f(3) and f(3.0) as distinct calls\n" + // - "\n" + // - "cache_info_type: namedtuple class with the fields:\n" + // - " hits misses currsize maxsize\n") + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "lru_cache", minNumOfPositionalArgs = 5, takesVarArgs = true, takesVarKeywordArgs = true, // + parameterNames = {"$cls", "user_function", "maxsize", "typed", "cache_info_type"}) @ArgumentClinic(name = "typed", conversion = ClinicConversion.Int) @GenerateNodeFactory protected abstract static class LruCacheNewNode extends PythonClinicBuiltinNode { @@ -147,11 +135,11 @@ static Object lruCacheNew(VirtualFrame frame, Object type, @Cached PyCallableCheckNode callableCheck, @Cached PyIndexCheckNode indexCheck, @Cached PyNumberAsSizeNode numberAsSize, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Cached PRaiseNode raiseNode) { if (!callableCheck.execute(inliningTarget, func)) { - throw raiseNode.get(inliningTarget).raise(TypeError, THE_FIRST_ARGUMENT_MUST_BE_CALLABLE); + throw raiseNode.raise(inliningTarget, TypeError, THE_FIRST_ARGUMENT_MUST_BE_CALLABLE); } /* select the caching function, and make/inc maxsize_O */ @@ -172,10 +160,11 @@ static Object lruCacheNew(VirtualFrame frame, Object type, wrapper = WrapperType.BOUNDED; } } else { - throw raiseNode.get(inliningTarget).raise(TypeError, MAXSIZE_SHOULD_BE_INTEGER_OR_NONE); + throw raiseNode.raise(inliningTarget, TypeError, MAXSIZE_SHOULD_BE_INTEGER_OR_NONE); } - LruCacheObject obj = factory.createLruCacheObject(type); + PythonContext context = PythonContext.get(inliningTarget); + LruCacheObject obj = PFactory.createLruCacheObject(context.getLanguage(inliningTarget), type, getInstanceShape.execute(type)); obj.root.prev = obj.root; obj.root.next = obj.root; @@ -187,7 +176,7 @@ static Object lruCacheNew(VirtualFrame frame, Object type, obj.misses = obj.hits = 0; obj.maxsize = maxsize; - obj.kwdMark = PythonContext.get(inliningTarget).lookupBuiltinModule(T_FUNCTOOLS).getModuleState(Object.class); + obj.kwdMark = context.lookupBuiltinModule(T_FUNCTOOLS).getModuleState(Object.class); obj.cacheInfoType = cache_info_type; // obj.dict = null; @@ -201,15 +190,9 @@ static Object lruCacheNew(VirtualFrame frame, Object type, public abstract static class CacheInfoNode extends PythonUnaryBuiltinNode { @Specialization static Object info(VirtualFrame frame, LruCacheObject self, - @Cached CallVarargsMethodNode callNode) { - if (self.maxsize == -1) { - return callNode.execute(frame, self.cacheInfoType, - new Object[]{self.hits, self.misses, PNone.NONE, self.cache.size()}, - PKeyword.EMPTY_KEYWORDS); - } - return callNode.execute(frame, self.cacheInfoType, - new Object[]{self.hits, self.misses, self.maxsize, self.cache.size()}, - PKeyword.EMPTY_KEYWORDS); + @Cached CallNode callNode) { + Object maxsize = self.maxsize == -1 ? PNone.NONE : self.maxsize; + return callNode.execute(frame, self.cacheInfoType, self.hits, self.misses, maxsize, self.cache.size()); } } @@ -255,8 +238,8 @@ static Object setDict(LruCacheObject self, PDict mapping, @Specialization(guards = {"!isNoValue(mapping)", "!isDict(mapping)"}) static Object setDict(@SuppressWarnings("unused") LruCacheObject self, Object mapping, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, mapping); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, mapping); } } @@ -271,14 +254,15 @@ Object reduce(VirtualFrame frame, LruCacheObject self, } } - @Builtin(name = J___CALL__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_call, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory protected abstract static class PartialCallNode extends PythonVarargsBuiltinNode { // uncached_lru_cache_wrapper @Specialization(guards = "self.isUncached()") static Object uncachedLruCacheWrapper(VirtualFrame frame, LruCacheObject self, Object[] args, PKeyword[] kwds, - @Shared @Cached CallVarargsMethodNode callNode) { + @Shared @Cached CallNode callNode) { self.misses++; return callNode.execute(frame, self.func, args, kwds); } @@ -288,8 +272,7 @@ static Object lruCacheMakeKey(Object kwdMark, Object[] args, PKeyword[] kwds, in Node inliningTarget, GetClassNode getClassNode, PyUnicodeCheckExactNode unicodeCheckExact, - PyLongCheckExactNode longCheckExact, - PythonObjectFactory factory) { + PyLongCheckExactNode longCheckExact) { int kwdsSize = kwds.length; /* short path, key will match args anyway, which is a tuple */ if (typed == 0 && kwdsSize == 0) { @@ -303,7 +286,7 @@ static Object lruCacheMakeKey(Object kwdMark, Object[] args, PKeyword[] kwds, in } } - return factory.createTuple(args); + return PFactory.createTuple(PythonLanguage.get(inliningTarget), args); } int argsLen = args.length; int keySize = args.length; @@ -338,7 +321,7 @@ static Object lruCacheMakeKey(Object kwdMark, Object[] args, PKeyword[] kwds, in } } assert (keyPos == keySize); - return factory.createTuple(keyArray); + return PFactory.createTuple(PythonLanguage.get(inliningTarget), keyArray); } // infinite_lru_cache_wrapper @@ -348,7 +331,7 @@ static Object infiniteLruCacheWrapper(VirtualFrame frame, LruCacheObject self, O long hash, Object cachedItem, ObjectHashMap.PutNode setItem, - CallVarargsMethodNode callNode) { + CallNode callNode) { Object result = cachedItem; if (result != null) { self.hits++; @@ -422,7 +405,7 @@ static Object boundedLruCacheWrapper(VirtualFrame frame, Node inliningTarget, Lr ObjectHashMap.GetNode getItem, ObjectHashMap.PutNode setItem, ObjectHashMap.RemoveNode popItem, - CallVarargsMethodNode callNode) { + CallNode callNode) { if (cachedItem != null) { assert cachedItem instanceof LruListElemObject : "cachedItem should be an LruListElemObject"; LruListElemObject link = (LruListElemObject) cachedItem; @@ -523,7 +506,7 @@ static Object boundedLruCacheWrapper(VirtualFrame frame, Node inliningTarget, Lr @Specialization(guards = "!self.isUncached()") static Object cachedLruCacheWrapper(VirtualFrame frame, LruCacheObject self, Object[] args, PKeyword[] kwds, @Bind("this") Node inliningTarget, - @Shared @Cached CallVarargsMethodNode callNode, + @Shared @Cached CallNode callNode, @Cached PyObjectHashNode hashNode, @Cached ObjectHashMap.GetNode getItem, @Cached ObjectHashMap.PutNode setItem, @@ -531,10 +514,9 @@ static Object cachedLruCacheWrapper(VirtualFrame frame, LruCacheObject self, Obj @Cached PyUnicodeCheckExactNode unicodeCheckExact, @Cached PyLongCheckExactNode longCheckExact, @Cached ObjectHashMap.RemoveNode popItem, - @Cached InlinedConditionProfile profile, - @Cached PythonObjectFactory factory) { + @Cached InlinedConditionProfile profile) { Object key = lruCacheMakeKey(self.kwdMark, args, kwds, self.typed, - inliningTarget, getClassNode, unicodeCheckExact, longCheckExact, factory); + inliningTarget, getClassNode, unicodeCheckExact, longCheckExact); long hash = hashNode.execute(frame, inliningTarget, key); Object cached = getItem.execute(frame, inliningTarget, self.cache, key, hash); if (profile.profile(inliningTarget, self.isInfinite())) { @@ -582,12 +564,11 @@ abstract static class GetNode extends DescrGetBuiltinNode { @Specialization static Object getmethod(LruCacheObject self, Object obj, @SuppressWarnings("unused") Object type, @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile objIsNoneProfile, - @Cached PythonObjectFactory factory) { + @Cached InlinedConditionProfile objIsNoneProfile) { if (objIsNoneProfile.profile(inliningTarget, obj instanceof PNone)) { return self; } - return factory.createMethod(obj, self); + return PFactory.createMethod(PythonLanguage.get(inliningTarget), obj, self); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/PPartial.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/PPartial.java index 9dfdb02743..7cc36b701b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/PPartial.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/PPartial.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,6 +40,7 @@ */ package com.oracle.graal.python.builtins.modules.functools; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageCopy; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageLen; import com.oracle.graal.python.builtins.objects.common.SequenceNodes; @@ -47,7 +48,7 @@ import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.object.Shape; @@ -76,9 +77,9 @@ public Object[] getArgs() { return args; } - public PTuple getArgsTuple(PythonObjectFactory factory) { + public PTuple getArgsTuple(PythonLanguage language) { if (argsTuple == null) { - this.argsTuple = factory.createTuple(args); + this.argsTuple = PFactory.createTuple(language, args); } return argsTuple; } @@ -92,16 +93,16 @@ public PDict getKw() { return kw; } - public PDict getOrCreateKw(PythonObjectFactory factory) { + public PDict getOrCreateKw(PythonLanguage language) { if (kw == null) { - kw = factory.createDict(); + kw = PFactory.createDict(language); } return kw; } - public PDict getKwCopy(Node inliningTarget, PythonObjectFactory factory, HashingStorageCopy copyNode) { + public PDict getKwCopy(Node inliningTarget, PythonLanguage language, HashingStorageCopy copyNode) { assert kw != null; - return factory.createDict(copyNode.execute(inliningTarget, kw.getDictStorage())); + return PFactory.createDict(language, copyNode.execute(inliningTarget, kw.getDictStorage())); } public boolean hasKw(Node inliningTarget, HashingStorageLen lenNode) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/PartialBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/PartialBuiltins.java index ec3601c9e1..88ae5ff4ab 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/PartialBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/functools/PartialBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,11 +45,8 @@ import static com.oracle.graal.python.nodes.ErrorMessages.S_ARG_MUST_BE_CALLABLE; import static com.oracle.graal.python.nodes.ErrorMessages.TYPE_S_TAKES_AT_LEAST_ONE_ARGUMENT; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___DICT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CLASS_GETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__; import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA_SPACE; import static com.oracle.graal.python.nodes.StringLiterals.T_ELLIPSIS; @@ -60,6 +57,10 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -80,6 +81,7 @@ import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.object.ObjectNodes; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyCallableCheckNode; import com.oracle.graal.python.lib.PyDictCheckExactNode; @@ -92,7 +94,7 @@ import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.argument.keywords.ExpandKeywordStarargsNode; import com.oracle.graal.python.nodes.builtins.TupleNodes; -import com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode; +import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; @@ -104,7 +106,7 @@ import com.oracle.graal.python.nodes.object.GetOrCreateDictNode; import com.oracle.graal.python.nodes.object.SetDictNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -141,16 +143,16 @@ public static Object[] getNewPartialArgs(PPartial partial, Object[] args, Node i return newArgs; } + public static final TpSlots SLOTS = PartialBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return PartialBuiltinsFactory.getFactories(); } // functools.partial(func, /, *args, **keywords) - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, varArgsMarker = true, takesVarArgs = true, // - takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PPartial, // - doc = "partial(func, *args, **keywords) - new function with partial application\n" + // - "of the given arguments and keywords.\n") + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "partial", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory public abstract static class PartialNewNode extends PythonBuiltinNode { protected boolean isPartialWithoutDict(Node inliningTarget, GetDictIfExistsNode getDict, Object[] args, HashingStorageLen lenNode, boolean withKwDict) { @@ -176,19 +178,20 @@ static Object createFromPartialWoDictWoKw(Object cls, Object[] args, PKeyword[] @Exclusive @Cached InlinedConditionProfile hasArgsProfile, @Exclusive @Cached InlinedConditionProfile hasKeywordsProfile, @Exclusive @SuppressWarnings("unused") @Cached HashingStorageLen lenNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { assert args[0] instanceof PPartial; final PPartial function = (PPartial) args[0]; Object[] funcArgs = getNewPartialArgs(function, args, inliningTarget, hasArgsProfile, 1); PDict funcKwDict; if (hasKeywordsProfile.profile(inliningTarget, keywords.length > 0)) { - funcKwDict = factory.createDict(keywords); + funcKwDict = PFactory.createDict(language, keywords); } else { - funcKwDict = factory.createDict(); + funcKwDict = PFactory.createDict(language); } - return factory.createPartial(cls, function.getFn(), funcArgs, funcKwDict); + return PFactory.createPartial(language, cls, getInstanceShape.execute(cls), function.getFn(), funcArgs, funcKwDict); } @Specialization(guards = {"atLeastOneArg(args)", "isPartialWithoutDict(inliningTarget, getDict, args, lenNode, true)", "!withKeywords(keywords)"}, limit = "1") @@ -198,11 +201,12 @@ static Object createFromPartialWoDictWKw(Object cls, Object[] args, @SuppressWar @Exclusive @Cached InlinedConditionProfile hasArgsProfile, @Exclusive @SuppressWarnings("unused") @Cached HashingStorageLen lenNode, @Exclusive @Cached HashingStorageCopy copyNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) { assert args[0] instanceof PPartial; final PPartial function = (PPartial) args[0]; Object[] funcArgs = getNewPartialArgs(function, args, inliningTarget, hasArgsProfile, 1); - return factory.createPartial(cls, function.getFn(), funcArgs, function.getKwCopy(inliningTarget, factory, copyNode)); + return PFactory.createPartial(language, cls, getInstanceShape.execute(cls), function.getFn(), funcArgs, function.getKwCopy(inliningTarget, language, copyNode)); } @Specialization(guards = {"atLeastOneArg(args)", "isPartialWithoutDict(inliningTarget, getDict, args, lenNode, true)", "withKeywords(keywords)"}, limit = "1") @@ -214,16 +218,17 @@ static Object createFromPartialWoDictWKwKw(VirtualFrame frame, Object cls, Objec @Exclusive @SuppressWarnings("unused") @Cached HashingStorageLen lenNode, @Exclusive @Cached HashingStorageCopy copyHashingStorageNode, @Cached HashingStorageAddAllToOther addAllToOtherNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) { assert args[0] instanceof PPartial; final PPartial function = (PPartial) args[0]; Object[] funcArgs = getNewPartialArgs(function, args, inliningTarget, hasArgsProfile, 1); HashingStorage storage = copyHashingStorageNode.execute(inliningTarget, function.getKw().getDictStorage()); - PDict result = factory.createDict(storage); + PDict result = PFactory.createDict(language, storage); addAllToOtherNode.execute(frame, inliningTarget, initNode.execute(frame, PNone.NO_VALUE, keywords), result); - return factory.createPartial(cls, function.getFn(), funcArgs, result); + return PFactory.createPartial(language, cls, getInstanceShape.execute(cls), function.getFn(), funcArgs, result); } @Specialization(guards = {"atLeastOneArg(args)", "!isPartialWithoutDict(getDict, args)"}, limit = "1") @@ -232,28 +237,29 @@ static Object createGeneric(Object cls, Object[] args, PKeyword[] keywords, @SuppressWarnings("unused") @Exclusive @Cached GetDictIfExistsNode getDict, @Exclusive @Cached InlinedConditionProfile hasKeywordsProfile, @Cached PyCallableCheckNode callableCheckNode, - @Shared @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Cached PRaiseNode raiseNode) { Object function = args[0]; if (!callableCheckNode.execute(inliningTarget, function)) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, S_ARG_MUST_BE_CALLABLE, "the first"); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, S_ARG_MUST_BE_CALLABLE, "the first"); } final Object[] funcArgs = PythonUtils.arrayCopyOfRange(args, 1, args.length); PDict funcKwDict; if (hasKeywordsProfile.profile(inliningTarget, keywords.length > 0)) { - funcKwDict = factory.createDict(keywords); + funcKwDict = PFactory.createDict(language, keywords); } else { - funcKwDict = factory.createDict(); + funcKwDict = PFactory.createDict(language); } - return factory.createPartial(cls, function, funcArgs, funcKwDict); + return PFactory.createPartial(language, cls, getInstanceShape.execute(cls), function, funcArgs, funcKwDict); } @Specialization(guards = "!atLeastOneArg(args)") @SuppressWarnings("unused") static Object noCallable(Object cls, Object[] args, PKeyword[] keywords, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, TYPE_S_TAKES_AT_LEAST_ONE_ARGUMENT, "partial"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, TYPE_S_TAKES_AT_LEAST_ONE_ARGUMENT, "partial"); } } @@ -271,8 +277,8 @@ static Object doGet(PPartial self) { public abstract static class PartialArgsNode extends PythonUnaryBuiltinNode { @Specialization static Object doGet(PPartial self, - @Cached PythonObjectFactory factory) { - return self.getArgsTuple(factory); + @Bind PythonLanguage language) { + return self.getArgsTuple(language); } } @@ -297,8 +303,8 @@ static Object setDict(PPartial self, PDict mapping, @Specialization(guards = {"!isNoValue(mapping)", "!isDict(mapping)"}) static Object setDict(@SuppressWarnings("unused") PPartial self, Object mapping, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, mapping); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, mapping); } } @@ -307,8 +313,8 @@ static Object setDict(@SuppressWarnings("unused") PPartial self, Object mapping, public abstract static class PartialKeywordsNode extends PythonUnaryBuiltinNode { @Specialization static Object doGet(PPartial self, - @Cached PythonObjectFactory factory) { - return self.getOrCreateKw(factory); + @Bind PythonLanguage language) { + return self.getOrCreateKw(language); } } @@ -321,7 +327,7 @@ static Object reduce(PPartial self, @Cached GetClassNode getClassNode, @Cached GetDictIfExistsNode getDictIfExistsNode, @Cached GetOrCreateDictNode getOrCreateDictNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { final PDict dict; if (self.getShape().getPropertyCount() > 0) { dict = getOrCreateDictNode.execute(inliningTarget, self); @@ -329,9 +335,9 @@ static Object reduce(PPartial self, dict = getDictIfExistsNode.execute(self); } final Object type = getClassNode.execute(inliningTarget, self); - final PTuple fnTuple = factory.createTuple(new Object[]{self.getFn()}); - final PTuple argsTuple = factory.createTuple(new Object[]{self.getFn(), self.getArgsTuple(factory), self.getKw(), (dict != null) ? dict : PNone.NONE}); - return factory.createTuple(new Object[]{type, fnTuple, argsTuple}); + final PTuple fnTuple = PFactory.createTuple(language, new Object[]{self.getFn()}); + final PTuple argsTuple = PFactory.createTuple(language, new Object[]{self.getFn(), self.getArgsTuple(language), self.getKw(), (dict != null) ? dict : PNone.NONE}); + return PFactory.createTuple(language, new Object[]{type, fnTuple, argsTuple}); } } @@ -352,10 +358,10 @@ static Object setState(VirtualFrame frame, PPartial self, PTuple state, @Cached PyTupleGetItem getItemNode, @Cached TupleNodes.ConstructTupleNode constructTupleNode, @Cached HashingStorageCopy copyStorageNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { if (state.getSequenceStorage().length() != 4) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, INVALID_PARTIAL_STATE); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, INVALID_PARTIAL_STATE); } final Object function = getItemNode.execute(inliningTarget, state, 0); @@ -366,7 +372,7 @@ static Object setState(VirtualFrame frame, PPartial self, PTuple state, if (!callableCheckNode.execute(inliningTarget, function) || !PGuards.isPTuple(fnArgs) || (fnKwargs != PNone.NONE && !PGuards.isDict(fnKwargs))) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, INVALID_PARTIAL_STATE); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, INVALID_PARTIAL_STATE); } self.setFn(function); @@ -381,9 +387,9 @@ static Object setState(VirtualFrame frame, PPartial self, PTuple state, final PDict fnKwargsDict; if (fnKwargs == PNone.NONE) { - fnKwargsDict = factory.createDict(); + fnKwargsDict = PFactory.createDict(language); } else if (!dictCheckExactNode.execute(inliningTarget, fnKwargs)) { - fnKwargsDict = factory.createDict(copyStorageNode.execute(inliningTarget, ((PDict) fnKwargs).getDictStorage())); + fnKwargsDict = PFactory.createDict(language, copyStorageNode.execute(inliningTarget, ((PDict) fnKwargs).getDictStorage())); } else { fnKwargsDict = (PDict) fnKwargs; } @@ -402,12 +408,13 @@ static Object setState(VirtualFrame frame, PPartial self, PTuple state, @Fallback @SuppressWarnings("unused") static Object fallback(Object self, Object state, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, INVALID_PARTIAL_STATE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, INVALID_PARTIAL_STATE); } } - @Builtin(name = J___CALL__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_call, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory protected abstract static class PartialCallNode extends PythonVarargsBuiltinNode { private static int indexOf(PKeyword[] keywords, PKeyword kw) { @@ -427,7 +434,7 @@ protected boolean withKeywords(PKeyword[] keywords) { static Object callWoDict(VirtualFrame frame, PPartial self, Object[] args, PKeyword[] keywords, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile hasArgsProfile, - @Shared @Cached CallVarargsMethodNode callNode, + @Shared @Cached CallNode callNode, @SuppressWarnings("unused") @Shared @Cached HashingStorageLen lenNode) { Object[] callArgs = getNewPartialArgs(self, args, inliningTarget, hasArgsProfile); return callNode.execute(frame, self.getFn(), callArgs, keywords); @@ -438,7 +445,7 @@ static Object callWDictWoKw(VirtualFrame frame, PPartial self, Object[] args, @S @Bind("this") Node inliningTarget, @Shared @Cached ExpandKeywordStarargsNode starargsNode, @Shared @Cached InlinedConditionProfile hasArgsProfile, - @Shared @Cached CallVarargsMethodNode callNode, + @Shared @Cached CallNode callNode, @SuppressWarnings("unused") @Shared @Cached HashingStorageLen lenNode) { Object[] callArgs = getNewPartialArgs(self, args, inliningTarget, hasArgsProfile); return callNode.execute(frame, self.getFn(), callArgs, starargsNode.execute(inliningTarget, self.getKw())); @@ -449,7 +456,7 @@ static Object callWDictWKw(VirtualFrame frame, PPartial self, Object[] args, PKe @Bind("this") Node inliningTarget, @Shared @Cached ExpandKeywordStarargsNode starargsNode, @Shared @Cached InlinedConditionProfile hasArgsProfile, - @Shared @Cached CallVarargsMethodNode callNode, + @Shared @Cached CallNode callNode, @SuppressWarnings("unused") @Shared @Cached HashingStorageLen lenNode) { Object[] callArgs = getNewPartialArgs(self, args, inliningTarget, hasArgsProfile); @@ -473,7 +480,7 @@ static Object callWDictWKw(VirtualFrame frame, PPartial self, Object[] args, PKe } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class PartialReprNode extends PythonUnaryBuiltinNode { private static void reprArgs(VirtualFrame frame, Node inliningTarget, PPartial partial, TruffleStringBuilder sb, PyObjectReprAsTruffleStringNode reprNode, @@ -544,8 +551,8 @@ public static TruffleString repr(VirtualFrame frame, PPartial partial, public abstract static class ClassGetItemNode extends PythonBinaryBuiltinNode { @Specialization static Object classGetItem(Object cls, Object key, - @Cached PythonObjectFactory factory) { - return factory.createGenericAlias(cls, key); + @Bind PythonLanguage language) { + return PFactory.createGenericAlias(language, cls, key); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Blake2ModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Blake2ModuleBuiltins.java index 7cef0d745d..019e8a53a2 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Blake2ModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Blake2ModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,33 +40,14 @@ */ package com.oracle.graal.python.builtins.modules.hashlib; +import java.util.Collections; import java.util.List; -import com.oracle.graal.python.annotations.ArgumentClinic; -import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.modules.hashlib.Blake2ModuleBuiltinsClinicProviders.BlakeNodeClinicProviderGen; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Fallback; -import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; @CoreFunctions(defineModule = "_blake2") public final class Blake2ModuleBuiltins extends PythonBuiltins { @@ -82,7 +63,7 @@ public final class Blake2ModuleBuiltins extends PythonBuiltins { @Override protected List> getNodeFactories() { - return Blake2ModuleBuiltinsFactory.getFactories(); + return Collections.emptyList(); } @Override @@ -98,74 +79,4 @@ public void initialize(Python3Core core) { super.initialize(core); } - - @Builtin(name = "blake2b", declaresExplicitSelf = true, minNumOfPositionalArgs = 1, parameterNames = {"$cls", "data"}, keywordOnlyNames = {"digest_size", "key", "salt", "person", "fanout", - "depth", "leaf_size", "node_offset", "node_depth", "inner_size", "last_node", - "usedforsecurity"}, constructsClass = PythonBuiltinClassType.Blake2bType) - @Builtin(name = "blake2s", declaresExplicitSelf = true, minNumOfPositionalArgs = 1, parameterNames = {"$cls", "data"}, keywordOnlyNames = {"digest_size", "key", "salt", "person", "fanout", - "depth", "leaf_size", "node_offset", "node_depth", "inner_size", "last_node", - "usedforsecurity"}, constructsClass = PythonBuiltinClassType.Blake2sType) - @ArgumentClinic(name = "digest_size", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "0") - @ArgumentClinic(name = "key", conversion = ArgumentClinic.ClinicConversion.ReadableBuffer, defaultValue = "PNone.NONE") - @ArgumentClinic(name = "salt", conversion = ArgumentClinic.ClinicConversion.ReadableBuffer, defaultValue = "PNone.NONE") - @ArgumentClinic(name = "person", conversion = ArgumentClinic.ClinicConversion.ReadableBuffer, defaultValue = "PNone.NONE") - @ArgumentClinic(name = "fanout", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "1") - @ArgumentClinic(name = "depth", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "1") - @ArgumentClinic(name = "leaf_size", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "0") - @ArgumentClinic(name = "node_offset", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "0") - @ArgumentClinic(name = "node_depth", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "0") - @ArgumentClinic(name = "inner_size", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "0") - @ArgumentClinic(name = "last_node", conversion = ArgumentClinic.ClinicConversion.Boolean, defaultValue = "false") - @ArgumentClinic(name = "usedforsecurity", conversion = ArgumentClinic.ClinicConversion.Boolean, defaultValue = "true") - @GenerateNodeFactory - abstract static class BlakeNode extends PythonClinicBuiltinNode { - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return BlakeNodeClinicProviderGen.INSTANCE; - } - - @Specialization - static Object newDigest(VirtualFrame frame, Object type, Object data, int digestSize, - PNone key, PNone salt, PNone person, int fanout, int depth, int leafSize, int nodeOffset, int nodeDepth, int innerSize, boolean lastNode, boolean usedforsecurity, - @Bind("this") Node inliningTarget, - @Cached HashlibModuleBuiltins.CreateDigestNode createNode, - @Cached PRaiseNode.Lazy raiseNode) { - if (fanout != 1 || depth != 1 || leafSize != 0 || nodeOffset != 0 || nodeDepth != 0 || innerSize != 0 || lastNode) { - throw fail(frame, type, data, digestSize, key, salt, person, fanout, depth, leafSize, nodeOffset, nodeDepth, innerSize, lastNode, usedforsecurity, raiseNode.get(inliningTarget)); - } - PythonBuiltinClassType resultType = null; - if (type instanceof PythonBuiltinClass builtinType) { - resultType = builtinType.getType(); - } else if (type instanceof PythonBuiltinClassType enumType) { - resultType = enumType; - } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.WRONG_TYPE); - } - String javaName; - String pythonName; - int javaDigestSize; - if (resultType == PythonBuiltinClassType.Blake2bType) { - javaName = "BLAKE2B-%d"; - pythonName = "blake2b"; - javaDigestSize = digestSize == 0 ? 512 : digestSize; - } else if (resultType == PythonBuiltinClassType.Blake2sType) { - javaName = "BLAKE2S-%d"; - pythonName = "blake2s"; - javaDigestSize = digestSize == 0 ? 256 : digestSize; - } else { - throw CompilerDirectives.shouldNotReachHere(); - } - javaName = PythonUtils.formatJString(javaName, javaDigestSize); - return createNode.execute(frame, inliningTarget, resultType, pythonName, javaName, data); - } - - @SuppressWarnings("unused") - @Fallback - static PException fail(VirtualFrame frame, Object type, Object data, Object digestSize, - Object key, Object salt, Object person, Object fanout, Object depth, Object leafSize, Object nodeOffset, Object nodeDepth, Object innerSize, Object lastNode, - Object usedforsecurity, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.ValueError, ErrorMessages.ONLY_DIGEST_SIZE_BLAKE_ARGUMENT); - } - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Blake2bObjectBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Blake2bObjectBuiltins.java index 4dda12bda0..bc5de92f4a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Blake2bObjectBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Blake2bObjectBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,15 +43,39 @@ import java.util.ArrayList; import java.util.List; +import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.graal.python.util.PythonUtils; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; -@CoreFunctions(extendClasses = {PythonBuiltinClassType.Blake2bType}) +@CoreFunctions(extendClasses = {PythonBuiltinClassType.Blake2bType, PythonBuiltinClassType.Blake2sType}) public final class Blake2bObjectBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = Blake2bObjectBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return new ArrayList<>(); @@ -63,6 +87,77 @@ public void initialize(Python3Core core) { addBuiltinConstant("PERSON_SIZE", Blake2ModuleBuiltins.BLAKE2B_PERSONALBYTES); addBuiltinConstant("MAX_KEY_SIZE", Blake2ModuleBuiltins.BLAKE2B_KEYBYTES); addBuiltinConstant("MAX_DIGEST_SIZE", Blake2ModuleBuiltins.BLAKE2B_OUTBYTES); + addBuiltinConstant("SALT_SIZE", Blake2ModuleBuiltins.BLAKE2S_SALTBYTES); + addBuiltinConstant("PERSON_SIZE", Blake2ModuleBuiltins.BLAKE2S_PERSONALBYTES); + addBuiltinConstant("MAX_KEY_SIZE", Blake2ModuleBuiltins.BLAKE2S_KEYBYTES); + addBuiltinConstant("MAX_DIGEST_SIZE", Blake2ModuleBuiltins.BLAKE2S_OUTBYTES); super.initialize(core); } + + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "blake2b", minNumOfPositionalArgs = 1, parameterNames = {"$cls", "data"}, keywordOnlyNames = {"digest_size", "key", "salt", "person", "fanout", + "depth", "leaf_size", "node_offset", "node_depth", "inner_size", "last_node", "usedforsecurity"}) + @ArgumentClinic(name = "digest_size", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "0") + @ArgumentClinic(name = "key", conversion = ArgumentClinic.ClinicConversion.ReadableBuffer, defaultValue = "PNone.NONE") + @ArgumentClinic(name = "salt", conversion = ArgumentClinic.ClinicConversion.ReadableBuffer, defaultValue = "PNone.NONE") + @ArgumentClinic(name = "person", conversion = ArgumentClinic.ClinicConversion.ReadableBuffer, defaultValue = "PNone.NONE") + @ArgumentClinic(name = "fanout", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "1") + @ArgumentClinic(name = "depth", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "1") + @ArgumentClinic(name = "leaf_size", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "0") + @ArgumentClinic(name = "node_offset", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "0") + @ArgumentClinic(name = "node_depth", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "0") + @ArgumentClinic(name = "inner_size", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "0") + @ArgumentClinic(name = "last_node", conversion = ArgumentClinic.ClinicConversion.Boolean, defaultValue = "false") + @ArgumentClinic(name = "usedforsecurity", conversion = ArgumentClinic.ClinicConversion.Boolean, defaultValue = "true") + @GenerateNodeFactory + abstract static class BlakeNode extends PythonClinicBuiltinNode { + @Override + protected ArgumentClinicProvider getArgumentClinic() { + return Blake2bObjectBuiltinsClinicProviders.BlakeNodeClinicProviderGen.INSTANCE; + } + + @Specialization + static Object newDigest(VirtualFrame frame, Object type, Object data, int digestSize, + PNone key, PNone salt, PNone person, int fanout, int depth, int leafSize, int nodeOffset, int nodeDepth, int innerSize, boolean lastNode, boolean usedforsecurity, + @Bind("this") Node inliningTarget, + @Cached HashlibModuleBuiltins.CreateDigestNode createNode, + @Cached PRaiseNode raiseNode) { + if (fanout != 1 || depth != 1 || leafSize != 0 || nodeOffset != 0 || nodeDepth != 0 || innerSize != 0 || lastNode) { + throw fail(frame, type, data, digestSize, key, salt, person, fanout, depth, leafSize, nodeOffset, nodeDepth, innerSize, lastNode, usedforsecurity, raiseNode); + } + PythonBuiltinClassType resultType = null; + if (type instanceof PythonBuiltinClass builtinType) { + resultType = builtinType.getType(); + } else if (type instanceof PythonBuiltinClassType enumType) { + resultType = enumType; + } else { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.WRONG_TYPE); + } + String javaName; + String pythonName; + int javaDigestSize; + if (resultType == PythonBuiltinClassType.Blake2bType) { + javaName = "BLAKE2B-%d"; + pythonName = "blake2b"; + javaDigestSize = digestSize == 0 ? 512 : digestSize; + } else if (resultType == PythonBuiltinClassType.Blake2sType) { + javaName = "BLAKE2S-%d"; + pythonName = "blake2s"; + javaDigestSize = digestSize == 0 ? 256 : digestSize; + } else { + throw CompilerDirectives.shouldNotReachHere(); + } + javaName = PythonUtils.formatJString(javaName, javaDigestSize); + return createNode.execute(frame, inliningTarget, resultType, pythonName, javaName, data); + } + + @SuppressWarnings("unused") + @Fallback + static PException fail(VirtualFrame frame, Object type, Object data, Object digestSize, + Object key, Object salt, Object person, Object fanout, Object depth, Object leafSize, Object nodeOffset, Object nodeDepth, Object innerSize, Object lastNode, + Object usedforsecurity, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.ONLY_DIGEST_SIZE_BLAKE_ARGUMENT); + } + } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Blake2sObjectBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Blake2sObjectBuiltins.java deleted file mode 100644 index ec1e03d919..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Blake2sObjectBuiltins.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.modules.hashlib; - -import java.util.ArrayList; -import java.util.List; - -import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.truffle.api.dsl.NodeFactory; - -@CoreFunctions(extendClasses = {PythonBuiltinClassType.Blake2sType}) -public final class Blake2sObjectBuiltins extends PythonBuiltins { - @Override - protected List> getNodeFactories() { - return new ArrayList<>(); - } - - @Override - public void initialize(Python3Core core) { - addBuiltinConstant("SALT_SIZE", Blake2ModuleBuiltins.BLAKE2S_SALTBYTES); - addBuiltinConstant("PERSON_SIZE", Blake2ModuleBuiltins.BLAKE2S_PERSONALBYTES); - addBuiltinConstant("MAX_KEY_SIZE", Blake2ModuleBuiltins.BLAKE2S_KEYBYTES); - addBuiltinConstant("MAX_DIGEST_SIZE", Blake2ModuleBuiltins.BLAKE2S_OUTBYTES); - super.initialize(core); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/DigestObject.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/DigestObject.java index 38f3faef1e..180a253237 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/DigestObject.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/DigestObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,9 +44,10 @@ import javax.crypto.Mac; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.object.Shape; @@ -199,7 +200,7 @@ private PythonBuiltinClassType determineMainDigestType() { */ abstract void update(byte[] data, int length); - abstract DigestObject copy(PythonObjectFactory factory) throws CloneNotSupportedException; + abstract DigestObject copy() throws CloneNotSupportedException; abstract int getDigestLength(); @@ -263,8 +264,8 @@ private static final class MessageDigestObject extends DigestObjectBase { @Override @TruffleBoundary - DigestObject copy(PythonObjectFactory factory) throws CloneNotSupportedException { - return factory.createDigestObject(getType(), getAlgorithm(), digest.clone()); + DigestObject copy() throws CloneNotSupportedException { + return PFactory.createDigestObject(PythonLanguage.get(null), getType(), getAlgorithm(), digest.clone()); } @Override @@ -302,8 +303,8 @@ private static final class MacDigestObject extends DigestObjectBase { @Override @TruffleBoundary - DigestObject copy(PythonObjectFactory factory) throws CloneNotSupportedException { - return factory.createDigestObject(getType(), getAlgorithm(), mac.clone()); + DigestObject copy() throws CloneNotSupportedException { + return PFactory.createDigestObject(PythonLanguage.get(null), getType(), getAlgorithm(), mac.clone()); } @Override diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/DigestObjectBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/DigestObjectBuiltins.java index 80ed174aa8..7cb16c038e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/DigestObjectBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/DigestObjectBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,6 +42,7 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; @@ -59,7 +60,7 @@ import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.runtime.IndirectCallData; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; @@ -89,12 +90,11 @@ abstract static class CopyNode extends PythonUnaryBuiltinNode { @Specialization static DigestObject copy(DigestObject self, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { - return self.copy(factory); + return self.copy(); } catch (CloneNotSupportedException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError); } } } @@ -104,8 +104,8 @@ static DigestObject copy(DigestObject self, abstract static class DigestNode extends PythonUnaryBuiltinNode { @Specialization static PBytes digest(DigestObject self, - @Cached PythonObjectFactory factory) { - return factory.createBytes(self.digest()); + @Bind PythonLanguage language) { + return PFactory.createBytes(language, self.digest()); } } @@ -135,9 +135,9 @@ static PNone update(VirtualFrame frame, DigestObject self, Object buffer, @Bind("this") Node inliningTarget, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (self.wasReset()) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.UPDATING_FINALIZED_DIGEST_IS_NOT_SUPPORTED); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.UPDATING_FINALIZED_DIGEST_IS_NOT_SUPPORTED); } try { self.update(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer)); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/HashObjectBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/HashObjectBuiltins.java index f957622dfb..379ab1561c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/HashObjectBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/HashObjectBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,14 +42,15 @@ import java.util.List; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; import com.oracle.graal.python.builtins.objects.object.ObjectNodes.GetFullyQualifiedClassNameNode; import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; -import com.oracle.graal.python.nodes.SpecialMethodNames; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.truffle.api.dsl.Bind; @@ -63,12 +64,15 @@ @CoreFunctions(extendClasses = {PythonBuiltinClassType.HashlibHash, PythonBuiltinClassType.HashlibHmac}) public final class HashObjectBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = HashObjectBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return HashObjectBuiltinsFactory.getFactories(); } - @Builtin(name = SpecialMethodNames.J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/HashlibModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/HashlibModuleBuiltins.java index 0ff93cf187..473590e5d6 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/HashlibModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/HashlibModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,6 +45,10 @@ import static com.oracle.graal.python.nodes.BuiltinNames.J_SHA3; import static com.oracle.graal.python.nodes.BuiltinNames.T_HASHLIB; import static com.oracle.graal.python.nodes.BuiltinNames.T_SHA3; +import static com.oracle.graal.python.nodes.ErrorMessages.ITERATION_VALUE_IS_TOO_GREAT; +import static com.oracle.graal.python.nodes.ErrorMessages.ITERATION_VALUE_MUST_BE_GREATER_THAN_ZERO; +import static com.oracle.graal.python.nodes.ErrorMessages.KEY_LENGTH_MUST_BE_GREATER_THAN_ZERO; +import static com.oracle.graal.python.nodes.ErrorMessages.UNSUPPORTED_HASH_TYPE; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; @@ -60,6 +64,13 @@ import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; +import org.bouncycastle.crypto.CipherParameters; +import org.bouncycastle.crypto.Digest; +import org.bouncycastle.crypto.generators.PKCS5S2ParametersGenerator; +import org.bouncycastle.crypto.params.KeyParameter; +import org.bouncycastle.jcajce.provider.util.DigestFactory; + +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; @@ -67,6 +78,7 @@ import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.modules.hashlib.HashlibModuleBuiltinsClinicProviders.NewNodeClinicProviderGen; +import com.oracle.graal.python.builtins.modules.hashlib.HashlibModuleBuiltinsClinicProviders.Pbkdf2HmacNodeClinicProviderGen; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary; @@ -74,7 +86,9 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.builtins.objects.ssl.CertUtils; +import com.oracle.graal.python.lib.PyLongAsLongNode; import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromPythonObjectNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; @@ -87,7 +101,8 @@ import com.oracle.graal.python.nodes.util.CastToJavaStringNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.IndirectCallData; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -102,6 +117,7 @@ import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.strings.TruffleString.CodeRange; @@ -156,12 +172,13 @@ protected List> getNodeFa public void initialize(Python3Core core) { EconomicMapStorage algos = EconomicMapStorage.create(DIGEST_ALGORITHMS.length); for (var digest : DIGEST_ALGORITHMS) { - algos.putUncachedWithJavaEq(digest, PNone.NONE); + algos.putUncached(digest, PNone.NONE); } - addBuiltinConstant("openssl_md_meth_names", core.factory().createFrozenSet(algos)); + PythonLanguage language = core.getLanguage(); + addBuiltinConstant("openssl_md_meth_names", PFactory.createFrozenSet(language, algos)); EconomicMapStorage storage = EconomicMapStorage.create(); - addBuiltinConstant(J_CONSTRUCTORS, core.factory().createMappingproxy(core.factory().createDict(storage))); + addBuiltinConstant(J_CONSTRUCTORS, PFactory.createMappingproxy(language, PFactory.createDict(language, storage))); core.lookupBuiltinModule(T_HASHLIB).setModuleState(storage); super.initialize(core); } @@ -199,13 +216,13 @@ static Object cmpStrings(Object a, Object b, @Cached TruffleString.GetCodeRangeNode getCodeRangeNode, @Cached CastToTruffleStringNode castA, @Cached CastToTruffleStringNode castB, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { TruffleString tsA = castA.execute(inliningTarget, a); TruffleString tsB = castB.execute(inliningTarget, b); CodeRange crA = getCodeRangeNode.execute(tsA, TS_ENCODING); CodeRange crB = getCodeRangeNode.execute(tsB, TS_ENCODING); if (!(crA.isSubsetOf(CodeRange.ASCII) && crB.isSubsetOf(CodeRange.ASCII))) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.COMPARING_STRINGS_WITH_NON_ASCII); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.COMPARING_STRINGS_WITH_NON_ASCII); } byte[] bytesA = getByteArrayNode.execute(tsA, TS_ENCODING); byte[] bytesB = getByteArrayNode.execute(castB.execute(inliningTarget, b), TS_ENCODING); @@ -218,7 +235,7 @@ static boolean cmpBuffers(VirtualFrame frame, Object a, Object b, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary accessLib, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (acquireLib.hasBuffer(a) && acquireLib.hasBuffer(b)) { Object bufferA = acquireLib.acquireReadonly(a, frame, indirectCallData); try { @@ -234,7 +251,7 @@ static boolean cmpBuffers(VirtualFrame frame, Object a, Object b, accessLib.release(bufferA, frame, indirectCallData); } } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_OR_COMBINATION_OF_TYPES, a, b); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_OR_COMBINATION_OF_TYPES, a, b); } } @@ -252,10 +269,10 @@ static Object hmacDigest(VirtualFrame frame, PythonModule self, Object key, Obje @Bind("this") Node inliningTarget, @Cached HmacNewNode newNode, @Cached DigestObjectBuiltins.DigestNode digestNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (msg instanceof PNone) { // hmac_digest is a bit more strict - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, msg); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, msg); } Object hmacObject = newNode.execute(frame, self, key, msg, digest); return digestNode.execute(frame, hmacObject); @@ -270,8 +287,8 @@ abstract static class HmacNewNode extends PythonQuaternaryBuiltinNode { @SuppressWarnings("unused") @Specialization static Object hmacNewError(PythonModule self, Object key, Object msg, PNone digest, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.MISSING_D_REQUIRED_S_ARGUMENT_S_POS, "hmac_new", "digestmod", 3); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.MISSING_D_REQUIRED_S_ARGUMENT_S_POS, "hmac_new", "digestmod", 3); } @Specialization(guards = "!isString(digestmod)") @@ -283,16 +300,15 @@ static Object hmacNewFromFunction(VirtualFrame frame, PythonModule self, Object @Shared("concatStr") @Cached TruffleString.ConcatNode concatStr, @Shared("acquireLib") @CachedLibrary(limit = "2") PythonBufferAcquireLibrary acquireLib, @Shared("bufferLib") @CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { // cast guaranteed in our initialize EconomicMapStorage constructors = self.getModuleState(EconomicMapStorage.class); Object name = getItemNode.execute(frame, inliningTarget, constructors, digestmod); if (name != null) { assert name instanceof TruffleString; // guaranteed in our initialize - return hmacNew(self, key, msg, name, inliningTarget, castStr, castJStr, concatStr, acquireLib, bufferLib, factory, raiseNode); + return hmacNew(self, key, msg, name, inliningTarget, castStr, castJStr, concatStr, acquireLib, bufferLib, raiseNode); } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.UnsupportedDigestmodError); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.UnsupportedDigestmodError); } } @@ -304,12 +320,11 @@ static Object hmacNew(@SuppressWarnings("unused") PythonModule self, Object keyO @Shared("concatStr") @Cached TruffleString.ConcatNode concatStr, @Shared("acquireLib") @CachedLibrary(limit = "2") PythonBufferAcquireLibrary acquireLib, @Shared("bufferLib") @CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { TruffleString digestmod = castStr.execute(inliningTarget, digestmodObj); Object key; if (!acquireLib.hasBuffer(keyObj)) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, keyObj); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, keyObj); } else { key = acquireLib.acquireReadonly(keyObj); } @@ -320,15 +335,16 @@ static Object hmacNew(@SuppressWarnings("unused") PythonModule self, Object keyO } else if (acquireLib.hasBuffer(msgObj)) { msg = acquireLib.acquireReadonly(msgObj); } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, msgObj); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, msgObj); } try { byte[] msgBytes = msg == null ? null : bufferLib.getInternalOrCopiedByteArray(msg); int msgLen = msg == null ? 0 : bufferLib.getBufferLength(msg); Mac mac = createMac(digestmod, bufferLib.getInternalOrCopiedByteArray(key), bufferLib.getBufferLength(key), msgBytes, msgLen); - return factory.createDigestObject(PythonBuiltinClassType.HashlibHmac, castJStr.execute(concatStr.execute(HMAC_PREFIX, digestmod, TS_ENCODING, true)), mac); + return PFactory.createDigestObject(PythonLanguage.get(inliningTarget), PythonBuiltinClassType.HashlibHmac, + castJStr.execute(concatStr.execute(HMAC_PREFIX, digestmod, TS_ENCODING, true)), mac); } catch (InvalidKeyException | NoSuchAlgorithmException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.UnsupportedDigestmodError, e); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.UnsupportedDigestmodError, e); } finally { if (msg != null) { bufferLib.release(msg); @@ -362,17 +378,16 @@ abstract static class CreateDigestNode extends Node { @Specialization static Object doIt(VirtualFrame frame, Node inliningTarget, PythonBuiltinClassType type, String pythonName, String javaName, Object value, @Cached("createFor(this)") IndirectCallData indirectCallData, - @Cached(inline = false) PythonObjectFactory factory, @CachedLibrary(limit = "2") PythonBufferAcquireLibrary acquireLib, @CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib, - @Cached PRaiseNode.Lazy raise) { + @Cached PRaiseNode raise) { Object buffer; if (value instanceof PNone) { buffer = null; } else if (acquireLib.hasBuffer(value)) { buffer = acquireLib.acquireReadonly(value, frame, indirectCallData); } else { - throw raise.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, value); + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, value); } try { byte[] bytes = buffer == null ? null : bufferLib.getInternalOrCopiedByteArray(buffer); @@ -381,9 +396,9 @@ static Object doIt(VirtualFrame frame, Node inliningTarget, PythonBuiltinClassTy try { digest = createDigest(javaName, bytes, bytesLen); } catch (NoSuchAlgorithmException e) { - throw raise.get(inliningTarget).raise(PythonBuiltinClassType.UnsupportedDigestmodError, e); + throw raise.raise(inliningTarget, PythonBuiltinClassType.UnsupportedDigestmodError, e); } - return factory.createDigestObject(type, pythonName, digest); + return PFactory.createDigestObject(PythonLanguage.get(inliningTarget), type, pythonName, digest); } finally { if (buffer != null) { bufferLib.release(buffer, frame, indirectCallData); @@ -452,36 +467,76 @@ static int getFips() { } } - @Builtin(name = "HASH", takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.HashlibHash, isPublic = false) + @Builtin(name = "pbkdf2_hmac", minNumOfPositionalArgs = 4, parameterNames = {"hash_name", "password", "salt", "iterations", "dklen"}) @GenerateNodeFactory - abstract static class HashNode extends PythonBuiltinNode { - @Specialization - @SuppressWarnings("unused") - static Object hash(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, "_hashlib.HASH"); + @ArgumentClinic(name = "hash_name", conversion = ArgumentClinic.ClinicConversion.TString) + @ArgumentClinic(name = "password", conversion = ArgumentClinic.ClinicConversion.ReadableBuffer) + @ArgumentClinic(name = "salt", conversion = ArgumentClinic.ClinicConversion.ReadableBuffer) + @ArgumentClinic(name = "iterations", conversion = ArgumentClinic.ClinicConversion.Long) + abstract static class Pbkdf2HmacNode extends PythonClinicBuiltinNode { + @Override + protected ArgumentClinicProvider getArgumentClinic() { + return Pbkdf2HmacNodeClinicProviderGen.INSTANCE; } - } - @Builtin(name = "HASHXOF", takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.HashlibHashXof, isPublic = false) - @GenerateNodeFactory - abstract static class HashXofNode extends PythonBuiltinNode { - @Specialization - @SuppressWarnings("unused") - static Object hash(Object args, Object kwargs, + @Specialization(limit = "3") + static Object pbkdf2(VirtualFrame frame, TruffleString hashName, Object password, Object salt, long iterations, Object dklenObj, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @CachedLibrary("password") PythonBufferAccessLibrary passwordLib, + @CachedLibrary("salt") PythonBufferAccessLibrary saltLib, + @Cached PyLongAsLongNode asLongNode, + @Cached InlinedConditionProfile noDklenProfile, + @Cached TruffleString.ToJavaStringNode toJavaStringNode, @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, "_hashlib.HASHXOF"); + try { + Digest digest = getDigest(toJavaStringNode.execute(hashName)); + if (digest == null) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.UnsupportedDigestmodError, UNSUPPORTED_HASH_TYPE, hashName); + } + if (iterations < 1) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ITERATION_VALUE_MUST_BE_GREATER_THAN_ZERO); + } + if (iterations > Integer.MAX_VALUE) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.OverflowError, ITERATION_VALUE_IS_TOO_GREAT); + } + long dklen; + if (noDklenProfile.profile(inliningTarget, PGuards.isPNone(dklenObj))) { + dklen = digest.getDigestSize(); + } else { + dklen = asLongNode.execute(frame, inliningTarget, dklenObj); + } + dklen *= Byte.SIZE; + if (dklen < 1) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, KEY_LENGTH_MUST_BE_GREATER_THAN_ZERO); + } + if (dklen > Integer.MAX_VALUE) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.OverflowError, ITERATION_VALUE_IS_TOO_GREAT); + } + byte[] passwordBytes = passwordLib.getInternalOrCopiedExactByteArray(password); + byte[] saltBytes = saltLib.getInternalOrCopiedExactByteArray(salt); + return PFactory.createBytes(language, generate(digest, passwordBytes, saltBytes, (int) iterations, (int) dklen)); + } finally { + passwordLib.release(password); + saltLib.release(salt); + } } - } - @Builtin(name = "HMAC", takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.HashlibHmac, isPublic = false) - @GenerateNodeFactory - abstract static class HmacNode extends PythonBuiltinNode { - @Specialization - @SuppressWarnings("unused") - static Object hash(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, "_hashlib.HMAC"); + @TruffleBoundary + private static Digest getDigest(String name) { + name = name.toLowerCase(); + return DigestFactory.getDigest(NAME_MAPPINGS.getOrDefault(name, name)); + } + + @TruffleBoundary + private static byte[] generate(Digest digest, byte[] password, byte[] salt, int iterations, int dklen) { + PKCS5S2ParametersGenerator generator = new PKCS5S2ParametersGenerator(digest); + generator.init(password, salt, iterations); + CipherParameters cipherParameters = generator.generateDerivedParameters(dklen); + if (!(cipherParameters instanceof KeyParameter keyParameter)) { + throw CompilerDirectives.shouldNotReachHere("unexpected cipher parameters"); + } + return keyParameter.getKey(); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Md5ModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Md5ModuleBuiltins.java index 4dd0f06807..1f11399004 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Md5ModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Md5ModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,8 +46,6 @@ import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.truffle.api.dsl.Bind; @@ -75,15 +73,4 @@ static Object newDigest(VirtualFrame frame, Object buffer, @SuppressWarnings("un return createNode.execute(frame, inliningTarget, PythonBuiltinClassType.MD5Type, "md5", "md5", buffer); } } - - @Builtin(name = "md5", takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.MD5Type, isPublic = false) - @GenerateNodeFactory - abstract static class Md5Node extends PythonBuiltinNode { - @Specialization - @SuppressWarnings("unused") - static Object md5(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, "_md5.md5"); - } - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha1ModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha1ModuleBuiltins.java index 98e8ef5064..df59db9b2c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha1ModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha1ModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,8 +46,6 @@ import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.truffle.api.dsl.Bind; @@ -75,15 +73,4 @@ static Object newDigest(VirtualFrame frame, Object buffer, @SuppressWarnings("un return createNode.execute(frame, inliningTarget, PythonBuiltinClassType.SHA1Type, "sha1", "sha1", buffer); } } - - @Builtin(name = "sha1", takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.SHA1Type, isPublic = false) - @GenerateNodeFactory - abstract static class Sha1Node extends PythonBuiltinNode { - @Specialization - @SuppressWarnings("unused") - static Object sha1(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, "_sha1.sha1"); - } - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha256ModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha256ModuleBuiltins.java index 738dfd11c0..08f4c10503 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha256ModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha256ModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,8 +46,6 @@ import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.truffle.api.dsl.Bind; @@ -86,26 +84,4 @@ static Object newDigest(VirtualFrame frame, Object buffer, @SuppressWarnings("un return createNode.execute(frame, inliningTarget, PythonBuiltinClassType.SHA256Type, "sha256", "sha256", buffer); } } - - @Builtin(name = "sha224", takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.SHA224Type, isPublic = false) - @GenerateNodeFactory - abstract static class Sha224Node extends PythonBuiltinNode { - @Specialization - @SuppressWarnings("unused") - static Object sha224(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, "_sha256.sha224"); - } - } - - @Builtin(name = "sha256", takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.SHA256Type, isPublic = false) - @GenerateNodeFactory - abstract static class Sha256Node extends PythonBuiltinNode { - @Specialization - @SuppressWarnings("unused") - static Object sha256(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, "_sha256.sha256"); - } - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha3Builtins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha3Builtins.java new file mode 100644 index 0000000000..f27ee6bc67 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha3Builtins.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.builtins.modules.hashlib; + +import java.util.Collections; +import java.util.List; + +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.builtins.CoreFunctions; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinNode; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@CoreFunctions(extendClasses = { + PythonBuiltinClassType.Sha3SHA224Type, + PythonBuiltinClassType.Sha3SHA256Type, + PythonBuiltinClassType.Sha3SHA384Type, + PythonBuiltinClassType.Sha3SHA512Type, + PythonBuiltinClassType.Sha3Shake128Type, + PythonBuiltinClassType.Sha3Shake256Type, +}) +public class Sha3Builtins extends PythonBuiltins { + + public static final TpSlots SLOTS = Sha3BuiltinsSlotsGen.SLOTS; + + @Override + protected List> getNodeFactories() { + return Collections.emptyList(); + } + + @Slot(value = Slot.SlotKind.tp_new, isComplex = true) + @Slot.SlotSignature(minNumOfPositionalArgs = 1, parameterNames = {"$cls", "string"}, keywordOnlyNames = {"usedforsecurity"}) + @GenerateNodeFactory + abstract static class ShaNode extends PythonBuiltinNode { + @Specialization + static Object newDigest(VirtualFrame frame, Object type, Object buffer, @SuppressWarnings("unused") Object usedForSecurity, + @Bind("this") Node inliningTarget, + @Cached HashlibModuleBuiltins.CreateDigestNode createNode, + @Cached PRaiseNode raiseNode) { + PythonBuiltinClassType resultType; + if (type instanceof PythonBuiltinClass builtinType) { + resultType = builtinType.getType(); + } else if (type instanceof PythonBuiltinClassType enumType) { + resultType = enumType; + } else { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.WRONG_TYPE); + } + return createNode.execute(frame, inliningTarget, resultType, pythonNameFromType(resultType), javaNameFromType(resultType), buffer); + } + + private static String javaNameFromType(PythonBuiltinClassType type) { + switch (type) { + case Sha3SHA224Type: + return "sha3-224"; + case Sha3SHA256Type: + return "sha3-256"; + case Sha3SHA384Type: + return "sha3-384"; + case Sha3SHA512Type: + return "sha3-512"; + case Sha3Shake128Type: + return "SHAKE128"; + case Sha3Shake256Type: + return "SHAKE256"; + default: + throw CompilerDirectives.shouldNotReachHere(); + } + } + + private static String pythonNameFromType(PythonBuiltinClassType type) { + switch (type) { + case Sha3SHA224Type: + return "sha3_224"; + case Sha3SHA256Type: + return "sha3_256"; + case Sha3SHA384Type: + return "sha3_384"; + case Sha3SHA512Type: + return "sha3_512"; + case Sha3Shake128Type: + return "shake_128"; + case Sha3Shake256Type: + return "shake_256"; + default: + throw CompilerDirectives.shouldNotReachHere(); + } + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha3ModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha3ModuleBuiltins.java index 66e35129f7..df78c07cdc 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha3ModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha3ModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,99 +42,18 @@ import static com.oracle.graal.python.nodes.BuiltinNames.J_SHA3; +import java.util.Collections; import java.util.List; -import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinNode; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; @CoreFunctions(defineModule = J_SHA3) public final class Sha3ModuleBuiltins extends PythonBuiltins { @Override protected List> getNodeFactories() { - return Sha3ModuleBuiltinsFactory.getFactories(); - } - - @Builtin(name = "sha3_224", declaresExplicitSelf = true, minNumOfPositionalArgs = 1, parameterNames = {"$cls", "string"}, keywordOnlyNames = { - "usedforsecurity"}, constructsClass = PythonBuiltinClassType.Sha3SHA224Type) - @Builtin(name = "sha3_256", declaresExplicitSelf = true, minNumOfPositionalArgs = 1, parameterNames = {"$cls", "string"}, keywordOnlyNames = { - "usedforsecurity"}, constructsClass = PythonBuiltinClassType.Sha3SHA256Type) - @Builtin(name = "sha3_384", declaresExplicitSelf = true, minNumOfPositionalArgs = 1, parameterNames = {"$cls", "string"}, keywordOnlyNames = { - "usedforsecurity"}, constructsClass = PythonBuiltinClassType.Sha3SHA384Type) - @Builtin(name = "sha3_512", declaresExplicitSelf = true, minNumOfPositionalArgs = 1, parameterNames = {"$cls", "string"}, keywordOnlyNames = { - "usedforsecurity"}, constructsClass = PythonBuiltinClassType.Sha3SHA512Type) - @Builtin(name = "shake_128", declaresExplicitSelf = true, minNumOfPositionalArgs = 1, parameterNames = {"$cls", "string"}, keywordOnlyNames = { - "usedforsecurity"}, constructsClass = PythonBuiltinClassType.Sha3Shake128Type) - @Builtin(name = "shake_256", declaresExplicitSelf = true, minNumOfPositionalArgs = 1, parameterNames = {"$cls", "string"}, keywordOnlyNames = { - "usedforsecurity"}, constructsClass = PythonBuiltinClassType.Sha3Shake256Type) - @GenerateNodeFactory - abstract static class ShaNode extends PythonBuiltinNode { - @Specialization - static Object newDigest(VirtualFrame frame, Object type, Object buffer, @SuppressWarnings("unused") Object usedForSecurity, - @Bind("this") Node inliningTarget, - @Cached HashlibModuleBuiltins.CreateDigestNode createNode, - @Cached PRaiseNode.Lazy raiseNode) { - PythonBuiltinClassType resultType; - if (type instanceof PythonBuiltinClass builtinType) { - resultType = builtinType.getType(); - } else if (type instanceof PythonBuiltinClassType enumType) { - resultType = enumType; - } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.WRONG_TYPE); - } - return createNode.execute(frame, inliningTarget, resultType, pythonNameFromType(resultType), javaNameFromType(resultType), buffer); - } - - private static String javaNameFromType(PythonBuiltinClassType type) { - switch (type) { - case Sha3SHA224Type: - return "sha3-224"; - case Sha3SHA256Type: - return "sha3-256"; - case Sha3SHA384Type: - return "sha3-384"; - case Sha3SHA512Type: - return "sha3-512"; - case Sha3Shake128Type: - return "SHAKE128"; - case Sha3Shake256Type: - return "SHAKE256"; - default: - throw CompilerDirectives.shouldNotReachHere(); - } - } - - private static String pythonNameFromType(PythonBuiltinClassType type) { - switch (type) { - case Sha3SHA224Type: - return "sha3_224"; - case Sha3SHA256Type: - return "sha3_256"; - case Sha3SHA384Type: - return "sha3_384"; - case Sha3SHA512Type: - return "sha3_512"; - case Sha3Shake128Type: - return "shake_128"; - case Sha3Shake256Type: - return "shake_256"; - default: - throw CompilerDirectives.shouldNotReachHere(); - } - } + return Collections.emptyList(); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha512ModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha512ModuleBuiltins.java index bb60193f76..9e6aed5814 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha512ModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha512ModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,8 +46,6 @@ import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.truffle.api.dsl.Bind; @@ -86,26 +84,4 @@ static Object newDigest(VirtualFrame frame, Object buffer, @SuppressWarnings("un return createNode.execute(frame, inliningTarget, PythonBuiltinClassType.SHA512Type, "sha512", "sha512", buffer); } } - - @Builtin(name = "sha384", takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.SHA384Type, isPublic = false) - @GenerateNodeFactory - abstract static class Sha384Node extends PythonBuiltinNode { - @Specialization - @SuppressWarnings("unused") - static Object sha384(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, "_sha512.sha384"); - } - } - - @Builtin(name = "sha512", takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.SHA512Type, isPublic = false) - @GenerateNodeFactory - abstract static class Sha512Node extends PythonBuiltinNode { - @Specialization - @SuppressWarnings("unused") - static Object sha512(Object args, Object kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, "_sha512.sha512"); - } - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/ShakeDigestObjectBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/ShakeDigestObjectBuiltins.java index 1d736b68e4..7e18f650da 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/ShakeDigestObjectBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/ShakeDigestObjectBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,6 +42,7 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; @@ -57,7 +58,7 @@ import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -94,12 +95,12 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static PBytes digest(DigestObject self, int length, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { if (self.getDigestLength() != length) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.ONLY_DEFAULT_DIGEST_LENGTHS); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.ONLY_DEFAULT_DIGEST_LENGTHS); } - return factory.createBytes(self.digest()); + return PFactory.createBytes(language, self.digest()); } } @@ -116,9 +117,9 @@ protected ArgumentClinicProvider getArgumentClinic() { static TruffleString hexdigest(DigestObject self, int length, @Bind("this") Node inliningTarget, @Cached BytesNodes.ByteToHexNode toHexNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (self.getDigestLength() != length) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.ONLY_DEFAULT_DIGEST_LENGTHS); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.ONLY_DEFAULT_DIGEST_LENGTHS); } byte[] digest = self.digest(); return toHexNode.execute(inliningTarget, digest, digest.length, (byte) 0, 0); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/AbstractBufferedIOBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/AbstractBufferedIOBuiltins.java index e1d5232967..71f1cc86c9 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/AbstractBufferedIOBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/AbstractBufferedIOBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,6 +47,7 @@ import static com.oracle.graal.python.nodes.ErrorMessages.IO_UNINIT; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.modules.io.BufferedIONodes.RawTellIgnoreErrorNode; @@ -66,8 +67,9 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; @@ -85,25 +87,26 @@ abstract class AbstractBufferedIOBuiltins extends PythonBuiltins { @GenerateCached(false) public abstract static class BufferedInitNode extends PNodeWithContext { - public abstract void execute(VirtualFrame frame, Node inliningTarget, PBuffered self, int bufferSize, PythonObjectFactory factory); + public abstract void execute(VirtualFrame frame, Node inliningTarget, PBuffered self, int bufferSize); @Specialization(guards = "bufferSize > 0") - static void bufferedInit(VirtualFrame frame, Node inliningTarget, PBuffered self, int bufferSize, PythonObjectFactory factory, - @Cached RawTellIgnoreErrorNode rawTellNode) { - init(self, bufferSize, factory); + static void bufferedInit(VirtualFrame frame, Node inliningTarget, PBuffered self, int bufferSize, + @Cached RawTellIgnoreErrorNode rawTellNode, + @Bind PythonLanguage language) { + init(self, bufferSize, language); rawTellNode.execute(frame, inliningTarget, self); } @SuppressWarnings("unused") @Specialization(guards = "bufferSize <= 0") - static void bufferSizeError(PBuffered self, int bufferSize, PythonObjectFactory factory, - @Cached(inline = false) PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, BUF_SIZE_POS); + static void bufferSizeError(PBuffered self, int bufferSize, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, BUF_SIZE_POS); } - private static void init(PBuffered self, int bufferSize, PythonObjectFactory factory) { + private static void init(PBuffered self, int bufferSize, PythonLanguage language) { self.initBuffer(bufferSize); - self.setLock(factory.createLock()); + self.setLock(PFactory.createLock(language)); self.setOwner(0); int n; for (n = bufferSize - 1; (n & 1) != 0; n >>= 1) { @@ -112,10 +115,10 @@ private static void init(PBuffered self, int bufferSize, PythonObjectFactory fac self.setBufferMask(mask); } - public static void internalInit(PBuffered self, int bufferSize, PythonObjectFactory factory, + public static void internalInit(PBuffered self, int bufferSize, PythonLanguage language, Object posixSupport, PosixSupportLibrary posixLib) { - init(self, bufferSize, factory); + init(self, bufferSize, language); try { FileIOBuiltins.TellNode.internalTell(self.getFileIORaw(), posixSupport, posixLib); } catch (PosixException e) { @@ -162,11 +165,11 @@ protected ArgumentClinicProvider getArgumentClinic() { @SuppressWarnings("unused") @Specialization(guards = "!self.isOK()") static Object initError(PBuffered self, Object o, - @Cached PRaiseNode raiseNode) { + @Bind("this") Node inliningTarget) { if (self.isDetached()) { - throw raiseNode.raise(ValueError, IO_STREAM_DETACHED); + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_STREAM_DETACHED); } else { - throw raiseNode.raise(ValueError, IO_UNINIT); + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_UNINIT); } } } @@ -176,11 +179,11 @@ abstract static class PythonBinaryWithInitErrorBuiltinNode extends PythonBinaryB @SuppressWarnings("unused") @Specialization(guards = "!self.isOK()") static Object initError(PBuffered self, Object buffer, - @Cached PRaiseNode raiseNode) { + @Bind("this") Node inliningTarget) { if (self.isDetached()) { - throw raiseNode.raise(ValueError, IO_STREAM_DETACHED); + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_STREAM_DETACHED); } else { - throw raiseNode.raise(ValueError, IO_UNINIT); + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_UNINIT); } } } @@ -189,11 +192,11 @@ abstract static class PythonUnaryWithInitErrorBuiltinNode extends PythonUnaryBui @SuppressWarnings("unused") @Specialization(guards = "!self.isOK()") static Object initError(PBuffered self, - @Cached PRaiseNode raiseNode) { + @Bind("this") Node inliningTarget) { if (self.isDetached()) { - throw raiseNode.raise(ValueError, IO_STREAM_DETACHED); + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_STREAM_DETACHED); } else { - throw raiseNode.raise(ValueError, IO_UNINIT); + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_UNINIT); } } } @@ -216,13 +219,13 @@ public final PException raiseEAGAIN(TruffleString message, int written) { @Specialization static PException raise(Node node, Object errno, TruffleString message, int written, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { Object[] args = new Object[]{ errno, message, written }; - PBaseException exception = factory.createBaseException(BlockingIOError, factory.createTuple(args)); + PBaseException exception = PFactory.createBaseException(language, BlockingIOError, PFactory.createTuple(language, args)); final Object[] attrs = OS_ERROR_ATTR_FACTORY.create(); attrs[OsErrorBuiltins.IDX_ERRNO] = errno; attrs[OsErrorBuiltins.IDX_STRERROR] = message; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedIOBaseBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedIOBaseBuiltins.java index d2c08166f0..150cdc080d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedIOBaseBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedIOBaseBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -100,8 +100,8 @@ abstract static class DetachNode extends PythonBuiltinNode { */ @Specialization static Object detach(@SuppressWarnings("unused") Object self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(IOUnsupportedOperation, T_DETACH); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, IOUnsupportedOperation, T_DETACH); } } @@ -115,8 +115,8 @@ abstract static class ReadNode extends PythonBuiltinNode { @SuppressWarnings("unused") @Specialization static Object read(Object self, Object args, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(IOUnsupportedOperation, T_READ); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, IOUnsupportedOperation, T_READ); } } @@ -130,8 +130,8 @@ abstract static class Read1Node extends PythonBuiltinNode { @SuppressWarnings("unused") @Specialization static Object read1(Object self, Object args, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(IOUnsupportedOperation, T_READ1); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, IOUnsupportedOperation, T_READ1); } } @@ -153,18 +153,18 @@ Object readinto(VirtualFrame frame, Object self, Object buffer, @Cached PyObjectCallMethodObjArgs callMethod, @Cached InlinedConditionProfile isBytes, @Cached InlinedConditionProfile oversize, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { int len = bufferLib.getBufferLength(buffer); Object data = callMethod.execute(frame, inliningTarget, self, getMethodName(), len); if (isBytes.profile(inliningTarget, !(data instanceof PBytes))) { - throw raiseNode.get(inliningTarget).raise(ValueError, S_SHOULD_RETURN_BYTES, "read()"); + throw raiseNode.raise(inliningTarget, ValueError, S_SHOULD_RETURN_BYTES, "read()"); } // Directly using data as buffer because CPython also accesses the underlying memory // of the bytes object int dataLen = bufferLib.getBufferLength(data); if (oversize.profile(inliningTarget, dataLen > len)) { - throw raiseNode.get(inliningTarget).raise(ValueError, S_RETURNED_TOO_MUCH_DATA, "read()", len, dataLen); + throw raiseNode.raise(inliningTarget, ValueError, S_RETURNED_TOO_MUCH_DATA, "read()", len, dataLen); } bufferLib.readIntoBuffer(data, 0, buffer, 0, dataLen, bufferLib); return dataLen; @@ -219,8 +219,8 @@ abstract static class WriteNode extends PythonBuiltinNode { @SuppressWarnings("unused") @Specialization static Object write(Object self, Object args, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(IOUnsupportedOperation, T_WRITE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, IOUnsupportedOperation, T_WRITE); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedIOMixinBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedIOMixinBuiltins.java index 16089c404f..7d9617a42d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedIOMixinBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedIOMixinBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -76,13 +76,14 @@ import static com.oracle.graal.python.nodes.ErrorMessages.IO_UNINIT; import static com.oracle.graal.python.nodes.ErrorMessages.REENTRANT_CALL_INSIDE_S_REPR; import static com.oracle.graal.python.nodes.ErrorMessages.UNSUPPORTED_WHENCE; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.IOUnsupportedOperation; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; import java.util.List; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.modules.io.BufferedIONodes.CheckIsClosedNode; @@ -91,6 +92,7 @@ import com.oracle.graal.python.builtins.modules.io.BufferedIONodes.RawTellNode; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyErrChainExceptions; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; @@ -105,18 +107,15 @@ import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.InlinedConditionProfile; @@ -124,6 +123,9 @@ @CoreFunctions(extendClasses = {PBufferedReader, PBufferedWriter, PBufferedRandom}) public final class BufferedIOMixinBuiltins extends AbstractBufferedIOBuiltins { + + public static final TpSlots SLOTS = BufferedIOMixinBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return BufferedIOMixinBuiltinsFactory.getFactories(); @@ -256,7 +258,6 @@ static Object none(@SuppressWarnings("unused") Object self, @SuppressWarnings("u @ArgumentClinic(name = "whence", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "BufferedIOUtil.SEEK_SET", useDefaultForNone = true) @GenerateNodeFactory @ImportStatic(IONodes.class) - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class SeekNode extends PythonTernaryClinicBuiltinNode { @Override @@ -283,17 +284,17 @@ static long doit(VirtualFrame frame, PBuffered self, Object off, int whence, @Specialization(guards = {"self.isOK()", "!isSupportedWhence(whence)"}) static Object whenceError(@SuppressWarnings("unused") PBuffered self, @SuppressWarnings("unused") int off, int whence, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, UNSUPPORTED_WHENCE, whence); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, UNSUPPORTED_WHENCE, whence); } @Specialization(guards = "!self.isOK()") static Object initError(PBuffered self, @SuppressWarnings("unused") int off, @SuppressWarnings("unused") int whence, - @Shared @Cached PRaiseNode raiseNode) { + @Bind("this") Node inliningTarget) { if (self.isDetached()) { - throw raiseNode.raise(ValueError, IO_STREAM_DETACHED); + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_STREAM_DETACHED); } else { - throw raiseNode.raise(ValueError, IO_UNINIT); + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_UNINIT); } } } @@ -345,8 +346,8 @@ static Object doit(VirtualFrame frame, PBuffered self, Object pos, @Specialization(guards = {"self.isOK()", "!self.isWritable()"}) static Object notWritable(@SuppressWarnings("unused") PBuffered self, @SuppressWarnings("unused") Object pos, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(IOUnsupportedOperation, T_TRUNCATE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, IOUnsupportedOperation, T_TRUNCATE); } } @@ -401,7 +402,7 @@ static Object doit(VirtualFrame frame, PBuffered self, } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization @@ -413,7 +414,7 @@ static TruffleString repr(VirtualFrame frame, PBuffered self, @Cached IsBuiltinObjectProfile isValueError, @Cached PyObjectReprAsTruffleStringNode repr, @Cached SimpleTruffleStringFormatNode simpleTruffleStringFormatNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { TruffleString typeName = getNameNode.execute(inliningTarget, getClassNode.execute(inliningTarget, self)); Object nameobj = PNone.NO_VALUE; try { @@ -426,7 +427,7 @@ static TruffleString repr(VirtualFrame frame, PBuffered self, return simpleTruffleStringFormatNode.format("<%s>", typeName); } else { if (!PythonContext.get(inliningTarget).reprEnter(self)) { - throw raiseNode.get(inliningTarget).raise(RuntimeError, REENTRANT_CALL_INSIDE_S_REPR, typeName); + throw raiseNode.raise(inliningTarget, RuntimeError, REENTRANT_CALL_INSIDE_S_REPR, typeName); } else { try { TruffleString name = repr.execute(frame, inliningTarget, nameobj); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedIONodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedIONodes.java index a7fbed8876..37c778a932 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedIONodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedIONodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -73,7 +73,7 @@ import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaLongExactNode; import com.oracle.graal.python.runtime.GilNode; @@ -109,10 +109,10 @@ public CheckIsClosedNode(TruffleString method) { @Specialization boolean isClosedBuffered(VirtualFrame frame, PBuffered self, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached IsClosedNode isClosedNode) { if (isClosedNode.execute(frame, inliningTarget, self)) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, messageFmt, method); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, messageFmt, method); } return false; } @@ -141,7 +141,7 @@ static boolean isClosedBuffered(VirtualFrame frame, Node inliningTarget, PBuffer @Cached PyObjectGetAttr getAttr, @Cached PyObjectIsTrueNode isTrue) { Object res = getAttr.execute(frame, inliningTarget, self.getRaw(), T_CLOSED); - return isTrue.execute(frame, inliningTarget, res); + return isTrue.execute(frame, res); } } @@ -155,18 +155,18 @@ static boolean isSeekable(VirtualFrame frame, PBuffered self, @Bind("this") Node inliningTarget, @Cached PyObjectCallMethodObjArgs callMethod, @Cached PyObjectIsTrueNode isTrue, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { assert self.isOK(); Object res = callMethod.execute(frame, inliningTarget, self.getRaw(), T_SEEKABLE); - if (!isTrue.execute(frame, inliningTarget, res)) { - throw raiseNode.get(inliningTarget).raise(IOUnsupportedOperation, FILE_OR_STREAM_IS_NOT_SEEKABLE); + if (!isTrue.execute(frame, res)) { + throw raiseNode.raise(inliningTarget, IOUnsupportedOperation, FILE_OR_STREAM_IS_NOT_SEEKABLE); } return true; } } @ImportStatic(PGuards.class) - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerTypes.class) @GenerateInline @GenerateCached(false) // PyNumber_AsOff_t @@ -181,7 +181,7 @@ static long doInt(long number, @SuppressWarnings("unused") PythonBuiltinClassTyp @Specialization static long toLong(VirtualFrame frame, Node inliningTarget, Object number, PythonBuiltinClassType err, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached PyNumberIndexNode indexNode, @Cached CastToJavaLongExactNode cast, @Cached IsBuiltinObjectProfile errorProfile) { @@ -190,7 +190,7 @@ static long toLong(VirtualFrame frame, Node inliningTarget, Object number, Pytho return cast.execute(inliningTarget, index); } catch (PException e) { e.expect(inliningTarget, OverflowError, errorProfile); - throw raiseNode.get(inliningTarget).raise(err, CANNOT_FIT_P_IN_OFFSET_SIZE, number); + throw raiseNode.raise(inliningTarget, err, CANNOT_FIT_P_IN_OFFSET_SIZE, number); } catch (CannotCastException e) { throw CompilerDirectives.shouldNotReachHere(); } @@ -218,12 +218,12 @@ public final long executeCached(VirtualFrame frame, PBuffered self) { */ @Specialization static long bufferedRawTell(VirtualFrame frame, Node inliningTarget, PBuffered self, - @Cached PRaiseNode.Lazy lazyRaiseNode, + @Cached PRaiseNode lazyRaiseNode, @Cached PyObjectCallMethodObjArgs callMethod, @Cached AsOffNumberNode asOffNumberNode) { long n = tell(frame, inliningTarget, self.getRaw(), callMethod, asOffNumberNode); if (n < 0) { - throw lazyRaiseNode.get(inliningTarget).raise(OSError, IO_STREAM_INVALID_POS, n); + throw lazyRaiseNode.raise(inliningTarget, OSError, IO_STREAM_INVALID_POS, n); } self.setAbsPos(n); return n; @@ -278,13 +278,13 @@ abstract static class RawSeekNode extends PNodeWithContext { @Specialization static long bufferedRawSeek(VirtualFrame frame, PBuffered self, long target, int whence, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raise, + @Cached PRaiseNode raise, @Cached PyObjectCallMethodObjArgs callMethod, @Cached AsOffNumberNode asOffNumberNode) { Object res = callMethod.execute(frame, inliningTarget, self.getRaw(), T_SEEK, target, whence); long n = asOffNumberNode.execute(frame, inliningTarget, res, ValueError); if (n < 0) { - raise.get(inliningTarget).raise(OSError, IO_STREAM_INVALID_POS, n); + raise.raise(inliningTarget, OSError, IO_STREAM_INVALID_POS, n); } self.setAbsPos(n); return n; @@ -456,7 +456,7 @@ static void normal(Node inliningTarget, PBuffered self, @Specialization(guards = {"!self.isOwn()", "getContext().isFinalizing()"}) static void finalizing(Node inliningTarget, PBuffered self, - @Shared @Cached PRaiseNode.Lazy lazyRaise) { + @Shared @Cached PRaiseNode lazyRaise) { /* * When finalizing, we don't want a deadlock to happen with daemon threads abruptly shut * down while they owned the lock. Therefore, only wait for a grace period (1 s.). Note @@ -464,14 +464,14 @@ static void finalizing(Node inliningTarget, PBuffered self, * written threaded I/O code. */ if (!self.getLock().acquireTimeout(inliningTarget, (long) 1e3)) { - throw lazyRaise.get(inliningTarget).raise(SystemError, SHUTDOWN_POSSIBLY_DUE_TO_DAEMON_THREADS); + throw lazyRaise.raise(inliningTarget, SystemError, SHUTDOWN_POSSIBLY_DUE_TO_DAEMON_THREADS); } } @Specialization(guards = "self.isOwn()") static void error(Node inliningTarget, PBuffered self, - @Shared @Cached PRaiseNode.Lazy lazyRaise) { - throw lazyRaise.get(inliningTarget).raise(RuntimeError, REENTRANT_CALL_INSIDE_P, self); + @Shared @Cached PRaiseNode lazyRaise) { + throw lazyRaise.raise(inliningTarget, RuntimeError, REENTRANT_CALL_INSIDE_P, self); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedRWPairBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedRWPairBuiltins.java index 9cd72d1105..1f8f03e237 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedRWPairBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedRWPairBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,8 +41,6 @@ package com.oracle.graal.python.builtins.modules.io; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PBufferedRWPair; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PBufferedReader; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PBufferedWriter; import static com.oracle.graal.python.builtins.modules.io.IONodes.J_CLOSE; import static com.oracle.graal.python.builtins.modules.io.IONodes.J_CLOSED; import static com.oracle.graal.python.builtins.modules.io.IONodes.J_FLUSH; @@ -69,29 +67,35 @@ import static com.oracle.graal.python.builtins.modules.io.IONodes.T_WRITE; import static com.oracle.graal.python.nodes.ErrorMessages.IO_UNINIT; import static com.oracle.graal.python.nodes.ErrorMessages.THE_S_OBJECT_IS_BEING_GARBAGE_COLLECTED; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.RuntimeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyErrChainExceptions; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.object.IsNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; @@ -106,12 +110,28 @@ @CoreFunctions(extendClasses = PBufferedRWPair) public final class BufferedRWPairBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = BufferedRWPairBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return BufferedRWPairBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 3, parameterNames = {"$self", "reader", "writer", "buffer_size"}) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "BufferedRWPair", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class BufferedRWPairNode extends PythonBuiltinNode { + @Specialization + static PRWPair doNew(Object cls, @SuppressWarnings("unused") Object arg, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + // data filled in subsequent __init__ call - see BufferedRWPairBuiltins.InitNode + return PFactory.createRWPair(language, cls, getInstanceShape.execute(cls)); + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "BufferedRWPair", minNumOfPositionalArgs = 3, parameterNames = {"$self", "reader", "writer", "buffer_size"}) @ArgumentClinic(name = "buffer_size", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "BufferedReaderBuiltins.DEFAULT_BUFFER_SIZE", useDefaultForNone = true) @GenerateNodeFactory public abstract static class InitNode extends PythonQuaternaryClinicBuiltinNode { @@ -128,13 +148,13 @@ static PNone doInit(VirtualFrame frame, PRWPair self, Object reader, Object writ @Cached IOBaseBuiltins.CheckBoolMethodHelperNode checkWritableNode, @Cached BufferedReaderBuiltins.BufferedReaderInit initReaderNode, @Cached BufferedWriterBuiltins.BufferedWriterInit initWriterNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { checkReadableNode.checkReadable(frame, inliningTarget, reader); checkWritableNode.checkWriteable(frame, inliningTarget, writer); - self.setReader(factory.createBufferedReader(PBufferedReader)); - initReaderNode.execute(frame, inliningTarget, self.getReader(), reader, bufferSize, factory); - self.setWriter(factory.createBufferedWriter(PBufferedWriter)); - initWriterNode.execute(frame, inliningTarget, self.getWriter(), writer, bufferSize, factory); + self.setReader(PFactory.createBufferedReader(language)); + initReaderNode.execute(frame, inliningTarget, self.getReader(), reader, bufferSize); + self.setWriter(PFactory.createBufferedWriter(language)); + initWriterNode.execute(frame, inliningTarget, self.getWriter(), writer, bufferSize); return PNone.NONE; } } @@ -148,8 +168,8 @@ protected static boolean isInit(PRWPair self) { @SuppressWarnings("unused") @Specialization(guards = "!isInit(self)") static Object error(VirtualFrame frame, PRWPair self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_UNINIT); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_UNINIT); } } @@ -162,8 +182,8 @@ protected static boolean isInit(PRWPair self) { @SuppressWarnings("unused") @Specialization(guards = "!isInit(self)") static Object error(VirtualFrame frame, PRWPair self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_UNINIT); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_UNINIT); } } @@ -176,8 +196,8 @@ protected static boolean isInit(PRWPair self) { @SuppressWarnings("unused") @Specialization(guards = "!isInit(self)") static Object error(VirtualFrame frame, PRWPair self, Object arg, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_UNINIT); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_UNINIT); } } @@ -190,8 +210,8 @@ protected static boolean isInit(PRWPair self) { @SuppressWarnings("unused") @Specialization(guards = "!isInit(self)") static Object error(VirtualFrame frame, PRWPair self, Object arg, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_UNINIT); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_UNINIT); } } @@ -306,7 +326,7 @@ static Object close(VirtualFrame frame, PRWPair self, @Cached InlinedConditionProfile gotException, @Cached InlinedBranchProfile hasException, @Cached PyErrChainExceptions chainExceptions, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { PException writeEx = null; if (self.getWriter() != null) { try { @@ -316,7 +336,7 @@ static Object close(VirtualFrame frame, PRWPair self, writeEx = e; } } else { - writeEx = raiseNode.get(inliningTarget).raise(ValueError, IO_UNINIT); + writeEx = raiseNode.raise(inliningTarget, ValueError, IO_UNINIT); } PException readEx; @@ -331,7 +351,7 @@ static Object close(VirtualFrame frame, PRWPair self, readEx = e; } } else { - readEx = raiseNode.get(inliningTarget).raise(ValueError, IO_UNINIT); + readEx = raiseNode.raise(inliningTarget, ValueError, IO_UNINIT); } hasException.enter(inliningTarget); @@ -380,8 +400,8 @@ static Object doit(VirtualFrame frame, PRWPair self, @SuppressWarnings("unused") @Fallback static Object error(VirtualFrame frame, Object self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(RuntimeError, THE_S_OBJECT_IS_BEING_GARBAGE_COLLECTED, "BufferedRWPair"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, RuntimeError, THE_S_OBJECT_IS_BEING_GARBAGE_COLLECTED, "BufferedRWPair"); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedRandomBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedRandomBuiltins.java index ac9a19e585..987d407e38 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedRandomBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedRandomBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,18 +41,22 @@ package com.oracle.graal.python.builtins.modules.io; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PBufferedRandom; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import java.util.List; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; @@ -65,19 +69,35 @@ @CoreFunctions(extendClasses = PBufferedRandom) public final class BufferedRandomBuiltins extends AbstractBufferedIOBuiltins { + + public static final TpSlots SLOTS = BufferedRandomBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return BufferedRandomBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "BufferedRandom", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class BufferedRandomNode extends PythonBuiltinNode { + @Specialization + static PBuffered doNew(Object cls, @SuppressWarnings("unused") Object arg, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + // data filled in subsequent __init__ call - see BufferedRandomBuiltins.InitNode + return PFactory.createBufferedRandom(language, cls, getInstanceShape.execute(cls)); + } + } + @GenerateCached(false) @GenerateInline public abstract static class BufferedRandomInit extends Node { - public abstract void execute(VirtualFrame frame, Node inliningTarget, PBuffered self, Object raw, int bufferSize, PythonObjectFactory factory); + public abstract void execute(VirtualFrame frame, Node inliningTarget, PBuffered self, Object raw, int bufferSize); @Specialization - static void doInit(VirtualFrame frame, Node inliningTarget, PBuffered self, Object raw, int bufferSize, PythonObjectFactory factory, + static void doInit(VirtualFrame frame, Node inliningTarget, PBuffered self, Object raw, int bufferSize, @Cached IOBaseBuiltins.CheckBoolMethodHelperNode checkSeekableNode, @Cached IOBaseBuiltins.CheckBoolMethodHelperNode checkReadableNode, @Cached IOBaseBuiltins.CheckBoolMethodHelperNode checkWritableNode, @@ -90,7 +110,7 @@ static void doInit(VirtualFrame frame, Node inliningTarget, PBuffered self, Obje checkReadableNode.checkReadable(frame, inliningTarget, raw); checkWritableNode.checkWriteable(frame, inliningTarget, raw); self.setRaw(raw, isFileIO(self, raw, PBufferedRandom, inliningTarget, getSelfClass, getRawClass)); - bufferedInitNode.execute(frame, inliningTarget, self, bufferSize, factory); + bufferedInitNode.execute(frame, inliningTarget, self, bufferSize); self.resetRead(); self.resetWrite(); self.setPos(0); @@ -100,17 +120,17 @@ static void doInit(VirtualFrame frame, Node inliningTarget, PBuffered self, Obje } // BufferedRandom(raw[, buffer_size=DEFAULT_BUFFER_SIZE]) - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 2, parameterNames = {"self", "raw", "buffer_size"}, raiseErrorName = "BufferedRandom") + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "BufferedRandom", minNumOfPositionalArgs = 2, parameterNames = {"self", "raw", "buffer_size"}) @GenerateNodeFactory public abstract static class InitNode extends PythonBuiltinNode { @Specialization static Object doIt(VirtualFrame frame, PBuffered self, Object raw, Object bufferSize, @Bind("this") Node inliningTarget, @Cached InitBufferSizeNode initBufferSizeNode, - @Cached BufferedRandomInit init, - @Cached PythonObjectFactory factory) { + @Cached BufferedRandomInit init) { int size = initBufferSizeNode.execute(frame, inliningTarget, bufferSize); - init.execute(frame, inliningTarget, self, raw, size, factory); + init.execute(frame, inliningTarget, self, raw, size); return PNone.NONE; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedReaderBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedReaderBuiltins.java index 38ae3204f9..428e34fd8a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedReaderBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedReaderBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,20 +43,25 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PBufferedReader; import static com.oracle.graal.python.builtins.modules.io.IONodes.J_FLUSH; import static com.oracle.graal.python.builtins.modules.io.IONodes.T_FLUSH; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; import com.oracle.graal.python.runtime.PosixSupportLibrary; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; @@ -69,19 +74,35 @@ @CoreFunctions(extendClasses = PBufferedReader) public final class BufferedReaderBuiltins extends AbstractBufferedIOBuiltins { + + public static final TpSlots SLOTS = BufferedReaderBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return BufferedReaderBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "BufferedReader", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class BufferedReaderNode extends PythonBuiltinNode { + @Specialization + static PBuffered doNew(Object cls, @SuppressWarnings("unused") Object arg, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + // data filled in subsequent __init__ call - see BufferedReaderBuiltins.InitNode + return PFactory.createBufferedReader(language, cls, getInstanceShape.execute(cls)); + } + } + @GenerateInline @GenerateCached(false) public abstract static class BufferedReaderInit extends Node { - public abstract void execute(VirtualFrame frame, Node inliningTarget, PBuffered self, Object raw, int bufferSize, PythonObjectFactory factory); + public abstract void execute(VirtualFrame frame, Node inliningTarget, PBuffered self, Object raw, int bufferSize); @Specialization - static void doInit(VirtualFrame frame, Node inliningTarget, PBuffered self, Object raw, int bufferSize, PythonObjectFactory factory, + static void doInit(VirtualFrame frame, Node inliningTarget, PBuffered self, Object raw, int bufferSize, @Cached IOBaseBuiltins.CheckBoolMethodHelperNode checkReadableNode, @Cached BufferedInitNode bufferedInitNode, @Cached GetPythonObjectClassNode getSelfClass, @@ -90,34 +111,34 @@ static void doInit(VirtualFrame frame, Node inliningTarget, PBuffered self, Obje self.setDetached(false); checkReadableNode.checkReadable(frame, inliningTarget, raw); self.setRaw(raw, isFileIO(self, raw, PBufferedReader, inliningTarget, getSelfClass, getRawClass)); - bufferedInitNode.execute(frame, inliningTarget, self, bufferSize, factory); + bufferedInitNode.execute(frame, inliningTarget, self, bufferSize); self.resetRead(); self.setOK(true); } - public static void internalInit(PBuffered self, PFileIO raw, int bufferSize, PythonObjectFactory factory, + public static void internalInit(PBuffered self, PFileIO raw, int bufferSize, PythonLanguage language, Object posixSupport, PosixSupportLibrary posixLib) { self.setDetached(false); self.setRaw(raw, true); - BufferedInitNode.internalInit(self, bufferSize, factory, posixSupport, posixLib); + BufferedInitNode.internalInit(self, bufferSize, language, posixSupport, posixLib); self.resetRead(); self.setOK(true); } } // BufferedReader(raw[, buffer_size=DEFAULT_BUFFER_SIZE]) - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 2, parameterNames = {"self", "raw", "buffer_size"}, raiseErrorName = "BufferedReader") + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "BufferedReader", minNumOfPositionalArgs = 2, parameterNames = {"self", "raw", "buffer_size"}) @GenerateNodeFactory public abstract static class InitNode extends PythonBuiltinNode { @Specialization static Object doIt(VirtualFrame frame, PBuffered self, Object raw, Object bufferSize, @Bind("this") Node inliningTarget, @Cached InitBufferSizeNode initBufferSizeNode, - @Cached BufferedReaderInit init, - @Cached PythonObjectFactory factory) { + @Cached BufferedReaderInit init) { int size = initBufferSizeNode.execute(frame, inliningTarget, bufferSize); - init.execute(frame, inliningTarget, self, raw, size, factory); + init.execute(frame, inliningTarget, self, raw, size); return PNone.NONE; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedReaderMixinBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedReaderMixinBuiltins.java index e8f374a893..9b4c6225f9 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedReaderMixinBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedReaderMixinBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -62,7 +62,6 @@ import static com.oracle.graal.python.nodes.ErrorMessages.IO_S_INVALID_LENGTH; import static com.oracle.graal.python.nodes.ErrorMessages.IO_S_SHOULD_RETURN_BYTES; import static com.oracle.graal.python.nodes.ErrorMessages.MUST_BE_NON_NEG_OR_NEG_1; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.OSError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; @@ -71,7 +70,10 @@ import java.io.ByteArrayOutputStream; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.modules.io.BufferedIONodes.CheckIsClosedNode; @@ -84,6 +86,8 @@ import com.oracle.graal.python.builtins.objects.bytes.BytesUtils; import com.oracle.graal.python.builtins.objects.bytes.PByteArray; import com.oracle.graal.python.builtins.objects.bytes.PBytes; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.nodes.ErrorMessages; @@ -96,12 +100,11 @@ import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -116,6 +119,9 @@ @CoreFunctions(extendClasses = {PBufferedReader, PBufferedRandom}) public final class BufferedReaderMixinBuiltins extends AbstractBufferedIOBuiltins { + + public static final TpSlots SLOTS = BufferedReaderMixinBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return BufferedReaderMixinBuiltinsFactory.getFactories(); @@ -136,13 +142,13 @@ abstract static class RawReadNode extends PNodeWithContext { // This is the spec way @Specialization static byte[] bufferedreaderRawRead(VirtualFrame frame, Node inliningTarget, PBuffered self, int len, + @Bind PythonLanguage language, @Cached(inline = false) BytesNodes.ToBytesNode toBytes, - @Cached(inline = false) PythonObjectFactory factory, @Cached PyObjectCallMethodObjArgs callMethodReadInto, @Cached PyNumberAsSizeNode asSizeNode, @Cached InlinedConditionProfile osError, - @Cached PRaiseNode.Lazy lazyRaiseNode) { - PByteArray memobj = factory.createByteArray(new byte[len]); + @Cached PRaiseNode lazyRaiseNode) { + PByteArray memobj = PFactory.createByteArray(language, new byte[len]); // TODO _PyIO_trap_eintr [GR-23297] Object res = callMethodReadInto.execute(frame, inliningTarget, self.getRaw(), T_READINTO, memobj); if (res == PNone.NONE) { @@ -153,10 +159,10 @@ static byte[] bufferedreaderRawRead(VirtualFrame frame, Node inliningTarget, PBu try { n = asSizeNode.executeExact(frame, inliningTarget, res, ValueError); } catch (PException e) { - throw lazyRaiseNode.get(inliningTarget).raiseWithCause(OSError, e, ErrorMessages.RAW_READINTO_FAILED); + throw lazyRaiseNode.raiseWithCause(inliningTarget, OSError, e, ErrorMessages.RAW_READINTO_FAILED); } if (osError.profile(inliningTarget, n < 0 || n > len)) { - throw lazyRaiseNode.get(inliningTarget).raise(OSError, IO_S_INVALID_LENGTH, "readinto()", n, len); + throw lazyRaiseNode.raise(inliningTarget, OSError, IO_S_INVALID_LENGTH, "readinto()", n, len); } if (n > 0 && self.getAbsPos() != -1) { self.incAbsPos(n); @@ -250,9 +256,9 @@ public static boolean isReadFast(PBuffered self, int size) { @Specialization(guards = {"self.isOK()", "size == 0"}) Object empty(VirtualFrame frame, PBuffered self, @SuppressWarnings("unused") int size, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { checkIsClosedNode.execute(frame, self); - return factory.createEmptyBytes(); + return PFactory.createEmptyBytes(language); } /* @@ -272,9 +278,9 @@ public static byte[] bufferedreaderReadFast(PBuffered self, int size) { @Specialization(guards = {"self.isOK()", "size > 0", "isReadFast(self, size)"}) Object readFast(VirtualFrame frame, PBuffered self, int size, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { checkIsClosedNode.execute(frame, self); - return factory.createBytes(bufferedreaderReadFast(self, size)); + return PFactory.createBytes(language, bufferedreaderReadFast(self, size)); } /** @@ -284,17 +290,17 @@ Object readFast(VirtualFrame frame, PBuffered self, int size, @SuppressWarnings("truffle-static-method") // checkIsClosedNode Object bufferedreaderReadGeneric(VirtualFrame frame, PBuffered self, int size, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Exclusive @Cached EnterBufferedNode lock, @Cached RawReadNode rawReadNode, @Cached FillBufferNode fillBufferNode, - @Exclusive @Cached FlushAndRewindUnlockedNode flushAndRewindUnlockedNode, - @Shared @Cached PythonObjectFactory factory) { + @Exclusive @Cached FlushAndRewindUnlockedNode flushAndRewindUnlockedNode) { checkIsClosedNode.execute(frame, self); try { lock.enter(inliningTarget, self); int currentSize = safeDowncast(self); if (size <= currentSize) { - return factory.createBytes(bufferedreaderReadFast(self, size)); + return PFactory.createBytes(language, bufferedreaderReadFast(self, size)); } byte[] res = new byte[size]; int remaining = size; @@ -328,7 +334,7 @@ If we had readv() we could do this in one pass. */ if (r == 0 || r == -2) { /* EOF occurred */ if (r == 0 || written > 0) { - return factory.createBytes(PythonUtils.arrayCopyOf(res, written)); + return PFactory.createBytes(language, PythonUtils.arrayCopyOf(res, written)); } return PNone.NONE; } @@ -347,7 +353,7 @@ reads, which could block indefinitely (e.g. on a socket). if (r == 0 || r == -2) { /* EOF occurred */ if (r == 0 || written > 0) { - return factory.createBytes(PythonUtils.arrayCopyOf(res, written)); + return PFactory.createBytes(language, PythonUtils.arrayCopyOf(res, written)); } return PNone.NONE; } @@ -369,7 +375,7 @@ reads, which could block indefinitely (e.g. on a socket). } } - return factory.createBytes(res); + return PFactory.createBytes(language, res); } finally { EnterBufferedNode.leave(self); } @@ -384,6 +390,7 @@ reads, which could block indefinitely (e.g. on a socket). @SuppressWarnings("truffle-static-method") // checkIsClosedNode Object bufferedreaderReadAll(VirtualFrame frame, PBuffered self, @SuppressWarnings("unused") int size, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Exclusive @Cached EnterBufferedNode lock, @Exclusive @Cached FlushAndRewindUnlockedNode flushAndRewindUnlockedNode, @Cached("create(T_READALL)") LookupAttributeInMRONode readallAttr, @@ -393,8 +400,7 @@ Object bufferedreaderReadAll(VirtualFrame frame, PBuffered self, @SuppressWarnin @Cached GetClassNode getClassNode, @Cached PyObjectCallMethodObjArgs callMethod, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Shared @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { checkIsClosedNode.execute(frame, self); try { lock.enter(inliningTarget, self); @@ -418,7 +424,7 @@ Object bufferedreaderReadAll(VirtualFrame frame, PBuffered self, @SuppressWarnin if (hasReadallProfile.profile(inliningTarget, readall != PNone.NO_VALUE)) { Object tmp = dispatchGetattribute.executeObject(frame, readall, self.getRaw()); if (tmp != PNone.NONE && !(tmp instanceof PBytes)) { - throw raiseNode.get(inliningTarget).raise(TypeError, IO_S_SHOULD_RETURN_BYTES, "readall()"); + throw raiseNode.raise(inliningTarget, TypeError, IO_S_SHOULD_RETURN_BYTES, "readall()"); } if (currentSize0Profile.profile(inliningTarget, currentSize != 0)) { if (tmp != PNone.NONE) { @@ -426,9 +432,9 @@ Object bufferedreaderReadAll(VirtualFrame frame, PBuffered self, @SuppressWarnin byte[] res = new byte[data.length + bytesLen]; PythonUtils.arraycopy(data, 0, res, 0, data.length); bufferLib.readIntoByteArray(tmp, 0, res, data.length, bytesLen); - return factory.createBytes(res); + return PFactory.createBytes(language, res); } - return factory.createBytes(data); + return PFactory.createBytes(language, data); } else { return tmp; } @@ -446,7 +452,7 @@ Object bufferedreaderReadAll(VirtualFrame frame, PBuffered self, @SuppressWarnin /* Read until EOF or until read() would block. */ Object r = callMethod.execute(frame, inliningTarget, self.getRaw(), T_READ); if (r != PNone.NONE && !(r instanceof PBytes)) { - throw raiseNode.get(inliningTarget).raise(TypeError, IO_S_SHOULD_RETURN_BYTES, "read()"); + throw raiseNode.raise(inliningTarget, TypeError, IO_S_SHOULD_RETURN_BYTES, "read()"); } if (r != PNone.NONE) { dataLen = bufferLib.getBufferLength(r); @@ -456,7 +462,7 @@ Object bufferedreaderReadAll(VirtualFrame frame, PBuffered self, @SuppressWarnin if (currentSize == 0) { return r; } else { - return factory.createBytes(toByteArray(chunks)); + return PFactory.createBytes(language, toByteArray(chunks)); } } currentSize += dataLen; @@ -472,8 +478,8 @@ Object bufferedreaderReadAll(VirtualFrame frame, PBuffered self, @SuppressWarnin @SuppressWarnings("unused") @Specialization(guards = {"self.isOK()", "!isValidSize(size)"}) static Object initError(VirtualFrame frame, PBuffered self, int size, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, MUST_BE_NON_NEG_OR_NEG_1); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, MUST_BE_NON_NEG_OR_NEG_1); } } @@ -490,10 +496,10 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(guards = "self.isOK()") static PBytes doit(VirtualFrame frame, PBuffered self, int size, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached EnterBufferedNode lock, @Cached("create(T_READ)") CheckIsClosedNode checkIsClosedNode, - @Cached RawReadNode rawReadNode, - @Cached PythonObjectFactory factory) { + @Cached RawReadNode rawReadNode) { checkIsClosedNode.execute(frame, self); int n = size; if (n < 0) { @@ -501,7 +507,7 @@ static PBytes doit(VirtualFrame frame, PBuffered self, int size, } if (n == 0) { - return factory.createEmptyBytes(); + return PFactory.createEmptyBytes(language); } /*- Return up to n bytes. If at least one byte is buffered, we only return buffered bytes. Otherwise, we do one raw read. */ @@ -510,13 +516,13 @@ static PBytes doit(VirtualFrame frame, PBuffered self, int size, if (have > 0) { n = have < n ? have : n; byte[] b = ReadNode.bufferedreaderReadFast(self, n); - return factory.createBytes(b); + return PFactory.createBytes(language, b); } try { lock.enter(inliningTarget, self); self.resetRead(); // _bufferedreader_reset_buf byte[] fill = rawReadNode.execute(frame, inliningTarget, self, n); - return factory.createBytes(fill == BLOCKED ? PythonUtils.EMPTY_BYTE_ARRAY : fill); + return PFactory.createBytes(language, fill == BLOCKED ? PythonUtils.EMPTY_BYTE_ARRAY : fill); } finally { EnterBufferedNode.leave(self); } @@ -748,12 +754,12 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(guards = "self.isOK()") static PBytes doit(VirtualFrame frame, PBuffered self, int size, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached("create(T_READLINE)") CheckIsClosedNode checkIsClosedNode, - @Cached BufferedReadlineNode readlineNode, - @Cached PythonObjectFactory factory) { + @Cached BufferedReadlineNode readlineNode) { checkIsClosedNode.execute(frame, self); byte[] res = readlineNode.execute(frame, inliningTarget, self, size); - return factory.createBytes(res); + return PFactory.createBytes(language, res); } } @@ -796,42 +802,40 @@ static byte[] bufferedreaderPeekUnlocked(VirtualFrame frame, Node inliningTarget @Specialization(guards = "self.isOK()") static Object doit(VirtualFrame frame, PBuffered self, @SuppressWarnings("unused") int size, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached EnterBufferedNode lock, @Cached("create(T_PEEK)") CheckIsClosedNode checkIsClosedNode, @Cached FillBufferNode fillBufferNode, - @Cached FlushAndRewindUnlockedNode flushAndRewindUnlockedNode, - @Cached PythonObjectFactory factory) { + @Cached FlushAndRewindUnlockedNode flushAndRewindUnlockedNode) { checkIsClosedNode.execute(frame, self); try { lock.enter(inliningTarget, self); if (self.isWritable()) { flushAndRewindUnlockedNode.execute(frame, inliningTarget, self); } - return factory.createBytes(bufferedreaderPeekUnlocked(frame, inliningTarget, self, fillBufferNode)); + return PFactory.createBytes(language, bufferedreaderPeekUnlocked(frame, inliningTarget, self, fillBufferNode)); } finally { EnterBufferedNode.leave(self); } } } - @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iternext, isComplex = true) @ImportStatic(IONodes.class) @GenerateNodeFactory abstract static class NextNode extends PythonUnaryWithInitErrorBuiltinNode { @Specialization(guards = "self.isOK()") - static PBytes doit(VirtualFrame frame, PBuffered self, + static Object doit(VirtualFrame frame, PBuffered self, @Bind("this") Node inliningTarget, @Cached("create(T_READLINE)") CheckIsClosedNode checkIsClosedNode, - @Cached BufferedReadlineNode readlineNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached BufferedReadlineNode readlineNode) { checkIsClosedNode.execute(frame, self); byte[] line = readlineNode.execute(frame, inliningTarget, self, -1); if (line.length == 0) { - throw raiseNode.get(inliningTarget).raiseStopIteration(); + throw TpIterNextBuiltin.iteratorExhausted(); } - return factory.createBytes(line); + return PFactory.createBytes(PythonLanguage.get(inliningTarget), line); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedWriterBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedWriterBuiltins.java index ac47b999fe..712c1d9d2c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedWriterBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedWriterBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,20 +41,24 @@ package com.oracle.graal.python.builtins.modules.io; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PBufferedWriter; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import java.util.List; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.modules.io.IOBaseBuiltins.CheckBoolMethodHelperNode; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; import com.oracle.graal.python.runtime.PosixSupportLibrary; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; @@ -67,19 +71,35 @@ @CoreFunctions(extendClasses = PBufferedWriter) public final class BufferedWriterBuiltins extends AbstractBufferedIOBuiltins { + + public static final TpSlots SLOTS = BufferedWriterBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return BufferedWriterBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "BufferedWriter", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class BufferedWriterNode extends PythonBuiltinNode { + @Specialization + static PBuffered doNew(Object cls, @SuppressWarnings("unused") Object arg, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + // data filled in subsequent __init__ call - see BufferedWriterBuiltins.InitNode + return PFactory.createBufferedWriter(language, cls, getInstanceShape.execute(cls)); + } + } + @GenerateInline @GenerateCached(false) public abstract static class BufferedWriterInit extends Node { - public abstract void execute(VirtualFrame frame, Node inliningTarget, PBuffered self, Object raw, int bufferSize, PythonObjectFactory factory); + public abstract void execute(VirtualFrame frame, Node inliningTarget, PBuffered self, Object raw, int bufferSize); @Specialization - static void doInit(VirtualFrame frame, @SuppressWarnings("unused") Node ignored, PBuffered self, Object raw, int bufferSize, PythonObjectFactory factory, + static void doInit(VirtualFrame frame, @SuppressWarnings("unused") Node ignored, PBuffered self, Object raw, int bufferSize, @Bind("this") Node inliningTarget, @Cached CheckBoolMethodHelperNode checkWritableNode, @Cached BufferedInitNode bufferedInitNode, @@ -89,18 +109,18 @@ static void doInit(VirtualFrame frame, @SuppressWarnings("unused") Node ignored, self.setDetached(false); checkWritableNode.checkWriteable(frame, inliningTarget, raw); self.setRaw(raw, isFileIO(self, raw, PBufferedWriter, inliningTarget, getSelfClass, getRawClass)); - bufferedInitNode.execute(frame, inliningTarget, self, bufferSize, factory); + bufferedInitNode.execute(frame, inliningTarget, self, bufferSize); self.resetWrite(); self.setPos(0); self.setOK(true); } - public static void internalInit(PBuffered self, PFileIO raw, int bufferSize, PythonObjectFactory factory, + public static void internalInit(PBuffered self, PFileIO raw, int bufferSize, PythonLanguage language, Object posixSupport, PosixSupportLibrary posixLib) { self.setDetached(false); self.setRaw(raw, true); - BufferedInitNode.internalInit(self, bufferSize, factory, posixSupport, posixLib); + BufferedInitNode.internalInit(self, bufferSize, language, posixSupport, posixLib); self.resetWrite(); self.setPos(0); self.setOK(true); @@ -109,17 +129,17 @@ public static void internalInit(PBuffered self, PFileIO raw, int bufferSize, Pyt } // BufferedWriter(raw[, buffer_size=DEFAULT_BUFFER_SIZE]) - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 2, parameterNames = {"self", "raw", "buffer_size"}, raiseErrorName = "BufferedWriter") + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "BufferedWriter", minNumOfPositionalArgs = 2, parameterNames = {"self", "raw", "buffer_size"}) @GenerateNodeFactory public abstract static class InitNode extends PythonBuiltinNode { @Specialization static Object doIt(VirtualFrame frame, PBuffered self, Object raw, Object bufferSize, @Bind("this") Node inliningTarget, @Cached InitBufferSizeNode initBufferSizeNode, - @Cached BufferedWriterInit init, - @Cached PythonObjectFactory factory) { + @Cached BufferedWriterInit init) { int size = initBufferSizeNode.execute(frame, inliningTarget, bufferSize); - init.execute(frame, inliningTarget, self, raw, size, factory); + init.execute(frame, inliningTarget, self, raw, size); return PNone.NONE; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedWriterNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedWriterNodes.java index baebfde434..30404126c1 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedWriterNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedWriterNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -51,6 +51,7 @@ import static com.oracle.graal.python.runtime.exception.PythonErrorType.OSError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; import com.oracle.graal.python.builtins.objects.bytes.PBytes; @@ -63,7 +64,7 @@ import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -223,11 +224,11 @@ abstract static class RawWriteNode extends PNodeWithContext { */ @Specialization static int bufferedwriterRawWrite(VirtualFrame frame, Node inliningTarget, PBuffered self, byte[] buf, int len, - @Cached(inline = false) PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached PyObjectCallMethodObjArgs callMethod, @Cached PyNumberAsSizeNode asSizeNode, - @Cached PRaiseNode.Lazy lazyRaiseNode) { - PBytes memobj = factory.createBytes(buf, len); + @Cached PRaiseNode lazyRaiseNode) { + PBytes memobj = PFactory.createBytes(language, buf, len); Object res = callMethod.execute(frame, inliningTarget, self.getRaw(), T_WRITE, memobj); if (res == PNone.NONE) { /* @@ -237,7 +238,7 @@ static int bufferedwriterRawWrite(VirtualFrame frame, Node inliningTarget, PBuff } int n = asSizeNode.executeExact(frame, inliningTarget, res, ValueError); if (n < 0 || n > len) { - throw lazyRaiseNode.get(inliningTarget).raise(OSError, IO_S_INVALID_LENGTH, "write()", n, len); + throw lazyRaiseNode.raise(inliningTarget, OSError, IO_S_INVALID_LENGTH, "write()", n, len); } if (n > 0 && self.getAbsPos() != -1) { self.incAbsPos(n); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BytesIOBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BytesIOBuiltins.java index a04992337d..0177ac5eb1 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BytesIOBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BytesIOBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,7 +41,6 @@ package com.oracle.graal.python.builtins.modules.io; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PBytesIOBuf; import static com.oracle.graal.python.builtins.modules.io.BufferedIOUtil.SEEK_CUR; import static com.oracle.graal.python.builtins.modules.io.BufferedIOUtil.SEEK_END; import static com.oracle.graal.python.builtins.modules.io.BufferedIOUtil.SEEK_SET; @@ -74,15 +73,17 @@ import static com.oracle.graal.python.nodes.ErrorMessages.SECOND_ITEM_OF_STATE_MUST_BE_AN_INTEGER_NOT_P; import static com.oracle.graal.python.nodes.ErrorMessages.THIRD_ITEM_OF_STATE_SHOULD_BE_A_DICT_GOT_A_P; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GETSTATE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -97,24 +98,27 @@ import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetInternalObjectArrayNode; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; +import com.oracle.graal.python.lib.IteratorExhausted; import com.oracle.graal.python.lib.PyIndexCheckNode; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyMemoryViewFromObject; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetOrCreateDictNode; import com.oracle.graal.python.runtime.IndirectCallData; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.ArrayBuilder; import com.oracle.graal.python.util.PythonUtils; @@ -133,6 +137,8 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PBytesIO) public final class BytesIOBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = BytesIOBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return BytesIOBuiltinsFactory.getFactories(); @@ -142,8 +148,8 @@ abstract static class ClosedCheckPythonUnaryBuiltinNode extends PythonUnaryBuilt @Specialization(guards = "!self.hasBuf()") @SuppressWarnings("unused") static Object closedError(PBytesIO self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED); } } @@ -151,8 +157,8 @@ abstract static class ClosedCheckPythonBinaryBuiltinNode extends PythonBinaryBui @Specialization(guards = "!self.hasBuf()") @SuppressWarnings("unused") static Object closedError(PBytesIO self, Object arg, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED); } } @@ -166,14 +172,30 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(guards = "!self.hasBuf()") @SuppressWarnings("unused") static Object closedError(PBytesIO self, Object arg, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED); } } protected static final byte[] EMPTY_BYTE_ARRAY = PythonUtils.EMPTY_BYTE_ARRAY; - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, parameterNames = {"$self", "initial_bytes"}) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "BytesIO", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class BytesIONode extends PythonBuiltinNode { + @Specialization + static PBytesIO doNew(Object cls, @SuppressWarnings("unused") Object arg, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + // data filled in subsequent __init__ call - see BytesIONodeBuiltins.InitNode + PBytesIO bytesIO = PFactory.createBytesIO(language, cls, getInstanceShape.execute(cls)); + bytesIO.setBuf(PFactory.createByteArray(language, PythonUtils.EMPTY_BYTE_ARRAY)); + return bytesIO; + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "BytesIO", minNumOfPositionalArgs = 1, parameterNames = {"$self", "initial_bytes"}) @GenerateNodeFactory public abstract static class InitNode extends PythonBinaryBuiltinNode { @@ -181,7 +203,7 @@ public abstract static class InitNode extends PythonBinaryBuiltinNode { @SuppressWarnings("unused") static PNone init(PBytesIO self, PNone initvalue, @Bind("this") Node inliningTarget, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { self.checkExports(inliningTarget, raiseNode); self.setPos(0); return PNone.NONE; @@ -191,7 +213,7 @@ static PNone init(PBytesIO self, PNone initvalue, static PNone init(VirtualFrame frame, PBytesIO self, Object initvalue, @Bind("this") Node inliningTarget, @Cached WriteNode writeNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { /* In case, __init__ is called multiple times. */ self.setStringSize(0); self.setPos(0); @@ -204,9 +226,9 @@ static PNone init(VirtualFrame frame, PBytesIO self, Object initvalue, static PBytes readBytes(PBytesIO self, int size, PythonBufferAccessLibrary bufferLib, - PythonObjectFactory factory) { + PythonLanguage language) { if (size == 0) { - return factory.createEmptyBytes(); + return PFactory.createEmptyBytes(language); } assert (size <= self.getStringSize()); @@ -214,10 +236,10 @@ static PBytes readBytes(PBytesIO self, int size, if (self.getPos() == 0 && bufferLib.hasInternalByteArray(buffer) && self.getExports() == 0 && size > bufferLib.getBufferLength(buffer) / 2) { self.incPos(size); self.markEscaped(); - return factory.createBytes(bufferLib.getInternalByteArray(buffer), size); + return PFactory.createBytes(language, bufferLib.getInternalByteArray(buffer), size); } - PBytes output = factory.createBytes(bufferLib.getCopyOfRange(buffer, self.getPos(), self.getPos() + size)); + PBytes output = PFactory.createBytes(language, bufferLib.getCopyOfRange(buffer, self.getPos(), self.getPos() + size)); self.incPos(size); return output; } @@ -234,8 +256,8 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(guards = "self.hasBuf()") static Object read(PBytesIO self, int len, - @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) { int size = len; /* adjust invalid sizes */ int n = self.getStringSize() - self.getPos(); @@ -245,7 +267,7 @@ static Object read(PBytesIO self, int len, size = 0; } } - return readBytes(self, size, bufferLib, factory); + return readBytes(self, size, bufferLib, language); } } @@ -311,10 +333,10 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(guards = "self.hasBuf()") Object readline(PBytesIO self, int size, - @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) { int n = scanEOL(self, size, bufferLib); - return readBytes(self, n, bufferLib, factory); + return readBytes(self, n, bufferLib, language); } } @@ -330,8 +352,8 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(guards = "self.hasBuf()") static Object readlines(PBytesIO self, int maxsize, - @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) { ArrayBuilder result = new ArrayBuilder<>(); int n; @@ -341,7 +363,7 @@ static Object readlines(PBytesIO self, int maxsize, int size = 0; while ((n = scanEOL(self, -1, buf)) != 0) { self.incPos(n); - PBytes line = factory.createBytes(PythonUtils.arrayCopyOfRange(buf, cur, cur + n)); + PBytes line = PFactory.createBytes(language, PythonUtils.arrayCopyOfRange(buf, cur, cur + n)); result.add(line); size += n; if (maxsize > 0 && size >= maxsize) { @@ -349,7 +371,7 @@ static Object readlines(PBytesIO self, int maxsize, } cur += n; } - return factory.createList(result.toArray(new Object[0])); + return PFactory.createList(language, result.toArray(new Object[0])); } } @@ -397,15 +419,15 @@ abstract static class TruncateNode extends ClosedCheckPythonBinaryBuiltinNode { @Specialization(guards = "self.hasBuf()") static Object truncate(PBytesIO self, int size, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Shared("lib") @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { self.checkExports(inliningTarget, raiseNode); if (size < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, NEGATIVE_SIZE_VALUE_D, size); + throw raiseNode.raise(inliningTarget, ValueError, NEGATIVE_SIZE_VALUE_D, size); } if (size < self.getStringSize()) { - self.unshareAndResize(bufferLib, factory, size, true); + self.unshareAndResize(bufferLib, language, size, true); self.setStringSize(size); } return size; @@ -414,20 +436,20 @@ static Object truncate(PBytesIO self, int size, @Specialization(guards = "self.hasBuf()") static Object truncate(PBytesIO self, @SuppressWarnings("unused") PNone size, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Shared("lib") @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - return truncate(self, self.getPos(), inliningTarget, bufferLib, factory, raiseNode); + @Shared @Cached PRaiseNode raiseNode) { + return truncate(self, self.getPos(), inliningTarget, language, bufferLib, raiseNode); } @Specialization(guards = {"self.hasBuf()", "!isPNone(size)"}) static Object truncate(VirtualFrame frame, PBytesIO self, Object size, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached PyNumberAsSizeNode asSizeNode, @Shared("lib") @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - return truncate(self, asSizeNode.executeExact(frame, inliningTarget, size), inliningTarget, bufferLib, factory, raiseNode); + @Exclusive @Cached PRaiseNode raiseNode) { + return truncate(self, asSizeNode.executeExact(frame, inliningTarget, size), inliningTarget, language, bufferLib, raiseNode); } } @@ -438,11 +460,11 @@ abstract static class WriteNode extends ClosedCheckPythonBinaryBuiltinNode { @Specialization(guards = "self.hasBuf()", limit = "3") static Object doWrite(VirtualFrame frame, PBytesIO self, Object b, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("b") PythonBufferAcquireLibrary acquireLib, @CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { self.checkExports(inliningTarget, raiseNode); Object buffer = acquireLib.acquireReadonly(b, frame, indirectCallData); try { @@ -452,7 +474,7 @@ static Object doWrite(VirtualFrame frame, PBytesIO self, Object b, } int pos = self.getPos(); int endpos = pos + len; - self.unshareAndResize(bufferLib, factory, endpos, false); + self.unshareAndResize(bufferLib, language, endpos, false); bufferLib.readIntoBuffer(buffer, 0, self.getBuf(), pos, len, bufferLib); self.setPos(endpos); if (endpos > self.getStringSize()) { @@ -471,19 +493,17 @@ abstract static class WriteLinesNode extends ClosedCheckPythonBinaryBuiltinNode @Specialization(guards = "self.hasBuf()") static Object writeLines(VirtualFrame frame, PBytesIO self, Object lines, @Bind("this") Node inliningTarget, - @Cached GetNextNode getNextNode, @Cached WriteNode writeNode, - @Cached IsBuiltinObjectProfile errorProfile, @Cached PyObjectGetIter getIter, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PyIterNextNode nextNode, + @Cached PRaiseNode raiseNode) { self.checkExports(inliningTarget, raiseNode); Object iter = getIter.execute(frame, inliningTarget, lines); while (true) { Object line; try { - line = getNextNode.execute(frame, iter); - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); + line = nextNode.execute(frame, inliningTarget, iter); + } catch (IteratorExhausted e) { break; } writeNode.execute(frame, self, line); @@ -560,35 +580,35 @@ static Object seek(PBytesIO self, int pos, int whence) { @Specialization(guards = {"self.hasBuf()", "!isSupportedWhence(whence)"}) static Object whenceError(@SuppressWarnings("unused") PBytesIO self, @SuppressWarnings("unused") int pos, int whence, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, INVALID_WHENCE_D_SHOULD_BE_0_1_OR_2, whence); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, INVALID_WHENCE_D_SHOULD_BE_0_1_OR_2, whence); } @SuppressWarnings("unused") @Specialization(guards = {"self.hasBuf()", "isLargePos(pos, self.getPos())", "whence == 1"}) static Object largePos1(PBytesIO self, int pos, int whence, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(OverflowError, NEW_POSITION_TOO_LARGE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, OverflowError, NEW_POSITION_TOO_LARGE); } @SuppressWarnings("unused") @Specialization(guards = {"self.hasBuf()", "isLargePos(pos, self.getStringSize())", "whence == 2"}) static Object largePos2(PBytesIO self, int pos, int whence, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(OverflowError, NEW_POSITION_TOO_LARGE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, OverflowError, NEW_POSITION_TOO_LARGE); } @Specialization(guards = {"self.hasBuf()", "pos < 0", "whence == 0"}) static Object negPos(@SuppressWarnings("unused") PBytesIO self, int pos, @SuppressWarnings("unused") int whence, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, NEGATIVE_SEEK_VALUE_D, pos); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, NEGATIVE_SEEK_VALUE_D, pos); } @SuppressWarnings("unused") @Specialization(guards = "!self.hasBuf()") static Object closedError(PBytesIO self, int pos, int whence, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED); } } @@ -599,12 +619,12 @@ abstract static class GetBufferNode extends ClosedCheckPythonUnaryBuiltinNode { static Object doit(VirtualFrame frame, PBytesIO self, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached PyMemoryViewFromObject memoryViewNode, - @Cached SequenceStorageNodes.SetLenNode setLenNode, - @Cached PythonObjectFactory factory) { - self.unshareIfNecessary(bufferLib, factory); + @Cached SequenceStorageNodes.SetLenNode setLenNode) { + self.unshareIfNecessary(bufferLib, language); setLenNode.execute(inliningTarget, self.getBuf().getSequenceStorage(), self.getStringSize()); - PBytesIOBuffer buf = factory.createBytesIOBuf(PBytesIOBuf, self); + PBytesIOBuffer buf = PFactory.createBytesIOBuf(language, self); return memoryViewNode.execute(frame, buf); } } @@ -614,12 +634,12 @@ static Object doit(VirtualFrame frame, PBytesIO self, abstract static class GetValueNode extends ClosedCheckPythonUnaryBuiltinNode { @Specialization(guards = "self.hasBuf()") static Object doCopy(PBytesIO self, - @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) { if (bufferLib.hasInternalByteArray(self.getBuf()) && self.getExports() == 0) { self.markEscaped(); } - return factory.createBytes(bufferLib.getInternalOrCopiedByteArray(self.getBuf()), self.getStringSize()); + return PFactory.createBytes(language, bufferLib.getInternalOrCopiedByteArray(self.getBuf()), self.getStringSize()); } } @@ -629,12 +649,12 @@ abstract static class GetStateNode extends ClosedCheckPythonUnaryBuiltinNode { @Specialization(guards = "self.hasBuf()") static Object doit(VirtualFrame frame, PBytesIO self, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached GetValueNode getValueNode, - @Cached GetOrCreateDictNode getDict, - @Cached PythonObjectFactory factory) { + @Cached GetOrCreateDictNode getDict) { Object initValue = getValueNode.execute(frame, self); Object[] state = new Object[]{initValue, self.getPos(), getDict.execute(inliningTarget, self)}; - return factory.createTuple(state); + return PFactory.createTuple(language, state); } } @@ -650,12 +670,12 @@ static Object doit(VirtualFrame frame, PBytesIO self, PTuple state, @Cached PyNumberAsSizeNode asSizeNode, @Cached GetOrCreateDictNode getDict, @Cached HashingStorageAddAllToOther addAllToOtherNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { self.checkExports(inliningTarget, raiseNode); SequenceStorage storage = state.getSequenceStorage(); Object[] array = getArray.execute(inliningTarget, storage); if (storage.length() < 3) { - return notTuple(self, state, raiseNode.get(inliningTarget)); + return notTuple(self, state, raiseNode); } /* * Reset the object to its default state. This is only needed to handle the case of @@ -674,18 +694,18 @@ static Object doit(VirtualFrame frame, PBytesIO self, PTuple state, * against erroneous (or malicious) inputs. */ if (!indexCheckNode.execute(inliningTarget, array[1])) { - throw raiseNode.get(inliningTarget).raise(TypeError, SECOND_ITEM_OF_STATE_MUST_BE_AN_INTEGER_NOT_P, array[1]); + throw raiseNode.raise(inliningTarget, TypeError, SECOND_ITEM_OF_STATE_MUST_BE_AN_INTEGER_NOT_P, array[1]); } int pos = asSizeNode.executeExact(frame, inliningTarget, array[1]); if (pos < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, POSITION_VALUE_CANNOT_BE_NEGATIVE); + throw raiseNode.raise(inliningTarget, ValueError, POSITION_VALUE_CANNOT_BE_NEGATIVE); } self.setPos(pos); /* Set the dictionary of the instance variables. */ if (!PGuards.isNone(array[2])) { if (!PGuards.isDict(array[2])) { - throw raiseNode.get(inliningTarget).raise(TypeError, THIRD_ITEM_OF_STATE_SHOULD_BE_A_DICT_GOT_A_P, array[2]); + throw raiseNode.raise(inliningTarget, TypeError, THIRD_ITEM_OF_STATE_SHOULD_BE_A_DICT_GOT_A_P, array[2]); } /* * Alternatively, we could replace the internal dictionary completely. However, it @@ -699,8 +719,8 @@ static Object doit(VirtualFrame frame, PBytesIO self, PTuple state, @Specialization(guards = "!isPTuple(state)") static Object notTuple(PBytesIO self, Object state, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, P_SETSTATE_ARGUMENT_SHOULD_BE_D_TUPLE_GOT_P, self, 3, state); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, P_SETSTATE_ARGUMENT_SHOULD_BE_D_TUPLE_GOT_P, self, 3, state); } } @@ -761,28 +781,26 @@ abstract static class CloseNode extends PythonUnaryBuiltinNode { @Specialization static Object close(PBytesIO self, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { self.checkExports(inliningTarget, raiseNode); self.setBuf(null); return PNone.NONE; } } - @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iternext, isComplex = true) @GenerateNodeFactory abstract static class IternextNode extends ClosedCheckPythonUnaryBuiltinNode { @Specialization(guards = "self.hasBuf()") static Object doit(PBytesIO self, - @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) { int n = scanEOL(self, -1, bufferLib); if (n == 0) { - throw raiseNode.get(inliningTarget).raiseStopIteration(); + throw TpIterNextBuiltin.iteratorExhausted(); } - return readBytes(self, n, bufferLib, factory); + return readBytes(self, n, bufferLib, language); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/FileIOBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/FileIOBuiltins.java index 97d3d8ad3b..f55c42562f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/FileIOBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/FileIOBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -86,12 +86,8 @@ import static com.oracle.graal.python.nodes.ErrorMessages.REENTRANT_CALL_INSIDE_P_REPR; import static com.oracle.graal.python.nodes.ErrorMessages.UNBOUNDED_READ_RETURNED_MORE_BYTES; import static com.oracle.graal.python.nodes.ErrorMessages.UNCLOSED_FILE; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.nodes.StringLiterals.T_FALSE; -import static com.oracle.graal.python.nodes.StringLiterals.T_STRICT; import static com.oracle.graal.python.nodes.StringLiterals.T_TRUE; -import static com.oracle.graal.python.nodes.StringLiterals.T_UTF8; import static com.oracle.graal.python.runtime.PosixConstants.AT_FDCWD; import static com.oracle.graal.python.runtime.PosixConstants.O_APPEND; import static com.oracle.graal.python.runtime.PosixConstants.O_CREAT; @@ -108,12 +104,15 @@ import java.io.ByteArrayOutputStream; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.modules.CodecsModuleBuiltins; import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins; import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins.FtruncateNode; import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins.LseekNode; @@ -122,23 +121,24 @@ import com.oracle.graal.python.builtins.modules.io.IONodes.IOMode; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; -import com.oracle.graal.python.builtins.objects.bytes.BytesNodes; import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum; import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyErrChainExceptions; import com.oracle.graal.python.lib.PyIndexCheckNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.lib.PyObjectIsTrueNode; import com.oracle.graal.python.lib.PyObjectLookupAttr; +import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode; import com.oracle.graal.python.lib.PyObjectSetAttr; import com.oracle.graal.python.nodes.PConstructAndRaiseNode; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode; import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; @@ -147,7 +147,6 @@ import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.AsyncHandler; import com.oracle.graal.python.runtime.GilNode; import com.oracle.graal.python.runtime.IndirectCallData; @@ -156,7 +155,7 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; @@ -186,6 +185,8 @@ public final class FileIOBuiltins extends PythonBuiltins { private static final int SMALLCHUNK = BUFSIZ; + public static final TpSlots SLOTS = FileIOBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return FileIOBuiltinsFactory.getFactories(); @@ -220,6 +221,19 @@ static void internalClose(VirtualFrame frame, PFileIO self, } } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "FileIO", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class FileIONode extends PythonBuiltinNode { + @Specialization + static PFileIO doNew(Object cls, @SuppressWarnings("unused") Object arg, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + // data filled in subsequent __init__ call - see FileIOBuiltins.InitNode + return PFactory.createFileIO(language, cls, getInstanceShape.execute(cls)); + } + } + @GenerateInline @GenerateCached(false) public abstract static class FileIOInit extends Node { @@ -241,11 +255,11 @@ private static int open(VirtualFrame frame, TruffleString name, int flags, int m PosixSupportLibrary posixLib, GilNode gil, InlinedBranchProfile errorProfile, - PRaiseNode.Lazy raiseNode, + PRaiseNode raiseNode, PConstructAndRaiseNode.Lazy constructAndRaiseNode) { Object path = posixLib.createPathFromString(ctxt.getPosixSupport(), name); if (path == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, EMBEDDED_NULL_BYTE); + throw raiseNode.raise(inliningTarget, ValueError, EMBEDDED_NULL_BYTE); } while (true) { try { @@ -315,7 +329,8 @@ public static void internalInit(PFileIO self, TruffleString name, int fd, IOMode @Specialization(guards = {"!isBadMode(mode)", "!isInvalidMode(mode)"}) static void doInit(VirtualFrame frame, Node inliningTarget, PFileIO self, Object nameobj, IONodes.IOMode mode, boolean closefd, Object opener, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached(inline = false) CallNode callOpener, @Cached PyIndexCheckNode indexCheckNode, @Cached PyNumberAsSizeNode asSizeNode, @@ -330,7 +345,7 @@ static void doInit(VirtualFrame frame, Node inliningTarget, PFileIO self, Object @Cached InlinedConditionProfile errorProfile, @Cached(inline = false) GilNode gil, @Cached(inline = false) TruffleString.FromLongNode fromLongNode, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { if (self.getFD() >= 0) { if (self.isCloseFD()) { @@ -354,35 +369,34 @@ static void doInit(VirtualFrame frame, Node inliningTarget, PFileIO self, Object try { boolean fdIsOwn = false; - PythonContext ctxt = PythonContext.get(inliningTarget); if (fd >= 0) { self.setCloseFD(closefd); - self.setFD(fd, ctxt); + self.setFD(fd, context); } else { self.setCloseFD(true); if (errorProfile.profile(inliningTarget, !closefd)) { - throw raiseNode.get(inliningTarget).raise(ValueError, CANNOT_USE_CLOSEFD); + throw raiseNode.raise(inliningTarget, ValueError, CANNOT_USE_CLOSEFD); } if (opener instanceof PNone) { - self.setFD(open(frame, name, flags, 0666, ctxt, inliningTarget, posixLib, gil, exceptionProfile, raiseNode, constructAndRaiseNode), ctxt); + self.setFD(open(frame, name, flags, 0666, context, inliningTarget, posixLib, gil, exceptionProfile, raiseNode, constructAndRaiseNode), context); } else { Object fdobj = callOpener.execute(frame, opener, nameobj, flags); if (!indexCheckNode.execute(inliningTarget, fdobj)) { - throw raiseNode.get(inliningTarget).raise(TypeError, EXPECTED_INT_FROM_OPENER); + throw raiseNode.raise(inliningTarget, TypeError, EXPECTED_INT_FROM_OPENER); } - self.setFD(asSizeNode.executeExact(frame, inliningTarget, fdobj), ctxt); + self.setFD(asSizeNode.executeExact(frame, inliningTarget, fdobj), context); if (self.getFD() < 0) { /* * The opener returned a negative but didn't set an exception. See issue * #27066 */ - throw raiseNode.get(inliningTarget).raise(ValueError, OPENER_RETURNED_D, self.getFD()); + throw raiseNode.raise(inliningTarget, ValueError, OPENER_RETURNED_D, self.getFD()); } } try { - posixLib.setInheritable(ctxt.getPosixSupport(), self.getFD(), false); + posixLib.setInheritable(context.getPosixSupport(), self.getFD(), false); } catch (PosixException e) { exceptionProfile1.enter(inliningTarget); throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); @@ -394,7 +408,7 @@ static void doInit(VirtualFrame frame, Node inliningTarget, PFileIO self, Object long[] fstatResult; gil.release(true); try { - fstatResult = posixLib.fstat(ctxt.getPosixSupport(), self.getFD()); + fstatResult = posixLib.fstat(context.getPosixSupport(), self.getFD()); } finally { gil.acquire(); } @@ -432,7 +446,7 @@ static void doInit(VirtualFrame frame, Node inliningTarget, PFileIO self, Object try { gil.release(true); try { - long res = posixLib.lseek(ctxt.getPosixSupport(), self.getFD(), 0, mapPythonSeekWhenceToPosix(SEEK_END)); + long res = posixLib.lseek(context.getPosixSupport(), self.getFD(), 0, mapPythonSeekWhenceToPosix(SEEK_END)); self.setSeekable(res >= 0 ? 1 : 0); } finally { gil.acquire(); @@ -464,20 +478,21 @@ static void doInit(VirtualFrame frame, Node inliningTarget, PFileIO self, Object @Specialization(guards = "isInvalidMode(mode)") static void invalidMode(@SuppressWarnings("unused") PFileIO self, @SuppressWarnings("unused") Object nameobj, IONodes.IOMode mode, @SuppressWarnings("unused") boolean closefd, @SuppressWarnings("unused") Object opener, - @Shared @Cached(inline = false) PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, INVALID_MODE_S, mode.mode); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, INVALID_MODE_S, mode.mode); } @SuppressWarnings("unused") @Specialization(guards = "isBadMode(mode)") static void badMode(PFileIO self, Object nameobj, IONodes.IOMode mode, boolean closefd, Object opener, - @Shared @Cached(inline = false) PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, BAD_MODE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, BAD_MODE); } } // FileIO(name, mode='r', closefd=True, opener=None) - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 2, parameterNames = {"$self", "name", "mode", "closefd", "opener"}) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "FileIO", minNumOfPositionalArgs = 2, parameterNames = {"$self", "name", "mode", "closefd", "opener"}) // "mode" should not have `null` character @ArgumentClinic(name = "mode", conversionClass = IONodes.CreateIOModeNode.class, args = "false") @ArgumentClinic(name = "closefd", conversion = ArgumentClinic.ClinicConversion.Boolean, defaultValue = "true", useDefaultForNone = true) @@ -517,22 +532,21 @@ static Object readall(VirtualFrame frame, PFileIO self, @SuppressWarnings("unuse @Specialization(guards = {"!self.isClosed()", "self.isReadable()", "size == 0"}) static Object none(@SuppressWarnings("unused") PFileIO self, @SuppressWarnings("unused") int size, - @Shared @Cached PythonObjectFactory factory) { - return factory.createEmptyBytes(); + @Bind PythonLanguage language) { + return PFactory.createEmptyBytes(language); } @Specialization(guards = {"!self.isClosed()", "self.isReadable()", "size >= 0"}) static Object read(VirtualFrame frame, PFileIO self, int size, @Bind("this") Node inliningTarget, - @Cached PosixModuleBuiltins.ReadNode posixRead, @Cached InlinedBranchProfile readErrorProfile, @Cached InlinedBranchProfile readErrorProfile2, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached GilNode gil, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Shared @Cached PythonObjectFactory factory) { + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - return posixRead.read(self.getFD(), size, inliningTarget, posixLib, readErrorProfile, gil, factory); + return PosixModuleBuiltins.ReadNode.read(self.getFD(), size, inliningTarget, posixLib, context.getPosixSupport(), readErrorProfile, gil); } catch (PosixException e) { if (e.getErrorCode() == EAGAIN.getNumber()) { readErrorProfile2.enter(inliningTarget); @@ -544,14 +558,14 @@ static Object read(VirtualFrame frame, PFileIO self, int size, @Specialization(guards = {"!self.isClosed()", "!self.isReadable()"}) static Object notReadable(@SuppressWarnings("unused") PFileIO self, @SuppressWarnings("unused") int size, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(IOUnsupportedOperation, FILE_NOT_OPEN_FOR_S, "reading"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, IOUnsupportedOperation, FILE_NOT_OPEN_FOR_S, "reading"); } @Specialization(guards = "self.isClosed()") static Object closedError(@SuppressWarnings("unused") PFileIO self, @SuppressWarnings("unused") int size, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED); } } @@ -562,15 +576,14 @@ abstract static class ReadallNode extends PythonUnaryBuiltinNode { @Specialization(guards = "!self.isClosed()") static Object readall(VirtualFrame frame, PFileIO self, @Bind("this") Node inliningTarget, - @Cached PosixModuleBuiltins.ReadNode posixRead, @Cached InlinedBranchProfile readErrorProfile, @Cached SequenceStorageNodes.GetInternalByteArrayNode getBytes, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached InlinedBranchProfile multipleReadsProfile, @Cached GilNode gil, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int bufsize = SMALLCHUNK; boolean mayBeQuick = false; try { @@ -595,7 +608,7 @@ static Object readall(VirtualFrame frame, PFileIO self, int bytesRead = 0; PBytes b; try { - b = posixRead.read(self.getFD(), bufsize, inliningTarget, posixLib, readErrorProfile, gil, factory); + b = PosixModuleBuiltins.ReadNode.read(self.getFD(), bufsize, inliningTarget, posixLib, context.getPosixSupport(), readErrorProfile, gil); bytesRead = b.getSequenceStorage().length(); if (bytesRead == 0 || (mayBeQuick && bytesRead == bufsize - 1)) { return b; @@ -617,13 +630,13 @@ static Object readall(VirtualFrame frame, PFileIO self, // see CPython's function 'fileio.c: new_buffersize' bufsize = bytesRead + Math.max(SMALLCHUNK, bytesRead + 256); if (bufsize <= 0) { - throw raiseNode.get(inliningTarget).raise(OverflowError, UNBOUNDED_READ_RETURNED_MORE_BYTES); + throw raiseNode.raise(inliningTarget, OverflowError, UNBOUNDED_READ_RETURNED_MORE_BYTES); } } int n; try { - b = posixRead.read(self.getFD(), bufsize - bytesRead, inliningTarget, posixLib, readErrorProfile, gil, factory); + b = PosixModuleBuiltins.ReadNode.read(self.getFD(), bufsize - bytesRead, inliningTarget, posixLib, context.getPosixSupport(), readErrorProfile, gil); /* * PosixModuleBuiltins#ReadNode creates PBytes with exact size; */ @@ -646,13 +659,13 @@ static Object readall(VirtualFrame frame, PFileIO self, bytesRead += n; } - return factory.createBytes(toByteArray(result)); + return PFactory.createBytes(PythonLanguage.get(inliningTarget), toByteArray(result)); } @Specialization(guards = "self.isClosed()") static Object closedError(@SuppressWarnings("unused") PFileIO self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED); } } @@ -666,19 +679,18 @@ static Object readinto(VirtualFrame frame, PFileIO self, Object buffer, @Bind("this") Node inliningTarget, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, - @Cached PosixModuleBuiltins.ReadNode posixRead, @Cached InlinedBranchProfile readErrorProfile, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached GilNode gil, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { int size = bufferLib.getBufferLength(buffer); if (size == 0) { return 0; } try { - PBytes data = posixRead.read(self.getFD(), size, inliningTarget, posixLib, readErrorProfile, gil, factory); + PBytes data = PosixModuleBuiltins.ReadNode.read(self.getFD(), size, inliningTarget, posixLib, context.getPosixSupport(), readErrorProfile, gil); int n = bufferLib.getBufferLength(data); bufferLib.readIntoBuffer(data, 0, buffer, 0, n, bufferLib); return n; @@ -696,15 +708,15 @@ static Object readinto(VirtualFrame frame, PFileIO self, Object buffer, @SuppressWarnings("unused") @Specialization(guards = {"!self.isClosed()", "!self.isReadable()"}) static Object notReadable(PFileIO self, Object buffer, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(IOUnsupportedOperation, FILE_NOT_OPEN_FOR_S, "reading"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, IOUnsupportedOperation, FILE_NOT_OPEN_FOR_S, "reading"); } @SuppressWarnings("unused") @Specialization(guards = "self.isClosed()") static Object closedError(PFileIO self, Object buffer, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED); } @Override @@ -713,59 +725,45 @@ protected ArgumentClinicProvider getArgumentClinic() { } } - @Builtin(name = J_WRITE, minNumOfPositionalArgs = 2) + @Builtin(name = J_WRITE, minNumOfPositionalArgs = 2, numOfPositionalOnlyArgs = 2, parameterNames = {"$self", "b"}) + @ArgumentClinic(name = "b", conversion = ArgumentClinic.ClinicConversion.ReadableBuffer) @GenerateNodeFactory - public abstract static class WriteNode extends PythonBinaryBuiltinNode { + public abstract static class WriteNode extends PythonBinaryClinicBuiltinNode { - @Specialization(guards = {"!self.isClosed()", "self.isWritable()"}) - static Object write(VirtualFrame frame, PFileIO self, Object data, + @Specialization(limit = "3") + static Object write(VirtualFrame frame, PFileIO self, Object buffer, @Bind("this") Node inliningTarget, - @Cached GetBytesToWriteNode getBytesToWriteNode, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached InlinedBranchProfile errorProfile, @Cached GilNode gil, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { - byte[] bytes = getBytesToWriteNode.execute(frame, inliningTarget, self, data); + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, + @Cached PRaiseNode raiseNode) { try { - return PosixModuleBuiltins.WriteNode.write(self.getFD(), bytes, bytes.length, inliningTarget, posixLib, errorProfile, gil); - } catch (PosixException e) { - if (e.getErrorCode() == EAGAIN.getNumber()) { - return PNone.NONE; + if (self.isClosed()) { + throw raiseNode.raise(inliningTarget, ValueError, IO_CLOSED); } - errorProfile.enter(inliningTarget); - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); + if (!self.isWritable()) { + throw raiseNode.raise(inliningTarget, IOUnsupportedOperation, FILE_NOT_OPEN_FOR_S, "writing"); + } + try { + return PosixModuleBuiltins.WriteNode.write(self.getFD(), bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer), + inliningTarget, posixLib, context.getPosixSupport(), errorProfile, gil); + } catch (PosixException e) { + if (e.getErrorCode() == EAGAIN.getNumber()) { + return PNone.NONE; + } + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); + } + } finally { + bufferLib.release(buffer); } } - @Specialization(guards = {"!self.isClosed()", "!self.isWritable()"}) - static Object notWritable(@SuppressWarnings("unused") PFileIO self, @SuppressWarnings("unused") Object buf, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(IOUnsupportedOperation, FILE_NOT_OPEN_FOR_S, "writing"); - } - - @Specialization(guards = "self.isClosed()") - static Object closedError(@SuppressWarnings("unused") PFileIO self, @SuppressWarnings("unused") Object buf, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); - } - } - - @GenerateInline - @GenerateCached(false) - abstract static class GetBytesToWriteNode extends Node { - abstract byte[] execute(VirtualFrame frame, Node inliningTarget, PFileIO self, Object data); - - @Specialization(guards = "!self.isUTF8Write()") - static byte[] doBytes(VirtualFrame frame, @SuppressWarnings("unused") PFileIO self, Object data, - @Cached(inline = false) BytesNodes.ToBytesNode toBytes) { - return toBytes.execute(frame, data); - } - - @Specialization(guards = "self.isUTF8Write()") - static byte[] doUtf8(Node inliningTarget, @SuppressWarnings("unused") PFileIO self, Object data, - @Cached(inline = false) CodecsModuleBuiltins.CodecsEncodeToJavaBytesNode encode, - @Cached CastToTruffleStringNode castStr) { - return encode.execute(castStr.execute(inliningTarget, data), T_UTF8, T_STRICT); + @Override + protected ArgumentClinicProvider getArgumentClinic() { + return FileIOBuiltinsClinicProviders.WriteNodeClinicProviderGen.INSTANCE; } } @@ -799,8 +797,8 @@ Object seek(VirtualFrame frame, PFileIO self, long pos, int whence, @Specialization(guards = "self.isClosed()") static Object closedError(@SuppressWarnings("unused") PFileIO self, @SuppressWarnings("unused") Object pos, @SuppressWarnings("unused") int whence, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED); } protected static long internalSeek(PFileIO self, long pos, int whence, @@ -871,15 +869,15 @@ static Object none(VirtualFrame frame, PFileIO self, @SuppressWarnings("unused") @SuppressWarnings("unused") @Specialization(guards = {"!self.isClosed()", "!self.isWritable()"}) static Object notWritable(PFileIO self, Object posobj, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(IOUnsupportedOperation, FILE_NOT_OPEN_FOR_S, "writing"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, IOUnsupportedOperation, FILE_NOT_OPEN_FOR_S, "writing"); } @SuppressWarnings("unused") @Specialization(guards = "self.isClosed()") static Object closedError(PFileIO self, Object posobj, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED); } } @@ -979,8 +977,8 @@ static Object known(PFileIO self) { @Specialization(guards = "self.isClosed()") static Object closedError(@SuppressWarnings("unused") PFileIO self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED); } } @@ -994,8 +992,8 @@ static Object readable(PFileIO self) { @Specialization(guards = "self.isClosed()") static Object closedError(@SuppressWarnings("unused") PFileIO self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED); } } @@ -1009,8 +1007,8 @@ static Object writable(PFileIO self) { @Specialization(guards = "self.isClosed()") static Object closedError(@SuppressWarnings("unused") PFileIO self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED); } } @@ -1024,8 +1022,8 @@ static Object fileno(PFileIO self) { @Specialization(guards = "self.isClosed()") static Object closedError(@SuppressWarnings("unused") PFileIO self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED); } } @@ -1046,8 +1044,8 @@ boolean isatty(@SuppressWarnings("unused") PFileIO self, @Specialization(guards = "self.isClosed()") static boolean closedError(@SuppressWarnings("unused") PFileIO self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED); } } @@ -1137,14 +1135,13 @@ static Object doit(PFileIO self, @SuppressWarnings("unused") PNone v) { @Specialization(guards = "!isNoValue(v)") static Object doit(VirtualFrame frame, PFileIO self, Object v, - @Bind("this") Node inliningTarget, @Cached PyObjectIsTrueNode isTrueNode) { - self.setFinalizing(isTrueNode.execute(frame, inliningTarget, v)); + self.setFinalizing(isTrueNode.execute(frame, v)); return PNone.NONE; } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @@ -1159,10 +1156,9 @@ static TruffleString doit(@SuppressWarnings("unused") PFileIO self) { static TruffleString doit(VirtualFrame frame, PFileIO self, @Bind("this") Node inliningTarget, @Cached PyObjectLookupAttr lookupName, - @Cached("create(Repr)") LookupAndCallUnaryNode repr, - @Cached CastToTruffleStringNode castToTruffleStringNode, + @Cached PyObjectReprAsTruffleStringNode repr, @Cached SimpleTruffleStringFormatNode simpleTruffleStringFormatNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { TruffleString mode = ModeNode.modeString(self); TruffleString closefd = self.isCloseFD() ? T_TRUE : T_FALSE; Object nameobj = lookupName.execute(frame, inliningTarget, self, T_NAME); @@ -1170,10 +1166,10 @@ static TruffleString doit(VirtualFrame frame, PFileIO self, return simpleTruffleStringFormatNode.format("<_io.FileIO fd=%d mode='%s' closefd=%s>", self.getFD(), mode, closefd); } if (!PythonContext.get(inliningTarget).reprEnter(self)) { - throw raiseNode.get(inliningTarget).raise(RuntimeError, REENTRANT_CALL_INSIDE_P_REPR, self); + throw raiseNode.raise(inliningTarget, RuntimeError, REENTRANT_CALL_INSIDE_P_REPR, self); } try { - TruffleString name = castToTruffleStringNode.execute(inliningTarget, repr.executeObject(frame, nameobj)); + TruffleString name = repr.execute(frame, inliningTarget, nameobj); return simpleTruffleStringFormatNode.format("<_io.FileIO name=%s mode='%s' closefd=%s>", name, mode, closefd); } finally { PythonContext.get(inliningTarget).reprLeave(self); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IOBaseBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IOBaseBuiltins.java index 455a59d2f8..5ae86a28df 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IOBaseBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IOBaseBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -77,8 +77,6 @@ import static com.oracle.graal.python.nodes.SpecialMethodNames.J_FILENO; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ENTER__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EXIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T_FILENO; import static com.oracle.graal.python.runtime.exception.PythonErrorType.IOUnsupportedOperation; import static com.oracle.graal.python.runtime.exception.PythonErrorType.OSError; @@ -87,7 +85,11 @@ import java.io.ByteArrayOutputStream; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -96,8 +98,12 @@ import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; +import com.oracle.graal.python.lib.IteratorExhausted; import com.oracle.graal.python.lib.PyErrChainExceptions; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.lib.PyObjectGetIter; @@ -115,10 +121,9 @@ import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.IsNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.ArrayBuilder; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.dsl.Bind; @@ -139,6 +144,7 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PIOBase) public final class IOBaseBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = IOBaseBuiltinsSlotsGen.SLOTS; // taken from usr/include/stdio.h public static final int BUFSIZ = 8192; @@ -148,6 +154,18 @@ protected List> getNodeFa return IOBaseBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "_IOBase", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class IOBaseNode extends PythonBuiltinNode { + @Specialization + static PythonObject doGeneric(Object cls, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createPythonObject(language, cls, getInstanceShape.execute(cls)); + } + } + @Builtin(name = J_CLOSED, minNumOfPositionalArgs = 1, isGetter = true) @GenerateNodeFactory abstract static class ClosedNode extends PythonUnaryBuiltinNode { @@ -200,9 +218,9 @@ abstract static class CheckClosedHelperNode extends Node { static PNone doIt(VirtualFrame frame, Node inliningTarget, PythonObject self, @Cached PyObjectGetAttr getAttr, @Cached PyObjectIsTrueNode isTrueNode, - @Cached PRaiseNode.Lazy lazyRaiseNode) { - if (isTrueNode.execute(frame, inliningTarget, getAttr.execute(frame, inliningTarget, self, T_CLOSED))) { - throw lazyRaiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.IO_CLOSED); + @Cached PRaiseNode raiseNode) { + if (isTrueNode.execute(frame, getAttr.execute(frame, inliningTarget, self, T_CLOSED))) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.IO_CLOSED); } return PNone.NONE; } @@ -241,14 +259,14 @@ final boolean checkReadable(VirtualFrame frame, Node inliningTarget, Object self static boolean doIt(VirtualFrame frame, Node inliningTarget, Object self, TruffleString method, TruffleString errorMessage, @Cached PyObjectCallMethodObjArgs callMethod, @Cached(inline = false) IsNode isNode, - @Cached PRaiseNode.Lazy lazyRaiseNode) { + @Cached PRaiseNode raiseNode) { CompilerAsserts.partialEvaluationConstant(method); CompilerAsserts.partialEvaluationConstant(errorMessage); Object v = callMethod.execute(frame, inliningTarget, self, method); if (isNode.isTrue(v)) { return true; } - throw unsupported(lazyRaiseNode.get(inliningTarget), errorMessage); + throw unsupported(inliningTarget, raiseNode, errorMessage); } } @@ -323,9 +341,9 @@ abstract static class FlushNode extends PythonUnaryBuiltinNode { static PNone flush(VirtualFrame frame, PythonObject self, @Bind("this") Node inliningTarget, @Cached PyObjectLookupAttr lookup, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (isClosed(inliningTarget, self, frame, lookup)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.IO_CLOSED); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.IO_CLOSED); } return PNone.NONE; } @@ -336,8 +354,9 @@ static PNone flush(VirtualFrame frame, PythonObject self, abstract static class SeekNode extends PythonBuiltinNode { @Specialization static Object seek(@SuppressWarnings("unused") PythonObject self, @SuppressWarnings("unused") Object args, + @Bind("this") Node inliningTarget, @Cached PRaiseNode raiseNode) { - throw unsupported(raiseNode, T_SEEK); + throw unsupported(inliningTarget, raiseNode, T_SEEK); } } @@ -346,8 +365,9 @@ static Object seek(@SuppressWarnings("unused") PythonObject self, @SuppressWarni abstract static class TruncateNode extends PythonBuiltinNode { @Specialization static Object truncate(@SuppressWarnings("unused") PythonObject self, + @Bind("this") Node inliningTarget, @Cached PRaiseNode raiseNode) { - throw unsupported(raiseNode, T_TRUNCATE); + throw unsupported(inliningTarget, raiseNode, T_TRUNCATE); } } @@ -390,8 +410,9 @@ static Object exit(VirtualFrame frame, PythonObject self, abstract static class FilenoNode extends PythonUnaryBuiltinNode { @Specialization static Object fileno(@SuppressWarnings("unused") PythonObject self, + @Bind("this") Node inliningTarget, @Cached PRaiseNode raiseNode) { - throw unsupported(raiseNode, T_FILENO); + throw unsupported(inliningTarget, raiseNode, T_FILENO); } } @@ -407,7 +428,7 @@ static boolean isatty(VirtualFrame frame, PythonObject self, } } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory abstract static class IterNode extends PythonUnaryBuiltinNode { @Specialization @@ -419,18 +440,17 @@ static PythonObject iter(VirtualFrame frame, PythonObject self, } } - @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iternext, isComplex = true) @GenerateNodeFactory - abstract static class NextNode extends PythonUnaryBuiltinNode { + abstract static class NextNode extends TpIterNextBuiltin { @Specialization static Object next(VirtualFrame frame, PythonObject self, @Bind("this") Node inliningTarget, @Cached PyObjectCallMethodObjArgs callMethod, - @Cached PyObjectSizeNode sizeNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PyObjectSizeNode sizeNode) { Object line = callMethod.execute(frame, inliningTarget, self, T_READLINE); if (sizeNode.execute(frame, inliningTarget, line) <= 0) { - throw raiseNode.get(inliningTarget).raiseStopIteration(); + throw iteratorExhausted(); } return line; } @@ -443,18 +463,16 @@ abstract static class WriteLinesNode extends PythonBinaryBuiltinNode { static Object writeLines(VirtualFrame frame, PythonObject self, Object lines, @Bind("this") Node inliningTarget, @Cached CheckClosedHelperNode checkClosedNode, - @Cached GetNextNode getNextNode, - @Cached IsBuiltinObjectProfile errorProfile, @Cached PyObjectCallMethodObjArgs callMethod, - @Cached PyObjectGetIter getIter) { + @Cached PyObjectGetIter getIter, + @Cached PyIterNextNode nextNode) { checkClosedNode.execute(frame, inliningTarget, self); Object iter = getIter.execute(frame, inliningTarget, lines); while (true) { Object line; try { - line = getNextNode.execute(frame, iter); - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); + line = nextNode.execute(frame, inliningTarget, iter); + } catch (IteratorExhausted e) { break; } callMethod.execute(frame, inliningTarget, self, T_WRITE, line); @@ -480,14 +498,14 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static PBytes readline(VirtualFrame frame, Object self, int limit, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached PyObjectLookupAttr lookupPeek, @Cached CallNode callPeek, @Cached PyObjectCallMethodObjArgs callRead, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, @Cached InlinedConditionProfile hasPeek, @Cached InlinedConditionProfile isBytes, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { /* For backwards compatibility, a (slowish) readline(). */ Object peek = lookupPeek.execute(frame, inliningTarget, self, T_PEEK); ByteArrayOutputStream buffer = createOutputStream(); @@ -497,7 +515,7 @@ static PBytes readline(VirtualFrame frame, Object self, int limit, Object readahead = callPeek.execute(frame, peek, 1); // TODO _PyIO_trap_eintr [GR-23297] if (isBytes.profile(inliningTarget, !(readahead instanceof PBytes))) { - throw raiseNode.get(inliningTarget).raise(OSError, S_SHOULD_RETURN_BYTES_NOT_P, "peek()", readahead); + throw raiseNode.raise(inliningTarget, OSError, S_SHOULD_RETURN_BYTES_NOT_P, "peek()", readahead); } byte[] buf = bufferLib.getInternalOrCopiedByteArray(readahead); int bufLen = bufferLib.getBufferLength(readahead); @@ -514,7 +532,7 @@ static PBytes readline(VirtualFrame frame, Object self, int limit, Object b = callRead.execute(frame, inliningTarget, self, T_READ, nreadahead); if (isBytes.profile(inliningTarget, !(b instanceof PBytes))) { - throw raiseNode.get(inliningTarget).raise(OSError, S_SHOULD_RETURN_BYTES_NOT_P, "read()", b); + throw raiseNode.raise(inliningTarget, OSError, S_SHOULD_RETURN_BYTES_NOT_P, "read()", b); } byte[] bytes = bufferLib.getInternalOrCopiedByteArray(b); int bytesLen = bufferLib.getBufferLength(b); @@ -528,7 +546,7 @@ static PBytes readline(VirtualFrame frame, Object self, int limit, } } - return factory.createBytes(toByteArray(buffer)); + return PFactory.createBytes(language, toByteArray(buffer)); } } @@ -544,31 +562,30 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static Object withHint(VirtualFrame frame, Object self, int hintIn, @Bind("this") Node inliningTarget, - @Cached GetNextNode next, + @Bind PythonLanguage language, @Cached InlinedConditionProfile isNegativeHintProfile, - @Cached IsBuiltinObjectProfile errorProfile, @Cached PyObjectGetIter getIter, - @Cached PyObjectSizeNode sizeNode, - @Cached PythonObjectFactory factory) { + @Cached PyIterNextNode nextNode, + @Cached PyObjectSizeNode sizeNode) { int hint = isNegativeHintProfile.profile(inliningTarget, hintIn <= 0) ? Integer.MAX_VALUE : hintIn; int length = 0; Object iterator = getIter.execute(frame, inliningTarget, self); ArrayBuilder list = new ArrayBuilder<>(); while (true) { + Object line; try { - Object line = next.execute(frame, iterator); - list.add(line); - int lineLength = sizeNode.execute(frame, inliningTarget, line); - if (lineLength > hint - length) { - break; - } - length += lineLength; - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); + line = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { + break; + } + list.add(line); + int lineLength = sizeNode.execute(frame, inliningTarget, line); + if (lineLength > hint - length) { break; } + length += lineLength; } - return factory.createList(list.toArray(new Object[0])); + return PFactory.createList(language, list.toArray(new Object[0])); } } @@ -585,7 +602,7 @@ private static boolean isClosed(Node inliningTarget, PythonObject self, VirtualF /** * Equivalent of {@code iobase_unsupported}. */ - private static PException unsupported(PRaiseNode raiseNode, TruffleString message) { - throw raiseNode.raise(IOUnsupportedOperation, message); + private static PException unsupported(Node inliningTarget, PRaiseNode raiseNode, TruffleString message) { + throw raiseNode.raise(inliningTarget, IOUnsupportedOperation, message); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IOBaseDictBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IOBaseDictBuiltins.java index c219e42c9c..e4d5253fec 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IOBaseDictBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IOBaseDictBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -94,8 +94,8 @@ static Object doit(PythonObject self, @SuppressWarnings("unused") PNone none, @Specialization static Object setDict(PythonObject self, @SuppressWarnings("unused") Object d, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.AssertionError, ErrorMessages.ATTR_DICT_IS_NOT_WRITABLE, self); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.AssertionError, ErrorMessages.ATTR_DICT_IS_NOT_WRITABLE, self); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IOModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IOModuleBuiltins.java index 6cc698da4d..c1e3d9cb6b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IOModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IOModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,13 +44,7 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.EncodingWarning; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.IOUnsupportedOperation; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OSError; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PBufferedRWPair; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PBufferedRandom; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PBufferedReader; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PBufferedWriter; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PIOBase; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PIncrementalNewlineDecoder; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PTextIOWrapper; +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PWindowsConsoleIO; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError; import static com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins.T_WARN; import static com.oracle.graal.python.builtins.modules.io.BufferedIOUtil.SEEK_CUR; @@ -75,17 +69,16 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.PythonOS; import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins; import com.oracle.graal.python.builtins.modules.io.IONodes.IOMode; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; @@ -93,7 +86,6 @@ import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode; @@ -103,12 +95,10 @@ import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.util.PythonUtils; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.ImportStatic; @@ -137,136 +127,24 @@ public void initialize(Python3Core core) { addBuiltinConstant("DEFAULT_BUFFER_SIZE", DEFAULT_BUFFER_SIZE); PythonBuiltinClass unsupportedOpExcType = core.lookupType(IOUnsupportedOperation); PythonBuiltinClass osError = core.lookupType(OSError); - unsupportedOpExcType.setBases(osError, new PythonAbstractClass[]{osError, core.lookupType(ValueError)}); + unsupportedOpExcType.setBases(null, osError, new PythonAbstractClass[]{osError, core.lookupType(ValueError)}); addBuiltinConstant(IOUnsupportedOperation.getName(), unsupportedOpExcType); addBuiltinConstant(BlockingIOError.getName(), core.lookupType(BlockingIOError)); addBuiltinConstant("_warn", core.lookupBuiltinModule(T__WARNINGS).getAttribute(T_WARN)); if (PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32) { addBuiltinConstant("_os", core.lookupBuiltinModule(T_NT)); + addBuiltinConstant("_WindowsConsoleIO", PWindowsConsoleIO); } else { addBuiltinConstant("_os", core.lookupBuiltinModule(T_POSIX)); } } - @Builtin(name = "_IOBase", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PIOBase) - @GenerateNodeFactory - public abstract static class IOBaseNode extends PythonBuiltinNode { - @Specialization - static PythonObject doGeneric(Object cls, - @Cached PythonObjectFactory factory) { - return factory.createPythonObject(cls); - } - } - - @Builtin(name = "FileIO", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PFileIO) - @GenerateNodeFactory - public abstract static class FileIONode extends PythonBuiltinNode { - @Specialization - static PFileIO doNew(Object cls, @SuppressWarnings("unused") Object arg, - @Cached PythonObjectFactory factory) { - // data filled in subsequent __init__ call - see FileIOBuiltins.InitNode - return factory.createFileIO(cls); - } - } - - @Builtin(name = "BufferedReader", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PBufferedReader) - @GenerateNodeFactory - public abstract static class BufferedReaderNode extends PythonBuiltinNode { - @Specialization - static PBuffered doNew(Object cls, @SuppressWarnings("unused") Object arg, - @Cached PythonObjectFactory factory) { - // data filled in subsequent __init__ call - see BufferedReaderBuiltins.InitNode - return factory.createBufferedReader(cls); - } - } - - @Builtin(name = "BufferedWriter", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PBufferedWriter) - @GenerateNodeFactory - public abstract static class BufferedWriterNode extends PythonBuiltinNode { - @Specialization - static PBuffered doNew(Object cls, @SuppressWarnings("unused") Object arg, - @Cached PythonObjectFactory factory) { - // data filled in subsequent __init__ call - see BufferedWriterBuiltins.InitNode - return factory.createBufferedWriter(cls); - } - } - - @Builtin(name = "BufferedRWPair", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PBufferedRWPair) - @GenerateNodeFactory - public abstract static class BufferedRWPairNode extends PythonBuiltinNode { - @Specialization - static PRWPair doNew(Object cls, @SuppressWarnings("unused") Object arg, - @Cached PythonObjectFactory factory) { - // data filled in subsequent __init__ call - see BufferedRWPairBuiltins.InitNode - return factory.createRWPair(cls); - } - } - - @Builtin(name = "BufferedRandom", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PBufferedRandom) - @GenerateNodeFactory - public abstract static class BufferedRandomNode extends PythonBuiltinNode { - @Specialization - static PBuffered doNew(Object cls, @SuppressWarnings("unused") Object arg, - @Cached PythonObjectFactory factory) { - // data filled in subsequent __init__ call - see BufferedRandomBuiltins.InitNode - return factory.createBufferedRandom(cls); - } - } - - @Builtin(name = "TextIOWrapper", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PTextIOWrapper) - @GenerateNodeFactory - public abstract static class TextIOWrapperNode extends PythonBuiltinNode { - @Specialization - static PTextIO doNew(Object cls, @SuppressWarnings("unused") Object arg, - @Cached PythonObjectFactory factory) { - // data filled in subsequent __init__ call - see TextIOWrapperBuiltins.InitNode - return factory.createTextIO(cls); - } - } - - @Builtin(name = "BytesIO", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PBytesIO) - @GenerateNodeFactory - public abstract static class BytesIONode extends PythonBuiltinNode { - @Specialization - static PBytesIO doNew(Object cls, @SuppressWarnings("unused") Object arg, - @Cached PythonObjectFactory factory) { - // data filled in subsequent __init__ call - see BytesIONodeBuiltins.InitNode - PBytesIO bytesIO = factory.createBytesIO(cls); - bytesIO.setBuf(factory.createByteArray(PythonUtils.EMPTY_BYTE_ARRAY)); - return bytesIO; - } - } - - @Builtin(name = "StringIO", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PythonBuiltinClassType.PStringIO) - @GenerateNodeFactory - public abstract static class StringIONode extends PythonBuiltinNode { - @Specialization - static PStringIO doNew(Object cls, @SuppressWarnings("unused") Object arg, - @Cached PythonObjectFactory factory) { - // data filled in subsequent __init__ call - see StringIONodeBuiltins.InitNode - return factory.createStringIO(cls); - } - } - - @Builtin(name = "IncrementalNewlineDecoder", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PIncrementalNewlineDecoder) - @GenerateNodeFactory - public abstract static class IncrementalNewlineDecoderNode extends PythonBuiltinNode { - @Specialization - static PNLDecoder doNew(Object cls, @SuppressWarnings("unused") Object arg, - @Cached PythonObjectFactory factory) { - // data filled in subsequent __init__ call - see - // IncrementalNewlineDecoderBuiltins.InitNode - return factory.createNLDecoder(cls); - } - } - private static PFileIO createFileIO(VirtualFrame frame, Node inliningTarget, Object file, IONodes.IOMode mode, boolean closefd, Object opener, - PythonObjectFactory factory, FileIOBuiltins.FileIOInit initFileIO) { /* Create the Raw file stream */ mode.text = mode.universal = false; // FileIO doesn't recognize those. - PFileIO fileIO = factory.createFileIO(PythonBuiltinClassType.PFileIO); + PFileIO fileIO = PFactory.createFileIO(PythonLanguage.get(inliningTarget)); initFileIO.execute(frame, inliningTarget, fileIO, file, mode, closefd, opener); return fileIO; } @@ -285,9 +163,8 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static PFileIO openCode(VirtualFrame frame, TruffleString path, @Bind("this") Node inliningTarget, - @Cached FileIOBuiltins.FileIOInit initFileIO, - @Cached PythonObjectFactory factory) { - return createFileIO(frame, inliningTarget, path, IOMode.RB, true, PNone.NONE, factory, initFileIO); + @Cached FileIOBuiltins.FileIOInit initFileIO) { + return createFileIO(frame, inliningTarget, path, IOMode.RB, true, PNone.NONE, initFileIO); } } @@ -319,9 +196,9 @@ protected static Object openText(VirtualFrame frame, Object file, IONodes.IOMode @Cached PyObjectSetAttr setAttrNode, @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, @Exclusive @Cached PyObjectCallMethodObjArgs callClose, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - PFileIO fileIO = createFileIO(frame, inliningTarget, file, mode, closefd, opener, factory, initFileIO); + @Bind PythonLanguage language, + @Exclusive @Cached PRaiseNode raiseNode) { + PFileIO fileIO = createFileIO(frame, inliningTarget, file, mode, closefd, opener, initFileIO); Object result = fileIO; try { /* buffering */ @@ -349,21 +226,21 @@ protected static Object openText(VirtualFrame frame, Object file, IONodes.IOMode buffering = fileIO.getBlksize(); } if (buffering < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, INVALID_BUFFERING_SIZE); + throw raiseNode.raise(inliningTarget, ValueError, INVALID_BUFFERING_SIZE); } /* if not buffering, returns the raw file object */ if (buffering == 0) { - invalidunbuf(file, mode, bufferingValue, encoding, errors, newline, closefd, opener, raiseNode.get(inliningTarget)); + invalidunbuf(file, mode, bufferingValue, encoding, errors, newline, closefd, opener, raiseNode); } /* wraps into a buffered file */ - PBuffered buffer = createBufferedIO.execute(frame, inliningTarget, fileIO, buffering, factory, mode); + PBuffered buffer = createBufferedIO.execute(frame, inliningTarget, fileIO, buffering, mode); result = buffer; /* wraps into a TextIOWrapper */ - PTextIO wrapper = factory.createTextIO(PTextIOWrapper); + PTextIO wrapper = PFactory.createTextIO(language); initTextIO.execute(frame, inliningTarget, wrapper, buffer, encoding, errors == PNone.NONE ? T_STRICT : (TruffleString) errors, newline, line_buffering, false); @@ -385,9 +262,8 @@ protected static PFileIO openBinaryNoBuf(VirtualFrame frame, Object file, IONode @SuppressWarnings("unused") PNone newline, boolean closefd, Object opener, @Bind("this") Node inliningTarget, - @Exclusive @Cached FileIOBuiltins.FileIOInit initFileIO, - @Shared @Cached PythonObjectFactory factory) { - return createFileIO(frame, inliningTarget, file, mode, closefd, opener, factory, initFileIO); + @Exclusive @Cached FileIOBuiltins.FileIOInit initFileIO) { + return createFileIO(frame, inliningTarget, file, mode, closefd, opener, initFileIO); } @Specialization(guards = {"!isXRWA(mode)", "!isUnknown(mode)", "!isTB(mode)", "isValidUniveral(mode)", "isBinary(mode)", "bufferingValue == 1"}) @@ -402,10 +278,9 @@ protected static Object openBinaryB1(VirtualFrame frame, Object file, IONodes.IO @Exclusive @Cached IONodes.CreateBufferedIONode createBufferedIO, @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, @Exclusive @Cached PyObjectCallMethodObjArgs callClose, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { warnNode.warnEx(frame, RuntimeWarning, LINE_BUFFERING_ISNT_SUPPORTED, 1); - return openBinary(frame, file, mode, bufferingValue, encoding, errors, newline, closefd, opener, inliningTarget, initFileIO, createBufferedIO, posixLib, callClose, factory, raiseNode); + return openBinary(frame, file, mode, bufferingValue, encoding, errors, newline, closefd, opener, inliningTarget, initFileIO, createBufferedIO, posixLib, callClose, raiseNode); } @Specialization(guards = {"!isXRWA(mode)", "!isUnknown(mode)", "!isTB(mode)", "isValidUniveral(mode)", "isBinary(mode)", "bufferingValue != 1", "bufferingValue != 0"}) @@ -419,9 +294,8 @@ protected static Object openBinary(VirtualFrame frame, Object file, IONodes.IOMo @Exclusive @Cached IONodes.CreateBufferedIONode createBufferedIO, @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, @Exclusive @Cached PyObjectCallMethodObjArgs callClose, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - PFileIO fileIO = createFileIO(frame, inliningTarget, file, mode, closefd, opener, factory, initFileIO); + @Exclusive @Cached PRaiseNode raiseNode) { + PFileIO fileIO = createFileIO(frame, inliningTarget, file, mode, closefd, opener, initFileIO); try { /* buffering */ boolean isatty = false; @@ -444,7 +318,7 @@ protected static Object openBinary(VirtualFrame frame, Object file, IONodes.IOMo buffering = fileIO.getBlksize(); } if (buffering < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, INVALID_BUFFERING_SIZE); + throw raiseNode.raise(inliningTarget, ValueError, INVALID_BUFFERING_SIZE); } /* if not buffering, returns the raw file object */ @@ -455,7 +329,7 @@ protected static Object openBinary(VirtualFrame frame, Object file, IONodes.IOMo /* wraps into a buffered file */ /* if binary, returns the buffered file */ - return createBufferedIO.execute(frame, inliningTarget, fileIO, buffering, factory, mode); + return createBufferedIO.execute(frame, inliningTarget, fileIO, buffering, mode); } catch (PException e) { callClose.execute(frame, inliningTarget, fileIO, T_CLOSE); throw e; @@ -465,35 +339,35 @@ protected static Object openBinary(VirtualFrame frame, Object file, IONodes.IOMo @SuppressWarnings("unused") @Specialization(guards = "isUnknown(mode)") protected static Object unknownMode(Object file, IONodes.IOMode mode, int bufferingValue, Object encoding, Object errors, Object newline, boolean closefd, Object opener, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, UNKNOWN_MODE_S, mode.mode); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, UNKNOWN_MODE_S, mode.mode); } @SuppressWarnings("unused") @Specialization(guards = "isTB(mode)") protected static Object invalidTB(Object file, IONodes.IOMode mode, int bufferingValue, Object encoding, Object errors, Object newline, boolean closefd, Object opener, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, CAN_T_HAVE_TEXT_AND_BINARY_MODE_AT_ONCE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, CAN_T_HAVE_TEXT_AND_BINARY_MODE_AT_ONCE); } @SuppressWarnings("unused") @Specialization(guards = "!isValidUniveral(mode)") protected static Object invalidUniversal(Object file, IONodes.IOMode mode, int bufferingValue, Object encoding, Object errors, Object newline, boolean closefd, Object opener, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, MODE_U_CANNOT_BE_COMBINED_WITH_X_W_A_OR); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, MODE_U_CANNOT_BE_COMBINED_WITH_X_W_A_OR); } @SuppressWarnings("unused") @Specialization(guards = "isXRWA(mode)") protected static Object invalidxrwa(Object file, IONodes.IOMode mode, int bufferingValue, Object encoding, Object errors, Object newline, boolean closefd, Object opener, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, MUST_HAVE_EXACTLY_ONE_OF_CREATE_READ_WRITE_APPEND_MODE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, MUST_HAVE_EXACTLY_ONE_OF_CREATE_READ_WRITE_APPEND_MODE); } @SuppressWarnings("unused") @Specialization(guards = {"isBinary(mode)", "isAnyNotNone(encoding, errors, newline)"}) protected static Object invalidBinary(Object file, IONodes.IOMode mode, int bufferingValue, Object encoding, Object errors, Object newline, boolean closefd, Object opener, - @Shared @Cached PRaiseNode raiseNode) { + @Bind("this") Node inliningTarget) { String s; if (encoding != PNone.NONE) { s = "encoding"; @@ -502,14 +376,14 @@ protected static Object invalidBinary(Object file, IONodes.IOMode mode, int buff } else { s = "newline"; } - throw raiseNode.raise(ValueError, BINARY_MODE_DOESN_T_TAKE_AN_S_ARGUMENT, s); + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, BINARY_MODE_DOESN_T_TAKE_AN_S_ARGUMENT, s); } @SuppressWarnings("unused") @Specialization(guards = {"!isBinary(mode)", "bufferingValue == 0"}) protected static Object invalidunbuf(Object file, IONodes.IOMode mode, int bufferingValue, Object encoding, Object errors, Object newline, boolean closefd, Object opener, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, CAN_T_HAVE_UNBUFFERED_TEXT_IO); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, CAN_T_HAVE_UNBUFFERED_TEXT_IO); } public static boolean isAnyNotNone(Object encoding, Object errors, Object newline) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IONodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IONodes.java index 3a232bf8d9..792011dc9c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IONodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IONodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,9 +41,6 @@ package com.oracle.graal.python.builtins.modules.io; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.DeprecationWarning; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PBufferedRandom; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PBufferedReader; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PBufferedWriter; import static com.oracle.graal.python.nodes.ErrorMessages.EMBEDDED_NULL_CHARACTER; import static com.oracle.graal.python.nodes.ErrorMessages.EXPECTED_OBJ_TYPE_S_GOT_P; import static com.oracle.graal.python.nodes.ErrorMessages.INVALID_MODE_S; @@ -53,6 +50,7 @@ import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ClinicConverterFactory; import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins; import com.oracle.graal.python.builtins.objects.PNone; @@ -67,11 +65,10 @@ import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentCastNode; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; @@ -214,12 +211,14 @@ public class IONodes { public static final TruffleString T_R = tsLiteral("r"); public static final TruffleString T_W = tsLiteral("w"); public static final TruffleString T_RB = tsLiteral("rb"); + public static final TruffleString T_WB = tsLiteral("wb"); @CompilerDirectives.ValueType public static final class IOMode { public static final IOMode R = new IOMode(T_R, true, false, false, 1); public static final IOMode W = new IOMode(T_W, false, true, false, 1); public static final IOMode RB = new IOMode(T_RB, true, false, true, 1); + public static final IOMode WB = new IOMode(T_WB, false, true, true, 1); boolean creating; boolean reading; @@ -377,21 +376,21 @@ IOMode generic(VirtualFrame frame, Object modeObj, @Cached InlinedBranchProfile errProfile2, @Cached InlinedBranchProfile errProfile3, @Cached WarningsModuleBuiltins.WarnNode warnNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { TruffleString mode; try { mode = toString.execute(inliningTarget, modeObj); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP); } IOMode m = new IOMode(mode, createCodePointIteratorNode, nextNode); if (m.hasNil) { errProfile1.enter(inliningTarget); - throw raiseNode.get(inliningTarget).raise(ValueError, EMBEDDED_NULL_CHARACTER); + throw raiseNode.raise(inliningTarget, ValueError, EMBEDDED_NULL_CHARACTER); } if (m.isInvalid) { errProfile2.enter(inliningTarget); - throw raiseNode.get(inliningTarget).raise(ValueError, INVALID_MODE_S, mode); + throw raiseNode.raise(inliningTarget, ValueError, INVALID_MODE_S, mode); } if (warnUniversal && m.universal) { errProfile3.enter(inliningTarget); @@ -431,11 +430,11 @@ static Object generic(VirtualFrame frame, Object nameobj, @Cached BytesNodes.DecodeUTF8FSPathNode fspath, @Cached PyIndexCheckNode indexCheckNode, @Cached PyNumberAsSizeNode asSizeNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (indexCheckNode.execute(inliningTarget, nameobj)) { int fd = asSizeNode.executeExact(frame, inliningTarget, nameobj); if (fd < 0) { - err(fd, raiseNode.get(inliningTarget)); + err(fd, raiseNode); } return fd; } else { @@ -445,14 +444,14 @@ static Object generic(VirtualFrame frame, Object nameobj, @Specialization(guards = "fd < 0") static int err(int fd, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, OPENER_RETURNED_D, fd); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, OPENER_RETURNED_D, fd); } @Specialization(guards = "fd < 0") static int err(long fd, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, OPENER_RETURNED_D, fd); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, OPENER_RETURNED_D, fd); } @ClinicConverterFactory @@ -465,7 +464,7 @@ public static CastOpenNameNode create() { @GenerateCached(false) @GenerateInline public abstract static class CreateBufferedIONode extends Node { - public abstract PBuffered execute(VirtualFrame frame, Node inliningTarget, PFileIO fileIO, int buffering, PythonObjectFactory factory, IONodes.IOMode mode); + public abstract PBuffered execute(VirtualFrame frame, Node inliningTarget, PFileIO fileIO, int buffering, IONodes.IOMode mode); protected static boolean isRandom(IONodes.IOMode mode) { return mode.updating; @@ -480,26 +479,29 @@ protected static boolean isReading(IONodes.IOMode mode) { } @Specialization(guards = "isRandom(mode)") - static PBuffered createRandom(VirtualFrame frame, Node inliningTarget, PFileIO fileIO, int buffering, PythonObjectFactory factory, @SuppressWarnings("unused") IONodes.IOMode mode, - @Cached BufferedRandomBuiltins.BufferedRandomInit initBuffered) { - PBuffered buffer = factory.createBufferedRandom(PBufferedRandom); - initBuffered.execute(frame, inliningTarget, buffer, fileIO, buffering, factory); + static PBuffered createRandom(VirtualFrame frame, Node inliningTarget, PFileIO fileIO, int buffering, @SuppressWarnings("unused") IONodes.IOMode mode, + @Cached BufferedRandomBuiltins.BufferedRandomInit initBuffered, + @Bind PythonLanguage language) { + PBuffered buffer = PFactory.createBufferedRandom(language); + initBuffered.execute(frame, inliningTarget, buffer, fileIO, buffering); return buffer; } @Specialization(guards = {"!isRandom(mode)", "isWriting(mode)"}) - static PBuffered createWriter(VirtualFrame frame, Node inliningTarget, PFileIO fileIO, int buffering, PythonObjectFactory factory, @SuppressWarnings("unused") IONodes.IOMode mode, - @Cached BufferedWriterBuiltins.BufferedWriterInit initBuffered) { - PBuffered buffer = factory.createBufferedWriter(PBufferedWriter); - initBuffered.execute(frame, inliningTarget, buffer, fileIO, buffering, factory); + static PBuffered createWriter(VirtualFrame frame, Node inliningTarget, PFileIO fileIO, int buffering, @SuppressWarnings("unused") IONodes.IOMode mode, + @Cached BufferedWriterBuiltins.BufferedWriterInit initBuffered, + @Bind PythonLanguage language) { + PBuffered buffer = PFactory.createBufferedWriter(language); + initBuffered.execute(frame, inliningTarget, buffer, fileIO, buffering); return buffer; } @Specialization(guards = {"!isRandom(mode)", "!isWriting(mode)", "isReading(mode)"}) - static PBuffered createWriter(VirtualFrame frame, Node inliningTarget, PFileIO fileIO, int buffering, PythonObjectFactory factory, @SuppressWarnings("unused") IONodes.IOMode mode, - @Cached BufferedReaderBuiltins.BufferedReaderInit initBuffered) { - PBuffered buffer = factory.createBufferedReader(PBufferedReader); - initBuffered.execute(frame, inliningTarget, buffer, fileIO, buffering, factory); + static PBuffered createWriter(VirtualFrame frame, Node inliningTarget, PFileIO fileIO, int buffering, @SuppressWarnings("unused") IONodes.IOMode mode, + @Cached BufferedReaderBuiltins.BufferedReaderInit initBuffered, + @Bind PythonLanguage language) { + PBuffered buffer = PFactory.createBufferedReader(language); + initBuffered.execute(frame, inliningTarget, buffer, fileIO, buffering); return buffer; } } @@ -521,11 +523,11 @@ static TruffleString string(TruffleString s) { @Specialization(guards = "!isString(s)") static TruffleString str(Node inliningTarget, Object s, @Cached CastToTruffleStringNode str, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { return str.execute(inliningTarget, s); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, EXPECTED_OBJ_TYPE_S_GOT_P, "str", s); + throw raiseNode.raise(inliningTarget, TypeError, EXPECTED_OBJ_TYPE_S_GOT_P, "str", s); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IncrementalNewlineDecoderBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IncrementalNewlineDecoderBuiltins.java index 02f0006ced..0dd9556917 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IncrementalNewlineDecoderBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/IncrementalNewlineDecoderBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -53,7 +53,6 @@ import static com.oracle.graal.python.builtins.modules.io.IONodes.T_SETSTATE; import static com.oracle.graal.python.nodes.ErrorMessages.ILLEGAL_STATE_ARGUMENT; import static com.oracle.graal.python.nodes.ErrorMessages.STATE_ARGUMENT_MUST_BE_A_TUPLE; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import static com.oracle.graal.python.nodes.StringLiterals.T_CR; import static com.oracle.graal.python.nodes.StringLiterals.T_CRLF; import static com.oracle.graal.python.nodes.StringLiterals.T_NEWLINE; @@ -62,7 +61,11 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltins; @@ -70,6 +73,8 @@ import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.common.SequenceNodes; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyIndexCheckNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; @@ -82,11 +87,10 @@ import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; @@ -100,6 +104,9 @@ @CoreFunctions(extendClasses = PIncrementalNewlineDecoder) public final class IncrementalNewlineDecoderBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = IncrementalNewlineDecoderBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return IncrementalNewlineDecoderBuiltinsFactory.getFactories(); @@ -110,8 +117,23 @@ protected List> getNodeFa public static final int SEEN_CRLF = 4; public static final int SEEN_ALL = (SEEN_CR | SEEN_LF | SEEN_CRLF); + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "IncrementalNewlineDecoder", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class IncrementalNewlineDecoderNode extends PythonBuiltinNode { + @Specialization + static PNLDecoder doNew(Object cls, @SuppressWarnings("unused") Object arg, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + // data filled in subsequent __init__ call - see + // IncrementalNewlineDecoderBuiltins.InitNode + return PFactory.createNLDecoder(language, cls, getInstanceShape.execute(cls)); + } + } + // BufferedReader(raw[, buffer_size=DEFAULT_BUFFER_SIZE]) - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 2, parameterNames = {"$self", "decoder", "translate", "errors"}) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "IncrementalNewlineDecoder", minNumOfPositionalArgs = 2, parameterNames = {"$self", "decoder", "translate", "errors"}) @ArgumentClinic(name = "translate", conversion = ArgumentClinic.ClinicConversion.Boolean) @ArgumentClinic(name = "errors", conversion = ArgumentClinic.ClinicConversion.TString, defaultValue = "T_STRICT", useDefaultForNone = true) @GenerateNodeFactory @@ -284,35 +306,35 @@ abstract static class GetStateNode extends PythonUnaryBuiltinNode { @Specialization(guards = "!self.hasDecoder()") static Object noDecoder(PNLDecoder self, - @Shared @Cached PythonObjectFactory factory) { - PBytes buffer = factory.createEmptyBytes(); + @Bind PythonLanguage language) { + PBytes buffer = PFactory.createEmptyBytes(language); int flag = self.isPendingCR() ? 1 : 0; - return factory.createTuple(new Object[]{buffer, flag}); + return PFactory.createTuple(language, new Object[]{buffer, flag}); } @Specialization(guards = "self.hasDecoder()") static Object withDecoder(VirtualFrame frame, PNLDecoder self, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached SequenceNodes.GetObjectArrayNode getObjectArrayNode, @Cached PyIndexCheckNode indexCheckNode, @Cached PyNumberAsSizeNode asSizeNode, @Cached PyObjectCallMethodObjArgs callMethod, - @Shared @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object state = callMethod.execute(frame, inliningTarget, self.getDecoder(), T_GETSTATE); if (!(state instanceof PTuple)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ILLEGAL_STATE_ARGUMENT); + throw raiseNode.raise(inliningTarget, TypeError, ILLEGAL_STATE_ARGUMENT); } Object[] objects = getObjectArrayNode.execute(inliningTarget, state); if (objects.length != 2 || !indexCheckNode.execute(inliningTarget, objects[1])) { - throw raiseNode.get(inliningTarget).raise(TypeError, ILLEGAL_STATE_ARGUMENT); + throw raiseNode.raise(inliningTarget, TypeError, ILLEGAL_STATE_ARGUMENT); } int flag = asSizeNode.executeExact(frame, inliningTarget, objects[1]); flag <<= 1; if (self.isPendingCR()) { flag |= 1; } - return factory.createTuple(new Object[]{objects[0], flag}); + return PFactory.createTuple(language, new Object[]{objects[0], flag}); } } @@ -326,10 +348,10 @@ static Object noDecoder(VirtualFrame frame, PNLDecoder self, PTuple state, @Exclusive @Cached SequenceNodes.GetObjectArrayNode getObjectArrayNode, @Exclusive @Cached PyIndexCheckNode indexCheckNode, @Exclusive @Cached PyNumberAsSizeNode asSizeNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { Object[] objects = getObjectArrayNode.execute(inliningTarget, state); if (objects.length != 2 || !indexCheckNode.execute(inliningTarget, objects[1])) { - throw raiseNode.get(inliningTarget).raise(TypeError, ILLEGAL_STATE_ARGUMENT); + throw raiseNode.raise(inliningTarget, TypeError, ILLEGAL_STATE_ARGUMENT); } int flag = asSizeNode.executeExact(frame, inliningTarget, objects[1]); self.setPendingCR((flag & 1) != 0); @@ -339,27 +361,27 @@ static Object noDecoder(VirtualFrame frame, PNLDecoder self, PTuple state, @Specialization(guards = "self.hasDecoder()") static Object withDecoder(VirtualFrame frame, PNLDecoder self, PTuple state, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Exclusive @Cached SequenceNodes.GetObjectArrayNode getObjectArrayNode, @Exclusive @Cached PyIndexCheckNode indexCheckNode, @Exclusive @Cached PyNumberAsSizeNode asSizeNode, @Cached PyObjectCallMethodObjArgs callMethod, - @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { Object[] objects = getObjectArrayNode.execute(inliningTarget, state); if (objects.length != 2 || !indexCheckNode.execute(inliningTarget, objects[1])) { - throw raiseNode.get(inliningTarget).raise(TypeError, ILLEGAL_STATE_ARGUMENT); + throw raiseNode.raise(inliningTarget, TypeError, ILLEGAL_STATE_ARGUMENT); } int flag = asSizeNode.executeExact(frame, inliningTarget, objects[1]); self.setPendingCR((flag & 1) != 0); flag >>= 1; - PTuple tuple = factory.createTuple(new Object[]{objects[0], flag}); + PTuple tuple = PFactory.createTuple(language, new Object[]{objects[0], flag}); return callMethod.execute(frame, inliningTarget, self.getDecoder(), T_SETSTATE, tuple); } @Fallback static Object err(@SuppressWarnings("unused") Object self, @SuppressWarnings("unused") Object state, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, STATE_ARGUMENT_MUST_BE_A_TUPLE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, STATE_ARGUMENT_MUST_BE_A_TUPLE); } } @@ -388,7 +410,7 @@ static Object withDecoder(VirtualFrame frame, PNLDecoder self, abstract static class NewlineNode extends PythonBuiltinNode { @Specialization static Object newline(PNLDecoder self, - @Cached PythonObjectFactory factory) { + @Bind("this") Node inliningTarget) { switch (self.getSeenNewline()) { case SEEN_CR: return T_CR; @@ -397,13 +419,13 @@ static Object newline(PNLDecoder self, case SEEN_CRLF: return T_CRLF; case SEEN_CR | SEEN_LF: - return factory.createTuple(new Object[]{T_CR, T_NEWLINE}); + return PFactory.createTuple(PythonLanguage.get(inliningTarget), new Object[]{T_CR, T_NEWLINE}); case SEEN_CR | SEEN_CRLF: - return factory.createTuple(new Object[]{T_CR, T_CRLF}); + return PFactory.createTuple(PythonLanguage.get(inliningTarget), new Object[]{T_CR, T_CRLF}); case SEEN_LF | SEEN_CRLF: - return factory.createTuple(new Object[]{T_NEWLINE, T_CRLF}); + return PFactory.createTuple(PythonLanguage.get(inliningTarget), new Object[]{T_NEWLINE, T_CRLF}); case SEEN_CR | SEEN_LF | SEEN_CRLF: - return factory.createTuple(new Object[]{T_CR, T_NEWLINE, T_CRLF}); + return PFactory.createTuple(PythonLanguage.get(inliningTarget), new Object[]{T_CR, T_NEWLINE, T_CRLF}); default: return PNone.NONE; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/PBytesIO.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/PBytesIO.java index b0efce23a8..225f228bdc 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/PBytesIO.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/PBytesIO.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,13 +42,14 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.BufferError; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; import com.oracle.graal.python.builtins.objects.bytes.PByteArray; import com.oracle.graal.python.builtins.objects.memoryview.BufferLifecycleManager; import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.object.Shape; @@ -100,9 +101,9 @@ public int getExports() { return exports.getExports().get(); } - public void checkExports(Node inliningTarget, PRaiseNode.Lazy raiseNode) { + public void checkExports(Node inliningTarget, PRaiseNode raiseNode) { if (getExports() != 0) { - throw raiseNode.get(inliningTarget).raise(BufferError, ErrorMessages.EXISTING_EXPORTS_OF_DATA_OBJECT_CANNOT_BE_RE_SIZED); + throw raiseNode.raise(inliningTarget, BufferError, ErrorMessages.EXISTING_EXPORTS_OF_DATA_OBJECT_CANNOT_BE_RE_SIZED); } } @@ -120,14 +121,14 @@ public void markEscaped() { * it without copying the first time the program asks for the whole contents. So that a sequence * of writes followed by one getvalue call doesn't have to copy the whole buffer at the end. */ - public void unshareIfNecessary(PythonBufferAccessLibrary bufferLib, PythonObjectFactory factory) { + public void unshareIfNecessary(PythonBufferAccessLibrary bufferLib, PythonLanguage language) { if (escaped || getExports() != 0) { - buf = factory.createByteArray(bufferLib.getCopiedByteArray(buf)); + buf = PFactory.createByteArray(language, bufferLib.getCopiedByteArray(buf)); escaped = false; } } - public void unshareAndResize(PythonBufferAccessLibrary bufferLib, PythonObjectFactory factory, int size, boolean truncate) { + public void unshareAndResize(PythonBufferAccessLibrary bufferLib, PythonLanguage language, int size, boolean truncate) { int origLength = bufferLib.getBufferLength(getBuf()); int alloc; if (truncate && size < origLength / 2) { @@ -135,7 +136,7 @@ public void unshareAndResize(PythonBufferAccessLibrary bufferLib, PythonObjectFa alloc = size; } else if (size < origLength) { /* Within allocated size; quick exit */ - unshareIfNecessary(bufferLib, factory); + unshareIfNecessary(bufferLib, language); return; } else if (size <= origLength * 1.125) { /* Moderate upsize; overallocate similar to list_resize() */ @@ -150,7 +151,7 @@ public void unshareAndResize(PythonBufferAccessLibrary bufferLib, PythonObjectFa } byte[] newBuf = new byte[alloc]; bufferLib.readIntoByteArray(getBuf(), 0, newBuf, 0, Math.min(stringSize, size)); - setBuf(factory.createByteArray(newBuf)); + setBuf(PFactory.createByteArray(language, newBuf)); escaped = false; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/PFileIO.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/PFileIO.java index 16600e7930..89fdb4eac1 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/PFileIO.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/PFileIO.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -62,8 +62,6 @@ public final class PFileIO extends PythonBuiltinObject { boolean finalizing; private int blksize; - private boolean utf8Write; - public PFileIO(Object cls, Shape instanceShape) { super(cls, instanceShape); this.fd = null; @@ -166,14 +164,6 @@ public int getBlksize() { public void setBlksize(int blksize) { this.blksize = blksize; } - - public boolean isUTF8Write() { - return utf8Write; - } - - public void setUTF8Write(boolean utf8Write) { - this.utf8Write = utf8Write; - } } @ValueType diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/PTextIO.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/PTextIO.java index e0bda2dbdc..200ff15b56 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/PTextIO.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/PTextIO.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -424,12 +424,12 @@ public static Object build(CookieType cookie) { return IntNodes.PyLongFromByteArray.executeUncached(buffer, true, false); } - public static CookieType parse(long v, Node inliningTarget, InlinedConditionProfile overflow, PRaiseNode.Lazy raise) { + public static CookieType parse(long v, Node inliningTarget, InlinedConditionProfile overflow, PRaiseNode raise) { byte[] buffer = IntBuiltins.ToBytesNode.fromLong(v, COOKIE_BUF_LEN, false, false, inliningTarget, overflow, raise); return parse(buffer); } - public static CookieType parse(PInt v, Node inliningTarget, InlinedConditionProfile overflow, PRaiseNode.Lazy raise) { + public static CookieType parse(PInt v, Node inliningTarget, InlinedConditionProfile overflow, PRaiseNode raise) { byte[] buffer = IntBuiltins.ToBytesNode.fromBigInteger(v, COOKIE_BUF_LEN, false, false, inliningTarget, overflow, raise); return parse(buffer); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/RawIOBaseBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/RawIOBaseBuiltins.java index 58547e96d5..36b8db7086 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/RawIOBaseBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/RawIOBaseBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -59,6 +59,7 @@ import java.io.ByteArrayOutputStream; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; @@ -76,7 +77,7 @@ import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -121,24 +122,24 @@ static Object readall(VirtualFrame frame, Object self, @SuppressWarnings("unused @Specialization(guards = "size >= 0") static Object read(VirtualFrame frame, Object self, int size, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached BytesNodes.ToBytesNode toBytes, @Exclusive @Cached PyObjectCallMethodObjArgs callMethodReadInto, - @Cached PyNumberAsSizeNode asSizeNode, - @Cached PythonObjectFactory factory) { - PByteArray b = factory.createByteArray(new byte[size]); + @Cached PyNumberAsSizeNode asSizeNode) { + PByteArray b = PFactory.createByteArray(language, new byte[size]); Object res = callMethodReadInto.execute(frame, inliningTarget, self, T_READINTO, b); if (res == PNone.NONE) { return res; } int n = asSizeNode.executeExact(frame, inliningTarget, res, ValueError); if (n == 0) { - return factory.createEmptyBytes(); + return PFactory.createEmptyBytes(language); } byte[] bytes = toBytes.execute(b); if (n < size) { - return factory.createBytes(PythonUtils.arrayCopyOf(bytes, n)); + return PFactory.createBytes(language, PythonUtils.arrayCopyOf(bytes, n)); } - return factory.createBytes(bytes); + return PFactory.createBytes(language, bytes); } } @@ -157,8 +158,7 @@ static Object readall(VirtualFrame frame, Object self, @Cached InlinedConditionProfile chunksSize0Profile, @Cached InlinedCountingConditionProfile bytesLen0Profile, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { ByteArrayOutputStream chunks = createOutputStream(); while (true) { Object data = callMethodRead.execute(frame, inliningTarget, self, T_READ, DEFAULT_BUFFER_SIZE); @@ -170,7 +170,7 @@ static Object readall(VirtualFrame frame, Object self, break; } if (!(data instanceof PBytes)) { - throw raiseNode.get(inliningTarget).raise(TypeError, S_SHOULD_RETURN_BYTES, "read()"); + throw raiseNode.raise(inliningTarget, TypeError, S_SHOULD_RETURN_BYTES, "read()"); } byte[] bytes = bufferLib.getInternalOrCopiedByteArray(data); int bytesLen = bufferLib.getBufferLength(data); @@ -180,7 +180,7 @@ static Object readall(VirtualFrame frame, Object self, append(chunks, bytes, bytesLen); } - return factory.createBytes(toByteArray(chunks)); + return PFactory.createBytes(PythonLanguage.get(inliningTarget), toByteArray(chunks)); } } @@ -193,8 +193,8 @@ abstract static class ReadIntoNode extends PythonBuiltinNode { */ @Specialization static Object readinto(@SuppressWarnings("unused") Object self, @SuppressWarnings("unused") Object args, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(NotImplementedError); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError); } } @@ -207,8 +207,8 @@ abstract static class WriteNode extends PythonBuiltinNode { */ @Specialization static Object write(@SuppressWarnings("unused") Object self, @SuppressWarnings("unused") Object args, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(NotImplementedError); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/StringIOBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/StringIOBuiltins.java index cd0d309697..497b794864 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/StringIOBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/StringIOBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,7 +40,6 @@ */ package com.oracle.graal.python.builtins.modules.io; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PIncrementalNewlineDecoder; import static com.oracle.graal.python.builtins.modules.io.BufferedIOUtil.SEEK_CUR; import static com.oracle.graal.python.builtins.modules.io.BufferedIOUtil.SEEK_END; import static com.oracle.graal.python.builtins.modules.io.BufferedIOUtil.SEEK_SET; @@ -74,8 +73,6 @@ import static com.oracle.graal.python.nodes.ErrorMessages.THIRD_ITEM_OF_STATE_MUST_BE_AN_INTEGER_GOT_P; import static com.oracle.graal.python.nodes.ErrorMessages.THIRD_ITEM_OF_STATE_SHOULD_BE_A_DICT_GOT_A_P; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GETSTATE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; import static com.oracle.graal.python.nodes.StringLiterals.T_NEWLINE; @@ -87,7 +84,11 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -100,6 +101,9 @@ import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.str.StringNodes.StringReplaceNode; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; import com.oracle.graal.python.lib.PyIndexCheckNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyNumberIndexNode; @@ -108,6 +112,7 @@ import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; @@ -115,9 +120,8 @@ import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectExactProfile; import com.oracle.graal.python.nodes.object.GetOrCreateDictNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Bind; @@ -127,7 +131,6 @@ import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @@ -138,6 +141,8 @@ public final class StringIOBuiltins extends PythonBuiltins { private static final int NIL_CODEPOINT = 0; + public static final TpSlots SLOTS = StringIOBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return StringIOBuiltinsFactory.getFactories(); @@ -146,14 +151,14 @@ protected List> getNodeFa abstract static class ClosedCheckPythonUnaryBuiltinNode extends PythonUnaryBuiltinNode { @Specialization(guards = "!self.isOK()") static Object initError(@SuppressWarnings("unused") PStringIO self, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_UNINIT); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_UNINIT); } @Specialization(guards = "self.isClosed()") static Object closedError(@SuppressWarnings("unused") PStringIO self, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED); } } @@ -166,19 +171,19 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(guards = "!self.isOK()") static Object initError(@SuppressWarnings("unused") PStringIO self, @SuppressWarnings("unused") Object arg, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_UNINIT); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_UNINIT); } @Specialization(guards = "self.isClosed()") static Object closedError(@SuppressWarnings("unused") PStringIO self, @SuppressWarnings("unused") Object arg, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED); } } static void writeString(VirtualFrame frame, Node inliningTarget, PStringIO self, TruffleString obj, - PRaiseNode.Lazy raiseNode, + PRaiseNode raiseNode, IncrementalNewlineDecoderBuiltins.DecodeNode decodeNode, StringReplaceNode replaceNode, TruffleString.CodePointLengthNode codePointLengthNode, @@ -205,7 +210,7 @@ static void writeString(VirtualFrame frame, Node inliningTarget, PStringIO self, * things like comparing an unsigned and a signed integer. */ if (self.getPos() > Integer.MAX_VALUE - decodedLen) { - throw raiseNode.get(inliningTarget).raise(OverflowError, NEW_POSITION_TOO_LARGE); + throw raiseNode.raise(inliningTarget, OverflowError, NEW_POSITION_TOO_LARGE); } if (self.isAccumulating()) { @@ -259,7 +264,21 @@ static void writeString(VirtualFrame frame, Node inliningTarget, PStringIO self, } } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, parameterNames = {"$self", "initial_value", "newline"}) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "StringIO", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class StringIONode extends PythonBuiltinNode { + @Specialization + static PStringIO doNew(Object cls, @SuppressWarnings("unused") Object arg, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + // data filled in subsequent __init__ call - see StringIONodeBuiltins.InitNode + return PFactory.createStringIO(language, cls, getInstanceShape.execute(cls)); + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "StringIO", minNumOfPositionalArgs = 1, parameterNames = {"$self", "initial_value", "newline"}) @ArgumentClinic(name = "initial_value", conversion = ArgumentClinic.ClinicConversion.TString, defaultValue = "T_EMPTY_STRING", useDefaultForNone = true) @GenerateNodeFactory public abstract static class InitNode extends PythonTernaryClinicBuiltinNode { @@ -272,7 +291,7 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static PNone init(VirtualFrame frame, PStringIO self, TruffleString initialValue, Object newlineArg, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy lazyRaiseNode, + @Cached PRaiseNode lazyRaiseNode, @Cached IncrementalNewlineDecoderBuiltins.DecodeNode decodeNode, @Cached IncrementalNewlineDecoderBuiltins.InitNode initNode, @Cached StringReplaceNode replaceNode, @@ -283,8 +302,8 @@ static PNone init(VirtualFrame frame, PStringIO self, TruffleString initialValue @Cached TruffleStringBuilder.ToStringNode toStringNode, @Cached TruffleStringBuilder.AppendCodePointNode appendCodePointNode, @Cached IONodes.ToTruffleStringNode toTruffleStringNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { TruffleString newline; if (newlineArg == PNone.NO_VALUE) { @@ -317,7 +336,7 @@ static PNone init(VirtualFrame frame, PStringIO self, TruffleString initialValue } if (self.isReadUniversal()) { - Object incDecoder = factory.createNLDecoder(PIncrementalNewlineDecoder); + Object incDecoder = PFactory.createNLDecoder(language); initNode.execute(frame, incDecoder, self.getDecoder(), self.isReadTranslate(), PNone.NO_VALUE); self.setDecoder(incDecoder); } @@ -435,7 +454,6 @@ static TruffleString readline(PStringIO self, int size, @Builtin(name = J_TRUNCATE, minNumOfPositionalArgs = 1, parameterNames = {"$self", "size"}) @ArgumentClinic(name = "size", defaultValue = "PNone.NONE", useDefaultForNone = true) - @TypeSystemReference(PythonArithmeticTypes.class) @GenerateNodeFactory abstract static class TruncateNode extends ClosedCheckPythonBinaryClinicBuiltinNode { @@ -479,7 +497,7 @@ static Object obj(VirtualFrame frame, PStringIO self, Object arg, @Shared @Cached TruffleString.SubstringNode substringNode, @Shared @Cached TruffleStringBuilder.ToStringNode toStringNode, @Shared @Cached TruffleStringBuilder.AppendStringNode appendStringNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int size = asSizeNode.executeExact(frame, inliningTarget, indexNode.execute(frame, inliningTarget, arg), OverflowError); if (size >= 0) { if (size < self.getStringSize()) { @@ -487,13 +505,13 @@ static Object obj(VirtualFrame frame, PStringIO self, Object arg, } return size; } - return negSize(self, size, raiseNode.get(inliningTarget)); + return negSize(self, size, raiseNode); } @Specialization(guards = {"self.isOK()", "!self.isClosed()", "size < 0"}) static Object negSize(@SuppressWarnings("unused") PStringIO self, int size, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, NEGATIVE_SIZE_VALUE_D, size); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, NEGATIVE_SIZE_VALUE_D, size); } } @@ -517,7 +535,7 @@ static Object doWrite(VirtualFrame frame, PStringIO self, TruffleString s, @Cached TruffleStringBuilder.AppendStringNode appendStringNode, @Cached TruffleStringBuilder.AppendCodePointNode appendCodePointNode, @Cached TruffleStringBuilder.ToStringNode toStringNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int size = codePointLengthNode.execute(s, TS_ENCODING); if (size > 0) { writeString(frame, inliningTarget, self, s, raiseNode, decodeNode, replaceNode, codePointLengthNode, @@ -576,32 +594,32 @@ static Object seek(PStringIO self, int pos, int whence) { @SuppressWarnings("unused") @Specialization(guards = {"self.isOK()", "!self.isClosed()", "!isSupportedWhence(whence)"}) static Object whenceError(@SuppressWarnings("unused") PStringIO self, @SuppressWarnings("unused") int pos, int whence, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, INVALID_WHENCE_D_SHOULD_BE_0_1_OR_2, whence); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, INVALID_WHENCE_D_SHOULD_BE_0_1_OR_2, whence); } @Specialization(guards = {"self.isOK()", "!self.isClosed()", "isSupportedWhence(whence)", "pos != 0", "whence != 0"}) static Object largePos1(@SuppressWarnings("unused") PStringIO self, @SuppressWarnings("unused") int pos, @SuppressWarnings("unused") int whence, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(OSError, CAN_T_DO_NONZERO_CUR_RELATIVE_SEEKS); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, OSError, CAN_T_DO_NONZERO_CUR_RELATIVE_SEEKS); } @Specialization(guards = {"self.isOK()", "!self.isClosed()", "pos < 0", "whence == 0"}) static Object negPos(@SuppressWarnings("unused") PStringIO self, int pos, @SuppressWarnings("unused") int whence, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, NEGATIVE_SEEK_VALUE_D, pos); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, NEGATIVE_SEEK_VALUE_D, pos); } @Specialization(guards = "!self.isOK()") static Object initError(@SuppressWarnings("unused") PStringIO self, @SuppressWarnings("unused") int pos, @SuppressWarnings("unused") int whence, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_UNINIT); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_UNINIT); } @Specialization(guards = "self.isClosed()") static Object closedError(@SuppressWarnings("unused") PStringIO self, @SuppressWarnings("unused") int pos, @SuppressWarnings("unused") int whence, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED); } } @@ -632,11 +650,11 @@ static Object doit(VirtualFrame frame, PStringIO self, @Bind("this") Node inliningTarget, @Cached GetValueNode getValueNode, @Cached GetOrCreateDictNode getDict, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { Object initValue = getValueNode.execute(frame, self); Object readnl = self.getReadNewline() == null ? PNone.NONE : self.getReadNewline(); Object[] state = new Object[]{initValue, readnl, self.getPos(), getDict.execute(inliningTarget, self)}; - return factory.createTuple(state); + return PFactory.createTuple(language, state); } } @@ -656,11 +674,11 @@ static Object doit(VirtualFrame frame, PStringIO self, PTuple state, @Cached TruffleString.CodePointLengthNode codePointLengthNode, @Cached TruffleStringBuilder.AppendStringNode appendStringNode, @Cached HashingStorageAddAllToOther addAllToOtherNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { SequenceStorage storage = state.getSequenceStorage(); Object[] array = getArray.execute(inliningTarget, storage); if (storage.length() < 4) { - return notTuple(self, state, raiseNode.get(inliningTarget)); + return notTuple(self, state, raiseNode); } initNode.execute(frame, self, array[0], array[1]); /* @@ -685,25 +703,25 @@ static Object doit(VirtualFrame frame, PStringIO self, PTuple state, * erroneous (or malicious) inputs. */ if (!indexCheckNode.execute(inliningTarget, array[2])) { - throw raiseNode.get(inliningTarget).raise(TypeError, THIRD_ITEM_OF_STATE_MUST_BE_AN_INTEGER_GOT_P, array[2]); + throw raiseNode.raise(inliningTarget, TypeError, THIRD_ITEM_OF_STATE_MUST_BE_AN_INTEGER_GOT_P, array[2]); } int pos = asSizeNode.executeExact(frame, inliningTarget, array[2]); if (pos < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, POSITION_VALUE_CANNOT_BE_NEGATIVE); + throw raiseNode.raise(inliningTarget, ValueError, POSITION_VALUE_CANNOT_BE_NEGATIVE); } self.setPos(pos); /* Set the dictionary of the instance variables. */ if (!PGuards.isNone(array[3])) { if (!PGuards.isDict(array[3])) { - throw raiseNode.get(inliningTarget).raise(TypeError, THIRD_ITEM_OF_STATE_SHOULD_BE_A_DICT_GOT_A_P, array[3]); + throw raiseNode.raise(inliningTarget, TypeError, THIRD_ITEM_OF_STATE_SHOULD_BE_A_DICT_GOT_A_P, array[3]); } /* * Alternatively, we could replace the internal dictionary completely. However, it * seems more practical to just update it. */ PDict dict = getDict.execute(inliningTarget, self); - addAllToOtherNode.execute(frame, inliningTarget, ((PDict) array[3]).getDictStorage(), dict.getDictStorage()); + addAllToOtherNode.execute(frame, inliningTarget, ((PDict) array[3]).getDictStorage(), dict); } return PNone.NONE; @@ -711,14 +729,14 @@ static Object doit(VirtualFrame frame, PStringIO self, PTuple state, @Specialization(guards = {"!self.isClosed()", "!isPTuple(state)"}) static Object notTuple(PStringIO self, Object state, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, P_SETSTATE_ARGUMENT_SHOULD_BE_D_TUPLE_GOT_P, self, 4, state); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, P_SETSTATE_ARGUMENT_SHOULD_BE_D_TUPLE_GOT_P, self, 4, state); } @Specialization(guards = "self.isClosed()") static Object closedError(@SuppressWarnings("unused") PStringIO self, @SuppressWarnings("unused") Object arg, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED); } } @@ -788,8 +806,8 @@ static boolean closed(PStringIO self) { @Specialization(guards = "!self.isOK()") static Object initError(@SuppressWarnings("unused") PStringIO self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_UNINIT); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_UNINIT); } } @@ -805,7 +823,7 @@ static Object close(PStringIO self) { } } - @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iternext, isComplex = true) @GenerateNodeFactory abstract static class IternextNode extends ClosedCheckPythonUnaryBuiltinNode { @@ -819,12 +837,11 @@ static Object builtin(PStringIO self, @SuppressWarnings("unused") @Exclusive @Cached IsBuiltinObjectExactProfile profile, @Cached TruffleStringBuilder.ToStringNode toStringNode, @Cached FindLineEndingNode findLineEndingNode, - @Cached TruffleString.SubstringNode substringNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Cached TruffleString.SubstringNode substringNode) { self.realize(); TruffleString line = stringioReadline(inliningTarget, self, -1, findLineEndingNode, substringNode, toStringNode); if (line.isEmpty()) { - throw raiseNode.get(inliningTarget).raiseStopIteration(); + throw TpIterNextBuiltin.iteratorExhausted(); } return line; } @@ -838,15 +855,15 @@ static Object slowpath(VirtualFrame frame, PStringIO self, @SuppressWarnings("unused") @Exclusive @Cached IsBuiltinObjectExactProfile profile, @Cached PyObjectCallMethodObjArgs callMethodReadline, @Cached CastToTruffleStringNode toString, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { self.realize(); Object res = callMethodReadline.execute(frame, inliningTarget, self, T_READLINE); if (!PGuards.isString(res)) { - throw raiseNode.get(inliningTarget).raise(OSError, S_SHOULD_HAVE_RETURNED_A_STR_OBJECT_NOT_P, T_READLINE, res); + throw raiseNode.raise(inliningTarget, OSError, S_SHOULD_HAVE_RETURNED_A_STR_OBJECT_NOT_P, T_READLINE, res); } TruffleString line = toString.execute(inliningTarget, res); if (line.isEmpty()) { - throw raiseNode.get(inliningTarget).raiseStopIteration(); + throw TpIterNextBuiltin.iteratorExhausted(); } return line; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/TextIOBaseBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/TextIOBaseBuiltins.java index 8636fbeb8d..0c2e88189a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/TextIOBaseBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/TextIOBaseBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -64,10 +64,11 @@ import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; @CoreFunctions(extendClasses = PythonBuiltinClassType.PTextIOBase) public final class TextIOBaseBuiltins extends PythonBuiltins { @@ -82,8 +83,8 @@ protected List> getNodeFa abstract static class DetachNode extends PythonBuiltinNode { @Specialization static Object detach(@SuppressWarnings("unused") Object self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(IOUnsupportedOperation, T_DETACH); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, IOUnsupportedOperation, T_DETACH); } } @@ -92,8 +93,8 @@ static Object detach(@SuppressWarnings("unused") Object self, abstract static class ReadNode extends PythonBuiltinNode { @Specialization static Object read(@SuppressWarnings("unused") Object self, @SuppressWarnings("unused") Object args, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(IOUnsupportedOperation, T_READ); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, IOUnsupportedOperation, T_READ); } } @@ -102,8 +103,8 @@ static Object read(@SuppressWarnings("unused") Object self, @SuppressWarnings("u abstract static class ReadlineNode extends PythonBuiltinNode { @Specialization static Object read(@SuppressWarnings("unused") Object self, @SuppressWarnings("unused") Object args, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(IOUnsupportedOperation, T_READLINE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, IOUnsupportedOperation, T_READLINE); } } @@ -112,8 +113,8 @@ static Object read(@SuppressWarnings("unused") Object self, @SuppressWarnings("u abstract static class WriteNode extends PythonBuiltinNode { @Specialization static Object write(@SuppressWarnings("unused") Object self, @SuppressWarnings("unused") Object args, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(IOUnsupportedOperation, T_WRITE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, IOUnsupportedOperation, T_WRITE); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/TextIOWrapperBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/TextIOWrapperBuiltins.java index a0cf758812..d406ab98a0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/TextIOWrapperBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/TextIOWrapperBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -117,9 +117,6 @@ import static com.oracle.graal.python.nodes.ErrorMessages.UNDERLYING_STREAM_IS_NOT_SEEKABLE; import static com.oracle.graal.python.nodes.PGuards.isNoValue; import static com.oracle.graal.python.nodes.PGuards.isPNone; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; import static com.oracle.graal.python.nodes.StringLiterals.T_NEWLINE; import static com.oracle.graal.python.runtime.exception.PythonErrorType.OSError; @@ -129,7 +126,11 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltins; @@ -143,18 +144,22 @@ import com.oracle.graal.python.builtins.objects.str.StringNodes.StringReplaceNode; import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; import com.oracle.graal.python.lib.PyErrChainExceptions; import com.oracle.graal.python.lib.PyLongAsLongNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; -import com.oracle.graal.python.lib.PyNumberIndexNode; +import com.oracle.graal.python.lib.PyNumberLongNode; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.lib.PyObjectIsTrueNode; import com.oracle.graal.python.lib.PyObjectLookupAttr; +import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode; import com.oracle.graal.python.lib.PyObjectRichCompareBool; import com.oracle.graal.python.lib.PyObjectSizeNode; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; @@ -166,7 +171,7 @@ import com.oracle.graal.python.nodes.util.CastToJavaLongLossyNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Bind; @@ -187,6 +192,8 @@ @CoreFunctions(extendClasses = PTextIOWrapper) public final class TextIOWrapperBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = TextIOWrapperBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return TextIOWrapperBuiltinsFactory.getFactories(); @@ -196,8 +203,8 @@ abstract static class InitCheckPythonUnaryBuiltinNode extends PythonUnaryBuiltin @Specialization(guards = "!self.isOK()") @SuppressWarnings("unused") static Object initError(PTextIO self, - @Exclusive @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_UNINIT); + @Exclusive @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_UNINIT); } } @@ -209,8 +216,8 @@ protected static boolean checkAttached(PTextIO self) { @Specialization(guards = {"self.isOK()", "self.isDetached()"}) @SuppressWarnings("unused") static Object attachError(PTextIO self, - @Exclusive @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, DETACHED_BUFFER); + @Exclusive @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, DETACHED_BUFFER); } } @@ -233,8 +240,8 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(guards = "!self.isOK()") @SuppressWarnings("unused") static Object initError(PTextIO self, Object o, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_UNINIT); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_UNINIT); } } @@ -246,8 +253,8 @@ protected static boolean checkAttached(PTextIO self) { @Specialization(guards = {"self.isOK()", "self.isDetached()"}) @SuppressWarnings("unused") static Object attachError(PTextIO self, Object o, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, DETACHED_BUFFER); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, DETACHED_BUFFER); } } @@ -260,7 +267,21 @@ protected boolean isOpen(VirtualFrame frame, PTextIO self) { } } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 2, parameterNames = {"$self", "buffer", "encoding", "errors", "newline", "line_buffering", "write_through"}) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "TextIOWrapper", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class TextIOWrapperNode extends PythonBuiltinNode { + @Specialization + static PTextIO doNew(Object cls, @SuppressWarnings("unused") Object arg, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + // data filled in subsequent __init__ call - see TextIOWrapperBuiltins.InitNode + return PFactory.createTextIO(language, cls, getInstanceShape.execute(cls)); + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "TextIOWrapper", minNumOfPositionalArgs = 2, parameterNames = {"$self", "buffer", "encoding", "errors", "newline", "line_buffering", "write_through"}) @ArgumentClinic(name = "encoding", conversion = ArgumentClinic.ClinicConversion.TString, defaultValue = "PNone.NONE", useDefaultForNone = true) @ArgumentClinic(name = "errors", conversion = ArgumentClinic.ClinicConversion.TString, defaultValue = "T_STRICT", useDefaultForNone = true) @ArgumentClinic(name = "newline", conversion = ArgumentClinic.ClinicConversion.TString, defaultValue = "PNone.NONE", useDefaultForNone = true) @@ -314,7 +335,7 @@ static Object reconfigure(VirtualFrame frame, PTextIO self, Object encodingObj, Object errorsObj, Object newlineObj, Object lineBufferingObj, Object writeThroughObj, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy lazyRaiseNode, + @Cached PRaiseNode lazyRaiseNode, @Cached IONodes.ToTruffleStringNode toStringNode, @Cached PyObjectCallMethodObjArgs callMethod, @Cached PyObjectIsTrueNode isTrueNode, @@ -332,12 +353,12 @@ static Object reconfigure(VirtualFrame frame, PTextIO self, Object encodingObj, if (isPNone(lineBufferingObj)) { lineBuffering = self.isLineBuffering(); } else { - lineBuffering = isTrueNode.execute(frame, inliningTarget, lineBufferingObj); + lineBuffering = isTrueNode.execute(frame, lineBufferingObj); } if (isPNone(writeThroughObj)) { writeThrough = self.isWriteThrough(); } else { - writeThrough = isTrueNode.execute(frame, inliningTarget, writeThroughObj); + writeThrough = isTrueNode.execute(frame, writeThroughObj); } callMethod.execute(frame, inliningTarget, self, T_FLUSH); self.setB2cratio(0); @@ -354,8 +375,8 @@ static Object reconfigure(VirtualFrame frame, PTextIO self, Object encodingObj, @SuppressWarnings("unused") @Specialization(guards = "!isValid(self, encodingObj, errorsObj, newlineObj)") static Object error(VirtualFrame frame, PTextIO self, Object encodingObj, Object errorsObj, Object newlineObj, Object lineBufferingObj, Object writeThroughObj, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(IOUnsupportedOperation, NOT_POSSIBLE_TO_SET_THE_ENCODING_OR); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, IOUnsupportedOperation, NOT_POSSIBLE_TO_SET_THE_ENCODING_OR); } } @@ -371,8 +392,8 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(guards = {"checkAttached(self)", "isOpen(frame, self)", "!self.hasEncoder()"}) static Object write(@SuppressWarnings("unused") VirtualFrame frame, @SuppressWarnings("unused") PTextIO self, @SuppressWarnings("unused") TruffleString data, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(IOUnsupportedOperation, NOT_WRITABLE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, IOUnsupportedOperation, NOT_WRITABLE); } @Specialization(guards = {"checkAttached(self)", "isOpen(frame, self)", "self.hasEncoder()"}) @@ -386,7 +407,7 @@ static Object write(VirtualFrame frame, PTextIO self, TruffleString data, @Cached TruffleString.CodePointLengthNode codePointLengthNode, @Cached TruffleString.IndexOfCodePointNode indexOfCodePointNode, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { boolean haslf = false; boolean needflush = false; TruffleString text = data; @@ -420,7 +441,7 @@ static Object write(VirtualFrame frame, PTextIO self, TruffleString data, Object b = callMethodEncode.execute(frame, inliningTarget, self.getEncoder(), T_ENCODE, text); if (b != text && !(b instanceof PBytes)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ENCODER_SHOULD_RETURN_A_BYTES_OBJECT_NOT_P, b); + throw raiseNode.raise(inliningTarget, TypeError, ENCODER_SHOULD_RETURN_A_BYTES_OBJECT_NOT_P, b); } byte[] encodedText = bufferLib.getInternalOrCopiedByteArray(b); @@ -519,8 +540,8 @@ static TruffleString read(VirtualFrame frame, PTextIO self, int n, @Specialization(guards = {"checkAttached(self)", "isOpen(frame, self)", "!self.hasDecoder()"}) static Object noDecoder(@SuppressWarnings("unused") VirtualFrame frame, @SuppressWarnings("unused") PTextIO self, @SuppressWarnings("unused") int n, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(IOUnsupportedOperation, NOT_READABLE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, IOUnsupportedOperation, NOT_READABLE); } } @@ -568,7 +589,7 @@ static Object close(VirtualFrame frame, PTextIO self, @Cached PyObjectIsTrueNode isTrueNode, @Cached PyErrChainExceptions chainExceptions) { Object res = closedNode.execute(frame, self); - if (isTrueNode.execute(frame, inliningTarget, res)) { + if (isTrueNode.execute(frame, res)) { return PNone.NONE; } else { if (self.isFinalizing()) { @@ -665,7 +686,7 @@ static Object seek(VirtualFrame frame, PTextIO self, Object c, int whence, @Bind("this") Node inliningTarget, @Cached InlinedConditionProfile overflow, @Cached CastToJavaLongLossyNode toLong, - @Cached PyNumberIndexNode indexNode, + @Cached PyNumberLongNode longNode, @Cached TextIOWrapperNodes.DecoderSetStateNode decoderSetStateNode, @Cached TextIOWrapperNodes.DecoderResetNode decoderResetNode, @Cached TextIOWrapperNodes.EncoderResetNode encoderResetNode, @@ -675,14 +696,13 @@ static Object seek(VirtualFrame frame, PTextIO self, Object c, int whence, @Cached PyObjectCallMethodObjArgs callMethodFlush, @Cached PyObjectCallMethodObjArgs callMethodSeek, @Cached PyObjectCallMethodObjArgs callMethodRead, - @Cached PyObjectRichCompareBool.EqNode eqNode, + @Cached PyObjectRichCompareBool eqNode, @Cached TruffleString.CodePointLengthNode codePointLengthNode, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { checkClosedNode.execute(frame, self); if (!self.isSeekable()) { - throw raiseNode.get(inliningTarget).raise(IOUnsupportedOperation, UNDERLYING_STREAM_IS_NOT_SEEKABLE); + throw raiseNode.raise(inliningTarget, IOUnsupportedOperation, UNDERLYING_STREAM_IS_NOT_SEEKABLE); } Object cookieObj = c; @@ -690,8 +710,8 @@ static Object seek(VirtualFrame frame, PTextIO self, Object c, int whence, switch (whence) { case SEEK_CUR: /* seek relative to current position */ - if (!eqNode.compare(frame, inliningTarget, cookieObj, 0)) { - throw raiseNode.get(inliningTarget).raise(IOUnsupportedOperation, CAN_T_DO_NONZERO_CUR_RELATIVE_SEEKS); + if (!eqNode.execute(frame, inliningTarget, cookieObj, 0, RichCmpOp.Py_EQ)) { + throw raiseNode.raise(inliningTarget, IOUnsupportedOperation, CAN_T_DO_NONZERO_CUR_RELATIVE_SEEKS); } /* @@ -703,8 +723,8 @@ static Object seek(VirtualFrame frame, PTextIO self, Object c, int whence, case SEEK_END: /* seek relative to end of file */ - if (!eqNode.compare(frame, inliningTarget, cookieObj, 0)) { - throw raiseNode.get(inliningTarget).raise(IOUnsupportedOperation, CAN_T_DO_NONZERO_END_RELATIVE_SEEKS); + if (!eqNode.executeEq(frame, inliningTarget, cookieObj, 0)) { + throw raiseNode.raise(inliningTarget, IOUnsupportedOperation, CAN_T_DO_NONZERO_END_RELATIVE_SEEKS); } callMethodFlush.execute(frame, inliningTarget, self, T_FLUSH); @@ -718,7 +738,7 @@ static Object seek(VirtualFrame frame, PTextIO self, Object c, int whence, Object res = callMethodSeek.execute(frame, inliningTarget, self.getBuffer(), T_SEEK, 0, 2); if (self.hasEncoder()) { /* If seek() == 0, we are at the start of stream, otherwise not */ - encoderResetNode.execute(frame, inliningTarget, self, eqNode.compare(frame, inliningTarget, res, 0)); + encoderResetNode.execute(frame, inliningTarget, self, eqNode.executeEq(frame, inliningTarget, res, 0)); } return res; @@ -726,20 +746,20 @@ static Object seek(VirtualFrame frame, PTextIO self, Object c, int whence, break; default: - throw raiseNode.get(inliningTarget).raise(ValueError, INVALID_WHENCE_D_SHOULD_BE_D_D_OR_D, whence, SEEK_SET, SEEK_CUR, SEEK_END); + throw raiseNode.raise(inliningTarget, ValueError, INVALID_WHENCE_D_SHOULD_BE_D_D_OR_D, whence, SEEK_SET, SEEK_CUR, SEEK_END); } - Object cookieLong = indexNode.execute(frame, inliningTarget, cookieObj); + Object cookieLong = longNode.execute(frame, inliningTarget, cookieObj); PTextIO.CookieType cookie; if (cookieLong instanceof PInt) { if (((PInt) cookieLong).isNegative()) { - throw raiseNode.get(inliningTarget).raise(ValueError, NEGATIVE_SEEK_POSITION_D, cookieLong); + throw raiseNode.raise(inliningTarget, ValueError, NEGATIVE_SEEK_POSITION_D, cookieLong); } cookie = PTextIO.CookieType.parse((PInt) cookieLong, inliningTarget, overflow, raiseNode); } else { long l = toLong.execute(inliningTarget, cookieLong); if (l < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, NEGATIVE_SEEK_POSITION_D, cookieLong); + throw raiseNode.raise(inliningTarget, ValueError, NEGATIVE_SEEK_POSITION_D, cookieLong); } cookie = PTextIO.CookieType.parse(l, inliningTarget, overflow, raiseNode); } @@ -758,14 +778,14 @@ static Object seek(VirtualFrame frame, PTextIO self, Object c, int whence, self.clearSnapshot(); /* Restore the decoder to its state from the safe start point. */ - decoderSetStateNode.execute(frame, inliningTarget, self, cookie, factory); + decoderSetStateNode.execute(frame, inliningTarget, self, cookie); if (cookie.charsToSkip != 0) { /* Just like _read_chunk, feed the decoder and save a snapshot. */ Object inputChunk = callMethodRead.execute(frame, inliningTarget, self.getBuffer(), T_READ, cookie.bytesToFeed); if (!(inputChunk instanceof PBytes)) { - throw raiseNode.get(inliningTarget).raise(TypeError, UNDERLYING_READ_SHOULD_HAVE_RETURNED_A_BYTES_OBJECT_NOT_S, inputChunk); + throw raiseNode.raise(inliningTarget, TypeError, UNDERLYING_READ_SHOULD_HAVE_RETURNED_A_BYTES_OBJECT_NOT_S, inputChunk); } self.setSnapshotDecFlags(cookie.decFlags); @@ -777,7 +797,7 @@ static Object seek(VirtualFrame frame, PTextIO self, Object c, int whence, /* Skip chars_to_skip of the decoded characters. */ if (decodedLen < cookie.charsToSkip) { - throw raiseNode.get(inliningTarget).raise(OSError, CAN_T_RESTORE_LOGICAL_FILE_POSITION); + throw raiseNode.raise(inliningTarget, OSError, CAN_T_RESTORE_LOGICAL_FILE_POSITION); } self.incDecodedCharsUsed(cookie.charsToSkip); } else { @@ -798,14 +818,14 @@ protected static boolean checkAttached(PTextIO self) { @Specialization(guards = "!self.isOK()") static Object initError(@SuppressWarnings("unused") PTextIO self, @SuppressWarnings("unused") Object o1, @SuppressWarnings("unused") Object o2, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_UNINIT); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_UNINIT); } @Specialization(guards = {"self.isOK()", "self.isDetached()"}) static Object attachError(@SuppressWarnings("unused") PTextIO self, @SuppressWarnings("unused") Object o1, @SuppressWarnings("unused") Object o2, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, DETACHED_BUFFER); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, DETACHED_BUFFER); } } @@ -815,11 +835,11 @@ abstract static class TellNode extends ClosedCheckPythonUnaryBuiltinNode { @Specialization(guards = "!self.isSeekable() || !self.isTelling()") static Object error(@SuppressWarnings("unused") VirtualFrame frame, @SuppressWarnings("unused") PTextIO self, - @Cached PRaiseNode raiseNode) { + @Bind("this") Node inliningTarget) { if (!self.isSeekable()) { - throw raiseNode.raise(IOUnsupportedOperation, UNDERLYING_STREAM_IS_NOT_SEEKABLE); + throw PRaiseNode.raiseStatic(inliningTarget, IOUnsupportedOperation, UNDERLYING_STREAM_IS_NOT_SEEKABLE); } else { - throw raiseNode.raise(OSError, TELLING_POSITION_DISABLED_BY_NEXT_CALL); + throw PRaiseNode.raiseStatic(inliningTarget, OSError, TELLING_POSITION_DISABLED_BY_NEXT_CALL); } } @@ -892,6 +912,7 @@ static Object didntMove(VirtualFrame frame, PTextIO self, }) static Object tell(VirtualFrame frame, PTextIO self, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Exclusive @Cached TextIOWrapperNodes.WriteFlushNode writeFlushNode, @Cached TextIOWrapperNodes.DecoderSetStateNode decoderSetStateNode, @Cached SequenceNodes.GetObjectArrayNode getObjectArrayNode, @@ -906,8 +927,7 @@ static Object tell(VirtualFrame frame, PTextIO self, @Exclusive @Cached PyLongAsLongNode asLongNode, @Cached PyObjectSizeNode sizeNode, @CachedLibrary(limit = "2") InteropLibrary isString, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { PTextIO.CookieType cookie = getCookie(frame, inliningTarget, self, writeFlushNode, callMethodFlush, callMethodTell, asLongNode); byte[] snapshotNextInput = self.getSnapshotNextInput(); int nextInputLength = self.getSnapshotNextInput().length; @@ -921,8 +941,8 @@ static Object tell(VirtualFrame frame, PTextIO self, assert (skipBack <= nextInputLength); while (skipBytes > 0) { /* Decode up to temptative start point */ - decoderSetStateNode.execute(frame, inliningTarget, self, cookie, factory); - PBytes in = factory.createBytes(snapshotNextInput, skipBytes); + decoderSetStateNode.execute(frame, inliningTarget, self, cookie); + PBytes in = PFactory.createBytes(language, snapshotNextInput, skipBytes); int charsDecoded = decoderDecode(frame, inliningTarget, self, in, callMethodDecode, toString, codePointLengthNode); if (charsDecoded <= decodedCharsUsed) { Object[] state = decoderGetstate(frame, inliningTarget, self, savedState, getObjectArrayNode, callMethodGetState, callMethodSetState, raiseNode); @@ -945,7 +965,7 @@ static Object tell(VirtualFrame frame, PTextIO self, } if (skipBytes <= 0) { skipBytes = 0; - decoderSetStateNode.execute(frame, inliningTarget, self, cookie, factory); + decoderSetStateNode.execute(frame, inliningTarget, self, cookie); } /* Note our initial start point. */ @@ -962,7 +982,7 @@ static Object tell(VirtualFrame frame, PTextIO self, int charsDecoded = 0; byte[] input = PythonUtils.arrayCopyOfRange(snapshotNextInput, skipBytes, nextInputLength); while (input.length > 0) { - PBytes start = factory.createBytes(input, 1); + PBytes start = PFactory.createBytes(language, input, 1); int n = decoderDecode(frame, inliningTarget, self, start, callMethodDecode, toString, codePointLengthNode); /* We got n chars for 1 byte */ charsDecoded += n; @@ -991,7 +1011,7 @@ static Object tell(VirtualFrame frame, PTextIO self, if (!isString.isString(decoded)) { fail(frame, inliningTarget, self, savedState, callMethodSetState); - throw raiseNode.get(inliningTarget).raise(TypeError, DECODER_SHOULD_RETURN_A_STRING_RESULT_NOT_P, decoded); + throw raiseNode.raise(inliningTarget, TypeError, DECODER_SHOULD_RETURN_A_STRING_RESULT_NOT_P, decoded); } charsDecoded += sizeNode.execute(frame, inliningTarget, decoded); @@ -999,7 +1019,7 @@ static Object tell(VirtualFrame frame, PTextIO self, if (charsDecoded < decodedCharsUsed) { fail(frame, inliningTarget, self, savedState, callMethodSetState); - throw raiseNode.get(inliningTarget).raise(OSError, CAN_T_RECONSTRUCT_LOGICAL_FILE_POSITION); + throw raiseNode.raise(inliningTarget, OSError, CAN_T_RECONSTRUCT_LOGICAL_FILE_POSITION); } } callMethodSetState.execute(frame, inliningTarget, self.getDecoder(), T_SETSTATE, savedState); @@ -1018,21 +1038,21 @@ static Object[] decoderGetstate(VirtualFrame frame, Node inliningTarget, PTextIO SequenceNodes.GetObjectArrayNode getArray, PyObjectCallMethodObjArgs callMethodGetState, PyObjectCallMethodObjArgs callMethodSetState, - PRaiseNode.Lazy raiseNode) { + PRaiseNode raiseNode) { Object state = callMethodGetState.execute(frame, inliningTarget, self.getDecoder(), T_GETSTATE); if (!(state instanceof PTuple)) { fail(frame, inliningTarget, self, saved_state, callMethodSetState); - throw raiseNode.get(inliningTarget).raise(TypeError, ILLEGAL_DECODER_STATE); + throw raiseNode.raise(inliningTarget, TypeError, ILLEGAL_DECODER_STATE); } Object[] array = getArray.execute(inliningTarget, state); if (array.length < 2) { fail(frame, inliningTarget, self, saved_state, callMethodSetState); - throw raiseNode.get(inliningTarget).raise(TypeError, ILLEGAL_DECODER_STATE); + throw raiseNode.raise(inliningTarget, TypeError, ILLEGAL_DECODER_STATE); } if (!(array[0] instanceof PBytes)) { fail(frame, inliningTarget, self, saved_state, callMethodSetState); - throw raiseNode.get(inliningTarget).raise(TypeError, ILLEGAL_DECODER_STATE_THE_FIRST, array[0]); + throw raiseNode.raise(inliningTarget, TypeError, ILLEGAL_DECODER_STATE_THE_FIRST, array[0]); } return array; } @@ -1172,10 +1192,10 @@ static Object none(PTextIO self, @SuppressWarnings("unused") PNone none) { static Object chunkSize(VirtualFrame frame, PTextIO self, Object arg, @Bind("this") Node inliningTarget, @Cached PyNumberAsSizeNode asSizeNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int size = asSizeNode.executeExact(frame, inliningTarget, arg, ValueError); if (size <= 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, A_STRICTLY_POSITIVE_INTEGER_IS_REQUIRED); + throw raiseNode.raise(inliningTarget, ValueError, A_STRICTLY_POSITIVE_INTEGER_IS_REQUIRED); } self.setChunkSize(size); return 0; @@ -1183,43 +1203,41 @@ static Object chunkSize(VirtualFrame frame, PTextIO self, Object arg, @Specialization(guards = {"self.isOK()", "!self.isDetached()"}) static Object noDelete(@SuppressWarnings("unused") PTextIO self, @SuppressWarnings("unused") DescriptorDeleteMarker marker, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(AttributeError, CANNOT_DELETE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, AttributeError, CANNOT_DELETE); } @Specialization(guards = "!self.isOK()") static Object initError(@SuppressWarnings("unused") PTextIO self, @SuppressWarnings("unused") Object arg, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, IO_UNINIT); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_UNINIT); } @Specialization(guards = {"self.isOK()", "self.isDetached()"}) static Object attachError(@SuppressWarnings("unused") PTextIO self, @SuppressWarnings("unused") Object arg, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, DETACHED_BUFFER); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, DETACHED_BUFFER); } } - @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iternext, isComplex = true) @GenerateNodeFactory abstract static class IternextNode extends ClosedCheckPythonUnaryBuiltinNode { @Specialization(guards = {"checkAttached(self)", "isOpen(frame, self)"}) - static TruffleString doit(VirtualFrame frame, PTextIO self, - @Bind("this") Node inliningTarget, - @Cached TextIOWrapperNodes.ReadlineNode readlineNode, - @Cached PRaiseNode.Lazy raiseNode) { + static Object doit(VirtualFrame frame, PTextIO self, + @Cached TextIOWrapperNodes.ReadlineNode readlineNode) { self.setTelling(false); TruffleString line = readlineNode.execute(frame, self, -1); if (line.isEmpty()) { self.clearSnapshot(); self.setTelling(self.isSeekable()); - throw raiseNode.get(inliningTarget).raiseStopIteration(); + throw TpIterNextBuiltin.iteratorExhausted(); } return line; } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends InitCheckPythonUnaryBuiltinNode { @@ -1227,13 +1245,13 @@ abstract static class ReprNode extends InitCheckPythonUnaryBuiltinNode { static Object doit(VirtualFrame frame, PTextIO self, @Bind("this") Node inliningTarget, @Cached PyObjectLookupAttr lookup, - @Cached("create(Repr)") LookupAndCallUnaryNode repr, + @Cached PyObjectReprAsTruffleStringNode repr, @Cached SimpleTruffleStringFormatNode simpleTruffleStringFormatNode, @Cached IONodes.ToTruffleStringNode toString, @Cached IsBuiltinObjectProfile isValueError, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (!PythonContext.get(inliningTarget).reprEnter(self)) { - throw raiseNode.get(inliningTarget).raise(RuntimeError, REENTRANT_CALL_INSIDE_P_REPR, self); + throw raiseNode.raise(inliningTarget, RuntimeError, REENTRANT_CALL_INSIDE_P_REPR, self); } try { Object nameobj = PNone.NO_VALUE; @@ -1250,11 +1268,11 @@ static Object doit(VirtualFrame frame, PTextIO self, } return simpleTruffleStringFormatNode.format("<_io.TextIOWrapper mode='%s' encoding='%s'>", toString.execute(inliningTarget, modeobj), self.getEncoding()); } - Object name = repr.executeObject(frame, nameobj); + Object name = repr.execute(frame, inliningTarget, nameobj); if (modeobj == PNone.NO_VALUE) { - return simpleTruffleStringFormatNode.format("<_io.TextIOWrapper name=%s encoding='%s'>", toString.execute(inliningTarget, name), self.getEncoding()); + return simpleTruffleStringFormatNode.format("<_io.TextIOWrapper name=%s encoding='%s'>", name, self.getEncoding()); } - return simpleTruffleStringFormatNode.format("<_io.TextIOWrapper name=%s mode='%s' encoding='%s'>", toString.execute(inliningTarget, name), toString.execute(inliningTarget, modeobj), + return simpleTruffleStringFormatNode.format("<_io.TextIOWrapper name=%s mode='%s' encoding='%s'>", name, toString.execute(inliningTarget, modeobj), self.getEncoding()); } finally { PythonContext.get(inliningTarget).reprLeave(self); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/TextIOWrapperNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/TextIOWrapperNodes.java index f211e406e9..bc1b33f72d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/TextIOWrapperNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/TextIOWrapperNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,7 +42,6 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.EncodingWarning; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.IOUnsupportedOperation; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PIncrementalNewlineDecoder; import static com.oracle.graal.python.builtins.modules.CodecsTruffleModuleBuiltins.T_INCREMENTALDECODER; import static com.oracle.graal.python.builtins.modules.CodecsTruffleModuleBuiltins.T_INCREMENTALENCODER; import static com.oracle.graal.python.builtins.modules.io.IONodes.T_CLOSED; @@ -77,6 +76,7 @@ import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.CodecsTruffleModuleBuiltins; import com.oracle.graal.python.builtins.modules.CodecsTruffleModuleBuiltins.MakeIncrementalcodecNode; import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins; @@ -100,7 +100,7 @@ import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; @@ -121,7 +121,7 @@ public abstract class TextIOWrapperNodes { public static final TruffleString T_CODECS_OPEN = tsLiteral("codecs.open()"); - protected static void validateNewline(TruffleString str, Node inliningTarget, PRaiseNode.Lazy raise, TruffleString.CodePointLengthNode codePointLengthNode, + protected static void validateNewline(TruffleString str, Node inliningTarget, PRaiseNode raise, TruffleString.CodePointLengthNode codePointLengthNode, TruffleString.CodePointAtIndexNode codePointAtIndexNode) { int len = codePointLengthNode.execute(str, TS_ENCODING); int c = len == 0 ? '\0' : codePointAtIndexNode.execute(str, 0, TS_ENCODING); @@ -129,7 +129,7 @@ protected static void validateNewline(TruffleString str, Node inliningTarget, PR !(c == '\n' && len == 1) && !(c == '\r' && len == 1) && !(c == '\r' && len == 2 && codePointAtIndexNode.execute(str, 1, TS_ENCODING) == '\n')) { - throw raise.get(inliningTarget).raise(ValueError, ILLEGAL_NEWLINE_VALUE_S, str); + throw raise.raise(inliningTarget, ValueError, ILLEGAL_NEWLINE_VALUE_S, str); } } @@ -169,8 +169,8 @@ static void ideal(@SuppressWarnings("unused") PTextIO self) { @Specialization(guards = {"self.isFileIO()", "self.getFileIO().isClosed()"}) static void error(@SuppressWarnings("unused") PTextIO self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.IO_CLOSED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.IO_CLOSED); } @Specialization(guards = "!self.isFileIO()") @@ -178,10 +178,10 @@ static void checkGeneric(VirtualFrame frame, PTextIO self, @Bind("this") Node inliningTarget, @Cached PyObjectGetAttr getAttr, @Cached PyObjectIsTrueNode isTrueNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object res = getAttr.execute(frame, inliningTarget, self.getBuffer(), T_CLOSED); - if (isTrueNode.execute(frame, inliningTarget, res)) { - error(self, raiseNode.get(inliningTarget)); + if (isTrueNode.execute(frame, res)) { + error(self, raiseNode); } } } @@ -199,10 +199,10 @@ static void nothingTodo(@SuppressWarnings("unused") PTextIO self) { @Specialization(guards = "self.hasPendingBytes()") static void writeflush(VirtualFrame frame, Node inliningTarget, PTextIO self, - @Cached(inline = false) PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached PyObjectCallMethodObjArgs callMethod) { byte[] pending = self.getAndClearPendingBytes(); - PBytes b = factory.createBytes(pending); + PBytes b = PFactory.createBytes(language, pending); callMethod.execute(frame, inliningTarget, self.getBuffer(), T_WRITE, b); // TODO: check _PyIO_trap_eintr } @@ -504,7 +504,7 @@ static boolean readChunk(VirtualFrame frame, Node inliningTarget, PTextIO self, @Cached(inline = false) TruffleString.CodePointLengthNode codePointLengthNode, @CachedLibrary(limit = "3") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { /* * The return value is True unless EOF was reached. The decoded string is placed in * self._decoded_chars (replacing its previous value). The entire input chunk is sent to @@ -524,15 +524,15 @@ static boolean readChunk(VirtualFrame frame, Node inliningTarget, PTextIO self, * with decoder state (b'', decFlags). */ if (!(state instanceof PTuple)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ILLEGAL_DECODER_STATE); + throw raiseNode.raise(inliningTarget, TypeError, ILLEGAL_DECODER_STATE); } Object[] array = getArray.execute(inliningTarget, state); if (array.length < 2) { - throw raiseNode.get(inliningTarget).raise(TypeError, ILLEGAL_DECODER_STATE); + throw raiseNode.raise(inliningTarget, TypeError, ILLEGAL_DECODER_STATE); } if (!(array[0] instanceof PBytes)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ILLEGAL_DECODER_STATE_THE_FIRST, array[0]); + throw raiseNode.raise(inliningTarget, TypeError, ILLEGAL_DECODER_STATE_THE_FIRST, array[0]); } decBuffer = (PBytes) array[0]; @@ -557,7 +557,7 @@ static boolean readChunk(VirtualFrame frame, Node inliningTarget, PTextIO self, try { inputChunkBuf = bufferAcquireLib.acquireReadonly(inputChunk, frame, indirectCallData); } catch (PException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, S_SHOULD_HAVE_RETURNED_A_BYTES_LIKE_OBJECT_NOT_P, (self.isHasRead1() ? T_READ1 : T_READ), inputChunk); + throw raiseNode.raise(inliningTarget, TypeError, S_SHOULD_HAVE_RETURNED_A_BYTES_LIKE_OBJECT_NOT_P, (self.isHasRead1() ? T_READ1 : T_READ), inputChunk); } try { int nbytes = bufferLib.getBufferLength(inputChunkBuf); @@ -598,8 +598,8 @@ static boolean readChunk(VirtualFrame frame, Node inliningTarget, PTextIO self, @Specialization(guards = "!self.hasDecoder()") static boolean error(@SuppressWarnings("unused") PTextIO self, @SuppressWarnings("unused") int size_hint, - @Cached(inline = false) PRaiseNode raiseNode) { - throw raiseNode.raise(IOUnsupportedOperation, NOT_READABLE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, IOUnsupportedOperation, NOT_READABLE); } } @@ -631,10 +631,10 @@ static TruffleString decodeGeneric(VirtualFrame frame, Object decoder, Object o, @GenerateCached(false) protected abstract static class DecoderSetStateNode extends Node { - public abstract void execute(VirtualFrame frame, Node inliningTarget, PTextIO self, PTextIO.CookieType cookie, PythonObjectFactory factory); + public abstract void execute(VirtualFrame frame, Node inliningTarget, PTextIO self, PTextIO.CookieType cookie); @Specialization(guards = "!self.hasDecoder()") - static void nothing(@SuppressWarnings("unused") PTextIO self, @SuppressWarnings("unused") PTextIO.CookieType cookie, @SuppressWarnings("unused") PythonObjectFactory factory) { + static void nothing(@SuppressWarnings("unused") PTextIO self, @SuppressWarnings("unused") PTextIO.CookieType cookie) { // nothing to do. } @@ -650,15 +650,16 @@ protected static boolean isAtInit(PTextIO.CookieType cookie) { } @Specialization(guards = {"self.hasDecoder()", "isAtInit(cookie)"}) - static void atInit(VirtualFrame frame, Node inliningTarget, PTextIO self, @SuppressWarnings("unused") PTextIO.CookieType cookie, @SuppressWarnings("unused") PythonObjectFactory factory, + static void atInit(VirtualFrame frame, Node inliningTarget, PTextIO self, @SuppressWarnings("unused") PTextIO.CookieType cookie, @Exclusive @Cached PyObjectCallMethodObjArgs callMethodReset) { callMethodReset.execute(frame, inliningTarget, self.getDecoder(), T_RESET); } @Specialization(guards = {"self.hasDecoder()", "!isAtInit(cookie)"}) - static void decoderSetstate(VirtualFrame frame, Node inliningTarget, PTextIO self, PTextIO.CookieType cookie, PythonObjectFactory factory, + static void decoderSetstate(VirtualFrame frame, Node inliningTarget, PTextIO self, PTextIO.CookieType cookie, + @Bind PythonLanguage language, @Exclusive @Cached PyObjectCallMethodObjArgs callMethodSetState) { - PTuple tuple = factory.createTuple(new Object[]{factory.createEmptyBytes(), cookie.decFlags}); + PTuple tuple = PFactory.createTuple(language, new Object[]{PFactory.createEmptyBytes(language), cookie.decFlags}); callMethodSetState.execute(frame, inliningTarget, self.getDecoder(), T_SETSTATE, tuple); } @@ -723,10 +724,10 @@ void nothing(@SuppressWarnings("unused") PTextIO self) { static void fixEncoderState(VirtualFrame frame, @SuppressWarnings("unused") Node inliningTarget, PTextIO self, @Cached PyObjectCallMethodObjArgs callMethodTell, @Cached PyObjectCallMethodObjArgs callMethodSetState, - @Cached PyObjectRichCompareBool.EqNode eqNode) { + @Cached PyObjectRichCompareBool eqNode) { self.setEncodingStartOfStream(true); Object cookieObj = callMethodTell.execute(frame, inliningTarget, self.getBuffer(), T_TELL); - if (!eqNode.compare(frame, inliningTarget, cookieObj, 0)) { + if (!eqNode.executeEq(frame, inliningTarget, cookieObj, 0)) { self.setEncodingStartOfStream(false); callMethodSetState.execute(frame, inliningTarget, self.getEncoder(), T_SETSTATE, 0); } @@ -747,15 +748,14 @@ static void setDecoder(VirtualFrame frame, Node inliningTarget, PTextIO self, Ob @Cached(inline = false) MakeIncrementalcodecNode makeIncrementalcodecNode, @Cached InlinedConditionProfile isTrueProfile, @Cached PyObjectCallMethodObjArgs callMethodReadable, - @Cached PyObjectIsTrueNode isTrueNode, - @Cached(inline = false) PythonObjectFactory factory) { + @Cached PyObjectIsTrueNode isTrueNode) { Object res = callMethodReadable.execute(frame, inliningTarget, self.getBuffer(), T_READABLE); - if (isTrueProfile.profile(inliningTarget, !isTrueNode.execute(frame, inliningTarget, res))) { + if (isTrueProfile.profile(inliningTarget, !isTrueNode.execute(frame, res))) { return; } Object decoder = makeIncrementalcodecNode.execute(frame, codecInfo, errors, T_INCREMENTALDECODER); if (self.isReadUniversal()) { - PNLDecoder incDecoder = factory.createNLDecoder(PIncrementalNewlineDecoder); + PNLDecoder incDecoder = PFactory.createNLDecoder(PythonLanguage.get(inliningTarget)); IncrementalNewlineDecoderBuiltins.InitNode.internalInit(incDecoder, decoder, self.isReadTranslate()); self.setDecoder(incDecoder); } else { @@ -780,7 +780,7 @@ static void setEncoder(VirtualFrame frame, Node inliningTarget, PTextIO self, Ob @Cached PyObjectIsTrueNode isTrueNode, @Cached PyObjectCallMethodObjArgs callMethodWritable) { Object res = callMethodWritable.execute(frame, inliningTarget, self.getBuffer(), T_WRITABLE); - if (isTrueProfile.profile(inliningTarget, !isTrueNode.execute(frame, inliningTarget, res))) { + if (isTrueProfile.profile(inliningTarget, !isTrueNode.execute(frame, res))) { return; } self.setEncoder(null); @@ -816,7 +816,7 @@ static void init(VirtualFrame frame, Node inliningTarget, PTextIO self, Object b @Cached(inline = false) TruffleString.IndexOfCodePointNode indexOfCodePointNode, @Cached(inline = false) TruffleString.EqualNode equalNode, @Cached(inline = false) WarningsModuleBuiltins.WarnNode warnNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { self.setOK(false); self.setDetached(false); // encoding and newline are processed through arguments clinic and safe to cast. @@ -830,13 +830,13 @@ static void init(VirtualFrame frame, Node inliningTarget, PTextIO self, Object b encoding = null; } else { if (indexOfCodePointNode.execute(encoding, 0, 0, codePointLengthNode.execute(encoding, TS_ENCODING), TS_ENCODING) != -1) { - throw raiseNode.get(inliningTarget).raise(ValueError, EMBEDDED_NULL_CHARACTER); + throw raiseNode.raise(inliningTarget, ValueError, EMBEDDED_NULL_CHARACTER); } } if (newline != null) { if (indexOfCodePointNode.execute(newline, 0, 0, codePointLengthNode.execute(newline, TS_ENCODING), TS_ENCODING) != -1) { - throw raiseNode.get(inliningTarget).raise(ValueError, EMBEDDED_NULL_CHARACTER); + throw raiseNode.raise(inliningTarget, ValueError, EMBEDDED_NULL_CHARACTER); } validateNewline(newline, inliningTarget, raiseNode, codePointLengthNode, codePointAtIndexNode); } @@ -856,7 +856,7 @@ static void init(VirtualFrame frame, Node inliningTarget, PTextIO self, Object b } else if (encoding != null) { self.setEncoding(encoding); } else { - throw raiseNode.get(inliningTarget).raise(OSError, COULD_NOT_DETERMINE_DEFAULT_ENCODING); + throw raiseNode.raise(inliningTarget, OSError, COULD_NOT_DETERMINE_DEFAULT_ENCODING); } /* Check we have been asked for a real text encoding */ @@ -881,12 +881,11 @@ static void init(VirtualFrame frame, Node inliningTarget, PTextIO self, Object b if (((PBuffered) buffer).isFastClosedChecks()) { PFileIO f = ((PBuffered) buffer).getFileIORaw(); self.setFileIO(f); - f.setUTF8Write(false); } } Object res = callMethodSeekable.execute(frame, inliningTarget, buffer, T_SEEKABLE); - self.setTelling(isTrueNode.execute(frame, inliningTarget, res)); + self.setTelling(isTrueNode.execute(frame, res)); self.setSeekable(self.isTelling()); self.setHasRead1(lookup.execute(frame, inliningTarget, buffer, T_READ1) != PNone.NO_VALUE); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/json/JSONEncoderBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/json/JSONEncoderBuiltins.java index 5aa6922398..8a86eb6741 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/json/JSONEncoderBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/json/JSONEncoderBuiltins.java @@ -1,4 +1,4 @@ -/* Copyright (c) 2020, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2020, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2020 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 @@ -12,7 +12,6 @@ import static com.oracle.graal.python.nodes.PGuards.isPFloat; import static com.oracle.graal.python.nodes.PGuards.isPInt; import static com.oracle.graal.python.nodes.PGuards.isString; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__; import static com.oracle.graal.python.nodes.truffle.TruffleStringMigrationHelpers.isJavaString; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; @@ -21,11 +20,15 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.modules.json.JSONEncoderBuiltinsClinicProviders.MakeEncoderClinicProviderGen; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.common.HashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetIterator; @@ -38,15 +41,20 @@ import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.floats.FloatBuiltins; import com.oracle.graal.python.builtins.objects.floats.PFloat; +import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.list.ListBuiltins.ListSortNode; import com.oracle.graal.python.builtins.objects.list.PList; +import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; import com.oracle.graal.python.builtins.objects.str.PString; import com.oracle.graal.python.builtins.objects.str.StringNodes; import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyListCheckExactNode; +import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.lib.PyTupleCheckExactNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; @@ -56,18 +64,17 @@ import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.formatting.FloatFormatter; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.PSequence; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; @@ -87,18 +94,65 @@ public final class JSONEncoderBuiltins extends PythonBuiltins { private static final TruffleString T_BRACES = tsLiteral("{}"); private static final TruffleString T_BRACKETS = tsLiteral("[]"); + public static final TpSlots SLOTS = JSONEncoderBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return JSONEncoderBuiltinsFactory.getFactories(); } - @Builtin(name = J___CALL__, minNumOfPositionalArgs = 1, parameterNames = {"$self", "obj", "_current_indent_level"}) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "make_encoder", minNumOfPositionalArgs = 10, // + parameterNames = {"$cls", "markers", "default", "encoder", "indent", "key_separator", "item_separator", "sort_keys", "skipkeys", "allow_nan"}) + @ArgumentClinic(name = "key_separator", conversion = ArgumentClinic.ClinicConversion.TString) + @ArgumentClinic(name = "item_separator", conversion = ArgumentClinic.ClinicConversion.TString) + @ArgumentClinic(name = "sort_keys", conversion = ArgumentClinic.ClinicConversion.Boolean) + @ArgumentClinic(name = "skipkeys", conversion = ArgumentClinic.ClinicConversion.Boolean) + @ArgumentClinic(name = "allow_nan", conversion = ArgumentClinic.ClinicConversion.Boolean) + @GenerateNodeFactory + public abstract static class MakeEncoder extends PythonClinicBuiltinNode { + + @Override + protected ArgumentClinicProvider getArgumentClinic() { + return MakeEncoderClinicProviderGen.INSTANCE; + } + + @Specialization + @TruffleBoundary + PJSONEncoder doNew(Object cls, Object markers, Object defaultFn, Object encoder, Object indent, TruffleString keySeparator, TruffleString itemSeparator, boolean sortKeys, + boolean skipKeys, boolean allowNan) { + if (markers != PNone.NONE && !(markers instanceof PDict)) { + throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.MAKE_ENCODER_ARG_1_MUST_BE_DICT, markers); + } + + PJSONEncoder.FastEncode fastEncode = PJSONEncoder.FastEncode.None; + Object encoderAsFun = encoder; + if (encoder instanceof PBuiltinMethod encoderMethod) { + encoderAsFun = encoderMethod.getFunction(); + } + if (encoderAsFun instanceof PBuiltinFunction function) { + Class nodeClass = function.getNodeClass(); + if (nodeClass != null) { + if (JSONModuleBuiltins.EncodeBaseString.class.isAssignableFrom(nodeClass)) { + fastEncode = PJSONEncoder.FastEncode.FastEncode; + } else if (JSONModuleBuiltins.EncodeBaseStringAscii.class.isAssignableFrom(nodeClass)) { + fastEncode = PJSONEncoder.FastEncode.FastEncodeAscii; + } + } + } + return PFactory.createJSONEncoder(PythonLanguage.get(null), cls, TypeNodes.GetInstanceShape.executeUncached(cls), + markers, defaultFn, encoder, indent, keySeparator, itemSeparator, sortKeys, skipKeys, allowNan, fastEncode); + } + } + + @Slot(value = SlotKind.tp_call, isComplex = true) + @SlotSignature(name = "_iterencode", minNumOfPositionalArgs = 1, parameterNames = {"$self", "obj", "_current_indent_level"}) @ArgumentClinic(name = "_current_indent_level", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "0", useDefaultForNone = true) @GenerateNodeFactory public abstract static class CallEncoderNode extends PythonTernaryClinicBuiltinNode { @Child private LookupAndCallUnaryNode callGetItems = LookupAndCallUnaryNode.create(SpecialMethodNames.T_ITEMS); - @Child private LookupAndCallUnaryNode callGetDictIter = LookupAndCallUnaryNode.create(SpecialMethodSlot.Iter); - @Child private LookupAndCallUnaryNode callGetListIter = LookupAndCallUnaryNode.create(SpecialMethodSlot.Iter); + @Child private PyObjectGetIter callGetDictIter = PyObjectGetIter.create(); + @Child private PyObjectGetIter callGetListIter = PyObjectGetIter.create(); @Child private ListSortNode sortList = ListSortNode.create(); @Override @@ -108,8 +162,8 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization protected PTuple call(PJSONEncoder self, Object obj, @SuppressWarnings("unused") int indent, - @Cached PythonObjectFactory factory) { - return factory.createTuple(new Object[]{jsonEncode(self, obj)}); + @Bind PythonLanguage language) { + return PFactory.createTuple(language, new Object[]{jsonEncode(self, obj)}); } @TruffleBoundary @@ -133,7 +187,7 @@ private void appendConst(TruffleStringBuilderUTF32 builder, Object obj) { private void appendFloat(PJSONEncoder encoder, TruffleStringBuilderUTF32 builder, double obj) { if (!Double.isFinite(obj)) { if (!encoder.allowNan) { - throw PRaiseNode.raiseUncached(this, ValueError, ErrorMessages.OUT_OF_RANGE_FLOAT_NOT_JSON_COMPLIANT); + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.OUT_OF_RANGE_FLOAT_NOT_JSON_COMPLIANT); } if (obj > 0) { builder.appendStringUncached(T_POSITIVE_INFINITY); @@ -164,7 +218,7 @@ private void appendString(PJSONEncoder encoder, TruffleStringBuilderUTF32 builde case None: Object result = CallUnaryMethodNode.getUncached().executeObject(encoder.encoder, obj); if (!isString(result)) { - throw PRaiseNode.raiseUncached(this, TypeError, ErrorMessages.ENCODER_MUST_RETURN_STR, result); + throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.ENCODER_MUST_RETURN_STR, result); } builder.appendStringUncached(CastToTruffleStringNode.executeUncached(result)); break; @@ -229,7 +283,7 @@ private static void endRecursion(PJSONEncoder encoder, Object obj) { private void startRecursion(PJSONEncoder encoder, Object obj) { if (encoder.markers != PNone.NONE) { if (!encoder.tryAddCircular(obj)) { - throw PRaiseNode.raiseUncached(this, ValueError, ErrorMessages.CIRCULAR_REFERENCE_DETECTED); + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.CIRCULAR_REFERENCE_DETECTED); } } } @@ -265,23 +319,21 @@ private void appendDictSlowPath(PJSONEncoder encoder, TruffleStringBuilderUTF32 if (encoder.sortKeys) { sortList.execute(null, items); } - Object iter = callGetDictIter.executeObject(null, items); + Object iter = callGetDictIter.executeCached(null, items); boolean first = true; while (true) { - Object item; try { - item = GetNextNode.getUncached().execute(null, iter); - } catch (PException e) { - e.expectStopIteration(null, IsBuiltinObjectProfile.getUncached()); + Object item = PyIterNextNode.executeUncached(iter); + if (!(item instanceof PTuple itemTuple) || itemTuple.getSequenceStorage().length() != 2) { + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.ITEMS_MUST_RETURN_2_TUPLES); + } + SequenceStorage sequenceStorage = itemTuple.getSequenceStorage(); + Object key = SequenceStorageNodes.GetItemScalarNode.executeUncached(sequenceStorage, 0); + Object value = SequenceStorageNodes.GetItemScalarNode.executeUncached(sequenceStorage, 1); + first = appendDictEntry(encoder, builder, first, key, value); + } catch (IteratorExhausted e) { break; } - if (!(item instanceof PTuple itemTuple) || itemTuple.getSequenceStorage().length() != 2) { - throw PRaiseNode.raiseUncached(this, ValueError, ErrorMessages.ITEMS_MUST_RETURN_2_TUPLES); - } - SequenceStorage sequenceStorage = itemTuple.getSequenceStorage(); - Object key = SequenceStorageNodes.GetItemScalarNode.executeUncached(sequenceStorage, 0); - Object value = SequenceStorageNodes.GetItemScalarNode.executeUncached(sequenceStorage, 1); - first = appendDictEntry(encoder, builder, first, key, value); } } @@ -296,7 +348,7 @@ private boolean appendDictEntry(PJSONEncoder encoder, TruffleStringBuilderUTF32 if (encoder.skipKeys) { return true; } - throw PRaiseNode.raiseUncached(this, TypeError, ErrorMessages.KEYS_MUST_BE_STR_INT___NOT_P, key); + throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.KEYS_MUST_BE_STR_INT___NOT_P, key); } builder.appendCodePointUncached('"'); appendSimpleObj(encoder, builder, key); @@ -333,21 +385,19 @@ private void appendList(PJSONEncoder encoder, TruffleStringBuilderUTF32 builder, } private void appendListSlowPath(PJSONEncoder encoder, TruffleStringBuilderUTF32 builder, PSequence list) { - Object iter = callGetListIter.executeObject(null, list); + Object iter = callGetListIter.executeCached(null, list); boolean first = true; while (true) { - Object item; try { - item = GetNextNode.getUncached().execute(null, iter); - } catch (PException e) { - e.expectStopIteration(null, IsBuiltinObjectProfile.getUncached()); + Object item = PyIterNextNode.executeUncached(iter); + if (!first) { + builder.appendStringUncached(encoder.itemSeparator); + } + first = false; + appendListObj(encoder, builder, item); + } catch (IteratorExhausted e) { break; } - if (!first) { - builder.appendStringUncached(encoder.itemSeparator); - } - first = false; - appendListObj(encoder, builder, item); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/json/JSONModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/json/JSONModuleBuiltins.java index 602322b659..594537365a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/json/JSONModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/json/JSONModuleBuiltins.java @@ -1,17 +1,15 @@ -/* Copyright (c) 2020, 2023, Oracle and/or its affiliates. +/* Copyright (c) 2020, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2020 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 */ package com.oracle.graal.python.builtins.modules.json; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; -import static com.oracle.graal.python.nodes.StringLiterals.T_STRICT; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; -import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; @@ -19,31 +17,20 @@ import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.modules.json.JSONScannerBuiltins.IntRef; -import com.oracle.graal.python.builtins.modules.json.PJSONEncoder.FastEncode; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.dict.PDict; -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; import com.oracle.graal.python.builtins.objects.str.StringNodes.CastToJavaStringCheckedNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.SpecialAttributeNames; -import com.oracle.graal.python.nodes.attributes.GetAttributeNode.GetFixedAttributeNode; -import com.oracle.graal.python.nodes.expression.CoerceToBooleanNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.strings.TruffleStringBuilder; @@ -94,11 +81,11 @@ protected ArgumentClinicProvider getArgumentClinic() { Object call(Object string, int end, boolean strict, @Bind("this") Node inliningTarget, @Cached CastToJavaStringCheckedNode castString, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { IntRef nextIdx = new IntRef(); TruffleString result = JSONScannerBuiltins.scanStringUnicode(castString.cast(inliningTarget, string, ErrorMessages.FIRST_ARG_MUST_BE_STRING_NOT_P, string), end, strict, nextIdx, this); - return factory.createTuple(new Object[]{result, nextIdx.value}); + return PFactory.createTuple(language, new Object[]{result, nextIdx.value}); } } @@ -124,7 +111,7 @@ static TruffleString call(TruffleString string, @Cached TruffleStringBuilder.AppendStringNode appendStringNode, @Cached TruffleString.SubstringNode substringNode, @Cached TruffleStringBuilder.ToStringNode toStringNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { int len = string.byteLength(TS_ENCODING); // 12.5% overallocated, TruffleStringBuilder.ToStringNode will copy anyway @@ -132,7 +119,7 @@ static TruffleString call(TruffleString string, JSONUtils.appendString(string, createCodePointIteratorNode.execute(string, TS_ENCODING), builder, false, nextNode, appendCodePointNode, appendStringNode, substringNode); return toStringNode.execute(builder); } catch (OutOfMemoryError | NegativeArraySizeException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.OverflowError, ErrorMessages.STR_TOO_LONG_TO_ESCAPE); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.OverflowError, ErrorMessages.STR_TOO_LONG_TO_ESCAPE); } } @@ -160,7 +147,7 @@ static TruffleString call(TruffleString string, @Cached TruffleStringBuilder.AppendStringNode appendStringNode, @Cached TruffleString.SubstringNode substringNode, @Cached TruffleStringBuilder.ToStringNode toStringNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { int len = string.byteLength(TS_ENCODING); // 12.5% overallocated, TruffleStringBuilder.ToStringNode will copy anyway @@ -169,80 +156,8 @@ static TruffleString call(TruffleString string, nextNode, appendCodePointNode, appendStringNode, substringNode); return toStringNode.execute(builder); } catch (OutOfMemoryError | NegativeArraySizeException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.OverflowError, ErrorMessages.STR_TOO_LONG_TO_ESCAPE); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.OverflowError, ErrorMessages.STR_TOO_LONG_TO_ESCAPE); } } } - - @Builtin(name = "make_scanner", parameterNames = {"$cls", "context"}, constructsClass = PythonBuiltinClassType.JSONScanner, // - doc = "_iterencode(obj, _current_indent_level) -> iterable") - @GenerateNodeFactory - public abstract static class MakeScanner extends PythonBinaryBuiltinNode { - - @Child private GetFixedAttributeNode getStrict = GetFixedAttributeNode.create(T_STRICT); - @Child private GetFixedAttributeNode getObjectHook = GetFixedAttributeNode.create(tsLiteral("object_hook")); - @Child private GetFixedAttributeNode getObjectPairsHook = GetFixedAttributeNode.create(tsLiteral("object_pairs_hook")); - @Child private GetFixedAttributeNode getParseFloat = GetFixedAttributeNode.create(tsLiteral("parse_float")); - @Child private GetFixedAttributeNode getParseInt = GetFixedAttributeNode.create(tsLiteral("parse_int")); - @Child private GetFixedAttributeNode getParseConstant = GetFixedAttributeNode.create(tsLiteral("parse_constant")); - - @Specialization - public PJSONScanner doNew(VirtualFrame frame, Object cls, Object context, - @Bind("this") Node inliningTarget, - @Cached CoerceToBooleanNode.YesNode castStrict, - @Cached PythonObjectFactory factory) { - - boolean strict = castStrict.executeBoolean(frame, inliningTarget, getStrict.execute(frame, context)); - Object objectHook = getObjectHook.execute(frame, context); - Object objectPairsHook = getObjectPairsHook.execute(frame, context); - Object parseFloat = getParseFloat.execute(frame, context); - Object parseInt = getParseInt.execute(frame, context); - Object parseConstant = getParseConstant.execute(frame, context); - return factory.createJSONScanner(cls, strict, objectHook, objectPairsHook, parseFloat, parseInt, parseConstant); - } - } - - @Builtin(name = "make_encoder", minNumOfPositionalArgs = 10, // - parameterNames = {"$cls", "markers", "default", "encoder", "indent", "key_separator", "item_separator", "sort_keys", "skipkeys", "allow_nan"}, // - constructsClass = PythonBuiltinClassType.JSONEncoder, // - doc = "JSON scanner object") - @ArgumentClinic(name = "key_separator", conversion = ArgumentClinic.ClinicConversion.TString) - @ArgumentClinic(name = "item_separator", conversion = ArgumentClinic.ClinicConversion.TString) - @ArgumentClinic(name = "sort_keys", conversion = ArgumentClinic.ClinicConversion.Boolean) - @ArgumentClinic(name = "skipkeys", conversion = ArgumentClinic.ClinicConversion.Boolean) - @ArgumentClinic(name = "allow_nan", conversion = ArgumentClinic.ClinicConversion.Boolean) - @GenerateNodeFactory - public abstract static class MakeEncoder extends PythonClinicBuiltinNode { - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return JSONModuleBuiltinsClinicProviders.MakeEncoderClinicProviderGen.INSTANCE; - } - - @Specialization - @TruffleBoundary - PJSONEncoder doNew(Object cls, Object markers, Object defaultFn, Object encoder, Object indent, TruffleString keySeparator, TruffleString itemSeparator, boolean sortKeys, - boolean skipKeys, boolean allowNan) { - if (markers != PNone.NONE && !(markers instanceof PDict)) { - throw PRaiseNode.raiseUncached(this, TypeError, ErrorMessages.MAKE_ENCODER_ARG_1_MUST_BE_DICT, markers); - } - - FastEncode fastEncode = FastEncode.None; - Object encoderAsFun = encoder; - if (encoder instanceof PBuiltinMethod encoderMethod) { - encoderAsFun = encoderMethod.getFunction(); - } - if (encoderAsFun instanceof PBuiltinFunction function) { - Class nodeClass = function.getNodeClass(); - if (nodeClass != null) { - if (JSONModuleBuiltins.EncodeBaseString.class.isAssignableFrom(nodeClass)) { - fastEncode = FastEncode.FastEncode; - } else if (JSONModuleBuiltins.EncodeBaseStringAscii.class.isAssignableFrom(nodeClass)) { - fastEncode = FastEncode.FastEncodeAscii; - } - } - } - return getContext().factory().createJSONEncoder(cls, markers, defaultFn, encoder, indent, keySeparator, itemSeparator, sortKeys, skipKeys, allowNan, fastEncode); - } - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/json/JSONScannerBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/json/JSONScannerBuiltins.java index 98929072c7..94a58f3374 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/json/JSONScannerBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/json/JSONScannerBuiltins.java @@ -1,17 +1,25 @@ -/* Copyright (c) 2020, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2020, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2020 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 */ package com.oracle.graal.python.builtins.modules.json; +import static com.oracle.graal.python.nodes.StringLiterals.T_STRICT; +import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; +import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; +import static com.oracle.graal.python.util.PythonUtils.tsLiteral; + +import java.util.List; + import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.common.EconomicMapStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorage; @@ -19,39 +27,37 @@ import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.floats.FloatUtils; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyFloatCheckExactNode; import com.oracle.graal.python.lib.PyLongCheckExactNode; +import com.oracle.graal.python.lib.PyLongFromUnicodeObject; +import com.oracle.graal.python.lib.PyObjectIsTrueNode; import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.attributes.GetAttributeNode; import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.statement.AbstractImportNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage; import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.object.Shape; import com.oracle.truffle.api.strings.TruffleString; -import java.math.BigInteger; -import java.util.List; - -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__; -import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; -import static com.oracle.graal.python.util.PythonUtils.tsLiteral; - @CoreFunctions(extendClasses = PythonBuiltinClassType.JSONScanner) public final class JSONScannerBuiltins extends PythonBuiltins { @@ -61,12 +67,43 @@ static final class IntRef { int value; } + public static final TpSlots SLOTS = JSONScannerBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return JSONScannerBuiltinsFactory.getFactories(); } - @Builtin(name = J___CALL__, minNumOfPositionalArgs = 1, parameterNames = {"$self", "string", "idx"}) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "make_scanner", parameterNames = {"$cls", "context"}) + @GenerateNodeFactory + public abstract static class MakeScanner extends PythonBinaryBuiltinNode { + + @Child private GetAttributeNode.GetFixedAttributeNode getStrict = GetAttributeNode.GetFixedAttributeNode.create(T_STRICT); + @Child private GetAttributeNode.GetFixedAttributeNode getObjectHook = GetAttributeNode.GetFixedAttributeNode.create(tsLiteral("object_hook")); + @Child private GetAttributeNode.GetFixedAttributeNode getObjectPairsHook = GetAttributeNode.GetFixedAttributeNode.create(tsLiteral("object_pairs_hook")); + @Child private GetAttributeNode.GetFixedAttributeNode getParseFloat = GetAttributeNode.GetFixedAttributeNode.create(tsLiteral("parse_float")); + @Child private GetAttributeNode.GetFixedAttributeNode getParseInt = GetAttributeNode.GetFixedAttributeNode.create(tsLiteral("parse_int")); + @Child private GetAttributeNode.GetFixedAttributeNode getParseConstant = GetAttributeNode.GetFixedAttributeNode.create(tsLiteral("parse_constant")); + + @Specialization + public PJSONScanner doNew(VirtualFrame frame, Object cls, Object context, + @Cached PyObjectIsTrueNode castStrict, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + + boolean strict = castStrict.execute(frame, getStrict.execute(frame, context)); + Object objectHook = getObjectHook.execute(frame, context); + Object objectPairsHook = getObjectPairsHook.execute(frame, context); + Object parseFloat = getParseFloat.execute(frame, context); + Object parseInt = getParseInt.execute(frame, context); + Object parseConstant = getParseConstant.execute(frame, context); + return PFactory.createJSONScanner(language, cls, getInstanceShape.execute(cls), strict, objectHook, objectPairsHook, parseFloat, parseInt, parseConstant); + } + } + + @Slot(value = SlotKind.tp_call, isComplex = true) + @SlotSignature(name = "scan_once", minNumOfPositionalArgs = 1, parameterNames = {"$self", "string", "idx"}) @ArgumentClinic(name = "string", conversion = ArgumentClinic.ClinicConversion.TString) @ArgumentClinic(name = "idx", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "0", useDefaultForNone = true) @GenerateNodeFactory @@ -78,11 +115,6 @@ public abstract static class CallScannerNode extends PythonTernaryClinicBuiltinN @Child private CallUnaryMethodNode callParseConstant = CallUnaryMethodNode.create(); @Child private CallUnaryMethodNode callObjectHook = CallUnaryMethodNode.create(); @Child private CallUnaryMethodNode callObjectPairsHook = CallUnaryMethodNode.create(); - @Child private PythonObjectFactory factory = PythonObjectFactory.create(); - - @CompilationFinal private Shape tupleInstanceShape; - @CompilationFinal private Shape listInstanceShape; - @CompilationFinal private Shape dictInstanceShape; @Override protected ArgumentClinicProvider getArgumentClinic() { @@ -92,21 +124,9 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization protected PTuple call(PJSONScanner self, TruffleString string, int idx, @Cached TruffleString.ToJavaStringNode toJavaStringNode) { - if (tupleInstanceShape == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - tupleInstanceShape = PythonLanguage.get(this).getBuiltinTypeInstanceShape(PythonBuiltinClassType.PTuple); - } - if (listInstanceShape == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - listInstanceShape = PythonLanguage.get(this).getBuiltinTypeInstanceShape(PythonBuiltinClassType.PList); - } - if (dictInstanceShape == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - dictInstanceShape = PythonLanguage.get(this).getBuiltinTypeInstanceShape(PythonBuiltinClassType.PDict); - } IntRef nextIdx = new IntRef(); Object result = scanOnceUnicode(self, toJavaStringNode.execute(string), idx, nextIdx); - return factory.createTuple(new Object[]{result, nextIdx.value}); + return PFactory.createTuple(PythonLanguage.get(this), new Object[]{result, nextIdx.value}); } @TruffleBoundary @@ -120,6 +140,8 @@ private Object parseObjectUnicode(PJSONScanner scanner, String string, int start */ boolean hasPairsHook = scanner.objectPairsHook != PNone.NONE; + PythonLanguage language = PythonLanguage.get(null); + int idx = start; int length = string.length(); @@ -161,7 +183,7 @@ private Object parseObjectUnicode(PJSONScanner scanner, String string, int start idx = nextIdx.value; if (hasPairsHook) { - listStorage.insertItem(listStorage.length(), factory.createTuple(PythonBuiltinClassType.PTuple, tupleInstanceShape, new Object[]{key, val})); + listStorage.insertItem(listStorage.length(), PFactory.createTuple(language, new Object[]{key, val})); } else { HashingStorage newStorage = HashingStorageSetItem.executeUncached(mapStorage, key, val); assert newStorage == mapStorage; @@ -186,11 +208,11 @@ private Object parseObjectUnicode(PJSONScanner scanner, String string, int start nextIdx.value = idx + 1; if (hasPairsHook) { - return callObjectPairsHook.executeObject(scanner.objectPairsHook, factory.createList(PythonBuiltinClassType.PList, listInstanceShape, listStorage)); + return callObjectPairsHook.executeObject(scanner.objectPairsHook, PFactory.createList(language, listStorage)); } /* if object_hook is not None: rval = object_hook(rval) */ - PDict rval = factory.createDict(PythonBuiltinClassType.PDict, dictInstanceShape, mapStorage); + PDict rval = PFactory.createDict(language, mapStorage); if (scanner.objectHook != PNone.NONE) { return callObjectHook.executeObject(scanner.objectHook, rval); } @@ -242,7 +264,7 @@ private Object parseArrayUnicode(PJSONScanner scanner, String string, int start, throw decodeError(this, string, length - 1, ErrorMessages.EXPECTING_VALUE); } nextIdx.value = idx + 1; - return factory.createList(PythonBuiltinClassType.PList, listInstanceShape, storage); + return PFactory.createList(PythonLanguage.get(null), storage); } private static int skipWhitespace(String string, int start, int length) { @@ -347,23 +369,8 @@ private Object matchNumberUnicode(PJSONScanner scanner, String string, int start } } else { if (PyLongCheckExactNode.executeUncached(scanner.parseInt)) { - Object rval = BuiltinConstructors.IntNode.parseSimpleDecimalLiteral(string, start, idx - start); - if (rval != null) { - return rval; - } - String numStr = string.substring(start, idx); - BigInteger bi = new BigInteger(numStr); - try { - return bi.intValueExact(); - } catch (ArithmeticException e) { - // fall through - } - try { - return bi.longValueExact(); - } catch (ArithmeticException e) { - // fall through - } - return factory.createInt(bi); + TruffleString numStr = TruffleString.fromJavaStringUncached(string, start, idx - start, TS_ENCODING, false); + return PyLongFromUnicodeObject.executeUncached(numStr, 10); } else { /* copy the section we determined to be a number */ TruffleString numStr = toTruffleStringUncached(string.substring(start, idx)); @@ -382,7 +389,7 @@ private Object scanOnceUnicode(PJSONScanner scanner, String string, int idx, Int * Returns a new PyObject representation of the term. */ if (idx < 0) { - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.ValueError, ErrorMessages.IDX_CANNOT_BE_NEG); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.ValueError, ErrorMessages.IDX_CANNOT_BE_NEG); } int length = string.length(); if (idx >= length) { @@ -464,7 +471,7 @@ static TruffleString scanStringUnicode(String string, int start, boolean strict, StringBuilder builder = null; if (start < 0 || start > string.length()) { - throw PRaiseNode.raiseUncached(raisingNode, PythonBuiltinClassType.ValueError, ErrorMessages.END_IS_OUT_OF_BOUNDS); + throw PRaiseNode.raiseStatic(raisingNode, PythonBuiltinClassType.ValueError, ErrorMessages.END_IS_OUT_OF_BOUNDS); } int idx = start; while (idx < string.length()) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lsprof/LsprofModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lsprof/LsprofModuleBuiltins.java new file mode 100644 index 0000000000..6b8b28c029 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lsprof/LsprofModuleBuiltins.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.builtins.modules.lsprof; + +import java.util.Collections; +import java.util.List; + +import com.oracle.graal.python.builtins.CoreFunctions; +import com.oracle.graal.python.builtins.Python3Core; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.tuple.StructSequence; +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.truffle.api.dsl.NodeFactory; + +@CoreFunctions(defineModule = "_lsprof") +public final class LsprofModuleBuiltins extends PythonBuiltins { + + static final StructSequence.BuiltinTypeDescriptor PROFILER_ENTRY_DESC = new StructSequence.BuiltinTypeDescriptor( + PythonBuiltinClassType.PProfilerEntry, + 6, + new String[]{ + "code", "callcount", "reccallcount", "totaltime", "inlinetime", "calls" + }, + new String[]{ + "code object or built-in function name", + "how many times this was called", + "how many times called recursively", + "total time in this entry", + "inline time in this entry (not in subcalls)", + "details of the calls" + }); + + static final StructSequence.BuiltinTypeDescriptor PROFILER_SUBENTRY_DESC = new StructSequence.BuiltinTypeDescriptor( + PythonBuiltinClassType.PProfilerSubentry, + 5, + new String[]{ + "code", "callcount", "reccallcount", "totaltime", "inlinetime" + }, + new String[]{ + "called code object or built-in function name", + "how many times this is called", + "how many times this is called recursively", + "total time spent in this call", + "inline time (not in further subcalls)" + }); + + @Override + protected List> getNodeFactories() { + return Collections.emptyList(); + } + + @Override + public void initialize(Python3Core core) { + super.initialize(core); + StructSequence.initType(core, PROFILER_ENTRY_DESC); + StructSequence.initType(core, PROFILER_SUBENTRY_DESC); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lsprof/Profiler.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lsprof/Profiler.java new file mode 100644 index 0000000000..33dfbaa4de --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lsprof/Profiler.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.builtins.modules.lsprof; + +import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; +import com.oracle.truffle.api.instrumentation.SourceSectionFilter; +import com.oracle.truffle.api.object.Shape; +import com.oracle.truffle.tools.profiler.CPUSampler; + +public class Profiler extends PythonBuiltinObject { + boolean subcalls; + boolean builtins; + double timeunit; + Object externalTimer; + double time; + final CPUSampler sampler; + + public Profiler(Object cls, Shape instanceShape, CPUSampler sampler) { + super(cls, instanceShape); + this.sampler = sampler; + this.sampler.setFilter(SourceSectionFilter.newBuilder().includeInternal(true).build()); + this.sampler.setPeriod(1); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lsprof/ProfilerBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lsprof/ProfilerBuiltins.java new file mode 100644 index 0000000000..56be758624 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lsprof/ProfilerBuiltins.java @@ -0,0 +1,277 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.builtins.modules.lsprof; + +import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; +import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.builtins.CoreFunctions; +import com.oracle.graal.python.builtins.Python3Core; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.function.PKeyword; +import com.oracle.graal.python.builtins.objects.list.PList; +import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinNode; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.InstrumentInfo; +import com.oracle.truffle.api.TruffleLanguage; +import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.source.SourceSection; +import com.oracle.truffle.tools.profiler.CPUSampler; +import com.oracle.truffle.tools.profiler.CPUSamplerData; +import com.oracle.truffle.tools.profiler.ProfilerNode; +import com.oracle.truffle.tools.profiler.impl.CPUSamplerInstrument; + +@CoreFunctions(extendClasses = PythonBuiltinClassType.LsprofProfiler) +public class ProfilerBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = ProfilerBuiltinsSlotsGen.SLOTS; + + @Override + protected List> getNodeFactories() { + return ProfilerBuiltinsFactory.getFactories(); + } + + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "Profiler", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + abstract static class LsprofNew extends PythonBuiltinNode { + @Specialization + @TruffleBoundary + Profiler doit(Object cls, @SuppressWarnings("unused") Object[] args, @SuppressWarnings("unused") PKeyword[] kwargs) { + if (Python3Core.HAS_PROFILER_TOOL) { + // Avoid ClassNotFoundException + PythonContext context = getContext(); + TruffleLanguage.Env env = context.getEnv(); + Map instruments = env.getInstruments(); + InstrumentInfo instrumentInfo = instruments.get(CPUSamplerInstrument.ID); + if (instrumentInfo != null) { + CPUSampler sampler = env.lookup(instrumentInfo, CPUSampler.class); + if (sampler != null) { + return PFactory.createProfiler(context.getLanguage(), cls, TypeNodes.GetInstanceShape.executeUncached(cls), sampler); + } + } + } + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.NotImplementedError, ErrorMessages.COVERAGE_TRACKER_NOT_AVAILABLE); + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "Profiler", minNumOfPositionalArgs = 1, parameterNames = {"$self", "timer", "timeunit", "subcalls", "builtins"}) + @GenerateNodeFactory + abstract static class Init extends PythonBuiltinNode { + @Specialization + PNone doit(Profiler self, Object timer, double timeunit, long subcalls, long builtins) { + self.subcalls = subcalls > 0; + self.builtins = builtins > 0; + self.timeunit = timeunit; + self.externalTimer = timer; + return PNone.NONE; + } + + @Specialization + @SuppressWarnings("unused") + PNone doit(Profiler self, Object timer, PNone timeunit, PNone subcalls, PNone builtins) { + self.subcalls = true; + self.builtins = true; + self.timeunit = -1; + self.externalTimer = timer; + return PNone.NONE; + } + } + + @Builtin(name = "enable", minNumOfPositionalArgs = 1, parameterNames = {"$self", "subcalls", "builtins"}) + @GenerateNodeFactory + abstract static class Enable extends PythonBuiltinNode { + @Specialization + @TruffleBoundary + PNone doit(Profiler self, long subcalls, long builtins) { + self.subcalls = subcalls > 0; + self.builtins = builtins > 0; + // TODO: deal with any arguments + self.time = System.currentTimeMillis(); + self.sampler.setCollecting(true); + return PNone.NONE; + } + + @Specialization + PNone doit(Profiler self, long subcalls, @SuppressWarnings("unused") PNone builtins) { + return doit(self, subcalls, self.builtins ? 1 : 0); + } + + @Specialization + PNone doit(Profiler self, @SuppressWarnings("unused") PNone subcalls, long builtins) { + return doit(self, self.subcalls ? 1 : 0, builtins); + } + + @Specialization + PNone doit(Profiler self, @SuppressWarnings("unused") PNone subcalls, @SuppressWarnings("unused") PNone builtins) { + return doit(self, self.subcalls ? 1 : 0, self.builtins ? 1 : 0); + } + } + + @Builtin(name = "disable", minNumOfPositionalArgs = 1) + @GenerateNodeFactory + abstract static class Disable extends PythonBuiltinNode { + @Specialization + @TruffleBoundary + PNone doit(Profiler self) { + self.sampler.setCollecting(false); + self.time = (System.currentTimeMillis() - self.time) / 1000D; + return PNone.NONE; + } + } + + @Builtin(name = "clear", minNumOfPositionalArgs = 1) + @GenerateNodeFactory + abstract static class Clear extends PythonBuiltinNode { + @Specialization + @TruffleBoundary + PNone doit(Profiler self) { + self.sampler.clearData(); + return PNone.NONE; + } + } + + @Builtin(name = "getstats", minNumOfPositionalArgs = 1, doc = "" + + "getstats() -> list of profiler_entry objects\n" + + "\n" + + "Return all information collected by the profiler.\n" + + "Each profiler_entry is a tuple-like object with the\n" + + "following attributes:\n" + + "\n" + + " code code object or functionname\n" + + " callcount how many times this was called\n" + + " reccallcount how many times called recursively\n" + + " totaltime total time in this entry\n" + + " inlinetime inline time in this entry (not in subcalls)\n" + + " calls details of the calls\n" + + "\n" + + "The calls attribute is either None or a list of\n" + + "profiler_subentry objects:\n" + + "\n" + + " code called code object\n" + + " callcount how many times this is called\n" + + " reccallcount how many times this is called recursively\n" + + " totaltime total time spent in this call\n" + + " inlinetime inline time (not in further subcalls)\n") + @GenerateNodeFactory + abstract static class GetStats extends PythonBuiltinNode { + @Specialization + @TruffleBoundary + static PList doit(Profiler self) { + double avgSampleSeconds = self.sampler.getPeriod() / 1000D; + List entries = new ArrayList<>(); + for (CPUSamplerData data : self.sampler.getDataList()) { + Map>> threads = data.getThreadData(); + for (Thread thread : threads.keySet()) { + for (ProfilerNode node : threads.get(thread)) { + countNode(entries, node, avgSampleSeconds); + } + } + } + + self.sampler.close(); + return PFactory.createList(PythonLanguage.get(null), entries.toArray()); + } + + private static void countNode(List entries, ProfilerNode node, double avgSampleTime) { + PythonLanguage language = PythonLanguage.get(null); + Collection> children = node.getChildren(); + Object[] profilerEntry = getProfilerEntry(node, avgSampleTime); + Object[] calls = new Object[children.size()]; + int callIdx = 0; + for (ProfilerNode childNode : children) { + countNode(entries, childNode, avgSampleTime); + calls[callIdx++] = PFactory.createStructSeq(language, LsprofModuleBuiltins.PROFILER_SUBENTRY_DESC, getProfilerEntry(childNode, avgSampleTime)); + } + assert callIdx == calls.length; + profilerEntry = Arrays.copyOf(profilerEntry, 6); + profilerEntry[profilerEntry.length - 1] = PFactory.createList(language, calls); + entries.add(PFactory.createStructSeq(language, LsprofModuleBuiltins.PROFILER_ENTRY_DESC, profilerEntry)); + } + + private static Object[] getProfilerEntry(ProfilerNode node, double avgSampleTime) { + SourceSection sec = node.getSourceSection(); + String rootName; + if (sec == null) { + rootName = node.getRootName(); + } else { + rootName = sec.getSource().getName() + ":" + sec.getStartLine() + "(" + node.getRootName() + ")"; + } + if (rootName == null) { + rootName = ""; + } + int otherHitCount = node.getPayload().getHitCount(); + int selfHitCount = node.getPayload().getSelfHitCount(); + long hitCount = (long) otherHitCount + selfHitCount; + Object[] profilerEntry = new Object[]{ + toTruffleStringUncached(rootName), + hitCount, + 0, + otherHitCount * avgSampleTime, + selfHitCount * avgSampleTime + }; + return profilerEntry; + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lzma/LZMACompressorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lzma/LZMACompressorBuiltins.java index 295b43080d..997bb1d206 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lzma/LZMACompressorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lzma/LZMACompressorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -50,14 +50,17 @@ import static com.oracle.graal.python.nodes.ErrorMessages.INTEGRITY_CHECKS_ONLY_SUPPORTED_BY; import static com.oracle.graal.python.nodes.ErrorMessages.MUST_SPECIFY_FILTERS; import static com.oracle.graal.python.nodes.ErrorMessages.REPEATED_CALL_TO_FLUSH; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; import com.oracle.graal.python.annotations.ClinicConverterFactory; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -68,17 +71,19 @@ import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.bytes.PBytesLike; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentCastNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.CompilerDirectives.ValueType; import com.oracle.truffle.api.dsl.Bind; @@ -91,24 +96,39 @@ import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; @CoreFunctions(extendClasses = PythonBuiltinClassType.PLZMACompressor) public final class LZMACompressorBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = LZMACompressorBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return LZMACompressorBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, parameterNames = {"$self", "format", "check", "preset", "filters"}) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "LZMACompressor", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + abstract static class LZMACompressorNode extends PythonBuiltinNode { + + @Specialization + LZMAObject doNew(Object cls, @SuppressWarnings("unused") Object arg, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + // data filled in subsequent __init__ call - see LZMACompressorBuiltins.InitNode + PythonContext context = getContext(); + return PFactory.createLZMACompressor(context.getLanguage(this), cls, getInstanceShape.execute(cls), context.getNFILZMASupport().isAvailable()); + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "LZMACompressor", minNumOfPositionalArgs = 1, parameterNames = {"$self", "format", "check", "preset", "filters"}) @ArgumentClinic(name = "format", conversion = ClinicConversion.Int, defaultValue = "LZMAModuleBuiltins.FORMAT_XZ", useDefaultForNone = true) @ArgumentClinic(name = "check", conversion = ClinicConversion.Int, defaultValue = "-1", useDefaultForNone = true) @ArgumentClinic(name = "preset", conversionClass = ExpectUINT32Node.class, defaultValue = "PNone.NO_VALUE") @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) public abstract static class InitNode extends PythonClinicBuiltinNode { @Override @@ -134,26 +154,26 @@ static PNone init(VirtualFrame frame, LZMACompressor self, int format, int check @Specialization(guards = "badIntegrity(format, check)") @SuppressWarnings("unused") - static PNone integrityError(LZMACompressor self, long format, long check, Object preset, Object filters, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, INTEGRITY_CHECKS_ONLY_SUPPORTED_BY); + static PNone integrityError(LZMACompressor self, int format, int check, Object preset, Object filters, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, INTEGRITY_CHECKS_ONLY_SUPPORTED_BY); } @Specialization(guards = {"!badIntegrity(format, check)", "badPresetFilters(preset, filters)"}) @SuppressWarnings("unused") - static PNone presetError(LZMACompressor self, long format, long check, Object preset, Object filters, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, CANNOT_SPECIFY_PREST_AND_FILTER_CHAIN); + static PNone presetError(LZMACompressor self, int format, int check, Object preset, Object filters, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, CANNOT_SPECIFY_PREST_AND_FILTER_CHAIN); } @Specialization(guards = {"!badIntegrity(format, check)", "!badPresetFilters(preset, filters)", "badRawFilter(format, filters)"}) @SuppressWarnings("unused") - static PNone rawError(LZMACompressor self, long format, long check, Object preset, PNone filters, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, MUST_SPECIFY_FILTERS); + static PNone rawError(LZMACompressor self, int format, int check, Object preset, PNone filters, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, MUST_SPECIFY_FILTERS); } - protected static boolean badIntegrity(long format, long check) { + protected static boolean badIntegrity(int format, int check) { return format != FORMAT_XZ && check != -1 && check != CHECK_NONE; } @@ -165,31 +185,30 @@ protected static boolean badRawFilter(long format, Object filters) { return format == FORMAT_RAW && PGuards.isPNone(filters); } - protected static boolean isValid(long format, long check, Object preset, Object filters) { + protected static boolean isValid(int format, int check, Object preset, Object filters) { return !badIntegrity(format, check) && !badPresetFilters(preset, filters) && !badRawFilter(format, filters); } } @Builtin(name = "compress", minNumOfPositionalArgs = 2) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class CompressNode extends PythonBinaryBuiltinNode { @Specialization(guards = {"!self.isFlushed()"}) static PBytes doBytes(VirtualFrame frame, LZMACompressor self, Object data, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached GetArrayAndLengthHelperNode getArrayAndLengthHelperNode, - @Cached LZMANodes.CompressNode compress, - @Cached PythonObjectFactory factory) { + @Cached LZMANodes.CompressNode compress) { ArrayAndLength aal = getArrayAndLengthHelperNode.execute(frame, inliningTarget, data); - return factory.createBytes(compress.compress(inliningTarget, self, PythonContext.get(inliningTarget), aal.array, aal.length)); + return PFactory.createBytes(language, compress.compress(inliningTarget, self, PythonContext.get(inliningTarget), aal.array, aal.length)); } @SuppressWarnings("unused") @Specialization(guards = "self.isFlushed()") static PNone error(LZMACompressor self, Object data, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, COMPRESSOR_HAS_BEEN_FLUSHED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, COMPRESSOR_HAS_BEEN_FLUSHED); } @ValueType @@ -220,23 +239,22 @@ static ArrayAndLength doObject(VirtualFrame frame, Object data, @Builtin(name = "flush", minNumOfPositionalArgs = 1) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class FlushNode extends PythonUnaryBuiltinNode { @Specialization(guards = {"!self.isFlushed()"}) static PBytes doit(LZMACompressor self, @Bind("this") Node inliningTarget, - @Cached LZMANodes.CompressNode compress, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @Cached LZMANodes.CompressNode compress) { self.setFlushed(); - return factory.createBytes(compress.flush(inliningTarget, self, PythonContext.get(inliningTarget))); + return PFactory.createBytes(language, compress.flush(inliningTarget, self, PythonContext.get(inliningTarget))); } @SuppressWarnings("unused") @Specialization(guards = "self.isFlushed()") static PNone error(LZMACompressor self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, REPEATED_CALL_TO_FLUSH); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, REPEATED_CALL_TO_FLUSH); } } @@ -271,5 +289,4 @@ public static ExpectUINT32Node create(@ClinicConverterFactory.DefaultValue Objec return LZMACompressorBuiltinsFactory.ExpectUINT32NodeGen.create(defaultValue); } } - } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lzma/LZMADecompressorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lzma/LZMADecompressorBuiltins.java index c86554b75e..a031f68df2 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lzma/LZMADecompressorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lzma/LZMADecompressorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -52,11 +52,14 @@ import static com.oracle.graal.python.builtins.modules.lzma.LZMAModuleBuiltins.FORMAT_XZ; import static com.oracle.graal.python.builtins.modules.lzma.LZMAModuleBuiltins.T_LZMA_JAVA_ERROR; import static com.oracle.graal.python.nodes.ErrorMessages.ALREADY_AT_END_OF_STREAM; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -67,18 +70,21 @@ import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.bytes.PBytesLike; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; @@ -87,23 +93,38 @@ import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; @CoreFunctions(extendClasses = PythonBuiltinClassType.PLZMADecompressor) public final class LZMADecompressorBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = LZMADecompressorBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return LZMADecompressorBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "LZMADecompressor", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + abstract static class LZMADecompressorNode extends PythonBuiltinNode { + + @Specialization + LZMAObject doNew(Object cls, @SuppressWarnings("unused") Object arg, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + // data filled in subsequent __init__ call - see LZMADecompressorBuiltins.InitNode + PythonContext context = getContext(); + return PFactory.createLZMADecompressor(context.getLanguage(this), cls, getInstanceShape.execute(cls), context.getNFILZMASupport().isAvailable()); + } + } + @ImportStatic(PGuards.class) - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, parameterNames = {"$self", "format", "memlimit", "filters"}) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "LZMADecompressor", minNumOfPositionalArgs = 1, parameterNames = {"$self", "format", "memlimit", "filters"}) @ArgumentClinic(name = "format", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "LZMAModuleBuiltins.FORMAT_AUTO", useDefaultForNone = true) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) public abstract static class InitNode extends PythonQuaternaryClinicBuiltinNode { @Override @@ -116,12 +137,12 @@ static PNone notRaw(VirtualFrame frame, LZMADecompressor self, int format, Objec @Bind("this") Node inliningTarget, @Cached CastToJavaIntExactNode cast, @Shared("d") @Cached LZMANodes.LZMADecompressInit decompressInit, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int memlimit; try { memlimit = cast.execute(inliningTarget, memlimitObj); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.INTEGER_REQUIRED); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.INTEGER_REQUIRED); } return doNotRaw(frame, self, format, memlimit, decompressInit); @@ -154,29 +175,29 @@ static PNone raw(VirtualFrame frame, LZMADecompressor self, int format, PNone me @SuppressWarnings("unused") @Specialization(guards = {"isRaw(format)", "!isPNone(memlimit)"}) static PNone rawError(LZMADecompressor self, int format, Object memlimit, Object filters, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.CANNOT_SPECIFY_MEM_LIMIT); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.CANNOT_SPECIFY_MEM_LIMIT); } @SuppressWarnings("unused") @Specialization(guards = "isRaw(format)") static PNone rawFilterError(LZMADecompressor self, int format, Object memlimit, PNone filters, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.MUST_SPECIFY_FILTERS); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.MUST_SPECIFY_FILTERS); } @SuppressWarnings("unused") @Specialization(guards = {"!isRaw(format)", "!isPNone(filters)"}) static PNone rawFilterError(LZMADecompressor self, int format, Object memlimit, Object filters, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.CANNOT_SPECIFY_FILTERS); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.CANNOT_SPECIFY_FILTERS); } @SuppressWarnings("unused") @Specialization(guards = "!validFormat(format)") static PNone invalidFormat(LZMADecompressor self, int format, Object memlimit, Object filters, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.INVALID_CONTAINER_FORMAT, format); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.INVALID_CONTAINER_FORMAT, format); } protected static boolean validFormat(int format) { @@ -194,7 +215,6 @@ protected static boolean isRaw(int format) { @Builtin(name = "decompress", minNumOfPositionalArgs = 2, parameterNames = {"$self", "$data", "max_length"}, needsFrame = true) @ArgumentClinic(name = "max_length", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "-1", useDefaultForNone = true) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class DecompressNode extends PythonTernaryClinicBuiltinNode { @Override @@ -205,37 +225,36 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(guards = {"!self.isEOF()"}) static PBytes doBytes(LZMADecompressor self, PBytesLike data, int maxLength, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached SequenceStorageNodes.GetInternalByteArrayNode toBytes, - @Exclusive @Cached LZMANodes.DecompressNode decompress, - @Shared @Cached PythonObjectFactory factory) { + @Exclusive @Cached LZMANodes.DecompressNode decompress) { byte[] bytes = toBytes.execute(inliningTarget, data.getSequenceStorage()); int len = data.getSequenceStorage().length(); - return factory.createBytes(decompress.execute(inliningTarget, self, bytes, len, maxLength)); + return PFactory.createBytes(language, decompress.execute(inliningTarget, self, bytes, len, maxLength)); } @Specialization(guards = {"!self.isEOF()"}) static PBytes doObject(VirtualFrame frame, LZMADecompressor self, Object data, int maxLength, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached BytesNodes.ToBytesNode toBytes, - @Exclusive @Cached LZMANodes.DecompressNode decompress, - @Shared @Cached PythonObjectFactory factory) { + @Exclusive @Cached LZMANodes.DecompressNode decompress) { byte[] bytes = toBytes.execute(frame, data); int len = bytes.length; - return factory.createBytes(decompress.execute(inliningTarget, self, bytes, len, maxLength)); + return PFactory.createBytes(language, decompress.execute(inliningTarget, self, bytes, len, maxLength)); } @SuppressWarnings("unused") @Specialization(guards = {"self.isEOF()"}) static Object err(LZMADecompressor self, Object data, int maxLength, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(EOFError, ALREADY_AT_END_OF_STREAM); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, EOFError, ALREADY_AT_END_OF_STREAM); } } @Builtin(name = "eof", minNumOfPositionalArgs = 1, parameterNames = {"self"}, isGetter = true) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class EofNode extends PythonUnaryBuiltinNode { @Specialization @@ -247,7 +266,6 @@ boolean doEof(LZMADecompressor self) { @Builtin(name = "needs_input", minNumOfPositionalArgs = 1, parameterNames = {"self"}, isGetter = true) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class NeedsInputNode extends PythonUnaryBuiltinNode { @Specialization @@ -259,7 +277,6 @@ boolean doNeedsInput(LZMADecompressor self) { @Builtin(name = "check", minNumOfPositionalArgs = 1, parameterNames = {"self"}, isGetter = true) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class CheckNode extends PythonUnaryBuiltinNode { @Specialization @@ -269,23 +286,21 @@ int doCheck(LZMADecompressor.Native self) { @Specialization static int doCheck(@SuppressWarnings("unused") LZMADecompressor.Java self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(SystemError, T_LZMA_JAVA_ERROR); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, T_LZMA_JAVA_ERROR); } } @Builtin(name = "unused_data", minNumOfPositionalArgs = 1, parameterNames = {"self"}, isGetter = true) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class UnusedDataNode extends PythonUnaryBuiltinNode { @Specialization static PBytes doUnusedData(LZMADecompressor self, - @Cached PythonObjectFactory factory) { - return factory.createBytes(self.getUnusedData()); + @Bind PythonLanguage language) { + return PFactory.createBytes(language, self.getUnusedData()); } } - } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lzma/LZMAModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lzma/LZMAModuleBuiltins.java index 045ee97e5d..d6d7208547 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lzma/LZMAModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lzma/LZMAModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,8 +40,6 @@ */ package com.oracle.graal.python.builtins.modules.lzma; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PLZMACompressor; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.PLZMADecompressor; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError; import static com.oracle.graal.python.runtime.NFILZMASupport.CHECK_CRC32_INDEX; import static com.oracle.graal.python.runtime.NFILZMASupport.CHECK_CRC64_INDEX; @@ -80,6 +78,7 @@ import org.graalvm.shadowed.org.tukaani.xz.XZ; import org.graalvm.shadowed.org.tukaani.xz.XZOutputStream; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -90,21 +89,18 @@ import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; import com.oracle.graal.python.nodes.util.CastToJavaLongLossyNode; import com.oracle.graal.python.runtime.NFILZMASupport; import com.oracle.graal.python.runtime.NativeLibrary; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @@ -260,35 +256,8 @@ public void postInitialize(Python3Core c) { lzmaModule.setAttribute(tsLiteral("MF_HC4"), MF_HC4); } - @Builtin(name = "LZMACompressor", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PLZMACompressor) - @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) - abstract static class LZMACompressorNode extends PythonBuiltinNode { - - @Specialization - LZMAObject doNew(Object cls, @SuppressWarnings("unused") Object arg, - @Cached PythonObjectFactory factory) { - // data filled in subsequent __init__ call - see LZMACompressorBuiltins.InitNode - return factory.createLZMACompressor(cls, getContext().getNFILZMASupport().isAvailable()); - } - } - - @Builtin(name = "LZMADecompressor", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, constructsClass = PLZMADecompressor) - @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) - abstract static class LZMADecompressorNode extends PythonBuiltinNode { - - @Specialization - LZMAObject doNew(Object cls, @SuppressWarnings("unused") Object arg, - @Cached PythonObjectFactory factory) { - // data filled in subsequent __init__ call - see LZMADecompressorBuiltins.InitNode - return factory.createLZMADecompressor(cls, getContext().getNFILZMASupport().isAvailable()); - } - } - @Builtin(name = "is_check_supported", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 1) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class IsCheckSupportedNode extends PythonUnaryBuiltinNode { @Specialization @@ -302,31 +271,29 @@ static boolean doInt(VirtualFrame frame, Object checkID, @Builtin(name = "_encode_filter_properties", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 1) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class EncodeFilterPropertiesNode extends PythonUnaryBuiltinNode { @Specialization static PBytes encode(VirtualFrame frame, Object filter, @Cached LZMANodes.EncodeFilterProperties encodeFilterProperties, - @Cached PythonObjectFactory factory) { - return factory.createBytes(encodeFilterProperties.execute(frame, filter)); + @Bind PythonLanguage language) { + return PFactory.createBytes(language, encodeFilterProperties.execute(frame, filter)); } } @Builtin(name = "_decode_filter_properties", minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 2) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class DecodeFilterPropertiesNode extends PythonBinaryBuiltinNode { @Specialization static PDict encode(VirtualFrame frame, Object id, Object encodedProps, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached CastToJavaLongLossyNode toLong, @Cached BytesNodes.ToBytesNode toBytes, - @Cached LZMANodes.DecodeFilterProperties decodeFilterProperties, - @Cached PythonObjectFactory factory) { + @Cached LZMANodes.DecodeFilterProperties decodeFilterProperties) { byte[] bytes = toBytes.execute(frame, encodedProps); - PDict dict = factory.createDict(); + PDict dict = PFactory.createDict(language); decodeFilterProperties.execute(frame, toLong.execute(inliningTarget, id), bytes, dict); return dict; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lzma/LZMANodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lzma/LZMANodes.java index 24970bd4c2..3519e4e58e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lzma/LZMANodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/lzma/LZMANodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -204,12 +204,12 @@ long l(long l) { @Specialization long ll(long l, @Bind("this") Node inliningTarget, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (l < 0) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.CANT_CONVERT_NEG_INT_TO_UNSIGNED); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.CANT_CONVERT_NEG_INT_TO_UNSIGNED); } if (l > MAX_UINT32 && with32BitLimit) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.VALUE_TOO_LARGE_FOR_UINT32); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.VALUE_TOO_LARGE_FOR_UINT32); } return l; } @@ -219,11 +219,11 @@ long ll(long l, long o(Object o, @Bind("this") Node inliningTarget, @Cached CastToJavaLongExactNode cast, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { try { return ll(cast.execute(inliningTarget, o), inliningTarget, raiseNode); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, INTEGER_REQUIRED); + throw raiseNode.raise(inliningTarget, TypeError, INTEGER_REQUIRED); } } @@ -247,10 +247,10 @@ public abstract static class GetOptionsDict extends Node { static HashingStorage fast(VirtualFrame frame, PDict dict, @Bind("this") Node inliningTarget, @Shared("getItem") @Cached HashingStorageGetItem getItem, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { HashingStorage storage = dict.getDictStorage(); if (!getItem.hasKey(frame, inliningTarget, storage, T_ID)) { - throw raiseNode.get(inliningTarget).raise(ValueError, FILTER_SPECIFIER_MUST_HAVE); + throw raiseNode.raise(inliningTarget, ValueError, FILTER_SPECIFIER_MUST_HAVE); } return storage; } @@ -260,10 +260,10 @@ static HashingStorage slow(VirtualFrame frame, Object object, @Bind("this") Node inliningTarget, @Shared("getItem") @Cached HashingStorageGetItem getItem, @Cached GetDictIfExistsNode getDict, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { PDict dict = getDict.execute(object); if (dict == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, FILTER_SPEC_MUST_BE_DICT); + throw raiseNode.raise(inliningTarget, TypeError, FILTER_SPEC_MUST_BE_DICT); } return fast(frame, dict, inliningTarget, getItem, raiseNode); } @@ -292,23 +292,23 @@ static OptionsState doit(Frame frame, Node inliningTarget, HashingStorage storag @Cached CastToJavaLongLossyNode toLong, @Cached InlinedConditionProfile errProfile, @Cached HashingStorageGetItem getItem, - @Cached PRaiseNode.Lazy raise, + @Cached PRaiseNode raise, @Cached(inline = false) TruffleString.EqualNode equalNode) { Object key = itKey.execute(inliningTarget, storage, it); TruffleString skey = strNode.execute(frame, inliningTarget, key); int idx = getOptionIndex(skey, s, equalNode); if (errProfile.profile(inliningTarget, idx == -1)) { - throw raise.get(inliningTarget).raise(ValueError, ErrorMessages.INVALID_FILTER_SPECIFIED_FOR_FILTER, s.filterType); + throw raise.raise(inliningTarget, ValueError, ErrorMessages.INVALID_FILTER_SPECIFIED_FOR_FILTER, s.filterType); } long l = toLong.execute(inliningTarget, getItem.execute(inliningTarget, s.dictStorage, skey)); if (errProfile.profile(inliningTarget, l < 0)) { - throw raise.get(inliningTarget).raise(OverflowError, ErrorMessages.CANT_CONVERT_NEG_INT_TO_UNSIGNED); + throw raise.raise(inliningTarget, OverflowError, ErrorMessages.CANT_CONVERT_NEG_INT_TO_UNSIGNED); } if (errProfile.profile(inliningTarget, l > MAX_UINT32 && idx > 0) /* * filters are special * case */) { - throw raise.get(inliningTarget).raise(OverflowError, ErrorMessages.VALUE_TOO_LARGE_FOR_UINT32); + throw raise.raise(inliningTarget, OverflowError, ErrorMessages.VALUE_TOO_LARGE_FOR_UINT32); } s.options[idx] = l; return s; @@ -421,7 +421,7 @@ static long[] converter(VirtualFrame frame, Object spec, @Cached GetOptionsDict getOptionsDict, @Cached HashingStorageGetItem getItem, @Cached HashingStorageForEach forEachNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { HashingStorage dict = getOptionsDict.execute(frame, spec); Object idObj = getItem.execute(inliningTarget, dict, T_ID); long id = toLong.execute(inliningTarget, idObj); @@ -451,7 +451,7 @@ static long[] converter(VirtualFrame frame, Object spec, state = new OptionsState("BCJ", BCJOption.values(), options, dict); break; default: - throw raiseNode.get(inliningTarget).raise(ValueError, INVALID_FILTER, id); + throw raiseNode.raise(inliningTarget, ValueError, INVALID_FILTER, id); } options[0] = id; forEachNode.execute(frame, inliningTarget, dict, getOptions, state); @@ -472,11 +472,11 @@ long[][] parseFilter(VirtualFrame frame, Object filterSpecs, @Cached LZMAFilterConverter converter, @Cached SequenceNodes.CheckIsSequenceNode checkIsSequenceNode, @Cached PyObjectSizeNode sizeNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { checkIsSequenceNode.execute(inliningTarget, filterSpecs); int numFilters = sizeNode.execute(frame, inliningTarget, filterSpecs); if (numFilters > LZMA_FILTERS_MAX) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.TOO_MAMNY_FILTERS_LZMA_SUPPORTS_MAX_S, LZMA_FILTERS_MAX); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.TOO_MAMNY_FILTERS_LZMA_SUPPORTS_MAX_S, LZMA_FILTERS_MAX); } long[][] filters = new long[numFilters][0]; for (int i = 0; i < numFilters; i++) { @@ -498,7 +498,7 @@ static void parseFilterChainSpec(VirtualFrame frame, Object lzmast, PythonContex @Cached NativeLibrary.InvokeNativeFunction setFilterSpecDelta, @Cached NativeLibrary.InvokeNativeFunction setFilterSpecBCJ, @Cached LZMAParseFilterChain parseFilterChain, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { long[][] filters = parseFilterChain.execute(frame, filterSpecs); for (int i = 0; i < filters.length; i++) { setFilterOptions(inliningTarget, lzmast, filters[i], i, context, setFilterSpecLZMA, setFilterSpecDelta, setFilterSpecBCJ, raiseNode); @@ -509,7 +509,7 @@ private static void setFilterOptions(Node inliningTarget, Object lzmast, long[] NativeLibrary.InvokeNativeFunction setFilterSpecLZMA, NativeLibrary.InvokeNativeFunction setFilterSpecDelta, NativeLibrary.InvokeNativeFunction setFilterSpecBCJ, - PRaiseNode.Lazy raiseNode) { + PRaiseNode raiseNode) { NFILZMASupport lzmaSupport = context.getNFILZMASupport(); Object opts = context.getEnv().asGuestValue(filter); int err; @@ -521,7 +521,7 @@ private static void setFilterOptions(Node inliningTarget, Object lzmast, long[] err = lzmaSupport.setFilterSpecLZMA(lzmast, fidx, opts, setFilterSpecLZMA); if (err != LZMA_OK) { if (err == LZMA_PRESET_ERROR) { - throw raiseNode.get(inliningTarget).raise(LZMAError, INVALID_COMPRESSION_PRESET, filter[LZMAOption.preset.ordinal()]); + throw raiseNode.raise(inliningTarget, LZMAError, INVALID_COMPRESSION_PRESET, filter[LZMAOption.preset.ordinal()]); } errorHandling(inliningTarget, err, raiseNode); } @@ -546,7 +546,7 @@ private static void setFilterOptions(Node inliningTarget, Object lzmast, long[] } return; } - throw raiseNode.get(inliningTarget).raise(ValueError, INVALID_FILTER, id); + throw raiseNode.raise(inliningTarget, ValueError, INVALID_FILTER, id); } } @@ -559,14 +559,14 @@ protected abstract static class JavaFilterChain extends Node { @Specialization static FilterOptions[] parseFilterChainSpec(VirtualFrame frame, Node inliningTarget, Object filterSpecs, @Cached(inline = false) LZMAParseFilterChain parseFilterChain, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { long[][] filters = parseFilterChain.execute(frame, filterSpecs); FilterOptions[] optionsChain = new FilterOptions[filters.length]; for (int i = 0; i < filters.length; i++) { try { optionsChain[i] = getFilterOptions(filters[i], inliningTarget); } catch (UnsupportedOptionsException e) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.M, e); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.M, e); } } @@ -592,7 +592,7 @@ private static FilterOptions getFilterOptions(long[] longFilter, Node raisingNod try { lzma2Options = new LZMA2Options(filter[1]); } catch (UnsupportedOptionsException e) { - throw PRaiseNode.raiseUncached(raisingNode, LZMAError, INVALID_COMPRESSION_PRESET, filter[LZMAOption.preset.ordinal()]); + throw PRaiseNode.raiseStatic(raisingNode, LZMAError, INVALID_COMPRESSION_PRESET, filter[LZMAOption.preset.ordinal()]); } for (int j = 2; j < filter.length; j++) { setLZMAOption(lzma2Options, j, filter[j]); @@ -643,7 +643,7 @@ private static FilterOptions getFilterOptions(long[] longFilter, Node raisingNod } return sparcOptions; } - throw PRaiseNode.raiseUncached(raisingNode, ValueError, INVALID_FILTER, longFilter[0]); + throw PRaiseNode.raiseStatic(raisingNode, ValueError, INVALID_FILTER, longFilter[0]); } @TruffleBoundary @@ -680,7 +680,7 @@ private static void setLZMAOption(LZMA2Options lzma2Options, int idx, int value) } } - @ImportStatic(LZMAModuleBuiltins.class) + @ImportStatic({LZMAModuleBuiltins.class, PGuards.class}) @SuppressWarnings("truffle-inlining") // footprint reduction 60 -> 42 public abstract static class LZMACompressInit extends Node { @@ -692,7 +692,7 @@ static void xz(LZMACompressor.Native self, @SuppressWarnings("unused") int forma @Shared("cs") @Cached NativeLibrary.InvokeNativeFunction createStream, @Exclusive @Cached NativeLibrary.InvokeNativeFunction lzmaEasyEncoder, @Shared @Cached InlinedConditionProfile errProfile, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { NFILZMASupport lzmaSupport = PythonContext.get(inliningTarget).getNFILZMASupport(); Object lzmast = lzmaSupport.createStream(createStream); self.init(lzmast, lzmaSupport); @@ -702,14 +702,14 @@ static void xz(LZMACompressor.Native self, @SuppressWarnings("unused") int forma } } - @Specialization(guards = "format == FORMAT_XZ") + @Specialization(guards = {"format == FORMAT_XZ", "!isPNone(filters)"}) static void xz(VirtualFrame frame, LZMACompressor.Native self, @SuppressWarnings("unused") int format, @SuppressWarnings("unused") long preset, Object filters, @Bind("this") Node inliningTarget, @Shared("cs") @Cached NativeLibrary.InvokeNativeFunction createStream, @Exclusive @Cached NativeLibrary.InvokeNativeFunction lzmaStreamEncoder, @Exclusive @Cached NativeFilterChain filterChain, @Shared @Cached InlinedConditionProfile errProfile, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { PythonContext ctxt = PythonContext.get(inliningTarget); NFILZMASupport lzmaSupport = ctxt.getNFILZMASupport(); Object lzmast = lzmaSupport.createStream(createStream); @@ -728,7 +728,7 @@ static void alone(LZMACompressor.Native self, int format, long preset, PNone fil @Shared("cs") @Cached NativeLibrary.InvokeNativeFunction createStream, @Exclusive @Cached NativeLibrary.InvokeNativeFunction lzmaAloneEncoderPreset, @Shared @Cached InlinedConditionProfile errProfile, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { NFILZMASupport lzmaSupport = PythonContext.get(inliningTarget).getNFILZMASupport(); Object lzmast = lzmaSupport.createStream(createStream); self.init(lzmast, lzmaSupport); @@ -739,14 +739,14 @@ static void alone(LZMACompressor.Native self, int format, long preset, PNone fil } @SuppressWarnings("unused") - @Specialization(guards = "format == FORMAT_ALONE") + @Specialization(guards = {"format == FORMAT_ALONE", "!isPNone(filters)"}) static void alone(VirtualFrame frame, LZMACompressor.Native self, int format, long preset, Object filters, @Bind("this") Node inliningTarget, @Shared("cs") @Cached NativeLibrary.InvokeNativeFunction createStream, @Exclusive @Cached NativeLibrary.InvokeNativeFunction lzmaAloneEncoder, @Exclusive @Cached NativeFilterChain filterChain, @Shared @Cached InlinedConditionProfile errProfile, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { PythonContext ctxt = PythonContext.get(inliningTarget); NFILZMASupport lzmaSupport = ctxt.getNFILZMASupport(); Object lzmast = lzmaSupport.createStream(createStream); @@ -766,7 +766,7 @@ static void raw(VirtualFrame frame, LZMACompressor.Native self, int format, long @Exclusive @Cached NativeLibrary.InvokeNativeFunction lzmaRawEncoder, @Exclusive @Cached NativeFilterChain filterChain, @Shared @Cached InlinedConditionProfile errProfile, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { PythonContext ctxt = PythonContext.get(inliningTarget); NFILZMASupport lzmaSupport = ctxt.getNFILZMASupport(); Object lzmast = lzmaSupport.createStream(createStream); @@ -781,23 +781,23 @@ static void raw(VirtualFrame frame, LZMACompressor.Native self, int format, long @Specialization(guards = "format == FORMAT_XZ") static void xz(LZMACompressor.Java self, @SuppressWarnings("unused") int format, long preset, @SuppressWarnings("unused") PNone filters, @Bind("this") Node inliningTarget, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { try { self.lzmaEasyEncoder(parseLZMAOptions(preset)); } catch (IOException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.ValueError, ErrorMessages.M, e); + throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ErrorMessages.M, e); } } - @Specialization(guards = "format == FORMAT_XZ") + @Specialization(guards = {"format == FORMAT_XZ", "!isPNone(filters)"}) static void xz(VirtualFrame frame, LZMACompressor.Java self, @SuppressWarnings("unused") int format, @SuppressWarnings("unused") long preset, Object filters, @Bind("this") Node inliningTarget, @Shared @Cached JavaFilterChain filterChain, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { try { self.lzmaStreamEncoder(filterChain.execute(frame, inliningTarget, filters)); } catch (IOException e) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.M, e); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.M, e); } } @@ -805,28 +805,28 @@ static void xz(VirtualFrame frame, LZMACompressor.Java self, @SuppressWarnings(" @Specialization(guards = "format == FORMAT_ALONE") static void alone(LZMACompressor.Java self, int format, long preset, PNone filters, @Bind("this") Node inliningTarget, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { try { self.lzmaAloneEncoder(parseLZMAOptions(preset)); } catch (IOException e) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.M, e); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.M, e); } } @SuppressWarnings("unused") - @Specialization(guards = "format == FORMAT_ALONE") + @Specialization(guards = {"format == FORMAT_ALONE", "!isPNone(filters)"}) static void alone(VirtualFrame frame, LZMACompressor.Java self, int format, long preset, Object filters, @Bind("this") Node inliningTarget, @Shared @Cached JavaFilterChain filterChain, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { FilterOptions[] optionsChain = filterChain.execute(frame, inliningTarget, filters); if (optionsChain.length != 1 && !(optionsChain[0] instanceof LZMA2Options)) { - throw raiseNode.get(inliningTarget).raise(ValueError, INVALID_FILTER_CHAIN_FOR_FORMAT); + throw raiseNode.raise(inliningTarget, ValueError, INVALID_FILTER_CHAIN_FOR_FORMAT); } try { self.lzmaAloneEncoder((LZMA2Options) optionsChain[0]); } catch (IOException e) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.M, e); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.M, e); } } @@ -835,24 +835,23 @@ static void alone(VirtualFrame frame, LZMACompressor.Java self, int format, long static void raw(VirtualFrame frame, LZMACompressor.Java self, int format, long preset, Object filters, @Bind("this") Node inliningTarget, @Shared @Cached JavaFilterChain filterChain, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { FilterOptions[] optionsChain = filterChain.execute(frame, inliningTarget, filters); if (optionsChain.length != 1 && !(optionsChain[0] instanceof LZMA2Options)) { - throw raiseNode.get(inliningTarget).raise(ValueError, INVALID_FILTER_CHAIN_FOR_FORMAT); + throw raiseNode.raise(inliningTarget, ValueError, INVALID_FILTER_CHAIN_FOR_FORMAT); } try { self.lzmaRawEncoder(optionsChain); } catch (IOException e) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.M, e); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.M, e); } } @Fallback @SuppressWarnings("unused") static void error(VirtualFrame frame, LZMACompressor self, int format, long preset, Object filters, - @Bind("this") Node inliningTarget, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - throw raiseNode.get(inliningTarget).raise(ValueError, INVALID_CONTAINER_FORMAT, format); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, INVALID_CONTAINER_FORMAT, format); } } @@ -876,7 +875,7 @@ static byte[] nativeCompress(Node inliningTarget, LZMACompressor.Native self, Py @Cached(inline = false) NativeLibrary.InvokeNativeFunction compress, @Cached GetOutputNativeBufferNode getBuffer, @Cached InlinedConditionProfile errProfile, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { NFILZMASupport lzmaSupport = context.getNFILZMASupport(); Object inGuest = context.getEnv().asGuestValue(bytes); int err = lzmaSupport.compress(self.getLzs(), inGuest, len, action, INITIAL_BUFFER_SIZE, compress); @@ -889,26 +888,26 @@ static byte[] nativeCompress(Node inliningTarget, LZMACompressor.Native self, Py @SuppressWarnings("unused") @Specialization(guards = "action == LZMA_RUN") static byte[] javaCompress(Node inliningTarget, LZMACompressor.Java self, PythonContext context, byte[] bytes, int len, int action, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { try { self.write(bytes, 0, len); byte[] result = self.getByteArray(); self.resetBuffer(); return result; } catch (IOException e) { - throw raiseNode.get(inliningTarget).raise(LZMAError, ErrorMessages.M, e); + throw raiseNode.raise(inliningTarget, LZMAError, ErrorMessages.M, e); } } @SuppressWarnings("unused") @Specialization(guards = "action == LZMA_FINISH") static byte[] javaFlush(Node inliningTarget, LZMACompressor.Java self, PythonContext context, byte[] bytes, int len, int action, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { try { self.finish(); return self.getByteArray(); } catch (IOException e) { - throw raiseNode.get(inliningTarget).raise(LZMAError, ErrorMessages.M, e); + throw raiseNode.raise(inliningTarget, LZMAError, ErrorMessages.M, e); } } } @@ -930,7 +929,7 @@ static void auto(LZMADecompressor.Native self, @SuppressWarnings("unused") int f @Shared("cs") @Cached NativeLibrary.InvokeNativeFunction createStream, @Exclusive @Cached NativeLibrary.InvokeNativeFunction lzmaAutoDecoder, @Shared @Cached InlinedConditionProfile errProfile, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { NFILZMASupport lzmaSupport = PythonContext.get(inliningTarget).getNFILZMASupport(); Object lzmast = lzmaSupport.createStream(createStream); self.init(lzmast, lzmaSupport); @@ -947,7 +946,7 @@ static void xz(LZMADecompressor.Native self, @SuppressWarnings("unused") int for @Shared("cs") @Cached NativeLibrary.InvokeNativeFunction createStream, @Exclusive @Cached NativeLibrary.InvokeNativeFunction lzmaStreamDecoder, @Shared @Cached InlinedConditionProfile errProfile, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { NFILZMASupport lzmaSupport = PythonContext.get(inliningTarget).getNFILZMASupport(); Object lzmast = lzmaSupport.createStream(createStream); self.init(lzmast, lzmaSupport); @@ -964,7 +963,7 @@ static void alone(LZMADecompressor.Native self, @SuppressWarnings("unused") int @Shared("cs") @Cached NativeLibrary.InvokeNativeFunction createStream, @Exclusive @Cached NativeLibrary.InvokeNativeFunction lzmaAloneDecoder, @Shared @Cached InlinedConditionProfile errProfile, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { NFILZMASupport lzmaSupport = PythonContext.get(inliningTarget).getNFILZMASupport(); Object lzmast = lzmaSupport.createStream(createStream); self.init(lzmast, lzmaSupport); @@ -985,8 +984,8 @@ public abstract static class LZMARawDecompressInit extends Node { @SuppressWarnings("unused") @Specialization static void rawJava(VirtualFrame frame, LZMADecompressor.Java self, Object filters, - @Cached(inline = false) PRaiseNode raiseNode) { - throw raiseNode.raise(SystemError, T_LZMA_JAVA_ERROR); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, T_LZMA_JAVA_ERROR); } @Specialization @@ -995,7 +994,7 @@ static void rawNative(VirtualFrame frame, Node inliningTarget, LZMADecompressor. @Cached(inline = false) NativeLibrary.InvokeNativeFunction lzmaRawDecoder, @Cached(inline = false) NativeFilterChain filterChain, @Cached InlinedConditionProfile errProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { PythonContext context = PythonContext.get(inliningTarget); NFILZMASupport lzmaSupport = context.getNFILZMASupport(); Object lzmast = lzmaSupport.createStream(createStream); @@ -1116,7 +1115,7 @@ static byte[] nativeInternalDecompress(Node inliningTarget, LZMADecompressor.Nat @Cached(inline = false) NativeLibrary.InvokeNativeFunction getNextInIndex, @Cached(inline = false) NativeLibrary.InvokeNativeFunction getLzsCheck, @Cached GetOutputNativeBufferNode getBuffer, - @Exclusive @Cached PRaiseNode.Lazy lazyRaiseNode, + @Exclusive @Cached PRaiseNode lazyRaiseNode, @Cached InlinedConditionProfile errProfile) { PythonContext context = PythonContext.get(inliningTarget); NFILZMASupport lzmaSupport = context.getNFILZMASupport(); @@ -1132,7 +1131,7 @@ static byte[] nativeInternalDecompress(Node inliningTarget, LZMADecompressor.Nat self.setLzsAvailIn(lzsAvailIn); self.setLzsAvailOut(lzsAvailOut); } catch (OverflowException of) { - throw lazyRaiseNode.get(inliningTarget).raise(SystemError, VALUE_TOO_LARGE_TO_FIT_INTO_INDEX); + throw lazyRaiseNode.raise(inliningTarget, SystemError, VALUE_TOO_LARGE_TO_FIT_INTO_INDEX); } if (err == LZMA_STREAM_END) { self.setEOF(); @@ -1145,7 +1144,7 @@ static byte[] nativeInternalDecompress(Node inliningTarget, LZMADecompressor.Nat @TruffleBoundary @Specialization static byte[] javaInternalDecompress(Node inliningTarget, LZMADecompressor.Java self, int maxLength, - @Exclusive @Cached PRaiseNode.Lazy lazyRaiseNode) { + @Exclusive @Cached PRaiseNode lazyRaiseNode) { if (maxLength == 0) { return PythonUtils.EMPTY_BYTE_ARRAY; } @@ -1191,7 +1190,7 @@ static byte[] javaInternalDecompress(Node inliningTarget, LZMADecompressor.Java } catch (EOFException eof) { self.setEOF(); } catch (IOException e) { - PRaiseNode.raiseUncached(inliningTarget, OSError, e); + PRaiseNode.raiseStatic(inliningTarget, OSError, e); } byte[] ret = toByteArray(baos); self.decompressedData(ret.length); @@ -1231,13 +1230,13 @@ public abstract static class GetOutputNativeBufferNode extends Node { static byte[] getBuffer(Node inliningTarget, Object lzmast, PythonContext context, @Cached(inline = false) NativeLibrary.InvokeNativeFunction getBufferSize, @Cached(inline = false) NativeLibrary.InvokeNativeFunction getBuffer, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { NFILZMASupport lzmaSupport = context.getNFILZMASupport(); int size; try { size = PInt.intValueExact(lzmaSupport.getOutputBufferSize(lzmast, getBufferSize)); } catch (OverflowException of) { - throw raiseNode.get(inliningTarget).raise(SystemError, VALUE_TOO_LARGE_TO_FIT_INTO_INDEX); + throw raiseNode.raise(inliningTarget, SystemError, VALUE_TOO_LARGE_TO_FIT_INTO_INDEX); } if (size == 0) { return PythonUtils.EMPTY_BYTE_ARRAY; @@ -1298,7 +1297,7 @@ static byte[] encodeNative(VirtualFrame frame, Object filter, @Cached NativeLibrary.InvokeNativeFunction encodeFilter, @Cached NativeLibrary.InvokeNativeFunction deallocateStream, @Cached InlinedConditionProfile errProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { PythonContext ctxt = PythonContext.get(inliningTarget); NFILZMASupport lzmaSupport = ctxt.getNFILZMASupport(); Object lzmast = lzmaSupport.createStream(createStream); @@ -1307,7 +1306,7 @@ static byte[] encodeNative(VirtualFrame frame, Object filter, if (errProfile.profile(inliningTarget, lzret != LZMA_OK)) { lzmaSupport.deallocateStream(lzmast, deallocateStream); if (lzret == LZMA_PRESET_ERROR) { - throw raiseNode.get(inliningTarget).raise(LZMAError, INVALID_COMPRESSION_PRESET, opts[LZMAOption.preset.ordinal()]); + throw raiseNode.raise(inliningTarget, LZMAError, INVALID_COMPRESSION_PRESET, opts[LZMAOption.preset.ordinal()]); } errorHandling(inliningTarget, lzret, raiseNode); } @@ -1319,8 +1318,8 @@ static byte[] encodeNative(VirtualFrame frame, Object filter, @SuppressWarnings("unused") @Specialization(guards = "!useNativeContext()") static byte[] encodeJava(Object filter, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(SystemError, T_LZMA_JAVA_ERROR); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, T_LZMA_JAVA_ERROR); } } @@ -1340,7 +1339,7 @@ static void decodeNative(VirtualFrame frame, long id, byte[] encoded, PDict dict @Cached NativeLibrary.InvokeNativeFunction decodeFilter, @Cached HashingStorageSetItem setItem, @Cached InlinedConditionProfile errProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { PythonContext ctxt = PythonContext.get(inliningTarget); NFILZMASupport lzmaSupport = ctxt.getNFILZMASupport(); long[] opts = new long[MAX_OPTS_INDEX]; @@ -1350,7 +1349,7 @@ static void decodeNative(VirtualFrame frame, long id, byte[] encoded, PDict dict int lzret = lzmaSupport.decodeFilter(id, encodedProps, len, filter, decodeFilter); if (errProfile.profile(inliningTarget, lzret != LZMA_OK)) { if (lzret == LZMA_ID_ERROR) { - throw raiseNode.get(inliningTarget).raise(LZMAError, INVALID_FILTER, opts[LZMAOption.id.ordinal()]); + throw raiseNode.raise(inliningTarget, LZMAError, INVALID_FILTER, opts[LZMAOption.id.ordinal()]); } errorHandling(inliningTarget, lzret, raiseNode); } @@ -1360,8 +1359,8 @@ static void decodeNative(VirtualFrame frame, long id, byte[] encoded, PDict dict @SuppressWarnings("unused") @Specialization(guards = "!useNativeContext()") static void decodeJava(long id, byte[] encoded, PDict dict, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(SystemError, T_LZMA_JAVA_ERROR); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, T_LZMA_JAVA_ERROR); } static void buildFilterSpec(VirtualFrame frame, Node inliningTarget, long[] opts, PDict dict, HashingStorageSetItem setItem) { @@ -1435,7 +1434,7 @@ public int getAvailIn() { } } - protected static int errorHandling(Node inliningTarget, int lzret, PRaiseNode.Lazy raiseNode) { + protected static int errorHandling(Node inliningTarget, int lzret, PRaiseNode raiseNode) { switch (lzret) { case LZMA_OK: case LZMA_GET_CHECK: @@ -1443,23 +1442,23 @@ protected static int errorHandling(Node inliningTarget, int lzret, PRaiseNode.La case LZMA_STREAM_END: return 0; case LZMA_UNSUPPORTED_CHECK: - throw raiseNode.get(inliningTarget).raise(LZMAError, ErrorMessages.UNSUPPORTED_INTEGRITY_CHECK); + throw raiseNode.raise(inliningTarget, LZMAError, ErrorMessages.UNSUPPORTED_INTEGRITY_CHECK); case LZMA_MEM_ERROR: - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); case LZMA_MEMLIMIT_ERROR: - throw raiseNode.get(inliningTarget).raise(LZMAError, ErrorMessages.MEM_USAGE_LIMIT_EXCEEDED); + throw raiseNode.raise(inliningTarget, LZMAError, ErrorMessages.MEM_USAGE_LIMIT_EXCEEDED); case LZMA_FORMAT_ERROR: - throw raiseNode.get(inliningTarget).raise(LZMAError, ErrorMessages.INPUT_FMT_NOT_SUPPORTED_BY_DECODER); + throw raiseNode.raise(inliningTarget, LZMAError, ErrorMessages.INPUT_FMT_NOT_SUPPORTED_BY_DECODER); case LZMA_OPTIONS_ERROR: - throw raiseNode.get(inliningTarget).raise(LZMAError, ErrorMessages.INVALID_UNSUPPORTED_OPTIONS); + throw raiseNode.raise(inliningTarget, LZMAError, ErrorMessages.INVALID_UNSUPPORTED_OPTIONS); case LZMA_DATA_ERROR: - throw raiseNode.get(inliningTarget).raise(LZMAError, ErrorMessages.CORRUPT_INPUT_DATA); + throw raiseNode.raise(inliningTarget, LZMAError, ErrorMessages.CORRUPT_INPUT_DATA); case LZMA_BUF_ERROR: - throw raiseNode.get(inliningTarget).raise(LZMAError, ErrorMessages.INSUFFICIENT_BUFFER_SPACE); + throw raiseNode.raise(inliningTarget, LZMAError, ErrorMessages.INSUFFICIENT_BUFFER_SPACE); case LZMA_PROG_ERROR: - throw raiseNode.get(inliningTarget).raise(LZMAError, ErrorMessages.INTERNAL_ERROR); + throw raiseNode.raise(inliningTarget, LZMAError, ErrorMessages.INTERNAL_ERROR); default: - throw raiseNode.get(inliningTarget).raise(LZMAError, ErrorMessages.UNRECOGNIZED_ERROR_FROM_LIBLZMA, lzret); + throw raiseNode.raise(inliningTarget, LZMAError, ErrorMessages.UNRECOGNIZED_ERROR_FROM_LIBLZMA, lzret); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/GraalPySemLockBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/GraalPySemLockBuiltins.java index 45a533e723..e7ccfa245b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/GraalPySemLockBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/GraalPySemLockBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,13 +46,20 @@ import java.util.List; import java.util.concurrent.Semaphore; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.modules.multiprocessing.GraalPySemLockBuiltinsClinicProviders.SemLockNodeClinicProviderGen; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyFloatAsDoubleNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; @@ -66,7 +73,7 @@ import com.oracle.graal.python.runtime.GilNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonContext.SharedMultiprocessingData; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -80,6 +87,8 @@ @CoreFunctions(extendClasses = {PythonBuiltinClassType.PGraalPySemLock}) public final class GraalPySemLockBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = GraalPySemLockBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return GraalPySemLockBuiltinsFactory.getFactories(); @@ -91,6 +100,52 @@ public void initialize(Python3Core core) { super.initialize(core); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "SemLock", parameterNames = {"cls", "kind", "value", "maxvalue", "name", "unlink"}) + @ArgumentClinic(name = "kind", conversion = ArgumentClinic.ClinicConversion.Int) + @ArgumentClinic(name = "value", conversion = ArgumentClinic.ClinicConversion.Int) + @ArgumentClinic(name = "maxvalue", conversion = ArgumentClinic.ClinicConversion.Int) + @ArgumentClinic(name = "name", conversion = ArgumentClinic.ClinicConversion.TString) + @ArgumentClinic(name = "unlink", conversion = ArgumentClinic.ClinicConversion.IntToBoolean) + @GenerateNodeFactory + abstract static class SemLockNode extends PythonClinicBuiltinNode { + @Specialization + static PGraalPySemLock construct(Object cls, int kind, int value, @SuppressWarnings("unused") int maxValue, TruffleString name, boolean unlink, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Cached PRaiseNode raiseNode) { + if (kind != PGraalPySemLock.RECURSIVE_MUTEX && kind != PGraalPySemLock.SEMAPHORE) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.UNRECOGNIZED_KIND); + } + Semaphore semaphore = newSemaphore(value); + if (!unlink) { + // CPython creates a named semaphore, and if unlink != 0 unlinks + // it directly, so it cannot be accessed by other processes. We + // have to explicitly link it, so we do that here if we + // must. CPython always uses O_CREAT | O_EXCL for creating named + // semaphores, so a conflict raises. + SharedMultiprocessingData multiprocessing = PythonContext.get(inliningTarget).getSharedMultiprocessingData(); + if (multiprocessing.getNamedSemaphore(name) != null) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.FileExistsError, ErrorMessages.SEMAPHORE_NAME_TAKEN, name); + } else { + multiprocessing.putNamedSemaphore(name, semaphore); + } + } + return PFactory.createGraalPySemLock(language, cls, getInstanceShape.execute(cls), name, kind, semaphore); + } + + @TruffleBoundary + private static Semaphore newSemaphore(int value) { + return new Semaphore(value); + } + + @Override + protected ArgumentClinicProvider getArgumentClinic() { + return SemLockNodeClinicProviderGen.INSTANCE; + } + } + @Builtin(name = "_count", minNumOfPositionalArgs = 1) @GenerateNodeFactory abstract static class CountNode extends PythonUnaryBuiltinNode { @@ -240,7 +295,7 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static Object doEnter(@SuppressWarnings("unused") Object handle, int kind, @SuppressWarnings("unused") Object maxvalue, TruffleString name, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { SharedMultiprocessingData multiprocessing = PythonContext.get(inliningTarget).getSharedMultiprocessingData(); Semaphore semaphore = multiprocessing.getNamedSemaphore(name); if (semaphore == null) { @@ -248,7 +303,7 @@ static Object doEnter(@SuppressWarnings("unused") Object handle, int kind, @Supp // provided handle semaphore = newSemaphore(); } - return factory.createGraalPySemLock(PythonBuiltinClassType.PGraalPySemLock, name, kind, semaphore); + return PFactory.createGraalPySemLock(language, name, kind, semaphore); } @TruffleBoundary @@ -263,10 +318,10 @@ abstract static class ReleaseLockNode extends PythonUnaryBuiltinNode { @Specialization static Object doRelease(PGraalPySemLock self, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (self.getKind() == PGraalPySemLock.RECURSIVE_MUTEX) { if (!self.isMine()) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.AssertionError, ErrorMessages.ATTEMP_TO_RELEASE_RECURSIVE_LOCK); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.AssertionError, ErrorMessages.ATTEMP_TO_RELEASE_RECURSIVE_LOCK); } if (self.getCount() > 1) { self.decreaseCount(); @@ -288,5 +343,4 @@ static Object exit(PGraalPySemLock self, @SuppressWarnings("unused") Object type return PNone.NONE; } } - } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/MultiprocessingGraalPyModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/MultiprocessingGraalPyModuleBuiltins.java index 308f2b859b..87855c2936 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/MultiprocessingGraalPyModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/MultiprocessingGraalPyModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,11 +47,9 @@ import java.util.concurrent.Semaphore; import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins; import com.oracle.graal.python.builtins.objects.PNone; @@ -73,9 +71,7 @@ import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaDoubleNode; import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; @@ -85,7 +81,7 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary.Timeval; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonContext.SharedMultiprocessingData; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.PSequence; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.ArrayBuilder; @@ -118,54 +114,10 @@ protected List> getNodeFa @Override public void initialize(Python3Core core) { // TODO: add necessary entries to the dict - addBuiltinConstant("flags", core.factory().createDict()); + addBuiltinConstant("flags", PFactory.createDict(core.getLanguage())); super.initialize(core); } - @Builtin(name = "SemLock", parameterNames = {"cls", "kind", "value", "maxvalue", "name", "unlink"}, constructsClass = PythonBuiltinClassType.PGraalPySemLock) - @ArgumentClinic(name = "kind", conversion = ArgumentClinic.ClinicConversion.Int) - @ArgumentClinic(name = "value", conversion = ArgumentClinic.ClinicConversion.Int) - @ArgumentClinic(name = "maxvalue", conversion = ArgumentClinic.ClinicConversion.Int) - @ArgumentClinic(name = "name", conversion = ArgumentClinic.ClinicConversion.TString) - @ArgumentClinic(name = "unlink", conversion = ArgumentClinic.ClinicConversion.IntToBoolean) - @GenerateNodeFactory - abstract static class SemLockNode extends PythonClinicBuiltinNode { - @Specialization - static PGraalPySemLock construct(Object cls, int kind, int value, @SuppressWarnings("unused") int maxValue, TruffleString name, boolean unlink, - @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (kind != PGraalPySemLock.RECURSIVE_MUTEX && kind != PGraalPySemLock.SEMAPHORE) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.UNRECOGNIZED_KIND); - } - Semaphore semaphore = newSemaphore(value); - if (!unlink) { - // CPython creates a named semaphore, and if unlink != 0 unlinks - // it directly, so it cannot be accessed by other processes. We - // have to explicitly link it, so we do that here if we - // must. CPython always uses O_CREAT | O_EXCL for creating named - // semaphores, so a conflict raises. - SharedMultiprocessingData multiprocessing = PythonContext.get(inliningTarget).getSharedMultiprocessingData(); - if (multiprocessing.getNamedSemaphore(name) != null) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.FileExistsError, ErrorMessages.SEMAPHORE_NAME_TAKEN, name); - } else { - multiprocessing.putNamedSemaphore(name, semaphore); - } - } - return factory.createGraalPySemLock(cls, name, kind, semaphore); - } - - @TruffleBoundary - private static Semaphore newSemaphore(int value) { - return new Semaphore(value); - } - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return MultiprocessingGraalPyModuleBuiltinsClinicProviders.SemLockNodeClinicProviderGen.INSTANCE; - } - } - @GenerateNodeFactory @Builtin(name = "sem_unlink", parameterNames = {"name"}) abstract static class SemUnlink extends PythonUnaryBuiltinNode { @@ -218,13 +170,13 @@ long getTid( abstract static class WaitTidNode extends PythonBinaryBuiltinNode { @Specialization PTuple waittid(long id, @SuppressWarnings("unused") int options, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { long tid = convertTid(id); // TODO implement for options - WNOHANG and 0 final SharedMultiprocessingData multiprocessing = getContext().getSharedMultiprocessingData(); Thread thread = multiprocessing.getChildContextThread(tid); if (thread != null && thread.isAlive()) { - return factory.createTuple(new Object[]{0, 0, 0}); + return PFactory.createTuple(language, new Object[]{0, 0, 0}); } PythonContext.ChildContextData data = multiprocessing.getChildContextData(tid); @@ -234,7 +186,7 @@ PTuple waittid(long id, @SuppressWarnings("unused") int options, * clean it. See popen_truffleprocess that calls the _waittid builtin. */ multiprocessing.removeChildContextData(tid); - return factory.createTuple(new Object[]{id, data.wasSignaled() ? data.getExitCode() : 0, data.getExitCode()}); + return PFactory.createTuple(language, new Object[]{id, data.wasSignaled() ? data.getExitCode() : 0, data.getExitCode()}); } } @@ -274,7 +226,7 @@ abstract static class PipeNode extends PythonBuiltinNode { @Specialization PTuple pipe(@Cached GilNode gil, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { int[] pipe; PythonContext ctx = getContext(); SharedMultiprocessingData sharedData = ctx.getSharedMultiprocessingData(); @@ -286,7 +238,7 @@ PTuple pipe(@Cached GilNode gil, } finally { gil.acquire(); } - return factory.createTuple(new Object[]{pipe[0], pipe[1]}); + return PFactory.createTuple(language, new Object[]{pipe[0], pipe[1]}); } } @@ -303,7 +255,7 @@ Object doWrite(int fd, PBytes data, byte[] bytes = bufferLib.getCopiedByteArray(data); sharedData.addPipeData(fd, bytes, () -> { - throw PRaiseNode.raiseUncached(this, OSError, ErrorMessages.BAD_FILE_DESCRIPTOR); + throw PRaiseNode.raiseStatic(this, OSError, ErrorMessages.BAD_FILE_DESCRIPTOR); }, () -> { throw PConstructAndRaiseNode.getUncached().raiseOSError(null, OSErrorEnum.EPIPE); @@ -327,18 +279,18 @@ Object doWrite(long fd, PBytes data, public abstract static class ReadNode extends PythonBinaryBuiltinNode { @Specialization Object doReadInt(int fd, @SuppressWarnings("unused") Object length, - @Shared @Cached GilNode gil, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @Shared @Cached GilNode gil) { SharedMultiprocessingData sharedData = getContext().getSharedMultiprocessingData(); gil.release(true); try { Object data = sharedData.takePipeData(this, fd, () -> { - throw PRaiseNode.raiseUncached(this, OSError, ErrorMessages.BAD_FILE_DESCRIPTOR); + throw PRaiseNode.raiseStatic(this, OSError, ErrorMessages.BAD_FILE_DESCRIPTOR); }); if (data == PNone.NONE) { - return factory.createBytes(PythonUtils.EMPTY_BYTE_ARRAY, 0, 0); + return PFactory.createEmptyBytes(language); } - return factory.createBytes((byte[]) data); + return PFactory.createBytes(language, (byte[]) data); } finally { gil.acquire(); } @@ -346,9 +298,9 @@ Object doReadInt(int fd, @SuppressWarnings("unused") Object length, @Specialization Object doReadLong(long fd, Object length, - @Shared @Cached GilNode gil, - @Shared @Cached PythonObjectFactory factory) { - return doReadInt((int) fd, length, gil, factory); + @Bind PythonLanguage language, + @Shared @Cached GilNode gil) { + return doReadInt((int) fd, length, language, gil); } } @@ -394,6 +346,7 @@ abstract static class SelectNode extends PythonBuiltinNode { @Specialization Object doGeneric(VirtualFrame frame, Object multiprocessingFdsList, Object multiprocessingObjsList, Object posixFileObjsList, Object timeoutObj, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached PosixModuleBuiltins.FileDescriptorConversionNode fdConvertor, @Cached PyObjectSizeNode sizeNode, @Cached PyObjectGetItem getItem, @@ -402,8 +355,7 @@ Object doGeneric(VirtualFrame frame, Object multiprocessingFdsList, Object multi @Cached CastToJavaIntLossyNode castToJava, @Cached CastToJavaDoubleNode castToDouble, @Cached GilNode gil, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { PythonContext context = getContext(); SharedMultiprocessingData sharedData = context.getSharedMultiprocessingData(); @@ -443,7 +395,7 @@ Object doGeneric(VirtualFrame frame, Object multiprocessingFdsList, Object multi } } - return factory.createList(result.toArray(new Object[0])); + return PFactory.createList(language, result.toArray(new Object[0])); } catch (PosixSupportLibrary.PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } finally { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/MultiprocessingModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/MultiprocessingModuleBuiltins.java index 3b290b2982..afe5cf96f2 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/MultiprocessingModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/MultiprocessingModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,28 +40,18 @@ */ package com.oracle.graal.python.builtins.modules.multiprocessing; -import static com.oracle.graal.python.runtime.PosixConstants.O_CREAT; -import static com.oracle.graal.python.runtime.PosixConstants.O_EXCL; - import java.util.List; -import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PConstructAndRaiseNode; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.runtime.PosixSupport; import com.oracle.graal.python.runtime.PosixSupportLibrary; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -79,53 +69,6 @@ protected List> getNodeFa return MultiprocessingModuleBuiltinsFactory.getFactories(); } - @Builtin(name = "SemLock", parameterNames = {"$cls", "kind", "value", "maxvalue", "name", "unlink"}, constructsClass = PythonBuiltinClassType.PSemLock) - @ArgumentClinic(name = "kind", conversion = ArgumentClinic.ClinicConversion.Int) - @ArgumentClinic(name = "value", conversion = ArgumentClinic.ClinicConversion.Int) - @ArgumentClinic(name = "maxvalue", conversion = ArgumentClinic.ClinicConversion.Int) - @ArgumentClinic(name = "name", conversion = ArgumentClinic.ClinicConversion.TString) - @ArgumentClinic(name = "unlink", conversion = ArgumentClinic.ClinicConversion.IntToBoolean) - @GenerateNodeFactory - abstract static class SemLockNode extends PythonClinicBuiltinNode { - @Specialization - static PSemLock construct(VirtualFrame frame, Object cls, int kind, int value, int maxValue, TruffleString name, boolean unlink, - @Bind("this") Node inliningTarget, - @Bind("getPosixSupport()") PosixSupport posixSupport, - @CachedLibrary("posixSupport") PosixSupportLibrary posixLib, - @Cached PythonObjectFactory factory, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PRaiseNode.Lazy raiseNode) { - if (kind != PGraalPySemLock.RECURSIVE_MUTEX && kind != PGraalPySemLock.SEMAPHORE) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.UNRECOGNIZED_KIND); - } - Object posixName = posixLib.createPathFromString(posixSupport, name); - long handle; - try { - handle = posixLib.semOpen(posixSupport, posixName, O_CREAT.value | O_EXCL.value, 0600, value); - } catch (PosixException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); - } - if (unlink) { - try { - posixLib.semUnlink(posixSupport, posixName); - } catch (PosixException e) { - try { - posixLib.semClose(posixSupport, handle); - } catch (PosixException ex) { - // Ignore, we're already on an error path - } - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); - } - } - return factory.createSemLock(cls, handle, kind, maxValue, name); - } - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return MultiprocessingModuleBuiltinsClinicProviders.SemLockNodeClinicProviderGen.INSTANCE; - } - } - @GenerateNodeFactory @Builtin(name = "sem_unlink", parameterNames = {"name"}) abstract static class SemUnlink extends PythonUnaryBuiltinNode { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/SemLockBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/SemLockBuiltins.java index 2834d0b355..43607eff8c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/SemLockBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/SemLockBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,17 +44,26 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ENTER__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EXIT__; +import static com.oracle.graal.python.runtime.PosixConstants.O_CREAT; +import static com.oracle.graal.python.runtime.PosixConstants.O_EXCL; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.modules.multiprocessing.SemLockBuiltinsClinicProviders.SemLockNodeClinicProviderGen; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.thread.PThread; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyFloatAsDoubleNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PConstructAndRaiseNode; @@ -71,7 +80,7 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PosixSupportLibrary.UnsupportedPosixFeatureException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -84,6 +93,9 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PSemLock) public class SemLockBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = SemLockBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return SemLockBuiltinsFactory.getFactories(); @@ -95,6 +107,55 @@ public void initialize(Python3Core core) { super.initialize(core); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "SemLock", parameterNames = {"$cls", "kind", "value", "maxvalue", "name", "unlink"}) + @ArgumentClinic(name = "kind", conversion = ArgumentClinic.ClinicConversion.Int) + @ArgumentClinic(name = "value", conversion = ArgumentClinic.ClinicConversion.Int) + @ArgumentClinic(name = "maxvalue", conversion = ArgumentClinic.ClinicConversion.Int) + @ArgumentClinic(name = "name", conversion = ArgumentClinic.ClinicConversion.TString) + @ArgumentClinic(name = "unlink", conversion = ArgumentClinic.ClinicConversion.IntToBoolean) + @GenerateNodeFactory + abstract static class SemLockNode extends PythonClinicBuiltinNode { + @Specialization + static PSemLock construct(VirtualFrame frame, Object cls, int kind, int value, int maxValue, TruffleString name, boolean unlink, + @Bind("this") Node inliningTarget, + @Bind("getPosixSupport()") PosixSupport posixSupport, + @CachedLibrary("posixSupport") PosixSupportLibrary posixLib, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, + @Cached PRaiseNode raiseNode) { + if (kind != PGraalPySemLock.RECURSIVE_MUTEX && kind != PGraalPySemLock.SEMAPHORE) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.UNRECOGNIZED_KIND); + } + Object posixName = posixLib.createPathFromString(posixSupport, name); + long handle; + try { + handle = posixLib.semOpen(posixSupport, posixName, O_CREAT.value | O_EXCL.value, 0600, value); + } catch (PosixException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); + } + if (unlink) { + try { + posixLib.semUnlink(posixSupport, posixName); + } catch (PosixException e) { + try { + posixLib.semClose(posixSupport, handle); + } catch (PosixException ex) { + // Ignore, we're already on an error path + } + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); + } + } + return PFactory.createSemLock(language, cls, getInstanceShape.execute(cls), handle, kind, maxValue, name); + } + + @Override + protected ArgumentClinicProvider getArgumentClinic() { + return SemLockNodeClinicProviderGen.INSTANCE; + } + } + @Builtin(name = "handle", minNumOfPositionalArgs = 1, isGetter = true) @GenerateNodeFactory abstract static class HandleNode extends PythonUnaryBuiltinNode { @@ -205,11 +266,11 @@ static PNone release(VirtualFrame frame, PSemLock self, @Bind("this") Node inliningTarget, @Bind("getPosixSupport()") PosixSupport posixSupport, @CachedLibrary("posixSupport") PosixSupportLibrary posixLib, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { if (self.getKind() == PSemLock.RECURSIVE_MUTEX) { if (!self.isMine()) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.AssertionError, ErrorMessages.ATTEMP_TO_RELEASE_RECURSIVE_LOCK); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.AssertionError, ErrorMessages.ATTEMP_TO_RELEASE_RECURSIVE_LOCK); } if (self.getCount() > 1) { self.decreaseCount(); @@ -221,7 +282,7 @@ static PNone release(VirtualFrame frame, PSemLock self, try { sval = posixLib.semGetValue(posixSupport, self.getHandle()); if (sval >= self.getMaxValue()) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.SEMAPHORE_RELEASED_TOO_MANY_TIMES); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.SEMAPHORE_RELEASED_TOO_MANY_TIMES); } } catch (UnsupportedPosixFeatureException e) { /* We will only check properly the maxvalue == 1 case */ @@ -229,7 +290,7 @@ static PNone release(VirtualFrame frame, PSemLock self, if (posixLib.semTryWait(posixSupport, self.getHandle())) { /* it was not locked so undo wait and raise */ posixLib.semPost(posixSupport, self.getHandle()); - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.SEMAPHORE_RELEASED_TOO_MANY_TIMES); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.SEMAPHORE_RELEASED_TOO_MANY_TIMES); } } } @@ -294,7 +355,7 @@ int get(VirtualFrame frame, PSemLock self, @Bind("getPosixSupport()") PosixSupport posixSupport, @CachedLibrary("posixSupport") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { int sval = posixLib.semGetValue(posixSupport, self.getHandle()); /* @@ -309,7 +370,7 @@ int get(VirtualFrame frame, PSemLock self, throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } catch (UnsupportedPosixFeatureException e) { // Not available on Darwin - throw raiseNode.get(inliningTarget).raise(NotImplementedError); + throw raiseNode.raise(inliningTarget, NotImplementedError); } } } @@ -362,7 +423,8 @@ static Object rebuild(VirtualFrame frame, Object cls, @SuppressWarnings("unused" @Bind("this") Node inliningTarget, @Bind("getPosixSupport()") PosixSupport posixSupport, @CachedLibrary("posixSupport") PosixSupportLibrary posixLib, - @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { Object posixName = posixLib.createPathFromString(posixSupport, name); long handle; @@ -371,7 +433,7 @@ static Object rebuild(VirtualFrame frame, Object cls, @SuppressWarnings("unused" } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } - return factory.createSemLock(cls, handle, kind, maxValue, name); + return PFactory.createSemLock(language, cls, getInstanceShape.execute(cls), handle, kind, maxValue, name); } @Override diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/MemoTable.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/MemoTable.java index 595da28de2..4393f54f42 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/MemoTable.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/MemoTable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -173,7 +173,7 @@ private void resize() { if (newLength <= keys.length) { CompilerDirectives.transferToInterpreterAndInvalidate(); // overflow - throw PRaiseNode.raiseUncached(null, PicklingError, ErrorMessages.STRUCT_SIZE_TOO_LONG); + throw PRaiseNode.raiseStatic(null, PicklingError, ErrorMessages.STRUCT_SIZE_TOO_LONG); } MemoIterator iterator = iterator(); // captures the current contents diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PData.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PData.java index ec3f3c30a2..c53e006ed1 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PData.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PData.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,6 +40,7 @@ */ package com.oracle.graal.python.builtins.modules.pickle; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.tuple.PTuple; @@ -47,7 +48,7 @@ import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.OverflowException; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.dsl.Bind; @@ -97,8 +98,8 @@ public void grow() throws OverflowException { } public abstract static class PDataBaseNode extends PNodeWithContext { - static PException raiseUnderflow(PData self, PRaiseNode raiseNode) { - return raiseNode.raise(PythonBuiltinClassType.UnpicklingError, + static PException raiseUnderflow(PData self, Node inliningTarget, PRaiseNode raiseNode) { + return raiseNode.raise(inliningTarget, PythonBuiltinClassType.UnpicklingError, self.mark ? ErrorMessages.PDATA_UNEXPECTED_MARK_FOUND : ErrorMessages.PDATA_UNPICKLING_STACK_UNDERFLOW); } } @@ -111,9 +112,9 @@ public abstract static class PDataPopNode extends PDataBaseNode { @Specialization static Object pop(PData self, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (self.size <= self.fence) { - throw raiseUnderflow(self, raiseNode.get(inliningTarget)); + throw raiseUnderflow(self, inliningTarget, raiseNode); } return self.data[--self.size]; } @@ -131,12 +132,12 @@ public abstract static class PDataPushNode extends PDataBaseNode { @Specialization static void push(PData self, Object obj, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (self.size == self.data.length) { try { self.grow(); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raiseOverflow(); + throw raiseNode.raiseOverflow(inliningTarget); } } self.data[self.size++] = obj; @@ -155,12 +156,12 @@ public abstract static class PDataPopTupleNode extends PDataBaseNode { @Specialization static PTuple popTuple(PData self, int start, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { int len, i, j; if (start < self.fence) { - throw raiseUnderflow(self, raiseNode.get(inliningTarget)); + throw raiseUnderflow(self, inliningTarget, raiseNode); } len = self.size - start; Object[] items = new Object[len]; @@ -168,7 +169,7 @@ static PTuple popTuple(PData self, int start, items[j] = self.data[i]; } self.size = start; - return factory.createTuple(items); + return PFactory.createTuple(language, items); } public static PDataPopTupleNode create() { @@ -183,7 +184,7 @@ public abstract static class PDataPopListNode extends PDataBaseNode { @Specialization public PList popList(PData self, int start, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { int len, i, j; len = self.size - start; @@ -192,7 +193,7 @@ public PList popList(PData self, int start, items[j] = self.data[i]; } self.size = start; - return factory.createList(items); + return PFactory.createList(language, items); } public static PDataPopListNode create() { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PPickleBuffer.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PPickleBuffer.java index d9bf079ce6..456c130bd1 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PPickleBuffer.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PPickleBuffer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,10 +47,12 @@ import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; +import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.object.Shape; @ExportLibrary(PythonBufferAcquireLibrary.class) @@ -80,6 +82,7 @@ boolean hasBuffer() { @ExportMessage Object acquire(int flags, + @Bind("$node") Node inliningTarget, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib, @Cached PRaiseNode raise) { @@ -88,7 +91,7 @@ Object acquire(int flags, owner = bufferLib.getOwner(view); } if (owner == null) { - throw raise.raise(ValueError, ErrorMessages.OP_FORBIDDEN_ON_OBJECT, "PickleBuffer"); + throw raise.raise(inliningTarget, ValueError, ErrorMessages.OP_FORBIDDEN_ON_OBJECT, "PickleBuffer"); } return acquireLib.acquire(owner, flags); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PPickler.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PPickler.java index ee73867048..cd3f372ec6 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PPickler.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PPickler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -63,10 +63,9 @@ import java.util.Map; import java.util.WeakHashMap; -import com.oracle.graal.python.builtins.objects.set.PFrozenSet; -import com.oracle.graal.python.builtins.objects.set.PSet; import org.graalvm.collections.Pair; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.PNotImplemented; @@ -84,9 +83,12 @@ import com.oracle.graal.python.builtins.objects.ints.IntNodes; import com.oracle.graal.python.builtins.objects.ints.IntNodesFactory; import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; +import com.oracle.graal.python.builtins.objects.set.PFrozenSet; +import com.oracle.graal.python.builtins.objects.set.PSet; import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.lib.IteratorExhausted; import com.oracle.graal.python.lib.PyCallableCheckNode; import com.oracle.graal.python.lib.PyFloatAsDoubleNode; import com.oracle.graal.python.lib.PyLongAsLongNode; @@ -107,7 +109,7 @@ import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.Consumer; import com.oracle.graal.python.util.NumericSupport; @@ -272,32 +274,32 @@ private void fastMemoRemove(Object object) { } // helper methods - public void setProtocol(Node inliningTarget, PRaiseNode.Lazy raiseNode, int protocol, boolean fixImports) { + public void setProtocol(Node inliningTarget, PRaiseNode raiseNode, int protocol, boolean fixImports) { proto = protocol; if (proto < 0) { proto = PickleUtils.PICKLE_PROTOCOL_HIGHEST; } else if (proto > PickleUtils.PICKLE_PROTOCOL_HIGHEST) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.PICKLE_PROTO_MUST_BE_LE, PickleUtils.PICKLE_PROTOCOL_HIGHEST); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.PICKLE_PROTO_MUST_BE_LE, PickleUtils.PICKLE_PROTOCOL_HIGHEST); } this.bin = (proto > 0) ? 1 : 0; this.fixImports = fixImports && proto < 3; } - public void setOutputStream(VirtualFrame frame, Node inliningTarget, PRaiseNode.Lazy raiseNode, PyObjectLookupAttr lookup, Object file) { + public void setOutputStream(VirtualFrame frame, Node inliningTarget, PRaiseNode raiseNode, PyObjectLookupAttr lookup, Object file) { write = lookup.execute(frame, inliningTarget, file, PickleUtils.T_METHOD_WRITE); if (write == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.FILE_MUST_HAVE_WRITE_ATTR); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.FILE_MUST_HAVE_WRITE_ATTR); } } - public void setBufferCallback(Node inliningTarget, PRaiseNode.Lazy raiseNode, Object callback) { + public void setBufferCallback(Node inliningTarget, PRaiseNode raiseNode, Object callback) { bufferCallback = callback; if (PGuards.isNone(callback) || PGuards.isNoValue(callback)) { bufferCallback = null; } if (bufferCallback != null && proto < 5) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.BUFFCB_NEEDS_PROTO_GE_5); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.BUFFCB_NEEDS_PROTO_GE_5); } } @@ -353,9 +355,9 @@ public void commitFrame() { frameStart = -1; } - public PBytes getString(PythonObjectFactory factory) { + public PBytes getString(PythonLanguage language) { commitFrame(); - return factory.createBytes(outputBuffer, outputLen); + return PFactory.createBytes(language, outputBuffer, outputLen); } // inner nodes @@ -528,7 +530,7 @@ protected void writeBytes(VirtualFrame frame, PPickler pickler, byte[] header, i if (pld == null) { // TODO: It would be better to use a memoryview with a linked original string if // this is possible. - pld = factory().createBytes(data, 0, dataSize); + pld = PFactory.createBytes(PythonLanguage.get(this), data, dataSize); } getCallNode().execute(frame, pickler.write, pld); // Reinitialize the buffer for subsequent calls to _Pickler_Write. @@ -543,9 +545,9 @@ protected void writeBytes(VirtualFrame frame, PPickler pickler, byte[] header, i protected PTuple createTuple(Object... items) { if (items.length == 0) { - return factory().createEmptyTuple(); + return PFactory.createEmptyTuple(PythonLanguage.get(this)); } - return factory().createTuple(items); + return PFactory.createTuple(PythonLanguage.get(this), items); } protected void fastSaveEnter(PPickler pickler, Object obj) { @@ -570,10 +572,11 @@ public abstract static class FlushToFileNode extends BasePickleWriteNode { public abstract void execute(VirtualFrame frame, PPickler pickler); @Specialization - public void flush(VirtualFrame frame, PPickler pickler) { + public void flush(VirtualFrame frame, PPickler pickler, + @Bind PythonLanguage language) { assert pickler.write != null; // This will commit the frame first - PBytes output = pickler.getString(factory()); + PBytes output = pickler.getString(language); call(frame, pickler.write, output); } } @@ -628,7 +631,7 @@ private boolean isTrue(VirtualFrame frame, Object object) { CompilerDirectives.transferToInterpreterAndInvalidate(); isTrueNode = insert(PyObjectIsTrueNode.create()); } - return isTrueNode.executeCached(frame, object); + return isTrueNode.execute(frame, object); } private boolean isSame(Object a, Object b) { @@ -736,16 +739,19 @@ private void saveIteratorBatchedUnrolled(VirtualFrame frame, PPickler pickler, O Object obj; do { // Get first item - final Object firstItem = getNextItem(frame, iterator); - if (firstItem == null) { + final Object firstItem; + try { + firstItem = getNextItem(frame, iterator); + } catch (IteratorExhausted e) { // nothing more to add break; } checkItem.accept(firstItem); // Try to get a second item - obj = getNextItem(frame, iterator); - if (obj == null) { + try { + obj = getNextItem(frame, iterator); + } catch (IteratorExhausted e) { // Only one item to write saveItem.accept(firstItem); write(pickler, opcodeOneItem); @@ -766,8 +772,9 @@ private void saveIteratorBatchedUnrolled(VirtualFrame frame, PPickler pickler, O break; } - obj = getNextItem(frame, iterator); - if (obj == null) { + try { + obj = getNextItem(frame, iterator); + } catch (IteratorExhausted e) { break; } } @@ -798,8 +805,10 @@ private void saveListIteratorBatchUnrolled(VirtualFrame frame, PPickler pickler, private void saveIterator(VirtualFrame frame, PPickler pickler, Object iterator, byte opcode, Consumer itemConsumer) { while (true) { - Object item = getNextItem(frame, iterator); - if (item == null) { + Object item; + try { + item = getNextItem(frame, iterator); + } catch (IteratorExhausted e) { break; } itemConsumer.accept(item); @@ -949,7 +958,7 @@ private void saveReduce(VirtualFrame frame, PythonContext ctx, PPickler pickler, boolean useNewobj = false, useNewobjEx = false; if (!(arguments instanceof PTuple)) { - throw getRaiseNode().raiseBadInternalCall(); + throw raise(PythonBuiltinClassType.SystemError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC); } int size = length(frame, arguments); if (size < 2 || size > 6) { @@ -1054,7 +1063,7 @@ private void saveReduce(VirtualFrame frame, PythonContext ctx, PPickler pickler, callable = callStarArgsAndKwArgs(frame, st.partial, newargs, kwargs); save(frame, pickler, callable, 0); - save(frame, pickler, factory().createEmptyTuple(), 0); + save(frame, pickler, PFactory.createEmptyTuple(PythonLanguage.get(this)), 0); write(pickler, PickleUtils.OPCODE_REDUCE); } } else if (useNewobj) { @@ -1110,7 +1119,7 @@ private void saveReduce(VirtualFrame frame, PythonContext ctx, PPickler pickler, // Save the class and its __new__ arguments save(frame, pickler, cls, 0); - newargtup = getItem(frame, argtup, factory().createIntSlice(1, argtupSize, 1)); + newargtup = getItem(frame, argtup, PFactory.createIntSlice(PythonLanguage.get(this), 1, argtupSize, 1)); save(frame, pickler, newargtup, 0); write(pickler, PickleUtils.OPCODE_NEWOBJ); } else { @@ -1492,8 +1501,10 @@ private void batchSet(VirtualFrame frame, PPickler pickler, Object obj) { i = 0; write(pickler, PickleUtils.OPCODE_MARK); while (true) { - Object item = getNextItem(frame, iterator); - if (item == null) { + Object item; + try { + item = getNextItem(frame, iterator); + } catch (IteratorExhausted e) { break; } save(frame, pickler, item, 0); @@ -1645,7 +1656,7 @@ private void saveList(VirtualFrame frame, PPickler pickler, Object obj) { private void storeTupleElements(VirtualFrame frame, PPickler pickler, Object obj, int len) { // A helper for save_tuple. Push the len elements in tuple t on the stack - assert PyObjectSizeNode.executeUncached(frame, obj) == len; + assert PyObjectSizeNode.executeUncached(obj) == len; for (int i = 0; i < len; i++) { Object element = getItem(frame, obj, i); save(frame, pickler, element, 0); @@ -1738,7 +1749,7 @@ private void saveBytearrayData(VirtualFrame frame, PPickler pickler, Object obj, memoPut(pickler, obj); } - private void saveBytearray(VirtualFrame frame, PythonContext ctx, PPickler pickler, Object obj, IndirectCallData indirectCallData) { + private void saveBytearray(VirtualFrame frame, Node inliningTarget, PythonContext ctx, PPickler pickler, Object obj, IndirectCallData indirectCallData) { Object buffer = getBufferAcquireLibrary().acquireReadonly(obj, frame, indirectCallData); try { if (pickler.proto < 5) { @@ -1750,7 +1761,7 @@ private void saveBytearray(VirtualFrame frame, PythonContext ctx, PPickler pickl reduceValue = createTuple(byteArrayClass, createTuple()); } else { byte[] bytes = getBufferLibrary().getCopiedByteArray(buffer); - reduceValue = createTuple(byteArrayClass, createTuple(factory().createBytes(bytes))); + reduceValue = createTuple(byteArrayClass, createTuple(PFactory.createBytes(ctx.getLanguage(inliningTarget), bytes))); } // save_reduce() will memoize the object automatically. @@ -2026,7 +2037,7 @@ void saveGeneric(VirtualFrame frame, PPickler pickler, Object objArg, int persSa saveTuple(frame, pickler, obj); return; } else if (isBuiltinClass(type, PythonBuiltinClassType.PByteArray)) { - saveBytearray(frame, ctx, pickler, obj, indirectCallData); + saveBytearray(frame, inliningTarget, ctx, pickler, obj, indirectCallData); return; } else if (obj instanceof PPickleBuffer buffer) { savePicklebuffer(frame, pickler, buffer); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PUnpickler.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PUnpickler.java index 6226471d0e..b56af84398 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PUnpickler.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PUnpickler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -130,6 +130,7 @@ import org.graalvm.collections.Pair; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.buffer.BufferFlags; @@ -147,6 +148,7 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIteratorValue; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItem; import com.oracle.graal.python.builtins.objects.dict.PDict; +import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.ints.IntNodes; import com.oracle.graal.python.builtins.objects.ints.IntNodesFactory; import com.oracle.graal.python.builtins.objects.list.ListBuiltins; @@ -156,7 +158,12 @@ import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; import com.oracle.graal.python.builtins.objects.set.PSet; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotVarargs.CallSlotTpNewNode; +import com.oracle.graal.python.lib.IteratorExhausted; import com.oracle.graal.python.lib.PyMemoryViewFromObject; +import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.lib.PyObjectSetAttrO; @@ -164,13 +171,18 @@ import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.argument.keywords.ExpandKeywordStarargsNode; +import com.oracle.graal.python.nodes.argument.positional.ExecutePositionalStarargsNode; import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonErrorType; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.NumericSupport; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; @@ -292,7 +304,7 @@ public void initInternals(VirtualFrame frame, Node inliningTarget, PyObjectLooku this.persFuncSelf = pair.getRight(); } - public void setInputStream(VirtualFrame frame, Node inliningTarget, PRaiseNode.Lazy raiseNode, PyObjectLookupAttr lookup, Object file) { + public void setInputStream(VirtualFrame frame, Node inliningTarget, PRaiseNode raiseNode, PyObjectLookupAttr lookup, Object file) { this.peek = lookup.execute(frame, inliningTarget, file, T_METHOD_PEEK); if (this.peek == PNone.NO_VALUE) { this.peek = null; @@ -304,7 +316,7 @@ public void setInputStream(VirtualFrame frame, Node inliningTarget, PRaiseNode.L this.read = lookup.execute(frame, inliningTarget, file, T_METHOD_READ); this.readline = lookup.execute(frame, inliningTarget, file, T_METHOD_READLINE); if (this.readline == PNone.NO_VALUE || this.read == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.FILE_MUST_HAVE_A_AND_B_ATTRS, T_METHOD_READ, T_METHOD_READLINE); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.FILE_MUST_HAVE_A_AND_B_ATTRS, T_METHOD_READ, T_METHOD_READLINE); } } @@ -442,7 +454,7 @@ protected PythonBufferAccessLibrary getBufferAccessLibrary() { } public Object createMemoryViewFromBytes(VirtualFrame frame, byte[] bytes, int n) { - return ensureMemoryViewNode().execute(frame, factory().createByteArray(bytes, n)); + return ensureMemoryViewNode().execute(frame, PFactory.createByteArray(PythonLanguage.get(this), bytes, n)); } public Object createMemoryView(VirtualFrame frame, Object obj) { @@ -757,7 +769,7 @@ protected HashingStorage getClonedHashingStorage(VirtualFrame frame, Object obj) CompilerDirectives.transferToInterpreterAndInvalidate(); getHashingStorageNode = insert(HashingCollectionNodes.GetClonedHashingStorageNode.create()); } - return getHashingStorageNode.doNoValueCached(frame, obj); + return getHashingStorageNode.getForSetsCached(frame, obj); } private void setItem(VirtualFrame frame, Object object, Object key, Object value) { @@ -867,7 +879,7 @@ private void loadInt(VirtualFrame frame, PUnpickler self) { } } catch (TruffleString.NumberFormatException nfe) { // Hm, maybe we've got something long. Let's try reading it as a Python int object. - value = parseInt(frame, getValidIntString(s)); + value = parseInt(getValidIntString(s)); } pDataPush(self, value); } @@ -888,7 +900,7 @@ private void loadLong(VirtualFrame frame, PUnpickler self) { try { value = PickleUtils.asciiBytesToLong(s, ensureTsParseLongNode(), ensureTsFromByteArray()); } catch (TruffleString.NumberFormatException nfe) { - value = parseInt(frame, s); + value = parseInt(s); } pDataPush(self, value); } @@ -924,7 +936,7 @@ private void loadFloat(VirtualFrame frame, PUnpickler self) { // TODO: (cbasca) we skip an entire branch from _pickle.c:load_float // TODO: (cbasca) should we return a PFloat ? (same for load_int/long variants) - value = PickleUtils.asciiBytesToDouble(s, getRaiseNode(), PythonBuiltinClassType.OverflowError); + value = PickleUtils.asciiBytesToDouble(this, s, PythonBuiltinClassType.OverflowError); pDataPush(self, value); } @@ -946,7 +958,7 @@ private void loadCountedBinBytes(VirtualFrame frame, PUnpickler self, int nbytes byte[] buffer = new byte[size]; readInto(frame, self, buffer); - Object bytes = factory().createBytes(buffer); + Object bytes = PFactory.createBytes(PythonLanguage.get(this), buffer); pDataPush(self, bytes); } @@ -960,7 +972,7 @@ private void loadCountedByteArray(VirtualFrame frame, PUnpickler self) { byte[] buffer = new byte[size]; readInto(frame, self, buffer); - Object bytearray = factory().createByteArray(buffer); + Object bytearray = PFactory.createByteArray(PythonLanguage.get(this), buffer); pDataPush(self, bytearray); } @@ -969,8 +981,10 @@ private void loadNextBuffer(VirtualFrame frame, PUnpickler self) { throw raise(PythonBuiltinClassType.UnpicklingError, ErrorMessages.PICKLE_STREAM_NO_BUFFERS); } - Object buf = getNextItem(frame, self.buffers); - if (buf == null) { + Object buf; + try { + buf = getNextItem(frame, self.buffers); + } catch (IteratorExhausted e) { throw raise(PythonBuiltinClassType.UnpicklingError, ErrorMessages.NOT_ENOUGH_BUFFERS); } @@ -1008,7 +1022,7 @@ private void loadCountedBinString(VirtualFrame frame, PUnpickler self, int nbyte // Convert Python 2.x strings to bytes if the *encoding* given to the Unpickler was // 'bytes'. Otherwise, convert them to unicode. - final PBytes bytes = factory().createBytes(s.getBytes(size), size); + final PBytes bytes = PFactory.createBytes(PythonLanguage.get(this), s.getBytes(size), size); if (ensureTsEqualNode().execute(self.encoding, T_CODEC_BYTES, TS_ENCODING)) { obj = bytes; } else { @@ -1037,7 +1051,11 @@ private void loadString(VirtualFrame frame, PUnpickler self) { // Use the PyBytes API to decode the string, since that is what is used to encode, and // then coerce the result to Unicode. - bytes = escapeDecode(frame, factory(), s, pStart, len); + if (len == 0) { + bytes = PFactory.createEmptyBytes(PythonLanguage.get(this)); + } else { + bytes = escapeDecode(frame, PythonUtils.arrayCopyOfRange(s, pStart, pStart + len)); + } // Leave the Python 2.x strings as bytes if the *encoding* given to the Unpickler was // 'bytes'. Otherwise, convert them to unicode. @@ -1093,7 +1111,7 @@ private void loadTuple(PUnpickler self) { } private void loadEmptyList(PUnpickler self) { - pDataPush(self, factory().createList()); + pDataPush(self, PFactory.createList(PythonLanguage.get(this))); } private void loadList(PUnpickler self) { @@ -1103,7 +1121,7 @@ private void loadList(PUnpickler self) { } private void loadEmptyDict(PUnpickler self) { - pDataPush(self, factory().createDict()); + pDataPush(self, PFactory.createDict(PythonLanguage.get(this))); } private void loadDict(VirtualFrame frame, PUnpickler self) { @@ -1125,11 +1143,11 @@ private void loadDict(VirtualFrame frame, PUnpickler self) { } self.stack.clear(i); - pDataPush(self, factory().createDict(storage)); + pDataPush(self, PFactory.createDict(PythonLanguage.get(this), storage)); } private void loadEmptySet(PUnpickler self) { - pDataPush(self, factory().createSet()); + pDataPush(self, PFactory.createSet(PythonLanguage.get(this))); } private void loadAddItems(VirtualFrame frame, PUnpickler self) { @@ -1168,25 +1186,24 @@ private void loadAddItems(VirtualFrame frame, PUnpickler self) { private void loadFrozenSet(VirtualFrame frame, PUnpickler self) { int i = marker(self); Object items = pDataPopTuple(self, i); - Object frozenset = factory().createFrozenSet(getClonedHashingStorage(frame, items)); + Object frozenset = PFactory.createFrozenSet(PythonLanguage.get(this), getClonedHashingStorage(frame, items)); pDataPush(self, frozenset); } - private Object instantiate(VirtualFrame frame, Object cls, Object args) { + private Object instantiate(VirtualFrame frame, Node inliningTarget, Object cls, Object args, PyObjectCallMethodObjArgs callMethod) { // Caller must assure args are a tuple. Normally, args come from Pdata_poptuple which // packs objects from the top of the stack into a newly created tuple. assert args instanceof PTuple; if (length(frame, args) == 0 && PGuards.isPythonClass(cls)) { Object func = getLookupAttrNode().executeCached(frame, cls, T___GETINITARGS__); if (func == PNone.NO_VALUE) { - final Object newMethod = lookupAttributeStrict(frame, cls, T___NEW__); - return callNew(frame, newMethod, cls); + return callMethod.execute(frame, inliningTarget, cls, T___NEW__, cls); } } return callStarArgs(frame, cls, args); } - private void loadObj(VirtualFrame frame, PUnpickler self) { + private void loadObj(VirtualFrame frame, Node inliningTarget, PUnpickler self, PyObjectCallMethodObjArgs callMethod) { Object cls, args, obj = null; int i = marker(self); @@ -1197,14 +1214,14 @@ private void loadObj(VirtualFrame frame, PUnpickler self) { args = pDataPopTuple(self, i + 1); cls = pDataPop(self); if (cls != null) { - obj = instantiate(frame, cls, args); + obj = instantiate(frame, inliningTarget, cls, args, callMethod); } assert obj != null; pDataPush(self, obj); } - private void loadInst(VirtualFrame frame, PythonContext ctx, PUnpickler self) { + private void loadInst(VirtualFrame frame, Node inliningTarget, PythonContext ctx, PUnpickler self, PyObjectCallMethodObjArgs callMethod) { Object cls = null; Object obj = null; int i = marker(self); @@ -1223,24 +1240,21 @@ private void loadInst(VirtualFrame frame, PythonContext ctx, PUnpickler self) { if (s.length < 2) { throw badReadLine(); } - try { - Object className = decodeASCII(frame, s, s.length - 1, T_ERRORS_STRICT); - cls = findClass(frame, ctx.getCore(), self, moduleName, className); - } catch (PException ignored) { - } + Object className = decodeASCII(frame, s, s.length - 1, T_ERRORS_STRICT); + cls = findClass(frame, ctx.getCore(), self, moduleName, className); } assert cls != null; Object args = pDataPopTuple(self, i); if (args != null) { - obj = instantiate(frame, cls, args); + obj = instantiate(frame, inliningTarget, cls, args, callMethod); } assert obj != null; pDataPush(self, obj); } - private void loadNewObj(VirtualFrame frame, PUnpickler self) { + private void loadNewObj(VirtualFrame frame, Node inliningTarget, PUnpickler self, GetCachedTpSlotsNode getSlots, CallSlotTpNewNode callNew, ExecutePositionalStarargsNode expandArgs) { // Stack is ... cls argtuple, and we want to call cls.__new__(cls, *argtuple). Object args = pDataPop(self); if (!(args instanceof PTuple)) { @@ -1252,24 +1266,25 @@ private void loadNewObj(VirtualFrame frame, PUnpickler self) { throw raise(PythonBuiltinClassType.UnpicklingError, ErrorMessages.S_CLASS_ARG_S, "NEWOBJ", "isn't a type object"); } // Call __new__ - final Object tpNew = getLookupAttrNode().executeCached(frame, cls, T___NEW__); - if (tpNew == PNone.NO_VALUE) { + TpSlot newSlot = getSlots.execute(inliningTarget, cls).tp_new(); + if (newSlot == null) { throw raise(PythonBuiltinClassType.UnpicklingError, ErrorMessages.S_CLASS_ARG_S, "NEWOBJ", "has NULL tp_new"); } - Object obj = callNew(frame, tpNew, cls, args); + Object obj = callNew.execute(frame, inliningTarget, newSlot, cls, expandArgs.executeWith(frame, args), PKeyword.EMPTY_KEYWORDS); pDataPush(self, obj); } - private void loadNewObjEx(VirtualFrame frame, PUnpickler self) { + private void loadNewObjEx(VirtualFrame frame, Node inliningTarget, PUnpickler self, GetCachedTpSlotsNode getSlots, CallSlotTpNewNode callNew, ExecutePositionalStarargsNode expandArgs, + ExpandKeywordStarargsNode expandKwargs) { Object kwargs = pDataPop(self); Object args = pDataPop(self); Object cls = pDataPop(self); if (!PGuards.isPythonClass(cls)) { throw raise(PythonBuiltinClassType.UnpicklingError, ErrorMessages.S_CLASS_ARG_MUST_BE_TYPE_NOT_P, "NEWOBJ_EX", cls); } - final Object tpNew = getLookupAttrNode().executeCached(frame, cls, T___NEW__); - if (tpNew == PNone.NO_VALUE) { + TpSlot newSlot = getSlots.execute(inliningTarget, cls).tp_new(); + if (newSlot == null) { throw raise(PythonBuiltinClassType.UnpicklingError, ErrorMessages.S_CLASS_ARG_DOES_NOT_HAVE_S, "NEWOBJ_EX", T___NEW__); } if (!(args instanceof PTuple)) { @@ -1279,7 +1294,7 @@ private void loadNewObjEx(VirtualFrame frame, PUnpickler self) { throw raise(PythonBuiltinClassType.UnpicklingError, ErrorMessages.S_ARG_MUST_BE_S_NOT_P, "NEWOBJ_EX kwargs", "dict", kwargs); } - Object obj = callNew(frame, tpNew, cls, args, kwargs); + Object obj = callNew.execute(frame, inliningTarget, newSlot, cls, expandArgs.executeWith(frame, args), expandKwargs.execute(frame, inliningTarget, kwargs)); pDataPush(self, obj); } @@ -1771,7 +1786,13 @@ private void loadBool(PUnpickler self, boolean bool) { } @Specialization - public Object load(VirtualFrame frame, PUnpickler self) { + public Object load(VirtualFrame frame, PUnpickler self, + @Bind Node inliningTarget, + @Cached GetCachedTpSlotsNode getSlots, + @Cached CallSlotTpNewNode callNew, + @Cached ExecutePositionalStarargsNode expandArgs, + @Cached ExpandKeywordStarargsNode expandKwargs, + @Cached PyObjectCallMethodObjArgs callMethod) { byte s; self.numMarks = 0; @@ -1897,16 +1918,16 @@ public Object load(VirtualFrame frame, PUnpickler self) { loadFrozenSet(frame, self); continue; case OPCODE_OBJ: - loadObj(frame, self); + loadObj(frame, inliningTarget, self, callMethod); continue; case OPCODE_INST: - loadInst(frame, ctx, self); + loadInst(frame, inliningTarget, ctx, self, callMethod); continue; case OPCODE_NEWOBJ: - loadNewObj(frame, self); + loadNewObj(frame, inliningTarget, self, getSlots, callNew, expandArgs); continue; case OPCODE_NEWOBJ_EX: - loadNewObjEx(frame, self); + loadNewObjEx(frame, inliningTarget, self, getSlots, callNew, expandArgs, expandKwargs); continue; case OPCODE_GLOBAL: loadGlobal(frame, ctx, self); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleBufferBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleBufferBuiltins.java index 6f588766b2..1ccee0181d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleBufferBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleBufferBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,20 +44,29 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.buffer.BufferFlags; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; +import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary; import com.oracle.graal.python.builtins.objects.memoryview.MemoryViewNodes; import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.lib.PyMemoryViewFromObject; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.IndirectCallData; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.BufferFormat; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -70,11 +79,28 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PickleBuffer) public class PickleBufferBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = PickleBufferBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return PickleBufferBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "PickleBuffer", minNumOfPositionalArgs = 2, parameterNames = {"$cls", "object"}) + @GenerateNodeFactory + abstract static class ConstructPickleBufferNode extends PythonBinaryBuiltinNode { + @Specialization(limit = "3") + static PPickleBuffer construct(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object object, + @Bind PythonLanguage language, + @Cached("createFor(this)") IndirectCallData indirectCallData, + @CachedLibrary("object") PythonBufferAcquireLibrary acquireLib) { + Object buffer = acquireLib.acquire(object, BufferFlags.PyBUF_FULL_RO, frame, indirectCallData); + return PFactory.createPickleBuffer(language, buffer); + } + } + // functions @Builtin(name = "raw", minNumOfPositionalArgs = 1, parameterNames = {"$self"}) @GenerateNodeFactory @@ -84,21 +110,21 @@ Object raw(VirtualFrame frame, PPickleBuffer self, @Bind("this") Node inliningTarget, @Cached PyMemoryViewFromObject memoryViewFromObject, @Cached MemoryViewNodes.ReleaseNode releaseNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { final Object view = self.getView(); if (view == null) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.OP_FORBIDDEN_ON_OBJECT, "PickleBuffer"); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.OP_FORBIDDEN_ON_OBJECT, "PickleBuffer"); } PMemoryView mv = memoryViewFromObject.execute(frame, self); // Make it into raw (1-dimensional bytes) memoryview try { if (!mv.isAnyContiguous()) { - throw raiseNode.get(inliningTarget).raise(BufferError, ErrorMessages.CANNOT_EXTRACT_RAW_BUFFER_FROM_NON_CONTIGUOUS); + throw raiseNode.raise(inliningTarget, BufferError, ErrorMessages.CANNOT_EXTRACT_RAW_BUFFER_FROM_NON_CONTIGUOUS); } int[] shape = new int[]{mv.getLength()}; int[] strides = new int[]{1}; - return factory.createMemoryView(getContext(), mv.getLifecycleManager(), mv.getBuffer(), mv.getOwner(), mv.getLength(), + return PFactory.createMemoryView(language, getContext(), mv.getLifecycleManager(), mv.getBuffer(), mv.getOwner(), mv.getLength(), mv.isReadOnly(), 1, BufferFormat.UINT_8, BufferFormat.T_UINT_8_TYPE_CODE, 1, mv.getBufferPointer(), mv.getOffset(), shape, strides, null, PMemoryView.FLAG_C | PMemoryView.FLAG_FORTRAN); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleModuleBuiltins.java index 891068b1dc..e242948c39 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,6 +44,7 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; @@ -51,22 +52,17 @@ import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.buffer.BufferFlags; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; -import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary; -import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.nodes.HiddenAttr; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.runtime.IndirectCallData; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -93,62 +89,8 @@ public void postInitialize(Python3Core core) { HiddenAttr.WriteNode.executeUncached(core.lookupType(PythonBuiltinClassType.Pickler), HiddenAttr.PICKLE_STATE, state); } - // types - @Builtin(name = "PickleBuffer", minNumOfPositionalArgs = 2, parameterNames = {"$cls", "object"}, constructsClass = PythonBuiltinClassType.PickleBuffer) - @GenerateNodeFactory - abstract static class ConstructPickleBufferNode extends PythonBinaryBuiltinNode { - @Specialization(limit = "3") - static PPickleBuffer construct(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object object, - @Cached("createFor(this)") IndirectCallData indirectCallData, - @CachedLibrary("object") PythonBufferAcquireLibrary acquireLib, - @Cached PythonObjectFactory factory) { - Object buffer = acquireLib.acquire(object, BufferFlags.PyBUF_FULL_RO, frame, indirectCallData); - return factory.createPickleBuffer(buffer); - } - } - - @Builtin(name = "Pickler", minNumOfPositionalArgs = 1, constructsClass = PythonBuiltinClassType.Pickler, takesVarArgs = true, takesVarKeywordArgs = true, declaresExplicitSelf = true) - @GenerateNodeFactory - abstract static class ConstructPicklerNode extends PythonVarargsBuiltinNode { - @Specialization - PPickler construct(Object cls, @SuppressWarnings("unused") Object[] arguments, @SuppressWarnings("unused") PKeyword[] keywords, - @Cached PythonObjectFactory factory) { - return factory.createPickler(cls); - } - } - - @Builtin(name = "PicklerMemoProxy", minNumOfPositionalArgs = 2, parameterNames = {"$cls", "pickler"}, constructsClass = PythonBuiltinClassType.PicklerMemoProxy) - @GenerateNodeFactory - abstract static class ConstructPicklerMemoProxyNode extends PythonBinaryBuiltinNode { - @Specialization - PPicklerMemoProxy construct(Object cls, PPickler pickler, - @Cached PythonObjectFactory factory) { - return factory.createPicklerMemoProxy(pickler, cls); - } - } - - @Builtin(name = "UnpicklerMemoProxy", minNumOfPositionalArgs = 2, parameterNames = {"$cls", "unpickler"}, constructsClass = PythonBuiltinClassType.UnpicklerMemoProxy) - @GenerateNodeFactory - abstract static class ConstructUnpicklerMemoProxyNode extends PythonBinaryBuiltinNode { - @Specialization - PUnpicklerMemoProxy construct(Object cls, PUnpickler unpickler, - @Cached PythonObjectFactory factory) { - return factory.createUnpicklerMemoProxy(unpickler, cls); - } - } - - @Builtin(name = "Unpickler", minNumOfPositionalArgs = 1, constructsClass = PythonBuiltinClassType.Unpickler, takesVarArgs = true, takesVarKeywordArgs = true, declaresExplicitSelf = true) - @GenerateNodeFactory - abstract static class ConstructUnpicklerNode extends PythonVarargsBuiltinNode { - @Specialization - PUnpickler construct(Object cls, @SuppressWarnings("unused") Object[] arguments, @SuppressWarnings("unused") PKeyword[] keywords, - @Cached PythonObjectFactory factory) { - return factory.createUnpickler(cls); - } - } - // methods - @Builtin(name = "dump", minNumOfPositionalArgs = 3, declaresExplicitSelf = true, varArgsMarker = true, // + @Builtin(name = "dump", minNumOfPositionalArgs = 3, declaresExplicitSelf = true, // parameterNames = {"$self", "obj", "file", "protocol"}, // keywordOnlyNames = {"fix_imports", "buffer_callback"}) @ArgumentClinic(name = "protocol", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = J_DEFAULT_PICKLE_PROTOCOL, useDefaultForNone = true) @@ -163,12 +105,12 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static Object dump(VirtualFrame frame, @SuppressWarnings("unused") PythonModule self, Object obj, Object file, int protocol, boolean fixImports, Object bufferCallback, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached PPickler.DumpNode dumpNode, @Cached PPickler.FlushToFileNode flushToFileNode, @Cached PyObjectLookupAttr lookup, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - PPickler pickler = factory.createPickler(); + @Cached PRaiseNode raiseNode) { + PPickler pickler = PFactory.createPickler(language); pickler.setProtocol(inliningTarget, raiseNode, protocol, fixImports); pickler.setOutputStream(frame, inliningTarget, raiseNode, lookup, file); pickler.setBufferCallback(inliningTarget, raiseNode, bufferCallback); @@ -178,7 +120,7 @@ static Object dump(VirtualFrame frame, @SuppressWarnings("unused") PythonModule } } - @Builtin(name = "dumps", minNumOfPositionalArgs = 2, declaresExplicitSelf = true, varArgsMarker = true, // + @Builtin(name = "dumps", minNumOfPositionalArgs = 2, declaresExplicitSelf = true, // parameterNames = {"$self", "obj", "protocol"}, // keywordOnlyNames = {"fix_imports", "buffer_callback"}) @ArgumentClinic(name = "protocol", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = J_DEFAULT_PICKLE_PROTOCOL, useDefaultForNone = true) @@ -193,18 +135,18 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static Object dump(VirtualFrame frame, @SuppressWarnings("unused") PythonModule self, Object obj, int protocol, boolean fixImports, Object bufferCallback, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached PPickler.DumpNode dumpNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - PPickler pickler = factory.createPickler(); + @Cached PRaiseNode raiseNode) { + PPickler pickler = PFactory.createPickler(language); pickler.setProtocol(inliningTarget, raiseNode, protocol, fixImports); pickler.setBufferCallback(inliningTarget, raiseNode, bufferCallback); dumpNode.execute(frame, pickler, obj); - return pickler.getString(factory); + return pickler.getString(language); } } - @Builtin(name = "load", minNumOfPositionalArgs = 2, declaresExplicitSelf = true, parameterNames = {"$self", "file"}, varArgsMarker = true, keywordOnlyNames = {"fix_imports", "encoding", "errors", + @Builtin(name = "load", minNumOfPositionalArgs = 2, declaresExplicitSelf = true, parameterNames = {"$self", "file"}, keywordOnlyNames = {"fix_imports", "encoding", "errors", "buffers"}) @ArgumentClinic(name = "fix_imports", conversion = ArgumentClinic.ClinicConversion.Boolean, defaultValue = "true") @ArgumentClinic(name = "encoding", conversion = ArgumentClinic.ClinicConversion.TString, defaultValue = "T_ASCII_UPPERCASE") @@ -220,12 +162,12 @@ protected ArgumentClinicProvider getArgumentClinic() { static Object load(VirtualFrame frame, @SuppressWarnings("unused") PythonModule self, Object file, @SuppressWarnings("unused") boolean fixImports, TruffleString encoding, TruffleString errors, Object buffers, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached PUnpickler.LoadNode loadNode, @Cached PyObjectLookupAttr lookup, @Cached PyObjectGetIter getIter, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - PUnpickler unpickler = factory.createUnpickler(); + @Cached PRaiseNode raiseNode) { + PUnpickler unpickler = PFactory.createUnpickler(language); unpickler.setInputStream(frame, inliningTarget, raiseNode, lookup, file); unpickler.setInputEncoding(encoding, errors); unpickler.setBuffers(frame, inliningTarget, getIter, buffers); @@ -233,7 +175,7 @@ static Object load(VirtualFrame frame, @SuppressWarnings("unused") PythonModule } } - @Builtin(name = "loads", minNumOfPositionalArgs = 2, declaresExplicitSelf = true, varArgsMarker = true, // + @Builtin(name = "loads", minNumOfPositionalArgs = 2, declaresExplicitSelf = true, // parameterNames = {"$self", "data"}, // keywordOnlyNames = {"fix_imports", "encoding", "errors", "buffers"}) @ArgumentClinic(name = "data", conversion = ArgumentClinic.ClinicConversion.ReadableBuffer) @@ -251,12 +193,12 @@ protected ArgumentClinicProvider getArgumentClinic() { static Object loads(VirtualFrame frame, @SuppressWarnings("unused") PythonModule self, Object buffer, boolean fixImports, TruffleString encoding, TruffleString errors, Object buffers, @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached("createFor(this)") IndirectCallData indirectCallData, @Cached PUnpickler.LoadNode loadNode, - @Cached PyObjectGetIter getIter, - @Cached PythonObjectFactory factory) { + @Cached PyObjectGetIter getIter) { try { - PUnpickler unpickler = factory.createUnpickler(); + PUnpickler unpickler = PFactory.createUnpickler(language); byte[] data = bufferLib.getCopiedByteArray(buffer); unpickler.setStringInput(data, data.length); unpickler.setInputEncoding(encoding, errors); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleState.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleState.java index 5f8e057b40..9d72cf64e9 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleState.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -99,7 +99,7 @@ public abstract static class PickleStateInitNode extends Node { @Specialization void init(PickleState state, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached PyObjectGetAttr getAttr, @Cached PyCallableCheckNode callableCheck) { PythonContext context = PythonContext.get(this); @@ -111,28 +111,28 @@ void init(PickleState state, if (dispatchTable instanceof PDict dispatchTableDict) { state.dispatchTable = dispatchTableDict; } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.S_SHOULD_BE_A_S_NOT_A_P, "copyreg.dispatch_table", "dict", dispatchTable); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.S_SHOULD_BE_A_S_NOT_A_P, "copyreg.dispatch_table", "dict", dispatchTable); } var extensionRegistry = getAttr.execute(null, inliningTarget, copyreg, PickleUtils.T_ATTR_EXT_REGISTRY); if (extensionRegistry instanceof PDict extensionRegistryDict) { state.extensionRegistry = extensionRegistryDict; } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.S_SHOULD_BE_A_S_NOT_A_P, "copyreg._extension_registry", "dict", extensionRegistry); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.S_SHOULD_BE_A_S_NOT_A_P, "copyreg._extension_registry", "dict", extensionRegistry); } var invertedRegistry = getAttr.execute(null, inliningTarget, copyreg, PickleUtils.T_ATTR_INV_REGISTRY); if (invertedRegistry instanceof PDict invertedRegistryDict) { state.invertedRegistry = invertedRegistryDict; } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.S_SHOULD_BE_A_S_NOT_A_P, "copyreg._inverted_registry", "dict", invertedRegistry); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.S_SHOULD_BE_A_S_NOT_A_P, "copyreg._inverted_registry", "dict", invertedRegistry); } var extensionCache = getAttr.execute(null, inliningTarget, copyreg, PickleUtils.T_ATTR_EXT_CACHE); if (extensionCache instanceof PDict extensionCacheDict) { state.extensionCache = extensionCacheDict; } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.S_SHOULD_BE_A_S_NOT_A_P, "copyreg._extension_cache", "dict", extensionCache); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.S_SHOULD_BE_A_S_NOT_A_P, "copyreg._extension_cache", "dict", extensionCache); } final Object codecs = importModule(PickleUtils.T_MOD_CODECS); @@ -140,7 +140,7 @@ void init(PickleState state, if (callableCheck.execute(inliningTarget, codecsEncode)) { state.codecsEncode = codecsEncode; } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.S_SHOULD_BE_A_S_NOT_A_P, "codecs.encode", "callable", codecsEncode); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.S_SHOULD_BE_A_S_NOT_A_P, "codecs.encode", "callable", codecsEncode); } final Object functools = importModule(PickleUtils.T_MOD_FUNCTOOLS); @@ -152,14 +152,14 @@ void init(PickleState state, if (nameMapping2To3 instanceof PDict nameMapping2To3Dict) { state.nameMapping2To3 = nameMapping2To3Dict; } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.S_SHOULD_BE_A_S_NOT_A_P, PickleUtils.T_CP_NAME_MAPPING, "dict", nameMapping2To3); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.S_SHOULD_BE_A_S_NOT_A_P, PickleUtils.T_CP_NAME_MAPPING, "dict", nameMapping2To3); } var importMapping2To3 = getAttr.execute(null, inliningTarget, compatPickle, PickleUtils.T_ATTR_IMPORT_MAPPING); if (importMapping2To3 instanceof PDict importMapping2To3Dict) { state.importMapping2To3 = importMapping2To3Dict; } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.S_SHOULD_BE_A_S_NOT_A_P, PickleUtils.T_CP_IMPORT_MAPPING, "dict", importMapping2To3); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.S_SHOULD_BE_A_S_NOT_A_P, PickleUtils.T_CP_IMPORT_MAPPING, "dict", importMapping2To3); } // ... and the 3.x -> 2.x mapping tables @@ -167,13 +167,13 @@ void init(PickleState state, if (nameMapping3To2 instanceof PDict nameMapping3To2Dict) { state.nameMapping3To2 = nameMapping3To2Dict; } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.S_SHOULD_BE_A_S_NOT_A_P, PickleUtils.T_CP_REVERSE_NAME_MAPPING, "dict", nameMapping3To2); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.S_SHOULD_BE_A_S_NOT_A_P, PickleUtils.T_CP_REVERSE_NAME_MAPPING, "dict", nameMapping3To2); } var importMapping3To2 = getAttr.execute(null, inliningTarget, compatPickle, PickleUtils.T_ATTR_REVERSE_IMPORT_MAPPING); if (importMapping3To2 instanceof PDict importMapping3To2Dict) { state.importMapping3To2 = importMapping3To2Dict; } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.S_SHOULD_BE_A_S_NOT_A_P, PickleUtils.T_CP_REVERSE_IMPORT_MAPPING, "dict", + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.S_SHOULD_BE_A_S_NOT_A_P, PickleUtils.T_CP_REVERSE_IMPORT_MAPPING, "dict", importMapping3To2); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleUtils.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleUtils.java index 6fcdb97251..ba48abdb2c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleUtils.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -50,6 +50,7 @@ import org.graalvm.collections.Pair; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.bytes.ByteArrayBuffer; @@ -60,7 +61,7 @@ import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.StringLiterals; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.frame.VirtualFrame; @@ -286,11 +287,11 @@ public static double asciiBytesToDouble(byte[] bytes) { } @TruffleBoundary - public static double asciiBytesToDouble(byte[] bytes, PRaiseNode raiseNode, PythonBuiltinClassType errorType) { + public static double asciiBytesToDouble(Node node, byte[] bytes, PythonBuiltinClassType errorType) { try { return asciiBytesToDouble(bytes); } catch (NumberFormatException nfe) { - throw raiseNode.raise(errorType); + throw PRaiseNode.raiseStatic(node, errorType); } } @@ -373,9 +374,9 @@ public static Pair initMethodRef(VirtualFrame frame, Node inlini } } - public static Object reconstructMethod(PythonObjectFactory factory, Object func, Object self) { + public static Object reconstructMethod(PythonLanguage language, Object func, Object self) { if (self != null) { - return factory.createMethod(self, func); + return PFactory.createMethod(language, self, func); } return func; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PicklerBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PicklerBuiltins.java index 5d1039854d..da974d38cc 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PicklerBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PicklerBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -50,12 +50,15 @@ import static com.oracle.graal.python.builtins.modules.pickle.PickleUtils.J_METHOD_PERSISTENT_ID; import static com.oracle.graal.python.builtins.modules.pickle.PickleUtils.T_ATTR_DISPATCH_TABLE; import static com.oracle.graal.python.builtins.modules.pickle.PickleUtils.T_METHOD_PERSISTENT_ID; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SIZEOF__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -69,7 +72,10 @@ import com.oracle.graal.python.builtins.objects.common.SequenceNodes; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.builtins.objects.dict.PDict; +import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyCallableCheckNode; import com.oracle.graal.python.lib.PyLongAsLongNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; @@ -83,8 +89,9 @@ import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -98,12 +105,28 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.Pickler) public class PicklerBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = PicklerBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return PicklerBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 2, declaresExplicitSelf = true, parameterNames = {"$self", "file", "protocol", "fix_imports", "buffer_callback"}) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "Pickler", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + abstract static class ConstructPicklerNode extends PythonVarargsBuiltinNode { + @Specialization + PPickler construct(Object cls, @SuppressWarnings("unused") Object[] arguments, @SuppressWarnings("unused") PKeyword[] keywords, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createPickler(language, cls, getInstanceShape.execute(cls)); + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "Pickler", minNumOfPositionalArgs = 2, parameterNames = {"$self", "file", "protocol", "fix_imports", "buffer_callback"}) @ArgumentClinic(name = "protocol", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = J_DEFAULT_PICKLE_PROTOCOL, useDefaultForNone = true) @ArgumentClinic(name = "fix_imports", conversion = ArgumentClinic.ClinicConversion.Boolean, defaultValue = "true") @GenerateNodeFactory @@ -117,7 +140,7 @@ protected ArgumentClinicProvider getArgumentClinic() { static Object init(VirtualFrame frame, PPickler self, Object file, int protocol, boolean fixImports, Object bufferCallback, @Bind("this") Node inliningTarget, @Cached PyObjectLookupAttr lookup, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { self.setProtocol(inliningTarget, raiseNode, protocol, fixImports); self.setOutputStream(frame, inliningTarget, raiseNode, lookup, file); self.setBufferCallback(inliningTarget, raiseNode, bufferCallback); @@ -136,9 +159,9 @@ static Object dump(VirtualFrame frame, PPickler self, Object obj, @Bind("this") Node inliningTarget, @Cached PPickler.FlushToFileNode flushToFileNode, @Cached PPickler.DumpNode dumpNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (self.getWrite() == null) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.PicklingError, ErrorMessages.INIT_CALLED_WITH, "Pickler", self); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.PicklingError, ErrorMessages.INIT_CALLED_WITH, "Pickler", self); } self.clearBuffer(); dumpNode.execute(frame, self, obj); @@ -174,10 +197,10 @@ public abstract static class PicklerDispatchTableNode extends PythonBuiltinNode @Specialization(guards = "isNoValue(none)") static Object get(PPickler self, @SuppressWarnings("unused") PNone none, @Bind("this") Node inliningTarget, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { final Object dispatchTable = self.getDispatchTable(); if (dispatchTable == null) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.AttributeError, T_ATTR_DISPATCH_TABLE); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.AttributeError, T_ATTR_DISPATCH_TABLE); } return dispatchTable; } @@ -185,10 +208,10 @@ static Object get(PPickler self, @SuppressWarnings("unused") PNone none, @Specialization(guards = "isDeleteMarker(marker)") static Object delete(PPickler self, @SuppressWarnings("unused") Object marker, @Bind("this") Node inliningTarget, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { final Object dispatchTable = self.getDispatchTable(); if (dispatchTable == null) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.AttributeError, T_ATTR_DISPATCH_TABLE); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.AttributeError, T_ATTR_DISPATCH_TABLE); } self.setDispatchTable(null); return PNone.NONE; @@ -244,8 +267,8 @@ Object set(VirtualFrame frame, PPickler self, Object value, public abstract static class PicklerMemoNode extends PythonBuiltinNode { @Specialization(guards = "isNoValue(none)") static Object get(PPickler self, @SuppressWarnings("unused") PNone none, - @Cached PythonObjectFactory factory) { - return factory.createPicklerMemoProxy(self); + @Bind PythonLanguage language) { + return PFactory.createPicklerMemoProxy(language, self); } @Specialization(guards = {"!isNoValue(obj)", "!isDeleteMarker(obj)"}) @@ -258,7 +281,7 @@ static Object set(VirtualFrame frame, PPickler self, Object obj, @Cached HashingStorageGetIterator getIter, @Cached HashingStorageIteratorNext iterNext, @Cached HashingStorageIteratorValue iterValue, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { MemoTable newMemo; if (obj instanceof PPicklerMemoProxy) { final PPickler pickler = ((PPicklerMemoProxy) obj).getPickler(); @@ -270,7 +293,7 @@ static Object set(VirtualFrame frame, PPickler self, Object obj, while (iterNext.execute(inliningTarget, dictStorage, it)) { Object value = iterValue.execute(inliningTarget, dictStorage, it); if (!(value instanceof PTuple) || sizeNode.execute(frame, inliningTarget, value) != 2) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.VALUES_MUST_BE_2TUPLES, "memo"); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.VALUES_MUST_BE_2TUPLES, "memo"); } SequenceStorage tupleStorage = getSequenceStorageNode.execute(inliningTarget, value); int memoId = asSizeNode.executeExact(frame, inliningTarget, getItemNode.execute(frame, tupleStorage, 0)); @@ -278,7 +301,7 @@ static Object set(VirtualFrame frame, PPickler self, Object obj, newMemo.set(memoObj, memoId); } } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_MUST_BE_A_OR_B_NOT_C, "memo", "PicklerMemoProxy", "dict", obj); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_MUST_BE_A_OR_B_NOT_C, "memo", "PicklerMemoProxy", "dict", obj); } self.setMemo(newMemo); return PNone.NONE; @@ -291,25 +314,25 @@ public abstract static class PicklerPersistentIdNode extends PythonBuiltinNode { @Specialization(guards = "isNoValue(none)") static Object get(PPickler self, @SuppressWarnings("unused") PNone none, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Exclusive @Cached PRaiseNode raiseNode) { final Object persFunc = self.getPersFunc(); if (persFunc == null) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.AttributeError, T_METHOD_PERSISTENT_ID); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.AttributeError, T_METHOD_PERSISTENT_ID); } - return PickleUtils.reconstructMethod(factory, persFunc, self.getPersFuncSelf()); + return PickleUtils.reconstructMethod(language, persFunc, self.getPersFuncSelf()); } @Specialization(guards = {"!isNoValue(obj)", "!isDeleteMarker(obj)"}) static Object set(PPickler self, Object obj, @Bind("this") Node inliningTarget, @Cached PyCallableCheckNode callableCheck, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (PGuards.isDeleteMarker(obj)) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ATRIBUTE_DELETION_NOT_SUPPORTED); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ATRIBUTE_DELETION_NOT_SUPPORTED); } if (!callableCheck.execute(inliningTarget, obj)) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_MUST_BE_A_CALLABLE, T_METHOD_PERSISTENT_ID, "one argument"); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_MUST_BE_A_CALLABLE, T_METHOD_PERSISTENT_ID, "one argument"); } self.setPersFuncSelf(null); self.setPersFunc(obj); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PicklerMemoProxyBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PicklerMemoProxyBuiltins.java index 98b6472d35..8a898b3f55 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PicklerMemoProxyBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PicklerMemoProxyBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,6 +45,10 @@ import java.util.LinkedHashMap; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -53,11 +57,14 @@ import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; @@ -65,11 +72,26 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PicklerMemoProxy) public class PicklerMemoProxyBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = PicklerMemoProxyBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return PicklerMemoProxyBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "PicklerMemoProxy", minNumOfPositionalArgs = 2, parameterNames = {"$cls", "pickler"}) + @GenerateNodeFactory + abstract static class ConstructPicklerMemoProxyNode extends PythonBinaryBuiltinNode { + @Specialization + PPicklerMemoProxy construct(Object cls, PPickler pickler, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createPicklerMemoProxy(language, pickler, cls, getInstanceShape.execute(cls)); + } + } + @Builtin(name = "clear", minNumOfPositionalArgs = 1, parameterNames = {"$self"}) @GenerateNodeFactory public abstract static class PicklerMemoProxyClearNode extends PythonUnaryBuiltinNode { @@ -82,16 +104,16 @@ Object clear(PPicklerMemoProxy self) { } @TruffleBoundary - public static PDict picklerMemoCopyImpl(PythonContext context, MemoTable memoTable) { - PythonObjectFactory factory = context.factory(); + public static PDict picklerMemoCopyImpl(MemoTable memoTable) { + PythonLanguage language = PythonLanguage.get(null); LinkedHashMap copy = new LinkedHashMap<>(); MemoIterator iterator = memoTable.iterator(); while (iterator.advance()) { copy.put(System.identityHashCode(iterator.key()), - factory.createTuple(new Object[]{iterator.value(), iterator.key()})); + PFactory.createTuple(language, new Object[]{iterator.value(), iterator.key()})); } - return factory.createDictFromMapGeneric(copy); + return PFactory.createDictFromMapGeneric(language, copy); } @Builtin(name = "copy", minNumOfPositionalArgs = 1, parameterNames = {"$self"}) @@ -100,7 +122,7 @@ public abstract static class PicklerMemoProxyCopyNode extends PythonUnaryBuiltin @Specialization Object copy(PPicklerMemoProxy self) { final MemoTable memoTable = self.getPickler().getMemo(); - return picklerMemoCopyImpl(getContext(), memoTable); + return picklerMemoCopyImpl(memoTable); } } @@ -108,12 +130,12 @@ Object copy(PPicklerMemoProxy self) { @GenerateNodeFactory public abstract static class PicklerMemoProxyReduceNode extends PythonUnaryBuiltinNode { @Specialization - Object reduce(PPicklerMemoProxy self, - @Cached PythonObjectFactory factory) { + static Object reduce(PPicklerMemoProxy self, + @Bind PythonLanguage language) { final MemoTable memoTable = self.getPickler().getMemo(); - final PDict dictMemoCopy = picklerMemoCopyImpl(getContext(), memoTable); - final PTuple dictArgs = factory.createTuple(new Object[]{dictMemoCopy}); - return factory.createTuple(new Object[]{PythonBuiltinClassType.PDict, dictArgs}); + final PDict dictMemoCopy = picklerMemoCopyImpl(memoTable); + final PTuple dictArgs = PFactory.createTuple(language, new Object[]{dictMemoCopy}); + return PFactory.createTuple(language, new Object[]{PythonBuiltinClassType.PDict, dictArgs}); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PicklerNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PicklerNodes.java index 8efe7a0d89..cb5d060406 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PicklerNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PicklerNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -57,13 +57,11 @@ import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; -import com.oracle.graal.python.lib.PyObjectSetItem; import org.graalvm.collections.Pair; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.modules.BuiltinConstructors; -import com.oracle.graal.python.builtins.modules.BuiltinConstructorsFactory; import com.oracle.graal.python.builtins.modules.CodecsModuleBuiltins; import com.oracle.graal.python.builtins.modules.CodecsModuleBuiltinsFactory; import com.oracle.graal.python.builtins.objects.PNone; @@ -84,10 +82,12 @@ import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.lib.PyIterCheckNode; import com.oracle.graal.python.lib.PyIterNextNode; +import com.oracle.graal.python.lib.PyLongFromUnicodeObject; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyObjectGetItem; import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode; +import com.oracle.graal.python.lib.PyObjectSetItem; import com.oracle.graal.python.lib.PyObjectSizeNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.HiddenAttr; @@ -96,7 +96,7 @@ import com.oracle.graal.python.nodes.argument.keywords.ExpandKeywordStarargsNode; import com.oracle.graal.python.nodes.argument.keywords.ExpandKeywordStarargsNodeGen; import com.oracle.graal.python.nodes.argument.positional.ExecutePositionalStarargsNode; -import com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode; +import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.InlineIsBuiltinClassProfile; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; @@ -104,13 +104,13 @@ import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; -import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.BranchProfile; import com.oracle.truffle.api.strings.TruffleString; public final class PicklerNodes { @@ -127,7 +127,6 @@ abstract static class BasePickleNode extends Node { @SuppressWarnings("FieldMayBeFinal") @Child private PyIterNextNode getNextNode = PyIterNextNode.create(); @Child CastToTruffleStringNode toStringNode = CastToTruffleStringNode.create(); - @Child private PythonObjectFactory objectFactory; @Child private HiddenAttr.ReadNode readHiddenAttributeNode; @Child private IsBuiltinObjectProfile errProfile; @Child private InlineIsBuiltinClassProfile isBuiltinClassProfile; @@ -138,10 +137,10 @@ abstract static class BasePickleNode extends Node { @Child private PyNumberAsSizeNode asSizeNode; @Child private CastToTruffleStringNode castToTruffleStringNode; @Child private SequenceNodes.GetSequenceStorageNode getSequenceStorageNode; - @Child private CallVarargsMethodNode callVarargsMethodNode; + @Child private CallNode callNode; @Child private ExecutePositionalStarargsNode getArgsNode; @Child private ExpandKeywordStarargsNode getKwArgsNode; - @Child private BuiltinConstructors.IntNode intNode; + @Child private PyLongFromUnicodeObject pyLongFromUnicodeObject; @Child private CodecsModuleBuiltins.CodecsDecodeNode codecsDecodeNode; @Child private CodecsModuleBuiltins.CodecsEscapeDecodeNode codecsEscapeDecodeNode; @Child private CodecsModuleBuiltins.CodecsEncodeNode codecsEncodeNode; @@ -165,30 +164,21 @@ abstract static class BasePickleNode extends Node { @Child private HashingStorageIteratorNext hashingStorageItNext; @Child private HashingStorageIteratorKey hashingStorageItKey; @Child private HashingStorageIteratorValue hashingStorageItValue; - @Child private PRaiseNode raiseNode; - - protected final PRaiseNode getRaiseNode() { - if (raiseNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - if (isAdoptable()) { - raiseNode = insert(PRaiseNode.create()); - } else { - raiseNode = PRaiseNode.getUncached(); - } - } - return raiseNode; - } + private final BranchProfile errorProfile = BranchProfile.create(); protected PException raise(PythonBuiltinClassType type, TruffleString string) { - return getRaiseNode().raise(type, string); + errorProfile.enter(); + return PRaiseNode.raiseStatic(this, type, string); } protected PException raise(PythonBuiltinClassType exceptionType) { - return getRaiseNode().raise(exceptionType); + errorProfile.enter(); + return PRaiseNode.raiseStatic(this, exceptionType); } protected final PException raise(PythonBuiltinClassType type, TruffleString format, Object... arguments) { - return getRaiseNode().raise(type, format, arguments); + errorProfile.enter(); + return PRaiseNode.raiseStatic(this, type, format, arguments); } protected TruffleString.FromByteArrayNode ensureTsFromByteArray() { @@ -319,14 +309,6 @@ protected HashingStorageIteratorValue ensureHashingStorageIteratorValue() { return hashingStorageItValue; } - protected final PythonObjectFactory factory() { - if (objectFactory == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - objectFactory = insert(PythonObjectFactory.create()); - } - return objectFactory; - } - protected int length(VirtualFrame frame, Object object) { if (sizeNode == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); @@ -368,15 +350,15 @@ protected CodecsModuleBuiltins.CodecsEscapeDecodeNode ensureEscapeDecodeNode() { } protected Object unicodeRawDecodeEscape(VirtualFrame frame, byte[] bytes, int len) { - return decode(frame, factory().createBytes(bytes, 0, len), T_CODEC_RAW_UNICODE_ESCAPE); + return decode(frame, PFactory.createBytes(PythonLanguage.get(this), bytes, len), T_CODEC_RAW_UNICODE_ESCAPE); } protected Object decodeASCII(VirtualFrame frame, byte[] bytes, int len, TruffleString errors) { - return decode(frame, factory().createBytes(bytes, 0, len), T_CODEC_ASCII, errors); + return decode(frame, PFactory.createBytes(PythonLanguage.get(this), bytes, len), T_CODEC_ASCII, errors); } protected Object decodeUTF8(VirtualFrame frame, ByteArrayView bytes, int len, TruffleString errors) { - return decode(frame, factory().createBytes(bytes.getBytes(len), 0, len), T_UTF8, errors); + return decode(frame, PFactory.createBytes(PythonLanguage.get(this), bytes.getBytes(len), len), T_UTF8, errors); } protected Object decode(VirtualFrame frame, Object value, TruffleString encoding) { @@ -387,35 +369,28 @@ protected Object decode(VirtualFrame frame, Object value, TruffleString encoding return getItem(frame, ensureCodecsDecodeNode().call(frame, value, encoding, errors, false), 0); } - protected Object escapeDecode(VirtualFrame frame, PythonObjectFactory factory, byte[] data, int offset, int len) { - if (len == 0) { - return factory.createEmptyBytes(); - } - return escapeDecode(frame, PythonUtils.arrayCopyOfRange(data, offset, offset + len)); - } - protected Object escapeDecode(VirtualFrame frame, byte[] data) { return getItem(frame, ensureEscapeDecodeNode().execute(frame, data, T_ERRORS_STRICT), 0); } - protected Object parseInt(VirtualFrame frame, byte[] bytes) { - return parseInt(frame, PickleUtils.getValidIntString(bytes)); + protected Object parseInt(byte[] bytes) { + return parseInt(PickleUtils.getValidIntString(bytes)); } - protected Object parseInt(VirtualFrame frame, TruffleString number) { - if (intNode == null) { + protected Object parseInt(TruffleString number) { + if (pyLongFromUnicodeObject == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); - intNode = insert(BuiltinConstructorsFactory.IntNodeFactory.create()); + pyLongFromUnicodeObject = insert(PyLongFromUnicodeObject.create()); } - return intNode.executeWith(frame, number); + return pyLongFromUnicodeObject.executeCached(number, 0); } - protected CallVarargsMethodNode ensureCallVarargsNode() { - if (callVarargsMethodNode == null) { + protected CallNode ensureCallNode() { + if (callNode == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); - callVarargsMethodNode = insert(CallVarargsMethodNode.create()); + callNode = insert(CallNode.create()); } - return callVarargsMethodNode; + return callNode; } protected ExecutePositionalStarargsNode ensureGetArgsNode() { @@ -470,25 +445,8 @@ protected Object getClass(Frame frame, Object object) { return cls; } - protected Object callNew(VirtualFrame frame, Object tpNew, Object cls) { - return ensureCallVarargsNode().execute(frame, tpNew, new Object[]{cls}, PKeyword.EMPTY_KEYWORDS); - } - - protected Object callNew(VirtualFrame frame, Object tpNew, Object cls, Object args) { - return callNew(frame, tpNew, cls, args, null); - } - - protected Object callNew(VirtualFrame frame, Object tpNew, Object cls, Object args, Object kwargs) { - final Object[] stargs = ensureGetArgsNode().executeWith(frame, args); - final Object[] newArgs = new Object[stargs.length + 1]; - newArgs[0] = cls; - PythonUtils.arraycopy(stargs, 0, newArgs, 1, stargs.length); - PKeyword[] keywords = kwargs == null ? PKeyword.EMPTY_KEYWORDS : ensureExpandKwArgsNode().executeCached(kwargs); - return ensureCallVarargsNode().execute(frame, tpNew, newArgs, keywords); - } - protected Object call(VirtualFrame frame, Object method, Object... args) { - return ensureCallVarargsNode().execute(frame, method, args, PKeyword.EMPTY_KEYWORDS); + return ensureCallNode().execute(frame, method, args, PKeyword.EMPTY_KEYWORDS); } protected Object callStarArgs(VirtualFrame frame, Object method, Object args) { @@ -497,7 +455,7 @@ protected Object callStarArgs(VirtualFrame frame, Object method, Object args) { protected Object callStarArgsAndKwArgs(VirtualFrame frame, Object method, Object args, Object kwargs) { PKeyword[] keywords = kwargs == null ? PKeyword.EMPTY_KEYWORDS : ensureExpandKwArgsNode().executeCached(kwargs); - return ensureCallVarargsNode().execute(frame, method, ensureGetArgsNode().executeWith(frame, args), keywords); + return ensureCallNode().execute(frame, method, ensureGetArgsNode().executeWith(frame, args), keywords); } protected SequenceStorage getSequenceStorage(Object iterator) { @@ -584,7 +542,7 @@ protected boolean isBuiltinClass(Object cls, PythonBuiltinClassType type) { } public Object getNextItem(VirtualFrame frame, Object iterator) { - return getNextNode.execute(frame, iterator); + return getNextNode.executeCached(frame, iterator); } public Object getItem(VirtualFrame frame, SequenceStorage storage, int i) { @@ -684,7 +642,7 @@ protected Pair get2To3Mapping(VirtualFrame frame, private Pair getMapping(VirtualFrame frame, PDict nameMapping, PDict importMapping, TruffleString nameMappingLabel, TruffleString importMappingLabel, TruffleString moduleName, TruffleString globalName) { - Object key = factory().createTuple(new Object[]{moduleName, globalName}); + Object key = PFactory.createTuple(PythonLanguage.get(this), new Object[]{moduleName, globalName}); Object item = getDictItem(frame, nameMapping, key); if (item != null) { if (!(item instanceof PTuple) || length(frame, item) != 2) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/UnpicklerBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/UnpicklerBuiltins.java index 76f15c478e..031b57d333 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/UnpicklerBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/UnpicklerBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,11 +45,14 @@ import static com.oracle.graal.python.builtins.modules.pickle.PickleUtils.J_METHOD_LOAD; import static com.oracle.graal.python.builtins.modules.pickle.PickleUtils.J_METHOD_PERSISTENT_LOAD; import static com.oracle.graal.python.builtins.modules.pickle.PickleUtils.T_METHOD_PERSISTENT_LOAD; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -62,6 +65,9 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIteratorNext; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIteratorValue; import com.oracle.graal.python.builtins.objects.dict.PDict; +import com.oracle.graal.python.builtins.objects.function.PKeyword; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyCallableCheckNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyObjectGetIter; @@ -75,8 +81,9 @@ import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; @@ -89,14 +96,28 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.Unpickler) public class UnpicklerBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = UnpicklerBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return UnpicklerBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 2, declaresExplicitSelf = true, parameterNames = {"$self", "file"}, varArgsMarker = true, keywordOnlyNames = {"fix_imports", "encoding", - "errors", - "buffers"}) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "Unpickler", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + abstract static class ConstructUnpicklerNode extends PythonVarargsBuiltinNode { + @Specialization + PUnpickler construct(Object cls, @SuppressWarnings("unused") Object[] arguments, @SuppressWarnings("unused") PKeyword[] keywords, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createUnpickler(language, cls, getInstanceShape.execute(cls)); + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "Unpickler", minNumOfPositionalArgs = 2, parameterNames = {"$self", "file"}, keywordOnlyNames = {"fix_imports", "encoding", "errors", "buffers"}) @ArgumentClinic(name = "fix_imports", conversion = ArgumentClinic.ClinicConversion.Boolean, defaultValue = "true") @ArgumentClinic(name = "encoding", conversion = ArgumentClinic.ClinicConversion.TString, defaultValue = "T_ASCII_UPPERCASE") @ArgumentClinic(name = "errors", conversion = ArgumentClinic.ClinicConversion.TString, defaultValue = "T_STRICT") @@ -112,7 +133,7 @@ static Object load(VirtualFrame frame, PUnpickler self, Object file, boolean fix @Bind("this") Node inliningTarget, @Cached PyObjectLookupAttr lookup, @Cached PyObjectGetIter getIter, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { self.setInputStream(frame, inliningTarget, raiseNode, lookup, file); self.setInputEncoding(encoding, errors); self.setBuffers(frame, inliningTarget, getIter, buffers); @@ -131,9 +152,9 @@ public abstract static class UnpicklerLoadNode extends PythonUnaryBuiltinNode { static Object load(VirtualFrame frame, PUnpickler self, @Bind("this") Node inliningTarget, @Cached PUnpickler.LoadNode loadNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (self.getRead() == null) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.UnpicklingError, ErrorMessages.INIT_CALLED_WITH, "Unpickler", self); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.UnpicklingError, ErrorMessages.INIT_CALLED_WITH, "Unpickler", self); } return loadNode.execute(frame, self); } @@ -162,25 +183,25 @@ public abstract static class UnpicklerPersistentLoadNode extends PythonBuiltinNo @Specialization(guards = "isNoValue(none)") static Object get(PUnpickler self, @SuppressWarnings("unused") PNone none, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Exclusive @Cached PRaiseNode raiseNode) { final Object persFunc = self.getPersFunc(); if (persFunc == null) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.AttributeError, T_METHOD_PERSISTENT_LOAD); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.AttributeError, T_METHOD_PERSISTENT_LOAD); } - return PickleUtils.reconstructMethod(factory, persFunc, self.getPersFuncSelf()); + return PickleUtils.reconstructMethod(language, persFunc, self.getPersFuncSelf()); } @Specialization(guards = "!isNoValue(obj)") static Object set(PUnpickler self, Object obj, @Bind("this") Node inliningTarget, @Cached PyCallableCheckNode callableCheck, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (PGuards.isDeleteMarker(obj)) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ATRIBUTE_DELETION_NOT_SUPPORTED); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ATRIBUTE_DELETION_NOT_SUPPORTED); } if (!callableCheck.execute(inliningTarget, obj)) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_MUST_BE_A_CALLABLE, T_METHOD_PERSISTENT_LOAD, "one argument"); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_MUST_BE_A_CALLABLE, T_METHOD_PERSISTENT_LOAD, "one argument"); } self.setPersFuncSelf(null); self.setPersFunc(obj); @@ -193,8 +214,8 @@ static Object set(PUnpickler self, Object obj, public abstract static class UnpicklerMemoNode extends PythonBuiltinNode { @Specialization(guards = "isNoValue(none)") static Object get(PUnpickler self, @SuppressWarnings("unused") PNone none, - @Cached PythonObjectFactory factory) { - return factory.createUnpicklerMemoProxy(self); + @Bind PythonLanguage language) { + return PFactory.createUnpicklerMemoProxy(language, self); } @Specialization(guards = {"!isNoValue(obj)", "!isDeleteMarker(obj)"}) @@ -206,7 +227,7 @@ static Object set(VirtualFrame frame, PUnpickler self, Object obj, @Cached HashingStorageIteratorNext storageIterNext, @Cached HashingStorageIteratorKey storageIterKey, @Cached HashingStorageIteratorValue storageIterValue, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (obj instanceof PUnpicklerMemoProxy) { final PUnpickler unpickler = ((PUnpicklerMemoProxy) obj).getUnpickler(); self.setMemo(unpickler.getMemoCopy()); @@ -218,16 +239,16 @@ static Object set(VirtualFrame frame, PUnpickler self, Object obj, Object key = storageIterKey.execute(inliningTarget, dictStorage, it); Object value = storageIterValue.execute(inliningTarget, dictStorage, it); if (!PGuards.canBeInteger(key)) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.MEMO_KEY_MUST_BE_INT); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.MEMO_KEY_MUST_BE_INT); } final int idx = asSizeNode.executeExact(frame, inliningTarget, key); if (idx < 0) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.MEMO_KEY_MUST_BE_POS_INT); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.MEMO_KEY_MUST_BE_POS_INT); } self.memoPut(idx, value); } } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_MUST_BE_A_OR_B_NOT_C, "memo", "UnpicklerMemoProxy", "dict", obj); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_MUST_BE_A_OR_B_NOT_C, "memo", "UnpicklerMemoProxy", "dict", obj); } return PNone.NONE; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/UnpicklerMemoProxyBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/UnpicklerMemoProxyBuiltins.java index 9e01a285b2..edbe793674 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/UnpicklerMemoProxyBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/UnpicklerMemoProxyBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,6 +44,10 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -52,9 +56,12 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItem; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -64,11 +71,26 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.UnpicklerMemoProxy) public class UnpicklerMemoProxyBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = UnpicklerMemoProxyBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return UnpicklerMemoProxyBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "UnpicklerMemoProxy", minNumOfPositionalArgs = 2, parameterNames = {"$cls", "unpickler"}) + @GenerateNodeFactory + abstract static class ConstructUnpicklerMemoProxyNode extends PythonBinaryBuiltinNode { + @Specialization + PUnpicklerMemoProxy construct(Object cls, PUnpickler unpickler, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createUnpicklerMemoProxy(language, unpickler, cls, getInstanceShape.execute(cls)); + } + } + @Builtin(name = "clear", minNumOfPositionalArgs = 1, parameterNames = {"$self"}) @GenerateNodeFactory public abstract static class UnpicklerMemoProxyClearNode extends PythonUnaryBuiltinNode { @@ -86,8 +108,8 @@ public abstract static class UnpicklerMemoProxyCopyNode extends PythonUnaryBuilt Object copy(PUnpicklerMemoProxy self, @Bind("this") Node inliningTarget, @Cached HashingStorageSetItem setItem, - @Cached PythonObjectFactory factory) { - return factory.createDict(self.getUnpickler().copyMemoToHashingStorage(inliningTarget, setItem)); + @Bind PythonLanguage language) { + return PFactory.createDict(language, self.getUnpickler().copyMemoToHashingStorage(inliningTarget, setItem)); } } @@ -98,10 +120,10 @@ public abstract static class UnpicklerMemoProxyReduceNode extends PythonUnaryBui Object reduce(PUnpicklerMemoProxy self, @Bind("this") Node inliningTarget, @Cached HashingStorageSetItem setItem, - @Cached PythonObjectFactory factory) { - final PDict dictMemoCopy = factory.createDict(self.getUnpickler().copyMemoToHashingStorage(inliningTarget, setItem)); - final PTuple constructorArgs = factory.createTuple(new Object[]{dictMemoCopy}); - return factory.createTuple(new Object[]{PythonBuiltinClassType.PDict, constructorArgs}); + @Bind PythonLanguage language) { + final PDict dictMemoCopy = PFactory.createDict(language, self.getUnpickler().copyMemoToHashingStorage(inliningTarget, setItem)); + final PTuple constructorArgs = PFactory.createTuple(language, new Object[]{dictMemoCopy}); + return PFactory.createTuple(language, new Object[]{PythonBuiltinClassType.PDict, constructorArgs}); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZLibCompObject.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZLibCompObject.java index 2254eba7f8..2cd7ea0328 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZLibCompObject.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZLibCompObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,8 +40,6 @@ */ package com.oracle.graal.python.builtins.modules.zlib; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ZlibCompress; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ZlibDecompress; import static com.oracle.graal.python.builtins.modules.zlib.ZLibModuleBuiltins.MAX_WBITS; import static com.oracle.graal.python.builtins.objects.bytes.BytesUtils.mask; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ZLibError; @@ -51,12 +49,13 @@ import java.util.zip.Deflater; import java.util.zip.Inflater; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.runtime.NFIZlibSupport; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.nodes.Node; @@ -77,7 +76,7 @@ public ZLibCompObject(Object cls, Shape instanceShape) { this.unconsumedTail = null; } - // Note: some IDEs mark this class as inaccessible in PythonObjectFactory, but changing this to + // Note: some IDEs mark this class as inaccessible in PFactory, but changing this to // public will cause a warning: [this-escape] possible 'this' escape before subclass is fully // initialized protected static class NativeZlibCompObject extends ZLibCompObject { @@ -176,7 +175,7 @@ public void setInflaterInput(byte[] data, int length, Node node) { } @TruffleBoundary - public ZLibCompObject copyCompressObj(PythonObjectFactory factory) { + public ZLibCompObject copyCompressObj() { assert canCopy; Deflater deflater = new Deflater(level, wbits < 0 || wbits > (MAX_WBITS + 9)); @@ -184,7 +183,7 @@ public ZLibCompObject copyCompressObj(PythonObjectFactory factory) { if (zdict.length > 0) { deflater.setDictionary(zdict); } - ZLibCompObject obj = factory.createJavaZLibCompObject(ZlibCompress, deflater, level, wbits, strategy, zdict); + ZLibCompObject obj = PFactory.createJavaZLibCompObjectCompress(PythonLanguage.get(null), deflater, level, wbits, strategy, zdict); if (inputData != null) { // feed the new copy of deflater the same input data ((JavaZlibCompObject) obj).setDeflaterInput(inputData, inputLen); @@ -194,14 +193,14 @@ public ZLibCompObject copyCompressObj(PythonObjectFactory factory) { } @TruffleBoundary - public ZLibCompObject copyDecompressObj(PythonObjectFactory factory, Node node) { + public ZLibCompObject copyDecompressObj(Node node) { assert canCopy; boolean isRAW = wbits < 0; Inflater inflater = new Inflater(isRAW || wbits > (MAX_WBITS + 9)); if (isRAW && zdict.length > 0) { inflater.setDictionary(zdict); } - ZLibCompObject obj = factory.createJavaZLibCompObject(ZlibDecompress, inflater, wbits, zdict); + ZLibCompObject obj = PFactory.createJavaZLibCompObjectDecompress(PythonLanguage.get(null), inflater, wbits, zdict); if (inputData != null) { try { ((JavaZlibCompObject) obj).setInflaterInput(inputData, inputLen, node); @@ -243,12 +242,12 @@ private static int gzipHeader(byte[] bytes, Node node) { int idx = 0; // Check header magic if (readShort(bytes, idx, crc) != GZIP_MAGIC) { - throw PRaiseNode.raiseUncached(node, ZLibError, ErrorMessages.NOT_IN_GZIP_FORMAT); + throw PRaiseNode.raiseStatic(node, ZLibError, ErrorMessages.NOT_IN_GZIP_FORMAT); } idx += 2; // Check compression method if (getValue(bytes[idx++], crc) != 8) { - throw PRaiseNode.raiseUncached(node, ZLibError, ErrorMessages.UNSUPPORTED_COMPRESSION_METHOD); + throw PRaiseNode.raiseStatic(node, ZLibError, ErrorMessages.UNSUPPORTED_COMPRESSION_METHOD); } // Read flags int flg = getValue(bytes[idx++], crc); @@ -279,7 +278,7 @@ private static int gzipHeader(byte[] bytes, Node node) { if ((flg & FHCRC) == FHCRC) { int v = (int) crc.getValue() & 0xffff; if (readShort(bytes, idx, crc) != v) { - throw PRaiseNode.raiseUncached(node, ZLibError, ErrorMessages.CORRUPT_GZIP_HEADER); + throw PRaiseNode.raiseStatic(node, ZLibError, ErrorMessages.CORRUPT_GZIP_HEADER); } idx += 2; n += 2; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZLibModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZLibModuleBuiltins.java index 8c7166019e..b0986e0b33 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZLibModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZLibModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,8 +41,6 @@ package com.oracle.graal.python.builtins.modules.zlib; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ZlibCompress; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ZlibDecompress; import static com.oracle.graal.python.builtins.modules.zlib.ZlibNodes.Z_OK; import static com.oracle.graal.python.nodes.ErrorMessages.EXPECTED_BYTESLIKE_GOT_P; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; @@ -59,6 +57,7 @@ import java.util.zip.Deflater; import java.util.zip.Inflater; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ClinicConverterFactory; import com.oracle.graal.python.annotations.ClinicConverterFactory.UseDefaultForNone; @@ -87,14 +86,12 @@ import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentCastNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.NFIZlibSupport; import com.oracle.graal.python.runtime.NativeLibrary; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -108,7 +105,6 @@ import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.NonIdempotent; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; @@ -312,8 +308,8 @@ static byte[] doMemView(VirtualFrame frame, PMemoryView bytesLike, @Fallback static byte[] error(@SuppressWarnings("unused") VirtualFrame frame, Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, value); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, value); } @ClinicConverterFactory @@ -389,8 +385,8 @@ static long doJavaObject(VirtualFrame frame, Object data, int value, @Fallback static long error(Object data, @SuppressWarnings("unused") Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, EXPECTED_BYTESLIKE_GOT_P, data); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, EXPECTED_BYTESLIKE_GOT_P, data); } long nativeCrc32(byte[] bytes, int len, int value, @@ -404,7 +400,6 @@ long nativeCrc32(byte[] bytes, int len, int value, // zlib.adler32(data[, value]) @Builtin(name = "adler32", minNumOfPositionalArgs = 1, numOfPositionalOnlyArgs = 2, parameterNames = {"data", "value"}) @ArgumentClinic(name = "value", conversionClass = ZLibModuleBuiltins.ExpectIntNode.class, defaultValue = "PNone.NO_VALUE", useDefaultForNone = true) - @TypeSystemReference(PythonArithmeticTypes.class) @GenerateNodeFactory public abstract static class Adler32Node extends PythonBinaryClinicBuiltinNode { @@ -510,15 +505,15 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static PBytes compress(VirtualFrame frame, Object buffer, int level, int wbits, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @Cached("createFor(this)") IndirectCallData indirectCallData, - @Cached CompressInnerNode innerNode, - @Cached PythonObjectFactory factory) { + @Cached CompressInnerNode innerNode) { try { byte[] bytes = bufferLib.getInternalOrCopiedByteArray(buffer); int len = bufferLib.getBufferLength(buffer); byte[] resultArray = innerNode.execute(inliningTarget, bytes, len, level, wbits); - return factory.createBytes(resultArray); + return PFactory.createBytes(language, resultArray); } finally { bufferLib.release(buffer, frame, indirectCallData); } @@ -574,19 +569,19 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static PBytes decompress(VirtualFrame frame, Object buffer, int wbits, int bufsize, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @Cached("createFor(this)") IndirectCallData indirectCallData, @Cached DecompressInnerNode innerNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { if (bufsize < 0) { - throw raiseNode.get(inliningTarget).raise(ZLibError, ErrorMessages.MUST_BE_NON_NEGATIVE, "bufsize"); + throw raiseNode.raise(inliningTarget, ZLibError, ErrorMessages.MUST_BE_NON_NEGATIVE, "bufsize"); } byte[] bytes = bufferLib.getInternalOrCopiedByteArray(buffer); int len = bufferLib.getBufferLength(buffer); byte[] resultArray = innerNode.execute(inliningTarget, bytes, len, wbits, bufsize); - return factory.createBytes(resultArray); + return PFactory.createBytes(language, resultArray); } finally { bufferLib.release(buffer, frame, indirectCallData); } @@ -624,14 +619,14 @@ static byte[] doJava(Node inliningTarget, byte[] bytes, int length, int wbits, i while (!decompresser.finished()) { int howmany = decompresser.inflate(resultArray); if (howmany == 0 && decompresser.needsInput()) { - throw PRaiseNode.raiseUncached(inliningTarget, ZLibError, ErrorMessages.ERROR_5_WHILE_DECOMPRESSING); + throw PRaiseNode.raiseStatic(inliningTarget, ZLibError, ErrorMessages.ERROR_5_WHILE_DECOMPRESSING); } baos.write(resultArray, 0, howmany); } decompresser.end(); return baos.toByteArray(); } catch (DataFormatException e) { - throw PRaiseNode.raiseUncached(inliningTarget, ZLibError, ErrorMessages.WHILE_PREPARING_TO_S_DATA, "decompress"); + throw PRaiseNode.raiseStatic(inliningTarget, ZLibError, ErrorMessages.WHILE_PREPARING_TO_S_DATA, "decompress"); } } } @@ -667,10 +662,10 @@ protected static boolean isValidWBitRange(int wbits) { @Specialization(guards = {"method == DEFLATED", "useNative()"}) static Object doNative(int level, int method, int wbits, int memLevel, int strategy, byte[] zdict, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached NativeLibrary.InvokeNativeFunction createCompObject, @Cached NativeLibrary.InvokeNativeFunction compressObjInit, - @Cached ZlibNodes.ZlibNativeErrorHandling errorHandling, - @Cached PythonObjectFactory factory) { + @Cached ZlibNodes.ZlibNativeErrorHandling errorHandling) { NFIZlibSupport zlibSupport = PythonContext.get(inliningTarget).getNFIZlibSupport(); Object zst = zlibSupport.createCompObject(createCompObject); @@ -684,7 +679,7 @@ static Object doNative(int level, int method, int wbits, int memLevel, int strat if (err != Z_OK) { errorHandling.execute(inliningTarget, zst, err, zlibSupport, true); } - return factory.createNativeZLibCompObject(ZlibCompress, zst, zlibSupport); + return PFactory.createNativeZLibCompObjectCompress(language, zst, zlibSupport); } /** @@ -703,21 +698,21 @@ static Object doJava(int level, @SuppressWarnings("unused") int method, int wbit if (zdict.length > 0) { deflater.setDictionary(zdict); } - return PythonObjectFactory.getUncached().createJavaZLibCompObject(ZlibCompress, deflater, level, wbits, strategy, zdict); + return PFactory.createJavaZLibCompObjectCompress(PythonLanguage.get(null), deflater, level, wbits, strategy, zdict); } @SuppressWarnings("unused") @Specialization(guards = {"method == DEFLATED", "!useNative()", "!isValidWBitRange(wbits)"}) static Object invalid(int level, int method, int wbits, int memLevel, int strategy, byte[] zdict, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.ValueError, ErrorMessages.INVALID_INITIALIZATION_OPTION); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.INVALID_INITIALIZATION_OPTION); } @SuppressWarnings("unused") @Specialization(guards = {"method != DEFLATED"}) static Object methodErr(int level, int method, int wbits, int memLevel, int strategy, byte[] zdict, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.ValueError, ErrorMessages.ONLY_DEFLATED_ALLOWED_AS_METHOD, DEFLATED, method); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.ONLY_DEFLATED_ALLOWED_AS_METHOD, DEFLATED, method); } } @@ -742,30 +737,30 @@ protected static boolean isValidWBitRange(int wbits) { } @Specialization(guards = {"useNative()"}) - Object doNative(int wbits, byte[] zdict, + static Object doNative(int wbits, byte[] zdict, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached NativeLibrary.InvokeNativeFunction createCompObject, @Cached NativeLibrary.InvokeNativeFunction decompressObjInit, - @Cached ZlibNodes.ZlibNativeErrorHandling errorHandling, - @Cached PythonObjectFactory factory) { - NFIZlibSupport zlibSupport = PythonContext.get(this).getNFIZlibSupport(); + @Cached ZlibNodes.ZlibNativeErrorHandling errorHandling) { + NFIZlibSupport zlibSupport = context.getNFIZlibSupport(); Object zst = zlibSupport.createCompObject(createCompObject); int err; if (zdict.length > 0) { - err = zlibSupport.decompressObjInitWithDict(zst, wbits, PythonContext.get(this).getEnv().asGuestValue(zdict), zdict.length, decompressObjInit); + err = zlibSupport.decompressObjInitWithDict(zst, wbits, context.getEnv().asGuestValue(zdict), zdict.length, decompressObjInit); } else { err = zlibSupport.decompressObjInit(zst, wbits, decompressObjInit); } if (err != Z_OK) { errorHandling.execute(inliningTarget, zst, err, zlibSupport, true); } - return factory.createNativeZLibCompObject(ZlibDecompress, zst, zlibSupport); + return PFactory.createNativeZLibCompObjectDecompress(context.getLanguage(inliningTarget), zst, zlibSupport); } - @CompilerDirectives.TruffleBoundary + @TruffleBoundary @Specialization(guards = {"!useNative()", "isValidWBitRange(wbits)"}) - Object doJava(int wbits, byte[] zdict) { + static Object doJava(int wbits, byte[] zdict) { // wbits < 0: generate a RAW stream, i.e., no wrapping // wbits 25..31: gzip container, i.e., no wrapping // Otherwise: wrap stream with zlib header and trailer @@ -774,18 +769,18 @@ Object doJava(int wbits, byte[] zdict) { if (isRAW && zdict.length > 0) { inflater.setDictionary(zdict); } - PythonObjectFactory factory = PythonObjectFactory.getUncached(); - ZLibCompObject obj = factory.createJavaZLibCompObject(ZlibDecompress, inflater, wbits, zdict); - obj.setUnusedData(factory.createEmptyBytes()); - obj.setUnconsumedTail(factory.createEmptyBytes()); + PythonLanguage language = PythonLanguage.get(null); + ZLibCompObject obj = PFactory.createJavaZLibCompObjectDecompress(language, inflater, wbits, zdict); + obj.setUnusedData(PFactory.createEmptyBytes(language)); + obj.setUnconsumedTail(PFactory.createEmptyBytes(language)); return obj; } @SuppressWarnings("unused") @Specialization(guards = {"!useNative()", "!isValidWBitRange(wbits)"}) static Object invalid(int wbits, byte[] zdict, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.ValueError, ErrorMessages.INVALID_INITIALIZATION_OPTION); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.INVALID_INITIALIZATION_OPTION); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibCompressBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibCompressBuiltins.java index 689b562d9f..d3093d5d81 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibCompressBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibCompressBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -54,6 +54,7 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; @@ -74,12 +75,11 @@ import com.oracle.graal.python.runtime.NFIZlibSupport; import com.oracle.graal.python.runtime.NativeLibrary; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -105,18 +105,18 @@ abstract static class CompressNode extends PythonBinaryClinicBuiltinNode { @Specialization static PBytes compress(VirtualFrame frame, ZLibCompObject self, Object buffer, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @Cached("createFor(this)") IndirectCallData indirectCallData, @Cached CompressInnerNode innerNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { if (!self.isInitialized()) { - throw raiseNode.get(inliningTarget).raise(ZLibError, ERROR_D_S_S, Z_STREAM_ERROR, "while compressing data", "inconsistent stream state"); + throw raiseNode.raise(inliningTarget, ZLibError, ERROR_D_S_S, Z_STREAM_ERROR, "while compressing data", "inconsistent stream state"); } byte[] bytes = bufferLib.getInternalOrCopiedByteArray(buffer); int len = bufferLib.getBufferLength(buffer); - return factory.createBytes(innerNode.execute(inliningTarget, self, bytes, len)); + return PFactory.createBytes(language, innerNode.execute(inliningTarget, self, bytes, len)); } finally { bufferLib.release(buffer, frame, indirectCallData); } @@ -153,44 +153,45 @@ protected ArgumentClinicProvider getArgumentClinic() { @GenerateCached(false) abstract static class BaseCopyNode extends PNodeWithContext { - public abstract Object execute(Node inliningTarget, ZLibCompObject self, PythonContext ctxt, PythonObjectFactory factory); + public abstract Object execute(Node inliningTarget, ZLibCompObject self); @Specialization(guards = "self.isInitialized()") - static Object doNative(Node inliningTarget, ZLibCompObject.NativeZlibCompObject self, PythonContext ctxt, PythonObjectFactory factory, + static Object doNative(Node inliningTarget, ZLibCompObject.NativeZlibCompObject self, + @Bind PythonContext context, @Cached(inline = false) NativeLibrary.InvokeNativeFunction createCompObject, @Cached(inline = false) NativeLibrary.InvokeNativeFunction compressObjCopy, @Cached(inline = false) NativeLibrary.InvokeNativeFunction deallocateStream, @Cached ZlibNodes.ZlibNativeErrorHandling errorHandling) { synchronized (self) { assert self.isInitialized(); - NFIZlibSupport zlibSupport = ctxt.getNFIZlibSupport(); + NFIZlibSupport zlibSupport = context.getNFIZlibSupport(); Object zstNewCopy = zlibSupport.createCompObject(createCompObject); int err = zlibSupport.compressObjCopy(self.getZst(), zstNewCopy, compressObjCopy); if (err != Z_OK) { zlibSupport.deallocateStream(zstNewCopy, deallocateStream); errorHandling.execute(inliningTarget, self.getZst(), err, zlibSupport, false); } - return factory.createNativeZLibCompObject(ZlibCompress, zstNewCopy, zlibSupport); + return PFactory.createNativeZLibCompObjectCompress(context.getLanguage(inliningTarget), zstNewCopy, zlibSupport); } } @Specialization(guards = {"self.isInitialized()", "self.canCopy()"}) - static Object doJava(ZLibCompObject.JavaZlibCompObject self, @SuppressWarnings("unused") PythonContext ctxt, PythonObjectFactory factory) { - return self.copyCompressObj(factory); + static Object doJava(ZLibCompObject.JavaZlibCompObject self) { + return self.copyCompressObj(); } @SuppressWarnings("unused") @Specialization(guards = {"self.isInitialized()", "!self.canCopy()"}) - static PNone error(ZLibCompObject.JavaZlibCompObject self, PythonContext ctxt, PythonObjectFactory factory, - @Cached.Shared @Cached(inline = false) PRaiseNode raise) { - throw raise.raise(NotImplementedError, toTruffleStringUncached("JDK based zlib doesn't support copying")); + static PNone error(ZLibCompObject.JavaZlibCompObject self, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, toTruffleStringUncached("JDK based zlib doesn't support copying")); } @SuppressWarnings("unused") @Specialization(guards = "!self.isInitialized()") - static PNone error(ZLibCompObject self, PythonContext ctxt, PythonObjectFactory factory, - @Cached.Shared @Cached(inline = false) PRaiseNode raise) { - throw raise.raise(ValueError, ErrorMessages.INCONSISTENT_STREAM_STATE); + static PNone error(ZLibCompObject self, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.INCONSISTENT_STREAM_STATE); } } @@ -200,9 +201,8 @@ abstract static class CopyNode extends PythonUnaryBuiltinNode { @Specialization static Object doit(ZLibCompObject self, @Bind("this") Node inliningTarget, - @Cached BaseCopyNode copyNode, - @Cached PythonObjectFactory factory) { - return copyNode.execute(inliningTarget, self, PythonContext.get(inliningTarget), factory); + @Cached BaseCopyNode copyNode) { + return copyNode.execute(inliningTarget, self); } } @@ -217,9 +217,8 @@ abstract static class DeepCopyNode extends PythonBinaryBuiltinNode { @Specialization static Object doit(ZLibCompObject self, @SuppressWarnings("unused") Object memo, @Bind("this") Node inliningTarget, - @Cached BaseCopyNode copyNode, - @Cached PythonObjectFactory factory) { - return copyNode.execute(inliningTarget, self, PythonContext.get(inliningTarget), factory); + @Cached BaseCopyNode copyNode) { + return copyNode.execute(inliningTarget, self); } } @@ -237,8 +236,8 @@ protected ArgumentClinicProvider getArgumentClinic() { @SuppressWarnings("unused") @Specialization(guards = "mode == Z_NO_FLUSH") static PBytes empty(ZLibCompObject self, int mode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createEmptyBytes(); + @Bind PythonLanguage language) { + return PFactory.createEmptyBytes(language); } @Specialization(guards = {"mode != Z_NO_FLUSH", "self.isInitialized()"}) @@ -248,16 +247,15 @@ static PBytes doit(ZLibCompObject.NativeZlibCompObject self, int mode, @Cached ZlibNodes.GetNativeBufferNode getBuffer, @Cached NativeLibrary.InvokeNativeFunction getIsInitialised, @Cached ZlibNodes.NativeDeallocation processDeallocation, - @Cached ZlibNodes.ZlibNativeErrorHandling errorHandling, - @Shared @Cached PythonObjectFactory factory) { + @Cached ZlibNodes.ZlibNativeErrorHandling errorHandling) { synchronized (self) { assert self.isInitialized(); - PythonContext ctxt = PythonContext.get(inliningTarget); - NFIZlibSupport zlibSupport = ctxt.getNFIZlibSupport(); + PythonContext context = PythonContext.get(inliningTarget); + NFIZlibSupport zlibSupport = context.getNFIZlibSupport(); Object lastInput; if (self.lastInput == null) { // all previous input data has been processed or nothing has been compressed. - lastInput = ctxt.getEnv().asGuestValue(PythonUtils.EMPTY_BYTE_ARRAY); + lastInput = context.getEnv().asGuestValue(PythonUtils.EMPTY_BYTE_ARRAY); } else { // pass the last data input to continue processing. // all other needed info, e.g. size and offset, about the last data input is @@ -268,25 +266,25 @@ static PBytes doit(ZLibCompObject.NativeZlibCompObject self, int mode, if (err != Z_OK) { errorHandling.execute(inliningTarget, self.getZst(), err, zlibSupport, false); } - byte[] resultArray = getBuffer.getOutputBuffer(inliningTarget, self.getZst(), ctxt); + byte[] resultArray = getBuffer.getOutputBuffer(inliningTarget, self.getZst(), context); if (zlibSupport.getIsInitialised(self.getZst(), getIsInitialised) == 0) { - processDeallocation.execute(inliningTarget, self, ctxt, factory, true); + processDeallocation.execute(inliningTarget, self, context, true); } - return factory.createBytes(resultArray); + return PFactory.createBytes(context.getLanguage(inliningTarget), resultArray); } } @Specialization(guards = {"mode != Z_NO_FLUSH", "self.isInitialized()"}) static PBytes doit(ZLibCompObject.JavaZlibCompObject self, int mode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createBytes(ZlibNodes.JavaCompressNode.execute(self, mode)); + @Bind PythonLanguage language) { + return PFactory.createBytes(language, ZlibNodes.JavaCompressNode.execute(self, mode)); } @SuppressWarnings("unused") @Specialization(guards = "!self.isInitialized()") static PNone error(ZLibCompObject self, int mode, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ZLibError, ERROR_D_S_S, Z_STREAM_ERROR, "while compressing data", "inconsistent stream state"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ZLibError, ERROR_D_S_S, Z_STREAM_ERROR, "while compressing data", "inconsistent stream state"); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibDecompressBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibDecompressBuiltins.java index 52e0aa4467..b43e5fd4a0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibDecompressBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibDecompressBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -55,6 +55,7 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; @@ -76,11 +77,10 @@ import com.oracle.graal.python.runtime.NativeLibrary; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -111,21 +111,21 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static PBytes decompress(VirtualFrame frame, ZLibCompObject self, Object buffer, int maxLength, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @Cached("createFor(this)") IndirectCallData indirectCallData, @Cached DecompressInnerNode innerNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { if (!self.isInitialized()) { - throw raiseNode.get(inliningTarget).raise(ZLibError, ERROR_D_S_S, Z_STREAM_ERROR, "while decompressing data", "inconsistent stream state"); + throw raiseNode.raise(inliningTarget, ZLibError, ERROR_D_S_S, Z_STREAM_ERROR, "while decompressing data", "inconsistent stream state"); } if (maxLength < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, S_MUST_BE_GREATER_THAN_ZERO, "max_length"); + throw raiseNode.raise(inliningTarget, ValueError, S_MUST_BE_GREATER_THAN_ZERO, "max_length"); } byte[] bytes = bufferLib.getInternalOrCopiedByteArray(buffer); int len = bufferLib.getBufferLength(buffer); - return factory.createBytes(innerNode.execute(frame, inliningTarget, self, bytes, len, maxLength)); + return PFactory.createBytes(language, innerNode.execute(frame, inliningTarget, self, bytes, len, maxLength)); } finally { bufferLib.release(buffer, frame, indirectCallData); } @@ -146,9 +146,8 @@ static byte[] doNative(Node inliningTarget, ZLibCompObject.NativeZlibCompObject @Specialization static byte[] doJava(VirtualFrame frame, Node inliningTarget, ZLibCompObject.JavaZlibCompObject self, byte[] bytes, int length, int maxLength, - @Cached(inline = false) BytesNodes.ToBytesNode toBytes, - @Cached(inline = false) PythonObjectFactory factory) { - return ZlibNodes.JavaDecompressor.execute(frame, self, bytes, length, maxLength, DEF_BUF_SIZE, inliningTarget, factory, toBytes); + @Cached(inline = false) BytesNodes.ToBytesNode toBytes) { + return ZlibNodes.JavaDecompressor.execute(frame, self, bytes, length, maxLength, DEF_BUF_SIZE, inliningTarget, toBytes); } } } @@ -157,46 +156,47 @@ static byte[] doJava(VirtualFrame frame, Node inliningTarget, ZLibCompObject.Jav @GenerateCached(false) abstract static class BaseCopyNode extends PNodeWithContext { - public abstract Object execute(Node inliningTarget, ZLibCompObject self, PythonContext ctxt, PythonObjectFactory factory); + public abstract Object execute(Node inliningTarget, ZLibCompObject self); @Specialization(guards = "self.isInitialized()") - static Object doNative(Node inliningTarget, ZLibCompObject.NativeZlibCompObject self, PythonContext ctxt, PythonObjectFactory factory, + static Object doNative(Node inliningTarget, ZLibCompObject.NativeZlibCompObject self, + @Bind PythonContext context, @Cached(inline = false) NativeLibrary.InvokeNativeFunction createCompObject, @Cached(inline = false) NativeLibrary.InvokeNativeFunction decompressObjCopy, @Cached(inline = false) NativeLibrary.InvokeNativeFunction deallocateStream, @Cached ZlibNodes.ZlibNativeErrorHandling errorHandling) { synchronized (self) { assert self.isInitialized(); - NFIZlibSupport zlibSupport = ctxt.getNFIZlibSupport(); + NFIZlibSupport zlibSupport = context.getNFIZlibSupport(); Object zstNewCopy = zlibSupport.createCompObject(createCompObject); int err = zlibSupport.decompressObjCopy(self.getZst(), zstNewCopy, decompressObjCopy); if (err != Z_OK) { zlibSupport.deallocateStream(zstNewCopy, deallocateStream); errorHandling.execute(inliningTarget, self.getZst(), err, zlibSupport, false); } - ZLibCompObject copy = factory.createNativeZLibCompObject(ZlibDecompress, zstNewCopy, zlibSupport); + ZLibCompObject copy = PFactory.createNativeZLibCompObjectDecompress(context.getLanguage(inliningTarget), zstNewCopy, zlibSupport); copy.setEof(self.isEof()); return copy; } } @Specialization(guards = {"self.isInitialized()", "self.canCopy()"}) - static Object doJava(Node inliningTarget, ZLibCompObject.JavaZlibCompObject self, @SuppressWarnings("unused") PythonContext ctxt, PythonObjectFactory factory) { - return self.copyDecompressObj(factory, inliningTarget); + static Object doJava(Node inliningTarget, ZLibCompObject.JavaZlibCompObject self) { + return self.copyDecompressObj(inliningTarget); } @SuppressWarnings("unused") @Specialization(guards = {"self.isInitialized()", "!self.canCopy()"}) - static PNone error(ZLibCompObject.JavaZlibCompObject self, PythonContext ctxt, PythonObjectFactory factory, - @Cached.Shared @Cached(inline = false) PRaiseNode raise) { - throw raise.raise(NotImplementedError, toTruffleStringUncached("JDK based zlib doesn't support copying")); + static PNone error(ZLibCompObject.JavaZlibCompObject self, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, toTruffleStringUncached("JDK based zlib doesn't support copying")); } @SuppressWarnings("unused") @Specialization(guards = "!self.isInitialized()") - static PNone error(ZLibCompObject self, PythonContext ctxt, PythonObjectFactory factory, - @Cached.Shared @Cached(inline = false) PRaiseNode raise) { - throw raise.raise(ValueError, INCONSISTENT_STREAM_STATE); + static PNone error(ZLibCompObject self, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, INCONSISTENT_STREAM_STATE); } } @@ -206,9 +206,8 @@ abstract static class CopyNode extends PythonUnaryBuiltinNode { @Specialization static Object doit(ZLibCompObject self, @Bind("this") Node inliningTarget, - @Cached BaseCopyNode copyNode, - @Cached PythonObjectFactory factory) { - return copyNode.execute(inliningTarget, self, PythonContext.get(inliningTarget), factory); + @Cached BaseCopyNode copyNode) { + return copyNode.execute(inliningTarget, self); } } @@ -223,9 +222,8 @@ abstract static class DeepCopyNode extends PythonBinaryBuiltinNode { @Specialization static Object doit(ZLibCompObject self, @SuppressWarnings("unused") Object memo, @Bind("this") Node inliningTarget, - @Cached BaseCopyNode copyNode, - @Cached PythonObjectFactory factory) { - return copyNode.execute(inliningTarget, self, PythonContext.get(inliningTarget), factory); + @Cached BaseCopyNode copyNode) { + return copyNode.execute(inliningTarget, self); } } @@ -242,64 +240,63 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(guards = {"length > 0", "!self.isEof()", "self.isInitialized()"}) static PBytes doit(ZLibCompObject.NativeZlibCompObject self, int length, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached NativeLibrary.InvokeNativeFunction decompressObjFlush, @Cached ZlibNodes.GetNativeBufferNode getBuffer, @Cached NativeLibrary.InvokeNativeFunction getIsInitialised, @Cached ZlibNodes.NativeDeallocation processDeallocation, - @Cached ZlibNodes.ZlibNativeErrorHandling errorHandling, - @Shared @Cached PythonObjectFactory factory) { + @Cached ZlibNodes.ZlibNativeErrorHandling errorHandling) { synchronized (self) { - PythonContext ctxt = PythonContext.get(inliningTarget); assert self.isInitialized(); - NFIZlibSupport zlibSupport = ctxt.getNFIZlibSupport(); + NFIZlibSupport zlibSupport = context.getNFIZlibSupport(); int err = zlibSupport.decompressObjFlush(self.getZst(), length, decompressObjFlush); if (err != Z_OK) { errorHandling.execute(inliningTarget, self.getZst(), err, zlibSupport, false); } - byte[] resultArray = getBuffer.getOutputBuffer(inliningTarget, self.getZst(), ctxt); + byte[] resultArray = getBuffer.getOutputBuffer(inliningTarget, self.getZst(), context); if (zlibSupport.getIsInitialised(self.getZst(), getIsInitialised) == 0) { - processDeallocation.execute(inliningTarget, self, ctxt, factory, false); + processDeallocation.execute(inliningTarget, self, context, false); } - return factory.createBytes(resultArray); + return PFactory.createBytes(context.getLanguage(inliningTarget), resultArray); } } @Specialization(guards = {"length > 0", "!self.isEof()", "self.isInitialized()"}) PBytes doit(VirtualFrame frame, ZLibCompObject.JavaZlibCompObject self, int length, - @Cached BytesNodes.ToBytesNode toBytes, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @Cached BytesNodes.ToBytesNode toBytes) { byte[] res; try { byte[] bytes = toBytes.execute(self.getUnconsumedTail()); - res = ZlibNodes.JavaDecompressor.execute(frame, self, bytes, bytes.length, 0, length, this, factory, toBytes); + res = ZlibNodes.JavaDecompressor.execute(frame, self, bytes, bytes.length, 0, length, this, toBytes); } catch (PException e) { // CPython ignores errors here res = PythonUtils.EMPTY_BYTE_ARRAY; } self.setUninitialized(); - return factory.createBytes(res); + return PFactory.createBytes(language, res); } @SuppressWarnings("unused") @Specialization(guards = {"length > 0", "self.isEof() || !self.isInitialized()"}) static PBytes empty(ZLibCompObject.JavaZlibCompObject self, int length, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { self.setUninitialized(); - return factory.createEmptyBytes(); + return PFactory.createEmptyBytes(language); } @SuppressWarnings("unused") @Specialization(guards = {"length > 0", "self.isEof() || !self.isInitialized()"}) static PBytes empty(ZLibCompObject.NativeZlibCompObject self, int length, - @Shared @Cached PythonObjectFactory factory) { - return factory.createEmptyBytes(); + @Bind PythonLanguage language) { + return PFactory.createEmptyBytes(language); } @SuppressWarnings("unused") @Specialization(guards = "length <= 0") static PBytes error(ZLibCompObject self, int length, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, S_MUST_BE_GREATER_THAN_ZERO, "length"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, S_MUST_BE_GREATER_THAN_ZERO, "length"); } } @@ -309,11 +306,11 @@ abstract static class UnusedDataNode extends PythonUnaryBuiltinNode { @Specialization(guards = "self.isInitialized()") static PBytes doit(ZLibCompObject.NativeZlibCompObject self, @Bind("this") Node inliningTarget, - @Cached ZlibNodes.GetNativeBufferNode getBuffer, - @Cached PythonObjectFactory factory) { + @Bind PythonContext context, + @Cached ZlibNodes.GetNativeBufferNode getBuffer) { synchronized (self) { assert self.isInitialized(); - return factory.createBytes(getBuffer.getUnusedDataBuffer(inliningTarget, self.getZst(), PythonContext.get(inliningTarget))); + return PFactory.createBytes(context.getLanguage(inliningTarget), getBuffer.getUnusedDataBuffer(inliningTarget, self.getZst(), context)); } } @@ -334,11 +331,11 @@ abstract static class UnconsumedTailNode extends PythonUnaryBuiltinNode { @Specialization(guards = "self.isInitialized()") static PBytes doit(ZLibCompObject.NativeZlibCompObject self, @Bind("this") Node inliningTarget, - @Cached ZlibNodes.GetNativeBufferNode getBuffer, - @Cached PythonObjectFactory factory) { + @Bind PythonContext context, + @Cached ZlibNodes.GetNativeBufferNode getBuffer) { synchronized (self) { assert self.isInitialized(); - return factory.createBytes(getBuffer.getUnconsumedTailBuffer(inliningTarget, self.getZst(), PythonContext.get(inliningTarget))); + return PFactory.createBytes(context.getLanguage(inliningTarget), getBuffer.getUnconsumedTailBuffer(inliningTarget, self.getZst(), context)); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibNodes.java index 77dd75769d..65fce92816 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -73,6 +73,7 @@ import java.util.zip.Deflater; import java.util.zip.Inflater; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.bytes.BytesNodes; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; @@ -82,11 +83,12 @@ import com.oracle.graal.python.runtime.NFIZlibSupport; import com.oracle.graal.python.runtime.NativeLibrary; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.OverflowException; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Cached.Shared; @@ -242,6 +244,7 @@ public abstract static class ZlibNativeErrorMsg extends Node { @SuppressWarnings("unused") @Specialization(guards = "err == Z_VERSION_ERROR") static void doVersionError(Object zst, int err, TruffleString msg, NFIZlibSupport zlibSupport, boolean deallocate, + @Bind("this") Node inliningTarget, @Shared("d") @Cached NativeLibrary.InvokeNativeFunction deallocateStream, @Shared("r") @Cached PRaiseNode raise) { /* @@ -249,11 +252,12 @@ static void doVersionError(Object zst, int err, TruffleString msg, NFIZlibSuppor * first, before looking at comp->zst.msg. */ deallocateStream(zst, zlibSupport, deallocateStream, deallocate); - throw raise.raise(ZLibError, ERROR_D_S_S, err, msg, LIBRARY_VERSION_MISMATCH); + throw raise.raise(inliningTarget, ZLibError, ERROR_D_S_S, err, msg, LIBRARY_VERSION_MISMATCH); } @Specialization(guards = "err != Z_VERSION_ERROR") static void doError(Object zst, int err, TruffleString msg, NFIZlibSupport zlibSupport, boolean deallocate, + @Bind("this") Node inliningTarget, @Shared("r") @Cached PRaiseNode raise, @Shared("d") @Cached NativeLibrary.InvokeNativeFunction deallocateStream, @Exclusive @Cached NativeLibrary.InvokeNativeFunction hasStreamErrorMsg, @@ -276,9 +280,9 @@ static void doError(Object zst, int err, TruffleString msg, NFIZlibSupport zlibS } deallocateStream(zst, zlibSupport, deallocateStream, deallocate); if (zmsg == null) { - throw raise.raise(ZLibError, ERROR_D_S, err, msg); + throw raise.raise(inliningTarget, ZLibError, ERROR_D_S, err, msg); } else { - throw raise.raise(ZLibError, ERROR_D_S_S, err, msg, zmsg); + throw raise.raise(inliningTarget, ZLibError, ERROR_D_S_S, err, msg, zmsg); } } } @@ -292,68 +296,72 @@ public abstract static class ZlibFunctionNativeErrorHandling extends Node { @Specialization(guards = "function == DEFLATE_INIT_ERROR") static void deflateInitError(Object zst, @SuppressWarnings("unused") int function, int err, NFIZlibSupport zlibSupport, boolean deallocate, + @Bind("this") Node inliningTarget, @Shared("r") @Cached PRaiseNode raise, @Shared("d") @Cached NativeLibrary.InvokeNativeFunction deallocateStream, @Shared("err") @Cached ZlibNativeErrorMsg zlibError, @Shared("format") @Cached SimpleTruffleStringFormatNode formatNode) { if (err == Z_MEM_ERROR) { deallocateStream(zst, zlibSupport, deallocateStream, deallocate); - throw raise.raise(MemoryError, OUT_OF_MEMORY_WHILE_S_DATA, "compressing"); + throw raise.raise(inliningTarget, MemoryError, OUT_OF_MEMORY_WHILE_S_DATA, "compressing"); } if (err == Z_STREAM_ERROR) { deallocateStream(zst, zlibSupport, deallocateStream, deallocate); - throw raise.raise(ZLibError, ErrorMessages.BAD_COMPRESSION_LEVEL); + throw raise.raise(inliningTarget, ZLibError, ErrorMessages.BAD_COMPRESSION_LEVEL); } zlibError.execute(zst, err, formatNode.format(WHILE_S_DATA, "compressing"), zlibSupport, deallocate); } @Specialization(guards = "function == DEFLATE_OBJ_ERROR") static void deflateObjInitError(Object zst, @SuppressWarnings("unused") int function, int err, NFIZlibSupport zlibSupport, boolean deallocate, + @Bind("this") Node inliningTarget, @Shared("r") @Cached PRaiseNode raise, @Shared("d") @Cached NativeLibrary.InvokeNativeFunction deallocateStream, @Shared("err") @Cached ZlibNativeErrorMsg zlibError, @Shared("format") @Cached SimpleTruffleStringFormatNode formatNode) { if (err == Z_MEM_ERROR) { deallocateStream(zst, zlibSupport, deallocateStream, deallocate); - throw raise.raise(MemoryError, CANT_ALLOCATE_MEMORY_FOR_S_OBJECT, "compression"); + throw raise.raise(inliningTarget, MemoryError, CANT_ALLOCATE_MEMORY_FOR_S_OBJECT, "compression"); } if (err == Z_STREAM_ERROR) { deallocateStream(zst, zlibSupport, deallocateStream, deallocate); - throw raise.raise(ValueError, INVALID_INITIALIZATION_OPTION); + throw raise.raise(inliningTarget, ValueError, INVALID_INITIALIZATION_OPTION); } zlibError.execute(zst, err, formatNode.format(WHILE_CREATING_S_OBJECT, "compression"), zlibSupport, deallocate); } @Specialization(guards = "function == DEFLATE_COPY_ERROR") static void deflateCopyError(Object zst, @SuppressWarnings("unused") int function, int err, NFIZlibSupport zlibSupport, boolean deallocate, + @Bind("this") Node inliningTarget, @Shared("r") @Cached PRaiseNode raise, @Shared("d") @Cached NativeLibrary.InvokeNativeFunction deallocateStream, @Shared("err") @Cached ZlibNativeErrorMsg zlibError, @Shared("format") @Cached SimpleTruffleStringFormatNode formatNode) { if (err == Z_MEM_ERROR) { deallocateStream(zst, zlibSupport, deallocateStream, deallocate); - throw raise.raise(MemoryError, CANT_ALLOCATE_MEMORY_FOR_S_OBJECT, "compression"); + throw raise.raise(inliningTarget, MemoryError, CANT_ALLOCATE_MEMORY_FOR_S_OBJECT, "compression"); } if (err == Z_STREAM_ERROR) { deallocateStream(zst, zlibSupport, deallocateStream, deallocate); - throw raise.raise(ValueError, INCONSISTENT_STREAM_STATE); + throw raise.raise(inliningTarget, ValueError, INCONSISTENT_STREAM_STATE); } zlibError.execute(zst, err, formatNode.format(WHILE_COPYING_S_OBJECT, "compression"), zlibSupport, deallocate); } @Specialization(guards = "function == INFLATE_COPY_ERROR") static void inflateCopyError(Object zst, @SuppressWarnings("unused") int function, int err, NFIZlibSupport zlibSupport, boolean deallocate, + @Bind("this") Node inliningTarget, @Shared("r") @Cached PRaiseNode raise, @Shared("d") @Cached NativeLibrary.InvokeNativeFunction deallocateStream, @Shared("err") @Cached ZlibNativeErrorMsg zlibError, @Shared("format") @Cached SimpleTruffleStringFormatNode formatNode) { if (err == Z_MEM_ERROR) { deallocateStream(zst, zlibSupport, deallocateStream, deallocate); - throw raise.raise(MemoryError, CANT_ALLOCATE_MEMORY_FOR_S_OBJECT, "decompression"); + throw raise.raise(inliningTarget, MemoryError, CANT_ALLOCATE_MEMORY_FOR_S_OBJECT, "decompression"); } if (err == Z_STREAM_ERROR) { deallocateStream(zst, zlibSupport, deallocateStream, deallocate); - throw raise.raise(ValueError, INCONSISTENT_STREAM_STATE); + throw raise.raise(inliningTarget, ValueError, INCONSISTENT_STREAM_STATE); } zlibError.execute(zst, err, formatNode.format(WHILE_COPYING_S_OBJECT, "compression"), zlibSupport, deallocate); } @@ -361,25 +369,27 @@ static void inflateCopyError(Object zst, @SuppressWarnings("unused") int functio @SuppressWarnings("unused") @Specialization(guards = "function == DEFLATE_DICT_ERROR") static void deflateDictError(Object zst, int function, int err, NFIZlibSupport zlibSupport, boolean deallocate, + @Bind("this") Node inliningTarget, @Shared("d") @Cached NativeLibrary.InvokeNativeFunction deallocateStream, @Shared("r") @Cached PRaiseNode raise) { if (err == Z_STREAM_ERROR) { deallocateStream(zst, zlibSupport, deallocateStream, deallocate); - throw raise.raise(ValueError, INVALID_DICTIONARY); + throw raise.raise(inliningTarget, ValueError, INVALID_DICTIONARY); } - throw raise.raise(ValueError, ErrorMessages.DEFLATED_SET_DICT); + throw raise.raise(inliningTarget, ValueError, ErrorMessages.DEFLATED_SET_DICT); } @Specialization(guards = "function == INFLATE_INIT_ERROR") static void inflateInitError(Object zst, @SuppressWarnings("unused") int function, int err, NFIZlibSupport zlibSupport, boolean deallocate, + @Bind("this") Node inliningTarget, @Shared("r") @Cached PRaiseNode raise, @Shared("d") @Cached NativeLibrary.InvokeNativeFunction deallocateStream, @Shared("err") @Cached ZlibNativeErrorMsg zlibError, @Shared("format") @Cached SimpleTruffleStringFormatNode formatNode) { if (err == Z_MEM_ERROR) { deallocateStream(zst, zlibSupport, deallocateStream, deallocate); - throw raise.raise(MemoryError, OUT_OF_MEMORY_WHILE_S_DATA, "decompressing"); + throw raise.raise(inliningTarget, MemoryError, OUT_OF_MEMORY_WHILE_S_DATA, "decompressing"); } zlibError.execute(zst, err, formatNode.format(WHILE_PREPARING_TO_S_DATA, "decompress"), zlibSupport, deallocate); @@ -387,17 +397,18 @@ static void inflateInitError(Object zst, @SuppressWarnings("unused") int functio @Specialization(guards = "function == INFLATE_OBJ_ERROR") static void inflateObjInitError(Object zst, @SuppressWarnings("unused") int function, int err, NFIZlibSupport zlibSupport, boolean deallocate, + @Bind("this") Node inliningTarget, @Shared("r") @Cached PRaiseNode raise, @Shared("d") @Cached NativeLibrary.InvokeNativeFunction deallocateStream, @Shared("err") @Cached ZlibNativeErrorMsg zlibError, @Shared("format") @Cached SimpleTruffleStringFormatNode formatNode) { if (err == Z_MEM_ERROR) { deallocateStream(zst, zlibSupport, deallocateStream, deallocate); - throw raise.raise(MemoryError, CANT_ALLOCATE_MEMORY_FOR_S_OBJECT, "decompression"); + throw raise.raise(inliningTarget, MemoryError, CANT_ALLOCATE_MEMORY_FOR_S_OBJECT, "decompression"); } if (err == Z_STREAM_ERROR) { deallocateStream(zst, zlibSupport, deallocateStream, deallocate); - throw raise.raise(ValueError, INVALID_INITIALIZATION_OPTION); + throw raise.raise(inliningTarget, ValueError, INVALID_INITIALIZATION_OPTION); } zlibError.execute(zst, err, formatNode.format(WHILE_CREATING_S_OBJECT, "decompression"), zlibSupport, deallocate); } @@ -451,16 +462,17 @@ static void inflateFlushError(Object zst, @SuppressWarnings("unused") int functi @SuppressWarnings("unused") @Specialization(guards = "function == MEMORY_ERROR") static void memError(Object zst, int function, int err, NFIZlibSupport zlibSupport, boolean deallocate, + @Bind("this") Node inliningTarget, @Shared("d") @Cached NativeLibrary.InvokeNativeFunction deallocateStream, @Shared("r") @Cached PRaiseNode raise) { deallocateStream(zst, zlibSupport, deallocateStream, deallocate); - throw raise.raise(MemoryError); + throw raise.raise(inliningTarget, MemoryError); } @SuppressWarnings("unused") @Fallback void fallback(Object zst, int function, int err, NFIZlibSupport zlibSupport, boolean deallocate) { - throw PRaiseNode.raiseUncached(this, SystemError, ErrorMessages.UNHANDLED_ERROR); + throw PRaiseNode.raiseStatic(this, SystemError, ErrorMessages.UNHANDLED_ERROR); } } @@ -469,10 +481,10 @@ void fallback(Object zst, int function, int err, NFIZlibSupport zlibSupport, boo @GenerateCached(false) public abstract static class NativeDeallocation extends PNodeWithContext { - public abstract void execute(Node inliningTarget, ZLibCompObject.NativeZlibCompObject self, PythonContext context, PythonObjectFactory factory, boolean isCompressObj); + public abstract void execute(Node inliningTarget, ZLibCompObject.NativeZlibCompObject self, PythonContext context, boolean isCompressObj); @Specialization(guards = "isCompressObj") - static void doCompressObj(ZLibCompObject.NativeZlibCompObject self, PythonContext context, @SuppressWarnings("unused") PythonObjectFactory factory, + static void doCompressObj(ZLibCompObject.NativeZlibCompObject self, PythonContext context, @SuppressWarnings("unused") boolean isCompressObj, @Shared @Cached(inline = false) NativeLibrary.InvokeNativeFunction deallocateStream) { context.getNFIZlibSupport().deallocateStream(self.getZst(), deallocateStream); @@ -481,15 +493,16 @@ static void doCompressObj(ZLibCompObject.NativeZlibCompObject self, PythonContex } @Specialization(guards = "!isCompressObj") - static void doDecompressObj(Node inliningTarget, ZLibCompObject.NativeZlibCompObject self, PythonContext context, PythonObjectFactory factory, + static void doDecompressObj(Node inliningTarget, ZLibCompObject.NativeZlibCompObject self, PythonContext context, @SuppressWarnings("unused") boolean isCompressObj, @Cached GetNativeBufferNode getUnusedDataBuffer, @Cached GetNativeBufferNode getUnconsumedBuffer, @Shared @Cached(inline = false) NativeLibrary.InvokeNativeFunction deallocateStream) { byte[] unusedData = getUnusedDataBuffer.getUnusedDataBuffer(inliningTarget, self.getZst(), context); - self.setUnusedData(factory.createBytes(unusedData)); + PythonLanguage language = context.getLanguage(inliningTarget); + self.setUnusedData(PFactory.createBytes(language, unusedData)); byte[] unconsumed = getUnconsumedBuffer.getUnconsumedTailBuffer(inliningTarget, self.getZst(), context); - self.setUnconsumedTail(factory.createBytes(unconsumed)); + self.setUnconsumedTail(PFactory.createBytes(language, unconsumed)); context.getNFIZlibSupport().deallocateStream(self.getZst(), deallocateStream); self.setEof(true); self.markReleased(); @@ -582,11 +595,11 @@ private static byte[] createByteArray(ZLibCompObject.JavaZlibCompObject self, In // we inflate again with a dictionary bytesWritten = inflater.inflate(result, 0, len); } else { - throw PRaiseNode.raiseUncached(nodeForRaise, ZLibError, WHILE_SETTING_ZDICT); + throw PRaiseNode.raiseStatic(nodeForRaise, ZLibError, WHILE_SETTING_ZDICT); } } } catch (DataFormatException e) { - throw PRaiseNode.raiseUncached(nodeForRaise, ZLibError, e); + throw PRaiseNode.raiseStatic(nodeForRaise, ZLibError, e); } baos.write(result, 0, bytesWritten); } @@ -594,35 +607,36 @@ private static byte[] createByteArray(ZLibCompObject.JavaZlibCompObject self, In } public static byte[] execute(VirtualFrame frame, ZLibCompObject.JavaZlibCompObject self, byte[] bytes, int length, int maxLength, int bufSize, - Node nodeForRaise, PythonObjectFactory factory, BytesNodes.ToBytesNode toBytesNode) { + Node inliningTarget, BytesNodes.ToBytesNode toBytesNode) { Inflater inflater = (Inflater) self.stream; - byte[] result = createByteArray(self, inflater, bytes, length, maxLength, bufSize, nodeForRaise); + byte[] result = createByteArray(self, inflater, bytes, length, maxLength, bufSize, inliningTarget); self.setEof(isFinished(inflater)); byte[] unusedDataBytes = toBytesNode.execute(frame, self.getUnusedData()); int unconsumedTailLen = self.getUnconsumedTail().getSequenceStorage().length(); - saveUnconsumedInput(self, bytes, length, unusedDataBytes, unconsumedTailLen, factory); + saveUnconsumedInput(self, bytes, length, unusedDataBytes, unconsumedTailLen, inliningTarget); return result; } private static void saveUnconsumedInput(ZLibCompObject.JavaZlibCompObject self, byte[] data, int length, - byte[] unusedDataBytes, int unconsumedTailLen, PythonObjectFactory factory) { + byte[] unusedDataBytes, int unconsumedTailLen, Node inliningTarget) { Inflater inflater = (Inflater) self.stream; int unusedLen = getRemaining(inflater); byte[] tail = PythonUtils.arrayCopyOfRange(data, length - unusedLen, length); + PythonLanguage language = PythonLanguage.get(inliningTarget); if (self.isEof()) { if (unconsumedTailLen > 0) { - self.setUnconsumedTail(factory.createEmptyBytes()); + self.setUnconsumedTail(PFactory.createEmptyBytes(language)); } if (unusedDataBytes.length > 0 && tail.length > 0) { byte[] newUnusedData = new byte[unusedDataBytes.length + tail.length]; PythonUtils.arraycopy(unusedDataBytes, 0, newUnusedData, 0, unusedDataBytes.length); PythonUtils.arraycopy(tail, 0, newUnusedData, unusedDataBytes.length, tail.length); - self.setUnusedData(factory.createBytes(newUnusedData)); + self.setUnusedData(PFactory.createBytes(language, newUnusedData)); } else if (tail.length > 0) { - self.setUnusedData(factory.createBytes(tail)); + self.setUnusedData(PFactory.createBytes(language, tail)); } } else { - self.setUnconsumedTail(factory.createBytes(tail)); + self.setUnconsumedTail(PFactory.createBytes(language, tail)); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/NoneBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/NoneBuiltins.java index bdd2d72a5b..75caf12293 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/NoneBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/NoneBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,26 +40,28 @@ */ package com.oracle.graal.python.builtins.objects; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.nodes.StringLiterals.T_NONE; import java.util.List; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.NbBoolBuiltinNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.object.IsForeignObjectNode; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; +/** NOTE: self can either be PNone.NONE or a foreign null (isNull()) */ @CoreFunctions(extendClasses = PythonBuiltinClassType.PNone) public final class NoneBuiltins extends PythonBuiltins { public static final TpSlots SLOTS = NoneBuiltinsSlotsGen.SLOTS; @@ -69,23 +71,34 @@ protected List> getNodeFa return NoneBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "NoneType", minNumOfPositionalArgs = 1) + @GenerateNodeFactory + public abstract static class NoneTypeNode extends PythonBuiltinNode { + @SuppressWarnings("unused") + @Specialization + public static PNone module(Object cls) { + return PNone.NONE; + } + } + @Slot(SlotKind.nb_bool) @GenerateUncached @GenerateNodeFactory abstract static class BoolNode extends NbBoolBuiltinNode { @Specialization - static boolean doNone(PNone none) { - assert none == PNone.NONE; + static boolean doNone(Object none) { + assert none == PNone.NONE || IsForeignObjectNode.executeUncached(none); return false; } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization - static Object doNone(PNone none) { - assert none == PNone.NONE; + static Object doNone(Object none) { + assert none == PNone.NONE || IsForeignObjectNode.executeUncached(none); return T_NONE; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/NotImplementedBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/NotImplementedBuiltins.java index 1386bc75c0..8046682ff2 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/NotImplementedBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/NotImplementedBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,16 +42,21 @@ import static com.oracle.graal.python.nodes.BuiltinNames.T_NOT_IMPLEMENTED; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import java.util.List; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; @@ -61,14 +66,27 @@ @SuppressWarnings("unused") public final class NotImplementedBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = NotImplementedBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return NotImplementedBuiltinsFactory.getFactories(); } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "NotImplementedType", minNumOfPositionalArgs = 1) + @GenerateNodeFactory + public abstract static class NotImplementedTypeNode extends PythonBuiltinNode { + @SuppressWarnings("unused") + @Specialization + public static PNotImplemented module(Object cls) { + return PNotImplemented.NOT_IMPLEMENTED; + } + } + + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory - abstract static class ReprNode extends PythonBuiltinNode { + abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization @SuppressWarnings("unused") static TruffleString doit(PNotImplemented self) { @@ -78,7 +96,7 @@ static TruffleString doit(PNotImplemented self) { @Builtin(name = J___REDUCE__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2) @GenerateNodeFactory - public abstract static class ReduceNode extends PythonBuiltinNode { + public abstract static class ReduceNode extends PythonBinaryBuiltinNode { @Specialization @SuppressWarnings("unused") TruffleString doit(PNotImplemented self, Object ignored) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/PythonAbstractObject.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/PythonAbstractObject.java index 1283c9ffc8..8b9250444a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/PythonAbstractObject.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/PythonAbstractObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -97,12 +97,15 @@ import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; import com.oracle.graal.python.builtins.objects.type.PythonClass; import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetMroNode; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.lib.IteratorExhausted; import com.oracle.graal.python.lib.PyCallableCheckNode; +import com.oracle.graal.python.lib.PyIterCheckNode; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyMappingCheckNode; import com.oracle.graal.python.lib.PyObjectGetItem; import com.oracle.graal.python.lib.PyObjectGetIter; @@ -119,12 +122,13 @@ import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; +import com.oracle.graal.python.nodes.argument.keywords.MappingToKeywordsNode; +import com.oracle.graal.python.nodes.argument.keywords.NonMappingException; +import com.oracle.graal.python.nodes.argument.keywords.SameDictKeyException; import com.oracle.graal.python.nodes.attributes.LookupInheritedAttributeNode; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode; -import com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode; import com.oracle.graal.python.nodes.expression.CastToListExpressionNode.CastToListInteropNode; import com.oracle.graal.python.nodes.interop.GetInteropBehaviorNode; import com.oracle.graal.python.nodes.interop.GetInteropBehaviorValueNode; @@ -149,10 +153,11 @@ import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.OverflowException; import com.oracle.graal.python.util.PythonUtils; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.TruffleLanguage; import com.oracle.truffle.api.dsl.Bind; @@ -181,6 +186,7 @@ import com.oracle.truffle.api.object.Shape; import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.profiles.InlinedConditionProfile; +import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile; import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.strings.TruffleString.RegionEqualNode; import com.oracle.truffle.api.utilities.TriState; @@ -193,10 +199,6 @@ public abstract class PythonAbstractObject extends DynamicObject implements Truf private static final int PRIVATE_PREFIX_LENGTH = T_PRIVATE_PREFIX.codePointLengthUncached(TS_ENCODING); private PythonAbstractObjectNativeWrapper nativeWrapper; - // @ImportStatic doesn't work for this for some reason - protected static final SpecialMethodSlot Iter = SpecialMethodSlot.Iter; - protected static final SpecialMethodSlot Next = SpecialMethodSlot.Next; - protected static final Shape ABSTRACT_SHAPE = Shape.newBuilder().build(); private Object[] indexedSlots; @@ -285,7 +287,7 @@ public boolean hasArrayElements( // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Cached GetObjectSlotsNode getSlotsNode, @Exclusive @Cached PySequenceCheckNode sequenceCheck, @Exclusive @Cached GilNode gil) { @@ -349,7 +351,7 @@ public void writeArrayElement(long key, Object value, getValue.execute(inliningTarget, behavior, method, this, key, value); } else { try { - sequenceSetItemNode.execute(this, PInt.intValueExact(key), value); + sequenceSetItemNode.execute(null, inliningTarget, this, PInt.intValueExact(key), value); } catch (OverflowException cce) { throw InvalidArrayIndexException.create(key); } catch (PException pe) { @@ -377,7 +379,7 @@ public void removeArrayElement(long key, getValue.execute(inliningTarget, behavior, method, this, key); } else { try { - sequenceDelItemNode.execute(this, PInt.intValueExact(key)); + sequenceDelItemNode.execute(null, inliningTarget, this, PInt.intValueExact(key)); } catch (OverflowException cce) { throw InvalidArrayIndexException.create(key); } catch (PException pe) { @@ -400,7 +402,7 @@ public long getArraySize( // GR-44020: make shared: @Exclusive @Cached CastToJavaLongExactNode toLongNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Exclusive @Cached GilNode gil) throws UnsupportedMessageException { boolean mustRelease = gil.acquire(); try { @@ -435,7 +437,7 @@ public boolean isArrayElementReadable(long idx, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Exclusive @Cached PySequenceSizeNode sequenceSizeNode, @Shared("getBehavior") @Cached GetInteropBehaviorNode getBehavior, @Shared("getValue") @Cached GetInteropBehaviorValueNode getValue, @@ -465,7 +467,7 @@ public boolean isArrayElementModifiable(long idx, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Exclusive @Cached PySequenceSizeNode sequenceSizeNode, @Shared("getBehavior") @Cached GetInteropBehaviorNode getBehavior, @Shared("getValue") @Cached GetInteropBehaviorValueNode getValue, @@ -497,7 +499,7 @@ public boolean isArrayElementInsertable(long idx, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Exclusive @Cached PySequenceSizeNode sequenceSizeNode, @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -527,7 +529,7 @@ public boolean isArrayElementRemovable(long idx, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Exclusive @Cached PySequenceSizeNode sequenceSizeNode, @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -653,7 +655,7 @@ public boolean isExecutable( // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Cached PyCallableCheckNode callableCheck, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { @@ -846,7 +848,7 @@ public boolean isDate( // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -872,7 +874,7 @@ public LocalDate asDate( // GR-44020: make shared: @Exclusive @Cached CastToJavaIntExactNode castToIntNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached SequenceStorageNodes.GetItemDynamicNode getItemNode, // GR-44020: make shared: @@ -887,7 +889,7 @@ public LocalDate asDate( Object value = getValue.execute(inliningTarget, behavior, method, this); if (value instanceof PTuple tuple) { if (pyTupleSizeNode.execute(inliningTarget, tuple) != 3) { - throw raiseNode.get(inliningTarget).raise(ValueError, S_MUST_BE_A_S_TUPLE, "return value", "3"); + throw raiseNode.raise(inliningTarget, ValueError, S_MUST_BE_A_S_TUPLE, "return value", "3"); } SequenceStorage storage = tuple.getSequenceStorage(); int year = castToIntNode.executeWithThrowSystemError(inliningTarget, getItemNode.execute(inliningTarget, storage, 0), raiseNode); @@ -896,10 +898,10 @@ public LocalDate asDate( try { return createLocalDate(year, month, day); } catch (Exception e) { - throw raiseNode.get(inliningTarget).raise(SystemError, e); + throw raiseNode.raise(inliningTarget, SystemError, e); } } else { - throw raiseNode.get(inliningTarget).raise(TypeError, MUST_BE_TYPE_A_NOT_TYPE_B, "return value", "tuple", value); + throw raiseNode.raise(inliningTarget, TypeError, MUST_BE_TYPE_A_NOT_TYPE_B, "return value", "tuple", value); } } else { @@ -919,7 +921,7 @@ public boolean isTime( // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -945,7 +947,7 @@ public LocalTime asTime( // GR-44020: make shared: @Exclusive @Cached CastToJavaIntExactNode castToIntNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached SequenceStorageNodes.GetItemDynamicNode getItemNode, // GR-44020: make shared: @@ -960,7 +962,7 @@ public LocalTime asTime( Object value = getValue.execute(inliningTarget, behavior, method, this); if (value instanceof PTuple tuple) { if (pyTupleSizeNode.execute(inliningTarget, tuple) != 4) { - throw raiseNode.get(inliningTarget).raise(ValueError, S_MUST_BE_A_S_TUPLE, "return value", "4"); + throw raiseNode.raise(inliningTarget, ValueError, S_MUST_BE_A_S_TUPLE, "return value", "4"); } SequenceStorage storage = tuple.getSequenceStorage(); int hour = castToIntNode.executeWithThrowSystemError(inliningTarget, getItemNode.execute(inliningTarget, storage, 0), raiseNode); @@ -970,10 +972,10 @@ public LocalTime asTime( try { return createLocalTime(hour, min, sec, micro); } catch (Exception e) { - throw raiseNode.get(inliningTarget).raise(SystemError, e); + throw raiseNode.raise(inliningTarget, SystemError, e); } } else { - throw raiseNode.get(inliningTarget).raise(TypeError, MUST_BE_TYPE_A_NOT_TYPE_B, "return value", "tuple", value); + throw raiseNode.raise(inliningTarget, TypeError, MUST_BE_TYPE_A_NOT_TYPE_B, "return value", "tuple", value); } } else { throw UnsupportedMessageException.create(); @@ -993,7 +995,7 @@ public boolean isTimeZone( // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -1019,7 +1021,7 @@ public ZoneId asTimeZone( // GR-44020: make shared: @Exclusive @Cached CastToJavaIntExactNode castToIntNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Cached TruffleString.ToJavaStringNode toJavaStringNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) throws UnsupportedMessageException { @@ -1039,10 +1041,10 @@ public ZoneId asTimeZone( return createZoneId(utcDeltaInSeconds); } } catch (Exception e) { - throw raiseNode.get(inliningTarget).raise(SystemError, e); + throw raiseNode.raise(inliningTarget, SystemError, e); } } catch (CannotCastException cce) { - throw raiseNode.get(inliningTarget).raise(TypeError, MUST_BE_TYPE_A_NOT_TYPE_B, "return value", "str or int", value); + throw raiseNode.raise(inliningTarget, TypeError, MUST_BE_TYPE_A_NOT_TYPE_B, "return value", "str or int", value); } } else { throw UnsupportedMessageException.create(); @@ -1081,7 +1083,7 @@ public boolean isDuration( // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -1107,7 +1109,7 @@ public Duration asDuration( // GR-44020: make shared: @Exclusive @Cached CastToJavaLongExactNode castToLongNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached SequenceStorageNodes.GetItemDynamicNode getItemNode, // GR-44020: make shared: @@ -1122,7 +1124,7 @@ public Duration asDuration( Object value = getValue.execute(inliningTarget, behavior, method, this); if (value instanceof PTuple tuple) { if (pyTupleSizeNode.execute(inliningTarget, tuple) != 2) { - throw raiseNode.get(inliningTarget).raise(ValueError, S_MUST_BE_A_S_TUPLE, "return value", "2"); + throw raiseNode.raise(inliningTarget, ValueError, S_MUST_BE_A_S_TUPLE, "return value", "2"); } SequenceStorage storage = tuple.getSequenceStorage(); long sec = castToLongNode.executeWithThrowSystemError(inliningTarget, getItemNode.execute(inliningTarget, storage, 0), raiseNode); @@ -1130,10 +1132,10 @@ public Duration asDuration( try { return createDuration(sec, nano); } catch (Exception e) { - throw raiseNode.get(inliningTarget).raise(SystemError, e); + throw raiseNode.raise(inliningTarget, SystemError, e); } } else { - throw raiseNode.get(inliningTarget).raise(TypeError, MUST_BE_TYPE_A_NOT_TYPE_B, "return value", "tuple", value); + throw raiseNode.raise(inliningTarget, TypeError, MUST_BE_TYPE_A_NOT_TYPE_B, "return value", "tuple", value); } } else { throw UnsupportedMessageException.create(); @@ -1283,26 +1285,84 @@ public abstract static class PExecuteNode extends Node { public abstract Object execute(Object receiver, Object[] arguments) throws UnsupportedMessageException; - @Specialization(guards = {"isBuiltinFunctionOrMethod(receiver)"}) - Object doVarargsBuiltinMethod(Object receiver, Object[] arguments, - @Bind("this") Node inliningTarget, - @Cached CallVarargsMethodNode callVarargsMethodNode, - @Exclusive @Cached ArgumentsFromForeignNode convertArgsNode) { - Object[] convertedArgs = convertArgsNode.execute(inliningTarget, arguments); - return callVarargsMethodNode.execute(null, receiver, convertedArgs, PKeyword.EMPTY_KEYWORDS); - } + private static String POSARGS_MEMBER = "org.graalvm.python.embedding.PositionalArguments.is_positional_arguments"; + private static String KWARGS_MEMBER = "org.graalvm.python.embedding.KeywordArguments.is_keyword_arguments"; - @Specialization(replaces = "doVarargsBuiltinMethod") + @Specialization static Object doExecute(Object receiver, Object[] arguments, @Bind("this") Node inliningTarget, @Cached PyCallableCheckNode callableCheck, @Exclusive @Cached CallNode callNode, - @Exclusive @Cached ArgumentsFromForeignNode convertArgsNode) throws UnsupportedMessageException { + @Exclusive @Cached ArgumentsFromForeignNode convertArgsNode, + @Cached MappingToKeywordsNode toKeywordsNode, + @CachedLibrary(limit = "1") InteropLibrary iLibKwArgs, + @CachedLibrary(limit = "1") InteropLibrary iLibPosArgs, + @CachedLibrary(limit = "1") InteropLibrary iLibIterator, + @Cached InlinedConditionProfile argsLenProfile, + @Cached InlinedConditionProfile isKwargsProfile, + @Cached InlinedConditionProfile isIndexZeroProfile, + @Cached InlinedConditionProfile isStarargsProfile1, + @Cached InlinedConditionProfile isStarargsProfile2, + @Cached InlinedConditionProfile isStarargsDefinedProfile, + @Cached InlinedConditionProfile hasMembersProfile, + @Cached InlinedConditionProfile isIndexNotZeroProfile, + @Cached InlinedLoopConditionProfile loopProfile) throws UnsupportedMessageException { if (!callableCheck.execute(inliningTarget, receiver)) { throw UnsupportedMessageException.create(); } - Object[] convertedArgs = convertArgsNode.execute(inliningTarget, arguments); - return callNode.execute(null, receiver, convertedArgs, PKeyword.EMPTY_KEYWORDS); + + PKeyword[] kwArgs = PKeyword.EMPTY_KEYWORDS; + Object[] newArgs = arguments; + int index = arguments.length - 1; + if (argsLenProfile.profile(inliningTarget, index >= 0)) { + Object last = arguments[index]; + Object posArgs = null; + try { + boolean lastHasMembers = hasMembersProfile.profile(inliningTarget, iLibKwArgs.hasMembers(last)); + if (lastHasMembers && isKwargsProfile.profile(inliningTarget, iLibKwArgs.isMemberReadable(last, KWARGS_MEMBER) && iLibKwArgs.readMember(last, KWARGS_MEMBER) == Boolean.TRUE)) { + kwArgs = toKeywordsNode.execute(null, inliningTarget, last); + --index; + if (isIndexZeroProfile.profile(inliningTarget, index >= 0)) { + last = arguments[index]; + if (isStarargsProfile1.profile(inliningTarget, + iLibPosArgs.hasMembers(last) && iLibPosArgs.isMemberReadable(last, POSARGS_MEMBER) && iLibPosArgs.readMember(last, POSARGS_MEMBER) == Boolean.TRUE)) { + posArgs = last; + } else { + // no starargs are in arguments + newArgs = PythonUtils.arrayCopyOf(arguments, arguments.length - 1); + } + } else { + // only kwargs are in arguments + newArgs = new Object[0]; + } + } else if (lastHasMembers && + isStarargsProfile2.profile(inliningTarget, iLibPosArgs.isMemberReadable(last, POSARGS_MEMBER) && iLibPosArgs.readMember(last, POSARGS_MEMBER) == Boolean.TRUE)) { + posArgs = last; + } + + if (isStarargsDefinedProfile.profile(inliningTarget, posArgs != null)) { + long length = iLibPosArgs.getArraySize(posArgs); + Object iterator = iLibPosArgs.getIterator(posArgs); + loopProfile.profileCounted(inliningTarget, length); + Object[] starArgs = new Object[(int) length]; + for (int i = 0; loopProfile.inject(inliningTarget, i < length); i++) { + starArgs[i] = iLibIterator.getIteratorNextElement(iterator); + } + if (isIndexNotZeroProfile.profile(inliningTarget, index > 0)) { + newArgs = new Object[index + starArgs.length]; + PythonUtils.arraycopy(arguments, 0, newArgs, 0, index); + PythonUtils.arraycopy(starArgs, 0, newArgs, index, starArgs.length); + } else { + // only starargs and kwargs are in arguments + newArgs = starArgs; + } + } + } catch (UnknownIdentifierException | SameDictKeyException | NonMappingException | StopIterationException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } + Object[] convertedArgs = convertArgsNode.execute(inliningTarget, newArgs); + return callNode.execute(null, receiver, convertedArgs, kwArgs); } static boolean isBuiltinFunctionOrMethod(Object object) { @@ -1518,7 +1578,6 @@ public boolean hasMetaParents( @ExportMessage public Object getMetaParents( @Bind("$node") Node inliningTarget, - @Exclusive @Cached PythonObjectFactory factory, @Exclusive @Cached TypeNodes.IsTypeNode isTypeNode, @Exclusive @Cached TypeNodes.GetBaseClassesNode getBaseClassNode, @Exclusive @Cached GilNode gil) throws UnsupportedMessageException { @@ -1527,7 +1586,7 @@ public Object getMetaParents( if (isTypeNode.execute(inliningTarget, this)) { var bases = getBaseClassNode.execute(inliningTarget, this); if (bases.length > 0) { - return factory.createTuple(bases); + return PFactory.createTuple(PythonLanguage.get(inliningTarget), bases); } } throw UnsupportedMessageException.create(); @@ -1599,9 +1658,9 @@ public boolean hasIterator( // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Shared("getClass") @Cached(inline = false) GetClassNode getClassNode, - @Cached(parameters = "Iter") LookupCallableSlotInMRONode lookupIter, + @Cached GetCachedTpSlotsNode getSlots, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -1611,7 +1670,8 @@ public boolean hasIterator( if (behavior != null) { return getValue.executeBoolean(inliningTarget, behavior, method, toBooleanNode, raiseNode, this); } else { - return !(lookupIter.execute(getClassNode.executeCached(this)) instanceof PNone); + TpSlots slots = getSlots.execute(inliningTarget, getClassNode.executeCached(this)); + return slots.tp_iter() != null; } } finally { gil.release(mustRelease); @@ -1654,9 +1714,8 @@ public boolean isIterator( // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, - @Shared("getClass") @Cached(inline = false) GetClassNode getClassNode, - @Cached(parameters = "Next") LookupCallableSlotInMRONode lookupNext, + @Exclusive @Cached PRaiseNode raiseNode, + @Cached PyIterCheckNode checkNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -1666,7 +1725,7 @@ public boolean isIterator( if (behavior != null) { return getValue.executeBoolean(inliningTarget, behavior, method, toBooleanNode, raiseNode, this); } else { - return lookupNext.execute(getClassNode.executeCached(this)) != PNone.NO_VALUE; + return checkNode.execute(inliningTarget, this); } } finally { gil.release(mustRelease); @@ -1682,9 +1741,8 @@ public boolean hasIteratorNextElement( // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, - @Cached GetNextNode getNextNode, - @Exclusive @Cached IsBuiltinObjectProfile exceptionProfile, + @Exclusive @Cached PRaiseNode raiseNode, + @Cached PyIterNextNode nextNode, @Exclusive @Cached GilNode gil, @CachedLibrary("this") InteropLibrary ilib, // GR-44020: make shared: @@ -1703,13 +1761,12 @@ public boolean hasIteratorNextElement( return true; } try { - nextElement = getNextNode.execute(null, this); - writeHiddenAttrNode.execute(inliningTarget, this, HiddenAttr.NEXT_ELEMENT, nextElement); - return true; - } catch (PException e) { - e.expect(inliningTarget, PythonBuiltinClassType.StopIteration, exceptionProfile); + nextElement = nextNode.execute(null, inliningTarget, this); + } catch (IteratorExhausted e) { return false; } + writeHiddenAttrNode.execute(inliningTarget, this, HiddenAttr.NEXT_ELEMENT, nextElement); + return true; } } throw UnsupportedMessageException.create(); @@ -1757,7 +1814,7 @@ public boolean isBoolean(@Bind("$node") Node inliningTarget, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -1782,7 +1839,7 @@ public boolean isNumber(@Bind("$node") Node inliningTarget, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -1807,7 +1864,7 @@ public boolean isString(@Bind("$node") Node inliningTarget, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -1832,7 +1889,7 @@ public boolean fitsInByte(@Bind("$node") Node inliningTarget, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -1857,7 +1914,7 @@ public boolean fitsInShort(@Bind("$node") Node inliningTarget, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -1882,7 +1939,7 @@ public boolean fitsInInt(@Bind("$node") Node inliningTarget, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -1907,7 +1964,7 @@ public boolean fitsInLong(@Bind("$node") Node inliningTarget, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -1932,7 +1989,7 @@ public boolean fitsInFloat(@Bind("$node") Node inliningTarget, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -1957,7 +2014,7 @@ public boolean fitsInDouble(@Bind("$node") Node inliningTarget, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -1982,7 +2039,7 @@ public boolean fitsInBigInteger(@Bind("$node") Node inliningTarget, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -2007,7 +2064,7 @@ public boolean asBoolean(@Bind("$node") Node inliningTarget, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) throws UnsupportedMessageException { boolean mustRelease = gil.acquire(); @@ -2032,7 +2089,7 @@ public byte asByte(@Bind("$node") Node inliningTarget, // GR-44020: make shared: @Exclusive @Cached CastToJavaByteNode toByteNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) throws UnsupportedMessageException { boolean mustRelease = gil.acquire(); @@ -2057,7 +2114,7 @@ public short asShort(@Bind("$node") Node inliningTarget, // GR-44020: make shared: @Exclusive @Cached CastToJavaShortNode toShortNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) throws UnsupportedMessageException { boolean mustRelease = gil.acquire(); @@ -2082,7 +2139,7 @@ public int asInt(@Bind("$node") Node inliningTarget, // GR-44020: make shared: @Exclusive @Cached CastToJavaIntExactNode toIntNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) throws UnsupportedMessageException { boolean mustRelease = gil.acquire(); @@ -2107,7 +2164,7 @@ public long asLong(@Bind("$node") Node inliningTarget, // GR-44020: make shared: @Exclusive @Cached CastToJavaLongExactNode toLongNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) throws UnsupportedMessageException { boolean mustRelease = gil.acquire(); @@ -2132,7 +2189,7 @@ public float asFloat(@Bind("$node") Node inliningTarget, // GR-44020: make shared: @Exclusive @Cached CastToJavaDoubleNode toDoubleNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) throws UnsupportedMessageException { boolean mustRelease = gil.acquire(); @@ -2157,7 +2214,7 @@ public double asDouble(@Bind("$node") Node inliningTarget, // GR-44020: make shared: @Exclusive @Cached CastToJavaDoubleNode toDoubleNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) throws UnsupportedMessageException { boolean mustRelease = gil.acquire(); @@ -2204,7 +2261,7 @@ public String asString(@Bind("$node") Node inliningTarget, @Shared("getValue") @Cached GetInteropBehaviorValueNode getValue, @Cached CastToJavaStringNode toStringNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) throws UnsupportedMessageException { boolean mustRelease = gil.acquire(); @@ -2229,7 +2286,7 @@ public boolean hasHashEntries(@Bind("$node") Node inliningTarget, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -2255,7 +2312,7 @@ public long getHashSize( // GR-44020: make shared: @Exclusive @Cached CastToJavaLongExactNode toLongNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) throws UnsupportedMessageException { boolean mustRelease = gil.acquire(); @@ -2369,7 +2426,7 @@ public boolean isHashEntryReadable(Object key, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -2395,7 +2452,7 @@ public boolean isHashEntryRemovable(Object key, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, // GR-44020: make shared: @Exclusive @Cached GilNode gil) { boolean mustRelease = gil.acquire(); @@ -2441,7 +2498,7 @@ public boolean isHashEntryModifiable(Object key, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Shared("getBehavior") @Cached GetInteropBehaviorNode getBehavior, @Shared("getValue") @Cached GetInteropBehaviorValueNode getValue, // GR-44020: make shared: @@ -2467,7 +2524,7 @@ public boolean isHashEntryInsertable(Object key, // GR-44020: make shared: @Exclusive @Cached CastToJavaBooleanNode toBooleanNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Shared("getBehavior") @Cached GetInteropBehaviorNode getBehavior, @Shared("getValue") @Cached GetInteropBehaviorValueNode getValue, // GR-44020: make shared: @@ -2538,7 +2595,7 @@ public byte readBufferByte(long byteOffset, // GR-44020: make shared: @Exclusive @Cached CastToJavaIntExactNode toIntNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Shared("bufferLib") @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) throws UnsupportedMessageException, InvalidBufferOffsetException { if (bufferLib.isBuffer(this)) { int offset = toIntNode.executeWithThrow(inliningTarget, byteOffset, raiseNode, PythonBuiltinClassType.OverflowError); @@ -2554,7 +2611,7 @@ public void writeBufferByte(long byteOffset, byte value, @Bind("$node") Node inl // GR-44020: make shared: @Exclusive @Cached CastToJavaIntExactNode toIntNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Shared("bufferLib") @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) throws UnsupportedMessageException, InvalidBufferOffsetException { if (bufferLib.isBuffer(this)) { int offset = toIntNode.executeWithThrow(inliningTarget, byteOffset, raiseNode, PythonBuiltinClassType.OverflowError); @@ -2571,7 +2628,7 @@ public short readBufferShort(ByteOrder order, long byteOffset, // GR-44020: make shared: @Exclusive @Cached CastToJavaIntExactNode toIntNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Shared("bufferLib") @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) throws UnsupportedMessageException, InvalidBufferOffsetException { if (bufferLib.isBuffer(this)) { int offset = toIntNode.executeWithThrow(inliningTarget, byteOffset, raiseNode, PythonBuiltinClassType.OverflowError); @@ -2587,7 +2644,7 @@ public void writeBufferShort(ByteOrder order, long byteOffset, short value, @Bin // GR-44020: make shared: @Exclusive @Cached CastToJavaIntExactNode toIntNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Shared("bufferLib") @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) throws UnsupportedMessageException, InvalidBufferOffsetException { if (bufferLib.isBuffer(this)) { int offset = toIntNode.executeWithThrow(inliningTarget, byteOffset, raiseNode, PythonBuiltinClassType.OverflowError); @@ -2604,7 +2661,7 @@ public int readBufferInt(ByteOrder order, long byteOffset, // GR-44020: make shared: @Exclusive @Cached CastToJavaIntExactNode toIntNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Shared("bufferLib") @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) throws UnsupportedMessageException, InvalidBufferOffsetException { if (bufferLib.isBuffer(this)) { int offset = toIntNode.executeWithThrow(inliningTarget, byteOffset, raiseNode, PythonBuiltinClassType.OverflowError); @@ -2620,7 +2677,7 @@ public void writeBufferInt(ByteOrder order, long byteOffset, int value, @Bind("$ // GR-44020: make shared: @Exclusive @Cached CastToJavaIntExactNode toIntNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Shared("bufferLib") @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) throws UnsupportedMessageException, InvalidBufferOffsetException { if (bufferLib.isBuffer(this)) { int offset = toIntNode.executeWithThrow(inliningTarget, byteOffset, raiseNode, PythonBuiltinClassType.OverflowError); @@ -2637,7 +2694,7 @@ public long readBufferLong(ByteOrder order, long byteOffset, // GR-44020: make shared: @Exclusive @Cached CastToJavaIntExactNode toIntNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Shared("bufferLib") @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) throws UnsupportedMessageException, InvalidBufferOffsetException { if (bufferLib.isBuffer(this)) { int offset = toIntNode.executeWithThrow(inliningTarget, byteOffset, raiseNode, PythonBuiltinClassType.OverflowError); @@ -2653,7 +2710,7 @@ public void writeBufferLong(ByteOrder order, long byteOffset, long value, @Bind( // GR-44020: make shared: @Exclusive @Cached CastToJavaIntExactNode toIntNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Shared("bufferLib") @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) throws UnsupportedMessageException, InvalidBufferOffsetException { if (bufferLib.isBuffer(this)) { int offset = toIntNode.executeWithThrow(inliningTarget, byteOffset, raiseNode, PythonBuiltinClassType.OverflowError); @@ -2670,7 +2727,7 @@ public float readBufferFloat(ByteOrder order, long byteOffset, // GR-44020: make shared: @Exclusive @Cached CastToJavaIntExactNode toIntNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Shared("bufferLib") @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) throws UnsupportedMessageException, InvalidBufferOffsetException { if (bufferLib.isBuffer(this)) { int offset = toIntNode.executeWithThrow(inliningTarget, byteOffset, raiseNode, PythonBuiltinClassType.OverflowError); @@ -2687,7 +2744,7 @@ public void writeBufferFloat(ByteOrder order, long byteOffset, float value, // GR-44020: make shared: @Exclusive @Cached CastToJavaIntExactNode toIntNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Shared("bufferLib") @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) throws UnsupportedMessageException, InvalidBufferOffsetException { if (bufferLib.isBuffer(this)) { int offset = toIntNode.executeWithThrow(inliningTarget, byteOffset, raiseNode, PythonBuiltinClassType.OverflowError); @@ -2704,7 +2761,7 @@ public double readBufferDouble(ByteOrder order, long byteOffset, // GR-44020: make shared: @Exclusive @Cached CastToJavaIntExactNode toIntNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Shared("bufferLib") @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) throws UnsupportedMessageException, InvalidBufferOffsetException { if (bufferLib.isBuffer(this)) { int offset = toIntNode.executeWithThrow(inliningTarget, byteOffset, raiseNode, PythonBuiltinClassType.OverflowError); @@ -2721,7 +2778,7 @@ public void writeBufferDouble(ByteOrder order, long byteOffset, double value, // GR-44020: make shared: @Exclusive @Cached CastToJavaIntExactNode toIntNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Shared("bufferLib") @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) throws UnsupportedMessageException, InvalidBufferOffsetException { if (bufferLib.isBuffer(this)) { int offset = toIntNode.executeWithThrow(inliningTarget, byteOffset, raiseNode, PythonBuiltinClassType.OverflowError); @@ -2738,7 +2795,7 @@ public void readBuffer(long byteOffset, byte[] destination, int destinationOffse // GR-44020: make shared: @Exclusive @Cached CastToJavaIntExactNode toIntNode, // GR-44020: make shared: - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Shared("bufferLib") @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) throws UnsupportedMessageException, InvalidBufferOffsetException { if (bufferLib.isBuffer(this)) { if (length < 0 || (destination.length - destinationOffset > length)) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/ArrayBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/ArrayBuiltins.java index 439512208c..5185e3e890 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/ArrayBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/ArrayBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -39,21 +39,11 @@ import static com.oracle.graal.python.nodes.BuiltinNames.J_EXTEND; import static com.oracle.graal.python.nodes.BuiltinNames.T_ARRAY; import static com.oracle.graal.python.nodes.ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP; +import static com.oracle.graal.python.nodes.ErrorMessages.S_TAKES_AT_LEAST_D_ARGUMENTS_D_GIVEN; +import static com.oracle.graal.python.nodes.ErrorMessages.S_TAKES_AT_MOST_D_ARGUMENTS_D_GIVEN; +import static com.oracle.graal.python.nodes.ErrorMessages.S_TAKES_NO_KEYWORD_ARGS; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DICT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CONTAINS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DELITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IADD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NE__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE_EX__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETITEM__; import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA_SPACE; import static com.oracle.graal.python.nodes.StringLiterals.T_LBRACKET; import static com.oracle.graal.python.nodes.StringLiterals.T_LPAREN; @@ -65,9 +55,11 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -79,59 +71,67 @@ import com.oracle.graal.python.builtins.objects.array.ArrayNodes.GetValueNode; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; import com.oracle.graal.python.builtins.objects.bytes.PBytes; +import com.oracle.graal.python.builtins.objects.bytes.PBytesLike; import com.oracle.graal.python.builtins.objects.common.IndexNodes.NormalizeIndexNode; import com.oracle.graal.python.builtins.objects.common.SequenceNodes; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; +import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.module.PythonModule; +import com.oracle.graal.python.builtins.objects.range.PIntRange; import com.oracle.graal.python.builtins.objects.slice.PSlice; import com.oracle.graal.python.builtins.objects.slice.SliceNodes; +import com.oracle.graal.python.builtins.objects.str.StringNodes.CastToTruffleStringCheckedNode; import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.MpSubscriptBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.SqConcatBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotMpAssSubscript.MpAssSubscriptBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqItemBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqRepeatBuiltinNode; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqAssItem.SqAssItemBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqContains.SqContainsBuiltinNode; +import com.oracle.graal.python.lib.IteratorExhausted; import com.oracle.graal.python.lib.PyIndexCheckNode; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyNumberIndexNode; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.lib.PyObjectLookupAttr; +import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode; +import com.oracle.graal.python.lib.PyObjectRichCompare; import com.oracle.graal.python.lib.PyObjectRichCompareBool; import com.oracle.graal.python.lib.PyObjectSizeNode; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.PRaiseNode.Lazy; import com.oracle.graal.python.nodes.builtins.ListNodes; -import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; -import com.oracle.graal.python.nodes.expression.BinaryComparisonNode; -import com.oracle.graal.python.nodes.expression.CoerceToBooleanNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; +import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassExactProfile; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.PSequence; import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.BufferFormat; -import com.oracle.graal.python.util.ComparisonOp; import com.oracle.graal.python.util.OverflowException; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; @@ -158,6 +158,7 @@ import com.oracle.truffle.api.profiles.InlinedByteValueProfile; import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile; +import com.oracle.truffle.api.profiles.ValueProfile; import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.strings.TruffleStringBuilder; import com.oracle.truffle.api.strings.TruffleStringIterator; @@ -173,41 +174,255 @@ protected List> getNodeFa return ArrayBuiltinsFactory.getFactories(); } + // array.array(typecode[, initializer]) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_ARRAY, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + abstract static class ArrayNode extends PythonVarargsBuiltinNode { + + @Specialization(guards = "args.length == 1 || args.length == 2") + static Object array2(VirtualFrame frame, Object cls, Object[] args, PKeyword[] kwargs, + @Bind("this") Node inliningTarget, + @Cached InlinedConditionProfile hasInitializerProfile, + @Cached IsBuiltinClassExactProfile isNotSubtypeProfile, + @Cached CastToTruffleStringCheckedNode cast, + @Cached ArrayNodeInternal arrayNodeInternal, + @Cached PRaiseNode raise) { + if (isNotSubtypeProfile.profileClass(inliningTarget, cls, PythonBuiltinClassType.PArray)) { + if (kwargs.length != 0) { + throw raise.raise(inliningTarget, TypeError, S_TAKES_NO_KEYWORD_ARGS, "array.array()"); + } + } + Object initializer = hasInitializerProfile.profile(inliningTarget, args.length == 2) ? args[1] : PNone.NO_VALUE; + return arrayNodeInternal.execute(frame, inliningTarget, cls, cast.cast(inliningTarget, args[0], ErrorMessages.ARG_1_MUST_BE_UNICODE_NOT_P, args[0]), initializer); + } + + @Fallback + @SuppressWarnings("unused") + Object error(Object cls, Object[] args, PKeyword[] kwargs) { + if (args.length < 2) { + throw PRaiseNode.raiseStatic(this, TypeError, S_TAKES_AT_LEAST_D_ARGUMENTS_D_GIVEN, T_ARRAY, 2, args.length); + } else { + throw PRaiseNode.raiseStatic(this, TypeError, S_TAKES_AT_MOST_D_ARGUMENTS_D_GIVEN, T_ARRAY, 3, args.length); + } + } + + // multiple non-inlined specializations share nodes + @SuppressWarnings("truffle-interpreted-performance") + @ImportStatic(PGuards.class) + @GenerateInline + @GenerateCached(false) + abstract static class ArrayNodeInternal extends Node { + + public abstract PArray execute(VirtualFrame frame, Node inliningTarget, Object cls, TruffleString typeCode, Object initializer); + + @Specialization(guards = "isNoValue(initializer)") + static PArray array(Node inliningTarget, Object cls, TruffleString typeCode, @SuppressWarnings("unused") PNone initializer, + @Shared @Cached GetFormatCheckedNode getFormatCheckedNode, + @Bind PythonLanguage language, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) { + BufferFormat format = getFormatCheckedNode.execute(inliningTarget, typeCode); + return PFactory.createArray(language, cls, getInstanceShape.execute(cls), typeCode, format); + } + + @Specialization + @InliningCutoff + static PArray arrayWithRangeInitializer(Node inliningTarget, Object cls, TruffleString typeCode, PIntRange range, + @Shared @Cached GetFormatCheckedNode getFormatCheckedNode, + @Bind PythonLanguage language, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Exclusive @Cached ArrayNodes.PutValueNode putValueNode) { + BufferFormat format = getFormatCheckedNode.execute(inliningTarget, typeCode); + PArray array; + try { + array = PFactory.createArray(language, cls, getInstanceShape.execute(cls), typeCode, format, range.getIntLength()); + } catch (OverflowException e) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + throw PRaiseNode.raiseStatic(inliningTarget, MemoryError); + } + + int start = range.getIntStart(); + int step = range.getIntStep(); + int len = range.getIntLength(); + + for (int index = 0, value = start; index < len; index++, value += step) { + putValueNode.execute(null, inliningTarget, array, index, value); + } + + return array; + } + + @Specialization + static PArray arrayWithBytesInitializer(VirtualFrame frame, Node inliningTarget, Object cls, TruffleString typeCode, PBytesLike bytes, + @Shared @Cached GetFormatCheckedNode getFormatCheckedNode, + @Bind PythonLanguage language, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Cached(inline = false) ArrayBuiltins.FromBytesNode fromBytesNode) { + BufferFormat format = getFormatCheckedNode.execute(inliningTarget, typeCode); + PArray array = PFactory.createArray(language, cls, getInstanceShape.execute(cls), typeCode, format); + fromBytesNode.executeWithoutClinic(frame, array, bytes); + return array; + } + + @Specialization(guards = "isString(initializer)") + @InliningCutoff + static PArray arrayWithStringInitializer(VirtualFrame frame, Node inliningTarget, Object cls, TruffleString typeCode, Object initializer, + @Shared @Cached GetFormatCheckedNode getFormatCheckedNode, + @Bind PythonLanguage language, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Cached(inline = false) ArrayBuiltins.FromUnicodeNode fromUnicodeNode, + @Cached PRaiseNode raise) { + BufferFormat format = getFormatCheckedNode.execute(inliningTarget, typeCode); + if (format != BufferFormat.UNICODE) { + throw raise.raise(inliningTarget, TypeError, ErrorMessages.CANNOT_USE_STR_TO_INITIALIZE_ARRAY, typeCode); + } + PArray array = PFactory.createArray(language, cls, getInstanceShape.execute(cls), typeCode, format); + fromUnicodeNode.execute(frame, array, initializer); + return array; + } + + @Specialization + @InliningCutoff + static PArray arrayArrayInitializer(VirtualFrame frame, Node inliningTarget, Object cls, TruffleString typeCode, PArray initializer, + @Shared @Cached GetFormatCheckedNode getFormatCheckedNode, + @Bind PythonLanguage language, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Exclusive @Cached ArrayNodes.PutValueNode putValueNode, + @Cached ArrayNodes.GetValueNode getValueNode) { + BufferFormat format = getFormatCheckedNode.execute(inliningTarget, typeCode); + try { + int length = initializer.getLength(); + PArray array = PFactory.createArray(language, cls, getInstanceShape.execute(cls), typeCode, format, length); + for (int i = 0; i < length; i++) { + putValueNode.execute(frame, inliningTarget, array, i, getValueNode.execute(inliningTarget, initializer, i)); + } + return array; + } catch (OverflowException e) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + throw PRaiseNode.raiseStatic(inliningTarget, MemoryError); + } + } + + @Specialization(guards = "!isBytes(initializer)") + @InliningCutoff + static PArray arraySequenceInitializer(VirtualFrame frame, Node inliningTarget, Object cls, TruffleString typeCode, PSequence initializer, + @Shared @Cached GetFormatCheckedNode getFormatCheckedNode, + @Bind PythonLanguage language, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Exclusive @Cached ArrayNodes.PutValueNode putValueNode, + @Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode, + @Cached SequenceStorageNodes.GetItemScalarNode getItemNode) { + BufferFormat format = getFormatCheckedNode.execute(inliningTarget, typeCode); + SequenceStorage storage = getSequenceStorageNode.execute(inliningTarget, initializer); + int length = storage.length(); + try { + PArray array = PFactory.createArray(language, cls, getInstanceShape.execute(cls), typeCode, format, length); + for (int i = 0; i < length; i++) { + putValueNode.execute(frame, inliningTarget, array, i, getItemNode.execute(inliningTarget, storage, i)); + } + return array; + } catch (OverflowException e) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + throw PRaiseNode.raiseStatic(inliningTarget, MemoryError); + } + } + + @Specialization(guards = {"!isBytes(initializer)", "!isString(initializer)", "!isPSequence(initializer)"}) + @InliningCutoff + static PArray arrayIteratorInitializer(VirtualFrame frame, Node inliningTarget, Object cls, TruffleString typeCode, Object initializer, + @Cached PyObjectGetIter getIter, + @Shared @Cached GetFormatCheckedNode getFormatCheckedNode, + @Bind PythonLanguage language, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Exclusive @Cached ArrayNodes.PutValueNode putValueNode, + @Cached PyIterNextNode nextNode, + @Cached ArrayNodes.SetLengthNode setLengthNode, + @Cached ArrayNodes.EnsureCapacityNode ensureCapacityNode) { + Object iter = getIter.execute(frame, inliningTarget, initializer); + + BufferFormat format = getFormatCheckedNode.execute(inliningTarget, typeCode); + PArray array = PFactory.createArray(language, cls, getInstanceShape.execute(cls), typeCode, format); + + int length = 0; + while (true) { + try { + Object nextValue = nextNode.execute(frame, inliningTarget, iter); + try { + length = PythonUtils.addExact(length, 1); + ensureCapacityNode.execute(inliningTarget, array, length); + } catch (OverflowException e) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + throw PRaiseNode.raiseStatic(inliningTarget, MemoryError); + } + putValueNode.execute(frame, inliningTarget, array, length - 1, nextValue); + } catch (IteratorExhausted e) { + break; + } + } + + setLengthNode.execute(inliningTarget, array, length); + return array; + } + + @GenerateInline + @GenerateCached(false) + abstract static class GetFormatCheckedNode extends Node { + abstract BufferFormat execute(Node inliningTarget, TruffleString typeCode); + + @Specialization + static BufferFormat get(Node inliningTarget, TruffleString typeCode, + @Cached(inline = false) TruffleString.CodePointLengthNode lengthNode, + @Cached(inline = false) TruffleString.CodePointAtIndexNode atIndexNode, + @Cached PRaiseNode raise, + @Cached(value = "createIdentityProfile()", inline = false) ValueProfile valueProfile) { + if (lengthNode.execute(typeCode, TS_ENCODING) != 1) { + throw raise.raise(inliningTarget, TypeError, ErrorMessages.ARRAY_ARG_1_MUST_BE_UNICODE); + } + BufferFormat format = BufferFormat.forArray(typeCode, lengthNode, atIndexNode); + if (format == null) { + throw raise.raise(inliningTarget, ValueError, ErrorMessages.BAD_TYPECODE); + } + return valueProfile.profile(format); + } + } + } + } + @Slot(value = SlotKind.sq_concat, isComplex = true) @GenerateNodeFactory abstract static class ConcatNode extends SqConcatBuiltinNode { @Specialization(guards = "left.getFormat() == right.getFormat()") Object concat(PArray left, PArray right, @CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { try { int newLength = PythonUtils.addExact(left.getLength(), right.getLength()); int itemShift = left.getItemSizeShift(); - PArray newArray = factory.createArray(left.getFormatString(), left.getFormat(), newLength); + PArray newArray = PFactory.createArray(language, left.getFormatString(), left.getFormat(), newLength); bufferLib.readIntoBuffer(left.getBuffer(), 0, newArray.getBuffer(), 0, left.getLength() << itemShift, bufferLib); bufferLib.readIntoBuffer(right.getBuffer(), 0, newArray.getBuffer(), left.getLength() << itemShift, right.getLength() << itemShift, bufferLib); return newArray; } catch (OverflowException e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(this, MemoryError); + throw PRaiseNode.raiseStatic(this, MemoryError); } } @Specialization(guards = "left.getFormat() != right.getFormat()") @SuppressWarnings("unused") static Object error(PArray left, PArray right, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, BAD_ARG_TYPE_FOR_BUILTIN_OP); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, BAD_ARG_TYPE_FOR_BUILTIN_OP); } @Fallback static Object error(@SuppressWarnings("unused") Object left, Object right, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CAN_ONLY_APPEND_ARRAY_TO_ARRAY, right); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CAN_ONLY_APPEND_ARRAY_TO_ARRAY, right); } } - @Builtin(name = J___IADD__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.sq_inplace_concat, isComplex = true) @GenerateNodeFactory abstract static class IAddNode extends PythonBinaryBuiltinNode { @Specialization @@ -219,8 +434,8 @@ static Object concat(VirtualFrame frame, PArray left, PArray right, @Fallback static Object error(@SuppressWarnings("unused") Object left, Object right, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CAN_ONLY_EXTEND_ARRAY_WITH_ARRAY, right); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CAN_ONLY_EXTEND_ARRAY_WITH_ARRAY, right); } } @@ -233,7 +448,7 @@ static PArray concat(PArray self, int valueIn, @CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib, @Cached InlinedBranchProfile negativeSize, @Cached InlinedLoopConditionProfile loopProfile, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { int value = valueIn; if (value < 0) { negativeSize.enter(inliningTarget); @@ -241,7 +456,7 @@ static PArray concat(PArray self, int valueIn, } try { int newLength = Math.max(PythonUtils.multiplyExact(self.getLength(), value), 0); - PArray newArray = factory.createArray(self.getFormatString(), self.getFormat(), newLength); + PArray newArray = PFactory.createArray(language, self.getFormatString(), self.getFormat(), newLength); int segmentLength = self.getBytesLength(); loopProfile.profileCounted(inliningTarget, value); for (int i = 0; loopProfile.inject(inliningTarget, i < value); i++) { @@ -250,7 +465,7 @@ static PArray concat(PArray self, int valueIn, return newArray; } catch (OverflowException e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, MemoryError); + throw PRaiseNode.raiseStatic(inliningTarget, MemoryError); } } @@ -260,17 +475,16 @@ static PArray doZeroSize(Object self, @SuppressWarnings("unused") int value) { } } - @Builtin(name = J___IMUL__, minNumOfPositionalArgs = 2, numOfPositionalOnlyArgs = 2, parameterNames = {"$self", "value"}) - @ArgumentClinic(name = "value", conversion = ArgumentClinic.ClinicConversion.Index) + @Slot(value = SlotKind.sq_inplace_repeat, isComplex = true) @GenerateNodeFactory - abstract static class IMulNode extends PythonBinaryClinicBuiltinNode { + abstract static class IMulNode extends SqRepeatBuiltinNode { @Specialization static Object concat(PArray self, int value, @Bind("this") Node inliningTarget, @CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib, @Cached ArrayNodes.EnsureCapacityNode ensureCapacityNode, @Cached ArrayNodes.SetLengthNode setLengthNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { int newLength = Math.max(PythonUtils.multiplyExact(self.getLength(), value), 0); if (newLength != self.getLength()) { @@ -285,227 +499,109 @@ static Object concat(PArray self, int value, return self; } catch (OverflowException e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, MemoryError); - } - } - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return ArrayBuiltinsClinicProviders.IMulNodeClinicProviderGen.INSTANCE; - } - } - - @GenerateInline - @GenerateCached(false) - @ImportStatic({BufferFormat.class, PGuards.class}) - abstract static class EqNeHelperNode extends Node { - - abstract Object execute(VirtualFrame frame, Node inliningTarget, Object left, Object right, ComparisonOp op); - - @Specialization(guards = {"left.getFormat() == right.getFormat()", "!isFloatingPoint(left.getFormat())"}) - static boolean eqBytes(PArray left, PArray right, ComparisonOp op, - @CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib) { - if (left.getBytesLength() != right.getBytesLength()) { - return op == ComparisonOp.NE; - } - for (int i = 0; i < left.getBytesLength(); i++) { - if (bufferLib.readByte(left.getBuffer(), i) != bufferLib.readByte(right.getBuffer(), i)) { - return op == ComparisonOp.NE; - } - } - return op == ComparisonOp.EQ; - } - - @Specialization(guards = "left.getFormat() != right.getFormat()") - static boolean eqItems(VirtualFrame frame, Node inliningTarget, PArray left, PArray right, ComparisonOp op, - @Cached PyObjectRichCompareBool.EqNode eqNode, - @Exclusive @Cached ArrayNodes.GetValueNode getLeft, - @Exclusive @Cached ArrayNodes.GetValueNode getRight) { - if (left.getLength() != right.getLength()) { - return op == ComparisonOp.NE; - } - for (int i = 0; i < left.getLength(); i++) { - if (!eqNode.compare(frame, inliningTarget, getLeft.execute(inliningTarget, left, i), getRight.execute(inliningTarget, right, i))) { - return op == ComparisonOp.NE; - } - } - return op == ComparisonOp.EQ; - } - - // Separate specialization for float/double is needed because of NaN comparisons - @Specialization(guards = {"left.getFormat() == right.getFormat()", "isFloatingPoint(left.getFormat())"}) - static boolean eqDoubles(Node inliningTarget, PArray left, PArray right, ComparisonOp op, - @Exclusive @Cached ArrayNodes.GetValueNode getLeft, - @Exclusive @Cached ArrayNodes.GetValueNode getRight) { - if (left.getLength() != right.getLength()) { - return op == ComparisonOp.NE; - } - for (int i = 0; i < left.getLength(); i++) { - double leftValue = (Double) getLeft.execute(inliningTarget, left, i); - double rightValue = (Double) getRight.execute(inliningTarget, right, i); - if (leftValue != rightValue) { - return op == ComparisonOp.NE; - } + throw PRaiseNode.raiseStatic(inliningTarget, MemoryError); } - return op == ComparisonOp.EQ; - } - - @Specialization(guards = "!isArray(right)") - @SuppressWarnings("unused") - static Object eq(PArray left, Object right, ComparisonOp op) { - return PNotImplemented.NOT_IMPLEMENTED; - } - - @Specialization(guards = "!isArray(left)") - @SuppressWarnings("unused") - static Object error(Object left, Object right, ComparisonOp op, - @Cached(inline = false) PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, op.builtinName, J_ARRAY + "." + J_ARRAY, left); } } - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.tp_richcompare, isComplex = true) @GenerateNodeFactory - abstract static class EqNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object eqBytes(VirtualFrame frame, Object left, Object right, - @Bind("this") Node inliningTarget, - @Cached EqNeHelperNode helperNode) { - return helperNode.execute(frame, inliningTarget, left, right, ComparisonOp.EQ); - } - } - - @Builtin(name = J___NE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class NeNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object eqBytes(VirtualFrame frame, Object left, Object right, - @Bind("this") Node inliningTarget, - @Cached EqNeHelperNode helperNode) { - return helperNode.execute(frame, inliningTarget, left, right, ComparisonOp.NE); - } - } - - @GenerateInline - @GenerateCached(false) @ImportStatic({BufferFormat.class, PGuards.class}) - abstract static class ComparisonHelperNode extends Node { - - abstract Object execute(VirtualFrame frame, Node inliningTarget, Object left, Object right, ComparisonOp op, BinaryComparisonNode compareNode); + abstract static class ArrayRichCmpNode extends TpSlotRichCompare.RichCmpBuiltinNode { @Specialization(guards = "!isFloatingPoint(left.getFormat()) || (left.getFormat() != right.getFormat())") - static boolean cmpItems(VirtualFrame frame, Node inliningTarget, PArray left, PArray right, ComparisonOp op, BinaryComparisonNode compareNode, - @Cached PyObjectRichCompareBool.EqNode eqNode, - @Exclusive @Cached CoerceToBooleanNode.YesNode coerceToBooleanNode, + static Object cmpItems(VirtualFrame frame, PArray left, PArray right, RichCmpOp op, + @Bind Node inliningTarget, + @Exclusive @Cached InlinedBranchProfile fullCmpProfile, + @Exclusive @Cached PyObjectRichCompareBool richCmpEqNode, + @Exclusive @Cached PyObjectRichCompare richCmpOpNode, @Exclusive @Cached ArrayNodes.GetValueNode getLeft, - @Exclusive @Cached ArrayNodes.GetValueNode getRight) { + @Exclusive @Cached ArrayNodes.GetValueNode getRight, + @Exclusive @Cached InlinedLoopConditionProfile loopProfile) { + if (left.getLength() != right.getLength() && op.isEqOrNe()) { + // the same fast-path as CPython + return op == RichCmpOp.Py_NE; + } + fullCmpProfile.enter(inliningTarget); int commonLength = Math.min(left.getLength(), right.getLength()); - for (int i = 0; i < commonLength; i++) { + loopProfile.profileCounted(inliningTarget, commonLength); // ignoring the early exit + for (int i = 0; loopProfile.inject(inliningTarget, i < commonLength); i++) { Object leftValue = getLeft.execute(inliningTarget, left, i); Object rightValue = getRight.execute(inliningTarget, right, i); - if (!eqNode.compare(frame, inliningTarget, leftValue, rightValue)) { - return coerceToBooleanNode.executeBoolean(frame, inliningTarget, compareNode.executeObject(frame, leftValue, rightValue)); + if (!richCmpEqNode.execute(frame, inliningTarget, leftValue, rightValue, RichCmpOp.Py_EQ)) { + if (op == RichCmpOp.Py_EQ) { + return false; + } else if (op == RichCmpOp.Py_NE) { + return true; + } + return richCmpOpNode.execute(frame, inliningTarget, leftValue, rightValue, op); } } - return op.cmpResultToBool(left.getLength() - right.getLength()); + if (op.isEqOrNe()) { + return op.isEq(); + } + return op.compareResultToBool(left.getLength() - right.getLength()); } - // Separate specialization for float/double is needed because of NaN comparisons + // Separate specialization for float/double is needed because, normally in + // PyObjectRichCompareBool we treat NaNs as equals, this is because CPython does identity + // check in PyObjectRichCompareBool. We do not really have identity for doubles, so we + // cannot say if NaNs, which are by definition not equal (PyObjectRichCompare always returns + // false for NaN and Nan), are identical or not. So we choose that all NaNs with equal bit + // patterns are identical. This is however different for arrays, where the identity cannot + // be preserved, so here we know for sure that if we see two NaNs, PyObjectRichCompareBool + // would return false on CPython, and so we do the same. This is tested in CPython tests. @Specialization(guards = {"isFloatingPoint(left.getFormat())", "left.getFormat() == right.getFormat()"}) - static boolean cmpDoubles(VirtualFrame frame, Node inliningTarget, PArray left, PArray right, ComparisonOp op, BinaryComparisonNode compareNode, - @Exclusive @Cached CoerceToBooleanNode.YesNode coerceToBooleanNode, + static boolean cmpDoubles(VirtualFrame frame, PArray left, PArray right, RichCmpOp op, + @Bind("$node") Node inliningTarget, + @Exclusive @Cached InlinedBranchProfile fullCmpProfile, @Exclusive @Cached ArrayNodes.GetValueNode getLeft, - @Exclusive @Cached ArrayNodes.GetValueNode getRight) { + @Exclusive @Cached ArrayNodes.GetValueNode getRight, + @Exclusive @Cached InlinedLoopConditionProfile loopProfile) { + if (left.getLength() != right.getLength() && op.isEqOrNe()) { + // the same fast-path as CPython + return op == RichCmpOp.Py_NE; + } + fullCmpProfile.enter(inliningTarget); int commonLength = Math.min(left.getLength(), right.getLength()); - for (int i = 0; i < commonLength; i++) { + loopProfile.profileCounted(inliningTarget, commonLength); // ignoring the early exit + for (int i = 0; loopProfile.inject(inliningTarget, i < commonLength); i++) { double leftValue = (Double) getLeft.execute(inliningTarget, left, i); double rightValue = (Double) getRight.execute(inliningTarget, right, i); if (leftValue != rightValue) { - return coerceToBooleanNode.executeBoolean(frame, inliningTarget, compareNode.executeObject(frame, leftValue, rightValue)); + return op.compare(leftValue, rightValue); } } - return op.cmpResultToBool(left.getLength() - right.getLength()); + if (op.isEqOrNe()) { + return op.isEq(); + } + return op.compareResultToBool(left.getLength() - right.getLength()); } @Specialization(guards = "!isArray(right)") @SuppressWarnings("unused") - static Object cmp(PArray left, Object right, ComparisonOp op, BinaryComparisonNode compareNode) { + static Object cmp(PArray left, Object right, RichCmpOp op) { return PNotImplemented.NOT_IMPLEMENTED; } @Specialization(guards = "!isArray(left)") @SuppressWarnings("unused") - static Object error(Object left, Object right, ComparisonOp op, BinaryComparisonNode compareNode, - @Cached(inline = false) PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, op.builtinName, J_ARRAY + "." + J_ARRAY, left); - } - - } - - @Builtin(name = J___LT__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class LtNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object cmp(VirtualFrame frame, Object left, Object right, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode helperNode, - @Cached BinaryComparisonNode.LtNode cmpNode) { - return helperNode.execute(frame, inliningTarget, left, right, ComparisonOp.LT, cmpNode); + static Object error(Object left, Object right, RichCmpOp op, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, op.getPythonName(), J_ARRAY + "." + J_ARRAY, left); } } - @Builtin(name = J___GT__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.sq_contains, isComplex = true) @GenerateNodeFactory - abstract static class GtNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object cmp(VirtualFrame frame, Object left, Object right, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode helperNode, - @Cached BinaryComparisonNode.GtNode cmpNode) { - return helperNode.execute(frame, inliningTarget, left, right, ComparisonOp.GT, cmpNode); - } - } - - @Builtin(name = J___LE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class LeNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object cmp(VirtualFrame frame, Object left, Object right, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode helperNode, - @Cached BinaryComparisonNode.LeNode cmpNode) { - return helperNode.execute(frame, inliningTarget, left, right, ComparisonOp.LE, cmpNode); - } - } - - @Builtin(name = J___GE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class GeNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object cmp(VirtualFrame frame, Object left, Object right, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode helperNode, - @Cached BinaryComparisonNode.GeNode cmpNode) { - return helperNode.execute(frame, inliningTarget, left, right, ComparisonOp.GE, cmpNode); - } - } - - @Builtin(name = J___CONTAINS__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class ContainsNode extends PythonBinaryBuiltinNode { + abstract static class ContainsNode extends SqContainsBuiltinNode { @Specialization static boolean contains(VirtualFrame frame, PArray self, Object value, @Bind("this") Node inliningTarget, - @Cached PyObjectRichCompareBool.EqNode eqNode, + @Cached PyObjectRichCompareBool eqNode, @Cached ArrayNodes.GetValueNode getValueNode) { for (int i = 0; i < self.getLength(); i++) { - if (eqNode.compare(frame, inliningTarget, getValueNode.execute(inliningTarget, self, i), value)) { + if (eqNode.execute(frame, inliningTarget, getValueNode.execute(inliningTarget, self, i), value, RichCmpOp.Py_EQ)) { return true; } } @@ -513,13 +609,13 @@ static boolean contains(VirtualFrame frame, PArray self, Object value, } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization static TruffleString repr(VirtualFrame frame, PArray self, @Bind("this") Node inliningTarget, - @Cached("create(Repr)") LookupAndCallUnaryNode reprNode, + @Cached PyObjectReprAsTruffleStringNode repr, @Cached InlinedConditionProfile isEmptyProfile, @Cached InlinedConditionProfile isUnicodeProfile, @Cached CastToTruffleStringNode cast, @@ -537,7 +633,7 @@ static TruffleString repr(VirtualFrame frame, PArray self, if (isEmptyProfile.profile(inliningTarget, length != 0)) { if (isUnicodeProfile.profile(inliningTarget, self.getFormat() == BufferFormat.UNICODE)) { appendStringNode.execute(sb, T_COMMA_SPACE); - appendStringNode.execute(sb, cast.execute(inliningTarget, reprNode.executeObject(frame, toUnicodeNode.execute(frame, self)))); + appendStringNode.execute(sb, repr.execute(frame, inliningTarget, toUnicodeNode.execute(frame, self))); } else { appendStringNode.execute(sb, T_COMMA_SPACE); appendStringNode.execute(sb, T_LBRACKET); @@ -546,7 +642,7 @@ static TruffleString repr(VirtualFrame frame, PArray self, appendStringNode.execute(sb, T_COMMA_SPACE); } Object value = getValueNode.execute(inliningTarget, self, i); - appendStringNode.execute(sb, cast.execute(inliningTarget, reprNode.executeObject(frame, value))); + appendStringNode.execute(sb, cast.execute(inliningTarget, repr.execute(frame, inliningTarget, value))); } appendStringNode.execute(sb, T_RBRACKET); } @@ -560,14 +656,14 @@ static TruffleString repr(VirtualFrame frame, PArray self, @GenerateNodeFactory abstract static class SqItemNode extends SqItemBuiltinNode { @Specialization - static Object doIt(VirtualFrame frame, PArray self, int index, + static Object doIt(PArray self, int index, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached ArrayNodes.GetValueNode getValueNode) { return getItem(inliningTarget, self, index, raiseNode, getValueNode); } - private static Object getItem(Node inliningTarget, PArray self, int index, PRaiseNode.Lazy raiseNode, GetValueNode getValueNode) { + private static Object getItem(Node inliningTarget, PArray self, int index, PRaiseNode raiseNode, GetValueNode getValueNode) { checkBounds(inliningTarget, raiseNode, ErrorMessages.ARRAY_OUT_OF_BOUNDS, index, self.getLength()); return getValueNode.execute(inliningTarget, self, index); } @@ -580,7 +676,7 @@ abstract static class MpSubscriptNode extends MpSubscriptBuiltinNode { static Object doIndex(VirtualFrame frame, PArray self, Object idx, @Bind("this") Node inliningTarget, @Cached PyIndexCheckNode indexCheckNode, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached PyNumberAsSizeNode numberAsSizeNode, @Exclusive @Cached InlinedConditionProfile negativeIndexProfile, @Cached ArrayNodes.GetValueNode getValueNode) { @@ -602,13 +698,13 @@ static Object doSlice(PArray self, PSlice slice, @Exclusive @Cached InlinedConditionProfile simpleStepProfile, @Cached SliceNodes.SliceUnpack sliceUnpack, @Cached SliceNodes.AdjustIndices adjustIndices, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { PSlice.SliceInfo sliceInfo = adjustIndices.execute(inliningTarget, self.getLength(), sliceUnpack.execute(inliningTarget, slice)); int itemShift = itemShiftProfile.profile(inliningTarget, (byte) self.getItemSizeShift()); int itemsize = self.getItemSize(); PArray newArray; try { - newArray = factory.createArray(self.getFormatString(), self.getFormat(), sliceInfo.sliceLength); + newArray = PFactory.createArray(language, self.getFormatString(), self.getFormat(), sliceInfo.sliceLength); } catch (OverflowException e) { // It's a slice of existing array, the length cannot overflow throw CompilerDirectives.shouldNotReachHere(); @@ -625,59 +721,118 @@ static Object doSlice(PArray self, PSlice slice, } @InliningCutoff - private static PException raiseNonIntIndex(Node inliningTarget, Lazy raiseNode) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ARRAY_INDICES_MUST_BE_INTS); + private static PException raiseNonIntIndex(Node inliningTarget, PRaiseNode raiseNode) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ARRAY_INDICES_MUST_BE_INTS); } } - @Builtin(name = J___SETITEM__, minNumOfPositionalArgs = 3) + @Slot(value = SlotKind.sq_ass_item, isComplex = true) @GenerateNodeFactory - abstract static class SetItemNode extends PythonTernaryBuiltinNode { + abstract static class SetItemNode extends SqAssItemBuiltinNode { - @Specialization(guards = "!isPSlice(idx)") - static Object setitem(VirtualFrame frame, PArray self, Object idx, Object value, + @Specialization(guards = "!isNoValue(value)") + static void setitem(VirtualFrame frame, PArray self, int index, Object value, + @Bind("this") Node inliningTarget, + @Cached ArrayNodes.PutValueNode putValueNode, + @Shared @Cached PRaiseNode raiseNode) { + checkBounds(inliningTarget, raiseNode, ErrorMessages.ARRAY_ASSIGN_OUT_OF_BOUNDS, index, self.getLength()); + putValueNode.execute(frame, inliningTarget, self, index, value); + } + + @Specialization(guards = "isNoValue(value)") + static void delitem(PArray self, int index, @SuppressWarnings("unused") Object value, + @Bind("this") Node inliningTarget, + @Cached DeleteArraySliceNode deleteSliceNode, + @Shared @Cached PRaiseNode raiseNode) { + checkBounds(inliningTarget, raiseNode, ErrorMessages.ARRAY_ASSIGN_OUT_OF_BOUNDS, index, self.getLength()); + self.checkCanResize(inliningTarget, raiseNode); + deleteSliceNode.execute(inliningTarget, self, index, 1); + } + } + + @Slot(value = SlotKind.mp_ass_subscript, isComplex = true) + @GenerateNodeFactory + abstract static class SetSubscriptNode extends MpAssSubscriptBuiltinNode { + + @Specialization(guards = {"!isPSlice(idx)", "!isNoValue(value)"}) + static void setitem(VirtualFrame frame, PArray self, Object idx, Object value, @Bind("this") Node inliningTarget, - @Cached PyNumberIndexNode indexNode, - @Cached("forArrayAssign()") NormalizeIndexNode normalizeIndexNode, + @Shared @Cached PyNumberIndexNode indexNode, + @Shared @Cached("forArrayAssign()") NormalizeIndexNode normalizeIndexNode, @Cached ArrayNodes.PutValueNode putValueNode) { int index = normalizeIndexNode.execute(indexNode.execute(frame, inliningTarget, idx), self.getLength()); putValueNode.execute(frame, inliningTarget, self, index, value); - return PNone.NONE; } - @Specialization(guards = "self.getFormat() == other.getFormat()") - static Object setitem(VirtualFrame frame, PArray self, PSlice slice, PArray other, + @Specialization(guards = {"!isPSlice(idx)", "isNoValue(value)"}) + static void delitem(VirtualFrame frame, PArray self, Object idx, @SuppressWarnings("unused") Object value, + @Bind("this") Node inliningTarget, + @Shared @Cached PyNumberIndexNode indexNode, + @Shared @Cached("forArrayAssign()") NormalizeIndexNode normalizeIndexNode, + @Shared @Cached DeleteArraySliceNode deleteSliceNode, + @Exclusive @Cached PRaiseNode raiseNode) { + self.checkCanResize(inliningTarget, raiseNode); + int index = normalizeIndexNode.execute(indexNode.execute(frame, inliningTarget, idx), self.getLength()); + deleteSliceNode.execute(inliningTarget, self, index, 1); + } + + @Specialization + static void setitem(PArray self, PSlice slice, Object other, @Bind("this") Node inliningTarget, @CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib, - @Cached InlinedConditionProfile sameArrayProfile, - @Cached InlinedConditionProfile simpleStepProfile, - @Cached InlinedConditionProfile complexDeleteProfile, - @Cached InlinedConditionProfile differentLengthProfile, + @Cached InlinedBranchProfile hasOtherProfile, + @Cached InlinedBranchProfile isDelItemProfile, + @Cached InlinedBranchProfile otherTypeErrorProfile, + @Cached InlinedBranchProfile sameArrayProfile, + @Cached InlinedBranchProfile simpleStepProfile, + @Cached InlinedBranchProfile complexDeleteProfile, + @Cached InlinedBranchProfile differentLengthProfile, + @Cached InlinedBranchProfile copyProfile, + @Cached InlinedBranchProfile wrongLengthProfile, @Cached InlinedConditionProfile growProfile, - @Cached InlinedConditionProfile stepAssignProfile, + @Cached InlinedBranchProfile stepAssignProfile, @Cached InlinedByteValueProfile itemShiftProfile, @Cached SliceNodes.SliceUnpack sliceUnpack, @Cached SliceNodes.AdjustIndices adjustIndices, - @Cached DeleteArraySliceNode deleteSliceNode, + @Shared @Cached DeleteArraySliceNode deleteSliceNode, @Cached ArrayNodes.ShiftNode shiftNode, - @Cached DelItemNode delItemNode, - @Cached PRaiseNode.Lazy raiseNode) { - PSlice.SliceInfo sliceInfo = adjustIndices.execute(inliningTarget, self.getLength(), sliceUnpack.execute(inliningTarget, slice)); + @Cached ArrayNodes.SetLengthNode setLengthNode, + @Cached PRaiseNode raiseNode) { + int length = self.getLength(); + PSlice.SliceInfo sliceInfo = adjustIndices.execute(inliningTarget, length, sliceUnpack.execute(inliningTarget, slice)); int start = sliceInfo.start; int stop = sliceInfo.stop; int step = sliceInfo.step; int sliceLength = sliceInfo.sliceLength; int itemShift = itemShiftProfile.profile(inliningTarget, (byte) self.getItemSizeShift()); int itemsize = self.getItemSize(); - Object sourceBuffer = other.getBuffer(); - int needed = other.getLength(); - if (sameArrayProfile.profile(inliningTarget, sourceBuffer == self.getBuffer())) { - byte[] tmp = new byte[needed * itemsize]; - bufferLib.readIntoByteArray(other.getBuffer(), 0, tmp, 0, tmp.length); - sourceBuffer = new ByteSequenceStorage(tmp); + int needed; + Object sourceBuffer; + if (other instanceof PArray otherArray) { + hasOtherProfile.enter(inliningTarget); + if (self.getFormat() != otherArray.getFormat()) { + throw raiseNode.raise(inliningTarget, TypeError, BAD_ARG_TYPE_FOR_BUILTIN_OP); + } + sourceBuffer = otherArray.getBuffer(); + needed = otherArray.getLength(); + if (sourceBuffer == self.getBuffer()) { + sameArrayProfile.enter(inliningTarget); + byte[] tmp = new byte[needed * itemsize]; + bufferLib.readIntoByteArray(sourceBuffer, 0, tmp, 0, tmp.length); + sourceBuffer = new ByteSequenceStorage(tmp); + } + } else if (other == PNone.NO_VALUE) { + isDelItemProfile.enter(inliningTarget); + sourceBuffer = null; + needed = 0; + } else { + otherTypeErrorProfile.enter(inliningTarget); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CAN_ONLY_ASSIGN_ARRAY, other); } - if (simpleStepProfile.profile(inliningTarget, step == 1)) { - if (differentLengthProfile.profile(inliningTarget, sliceLength != needed)) { + if (step == 1) { + simpleStepProfile.enter(inliningTarget); + if (sliceLength != needed) { + differentLengthProfile.enter(inliningTarget); self.checkCanResize(inliningTarget, raiseNode); if (growProfile.profile(inliningTarget, sliceLength < needed)) { if (stop < start) { @@ -688,74 +843,13 @@ static Object setitem(VirtualFrame frame, PArray self, PSlice slice, PArray othe deleteSliceNode.execute(inliningTarget, self, start, sliceLength - needed); } } - bufferLib.readIntoBuffer(sourceBuffer, 0, self.getBuffer(), start << itemShift, needed << itemShift, bufferLib); - } else if (complexDeleteProfile.profile(inliningTarget, needed == 0)) { - delItemNode.executeSlice(frame, self, slice); - } else if (stepAssignProfile.profile(inliningTarget, needed == sliceLength)) { - for (int cur = start, i = 0; i < sliceLength; cur += step, i++) { - bufferLib.readIntoBuffer(sourceBuffer, i << itemShift, self.getBuffer(), cur << itemShift, itemsize, bufferLib); + if (needed > 0) { + copyProfile.enter(inliningTarget); + bufferLib.readIntoBuffer(sourceBuffer, 0, self.getBuffer(), start << itemShift, needed << itemShift, bufferLib); } - } else { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.ATTEMPT_ASSIGN_ARRAY_OF_SIZE, needed, sliceLength); - } - return PNone.NONE; - } - - @Specialization(guards = "self.getFormat() != other.getFormat()") - @SuppressWarnings("unused") - static Object setitemWrongFormat(PArray self, PSlice slice, PArray other, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, BAD_ARG_TYPE_FOR_BUILTIN_OP); - } - - @Specialization(guards = "!isArray(other)") - @SuppressWarnings("unused") - static Object setitemWrongType(PArray self, PSlice slice, Object other, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CAN_ONLY_ASSIGN_ARRAY, other); - } - } - - @Builtin(name = J___DELITEM__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class DelItemNode extends PythonBinaryBuiltinNode { - public abstract Object executeSlice(VirtualFrame frame, PArray self, PSlice slice); - - @Specialization(guards = "!isPSlice(idx)") - static Object delitem(VirtualFrame frame, PArray self, Object idx, - @Bind("this") Node inliningTarget, - @Cached PyNumberIndexNode indexNode, - @Cached("forArrayAssign()") NormalizeIndexNode normalizeIndexNode, - @Exclusive @Cached DeleteArraySliceNode deleteSliceNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - self.checkCanResize(inliningTarget, raiseNode); - int index = normalizeIndexNode.execute(indexNode.execute(frame, inliningTarget, idx), self.getLength()); - deleteSliceNode.execute(inliningTarget, self, index, 1); - return PNone.NONE; - } - - @Specialization - static Object delitem(PArray self, PSlice slice, - @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib, - @Exclusive @Cached DeleteArraySliceNode deleteSliceNode, - @Cached InlinedByteValueProfile itemShiftProfile, - @Cached ArrayNodes.SetLengthNode setLengthNode, - @Cached InlinedConditionProfile simpleStepProfile, - @Cached SliceNodes.SliceUnpack sliceUnpack, - @Cached SliceNodes.AdjustIndices adjustIndices, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - self.checkCanResize(inliningTarget, raiseNode); - int length = self.getLength(); - PSlice.SliceInfo sliceInfo = adjustIndices.execute(inliningTarget, length, sliceUnpack.execute(inliningTarget, slice)); - int start = sliceInfo.start; - int step = sliceInfo.step; - int sliceLength = sliceInfo.sliceLength; - int itemShift = itemShiftProfile.profile(inliningTarget, (byte) self.getItemSizeShift()); - if (sliceLength > 0) { - if (simpleStepProfile.profile(inliningTarget, step == 1)) { - deleteSliceNode.execute(inliningTarget, self, start, sliceLength); - } else { + } else if (needed == 0) { + complexDeleteProfile.enter(inliningTarget); + if (sliceLength > 0) { if (step < 0) { start += 1 + step * (sliceLength - 1) - 1; step = -step; @@ -767,19 +861,26 @@ static Object delitem(PArray self, PSlice slice, bufferLib.readIntoBuffer(self.getBuffer(), (cur + 1) << itemShift, self.getBuffer(), (cur - offset) << itemShift, (length - cur - 1) << itemShift, bufferLib); setLengthNode.execute(inliningTarget, self, length - sliceLength); } + } else if (needed == sliceLength) { + stepAssignProfile.enter(inliningTarget); + for (int cur = start, i = 0; i < sliceLength; cur += step, i++) { + bufferLib.readIntoBuffer(sourceBuffer, i << itemShift, self.getBuffer(), cur << itemShift, itemsize, bufferLib); + } + } else { + wrongLengthProfile.enter(inliningTarget); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.ATTEMPT_ASSIGN_ARRAY_OF_SIZE, needed, sliceLength); } - return PNone.NONE; } } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory abstract static class IterNode extends PythonUnaryBuiltinNode { @Specialization static Object getitem(PArray self, - @Cached PythonObjectFactory factory) { - return factory.createArrayIterator(self); + @Bind PythonLanguage language) { + return PFactory.createArrayIterator(language, self); } } @@ -810,14 +911,14 @@ static Object reduceLegacy(VirtualFrame frame, PArray self, @SuppressWarnings("u @Cached @Exclusive GetClassNode getClassNode, @Cached @Exclusive PyObjectLookupAttr lookupDict, @Cached ToListNode toListNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { Object cls = getClassNode.execute(inliningTarget, self); Object dict = lookupDict.execute(frame, inliningTarget, self, T___DICT__); if (dict == PNone.NO_VALUE) { dict = PNone.NONE; } - PTuple args = factory.createTuple(new Object[]{self.getFormatString(), toListNode.execute(frame, self)}); - return factory.createTuple(new Object[]{cls, args, dict}); + PTuple args = PFactory.createTuple(language, new Object[]{self.getFormatString(), toListNode.execute(frame, self)}); + return PFactory.createTuple(language, new Object[]{cls, args, dict}); } @Specialization(guards = "protocol >= 3") @@ -827,7 +928,7 @@ static Object reduce(VirtualFrame frame, PArray self, @SuppressWarnings("unused" @Cached @Exclusive PyObjectLookupAttr lookupDict, @Cached PyObjectGetAttr getReconstructor, @Cached ToBytesNode toBytesNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { PythonModule arrayModule = PythonContext.get(inliningTarget).lookupBuiltinModule(T_ARRAY); PArray.MachineFormat mformat = PArray.MachineFormat.forFormat(self.getFormat()); assert mformat != null; @@ -837,8 +938,8 @@ static Object reduce(VirtualFrame frame, PArray self, @SuppressWarnings("unused" dict = PNone.NONE; } Object reconstructor = getReconstructor.execute(frame, inliningTarget, arrayModule, T_ARRAY_RECONSTRUCTOR); - PTuple args = factory.createTuple(new Object[]{cls, self.getFormatString(), mformat.code, toBytesNode.execute(frame, self)}); - return factory.createTuple(new Object[]{reconstructor, args, dict}); + PTuple args = PFactory.createTuple(language, new Object[]{cls, self.getFormatString(), mformat.code, toBytesNode.execute(frame, self)}); + return PFactory.createTuple(language, new Object[]{reconstructor, args, dict}); } } @@ -869,8 +970,8 @@ abstract static class BufferInfoNode extends PythonUnaryBuiltinNode { @Specialization static Object bufferinfo(PArray self, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached ArrayNodes.EnsureNativeStorageNode ensureNativeStorageNode, - @Cached PythonObjectFactory factory, @CachedLibrary(limit = "1") InteropLibrary lib) { Object nativePointer = ensureNativeStorageNode.execute(inliningTarget, self).getPtr(); if (!(nativePointer instanceof Long)) { @@ -878,10 +979,10 @@ static Object bufferinfo(PArray self, nativePointer = lib.asPointer(nativePointer); } catch (UnsupportedMessageException e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, NotImplementedError); + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError); } } - return factory.createTuple(new Object[]{nativePointer, self.getLength()}); + return PFactory.createTuple(language, new Object[]{nativePointer, self.getLength()}); } } @@ -894,7 +995,7 @@ static Object append(VirtualFrame frame, PArray self, Object value, @Cached ArrayNodes.EnsureCapacityNode ensureCapacityNode, @Cached ArrayNodes.SetLengthNode setLengthNode, @Cached ArrayNodes.PutValueNode putValueNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { int index = self.getLength(); int newLength = PythonUtils.addExact(index, 1); @@ -905,7 +1006,7 @@ static Object append(VirtualFrame frame, PArray self, Object value, return PNone.NONE; } catch (OverflowException e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, MemoryError); + throw PRaiseNode.raiseStatic(inliningTarget, MemoryError); } } } @@ -919,7 +1020,7 @@ static Object extend(PArray self, PArray value, @CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib, @Exclusive @Cached ArrayNodes.EnsureCapacityNode ensureCapacityNode, @Exclusive @Cached ArrayNodes.SetLengthNode setLengthNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { try { int newLength = PythonUtils.addExact(self.getLength(), value.getLength()); if (newLength != self.getLength()) { @@ -932,7 +1033,7 @@ static Object extend(PArray self, PArray value, return PNone.NONE; } catch (OverflowException e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, MemoryError); + throw PRaiseNode.raiseStatic(inliningTarget, MemoryError); } } @@ -944,7 +1045,7 @@ static Object extend(VirtualFrame frame, PArray self, PSequence value, @Cached SequenceStorageNodes.GetItemScalarNode getItemNode, @Exclusive @Cached ArrayNodes.EnsureCapacityNode ensureCapacityNode, @Exclusive @Cached ArrayNodes.SetLengthNode setLengthNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { SequenceStorage storage = getSequenceStorageNode.execute(inliningTarget, value); int storageLength = storage.length(); try { @@ -955,7 +1056,7 @@ static Object extend(VirtualFrame frame, PArray self, PSequence value, } } catch (OverflowException e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, MemoryError); + throw PRaiseNode.raiseStatic(inliningTarget, MemoryError); } int length = self.getLength(); for (int i = 0; i < storageLength; i++) { @@ -972,20 +1073,18 @@ static Object extend(VirtualFrame frame, PArray self, PSequence value, static Object extend(VirtualFrame frame, PArray self, Object value, @Bind("this") Node inliningTarget, @Cached PyObjectGetIter getIter, + @Cached PyIterNextNode nextNode, @Exclusive @Cached ArrayNodes.PutValueNode putValueNode, - @Cached GetNextNode nextNode, - @Cached IsBuiltinObjectProfile errorProfile, @Exclusive @Cached ArrayNodes.EnsureCapacityNode ensureCapacityNode, @Exclusive @Cached ArrayNodes.SetLengthNode setLengthNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { Object iter = getIter.execute(frame, inliningTarget, value); int length = self.getLength(); while (true) { Object nextValue; try { - nextValue = nextNode.execute(frame, iter); - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); + nextValue = nextNode.execute(frame, inliningTarget, iter); + } catch (IteratorExhausted e) { break; } // The whole extend is not atomic, just individual inserts are. That's the same as @@ -996,7 +1095,7 @@ static Object extend(VirtualFrame frame, PArray self, Object value, ensureCapacityNode.execute(inliningTarget, self, length); } catch (OverflowException e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, MemoryError); + throw PRaiseNode.raiseStatic(inliningTarget, MemoryError); } putValueNode.execute(frame, inliningTarget, self, length - 1, nextValue); setLengthNode.execute(inliningTarget, self, length); @@ -1008,10 +1107,10 @@ static Object extend(VirtualFrame frame, PArray self, Object value, @Specialization(guards = "self.getFormat() != value.getFormat()") @SuppressWarnings("unused") static Object error(PArray self, PArray value, - @Cached PRaiseNode raiseNode) { + @Bind("this") Node inliningTarget) { // CPython allows extending an array with an arbitrary iterable. Except a differently // formatted array. Weird - throw raiseNode.raise(TypeError, ErrorMessages.CAN_ONLY_EXTEND_WITH_ARRAY_OF_SAME_KIND); + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CAN_ONLY_EXTEND_WITH_ARRAY_OF_SAME_KIND); } } @@ -1026,7 +1125,7 @@ static Object insert(VirtualFrame frame, PArray self, int inputIndex, Object val @Cached ArrayNodes.CheckValueNode checkValueNode, @Cached ArrayNodes.PutValueNode putValueNode, @Cached ArrayNodes.ShiftNode shiftNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int index = normalizeIndexNode.execute(inputIndex, self.getLength()); if (index > self.getLength()) { index = self.getLength(); @@ -1054,19 +1153,19 @@ abstract static class RemoveNode extends PythonBinaryBuiltinNode { @Specialization static Object remove(VirtualFrame frame, PArray self, Object value, @Bind("this") Node inliningTarget, - @Cached PyObjectRichCompareBool.EqNode eqNode, + @Cached PyObjectRichCompareBool eqNode, @Cached ArrayNodes.GetValueNode getValueNode, @Cached DeleteArraySliceNode deleteSliceNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { for (int i = 0; i < self.getLength(); i++) { Object item = getValueNode.execute(inliningTarget, self, i); - if (eqNode.compare(frame, inliningTarget, item, value)) { + if (eqNode.execute(frame, inliningTarget, item, value, RichCmpOp.Py_EQ)) { self.checkCanResize(inliningTarget, raiseNode); deleteSliceNode.execute(inliningTarget, self, i, 1); return PNone.NONE; } } - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.ARRAY_REMOVE_X_NOT_IN_ARRAY); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.ARRAY_REMOVE_X_NOT_IN_ARRAY); } } @@ -1080,9 +1179,9 @@ static Object pop(PArray self, int inputIndex, @Cached("forPop()") NormalizeIndexNode normalizeIndexNode, @Cached ArrayNodes.GetValueNode getValueNode, @Cached DeleteArraySliceNode deleteSliceNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (self.getLength() == 0) { - throw raiseNode.get(inliningTarget).raise(IndexError, ErrorMessages.POP_FROM_EMPTY_ARRAY); + throw raiseNode.raise(inliningTarget, IndexError, ErrorMessages.POP_FROM_EMPTY_ARRAY); } int index = normalizeIndexNode.execute(inputIndex, self.getLength()); Object value = getValueNode.execute(inliningTarget, self, index); @@ -1113,14 +1212,14 @@ static Object frombytes(VirtualFrame frame, PArray self, Object buffer, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @Cached ArrayNodes.EnsureCapacityNode ensureCapacityNode, @Cached ArrayNodes.SetLengthNode setLengthNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { int itemShift = self.getItemSizeShift(); int oldSize = self.getLength(); try { int bufferLength = bufferLib.getBufferLength(buffer); if (!PythonUtils.isDivisible(bufferLength, itemShift)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.BYTES_ARRAY_NOT_MULTIPLE_OF_ARRAY_SIZE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.BYTES_ARRAY_NOT_MULTIPLE_OF_ARRAY_SIZE); } int newLength = PythonUtils.addExact(oldSize, bufferLength >> itemShift); self.checkCanResize(inliningTarget, raiseNode); @@ -1129,7 +1228,7 @@ static Object frombytes(VirtualFrame frame, PArray self, Object buffer, bufferLib.readIntoBuffer(buffer, 0, self.getBuffer(), oldSize << itemShift, bufferLength, bufferLib); } catch (OverflowException e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, MemoryError); + throw PRaiseNode.raiseStatic(inliningTarget, MemoryError); } return PNone.NONE; } finally { @@ -1154,9 +1253,9 @@ static Object fromfile(VirtualFrame frame, PArray self, Object file, int n, @Cached PyObjectSizeNode sizeNode, @Cached InlinedConditionProfile nNegativeProfile, @Cached FromBytesNode fromBytesNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (nNegativeProfile.profile(inliningTarget, n < 0)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.NEGATIVE_COUNT); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NEGATIVE_COUNT); } int nbytes = n << self.getItemSizeShift(); Object readResult = callMethod.execute(frame, inliningTarget, file, T_READ, nbytes); @@ -1166,10 +1265,10 @@ static Object fromfile(VirtualFrame frame, PArray self, Object file, int n, // It would make more sense to check this before the frombytes call, but CPython // does it this way if (readLength != nbytes) { - throw raiseNode.get(inliningTarget).raise(EOFError, ErrorMessages.READ_DIDNT_RETURN_ENOUGH_BYTES); + throw raiseNode.raise(inliningTarget, EOFError, ErrorMessages.READ_DIDNT_RETURN_ENOUGH_BYTES); } } else { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.READ_DIDNT_RETURN_BYTES); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.READ_DIDNT_RETURN_BYTES); } return PNone.NONE; } @@ -1191,7 +1290,7 @@ static Object fromlist(VirtualFrame frame, PArray self, PList list, @Cached ArrayNodes.EnsureCapacityNode ensureCapacityNode, @Cached ArrayNodes.SetLengthNode setLengthNode, @Cached ArrayNodes.PutValueNode putValueNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { SequenceStorage storage = getSequenceStorageNode.execute(inliningTarget, list); int length = storage.length(); @@ -1205,15 +1304,15 @@ static Object fromlist(VirtualFrame frame, PArray self, PList list, return PNone.NONE; } catch (OverflowException e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, MemoryError); + throw PRaiseNode.raiseStatic(inliningTarget, MemoryError); } } @Fallback @SuppressWarnings("unused") static Object error(Object self, Object arg, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.ARG_MUST_BE_LIST); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.ARG_MUST_BE_LIST); } } @@ -1231,7 +1330,7 @@ static Object fromunicode(VirtualFrame frame, PArray self, TruffleString str, @Cached TruffleString.CreateCodePointIteratorNode createCodePointIteratorNode, @Cached TruffleStringIterator.NextNode nextNode, @Cached TruffleString.FromCodePointNode fromCodePointNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { int length = codePointLengthNode.execute(str, TS_ENCODING); int newLength = PythonUtils.addExact(self.getLength(), length); @@ -1247,15 +1346,15 @@ static Object fromunicode(VirtualFrame frame, PArray self, TruffleString str, return PNone.NONE; } catch (OverflowException e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, MemoryError); + throw PRaiseNode.raiseStatic(inliningTarget, MemoryError); } } @Fallback @SuppressWarnings("unused") static Object error(Object self, Object arg, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.FROMUNICODE_ARG_MUST_BE_STR_NOT_P, arg); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.FROMUNICODE_ARG_MUST_BE_STR_NOT_P, arg); } @Override @@ -1270,10 +1369,10 @@ abstract static class ToBytesNode extends PythonUnaryBuiltinNode { @Specialization Object tobytes(PArray self, @CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { byte[] bytes = new byte[self.getBytesLength()]; bufferLib.readIntoByteArray(self.getBuffer(), 0, bytes, 0, bytes.length); - return factory.createBytes(bytes); + return PFactory.createBytes(language, bytes); } } @@ -1297,9 +1396,9 @@ static TruffleString tounicode(PArray self, @Cached ArrayNodes.GetValueNode getValueNode, @Cached TruffleStringBuilder.AppendStringNode appendStringNode, @Cached TruffleStringBuilder.ToStringNode toStringNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (formatProfile.profile(inliningTarget, self.getFormat() != BufferFormat.UNICODE)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MAY_ONLY_BE_CALLED_ON_UNICODE_TYPE_ARRAYS); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MAY_ONLY_BE_CALLED_ON_UNICODE_TYPE_ARRAYS); } TruffleStringBuilder sb = TruffleStringBuilder.create(TS_ENCODING); int length = self.getLength(); @@ -1316,9 +1415,9 @@ abstract static class ToFileNode extends PythonBinaryBuiltinNode { @Specialization static Object tofile(VirtualFrame frame, PArray self, Object file, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib, - @Cached PyObjectCallMethodObjArgs callMethod, - @Cached PythonObjectFactory factory) { + @Cached PyObjectCallMethodObjArgs callMethod) { if (self.getLength() > 0) { int remaining = self.getBytesLength(); int blocksize = 64 * 1024; @@ -1331,7 +1430,7 @@ static Object tofile(VirtualFrame frame, PArray self, Object file, buffer = new byte[blocksize]; } bufferLib.readIntoByteArray(self.getBuffer(), i * blocksize, buffer, 0, buffer.length); - callMethod.execute(frame, inliningTarget, file, T_WRITE, factory.createBytes(buffer)); + callMethod.execute(frame, inliningTarget, file, T_WRITE, PFactory.createBytes(language, buffer)); remaining -= blocksize; } } @@ -1386,16 +1485,16 @@ private static void doByteSwapExplodedInnerLoop(Object buffer, int itemsize, int } @Builtin(name = "index", minNumOfPositionalArgs = 2, parameterNames = {"$self", "sub", "start", "end"}) - @ArgumentClinic(name = "start", conversion = ArgumentClinic.ClinicConversion.SliceIndex, defaultValue = "0", useDefaultForNone = true) - @ArgumentClinic(name = "end", conversion = ArgumentClinic.ClinicConversion.SliceIndex, defaultValue = "Integer.MAX_VALUE", useDefaultForNone = true) + @ArgumentClinic(name = "start", conversion = ArgumentClinic.ClinicConversion.SliceIndex, defaultValue = "0") + @ArgumentClinic(name = "end", conversion = ArgumentClinic.ClinicConversion.SliceIndex, defaultValue = "Integer.MAX_VALUE") @GenerateNodeFactory abstract static class IndexNode extends PythonQuaternaryClinicBuiltinNode { @Specialization static int index(VirtualFrame frame, PArray self, Object value, int start, int stop, @Bind("this") Node inliningTarget, - @Cached PyObjectRichCompareBool.EqNode eqNode, + @Cached PyObjectRichCompareBool eqNode, @Cached ArrayNodes.GetValueNode getValueNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int length = self.getLength(); if (start < 0) { start += length; @@ -1407,11 +1506,11 @@ static int index(VirtualFrame frame, PArray self, Object value, int start, int s stop += length; } for (int i = start; i < stop && i < length; i++) { - if (eqNode.compare(frame, inliningTarget, getValueNode.execute(inliningTarget, self, i), value)) { + if (eqNode.execute(frame, inliningTarget, getValueNode.execute(inliningTarget, self, i), value, RichCmpOp.Py_EQ)) { return i; } } - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.ARRAY_INDEX_X_NOT_IN_ARRAY); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.ARRAY_INDEX_X_NOT_IN_ARRAY); } @Override @@ -1426,11 +1525,11 @@ abstract static class CountNode extends PythonBinaryBuiltinNode { @Specialization static int count(VirtualFrame frame, PArray self, Object value, @Bind("this") Node inliningTarget, - @Cached PyObjectRichCompareBool.EqNode eqNode, + @Cached PyObjectRichCompareBool eqNode, @Cached ArrayNodes.GetValueNode getValueNode) { int count = 0; for (int i = 0; i < self.getLength(); i++) { - if (eqNode.compare(frame, inliningTarget, getValueNode.execute(inliningTarget, self, i), value)) { + if (eqNode.execute(frame, inliningTarget, getValueNode.execute(inliningTarget, self, i), value, RichCmpOp.Py_EQ)) { count++; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/ArrayNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/ArrayNodes.java index 5cbe44a9d6..f4570c743e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/ArrayNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/ArrayNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -112,7 +112,7 @@ static void ensure(Node inliningTarget, PArray array, int newCapacity, ensureCapacityNode.execute(inliningTarget, array.getSequenceStorage(), internalCapacity); } catch (OverflowException e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - PRaiseNode.raiseUncached(inliningTarget, PythonBuiltinClassType.MemoryError); + PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.MemoryError); } } } @@ -130,7 +130,7 @@ static void set(Node inliningTarget, PArray array, int newLength, setLenNode.execute(inliningTarget, array.getSequenceStorage(), internalLength); } catch (OverflowException e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - PRaiseNode.raiseUncached(inliningTarget, PythonBuiltinClassType.MemoryError); + PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.MemoryError); } } } @@ -170,7 +170,7 @@ static void shift(Node inliningTarget, PArray array, int from, int by, setLengthNode.execute(inliningTarget, array, newLength); } catch (OverflowException e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - PRaiseNode.raiseUncached(inliningTarget, PythonBuiltinClassType.MemoryError); + PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.MemoryError); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/PArray.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/PArray.java index 68462f32e7..7e9ca190ec 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/PArray.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/PArray.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -86,11 +86,11 @@ public PArray(Object clazz, Shape instanceShape, TruffleString formatString, Buf this.storage = new ByteSequenceStorage(EMPTY_BYTE_ARRAY); } - public PArray(Object clazz, Shape instanceShape, TruffleString formatString, BufferFormat format, int length) throws OverflowException { + public PArray(Object clazz, Shape instanceShape, TruffleString formatString, BufferFormat format, int byteSize) { super(clazz, instanceShape); this.formatString = formatString; this.format = format; - this.storage = new ByteSequenceStorage(new byte[PythonUtils.multiplyExact(length, format.bytesize)]); + this.storage = new ByteSequenceStorage(new byte[byteSize]); } public BufferFormat getFormat() { @@ -140,9 +140,9 @@ public AtomicLong getExports() { return exports; } - public void checkCanResize(Node inliningTarget, PRaiseNode.Lazy raiseNode) { + public void checkCanResize(Node inliningTarget, PRaiseNode raiseNode) { if (exports.get() != 0) { - throw raiseNode.get(inliningTarget).raise(BufferError, ErrorMessages.EXPORTS_CANNOT_RESIZE); + throw raiseNode.raise(inliningTarget, BufferError, ErrorMessages.EXPORTS_CANNOT_RESIZE); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/ANextAwaitableBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/ANextAwaitableBuiltins.java new file mode 100644 index 0000000000..1e268bfbff --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/ANextAwaitableBuiltins.java @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.builtins.objects.asyncio; + +import static com.oracle.graal.python.nodes.BuiltinNames.T_CLOSE; +import static com.oracle.graal.python.nodes.BuiltinNames.T_SEND; +import static com.oracle.graal.python.nodes.BuiltinNames.T_THROW; + +import java.util.List; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.builtins.CoreFunctions; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.generator.PGenerator; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.CallSlotTpIterNextNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; +import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.strings.TruffleString; + +@CoreFunctions(extendClasses = PythonBuiltinClassType.PAnextAwaitable) +public class ANextAwaitableBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = ANextAwaitableBuiltinsSlotsGen.SLOTS; + + @Override + protected List> getNodeFactories() { + return ANextAwaitableBuiltinsFactory.getFactories(); + } + + // anextawaitable_getiter helper + @GenerateInline + @GenerateCached(false) + abstract static class GetIterNode extends Node { + abstract Object execute(VirtualFrame frame, Node inliningTarget, PANextAwaitable self); + + @Specialization + static Object getIter(VirtualFrame frame, Node inliningTarget, PANextAwaitable self, + @Cached GetAwaitableNode getAwaitableNode) { + Object awaitable = getAwaitableNode.execute(frame, self.getWrapped()); + if (awaitable instanceof PGenerator coroutine && coroutine.getInitialPythonClass() == PythonBuiltinClassType.PCoroutine) { + return PFactory.createCoroutineWrapper(PythonLanguage.get(inliningTarget), coroutine); + } + return awaitable; + } + } + + // anextawaitable_proxy helper + @GenerateInline + @GenerateCached(false) + abstract static class ProxyNode extends Node { + abstract Object execute(VirtualFrame frame, Node inliningTarget, PANextAwaitable self, TruffleString method); + + @Specialization + static Object getIter(VirtualFrame frame, Node inliningTarget, PANextAwaitable self, TruffleString method, + @Cached GetIterNode getIterNode, + @Cached PyObjectCallMethodObjArgs callMethod, + @Cached IsBuiltinObjectProfile stopIterationProfile, + @Cached PRaiseNode raiseNode) { + Object awaitable = getIterNode.execute(frame, inliningTarget, self); + try { + return callMethod.execute(frame, inliningTarget, awaitable, method); + } catch (PException e) { + e.expect(inliningTarget, PythonBuiltinClassType.StopAsyncIteration, stopIterationProfile); + throw raiseNode.raiseStopAsyncIteration(inliningTarget, self.getDefaultValue()); + } + } + } + + @Slot(value = SlotKind.tp_iter, isComplex = true) + @Slot(value = SlotKind.am_aiter, isComplex = true) + @GenerateNodeFactory + abstract static class IterNode extends PythonUnaryBuiltinNode { + @Specialization + static Object iter(PANextAwaitable self) { + return self; + } + } + + @Slot(value = SlotKind.tp_iternext, isComplex = true) + @GenerateNodeFactory + abstract static class IterNextNode extends TpIterNextBuiltin { + @Specialization + static Object next(VirtualFrame frame, PANextAwaitable self, + @Bind Node inliningTarget, + @Cached GetIterNode getIterNode, + @Cached TpSlots.GetObjectSlotsNode getSlots, + @Cached CallSlotTpIterNextNode callIternext, + @Cached IsBuiltinObjectProfile stopIterationProfile, + @Cached PRaiseNode raiseNode) { + Object awaitable = getIterNode.execute(frame, inliningTarget, self); + TpSlots slots = getSlots.execute(inliningTarget, awaitable); + try { + return callIternext.execute(frame, inliningTarget, slots.tp_iternext(), awaitable); + } catch (PException e) { + e.expect(inliningTarget, PythonBuiltinClassType.StopAsyncIteration, stopIterationProfile); + throw raiseNode.raiseStopAsyncIteration(inliningTarget, self.getDefaultValue()); + } + } + } + + @Builtin(name = "send", minNumOfPositionalArgs = 1) + @GenerateNodeFactory + abstract static class SendNode extends PythonUnaryBuiltinNode { + @Specialization + static Object doSend(VirtualFrame frame, PANextAwaitable self, + @Bind Node inliningTarget, + @Cached ProxyNode proxyNode) { + return proxyNode.execute(frame, inliningTarget, self, T_SEND); + } + } + + @Builtin(name = "throw", minNumOfPositionalArgs = 1) + @GenerateNodeFactory + abstract static class ThrowNode extends PythonUnaryBuiltinNode { + @Specialization + static Object doThrow(VirtualFrame frame, PANextAwaitable self, + @Bind Node inliningTarget, + @Cached ProxyNode proxyNode) { + return proxyNode.execute(frame, inliningTarget, self, T_THROW); + } + } + + @Builtin(name = "close", minNumOfPositionalArgs = 1) + @GenerateNodeFactory + abstract static class CloseNode extends PythonUnaryBuiltinNode { + @Specialization + static Object doClose(VirtualFrame frame, PANextAwaitable self, + @Bind Node inliningTarget, + @Cached ProxyNode proxyNode) { + return proxyNode.execute(frame, inliningTarget, self, T_CLOSE); + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/AsyncGenSendBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/AsyncGenSendBuiltins.java index db641813be..13c7f2631f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/AsyncGenSendBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/AsyncGenSendBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,18 +41,19 @@ package com.oracle.graal.python.builtins.objects.asyncio; import static com.oracle.graal.python.builtins.objects.asyncio.PAsyncGenASend.AwaitableState; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___AWAIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__; import java.util.List; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.generator.CommonGeneratorBuiltins; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; @@ -72,12 +73,14 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PAsyncGenASend) public final class AsyncGenSendBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = AsyncGenSendBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return AsyncGenSendBuiltinsFactory.getFactories(); } - @Builtin(name = J___AWAIT__, minNumOfPositionalArgs = 1, declaresExplicitSelf = true) + @Slot(value = SlotKind.am_await, isComplex = true) @GenerateNodeFactory public abstract static class Await extends PythonUnaryBuiltinNode { @Specialization @@ -86,9 +89,9 @@ public Object doAwait(PAsyncGenASend self) { } } - @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1, declaresExplicitSelf = true) + @Slot(value = SlotKind.tp_iternext, isComplex = true) @GenerateNodeFactory - public abstract static class Next extends PythonUnaryBuiltinNode { + public abstract static class Next extends TpIterNextBuiltin { @Specialization public Object next(VirtualFrame frame, PAsyncGenASend self, @Cached Send send) { @@ -107,16 +110,15 @@ public Object send(VirtualFrame frame, PAsyncGenASend self, Object sent, @Cached CommonGeneratorBuiltins.SendNode send, @Cached IsBuiltinObjectProfile isStopIteration, @Cached IsBuiltinObjectProfile isGenExit, - @Cached IsBuiltinObjectExactProfile isAsyncGenWrappedValue, - @Cached PRaiseNode raiseStopIteration) { + @Cached IsBuiltinObjectExactProfile isAsyncGenWrappedValue) { Object result; if (self.getState() == AwaitableState.CLOSED) { - throw raiseReuse.raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.CANNOT_REUSE_ASEND); + throw raiseReuse.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.CANNOT_REUSE_ASEND); } if (self.getState() == AwaitableState.INIT) { if (self.receiver.isRunningAsync()) { - throw raiseAlreadyRunning.raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.AGEN_ALREADY_RUNNING); + throw raiseAlreadyRunning.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.AGEN_ALREADY_RUNNING); } if (sent == null || sent == PNone.NONE) { sent = self.message; @@ -131,7 +133,7 @@ public Object send(VirtualFrame frame, PAsyncGenASend self, Object sent, throw handleAGError(self.receiver, e, inliningTarget, isStopIteration, isGenExit); } try { - return unwrapAGYield(self.receiver, result, inliningTarget, isAsyncGenWrappedValue, raiseStopIteration); + return unwrapAGYield(self.receiver, result, inliningTarget, isAsyncGenWrappedValue); } catch (PException e) { self.setState(AwaitableState.CLOSED); throw e; @@ -159,12 +161,11 @@ static PException handleAGError(PAsyncGen self, PException exception, static Object unwrapAGYield(PAsyncGen self, Object result, Node inliningTarget, - IsBuiltinObjectExactProfile isAGWrappedValue, - PRaiseNode raise) { + IsBuiltinObjectExactProfile isAGWrappedValue) { if (isAGWrappedValue.profileObject(inliningTarget, result, PythonBuiltinClassType.PAsyncGenAWrappedValue)) { self.setRunningAsync(false); Object wrapped = ((PAsyncGenWrappedValue) result).getWrapped(); - throw raise.raise(PythonBuiltinClassType.StopIteration, new Object[]{wrapped}); + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.StopIteration, new Object[]{wrapped}); } return result; } @@ -181,12 +182,11 @@ public Object doThrow(VirtualFrame frame, PAsyncGenASend self, Object arg1, Obje @Cached CommonGeneratorBuiltins.ThrowNode throwNode, @Cached IsBuiltinObjectProfile isStopIteration, @Cached IsBuiltinObjectProfile isGeneratorExit, - @Cached IsBuiltinObjectExactProfile isAGWrappedValue, - @Cached PRaiseNode raiseStopIteration) { + @Cached IsBuiltinObjectExactProfile isAGWrappedValue) { Object result; if (self.getState() == AwaitableState.CLOSED) { - throw raiseReuse.raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.CANNOT_REUSE_ASEND); + throw raiseReuse.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.CANNOT_REUSE_ASEND); } try { result = throwNode.execute(frame, self.receiver, arg1, arg2, arg3); @@ -195,7 +195,7 @@ public Object doThrow(VirtualFrame frame, PAsyncGenASend self, Object arg1, Obje throw handleAGError(self.receiver, e, inliningTarget, isStopIteration, isGeneratorExit); } try { - return unwrapAGYield(self.receiver, result, inliningTarget, isAGWrappedValue, raiseStopIteration); + return unwrapAGYield(self.receiver, result, inliningTarget, isAGWrappedValue); } catch (PException e) { self.setState(AwaitableState.CLOSED); throw e; @@ -204,7 +204,7 @@ public Object doThrow(VirtualFrame frame, PAsyncGenASend self, Object arg1, Obje } } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1, declaresExplicitSelf = true) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory public abstract static class Iter extends PythonUnaryBuiltinNode { @Specialization diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/AsyncGenThrowBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/AsyncGenThrowBuiltins.java index 5d22de9a24..1cb52d8432 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/AsyncGenThrowBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/AsyncGenThrowBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,18 +43,19 @@ import static com.oracle.graal.python.builtins.objects.asyncio.PAsyncGenASend.AwaitableState; import static com.oracle.graal.python.nodes.ErrorMessages.GENERATOR_IGNORED_EXIT; import static com.oracle.graal.python.nodes.ErrorMessages.SEND_NON_NONE_TO_UNSTARTED_GENERATOR; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___AWAIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__; import java.util.List; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.generator.CommonGeneratorBuiltins; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; @@ -75,12 +76,14 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PAsyncGenAThrow) public final class AsyncGenThrowBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = AsyncGenThrowBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return AsyncGenThrowBuiltinsFactory.getFactories(); } - @Builtin(name = J___AWAIT__, minNumOfPositionalArgs = 1, declaresExplicitSelf = true) + @Slot(value = SlotKind.am_await, isComplex = true) @GenerateNodeFactory public abstract static class Await extends PythonUnaryBuiltinNode { @Specialization @@ -89,7 +92,7 @@ public Object doAwait(PAsyncGenAThrow self) { } } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1, declaresExplicitSelf = true) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory public abstract static class Iter extends PythonUnaryBuiltinNode { @Specialization @@ -98,9 +101,9 @@ public Object doIter(PAsyncGenAThrow self) { } } - @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1, declaresExplicitSelf = true) + @Slot(value = SlotKind.tp_iternext, isComplex = true) @GenerateNodeFactory - public abstract static class Next extends PythonUnaryBuiltinNode { + public abstract static class Next extends TpIterNextBuiltin { @Specialization public Object doSend(VirtualFrame frame, PAsyncGenAThrow self, @Cached Send send) { @@ -122,14 +125,13 @@ public Object send(VirtualFrame frame, PAsyncGenAThrow self, Object sent, @Cached IsBuiltinObjectExactProfile isAGWrappedValue, @Cached IsBuiltinObjectProfile isStopAsyncIter, @Cached IsBuiltinObjectProfile isGeneratorExit, - @Cached PRaiseNode raiseIgnoreExit, @Cached PRaiseNode raiseStopIteration, @Cached CommonGeneratorBuiltins.SendNode sendNode) { PAsyncGen gen = self.receiver; Object retval; if (self.getState() == AwaitableState.CLOSED) { - throw raiseReuse.raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.CANNOT_REUSE_ATHROW); + throw raiseReuse.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.CANNOT_REUSE_ATHROW); } // CPython checks for gi_frame_state here, but we don't have gi_frame_state. @@ -137,24 +139,24 @@ public Object send(VirtualFrame frame, PAsyncGenAThrow self, Object sent, // https://github.com/python/cpython/blob/main/Objects/genobject.c#L2082-L2086 if (self.receiver.isFinished()) { self.setState(AwaitableState.CLOSED); - throw raiseStopIteration.raise(PythonBuiltinClassType.StopIteration); + throw raiseStopIteration.raise(inliningTarget, PythonBuiltinClassType.StopIteration); } if (self.getState() == AwaitableState.INIT) { if (gen.isRunningAsync()) { self.setState(AwaitableState.CLOSED); - throw raiseAlreadyRunning.raise(PythonBuiltinClassType.RuntimeError); // todo - // error - // msg + throw raiseAlreadyRunning.raise(inliningTarget, PythonBuiltinClassType.RuntimeError); // todo + // error + // msg } if (gen.isClosed()) { self.setState(AwaitableState.CLOSED); - throw raiseStopAsyncIteraion.raise(PythonBuiltinClassType.StopAsyncIteration); + throw raiseStopAsyncIteraion.raise(inliningTarget, PythonBuiltinClassType.StopAsyncIteration); } if (sent != PNone.NONE) { - throw raiseNonNodeToNewCoro.raise(PythonBuiltinClassType.RuntimeError, SEND_NON_NONE_TO_UNSTARTED_GENERATOR); + throw raiseNonNodeToNewCoro.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, SEND_NON_NONE_TO_UNSTARTED_GENERATOR); } self.setState(AwaitableState.ITER); @@ -167,10 +169,10 @@ public Object send(VirtualFrame frame, PAsyncGenAThrow self, Object sent, try { retval = throwNode.execute(frame, gen, PythonBuiltinClassType.GeneratorExit, PNone.NO_VALUE, PNone.NO_VALUE); } catch (PException e) { - throw checkError(self, gen, e, inliningTarget, isStopAsyncIter, isGeneratorExit, raiseStopIteration); + throw checkError(self, gen, e, inliningTarget, isStopAsyncIter, isGeneratorExit); } if (isAGWrappedValue.profileObject(inliningTarget, retval, PythonBuiltinClassType.PAsyncGenAWrappedValue)) { - throw yieldClose(self, gen, raiseIgnoreExit); + throw yieldClose(inliningTarget, self, gen); } } else { // athrow mode @@ -178,9 +180,9 @@ public Object send(VirtualFrame frame, PAsyncGenAThrow self, Object sent, retval = throwNode.execute(frame, gen, self.arg1, self.arg2, self.arg3); } catch (PException e) { PException exception = AsyncGenSendBuiltins.handleAGError(gen, e, inliningTarget, isStopAsyncIter, isGeneratorExit); - throw checkError(self, gen, exception, inliningTarget, isStopAsyncIter, isGeneratorExit, raiseStopIteration); + throw checkError(self, gen, exception, inliningTarget, isStopAsyncIter, isGeneratorExit); } - return AsyncGenSendBuiltins.unwrapAGYield(gen, retval, inliningTarget, isAGWrappedValue, raiseStopIteration); + return AsyncGenSendBuiltins.unwrapAGYield(gen, retval, inliningTarget, isAGWrappedValue); } } @@ -192,38 +194,36 @@ public Object send(VirtualFrame frame, PAsyncGenAThrow self, Object sent, throw AsyncGenSendBuiltins.handleAGError(gen, e, inliningTarget, isStopAsyncIter, isGeneratorExit); } else { // aclose - throw checkError(self, gen, e, inliningTarget, isStopAsyncIter, isGeneratorExit, raiseStopIteration); + throw checkError(self, gen, e, inliningTarget, isStopAsyncIter, isGeneratorExit); } } if (self.arg1 != null) { - return AsyncGenSendBuiltins.unwrapAGYield(gen, retval, inliningTarget, isAGWrappedValue, raiseStopIteration); + return AsyncGenSendBuiltins.unwrapAGYield(gen, retval, inliningTarget, isAGWrappedValue); } else { // aclose if (isAGWrappedValue.profileObject(inliningTarget, retval, PythonBuiltinClassType.PAsyncGenAWrappedValue)) { - throw yieldClose(self, gen, raiseIgnoreExit); + throw yieldClose(inliningTarget, self, gen); } else { return retval; } } } - static PException yieldClose(PAsyncGenAThrow athrow, PAsyncGen gen, - PRaiseNode raiseIgnoreExit) { + static PException yieldClose(Node inliningTarget, PAsyncGenAThrow athrow, PAsyncGen gen) { gen.setRunningAsync(false); athrow.setState(AwaitableState.CLOSED); - return raiseIgnoreExit.raise(PythonBuiltinClassType.RuntimeError, GENERATOR_IGNORED_EXIT); + return PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.RuntimeError, GENERATOR_IGNORED_EXIT); } static PException checkError(PAsyncGenAThrow athrow, PAsyncGen gen, PException exception, Node inliningTarget, IsBuiltinObjectProfile isStopAsyncIter, - IsBuiltinObjectProfile isGenExit, - PRaiseNode raiseStopIteration) { + IsBuiltinObjectProfile isGenExit) { gen.setRunningAsync(false); athrow.setState(AwaitableState.CLOSED); if (athrow.arg1 == null && (isStopAsyncIter.profileException(inliningTarget, exception, PythonBuiltinClassType.StopAsyncIteration) || isGenExit.profileException(inliningTarget, exception, PythonBuiltinClassType.GeneratorExit))) { - return raiseStopIteration.raise(PythonBuiltinClassType.StopIteration); + return PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.StopIteration); } return exception; } @@ -246,13 +246,11 @@ public Object doThrow(VirtualFrame frame, PAsyncGenAThrow self, Object arg1, Obj @Cached CommonGeneratorBuiltins.ThrowNode throwNode, @Cached IsBuiltinObjectProfile isStopAsyncIteration, @Cached IsBuiltinObjectProfile isGeneratorExit, - @Cached IsBuiltinObjectExactProfile isAGWrappedValue, - @Cached PRaiseNode raiseStopIteration, - @Cached PRaiseNode raiseIgnoredExit) { + @Cached IsBuiltinObjectExactProfile isAGWrappedValue) { Object retval; if (self.getState() == AwaitableState.CLOSED) { - throw raiseReuse.raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.CANNOT_REUSE_ATHROW); + throw raiseReuse.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.CANNOT_REUSE_ATHROW); } try { @@ -264,16 +262,16 @@ public Object doThrow(VirtualFrame frame, PAsyncGenAThrow self, Object arg1, Obj // aclose() if (isStopAsyncIteration.profileException(inliningTarget, e, PythonBuiltinClassType.StopAsyncIteration) || isGeneratorExit.profileException(inliningTarget, e, PythonBuiltinClassType.GeneratorExit)) { - throw raiseStopIteration.raise(PythonBuiltinClassType.StopIteration); + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.StopIteration); } throw e; } } if (self.arg1 != null) { - return AsyncGenSendBuiltins.unwrapAGYield(self.receiver, retval, inliningTarget, isAGWrappedValue, raiseStopIteration); + return AsyncGenSendBuiltins.unwrapAGYield(self.receiver, retval, inliningTarget, isAGWrappedValue); } else { if (isAGWrappedValue.profileObject(inliningTarget, retval, PythonBuiltinClassType.PAsyncGenAWrappedValue)) { - throw Send.yieldClose(self, self.receiver, raiseIgnoredExit); + throw Send.yieldClose(inliningTarget, self, self.receiver); } return retval; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/AsyncGeneratorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/AsyncGeneratorBuiltins.java index 73cdab44da..05ce04d5b1 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/AsyncGeneratorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/AsyncGeneratorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,25 +40,27 @@ */ package com.oracle.graal.python.builtins.objects.asyncio; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___AITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ANEXT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CLASS_GETITEM__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.generator.GeneratorBuiltins; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -70,6 +72,9 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PAsyncGenerator) public final class AsyncGeneratorBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = AsyncGeneratorBuiltinsSlotsGen.SLOTS; + private static void callHooks(VirtualFrame frame, PAsyncGen self, PythonContext.PythonThreadState state, CallUnaryMethodNode invokeFirstIter) { Object firstIter = state.getAsyncgenFirstIter(); if (firstIter == null) { @@ -93,9 +98,8 @@ public abstract static class GetCode extends PythonUnaryBuiltinNode { @Specialization static Object getCode(PAsyncGen self, @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile hasCodeProfile, - @Cached PythonObjectFactory.Lazy factory) { - return self.getOrCreateCode(inliningTarget, hasCodeProfile, factory); + @Cached InlinedConditionProfile hasCodeProfile) { + return self.getOrCreateCode(inliningTarget, hasCodeProfile); } } @@ -132,11 +136,13 @@ static boolean isRunning(PAsyncGen self) { @GenerateNodeFactory public abstract static class ASend extends PythonBinaryBuiltinNode { @Specialization - Object aSend(VirtualFrame frame, PAsyncGen self, Object sent, + static Object aSend(VirtualFrame frame, PAsyncGen self, Object sent, + @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached CallUnaryMethodNode callFirstIter, - @Cached PythonObjectFactory factory) { - callHooks(frame, self, getContext().getThreadState(getLanguage()), callFirstIter); - return factory.createAsyncGeneratorASend(self, sent); + @Bind PythonLanguage language) { + callHooks(frame, self, context.getThreadState(context.getLanguage(inliningTarget)), callFirstIter); + return PFactory.createAsyncGeneratorASend(language, self, sent); } } @@ -146,15 +152,17 @@ public abstract static class AThrow extends PythonBuiltinNode { public abstract Object execute(VirtualFrame frame, PAsyncGen self, Object arg1, Object arg2, Object arg3); @Specialization - Object athrow(VirtualFrame frame, PAsyncGen self, Object arg1, Object arg2, Object arg3, + static Object athrow(VirtualFrame frame, PAsyncGen self, Object arg1, Object arg2, Object arg3, + @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached CallUnaryMethodNode callFirstIter, - @Cached PythonObjectFactory factory) { - callHooks(frame, self, getContext().getThreadState(getLanguage()), callFirstIter); - return factory.createAsyncGeneratorAThrow(self, arg1, arg2, arg3); + @Bind PythonLanguage language) { + callHooks(frame, self, context.getThreadState(context.getLanguage(inliningTarget)), callFirstIter); + return PFactory.createAsyncGeneratorAThrow(language, self, arg1, arg2, arg3); } } - @Builtin(name = J___AITER__, declaresExplicitSelf = true, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.am_aiter, isComplex = true) @GenerateNodeFactory public abstract static class AIter extends PythonUnaryBuiltinNode { @Specialization @@ -163,15 +171,17 @@ static Object aIter(PAsyncGen self) { } } - @Builtin(name = J___ANEXT__, declaresExplicitSelf = true, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.am_anext, isComplex = true) @GenerateNodeFactory public abstract static class ANext extends PythonUnaryBuiltinNode { @Specialization - Object aNext(VirtualFrame frame, PAsyncGen self, + static Object aNext(VirtualFrame frame, PAsyncGen self, + @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached CallUnaryMethodNode callFirstIter, - @Cached PythonObjectFactory factory) { - callHooks(frame, self, getContext().getThreadState(getLanguage()), callFirstIter); - return factory.createAsyncGeneratorASend(self, PNone.NONE); + @Bind PythonLanguage language) { + callHooks(frame, self, context.getThreadState(context.getLanguage(inliningTarget)), callFirstIter); + return PFactory.createAsyncGeneratorASend(language, self, PNone.NONE); } } @@ -180,10 +190,12 @@ Object aNext(VirtualFrame frame, PAsyncGen self, public abstract static class AClose extends PythonUnaryBuiltinNode { @Specialization Object aClose(VirtualFrame frame, PAsyncGen self, + @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached CallUnaryMethodNode callFirstIter, - @Cached PythonObjectFactory factory) { - callHooks(frame, self, getContext().getThreadState(getLanguage()), callFirstIter); - return factory.createAsyncGeneratorAThrow(self, null, PNone.NO_VALUE, PNone.NO_VALUE); + @Bind PythonLanguage language) { + callHooks(frame, self, context.getThreadState(context.getLanguage(inliningTarget)), callFirstIter); + return PFactory.createAsyncGeneratorAThrow(language, self, null, PNone.NO_VALUE, PNone.NO_VALUE); } } @@ -192,8 +204,8 @@ Object aClose(VirtualFrame frame, PAsyncGen self, public abstract static class ClassGetItemNode extends PythonBinaryBuiltinNode { @Specialization static Object classGetItem(Object cls, Object key, - @Cached PythonObjectFactory factory) { - return factory.createGenericAlias(cls, key); + @Bind PythonLanguage language) { + return PFactory.createGenericAlias(language, cls, key); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/CoroutineWrapperBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/CoroutineWrapperBuiltins.java index 8e0c35222f..b08ae12088 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/CoroutineWrapperBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/CoroutineWrapperBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,12 +42,16 @@ import java.util.List; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.generator.CommonGeneratorBuiltins; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; @@ -60,12 +64,15 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PCoroutineWrapper) public final class CoroutineWrapperBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = CoroutineWrapperBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return CoroutineWrapperBuiltinsFactory.getFactories(); } - @Builtin(name = "__iter__", minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory public abstract static class IterNode extends PythonUnaryBuiltinNode { @Specialization @@ -74,9 +81,9 @@ public Object getIter(PCoroutineWrapper self) { } } - @Builtin(name = "__next__", minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iternext, isComplex = true) @GenerateNodeFactory - public abstract static class NextNode extends PythonUnaryBuiltinNode { + public abstract static class NextNode extends TpIterNextBuiltin { @Specialization public Object doNext(VirtualFrame frame, PCoroutineWrapper self, @Cached CommonGeneratorBuiltins.SendNode send) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/GetAwaitableNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/GetAwaitableNode.java index f48c021293..ddd7993c76 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/GetAwaitableNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/GetAwaitableNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,75 +41,75 @@ package com.oracle.graal.python.builtins.objects.asyncio; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.generator.PGenerator; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotUnaryFunc.CallSlotUnaryNode; import com.oracle.graal.python.lib.PyIterCheckNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.truffle.api.bytecode.OperationProxy; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; +import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; +import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.Frame; +import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; @GenerateUncached -@ImportStatic(SpecialMethodSlot.class) +@OperationProxy.Proxyable @SuppressWarnings("truffle-inlining") public abstract class GetAwaitableNode extends Node { - public abstract Object execute(Frame frame, Object arg); + public abstract Object execute(VirtualFrame frame, Object arg); @Specialization public static Object doGenerator(PGenerator generator, @Bind("this") Node inliningTarget, - @Exclusive @Cached PRaiseNode.Lazy raise, - @Exclusive @Cached PRaiseNode.Lazy raiseReusedCoro) { + @Exclusive @Cached PRaiseNode raise, + @Exclusive @Cached PRaiseNode raiseReusedCoro) { if (generator.isCoroutine()) { if (generator.getYieldFrom() != null) { - throw raiseReusedCoro.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.CORO_ALREADY_AWAITED); + throw raiseReusedCoro.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.CORO_ALREADY_AWAITED); } else { return generator; } } else { - throw raise.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_BE_USED_AWAIT, "generator"); + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_BE_USED_AWAIT, "generator"); } } - @Specialization - public static Object doGeneric(Frame frame, Object awaitable, + @Fallback + public static Object doGeneric(VirtualFrame frame, Object awaitable, @Bind("this") Node inliningTarget, - @Exclusive @Cached PRaiseNode.Lazy raiseNoAwait, - @Exclusive @Cached PRaiseNode.Lazy raiseNotIter, - @Cached(parameters = "Await") LookupSpecialMethodSlotNode findAwait, - @Cached TypeNodes.GetNameNode getName, + @Exclusive @Cached PRaiseNode raiseNoAwait, + @Exclusive @Cached PRaiseNode raiseNotIter, + @Cached GetCachedTpSlotsNode getSlots, + @Cached CallSlotUnaryNode callSlot, @Cached GetClassNode getAwaitableType, @Cached GetClassNode getIteratorType, - @Cached CallUnaryMethodNode callAwait, @Cached PyIterCheckNode iterCheck) { Object type = getAwaitableType.execute(inliningTarget, awaitable); - Object getter = findAwait.execute(frame, type, awaitable); - if (getter == PNone.NO_VALUE) { - throw raiseNoAwait.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_BE_USED_AWAIT, getName.execute(inliningTarget, type)); + TpSlots slots = getSlots.execute(inliningTarget, type); + if (slots.am_await() == null) { + throw raiseNoAwait.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_BE_USED_AWAIT, type); } - Object iterator = callAwait.executeObject(getter, awaitable); + Object iterator = callSlot.execute(frame, inliningTarget, slots.am_await(), awaitable); if (iterCheck.execute(inliningTarget, iterator)) { return iterator; } Object itType = getIteratorType.execute(inliningTarget, iterator); if (itType == PythonBuiltinClassType.PCoroutine) { - throw raiseNotIter.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.AWAIT_RETURN_COROUTINE); + throw raiseNotIter.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.AWAIT_RETURN_COROUTINE); } else { - throw raiseNotIter.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.AWAIT_RETURN_NON_ITER, getName.execute(inliningTarget, itType)); + throw raiseNotIter.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.AWAIT_RETURN_NON_ITER, itType); } } + @NeverDefault public static GetAwaitableNode create() { return GetAwaitableNodeGen.create(); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/PANextAwaitable.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/PANextAwaitable.java new file mode 100644 index 0000000000..5ef9b47c30 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/PANextAwaitable.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.builtins.objects.asyncio; + +import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; +import com.oracle.truffle.api.object.Shape; + +public class PANextAwaitable extends PythonBuiltinObject { + private final Object wrapped; + private final Object defaultValue; + + public PANextAwaitable(Object cls, Shape instanceShape, Object wrapped, Object defaultValue) { + super(cls, instanceShape); + this.wrapped = wrapped; + this.defaultValue = defaultValue; + } + + public Object getWrapped() { + return wrapped; + } + + public Object getDefaultValue() { + return defaultValue; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/PAsyncGen.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/PAsyncGen.java index bfeca4b659..b10e377209 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/PAsyncGen.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/asyncio/PAsyncGen.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -58,7 +58,7 @@ public static PAsyncGen create(PythonLanguage lang, TruffleString name, TruffleS } private PAsyncGen(PythonLanguage lang, TruffleString name, TruffleString qualname, PBytecodeRootNode rootNode, RootCallTarget[] callTargets, Object[] arguments) { - super(lang, name, qualname, rootNode, callTargets, arguments, PythonBuiltinClassType.PAsyncGenerator, false); + super(lang, name, qualname, arguments, PythonBuiltinClassType.PAsyncGenerator, false, new BytecodeState(rootNode, callTargets)); } public boolean isClosed() { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bool/BoolBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bool/BoolBuiltins.java index 80085b24ea..f0f7a60502 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bool/BoolBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bool/BoolBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -25,31 +25,29 @@ */ package com.oracle.graal.python.builtins.objects.bool; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___AND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RAND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RXOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___XOR__; +import static com.oracle.graal.python.nodes.BuiltinNames.J_BOOL; import static com.oracle.graal.python.nodes.StringLiterals.T_FALSE; import static com.oracle.graal.python.nodes.StringLiterals.T_TRUE; import java.util.List; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.ints.IntBuiltins; import com.oracle.graal.python.builtins.objects.ints.PInt; -import com.oracle.graal.python.nodes.PGuards; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode; +import com.oracle.graal.python.lib.PyObjectIsTrueNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; @@ -60,15 +58,33 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.Boolean) public final class BoolBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = BoolBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return BoolBuiltinsFactory.getFactories(); } - @Builtin(name = J___STR__, minNumOfPositionalArgs = 1) - @TypeSystemReference(PythonArithmeticTypes.class) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_BOOL, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2) + @GenerateNodeFactory + public abstract static class BoolNode extends PythonBinaryBuiltinNode { + @Specialization + public static boolean bool(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object obj, + @Cached PyObjectIsTrueNode isTrue) { + return isTrue.execute(frame, obj); + } + } + + @Slot(value = SlotKind.tp_str, isComplex = true) + @TypeSystemReference(PythonIntegerTypes.class) @GenerateNodeFactory - abstract static class StrNode extends PythonBuiltinNode { + abstract static class StrNode extends PythonUnaryBuiltinNode { + @Specialization + static TruffleString doBoolean(boolean self) { + return self ? T_TRUE : T_FALSE; + } + @Specialization public static TruffleString doLong(long self) { return self == 1 ? T_TRUE : T_FALSE; @@ -80,62 +96,50 @@ public static TruffleString doPInt(PInt self) { } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class RepNode extends StrNode { } - abstract static class BaseBoolBinaryNode extends PythonBinaryBuiltinNode { - static boolean atLeastOneIsNotBoolean(Object self, Object other) { - return !PGuards.isBoolean(self) || !PGuards.isBoolean(other); - } - } - - @Builtin(name = J___AND__, minNumOfPositionalArgs = 2) - @Builtin(name = J___RAND__, minNumOfPositionalArgs = 2) - @TypeSystemReference(PythonArithmeticTypes.class) + @Slot(value = SlotKind.nb_and, isComplex = true) @GenerateNodeFactory - abstract static class AndNode extends BaseBoolBinaryNode { + abstract static class AndNode extends BinaryOpBuiltinNode { @Specialization static Object doBool(boolean self, boolean other) { return self && other; } - @Specialization(guards = "atLeastOneIsNotBoolean(self, other)") + @Fallback static Object doOther(VirtualFrame frame, Object self, Object other, @Cached IntBuiltins.AndNode andNode) { return andNode.execute(frame, self, other); } } - @Builtin(name = J___OR__, minNumOfPositionalArgs = 2) - @Builtin(name = J___ROR__, minNumOfPositionalArgs = 2) - @TypeSystemReference(PythonArithmeticTypes.class) + @Slot(value = SlotKind.nb_or, isComplex = true) @GenerateNodeFactory - abstract static class OrNode extends BaseBoolBinaryNode { + abstract static class OrNode extends BinaryOpBuiltinNode { @Specialization static Object doBool(boolean self, boolean other) { return self || other; } - @Specialization(guards = "atLeastOneIsNotBoolean(self, other)") + @Fallback static Object doOther(VirtualFrame frame, Object self, Object other, @Cached IntBuiltins.OrNode orNode) { return orNode.execute(frame, self, other); } } - @Builtin(name = J___XOR__, minNumOfPositionalArgs = 2) - @Builtin(name = J___RXOR__, minNumOfPositionalArgs = 2) - @TypeSystemReference(PythonArithmeticTypes.class) + @Slot(value = SlotKind.nb_xor, isComplex = true) @GenerateNodeFactory - abstract static class XorNode extends BaseBoolBinaryNode { + abstract static class XorNode extends BinaryOpBuiltinNode { @Specialization static Object doBool(boolean self, boolean other) { return self ^ other; } - @Specialization(guards = "atLeastOneIsNotBoolean(self, other)") + @Fallback static Object doOther(VirtualFrame frame, Object self, Object other, @Cached IntBuiltins.XorNode xorNode) { return xorNode.execute(frame, self, other); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/PythonBufferAccessLibrary.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/PythonBufferAccessLibrary.java index 2b24992b99..3aa07edd15 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/PythonBufferAccessLibrary.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/PythonBufferAccessLibrary.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -277,6 +277,21 @@ public final byte[] getInternalOrCopiedByteArray(Object receiver) { } } + /** + * Get a byte array representing the buffer contents. Unlike + * {@link #getInternalOrCopiedByteArray(Object)}, always returns a byte array with length equal + * to the buffer size, making a copy if necessary. Do not write into the byte array. + */ + public final byte[] getInternalOrCopiedExactByteArray(Object receiver) { + if (hasInternalByteArray(receiver)) { + byte[] r = getInternalByteArray(receiver); + if (r.length == getBufferLength(receiver)) { + return r; + } + } + return getCopiedByteArray(receiver); + } + /** * Read a single byte from the buffer. Bounds checks are responsibility of the caller. * diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/PythonBufferAcquireLibrary.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/PythonBufferAcquireLibrary.java index 3c1edf8028..2aa92be08f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/PythonBufferAcquireLibrary.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/PythonBufferAcquireLibrary.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -202,7 +202,7 @@ public final Object acquireWritableWithTypeError(Object receiver, String callerN try { return acquireWritable(receiver); } catch (PException e) { - throw PRaiseNode.raiseUncached(this, TypeError, ErrorMessages.S_BRACKETS_ARG_MUST_BE_READ_WRITE_BYTES_LIKE_NOT_P, callerName, receiver); + throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.S_BRACKETS_ARG_MUST_BE_READ_WRITE_BYTES_LIKE_NOT_P, callerName, receiver); } finally { IndirectCallContext.exit(frame, indirectCallData, savedState); } @@ -225,7 +225,7 @@ public final Object acquireWritableWithTypeError(Object receiver, String callerN */ @Abstract public Object acquire(Object receiver, int flags) { - throw PRaiseNode.raiseUncached(this, TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, receiver); + throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, receiver); } /** diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/ByteArrayBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/ByteArrayBuiltins.java index 9dfa8401bf..208253428e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/ByteArrayBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/ByteArrayBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -30,21 +30,9 @@ import static com.oracle.graal.python.nodes.BuiltinNames.J_APPEND; import static com.oracle.graal.python.nodes.BuiltinNames.J_BYTEARRAY; import static com.oracle.graal.python.nodes.BuiltinNames.J_EXTEND; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DELITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IADD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NE__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___HASH__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INIT__; +import static com.oracle.graal.python.runtime.exception.PythonErrorType.MemoryError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; @@ -52,12 +40,14 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.HashNotImplemented; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; @@ -80,18 +70,20 @@ import com.oracle.graal.python.builtins.objects.slice.SliceNodes; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeNodes; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.MpSubscriptBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotMpAssSubscript.MpAssSubscriptBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqItemBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqRepeatBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqAssItem.SqAssItemBuiltinNode; import com.oracle.graal.python.lib.PyByteArrayCheckNode; import com.oracle.graal.python.lib.PyIndexCheckNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyObjectGetStateNode; import com.oracle.graal.python.lib.PySliceNew; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.SpecialAttributeNames; -import com.oracle.graal.python.nodes.SpecialMethodNames; import com.oracle.graal.python.nodes.builtins.ListNodes; import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; @@ -99,43 +91,40 @@ import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; import com.oracle.graal.python.nodes.util.CastToByteNode; import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.PSequence; import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; -import com.oracle.graal.python.util.ComparisonOp; +import com.oracle.graal.python.util.OverflowException; +import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; -import com.oracle.truffle.api.dsl.GenerateCached; -import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateNodeFactory; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.strings.TruffleStringBuilder; @CoreFunctions(extendClasses = PythonBuiltinClassType.PByteArray) +@HashNotImplemented public final class ByteArrayBuiltins extends PythonBuiltins { public static final TpSlots SLOTS = ByteArrayBuiltinsSlotsGen.SLOTS; @@ -147,28 +136,24 @@ protected List> getNodeFa return ByteArrayBuiltinsFactory.getFactories(); } - @Override - public void initialize(Python3Core core) { - super.initialize(core); - addBuiltinConstant(SpecialAttributeNames.T___DOC__, // - "bytearray(iterable_of_ints) -> bytearray\n" + // - "bytearray(string, encoding[, errors]) -> bytearray\n" + // - "bytearray(bytes_or_buffer) -> mutable copy of bytes_or_buffer\n" + // - "bytearray(int) -> bytes array of size given by the parameter " + // - "initialized with null bytes\n" + // - "bytearray() -> empty bytes array\n" + // - "\n" + // - "Construct a mutable bytearray object from:\n" + // - " - an iterable yielding integers in range(256)\n" + // - " - a text string encoded using the specified encoding\n" + // - " - a bytes or a buffer object\n" + // - " - any object implementing the buffer API.\n" + // - " - an integer"); - addBuiltinConstant(T___HASH__, PNone.NONE); + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_BYTEARRAY, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class ByteArrayNode extends PythonBuiltinNode { + @Specialization + public PByteArray setEmpty(Object cls, @SuppressWarnings("unused") Object arg, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + // data filled in subsequent __init__ call - see BytesCommonBuiltins.InitNode + return PFactory.createByteArray(language, cls, getInstanceShape.execute(cls), PythonUtils.EMPTY_BYTE_ARRAY); + } + + // TODO: native allocation? } // bytearray([source[, encoding[, errors]]]) - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, parameterNames = {"$self", "source", "encoding", "errors"}) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = J_BYTEARRAY, minNumOfPositionalArgs = 1, parameterNames = {"$self", "source", "encoding", "errors"}) @ArgumentClinic(name = "encoding", conversionClass = BytesNodes.ExpectStringNode.class, args = "\"bytearray()\"") @ArgumentClinic(name = "errors", conversionClass = BytesNodes.ExpectStringNode.class, args = "\"bytearray()\"") @GenerateNodeFactory @@ -189,14 +174,14 @@ static PNone doInit(VirtualFrame frame, PByteArray self, Object source, Object e @Specialization(guards = "isNone(self)") static PNone doInit(@SuppressWarnings("unused") PByteArray self, Object source, @SuppressWarnings("unused") Object encoding, @SuppressWarnings("unused") Object errors, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_CONVERT_P_OBJ_TO_S, source, "bytearray"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CANNOT_CONVERT_P_OBJ_TO_S, source, "bytearray"); } @Specialization(guards = "!isBytes(self)") static PNone doInit(Object self, @SuppressWarnings("unused") Object source, @SuppressWarnings("unused") Object encoding, @SuppressWarnings("unused") Object errors, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, T___INIT__, "bytearray", self); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, T___INIT__, "bytearray", self); } } @@ -207,9 +192,7 @@ abstract static class GetitemNode extends SqItemBuiltinNode { static Object doInt(Object self, int key, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @Cached BytesNodes.GetBytesStorage getBytesStorage, - @Cached PRaiseNode.Lazy raiseNode, - @Cached SequenceStorageSqItemNode sqItemNode, - @Cached SequenceStorageNodes.GetItemScalarNode getItemNode) { + @Cached SequenceStorageSqItemNode sqItemNode) { SequenceStorage storage = getBytesStorage.execute(inliningTarget, self); return sqItemNode.execute(inliningTarget, storage, key, ErrorMessages.BYTEARRAY_OUT_OF_BOUNDS); } @@ -223,38 +206,68 @@ static Object doIt(VirtualFrame frame, Object self, Object idx, @Bind("this") Node inliningTarget, @Cached InlinedConditionProfile validProfile, @Cached PyIndexCheckNode indexCheckNode, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached BytesNodes.GetBytesStorage getBytesStorage, @Cached SequenceStorageMpSubscriptNode subscriptNode) { if (!validProfile.profile(inliningTarget, SequenceStorageMpSubscriptNode.isValidIndex(inliningTarget, idx, indexCheckNode))) { throw raiseNonIntIndex(inliningTarget, raiseNode, idx); } return subscriptNode.execute(frame, inliningTarget, getBytesStorage.execute(inliningTarget, self), idx, - ErrorMessages.LIST_INDEX_OUT_OF_RANGE, PythonObjectFactory::createByteArray); + ErrorMessages.LIST_INDEX_OUT_OF_RANGE, PFactory::createByteArray); } @InliningCutoff - private static PException raiseNonIntIndex(Node inliningTarget, PRaiseNode.Lazy raiseNode, Object index) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.OBJ_INDEX_MUST_BE_INT_OR_SLICES, "bytearray", index); + private static PException raiseNonIntIndex(Node inliningTarget, PRaiseNode raiseNode, Object index) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.OBJ_INDEX_MUST_BE_INT_OR_SLICES, "bytearray", index); } } - @Builtin(name = J___SETITEM__, minNumOfPositionalArgs = 3) + @Slot(value = SlotKind.sq_ass_item, isComplex = true) @GenerateNodeFactory - @ImportStatic(SpecialMethodNames.class) - abstract static class SetItemNode extends PythonTernaryBuiltinNode { + abstract static class SetItemNode extends SqAssItemBuiltinNode { - @Specialization(guards = {"!isPSlice(idx)", "indexCheckNode.execute(inliningTarget, idx)"}, limit = "1") - static PNone doItem(VirtualFrame frame, PByteArray self, Object idx, Object value, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached PyIndexCheckNode indexCheckNode, - @Cached("createSetItem()") SequenceStorageNodes.SetItemNode setItemNode) { - setItemNode.execute(frame, self.getSequenceStorage(), idx, value); - return PNone.NONE; + @Specialization(guards = "!isNoValue(value)") + static void set(PByteArray self, int index, Object value, + @Bind("this") Node inliningTarget, + @Shared @Cached("forBytearray()") NormalizeIndexNode normalizeIndexNode, + @Cached SequenceStorageNodes.SetItemScalarNode setItemNode) { + index = normalizeIndexNode.execute(index, self.getSequenceStorage().length()); + setItemNode.execute(inliningTarget, self.getSequenceStorage(), index, value); } - @Specialization - static PNone doSliceSequence(VirtualFrame frame, PByteArray self, PSlice slice, PSequence value, + @Specialization(guards = "isNoValue(value)") + static void del(PByteArray self, int index, @SuppressWarnings("unused") Object value, + @Bind("this") Node inliningTarget, + @Shared @Cached("forBytearray()") NormalizeIndexNode normalizeIndexNode, + @Cached SequenceStorageNodes.DeleteItemNode deleteItemNode) { + index = normalizeIndexNode.execute(index, self.getSequenceStorage().length()); + deleteItemNode.execute(inliningTarget, self.getSequenceStorage(), index); + } + } + + @Slot(value = SlotKind.mp_ass_subscript, isComplex = true) + @GenerateNodeFactory + abstract static class SetSubscriptNode extends MpAssSubscriptBuiltinNode { + + @Specialization(guards = {"!isPSlice(indexObj)", "!isNoValue(value)"}) + static void set(VirtualFrame frame, PByteArray self, Object indexObj, Object value, + @Bind("this") Node inliningTarget, + @Cached PyIndexCheckNode indexCheckNode, + @Cached PyNumberAsSizeNode asSizeNode, + @Cached("forBytearray()") NormalizeIndexNode normalizeIndexNode, + @Cached SequenceStorageNodes.SetItemScalarNode setItemNode, + @Cached PRaiseNode raiseNode) { + if (indexCheckNode.execute(inliningTarget, indexObj)) { + int index = asSizeNode.executeExact(frame, inliningTarget, indexObj); + index = normalizeIndexNode.execute(index, self.getSequenceStorage().length()); + setItemNode.execute(inliningTarget, self.getSequenceStorage(), index, value); + } else { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.OBJ_INDEX_MUST_BE_INT_OR_SLICES, "bytearray", indexObj); + } + } + + @Specialization(guards = "!isPString(value)") + static void doSliceSequence(VirtualFrame frame, PByteArray self, PSlice slice, PSequence value, @Bind("this") Node inliningTarget, @Cached @Shared InlinedConditionProfile differentLenProfile, @Cached @Shared SequenceNodes.GetSequenceStorageNode getSequenceStorageNode, @@ -262,7 +275,7 @@ static PNone doSliceSequence(VirtualFrame frame, PByteArray self, PSlice slice, @Cached @Shared SliceNodes.CoerceToIntSlice sliceCast, @Cached @Shared SliceNodes.SliceUnpack unpack, @Cached @Shared SliceNodes.AdjustIndices adjustIndices, - @Cached @Shared PRaiseNode.Lazy raiseNode) { + @Cached @Shared PRaiseNode raiseNode) { SequenceStorage storage = self.getSequenceStorage(); int otherLen = getSequenceStorageNode.execute(inliningTarget, value).length(); SliceInfo unadjusted = unpack.execute(inliningTarget, sliceCast.execute(inliningTarget, slice)); @@ -271,12 +284,12 @@ static PNone doSliceSequence(VirtualFrame frame, PByteArray self, PSlice slice, self.checkCanResize(inliningTarget, raiseNode); } setItemSliceNode.execute(frame, inliningTarget, storage, info, value, false); - return PNone.NONE; } - @Specialization(guards = "bufferAcquireLib.hasBuffer(value)", limit = "3") - static PNone doSliceBuffer(VirtualFrame frame, PByteArray self, PSlice slice, Object value, + @Specialization(guards = {"!isNoValue(value)", "bufferAcquireLib.hasBuffer(value)"}, limit = "3") + static void doSliceBuffer(VirtualFrame frame, PByteArray self, PSlice slice, Object value, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("value") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, @@ -286,20 +299,19 @@ static PNone doSliceBuffer(VirtualFrame frame, PByteArray self, PSlice slice, Ob @Cached @Shared SliceNodes.CoerceToIntSlice sliceCast, @Cached @Shared SliceNodes.SliceUnpack unpack, @Cached @Shared SliceNodes.AdjustIndices adjustIndices, - @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { Object buffer = bufferAcquireLib.acquireReadonly(value, frame, indirectCallData); try { // TODO avoid copying if possible. Note that it is possible that value is self - PBytes bytes = factory.createBytes(bufferLib.getCopiedByteArray(value)); - return doSliceSequence(frame, self, slice, bytes, inliningTarget, differentLenProfile, getSequenceStorageNode, setItemSliceNode, sliceCast, unpack, adjustIndices, raiseNode); + PBytes bytes = PFactory.createBytes(language, bufferLib.getCopiedByteArray(value)); + doSliceSequence(frame, self, slice, bytes, inliningTarget, differentLenProfile, getSequenceStorageNode, setItemSliceNode, sliceCast, unpack, adjustIndices, raiseNode); } finally { bufferLib.release(buffer, frame, indirectCallData); } } - @Specialization(replaces = {"doSliceSequence", "doSliceBuffer"}) - static PNone doSliceGeneric(VirtualFrame frame, PByteArray self, PSlice slice, Object value, + @Specialization(guards = "!isNoValue(value)", replaces = {"doSliceSequence", "doSliceBuffer"}) + static void doSliceGeneric(VirtualFrame frame, PByteArray self, PSlice slice, Object value, @Bind("this") Node inliningTarget, @Cached @Shared InlinedConditionProfile differentLenProfile, @Cached @Shared SequenceNodes.GetSequenceStorageNode getSequenceStorageNode, @@ -308,25 +320,18 @@ static PNone doSliceGeneric(VirtualFrame frame, PByteArray self, PSlice slice, O @Cached @Shared SliceNodes.SliceUnpack unpack, @Cached @Shared SliceNodes.AdjustIndices adjustIndices, @Cached ListNodes.ConstructListNode constructListNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { PList values = constructListNode.execute(frame, value); - return doSliceSequence(frame, self, slice, values, inliningTarget, differentLenProfile, getSequenceStorageNode, setItemSliceNode, sliceCast, unpack, adjustIndices, raiseNode); + doSliceSequence(frame, self, slice, values, inliningTarget, differentLenProfile, getSequenceStorageNode, setItemSliceNode, sliceCast, unpack, adjustIndices, raiseNode); } - @Fallback - @SuppressWarnings("unused") - static Object error(Object self, Object idx, Object value, + @Specialization(guards = "isNoValue(value)") + static void doDelete(VirtualFrame frame, PByteArray self, Object key, @SuppressWarnings("unused") Object value, + @Bind("this") Node inliningTarget, + @Cached SequenceStorageNodes.DeleteNode deleteNode, @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.OBJ_INDEX_MUST_BE_INT_OR_SLICES, "bytearray", idx); - } - - @NeverDefault - protected static SequenceStorageNodes.SetItemNode createSetItem() { - // Note the error message should never be reached, because the storage should always be - // writeable and so SetItemScalarNode should always have a specialization for it and - // inside that specialization the conversion of RHS may fail and produce Python level - // ValueError - return SequenceStorageNodes.SetItemNode.create(NormalizeIndexNode.forBytearray(), ErrorMessages.INTEGER_REQUIRED); + self.checkCanResize(inliningTarget, raiseNode); + deleteNode.execute(frame, self.getSequenceStorage(), key); } } @@ -342,7 +347,7 @@ public abstract static class InsertNode extends PythonTernaryClinicBuiltinNode { static PNone insert(VirtualFrame frame, PByteArray self, int index, int value, @Bind("this") Node inliningTarget, @Shared @Cached CastToByteNode toByteNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { self.checkCanResize(inliningTarget, raiseNode); byte v = toByteNode.execute(frame, value); ByteSequenceStorage target = (ByteSequenceStorage) self.getSequenceStorage(); @@ -356,7 +361,7 @@ static PNone insert(VirtualFrame frame, PByteArray self, int index, int value, @Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode, @Cached SequenceStorageNodes.InsertItemNode insertItemNode, @Shared @Cached CastToByteNode toByteNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { self.checkCanResize(inliningTarget, raiseNode); byte v = toByteNode.execute(frame, value); SequenceStorage storage = getSequenceStorageNode.execute(inliningTarget, self); @@ -384,7 +389,7 @@ protected ArgumentClinicProvider getArgumentClinic() { } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @@ -410,18 +415,16 @@ static Object repr(PByteArray self, } } - @Builtin(name = J___IADD__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.sq_inplace_concat, isComplex = true) @GenerateNodeFactory public abstract static class IAddNode extends PythonBinaryBuiltinNode { @Specialization static PByteArray add(PByteArray self, PBytesLike other, @Bind("this") Node inliningTarget, - @Cached @Shared SequenceStorageNodes.ConcatNode concatNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - self.checkCanResize(inliningTarget, raiseNode); - SequenceStorage res = concatNode.execute(self.getSequenceStorage(), other.getSequenceStorage()); - updateSequenceStorage(self, res); - return self; + @Shared @Cached SequenceStorageNodes.EnsureCapacityNode ensureCapacityNode, + @Shared @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, + @Shared @Cached PRaiseNode raiseNode) { + return extendWithBuffer(self, other, inliningTarget, ensureCapacityNode, bufferLib, raiseNode); } @Specialization(guards = "!isBytes(other)", limit = "3") @@ -429,67 +432,52 @@ static PByteArray add(VirtualFrame frame, PByteArray self, Object other, @Bind("this") Node inliningTarget, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("other") PythonBufferAcquireLibrary bufferAcquireLib, - @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Cached @Shared SequenceStorageNodes.ConcatNode concatNode, - @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - Object buffer; + @Shared @Cached SequenceStorageNodes.EnsureCapacityNode ensureCapacityNode, + @Shared @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, + @Shared @Cached PRaiseNode raiseNode) { + Object otherBuffer; try { - buffer = bufferAcquireLib.acquireReadonly(other, frame, indirectCallData); + otherBuffer = bufferAcquireLib.acquireReadonly(other, frame, indirectCallData); } catch (PException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANT_CONCAT_P_TO_S, other, "bytearray"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANT_CONCAT_P_TO_S, other, "bytearray"); } try { - self.checkCanResize(inliningTarget, raiseNode); - // TODO avoid copying - PBytes bytes = factory.createBytes(bufferLib.getCopiedByteArray(buffer)); - SequenceStorage res = concatNode.execute(self.getSequenceStorage(), bytes.getSequenceStorage()); - updateSequenceStorage(self, res); - return self; + return extendWithBuffer(self, otherBuffer, inliningTarget, ensureCapacityNode, bufferLib, raiseNode); } finally { - bufferLib.release(buffer, frame, indirectCallData); + bufferLib.release(otherBuffer, frame, indirectCallData); } } - private static void updateSequenceStorage(PByteArray array, SequenceStorage s) { - if (array.getSequenceStorage() != s) { - array.setSequenceStorage(s); + private static PByteArray extendWithBuffer(PByteArray self, Object otherBuffer, Node inliningTarget, SequenceStorageNodes.EnsureCapacityNode ensureCapacityNode, + PythonBufferAccessLibrary bufferLib, PRaiseNode raiseNode) { + self.checkCanResize(inliningTarget, raiseNode); + try { + int len = self.getSequenceStorage().length(); + int otherLen = bufferLib.getBufferLength(otherBuffer); + int newLen = PythonUtils.addExact(len, otherLen); + ensureCapacityNode.execute(inliningTarget, self.getSequenceStorage(), newLen); + self.getSequenceStorage().setNewLength(newLen); + bufferLib.readIntoBuffer(otherBuffer, 0, self, len, otherLen, bufferLib); + return self; + } catch (OverflowException e) { + throw raiseNode.raise(inliningTarget, MemoryError); } } } - @Builtin(name = J___IMUL__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.sq_inplace_repeat, isComplex = true) @GenerateNodeFactory - public abstract static class IMulNode extends PythonBinaryBuiltinNode { + public abstract static class IMulNode extends SqRepeatBuiltinNode { @Specialization static Object mul(VirtualFrame frame, PByteArray self, int times, @Bind("this") Node inliningTarget, - @Cached @Shared SequenceStorageNodes.RepeatNode repeatNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Cached SequenceStorageNodes.RepeatNode repeatNode, + @Cached PRaiseNode raiseNode) { self.checkCanResize(inliningTarget, raiseNode); SequenceStorage res = repeatNode.execute(frame, self.getSequenceStorage(), times); self.setSequenceStorage(res); return self; } - - @Specialization - static Object mul(VirtualFrame frame, PByteArray self, Object times, - @Bind("this") Node inliningTarget, - @Cached PyNumberAsSizeNode asSizeNode, - @Cached @Shared SequenceStorageNodes.RepeatNode repeatNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - self.checkCanResize(inliningTarget, raiseNode); - SequenceStorage res = repeatNode.execute(frame, self.getSequenceStorage(), asSizeNode.executeExact(frame, inliningTarget, times)); - self.setSequenceStorage(res); - return self; - } - - @SuppressWarnings("unused") - @Fallback - static Object mul(Object self, Object other, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CANT_MULTIPLY_SEQ_BY_NON_INT, other); - } } @Builtin(name = "remove", minNumOfPositionalArgs = 2) @@ -502,7 +490,7 @@ static PNone remove(VirtualFrame frame, PByteArray self, Object value, @Cached("createCast()") CastToByteNode cast, @Cached SequenceStorageNodes.GetInternalByteArrayNode getBytes, @Cached SequenceStorageNodes.DeleteNode deleteNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { self.checkCanResize(inliningTarget, raiseNode); SequenceStorage storage = self.getSequenceStorage(); int len = storage.length(); @@ -511,22 +499,22 @@ static PNone remove(VirtualFrame frame, PByteArray self, Object value, deleteNode.execute(frame, storage, pos); return PNone.NONE; } - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.NOT_IN_BYTEARRAY); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NOT_IN_BYTEARRAY); } @NeverDefault static CastToByteNode createCast() { - return CastToByteNode.create((val, raiseNode) -> { - throw raiseNode.raise(ValueError, ErrorMessages.BYTE_MUST_BE_IN_RANGE); - }, (val, raiseNode) -> { - throw raiseNode.raise(TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, "bytes"); + return CastToByteNode.create((node, val) -> { + throw PRaiseNode.raiseStatic(node, ValueError, ErrorMessages.BYTE_MUST_BE_IN_RANGE); + }, (node, val) -> { + throw PRaiseNode.raiseStatic(node, TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, "bytes"); }); } @Fallback static Object doError(@SuppressWarnings("unused") Object self, Object arg, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, arg); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, arg); } } @@ -539,7 +527,7 @@ static Object popLast(VirtualFrame frame, PByteArray self, @SuppressWarnings("un @Bind("this") Node inliningTarget, @Shared("getItem") @Cached SequenceStorageNodes.GetItemNode getItemNode, @Shared @Cached("createDelete()") SequenceStorageNodes.DeleteNode deleteNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { self.checkCanResize(inliningTarget, raiseNode); SequenceStorage store = self.getSequenceStorage(); Object ret = getItemNode.execute(store, -1); @@ -552,7 +540,7 @@ static Object doIndex(VirtualFrame frame, PByteArray self, Object idx, @Bind("this") Node inliningTarget, @Shared("getItem") @Cached SequenceStorageNodes.GetItemNode getItemNode, @Shared @Cached("createDelete()") SequenceStorageNodes.DeleteNode deleteNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { self.checkCanResize(inliningTarget, raiseNode); SequenceStorage store = self.getSequenceStorage(); Object ret = getItemNode.execute(frame, store, idx); @@ -562,8 +550,8 @@ static Object doIndex(VirtualFrame frame, PByteArray self, Object idx, @Fallback static Object doError(@SuppressWarnings("unused") Object self, Object arg, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, arg); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, arg); } @NeverDefault @@ -577,28 +565,6 @@ private static NormalizeIndexNode createNormalize() { } } - @Builtin(name = J___DELITEM__, minNumOfPositionalArgs = 2) - @TypeSystemReference(PythonArithmeticTypes.class) - @GenerateNodeFactory - public abstract static class DelItemNode extends PythonBinaryBuiltinNode { - @Specialization - static PNone doGeneric(VirtualFrame frame, PByteArray self, Object key, - @Bind("this") Node inliningTarget, - @Cached SequenceStorageNodes.DeleteNode deleteNode, - @Cached PRaiseNode.Lazy raiseNode) { - self.checkCanResize(inliningTarget, raiseNode); - deleteNode.execute(frame, self.getSequenceStorage(), key); - return PNone.NONE; - } - - @SuppressWarnings("unused") - @Fallback - static Object doGeneric(Object self, Object idx, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, "__delitem__", "bytearray", idx); - } - } - @Builtin(name = J_APPEND, minNumOfPositionalArgs = 2) @GenerateNodeFactory public abstract static class AppendNode extends PythonBinaryBuiltinNode { @@ -608,7 +574,7 @@ static PNone append(VirtualFrame frame, PByteArray byteArray, Object arg, @Bind("this") Node inliningTarget, @Cached("createCast()") CastToByteNode toByteNode, @Cached SequenceStorageNodes.AppendNode appendNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { byteArray.checkCanResize(inliningTarget, raiseNode); appendNode.execute(inliningTarget, byteArray.getSequenceStorage(), toByteNode.execute(frame, arg), BytesNodes.BytesLikeNoGeneralizationNode.SUPPLIER); return PNone.NONE; @@ -616,10 +582,10 @@ static PNone append(VirtualFrame frame, PByteArray byteArray, Object arg, @NeverDefault static CastToByteNode createCast() { - return CastToByteNode.create((val, raiseNode) -> { - throw raiseNode.raise(ValueError, ErrorMessages.BYTE_MUST_BE_IN_RANGE); - }, (val, raiseNode) -> { - throw raiseNode.raise(TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, "bytes"); + return CastToByteNode.create((node, val) -> { + throw PRaiseNode.raiseStatic(node, ValueError, ErrorMessages.BYTE_MUST_BE_IN_RANGE); + }, (node, val) -> { + throw PRaiseNode.raiseStatic(node, TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, "bytes"); }); } } @@ -634,7 +600,7 @@ static PNone doBytes(VirtualFrame frame, PByteArray self, PBytesLike source, @Bind("this") Node inliningTarget, @Cached IteratorNodes.GetLength lenNode, @Cached("createExtend()") @Shared SequenceStorageNodes.ExtendNode extendNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { self.checkCanResize(inliningTarget, raiseNode); int len = lenNode.execute(frame, inliningTarget, source); extend(frame, self, source, len, extendNode); @@ -644,6 +610,7 @@ static PNone doBytes(VirtualFrame frame, PByteArray self, PBytesLike source, @Specialization(guards = "!isBytes(source)", limit = "3") static PNone doGeneric(VirtualFrame frame, PByteArray self, Object source, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("source") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, @@ -651,8 +618,7 @@ static PNone doGeneric(VirtualFrame frame, PByteArray self, Object source, @Cached BytesNodes.IterableToByteNode iterableToByteNode, @Cached IsBuiltinObjectProfile errorProfile, @Cached("createExtend()") @Shared SequenceStorageNodes.ExtendNode extendNode, - @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { self.checkCanResize(inliningTarget, raiseNode); byte[] b; if (bufferProfile.profile(inliningTarget, bufferAcquireLib.hasBuffer(source))) { @@ -668,10 +634,10 @@ static PNone doGeneric(VirtualFrame frame, PByteArray self, Object source, b = iterableToByteNode.execute(frame, source); } catch (PException e) { e.expect(inliningTarget, TypeError, errorProfile); - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANT_EXTEND_BYTEARRAY_WITH_P, source); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANT_EXTEND_BYTEARRAY_WITH_P, source); } } - PByteArray bytes = factory.createByteArray(b); + PByteArray bytes = PFactory.createByteArray(language, b); extend(frame, self, bytes, b.length, extendNode); return PNone.NONE; } @@ -695,10 +661,12 @@ public abstract static class CopyNode extends PythonBuiltinNode { @Specialization static PByteArray copy(PByteArray byteArray, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached GetClassNode getClassNode, - @Cached SequenceStorageNodes.ToByteArrayNode toByteArray, - @Cached PythonObjectFactory factory) { - return factory.createByteArray(getClassNode.execute(inliningTarget, byteArray), toByteArray.execute(inliningTarget, byteArray.getSequenceStorage())); + @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Cached SequenceStorageNodes.ToByteArrayNode toByteArray) { + Object cls = getClassNode.execute(inliningTarget, byteArray); + return PFactory.createByteArray(language, cls, getInstanceShape.execute(cls), toByteArray.execute(inliningTarget, byteArray.getSequenceStorage())); } } @@ -726,7 +694,7 @@ static PNone clear(VirtualFrame frame, PByteArray byteArray, @Bind("this") Node inliningTarget, @Cached SequenceStorageNodes.DeleteNode deleteNode, @Cached PySliceNew sliceNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { byteArray.checkCanResize(inliningTarget, raiseNode); deleteNode.execute(frame, byteArray.getSequenceStorage(), sliceNode.execute(inliningTarget, PNone.NONE, PNone.NONE, 1)); return PNone.NONE; @@ -739,28 +707,24 @@ static PNone clear(VirtualFrame frame, PByteArray byteArray, @GenerateNodeFactory public abstract static class FromHexNode extends PythonBinaryClinicBuiltinNode { - @Specialization(guards = "isBuiltinBytesType(inliningTarget, cls, isSameType)") - static PByteArray doBytes(Object cls, TruffleString str, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Shared("isSameType") @Cached IsSameTypeNode isSameType, + @Specialization(guards = "isBuiltinByteArrayType(cls)") + static PByteArray doBytes(@SuppressWarnings("unused") Object cls, TruffleString str, @Shared("hexToBytes") @Cached HexStringToBytesNode hexStringToBytesNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createByteArray(cls, hexStringToBytesNode.execute(str)); + @Bind PythonLanguage language) { + return PFactory.createByteArray(language, hexStringToBytesNode.execute(str)); } - @Specialization(guards = "!isBuiltinBytesType(inliningTarget, cls, isSameType)") + @Specialization(guards = "!isBuiltinByteArrayType(cls)") static Object doGeneric(VirtualFrame frame, Object cls, TruffleString str, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Shared("isSameType") @Cached IsSameTypeNode isSameType, @Cached CallNode callNode, @Shared("hexToBytes") @Cached HexStringToBytesNode hexStringToBytesNode, - @Shared @Cached PythonObjectFactory factory) { - PByteArray byteArray = factory.createByteArray(hexStringToBytesNode.execute(str)); + @Bind PythonLanguage language) { + PByteArray byteArray = PFactory.createByteArray(language, hexStringToBytesNode.execute(str)); return callNode.execute(frame, cls, byteArray); } - protected static boolean isBuiltinBytesType(Node inliningTarget, Object cls, IsSameTypeNode isSameTypeNode) { - return isSameTypeNode.execute(inliningTarget, PythonBuiltinClassType.PBytes, cls); + protected static boolean isBuiltinByteArrayType(Object cls) { + return cls == PythonBuiltinClassType.PByteArray; } @Override @@ -774,54 +738,39 @@ protected ArgumentClinicProvider getArgumentClinic() { @GenerateNodeFactory public abstract static class TranslateNode extends BytesNodes.BaseTranslateNode { - @Specialization(guards = "isNoValue(delete)") - static PByteArray translate(PByteArray self, @SuppressWarnings("unused") PNone table, @SuppressWarnings("unused") PNone delete, - @Shared("toBytes") @Cached BytesNodes.ToBytesNode toBytesNode, - @Shared @Cached PythonObjectFactory factory) { - byte[] content = toBytesNode.execute(self); - return factory.createByteArray(content); - } - - @Specialization(guards = "!isNone(table)") - static PByteArray translate(VirtualFrame frame, PByteArray self, Object table, @SuppressWarnings("unused") PNone delete, - @Bind("this") Node inliningTarget, - @Shared("profile") @Cached InlinedConditionProfile isLenTable256Profile, - @Shared("toBytes") @Cached BytesNodes.ToBytesNode toBytesNode, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - byte[] bTable = toBytesNode.execute(frame, table); - checkLengthOfTable(inliningTarget, bTable, isLenTable256Profile, raiseNode); - byte[] bSelf = toBytesNode.execute(self); - - Result result = translate(bSelf, bTable); - return factory.createByteArray(result.array); - } - - @Specialization(guards = "isNone(table)") - static PByteArray delete(VirtualFrame frame, PByteArray self, @SuppressWarnings("unused") PNone table, Object delete, - @Shared("toBytes") @Cached BytesNodes.ToBytesNode toBytesNode, - @Shared @Cached PythonObjectFactory factory) { - byte[] bSelf = toBytesNode.execute(self); - byte[] bDelete = toBytesNode.execute(frame, delete); - - Result result = delete(bSelf, bDelete); - return factory.createByteArray(result.array); - } - - @Specialization(guards = {"!isPNone(table)", "!isPNone(delete)"}) - static PByteArray translateAndDelete(VirtualFrame frame, PByteArray self, Object table, Object delete, + @Specialization + static PByteArray translate(VirtualFrame frame, PByteArray self, Object table, Object delete, @Bind("this") Node inliningTarget, - @Shared("profile") @Cached InlinedConditionProfile isLenTable256Profile, - @Shared("toBytes") @Cached BytesNodes.ToBytesNode toBytesNode, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - byte[] bTable = toBytesNode.execute(frame, table); - checkLengthOfTable(inliningTarget, bTable, isLenTable256Profile, raiseNode); - byte[] bDelete = toBytesNode.execute(frame, delete); + @Bind PythonLanguage language, + @Cached InlinedConditionProfile isLenTable256Profile, + @Cached InlinedBranchProfile hasTable, + @Cached InlinedBranchProfile hasDelete, + @Cached BytesNodes.ToBytesNode toBytesNode, + @Cached PRaiseNode raiseNode) { + byte[] bTable = null; + if (table != PNone.NONE) { + hasTable.enter(inliningTarget); + bTable = toBytesNode.execute(frame, table); + checkLengthOfTable(inliningTarget, bTable, isLenTable256Profile, raiseNode); + } + byte[] bDelete = null; + if (delete != PNone.NO_VALUE) { + hasDelete.enter(inliningTarget); + bDelete = toBytesNode.execute(frame, delete); + } byte[] bSelf = toBytesNode.execute(self); - Result result = translateAndDelete(bSelf, bTable, bDelete); - return factory.createByteArray(result.array); + Result result; + if (bTable != null && bDelete != null) { + result = translateAndDelete(bSelf, bTable, bDelete); + } else if (bTable != null) { + result = translate(bSelf, bTable); + } else if (bDelete != null) { + result = delete(bSelf, bDelete); + } else { + return PFactory.createByteArray(language, bSelf); + } + return PFactory.createByteArray(language, result.array); } } @@ -838,22 +787,22 @@ public static int alloc(PByteArray byteArray) { } } - protected static Object commonReduce(int proto, byte[] bytes, int len, Object clazz, Object dict, - PythonObjectFactory factory, TruffleStringBuilder.AppendCodePointNode appendCodePointNode, TruffleStringBuilder.ToStringNode toStringNode) { + static Object commonReduce(int proto, byte[] bytes, int len, Object clazz, Object dict, + PythonLanguage language, TruffleStringBuilder.AppendCodePointNode appendCodePointNode, TruffleStringBuilder.ToStringNode toStringNode) { TruffleStringBuilder sb = TruffleStringBuilder.create(TS_ENCODING); BytesUtils.repr(sb, bytes, len, appendCodePointNode); TruffleString str = toStringNode.execute(sb); Object contents; if (proto < 3) { - contents = factory.createTuple(new Object[]{str, T_LATIN_1}); + contents = PFactory.createTuple(language, new Object[]{str, T_LATIN_1}); } else { if (len > 0) { - contents = factory.createTuple(new Object[]{str, len}); + contents = PFactory.createTuple(language, new Object[]{str, len}); } else { - contents = factory.createTuple(new Object[0]); + contents = PFactory.createTuple(language, new Object[0]); } } - return factory.createTuple(new Object[]{clazz, contents, dict}); + return PFactory.createTuple(language, new Object[]{clazz, contents, dict}); } @Builtin(name = J___REDUCE__, minNumOfPositionalArgs = 1) @@ -863,28 +812,26 @@ protected abstract static class ReduceNode extends PythonUnaryBuiltinNode { @Specialization static Object reduce(VirtualFrame frame, PByteArray self, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached SequenceStorageNodes.GetInternalByteArrayNode getBytes, @Cached GetClassNode getClassNode, @Cached PyObjectGetStateNode getStateNode, @Cached TruffleStringBuilder.AppendCodePointNode appendCodePointNode, - @Cached TruffleStringBuilder.ToStringNode toStringNode, - @Cached PythonObjectFactory factory) { + @Cached TruffleStringBuilder.ToStringNode toStringNode) { byte[] bytes = getBytes.execute(inliningTarget, self.getSequenceStorage()); int len = self.getSequenceStorage().length(); Object state = getStateNode.execute(frame, inliningTarget, self); Object clazz = getClassNode.execute(inliningTarget, self); - return commonReduce(2, bytes, len, clazz, state, factory, appendCodePointNode, toStringNode); + return commonReduce(2, bytes, len, clazz, state, language, appendCodePointNode, toStringNode); } } - @GenerateInline - @GenerateCached(false) - abstract static class ComparisonHelperNode extends Node { - - abstract Object execute(VirtualFrame frame, Node inliningTarget, Object self, Object other, ComparisonOp op); - + @Slot(value = SlotKind.tp_richcompare, isComplex = true) + @GenerateNodeFactory + abstract static class RichCmpNode extends TpSlotRichCompare.RichCmpBuiltinNode { @Specialization - static boolean cmp(Node inliningTarget, PByteArray self, PBytesLike other, ComparisonOp op, + static boolean cmp(PByteArray self, PBytesLike other, RichCmpOp op, + @Bind("$node") Node inliningTarget, @Exclusive @Cached GetInternalByteArrayNode getArray) { SequenceStorage selfStorage = self.getSequenceStorage(); SequenceStorage otherStorage = other.getSequenceStorage(); @@ -893,7 +840,8 @@ static boolean cmp(Node inliningTarget, PByteArray self, PBytesLike other, Compa @Specialization(guards = {"check.execute(inliningTarget, self)", "acquireLib.hasBuffer(other)"}, limit = "3") @InliningCutoff - static Object cmp(VirtualFrame frame, Node inliningTarget, Object self, Object other, ComparisonOp op, + static Object cmp(VirtualFrame frame, Object self, Object other, RichCmpOp op, + @Bind("$node") Node inliningTarget, @Cached("createFor(this)") IndirectCallData indirectCallData, @SuppressWarnings("unused") @Exclusive @Cached PyByteArrayCheckNode check, @Cached GetBytesStorage getBytesStorage, @@ -912,7 +860,8 @@ static Object cmp(VirtualFrame frame, Node inliningTarget, Object self, Object o @Specialization(guards = {"check.execute(inliningTarget, self)", "!acquireLib.hasBuffer(other)"}) @SuppressWarnings("unused") - static Object cmp(VirtualFrame frame, Node inliningTarget, Object self, Object other, ComparisonOp op, + static Object cmp(VirtualFrame frame, Object self, Object other, RichCmpOp op, + @Bind("$node") Node inliningTarget, @Shared @Cached PyByteArrayCheckNode check, @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib) { return PNotImplemented.NOT_IMPLEMENTED; @@ -921,83 +870,10 @@ static Object cmp(VirtualFrame frame, Node inliningTarget, Object self, Object o @Specialization(guards = "!check.execute(inliningTarget, self)") @InliningCutoff @SuppressWarnings("unused") - static Object error(VirtualFrame frame, Node inliningTarget, Object self, Object other, ComparisonOp op, - @Shared @Cached PyByteArrayCheckNode check, - @Cached(inline = false) PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, op.builtinName, J_BYTEARRAY, self); + static Object error(VirtualFrame frame, Object self, Object other, RichCmpOp op, + @Bind("$node") Node inliningTarget, + @Shared @Cached PyByteArrayCheckNode check) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, op.getPythonName(), J_BYTEARRAY, self); } } - - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class EqNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object cmp(VirtualFrame frame, Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode helperNode) { - return helperNode.execute(frame, inliningTarget, self, other, ComparisonOp.EQ); - } - } - - @Builtin(name = J___NE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class NeNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object cmp(VirtualFrame frame, Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode helperNode) { - return helperNode.execute(frame, inliningTarget, self, other, ComparisonOp.NE); - } - } - - @Builtin(name = J___LT__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class LtNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object cmp(VirtualFrame frame, Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode helperNode) { - return helperNode.execute(frame, inliningTarget, self, other, ComparisonOp.LT); - } - } - - @Builtin(name = J___LE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class LeNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object cmp(VirtualFrame frame, Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode helperNode) { - return helperNode.execute(frame, inliningTarget, self, other, ComparisonOp.LE); - } - } - - @Builtin(name = J___GT__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class GtNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object cmp(VirtualFrame frame, Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode helperNode) { - return helperNode.execute(frame, inliningTarget, self, other, ComparisonOp.GT); - } - } - - @Builtin(name = J___GE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class GeNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object cmp(VirtualFrame frame, Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode helperNode) { - return helperNode.execute(frame, inliningTarget, self, other, ComparisonOp.GE); - } - } - } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesBuiltins.java index 3473083143..0c4236a56b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -26,30 +26,31 @@ package com.oracle.graal.python.builtins.objects.bytes; import static com.oracle.graal.python.builtins.objects.bytes.BytesNodes.compareByteArrays; +import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_BYTES_SUBTYPE_NEW; import static com.oracle.graal.python.nodes.BuiltinNames.J_BYTES; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___BYTES__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___BYTES__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; +import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary; +import com.oracle.graal.python.builtins.objects.bytes.BytesBuiltinsClinicProviders.BytesNewNodeClinicProviderGen; +import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; +import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.SequenceStorageMpSubscriptNode; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.SequenceStorageSqItemNode; @@ -57,23 +58,31 @@ import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.MpSubscriptBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.HashBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqItemBuiltinNode; import com.oracle.graal.python.lib.PyBytesCheckExactNode; import com.oracle.graal.python.lib.PyBytesCheckNode; import com.oracle.graal.python.lib.PyIndexCheckNode; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.call.CallNode; +import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; +import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; -import com.oracle.graal.python.util.ComparisonOp; +import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -83,13 +92,15 @@ import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.api.strings.TruffleStringBuilder; @CoreFunctions(extendClasses = PythonBuiltinClassType.PBytes) public class BytesBuiltins extends PythonBuiltins { @@ -100,16 +111,107 @@ protected List> getNodeFa return BytesBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + // bytes([source[, encoding[, errors]]]) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_BYTES, minNumOfPositionalArgs = 1, parameterNames = {"$self", "source", "encoding", "errors"}) + @ArgumentClinic(name = "encoding", conversionClass = BytesNodes.ExpectStringNode.class, args = "\"bytes()\"") + @ArgumentClinic(name = "errors", conversionClass = BytesNodes.ExpectStringNode.class, args = "\"bytes()\"") @GenerateNodeFactory - public abstract static class InitNode extends PythonVarargsBuiltinNode { + public abstract static class BytesNewNode extends PythonQuaternaryClinicBuiltinNode { - @SuppressWarnings("unused") @Override - public Object varArgExecute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported { - return PNone.NONE; + protected ArgumentClinicProvider getArgumentClinic() { + return BytesNewNodeClinicProviderGen.INSTANCE; } + @SuppressWarnings("unused") + @Specialization(guards = "isNoValue(source)") + static Object doEmpty(Object cls, PNone source, PNone encoding, PNone errors, + @Bind("this") Node inliningTarget, + @Exclusive @Cached CreateBytes createBytes) { + return createBytes.execute(inliningTarget, cls, PythonUtils.EMPTY_BYTE_ARRAY); + } + + @Specialization(guards = "!isNoValue(source)") + static Object doCallBytes(VirtualFrame frame, Object cls, Object source, PNone encoding, PNone errors, + @Bind("this") Node inliningTarget, + @Cached GetClassNode getClassNode, + @Cached InlinedConditionProfile hasBytes, + @Cached("create(T___BYTES__)") LookupSpecialMethodNode lookupBytes, + @Cached CallUnaryMethodNode callBytes, + @Cached BytesNodes.ToBytesNode toBytesNode, + @Cached PyBytesCheckNode check, + @Exclusive @Cached BytesNodes.BytesInitNode bytesInitNode, + @Exclusive @Cached CreateBytes createBytes, + @Cached PRaiseNode raiseNode) { + Object bytesMethod = lookupBytes.execute(frame, getClassNode.execute(inliningTarget, source), source); + if (hasBytes.profile(inliningTarget, bytesMethod != PNone.NO_VALUE)) { + Object bytes = callBytes.executeObject(frame, bytesMethod, source); + if (check.execute(inliningTarget, bytes)) { + if (cls == PythonBuiltinClassType.PBytes) { + return bytes; + } else { + return createBytes.execute(inliningTarget, cls, toBytesNode.execute(frame, bytes)); + } + } else { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.RETURNED_NONBYTES, T___BYTES__, bytes); + } + } + return createBytes.execute(inliningTarget, cls, bytesInitNode.execute(frame, inliningTarget, source, encoding, errors)); + } + + @Specialization(guards = {"isNoValue(source) || (!isNoValue(encoding) || !isNoValue(errors))"}) + static Object dontCallBytes(VirtualFrame frame, Object cls, Object source, Object encoding, Object errors, + @Bind("this") Node inliningTarget, + @Exclusive @Cached BytesNodes.BytesInitNode bytesInitNode, + @Exclusive @Cached CreateBytes createBytes) { + return createBytes.execute(inliningTarget, cls, bytesInitNode.execute(frame, inliningTarget, source, encoding, errors)); + } + + @GenerateInline + @GenerateCached(false) + abstract static class CreateBytes extends PNodeWithContext { + abstract Object execute(Node inliningTarget, Object cls, byte[] bytes); + + @Specialization(guards = "isBuiltinBytes(cls)") + static PBytes doBuiltin(@SuppressWarnings("unused") Object cls, byte[] bytes, + @Bind PythonLanguage language) { + return PFactory.createBytes(language, bytes); + } + + @Specialization(guards = "!needsNativeAllocationNode.execute(inliningTarget, cls)") + static PBytes doManaged(@SuppressWarnings("unused") Node inliningTarget, Object cls, byte[] bytes, + @SuppressWarnings("unused") @Shared @Cached TypeNodes.NeedsNativeAllocationNode needsNativeAllocationNode, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createBytes(language, cls, getInstanceShape.execute(cls), bytes); + } + + @Specialization(guards = "needsNativeAllocationNode.execute(inliningTarget, cls)") + static Object doNative(@SuppressWarnings("unused") Node inliningTarget, Object cls, byte[] bytes, + @SuppressWarnings("unused") @Shared @Cached TypeNodes.NeedsNativeAllocationNode needsNativeAllocationNode, + @Cached(inline = false) CApiTransitions.PythonToNativeNode toNative, + @Cached(inline = false) CApiTransitions.NativeToPythonTransferNode toPython, + @Cached(inline = false) CExtNodes.PCallCapiFunction call) { + CArrayWrappers.CByteArrayWrapper wrapper = new CArrayWrappers.CByteArrayWrapper(bytes); + try { + return toPython.execute(call.call(FUN_BYTES_SUBTYPE_NEW, toNative.execute(cls), wrapper, bytes.length)); + } finally { + wrapper.free(); + } + } + + protected static boolean isBuiltinBytes(Object cls) { + return cls == PythonBuiltinClassType.PBytes; + } + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "bytes", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class InitNode extends PythonVarargsBuiltinNode { + @SuppressWarnings("unused") @Specialization static Object byteDone(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) { @@ -117,6 +219,25 @@ static Object byteDone(VirtualFrame frame, Object self, Object[] arguments, PKey } } + @Slot(value = SlotKind.tp_hash, isComplex = true) + @GenerateNodeFactory + abstract static class HashNode extends HashBuiltinNode { + @Specialization(limit = "3") + static long hash(VirtualFrame frame, Object self, + @Bind("this") Node inliningTarget, + @Cached("createFor(this)") IndirectCallData indirectCallData, + @CachedLibrary("self") PythonBufferAcquireLibrary acquireLib, + @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, + @Cached BytesNodes.HashBufferNode hashBufferNode) { + Object buffer = acquireLib.acquireReadonly(self, frame, indirectCallData); + try { + return hashBufferNode.execute(inliningTarget, buffer); + } finally { + bufferLib.release(buffer, frame, indirectCallData); + } + } + } + @Slot(value = SlotKind.sq_item, isComplex = true) @GenerateNodeFactory abstract static class GetitemNode extends SqItemBuiltinNode { @@ -124,9 +245,7 @@ abstract static class GetitemNode extends SqItemBuiltinNode { static Object doInt(Object self, int key, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @Cached BytesNodes.GetBytesStorage getBytesStorage, - @Cached PRaiseNode.Lazy raiseNode, - @Cached SequenceStorageSqItemNode sqItemNode, - @Cached SequenceStorageNodes.GetItemScalarNode getItemNode) { + @Cached SequenceStorageSqItemNode sqItemNode) { SequenceStorage storage = getBytesStorage.execute(inliningTarget, self); return sqItemNode.execute(inliningTarget, storage, key, ErrorMessages.BYTES_OUT_OF_BOUNDS); } @@ -140,38 +259,30 @@ static Object doIt(VirtualFrame frame, Object self, Object idx, @Bind("this") Node inliningTarget, @Cached InlinedConditionProfile validProfile, @Cached PyIndexCheckNode indexCheckNode, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached BytesNodes.GetBytesStorage getBytesStorage, @Cached SequenceStorageMpSubscriptNode subscriptNode) { if (!validProfile.profile(inliningTarget, SequenceStorageMpSubscriptNode.isValidIndex(inliningTarget, idx, indexCheckNode))) { throw raiseNonIntIndex(inliningTarget, raiseNode, idx); } return subscriptNode.execute(frame, inliningTarget, getBytesStorage.execute(inliningTarget, self), idx, - ErrorMessages.LIST_INDEX_OUT_OF_RANGE, PythonObjectFactory::createBytes); + ErrorMessages.LIST_INDEX_OUT_OF_RANGE, PFactory::createBytes); } @InliningCutoff - private static PException raiseNonIntIndex(Node inliningTarget, PRaiseNode.Lazy raiseNode, Object index) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.OBJ_INDEX_MUST_BE_INT_OR_SLICES, "byte", index); + private static PException raiseNonIntIndex(Node inliningTarget, PRaiseNode raiseNode, Object index) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.OBJ_INDEX_MUST_BE_INT_OR_SLICES, "byte", index); } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization public static TruffleString repr(Object self, @Bind("this") Node inliningTarget, - @Cached BytesNodes.GetBytesStorage getBytesStorage, - @Cached SequenceStorageNodes.GetInternalByteArrayNode getBytes, - @Cached TruffleStringBuilder.AppendCodePointNode appendCodePointNode, - @Cached TruffleStringBuilder.ToStringNode toStringNode) { - SequenceStorage store = getBytesStorage.execute(inliningTarget, self); - byte[] bytes = getBytes.execute(inliningTarget, store); - int len = store.length(); - TruffleStringBuilder sb = TruffleStringBuilder.create(TS_ENCODING); - BytesUtils.reprLoop(sb, bytes, len, appendCodePointNode); - return toStringNode.execute(sb); + @Cached BytesNodes.BytesReprNode reprNode) { + return reprNode.execute(inliningTarget, self); } } @@ -180,71 +291,43 @@ public static TruffleString repr(Object self, @GenerateNodeFactory public abstract static class TranslateNode extends BytesNodes.BaseTranslateNode { - @Specialization(guards = {"isNoValue(delete)", "checkExactNode.execute(this, self)"}) - static PBytes translate(PBytes self, @SuppressWarnings("unused") PNone table, @SuppressWarnings("unused") PNone delete, - @SuppressWarnings("unused") @Shared @Cached PyBytesCheckExactNode checkExactNode) { - return self; - } - - @Specialization(guards = {"isNoValue(delete)", "!checkExactNode.execute(this, self)"}) - static PBytes translate(Object self, @SuppressWarnings("unused") PNone table, @SuppressWarnings("unused") PNone delete, - @SuppressWarnings("unused") @Shared @Cached PyBytesCheckExactNode checkExactNode, - @Shared("toBytes") @Cached BytesNodes.ToBytesNode toBytesNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createBytes(toBytesNode.execute(null, self)); - } - - @Specialization(guards = "!isNone(table)") - static Object translate(VirtualFrame frame, Object self, Object table, @SuppressWarnings("unused") PNone delete, + @Specialization + static Object translate(VirtualFrame frame, Object self, Object table, Object delete, @Bind("this") Node inliningTarget, - @Shared @Cached PyBytesCheckExactNode checkExactNode, - @Shared("profile") @Cached InlinedConditionProfile isLenTable256Profile, - @Shared("toBytes") @Cached BytesNodes.ToBytesNode toBytesNode, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - byte[] bTable = toBytesNode.execute(frame, table); - checkLengthOfTable(inliningTarget, bTable, isLenTable256Profile, raiseNode); - byte[] bSelf = toBytesNode.execute(null, self); - - Result result = translate(bSelf, bTable); - if (result.changed || !checkExactNode.execute(inliningTarget, self)) { - return factory.createBytes(result.array); + @Bind PythonLanguage language, + @Cached InlinedConditionProfile isLenTable256Profile, + @Cached InlinedBranchProfile hasTable, + @Cached InlinedBranchProfile hasDelete, + @Cached BytesNodes.ToBytesNode toBytesNode, + @Cached PyBytesCheckExactNode checkExactNode, + @Cached PRaiseNode raiseNode) { + byte[] bTable = null; + if (table != PNone.NONE) { + hasTable.enter(inliningTarget); + bTable = toBytesNode.execute(frame, table); + checkLengthOfTable(inliningTarget, bTable, isLenTable256Profile, raiseNode); } - return self; - } - - @Specialization(guards = "isNone(table)") - static Object delete(VirtualFrame frame, Object self, @SuppressWarnings("unused") PNone table, Object delete, - @Bind("this") Node inliningTarget, - @Shared @Cached PyBytesCheckExactNode checkExactNode, - @Shared("toBytes") @Cached BytesNodes.ToBytesNode toBytesNode, - @Shared @Cached PythonObjectFactory factory) { - byte[] bSelf = toBytesNode.execute(null, self); - byte[] bDelete = toBytesNode.execute(frame, delete); - - Result result = delete(bSelf, bDelete); - if (result.changed || !checkExactNode.execute(inliningTarget, self)) { - return factory.createBytes(result.array); + byte[] bDelete = null; + if (delete != PNone.NO_VALUE) { + hasDelete.enter(inliningTarget); + bDelete = toBytesNode.execute(frame, delete); } - return self; - } - - @Specialization(guards = {"!isPNone(table)", "!isPNone(delete)"}) - static Object translateAndDelete(VirtualFrame frame, Object self, Object table, Object delete, - @Bind("this") Node inliningTarget, - @Shared @Cached PyBytesCheckExactNode checkExactNode, - @Shared("profile") @Cached InlinedConditionProfile isLenTable256Profile, - @Shared("toBytes") @Cached BytesNodes.ToBytesNode toBytesNode, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - byte[] bTable = toBytesNode.execute(frame, table); - checkLengthOfTable(inliningTarget, bTable, isLenTable256Profile, raiseNode); - byte[] bDelete = toBytesNode.execute(frame, delete); byte[] bSelf = toBytesNode.execute(null, self); - Result result = translateAndDelete(bSelf, bTable, bDelete); + Result result; + if (bTable != null && bDelete != null) { + result = translateAndDelete(bSelf, bTable, bDelete); + } else if (bTable != null) { + result = translate(bSelf, bTable); + } else if (bDelete != null) { + result = delete(bSelf, bDelete); + } else if (!checkExactNode.execute(inliningTarget, self)) { + return PFactory.createBytes(language, bSelf); + } else { + return self; + } if (result.changed || !checkExactNode.execute(inliningTarget, self)) { - return factory.createBytes(result.array); + return PFactory.createBytes(language, result.array); } return self; } @@ -256,28 +339,24 @@ static Object translateAndDelete(VirtualFrame frame, Object self, Object table, @GenerateNodeFactory public abstract static class FromHexNode extends PythonBinaryClinicBuiltinNode { - @Specialization(guards = "isBuiltinBytesType(inliningTarget, cls, isSameType)") - static PBytes doBytes(Object cls, TruffleString str, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Shared("isSameType") @Cached TypeNodes.IsSameTypeNode isSameType, + @Specialization(guards = "isBuiltinBytesType(cls)") + static PBytes doBytes(@SuppressWarnings("unused") Object cls, TruffleString str, @Shared("hexToBytes") @Cached BytesNodes.HexStringToBytesNode hexStringToBytesNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createBytes(cls, hexStringToBytesNode.execute(str)); + @Bind PythonLanguage language) { + return PFactory.createBytes(language, hexStringToBytesNode.execute(str)); } - @Specialization(guards = "!isBuiltinBytesType(inliningTarget, cls, isSameType)") + @Specialization(guards = "!isBuiltinBytesType(cls)") static Object doGeneric(VirtualFrame frame, Object cls, TruffleString str, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Shared("isSameType") @Cached TypeNodes.IsSameTypeNode isSameType, @Cached CallNode callNode, @Shared("hexToBytes") @Cached BytesNodes.HexStringToBytesNode hexStringToBytesNode, - @Shared @Cached PythonObjectFactory factory) { - PBytes bytes = factory.createBytes(hexStringToBytesNode.execute(str)); + @Bind PythonLanguage language) { + PBytes bytes = PFactory.createBytes(language, hexStringToBytesNode.execute(str)); return callNode.execute(frame, cls, bytes); } - protected static boolean isBuiltinBytesType(Node inliningTarget, Object cls, TypeNodes.IsSameTypeNode isSameTypeNode) { - return isSameTypeNode.execute(inliningTarget, PythonBuiltinClassType.PBytes, cls); + protected static boolean isBuiltinBytesType(Object cls) { + return cls == PythonBuiltinClassType.PBytes; } @Override @@ -286,16 +365,15 @@ protected ArgumentClinicProvider getArgumentClinic() { } } - @GenerateInline - @GenerateCached(false) + @Slot(value = SlotKind.tp_richcompare, isComplex = false) + @GenerateNodeFactory + @GenerateUncached // N.B. bytes only allow comparing to bytes, bytearray has its own implementation that uses // buffer API - abstract static class ComparisonHelperNode extends Node { - - abstract Object execute(Node inliningTarget, Object self, Object other, ComparisonOp op); - + abstract static class RichCmpNode extends TpSlotRichCompare.RichCmpBuiltinNode { @Specialization - static boolean cmp(Node inliningTarget, PBytes self, PBytes other, ComparisonOp op, + static boolean cmp(PBytes self, PBytes other, RichCmpOp op, + @Bind("$node") Node inliningTarget, @Exclusive @Cached SequenceStorageNodes.GetInternalByteArrayNode getArray) { SequenceStorage selfStorage = self.getSequenceStorage(); SequenceStorage otherStorage = other.getSequenceStorage(); @@ -303,11 +381,12 @@ static boolean cmp(Node inliningTarget, PBytes self, PBytes other, ComparisonOp } @Fallback - static Object cmp(Node inliningTarget, Object self, Object other, ComparisonOp op, + static Object cmp(Object self, Object other, RichCmpOp op, + @Bind("$node") Node inliningTarget, @SuppressWarnings("unused") @Cached PyBytesCheckNode check, @Cached BytesNodes.GetBytesStorage getBytesStorage, @Exclusive @Cached SequenceStorageNodes.GetInternalByteArrayNode getArray, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (check.execute(inliningTarget, self)) { if (check.execute(inliningTarget, other)) { SequenceStorage selfStorage = getBytesStorage.execute(inliningTarget, self); @@ -317,79 +396,7 @@ static Object cmp(Node inliningTarget, Object self, Object other, ComparisonOp o return PNotImplemented.NOT_IMPLEMENTED; } } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, op.builtinName, J_BYTES, self); - } - } - - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class EqNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object cmp(Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode helperNode) { - return helperNode.execute(inliningTarget, self, other, ComparisonOp.EQ); - } - } - - @Builtin(name = J___NE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class NeNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object cmp(Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode helperNode) { - return helperNode.execute(inliningTarget, self, other, ComparisonOp.NE); - } - } - - @Builtin(name = J___LT__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class LtNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object cmp(Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode helperNode) { - return helperNode.execute(inliningTarget, self, other, ComparisonOp.LT); - } - } - - @Builtin(name = J___LE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class LeNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object cmp(Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode helperNode) { - return helperNode.execute(inliningTarget, self, other, ComparisonOp.LE); - } - } - - @Builtin(name = J___GT__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class GtNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object cmp(Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode helperNode) { - return helperNode.execute(inliningTarget, self, other, ComparisonOp.GT); - } - } - - @Builtin(name = J___GE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class GeNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object cmp(Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode helperNode) { - return helperNode.execute(inliningTarget, self, other, ComparisonOp.GE); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, op.getPythonName(), J_BYTES, self); } } @@ -399,13 +406,13 @@ abstract static class BytesNode extends PythonUnaryBuiltinNode { @Specialization static Object bytes(Object self, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached PyBytesCheckExactNode check, - @Cached BytesNodes.GetBytesStorage getBytesStorage, - @Cached PythonObjectFactory.Lazy factory) { + @Cached BytesNodes.GetBytesStorage getBytesStorage) { if (check.execute(inliningTarget, self)) { return self; } else { - return factory.get(inliningTarget).createBytes(getBytesStorage.execute(inliningTarget, self)); + return PFactory.createBytes(language, getBytesStorage.execute(inliningTarget, self)); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesCommonBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesCommonBuiltins.java index c229021a71..576b0cbc9d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesCommonBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesCommonBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -43,12 +43,7 @@ import static com.oracle.graal.python.nodes.ErrorMessages.METHOD_REQUIRES_A_BYTES_OBJECT_GOT_P; import static com.oracle.graal.python.nodes.ErrorMessages.SEP_MUST_BE_ASCII; import static com.oracle.graal.python.nodes.ErrorMessages.SEP_MUST_BE_LENGTH_1; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CONTAINS__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GETNEWARGS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___MOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RMOD__; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; import static com.oracle.graal.python.nodes.StringLiterals.T_IGNORE; import static com.oracle.graal.python.nodes.StringLiterals.T_REPLACE; @@ -104,8 +99,10 @@ import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.SqConcatBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqRepeatBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqContains.SqContainsBuiltinNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyNumberIndexNode; import com.oracle.graal.python.nodes.ErrorMessages; @@ -125,7 +122,6 @@ import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentCastNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext; @@ -134,7 +130,7 @@ import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonErrorType; import com.oracle.graal.python.runtime.formatting.BytesFormatProcessor; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.OverflowException; @@ -153,7 +149,6 @@ import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; @@ -199,12 +194,12 @@ public static CodingErrorAction toCodingErrorAction(TruffleString errors, Truffl return null; } - public static CodingErrorAction toCodingErrorAction(Node inliningTarget, TruffleString errors, PRaiseNode.Lazy raiseNode, TruffleString.EqualNode eqNode) { + public static CodingErrorAction toCodingErrorAction(Node inliningTarget, TruffleString errors, PRaiseNode raiseNode, TruffleString.EqualNode eqNode) { CodingErrorAction action = toCodingErrorAction(errors, eqNode); if (action != null) { return action; } - throw raiseNode.get(inliningTarget).raise(PythonErrorType.LookupError, ErrorMessages.UNKNOWN_ERROR_HANDLER, errors); + throw raiseNode.raise(inliningTarget, PythonErrorType.LookupError, ErrorMessages.UNKNOWN_ERROR_HANDLER, errors); } @TruffleBoundary @@ -245,10 +240,10 @@ static Object decode(VirtualFrame frame, Object self, TruffleString encoding, Tr @Bind("this") Node inliningTarget, @Cached CodecsModuleBuiltins.DecodeNode decodeNode, @Cached IsInstanceNode isInstanceNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object result = decodeNode.executeWithStrings(frame, self, encoding, errors); if (!isInstanceNode.executeWith(frame, result, PythonBuiltinClassType.PString)) { - throw raiseNode.get(inliningTarget).raise(TypeError, DECODER_RETURNED_P_INSTEAD_OF_BYTES, encoding, result); + throw raiseNode.raise(inliningTarget, TypeError, DECODER_RETURNED_P_INSTEAD_OF_BYTES, encoding, result); } return result; } @@ -278,10 +273,9 @@ static PBytesLike join(VirtualFrame frame, Object self, Object iterable, @Cached GetBytesStorage getBytesStorage, @Cached SequenceStorageNodes.ToByteArrayNode toByteArrayNode, @Cached BytesNodes.BytesJoinNode bytesJoinNode, - @Cached BytesNodes.CreateBytesNode create, - @Cached PythonObjectFactory factory) { + @Cached BytesNodes.CreateBytesNode create) { byte[] res = bytesJoinNode.execute(frame, inliningTarget, toByteArrayNode.execute(inliningTarget, getBytesStorage.execute(inliningTarget, self)), iterable); - return create.execute(inliningTarget, factory, self, res); + return create.execute(inliningTarget, self, res); } } @@ -291,12 +285,11 @@ public abstract static class ConcatNode extends SqConcatBuiltinNode { @Specialization static PBytesLike add(PBytesLike self, PBytesLike other, - @Bind("this") Node node, - @Cached("createWithOverflowError()") @Shared SequenceStorageNodes.ConcatNode concatNode, - @Cached @Exclusive BytesNodes.CreateBytesNode create, - @Shared @Cached PythonObjectFactory factory) { - SequenceStorage res = concatNode.execute(self.getSequenceStorage(), other.getSequenceStorage()); - return create.execute(node, factory, self, res); + @Bind Node inliningTarget, + @Shared @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, + @Shared @Cached BytesNodes.CreateBytesNode create, + @Shared @Cached PRaiseNode raiseNode) { + return concatBuffers(self, self, other, inliningTarget, bufferLib, create, raiseNode); } @Specialization(limit = "3") @@ -305,24 +298,35 @@ static PBytesLike add(VirtualFrame frame, Object self, Object other, @Cached("createFor(this)") IndirectCallData indirectCallData, @Cached GetBytesStorage getBytesStorage, @CachedLibrary("other") PythonBufferAcquireLibrary bufferAcquireLib, - @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Cached("createWithOverflowError()") @Shared SequenceStorageNodes.ConcatNode concatNode, - @Cached @Exclusive BytesNodes.CreateBytesNode create, - @Shared @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - Object buffer; + @Shared @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, + @Shared @Cached BytesNodes.CreateBytesNode create, + @Shared @Cached PRaiseNode raiseNode) { + Object otherBuffer; try { - buffer = bufferAcquireLib.acquireReadonly(other, frame, indirectCallData); + otherBuffer = bufferAcquireLib.acquireReadonly(other, frame, indirectCallData); } catch (PException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANT_CONCAT_P_TO_S, other, "bytearray"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANT_CONCAT_P_TO_P, other, self); } try { - // TODO avoid copying - byte[] bytes = bufferLib.getCopiedByteArray(buffer); - SequenceStorage res = concatNode.execute(getBytesStorage.execute(inliningTarget, self), new ByteSequenceStorage(bytes)); - return create.execute(inliningTarget, factory, self, res); + SequenceStorage selfBuffer = getBytesStorage.execute(inliningTarget, self); + return concatBuffers(self, selfBuffer, otherBuffer, inliningTarget, bufferLib, create, raiseNode); } finally { - bufferLib.release(buffer, frame, indirectCallData); + bufferLib.release(otherBuffer, frame, indirectCallData); + } + } + + private static PBytesLike concatBuffers(Object self, Object selfBuffer, Object otherBuffer, Node inliningTarget, PythonBufferAccessLibrary bufferLib, BytesNodes.CreateBytesNode create, + PRaiseNode raiseNode) { + try { + int len = bufferLib.getBufferLength(selfBuffer); + int otherLen = bufferLib.getBufferLength(otherBuffer); + int newLen = PythonUtils.addExact(len, otherLen); + byte[] newBytes = new byte[newLen]; + bufferLib.readIntoByteArray(selfBuffer, 0, newBytes, 0, len); + bufferLib.readIntoByteArray(otherBuffer, 0, newBytes, len, otherLen); + return create.execute(inliningTarget, self, new ByteSequenceStorage(newBytes)); + } catch (OverflowException e) { + throw raiseNode.raise(inliningTarget, OverflowError); } } } @@ -335,45 +339,25 @@ static PBytesLike mul(VirtualFrame frame, Object self, int times, @Bind("this") Node inliningTarget, @Cached GetBytesStorage getBytesStorage, @Cached("createWithOverflowError()") SequenceStorageNodes.RepeatNode repeatNode, - @Cached BytesNodes.CreateBytesNode create, - @Cached PythonObjectFactory factory) { + @Cached BytesNodes.CreateBytesNode create) { SequenceStorage res = repeatNode.execute(frame, getBytesStorage.execute(inliningTarget, self), times); - return create.execute(inliningTarget, factory, self, res); - } - } - - @Builtin(name = J___HASH__, minNumOfPositionalArgs = 1) - @GenerateNodeFactory - abstract static class HashNode extends PythonUnaryBuiltinNode { - @Specialization(limit = "3") - static long hash(VirtualFrame frame, Object self, - @Bind("this") Node inliningTarget, - @Cached("createFor(this)") IndirectCallData indirectCallData, - @CachedLibrary("self") PythonBufferAcquireLibrary acquireLib, - @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, - @Cached BytesNodes.HashBufferNode hashBufferNode) { - Object buffer = acquireLib.acquireReadonly(self, frame, indirectCallData); - try { - return hashBufferNode.execute(inliningTarget, buffer); - } finally { - bufferLib.release(buffer, frame, indirectCallData); - } + return create.execute(inliningTarget, self, res); } } - @Builtin(name = J___MOD__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.nb_remainder, isComplex = true) @GenerateNodeFactory - abstract static class ModNode extends PythonBinaryBuiltinNode { + abstract static class ModNode extends BinaryOpBuiltinNode { - @Specialization(limit = "3") + @Specialization(guards = "check.execute(inliningTarget, self)", limit = "1") static Object mod(VirtualFrame frame, Object self, Object right, @Bind("this") Node inliningTarget, + @SuppressWarnings("unused") @Cached BytesLikeCheck check, @Cached("createFor(this)") IndirectCallData indirectCallData, - @CachedLibrary("self") PythonBufferAcquireLibrary acquireLib, + @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @Cached BytesNodes.CreateBytesNode create, - @Cached TupleBuiltins.GetItemNode getTupleItemNode, - @Cached PythonObjectFactory factory) { + @Cached TupleBuiltins.GetItemNode getTupleItemNode) { Object buffer = acquireLib.acquireReadonly(self, frame, indirectCallData); try { byte[] bytes = bufferLib.getInternalOrCopiedByteArray(buffer); @@ -382,7 +366,7 @@ static Object mod(VirtualFrame frame, Object self, Object right, Object savedState = IndirectCallContext.enter(frame, indirectCallData); try { byte[] data = formatter.format(right); - return create.execute(inliningTarget, factory, self, data); + return create.execute(inliningTarget, self, data); } finally { IndirectCallContext.exit(frame, indirectCallData, savedState); } @@ -391,14 +375,8 @@ static Object mod(VirtualFrame frame, Object self, Object right, } } - } - - @Builtin(name = J___RMOD__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class RModNode extends PythonBinaryBuiltinNode { - @SuppressWarnings("unused") - @Specialization - Object mod(Object self, Object right) { + @Fallback + static Object doOther(@SuppressWarnings("unused") Object self, @SuppressWarnings("unused") Object other) { return PNotImplemented.NOT_IMPLEMENTED; } } @@ -416,9 +394,9 @@ public static int len(Object self, } } - @Builtin(name = J___CONTAINS__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.sq_contains, isComplex = true) @GenerateNodeFactory - abstract static class ContainsNode extends PythonBinaryBuiltinNode { + abstract static class ContainsNode extends SqContainsBuiltinNode { @Specialization boolean contains(VirtualFrame frame, Object self, Object other, @@ -428,13 +406,13 @@ boolean contains(VirtualFrame frame, Object self, Object other, } } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory abstract static class IterNode extends PythonUnaryBuiltinNode { @Specialization static PSequenceIterator contains(Object self, - @Cached PythonObjectFactory factory) { - return factory.createSequenceIterator(self); + @Bind PythonLanguage language) { + return PFactory.createSequenceIterator(language, self); } } @@ -460,8 +438,8 @@ boolean doIt(VirtualFrame frame, Object self, Object substrs, int start, int end @Fallback static boolean doGeneric(@SuppressWarnings("unused") Object self, @SuppressWarnings("unused") Object substr, @SuppressWarnings("unused") Object start, @SuppressWarnings("unused") Object end, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, METHOD_REQUIRES_A_BYTES_OBJECT_GOT_P, substr); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, METHOD_REQUIRES_A_BYTES_OBJECT_GOT_P, substr); } protected abstract boolean doIt(byte[] bytes, int len, byte[] prefix, int start, int end); @@ -589,10 +567,10 @@ protected ArgumentClinicProvider getArgumentClinic() { static int index(VirtualFrame frame, Object self, Object arg, int start, int end, @Bind("this") Node inliningTarget, @Cached BytesNodes.FindNode findNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int result = findNode.execute(frame, inliningTarget, self, arg, start, end); if (result == -1) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.SUBSECTION_NOT_FOUND); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.SUBSECTION_NOT_FOUND); } return result; } @@ -614,10 +592,10 @@ protected ArgumentClinicProvider getArgumentClinic() { static int indexWithStartEnd(VirtualFrame frame, Object self, Object arg, int start, int end, @Bind("this") Node inliningTarget, @Cached BytesNodes.FindNode findNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int result = findNode.executeReverse(frame, inliningTarget, self, arg, start, end); if (result == -1) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.SUBSECTION_NOT_FOUND); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.SUBSECTION_NOT_FOUND); } return result; } @@ -630,6 +608,7 @@ public abstract static class PartitionAbstractNode extends PythonBinaryBuiltinNo @SuppressWarnings("truffle-static-method") // TODO: inh PTuple partition(VirtualFrame frame, Object self, Object sep, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("sep") PythonBufferAcquireLibrary acquireLib, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @@ -637,8 +616,7 @@ PTuple partition(VirtualFrame frame, Object self, Object sep, @Cached InlinedConditionProfile notFound, @Cached BytesNodes.ToBytesNode toBytesNode, @Cached BytesNodes.CreateBytesNode createBytesNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { SequenceStorage storage = getBytesStorage.execute(inliningTarget, self); int len = storage.length(); byte[] bytes = toBytesNode.execute(frame, self); @@ -646,34 +624,34 @@ PTuple partition(VirtualFrame frame, Object self, Object sep, try { int lenSep = bufferLib.getBufferLength(sepBuffer); if (lenSep == 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.EMPTY_SEPARATOR); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.EMPTY_SEPARATOR); } byte[] sepBytes = bufferLib.getCopiedByteArray(sepBuffer); int idx = BytesNodes.FindNode.find(bytes, len, sepBytes, 0, bytes.length, isRight()); PBytesLike first, second, third; if (notFound.profile(inliningTarget, idx == -1)) { - second = createBytesNode.execute(inliningTarget, factory, self, PythonUtils.EMPTY_BYTE_ARRAY); + second = createBytesNode.execute(inliningTarget, self, PythonUtils.EMPTY_BYTE_ARRAY); if (isRight()) { - third = createBytesNode.execute(inliningTarget, factory, self, bytes); - first = createBytesNode.execute(inliningTarget, factory, self, PythonUtils.EMPTY_BYTE_ARRAY); + third = createBytesNode.execute(inliningTarget, self, bytes); + first = createBytesNode.execute(inliningTarget, self, PythonUtils.EMPTY_BYTE_ARRAY); } else { - first = createBytesNode.execute(inliningTarget, factory, self, bytes); - third = createBytesNode.execute(inliningTarget, factory, self, PythonUtils.EMPTY_BYTE_ARRAY); + first = createBytesNode.execute(inliningTarget, self, bytes); + third = createBytesNode.execute(inliningTarget, self, PythonUtils.EMPTY_BYTE_ARRAY); } } else { - second = createBytesNode.execute(inliningTarget, factory, self, sepBytes); + second = createBytesNode.execute(inliningTarget, self, sepBytes); if (idx == 0) { - first = createBytesNode.execute(inliningTarget, factory, self, PythonUtils.EMPTY_BYTE_ARRAY); - third = createBytesNode.execute(inliningTarget, factory, self, Arrays.copyOfRange(bytes, lenSep, len)); + first = createBytesNode.execute(inliningTarget, self, PythonUtils.EMPTY_BYTE_ARRAY); + third = createBytesNode.execute(inliningTarget, self, Arrays.copyOfRange(bytes, lenSep, len)); } else if (idx == len - 1) { - first = createBytesNode.execute(inliningTarget, factory, self, Arrays.copyOfRange(bytes, 0, len - lenSep)); - third = createBytesNode.execute(inliningTarget, factory, self, PythonUtils.EMPTY_BYTE_ARRAY); + first = createBytesNode.execute(inliningTarget, self, Arrays.copyOfRange(bytes, 0, len - lenSep)); + third = createBytesNode.execute(inliningTarget, self, PythonUtils.EMPTY_BYTE_ARRAY); } else { - first = createBytesNode.execute(inliningTarget, factory, self, Arrays.copyOfRange(bytes, 0, idx)); - third = createBytesNode.execute(inliningTarget, factory, self, Arrays.copyOfRange(bytes, idx + lenSep, len)); + first = createBytesNode.execute(inliningTarget, self, Arrays.copyOfRange(bytes, 0, idx)); + third = createBytesNode.execute(inliningTarget, self, Arrays.copyOfRange(bytes, idx + lenSep, len)); } } - return factory.createTuple(new Object[]{first, second, third}); + return PFactory.createTuple(language, new Object[]{first, second, third}); } finally { bufferLib.release(sepBuffer, frame, indirectCallData); } @@ -816,14 +794,14 @@ static byte pstring(Object strObj, @Cached CastToTruffleStringNode toStr, @Cached TruffleString.CodePointLengthNode codePointLengthNode, @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { TruffleString str = toStr.execute(inliningTarget, strObj); if (codePointLengthNode.execute(str, TS_ENCODING) != 1) { - throw raiseNode.get(inliningTarget).raise(ValueError, SEP_MUST_BE_LENGTH_1); + throw raiseNode.raise(inliningTarget, ValueError, SEP_MUST_BE_LENGTH_1); } int cp = codePointAtIndexNode.execute(str, 0, TS_ENCODING); if (cp > 127) { - throw raiseNode.get(inliningTarget).raise(ValueError, SEP_MUST_BE_ASCII); + throw raiseNode.raise(inliningTarget, ValueError, SEP_MUST_BE_ASCII); } return (byte) cp; } @@ -834,17 +812,17 @@ static byte doBuffer(VirtualFrame frame, Object object, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("object") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { PythonContext context = PythonContext.get(inliningTarget); - PythonLanguage language = PythonLanguage.get(inliningTarget); + PythonLanguage language = context.getLanguage(inliningTarget); Object buffer = bufferAcquireLib.acquireReadonly(object, frame, context, language, indirectCallData); try { if (bufferLib.getBufferLength(buffer) != 1) { - throw raiseNode.get(inliningTarget).raise(ValueError, SEP_MUST_BE_LENGTH_1); + throw raiseNode.raise(inliningTarget, ValueError, SEP_MUST_BE_LENGTH_1); } byte b = bufferLib.readByte(buffer, 0); if (b < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, SEP_MUST_BE_ASCII); + throw raiseNode.raise(inliningTarget, ValueError, SEP_MUST_BE_ASCII); } return b; } finally { @@ -855,8 +833,8 @@ static byte doBuffer(VirtualFrame frame, Object object, @SuppressWarnings("unused") @Fallback static byte error(VirtualFrame frame, Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.SEP_MUST_BE_STR_OR_BYTES); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.SEP_MUST_BE_STR_OR_BYTES); } @ClinicConverterFactory @@ -908,8 +886,8 @@ static TruffleString hex(Object self, byte sep, int bytesPerSepGroup, @SuppressWarnings("unused") @Fallback static TruffleString err(Object self, Object sep, Object bytesPerSepGroup, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, DESCRIPTOR_NEED_OBJ, "hex", "bytes"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, DESCRIPTOR_NEED_OBJ, "hex", "bytes"); } } @@ -1217,8 +1195,7 @@ PBytesLike bytes(VirtualFrame frame, Object self, Object widthObj, Object fillOb @CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib, @Cached InlinedBranchProfile hasFill, @Cached PyNumberAsSizeNode asSizeNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int width = asSizeNode.executeExact(frame, inliningTarget, widthObj); SequenceStorage storage = getBytesStorage.execute(inliningTarget, self); int len = storage.length(); @@ -1228,13 +1205,13 @@ PBytesLike bytes(VirtualFrame frame, Object self, Object widthObj, Object fillOb if (fillObj instanceof PBytesLike && bufferLib.getBufferLength(fillObj) == 1) { fillByte = bufferLib.readByte(fillObj, 0); } else { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.BYTE_STRING_OF_LEN_ONE_ONLY, methodName(), fillObj); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.BYTE_STRING_OF_LEN_ONE_ONLY, methodName(), fillObj); } } if (checkSkip(len, width)) { - return create.execute(inliningTarget, factory, self, copyNode.execute(inliningTarget, storage)); + return create.execute(inliningTarget, self, copyNode.execute(inliningTarget, storage)); } - return create.execute(inliningTarget, factory, self, make(bufferLib.getCopiedByteArray(self), len, width, fillByte)); + return create.execute(inliningTarget, self, make(bufferLib.getCopiedByteArray(self), len, width, fillByte)); } protected String methodName() { @@ -1345,8 +1322,7 @@ static PBytesLike replace(Object self, Object substrBuffer, Object replacementBu @Cached InlinedConditionProfile selfSubAreEmpty, @Cached InlinedConditionProfile selfIsEmpty, @Cached InlinedConditionProfile subIsEmpty, - @Cached BytesNodes.CreateBytesNode create, - @Cached PythonObjectFactory factory) { + @Cached BytesNodes.CreateBytesNode create) { try { SequenceStorage storage = getBytesStorage.execute(inliningTarget, self); int len = storage.length(); @@ -1355,16 +1331,16 @@ static PBytesLike replace(Object self, Object substrBuffer, Object replacementBu byte[] replacementBytes = bufferLib.getCopiedByteArray(replacementBuffer); int maxcount = count < 0 ? Integer.MAX_VALUE : count; if (selfSubAreEmpty.profile(inliningTarget, len == 0 && subBytes.length == 0)) { - return create.execute(inliningTarget, factory, self, replacementBytes); + return create.execute(inliningTarget, self, replacementBytes); } if (selfIsEmpty.profile(inliningTarget, len == 0)) { - return create.execute(inliningTarget, factory, self, PythonUtils.EMPTY_BYTE_ARRAY); + return create.execute(inliningTarget, self, PythonUtils.EMPTY_BYTE_ARRAY); } if (subIsEmpty.profile(inliningTarget, subBytes.length == 0)) { - return create.execute(inliningTarget, factory, self, replaceWithEmptySub(bytes, len, replacementBytes, maxcount)); + return create.execute(inliningTarget, self, replaceWithEmptySub(bytes, len, replacementBytes, maxcount)); } byte[] newBytes = replace(bytes, len, subBytes, replacementBytes, maxcount); - return create.execute(inliningTarget, factory, self, newBytes); + return create.execute(inliningTarget, self, newBytes); } finally { bufferLib.release(substrBuffer); bufferLib.release(replacementBuffer); @@ -1373,8 +1349,8 @@ static PBytesLike replace(Object self, Object substrBuffer, Object replacementBu @Fallback static boolean error(@SuppressWarnings("unused") Object self, Object substr, @SuppressWarnings("unused") Object replacement, @SuppressWarnings("unused") Object count, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, BYTESLIKE_OBJ_REQUIRED, substr); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, BYTESLIKE_OBJ_REQUIRED, substr); } @TruffleBoundary(allowInlining = true) @@ -1443,13 +1419,12 @@ abstract static class LowerNode extends PythonUnaryBuiltinNode { static PBytesLike replace(Object self, @Bind("this") Node node, @Cached BytesNodes.ToBytesNode toBytes, - @Cached BytesNodes.CreateBytesNode create, - @Cached PythonObjectFactory factory) { + @Cached BytesNodes.CreateBytesNode create) { byte[] bytes = toBytes.execute(null, self); for (int i = 0; i < bytes.length; ++i) { bytes[i] = toLower(bytes[i]); } - return create.execute(node, factory, self, bytes); + return create.execute(node, self, bytes); } } @@ -1461,13 +1436,12 @@ abstract static class UpperNode extends PythonUnaryBuiltinNode { static PBytesLike replace(Object self, @Bind("this") Node inliningTarget, @Cached BytesNodes.ToBytesNode toBytes, - @Cached BytesNodes.CreateBytesNode create, - @Cached PythonObjectFactory factory) { + @Cached BytesNodes.CreateBytesNode create) { byte[] bytes = toBytes.execute(null, self); for (int i = 0; i < bytes.length; ++i) { bytes[i] = toUpper(bytes[i]); } - return create.execute(inliningTarget, factory, self, bytes); + return create.execute(inliningTarget, self, bytes); } } @@ -1497,22 +1471,22 @@ static int doInt(int i) { @Specialization static int toInt(long x, @Bind("this") Node inliningTarget, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { try { return PInt.intValueExact(x); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "C long"); + throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "C long"); } } @Specialization static int toInt(PInt x, @Bind("this") Node inliningTarget, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { try { return x.intValueExact(); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "C long"); + throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "C long"); } } @@ -1551,12 +1525,13 @@ byte[] handleNone(@SuppressWarnings("unused") PNone none) { } @Specialization(guards = {"!isPNone(object)"}, limit = "3") - byte[] doBuffer(VirtualFrame frame, Object object, + static byte[] doBuffer(VirtualFrame frame, Object object, + @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("object") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) { - PythonContext context = getContext(); - PythonLanguage language = getLanguage(); + PythonLanguage language = context.getLanguage(inliningTarget); Object buffer = bufferAcquireLib.acquireReadonly(object, frame, context, language, indirectCallData); try { // TODO avoid copying @@ -1613,10 +1588,10 @@ PList whitespace(Object self, @SuppressWarnings("unused") byte[] sep, int maxspl @Shared("toBytes") @Cached SequenceStorageNodes.GetInternalByteArrayNode selfToBytesNode, @Shared("append") @Cached ListNodes.AppendNode appendNode, @Shared("create") @Cached BytesNodes.CreateBytesNode createBytesNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { SequenceStorage storage = getBytesStorage.execute(inliningTarget, self); byte[] splitBs = selfToBytesNode.execute(inliningTarget, storage); - return getBytesResult(splitWhitespace(splitBs, storage.length(), adjustMaxSplit(maxsplit)), appendNode, self, inliningTarget, createBytesNode, factory); + return getBytesResult(splitWhitespace(splitBs, storage.length(), adjustMaxSplit(maxsplit)), appendNode, self, inliningTarget, createBytesNode, language); } @Specialization(guards = {"!isWhitespace(sep)", "isSingleSep(sep)"}) @@ -1626,10 +1601,10 @@ PList single(Object self, byte[] sep, int maxsplit, @Shared("toBytes") @Cached SequenceStorageNodes.GetInternalByteArrayNode selfToBytesNode, @Shared("append") @Cached ListNodes.AppendNode appendNode, @Shared("create") @Cached BytesNodes.CreateBytesNode createBytesNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { SequenceStorage storage = getBytesStorage.execute(inliningTarget, self); byte[] splitBs = selfToBytesNode.execute(inliningTarget, storage); - return getBytesResult(splitSingle(splitBs, storage.length(), sep[0], adjustMaxSplit(maxsplit)), appendNode, self, inliningTarget, createBytesNode, factory); + return getBytesResult(splitSingle(splitBs, storage.length(), sep[0], adjustMaxSplit(maxsplit)), appendNode, self, inliningTarget, createBytesNode, language); } @Specialization(guards = {"!isWhitespace(sep)", "!isEmptySep(sep)", "!isSingleSep(sep)"}) @@ -1639,25 +1614,25 @@ PList split(Object self, byte[] sep, int maxsplit, @Shared("toBytes") @Cached SequenceStorageNodes.GetInternalByteArrayNode selfToBytesNode, @Shared("append") @Cached ListNodes.AppendNode appendNode, @Shared("create") @Cached BytesNodes.CreateBytesNode createBytesNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { SequenceStorage storage = getBytesStorage.execute(inliningTarget, self); byte[] splitBs = selfToBytesNode.execute(inliningTarget, storage); - return getBytesResult(splitDelimiter(splitBs, storage.length(), sep, adjustMaxSplit(maxsplit)), appendNode, self, inliningTarget, createBytesNode, factory); + return getBytesResult(splitDelimiter(splitBs, storage.length(), sep, adjustMaxSplit(maxsplit)), appendNode, self, inliningTarget, createBytesNode, language); } @SuppressWarnings("unused") @Specialization(guards = {"isEmptySep(sep)"}) static PList error(Object bytes, byte[] sep, int maxsplit, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.ValueError, ErrorMessages.EMPTY_SEPARATOR); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.ValueError, ErrorMessages.EMPTY_SEPARATOR); } private static PList getBytesResult(List bytes, ListNodes.AppendNode appendNode, Object self, Node inliningTarget, BytesNodes.CreateBytesNode createBytesNode, - PythonObjectFactory factory) { - PList result = factory.createList(); + PythonLanguage language) { + PList result = PFactory.createList(language); Iterator it = iterator(bytes); while (hasNext(it)) { - appendNode.execute(result, createBytesNode.execute(inliningTarget, factory, self, next(it))); + appendNode.execute(result, createBytesNode.execute(inliningTarget, self, next(it))); } return result; } @@ -1667,7 +1642,6 @@ private static PList getBytesResult(List bytes, ListNodes.AppendNode app @ArgumentClinic(name = "sep", conversionClass = ExpectByteLikeNode.class, defaultValue = "BytesCommonBuiltins.AbstractSplitNode.WHITESPACE") @ArgumentClinic(name = "maxsplit", conversionClass = ExpectIntNode.class, defaultValue = "Integer.MAX_VALUE") @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class SplitNode extends AbstractSplitNode { protected int find(byte[] bytes, int len, byte[] sep, int start, int end) { @@ -1762,7 +1736,6 @@ protected List splitDelimiter(byte[] bytes, int len, byte[] sep, int max @ArgumentClinic(name = "sep", conversionClass = ExpectByteLikeNode.class, defaultValue = "BytesCommonBuiltins.AbstractSplitNode.WHITESPACE") @ArgumentClinic(name = "maxsplit", conversionClass = ExpectIntNode.class, defaultValue = "Integer.MAX_VALUE") @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class RSplitNode extends AbstractSplitNode { protected int find(byte[] bytes, int len, byte[] sep, int start, int end) { @@ -1869,14 +1842,14 @@ public abstract static class SplitLinesNode extends PythonBinaryBuiltinNode { @Specialization static PList doSplitlines(Object self, Object keependsObj, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached InlinedBranchProfile isPNoneProfile, @Cached InlinedBranchProfile isBooleanProfile, @Cached InlinedConditionProfile keependsProfile, @Cached CastToJavaIntExactNode cast, @Cached BytesNodes.ToBytesNode toBytesNode, @Cached ListNodes.AppendNode appendNode, - @Cached BytesNodes.CreateBytesNode create, - @Cached PythonObjectFactory factory) { + @Cached BytesNodes.CreateBytesNode create) { boolean keepends; if (keependsObj instanceof Boolean b) { isBooleanProfile.enter(inliningTarget); @@ -1889,7 +1862,7 @@ static PList doSplitlines(Object self, Object keependsObj, } keepends = keependsProfile.profile(inliningTarget, keepends); byte[] bytes = toBytesNode.execute(null, self); - PList list = factory.createList(); + PList list = PFactory.createList(language); int sliceStart = 0; for (int i = 0; i < bytes.length; i++) { if (bytes[i] == '\n' || bytes[i] == '\r') { @@ -1901,14 +1874,14 @@ static PList doSplitlines(Object self, Object keependsObj, sliceEnd = i + 1; } byte[] slice = copySlice(bytes, sliceStart, sliceEnd); - appendNode.execute(list, create.execute(inliningTarget, factory, self, slice)); + appendNode.execute(list, create.execute(inliningTarget, self, slice)); sliceStart = i + 1; } } // Process the remaining part if any if (sliceStart != bytes.length) { byte[] slice = copySlice(bytes, sliceStart, bytes.length); - appendNode.execute(list, create.execute(inliningTarget, factory, self, slice)); + appendNode.execute(list, create.execute(inliningTarget, self, slice)); } return list; } @@ -1927,10 +1900,9 @@ abstract static class AStripNode extends PythonBinaryBuiltinNode { PBytesLike strip(VirtualFrame frame, Object self, @SuppressWarnings("unused") PNone bytes, @Bind("this") Node node, @Shared("createByte") @Cached BytesNodes.CreateBytesNode create, - @Shared("toByteSelf") @Cached BytesNodes.ToBytesNode toBytesNode, - @Shared @Cached PythonObjectFactory factory) { + @Shared("toByteSelf") @Cached BytesNodes.ToBytesNode toBytesNode) { byte[] bs = toBytesNode.execute(frame, self); - return create.execute(node, factory, self, getResultBytes(bs, findIndex(bs))); + return create.execute(node, self, getResultBytes(bs, findIndex(bs))); } @Specialization(guards = "!isPNone(object)") @@ -1940,14 +1912,13 @@ PBytesLike strip(VirtualFrame frame, Object self, Object object, @CachedLibrary(limit = "3") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @Shared("createByte") @Cached BytesNodes.CreateBytesNode create, - @Shared("toByteSelf") @Cached BytesNodes.ToBytesNode selfToBytesNode, - @Shared @Cached PythonObjectFactory factory) { + @Shared("toByteSelf") @Cached BytesNodes.ToBytesNode selfToBytesNode) { Object buffer = bufferAcquireLib.acquireReadonly(object, frame, indirectCallData); try { byte[] stripBs = bufferLib.getInternalOrCopiedByteArray(buffer); int stripBsLen = bufferLib.getBufferLength(buffer); byte[] bs = selfToBytesNode.execute(frame, self); - return create.execute(node, factory, self, getResultBytes(bs, findIndex(bs, stripBs, stripBsLen))); + return create.execute(node, self, getResultBytes(bs, findIndex(bs, stripBs, stripBsLen))); } finally { bufferLib.release(buffer, frame, indirectCallData); } @@ -1956,8 +1927,8 @@ PBytesLike strip(VirtualFrame frame, Object self, Object object, @Fallback @SuppressWarnings("unused") static Object strip(Object self, Object object, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(SystemError, ErrorMessages.INVALID_ARGS, "lstrip/rstrip"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, ErrorMessages.INVALID_ARGS, "lstrip/rstrip"); } protected abstract int mod(); @@ -2085,13 +2056,13 @@ public abstract static class MakeTransNode extends PythonBuiltinNode { @Specialization static PBytes maketrans(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object from, Object to, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached BytesNodes.ToBytesNode toByteNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { byte[] fromB = toByteNode.execute(frame, from); byte[] toB = toByteNode.execute(frame, to); if (fromB.length != toB.length) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.ValueError, ErrorMessages.ARGS_MUST_HAVE_SAME_LENGTH, "maketrans"); + throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ErrorMessages.ARGS_MUST_HAVE_SAME_LENGTH, "maketrans"); } byte[] table = new byte[256]; @@ -2104,7 +2075,7 @@ static PBytes maketrans(VirtualFrame frame, @SuppressWarnings("unused") Object c table[value < 0 ? value + 256 : value] = toB[i]; } - return factory.createBytes(table); + return PFactory.createBytes(language, table); } } @@ -2117,17 +2088,16 @@ abstract static class CapitalizeNode extends PythonUnaryBuiltinNode { static PBytesLike capitalize(Object self, @Bind("this") Node inliningTarget, @Cached ToBytesNode toBytesNode, - @Cached BytesNodes.CreateBytesNode create, - @Cached PythonObjectFactory factory) { + @Cached BytesNodes.CreateBytesNode create) { byte[] b = toBytesNode.execute(null, self); if (b.length == 0) { - return create.execute(inliningTarget, factory, self, PythonUtils.EMPTY_BYTE_ARRAY); + return create.execute(inliningTarget, self, PythonUtils.EMPTY_BYTE_ARRAY); } b[0] = toUpper(b[0]); for (int i = 1; i < b.length; i++) { b[i] = toLower(b[i]); } - return create.execute(inliningTarget, factory, self, b); + return create.execute(inliningTarget, self, b); } } @@ -2139,11 +2109,10 @@ abstract static class TitleNode extends PythonUnaryBuiltinNode { static PBytesLike title(Object self, @Bind("this") Node inliningTarget, @Cached ToBytesNode toBytesNode, - @Cached BytesNodes.CreateBytesNode create, - @Cached PythonObjectFactory factory) { + @Cached BytesNodes.CreateBytesNode create) { byte[] b = toBytesNode.execute(null, self); if (b.length == 0) { - return create.execute(inliningTarget, factory, self, PythonUtils.EMPTY_BYTE_ARRAY); + return create.execute(inliningTarget, self, PythonUtils.EMPTY_BYTE_ARRAY); } boolean previousIsCased = false; @@ -2165,7 +2134,7 @@ static PBytesLike title(Object self, b[i] = c; } - return create.execute(inliningTarget, factory, self, b); + return create.execute(inliningTarget, self, b); } } @@ -2177,11 +2146,10 @@ abstract static class SwapCaseNode extends PythonUnaryBuiltinNode { static PBytesLike swapcase(Object self, @Bind("this") Node inliningTarget, @Cached ToBytesNode toBytesNode, - @Cached BytesNodes.CreateBytesNode create, - @Cached PythonObjectFactory factory) { + @Cached BytesNodes.CreateBytesNode create) { byte[] b = toBytesNode.execute(null, self); if (b.length == 0) { - return create.execute(inliningTarget, factory, self, PythonUtils.EMPTY_BYTE_ARRAY); + return create.execute(inliningTarget, self, PythonUtils.EMPTY_BYTE_ARRAY); } for (int i = 0; i < b.length; i++) { if (BytesUtils.isUpper(b[i])) { @@ -2190,7 +2158,7 @@ static PBytesLike swapcase(Object self, b[i] = toUpper(b[i]); } } - return create.execute(inliningTarget, factory, self, b); + return create.execute(inliningTarget, self, b); } } @@ -2210,12 +2178,11 @@ static PBytesLike expandtabs(Object self, int tabsize, @Cached GetBytesStorage getBytesStorage, @Cached GetInternalByteArrayNode getInternalByteArrayNode, @Cached BytesNodes.CreateBytesNode create, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { SequenceStorage storage = getBytesStorage.execute(inliningTarget, self); int len = storage.length(); if (len == 0) { - return create.execute(inliningTarget, factory, self, PythonUtils.EMPTY_BYTE_ARRAY); + return create.execute(inliningTarget, self, PythonUtils.EMPTY_BYTE_ARRAY); } int max = SysModuleBuiltins.MAXSIZE; byte[] b = getInternalByteArrayNode.execute(inliningTarget, storage); @@ -2226,18 +2193,18 @@ static PBytesLike expandtabs(Object self, int tabsize, if (tabsize > 0) { int incr = tabsize - (j % tabsize); if (j > max - incr) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.RESULT_TOO_LONG); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.RESULT_TOO_LONG); } j += incr; } } else { if (j > max - 1) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.RESULT_TOO_LONG); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.RESULT_TOO_LONG); } j++; if (p == N || p == R) { if (i > max - j) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.RESULT_TOO_LONG); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.RESULT_TOO_LONG); } i += j; j = 0; @@ -2245,7 +2212,7 @@ static PBytesLike expandtabs(Object self, int tabsize, } } if (i > max - j) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.RESULT_TOO_LONG); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.RESULT_TOO_LONG); } byte[] q = new byte[i + j]; @@ -2269,7 +2236,7 @@ static PBytesLike expandtabs(Object self, int tabsize, } } - return create.execute(inliningTarget, factory, self, q); + return create.execute(inliningTarget, self, q); } @Override @@ -2288,10 +2255,9 @@ static PBytesLike zfill(Object self, int width, @Bind("this") Node inliningTarget, @Cached GetBytesStorage getBytesStorage, @Cached GetInternalByteArrayNode getInternalByteArrayNode, - @Cached BytesNodes.CreateBytesNode create, - @Cached PythonObjectFactory factory) { + @Cached BytesNodes.CreateBytesNode create) { SequenceStorage storage = getBytesStorage.execute(inliningTarget, self); - return create.execute(inliningTarget, factory, self, zfill(getInternalByteArrayNode.execute(inliningTarget, storage), storage.length(), width)); + return create.execute(inliningTarget, self, zfill(getInternalByteArrayNode.execute(inliningTarget, storage), storage.length(), width)); } private static byte[] zfill(byte[] self, int len, int width) { @@ -2366,9 +2332,9 @@ public abstract static class GetNewargsNode extends PythonUnaryBuiltinNode { @Specialization static PTuple doBytes(Object self, @Bind("this") Node inliningTarget, - @Cached GetBytesStorage getBytesStorage, - @Cached PythonObjectFactory factory) { - return factory.createTuple(new Object[]{factory.createBytes(getBytesStorage.execute(inliningTarget, self))}); + @Bind PythonLanguage language, + @Cached GetBytesStorage getBytesStorage) { + return PFactory.createTuple(language, new Object[]{PFactory.createBytes(language, getBytesStorage.execute(inliningTarget, self))}); } } @@ -2382,8 +2348,7 @@ static PBytesLike remove(VirtualFrame frame, Object self, Object prefix, @CachedLibrary(limit = "1") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, @Cached BytesNodes.CreateBytesNode create, - @Cached InlinedConditionProfile profile, - @Cached PythonObjectFactory factory) { + @Cached InlinedConditionProfile profile) { Object selfBuffer = bufferAcquireLib.acquireReadonly(self, frame, indirectCallData); Object prefixBuffer = bufferAcquireLib.acquireReadonly(prefix, frame, indirectCallData); @@ -2399,15 +2364,15 @@ static PBytesLike remove(VirtualFrame frame, Object self, Object prefix, for (int i = 0; i < selfBsLen; i++) { if (i < prefixBsLen) { if (selfBs[i] != prefixBs[i]) { - return create.execute(node, factory, self, selfBs); + return create.execute(node, self, selfBs); } } else { result[j++] = selfBs[i]; } } - return create.execute(node, factory, self, result); + return create.execute(node, self, result); } - return create.execute(node, factory, self, selfBs); + return create.execute(node, self, selfBs); } finally { bufferLib.release(selfBuffer, frame, indirectCallData); bufferLib.release(prefixBuffer, frame, indirectCallData); @@ -2425,8 +2390,7 @@ static PBytesLike remove(VirtualFrame frame, Object self, Object suffix, @CachedLibrary(limit = "1") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, @Cached BytesNodes.CreateBytesNode create, - @Cached InlinedConditionProfile profile, - @Cached PythonObjectFactory factory) { + @Cached InlinedConditionProfile profile) { Object selfBuffer = bufferAcquireLib.acquireReadonly(self, frame, indirectCallData); Object suffixBuffer = bufferAcquireLib.acquireReadonly(suffix, frame, indirectCallData); try { @@ -2441,15 +2405,15 @@ static PBytesLike remove(VirtualFrame frame, Object self, Object suffix, for (int i = selfBsLen - 1, j = 1; i >= 0; i--, j++) { if (i >= selfBsLen - suffixBsLen) { if (selfBs[i] != suffixBs[suffixBsLen - j]) { - return create.execute(node, factory, self, selfBs); + return create.execute(node, self, selfBs); } } else { result[result.length - k++] = selfBs[i]; } } - return create.execute(node, factory, self, result); + return create.execute(node, self, result); } - return create.execute(node, factory, self, selfBs); + return create.execute(node, self, selfBs); } finally { bufferLib.release(selfBuffer, frame, indirectCallData); bufferLib.release(suffixBuffer, frame, indirectCallData); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesNodes.java index 185f72fe2f..ff2ea607c0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -58,6 +58,7 @@ import java.util.ArrayList; import java.util.Arrays; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ClinicConverterFactory; import com.oracle.graal.python.annotations.ClinicConverterFactory.ArgumentIndex; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -75,13 +76,16 @@ import com.oracle.graal.python.builtins.objects.iterator.IteratorNodes; import com.oracle.graal.python.builtins.objects.str.PString; import com.oracle.graal.python.builtins.objects.str.StringNodes; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.lib.IteratorExhausted; import com.oracle.graal.python.lib.PyByteArrayCheckNode; import com.oracle.graal.python.lib.PyBytesCheckNode; import com.oracle.graal.python.lib.PyIndexCheckNode; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyOSFSPathNode; import com.oracle.graal.python.lib.PyObjectGetIter; +import com.oracle.graal.python.lib.PyUnicodeCheckNode; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; @@ -98,11 +102,10 @@ import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.NativeByteSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; -import com.oracle.graal.python.util.ComparisonOp; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; @@ -125,6 +128,7 @@ import com.oracle.truffle.api.strings.InternalByteArray; import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.strings.TruffleString.Encoding; +import com.oracle.truffle.api.strings.TruffleStringBuilder; import com.oracle.truffle.api.strings.TruffleStringIterator; public abstract class BytesNodes { @@ -134,33 +138,37 @@ public abstract class BytesNodes { @GenerateCached(false) public abstract static class CreateBytesNode extends Node { - public final PBytesLike execute(Node inliningTarget, PythonObjectFactory factory, Object basedOn, byte[] bytes) { - return execute(inliningTarget, factory, basedOn, new ByteSequenceStorage(bytes)); + public final PBytesLike execute(Node inliningTarget, Object basedOn, byte[] bytes) { + return execute(inliningTarget, basedOn, new ByteSequenceStorage(bytes)); } - public abstract PBytesLike execute(Node inliningTarget, PythonObjectFactory factory, Object basedOn, SequenceStorage bytes); + public abstract PBytesLike execute(Node inliningTarget, Object basedOn, SequenceStorage bytes); @Specialization - static PBytesLike bytes(PythonObjectFactory factory, @SuppressWarnings("unused") PBytes basedOn, SequenceStorage bytes) { - return factory.createBytes(bytes); + static PBytesLike bytes(@SuppressWarnings("unused") PBytes basedOn, SequenceStorage bytes, + @Bind PythonLanguage language) { + return PFactory.createBytes(language, bytes); } @Specialization - static PBytesLike bytearray(PythonObjectFactory factory, @SuppressWarnings("unused") PByteArray basedOn, SequenceStorage bytes) { - return factory.createByteArray(bytes); + static PBytesLike bytearray(@SuppressWarnings("unused") PByteArray basedOn, SequenceStorage bytes, + @Bind PythonLanguage language) { + return PFactory.createByteArray(language, bytes); } @Specialization(guards = "checkBytes.execute(inliningTarget, basedOn)") - static PBytesLike bytes(@SuppressWarnings("unused") Node inliningTarget, PythonObjectFactory factory, @SuppressWarnings("unused") Object basedOn, SequenceStorage bytes, - @SuppressWarnings("unused") @Shared @Cached PyBytesCheckNode checkBytes) { - return factory.createBytes(bytes); + static PBytesLike bytes(@SuppressWarnings("unused") Node inliningTarget, @SuppressWarnings("unused") Object basedOn, SequenceStorage bytes, + @SuppressWarnings("unused") @Shared @Cached PyBytesCheckNode checkBytes, + @Bind PythonLanguage language) { + return PFactory.createBytes(language, bytes); } @Specialization(guards = "!checkBytes.execute(inliningTarget, basedOn)") - static PBytesLike bytearray(@SuppressWarnings("unused") Node inliningTarget, PythonObjectFactory factory, @SuppressWarnings("unused") Object basedOn, SequenceStorage bytes, - @SuppressWarnings("unused") @Shared @Cached PyBytesCheckNode checkBytes) { + static PBytesLike bytearray(@SuppressWarnings("unused") Node inliningTarget, @SuppressWarnings("unused") Object basedOn, SequenceStorage bytes, + @SuppressWarnings("unused") @Shared @Cached PyBytesCheckNode checkBytes, + @Bind PythonLanguage language) { assert PyByteArrayCheckNode.executeUncached(basedOn); - return factory.createByteArray(bytes); + return PFactory.createByteArray(language, bytes); } } @@ -174,19 +182,19 @@ public abstract static class BytesJoinNode extends PNodeWithContext { @Specialization static byte[] join(VirtualFrame frame, Node inliningTarget, byte[] sep, Object iterable, @Cached PyObjectGetIter getIter, - @Cached(inline = false) GetNextNode getNextNode, - @Cached(inline = false) ToBytesNode toBytesNode, - @Cached IsBuiltinObjectProfile errorProfile) { + @Cached PyIterNextNode nextNode, + @Cached(inline = false) ToBytesNode toBytesNode) { ArrayList parts = new ArrayList<>(); int partsTotalSize = 0; Object iterator = getIter.execute(frame, inliningTarget, iterable); while (true) { + Object next; try { - partsTotalSize += append(parts, toBytesNode.execute(frame, getNextNode.execute(frame, iterator))); - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); + next = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { return joinArrays(sep, parts, partsTotalSize); } + partsTotalSize += append(parts, toBytesNode.execute(frame, next)); } } @@ -246,12 +254,12 @@ byte[] doBuffer(VirtualFrame frame, Object object, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("object") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object buffer; try { buffer = bufferAcquireLib.acquireReadonly(object, frame, indirectCallData); } catch (PException e) { - throw raiseNode.get(inliningTarget).raise(errorType, errorMessageFormat, object); + throw raiseNode.raise(inliningTarget, errorType, errorMessageFormat, object); } try { return bufferLib.getCopiedByteArray(buffer); @@ -281,12 +289,12 @@ public abstract static class ToBytesWithoutFrameNode extends Node { static byte[] doBuffer(Node inliningTarget, Object object, @CachedLibrary("object") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object buffer; try { buffer = bufferAcquireLib.acquireReadonly(object); } catch (PException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, EXPECTED_BYTESLIKE_GOT_P, object); + throw raiseNode.raise(inliningTarget, TypeError, EXPECTED_BYTESLIKE_GOT_P, object); } try { return bufferLib.getCopiedByteArray(buffer); @@ -457,7 +465,7 @@ static boolean check(Node inliningTarget, PythonAbstractNativeObject obj, @Cached GetClassNode getClassNode, @Cached(inline = false) IsSubtypeNode isSubtypeNode) { Object type = getClassNode.execute(inliningTarget, obj); - return isSubtypeNode.execute(null, type, PythonBuiltinClassType.PBytes) || isSubtypeNode.execute(null, type, PythonBuiltinClassType.PByteArray); + return isSubtypeNode.execute(type, PythonBuiltinClassType.PBytes) || isSubtypeNode.execute(type, PythonBuiltinClassType.PByteArray); } @Fallback @@ -522,8 +530,8 @@ static Object str(PString str, @Fallback Object doOthers(@SuppressWarnings("unused") VirtualFrame frame, Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.ARG_D_MUST_BE_S_NOT_P, className, argNum, PythonBuiltinClassType.PString, value); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.ARG_D_MUST_BE_S_NOT_P, className, argNum, PythonBuiltinClassType.PString, value); } @ClinicConverterFactory @@ -554,7 +562,8 @@ static byte[] doGeneric(VirtualFrame frame, Object object, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @Cached BytesNodes.IterableToByteNode iterableToByteNode, @Cached IsBuiltinObjectProfile errorProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PyUnicodeCheckNode unicodeCheckNode, + @Cached PRaiseNode raiseNode) { if (bufferAcquireLib.hasBuffer(object)) { // TODO PyBUF_FULL_RO Object buffer = bufferAcquireLib.acquire(object, BufferFlags.PyBUF_ND, frame, indirectCallData); @@ -564,14 +573,14 @@ static byte[] doGeneric(VirtualFrame frame, Object object, bufferLib.release(buffer, frame, indirectCallData); } } - if (!PGuards.isString(object)) { + if (!unicodeCheckNode.execute(inliningTarget, object)) { try { return iterableToByteNode.execute(frame, object); } catch (PException e) { e.expect(inliningTarget, TypeError, errorProfile); } } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANNOT_CONVERT_P_OBJ_TO_S, object, "bytes"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANNOT_CONVERT_P_OBJ_TO_S, object, "bytes"); } } @@ -599,18 +608,18 @@ static byte[] fromObject(VirtualFrame frame, Node inliningTarget, Object source, @Cached PyNumberAsSizeNode asSizeNode, @Cached(inline = false) BytesFromObject bytesFromObject, // Exclusive as a workaround for GR-44836 - @Cached @Exclusive PRaiseNode.Lazy raiseNode) { + @Cached @Exclusive PRaiseNode raiseNode) { if (indexCheckNode.execute(inliningTarget, source)) { try { int size = asSizeNode.executeExact(frame, inliningTarget, source); if (size < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.NEGATIVE_COUNT); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NEGATIVE_COUNT); } try { return new byte[size]; } catch (OutOfMemoryError error) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } } catch (PException e) { e.expect(inliningTarget, TypeError, errorProfile); @@ -637,18 +646,18 @@ static byte[] fromString(Node inliningTarget, Object source, Object encoding, Ob @Specialization(guards = "isString(source)") @SuppressWarnings("unused") static byte[] fromString(Node inliningTarget, Object source, PNone encoding, Object errors, - @Cached @Shared PRaiseNode.Lazy raiseNode) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.STRING_ARG_WO_ENCODING); + @Cached @Shared PRaiseNode raiseNode) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.STRING_ARG_WO_ENCODING); } @Fallback @SuppressWarnings("unused") public static byte[] error(Node inliningTarget, Object source, Object encoding, Object errors, - @Cached @Shared PRaiseNode.Lazy raiseNode) { + @Cached @Shared PRaiseNode raiseNode) { if (PGuards.isNone(encoding)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.ENCODING_ARG_WO_STRING); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ENCODING_ARG_WO_STRING); } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.ERRORS_WITHOUT_STR_ARG); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ERRORS_WITHOUT_STR_ARG); } } @@ -680,7 +689,7 @@ static TruffleString negative(Node inliningTarget, byte[] argbuf, int arglen, by @Shared @Cached InlinedConditionProfile earlyExit, @Shared @Cached(inline = false) TruffleString.FromByteArrayNode fromByteArrayNode, @Shared @Cached(inline = false) TruffleString.SwitchEncodingNode switchEncodingNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { if (earlyExit.profile(inliningTarget, arglen == 0)) { return T_EMPTY_STRING; } @@ -688,7 +697,7 @@ static TruffleString negative(Node inliningTarget, byte[] argbuf, int arglen, by /* How many sep characters we'll be inserting. */ int resultlen = (arglen - 1) / absBytesPerSepGroup; if (arglen >= SysModuleBuiltins.MAXSIZE / 2 - resultlen) { - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } resultlen += arglen * 2; @@ -722,7 +731,7 @@ static TruffleString positive(Node inliningTarget, byte[] argbuf, int arglen, by @Shared @Cached InlinedConditionProfile earlyExit, @Shared @Cached(inline = false) TruffleString.FromByteArrayNode fromByteArrayNode, @Shared @Cached(inline = false) TruffleString.SwitchEncodingNode switchEncodingNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { if (earlyExit.profile(inliningTarget, arglen == 0)) { return T_EMPTY_STRING; } @@ -730,7 +739,7 @@ static TruffleString positive(Node inliningTarget, byte[] argbuf, int arglen, by int resultlen = (arglen - 1) / absBytesPerSepGroup; if (arglen >= SysModuleBuiltins.MAXSIZE / 2 - resultlen) { - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } resultlen += arglen * 2; @@ -768,8 +777,7 @@ public abstract static class IterableToByteNode extends Node { static byte[] bytearray(VirtualFrame frame, Object iterable, @Bind("this") Node inliningTarget, @Cached IteratorNodes.GetLength lenghtHintNode, - @Cached GetNextNode getNextNode, - @Cached IsBuiltinObjectProfile stopIterationProfile, + @Cached PyIterNextNode nextNode, @Cached CastToByteNode castToByteNode, @Cached PyObjectGetIter getIter) { Object it = getIter.execute(frame, inliningTarget, iterable); @@ -777,20 +785,21 @@ static byte[] bytearray(VirtualFrame frame, Object iterable, byte[] arr = new byte[len < 16 && len > 0 ? len : 16]; int i = 0; while (true) { + Object next; try { - byte item = castToByteNode.execute(frame, getNextNode.execute(frame, it)); - if (i >= arr.length) { - arr = resize(arr, arr.length * 2); - } - arr[i++] = item; - } catch (PException e) { - e.expectStopIteration(inliningTarget, stopIterationProfile); + next = nextNode.execute(frame, inliningTarget, it); + } catch (IteratorExhausted e) { return resize(arr, i); } + byte item = castToByteNode.execute(frame, next); + if (i >= arr.length) { + arr = resize(arr, arr.length * 2); + } + arr[i++] = item; } } - @TruffleBoundary(transferToInterpreterOnException = false) + @TruffleBoundary private static byte[] resize(byte[] arr, int len) { return Arrays.copyOf(arr, len); } @@ -878,7 +887,7 @@ static byte[] ascii(TruffleString str, @Shared("getCodeRange") @Cached @SuppressWarnings("unused") TruffleString.GetCodeRangeNode getCodeRangeNode, @Cached TruffleString.SwitchEncodingNode switchEncodingNode, @Cached TruffleString.GetInternalByteArrayNode getInternalByteArrayNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { TruffleString ascii = switchEncodingNode.execute(str, Encoding.US_ASCII); InternalByteArray iba = getInternalByteArrayNode.execute(ascii, Encoding.US_ASCII); byte[] bytes = new byte[iba.getLength() / 2]; @@ -891,13 +900,13 @@ static byte[] ascii(TruffleString str, } int top = BytesUtils.digitValue(c); if (top >= 16 || top < 0) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, NON_HEX_NUMBER_IN_FROMHEX, i); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, NON_HEX_NUMBER_IN_FROMHEX, i); } c = i + 1 < iba.getEnd() ? strchar[++i] : 0; int bottom = BytesUtils.digitValue(c); if (bottom >= 16 || bottom < 0) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, NON_HEX_NUMBER_IN_FROMHEX, i); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, NON_HEX_NUMBER_IN_FROMHEX, i); } bytes[n++] = (byte) ((top << 4) | bottom); @@ -914,12 +923,12 @@ static byte[] nonAscii(TruffleString str, @Shared("getCodeRange") @Cached @SuppressWarnings("unused") TruffleString.GetCodeRangeNode getCodeRangeNode, @Cached TruffleString.CreateCodePointIteratorNode createCodePointIteratorNode, @Cached TruffleStringIterator.NextNode nextNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { TruffleStringIterator it = createCodePointIteratorNode.execute(str, TS_ENCODING); int i = 0; while (it.hasNext()) { if (nextNode.execute(it) > 127) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, NON_HEX_NUMBER_IN_FROMHEX, i); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, NON_HEX_NUMBER_IN_FROMHEX, i); } ++i; } @@ -980,10 +989,10 @@ public static int adjustEndIndex(int endIn, int len) { return endIn; } - static boolean compareByteArrays(ComparisonOp op, byte[] selfArray, int selfLength, byte[] otherArray, int otherLength) { + static boolean compareByteArrays(RichCmpOp op, byte[] selfArray, int selfLength, byte[] otherArray, int otherLength) { int compareResult = 0; - if ((op == ComparisonOp.EQ || op == ComparisonOp.NE) && selfLength != otherLength) { - return op == ComparisonOp.NE; + if (op.isEqOrNe() && selfLength != otherLength) { + return op == RichCmpOp.Py_NE; } for (int i = 0; i < Math.min(selfLength, otherLength); i++) { compareResult = Byte.compareUnsigned(selfArray[i], otherArray[i]); @@ -994,15 +1003,15 @@ static boolean compareByteArrays(ComparisonOp op, byte[] selfArray, int selfLeng if (compareResult == 0) { compareResult = Integer.compare(selfLength, otherLength); } - return op.cmpResultToBool(compareResult); + return op.compareResultToBool(compareResult); } @GenerateCached(false) public abstract static class BaseTranslateNode extends PythonBuiltinNode { - static void checkLengthOfTable(Node inliningTarget, byte[] table, InlinedConditionProfile isLenTable256Profile, PRaiseNode.Lazy raiseNode) { + static void checkLengthOfTable(Node inliningTarget, byte[] table, InlinedConditionProfile isLenTable256Profile, PRaiseNode raiseNode) { if (isLenTable256Profile.profile(inliningTarget, table.length != 256)) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.ValueError, ErrorMessages.TRANS_TABLE_MUST_BE_256); + throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ErrorMessages.TRANS_TABLE_MUST_BE_256); } } @@ -1112,4 +1121,25 @@ protected final TruffleString getErrorMessage() { return ErrorMessages.BYTE_MUST_BE_IN_RANGE; } } + + @GenerateInline + @GenerateCached(false) + @GenerateUncached + public abstract static class BytesReprNode extends Node { + public abstract TruffleString execute(Node inliningTarget, Object self); + + @Specialization + public static TruffleString repr(Node inliningTarget, Object self, + @Cached BytesNodes.GetBytesStorage getBytesStorage, + @Cached SequenceStorageNodes.GetInternalByteArrayNode getBytes, + @Cached TruffleStringBuilder.AppendCodePointNode appendCodePointNode, + @Cached TruffleStringBuilder.ToStringNode toStringNode) { + SequenceStorage store = getBytesStorage.execute(inliningTarget, self); + byte[] bytes = getBytes.execute(inliningTarget, store); + int len = store.length(); + TruffleStringBuilder sb = TruffleStringBuilder.create(TS_ENCODING); + BytesUtils.reprLoop(sb, bytes, len, appendCodePointNode); + return toStringNode.execute(sb); + } + } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/PByteArray.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/PByteArray.java index 039317f973..dc1a8f7e83 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/PByteArray.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/PByteArray.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -94,9 +94,9 @@ public void setExports(long exports) { this.exports = exports; } - public void checkCanResize(Node inliningTarget, PRaiseNode.Lazy raiseNode) { + public void checkCanResize(Node inliningTarget, PRaiseNode raiseNode) { if (exports != 0) { - throw raiseNode.get(inliningTarget).raise(BufferError, ErrorMessages.EXPORTS_CANNOT_RESIZE); + throw raiseNode.raise(inliningTarget, BufferError, ErrorMessages.EXPORTS_CANNOT_RESIZE); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/PBytes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/PBytes.java index be372e2f33..64317fe78a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/PBytes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/PBytes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -35,12 +35,14 @@ import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.CompilerAsserts; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.InvalidArrayIndexException; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; +import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.object.Shape; @SuppressWarnings("truffle-abstract-export") @@ -99,9 +101,10 @@ public static void removeArrayElement(PBytes self, long key) throws UnsupportedM @ExportMessage Object acquire(int flags, + @Bind("$node") Node inliningTarget, @Cached PRaiseNode raiseNode) { if ((flags & BufferFlags.PyBUF_WRITABLE) != 0) { - throw raiseNode.raise(BufferError, ErrorMessages.OBJ_IS_NOT_WRITABLE); + throw raiseNode.raise(inliningTarget, BufferError, ErrorMessages.OBJ_IS_NOT_WRITABLE); } return this; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/PBytesLike.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/PBytesLike.java index 7819c7a3ab..491412d850 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/PBytesLike.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/PBytesLike.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/capsule/PyCapsule.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/capsule/PyCapsule.java index 7a3a560a68..95671f7bf7 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/capsule/PyCapsule.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/capsule/PyCapsule.java @@ -42,19 +42,30 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.Capsule; +import java.nio.charset.StandardCharsets; + import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.FromCharPointerNodeGen; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; +import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers; import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; import com.oracle.graal.python.nodes.util.CastToJavaStringNode; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.strings.TruffleString; @ExportLibrary(InteropLibrary.class) public final class PyCapsule extends PythonBuiltinObject { + + public static byte[] capsuleName(String string) { + return string.getBytes(StandardCharsets.US_ASCII); + } + + public static boolean capsuleJavaNameIs(PyCapsule capsule, byte[] name) { + return capsule.getNamePtr() instanceof CArrayWrappers.CByteArrayWrapper wrapper && wrapper.getByteArray() == name; + } + /* * This class provides indirection to all the data members. Capsule destructors take the * capsule, so we use this to recreate a temporary "resurrected" capsule for the destructor @@ -62,13 +73,13 @@ public final class PyCapsule extends PythonBuiltinObject { */ public static class CapsuleData { private Object pointer; - private Object name; + private Object namePtr; private Object context; private Object destructor; - public CapsuleData(Object pointer, Object name) { + public CapsuleData(Object pointer, Object namePtr) { this.pointer = pointer; - this.name = name; + this.namePtr = namePtr; } public Object getDestructor() { @@ -101,12 +112,12 @@ public void setPointer(Object pointer) { data.pointer = pointer; } - public Object getName() { - return data.name; + public Object getNamePtr() { + return data.namePtr; } - public void setName(Object name) { - data.name = name; + public void setNamePtr(Object name) { + data.namePtr = name; } public Object getContext() { @@ -133,13 +144,9 @@ public void registerDestructor(Object destructor) { @TruffleBoundary public String toDisplayString(@SuppressWarnings("unused") boolean allowSideEffects) { String quote, n; - if (data.name != null) { + if (data.namePtr != null) { quote = "\""; - if (data.name instanceof TruffleString) { - n = ((TruffleString) getName()).toJavaStringUncached(); - } else { - n = CastToJavaStringNode.getUncached().execute(FromCharPointerNodeGen.getUncached().execute(data.name, false)); - } + n = CastToJavaStringNode.getUncached().execute(FromCharPointerNodeGen.getUncached().execute(data.namePtr, false)); } else { quote = ""; n = "NULL"; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/capsule/PyCapsuleNameMatchesNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/capsule/PyCapsuleNameMatchesNode.java index 39b33c9d3f..e96027cf5f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/capsule/PyCapsuleNameMatchesNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/capsule/PyCapsuleNameMatchesNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,26 +40,23 @@ */ package com.oracle.graal.python.builtins.objects.capsule; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; - -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes; +import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers; +import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.strings.TruffleString; /** * Compares two names according to the semantics of PyCapsule's {@code name_matches} function (see C - * code snippet below). The name objects can be {@link TruffleString}, native pointer objects, or - * {@code null}. + * code snippet below). The name objects can be native pointer objects, or {@code null}. * *
        *     static int
      @@ -79,36 +76,57 @@
       public abstract class PyCapsuleNameMatchesNode extends Node {
           public abstract boolean execute(Node inliningTarget, Object name1, Object name2);
       
      -    @Specialization(guards = "ignoredName2 == null")
      -    static boolean common(@SuppressWarnings("unused") PNone ignoredName1, @SuppressWarnings("unused") Object ignoredName2) {
      -        return true;
      -    }
      -
           @Specialization
      -    static boolean ts(TruffleString n1, TruffleString n2,
      -                    @Shared @Cached(inline = false) TruffleString.EqualNode equalNode) {
      -        if (n1 == null && n2 == null) {
      -            return true;
      +    static boolean compare(Node inliningTarget, Object name1, Object name2,
      +                    @CachedLibrary(limit = "2") InteropLibrary lib,
      +                    @Cached ReadByteNode readByteNode) {
      +        try {
      +            if (name1 != null && lib.isNull(name1)) {
      +                name1 = null;
      +            }
      +            if (name2 != null && lib.isNull(name2)) {
      +                name2 = null;
      +            }
      +            if (name1 == null || name2 == null) {
      +                return name1 == name2;
      +            }
      +            if (lib.isPointer(name1) && lib.isPointer(name2) && lib.asPointer(name1) == lib.asPointer(name2)) {
      +                return true;
      +            }
      +            for (int i = 0;; i++) {
      +                byte b1 = readByteNode.execute(inliningTarget, name1, i);
      +                byte b2 = readByteNode.execute(inliningTarget, name2, i);
      +                if (b1 != b2) {
      +                    return false;
      +                }
      +                if (b1 == 0) {
      +                    return true;
      +                }
      +            }
      +        } catch (UnsupportedMessageException e) {
      +            throw CompilerDirectives.shouldNotReachHere(e);
               }
      -        if (n1 == null || n2 == null) {
      -            return false;
      -        }
      -        return equalNode.execute(n1, n2, TS_ENCODING);
           }
       
      -    @Fallback
      -    static boolean fallback(Object name1, Object name2,
      -                    @Cached(inline = false) CExtNodes.FromCharPointerNode fromCharPtr,
      -                    @CachedLibrary(limit = "1") InteropLibrary lib,
      -                    @Shared @Cached(inline = false) TruffleString.EqualNode equalNode) {
      -        TruffleString n1 = name1 instanceof TruffleString ? (TruffleString) name1 : null;
      -        TruffleString n2 = name2 instanceof TruffleString ? (TruffleString) name2 : null;
      -        if (n1 == null) {
      -            n1 = lib.isNull(name1) ? null : fromCharPtr.execute(name1, false);
      +    @GenerateInline
      +    @GenerateCached(false)
      +    @GenerateUncached
      +    abstract static class ReadByteNode extends Node {
      +        public abstract byte execute(Node inliningTarget, Object ptr, int i);
      +
      +        @Specialization
      +        static byte doManaged(CArrayWrappers.CByteArrayWrapper wrapper, int i) {
      +            byte[] bytes = wrapper.getByteArray();
      +            if (i < bytes.length) {
      +                return bytes[i];
      +            }
      +            return 0;
               }
      -        if (n2 == null) {
      -            n2 = lib.isNull(name2) ? null : fromCharPtr.execute(name2, false);
      +
      +        @Fallback
      +        static byte doNative(Object ptr, int i,
      +                        @Cached(inline = false) CStructAccess.ReadByteNode readByteNode) {
      +            return readByteNode.readArrayElement(ptr, i);
               }
      -        return ts(n1, n2, equalNode);
           }
       }
      diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cell/CellBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cell/CellBuiltins.java
      index 56edf4e0a3..b9dc85f8bb 100644
      --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cell/CellBuiltins.java
      +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cell/CellBuiltins.java
      @@ -1,5 +1,5 @@
       /*
      - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
      + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved.
        * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        *
        * The Universal Permissive License (UPL), Version 1.0
      @@ -40,24 +40,17 @@
        */
       package com.oracle.graal.python.builtins.objects.cell;
       
      -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__;
      -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GE__;
      -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GT__;
      -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LE__;
      -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LT__;
      -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NE__;
      -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
      +import static com.oracle.graal.python.nodes.PGuards.isNoValue;
       import static com.oracle.graal.python.nodes.SpecialMethodNames.T___EQ__;
      -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GE__;
      -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GT__;
      -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LE__;
      -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LT__;
      -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NE__;
       import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
       import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError;
       
       import java.util.List;
       
      +import com.oracle.graal.python.PythonLanguage;
      +import com.oracle.graal.python.annotations.Slot;
      +import com.oracle.graal.python.annotations.Slot.SlotKind;
      +import com.oracle.graal.python.annotations.Slot.SlotSignature;
       import com.oracle.graal.python.builtins.Builtin;
       import com.oracle.graal.python.builtins.CoreFunctions;
       import com.oracle.graal.python.builtins.PythonBuiltinClassType;
      @@ -66,14 +59,23 @@
       import com.oracle.graal.python.builtins.objects.PNotImplemented;
       import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
       import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode;
      +import com.oracle.graal.python.builtins.objects.type.TpSlots;
       import com.oracle.graal.python.builtins.objects.type.TypeNodes;
      +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare;
       import com.oracle.graal.python.lib.PyObjectRichCompareBool;
      +import com.oracle.graal.python.lib.RichCmpOp;
       import com.oracle.graal.python.nodes.ErrorMessages;
       import com.oracle.graal.python.nodes.PNodeWithContext;
       import com.oracle.graal.python.nodes.PRaiseNode;
       import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
       import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
      +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
      +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
       import com.oracle.graal.python.nodes.object.GetClassNode;
      +import com.oracle.graal.python.runtime.object.PFactory;
      +import com.oracle.truffle.api.Assumption;
      +import com.oracle.truffle.api.CompilerDirectives;
      +import com.oracle.truffle.api.Truffle;
       import com.oracle.truffle.api.dsl.Bind;
       import com.oracle.truffle.api.dsl.Cached;
       import com.oracle.truffle.api.dsl.Fallback;
      @@ -90,194 +92,78 @@
       
       @CoreFunctions(extendClasses = PythonBuiltinClassType.PCell)
       public final class CellBuiltins extends PythonBuiltins {
      +    public static final TpSlots SLOTS = CellBuiltinsSlotsGen.SLOTS;
      +
           @Override
           protected List> getNodeFactories() {
               return CellBuiltinsFactory.getFactories();
           }
       
      -    @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2)
      +    @Slot(value = SlotKind.tp_new, isComplex = true)
      +    @SlotSignature(name = "cell", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2)
           @GenerateNodeFactory
      -    public abstract static class EqNode extends PythonBuiltinNode {
      -        @Specialization
      -        static boolean eq(VirtualFrame frame, PCell self, PCell other,
      -                        @Bind("this") Node inliningTarget,
      -                        @Cached PyObjectRichCompareBool.EqNode eqNode,
      -                        @Cached InlinedConditionProfile nonEmptyProfile,
      -                        @Cached GetRefNode getRefL,
      -                        @Cached GetRefNode getRefR) {
      -            Object left = getRefL.execute(inliningTarget, self);
      -            Object right = getRefR.execute(inliningTarget, other);
      -            if (nonEmptyProfile.profile(inliningTarget, left != null && right != null)) {
      -                return eqNode.compare(frame, inliningTarget, left, right);
      -            }
      -            return left == null && right == null;
      -        }
      -
      -        @SuppressWarnings("unused")
      -        @Fallback
      -        static Object eq(Object self, Object other,
      -                        @Bind("this") Node inliningTarget,
      -                        @Cached PRaiseNode.Lazy raiseNode) {
      -            if (self instanceof PCell) {
      -                return PNotImplemented.NOT_IMPLEMENTED;
      -            }
      -            throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, T___EQ__, "cell", self);
      -        }
      -    }
      +    public abstract static class CellTypeNode extends PythonBinaryBuiltinNode {
      +        @CompilerDirectives.CompilationFinal private Assumption sharedAssumption;
       
      -    @Builtin(name = J___NE__, minNumOfPositionalArgs = 2)
      -    @GenerateNodeFactory
      -    public abstract static class NeNode extends PythonBuiltinNode {
      -        @Specialization
      -        static boolean ne(VirtualFrame frame, PCell self, PCell other,
      -                        @Bind("this") Node inliningTarget,
      -                        @Cached PyObjectRichCompareBool.NeNode neNode,
      -                        @Cached InlinedConditionProfile nonEmptyProfile,
      -                        @Cached GetRefNode getRefL,
      -                        @Cached GetRefNode getRefR) {
      -            Object left = getRefL.execute(inliningTarget, self);
      -            Object right = getRefR.execute(inliningTarget, other);
      -            if (nonEmptyProfile.profile(inliningTarget, left != null && right != null)) {
      -                return neNode.compare(frame, inliningTarget, left, right);
      +        private Assumption getAssumption() {
      +            if (sharedAssumption == null) {
      +                CompilerDirectives.transferToInterpreterAndInvalidate();
      +                sharedAssumption = Truffle.getRuntime().createAssumption("cell is effectively final");
                   }
      -            return left != null || right != null;
      -        }
      -
      -        @SuppressWarnings("unused")
      -        @Fallback
      -        static Object eq(Object self, Object other,
      -                        @Bind("this") Node inliningTarget,
      -                        @Cached PRaiseNode.Lazy raiseNode) {
      -            if (self instanceof PCell) {
      -                return PNotImplemented.NOT_IMPLEMENTED;
      +            if (CompilerDirectives.inCompiledCode()) {
      +                return sharedAssumption;
      +            } else {
      +                return Truffle.getRuntime().createAssumption("cell is effectively final");
                   }
      -            throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, T___NE__, "cell", self);
               }
      -    }
       
      -    @Builtin(name = J___LT__, minNumOfPositionalArgs = 2)
      -    @GenerateNodeFactory
      -    public abstract static class LtNode extends PythonBuiltinNode {
               @Specialization
      -        static boolean lt(VirtualFrame frame, PCell self, PCell other,
      +        Object newCell(@SuppressWarnings("unused") Object cls, Object contents,
                               @Bind("this") Node inliningTarget,
      -                        @Cached PyObjectRichCompareBool.LtNode ltNode,
      -                        @Cached InlinedConditionProfile nonEmptyProfile,
      -                        @Cached GetRefNode getRefL,
      -                        @Cached GetRefNode getRefR) {
      -            Object left = getRefL.execute(inliningTarget, self);
      -            Object right = getRefR.execute(inliningTarget, other);
      -            if (nonEmptyProfile.profile(inliningTarget, left != null && right != null)) {
      -                return ltNode.compare(frame, inliningTarget, left, right);
      +                        @Bind PythonLanguage language,
      +                        @Cached InlinedConditionProfile nonEmptyProfile) {
      +            Assumption assumption = getAssumption();
      +            PCell cell = PFactory.createCell(language, assumption);
      +            if (nonEmptyProfile.profile(inliningTarget, !isNoValue(contents))) {
      +                cell.setRef(contents, assumption);
                   }
      -            return right != null;
      -        }
      -
      -        @SuppressWarnings("unused")
      -        @Fallback
      -        static Object notImplemented(Object self, Object other,
      -                        @Bind("this") Node inliningTarget,
      -                        @Cached PRaiseNode.Lazy raiseNode) {
      -            if (self instanceof PCell) {
      -                return PNotImplemented.NOT_IMPLEMENTED;
      -            }
      -            throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, T___LT__, "cell", self);
      +            return cell;
               }
           }
       
      -    @Builtin(name = J___LE__, minNumOfPositionalArgs = 2)
      +    @Slot(value = SlotKind.tp_richcompare, isComplex = true)
           @GenerateNodeFactory
      -    public abstract static class LeNode extends PythonBuiltinNode {
      +    public abstract static class EqNode extends TpSlotRichCompare.RichCmpBuiltinNode {
               @Specialization
      -        static boolean le(VirtualFrame frame, PCell self, PCell other,
      +        static boolean eq(VirtualFrame frame, PCell self, PCell other, RichCmpOp op,
                               @Bind("this") Node inliningTarget,
      -                        @Cached PyObjectRichCompareBool.LeNode leNode,
      +                        @Cached PyObjectRichCompareBool richCmpNode,
                               @Cached InlinedConditionProfile nonEmptyProfile,
                               @Cached GetRefNode getRefL,
                               @Cached GetRefNode getRefR) {
                   Object left = getRefL.execute(inliningTarget, self);
                   Object right = getRefR.execute(inliningTarget, other);
                   if (nonEmptyProfile.profile(inliningTarget, left != null && right != null)) {
      -                return leNode.compare(frame, inliningTarget, left, right);
      +                return richCmpNode.execute(frame, inliningTarget, left, right, op);
                   }
      -            return left == null;
      +            return op.compare(right == null, left == null);
               }
       
               @SuppressWarnings("unused")
               @Fallback
      -        static Object notImplemented(Object self, Object other,
      +        static Object eq(Object self, Object other, RichCmpOp op,
                               @Bind("this") Node inliningTarget,
      -                        @Cached PRaiseNode.Lazy raiseNode) {
      +                        @Cached PRaiseNode raiseNode) {
                   if (self instanceof PCell) {
                       return PNotImplemented.NOT_IMPLEMENTED;
                   }
      -            throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, T___LE__, "cell", self);
      +            throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, T___EQ__, "cell", self);
               }
           }
       
      -    @Builtin(name = J___GT__, minNumOfPositionalArgs = 2)
      +    @Slot(value = SlotKind.tp_repr, isComplex = true)
           @GenerateNodeFactory
      -    public abstract static class GtNode extends PythonBuiltinNode {
      -        @Specialization
      -        static boolean gt(VirtualFrame frame, PCell self, PCell other,
      -                        @Bind("this") Node inliningTarget,
      -                        @Cached PyObjectRichCompareBool.GtNode gtNode,
      -                        @Cached InlinedConditionProfile nonEmptyProfile,
      -                        @Cached GetRefNode getRefL,
      -                        @Cached GetRefNode getRefR) {
      -            Object left = getRefL.execute(inliningTarget, self);
      -            Object right = getRefR.execute(inliningTarget, other);
      -            if (nonEmptyProfile.profile(inliningTarget, left != null && right != null)) {
      -                return gtNode.compare(frame, inliningTarget, left, right);
      -            }
      -            return left != null;
      -        }
      -
      -        @SuppressWarnings("unused")
      -        @Fallback
      -        static Object notImplemented(Object self, Object other,
      -                        @Bind("this") Node inliningTarget,
      -                        @Cached PRaiseNode.Lazy raiseNode) {
      -            if (self instanceof PCell) {
      -                return PNotImplemented.NOT_IMPLEMENTED;
      -            }
      -            throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, T___GT__, "cell", self);
      -        }
      -    }
      -
      -    @Builtin(name = J___GE__, minNumOfPositionalArgs = 2)
      -    @GenerateNodeFactory
      -    public abstract static class GeNode extends PythonBuiltinNode {
      -        @Specialization
      -        static boolean ge(VirtualFrame frame, PCell self, PCell other,
      -                        @Bind("this") Node inliningTarget,
      -                        @Cached PyObjectRichCompareBool.GeNode geNode,
      -                        @Cached InlinedConditionProfile nonEmptyProfile,
      -                        @Cached GetRefNode getRefL,
      -                        @Cached GetRefNode getRefR) {
      -            Object left = getRefL.execute(inliningTarget, self);
      -            Object right = getRefR.execute(inliningTarget, other);
      -            if (nonEmptyProfile.profile(inliningTarget, left != null && right != null)) {
      -                return geNode.compare(frame, inliningTarget, left, right);
      -            }
      -            return right == null;
      -        }
      -
      -        @SuppressWarnings("unused")
      -        @Fallback
      -        static Object notImplemented(Object self, Object other,
      -                        @Bind("this") Node inliningTarget,
      -                        @Cached PRaiseNode.Lazy raiseNode) {
      -            if (self instanceof PCell) {
      -                return PNotImplemented.NOT_IMPLEMENTED;
      -            }
      -            throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, T___GE__, "cell", self);
      -        }
      -    }
      -
      -    @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1)
      -    @GenerateNodeFactory
      -    abstract static class ReprNode extends PythonBuiltinNode {
      +    abstract static class ReprNode extends PythonUnaryBuiltinNode {
               @Specialization
               static TruffleString repr(PCell self,
                               @Bind("this") Node inliningTarget,
      @@ -297,11 +183,11 @@ static TruffleString repr(PCell self,
               @Fallback
               static Object eq(Object self,
                               @Bind("this") Node inliningTarget,
      -                        @Cached PRaiseNode.Lazy raiseNode) {
      +                        @Cached PRaiseNode raiseNode) {
                   if (self instanceof PCell) {
                       return PNotImplemented.NOT_IMPLEMENTED;
                   }
      -            throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, "__repr__", "cell", self);
      +            throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, "__repr__", "cell", self);
               }
           }
       
      @@ -312,10 +198,10 @@ public abstract static class CellContentsNode extends PythonBuiltinNode {
               static Object get(PCell self, @SuppressWarnings("unused") PNone none,
                               @Bind("this") Node inliningTarget,
                               @Cached GetRefNode getRef,
      -                        @Cached PRaiseNode.Lazy raiseNode) {
      +                        @Cached PRaiseNode raiseNode) {
                   Object ref = getRef.execute(inliningTarget, self);
                   if (ref == null) {
      -                throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.IS_EMPTY, "Cell");
      +                throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.IS_EMPTY, "Cell");
                   }
                   return ref;
               }
      @@ -350,5 +236,4 @@ Object uncached(PCell self) {
                   return self.getRef();
               }
           }
      -
       }
      diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/PythonAbstractNativeObject.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/PythonAbstractNativeObject.java
      index be8e7c489b..68c6ee771e 100644
      --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/PythonAbstractNativeObject.java
      +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/PythonAbstractNativeObject.java
      @@ -76,17 +76,32 @@
       import com.oracle.truffle.api.library.ExportMessage.Ignore;
       import com.oracle.truffle.api.nodes.Node;
       import com.oracle.truffle.api.profiles.InlinedExactClassProfile;
      -import com.oracle.truffle.api.profiles.ValueProfile;
       import com.oracle.truffle.api.utilities.TriState;
       
       @ExportLibrary(InteropLibrary.class)
       @ExportLibrary(PythonBufferAcquireLibrary.class)
       public final class PythonAbstractNativeObject extends PythonAbstractObject implements PythonNativeObject, PythonNativeClass {
       
      +    /**
      +     * A reference to the native object. This usually is a pointer object (i.e. responds to
      +     * {@link InteropLibrary#isPointer(Object)} with {@code true}) but can also be something the
      +     * emulates native memory.
      +     */
           public final Object object;
           public TpSlots slots;
           public NativeObjectReference ref;
       
      +    /**
      +     * Replicates the native references of this native object in Java.
      +     * 

      + * Native objects, that have a traverse function, may have references (i.e. native fields of + * type {@code PyObject *}) to other objects. Whenever the Python GC detects a possible + * reference cycle, we will replicate those native references in Java to give control to the + * Java GC when objects may die. + *

      + */ + private Object[] replicatedNativeReferences; + public PythonAbstractNativeObject(Object object) { // GR-50245 // Fails in @@ -96,15 +111,28 @@ public PythonAbstractNativeObject(Object object) { this.object = object; } + @Override public int compareTo(Object o) { return 0; } + @Override public void lookupChanged() { // TODO invalidate cached native MRO throw CompilerDirectives.shouldNotReachHere("not yet implemented"); } + /** + * For a description, see {@link #replicatedNativeReferences}. + */ + public void setReplicatedNativeReferences(Object[] replicatedNativeReferences) { + this.replicatedNativeReferences = replicatedNativeReferences; + } + + public Object[] getReplicatedNativeReferences() { + return replicatedNativeReferences; + } + @Override public Object getPtr() { return object; @@ -130,21 +158,15 @@ public boolean equals(Object obj) { return Objects.equals(object, other.object); } - public boolean equalsProfiled(Object obj, ValueProfile profile) { - if (this == obj) { - return true; - } - if (obj == null || getClass() != obj.getClass()) { - return false; - } - PythonAbstractNativeObject other = (PythonAbstractNativeObject) obj; - return Objects.equals(profile.profile(object), profile.profile(other.object)); + @TruffleBoundary + public String toStringWithContext() { + return "PythonAbstractNativeObject(" + PythonUtils.formatPointer(object) + ')'; } @Override public String toString() { CompilerAsserts.neverPartOfCompilation(); - return PythonUtils.formatJString("PythonAbstractNativeObject(%s)", object); + return "PythonAbstractNativeObject(" + object + ')'; } @ExportMessage diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiContext.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiContext.java index cb0f8c062c..e0f575d679 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiContext.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,30 +42,35 @@ import static com.oracle.graal.python.PythonLanguage.CONTEXT_INSENSITIVE_SINGLETONS; import static com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper.PythonAbstractObjectNativeWrapper.IMMORTAL_REFCNT; +import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.pollReferenceQueue; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___FILE__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___LIBRARY__; -import static com.oracle.graal.python.nodes.StringLiterals.J_LLVM_LANGUAGE; import static com.oracle.graal.python.nodes.StringLiterals.J_NFI_LANGUAGE; +import static com.oracle.graal.python.nodes.StringLiterals.T_DASH; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; +import static com.oracle.graal.python.nodes.StringLiterals.T_UNDERSCORE; +import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; +import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.io.IOException; import java.io.PrintStream; import java.lang.invoke.VarHandle; -import java.nio.file.LinkOption; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedList; import java.util.List; -import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import java.util.logging.Level; -import org.graalvm.collections.EconomicMap; import org.graalvm.collections.Pair; -import org.graalvm.nativeimage.ImageInfo; +import org.graalvm.shadowed.com.ibm.icu.impl.Punycode; +import org.graalvm.shadowed.com.ibm.icu.text.StringPrepParseException; import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -76,6 +81,7 @@ import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.PythonAbstractObject; import com.oracle.graal.python.builtins.objects.capsule.PyCapsule; +import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PCallCapiFunction; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.CreateModuleNodeGen; import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper.PythonAbstractObjectNativeWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; @@ -84,48 +90,51 @@ import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.ToPythonWrapperNode; import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes; import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.CheckFunctionResultNode; +import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.EnsureExecutableNode; import com.oracle.graal.python.builtins.objects.cext.common.CExtContext; import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ApiInitException; import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ImportException; import com.oracle.graal.python.builtins.objects.cext.common.NativePointer; +import com.oracle.graal.python.builtins.objects.cext.copying.NativeLibraryLocator; import com.oracle.graal.python.builtins.objects.cext.structs.CConstants; import com.oracle.graal.python.builtins.objects.cext.structs.CFields; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess.FreeNode; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess.ReadPointerNode; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccessFactory; +import com.oracle.graal.python.builtins.objects.cext.structs.CStructs; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.frame.PFrame; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor; +import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.module.PythonModule; +import com.oracle.graal.python.builtins.objects.str.StringNodes; +import com.oracle.graal.python.builtins.objects.str.StringUtils; import com.oracle.graal.python.builtins.objects.thread.PLock; -import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext; import com.oracle.graal.python.runtime.GilNode; -import com.oracle.graal.python.runtime.IndirectCallData; +import com.oracle.graal.python.runtime.PosixConstants; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode; import com.oracle.graal.python.runtime.PythonContext.PythonThreadState; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.util.Function; +import com.oracle.graal.python.util.PythonSystemThreadTask; import com.oracle.graal.python.util.PythonUtils; -import com.oracle.graal.python.util.Supplier; -import com.oracle.graal.python.util.WeakIdentityHashMap; +import com.oracle.graal.python.util.SuppressFBWarnings; import com.oracle.truffle.api.CallTarget; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.CompilerDirectives.ValueType; import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.TruffleFile; import com.oracle.truffle.api.TruffleLanguage.Env; import com.oracle.truffle.api.TruffleLogger; import com.oracle.truffle.api.TruffleSafepoint; -import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.exception.AbstractTruffleException; import com.oracle.truffle.api.interop.ArityException; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.InvalidArrayIndexException; @@ -141,11 +150,14 @@ import com.oracle.truffle.api.source.Source; import com.oracle.truffle.api.source.Source.SourceBuilder; import com.oracle.truffle.api.strings.TruffleString; +import com.oracle.truffle.api.strings.TruffleString.CodeRange; import com.oracle.truffle.nfi.api.SignatureLibrary; import sun.misc.Unsafe; public final class CApiContext extends CExtContext { + private static final TruffleString T_PY_INIT = tsLiteral("PyInit_"); + private static final TruffleString T_PY_INIT_U = tsLiteral("PyInitU_"); public static final String LOGGER_CAPI_NAME = "capi"; @@ -160,23 +172,8 @@ public final class CApiContext extends CExtContext { */ private static final Source MODINIT_SRC = Source.newBuilder(J_NFI_LANGUAGE, "():POINTER", "modinit").build(); - /** - * The default C-level call recursion limit like {@code Py_DEFAULT_RECURSION_LIMIT}. - */ - public static final int DEFAULT_RECURSION_LIMIT = 1000; private static final TruffleLogger LOGGER = PythonLanguage.getLogger(LOGGER_CAPI_NAME); - - /* a random number between 1 and 20 */ - private static final int MAX_COLLECTION_RETRIES = 17; - - /** Total amount of allocated native memory (in bytes). */ - private long allocatedMemory = 0; - - private Map allocatedNativeMemory; - private TraceMallocDomain[] traceMallocDomains; - - /** Container of pointers that have seen to be free'd. */ - private Map freedNativeMemory; + public static final TruffleLogger GC_LOGGER = PythonLanguage.getLogger(CApiContext.LOGGER_CAPI_NAME + ".gc"); /** Native wrappers for context-insensitive singletons like {@link PNone#NONE}. */ @CompilationFinal(dimensions = 1) private final PythonAbstractObjectNativeWrapper[] singletonNativePtrs; @@ -198,6 +195,12 @@ public final class CApiContext extends CExtContext { */ private Object nativeSmallIntsArray; + /** + * Pointer to the native {@code GCState GC state}. This corresponds to CPython's + * {@code PyInterpreterState.gc}. + */ + private Object gcState; + /** Same as {@code import.c: extensions} but we don't keep a PDict; just a bare Java HashMap. */ private final HashMap, PythonModule> extensions = new HashMap<>(4); @@ -235,6 +238,71 @@ public final class CApiContext extends CExtContext { private record ClosureInfo(Object closure, Object delegate, Object executable, long pointer) { } + /** + * A simple helper object that just remembers the name and the path of the original module spec + * object and also keeps a reference to it. This should avoid redundant attribute reads. + */ + @ValueType + public static final class ModuleSpec { + public final TruffleString name; + public final TruffleString path; + public final Object originalModuleSpec; + private TruffleString encodedName; + private boolean ascii; + + public ModuleSpec(TruffleString name, TruffleString path, Object originalModuleSpec) { + this.name = name; + this.path = path; + this.originalModuleSpec = originalModuleSpec; + } + + /** + * Get the variable part of a module's export symbol name. For non-ASCII-named modules, the + * name is encoded as per PEP 489. The hook_prefix pointer is set to either + * ascii_only_prefix or nonascii_prefix, as appropriate. + */ + @TruffleBoundary + TruffleString getEncodedName() { + if (encodedName != null) { + return encodedName; + } + + // Get the short name (substring after last dot) + TruffleString basename = getBaseName(name); + + boolean canEncode = canEncode(basename); + + if (canEncode) { + ascii = true; + } else { + ascii = false; + try { + basename = TruffleString.fromJavaStringUncached(Punycode.encode(basename.toJavaStringUncached(), null).toString(), PythonUtils.TS_ENCODING); + } catch (StringPrepParseException e) { + throw CompilerDirectives.shouldNotReachHere(); + } + } + + // replace '-' by '_'; note: this is fast and does not use regex + return (encodedName = StringNodes.StringReplaceNode.getUncached().execute(basename, T_DASH, T_UNDERSCORE, -1)); + } + + @TruffleBoundary + private static boolean canEncode(TruffleString basename) { + return TruffleString.GetCodeRangeNode.getUncached().execute(basename, PythonUtils.TS_ENCODING) == CodeRange.ASCII; + } + + @TruffleBoundary + public TruffleString getInitFunctionName() { + /* + * n.b.: 'getEncodedName' also sets 'ascii' and must therefore be called before 'ascii' + * is queried + */ + TruffleString s = getEncodedName(); + return StringUtils.cat((ascii ? T_PY_INIT : T_PY_INIT_U), s); + } + } + /* * The key is the executable instance, i.e., an instance of a class that exports the * InteropLibrary. @@ -264,13 +332,19 @@ private record ClosureInfo(Object closure, Object delegate, Object executable, l */ private final List loadedExtensions = new LinkedList<>(); + private final NativeLibraryLocator nativeLibraryLocator; + + public final BackgroundGCTask gcTask; + private Thread backgroundGCTaskThread; + public static TruffleLogger getLogger(Class clazz) { return PythonLanguage.getLogger(LOGGER_CAPI_NAME + "." + clazz.getSimpleName()); } - public CApiContext(PythonContext context, Object llvmLibrary, boolean useNativeBackend) { - super(context, llvmLibrary, useNativeBackend); + public CApiContext(PythonContext context, Object library, NativeLibraryLocator locator) { + super(context, library); this.nativeSymbolCache = new Object[NativeCAPISymbol.values().length]; + this.nativeLibraryLocator = locator; /* * Publish the native symbol cache to the static field if following is given: (1) The static @@ -283,8 +357,7 @@ public CApiContext(PythonContext context, Object llvmLibrary, boolean useNativeB if (!CApiContext.nativeSymbolCacheSingleContextUsed && context.getLanguage().isSingleContext()) { assert CApiContext.nativeSymbolCacheSingleContext == null; - // we cannot be in built-time code because this is using pre-initialized contexts - assert !ImageInfo.inImageBuildtimeCode(); + assert !context.getEnv().isPreInitialization(); // this is the first context accessing the static symbol cache CApiContext.nativeSymbolCacheSingleContext = this.nativeSymbolCache; @@ -321,6 +394,12 @@ public CApiContext(PythonContext context, Object llvmLibrary, boolean useNativeB assert CApiGuards.isSmallInteger(value); primitiveNativeWrapperCache[i] = PrimitiveNativeWrapper.createInt(value); } + + // initialize Py_True and Py_False + context.getTrue().setNativeWrapper(PrimitiveNativeWrapper.createBool(true)); + context.getFalse().setNativeWrapper(PrimitiveNativeWrapper.createBool(false)); + + this.gcTask = new BackgroundGCTask(context); } @TruffleBoundary @@ -359,30 +438,6 @@ public static Object asPointer(Object ptr, InteropLibrary lib) { return ptr; } - public TraceMallocDomain getTraceMallocDomain(int domainIdx) { - return traceMallocDomains[domainIdx]; - } - - public int findOrCreateTraceMallocDomain(int id) { - int oldLength; - if (traceMallocDomains != null) { - for (int i = 0; i < traceMallocDomains.length; i++) { - if (traceMallocDomains[i].id == id) { - return i; - } - } - - // create new domain - oldLength = traceMallocDomains.length; - traceMallocDomains = Arrays.copyOf(traceMallocDomains, traceMallocDomains.length + 1); - } else { - oldLength = 0; - traceMallocDomains = new TraceMallocDomain[1]; - } - traceMallocDomains[oldLength] = new TraceMallocDomain(id); - return oldLength; - } - public long nextTssKey() { return nextTssKey.incrementAndGet(); } @@ -458,6 +513,12 @@ public PrimitiveNativeWrapper getCachedPrimitiveNativeWrapper(long l) { return getCachedPrimitiveNativeWrapper((int) l); } + public PrimitiveNativeWrapper getCachedBooleanPrimitiveNativeWrapper(boolean b) { + PythonAbstractObjectNativeWrapper wrapper = b ? getContext().getTrue().getNativeWrapper() : getContext().getFalse().getNativeWrapper(); + assert wrapper.getRefCount() > 0; + return (PrimitiveNativeWrapper) wrapper; + } + /** * Returns or allocates (on demand) the native array {@code PyInterpreterState.small_ints} and * write all elements to it. @@ -524,6 +585,48 @@ private boolean verifyNativeSmallInts() { return true; } + /** + * Allocates the {@code GCState} which needs to happen very early in the C API initialization + * phase. Very early means it needs to happen before the first object (that takes part + * in the GC) is sent to native. This could, e.g., be the thread-state dict that is allocated + * when creating the {@link PThreadState native thread state}. + */ + public Object createGCState() { + CompilerAsserts.neverPartOfCompilation(); + assert gcState == null; + PythonContext.GCState state = getContext().getGcState(); + Object ptr = CStructAccess.AllocateNode.allocUncached(CStructs.GCState); + CStructAccess.WriteIntNode.writeUncached(ptr, CFields.GCState__enabled, PInt.intValue(state.isEnabled())); + CStructAccess.WriteIntNode.writeUncached(ptr, CFields.GCState__debug, state.getDebug()); + Object generations = CStructAccess.GetElementPtrNode.getUncached().getElementPtr(ptr, CFields.GCState__generations); + for (int i = 0; i < state.getThresholds().length; i++) { + CStructAccess.WriteIntNode.getUncached().writeStructArrayElement(generations, i, CFields.GCGeneration__threshold, state.getThresholds()[i]); + } + gcState = ptr; + return gcState; + } + + /** + * Fast-path method to retrieve the {@code GCState} pointer. This must only be called after + * {@link #createGCState()} was called the first time which should happen very early during C + * API context initialization. + */ + public Object getGCState() { + assert gcState != null; + return gcState; + } + + /** + * Deallocates the native {@code GCState} (pointer {@link #gcState}). + */ + private void freeGCState() { + CompilerAsserts.neverPartOfCompilation(); + if (gcState != null) { + FreeNode.executeUncached(gcState); + gcState = null; + } + } + public Object getModuleByIndex(int i) { if (i < modulesByIndex.size()) { return modulesByIndex.get(i); @@ -536,19 +639,42 @@ public Object getModuleByIndex(int i) { * instance of {@link CApiContext}, it will load the cache stored from the static field * {@link CApiContext#nativeSymbolCacheSingleContext}. Otherwise, it will load the cache from * the instance field {@link CApiContext#nativeSymbolCache}. - * + * * @param caller The requesting node (may be {@code null}). Used for the fast-path lookup of the * {@link CApiContext} instance (if necessary). * @return The C API symbol cache. */ private static Object[] getSymbolCache(Node caller) { - Object[] nativeSymbolCacheSingleContext = CApiContext.nativeSymbolCacheSingleContext; - if (nativeSymbolCacheSingleContext != null) { - return nativeSymbolCacheSingleContext; + Object[] cache = nativeSymbolCacheSingleContext; + if (cache != null) { + return cache; } return PythonContext.get(caller).getCApiContext().nativeSymbolCache; } + public static boolean isIdenticalToSymbol(Object obj, NativeCAPISymbol symbol) { + CompilerAsserts.neverPartOfCompilation(); + InteropLibrary objLib = InteropLibrary.getUncached(obj); + objLib.toNative(obj); + try { + return isIdenticalToSymbol(objLib.asPointer(obj), symbol); + } catch (UnsupportedMessageException e) { + throw new RuntimeException(e); + } + } + + public static boolean isIdenticalToSymbol(long ptr, NativeCAPISymbol symbol) { + CompilerAsserts.neverPartOfCompilation(); + Object nativeSymbol = getNativeSymbol(null, symbol); + InteropLibrary lib = InteropLibrary.getUncached(nativeSymbol); + lib.toNative(nativeSymbol); + try { + return lib.asPointer(nativeSymbol) == ptr; + } catch (UnsupportedMessageException e) { + throw new RuntimeException(e); + } + } + public static Object getNativeSymbol(Node caller, NativeCAPISymbol symbol) { Object[] nativeSymbolCache = getSymbolCache(caller); Object result = nativeSymbolCache[symbol.ordinal()]; @@ -568,8 +694,8 @@ private static Object lookupNativeSymbol(Object[] nativeSymbolCache, NativeCAPIS CompilerAsserts.neverPartOfCompilation(); String name = symbol.getName(); try { - Object nativeSymbol = InteropLibrary.getUncached().readMember(PythonContext.get(null).getCApiContext().getLLVMLibrary(), name); - nativeSymbol = CExtContext.ensureExecutable(nativeSymbol, symbol); + Object nativeSymbol = InteropLibrary.getUncached().readMember(PythonContext.get(null).getCApiContext().getLibrary(), name); + nativeSymbol = EnsureExecutableNode.executeUncached(nativeSymbol, symbol); VarHandle.storeStoreFence(); return nativeSymbolCache[symbol.ordinal()] = nativeSymbol; } catch (UnsupportedMessageException | UnknownIdentifierException e) { @@ -577,36 +703,6 @@ private static Object lookupNativeSymbol(Object[] nativeSymbolCache, NativeCAPIS } } - @TruffleBoundary - public AllocInfo traceFree(Object ptr, @SuppressWarnings("unused") PFrame.Reference curFrame, @SuppressWarnings("unused") TruffleString clazzName) { - if (allocatedNativeMemory == null) { - allocatedNativeMemory = new HashMap<>(); - } - if (freedNativeMemory == null) { - freedNativeMemory = new HashMap<>(); - } - AllocInfo allocatedValue = allocatedNativeMemory.remove(ptr); - Object freedValue = freedNativeMemory.put(ptr, allocatedValue); - if (freedValue != null) { - LOGGER.severe(PythonUtils.formatJString("freeing memory that was already free'd %s (double-free)", asHex(ptr))); - } else if (allocatedValue == null) { - LOGGER.info(PythonUtils.formatJString("freeing non-allocated memory %s (maybe a double-free or we didn't trace the allocation)", asHex(ptr))); - } - return allocatedValue; - } - - @TruffleBoundary - public void traceAlloc(Object ptr, PFrame.Reference curFrame, TruffleString clazzName, long size) { - if (allocatedNativeMemory == null) { - allocatedNativeMemory = new HashMap<>(); - } - Object value = allocatedNativeMemory.put(ptr, new AllocInfo(clazzName, curFrame, size)); - if (freedNativeMemory != null) { - freedNativeMemory.remove(ptr); - } - assert value == null : "native memory allocator reserved same memory twice"; - } - @SuppressWarnings("unused") public void trackObject(Object ptr, PFrame.Reference curFrame, TruffleString clazzName) { // TODO(fa): implement tracking of container objects for cycle detection @@ -617,152 +713,187 @@ public void untrackObject(Object ptr, PFrame.Reference curFrame, TruffleString c // TODO(fa): implement untracking of container objects } - /** - * Use this method to register memory that is known to be allocated (i.e. static variables like - * types). This is basically the same as - * {@link #traceAlloc(Object, PFrame.Reference, TruffleString, long)} but does not consider it - * to be an error if the memory is already allocated. - */ - @TruffleBoundary - public void traceStaticMemory(Object ptr, PFrame.Reference curFrame, TruffleString clazzName) { - if (allocatedNativeMemory == null) { - allocatedNativeMemory = new HashMap<>(); - } - if (freedNativeMemory != null) { - freedNativeMemory.remove(ptr); - } - allocatedNativeMemory.put(ptr, new AllocInfo(curFrame, clazzName)); - } + private static final class BackgroundGCTask extends PythonSystemThreadTask { - @TruffleBoundary - public boolean isAllocated(Object ptr) { - if (freedNativeMemory != null && freedNativeMemory.containsKey(ptr)) { - assert !allocatedNativeMemory.containsKey(ptr); - return false; + private BackgroundGCTask(PythonContext context) { + super("Python GC", LOGGER); + this.ctx = new WeakReference<>(context); + this.rssInterval = context.getOption(PythonOptions.BackgroundGCTaskInterval); + this.gcRSSThreshold = context.getOption(PythonOptions.BackgroundGCTaskThreshold) / (double) 100; + this.gcRSSMinimum = context.getOption(PythonOptions.BackgroundGCTaskMinimum); } - return true; - } - public void increaseMemoryPressure(VirtualFrame frame, Node inliningTarget, GetThreadStateNode getThreadStateNode, IndirectCallData indirectCallData, long size) { - PythonContext context = getContext(); - if (allocatedMemory + size <= context.getOption(PythonOptions.MaxNativeMemory)) { - allocatedMemory += size; - return; - } + Object nativeSymbol = null; + InteropLibrary callNative = null; + + long currentRSS = -1; + long previousRSS = -1; + int previousWeakrefCount = -1; + + final WeakReference ctx; + + // RSS monitor interval in ms + final int rssInterval; + /** + * RSS percentage increase between System.gc() calls. Low percentage will trigger + * System.gc() more often which can cause unnecessary overhead. + * + *
        + * Based on the {@code huggingface} example: + *
      • less than 30%: max RSS ~22GB (>200 second per iteration)
      • + *
      • 30%: max RSS ~24GB (~150 second per iteration)
      • + *
      • larger than 30%: max RSS ~38GB (~140 second per iteration)
      • + *
      + * + *
      +         */
      +        final double gcRSSThreshold;
       
      -        PythonThreadState threadState = getThreadStateNode.execute(inliningTarget, context);
      -        Object savedState = IndirectCallContext.enter(frame, threadState, indirectCallData);
      -        try {
      -            triggerGC(context, size, inliningTarget);
      -        } finally {
      -            IndirectCallContext.exit(frame, threadState, savedState);
      +        /**
      +         * RSS minimum memory (in megabytes) start calling System.gc(). Default is 4GB.
      +         */
      +        final double gcRSSMinimum;
      +
      +        Long getCurrentRSS() {
      +            if (nativeSymbol == null) {
      +                nativeSymbol = CApiContext.getNativeSymbol(null, NativeCAPISymbol.FUN_GET_CURRENT_RSS);
      +                callNative = InteropLibrary.getUncached(nativeSymbol);
      +            }
      +            Long rss = 0L;
      +            try {
      +                rss = (Long) callNative.execute(nativeSymbol);
      +            } catch (Exception ignored) {
      +            }
      +            return rss;
               }
      -    }
       
      -    @TruffleBoundary
      -    public void triggerGC(PythonContext context, long size, Node caller) {
      -        long delay = 0;
      -        for (int retries = 0; retries < MAX_COLLECTION_RETRIES; retries++) {
      -            delay += 50;
      -            doGc(delay);
      -            CApiTransitions.pollReferenceQueue();
      -            PythonContext.triggerAsyncActions(caller);
      -            if (allocatedMemory + size <= context.getOption(PythonOptions.MaxNativeMemory)) {
      -                allocatedMemory += size;
      +        @Override
      +        protected void doRun() {
      +            Node location = getSafepointLocation();
      +            if (location == null) {
                       return;
                   }
      +            while (true) {
      +                TruffleSafepoint.setBlockedThreadInterruptible(location, Thread::sleep, rssInterval);
      +                perform();
      +            }
               }
      -        throw new OutOfMemoryError("native memory");
      -    }
      -
      -    public void reduceMemoryPressure(long size) {
      -        allocatedMemory -= size;
      -    }
       
      -    @TruffleBoundary
      -    private static void doGc(long millis) {
      -        LOGGER.fine("full GC due to native memory");
      -        PythonUtils.forceFullGC();
      -        try {
      -            Thread.sleep(millis);
      -        } catch (InterruptedException x) {
      -            // Restore interrupt status
      -            Thread.currentThread().interrupt();
      +        private Node getSafepointLocation() {
      +            PythonContext context = ctx.get();
      +            if (context == null) {
      +                return null;
      +            }
      +            return context.getLanguage().unavailableSafepointLocation;
               }
      -    }
       
      -    /**
      -     * Tests if any read/write access to the given pointer object is invalid. This should be used to
      -     * test access before getting the type of reference count of native objects.
      -     */
      -    public void checkAccess(Object pointerObject, InteropLibrary lib) {
      -        if (getContext().getOption(PythonOptions.TraceNativeMemory)) {
      -            Object ptrVal = CApiContext.asPointer(pointerObject, lib);
      -            if (!isAllocated(ptrVal)) {
      -                LOGGER.severe(() -> "Access to invalid memory at " + CApiContext.asHex(ptrVal));
      +        private void perform() {
      +            PythonContext context = ctx.get();
      +            if (context == null) {
      +                return;
                   }
      -        }
      -    }
       
      -    public static final class AllocInfo {
      -        public final TruffleString typeName;
      -        public final PFrame.Reference allocationSite;
      -        public final long size;
      +            long rss = currentRSS = getCurrentRSS();
      +            if (rss == 0) {
      +                LOGGER.finer("We are unable to get resident set size (RSS) from the system. " +
      +                                "We will skip the java collection routine.");
      +                Thread.currentThread().interrupt();
      +                return;
      +            }
       
      -        public AllocInfo(TruffleString typeName, PFrame.Reference allocationSite, long size) {
      -            this.typeName = typeName;
      -            this.allocationSite = allocationSite;
      -            this.size = size;
      -        }
      +            // reset RSS baseline
      +            if (rss < this.previousRSS || this.previousRSS == -1) {
      +                this.previousRSS = rss;
      +                return;
      +            }
       
      -        public AllocInfo(PFrame.Reference allocationSite, TruffleString typeName) {
      -            this(typeName, allocationSite, -1);
      -        }
      -    }
      +            if (rss < gcRSSMinimum) {
      +                return;
      +            }
      +
      +            // skip GC if no new native weakrefs have been created.
      +            int currentWeakrefCount = context.nativeContext.nativeLookup.size();
      +            if (currentWeakrefCount < this.previousWeakrefCount || this.previousWeakrefCount == -1) {
      +                this.previousWeakrefCount = currentWeakrefCount;
      +                return;
      +            }
       
      -    public static final class TraceMallocDomain {
      -        private final int id;
      -        private final EconomicMap allocatedMemory;
      +            double ratio = ((rss - this.previousRSS) / (double) this.previousRSS);
      +            if (ratio >= gcRSSThreshold) {
      +                this.previousWeakrefCount = currentWeakrefCount;
       
      -        public TraceMallocDomain(int id) {
      -            this.id = id;
      -            this.allocatedMemory = EconomicMap.create();
      -        }
      +                long start = System.nanoTime();
      +                PythonUtils.forceFullGC();
      +                long gcTime = (System.nanoTime() - start) / 1000000;
       
      -        @TruffleBoundary
      -        public void track(Object pointerObject, long size) {
      -            allocatedMemory.put(pointerObject, size);
      +                if (LOGGER.isLoggable(Level.FINER)) {
      +                    LOGGER.info(PythonUtils.formatJString("Background GC Task -- GC [%d ms] RSS [%d MB]->[%d MB](%.1f%%)",
      +                                    gcTime, previousRSS, rss, ratio * 100));
      +                }
      +                /*
      +                 * cap the previous RSS increase to GC_RSS_THRESHOLD. If the ratio is much larger
      +                 * than GC_RSS_THRESHOLD, then we should do GC more frequently. Though, if we get a
      +                 * lower RSS in subsequent runs, the lower RSS will be set as previous RSS (see
      +                 * above).
      +                 *
      +                 * Note: Resident Set Size (RSS) in the system isn't always an accurate indication
      +                 * of used memory but rather a combination of anonymous memory (RssAnon), file
      +                 * mappings (RssFile) and shmem memory (RssShmem). GC can only reduce RssAnon while
      +                 * RssFile is managed by the operating system which doesn't go down easily.
      +                 */
      +                this.previousRSS += (long) (this.previousRSS * gcRSSThreshold);
      +            }
               }
      +    }
       
      -        @TruffleBoundary
      -        public long untrack(Object pointerObject) {
      -            Long value = allocatedMemory.removeKey(pointerObject);
      -            if (value != null) {
      -                // TODO(fa): be more restrictive?
      -                return value;
      +    @TruffleBoundary
      +    public long getCurrentRSS() {
      +        if (backgroundGCTaskThread != null && backgroundGCTaskThread.isAlive()) {
      +            long rss = gcTask.currentRSS;
      +            if (rss == -1) {
      +                try {
      +                    // in case it just started
      +                    Thread.sleep(gcTask.rssInterval);
      +                } catch (InterruptedException e) {
      +                    Thread.currentThread().interrupt();
      +                }
      +                rss = gcTask.currentRSS;
                   }
      -            return 0;
      +            return rss;
               }
      +        return 0L;
      +    }
       
      -        public int getId() {
      -            return id;
      +    @SuppressFBWarnings(value = "NP_NULL_ON_SOME_PATH") // context.get() is never null here
      +    void runBackgroundGCTask(PythonContext context) {
      +        CompilerAsserts.neverPartOfCompilation();
      +        if (context.getEnv().isPreInitialization() //
      +                        || context.getOption(PythonOptions.NoAsyncActions) //
      +                        || !PythonOptions.AUTOMATIC_ASYNC_ACTIONS //
      +                        || !context.getOption(PythonOptions.BackgroundGCTask)) {
      +            return;
               }
      +        backgroundGCTaskThread = context.createSystemThread(gcTask);
      +        backgroundGCTaskThread.start();
           }
       
           /**
            * This represents whether the current process has already loaded an instance of the native CAPI
      -     * extensions - this can only be loaded once per process.
      +     * extensions - this can only be loaded globally once per process or in isolation multiple
      +     * times.
            */
      -    private static AtomicBoolean nativeCAPILoaded = new AtomicBoolean();
      -    private static AtomicBoolean warnedSecondContexWithNativeCAPI = new AtomicBoolean();
      +    private static final AtomicInteger nativeCAPILoaded = new AtomicInteger();
      +    private static final byte NO_NATIVE_CONTEXT = 0;
      +    private static final byte ISOLATED_NATIVE_CONTEXT = 1;
      +    private static final byte GLOBAL_NATIVE_CONTEXT = 2;
       
           private Runnable nativeFinalizerRunnable;
           private Thread nativeFinalizerShutdownHook;
       
           @TruffleBoundary
      -    public static CApiContext ensureCapiWasLoaded() {
      +    public static CApiContext ensureCapiWasLoaded(String reason) {
               try {
      -            return CApiContext.ensureCapiWasLoaded(null, PythonContext.get(null), T_EMPTY_STRING, T_EMPTY_STRING);
      +            return CApiContext.ensureCapiWasLoaded(null, PythonContext.get(null), T_EMPTY_STRING, T_EMPTY_STRING, reason);
               } catch (Exception e) {
                   throw CompilerDirectives.shouldNotReachHere(e);
               }
      @@ -770,79 +901,91 @@ public static CApiContext ensureCapiWasLoaded() {
       
           @TruffleBoundary
           public static CApiContext ensureCapiWasLoaded(Node node, PythonContext context, TruffleString name, TruffleString path) throws IOException, ImportException, ApiInitException {
      +        return ensureCapiWasLoaded(node, context, name, path, null);
      +    }
      +
      +    @TruffleBoundary
      +    public static CApiContext ensureCapiWasLoaded(Node node, PythonContext context, TruffleString name, TruffleString path, String reason) throws IOException, ImportException, ApiInitException {
      +        assert PythonContext.get(null).ownsGil(); // unsafe lazy initialization
               if (!context.hasCApiContext()) {
                   Env env = context.getEnv();
                   InteropLibrary U = InteropLibrary.getUncached();
       
                   TruffleFile homePath = env.getInternalTruffleFile(context.getCAPIHome().toJavaStringUncached());
                   // e.g. "libpython-native.so"
      -            String libName = context.getLLVMSupportExt("python");
      -            TruffleFile capiFile = homePath.resolve(libName).getCanonicalFile(LinkOption.NOFOLLOW_LINKS);
      +            String libName = PythonContext.getSupportLibName("python-native");
      +            final TruffleFile capiFile = homePath.resolve(libName).getCanonicalFile();
                   try {
                       SourceBuilder capiSrcBuilder;
      -                final boolean useNative;
      -                if (PythonOptions.NativeModules.getValue(env.getOptions())) {
      -                    useNative = nativeCAPILoaded.compareAndSet(false, true);
      -                    if (!useNative && warnedSecondContexWithNativeCAPI.compareAndSet(false, true)) {
      -                        LOGGER.warning("GraalPy option 'NativeModules' is set to true, " +
      -                                        "but only one context in the process can use native modules, " +
      -                                        "second and other contexts fallback to NativeModules=false and " +
      -                                        "will use LLVM bitcode execution via GraalVM LLVM.");
      -                    }
      +                boolean useNative = true;
      +                boolean isolateNative = PythonOptions.IsolateNativeModules.getValue(env.getOptions());
      +                final NativeLibraryLocator loc;
      +                if (!isolateNative) {
      +                    useNative = nativeCAPILoaded.compareAndSet(NO_NATIVE_CONTEXT, GLOBAL_NATIVE_CONTEXT);
                       } else {
      -                    useNative = false;
      +                    useNative = nativeCAPILoaded.compareAndSet(NO_NATIVE_CONTEXT, ISOLATED_NATIVE_CONTEXT) || nativeCAPILoaded.get() == ISOLATED_NATIVE_CONTEXT;
                       }
      -                if (useNative) {
      -                    context.ensureNFILanguage(node, "NativeModules", "true");
      -                    capiSrcBuilder = Source.newBuilder(J_NFI_LANGUAGE, "load(RTLD_GLOBAL) \"" + capiFile.getPath() + "\"", "");
      -                } else {
      -                    context.ensureLLVMLanguage(node);
      -                    capiSrcBuilder = Source.newBuilder(J_LLVM_LANGUAGE, capiFile);
      +                if (!useNative) {
      +                    String actualReason = "initialize native extensions support";
      +                    if (reason != null) {
      +                        actualReason = reason;
      +                    } else if (name != null && path != null) {
      +                        actualReason = String.format("load a native module '%s' from path '%s'", name.toJavaStringUncached(), path.toJavaStringUncached());
      +                    }
      +                    throw new ApiInitException(toTruffleStringUncached(
      +                                    String.format("Option python.IsolateNativeModules is set to 'false' and a second GraalPy context attempted to %s. " +
      +                                                    "At least one context in this process runs with 'IsolateNativeModules' set to false. " +
      +                                                    "Depending on the order of context creation, this means some contexts in the process " +
      +                                                    "cannot use native module.", actualReason)));
                       }
      +                loc = new NativeLibraryLocator(context, capiFile, isolateNative);
      +                context.ensureNFILanguage(node, "allowNativeAccess", "true");
      +                String dlopenFlags = isolateNative ? "RTLD_LOCAL" : "RTLD_GLOBAL";
      +                capiSrcBuilder = Source.newBuilder(J_NFI_LANGUAGE, String.format("load(%s) \"%s\"", dlopenFlags, loc.getCapiLibrary()), "");
      +                LOGGER.config(() -> "loading CAPI from " + loc.getCapiLibrary() + " as native");
                       if (!context.getLanguage().getEngineOption(PythonOptions.ExposeInternalSources)) {
                           capiSrcBuilder.internal(true);
                       }
      -                LOGGER.config(() -> "loading CAPI from " + capiFile + " as " + (useNative ? "native" : "bitcode"));
                       CallTarget capiLibraryCallTarget = context.getEnv().parseInternal(capiSrcBuilder.build());
       
                       Object capiLibrary = capiLibraryCallTarget.call();
                       Object initFunction = U.readMember(capiLibrary, "initialize_graal_capi");
      -                CApiContext cApiContext = new CApiContext(context, capiLibrary, useNative);
      +                CApiContext cApiContext = new CApiContext(context, capiLibrary, loc);
                       context.setCApiContext(cApiContext);
      +
                       try (BuiltinArrayWrapper builtinArrayWrapper = new BuiltinArrayWrapper()) {
      -                    if (useNative) {
      -                        Object signature = env.parseInternal(Source.newBuilder(J_NFI_LANGUAGE, "(ENV,(SINT32):POINTER):VOID", "exec").build()).call();
      -                        initFunction = SignatureLibrary.getUncached().bind(signature, initFunction);
      -                        U.execute(initFunction, builtinArrayWrapper);
      -                    } else {
      -                        assert U.isExecutable(initFunction);
      -                        U.execute(initFunction, NativePointer.createNull(), builtinArrayWrapper);
      -                    }
      +                    /*
      +                     * The GC state needs to be created before the first managed object is sent to
      +                     * native. This is because the native object stub could take part in GC and will
      +                     * then already require the GC state.
      +                     */
      +                    Object gcState = cApiContext.createGCState();
      +                    Object signature = env.parseInternal(Source.newBuilder(J_NFI_LANGUAGE, "(ENV,POINTER,POINTER):VOID", "exec").build()).call();
      +                    initFunction = SignatureLibrary.getUncached().bind(signature, initFunction);
      +                    U.execute(initFunction, builtinArrayWrapper, gcState);
                       }
       
                       assert PythonCApiAssertions.assertBuiltins(capiLibrary);
                       cApiContext.pyDateTimeCAPICapsule = PyDateTimeCAPIWrapper.initWrapper(context, cApiContext);
                       context.runCApiHooks();
       
      -                if (useNative) {
      -                    /*
      -                     * C++ libraries sometimes declare global objects that have destructors that
      -                     * call Py_DECREF. Those destructors are then called during native shutdown,
      -                     * which is after the JVM/SVM shut down and the upcall would segfault. This
      -                     * finalizer code rebinds reference operations to native no-ops that don't
      -                     * upcall. In normal scenarios we call it during context exit, but when the VM
      -                     * is terminated by a signal, the context exit is skipped. For that case we set
      -                     * up the shutdown hook.
      -                     */
      -                    Object finalizeFunction = U.readMember(capiLibrary, "GraalPy_get_finalize_capi_pointer");
      -                    Object finalizeSignature = env.parseInternal(Source.newBuilder(J_NFI_LANGUAGE, "():POINTER", "exec").build()).call();
      -                    Object finalizingPointer = SignatureLibrary.getUncached().call(finalizeSignature, finalizeFunction);
      -                    try {
      -                        cApiContext.addNativeFinalizer(env, finalizingPointer);
      -                    } catch (RuntimeException e) {
      -                        // This can happen when other languages restrict multithreading
      -                        LOGGER.warning(() -> "didn't register a native finalizer due to: " + e.getMessage());
      -                    }
      +                /*
      +                 * C++ libraries sometimes declare global objects that have destructors that call
      +                 * Py_DECREF. Those destructors are then called during native shutdown, which is
      +                 * after the JVM/SVM shut down and the upcall would segfault. This finalizer code
      +                 * rebinds reference operations to native no-ops that don't upcall. In normal
      +                 * scenarios we call it during context exit, but when the VM is terminated by a
      +                 * signal, the context exit is skipped. For that case we set up the shutdown hook.
      +                 */
      +                Object finalizeFunction = U.readMember(capiLibrary, "GraalPy_get_finalize_capi_pointer");
      +                Object finalizeSignature = env.parseInternal(Source.newBuilder(J_NFI_LANGUAGE, "():POINTER", "exec").build()).call();
      +                Object finalizingPointer = SignatureLibrary.getUncached().call(finalizeSignature, finalizeFunction);
      +                try {
      +                    cApiContext.addNativeFinalizer(context, finalizingPointer);
      +                    cApiContext.runBackgroundGCTask(context);
      +                } catch (RuntimeException e) {
      +                    // This can happen when other languages restrict multithreading
      +                    LOGGER.warning(() -> "didn't register a native finalizer due to: " + e.getMessage());
                       }
       
                       return cApiContext;
      @@ -864,20 +1007,130 @@ public static CApiContext ensureCapiWasLoaded(Node node, PythonContext context,
               return context.getCApiContext();
           }
       
      +    private static final Set C_EXT_SUPPORTED_LIST = Set.of(
      +                    // Stdlib modules are considered supported
      +                    "_cpython_sre",
      +                    "_cpython_unicodedata",
      +                    "_sha3",
      +                    "_sqlite3",
      +                    "termios",
      +                    "pyexpat");
      +
      +    private static String dlopenFlagsToString(int flags) {
      +        String str = "RTLD_NOW";
      +        if ((flags & PosixConstants.RTLD_LAZY.value) != 0) {
      +            str = "RTLD_LAZY";
      +        }
      +        if ((flags & PosixConstants.RTLD_GLOBAL.value) != 0) {
      +            str += "|RTLD_GLOBAL";
      +        }
      +        if ((flags & PosixConstants.RTLD_LOCAL.value) != 0) {
      +            str += "|RTLD_LOCAL";
      +        }
      +        return str;
      +    }
      +
      +    /**
      +     * This method loads a C extension module (C API) and will initialize the corresponding native
      +     * contexts if necessary.
      +     *
      +     * @param location The node that's requesting this operation. This is required for reporting
      +     *            correct source code location in case exceptions occur.
      +     * @param context The Python context object.
      +     * @param spec The name and path of the module (also containing the original module spec
      +     *            object).
      +     * @param checkFunctionResultNode A node to check that the function result does not indicate
      +     *            that an exception was raised on the native side. It should be an adopted node,
      +     *            because only an adopted node will report useful source locations.
      +     * @return A Python module.
      +     * @throws IOException If the specified file cannot be loaded.
      +     * @throws ApiInitException If the corresponding native context could not be initialized.
      +     * @throws ImportException If an exception occurred during C extension initialization.
      +     */
      +    @TruffleBoundary
      +    public static Object loadCExtModule(Node location, PythonContext context, ModuleSpec spec, CheckFunctionResultNode checkFunctionResultNode)
      +                    throws IOException, ApiInitException, ImportException {
      +        if (getLogger(CApiContext.class).isLoggable(Level.WARNING) && context.getOption(PythonOptions.WarnExperimentalFeatures)) {
      +            if (!C_EXT_SUPPORTED_LIST.contains(spec.name.toJavaStringUncached())) {
      +                String message = "Loading C extension module %s from '%s'. Support for the Python C API is considered experimental.";
      +                if (!(boolean) context.getOption(PythonOptions.RunViaLauncher)) {
      +                    message += " See https://www.graalvm.org/latest/reference-manual/python/Native-Extensions/#embedding-limitations for the limitations. " +
      +                                    "You can suppress this warning by setting the context option 'python.WarnExperimentalFeatures' to 'false'.";
      +                }
      +                getLogger(CApiContext.class).warning(message.formatted(spec.name, spec.path));
      +            }
      +        }
      +
      +        // we always need to load the CPython C API
      +        CApiContext cApiContext = CApiContext.ensureCapiWasLoaded(location, context, spec.name, spec.path);
      +        Object library;
      +        InteropLibrary interopLib;
      +
      +        TruffleFile realPath = context.getPublicTruffleFileRelaxed(spec.path, context.getSoAbi()).getCanonicalFile();
      +        String loadPath = cApiContext.nativeLibraryLocator.resolve(context, realPath);
      +        getLogger(CApiContext.class).config(String.format("loading module %s (real path: %s) as native", spec.path, loadPath));
      +        int dlopenFlags = context.getDlopenFlags();
      +        if (context.getOption(PythonOptions.IsolateNativeModules)) {
      +            if ((dlopenFlags & PosixConstants.RTLD_GLOBAL.value) != 0) {
      +                getLogger(CApiContext.class).warning("The IsolateNativeModules option was specified, but the dlopen flags were set to include RTLD_GLOBAL " +
      +                                "(likely via some call to sys.setdlopenflags). This will probably lead to broken isolation and possibly incorrect results and crashing. " +
      +                                "You can patch sys.setdlopenflags to trace callers and/or prevent setting the RTLD_GLOBAL flags. " +
      +                                "See https://www.graalvm.org/latest/reference-manual/python/Native-Extensions for more details.");
      +            }
      +            dlopenFlags |= PosixConstants.RTLD_LOCAL.value;
      +        }
      +        String loadExpr = String.format("load(%s) \"%s\"", dlopenFlagsToString(dlopenFlags), loadPath);
      +        if (PythonOptions.UsePanama.getValue(context.getEnv().getOptions())) {
      +            loadExpr = "with panama " + loadExpr;
      +        }
      +        try {
      +            Source librarySource = Source.newBuilder(J_NFI_LANGUAGE, loadExpr, "load " + spec.name).build();
      +            library = context.getEnv().parseInternal(librarySource).call();
      +            interopLib = InteropLibrary.getUncached(library);
      +        } catch (PException e) {
      +            throw e;
      +        } catch (AbstractTruffleException e) {
      +            if (!realPath.exists() && realPath.toString().contains("org.graalvm.python.vfsx")) {
      +                // file does not exist and it is from VirtualFileSystem
      +                // => we probably failed to extract it due to unconventional libs location
      +                getLogger(CApiContext.class).severe(String.format("could not load module %s (real path: %s) from virtual file system.\n\n" +
      +                                "!!! Please try to run with java system property org.graalvm.python.vfs.extractOnStartup=true !!!\n" +
      +                                "See also: https://www.graalvm.org/python/docs/#graalpy-troubleshooting", spec.path, realPath));
      +
      +            }
      +
      +            throw new ImportException(CExtContext.wrapJavaException(e, location), spec.name, spec.path, ErrorMessages.CANNOT_LOAD_M, spec.path, e);
      +        }
      +
      +        try {
      +            return cApiContext.initCApiModule(location, library, spec.getInitFunctionName(), spec, interopLib, checkFunctionResultNode);
      +        } catch (UnsupportedTypeException | ArityException | UnsupportedMessageException e) {
      +            throw new ImportException(CExtContext.wrapJavaException(e, location), spec.name, spec.path, ErrorMessages.CANNOT_INITIALIZE_WITH, spec.path, spec.getEncodedName(), "");
      +        }
      +    }
      +
           /**
            * Registers a VM shutdown hook, that sets {@code graalpy_finalizing} variable to let the C side
            * know that it's not safe to do upcalls and that native wrappers might have been deallocated.
            * We need to do it in a VM shutdown hook to make sure C atexit won't crash even if our context
            * finalization didn't run.
      +     *
      +     * The memory of the shared library may have been re-used if the GraalPy context was shut down
      +     * (cleanly or not), the sources were collected, and NFI's mechanism for unloading libraries
      +     * triggered a dlclose that dropped the refcount of the python-native library to 0. We leak 1
      +     * byte of memory and this shutdown hook for each context that ever initialized the C API.
            */
      -    private void addNativeFinalizer(Env env, Object finalizingPointerObj) {
      -        final Unsafe unsafe = getContext().getUnsafe();
      +    private void addNativeFinalizer(PythonContext context, Object finalizingPointerObj) {
      +        final Unsafe unsafe = context.getUnsafe();
               InteropLibrary lib = InteropLibrary.getUncached(finalizingPointerObj);
               if (!lib.isNull(finalizingPointerObj) && lib.isPointer(finalizingPointerObj)) {
                   try {
                       long finalizingPointer = lib.asPointer(finalizingPointerObj);
      -                nativeFinalizerRunnable = () -> unsafe.putInt(finalizingPointer, 1);
      -                nativeFinalizerShutdownHook = env.newTruffleThreadBuilder(nativeFinalizerRunnable).build();
      +                // We are writing off heap memory and registering a VM shutdown hook, there is no
      +                // point in creating this thread via Truffle sandbox at this point
      +                nativeFinalizerRunnable = () -> unsafe.putByte(finalizingPointer, (byte) 1);
      +                context.registerAtexitHook((c) -> nativeFinalizerRunnable.run());
      +                nativeFinalizerShutdownHook = new Thread(nativeFinalizerRunnable);
                       Runtime.getRuntime().addShutdownHook(nativeFinalizerShutdownHook);
                   } catch (UnsupportedMessageException e) {
                       throw new RuntimeException(e);
      @@ -894,16 +1147,23 @@ private void addNativeFinalizer(Env env, Object finalizingPointerObj) {
           @SuppressWarnings("try")
           public void exitCApiContext() {
               CompilerAsserts.neverPartOfCompilation();
      -        /*
      -         * Polling the native reference queue is the only task we can do here because deallocating
      -         * objects may run arbitrary guest code that can again call into the interpreter.
      -         */
      -        CApiTransitions.pollReferenceQueue();
               /*
                * Deallocating native storages and objects may run arbitrary guest code. So, we need to
                * ensure that the GIL is held.
                */
               try (GilNode.UncachedAcquire ignored = GilNode.uncachedAcquire()) {
      +            /*
      +             * Polling the native reference queue is the only task we can do here because
      +             * deallocating objects may run arbitrary guest code that can again call into the
      +             * interpreter.
      +             */
      +            pollReferenceQueue();
      +            PythonThreadState threadState = getContext().getThreadState(getContext().getLanguage());
      +            Object nativeThreadState = PThreadState.getNativeThreadState(threadState);
      +            if (nativeThreadState != null) {
      +                PCallCapiFunction.callUncached(NativeCAPISymbol.FUN_PY_GC_COLLECT_NO_FAIL, nativeThreadState);
      +                pollReferenceQueue();
      +            }
                   CApiTransitions.deallocateNativeWeakRefs(getContext());
               }
           }
      @@ -911,7 +1171,18 @@ public void exitCApiContext() {
           @SuppressWarnings("try")
           public void finalizeCApi() {
               CompilerAsserts.neverPartOfCompilation();
      -        HandleContext handleContext = getContext().nativeContext;
      +        PythonContext context = getContext();
      +        HandleContext handleContext = context.nativeContext;
      +        if (backgroundGCTaskThread != null && backgroundGCTaskThread.isAlive()) {
      +            context.killSystemThread(backgroundGCTaskThread);
      +            try {
      +                backgroundGCTaskThread.join(10);
      +            } catch (InterruptedException e) {
      +                LOGGER.finest("got interrupt while joining GC thread before cleaning up C API state");
      +            }
      +            backgroundGCTaskThread = null;
      +        }
      +
               /*
                * Disable reference queue polling because during finalization, we will free any known
                * allocated resources (e.g. native object stubs). Calling
      @@ -954,17 +1225,22 @@ public void finalizeCApi() {
                   }
               }
               pyCFunctionWrappers.clear();
      +        freeGCState();
               /*
                * If the static symbol cache is not null, then it is guaranteed that this context instance
                * was the exclusive user of it. We can now reset the state such that other contexts created
                * after this can use it.
                */
               synchronized (CApiContext.class) {
      -            if (CApiContext.nativeSymbolCacheSingleContext != null) {
      -                CApiContext.nativeSymbolCacheSingleContext = null;
      -                CApiContext.nativeSymbolCacheSingleContextUsed = false;
      +            if (nativeSymbolCacheSingleContext != null) {
      +                nativeSymbolCacheSingleContext = null;
      +                nativeSymbolCacheSingleContextUsed = false;
                   }
               }
      +
      +        if (nativeLibraryLocator != null) {
      +            nativeLibraryLocator.close();
      +        }
           }
       
           @TruffleBoundary
      @@ -1007,7 +1283,7 @@ public Object initCApiModule(Node location, Object sharedLibrary, TruffleString
                    */
                   Object clazz = GetClassNode.executeUncached(result);
                   if (clazz == PNone.NO_VALUE) {
      -                throw PRaiseNode.raiseUncached(location, PythonBuiltinClassType.SystemError, ErrorMessages.INIT_FUNC_RETURNED_UNINT_OBJ, initFuncName);
      +                throw PRaiseNode.raiseStatic(location, PythonBuiltinClassType.SystemError, ErrorMessages.INIT_FUNC_RETURNED_UNINT_OBJ, initFuncName);
                   }
       
                   return CreateModuleNodeGen.getUncached().execute(cApiContext, spec, result, sharedLibrary);
      @@ -1142,13 +1418,13 @@ private static boolean isAvailable(CApiBuiltinExecutable builtin) {
                   if (cApiContext == null) {
                       return false;
                   }
      -            Object llvmLibrary = cApiContext.getLLVMLibrary();
      -            InteropLibrary lib = InteropLibrary.getUncached(llvmLibrary);
      -            if (!lib.isMemberReadable(llvmLibrary, builtin.name())) {
      +            Object library = cApiContext.getLibrary();
      +            InteropLibrary lib = InteropLibrary.getUncached(library);
      +            if (!lib.isMemberReadable(library, builtin.name())) {
                       return false;
                   }
                   try {
      -                lib.readMember(llvmLibrary, builtin.name());
      +                lib.readMember(library, builtin.name());
                       return true;
                   } catch (UnsupportedMessageException e) {
                       throw CompilerDirectives.shouldNotReachHere(e);
      @@ -1208,28 +1484,6 @@ public long registerClosure(String nfiSignature, Object executable, Object deleg
               return pointer;
           }
       
      -    /**
      -     * A cache for the wrappers of type slot methods. The key is a weak reference to the owner class
      -     * and the value is a table of wrappers. In order to ensure pointer identity, it is important
      -     * that we use the same wrapper instance as long as the class exists (and the slot wasn't
      -     * updated). Also, the key's type is {@link PythonManagedClass} such that any
      -     * {@link PythonBuiltinClassType} must be resolved, and we do not accidentally have two
      -     * different entries for the same built-in class.
      -     */
      -    private final WeakIdentityHashMap procWrappers = new WeakIdentityHashMap<>();
      -
      -    @TruffleBoundary
      -    public Object getOrCreateProcWrapper(PythonManagedClass owner, SlotMethodDef slot, Supplier supplier) {
      -        PyProcsWrapper[] slotWrappers = procWrappers.computeIfAbsent(owner, key -> new PyProcsWrapper[SlotMethodDef.values().length]);
      -        int idx = slot.ordinal();
      -        PyProcsWrapper wrapper = slotWrappers[idx];
      -        if (wrapper == null) {
      -            wrapper = supplier.get();
      -            slotWrappers[idx] = wrapper;
      -        }
      -        return wrapper;
      -    }
      -
           @TruffleBoundary
           public Object getOrAllocateNativePyMethodDef(PyMethodDefHelper pyMethodDef) {
               Object pyMethodDefPointer = methodDefinitions.computeIfAbsent(pyMethodDef, PyMethodDefHelper::allocate);
      @@ -1238,22 +1492,16 @@ public Object getOrAllocateNativePyMethodDef(PyMethodDefHelper pyMethodDef) {
           }
       
           /**
      -     * A table mapping {@link BuiltinMethodDescriptor} or {@link RootCallTarget} to the appropriate
      -     * {@link PyCFunctionWrapper}. This could actually be shared between Python contexts but
      -     * {@link PyCFunctionWrapper} is still a {@link TruffleObject} and so it is assumed to be
      -     * context-specific although our wrapper doesn't contain any data and is just used for executing
      -     * code.
      +     * A table mapping a {@link RootCallTarget} to the appropriate {@link PyCFunctionWrapper}. This
      +     * could actually be shared between Python contexts but {@link PyCFunctionWrapper} is still a
      +     * {@link TruffleObject} and so it is assumed to be context-specific although our wrapper
      +     * doesn't contain any data and is just used for executing code.
            */
      -    private final ConcurrentHashMap pyCFunctionWrappers = new ConcurrentHashMap<>(4);
      -
      -    @TruffleBoundary
      -    public PyCFunctionWrapper getOrCreatePyCFunctionWrapper(BuiltinMethodDescriptor builtinMethodDescriptor, Function cons) {
      -        return pyCFunctionWrappers.computeIfAbsent(builtinMethodDescriptor, k -> cons.apply((BuiltinMethodDescriptor) k));
      -    }
      +    private final ConcurrentHashMap pyCFunctionWrappers = new ConcurrentHashMap<>(4);
       
           @TruffleBoundary
           public PyCFunctionWrapper getOrCreatePyCFunctionWrapper(RootCallTarget ct, Function cons) {
      -        return pyCFunctionWrappers.computeIfAbsent(ct, k -> cons.apply((RootCallTarget) k));
      +        return pyCFunctionWrappers.computeIfAbsent(ct, cons);
           }
       
           public static boolean isPointerObject(Object object) {
      diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiFunction.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiFunction.java
      index c73b30f9b9..39b5d321d9 100644
      --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiFunction.java
      +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiFunction.java
      @@ -1,5 +1,5 @@
       /*
      - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
      + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved.
        * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        *
        * The Universal Permissive License (UPL), Version 1.0
      @@ -107,6 +107,7 @@
       import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PY_UNICODE_PTR;
       import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Pointer;
       import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PrimitiveResult32;
      +import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PrimitiveResult64;
       import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyCodeAddressRange;
       import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyCodeObject;
       import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyFrameObject;
      @@ -183,7 +184,7 @@
       public final class CApiFunction {
       
           /*
      -     * Functions that are implemented as C code that can be executed both in native and in Sulong:
      +     * Functions that are implemented as C code that can be executed in native
            */
           @CApiBuiltin(name = "PyGILState_Check", ret = Int, args = {}, acquireGil = false, call = CImpl)
           @CApiBuiltin(name = "PyArg_Parse", ret = Int, args = {PyObject, ConstCharPtrAsTruffleString, VARARGS}, call = CImpl)
      @@ -283,6 +284,10 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PyFloat_Unpack2", ret = Double, args = {ConstCharPtrAsTruffleString, Int}, call = CImpl)
           @CApiBuiltin(name = "PyFloat_Unpack4", ret = Double, args = {ConstCharPtrAsTruffleString, Int}, call = CImpl)
           @CApiBuiltin(name = "PyFloat_Unpack8", ret = Double, args = {ConstCharPtrAsTruffleString, Int}, call = CImpl)
      +    @CApiBuiltin(name = "PyGC_Collect", ret = Py_ssize_t, args = {}, call = CImpl)
      +    @CApiBuiltin(name = "PyGC_Disable", ret = Int, args = {}, call = CImpl)
      +    @CApiBuiltin(name = "PyGC_Enable", ret = Int, args = {}, call = CImpl)
      +    @CApiBuiltin(name = "PyGC_IsEnabled", ret = Int, args = {}, call = CImpl)
           @CApiBuiltin(name = "PyGILState_Ensure", ret = PY_GIL_STATE_STATE, args = {}, acquireGil = false, call = CImpl)
           @CApiBuiltin(name = "PyGILState_GetThisThreadState", ret = PyThreadState, args = {}, call = CImpl)
           @CApiBuiltin(name = "PyGILState_Release", ret = Void, args = {PY_GIL_STATE_STATE}, acquireGil = false, call = CImpl)
      @@ -291,6 +296,7 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PyImport_AddModule", ret = PyObject, args = {ConstCharPtrAsTruffleString}, call = CImpl)
           @CApiBuiltin(name = "PyImport_AddModuleObject", ret = PyObject, args = {PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyImport_ImportModuleLevel", ret = PyObject, args = {ConstCharPtrAsTruffleString, PyObject, PyObject, PyObject, Int}, call = CImpl)
      +    @CApiBuiltin(name = "PyIndex_Check", ret = Int, args = {PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyInstanceMethod_Function", ret = PyObject, args = {PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyInterpreterState_GetDict", ret = PyObject, args = {PyInterpreterState}, call = CImpl)
           @CApiBuiltin(name = "PyInterpreterState_GetID", ret = INT64_T, args = {PyInterpreterState}, call = CImpl)
      @@ -316,7 +322,10 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PyLong_FromVoidPtr", ret = PyObject, args = {Pointer}, call = CImpl)
           @CApiBuiltin(name = "PyMapping_Check", ret = Int, args = {PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyMapping_GetItemString", ret = PyObject, args = {PyObject, ConstCharPtrAsTruffleString}, call = CImpl)
      +    @CApiBuiltin(name = "PyMapping_HasKey", ret = Int, args = {PyObject, PyObject}, call = CImpl)
      +    @CApiBuiltin(name = "PyMapping_HasKeyString", ret = Int, args = {PyObject, ConstCharPtrAsTruffleString}, call = CImpl)
           @CApiBuiltin(name = "PyMapping_Length", ret = Py_ssize_t, args = {PyObject}, call = CImpl)
      +    @CApiBuiltin(name = "PyMapping_SetItemString", ret = Int, args = {PyObject, ConstCharPtrAsTruffleString, PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyMapping_Size", ret = Py_ssize_t, args = {PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyMem_Calloc", ret = Pointer, args = {SIZE_T, SIZE_T}, call = CImpl)
           @CApiBuiltin(name = "PyMem_Free", ret = Void, args = {Pointer}, call = CImpl)
      @@ -337,13 +346,19 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PyModule_AddStringConstant", ret = Int, args = {PyObject, ConstCharPtrAsTruffleString, ConstCharPtrAsTruffleString}, call = CImpl)
           @CApiBuiltin(name = "PyModule_AddType", ret = Int, args = {PyObject, PyTypeObject}, call = CImpl)
           @CApiBuiltin(name = "PyModule_Create2", ret = PyObject, args = {PYMODULEDEF_PTR, Int}, call = CImpl)
      +    @CApiBuiltin(name = "PyModule_FromDefAndSpec2", ret = PyObject, args = {PyModuleDef, PyObject, Int}, call = CImpl)
      +    @CApiBuiltin(name = "PyModule_ExecDef", ret = Int, args = {PyObject, PyModuleDef}, call = CImpl)
           @CApiBuiltin(name = "PyModule_GetDef", ret = PyModuleDef, args = {PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyModule_GetDict", ret = PyObject, args = {PyObject}, call = CImpl)
      +    @CApiBuiltin(name = "PyModule_GetFilename", ret = ConstCharPtrAsTruffleString, args = {PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyModule_GetName", ret = ConstCharPtrAsTruffleString, args = {PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyModule_GetState", ret = Pointer, args = {PyObject}, call = CImpl)
      +    @CApiBuiltin(name = "PyNumber_Absolute", ret = PyObject, args = {PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyNumber_Add", ret = PyObject, args = {PyObject, PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyNumber_And", ret = PyObject, args = {PyObject, PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyNumber_AsSsize_t", ret = Py_ssize_t, args = {PyObject, PyObject}, call = CImpl)
      +    @CApiBuiltin(name = "PyNumber_Check", ret = Int, args = {PyObject}, call = CImpl)
      +    @CApiBuiltin(name = "PyNumber_Divmod", ret = PyObject, args = {PyObject, PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyNumber_FloorDivide", ret = PyObject, args = {PyObject, PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyNumber_InPlaceAdd", ret = PyObject, args = {PyObject, PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyNumber_InPlaceAnd", ret = PyObject, args = {PyObject, PyObject}, call = CImpl)
      @@ -352,6 +367,7 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PyNumber_InPlaceMatrixMultiply", ret = PyObject, args = {PyObject, PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyNumber_InPlaceMultiply", ret = PyObject, args = {PyObject, PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyNumber_InPlaceOr", ret = PyObject, args = {PyObject, PyObject}, call = CImpl)
      +    @CApiBuiltin(name = "PyNumber_InPlacePower", ret = PyObject, args = {PyObject, PyObject, PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyNumber_InPlaceRemainder", ret = PyObject, args = {PyObject, PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyNumber_InPlaceRshift", ret = PyObject, args = {PyObject, PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyNumber_InPlaceSubtract", ret = PyObject, args = {PyObject, PyObject}, call = CImpl)
      @@ -364,6 +380,7 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PyNumber_Negative", ret = PyObject, args = {PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyNumber_Or", ret = PyObject, args = {PyObject, PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyNumber_Positive", ret = PyObject, args = {PyObject}, call = CImpl)
      +    @CApiBuiltin(name = "PyNumber_Power", ret = PyObject, args = {PyObject, PyObject, PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyNumber_Remainder", ret = PyObject, args = {PyObject, PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyNumber_Rshift", ret = PyObject, args = {PyObject, PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyNumber_Subtract", ret = PyObject, args = {PyObject, PyObject}, call = CImpl)
      @@ -378,6 +395,7 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PyOS_strtoul", ret = UNSIGNED_LONG, args = {ConstCharPtrAsTruffleString, CHAR_PTR_LIST, Int}, call = CImpl)
           @CApiBuiltin(name = "PyOS_vsnprintf", ret = Int, args = {CHAR_PTR, SIZE_T, ConstCharPtrAsTruffleString, VA_LIST}, call = CImpl)
           @CApiBuiltin(name = "PyObject_Call", ret = PyObject, args = {PyObject, PyObject, PyObject}, call = CImpl)
      +    @CApiBuiltin(name = "PyObject_Calloc", ret = Pointer, args = {SIZE_T, SIZE_T}, call = CImpl)
           @CApiBuiltin(name = "PyObject_CallFunction", ret = PyObject, args = {PyObject, ConstCharPtrAsTruffleString, VARARGS}, call = CImpl)
           @CApiBuiltin(name = "PyObject_CallFunctionObjArgs", ret = PyObject, args = {PyObject, VARARGS}, call = CImpl)
           @CApiBuiltin(name = "PyObject_CallMethod", ret = PyObject, args = {PyObject, ConstCharPtrAsTruffleString, ConstCharPtrAsTruffleString, VARARGS}, call = CImpl)
      @@ -393,6 +411,8 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PyObject_CopyData", ret = Int, args = {PyObject, PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyObject_Free", ret = Void, args = {Pointer}, call = CImpl)
           @CApiBuiltin(name = "PyObject_GC_Del", ret = Void, args = {Pointer}, call = CImpl)
      +    @CApiBuiltin(name = "PyObject_GC_IsFinalized", ret = Int, args = {PyObject}, call = CImpl)
      +    @CApiBuiltin(name = "PyObject_GC_IsTracked", ret = Int, args = {PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyObject_GC_Track", ret = Void, args = {Pointer}, call = CImpl)
           @CApiBuiltin(name = "PyObject_GC_UnTrack", ret = Void, args = {Pointer}, call = CImpl)
           @CApiBuiltin(name = "PyObject_GenericGetAttr", ret = PyObjectTransfer, args = {PyObject, PyObject}, call = CImpl)
      @@ -404,6 +424,7 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PyObject_GetBuffer", ret = Int, args = {PyObject, PY_BUFFER_PTR, Int}, call = CImpl)
           @CApiBuiltin(name = "PyObject_Init", ret = PyObject, args = {PyObject, PyTypeObject}, call = CImpl)
           @CApiBuiltin(name = "PyObject_InitVar", ret = PyVarObject, args = {PyVarObject, PyTypeObject, Py_ssize_t}, call = CImpl)
      +    @CApiBuiltin(name = "PyObject_IS_GC", ret = Int, args = {PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyObject_Malloc", ret = Pointer, args = {SIZE_T}, call = CImpl)
           @CApiBuiltin(name = "PyObject_Not", ret = Int, args = {PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyObject_Print", ret = Int, args = {PyObject, FILE_PTR, Int}, call = CImpl)
      @@ -441,6 +462,10 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PyStructSequence_NewType", ret = PyTypeObject, args = {PY_STRUCT_SEQUENCE_DESC}, call = CImpl)
           @CApiBuiltin(name = "PyStructSequence_SetItem", ret = Void, args = {PyObject, Py_ssize_t, PyObject}, call = CImpl)
           @CApiBuiltin(name = "PySys_Audit", ret = Int, args = {ConstCharPtrAsTruffleString, ConstCharPtrAsTruffleString, VARARGS}, call = CImpl)
      +    @CApiBuiltin(name = "PySys_FormatStderr", ret = Void, args = {ConstCharPtrAsTruffleString, VARARGS}, call = CImpl)
      +    @CApiBuiltin(name = "PySys_FormatStdout", ret = Void, args = {ConstCharPtrAsTruffleString, VARARGS}, call = CImpl)
      +    @CApiBuiltin(name = "PySys_WriteStderr", ret = Void, args = {ConstCharPtrAsTruffleString, VARARGS}, call = CImpl)
      +    @CApiBuiltin(name = "PySys_WriteStdout", ret = Void, args = {ConstCharPtrAsTruffleString, VARARGS}, call = CImpl)
           @CApiBuiltin(name = "PyThreadState_Clear", ret = Void, args = {PyThreadState}, call = CImpl)
           @CApiBuiltin(name = "PyThreadState_DeleteCurrent", ret = Void, args = {}, call = CImpl)
           @CApiBuiltin(name = "PyThreadState_Get", ret = PyThreadState, args = {}, call = CImpl)
      @@ -452,6 +477,8 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PyThread_tss_get", ret = Pointer, args = {PY_TSS_T_PTR}, call = CImpl)
           @CApiBuiltin(name = "PyThread_tss_is_created", ret = Int, args = {PY_TSS_T_PTR}, call = CImpl)
           @CApiBuiltin(name = "PyThread_tss_set", ret = Int, args = {PY_TSS_T_PTR, Pointer}, call = CImpl)
      +    @CApiBuiltin(name = "PyTraceMalloc_Track", ret = Int, args = {UNSIGNED_INT, UINTPTR_T, SIZE_T}, call = CImpl)
      +    @CApiBuiltin(name = "PyTraceMalloc_Untrack", ret = Int, args = {UNSIGNED_INT, UINTPTR_T}, call = CImpl)
           @CApiBuiltin(name = "PyTuple_Pack", ret = PyObject, args = {Py_ssize_t, VARARGS}, call = CImpl)
           @CApiBuiltin(name = "PyTuple_GetItem", ret = PyObjectBorrowed, args = {PyObject, Py_ssize_t}, call = CImpl)
           @CApiBuiltin(name = "PyTuple_SetItem", ret = Int, args = {PyObject, Py_ssize_t, PyObjectTransfer}, call = CImpl)
      @@ -468,7 +495,6 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PyType_GetQualName", ret = PyObject, args = {PyTypeObject}, call = CImpl)
           @CApiBuiltin(name = "PyType_GetSlot", ret = Pointer, args = {PyTypeObject, Int}, call = CImpl)
           @CApiBuiltin(name = "PyType_IsSubtype", ret = Int, args = {PyTypeObject, PyTypeObject}, call = CImpl)
      -    @CApiBuiltin(name = "PyType_Modified", ret = Void, args = {PyTypeObject}, call = CImpl)
           @CApiBuiltin(name = "PyType_Ready", ret = Int, args = {PyTypeObject}, call = CImpl)
           @CApiBuiltin(name = "PyUnicode_Append", ret = Void, args = {PyObjectPtr, PyObject}, call = CImpl)
           @CApiBuiltin(name = "PyUnicode_AppendAndDel", ret = Void, args = {PyObjectPtr, PyObject}, call = CImpl)
      @@ -490,6 +516,7 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PyUnicode_DecodeLatin1", ret = PyObject, args = {ConstCharPtrAsTruffleString, Py_ssize_t, ConstCharPtrAsTruffleString}, call = CImpl)
           @CApiBuiltin(name = "PyUnicode_DecodeLocale", ret = PyObject, args = {ConstCharPtrAsTruffleString, ConstCharPtrAsTruffleString}, call = CImpl)
           @CApiBuiltin(name = "PyUnicode_DecodeLocaleAndSize", ret = PyObject, args = {ConstCharPtrAsTruffleString, Py_ssize_t, ConstCharPtrAsTruffleString}, call = CImpl)
      +    @CApiBuiltin(name = "PyUnicode_DecodeRawUnicodeEscape", ret = PyObject, args = {ConstCharPtrAsTruffleString, Py_ssize_t, ConstCharPtrAsTruffleString}, call = CImpl)
           @CApiBuiltin(name = "PyUnicode_DecodeUTF16", ret = PyObject, args = {ConstCharPtrAsTruffleString, Py_ssize_t, ConstCharPtrAsTruffleString, INT_LIST}, call = CImpl)
           @CApiBuiltin(name = "PyUnicode_DecodeUTF16Stateful", ret = PyObject, args = {ConstCharPtrAsTruffleString, Py_ssize_t, ConstCharPtrAsTruffleString, INT_LIST, PY_SSIZE_T_PTR}, call = CImpl)
           @CApiBuiltin(name = "PyUnicode_DecodeUTF32", ret = PyObject, args = {ConstCharPtrAsTruffleString, Py_ssize_t, ConstCharPtrAsTruffleString, INT_LIST}, call = CImpl)
      @@ -557,6 +584,7 @@ public final class CApiFunction {
           @CApiBuiltin(name = "_PyDict_GetItemIdWithError", ret = PyObject, args = {PyObject, _PY_IDENTIFIER_PTR}, call = CImpl)
           @CApiBuiltin(name = "_PyDict_GetItemStringWithError", ret = PyObject, args = {PyObject, ConstCharPtrAsTruffleString}, call = CImpl)
           @CApiBuiltin(name = "_PyDict_GetItem_KnownHash", ret = PyObject, args = {PyObject, PyObject, Py_hash_t}, call = CImpl)
      +    @CApiBuiltin(name = "_PyDict_MaybeUntrack", ret = Void, args = {PyObject}, call = CImpl)
           @CApiBuiltin(name = "_PyDict_NewPresized", ret = PyObject, args = {Py_ssize_t}, call = CImpl)
           @CApiBuiltin(name = "_PyDict_SetItemId", ret = Int, args = {PyObject, _PY_IDENTIFIER_PTR, PyObject}, call = CImpl)
           @CApiBuiltin(name = "_PyErr_BadInternalCall", ret = Void, args = {ConstCharPtr, PrimitiveResult32}, call = CImpl)
      @@ -574,16 +602,21 @@ public final class CApiFunction {
           @CApiBuiltin(name = "_PyLong_UnsignedLong_Converter", ret = Int, args = {PyObject, Pointer}, call = CImpl)
           @CApiBuiltin(name = "_PyModule_Add", ret = Int, args = {PyObject, ConstCharPtrAsTruffleString, PyObject}, call = CImpl)
           @CApiBuiltin(name = "_PyModule_CreateInitialized", ret = PyObject, args = {PYMODULEDEF_PTR, Int}, call = CImpl)
      +    @CApiBuiltin(name = "_PyObject_AssertFailed", ret = VoidNoReturn, args = {PyObject, ConstCharPtrAsTruffleString, ConstCharPtrAsTruffleString, ConstCharPtrAsTruffleString, Int,
      +                    ConstCharPtrAsTruffleString}, call = CImpl)
           @CApiBuiltin(name = "_PyObject_CallFunction_SizeT", ret = PyObject, args = {PyObject, ConstCharPtrAsTruffleString, VARARGS}, call = CImpl)
           @CApiBuiltin(name = "_PyObject_CallMethodIdObjArgs", ret = PyObject, args = {PyObject, _PY_IDENTIFIER_PTR, VARARGS}, call = CImpl)
           @CApiBuiltin(name = "_PyObject_CallMethodIdObjArgs", ret = PyObject, args = {PyObject, _PY_IDENTIFIER_PTR, VARARGS}, call = CImpl)
           @CApiBuiltin(name = "_PyObject_CallMethod_SizeT", ret = PyObject, args = {PyObject, ConstCharPtrAsTruffleString, ConstCharPtrAsTruffleString, VARARGS}, call = CImpl)
      +    @CApiBuiltin(name = "_PyObject_Dump", ret = Void, args = {PyObject}, call = CImpl)
           @CApiBuiltin(name = "_PyObject_FastCall", ret = PyObject, args = {PyObject, PyObjectConstPtr, Py_ssize_t}, call = CImpl)
           @CApiBuiltin(name = "_PyObject_GC_New", ret = PyObject, args = {PyTypeObject}, call = CImpl)
           @CApiBuiltin(name = "_PyObject_GC_NewVar", ret = PyVarObject, args = {PyTypeObject, Py_ssize_t}, call = CImpl)
      +    @CApiBuiltin(name = "_PyObject_GC_Resize", ret = PyVarObject, args = {PyVarObject, Py_ssize_t}, call = CImpl)
           @CApiBuiltin(name = "_PyObject_GetAttrId", ret = PyObject, args = {PyObject, _PY_IDENTIFIER_PTR}, call = CImpl)
           @CApiBuiltin(name = "_PyObject_GetDictPtr", ret = PyObjectPtr, args = {PyObject}, call = CImpl)
           @CApiBuiltin(name = "_PyObject_GetMethod", ret = Int, args = {PyObject, PyObject, PyObjectPtr}, call = CImpl)
      +    @CApiBuiltin(name = "_PyObject_IsFreed", ret = Int, args = {PyObject}, call = CImpl)
           @CApiBuiltin(name = "_PyObject_LookupAttr", ret = Int, args = {PyObject, PyObject, PyObjectPtr}, call = CImpl)
           @CApiBuiltin(name = "_PyObject_LookupAttrId", ret = Int, args = {PyObject, _PY_IDENTIFIER_PTR, PyObjectPtr}, call = CImpl)
           @CApiBuiltin(name = "_PyObject_New", ret = PyObject, args = {PyTypeObject}, call = CImpl)
      @@ -592,6 +625,11 @@ public final class CApiFunction {
           @CApiBuiltin(name = "_PyObject_SetAttrId", ret = Int, args = {PyObject, _PY_IDENTIFIER_PTR, PyObject}, call = CImpl)
           @CApiBuiltin(name = "_PySet_NextEntry", ret = Int, args = {PyObject, PY_SSIZE_T_PTR, PyObjectPtr, PY_HASH_T_PTR}, call = CImpl)
           @CApiBuiltin(name = "_PyThreadState_UncheckedGet", ret = PyThreadState, args = {}, call = CImpl)
      +    @CApiBuiltin(name = "_PyTrash_begin", ret = Int, args = {PyThreadState, PyObject}, call = CImpl)
      +    @CApiBuiltin(name = "_PyTrash_cond", ret = Int, args = {PyObject, destructor}, call = CImpl)
      +    @CApiBuiltin(name = "_PyTrash_end", ret = Void, args = {PyThreadState}, call = CImpl)
      +    @CApiBuiltin(name = "_PyTuple_MaybeUntrack", ret = Void, args = {PyObject}, call = CImpl)
      +    @CApiBuiltin(name = "_PyTuple_Resize", ret = Int, args = {PyObjectPtr, Py_ssize_t}, call = CImpl)
           @CApiBuiltin(name = "_PyType_Name", ret = ConstCharPtrAsTruffleString, args = {PyTypeObject}, call = CImpl)
           @CApiBuiltin(name = "_PyUnicode_EqualToASCIIId", ret = Int, args = {PyObject, PY_IDENTIFIER}, call = CImpl)
           @CApiBuiltin(name = "_PyUnicode_FromId", ret = PyObject, args = {PY_IDENTIFIER}, call = CImpl)
      @@ -621,6 +659,7 @@ public final class CApiFunction {
           @CApiBuiltin(name = "_PyUnicode_ToUpperFull", ret = Int, args = {PY_UCS4, PY_UCS4_PTR}, call = CImpl)
           @CApiBuiltin(name = "_PyUnicode_ToUppercase", ret = PY_UCS4, args = {PY_UCS4}, call = CImpl)
           @CApiBuiltin(name = "_Py_BuildValue_SizeT", ret = PyObject, args = {ConstCharPtrAsTruffleString, VARARGS}, call = CImpl)
      +    @CApiBuiltin(name = "_Py_BreakPoint", ret = Void, args = {}, call = CImpl)
           @CApiBuiltin(name = "_Py_CheckFunctionResult", ret = PyObject, args = {PyThreadState, PyObject, PyObject, ConstCharPtrAsTruffleString}, call = CImpl)
           @CApiBuiltin(name = "_Py_Dealloc", ret = Void, args = {PyObject}, call = CImpl)
           @CApiBuiltin(name = "_Py_DecRef", ret = Void, args = {PyObject}, call = CImpl)
      @@ -752,10 +791,6 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PyFunction_SetClosure", ret = Int, args = {PyObject, PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "PyFunction_SetDefaults", ret = Int, args = {PyObject, PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "PyFunction_SetKwDefaults", ret = Int, args = {PyObject, PyObject}, call = NotImplemented)
      -    @CApiBuiltin(name = "PyGC_Collect", ret = Py_ssize_t, args = {}, call = NotImplemented)
      -    @CApiBuiltin(name = "PyGC_Disable", ret = Int, args = {}, call = NotImplemented)
      -    @CApiBuiltin(name = "PyGC_Enable", ret = Int, args = {}, call = NotImplemented)
      -    @CApiBuiltin(name = "PyGC_IsEnabled", ret = Int, args = {}, call = NotImplemented)
           @CApiBuiltin(name = "PyHash_GetFuncDef", ret = PYHASH_FUNCDEF_PTR, args = {}, call = Ignored, comment = "removed from our pyhash.h")
           @CApiBuiltin(name = "PyImport_AppendInittab", ret = Int, args = {ConstCharPtr, func_objvoid}, call = NotImplemented)
           @CApiBuiltin(name = "PyImport_ExecCodeModule", ret = PyObject, args = {ConstCharPtrAsTruffleString, PyObject}, call = NotImplemented)
      @@ -781,18 +816,19 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PyInterpreterState_Next", ret = PyInterpreterState, args = {PyInterpreterState}, call = NotImplemented)
           @CApiBuiltin(name = "PyInterpreterState_ThreadHead", ret = PyThreadState, args = {PyInterpreterState}, call = NotImplemented)
           @CApiBuiltin(name = "PyLong_GetInfo", ret = PyObject, args = {}, call = NotImplemented)
      -    @CApiBuiltin(name = "PyMapping_HasKey", ret = Int, args = {PyObject, PyObject}, call = NotImplemented)
      -    @CApiBuiltin(name = "PyMapping_HasKeyString", ret = Int, args = {PyObject, ConstCharPtrAsTruffleString}, call = NotImplemented)
      -    @CApiBuiltin(name = "PyMapping_SetItemString", ret = Int, args = {PyObject, ConstCharPtrAsTruffleString, PyObject}, call = NotImplemented)
      +    @CApiBuiltin(name = "PyMarshal_ReadLastObjectFromFile", ret = PyObject, args = {FILE_PTR}, call = NotImplemented)
      +    @CApiBuiltin(name = "PyMarshal_ReadLongFromFile", ret = PrimitiveResult64, args = {FILE_PTR}, call = NotImplemented)
      +    @CApiBuiltin(name = "PyMarshal_ReadObjectFromFile", ret = PyObject, args = {FILE_PTR}, call = NotImplemented)
      +    @CApiBuiltin(name = "PyMarshal_ReadObjectFromString", ret = PyObject, args = {ConstCharPtr, Py_ssize_t}, call = NotImplemented)
      +    @CApiBuiltin(name = "PyMarshal_ReadShortFromFile", ret = PrimitiveResult32, args = {FILE_PTR}, call = NotImplemented)
      +    @CApiBuiltin(name = "PyMarshal_WriteLongToFile", ret = Void, args = {PrimitiveResult64, FILE_PTR, PrimitiveResult32}, call = NotImplemented)
      +    @CApiBuiltin(name = "PyMarshal_WriteObjectToFile", ret = Void, args = {PyObject, FILE_PTR, PrimitiveResult32}, call = NotImplemented)
      +    @CApiBuiltin(name = "PyMarshal_WriteObjectToString", ret = PyObject, args = {PyObject, PrimitiveResult32}, call = NotImplemented)
           @CApiBuiltin(name = "PyMem_GetAllocator", ret = Void, args = {PYMEMALLOCATORDOMAIN, PYMEMALLOCATOREX_PTR}, call = NotImplemented)
           @CApiBuiltin(name = "PyMem_SetAllocator", ret = Void, args = {PYMEMALLOCATORDOMAIN, PYMEMALLOCATOREX_PTR}, call = NotImplemented)
           @CApiBuiltin(name = "PyMem_SetupDebugHooks", ret = Void, args = {}, call = NotImplemented)
           @CApiBuiltin(name = "PyMember_GetOne", ret = PyObject, args = {ConstCharPtrAsTruffleString, PyMemberDef}, call = NotImplemented)
           @CApiBuiltin(name = "PyMember_SetOne", ret = Int, args = {CHAR_PTR, PyMemberDef, PyObject}, call = NotImplemented)
      -    @CApiBuiltin(name = "PyModule_ExecDef", ret = Int, args = {PyObject, PyModuleDef}, call = NotImplemented)
      -    @CApiBuiltin(name = "PyModule_FromDefAndSpec2", ret = PyObject, args = {PyModuleDef, PyObject, Int}, call = NotImplemented)
      -    @CApiBuiltin(name = "PyModule_GetFilename", ret = ConstCharPtrAsTruffleString, args = {PyObject}, call = NotImplemented)
      -    @CApiBuiltin(name = "PyModule_GetFilenameObject", ret = PyObject, args = {PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "PyODict_DelItem", ret = Int, args = {PyObject, PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "PyODict_New", ret = PyObject, args = {}, call = NotImplemented)
           @CApiBuiltin(name = "PyODict_SetItem", ret = Int, args = {PyObject, PyObject, PyObject}, call = NotImplemented)
      @@ -806,14 +842,10 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PyOS_setsig", ret = PY_OS_SIGHANDLER, args = {Int, PY_OS_SIGHANDLER}, call = NotImplemented)
           @CApiBuiltin(name = "PyObject_CallFinalizer", ret = Void, args = {PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "PyObject_CallFinalizerFromDealloc", ret = Int, args = {PyObject}, call = NotImplemented)
      -    @CApiBuiltin(name = "PyObject_Calloc", ret = Pointer, args = {SIZE_T, SIZE_T}, call = NotImplemented)
           @CApiBuiltin(name = "PyObject_DelItemString", ret = Int, args = {PyObject, ConstCharPtrAsTruffleString}, call = NotImplemented)
      -    @CApiBuiltin(name = "PyObject_GC_IsFinalized", ret = Int, args = {PyObject}, call = NotImplemented)
      -    @CApiBuiltin(name = "PyObject_GC_IsTracked", ret = Int, args = {PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "PyObject_GET_WEAKREFS_LISTPTR", ret = PyObjectPtr, args = {PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "PyObject_GetAIter", ret = PyObject, args = {PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "PyObject_GetArenaAllocator", ret = Void, args = {PYOBJECTARENAALLOCATOR_PTR}, call = NotImplemented)
      -    @CApiBuiltin(name = "PyObject_IS_GC", ret = Int, args = {PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "PyObject_SetArenaAllocator", ret = Void, args = {PYOBJECTARENAALLOCATOR_PTR}, call = NotImplemented)
           @CApiBuiltin(name = "PyPickleBuffer_FromObject", ret = PyObject, args = {PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "PyPickleBuffer_GetBuffer", ret = CONST_PY_BUFFER, args = {PyObject}, call = NotImplemented)
      @@ -854,8 +886,6 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PySys_AddWarnOption", ret = Void, args = {CONST_WCHAR_PTR}, call = NotImplemented)
           @CApiBuiltin(name = "PySys_AddWarnOptionUnicode", ret = Void, args = {PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "PySys_AddXOption", ret = Void, args = {CONST_WCHAR_PTR}, call = NotImplemented)
      -    @CApiBuiltin(name = "PySys_FormatStderr", ret = Void, args = {ConstCharPtrAsTruffleString, VARARGS}, call = NotImplemented)
      -    @CApiBuiltin(name = "PySys_FormatStdout", ret = Void, args = {ConstCharPtrAsTruffleString, VARARGS}, call = NotImplemented)
           @CApiBuiltin(name = "PySys_GetXOptions", ret = PyObject, args = {}, call = NotImplemented)
           @CApiBuiltin(name = "PySys_HasWarnOptions", ret = Int, args = {}, call = NotImplemented)
           @CApiBuiltin(name = "PySys_ResetWarnOptions", ret = Void, args = {}, call = NotImplemented)
      @@ -863,8 +893,6 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PySys_SetArgvEx", ret = Void, args = {Int, WCHAR_T_PTR_LIST, Int}, call = NotImplemented)
           @CApiBuiltin(name = "PySys_SetObject", ret = Int, args = {ConstCharPtrAsTruffleString, PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "PySys_SetPath", ret = Void, args = {CONST_WCHAR_PTR}, call = NotImplemented)
      -    @CApiBuiltin(name = "PySys_WriteStderr", ret = Void, args = {ConstCharPtrAsTruffleString, VARARGS}, call = NotImplemented)
      -    @CApiBuiltin(name = "PySys_WriteStdout", ret = Void, args = {ConstCharPtrAsTruffleString, VARARGS}, call = NotImplemented)
           @CApiBuiltin(name = "PyThreadState_Delete", ret = Void, args = {PyThreadState}, call = NotImplemented)
           @CApiBuiltin(name = "PyThreadState_EnterTracing", ret = Void, args = {PyThreadState}, call = NotImplemented)
           @CApiBuiltin(name = "PyThreadState_GetID", ret = UINT64_T, args = {PyThreadState}, call = NotImplemented)
      @@ -872,7 +900,6 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PyThreadState_LeaveTracing", ret = Void, args = {PyThreadState}, call = NotImplemented)
           @CApiBuiltin(name = "PyThreadState_New", ret = PyThreadState, args = {PyInterpreterState}, call = NotImplemented)
           @CApiBuiltin(name = "PyThreadState_Next", ret = PyThreadState, args = {PyThreadState}, call = NotImplemented)
      -    @CApiBuiltin(name = "PyThreadState_SetAsyncExc", ret = Int, args = {UNSIGNED_LONG, PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "PyThreadState_Swap", ret = PyThreadState, args = {PyThreadState}, call = NotImplemented)
           @CApiBuiltin(name = "PyThread_GetInfo", ret = PyObject, args = {}, call = NotImplemented)
           @CApiBuiltin(name = "PyThread_ReInitTLS", ret = Void, args = {}, call = NotImplemented)
      @@ -927,11 +954,9 @@ public final class CApiFunction {
           @CApiBuiltin(name = "PyUnicode_BuildEncodingMap", ret = PyObject, args = {PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "PyUnicode_CopyCharacters", ret = Py_ssize_t, args = {PyObject, Py_ssize_t, PyObject, Py_ssize_t, Py_ssize_t}, call = NotImplemented)
           @CApiBuiltin(name = "PyUnicode_DecodeCharmap", ret = PyObject, args = {ConstCharPtrAsTruffleString, Py_ssize_t, PyObject, ConstCharPtrAsTruffleString}, call = NotImplemented)
      -    @CApiBuiltin(name = "PyUnicode_DecodeRawUnicodeEscape", ret = PyObject, args = {ConstCharPtrAsTruffleString, Py_ssize_t, ConstCharPtrAsTruffleString}, call = NotImplemented)
           @CApiBuiltin(name = "PyUnicode_DecodeUTF7", ret = PyObject, args = {ConstCharPtrAsTruffleString, Py_ssize_t, ConstCharPtrAsTruffleString}, call = NotImplemented)
           @CApiBuiltin(name = "PyUnicode_DecodeUTF7Stateful", ret = PyObject, args = {ConstCharPtrAsTruffleString, Py_ssize_t, ConstCharPtrAsTruffleString, PY_SSIZE_T_PTR}, call = NotImplemented)
           @CApiBuiltin(name = "PyUnicode_DecodeUnicodeEscape", ret = PyObject, args = {ConstCharPtrAsTruffleString, Py_ssize_t, ConstCharPtrAsTruffleString}, call = NotImplemented)
      -    @CApiBuiltin(name = "PyUnicode_EncodeLocale", ret = PyObject, args = {PyObject, ConstCharPtrAsTruffleString}, call = NotImplemented)
           @CApiBuiltin(name = "PyUnicode_FSDecoder", ret = Int, args = {PyObject, Pointer}, call = NotImplemented)
           @CApiBuiltin(name = "PyUnicode_Fill", ret = Py_ssize_t, args = {PyObject, Py_ssize_t, Py_ssize_t, PY_UCS4}, call = NotImplemented)
           @CApiBuiltin(name = "PyUnicode_GetDefaultEncoding", ret = ConstCharPtrAsTruffleString, args = {}, call = NotImplemented)
      @@ -1021,7 +1046,6 @@ public final class CApiFunction {
           @CApiBuiltin(name = "_PyDict_DelItem_KnownHash", ret = Int, args = {PyObject, PyObject, Py_hash_t}, call = NotImplemented)
           @CApiBuiltin(name = "_PyDict_GetItemWithError", ret = PyObject, args = {PyObject, PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "_PyDict_HasOnlyStringKeys", ret = Int, args = {PyObject}, call = NotImplemented)
      -    @CApiBuiltin(name = "_PyDict_MaybeUntrack", ret = Void, args = {PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "_PyDict_MergeEx", ret = Int, args = {PyObject, PyObject, Int}, call = NotImplemented)
           @CApiBuiltin(name = "_PyDict_SizeOf", ret = Py_ssize_t, args = {PYDICTOBJECT_PTR}, call = NotImplemented)
           @CApiBuiltin(name = "_PyErr_CheckSignals", ret = Int, args = {}, call = NotImplemented)
      @@ -1070,7 +1094,6 @@ public final class CApiFunction {
           @CApiBuiltin(name = "_PyLong_GCD", ret = PyObject, args = {PyObject, PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "_PyLong_Lshift", ret = PyObject, args = {PyObject, SIZE_T}, call = NotImplemented)
           @CApiBuiltin(name = "_PyLong_New", ret = PyLongObject, args = {Py_ssize_t}, call = NotImplemented)
      -    @CApiBuiltin(name = "_PyLong_NumBits", ret = SIZE_T, args = {PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "_PyLong_Rshift", ret = PyObject, args = {PyObject, SIZE_T}, call = NotImplemented)
           @CApiBuiltin(name = "_PyLong_Size_t_Converter", ret = Int, args = {PyObject, Pointer}, call = NotImplemented)
           @CApiBuiltin(name = "_PyLong_UnsignedInt_Converter", ret = Int, args = {PyObject, Pointer}, call = NotImplemented)
      @@ -1086,8 +1109,6 @@ public final class CApiFunction {
           @CApiBuiltin(name = "_PyOS_IsMainThread", ret = Int, args = {}, call = NotImplemented)
           @CApiBuiltin(name = "_PyOS_URandom", ret = Int, args = {Pointer, Py_ssize_t}, call = NotImplemented)
           @CApiBuiltin(name = "_PyOS_URandomNonblock", ret = Int, args = {Pointer, Py_ssize_t}, call = NotImplemented)
      -    @CApiBuiltin(name = "_PyObject_AssertFailed", ret = VoidNoReturn, args = {PyObject, ConstCharPtrAsTruffleString, ConstCharPtrAsTruffleString, ConstCharPtrAsTruffleString, Int,
      -                    ConstCharPtrAsTruffleString}, call = NotImplemented)
           @CApiBuiltin(name = "_PyObject_CallMethod", ret = PyObject, args = {PyObject, PyObject, ConstCharPtrAsTruffleString, VARARGS}, call = NotImplemented)
           @CApiBuiltin(name = "_PyObject_CallMethodId", ret = PyObject, args = {PyObject, PY_IDENTIFIER, ConstCharPtrAsTruffleString, VARARGS}, call = NotImplemented)
           @CApiBuiltin(name = "_PyObject_CallMethodId_SizeT", ret = PyObject, args = {PyObject, PY_IDENTIFIER, ConstCharPtrAsTruffleString, VARARGS}, call = NotImplemented)
      @@ -1095,14 +1116,12 @@ public final class CApiFunction {
           @CApiBuiltin(name = "_PyObject_CheckCrossInterpreterData", ret = Int, args = {PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "_PyObject_DebugTypeStats", ret = Void, args = {FILE_PTR}, call = NotImplemented)
           @CApiBuiltin(name = "_PyObject_FunctionStr", ret = PyObject, args = {PyObject}, call = NotImplemented)
      -    @CApiBuiltin(name = "_PyObject_GC_Resize", ret = PyVarObject, args = {PyVarObject, Py_ssize_t}, call = NotImplemented)
           @CApiBuiltin(name = "_PyObject_GenericGetAttrWithDict", ret = PyObject, args = {PyObject, PyObject, PyObject, Int}, call = NotImplemented)
           @CApiBuiltin(name = "_PyObject_GenericSetAttrWithDict", ret = Int, args = {PyObject, PyObject, PyObject, PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "_PyObject_GetCrossInterpreterData", ret = Int, args = {PyObject, _PYCROSSINTERPRETERDATA_PTR}, call = NotImplemented)
           @CApiBuiltin(name = "_PyObject_GetState", ret = PyObject, args = {PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "_PyObject_HasLen", ret = Int, args = {PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "_PyObject_IsAbstract", ret = Int, args = {PyObject}, call = NotImplemented)
      -    @CApiBuiltin(name = "_PyObject_IsFreed", ret = Int, args = {PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "_PyObject_LookupSpecialId", ret = PyObject, args = {PyObject, PY_IDENTIFIER}, call = NotImplemented)
           @CApiBuiltin(name = "_PyObject_RealIsInstance", ret = Int, args = {PyObject, PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "_PyObject_RealIsSubclass", ret = Int, args = {PyObject, PyObject}, call = NotImplemented)
      @@ -1153,12 +1172,7 @@ public final class CApiFunction {
           @CApiBuiltin(name = "_PyTime_gmtime", ret = Int, args = {TIME_T, TM_PTR}, call = NotImplemented)
           @CApiBuiltin(name = "_PyTime_localtime", ret = Int, args = {TIME_T, TM_PTR}, call = NotImplemented)
           @CApiBuiltin(name = "_PyTraceMalloc_GetTraceback", ret = PyObject, args = {UNSIGNED_INT, UINTPTR_T}, call = NotImplemented)
      -    @CApiBuiltin(name = "_PyTrash_begin", ret = Int, args = {PyThreadState, PyObject}, call = NotImplemented)
      -    @CApiBuiltin(name = "_PyTrash_cond", ret = Int, args = {PyObject, destructor}, call = NotImplemented)
      -    @CApiBuiltin(name = "_PyTrash_end", ret = Void, args = {PyThreadState}, call = NotImplemented)
           @CApiBuiltin(name = "_PyTuple_DebugMallocStats", ret = Void, args = {FILE_PTR}, call = NotImplemented)
      -    @CApiBuiltin(name = "_PyTuple_MaybeUntrack", ret = Void, args = {PyObject}, call = NotImplemented)
      -    @CApiBuiltin(name = "_PyTuple_Resize", ret = Int, args = {PyObjectPtr, Py_ssize_t}, call = NotImplemented)
           @CApiBuiltin(name = "_PyType_CalculateMetaclass", ret = PyTypeObject, args = {PyTypeObject, PyObject}, call = NotImplemented)
           @CApiBuiltin(name = "_PyType_GetDocFromInternalDoc", ret = PyObject, args = {ConstCharPtrAsTruffleString, ConstCharPtrAsTruffleString}, call = NotImplemented)
           @CApiBuiltin(name = "_PyType_GetTextSignatureFromInternalDoc", ret = PyObject, args = {ConstCharPtrAsTruffleString, ConstCharPtrAsTruffleString}, call = NotImplemented)
      @@ -1200,9 +1214,7 @@ public final class CApiFunction {
           @CApiBuiltin(name = "_PyUnicode_WideCharString_Converter", ret = Int, args = {PyObject, Pointer}, call = NotImplemented)
           @CApiBuiltin(name = "_PyUnicode_WideCharString_Opt_Converter", ret = Int, args = {PyObject, Pointer}, call = NotImplemented)
           @CApiBuiltin(name = "_PyUnicode_XStrip", ret = PyObject, args = {PyObject, Int, PyObject}, call = NotImplemented)
      -    @CApiBuiltin(name = "_PyWeakref_ClearRef", ret = Void, args = {PYWEAKREFERENCE_PTR}, call = NotImplemented)
           @CApiBuiltin(name = "_PyWeakref_GetWeakrefCount", ret = Py_ssize_t, args = {PYWEAKREFERENCE_PTR}, call = NotImplemented)
      -    @CApiBuiltin(name = "_Py_BreakPoint", ret = Void, args = {}, call = NotImplemented)
           @CApiBuiltin(name = "_Py_CoerceLegacyLocale", ret = Int, args = {Int}, call = NotImplemented)
           @CApiBuiltin(name = "_Py_DisplaySourceLine", ret = Int, args = {PyObject, PyObject, Int, Int, INT_LIST, PyObjectPtr}, call = NotImplemented)
           @CApiBuiltin(name = "_Py_FatalErrorFormat", ret = Void, args = {ConstCharPtr, ConstCharPtr, VARARGS}, call = NotImplemented)
      diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiGCSupport.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiGCSupport.java
      new file mode 100644
      index 0000000000..502d1d2a6c
      --- /dev/null
      +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiGCSupport.java
      @@ -0,0 +1,280 @@
      +/*
      + * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved.
      + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      + *
      + * The Universal Permissive License (UPL), Version 1.0
      + *
      + * Subject to the condition set forth below, permission is hereby granted to any
      + * person obtaining a copy of this software, associated documentation and/or
      + * data (collectively the "Software"), free of charge and under any and all
      + * copyright rights in the Software, and any and all patent rights owned or
      + * freely licensable by each licensor hereunder covering either (i) the
      + * unmodified Software as contributed to or provided by such licensor, or (ii)
      + * the Larger Works (as defined below), to deal in both
      + *
      + * (a) the Software, and
      + *
      + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
      + * one is included with the Software each a "Larger Work" to which the Software
      + * is contributed by such licensors),
      + *
      + * without restriction, including without limitation the rights to copy, create
      + * derivative works of, display, perform, and distribute the Software and make,
      + * use, sell, offer for sale, import, export, have made, and have sold the
      + * Software and the Larger Work(s), and to sublicense the foregoing rights on
      + * either these or other terms.
      + *
      + * This license is subject to the following condition:
      + *
      + * The above copyright notice and either this complete permission notice or at a
      + * minimum a reference to the UPL must be included in all copies or substantial
      + * portions of the Software.
      + *
      + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
      + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
      + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
      + * SOFTWARE.
      + */
      +package com.oracle.graal.python.builtins.objects.cext.capi;
      +
      +import static com.oracle.graal.python.builtins.objects.cext.capi.CApiContext.GC_LOGGER;
      +
      +import java.util.logging.Level;
      +
      +import com.oracle.graal.python.builtins.objects.cext.capi.CApiGCSupportFactory.GCListRemoveNodeGen;
      +import com.oracle.graal.python.builtins.objects.cext.capi.CApiGCSupportFactory.PyObjectGCDelNodeGen;
      +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper;
      +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming;
      +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.HandlePointerConverter;
      +import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.CoerceNativePointerToLongNode;
      +import com.oracle.graal.python.builtins.objects.cext.structs.CFields;
      +import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess;
      +import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess.FreeNode;
      +import com.oracle.graal.python.builtins.objects.cext.structs.CStructs;
      +import com.oracle.graal.python.runtime.PythonContext;
      +import com.oracle.graal.python.util.PythonUtils;
      +import com.oracle.truffle.api.dsl.Cached;
      +import com.oracle.truffle.api.dsl.GenerateCached;
      +import com.oracle.truffle.api.dsl.GenerateInline;
      +import com.oracle.truffle.api.dsl.GenerateUncached;
      +import com.oracle.truffle.api.dsl.Specialization;
      +import com.oracle.truffle.api.nodes.Node;
      +
      +public abstract class CApiGCSupport {
      +    public static final CApiTiming VISIT_TIMING = CApiTiming.create(true, PExternalFunctionWrapper.VISITPROC);
      +
      +    public static final long NEXT_MASK_UNREACHABLE = 1;
      +
      +    /* Bit 0 is set when tp_finalize is called */
      +    private static final long _PyGC_PREV_MASK_FINALIZED = 1;
      +
      +    /* The (N-2) most significant bits contain the real address. */
      +    private static final long _PyGC_PREV_SHIFT = 2;
      +    private static final long _PyGC_PREV_MASK = -1L << _PyGC_PREV_SHIFT;
      +
      +    private CApiGCSupport() {
      +    }
      +
      +    /**
      +     * See macro {@code pycore_gc.h: _PyGCHead_PREV}
      +     */
      +    static long maskPrevValue(long value) {
      +        return value & _PyGC_PREV_MASK;
      +    }
      +
      +    /**
      +     * See macro {@code pycore_gc.h: _PyGCHead_SET_PREV}
      +     */
      +    static long computePrevValue(long curPrevValue, long newValue) {
      +        assert (newValue & ~_PyGC_PREV_MASK) == 0;
      +        return (curPrevValue & ~_PyGC_PREV_MASK) | newValue;
      +    }
      +
      +    /**
      +     * Implements the logic of {@code pycore_object.h: _PyObject_GC_TRACK} without downcalls but
      +     * will additionally also test {@code if (!_PyObject_GC_IS_TRACKED(op))}.
      +     */
      +    @GenerateInline
      +    @GenerateUncached
      +    @GenerateCached(false)
      +    public abstract static class PyObjectGCTrackNode extends Node {
      +
      +        public abstract void execute(Node inliningTarget, long gc);
      +
      +        @Specialization
      +        static void doGeneric(Node inliningTarget, long gc,
      +                        @Cached CoerceNativePointerToLongNode coerceToLongNode,
      +                        @Cached(inline = false) CStructAccess.ReadPointerNode readPointerNode,
      +                        @Cached(inline = false) CStructAccess.ReadI64Node readI64Node,
      +                        @Cached(inline = false) CStructAccess.WriteLongNode writeLongNode) {
      +
      +            long gcUntagged = HandlePointerConverter.pointerToStub(gc);
      +            // #define _PyObject_GC_IS_TRACKED(o) (_PyGCHead_UNTAG(_Py_AS_GC(o))->_gc_next != 0)
      +            long gcNext = readI64Node.read(gcUntagged, CFields.PyGC_Head___gc_next);
      +            // if (!_PyObject_GC_IS_TRACKED(op))
      +            if (gcNext == 0) {
      +                if (GC_LOGGER.isLoggable(Level.FINER)) {
      +                    GC_LOGGER.finer(PythonUtils.formatJString("tracking GC object 0x%x (op=0x%x)", gc, gc + CStructs.PyGC_Head.size()));
      +                }
      +                // PyGC_Head *generation0 = tstate->gc->generation0;
      +                Object gcState = PythonContext.get(inliningTarget).getCApiContext().getGCState();
      +                assert gcState != null;
      +                long gen0 = coerceToLongNode.execute(inliningTarget, readPointerNode.read(gcState, CFields.GCState__generation0));
      +                assert gen0 != 0;
      +                assert !HandlePointerConverter.pointsToPyHandleSpace(gen0);
      +
      +                // PyGC_Head *last = (PyGC_Head*)(generation0->_gc_prev);
      +                long last = readI64Node.read(gen0, CFields.PyGC_Head___gc_prev);
      +
      +                // _PyGCHead_SET_NEXT(last, gc);
      +                writeLongNode.write(HandlePointerConverter.pointerToStub(last), CFields.PyGC_Head___gc_next, gc);
      +
      +                // _PyGCHead_SET_PREV(gc, last);
      +                long curGcPrev = readI64Node.read(gcUntagged, CFields.PyGC_Head___gc_prev);
      +                writeLongNode.write(gcUntagged, CFields.PyGC_Head___gc_prev, computePrevValue(curGcPrev, last));
      +
      +                // _PyGCHead_SET_NEXT(gc, generation0);
      +                writeLongNode.write(gcUntagged, CFields.PyGC_Head___gc_next, gen0);
      +
      +                // generation0->_gc_prev = (uintptr_t)gc;
      +                writeLongNode.write(gen0, CFields.PyGC_Head___gc_prev, gc);
      +            } else if (GC_LOGGER.isLoggable(Level.FINER)) {
      +                GC_LOGGER.finer(PythonUtils.formatJString("GC object 0x%x (op=0x%x) already tracked", gc, gc + CStructs.PyGC_Head.size()));
      +            }
      +        }
      +    }
      +
      +    /**
      +     * Implements the logic of {@code gcmodule.c: gc_list_remove} without downcalls.
      +     * 

      + * This operation is very similar to {@code pycore_object.h: _PyObject_GC_UNTRACK} with the + * little difference that {@code _PyObject_GC_UNTRACK} will also clear {@code gc->_gc_prev} + * (still rescue the {@code _PyGC_PREV_MASK_FINALIZED} flag) while this operation doesn't touch + * that field at all. + *

      + */ + @GenerateInline + @GenerateUncached + @GenerateCached(false) + public abstract static class GCListRemoveNode extends Node { + + public static long executeUncached(long opUntagged) { + return GCListRemoveNodeGen.getUncached().execute(null, opUntagged); + } + + public abstract long execute(Node inliningTarget, long opUntagged); + + @Specialization + static long doGeneric(long opUntagged, + @Cached(inline = false) CStructAccess.ReadI64Node readI64Node, + @Cached(inline = false) CStructAccess.WriteLongNode writeLongNode) { + // issue a log message before doing the first memory access + if (GC_LOGGER.isLoggable(Level.FINER)) { + GC_LOGGER.finer(PythonUtils.formatJString("attempting to remove 0x%x from GC generation", opUntagged)); + } + + /* + * We expect a real (untagged) pointer here because this operation is usually used in + * conjunction with other operations that already untag pointers before. + */ + assert !HandlePointerConverter.pointsToPyHandleSpace(opUntagged) : "expected real (untagged) pointer"; + + long gcUntagged = opUntagged - CStructs.PyGC_Head.size(); + + /* + * The following implements the section of 'PyObject_GC_Del' that removes the node from + * the GC generation if it was tracked by the GC. + */ + + // #define _PyObject_GC_IS_TRACKED(o) (_PyGCHead_UNTAG(_Py_AS_GC(o))->_gc_next != 0) + long gcNext = readI64Node.read(gcUntagged, CFields.PyGC_Head___gc_next); + // if (_PyObject_GC_IS_TRACKED(op)) + if (gcNext != 0) { + // gc_list_remove + if (GC_LOGGER.isLoggable(Level.FINE)) { + GC_LOGGER.fine(PythonUtils.formatJString("removing 0x%x from GC generation", opUntagged)); + } + + // PyGC_Head *prev = GC_PREV(gc) + long prev = maskPrevValue(readI64Node.read(gcUntagged, CFields.PyGC_Head___gc_prev)); + + // PyGC_Head *next = GC_NEXT(gc) + long next = readI64Node.read(gcUntagged, CFields.PyGC_Head___gc_next); + + // _PyGCHead_SET_NEXT(prev, next) + writeLongNode.write(HandlePointerConverter.pointerToStub(prev), CFields.PyGC_Head___gc_next, next); + + // _PyGCHead_SET_PREV(next, prev) + long curNextPrev = readI64Node.read(HandlePointerConverter.pointerToStub(next), CFields.PyGC_Head___gc_prev); + writeLongNode.write(HandlePointerConverter.pointerToStub(next), CFields.PyGC_Head___gc_prev, computePrevValue(curNextPrev, prev)); + + // UNTAG(gc)->_gc_next = 0 + writeLongNode.write(gcUntagged, CFields.PyGC_Head___gc_next, 0); + } else { + /* + * This is a valid case because objects can manually be untracked or removed from GC + * lists and if then 'GraalPyObject_GC_Del' is called on the native object stub, it + * is checked if that still needs to be done. + */ + if (GC_LOGGER.isLoggable(Level.FINER)) { + GC_LOGGER.finer(PythonUtils.formatJString("removing 0x%x from GC generation skipped; not tracked", opUntagged)); + } + } + return gcUntagged; + } + } + + /** + * Implements the logic of {@code gcmodule.c: PyObject_GC_Del} without downcalls but to be used + * for native object stubs. + */ + @GenerateInline + @GenerateUncached + @GenerateCached(false) + public abstract static class PyObjectGCDelNode extends Node { + + public static void executeUncached(long op) { + PyObjectGCDelNodeGen.getUncached().execute(null, op); + } + + public abstract void execute(Node inliningTarget, long op); + + @Specialization + static void doGeneric(Node inliningTarget, long op, + @Cached GCListRemoveNode gcListRemoveNode, + @Cached(inline = false) CStructAccess.GetElementPtrNode getElementPtrNode, + @Cached(inline = false) CStructAccess.ReadI32Node readI32Node, + @Cached(inline = false) CStructAccess.WriteIntNode writeIntNode) { + if (GC_LOGGER.isLoggable(Level.FINE)) { + GC_LOGGER.fine(PythonUtils.formatJString("releasing native object stub 0x%x", op)); + } + + /* + * We expect a tagged pointer here because otherwise, the native 'PyObject_GC_Del' + * function should be used. + */ + assert HandlePointerConverter.pointsToPyHandleSpace(op) : "expected tagged pointer"; + + long opUntagged = HandlePointerConverter.pointerToStub(op); + long gcUntagged = gcListRemoveNode.execute(inliningTarget, opUntagged); + + // GCState *gcstate = get_gc_state(); + Object gcState = PythonContext.get(inliningTarget).getCApiContext().getGCState(); + assert gcState != null; + // compute start address of embedded array; essentially '&gcstate->generations[0]' + Object generations = getElementPtrNode.getElementPtr(gcState, CFields.GCState__generations); + // if (gcstate->generations[0].count > 0) { + int count = readI32Node.read(generations, CFields.GCGeneration__count); + if (count > 0) { + // gcstate->generations[0].count--; + writeIntNode.write(generations, CFields.GCGeneration__count, count - 1); + } + + // PyObject_Free(((char *)op)-presize) + FreeNode.executeUncached(gcUntagged); + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiMemberAccessNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiMemberAccessNodes.java index ab5b24922a..ead440a621 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiMemberAccessNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiMemberAccessNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -82,11 +82,10 @@ import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.interop.PForeignToPTypeNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils.PrototypeNodeFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; @@ -213,8 +212,6 @@ public abstract static class ReadMemberNode extends PythonUnaryBuiltinNode { @Child private PythonToNativeNode toSulongNode; @Child private CExtAsPythonObjectNode asPythonObjectNode; - @Child private PForeignToPTypeNode fromForeign; - @Child private PRaiseNode raiseNode; @Child private CStructAccess.ReadBaseNode read; @@ -229,13 +226,12 @@ protected ReadMemberNode(int type, int offset, CExtAsPythonObjectNode asPythonOb this.read = getReadNode(type); this.offset = offset; this.asPythonObjectNode = asPythonObjectNode; - if (asPythonObjectNode == null) { - fromForeign = PForeignToPTypeNode.create(); - } } @Specialization - Object doGeneric(@SuppressWarnings("unused") VirtualFrame frame, Object self) { + Object doGeneric(@SuppressWarnings("unused") VirtualFrame frame, Object self, + @Bind("this") Node inliningTarget, + @Cached PRaiseNode raiseNode) { if (read == null) { return PNone.NONE; } else { @@ -243,7 +239,7 @@ Object doGeneric(@SuppressWarnings("unused") VirtualFrame frame, Object self) { assert !(nativeResult instanceof Byte || nativeResult instanceof Short || nativeResult instanceof Float || nativeResult instanceof Character || nativeResult instanceof PException || nativeResult instanceof String) : nativeResult + " " + nativeResult.getClass(); if (type == T_OBJECT_EX && nativeResult == PNone.NO_VALUE) { - throw ensureRaiseNode().raise(PythonBuiltinClassType.AttributeError); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.AttributeError); } if (type == T_OBJECT && nativeResult == PNone.NO_VALUE) { nativeResult = PNone.NONE; @@ -264,14 +260,6 @@ private PythonToNativeNode ensureToSulongNode() { return toSulongNode; } - private PRaiseNode ensureRaiseNode() { - if (raiseNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - raiseNode = insert(PRaiseNode.create()); - } - return raiseNode; - } - @TruffleBoundary public static PBuiltinFunction createBuiltinFunction(PythonLanguage language, Object owner, TruffleString propertyName, int type, int offset) { CExtAsPythonObjectNode asPythonObjectNode = getReadConverterNode(type); @@ -279,7 +267,7 @@ public static PBuiltinFunction createBuiltinFunction(PythonLanguage language, Ob l -> new BuiltinFunctionRootNode(l, BUILTIN, new PrototypeNodeFactory<>(ReadMemberNodeGen.create(type, offset, asPythonObjectNode)), true), ReadMemberNode.class, BUILTIN.name(), type, offset); int flags = PBuiltinFunction.getFlags(BUILTIN, callTarget); - return PythonObjectFactory.getUncached().createBuiltinFunction(propertyName, owner, 0, flags, callTarget); + return PFactory.createBuiltinFunction(language, propertyName, owner, 0, flags, callTarget); } } @@ -295,8 +283,8 @@ protected ReadOnlyMemberNode(TruffleString propertyName) { @Specialization @SuppressWarnings("unused") Object doGeneric(Object self, Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.ATTRIBUTE_S_OF_P_OBJECTS_IS_NOT_WRITABLE, propertyName, self); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ATTRIBUTE_S_OF_P_OBJECTS_IS_NOT_WRITABLE, propertyName, self); } @TruffleBoundary @@ -305,7 +293,7 @@ public static PBuiltinFunction createBuiltinFunction(PythonLanguage language, Tr l -> new BuiltinFunctionRootNode(l, BUILTIN, new PrototypeNodeFactory<>(ReadOnlyMemberNodeGen.create(propertyName)), true), ReadOnlyMemberNode.class, BUILTIN.name()); int flags = PBuiltinFunction.getFlags(BUILTIN, builtinCt); - return PythonObjectFactory.getUncached().createBuiltinFunction(propertyName, null, 0, flags, builtinCt); + return PFactory.createBuiltinFunction(language, propertyName, null, 0, flags, builtinCt); } } @@ -315,12 +303,12 @@ protected abstract static class BadMemberDescrNode extends PythonBinaryBuiltinNo @Specialization static Object doGeneric(Object self, @SuppressWarnings("unused") Object value, - @Cached PRaiseNode raiseNode) { + @Bind("this") Node inliningTarget) { if (value == DescriptorDeleteMarker.INSTANCE) { // This node is actually only used for T_NONE, so this error message is right. - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.CAN_T_DELETE_NUMERIC_CHAR_ATTRIBUTE); + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.CAN_T_DELETE_NUMERIC_CHAR_ATTRIBUTE); } - throw raiseNode.raise(PythonBuiltinClassType.SystemError, ErrorMessages.BAD_MEMBER_DESCR_TYPE_FOR_P, self); + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.SystemError, ErrorMessages.BAD_MEMBER_DESCR_TYPE_FOR_P, self); } @TruffleBoundary @@ -329,7 +317,7 @@ public static PBuiltinFunction createBuiltinFunction(PythonLanguage language, Tr l -> new BuiltinFunctionRootNode(l, BUILTIN, new PrototypeNodeFactory<>(BadMemberDescrNodeGen.create()), true), BadMemberDescrNode.class, BUILTIN.name()); int flags = PBuiltinFunction.getFlags(BUILTIN, builtinCt); - return PythonObjectFactory.getUncached().createBuiltinFunction(propertyName, null, 0, flags, builtinCt); + return PFactory.createBuiltinFunction(language, propertyName, null, 0, flags, builtinCt); } } @@ -495,12 +483,13 @@ abstract static class WriteObjectExNode extends WriteTypeNode { @Specialization static void write(Object pointer, Object newValue, + @Bind("this") Node inliningTarget, @Cached CStructAccess.ReadObjectNode read, @Cached CStructAccess.WriteObjectNewRefNode write, @Cached PRaiseNode raise) { Object current = read.readGeneric(pointer, 0); if (newValue == DescriptorDeleteMarker.INSTANCE && current == PNone.NO_VALUE) { - throw raise.raise(PythonBuiltinClassType.AttributeError); + throw raise.raise(inliningTarget, PythonBuiltinClassType.AttributeError); } write.write(pointer, newValue); } @@ -586,7 +575,7 @@ protected WriteMemberNode(int type, int offset) { @Specialization Object doGeneric(Object self, Object value, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object selfPtr = toSulongNode.execute(self); selfPtr = getElement.readGeneric(selfPtr, offset); @@ -598,12 +587,12 @@ Object doGeneric(Object self, Object value, */ if (type != T_OBJECT && type != T_OBJECT_EX) { if (value == DescriptorDeleteMarker.INSTANCE) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.CAN_T_DELETE_NUMERIC_CHAR_ATTRIBUTE); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.CAN_T_DELETE_NUMERIC_CHAR_ATTRIBUTE); } } if (type == T_BOOL && !ensureIsSameTypeNode().executeCached(PythonBuiltinClassType.Boolean, ensureGetClassNode().executeCached(value))) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ATTRIBUTE_TYPE_VALUE_MUST_BE_BOOL); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ATTRIBUTE_TYPE_VALUE_MUST_BE_BOOL); } write.execute(selfPtr, value); @@ -638,7 +627,7 @@ public static PBuiltinFunction createBuiltinFunction(PythonLanguage language, Ob l -> new BuiltinFunctionRootNode(l, BUILTIN, new PrototypeNodeFactory<>(WriteMemberNodeGen.create(type, offset)), true), WriteMemberNode.class, BUILTIN.name(), type, offset); int flags = PBuiltinFunction.getFlags(BUILTIN, callTarget); - return PythonObjectFactory.getUncached().createBuiltinFunction(propertyName, owner, 0, flags, callTarget); + return PFactory.createBuiltinFunction(language, propertyName, owner, 0, flags, callTarget); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CExtNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CExtNodes.java index 8696867d77..c103c5c7c0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CExtNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CExtNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,12 +41,15 @@ package com.oracle.graal.python.builtins.objects.cext.capi; import static com.oracle.graal.python.builtins.objects.PNone.NO_VALUE; +import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_GRAALPY_OBJECT_GC_DEL; import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_NO_OP_CLEAR; +import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_NO_OP_TRAVERSE; import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PTR_COMPARE; import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_DEALLOC; -import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_OBJECT_GC_DEL; +import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_OBJECT_FREE; import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_TRUFFLE_MEMORYVIEW_FROM_OBJECT; import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_TYPE_GENERIC_ALLOC; +import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_SUBTYPE_TRAVERSE; import static com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper.PythonAbstractObjectNativeWrapper.IMMORTAL_REFCNT; import static com.oracle.graal.python.builtins.objects.cext.structs.CConstants.PYLONG_BITS_IN_DIGIT; import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyFloatObject__ob_fval; @@ -86,13 +89,17 @@ import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass; import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject; import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr; +import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext.ModuleSpec; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.AsCharPointerNodeGen; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.CreateFunctionNodeGen; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.FromCharPointerNodeGen; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.PyErrFetchNodeGen; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.PyErrOccurredNodeGen; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.ResolvePointerNodeGen; +import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.UnicodeFromFormatNodeGen; +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.CheckPrimitiveFunctionResultNode; import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.DefaultCheckFunctionResultNode; +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionInvokeNode; import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.TpSlotWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper.PythonAbstractObjectNativeWrapper; @@ -102,6 +109,7 @@ import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.NativeToPythonTransferNode; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.ResolveHandleNode; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.UpdateStrongRefNode; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitionsFactory.NativeToPythonNodeGen; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitionsFactory.PythonToNativeNodeGen; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.GetNativeWrapperNode; @@ -109,11 +117,11 @@ import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CByteArrayWrapper; import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CStringWrapper; import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.ClearCurrentExceptionNode; +import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.EnsureExecutableNode; import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.EnsureTruffleStringNode; import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.TransformExceptionFromNativeNode; import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.TransformExceptionToNativeNode; import com.oracle.graal.python.builtins.objects.cext.common.CExtContext; -import com.oracle.graal.python.builtins.objects.cext.common.CExtContext.ModuleSpec; import com.oracle.graal.python.builtins.objects.cext.common.GetNextVaArgNode; import com.oracle.graal.python.builtins.objects.cext.common.NativePointer; import com.oracle.graal.python.builtins.objects.cext.structs.CFields; @@ -136,12 +144,12 @@ import com.oracle.graal.python.builtins.objects.traceback.MaterializeLazyTracebackNode; import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; -import com.oracle.graal.python.builtins.objects.type.PythonClass; import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; import com.oracle.graal.python.builtins.objects.type.TypeFlags; import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetBaseClassNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetMroStorageNode; +import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetTypeFlagsNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.ProfileClassNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltin; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotNative; @@ -150,6 +158,7 @@ import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.lib.PyObjectSizeNode; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.BuiltinNames; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.HiddenAttr; @@ -158,6 +167,7 @@ import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.SpecialAttributeNames; import com.oracle.graal.python.nodes.SpecialMethodNames; +import com.oracle.graal.python.nodes.StringLiterals; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode; import com.oracle.graal.python.nodes.attributes.WriteAttributeToPythonObjectNode; @@ -166,6 +176,7 @@ import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaStringNode; import com.oracle.graal.python.nodes.util.CastToJavaStringNodeGen; @@ -176,9 +187,8 @@ import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.MroSequenceStorage; -import com.oracle.graal.python.util.ComparisonOp; import com.oracle.graal.python.util.Function; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerAsserts; @@ -197,6 +207,7 @@ import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.exception.AbstractTruffleException; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; @@ -339,23 +350,23 @@ public abstract static class FromNativeSubclassNode extends Node { public abstract Double execute(VirtualFrame frame, PythonAbstractNativeObject object); @Specialization - static Double doDouble(VirtualFrame frame, PythonAbstractNativeObject object, + static Double doDouble(PythonAbstractNativeObject object, @Bind("this") Node inliningTarget, @Cached GetPythonObjectClassNode getClass, @Cached IsSubtypeNode isSubtype, @Cached CStructAccess.ReadDoubleNode read) { - if (isFloatSubtype(frame, inliningTarget, object, getClass, isSubtype)) { + if (isFloatSubtype(inliningTarget, object, getClass, isSubtype)) { return read.readFromObj(object, PyFloatObject__ob_fval); } return null; } - public static boolean isFloatSubtype(VirtualFrame frame, Node inliningTarget, Object object, GetClassNode getClass, IsSubtypeNode isSubtype) { - return isSubtype.execute(frame, getClass.execute(inliningTarget, object), PythonBuiltinClassType.PFloat); + public static boolean isFloatSubtype(Node inliningTarget, Object object, GetClassNode getClass, IsSubtypeNode isSubtype) { + return isSubtype.execute(getClass.execute(inliningTarget, object), PythonBuiltinClassType.PFloat); } - public static boolean isFloatSubtype(VirtualFrame frame, Node inliningTarget, PythonAbstractNativeObject object, GetPythonObjectClassNode getClass, IsSubtypeNode isSubtype) { - return isSubtype.execute(frame, getClass.execute(inliningTarget, object), PythonBuiltinClassType.PFloat); + public static boolean isFloatSubtype(Node inliningTarget, PythonAbstractNativeObject object, GetPythonObjectClassNode getClass, IsSubtypeNode isSubtype) { + return isSubtype.execute(getClass.execute(inliningTarget, object), PythonBuiltinClassType.PFloat); } @NeverDefault @@ -396,8 +407,8 @@ static PInt doBoolNativeWrapper(Node inliningTarget, PrimitiveNativeWrapper obje @Specialization(guards = {"!isMaterialized(object)", "object.isInt()"}) static PInt doIntNativeWrapper(PrimitiveNativeWrapper object, - @Shared("factory") @Cached(inline = false) PythonObjectFactory factory) { - PInt materializedInt = factory.createInt(object.getInt()); + @Bind PythonLanguage language) { + PInt materializedInt = PFactory.createInt(language, object.getInt()); object.setMaterializedObject(materializedInt); materializedInt.setNativeWrapper(object); return materializedInt; @@ -405,8 +416,8 @@ static PInt doIntNativeWrapper(PrimitiveNativeWrapper object, @Specialization(guards = {"!isMaterialized(object)", "object.isLong()"}) static PInt doLongNativeWrapper(PrimitiveNativeWrapper object, - @Shared("factory") @Cached(inline = false) PythonObjectFactory factory) { - PInt materializedInt = factory.createInt(object.getLong()); + @Bind PythonLanguage language) { + PInt materializedInt = PFactory.createInt(language, object.getLong()); object.setMaterializedObject(materializedInt); materializedInt.setNativeWrapper(object); return materializedInt; @@ -414,8 +425,8 @@ static PInt doLongNativeWrapper(PrimitiveNativeWrapper object, @Specialization(guards = {"!isMaterialized(object)", "object.isDouble()", "!isNaN(object)"}) static PFloat doDoubleNativeWrapper(PrimitiveNativeWrapper object, - @Shared("factory") @Cached(inline = false) PythonObjectFactory factory) { - PFloat materializedInt = factory.createFloat(object.getDouble()); + @Bind PythonLanguage language) { + PFloat materializedInt = PFactory.createFloat(language, object.getDouble()); materializedInt.setNativeWrapper(object); object.setMaterializedObject(materializedInt); return materializedInt; @@ -541,6 +552,10 @@ public final TruffleString execute(Object charPtr) { return execute(charPtr, true); } + public static TruffleString executeUncached(Object charPtr) { + return FromCharPointerNodeGen.getUncached().execute(charPtr); + } + public abstract TruffleString execute(Object charPtr, boolean copy); @Specialization @@ -603,51 +618,45 @@ static Object getNativeClass(Node inliningTarget, PythonAbstractNativeObject obj @GenerateCached(false) public abstract static class PointerCompareNode extends Node { - public abstract boolean execute(Node inliningTarget, ComparisonOp op, Object a, Object b); - - @Specialization(guards = "op.isEqualityOp()", limit = "2") - static boolean doEqNe(ComparisonOp op, PythonAbstractNativeObject a, PythonAbstractNativeObject b, - @CachedLibrary("a") InteropLibrary aLib, - @CachedLibrary(limit = "3") InteropLibrary bLib) { - return aLib.isIdentical(a, b, bLib) == (op == ComparisonOp.EQ); - } + public abstract boolean execute(Node inliningTarget, RichCmpOp op, Object a, Object b); - @Specialization(guards = {"isNativeObjectOrVoidPointer(a)", "isNativeObjectOrLong(b)"}) - static boolean doGeneric(Node inliningTarget, ComparisonOp op, Object a, Object b, - @CachedLibrary(limit = "1") InteropLibrary interopLibrary, - @Cached InlinedConditionProfile aProfile, - @Cached InlinedConditionProfile bProfile) { + @Specialization + static boolean doGeneric(Node inliningTarget, RichCmpOp op, Object a, Object b, + @Cached NormalizePtrNode normalizeA, + @Cached NormalizePtrNode normalizeB, + @CachedLibrary(limit = "1") InteropLibrary interopLibrary) { CompilerAsserts.partialEvaluationConstant(op); - Object ptrA; - if (aProfile.profile(inliningTarget, a instanceof PythonNativeObject)) { - ptrA = ((PythonNativeObject) a).getPtr(); - } else { - // guaranteed by the guard - assert a instanceof PythonNativeVoidPtr; - ptrA = ((PythonNativeVoidPtr) a).getNativePointer(); - } - Object ptrB; - if (bProfile.profile(inliningTarget, b instanceof PythonNativeObject)) { - ptrB = ((PythonNativeObject) b).getPtr(); - } else { - // guaranteed by the guard - assert b instanceof Long; - ptrB = b; - } + Object ptrA = normalizeA.execute(inliningTarget, a); + Object ptrB = normalizeB.execute(inliningTarget, b); try { Object sym = CApiContext.getNativeSymbol(inliningTarget, FUN_PTR_COMPARE); - return (int) interopLibrary.execute(sym, ptrA, ptrB, op.opCode) != 0; + return (int) interopLibrary.execute(sym, ptrA, ptrB, op.asNative()) != 0; } catch (UnsupportedTypeException | ArityException | UnsupportedMessageException e) { throw CompilerDirectives.shouldNotReachHere(e); } } - static boolean isNativeObjectOrVoidPointer(Object object) { - return object instanceof PythonNativeObject || object instanceof PythonNativeVoidPtr; - } + @TypeSystemReference(PythonIntegerTypes.class) + @GenerateInline + @GenerateCached(false) + @GenerateUncached + abstract static class NormalizePtrNode extends Node { + abstract Object execute(Node inliningTarget, Object ptr); + + @Specialization + static Object doLong(long l) { + return l; + } - static boolean isNativeObjectOrLong(Object object) { - return object instanceof PythonNativeObject || object instanceof Long; + @Specialization + static Object doLong(PythonNativeObject o) { + return o.getPtr(); + } + + @Specialization + static Object doLong(PythonNativeVoidPtr o) { + return o.getNativePointer(); + } } } @@ -681,46 +690,46 @@ static PComplex doPComplex(PComplex value) { @Specialization static PComplex doBoolean(boolean value, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - return factory.createComplex(value ? 1.0 : 0.0, 0.0); + @Bind PythonLanguage language) { + return PFactory.createComplex(language, value ? 1.0 : 0.0, 0.0); } @Specialization static PComplex doInt(int value, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - return factory.createComplex(value, 0.0); + @Bind PythonLanguage language) { + return PFactory.createComplex(language, value, 0.0); } @Specialization static PComplex doLong(long value, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - return factory.createComplex(value, 0.0); + @Bind PythonLanguage language) { + return PFactory.createComplex(language, value, 0.0); } @Specialization PComplex doDouble(double value, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - return factory.createComplex(value, 0.0); + @Bind PythonLanguage language) { + return PFactory.createComplex(language, value, 0.0); } @Specialization static PComplex doPInt(PInt value, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - return factory.createComplex(value.doubleValue(), 0.0); + @Bind PythonLanguage language) { + return PFactory.createComplex(language, value.doubleValue(), 0.0); } @Specialization static PComplex doPFloat(PFloat value, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - return factory.createComplex(value.getValue(), 0.0); + @Bind PythonLanguage language) { + return PFactory.createComplex(language, value.getValue(), 0.0); } @Specialization(replaces = {"doPComplex", "doBoolean", "doInt", "doLong", "doDouble", "doPInt", "doPFloat"}) static PComplex runGeneric(Node inliningTarget, Object value, @Cached PyFloatAsDoubleNode asDoubleNode, @Cached(inline = false) LookupAndCallUnaryDynamicNode callComplex, - @Shared @Cached(inline = false) PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { Object result = callComplex.executeObject(value, T___COMPLEX__); // TODO(fa) according to CPython's 'PyComplex_AsCComplex', they still allow subclasses // of PComplex @@ -728,10 +737,10 @@ static PComplex runGeneric(Node inliningTarget, Object value, if (result instanceof PComplex) { return (PComplex) result; } else { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.COMPLEX_RETURNED_NON_COMPLEX, value); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.COMPLEX_RETURNED_NON_COMPLEX, value); } } else { - return factory.createComplex(asDoubleNode.execute(null, inliningTarget, value), 0.0); + return PFactory.createComplex(language, asDoubleNode.execute(null, inliningTarget, value), 0.0); } } } @@ -851,7 +860,7 @@ static Object doWithoutContext(NativeCAPISymbol symbol, Object[] args, PythonContext pythonContext = PythonContext.get(inliningTarget); if (!pythonContext.hasCApiContext()) { CompilerDirectives.transferToInterpreterAndInvalidate(); - CApiContext.ensureCapiWasLoaded(); + CApiContext.ensureCapiWasLoaded("call internal native GraalPy function"); } // TODO review EnsureTruffleStringNode with GR-37896 Object callable = CApiContext.getNativeSymbol(inliningTarget, symbol); @@ -890,24 +899,33 @@ public static PCallCapiFunction getUncached() { */ @TruffleBoundary public static Object lookupNativeMemberInMRO(PythonManagedClass cls, @SuppressWarnings("unused") CFields nativeMemberName, HiddenAttr managedMemberName) { - if (cls instanceof PythonClass) { - NativeCAPISymbol symbol = null; - // We need to point to PyType_GenericAlloc or PyObject_GC_Del - if (managedMemberName == HiddenAttr.ALLOC) { - symbol = FUN_PY_TYPE_GENERIC_ALLOC; - } else if (managedMemberName == HiddenAttr.FREE) { - symbol = FUN_PY_OBJECT_GC_DEL; - } else if (managedMemberName == HiddenAttr.CLEAR) { - // This will need to be subtype_clear when we implement native GC - symbol = FUN_NO_OP_CLEAR; + NativeCAPISymbol symbol = null; + // We need to point to PyType_GenericAlloc or PyObject_GC_Del + if (managedMemberName == HiddenAttr.ALLOC) { + symbol = FUN_PY_TYPE_GENERIC_ALLOC; + } else if (managedMemberName == HiddenAttr.FREE) { + /* + * See 'typeobject.c: inherit_slots': A bit of magic to plug in the correct default + * tp_free function when a derived class adds gc, didn't define tp_free, and the base + * uses the default non-gc tp_free. + */ + if ((GetTypeFlagsNode.executeUncached(cls) & TypeFlags.HAVE_GC) != 0) { + symbol = FUN_GRAALPY_OBJECT_GC_DEL; + } else { + symbol = FUN_PY_OBJECT_FREE; } - if (symbol != null) { - Object func = HiddenAttr.ReadNode.executeUncached(cls, managedMemberName, null); - if (func != null) { - return func; - } - return CApiContext.getNativeSymbol(null, symbol); + } else if (managedMemberName == HiddenAttr.TRAVERSE) { + symbol = cls instanceof PythonBuiltinClass ? FUN_NO_OP_TRAVERSE : FUN_SUBTYPE_TRAVERSE; + } else if (managedMemberName == HiddenAttr.CLEAR) { + // This will need to be subtype_clear when we implement native GC + symbol = FUN_NO_OP_CLEAR; + } + if (symbol != null) { + Object func = HiddenAttr.ReadNode.executeUncached(cls, managedMemberName, null); + if (func != null) { + return func; } + return CApiContext.getNativeSymbol(null, symbol); } MroSequenceStorage mroStorage = GetMroStorageNode.executeUncached(cls); int n = mroStorage.length(); @@ -1130,7 +1148,7 @@ static Object doObject(Frame frame, Object errorValue, PythonBuiltinClassType er private static void raiseNative(Frame frame, Node inliningTarget, PythonBuiltinClassType errType, TruffleString format, Object[] arguments, PRaiseNode raiseNode, TransformExceptionToNativeNode transformExceptionToNativeNode) { try { - throw raiseNode.raise(errType, format, arguments); + throw raiseNode.raise(inliningTarget, errType, format, arguments); } catch (PException p) { transformExceptionToNativeNode.execute(frame, inliningTarget, p); } @@ -1172,6 +1190,7 @@ static void doDecref(Node inliningTarget, Object pointerObj, @Cached(inline = false) CApiTransitions.ToPythonWrapperNode toPythonWrapperNode, @Cached InlinedBranchProfile isWrapperProfile, @Cached InlinedBranchProfile isNativeObject, + @Cached UpdateStrongRefNode updateRefNode, @Cached(inline = false) CStructAccess.ReadI64Node readRefcount, @Cached(inline = false) CStructAccess.WriteLongNode writeRefcount, @Cached(inline = false) PCallCapiFunction callDealloc) { @@ -1196,7 +1215,7 @@ static void doDecref(Node inliningTarget, Object pointerObj, PythonNativeWrapper wrapper = toPythonWrapperNode.executeWrapper(pointer, false); if (wrapper instanceof PythonAbstractObjectNativeWrapper objectWrapper) { isWrapperProfile.enter(inliningTarget); - objectWrapper.decRef(); + updateRefNode.execute(inliningTarget, objectWrapper, objectWrapper.decRef()); } else if (wrapper == null) { isNativeObject.enter(inliningTarget); assert NativeToPythonNode.executeUncached(new NativePointer(pointer)) instanceof PythonAbstractNativeObject; @@ -1276,11 +1295,12 @@ public static Object executeUncached(Object pointerObject) { @Specialization static Object resolveLongCached(Node inliningTarget, long pointer, - @Exclusive @Cached ResolveHandleNode resolveHandleNode) { + @Exclusive @Cached ResolveHandleNode resolveHandleNode, + @Exclusive @Cached UpdateStrongRefNode updateRefNode) { Object lookup = CApiTransitions.lookupNative(pointer); if (lookup != null) { if (lookup instanceof PythonAbstractObjectNativeWrapper objectNativeWrapper) { - objectNativeWrapper.incRef(); + updateRefNode.execute(inliningTarget, objectNativeWrapper, objectNativeWrapper.incRef()); } return lookup; } @@ -1293,7 +1313,8 @@ static Object resolveLongCached(Node inliningTarget, long pointer, @Specialization(guards = "!isLong(pointerObject)") static Object resolveGeneric(Node inliningTarget, Object pointerObject, @CachedLibrary(limit = "3") InteropLibrary lib, - @Exclusive @Cached ResolveHandleNode resolveHandleNode) { + @Exclusive @Cached ResolveHandleNode resolveHandleNode, + @Exclusive @Cached UpdateStrongRefNode updateRefNode) { if (lib.isPointer(pointerObject)) { Object lookup; long pointer; @@ -1305,7 +1326,7 @@ static Object resolveGeneric(Node inliningTarget, Object pointerObject, lookup = CApiTransitions.lookupNative(pointer); if (lookup != null) { if (lookup instanceof PythonAbstractObjectNativeWrapper objectNativeWrapper) { - objectNativeWrapper.incRef(); + updateRefNode.execute(inliningTarget, objectNativeWrapper, objectNativeWrapper.incRef()); } return lookup; } @@ -1386,6 +1407,10 @@ static long doOther(Node inliningTarget, Object object, public abstract static class UnicodeFromFormatNode extends Node { private static Pattern pattern; + public static Object executeUncached(TruffleString format, Object vaList) { + return UnicodeFromFormatNodeGen.getUncached().execute(null, format, vaList); + } + private static Matcher match(String formatStr) { if (pattern == null) { pattern = Pattern.compile("%(?[-+ #0])?(?\\d+)?(\\.(?\\d+))?(?(l|ll|z))?(?[%cduixspAUVSR])"); @@ -1406,7 +1431,6 @@ Object doGeneric(TruffleString f, Object vaList) { CastToJavaStringNode castToJavaStringNode = CastToJavaStringNodeGen.getUncached(); FromCharPointerNode fromCharPointerNode = FromCharPointerNodeGen.getUncached(); InteropLibrary interopLibrary = InteropLibrary.getUncached(); - PRaiseNode raiseNode = PRaiseNode.getUncached(); StringBuilder result = new StringBuilder(); int vaArgIdx = 0; @@ -1428,7 +1452,7 @@ Object doGeneric(TruffleString f, Object vaList) { int prec = getPrec(matcher.group("prec")); assert spec.length() == 1; char la = spec.charAt(0); - PythonContext context = PythonContext.get(raiseNode); + PythonContext context = PythonContext.get(null); switch (la) { case '%': // %% @@ -1436,9 +1460,9 @@ Object doGeneric(TruffleString f, Object vaList) { valid = true; break; case 'c': - int ordinal = getAndCastToInt(interopLibrary, raiseNode, vaList); + int ordinal = getAndCastToInt(interopLibrary, vaList); if (ordinal < 0 || ordinal > 0x110000) { - throw raiseNode.raise(PythonBuiltinClassType.OverflowError, ErrorMessages.CHARACTER_ARG_NOT_IN_RANGE); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.OverflowError, ErrorMessages.CHARACTER_ARG_NOT_IN_RANGE); } result.append((char) ordinal); vaArgIdx++; @@ -1453,12 +1477,12 @@ Object doGeneric(TruffleString f, Object vaList) { case "l": case "z": vaArgIdx++; - result.append(castToLong(interopLibrary, raiseNode, GetNextVaArgNode.executeUncached(vaList))); + result.append(castToLong(interopLibrary, GetNextVaArgNode.executeUncached(vaList))); valid = true; break; } } else { - result.append(getAndCastToInt(interopLibrary, raiseNode, vaList)); + result.append(getAndCastToInt(interopLibrary, vaList)); vaArgIdx++; valid = true; } @@ -1471,19 +1495,19 @@ Object doGeneric(TruffleString f, Object vaList) { case "l": case "z": vaArgIdx++; - result.append(castToLong(interopLibrary, raiseNode, GetNextVaArgNode.executeUncached(vaList))); + result.append(castToLong(interopLibrary, GetNextVaArgNode.executeUncached(vaList))); valid = true; break; } } else { - result.append(Integer.toUnsignedString(getAndCastToInt(interopLibrary, raiseNode, vaList))); + result.append(Integer.toUnsignedString(getAndCastToInt(interopLibrary, vaList))); vaArgIdx++; valid = true; } break; case 'x': // %x - result.append(Integer.toHexString(getAndCastToInt(interopLibrary, raiseNode, vaList))); + result.append(Integer.toHexString(getAndCastToInt(interopLibrary, vaList))); vaArgIdx++; valid = true; break; @@ -1575,7 +1599,7 @@ Object doGeneric(TruffleString f, Object vaList) { // matched) result.append(format, cur, format.length()); } catch (InteropException e) { - throw raiseNode.raise(PythonBuiltinClassType.SystemError, ErrorMessages.ERROR_WHEN_ACCESSING_VAR_ARG_AT_POS, vaArgIdx); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.SystemError, ErrorMessages.ERROR_WHEN_ACCESSING_VAR_ARG_AT_POS, vaArgIdx); } return toTruffleStringUncached(result.toString()); } @@ -1591,7 +1615,7 @@ private static int getPrec(String prec) { * Read an element from the {@code va_list} with the specified type and cast it to a Java * {@code int}. Throws a {@code SystemError} if this is not possible. */ - private static int getAndCastToInt(InteropLibrary lib, PRaiseNode raiseNode, Object vaList) throws InteropException { + private int getAndCastToInt(InteropLibrary lib, Object vaList) throws InteropException { Object value = GetNextVaArgNode.executeUncached(vaList); if (lib.fitsInInt(value)) { try { @@ -1610,14 +1634,14 @@ private static int getAndCastToInt(InteropLibrary lib, PRaiseNode raiseNode, Obj throw shouldNotReachHere(); } } - throw raiseNode.raise(PythonBuiltinClassType.SystemError, ErrorMessages.P_OBJ_CANT_BE_INTEPRETED_AS_INTEGER, value); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.SystemError, ErrorMessages.P_OBJ_CANT_BE_INTEPRETED_AS_INTEGER, value); } /** * Cast a value to a Java {@code long}. Throws a {@code SystemError} if this is not * possible. */ - private static long castToLong(InteropLibrary lib, PRaiseNode raiseNode, Object value) { + private long castToLong(InteropLibrary lib, Object value) { if (lib.fitsInLong(value)) { try { return lib.asLong(value); @@ -1635,7 +1659,7 @@ private static long castToLong(InteropLibrary lib, PRaiseNode raiseNode, Object throw shouldNotReachHere(); } } - throw raiseNode.raise(PythonBuiltinClassType.SystemError, ErrorMessages.P_OBJ_CANT_BE_INTEPRETED_AS_INTEGER, value); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.SystemError, ErrorMessages.P_OBJ_CANT_BE_INTEPRETED_AS_INTEGER, value); } private static Object getPyObject(Object vaList) throws InteropException { @@ -1689,7 +1713,7 @@ public abstract static class CreateModuleNode extends MultiPhaseExtensionModuleI @TruffleBoundary static Object doGeneric(CApiContext capiContext, ModuleSpec moduleSpec, Object moduleDefWrapper, Object library, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached CStructAccess.ReadPointerNode readPointer, @Cached CStructAccess.ReadI64Node readI64, @CachedLibrary(limit = "3") InteropLibrary interopLib, @@ -1702,7 +1726,7 @@ static Object doGeneric(CApiContext capiContext, ModuleSpec moduleSpec, Object m @Cached CStructAccess.ReadI32Node readI32Node, @Cached GetThreadStateNode getThreadStateNode, @Cached TransformExceptionFromNativeNode transformExceptionFromNativeNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { // call to type the pointer Object moduleDef = moduleDefWrapper instanceof PythonAbstractNativeObject ? ((PythonAbstractNativeObject) moduleDefWrapper).getPtr() : moduleDefWrapper; @@ -1724,7 +1748,7 @@ static Object doGeneric(CApiContext capiContext, ModuleSpec moduleSpec, Object m mSize = readI64.read(moduleDef, PyModuleDef__m_size); if (mSize < 0) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.SystemError, ErrorMessages.M_SIZE_CANNOT_BE_NEGATIVE, mName); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.SystemError, ErrorMessages.M_SIZE_CANNOT_BE_NEGATIVE, mName); } // parse slot definitions @@ -1739,7 +1763,7 @@ static Object doGeneric(CApiContext capiContext, ModuleSpec moduleSpec, Object m break loop; case SLOT_PY_MOD_CREATE: if (createFunction != null) { - throw raiseNode.get(inliningTarget).raise(SystemError, ErrorMessages.MODULE_HAS_MULTIPLE_CREATE_SLOTS, mName); + throw raiseNode.raise(inliningTarget, SystemError, ErrorMessages.MODULE_HAS_MULTIPLE_CREATE_SLOTS, mName); } createFunction = readPointerNode.readStructArrayElement(slotDefinitions, i, PyModuleDef_Slot__value); break; @@ -1747,7 +1771,7 @@ static Object doGeneric(CApiContext capiContext, ModuleSpec moduleSpec, Object m hasExecutionSlots = true; break; default: - throw raiseNode.get(inliningTarget).raise(SystemError, ErrorMessages.MODULE_USES_UNKNOW_SLOT_ID, mName, slotId); + throw raiseNode.raise(inliningTarget, SystemError, ErrorMessages.MODULE_USES_UNKNOW_SLOT_ID, mName, slotId); } } } @@ -1780,17 +1804,17 @@ static Object doGeneric(CApiContext capiContext, ModuleSpec moduleSpec, Object m */ if (!(module instanceof PythonModule)) { if (mSize > 0) { - throw raiseNode.get(inliningTarget).raise(SystemError, ErrorMessages.NOT_A_MODULE_OBJECT_BUT_REQUESTS_MODULE_STATE, mName); + throw raiseNode.raise(inliningTarget, SystemError, ErrorMessages.NOT_A_MODULE_OBJECT_BUT_REQUESTS_MODULE_STATE, mName); } if (hasExecutionSlots) { - throw raiseNode.get(inliningTarget).raise(SystemError, ErrorMessages.MODULE_SPECIFIES_EXEC_SLOTS_BUT_DIDNT_CREATE_INSTANCE, mName); + throw raiseNode.raise(inliningTarget, SystemError, ErrorMessages.MODULE_SPECIFIES_EXEC_SLOTS_BUT_DIDNT_CREATE_INSTANCE, mName); } // otherwise CPython is just fine } else { ((PythonModule) module).setNativeModuleDef(moduleDef); } } else { - PythonModule pythonModule = factory.createPythonModule(mName); + PythonModule pythonModule = PFactory.createPythonModule(language, mName); pythonModule.setNativeModuleDef(moduleDef); module = pythonModule; } @@ -1802,7 +1826,7 @@ static Object doGeneric(CApiContext capiContext, ModuleSpec moduleSpec, Object m if (fun == null) { break; } - PBuiltinMethod method = factory.createBuiltinMethod(module, fun); + PBuiltinMethod method = PFactory.createBuiltinMethod(language, module, fun); writeAttrToMethodNode.execute(method, SpecialAttributeNames.T___MODULE__, mName); writeAttrNode.execute(module, fun.getName(), method); } @@ -1895,7 +1919,7 @@ static int doGeneric(CApiContext capiContext, PythonModule module, Object module ErrorMessages.EXECUTION_RAISED_EXCEPTION); break; default: - throw raiseNode.raise(SystemError, ErrorMessages.MODULE_INITIALIZED_WITH_UNKNOWN_SLOT, mName, slotId); + throw raiseNode.raise(inliningTarget, SystemError, ErrorMessages.MODULE_INITIALIZED_WITH_UNKNOWN_SLOT, mName, slotId); } } } catch (UnsupportedMessageException | UnsupportedTypeException | ArityException e) { @@ -1929,7 +1953,8 @@ static PBuiltinFunction doIt(Node inliningTarget, Object methodDef, int element, @Cached(inline = false) CStructAccess.ReadPointerNode readPointerNode, @Cached(inline = false) CStructAccess.ReadI32Node readI32Node, @Cached(inline = false) FromCharPointerNode fromCharPointerNode, - @Cached(inline = false) PythonObjectFactory factory, + @Bind PythonLanguage language, + @Cached EnsureExecutableNode ensureCallableNode, @Cached HiddenAttr.WriteNode writeHiddenAttrNode, @Cached(inline = false) WriteAttributeToPythonObjectNode writeAttributeToPythonObjectNode) { Object methodNamePtr = readPointerNode.readStructArrayElement(methodDef, element, PyMethodDef__ml_name); @@ -1949,10 +1974,10 @@ static PBuiltinFunction doIt(Node inliningTarget, Object methodDef, int element, // CPy-style methods // TODO(fa) support static and class methods PExternalFunctionWrapper sig = PExternalFunctionWrapper.fromMethodFlags(flags); - RootCallTarget callTarget = PExternalFunctionWrapper.getOrCreateCallTarget(sig, PythonLanguage.get(factory), methodName, true, CExtContext.isMethStatic(flags)); - mlMethObj = CExtContext.ensureExecutable(mlMethObj, sig); + RootCallTarget callTarget = PExternalFunctionWrapper.getOrCreateCallTarget(sig, PythonLanguage.get(inliningTarget), methodName, true, CExtContext.isMethStatic(flags)); + mlMethObj = ensureCallableNode.execute(inliningTarget, mlMethObj, sig); PKeyword[] kwDefaults = ExternalFunctionNodes.createKwDefaults(mlMethObj); - PBuiltinFunction function = factory.createBuiltinFunction(methodName, null, PythonUtils.EMPTY_OBJECT_ARRAY, kwDefaults, flags, callTarget); + PBuiltinFunction function = PFactory.createBuiltinFunction(language, methodName, null, PythonUtils.EMPTY_OBJECT_ARRAY, kwDefaults, flags, callTarget); writeHiddenAttrNode.execute(inliningTarget, function, METHOD_DEF_PTR, methodDef); // write doc string; we need to directly write to the storage otherwise it is disallowed @@ -2081,18 +2106,18 @@ static PythonObject doPythonCallable(TruffleString name, PythonNativeWrapper cal } doArgAndResultConversion = true; } - PBuiltinFunction function = PExternalFunctionWrapper.createWrapperFunction(name, managedCallable, type, flags, signature, language, context.factory(), doArgAndResultConversion); + PythonObject function = PExternalFunctionWrapper.createWrapperFunction(name, managedCallable, type, flags, signature, language, doArgAndResultConversion); return function != null ? function : castToPythonObject(managedCallable); } @Specialization @TruffleBoundary - static PBuiltinFunction doPyCFunctionWrapper(TruffleString name, PyCFunctionWrapper wrapper, int signature, Object type, int flags) { + static PythonObject doPyCFunctionWrapper(TruffleString name, PyCFunctionWrapper wrapper, int signature, Object type, int flags) { Object delegate = wrapper.getDelegate(); assert !(delegate instanceof PythonAbstractObject); PythonContext context = PythonContext.get(null); PythonLanguage language = context.getLanguage(); - return PExternalFunctionWrapper.createWrapperFunction(name, delegate, type, flags, signature, language, context.factory(), false); + return PExternalFunctionWrapper.createWrapperFunction(name, delegate, type, flags, signature, language, false); } @Specialization(guards = {"!isNativeWrapper(callable)"}) @@ -2141,7 +2166,7 @@ static PythonObject doNativeCallableWithWrapper(TruffleString name, Object calla resolvedCallable = callable; } PythonLanguage language = context.getLanguage(); - PBuiltinFunction function = PExternalFunctionWrapper.createWrapperFunction(name, resolvedCallable, type, flags, signature, language, context.factory(), doArgAndResultConversion); + PythonObject function = PExternalFunctionWrapper.createWrapperFunction(name, resolvedCallable, type, flags, signature, language, doArgAndResultConversion); return function != null ? function : castToPythonObject(resolvedCallable); } @@ -2188,4 +2213,48 @@ public static Object resolveClosurePointer(PythonContext context, Object callabl return null; } } + + /** + * Similar to CPython's macro {@code Py_VISIT}, this node will call the provided visit function + * on the item if that item is a native object. This is because we assume that the traverse and + * visit functions are only used in the Python GC to determine reference cycles due to reference + * counting. If a reference cycle is interrupted by a managed reference, we are fine + * because the Java GC will correctly handle that. + */ + @GenerateInline + @GenerateCached(false) + @GenerateUncached + public abstract static class VisitNode extends Node { + + /** + * Calls the visit function on the given item. + * + * @param frame The virtual frame (may be {code null}). + * @param inliningTarget The inlining target. + * @param threadState The Python thread state (must not be {@code null}). + * @param item The item to visit (may be {@code null}). Only a native object will be + * visited. + * @param visitFunction The visit function to call. This is expected to be an + * {@link InteropLibrary#isExecutable(Object) executable} interop object (must + * not be {@code null}). + * @param visitArg The argument for the visit function as provided by the root caller. + * @return {@code 0} on success, {@code !=0} on error + */ + public abstract int execute(VirtualFrame frame, Node inliningTarget, PythonThreadState threadState, Object item, Object visitFunction, Object visitArg); + + @Specialization + static int doGeneric(VirtualFrame frame, Node inliningTarget, PythonThreadState threadState, Object item, Object visitFunction, Object visitArg, + @Cached InlinedConditionProfile isNativeObjectProfile, + @Cached ExternalFunctionInvokeNode externalFunctionInvokeNode, + @Cached(inline = false) CheckPrimitiveFunctionResultNode checkPrimitiveFunctionResultNode, + @Cached(inline = false) PythonToNativeNode toNativeNode) { + assert InteropLibrary.getUncached().isExecutable(visitFunction); + if (isNativeObjectProfile.profile(inliningTarget, item instanceof PythonAbstractNativeObject)) { + Object result = externalFunctionInvokeNode.call(frame, inliningTarget, threadState, CApiGCSupport.VISIT_TIMING, StringLiterals.T_VISIT, visitFunction, + toNativeNode.execute(item), visitArg); + return (int) checkPrimitiveFunctionResultNode.executeLong(threadState, StringLiterals.T_VISIT, result); + } + return 0; + } + } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/ExternalFunctionNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/ExternalFunctionNodes.java index 83db4bcb03..0f12b96b47 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/ExternalFunctionNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/ExternalFunctionNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -56,11 +56,11 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyTypeObject; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Py_ssize_t; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.tsArray; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.PythonAbstractObject; @@ -81,6 +81,7 @@ import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.CheckFunctionResultNode; import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.ClearCurrentExceptionNode; import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.ConvertPIntToPrimitiveNode; +import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.EnsureExecutableNode; import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.GetIndexNode; import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.TransformExceptionFromNativeNode; import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodesFactory.ConvertPIntToPrimitiveNodeGen; @@ -92,31 +93,29 @@ import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.StorageToNativeNode; import com.oracle.graal.python.builtins.objects.floats.PFloat; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor; import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.function.Signature; import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.str.PString; import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotCExtNative; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotNative; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.PRootNode; -import com.oracle.graal.python.nodes.SpecialMethodNames; import com.oracle.graal.python.nodes.argument.ReadIndexedArgumentNode; import com.oracle.graal.python.nodes.argument.ReadVarArgsNode; import com.oracle.graal.python.nodes.argument.ReadVarKeywordsNode; -import com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode; +import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode; import com.oracle.graal.python.nodes.interop.PForeignToPTypeNode; import com.oracle.graal.python.nodes.object.IsForeignObjectNode; -import com.oracle.graal.python.nodes.truffle.PythonTypes; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.ExecutionContext.CalleeContext; import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext; @@ -125,7 +124,7 @@ import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode; import com.oracle.graal.python.runtime.PythonContext.PythonThreadState; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.NativeObjectSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.NativeSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage; @@ -148,9 +147,11 @@ import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.ImportStatic; +import com.oracle.truffle.api.dsl.InlineSupport.InlineTarget; +import com.oracle.truffle.api.dsl.InlineSupport.RequiredField; +import com.oracle.truffle.api.dsl.InlineSupport.StateField; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.exception.AbstractTruffleException; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.interop.ArityException; @@ -186,22 +187,6 @@ public static PKeyword[] createKwDefaults(Object callable, Object closure) { return new PKeyword[]{new PKeyword(KW_CALLABLE, callable), new PKeyword(KW_CLOSURE, closure)}; } - public static Object tryGetHiddenCallable(PBuiltinFunction function) { - if (function.getFunctionRootNode() instanceof MethodDescriptorRoot) { - return getHiddenCallable(function.getKwDefaults()); - } - return null; - } - - public static Object getHiddenCallable(PKeyword[] kwDefaults) { - if (kwDefaults.length >= KEYWORDS_HIDDEN_CALLABLE.length) { - PKeyword kwDefault = kwDefaults[0]; - assert KW_CALLABLE.equalsUncached(kwDefault.getName(), TS_ENCODING) : "invalid keyword defaults"; - return kwDefault.getValue(); - } - throw CompilerDirectives.shouldNotReachHere(); - } - public abstract static class FinishArgNode extends PNodeWithContext { public abstract void execute(Object value); @@ -393,14 +378,16 @@ public enum PExternalFunctionWrapper implements NativeCExtSymbol { TP_REPR(45, PyObjectTransfer, PyObject), DESCR_DELETE(46, InitResult, PyObject, PyObject, PyObject), // the last one is always NULL DELATTRO(47, InitResult, PyObject, PyObject, PyObject), // the last one is always NULL - SSIZE_ARG(48, PyObjectTransfer, PyObject, Py_ssize_t); + SSIZE_ARG(48, PyObjectTransfer, PyObject, Py_ssize_t), + VISITPROC(49, Int, PyObject, Pointer), + TRAVERSEPROC(50, Int, PyObject, Pointer, Pointer); private static int defaults(int x) { return x; } @CompilationFinal(dimensions = 1) private static final PExternalFunctionWrapper[] VALUES = values(); - @CompilationFinal(dimensions = 1) private static final PExternalFunctionWrapper[] BY_ID = new PExternalFunctionWrapper[50]; + @CompilationFinal(dimensions = 1) private static final PExternalFunctionWrapper[] BY_ID = new PExternalFunctionWrapper[51]; public final String signature; public final ArgDescriptor returnValue; @@ -493,7 +480,6 @@ static RootCallTarget getOrCreateCallTarget(PExternalFunctionWrapper sig, Python case CALL: case INITPROC: case KEYWORDS: - case NEW: /* * If no conversion is requested, this means we directly call a managed function * (without argument conversion). Null indicates this @@ -504,6 +490,13 @@ static RootCallTarget getOrCreateCallTarget(PExternalFunctionWrapper sig, Python nodeKlass = MethKeywordsRoot.class; rootNodeFunction = l -> new MethKeywordsRoot(l, name, isStatic, sig); break; + case NEW: + if (!doArgAndResultConversion) { + return null; + } + nodeKlass = MethNewRoot.class; + rootNodeFunction = l -> new MethNewRoot(l, name, isStatic, sig); + break; case VARARGS: nodeKlass = MethVarargsRoot.class; rootNodeFunction = doArgAndResultConversion ? l -> new MethVarargsRoot(l, name, isStatic, sig) : l -> new MethVarargsRoot(l, name, isStatic); @@ -623,10 +616,10 @@ static RootCallTarget getOrCreateCallTarget(PExternalFunctionWrapper sig, Python return language.createCachedExternalFunWrapperCallTarget(rootNodeFunction, nodeKlass, sig, name, doArgAndResultConversion, isStatic); } - public static PBuiltinFunction createWrapperFunction(TruffleString name, Object callable, Object enclosingType, int flags, int sig, - PythonLanguage language, PythonObjectFactory factory, boolean doArgAndResultConversion) { + public static PythonObject createWrapperFunction(TruffleString name, Object callable, Object enclosingType, int flags, int sig, + PythonLanguage language, boolean doArgAndResultConversion) { return createWrapperFunction(name, callable, enclosingType, flags, PExternalFunctionWrapper.fromValue(sig), - language, factory, doArgAndResultConversion); + language, doArgAndResultConversion); } /** @@ -636,19 +629,17 @@ public static PBuiltinFunction createWrapperFunction(TruffleString name, Object * @param language The Python language object. * @param sig The wrapper/signature ID as defined in {@link PExternalFunctionWrapper}. * @param name The name of the method. - * @param callable A reference denoting executable code. Currently, there are three - * representations for that: (1) a native function pointer, (2) a - * {@link RootCallTarget}, and (3) a {@link BuiltinMethodDescriptor}. + * @param callable A reference denoting executable code. Currently, there are two + * representations for that: a native function pointer or a + * {@link RootCallTarget} * @param enclosingType The type the function belongs to (needed for checking of * {@code self}). - * @param factory Just an instance of {@link PythonObjectFactory} to create the function - * object. * @return A {@link PBuiltinFunction} implementing the semantics of the specified slot * wrapper. */ @TruffleBoundary - public static PBuiltinFunction createWrapperFunction(TruffleString name, Object callable, Object enclosingType, int flags, PExternalFunctionWrapper sig, PythonLanguage language, - PythonObjectFactory factory, boolean doArgAndResultConversion) { + public static PythonObject createWrapperFunction(TruffleString name, Object callable, Object enclosingType, int flags, PExternalFunctionWrapper sig, PythonLanguage language, + boolean doArgAndResultConversion) { LOGGER.finer(() -> PythonUtils.formatJString("ExternalFunctions.createWrapperFunction(%s, %s)", name, callable)); assert !isClosurePointer(PythonContext.get(null), callable, InteropLibrary.getUncached(callable)); if (flags < 0) { @@ -677,16 +668,6 @@ public static PBuiltinFunction createWrapperFunction(TruffleString name, Object numDefaults = PythonBuiltins.numDefaults(builtinFunctionRootNode.getBuiltin()); } kwDefaults = PKeyword.EMPTY_KEYWORDS; - } else if (callable instanceof BuiltinMethodDescriptor builtinMethodDescriptor) { - /* - * If we see a built-in method descriptor here, it was originally retrieved by a - * slot lookup. This means, the slot was already properly registered and therefore - * also its call target. - */ - callTarget = language.getDescriptorCallTarget(builtinMethodDescriptor); - // again: special case for built-in functions - numDefaults = PythonBuiltins.numDefaults(builtinMethodDescriptor.getBuiltinAnnotation()); - kwDefaults = PKeyword.EMPTY_KEYWORDS; } else { callTarget = getOrCreateCallTarget(sig, language, name, doArgAndResultConversion, CExtContext.isMethStatic(flags)); if (callTarget == null) { @@ -694,7 +675,7 @@ public static PBuiltinFunction createWrapperFunction(TruffleString name, Object } // ensure that 'callable' is executable via InteropLibrary - Object boundCallable = CExtContext.ensureExecutable(callable, sig); + Object boundCallable = EnsureExecutableNode.executeUncached(callable, sig); kwDefaults = ExternalFunctionNodes.createKwDefaults(boundCallable); slot = TpSlotNative.createCExtSlot(boundCallable); } @@ -705,7 +686,7 @@ public static PBuiltinFunction createWrapperFunction(TruffleString name, Object } Object[] defaults = PBuiltinFunction.generateDefaults(numDefaults); - Object type = (enclosingType == PNone.NO_VALUE || SpecialMethodNames.T___NEW__.equalsUncached(name, TS_ENCODING)) ? null : enclosingType; + Object type = enclosingType == PNone.NO_VALUE ? null : enclosingType; // TODO(fa): this should eventually go away switch (sig) { case NOARGS: @@ -715,24 +696,11 @@ public static PBuiltinFunction createWrapperFunction(TruffleString name, Object case FASTCALL: case FASTCALL_WITH_KEYWORDS: case METHOD: - return factory.createBuiltinFunction(name, type, defaults, kwDefaults, flags, callTarget); - } - return factory.createWrapperDescriptor(name, type, defaults, kwDefaults, flags, callTarget, slot, sig); - } - - /** - * {@link #createWrapperFunction(TruffleString, Object, Object, int, PExternalFunctionWrapper, PythonLanguage, PythonObjectFactory, boolean)}. - */ - @TruffleBoundary - public static PBuiltinFunction createWrapperFunction(TruffleString name, TpSlotCExtNative slot, Object enclosingType, PExternalFunctionWrapper sig, PythonLanguage language, - PythonObjectFactory factory) { - RootCallTarget callTarget = getOrCreateCallTarget(sig, language, name, true, false); - if (callTarget == null) { - return null; + return PFactory.createBuiltinFunction(language, name, type, defaults, kwDefaults, flags, callTarget); + case NEW: + return PFactory.createNewWrapper(language, type, defaults, kwDefaults, callTarget, slot); } - var kwDefaults = ExternalFunctionNodes.createKwDefaults(slot.getCallable()); - Object[] defaults = PBuiltinFunction.generateDefaults(sig.numDefaults); - return factory.createWrapperDescriptor(name, enclosingType, defaults, kwDefaults, 0, callTarget, slot, sig); + return PFactory.createWrapperDescriptor(language, name, type, defaults, kwDefaults, flags, callTarget, slot, sig); } private static boolean isClosurePointer(PythonContext context, Object callable, InteropLibrary lib) { @@ -749,21 +717,15 @@ private static boolean isClosurePointer(PythonContext context, Object callable, private static int getCompareOpCode(PExternalFunctionWrapper sig) { // op codes for binary comparisons (defined in 'object.h') - switch (sig) { - case LT: - return 0; - case LE: - return 1; - case EQ: - return 2; - case NE: - return 3; - case GT: - return 4; - case GE: - return 5; - } - throw CompilerDirectives.shouldNotReachHere(); + return switch (sig) { + case LT -> RichCmpOp.Py_LT.asNative(); + case LE -> RichCmpOp.Py_LE.asNative(); + case EQ -> RichCmpOp.Py_EQ.asNative(); + case NE -> RichCmpOp.Py_NE.asNative(); + case GT -> RichCmpOp.Py_GT.asNative(); + case GE -> RichCmpOp.Py_GE.asNative(); + default -> throw CompilerDirectives.shouldNotReachHere(sig.getName()); + }; } CheckFunctionResultNode createCheckFunctionResultNode() { @@ -808,11 +770,11 @@ public String getSignature() { } private static Signature createSignature(boolean takesVarKeywordArgs, int varArgIndex, TruffleString[] parameters, boolean checkEnclosingType, boolean hidden) { - return new Signature(-1, takesVarKeywordArgs, varArgIndex, false, parameters, KEYWORDS_HIDDEN_CALLABLE, checkEnclosingType, T_EMPTY_STRING, hidden); + return new Signature(-1, takesVarKeywordArgs, varArgIndex, parameters, KEYWORDS_HIDDEN_CALLABLE, checkEnclosingType, T_EMPTY_STRING, hidden); } private static Signature createSignatureWithClosure(boolean takesVarKeywordArgs, int varArgIndex, TruffleString[] parameters, boolean checkEnclosingType, boolean hidden) { - return new Signature(-1, takesVarKeywordArgs, varArgIndex, false, parameters, KEYWORDS_HIDDEN_CALLABLE_AND_CLOSURE, checkEnclosingType, T_EMPTY_STRING, hidden); + return new Signature(-1, takesVarKeywordArgs, varArgIndex, parameters, KEYWORDS_HIDDEN_CALLABLE_AND_CLOSURE, checkEnclosingType, T_EMPTY_STRING, hidden); } static final class MethDirectRoot extends MethodDescriptorRoot { @@ -847,9 +809,6 @@ public static MethDirectRoot create(PythonLanguage lang, TruffleString name, PEx } } - /** - * Like {@link com.oracle.graal.python.nodes.call.FunctionInvokeNode} but invokes a C function. - */ @GenerateUncached @GenerateCached(false) @GenerateInline @@ -876,10 +835,10 @@ static Object invoke(VirtualFrame frame, Node inliningTarget, PythonThreadState return lib.execute(callable, cArguments); } catch (UnsupportedTypeException | UnsupportedMessageException e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, TypeError, ErrorMessages.CALLING_NATIVE_FUNC_FAILED, name, e); + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CALLING_NATIVE_FUNC_FAILED, name, e); } catch (ArityException e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, TypeError, ErrorMessages.CALLING_NATIVE_FUNC_EXPECTED_ARGS, name, e.getExpectedMinArity(), e.getActualArity()); + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CALLING_NATIVE_FUNC_EXPECTED_ARGS, name, e.getExpectedMinArity(), e.getActualArity()); } catch (Throwable exception) { /* * Always re-acquire the GIL here. This is necessary because it could happen that C @@ -975,7 +934,7 @@ public abstract static class MethodDescriptorRoot extends PRootNode { private final PExternalFunctionWrapper provider; private final CApiTiming timing; @Child private CalleeContext calleeContext = CalleeContext.create(); - @Child private CallVarargsMethodNode invokeNode; + @Child private CallNode invokeNode; @Child private ExternalFunctionWrapperInvokeNode externalInvokeNode; @Child private ReadIndexedArgumentNode readSelfNode; @Child private ReadIndexedArgumentNode readCallableNode; @@ -998,7 +957,7 @@ public abstract static class MethodDescriptorRoot extends PRootNode { this.externalInvokeNode = ExternalFunctionWrapperInvokeNode.create(); this.convertArgs = provider.createConvertArgNodes(); } else { - this.invokeNode = CallVarargsMethodNode.create(); + this.invokeNode = CallNode.create(); this.convertArgs = null; } if (!isStatic) { @@ -1124,23 +1083,17 @@ protected final Object readSelf(VirtualFrame frame) { } } - public static final class MethKeywordsRoot extends MethodDescriptorRoot { + public static class MethKeywordsRoot extends MethodDescriptorRoot { private static final Signature SIGNATURE = createSignature(true, 1, tsArray("self"), true, true); - @Child private PythonObjectFactory factory; - @Child private ReadVarArgsNode readVarargsNode; - @Child private ReadVarKeywordsNode readKwargsNode; - @Child private CreateArgsTupleNode createArgsTupleNode; - @Child private ReleaseNativeSequenceStorageNode freeNode; + @Child protected ReadVarArgsNode readVarargsNode; + @Child protected ReadVarKeywordsNode readKwargsNode; + @Child protected CreateArgsTupleNode createArgsTupleNode; + @Child protected ReleaseNativeSequenceStorageNode freeNode; - private boolean seenNativeArgsTupleStorage; - - public MethKeywordsRoot(PythonLanguage language, TruffleString name, boolean isStatic) { - super(language, name, isStatic); - } + protected boolean seenNativeArgsTupleStorage; public MethKeywordsRoot(PythonLanguage language, TruffleString name, boolean isStatic, PExternalFunctionWrapper provider) { super(language, name, isStatic, provider); - this.factory = PythonObjectFactory.create(); this.readVarargsNode = ReadVarArgsNode.create(true); this.readKwargsNode = ReadVarKeywordsNode.create(PythonUtils.EMPTY_TRUFFLESTRING_ARRAY); this.createArgsTupleNode = CreateArgsTupleNodeGen.create(); @@ -1152,7 +1105,8 @@ protected Object[] prepareCArguments(VirtualFrame frame) { Object self = readSelf(frame); Object[] args = readVarargsNode.executeObjectArray(frame); PKeyword[] kwargs = readKwargsNode.executePKeyword(frame); - return new Object[]{self, createArgsTupleNode.execute(factory, args, seenNativeArgsTupleStorage), factory.createDict(kwargs)}; + PythonLanguage language = getLanguage(PythonLanguage.class); + return new Object[]{self, createArgsTupleNode.execute(language, args, seenNativeArgsTupleStorage), PFactory.createDict(language, kwargs)}; } @Override @@ -1174,7 +1128,6 @@ public Signature getSignature() { public static final class MethVarargsRoot extends MethodDescriptorRoot { private static final Signature SIGNATURE = createSignature(false, 1, tsArray("self"), true, true); - @Child private PythonObjectFactory factory; @Child private ReadVarArgsNode readVarargsNode; @Child private CreateArgsTupleNode createArgsTupleNode; @Child private ReleaseNativeSequenceStorageNode freeNode; @@ -1187,7 +1140,6 @@ public MethVarargsRoot(PythonLanguage language, TruffleString name, boolean isSt public MethVarargsRoot(PythonLanguage language, TruffleString name, boolean isStatic, PExternalFunctionWrapper provider) { super(language, name, isStatic, provider); - this.factory = PythonObjectFactory.create(); this.readVarargsNode = ReadVarArgsNode.create(true); this.createArgsTupleNode = CreateArgsTupleNodeGen.create(); this.freeNode = ReleaseNativeSequenceStorageNodeGen.create(); @@ -1197,7 +1149,7 @@ public MethVarargsRoot(PythonLanguage language, TruffleString name, boolean isSt protected Object[] prepareCArguments(VirtualFrame frame) { Object self = readSelf(frame); Object[] args = readVarargsNode.executeObjectArray(frame); - return new Object[]{self, createArgsTupleNode.execute(factory, args, seenNativeArgsTupleStorage)}; + return new Object[]{self, createArgsTupleNode.execute(getLanguage(PythonLanguage.class), args, seenNativeArgsTupleStorage)}; } @Override @@ -1266,6 +1218,25 @@ public Signature getSignature() { } } + public static final class MethNewRoot extends MethKeywordsRoot { + + public MethNewRoot(PythonLanguage language, TruffleString name, boolean isStatic, PExternalFunctionWrapper provider) { + super(language, name, isStatic, provider); + } + + @Override + protected Object[] prepareCArguments(VirtualFrame frame) { + Object methodSelf = readSelf(frame); + Object[] args = readVarargsNode.executeObjectArray(frame); + // TODO checks + Object self = args[0]; + args = PythonUtils.arrayCopyOfRange(args, 1, args.length); + PKeyword[] kwargs = readKwargsNode.executePKeyword(frame); + PythonLanguage language = getLanguage(PythonLanguage.class); + return new Object[]{self, createArgsTupleNode.execute(language, args, seenNativeArgsTupleStorage), PFactory.createDict(language, kwargs)}; + } + } + public static final class MethInquiryRoot extends MethodDescriptorRoot { private static final Signature SIGNATURE = createSignature(false, -1, tsArray("self"), true, false); @@ -1306,7 +1277,7 @@ public MethNoargsRoot(PythonLanguage language, TruffleString name, boolean isSta @Override protected Object[] prepareCArguments(VirtualFrame frame) { - return new Object[]{readSelf(frame), PNone.NONE}; + return new Object[]{readSelf(frame), PNone.NO_VALUE}; } @Override @@ -1355,7 +1326,6 @@ public Signature getSignature() { public static final class MethFastcallWithKeywordsRoot extends MethodDescriptorRoot { private static final Signature SIGNATURE = createSignature(true, 1, tsArray("self"), true, true); - @Child private PythonObjectFactory factory; @Child private ReadVarArgsNode readVarargsNode; @Child private ReadVarKeywordsNode readKwargsNode; @@ -1365,7 +1335,6 @@ public MethFastcallWithKeywordsRoot(PythonLanguage language, TruffleString name, public MethFastcallWithKeywordsRoot(PythonLanguage language, TruffleString name, boolean isStatic, PExternalFunctionWrapper provider) { super(language, name, isStatic, provider); - this.factory = PythonObjectFactory.create(); this.readVarargsNode = ReadVarArgsNode.create(true); this.readKwargsNode = ReadVarKeywordsNode.create(PythonUtils.EMPTY_TRUFFLESTRING_ARRAY); } @@ -1376,13 +1345,18 @@ protected Object[] prepareCArguments(VirtualFrame frame) { Object[] args = readVarargsNode.executeObjectArray(frame); PKeyword[] kwargs = readKwargsNode.executePKeyword(frame); Object[] fastcallArgs = new Object[args.length + kwargs.length]; - Object[] fastcallKwnames = new Object[kwargs.length]; + Object kwnamesTuple = PNone.NO_VALUE; PythonUtils.arraycopy(args, 0, fastcallArgs, 0, args.length); - for (int i = 0; i < kwargs.length; i++) { - fastcallKwnames[i] = kwargs[i].getName(); - fastcallArgs[args.length + i] = kwargs[i].getValue(); + // Note: PyO3 doesn't like it when we put an empty tuple there if there are no args + if (kwargs.length > 0) { + Object[] fastcallKwnames = new Object[kwargs.length]; + for (int i = 0; i < kwargs.length; i++) { + fastcallKwnames[i] = kwargs[i].getName(); + fastcallArgs[args.length + i] = kwargs[i].getValue(); + } + kwnamesTuple = PFactory.createTuple(PythonLanguage.get(this), fastcallKwnames); } - return new Object[]{self, new CPyObjectArrayWrapper(fastcallArgs), args.length, factory.createTuple(fastcallKwnames)}; + return new Object[]{self, new CPyObjectArrayWrapper(fastcallArgs), args.length, kwnamesTuple}; } @Override @@ -1402,7 +1376,6 @@ public Signature getSignature() { public static final class MethMethodRoot extends MethodDescriptorRoot { private static final Signature SIGNATURE = createSignature(true, 1, tsArray("self", "cls"), true, true); - @Child private PythonObjectFactory factory; @Child private ReadIndexedArgumentNode readClsNode; @Child private ReadVarArgsNode readVarargsNode; @Child private ReadVarKeywordsNode readKwargsNode; @@ -1413,7 +1386,6 @@ public MethMethodRoot(PythonLanguage language, TruffleString name, boolean isSta public MethMethodRoot(PythonLanguage language, TruffleString name, boolean isStatic, PExternalFunctionWrapper provider) { super(language, name, isStatic, provider); - this.factory = PythonObjectFactory.create(); this.readClsNode = ReadIndexedArgumentNode.create(1); this.readVarargsNode = ReadVarArgsNode.create(true); this.readKwargsNode = ReadVarKeywordsNode.create(PythonUtils.EMPTY_TRUFFLESTRING_ARRAY); @@ -1432,7 +1404,7 @@ protected Object[] prepareCArguments(VirtualFrame frame) { fastcallKwnames[i] = kwargs[i].getName(); fastcallArgs[args.length + i] = kwargs[i].getValue(); } - return new Object[]{self, cls, new CPyObjectArrayWrapper(fastcallArgs), args.length, factory.createTuple(fastcallKwnames)}; + return new Object[]{self, cls, new CPyObjectArrayWrapper(fastcallArgs), args.length, PFactory.createTuple(PythonLanguage.get(this), fastcallKwnames)}; } @Override @@ -2165,6 +2137,52 @@ private ReadIndexedArgumentNode ensureReadArgNode() { } } + /** + * An inlined node-like object for keeping track of eager native allocation state bit. Should be + * {@code @Cached} and passed into + * {@link CreateArgsTupleNode#execute(Node, PythonLanguage, Object[], EagerTupleState)}. Then + * the {@link #report(Node, PTuple)} method should be called with the tuple after the native + * call returns. + */ + public static final class EagerTupleState { + private final StateField state; + + private static final EagerTupleState UNCACHED = new EagerTupleState(); + + private EagerTupleState() { + this.state = null; + } + + private EagerTupleState(InlineTarget target) { + this.state = target.getState(0, 1); + } + + public boolean isEager(Node inliningTarget) { + if (state == null) { + return false; + } + return state.get(inliningTarget) != 0; + } + + public void report(Node inliningTarget, PTuple tuple) { + if (state != null) { + if (!isEager(inliningTarget) && tuple.getSequenceStorage() instanceof NativeSequenceStorage) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + state.set(inliningTarget, 1); + } + } + } + + public static EagerTupleState inline( + @RequiredField(value = StateField.class, bits = 1) InlineTarget target) { + return new EagerTupleState(target); + } + + public static EagerTupleState getUncached() { + return UNCACHED; + } + } + /** * We need to inflate all primitives in order to avoid memory leaks. Explanation: Primitives * would currently be wrapped into a PrimitiveNativeWrapper. If any of those will receive a @@ -2174,44 +2192,49 @@ private ReadIndexedArgumentNode ensureReadArgNode() { * arguments after the call returned. */ @GenerateInline(false) - abstract static class CreateArgsTupleNode extends Node { - public abstract PTuple execute(PythonObjectFactory factory, Object[] args, boolean eagerNative); + @GenerateUncached + public abstract static class CreateArgsTupleNode extends Node { + public abstract PTuple execute(PythonLanguage language, Object[] args, boolean eagerNative); + + public final PTuple execute(Node inliningTarget, PythonLanguage language, Object[] args, EagerTupleState state) { + return execute(language, args, state.isEager(inliningTarget)); + } @Specialization(guards = {"args.length == cachedLen", "cachedLen <= 8", "!eagerNative"}, limit = "1") @ExplodeLoop(kind = LoopExplosionKind.FULL_UNROLL) - static PTuple doCachedLen(PythonObjectFactory factory, Object[] args, @SuppressWarnings("unused") boolean eagerNative, + static PTuple doCachedLen(PythonLanguage language, Object[] args, @SuppressWarnings("unused") boolean eagerNative, @Cached("args.length") int cachedLen, @Cached("createMaterializeNodes(args.length)") MaterializePrimitiveNode[] materializePrimitiveNodes) { for (int i = 0; i < cachedLen; i++) { - args[i] = materializePrimitiveNodes[i].execute(factory, args[i]); + args[i] = materializePrimitiveNodes[i].execute(language, args[i]); } - return factory.createTuple(args); + return PFactory.createTuple(language, args); } @Specialization(guards = {"args.length == cachedLen", "cachedLen <= 8", "eagerNative"}, limit = "1", replaces = "doCachedLen") @ExplodeLoop(kind = LoopExplosionKind.FULL_UNROLL) - static PTuple doCachedLenEagerNative(PythonObjectFactory factory, Object[] args, @SuppressWarnings("unused") boolean eagerNative, + static PTuple doCachedLenEagerNative(PythonLanguage language, Object[] args, @SuppressWarnings("unused") boolean eagerNative, @Bind("this") Node inliningTarget, @Cached("args.length") int cachedLen, @Cached("createMaterializeNodes(args.length)") MaterializePrimitiveNode[] materializePrimitiveNodes, @Exclusive @Cached StorageToNativeNode storageToNativeNode) { for (int i = 0; i < cachedLen; i++) { - args[i] = materializePrimitiveNodes[i].execute(factory, args[i]); + args[i] = materializePrimitiveNodes[i].execute(language, args[i]); } - return factory.createTuple(storageToNativeNode.execute(inliningTarget, args, cachedLen, true)); + return PFactory.createTuple(language, storageToNativeNode.execute(inliningTarget, args, cachedLen, true)); } @Specialization(replaces = {"doCachedLen", "doCachedLenEagerNative"}) - static PTuple doGeneric(PythonObjectFactory factory, Object[] args, boolean eagerNative, + static PTuple doGeneric(PythonLanguage language, Object[] args, boolean eagerNative, @Bind("this") Node inliningTarget, @Cached MaterializePrimitiveNode materializePrimitiveNode, @Exclusive @Cached StorageToNativeNode storageToNativeNode) { int n = args.length; for (int i = 0; i < n; i++) { - args[i] = materializePrimitiveNode.execute(factory, args[i]); + args[i] = materializePrimitiveNode.execute(language, args[i]); } SequenceStorage storage; if (eagerNative) { @@ -2219,7 +2242,7 @@ static PTuple doGeneric(PythonObjectFactory factory, Object[] args, boolean eage } else { storage = new ObjectSequenceStorage(args); } - return factory.createTuple(storage); + return PFactory.createTuple(language, storage); } static MaterializePrimitiveNode[] createMaterializeNodes(int length) { @@ -2229,14 +2252,6 @@ static MaterializePrimitiveNode[] createMaterializeNodes(int length) { } return materializePrimitiveNodes; } - - static PythonToNativeNode[] createPythonToNativeNodes(int length) { - PythonToNativeNode[] pythonToNativeNodes = new PythonToNativeNode[length]; - for (int i = 0; i < length; i++) { - pythonToNativeNodes[i] = PythonToNativeNodeGen.create(); - } - return pythonToNativeNodes; - } } @GenerateInline(false) @@ -2280,42 +2295,38 @@ static void doObjectGeneric(NativeObjectSequenceStorage storage, * Special helper nodes that materializes any primitive that would leak the wrapper if the * reference is owned by managed code only. */ - @TypeSystemReference(PythonTypes.class) @GenerateInline(false) + @GenerateUncached abstract static class MaterializePrimitiveNode extends Node { - public abstract Object execute(PythonObjectFactory factory, Object object); + public abstract Object execute(PythonLanguage language, Object object); // NOTE: Booleans don't need to be materialized because they are singletons. @Specialization - static PInt doInteger(PythonObjectFactory factory, int i) { - return factory.createInt(i); + static PInt doInteger(PythonLanguage language, int i) { + return PFactory.createInt(language, i); } - @Specialization(replaces = "doInteger") - static PInt doLong(PythonObjectFactory factory, long l) { - return factory.createInt(l); + @Specialization + static PInt doLong(PythonLanguage language, long l) { + return PFactory.createInt(language, l); } @Specialization - static PFloat doDouble(PythonObjectFactory factory, double d) { - return factory.createFloat(d); + static PFloat doDouble(PythonLanguage language, double d) { + return PFactory.createFloat(language, d); } @Specialization - static PString doString(PythonObjectFactory factory, TruffleString s) { - return factory.createString(s); + static PString doString(PythonLanguage language, TruffleString s) { + return PFactory.createString(language, s); } - @Specialization(guards = "!needsMaterialization(object)") - static Object doObject(@SuppressWarnings("unused") PythonObjectFactory factory, Object object) { + @Fallback + static Object doObject(@SuppressWarnings("unused") PythonLanguage language, Object object) { return object; } - - static boolean needsMaterialization(Object object) { - return object instanceof Integer || object instanceof Long || PGuards.isDouble(object) || object instanceof TruffleString; - } } // roughly equivalent to _Py_CheckFunctionResult in Objects/call.c @@ -2448,7 +2459,7 @@ static Object doGeneric(PythonThreadState state, @SuppressWarnings("unused") Tru AbstractTruffleException currentException = state.getCurrentException(); // if no exception occurred, the iterator is exhausted -> raise StopIteration if (currentException == null) { - throw raiseNode.raiseStopIteration(); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.StopIteration); } else { throw clearCurrentExceptionNode.getCurrentExceptionForReraise(inliningTarget, state); } @@ -2588,7 +2599,7 @@ static boolean doGeneric(PythonThreadState threadState, TruffleString name, Obje } } CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, SystemError, ErrorMessages.FUNC_DIDNT_RETURN_INT, name); + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, ErrorMessages.FUNC_DIDNT_RETURN_INT, name); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/NativeCAPISymbol.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/NativeCAPISymbol.java index 3e44e0e477..9c03a2b4fd 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/NativeCAPISymbol.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/NativeCAPISymbol.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,11 +44,13 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.ConstCharPtrAsTruffleString; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.INT64_T; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int; +import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.IterResult; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.LONG_LONG; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PY_SSIZE_T_PTR; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Pointer; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer; +import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyThreadState; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyTypeObject; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Py_ssize_t; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.SIZE_T; @@ -71,6 +73,7 @@ public enum NativeCAPISymbol implements NativeCExtSymbol { FUN_VA_ARG_POINTER("truffle_va_arg_pointer", Pointer, Pointer), FUN_CONVERT_POINTER("truffle_convert_pointer", Pointer, Py_ssize_t), FUN_NO_OP_CLEAR("truffle_no_op_clear", Int, PyObject), + FUN_NO_OP_TRAVERSE("truffle_no_op_traverse", Int, PyObject, Pointer, Pointer), FUN_PYTRUFFLE_CONSTANTS("PyTruffle_constants", PY_SSIZE_T_PTR), FUN_PYTRUFFLE_STRUCT_OFFSETS("PyTruffle_struct_offsets", PY_SSIZE_T_PTR), @@ -121,7 +124,6 @@ public enum NativeCAPISymbol implements NativeCExtSymbol { /* Python C API functions */ - FUN_GET_METHODS_FLAGS("get_methods_flags", INT64_T, PyTypeObject), FUN_PTR_COMPARE("truffle_ptr_compare", Int, Pointer, Pointer, Int), FUN_PTR_ADD("truffle_ptr_add", Pointer, Pointer, Py_ssize_t), FUN_PY_TRUFFLE_OBJECT_ARRAY_RELEASE("PyTruffle_ObjectArrayRelease", ArgDescriptor.Void, Pointer, Int), @@ -130,13 +132,15 @@ public enum NativeCAPISymbol implements NativeCExtSymbol { FUN_PY_OBJECT_NEW("PyTruffle_Object_New", PyObjectTransfer, PyTypeObject), FUN_PY_TYPE_READY("PyType_Ready", Int, PyTypeObject), FUN_PY_TYPE_GENERIC_ALLOC("PyType_GenericAlloc", PyObjectTransfer, PyTypeObject, Py_ssize_t), - FUN_PY_OBJECT_GC_DEL("PyObject_GC_Del", Void, Pointer), + FUN_GRAALPY_OBJECT_GC_DEL("GraalPyObject_GC_Del", Void, Pointer), + FUN_PY_OBJECT_FREE("PyObject_Free", Void, Pointer), FUN_PY_UNICODE_GET_LENGTH("PyUnicode_GetLength", Py_ssize_t, PyObject), FUN_PY_TRUFFLE_FREE("PyTruffle_Free", ArgDescriptor.Void, Pointer), FUN_PYMEM_ALLOC("PyMem_Calloc", Pointer, SIZE_T, SIZE_T), FUN_PY_DEALLOC("_Py_Dealloc", Void, Pointer), FUN_BULK_DEALLOC("PyTruffle_bulk_DEALLOC", Py_ssize_t, Pointer, INT64_T), FUN_SHUTDOWN_BULK_DEALLOC("PyTruffle_shutdown_bulk_DEALLOC", Py_ssize_t, Pointer, INT64_T), + FUN_GET_CURRENT_RSS("PyTruffle_GetCurrentRSS", SIZE_T), FUN_TRUFFLE_ADD_SUBOFFSET("truffle_add_suboffset", Pointer, Pointer, Py_ssize_t, Py_ssize_t), FUN_PY_TRUFFLE_MEMORYVIEW_FROM_OBJECT("PyTruffle_MemoryViewFromObject", PyObjectTransfer, PyObject, Int), FUN_PY_TRUFFLE_RELEASE_BUFFER("PyTruffle_ReleaseBuffer", ArgDescriptor.Void, Pointer), @@ -159,6 +163,11 @@ public enum NativeCAPISymbol implements NativeCExtSymbol { FUN_PY_TRUFFLE_CDATA_INIT_BUFFER_PROTOCOL("PyTruffleCData_InitBufferProtocol", ArgDescriptor.Void, PyTypeObject), FUN_TRUFFLE_CHECK_TYPE_READY("truffle_check_type_ready", ArgDescriptor.Void, PyTypeObject), FUN_PYOBJECT_HASH_NOT_IMPLEMENTED("PyObject_HashNotImplemented", ArgDescriptor.Py_hash_t, PyObject), + FUN_PY_GC_COLLECT_NO_FAIL("_PyGC_CollectNoFail", Py_ssize_t, PyThreadState), + FUN_GRAALPY_GC_COLLECT("GraalPyGC_Collect", Py_ssize_t, Int), + FUN_SUBTYPE_TRAVERSE("subtype_traverse", Int, PyObject, Pointer, Pointer), + FUN_GRAALPYOBJECT_GC_NOTIFYOWNERSHIPTRANSFER("_GraalPyObject_GC_NotifyOwnershipTransfer", Void, PyObject), + FUN_PY_OBJECT_NEXT_NOT_IMPLEMENTED("_PyObject_NextNotImplemented", IterResult, PyObject), /* PyDateTime_CAPI */ diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PThreadState.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PThreadState.java index 65983bc242..cf70e5c5be 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PThreadState.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PThreadState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,13 +46,13 @@ import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitionsFactory.PythonToNativeNodeGen; import com.oracle.graal.python.builtins.objects.cext.structs.CFields; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; -import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccessFactory; import com.oracle.graal.python.builtins.objects.cext.structs.CStructs; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.exception.GetUnreifiedExceptionNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonContext.PythonThreadState; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.interop.InteropLibrary; @@ -105,21 +105,22 @@ private static Object allocateCLayout(PythonThreadState threadState) { PythonToNativeNode toNative = PythonToNativeNodeGen.getUncached(); Object ptr = CStructAccess.AllocateNode.allocUncached(CStructs.PyThreadState); - CStructAccess.WritePointerNode writePtrNode = CStructAccessFactory.WritePointerNodeGen.getUncached(); + CStructAccess.WritePointerNode writePtrNode = CStructAccess.WritePointerNode.getUncached(); PythonContext pythonContext = PythonContext.get(null); PDict threadStateDict = threadState.getDict(); if (threadStateDict == null) { - threadStateDict = pythonContext.factory().createDict(); + threadStateDict = PFactory.createDict(pythonContext.getLanguage()); threadState.setDict(threadStateDict); } writePtrNode.write(ptr, CFields.PyThreadState__dict, toNative.execute(threadStateDict)); - CApiContext cApiContext = PythonContext.get(null).getCApiContext(); + CApiContext cApiContext = pythonContext.getCApiContext(); writePtrNode.write(ptr, CFields.PyThreadState__small_ints, cApiContext.getOrCreateSmallInts()); if (threadState.getCurrentException() != null) { // See TransformExceptionToNativeNode Object exceptionType = GetClassNode.executeUncached(GetUnreifiedExceptionNode.executeUncached(threadState.getCurrentException())); CStructAccess.WritePointerNode.getUncached().write(ptr, CFields.PyThreadState__curexc_type, PythonToNativeNode.getUncached().execute(exceptionType)); } + writePtrNode.write(ptr, CFields.PyThreadState__gc, cApiContext.getGCState()); return ptr; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PrimitiveNativeWrapper.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PrimitiveNativeWrapper.java index 89e2217e88..1c6e717624 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PrimitiveNativeWrapper.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PrimitiveNativeWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -255,6 +255,11 @@ void toNative( @Bind("$node") Node inliningTarget, @Cached CApiTransitions.FirstToNativeNode firstToNativeNode) { if (!isNative()) { + if (isBool()) { + assert (PythonContext.get(inliningTarget).getCApiContext().getCachedBooleanPrimitiveNativeWrapper(value != 0) == this); + setNativePointer(firstToNativeNode.execute(inliningTarget, this, true /* immortal */)); + return; + } // small int values are cached and will be immortal boolean immortal = isIntLike() && CApiGuards.isSmallLong(value); // if this wrapper wraps a small int value, this wrapper is one of the cached primitive diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyCFunctionWrapper.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyCFunctionWrapper.java index df98a6e15f..5ba82fb1cf 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyCFunctionWrapper.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyCFunctionWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -49,35 +49,23 @@ import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNewRefNode; import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.TransformExceptionToNativeNode; import com.oracle.graal.python.builtins.objects.cext.common.CExtContext; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.BinaryBuiltinDescriptor; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.UnaryBuiltinDescriptor; -import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.function.Signature; -import com.oracle.graal.python.nodes.argument.CreateArgumentsNode.CreateAndCheckArgumentsNode; +import com.oracle.graal.python.nodes.argument.CreateArgumentsNode; import com.oracle.graal.python.nodes.argument.keywords.ExpandKeywordStarargsNode; import com.oracle.graal.python.nodes.argument.positional.ExecutePositionalStarargsNode; -import com.oracle.graal.python.nodes.call.CallTargetInvokeNode; -import com.oracle.graal.python.nodes.call.GenericInvokeNode; -import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; +import com.oracle.graal.python.nodes.call.CallDispatchers; import com.oracle.graal.python.runtime.GilNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CallTarget; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.GenerateCached; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.interop.ArityException; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.TruffleObject; @@ -93,9 +81,8 @@ /** * A wrapper class for managed functions such that they can be called with native function pointers * (like C type {@code PyCFunction}). This is very similar to {@link PyProcsWrapper} but the main - * difference is that this wrapper does not keep a reference to the function object but only to - * either the {@link RootCallTarget} or the {@link BuiltinMethodDescriptor} (in case of built-in - * functions). + * difference is that this wrapper does not keep a reference to the function object but only to the + * {@link RootCallTarget} *

      * Since in C, function pointers are expected to valid the whole time, NFI closure must be kept * alive as long as the context lives. Referencing a function object like {@link PyProcsWrapper} @@ -108,18 +95,6 @@ public abstract class PyCFunctionWrapper implements TruffleObject { protected final RootCallTarget callTarget; protected final Signature signature; protected final TruffleString callTargetName; - /** - * This uses the fact that {@link BuiltinMethodDescriptor} is context independent (but language - * dependent) so it is "more" shareable in the native, and we can use create a - * {@link BuiltinMethodDescriptor} not only for slots but for any builtin. - *

      - * Once {@link BuiltinMethodDescriptor} is phased out, we should reconsider if we need a context - * independent token for builtins for which one can look up a call target in the current - * language or a {@code PBuiltinFunction} in the current context. We can reuse the TpSlots - * mechanism like we reused {@link BuiltinMethodDescriptor} originally intended for slots only, - * but is it worth the effort and complexity? - */ - protected final BuiltinMethodDescriptor builtinMethodDescriptor; protected final CApiTiming timing; private long pointer; @@ -130,27 +105,14 @@ protected PyCFunctionWrapper(RootCallTarget callTarget, Signature signature) { this.signature = signature; String ctName = callTarget.getRootNode().getName(); this.callTargetName = PythonUtils.toTruffleStringUncached(ctName); - this.builtinMethodDescriptor = null; this.timing = CApiTiming.create(false, ctName); } - protected PyCFunctionWrapper(BuiltinMethodDescriptor builtinMethodDescriptor) { - assert builtinMethodDescriptor != null; - this.callTarget = null; - this.signature = null; - this.callTargetName = null; - this.builtinMethodDescriptor = builtinMethodDescriptor; - this.timing = CApiTiming.create(false, builtinMethodDescriptor.getName()); - } - public final RootCallTarget getCallTarget() { return callTarget; } public final Object getDelegate() { - if (builtinMethodDescriptor != null) { - return builtinMethodDescriptor; - } assert callTarget != null; return callTarget; } @@ -199,38 +161,18 @@ private static String toString(Object name, String flagsRepr, long pointer) { @Override @TruffleBoundary public String toString() { - return PyCFunctionWrapper.toString(builtinMethodDescriptor != null ? builtinMethodDescriptor.getName() : callTargetName, getFlagsRepr(), pointer); + return PyCFunctionWrapper.toString(callTargetName, getFlagsRepr(), pointer); } /** * Creates a wrapper for a {@link PBuiltinFunction} that can go to native. The flags are * required to determine the signature. The resulting {@link PyCFunctionWrapper} will not - * reference the built-in function object but will only wrap either its - * {@link BuiltinMethodDescriptor} (if available) or its {@link RootCallTarget}. + * reference the built-in function object but will only wrap its {@link RootCallTarget}. */ @TruffleBoundary public static PyCFunctionWrapper createFromBuiltinFunction(CApiContext cApiContext, PBuiltinFunction builtinFunction) { int flags = builtinFunction.getFlags(); - // try to use the BuiltinMethodDescriptor if available - BuiltinMethodDescriptor builtinMethodDescriptor = BuiltinMethodDescriptor.get(builtinFunction); - if (builtinMethodDescriptor != null) { - /* - * If we create a PyCFunctionWrapper for a BuiltinMethodDescriptor, we need to register - * the call target because it may happen that the wrapper is used to create another - * 'builtin_function_or_method' or 'method_descriptor' in which case we need to have the - * call target available. - */ - if (CExtContext.isMethNoArgs(flags) && builtinMethodDescriptor instanceof UnaryBuiltinDescriptor || - CExtContext.isMethO(flags) && builtinMethodDescriptor instanceof BinaryBuiltinDescriptor) { - cApiContext.getContext().getLanguage().registerBuiltinDescriptorCallTarget(builtinMethodDescriptor, builtinFunction.getCallTarget()); - } - if (CExtContext.isMethNoArgs(flags) && builtinMethodDescriptor instanceof UnaryBuiltinDescriptor) { - return cApiContext.getOrCreatePyCFunctionWrapper(builtinMethodDescriptor, PyCFunctionUnaryWrapper::new); - } else if (CExtContext.isMethO(flags) && builtinMethodDescriptor instanceof BinaryBuiltinDescriptor) { - return cApiContext.getOrCreatePyCFunctionWrapper(builtinMethodDescriptor, PyCFunctionBinaryWrapper::new); - } - } RootCallTarget ct = builtinFunction.getCallTarget(); Signature signature = builtinFunction.getSignature(); if (CExtContext.isMethNoArgs(flags)) { @@ -248,35 +190,6 @@ public static PyCFunctionWrapper createFromBuiltinFunction(CApiContext cApiConte } } - /** - * This is very much like {@link com.oracle.graal.python.nodes.call.CallDispatchNode} but just - * for calling {@link CallTarget call tagets} directly instead of function/method objects. This - * node essentially serves as an inline cache for the invoked call target. This node will - * automatically fall back to a {@link GenericInvokeNode} if the inline cache flows over. - */ - @GenerateUncached - @GenerateInline - @GenerateCached(false) - abstract static class CallTargetDispatchNode extends Node { - - abstract Object execute(Node inliningTarget, CallTarget ct, Object[] pythonArguments); - - @Specialization(guards = "ct == cachedCt", limit = "1") - static Object doCallTargetDirect(@SuppressWarnings("unused") CallTarget ct, Object[] args, - @SuppressWarnings("unused") @Cached(value = "ct", weak = true) CallTarget cachedCt, - @Cached("create(ct, true, false)") CallTargetInvokeNode callNode) { - assert PArguments.isPythonFrame(args); - return callNode.execute(null, null, null, null, args); - } - - @Specialization(replaces = "doCallTargetDirect") - static Object doCallTargetIndirect(CallTarget ct, Object[] args, - @Cached(inline = false) GenericInvokeNode callNode) { - assert PArguments.isPythonFrame(args); - return callNode.execute(ct, args); - } - } - @ExportLibrary(InteropLibrary.class) static final class PyCFunctionUnaryWrapper extends PyCFunctionWrapper { @@ -284,17 +197,12 @@ static final class PyCFunctionUnaryWrapper extends PyCFunctionWrapper { super(callTarget, signature); } - private PyCFunctionUnaryWrapper(BuiltinMethodDescriptor builtinMethodDescriptor) { - super(builtinMethodDescriptor); - } - @ExportMessage Object execute(Object[] arguments, @Bind("$node") Node inliningTarget, @Cached PythonToNativeNewRefNode toNativeNode, - @Cached CallUnaryMethodNode callUnaryNode, - @Cached CreateAndCheckArgumentsNode createArgsNode, - @Cached CallTargetDispatchNode invokeNode, + @Cached CreateArgumentsNode createArgsNode, + @Cached CallDispatchers.CallTargetCachedInvokeNode invokeNode, @Cached NativeToPythonNode toJavaNode, @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, @Exclusive @Cached GilNode gil) throws ArityException { @@ -312,16 +220,9 @@ Object execute(Object[] arguments, try { Object result; Object jArg0 = toJavaNode.execute(arguments[0]); - if (builtinMethodDescriptor != null) { - assert callTarget == null; - result = callUnaryNode.executeObject(null, builtinMethodDescriptor, jArg0); - } else { - assert callTarget != null; - assert callTargetName != null; - Object[] pArgs = createArgsNode.execute(inliningTarget, callTargetName, PythonUtils.EMPTY_OBJECT_ARRAY, PKeyword.EMPTY_KEYWORDS, signature, jArg0, null, - PythonUtils.EMPTY_OBJECT_ARRAY, PKeyword.EMPTY_KEYWORDS, false); - result = invokeNode.execute(inliningTarget, callTarget, pArgs); - } + Object[] pArgs = createArgsNode.execute(inliningTarget, callTargetName, PythonUtils.EMPTY_OBJECT_ARRAY, PKeyword.EMPTY_KEYWORDS, signature, jArg0, null, + PythonUtils.EMPTY_OBJECT_ARRAY, PKeyword.EMPTY_KEYWORDS, false); + result = invokeNode.execute(null, inliningTarget, callTarget, pArgs); return toNativeNode.execute(result); } catch (Throwable t) { throw checkThrowableBeforeNative(t, toString(), ""); @@ -353,17 +254,12 @@ static final class PyCFunctionBinaryWrapper extends PyCFunctionWrapper { super(callTarget, signature); } - private PyCFunctionBinaryWrapper(BuiltinMethodDescriptor builtinMethodDescriptor) { - super(builtinMethodDescriptor); - } - @ExportMessage Object execute(Object[] arguments, @Bind("$node") Node inliningTarget, @Cached PythonToNativeNewRefNode toNativeNode, - @Cached CallBinaryMethodNode callBinaryMethodNode, - @Cached CallTargetDispatchNode invokeNode, - @Cached CreateAndCheckArgumentsNode createArgsNode, + @Cached CallDispatchers.CallTargetCachedInvokeNode invokeNode, + @Cached CreateArgumentsNode createArgsNode, @Cached NativeToPythonNode toJavaNode, @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, @Exclusive @Cached GilNode gil) throws ArityException { @@ -378,17 +274,9 @@ Object execute(Object[] arguments, Object result; Object jArg0 = toJavaNode.execute(arguments[0]); Object jArg1 = toJavaNode.execute(arguments[1]); - if (builtinMethodDescriptor != null) { - assert callTarget == null; - assert builtinMethodDescriptor instanceof BinaryBuiltinDescriptor; - result = callBinaryMethodNode.executeObject(builtinMethodDescriptor, jArg0, jArg1); - } else { - assert callTarget != null; - assert callTargetName != null; - Object[] pArgs = createArgsNode.execute(inliningTarget, callTargetName, new Object[]{jArg1}, PKeyword.EMPTY_KEYWORDS, signature, jArg0, null, - PythonUtils.EMPTY_OBJECT_ARRAY, PKeyword.EMPTY_KEYWORDS, false); - result = invokeNode.execute(inliningTarget, callTarget, pArgs); - } + Object[] pArgs = createArgsNode.execute(inliningTarget, callTargetName, new Object[]{jArg1}, PKeyword.EMPTY_KEYWORDS, signature, jArg0, null, + PythonUtils.EMPTY_OBJECT_ARRAY, PKeyword.EMPTY_KEYWORDS, false); + result = invokeNode.execute(null, inliningTarget, callTarget, pArgs); return toNativeNode.execute(result); } catch (Throwable t) { throw checkThrowableBeforeNative(t, toString(), ""); @@ -439,8 +327,8 @@ Object execute(Object[] arguments, @Bind("$node") Node inliningTarget, @Cached PythonToNativeNewRefNode toNativeNode, @Cached ExecutePositionalStarargsNode posStarargsNode, - @Cached CreateAndCheckArgumentsNode createArgsNode, - @Cached CallTargetDispatchNode invokeNode, + @Cached CreateArgumentsNode createArgsNode, + @Cached CallDispatchers.CallTargetCachedInvokeNode invokeNode, @Cached NativeToPythonNode toJavaNode, @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, @Exclusive @Cached GilNode gil) throws ArityException { @@ -455,13 +343,10 @@ Object execute(Object[] arguments, Object result; Object receiver = toJavaNode.execute(arguments[0]); Object starArgs = toJavaNode.execute(arguments[1]); - // currently, we do not have a BuiltinMethodDescriptor for varargs functions - assert builtinMethodDescriptor == null; - assert callTarget != null; Object[] starArgsArray = posStarargsNode.executeWith(null, starArgs); Object[] pArgs = createArgsNode.execute(inliningTarget, callTargetName, starArgsArray, PKeyword.EMPTY_KEYWORDS, signature, receiver, null, PBuiltinFunction.generateDefaults(numDefaults), PKeyword.EMPTY_KEYWORDS, false); - result = invokeNode.execute(inliningTarget, callTarget, pArgs); + result = invokeNode.execute(null, inliningTarget, callTarget, pArgs); return toNativeNode.execute(result); } catch (Throwable t) { throw checkThrowableBeforeNative(t, toString(), ""); @@ -505,8 +390,8 @@ Object execute(Object[] arguments, @Bind("$node") Node inliningTarget, @Cached PythonToNativeNewRefNode toNativeNode, @Cached ExecutePositionalStarargsNode posStarargsNode, - @Cached CreateAndCheckArgumentsNode createArgsNode, - @Cached CallTargetDispatchNode invokeNode, + @Cached CreateArgumentsNode createArgsNode, + @Cached CallDispatchers.CallTargetCachedInvokeNode invokeNode, @Cached ExpandKeywordStarargsNode expandKwargsNode, @Cached NativeToPythonNode toJavaNode, @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, @@ -522,16 +407,12 @@ Object execute(Object[] arguments, Object receiver = toJavaNode.execute(arguments[0]); Object starArgs = toJavaNode.execute(arguments[1]); Object kwArgs = toJavaNode.execute(arguments[2]); - // currently, we do not have a BuiltinMethodDescriptor for varargs functions - assert builtinMethodDescriptor == null; - assert callTarget != null; - assert callTargetName != null; Object[] starArgsArray = posStarargsNode.executeWith(null, starArgs); PKeyword[] kwArgsArray = expandKwargsNode.execute(inliningTarget, kwArgs); Object[] pArgs = createArgsNode.execute(inliningTarget, callTargetName, starArgsArray, kwArgsArray, signature, receiver, null, PBuiltinFunction.generateDefaults(numDefaults), PKeyword.EMPTY_KEYWORDS, false); - Object result = invokeNode.execute(inliningTarget, callTarget, pArgs); + Object result = invokeNode.execute(null, inliningTarget, callTarget, pArgs); return toNativeNode.execute(result); } catch (Throwable t) { throw checkThrowableBeforeNative(t, toString(), ""); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyDateTimeCAPIWrapper.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyDateTimeCAPIWrapper.java index 5627ef162d..88dba50a3c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyDateTimeCAPIWrapper.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyDateTimeCAPIWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -61,6 +61,7 @@ import com.oracle.graal.python.lib.PyObjectSetAttr; import com.oracle.graal.python.nodes.statement.AbstractImportNode; import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.strings.TruffleString; @@ -95,7 +96,7 @@ public abstract class PyDateTimeCAPIWrapper { static final TruffleString T_DATETIME_CAPI = tsLiteral("datetime_CAPI"); - static final TruffleString T_PYDATETIME_CAPSULE_NAME = tsLiteral("datetime.datetime_CAPI"); + static final byte[] T_PYDATETIME_CAPSULE_NAME = PyCapsule.capsuleName("datetime.datetime_CAPI"); private static final TruffleString T_TIMEDELTA = tsLiteral("timedelta"); public static final TruffleString T_TZINFO = tsLiteral("tzinfo"); @@ -118,7 +119,7 @@ public static PyCapsule initWrapper(PythonContext context, CApiContext capiConte Object pointerObject = allocatePyDatetimeCAPI(datetimeModule); - PyCapsule capsule = context.factory().createCapsule(pointerObject, T_PYDATETIME_CAPSULE_NAME); + PyCapsule capsule = PFactory.createCapsuleJavaName(context.getLanguage(), pointerObject, T_PYDATETIME_CAPSULE_NAME); PyObjectSetAttr.executeUncached(datetimeModule, T_DATETIME_CAPI, capsule); assert PyObjectGetAttr.executeUncached(datetimeModule, T_DATETIME_CAPI) != context.getNativeNull(); return capsule; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyMemoryViewWrapper.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyMemoryViewWrapper.java index b9b0990e82..7184996c8e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyMemoryViewWrapper.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyMemoryViewWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,7 +40,6 @@ */ package com.oracle.graal.python.builtins.objects.cext.capi; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError; import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PTR_ADD; import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyMemoryViewObject__exports; import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyMemoryViewObject__flags; @@ -51,6 +50,7 @@ import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper.PythonAbstractObjectNativeWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNewRefNode; import com.oracle.graal.python.builtins.objects.cext.structs.CFields; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; @@ -58,9 +58,8 @@ import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView; import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.runtime.PythonContext; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.interop.InteropLibrary; @@ -89,49 +88,54 @@ private static Object intArrayToNativePySSizeArray(int[] intArray) { @TruffleBoundary private static Object allocate(PMemoryView object) { - if (object.isReleased()) { - throw PRaiseNode.raiseUncached(null, ValueError, ErrorMessages.MEMORYVIEW_FORBIDDEN_RELEASED); - } GetElementPtrNode getElementNode = GetElementPtrNode.getUncached(); CStructAccess.WritePointerNode writePointerNode = CStructAccess.WritePointerNode.getUncached(); CStructAccess.WriteLongNode writeI64Node = CStructAccess.WriteLongNode.getUncached(); CStructAccess.WriteIntNode writeI32Node = CStructAccess.WriteIntNode.getUncached(); CExtNodes.AsCharPointerNode asCharPointerNode = CExtNodes.AsCharPointerNode.getUncached(); - Object mem = CStructAccess.AllocateNode.allocUncached(PyMemoryViewObject); - writeI64Node.write(mem, PyObject__ob_refcnt, IMMORTAL_REFCNT); // TODO: immortal for now - writePointerNode.write(mem, PyObject__ob_type, PythonToNativeNewRefNode.executeUncached(GetClassNode.executeUncached(object))); + Object mem; + if (!PythonContext.get(null).isNativeAccessAllowed()) { // accommodate managed mode. + mem = CStructAccess.AllocateNode.allocUncached(PyMemoryViewObject.size()); /*- GC head alloc is not needed */ + writeI64Node.write(mem, PyObject__ob_refcnt, IMMORTAL_REFCNT); // TODO: immortal for now + writePointerNode.write(mem, PyObject__ob_type, PythonToNativeNewRefNode.executeUncached(GetClassNode.executeUncached(object))); + } else { + long taggedPointer = CApiTransitions.FirstToNativeNode.executeUncached(object.getNativeWrapper(), true /*- TODO: immortal for now */); + mem = CApiTransitions.HandlePointerConverter.pointerToStub(taggedPointer); + } writeI32Node.write(mem, PyMemoryViewObject__flags, object.getFlags()); writeI64Node.write(mem, PyMemoryViewObject__exports, object.getExports().get()); // TODO: ignoring mbuf, hash and weakreflist for now Object view = getElementNode.getElementPtr(mem, CFields.PyMemoryViewObject__view); - Object buf = object.getBufferPointer(); - if (buf == null) { - buf = PythonBufferAccessLibrary.getUncached().getNativePointer(object.getBuffer()); + if (object.getBuffer() != null) { + Object buf = object.getBufferPointer(); if (buf == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw shouldNotReachHere("Cannot convert managed object to native storage: " + object.getBuffer().getClass().getSimpleName()); + buf = PythonBufferAccessLibrary.getUncached().getNativePointer(object.getBuffer()); + if (buf == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + throw shouldNotReachHere("Cannot convert managed object to native storage: " + object.getBuffer().getClass().getSimpleName()); + } } - } - if (object.getOffset() != 0) { - if (buf instanceof Long ptr) { - buf = ptr + object.getOffset(); - } else { - InteropLibrary ptrLib = InteropLibrary.getUncached(buf); - if (ptrLib.isPointer(buf)) { - try { - buf = ptrLib.asPointer(buf) + object.getOffset(); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } + if (object.getOffset() != 0) { + if (buf instanceof Long ptr) { + buf = ptr + object.getOffset(); } else { - buf = CExtNodes.PCallCapiFunction.callUncached(FUN_PTR_ADD, buf, (long) object.getOffset()); + InteropLibrary ptrLib = InteropLibrary.getUncached(buf); + if (ptrLib.isPointer(buf)) { + try { + buf = ptrLib.asPointer(buf) + object.getOffset(); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } else { + buf = CExtNodes.PCallCapiFunction.callUncached(FUN_PTR_ADD, buf, (long) object.getOffset()); + } } } + writePointerNode.write(view, CFields.Py_buffer__buf, buf); } - writePointerNode.write(view, CFields.Py_buffer__buf, buf); if (object.getOwner() != null) { writePointerNode.write(view, CFields.Py_buffer__obj, PythonToNativeNewRefNode.executeUncached(object.getOwner())); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyMethodDefHelper.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyMethodDefHelper.java index 63d00f6ff2..d42a701ea4 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyMethodDefHelper.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyMethodDefHelper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -102,7 +102,7 @@ private static Object getMethFromBuiltinFunction(CApiContext cApiContext, PBuilt PKeyword[] kwDefaults = object.getKwDefaults(); for (int i = 0; i < kwDefaults.length; i++) { if (ExternalFunctionNodes.KW_CALLABLE.equals(kwDefaults[i].getName())) { - LOGGER.warning("re-creating PyMethodDef for native function " + object); + // This can happen for slot wrapper methods of native slots return kwDefaults[i].getValue(); } } @@ -156,7 +156,7 @@ Object allocate() { assert name != null; CStringWrapper nameWrapper; try { - nameWrapper = new CStringWrapper(name); + nameWrapper = new CStringWrapper(name.switchEncodingUncached(TruffleString.Encoding.UTF_8), TruffleString.Encoding.UTF_8); } catch (CannotCastException e) { throw CompilerDirectives.shouldNotReachHere(e); } @@ -166,7 +166,7 @@ Object allocate() { docWrapper = PythonContext.get(null).getNativeNull(); } else { try { - docWrapper = new CStringWrapper(doc); + docWrapper = new CStringWrapper(doc.switchEncodingUncached(TruffleString.Encoding.UTF_8), TruffleString.Encoding.UTF_8); } catch (CannotCastException e) { throw CompilerDirectives.shouldNotReachHere(e); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyProcsWrapper.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyProcsWrapper.java index c324355482..2793e15786 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyProcsWrapper.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyProcsWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,10 +40,11 @@ */ package com.oracle.graal.python.builtins.objects.cext.capi; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.checkThrowableBeforeNative; +import static com.oracle.graal.python.util.PythonUtils.EMPTY_OBJECT_ARRAY; import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper.PythonStructNativeWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.NativeToPythonNode; @@ -51,36 +52,45 @@ import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.TransformExceptionToNativeNode; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotManaged; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.CallSlotBinaryFuncNode; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpSlot; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.CallSlotBinaryOpNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.ReversibleSlot; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.CallSlotDescrGet; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrSet.CallSlotDescrSet; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotGetAttr.CallManagedSlotGetAttrNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.CallSlotHashFunNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.CallSlotNbBoolNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.CallSlotTpIterNextNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.CallSlotLenNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotMpAssSubscript.CallSlotMpAssSubscriptNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotNbPower.CallSlotNbInPlacePowerNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotNbPower.CallSlotNbPowerNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare.CallSlotRichCmpNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSetAttr.CallManagedSlotSetAttrNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.CallSlotSizeArgFun; -import com.oracle.graal.python.lib.PyObjectHashNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqAssItem.CallSlotSqAssItemNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqContains.CallSlotSqContainsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotUnaryFunc.CallSlotUnaryNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotVarargs.CallSlotTpCallNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotVarargs.CallSlotTpInitNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotVarargs.CallSlotTpNewNode; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.argument.keywords.ExpandKeywordStarargsNode; import com.oracle.graal.python.nodes.argument.positional.ExecutePositionalStarargsNode; import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode; -import com.oracle.graal.python.nodes.call.special.CallTernaryMethodNode; import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.util.CannotCastException; -import com.oracle.graal.python.nodes.util.CastUnsignedToJavaLongHashNode; import com.oracle.graal.python.runtime.GilNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; @@ -297,19 +307,63 @@ protected String getSignature() { @ExportLibrary(InteropLibrary.class) public static final class BinaryOpSlotFuncWrapper extends TpSlotWrapper { - private final BinaryOpSlot binaryOp; + private final ReversibleSlot binaryOp; - public BinaryOpSlotFuncWrapper(TpSlotManaged delegate, BinaryOpSlot binaryOp) { + public BinaryOpSlotFuncWrapper(TpSlotManaged delegate, ReversibleSlot binaryOp) { super(delegate); this.binaryOp = binaryOp; } public static BinaryOpSlotFuncWrapper createAdd(TpSlotManaged delegate) { - return new BinaryOpSlotFuncWrapper(delegate, BinaryOpSlot.NB_ADD); + return new BinaryOpSlotFuncWrapper(delegate, ReversibleSlot.NB_ADD); + } + + public static BinaryOpSlotFuncWrapper createSubtract(TpSlotManaged delegate) { + return new BinaryOpSlotFuncWrapper(delegate, ReversibleSlot.NB_SUBTRACT); } public static BinaryOpSlotFuncWrapper createMultiply(TpSlotManaged delegate) { - return new BinaryOpSlotFuncWrapper(delegate, BinaryOpSlot.NB_MULTIPLY); + return new BinaryOpSlotFuncWrapper(delegate, ReversibleSlot.NB_MULTIPLY); + } + + public static BinaryOpSlotFuncWrapper createRemainder(TpSlotManaged delegate) { + return new BinaryOpSlotFuncWrapper(delegate, ReversibleSlot.NB_REMAINDER); + } + + public static BinaryOpSlotFuncWrapper createLShift(TpSlotManaged delegate) { + return new BinaryOpSlotFuncWrapper(delegate, ReversibleSlot.NB_LSHIFT); + } + + public static BinaryOpSlotFuncWrapper createRShift(TpSlotManaged delegate) { + return new BinaryOpSlotFuncWrapper(delegate, ReversibleSlot.NB_RSHIFT); + } + + public static BinaryOpSlotFuncWrapper createAnd(TpSlotManaged delegate) { + return new BinaryOpSlotFuncWrapper(delegate, ReversibleSlot.NB_AND); + } + + public static BinaryOpSlotFuncWrapper createXor(TpSlotManaged delegate) { + return new BinaryOpSlotFuncWrapper(delegate, ReversibleSlot.NB_XOR); + } + + public static BinaryOpSlotFuncWrapper createOr(TpSlotManaged delegate) { + return new BinaryOpSlotFuncWrapper(delegate, ReversibleSlot.NB_OR); + } + + public static BinaryOpSlotFuncWrapper createFloorDivide(TpSlotManaged delegate) { + return new BinaryOpSlotFuncWrapper(delegate, ReversibleSlot.NB_FLOOR_DIVIDE); + } + + public static BinaryOpSlotFuncWrapper createTrueDivide(TpSlotManaged delegate) { + return new BinaryOpSlotFuncWrapper(delegate, ReversibleSlot.NB_TRUE_DIVIDE); + } + + public static BinaryOpSlotFuncWrapper createDivMod(TpSlotManaged delegate) { + return new BinaryOpSlotFuncWrapper(delegate, ReversibleSlot.NB_DIVMOD); + } + + public static BinaryOpSlotFuncWrapper createMatrixMultiply(TpSlotManaged delegate) { + return new BinaryOpSlotFuncWrapper(delegate, ReversibleSlot.NB_MATRIX_MULTIPLY); } @ExportMessage @@ -364,9 +418,9 @@ protected String getSignature() { } @ExportLibrary(InteropLibrary.class) - public static final class UnaryFuncWrapper extends PyProcsWrapper { + public static final class UnaryFuncLegacyWrapper extends PyProcsWrapper { - public UnaryFuncWrapper(Object delegate) { + public UnaryFuncLegacyWrapper(Object delegate) { super(delegate); } @@ -409,6 +463,99 @@ protected String getSignature() { } } + @ExportLibrary(InteropLibrary.class) + public static final class UnaryFuncWrapper extends TpSlotWrapper { + + public UnaryFuncWrapper(TpSlotManaged delegate) { + super(delegate); + } + + @Override + public TpSlotWrapper cloneWith(TpSlotManaged slot) { + return new UnaryFuncWrapper(slot); + } + + @ExportMessage + Object execute(Object[] arguments, + @Bind("$node") Node inliningTarget, + @Cached PythonToNativeNewRefNode toNativeNode, + @Cached CallSlotUnaryNode callNode, + @Cached NativeToPythonNode toJavaNode, + @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, + @Exclusive @Cached GilNode gil) throws ArityException { + boolean mustRelease = gil.acquire(); + CApiTiming.enter(); + try { + try { + Object result = callNode.execute(null, inliningTarget, getSlot(), toJavaNode.execute(arguments[0])); + return toNativeNode.execute(result); + } catch (Throwable t) { + throw checkThrowableBeforeNative(t, "UnaryFuncWrapper", getDelegate()); + } + } catch (PException e) { + transformExceptionToNativeNode.execute(inliningTarget, e); + return PythonContext.get(gil).getNativeNull(); + } finally { + CApiTiming.exit(timing); + gil.release(mustRelease); + } + } + + @Override + protected String getSignature() { + return "(POINTER):POINTER"; + } + } + + @ExportLibrary(InteropLibrary.class) + public static final class IterNextWrapper extends TpSlotWrapper { + + public IterNextWrapper(TpSlotManaged delegate) { + super(delegate); + } + + @Override + public TpSlotWrapper cloneWith(TpSlotManaged slot) { + return new IterNextWrapper(slot); + } + + @ExportMessage + Object execute(Object[] arguments, + @Bind("$node") Node inliningTarget, + @Cached PythonToNativeNewRefNode toNativeNode, + @Cached CallSlotTpIterNextNode callNextNode, + @Cached NativeToPythonNode toJavaNode, + @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, + @Exclusive @Cached GilNode gil) throws ArityException { + boolean mustRelease = gil.acquire(); + CApiTiming.enter(); + try { + try { + Object result; + try { + result = callNextNode.execute(null, inliningTarget, getSlot(), toJavaNode.execute(arguments[0])); + } catch (IteratorExhausted e) { + return PythonContext.get(inliningTarget).getNativeNull(); + } + return toNativeNode.execute(result); + } catch (Throwable t) { + throw checkThrowableBeforeNative(t, "UnaryFuncWrapper", getDelegate()); + } + } catch (PException e) { + transformExceptionToNativeNode.execute(inliningTarget, e); + return PythonContext.get(gil).getNativeNull(); + } finally { + CApiTiming.exit(timing); + gil.release(mustRelease); + } + } + + @Override + protected String getSignature() { + return "(POINTER):POINTER"; + } + } + @ExportLibrary(InteropLibrary.class) public static final class InquiryWrapper extends TpSlotWrapper { public InquiryWrapper(TpSlotManaged delegate) { @@ -455,16 +602,62 @@ public TpSlotWrapper cloneWith(TpSlotManaged slot) { } @ExportLibrary(InteropLibrary.class) - public static final class ObjobjargWrapper extends PyProcsWrapper { + public static final class SqContainsWrapper extends TpSlotWrapper { + public SqContainsWrapper(TpSlotManaged delegate) { + super(delegate); + } + + @ExportMessage + Object execute(Object[] arguments, + @Bind("$node") Node inliningTarget, + @Cached CallSlotSqContainsNode callSlotNode, + @Cached NativeToPythonNode toJavaNode, + @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, + @Exclusive @Cached GilNode gil) { + boolean mustRelease = gil.acquire(); + CApiTiming.enter(); + try { + try { + return callSlotNode.execute(null, inliningTarget, getSlot(), toJavaNode.execute(arguments[0]), toJavaNode.execute(arguments[1])); + } catch (Throwable t) { + throw checkThrowableBeforeNative(t, "SqContainsWrapper", getDelegate()); + } + } catch (PException e) { + transformExceptionToNativeNode.execute(inliningTarget, e); + return -1; + } finally { + CApiTiming.exit(timing); + gil.release(mustRelease); + } + } + + @Override + protected String getSignature() { + return "(POINTER,POINTER):SINT32"; + } + + @Override + public TpSlotWrapper cloneWith(TpSlotManaged slot) { + return new SqContainsWrapper(slot); + } + } + + @ExportLibrary(InteropLibrary.class) + public static final class ObjobjargWrapper extends TpSlotWrapper { - public ObjobjargWrapper(Object delegate) { + public ObjobjargWrapper(TpSlotManaged delegate) { super(delegate); } + @Override + public TpSlotWrapper cloneWith(TpSlotManaged slot) { + return new ObjobjargWrapper(slot); + } + @ExportMessage int execute(Object[] arguments, @Bind("$node") Node inliningTarget, - @Cached CallTernaryMethodNode callTernaryMethodNode, + @Cached CallSlotMpAssSubscriptNode callNode, @Cached NativeToPythonNode toJavaNode, @Cached InlinedConditionProfile arityProfile, @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, @@ -477,7 +670,7 @@ int execute(Object[] arguments, throw ArityException.create(3, 3, arguments.length); } try { - callTernaryMethodNode.execute(null, getDelegate(), toJavaNode.execute(arguments[0]), toJavaNode.execute(arguments[1]), toJavaNode.execute(arguments[2])); + callNode.execute(null, inliningTarget, getSlot(), toJavaNode.execute(arguments[0]), toJavaNode.execute(arguments[1]), toJavaNode.execute(arguments[2])); return 0; } catch (Throwable t) { throw checkThrowableBeforeNative(t, "ObjobjargWrapper", getDelegate()); @@ -591,113 +784,262 @@ public TpSlotWrapper cloneWith(TpSlotManaged slot) { } @ExportLibrary(InteropLibrary.class) - public static final class InitWrapper extends PyProcsWrapper { + public static final class InitWrapper extends TpSlotWrapper { - public InitWrapper(Object delegate) { + public InitWrapper(TpSlotManaged delegate) { super(delegate); } - @ExportMessage(name = "execute") - static class Execute { + @Override + public TpSlotWrapper cloneWith(TpSlotManaged slot) { + return new InitWrapper(slot); + } - @Specialization(guards = "arguments.length == 3") - static int init(InitWrapper self, Object[] arguments, - @Bind("this") Node inliningTarget, - @Cached ExecutePositionalStarargsNode posStarargsNode, - @Cached ExpandKeywordStarargsNode expandKwargsNode, - @Cached CallVarargsMethodNode callNode, - @Cached NativeToPythonNode toJavaNode, - @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, - @Exclusive @Cached GilNode gil) { - boolean mustRelease = gil.acquire(); - CApiTiming.enter(); + @ExportMessage + int execute(Object[] arguments, + @Bind("$node") Node inliningTarget, + @Cached ExecutePositionalStarargsNode posStarargsNode, + @Cached ExpandKeywordStarargsNode expandKwargsNode, + @Cached CallSlotTpInitNode callSlot, + @Cached NativeToPythonNode toJavaNode, + @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, + @Cached GilNode gil) { + boolean mustRelease = gil.acquire(); + CApiTiming.enter(); + try { try { - try { - // convert args - Object receiver = toJavaNode.execute(arguments[0]); - Object starArgs = toJavaNode.execute(arguments[1]); - Object kwArgs = toJavaNode.execute(arguments[2]); - - Object[] starArgsArray = posStarargsNode.executeWith(null, starArgs); - Object[] pArgs = PythonUtils.prependArgument(receiver, starArgsArray); - PKeyword[] kwArgsArray = expandKwargsNode.execute(inliningTarget, kwArgs); - callNode.execute(null, self.getDelegate(), pArgs, kwArgsArray); - return 0; - } catch (Throwable t) { - throw checkThrowableBeforeNative(t, "InitWrapper", self.getDelegate()); - } - } catch (PException e) { - transformExceptionToNativeNode.execute(inliningTarget, e); - return -1; - } finally { - CApiTiming.exit(self.timing); - gil.release(mustRelease); + // convert args + Object receiver = toJavaNode.execute(arguments[0]); + Object starArgs = toJavaNode.execute(arguments[1]); + Object kwArgs = toJavaNode.execute(arguments[2]); + + Object[] starArgsArray = posStarargsNode.executeWith(null, starArgs); + PKeyword[] kwArgsArray = expandKwargsNode.execute(inliningTarget, kwArgs); + callSlot.execute(null, inliningTarget, getSlot(), receiver, starArgsArray, kwArgsArray); + return 0; + } catch (Throwable t) { + throw checkThrowableBeforeNative(t, "InitWrapper", getDelegate()); } + } catch (PException e) { + transformExceptionToNativeNode.execute(inliningTarget, e); + return -1; + } finally { + CApiTiming.exit(timing); + gil.release(mustRelease); } + } - @Specialization(guards = "arguments.length != 3") - static int error(@SuppressWarnings("unused") InitWrapper self, Object[] arguments) throws ArityException { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw ArityException.create(3, 3, arguments.length); + @Override + protected String getSignature() { + return "(POINTER,POINTER,POINTER):SINT32"; + } + } + + @ExportLibrary(InteropLibrary.class) + public static final class NewWrapper extends TpSlotWrapper { + + public NewWrapper(TpSlotManaged delegate) { + super(delegate); + } + + @Override + public TpSlotWrapper cloneWith(TpSlotManaged slot) { + return new NewWrapper(slot); + } + + @ExportMessage + Object execute(Object[] arguments, + @Bind Node inliningTarget, + @Cached NativeToPythonNode toJavaNode, + @Cached PythonToNativeNewRefNode toNativeNode, + @Cached CallSlotTpNewNode callNew, + @Cached ExecutePositionalStarargsNode posStarargsNode, + @Cached ExpandKeywordStarargsNode expandKwargsNode, + @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, + @Cached GilNode gil) throws ArityException { + boolean mustRelease = gil.acquire(); + try { + try { + // convert args + Object receiver = toJavaNode.execute(arguments[0]); + Object starArgs = toJavaNode.execute(arguments[1]); + Object kwArgs = toJavaNode.execute(arguments[2]); + + Object[] pArgs; + if (starArgs != PNone.NO_VALUE) { + pArgs = posStarargsNode.executeWith(null, starArgs); + } else { + pArgs = EMPTY_OBJECT_ARRAY; + } + PKeyword[] kwArgsArray = expandKwargsNode.execute(inliningTarget, kwArgs); + + Object result = callNew.execute(null, inliningTarget, getSlot(), receiver, pArgs, kwArgsArray); + return toNativeNode.execute(result); + } catch (Throwable t) { + throw checkThrowableBeforeNative(t, "NewWrapper", getDelegate()); + } + } catch (PException e) { + transformExceptionToNativeNode.execute(inliningTarget, e); + return PythonContext.get(inliningTarget).getNativeNull(); + } finally { + gil.release(mustRelease); } } @Override protected String getSignature() { - return "(POINTER,POINTER,POINTER):SINT32"; + return "(POINTER,POINTER,POINTER):POINTER"; } } @ExportLibrary(InteropLibrary.class) - public static final class TernaryFunctionWrapper extends PyProcsWrapper { + public static final class CallWrapper extends TpSlotWrapper { - public TernaryFunctionWrapper(Object delegate) { + public CallWrapper(TpSlotManaged delegate) { super(delegate); } - @ExportMessage(name = "execute") - static class Execute { + @Override + public TpSlotWrapper cloneWith(TpSlotManaged slot) { + return new CallWrapper(slot); + } - @Specialization(guards = "arguments.length == 3") - static Object call(TernaryFunctionWrapper self, Object[] arguments, - @Bind("this") Node inliningTarget, - @Cached ExecutePositionalStarargsNode posStarargsNode, - @Cached ExpandKeywordStarargsNode expandKwargsNode, - @Cached CallVarargsMethodNode callNode, - @Cached NativeToPythonNode toJavaNode, - @Cached PythonToNativeNewRefNode toNativeNode, - @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, - @Exclusive @Cached GilNode gil) { - boolean mustRelease = gil.acquire(); - CApiTiming.enter(); + @ExportMessage + Object execute(Object[] arguments, + @Bind Node inliningTarget, + @Cached ExecutePositionalStarargsNode posStarargsNode, + @Cached ExpandKeywordStarargsNode expandKwargsNode, + @Cached CallSlotTpCallNode callNode, + @Cached NativeToPythonNode toJavaNode, + @Cached PythonToNativeNewRefNode toNativeNode, + @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, + @Cached GilNode gil) { + boolean mustRelease = gil.acquire(); + CApiTiming.enter(); + try { try { - try { - // convert args - Object receiver = toJavaNode.execute(arguments[0]); - Object starArgs = toJavaNode.execute(arguments[1]); - Object kwArgs = toJavaNode.execute(arguments[2]); + // convert args + Object receiver = toJavaNode.execute(arguments[0]); + Object starArgs = toJavaNode.execute(arguments[1]); + Object kwArgs = toJavaNode.execute(arguments[2]); - Object[] starArgsArray = posStarargsNode.executeWith(null, starArgs); - Object[] pArgs = PythonUtils.prependArgument(receiver, starArgsArray); - PKeyword[] kwArgsArray = expandKwargsNode.execute(inliningTarget, kwArgs); - Object result = callNode.execute(null, self.getDelegate(), pArgs, kwArgsArray); - return toNativeNode.execute(result); - } catch (Throwable t) { - throw checkThrowableBeforeNative(t, "TernaryFunctionWrapper", self.getDelegate()); - } - } catch (PException e) { - transformExceptionToNativeNode.execute(inliningTarget, e); - return PythonContext.get(gil).getNativeNull(); - } finally { - CApiTiming.exit(self.timing); - gil.release(mustRelease); + Object[] starArgsArray = posStarargsNode.executeWith(null, starArgs); + PKeyword[] kwArgsArray = expandKwargsNode.execute(inliningTarget, kwArgs); + Object result = callNode.execute(null, inliningTarget, getSlot(), receiver, starArgsArray, kwArgsArray); + return toNativeNode.execute(result); + } catch (Throwable t) { + throw checkThrowableBeforeNative(t, "CallWrapper", getDelegate()); } + } catch (PException e) { + transformExceptionToNativeNode.execute(inliningTarget, e); + return PythonContext.get(gil).getNativeNull(); + } finally { + CApiTiming.exit(timing); + gil.release(mustRelease); } + } - @Specialization(guards = "arguments.length != 3") - static Object error(@SuppressWarnings("unused") TernaryFunctionWrapper self, Object[] arguments) throws ArityException { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw ArityException.create(3, 3, arguments.length); + @Override + protected String getSignature() { + return "(POINTER,POINTER,POINTER):POINTER"; + } + } + + @ExportLibrary(InteropLibrary.class) + public static final class NbPowerWrapper extends TpSlotWrapper { + + public NbPowerWrapper(TpSlotManaged delegate) { + super(delegate); + } + + @Override + public TpSlotWrapper cloneWith(TpSlotManaged slot) { + return new NbPowerWrapper(slot); + } + + @ExportMessage + static Object execute(NbPowerWrapper self, Object[] arguments, + @Bind("$node") Node inliningTarget, + @Cached NativeToPythonNode toJavaNode, + @Cached PythonToNativeNewRefNode toNativeNode, + @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, + @Cached GetClassNode vGetClassNode, + @Cached GetClassNode wGetClassNode, + @Cached IsSameTypeNode isSameTypeNode, + @Cached GetCachedTpSlotsNode wGetSlots, + @Cached CallSlotNbPowerNode callSlot, + @Cached GilNode gil) { + boolean mustRelease = gil.acquire(); + CApiTiming.enter(); + try { + try { + // convert args + Object v = toJavaNode.execute(arguments[0]); + Object w = toJavaNode.execute(arguments[1]); + Object z = toJavaNode.execute(arguments[2]); + Object vType = vGetClassNode.execute(inliningTarget, v); + Object wType = wGetClassNode.execute(inliningTarget, w); + TpSlots wSlots = wGetSlots.execute(inliningTarget, wType); + boolean sameTypes = isSameTypeNode.execute(inliningTarget, vType, wType); + Object result = callSlot.execute(null, inliningTarget, self.getSlot(), v, vType, w, wSlots.nb_power(), wType, z, sameTypes); + return toNativeNode.execute(result); + } catch (Throwable t) { + throw checkThrowableBeforeNative(t, "NbPowerWrapper", self.getDelegate()); + } + } catch (PException e) { + transformExceptionToNativeNode.execute(inliningTarget, e); + return PythonContext.get(gil).getNativeNull(); + } finally { + CApiTiming.exit(self.timing); + gil.release(mustRelease); + } + } + + @Override + protected String getSignature() { + return "(POINTER,POINTER,POINTER):POINTER"; + } + } + + @ExportLibrary(InteropLibrary.class) + public static final class NbInPlacePowerWrapper extends TpSlotWrapper { + + public NbInPlacePowerWrapper(TpSlotManaged delegate) { + super(delegate); + } + + @Override + public TpSlotWrapper cloneWith(TpSlotManaged slot) { + return new NbInPlacePowerWrapper(slot); + } + + @ExportMessage + static Object execute(NbInPlacePowerWrapper self, Object[] arguments, + @Bind("$node") Node inliningTarget, + @Cached NativeToPythonNode toJavaNode, + @Cached PythonToNativeNewRefNode toNativeNode, + @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, + @Cached CallSlotNbInPlacePowerNode callSlot, + @Cached GilNode gil) { + boolean mustRelease = gil.acquire(); + CApiTiming.enter(); + try { + try { + // convert args + Object v = toJavaNode.execute(arguments[0]); + Object w = toJavaNode.execute(arguments[1]); + Object z = toJavaNode.execute(arguments[2]); + Object result = callSlot.execute(null, inliningTarget, self.getSlot(), v, w, z); + return toNativeNode.execute(result); + } catch (Throwable t) { + throw checkThrowableBeforeNative(t, "NbInPlacePowerWrapper", self.getDelegate()); + } + } catch (PException e) { + transformExceptionToNativeNode.execute(inliningTarget, e); + return PythonContext.get(gil).getNativeNull(); + } finally { + CApiTiming.exit(self.timing); + gil.release(mustRelease); } } @@ -708,19 +1050,25 @@ protected String getSignature() { } @ExportLibrary(InteropLibrary.class) - public static final class RichcmpFunctionWrapper extends PyProcsWrapper { + public static final class RichcmpFunctionWrapper extends TpSlotWrapper { - public RichcmpFunctionWrapper(Object delegate) { + public RichcmpFunctionWrapper(TpSlotManaged delegate) { super(delegate); } + @Override + public TpSlotWrapper cloneWith(TpSlotManaged slot) { + return new RichcmpFunctionWrapper(slot); + } + @ExportMessage Object execute(Object[] arguments, @Bind("$node") Node inliningTarget, @Cached NativeToPythonNode toJavaNode, - @Cached CallTernaryMethodNode callNode, + @Cached CallSlotRichCmpNode callNode, @Cached PythonToNativeNewRefNode toNativeNode, @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, + @CachedLibrary(limit = "1") InteropLibrary opInterop, @Exclusive @Cached GilNode gil) throws ArityException { boolean mustRelease = gil.acquire(); CApiTiming.enter(); @@ -733,9 +1081,8 @@ Object execute(Object[] arguments, // convert args Object arg0 = toJavaNode.execute(arguments[0]); Object arg1 = toJavaNode.execute(arguments[1]); - Object arg2 = arguments[2]; - - Object result = callNode.execute(null, getDelegate(), arg0, arg1, arg2); + RichCmpOp op = RichCmpOp.fromNative(opInterop.asInt(arguments[2])); + Object result = callNode.execute(null, inliningTarget, getSlot(), arg0, arg1, op); return toNativeNode.execute(result); } catch (Throwable t) { throw checkThrowableBeforeNative(t, "RichcmpFunctionWrapper", getDelegate()); @@ -872,7 +1219,7 @@ static int doL(Node inliningTarget, long l, return (int) l; } errorBranch.enter(inliningTarget); - throw PRaiseNode.raiseUncached(inliningTarget, PythonBuiltinClassType.IndexError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, l); + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.IndexError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, l); } @Fallback @@ -883,17 +1230,23 @@ static int doOthers(Object value) { } @ExportLibrary(InteropLibrary.class) - public static final class SsizeobjargfuncWrapper extends PyProcsWrapper { + public static final class SsizeobjargprocWrapper extends TpSlotWrapper { - public SsizeobjargfuncWrapper(Object delegate) { - super(delegate); + public SsizeobjargprocWrapper(TpSlotManaged slot) { + super(slot); + } + + @Override + public TpSlotWrapper cloneWith(TpSlotManaged slot) { + return new SsizeobjargprocWrapper(slot); } @ExportMessage int execute(Object[] arguments, @Bind("$node") Node inliningTarget, - @Cached CallTernaryMethodNode executeNode, + @Cached CallSlotSqAssItemNode executeNode, @Cached NativeToPythonNode toJavaNode, + @Cached SsizeAsIntNode asIntNode, @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, @Exclusive @Cached GilNode gil) throws ArityException { boolean mustRelease = gil.acquire(); @@ -905,10 +1258,13 @@ int execute(Object[] arguments, } assert arguments[1] instanceof Number; try { - executeNode.execute(null, getDelegate(), toJavaNode.execute(arguments[0]), arguments[1], toJavaNode.execute(arguments[2])); + Object self = toJavaNode.execute(arguments[0]); + int key = asIntNode.execute(inliningTarget, arguments[1]); + Object value = toJavaNode.execute(arguments[2]); + executeNode.execute(null, inliningTarget, getSlot(), self, key, value); return 0; } catch (Throwable t) { - throw checkThrowableBeforeNative(t, "SsizeobjargfuncWrapper", getDelegate()); + throw checkThrowableBeforeNative(t, "SsizeobjargprocWrapper", getDelegate()); } } catch (PException e) { transformExceptionToNativeNode.execute(inliningTarget, e); @@ -937,8 +1293,7 @@ long execute(Object[] arguments, @Cached CallSlotLenNode callSlotNode, @Cached NativeToPythonNode toJavaNode, @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, - @Cached PRaiseNode raiseNode, - @Exclusive @Cached GilNode gil) throws ArityException { + @Cached GilNode gil) throws ArityException { boolean mustRelease = gil.acquire(); CApiTiming.enter(); try { @@ -972,21 +1327,19 @@ public TpSlotWrapper cloneWith(TpSlotManaged slot) { } @ExportLibrary(InteropLibrary.class) - public static final class HashfuncWrapper extends PyProcsWrapper { + public static final class HashfuncWrapper extends TpSlotWrapper { - public HashfuncWrapper(Object delegate) { + public HashfuncWrapper(TpSlotManaged delegate) { super(delegate); } @ExportMessage long execute(Object[] arguments, - @Bind("$node") Node inliningTarget, - @Cached CallUnaryMethodNode executeNode, - @Cached CastUnsignedToJavaLongHashNode cast, + @Bind Node inliningTarget, + @Cached CallSlotHashFunNode callSlotNode, @Cached NativeToPythonNode toJavaNode, @Cached TransformExceptionToNativeNode transformExceptionToNativeNode, - @Exclusive @Cached GilNode gil, - @Cached PRaiseNode raiseNode) throws ArityException { + @Exclusive @Cached GilNode gil) throws ArityException { boolean mustRelease = gil.acquire(); CApiTiming.enter(); try { @@ -999,10 +1352,7 @@ long execute(Object[] arguments, throw ArityException.create(1, 2, arguments.length); } try { - Object result = executeNode.executeObject(null, getDelegate(), toJavaNode.execute(arguments[0])); - return PyObjectHashNode.avoidNegative1(cast.execute(inliningTarget, result)); - } catch (CannotCastException e) { - throw raiseNode.raise(TypeError, ErrorMessages.HASH_SHOULD_RETURN_INTEGER); + return callSlotNode.execute(null, inliningTarget, getSlot(), toJavaNode.execute(arguments[0])); } catch (Throwable t) { throw checkThrowableBeforeNative(t, "HashfuncWrapper", getDelegate()); } @@ -1019,6 +1369,11 @@ long execute(Object[] arguments, protected String getSignature() { return "(POINTER):SINT64"; } + + @Override + public TpSlotWrapper cloneWith(TpSlotManaged slot) { + return new HashfuncWrapper(slot); + } } @ExportLibrary(InteropLibrary.class) diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PythonClassNativeWrapper.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PythonClassNativeWrapper.java index db60febe02..1acf301f0c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PythonClassNativeWrapper.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PythonClassNativeWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -76,20 +76,20 @@ public final class PythonClassNativeWrapper extends PythonAbstractObjectNativeWrapper { private final CStringWrapper nameWrapper; - private PythonClassNativeWrapper(PythonManagedClass object, TruffleString name) { + private PythonClassNativeWrapper(PythonManagedClass object, TruffleString name, TruffleString.SwitchEncodingNode switchEncoding) { super(object, true); - this.nameWrapper = new CStringWrapper(name); + this.nameWrapper = new CStringWrapper(switchEncoding.execute(name, TruffleString.Encoding.UTF_8), TruffleString.Encoding.UTF_8); } public CStringWrapper getNameWrapper() { return nameWrapper; } - public static PythonClassNativeWrapper wrap(PythonManagedClass obj, TruffleString name) { + public static PythonClassNativeWrapper wrap(PythonManagedClass obj, TruffleString name, TruffleString.SwitchEncodingNode switchEncoding) { // important: native wrappers are cached PythonClassNativeWrapper nativeWrapper = obj.getClassNativeWrapper(); if (nativeWrapper == null) { - nativeWrapper = new PythonClassNativeWrapper(obj, name); + nativeWrapper = new PythonClassNativeWrapper(obj, name, switchEncoding); obj.setNativeWrapper(nativeWrapper); } return nativeWrapper; @@ -108,7 +108,7 @@ public static void wrapNative(PythonManagedClass clazz, TruffleString name, Obje throw CompilerDirectives.shouldNotReachHere(); } - PythonClassNativeWrapper wrapper = new PythonClassNativeWrapper(clazz, name); + PythonClassNativeWrapper wrapper = new PythonClassNativeWrapper(clazz, name, TruffleString.SwitchEncodingNode.getUncached()); clazz.setNativeWrapper(wrapper); CStructAccess.ReadI64Node readI64 = CStructAccess.ReadI64Node.getUncached(); @@ -140,6 +140,14 @@ public static void wrapNative(PythonManagedClass clazz, TruffleString name, Obje if (!PGuards.isNullOrZero(free_fun, lib)) { HiddenAttr.WriteNode.executeUncached(clazz, HiddenAttr.FREE, free_fun); } + Object traverse_fun = readPointer.read(pointer, CFields.PyTypeObject__tp_traverse); + if (!PGuards.isNullOrZero(traverse_fun, lib)) { + HiddenAttr.WriteNode.executeUncached(clazz, HiddenAttr.TRAVERSE, traverse_fun); + } + Object is_gc_fun = readPointer.read(pointer, CFields.PyTypeObject__tp_is_gc); + if (!PGuards.isNullOrZero(is_gc_fun, lib)) { + HiddenAttr.WriteNode.executeUncached(clazz, HiddenAttr.IS_GC, is_gc_fun); + } Object clear_fun = readPointer.read(pointer, CFields.PyTypeObject__tp_clear); if (!PGuards.isNullOrZero(clear_fun, lib)) { HiddenAttr.WriteNode.executeUncached(clazz, HiddenAttr.CLEAR, clear_fun); @@ -149,9 +157,16 @@ public static void wrapNative(PythonManagedClass clazz, TruffleString name, Obje HiddenAttr.WriteNode.executeUncached(clazz, HiddenAttr.AS_BUFFER, as_buffer); } - // initialize flags: - long flags = GetTypeFlagsNode.getUncached().execute(clazz); - flags |= TypeFlags.READY | TypeFlags.IMMUTABLETYPE; + /* + * Initialize type flags: If the native type, we are wrapping, already defines 'tp_flags', + * we use it because those must stay consistent with slots. For example, native + * tp_new/tp_alloc/tp_dealloc/tp_free functions must be consistent with + * 'Py_TPFLAGS_HAVE_GC'. + */ + long flags = readI64.read(pointer, CFields.PyTypeObject__tp_flags); + if (flags == 0) { + flags = GetTypeFlagsNode.executeUncached(clazz) | TypeFlags.READY | TypeFlags.IMMUTABLETYPE; + } SetTypeFlagsNode.executeUncached(clazz, flags); /* diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PythonNativeWrapper.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PythonNativeWrapper.java index bd564ab93f..5c307fcb9b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PythonNativeWrapper.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PythonNativeWrapper.java @@ -119,11 +119,11 @@ public final boolean isNative() { * transition code will consider that and eagerly return the pointer object. If {@code true} is * returned, the wrapper must also implement {@link #getReplacement(InteropLibrary)} which * returns the pointer object. Furthermore, wrappers must use - * {@link #registerReplacement(Object, InteropLibrary)} to register the allocated native memory - * in order that the native pointer can be resolved to the managed wrapper in the + * {@link #registerReplacement(Object, boolean, InteropLibrary)} to register the allocated + * native memory in order that the native pointer can be resolved to the managed wrapper in the * native-to-Python transition. *

      - * + * * @return {@code true} if the wrapper should be materialized eagerly, {@code false} otherwise. */ public final boolean isReplacingWrapper() { @@ -198,31 +198,17 @@ public final long getRefCount() { return MANAGED_REFCNT; } - /** - * Adjusts the native wrapper's reference to be weak (if {@code refCount <= MANAGED_REFCNT}) - * or to be strong (if {@code refCount > MANAGED_REFCNT}) if there is a reference. This - * method should be called at appropriate points in the program, e.g., it should be called - * from native code if the refcount falls below {@link #MANAGED_REFCNT}. - */ - public final void updateRef(Node inliningTarget, long refCount, InlinedConditionProfile hasRefProfile) { - if (hasRefProfile.profile(inliningTarget, ref != null)) { - if (refCount > MANAGED_REFCNT && !ref.isStrongReference()) { - ref.setStrongReference(this); - } else if (refCount <= MANAGED_REFCNT && ref.isStrongReference()) { - ref.setStrongReference(null); - } - } - } - @TruffleBoundary(allowInlining = true) - public void incRef() { + public long incRef() { assert isNative(); long pointer = HandlePointerConverter.pointerToStub(getNativePointer()); long refCount = CApiTransitions.readNativeRefCount(pointer); + assert refCount >= PythonAbstractObjectNativeWrapper.MANAGED_REFCNT : "invalid refcnt " + refCount + " during incRef in " + Long.toHexString(getNativePointer()); if (refCount != IMMORTAL_REFCNT) { CApiTransitions.writeNativeRefCount(pointer, refCount + 1); + return refCount + 1; } - assert refCount >= PythonAbstractObjectNativeWrapper.MANAGED_REFCNT : "invalid refcnt " + refCount + " during incRef in " + Long.toHexString(getNativePointer()); + return IMMORTAL_REFCNT; } @TruffleBoundary(allowInlining = true) @@ -234,11 +220,6 @@ public long decRef() { long updatedRefCount = refCount - 1; CApiTransitions.writeNativeRefCount(pointer, updatedRefCount); assert updatedRefCount >= PythonAbstractObjectNativeWrapper.MANAGED_REFCNT : "invalid refcnt " + updatedRefCount + " during decRef in " + Long.toHexString(getNativePointer()); - if (updatedRefCount == PythonAbstractObjectNativeWrapper.MANAGED_REFCNT && ref != null) { - // make weak - assert ref.isStrongReference(); - ref.setStrongReference(null); - } return updatedRefCount; } return refCount; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/SlotMethodDef.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/SlotMethodDef.java deleted file mode 100644 index f766af621e..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/SlotMethodDef.java +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.capi; - -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyAsyncMethods__am_aiter; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyAsyncMethods__am_anext; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyAsyncMethods__am_await; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyMappingMethods__mp_ass_subscript; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_absolute; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_divmod; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_float; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_floor_divide; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_index; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_inplace_add; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_inplace_and; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_inplace_floor_divide; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_inplace_lshift; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_inplace_multiply; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_inplace_or; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_inplace_power; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_inplace_remainder; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_inplace_rshift; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_inplace_subtract; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_inplace_true_divide; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_inplace_xor; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_int; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_invert; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_lshift; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_negative; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_or; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_positive; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_power; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_remainder; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_rshift; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_subtract; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_true_divide; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyNumberMethods__nb_xor; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PySequenceMethods__sq_ass_item; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_as_mapping; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_as_number; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_call; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_hash; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_init; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_iter; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_iternext; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_repr; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_richcompare; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_setattro; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_str; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ABS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___AITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ANEXT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___AWAIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___CALL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DIVMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FLOAT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FLOORDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___HASH__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IADD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IAND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IFLOORDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ILSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INDEX__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INVERT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IPOW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IRSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ISUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ITRUEDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IXOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEG__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEXT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___OR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___POS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___POW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REPR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETATTR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___STR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___TRUEDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___TRUFFLE_RICHCOMPARE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___XOR__; - -import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.BinaryFuncWrapper; -import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.HashfuncWrapper; -import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.InitWrapper; -import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.ObjobjargWrapper; -import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.RichcmpFunctionWrapper; -import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.SsizeobjargfuncWrapper; -import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.TernaryFunctionWrapper; -import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.UnaryFuncWrapper; -import com.oracle.graal.python.builtins.objects.cext.structs.CFields; -import com.oracle.graal.python.builtins.objects.type.MethodsFlags; -import com.oracle.graal.python.util.Function; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; -import com.oracle.truffle.api.strings.TruffleString; - -public enum SlotMethodDef { - TP_CALL(PyTypeObject__tp_call, T___CALL__, TernaryFunctionWrapper::new), - TP_HASH(PyTypeObject__tp_hash, T___HASH__, HashfuncWrapper::new), - TP_INIT(PyTypeObject__tp_init, T___INIT__, InitWrapper::new), - TP_ITER(PyTypeObject__tp_iter, T___ITER__, UnaryFuncWrapper::new), - TP_ITERNEXT(PyTypeObject__tp_iternext, T___NEXT__, UnaryFuncWrapper::new), - TP_REPR(PyTypeObject__tp_repr, T___REPR__, UnaryFuncWrapper::new), - TP_RICHCOMPARE(PyTypeObject__tp_richcompare, T___TRUFFLE_RICHCOMPARE__, RichcmpFunctionWrapper::new), - TP_SETATTRO(PyTypeObject__tp_setattro, T___SETATTR__, ObjobjargWrapper::new), - TP_STR(PyTypeObject__tp_str, T___STR__, UnaryFuncWrapper::new), - - MP_ASS_SUBSCRIPT(PyMappingMethods__mp_ass_subscript, T___SETITEM__, ObjobjargWrapper::new, MethodsFlags.MP_ASS_SUBSCRIPT), - - AM_AWAIT(PyAsyncMethods__am_await, T___AWAIT__, UnaryFuncWrapper::new, MethodsFlags.AM_AWAIT), - AM_AITER(PyAsyncMethods__am_aiter, T___AITER__, UnaryFuncWrapper::new, MethodsFlags.AM_AITER), - AM_ANEXT(PyAsyncMethods__am_anext, T___ANEXT__, UnaryFuncWrapper::new, MethodsFlags.AM_ANEXT), - // (mq) AM_SEND is an internal function and mostly called from within AWAIT, AITER, ANEXT. - /*- AM_SEND(PyAsyncMethods__am_send, ASYNC_AM_SEND, TernaryFunctionWrapper::new, MethodsFlags.AM_SEND), */ - - SQ_ASS_ITEM(PySequenceMethods__sq_ass_item, T___SETITEM__, SsizeobjargfuncWrapper::new, MethodsFlags.SQ_ASS_ITEM), - - NB_ABSOLUTE(PyNumberMethods__nb_absolute, T___ABS__, UnaryFuncWrapper::new, MethodsFlags.NB_ABSOLUTE), - NB_DIVMOD(PyNumberMethods__nb_divmod, T___DIVMOD__, BinaryFuncWrapper::new, MethodsFlags.NB_DIVMOD), - NB_FLOAT(PyNumberMethods__nb_float, T___FLOAT__, UnaryFuncWrapper::new, MethodsFlags.NB_FLOAT), - NB_FLOOR_DIVIDE(PyNumberMethods__nb_floor_divide, T___FLOORDIV__, BinaryFuncWrapper::new, MethodsFlags.NB_FLOOR_DIVIDE), - NB_INDEX(PyNumberMethods__nb_index, T___INDEX__, UnaryFuncWrapper::new, MethodsFlags.NB_INDEX), - NB_INPLACE_ADD(PyNumberMethods__nb_inplace_add, T___IADD__, BinaryFuncWrapper::new, MethodsFlags.NB_INPLACE_ADD), - NB_INPLACE_AND(PyNumberMethods__nb_inplace_and, T___IAND__, BinaryFuncWrapper::new, MethodsFlags.NB_INPLACE_AND), - NB_INPLACE_FLOOR_DIVIDE(PyNumberMethods__nb_inplace_floor_divide, T___IFLOORDIV__, BinaryFuncWrapper::new, MethodsFlags.NB_INPLACE_FLOOR_DIVIDE), - NB_INPLACE_LSHIFT(PyNumberMethods__nb_inplace_lshift, T___ILSHIFT__, BinaryFuncWrapper::new, MethodsFlags.NB_INPLACE_LSHIFT), - NB_INPLACE_MULTIPLY(PyNumberMethods__nb_inplace_multiply, T___IMUL__, BinaryFuncWrapper::new, MethodsFlags.NB_INPLACE_MULTIPLY), - NB_INPLACE_OR(PyNumberMethods__nb_inplace_or, T___IOR__, BinaryFuncWrapper::new, MethodsFlags.NB_INPLACE_OR), - NB_INPLACE_POWER(PyNumberMethods__nb_inplace_power, T___IPOW__, TernaryFunctionWrapper::new, MethodsFlags.NB_INPLACE_POWER), - NB_INPLACE_REMAINDER(PyNumberMethods__nb_inplace_remainder, T___IMOD__, BinaryFuncWrapper::new, MethodsFlags.NB_INPLACE_REMAINDER), - NB_INPLACE_RSHIFT(PyNumberMethods__nb_inplace_rshift, T___IRSHIFT__, BinaryFuncWrapper::new, MethodsFlags.NB_INPLACE_RSHIFT), - NB_INPLACE_SUBTRACT(PyNumberMethods__nb_inplace_subtract, T___ISUB__, BinaryFuncWrapper::new, MethodsFlags.NB_INPLACE_SUBTRACT), - NB_INPLACE_TRUE_DIVIDE(PyNumberMethods__nb_inplace_true_divide, T___ITRUEDIV__, BinaryFuncWrapper::new, MethodsFlags.NB_INPLACE_TRUE_DIVIDE), - NB_INPLACE_XOR(PyNumberMethods__nb_inplace_xor, T___IXOR__, BinaryFuncWrapper::new, MethodsFlags.NB_INPLACE_XOR), - NB_INT(PyNumberMethods__nb_int, T___INT__, UnaryFuncWrapper::new, MethodsFlags.NB_INT), - NB_INVERT(PyNumberMethods__nb_invert, T___INVERT__, UnaryFuncWrapper::new, MethodsFlags.NB_INVERT), - NB_LSHIFT(PyNumberMethods__nb_lshift, T___LSHIFT__, BinaryFuncWrapper::new, MethodsFlags.NB_LSHIFT), - NB_NEGATIVE(PyNumberMethods__nb_negative, T___NEG__, UnaryFuncWrapper::new, MethodsFlags.NB_NEGATIVE), - NB_OR(PyNumberMethods__nb_or, T___OR__, BinaryFuncWrapper::new, MethodsFlags.NB_OR), - NB_POSITIVE(PyNumberMethods__nb_positive, T___POS__, UnaryFuncWrapper::new, MethodsFlags.NB_POSITIVE), - NB_POWER(PyNumberMethods__nb_power, T___POW__, TernaryFunctionWrapper::new, MethodsFlags.NB_POWER), - NB_REMAINDER(PyNumberMethods__nb_remainder, T___MOD__, BinaryFuncWrapper::new, MethodsFlags.NB_REMAINDER), - NB_RSHIFT(PyNumberMethods__nb_rshift, T___RSHIFT__, BinaryFuncWrapper::new, MethodsFlags.NB_RSHIFT), - NB_SUBTRACT(PyNumberMethods__nb_subtract, T___SUB__, BinaryFuncWrapper::new, MethodsFlags.NB_SUBTRACT), - NB_TRUE_DIVIDE(PyNumberMethods__nb_true_divide, T___TRUEDIV__, BinaryFuncWrapper::new, MethodsFlags.NB_TRUE_DIVIDE), - NB_XOR(PyNumberMethods__nb_xor, T___XOR__, BinaryFuncWrapper::new, MethodsFlags.NB_XOR); - - public final TruffleString methodName; - public final Function wrapperFactory; - public final long methodFlag; - - @CompilationFinal public CFields typeField; - @CompilationFinal public CFields methodsField; - - /** - * Different slot that is C-compatible and maps to the same Python method. - */ - @CompilationFinal public SlotMethodDef overlappingSlot; - - SlotMethodDef(CFields typeField, TruffleString methodName, Function wrapperFactory) { - this(typeField, null, methodName, wrapperFactory, 0); - } - - SlotMethodDef(CFields typeField, TruffleString methodName, Function wrapperFactory, long methodFlag) { - this(typeField, null, methodName, wrapperFactory, methodFlag); - } - - SlotMethodDef(CFields typeField, CFields methodsField, TruffleString methodName, Function wrapperFactory, long methodFlag) { - this.typeField = typeField; - this.methodsField = methodsField; - this.methodName = methodName; - this.wrapperFactory = wrapperFactory; - this.methodFlag = methodFlag; - } - - static { - // SQ_(ASS_)ITEM and MP_(ASS_)SUBSCRIPT do *not* overlap for - // the purposes of initialising native slots, since the sq - // slots use ssizeargfunc/ssizeobjargproc and the mp slots - // use binaryfunc/objobjargproc - // - // Similarly for NB_ADD/NB_MUL (wrap_binaryfunc_l) and - // SQ_CONCAT/SQ_REPEAT (wrap_binaryfunc) - initGroup( - PyTypeObject__tp_as_mapping, - MP_ASS_SUBSCRIPT); - initGroup( - PyTypeObject__tp_as_number, - NB_ABSOLUTE, - NB_DIVMOD, - NB_FLOAT, - NB_FLOOR_DIVIDE, - NB_INDEX, - NB_INPLACE_ADD, - NB_INPLACE_AND, - NB_INPLACE_FLOOR_DIVIDE, - NB_INPLACE_LSHIFT, - NB_INPLACE_MULTIPLY, - NB_INPLACE_OR, - NB_INPLACE_POWER, - NB_INPLACE_REMAINDER, - NB_INPLACE_RSHIFT, - NB_INPLACE_SUBTRACT, - NB_INPLACE_TRUE_DIVIDE, - NB_INPLACE_XOR, - NB_INT, - NB_INVERT, - NB_LSHIFT, - NB_NEGATIVE, - NB_OR, - NB_POSITIVE, - NB_POWER, - NB_REMAINDER, - NB_RSHIFT, - NB_SUBTRACT, - NB_TRUE_DIVIDE, - NB_XOR); - } - - private static void initGroup(CFields typeField, SlotMethodDef... slots) { - for (SlotMethodDef slot : slots) { - assert slot.methodsField == null && slot.typeField != null; - slot.methodsField = slot.typeField; - slot.typeField = typeField; - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/ToNativeTypeNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/ToNativeTypeNode.java index 7fb486719d..ffdcc5b876 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/ToNativeTypeNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/ToNativeTypeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -50,9 +50,12 @@ import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_dealloc; import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_del; import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_free; +import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_is_gc; +import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_traverse; import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_vectorcall_offset; import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_weaklistoffset; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.modules.ctypes.StgDictObject; import com.oracle.graal.python.builtins.objects.PNone; @@ -71,11 +74,8 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageAddAllToOther; import com.oracle.graal.python.builtins.objects.dict.PDict; -import com.oracle.graal.python.builtins.objects.method.PDecoratedMethod; -import com.oracle.graal.python.builtins.objects.type.MethodsFlags; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetTpSlotsNode; import com.oracle.graal.python.builtins.objects.type.TpSlots.TpSlotMeta; @@ -83,50 +83,30 @@ import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetBaseClassNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetBaseClassesNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetBasicSizeNode; +import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetDictOffsetNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetItemSizeNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetMroStorageNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetSubclassesNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetTypeFlagsNode; -import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.GetDictOffsetNodeGen; import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.GetTypeFlagsNodeGen; import com.oracle.graal.python.nodes.HiddenAttr; import com.oracle.graal.python.nodes.SpecialAttributeNames; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; -import com.oracle.graal.python.nodes.attributes.LookupNativeSlotNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassExactProfile; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.object.GetOrCreateDictNode; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerAsserts; +import com.oracle.truffle.api.strings.TruffleString; public abstract class ToNativeTypeNode { - private static Object getSlot(PythonManagedClass obj, SlotMethodDef slot) { - return LookupNativeSlotNode.executeUncached(obj, slot); - } - - private static boolean hasAsyncMethods(PythonManagedClass obj) { - return (obj.getMethodsFlags() & MethodsFlags.ASYNC_METHODS) != 0; - } - - private static boolean hasSequenceMethods(PythonManagedClass obj) { - return (obj.getMethodsFlags() & MethodsFlags.SEQUENCE_METHODS) != 0; - } - - private static boolean hasMappingMethods(PythonManagedClass obj) { - return (obj.getMethodsFlags() & MethodsFlags.MAPPING_METHODS) != 0; - } - - private static Object allocatePyAsyncMethods(PythonManagedClass obj, Object nullValue) { + private static Object allocatePyAsyncMethods(TpSlots slots, Object nullValue) { Object mem = CStructAccess.AllocateNode.allocUncached(CStructs.PyAsyncMethods); CStructAccess.WritePointerNode writePointerNode = CStructAccess.WritePointerNode.getUncached(); - writePointerNode.write(mem, CFields.PyAsyncMethods__am_await, getSlot(obj, SlotMethodDef.AM_AWAIT)); - writePointerNode.write(mem, CFields.PyAsyncMethods__am_aiter, getSlot(obj, SlotMethodDef.AM_AITER)); - writePointerNode.write(mem, CFields.PyAsyncMethods__am_anext, getSlot(obj, SlotMethodDef.AM_ANEXT)); - writePointerNode.write(mem, CFields.PyAsyncMethods__am_send, nullValue /*- getValue(obj, SlotMethodDef.AM_SEND) */); + writeGroupSlots(CFields.PyTypeObject__tp_as_async, slots, writePointerNode, mem, nullValue); return mem; } @@ -138,74 +118,24 @@ private static void writeGroupSlots(CFields groupField, TpSlots slots, WritePoin } } - private static Object allocatePyMappingMethods(PythonManagedClass obj, TpSlots slots, Object nullValue) { + private static Object allocatePyMappingMethods(TpSlots slots, Object nullValue) { Object mem = CStructAccess.AllocateNode.allocUncached(CStructs.PyMappingMethods); CStructAccess.WritePointerNode writePointerNode = CStructAccess.WritePointerNode.getUncached(); - writeGroupSlots(CFields.PyTypeObject__tp_as_mapping, slots, writePointerNode, mem, nullValue); - - writePointerNode.write(mem, CFields.PyMappingMethods__mp_ass_subscript, getSlot(obj, SlotMethodDef.MP_ASS_SUBSCRIPT)); return mem; } - private static Object allocatePyNumberMethods(PythonManagedClass obj, TpSlots slots, Object nullValue) { + private static Object allocatePyNumberMethods(TpSlots slots, Object nullValue) { Object mem = CStructAccess.AllocateNode.allocUncached(CStructs.PyNumberMethods); CStructAccess.WritePointerNode writePointerNode = CStructAccess.WritePointerNode.getUncached(); - writeGroupSlots(CFields.PyTypeObject__tp_as_number, slots, writePointerNode, mem, nullValue); - - writePointerNode.write(mem, CFields.PyNumberMethods__nb_absolute, getSlot(obj, SlotMethodDef.NB_ABSOLUTE)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_divmod, getSlot(obj, SlotMethodDef.NB_DIVMOD)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_float, getSlot(obj, SlotMethodDef.NB_FLOAT)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_floor_divide, getSlot(obj, SlotMethodDef.NB_FLOOR_DIVIDE)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_index, getSlot(obj, SlotMethodDef.NB_INDEX)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_inplace_add, getSlot(obj, SlotMethodDef.NB_INPLACE_ADD)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_inplace_and, getSlot(obj, SlotMethodDef.NB_INPLACE_AND)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_inplace_floor_divide, getSlot(obj, SlotMethodDef.NB_INPLACE_FLOOR_DIVIDE)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_inplace_lshift, getSlot(obj, SlotMethodDef.NB_INPLACE_LSHIFT)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_inplace_matrix_multiply, nullValue); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_inplace_multiply, getSlot(obj, SlotMethodDef.NB_INPLACE_MULTIPLY)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_inplace_or, getSlot(obj, SlotMethodDef.NB_INPLACE_OR)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_inplace_power, getSlot(obj, SlotMethodDef.NB_INPLACE_POWER)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_inplace_remainder, getSlot(obj, SlotMethodDef.NB_INPLACE_REMAINDER)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_inplace_rshift, getSlot(obj, SlotMethodDef.NB_INPLACE_RSHIFT)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_inplace_subtract, getSlot(obj, SlotMethodDef.NB_INPLACE_SUBTRACT)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_inplace_true_divide, getSlot(obj, SlotMethodDef.NB_INPLACE_TRUE_DIVIDE)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_inplace_xor, getSlot(obj, SlotMethodDef.NB_INPLACE_XOR)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_int, getSlot(obj, SlotMethodDef.NB_INT)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_invert, getSlot(obj, SlotMethodDef.NB_INVERT)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_lshift, getSlot(obj, SlotMethodDef.NB_LSHIFT)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_matrix_multiply, nullValue); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_negative, getSlot(obj, SlotMethodDef.NB_NEGATIVE)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_or, getSlot(obj, SlotMethodDef.NB_OR)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_positive, getSlot(obj, SlotMethodDef.NB_POSITIVE)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_power, getSlot(obj, SlotMethodDef.NB_POWER)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_remainder, getSlot(obj, SlotMethodDef.NB_REMAINDER)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_reserved, nullValue); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_rshift, getSlot(obj, SlotMethodDef.NB_RSHIFT)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_subtract, getSlot(obj, SlotMethodDef.NB_SUBTRACT)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_true_divide, getSlot(obj, SlotMethodDef.NB_TRUE_DIVIDE)); - writePointerNode.write(mem, CFields.PyNumberMethods__nb_xor, getSlot(obj, SlotMethodDef.NB_XOR)); return mem; } - private static Object allocatePySequenceMethods(PythonManagedClass obj, TpSlots slots, Object nullValue) { + private static Object allocatePySequenceMethods(TpSlots slots, Object nullValue) { Object mem = CStructAccess.AllocateNode.allocUncached(CStructs.PyNumberMethods); CStructAccess.WritePointerNode writePointerNode = CStructAccess.WritePointerNode.getUncached(); - writeGroupSlots(CFields.PyTypeObject__tp_as_sequence, slots, writePointerNode, mem, nullValue); - - // TODO: Heap types defining __add__/__mul__ have sq_concat/sq_repeat == NULL in CPython, so - // this may have unintended effects - writePointerNode.write(mem, CFields.PySequenceMethods__was_sq_slice, nullValue); - writePointerNode.write(mem, CFields.PySequenceMethods__sq_ass_item, getSlot(obj, SlotMethodDef.SQ_ASS_ITEM)); - writePointerNode.write(mem, CFields.PySequenceMethods__was_sq_ass_slice, nullValue); - // TODO populate sq_contains - writePointerNode.write(mem, CFields.PySequenceMethods__sq_contains, nullValue); - // TODO populate sq_inplace_concat - writePointerNode.write(mem, CFields.PySequenceMethods__sq_inplace_concat, nullValue); - // TODO populate sq_inplace_repeat - writePointerNode.write(mem, CFields.PySequenceMethods__sq_inplace_repeat, nullValue); return mem; } @@ -221,10 +151,6 @@ private static long lookupSize(PythonManagedClass clazz, CFields member, HiddenA return lookupNativeI64MemberInMRO(clazz, member, hiddenName); } - private static Object lookup(PythonManagedClass obj, SlotMethodDef slot) { - return LookupNativeSlotNode.executeUncached(obj, slot); - } - static void initializeType(PythonClassNativeWrapper obj, Object mem, boolean heaptype) { CompilerAsserts.neverPartOfCompilation(); @@ -240,7 +166,7 @@ static void initializeType(PythonClassNativeWrapper obj, Object mem, boolean hea GetTypeFlagsNode getTypeFlagsNode = GetTypeFlagsNodeGen.getUncached(); PythonContext ctx = PythonContext.get(null); - PythonObjectFactory factory = ctx.factory(); + PythonLanguage language = ctx.getLanguage(); Object nullValue = ctx.getNativeNull(); // make this object immortal @@ -285,40 +211,41 @@ static void initializeType(PythonClassNativeWrapper obj, Object mem, boolean hea } else { weaklistoffset = lookupNativeI64MemberInMRO(clazz, PyTypeObject__tp_weaklistoffset, SpecialAttributeNames.T___WEAKLISTOFFSET__); } - Object asAsync = hasAsyncMethods(clazz) ? allocatePyAsyncMethods(clazz, nullValue) : nullValue; - Object asNumber = IsBuiltinClassExactProfile.profileClassSlowPath(clazz, PythonBuiltinClassType.PythonObject) ? nullValue : allocatePyNumberMethods(clazz, slots, nullValue); - Object asSequence = (slots.has_as_sequence() || hasSequenceMethods(clazz)) ? allocatePySequenceMethods(clazz, slots, nullValue) : nullValue; - Object asMapping = (slots.has_as_mapping() || hasMappingMethods(clazz)) ? allocatePyMappingMethods(clazz, slots, nullValue) : nullValue; + Object asAsync = slots.has_as_async() ? allocatePyAsyncMethods(slots, nullValue) : nullValue; + Object asNumber = slots.has_as_number() ? allocatePyNumberMethods(slots, nullValue) : nullValue; + Object asSequence = slots.has_as_sequence() ? allocatePySequenceMethods(slots, nullValue) : nullValue; + Object asMapping = slots.has_as_mapping() ? allocatePyMappingMethods(slots, nullValue) : nullValue; Object asBuffer = lookup(clazz, PyTypeObject__tp_as_buffer, HiddenAttr.AS_BUFFER); writeI64Node.write(mem, CFields.PyTypeObject__tp_weaklistoffset, weaklistoffset); writePtrNode.write(mem, CFields.PyTypeObject__tp_dealloc, lookup(clazz, PyTypeObject__tp_dealloc, HiddenAttr.DEALLOC)); writeI64Node.write(mem, CFields.PyTypeObject__tp_vectorcall_offset, lookupSize(clazz, PyTypeObject__tp_vectorcall_offset, HiddenAttr.VECTORCALL_OFFSET)); writePtrNode.write(mem, CFields.PyTypeObject__tp_getattr, nullValue); writePtrNode.write(mem, CFields.PyTypeObject__tp_as_async, asAsync); - writePtrNode.write(mem, CFields.PyTypeObject__tp_repr, lookup(clazz, SlotMethodDef.TP_REPR)); writePtrNode.write(mem, CFields.PyTypeObject__tp_as_number, asNumber); writePtrNode.write(mem, CFields.PyTypeObject__tp_as_sequence, asSequence); writePtrNode.write(mem, CFields.PyTypeObject__tp_as_mapping, asMapping); - writePtrNode.write(mem, CFields.PyTypeObject__tp_hash, lookup(clazz, SlotMethodDef.TP_HASH)); - writePtrNode.write(mem, CFields.PyTypeObject__tp_call, lookup(clazz, SlotMethodDef.TP_CALL)); - writePtrNode.write(mem, CFields.PyTypeObject__tp_str, lookup(clazz, SlotMethodDef.TP_STR)); writePtrNode.write(mem, CFields.PyTypeObject__tp_as_buffer, asBuffer); writeI64Node.write(mem, CFields.PyTypeObject__tp_flags, flags); // return a C string wrapper that really allocates 'char*' on TO_NATIVE Object docObj = clazz.getAttribute(SpecialAttributeNames.T___DOC__); try { - docObj = new CStringWrapper(CastToTruffleStringNode.executeUncached(docObj)); + docObj = new CStringWrapper(CastToTruffleStringNode.executeUncached(docObj).switchEncodingUncached(TruffleString.Encoding.UTF_8), TruffleString.Encoding.UTF_8); } catch (CannotCastException e) { // if not directly a string, give up (we don't call descriptors here) docObj = ctx.getNativeNull(); } writePtrNode.write(mem, CFields.PyTypeObject__tp_doc, docObj); - // TODO: return a proper traverse function, or at least a dummy - writePtrNode.write(mem, CFields.PyTypeObject__tp_traverse, nullValue); - writePtrNode.write(mem, CFields.PyTypeObject__tp_richcompare, lookup(clazz, SlotMethodDef.TP_RICHCOMPARE)); - writePtrNode.write(mem, CFields.PyTypeObject__tp_iter, lookup(clazz, SlotMethodDef.TP_ITER)); - writePtrNode.write(mem, CFields.PyTypeObject__tp_iternext, lookup(clazz, SlotMethodDef.TP_ITERNEXT)); + + Object tpTraverse = nullValue; + Object tpIsGc = nullValue; + if ((flags & TypeFlags.HAVE_GC) != 0) { + tpTraverse = lookup(clazz, PyTypeObject__tp_traverse, HiddenAttr.TRAVERSE); + tpIsGc = lookup(clazz, PyTypeObject__tp_is_gc, HiddenAttr.IS_GC); + } + writePtrNode.write(mem, CFields.PyTypeObject__tp_traverse, tpTraverse); + writePtrNode.write(mem, CFields.PyTypeObject__tp_is_gc, tpIsGc); + writePtrNode.write(mem, CFields.PyTypeObject__tp_methods, nullValue); writePtrNode.write(mem, CFields.PyTypeObject__tp_members, nullValue); writePtrNode.write(mem, CFields.PyTypeObject__tp_getset, nullValue); @@ -333,11 +260,8 @@ static void initializeType(PythonClassNativeWrapper obj, Object mem, boolean hea HashingStorage dictStorage = dict.getDictStorage(); if (!(dictStorage instanceof DynamicObjectStorage)) { HashingStorage storage = new DynamicObjectStorage(clazz); - dict.setDictStorage(storage); - if (dictStorage != null) { - // copy all mappings to the new storage - HashingStorageAddAllToOther.executeUncached(dictStorage, dict); - } + // copy all mappings to the new storage + dict.setDictStorage(HashingStorageAddAllToOther.executeUncached(dictStorage, storage)); } } writePtrNode.write(mem, CFields.PyTypeObject__tp_dict, toNative.execute(dict)); @@ -349,25 +273,16 @@ static void initializeType(PythonClassNativeWrapper obj, Object mem, boolean hea } // TODO properly implement 'tp_dictoffset' for builtin classes - writeI64Node.write(mem, CFields.PyTypeObject__tp_dictoffset, GetDictOffsetNodeGen.getUncached().execute(null, clazz)); - writePtrNode.write(mem, CFields.PyTypeObject__tp_init, lookup(clazz, SlotMethodDef.TP_INIT)); + writeI64Node.write(mem, CFields.PyTypeObject__tp_dictoffset, GetDictOffsetNode.executeUncached(clazz)); writePtrNode.write(mem, CFields.PyTypeObject__tp_alloc, lookup(clazz, PyTypeObject__tp_alloc, HiddenAttr.ALLOC)); - // T___new__ is magically a staticmethod for Python types. The tp_new slot lookup - // expects to get the function - Object newFunction = LookupCallableSlotInMRONode.getUncached(SpecialMethodSlot.New).execute(clazz); - if (newFunction instanceof PDecoratedMethod) { - newFunction = ((PDecoratedMethod) newFunction).getCallable(); - } - writePtrNode.write(mem, CFields.PyTypeObject__tp_new, ManagedMethodWrappers.createKeywords(newFunction)); writePtrNode.write(mem, CFields.PyTypeObject__tp_free, lookup(clazz, PyTypeObject__tp_free, HiddenAttr.FREE)); writePtrNode.write(mem, CFields.PyTypeObject__tp_clear, lookup(clazz, PyTypeObject__tp_clear, HiddenAttr.CLEAR)); - writePtrNode.write(mem, CFields.PyTypeObject__tp_is_gc, nullValue); if (clazz.basesTuple == null) { - clazz.basesTuple = factory.createTuple(GetBaseClassesNode.executeUncached(clazz)); + clazz.basesTuple = PFactory.createTuple(language, GetBaseClassesNode.executeUncached(clazz)); } writePtrNode.write(mem, CFields.PyTypeObject__tp_bases, toNative.execute(clazz.basesTuple)); if (clazz.mroStore == null) { - clazz.mroStore = factory.createTuple(GetMroStorageNode.executeUncached(clazz)); + clazz.mroStore = PFactory.createTuple(language, GetMroStorageNode.executeUncached(clazz)); } writePtrNode.write(mem, CFields.PyTypeObject__tp_mro, toNative.execute(clazz.mroStore)); writePtrNode.write(mem, CFields.PyTypeObject__tp_cache, nullValue); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/UnicodeObjectNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/UnicodeObjectNodes.java index f87f5384ce..5e6d3be1bf 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/UnicodeObjectNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/UnicodeObjectNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,13 +40,13 @@ */ package com.oracle.graal.python.builtins.objects.cext.capi; -import java.nio.ByteBuffer; import java.nio.ByteOrder; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.str.PString; import com.oracle.graal.python.builtins.objects.str.StringNodes.StringMaterializeNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; @@ -86,32 +86,15 @@ static PBytes doUnicode(Node inliningTarget, PString s, long elementSize, ByteOr @Specialization @TruffleBoundary static PBytes doUnicode(TruffleString s, long elementSize, ByteOrder byteOrder) { - TruffleString.Encoding encoding = byteOrder == ByteOrder.LITTLE_ENDIAN ? TruffleString.Encoding.UTF_32LE : TruffleString.Encoding.UTF_32BE; - - // elementSize == 2: Store String in 'wchar_t' of size == 2, i.e., use UCS2. This is - // achieved by decoding to UTF32 (which is basically UCS4) and ignoring the two - // MSBs. - if (elementSize == 2L) { - ByteBuffer bytes = ByteBuffer.wrap(getBytes(s, encoding)); - // FIXME unsafe narrowing - int size = bytes.remaining() / 2; - ByteBuffer buf = ByteBuffer.allocate(size); - while (bytes.remaining() >= 4) { - if (byteOrder != ByteOrder.nativeOrder()) { - buf.putChar((char) ((bytes.getInt() & 0xFFFF0000) >> 16)); - } else { - buf.putChar((char) (bytes.getInt() & 0x0000FFFF)); - } - } - buf.flip(); - byte[] barr = new byte[buf.remaining()]; - buf.get(barr); - return PythonObjectFactory.getUncached().createBytes(barr); - } else if (elementSize == 4L) { - return PythonObjectFactory.getUncached().createBytes(getBytes(s, encoding)); + TruffleString.Encoding encoding; + if (elementSize == 4) { + encoding = byteOrder == ByteOrder.LITTLE_ENDIAN ? TruffleString.Encoding.UTF_32LE : TruffleString.Encoding.UTF_32BE; + } else if (elementSize == 2) { + encoding = byteOrder == ByteOrder.LITTLE_ENDIAN ? TruffleString.Encoding.UTF_16LE : TruffleString.Encoding.UTF_16BE; } else { throw new RuntimeException("unsupported wchar size; was: " + elementSize); } + return PFactory.createBytes(PythonLanguage.get(null), getBytes(s, encoding)); } private static byte[] getBytes(TruffleString s, TruffleString.Encoding encoding) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/ArgDescriptor.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/ArgDescriptor.java index ff124082a3..94eabd5b71 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/ArgDescriptor.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/ArgDescriptor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -87,6 +87,7 @@ enum ArgBehavior { Int32("SINT32", "I", "jint", "int", ToInt32Node::create, null, null, null), UInt32("UINT32", "I", "jint", "int", ToInt32Node::create, FromUInt32Node::create, FromUInt32Node.getUncached(), null), Int64("SINT64", "J", "jlong", "long", ToInt64Node::create, null, null, null), + UInt64("UINT64", "J", "jlong", "long", ToInt64Node::create, null, null, null), Long("SINT64", "J", "jlong", "long", ToInt64Node::create, FromLongNode::create, FromLongNode.getUncached(), null), Float32("FLOAT", "F", "jfloat", "float", null, null, null, null), Float64("DOUBLE", "D", "jdouble", "double", null, null, null, null), @@ -144,6 +145,7 @@ public enum ArgDescriptor { PyMethodObject(ArgBehavior.PyObject, "PyMethodObject*"), PyInstanceMethodObject(ArgBehavior.PyObject, "PyInstanceMethodObject*"), PyObjectTransfer(ArgBehavior.PyObject, "PyObject*", true), + PyObjectRawPointer(ArgBehavior.Pointer, "PyObject*"), Pointer(ArgBehavior.Pointer, "void*"), Py_ssize_t(ArgBehavior.Int64, "Py_ssize_t"), Py_hash_t(ArgBehavior.Int64, "Py_hash_t"), @@ -277,7 +279,7 @@ public enum ArgDescriptor { PYPRECONFIG_PTR("PyPreConfig*"), PYSTATUS("PyStatus"), PYUNICODE_KIND("enum PyUnicode_Kind"), - PYWEAKREFERENCE_PTR("PyWeakReference*"), + PYWEAKREFERENCE_PTR(ArgBehavior.PyObject, "PyWeakReference*"), PYWIDESTRINGLIST_PTR("PyWideStringList*"), SIZE_T(ArgBehavior.Int64, "size_t"), SIZE_T_PTR("size_t*"), @@ -288,8 +290,8 @@ public enum ArgDescriptor { TIMESPEC_PTR("struct timespec*"), TIMEVAL_PTR("struct timeval*"), TM_PTR("struct tm*"), - UINTPTR_T(ArgBehavior.Pointer, "uintptr_t"), - UINT64_T(ArgBehavior.Int64, "uint64_t"), + UINTPTR_T(ArgBehavior.UInt64, "uintptr_t"), + UINT64_T(ArgBehavior.UInt64, "uint64_t"), UNSIGNED_CHAR_PTR(ArgBehavior.Pointer, "unsigned char*"), UNSIGNED_INT(ArgBehavior.UInt32, "unsigned int"), UNSIGNED_LONG(ArgBehavior.Long, "unsigned long"), @@ -480,8 +482,18 @@ public boolean isCharPtr() { } public boolean isIntType() { - return behavior == ArgBehavior.Int32 || behavior == ArgBehavior.UInt32 || behavior == ArgBehavior.Int64 || behavior == ArgBehavior.Long || behavior == ArgBehavior.Char16 || - behavior == ArgBehavior.Unknown; + switch (behavior) { + case Int32: + case UInt32: + case Int64: + case UInt64: + case Long: + case Char16: + case Unknown: + return true; + default: + return false; + } } public boolean isFloatType() { @@ -493,7 +505,7 @@ public boolean isVoid() { } public boolean isI64() { - return behavior == ArgBehavior.Int64 || behavior == ArgBehavior.Long; + return behavior == ArgBehavior.Int64 || behavior == ArgBehavior.Long || behavior == ArgBehavior.UInt64; } public boolean isI8() { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/CApiTransitions.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/CApiTransitions.java index f69ac2370c..dd291e4348 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/CApiTransitions.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/CApiTransitions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -53,12 +53,16 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.PythonAbstractObject; import com.oracle.graal.python.builtins.objects.capsule.PyCapsule; import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; +import com.oracle.graal.python.builtins.objects.cext.capi.CApiGCSupport.GCListRemoveNode; +import com.oracle.graal.python.builtins.objects.cext.capi.CApiGCSupport.PyObjectGCDelNode; +import com.oracle.graal.python.builtins.objects.cext.capi.CApiGCSupport.PyObjectGCTrackNode; import com.oracle.graal.python.builtins.objects.cext.capi.CApiGuards; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.FromCharPointerNode; @@ -87,15 +91,20 @@ import com.oracle.graal.python.builtins.objects.cext.structs.CStructs; import com.oracle.graal.python.builtins.objects.floats.PFloat; import com.oracle.graal.python.builtins.objects.getsetdescriptor.DescriptorDeleteMarker; +import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView; +import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.traceback.LazyTraceback; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TypeFlags; +import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetTypeFlagsNode; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.GilNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.PythonOptions; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.NativeSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage.StorageType; @@ -120,6 +129,7 @@ import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.profiles.InlinedExactClassProfile; import com.oracle.truffle.api.strings.TruffleString; @@ -174,17 +184,17 @@ public HandleContext(boolean useShadowTable) { volatile boolean referenceQueuePollActive = false; @TruffleBoundary - static T putShadowTable(HashMap table, long pointer, T ref) { + public static T putShadowTable(HashMap table, long pointer, T ref) { return table.put(pointer, ref); } @TruffleBoundary - static T removeShadowTable(HashMap table, long pointer) { + public static T removeShadowTable(HashMap table, long pointer) { return table.remove(pointer); } @TruffleBoundary - static T getShadowTable(HashMap table, long pointer) { + public static T getShadowTable(HashMap table, long pointer) { return table.get(pointer); } } @@ -198,6 +208,7 @@ public abstract static class IdReference extends WeakReference { public IdReference(HandleContext handleContext, T referent) { super(referent, handleContext.referenceQueue); } + } /** @@ -230,26 +241,28 @@ public static final class PythonObjectReference extends IdReference", pointer, referent != null ? referent.toStringWithContext() : "freed")); + } + @Override @TruffleBoundary public String toString() { @@ -387,9 +409,10 @@ public static PyCapsuleReference registerPyCapsuleDestructor(PyCapsule capsule) @TruffleBoundary @SuppressWarnings("try") - public static void pollReferenceQueue() { + public static int pollReferenceQueue() { PythonContext context = PythonContext.get(null); HandleContext handleContext = context.nativeContext; + int manuallyCollected = 0; if (!handleContext.referenceQueuePollActive) { try (GilNode.UncachedAcquire ignored = GilNode.uncachedAcquire()) { ReferenceQueue queue = handleContext.referenceQueue; @@ -424,7 +447,7 @@ public static void pollReferenceQueue() { handleContext.referenceQueuePollActive = false; LOGGER.fine("collected " + count + " references from native reference queue in " + ((System.nanoTime() - start) / 1000000) + "ms"); } - return; + return manuallyCollected; } if (count == 0) { assert !handleContext.referenceQueuePollActive; @@ -434,10 +457,11 @@ public static void pollReferenceQueue() { assert handleContext.referenceQueuePollActive; } count++; + LOGGER.fine(() -> PythonUtils.formatJString("releasing %s, no remaining managed references", entry)); if (entry instanceof PythonObjectReference reference) { - LOGGER.fine(() -> PythonUtils.formatJString("releasing %s", reference.toString())); if (HandlePointerConverter.pointsToPyHandleSpace(reference.pointer)) { assert nativeStubLookupGet(handleContext, reference.pointer, reference.handleTableIndex) != null : Long.toHexString(reference.pointer); + LOGGER.finer(() -> PythonUtils.formatJString("releasing native stub lookup for managed object %x => %s", reference.pointer, reference)); nativeStubLookupRemove(handleContext, reference); /* * We may only free native object stubs if their reference count is @@ -446,27 +470,43 @@ public static void pollReferenceQueue() { * be free'd at context finalization. */ long stubPointer = HandlePointerConverter.pointerToStub(reference.pointer); - if (subNativeRefCount(stubPointer, MANAGED_REFCNT) == 0) { - freeNativeStub(stubPointer); + long newRefCount = subNativeRefCount(stubPointer, MANAGED_REFCNT); + if (newRefCount == 0) { + LOGGER.finer(() -> PythonUtils.formatJString("No more references for %s (refcount->0): freeing native stub", reference)); + freeNativeStub(reference); } else { + LOGGER.finer(() -> PythonUtils.formatJString("Some native references to %s remain (refcount=%d): not freeing native stub yet", reference, newRefCount)); /* * In this case, the object is no longer referenced from managed * but still from native code (since the reference count is - * greater 0). We therefore need to overwrite the - * 'CFields.GraalPyObject__id' field because there may be - * referenced from managed in the future and then we would - * incorrectly reuse the ID. + * greater 0). This case is possible if there are reference + * cycles that include managed objects. We overwrite field + * 'CFields.GraalPyObject__id' to avoid incorrect reuse of the + * ID which could resolve to another object. */ - CStructAccess.WriteIntNode.writeUncached(reference.pointer, CFields.GraalPyObject__handle_table_index, 0); + CStructAccess.WriteIntNode.writeUncached(stubPointer, CFields.GraalPyObject__handle_table_index, 0); + // this can only happen if the object is a GC object + assert reference.gc; + /* + * Since the managed object is already dead (only the native + * object stub is still alive), we need to remove the object + * from its current GC list. Otherwise, the Python GC would try + * to traverse the object on the next collection which would + * lead to a crash. + */ + GCListRemoveNode.executeUncached(stubPointer); } } else { assert nativeLookupGet(handleContext, reference.pointer) != null : Long.toHexString(reference.pointer); + LOGGER.finer(() -> PythonUtils.formatJString("releasing native stub lookup for managed object with replacement %x => %s", reference.pointer, reference)); nativeLookupRemove(handleContext, reference.pointer); - if (reference.freeAtCollection) { + if (reference.isFreeAtCollection()) { + LOGGER.finer(() -> PythonUtils.formatJString("freeing managed object %s replacement", reference)); freeNativeStruct(reference); } } } else if (entry instanceof NativeObjectReference reference) { + LOGGER.finer(() -> PythonUtils.formatJString("releasing native lookup for native object %x => %s", reference.pointer, reference)); nativeLookupRemove(handleContext, reference.pointer); processNativeObjectReference(reference, referencesToBeFreed); } else if (entry instanceof NativeStorageReference reference) { @@ -488,6 +528,7 @@ public static void pollReferenceQueue() { } } } + return manuallyCollected; } /** @@ -510,9 +551,14 @@ private static void processNativeObjectReference(NativeObjectReference reference * storage, then they will be freed by calling the element object's destructor. */ private static void processNativeStorageReference(NativeStorageReference reference) { - if (reference.type == StorageType.Generic) { + /* + * Note: 'reference.size' may be zero if the storage has already been cleared by the Python + * GC. + */ + if (reference.type == StorageType.Generic && reference.size > 0) { PCallCapiFunction.callUncached(NativeCAPISymbol.FUN_PY_TRUFFLE_OBJECT_ARRAY_RELEASE, reference.ptr, reference.size); } + assert !InteropLibrary.getUncached().isNull(reference.ptr); freeNativeStorage(reference); } @@ -520,7 +566,7 @@ private static void processPyCapsuleReference(PyCapsuleReference reference) { LOGGER.fine(() -> PythonUtils.formatJString("releasing %s", reference.toString())); if (reference.data.getDestructor() != null) { // Our capsule is dead, so create a temporary copy that doesn't have a reference anymore - PyCapsule capsule = PythonObjectFactory.getUncached().createCapsule(reference.data); + PyCapsule capsule = PFactory.createCapsule(PythonLanguage.get(null), reference.data); PCallCapiFunction.callUncached(NativeCAPISymbol.FUN_PY_TRUFFLE_CAPSULE_CALL_DESTRUCTOR, PythonToNativeNode.executeUncached(capsule), capsule.getDestructor()); } } @@ -557,7 +603,7 @@ public static void freeClassReplacements(HandleContext handleContext) { * native memory and some of them were allocated in heap, and (b) struct wrappers, * which may be freed manually in a separate step. */ - if (reference.freeAtCollection) { + if (reference.isFreeAtCollection()) { freeNativeStruct(reference); } } @@ -565,23 +611,33 @@ public static void freeClassReplacements(HandleContext handleContext) { handleContext.nativeLookup.clear(); } - public static void disableReferenceQueuePolling(HandleContext handleContext) { - handleContext.referenceQueuePollActive = true; + public static boolean disableReferenceQueuePolling(HandleContext handleContext) { + if (!handleContext.referenceQueuePollActive) { + handleContext.referenceQueuePollActive = true; + return false; + } + return true; } - private static void freeNativeStub(long stubPointer) { - LOGGER.fine(() -> PythonUtils.formatJString("releasing native object stub 0x%x", stubPointer)); - FreeNode.executeUncached(stubPointer); + public static void enableReferenceQueuePolling(HandleContext handleContext) { + handleContext.referenceQueuePollActive = false; } private static void freeNativeStub(PythonObjectReference ref) { assert HandlePointerConverter.pointsToPyHandleSpace(ref.pointer); - freeNativeStub(HandlePointerConverter.pointerToStub(ref.pointer)); + if (ref.gc) { + PyObjectGCDelNode.executeUncached(ref.pointer); + } else { + long rawPointer = HandlePointerConverter.pointerToStub(ref.pointer); + LOGGER.fine(() -> PythonUtils.formatJString("releasing native object stub 0x%x", rawPointer)); + FreeNode.executeUncached(rawPointer); + } } private static void freeNativeStruct(PythonObjectReference ref) { assert ref.handleTableIndex == -1; - assert ref.freeAtCollection; + assert ref.isFreeAtCollection(); + assert !ref.gc; LOGGER.fine(() -> PythonUtils.formatJString("releasing %s", ref.toString())); FreeNode.executeUncached(ref.pointer); } @@ -846,8 +902,8 @@ public final long execute(Node inliningTarget, PythonAbstractObjectNativeWrapper @Specialization static long doPrimitiveNativeWrapper(Node inliningTarget, PrimitiveNativeWrapper wrapper, boolean immortal, @Shared @Cached(inline = false) CStructAccess.WriteDoubleNode writeDoubleNode, - @Shared @Cached InlinedConditionProfile isFloatObjectProfile, - @Shared @Cached AllocateNativeObjectStubNode allocateNativeObjectStubNode) { + @Exclusive @Cached InlinedConditionProfile isFloatObjectProfile, + @Exclusive @Cached AllocateNativeObjectStubNode allocateNativeObjectStubNode) { boolean isFloat = isFloatObjectProfile.profile(inliningTarget, wrapper.isDouble()); CStructs ctype = isFloat ? CStructs.GraalPyFloatObject : CStructs.GraalPyObject; Object type; @@ -860,7 +916,7 @@ static long doPrimitiveNativeWrapper(Node inliningTarget, PrimitiveNativeWrapper } else { throw CompilerDirectives.shouldNotReachHere(); } - long taggedPointer = allocateNativeObjectStubNode.execute(inliningTarget, wrapper, type, ctype, immortal); + long taggedPointer = allocateNativeObjectStubNode.execute(inliningTarget, wrapper, type, ctype, immortal, false); // allocate a native stub object (C type: GraalPy*Object) if (isFloat) { @@ -876,9 +932,12 @@ static long doOther(Node inliningTarget, PythonAbstractObjectNativeWrapper wrapp @Cached(inline = false) CStructAccess.WritePointerNode writePointerNode, @Shared @Cached(inline = false) CStructAccess.WriteDoubleNode writeDoubleNode, @Exclusive @Cached InlinedConditionProfile isVarObjectProfile, - @Shared @Cached InlinedConditionProfile isFloatObjectProfile, + @Exclusive @Cached InlinedConditionProfile isGcProfile, + @Exclusive @Cached InlinedConditionProfile isFloatObjectProfile, + @Exclusive @Cached InlinedConditionProfile isMemViewObjectProfile, @Cached GetClassNode getClassNode, - @Shared @Cached AllocateNativeObjectStubNode allocateNativeObjectStubNode) { + @Cached(inline = false) GetTypeFlagsNode getTypeFlagsNode, + @Exclusive @Cached AllocateNativeObjectStubNode allocateNativeObjectStubNode) { assert !(wrapper instanceof TruffleObjectNativeWrapper); assert !(wrapper instanceof PrimitiveNativeWrapper); @@ -891,11 +950,14 @@ static long doOther(Node inliningTarget, PythonAbstractObjectNativeWrapper wrapp ctype = CStructs.GraalPyVarObject; } else if (isFloatObjectProfile.profile(inliningTarget, delegate instanceof Double || delegate instanceof PFloat)) { ctype = CStructs.GraalPyFloatObject; + } else if (isMemViewObjectProfile.profile(inliningTarget, delegate instanceof PMemoryView)) { + ctype = CStructs.PyMemoryViewObject; } else { ctype = CStructs.GraalPyObject; } - long taggedPointer = allocateNativeObjectStubNode.execute(inliningTarget, wrapper, type, ctype, immortal); + boolean gc = isGcProfile.profile(inliningTarget, (getTypeFlagsNode.execute(type) & TypeFlags.HAVE_GC) != 0); + long taggedPointer = allocateNativeObjectStubNode.execute(inliningTarget, wrapper, type, ctype, immortal, gc); // allocate a native stub object (C type: GraalPy*Object) if (ctype == CStructs.GraalPyVarObject) { @@ -929,15 +991,17 @@ static long doOther(Node inliningTarget, PythonAbstractObjectNativeWrapper wrapp @GenerateCached(false) abstract static class AllocateNativeObjectStubNode extends Node { - abstract long execute(Node inliningTarget, PythonAbstractObjectNativeWrapper wrapper, Object type, CStructs ctype, boolean immortal); + abstract long execute(Node inliningTarget, PythonAbstractObjectNativeWrapper wrapper, Object type, CStructs ctype, boolean immortal, boolean gc); @Specialization - static long doGeneric(Node inliningTarget, PythonAbstractObjectNativeWrapper wrapper, Object type, CStructs ctype, boolean immortal, + static long doGeneric(Node inliningTarget, PythonAbstractObjectNativeWrapper wrapper, Object type, CStructs ctype, boolean immortal, boolean gc, @Cached(inline = false) GilNode gil, @Cached(inline = false) CStructAccess.AllocateNode allocateNode, @Cached(inline = false) CStructAccess.WriteLongNode writeLongNode, @Cached(inline = false) CStructAccess.WriteObjectNewRefNode writeObjectNode, + @Cached(inline = false) CStructAccess.ReadI32Node readI32Node, @Cached(inline = false) CStructAccess.WriteIntNode writeIntNode, + @Cached(inline = false) CStructAccess.GetElementPtrNode getElementPtrNode, @Cached CoerceNativePointerToLongNode coerceToLongNode) { log(wrapper); @@ -945,13 +1009,42 @@ static long doGeneric(Node inliningTarget, PythonAbstractObjectNativeWrapper wra long initialRefCount = immortal ? IMMORTAL_REFCNT : MANAGED_REFCNT; - // allocate a native stub object (C type: GraalPy*Object) - Object nativeObjectStub = allocateNode.alloc(ctype); + /* + * Allocate a native stub object (C type: GraalPy*Object). For types that participate in + * Python's GC, we will also allocate space for 'PyGC_Head'. + */ + long presize = gc ? CStructs.PyGC_Head.size() : 0; + Object nativeObjectStub = allocateNode.alloc(ctype.size() + presize); - HandleContext handleContext = PythonContext.get(inliningTarget).nativeContext; + PythonContext pythonContext = PythonContext.get(inliningTarget); + HandleContext handleContext = pythonContext.nativeContext; long stubPointer = coerceToLongNode.execute(inliningTarget, nativeObjectStub); long taggedPointer = HandlePointerConverter.stubToPointer(stubPointer); + if (gc) { + // adjust allocation count of generation + // GCState *gcstate = get_gc_state(); + Object gcState = pythonContext.getCApiContext().getGCState(); + assert gcState != null; + // compute start address of embedded array; essentially '&gcstate->generations[0]' + Object generations = getElementPtrNode.getElementPtr(gcState, CFields.GCState__generations); + + // gcstate->generations[0].count++; + int count = readI32Node.read(generations, CFields.GCGeneration__count); + writeIntNode.write(generations, CFields.GCGeneration__count, count + 1); + + /* + * The corresponding location in CPython (i.e. 'typeobject.c: PyType_GenericAlloc') + * would now track the object. We don't do that yet because the object is still + * weakly referenced. As soon as someone increfs, the object will be added to the + * young generation. + */ + + // same as in 'gcmodule.c: gc_alloc': PyObject *op = (PyObject *)(mem + presize); + stubPointer += presize; + taggedPointer += presize; + } + writeLongNode.write(stubPointer, CFields.PyObject__ob_refcnt, initialRefCount); // TODO(fa): this should not require the GIL (GR-51314) @@ -963,7 +1056,7 @@ static long doGeneric(Node inliningTarget, PythonAbstractObjectNativeWrapper wra // accidentally maps to some valid object. assert idx > 0; writeIntNode.write(stubPointer, CFields.GraalPyObject__handle_table_index, idx); - PythonObjectReference ref = PythonObjectReference.create(handleContext, wrapper, immortal, taggedPointer, idx); + PythonObjectReference ref = PythonObjectReference.create(handleContext, wrapper, immortal, taggedPointer, idx, gc); nativeStubLookupPut(handleContext, ref); } catch (OverflowException e) { /* @@ -972,7 +1065,7 @@ static long doGeneric(Node inliningTarget, PythonAbstractObjectNativeWrapper wra * Python-level MemoryError. */ CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, PythonBuiltinClassType.MemoryError); + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.MemoryError); } finally { gil.release(acquired); } @@ -1099,14 +1192,15 @@ public abstract static class ResolveHandleNode extends Node { @Specialization static PythonNativeWrapper doGeneric(Node inliningTarget, long pointer, @Cached(inline = false) CStructAccess.ReadI32Node readI32Node, - @Cached InlinedExactClassProfile profile) { + @Cached InlinedExactClassProfile profile, + @Cached UpdateStrongRefNode updateRefNode) { HandleContext nativeContext = PythonContext.get(inliningTarget).nativeContext; int idx = readI32Node.read(HandlePointerConverter.pointerToStub(pointer), CFields.GraalPyObject__handle_table_index); PythonObjectReference reference = nativeStubLookupGet(nativeContext, pointer, idx); PythonNativeWrapper wrapper = profile.profile(inliningTarget, reference.get()); assert wrapper != null : "reference was collected: " + Long.toHexString(pointer); if (wrapper instanceof PythonAbstractObjectNativeWrapper objectNativeWrapper) { - objectNativeWrapper.incRef(); + updateRefNode.execute(inliningTarget, objectNativeWrapper, objectNativeWrapper.incRef()); } return wrapper; } @@ -1178,11 +1272,35 @@ protected boolean needsTransfer() { } @Specialization - Object doNative(PythonAbstractNativeObject obj, - @CachedLibrary(limit = "2") InteropLibrary lib) { - if (needsTransfer() && getContext().isNativeAccessAllowed()) { + static Object doNative(PythonAbstractNativeObject obj, + @Bind("this") Node inliningTarget, + @Bind("needsTransfer()") boolean needsTransfer, + @CachedLibrary(limit = "2") InteropLibrary lib, + @Cached InlinedBranchProfile inlinedBranchProfile, + @Exclusive @Cached UpdateStrongRefNode updateRefNode) { + if (needsTransfer && PythonContext.get(inliningTarget).isNativeAccessAllowed()) { long ptr = PythonUtils.coerceToLong(obj.getPtr(), lib); - CApiTransitions.addNativeRefCount(ptr, 1); + long newRefcnt = CApiTransitions.addNativeRefCount(ptr, 1); + /* + * If a native object was only referenced from managed (i.e. refcnt == + * MANAGED_REFCNT), it may be that its native references were already replicated to + * Java and the referents are only weakly referenced because of that. If we now + * incref, the assumption under which the Python GC made the references weak, do no + * longer hold (the assumption is documented in 'gcmodule.c: move_weak_reachable'). + * Since we incref'd and now give the object to native, it may happen that the Java + * wrapper dies and so it's references would die although the object is still + * referenced from native code. To avoid this, we need to update the references of + * the replicated native references. + */ + if (newRefcnt == MANAGED_REFCNT + 1 && obj.getReplicatedNativeReferences() != null) { + inlinedBranchProfile.enter(inliningTarget); + for (Object referent : obj.getReplicatedNativeReferences()) { + if (referent instanceof PythonObject pythonObject) { + PythonAbstractObjectNativeWrapper nativeWrapper = pythonObject.getNativeWrapper(); + updateRefNode.execute(inliningTarget, nativeWrapper, nativeWrapper.getRefCount()); + } + } + } } return obj.getPtr(); } @@ -1211,8 +1329,8 @@ static Object doOther(Object obj, @Bind("this") Node inliningTarget, @Cached GetNativeWrapperNode getWrapper, @Cached GetReplacementNode getReplacementNode, - @Cached InlinedConditionProfile isStrongProfile, - @CachedLibrary(limit = "3") InteropLibrary lib) { + @CachedLibrary(limit = "3") InteropLibrary lib, + @Exclusive @Cached UpdateStrongRefNode updateRefNode) { CompilerAsserts.partialEvaluationConstant(needsTransfer); assert PythonContext.get(inliningTarget).ownsGil(); pollReferenceQueue(); @@ -1229,7 +1347,7 @@ static Object doOther(Object obj, } if (needsTransfer && wrapper instanceof PythonAbstractObjectNativeWrapper objectNativeWrapper) { // native part needs to decRef to release - objectNativeWrapper.incRef(); + long refCnt = objectNativeWrapper.incRef(); /* * This creates a new reference to the object and the ownership is transferred to * the C extension. Therefore, we need to make the reference strong such that we do @@ -1238,9 +1356,8 @@ static Object doOther(Object obj, * down to MANAGED_RECOUNT again. */ assert wrapper.ref != null; - if (isStrongProfile.profile(inliningTarget, !objectNativeWrapper.ref.isStrongReference())) { - objectNativeWrapper.ref.setStrongReference(objectNativeWrapper); - } + assert refCnt != MANAGED_REFCNT; + updateRefNode.execute(inliningTarget, objectNativeWrapper, refCnt); } assert wrapper != null; return wrapper; @@ -1332,8 +1449,9 @@ protected boolean needsTransfer() { @Specialization static Object doWrapper(PythonNativeWrapper value, @Bind("$node") Node inliningTarget, - @Exclusive @Cached InlinedExactClassProfile wrapperProfile) { - return handleWrapper(inliningTarget, wrapperProfile, false, value); + @Exclusive @Cached InlinedExactClassProfile wrapperProfile, + @Exclusive @Cached UpdateStrongRefNode updateRefNode) { + return handleWrapper(inliningTarget, wrapperProfile, updateRefNode, false, value); } @Specialization(guards = "!isNativeWrapper(value)", limit = "3") @@ -1348,7 +1466,8 @@ Object doNonWrapper(Object value, @Cached InlinedConditionProfile isNativeProfile, @Cached InlinedConditionProfile isNativeWrapperProfile, @Cached InlinedConditionProfile isHandleSpaceProfile, - @Exclusive @Cached InlinedExactClassProfile wrapperProfile) { + @Exclusive @Cached InlinedExactClassProfile wrapperProfile, + @Exclusive @Cached UpdateStrongRefNode updateRefNode) { assert !(value instanceof TruffleString); assert !(value instanceof PythonAbstractObject); assert !(value instanceof Number); @@ -1379,11 +1498,24 @@ Object doNonWrapper(Object value, int idx = readI32Node.read(HandlePointerConverter.pointerToStub(pointer), CFields.GraalPyObject__handle_table_index); PythonObjectReference reference = nativeStubLookupGet(nativeContext, pointer, idx); if (reference == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw CompilerDirectives.shouldNotReachHere("reference was freed: " + Long.toHexString(pointer)); + /* + * Here we are encountering a weakref object that has died in the managed side, + * e.g. PReferenceType, but we kept alive in the native side, see + * pollReferenceQueue(). Though, if this happens to an object that shouldn't + * have died in the managed side, the native side should catch it with a null + * pointer check. + */ + if (LOGGER.isLoggable(Level.FINE)) { + LOGGER.fine(() -> "managed weak reference has been collected: " + Long.toHexString(pointer)); + } + return PNone.NO_VALUE; } wrapper = reference.get(); if (wrapper == null) { + int collecting = readI32Node.read(pythonContext.getCApiContext().getGCState(), CFields.GCState__collecting); + if (collecting == 1) { + return PNone.NO_VALUE; + } CompilerDirectives.transferToInterpreterAndInvalidate(); throw CompilerDirectives.shouldNotReachHere("reference was collected: " + Long.toHexString(pointer)); } @@ -1410,7 +1542,7 @@ Object doNonWrapper(Object value, return createAbstractNativeObject(nativeContext, value, needsTransfer(), pointer); } } - return handleWrapper(inliningTarget, wrapperProfile, needsTransfer(), wrapper); + return handleWrapper(inliningTarget, wrapperProfile, updateRefNode, needsTransfer(), wrapper); } /** @@ -1422,7 +1554,7 @@ Object doNonWrapper(Object value, * @param wrapper The native wrapper to unwrap. * @return The Python value contained in the native wrapper. */ - static Object handleWrapper(Node node, InlinedExactClassProfile wrapperProfile, boolean transfer, PythonNativeWrapper wrapper) { + static Object handleWrapper(Node node, InlinedExactClassProfile wrapperProfile, UpdateStrongRefNode updateRefNode, boolean transfer, PythonNativeWrapper wrapper) { PythonNativeWrapper profiledWrapper = wrapperProfile.profile(node, wrapper); if (transfer && profiledWrapper instanceof PythonAbstractObjectNativeWrapper objectNativeWrapper) { /* @@ -1436,7 +1568,7 @@ static Object handleWrapper(Node node, InlinedExactClassProfile wrapperProfile, * MANAGED_REFCNT. */ assert objectNativeWrapper.getRefCount() > MANAGED_REFCNT; - objectNativeWrapper.decRef(); + updateRefNode.execute(node, objectNativeWrapper, objectNativeWrapper.decRef()); } if (profiledWrapper instanceof PrimitiveNativeWrapper primitive) { if (primitive.isBool()) { @@ -1530,7 +1662,8 @@ Object doNonWrapper(long pointer, boolean stealing, @Cached InlinedConditionProfile isNativeProfile, @Cached InlinedConditionProfile isNativeWrapperProfile, @Cached InlinedConditionProfile isHandleSpaceProfile, - @Cached InlinedExactClassProfile wrapperProfile) { + @Cached InlinedExactClassProfile wrapperProfile, + @Cached UpdateStrongRefNode updateRefNode) { assert PythonContext.get(null).ownsGil(); CompilerAsserts.partialEvaluationConstant(stealing); @@ -1576,14 +1709,74 @@ Object doNonWrapper(long pointer, boolean stealing, return createAbstractNativeObject(nativeContext, new NativePointer(pointer), stealing, pointer); } } - return NativeToPythonNode.handleWrapper(inliningTarget, wrapperProfile, stealing, wrapper); + return NativeToPythonNode.handleWrapper(inliningTarget, wrapperProfile, updateRefNode, stealing, wrapper); + } + } + + /** + * Very similar to {@link NativePtrToPythonNode}, this node resolves a native pointer (given as + * Java {@code long}) to a Python object. However, it will never create a fresh + * {@link PythonAbstractNativeObject} for a native object (it will only return one if it already + * exists). Also, this node won't fail if a tagged pointer is given and the underlying managed + * object was collected in the meantime. This is because it may happen that the native object + * stub of a managed object is in the GC list and while processing it (e.g. replicating the + * native references), the Java GC may collect it. In such cases, we don't want to fail but + * return {@code null}. + */ + @GenerateUncached + @GenerateInline + @GenerateCached(false) + public abstract static class GcNativePtrToPythonNode extends PNodeWithContext { + + public abstract Object execute(Node inliningTarget, long pointer); + + @Specialization + static Object doLong(Node inliningTarget, long pointer, + @Cached(inline = false) CStructAccess.ReadI32Node readI32Node, + @Cached InlinedBranchProfile isNativeProfile, + @Cached InlinedConditionProfile isNativeWrapperProfile, + @Cached InlinedConditionProfile isHandleSpaceProfile) { + + PythonContext pythonContext = PythonContext.get(inliningTarget); + HandleContext nativeContext = pythonContext.nativeContext; + + assert pointer != 0; + assert pythonContext.ownsGil(); + if (isHandleSpaceProfile.profile(inliningTarget, HandlePointerConverter.pointsToPyHandleSpace(pointer))) { + int idx = readI32Node.read(HandlePointerConverter.pointerToStub(pointer), CFields.GraalPyObject__handle_table_index); + PythonObjectReference reference = nativeStubLookupGet(nativeContext, pointer, idx); + if (reference == null) { + /* + * This should really not happen since it most likely means that we accessed + * free'd memory to read the handle table index. + */ + CompilerDirectives.transferToInterpreterAndInvalidate(); + throw CompilerDirectives.shouldNotReachHere("reference was freed: " + Long.toHexString(pointer)); + } + PythonNativeWrapper wrapper = reference.get(); + return wrapper != null ? wrapper.getDelegate() : null; + } else { + IdReference lookup = nativeLookupGet(nativeContext, pointer); + Object referent; + if (lookup != null && (referent = lookup.get()) != null) { + isNativeProfile.enter(inliningTarget); + if (isNativeWrapperProfile.profile(inliningTarget, referent instanceof PythonAbstractObjectNativeWrapper)) { + assert referent instanceof PythonAbstractObjectNativeWrapper; + return ((PythonAbstractObjectNativeWrapper) referent).getDelegate(); + } else { + assert referent instanceof PythonAbstractNativeObject; + return referent; + } + } + return null; + } } } private static final Unsafe UNSAFE = PythonUtils.initUnsafe(); private static final int TP_REFCNT_OFFSET = 0; - private static long addNativeRefCount(long pointer, long refCntDelta) { + public static long addNativeRefCount(long pointer, long refCntDelta) { return addNativeRefCount(pointer, refCntDelta, false); } @@ -1603,7 +1796,7 @@ private static long addNativeRefCount(long pointer, long refCntDelta, boolean ig return refCount + refCntDelta; } - private static long subNativeRefCount(long pointer, long refCntDelta) { + public static long subNativeRefCount(long pointer, long refCntDelta) { assert PythonContext.get(null).isNativeAccessAllowed(); assert PythonContext.get(null).ownsGil(); long refCount = UNSAFE.getLong(pointer + TP_REFCNT_OFFSET); @@ -1665,45 +1858,19 @@ public static boolean isBackendPointerObject(Object obj) { } @GenerateUncached - @GenerateInline(false) - @ImportStatic(CApiGuards.class) - public abstract static class ToPythonWrapperNode extends CExtToJavaNode { - - public static PythonNativeWrapper executeUncached(Object obj, boolean strict) { - return getUncached().executeWrapper(obj, strict); - } - - @Override - public final Object execute(Object object) { - return executeWrapper(object, true); - } + @GenerateInline + @GenerateCached(false) + public abstract static class NativePtrToPythonWrapperNode extends Node { - public abstract PythonNativeWrapper executeWrapper(Object obj, boolean strict); + public abstract PythonNativeWrapper execute(Node inliningTarget, long ptr, boolean strict); - @Specialization(guards = "!isNativeWrapper(obj)", limit = "3") - static PythonNativeWrapper doNonWrapper(Object obj, boolean strict, - @Bind("this") Node inliningTarget, - @Cached CStructAccess.ReadI32Node readI32Node, - @CachedLibrary("obj") InteropLibrary interopLibrary, + @Specialization + static PythonNativeWrapper doGeneric(Node inliningTarget, long pointer, boolean strict, + @Cached(inline = false) CStructAccess.ReadI32Node readI32Node, @Cached InlinedConditionProfile isNullProfile, - @Cached InlinedConditionProfile isLongProfile, @Cached InlinedConditionProfile isNativeProfile, @Cached InlinedExactClassProfile nativeWrapperProfile, @Cached InlinedConditionProfile isHandleSpaceProfile) { - long pointer; - if (isLongProfile.profile(inliningTarget, obj instanceof Long)) { - pointer = (long) obj; - } else { - if (!interopLibrary.isPointer(obj)) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw CompilerDirectives.shouldNotReachHere("not a pointer: " + obj); - } - try { - pointer = interopLibrary.asPointer(obj); - } catch (final UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - } if (isNullProfile.profile(inliningTarget, pointer == 0)) { return null; } @@ -1714,11 +1881,11 @@ static PythonNativeWrapper doNonWrapper(Object obj, boolean strict, int idx = readI32Node.read(HandlePointerConverter.pointerToStub(pointer), CFields.GraalPyObject__handle_table_index); PythonObjectReference reference = nativeStubLookupGet(nativeContext, pointer, idx); PythonNativeWrapper wrapper; - if (reference == null) { + if (strict && reference == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); throw CompilerDirectives.shouldNotReachHere("reference was freed: " + Long.toHexString(pointer)); } - wrapper = reference.get(); + wrapper = reference == null ? null : reference.get(); if (strict && wrapper == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); throw CompilerDirectives.shouldNotReachHere("reference was collected: " + Long.toHexString(pointer)); @@ -1728,7 +1895,7 @@ static PythonNativeWrapper doNonWrapper(Object obj, boolean strict, IdReference lookup = nativeLookupGet(nativeContext, pointer); if (isNativeProfile.profile(inliningTarget, lookup != null)) { Object ref = lookup.get(); - if (ref == null) { + if (strict && ref == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); throw CompilerDirectives.shouldNotReachHere("reference was collected: " + Long.toHexString(pointer)); } @@ -1740,6 +1907,46 @@ static PythonNativeWrapper doNonWrapper(Object obj, boolean strict, return null; } } + } + + @GenerateUncached + @GenerateInline(false) + @ImportStatic(CApiGuards.class) + public abstract static class ToPythonWrapperNode extends CExtToJavaNode { + + public static PythonNativeWrapper executeUncached(Object obj, boolean strict) { + return getUncached().executeWrapper(obj, strict); + } + + @Override + public final Object execute(Object object) { + return executeWrapper(object, true); + } + + public abstract PythonNativeWrapper executeWrapper(Object obj, boolean strict); + + @Specialization(guards = "!isNativeWrapper(obj)", limit = "3") + static PythonNativeWrapper doNonWrapper(Object obj, boolean strict, + @Bind("this") Node inliningTarget, + @CachedLibrary("obj") InteropLibrary interopLibrary, + @Cached NativePtrToPythonWrapperNode nativePtrToPythonWrapperNode, + @Cached InlinedConditionProfile isLongProfile) { + long pointer; + if (isLongProfile.profile(inliningTarget, obj instanceof Long)) { + pointer = (long) obj; + } else { + if (!interopLibrary.isPointer(obj)) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + throw CompilerDirectives.shouldNotReachHere("not a pointer: " + obj); + } + try { + pointer = interopLibrary.asPointer(obj); + } catch (final UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } + return nativePtrToPythonWrapperNode.execute(inliningTarget, pointer, strict); + } @Specialization static PythonNativeWrapper doWrapper(PythonNativeWrapper wrapper, @SuppressWarnings("unused") boolean strict) { @@ -1786,4 +1993,51 @@ static Object doGeneric(Object object, return object; } } + + /** + * Adjusts the native wrapper's reference to be weak (if {@code refCount <= MANAGED_REFCNT}) or + * to be strong (if {@code refCount > MANAGED_REFCNT}) if there is a reference. This node should + * be called at appropriate points in the program, e.g., it should be called from native code if + * the refcount falls below {@link PythonAbstractObjectNativeWrapper#MANAGED_REFCNT}. + * + * Additionally, if the reference to a wrapper will be made weak and the wrapper takes part in + * the Python GC and is currently tracked, it will be removed from the GC list. This is done to + * reduce the GC list size and avoid repeated upcalls to ensure that a + * {@link PythonObjectReference} is weak. + */ + @GenerateUncached + @GenerateInline + @GenerateCached(false) + public abstract static class UpdateStrongRefNode extends Node { + + public final void execute(Node inliningTarget, PythonAbstractObjectNativeWrapper wrapper, long refCount) { + execute(inliningTarget, wrapper, refCount > MANAGED_REFCNT); + } + + public final void clearStrongRef(Node inliningTarget, PythonAbstractObjectNativeWrapper wrapper) { + execute(inliningTarget, wrapper, false); + } + + public abstract void execute(Node inliningTarget, PythonAbstractObjectNativeWrapper wrapper, boolean setStrong); + + @Specialization + static void doGeneric(Node inliningTarget, PythonAbstractObjectNativeWrapper wrapper, boolean setStrong, + @Cached InlinedConditionProfile hasRefProfile, + @Cached PyObjectGCTrackNode gcTrackNode) { + PythonObjectReference ref; + if (hasRefProfile.profile(inliningTarget, (ref = wrapper.ref) != null)) { + assert ref.pointer == wrapper.getNativePointer(); + if (setStrong && !ref.isStrongReference()) { + ref.setStrongReference(wrapper); + if (ref.gc && PythonLanguage.get(inliningTarget).getEngineOption(PythonOptions.PythonGC)) { + // gc = AS_GC(op) + long gc = wrapper.getNativePointer() - CStructs.PyGC_Head.size(); + gcTrackNode.execute(inliningTarget, gc); + } + } else if (!setStrong && ref.isStrongReference()) { + ref.setStrongReference(null); + } + } + } + } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/GetNativeWrapperNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/GetNativeWrapperNode.java index de718e9d74..444b1fdfd0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/GetNativeWrapperNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/transitions/GetNativeWrapperNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,6 +40,7 @@ */ package com.oracle.graal.python.builtins.objects.cext.capi.transitions; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; @@ -53,6 +54,7 @@ import com.oracle.graal.python.builtins.objects.cext.capi.TruffleObjectNativeWrapper; import com.oracle.graal.python.builtins.objects.floats.PFloat; import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode; @@ -60,11 +62,12 @@ import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.object.IsForeignObjectNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; +import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; @@ -77,14 +80,18 @@ @ImportStatic({PGuards.class, CApiGuards.class}) public abstract class GetNativeWrapperNode extends PNodeWithContext { + public static PythonNativeWrapper executeUncached(Object value) { + return GetNativeWrapperNodeGen.getUncached().execute(value); + } + public abstract PythonNativeWrapper execute(Object value); @Specialization static PythonAbstractObjectNativeWrapper doString(TruffleString str, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Exclusive @Cached InlinedConditionProfile noWrapperProfile) { - return PythonObjectNativeWrapper.wrap(factory.createString(str), inliningTarget, noWrapperProfile); + return PythonObjectNativeWrapper.wrap(PFactory.createString(language, str), inliningTarget, noWrapperProfile); } @Specialization @@ -168,15 +175,17 @@ static PythonNativeWrapper doSingleton(PythonAbstractObject object, @Specialization static PythonNativeWrapper doPythonClassUncached(PythonManagedClass object, @Bind("this") Node inliningTarget, - @Exclusive @Cached TypeNodes.GetNameNode getNameNode) { - return PythonClassNativeWrapper.wrap(object, getNameNode.execute(inliningTarget, object)); + @Cached TypeNodes.GetTpNameNode getTpNameNode, + @Shared @Cached TruffleString.SwitchEncodingNode switchEncoding) { + return PythonClassNativeWrapper.wrap(object, getTpNameNode.execute(inliningTarget, object), switchEncoding); } @Specialization static PythonNativeWrapper doPythonTypeUncached(PythonBuiltinClassType object, @Bind("this") Node inliningTarget, - @Exclusive @Cached TypeNodes.GetNameNode getNameNode) { - return PythonClassNativeWrapper.wrap(PythonContext.get(getNameNode).lookupType(object), getNameNode.execute(inliningTarget, object)); + @Shared @Cached TruffleString.SwitchEncodingNode switchEncoding) { + PythonBuiltinClass type = PythonContext.get(inliningTarget).lookupType(object); + return PythonClassNativeWrapper.wrap(type, type.getName(), switchEncoding); } @Specialization(guards = {"!isClass(inliningTarget, object, isTypeNode)", "!isNativeObject(object)", "!isSpecialSingleton(object)"}, limit = "1") diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/common/CArrayWrappers.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/common/CArrayWrappers.java index 4c752e5792..1c5d85f020 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/common/CArrayWrappers.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/common/CArrayWrappers.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,7 +40,6 @@ */ package com.oracle.graal.python.builtins.objects.cext.common; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.byteArraySupport; import java.nio.ByteOrder; @@ -58,7 +57,6 @@ import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.InvalidArrayIndexException; import com.oracle.truffle.api.interop.InvalidBufferOffsetException; @@ -175,25 +173,22 @@ public void free() { * wrapper let's a TruffleString look like a {@code char*}. */ @ExportLibrary(InteropLibrary.class) - @SuppressWarnings("truffle-abstract-export") public static final class CStringWrapper extends CArrayWrapper { + private TruffleString.Encoding encoding; - public CStringWrapper(TruffleString delegate) { + public CStringWrapper(TruffleString delegate, TruffleString.Encoding encoding) { super(delegate); + this.encoding = encoding; + assert delegate.isValidUncached(encoding); } public TruffleString getString() { - TruffleString s = (TruffleString) getDelegate(); - // TODO GR-37217: use sys.getdefaultencoding if the string contains non-latin1 - // codepoints - assert s.getCodeRangeUncached(TS_ENCODING) == TruffleString.CodeRange.ASCII; - return s; + return (TruffleString) getDelegate(); } @ExportMessage - long getArraySize( - @Shared @Cached TruffleString.CodePointLengthNode codePointLengthNode) { - return codePointLengthNode.execute(getString(), TS_ENCODING) + 1; + long getArraySize() { + return getString().byteLength(encoding) + 1; } @ExportMessage @@ -204,28 +199,17 @@ boolean hasArrayElements() { @ExportMessage byte readArrayElement(long index, - @Shared @Cached TruffleString.CodePointLengthNode codePointLengthNode, - @Shared @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode) throws InvalidArrayIndexException { + @CachedLibrary("this") InteropLibrary thisLib) throws InvalidArrayIndexException, UnsupportedMessageException { try { - int idx = PInt.intValueExact(index); - TruffleString s = getString(); - int len = codePointLengthNode.execute(s, TS_ENCODING); - if (idx >= 0 && idx < len) { - return (byte) codePointAtIndexNode.execute(s, idx, TS_ENCODING); - } else if (idx == len) { - return 0; - } - } catch (OverflowException e) { - // fall through + return thisLib.readBufferByte(this, index); + } catch (InvalidBufferOffsetException e) { + throw InvalidArrayIndexException.create(index); } - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw InvalidArrayIndexException.create(index); } @ExportMessage - boolean isArrayElementReadable(long identifier, - @Shared @Cached TruffleString.CodePointLengthNode codePointLengthNode) { - return 0 <= identifier && identifier < getArraySize(codePointLengthNode); + boolean isArrayElementReadable(long index) { + return 0 <= index && index <= getString().byteLength(encoding); } @ExportMessage @@ -248,19 +232,17 @@ boolean hasBufferElements() { } @ExportMessage - long getBufferSize( - @Shared @Cached TruffleString.CodePointLengthNode codePointLengthNode) { - return codePointLengthNode.execute(getString(), TS_ENCODING) + 1; + long getBufferSize() { + return getString().byteLength(encoding) + 1; } @ExportMessage byte readBufferByte(long byteOffset, - @Shared @Cached TruffleString.CodePointLengthNode codePointLengthNode, - @Shared @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode) throws InvalidBufferOffsetException { + @Cached TruffleString.ReadByteNode readByteNode) throws InvalidBufferOffsetException { TruffleString s = getString(); - int len = codePointLengthNode.execute(s, TS_ENCODING); + int len = s.byteLength(encoding); if (byteOffset >= 0 && byteOffset < len) { - return (byte) codePointAtIndexNode.execute(s, (int) byteOffset, TS_ENCODING); + return (byte) readByteNode.execute(s, (int) byteOffset, encoding); } else if (byteOffset == len) { return 0; } else { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/common/CExtCommonNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/common/CExtCommonNodes.java index 47c07193e6..0d6de96176 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/common/CExtCommonNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/common/CExtCommonNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,6 +43,7 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError; import static com.oracle.graal.python.nodes.ErrorMessages.RETURNED_NULL_WO_SETTING_EXCEPTION; import static com.oracle.graal.python.nodes.ErrorMessages.RETURNED_RESULT_WITH_EXCEPTION_SET; +import static com.oracle.graal.python.nodes.StringLiterals.J_NFI_LANGUAGE; import static com.oracle.graal.python.nodes.StringLiterals.T_STRICT; import static com.oracle.graal.python.runtime.exception.PythonErrorType.SystemError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; @@ -55,18 +56,24 @@ import java.nio.charset.Charset; import java.nio.charset.CodingErrorAction; import java.nio.charset.StandardCharsets; +import java.util.logging.Level; + +import org.graalvm.collections.Pair; import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.bytes.BytesCommonBuiltins; import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr; +import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; import com.oracle.graal.python.builtins.objects.cext.capi.CApiGuards; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.FromCharPointerNode; import com.oracle.graal.python.builtins.objects.cext.capi.PThreadState; import com.oracle.graal.python.builtins.objects.cext.capi.PrimitiveNativeWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode; import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CByteArrayWrapper; +import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodesFactory.EnsureExecutableNodeGen; import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodesFactory.GetIndexNodeGen; import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodesFactory.ReadUnicodeArrayNodeGen; import com.oracle.graal.python.builtins.objects.cext.structs.CFields; @@ -75,19 +82,17 @@ import com.oracle.graal.python.builtins.objects.exception.PBaseException; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.traceback.LazyTraceback; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.CallSlotLenNode; import com.oracle.graal.python.lib.PyFloatAsDoubleNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; +import com.oracle.graal.python.lib.PyNumberIndexNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; import com.oracle.graal.python.nodes.frame.GetCurrentFrameRef; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.util.CannotCastException; @@ -100,12 +105,15 @@ import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonErrorType; import com.oracle.graal.python.runtime.exception.PythonExitException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.OverflowException; import com.oracle.graal.python.util.PythonUtils; +import com.oracle.truffle.api.CallTarget; +import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.TruffleLogger; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; @@ -113,7 +121,10 @@ import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.Idempotent; import com.oracle.truffle.api.dsl.ImportStatic; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.NonIdempotent; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.exception.AbstractTruffleException; import com.oracle.truffle.api.frame.Frame; @@ -121,11 +132,15 @@ import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.CachedLibrary; +import com.oracle.truffle.api.nodes.DirectCallNode; +import com.oracle.truffle.api.nodes.IndirectCallNode; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.UnexpectedResultException; import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.profiles.InlinedConditionProfile; +import com.oracle.truffle.api.source.Source; import com.oracle.truffle.api.strings.TruffleString; +import com.oracle.truffle.nfi.api.SignatureLibrary; public abstract class CExtCommonNodes { @TruffleBoundary @@ -187,18 +202,18 @@ static byte[] doGeneric(Charset charset, Object unicodeObject, TruffleString err @Bind("this") Node inliningTarget, @Cached CastToTruffleStringNode castToTruffleStringNode, @Cached TruffleString.EqualNode eqNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { TruffleString str; try { str = castToTruffleStringNode.execute(inliningTarget, unicodeObject); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_MUST_BE_S_NOT_P, "argument", "a string", unicodeObject); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_MUST_BE_S_NOT_P, "argument", "a string", unicodeObject); } try { CodingErrorAction action = BytesCommonBuiltins.toCodingErrorAction(inliningTarget, errors, raiseNode, eqNode); return BytesCommonBuiltins.doEncode(charset, str, action); } catch (CharacterCodingException e) { - throw raiseNode.get(inliningTarget).raise(UnicodeEncodeError, ErrorMessages.M, e); + throw raiseNode.raise(inliningTarget, UnicodeEncodeError, ErrorMessages.M, e); } } } @@ -441,7 +456,7 @@ static double doDoubleNativeWrapper(PrimitiveNativeWrapper object) { public abstract static class CheckFunctionResultNode extends PNodeWithContext { public final Object execute(PythonContext context, TruffleString name, Object result) { - PythonLanguage language = PythonLanguage.get(this); + PythonLanguage language = context.getLanguage(this); return execute(context.getThreadState(language), name, result); } @@ -523,7 +538,7 @@ public abstract static class TransformExceptionFromNativeNode extends Node { /** * Checks the current exception state with respect to flag {@code indicatesError} (and * {@code strict}). - * + * * * @param inliningTarget The processing node (also needed for the source location if a * {@code SystemError} is raised). @@ -590,14 +605,15 @@ private static void checkFunctionResultSlowpath(Node inliningTarget, PythonThrea @TruffleBoundary private static PException raiseNullButNoError(Node node, TruffleString name, TruffleString nullButNoErrorMessage) { - throw PRaiseNode.raiseUncached(node, SystemError, nullButNoErrorMessage, name); + throw PRaiseNode.raiseStatic(node, SystemError, nullButNoErrorMessage, name); } @TruffleBoundary private static PException raiseResultWithError(Node node, TruffleString name, AbstractTruffleException currentException, TruffleString resultWithErrorMessage) { - PBaseException sysExc = PythonObjectFactory.getUncached().createBaseException(SystemError, resultWithErrorMessage, new Object[]{name}); + PythonLanguage language = PythonLanguage.get(null); + PBaseException sysExc = PFactory.createBaseException(language, SystemError, resultWithErrorMessage, new Object[]{name}); sysExc.setCause(GetEscapedExceptionNode.executeUncached(currentException)); - throw PRaiseNode.raiseExceptionObject(node, sysExc, PythonOptions.isPExceptionWithJavaStacktrace(PythonLanguage.get(null))); + throw PRaiseNode.raiseExceptionObject(node, sysExc, PythonOptions.isPExceptionWithJavaStacktrace(language)); } } @@ -638,7 +654,7 @@ private static byte[] subRangeIfNeeded(byte[] bytes, long n) { * If {@code exact} is {@code false}, then casting can be lossy without raising an error. */ @GenerateUncached - @ImportStatic({PGuards.class, SpecialMethodSlot.class}) + @ImportStatic(PGuards.class) @GenerateInline(false) // footprint reduction 32 -> 15, triggers GR-44020 public abstract static class AsNativePrimitiveNode extends Node { @@ -681,9 +697,10 @@ static int doIntToUInt32Pos(int value, int signed, int targetTypeSize, boolean e @Specialization(guards = {"targetTypeSize == 4", "signed == 0"}, replaces = "doIntToUInt32Pos") @SuppressWarnings("unused") static int doIntToUInt32(int value, int signed, int targetTypeSize, boolean exact, + @Bind("this") Node inliningTarget, @Shared("raiseNativeNode") @Cached PRaiseNode raiseNativeNode) { if (exact && value < 0) { - throw raiseNegativeValue(raiseNativeNode); + throw raiseNegativeValue(inliningTarget, raiseNativeNode); } return value; } @@ -703,9 +720,10 @@ static long doIntToUInt64Pos(int value, int signed, int targetTypeSize, boolean @Specialization(guards = {"targetTypeSize == 8", "signed == 0"}, replaces = "doIntToUInt64Pos") @SuppressWarnings("unused") static long doIntToUInt64(int value, int signed, int targetTypeSize, boolean exact, + @Bind("this") Node inliningTarget, @Shared("raiseNativeNode") @Cached PRaiseNode raiseNativeNode) { if (exact && value < 0) { - throw raiseNegativeValue(raiseNativeNode); + throw raiseNegativeValue(inliningTarget, raiseNativeNode); } return value; } @@ -725,9 +743,10 @@ static long doLongToUInt64Pos(long value, int signed, int targetTypeSize, boolea @Specialization(guards = {"targetTypeSize == 8", "signed == 0"}, replaces = "doLongToUInt64Pos") @SuppressWarnings("unused") static long doLongToUInt64(long value, int signed, int targetTypeSize, boolean exact, + @Bind("this") Node inliningTarget, @Shared("raiseNativeNode") @Cached PRaiseNode raiseNativeNode) { if (exact && value < 0) { - throw raiseNegativeValue(raiseNativeNode); + throw raiseNegativeValue(inliningTarget, raiseNativeNode); } return value; } @@ -735,33 +754,36 @@ static long doLongToUInt64(long value, int signed, int targetTypeSize, boolean e @Specialization(guards = {"exact", "targetTypeSize == 4", "signed != 0"}) @SuppressWarnings("unused") static int doLongToInt32Exact(long obj, int signed, int targetTypeSize, boolean exact, + @Bind("this") Node inliningTarget, @Shared("raiseNode") @Cached PRaiseNode raiseNode) { try { return PInt.intValueExact(obj); } catch (OverflowException e) { - throw raiseNode.raise(PythonErrorType.OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO_C_TYPE, targetTypeSize); + throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO_C_TYPE, targetTypeSize); } } @Specialization(guards = {"exact", "targetTypeSize == 4", "signed == 0", "obj >= 0"}) @SuppressWarnings("unused") static int doLongToUInt32PosExact(long obj, int signed, int targetTypeSize, boolean exact, + @Bind("this") Node inliningTarget, @Shared("raiseNode") @Cached PRaiseNode raiseNode) { if (Integer.toUnsignedLong((int) obj) == obj) { return (int) obj; } else { - throw raiseNode.raise(PythonErrorType.OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO_C_TYPE, targetTypeSize); + throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO_C_TYPE, targetTypeSize); } } @Specialization(guards = {"exact", "targetTypeSize == 4", "signed == 0"}, replaces = "doLongToUInt32PosExact") @SuppressWarnings("unused") static int doLongToUInt32Exact(long obj, int signed, int targetTypeSize, boolean exact, + @Bind("this") Node inliningTarget, @Shared("raiseNode") @Cached PRaiseNode raiseNode) { if (obj < 0) { - throw raiseNegativeValue(raiseNode); + throw raiseNegativeValue(inliningTarget, raiseNode); } - return doLongToUInt32PosExact(obj, signed, targetTypeSize, exact, raiseNode); + return doLongToUInt32PosExact(obj, signed, targetTypeSize, exact, inliningTarget, raiseNode); } @Specialization(guards = {"!exact", "targetTypeSize == 4"}) @@ -780,40 +802,42 @@ static Object doVoidPtrToI64(PythonNativeVoidPtr obj, int signed, int targetType @SuppressWarnings("unused") @TruffleBoundary static int doPIntTo32Bit(PInt obj, int signed, int targetTypeSize, boolean exact, + @Bind("this") Node inliningTarget, @Shared("raiseNode") @Cached PRaiseNode raiseNode) { try { if (signed != 0) { return obj.intValueExact(); } else if (obj.bitLength() <= 32) { if (obj.isNegative()) { - throw raiseNegativeValue(raiseNode); + throw raiseNegativeValue(inliningTarget, raiseNode); } return obj.intValue(); } } catch (OverflowException e) { // fall through } - throw raiseNode.raise(PythonErrorType.OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO_C_TYPE, targetTypeSize); + throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO_C_TYPE, targetTypeSize); } @Specialization(guards = {"exact", "targetTypeSize == 8"}) @SuppressWarnings("unused") @TruffleBoundary static long doPIntTo64Bit(PInt obj, int signed, int targetTypeSize, boolean exact, + @Bind("this") Node inliningTarget, @Shared("raiseNode") @Cached PRaiseNode raiseNode) { try { if (signed != 0) { return obj.longValueExact(); } else if (obj.bitLength() <= 64) { if (obj.isNegative()) { - throw raiseNegativeValue(raiseNode); + throw raiseNegativeValue(inliningTarget, raiseNode); } return obj.longValue(); } } catch (OverflowException e) { // fall through } - throw raiseNode.raise(PythonErrorType.OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO_C_TYPE, targetTypeSize); + throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO_C_TYPE, targetTypeSize); } @Specialization(guards = {"!exact", "targetTypeSize == 4"}) @@ -837,21 +861,9 @@ static long doPIntToInt64Lossy(PInt obj, int signed, int targetTypeSize, boolean "doPIntTo32Bit", "doPIntTo64Bit", "doPIntToInt32Lossy", "doPIntToInt64Lossy"}) static Object doGeneric(Object obj, int signed, int targetTypeSize, boolean exact, @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached(parameters = "Index") LookupSpecialMethodSlotNode lookupIndex, - @Cached CallUnaryMethodNode call, + @Cached PyNumberIndexNode indexNode, @Shared("raiseNode") @Cached PRaiseNode raiseNode) { - - Object type = getClassNode.execute(inliningTarget, obj); - Object indexDescr = lookupIndex.execute(null, type, obj); - - Object result; - if (indexDescr != PNone.NO_VALUE) { - result = call.executeObject(null, indexDescr, obj); - } else { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.INTEGER_REQUIRED_GOT, obj); - } - + Object result = indexNode.execute(null, inliningTarget, obj); /* * The easiest would be to recursively use this node and ensure that this generic case * isn't taken but we cannot guarantee that because the uncached version will always try @@ -860,84 +872,84 @@ static Object doGeneric(Object obj, int signed, int targetTypeSize, boolean exac * 'signed', 'targetTypeSize', and 'exact' are usually constants. */ if (targetTypeSize == 4) { - return toInt32(result, signed, exact, raiseNode); + return toInt32(inliningTarget, result, signed, exact, raiseNode); } else if (targetTypeSize == 8) { - return toInt64(result, signed, exact, raiseNode); + return toInt64(inliningTarget, result, signed, exact, raiseNode); } - throw raiseNode.raise(SystemError, ErrorMessages.UNSUPPORTED_TARGET_SIZE, targetTypeSize); + throw raiseNode.raise(inliningTarget, SystemError, ErrorMessages.UNSUPPORTED_TARGET_SIZE, targetTypeSize); } @Specialization(guards = {"targetTypeSize != 4", "targetTypeSize != 8"}) @SuppressWarnings("unused") static int doUnsupportedTargetSize(Object obj, int signed, int targetTypeSize, boolean exact, - @Shared("raiseNode") @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(SystemError, ErrorMessages.UNSUPPORTED_TARGET_SIZE, targetTypeSize); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, ErrorMessages.UNSUPPORTED_TARGET_SIZE, targetTypeSize); } - private static PException raiseNegativeValue(PRaiseNode raiseNativeNode) { - throw raiseNativeNode.raise(OverflowError, ErrorMessages.CANNOT_CONVERT_NEGATIVE_VALUE_TO_UNSIGNED_INT); + private static PException raiseNegativeValue(Node inliningTarget, PRaiseNode raiseNativeNode) { + throw raiseNativeNode.raise(inliningTarget, OverflowError, ErrorMessages.CANNOT_CONVERT_NEGATIVE_VALUE_TO_UNSIGNED_INT); } /** * Slow-path conversion of an object to a signed or unsigned 32-bit value. */ - private static int toInt32(Object object, int signed, boolean exact, + private static int toInt32(Node inliningTarget, Object object, int signed, boolean exact, PRaiseNode raiseNode) { if (object instanceof Integer) { int ival = (int) object; if (signed != 0) { return ival; } - return doIntToUInt32(ival, signed, 4, exact, raiseNode); + return doIntToUInt32(ival, signed, 4, exact, inliningTarget, raiseNode); } else if (object instanceof Long) { long lval = (long) object; if (exact) { if (signed != 0) { - return doLongToInt32Exact(lval, 1, 4, true, raiseNode); + return doLongToInt32Exact(lval, 1, 4, true, inliningTarget, raiseNode); } - return doLongToUInt32Exact(lval, signed, 4, true, raiseNode); + return doLongToUInt32Exact(lval, signed, 4, true, inliningTarget, raiseNode); } return doLongToInt32Lossy(lval, 0, 4, false); } else if (object instanceof PInt) { PInt pval = (PInt) object; if (exact) { - return doPIntTo32Bit(pval, signed, 4, true, raiseNode); + return doPIntTo32Bit(pval, signed, 4, true, inliningTarget, raiseNode); } return doPIntToInt32Lossy(pval, signed, 4, false); } else if (object instanceof PythonNativeVoidPtr) { // that's just not possible - throw raiseNode.raise(PythonErrorType.OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO_C_TYPE, 4); + throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO_C_TYPE, 4); } - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.INDEX_RETURNED_NON_INT, object); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.INDEX_RETURNED_NON_INT, object); } /** * Slow-path conversion of an object to a signed or unsigned 64-bit value. */ - private static Object toInt64(Object object, int signed, boolean exact, + private static Object toInt64(Node inliningTarget, Object object, int signed, boolean exact, PRaiseNode raiseNode) { if (object instanceof Integer) { Integer ival = (Integer) object; if (signed != 0) { return ival.longValue(); } - return doIntToUInt64(ival, signed, 8, exact, raiseNode); + return doIntToUInt64(ival, signed, 8, exact, inliningTarget, raiseNode); } else if (object instanceof Long) { long lval = (long) object; if (signed != 0) { return doLongToInt64(lval, 1, 8, exact); } - return doLongToUInt64(lval, signed, 8, exact, raiseNode); + return doLongToUInt64(lval, signed, 8, exact, inliningTarget, raiseNode); } else if (object instanceof PInt) { PInt pval = (PInt) object; if (exact) { - return doPIntTo64Bit(pval, signed, 8, true, raiseNode); + return doPIntTo64Bit(pval, signed, 8, true, inliningTarget, raiseNode); } return doPIntToInt64Lossy(pval, signed, 8, false); } else if (object instanceof PythonNativeVoidPtr) { return doVoidPtrToI64((PythonNativeVoidPtr) object, signed, 8, exact); } - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.INDEX_RETURNED_NON_INT, object); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.INDEX_RETURNED_NON_INT, object); } } @@ -945,7 +957,6 @@ private static Object toInt64(Object object, int signed, boolean exact, * This node converts a {@link String} object to a {@link TruffleString} or it converts a * {@code NULL} pointer to {@link PNone#NONE}. This is a very special use case and certainly * only good for reading a member of type - * {@link com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef#HPY_MEMBER_STRING} or * {@link com.oracle.graal.python.builtins.objects.cext.capi.CApiMemberAccessNodes#T_STRING}. */ @GenerateInline(false) // footprint reduction 32 -> 13, inherits non-inlineable execute() @@ -1122,29 +1133,8 @@ static long doUnsignedLongPositive(long n) { @Specialization(guards = "n < 0") static Object doUnsignedLongNegative(long n, - @Shared("factory") @Cached PythonObjectFactory factory) { - return factory.createInt(PInt.longToUnsignedBigInteger(n)); - } - - @Specialization(replaces = {"doUnsignedIntPositive", "doUnsignedInt", "doUnsignedLongPositive", "doUnsignedLongNegative"}) - static Object doGeneric(Object n, - @Shared("factory") @Cached PythonObjectFactory factory) { - if (n instanceof Integer) { - int i = (int) n; - if (i >= 0) { - return i; - } else { - return doUnsignedInt(i); - } - } else if (n instanceof Long) { - long l = (long) n; - if (l >= 0) { - return l; - } else { - return doUnsignedLongNegative(l, factory); - } - } - throw CompilerDirectives.shouldNotReachHere(); + @Bind PythonLanguage language) { + return PFactory.createInt(language, PInt.longToUnsignedBigInteger(n)); } } @@ -1163,10 +1153,10 @@ public abstract static class AsNativeCharNode extends CExtToNativeNode { static byte doGeneric(Object value, @Bind("this") Node inliningTarget, @Cached EncodeNativeStringNode encodeNativeStringNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { byte[] encoded = encodeNativeStringNode.execute(StandardCharsets.UTF_8, value, T_STRICT); if (encoded.length != 1) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP); } return encoded[0]; } @@ -1289,4 +1279,152 @@ static void doGeneric(PythonThreadState threadState, } } } + + /** + * This unwraps foreign pointer objects (e.g. LLVM pointers) if they respond to + * {@link InteropLibrary#isPointer(Object)} with {@code true} and creates a new + * {@link NativePointer} object with the long value. This is useful to avoid unnecessary + * indirections. + */ + @GenerateUncached + @GenerateInline + @GenerateCached(false) + public abstract static class UnwrapForeignPointerNode extends Node { + + public abstract Object execute(Node inliningTarget, Object pointerObject); + + @Specialization(limit = "3") + static Object doOther(Object pointerObject, + @CachedLibrary("pointerObject") InteropLibrary lib) { + if (lib.isPointer(pointerObject)) { + try { + return new NativePointer(lib.asPointer(pointerObject)); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } + // This is usually the path for managed mode. We expect a backend pointer object. + assert CApiTransitions.isBackendPointerObject(pointerObject); + return pointerObject; + } + } + + /** + * Ensures that the given pointer object is an executable interop value. + * + *

      + * NOTE: This method will fail if {@link PythonContext#isNativeAccessAllowed() native + * access} is not allowed and if {@code callable} is yet not + * {@link InteropLibrary#isExecutable(Object) executable}. + *

      + *

      + * If the {@code callable} is not {@link InteropLibrary#isExecutable(Object) executable}, the + * provided {@link NativeCExtSymbol signature} will be used to bind the object an executable + * {@code NFI} pointer. + *

      + */ + @GenerateInline + @GenerateCached(false) + @GenerateUncached + public abstract static class EnsureExecutableNode extends Node { + private static final TruffleLogger LOGGER = CApiContext.getLogger(CExtContext.class); + + public static Object executeUncached(Object callable, NativeCExtSymbol descriptor) { + return EnsureExecutableNodeGen.getUncached().execute(null, callable, descriptor); + } + + /** + * @param inliningTarget The inlining target. + * @param callable The callable to ensure that it is executable. + * @param descriptor The descriptor describing the signature to bind to if the object is not + * executable. + * @return An interop object that is {@link InteropLibrary#isExecutable(Object) executable}. + */ + public abstract Object execute(Node inliningTarget, Object callable, NativeCExtSymbol descriptor); + + @Specialization(guards = {"descriptor == cachedDescriptor", "withPanama(inliningTarget) == cachedWithPanama", "!isExecutable(lib, callable)"}, limit = "3") + static Object doBind(Node inliningTarget, Object callable, @SuppressWarnings("unused") NativeCExtSymbol descriptor, + @SuppressWarnings("unused") @Cached("descriptor") NativeCExtSymbol cachedDescriptor, + @SuppressWarnings("unused") @Cached("withPanama(inliningTarget)") boolean cachedWithPanama, + @SuppressWarnings("unused") @Shared @CachedLibrary(limit = "3") InteropLibrary lib, + @Shared @Cached UnwrapForeignPointerNode unwrapForeignPointerNode, + @Shared @CachedLibrary(limit = "1") SignatureLibrary signatureLib, + @Cached("createFactory(descriptor)") DirectCallNode nfiSignatureFactory) { + /* + * Since we mix native and LLVM execution, it happens that 'callable' is an LLVM pointer + * (that is still not executable). To avoid unnecessary indirections, we test + * 'isPointer(callable)' and if so, we retrieve the bare long value using + * 'asPointer(callable)' and wrap it in our own NativePointer. + */ + Object funPtr = unwrapForeignPointerNode.execute(inliningTarget, callable); + if (LOGGER.isLoggable(Level.FINER)) { + LOGGER.finer(PythonUtils.formatJString("Binding %s (signature: %s) to NFI signature %s", callable, descriptor.getName(), descriptor.getSignature())); + } + return signatureLib.bind(nfiSignatureFactory.call(), funPtr); + } + + @Specialization(guards = "lib.isExecutable(callable)") + @SuppressWarnings("unused") + static Object doNothing(Object callable, NativeCExtSymbol descriptor, + @Shared @CachedLibrary(limit = "3") InteropLibrary lib) { + return callable; + } + + @Specialization(replaces = {"doBind", "doNothing"}) + static Object doGeneric(Node inliningTarget, Object callable, NativeCExtSymbol descriptor, + @Shared @CachedLibrary(limit = "3") InteropLibrary lib, + @Shared @Cached UnwrapForeignPointerNode unwrapForeignPointerNode, + @Shared @CachedLibrary(limit = "1") SignatureLibrary signatureLib, + @Cached(inline = false) IndirectCallNode nfiSignatureFactory) { + PythonContext pythonContext = PythonContext.get(inliningTarget); + if (!lib.isExecutable(callable)) { + if (!pythonContext.isNativeAccessAllowed()) { + LOGGER.severe(PythonUtils.formatJString("Attempting to bind %s to an NFI signature but native access is not allowed", callable)); + } + // see 'doBind' for explanation + Object funPtr = unwrapForeignPointerNode.execute(inliningTarget, callable); + if (LOGGER.isLoggable(Level.FINER)) { + LOGGER.finer(PythonUtils.formatJString("Binding %s (signature: %s) to NFI signature %s", callable, descriptor.getName(), descriptor.getSignature())); + } + return signatureLib.bind(nfiSignatureFactory.call(getCallTarget(pythonContext, descriptor)), funPtr); + } + return callable; + } + + private static Source getSource(PythonLanguage language, boolean panama, NativeCExtSymbol descriptor) { + CompilerAsserts.neverPartOfCompilation(); + + assert descriptor.getSignature() != null && !descriptor.getSignature().isEmpty(); + String src = (panama ? "with panama " : "") + descriptor.getSignature(); + return language.getOrCreateSource(EnsureExecutableNode::buildNFISource, Pair.create(src, descriptor.getName())); + } + + // TODO(fa): we could avoid this boundary by storing the sources to the NativeCExtSymbol + @TruffleBoundary + private static CallTarget getCallTarget(PythonContext pythonContext, NativeCExtSymbol descriptor) { + Source source = getSource(pythonContext.getLanguage(), pythonContext.getOption(PythonOptions.UsePanama), descriptor); + return pythonContext.getEnv().parseInternal(source); + } + + @NeverDefault + static DirectCallNode createFactory(NativeCExtSymbol descriptor) { + CompilerAsserts.neverPartOfCompilation(); + return DirectCallNode.create(getCallTarget(PythonContext.get(null), descriptor)); + } + + @NonIdempotent + static boolean withPanama(Node inliningTarget) { + return PythonContext.get(inliningTarget).getOption(PythonOptions.UsePanama); + } + + @Idempotent + static boolean isExecutable(InteropLibrary lib, Object object) { + return lib.isExecutable(object); + } + + private static Source buildNFISource(Object key) { + Pair srcAndName = (Pair) key; + return Source.newBuilder(J_NFI_LANGUAGE, (String) srcAndName.getLeft(), (String) srcAndName.getRight()).internal(true).build(); + } + } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/common/CExtContext.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/common/CExtContext.java index d8a3b50004..89e9122fd8 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/common/CExtContext.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/common/CExtContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,77 +41,28 @@ package com.oracle.graal.python.builtins.objects.cext.common; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError; -import static com.oracle.graal.python.nodes.StringLiterals.J_LLVM_LANGUAGE; -import static com.oracle.graal.python.nodes.StringLiterals.J_NFI_LANGUAGE; -import static com.oracle.graal.python.nodes.StringLiterals.T_DASH; import static com.oracle.graal.python.nodes.StringLiterals.T_DOT; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; -import static com.oracle.graal.python.nodes.StringLiterals.T_UNDERSCORE; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; -import static com.oracle.graal.python.util.PythonUtils.tsLiteral; -import java.io.IOException; -import java.nio.file.LinkOption; -import java.util.Set; -import java.util.logging.Level; - -import org.graalvm.collections.Pair; -import org.graalvm.shadowed.com.ibm.icu.impl.Punycode; -import org.graalvm.shadowed.com.ibm.icu.text.StringPrepParseException; - -import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.CheckFunctionResultNode; -import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ApiInitException; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ImportException; import com.oracle.graal.python.builtins.objects.exception.ExceptionNodes; import com.oracle.graal.python.builtins.objects.exception.PBaseException; -import com.oracle.graal.python.builtins.objects.str.StringNodes; -import com.oracle.graal.python.builtins.objects.str.StringUtils; import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.SpecialMethodNames; import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode.LookupAndCallUnaryDynamicNode; -import com.oracle.graal.python.runtime.PosixConstants; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.ExceptionUtils; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CallTarget; -import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.CompilerDirectives.ValueType; -import com.oracle.truffle.api.TruffleFile; -import com.oracle.truffle.api.TruffleLanguage.Env; -import com.oracle.truffle.api.TruffleLogger; -import com.oracle.truffle.api.exception.AbstractTruffleException; -import com.oracle.truffle.api.interop.ArityException; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.interop.UnsupportedTypeException; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.source.Source; import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.api.strings.TruffleString.CodeRange; -import com.oracle.truffle.nfi.api.SignatureLibrary; public abstract class CExtContext { - - // Due to the cycle CExtContext -> CApiContext < CExtContext this needs to be done lazily - private static TruffleLogger LOGGER; - - private static TruffleLogger getLogger() { - if (LOGGER == null) { - LOGGER = CApiContext.getLogger(CExtContext.class); - } - return LOGGER; - } - - private static final TruffleString T_PY_INIT = tsLiteral("PyInit_"); - private static final TruffleString T_PY_INIT_U = tsLiteral("PyInitU_"); - public static final int METH_VARARGS = 0x0001; public static final int METH_KEYWORDS = 0x0002; public static final int METH_NOARGS = 0x0004; @@ -126,26 +77,20 @@ private static TruffleLogger getLogger() { private final PythonContext context; - /** The LLVM bitcode library object representing 'libpython.*.so' or similar. */ - private final Object llvmLibrary; - - /** - * The native API implementation was loaded as native code (as opposed to bitcode via Sulong). - */ - protected final boolean useNativeBackend; + /** The library object representing 'libpython.*.so' or similar. */ + private final Object library; - public CExtContext(PythonContext context, Object llvmLibrary, boolean useNativeBackend) { + public CExtContext(PythonContext context, Object library) { this.context = context; - this.llvmLibrary = llvmLibrary; - this.useNativeBackend = useNativeBackend; + this.library = library; } public final PythonContext getContext() { return context; } - public final Object getLLVMLibrary() { - return llvmLibrary; + public final Object getLibrary() { + return library; } public static boolean isMethVarargs(int flags) { @@ -184,71 +129,6 @@ public static boolean isClassOrStaticMethod(int flags) { return flags > 0 && (flags & (METH_CLASS | METH_STATIC)) != 0; } - /** - * A simple helper object that just remembers the name and the path of the original module spec - * object and also keeps a reference to it. This should avoid redundant attribute reads. - */ - @ValueType - public static final class ModuleSpec { - public final TruffleString name; - public final TruffleString path; - public final Object originalModuleSpec; - private TruffleString encodedName; - private boolean ascii; - - public ModuleSpec(TruffleString name, TruffleString path, Object originalModuleSpec) { - this.name = name; - this.path = path; - this.originalModuleSpec = originalModuleSpec; - } - - /** - * Get the variable part of a module's export symbol name. Returns a bytes instance. For - * non-ASCII-named modules, the name is encoded as per PEP 489. The hook_prefix pointer is - * set to either ascii_only_prefix or nonascii_prefix, as appropriate. - */ - @TruffleBoundary - TruffleString getEncodedName() { - if (encodedName != null) { - return encodedName; - } - - // Get the short name (substring after last dot) - TruffleString basename = getBaseName(name); - - boolean canEncode = canEncode(basename); - - if (canEncode) { - ascii = true; - } else { - ascii = false; - try { - basename = TruffleString.fromJavaStringUncached(Punycode.encode(basename.toJavaStringUncached(), null).toString(), TS_ENCODING); - } catch (StringPrepParseException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } - - // replace '-' by '_'; note: this is fast and does not use regex - return (encodedName = StringNodes.StringReplaceNode.getUncached().execute(basename, T_DASH, T_UNDERSCORE, -1)); - } - - @TruffleBoundary - private static boolean canEncode(TruffleString basename) { - return TruffleString.GetCodeRangeNode.getUncached().execute(basename, TS_ENCODING) == CodeRange.ASCII; - } - - @TruffleBoundary - public TruffleString getInitFunctionName() { - /* - * n.b.: 'getEncodedName' also sets 'ascii' and must therefore be called before 'ascii' - * is queried - */ - TruffleString s = getEncodedName(); - return StringUtils.cat((ascii ? T_PY_INIT : T_PY_INIT_U), s); - } - } - @TruffleBoundary protected static TruffleString getBaseName(TruffleString name) { int len = TruffleString.CodePointLengthNode.getUncached().execute(name, TS_ENCODING); @@ -265,120 +145,6 @@ protected static TruffleString getBaseName(TruffleString name) { return name.substringUncached(idx + 1, len - idx - 1, TS_ENCODING, true); } - private static String dlopenFlagsToString(int flags) { - String str = "RTLD_NOW"; - if ((flags & PosixConstants.RTLD_LAZY.value) != 0) { - str = "RTLD_LAZY"; - } - if ((flags & PosixConstants.RTLD_GLOBAL.value) != 0) { - str += "|RTLD_GLOBAL"; - } - return str; - } - - private static final Set C_EXT_SUPPORTED_LIST = Set.of( - // Stdlib modules are considered supported - "_cpython_sre", - "_cpython_unicodedata", - "_sha3", - "_sqlite3", - "termios", - "pyexpat"); - - /** - * This method loads a C extension module (C API) and will initialize the corresponding native - * contexts if necessary. - * - * @param location The node that's requesting this operation. This is required for reporting - * correct source code location in case exceptions occur. - * @param context The Python context object. - * @param spec The name and path of the module (also containing the original module spec - * object). - * @param checkFunctionResultNode An adopted node instance. This is necessary because the result - * check could raise an exception and only an adopted node will report useful source - * locations. - * @return A Python module. - * @throws IOException If the specified file cannot be loaded. - * @throws ApiInitException If the corresponding native context could not be initialized. - * @throws ImportException If an exception occurred during C extension initialization. - */ - @TruffleBoundary - public static Object loadCExtModule(Node location, PythonContext context, ModuleSpec spec, CheckFunctionResultNode checkFunctionResultNode) - throws IOException, ApiInitException, ImportException { - if (getLogger().isLoggable(Level.WARNING) && context.getOption(PythonOptions.WarnExperimentalFeatures)) { - boolean runViaLauncher = context.getOption(PythonOptions.RunViaLauncher); - if (!runViaLauncher || !C_EXT_SUPPORTED_LIST.contains(spec.name.toJavaStringUncached())) { - String message = "Loading C extension module %s from '%s'. Support for the Python C API is considered experimental."; - if (!runViaLauncher) { - message += " See https://www.graalvm.org/latest/reference-manual/python/Native-Extensions/#embedding-limitations for the limitations. " + - "You can suppress this warning by setting the context option 'python.WarnExperimentalFeatures' to 'false'"; - } - getLogger().warning(message.formatted(spec.name, spec.path)); - } - } - - // we always need to load the CPython C API - CApiContext cApiContext = CApiContext.ensureCapiWasLoaded(location, context, spec.name, spec.path); - Object library; - InteropLibrary interopLib; - - if (cApiContext.useNativeBackend) { - TruffleFile realPath = context.getPublicTruffleFileRelaxed(spec.path, context.getSoAbi()).getCanonicalFile(LinkOption.NOFOLLOW_LINKS); - getLogger().config(String.format("loading module %s (real path: %s) as native", spec.path, realPath)); - String loadExpr = String.format("load(%s) \"%s\"", dlopenFlagsToString(context.getDlopenFlags()), realPath); - if (PythonOptions.UsePanama.getValue(context.getEnv().getOptions())) { - loadExpr = "with panama " + loadExpr; - } - try { - Source librarySource = Source.newBuilder(J_NFI_LANGUAGE, loadExpr, "load " + spec.name).build(); - library = context.getEnv().parseInternal(librarySource).call(); - interopLib = InteropLibrary.getUncached(library); - } catch (PException e) { - throw e; - } catch (AbstractTruffleException e) { - if (!realPath.exists() && realPath.toString().contains("org.graalvm.python.vfsx")) { - // file does not exist and it is from VirtualFileSystem - // => we probably failed to extract it due to unconventional libs location - getLogger().severe(String.format("could not load module %s (real path: %s) from virtual file system.\n\n" + - "!!! Please try to run with java system property graalpy.vfs.extractOnStartup=true !!!\n", spec.path, realPath)); - - } - - throw new ImportException(CExtContext.wrapJavaException(e, location), spec.name, spec.path, ErrorMessages.CANNOT_LOAD_M, spec.path, e); - } - } else { - library = loadLLVMLibrary(location, context, spec.name, spec.path); - interopLib = InteropLibrary.getUncached(library); - try { - if (interopLib.getLanguage(library).toString().startsWith("class com.oracle.truffle.nfi")) { - throw PRaiseNode.raiseUncached(null, SystemError, ErrorMessages.NO_BITCODE_FOUND, spec.path); - } - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - } - - try { - return cApiContext.initCApiModule(location, library, spec.getInitFunctionName(), spec, interopLib, checkFunctionResultNode); - } catch (UnsupportedTypeException | ArityException | UnsupportedMessageException e) { - throw new ImportException(CExtContext.wrapJavaException(e, location), spec.name, spec.path, ErrorMessages.CANNOT_INITIALIZE_WITH, spec.path, spec.getEncodedName(), ""); - } - } - - public static Object loadLLVMLibrary(Node location, PythonContext context, TruffleString name, TruffleString path) throws ImportException, IOException { - Env env = context.getEnv(); - try { - TruffleString extSuffix = context.getSoAbi(); - TruffleFile realPath = context.getPublicTruffleFileRelaxed(path, extSuffix).getCanonicalFile(LinkOption.NOFOLLOW_LINKS); - CallTarget callTarget = env.parseInternal(Source.newBuilder(J_LLVM_LANGUAGE, realPath).build()); - return callTarget.call(); - } catch (SecurityException e) { - throw new ImportException(CExtContext.wrapJavaException(e, location), name, path, ErrorMessages.CANNOT_LOAD_M, path, e); - } catch (RuntimeException e) { - throw reportImportError(e, name, path); - } - } - @TruffleBoundary protected static PException reportImportError(RuntimeException e, TruffleString name, TruffleString path) throws ImportException { StringBuilder sb = new StringBuilder(); @@ -419,71 +185,8 @@ protected static PException reportImportError(RuntimeException e, TruffleString @TruffleBoundary public static PException wrapJavaException(Throwable e, Node raisingNode) { TruffleString message = toTruffleStringUncached(e.getMessage()); - PBaseException excObject = PythonObjectFactory.getUncached().createBaseException(SystemError, message != null ? message : toTruffleStringUncached(e.toString()), + PBaseException excObject = PFactory.createBaseException(PythonLanguage.get(null), SystemError, message != null ? message : toTruffleStringUncached(e.toString()), PythonUtils.EMPTY_OBJECT_ARRAY); return ExceptionUtils.wrapJavaException(e, raisingNode, excObject); } - - /** - * Ensures that the given {@code callable} is an executable interop value. - * - *

      - * NOTE: This method will fail if {@link PythonContext#isNativeAccessAllowed() native - * access} is not allowed and if {@code callable} is yet not - * {@link InteropLibrary#isExecutable(Object) executable}. - *

      - *

      - * If the {@code callable} is not {@link InteropLibrary#isExecutable(Object) executable}, the - * provided {@link NativeCExtSymbol signature} will be used to bind the object an executable - * {@code NFI} pointer. - *

      - * - * @param callable The callable to ensure that it is executable ( - * @param sig The signature to bind to if the object is not executable. - * @return An interop object that is {@link InteropLibrary#isExecutable(Object) executable}. - */ - @TruffleBoundary - public static Object ensureExecutable(final Object callable, NativeCExtSymbol sig) { - InteropLibrary lib = InteropLibrary.getUncached(callable); - if (!lib.isExecutable(callable)) { - PythonContext pythonContext = PythonContext.get(null); - if (!pythonContext.isNativeAccessAllowed()) { - getLogger().severe(String.format("Attempting to bind %s to an NFI signature but native access is not allowed", callable)); - } - Env env = pythonContext.getEnv(); - - boolean panama = PythonOptions.UsePanama.getValue(env.getOptions()); - - assert sig.getSignature() != null && !sig.getSignature().isEmpty(); - String src = (panama ? "with panama " : "") + sig.getSignature(); - Source nfiSource = pythonContext.getLanguage().getOrCreateSource(CExtContext::buildNFISource, Pair.create(src, sig.getName())); - Object nfiSignature = env.parseInternal(nfiSource).call(); - - /* - * Since we mix native and LLVM execution, it happens that 'callable' is an LLVM pointer - * (that is still not executable). To avoid unnecessary indirections, we test - * 'isPointer(callable)' and if so, we retrieve the bare long value using - * 'asPointer(callable)' and wrap it in our own NativePointer. - */ - Object funPtr; - if (lib.isPointer(callable)) { - try { - funPtr = new NativePointer(lib.asPointer(callable)); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - } else { - funPtr = callable; - } - getLogger().finer(() -> String.format("Binding %s (signature: %s) to NFI signature %s", callable, sig.getName(), sig.getSignature())); - return SignatureLibrary.getUncached().bind(nfiSignature, funPtr); - } - // nothing to do - return callable; - } - - private static Source buildNFISource(Object key) { - Pair srcAndName = (Pair) key; - return Source.newBuilder(J_NFI_LANGUAGE, (String) srcAndName.getLeft(), (String) srcAndName.getRight()).build(); - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/copying/ElfFile.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/copying/ElfFile.java new file mode 100644 index 0000000000..ee6c5c0e65 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/copying/ElfFile.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.oracle.graal.python.builtins.objects.cext.copying; + +import java.io.IOException; +import java.nio.file.StandardCopyOption; +import java.nio.file.StandardOpenOption; + +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.truffle.api.TruffleFile; + +final class ElfFile extends SharedObject { + private final PythonContext context; + private final TruffleFile tempfile; + + private String getPatchelf() { + return which(context, "patchelf").toString(); + } + + ElfFile(byte[] b, PythonContext context) throws IOException { + this.context = context; + this.tempfile = context.getEnv().createTempFile(null, null, ".so"); + try (var os = this.tempfile.newOutputStream(StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE)) { + os.write(b); + } + } + + @Override + public void setId(String newId) throws IOException, InterruptedException { + var pb = newProcessBuilder(context); + pb.command(getPatchelf(), "--debug", "--set-soname", newId, tempfile.toString()); + var proc = pb.start(); + if (proc.waitFor() != 0) { + throw new IOException("Failed to run `patchelf` command. Make sure you have it on your PATH or installed in your venv."); + } + } + + @Override + public void changeOrAddDependency(String oldName, String newName) throws IOException, InterruptedException { + var pb = newProcessBuilder(context); + pb.command(getPatchelf(), "--debug", "--remove-needed", oldName, tempfile.toString()); + var proc = pb.start(); + if (proc.waitFor() != 0) { + throw new IOException("Failed to run `patchelf` command. Make sure you have it on your PATH or installed in your venv."); + } + pb.command(getPatchelf(), "--debug", "--add-needed", newName, tempfile.toString()); + proc = pb.start(); + if (proc.waitFor() != 0) { + throw new IOException("Failed to run `patchelf` command. Make sure you have it on your PATH or installed in your venv."); + } + } + + @Override + public void write(TruffleFile copy) throws IOException { + tempfile.copy(copy, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES); + } + + @Override + public void close() throws IOException { + tempfile.delete(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/copying/NativeLibraryLocator.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/copying/NativeLibraryLocator.java new file mode 100644 index 0000000000..4366027daf --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/copying/NativeLibraryLocator.java @@ -0,0 +1,264 @@ +/* + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.builtins.objects.cext.copying; + +import static com.oracle.graal.python.nodes.StringLiterals.J_NATIVE; +import static com.oracle.graal.python.nodes.StringLiterals.T_BASE_PREFIX; +import static com.oracle.graal.python.nodes.StringLiterals.J_MAX_CAPI_COPIES; +import static com.oracle.graal.python.nodes.StringLiterals.T_PREFIX; +import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; + +import java.io.IOException; +import java.util.concurrent.atomic.AtomicInteger; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ApiInitException; +import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ImportException; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.util.CannotCastException; +import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.PythonOptions; +import com.oracle.graal.python.util.BiFunction; +import com.oracle.truffle.api.TruffleFile; +import com.oracle.truffle.api.TruffleLanguage.Env; +import com.oracle.truffle.api.TruffleLogger; + +/** + * Given a GraalPy virtual environment, this class helps prepare that environment so that multiple + * GraalPy contexts in the same process can use its native extensions at the same time. + * + * The mechanism for this is tied to the implementation of GraalPy and the resulting venv is only + * guaranteed to work with the matching GraalPy version. + */ +public final class NativeLibraryLocator { + static final TruffleLogger LOGGER = PythonLanguage.getLogger("NativeLibraryLocator"); + + private static final int MAX_CEXT_COPIES = Integer.getInteger(J_MAX_CAPI_COPIES, 64); + + /** + * Bitset for which copied C extension to use when {@link PythonOptions#IsolateNativeModules} is + * enabled. + */ + private static final AtomicInteger CEXT_COPY_INDICES = new AtomicInteger(MAX_CEXT_COPIES); + + /** + * The suffix to add to C extensions when loading. This allows us to support native module + * isolation with {@link PythonOptions#IsolateNativeModules}. If the value is {@code -1}, it + * means we are not using isolation. + */ + private final int capiSlot; + + /** + * The original C API library filename. + */ + private final String capiOriginal; + + /** + * The original C API library path. + */ + private final String capiCopy; + + /** + * Create a locator for native extension libraries. + * + * @param capiLibrary - the library file that implements the C API symbols for all extensions to + * bind to + * @param isolateNative - if {@code true}, look for or create relocated copies of native + * libraries to load, else just load the originals + */ + public NativeLibraryLocator(PythonContext context, TruffleFile capiLibrary, boolean isolateNative) throws ApiInitException { + this.capiOriginal = capiLibrary.getName(); + if (isolateNative) { + this.capiSlot = MAX_CEXT_COPIES - CEXT_COPY_INDICES.getAndDecrement(); + if (this.capiSlot < 0) { + CEXT_COPY_INDICES.set(0); + throw new ApiInitException(ErrorMessages.CAPI_ISOLATION_CAPPED_AT_D, MAX_CEXT_COPIES); + } + this.capiCopy = resolve(context, capiLibrary, capiSlot, null); + } else { + this.capiSlot = -1; + this.capiCopy = capiLibrary.getPath(); + } + } + + /** + * Determine path of actual shared object to load for the given capi slot. If the capi slot is + * {@code -1}, return the {@code original} argument's path. Otherwise, look for a relocated copy + * corresponding to the desired slot. + * + * @see PythonOptions#IsolateNativeModules + */ + public String resolve(PythonContext context, TruffleFile original) throws ImportException { + try { + return resolve(context, original, capiSlot, capiOriginal); + } catch (ApiInitException e) { + throw new ImportException(null, toTruffleStringUncached(original.getName()), toTruffleStringUncached(original.getPath()), + toTruffleStringUncached(e.getMessage() == null ? "" : e.getMessage())); + } + } + + public String getCapiLibrary() { + return capiCopy; + } + + public void close() { + } + + /** + * Prepare the {@code venvDirectory} for execution with multiple contexts using C extensions at + * the same time. The minimum number of concurrent contexts to prepare for is given with {@code + * count}. + */ + public static void replicate(TruffleFile venvDirectory, PythonContext context, int count) throws IOException, InterruptedException { + if (count > MAX_CEXT_COPIES) { + LOGGER.warning(() -> String.format("The current limit for concurrent Python contexts accessing the Python C API is %d, " + + "but we are preparing %d copies. The extra copies will only be used if a different value " + + "of the system property %s is set.", MAX_CEXT_COPIES, count, J_MAX_CAPI_COPIES)); + } + String suffix = context.getSoAbi().toJavaStringUncached(); + TruffleFile capiLibrary = context.getPublicTruffleFileRelaxed(context.getCAPIHome()).resolve(PythonContext.getSupportLibName("python-" + J_NATIVE)); + try { + for (int i = 0; i < count; i++) { + // Relocate the C API library + replicate(capiLibrary, venvDirectory.resolve(copyNameOf(capiLibrary.getName(), i)), context, i); + // Relocate the core C extensions + walk(context.getPublicTruffleFileRelaxed(context.getCoreHome()), suffix, capiLibrary.getName(), context, i, (o, n) -> venvDirectory.resolve(n)); + // Relocate C extensions in the venv + walk(venvDirectory, suffix, capiLibrary.getName(), context, i, (o, n) -> o.resolveSibling(n)); + } + } catch (RuntimeException e) { + var cause = e.getCause(); + if (cause instanceof IOException ioCause) { + throw ioCause; + } else if (cause instanceof InterruptedException intCause) { + throw intCause; + } else { + throw e; + } + } + } + + private static String copyNameOf(String original, int capiSlot) { + return original + ".dup" + Integer.toHexString(capiSlot); + } + + private static String resolve(PythonContext context, TruffleFile original, int capiSlot, String capiOrignalName) throws ApiInitException { + if (capiSlot < 0) { + return original.getPath(); + } + Env env = context.getEnv(); + TruffleFile copy; + String newName = copyNameOf(original.getName(), capiSlot); + + if (original.getAbsoluteFile().startsWith(context.getCoreHome().toJavaStringUncached())) { + // must be relocated to venv or tmpdir + Object sysPrefix = context.getSysModule().getAttribute(T_PREFIX); + Object sysBasePrefix = context.getSysModule().getAttribute(T_BASE_PREFIX); + if (sysPrefix.equals(sysBasePrefix)) { + TruffleFile tempDir; + try { + tempDir = context.getEnv().createTempDirectory(null, null); + } catch (IOException e) { + throw new ApiInitException(ErrorMessages.SYS_PREFIX_MUST_POINT_TO_A_VENV_FOR_CAPI_ISOLATION); + } + context.registerAtexitHook((ctx) -> { + try { + tempDir.delete(); + } catch (IOException e) { + // Nothing we can do at this point + } + }); + copy = tempDir.resolve(newName); + context.registerAtexitHook((ctx) -> { + try { + copy.delete(); + } catch (IOException e) { + // Nothing we can do at this point + } + }); + } else { + try { + var tsSysPrefix = CastToTruffleStringNode.executeUncached(sysPrefix); + copy = env.getPublicTruffleFile(tsSysPrefix.toJavaStringUncached()).resolve(newName); + } catch (CannotCastException e) { + throw new ApiInitException(ErrorMessages.SYS_PREFIX_MUST_BE_STRING_NOT_P_FOR_CAPI_ISOLATION, sysPrefix); + } + } + } else { + copy = original.resolveSibling(newName); + } + if (!copy.isReadable()) { + try { + replicate(original, copy, context, capiSlot, capiOrignalName); + } catch (IOException | InterruptedException e) { + throw new ApiInitException(e); + } + } + return copy.getPath(); + } + + private static void replicate(TruffleFile original, TruffleFile copy, PythonContext context, int slot, String... dependenciesToUpdate) throws IOException, InterruptedException { + try (var o = SharedObject.open(original, context)) { + for (var depToUpdate : dependenciesToUpdate) { + if (depToUpdate != null) { + var newDepName = copyNameOf(depToUpdate, slot); + o.changeOrAddDependency(depToUpdate, newDepName); + } + } + o.setId(copy.getName()); + o.write(copy); + } + } + + private static void walk(TruffleFile dir, String suffix, String capiOriginalName, PythonContext context, int capiSlot, BiFunction f) + throws IOException, InterruptedException { + try (var ds = dir.newDirectoryStream()) { + for (var e : ds) { + if (e.isDirectory()) { + walk(e, suffix, capiOriginalName, context, capiSlot, f); + } else if (e.getName().endsWith(suffix) && e.isRegularFile()) { + replicate(e, f.apply(e, copyNameOf(e.getName(), capiSlot)), context, capiSlot, capiOriginalName); + } + } + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/copying/PEFile.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/copying/PEFile.java new file mode 100644 index 0000000000..63cbd39ea3 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/copying/PEFile.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.oracle.graal.python.builtins.objects.cext.copying; + +import java.io.IOException; +import java.nio.file.StandardCopyOption; +import java.nio.file.StandardOpenOption; + +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.truffle.api.TruffleFile; + +final class PEFile extends SharedObject { + private final PythonContext context; + private final TruffleFile tempfile; + + PEFile(byte[] b, PythonContext context) throws IOException { + this.context = context; + this.tempfile = context.getEnv().createTempFile(null, null, ".dll"); + try (var os = this.tempfile.newOutputStream(StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE)) { + os.write(b); + } + } + + @Override + public void setId(String newId) throws IOException { + // TODO + } + + private String getDelvewheelPython() { + TruffleFile delvewheel = which(context, "delvewheel.exe"); + if (!delvewheel.exists()) { + delvewheel = which(context, "delvewheel.bat"); + } + if (!delvewheel.exists()) { + delvewheel = which(context, "delvewheel.cmd"); + } + TruffleFile python = delvewheel.resolveSibling("python.exe"); + if (!python.exists()) { + python = delvewheel.resolveSibling("python.bat"); + } + if (!python.exists()) { + python = delvewheel.resolveSibling("python.cmd"); + } + if (!python.exists()) { + python = delvewheel.getParent().resolveSibling("python.exe"); + } + if (!python.exists()) { + python = delvewheel.getParent().resolveSibling("python.bat"); + } + if (!python.exists()) { + python = delvewheel.getParent().resolveSibling("python.cmd"); + } + return python.toString(); + } + + @Override + public void changeOrAddDependency(String oldName, String newName) throws IOException, InterruptedException { + var pb = newProcessBuilder(context); + var tempfileWithForwardSlashes = tempfile.toString().replace('\\', '/'); + String pythonExe = getDelvewheelPython(); + pb.command(pythonExe, "-c", + String.format("from delvewheel import _dll_utils; _dll_utils.replace_needed('%s', ['%s'], {'%s': '%s'}, strip=True, verbose=2, test=[])", + tempfileWithForwardSlashes, oldName, oldName, newName)); + var proc = pb.start(); + if (proc.waitFor() != 0) { + throw new IOException("Failed to run `delvewheel` 1.9.0 to copy required DLL. Make sure you have it installed in your venv."); + } + } + + @Override + public void write(TruffleFile copy) throws IOException { + tempfile.copy(copy, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES); + } + + @Override + public void close() throws IOException { + tempfile.delete(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/copying/SharedObject.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/copying/SharedObject.java new file mode 100644 index 0000000000..4b6843adb9 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/copying/SharedObject.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.builtins.objects.cext.copying; + +import java.io.IOException; +import java.io.OutputStream; + +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.PythonOptions; +import com.oracle.truffle.api.TruffleFile; +import com.oracle.truffle.api.TruffleLanguage.Env; +import com.oracle.truffle.api.TruffleLogger; +import com.oracle.truffle.api.io.TruffleProcessBuilder; + +abstract class SharedObject implements AutoCloseable { + abstract void setId(String newId) throws IOException, InterruptedException; + + abstract void changeOrAddDependency(String oldName, String newName) throws IOException, InterruptedException; + + abstract void write(TruffleFile copy) throws IOException, InterruptedException; + + public abstract void close() throws IOException, InterruptedException; + + static SharedObject open(TruffleFile file, PythonContext context) throws IOException { + var f = file.readAllBytes(); + switch (f[0]) { + case 0x7f: + return new ElfFile(f, context); + case 0x4d, 0x5a: + return new PEFile(f, context); + case (byte) 0xca, (byte) 0xfe, (byte) 0xce, (byte) 0xcf: + throw new IOException("Modifying Mach-O files is not yet supported"); + default: + throw new IOException("Unknown shared object format"); + } + } + + protected static final TruffleLogger LOGGER = NativeLibraryLocator.LOGGER; + + protected static final class LoggingOutputStream extends OutputStream { + private final StringBuilder sb = new StringBuilder(); + + @Override + public void write(int b) throws IOException { + sb.append((char) b); + } + + @Override + public void write(byte[] b, int off, int len) throws IOException { + sb.append(new String(b, off, len)); + } + + @Override + public void flush() { + LOGGER.fine(sb::toString); + sb.setLength(0); + } + } + + protected static TruffleProcessBuilder newProcessBuilder(PythonContext context) { + var pb = context.getEnv().newProcessBuilder(); + pb.redirectOutput(pb.createRedirectToStream(new LoggingOutputStream())); + pb.redirectError(pb.createRedirectToStream(new LoggingOutputStream())); + return pb; + } + + private static boolean isExecutable(TruffleFile executable) { + try { + return executable.isExecutable(); + } catch (SecurityException e) { + return false; + } + } + + protected static TruffleFile which(PythonContext context, String command) { + Env env = context.getEnv(); + var path = env.getEnvironment().getOrDefault("PATH", "").split(env.getPathSeparator()); + var executable = env.getPublicTruffleFile(context.getOption(PythonOptions.Executable).toJavaStringUncached()); + var candidate = executable.resolveSibling(command); + var i = 0; + while (!isExecutable(candidate) && i < path.length) { + candidate = env.getPublicTruffleFile(path[i++]).resolve(command); + } + return candidate; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyArithmeticNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyArithmeticNode.java deleted file mode 100644 index b8ee9ed5cf..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyArithmeticNode.java +++ /dev/null @@ -1,503 +0,0 @@ -/* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.function.PArguments; -import com.oracle.graal.python.nodes.call.GenericInvokeNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallTernaryNode; -import com.oracle.graal.python.nodes.expression.BinaryArithmetic; -import com.oracle.graal.python.nodes.expression.BinaryOpNode; -import com.oracle.graal.python.nodes.expression.InplaceArithmetic; -import com.oracle.graal.python.nodes.expression.LookupAndCallInplaceNode; -import com.oracle.graal.python.nodes.expression.TernaryArithmetic; -import com.oracle.graal.python.nodes.expression.UnaryArithmetic; -import com.oracle.graal.python.nodes.expression.UnaryOpNode; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.RootCallTarget; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.nodes.Node; - -public abstract class GraalHPyArithmeticNode { - - private GraalHPyArithmeticNode() { - } - - public abstract static class HPyUnaryArithmeticNode extends Node { - - public abstract Object execute(Object object); - - @NeverDefault - public static HPyUnaryArithmeticNode create(UnaryArithmetic operator) { - return new HPyUnaryArithmeticCached(operator); - } - - public static HPyUnaryArithmeticNode getUncached(UnaryArithmetic operator) { - return HPyUnaryArithmeticUncached.UNCACHEDS[operator.ordinal()]; - } - } - - static final class HPyUnaryArithmeticCached extends HPyUnaryArithmeticNode { - @Child private UnaryOpNode opNode; - - private HPyUnaryArithmeticCached(UnaryArithmetic operator) { - opNode = operator.create(); - } - - @Override - public Object execute(Object object) { - return opNode.executeCached(null, object); - } - } - - private static final class HPyUnaryArithmeticUncached extends HPyUnaryArithmeticNode { - final UnaryArithmetic operator; - - public HPyUnaryArithmeticUncached(UnaryArithmetic operator) { - this.operator = operator; - } - - @TruffleBoundary - @Override - public Object execute(Object object) { - Object[] pythonArguments = PArguments.create(1); - PArguments.setArgument(pythonArguments, 0, object); - RootCallTarget callTarget = PythonLanguage.get(null).createCachedCallTarget(operator::createRootNode, operator); - return GenericInvokeNode.invokeUncached(callTarget, pythonArguments); - } - - @Override - public boolean isAdoptable() { - return false; - } - - private static final HPyUnaryArithmeticUncached[] UNCACHEDS; - static { - UnaryArithmetic[] values = UnaryArithmetic.values(); - UNCACHEDS = new HPyUnaryArithmeticUncached[values.length]; - for (int i = 0; i < values.length; i++) { - UNCACHEDS[i] = new HPyUnaryArithmeticUncached(values[i]); - } - } - } - - public abstract static class HPyBinaryArithmeticNode extends Node { - - public abstract Object execute(Object arg0, Object arg1); - - @NeverDefault - public static HPyBinaryArithmeticNode create(BinaryArithmetic operator) { - return new HPyBinaryArithmeticCached(operator); - } - - public static HPyBinaryArithmeticNode getUncached(BinaryArithmetic operator) { - return HPyBinaryArithmeticUncached.UNCACHEDS[operator.ordinal()]; - } - } - - private static final class HPyBinaryArithmeticCached extends HPyBinaryArithmeticNode { - @Child private BinaryOpNode opNode; - - private HPyBinaryArithmeticCached(BinaryArithmetic operator) { - opNode = operator.create(); - } - - @Override - public Object execute(Object arg0, Object arg1) { - return opNode.executeObject(null, arg0, arg1); - } - } - - private static final class HPyBinaryArithmeticUncached extends HPyBinaryArithmeticNode { - final BinaryArithmetic operator; - - public HPyBinaryArithmeticUncached(BinaryArithmetic operator) { - this.operator = operator; - } - - @TruffleBoundary - @Override - public Object execute(Object arg0, Object arg1) { - Object[] pythonArguments = PArguments.create(2); - PArguments.setArgument(pythonArguments, 0, arg0); - PArguments.setArgument(pythonArguments, 1, arg1); - RootCallTarget callTarget = PythonLanguage.get(null).createCachedCallTarget(operator::createRootNode, operator); - return GenericInvokeNode.invokeUncached(callTarget, pythonArguments); - } - - @Override - public boolean isAdoptable() { - return false; - } - - private static final HPyBinaryArithmeticUncached[] UNCACHEDS; - static { - BinaryArithmetic[] values = BinaryArithmetic.values(); - UNCACHEDS = new HPyBinaryArithmeticUncached[values.length]; - for (int i = 0; i < values.length; i++) { - UNCACHEDS[i] = new HPyBinaryArithmeticUncached(values[i]); - } - } - } - - public abstract static class HPyTernaryArithmeticNode extends Node { - - public abstract Object execute(Object arg0, Object arg1, Object arg2); - - @NeverDefault - public static HPyTernaryArithmeticNode create(TernaryArithmetic operator) { - return new HPyTernaryArithmeticCached(operator); - } - - public static HPyTernaryArithmeticNode getUncached(TernaryArithmetic operator) { - return HPyTernaryArithmeticUncached.UNCACHEDS[operator.ordinal()]; - } - } - - private static final class HPyTernaryArithmeticCached extends HPyTernaryArithmeticNode { - @Child private LookupAndCallTernaryNode opNode; - - private HPyTernaryArithmeticCached(TernaryArithmetic operator) { - opNode = operator.create(); - } - - @Override - public Object execute(Object arg0, Object arg1, Object arg2) { - return opNode.execute(null, arg0, arg1, arg2); - } - } - - private static final class HPyTernaryArithmeticUncached extends HPyTernaryArithmeticNode { - final TernaryArithmetic operator; - - public HPyTernaryArithmeticUncached(TernaryArithmetic operator) { - this.operator = operator; - } - - @TruffleBoundary - @Override - public Object execute(Object arg0, Object arg1, Object arg2) { - Object[] pythonArguments = PArguments.create(3); - PArguments.setArgument(pythonArguments, 0, arg0); - PArguments.setArgument(pythonArguments, 1, arg1); - PArguments.setArgument(pythonArguments, 2, arg2); - RootCallTarget callTarget = PythonLanguage.get(null).createCachedCallTarget(operator::createRootNode, operator); - return GenericInvokeNode.invokeUncached(callTarget, pythonArguments); - } - - @Override - public boolean isAdoptable() { - return false; - } - - private static final HPyTernaryArithmeticUncached[] UNCACHEDS; - static { - TernaryArithmetic[] values = TernaryArithmetic.values(); - UNCACHEDS = new HPyTernaryArithmeticUncached[values.length]; - for (int i = 0; i < values.length; i++) { - UNCACHEDS[i] = new HPyTernaryArithmeticUncached(values[i]); - } - } - } - - public abstract static class HPyInplaceArithmeticNode extends Node { - - public abstract Object execute(Object arg0, Object arg1, Object arg2); - - public final Object execute(Object arg0, Object arg1) { - return execute(arg0, arg1, PNone.NO_VALUE); - } - - @NeverDefault - public static HPyInplaceArithmeticNode create(InplaceArithmetic operator) { - return new HPyInplaceArithmeticCached(operator); - } - - public static HPyInplaceArithmeticNode getUncached(InplaceArithmetic operator) { - return HPyInplaceArithmeticUncached.UNCACHEDS[operator.ordinal()]; - } - } - - private static final class HPyInplaceArithmeticCached extends HPyInplaceArithmeticNode { - @Child private LookupAndCallInplaceNode opNode; - - private final boolean isTernary; - - private HPyInplaceArithmeticCached(InplaceArithmetic operator) { - opNode = operator.create(); - this.isTernary = operator.isTernary(); - } - - @Override - public Object execute(Object arg0, Object arg1, Object arg2) { - if (isTernary) { - return opNode.executeTernary(null, arg0, arg1, arg2); - } else { - return opNode.execute(null, arg0, arg1); - } - } - } - - private static final class HPyInplaceArithmeticUncached extends HPyInplaceArithmeticNode { - final InplaceArithmetic operator; - - public HPyInplaceArithmeticUncached(InplaceArithmetic operator) { - this.operator = operator; - } - - @TruffleBoundary - @Override - public Object execute(Object arg0, Object arg1, Object arg2) { - Object[] pythonArguments = PArguments.create(3); - PArguments.setArgument(pythonArguments, 0, arg0); - PArguments.setArgument(pythonArguments, 1, arg1); - PArguments.setArgument(pythonArguments, 2, arg2); - RootCallTarget callTarget = PythonLanguage.get(null).createCachedCallTarget(operator::createRootNode, operator); - return GenericInvokeNode.invokeUncached(callTarget, pythonArguments); - } - - @Override - public boolean isAdoptable() { - return false; - } - - private static final HPyInplaceArithmeticUncached[] UNCACHEDS; - static { - InplaceArithmetic[] values = InplaceArithmetic.values(); - UNCACHEDS = new HPyInplaceArithmeticUncached[values.length]; - for (int i = 0; i < values.length; i++) { - UNCACHEDS[i] = new HPyInplaceArithmeticUncached(values[i]); - } - } - } - -// @NeverDefault -// public static GraalHPyBinaryArithmeticCached create(BinaryArithmetic operator) { -// return new GraalHPyBinaryArithmeticCached(operator); -// } -// -// public static GraalHPyBinaryArithmeticUncached getUncached(BinaryArithmetic operator) { -// return GraalHPyBinaryArithmeticUncached.UNCACHEDS[operator.ordinal()]; -// } -// -// static final class GraalHPyBinaryArithmeticCached extends GraalHPyArithmeticCachedNode { -// @Child private BinaryOpNode opNode; -// -// GraalHPyBinaryArithmeticCached(BinaryArithmetic operator) { -// opNode = operator.create(); -// } -// -// @Override -// void checkArity(Object[] arguments) throws ArityException { -// checkArity(arguments, EXPECTED_ARITY_BINARY); -// } -// -// @Override -// Object doOperator(Object[] arguments) { -// return opNode.executeObject(null, asPythonObjectNode.execute(arguments[1]), -// asPythonObjectNode.execute(arguments[2])); -// } -// } -// -// private static final class GraalHPyBinaryArithmeticUncached extends -// GraalHPyArithmeticUncachedNode { -// final BinaryArithmetic operator; -// -// public GraalHPyBinaryArithmeticUncached(BinaryArithmetic operator) { -// this.operator = operator; -// } -// -// @Override -// void checkArity(Object[] arguments) throws ArityException { -// checkArity(arguments, EXPECTED_ARITY_BINARY); -// } -// -// @Override -// RootCallTarget ensureCallTarget() { -// return PythonLanguage.get(null).createCachedCallTarget(operator::createRootNode, operator); -// } -// -// private static final GraalHPyBinaryArithmeticUncached[] UNCACHEDS; -// static { -// BinaryArithmetic[] values = BinaryArithmetic.values(); -// UNCACHEDS = new GraalHPyBinaryArithmeticUncached[values.length]; -// for (int i = 0; i < values.length; i++) { -// UNCACHEDS[i] = new GraalHPyBinaryArithmeticUncached(values[i]); -// } -// } -// } -// -// @NeverDefault -// public static GraalHPyTernaryArithmeticCached create(TernaryArithmetic operator) { -// return new GraalHPyTernaryArithmeticCached(operator); -// } -// -// public static GraalHPyTernaryArithmeticUncached getUncached(TernaryArithmetic operator) { -// return GraalHPyTernaryArithmeticUncached.UNCACHEDS[operator.ordinal()]; -// } -// -// static final class GraalHPyTernaryArithmeticCached extends GraalHPyArithmeticCachedNode { -// @Child private LookupAndCallTernaryNode opNode; -// -// GraalHPyTernaryArithmeticCached(TernaryArithmetic operator) { -// opNode = operator.create(); -// } -// -// @Override -// void checkArity(Object[] arguments) throws ArityException { -// checkArity(arguments, EXPECTED_ARITY_TERNARY); -// } -// -// @Override -// Object doOperator(Object[] arguments) { -// return opNode.execute(null, asPythonObjectNode.execute(arguments[1]), -// asPythonObjectNode.execute(arguments[2]), asPythonObjectNode.execute(arguments[3])); -// } -// } -// -// private static final class GraalHPyTernaryArithmeticUncached extends -// GraalHPyArithmeticUncachedNode { -// final TernaryArithmetic operator; -// -// public GraalHPyTernaryArithmeticUncached(TernaryArithmetic operator) { -// this.operator = operator; -// } -// -// @Override -// void checkArity(Object[] arguments) throws ArityException { -// checkArity(arguments, EXPECTED_ARITY_TERNARY); -// } -// -// @Override -// RootCallTarget ensureCallTarget() { -// return PythonLanguage.get(null).createCachedCallTarget(operator::createRootNode, operator); -// } -// -// private static final GraalHPyTernaryArithmeticUncached[] UNCACHEDS; -// static { -// TernaryArithmetic[] values = TernaryArithmetic.values(); -// UNCACHEDS = new GraalHPyTernaryArithmeticUncached[values.length]; -// for (int i = 0; i < values.length; i++) { -// UNCACHEDS[i] = new GraalHPyTernaryArithmeticUncached(values[i]); -// } -// } -// } -// -// @NeverDefault -// public static GraalHPyInplaceArithmeticCached create(InplaceArithmetic operator) { -// return new GraalHPyInplaceArithmeticCached(operator); -// } -// -// public static GraalHPyInplaceArithmeticUncached getUncached(InplaceArithmetic operator) { -// return GraalHPyInplaceArithmeticUncached.UNCACHEDS[operator.ordinal()]; -// } -// -// static final class GraalHPyInplaceArithmeticCached extends GraalHPyArithmeticCachedNode { -// @Child private LookupAndCallInplaceNode opNode; -// private final boolean ternary; -// -// GraalHPyInplaceArithmeticCached(InplaceArithmetic operator) { -// opNode = operator.create(); -// ternary = operator.isTernary(); -// } -// -// @Override -// void checkArity(Object[] arguments) throws ArityException { -// GraalHPyInplaceArithmeticCached.checkInplaceArity(arguments, ternary); -// } -// -// private static void checkInplaceArity(Object[] arguments, boolean ternary) throws ArityException -// { -// // we also need to account for the HPy context -// if (ternary && arguments.length != 4) { -// CompilerDirectives.transferToInterpreterAndInvalidate(); -// throw ArityException.create(EXPECTED_ARITY_TERNARY, EXPECTED_ARITY_TERNARY, arguments.length); -// } -// if (!ternary && arguments.length != 3) { -// CompilerDirectives.transferToInterpreterAndInvalidate(); -// throw ArityException.create(EXPECTED_ARITY_BINARY, EXPECTED_ARITY_BINARY, arguments.length); -// } -// } -// -// @Override -// Object doOperator(Object[] arguments) { -// return opNode.execute(null, asPythonObjectNode.execute(arguments[1]), -// asPythonObjectNode.execute(arguments[2])); -// } -// } -// -// private static final class GraalHPyInplaceArithmeticUncached extends -// GraalHPyArithmeticUncachedNode { -// final InplaceArithmetic operator; -// -// public GraalHPyInplaceArithmeticUncached(InplaceArithmetic operator) { -// this.operator = operator; -// } -// -// @Override -// void checkArity(Object[] arguments) throws ArityException { -// GraalHPyInplaceArithmeticCached.checkInplaceArity(arguments, operator.isTernary()); -// } -// -// @Override -// RootCallTarget ensureCallTarget() { -// return PythonLanguage.get(null).createCachedCallTarget(operator::createRootNode, operator); -// } -// -// private static final GraalHPyInplaceArithmeticUncached[] UNCACHEDS; -// static { -// InplaceArithmetic[] values = InplaceArithmetic.values(); -// UNCACHEDS = new GraalHPyInplaceArithmeticUncached[values.length]; -// for (int i = 0; i < values.length; i++) { -// UNCACHEDS[i] = new GraalHPyInplaceArithmeticUncached(values[i]); -// } -// } -// } -// -// static void checkArity(Object[] arguments, int expectedArity) throws ArityException { -// if (arguments.length != expectedArity) { -// CompilerDirectives.transferToInterpreterAndInvalidate(); -// throw ArityException.create(expectedArity, expectedArity, arguments.length); -// } -// } - -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyBoxing.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyBoxing.java deleted file mode 100644 index 1eb6543026..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyBoxing.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -public class GraalHPyBoxing { - - // see the corresponding implementation in hpy_jni.c - - /*- - * This NaN boxing mechanism puts all non-double values into the range - * [0 - NAN_BOXING_BASE[. Boxing a double value adds NAN_BOXING_BASE, and - * unboxing a double value subtracts NAN_BOXING_BASE. - * Therefore, unboxing the non-double values ends up in the range - * [fff9_0000_0000_0000 - ffff_ffff_ffff_ffff], which are non-standard - * quiet NaNs with sign bit - these don't appear in normal calculations. - * - * The range [0 - 7fff_ffff] is currently used for HPy handles, - * and the range [0001_0000_0000_0000 - 0001_0000_ffff_ffff] is currently - * used to represent primitive integers. - * - * There is space left to add other types and extend the bit size of - * handles and integers. - */ - - private static final long NAN_BOXING_BASE = 0x0007_0000_0000_0000L; - private static final long NAN_BOXING_MASK = 0xFFFF_0000_0000_0000L; - private static final long NAN_BOXING_INT = 0x0001_0000_0000_0000L; - - private static final long NAN_BOXING_INT_MASK = 0x00000000FFFFFFFFL; - private static final long NAN_BOXING_MAX_HANDLE = Integer.MAX_VALUE; - - // First N constants in the HPyContext are guaranteed to always get the same handle assigned. - // Note that 0 is HPy_NULL, so in this case we are counting from 1. - public static final int SINGLETON_HANDLE_MAX = 3; - - public static boolean isBoxedDouble(long value) { - return Long.compareUnsigned(value, NAN_BOXING_BASE) >= 0; - } - - public static boolean isBoxedHandle(long value) { - return Long.compareUnsigned(value, NAN_BOXING_MAX_HANDLE) <= 0; - } - - public static boolean isBoxedInt(long value) { - return (value & NAN_BOXING_MASK) == NAN_BOXING_INT; - } - - public static boolean isBoxedNullHandle(long value) { - return value == 0; - } - - public static int unboxHandle(long value) { - return (int) value; - } - - public static long boxHandle(int handle) { - return handle; - } - - public static double unboxDouble(long value) { - return Double.longBitsToDouble(value - NAN_BOXING_BASE); - } - - public static long boxDouble(double value) { - // assumes that value doesn't contain non-standard silent NaNs - assert Long.compareUnsigned(Double.doubleToRawLongBits(value) + NAN_BOXING_BASE, NAN_BOXING_BASE) >= 0; - - long doubleBits = Double.doubleToRawLongBits(value); - return doubleBits + NAN_BOXING_BASE; - } - - public static int unboxInt(long value) { - return (int) (value - NAN_BOXING_INT); - } - - public static long boxInt(int value) { - return (value & NAN_BOXING_INT_MASK) + NAN_BOXING_INT; - } - - public static boolean isBoxablePrimitive(Object value) { - return value instanceof Double || value instanceof Integer; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyBuffer.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyBuffer.java deleted file mode 100644 index 5c14568d96..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyBuffer.java +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import static com.oracle.truffle.api.strings.TruffleString.Encoding.UTF_8; - -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.PythonAbstractObject; -import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CIntArrayWrapper; -import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CStringWrapper; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyAsHandleNode; -import com.oracle.graal.python.builtins.objects.ints.PInt; -import com.oracle.graal.python.builtins.objects.memoryview.CExtPyBuffer; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.TruffleObject; -import com.oracle.truffle.api.interop.UnknownIdentifierException; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.library.CachedLibrary; -import com.oracle.truffle.api.library.ExportLibrary; -import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.strings.TruffleString; - -/** - * This class implements an interop object that behaves like {@code HPy_buffer} and is backed by - * {@link CExtPyBuffer}. Therefore, this object is just a view and is read-only. The idea is to use - * this view for releasing a buffer since releasing usually doesn't need all values and so we try to - * avoid to do costly conversions eagerly. - * - * The {@code HPy_buffer} structure: - * - *
      - *     typedef struct {
      - *         void *buf;
      - *         HPy obj;
      - *         HPy_ssize_t len;
      - *         HPy_ssize_t itemsize;
      - *         int readonly;
      - *         int ndim;
      - *         char *format;
      - *         HPy_ssize_t *shape;
      - *         HPy_ssize_t *strides;
      - *         HPy_ssize_t *suboffsets;
      - *         void *internal;
      - * } HPy_buffer;
      - * 
      - */ -@ExportLibrary(InteropLibrary.class) -@SuppressWarnings("static-method") -public final class GraalHPyBuffer implements TruffleObject { - private static final String J_MEMBER_BUF = "buf"; - private static final String J_MEMBER_OBJ = "obj"; - private static final String J_MEMBER_LEN = "len"; - private static final String J_MEMBER_ITEMSIZE = "itemsize"; - private static final String J_MEMBER_READONLY = "readonly"; - private static final String J_MEMBER_NDIM = "ndim"; - private static final String J_MEMBER_FORMAT = "format"; - private static final String J_MEMBER_SHAPE = "shape"; - private static final String J_MEMBER_STRIDES = "strides"; - private static final String J_MEMBER_SUBOFFSETS = "suboffsets"; - private static final String J_MEMBER_INTERNAL = "internal"; - - @CompilationFinal(dimensions = 1) private static final String[] MEMBERS = new String[]{J_MEMBER_BUF, J_MEMBER_OBJ, J_MEMBER_LEN, J_MEMBER_ITEMSIZE, J_MEMBER_READONLY, J_MEMBER_NDIM, - J_MEMBER_FORMAT, J_MEMBER_SHAPE, J_MEMBER_STRIDES, J_MEMBER_SUBOFFSETS, J_MEMBER_INTERNAL}; - - final GraalHPyContext context; - private final CExtPyBuffer buffer; - - private GraalHPyHandle ownerHandle; - Object nativePointer; - - public GraalHPyBuffer(GraalHPyContext context, CExtPyBuffer buffer) { - this.context = context; - this.buffer = buffer; - } - - @ExportMessage - boolean hasMembers() { - return true; - } - - @ExportMessage - Object getMembers(@SuppressWarnings("unused") boolean includeInternal) { - return new PythonAbstractObject.Keys(new Object[]{J_MEMBER_BUF, J_MEMBER_OBJ, J_MEMBER_LEN, J_MEMBER_ITEMSIZE, J_MEMBER_READONLY, - J_MEMBER_NDIM, J_MEMBER_FORMAT, J_MEMBER_SHAPE, J_MEMBER_STRIDES, J_MEMBER_SUBOFFSETS, J_MEMBER_INTERNAL}); - } - - @ExportMessage - boolean isMemberReadable(String key) { - for (int i = 0; i < MEMBERS.length; i++) { - if (MEMBERS[i].equals(key)) { - return true; - } - } - return false; - } - - @ExportMessage - Object readMember(String member, - @Cached HPyAsHandleNode toNativeNode) throws UnknownIdentifierException { - switch (member) { - case J_MEMBER_BUF: - return buffer.getBuf(); - case J_MEMBER_OBJ: - if (ownerHandle == null) { - Object obj = buffer.getObj(); - ownerHandle = toNativeNode.execute(obj != null ? obj : PNone.NO_VALUE); - } - return ownerHandle; - case J_MEMBER_LEN: - return buffer.getLen(); - case J_MEMBER_ITEMSIZE: - return buffer.getItemSize(); - case J_MEMBER_READONLY: - return PInt.intValue(buffer.isReadOnly()); - case J_MEMBER_NDIM: - return buffer.getDims(); - case J_MEMBER_FORMAT: - return buffer.getFormat() != null ? new CStringWrapper(buffer.getFormat()) : toNativeNode.execute(PNone.NO_VALUE); - case J_MEMBER_SHAPE: - return toCArray(toNativeNode, buffer.getShape()); - case J_MEMBER_STRIDES: - return toCArray(toNativeNode, buffer.getStrides()); - case J_MEMBER_SUBOFFSETS: - return toCArray(toNativeNode, buffer.getSuboffsets()); - case J_MEMBER_INTERNAL: - return buffer.getInternal(); - } - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw UnknownIdentifierException.create(member); - } - - private static Object toCArray(HPyAsHandleNode toNativeNode, int[] arr) { - if (arr != null) { - return new CIntArrayWrapper(arr); - } - return toNativeNode.execute(PNone.NO_VALUE); - } - - @ExportMessage - boolean isPointer() { - return nativePointer != null; - } - - @ExportMessage - long asPointer( - @CachedLibrary(limit = "1") InteropLibrary lib) throws UnsupportedMessageException { - return PythonUtils.coerceToLong(nativePointer, lib); - } - - @ExportMessage - void toNative( - @Cached(parameters = "this.context") GraalHPyCAccess.AllocateNode allocateNode, - @Cached(parameters = "this.context") GraalHPyCAccess.WritePointerNode writePointerNode, - @Cached(parameters = "this.context") GraalHPyCAccess.WriteHPyNode writeHPyNode, - @Cached(parameters = "this.context") GraalHPyCAccess.WriteSizeTNode writeSizeTNode, - @Cached(parameters = "this.context") GraalHPyCAccess.WriteI32Node writeI32Node, - @Cached TruffleString.AsNativeNode asNativeNode, - @Cached TruffleString.GetInternalNativePointerNode getInternalNativePointerNode, - @Cached TruffleString.SwitchEncodingNode switchEncodingNode) { - if (nativePointer == null) { - Object nativePointer = allocateNode.malloc(context, HPyContextSignatureType.HPy_buffer); - TruffleString formatUtf8 = switchEncodingNode.execute(buffer.getFormat(), UTF_8); - TruffleString formatNative = asNativeNode.execute(formatUtf8, byteSize -> context.nativeToInteropPointer(allocateNode.malloc(context, byteSize)), UTF_8, true, true); - Object formatPtr = getInternalNativePointerNode.execute(formatNative, UTF_8); - - writePointerNode.write(context, nativePointer, GraalHPyCField.HPy_buffer__buf, buffer.getBuf()); - writeHPyNode.write(context, nativePointer, GraalHPyCField.HPy_buffer__obj, buffer.getObj()); - writeSizeTNode.write(context, nativePointer, GraalHPyCField.HPy_buffer__len, buffer.getLen()); - writeSizeTNode.write(context, nativePointer, GraalHPyCField.HPy_buffer__itemsize, buffer.getItemSize()); - writeI32Node.write(context, nativePointer, GraalHPyCField.HPy_buffer__readonly, PInt.intValue(buffer.isReadOnly())); - writeI32Node.write(context, nativePointer, GraalHPyCField.HPy_buffer__ndim, buffer.getDims()); - writePointerNode.write(context, nativePointer, GraalHPyCField.HPy_buffer__format, formatPtr); - writePointerNode.write(context, nativePointer, GraalHPyCField.HPy_buffer__shape, intArrayToNativeInt64(context, buffer.getShape(), allocateNode, writeSizeTNode)); - writePointerNode.write(context, nativePointer, GraalHPyCField.HPy_buffer__strides, intArrayToNativeInt64(context, buffer.getStrides(), allocateNode, writeSizeTNode)); - writePointerNode.write(context, nativePointer, GraalHPyCField.HPy_buffer__suboffsets, intArrayToNativeInt64(context, buffer.getSuboffsets(), allocateNode, writeSizeTNode)); - writePointerNode.write(context, nativePointer, GraalHPyCField.HPy_buffer__internal, buffer.getInternal()); - this.nativePointer = nativePointer; - } - } - - private static Object intArrayToNativeInt64(GraalHPyContext ctx, int[] data, GraalHPyCAccess.AllocateNode allocateNode, GraalHPyCAccess.WriteSizeTNode writeSizeTNode) { - if (data != null) { - long elemSize = ctx.getCTypeSize(HPyContextSignatureType.HPy_ssize_t); - Object ptr = allocateNode.calloc(ctx, data.length, elemSize); - for (int i = 0; i < data.length; i++) { - writeSizeTNode.execute(ctx, ptr, i * elemSize, data[i]); - } - return ptr; - } - return ctx.getNativeNull(); - } - - void free(GraalHPyContext ctx, GraalHPyCAccess.FreeNode freeNode, GraalHPyCAccess.ReadPointerNode readPointerNode, GraalHPyCAccess.ReadHPyNode readHPyNode) { - if (ownerHandle != null) { - ownerHandle.closeAndInvalidate(context); - } - if (nativePointer != null) { - Object owner = readHPyNode.readAndClose(ctx, nativePointer, GraalHPyCField.HPy_buffer__obj); - assert owner == buffer.getObj(); - Object format = readPointerNode.read(ctx, nativePointer, GraalHPyCField.HPy_buffer__format); - Object shape = readPointerNode.read(ctx, nativePointer, GraalHPyCField.HPy_buffer__shape); - Object suboffsets = readPointerNode.read(ctx, nativePointer, GraalHPyCField.HPy_buffer__suboffsets); - freeNode.free(ctx, format); - freeNode.free(ctx, shape); - freeNode.free(ctx, suboffsets); - freeNode.free(ctx, nativePointer); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyCAccess.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyCAccess.java deleted file mode 100644 index 5f38920088..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyCAccess.java +++ /dev/null @@ -1,726 +0,0 @@ -/* - * Copyright (c) 2023, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.GraalHPyHandleReference; -import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.nodes.Node; - -public abstract class GraalHPyCAccess { - - private GraalHPyCAccess() { - } - - private abstract static class CStructAccessNode extends Node { - - abstract boolean accepts(HPyContextSignatureType type); - - final boolean accepts(GraalHPyCField field) { - return accepts(field.getType()); - } - - /** - * Use this method to compute the address of a struct field where the struct is one element - * in an array. For example: - * - *
      -         *     HPyType_SpecParam params[] = {
      -         *         {HPyType_SpecParam_Base, ctx->h_LongType},
      -         *         {HPyType_SpecParam_Base, ctx->h_UnicodeType},
      -         *         {0}
      -         *     }
      -         * 
      - * - * Assume you want to read the field {@code object} (the second field of type {@code HPy}) - * of the second array element. The address is then computed by: - * - *
      -         *     long arrElemOffset = getElementPtr(1, GraalHPyCStruct.HPyType_SpecParam.getSize(), GraalHPyCField.HPyType_SpecParam_object)
      -         * 
      - * - * You may later read the value using {@code ReadHPyNode.execute(ctx, base, arrElemOffset)}. - * - * @param idx Index of the element (e.g. a struct type). - * @param elementSize Size of each element. - * @param field Field of the element (e.g. a struct field). - */ - public static long getElementPtr(GraalHPyContext ctx, long idx, long elementSize, GraalHPyCField field) { - return idx * elementSize + ctx.getCFieldOffset(field); - } - - public static long getElementPtr(GraalHPyContext ctx, long idx, HPyContextSignatureType elementType, GraalHPyCField field) { - return idx * ctx.getCTypeSize(elementType) + ctx.getCFieldOffset(field); - } - - } - - public abstract static class AllocateNode extends Node { - - protected abstract Object execute(GraalHPyContext ctx, long size, boolean zero); - - public final Object malloc(GraalHPyContext ctx, long size) { - return execute(ctx, size, false); - } - - public final Object malloc(GraalHPyContext ctx, HPyContextSignatureType ctype) { - return execute(ctx, ctx.getCTypeSize(ctype), false); - } - - public final Object calloc(GraalHPyContext ctx, long count, long size) { - return execute(ctx, count * size, true); - } - - @NeverDefault - public static AllocateNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createAllocateNode(); - } - - public static AllocateNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedAllocateNode(); - } - } - - public abstract static class FreeNode extends Node { - - protected abstract void execute(GraalHPyContext ctx, Object pointer); - - public final void free(GraalHPyContext ctx, Object pointer) { - execute(ctx, pointer); - } - - @NeverDefault - public static FreeNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createFreeNode(); - } - - public static FreeNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedFreeNode(); - } - } - - public abstract static class BulkFreeHandleReferencesNode extends Node { - - protected abstract void execute(GraalHPyContext ctx, GraalHPyHandleReference[] references); - - @NeverDefault - public static BulkFreeHandleReferencesNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createBulkFreeHandleReferencesNode(); - } - } - - public abstract static class IsNullNode extends Node { - - protected abstract boolean execute(GraalHPyContext ctx, Object pointer); - - public static boolean executeUncached(GraalHPyContext ctx, Object pointer) { - return IsNullNode.getUncached(ctx).execute(ctx, pointer); - } - - @NeverDefault - public static IsNullNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createIsNullNode(); - } - - public static IsNullNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedIsNullNode(); - } - } - - public abstract static class GetElementPtrNode extends CStructAccessNode { - - public abstract Object execute(GraalHPyContext ctx, Object pointer, long offset); - - public final Object getElementPtr(GraalHPyContext ctx, Object pointer, GraalHPyCField field) { - // GR-50245 - // assert accepts(field); - return execute(ctx, pointer, ctx.getCFieldOffset(field)); - } - - @Override - public final boolean accepts(HPyContextSignatureType desc) { - return true; - } - - @NeverDefault - public static GetElementPtrNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createGetElementPtrNode(); - } - - public static GetElementPtrNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedGetElementPtrNode(); - } - } - - public abstract static class ReadGenericNode extends CStructAccessNode { - - protected abstract Object execute(GraalHPyContext ctx, Object pointer, long offset, HPyContextSignatureType size); - - protected abstract int executeInt(GraalHPyContext ctx, Object pointer, long offset, HPyContextSignatureType size); - - protected abstract long executeLong(GraalHPyContext ctx, Object pointer, long offset, HPyContextSignatureType size); - - @Override - boolean accepts(HPyContextSignatureType type) { - return true; - } - - public final Object read(GraalHPyContext ctx, Object pointer, GraalHPyCField field) { - return execute(ctx, pointer, ctx.getCFieldOffset(field), field.getType()); - } - - public final int readInt(GraalHPyContext ctx, Object pointer, GraalHPyCField field) { - return executeInt(ctx, pointer, ctx.getCFieldOffset(field), field.getType()); - } - - public final long readLong(GraalHPyContext ctx, Object pointer, GraalHPyCField field) { - return executeLong(ctx, pointer, ctx.getCFieldOffset(field), field.getType()); - } - - @NeverDefault - public static ReadGenericNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createReadGenericNode(); - } - - public static ReadGenericNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedReadGenericNode(); - } - } - - public abstract static class ReadI8ArrayNode extends CStructAccessNode { - - protected abstract byte[] execute(GraalHPyContext ctx, Object pointer, long offset, long n); - - @Override - public final boolean accepts(HPyContextSignatureType desc) { - return false; - } - - @NeverDefault - public static ReadI8ArrayNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createReadI8ArrayNode(); - } - - public static ReadI8ArrayNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedReadI8ArrayNode(); - } - } - - public abstract static class ReadHPyNode extends CStructAccessNode { - - protected abstract Object execute(GraalHPyContext ctx, Object pointer, long offset, boolean close); - - @Override - public final boolean accepts(HPyContextSignatureType desc) { - return false; - } - - public final Object read(GraalHPyContext ctx, Object pointer, long offset) { - return execute(ctx, pointer, offset, false); - } - - /** - * Read an {@code HPy} handle and return the referred object. - */ - public final Object read(GraalHPyContext ctx, Object pointer, GraalHPyCField field) { - // GR-50245 - // assert accepts(field); - return execute(ctx, pointer, ctx.getCFieldOffset(field), false); - } - - /** - * Read and close an {@code HPy} handle and return the referred object. This method is - * mostly useful if some C function returns a handle via an out param. For example, - * any {@code HPyFunc_getbufferproc} function returns a handle in the {@code HPy_buffer} - * struct. - */ - public final Object readAndClose(GraalHPyContext ctx, Object pointer, GraalHPyCField field) { - // GR-50245 - // assert accepts(field); - return execute(ctx, pointer, ctx.getCFieldOffset(field), true); - } - - @NeverDefault - public static ReadHPyNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createReadHPyNode(); - } - - public static ReadHPyNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedReadHPyNode(); - } - } - - public abstract static class ReadHPyFieldNode extends CStructAccessNode { - - protected abstract Object execute(GraalHPyContext ctx, PythonObject owner, Object pointer, long offset, boolean close); - - @Override - public final boolean accepts(HPyContextSignatureType desc) { - return false; - } - - public final Object read(GraalHPyContext ctx, PythonObject owner, Object pointer, long offset) { - return execute(ctx, owner, pointer, offset, false); - } - - /** - * Read an {@code HPy} handle and return the referred object. - */ - public final Object read(GraalHPyContext ctx, PythonObject owner, Object pointer, GraalHPyCField field) { - // GR-50245 - // assert accepts(field); - return execute(ctx, owner, pointer, ctx.getCFieldOffset(field), false); - } - - @NeverDefault - public static ReadHPyFieldNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createReadHPyFieldNode(); - } - - public static ReadHPyFieldNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedReadFieldHPyNode(); - } - } - - public abstract static class ReadHPyArrayNode extends CStructAccessNode { - - protected abstract Object[] execute(GraalHPyContext ctx, Object pointer, long offset, long n); - - @Override - public final boolean accepts(HPyContextSignatureType desc) { - return false; - } - - @NeverDefault - public static ReadHPyArrayNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createReadHPyArrayNode(); - } - - public static ReadHPyArrayNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedReadHPyArrayNode(); - } - } - - public abstract static class ReadI32Node extends CStructAccessNode { - - protected abstract int execute(GraalHPyContext ctx, Object pointer, long offset); - - public final int read(GraalHPyContext ctx, Object pointer, GraalHPyCField field) { - // GR-50245 - // assert accepts(field); - return execute(ctx, pointer, ctx.getCFieldOffset(field)); - } - - public final long readUnsigned(GraalHPyContext ctx, Object pointer, GraalHPyCField field) { - assert field.getType() == HPyContextSignatureType.Uint32_t; - return execute(ctx, pointer, ctx.getCFieldOffset(field)) & 0xFFFFFFFFL; - } - - @Override - public final boolean accepts(HPyContextSignatureType desc) { - return desc.jniType == int.class; - } - - public final int readOffset(GraalHPyContext ctx, Object pointer, long offset) { - return execute(ctx, pointer, offset); - } - - public final int readArrayElement(GraalHPyContext ctx, Object pointer, long element) { - return execute(ctx, pointer, element * Integer.BYTES); - } - - @NeverDefault - public static ReadI32Node create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createReadI32Node(); - } - - public static ReadI32Node getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedReadI32Node(); - } - } - - public abstract static class ReadI64Node extends CStructAccessNode { - - protected abstract long execute(GraalHPyContext ctx, Object pointer, long offset); - - public final long read(GraalHPyContext ctx, Object pointer, GraalHPyCField field) { - // GR-50245 - // assert accepts(field); - return execute(ctx, pointer, ctx.getCFieldOffset(field)); - } - - @Override - public final boolean accepts(HPyContextSignatureType desc) { - return desc.jniType == long.class; - } - - @NeverDefault - public static ReadI64Node create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createReadI64Node(); - } - - public static ReadI64Node getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedReadI64Node(); - } - } - - /** - * Note that this node returns a double, not a float, even though it reads only 32 bits. - */ - public abstract static class ReadFloatNode extends CStructAccessNode { - - protected abstract double execute(GraalHPyContext ctx, Object pointer, long offset); - - public final double read(GraalHPyContext ctx, Object pointer, GraalHPyCField field) { - // GR-50245 - // assert accepts(field); - return execute(ctx, pointer, ctx.getCFieldOffset(field)); - } - - @Override - public final boolean accepts(HPyContextSignatureType desc) { - return desc.jniType == double.class; - } - - public final double readArrayElement(GraalHPyContext ctx, Object pointer, int element) { - return execute(ctx, pointer, (long) element * Float.BYTES); - } - - @NeverDefault - public static ReadFloatNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createReadFloatNode(); - } - - public static ReadFloatNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedReadFloatNode(); - } - } - - public abstract static class ReadDoubleNode extends CStructAccessNode { - - protected abstract double execute(GraalHPyContext ctx, Object pointer, long offset); - - public final double read(GraalHPyContext ctx, Object pointer, GraalHPyCField field) { - // GR-50245 - // assert accepts(field); - return execute(ctx, pointer, ctx.getCFieldOffset(field)); - } - - @Override - public final boolean accepts(HPyContextSignatureType desc) { - return desc.jniType == double.class; - } - - public final double readArrayElement(GraalHPyContext ctx, Object pointer, int element) { - return execute(ctx, pointer, (long) element * Double.BYTES); - } - - @NeverDefault - public static ReadDoubleNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createReadDoubleNode(); - } - - public static ReadDoubleNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedReadDoubleNode(); - } - } - - public abstract static class ReadPointerNode extends CStructAccessNode { - - protected abstract Object execute(GraalHPyContext ctx, Object pointer, long offset); - - public final Object read(GraalHPyContext ctx, Object pointer, GraalHPyCField field) { - // GR-50245 - // assert accepts(field); - return execute(ctx, pointer, ctx.getCFieldOffset(field)); - } - - @Override - public final boolean accepts(HPyContextSignatureType desc) { - return "POINTER".equals(desc.nfiType); - } - - public final Object readArrayElement(GraalHPyContext ctx, Object pointer, long element) { - return execute(ctx, pointer, element * ctx.getCTypeSize(HPyContextSignatureType.VoidPtr)); - } - - @NeverDefault - public static ReadPointerNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createReadPointerNode(); - } - - public static ReadPointerNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedReadPointerNode(); - } - } - - public abstract static class WriteDoubleNode extends CStructAccessNode { - - protected abstract void execute(GraalHPyContext ctx, Object pointer, long offset, double value); - - public final void write(GraalHPyContext ctx, Object pointer, GraalHPyCField field, double value) { - // GR-50245 - // assert accepts(field); - execute(ctx, pointer, ctx.getCFieldOffset(field), value); - } - - public final void write(GraalHPyContext ctx, Object pointer, double value) { - execute(ctx, pointer, 0, value); - } - - public final void writeArrayElement(GraalHPyContext ctx, Object pointer, long element, double value) { - execute(ctx, pointer, element * Double.BYTES, value); - } - - @Override - public final boolean accepts(HPyContextSignatureType desc) { - return desc == HPyContextSignatureType.CDouble; - } - - @NeverDefault - public static WriteDoubleNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createWriteDoubleNode(); - } - - public static WriteDoubleNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedWriteDoubleNode(); - } - } - - public abstract static class WriteI32Node extends CStructAccessNode { - - protected abstract void execute(GraalHPyContext ctx, Object pointer, long offset, int value); - - public final void write(GraalHPyContext ctx, Object pointer, GraalHPyCField field, int value) { - // GR-50245 - // assert accepts(field); - execute(ctx, pointer, ctx.getCFieldOffset(field), value); - } - - public final void write(GraalHPyContext ctx, Object pointer, int value) { - execute(ctx, pointer, 0, value); - } - - @Override - public final boolean accepts(HPyContextSignatureType desc) { - return desc.jniType == int.class; - } - - public final void writeArrayElement(GraalHPyContext ctx, Object pointer, long element, int value) { - execute(ctx, pointer, element * Integer.BYTES, value); - } - - @NeverDefault - public static WriteI32Node create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createWriteI32Node(); - } - - public static WriteI32Node getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedWriteI32Node(); - } - } - - public abstract static class WriteI64Node extends CStructAccessNode { - - protected abstract void execute(GraalHPyContext ctx, Object pointer, long offset, long value); - - public final void write(GraalHPyContext ctx, Object pointer, GraalHPyCField field, long value) { - // GR-50245 - // assert accepts(field); - execute(ctx, pointer, ctx.getCFieldOffset(field), value); - } - - public final void write(GraalHPyContext ctx, Object pointer, long value) { - execute(ctx, pointer, 0, value); - } - - @Override - public final boolean accepts(HPyContextSignatureType desc) { - return desc.jniType == long.class; - } - - @NeverDefault - public static WriteI64Node create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createWriteI64Node(); - } - - public static WriteI64Node getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedWriteI64Node(); - } - } - - public abstract static class WriteGenericNode extends CStructAccessNode { - - protected abstract void execute(GraalHPyContext ctx, Object pointer, long offset, HPyContextSignatureType type, Object value); - - protected abstract void execute(GraalHPyContext ctx, Object pointer, long offset, HPyContextSignatureType type, long value); - - @Override - public final boolean accepts(HPyContextSignatureType desc) { - return true; - } - - @NeverDefault - public static WriteGenericNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createWriteGenericNode(); - } - - public static WriteGenericNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedWriteGenericNode(); - } - } - - public abstract static class WriteHPyNode extends CStructAccessNode { - - protected abstract void execute(GraalHPyContext ctx, Object pointer, long offset, Object value); - - public final void write(GraalHPyContext ctx, Object pointer, GraalHPyCField field, Object value) { - // GR-50245 - // assert accepts(field); - execute(ctx, pointer, ctx.getCFieldOffset(field), value); - } - - public final void write(GraalHPyContext ctx, Object pointer, Object value) { - execute(ctx, pointer, 0, value); - } - - @Override - public final boolean accepts(HPyContextSignatureType desc) { - return desc == HPyContextSignatureType.HPy; - } - - @NeverDefault - public static WriteHPyNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createWriteHPyNode(); - } - - public static WriteHPyNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedWriteHPyNode(); - } - } - - public abstract static class WriteHPyFieldNode extends CStructAccessNode { - - protected abstract void execute(GraalHPyContext ctx, PythonObject owner, Object pointer, long offset, Object value); - - public final void write(GraalHPyContext ctx, PythonObject owner, Object pointer, GraalHPyCField field, Object value) { - // GR-50245 - // assert accepts(field); - execute(ctx, owner, pointer, ctx.getCFieldOffset(field), value); - } - - public final void write(GraalHPyContext ctx, PythonObject owner, Object pointer, Object value) { - execute(ctx, owner, pointer, 0, value); - } - - @Override - public final boolean accepts(HPyContextSignatureType desc) { - return desc == HPyContextSignatureType.HPyField; - } - - @NeverDefault - public static WriteHPyFieldNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createWriteHPyFieldNode(); - } - - public static WriteHPyFieldNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedWriteHPyFieldNode(); - } - } - - public abstract static class WritePointerNode extends CStructAccessNode { - - protected abstract void execute(GraalHPyContext ctx, Object basePointer, long offset, Object valuePointer); - - public final void write(GraalHPyContext ctx, Object basePointer, GraalHPyCField field, Object valuePointer) { - // GR-50245 - // assert accepts(field); - execute(ctx, basePointer, ctx.getCFieldOffset(field), valuePointer); - } - - public final void write(GraalHPyContext ctx, Object basePointer, Object valuePointer) { - execute(ctx, basePointer, 0, valuePointer); - } - - @Override - public final boolean accepts(HPyContextSignatureType desc) { - return "POINTER".equals(desc.nfiType); - } - - @NeverDefault - public static WritePointerNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createWritePointerNode(); - } - - public static WritePointerNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedWritePointerNode(); - } - } - - public abstract static class WriteSizeTNode extends CStructAccessNode { - - protected abstract void execute(GraalHPyContext ctx, Object basePointer, long offset, long value); - - public final void write(GraalHPyContext ctx, Object basePointer, GraalHPyCField field, long value) { - // GR-50245 - // assert accepts(field); - execute(ctx, basePointer, ctx.getCFieldOffset(field), value); - } - - public final void write(GraalHPyContext ctx, Object basePointer, long value) { - execute(ctx, basePointer, 0, value); - } - - @Override - public final boolean accepts(HPyContextSignatureType desc) { - return desc == HPyContextSignatureType.Size_t || desc == HPyContextSignatureType.HPy_ssize_t; - } - - @NeverDefault - public static WriteSizeTNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createWriteSizeTNode(); - } - - public static WriteSizeTNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedWriteSizeTNode(); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyCField.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyCField.java deleted file mode 100644 index ca7862c321..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyCField.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2023, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.CharPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.ConstCharPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Cpy_PyObjectPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPy; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPyFunc_Signature; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPySlot_Slot; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPyType_BuiltinShape; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPy_ssize_t; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Int; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Int32_t; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.PyType_SlotPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Uint32_t; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.VoidPtr; - -public enum GraalHPyCField { - HPyType_SpecParam__kind(Int32_t), - HPyType_SpecParam__object(HPy), - HPyType_Spec__name(ConstCharPtr), - HPyType_Spec__basicsize(Int32_t), - HPyType_Spec__itemsize(Int32_t), - HPyType_Spec__flags(Uint32_t), - HPyType_Spec__builtin_shape(HPyType_BuiltinShape), - HPyType_Spec__legacy_slots(PyType_SlotPtr), - HPyType_Spec__defines(VoidPtr), - HPyType_Spec__doc(ConstCharPtr), - HPyDef__kind(Int32_t), - HPyDef__meth__name(ConstCharPtr), - HPyDef__meth__impl(VoidPtr), - HPyDef__meth__signature(HPyFunc_Signature), - HPyDef__meth__doc(ConstCharPtr), - HPyDef__member__name(ConstCharPtr), - HPyDef__member__type(Int), - HPyDef__member__offset(HPy_ssize_t), - HPyDef__member__readonly(Int), - HPyDef__member__doc(ConstCharPtr), - HPyDef__getset__name(ConstCharPtr), - HPyDef__getset__getter_impl(VoidPtr), - HPyDef__getset__setter_impl(VoidPtr), - HPyDef__getset__doc(ConstCharPtr), - HPyDef__getset__closure(VoidPtr), - HPyDef__slot__slot(HPySlot_Slot), - HPyDef__slot__impl(VoidPtr), - PyType_Slot__slot(Int), - PyType_Slot__pfunc(VoidPtr), - HPyCapsule_Destructor__cpy_trampoline(VoidPtr), - HPyCapsule_Destructor__impl(VoidPtr), - HPyCallFunction__impl(VoidPtr), - HPyModuleDef__doc(ConstCharPtr), - HPyModuleDef__size(HPy_ssize_t), - HPyModuleDef__legacy_methods(Cpy_PyObjectPtr), - HPyModuleDef__defines(VoidPtr), - HPyModuleDef__globals(VoidPtr), - PyGetSetDef__name(ConstCharPtr), - PyGetSetDef__get(VoidPtr), - PyGetSetDef__set(VoidPtr), - PyGetSetDef__doc(ConstCharPtr), - PyGetSetDef__closure(VoidPtr), - PyMemberDef__name(ConstCharPtr), - PyMemberDef__type(Int), - PyMemberDef__offset(HPy_ssize_t), - PyMemberDef__flags(Int), - PyMemberDef__doc(ConstCharPtr), - HPy_buffer__buf(VoidPtr), - HPy_buffer__obj(HPy), - HPy_buffer__len(HPy_ssize_t), - HPy_buffer__itemsize(HPy_ssize_t), - HPy_buffer__readonly(Int), - HPy_buffer__ndim(Int), - HPy_buffer__format(CharPtr), - HPy_buffer__shape(HPy_ssize_t), - HPy_buffer__strides(HPy_ssize_t), - HPy_buffer__suboffsets(HPy_ssize_t), - HPy_buffer__internal(VoidPtr); - - private final HPyContextSignatureType type; - - GraalHPyCField(HPyContextSignatureType type) { - this.type = type; - } - - public HPyContextSignatureType getType() { - return type; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyContext.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyContext.java deleted file mode 100644 index b508b8a6bb..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyContext.java +++ /dev/null @@ -1,1252 +0,0 @@ -/* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -// skip GIL -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import static com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.UNSAFE; -import static com.oracle.graal.python.util.PythonUtils.EMPTY_TRUFFLESTRING_ARRAY; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; -import static com.oracle.graal.python.util.PythonUtils.tsArray; - -import java.io.IOException; -import java.lang.invoke.VarHandle; -import java.lang.ref.Reference; -import java.lang.ref.ReferenceQueue; -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; -import java.util.logging.Level; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.PNotImplemented; -import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; -import com.oracle.graal.python.builtins.objects.cext.common.CExtContext; -import com.oracle.graal.python.builtins.objects.cext.common.HandleStack; -import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ApiInitException; -import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ImportException; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyGetNativeSpacePointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.GraalHPyModuleCreateNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.GraalHPyModuleExecNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNIContext; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMContext; -import com.oracle.graal.python.builtins.objects.dict.PDict; -import com.oracle.graal.python.builtins.objects.ellipsis.PEllipsis; -import com.oracle.graal.python.builtins.objects.exception.PBaseException; -import com.oracle.graal.python.builtins.objects.frame.PFrame; -import com.oracle.graal.python.builtins.objects.function.PArguments; -import com.oracle.graal.python.builtins.objects.function.Signature; -import com.oracle.graal.python.builtins.objects.module.PythonModule; -import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PGuards; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.PRootNode; -import com.oracle.graal.python.nodes.call.CallTargetInvokeNode; -import com.oracle.graal.python.nodes.call.GenericInvokeNode; -import com.oracle.graal.python.runtime.AsyncHandler; -import com.oracle.graal.python.runtime.GilNode; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.PythonImageBuildOptions; -import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.runtime.PythonOptions.HPyBackendMode; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.exception.PythonThreadKillException; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.CompilerDirectives.ValueType; -import com.oracle.truffle.api.RootCallTarget; -import com.oracle.truffle.api.TruffleLanguage.Env; -import com.oracle.truffle.api.TruffleLogger; -import com.oracle.truffle.api.TruffleThreadBuilder; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.interop.ArityException; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.TruffleObject; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.interop.UnsupportedTypeException; -import com.oracle.truffle.api.nodes.ControlFlowException; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.LoopConditionProfile; -import com.oracle.truffle.api.strings.TruffleString; - -public final class GraalHPyContext extends CExtContext implements TruffleObject { - - // {{start autogen}} - public static final int HPY_ABI_VERSION = 0; - public static final int HPY_ABI_VERSION_MINOR = 0; - public static final String HPY_ABI_TAG = "hpy0"; - // {{end autogen}} - - private static final String J_HPY_INIT = "HPyInit_"; - private static final String J_HPY_MAJOR_VER_FUN = "get_required_hpy_major_version_"; - private static final String J_HPY_MINOR_VER_FUN = "get_required_hpy_minor_version_"; - private static final String LOGGER_HPY_NAME = "hpy"; - private static final String HPY_EXT = ".hpy"; - private static final TruffleLogger LOGGER = GraalHPyContext.getLogger(GraalHPyContext.class); - - public static final long SIZEOF_LONG = java.lang.Long.BYTES; - private static final long NATIVE_ARGUMENT_STACK_SIZE = 1 << 15; // 32 kB stack size - - // "blah.hpy123[-graalpy231-310].so" - private static final Pattern SO_NAME_PATTERN = Pattern.compile(".*" + Pattern.quote(HPY_EXT) + "(\\d+)(?:-[\\w-]+)?\\.so$"); - - public static TruffleLogger getLogger(Class clazz) { - return PythonLanguage.getLogger(LOGGER_HPY_NAME + "." + clazz.getSimpleName()); - } - - @TruffleBoundary - public static GraalHPyContext ensureHPyWasLoaded(Node node, PythonContext context, TruffleString name, TruffleString path) throws IOException, ApiInitException, ImportException { - if (!context.hasHPyContext()) { - /* - * TODO(fa): Currently, you can't have the HPy context without the C API context. This - * should eventually be possible but requires some refactoring. - */ - CApiContext.ensureCapiWasLoaded(node, context, name, path); - - try { - GraalHPyContext hPyContext = context.createHPyContext(GraalHPyLLVMContext.loadLLVMLibrary(context)); - assert hPyContext == context.getHPyContext(); - return hPyContext; - } catch (ApiInitException e) { - throw e; - } catch (Exception e) { - // we don't expect any other exception - throw CompilerDirectives.shouldNotReachHere(e); - } - } - return context.getHPyContext(); - } - - /** - * This method loads an HPy extension module and will initialize the corresponding native - * contexts if necessary. - * - * @param location The node that's requesting this operation. This is required for reporting - * correct source code location in case exceptions occur. - * @param context The Python context object. - * @param name The name of the module to load (also just required for creating appropriate error - * messages). - * @param path The path of the C extension module to load (usually something ending with - * {@code .so} or {@code .pyd} or similar). - * @param mode The mode (e.g. debug or trace) to use when loading the module. - * @return Pointer to the HPy module definition struct. - * @throws IOException If the specified file cannot be loaded. - * @throws ApiInitException If the corresponding native context could not be initialized. - * @throws ImportException If an exception occurred during C extension initialization. - */ - @TruffleBoundary - public static Object loadHPyModule(Node location, PythonContext context, TruffleString name, TruffleString path, Object spec, HPyMode mode) throws IOException, ApiInitException, ImportException { - - /* - * Unfortunately, we need eagerly initialize the HPy context because the ctors of the - * extension may already require some symbols defined in the HPy API or C API. - */ - GraalHPyContext hpyUniversalContext = GraalHPyContext.ensureHPyWasLoaded(location, context, name, path); - GraalHPyNativeContext backend = hpyUniversalContext.backend; - Object llvmLibrary = backend.loadExtensionLibrary(location, context, name, path); - String basename = getBaseName(name).toJavaStringUncached(); - String hpyInitFuncName = J_HPY_INIT + basename; - - // get_required_hpy_major_version_ - String hpyMajorVersionFuncName = J_HPY_MAJOR_VER_FUN + basename; - - // get_required_hpy_minor_version_ - String hpyMinorVersionFuncName = J_HPY_MINOR_VER_FUN + basename; - - HPyABIVersion abiVersion; - try { - abiVersion = backend.getHPyABIVersion(llvmLibrary, hpyMajorVersionFuncName, hpyMinorVersionFuncName); - } catch (Exception e) { - throw PRaiseNode.raiseUncached(location, PythonBuiltinClassType.RuntimeError, ErrorMessages.HPY_ERROR_LOADING_EXT_MODULE, - path, hpyMajorVersionFuncName, hpyMinorVersionFuncName, e.getMessage()); - } - - /* - * For now, we have only one major version but in the future at this point we would decide - * which HPyContext to create. - */ - if (abiVersion.major != HPY_ABI_VERSION || abiVersion.minor > HPY_ABI_VERSION_MINOR) { - throw PRaiseNode.raiseUncached(location, PythonBuiltinClassType.RuntimeError, ErrorMessages.HPY_ABI_VERSION_ERROR, - name, abiVersion.major, abiVersion.minor, HPY_ABI_VERSION, HPY_ABI_VERSION_MINOR); - } - - // Sanity check of the tag in the shared object filename - validateABITag(location, basename, path.toJavaStringUncached(), abiVersion); - - HPyMode saved = hpyUniversalContext.currentMode; - hpyUniversalContext.currentMode = mode; - try { - Object hpyModuleDefPtr = backend.initHPyModule(llvmLibrary, hpyInitFuncName, name, path, mode); - // HPy only supports multi-phase extension module initialization. - assert !(hpyModuleDefPtr instanceof PythonModule); - if (InteropLibrary.getUncached().isNull(hpyModuleDefPtr)) { - throw PRaiseNode.raiseUncached(location, PythonBuiltinClassType.RuntimeError, ErrorMessages.ERROR_LOADING_HPY_EXT_S_S, path, name); - } - - Object module = GraalHPyModuleCreateNodeGen.getUncached().execute(context.getHPyContext(), name, spec, hpyModuleDefPtr); - if (module instanceof PythonModule pythonModule) { - GraalHPyModuleExecNodeGen.getUncached().execute(location, context.getHPyContext(), pythonModule); - } - return module; - } catch (UnsupportedTypeException | ArityException | UnsupportedMessageException e) { - throw new ImportException(CExtContext.wrapJavaException(e, location), name, path, ErrorMessages.CANNOT_INITIALIZE_WITH, path, basename, ""); - } finally { - hpyUniversalContext.currentMode = saved; - } - } - - private static void validateABITag(Node location, String shortname, String soname, HPyABIVersion abiVersion) { - // assumes format: "blah.hpy123[-310].so" - Matcher matcher = SO_NAME_PATTERN.matcher(soname); - if (matcher.matches()) { - String abiTagVersion = matcher.group(1); - int abiTag = Integer.parseInt(abiTagVersion); - if (abiTag != abiVersion.major) { - throw PRaiseNode.raiseUncached(location, PythonBuiltinClassType.RuntimeError, ErrorMessages.HPY_ABI_TAG_MISMATCH, - shortname, soname, abiTag, abiVersion.major, abiVersion.minor); - } - // major version fits -> validation successful - return; - } - throw PRaiseNode.raiseUncached(location, PythonBuiltinClassType.RuntimeError, ErrorMessages.HPY_NO_ABI_TAG, - shortname, soname, abiVersion.major, abiVersion.minor); - } - - public Object createArgumentsArray(Object[] args) { - return backend.createArgumentsArray(args); - } - - public void freeArgumentsArray(Object argsArray) { - backend.freeArgumentsArray(argsArray); - } - - public long createNativeArguments(Object[] delegate) { - if (nativeArgumentsStack == 0) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - // we use 'getContext().getUnsafe()' because this will check if native access is allowed - nativeArgumentsStack = getContext().getUnsafe().allocateMemory(NATIVE_ARGUMENT_STACK_SIZE); - nativeArgumentStackTop = nativeArgumentsStack + NATIVE_ARGUMENT_STACK_SIZE; - } - long arraySize = delegate.length * SIZEOF_LONG; - if (nativeArgumentsStack + arraySize > nativeArgumentStackTop) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - String msg = String.format("overflow on native argument stack (requested size: %d bytes)", arraySize); - LOGGER.severe(msg); - throw new InternalError(msg); - } - long arrayPtr = nativeArgumentsStack; - nativeArgumentsStack += arraySize; - - for (int i = 0; i < delegate.length; i++) { - Object element = delegate[i]; - UNSAFE.putLong(arrayPtr + i * SIZEOF_LONG, pythonObjectAsBits(element)); - } - return arrayPtr; - } - - public void freeNativeArgumentsArray(int nargs) { - freeNativeArgumentsUntil(nativeArgumentsStack - nargs * SIZEOF_LONG); - } - - public void freeNativeArgumentsUntil(long basePtr) { - assert basePtr <= nativeArgumentsStack; - for (long cur = basePtr; cur < nativeArgumentsStack; cur += SIZEOF_LONG) { - long h = UNSAFE.getLong(cur); - if (GraalHPyBoxing.isBoxedHandle(h)) { - releaseHPyHandleForObject(GraalHPyBoxing.unboxHandle(h)); - } - } - nativeArgumentsStack = basePtr; - } - - @ValueType - public record HPyABIVersion(int major, int minor) { - } - - public interface HPyUpcall { - String getName(); - } - - /** - * Enum of C types used in the HPy API. These type names need to stay in sync with the - * declarations in 'hpytypes.h'. - */ - public enum LLVMType { - HPyFunc_noargs, - HPyFunc_o, - HPyFunc_varargs, - HPyFunc_keywords, - HPyFunc_unaryfunc, - HPyFunc_binaryfunc, - HPyFunc_ternaryfunc, - HPyFunc_inquiry, - HPyFunc_lenfunc, - HPyFunc_ssizeargfunc, - HPyFunc_ssizessizeargfunc, - HPyFunc_ssizeobjargproc, - HPyFunc_ssizessizeobjargproc, - HPyFunc_objobjargproc, - HPyFunc_freefunc, - HPyFunc_getattrfunc, - HPyFunc_getattrofunc, - HPyFunc_setattrfunc, - HPyFunc_setattrofunc, - HPyFunc_reprfunc, - HPyFunc_hashfunc, - HPyFunc_richcmpfunc, - HPyFunc_getiterfunc, - HPyFunc_iternextfunc, - HPyFunc_descrgetfunc, - HPyFunc_descrsetfunc, - HPyFunc_initproc, - HPyFunc_getter, - HPyFunc_setter, - HPyFunc_objobjproc, - HPyFunc_traverseproc, - HPyFunc_destructor, - HPyFunc_getbufferproc, - HPyFunc_releasebufferproc, - HPyFunc_destroyfunc, - HPyModule_init, - HPyModule_create - } - - public static final int IMMUTABLE_HANDLE_COUNT = 256; - - private Object[] hpyHandleTable; - private int nextHandle = 1; - - private Object[] hpyGlobalsTable = new Object[]{GraalHPyHandle.NULL_HANDLE_DELEGATE}; - private final HandleStack freeStack = new HandleStack(16); - private final GraalHPyNativeContext backend; - - /** - * This field mirrors value of {@link PythonOptions#HPyEnableJNIFastPaths}. We store it in this - * final field because the value is also used in non-PE code paths. - */ - final boolean useNativeFastPaths; - - /** - * This is set to the appropriate mode if an HPy extension is initialized (i.e. - * {@code HPyInit_*} is called) in, e.g., debug mode. The value is then used to create the right - * closures for down calls during module ({@code HPyModule_Create}) and type creation - * ({@code HPyType_FromSpec}). We need this because the debug context is just a wrapper around - * the universal context, so the module and type creation will look as normal. For reference on - * how other implementations do it: - *

      - * CPython stores the HPy context into global C variable {@code _ctx_for_trampolines} defined by - * {@code HPy_MODINIT}. This variable belongs to the HPy extension and the context is loaded - * from it when calling HPy extension functions. - *

      - *

      - * PyPy has a different structure but basically also uses a global state (see file - * {@code interp_hpy.py}). When initializing the module, the appropriate handle manager - * is used. The manager then decides which trampolines are used to call HPy extensions and the - * trampolines pick the appropriate context. - *

      - */ - private HPyMode currentMode = HPyMode.MODE_UNIVERSAL; - - /** - * Few well known Python objects that are also HPyContext constants are guaranteed to always get - * the same handle. - */ - public static final int SINGLETON_HANDLE_NONE = 1; - public static final int SINGLETON_HANDLE_NOT_IMPLEMENTED = 2; - public static final int SINGLETON_HANDLE_ELIPSIS = 3; - - /** - * The global reference queue is a list consisting of {@link GraalHPyHandleReference} objects. - * It is used to keep those objects (which are weak refs) alive until they are enqueued in the - * corresponding reference queue. The list instance referenced by this variable is exclusively - * owned by the main thread (i.e. the main thread may operate on the list without - * synchronization). The HPy reference cleaner thread (see - * {@link GraalHPyReferenceCleanerRunnable}) will consume this instance using an atomic - * {@code getAndSet} operation. At this point, the ownership is transferred to the cleaner - * thread. - */ - public final AtomicReference references = new AtomicReference<>(null); - private ReferenceQueue nativeSpaceReferenceQueue; - @CompilationFinal private RootCallTarget referenceCleanerCallTarget; - private Thread hpyReferenceCleanerThread; - - private long nativeSpacePointers; - - private long nativeArgumentsStack = 0; - private long nativeArgumentStackTop = 0; - - private final ScheduledExecutorService scheduler; - - public GraalHPyContext(PythonContext context, Object hpyLibrary) throws ApiInitException { - super(context, hpyLibrary, false /* TODO: provide proper value */); - CompilerAsserts.neverPartOfCompilation(); - PythonLanguage language = context.getLanguage(); - int traceUpcallsInterval = language.getEngineOption(PythonOptions.HPyTraceUpcalls); - Boolean useNativeFastPaths = language.getEngineOption(PythonOptions.HPyEnableJNIFastPaths); - HPyBackendMode backendMode = language.getEngineOption(PythonOptions.HPyBackend); - - nextHandle = GraalHPyBoxing.SINGLETON_HANDLE_MAX + 1; - hpyHandleTable = new Object[IMMUTABLE_HANDLE_COUNT * 2]; - - // initialize singleton handles - hpyHandleTable[0] = GraalHPyHandle.NULL_HANDLE_DELEGATE; - hpyHandleTable[SINGLETON_HANDLE_NONE] = PNone.NONE; - hpyHandleTable[SINGLETON_HANDLE_NOT_IMPLEMENTED] = PNotImplemented.NOT_IMPLEMENTED; - hpyHandleTable[SINGLETON_HANDLE_ELIPSIS] = PEllipsis.INSTANCE; - - LOGGER.config("Using HPy backend:" + backendMode.name()); - if (backendMode == HPyBackendMode.JNI) { - if (!PythonImageBuildOptions.WITHOUT_JNI) { - this.useNativeFastPaths = useNativeFastPaths; - backend = new GraalHPyJNIContext(this, traceUpcallsInterval > 0); - } else { - throw new ApiInitException(ErrorMessages.HPY_CANNOT_USE_JNI_BACKEND); - } - } else if (backendMode == HPyBackendMode.NFI) { - throw new ApiInitException(ErrorMessages.HPY_NFI_NOT_YET_IMPLEMENTED); - } else if (backendMode == HPyBackendMode.LLVM) { - // TODO(fa): we currently don't use native fast paths with the LLVM backend - this.useNativeFastPaths = false; - backend = new GraalHPyLLVMContext(this, traceUpcallsInterval > 0); - } else { - throw new ApiInitException(ErrorMessages.HPY_UNKNOWN_BACKEND, TruffleString.fromJavaStringUncached(backendMode.name(), TS_ENCODING)); - } - - backend.initNativeContext(); - - // createMembers already assigns numeric handles to "singletons" - nextHandle = IMMUTABLE_HANDLE_COUNT; - - assert getHPyHandleForObject(PNone.NONE) == SINGLETON_HANDLE_NONE; - assert getHPyHandleForObject(PEllipsis.INSTANCE) == SINGLETON_HANDLE_ELIPSIS; - assert getHPyHandleForObject(PNotImplemented.NOT_IMPLEMENTED) == SINGLETON_HANDLE_NOT_IMPLEMENTED; - - if (traceUpcallsInterval > 0) { - scheduler = Executors.newScheduledThreadPool(1); - startUpcallsDaemon(traceUpcallsInterval); - } else { - scheduler = null; - } - } - - /** - * Reference cleaner action that will be executed by the {@link AsyncHandler}. - */ - private static final class GraalHPyHandleReferenceCleanerAction implements AsyncHandler.AsyncAction { - - private final GraalHPyHandleReference[] nativeObjectReferences; - - public GraalHPyHandleReferenceCleanerAction(GraalHPyHandleReference[] nativeObjectReferences) { - this.nativeObjectReferences = nativeObjectReferences; - } - - @Override - public void execute(PythonContext context) { - Object[] pArguments = PArguments.create(1); - PArguments.setArgument(pArguments, 0, nativeObjectReferences); - GenericInvokeNode.getUncached().execute(context.getHPyContext().getReferenceCleanerCallTarget(), pArguments); - } - } - - private RootCallTarget getReferenceCleanerCallTarget() { - if (referenceCleanerCallTarget == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - RootCallTarget localTarget = PythonUtils.getOrCreateCallTarget(new HPyNativeSpaceCleanerRootNode(getContext())); - VarHandle.storeStoreFence(); - referenceCleanerCallTarget = localTarget; - } - return referenceCleanerCallTarget; - } - - /** - * This is the HPy cleaner thread runnable. It will run in parallel to the main thread, collect - * references from the corresponding reference queue, and eventually call - * {@link HPyNativeSpaceCleanerRootNode}. For this, the cleaner thread consumes the - * {@link #references} list by exchanging it with an empty one (for a description of the - * exchanging process, see also {@link #references}). - */ - static final class GraalHPyReferenceCleanerRunnable implements Runnable { - private static final TruffleLogger LOGGER = GraalHPyContext.getLogger(GraalHPyReferenceCleanerRunnable.class); - private final ReferenceQueue referenceQueue; - private GraalHPyHandleReference cleanerList; - - GraalHPyReferenceCleanerRunnable(ReferenceQueue referenceQueue) { - this.referenceQueue = referenceQueue; - } - - @Override - public void run() { - try { - PythonContext pythonContext = PythonContext.get(null); - PythonLanguage language = pythonContext.getLanguage(); - GraalHPyContext hPyContext = pythonContext.getHPyContext(); - RootCallTarget callTarget = hPyContext.getReferenceCleanerCallTarget(); - PDict dummyGlobals = pythonContext.factory().createDict(); - boolean isLoggable = LOGGER.isLoggable(Level.FINE); - /* - * Intentionally retrieve the thread state every time since this will kill the - * thread if shutting down. - */ - while (!pythonContext.getThreadState(language).isShuttingDown()) { - Reference reference = null; - try { - reference = referenceQueue.remove(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - - ArrayList refs = new ArrayList<>(); - do { - if (reference instanceof GraalHPyHandleReference) { - refs.add((GraalHPyHandleReference) reference); - } - // consume all - reference = referenceQueue.poll(); - } while (reference != null); - - if (isLoggable) { - LOGGER.fine(PythonUtils.formatJString("Collected references: %d", refs.size())); - } - - /* - * To avoid race conditions, we take the whole references list such that we can - * solely process it. At this point, the references list is owned by the main - * thread and this will now transfer ownership to the cleaner thread. The list - * will be replaced by an empty list (which will then be owned by the main - * thread). - */ - GraalHPyHandleReference refList; - int retries = 0; - do { - /* - * If 'refList' is null then the main is currently updating it. So, we need - * to repeat until we get something. The written empty list will just be - * lost. - */ - refList = hPyContext.references.getAndSet(null); - } while (refList == null && retries++ < 3); - - if (!refs.isEmpty()) { - try { - Object[] arguments = PArguments.create(3); - PArguments.setGlobals(arguments, dummyGlobals); - PArguments.setException(arguments, PException.NO_EXCEPTION); - PArguments.setCallerFrameInfo(arguments, PFrame.Reference.EMPTY); - PArguments.setArgument(arguments, 0, refs.toArray(new GraalHPyHandleReference[0])); - PArguments.setArgument(arguments, 1, refList); - PArguments.setArgument(arguments, 2, cleanerList); - cleanerList = (GraalHPyHandleReference) CallTargetInvokeNode.invokeUncached(callTarget, arguments); - } catch (PException e) { - /* - * Since the cleaner thread is not running any Python code, we should - * never receive a Python exception. If it happens, consider that to be - * a problem (however, it is not fatal problem). - */ - if (e.getUnreifiedException() instanceof PBaseException managedException) { - e.setMessage(managedException.getFormattedMessage()); - } - LOGGER.warning("HPy reference cleaner thread received a Python exception: " + e); - } - } - } - } catch (PythonThreadKillException e) { - // this is exception shuts down the thread - LOGGER.fine("HPy reference cleaner thread received exit signal."); - } catch (ControlFlowException e) { - LOGGER.warning("HPy reference cleaner thread received unexpected control flow exception."); - } catch (Exception e) { - LOGGER.severe("HPy reference cleaner thread received fatal exception: " + e); - } - LOGGER.fine("HPy reference cleaner thread is exiting."); - } - } - - /** - * Root node that actually runs the destroy functions for the native memory of unreachable - * Python objects. - */ - private static final class HPyNativeSpaceCleanerRootNode extends PRootNode { - private static final Signature SIGNATURE = new Signature(-1, false, -1, false, tsArray("refs"), EMPTY_TRUFFLESTRING_ARRAY); - private static final TruffleLogger LOGGER = GraalHPyContext.getLogger(HPyNativeSpaceCleanerRootNode.class); - - @Child private GraalHPyCAccess.BulkFreeHandleReferencesNode callBulkFree; - - private final LoopConditionProfile loopProfile = LoopConditionProfile.create(); - - HPyNativeSpaceCleanerRootNode(PythonContext context) { - super(context.getLanguage()); - } - - @Override - public Object execute(VirtualFrame frame) { - /* - * This node is not running any Python code in the sense that it does not run any code - * that would run in CPython's interpreter loop. So, we don't need to do a - * calleeContext.enter/exit since we should never get any Python exception. - */ - - GraalHPyHandleReference[] handleReferences = (GraalHPyHandleReference[]) PArguments.getArgument(frame, 0); - GraalHPyHandleReference refList = (GraalHPyHandleReference) PArguments.getArgument(frame, 1); - GraalHPyHandleReference oldRefList = (GraalHPyHandleReference) PArguments.getArgument(frame, 2); - long startTime = 0; - long middleTime = 0; - final int n = handleReferences.length; - boolean loggable = LOGGER.isLoggable(Level.FINE); - - if (loggable) { - startTime = System.currentTimeMillis(); - } - - GraalHPyContext context = PythonContext.get(this).getHPyContext(); - - // mark queued references as cleaned - loopProfile.profileCounted(n); - for (int i = 0; loopProfile.inject(i < n); i++) { - handleReferences[i].cleaned = true; - } - - // remove marked references from the global reference list such that they can die - GraalHPyHandleReference prev = null; - for (GraalHPyHandleReference cur = refList; cur != null; cur = cur.next) { - if (cur.cleaned) { - if (prev != null) { - prev.next = cur.next; - } else { - // new head - refList = cur.next; - } - } else { - prev = cur; - } - } - - /* - * Merge the received reference list into the existing one or just take it if there - * wasn't one before. - */ - if (prev != null) { - // if prev exists, it now points to the tail - prev.next = oldRefList; - } else { - refList = oldRefList; - } - - if (loggable) { - middleTime = System.currentTimeMillis(); - } - - if (callBulkFree == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - callBulkFree = insert(GraalHPyCAccess.BulkFreeHandleReferencesNode.create(context)); - } - callBulkFree.execute(context, handleReferences); - - if (loggable) { - final long countDuration = middleTime - startTime; - final long duration = System.currentTimeMillis() - middleTime; - LOGGER.fine(PythonUtils.formatJString("Cleaned references: %d", n)); - LOGGER.fine(PythonUtils.formatJString("Count duration: %d", countDuration)); - LOGGER.fine(PythonUtils.formatJString("Duration: %d", duration)); - } - return refList; - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - - @Override - public String getName() { - return "hpy_native_reference_cleaner"; - } - - @Override - public boolean isInternal() { - return true; - } - - @Override - public boolean isPythonInternal() { - return true; - } - } - - public void initHPyDebugContext() throws ApiInitException { - backend.initHPyDebugContext(); - } - - public PythonModule getHPyDebugModule() throws ImportException { - return backend.getHPyDebugModule(); - } - - public PythonModule getHPyTraceModule() throws ImportException { - return backend.getHPyTraceModule(); - } - - HPyMode getCurrentMode() { - return currentMode; - } - - public GraalHPyNativeContext getBackend() { - return backend; - } - - @SuppressWarnings("static-method") - public GraalHPyHandle createHandle(Object delegate) { - return GraalHPyHandle.create(delegate); - } - - @SuppressWarnings("static-method") - public GraalHPyHandle createField(Object delegate, int idx) { - return GraalHPyHandle.createField(delegate, idx); - } - - public int createGlobal(Object delegate, int idx) { - assert !GilNode.getUncached().acquire(PythonContext.get(null)) : "Gil not held when creating global"; - final int newIdx; - if (idx <= 0) { - newIdx = allocateHPyGlobal(); - } else { - newIdx = idx; - } - hpyGlobalsTable[newIdx] = delegate; - if (useNativeFastPaths) { - mirrorGlobalNativeSpacePointerToNative(delegate, newIdx); - } - if (LOGGER.isLoggable(Level.FINER)) { - LOGGER.finer(PythonUtils.formatJString("allocating HPy global %d (object: %s)", newIdx, delegate)); - } - return newIdx; - } - - int getEndIndexOfGlobalTable() { - for (int i = hpyGlobalsTable.length - 1; i > 0; i--) { - if (hpyGlobalsTable[i] != null) { - return i + 1; - } - } - return hpyGlobalsTable.length; - } - - @TruffleBoundary - void initBatchGlobals(int startIdx, int nModuleGlobals) { - if (nModuleGlobals == 0) { - return; - } - int gtLen = hpyGlobalsTable.length; - int endIdx = startIdx + nModuleGlobals; - if (endIdx >= gtLen) { - int newSize = endIdx + 1; - LOGGER.fine(() -> PythonUtils.formatJString("resizing HPy globals table to %d", newSize)); - hpyGlobalsTable = Arrays.copyOf(hpyGlobalsTable, newSize); - if (useNativeFastPaths) { - reallocateNativeSpacePointersMirror(hpyHandleTable.length, gtLen); - } - } - Arrays.fill(hpyGlobalsTable, startIdx, endIdx, GraalHPyHandle.NULL_HANDLE_DELEGATE); - if (useNativeFastPaths) { - GraalHPyNativeCache.initGlobalsNativeSpacePointer(nativeSpacePointers, hpyHandleTable.length, startIdx, nModuleGlobals); - } - } - - @TruffleBoundary - private int allocateHPyGlobal() { - int handle = 0; - for (int i = 1; i < hpyGlobalsTable.length; i++) { - if (hpyGlobalsTable[i] == null) { - handle = i; - break; - } - } - if (handle == 0) { - // resize - handle = hpyGlobalsTable.length; - int newSize = Math.max(16, hpyGlobalsTable.length * 2); - LOGGER.fine(() -> "resizing HPy globals table to " + newSize); - hpyGlobalsTable = Arrays.copyOf(hpyGlobalsTable, newSize); - if (useNativeFastPaths) { - reallocateNativeSpacePointersMirror(hpyHandleTable.length, handle); - } - } - return handle; - } - - private int resizeHandleTable() { - CompilerAsserts.neverPartOfCompilation(); - assert nextHandle == hpyHandleTable.length; - int oldSize = hpyHandleTable.length; - int newSize = Math.max(16, hpyHandleTable.length * 2); - LOGGER.fine(() -> "resizing HPy handle table to " + newSize); - hpyHandleTable = Arrays.copyOf(hpyHandleTable, newSize); - if (useNativeFastPaths) { - reallocateNativeSpacePointersMirror(oldSize, hpyGlobalsTable.length); - } - return nextHandle++; - } - - public int getHPyHandleForObject(Object object) { - assert !(object instanceof GraalHPyHandle); - int singletonHandle = getHPyHandleForSingleton(object); - if (singletonHandle != -1) { - return singletonHandle; - } - return getHPyHandleForNonSingleton(object); - } - - public static int getHPyHandleForSingleton(Object object) { - assert !(object instanceof GraalHPyHandle); - return GetHPyHandleForSingleton.doGeneric(object); - } - - /** - * Allocates a handle for the given object. This method is intended to be used by the - * appropriate backend to initialize the context handles (i.e. handles available in - * {@code HPyContext *}; e.g. {@code HPyContext.h_None}). Following properties/restrictions - * apply: - *
        - *
      • This method *MUST NOT* be called after the context initialization was finished.
      • - *
      • The handles are not mirrored to the native cache even if {@link #useNativeFastPaths}. - * This should be done in a bulk operation after all context handles have been allocated.
      • - *
      • {@code object} must not be a singleton handle (i.e. - * {@link #getHPyHandleForSingleton(Object)} must return {@code -1}).
      • - *
      - */ - public int getHPyContextHandle(Object object) { - CompilerAsserts.neverPartOfCompilation(); - assert getHPyHandleForSingleton(object) == -1; - assert freeStack.getTop() == 0; - assert nextHandle < hpyHandleTable.length; - if (nextHandle >= IMMUTABLE_HANDLE_COUNT) { - throw CompilerDirectives.shouldNotReachHere("attempting to create context handle after initialization"); - } - int i = nextHandle++; - assert hpyHandleTable[i] == null; - hpyHandleTable[i] = object; - return i; - } - - public int getHPyHandleForNonSingleton(Object object) { - assert !(object instanceof GraalHPyHandle); - // find free association - - int handle = freeStack.pop(); - if (handle == -1) { - if (nextHandle < hpyHandleTable.length) { - handle = nextHandle++; - } else { - CompilerDirectives.transferToInterpreter(); - handle = resizeHandleTable(); - } - } - - assert 0 <= handle && handle < hpyHandleTable.length; - assert hpyHandleTable[handle] == null; - - hpyHandleTable[handle] = object; - if (useNativeFastPaths) { - mirrorNativeSpacePointerToNative(object, handle); - } - if (LOGGER.isLoggable(Level.FINER)) { - LOGGER.finer(PythonUtils.formatJString("allocating HPy handle %d (object: %s)", handle, object)); - } - return handle; - } - - public Object bitsAsPythonObject(long bits) { - if (GraalHPyBoxing.isBoxedNullHandle(bits)) { - return GraalHPyHandle.NULL_HANDLE_DELEGATE; - } else if (GraalHPyBoxing.isBoxedInt(bits)) { - return GraalHPyBoxing.unboxInt(bits); - } else if (GraalHPyBoxing.isBoxedDouble(bits)) { - return GraalHPyBoxing.unboxDouble(bits); - } - assert GraalHPyBoxing.isBoxedHandle(bits); - return getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(bits)); - } - - public long pythonObjectAsBits(Object object) { - if (GraalHPyBoxing.isBoxablePrimitive(object)) { - if (object instanceof Integer) { - return GraalHPyBoxing.boxInt((Integer) object); - } - assert object instanceof Double; - return GraalHPyBoxing.boxDouble((Double) object); - } else if (object == GraalHPyHandle.NULL_HANDLE_DELEGATE) { - return 0; - } - return getHPyHandleForObject(object); - } - - @GenerateUncached - @GenerateInline(false) - @ImportStatic(PGuards.class) - public abstract static class GetHPyHandleForSingleton extends Node { - public abstract int execute(Object delegateObject); - - @Specialization(guards = "isNoValue(x)") - static int doNoValue(@SuppressWarnings("unused") PNone x) { - return 0; - } - - @Specialization(guards = "!isNoValue(x)") - static int doNone(@SuppressWarnings("unused") PNone x) { - return SINGLETON_HANDLE_NONE; - } - - @Specialization - static int doEllipsis(@SuppressWarnings("unused") PEllipsis x) { - return SINGLETON_HANDLE_ELIPSIS; - } - - @Specialization - static int doNotImplemented(@SuppressWarnings("unused") PNotImplemented x) { - return SINGLETON_HANDLE_NOT_IMPLEMENTED; - } - - @Specialization(guards = "!isSingleton(delegate)") - static int doOthers(@SuppressWarnings("unused") Object delegate) { - return -1; - } - - @Specialization(replaces = {"doNoValue", "doNone", "doEllipsis", "doNotImplemented", "doOthers"}) - static int doGeneric(Object object) { - if (object == PNone.NO_VALUE) { - return 0; - } else if (object == PNone.NONE) { - return SINGLETON_HANDLE_NONE; - } else if (object == PEllipsis.INSTANCE) { - return SINGLETON_HANDLE_ELIPSIS; - } else if (object == PNotImplemented.NOT_IMPLEMENTED) { - return SINGLETON_HANDLE_NOT_IMPLEMENTED; - } - return -1; - } - - static boolean isSingleton(Object object) { - return object == PNone.NONE || object == PEllipsis.INSTANCE || object == PNotImplemented.NOT_IMPLEMENTED; - } - } - - @TruffleBoundary - private void mirrorNativeSpacePointerToNative(Object delegate, int handleID) { - assert useNativeFastPaths; - long l; - if (delegate instanceof PythonObject) { - Object nativeSpace = HPyGetNativeSpacePointerNode.doPythonObject((PythonObject) delegate); - try { - l = nativeSpace instanceof Long ? ((long) nativeSpace) : InteropLibrary.getUncached().asPointer(nativeSpace); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } else { - l = 0; - } - GraalHPyNativeCache.putHandleNativeSpacePointer(nativeSpacePointers, handleID, l); - } - - @TruffleBoundary - private void mirrorGlobalNativeSpacePointerToNative(Object delegate, int globalID) { - assert useNativeFastPaths; - long l; - if (delegate instanceof PythonObject) { - Object nativeSpace = HPyGetNativeSpacePointerNode.doPythonObject((PythonObject) delegate); - try { - l = nativeSpace instanceof Long ? ((long) nativeSpace) : InteropLibrary.getUncached().asPointer(nativeSpace); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } else { - l = 0; - } - GraalHPyNativeCache.putGlobalNativeSpacePointer(nativeSpacePointers, hpyHandleTable.length, globalID, l); - } - - @TruffleBoundary - private void reallocateNativeSpacePointersMirror(int oldHandleTabelSize, int oldGlobalsTableSize) { - assert useNativeFastPaths; - nativeSpacePointers = GraalHPyNativeCache.reallocateNativeCache(nativeSpacePointers, oldHandleTabelSize, hpyHandleTable.length, oldGlobalsTableSize, hpyGlobalsTable.length); - backend.setNativeCache(nativeSpacePointers); - } - - /** - * Allocates a native array (element size is {@link #SIZEOF_LONG} for as many elements as in - * {@link #hpyHandleTable} and writes the native space pointers of all objects in the handle - * table into this array. The pointer of the array is then set to - * {@code ((HPyContext) ctx)->_private} and meant to be used by the {@code ctx_Cast}'s upcall - * stub to avoid an expensive upcall. - */ - @TruffleBoundary - void allocateNativeSpacePointersMirror() { - long arrayPtr = GraalHPyNativeCache.allocateNativeCache(hpyHandleTable.length, hpyGlobalsTable.length); - - // publish pointer value (needed for initialization) - nativeSpacePointers = arrayPtr; - - // write existing values to mirror; start at 1 to omit the NULL handle - for (int i = 1; i < hpyHandleTable.length; i++) { - Object delegate = hpyHandleTable[i]; - if (delegate != null) { - mirrorNativeSpacePointerToNative(delegate, i); - } - } - - // commit pointer value for native usage - backend.setNativeCache(arrayPtr); - } - - public Object getObjectForHPyHandle(int handle) { - // GR-50245 - // assert !GilNode.getUncached().acquire(PythonContext.get(null)) : "Gil not held when - // resolving object from handle"; - assert !GraalHPyBoxing.isBoxedInt(handle) && !GraalHPyBoxing.isBoxedDouble(handle) : "trying to lookup boxed primitive"; - return hpyHandleTable[handle]; - } - - public Object getObjectForHPyGlobal(int handle) { - // GR-50245 - // assert !GilNode.getUncached().acquire(PythonContext.get(null)) : "Gil not held when - // resolving object from global"; - assert !GraalHPyBoxing.isBoxedInt(handle) && !GraalHPyBoxing.isBoxedDouble(handle) : "trying to lookup boxed primitive"; - return hpyGlobalsTable[handle]; - } - - public boolean releaseHPyHandleForObject(int handle) { - // GR-50245 - // assert !GilNode.getUncached().acquire(PythonContext.get(null)) : "Gil not held when - // releasing handle"; - assert handle != 0 : "NULL handle cannot be released"; - assert hpyHandleTable[handle] != null : PythonUtils.formatJString("releasing handle that has already been released: %d", handle); - if (LOGGER.isLoggable(Level.FINER)) { - LOGGER.finer(PythonUtils.formatJString("releasing HPy handle %d (object: %s)", handle, hpyHandleTable[handle])); - } - if (handle < IMMUTABLE_HANDLE_COUNT) { - return false; - } - hpyHandleTable[handle] = null; - freeStack.push(handle); - return true; - } - - /** - * A weak reference to an object that has an associated HPy native space ( - * {@link PythonHPyObject}). - */ - public static final class GraalHPyHandleReference extends WeakReference { - - private final Object nativeSpace; - private final Object destroyFunc; - - boolean cleaned; - private GraalHPyHandleReference next; - - public GraalHPyHandleReference(Object referent, ReferenceQueue q, Object nativeSpace, Object destroyFunc) { - super(referent, q); - this.nativeSpace = nativeSpace; - this.destroyFunc = destroyFunc; - } - - public Object getNativeSpace() { - return nativeSpace; - } - - public Object getDestroyFunc() { - return destroyFunc; - } - - public GraalHPyHandleReference getNext() { - return next; - } - - public void setNext(GraalHPyHandleReference next) { - this.next = next; - } - } - - /** - * Registers an HPy native space of a Python object.
      - * Use this method to register a native memory that is associated with a Python object in order - * to ensure that the native memory will be free'd when the owning Python object dies.
      - * This works by creating a weak reference to the Python object, using a thread that - * concurrently polls the reference queue. If threading is allowed, cleaning will be done fully - * concurrent on a cleaner thread. If not, an async action will be scheduled to free the native - * memory. Hence, the destroy function could also be executed on the cleaner thread. - * - * @param pythonObject The Python object that has associated native memory. - * @param dataPtr The pointer object of the native memory. - * @param destroyFunc The destroy function to call when the Python object is unreachable (may be - * {@code null}; in this case, bare {@code free} will be used). - */ - @TruffleBoundary - public void createHandleReference(Object pythonObject, Object dataPtr, Object destroyFunc) { - GraalHPyHandleReference newHead = new GraalHPyHandleReference(pythonObject, ensureReferenceQueue(), dataPtr, destroyFunc); - references.getAndAccumulate(newHead, (prev, x) -> { - x.next = prev; - return x; - }); - } - - private ReferenceQueue ensureReferenceQueue() { - if (nativeSpaceReferenceQueue == null) { - ReferenceQueue referenceQueue = createReferenceQueue(); - nativeSpaceReferenceQueue = referenceQueue; - return referenceQueue; - } - return nativeSpaceReferenceQueue; - } - - @TruffleBoundary - private ReferenceQueue createReferenceQueue() { - final ReferenceQueue referenceQueue = new ReferenceQueue<>(); - - // lazily register the runnable that concurrently collects the queued references - Env env = getContext().getEnv(); - if (env.isCreateThreadAllowed()) { - TruffleThreadBuilder truffleThreadBuilder = env.newTruffleThreadBuilder(new GraalHPyReferenceCleanerRunnable(referenceQueue)).threadGroup(getContext().getThreadGroup()); - Thread thread = truffleThreadBuilder.build(); - // Make the cleaner thread a daemon; it should not prevent JVM shutdown. - thread.setDaemon(true); - thread.start(); - hpyReferenceCleanerThread = thread; - } else { - getContext().registerAsyncAction(() -> { - Reference reference = null; - if (PythonOptions.AUTOMATIC_ASYNC_ACTIONS) { - try { - reference = referenceQueue.remove(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - } else { - referenceQueue.poll(); - } - - ArrayList refs = new ArrayList<>(); - do { - if (reference instanceof GraalHPyHandleReference) { - refs.add((GraalHPyHandleReference) reference); - } - // consume all - reference = referenceQueue.poll(); - } while (reference != null); - - if (!refs.isEmpty()) { - return new GraalHPyHandleReferenceCleanerAction(refs.toArray(new GraalHPyHandleReference[0])); - } - - return null; - }); - } - return referenceQueue; - } - - public int getCTypeSize(HPyContextSignatureType ctype) { - return backend.getCTypeSize(ctype); - } - - public int getCFieldOffset(GraalHPyCField ctype) { - return backend.getCFieldOffset(ctype); - } - - public Object nativeToInteropPointer(Object object) { - return backend.nativeToInteropPointer(object); - } - - public Object getNativeNull() { - return backend.getNativeNull(); - } - - /** - * Join the reference cleaner thread. - */ - public void finalizeContext() { - Thread thread = this.hpyReferenceCleanerThread; - if (thread != null) { - if (thread.isAlive() && !thread.isInterrupted()) { - thread.interrupt(); - } - try { - thread.join(); - } catch (InterruptedException e) { - // ignore - } - } - backend.finalizeNativeContext(); - if (nativeArgumentsStack != 0) { - UNSAFE.freeMemory(nativeArgumentsStack); - nativeArgumentsStack = 0; - } - if (scheduler != null) { - scheduler.shutdown(); - } - } - - private void startUpcallsDaemon(long interval) { - scheduler.scheduleAtFixedRate(() -> { - HPyUpcall[] upcalls = backend.getUpcalls(); - int[] counts = backend.getUpcallCounts(); - StringBuilder sb = new StringBuilder(); - sb.append("========= HPy context upcall counts (").append(backend.getName()).append(')'); - for (int i = 0; i < counts.length; i++) { - if (counts[i] != 0) { - sb.append(String.format(" %40s[%3d]: %d\n", upcalls[i].getName(), i, counts[i])); - } - } - System.out.print(sb); - System.out.flush(); - }, interval, interval, TimeUnit.MILLISECONDS); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyContextFunctions.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyContextFunctions.java deleted file mode 100644 index 038394f06e..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyContextFunctions.java +++ /dev/null @@ -1,3722 +0,0 @@ -/* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.RuntimeWarning; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPyType_BUILTIN_SHAPE_FLOAT; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPyType_BUILTIN_SHAPE_LEGACY; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPyType_BUILTIN_SHAPE_LIST; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPyType_BUILTIN_SHAPE_LONG; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPyType_BUILTIN_SHAPE_OBJECT; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPyType_BUILTIN_SHAPE_TUPLE; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPyType_BUILTIN_SHAPE_TYPE; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPyType_BUILTIN_SHAPE_UNICODE; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyHandle.NULL_HANDLE; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyHandle.NULL_HANDLE_DELEGATE; -import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; -import static com.oracle.graal.python.nodes.StringLiterals.T_STRICT; -import static com.oracle.graal.python.nodes.StringLiterals.T_UTF8; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; -import static com.oracle.graal.python.util.PythonUtils.tsLiteral; - -import java.io.PrintWriter; -import java.lang.annotation.Repeatable; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.math.BigInteger; -import java.nio.ByteBuffer; -import java.nio.charset.CharacterCodingException; -import java.nio.charset.Charset; -import java.nio.charset.CodingErrorAction; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.logging.Level; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.modules.CodecsModuleBuiltins; -import com.oracle.graal.python.builtins.modules.SysModuleBuiltins.GetFileSystemEncodingNode; -import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins.WarnNode; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.bytes.PBytes; -import com.oracle.graal.python.builtins.objects.capsule.PyCapsule; -import com.oracle.graal.python.builtins.objects.capsule.PyCapsuleNameMatchesNode; -import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.FromCharPointerNode; -import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.FromCharPointerNodeGen; -import com.oracle.graal.python.builtins.objects.cext.capi.PySequenceArrayWrapper; -import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.NativeToPythonNode; -import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNewRefNode; -import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CByteArrayWrapper; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.AsNativePrimitiveNode; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.ClearCurrentExceptionNode; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.EncodeNativeStringNode; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.ReadUnicodeArrayNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyArithmeticNode.HPyBinaryArithmeticNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyArithmeticNode.HPyInplaceArithmeticNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyArithmeticNode.HPyTernaryArithmeticNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyArithmeticNode.HPyUnaryArithmeticNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyASCIINodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyAbsoluteNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyAddNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyAndNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyAsIndexNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyAsPyObjectNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyBoolFromBoolNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyBuilderCancelNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyBuilderNewNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyBuilderSetNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyBytesAsStringNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyBytesCheckNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyBytesFromStringAndSizeNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyBytesFromStringNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyBytesGetSizeNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyBytesNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyCallMethodNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyCallNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyCallTupleDictNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyCapsuleGetNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyCapsuleIsValidNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyCapsuleNewNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyCapsuleSetNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyCastNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyCloseNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyCompileNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyContainsNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyContextVarGetNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyContextVarNewNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyContextVarSetNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyDelItemNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyDelItemSNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyDictCheckNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyDictCopyNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyDictKeysNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyDictNewNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyDivmodNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyDumpNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyDupNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyErrClearNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyErrExceptionMatchesNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyErrNoMemoryNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyErrOccurredNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyErrSetFromErrnoWithFilenameNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyErrSetFromErrnoWithFilenameObjectsNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyErrSetObjectNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyErrSetStringNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyErrWarnExNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyErrWriteUnraisableNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyEvalCodeNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyFatalErrorNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyFieldLoadNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyFieldStoreNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyFloatAsDoubleNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyFloatFromDoubleNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyFloatNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyFloorDivideNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyFromPyObjectNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyGetAttrNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyGetAttrSNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyGetItemNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyGetItemSNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyGlobalLoadNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyGlobalStoreNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyHasAttrNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyHasAttrSNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyHashNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyImportModuleNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyInPlaceAddNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyInPlaceAndNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyInPlaceFloorDivideNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyInPlaceLshiftNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyInPlaceMatrixMultiplyNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyInPlaceMultiplyNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyInPlaceOrNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyInPlacePowerNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyInPlaceRemainderNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyInPlaceRshiftNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyInPlaceSubtractNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyInPlaceTrueDivideNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyInPlaceXorNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyInvertNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyIsCallableNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyIsNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyIsNumberNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyIsTrueNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyLeavePythonExecutionNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyLengthNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyListAppendNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyListBuilderBuildNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyListCheckNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyListNewNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyLongAsDoubleNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyLongAsInt32NodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyLongAsInt64NodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyLongAsSsizeTNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyLongAsUInt32MaskNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyLongAsUInt32NodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyLongAsUInt64MaskNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyLongAsUInt64NodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyLongFromInt32NodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyLongFromInt64NodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyLongFromUInt32NodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyLongFromUInt64NodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyLongNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyLshiftNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyMatrixMultiplyNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyMultiplyNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyNegativeNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyNewExceptionNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyNewExceptionWithDocNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyNewNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyOrNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyPositiveNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyPowerNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyReenterPythonExecutionNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyRemainderNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyReprNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyRichcompareBoolNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyRichcompareNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyRshiftNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPySetAttrNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPySetAttrSNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPySetCallFunctionNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPySetItemNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPySetItemSNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPySliceUnpackNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyStrNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPySubtractNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyTrackerAddNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyTrackerCleanupNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyTrackerForgetAllNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyTrackerNewNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyTrueDivideNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyTupleBuilderBuildNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyTupleCheckNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyTupleFromArrayNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyTypeCheckNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyTypeFromSpecNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyTypeGenericNewNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyTypeGetBuiltinShapeNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyTypeGetNameNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyTypeIsSubtypeNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyTypeNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyUnicodeAsASCIIStringNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyUnicodeAsLatin1StringNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyUnicodeAsUTF8AndSizeNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyUnicodeAsUTF8StringNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyUnicodeCheckNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyUnicodeDecodeASCIINodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyUnicodeDecodeCharsetAndSizeNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyUnicodeDecodeCharsetNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyUnicodeDecodeLatin1NodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyUnicodeEncodeFSDefaultNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyUnicodeFromEncodedObjectNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyUnicodeFromStringNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyUnicodeFromWcharNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyUnicodeReadCharNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyUnicodeSubstringNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctionsFactory.GraalHPyXorNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyAsHandleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyAsPythonObjectNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyCallHelperFunctionNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyCloseAndGetHandleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyCloseHandleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyCreateTypeFromSpecNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyEnsureHandleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyFieldLoadNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyFromCharPointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyGetNativeSpacePointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyLongFromLong; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyPackKeywordArgsNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyReadCallFunctionNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyTypeGetNameNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.RecursiveExceptionMatches; -import com.oracle.graal.python.builtins.objects.cext.structs.CStructs; -import com.oracle.graal.python.builtins.objects.code.CodeNodes; -import com.oracle.graal.python.builtins.objects.code.PCode; -import com.oracle.graal.python.builtins.objects.common.DynamicObjectStorage; -import com.oracle.graal.python.builtins.objects.common.HashingStorage; -import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageCopy; -import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetItem; -import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageLen; -import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItem; -import com.oracle.graal.python.builtins.objects.common.SequenceNodes; -import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; -import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.NoGeneralizationNode; -import com.oracle.graal.python.builtins.objects.contextvars.PContextVar; -import com.oracle.graal.python.builtins.objects.dict.PDict; -import com.oracle.graal.python.builtins.objects.exception.GetEscapedExceptionNode; -import com.oracle.graal.python.builtins.objects.exception.GetUnreifiedExceptionNode; -import com.oracle.graal.python.builtins.objects.function.PArguments; -import com.oracle.graal.python.builtins.objects.function.PKeyword; -import com.oracle.graal.python.builtins.objects.ints.PInt; -import com.oracle.graal.python.builtins.objects.list.PList; -import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.graal.python.builtins.objects.slice.PSlice; -import com.oracle.graal.python.builtins.objects.slice.PSlice.SliceInfo; -import com.oracle.graal.python.builtins.objects.slice.PSlice.SliceInfoLong; -import com.oracle.graal.python.builtins.objects.slice.SliceNodes; -import com.oracle.graal.python.builtins.objects.str.StringBuiltins.StrGetItemNodeWithSlice; -import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.type.PythonClass; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode; -import com.oracle.graal.python.lib.CanBeDoubleNode; -import com.oracle.graal.python.lib.PyCallableCheckNode; -import com.oracle.graal.python.lib.PyDictKeys; -import com.oracle.graal.python.lib.PyExceptionInstanceCheckNode; -import com.oracle.graal.python.lib.PyFloatAsDoubleNode; -import com.oracle.graal.python.lib.PyIndexCheckNode; -import com.oracle.graal.python.lib.PyLongAsDoubleNode; -import com.oracle.graal.python.lib.PyNumberIndexNode; -import com.oracle.graal.python.lib.PyObjectDelItem; -import com.oracle.graal.python.lib.PyObjectGetAttr; -import com.oracle.graal.python.lib.PyObjectGetAttrO; -import com.oracle.graal.python.lib.PyObjectGetItem; -import com.oracle.graal.python.lib.PyObjectGetMethod; -import com.oracle.graal.python.lib.PyObjectIsTrueNode; -import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode; -import com.oracle.graal.python.lib.PyObjectSetAttr; -import com.oracle.graal.python.lib.PyObjectSetAttrO; -import com.oracle.graal.python.lib.PyObjectSetItem; -import com.oracle.graal.python.lib.PySequenceContainsNode; -import com.oracle.graal.python.lib.PyTupleSizeNode; -import com.oracle.graal.python.lib.PyUnicodeFromEncodedObject; -import com.oracle.graal.python.lib.PyUnicodeReadCharNode; -import com.oracle.graal.python.nodes.BuiltinNames; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PGuards; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.SpecialAttributeNames; -import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.nodes.WriteUnraisableNode; -import com.oracle.graal.python.nodes.argument.keywords.ExpandKeywordStarargsNode; -import com.oracle.graal.python.nodes.argument.positional.ExecutePositionalStarargsNode; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; -import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; -import com.oracle.graal.python.nodes.builtins.ListNodes; -import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.call.GenericInvokeNode; -import com.oracle.graal.python.nodes.call.special.CallTernaryMethodNode; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodNode; -import com.oracle.graal.python.nodes.classes.IsSubtypeNode; -import com.oracle.graal.python.nodes.expression.BinaryArithmetic; -import com.oracle.graal.python.nodes.expression.InplaceArithmetic; -import com.oracle.graal.python.nodes.expression.TernaryArithmetic; -import com.oracle.graal.python.nodes.expression.UnaryArithmetic; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; -import com.oracle.graal.python.nodes.object.IsNode; -import com.oracle.graal.python.nodes.statement.AbstractImportNode; -import com.oracle.graal.python.nodes.util.CannotCastException; -import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; -import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.GilNode; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode; -import com.oracle.graal.python.runtime.PythonContext.PythonThreadState; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.runtime.sequence.PSequence; -import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage; -import com.oracle.graal.python.util.CharsetMapping; -import com.oracle.graal.python.util.OverflowException; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.RootCallTarget; -import com.oracle.truffle.api.TruffleLogger; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.GenerateCached; -import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.exception.AbstractTruffleException; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.library.CachedLibrary; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedBranchProfile; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; -import com.oracle.truffle.api.profiles.InlinedExactClassProfile; -import com.oracle.truffle.api.strings.InternalByteArray; -import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.api.strings.TruffleString.Encoding; - -@SuppressWarnings("truffle-inlining") -public abstract class GraalHPyContextFunctions { - - @Retention(RetentionPolicy.RUNTIME) - public @interface HPyContextFunctions { - HPyContextFunction[] value(); - } - - /** - * Context function implementations are marked with this annotation. It is used to annotate a - * node with the name of the implemented context function. This information is further consumed - * to automatically generate the appropriate upcall path. - */ - @Retention(RetentionPolicy.RUNTIME) - @Repeatable(value = HPyContextFunctions.class) - public @interface HPyContextFunction { - - /** - * Name of this builtin - the name can be omitted, which will use the name of the class that - * this annotation is applied to. - */ - String value() default ""; - } - - public abstract static class GraalHPyContextFunction extends Node { - - public abstract Object execute(Object[] arguments); - - // {{start ctx func factory}} - // @formatter:off - // Checkstyle: stop - // DO NOT EDIT THIS PART! - // This part is automatically generated by hpy.tools.autogen.graalpy.autogen_ctx_function_factory - @NeverDefault - public static GraalHPyContextFunction create(HPyContextMember member) { - return switch (member) { - case CTX_DUP -> GraalHPyDupNodeGen.create(); - case CTX_CLOSE -> GraalHPyCloseNodeGen.create(); - case CTX_POSITIVE -> GraalHPyPositiveNodeGen.create(); - case CTX_NEGATIVE -> GraalHPyNegativeNodeGen.create(); - case CTX_INVERT -> GraalHPyInvertNodeGen.create(); - case CTX_ADD -> GraalHPyAddNodeGen.create(); - case CTX_SUBTRACT -> GraalHPySubtractNodeGen.create(); - case CTX_MULTIPLY -> GraalHPyMultiplyNodeGen.create(); - case CTX_MATRIXMULTIPLY -> GraalHPyMatrixMultiplyNodeGen.create(); - case CTX_FLOORDIVIDE -> GraalHPyFloorDivideNodeGen.create(); - case CTX_TRUEDIVIDE -> GraalHPyTrueDivideNodeGen.create(); - case CTX_REMAINDER -> GraalHPyRemainderNodeGen.create(); - case CTX_DIVMOD -> GraalHPyDivmodNodeGen.create(); - case CTX_AND -> GraalHPyAndNodeGen.create(); - case CTX_XOR -> GraalHPyXorNodeGen.create(); - case CTX_OR -> GraalHPyOrNodeGen.create(); - case CTX_LSHIFT -> GraalHPyLshiftNodeGen.create(); - case CTX_RSHIFT -> GraalHPyRshiftNodeGen.create(); - case CTX_POWER -> GraalHPyPowerNodeGen.create(); - case CTX_INPLACEADD -> GraalHPyInPlaceAddNodeGen.create(); - case CTX_INPLACESUBTRACT -> GraalHPyInPlaceSubtractNodeGen.create(); - case CTX_INPLACEMULTIPLY -> GraalHPyInPlaceMultiplyNodeGen.create(); - case CTX_INPLACEMATRIXMULTIPLY -> GraalHPyInPlaceMatrixMultiplyNodeGen.create(); - case CTX_INPLACEFLOORDIVIDE -> GraalHPyInPlaceFloorDivideNodeGen.create(); - case CTX_INPLACETRUEDIVIDE -> GraalHPyInPlaceTrueDivideNodeGen.create(); - case CTX_INPLACEREMAINDER -> GraalHPyInPlaceRemainderNodeGen.create(); - case CTX_INPLACEPOWER -> GraalHPyInPlacePowerNodeGen.create(); - case CTX_INPLACELSHIFT -> GraalHPyInPlaceLshiftNodeGen.create(); - case CTX_INPLACERSHIFT -> GraalHPyInPlaceRshiftNodeGen.create(); - case CTX_INPLACEAND -> GraalHPyInPlaceAndNodeGen.create(); - case CTX_INPLACEXOR -> GraalHPyInPlaceXorNodeGen.create(); - case CTX_INPLACEOR -> GraalHPyInPlaceOrNodeGen.create(); - case CTX_BOOL_FROMBOOL -> GraalHPyBoolFromBoolNodeGen.create(); - case CTX_LONG_FROMINT32_T -> GraalHPyLongFromInt32NodeGen.create(); - case CTX_LONG_FROMUINT32_T -> GraalHPyLongFromUInt32NodeGen.create(); - case CTX_LONG_FROMINT64_T, CTX_LONG_FROMSSIZE_T -> GraalHPyLongFromInt64NodeGen.create(); - case CTX_LONG_FROMUINT64_T, CTX_LONG_FROMSIZE_T -> GraalHPyLongFromUInt64NodeGen.create(); - case CTX_LONG_ASINT32_T -> GraalHPyLongAsInt32NodeGen.create(); - case CTX_LONG_ASUINT32_T -> GraalHPyLongAsUInt32NodeGen.create(); - case CTX_LONG_ASUINT32_TMASK -> GraalHPyLongAsUInt32MaskNodeGen.create(); - case CTX_LONG_ASINT64_T -> GraalHPyLongAsInt64NodeGen.create(); - case CTX_LONG_ASUINT64_T, CTX_LONG_ASSIZE_T, CTX_LONG_ASVOIDPTR -> GraalHPyLongAsUInt64NodeGen.create(); - case CTX_LONG_ASUINT64_TMASK -> GraalHPyLongAsUInt64MaskNodeGen.create(); - case CTX_LONG_ASSSIZE_T -> GraalHPyLongAsSsizeTNodeGen.create(); - case CTX_LONG_ASDOUBLE -> GraalHPyLongAsDoubleNodeGen.create(); - case CTX_DICT_NEW -> GraalHPyDictNewNodeGen.create(); - case CTX_LIST_NEW -> GraalHPyListNewNodeGen.create(); - case CTX_LIST_APPEND -> GraalHPyListAppendNodeGen.create(); - case CTX_FLOAT_FROMDOUBLE -> GraalHPyFloatFromDoubleNodeGen.create(); - case CTX_FLOAT_ASDOUBLE -> GraalHPyFloatAsDoubleNodeGen.create(); - case CTX_DICT_CHECK -> GraalHPyDictCheckNodeGen.create(); - case CTX_BYTES_CHECK -> GraalHPyBytesCheckNodeGen.create(); - case CTX_UNICODE_CHECK -> GraalHPyUnicodeCheckNodeGen.create(); - case CTX_TUPLE_CHECK -> GraalHPyTupleCheckNodeGen.create(); - case CTX_LIST_CHECK -> GraalHPyListCheckNodeGen.create(); - case CTX_ERR_NOMEMORY -> GraalHPyErrNoMemoryNodeGen.create(); - case CTX_ERR_SETOBJECT -> GraalHPyErrSetObjectNodeGen.create(); - case CTX_ERR_SETSTRING -> GraalHPyErrSetStringNodeGen.create(); - case CTX_ERR_SETFROMERRNOWITHFILENAME -> GraalHPyErrSetFromErrnoWithFilenameNodeGen.create(); - case CTX_ERR_SETFROMERRNOWITHFILENAMEOBJECTS -> GraalHPyErrSetFromErrnoWithFilenameObjectsNodeGen.create(); - case CTX_FATALERROR -> GraalHPyFatalErrorNodeGen.create(); - case CTX_ERR_OCCURRED -> GraalHPyErrOccurredNodeGen.create(); - case CTX_ERR_EXCEPTIONMATCHES -> GraalHPyErrExceptionMatchesNodeGen.create(); - case CTX_ERR_CLEAR -> GraalHPyErrClearNodeGen.create(); - case CTX_ERR_WARNEX -> GraalHPyErrWarnExNodeGen.create(); - case CTX_ERR_WRITEUNRAISABLE -> GraalHPyErrWriteUnraisableNodeGen.create(); - case CTX_UNICODE_ASUTF8STRING -> GraalHPyUnicodeAsUTF8StringNodeGen.create(); - case CTX_UNICODE_ASLATIN1STRING -> GraalHPyUnicodeAsLatin1StringNodeGen.create(); - case CTX_UNICODE_ASASCIISTRING -> GraalHPyUnicodeAsASCIIStringNodeGen.create(); - case CTX_UNICODE_ENCODEFSDEFAULT -> GraalHPyUnicodeEncodeFSDefaultNodeGen.create(); - case CTX_UNICODE_ASUTF8ANDSIZE -> GraalHPyUnicodeAsUTF8AndSizeNodeGen.create(); - case CTX_UNICODE_FROMSTRING -> GraalHPyUnicodeFromStringNodeGen.create(); - case CTX_UNICODE_FROMWIDECHAR -> GraalHPyUnicodeFromWcharNodeGen.create(); - case CTX_UNICODE_DECODEFSDEFAULT -> GraalHPyUnicodeDecodeCharsetNodeGen.create(); - case CTX_UNICODE_DECODEFSDEFAULTANDSIZE -> GraalHPyUnicodeDecodeCharsetAndSizeNodeGen.create(); - case CTX_UNICODE_DECODEASCII -> GraalHPyUnicodeDecodeASCIINodeGen.create(); - case CTX_UNICODE_DECODELATIN1 -> GraalHPyUnicodeDecodeLatin1NodeGen.create(); - case CTX_UNICODE_READCHAR -> GraalHPyUnicodeReadCharNodeGen.create(); - case CTX_ASPYOBJECT -> GraalHPyAsPyObjectNodeGen.create(); - case CTX_BYTES_ASSTRING, CTX_BYTES_AS_STRING -> GraalHPyBytesAsStringNodeGen.create(); - case CTX_BYTES_SIZE, CTX_BYTES_GET_SIZE -> GraalHPyBytesGetSizeNodeGen.create(); - case CTX_BYTES_FROMSTRING -> GraalHPyBytesFromStringNodeGen.create(); - case CTX_BYTES_FROMSTRINGANDSIZE -> GraalHPyBytesFromStringAndSizeNodeGen.create(); - case CTX_ISTRUE -> GraalHPyIsTrueNodeGen.create(); - case CTX_GETATTR -> GraalHPyGetAttrNodeGen.create(); - case CTX_GETATTR_S -> GraalHPyGetAttrSNodeGen.create(); - case CTX_TYPE_FROMSPEC -> GraalHPyTypeFromSpecNodeGen.create(); - case CTX_HASATTR -> GraalHPyHasAttrNodeGen.create(); - case CTX_HASATTR_S -> GraalHPyHasAttrSNodeGen.create(); - case CTX_SETATTR -> GraalHPySetAttrNodeGen.create(); - case CTX_SETATTR_S -> GraalHPySetAttrSNodeGen.create(); - case CTX_GETITEM, CTX_GETITEM_I -> GraalHPyGetItemNodeGen.create(); - case CTX_GETITEM_S -> GraalHPyGetItemSNodeGen.create(); - case CTX_SETITEM, CTX_SETITEM_I -> GraalHPySetItemNodeGen.create(); - case CTX_SETITEM_S -> GraalHPySetItemSNodeGen.create(); - case CTX_DELITEM, CTX_DELITEM_I -> GraalHPyDelItemNodeGen.create(); - case CTX_DELITEM_S -> GraalHPyDelItemSNodeGen.create(); - case CTX_FROMPYOBJECT -> GraalHPyFromPyObjectNodeGen.create(); - case CTX_NEW -> GraalHPyNewNodeGen.create(); - case CTX_ASSTRUCT_OBJECT, CTX_ASSTRUCT_LEGACY, CTX_ASSTRUCT_TYPE, CTX_ASSTRUCT_LONG, CTX_ASSTRUCT_FLOAT, CTX_ASSTRUCT_UNICODE, CTX_ASSTRUCT_TUPLE, CTX_ASSTRUCT_LIST -> GraalHPyCastNodeGen.create(); - case CTX_TYPE_GENERICNEW -> GraalHPyTypeGenericNewNodeGen.create(); - case CTX_ABSOLUTE -> GraalHPyAbsoluteNodeGen.create(); - case CTX_LONG -> GraalHPyLongNodeGen.create(); - case CTX_FLOAT -> GraalHPyFloatNodeGen.create(); - case CTX_STR -> GraalHPyStrNodeGen.create(); - case CTX_REPR -> GraalHPyReprNodeGen.create(); - case CTX_ASCII -> GraalHPyASCIINodeGen.create(); - case CTX_BYTES -> GraalHPyBytesNodeGen.create(); - case CTX_HASH -> GraalHPyHashNodeGen.create(); - case CTX_LENGTH -> GraalHPyLengthNodeGen.create(); - case CTX_RICHCOMPARE -> GraalHPyRichcompareNodeGen.create(); - case CTX_RICHCOMPAREBOOL -> GraalHPyRichcompareBoolNodeGen.create(); - case CTX_INDEX -> GraalHPyAsIndexNodeGen.create(); - case CTX_NUMBER_CHECK -> GraalHPyIsNumberNodeGen.create(); - case CTX_TUPLE_FROMARRAY -> GraalHPyTupleFromArrayNodeGen.create(); - case CTX_TUPLEBUILDER_NEW, CTX_LISTBUILDER_NEW -> GraalHPyBuilderNewNodeGen.create(); - case CTX_TUPLEBUILDER_SET, CTX_LISTBUILDER_SET -> GraalHPyBuilderSetNodeGen.create(); - case CTX_TUPLEBUILDER_BUILD -> GraalHPyTupleBuilderBuildNodeGen.create(); - case CTX_LISTBUILDER_BUILD -> GraalHPyListBuilderBuildNodeGen.create(); - case CTX_TUPLEBUILDER_CANCEL, CTX_LISTBUILDER_CANCEL -> GraalHPyBuilderCancelNodeGen.create(); - case CTX_TRACKER_NEW -> GraalHPyTrackerNewNodeGen.create(); - case CTX_TRACKER_ADD -> GraalHPyTrackerAddNodeGen.create(); - case CTX_TRACKER_CLOSE -> GraalHPyTrackerCleanupNodeGen.create(); - case CTX_TRACKER_FORGETALL -> GraalHPyTrackerForgetAllNodeGen.create(); - case CTX_CALLABLE_CHECK -> GraalHPyIsCallableNodeGen.create(); - case CTX_CALLTUPLEDICT -> GraalHPyCallTupleDictNodeGen.create(); - case CTX_CALL -> GraalHPyCallNodeGen.create(); - case CTX_CALLMETHOD -> GraalHPyCallMethodNodeGen.create(); - case CTX_DUMP -> GraalHPyDumpNodeGen.create(); - case CTX_TYPE -> GraalHPyTypeNodeGen.create(); - case CTX_TYPECHECK -> GraalHPyTypeCheckNodeGen.create(); - case CTX_ERR_NEWEXCEPTIONWITHDOC -> GraalHPyNewExceptionWithDocNodeGen.create(); - case CTX_ERR_NEWEXCEPTION -> GraalHPyNewExceptionNodeGen.create(); - case CTX_IS -> GraalHPyIsNodeGen.create(); - case CTX_IMPORT_IMPORTMODULE -> GraalHPyImportModuleNodeGen.create(); - case CTX_FIELD_STORE -> GraalHPyFieldStoreNodeGen.create(); - case CTX_FIELD_LOAD -> GraalHPyFieldLoadNodeGen.create(); - case CTX_GLOBAL_STORE -> GraalHPyGlobalStoreNodeGen.create(); - case CTX_GLOBAL_LOAD -> GraalHPyGlobalLoadNodeGen.create(); - case CTX_LEAVEPYTHONEXECUTION -> GraalHPyLeavePythonExecutionNodeGen.create(); - case CTX_REENTERPYTHONEXECUTION -> GraalHPyReenterPythonExecutionNodeGen.create(); - case CTX_CONTAINS -> GraalHPyContainsNodeGen.create(); - case CTX_TYPE_ISSUBTYPE -> GraalHPyTypeIsSubtypeNodeGen.create(); - case CTX_TYPE_GETNAME -> GraalHPyTypeGetNameNodeGen.create(); - case CTX_DICT_KEYS -> GraalHPyDictKeysNodeGen.create(); - case CTX_DICT_COPY -> GraalHPyDictCopyNodeGen.create(); - case CTX_CAPSULE_NEW -> GraalHPyCapsuleNewNodeGen.create(); - case CTX_CAPSULE_GET -> GraalHPyCapsuleGetNodeGen.create(); - case CTX_CAPSULE_SET -> GraalHPyCapsuleSetNodeGen.create(); - case CTX_CAPSULE_ISVALID -> GraalHPyCapsuleIsValidNodeGen.create(); - case CTX_CONTEXTVAR_NEW -> GraalHPyContextVarNewNodeGen.create(); - case CTX_CONTEXTVAR_GET -> GraalHPyContextVarGetNodeGen.create(); - case CTX_CONTEXTVAR_SET -> GraalHPyContextVarSetNodeGen.create(); - case CTX_UNICODE_FROMENCODEDOBJECT -> GraalHPyUnicodeFromEncodedObjectNodeGen.create(); - case CTX_UNICODE_SUBSTRING -> GraalHPyUnicodeSubstringNodeGen.create(); - case CTX_SLICE_UNPACK -> GraalHPySliceUnpackNodeGen.create(); - case CTX_TYPE_GETBUILTINSHAPE -> GraalHPyTypeGetBuiltinShapeNodeGen.create(); - case CTX_COMPILE_S -> GraalHPyCompileNodeGen.create(); - case CTX_EVALCODE -> GraalHPyEvalCodeNodeGen.create(); - case CTX_SETCALLFUNCTION -> GraalHPySetCallFunctionNodeGen.create(); - default -> throw CompilerDirectives.shouldNotReachHere(); - }; - } - - public static GraalHPyContextFunction getUncached(HPyContextMember member) { - return switch (member) { - case CTX_DUP -> GraalHPyDupNodeGen.getUncached(); - case CTX_CLOSE -> GraalHPyCloseNodeGen.getUncached(); - case CTX_POSITIVE -> GraalHPyPositiveNodeGen.getUncached(); - case CTX_NEGATIVE -> GraalHPyNegativeNodeGen.getUncached(); - case CTX_INVERT -> GraalHPyInvertNodeGen.getUncached(); - case CTX_ADD -> GraalHPyAddNodeGen.getUncached(); - case CTX_SUBTRACT -> GraalHPySubtractNodeGen.getUncached(); - case CTX_MULTIPLY -> GraalHPyMultiplyNodeGen.getUncached(); - case CTX_MATRIXMULTIPLY -> GraalHPyMatrixMultiplyNodeGen.getUncached(); - case CTX_FLOORDIVIDE -> GraalHPyFloorDivideNodeGen.getUncached(); - case CTX_TRUEDIVIDE -> GraalHPyTrueDivideNodeGen.getUncached(); - case CTX_REMAINDER -> GraalHPyRemainderNodeGen.getUncached(); - case CTX_DIVMOD -> GraalHPyDivmodNodeGen.getUncached(); - case CTX_AND -> GraalHPyAndNodeGen.getUncached(); - case CTX_XOR -> GraalHPyXorNodeGen.getUncached(); - case CTX_OR -> GraalHPyOrNodeGen.getUncached(); - case CTX_LSHIFT -> GraalHPyLshiftNodeGen.getUncached(); - case CTX_RSHIFT -> GraalHPyRshiftNodeGen.getUncached(); - case CTX_POWER -> GraalHPyPowerNodeGen.getUncached(); - case CTX_INPLACEADD -> GraalHPyInPlaceAddNodeGen.getUncached(); - case CTX_INPLACESUBTRACT -> GraalHPyInPlaceSubtractNodeGen.getUncached(); - case CTX_INPLACEMULTIPLY -> GraalHPyInPlaceMultiplyNodeGen.getUncached(); - case CTX_INPLACEMATRIXMULTIPLY -> GraalHPyInPlaceMatrixMultiplyNodeGen.getUncached(); - case CTX_INPLACEFLOORDIVIDE -> GraalHPyInPlaceFloorDivideNodeGen.getUncached(); - case CTX_INPLACETRUEDIVIDE -> GraalHPyInPlaceTrueDivideNodeGen.getUncached(); - case CTX_INPLACEREMAINDER -> GraalHPyInPlaceRemainderNodeGen.getUncached(); - case CTX_INPLACEPOWER -> GraalHPyInPlacePowerNodeGen.getUncached(); - case CTX_INPLACELSHIFT -> GraalHPyInPlaceLshiftNodeGen.getUncached(); - case CTX_INPLACERSHIFT -> GraalHPyInPlaceRshiftNodeGen.getUncached(); - case CTX_INPLACEAND -> GraalHPyInPlaceAndNodeGen.getUncached(); - case CTX_INPLACEXOR -> GraalHPyInPlaceXorNodeGen.getUncached(); - case CTX_INPLACEOR -> GraalHPyInPlaceOrNodeGen.getUncached(); - case CTX_BOOL_FROMBOOL -> GraalHPyBoolFromBoolNodeGen.getUncached(); - case CTX_LONG_FROMINT32_T -> GraalHPyLongFromInt32NodeGen.getUncached(); - case CTX_LONG_FROMUINT32_T -> GraalHPyLongFromUInt32NodeGen.getUncached(); - case CTX_LONG_FROMINT64_T, CTX_LONG_FROMSSIZE_T -> GraalHPyLongFromInt64NodeGen.getUncached(); - case CTX_LONG_FROMUINT64_T, CTX_LONG_FROMSIZE_T -> GraalHPyLongFromUInt64NodeGen.getUncached(); - case CTX_LONG_ASINT32_T -> GraalHPyLongAsInt32NodeGen.getUncached(); - case CTX_LONG_ASUINT32_T -> GraalHPyLongAsUInt32NodeGen.getUncached(); - case CTX_LONG_ASUINT32_TMASK -> GraalHPyLongAsUInt32MaskNodeGen.getUncached(); - case CTX_LONG_ASINT64_T -> GraalHPyLongAsInt64NodeGen.getUncached(); - case CTX_LONG_ASUINT64_T, CTX_LONG_ASSIZE_T, CTX_LONG_ASVOIDPTR -> GraalHPyLongAsUInt64NodeGen.getUncached(); - case CTX_LONG_ASUINT64_TMASK -> GraalHPyLongAsUInt64MaskNodeGen.getUncached(); - case CTX_LONG_ASSSIZE_T -> GraalHPyLongAsSsizeTNodeGen.getUncached(); - case CTX_LONG_ASDOUBLE -> GraalHPyLongAsDoubleNodeGen.getUncached(); - case CTX_DICT_NEW -> GraalHPyDictNewNodeGen.getUncached(); - case CTX_LIST_NEW -> GraalHPyListNewNodeGen.getUncached(); - case CTX_LIST_APPEND -> GraalHPyListAppendNodeGen.getUncached(); - case CTX_FLOAT_FROMDOUBLE -> GraalHPyFloatFromDoubleNodeGen.getUncached(); - case CTX_FLOAT_ASDOUBLE -> GraalHPyFloatAsDoubleNodeGen.getUncached(); - case CTX_DICT_CHECK -> GraalHPyDictCheckNodeGen.getUncached(); - case CTX_BYTES_CHECK -> GraalHPyBytesCheckNodeGen.getUncached(); - case CTX_UNICODE_CHECK -> GraalHPyUnicodeCheckNodeGen.getUncached(); - case CTX_TUPLE_CHECK -> GraalHPyTupleCheckNodeGen.getUncached(); - case CTX_LIST_CHECK -> GraalHPyListCheckNodeGen.getUncached(); - case CTX_ERR_NOMEMORY -> GraalHPyErrNoMemoryNodeGen.getUncached(); - case CTX_ERR_SETOBJECT -> GraalHPyErrSetObjectNodeGen.getUncached(); - case CTX_ERR_SETSTRING -> GraalHPyErrSetStringNodeGen.getUncached(); - case CTX_ERR_SETFROMERRNOWITHFILENAME -> GraalHPyErrSetFromErrnoWithFilenameNodeGen.getUncached(); - case CTX_ERR_SETFROMERRNOWITHFILENAMEOBJECTS -> GraalHPyErrSetFromErrnoWithFilenameObjectsNodeGen.getUncached(); - case CTX_FATALERROR -> GraalHPyFatalErrorNodeGen.getUncached(); - case CTX_ERR_OCCURRED -> GraalHPyErrOccurredNodeGen.getUncached(); - case CTX_ERR_EXCEPTIONMATCHES -> GraalHPyErrExceptionMatchesNodeGen.getUncached(); - case CTX_ERR_CLEAR -> GraalHPyErrClearNodeGen.getUncached(); - case CTX_ERR_WARNEX -> GraalHPyErrWarnExNodeGen.getUncached(); - case CTX_ERR_WRITEUNRAISABLE -> GraalHPyErrWriteUnraisableNodeGen.getUncached(); - case CTX_UNICODE_ASUTF8STRING -> GraalHPyUnicodeAsUTF8StringNodeGen.getUncached(); - case CTX_UNICODE_ASLATIN1STRING -> GraalHPyUnicodeAsLatin1StringNodeGen.getUncached(); - case CTX_UNICODE_ASASCIISTRING -> GraalHPyUnicodeAsASCIIStringNodeGen.getUncached(); - case CTX_UNICODE_ENCODEFSDEFAULT -> GraalHPyUnicodeEncodeFSDefaultNodeGen.getUncached(); - case CTX_UNICODE_ASUTF8ANDSIZE -> GraalHPyUnicodeAsUTF8AndSizeNodeGen.getUncached(); - case CTX_UNICODE_FROMSTRING -> GraalHPyUnicodeFromStringNodeGen.getUncached(); - case CTX_UNICODE_FROMWIDECHAR -> GraalHPyUnicodeFromWcharNodeGen.getUncached(); - case CTX_UNICODE_DECODEFSDEFAULT -> GraalHPyUnicodeDecodeCharsetNodeGen.getUncached(); - case CTX_UNICODE_DECODEFSDEFAULTANDSIZE -> GraalHPyUnicodeDecodeCharsetAndSizeNodeGen.getUncached(); - case CTX_UNICODE_DECODEASCII -> GraalHPyUnicodeDecodeASCIINodeGen.getUncached(); - case CTX_UNICODE_DECODELATIN1 -> GraalHPyUnicodeDecodeLatin1NodeGen.getUncached(); - case CTX_UNICODE_READCHAR -> GraalHPyUnicodeReadCharNodeGen.getUncached(); - case CTX_ASPYOBJECT -> GraalHPyAsPyObjectNodeGen.getUncached(); - case CTX_BYTES_ASSTRING, CTX_BYTES_AS_STRING -> GraalHPyBytesAsStringNodeGen.getUncached(); - case CTX_BYTES_SIZE, CTX_BYTES_GET_SIZE -> GraalHPyBytesGetSizeNodeGen.getUncached(); - case CTX_BYTES_FROMSTRING -> GraalHPyBytesFromStringNodeGen.getUncached(); - case CTX_BYTES_FROMSTRINGANDSIZE -> GraalHPyBytesFromStringAndSizeNodeGen.getUncached(); - case CTX_ISTRUE -> GraalHPyIsTrueNodeGen.getUncached(); - case CTX_GETATTR -> GraalHPyGetAttrNodeGen.getUncached(); - case CTX_GETATTR_S -> GraalHPyGetAttrSNodeGen.getUncached(); - case CTX_TYPE_FROMSPEC -> GraalHPyTypeFromSpecNodeGen.getUncached(); - case CTX_HASATTR -> GraalHPyHasAttrNodeGen.getUncached(); - case CTX_HASATTR_S -> GraalHPyHasAttrSNodeGen.getUncached(); - case CTX_SETATTR -> GraalHPySetAttrNodeGen.getUncached(); - case CTX_SETATTR_S -> GraalHPySetAttrSNodeGen.getUncached(); - case CTX_GETITEM, CTX_GETITEM_I -> GraalHPyGetItemNodeGen.getUncached(); - case CTX_GETITEM_S -> GraalHPyGetItemSNodeGen.getUncached(); - case CTX_SETITEM, CTX_SETITEM_I -> GraalHPySetItemNodeGen.getUncached(); - case CTX_SETITEM_S -> GraalHPySetItemSNodeGen.getUncached(); - case CTX_DELITEM, CTX_DELITEM_I -> GraalHPyDelItemNodeGen.getUncached(); - case CTX_DELITEM_S -> GraalHPyDelItemSNodeGen.getUncached(); - case CTX_FROMPYOBJECT -> GraalHPyFromPyObjectNodeGen.getUncached(); - case CTX_NEW -> GraalHPyNewNodeGen.getUncached(); - case CTX_ASSTRUCT_OBJECT, CTX_ASSTRUCT_LEGACY, CTX_ASSTRUCT_TYPE, CTX_ASSTRUCT_LONG, CTX_ASSTRUCT_FLOAT, CTX_ASSTRUCT_UNICODE, CTX_ASSTRUCT_TUPLE, CTX_ASSTRUCT_LIST -> GraalHPyCastNodeGen.getUncached(); - case CTX_TYPE_GENERICNEW -> GraalHPyTypeGenericNewNodeGen.getUncached(); - case CTX_ABSOLUTE -> GraalHPyAbsoluteNodeGen.getUncached(); - case CTX_LONG -> GraalHPyLongNodeGen.getUncached(); - case CTX_FLOAT -> GraalHPyFloatNodeGen.getUncached(); - case CTX_STR -> GraalHPyStrNodeGen.getUncached(); - case CTX_REPR -> GraalHPyReprNodeGen.getUncached(); - case CTX_ASCII -> GraalHPyASCIINodeGen.getUncached(); - case CTX_BYTES -> GraalHPyBytesNodeGen.getUncached(); - case CTX_HASH -> GraalHPyHashNodeGen.getUncached(); - case CTX_LENGTH -> GraalHPyLengthNodeGen.getUncached(); - case CTX_RICHCOMPARE -> GraalHPyRichcompareNodeGen.getUncached(); - case CTX_RICHCOMPAREBOOL -> GraalHPyRichcompareBoolNodeGen.getUncached(); - case CTX_INDEX -> GraalHPyAsIndexNodeGen.getUncached(); - case CTX_NUMBER_CHECK -> GraalHPyIsNumberNodeGen.getUncached(); - case CTX_TUPLE_FROMARRAY -> GraalHPyTupleFromArrayNodeGen.getUncached(); - case CTX_TUPLEBUILDER_NEW, CTX_LISTBUILDER_NEW -> GraalHPyBuilderNewNodeGen.getUncached(); - case CTX_TUPLEBUILDER_SET, CTX_LISTBUILDER_SET -> GraalHPyBuilderSetNodeGen.getUncached(); - case CTX_TUPLEBUILDER_BUILD -> GraalHPyTupleBuilderBuildNodeGen.getUncached(); - case CTX_LISTBUILDER_BUILD -> GraalHPyListBuilderBuildNodeGen.getUncached(); - case CTX_TUPLEBUILDER_CANCEL, CTX_LISTBUILDER_CANCEL -> GraalHPyBuilderCancelNodeGen.getUncached(); - case CTX_TRACKER_NEW -> GraalHPyTrackerNewNodeGen.getUncached(); - case CTX_TRACKER_ADD -> GraalHPyTrackerAddNodeGen.getUncached(); - case CTX_TRACKER_CLOSE -> GraalHPyTrackerCleanupNodeGen.getUncached(); - case CTX_TRACKER_FORGETALL -> GraalHPyTrackerForgetAllNodeGen.getUncached(); - case CTX_CALLABLE_CHECK -> GraalHPyIsCallableNodeGen.getUncached(); - case CTX_CALLTUPLEDICT -> GraalHPyCallTupleDictNodeGen.getUncached(); - case CTX_CALL -> GraalHPyCallNodeGen.getUncached(); - case CTX_CALLMETHOD -> GraalHPyCallMethodNodeGen.getUncached(); - case CTX_DUMP -> GraalHPyDumpNodeGen.getUncached(); - case CTX_TYPE -> GraalHPyTypeNodeGen.getUncached(); - case CTX_TYPECHECK -> GraalHPyTypeCheckNodeGen.getUncached(); - case CTX_ERR_NEWEXCEPTIONWITHDOC -> GraalHPyNewExceptionWithDocNodeGen.getUncached(); - case CTX_ERR_NEWEXCEPTION -> GraalHPyNewExceptionNodeGen.getUncached(); - case CTX_IS -> GraalHPyIsNodeGen.getUncached(); - case CTX_IMPORT_IMPORTMODULE -> GraalHPyImportModuleNodeGen.getUncached(); - case CTX_FIELD_STORE -> GraalHPyFieldStoreNodeGen.getUncached(); - case CTX_FIELD_LOAD -> GraalHPyFieldLoadNodeGen.getUncached(); - case CTX_GLOBAL_STORE -> GraalHPyGlobalStoreNodeGen.getUncached(); - case CTX_GLOBAL_LOAD -> GraalHPyGlobalLoadNodeGen.getUncached(); - case CTX_LEAVEPYTHONEXECUTION -> GraalHPyLeavePythonExecutionNodeGen.getUncached(); - case CTX_REENTERPYTHONEXECUTION -> GraalHPyReenterPythonExecutionNodeGen.getUncached(); - case CTX_CONTAINS -> GraalHPyContainsNodeGen.getUncached(); - case CTX_TYPE_ISSUBTYPE -> GraalHPyTypeIsSubtypeNodeGen.getUncached(); - case CTX_TYPE_GETNAME -> GraalHPyTypeGetNameNodeGen.getUncached(); - case CTX_DICT_KEYS -> GraalHPyDictKeysNodeGen.getUncached(); - case CTX_DICT_COPY -> GraalHPyDictCopyNodeGen.getUncached(); - case CTX_CAPSULE_NEW -> GraalHPyCapsuleNewNodeGen.getUncached(); - case CTX_CAPSULE_GET -> GraalHPyCapsuleGetNodeGen.getUncached(); - case CTX_CAPSULE_SET -> GraalHPyCapsuleSetNodeGen.getUncached(); - case CTX_CAPSULE_ISVALID -> GraalHPyCapsuleIsValidNodeGen.getUncached(); - case CTX_CONTEXTVAR_NEW -> GraalHPyContextVarNewNodeGen.getUncached(); - case CTX_CONTEXTVAR_GET -> GraalHPyContextVarGetNodeGen.getUncached(); - case CTX_CONTEXTVAR_SET -> GraalHPyContextVarSetNodeGen.getUncached(); - case CTX_UNICODE_FROMENCODEDOBJECT -> GraalHPyUnicodeFromEncodedObjectNodeGen.getUncached(); - case CTX_UNICODE_SUBSTRING -> GraalHPyUnicodeSubstringNodeGen.getUncached(); - case CTX_SLICE_UNPACK -> GraalHPySliceUnpackNodeGen.getUncached(); - case CTX_TYPE_GETBUILTINSHAPE -> GraalHPyTypeGetBuiltinShapeNodeGen.getUncached(); - case CTX_COMPILE_S -> GraalHPyCompileNodeGen.getUncached(); - case CTX_EVALCODE -> GraalHPyEvalCodeNodeGen.getUncached(); - case CTX_SETCALLFUNCTION -> GraalHPySetCallFunctionNodeGen.getUncached(); - default -> throw CompilerDirectives.shouldNotReachHere(); - }; - } - - // @formatter:on - // Checkstyle: resume - // {{end ctx func factory}} - } - - public abstract static class HPyUnaryContextFunction extends GraalHPyContextFunction { - public abstract Object execute(Object arg0); - - @Override - public final Object execute(Object[] args) { - return execute(args[0]); - } - } - - public abstract static class HPyBinaryContextFunction extends GraalHPyContextFunction { - public abstract Object execute(Object arg0, Object arg1); - - @Override - public final Object execute(Object[] args) { - return execute(args[0], args[1]); - } - } - - public abstract static class HPyTernaryContextFunction extends GraalHPyContextFunction { - public abstract Object execute(Object arg0, Object arg1, Object arg2); - - @Override - public final Object execute(Object[] args) { - return execute(args[0], args[1], args[2]); - } - } - - public abstract static class HPyQuaternaryContextFunction extends GraalHPyContextFunction { - public abstract Object execute(Object arg0, Object arg1, Object arg2, Object arg3); - - @Override - public final Object execute(Object[] args) { - return execute(args[0], args[1], args[2], args[3]); - } - } - - public abstract static class HPy5ContextFunction extends GraalHPyContextFunction { - public abstract Object execute(Object arg0, Object arg1, Object arg2, Object arg3, Object arg4); - - @Override - public final Object execute(Object[] args) { - return execute(args[0], args[1], args[2], args[3], args[4]); - } - } - - @HPyContextFunction("ctx_Dup") - @GenerateUncached - public abstract static class GraalHPyDup extends HPyBinaryContextFunction { - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object object) { - return object; - } - } - - @HPyContextFunction("ctx_Close") - @GenerateUncached - public abstract static class GraalHPyClose extends HPyBinaryContextFunction { - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object handle, - @Bind("this") Node inliningTarget, - @Cached HPyCloseHandleNode closeHandleNode) { - closeHandleNode.execute(inliningTarget, handle); - return 0; - } - } - - @HPyContextFunction("ctx_Positive") - @GenerateUncached - @ImportStatic(UnaryArithmetic.class) - public abstract static class GraalHPyPositive extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg, - @Cached(parameters = "Pos") HPyUnaryArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg); - } - } - - @HPyContextFunction("ctx_Negative") - @GenerateUncached - @ImportStatic(UnaryArithmetic.class) - public abstract static class GraalHPyNegative extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg, - @Cached(parameters = "Neg") HPyUnaryArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg); - } - } - - @HPyContextFunction("ctx_Invert") - @GenerateUncached - @ImportStatic(UnaryArithmetic.class) - public abstract static class GraalHPyInvert extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg, - @Cached(parameters = "Invert") HPyUnaryArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg); - } - } - - @HPyContextFunction("ctx_Add") - @GenerateUncached - @ImportStatic(BinaryArithmetic.class) - public abstract static class GraalHPyAdd extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "Add") HPyBinaryArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_Subtract") - @GenerateUncached - @ImportStatic(BinaryArithmetic.class) - public abstract static class GraalHPySubtract extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "Sub") HPyBinaryArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_Multiply") - @GenerateUncached - @ImportStatic(BinaryArithmetic.class) - public abstract static class GraalHPyMultiply extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "Mul") HPyBinaryArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_MatrixMultiply") - @GenerateUncached - @ImportStatic(BinaryArithmetic.class) - public abstract static class GraalHPyMatrixMultiply extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "MatMul") HPyBinaryArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_FloorDivide") - @GenerateUncached - @ImportStatic(BinaryArithmetic.class) - public abstract static class GraalHPyFloorDivide extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "FloorDiv") HPyBinaryArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_TrueDivide") - @GenerateUncached - @ImportStatic(BinaryArithmetic.class) - public abstract static class GraalHPyTrueDivide extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "TrueDiv") HPyBinaryArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_Remainder") - @GenerateUncached - @ImportStatic(BinaryArithmetic.class) - public abstract static class GraalHPyRemainder extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "Mod") HPyBinaryArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_Divmod") - @GenerateUncached - @ImportStatic(BinaryArithmetic.class) - public abstract static class GraalHPyDivmod extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "DivMod") HPyBinaryArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_And") - @GenerateUncached - @ImportStatic(BinaryArithmetic.class) - public abstract static class GraalHPyAnd extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "And") HPyBinaryArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_Xor") - @GenerateUncached - @ImportStatic(BinaryArithmetic.class) - public abstract static class GraalHPyXor extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "Xor") HPyBinaryArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_Or") - @GenerateUncached - @ImportStatic(BinaryArithmetic.class) - public abstract static class GraalHPyOr extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "Or") HPyBinaryArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_Lshift") - @GenerateUncached - @ImportStatic(BinaryArithmetic.class) - public abstract static class GraalHPyLshift extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "LShift") HPyBinaryArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_Rshift") - @GenerateUncached - @ImportStatic(BinaryArithmetic.class) - public abstract static class GraalHPyRshift extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "RShift") HPyBinaryArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_Power") - @GenerateUncached - @ImportStatic(TernaryArithmetic.class) - public abstract static class GraalHPyPower extends HPyQuaternaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, Object arg2, - @Cached(parameters = "Pow") HPyTernaryArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1, arg2); - } - } - - @HPyContextFunction("ctx_InPlaceAdd") - @GenerateUncached - @ImportStatic(InplaceArithmetic.class) - public abstract static class GraalHPyInPlaceAdd extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "IAdd") HPyInplaceArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_InPlaceSubtract") - @GenerateUncached - @ImportStatic(InplaceArithmetic.class) - public abstract static class GraalHPyInPlaceSubtract extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "ISub") HPyInplaceArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_InPlaceMultiply") - @GenerateUncached - @ImportStatic(InplaceArithmetic.class) - public abstract static class GraalHPyInPlaceMultiply extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "IMul") HPyInplaceArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_InPlaceMatrixMultiply") - @GenerateUncached - @ImportStatic(InplaceArithmetic.class) - public abstract static class GraalHPyInPlaceMatrixMultiply extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "IMatMul") HPyInplaceArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_InPlaceFloorDivide") - @GenerateUncached - @ImportStatic(InplaceArithmetic.class) - public abstract static class GraalHPyInPlaceFloorDivide extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "IFloorDiv") HPyInplaceArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_InPlaceTrueDivide") - @GenerateUncached - @ImportStatic(InplaceArithmetic.class) - public abstract static class GraalHPyInPlaceTrueDivide extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "ITrueDiv") HPyInplaceArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_InPlaceRemainder") - @GenerateUncached - @ImportStatic(InplaceArithmetic.class) - public abstract static class GraalHPyInPlaceRemainder extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "IMod") HPyInplaceArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_InPlacePower") - @GenerateUncached - @ImportStatic(InplaceArithmetic.class) - public abstract static class GraalHPyInPlacePower extends HPyQuaternaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, Object arg2, - @Cached(parameters = "IPow") HPyInplaceArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1, arg2); - } - } - - @HPyContextFunction("ctx_InPlaceLshift") - @GenerateUncached - @ImportStatic(InplaceArithmetic.class) - public abstract static class GraalHPyInPlaceLshift extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "ILShift") HPyInplaceArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_InPlaceRshift") - @GenerateUncached - @ImportStatic(InplaceArithmetic.class) - public abstract static class GraalHPyInPlaceRshift extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "IRShift") HPyInplaceArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_InPlaceAnd") - @GenerateUncached - @ImportStatic(InplaceArithmetic.class) - public abstract static class GraalHPyInPlaceAnd extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "IAnd") HPyInplaceArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_InPlaceXor") - @GenerateUncached - @ImportStatic(InplaceArithmetic.class) - public abstract static class GraalHPyInPlaceXor extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "IXor") HPyInplaceArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_InPlaceOr") - @GenerateUncached - @ImportStatic(InplaceArithmetic.class) - public abstract static class GraalHPyInPlaceOr extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg0, Object arg1, - @Cached(parameters = "IOr") HPyInplaceArithmeticNode arithmeticNode) { - return arithmeticNode.execute(arg0, arg1); - } - } - - @HPyContextFunction("ctx_Bool_FromBool") - @GenerateUncached - public abstract static class GraalHPyBoolFromBool extends HPyBinaryContextFunction { - - @Specialization - static PInt doBoolean(GraalHPyContext hpyContext, boolean value) { - Python3Core core = hpyContext.getContext(); - return value ? core.getTrue() : core.getFalse(); - } - - @Specialization - static PInt doByte(GraalHPyContext hpyContext, byte value) { - return doBoolean(hpyContext, value != 0); - } - } - - @HPyContextFunction("ctx_Long_FromInt32_t") - @GenerateUncached - public abstract static class GraalHPyLongFromInt32 extends HPyBinaryContextFunction { - - @Specialization - static Object doInt(@SuppressWarnings("unused") Object hpyContext, int value, - @Bind("this") Node inliningTarget, - @Exclusive @Cached HPyLongFromLong fromLongNode) { - return fromLongNode.execute(inliningTarget, value, true); - } - - @Specialization - static Object doLong(@SuppressWarnings("unused") Object hpyContext, long value, - @Bind("this") Node inliningTarget, - @Exclusive @Cached HPyLongFromLong fromLongNode) { - return fromLongNode.execute(inliningTarget, value, true); - } - } - - @HPyContextFunction("ctx_Long_FromUInt32_t") - @GenerateUncached - public abstract static class GraalHPyLongFromUInt32 extends HPyBinaryContextFunction { - - @Specialization - static Object doInt(@SuppressWarnings("unused") Object hpyContext, int value, - @Bind("this") Node inliningTarget, - @Shared @Cached HPyLongFromLong fromLongNode) { - return fromLongNode.execute(inliningTarget, value, false); - } - - @Specialization - static Object doLong(Object hpyContext, long value, - @Bind("this") Node inliningTarget, - @Shared @Cached HPyLongFromLong fromLongNode) { - return doInt(hpyContext, (int) value, inliningTarget, fromLongNode); - } - } - - @HPyContextFunction("ctx_Long_FromInt64_t") - @HPyContextFunction("ctx_Long_FromSsize_t") - @GenerateUncached - public abstract static class GraalHPyLongFromInt64 extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, long value, - @Bind("this") Node inliningTarget, - @Cached HPyLongFromLong fromLongNode) { - return fromLongNode.execute(inliningTarget, value, true); - } - } - - @HPyContextFunction("ctx_Long_FromUInt64_t") - @HPyContextFunction("ctx_Long_FromSize_t") - @GenerateUncached - public abstract static class GraalHPyLongFromUInt64 extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, long value, - @Bind("this") Node inliningTarget, - @Cached HPyLongFromLong fromLongNode) { - return fromLongNode.execute(inliningTarget, value, false); - } - } - - private static final int SIZEOF_INT32 = 4; - private static final int SIZEOF_INT64 = 8; - private static final int SIZEOF_INTPTR = 8; - - @HPyContextFunction("ctx_Long_AsInt32_t") - @GenerateUncached - public abstract static class GraalHPyLongAsInt32 extends HPyBinaryContextFunction { - @Specialization - static Object doGeneric(@SuppressWarnings("unusued") Object hpyContext, Object object, - @Cached AsNativePrimitiveNode asNativePrimitiveNode) { - return asNativePrimitiveNode.execute(object, 1, SIZEOF_INT32, true); - } - } - - @HPyContextFunction("ctx_Long_AsUInt32_t") - @GenerateUncached - public abstract static class GraalHPyLongAsUInt32 extends HPyBinaryContextFunction { - @Specialization - static Object doGeneric(@SuppressWarnings("unusued") Object hpyContext, Object object, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached IsSubtypeNode isSubtypeNode, - @Cached PRaiseNode raiseNode, - @Cached AsNativePrimitiveNode asNativePrimitiveNode) { - if (!isSubtypeNode.execute(getClassNode.execute(inliningTarget, object), PythonBuiltinClassType.PInt)) { - throw raiseNode.raise(TypeError, ErrorMessages.INTEGER_REQUIRED); - } - return asNativePrimitiveNode.execute(object, 0, SIZEOF_INT32, true); - } - } - - @HPyContextFunction("ctx_Long_AsUInt32_tMask") - @GenerateUncached - public abstract static class GraalHPyLongAsUInt32Mask extends HPyBinaryContextFunction { - @Specialization - static Object doGeneric(@SuppressWarnings("unusued") Object hpyContext, Object object, - @Cached AsNativePrimitiveNode asNativePrimitiveNode) { - return asNativePrimitiveNode.execute(object, 0, SIZEOF_INT32, false); - } - } - - @HPyContextFunction("ctx_Long_AsInt64_t") - @GenerateUncached - public abstract static class GraalHPyLongAsInt64 extends HPyBinaryContextFunction { - @Specialization - static Object doGeneric(@SuppressWarnings("unusued") Object hpyContext, Object object, - @Cached AsNativePrimitiveNode asNativePrimitiveNode) { - return asNativePrimitiveNode.execute(object, 1, SIZEOF_INT64, true); - } - } - - @HPyContextFunction("ctx_Long_AsUInt64_t") - @HPyContextFunction("ctx_Long_AsSize_t") - @HPyContextFunction("ctx_Long_AsVoidPtr") - @GenerateUncached - public abstract static class GraalHPyLongAsUInt64 extends HPyBinaryContextFunction { - @Specialization - static Object doGeneric(@SuppressWarnings("unusued") Object hpyContext, Object object, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached IsSubtypeNode isSubtypeNode, - @Cached PRaiseNode raiseNode, - @Cached AsNativePrimitiveNode asNativePrimitiveNode) { - if (!isSubtypeNode.execute(getClassNode.execute(inliningTarget, object), PythonBuiltinClassType.PInt)) { - throw raiseNode.raise(TypeError, ErrorMessages.INTEGER_REQUIRED); - } - return asNativePrimitiveNode.execute(object, 0, SIZEOF_INT64, true); - } - } - - @HPyContextFunction("ctx_Long_AsUInt64_tMask") - @GenerateUncached - public abstract static class GraalHPyLongAsUInt64Mask extends HPyBinaryContextFunction { - @Specialization - static Object doGeneric(@SuppressWarnings("unusued") Object hpyContext, Object object, - @Cached AsNativePrimitiveNode asNativePrimitiveNode) { - return asNativePrimitiveNode.execute(object, 0, SIZEOF_INT64, false); - } - } - - @HPyContextFunction("ctx_Long_AsSsize_t") - @GenerateUncached - public abstract static class GraalHPyLongAsSsizeT extends HPyBinaryContextFunction { - @Specialization - static Object doGeneric(@SuppressWarnings("unusued") Object hpyContext, Object object, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached IsSubtypeNode isSubtypeNode, - @Cached PRaiseNode raiseNode, - @Cached AsNativePrimitiveNode asNativePrimitiveNode) { - if (!isSubtypeNode.execute(getClassNode.execute(inliningTarget, object), PythonBuiltinClassType.PInt)) { - throw raiseNode.raise(TypeError, ErrorMessages.INTEGER_REQUIRED); - } - return asNativePrimitiveNode.execute(object, 1, SIZEOF_INTPTR, true); - } - } - - @HPyContextFunction("ctx_Long_AsDouble") - @GenerateUncached - public abstract static class GraalHPyLongAsDouble extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object arg, - @Bind("this") Node inliningTarget, - @Cached PyLongAsDoubleNode asDoubleNode) { - return asDoubleNode.execute(inliningTarget, arg); - } - } - - @HPyContextFunction("ctx_Dict_New") - @GenerateUncached - public abstract static class GraalHPyDictNew extends HPyUnaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, - @Cached PythonObjectFactory factory) { - return factory.createDict(); - } - } - - @HPyContextFunction("ctx_List_New") - @GenerateUncached - public abstract static class GraalHPyListNew extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, long len, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode raiseNode) { - try { - Object[] data = new Object[PInt.intValueExact(len)]; - // TODO(fa) maybe this should be NO_VALUE (representing native 'NULL') - Arrays.fill(data, PNone.NONE); - return factory.createList(data); - } catch (OverflowException e) { - throw raiseNode.raise(PythonBuiltinClassType.MemoryError); - } - } - } - - @HPyContextFunction("ctx_List_Append") - @GenerateUncached - public abstract static class GraalHPyListAppend extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object left, Object value, - @Bind("this") Node inliningTarget, - @Cached ListNodes.AppendNode appendNode, - @Cached PRaiseNode raiseNode) { - if (!PGuards.isList(left)) { - throw raiseNode.raise(SystemError, ErrorMessages.BAD_INTERNAL_CALL); - } - appendNode.execute((PList) left, value); - return 0; - } - } - - @HPyContextFunction("ctx_Float_FromDouble") - @GenerateUncached - public abstract static class GraalHPyFloatFromDouble extends HPyBinaryContextFunction { - - @Specialization - static double doGeneric(@SuppressWarnings("unused") Object hpyContext, double value) { - return value; - } - } - - @HPyContextFunction("ctx_Float_AsDouble") - @GenerateUncached - public abstract static class GraalHPyFloatAsDouble extends HPyBinaryContextFunction { - - @Specialization - static double doGeneric(@SuppressWarnings("unused") Object hpyContext, Object value, - @Bind("this") Node inliningTarget, - @Cached PyFloatAsDoubleNode asDoubleNode) { - return asDoubleNode.execute(null, inliningTarget, value); - } - } - - abstract static class HPyCheckBuiltinType extends HPyBinaryContextFunction { - - abstract PythonBuiltinClassType getExpectedType(); - - } - - @HPyContextFunction("ctx_Dict_Check") - @GenerateUncached - public abstract static class GraalHPyDictCheck extends HPyBinaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object object, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached IsSubtypeNode isSubtypeNode) { - return PInt.intValue(isSubtypeNode.execute(getClassNode.execute(inliningTarget, object), PythonBuiltinClassType.PDict)); - } - } - - @HPyContextFunction("ctx_Bytes_Check") - @GenerateUncached - public abstract static class GraalHPyBytesCheck extends HPyBinaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object object, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached IsSubtypeNode isSubtypeNode) { - return PInt.intValue(isSubtypeNode.execute(getClassNode.execute(inliningTarget, object), PythonBuiltinClassType.PBytes)); - } - } - - @HPyContextFunction("ctx_Unicode_Check") - @GenerateUncached - public abstract static class GraalHPyUnicodeCheck extends HPyBinaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object object, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached IsSubtypeNode isSubtypeNode) { - return PInt.intValue(isSubtypeNode.execute(getClassNode.execute(inliningTarget, object), PythonBuiltinClassType.PString)); - } - } - - @HPyContextFunction("ctx_Tuple_Check") - @GenerateUncached - public abstract static class GraalHPyTupleCheck extends HPyBinaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object object, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached IsSubtypeNode isSubtypeNode) { - return PInt.intValue(isSubtypeNode.execute(getClassNode.execute(inliningTarget, object), PythonBuiltinClassType.PTuple)); - } - } - - @HPyContextFunction("ctx_List_Check") - @GenerateUncached - public abstract static class GraalHPyListCheck extends HPyBinaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object object, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached IsSubtypeNode isSubtypeNode) { - return PInt.intValue(isSubtypeNode.execute(getClassNode.execute(inliningTarget, object), PythonBuiltinClassType.PList)); - } - } - - @HPyContextFunction("ctx_Err_NoMemory") - @GenerateUncached - public abstract static class GraalHPyErrNoMemory extends HPyUnaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.MemoryError); - } - } - - @HPyContextFunction("ctx_Err_SetObject") - @GenerateUncached - public abstract static class GraalHPyErrSetObject extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object errTypeObj, Object valueObj, - @Bind("this") Node inliningTarget, - @Cached IsSubtypeNode isSubtypeNode, - @Cached IsSubtypeNode isExcValueSubtypeNode, - @Cached GetClassNode getClassNode, - @Cached CallNode callExceptionConstructorNode, - @Cached PyExceptionInstanceCheckNode exceptionCheckNode, - @Cached PRaiseNode raiseNode) { - if (!(PGuards.isPythonClass(errTypeObj) && isSubtypeNode.execute(errTypeObj, PythonBuiltinClassType.PBaseException))) { - return raiseNode.raise(SystemError, ErrorMessages.EXCEPTION_NOT_BASEEXCEPTION, errTypeObj); - } - Object exception; - // If the exception value is already an exception object, just take it. - if (isExcValueSubtypeNode.execute(getClassNode.execute(inliningTarget, valueObj), PythonBuiltinClassType.PBaseException)) { - exception = valueObj; - } else { - exception = callExceptionConstructorNode.executeWithoutFrame(errTypeObj, valueObj); - } - - if (exceptionCheckNode.execute(inliningTarget, exception)) { - throw raiseNode.raiseExceptionObject(exception); - } - // This should really not happen since we did a type check above but in theory, - // the constructor could be broken. - throw CompilerDirectives.shouldNotReachHere(); - } - } - - @HPyContextFunction("ctx_Err_SetString") - @GenerateUncached - public abstract static class GraalHPyErrSetString extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object errTypeObj, Object charPtr, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached IsSubtypeNode isSubtypeNode, - @Cached CallNode callExceptionConstructorNode, - @Cached PyExceptionInstanceCheckNode exceptionCheckNode, - @Cached PRaiseNode raiseNode) { - if (!(PGuards.isPythonClass(errTypeObj) && isSubtypeNode.execute(errTypeObj, PythonBuiltinClassType.PBaseException))) { - return raiseNode.raise(SystemError, ErrorMessages.EXCEPTION_NOT_BASEEXCEPTION, errTypeObj); - } - Object exception = callExceptionConstructorNode.executeWithoutFrame(errTypeObj, fromCharPointerNode.execute(charPtr)); - - if (exceptionCheckNode.execute(isSubtypeNode, exception)) { - throw raiseNode.raiseExceptionObject(exception); - } - // This should really not happen since we did a type check above but in theory, - // the constructor could be broken. - throw CompilerDirectives.shouldNotReachHere(); - } - } - - @HPyContextFunction("ctx_Err_SetFromErrnoWithFilename") - @GenerateUncached - public abstract static class GraalHPyErrSetFromErrnoWithFilename extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object errTypeObj, Object errMessagePtr, - @Bind("this") Node inliningTarget, - @Cached(parameters = "hpyContext") GraalHPyCAccess.IsNullNode isNullNode, - @Cached(parameters = "hpyContext") HPyCallHelperFunctionNode callHelperFunctionNode, - @Cached(parameters = "hpyContext") HPyFromCharPointerNode fromCharPointerNode, - @Cached IsSubtypeNode isSubtypeNode, - @Cached CallNode callExceptionConstructorNode, - @Cached PyExceptionInstanceCheckNode exceptionCheckNode, - @Cached PRaiseNode raiseNode) { - Object i = callHelperFunctionNode.call(hpyContext, GraalHPyNativeSymbol.GRAAL_HPY_GET_ERRNO); - Object message = fromCharPointerNode.execute(hpyContext, callHelperFunctionNode.call(hpyContext, GraalHPyNativeSymbol.GRAAL_HPY_GET_STRERROR, i), true); - if (!isSubtypeNode.execute(errTypeObj, PythonBuiltinClassType.PBaseException)) { - return raiseNode.raise(SystemError, ErrorMessages.EXCEPTION_NOT_BASEEXCEPTION, errTypeObj); - } - Object exception = null; - if (!isNullNode.execute(hpyContext, errMessagePtr)) { - TruffleString filename_fsencoded = fromCharPointerNode.execute(hpyContext, errMessagePtr, true); - exception = callExceptionConstructorNode.executeWithoutFrame(errTypeObj, i, message, filename_fsencoded); - } - - if (exception == null) { - exception = callExceptionConstructorNode.executeWithoutFrame(errTypeObj, i, message); - } - - if (exceptionCheckNode.execute(inliningTarget, exception)) { - throw raiseNode.raiseExceptionObject(exception); - } - // This should really not happen since we did a type check above but in theory, - // the constructor could be broken. - throw CompilerDirectives.shouldNotReachHere(); - } - } - - @HPyContextFunction("ctx_Err_SetFromErrnoWithFilenameObjects") - @GenerateUncached - public abstract static class GraalHPyErrSetFromErrnoWithFilenameObjects extends HPyQuaternaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object errTypeObj, Object filenameObject1, Object filenameObject2, - @Bind("this") Node inliningTarget, - @Cached(parameters = "hpyContext") HPyCallHelperFunctionNode callHelperNode, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached IsSubtypeNode isSubtypeNode, - @Cached CallNode callExceptionConstructorNode, - @Cached PyExceptionInstanceCheckNode exceptionCheckNode, - @Cached PRaiseNode raiseNode) { - Object i = callHelperNode.call(hpyContext, GraalHPyNativeSymbol.GRAAL_HPY_GET_ERRNO); - Object message = fromCharPointerNode.execute(callHelperNode.call(hpyContext, GraalHPyNativeSymbol.GRAAL_HPY_GET_STRERROR, i)); - if (!isSubtypeNode.execute(errTypeObj, PythonBuiltinClassType.PBaseException)) { - return raiseNode.raise(SystemError, ErrorMessages.EXCEPTION_NOT_BASEEXCEPTION, errTypeObj); - } - Object exception = null; - if (filenameObject1 != NULL_HANDLE_DELEGATE) { - if (filenameObject2 != NULL_HANDLE_DELEGATE) { - exception = callExceptionConstructorNode.executeWithoutFrame(errTypeObj, i, message, filenameObject1, 0, filenameObject2); - } else { - exception = callExceptionConstructorNode.executeWithoutFrame(errTypeObj, i, message, filenameObject1); - } - } - - if (exception == null) { - exception = callExceptionConstructorNode.executeWithoutFrame(errTypeObj, i, message); - } - - if (exceptionCheckNode.execute(inliningTarget, exception)) { - throw raiseNode.raiseExceptionObject(exception); - } - // This should really not happen since we did a type check above but in theory, - // the constructor could be broken. - throw CompilerDirectives.shouldNotReachHere(); - } - } - - @HPyContextFunction("ctx_FatalError") - @GenerateUncached - public abstract static class GraalHPyFatalError extends HPyBinaryContextFunction { - @TruffleBoundary - @Specialization - Object doGeneric(GraalHPyContext hpyContext, Object charPtr) { - TruffleString errorMessage; - if (GraalHPyCAccess.IsNullNode.getUncached(hpyContext).execute(hpyContext, charPtr)) { - errorMessage = ErrorMessages.MSG_NOT_SET; - } else { - // we don't need to copy the bytes since we die anyway - errorMessage = FromCharPointerNodeGen.getUncached().execute(charPtr, false); - } - CExtCommonNodes.fatalError(this, hpyContext.getContext(), null, errorMessage, -1); - throw CompilerDirectives.shouldNotReachHere(); - } - } - - @HPyContextFunction("ctx_Err_Occurred") - @GenerateUncached - public abstract static class GraalHPyErrOccurred extends HPyUnaryContextFunction { - - @Specialization - static int doGeneric(GraalHPyContext hpyContext, - @Bind("this") Node inliningTarget, - @Cached GetThreadStateNode getThreadStateNode) { - return getThreadStateNode.execute(inliningTarget, hpyContext.getContext()).getCurrentException() != null ? 1 : 0; - } - } - - @HPyContextFunction("ctx_Err_ExceptionMatches") - @GenerateUncached - public abstract static class GraalHPyErrExceptionMatches extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object exc, - @Bind("this") Node inliningTarget, - @Cached GetThreadStateNode getThreadStateNode, - @Cached GetUnreifiedExceptionNode getUnreifiedExceptionNode, - @Cached RecursiveExceptionMatches exceptionMatches) { - AbstractTruffleException err = getThreadStateNode.execute(inliningTarget, hpyContext.getContext()).getCurrentException(); - if (err == null) { - return 0; - } - if (exc == NULL_HANDLE_DELEGATE) { - return 0; - } - Object exceptionObject = getUnreifiedExceptionNode.execute(inliningTarget, err); - return exceptionMatches.execute(hpyContext, exceptionObject, exc); - } - } - - @HPyContextFunction("ctx_Err_Clear") - @GenerateUncached - public abstract static class GraalHPyErrClear extends HPyUnaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, - @Bind("this") Node inliningTarget, - @Cached GetThreadStateNode getThreadStateNode, - @Cached ClearCurrentExceptionNode clearCurrentExceptionNode) { - PythonThreadState threadState = getThreadStateNode.execute(inliningTarget, hpyContext.getContext()); - clearCurrentExceptionNode.execute(inliningTarget, threadState); - return NULL_HANDLE_DELEGATE; - } - } - - @HPyContextFunction("ctx_Err_WarnEx") - @GenerateUncached - public abstract static class GraalHPyErrWarnEx extends HPyQuaternaryContextFunction { - - @Specialization - static int doGeneric(GraalHPyContext hpyContext, Object categoryArg, Object messageArg, long stackLevel, - @Cached(parameters = "hpyContext") GraalHPyCAccess.IsNullNode isNullNode, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached WarnNode warnNode) { - Object category = categoryArg == NULL_HANDLE_DELEGATE ? RuntimeWarning : categoryArg; - TruffleString message = isNullNode.execute(hpyContext, messageArg) ? T_EMPTY_STRING : fromCharPointerNode.execute(messageArg); - warnNode.warnEx(null, category, message, (int) stackLevel); - return 0; - } - } - - @HPyContextFunction("ctx_Err_WriteUnraisable") - @GenerateUncached - public abstract static class GraalHPyErrWriteUnraisable extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object object, - @Bind("this") Node inliningTarget, - @Cached GetThreadStateNode getThreadStateNode, - @Cached WriteUnraisableNode writeUnraisableNode, - @Cached GetEscapedExceptionNode getEscapedExceptionNode, - @Cached ClearCurrentExceptionNode clearCurrentExceptionNode) { - PythonThreadState threadState = getThreadStateNode.execute(inliningTarget, hpyContext.getContext()); - AbstractTruffleException exception = threadState.getCurrentException(); - clearCurrentExceptionNode.execute(inliningTarget, threadState); - Object exceptionObject = getEscapedExceptionNode.execute(inliningTarget, exception); - writeUnraisableNode.execute(null, exceptionObject, null, (object instanceof PNone) ? PNone.NONE : object); - return 0; // void - } - } - - @HPyContextFunction("ctx_Unicode_AsUTF8String") - @GenerateUncached - public abstract static class GraalHPyUnicodeAsUTF8String extends HPyBinaryContextFunction { - - @Specialization - static PBytes doGeneric(@SuppressWarnings("unused") Object hpyContext, Object unicodeObject, - @Cached EncodeNativeStringNode encodeNativeStringNode, - @Cached PythonObjectFactory factory) { - return factory.createBytes(encodeNativeStringNode.execute(StandardCharsets.UTF_8, unicodeObject, T_STRICT)); - } - } - - @HPyContextFunction("ctx_Unicode_AsLatin1String") - @GenerateUncached - public abstract static class GraalHPyUnicodeAsLatin1String extends HPyBinaryContextFunction { - - @Specialization - static PBytes doGeneric(@SuppressWarnings("unused") Object hpyContext, Object unicodeObject, - @Cached EncodeNativeStringNode encodeNativeStringNode, - @Cached PythonObjectFactory factory) { - return factory.createBytes(encodeNativeStringNode.execute(StandardCharsets.ISO_8859_1, unicodeObject, T_STRICT)); - } - } - - @HPyContextFunction("ctx_Unicode_AsASCIIString") - @GenerateUncached - public abstract static class GraalHPyUnicodeAsASCIIString extends HPyBinaryContextFunction { - - @Specialization - static PBytes doGeneric(@SuppressWarnings("unused") Object hpyContext, Object unicodeObject, - @Cached EncodeNativeStringNode encodeNativeStringNode, - @Cached PythonObjectFactory factory) { - return factory.createBytes(encodeNativeStringNode.execute(StandardCharsets.US_ASCII, unicodeObject, T_STRICT)); - } - } - - @HPyContextFunction("ctx_Unicode_EncodeFSDefault") - @GenerateUncached - public abstract static class GraalHPyUnicodeEncodeFSDefault extends HPyBinaryContextFunction { - @Specialization - static PBytes doGeneric(@SuppressWarnings("unused") Object hpyContext, Object unicodeObject, - @Cached EncodeNativeStringNode encodeNativeStringNode, - @Cached PythonObjectFactory factory) { - return factory.createBytes(encodeNativeStringNode.execute(getFSDefaultCharset(), unicodeObject, T_STRICT)); - } - - @TruffleBoundary - public static Charset getFSDefaultCharset() { - TruffleString normalizedEncoding = CharsetMapping.normalizeUncached(GetFileSystemEncodingNode.getFileSystemEncoding()); - return CharsetMapping.getCharsetNormalized(normalizedEncoding); - } - } - - @HPyContextFunction("ctx_Unicode_AsUTF8AndSize") - @GenerateUncached - public abstract static class GraalHPyUnicodeAsUTF8AndSize extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object unicodeObject, Object sizePtr, - @Bind("this") Node inliningTarget, - @Cached CastToTruffleStringNode castToTruffleStringNode, - @Cached PRaiseNode raiseNode, - @Cached(parameters = "hpyContext") GraalHPyCAccess.WriteSizeTNode writeSizeTNode, - @Cached(parameters = "hpyContext") GraalHPyCAccess.IsNullNode isNullNode, - @Cached TruffleString.SwitchEncodingNode switchEncodingNode, - @Cached TruffleString.GetInternalByteArrayNode getInternalByteArrayNode) { - TruffleString tsUtf8; - try { - tsUtf8 = switchEncodingNode.execute(castToTruffleStringNode.execute(inliningTarget, unicodeObject), Encoding.UTF_8); - } catch (CannotCastException e) { - throw raiseNode.raise(TypeError, ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP); - } - InternalByteArray internalByteArray = getInternalByteArrayNode.execute(tsUtf8, Encoding.UTF_8); - if (!isNullNode.execute(hpyContext, sizePtr)) { - writeSizeTNode.write(hpyContext, sizePtr, internalByteArray.getLength()); - } - return new CByteArrayWrapper(internalByteArray.getArray()); - } - } - - @HPyContextFunction("ctx_Unicode_FromString") - @GenerateUncached - public abstract static class GraalHPyUnicodeFromString extends HPyBinaryContextFunction { - - @Specialization - static TruffleString doGeneric(@SuppressWarnings("unused") Object hpyContext, Object charPtr, - @Cached FromCharPointerNode fromCharPointerNode) { - if (charPtr instanceof TruffleString ts) { - return ts; - } - return fromCharPointerNode.execute(charPtr); - } - } - - @HPyContextFunction("ctx_Unicode_FromWideChar") - @GenerateUncached - public abstract static class GraalHPyUnicodeFromWchar extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object wcharPtr, long len, - @Bind("this") Node inliningTarget, - @Cached ReadUnicodeArrayNode readArray, - @Cached TruffleString.FromIntArrayUTF32Node fromArray) { - try { - return fromArray.execute(readArray.execute(inliningTarget, wcharPtr, PInt.intValueExact(len), CStructs.wchar_t.size())); - } catch (OverflowException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - } - } - - @HPyContextFunction("ctx_Unicode_DecodeFSDefault") - @GenerateUncached - public abstract static class GraalHPyUnicodeDecodeCharset extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object charPtr, - @Cached(parameters = "hpyContext") HPyFromCharPointerNode fromCharPointerNode) { - return fromCharPointerNode.execute(hpyContext, charPtr, getFSDefault()); - } - - @TruffleBoundary - static Encoding getFSDefault() { - String fileEncoding = System.getProperty("file.encoding"); - if (fileEncoding != null) { - try { - return Encoding.valueOf(fileEncoding.replace('-', '_')); - } catch (IllegalArgumentException e) { - // avoid any fatal Java exceptions; fall through - } - } - // fall back to UTF-8 - return Encoding.UTF_8; - } - } - - @HPyContextFunction("ctx_Unicode_DecodeFSDefaultAndSize") - @GenerateUncached - public abstract static class GraalHPyUnicodeDecodeCharsetAndSize extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object charPtr, long lsize, - @Cached(parameters = "hpyContext") HPyFromCharPointerNode fromCharPointerNode) { - Encoding fsDefault = GraalHPyUnicodeDecodeCharset.getFSDefault(); - try { - return fromCharPointerNode.execute(hpyContext, charPtr, PInt.intValueExact(lsize), fsDefault, true); - } catch (OverflowException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } - } - - @HPyContextFunction("ctx_Unicode_DecodeASCII") - @GenerateUncached - public abstract static class GraalHPyUnicodeDecodeASCII extends HPyQuaternaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object charPtr, long size, Object errorsPtr, - @Cached(parameters = "hpyContext") GraalHPyCAccess.IsNullNode isNullNode, - @Cached(parameters = "hpyContext") HPyFromCharPointerNode fromCharPointerNode, - @Cached(parameters = "hpyContext") GraalHPyCAccess.ReadI8ArrayNode readI8ArrayNode, - @Cached TruffleString.FromJavaStringNode fromJavaStringNode, - @Cached PRaiseNode raiseNode, - @Cached TruffleString.EqualNode equalNode) { - CodingErrorAction errorAction; - if (isNullNode.execute(hpyContext, errorsPtr)) { - errorAction = CodingErrorAction.REPORT; - } else { - TruffleString errors = fromCharPointerNode.execute(hpyContext, errorsPtr, false); - errorAction = CodecsModuleBuiltins.convertCodingErrorAction(errors, equalNode); - } - byte[] bytes = readI8ArrayNode.execute(hpyContext, charPtr, 0, size); - String decoded = decode(StandardCharsets.US_ASCII, errorAction, bytes); - if (decoded != null) { - return fromJavaStringNode.execute(decoded, TS_ENCODING); - } - // TODO: refactor helper nodes for CodecsModuleBuiltins to use them here - throw raiseNode.raise(PythonBuiltinClassType.UnicodeDecodeError, ErrorMessages.MALFORMED_INPUT); - } - - @TruffleBoundary - static String decode(Charset charset, CodingErrorAction errorAction, byte[] bytes) { - try { - return charset.newDecoder().onMalformedInput(errorAction).onUnmappableCharacter(errorAction).decode(ByteBuffer.wrap(bytes)).toString(); - } catch (CharacterCodingException ex) { - return null; - } - } - } - - @HPyContextFunction("ctx_Unicode_DecodeLatin1") - @GenerateUncached - public abstract static class GraalHPyUnicodeDecodeLatin1 extends HPyQuaternaryContextFunction { - - @Specialization - Object doGeneric(GraalHPyContext hpyContext, Object charPtr, long lsize, @SuppressWarnings("unused") Object errorsPtr, - @Cached(parameters = "hpyContext") HPyFromCharPointerNode fromCharPointerNode) { - if (PInt.isIntRange(lsize)) { - /* - * If we have ISO-8859-1, we can just force the encoding and short-circuit the error - * reading etc since there cannot be an invalid byte - */ - return fromCharPointerNode.execute(hpyContext, charPtr, (int) lsize, Encoding.ISO_8859_1, true); - } - throw CompilerDirectives.shouldNotReachHere(); - } - } - - @HPyContextFunction("ctx_Unicode_ReadChar") - @GenerateUncached - public abstract static class GraalHPyUnicodeReadChar extends HPyTernaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object unicodeObject, long index, - @Bind("this") Node inliningTarget, - @Cached PyUnicodeReadCharNode unicodeReadChar) { - return unicodeReadChar.execute(inliningTarget, unicodeObject, index); - } - } - - @HPyContextFunction("ctx_AsPyObject") - @GenerateUncached - public abstract static class GraalHPyAsPyObject extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object object, - @Cached PythonToNativeNewRefNode toPyObjectPointerNode) { - return toPyObjectPointerNode.execute(object); - } - } - - @HPyContextFunction("ctx_Bytes_AsString") - @HPyContextFunction("ctx_Bytes_AS_STRING") - @GenerateUncached - public abstract static class GraalHPyBytesAsString extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object object, - @Cached PRaiseNode raiseNode) { - if (object instanceof PBytes bytes) { - return PySequenceArrayWrapper.ensureNativeSequence(bytes); - } - throw raiseNode.raise(TypeError, ErrorMessages.EXPECTED_BYTES_P_FOUND, object); - } - } - - @HPyContextFunction("ctx_Bytes_Size") - @HPyContextFunction("ctx_Bytes_GET_SIZE") - @GenerateUncached - public abstract static class GraalHPyBytesGetSize extends HPyBinaryContextFunction { - - @Specialization - static long doGeneric(@SuppressWarnings("unused") Object hpyContext, Object object, - @Bind("this") Node inliningTarget, - @Cached SequenceNodes.LenNode lenNode, - @Cached PRaiseNode raiseNode) { - if (object instanceof PBytes) { - return lenNode.execute(inliningTarget, (PSequence) object); - } - throw raiseNode.raise(TypeError, ErrorMessages.EXPECTED_BYTES_P_FOUND, object); - } - } - - @HPyContextFunction("ctx_Bytes_FromString") - @GenerateUncached - public abstract static class GraalHPyBytesFromString extends HPyBinaryContextFunction { - - @Specialization - static PBytes doGeneric(GraalHPyContext hpyContext, Object charPtr, - @Bind("this") Node inliningTarget, - @Cached CastToJavaIntExactNode castToJavaIntNode, - @Cached(parameters = "hpyContext") HPyCallHelperFunctionNode callHelperNode, - @Cached(parameters = "hpyContext") GraalHPyCAccess.ReadI8ArrayNode readI8ArrayNode, - @Cached PRaiseNode raiseNode, - @Cached PythonObjectFactory factory) { - int size; - try { - size = castToJavaIntNode.execute(inliningTarget, callHelperNode.call(hpyContext, GraalHPyNativeSymbol.GRAAL_HPY_STRLEN, charPtr)); - } catch (PException e) { - throw raiseNode.raise(OverflowError, ErrorMessages.BYTE_STR_IS_TOO_LARGE); - } - byte[] bytes = readI8ArrayNode.execute(hpyContext, charPtr, 0, size); - return factory.createBytes(bytes); - } - } - - @HPyContextFunction("ctx_Bytes_FromStringAndSize") - @GenerateUncached - public abstract static class GraalHPyBytesFromStringAndSize extends HPyTernaryContextFunction { - - @Specialization - static PBytes doGeneric(GraalHPyContext hpyContext, Object charPtr, long lsize, - @Cached(parameters = "hpyContext") GraalHPyCAccess.IsNullNode isNullNode, - @Cached(parameters = "hpyContext") GraalHPyCAccess.ReadI8ArrayNode readI8ArrayNode, - @Cached PRaiseNode raiseNode, - @Cached PythonObjectFactory factory) { - if (isNullNode.execute(hpyContext, charPtr)) { - throw raiseNode.raise(ValueError, ErrorMessages.NULL_CHAR_PASSED); - } - if (lsize < 0) { - throw raiseNode.raise(SystemError, ErrorMessages.NEGATIVE_SIZE_PASSED); - } - if (lsize == 0) { - return factory.createEmptyBytes(); - } - byte[] bytes = readI8ArrayNode.execute(hpyContext, charPtr, 0, lsize); - return factory.createBytes(bytes); - } - } - - @HPyContextFunction("ctx_IsTrue") - @GenerateUncached - public abstract static class GraalHPyIsTrue extends HPyBinaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object object, - @Bind("this") Node inliningTarget, - @Cached PyObjectIsTrueNode isTrueNode) { - return PInt.intValue(isTrueNode.execute(null, inliningTarget, object)); - } - } - - @HPyContextFunction("ctx_GetAttr") - @GenerateUncached - public abstract static class GraalHPyGetAttr extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object receiver, Object key, - @Bind("this") Node inliningTarget, - @Cached PyObjectGetAttrO getAttributeNode) { - return getAttributeNode.execute(null, inliningTarget, receiver, key); - } - } - - @HPyContextFunction("ctx_GetAttr_s") - @GenerateUncached - public abstract static class GraalHPyGetAttrS extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object receiver, Object charPtr, - @Bind("this") Node inliningTarget, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached PyObjectGetAttr getAttributeNode) { - return getAttributeNode.execute(inliningTarget, receiver, fromCharPointerNode.execute(charPtr)); - } - } - - @HPyContextFunction("ctx_Type_FromSpec") - @GenerateUncached - public abstract static class GraalHPyTypeFromSpec extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object typeSpecPtr, Object typeSpecParamArrayPtr, - @Cached HPyCreateTypeFromSpecNode createTypeFromSpecNode) { - Object newType = createTypeFromSpecNode.execute(hpyContext, typeSpecPtr, typeSpecParamArrayPtr); - assert PGuards.isClassUncached(newType) : "Object created from type spec is not a type"; - return newType; - } - } - - @HPyContextFunction("ctx_HasAttr") - @GenerateUncached - public abstract static class GraalHPyHasAttr extends HPyTernaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object receiver, Object key, - @Bind("this") Node inliningTarget, - @Cached PyObjectGetAttrO getAttributeNode) { - try { - Object attr = getAttributeNode.execute(null, inliningTarget, receiver, key); - return PInt.intValue(attr != PNone.NO_VALUE); - } catch (PException e) { - return 0; - } - } - } - - @HPyContextFunction("ctx_HasAttr_s") - @GenerateUncached - public abstract static class GraalHPyHasAttrS extends HPyTernaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object receiver, Object charPtr, - @Bind("this") Node inliningTarget, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached PyObjectGetAttr getAttributeNode) { - try { - Object attr = getAttributeNode.execute(inliningTarget, receiver, fromCharPointerNode.execute(charPtr)); - return PInt.intValue(attr != PNone.NO_VALUE); - } catch (PException e) { - return 0; - } - } - } - - @HPyContextFunction("ctx_SetAttr") - @GenerateUncached - public abstract static class GraalHPySetAttr extends HPyQuaternaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object receiver, Object key, Object value, - @Bind("this") Node inliningTarget, - @Cached PyObjectSetAttrO setAttrNode) { - if (value == NULL_HANDLE_DELEGATE) { - setAttrNode.execute(null, inliningTarget, receiver, key, PNone.NO_VALUE); - } else { - setAttrNode.execute(null, inliningTarget, receiver, key, value); - } - return 0; - } - } - - @HPyContextFunction("ctx_SetAttr_s") - @GenerateUncached - public abstract static class GraalHPySetAttrS extends HPyQuaternaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object receiver, Object charPtr, Object value, - @Bind("this") Node inliningTarget, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached PyObjectSetAttr setAttrNode) { - TruffleString key = fromCharPointerNode.execute(charPtr); - if (value == NULL_HANDLE_DELEGATE) { - setAttrNode.execute(inliningTarget, receiver, key, PNone.NO_VALUE); - } else { - setAttrNode.execute(inliningTarget, receiver, key, value); - } - return 0; - } - } - - @HPyContextFunction("ctx_GetItem") - @HPyContextFunction("ctx_GetItem_i") - @GenerateUncached - public abstract static class GraalHPyGetItem extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object receiver, Object key, - @Bind("this") Node inliningTarget, - @Cached PyObjectGetItem getItemNode) { - return getItemNode.execute(null, inliningTarget, receiver, key); - } - } - - @HPyContextFunction("ctx_GetItem_s") - @GenerateUncached - public abstract static class GraalHPyGetItemS extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object receiver, Object charPtr, - @Bind("this") Node inliningTarget, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached PyObjectGetItem getItemNode) { - return getItemNode.execute(null, inliningTarget, receiver, fromCharPointerNode.execute(charPtr)); - } - } - - @HPyContextFunction("ctx_SetItem") - @HPyContextFunction("ctx_SetItem_i") - @GenerateUncached - public abstract static class GraalHPySetItem extends HPyQuaternaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object receiver, Object key, Object value, - @Bind("this") Node inliningTarget, - @Cached PyObjectSetItem setItemNode) { - setItemNode.execute(null, inliningTarget, receiver, key, value); - return 0; - } - } - - @HPyContextFunction("ctx_SetItem_s") - @GenerateUncached - public abstract static class GraalHPySetItemS extends HPyQuaternaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object receiver, Object charPtr, Object value, - @Bind("this") Node inliningTarget, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached PyObjectSetItem setItemNode) { - setItemNode.execute(null, inliningTarget, receiver, fromCharPointerNode.execute(charPtr), value); - return 0; - } - } - - @HPyContextFunction("ctx_DelItem") - @HPyContextFunction("ctx_DelItem_i") - @GenerateUncached - public abstract static class GraalHPyDelItem extends HPyTernaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object receiver, Object key, - @Bind("this") Node inliningTarget, - @Cached PyObjectDelItem delItemNode) { - delItemNode.execute(null, inliningTarget, receiver, key); - return 0; - } - } - - @HPyContextFunction("ctx_DelItem_s") - @GenerateUncached - public abstract static class GraalHPyDelItemS extends HPyTernaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object receiver, Object charPtr, - @Bind("this") Node inliningTarget, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached PyObjectDelItem delItemNode) { - delItemNode.execute(null, inliningTarget, receiver, fromCharPointerNode.execute(charPtr)); - return 0; - } - } - - @HPyContextFunction("ctx_FromPyObject") - @GenerateUncached - public abstract static class GraalHPyFromPyObject extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object object, - @Cached NativeToPythonNode toJavaNode) { - // IMPORTANT: this is not stealing the reference. The CPython implementation - // actually increases the reference count by 1. - return toJavaNode.execute(object); - } - } - - @HPyContextFunction("ctx_New") - @GenerateUncached - public abstract static class GraalHPyNew extends HPyTernaryContextFunction { - private static final TruffleLogger LOGGER = GraalHPyContext.getLogger(GraalHPyNew.class); - public static final String INVALID_BUILT_IN_SHAPE = "invalid built-in shape"; - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object type, Object dataOutVar, - @Bind("this") Node inliningTarget, - @Cached IsTypeNode isTypeNode, - @Cached PRaiseNode.Lazy raiseNode, - @Cached PythonObjectFactory factory, - @Cached(parameters = "hpyContext") GraalHPyCAccess.AllocateNode allocateNode, - @Cached(parameters = "hpyContext") GraalHPyCAccess.WritePointerNode writePointerNode, - @Cached InlinedExactClassProfile classProfile) { - - Object profiledTypeObject = classProfile.profile(inliningTarget, type); - - // check if argument is actually a type - if (!isTypeNode.execute(inliningTarget, profiledTypeObject)) { - return raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.HPY_NEW_ARG_1_MUST_BE_A_TYPE); - } - - Object dataPtr = null; - Object destroyFunc = null; - Object defaultCallFunc = null; - - if (profiledTypeObject instanceof PythonClass clazz) { - // allocate native space - long basicSize = clazz.getBasicSize(); - if (basicSize != -1) { - dataPtr = allocateNode.calloc(hpyContext, 1, basicSize); - destroyFunc = clazz.getHPyDestroyFunc(); - - // write data pointer to out var - writePointerNode.write(hpyContext, dataOutVar, dataPtr); - - if (LOGGER.isLoggable(Level.FINEST)) { - LOGGER.finest(PythonUtils.formatJString("Allocated HPy object with native space of size %d at %s", basicSize, dataPtr)); - } - // TODO(fa): add memory tracing - } - defaultCallFunc = clazz.getHPyDefaultCallFunc(); - } - - int builtinShape = GraalHPyDef.getBuiltinShapeFromHiddenAttribute(profiledTypeObject); - PythonObject pythonObject = createFromBuiltinShape(builtinShape, profiledTypeObject, dataPtr, factory); - - if (destroyFunc != null) { - hpyContext.createHandleReference(pythonObject, dataPtr, destroyFunc != PNone.NO_VALUE ? destroyFunc : null); - } - if (defaultCallFunc != null) { - GraalHPyData.setHPyCallFunction(pythonObject, defaultCallFunc); - } - - return pythonObject; - } - - static PythonObject createFromBuiltinShape(int builtinShape, Object type, Object dataPtr, PythonObjectFactory factory) { - PythonObject result = switch (builtinShape) { - case HPyType_BUILTIN_SHAPE_LEGACY, HPyType_BUILTIN_SHAPE_OBJECT -> factory.createPythonHPyObject(type, dataPtr); - case HPyType_BUILTIN_SHAPE_TYPE -> throw CompilerDirectives.shouldNotReachHere("built-in shape type not yet implemented"); - case HPyType_BUILTIN_SHAPE_LONG -> factory.createInt(type, BigInteger.ZERO); - case HPyType_BUILTIN_SHAPE_FLOAT -> factory.createFloat(type, 0.0); - case HPyType_BUILTIN_SHAPE_UNICODE -> factory.createString(type, T_EMPTY_STRING); - case HPyType_BUILTIN_SHAPE_TUPLE -> factory.createEmptyTuple(type); - case HPyType_BUILTIN_SHAPE_LIST -> factory.createList(type); - default -> throw CompilerDirectives.shouldNotReachHere(INVALID_BUILT_IN_SHAPE); - }; - if (builtinShape != HPyType_BUILTIN_SHAPE_LEGACY && builtinShape != HPyType_BUILTIN_SHAPE_OBJECT) { - GraalHPyData.setHPyNativeSpace(result, dataPtr); - } - return result; - } - } - - @HPyContextFunction("ctx_AsStruct_Object") - @HPyContextFunction("ctx_AsStruct_Legacy") - @HPyContextFunction("ctx_AsStruct_Type") - @HPyContextFunction("ctx_AsStruct_Long") - @HPyContextFunction("ctx_AsStruct_Float") - @HPyContextFunction("ctx_AsStruct_Unicode") - @HPyContextFunction("ctx_AsStruct_Tuple") - @HPyContextFunction("ctx_AsStruct_List") - @GenerateUncached - public abstract static class GraalHPyCast extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object object, - @Bind("this") Node inliningTarget, - @Cached HPyGetNativeSpacePointerNode getNativeSpacePointerNode) { - // we can also just return NO_VALUE since that will be interpreter as NULL - return getNativeSpacePointerNode.execute(inliningTarget, object); - } - } - - @HPyContextFunction("ctx_Type_GenericNew") - @GenerateUncached - public abstract static class GraalHPyTypeGenericNew extends HPy5ContextFunction { - - private static final TruffleLogger LOGGER = GraalHPyContext.getLogger(GraalHPyTypeGenericNew.class); - - @Specialization - @SuppressWarnings("unused") - static Object doGeneric(GraalHPyContext hpyContext, Object type, Object args, long nargs, Object kw, - @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, - @Cached(parameters = "hpyContext") GraalHPyCAccess.AllocateNode allocateNode, - @Cached InlinedExactClassProfile classProfile) { - - Object profiledTypeObject = classProfile.profile(inliningTarget, type); - Object dataPtr = null; - Object destroyFunc = null; - - if (type instanceof PythonClass clazz) { - long basicSize = clazz.getBasicSize(); - if (basicSize != -1) { - // we fully control this attribute; if it is there, it's always a long - dataPtr = allocateNode.calloc(hpyContext, 1, basicSize); - destroyFunc = clazz.getHPyDestroyFunc(); - - if (LOGGER.isLoggable(Level.FINEST)) { - LOGGER.finest(PythonUtils.formatJString("Allocated HPy object with native space of size %d at %s", basicSize, dataPtr)); - } - // TODO(fa): add memory tracing - } - } - - int builtinShape = GraalHPyDef.getBuiltinShapeFromHiddenAttribute(profiledTypeObject); - PythonObject pythonObject = GraalHPyNew.createFromBuiltinShape(builtinShape, type, dataPtr, factory); - - if (destroyFunc != null) { - hpyContext.createHandleReference(pythonObject, dataPtr, destroyFunc != PNone.NO_VALUE ? destroyFunc : null); - } - return pythonObject; - } - } - - @HPyContextFunction("ctx_Absolute") - @GenerateUncached - public abstract static class GraalHPyAbsolute extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object arg, - @Cached ReadAttributeFromObjectNode readAttributeFromObjectNode, - @Cached CallUnaryMethodNode callNode) { - Object builtinFunction = readAttributeFromObjectNode.execute(hpyContext.getContext().getBuiltins(), BuiltinNames.T_ABS); - return callNode.executeObject(builtinFunction, arg); - } - } - - @HPyContextFunction("ctx_Long") - @GenerateUncached - public abstract static class GraalHPyLong extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object arg, - @Cached ReadAttributeFromObjectNode readAttributeFromObjectNode, - @Cached CallUnaryMethodNode callNode) { - Object builtinFunction = readAttributeFromObjectNode.execute(hpyContext.getContext().getBuiltins(), BuiltinNames.T_INT); - return callNode.executeObject(builtinFunction, arg); - } - } - - @HPyContextFunction("ctx_Float") - @GenerateUncached - public abstract static class GraalHPyFloat extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object arg, - @Cached ReadAttributeFromObjectNode readAttributeFromObjectNode, - @Cached CallUnaryMethodNode callNode) { - Object builtinFunction = readAttributeFromObjectNode.execute(hpyContext.getContext().getBuiltins(), BuiltinNames.T_FLOAT); - return callNode.executeObject(builtinFunction, arg); - } - } - - @HPyContextFunction("ctx_Str") - @GenerateUncached - public abstract static class GraalHPyStr extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object arg, - @Cached ReadAttributeFromObjectNode readAttributeFromObjectNode, - @Cached CallUnaryMethodNode callNode) { - Object builtinFunction = readAttributeFromObjectNode.execute(hpyContext.getContext().getBuiltins(), BuiltinNames.T_STR); - return callNode.executeObject(builtinFunction, arg); - } - } - - @HPyContextFunction("ctx_Repr") - @GenerateUncached - public abstract static class GraalHPyRepr extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object arg, - @Cached ReadAttributeFromObjectNode readAttributeFromObjectNode, - @Cached CallUnaryMethodNode callNode) { - Object builtinFunction = readAttributeFromObjectNode.execute(hpyContext.getContext().getBuiltins(), BuiltinNames.T_REPR); - return callNode.executeObject(builtinFunction, arg); - } - } - - @HPyContextFunction("ctx_ASCII") - @GenerateUncached - public abstract static class GraalHPyASCII extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object arg, - @Cached ReadAttributeFromObjectNode readAttributeFromObjectNode, - @Cached CallUnaryMethodNode callNode) { - Object builtinFunction = readAttributeFromObjectNode.execute(hpyContext.getContext().getBuiltins(), BuiltinNames.T_ASCII); - return callNode.executeObject(builtinFunction, arg); - } - } - - @HPyContextFunction("ctx_Bytes") - @GenerateUncached - public abstract static class GraalHPyBytes extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object arg, - @Cached ReadAttributeFromObjectNode readAttributeFromObjectNode, - @Cached CallUnaryMethodNode callNode) { - Object builtinFunction = readAttributeFromObjectNode.execute(hpyContext.getContext().getBuiltins(), BuiltinNames.T_BYTES); - return callNode.executeObject(builtinFunction, arg); - } - } - - @HPyContextFunction("ctx_Hash") - @GenerateUncached - public abstract static class GraalHPyHash extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object arg, - @Cached ReadAttributeFromObjectNode readAttributeFromObjectNode, - @Cached CallUnaryMethodNode callNode) { - Object builtinFunction = readAttributeFromObjectNode.execute(hpyContext.getContext().getBuiltins(), BuiltinNames.T_HASH); - return callNode.executeObject(builtinFunction, arg); - } - } - - @HPyContextFunction("ctx_Length") - @GenerateUncached - public abstract static class GraalHPyLength extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object arg, - @Cached ReadAttributeFromObjectNode readAttributeFromObjectNode, - @Cached CallUnaryMethodNode callNode) { - Object builtinFunction = readAttributeFromObjectNode.execute(hpyContext.getContext().getBuiltins(), BuiltinNames.T_LEN); - return callNode.executeObject(builtinFunction, arg); - } - } - - @HPyContextFunction("ctx_RichCompare") - @GenerateUncached - public abstract static class GraalHPyRichcompare extends HPyQuaternaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object receiver, Object arg1, int arg2, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached LookupSpecialMethodNode.Dynamic lookupRichcmp, - @Cached CallTernaryMethodNode callRichcmp) { - Object richcmp = lookupRichcmp.execute(null, inliningTarget, getClassNode.execute(inliningTarget, receiver), SpecialMethodNames.T___TRUFFLE_RICHCOMPARE__, receiver); - return callRichcmp.execute(null, richcmp, receiver, arg1, arg2); - } - } - - @HPyContextFunction("ctx_RichCompareBool") - @GenerateUncached - public abstract static class GraalHPyRichcompareBool extends HPyQuaternaryContextFunction { - - @Specialization - static Object doGeneric(Object ctx, Object receiver, Object arg1, int arg2, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached LookupSpecialMethodNode.Dynamic lookupRichcmp, - @Cached CallTernaryMethodNode callRichcmp, - @Cached PyObjectIsTrueNode isTrueNode) { - Object result = GraalHPyRichcompare.doGeneric(ctx, receiver, arg1, arg2, inliningTarget, getClassNode, lookupRichcmp, callRichcmp); - return PInt.intValue(isTrueNode.execute(null, inliningTarget, result)); - } - } - - @HPyContextFunction("ctx_Index") - @GenerateUncached - public abstract static class GraalHPyAsIndex extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object object, - @Bind("this") Node inliningTarget, - @Cached PyNumberIndexNode indexNode) { - return indexNode.execute(null, inliningTarget, object); - } - } - - @HPyContextFunction("ctx_Number_Check") - @GenerateUncached - @ImportStatic(SpecialMethodSlot.class) - public abstract static class GraalHPyIsNumber extends HPyBinaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object object, - @Bind("this") Node inliningTarget, - @Cached PyIndexCheckNode indexCheckNode, - @Cached CanBeDoubleNode canBeDoubleNode, - @Cached GetClassNode getClassNode, - @Cached(parameters = "Int") LookupCallableSlotInMRONode lookup) { - if (indexCheckNode.execute(inliningTarget, object) || canBeDoubleNode.execute(inliningTarget, object)) { - return 1; - } - Object receiverType = getClassNode.execute(inliningTarget, object); - return PInt.intValue(lookup.execute(receiverType) != PNone.NO_VALUE); - } - } - - @HPyContextFunction("ctx_Tuple_FromArray") - @GenerateUncached - public abstract static class GraalHPyTupleFromArray extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object arrayPtr, long nelements, - @Bind("this") Node inliningTarget, - @Cached CastToJavaIntExactNode castToJavaIntExactNode, - @Cached(parameters = "hpyContext") GraalHPyCAccess.ReadHPyArrayNode readHPyArrayNode, - @Cached PythonObjectFactory factory) { - int n; - try { - n = castToJavaIntExactNode.execute(inliningTarget, nelements); - } catch (CannotCastException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(castToJavaIntExactNode, PythonBuiltinClassType.MemoryError); - } - - Object[] elements = readHPyArrayNode.execute(hpyContext, arrayPtr, 0, n); - return factory.createTuple(elements); - } - } - - @HPyContextFunction("ctx_TupleBuilder_New") - @HPyContextFunction("ctx_ListBuilder_New") - @GenerateUncached - public abstract static class GraalHPyBuilderNew extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, long lcapacity, - @Cached HPyAsHandleNode asHandleNode) { - int capacity; - if (PInt.isIntRange(lcapacity) && (capacity = (int) lcapacity) >= 0) { - Object[] data = new Object[capacity]; - Arrays.fill(data, PNone.NONE); - return asHandleNode.execute(new ObjectSequenceStorage(data)); - } - return NULL_HANDLE; - } - } - - @HPyContextFunction("ctx_TupleBuilder_Set") - @HPyContextFunction("ctx_ListBuilder_Set") - @GenerateUncached - public abstract static class GraalHPyBuilderSet extends HPyQuaternaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object builderHandle, long lidx, Object value, - @Bind("this") Node inliningTarget, - @Cached HPyAsPythonObjectNode asPythonObjectNode, - @Cached CastToJavaIntExactNode castToJavaIntExactNode, - @Cached SequenceStorageNodes.SetItemDynamicNode setItemNode) { - Object builder = asPythonObjectNode.execute(builderHandle); - if (builder instanceof ObjectSequenceStorage storage) { - try { - int idx = castToJavaIntExactNode.execute(inliningTarget, lidx); - setItemNode.execute(null, NoGeneralizationNode.DEFAULT, storage, idx, value); - } catch (CannotCastException e) { - // fall through - } - return 0; - } - /* - * that's really unexpected since the C signature should enforce a valid builder but - * someone could have messed it up - */ - throw CompilerDirectives.shouldNotReachHere("invalid builder object"); - } - } - - @GenerateCached(false) - abstract static class HPyBuilderBuild extends HPyBinaryContextFunction { - - boolean isTupleBuilder() { - throw CompilerDirectives.shouldNotReachHere(); - } - - @Specialization - Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object builderHandle, - @Bind("this") Node inliningTarget, - @Cached HPyCloseAndGetHandleNode closeAndGetHandleNode, - @Cached PythonObjectFactory factory) { - ObjectSequenceStorage builder = cast(closeAndGetHandleNode.execute(inliningTarget, builderHandle)); - if (builder == null) { - /* - * that's really unexpected since the C signature should enforce a valid builder but - * someone could have messed it up - */ - throw CompilerDirectives.shouldNotReachHere("invalid builder object"); - } - return isTupleBuilder() ? factory.createTuple(builder) : factory.createList(builder); - } - - static ObjectSequenceStorage cast(Object object) { - if (object instanceof ObjectSequenceStorage) { - return (ObjectSequenceStorage) object; - } - return null; - } - } - - @HPyContextFunction("ctx_TupleBuilder_Build") - @GenerateUncached - public abstract static class GraalHPyTupleBuilderBuild extends HPyBuilderBuild { - @Override - final boolean isTupleBuilder() { - return true; - } - } - - @HPyContextFunction("ctx_ListBuilder_Build") - @GenerateUncached - public abstract static class GraalHPyListBuilderBuild extends HPyBuilderBuild { - @Override - final boolean isTupleBuilder() { - return false; - } - } - - @HPyContextFunction("ctx_TupleBuilder_Cancel") - @HPyContextFunction("ctx_ListBuilder_Cancel") - @GenerateUncached - public abstract static class GraalHPyBuilderCancel extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object builderHandle, - @Bind("this") Node inliningTarget, - @Cached HPyCloseAndGetHandleNode closeAndGetHandleNode) { - // be pedantic and also check what we are cancelling - ObjectSequenceStorage builder = HPyBuilderBuild.cast(closeAndGetHandleNode.execute(inliningTarget, builderHandle)); - if (builder == null) { - /* - * that's really unexpected since the C signature should enforce a valid builder but - * someone could have messed it up - */ - throw CompilerDirectives.shouldNotReachHere("invalid builder object"); - } - return 0; - } - } - - @HPyContextFunction("ctx_Tracker_New") - @GenerateUncached - public abstract static class GraalHPyTrackerNew extends HPyBinaryContextFunction { - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, long lcapacity, - @Cached HPyAsHandleNode asHandleNode) { - int capacity; - if (PInt.isIntRange(lcapacity) && (capacity = (int) lcapacity) >= 0) { - return asHandleNode.execute(new GraalHPyTracker(capacity)); - } - return NULL_HANDLE; - } - } - - @HPyContextFunction("ctx_Tracker_Add") - @GenerateUncached - public abstract static class GraalHPyTrackerAdd extends HPyTernaryContextFunction { - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object builderArg, Object item, - @Bind("this") Node inliningTarget, - @Cached HPyAsPythonObjectNode asPythonObjectNode, - @Cached HPyEnsureHandleNode ensureHandleNode) { - GraalHPyTracker builder = cast(asPythonObjectNode.execute(builderArg)); - if (builder == null) { - // that's really unexpected since the C signature should enforce a valid builder - // but someone could have messed it up - throw CompilerDirectives.shouldNotReachHere("invalid builder object"); - } - try { - GraalHPyHandle handle = ensureHandleNode.execute(inliningTarget, item); - if (handle != null) { - builder.add(handle); - } - } catch (OverflowException | OutOfMemoryError e) { - return -1; - } - return 0; - } - - static GraalHPyTracker cast(Object object) { - if (object instanceof GraalHPyTracker) { - return (GraalHPyTracker) object; - } - return null; - } - } - - @HPyContextFunction("ctx_Tracker_Close") - @GenerateUncached - public abstract static class GraalHPyTrackerCleanup extends HPyBinaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object builderHandle, - @Bind("this") Node inliningTarget, - @Cached HPyCloseAndGetHandleNode closeAndGetHandleNode, - @Cached HPyCloseHandleNode closeHandleNode) { - GraalHPyTracker builder = GraalHPyTrackerAdd.cast(closeAndGetHandleNode.execute(inliningTarget, builderHandle)); - if (builder == null) { - // that's really unexpected since the C signature should enforce a valid builder - // but someone could have messed it up - throw CompilerDirectives.shouldNotReachHere("invalid builder object"); - } - builder.free(inliningTarget, closeHandleNode); - return 0; - } - } - - @HPyContextFunction("ctx_Tracker_ForgetAll") - @GenerateUncached - public abstract static class GraalHPyTrackerForgetAll extends HPyBinaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object builderArg, - @Cached HPyAsPythonObjectNode asPythonObjectNode) { - GraalHPyTracker builder = GraalHPyTrackerAdd.cast(asPythonObjectNode.execute(builderArg)); - if (builder == null) { - // that's really unexpected since the C signature should enforce a valid builder - // but someone could have messed it up - throw CompilerDirectives.shouldNotReachHere("invalid builder object"); - } - builder.removeAll(); - return 0; - } - } - - @HPyContextFunction("ctx_Callable_Check") - @GenerateUncached - public abstract static class GraalHPyIsCallable extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object object, - @Bind("this") Node inliningTarget, - @Cached PyCallableCheckNode callableCheck) { - return PInt.intValue(callableCheck.execute(inliningTarget, object)); - } - } - - @HPyContextFunction("ctx_CallTupleDict") - @GenerateUncached - public abstract static class GraalHPyCallTupleDict extends HPyQuaternaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object callable, Object argsObject, Object kwargsObject, - @Bind("this") Node inliningTarget, - @Cached ExecutePositionalStarargsNode expandArgsNode, - @Cached HashingStorageLen lenNode, - @Cached ExpandKeywordStarargsNode expandKwargsNode, - @Cached CallNode callNode, - @Cached PRaiseNode raiseNode) { - // check and expand args - Object[] args = castArgs(argsObject, expandArgsNode, raiseNode); - // check and expand kwargs - PKeyword[] keywords = castKwargs(inliningTarget, kwargsObject, lenNode, expandKwargsNode, raiseNode); - return callNode.executeWithoutFrame(callable, args, keywords); - } - - private static Object[] castArgs(Object args, - ExecutePositionalStarargsNode expandArgsNode, - PRaiseNode raiseNode) { - // this indicates that a NULL handle was passed (which is valid) - if (args == PNone.NO_VALUE) { - return PythonUtils.EMPTY_OBJECT_ARRAY; - } - if (PGuards.isPTuple(args)) { - return expandArgsNode.executeWith(null, args); - } - throw raiseNode.raise(TypeError, ErrorMessages.HPY_CALLTUPLEDICT_REQUIRES_ARGS_TUPLE_OR_NULL); - } - - private static PKeyword[] castKwargs(Node inliningTarget, Object kwargs, - HashingStorageLen lenNode, - ExpandKeywordStarargsNode expandKwargsNode, - PRaiseNode raiseNode) { - // this indicates that a NULL handle was passed (which is valid) - if (kwargs == PNone.NO_VALUE || isEmptyDict(inliningTarget, kwargs, lenNode)) { - return PKeyword.EMPTY_KEYWORDS; - } - if (PGuards.isDict(kwargs)) { - return expandKwargsNode.execute(inliningTarget, kwargs); - } - throw raiseNode.raise(TypeError, ErrorMessages.HPY_CALLTUPLEDICT_REQUIRES_KW_DICT_OR_NULL); - } - - private static boolean isEmptyDict(Node inliningTarget, Object delegate, HashingStorageLen lenNode) { - return delegate instanceof PDict && lenNode.execute(inliningTarget, ((PDict) delegate).getDictStorage()) == 0; - } - } - - @HPyContextFunction("ctx_Call") - @GenerateUncached - public abstract static class GraalHPyCall extends HPy5ContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object callable, Object args, long lnargs, Object kwnamesObj, - @Bind("this") Node inliningTarget, - @Cached(parameters = "hpyContext") GraalHPyCAccess.ReadHPyArrayNode readHPyArrayNode, - @Cached PyTupleSizeNode tupleSizeNode, - @Cached HPyPackKeywordArgsNode packKeywordArgsNode, - @Cached PRaiseNode raiseNode) { - - if (!PInt.isIntRange(lnargs)) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT, 0); - } - int nargs = (int) lnargs; - PTuple kwnames; - int nkw; - if (kwnamesObj instanceof PTuple) { - kwnames = (PTuple) kwnamesObj; - nkw = tupleSizeNode.execute(inliningTarget, kwnames); - } else { - nkw = 0; - kwnames = null; - } - - // positional args are from 'args[0]' ... 'args[nargs - 1]' - Object[] positionalArgs = readHPyArrayNode.execute(hpyContext, args, 0, nargs); - - PKeyword[] keywords; - if (nkw > 0) { - // keyword arg values are from 'args[nargs]' ... 'args[nargs + nkw - 1]' - Object[] kwObjs = readHPyArrayNode.execute(hpyContext, args, nargs, nkw); - keywords = packKeywordArgsNode.execute(inliningTarget, kwObjs, kwnames, nkw); - } else { - keywords = PKeyword.EMPTY_KEYWORDS; - } - - /* - * We use the uncached CallNode for now as a workaround because - * 'AbstractCallMethodNode.callerExceedsMaxSize' assumes that a call node is always - * under a root node. However, in cross-language calls, this may not be the case. - */ - return CallNode.executeUncached(callable, positionalArgs, keywords); - } - } - - @HPyContextFunction("ctx_CallMethod") - @GenerateUncached - @ImportStatic(PGuards.class) - public abstract static class GraalHPyCallMethod extends HPy5ContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, TruffleString name, Object args, long lnargs, Object kwnames, - @Bind("this") Node inliningTarget, - @Cached(parameters = "hpyContext") GraalHPyCAccess.ReadHPyArrayNode readHPyArrayNode, - @Cached PyTupleSizeNode tupleSizeNode, - @Cached HPyPackKeywordArgsNode packKeywordArgsNode, - @Cached PyObjectGetMethod getMethodNode, - @Cached CallNode callNode, - @Cached PRaiseNode raiseNode) { - - if (!PInt.isIntRange(lnargs)) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT, 0); - } - int nargs = (int) lnargs; - int nkw = kwnames != PNone.NO_VALUE ? tupleSizeNode.execute(inliningTarget, kwnames) : 0; - - // positional args are from 'args[0]' ... 'args[nargs - 1]' (including 'self') - Object[] positionalArgs = readHPyArrayNode.execute(hpyContext, args, 0, nargs); - Object receiver = positionalArgs[0]; - - Object callable = getMethodNode.execute(null, inliningTarget, receiver, name); - - PKeyword[] keywords; - if (nkw > 0) { - // check and expand kwargs - Object[] kwObjs = readHPyArrayNode.execute(hpyContext, args, nargs, nkw); - keywords = packKeywordArgsNode.execute(inliningTarget, kwObjs, (PTuple) kwnames, nkw); - } else { - keywords = PKeyword.EMPTY_KEYWORDS; - } - return callNode.executeWithoutFrame(callable, positionalArgs, keywords); - } - } - - @HPyContextFunction("ctx_Dump") - @GenerateUncached - public abstract static class GraalHPyDump extends HPyBinaryContextFunction { - - @Specialization - @TruffleBoundary - static int doGeneric(GraalHPyContext hpyContext, Object object) { - PythonContext context = hpyContext.getContext(); - Object type = GetClassNode.executeUncached(object); - PrintWriter stderr = new PrintWriter(context.getStandardErr()); - stderr.println("object type : " + type); - stderr.println("object type name: " + GetNameNode.executeUncached(type)); - - // the most dangerous part - stderr.println("object repr : "); - stderr.flush(); - try { - stderr.println(PyObjectReprAsTruffleStringNode.executeUncached(object).toJavaStringUncached()); - stderr.flush(); - } catch (PException | CannotCastException e) { - // errors are ignored at this point - } - return 0; - } - } - - @HPyContextFunction("ctx_Type") - @GenerateUncached - public abstract static class GraalHPyType extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object object, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode) { - return getClassNode.execute(inliningTarget, object); - } - } - - @HPyContextFunction("ctx_TypeCheck") - @GenerateUncached - public abstract static class GraalHPyTypeCheck extends HPyTernaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object object, Object type, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached IsSubtypeNode isSubtypeNode) { - return PInt.intValue(isSubtypeNode.execute(getClassNode.execute(inliningTarget, object), type)); - } - } - - @HPyContextFunction("ctx_Err_NewExceptionWithDoc") - @GenerateUncached - public abstract static class GraalHPyNewExceptionWithDoc extends HPy5ContextFunction { - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object namePtr, Object docPtr, Object base, Object dictObj, - @Bind("this") Node inliningTarget, - @Cached(parameters = "hpyContext") GraalHPyCAccess.IsNullNode isNullNode, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached CastToTruffleStringNode castToTruffleStringNode, - @Cached TruffleString.IndexOfCodePointNode indexOfCodepointNode, - @Cached TruffleString.CodePointLengthNode codepointLengthNode, - @Cached TruffleString.SubstringNode substringNode, - @Cached HashingStorageGetItem getHashingStorageItem, - @Cached HashingStorageSetItem setHashingStorageItem, - @Cached CallNode callTypeConstructorNode, - @Cached PRaiseNode raiseNode, - @Cached PythonObjectFactory factory) { - TruffleString doc; - if (!isNullNode.execute(hpyContext, docPtr)) { - doc = fromCharPointerNode.execute(docPtr); - } else { - doc = null; - } - return createNewExceptionWithDoc(inliningTarget, namePtr, base, dictObj, doc, fromCharPointerNode, castToTruffleStringNode, indexOfCodepointNode, codepointLengthNode, substringNode, - getHashingStorageItem, - setHashingStorageItem, callTypeConstructorNode, raiseNode, factory); - } - - static Object createNewExceptionWithDoc(Node inliningTarget, Object namePtr, Object base, Object dictObj, TruffleString doc, - FromCharPointerNode fromCharPointerNode, - CastToTruffleStringNode castToTruffleStringNode, - TruffleString.IndexOfCodePointNode indexOfCodepointNode, - TruffleString.CodePointLengthNode codepointLengthNode, - TruffleString.SubstringNode substringNode, - HashingStorageGetItem getHashingStorageItem, - HashingStorageSetItem setHashingStorageItem, - CallNode callTypeConstructorNode, - PRaiseNode raiseNode, - PythonObjectFactory factory) { - - TruffleString name = fromCharPointerNode.execute(namePtr); - int len = codepointLengthNode.execute(name, TS_ENCODING); - int dotIdx = indexOfCodepointNode.execute(name, '.', 0, len, TS_ENCODING); - if (dotIdx < 0) { - throw raiseNode.raise(SystemError, ErrorMessages.NAME_MUST_BE_MOD_CLS); - } - - if (base == PNone.NO_VALUE) { - base = PythonBuiltinClassType.Exception; - } - PDict dict; - HashingStorage dictStorage; - if (dictObj == PNone.NO_VALUE) { - dictStorage = new DynamicObjectStorage(PythonLanguage.get(castToTruffleStringNode)); - dict = factory.createDict(dictStorage); - } else { - if (!(dictObj instanceof PDict)) { - /* - * CPython expects a PyDictObject and if not, it raises a - * ErrorMessages.BAD_INTERNAL_CALL. - */ - throw raiseNode.raise(SystemError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC); - } - dict = (PDict) dictObj; - dictStorage = dict.getDictStorage(); - } - - if (!getHashingStorageItem.hasKey(inliningTarget, dictStorage, SpecialAttributeNames.T___MODULE__)) { - dictStorage = setHashingStorageItem.execute(inliningTarget, dictStorage, SpecialAttributeNames.T___MODULE__, substringNode.execute(name, 0, dotIdx, TS_ENCODING, false)); - } - if (doc != null) { - dictStorage = setHashingStorageItem.execute(inliningTarget, dictStorage, SpecialAttributeNames.T___DOC__, doc); - } - dict.setDictStorage(dictStorage); - - PTuple bases; - if (base instanceof PTuple) { - bases = (PTuple) base; - } else { - bases = factory.createTuple(new Object[]{base}); - } - - return callTypeConstructorNode.executeWithoutFrame(PythonBuiltinClassType.PythonClass, substringNode.execute(name, dotIdx + 1, len - dotIdx - 1, TS_ENCODING, false), bases, dict); - } - } - - @HPyContextFunction("ctx_Err_NewException") - @GenerateUncached - public abstract static class GraalHPyNewException extends HPyQuaternaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object namePtr, Object base, Object dictObj, - @Bind("this") Node inliningTarget, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached CastToTruffleStringNode castToTruffleStringNode, - @Cached TruffleString.IndexOfCodePointNode indexOfCodepointNode, - @Cached TruffleString.CodePointLengthNode codepointLengthNode, - @Cached TruffleString.SubstringNode substringNode, - @Cached HashingStorageGetItem getHashingStorageItem, - @Cached HashingStorageSetItem setHashingStorageItem, - @Cached CallNode callTypeConstructorNode, - @Cached PRaiseNode raiseNode, - @Cached PythonObjectFactory factory) { - return GraalHPyNewExceptionWithDoc.createNewExceptionWithDoc(inliningTarget, namePtr, base, dictObj, null, fromCharPointerNode, castToTruffleStringNode, indexOfCodepointNode, - codepointLengthNode, - substringNode, getHashingStorageItem, setHashingStorageItem, callTypeConstructorNode, raiseNode, factory); - } - } - - @HPyContextFunction("ctx_Is") - @GenerateUncached - public abstract static class GraalHPyIs extends HPyTernaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object left, Object right, - @Cached IsNode isNode) { - return PInt.intValue(isNode.execute(left, right)); - } - } - - @HPyContextFunction("ctx_Import_ImportModule") - @GenerateUncached - public abstract static class GraalHPyImportModule extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object charPtr, - @Cached FromCharPointerNode fromCharPointerNode) { - return AbstractImportNode.importModule(fromCharPointerNode.execute(charPtr)); - } - } - - @HPyContextFunction("ctx_Field_Store") - @GenerateUncached - public abstract static class GraalHPyFieldStore extends HPyQuaternaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, PythonObject owner, Object hpyFieldPtr, Object referent, - @Bind("this") Node inliningTarget, - @Cached(parameters = "hpyContext") GraalHPyCAccess.WriteHPyFieldNode writeHPyFieldNode) { - writeHPyFieldNode.write(hpyContext, owner, hpyFieldPtr, referent); - return 0; - } - } - - @HPyContextFunction("ctx_Field_Load") - @GenerateUncached - public abstract static class GraalHPyFieldLoad extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, PythonObject owner, Object hpyFieldPtr, - @Bind("this") Node inliningTarget, - @Cached HPyFieldLoadNode hPyFieldLoadNode) { - return hPyFieldLoadNode.execute(inliningTarget, owner, hpyFieldPtr); - } - } - - @HPyContextFunction("ctx_Global_Store") - @GenerateUncached - public abstract static class GraalHPyGlobalStore extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object hpyGlobalPtr, Object value, - @Bind("this") Node inliningTarget, - @Cached(parameters = "hpyContext") GraalHPyCAccess.ReadPointerNode readPointerNode, - @Cached(parameters = "hpyContext") GraalHPyCAccess.WritePointerNode writePointerNode, - @Cached InlinedExactClassProfile typeProfile, - @CachedLibrary(limit = "3") InteropLibrary lib) { - Object hpyGlobal = typeProfile.profile(inliningTarget, readPointerNode.execute(hpyContext, hpyGlobalPtr, 0)); - - int idx = -1; - if (hpyGlobal instanceof GraalHPyHandle) { - // branch profiling with typeProfile - idx = ((GraalHPyHandle) hpyGlobal).getGlobalId(); - } else if (!(hpyGlobal instanceof Long) && lib.isNull(hpyGlobal)) { - // nothing to do - } else { - long bits; - if (hpyGlobal instanceof Long) { - // branch profile due to lib.asPointer usage in else branch - // and typeProfile - bits = (Long) hpyGlobal; - } else { - try { - bits = lib.asPointer(hpyGlobal); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } - if (GraalHPyBoxing.isBoxedHandle(bits)) { - idx = GraalHPyBoxing.unboxHandle(bits); - } - } - - // TODO: (tfel) do not actually allocate the index / free the existing one when - // value can be stored as tagged handle - idx = hpyContext.createGlobal(value, idx); - GraalHPyHandle newHandle = GraalHPyHandle.createGlobal(value, idx); - writePointerNode.execute(hpyContext, hpyGlobalPtr, 0, newHandle); - return 0; - } - } - - @HPyContextFunction("ctx_Global_Load") - @GenerateUncached - public abstract static class GraalHPyGlobalLoad extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object hpyGlobal, - @CachedLibrary(limit = "3") InteropLibrary lib) { - if (hpyGlobal instanceof GraalHPyHandle h) { - // branch profiling with typeProfile - return h.getDelegate(); - } else if (!(hpyGlobal instanceof Long) && lib.isNull(hpyGlobal)) { - // type profile influences first test - return NULL_HANDLE_DELEGATE; - } else { - long bits; - if (hpyGlobal instanceof Long) { - // branch profile due to lib.asPointer usage in else branch - // and typeProfile - bits = (Long) hpyGlobal; - } else { - try { - bits = lib.asPointer(hpyGlobal); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } - if (GraalHPyBoxing.isBoxedHandle(bits)) { - // if asHandleNode wasn't used above, it acts as a branch profile - // here. otherwise we're probably already pulling in a lot of code - // and are a bit too polymorphic - return hpyContext.getObjectForHPyGlobal(GraalHPyBoxing.unboxHandle(bits)); - } else { - // tagged handles can be returned directly - return bits; - } - } - } - } - - @HPyContextFunction("ctx_LeavePythonExecution") - @GenerateUncached - public abstract static class GraalHPyLeavePythonExecution extends HPyUnaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, - @Cached GilNode gil) { - PythonContext context = hpyContext.getContext(); - PythonThreadState threadState = context.getThreadState(PythonLanguage.get(gil)); - gil.release(context, true); - return threadState; - } - } - - @HPyContextFunction("ctx_ReenterPythonExecution") - @GenerateUncached - public abstract static class GraalHPyReenterPythonExecution extends HPyBinaryContextFunction { - - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, @SuppressWarnings("unused") Object threadState, - @Cached GilNode gil) { - // nothing to do with PThreadState in 'threadState' - gil.acquire(hpyContext.getContext()); - return 0; - } - } - - @HPyContextFunction("ctx_Contains") - @ImportStatic(SpecialMethodSlot.class) - @GenerateUncached - public abstract static class GraalHPyContains extends HPyTernaryContextFunction { - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object container, Object key, - @Bind("this") Node inliningTarget, - @Cached PySequenceContainsNode containsNode) { - return PInt.intValue(containsNode.execute(null, inliningTarget, container, key)); - } - } - - @HPyContextFunction("ctx_Type_IsSubtype") - @GenerateUncached - public abstract static class GraalHPyTypeIsSubtype extends HPyTernaryContextFunction { - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object derived, Object type, - @Cached IsSubtypeNode isSubtype) { - return PInt.intValue(isSubtype.execute(derived, type)); - } - } - - @HPyContextFunction("ctx_Type_GetName") - @GenerateUncached - public abstract static class GraalHPyTypeGetName extends HPyBinaryContextFunction { - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object type, - @Bind("this") Node inliningTarget, - @Cached HPyTypeGetNameNode getName) { - return getName.execute(inliningTarget, hpyContext, type); - } - } - - @HPyContextFunction("ctx_Dict_Keys") - @GenerateUncached - public abstract static class GraalHPyDictKeys extends HPyBinaryContextFunction { - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object dictObj, - @Bind("this") Node inliningTarget, - @Cached PyDictKeys keysNode, - @Cached PRaiseNode.Lazy raiseNode) { - if (dictObj instanceof PDict dict) { - return keysNode.execute(inliningTarget, dict); - } - throw raiseNode.get(inliningTarget).raise(SystemError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC); - } - } - - @HPyContextFunction("ctx_Dict_Copy") - @GenerateUncached - public abstract static class GraalHPyDictCopy extends HPyBinaryContextFunction { - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object dictObj, - @Bind("this") Node inliningTarget, - @Cached HashingStorageCopy copyNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (dictObj instanceof PDict dict) { - return factory.createDict(copyNode.execute(inliningTarget, dict.getDictStorage())); - } - throw raiseNode.get(inliningTarget).raise(SystemError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC); - } - } - - // see _HPyCapsule_key in the HPy API - public static final class CapsuleKey { - public static final byte Pointer = 0; - public static final byte Name = 1; - public static final byte Context = 2; - public static final byte Destructor = 3; - } - - @HPyContextFunction("ctx_Capsule_New") - @GenerateUncached - public abstract static class GraalHPyCapsuleNew extends HPyQuaternaryContextFunction { - - @Specialization - static PyCapsule doGeneric(GraalHPyContext hpyContext, Object pointer, Object namePtr, Object dtorPtr, - @Cached(parameters = "hpyContext") GraalHPyCAccess.ReadPointerNode readPointerNode, - @Cached(parameters = "hpyContext") GraalHPyCAccess.IsNullNode isNullNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode raiseNode) { - if (isNullNode.execute(hpyContext, pointer)) { - throw raiseNode.raise(ValueError, ErrorMessages.HPYCAPSULE_NEW_NULL_PTR_ERROR); - } - Object hpyDestructor = null; - if (!isNullNode.execute(hpyContext, dtorPtr)) { - Object cpyTrampoline = readPointerNode.read(hpyContext, dtorPtr, GraalHPyCField.HPyCapsule_Destructor__cpy_trampoline); - hpyDestructor = readPointerNode.read(hpyContext, dtorPtr, GraalHPyCField.HPyCapsule_Destructor__impl); - if (isNullNode.execute(hpyContext, cpyTrampoline) || isNullNode.execute(hpyContext, hpyDestructor)) { - throw raiseNode.raise(ValueError, ErrorMessages.INVALID_HPYCAPSULE_DESTRUCTOR); - } - } - PyCapsule capsule = factory.createCapsule(pointer, namePtr); - if (hpyDestructor != null) { - capsule.registerDestructor(hpyDestructor); - } - return capsule; - } - } - - @HPyContextFunction("ctx_Capsule_Get") - @GenerateUncached - public abstract static class GraalHPyCapsuleGet extends HPyQuaternaryContextFunction { - public static final TruffleString INCORRECT_NAME = tsLiteral("HPyCapsule_GetPointer called with incorrect name"); - - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object capsule, int key, Object namePtr, - @Bind("this") Node inliningTarget, - @Cached PyCapsuleNameMatchesNode nameMatchesNode, - @Cached PRaiseNode raiseNode) { - isLegalCapsule(capsule, key, raiseNode); - PyCapsule pyCapsule = (PyCapsule) capsule; - Object result; - switch (key) { - case CapsuleKey.Pointer -> { - if (!nameMatchesNode.execute(inliningTarget, pyCapsule.getName(), namePtr)) { - throw raiseNode.raise(ValueError, INCORRECT_NAME); - } - result = pyCapsule.getPointer(); - } - case CapsuleKey.Context -> result = pyCapsule.getContext(); - case CapsuleKey.Name -> result = pyCapsule.getName(); - case CapsuleKey.Destructor -> result = pyCapsule.getDestructor(); - default -> throw CompilerDirectives.shouldNotReachHere("invalid key"); - } - // never allow Java 'null' to be returned - if (result == null) { - return PNone.NO_VALUE; - } - return result; - } - - public static void isLegalCapsule(Object object, int key, PRaiseNode raiseNode) { - if (!(object instanceof PyCapsule) || ((PyCapsule) object).getPointer() == null) { - throw raiseNode.raise(ValueError, getErrorMessage(key)); - } - } - - @TruffleBoundary - public static TruffleString getErrorMessage(int key) { - return switch (key) { - case CapsuleKey.Pointer -> ErrorMessages.CAPSULE_GETPOINTER_WITH_INVALID_CAPSULE; - case CapsuleKey.Context -> ErrorMessages.CAPSULE_GETCONTEXT_WITH_INVALID_CAPSULE; - case CapsuleKey.Name -> ErrorMessages.CAPSULE_GETNAME_WITH_INVALID_CAPSULE; - case CapsuleKey.Destructor -> ErrorMessages.CAPSULE_GETDESTRUCTOR_WITH_INVALID_CAPSULE; - default -> throw CompilerDirectives.shouldNotReachHere("invalid key"); - }; - } - } - - @HPyContextFunction("ctx_Capsule_Set") - @GenerateUncached - public abstract static class GraalHPyCapsuleSet extends HPyQuaternaryContextFunction { - @Specialization - static int doGeneric(GraalHPyContext hpyContext, Object capsule, int key, Object valuePtr, - @Cached(parameters = "hpyContext") GraalHPyCAccess.IsNullNode isNullNode, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached PRaiseNode raiseNode) { - GraalHPyCapsuleGet.isLegalCapsule(capsule, key, raiseNode); - PyCapsule pyCapsule = (PyCapsule) capsule; - switch (key) { - case CapsuleKey.Pointer -> { - if (isNullNode.execute(hpyContext, valuePtr)) { - throw raiseNode.raise(ValueError, ErrorMessages.CAPSULE_SETPOINTER_CALLED_WITH_NULL_POINTER); - } - pyCapsule.setPointer(valuePtr); - } - case CapsuleKey.Context -> pyCapsule.setContext(valuePtr); - case CapsuleKey.Name -> { - // we may assume that the pointer is owned - pyCapsule.setName(fromCharPointerNode.execute(valuePtr, false)); - } - case CapsuleKey.Destructor -> pyCapsule.registerDestructor(isNullNode.execute(hpyContext, valuePtr) ? null : valuePtr); - default -> throw CompilerDirectives.shouldNotReachHere("invalid key"); - } - return 0; - } - } - - @HPyContextFunction("ctx_Capsule_IsValid") - @GenerateUncached - public abstract static class GraalHPyCapsuleIsValid extends HPyTernaryContextFunction { - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object capsule, Object namePtr, - @Bind("this") Node inliningTarget, - @Cached PyCapsuleNameMatchesNode nameMatchesNode) { - return PInt.intValue(capsule instanceof PyCapsule pyCapsule && nameMatchesNode.execute(inliningTarget, pyCapsule.getName(), namePtr)); - } - } - - @HPyContextFunction("ctx_ContextVar_New") - @GenerateUncached - public abstract static class GraalHPyContextVarNew extends HPyTernaryContextFunction { - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object namePtr, Object def, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached CallNode callContextvar) { - TruffleString name = fromCharPointerNode.execute(namePtr); - return callContextvar.executeWithoutFrame(PythonBuiltinClassType.ContextVar, name, def); - } - } - - @HPyContextFunction("ctx_ContextVar_Get") - @GenerateUncached - public abstract static class GraalHPyContextVarGet extends HPyQuaternaryContextFunction { - @Specialization - static int doGeneric(GraalHPyContext hpyContext, Object var, Object def, Object outPtr, - @Cached PRaiseNode raiseNode, - @Cached(parameters = "hpyContext") GraalHPyCAccess.WriteHPyNode writeHPyNode) { - if (!(var instanceof PContextVar contextVar)) { - throw raiseNode.raise(TypeError, ErrorMessages.INSTANCE_OF_CONTEXTVAR_EXPECTED); - } - PythonThreadState threadState = hpyContext.getContext().getThreadState(PythonLanguage.get(raiseNode)); - Object result = getObject(threadState, contextVar, def); - writeHPyNode.write(hpyContext, outPtr, result); - return 0; - } - - public static Object getObject(PythonThreadState threadState, PContextVar var, Object def) { - Object result = var.getValue(threadState); - if (result == null) { - if (def == NULL_HANDLE_DELEGATE) { - def = var.getDefault(); - if (def == PContextVar.NO_DEFAULT) { - def = NULL_HANDLE_DELEGATE; - } - } - result = def; - } - return result; - } - } - - @HPyContextFunction("ctx_ContextVar_Set") - @GenerateUncached - public abstract static class GraalHPyContextVarSet extends HPyTernaryContextFunction { - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object var, Object val, - @Cached PRaiseNode raiseNode, - @Cached PythonObjectFactory factory) { - if (!(var instanceof PContextVar contextVar)) { - throw raiseNode.raise(TypeError, ErrorMessages.INSTANCE_OF_CONTEXTVAR_EXPECTED); - } - PythonThreadState threadState = hpyContext.getContext().getThreadState(PythonLanguage.get(raiseNode)); - Object oldValue = contextVar.getValue(threadState); - contextVar.setValue(threadState, val); - return factory.createContextVarsToken(contextVar, oldValue); - } - } - - @HPyContextFunction("ctx_Unicode_FromEncodedObject") - @GenerateUncached - public abstract static class GraalHPyUnicodeFromEncodedObject extends HPyQuaternaryContextFunction { - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object obj, Object encodingPtr, Object errorsPtr, - @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile nullProfile, - @Cached(parameters = "hpyContext") GraalHPyCAccess.IsNullNode isNullNode, - @Cached(parameters = "hpyContext") HPyFromCharPointerNode fromNativeCharPointerNode, - @Cached PyUnicodeFromEncodedObject libNode) { - if (nullProfile.profile(inliningTarget, obj == PNone.NO_VALUE)) { - throw PRaiseNode.raiseUncached(inliningTarget, SystemError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC); - } - TruffleString encoding; - if (!isNullNode.execute(hpyContext, encodingPtr)) { - encoding = fromNativeCharPointerNode.execute(hpyContext, encodingPtr, true); - } else { - encoding = T_UTF8; - } - - TruffleString errors; - if (!isNullNode.execute(hpyContext, errorsPtr)) { - errors = fromNativeCharPointerNode.execute(hpyContext, errorsPtr, true); - } else { - errors = T_STRICT; - } - return libNode.execute(null, inliningTarget, obj, encoding, errors); - } - } - - @HPyContextFunction("ctx_Unicode_Substring") - @GenerateUncached - public abstract static class GraalHPyUnicodeSubstring extends HPyQuaternaryContextFunction { - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, Object obj, long lstart, long lend, - @Bind("this") Node inliningTarget, - @Cached CastToTruffleStringNode castStr, - @Cached CastToJavaIntExactNode castStart, - @Cached CastToJavaIntExactNode castEnd, - @Cached InlinedConditionProfile profile, - @Cached TruffleString.CodePointLengthNode codePointLengthNode, - @Cached StrGetItemNodeWithSlice getSlice) { - TruffleString value = castStr.execute(inliningTarget, obj); - int start = castStart.execute(inliningTarget, lstart); - int end = castEnd.execute(inliningTarget, lend); - if (profile.profile(inliningTarget, start < 0 || end < 0)) { - throw PRaiseNode.raiseUncached(inliningTarget, PythonBuiltinClassType.IndexError, ErrorMessages.STRING_INDEX_OUT_OF_RANGE); - } - SliceInfo sliceInfo = PSlice.computeIndices(start, end, 1, codePointLengthNode.execute(value, TS_ENCODING)); - return getSlice.execute(value, sliceInfo); - } - } - - @HPyContextFunction("ctx_Slice_Unpack") - @GenerateUncached - public abstract static class GraalHPySliceUnpack extends HPy5ContextFunction { - @Specialization - static int doGeneric(GraalHPyContext hpyContext, Object obj, Object startPtr, Object endPtr, Object stepPtr, - @Bind("this") Node inliningTarget, - @Cached(parameters = "hpyContext") GraalHPyCAccess.WriteI64Node writeHPyNode, - @Cached SliceNodes.SliceUnpackLong sliceUnpack) { - if (obj instanceof PSlice slice) { - SliceInfoLong info = sliceUnpack.execute(inliningTarget, slice); - writeHPyNode.write(hpyContext, startPtr, info.start()); - writeHPyNode.write(hpyContext, endPtr, info.stop()); - writeHPyNode.write(hpyContext, stepPtr, info.step()); - return 0; - } - return -1; - } - } - - @HPyContextFunction("ctx_Type_GetBuiltinShape") - @GenerateUncached - public abstract static class GraalHPyTypeGetBuiltinShape extends HPyBinaryContextFunction { - - @Specialization - static int doGeneric(@SuppressWarnings("unused") Object hpyContext, Object typeObject, - @Bind("this") Node inliningTarget, - @Cached InlinedExactClassProfile classProfile, - @Cached PRaiseNode raiseNode) { - Object profiledTypeObject = classProfile.profile(inliningTarget, typeObject); - int result = GraalHPyDef.getBuiltinShapeFromHiddenAttribute(profiledTypeObject); - if (result == -2) { - throw raiseNode.raise(TypeError, ErrorMessages.S_MUST_BE_S, "arg", "type"); - } - return result; - } - } - - @HPyContextFunction("ctx_Compile_s") - @GenerateUncached - public abstract static class GraalHPyCompile extends HPyQuaternaryContextFunction { - @Specialization - static Object doGeneric(GraalHPyContext hpyContext, Object srcPtr, Object filenamePtr, int kind, - @Cached ReadAttributeFromObjectNode readAttributeFromObjectNode, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached CallNode callNode, - @Cached PRaiseNode raiseNode) { - TruffleString src = fromCharPointerNode.execute(srcPtr); - TruffleString filename = fromCharPointerNode.execute(filenamePtr); - Object builtinFunction = readAttributeFromObjectNode.execute(hpyContext.getContext().getBuiltins(), BuiltinNames.T_COMPILE); - GraalHPySourceKind sourceKind = GraalHPySourceKind.fromValue(kind); - if (sourceKind == null) { - throw raiseNode.raise(SystemError, ErrorMessages.HPY_INVALID_SOURCE_KIND); - } - return callNode.executeWithoutFrame(builtinFunction, src, filename, sourceKind.getMode()); - } - } - - @HPyContextFunction("ctx_EvalCode") - @GenerateUncached - public abstract static class GraalHPyEvalCode extends HPyQuaternaryContextFunction { - @Specialization - static Object doGeneric(@SuppressWarnings("unused") Object hpyContext, PCode code, Object globals, Object locals, - @Bind("this") Node inliningTarget, - @Cached PRaiseNode raiseNode, - @Cached CodeNodes.GetCodeCallTargetNode getCallTargetNode, - @Cached GenericInvokeNode invokeNode) { - - // prepare Python frame arguments - Object[] pArguments = PArguments.create(); - - if (locals == PNone.NO_VALUE) { - locals = globals; - } - PArguments.setSpecialArgument(pArguments, locals); - // TODO(fa): set builtins in globals - // PythonModule builtins = getContext().getBuiltins(); - // setBuiltinsInGlobals(globals, setBuiltins, builtins, lib); - if (globals instanceof PythonObject) { - PArguments.setGlobals(pArguments, (PythonObject) globals); - } else { - throw raiseNode.raise(SystemError, ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC); - } - - RootCallTarget rootCallTarget = getCallTargetNode.execute(inliningTarget, code); - return invokeNode.execute(rootCallTarget, pArguments); - } - } - - @HPyContextFunction("ctx_SetCallFunction") - @GenerateUncached - public abstract static class GraalHPySetCallFunction extends HPyTernaryContextFunction { - @Specialization - static int doGeneric(GraalHPyContext hpyContext, PythonObject object, Object callFunctionDefPtr, - @Bind("this") Node inliningTarget, - @Cached GetPythonObjectClassNode getClassNode, - @Cached InlinedBranchProfile errorProfile, - @Cached HPyReadCallFunctionNode readCallFunctionNode) { - - Object clazz = getClassNode.execute(inliningTarget, object); - if (!(clazz instanceof PythonClass pythonClass) || !pythonClass.isHPyType()) { - errorProfile.enter(inliningTarget); - throw PRaiseNode.raiseUncached(inliningTarget, TypeError, ErrorMessages.HPY_TYPE_DOES_NOT_IMPLEMENT_CALL_PROTOCOL, clazz); - } - Object callFunction = readCallFunctionNode.execute(inliningTarget, hpyContext, callFunctionDefPtr); - GraalHPyData.setHPyCallFunction(object, callFunction); - return 0; - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyData.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyData.java deleted file mode 100644 index 660ada5a2b..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyData.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.graal.python.util.PythonUtils; - -public abstract class GraalHPyData { - private static final int INDEX_DATA_PTR = 0; - private static final int INDEX_CALL_FUN = 1; - private static final int HPY_FIELD_OFFSET = 1; - - private static final Long DEFAULT_DATA_PTR_VALUE = 0L; - private static final Object DEFAULT_CALL_FUNCTION_VALUE = null; - - public static void setHPyNativeSpace(PythonObject object, Object dataPtr) { - Object[] hpyData = object.getHPyData(); - if (hpyData == null) { - hpyData = new Object[]{dataPtr, DEFAULT_CALL_FUNCTION_VALUE}; - object.setHPyData(hpyData); - } else { - hpyData[INDEX_DATA_PTR] = dataPtr; - } - } - - public static Object getHPyNativeSpace(PythonObject object) { - Object[] hpyData = object.getHPyData(); - return hpyData != null ? hpyData[INDEX_DATA_PTR] : DEFAULT_DATA_PTR_VALUE; - } - - public static void setHPyCallFunction(PythonObject object, Object callFunctionPtr) { - Object[] hpyData = object.getHPyData(); - if (hpyData == null) { - hpyData = new Object[]{DEFAULT_DATA_PTR_VALUE, callFunctionPtr}; - object.setHPyData(hpyData); - } else { - hpyData[INDEX_CALL_FUN] = callFunctionPtr; - } - } - - public static Object getHPyCallFunction(PythonObject object) { - Object[] hpyData = object.getHPyData(); - return hpyData != null ? hpyData[INDEX_CALL_FUN] : null; - } - - public static Object getHPyField(PythonObject object, int location) { - assert location > 0; - Object[] hpyData = object.getHPyData(); - return hpyData != null ? hpyData[location + HPY_FIELD_OFFSET] : null; - } - - public static int setHPyField(PythonObject object, Object referent, int location) { - Object[] hpyFields = object.getHPyData(); - if (location != 0) { - assert hpyFields != null; - hpyFields[location + HPY_FIELD_OFFSET] = referent; - return location; - } else { - int newLocation; - if (hpyFields == null) { - newLocation = 1; - hpyFields = new Object[]{DEFAULT_DATA_PTR_VALUE, null, referent}; - } else { - int newFieldIdx = hpyFields.length; - hpyFields = PythonUtils.arrayCopyOf(hpyFields, newFieldIdx + 1); - hpyFields[newFieldIdx] = referent; - newLocation = newFieldIdx - HPY_FIELD_OFFSET; - } - object.setHPyData(hpyFields); - return newLocation; - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyDef.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyDef.java deleted file mode 100644 index 81803d6aff..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyDef.java +++ /dev/null @@ -1,546 +0,0 @@ -/* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPySlotWrapper.RICHCMP_EQ; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPySlotWrapper.RICHCMP_GE; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPySlotWrapper.RICHCMP_GT; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPySlotWrapper.RICHCMP_LE; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPySlotWrapper.RICHCMP_LT; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPySlotWrapper.RICHCMP_NE; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ABS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ADD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___AND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___BOOL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___CALL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___CONTAINS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DELITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DIVMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FLOAT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FLOORDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___HASH__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IADD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IAND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IFLOORDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ILSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IMATMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INDEX__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INVERT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IPOW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IRSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ISUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ITRUEDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IXOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LEN__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MATMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEG__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___OR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___POS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___POW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RADD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RAND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REPR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RFLOORDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RLSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RMATMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ROR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RRSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RSUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RTRUEDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RXOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___STR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___TRUEDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___XOR__; - -import java.util.Arrays; - -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; -import com.oracle.graal.python.builtins.objects.cext.common.CExtContext; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.LLVMType; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctions.GraalHPyNew; -import com.oracle.graal.python.builtins.objects.type.PythonClass; -import com.oracle.graal.python.builtins.objects.type.TpSlots.TpSlotMeta; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode; -import com.oracle.graal.python.nodes.HiddenAttr; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; -import com.oracle.truffle.api.strings.TruffleString; - -/** - * A container class for mirroring definitions of {@code hpydef.h} - */ -public abstract class GraalHPyDef { - - /* enum values of 'HPyDef_Kind' */ - public static final int HPY_DEF_KIND_SLOT = 1; - public static final int HPY_DEF_KIND_METH = 2; - public static final int HPY_DEF_KIND_MEMBER = 3; - public static final int HPY_DEF_KIND_GETSET = 4; - - /** - * Same as {@code HPyFunc_Signature}. - */ - enum HPyFuncSignature { - VARARGS(1, LLVMType.HPyFunc_varargs), // METH_VARARGS - KEYWORDS(2, LLVMType.HPyFunc_keywords), // METH_VARARGS | METH_KEYWORDS - NOARGS(3, LLVMType.HPyFunc_noargs), // METH_NOARGS - O(4, LLVMType.HPyFunc_o), // METH_O - DESTROYFUNC(5, LLVMType.HPyFunc_destroyfunc), - GETBUFFERPROC(6, LLVMType.HPyFunc_getbufferproc), - RELEASEBUFFERPROC(7, LLVMType.HPyFunc_releasebufferproc), - UNARYFUNC(8, LLVMType.HPyFunc_unaryfunc), - BINARYFUNC(9, LLVMType.HPyFunc_binaryfunc), - TERNARYFUNC(10, LLVMType.HPyFunc_ternaryfunc), - INQUIRY(11, LLVMType.HPyFunc_inquiry), - LENFUNC(12, LLVMType.HPyFunc_lenfunc), - SSIZEARGFUNC(13, LLVMType.HPyFunc_ssizeargfunc), - SSIZESSIZEARGFUNC(14, LLVMType.HPyFunc_ssizessizeargfunc), - SSIZEOBJARGPROC(15, LLVMType.HPyFunc_ssizeobjargproc), - SSIZESSIZEOBJARGPROC(16, LLVMType.HPyFunc_ssizessizeobjargproc), - OBJOBJARGPROC(17, LLVMType.HPyFunc_objobjargproc), - FREEFUNC(18, LLVMType.HPyFunc_freefunc), - GETATTRFUNC(19, LLVMType.HPyFunc_getattrfunc), - GETATTROFUNC(20, LLVMType.HPyFunc_getattrofunc), - SETATTRFUNC(21, LLVMType.HPyFunc_setattrfunc), - SETATTROFUNC(22, LLVMType.HPyFunc_setattrofunc), - REPRFUNC(23, LLVMType.HPyFunc_reprfunc), - HASHFUNC(24, LLVMType.HPyFunc_hashfunc), - RICHCMPFUNC(25, LLVMType.HPyFunc_richcmpfunc), - GETITERFUNC(26, LLVMType.HPyFunc_getiterfunc), - ITERNEXTFUNC(27, LLVMType.HPyFunc_iternextfunc), - DESCRGETFUNC(28, LLVMType.HPyFunc_descrgetfunc), - DESCRSETFUNC(29, LLVMType.HPyFunc_descrsetfunc), - INITPROC(30, LLVMType.HPyFunc_initproc), - GETTER(31, LLVMType.HPyFunc_getter), - SETTER(32, LLVMType.HPyFunc_setter), - OBJOBJPROC(33, LLVMType.HPyFunc_objobjproc); - - /** The corresponding C enum value. */ - private final int value; - - /** The C function's type (basically it's signature). */ - private final LLVMType llvmFunctionType; - - HPyFuncSignature(int value, LLVMType llvmFunctionType) { - this.value = value; - this.llvmFunctionType = llvmFunctionType; - } - - public int getValue() { - return value; - } - - public LLVMType getLLVMFunctionType() { - return llvmFunctionType; - } - - @CompilationFinal(dimensions = 1) private static final HPyFuncSignature[] VALUES = values(); - @CompilationFinal(dimensions = 1) private static final HPyFuncSignature[] BY_VALUE = new HPyFuncSignature[40]; - - static { - for (var entry : VALUES) { - assert BY_VALUE[entry.value] == null; - BY_VALUE[entry.value] = entry; - } - } - - static HPyFuncSignature fromValue(int value) { - return value >= 0 && value < BY_VALUE.length ? BY_VALUE[value] : null; - } - - public static int getFlags(HPyFuncSignature sig) { - switch (sig) { - case VARARGS: - return CExtContext.METH_VARARGS; - case KEYWORDS: - return CExtContext.METH_VARARGS | CExtContext.METH_KEYWORDS; - case NOARGS: - return CExtContext.METH_NOARGS; - case O: - return CExtContext.METH_O; - } - return 0; - } - - static boolean isValid(int value) { - return fromValue(value) != null; - } - } - - /** - * An enumeration of all available slot wrappers as used by CPython (see - * {@code typeobject.c: slotdefs}. Each enum value (except of {@link #NULL}, - * {@link #DESTROYFUNC}, {@link #GETBUFFER}, and {@link #RELEASEBUFFER}) corresponds to a - * wrapper function which name starts with {@code wrap_}. For example, value {@link #UNARYFUNC} - * corresponds to wrapper function {@code wrap_unaryfunc}. - */ - public enum HPySlotWrapper { - NULL(LLVMType.HPyFunc_keywords), - UNARYFUNC(LLVMType.HPyFunc_unaryfunc), - BINARYFUNC(LLVMType.HPyFunc_binaryfunc), - BINARYFUNC_L(LLVMType.HPyFunc_binaryfunc), - BINARYFUNC_R(LLVMType.HPyFunc_binaryfunc), - CALL(LLVMType.HPyFunc_keywords), - HASHFUNC(LLVMType.HPyFunc_hashfunc), - TERNARYFUNC(LLVMType.HPyFunc_ternaryfunc), - TERNARYFUNC_R(LLVMType.HPyFunc_ternaryfunc), - INQUIRYPRED(LLVMType.HPyFunc_inquiry), - DEL, - INIT(LLVMType.HPyFunc_initproc), - LENFUNC(LLVMType.HPyFunc_lenfunc), - DELITEM, - SQ_ITEM(LLVMType.HPyFunc_ssizeargfunc), - SQ_SETITEM(LLVMType.HPyFunc_ssizeobjargproc), - SQ_DELITEM(LLVMType.HPyFunc_ssizeobjargproc), - OBJOBJARGPROC(LLVMType.HPyFunc_objobjargproc), - OBJOBJPROC(LLVMType.HPyFunc_objobjproc), - INDEXARGFUNC(LLVMType.HPyFunc_ssizeargfunc), - SETATTR(LLVMType.HPyFunc_setattrfunc), - DELATTR(LLVMType.HPyFunc_setattrfunc), - RICHCMP_LT(LLVMType.HPyFunc_richcmpfunc), - RICHCMP_LE(LLVMType.HPyFunc_richcmpfunc), - RICHCMP_EQ(LLVMType.HPyFunc_richcmpfunc), - RICHCMP_NE(LLVMType.HPyFunc_richcmpfunc), - RICHCMP_GT(LLVMType.HPyFunc_richcmpfunc), - RICHCMP_GE(LLVMType.HPyFunc_richcmpfunc), - DESCR_GET(LLVMType.HPyFunc_descrgetfunc), - DESCR_SET(LLVMType.HPyFunc_descrsetfunc), - DESCR_DELETE(LLVMType.HPyFunc_descrsetfunc), - DESTROYFUNC(LLVMType.HPyFunc_destroyfunc), - TRAVERSE(LLVMType.HPyFunc_traverseproc), - DESTRUCTOR(LLVMType.HPyFunc_destructor), - GETBUFFER(LLVMType.HPyFunc_getbufferproc), - RELEASEBUFFER(LLVMType.HPyFunc_releasebufferproc), - MOD_CREATE(LLVMType.HPyModule_create); - - /** The C function's type (basically it's signature). */ - private final LLVMType llvmFunctionType; - - HPySlotWrapper() { - this.llvmFunctionType = null; - } - - HPySlotWrapper(LLVMType llvmFunctionType) { - this.llvmFunctionType = llvmFunctionType; - } - - public LLVMType getLLVMFunctionType() { - return llvmFunctionType; - } - } - - /* enum values of 'HPyMember_FieldType' */ - public static final int HPY_MEMBER_SHORT = 0; - public static final int HPY_MEMBER_INT = 1; - public static final int HPY_MEMBER_LONG = 2; - public static final int HPY_MEMBER_FLOAT = 3; - public static final int HPY_MEMBER_DOUBLE = 4; - public static final int HPY_MEMBER_STRING = 5; - public static final int HPY_MEMBER_OBJECT = 6; - public static final int HPY_MEMBER_CHAR = 7; - public static final int HPY_MEMBER_BYTE = 8; - public static final int HPY_MEMBER_UBYTE = 9; - public static final int HPY_MEMBER_USHORT = 10; - public static final int HPY_MEMBER_UINT = 11; - public static final int HPY_MEMBER_ULONG = 12; - public static final int HPY_MEMBER_STRING_INPLACE = 13; - public static final int HPY_MEMBER_BOOL = 14; - public static final int HPY_MEMBER_OBJECT_EX = 16; - public static final int HPY_MEMBER_LONGLONG = 17; - public static final int HPY_MEMBER_ULONGLONG = 18; - public static final int HPY_MEMBER_HPYSSIZET = 19; - public static final int HPY_MEMBER_NONE = 20; - - /* enum values of 'HPyType_SpecParam_Kind' */ - public static final int HPyType_SPEC_PARAM_BASE = 1; - public static final int HPyType_SPEC_PARAM_BASES_TUPLE = 2; - public static final int HPyType_SPEC_PARAM_METACLASS = 3; - - /* type flags according to 'hpytype.h' */ - public static final long _Py_TPFLAGS_HEAPTYPE = (1L << 9); - public static final long HPy_TPFLAGS_BASETYPE = (1L << 10); - public static final long HPy_TPFLAGS_HAVE_GC = (1L << 14); - public static final long HPy_TPFLAGS_DEFAULT = _Py_TPFLAGS_HEAPTYPE; - - /* enum values of 'HPyType_BuiltinShape' */ - public static final int HPyType_BUILTIN_SHAPE_LEGACY = -1; - public static final int HPyType_BUILTIN_SHAPE_OBJECT = 0; - public static final int HPyType_BUILTIN_SHAPE_TYPE = 1; - public static final int HPyType_BUILTIN_SHAPE_LONG = 2; - public static final int HPyType_BUILTIN_SHAPE_FLOAT = 3; - public static final int HPyType_BUILTIN_SHAPE_UNICODE = 4; - public static final int HPyType_BUILTIN_SHAPE_TUPLE = 5; - public static final int HPyType_BUILTIN_SHAPE_LIST = 6; - - /** - * Used when the corresponding slot has not been migrated to the CPython compatible TpSlot, or - * when the CPython compatible TpSlot does not have HPy support yet. - */ - public static final TpSlotMeta NO_TP_SLOT = null; - - /* enum values for 'HPySlot_Slot' */ - enum HPySlot { - HPY_BF_GETBUFFER(1, NO_TP_SLOT, HPySlotWrapper.GETBUFFER, HiddenAttr.GETBUFFER), - HPY_BF_RELEASEBUFFER(2, NO_TP_SLOT, HPySlotWrapper.RELEASEBUFFER, HiddenAttr.RELEASEBUFFER), - HPY_MP_ASS_SUBSCRRIPT(3, NO_TP_SLOT, HPySlotWrapper.OBJOBJARGPROC, T___SETITEM__, T___DELITEM__), - HPY_MP_LENGTH(4, TpSlotMeta.MP_LENGTH, HPySlotWrapper.LENFUNC, T___LEN__), - HPY_MP_SUBSCRIPT(5, TpSlotMeta.MP_SUBSCRIPT, HPySlotWrapper.BINARYFUNC, T___GETITEM__), - HPY_NB_ABSOLUTE(6, NO_TP_SLOT, HPySlotWrapper.UNARYFUNC, T___ABS__), - HPY_NB_ADD(7, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___ADD__, HPySlotWrapper.BINARYFUNC_R, T___RADD__), - HPY_NB_AND(8, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___AND__, HPySlotWrapper.BINARYFUNC_R, T___RAND__), - HPY_NB_BOOL(9, NO_TP_SLOT, HPySlotWrapper.INQUIRYPRED, T___BOOL__), - HPY_NB_DIVMOD(10, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___DIVMOD__), - HPY_NB_FLOAT(11, NO_TP_SLOT, HPySlotWrapper.UNARYFUNC, T___FLOAT__), - HPY_NB_FLOOR_DIVIDE(12, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___FLOORDIV__, HPySlotWrapper.BINARYFUNC_R, T___RFLOORDIV__), - HPY_NB_INDEX(13, NO_TP_SLOT, HPySlotWrapper.UNARYFUNC, T___INDEX__), - HPY_NB_INPLACE_ADD(14, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___IADD__), - HPY_NB_INPLACE_AND(15, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___IAND__), - HPY_NB_INPLACE_FLOOR_DIVIDE(16, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___IFLOORDIV__), - HPY_NB_INPLACE_LSHIFT(17, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___ILSHIFT__), - HPY_NB_INPLACE_MULTIPLY(18, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___IMUL__), - HPY_NB_INPLACE_OR(19, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___IOR__), - HPY_NB_INPLACE_POWER(20, NO_TP_SLOT, HPySlotWrapper.TERNARYFUNC, T___IPOW__), - HPY_NB_INPLACE_REMAINDER(21, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___IMOD__), - HPY_NB_INPLACE_RSHIFT(22, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___IRSHIFT__), - HPY_NB_INPLACE_SUBTRACT(23, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___ISUB__), - HPY_NB_INPLACE_TRUE_DIVIDE(24, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___ITRUEDIV__), - HPY_NB_INPLACE_XOR(25, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___IXOR__), - HPY_NB_INT(26, NO_TP_SLOT, HPySlotWrapper.UNARYFUNC, T___INT__), - HPY_NB_INVERT(27, NO_TP_SLOT, HPySlotWrapper.UNARYFUNC, T___INVERT__), - HPY_NB_LSHIFT(28, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___LSHIFT__, HPySlotWrapper.BINARYFUNC_R, T___RLSHIFT__), - HPY_NB_MULTIPLY(29, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___MUL__, HPySlotWrapper.BINARYFUNC_R, T___RMUL__), - HPY_NB_NEGATIVE(30, NO_TP_SLOT, HPySlotWrapper.UNARYFUNC, T___NEG__), - HPY_NB_OR(31, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___OR__, HPySlotWrapper.BINARYFUNC_R, T___ROR__), - HPY_NB_POSITIVE(32, NO_TP_SLOT, HPySlotWrapper.UNARYFUNC, T___POS__), - HPY_NB_POWER(33, NO_TP_SLOT, HPySlotWrapper.TERNARYFUNC, T___POW__), - HPY_NB_REMAINDER(34, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___MOD__, HPySlotWrapper.BINARYFUNC_R, T___RMOD__), - HPY_NB_RSHIFT(35, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___RSHIFT__, HPySlotWrapper.BINARYFUNC_R, T___RRSHIFT__), - HPY_NB_SUBTRACT(36, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___SUB__, HPySlotWrapper.BINARYFUNC_R, T___RSUB__), - HPY_NB_TRUE_DIVIDE(37, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___TRUEDIV__, HPySlotWrapper.BINARYFUNC_R, T___RTRUEDIV__), - HPY_NB_XOR(38, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___XOR__, HPySlotWrapper.BINARYFUNC_R, T___RXOR__), - HPY_SQ_ASS_ITEM(39, NO_TP_SLOT, HPySlotWrapper.SQ_SETITEM, T___SETITEM__, HPySlotWrapper.SQ_DELITEM, T___DELITEM__), - HPY_SQ_CONCAT(40, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___ADD__), - HPY_SQ_CONTAINS(41, NO_TP_SLOT, HPySlotWrapper.OBJOBJPROC, T___CONTAINS__), - HPY_SQ_INPLACE_CONCAT(42, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___IADD__), - HPY_SQ_INPLACE_REPEAT(43, NO_TP_SLOT, HPySlotWrapper.INDEXARGFUNC, T___IMUL__), - HPY_SQ_ITEM(44, TpSlotMeta.SQ_ITEM, HPySlotWrapper.SQ_ITEM, T___GETITEM__), - HPY_SQ_LENGTH(45, TpSlotMeta.SQ_LENGTH, HPySlotWrapper.LENFUNC, T___LEN__), - HPY_SQ_REPEAT(46, TpSlotMeta.SQ_REPEAT, HPySlotWrapper.INDEXARGFUNC, T___MUL__, T___RMUL__), - HPY_TP_CALL(50, NO_TP_SLOT, HPySlotWrapper.CALL, T___CALL__), - HPY_TP_HASH(59, NO_TP_SLOT, HPySlotWrapper.HASHFUNC, T___HASH__), - HPY_TP_INIT(60, NO_TP_SLOT, HPySlotWrapper.INIT, T___INIT__), - HPY_TP_ITER(62, NO_TP_SLOT, HPySlotWrapper.UNARYFUNC, T___ITER__), - HPY_TP_NEW(65, NO_TP_SLOT, HPySlotWrapper.NULL, T___NEW__), - HPY_TP_REPR(66, NO_TP_SLOT, HPySlotWrapper.UNARYFUNC, T___REPR__), - HPY_TP_RICHCOMPARE(67, NO_TP_SLOT, w(RICHCMP_LT, RICHCMP_LE, RICHCMP_EQ, RICHCMP_NE, RICHCMP_GT, RICHCMP_GE), k(T___LT__, T___LE__, T___EQ__, T___NE__, T___GT__, T___GE__)), - HPY_TP_STR(70, NO_TP_SLOT, HPySlotWrapper.UNARYFUNC, T___STR__), - HPY_TP_TRAVERSE(71, NO_TP_SLOT, HPySlotWrapper.TRAVERSE), - HPY_NB_MATRIX_MULTIPLY(75, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___MATMUL__, HPySlotWrapper.BINARYFUNC_R, T___RMATMUL__), - HPY_NB_INPLACE_MATRIX_MULTIPLY(76, NO_TP_SLOT, HPySlotWrapper.BINARYFUNC_L, T___IMATMUL__), - HPY_TP_FINALIZE(80, NO_TP_SLOT, HPySlotWrapper.DESTRUCTOR), - HPY_TP_DESTROY(1000, NO_TP_SLOT, HPySlotWrapper.DESTROYFUNC), - HPY_MOD_CREATE(2000, NO_TP_SLOT, HPySlotWrapper.MOD_CREATE), - HPY_MOD_EXEC(2001, NO_TP_SLOT, HPySlotWrapper.INQUIRYPRED); - - /** The corresponding C enum value. */ - private final int value; - - /** Corresponding CPython compatible slot */ - private final TpSlotMeta tpSlot; - - /** - * The corresponding attribute key (mostly a {@link TruffleString} which is the name of a - * magic method, or a {@link HiddenAttr} if it's not exposed to the user, or {@code null} if - * unsupported). - */ - @CompilationFinal(dimensions = 1) private final Object[] attributeKeys; - - /** The signatures of the slot functions. */ - @CompilationFinal(dimensions = 1) private final HPySlotWrapper[] signatures; - - /** - * Common case: one slot causes the creation of one attribute. - */ - HPySlot(int value, TpSlotMeta tpSlot, HPySlotWrapper signature, HiddenAttr attributeKey) { - this.value = value; - this.tpSlot = tpSlot; - this.attributeKeys = new Object[]{attributeKey}; - this.signatures = new HPySlotWrapper[]{signature}; - } - - /** - * Special case: one slot causes the creation of multiple attributes using the same slot - * wrapper. - */ - HPySlot(int value, TpSlotMeta tpSlot, HPySlotWrapper signature, TruffleString... attributeKeys) { - this.value = value; - this.tpSlot = tpSlot; - this.attributeKeys = attributeKeys; - if (attributeKeys.length > 0) { - this.signatures = new HPySlotWrapper[attributeKeys.length]; - Arrays.fill(this.signatures, signature); - } else { - this.signatures = new HPySlotWrapper[]{signature}; - } - } - - /** - * Special case: one slot causes the creation of two attributes using different slot - * wrappers. - */ - HPySlot(int value, TpSlotMeta tpSlot, HPySlotWrapper sig0, TruffleString key0, HPySlotWrapper sig1, TruffleString key1) { - this.value = value; - this.tpSlot = tpSlot; - this.attributeKeys = new Object[]{key0, key1}; - this.signatures = new HPySlotWrapper[]{sig0, sig1}; - } - - /** - * Generic case: one slot causes the creation of multiple attributes with each different - * slot wrappers. - */ - HPySlot(int value, TpSlotMeta tpSlot, HPySlotWrapper[] sigs, TruffleString... keys) { - this.value = value; - this.tpSlot = tpSlot; - this.attributeKeys = keys; - this.signatures = sigs; - } - - int getValue() { - return value; - } - - Object[] getAttributeKeys() { - return attributeKeys; - } - - HPySlotWrapper[] getSignatures() { - return signatures; - } - - @CompilationFinal(dimensions = 1) private static final HPySlot[] BY_VALUE = new HPySlot[100]; - - static { - for (var entry : values()) { - if (entry.value >= 0 && entry.value < BY_VALUE.length) { - assert BY_VALUE[entry.value] == null; - BY_VALUE[entry.value] = entry; - } - } - } - - static HPySlot fromValue(int value) { - if (value >= 0 && value < BY_VALUE.length) { - return BY_VALUE[value]; - } - if (HPY_TP_DESTROY.value == value) { - return HPY_TP_DESTROY; - } else if (HPY_MOD_CREATE.value == value) { - return HPY_MOD_CREATE; - } else if (HPY_MOD_EXEC.value == value) { - return HPY_MOD_EXEC; - } - return null; - } - - private static HPySlotWrapper[] w(HPySlotWrapper... wrappers) { - return wrappers; - } - - private static TruffleString[] k(TruffleString... keys) { - return keys; - } - - public TpSlotMeta getTpSlot() { - return tpSlot; - } - } - - public static boolean isValidBuiltinShape(int i) { - return HPyType_BUILTIN_SHAPE_LEGACY <= i && i <= HPyType_BUILTIN_SHAPE_LIST; - } - - public static int getBuiltinShapeFromHiddenAttribute(Object object) { - if (object instanceof PythonClass pythonClass) { - return pythonClass.getBuiltinShape(); - } else if (object instanceof PythonAbstractNativeObject) { - assert IsTypeNode.executeUncached(object); - return HPyType_BUILTIN_SHAPE_LEGACY; - } - return -2; // error - } - - static PythonBuiltinClassType getBuiltinClassType(int builtinShape) { - return switch (builtinShape) { - case HPyType_BUILTIN_SHAPE_LEGACY, HPyType_BUILTIN_SHAPE_OBJECT -> PythonBuiltinClassType.PythonObject; - case HPyType_BUILTIN_SHAPE_TYPE -> PythonBuiltinClassType.PythonClass; - case HPyType_BUILTIN_SHAPE_LONG -> PythonBuiltinClassType.PInt; - case HPyType_BUILTIN_SHAPE_FLOAT -> PythonBuiltinClassType.PFloat; - case HPyType_BUILTIN_SHAPE_UNICODE -> PythonBuiltinClassType.PString; - case HPyType_BUILTIN_SHAPE_TUPLE -> PythonBuiltinClassType.PTuple; - case HPyType_BUILTIN_SHAPE_LIST -> PythonBuiltinClassType.PList; - default -> throw CompilerDirectives.shouldNotReachHere(GraalHPyNew.INVALID_BUILT_IN_SHAPE); - }; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyHandle.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyHandle.java deleted file mode 100644 index 132e94c20a..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyHandle.java +++ /dev/null @@ -1,284 +0,0 @@ -/* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -// skip GIL -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import static com.oracle.graal.python.nodes.truffle.TruffleStringMigrationHelpers.assertNoJavaString; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; -import static com.oracle.graal.python.util.PythonUtils.tsLiteral; - -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.PythonAbstractObject; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.GetHPyHandleForSingleton; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFactory.GetHPyHandleForSingletonNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMContext; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.TruffleObject; -import com.oracle.truffle.api.interop.UnknownIdentifierException; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.library.CachedLibrary; -import com.oracle.truffle.api.library.ExportLibrary; -import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.ConditionProfile; -import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.llvm.spi.NativeTypeLibrary; - -@ExportLibrary(InteropLibrary.class) -@ExportLibrary(value = NativeTypeLibrary.class, useForAOT = false) -public final class GraalHPyHandle implements TruffleObject { - private static final int UNINITIALIZED = Integer.MIN_VALUE; - - public static final Object NULL_HANDLE_DELEGATE = PNone.NO_VALUE; - public static final GraalHPyHandle NULL_HANDLE = new GraalHPyHandle(); - public static final String J_I = "_i"; - public static final TruffleString T_I = tsLiteral(J_I); - - private final Object delegate; - /** - * The ID of the handle if it was allocated in the handle table. - *

      - * The value also encodes the state:
      - * (1) If the value is {@link #UNINITIALIZED}, then the handle was never allocated in the handle - * table.
      - * (2) If the value is zero or positive then this is the index for the handle table. If the
      - * (3) If the value is negative but not {@link #UNINITIALIZED} then the handle was already - * closed (only used in HPy debug mode)
      - *

      - */ - private int id; - - private GraalHPyHandle() { - this(NULL_HANDLE_DELEGATE, 0); - } - - private GraalHPyHandle(Object delegate) { - this(delegate, UNINITIALIZED); - } - - private GraalHPyHandle(Object delegate, int id) { - assert delegate != null : "HPy handles to Java null are not allowed"; - assert delegate != NULL_HANDLE_DELEGATE || id == 0 : "must not not create more than on HPy_NULL"; - this.delegate = assertNoJavaString(delegate); - this.id = id; - } - - public static GraalHPyHandle createSingleton(Object delegate, int handle) { - assert handle <= GraalHPyBoxing.SINGLETON_HANDLE_MAX; - return new GraalHPyHandle(delegate, handle); - } - - public static GraalHPyHandle create(Object delegate) { - return new GraalHPyHandle(delegate); - } - - public static GraalHPyHandle createField(Object delegate, int idx) { - return new GraalHPyHandle(delegate, idx); - } - - public static GraalHPyHandle createGlobal(Object delegate, int idx) { - return new GraalHPyHandle(delegate, idx); - } - - /** - * This is basically like {@code toNative} but also returns the ID. - */ - public int getIdUncached(GraalHPyContext context) { - return getId(context, ConditionProfile.getUncached(), GetHPyHandleForSingletonNodeGen.getUncached()); - } - - public int getId(GraalHPyContext context, ConditionProfile hasIdProfile, GetHPyHandleForSingleton getSingletonNode) { - int result = id; - if (!isPointer(hasIdProfile)) { - assert !GraalHPyBoxing.isBoxablePrimitive(delegate) : "allocating handle for value that could be boxed"; - result = getSingletonNode.execute(this.delegate); - if (result == -1) { - // profiled by the node - result = context.getHPyHandleForNonSingleton(this.delegate); - } - id = result; - } - assert isValidId(this.delegate, result); - return result; - } - - public boolean isValidId(Object obj, int newId) { - if (delegate == PNone.NO_VALUE) { - // special case of HPy_NULL internally represented as NO_VALUE - return newId == 0; - } - int singletonId = GraalHPyContext.getHPyHandleForSingleton(obj); - return singletonId == -1 || singletonId == newId; - } - - @ExportMessage - boolean isPointer( - @Exclusive @Cached(inline = false) ConditionProfile isNativeProfile) { - return isNativeProfile.profile(id >= 0 || delegate instanceof Integer || delegate instanceof Double); - } - - @ExportMessage - long asPointer() throws UnsupportedMessageException { - // note: we don't use a profile here since 'asPointer' is usually used right after - // 'isPointer' - if (!isPointer(ConditionProfile.getUncached())) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw UnsupportedMessageException.create(); - } - if (id != UNINITIALIZED) { - return GraalHPyBoxing.boxHandle(id); - } else if (delegate instanceof Integer) { - return GraalHPyBoxing.boxInt((Integer) delegate); - } else if (delegate instanceof Double) { - return GraalHPyBoxing.boxDouble((Double) delegate); - } - throw CompilerDirectives.shouldNotReachHere(); - } - - /** - * Allocates the handle in the global handle table of the provided HPy context. If this is used - * in compiled code, this {@code GraalHPyHandle} object will definitively be allocated. - */ - @ExportMessage - void toNative(@Exclusive @Cached(inline = false) ConditionProfile isNativeProfile, - @Cached GetHPyHandleForSingleton getSingletonNode, - @CachedLibrary("this") InteropLibrary lib) { - getId(PythonContext.get(lib).getHPyContext(), isNativeProfile, getSingletonNode); - } - - @ExportMessage - @SuppressWarnings("static-method") - boolean hasNativeType(@Bind("$node") Node node) { - return PythonContext.get(node).getHPyContext().getBackend() instanceof GraalHPyLLVMContext; - } - - @ExportMessage - Object getNativeType(@Bind("$node") Node node) { - if (PythonContext.get(node).getHPyContext().getBackend() instanceof GraalHPyLLVMContext backend) { - return backend.getHPyNativeType(); - } - throw CompilerDirectives.shouldNotReachHere(); - } - - public Object getDelegate() { - return delegate; - } - - @ExportMessage - @SuppressWarnings("static-method") - boolean hasMembers() { - return true; - } - - @ExportMessage - @SuppressWarnings("static-method") - Object getMembers(@SuppressWarnings("unused") boolean includeInternal) { - return new PythonAbstractObject.Keys(new TruffleString[]{T_I}); - } - - @ExportMessage - @SuppressWarnings("static-method") - boolean isMemberReadable(String key, - @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode, - @Shared("eq") @Cached TruffleString.EqualNode eqNode) { - TruffleString tmember = fromJavaStringNode.execute(key, TS_ENCODING); - return eqNode.execute(T_I, tmember, TS_ENCODING); - } - - @ExportMessage - Object readMember(String key, - @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode, - @Shared("eq") @Cached TruffleString.EqualNode eqNode) throws UnknownIdentifierException { - TruffleString tmember = fromJavaStringNode.execute(key, TS_ENCODING); - if (eqNode.execute(T_I, tmember, TS_ENCODING)) { - return this; - } - throw UnknownIdentifierException.create(key); - } - - @ExportMessage - boolean isNull() { - return id == 0; - } - - static boolean isAllocated(int id) { - return id != UNINITIALIZED && id != 0; - } - - boolean isAllocated() { - return GraalHPyHandle.isAllocated(id); - } - - boolean isValid() { - return id > 0; - } - - void closeAndInvalidate(GraalHPyContext hpyContext) { - assert id != UNINITIALIZED; - if (hpyContext.releaseHPyHandleForObject(id)) { - id = -id; - } - } - - int getGlobalId() { - assert id > 0 : "any HPyGlobal handle already has an id"; - return id; - } - - int getFieldId() { - assert id >= 0 : "any HPyField handle already has an id"; - return id; - } - - public GraalHPyHandle copy() { - return new GraalHPyHandle(delegate); - } - - static boolean wasAllocated(int id) { - return id != UNINITIALIZED; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyLegacyDef.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyLegacyDef.java deleted file mode 100644 index c491d7d2ff..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyLegacyDef.java +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ABS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ADD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ALLOC__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___AND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___BOOL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___CALL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___CLEAR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___CONTAINS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DEALLOC__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DEL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DIVMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FLOAT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FLOORDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FREE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GETATTR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GET__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___HASH__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IADD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IAND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IFLOORDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ILSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IMATMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INDEX__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INVERT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IPOW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IRSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ISUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ITRUEDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IXOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LEN__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MATMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEG__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEXT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___OR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___POS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___POW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REPR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETATTR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SET__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___STR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___TRUEDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___TRUFFLE_RICHCOMPARE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___XOR__; - -import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper; -import com.oracle.graal.python.builtins.objects.type.TpSlots.TpSlotMeta; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; -import com.oracle.truffle.api.strings.TruffleString; - -/** - * Definitions for legacy slots. - */ -public abstract class GraalHPyLegacyDef { - public static final int MEMBER_FLAG_READONLY = 1; - - /** - * Used when the corresponding slot has not been migrated to the CPython compatible TpSlot, or - * there is no equivalent CPython slot (for those we may still reserve space in TpSlots in the - * future). - */ - public static final TpSlotMeta NO_TP_SLOT = null; - - /** - * Values for field {@code slot} of structure {@code PyType_Slot}. - */ - enum HPyLegacySlot { - // generic type slots - Py_tp_alloc(47, NO_TP_SLOT, T___ALLOC__, PExternalFunctionWrapper.ALLOC), - Py_tp_base(48, NO_TP_SLOT), - Py_tp_bases(49, NO_TP_SLOT), - Py_tp_call(50, NO_TP_SLOT, T___CALL__, PExternalFunctionWrapper.KEYWORDS), - Py_tp_clear(51, NO_TP_SLOT, T___CLEAR__, PExternalFunctionWrapper.INQUIRY), - Py_tp_dealloc(52, NO_TP_SLOT, T___DEALLOC__), - Py_tp_del(53, NO_TP_SLOT, T___DEL__), - Py_tp_descr_get(54, NO_TP_SLOT, T___GET__), - Py_tp_descr_set(55, NO_TP_SLOT, T___SET__), - Py_tp_doc(56, NO_TP_SLOT), - Py_tp_getattr(57, NO_TP_SLOT, T___GETATTR__, PExternalFunctionWrapper.GETATTR), - Py_tp_getattro(58, NO_TP_SLOT, T___GETATTR__), - Py_tp_hash(59, NO_TP_SLOT, T___HASH__, PExternalFunctionWrapper.HASHFUNC), - Py_tp_init(60, NO_TP_SLOT, T___INIT__, PExternalFunctionWrapper.INITPROC), - Py_tp_is_gc(61, NO_TP_SLOT), - Py_tp_iter(62, NO_TP_SLOT, T___ITER__), - Py_tp_iternext(63, NO_TP_SLOT, T___NEXT__, PExternalFunctionWrapper.ITERNEXT), - Py_tp_methods(64, NO_TP_SLOT), - Py_tp_new(65, NO_TP_SLOT, T___NEW__, PExternalFunctionWrapper.KEYWORDS), - Py_tp_repr(66, NO_TP_SLOT, T___REPR__, PExternalFunctionWrapper.TP_REPR), - Py_tp_richcompare(67, NO_TP_SLOT, T___TRUFFLE_RICHCOMPARE__, PExternalFunctionWrapper.RICHCMP), - Py_tp_setattr(68, NO_TP_SLOT, T___SETATTR__, PExternalFunctionWrapper.SETATTR), - Py_tp_setattro(69, NO_TP_SLOT, T___SETATTR__), - Py_tp_str(70, NO_TP_SLOT, T___STR__, PExternalFunctionWrapper.TP_STR), - Py_tp_traverse(71, NO_TP_SLOT), - Py_tp_members(72, NO_TP_SLOT), - Py_tp_getset(73, NO_TP_SLOT), - Py_tp_free(74, NO_TP_SLOT, T___FREE__), - - // PyMappingMethods, NO_TP_SLOT - Py_mp_ass_subscript(3, NO_TP_SLOT, T___SETITEM__, PExternalFunctionWrapper.OBJOBJARGPROC), - Py_mp_length(4, NO_TP_SLOT, T___LEN__, PExternalFunctionWrapper.LENFUNC), - Py_mp_subscript(5, NO_TP_SLOT, T___GETITEM__), - - // PyNumberMethods, NO_TP_SLOT - Py_nb_absolute(6, NO_TP_SLOT, T___ABS__), - Py_nb_add(7, NO_TP_SLOT, T___ADD__), - Py_nb_and(8, NO_TP_SLOT, T___AND__), - Py_nb_bool(9, NO_TP_SLOT, T___BOOL__, PExternalFunctionWrapper.INQUIRY), - Py_nb_divmod(10, NO_TP_SLOT, T___DIVMOD__), - Py_nb_float(11, NO_TP_SLOT, T___FLOAT__), - Py_nb_floor_divide(12, NO_TP_SLOT, T___FLOORDIV__), - Py_nb_index(13, NO_TP_SLOT, T___INDEX__), - Py_nb_inplace_add(14, NO_TP_SLOT, T___IADD__), - Py_nb_inplace_and(15, NO_TP_SLOT, T___IAND__), - Py_nb_inplace_floor_divide(16, NO_TP_SLOT, T___IFLOORDIV__), - Py_nb_inplace_lshift(17, NO_TP_SLOT, T___ILSHIFT__), - Py_nb_inplace_multiply(18, NO_TP_SLOT, T___IMUL__), - Py_nb_inplace_or(19, NO_TP_SLOT, T___IOR__), - Py_nb_inplace_power(20, NO_TP_SLOT, T___IPOW__), - Py_nb_inplace_remainder(21, NO_TP_SLOT, T___IMOD__), - Py_nb_inplace_rshift(22, NO_TP_SLOT, T___IRSHIFT__), - Py_nb_inplace_subtract(23, NO_TP_SLOT, T___ISUB__), - Py_nb_inplace_true_divide(24, NO_TP_SLOT, T___ITRUEDIV__), - Py_nb_inplace_xor(25, NO_TP_SLOT, T___IXOR__), - Py_nb_int(26, NO_TP_SLOT, T___INT__), - Py_nb_invert(27, NO_TP_SLOT, T___INVERT__), - Py_nb_lshift(28, NO_TP_SLOT, T___LSHIFT__), - Py_nb_multiply(29, NO_TP_SLOT, T___MUL__), - Py_nb_negative(30, NO_TP_SLOT, T___NEG__), - Py_nb_or(31, NO_TP_SLOT, T___OR__), - Py_nb_positive(32, NO_TP_SLOT, T___POS__), - Py_nb_power(33, NO_TP_SLOT, T___POW__, PExternalFunctionWrapper.TERNARYFUNC), - Py_nb_remainder(34, NO_TP_SLOT, T___MOD__), - Py_nb_rshift(35, NO_TP_SLOT, T___RSHIFT__), - Py_nb_subtract(36, NO_TP_SLOT, T___SUB__), - Py_nb_true_divide(37, NO_TP_SLOT, T___TRUEDIV__), - Py_nb_xor(38, NO_TP_SLOT, T___XOR__), - Py_nb_matrix_multiply(75, NO_TP_SLOT, T___MATMUL__), - Py_nb_inplace_matrix_multiply(76, NO_TP_SLOT, T___IMATMUL__), - - // PySequenceMethods, NO_TP_SLOT - Py_sq_ass_item(39, NO_TP_SLOT, T___SETITEM__, PExternalFunctionWrapper.SETITEM), - Py_sq_concat(40, NO_TP_SLOT, T___ADD__), - Py_sq_contains(41, NO_TP_SLOT, T___CONTAINS__, PExternalFunctionWrapper.OBJOBJPROC), - Py_sq_inplace_concat(42, NO_TP_SLOT, T___IADD__), - Py_sq_inplace_repeat(43, NO_TP_SLOT, T___IMUL__, PExternalFunctionWrapper.SSIZE_ARG), - Py_sq_item(44, TpSlotMeta.SQ_ITEM, T___GETITEM__, PExternalFunctionWrapper.GETITEM), - Py_sq_length(45, NO_TP_SLOT, T___LEN__, PExternalFunctionWrapper.LENFUNC), - Py_sq_repeat(46, NO_TP_SLOT, T___MUL__, PExternalFunctionWrapper.SSIZE_ARG), - - // PyAsyncMethods, NO_TP_SLOT - Py_am_await(77, NO_TP_SLOT), - Py_am_aiter(78, NO_TP_SLOT), - Py_am_anext(79, NO_TP_SLOT); - - /** The corresponding C enum value. */ - private final int value; - - /** Corresponding CPython compatible slot. */ - private final TpSlotMeta tpSlot; - - /** - * The corresponding attribute key (mostly a {@link String} which is the name of a magic - * method, or a {@link com.oracle.graal.python.nodes.HiddenAttr} if it's not exposed to the - * user, or {@code null} if unsupported). - */ - private final TruffleString attributeKey; - - /** The signature of the slot function. */ - private final PExternalFunctionWrapper signature; - - HPyLegacySlot(int value, TpSlotMeta tpSlot) { - this(value, tpSlot, null); - } - - HPyLegacySlot(int value, TpSlotMeta tpSlot, TruffleString attributeKey) { - this(value, tpSlot, attributeKey, PExternalFunctionWrapper.DIRECT); - } - - HPyLegacySlot(int value, TpSlotMeta tpSlot, TruffleString attributeKey, PExternalFunctionWrapper signature) { - this.value = value; - this.tpSlot = tpSlot; - this.attributeKey = attributeKey; - this.signature = signature; - } - - int getValue() { - return value; - } - - TruffleString getAttributeKey() { - return attributeKey; - } - - PExternalFunctionWrapper getSignature() { - return signature; - } - - @CompilationFinal(dimensions = 1) private static final HPyLegacySlot[] VALUES = values(); - @CompilationFinal(dimensions = 1) private static final HPyLegacySlot[] BY_VALUE = new HPyLegacySlot[100]; - - static { - for (var entry : VALUES) { - assert BY_VALUE[entry.value] == null; - BY_VALUE[entry.value] = entry; - } - } - - static HPyLegacySlot fromValue(int value) { - return value >= 0 && value < BY_VALUE.length ? BY_VALUE[value] : null; - } - - public TpSlotMeta getTpSlot() { - return tpSlot; - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyMemberAccessNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyMemberAccessNodes.java deleted file mode 100644 index c14fca967e..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyMemberAccessNodes.java +++ /dev/null @@ -1,660 +0,0 @@ -/* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_BOOL; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_BYTE; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_CHAR; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_DOUBLE; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_FLOAT; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_HPYSSIZET; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_INT; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_LONG; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_LONGLONG; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_NONE; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_OBJECT; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_OBJECT_EX; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_SHORT; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_STRING; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_STRING_INPLACE; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_UBYTE; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_UINT; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_ULONG; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_ULONGLONG; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPY_MEMBER_USHORT; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Bool; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.CDouble; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.CFloat; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Int; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Int16_t; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Int64_t; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Int8_t; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Uint16_t; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Uint8_t; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.UnsignedInt; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.UnsignedLong; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.Builtin; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.cext.common.CExtAsPythonObjectNode; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.AsNativeCharNode; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.AsNativePrimitiveNode; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodesFactory.AsNativeCharNodeGen; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodesFactory.AsNativePrimitiveNodeGen; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodesFactory.NativePrimitiveAsPythonBooleanNodeGen; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodesFactory.NativePrimitiveAsPythonCharNodeGen; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodesFactory.NativeUnsignedPrimitiveAsPythonObjectNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyMemberAccessNodesFactory.HPyBadMemberDescrNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyMemberAccessNodesFactory.HPyReadMemberNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyMemberAccessNodesFactory.HPyReadOnlyMemberNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyMemberAccessNodesFactory.HPyWriteMemberNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyMemberAccessNodesFactory.PyFloatAsDoubleCachedNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyFromCharPointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyGetNativeSpacePointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyGetNativeSpacePointerNodeGen; -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.getsetdescriptor.DescriptorDeleteMarker; -import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.graal.python.lib.PyFloatAsDoubleNode; -import com.oracle.graal.python.lib.PyLongAsLongNode; -import com.oracle.graal.python.lib.PyLongAsLongNodeGen; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode; -import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.interop.PForeignToPTypeNode; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectExactProfile; -import com.oracle.graal.python.nodes.object.IsNode; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.util.PythonUtils.PrototypeNodeFactory; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.RootCallTarget; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.strings.TruffleString; - -public class GraalHPyMemberAccessNodes { - - static HPyContextSignatureType getCType(int type) { - switch (type) { - case HPY_MEMBER_SHORT: - return HPyContextSignatureType.Int16_t; - case HPY_MEMBER_INT: - return HPyContextSignatureType.Int; - case HPY_MEMBER_LONG: - return HPyContextSignatureType.Long; - case HPY_MEMBER_FLOAT: - return HPyContextSignatureType.CFloat; - case HPY_MEMBER_DOUBLE: - return HPyContextSignatureType.CDouble; - case HPY_MEMBER_STRING: - return HPyContextSignatureType.CharPtr; - case HPY_MEMBER_OBJECT: - case HPY_MEMBER_OBJECT_EX: - return HPyContextSignatureType.HPyField; - case HPY_MEMBER_CHAR: - case HPY_MEMBER_BYTE: - return HPyContextSignatureType.Int8_t; - case HPY_MEMBER_BOOL: - return HPyContextSignatureType.Bool; - case HPY_MEMBER_UBYTE: - return HPyContextSignatureType.Uint8_t; - case HPY_MEMBER_USHORT: - return HPyContextSignatureType.Uint16_t; - case HPY_MEMBER_UINT: - return HPyContextSignatureType.UnsignedInt; - case HPY_MEMBER_ULONG: - return HPyContextSignatureType.UnsignedLong; - case HPY_MEMBER_STRING_INPLACE, HPY_MEMBER_NONE: - return null; - case HPY_MEMBER_LONGLONG: - return HPyContextSignatureType.Uint64_t; - case HPY_MEMBER_ULONGLONG: - return HPyContextSignatureType.Int64_t; - case HPY_MEMBER_HPYSSIZET: - return HPyContextSignatureType.HPy_ssize_t; - } - throw CompilerDirectives.shouldNotReachHere("invalid member type"); - } - - static CExtAsPythonObjectNode getReadConverterNode(int type) { - return switch (type) { - // no conversion needed - case HPY_MEMBER_SHORT, HPY_MEMBER_INT, HPY_MEMBER_LONG, HPY_MEMBER_FLOAT, HPY_MEMBER_DOUBLE, HPY_MEMBER_BYTE, HPY_MEMBER_UBYTE, HPY_MEMBER_USHORT, HPY_MEMBER_STRING, - HPY_MEMBER_STRING_INPLACE, HPY_MEMBER_HPYSSIZET, HPY_MEMBER_NONE, HPY_MEMBER_OBJECT, HPY_MEMBER_OBJECT_EX -> - null; - case HPY_MEMBER_BOOL -> NativePrimitiveAsPythonBooleanNodeGen.create(); - case HPY_MEMBER_CHAR -> NativePrimitiveAsPythonCharNodeGen.create(); - case HPY_MEMBER_UINT, HPY_MEMBER_ULONG, HPY_MEMBER_LONGLONG, HPY_MEMBER_ULONGLONG -> NativeUnsignedPrimitiveAsPythonObjectNodeGen.create(); - default -> throw CompilerDirectives.shouldNotReachHere("invalid member type"); - }; - } - - /** - * Special case: members with type {@code STRING} and {@code STRING_INPLACE} are always - * read-only. - */ - static boolean isReadOnlyType(int type) { - return type == HPY_MEMBER_STRING || type == HPY_MEMBER_STRING_INPLACE; - } - - @Builtin(name = "hpy_member_read", minNumOfPositionalArgs = 1, parameterNames = "$self") - protected abstract static class HPyReadMemberNode extends PythonUnaryBuiltinNode { - private static final Builtin builtin = HPyReadMemberNode.class.getAnnotation(Builtin.class); - - @Child private GraalHPyCAccess.ReadGenericNode readGenericNode; - @Child private GraalHPyCAccess.ReadHPyFieldNode readHPyFieldNode; - @Child private GraalHPyCAccess.GetElementPtrNode getElementPtrNode; - @Child private GraalHPyCAccess.IsNullNode isNullNode; - @Child private HPyFromCharPointerNode fromCharPointerNode; - @Child private CExtAsPythonObjectNode asPythonObjectNode; - @Child private PForeignToPTypeNode fromForeign; - @Child private HPyGetNativeSpacePointerNode readNativeSpaceNode; - - /** The specified member type. */ - private final int type; - - /** The name of the native getter function. */ - private final HPyContextSignatureType fieldType; - - /** The offset where to read from (will be passed to the native getter). */ - private final int offset; - - protected HPyReadMemberNode(int offset, int type, CExtAsPythonObjectNode asPythonObjectNode) { - this.fieldType = getCType(type); - this.offset = offset; - this.type = type; - this.asPythonObjectNode = asPythonObjectNode; - if (asPythonObjectNode == null) { - fromForeign = PForeignToPTypeNode.create(); - } - } - - @Specialization - Object doGeneric(@SuppressWarnings("unused") VirtualFrame frame, Object self, - @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { - GraalHPyContext hPyContext = getContext().getHPyContext(); - - Object nativeSpacePtr = ensureReadNativeSpaceNode().executeCached(self); - if (nativeSpacePtr == PNone.NO_VALUE) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.SystemError, ErrorMessages.ATTEMPTING_READ_FROM_OFFSET_D, offset, self); - } - Object nativeResult; - switch (type) { - case HPY_MEMBER_OBJECT, HPY_MEMBER_OBJECT_EX: { - if (self instanceof PythonObject pythonObject) { - Object fieldValue = ensureReadHPyFieldNode(hPyContext).read(hPyContext, pythonObject, nativeSpacePtr, offset); - if (fieldValue == GraalHPyHandle.NULL_HANDLE_DELEGATE) { - if (type == HPY_MEMBER_OBJECT) { - return PNone.NONE; - } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.AttributeError); - } - } - return fieldValue; - } else { - throw CompilerDirectives.shouldNotReachHere("Cannot have HPyField on non-Python object"); - } - } - case HPY_MEMBER_NONE: - return PNone.NONE; - case HPY_MEMBER_STRING: - nativeResult = ensureReadGenericNode(hPyContext).execute(hPyContext, nativeSpacePtr, offset, fieldType); - if (ensureIsNullNode(hPyContext).execute(hPyContext, nativeResult)) { - return PNone.NONE; - } - return ensureFromCharPointerNode(hPyContext).execute(hPyContext, nativeResult, false); - case HPY_MEMBER_STRING_INPLACE: - Object elementPtr = ensureGetElementPtrNode(hPyContext).execute(hPyContext, nativeSpacePtr, offset); - return ensureFromCharPointerNode(hPyContext).execute(hPyContext, elementPtr, false); - default: - // default case: reading a primitive or a pointer - assert fieldType != null; - nativeResult = ensureReadGenericNode(hPyContext).execute(hPyContext, nativeSpacePtr, offset, fieldType); - if (asPythonObjectNode != null) { - return asPythonObjectNode.execute(nativeResult); - } - /* - * We still need to use 'PForeignToPTypeNode' to ensure that we do not introduce - * unknown values into our value space. - */ - return fromForeign.executeConvert(nativeResult); - } - } - - private GraalHPyCAccess.ReadGenericNode ensureReadGenericNode(GraalHPyContext ctx) { - if (readGenericNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readGenericNode = insert(GraalHPyCAccess.ReadGenericNode.create(ctx)); - } - return readGenericNode; - } - - private GraalHPyCAccess.IsNullNode ensureIsNullNode(GraalHPyContext ctx) { - if (isNullNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - isNullNode = insert(GraalHPyCAccess.IsNullNode.create(ctx)); - } - return isNullNode; - } - - private GraalHPyCAccess.ReadHPyFieldNode ensureReadHPyFieldNode(GraalHPyContext ctx) { - if (readHPyFieldNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readHPyFieldNode = insert(GraalHPyCAccess.ReadHPyFieldNode.create(ctx)); - } - return readHPyFieldNode; - } - - private GraalHPyCAccess.GetElementPtrNode ensureGetElementPtrNode(GraalHPyContext ctx) { - if (getElementPtrNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - getElementPtrNode = insert(GraalHPyCAccess.GetElementPtrNode.create(ctx)); - } - return getElementPtrNode; - } - - private HPyFromCharPointerNode ensureFromCharPointerNode(GraalHPyContext ctx) { - if (fromCharPointerNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - fromCharPointerNode = insert(HPyFromCharPointerNode.create(ctx)); - } - return fromCharPointerNode; - } - - private HPyGetNativeSpacePointerNode ensureReadNativeSpaceNode() { - if (readNativeSpaceNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readNativeSpaceNode = insert(HPyGetNativeSpacePointerNodeGen.create()); - } - return readNativeSpaceNode; - } - - @TruffleBoundary - public static PBuiltinFunction createBuiltinFunction(PythonLanguage language, TruffleString propertyName, int type, int offset) { - CExtAsPythonObjectNode asPythonObjectNode = getReadConverterNode(type); - RootCallTarget callTarget = language.createCachedPropAccessCallTarget( - l -> new BuiltinFunctionRootNode(l, builtin, new PrototypeNodeFactory<>(HPyReadMemberNodeGen.create(offset, type, asPythonObjectNode)), true), - HPyReadMemberNode.class, builtin.name(), type, offset); - int flags = PBuiltinFunction.getFlags(builtin, callTarget); - return PythonObjectFactory.getUncached().createBuiltinFunction(propertyName, null, 0, flags, callTarget); - } - } - - @Builtin(name = "hpy_member_write_read_only", minNumOfPositionalArgs = 1, parameterNames = {"$self", "value"}) - protected abstract static class HPyReadOnlyMemberNode extends PythonBinaryBuiltinNode { - private static final Builtin builtin = HPyReadOnlyMemberNode.class.getAnnotation(Builtin.class); - private final TruffleString propertyName; - - protected HPyReadOnlyMemberNode(TruffleString propertyName) { - this.propertyName = propertyName; - } - - @Specialization - @SuppressWarnings("unused") - Object doGeneric(Object self, Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.ATTRIBUTE_S_OF_P_OBJECTS_IS_NOT_WRITABLE, propertyName, self); - } - - @TruffleBoundary - public static PBuiltinFunction createBuiltinFunction(PythonLanguage language, TruffleString propertyName) { - RootCallTarget builtinCt = language.createCachedCallTarget(l -> new BuiltinFunctionRootNode(l, builtin, new PrototypeNodeFactory<>(HPyReadOnlyMemberNodeGen.create(propertyName)), true), - HPyReadOnlyMemberNode.class, builtin.name()); - int flags = PBuiltinFunction.getFlags(builtin, builtinCt); - return PythonObjectFactory.getUncached().createBuiltinFunction(propertyName, null, 0, flags, builtinCt); - } - } - - @Builtin(name = "hpy_bad_member_descr", minNumOfPositionalArgs = 2, parameterNames = {"$self", "value"}) - protected abstract static class HPyBadMemberDescrNode extends PythonBinaryBuiltinNode { - private static final Builtin builtin = HPyBadMemberDescrNode.class.getAnnotation(Builtin.class); - - @Specialization - static Object doGeneric(Object self, @SuppressWarnings("unused") Object value, - @Cached PRaiseNode raiseNode) { - if (value == DescriptorDeleteMarker.INSTANCE) { - // This node is actually only used for T_NONE, so this error message is right. - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.CAN_T_DELETE_NUMERIC_CHAR_ATTRIBUTE); - } - throw raiseNode.raise(PythonBuiltinClassType.SystemError, ErrorMessages.BAD_MEMBER_DESCR_TYPE_FOR_P, self); - } - - @TruffleBoundary - public static PBuiltinFunction createBuiltinFunction(PythonLanguage language, TruffleString propertyName) { - RootCallTarget builtinCt = language.createCachedCallTarget(l -> new BuiltinFunctionRootNode(l, builtin, new PrototypeNodeFactory<>(HPyBadMemberDescrNodeGen.create()), true), - HPyBadMemberDescrNode.class, builtin.name()); - int flags = PBuiltinFunction.getFlags(builtin, builtinCt); - return PythonObjectFactory.getUncached().createBuiltinFunction(propertyName, null, 0, flags, builtinCt); - } - } - - @Builtin(name = "hpy_write_member", minNumOfPositionalArgs = 2, parameterNames = {"$self", "value"}) - protected abstract static class HPyWriteMemberNode extends PythonBinaryBuiltinNode { - private static final Builtin builtin = HPyWriteMemberNode.class.getAnnotation(Builtin.class); - - @Child private AsNativeCharNode asNativeCharNode; - @Child private PyLongAsLongNode pyLongAsLongNode; - @Child private PyFloatAsDoubleCachedNode pyFloatAsDoubleNode; - @Child private AsNativePrimitiveNode asNativePrimitiveNode; - @Child private IsBuiltinObjectExactProfile isBuiltinObjectProfile; - @Child private IsNode isNode; - @Child private GraalHPyCAccess.ReadHPyFieldNode readHPyFieldNode; - @Child private GraalHPyCAccess.WriteHPyFieldNode writeHPyFieldNode; - @Child private GraalHPyCAccess.WriteGenericNode writeGenericNode; - @Child private HPyGetNativeSpacePointerNode readNativeSpaceNode; - - /** The specified member type. */ - private final int type; - - /** The offset where to read from (will be passed to the native getter). */ - private final int offset; - - protected HPyWriteMemberNode(int type, int offset) { - this.type = type; - this.offset = offset; - } - - @Specialization - Object doGeneric(VirtualFrame frame, Object self, Object value, - @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { - PythonContext context = getContext(); - GraalHPyContext hPyContext = context.getHPyContext(); - - Object nativeSpacePtr = ensureReadNativeSpaceNode().executeCached(self); - if (nativeSpacePtr == PNone.NO_VALUE) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.SystemError, ErrorMessages.ATTEMPTING_WRITE_OFFSET_D, offset, self); - } - - /* - * Deleting values is only allowed for members with object type (see structmember.c: - * PyMember_SetOne). - */ - Object newValue; - if (value == DescriptorDeleteMarker.INSTANCE) { - if (type == HPY_MEMBER_OBJECT_EX) { - if (self instanceof PythonObject pythonObject) { - Object oldValue = ensureReadHPyFieldNode(hPyContext).read(hPyContext, pythonObject, nativeSpacePtr, offset); - if (oldValue == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.AttributeError); - } - } else { - throw CompilerDirectives.shouldNotReachHere("Cannot have HPyField on non-Python object"); - } - } else if (type != HPY_MEMBER_OBJECT) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.CAN_T_DELETE_NUMERIC_CHAR_ATTRIBUTE); - } - // NO_VALUE will be converted to the NULL handle - newValue = PNone.NO_VALUE; - } else { - newValue = value; - } - - long val; - switch (type) { - case HPY_MEMBER_SHORT: - val = ensurePyLongAsLongNode().executeCached(frame, newValue); - ensureWriteGenericNode(hPyContext).execute(hPyContext, nativeSpacePtr, offset, Int16_t, val); - // TODO(fa): truncation warning - // if ((long_val > SHRT_MAX) || (long_val < SHRT_MIN)) - // WARN("Truncation of value to short"); - break; - case HPY_MEMBER_INT: - val = ensurePyLongAsLongNode().executeCached(frame, newValue); - ensureWriteGenericNode(hPyContext).execute(hPyContext, nativeSpacePtr, offset, Int, val); - // TODO(fa): truncation warning - // if ((long_val > INT_MAX) || (long_val < INT_MIN)) - // WARN("Truncation of value to int"); - break; - case HPY_MEMBER_LONG: - val = ensurePyLongAsLongNode().executeCached(frame, newValue); - ensureWriteGenericNode(hPyContext).execute(hPyContext, nativeSpacePtr, offset, HPyContextSignatureType.Long, val); - break; - case HPY_MEMBER_FLOAT: { - float fvalue = (float) ensurePyFloatAsDoubleNode().execute(frame, newValue); - ensureWriteGenericNode(hPyContext).execute(hPyContext, nativeSpacePtr, offset, CFloat, fvalue); - break; - } - case HPY_MEMBER_DOUBLE: { - double dvalue = ensurePyFloatAsDoubleNode().execute(frame, newValue); - ensureWriteGenericNode(hPyContext).execute(hPyContext, nativeSpacePtr, offset, CDouble, dvalue); - break; - } - case HPY_MEMBER_STRING, HPY_MEMBER_STRING_INPLACE: - /* - * This node is never created for string members because they are not writeable - * and we create HPyReadOnlyMemberNode for those. - */ - throw CompilerDirectives.shouldNotReachHere(); - case HPY_MEMBER_OBJECT, HPY_MEMBER_OBJECT_EX: - if (self instanceof PythonObject pythonObject) { - ensureWriteHPyFieldNode(hPyContext).execute(hPyContext, pythonObject, nativeSpacePtr, offset, newValue); - } else { - throw CompilerDirectives.shouldNotReachHere("Cannot have HPyField on non-Python object"); - } - break; - case HPY_MEMBER_CHAR: - val = ensureAsNativeCharNode().executeByte(newValue); - ensureWriteGenericNode(hPyContext).execute(hPyContext, nativeSpacePtr, offset, Int8_t, val); - break; - case HPY_MEMBER_BYTE: - val = ensurePyLongAsLongNode().executeCached(frame, newValue); - ensureWriteGenericNode(hPyContext).execute(hPyContext, nativeSpacePtr, offset, Int8_t, val); - // TODO(fa): truncation warning - // if ((long_val > CHAR_MAX) || (long_val < CHAR_MIN)) - // WARN("Truncation of value to char"); - break; - case HPY_MEMBER_UBYTE: - val = ensurePyLongAsLongNode().executeCached(frame, newValue); - ensureWriteGenericNode(hPyContext).execute(hPyContext, nativeSpacePtr, offset, Uint8_t, val); - // TODO(fa): truncation warning - // if ((long_val > UCHAR_MAX) || (long_val < 0)) - // WARN("Truncation of value to unsigned char"); - break; - case HPY_MEMBER_USHORT: - val = ensurePyLongAsLongNode().executeCached(frame, newValue); - ensureWriteGenericNode(hPyContext).execute(hPyContext, nativeSpacePtr, offset, Uint16_t, val); - // TODO(fa): truncation warning - // if ((long_val > USHRT_MAX) || (long_val < 0)) - // WARN("Truncation of value to unsigned short"); - break; - case HPY_MEMBER_UINT: { - val = ensurePyLongAsLongNode().executeCached(frame, newValue); - Object uint = ensureAsNativePrimitiveNode().execute(val, 0, hPyContext.getCTypeSize(UnsignedInt), true); - ensureWriteGenericNode(hPyContext).execute(hPyContext, nativeSpacePtr, offset, UnsignedInt, uint); - break; - } - case HPY_MEMBER_ULONG: { - val = ensurePyLongAsLongNode().executeCached(frame, newValue); - Object ulong = ensureAsNativePrimitiveNode().execute(val, 0, hPyContext.getCTypeSize(UnsignedLong), true); - ensureWriteGenericNode(hPyContext).execute(hPyContext, nativeSpacePtr, offset, UnsignedLong, ulong); - break; - } - case HPY_MEMBER_BOOL: - // note: exact type check is sufficient; bool cannot be subclassed - if (!ensureIsBuiltinObjectProfile().profileObject(this, newValue, PythonBuiltinClassType.Boolean)) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_VALUE_MUST_BE_BOOL); - } - val = ensureIsNode().isTrue(newValue) ? 1 : 0; - ensureWriteGenericNode(hPyContext).execute(hPyContext, nativeSpacePtr, offset, Bool, val); - break; - case HPY_MEMBER_LONGLONG: - val = ensurePyLongAsLongNode().executeCached(frame, newValue); - ensureWriteGenericNode(hPyContext).execute(hPyContext, nativeSpacePtr, offset, Int64_t, val); - break; - case HPY_MEMBER_ULONGLONG: - val = ensurePyLongAsLongNode().executeCached(frame, newValue); - val = (long) ensureAsNativePrimitiveNode().execute(val, 0, 8, true); - ensureWriteGenericNode(hPyContext).execute(hPyContext, nativeSpacePtr, offset, Int64_t, val); - break; - case HPY_MEMBER_HPYSSIZET: - // TODO(fa): PyLongAsLong is not correct - val = ensurePyLongAsLongNode().executeCached(frame, newValue); - ensureWriteGenericNode(hPyContext).execute(hPyContext, nativeSpacePtr, offset, HPyContextSignatureType.HPy_ssize_t, val); - break; - default: - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.SystemError, ErrorMessages.BAD_MEMBER_DESCR_TYPE_FOR_S, ""); - } - return PNone.NONE; - } - - private GraalHPyCAccess.ReadHPyFieldNode ensureReadHPyFieldNode(GraalHPyContext ctx) { - if (readHPyFieldNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readHPyFieldNode = insert(GraalHPyCAccess.ReadHPyFieldNode.create(ctx)); - } - return readHPyFieldNode; - } - - private GraalHPyCAccess.WriteHPyFieldNode ensureWriteHPyFieldNode(GraalHPyContext ctx) { - if (writeHPyFieldNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - writeHPyFieldNode = insert(GraalHPyCAccess.WriteHPyFieldNode.create(ctx)); - } - return writeHPyFieldNode; - } - - private GraalHPyCAccess.WriteGenericNode ensureWriteGenericNode(GraalHPyContext ctx) { - if (writeGenericNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - writeGenericNode = insert(GraalHPyCAccess.WriteGenericNode.create(ctx)); - } - return writeGenericNode; - } - - private HPyGetNativeSpacePointerNode ensureReadNativeSpaceNode() { - if (readNativeSpaceNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readNativeSpaceNode = insert(HPyGetNativeSpacePointerNodeGen.create()); - } - return readNativeSpaceNode; - } - - private PyLongAsLongNode ensurePyLongAsLongNode() { - if (pyLongAsLongNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - pyLongAsLongNode = insert(PyLongAsLongNodeGen.create()); - } - return pyLongAsLongNode; - } - - private PyFloatAsDoubleCachedNode ensurePyFloatAsDoubleNode() { - if (pyFloatAsDoubleNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - pyFloatAsDoubleNode = insert(PyFloatAsDoubleCachedNodeGen.create()); - } - return pyFloatAsDoubleNode; - } - - private AsNativePrimitiveNode ensureAsNativePrimitiveNode() { - if (asNativePrimitiveNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - asNativePrimitiveNode = insert(AsNativePrimitiveNodeGen.create()); - } - return asNativePrimitiveNode; - } - - private IsBuiltinObjectExactProfile ensureIsBuiltinObjectProfile() { - if (isBuiltinObjectProfile == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - isBuiltinObjectProfile = insert(IsBuiltinObjectExactProfile.create()); - } - return isBuiltinObjectProfile; - } - - private IsNode ensureIsNode() { - if (isNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - isNode = insert(IsNode.create()); - } - return isNode; - } - - private AsNativeCharNode ensureAsNativeCharNode() { - if (asNativeCharNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - asNativeCharNode = insert(AsNativeCharNodeGen.create()); - } - return asNativeCharNode; - } - - @TruffleBoundary - public static PBuiltinFunction createBuiltinFunction(PythonLanguage language, TruffleString propertyName, int type, int offset) { - if (isReadOnlyType(type)) { - return HPyReadOnlyMemberNode.createBuiltinFunction(language, propertyName); - } - if (type == HPY_MEMBER_NONE) { - return HPyBadMemberDescrNode.createBuiltinFunction(language, propertyName); - } - RootCallTarget callTarget = language.createCachedPropAccessCallTarget( - l -> new BuiltinFunctionRootNode(l, builtin, new PrototypeNodeFactory<>(HPyWriteMemberNodeGen.create(type, offset)), true), - HPyWriteMemberNode.class, builtin.name(), type, offset); - int flags = PBuiltinFunction.getFlags(builtin, callTarget); - return PythonObjectFactory.getUncached().createBuiltinFunction(propertyName, null, 0, flags, callTarget); - } - } - - @GenerateInline(false) - abstract static class PyFloatAsDoubleCachedNode extends Node { - - public abstract double execute(VirtualFrame frame, Object object); - - @Specialization - static double doGeneric(VirtualFrame frame, Object object, - @Bind("this") Node inliningTarget, - @Cached PyFloatAsDoubleNode pyFloatAsDoubleNode) { - return pyFloatAsDoubleNode.execute(frame, inliningTarget, object); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyNativeCache.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyNativeCache.java deleted file mode 100644 index 4b3cb6b7f7..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyNativeCache.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.SIZEOF_LONG; - -import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers; - -import sun.misc.Unsafe; - -/** - * HPy native cache implementation. For documentation of the layout, see {@code hpy_native_cache.h}. - */ -public abstract class GraalHPyNativeCache { - - private static final Unsafe UNSAFE = CArrayWrappers.UNSAFE; - - private static final long HANDLE_MIRROR_OFFSET = 1; - - static long toBytes(long idx) { - return (HANDLE_MIRROR_OFFSET + idx) * SIZEOF_LONG; - } - - static long allocateNativeCache(int nHandleTable, int nGlobalsTable) { - long arraySize = toBytes(nHandleTable + nGlobalsTable); - long arrayPtr = UNSAFE.allocateMemory(arraySize); - UNSAFE.setMemory(arrayPtr, arraySize, (byte) 0); - UNSAFE.putLong(arrayPtr, nHandleTable); - return arrayPtr; - } - - static long reallocateNativeCache(long cachePtr, int nHandleTableOld, int nHandleTable, int nGlobalsTableOld, int nGlobalsTable) { - if (nHandleTableOld > nHandleTable || nGlobalsTableOld > nGlobalsTable) { - throw new RuntimeException("shrinking HPy handle/globals table is not yet supported"); - } - long arraySize = toBytes(nHandleTable + nGlobalsTable); - long newCachePtr = UNSAFE.reallocateMemory(cachePtr, arraySize); - if (nHandleTableOld != nHandleTable) { - // update handle table size - UNSAFE.putLong(newCachePtr, nHandleTable); - // move globals table entries (only if the handle table size changed) - UNSAFE.copyMemory(newCachePtr + toBytes(nHandleTableOld), newCachePtr + toBytes(nHandleTable), nGlobalsTableOld * SIZEOF_LONG); - } - return newCachePtr; - } - - static void putHandleNativeSpacePointer(long cachePtr, int handleID, long value) { - UNSAFE.putLong(cachePtr + toBytes(handleID), value); - } - - static void putGlobalNativeSpacePointer(long cachePtr, long nHandleTable, int globalID, long value) { - UNSAFE.putLong(cachePtr + toBytes(nHandleTable + globalID), value); - } - - static void initGlobalsNativeSpacePointer(long cachePtr, long nHandleTable, int globalStartID, int numElem) { - UNSAFE.setMemory(cachePtr + toBytes(nHandleTable + globalStartID), numElem * SIZEOF_LONG, (byte) 0); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyNativeContext.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyNativeContext.java deleted file mode 100644 index 7575f0d193..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyNativeContext.java +++ /dev/null @@ -1,336 +0,0 @@ -/* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.MemoryError; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.RecursionError; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError; -import static com.oracle.graal.python.util.PythonUtils.EMPTY_OBJECT_ARRAY; - -import java.io.IOException; -import java.io.PrintStream; - -import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ApiInitException; -import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ImportException; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.AllocateNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.BulkFreeHandleReferencesNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.FreeNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.GetElementPtrNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.IsNullNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadDoubleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadFloatNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadHPyArrayNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadHPyFieldNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadHPyNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadI32Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadI64Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadI8ArrayNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadPointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteDoubleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteGenericNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteHPyFieldNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteHPyNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteI32Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteI64Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WritePointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteSizeTNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.HPyABIVersion; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.HPyUpcall; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyAsCharPointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyCallHelperFunctionNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyFromCharPointerNode; -import com.oracle.graal.python.builtins.objects.exception.PBaseException; -import com.oracle.graal.python.builtins.objects.module.PythonModule; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.util.CannotCastException; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.exception.ExceptionUtils; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.interop.ArityException; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.TruffleObject; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.interop.UnsupportedTypeException; -import com.oracle.truffle.api.library.ExportLibrary; -import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.strings.TruffleString; - -@ExportLibrary(InteropLibrary.class) -public abstract class GraalHPyNativeContext implements TruffleObject { - - protected final GraalHPyContext context; - - protected GraalHPyNativeContext(GraalHPyContext context, boolean traceUpcalls) { - this.context = context; - } - - protected abstract String getName(); - - protected final PythonContext getContext() { - return context.getContext(); - } - - protected abstract void initNativeContext() throws ApiInitException; - - protected abstract void finalizeNativeContext(); - - protected abstract Object loadExtensionLibrary(Node location, PythonContext context, TruffleString name, TruffleString path) throws ImportException, IOException; - - protected abstract HPyABIVersion getHPyABIVersion(Object extLib, String getMajorVersionFuncName, String getMinorVersionFuncName) throws Exception; - - /** - * Execute an HPy extension's init function and return the raw result value. - * - * @param extLib The HPy extension's shared library object (received from - * {@link #loadExtensionLibrary(Node, PythonContext, TruffleString, TruffleString)}). - * @param initFuncName The HPy extension's init function name (e.g. {@code HPyInit_poc}). - * @param name The HPy extension's name as requested by the user. - * @param path The HPy extension's shared library path. - * @param mode An enum indicating which mode should be used to initialize the HPy extension. - * @return The bare (unconverted) result of the HPy extension's init function. This will be a - * handle that was created with the given {@code hpyContext}. - */ - protected abstract Object initHPyModule(Object extLib, String initFuncName, TruffleString name, TruffleString path, HPyMode mode) - throws UnsupportedMessageException, ArityException, UnsupportedTypeException, ImportException, ApiInitException; - - protected abstract HPyUpcall[] getUpcalls(); - - protected abstract int[] getUpcallCounts(); - - public abstract void initHPyDebugContext() throws ApiInitException; - - public abstract void initHPyTraceContext() throws ApiInitException; - - public abstract PythonModule getHPyDebugModule() throws ImportException; - - public abstract PythonModule getHPyTraceModule() throws ImportException; - - protected abstract void setNativeCache(long cachePtr); - - protected abstract int getCTypeSize(HPyContextSignatureType ctype); - - protected abstract int getCFieldOffset(GraalHPyCField cfield); - - /** - * Converts a native pointer from the representation used by this native context (e.g. - * {@link Long}) to an interop pointer object that responds to interop messages - * {@link InteropLibrary#isPointer(Object)} and {@link InteropLibrary#asPointer(Object)}. - */ - protected abstract Object nativeToInteropPointer(Object object); - - protected abstract Object getNativeNull(); - - protected abstract Object createArgumentsArray(Object[] args); - - protected abstract void freeArgumentsArray(Object argsArray); - - public abstract HPyCallHelperFunctionNode createCallHelperFunctionNode(); - - public abstract HPyCallHelperFunctionNode getUncachedCallHelperFunctionNode(); - - public abstract HPyFromCharPointerNode createFromCharPointerNode(); - - public abstract HPyFromCharPointerNode getUncachedFromCharPointerNode(); - - protected final boolean useNativeFastPaths() { - return context.useNativeFastPaths; - } - - public final GraalHPyContext getHPyContext() { - return context; - } - - @ExportMessage - public void toNative() { - try { - toNativeInternal(); - if (useNativeFastPaths()) { - initNativeFastPaths(); - /* - * Allocate a native array for the native space pointers of HPy objects and - * initialize it. - */ - context.allocateNativeSpacePointersMirror(); - } - } catch (CannotCastException e) { - /* - * We should only receive 'toNative' if native access is allowed. Hence, the exception - * should never happen. - */ - throw CompilerDirectives.shouldNotReachHere(); - } - } - - protected abstract void toNativeInternal(); - - protected abstract void initNativeFastPaths(); - - @TruffleBoundary - public static PException checkThrowableBeforeNative(Throwable t, String where1, Object where2) { - if (t instanceof PException pe) { - // this is ok, and will be handled correctly - throw pe; - } - if (t instanceof ThreadDeath td) { - // ThreadDeath subclasses are used internally by Truffle - throw td; - } - if (t instanceof StackOverflowError soe) { - CompilerDirectives.transferToInterpreter(); - PythonContext context = PythonContext.get(null); - context.ensureGilAfterFailure(); - PBaseException newException = context.factory().createBaseException(RecursionError, ErrorMessages.MAXIMUM_RECURSION_DEPTH_EXCEEDED, EMPTY_OBJECT_ARRAY); - throw ExceptionUtils.wrapJavaException(soe, null, newException); - } - if (t instanceof OutOfMemoryError oome) { - PBaseException newException = PythonContext.get(null).factory().createBaseException(MemoryError); - throw ExceptionUtils.wrapJavaException(oome, null, newException); - } - // everything else: log and convert to PException (SystemError) - CompilerDirectives.transferToInterpreter(); - PNodeWithContext.printStack(); - PrintStream out = new PrintStream(PythonContext.get(null).getEnv().err()); - out.println("while executing " + where1 + " " + where2); - out.println("should not throw exceptions apart from PException"); - t.printStackTrace(out); - out.flush(); - throw PRaiseNode.raiseUncached(null, SystemError, ErrorMessages.INTERNAL_EXCEPTION_OCCURED); - } - - public abstract AllocateNode createAllocateNode(); - - public abstract AllocateNode getUncachedAllocateNode(); - - public abstract FreeNode createFreeNode(); - - public abstract FreeNode getUncachedFreeNode(); - - public abstract ReadI32Node createReadI32Node(); - - public abstract ReadI32Node getUncachedReadI32Node(); - - public abstract ReadI64Node createReadI64Node(); - - public abstract ReadI64Node getUncachedReadI64Node(); - - public abstract ReadFloatNode createReadFloatNode(); - - public abstract ReadFloatNode getUncachedReadFloatNode(); - - public abstract ReadDoubleNode createReadDoubleNode(); - - public abstract ReadDoubleNode getUncachedReadDoubleNode(); - - public abstract ReadPointerNode createReadPointerNode(); - - public abstract ReadPointerNode getUncachedReadPointerNode(); - - public abstract WriteDoubleNode createWriteDoubleNode(); - - public abstract WriteDoubleNode getUncachedWriteDoubleNode(); - - public abstract WriteI32Node createWriteI32Node(); - - public abstract WriteI32Node getUncachedWriteI32Node(); - - public abstract WriteI64Node createWriteI64Node(); - - public abstract WriteI64Node getUncachedWriteI64Node(); - - public abstract WriteHPyNode createWriteHPyNode(); - - public abstract WriteHPyNode getUncachedWriteHPyNode(); - - public abstract ReadI8ArrayNode createReadI8ArrayNode(); - - public abstract ReadI8ArrayNode getUncachedReadI8ArrayNode(); - - public abstract WritePointerNode createWritePointerNode(); - - public abstract WritePointerNode getUncachedWritePointerNode(); - - public abstract ReadHPyArrayNode createReadHPyArrayNode(); - - public abstract ReadHPyArrayNode getUncachedReadHPyArrayNode(); - - public abstract ReadHPyNode createReadHPyNode(); - - public abstract ReadHPyNode getUncachedReadHPyNode(); - - public abstract ReadHPyFieldNode createReadHPyFieldNode(); - - public abstract ReadHPyFieldNode getUncachedReadFieldHPyNode(); - - public abstract IsNullNode createIsNullNode(); - - public abstract IsNullNode getUncachedIsNullNode(); - - public abstract GraalHPyCAccess.ReadGenericNode createReadGenericNode(); - - public abstract GraalHPyCAccess.ReadGenericNode getUncachedReadGenericNode(); - - public abstract WriteSizeTNode createWriteSizeTNode(); - - public abstract WriteSizeTNode getUncachedWriteSizeTNode(); - - public abstract GetElementPtrNode createGetElementPtrNode(); - - public abstract GetElementPtrNode getUncachedGetElementPtrNode(); - - public abstract WriteHPyFieldNode createWriteHPyFieldNode(); - - public abstract WriteHPyFieldNode getUncachedWriteHPyFieldNode(); - - public abstract WriteGenericNode createWriteGenericNode(); - - public abstract WriteGenericNode getUncachedWriteGenericNode(); - - public abstract BulkFreeHandleReferencesNode createBulkFreeHandleReferencesNode(); - - public abstract HPyAsCharPointerNode createAsCharPointerNode(); - - public abstract HPyAsCharPointerNode getUncachedAsCharPointerNode(); -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyNativeSymbol.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyNativeSymbol.java deleted file mode 100644 index 9366d0a759..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyNativeSymbol.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -public enum GraalHPyNativeSymbol { - - GRAAL_HPY_BUFFER_TO_NATIVE("graal_hpy_buffer_to_native"), - GRAAL_HPY_FREE("graal_hpy_free"), - GRAAL_HPY_FROM_HPY_ARRAY("graal_hpy_from_HPy_array"), - GRAAL_HPY_GET_ERRNO("graal_hpy_get_errno"), - GRAAL_HPY_GET_STRERROR("graal_hpy_get_strerror"), - GRAAL_HPY_STRLEN("graal_hpy_strlen"), - GRAAL_HPY_ARRAY_TO_NATIVE("graal_hpy_array_to_native"), - GRAAL_HPY_FROM_I8_ARRAY("graal_hpy_from_i8_array"), - GRAAL_HPY_CONTEXT_TO_NATIVE("graal_hpy_context_to_native"), - GRAAL_HPY_CALLOC("graal_hpy_calloc"), - GRAAL_HPY_GET_FIELD_I("graal_hpy_get_field_i"), - GRAAL_HPY_SET_FIELD_I("graal_hpy_set_field_i"), - GRAAL_HPY_GET_GLOBAL_I("graal_hpy_get_global_i"), - GRAAL_HPY_SET_GLOBAL_I("graal_hpy_set_global_i"), - GRAAL_HPY_GET_ELEMENT_PTR("graal_hpy_get_element_ptr"), - - /* C functions for reading native members by offset */ - GRAAL_HPY_READ_BOOL("graal_hpy_read_bool"), - GRAAL_HPY_READ_I8("graal_hpy_read_i8"), - GRAAL_HPY_READ_UI8("graal_hpy_read_ui8"), - GRAAL_HPY_READ_I16("graal_hpy_read_i16"), - GRAAL_HPY_READ_UI16("graal_hpy_read_ui16"), - GRAAL_HPY_READ_I32("graal_hpy_read_i32"), - GRAAL_HPY_READ_UI32("graal_hpy_read_ui32"), - GRAAL_HPY_READ_I64("graal_hpy_read_i64"), - GRAAL_HPY_READ_UI64("graal_hpy_read_ui64"), - GRAAL_HPY_READ_I("graal_hpy_read_i"), - GRAAL_HPY_READ_L("graal_hpy_read_l"), - GRAAL_HPY_READ_F("graal_hpy_read_f"), - GRAAL_HPY_READ_D("graal_hpy_read_d"), - GRAAL_HPY_READ_PTR("graal_hpy_read_ptr"), - GRAAL_HPY_READ_HPY("graal_hpy_read_HPy"), - GRAAL_HPY_READ_HPYFIELD("graal_hpy_read_HPyField"), - GRAAL_HPY_READ_UI("graal_hpy_read_ui"), - GRAAL_HPY_READ_UL("graal_hpy_read_ul"), - GRAAL_HPY_READ_HPY_SSIZE_T("graal_hpy_read_HPy_ssize_t"), - - /* C functions for writing native members by offset */ - GRAAL_HPY_WRITE_BOOL("graal_hpy_write_bool"), - GRAAL_HPY_WRITE_I8("graal_hpy_write_i8"), - GRAAL_HPY_WRITE_UI8("graal_hpy_write_ui8"), - GRAAL_HPY_WRITE_I16("graal_hpy_write_i16"), - GRAAL_HPY_WRITE_UI16("graal_hpy_write_ui16"), - GRAAL_HPY_WRITE_I32("graal_hpy_write_i32"), - GRAAL_HPY_WRITE_UI32("graal_hpy_write_ui32"), - GRAAL_HPY_WRITE_I64("graal_hpy_write_i64"), - GRAAL_HPY_WRITE_UI64("graal_hpy_write_ui64"), - GRAAL_HPY_WRITE_I("graal_hpy_write_i"), - GRAAL_HPY_WRITE_L("graal_hpy_write_l"), - GRAAL_HPY_WRITE_F("graal_hpy_write_f"), - GRAAL_HPY_WRITE_D("graal_hpy_write_d"), - GRAAL_HPY_WRITE_HPY("graal_hpy_write_HPy"), - GRAAL_HPY_WRITE_HPYFIELD("graal_hpy_write_HPyField"), - GRAAL_HPY_WRITE_UI("graal_hpy_write_ui"), - GRAAL_HPY_WRITE_UL("graal_hpy_write_ul"), - GRAAL_HPY_WRITE_HPY_SSIZE_T("graal_hpy_write_HPy_ssize_t"), - GRAAL_HPY_WRITE_PTR("graal_hpy_write_ptr"), - - GRAAL_HPY_BULK_FREE("graal_hpy_bulk_free"); - - private final String name; - - GraalHPyNativeSymbol(String name) { - this.name = name; - } - - public String getName() { - return name; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyNodes.java deleted file mode 100644 index fdd8315164..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyNodes.java +++ /dev/null @@ -1,3183 +0,0 @@ -/* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPySlot.HPY_TP_CALL; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPySlot.HPY_TP_DESTROY; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPySlot.HPY_TP_NEW; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPySlot.HPY_TP_TRAVERSE; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyHandle.NULL_HANDLE_DELEGATE; -import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_basicsize; -import static com.oracle.graal.python.nodes.StringLiterals.T_EXEC; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; -import static com.oracle.graal.python.util.PythonUtils.tsLiteral; - -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.logging.Level; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.PythonAbstractObject; -import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; -import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject; -import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.CreateFunctionNode; -import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.CreateMethodNode; -import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.FromCharPointerNode; -import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.AsNativePrimitiveNode; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.ConvertPIntToPrimitiveNode; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.TransformExceptionToNativeNode; -import com.oracle.graal.python.builtins.objects.cext.common.CExtContext; -import com.oracle.graal.python.builtins.objects.cext.common.CExtToJavaNode; -import com.oracle.graal.python.builtins.objects.cext.common.CExtToNativeNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadGenericNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadHPyNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.LLVMType; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPyFuncSignature; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPySlot; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPySlotWrapper; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyLegacyDef.HPyLegacySlot; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyMemberAccessNodes.HPyReadMemberNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyMemberAccessNodes.HPyWriteMemberNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyAllHandleCloseNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyAttachJNIFunctionTypeNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyAttachNFIFunctionTypeNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyCloseHandleNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyGetNativeSpacePointerNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyGetSetSetterHandleCloseNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyKeywordsHandleCloseNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyRaiseNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyRichcmptFuncArgsCloseNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPySSizeObjArgProcCloseNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPySelfHandleCloseNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyTransformExceptionToNativeNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyTypeGetNameNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyVarargsHandleCloseNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyObjectBuiltins.HPyObjectNewNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyExternalFunctionNodes.HPyCheckFunctionResultNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyExternalFunctionNodes.HPyCheckHandleResultNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyExternalFunctionNodes.HPyCheckPrimitiveResultNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyExternalFunctionNodes.HPyGetSetDescriptorGetterRootNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyExternalFunctionNodes.HPyGetSetDescriptorSetterRootNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyExternalFunctionNodes.HPyLegacyGetSetDescriptorGetterRoot; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyExternalFunctionNodes.HPyLegacyGetSetDescriptorSetterRoot; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNIFunctionPointer; -import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; -import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; -import com.oracle.graal.python.builtins.objects.dict.PDict; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor; -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.function.PKeyword; -import com.oracle.graal.python.builtins.objects.getsetdescriptor.GetSetDescriptor; -import com.oracle.graal.python.builtins.objects.ints.PInt; -import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; -import com.oracle.graal.python.builtins.objects.module.PythonModule; -import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.type.PythonClass; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.builtins.objects.type.TpSlots; -import com.oracle.graal.python.builtins.objects.type.TpSlots.Builder; -import com.oracle.graal.python.builtins.objects.type.TpSlots.TpSlotMeta; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetBaseClassNode; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.HasSameConstructorNode; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotNative; -import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; -import com.oracle.graal.python.lib.PyObjectGetItem; -import com.oracle.graal.python.lib.PyObjectIsTrueNode; -import com.oracle.graal.python.nodes.BuiltinNames; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.HiddenAttr; -import com.oracle.graal.python.nodes.PGuards; -import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.SpecialAttributeNames; -import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; -import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; -import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode; -import com.oracle.graal.python.nodes.attributes.WriteAttributeToPythonObjectNode; -import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.classes.IsSubtypeNode; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.object.IsNode; -import com.oracle.graal.python.nodes.util.CannotCastException; -import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.PythonContext.PythonThreadState; -import com.oracle.graal.python.runtime.PythonImageBuildOptions; -import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; -import com.oracle.graal.python.util.OverflowException; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CallTarget; -import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.CompilerDirectives.ValueType; -import com.oracle.truffle.api.RootCallTarget; -import com.oracle.truffle.api.TruffleLogger; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.Fallback; -import com.oracle.truffle.api.dsl.GenerateCached; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.Frame; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.interop.ArityException; -import com.oracle.truffle.api.interop.InteropException; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.interop.UnsupportedTypeException; -import com.oracle.truffle.api.library.CachedLibrary; -import com.oracle.truffle.api.nodes.ExplodeLoop; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.object.DynamicObjectLibrary; -import com.oracle.truffle.api.profiles.InlinedBranchProfile; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; -import com.oracle.truffle.api.profiles.InlinedExactClassProfile; -import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile; -import com.oracle.truffle.api.source.Source; -import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.api.strings.TruffleString.Encoding; -import com.oracle.truffle.nfi.api.SignatureLibrary; - -public abstract class GraalHPyNodes { - - /** - * A node interface for calling (native) helper functions. The implementation depends on the HPy - * backend. This is the reason why this node takes the HPy context as construction parameter. - * The recommended usage of this node is - * - *
      -     * @Specialization
      -     * Object doSomething(GraalHPyContext hpyContext,
      -     *                 @Cached(parameters = "hpyContext") HPyCallHelperFunctionNode callHelperNode) {
      -     *     // ...
      -     * }
      -     * 
      - */ - public abstract static class HPyCallHelperFunctionNode extends Node { - public final Object call(GraalHPyContext context, GraalHPyNativeSymbol name, Object... args) { - return execute(context, name, args); - } - - protected abstract Object execute(GraalHPyContext context, GraalHPyNativeSymbol name, Object[] args); - - @NeverDefault - public static HPyCallHelperFunctionNode create(GraalHPyContext context) { - return context.getBackend().createCallHelperFunctionNode(); - } - - public static HPyCallHelperFunctionNode getUncached(GraalHPyContext context) { - return context.getBackend().getUncachedCallHelperFunctionNode(); - } - } - - /** - * Use this node to transform an exception to native if a Python exception was thrown during an - * upcall and before returning to native code. This node will correctly link to the current - * frame using the frame reference and tries to avoid any materialization of the frame. The - * exception is then registered in the native context as the current exception. - */ - @GenerateInline - @GenerateCached(false) - @GenerateUncached - public abstract static class HPyTransformExceptionToNativeNode extends Node { - - public abstract void execute(Frame frame, Node inliningTarget, GraalHPyContext nativeContext, PException e); - - public final void execute(Node inliningTarget, GraalHPyContext nativeContext, PException e) { - execute(null, inliningTarget, nativeContext, e); - } - - public final void execute(Node inliningTarget, PException e) { - execute(null, inliningTarget, PythonContext.get(this).getHPyContext(), e); - } - - public static void executeUncached(GraalHPyContext nativeContext, PException e) { - HPyTransformExceptionToNativeNodeGen.getUncached().execute(null, nativeContext, e); - } - - public static void executeUncached(PException e) { - HPyTransformExceptionToNativeNodeGen.getUncached().execute(null, null, e); - } - - @Specialization - static void setCurrentException(Frame frame, Node inliningTarget, @SuppressWarnings("unused") GraalHPyContext nativeContext, PException e, - @Cached TransformExceptionToNativeNode transformExceptionToNativeNode) { - transformExceptionToNativeNode.execute(frame, inliningTarget, e); - } - } - - @GenerateUncached - @GenerateInline(false) - public abstract static class HPyRaiseNode extends Node { - - public final int raiseInt(Frame frame, GraalHPyContext nativeContext, int errorValue, PythonBuiltinClassType errType, TruffleString format, Object... arguments) { - return executeInt(frame, nativeContext, errorValue, errType, format, arguments); - } - - public final Object raise(Frame frame, GraalHPyContext nativeContext, Object errorValue, PythonBuiltinClassType errType, TruffleString format, Object... arguments) { - return execute(frame, nativeContext, errorValue, errType, format, arguments); - } - - public final int raiseIntWithoutFrame(GraalHPyContext nativeContext, int errorValue, PythonBuiltinClassType errType, TruffleString format, Object... arguments) { - return executeInt(null, nativeContext, errorValue, errType, format, arguments); - } - - public final Object raiseWithoutFrame(GraalHPyContext nativeContext, Object errorValue, PythonBuiltinClassType errType, TruffleString format, Object... arguments) { - return execute(null, nativeContext, errorValue, errType, format, arguments); - } - - public static int raiseIntUncached(GraalHPyContext nativeContext, int errorValue, PythonBuiltinClassType errType, TruffleString format, Object... arguments) { - return HPyRaiseNodeGen.getUncached().raiseIntWithoutFrame(nativeContext, errorValue, errType, format, arguments); - } - - public abstract Object execute(Frame frame, GraalHPyContext nativeContext, Object errorValue, PythonBuiltinClassType errType, TruffleString format, Object[] arguments); - - public abstract int executeInt(Frame frame, GraalHPyContext nativeContext, int errorValue, PythonBuiltinClassType errType, TruffleString format, Object[] arguments); - - @Specialization - static int doInt(Frame frame, GraalHPyContext nativeContext, int errorValue, PythonBuiltinClassType errType, TruffleString format, Object[] arguments, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode raiseNode, - @Shared("transformExceptionToNativeNode") @Cached HPyTransformExceptionToNativeNode transformExceptionToNativeNode) { - try { - throw raiseNode.execute(raiseNode, errType, PNone.NO_VALUE, format, arguments); - } catch (PException p) { - transformExceptionToNativeNode.execute(frame, inliningTarget, nativeContext, p); - } - return errorValue; - } - - @Specialization - static Object doObject(Frame frame, GraalHPyContext nativeContext, Object errorValue, PythonBuiltinClassType errType, TruffleString format, Object[] arguments, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode raiseNode, - @Shared("transformExceptionToNativeNode") @Cached HPyTransformExceptionToNativeNode transformExceptionToNativeNode) { - try { - throw raiseNode.execute(raiseNode, errType, PNone.NO_VALUE, format, arguments); - } catch (PException p) { - transformExceptionToNativeNode.execute(frame, inliningTarget, nativeContext, p); - } - return errorValue; - } - } - - /** - * A node interface for creating a TruffleString from a {@code char *}. The implementation - * depends on the HPy backend. This is the reason why this node takes the HPy context as - * construction parameter. The recommended usage of this node is - * - *
      -     * @Specialization
      -     * Object doSomething(GraalHPyContext hpyContext,
      -     *                 @Cached(parameters = "hpyContext") HPyFromCharPointerNode fromCharPointerNode) {
      -     *     // ...
      -     * }
      -     * 
      - */ - public abstract static class HPyFromCharPointerNode extends Node { - - public final TruffleString execute(GraalHPyContext hpyContext, Object charPtr, boolean copy) { - return execute(hpyContext, charPtr, -1, Encoding.UTF_8, copy); - } - - public final TruffleString execute(GraalHPyContext hpyContext, Object charPtr, Encoding encoding) { - return execute(hpyContext, charPtr, -1, encoding, true); - } - - public abstract TruffleString execute(GraalHPyContext hpyContext, Object charPtr, int n, Encoding encoding, boolean copy); - - public abstract TruffleString execute(GraalHPyContext hpyContext, long charPtr, int n, Encoding encoding, boolean copy); - - @NeverDefault - public static HPyFromCharPointerNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createFromCharPointerNode(); - } - - public static HPyFromCharPointerNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedFromCharPointerNode(); - } - } - - public abstract static class HPyAsCharPointerNode extends Node { - - public abstract Object execute(GraalHPyContext hpyContext, TruffleString string, Encoding encoding); - - @NeverDefault - public static HPyAsCharPointerNode create(GraalHPyContext hpyContext) { - return hpyContext.getBackend().createAsCharPointerNode(); - } - - public static HPyAsCharPointerNode getUncached(GraalHPyContext hpyContext) { - return hpyContext.getBackend().getUncachedAsCharPointerNode(); - } - } - - /** - * Creates an HPy module from a module definition structure: - * - *
      -     * typedef struct {
      -     *     const char* doc;
      -     *     HPy_ssize_t size;
      -     *     cpy_PyMethodDef *legacy_methods;
      -     *     HPyDef **defines;
      -     *     HPyGlobal **globals;
      -     * } HPyModuleDef;
      -     * 
      - */ - @GenerateUncached - @GenerateCached(false) - @GenerateInline(false) // footprint reduction 108 -> 89 - public abstract static class GraalHPyModuleCreate extends Node { - - private static final TruffleLogger LOGGER = GraalHPyContext.getLogger(GraalHPyModuleCreate.class); - - public abstract Object execute(GraalHPyContext hpyContext, TruffleString mName, Object spec, Object moduleDefPtr); - - @Specialization - static Object doGeneric(GraalHPyContext context, TruffleString mName, Object spec, Object moduleDefPtr, - @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, - @Cached(parameters = "context") GraalHPyCAccess.ReadPointerNode readPointerNode, - @Cached(parameters = "context") GraalHPyCAccess.IsNullNode isNullNode, - @Cached(parameters = "context") GraalHPyCAccess.ReadGenericNode readGenericNode, - @Cached(parameters = "context") GraalHPyCAccess.WriteSizeTNode writeSizeTNode, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached WriteAttributeToObjectNode writeAttrNode, - @Cached WriteAttributeToPythonObjectNode writeAttrToMethodNode, - @Cached HPyCreateFunctionNode addFunctionNode, - @Cached CreateMethodNode addLegacyMethodNode, - @Cached HPyReadSlotNode readSlotNode, - @Cached HPyCheckHandleResultNode checkFunctionResultNode, - @Cached HPyAsHandleNode asHandleNode, - @CachedLibrary(limit = "1") InteropLibrary createLib, - @Cached PRaiseNode raiseNode) { - - TruffleString mDoc; - long size; - Object docPtr = readPointerNode.read(context, moduleDefPtr, GraalHPyCField.HPyModuleDef__doc); - if (!isNullNode.execute(context, docPtr)) { - mDoc = fromCharPointerNode.execute(docPtr); - } else { - mDoc = null; - } - - size = readGenericNode.readLong(context, moduleDefPtr, GraalHPyCField.HPyModuleDef__size); - if (size < 0) { - throw raiseNode.raise(PythonBuiltinClassType.SystemError, tsLiteral("HPy does not permit HPyModuleDef.size < 0")); - } else if (size > 0) { - throw raiseNode.raise(PythonBuiltinClassType.SystemError, tsLiteral("Module state is not supported yet in HPy, set HPyModuleDef.size = 0 if module state is not needed")); - } - - // process HPy module slots - Object moduleDefinesPtr = readPointerNode.read(context, moduleDefPtr, GraalHPyCField.HPyModuleDef__defines); - - List executeSlots = new LinkedList<>(); - List methodDefs = new LinkedList<>(); - Object createFunction = null; - - if (!isNullNode.execute(context, moduleDefinesPtr)) { - for (int i = 0;; i++) { - Object def = readPointerNode.readArrayElement(context, moduleDefinesPtr, i); - if (isNullNode.execute(context, def)) { - break; - } - int kind = readGenericNode.readInt(context, def, GraalHPyCField.HPyDef__kind); - switch (kind) { - case GraalHPyDef.HPY_DEF_KIND_METH: - methodDefs.add(def); - break; - case GraalHPyDef.HPY_DEF_KIND_SLOT: - HPySlotData slotData = readSlotNode.execute(inliningTarget, context, def); - switch (slotData.slot) { - case HPY_MOD_CREATE -> { - if (createFunction != null) { - throw raiseNode.raise(PythonErrorType.SystemError, ErrorMessages.MODULE_HAS_MULTIPLE_CREATE_SLOTS, mName); - } - createFunction = slotData.impl; - } - case HPY_MOD_EXEC -> { - if (createFunction != null) { - throw raiseNode.raise(PythonErrorType.SystemError, ErrorMessages.HPY_DEFINES_CREATE_AND_OTHER_SLOTS, mName); - } - /* - * In contrast to CPython, we already parse and store the - * HPy_mod_exec slots here since parsing is a bit more expensive - * in our case. - */ - executeSlots.add(slotData.impl); - } - default -> throw raiseNode.raise(PythonErrorType.SystemError, ErrorMessages.MODULE_USES_UNKNOW_SLOT_ID, mName, slotData.slot); - } - break; - case GraalHPyDef.HPY_DEF_KIND_MEMBER: - case GraalHPyDef.HPY_DEF_KIND_GETSET: - // silently ignore - LOGGER.warning("get/set definitions are not supported for modules"); - break; - default: - if (LOGGER.isLoggable(Level.SEVERE)) { - LOGGER.severe(PythonUtils.formatJString("unknown definition kind: %d", kind)); - } - assert false; - } - } - } - - // determine of 'legacy_methods' is NULL upfront (required for a consistency check) - Object legacyMethods = readPointerNode.read(context, moduleDefPtr, GraalHPyCField.HPyModuleDef__legacy_methods); - // the field 'legacy_methods' may be 'NULL' - boolean hasLegacyMethods = !isNullNode.execute(context, legacyMethods); - - // allocate module's HPyGlobals - int globalStartIdx = context.getEndIndexOfGlobalTable(); - int nModuleGlobals = initModuleGlobals(context, moduleDefPtr, globalStartIdx, isNullNode, readPointerNode, writeSizeTNode); - context.initBatchGlobals(globalStartIdx, nModuleGlobals); - - // create the module object - Object module; - if (createFunction != null) { - /* - * TODO(fa): this check should be before any other check (and the also test for - * 'size > 0') - */ - if (hasLegacyMethods || mDoc != null || nModuleGlobals != 0) { - throw raiseNode.raise(SystemError, ErrorMessages.HPY_DEFINES_CREATE_AND_NON_DEFAULT); - } - module = callCreate(inliningTarget, createFunction, context, spec, checkFunctionResultNode, asHandleNode, createLib); - if (module instanceof PythonModule) { - throw raiseNode.raise(SystemError, ErrorMessages.HPY_MOD_CREATE_RETURNED_BUILTIN_MOD); - } - } else { - PythonModule pmodule = factory.createPythonModule(mName); - pmodule.setNativeModuleDef(executeSlots); - module = pmodule; - } - - // process HPy methods - for (Object methodDef : methodDefs) { - PBuiltinFunction fun = addFunctionNode.execute(context, null, methodDef); - PBuiltinMethod method = factory.createBuiltinMethod(module, fun); - writeAttrToMethodNode.execute(method, SpecialAttributeNames.T___MODULE__, mName); - writeAttrNode.execute(module, fun.getName(), method); - } - - // process legacy methods - if (hasLegacyMethods) { - for (int i = 0;; i++) { - PBuiltinFunction fun = addLegacyMethodNode.execute(inliningTarget, legacyMethods, i); - if (fun == null) { - break; - } - PBuiltinMethod method = factory.createBuiltinMethod(module, fun); - writeAttrToMethodNode.execute(method, SpecialAttributeNames.T___MODULE__, mName); - writeAttrNode.execute(module, fun.getName(), method); - } - } - - if (mDoc != null) { - writeAttrNode.execute(module, SpecialAttributeNames.T___DOC__, mDoc); - } - - return module; - } - - /** - * Initializes all HPy globals of the currently created module. - */ - private static int initModuleGlobals(GraalHPyContext hpyContext, Object moduleDefPtr, int startID, - GraalHPyCAccess.IsNullNode isNullNode, - GraalHPyCAccess.ReadPointerNode readPointerNode, - GraalHPyCAccess.WriteSizeTNode writeSizeTNode) { - Object globalsPtrArr = readPointerNode.read(hpyContext, moduleDefPtr, GraalHPyCField.HPyModuleDef__globals); - if (!isNullNode.execute(hpyContext, globalsPtrArr)) { - for (int i = 0;; i++) { - Object globalPtr = readPointerNode.readArrayElement(hpyContext, globalsPtrArr, i); - if (isNullNode.execute(hpyContext, globalPtr)) { - return i; - } - writeSizeTNode.execute(hpyContext, globalPtr, 0, startID + i); - } - } - return 0; - } - - private static final TruffleString CREATE = tsLiteral("create"); - - /** - * Call the create slot function. - * - * TODO(fa): This method shares some logic with - * {@link com.oracle.graal.python.builtins.objects.cext.hpy.HPyExternalFunctionNodes.HPyExternalFunctionInvokeNode}. - * We should refactor the node such that we can use it here. - */ - static Object callCreate(Node inliningTarget, Object callable, GraalHPyContext hPyContext, Object spec, - HPyCheckFunctionResultNode checkFunctionResultNode, HPyAsHandleNode asHandleNode, InteropLibrary lib) { - - PythonLanguage language = PythonLanguage.get(inliningTarget); - PythonContext ctx = hPyContext.getContext(); - PythonThreadState pythonThreadState = ctx.getThreadState(language); - - GraalHPyHandle hSpec = asHandleNode.execute(spec); - try { - return checkFunctionResultNode.execute(pythonThreadState, CREATE, lib.execute(callable, hPyContext.getBackend(), hSpec)); - } catch (UnsupportedTypeException | UnsupportedMessageException e) { - throw PRaiseNode.raiseUncached(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.CALLING_NATIVE_FUNC_FAILED, CREATE, e); - } catch (ArityException e) { - throw PRaiseNode.raiseUncached(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.CALLING_NATIVE_FUNC_EXPECTED_ARGS, CREATE, e.getExpectedMinArity(), e.getActualArity()); - } finally { - // close all handles (if necessary) - if (hSpec.isAllocated()) { - hSpec.closeAndInvalidate(hPyContext); - } - } - } - } - - @GenerateUncached - @GenerateInline - @GenerateCached(false) - public abstract static class GraalHPyModuleExecNode extends Node { - - public abstract void execute(Node node, GraalHPyContext hpyContext, PythonModule module); - - @Specialization - static void doGeneric(Node node, GraalHPyContext hpyContext, PythonModule module, - @Cached(inline = false) HPyCheckPrimitiveResultNode checkFunctionResultNode, - @Cached(inline = false) HPyAsHandleNode asHandleNode, - @CachedLibrary(limit = "1") InteropLibrary lib) { - // TODO(fa): once we support HPy module state, we need to allocate it here - Object execSlotsObj = module.getNativeModuleDef(); - if (execSlotsObj instanceof LinkedList execSlots) { - for (Object execSlot : execSlots) { - callExec(node, hpyContext, execSlot, module, checkFunctionResultNode, asHandleNode, lib); - } - } - } - - /** - * Call the exec slot function. - *

      - * TODO(fa): This method shares some logic with - * {@link com.oracle.graal.python.builtins.objects.cext.hpy.HPyExternalFunctionNodes.HPyExternalFunctionInvokeNode}. - * We should refactor the node such that we can use it here. - *

      - */ - static void callExec(Node node, GraalHPyContext hPyContext, Object callable, PythonModule module, - HPyCheckPrimitiveResultNode checkFunctionResultNode, HPyAsHandleNode asHandleNode, InteropLibrary lib) { - - PythonLanguage language = PythonLanguage.get(node); - PythonContext ctx = hPyContext.getContext(); - PythonThreadState pythonThreadState = ctx.getThreadState(language); - - GraalHPyHandle hModule = asHandleNode.execute(module); - try { - checkFunctionResultNode.execute(pythonThreadState, T_EXEC, lib.execute(callable, hPyContext.getBackend(), hModule)); - } catch (UnsupportedTypeException | UnsupportedMessageException e) { - throw PRaiseNode.raiseUncached(node, PythonBuiltinClassType.TypeError, ErrorMessages.CALLING_NATIVE_FUNC_FAILED, T_EXEC, e); - } catch (ArityException e) { - throw PRaiseNode.raiseUncached(node, PythonBuiltinClassType.TypeError, ErrorMessages.CALLING_NATIVE_FUNC_EXPECTED_ARGS, T_EXEC, e.getExpectedMinArity(), e.getActualArity()); - } finally { - // close all handles (if necessary) - if (hModule.isAllocated()) { - hModule.closeAndInvalidate(hPyContext); - } - } - } - } - - /** - *
      -     *     typedef struct {
      -     *         const char *name;             // The name of the built-in function/method
      -     *         const char *doc;              // The __doc__ attribute, or NULL
      -     *         void *impl;                   // Function pointer to the implementation
      -     *         void *cpy_trampoline;         // Used by CPython to call impl
      -     *         HPyFunc_Signature signature;  // Indicates impl's expected the signature
      -     *     } HPyMeth;
      -     * 
      - */ - @GenerateUncached - @GenerateInline(false) // footprint reduction 52 -> 33 - public abstract static class HPyCreateFunctionNode extends PNodeWithContext { - - public abstract PBuiltinFunction execute(GraalHPyContext context, Object enclosingType, Object methodDef); - - @Specialization - static PBuiltinFunction doIt(GraalHPyContext context, Object enclosingType, Object methodDef, - @Cached(parameters = "context") GraalHPyCAccess.ReadPointerNode readPointerNode, - @Cached(parameters = "context") GraalHPyCAccess.IsNullNode isNullNode, - @Cached(parameters = "context") GraalHPyCAccess.ReadGenericNode readGenericNode, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached HPyAttachFunctionTypeNode attachFunctionTypeNode, - @Cached PythonObjectFactory factory, - @Cached WriteAttributeToPythonObjectNode writeAttributeToPythonObjectNode, - @Cached PRaiseNode raiseNode) { - - TruffleString methodName = fromCharPointerNode.execute(readPointerNode.read(context, methodDef, GraalHPyCField.HPyDef__meth__name)); - - // note: 'ml_doc' may be NULL; in this case, we would store 'None' - Object methodDoc = PNone.NONE; - Object doc = readPointerNode.read(context, methodDef, GraalHPyCField.HPyDef__meth__doc); - if (!isNullNode.execute(context, doc)) { - methodDoc = fromCharPointerNode.execute(doc, false); - } - - HPyFuncSignature signature; - Object methodFunctionPointer; - signature = HPyFuncSignature.fromValue(readGenericNode.readInt(context, methodDef, GraalHPyCField.HPyDef__meth__signature)); - if (signature == null) { - throw raiseNode.raise(PythonBuiltinClassType.ValueError, ErrorMessages.UNSUPPORTED_HYPMETH_SIG); - } - - methodFunctionPointer = readPointerNode.read(context, methodDef, GraalHPyCField.HPyDef__meth__impl); - methodFunctionPointer = attachFunctionTypeNode.execute(context, methodFunctionPointer, signature.getLLVMFunctionType()); - - PBuiltinFunction function = HPyExternalFunctionNodes.createWrapperFunction(PythonLanguage.get(raiseNode), context, signature, methodName, methodFunctionPointer, enclosingType, factory); - - // write doc string; we need to directly write to the storage otherwise it is - // disallowed writing to builtin types. - writeAttributeToPythonObjectNode.execute(function, SpecialAttributeNames.T___DOC__, methodDoc); - - return function; - } - } - - /** - * Parses a pointer to a {@code PyGetSetDef} struct and creates the corresponding property. - * - *
      -     *     typedef struct PyGetSetDef {
      -     *         const char *name;
      -     *         getter get;
      -     *         setter set;
      -     *         const char *doc;
      -     *         void *closure;
      -     * } PyGetSetDef;
      -     * 
      - */ - @GenerateUncached - @GenerateInline(false) // footprint reduction 44 -> 25 - public abstract static class HPyAddLegacyGetSetDefNode extends PNodeWithContext { - - public abstract GetSetDescriptor execute(GraalHPyContext context, Object owner, Object legacyGetSetDefArrPtr, int i); - - @Specialization - static GetSetDescriptor doGeneric(GraalHPyContext context, Object owner, Object legacyGetSetDef, int i, - @Cached(parameters = "context") GraalHPyCAccess.ReadPointerNode readPointerNode, - @Cached(parameters = "context") GraalHPyCAccess.IsNullNode isNullNode, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached PythonObjectFactory factory, - @Cached WriteAttributeToPythonObjectNode writeDocNode, - @Cached PRaiseNode raiseNode) { - - // compute offset of name and read name pointer - long nameOffset = GraalHPyCAccess.ReadPointerNode.getElementPtr(context, i, HPyContextSignatureType.PyGetSetDef, GraalHPyCField.PyGetSetDef__name); - Object namePtr = readPointerNode.execute(context, legacyGetSetDef, nameOffset); - - // if the name pointer is null, this is the sentinel - if (isNullNode.execute(context, namePtr)) { - return null; - } - TruffleString getSetDescrName = fromCharPointerNode.execute(namePtr); - - // compute remaining offsets - long docOffset = GraalHPyCAccess.ReadPointerNode.getElementPtr(context, i, HPyContextSignatureType.PyGetSetDef, GraalHPyCField.PyGetSetDef__doc); - long getOffset = GraalHPyCAccess.ReadPointerNode.getElementPtr(context, i, HPyContextSignatureType.PyGetSetDef, GraalHPyCField.PyGetSetDef__get); - long setOffset = GraalHPyCAccess.ReadPointerNode.getElementPtr(context, i, HPyContextSignatureType.PyGetSetDef, GraalHPyCField.PyGetSetDef__set); - long closureOffset = GraalHPyCAccess.ReadPointerNode.getElementPtr(context, i, HPyContextSignatureType.PyGetSetDef, GraalHPyCField.PyGetSetDef__closure); - - // note: 'doc' may be NULL; in this case, we would store 'None' - Object getSetDescrDoc = PNone.NONE; - Object docPtr = readPointerNode.execute(context, legacyGetSetDef, docOffset); - if (!isNullNode.execute(context, docPtr)) { - getSetDescrDoc = fromCharPointerNode.execute(docPtr); - } - - Object getterFunPtr = readPointerNode.execute(context, legacyGetSetDef, getOffset); - Object setterFunPtr = readPointerNode.execute(context, legacyGetSetDef, setOffset); - /* - * Note: we need to convert the native closure pointer to an interop pointer because it - * will be handed to a C API root which expects that. - */ - Object closurePtr = context.nativeToInteropPointer(readPointerNode.execute(context, legacyGetSetDef, closureOffset)); - - PythonLanguage lang = PythonLanguage.get(raiseNode); - PBuiltinFunction getterObject = null; - if (!isNullNode.execute(context, getterFunPtr)) { - Object getterFunInteropPtr = CExtContext.ensureExecutable(context.nativeToInteropPointer(getterFunPtr), PExternalFunctionWrapper.GETTER); - getterObject = HPyLegacyGetSetDescriptorGetterRoot.createLegacyFunction(context, lang, owner, getSetDescrName, getterFunInteropPtr, closurePtr); - } - - PBuiltinFunction setterObject = null; - boolean hasSetter = !isNullNode.execute(context, setterFunPtr); - if (hasSetter) { - Object setterFunInteropPtr = CExtContext.ensureExecutable(context.nativeToInteropPointer(setterFunPtr), PExternalFunctionWrapper.SETTER); - setterObject = HPyLegacyGetSetDescriptorSetterRoot.createLegacyFunction(context, lang, owner, getSetDescrName, setterFunInteropPtr, closurePtr); - } - - GetSetDescriptor getSetDescriptor = factory.createGetSetDescriptor(getterObject, setterObject, getSetDescrName, owner, hasSetter); - writeDocNode.execute(getSetDescriptor, SpecialAttributeNames.T___DOC__, getSetDescrDoc); - return getSetDescriptor; - } - } - - /** - * A simple helper class to return the property and its name separately. - */ - @ValueType - static final class HPyProperty { - final Object key; - final Object value; - - /** - * In a very few cases, a single definition can define several properties. For example, slot - * {@link HPySlot#HPY_SQ_ASS_ITEM} defines properties - * {@link com.oracle.graal.python.nodes.SpecialMethodNames#T___SETITEM__} and - * {@link com.oracle.graal.python.nodes.SpecialMethodNames#T___DELITEM__}. Therefore, we use - * this field to create a linked list of such related properties. - */ - final HPyProperty next; - - HPyProperty(Object key, Object value, HPyProperty next) { - assert key instanceof TruffleString || key instanceof HiddenAttr; - this.key = key; - this.value = value; - this.next = next; - } - - HPyProperty(TruffleString key, Object value) { - this(key, value, null); - } - - void write(Node inliningTarget, WritePropertyNode writePropertyNode, ReadPropertyNode readPropertyNode, Object enclosingType) { - for (HPyProperty prop = this; prop != null; prop = prop.next) { - /* - * Do not overwrite existing attributes. Reason: Different slots may map to the same - * magic method. For example: 'nb_add' and 'sq_concat' are both mapped to '__add__'. - * For now, we will always use the first mapping. However, that is not fully - * correct. CPython has a fixed order for slots defined by array 'static slotdef - * slotdefs[]' in 'typeobject.c'. They iterate over this array and check if the new - * type provides the slot. The first mapping will then be install. The problem is - * that we cannot easily do the same since we have two separate sets of slots: HPy - * slots and legacy slots. Right now, the HPy slots have precedence. - */ - if (!keyExists(inliningTarget, readPropertyNode, enclosingType, prop.key)) { - writePropertyNode.execute(inliningTarget, enclosingType, prop.key, prop.value); - } - } - } - - static boolean keyExists(Node inliningTarget, ReadPropertyNode readPropertyNode, Object enclosingType, Object key) { - return readPropertyNode.execute(inliningTarget, enclosingType, key) != PNone.NO_VALUE; - } - - static boolean keyExists(ReadAttributeFromObjectNode readAttributeFromObjectNode, Object enclosingType, TruffleString key) { - return readAttributeFromObjectNode.execute(enclosingType, key) != PNone.NO_VALUE; - } - - } - - @GenerateInline - @GenerateCached(false) - @GenerateUncached - abstract static class ReadPropertyNode extends Node { - abstract Object execute(Node inliningTarget, Object receiver, Object key); - - @Specialization - static Object doHiddenAttr(Node inliningTarget, PythonAbstractObject receiver, HiddenAttr key, - @Cached HiddenAttr.ReadNode readNode) { - return readNode.execute(inliningTarget, receiver, key, PNone.NO_VALUE); - } - - @Specialization - static Object doOther(Object receiver, TruffleString key, - @Cached(inline = false) ReadAttributeFromObjectNode readAttributeFromObjectNode) { - return readAttributeFromObjectNode.execute(receiver, key); - } - } - - @GenerateInline - @GenerateCached(false) - @GenerateUncached - abstract static class WritePropertyNode extends Node { - // key comes from HPyProperty#key which is either TruffleString or HiddenAttr - abstract void execute(Node inliningTarget, Object receiver, Object key, Object value); - - @Specialization - static void doHiddenAttr(Node inliningTarget, PythonAbstractObject receiver, HiddenAttr key, Object value, - @Cached HiddenAttr.WriteNode writeNode) { - writeNode.execute(inliningTarget, receiver, key, value); - } - - @Specialization - static void doString(Object receiver, TruffleString key, Object value, - @Cached(inline = false) WriteAttributeToObjectNode writeAttributeToObjectNode) { - writeAttributeToObjectNode.execute(receiver, key, value); - } - } - - /** - * A simple helper class to return the parsed data of an {@code HPySlot} structure. - * - *
      -     * typedef struct {
      -     *     HPySlot_Slot slot;     // The slot to fill
      -     *     void *impl;            // Function pointer to the implementation
      -     *     void *cpy_trampoline;  // Used by CPython to call impl
      -     * } HPySlot;
      -     * 
      - */ - @ValueType - record HPySlotData(HPySlot slot, Object impl) { - } - - @GenerateUncached - @GenerateInline(false) // footprint reduction 48 -> 29 - public abstract static class HPyCreateLegacyMemberNode extends PNodeWithContext { - - public abstract HPyProperty execute(GraalHPyContext context, Object enclosingType, Object memberDefArrPtr, int i); - - /** - *
      -         * typedef struct PyMemberDef {
      -         *     const char *name;
      -         *     int type;
      -         *     Py_ssize_t offset;
      -         *     int flags;
      -         *     const char *doc;
      -         * } PyMemberDef;
      -         * 
      - */ - @Specialization - static HPyProperty doIt(GraalHPyContext context, Object enclosingType, Object memberDefArrPtr, int i, - @Cached(parameters = "context") GraalHPyCAccess.ReadPointerNode readPointerNode, - @Cached(parameters = "context") GraalHPyCAccess.IsNullNode isNullNode, - @Cached(parameters = "context") GraalHPyCAccess.ReadGenericNode readGenericNode, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached PythonObjectFactory factory, - @Cached WriteAttributeToPythonObjectNode writeDocNode, - @Cached PRaiseNode raiseNode) { - - // computes offsets like '&(memberDefArrPtr[i].name)' - int pyMemberDefSize = context.getCTypeSize(HPyContextSignatureType.PyMemberDef); - long nameOffset = ReadGenericNode.getElementPtr(context, i, pyMemberDefSize, GraalHPyCField.PyMemberDef__name); - long typeOffset = ReadGenericNode.getElementPtr(context, i, pyMemberDefSize, GraalHPyCField.PyMemberDef__type); - long offsetOffset = ReadGenericNode.getElementPtr(context, i, pyMemberDefSize, GraalHPyCField.PyMemberDef__offset); - long flagsOffset = ReadGenericNode.getElementPtr(context, i, pyMemberDefSize, GraalHPyCField.PyMemberDef__flags); - long docOffset = ReadGenericNode.getElementPtr(context, i, pyMemberDefSize, GraalHPyCField.PyMemberDef__doc); - - Object namePtr = readPointerNode.execute(context, memberDefArrPtr, nameOffset); - if (isNullNode.execute(context, namePtr)) { - return null; - } - - TruffleString name = fromCharPointerNode.execute(namePtr); - - // note: 'doc' may be NULL; in this case, we would store 'None' - Object memberDoc = PNone.NONE; - Object doc = readPointerNode.execute(context, memberDefArrPtr, docOffset); - if (!isNullNode.execute(context, doc)) { - memberDoc = fromCharPointerNode.execute(doc, false); - } - - int flags = readGenericNode.executeInt(context, memberDefArrPtr, flagsOffset, HPyContextSignatureType.Int); - int type = readGenericNode.executeInt(context, memberDefArrPtr, typeOffset, HPyContextSignatureType.Int); - int offset = readGenericNode.executeInt(context, memberDefArrPtr, offsetOffset, HPyContextSignatureType.Int); - - PythonLanguage language = PythonLanguage.get(raiseNode); - PBuiltinFunction getterObject = HPyReadMemberNode.createBuiltinFunction(language, name, type, offset); - - Object setterObject = null; - if ((flags & GraalHPyLegacyDef.MEMBER_FLAG_READONLY) == 0) { - setterObject = HPyWriteMemberNode.createBuiltinFunction(language, name, type, offset); - } - - // create a property - GetSetDescriptor memberDescriptor = factory.createMemberDescriptor(getterObject, setterObject, name, enclosingType); - writeDocNode.execute(memberDescriptor, SpecialAttributeNames.T___DOC__, memberDoc); - return new HPyProperty(name, memberDescriptor); - } - } - - @GenerateUncached - @GenerateInline(false) // footprint reduction 52 -> 33 - public abstract static class HPyAddMemberNode extends PNodeWithContext { - - public abstract HPyProperty execute(GraalHPyContext context, PythonClass enclosingType, Object memberDef); - - /** - *
      -         * typedef struct {
      -         *     const char *name;
      -         *     HPyMember_FieldType type;
      -         *     HPy_ssize_t offset;
      -         *     int readonly;
      -         *     const char *doc;
      -         * } HPyMember;
      -         * 
      - */ - @Specialization - static HPyProperty doIt(GraalHPyContext context, PythonClass enclosingType, Object memberDef, - @Cached(parameters = "context") GraalHPyCAccess.ReadPointerNode readPointerNode, - @Cached(parameters = "context") GraalHPyCAccess.IsNullNode isNullNode, - @Cached(parameters = "context") GraalHPyCAccess.ReadGenericNode readGenericNode, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached TruffleString.EqualNode equalNode, - @Cached PythonObjectFactory factory, - @Cached WriteAttributeToPythonObjectNode writeDocNode, - @Cached PRaiseNode raiseNode) { - - TruffleString name = fromCharPointerNode.execute(readPointerNode.read(context, memberDef, GraalHPyCField.HPyDef__member__name)); - - // note: 'doc' may be NULL; in this case, we would store 'None' - Object memberDoc = PNone.NONE; - Object doc = readPointerNode.read(context, memberDef, GraalHPyCField.HPyDef__member__doc); - if (!isNullNode.execute(context, doc)) { - memberDoc = fromCharPointerNode.execute(doc, false); - } - - int type = readGenericNode.readInt(context, memberDef, GraalHPyCField.HPyDef__member__type); - boolean readOnly = readGenericNode.readInt(context, memberDef, GraalHPyCField.HPyDef__member__readonly) != 0; - int offset = readGenericNode.readInt(context, memberDef, GraalHPyCField.HPyDef__member__offset); - - if (equalNode.execute(SpecialAttributeNames.T___VECTORCALLOFFSET__, name, TS_ENCODING)) { - enclosingType.setHPyVectorcallOffset(offset); - } - - PythonLanguage language = PythonLanguage.get(raiseNode); - PBuiltinFunction getterObject = HPyReadMemberNode.createBuiltinFunction(language, name, type, offset); - - Object setterObject = null; - if (!readOnly) { - setterObject = HPyWriteMemberNode.createBuiltinFunction(language, name, type, offset); - } - - // create member descriptor - GetSetDescriptor memberDescriptor = factory.createMemberDescriptor(getterObject, setterObject, name, enclosingType); - writeDocNode.execute(memberDescriptor, SpecialAttributeNames.T___DOC__, memberDoc); - return new HPyProperty(name, memberDescriptor); - } - } - - /** - * Creates a get/set descriptor from an HPy get/set descriptor specification. - * - *
      -     * typedef struct {
      -     *     const char *name;
      -     *     void *getter_impl;            // Function pointer to the implementation
      -     *     void *setter_impl;            // Same; this may be NULL
      -     *     void *getter_cpy_trampoline;  // Used by CPython to call getter_impl
      -     *     void *setter_cpy_trampoline;  // Same; this may be NULL
      -     *     const char *doc;
      -     *     void *closure;
      -     * } HPyGetSet;
      -     * 
      - */ - @GenerateUncached - @GenerateInline(false) // footprint reduction 44 -> 25 - public abstract static class HPyCreateGetSetDescriptorNode extends PNodeWithContext { - - public abstract GetSetDescriptor execute(GraalHPyContext context, Object type, Object memberDef); - - @Specialization - static GetSetDescriptor doIt(GraalHPyContext context, Object type, Object memberDef, - @Cached(parameters = "context") GraalHPyCAccess.ReadPointerNode readPointerNode, - @Cached(parameters = "context") GraalHPyCAccess.IsNullNode isNullNode, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached HPyAttachFunctionTypeNode attachFunctionTypeNode, - @Cached PythonObjectFactory factory, - @Cached WriteAttributeToPythonObjectNode writeDocNode) { - - TruffleString name = fromCharPointerNode.execute(readPointerNode.read(context, memberDef, GraalHPyCField.HPyDef__getset__name)); - - // note: 'doc' may be NULL; in this case, we would store 'None' - Object memberDoc = PNone.NONE; - Object docCharPtr = readPointerNode.read(context, memberDef, GraalHPyCField.HPyDef__getset__doc); - if (!isNullNode.execute(context, docCharPtr)) { - memberDoc = fromCharPointerNode.execute(docCharPtr, false); - } - - Object closurePtr = readPointerNode.read(context, memberDef, GraalHPyCField.HPyDef__getset__closure); - - // signature: self, closure - Object getterFunctionPtr = readPointerNode.read(context, memberDef, GraalHPyCField.HPyDef__getset__getter_impl); - boolean hasGetter = !isNullNode.execute(context, getterFunctionPtr); - if (hasGetter) { - getterFunctionPtr = attachFunctionTypeNode.execute(context, getterFunctionPtr, LLVMType.HPyFunc_getter); - } - - // signature: self, value, closure - Object setterFunctionPtr = readPointerNode.read(context, memberDef, GraalHPyCField.HPyDef__getset__setter_impl); - boolean hasSetter = !isNullNode.execute(context, setterFunctionPtr); - if (hasSetter) { - setterFunctionPtr = attachFunctionTypeNode.execute(context, setterFunctionPtr, LLVMType.HPyFunc_setter); - } - - PBuiltinFunction getterObject; - if (hasGetter) { - getterObject = HPyGetSetDescriptorGetterRootNode.createFunction(context, type, name, getterFunctionPtr, closurePtr); - } else { - getterObject = null; - } - - PBuiltinFunction setterObject; - if (hasSetter) { - setterObject = HPyGetSetDescriptorSetterRootNode.createFunction(context, type, name, setterFunctionPtr, closurePtr); - } else { - setterObject = null; - } - - GetSetDescriptor getSetDescriptor = factory.createGetSetDescriptor(getterObject, setterObject, name, type, !hasSetter); - writeDocNode.execute(getSetDescriptor, SpecialAttributeNames.T___DOC__, memberDoc); - return getSetDescriptor; - } - } - - /** - * Parser an {@code HPySlot} structure, creates and adds the appropriate function as magic - * method. Returns either an HPyProperty if created, or the HPySlot itself. - * - *
      -     * typedef struct {
      -     *     HPySlot_Slot slot;     // The slot to fill
      -     *     void *impl;            // Function pointer to the implementation
      -     *     void *cpy_trampoline;  // Used by CPython to call impl
      -     * } HPySlot;
      -     * 
      - */ - @GenerateUncached - @GenerateInline - @GenerateCached(false) - public abstract static class HPyReadSlotNode extends PNodeWithContext { - - public abstract HPySlotData execute(Node inliningTarget, GraalHPyContext context, Object slotDef); - - @Specialization - static HPySlotData doIt(Node inliningTarget, GraalHPyContext context, Object slotDef, - @Cached(parameters = "context", inline = false) GraalHPyCAccess.ReadGenericNode readGenericNode, - @Cached(parameters = "context", inline = false) GraalHPyCAccess.ReadPointerNode readPointerNode, - @Cached(inline = false) HPyAttachFunctionTypeNode attachFunctionTypeNode) { - - int slotNr = readGenericNode.readInt(context, slotDef, GraalHPyCField.HPyDef__slot__slot); - HPySlot slot = HPySlot.fromValue(slotNr); - if (slot == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, PythonBuiltinClassType.SystemError, ErrorMessages.INVALID_SLOT_VALUE, slotNr); - } - - // read and check the function pointer - Object methodFunctionPointer = readPointerNode.read(context, slotDef, GraalHPyCField.HPyDef__slot__impl); - methodFunctionPointer = attachFunctionTypeNode.execute(context, methodFunctionPointer, slot.getSignatures()[0].getLLVMFunctionType()); - return new HPySlotData(slot, methodFunctionPointer); - } - } - - @GenerateUncached - @GenerateInline(false) // footprint reduction 44 -> 25 - public abstract static class HPyCreateSlotNode extends PNodeWithContext { - - public abstract Object execute(GraalHPyContext context, PythonClass enclosingType, TpSlots.Builder tpSlotsBuilder, Object slotDef); - - @Specialization - static Object doIt(GraalHPyContext context, PythonClass enclosingType, TpSlots.Builder tpSlotsBuilder, Object slotDef, - @Bind("this") Node inliningTarget, - @Cached HPyReadSlotNode readSlotNode, - @Cached PythonObjectFactory factory, - @Cached TruffleString.FromJavaStringNode fromJavaStringNode, - @Cached PRaiseNode raiseNode) { - - assert enclosingType.isHPyType(); - HPySlotData slotData = readSlotNode.execute(inliningTarget, context, slotDef); - HPySlot slot = slotData.slot; - - TpSlotMeta tpSlot = slot.getTpSlot(); - if (tpSlot != null) { - // Slot that directly maps to a CPython compatible slot - Object boundExecutable = CExtContext.ensureExecutable(slotData.impl(), tpSlot.getNativeSignature()); - tpSlotsBuilder.set(tpSlot, TpSlotNative.createHPySlot(boundExecutable)); - return null; - } - - HPyProperty property = null; - Object[] methodNames = slot.getAttributeKeys(); - HPySlotWrapper[] slotWrappers = slot.getSignatures(); - - /* - * Special case: DESTROYFUNC. This won't be usable from Python, so we just store the - * bare pointer object into Java field. - */ - if (HPY_TP_DESTROY.equals(slot)) { - enclosingType.setHPyDestroyFunc(slotData.impl()); - } else if (HPY_TP_TRAVERSE.equals(slot)) { - assert methodNames.length == 0; - return HPY_TP_TRAVERSE; - } else { - // create properties - for (int i = 0; i < methodNames.length; i++) { - Object methodName; - TruffleString methodNameStr; - if (methodNames[i] instanceof HiddenAttr ha) { - methodNameStr = fromJavaStringNode.execute(ha.getName(), TS_ENCODING); - methodName = methodNames[i]; - } else { - methodNameStr = (TruffleString) methodNames[i]; - methodName = methodNameStr; - } - HPySlotWrapper slotWrapper = slotWrappers[i]; - - Object enclosingTypeForFun = HPY_TP_NEW.equals(slot) ? null : enclosingType; - PythonLanguage language = PythonLanguage.get(raiseNode); - Object function = HPyExternalFunctionNodes.createWrapperFunction(language, context, slotWrapper, null, null, methodNameStr, slotData.impl(), enclosingTypeForFun, factory); - property = new HPyProperty(methodName, function, property); - } - } - - /* - * Special case: HPy_tp_call. The installed attributed __call__ will be just a - * dispatcher. The actual function pointer given by the HPy definition is just the - * default call function that we need to remember and set on every freshly created - * instance of this type. - */ - if (HPY_TP_CALL.equals(slot)) { - if (enclosingType.getItemSize() > 0) { - throw raiseNode.raise(TypeError, ErrorMessages.HPY_CANNOT_USE_CALL_WITH_VAR_OBJECTS); - } - if (enclosingType.getBuiltinShape() == GraalHPyDef.HPyType_BUILTIN_SHAPE_LEGACY && enclosingType.getBasicSize() == 0) { - throw raiseNode.raise(TypeError, ErrorMessages.HPY_CANNOT_USE_CALL_WITH_LEGACY); - } - enclosingType.setHPyDefaultCallFunc(slotData.impl()); - } - return property; - } - } - - /** - * Parses a {@code PyType_Slot} structure - * - *
      -     * typedef struct{
      -     *     int slot;
      -     *     void *pfunc;
      -     * } PyType_Slot;
      -     * 
      - */ - @GenerateUncached - @GenerateInline(false) // footprint reduction 80 -> 61 - public abstract static class HPyCreateLegacySlotNode extends PNodeWithContext { - - public abstract boolean execute(GraalHPyContext context, Object enclosingType, TpSlots.Builder tpSlotsBuilder, Object slotDefArrPtr, int i); - - @Specialization - static boolean doIt(GraalHPyContext context, Object enclosingType, TpSlots.Builder tpSlotsBuilder, Object slotDefArrPtr, int i, - @Bind("this") Node inliningTarget, - @Cached(parameters = "context") GraalHPyCAccess.ReadGenericNode readGenericNode, - @Cached(parameters = "context") GraalHPyCAccess.ReadPointerNode readPointerNode, - @Cached CreateMethodNode legacyMethodNode, - @Cached HPyCreateLegacyMemberNode createLegacyMemberNode, - @Cached HPyAddLegacyGetSetDefNode legacyGetSetNode, - @Cached WriteAttributeToObjectNode writeAttributeToObjectNode, - @Cached ReadAttributeFromObjectNode readAttributeToObjectNode, - @Cached ReadPropertyNode readPropertyNode, - @Cached WritePropertyNode writePropertyNode, - @CachedLibrary(limit = "1") InteropLibrary lib, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - - // computes '&(slotDefArrPtr[i].slot)' - long slotIdOffset = ReadGenericNode.getElementPtr(context, i, context.getCTypeSize(HPyContextSignatureType.PyType_Slot), GraalHPyCField.PyType_Slot__slot); - int slotId = readGenericNode.executeInt(context, slotDefArrPtr, slotIdOffset, HPyContextSignatureType.Int); - if (slotId == 0) { - return false; - } - - HPyLegacySlot slot = HPyLegacySlot.fromValue(slotId); - if (slot == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.SystemError, ErrorMessages.INVALID_SLOT_VALUE, slotId); - } - - // computes '&(slotDefArrPtr[i].pfunc)' - long pfuncOffset = ReadGenericNode.getElementPtr(context, i, context.getCTypeSize(HPyContextSignatureType.PyType_Slot), GraalHPyCField.PyType_Slot__pfunc); - Object pfuncPtr = readPointerNode.execute(context, slotDefArrPtr, pfuncOffset); - - TpSlotMeta tpSlot = slot.getTpSlot(); - if (tpSlot != null) { - // Note: not a HPy native slot, just plain native slot, because it is legacy and - // expects PyObject* arguments - Object boundExecutable = CExtContext.ensureExecutable(pfuncPtr, tpSlot.getNativeSignature()); - tpSlotsBuilder.set(tpSlot, TpSlotNative.createCExtSlot(boundExecutable)); - return true; - } - - // treatment for special slots 'Py_tp_members', 'Py_tp_getset', 'Py_tp_methods' - switch (slot) { - case Py_tp_members: - for (int j = 0;; j++) { - HPyProperty property = createLegacyMemberNode.execute(context, enclosingType, pfuncPtr, j); - if (property == null) { - break; - } - property.write(inliningTarget, writePropertyNode, readPropertyNode, enclosingType); - } - break; - case Py_tp_methods: - for (int j = 0;; j++) { - PBuiltinFunction method = legacyMethodNode.execute(inliningTarget, pfuncPtr, j); - if (method == null) { - break; - } - writeAttributeToObjectNode.execute(enclosingType, method.getName(), method); - } - break; - case Py_tp_getset: - for (int j = 0;; j++) { - GetSetDescriptor getSetDescriptor = legacyGetSetNode.execute(context, enclosingType, pfuncPtr, j); - if (getSetDescriptor == null) { - break; - } - writeAttributeToObjectNode.execute(enclosingType, getSetDescriptor.getName(), getSetDescriptor); - } - break; - default: - // this is the generic slot case - // TODO: when all CPython compatible slots are implemented, this should go away - TruffleString attributeKey = slot.getAttributeKey(); - if (attributeKey != null) { - if (!HPyProperty.keyExists(readAttributeToObjectNode, enclosingType, attributeKey)) { - Object interopPFuncPtr = context.nativeToInteropPointer(pfuncPtr); - PBuiltinFunction method; - Object resolved = CreateFunctionNode.resolveClosurePointerToBuiltinFun(context.getContext(), interopPFuncPtr, lib, enclosingType, attributeKey, - slot.getSignature()); - if (resolved instanceof PBuiltinFunction builtinFunction) { - method = builtinFunction; - } else { - Object callable; - if (resolved instanceof RootCallTarget || resolved instanceof BuiltinMethodDescriptor) { - callable = resolved; - } else { - assert resolved == null; - // the pointer is not a closure pointer, so we assume it is a - // native function pointer - callable = interopPFuncPtr; - } - PythonLanguage lang = PythonLanguage.get(raiseNode); - method = PExternalFunctionWrapper.createWrapperFunction(attributeKey, callable, enclosingType, 0, slot.getSignature(), lang, factory, true); - } - writeAttributeToObjectNode.execute(enclosingType, attributeKey, method); - } else { - // TODO(fa): implement support for remaining legacy slot kinds - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw CompilerDirectives.shouldNotReachHere(PythonUtils.formatJString("support for legacy slot %s not yet implemented", slot.name())); - } - } - break; - } - return true; - } - } - - @GenerateUncached - @GenerateInline(false) - public abstract static class HPyAsContextNode extends CExtToJavaNode { - - @Specialization - static GraalHPyContext doHandle(GraalHPyNativeContext hpyContext) { - return hpyContext.context; - } - - /* - * n.b. we could actually accept anything else, but we have specializations to be more * - * strict about what we expect - */ - - @Specialization - GraalHPyContext doInt(@SuppressWarnings("unused") int handle) { - return getContext().getHPyContext(); - } - - @Specialization - GraalHPyContext doLong(@SuppressWarnings("unused") long handle) { - return getContext().getHPyContext(); - } - - @Specialization(guards = "interopLibrary.isPointer(handle)", limit = "2") - static GraalHPyContext doPointer(@SuppressWarnings("unused") Object handle, - @CachedLibrary("handle") InteropLibrary interopLibrary) { - return PythonContext.get(interopLibrary).getHPyContext(); - } - } - - @ImportStatic(GraalHPyBoxing.class) - public abstract static class HPyWithContextNode extends PNodeWithContext { - - static long asPointer(Object handle, InteropLibrary lib) { - try { - return lib.asPointer(handle); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - } - } - - @GenerateInline - @GenerateCached(false) - @GenerateUncached - @ImportStatic(GraalHPyBoxing.class) - public abstract static class HPyEnsureHandleNode extends HPyWithContextNode { - - public abstract GraalHPyHandle execute(Node inliningTarget, Object object); - - @Specialization - static GraalHPyHandle doHandle(GraalHPyHandle handle) { - return handle; - } - - @Specialization(guards = {"!isLong(value)", "!isHPyHandle(value)", "!isBoxedNullHandle(bits)", "isBoxedHandle(bits)"}) - static GraalHPyHandle doOtherBoxedHandle(Node inliningTarget, @SuppressWarnings("unused") Object value, - @Shared("lib") @CachedLibrary(limit = "2") @SuppressWarnings("unused") InteropLibrary lib, - @Bind("asPointer(value, lib)") long bits) { - return doLong(inliningTarget, bits); - } - - @Specialization(guards = {"!isLong(value)", "!isHPyHandle(value)", "isBoxedNullHandle(bits)"}) - @SuppressWarnings("unused") - static GraalHPyHandle doOtherNull(Object value, - @Shared("lib") @CachedLibrary(limit = "2") InteropLibrary lib, - @Bind("asPointer(value, lib)") long bits) { - return GraalHPyHandle.NULL_HANDLE; - } - - @Specialization(guards = {"!isLong(value)", "!isHPyHandle(value)", "isBoxedInt(bits) || isBoxedDouble(bits)"}) - static GraalHPyHandle doOtherBoxedPrimitive(Node inliningTarget, @SuppressWarnings("unused") Object value, - @Shared("lib") @CachedLibrary(limit = "2") @SuppressWarnings("unused") InteropLibrary lib, - @Bind("asPointer(value, lib)") long bits) { - return doBoxedPrimitive(inliningTarget, bits); - } - - @Specialization(guards = "isBoxedNullHandle(bits)") - @SuppressWarnings("unused") - static GraalHPyHandle doLongNull(long bits) { - return GraalHPyHandle.NULL_HANDLE; - } - - @Specialization(guards = {"isBoxedHandle(bits)"}, replaces = "doLongNull") - static GraalHPyHandle doLong(Node inliningTarget, long bits) { - GraalHPyContext context = PythonContext.get(inliningTarget).getHPyContext(); - return context.createHandle(context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(bits))); - } - - @Specialization(guards = "isBoxedInt(bits) || isBoxedDouble(bits)") - @SuppressWarnings("unused") - static GraalHPyHandle doBoxedPrimitive(Node inliningTarget, long bits) { - /* - * In this case, the long value is a boxed primitive and we cannot resolve it to a - * GraalHPyHandle instance (because no instance has ever been created). We create a - * fresh GaalHPyHandle instance here. - */ - Object delegate; - if (GraalHPyBoxing.isBoxedInt(bits)) { - delegate = GraalHPyBoxing.unboxInt(bits); - } else if (GraalHPyBoxing.isBoxedDouble(bits)) { - delegate = GraalHPyBoxing.unboxDouble(bits); - } else { - throw CompilerDirectives.shouldNotReachHere(); - } - return PythonContext.get(inliningTarget).getHPyContext().createHandle(delegate); - } - } - - @GenerateInline - @GenerateCached(false) - @GenerateUncached - @ImportStatic(GraalHPyBoxing.class) - public abstract static class HPyCloseHandleNode extends HPyWithContextNode { - - public abstract void execute(Node inliningTarget, Object object); - - public static void executeUncached(Object object) { - HPyCloseHandleNodeGen.getUncached().execute(null, object); - } - - @Specialization(guards = "!handle.isAllocated()") - @SuppressWarnings("unused") - static void doHandle(GraalHPyHandle handle) { - // nothing to do - } - - @Specialization(guards = "handle.isAllocated()") - static void doHandleAllocated(Node inliningTarget, GraalHPyHandle handle) { - handle.closeAndInvalidate(PythonContext.get(inliningTarget).getHPyContext()); - } - - @Specialization(guards = "isBoxedNullHandle(bits)") - @SuppressWarnings("unused") - static void doNullLong(long bits) { - // nothing to do - } - - @Specialization(guards = {"!isBoxedNullHandle(bits)", "isBoxedHandle(bits)"}) - static void doLong(Node inliningTarget, long bits) { - /* - * Since we have a long and it is in the "boxed handle" range, we know that the handle - * *MUST* be allocated. - */ - int id = GraalHPyBoxing.unboxHandle(bits); - assert GraalHPyHandle.isAllocated(id); - PythonContext.get(inliningTarget).getHPyContext().releaseHPyHandleForObject(id); - } - - @Specialization(guards = "!isBoxedHandle(bits)") - @SuppressWarnings("unused") - static void doLongDouble(long bits) { - // nothing to do - } - - @Specialization(guards = {"!isLong(value)", "!isHPyHandle(value)", "isBoxedNullHandle(bits)"}) - @SuppressWarnings("unused") - static void doNullOther(Object value, - @Shared("lib") @CachedLibrary(limit = "2") InteropLibrary lib, - @Bind("asPointer(value, lib)") long bits) { - // nothing to do - } - - @Specialization(guards = {"!isLong(value)", "!isHPyHandle(value)", "!isBoxedNullHandle(bits)", "isBoxedHandle(bits)"}) - static void doOther(Node inliningTarget, @SuppressWarnings("unused") Object value, - @Shared("lib") @CachedLibrary(limit = "2") @SuppressWarnings("unused") InteropLibrary lib, - @Bind("asPointer(value, lib)") long bits) { - doLong(inliningTarget, bits); - } - - @Specialization(guards = {"!isLong(value)", "!isHPyHandle(value)", "!isBoxedHandle(bits)"}) - @SuppressWarnings("unused") - static void doOtherDouble(Object value, - @Shared("lib") @CachedLibrary(limit = "2") InteropLibrary lib, - @Bind("asPointer(value, lib)") long bits) { - // nothing to do - } - } - - @GenerateInline - @GenerateCached(false) - @GenerateUncached - public abstract static class HPyCloseAndGetHandleNode extends HPyWithContextNode { - - public abstract Object execute(Node inliningTarget, Object object); - - public abstract Object execute(Node inliningTarget, long object); - - @Specialization(guards = "!handle.isAllocated()") - static Object doHandle(GraalHPyHandle handle) { - return handle.getDelegate(); - } - - @Specialization(guards = "handle.isAllocated()") - static Object doHandleAllocated(Node inliningTarget, GraalHPyHandle handle) { - handle.closeAndInvalidate(PythonContext.get(inliningTarget).getHPyContext()); - return handle.getDelegate(); - } - - @Specialization(guards = "isBoxedNullHandle(bits)") - @SuppressWarnings("unused") - static Object doNullLong(long bits) { - return GraalHPyHandle.NULL_HANDLE_DELEGATE; - } - - @Specialization(guards = {"!isBoxedNullHandle(bits)", "isBoxedHandle(bits)"}) - static Object doLong(Node inliningTarget, long bits) { - /* - * Since we have a long and it is in the "boxed handle" range, we know that the handle - * *MUST* be allocated. - */ - int id = GraalHPyBoxing.unboxHandle(bits); - assert GraalHPyHandle.isAllocated(id); - GraalHPyContext context = PythonContext.get(inliningTarget).getHPyContext(); - Object delegate = context.getObjectForHPyHandle(id); - context.releaseHPyHandleForObject(id); - return delegate; - } - - @Specialization(guards = "isBoxedDouble(bits)") - static double doLongDouble(long bits) { - return GraalHPyBoxing.unboxDouble(bits); - } - - @Specialization(guards = "isBoxedInt(bits)") - static int doLongInt(long bits) { - return GraalHPyBoxing.unboxInt(bits); - } - - static long asPointer(Object handle, InteropLibrary lib) { - try { - return lib.asPointer(handle); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } - - @Specialization(guards = {"!isLong(value)", "!isHPyHandle(value)", "isBoxedNullHandle(bits)"}) - @SuppressWarnings("unused") - static Object doNullOther(Object value, - @Shared("lib") @CachedLibrary(limit = "2") InteropLibrary lib, - @Bind("asPointer(value, lib)") long bits) { - return GraalHPyHandle.NULL_HANDLE_DELEGATE; - } - - @Specialization(guards = {"!isLong(value)", "!isHPyHandle(value)", "!isBoxedNullHandle(bits)", "isBoxedHandle(bits)"}) - static Object doOther(Node inliningTarget, @SuppressWarnings("unused") Object value, - @Shared("lib") @CachedLibrary(limit = "2") @SuppressWarnings("unused") InteropLibrary lib, - @Bind("asPointer(value, lib)") long bits) { - return doLong(inliningTarget, bits); - } - - @Specialization(guards = {"!isLong(value)", "!isHPyHandle(value)", "isBoxedDouble(bits)"}) - static double doOtherDouble(@SuppressWarnings("unused") Object value, - @Shared("lib") @CachedLibrary(limit = "2") @SuppressWarnings("unused") InteropLibrary lib, - @Bind("asPointer(value, lib)") long bits) { - return GraalHPyBoxing.unboxDouble(bits); - } - - @Specialization(guards = {"!isLong(value)", "!isHPyHandle(value)", "isBoxedInt(bits)"}) - static int doOtherInt(@SuppressWarnings("unused") Object value, - @Shared("lib") @CachedLibrary(limit = "2") @SuppressWarnings("unused") InteropLibrary lib, - @Bind("asPointer(value, lib)") long bits) { - return GraalHPyBoxing.unboxInt(bits); - } - } - - @GenerateUncached - @GenerateInline(false) - @ImportStatic(GraalHPyBoxing.class) - public abstract static class HPyAsPythonObjectNode extends CExtToJavaNode { - - public abstract Object execute(long bits); - - @Specialization - static Object doHandle(GraalHPyHandle handle) { - return handle.getDelegate(); - } - - @Specialization(guards = "isBoxedNullHandle(bits)") - @SuppressWarnings("unused") - static Object doNullLong(long bits) { - return GraalHPyHandle.NULL_HANDLE_DELEGATE; - } - - @Specialization(guards = {"!isBoxedNullHandle(bits)", "isBoxedHandle(bits)"}) - Object doLong(long bits) { - return getContext().getHPyContext().getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(bits)); - } - - @Specialization(guards = "isBoxedDouble(bits)") - static double doLongDouble(long bits) { - return GraalHPyBoxing.unboxDouble(bits); - } - - @Specialization(guards = "isBoxedInt(bits)") - static int doLongInt(long bits) { - return GraalHPyBoxing.unboxInt(bits); - } - - static long asPointer(Object handle, InteropLibrary lib) { - try { - return lib.asPointer(handle); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } - - @Specialization(guards = {"!isLong(value)", "!isHPyHandle(value)", "isBoxedNullHandle(bits)"}) - static Object doNullOther(@SuppressWarnings("unused") Object value, - @Shared("lib") @CachedLibrary(limit = "2") @SuppressWarnings("unused") InteropLibrary lib, - @Bind("asPointer(value, lib)") @SuppressWarnings("unused") long bits) { - return GraalHPyHandle.NULL_HANDLE_DELEGATE; - } - - @Specialization(guards = {"!isLong(value)", "!isHPyHandle(value)", "!isBoxedNullHandle(bits)", "isBoxedHandle(bits)"}) - Object doOther(@SuppressWarnings("unused") Object value, - @Shared("lib") @CachedLibrary(limit = "2") @SuppressWarnings("unused") InteropLibrary lib, - @Bind("asPointer(value, lib)") long bits) { - return getContext().getHPyContext().getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(bits)); - } - - @Specialization(guards = {"!isLong(value)", "!isHPyHandle(value)", "isBoxedDouble(bits)"}) - static double doOtherDouble(@SuppressWarnings("unused") Object value, - @Shared("lib") @CachedLibrary(limit = "2") @SuppressWarnings("unused") InteropLibrary lib, - @Bind("asPointer(value, lib)") long bits) { - return GraalHPyBoxing.unboxDouble(bits); - } - - @Specialization(guards = {"!isLong(value)", "!isHPyHandle(value)", "isBoxedInt(bits)"}) - static int doOtherInt(@SuppressWarnings("unused") Object value, - @Shared("lib") @CachedLibrary(limit = "2") @SuppressWarnings("unused") InteropLibrary lib, - @Bind("asPointer(value, lib)") long bits) { - return GraalHPyBoxing.unboxInt(bits); - } - - @Specialization(replaces = {"doHandle", // - "doNullLong", "doLong", "doLongDouble", "doLongInt", // - "doNullOther", "doOther", "doOtherDouble", "doOtherInt" // - }) - Object doGeneric(Object value, - @Shared("lib") @CachedLibrary(limit = "2") InteropLibrary lib) { - if (value instanceof GraalHPyHandle) { - return ((GraalHPyHandle) value).getDelegate(); - } - long bits; - if (value instanceof Long) { - bits = (Long) value; - } else { - lib.toNative(value); - try { - bits = lib.asPointer(value); - } catch (UnsupportedMessageException ex) { - throw CompilerDirectives.shouldNotReachHere(ex); - } - } - if (GraalHPyBoxing.isBoxedNullHandle(bits)) { - return GraalHPyHandle.NULL_HANDLE_DELEGATE; - } else if (GraalHPyBoxing.isBoxedInt(bits)) { - return GraalHPyBoxing.unboxInt(bits); - } else if (GraalHPyBoxing.isBoxedDouble(bits)) { - return GraalHPyBoxing.unboxDouble(bits); - } else { - assert GraalHPyBoxing.isBoxedHandle(bits); - return getContext().getHPyContext().getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(bits)); - } - } - } - - public static final class HPyDummyToJavaNode extends CExtToJavaNode { - private static final HPyDummyToJavaNode UNCACHED = new HPyDummyToJavaNode(); - - public static HPyDummyToJavaNode create() { - return new HPyDummyToJavaNode(); - } - - public static HPyDummyToJavaNode getUncached() { - return UNCACHED; - } - - @Override - public Object execute(Object object) { - return object; - } - - @Override - public boolean isAdoptable() { - return this != UNCACHED; - } - } - - @GenerateUncached - @GenerateInline(false) - @ImportStatic(PGuards.class) - public abstract static class HPyAsHandleNode extends CExtToNativeNode { - protected static final byte HANDLE = 0; - protected static final byte GLOBAL = 1; - protected static final byte FIELD = 2; - - @Override - public final GraalHPyHandle execute(Object object) { - return execute(object, 0, HANDLE); - } - - public final GraalHPyHandle executeGlobal(Object object, int id) { - return execute(object, id, GLOBAL); - } - - public final GraalHPyHandle executeField(Object object, int id) { - return execute(object, id, FIELD); - } - - protected abstract GraalHPyHandle execute(Object object, int id, int type); - - /* - * NOTE: We *MUST NOT* box values here because we don't know where the handle will be given - * to. In case we give it to LLVM code, we must still have an object that emulates the HPy - * struct. - */ - - @Specialization(guards = "isNoValue(object)") - @SuppressWarnings("unused") - static GraalHPyHandle doNoValue(PNone object, int id, int type) { - return GraalHPyHandle.NULL_HANDLE; - } - - @Specialization(guards = {"!isNoValue(object)", "type == HANDLE"}) - GraalHPyHandle doObject(Object object, @SuppressWarnings("unused") int id, @SuppressWarnings("unused") int type) { - return getContext().getHPyContext().createHandle(object); - } - - @Specialization(guards = {"!isNoValue(object)", "type == GLOBAL"}) - static GraalHPyHandle doGlobal(Object object, int id, @SuppressWarnings("unused") int type) { - return GraalHPyHandle.createGlobal(object, id); - } - - @Specialization(guards = {"!isNoValue(object)", "type == FIELD"}) - GraalHPyHandle doField(Object object, int id, @SuppressWarnings("unused") int type) { - return getContext().getHPyContext().createField(object, id); - } - } - - /** - * Converts a Python object to a native {@code int64_t} compatible value. - */ - @GenerateUncached - @GenerateInline(false) - public abstract static class HPyAsNativeInt64Node extends CExtToNativeNode { - - // Adding specializations for primitives does not make a lot of sense just to avoid - // un-/boxing in the interpreter since interop will force un-/boxing anyway. - @Specialization - static Object doGeneric(Object value, - @Bind("this") Node inliningTarget, - @Cached ConvertPIntToPrimitiveNode asNativePrimitiveNode) { - return asNativePrimitiveNode.execute(inliningTarget, value, 1, Long.BYTES); - } - } - - public abstract static class HPyConvertArgsToSulongNode extends PNodeWithContext { - - public abstract void executeInto(VirtualFrame frame, Object[] args, int argsOffset, Object[] dest, int destOffset); - - abstract HPyCloseArgHandlesNode createCloseHandleNode(); - } - - public abstract static class HPyCloseArgHandlesNode extends PNodeWithContext { - - public abstract void executeInto(VirtualFrame frame, Object[] args, int argsOffset); - } - - @GenerateInline(false) - public abstract static class HPyVarargsToSulongNode extends HPyConvertArgsToSulongNode { - - @Specialization - static void doConvert(Object[] args, int argsOffset, Object[] dest, int destOffset, - @Cached HPyAsHandleNode selfAsHandleNode) { - dest[destOffset] = selfAsHandleNode.execute(args[argsOffset]); - dest[destOffset + 1] = args[argsOffset + 1]; - dest[destOffset + 2] = args[argsOffset + 2]; - } - - @Override - HPyCloseArgHandlesNode createCloseHandleNode() { - return HPyVarargsHandleCloseNodeGen.create(); - } - } - - /** - * The counter part of {@link HPyVarargsToSulongNode}. - */ - @GenerateInline(false) - public abstract static class HPyVarargsHandleCloseNode extends HPyCloseArgHandlesNode { - - @Specialization - static void doConvert(Object[] dest, int destOffset, - @Bind("this") Node inliningTarget, - @Cached HPyCloseHandleNode closeHandleNode) { - closeHandleNode.execute(inliningTarget, dest[destOffset]); - } - } - - /** - * Always closes parameter at position {@code destOffset} (assuming that it is a handle). - */ - @GenerateInline(false) - public abstract static class HPySelfHandleCloseNode extends HPyCloseArgHandlesNode { - - @Specialization - static void doConvert(Object[] dest, int destOffset, - @Bind("this") Node inliningTarget, - @Cached HPyCloseHandleNode closeHandleNode) { - closeHandleNode.execute(inliningTarget, dest[destOffset]); - } - } - - @GenerateInline(false) - public abstract static class HPyKeywordsToSulongNode extends HPyConvertArgsToSulongNode { - - @Specialization - static void doConvert(Object[] args, int argsOffset, Object[] dest, int destOffset, - @Cached HPyAsHandleNode selfAsHandleNode, - @Cached HPyAsHandleNode kwAsHandleNode) { - dest[destOffset] = selfAsHandleNode.execute(args[argsOffset]); - dest[destOffset + 1] = args[argsOffset + 1]; - dest[destOffset + 2] = args[argsOffset + 2]; - dest[destOffset + 3] = kwAsHandleNode.execute(args[argsOffset + 3]); - } - - @Override - HPyCloseArgHandlesNode createCloseHandleNode() { - return HPyKeywordsHandleCloseNodeGen.create(); - } - } - - /** - * The counter part of {@link HPyKeywordsToSulongNode}. - */ - @GenerateInline(false) - public abstract static class HPyKeywordsHandleCloseNode extends HPyCloseArgHandlesNode { - - @Specialization - static void doConvert(Object[] dest, int destOffset, - @Bind("this") Node inliningTarget, - @Cached HPyCloseHandleNode closeFirstHandleNode, - @Cached HPyCloseHandleNode closeSecondHandleNode) { - closeFirstHandleNode.execute(inliningTarget, dest[destOffset]); - closeSecondHandleNode.execute(inliningTarget, dest[destOffset + 3]); - } - } - - @GenerateInline(false) - public abstract static class HPyAllAsHandleNode extends HPyConvertArgsToSulongNode { - - static boolean isArgsOffsetPlus(int len, int off, int plus) { - return len == off + plus; - } - - static boolean isLeArgsOffsetPlus(int len, int off, int plus) { - return len < plus + off; - } - - @Specialization(guards = {"args.length == argsOffset"}) - @SuppressWarnings("unused") - static void cached0(Object[] args, int argsOffset, Object[] dest, int destOffset) { - } - - @Specialization(guards = {"args.length == cachedLength", "isLeArgsOffsetPlus(cachedLength, argsOffset, 8)"}, limit = "1", replaces = "cached0") - @ExplodeLoop - static void cachedLoop(Object[] args, int argsOffset, Object[] dest, int destOffset, - @Cached("args.length") int cachedLength, - @Shared @Cached HPyAsHandleNode toSulongNode) { - CompilerAsserts.partialEvaluationConstant(destOffset); - for (int i = 0; i < cachedLength - argsOffset; i++) { - dest[destOffset + i] = toSulongNode.execute(args[argsOffset + i]); - } - } - - @Specialization(replaces = {"cached0", "cachedLoop"}) - static void uncached(Object[] args, int argsOffset, Object[] dest, int destOffset, - @Shared @Cached HPyAsHandleNode toSulongNode) { - int len = args.length; - for (int i = 0; i < len - argsOffset; i++) { - dest[destOffset + i] = toSulongNode.execute(args[argsOffset + i]); - } - } - - @Override - HPyCloseArgHandlesNode createCloseHandleNode() { - return HPyAllHandleCloseNodeGen.create(); - } - } - - /** - * The counter part of {@link HPyAllAsHandleNode}. - */ - @GenerateInline(false) - public abstract static class HPyAllHandleCloseNode extends HPyCloseArgHandlesNode { - - @Specialization(guards = {"dest.length == destOffset"}) - @SuppressWarnings("unused") - static void cached0(Object[] dest, int destOffset) { - } - - @Specialization(guards = {"dest.length == cachedLength", "isLeArgsOffsetPlus(cachedLength, destOffset, 8)"}, limit = "1", replaces = "cached0") - @ExplodeLoop - static void cachedLoop(Object[] dest, int destOffset, - @Bind("this") Node inliningTarget, - @Cached("dest.length") int cachedLength, - @Shared @Cached HPyCloseHandleNode closeHandleNode) { - CompilerAsserts.partialEvaluationConstant(destOffset); - for (int i = 0; i < cachedLength - destOffset; i++) { - closeHandleNode.execute(inliningTarget, dest[destOffset + i]); - } - } - - @Specialization(replaces = {"cached0", "cachedLoop"}) - static void uncached(Object[] dest, int destOffset, - @Bind("this") Node inliningTarget, - @Shared @Cached HPyCloseHandleNode closeHandleNode) { - int len = dest.length; - for (int i = 0; i < len - destOffset; i++) { - closeHandleNode.execute(inliningTarget, dest[destOffset + i]); - } - } - - static boolean isLeArgsOffsetPlus(int len, int off, int plus) { - return len < plus + off; - } - } - - /** - * Argument converter for calling a native get/set descriptor getter function. The native - * signature is: {@code HPy getter(HPyContext ctx, HPy self, void* closure)}. - */ - @GenerateInline(false) - public abstract static class HPyGetSetGetterToSulongNode extends HPyConvertArgsToSulongNode { - - @Specialization - static void doConvert(Object[] args, int argsOffset, Object[] dest, int destOffset, - @Cached HPyAsHandleNode selfAsHandleNode) { - dest[destOffset] = selfAsHandleNode.execute(args[argsOffset]); - dest[destOffset + 1] = args[argsOffset + 1]; - } - - @Override - HPyCloseArgHandlesNode createCloseHandleNode() { - return HPySelfHandleCloseNodeGen.create(); - } - } - - /** - * Argument converter for calling a native get/set descriptor setter function. The native - * signature is: {@code HPy setter(HPyContext ctx, HPy self, HPy value, void* closure)}. - */ - @GenerateInline(false) - public abstract static class HPyGetSetSetterToSulongNode extends HPyConvertArgsToSulongNode { - - @Specialization - static void doConvert(Object[] args, int argsOffset, Object[] dest, int destOffset, - @Cached HPyAsHandleNode asHandleNode) { - dest[destOffset] = asHandleNode.execute(args[argsOffset]); - dest[destOffset + 1] = asHandleNode.execute(args[argsOffset + 1]); - dest[destOffset + 2] = args[argsOffset + 2]; - } - - @Override - HPyCloseArgHandlesNode createCloseHandleNode() { - return HPyGetSetSetterHandleCloseNodeGen.create(); - } - } - - /** - * The counter part of {@link HPyGetSetSetterToSulongNode}. - */ - @GenerateInline(false) - public abstract static class HPyGetSetSetterHandleCloseNode extends HPyCloseArgHandlesNode { - - @Specialization - static void doConvert(Object[] dest, int destOffset, - @Bind("this") Node inliningTarget, - @Cached HPyCloseHandleNode closeFirstHandleNode, - @Cached HPyCloseHandleNode closeSecondHandleNode) { - closeFirstHandleNode.execute(inliningTarget, dest[destOffset]); - closeSecondHandleNode.execute(inliningTarget, dest[destOffset + 1]); - } - } - - /** - * Converts {@code self} to an HPy handle and any other argument to {@code HPy_ssize_t}. - */ - @GenerateInline(false) - public abstract static class HPySSizeArgFuncToSulongNode extends HPyConvertArgsToSulongNode { - - @Specialization(guards = {"isArity(args.length, argsOffset, 2)"}) - static void doHandleSsizeT(Object[] args, int argsOffset, Object[] dest, int destOffset, - @Bind("this") Node inliningTarget, - @Shared @Cached HPyAsHandleNode asHandleNode, - @Shared @Cached ConvertPIntToPrimitiveNode asSsizeTNode) { - CompilerAsserts.partialEvaluationConstant(argsOffset); - dest[destOffset] = asHandleNode.execute(args[argsOffset]); - dest[destOffset + 1] = asSsizeTNode.execute(inliningTarget, args[argsOffset + 1], 1, Long.BYTES); - } - - @Specialization(guards = {"isArity(args.length, argsOffset, 3)"}) - static void doHandleSsizeTSsizeT(Object[] args, int argsOffset, Object[] dest, int destOffset, - @Bind("this") Node inliningTarget, - @Shared @Cached HPyAsHandleNode asHandleNode, - @Shared @Cached ConvertPIntToPrimitiveNode asSsizeTNode) { - CompilerAsserts.partialEvaluationConstant(argsOffset); - dest[destOffset] = asHandleNode.execute(args[argsOffset]); - dest[destOffset + 1] = asSsizeTNode.execute(inliningTarget, args[argsOffset + 1], 1, Long.BYTES); - dest[destOffset + 2] = asSsizeTNode.execute(inliningTarget, args[argsOffset + 2], 1, Long.BYTES); - } - - @Specialization(replaces = {"doHandleSsizeT", "doHandleSsizeTSsizeT"}) - static void doGeneric(Object[] args, int argsOffset, Object[] dest, int destOffset, - @Bind("this") Node inliningTarget, - @Shared @Cached HPyAsHandleNode asHandleNode, - @Shared @Cached ConvertPIntToPrimitiveNode asSsizeTNode) { - dest[destOffset] = asHandleNode.execute(args[argsOffset]); - for (int i = 1; i < args.length - argsOffset; i++) { - dest[destOffset + i] = asSsizeTNode.execute(inliningTarget, args[argsOffset + i], 1, Long.BYTES); - } - } - - @Override - HPyCloseArgHandlesNode createCloseHandleNode() { - return HPySelfHandleCloseNodeGen.create(); - } - - static boolean isArity(int len, int off, int expected) { - return len - off == expected; - } - } - - /** - * Converts arguments for C function signature - * {@code int (*HPyFunc_ssizeobjargproc)(HPyContext ctx, HPy, HPy_ssize_t, HPy)}. - */ - @GenerateInline(false) - public abstract static class HPySSizeObjArgProcToSulongNode extends HPyConvertArgsToSulongNode { - - @Specialization - static void doConvert(Object[] args, int argsOffset, Object[] dest, int destOffset, - @Bind("this") Node inliningTarget, - @Cached HPyAsHandleNode asHandleNode, - @Cached ConvertPIntToPrimitiveNode asSsizeTNode) { - CompilerAsserts.partialEvaluationConstant(argsOffset); - dest[destOffset] = asHandleNode.execute(args[argsOffset]); - dest[destOffset + 1] = asSsizeTNode.execute(inliningTarget, args[argsOffset + 1], 1, Long.BYTES); - dest[destOffset + 2] = asHandleNode.execute(args[argsOffset + 2]); - } - - @Override - HPyCloseArgHandlesNode createCloseHandleNode() { - return HPySSizeObjArgProcCloseNodeGen.create(); - } - } - - /** - * Always closes handle parameter at position {@code destOffset} and also closes parameter at - * position {@code destOffset + 2} if it is not a {@code NULL} handle. - */ - @GenerateInline(false) - public abstract static class HPySSizeObjArgProcCloseNode extends HPyCloseArgHandlesNode { - - @Specialization - static void doConvert(Object[] dest, int destOffset, - @Bind("this") Node inliningTarget, - @Cached HPyCloseHandleNode closeFirstHandleNode, - @Cached HPyCloseHandleNode closeSecondHandleNode) { - closeFirstHandleNode.execute(inliningTarget, dest[destOffset]); - closeSecondHandleNode.execute(inliningTarget, dest[destOffset + 2]); - } - } - - /** - * Converts arguments for C function signature - * {@code HPy (*HPyFunc_richcmpfunc)(HPyContext ctx, HPy, HPy, HPy_RichCmpOp);}. - */ - @GenerateInline(false) - public abstract static class HPyRichcmpFuncArgsToSulongNode extends HPyConvertArgsToSulongNode { - - @Specialization - static void doConvert(Object[] args, int argsOffset, Object[] dest, int destOffset, - @Cached HPyAsHandleNode asHandleNode) { - CompilerAsserts.partialEvaluationConstant(argsOffset); - dest[destOffset] = asHandleNode.execute(args[argsOffset]); - dest[destOffset + 1] = asHandleNode.execute(args[argsOffset + 1]); - dest[destOffset + 2] = args[argsOffset + 2]; - } - - @Override - HPyCloseArgHandlesNode createCloseHandleNode() { - return HPyRichcmptFuncArgsCloseNodeGen.create(); - } - } - - /** - * Always closes handle parameter at positions {@code destOffset} and {@code destOffset + 1}. - */ - @GenerateInline(false) - public abstract static class HPyRichcmptFuncArgsCloseNode extends HPyCloseArgHandlesNode { - - @Specialization - static void doConvert(Object[] dest, int destOffset, - @Bind("this") Node inliningTarget, - @Cached HPyCloseHandleNode closeFirstHandleNode, - @Cached HPyCloseHandleNode closeSecondHandleNode) { - closeFirstHandleNode.execute(inliningTarget, dest[destOffset]); - closeSecondHandleNode.execute(inliningTarget, dest[destOffset + 1]); - } - } - - /** - * Converts for C function signature - * {@code int (*HPyFunc_getbufferproc)(HPyContext ctx, HPy self, HPy_buffer *buffer, int flags)} - * . - */ - @GenerateInline(false) - public abstract static class HPyGetBufferProcToSulongNode extends HPyConvertArgsToSulongNode { - - @Specialization - static void doConversion(Object[] args, int argsOffset, Object[] dest, int destOffset, - @Cached HPyAsHandleNode asHandleNode, - @Cached AsNativePrimitiveNode asIntNode) { - CompilerAsserts.partialEvaluationConstant(argsOffset); - dest[destOffset] = asHandleNode.execute(args[argsOffset]); - dest[destOffset + 1] = args[argsOffset + 1]; - dest[destOffset + 2] = asIntNode.execute(args[argsOffset + 2], 1, Integer.BYTES, true); - } - - @Override - HPyCloseArgHandlesNode createCloseHandleNode() { - return HPySelfHandleCloseNodeGen.create(); - } - } - - /** - * Converts for C function signature - * {@code void (*HPyFunc_releasebufferproc)(HPyContext ctx, HPy self, HPy_buffer *buffer)}. - */ - @GenerateInline(false) - public abstract static class HPyReleaseBufferProcToSulongNode extends HPyConvertArgsToSulongNode { - - @Specialization - static void doConversion(Object[] args, int argsOffset, Object[] dest, int destOffset, - @Cached HPyAsHandleNode asHandleNode) { - CompilerAsserts.partialEvaluationConstant(argsOffset); - dest[destOffset] = asHandleNode.execute(args[argsOffset]); - dest[destOffset + 1] = args[argsOffset + 1]; - } - - @Override - HPyCloseArgHandlesNode createCloseHandleNode() { - return HPySelfHandleCloseNodeGen.create(); - } - } - - @GenerateUncached - @GenerateInline - @GenerateCached(false) - abstract static class HPyLongFromLong extends Node { - public abstract Object execute(Node inliningTarget, int value, boolean signed); - - public abstract Object execute(Node inliningTarget, long value, boolean signed); - - public abstract Object execute(Node inliningTarget, Object value, boolean signed); - - @Specialization(guards = "signed") - static int doSignedInt(int n, @SuppressWarnings("unused") boolean signed) { - return n; - } - - @Specialization(guards = "!signed") - static long doUnsignedInt(int n, @SuppressWarnings("unused") boolean signed) { - if (n < 0) { - return n & 0xFFFFFFFFL; - } - return n; - } - - @Specialization(guards = "signed") - static long doSignedLong(long n, @SuppressWarnings("unused") boolean signed) { - return n; - } - - @Specialization(guards = {"!signed", "n >= 0"}) - static long doUnsignedLongPositive(long n, @SuppressWarnings("unused") boolean signed) { - return n; - } - - @Specialization(guards = {"!signed", "n < 0"}) - static Object doUnsignedLongNegative(long n, @SuppressWarnings("unused") boolean signed, - @Shared("factory") @Cached(inline = false) PythonObjectFactory factory) { - return factory.createInt(convertToBigInteger(n)); - } - - @TruffleBoundary - private static BigInteger convertToBigInteger(long n) { - return BigInteger.valueOf(n).add(BigInteger.ONE.shiftLeft(Long.SIZE)); - } - - @Specialization - static Object doPointer(PythonNativeObject n, @SuppressWarnings("unused") boolean signed, - @Shared("factory") @Cached(inline = false) PythonObjectFactory factory) { - return factory.createNativeVoidPtr(n.getPtr()); - } - } - - /** - * Represents {@code HPyType_SpecParam}. - */ - @ValueType - record HPyTypeSpecParam(int kind, Object object) { - }; - - /** - *
      -     *     typedef struct {
      -     *         const char* name;
      -     *         int basicsize;
      -     *         int itemsize;
      -     *         unsigned int flags;
      -     *         int legacy;
      -     *         void *legacy_slots;
      -     *         HPyDef **defines;
      -     *         const char *doc;
      -     *     } HPyType_Spec;
      -     * 
      - */ - @ImportStatic(SpecialMethodSlot.class) - @GenerateUncached - @GenerateInline(false) // footprint reduction 196 -> 180 - abstract static class HPyCreateTypeFromSpecNode extends Node { - - private static final TruffleLogger LOGGER = GraalHPyContext.getLogger(HPyCreateTypeFromSpecNode.class); - static final TruffleString T_PYTRUFFLE_CREATETYPE = tsLiteral("PyTruffle_CreateType"); - - abstract Object execute(GraalHPyContext context, Object typeSpec, Object typeSpecParamArray); - - @Specialization - static Object doGeneric(GraalHPyContext context, Object typeSpec, Object typeSpecParamArray, - @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") DynamicObjectLibrary dylib, - @Cached(parameters = "context") GraalHPyCAccess.ReadPointerNode readPointerNode, - @Cached(parameters = "context") GraalHPyCAccess.AllocateNode allocateNode, - @Cached(parameters = "context") GraalHPyCAccess.ReadI32Node readI32Node, - @Cached(parameters = "context") GraalHPyCAccess.IsNullNode isNullNode, - @Cached(parameters = "context") HPyAsCharPointerNode asCharPointerNode, - @Cached HPyTypeSplitNameNode splitName, - @Cached FromCharPointerNode fromCharPointerNode, - @Cached PythonObjectFactory factory, - @Cached IsTypeNode isTypeNode, - @Cached HasSameConstructorNode hasSameConstructorNode, - @Cached CStructAccess.ReadI64Node getMetaSizeNode, - @Cached WriteAttributeToObjectNode writeAttributeToObjectNode, - @Cached ReadPropertyNode readPropertyNode, - @Cached WritePropertyNode writePropertyNode, - @Cached PyObjectCallMethodObjArgs callCreateTypeNode, - @Cached HPyCreateFunctionNode addFunctionNode, - @Cached HPyAddMemberNode addMemberNode, - @Cached HPyCreateSlotNode addSlotNode, - @Cached HPyCreateLegacySlotNode createLegacySlotNode, - @Cached HPyCreateGetSetDescriptorNode createGetSetDescriptorNode, - @Cached GetBaseClassNode getBaseClassNode, - @Cached(parameters = "New") LookupCallableSlotInMRONode lookupNewNode, - @Cached PRaiseNode raiseNode) { - - try { - // the name as given by the specification - TruffleString specName = fromCharPointerNode.execute(readPointerNode.read(context, typeSpec, GraalHPyCField.HPyType_Spec__name), false); - - // extract module and type name - TruffleString[] names = splitName.execute(inliningTarget, specName); - assert names.length == 2; - - Object tpName = asCharPointerNode.execute(context, names[1], Encoding.UTF_8); - - PDict namespace; - Object doc = readPointerNode.read(context, typeSpec, GraalHPyCField.HPyType_Spec__doc); - if (!isNullNode.execute(context, doc)) { - TruffleString docString = fromCharPointerNode.execute(doc); - namespace = factory.createDict(new PKeyword[]{new PKeyword(SpecialAttributeNames.T___DOC__, docString)}); - } else { - namespace = factory.createDict(); - } - - HPyTypeSpecParam[] typeSpecParams = extractTypeSpecParams(context, typeSpecParamArray); - - // extract bases from type spec params - PTuple bases = extractBases(typeSpecParams, factory); - // extract metaclass from type spec params - Object metatype = getMetatype(typeSpecParams, raiseNode); - - if (metatype != null) { - if (!isTypeNode.execute(inliningTarget, metatype)) { - throw raiseNode.raise(TypeError, ErrorMessages.HPY_METACLASS_IS_NOT_A_TYPE, metatype); - } - if (!hasSameConstructorNode.execute(inliningTarget, metatype, PythonBuiltinClassType.PythonClass)) { - throw raiseNode.raise(TypeError, ErrorMessages.HPY_METACLASS_WITH_CUSTOM_CONS_NOT_SUPPORTED); - } - } - - // create the type object - PythonModule pythonCextModule = PythonContext.get(inliningTarget).lookupBuiltinModule(BuiltinNames.T___GRAALPYTHON__); - PythonClass newType = (PythonClass) callCreateTypeNode.execute(null, inliningTarget, pythonCextModule, T_PYTRUFFLE_CREATETYPE, - names[1], bases, namespace, metatype != null ? metatype : PythonBuiltinClassType.PythonClass); - // allocate additional memory for the metatype and set it - long metaBasicSize = 0; - Object destroyFunc = null; - if (metatype instanceof PythonClass metaclass) { - // get basicsize of metatype and allocate it into - // GraalHPyDef.OBJECT_HPY_NATIVE_SPACE - metaBasicSize = metaclass.getBasicSize(); - destroyFunc = metaclass.getHPyDestroyFunc(); - } else if (metatype instanceof PythonAbstractNativeObject nativeObject) { - // This path is implemented only for completeness, - // but is not expected to happen often, hence the - // uncached nodes, no profiling and potential leak - metaBasicSize = getMetaSizeNode.readFromObj(nativeObject, PyTypeObject__tp_basicsize); - } - if (metaBasicSize > 0) { - Object dataPtr = allocateNode.calloc(context, 1, metaBasicSize); - GraalHPyData.setHPyNativeSpace(newType, dataPtr); - if (destroyFunc != null) { - context.createHandleReference(newType, dataPtr, destroyFunc != PNone.NO_VALUE ? destroyFunc : null); - } - } - - // determine and set the correct module attribute - TruffleString value = names[0]; - if (value != null) { - writeAttributeToObjectNode.execute(newType, SpecialAttributeNames.T___MODULE__, value); - } else { - // TODO(fa): issue deprecation warning with message "builtin type %.200s has no - // __module__ attribute" - } - - // store flags, basicsize, and itemsize to type - long flags = readI32Node.readUnsigned(context, typeSpec, GraalHPyCField.HPyType_Spec__flags); - int builtinShape = readI32Node.read(context, typeSpec, GraalHPyCField.HPyType_Spec__builtin_shape); - if (!GraalHPyDef.isValidBuiltinShape(builtinShape)) { - throw raiseNode.raise(ValueError, ErrorMessages.HPY_INVALID_BUILTIN_SHAPE, builtinShape); - } - - long basicSize = readI32Node.read(context, typeSpec, GraalHPyCField.HPyType_Spec__basicsize); - long itemSize = readI32Node.read(context, typeSpec, GraalHPyCField.HPyType_Spec__itemsize); - newType.setHPyTypeExtra(new HPyTypeExtra(flags, basicSize, itemSize, tpName, builtinShape)); - newType.makeStaticBase(dylib); - - boolean seenNew = false; - boolean needsTpTraverse = ((flags & GraalHPyDef.HPy_TPFLAGS_HAVE_GC) != 0); - // The builder will collect both the HPy and legacy slots - Builder tpSlotsBuilder = TpSlots.newBuilder(); - - // process defines - Object defines = readPointerNode.read(context, typeSpec, GraalHPyCField.HPyType_Spec__defines); - // field 'defines' may be 'NULL' - if (!isNullNode.execute(context, defines)) { - for (long i = 0;; i++) { - Object def = readPointerNode.readArrayElement(context, defines, i); - if (isNullNode.execute(context, def)) { - break; - } - HPyProperty property = null; - int kind = readI32Node.read(context, def, GraalHPyCField.HPyDef__kind); - switch (kind) { - case GraalHPyDef.HPY_DEF_KIND_METH: - PBuiltinFunction fun = addFunctionNode.execute(context, newType, def); - property = new HPyProperty(fun.getName(), fun); - break; - case GraalHPyDef.HPY_DEF_KIND_SLOT: - Object addSlotResult = addSlotNode.execute(context, newType, tpSlotsBuilder, def); - if (HPY_TP_TRAVERSE.equals(addSlotResult)) { - needsTpTraverse = false; - } else if (addSlotResult instanceof HPyProperty) { - property = (HPyProperty) addSlotResult; - } - if (property != null && SpecialMethodNames.T___NEW__.equals(property.key)) { - seenNew = true; - } - break; - case GraalHPyDef.HPY_DEF_KIND_MEMBER: - property = addMemberNode.execute(context, newType, def); - break; - case GraalHPyDef.HPY_DEF_KIND_GETSET: - GetSetDescriptor getSetDescriptor = createGetSetDescriptorNode.execute(context, newType, def); - property = new HPyProperty(getSetDescriptor.getName(), getSetDescriptor); - break; - default: - if (LOGGER.isLoggable(Level.SEVERE)) { - LOGGER.severe(PythonUtils.formatJString("unknown definition kind: %d", kind)); - } - assert false; - } - - if (property != null) { - property.write(inliningTarget, writePropertyNode, readPropertyNode, newType); - } - } - } - - /* - * Enforce constraint that we cannot have slot 'HPy_tp_call' and an explicit member - * '__vectorcalloffset__'. - */ - if (newType.getHPyVectorcallOffset() != Long.MIN_VALUE && newType.getHPyDefaultCallFunc() != null) { - throw raiseNode.raise(TypeError, ErrorMessages.HPY_CANNOT_HAVE_CALL_AND_VECTORCALLOFFSET); - } - - if (needsTpTraverse) { - throw raiseNode.raise(ValueError, ErrorMessages.TRAVERSE_FUNCTION_NEEDED); - } - - // process legacy slots; this is of type 'cpy_PyTypeSlot legacy_slots[]' - Object legacySlotsArrPtr = readPointerNode.read(context, typeSpec, GraalHPyCField.HPyType_Spec__legacy_slots); - if (!isNullNode.execute(context, legacySlotsArrPtr)) { - if (builtinShape != GraalHPyDef.HPyType_BUILTIN_SHAPE_LEGACY) { - throw raiseNode.raise(TypeError, ErrorMessages.HPY_CANNOT_SPECIFY_LEG_SLOTS_WO_SETTING_LEG); - } - for (int i = 0;; i++) { - if (!createLegacySlotNode.execute(context, newType, tpSlotsBuilder, legacySlotsArrPtr, i)) { - break; - } - } - } - - // These are the slots for the type we are creating as specified by the user: - TpSlots newSlots = tpSlotsBuilder.build(); - // Slots inheritance: - newType.setTpSlots(newType.getTpSlots().copy().overrideIgnoreGroups(newSlots).build()); - // Create descriptors wrapping the slots, but only the new slots: - newSlots.addOperators(newType); - TpSlots.fixupSlotDispatchers(newType); - - /* - * If 'basicsize > 0' and no explicit constructor is given, the constructor of the - * object needs to allocate the native space for the object. However, the inherited - * constructors won't do that. Also, if the default call function needs to be set - * (i.e. 'HPy_tp_call' was defined), an inherited constructor won't do it. - * - * The built-in shape determines the "native" shape of the object which means that - * it determines which Java object we need to allocate (e.g. PInt, PythonObject, - * PFloat, etc.). - */ - Object baseClass = getBaseClassNode.execute(inliningTarget, newType); - if (!seenNew && (basicSize > 0 || newType.getHPyDefaultCallFunc() != null)) { - - /* - * TODO(fa): we could do some shortcut if 'baseClass == PythonObject' and use - * 'inheritedConstruct = null' but that needs to be considered in the decorating - * new as well - */ - // Lookup the inherited constructor and pass it to the HPy decorator. - Object inheritedConstructor = lookupNewNode.execute(baseClass); - PBuiltinFunction constructorDecorator = HPyObjectNewNode.createBuiltinFunction(PythonLanguage.get(raiseNode), inheritedConstructor, builtinShape); - writeAttributeToObjectNode.execute(newType, SpecialMethodNames.T___NEW__, constructorDecorator); - } - - long baseFlags; - if (baseClass instanceof PythonClass pythonBaseClass) { - baseFlags = pythonBaseClass.getFlags(); - } else { - baseFlags = 0; - } - int baseBuiltinShape = GraalHPyDef.getBuiltinShapeFromHiddenAttribute(baseClass); - checkInheritanceConstraints(flags, baseFlags, builtinShape, baseBuiltinShape > GraalHPyDef.HPyType_BUILTIN_SHAPE_LEGACY, raiseNode); - return newType; - } catch (CannotCastException e) { - throw raiseNode.raise(SystemError, ErrorMessages.COULD_NOT_CREATE_TYPE_FROM_SPEC_BECAUSE, e); - } - } - - /** - * Read the array of {@code HPyType_SpecParam} and convert to a Java array of - * {@link HPyTypeSpecParam}. - * - *
      -         *     typedef struct {
      -         *         HPyType_SpecParam_Kind kind;
      -         *         HPy object;
      -         *     } HPyType_SpecParam;
      -         * 
      - */ - @TruffleBoundary - private static HPyTypeSpecParam[] extractTypeSpecParams(GraalHPyContext context, Object typeSpecParamArray) { - - // if the pointer is NULL, no bases have been explicitly specified - if (GraalHPyCAccess.IsNullNode.executeUncached(context, typeSpecParamArray)) { - return null; - } - - GraalHPyCAccess.ReadI32Node readI32Node = GraalHPyCAccess.ReadI32Node.getUncached(context); - GraalHPyCAccess.ReadHPyNode readHPyNode = GraalHPyCAccess.ReadHPyNode.getUncached(context); - - long specParamSize = context.getCTypeSize(HPyContextSignatureType.HPyType_SpecParam); - - List specParams = new LinkedList<>(); - for (int i = 0;; i++) { - long specParamKindOffset = ReadHPyNode.getElementPtr(context, i, specParamSize, GraalHPyCField.HPyType_SpecParam__kind); - int specParamKind = readI32Node.readOffset(context, typeSpecParamArray, specParamKindOffset); - if (specParamKind == 0) { - break; - } - long specParamObjectOffset = ReadHPyNode.getElementPtr(context, i, specParamSize, GraalHPyCField.HPyType_SpecParam__object); - Object specParamObject = readHPyNode.read(context, typeSpecParamArray, specParamObjectOffset); - - specParams.add(new HPyTypeSpecParam(specParamKind, specParamObject)); - } - return specParams.toArray(new HPyTypeSpecParam[0]); - } - - /** - * Extract bases from the array of type spec params. Reference implementation can be found - * in {@code ctx_type.c:build_bases_from_params}. - * - * @return The bases tuple or {@code null} in case of an error. - */ - @TruffleBoundary - private static PTuple extractBases(HPyTypeSpecParam[] typeSpecParams, PythonObjectFactory factory) { - - // if there are no type spec params, no bases have been explicitly specified - if (typeSpecParams == null) { - return factory.createEmptyTuple(); - } - - ArrayList basesList = new ArrayList<>(); - for (HPyTypeSpecParam typeSpecParam : typeSpecParams) { - switch (typeSpecParam.kind()) { - case GraalHPyDef.HPyType_SPEC_PARAM_BASE: - // In this case, the 'specParamObject' is a single handle. We add it to - // the list of bases. - assert PGuards.isClassUncached(typeSpecParam.object()) : "base object is not a Python class"; - basesList.add(typeSpecParam.object()); - break; - case GraalHPyDef.HPyType_SPEC_PARAM_BASES_TUPLE: - // In this case, the 'specParamObject' is tuple. According to the - // reference implementation, we immediately use this tuple and throw - // away any other single base classes or subsequent params. - assert PGuards.isPTuple(typeSpecParam.object()) : "type spec param claims to be a tuple but isn't"; - return (PTuple) typeSpecParam.object(); - case GraalHPyDef.HPyType_SPEC_PARAM_METACLASS: - // intentionally ignored - break; - default: - assert false : "unknown type spec param kind"; - } - } - return factory.createTuple(basesList.toArray()); - } - - /** - * Reference implementation can be found in {@code ctx_type.c:get_metatype} - */ - @TruffleBoundary - private static Object getMetatype(HPyTypeSpecParam[] typeSpecParams, PRaiseNode raiseNode) { - Object result = null; - if (typeSpecParams != null) { - for (HPyTypeSpecParam typeSpecParam : typeSpecParams) { - if (typeSpecParam.kind() == GraalHPyDef.HPyType_SPEC_PARAM_METACLASS) { - if (result != null) { - throw raiseNode.raise(ValueError, ErrorMessages.HPY_METACLASS_SPECIFIED_MULTIPLE_TIMES); - } - result = typeSpecParam.object(); - if (!IsTypeNode.executeUncached(result)) { - throw raiseNode.raise(TypeError, ErrorMessages.HPY_METACLASS_IS_NOT_A_TYPE, result); - } - } - } - } - return result; - } - - private static void checkInheritanceConstraints(long flags, long baseFlags, int builtinShape, boolean baseIsPure, PRaiseNode raiseNode) { - // Pure types may inherit from: - // - // * pure types, or - // * PyBaseObject_Type, or - // * other builtin or legacy types as long as as they do not - // access the struct layout (e.g. by using HPy_AsStruct or defining - // a deallocator with HPy_tp_destroy). - // - // It would be nice to relax these restrictions or check them here. - // See https://github.com/hpyproject/hpy/issues/169 for details. - assert GraalHPyDef.isValidBuiltinShape(builtinShape); - if (builtinShape == GraalHPyDef.HPyType_BUILTIN_SHAPE_LEGACY && baseIsPure) { - throw raiseNode.raise(TypeError, ErrorMessages.LEG_TYPE_SHOULDNT_INHERIT_MEM_LAYOUT_FROM_PURE_TYPE); - } - } - } - - /** - * Extract the heap type's and the module's name from the name given by the type - * specification.
      - * According to CPython, we need to look for the last {@code '.'} and everything before it - * (which may also contain more dots) is the module name. Everything after it is the type name. - * See also: {@code typeobject.c: PyType_FromSpecWithBases} - */ - @GenerateUncached - @GenerateInline - @GenerateCached(false) - abstract static class HPyTypeSplitNameNode extends Node { - - public abstract TruffleString[] execute(Node inliningTarget, TruffleString tpName); - - @Specialization - static TruffleString[] doGeneric(TruffleString specNameUtf8, - @Cached(inline = false) TruffleString.SwitchEncodingNode switchEncodingNode, - @Cached(inline = false) TruffleString.LastIndexOfCodePointNode indexOfCodepointNode, - @Cached(inline = false) TruffleString.SubstringNode substringNode, - @Cached(inline = false) TruffleString.CodePointLengthNode lengthNode) { - TruffleString specName = switchEncodingNode.execute(specNameUtf8, TS_ENCODING); - int length = lengthNode.execute(specName, TS_ENCODING); - int firstDotIdx = indexOfCodepointNode.execute(specName, '.', length, 0, TS_ENCODING); - if (firstDotIdx > -1) { - TruffleString left = substringNode.execute(specName, 0, firstDotIdx, TS_ENCODING, false); - TruffleString right = substringNode.execute(specName, firstDotIdx + 1, length - firstDotIdx - 1, TS_ENCODING, false); - return new TruffleString[]{left, right}; - } - return new TruffleString[]{null, specName}; - } - } - - @GenerateUncached - @GenerateInline - @GenerateCached(false) - public abstract static class HPyTypeGetNameNode extends Node { - - public static Object executeUncached(GraalHPyContext ctx, Object object) { - return HPyTypeGetNameNodeGen.getUncached().execute(null, ctx, object); - } - - public abstract Object execute(Node inliningTarget, GraalHPyContext ctx, Object object); - - @Specialization(guards = "tpName != null") - static Object doTpName(@SuppressWarnings("unused") GraalHPyContext ctx, @SuppressWarnings("unused") PythonClass clazz, - @Bind("clazz.getTpName()") Object tpName) { - return tpName; - } - - @Specialization(replaces = "doTpName") - static Object doGeneric(Node inliningTarget, GraalHPyContext ctx, Object type, - @Cached GetNameNode getName, - @Cached(parameters = "ctx", inline = false) HPyAsCharPointerNode asCharPointerNode) { - if (type instanceof PythonClass pythonClass && pythonClass.getTpName() != null) { - return pythonClass.getTpName(); - } - TruffleString baseName = getName.execute(inliningTarget, type); - return asCharPointerNode.execute(ctx, baseName, Encoding.UTF_8); - } - } - - @GenerateInline(inlineByDefault = true) - @GenerateCached - @GenerateUncached - @ImportStatic(PGuards.class) - public abstract static class HPyGetNativeSpacePointerNode extends Node { - - public abstract Object execute(Node inliningTarget, Object object); - - public final Object executeCached(Object object) { - return execute(this, object); - } - - public static Object executeUncached(Object object) { - return HPyGetNativeSpacePointerNodeGen.getUncached().execute(null, object); - } - - @Specialization - static Object doPythonObject(PythonObject object) { - return GraalHPyData.getHPyNativeSpace(object); - } - - @Fallback - static Object doOther(Node inliningTarget, @SuppressWarnings("unused") Object object) { - // TODO(fa): this should be a backend-specific value - return PythonContext.get(inliningTarget).getNativeNull(); - } - } - - public abstract static class HPyAttachFunctionTypeNode extends PNodeWithContext { - public abstract Object execute(GraalHPyContext hpyContext, Object pointerObject, LLVMType llvmFunctionType); - - @NeverDefault - public static HPyAttachFunctionTypeNode create() { - PythonLanguage language = PythonLanguage.get(null); - switch (language.getEngineOption(PythonOptions.HPyBackend)) { - case JNI: - if (!PythonImageBuildOptions.WITHOUT_JNI) { - return HPyAttachJNIFunctionTypeNodeGen.create(); - } - throw CompilerDirectives.shouldNotReachHere(); - case LLVM: - return HPyLLVMAttachFunctionTypeNode.UNCACHED; - case NFI: - return HPyAttachNFIFunctionTypeNodeGen.create(); - } - throw CompilerDirectives.shouldNotReachHere(); - } - - public static HPyAttachFunctionTypeNode getUncached() { - PythonLanguage language = PythonLanguage.get(null); - switch (language.getEngineOption(PythonOptions.HPyBackend)) { - case JNI: - if (!PythonImageBuildOptions.WITHOUT_JNI) { - return HPyAttachJNIFunctionTypeNodeGen.getUncached(); - } - throw CompilerDirectives.shouldNotReachHere(); - case LLVM: - return HPyLLVMAttachFunctionTypeNode.UNCACHED; - case NFI: - return HPyAttachNFIFunctionTypeNodeGen.getUncached(); - } - throw CompilerDirectives.shouldNotReachHere(); - } - } - - /** - * This node can be used to attach a function type to a function pointer if the function pointer - * is not executable, i.e., if - * {@code InteropLibrary.getUncached().isExecutable(functionPointer) == false}. This should not - * be necessary if running bitcode because Sulong should then know if a pointer is a function - * pointer but it might be necessary if a library was loaded with NFI since no bitcode is - * available. The node will return a typed function pointer that is then executable. - */ - @GenerateUncached - @GenerateInline(false) - public abstract static class HPyAttachNFIFunctionTypeNode extends HPyAttachFunctionTypeNode { - private static final String J_NFI_LANGUAGE = "nfi"; - - @Specialization(guards = {"isSingleContext()", "llvmFunctionType == cachedType"}, limit = "3") - static Object doCachedSingleContext(@SuppressWarnings("unused") GraalHPyContext hpyContext, Object pointerObject, @SuppressWarnings("unused") LLVMType llvmFunctionType, - @Cached("llvmFunctionType") @SuppressWarnings("unused") LLVMType cachedType, - @Cached("getNFISignature(hpyContext, llvmFunctionType)") Object nfiSignature, - @CachedLibrary("nfiSignature") SignatureLibrary signatureLibrary) { - return signatureLibrary.bind(nfiSignature, pointerObject); - } - - @Specialization(guards = "llvmFunctionType == cachedType", limit = "3", replaces = "doCachedSingleContext") - static Object doCached(@SuppressWarnings("unused") GraalHPyContext hpyContext, Object pointerObject, @SuppressWarnings("unused") LLVMType llvmFunctionType, - @Cached("llvmFunctionType") @SuppressWarnings("unused") LLVMType cachedType, - @Cached("getNFISignatureCallTarget(hpyContext, llvmFunctionType)") CallTarget nfiSignatureCt, - @Shared @CachedLibrary(limit = "1") SignatureLibrary signatureLibrary) { - return signatureLibrary.bind(nfiSignatureCt.call(), pointerObject); - } - - @Specialization(replaces = {"doCachedSingleContext", "doCached"}) - static Object doGeneric(GraalHPyContext hpyContext, Object pointerObject, LLVMType llvmFunctionType, - @Shared @CachedLibrary(limit = "1") SignatureLibrary signatureLibrary) { - return signatureLibrary.bind(getNFISignature(hpyContext, llvmFunctionType), pointerObject); - } - - @TruffleBoundary - static Object getNFISignature(GraalHPyContext hpyContext, LLVMType llvmFunctionType) { - return hpyContext.getContext().getEnv().parseInternal(getNFISignatureSource(llvmFunctionType)).call(); - } - - @TruffleBoundary - static CallTarget getNFISignatureCallTarget(GraalHPyContext hpyContext, LLVMType llvmFunctionType) { - return hpyContext.getContext().getEnv().parseInternal(getNFISignatureSource(llvmFunctionType)); - } - - @TruffleBoundary - static Source getNFISignatureSource(LLVMType llvmFunctionType) { - return Source.newBuilder(J_NFI_LANGUAGE, getNFISignatureSourceString(llvmFunctionType), llvmFunctionType.name()).build(); - } - - private static String getNFISignatureSourceString(LLVMType llvmFunctionType) { - switch (llvmFunctionType) { - case HPyModule_init: - return "(POINTER): POINTER"; - case HPyFunc_noargs: - case HPyFunc_unaryfunc: - case HPyFunc_getiterfunc: - case HPyFunc_iternextfunc: - case HPyFunc_reprfunc: - return "(POINTER, POINTER): POINTER"; - case HPyFunc_binaryfunc: - case HPyFunc_o: - case HPyFunc_getter: - case HPyFunc_getattrfunc: - case HPyFunc_getattrofunc: - return "(POINTER, POINTER, POINTER): POINTER"; - case HPyFunc_varargs: - return "(POINTER, POINTER, POINTER, SINT64): POINTER"; - case HPyFunc_keywords: - return "(POINTER, POINTER, POINTER, SINT64, POINTER): POINTER"; - case HPyFunc_ternaryfunc: - case HPyFunc_descrgetfunc: - return "(POINTER, POINTER, POINTER, POINTER): POINTER"; - case HPyFunc_inquiry: - return "(POINTER, POINTER): SINT32"; - case HPyFunc_lenfunc: - case HPyFunc_hashfunc: - return "(POINTER, POINTER): SINT64"; - case HPyFunc_ssizeargfunc: - return "(POINTER, POINTER, SINT64): POINTER"; - case HPyFunc_ssizessizeargfunc: - return "(POINTER, POINTER, SINT64, SINT64): POINTER"; - case HPyFunc_ssizeobjargproc: - return "(POINTER, POINTER, SINT64, POINTER): SINT32"; - case HPyFunc_initproc: - return "(POINTER, POINTER, POINTER, SINT64, POINTER): SINT32"; - case HPyFunc_ssizessizeobjargproc: - return "(POINTER, POINTER, SINT64, SINT64, POINTER): SINT32"; - case HPyFunc_objobjargproc: - case HPyFunc_setter: - case HPyFunc_descrsetfunc: - case HPyFunc_setattrfunc: - case HPyFunc_setattrofunc: - return "(POINTER, POINTER, POINTER, POINTER): SINT32"; - case HPyFunc_freefunc: - return "(POINTER, POINTER): VOID"; - case HPyFunc_richcmpfunc: - return "(POINTER, POINTER, POINTER, SINT32): POINTER"; - case HPyFunc_objobjproc: - return "(POINTER, POINTER, POINTER): SINT32"; - case HPyFunc_getbufferproc: - return "(POINTER, POINTER, POINTER, SINT32): SINT32"; - case HPyFunc_releasebufferproc: - return "(POINTER, POINTER, POINTER): VOID"; - case HPyFunc_traverseproc: - return "(POINTER, POINTER, POINTER): SINT32"; - case HPyFunc_destroyfunc: - return "(POINTER): VOID"; - } - throw CompilerDirectives.shouldNotReachHere(); - } - } - - /** - */ - @GenerateUncached - @GenerateInline(false) - public abstract static class HPyAttachJNIFunctionTypeNode extends HPyAttachFunctionTypeNode { - - @Specialization - static GraalHPyJNIFunctionPointer doLong(GraalHPyContext hpyContext, long pointer, LLVMType llvmFunctionType) { - return new GraalHPyJNIFunctionPointer(pointer, llvmFunctionType, hpyContext.getCurrentMode()); - } - - @Specialization - static GraalHPyJNIFunctionPointer doGeneric(GraalHPyContext hpyContext, Object pointerObject, LLVMType llvmFunctionType, - @CachedLibrary(limit = "1") InteropLibrary interopLibrary) { - long pointer; - if (pointerObject instanceof Long pointerLong) { - pointer = pointerLong; - } else { - if (!interopLibrary.isPointer(pointerObject)) { - interopLibrary.toNative(pointerObject); - } - try { - pointer = interopLibrary.asPointer(pointerObject); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } - return new GraalHPyJNIFunctionPointer(pointer, llvmFunctionType, hpyContext.getCurrentMode()); - } - } - - public static final class HPyLLVMAttachFunctionTypeNode extends HPyAttachFunctionTypeNode { - - private static final HPyLLVMAttachFunctionTypeNode UNCACHED = new HPyLLVMAttachFunctionTypeNode(); - - @Override - public Object execute(GraalHPyContext hpyContext, Object pointerObject, LLVMType llvmFunctionType) { - assert InteropLibrary.getUncached().isExecutable(pointerObject); - return pointerObject; - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - protected static Object callBuiltinFunction(GraalHPyContext graalHPyContext, TruffleString func, Object[] pythonArguments, - ReadAttributeFromObjectNode readAttr, - CallNode callNode) { - Object builtinFunction = readAttr.execute(graalHPyContext.getContext().getBuiltins(), func); - return callNode.executeWithoutFrame(builtinFunction, pythonArguments, PKeyword.EMPTY_KEYWORDS); - } - - @ImportStatic(PGuards.class) - @GenerateUncached - @GenerateInline(false) // footprint reduction 60 -> 41 - public abstract static class RecursiveExceptionMatches extends Node { - abstract int execute(GraalHPyContext context, Object err, Object exc); - - @Specialization - static int tuple(GraalHPyContext context, Object err, PTuple exc, - @Bind("this") Node inliningTarget, - @Shared @Cached RecursiveExceptionMatches recExcMatch, - @Exclusive @Cached PyObjectGetItem getItemNode, - @Exclusive @Cached InlinedLoopConditionProfile loopProfile) { - int len = exc.getSequenceStorage().length(); - for (int i = 0; loopProfile.profile(inliningTarget, i < len); i++) { - Object e = getItemNode.execute(null, inliningTarget, exc, i); - if (recExcMatch.execute(context, err, e) != 0) { - return 1; - } - } - return 0; - } - - @Specialization(guards = {"!isPTuple(exc)", "isTupleSubtype(inliningTarget, exc, getClassNode, isSubtypeNode)"}, limit = "1") - static int subtuple(GraalHPyContext context, Object err, Object exc, - @Bind("this") Node inliningTarget, - @Shared @Cached RecursiveExceptionMatches recExcMatch, - @SuppressWarnings("unused") @Exclusive @Cached GetClassNode getClassNode, - @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Shared @Cached ReadAttributeFromObjectNode readAttr, - @Shared @Cached CallNode callNode, - @Cached CastToJavaIntExactNode cast, - @Exclusive @Cached PyObjectGetItem getItemNode, - @Exclusive @Cached InlinedLoopConditionProfile loopProfile) { - int len = cast.execute(inliningTarget, callBuiltinFunction(context, BuiltinNames.T_LEN, new Object[]{exc}, readAttr, callNode)); - for (int i = 0; loopProfile.profile(inliningTarget, i < len); i++) { - Object e = getItemNode.execute(null, inliningTarget, exc, i); - if (recExcMatch.execute(context, err, e) != 0) { - return 1; - } - } - return 0; - } - - @Specialization(guards = {"!isPTuple(exc)", "!isTupleSubtype(inliningTarget, exc, getClassNode, isSubtypeNode)"}, limit = "1") - static int others(GraalHPyContext context, Object err, Object exc, - @Bind("this") Node inliningTarget, - @Exclusive @Cached GetClassNode getClassNode, - @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtypeNode, - @Shared @Cached ReadAttributeFromObjectNode readAttr, - @Shared @Cached CallNode callNode, - @Cached PyObjectIsTrueNode isTrueNode, - @Cached IsTypeNode isTypeNode, - @Cached IsNode isNode, - @Cached InlinedBranchProfile isBaseExceptionProfile, - @Cached InlinedConditionProfile isExceptionProfile) { - Object isInstance = callBuiltinFunction(context, - BuiltinNames.T_ISINSTANCE, - new Object[]{err, PythonBuiltinClassType.PBaseException}, - readAttr, callNode); - Object e = err; - if (isTrueNode.execute(null, inliningTarget, isInstance)) { - isBaseExceptionProfile.enter(inliningTarget); - e = getClassNode.execute(inliningTarget, err); - } - if (isExceptionProfile.profile(inliningTarget, - isExceptionClass(context, inliningTarget, e, isTypeNode, readAttr, callNode, isTrueNode) && - isExceptionClass(context, inliningTarget, exc, isTypeNode, readAttr, callNode, isTrueNode))) { - return isSubClass(context, inliningTarget, e, exc, readAttr, callNode, isTrueNode) ? 1 : 0; - } else { - return isNode.execute(exc, e) ? 1 : 0; - } - } - - protected boolean isTupleSubtype(Node inliningTarget, Object obj, GetClassNode getClassNode, IsSubtypeNode isSubtypeNode) { - return isSubtypeNode.execute(getClassNode.execute(inliningTarget, obj), PythonBuiltinClassType.PTuple); - } - - static boolean isSubClass(GraalHPyContext graalHPyContext, Node inliningTarget, Object derived, Object cls, - ReadAttributeFromObjectNode readAttr, - CallNode callNode, - PyObjectIsTrueNode isTrueNode) { - return isTrueNode.execute(null, inliningTarget, callBuiltinFunction(graalHPyContext, - BuiltinNames.T_ISSUBCLASS, - new Object[]{derived, cls}, readAttr, callNode)); - - } - - private static boolean isExceptionClass(GraalHPyContext nativeContext, Node inliningTarget, Object obj, - IsTypeNode isTypeNode, - ReadAttributeFromObjectNode readAttr, - CallNode callNode, - PyObjectIsTrueNode isTrueNode) { - return isTypeNode.execute(inliningTarget, obj) && isSubClass(nativeContext, inliningTarget, obj, PythonBuiltinClassType.PBaseException, readAttr, callNode, isTrueNode); - } - } - - @GenerateUncached - @GenerateInline - @GenerateCached(false) - public abstract static class HPyPackKeywordArgsNode extends Node { - - public abstract PKeyword[] execute(Node inliningTarget, Object[] kwvalues, PTuple kwnames, int nkw); - - @Specialization - static PKeyword[] doPTuple(Node inliningTarget, Object[] kwvalues, PTuple kwnames, int nkw, - @Cached SequenceStorageNodes.GetItemScalarNode getItemNode, - @Cached InlinedLoopConditionProfile loopProfile) { - loopProfile.profileCounted(inliningTarget, nkw); - if (nkw == 0) { - return PKeyword.EMPTY_KEYWORDS; - } - PKeyword[] result = new PKeyword[nkw]; - SequenceStorage storage = kwnames.getSequenceStorage(); - for (int i = 0; loopProfile.inject(inliningTarget, i < nkw); i++) { - TruffleString name = (TruffleString) getItemNode.execute(inliningTarget, storage, i); - result[i] = new PKeyword(name, kwvalues[i]); - } - return result; - } - } - - @GenerateUncached - @GenerateInline - @GenerateCached(false) - public abstract static class HPyFieldLoadNode extends Node { - - public abstract Object execute(Node inliningTarget, PythonObject owner, Object hpyFieldPtr); - - @Specialization - static Object doHandle(@SuppressWarnings("unused") PythonObject owner, GraalHPyHandle handle) { - return handle.getDelegate(); - } - - @Specialization(replaces = "doHandle") - static Object doGeneric(Node inliningTarget, PythonObject owner, Object hpyFieldPtr, - @CachedLibrary(limit = "3") InteropLibrary lib, - @Cached InlinedExactClassProfile fieldTypeProfile) { - Object hpyFieldObject = fieldTypeProfile.profile(inliningTarget, hpyFieldPtr); - Object referent; - // avoid `asPointer` message dispatch - if (hpyFieldObject instanceof GraalHPyHandle) { - referent = ((GraalHPyHandle) hpyFieldObject).getDelegate(); - } else { - int idx; - if (hpyFieldObject instanceof Long) { - // branch profile in lib.asPointer - try { - idx = PInt.intValueExact((Long) hpyFieldObject); - } catch (OverflowException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - } else { - try { - idx = PInt.intValueExact(lib.asPointer(hpyFieldObject)); - } catch (InteropException | OverflowException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - } - if (idx == 0) { - return NULL_HANDLE_DELEGATE; - } - referent = GraalHPyData.getHPyField(owner, idx); - } - return referent; - } - } - - @GenerateUncached - @GenerateInline - @GenerateCached(false) - public abstract static class HPyFieldStoreNode extends Node { - - public abstract int execute(Node inliningTarget, PythonObject owner, Object hpyFieldObject, Object referent); - - @Specialization - static int doHandle(Node inliningTarget, @SuppressWarnings("unused") PythonObject owner, GraalHPyHandle hpyFieldObject, Object referent, - @Shared @Cached InlinedConditionProfile nullHandleProfile) { - int idx = hpyFieldObject.getFieldId(); - if (nullHandleProfile.profile(inliningTarget, referent == NULL_HANDLE_DELEGATE && idx == 0)) { - // assigning HPy_NULL to a field that already holds HPy_NULL, nothing to do - return 0; - } else { - return GraalHPyData.setHPyField(owner, referent, idx); - } - } - - @Specialization(replaces = "doHandle") - static int doGeneric(Node inliningTarget, PythonObject owner, Object hpyFieldObject, Object referent, - @CachedLibrary(limit = "3") InteropLibrary lib, - @Shared @Cached InlinedConditionProfile nullHandleProfile) { - int idx; - if (lib.isNull(hpyFieldObject)) { // uninitialized - idx = 0; - } else if (hpyFieldObject instanceof GraalHPyHandle) { - // avoid `asPointer` message dispatch - idx = ((GraalHPyHandle) hpyFieldObject).getFieldId(); - } else { - if (hpyFieldObject instanceof Long) { - // branch profile in lib.asPointer - try { - idx = PInt.intValueExact((Long) hpyFieldObject); - } catch (OverflowException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - } else { - try { - idx = PInt.intValueExact(lib.asPointer(hpyFieldObject)); - } catch (InteropException | OverflowException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - } - } - // TODO: (tfel) do not actually allocate the index / free the existing one when - // value can be stored as tagged handle - if (nullHandleProfile.profile(inliningTarget, referent == NULL_HANDLE_DELEGATE && idx == 0)) { - // assigning HPy_NULL to a field that already holds HPy_NULL, nothing to do - } else { - idx = GraalHPyData.setHPyField(owner, referent, idx); - } - return idx; - } - } - - /** - * Parses an {@code HPyCallFunction} structure and returns the {@code impl} function pointer. A - * {@code NULL} pointer will be translated to Java {@code null}. - * - *
      -     * typedef struct {
      -     *     cpy_vectorcallfunc cpy_trampoline;
      -     *     HPyFunc_keywords impl;
      -     * } HPyCallFunction;
      -     * 
      - */ - @GenerateUncached - @GenerateInline - @GenerateCached(false) - public abstract static class HPyReadCallFunctionNode extends PNodeWithContext { - - public abstract Object execute(Node inliningTarget, GraalHPyContext context, Object def); - - @Specialization - static Object doIt(GraalHPyContext context, Object def, - @Cached(parameters = "context", inline = false) GraalHPyCAccess.ReadPointerNode readPointerNode, - @Cached(parameters = "context", inline = false) GraalHPyCAccess.IsNullNode isNullNode, - @Cached(inline = false) HPyAttachFunctionTypeNode attachFunctionTypeNode) { - // read and check the function pointer - Object methodFunctionPointer = readPointerNode.read(context, def, GraalHPyCField.HPyCallFunction__impl); - if (isNullNode.execute(context, methodFunctionPointer)) { - return null; - } - HPySlotWrapper slotWrapper = HPY_TP_CALL.getSignatures()[0]; - return attachFunctionTypeNode.execute(context, methodFunctionPointer, slotWrapper.getLLVMFunctionType()); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyObjectBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyObjectBuiltins.java deleted file mode 100644 index 574b5642a3..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyObjectBuiltins.java +++ /dev/null @@ -1,303 +0,0 @@ -/* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import static com.oracle.graal.python.util.PythonUtils.tsArray; -import static com.oracle.graal.python.util.PythonUtils.tsLiteral; - -import java.util.logging.Level; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.cext.common.CExtContext; -import com.oracle.graal.python.builtins.objects.floats.PFloat; -import com.oracle.graal.python.builtins.objects.function.PArguments; -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.function.PKeyword; -import com.oracle.graal.python.builtins.objects.function.Signature; -import com.oracle.graal.python.builtins.objects.ints.PInt; -import com.oracle.graal.python.builtins.objects.list.PList; -import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.graal.python.builtins.objects.str.PString; -import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.type.PythonClass; -import com.oracle.graal.python.nodes.PRootNode; -import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.nodes.argument.ReadIndexedArgumentNode; -import com.oracle.graal.python.nodes.argument.ReadVarArgsNode; -import com.oracle.graal.python.nodes.argument.ReadVarKeywordsNode; -import com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode; -import com.oracle.graal.python.runtime.ExecutionContext.CalleeContext; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.RootCallTarget; -import com.oracle.truffle.api.TruffleLogger; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.strings.TruffleString; - -public abstract class GraalHPyObjectBuiltins { - - public static final class HPyObjectNewNode extends PRootNode { - private static final TruffleString KW_SUPERCONS = tsLiteral("$supercons"); - private static final TruffleString[] KEYWORDS_HIDDEN_SUPERCONS = {KW_SUPERCONS}; - - private static final Signature SIGNATURE = new Signature(-1, true, 1, false, tsArray("self"), KEYWORDS_HIDDEN_SUPERCONS, false); - - private static final TruffleLogger LOGGER = GraalHPyContext.getLogger(HPyObjectNewNode.class); - - private static PKeyword[] createKwDefaults(Object superConstructor) { - if (superConstructor != null) { - return new PKeyword[]{new PKeyword(KW_SUPERCONS, superConstructor)}; - } - return PKeyword.EMPTY_KEYWORDS; - } - - @Child private CalleeContext calleeContext; - @Child private ReadIndexedArgumentNode readSelfNode; - @Child private ReadVarArgsNode readVarargsNode; - @Child private ReadVarKeywordsNode readKwargsNode; - @Child private ReadIndexedArgumentNode readCallableNode; - @Child private GraalHPyCAccess.AllocateNode allocateNode; - @Child private CallVarargsMethodNode callNewNode; - - private final int builtinShape; - - private HPyObjectNewNode(PythonLanguage language, int builtinShape) { - super(language); - this.builtinShape = builtinShape; - } - - @Override - public Object execute(VirtualFrame frame) { - getCalleeContext().enter(frame); - try { - return doCall(frame, getSuperConstructor(frame), getSelf(frame), getVarargs(frame), getKwargs(frame)); - } finally { - getCalleeContext().exit(frame, this); - } - } - - private Object doCall(VirtualFrame frame, Object superConstructor, Object explicitSelf, Object[] arguments, PKeyword[] keywords) { - assert explicitSelf != null; - - // create the managed Python object - - // delegate to the best base's constructor - Object self; - Object[] argsWithSelf; - if (explicitSelf == PNone.NO_VALUE) { - argsWithSelf = arguments; - self = argsWithSelf[0]; - } else { - argsWithSelf = new Object[arguments.length + 1]; - argsWithSelf[0] = explicitSelf; - PythonUtils.arraycopy(arguments, 0, argsWithSelf, 1, arguments.length); - self = explicitSelf; - } - PythonContext context = PythonContext.get(this); - Object dataPtr = null; - Object defaultCallFunction = null; - if (self instanceof PythonClass pythonClass) { - // allocate native space - long basicSize = pythonClass.getBasicSize(); - if (basicSize > 0) { - /* - * This is just calling 'calloc' which is a pure helper function. Therefore, we - * can take any HPy context and don't need to attach a context to this __new__ - * function for that since the helper function won't deal with handles. - */ - GraalHPyContext hpyContext = context.getHPyContext(); - dataPtr = ensureAllocateNode(hpyContext).calloc(hpyContext, 1L, basicSize); - - if (LOGGER.isLoggable(Level.FINEST)) { - LOGGER.finest(PythonUtils.formatJString("Allocated HPy object with native space of size %d at %s", basicSize, dataPtr)); - } - } - - defaultCallFunction = pythonClass.getHPyDefaultCallFunc(); - } - - Object result = ensureCallNewNode().execute(frame, superConstructor, argsWithSelf, keywords); - assert validateSuperConstructorResult(result, builtinShape); - - /* - * Since we are creating an object with an unknown constructor, the Java type may be - * anything (e.g. PInt, etc). However, we require it to be a PythonObject otherwise we - * don't know where to store the native data pointer. - */ - if (result instanceof PythonObject pythonObject) { - if (dataPtr != null) { - GraalHPyData.setHPyNativeSpace(pythonObject, dataPtr); - } - if (defaultCallFunction != null) { - GraalHPyData.setHPyCallFunction(pythonObject, defaultCallFunction); - } - } else { - assert false : "inherited constructor of HPy type did not create a managed Python object"; - } - return result; - } - - private static boolean validateSuperConstructorResult(Object result, int builtinShape) { - return switch (builtinShape) { - case GraalHPyDef.HPyType_BUILTIN_SHAPE_LEGACY, GraalHPyDef.HPyType_BUILTIN_SHAPE_OBJECT -> result instanceof PythonObject; - case GraalHPyDef.HPyType_BUILTIN_SHAPE_TYPE -> result instanceof PythonClass; - case GraalHPyDef.HPyType_BUILTIN_SHAPE_LONG -> result instanceof PInt; - case GraalHPyDef.HPyType_BUILTIN_SHAPE_FLOAT -> result instanceof PFloat; - case GraalHPyDef.HPyType_BUILTIN_SHAPE_UNICODE -> result instanceof PString; - case GraalHPyDef.HPyType_BUILTIN_SHAPE_TUPLE -> result instanceof PTuple; - case GraalHPyDef.HPyType_BUILTIN_SHAPE_LIST -> result instanceof PList; - default -> false; - }; - } - - private Object getSelf(VirtualFrame frame) { - if (readSelfNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readSelfNode = insert(ReadIndexedArgumentNode.create(0)); - } - return readSelfNode.execute(frame); - } - - private Object[] getVarargs(VirtualFrame frame) { - if (readVarargsNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readVarargsNode = insert(ReadVarArgsNode.create(true)); - } - return readVarargsNode.executeObjectArray(frame); - } - - private PKeyword[] getKwargs(VirtualFrame frame) { - if (PArguments.getKeywordArguments(frame).length == 0) { - return PKeyword.EMPTY_KEYWORDS; - } - if (readKwargsNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readKwargsNode = insert(ReadVarKeywordsNode.create()); - } - return (PKeyword[]) readKwargsNode.execute(frame); - } - - private Object getSuperConstructor(VirtualFrame frame) { - if (readCallableNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - // we insert a hidden argument at the end of the positional arguments - int hiddenArg = getSignature().getParameterIds().length; - readCallableNode = insert(ReadIndexedArgumentNode.create(hiddenArg)); - } - return readCallableNode.execute(frame); - } - - private CalleeContext getCalleeContext() { - if (calleeContext == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - calleeContext = insert(CalleeContext.create()); - } - return calleeContext; - } - - private static Object extractInheritedConstructor(PythonContext context, PKeyword[] keywords) { - for (int i = 0; i < keywords.length; i++) { - if (keywords[i].getName() == KW_SUPERCONS) { - return keywords[i].getValue(); - } - } - return context.lookupType(PythonBuiltinClassType.PythonObject).getAttribute(SpecialMethodNames.T___NEW__); - } - - private GraalHPyCAccess.AllocateNode ensureAllocateNode(GraalHPyContext ctx) { - if (allocateNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - allocateNode = insert(GraalHPyCAccess.AllocateNode.create(ctx)); - } - return allocateNode; - } - - private CallVarargsMethodNode ensureCallNewNode() { - if (callNewNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - callNewNode = insert(CallVarargsMethodNode.create()); - } - return callNewNode; - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - - @Override - public boolean isPythonInternal() { - return true; - } - - @Override - public boolean setsUpCalleeContext() { - return true; - } - - @TruffleBoundary - public static PBuiltinFunction createBuiltinFunction(PythonLanguage language, Object superConstructor, int builtinShape) { - // do not decorate the decorator - if (superConstructor instanceof PBuiltinFunction builtinFunction && isHPyObjectNewDecorator(builtinFunction)) { - return builtinFunction; - } - RootCallTarget callTarget = language.createCachedCallTarget(l -> new HPyObjectNewNode(language, builtinShape), HPyObjectNewNode.class, builtinShape); - int flags = CExtContext.METH_KEYWORDS | CExtContext.METH_VARARGS; - return PythonObjectFactory.getUncached().createBuiltinFunction(SpecialMethodNames.T___NEW__, null, PythonUtils.EMPTY_OBJECT_ARRAY, createKwDefaults(superConstructor), flags, callTarget); - } - - public static Object getDecoratedSuperConstructor(PBuiltinFunction builtinFunction) { - if (isHPyObjectNewDecorator(builtinFunction)) { - return extractInheritedConstructor(PythonContext.get(null), builtinFunction.getKwDefaults()); - } - return null; - } - - private static boolean isHPyObjectNewDecorator(PBuiltinFunction builtinFunction) { - return builtinFunction.getFunctionRootNode() instanceof HPyObjectNewNode; - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPySourceKind.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPySourceKind.java deleted file mode 100644 index 15ea21df24..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPySourceKind.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import com.oracle.graal.python.nodes.StringLiterals; -import com.oracle.truffle.api.strings.TruffleString; - -public enum GraalHPySourceKind { - EXPR(0, StringLiterals.T_EVAL), - FILE(1, StringLiterals.T_EXEC), - SINGLE(2, StringLiterals.T_SINGLE); - - private final int value; - private final TruffleString mode; - - GraalHPySourceKind(int value, TruffleString mode) { - this.value = value; - this.mode = mode; - } - - public int getValue() { - return value; - } - - public TruffleString getMode() { - return mode; - } - - public static GraalHPySourceKind fromValue(int value) { - return switch (value) { - case 0 -> EXPR; - case 1 -> FILE; - case 2 -> SINGLE; - default -> null; - }; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyTracker.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyTracker.java deleted file mode 100644 index 2f151bdeb5..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/GraalHPyTracker.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import java.util.Arrays; - -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyCloseHandleNode; -import com.oracle.graal.python.util.OverflowException; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.nodes.Node; - -public final class GraalHPyTracker { - private static final int HPYTRACKER_INITIAL_SIZE = 5; - - private GraalHPyHandle[] handles; - private int cursor; - - public GraalHPyTracker(int capacity) { - int size = capacity == 0 ? HPYTRACKER_INITIAL_SIZE : capacity; - this.handles = new GraalHPyHandle[size]; - } - - public void add(GraalHPyHandle h) throws OverflowException { - handles[cursor++] = h; - if (handles.length <= cursor) { - resize(); - } - } - - @TruffleBoundary - private void resize() throws OverflowException { - handles = Arrays.copyOf(handles, PythonUtils.multiplyExact(handles.length, 2) - 1); - } - - public void free(Node inliningTarget, HPyCloseHandleNode closeHandleNode) { - assert cursor <= handles.length; - for (int i = 0; i < cursor; i++) { - closeHandleNode.execute(inliningTarget, handles[i]); - } - cursor = 0; - } - - public void removeAll() { - for (int i = 0; i < handles.length; i++) { - handles[i] = null; - } - cursor = 0; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyContextMember.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyContextMember.java deleted file mode 100644 index 28dcf99fc7..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyContextMember.java +++ /dev/null @@ -1,387 +0,0 @@ -/* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Bool; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.CDouble; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.CVoid; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.ConstCharPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.ConstHPyPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.ConstWchar_tPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Cpy_PyObjectPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPy; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPyCallFunctionPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPyCapsule_DestructorPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPyContextPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPyField; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPyFieldPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPyGlobal; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPyGlobalPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPyListBuilder; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPyPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPyThreadState; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPyTracker; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPyTupleBuilder; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPyType_BuiltinShape; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPyType_SpecParamPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPyType_SpecPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPy_SourceKind; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPy_UCS4; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPy_hash_t; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPy_ssize_t; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.HPy_ssize_tPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Int; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Int32_t; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Int64_t; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Size_t; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Uint32_t; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.Uint64_t; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.VoidPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType.VoidPtrPtr; -import static com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType._HPyCapsule_key; - -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.HPyUpcall; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; - -/** - * An enum of all fields currently available in the HPy context (see {@code public_api.h}). - */ -public enum HPyContextMember implements HPyUpcall { - NAME("name"), - PRIVATE("_private"), - ABI_VERSION("abi_version"), - - // {{start ctx members}} - // @formatter:off - // Checkstyle: stop - // DO NOT EDIT THIS PART! - // This part is automatically generated by hpy.tools.autogen.graalpy.autogen_ctx_member_enum - H_NONE("h_None"), - H_TRUE("h_True"), - H_FALSE("h_False"), - H_NOTIMPLEMENTED("h_NotImplemented"), - H_ELLIPSIS("h_Ellipsis"), - H_BASEEXCEPTION("h_BaseException"), - H_EXCEPTION("h_Exception"), - H_STOPASYNCITERATION("h_StopAsyncIteration"), - H_STOPITERATION("h_StopIteration"), - H_GENERATOREXIT("h_GeneratorExit"), - H_ARITHMETICERROR("h_ArithmeticError"), - H_LOOKUPERROR("h_LookupError"), - H_ASSERTIONERROR("h_AssertionError"), - H_ATTRIBUTEERROR("h_AttributeError"), - H_BUFFERERROR("h_BufferError"), - H_EOFERROR("h_EOFError"), - H_FLOATINGPOINTERROR("h_FloatingPointError"), - H_OSERROR("h_OSError"), - H_IMPORTERROR("h_ImportError"), - H_MODULENOTFOUNDERROR("h_ModuleNotFoundError"), - H_INDEXERROR("h_IndexError"), - H_KEYERROR("h_KeyError"), - H_KEYBOARDINTERRUPT("h_KeyboardInterrupt"), - H_MEMORYERROR("h_MemoryError"), - H_NAMEERROR("h_NameError"), - H_OVERFLOWERROR("h_OverflowError"), - H_RUNTIMEERROR("h_RuntimeError"), - H_RECURSIONERROR("h_RecursionError"), - H_NOTIMPLEMENTEDERROR("h_NotImplementedError"), - H_SYNTAXERROR("h_SyntaxError"), - H_INDENTATIONERROR("h_IndentationError"), - H_TABERROR("h_TabError"), - H_REFERENCEERROR("h_ReferenceError"), - H_SYSTEMERROR("h_SystemError"), - H_SYSTEMEXIT("h_SystemExit"), - H_TYPEERROR("h_TypeError"), - H_UNBOUNDLOCALERROR("h_UnboundLocalError"), - H_UNICODEERROR("h_UnicodeError"), - H_UNICODEENCODEERROR("h_UnicodeEncodeError"), - H_UNICODEDECODEERROR("h_UnicodeDecodeError"), - H_UNICODETRANSLATEERROR("h_UnicodeTranslateError"), - H_VALUEERROR("h_ValueError"), - H_ZERODIVISIONERROR("h_ZeroDivisionError"), - H_BLOCKINGIOERROR("h_BlockingIOError"), - H_BROKENPIPEERROR("h_BrokenPipeError"), - H_CHILDPROCESSERROR("h_ChildProcessError"), - H_CONNECTIONERROR("h_ConnectionError"), - H_CONNECTIONABORTEDERROR("h_ConnectionAbortedError"), - H_CONNECTIONREFUSEDERROR("h_ConnectionRefusedError"), - H_CONNECTIONRESETERROR("h_ConnectionResetError"), - H_FILEEXISTSERROR("h_FileExistsError"), - H_FILENOTFOUNDERROR("h_FileNotFoundError"), - H_INTERRUPTEDERROR("h_InterruptedError"), - H_ISADIRECTORYERROR("h_IsADirectoryError"), - H_NOTADIRECTORYERROR("h_NotADirectoryError"), - H_PERMISSIONERROR("h_PermissionError"), - H_PROCESSLOOKUPERROR("h_ProcessLookupError"), - H_TIMEOUTERROR("h_TimeoutError"), - H_WARNING("h_Warning"), - H_USERWARNING("h_UserWarning"), - H_DEPRECATIONWARNING("h_DeprecationWarning"), - H_PENDINGDEPRECATIONWARNING("h_PendingDeprecationWarning"), - H_SYNTAXWARNING("h_SyntaxWarning"), - H_RUNTIMEWARNING("h_RuntimeWarning"), - H_FUTUREWARNING("h_FutureWarning"), - H_IMPORTWARNING("h_ImportWarning"), - H_UNICODEWARNING("h_UnicodeWarning"), - H_BYTESWARNING("h_BytesWarning"), - H_RESOURCEWARNING("h_ResourceWarning"), - H_BASEOBJECTTYPE("h_BaseObjectType"), - H_TYPETYPE("h_TypeType"), - H_BOOLTYPE("h_BoolType"), - H_LONGTYPE("h_LongType"), - H_FLOATTYPE("h_FloatType"), - H_UNICODETYPE("h_UnicodeType"), - H_TUPLETYPE("h_TupleType"), - H_LISTTYPE("h_ListType"), - H_COMPLEXTYPE("h_ComplexType"), - H_BYTESTYPE("h_BytesType"), - H_MEMORYVIEWTYPE("h_MemoryViewType"), - H_CAPSULETYPE("h_CapsuleType"), - H_SLICETYPE("h_SliceType"), - H_BUILTINS("h_Builtins"), - CTX_DUP("ctx_Dup", HPy, HPyContextPtr, HPy), - CTX_CLOSE("ctx_Close", CVoid, HPyContextPtr, HPy), - CTX_LONG_FROMINT32_T("ctx_Long_FromInt32_t", HPy, HPyContextPtr, Int32_t), - CTX_LONG_FROMUINT32_T("ctx_Long_FromUInt32_t", HPy, HPyContextPtr, Uint32_t), - CTX_LONG_FROMINT64_T("ctx_Long_FromInt64_t", HPy, HPyContextPtr, Int64_t), - CTX_LONG_FROMUINT64_T("ctx_Long_FromUInt64_t", HPy, HPyContextPtr, Uint64_t), - CTX_LONG_FROMSIZE_T("ctx_Long_FromSize_t", HPy, HPyContextPtr, Size_t), - CTX_LONG_FROMSSIZE_T("ctx_Long_FromSsize_t", HPy, HPyContextPtr, HPy_ssize_t), - CTX_LONG_ASINT32_T("ctx_Long_AsInt32_t", Int32_t, HPyContextPtr, HPy), - CTX_LONG_ASUINT32_T("ctx_Long_AsUInt32_t", Uint32_t, HPyContextPtr, HPy), - CTX_LONG_ASUINT32_TMASK("ctx_Long_AsUInt32_tMask", Uint32_t, HPyContextPtr, HPy), - CTX_LONG_ASINT64_T("ctx_Long_AsInt64_t", Int64_t, HPyContextPtr, HPy), - CTX_LONG_ASUINT64_T("ctx_Long_AsUInt64_t", Uint64_t, HPyContextPtr, HPy), - CTX_LONG_ASUINT64_TMASK("ctx_Long_AsUInt64_tMask", Uint64_t, HPyContextPtr, HPy), - CTX_LONG_ASSIZE_T("ctx_Long_AsSize_t", Size_t, HPyContextPtr, HPy), - CTX_LONG_ASSSIZE_T("ctx_Long_AsSsize_t", HPy_ssize_t, HPyContextPtr, HPy), - CTX_LONG_ASVOIDPTR("ctx_Long_AsVoidPtr", VoidPtr, HPyContextPtr, HPy), - CTX_LONG_ASDOUBLE("ctx_Long_AsDouble", CDouble, HPyContextPtr, HPy), - CTX_FLOAT_FROMDOUBLE("ctx_Float_FromDouble", HPy, HPyContextPtr, CDouble), - CTX_FLOAT_ASDOUBLE("ctx_Float_AsDouble", CDouble, HPyContextPtr, HPy), - CTX_BOOL_FROMBOOL("ctx_Bool_FromBool", HPy, HPyContextPtr, Bool), - CTX_LENGTH("ctx_Length", HPy_ssize_t, HPyContextPtr, HPy), - CTX_NUMBER_CHECK("ctx_Number_Check", Int, HPyContextPtr, HPy), - CTX_ADD("ctx_Add", HPy, HPyContextPtr, HPy, HPy), - CTX_SUBTRACT("ctx_Subtract", HPy, HPyContextPtr, HPy, HPy), - CTX_MULTIPLY("ctx_Multiply", HPy, HPyContextPtr, HPy, HPy), - CTX_MATRIXMULTIPLY("ctx_MatrixMultiply", HPy, HPyContextPtr, HPy, HPy), - CTX_FLOORDIVIDE("ctx_FloorDivide", HPy, HPyContextPtr, HPy, HPy), - CTX_TRUEDIVIDE("ctx_TrueDivide", HPy, HPyContextPtr, HPy, HPy), - CTX_REMAINDER("ctx_Remainder", HPy, HPyContextPtr, HPy, HPy), - CTX_DIVMOD("ctx_Divmod", HPy, HPyContextPtr, HPy, HPy), - CTX_POWER("ctx_Power", HPy, HPyContextPtr, HPy, HPy, HPy), - CTX_NEGATIVE("ctx_Negative", HPy, HPyContextPtr, HPy), - CTX_POSITIVE("ctx_Positive", HPy, HPyContextPtr, HPy), - CTX_ABSOLUTE("ctx_Absolute", HPy, HPyContextPtr, HPy), - CTX_INVERT("ctx_Invert", HPy, HPyContextPtr, HPy), - CTX_LSHIFT("ctx_Lshift", HPy, HPyContextPtr, HPy, HPy), - CTX_RSHIFT("ctx_Rshift", HPy, HPyContextPtr, HPy, HPy), - CTX_AND("ctx_And", HPy, HPyContextPtr, HPy, HPy), - CTX_XOR("ctx_Xor", HPy, HPyContextPtr, HPy, HPy), - CTX_OR("ctx_Or", HPy, HPyContextPtr, HPy, HPy), - CTX_INDEX("ctx_Index", HPy, HPyContextPtr, HPy), - CTX_LONG("ctx_Long", HPy, HPyContextPtr, HPy), - CTX_FLOAT("ctx_Float", HPy, HPyContextPtr, HPy), - CTX_INPLACEADD("ctx_InPlaceAdd", HPy, HPyContextPtr, HPy, HPy), - CTX_INPLACESUBTRACT("ctx_InPlaceSubtract", HPy, HPyContextPtr, HPy, HPy), - CTX_INPLACEMULTIPLY("ctx_InPlaceMultiply", HPy, HPyContextPtr, HPy, HPy), - CTX_INPLACEMATRIXMULTIPLY("ctx_InPlaceMatrixMultiply", HPy, HPyContextPtr, HPy, HPy), - CTX_INPLACEFLOORDIVIDE("ctx_InPlaceFloorDivide", HPy, HPyContextPtr, HPy, HPy), - CTX_INPLACETRUEDIVIDE("ctx_InPlaceTrueDivide", HPy, HPyContextPtr, HPy, HPy), - CTX_INPLACEREMAINDER("ctx_InPlaceRemainder", HPy, HPyContextPtr, HPy, HPy), - CTX_INPLACEPOWER("ctx_InPlacePower", HPy, HPyContextPtr, HPy, HPy, HPy), - CTX_INPLACELSHIFT("ctx_InPlaceLshift", HPy, HPyContextPtr, HPy, HPy), - CTX_INPLACERSHIFT("ctx_InPlaceRshift", HPy, HPyContextPtr, HPy, HPy), - CTX_INPLACEAND("ctx_InPlaceAnd", HPy, HPyContextPtr, HPy, HPy), - CTX_INPLACEXOR("ctx_InPlaceXor", HPy, HPyContextPtr, HPy, HPy), - CTX_INPLACEOR("ctx_InPlaceOr", HPy, HPyContextPtr, HPy, HPy), - CTX_CALLABLE_CHECK("ctx_Callable_Check", Int, HPyContextPtr, HPy), - CTX_CALLTUPLEDICT("ctx_CallTupleDict", HPy, HPyContextPtr, HPy, HPy, HPy), - CTX_CALL("ctx_Call", HPy, HPyContextPtr, HPy, ConstHPyPtr, Size_t, HPy), - CTX_CALLMETHOD("ctx_CallMethod", HPy, HPyContextPtr, HPy, ConstHPyPtr, Size_t, HPy), - CTX_FATALERROR("ctx_FatalError", CVoid, HPyContextPtr, ConstCharPtr), - CTX_ERR_SETSTRING("ctx_Err_SetString", CVoid, HPyContextPtr, HPy, ConstCharPtr), - CTX_ERR_SETOBJECT("ctx_Err_SetObject", CVoid, HPyContextPtr, HPy, HPy), - CTX_ERR_SETFROMERRNOWITHFILENAME("ctx_Err_SetFromErrnoWithFilename", HPy, HPyContextPtr, HPy, ConstCharPtr), - CTX_ERR_SETFROMERRNOWITHFILENAMEOBJECTS("ctx_Err_SetFromErrnoWithFilenameObjects", CVoid, HPyContextPtr, HPy, HPy, HPy), - CTX_ERR_OCCURRED("ctx_Err_Occurred", Int, HPyContextPtr), - CTX_ERR_EXCEPTIONMATCHES("ctx_Err_ExceptionMatches", Int, HPyContextPtr, HPy), - CTX_ERR_NOMEMORY("ctx_Err_NoMemory", CVoid, HPyContextPtr), - CTX_ERR_CLEAR("ctx_Err_Clear", CVoid, HPyContextPtr), - CTX_ERR_NEWEXCEPTION("ctx_Err_NewException", HPy, HPyContextPtr, ConstCharPtr, HPy, HPy), - CTX_ERR_NEWEXCEPTIONWITHDOC("ctx_Err_NewExceptionWithDoc", HPy, HPyContextPtr, ConstCharPtr, ConstCharPtr, HPy, HPy), - CTX_ERR_WARNEX("ctx_Err_WarnEx", Int, HPyContextPtr, HPy, ConstCharPtr, HPy_ssize_t), - CTX_ERR_WRITEUNRAISABLE("ctx_Err_WriteUnraisable", CVoid, HPyContextPtr, HPy), - CTX_ISTRUE("ctx_IsTrue", Int, HPyContextPtr, HPy), - CTX_TYPE_FROMSPEC("ctx_Type_FromSpec", HPy, HPyContextPtr, HPyType_SpecPtr, HPyType_SpecParamPtr), - CTX_TYPE_GENERICNEW("ctx_Type_GenericNew", HPy, HPyContextPtr, HPy, ConstHPyPtr, HPy_ssize_t, HPy), - CTX_GETATTR("ctx_GetAttr", HPy, HPyContextPtr, HPy, HPy), - CTX_GETATTR_S("ctx_GetAttr_s", HPy, HPyContextPtr, HPy, ConstCharPtr), - CTX_HASATTR("ctx_HasAttr", Int, HPyContextPtr, HPy, HPy), - CTX_HASATTR_S("ctx_HasAttr_s", Int, HPyContextPtr, HPy, ConstCharPtr), - CTX_SETATTR("ctx_SetAttr", Int, HPyContextPtr, HPy, HPy, HPy), - CTX_SETATTR_S("ctx_SetAttr_s", Int, HPyContextPtr, HPy, ConstCharPtr, HPy), - CTX_GETITEM("ctx_GetItem", HPy, HPyContextPtr, HPy, HPy), - CTX_GETITEM_I("ctx_GetItem_i", HPy, HPyContextPtr, HPy, HPy_ssize_t), - CTX_GETITEM_S("ctx_GetItem_s", HPy, HPyContextPtr, HPy, ConstCharPtr), - CTX_CONTAINS("ctx_Contains", Int, HPyContextPtr, HPy, HPy), - CTX_SETITEM("ctx_SetItem", Int, HPyContextPtr, HPy, HPy, HPy), - CTX_SETITEM_I("ctx_SetItem_i", Int, HPyContextPtr, HPy, HPy_ssize_t, HPy), - CTX_SETITEM_S("ctx_SetItem_s", Int, HPyContextPtr, HPy, ConstCharPtr, HPy), - CTX_DELITEM("ctx_DelItem", Int, HPyContextPtr, HPy, HPy), - CTX_DELITEM_I("ctx_DelItem_i", Int, HPyContextPtr, HPy, HPy_ssize_t), - CTX_DELITEM_S("ctx_DelItem_s", Int, HPyContextPtr, HPy, ConstCharPtr), - CTX_TYPE("ctx_Type", HPy, HPyContextPtr, HPy), - CTX_TYPECHECK("ctx_TypeCheck", Int, HPyContextPtr, HPy, HPy), - CTX_TYPE_GETNAME("ctx_Type_GetName", ConstCharPtr, HPyContextPtr, HPy), - CTX_TYPE_ISSUBTYPE("ctx_Type_IsSubtype", Int, HPyContextPtr, HPy, HPy), - CTX_IS("ctx_Is", Int, HPyContextPtr, HPy, HPy), - CTX_ASSTRUCT_OBJECT("ctx_AsStruct_Object", VoidPtr, HPyContextPtr, HPy), - CTX_ASSTRUCT_LEGACY("ctx_AsStruct_Legacy", VoidPtr, HPyContextPtr, HPy), - CTX_ASSTRUCT_TYPE("ctx_AsStruct_Type", VoidPtr, HPyContextPtr, HPy), - CTX_ASSTRUCT_LONG("ctx_AsStruct_Long", VoidPtr, HPyContextPtr, HPy), - CTX_ASSTRUCT_FLOAT("ctx_AsStruct_Float", VoidPtr, HPyContextPtr, HPy), - CTX_ASSTRUCT_UNICODE("ctx_AsStruct_Unicode", VoidPtr, HPyContextPtr, HPy), - CTX_ASSTRUCT_TUPLE("ctx_AsStruct_Tuple", VoidPtr, HPyContextPtr, HPy), - CTX_ASSTRUCT_LIST("ctx_AsStruct_List", VoidPtr, HPyContextPtr, HPy), - CTX_TYPE_GETBUILTINSHAPE("ctx_Type_GetBuiltinShape", HPyType_BuiltinShape, HPyContextPtr, HPy), - CTX_NEW("ctx_New", HPy, HPyContextPtr, HPy, VoidPtrPtr), - CTX_REPR("ctx_Repr", HPy, HPyContextPtr, HPy), - CTX_STR("ctx_Str", HPy, HPyContextPtr, HPy), - CTX_ASCII("ctx_ASCII", HPy, HPyContextPtr, HPy), - CTX_BYTES("ctx_Bytes", HPy, HPyContextPtr, HPy), - CTX_RICHCOMPARE("ctx_RichCompare", HPy, HPyContextPtr, HPy, HPy, Int), - CTX_RICHCOMPAREBOOL("ctx_RichCompareBool", Int, HPyContextPtr, HPy, HPy, Int), - CTX_HASH("ctx_Hash", HPy_hash_t, HPyContextPtr, HPy), - CTX_BYTES_CHECK("ctx_Bytes_Check", Int, HPyContextPtr, HPy), - CTX_BYTES_SIZE("ctx_Bytes_Size", HPy_ssize_t, HPyContextPtr, HPy), - CTX_BYTES_GET_SIZE("ctx_Bytes_GET_SIZE", HPy_ssize_t, HPyContextPtr, HPy), - CTX_BYTES_ASSTRING("ctx_Bytes_AsString", ConstCharPtr, HPyContextPtr, HPy), - CTX_BYTES_AS_STRING("ctx_Bytes_AS_STRING", ConstCharPtr, HPyContextPtr, HPy), - CTX_BYTES_FROMSTRING("ctx_Bytes_FromString", HPy, HPyContextPtr, ConstCharPtr), - CTX_BYTES_FROMSTRINGANDSIZE("ctx_Bytes_FromStringAndSize", HPy, HPyContextPtr, ConstCharPtr, HPy_ssize_t), - CTX_UNICODE_FROMSTRING("ctx_Unicode_FromString", HPy, HPyContextPtr, ConstCharPtr), - CTX_UNICODE_CHECK("ctx_Unicode_Check", Int, HPyContextPtr, HPy), - CTX_UNICODE_ASASCIISTRING("ctx_Unicode_AsASCIIString", HPy, HPyContextPtr, HPy), - CTX_UNICODE_ASLATIN1STRING("ctx_Unicode_AsLatin1String", HPy, HPyContextPtr, HPy), - CTX_UNICODE_ASUTF8STRING("ctx_Unicode_AsUTF8String", HPy, HPyContextPtr, HPy), - CTX_UNICODE_ASUTF8ANDSIZE("ctx_Unicode_AsUTF8AndSize", ConstCharPtr, HPyContextPtr, HPy, HPy_ssize_tPtr), - CTX_UNICODE_FROMWIDECHAR("ctx_Unicode_FromWideChar", HPy, HPyContextPtr, ConstWchar_tPtr, HPy_ssize_t), - CTX_UNICODE_DECODEFSDEFAULT("ctx_Unicode_DecodeFSDefault", HPy, HPyContextPtr, ConstCharPtr), - CTX_UNICODE_DECODEFSDEFAULTANDSIZE("ctx_Unicode_DecodeFSDefaultAndSize", HPy, HPyContextPtr, ConstCharPtr, HPy_ssize_t), - CTX_UNICODE_ENCODEFSDEFAULT("ctx_Unicode_EncodeFSDefault", HPy, HPyContextPtr, HPy), - CTX_UNICODE_READCHAR("ctx_Unicode_ReadChar", HPy_UCS4, HPyContextPtr, HPy, HPy_ssize_t), - CTX_UNICODE_DECODEASCII("ctx_Unicode_DecodeASCII", HPy, HPyContextPtr, ConstCharPtr, HPy_ssize_t, ConstCharPtr), - CTX_UNICODE_DECODELATIN1("ctx_Unicode_DecodeLatin1", HPy, HPyContextPtr, ConstCharPtr, HPy_ssize_t, ConstCharPtr), - CTX_UNICODE_FROMENCODEDOBJECT("ctx_Unicode_FromEncodedObject", HPy, HPyContextPtr, HPy, ConstCharPtr, ConstCharPtr), - CTX_UNICODE_SUBSTRING("ctx_Unicode_Substring", HPy, HPyContextPtr, HPy, HPy_ssize_t, HPy_ssize_t), - CTX_LIST_CHECK("ctx_List_Check", Int, HPyContextPtr, HPy), - CTX_LIST_NEW("ctx_List_New", HPy, HPyContextPtr, HPy_ssize_t), - CTX_LIST_APPEND("ctx_List_Append", Int, HPyContextPtr, HPy, HPy), - CTX_DICT_CHECK("ctx_Dict_Check", Int, HPyContextPtr, HPy), - CTX_DICT_NEW("ctx_Dict_New", HPy, HPyContextPtr), - CTX_DICT_KEYS("ctx_Dict_Keys", HPy, HPyContextPtr, HPy), - CTX_DICT_COPY("ctx_Dict_Copy", HPy, HPyContextPtr, HPy), - CTX_TUPLE_CHECK("ctx_Tuple_Check", Int, HPyContextPtr, HPy), - CTX_TUPLE_FROMARRAY("ctx_Tuple_FromArray", HPy, HPyContextPtr, HPyPtr, HPy_ssize_t), - CTX_SLICE_UNPACK("ctx_Slice_Unpack", Int, HPyContextPtr, HPy, HPy_ssize_tPtr, HPy_ssize_tPtr, HPy_ssize_tPtr), - CTX_IMPORT_IMPORTMODULE("ctx_Import_ImportModule", HPy, HPyContextPtr, ConstCharPtr), - CTX_CAPSULE_NEW("ctx_Capsule_New", HPy, HPyContextPtr, VoidPtr, ConstCharPtr, HPyCapsule_DestructorPtr), - CTX_CAPSULE_GET("ctx_Capsule_Get", VoidPtr, HPyContextPtr, HPy, _HPyCapsule_key, ConstCharPtr), - CTX_CAPSULE_ISVALID("ctx_Capsule_IsValid", Int, HPyContextPtr, HPy, ConstCharPtr), - CTX_CAPSULE_SET("ctx_Capsule_Set", Int, HPyContextPtr, HPy, _HPyCapsule_key, VoidPtr), - CTX_FROMPYOBJECT("ctx_FromPyObject", HPy, HPyContextPtr, Cpy_PyObjectPtr), - CTX_ASPYOBJECT("ctx_AsPyObject", Cpy_PyObjectPtr, HPyContextPtr, HPy), - CTX_LISTBUILDER_NEW("ctx_ListBuilder_New", HPyListBuilder, HPyContextPtr, HPy_ssize_t), - CTX_LISTBUILDER_SET("ctx_ListBuilder_Set", CVoid, HPyContextPtr, HPyListBuilder, HPy_ssize_t, HPy), - CTX_LISTBUILDER_BUILD("ctx_ListBuilder_Build", HPy, HPyContextPtr, HPyListBuilder), - CTX_LISTBUILDER_CANCEL("ctx_ListBuilder_Cancel", CVoid, HPyContextPtr, HPyListBuilder), - CTX_TUPLEBUILDER_NEW("ctx_TupleBuilder_New", HPyTupleBuilder, HPyContextPtr, HPy_ssize_t), - CTX_TUPLEBUILDER_SET("ctx_TupleBuilder_Set", CVoid, HPyContextPtr, HPyTupleBuilder, HPy_ssize_t, HPy), - CTX_TUPLEBUILDER_BUILD("ctx_TupleBuilder_Build", HPy, HPyContextPtr, HPyTupleBuilder), - CTX_TUPLEBUILDER_CANCEL("ctx_TupleBuilder_Cancel", CVoid, HPyContextPtr, HPyTupleBuilder), - CTX_TRACKER_NEW("ctx_Tracker_New", HPyTracker, HPyContextPtr, HPy_ssize_t), - CTX_TRACKER_ADD("ctx_Tracker_Add", Int, HPyContextPtr, HPyTracker, HPy), - CTX_TRACKER_FORGETALL("ctx_Tracker_ForgetAll", CVoid, HPyContextPtr, HPyTracker), - CTX_TRACKER_CLOSE("ctx_Tracker_Close", CVoid, HPyContextPtr, HPyTracker), - CTX_FIELD_STORE("ctx_Field_Store", CVoid, HPyContextPtr, HPy, HPyFieldPtr, HPy), - CTX_FIELD_LOAD("ctx_Field_Load", HPy, HPyContextPtr, HPy, HPyField), - CTX_REENTERPYTHONEXECUTION("ctx_ReenterPythonExecution", CVoid, HPyContextPtr, HPyThreadState), - CTX_LEAVEPYTHONEXECUTION("ctx_LeavePythonExecution", HPyThreadState, HPyContextPtr), - CTX_GLOBAL_STORE("ctx_Global_Store", CVoid, HPyContextPtr, HPyGlobalPtr, HPy), - CTX_GLOBAL_LOAD("ctx_Global_Load", HPy, HPyContextPtr, HPyGlobal), - CTX_DUMP("ctx_Dump", CVoid, HPyContextPtr, HPy), - CTX_COMPILE_S("ctx_Compile_s", HPy, HPyContextPtr, ConstCharPtr, ConstCharPtr, HPy_SourceKind), - CTX_EVALCODE("ctx_EvalCode", HPy, HPyContextPtr, HPy, HPy, HPy), - CTX_CONTEXTVAR_NEW("ctx_ContextVar_New", HPy, HPyContextPtr, ConstCharPtr, HPy), - CTX_CONTEXTVAR_GET("ctx_ContextVar_Get", Int32_t, HPyContextPtr, HPy, HPy, HPyPtr), - CTX_CONTEXTVAR_SET("ctx_ContextVar_Set", HPy, HPyContextPtr, HPy, HPy), - CTX_SETCALLFUNCTION("ctx_SetCallFunction", Int, HPyContextPtr, HPy, HPyCallFunctionPtr); - - // @formatter:on - // Checkstyle: resume - // {{end ctx members}} - - private final String name; - private final HPyContextSignature signature; - - HPyContextMember(String name) { - this.name = name; - this.signature = null; - } - - HPyContextMember(String name, HPyContextSignatureType returnType, HPyContextSignatureType... paramTypes) { - this.name = name; - this.signature = new HPyContextSignature(returnType, paramTypes); - } - - @CompilationFinal(dimensions = 1) public static final HPyContextMember[] VALUES = values(); - - @Override - public String getName() { - return name; - } - - public HPyContextSignature getSignature() { - return signature; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyContextSignature.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyContextSignature.java deleted file mode 100644 index d3e9aa4ab9..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyContextSignature.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -/** - * Describes the signature of an HPyContext function. - */ -public record HPyContextSignature(HPyContextSignatureType returnType, HPyContextSignatureType[] parameterTypes) { -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyContextSignatureType.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyContextSignatureType.java deleted file mode 100644 index 1e4bed20c6..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyContextSignatureType.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -/** - * Describes the type of argument or return type in the HPyContext functions. - */ -public enum HPyContextSignatureType { - HPyContextPtr("HPyContext*", "POINTER", long.class), - CVoid("void", "VOID", void.class), - VoidPtr("void*", "POINTER", long.class), - VoidPtrPtr("void**", "POINTER", long.class), - Bool("bool", "UINT8", boolean.class), - Int("int", null, int.class), - UnsignedInt("unsigned int", null, int.class), - Long("long", null, int.class), - UnsignedLong("unsigned long", "SINT32", int.class), - Int8_t("int8_t", "SINT8", byte.class), - Uint8_t("uint8_t", "UINT8", byte.class), - Int16_t("int16_t", "SINT16", short.class), - Uint16_t("uint16_t", "UINT16", short.class), - Int32_t("int32_t", "SINT32", int.class), - Uint32_t("uint32_t", "UINT32", int.class), - CFloat("float", "FLOAT", float.class), - CDouble("double", "DOUBLE", double.class), - Int64_t("int64_t", "SINT64", int.class), - Uint64_t("uint64_t", "UINT64", int.class), - HPy("HPy", "POINTER", long.class), - HPyPtr("HPy*", "POINTER", long.class), - ConstHPyPtr("const HPy*", "POINTER", long.class), - Wchar_tPtr("wchar_t*", "POINTER", long.class), - ConstWchar_tPtr("const wchar_t*", "POINTER", long.class), - CharPtr("char*", "POINTER", long.class), - ConstCharPtr("const char*", "POINTER", long.class), - DataPtr("void*", "POINTER", long.class), - DataPtrPtr("void**", "POINTER", long.class), - HPyTracker("HPyTracker", "POINTER", long.class), - Size_t("size_t", "UINT64", long.class), - HPy_ssize_t("HPy_ssize_t", "UINT64", long.class), - HPy_ssize_tPtr("HPy_ssize_t*", "POINTER", long.class), - HPy_hash_t("HPy_hash_t", "UINT64", long.class), - HPy_UCS4("HPy_UCS4", "UINT32", int.class), - HPyTupleBuilder("HPyTupleBuilder", "POINTER", long.class), - HPyListBuilder("HPyListBuilder", "POINTER", long.class), - Cpy_PyObjectPtr("cpy_PyObject*", "POINTER", long.class), - Cpy_PyMethodDefPtr("cpy_PyMethodDef*", "POINTER", long.class), - HPyModuleDefPtr("HPyModuleDef*", "POINTER", long.class), - HPyType_SpecPtr("HPyType_Spec*", "POINTER", long.class), - HPyType_SpecParam("HPyType_SpecParam", null, null), - HPyType_SpecParamPtr("HPyType_SpecParam*", "POINTER", long.class), - HPyDefPtr("HPyDef*", "POINTER", long.class), - HPyThreadState("HPyThreadState", "POINTER", long.class), - HPyField("HPyField", "POINTER", long.class), - HPyFieldPtr("HPyField*", "POINTER", long.class), - HPyGlobal("HPyGlobal", "POINTER", long.class), - HPyGlobalPtr("HPyGlobal*", "POINTER", long.class), - HPyCapsule_DestructorPtr("HPyCapsule_Destructor*", "POINTER", long.class), - _HPyCapsule_key("_HPyCapsule_key", "SINT32", int.class), - HPyType_BuiltinShape("HPyType_BuiltinShape", "SINT32", int.class), - HPy_SourceKind("HPy_SourceKind", "SINT32", int.class), - HPyCallFunctionPtr("HPyCallFunction*", "POINTER", long.class), - PyType_Slot("PyType_Slot", null, null), - PyType_SlotPtr("PyType_Slot*", "POINTER", long.class), - HPyFunc_Signature("HPyFunc_Signature", null, null), - HPyMember_FieldType("HPyMember_FieldType", null, null), - HPySlot_Slot("HPySlot_Slot", null, null), - PyMemberDef("PyMemberDef", null, null), - HPy_buffer("HPy_buffer", null, null), - PyGetSetDef("PyGetSetDef", null, null); - - /** - * The type definition used in C source code. - */ - final String cType; - /** - * The type definition that is used in NFI signatures. - */ - final String nfiType; - /** - * The type used on the Java side in JNI/CLinker functions. - */ - final Class jniType; - - HPyContextSignatureType(String cType, String nfiType, Class jniType) { - this.cType = cType; - this.nfiType = nfiType; - this.jniType = jniType; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyExternalFunctionNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyExternalFunctionNodes.java deleted file mode 100644 index 31af69b26c..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyExternalFunctionNodes.java +++ /dev/null @@ -1,1875 +0,0 @@ -/* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; -import static com.oracle.graal.python.util.PythonUtils.EMPTY_TRUFFLESTRING_ARRAY; -import static com.oracle.graal.python.util.PythonUtils.tsArray; -import static com.oracle.graal.python.util.PythonUtils.tsLiteral; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; -import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.FromCharPointerNode; -import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.FromCharPointerNodeGen; -import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes; -import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.GetterRoot; -import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper; -import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.SetterRoot; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.GetIndexNode; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.TransformExceptionFromNativeNode; -import com.oracle.graal.python.builtins.objects.cext.common.CExtContext; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPyFuncSignature; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPySlotWrapper; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyCloseAndGetHandleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyCloseArgHandlesNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyConvertArgsToSulongNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyGetNativeSpacePointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyAllAsHandleNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyGetBufferProcToSulongNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyGetNativeSpacePointerNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyGetSetGetterToSulongNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyGetSetSetterToSulongNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyKeywordsToSulongNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyReleaseBufferProcToSulongNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyRichcmpFuncArgsToSulongNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPySSizeArgFuncToSulongNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPySSizeObjArgProcToSulongNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyVarargsToSulongNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyExternalFunctionNodesFactory.HPyCheckHandleResultNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyExternalFunctionNodesFactory.HPyCheckPrimitiveResultNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyExternalFunctionNodesFactory.HPyCheckVoidResultNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyExternalFunctionNodesFactory.HPyExternalFunctionInvokeNodeGen; -import com.oracle.graal.python.builtins.objects.function.PArguments; -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.function.PKeyword; -import com.oracle.graal.python.builtins.objects.function.Signature; -import com.oracle.graal.python.builtins.objects.memoryview.CExtPyBuffer; -import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotHPyNative; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PGuards; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.PRootNode; -import com.oracle.graal.python.nodes.argument.ReadIndexedArgumentNode; -import com.oracle.graal.python.nodes.argument.ReadVarArgsNode; -import com.oracle.graal.python.nodes.argument.ReadVarKeywordsNode; -import com.oracle.graal.python.runtime.ExecutionContext.CalleeContext; -import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext; -import com.oracle.graal.python.runtime.IndirectCallData; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.PythonContext.PythonThreadState; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.RootCallTarget; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.interop.ArityException; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.interop.UnsupportedTypeException; -import com.oracle.truffle.api.library.CachedLibrary; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.strings.TruffleString; - -public abstract class HPyExternalFunctionNodes { - - public static final TruffleString KW_CALLABLE = tsLiteral("$callable"); - private static final TruffleString KW_CLOSURE = tsLiteral("$closure"); - private static final TruffleString KW_CONTEXT = tsLiteral("$context"); - private static final TruffleString[] KEYWORDS_HIDDEN_CONTEXT = {KW_CONTEXT}; - private static final TruffleString[] KEYWORDS_HIDDEN_CALLABLE = {KW_CONTEXT, KW_CALLABLE}; - private static final TruffleString[] KEYWORDS_HIDDEN_CALLABLE_AND_CLOSURE = {KW_CONTEXT, KW_CALLABLE, KW_CLOSURE}; - private static final Object[] KW_DEFAULTS = {PNone.NO_VALUE}; - - private static PKeyword[] createKwDefaults(GraalHPyContext context) { - return new PKeyword[]{new PKeyword(KW_CONTEXT, context)}; - } - - private static PKeyword[] createKwDefaults(Object callable, GraalHPyContext context) { - // return new PKeyword[]{new PKeyword(KW_CALLABLE, callable), new PKeyword(KW_CONTEXT, - // context)}; - return new PKeyword[]{new PKeyword(KW_CONTEXT, context), new PKeyword(KW_CALLABLE, callable)}; - } - - public static PKeyword[] createKwDefaults(Object callable, Object closure, GraalHPyContext context) { - // return new PKeyword[]{new PKeyword(KW_CALLABLE, callable), new PKeyword(KW_CONTEXT, - // context), new PKeyword(KW_CLOSURE, closure)}; - return new PKeyword[]{new PKeyword(KW_CONTEXT, context), new PKeyword(KW_CALLABLE, callable), new PKeyword(KW_CLOSURE, closure)}; - } - - /** - * Creates a built-in function that accepts the specified signatures, does appropriate argument - * and result conversion and calls the provided callable. - * - * @param language The Python language object. - * @param context The HPy context the new function object belongs to. This will also be the - * context that is passed to the native functions when they are called. - * @param signature The signature ID as defined in {@link GraalHPyDef}. - * @param name The name of the method. - * @param callable The native function pointer. - * @param enclosingType The type the function belongs to (needed for checking of {@code self}). - * @param factory Just an instance of {@link PythonObjectFactory} to create the function object. - * We could also use the uncached version but this way, the allocations are reported - * for the caller. - * @return A {@link PBuiltinFunction} that accepts the given signature. - */ - @TruffleBoundary - static PBuiltinFunction createWrapperFunction(PythonLanguage language, GraalHPyContext context, HPyFuncSignature signature, TruffleString name, Object callable, Object enclosingType, - PythonObjectFactory factory) { - assert InteropLibrary.getUncached(callable).isExecutable(callable) : "object is not callable"; - RootCallTarget callTarget = language.createCachedCallTarget(l -> createRootNode(l, signature, name), signature, name, true); - - Object[] defaults; - if (signature == HPyFuncSignature.TERNARYFUNC) { - // the third argument is optional - // so it has a default value (this implicitly is 'None') - defaults = KW_DEFAULTS; - } else { - defaults = PythonUtils.EMPTY_OBJECT_ARRAY; - } - int flags = HPyFuncSignature.getFlags(signature); - return factory.createBuiltinFunction(name, enclosingType, defaults, createKwDefaults(callable, context), flags, callTarget); - } - - private static PRootNode createRootNode(PythonLanguage language, HPyFuncSignature signature, TruffleString name) { - switch (signature) { - case NOARGS: - case UNARYFUNC: - case REPRFUNC: - case GETITERFUNC: - case ITERNEXTFUNC: - case DESTROYFUNC: - return new HPyMethNoargsRoot(language, name, false); - case O: - case BINARYFUNC: - return new HPyMethORoot(language, name, false); - case KEYWORDS: - return new HPyMethKeywordsRoot(language, name); - case INITPROC: - return new HPyMethInitProcRoot(language, name); - case VARARGS: - return new HPyMethVarargsRoot(language, name); - case TERNARYFUNC: - return new HPyMethTernaryRoot(language, name); - case LENFUNC: - return new HPyMethNoargsRoot(language, name, true); - case SSIZEOBJARGPROC: - return new HPyMethSSizeObjArgProcRoot(language, name); - case INQUIRY: - return new HPyMethInquiryRoot(language, name); - case SSIZEARGFUNC: - return new HPyMethSSizeArgFuncRoot(language, name); - case OBJOBJARGPROC: - return new HPyMethObjObjArgProcRoot(language, name); - case OBJOBJPROC: - return new HPyMethObjObjProcRoot(language, name); - default: - // TODO(fa): support remaining signatures - throw CompilerDirectives.shouldNotReachHere("unsupported HPy method signature: " + signature.name()); - } - } - - /** - * Creates a built-in function for a specific slot. This built-in function also does appropriate - * argument and result conversion and calls the provided callable. - * - * @param language The Python language object. - * @param wrapper The wrapper ID as defined in {@link HPySlotWrapper}. - * @param name The name of the method. - * @param callable The native function pointer. - * @param enclosingType The type the function belongs to (needed for checking of {@code self}). - * @param factory Just an instance of {@link PythonObjectFactory} to create the function object. - * @return A {@link PBuiltinFunction} implementing the semantics of the specified slot wrapper. - */ - @TruffleBoundary - public static PBuiltinFunction createWrapperFunction(PythonLanguage language, GraalHPyContext context, HPySlotWrapper wrapper, TpSlotHPyNative slot, PExternalFunctionWrapper legacySlotWrapper, - TruffleString name, Object callable, Object enclosingType, - PythonObjectFactory factory) { - assert InteropLibrary.getUncached(callable).isExecutable(callable) : "object is not callable"; - RootCallTarget callTarget = language.createCachedCallTarget(l -> createSlotRootNode(l, wrapper, name), wrapper, name); - Object[] defaults; - if (wrapper == HPySlotWrapper.TERNARYFUNC || wrapper == HPySlotWrapper.SQ_DELITEM) { - /* - * For TERNARYFUNC: The third argument is optional. So it has a default value (this - * implicitly is 'None'). For SQ_DELITEM: it's really the same as SQ_SETITEM but with a - * default. - */ - defaults = new Object[]{PNone.NO_VALUE}; - } else { - defaults = PythonUtils.EMPTY_OBJECT_ARRAY; - } - PKeyword[] kwDefaults; - if (wrapper == HPySlotWrapper.CALL) { - kwDefaults = createKwDefaults(context); - } else { - kwDefaults = createKwDefaults(callable, context); - - } - return factory.createWrapperDescriptor(name, enclosingType, defaults, kwDefaults, 0, callTarget, slot, legacySlotWrapper); - } - - private static PRootNode createSlotRootNode(PythonLanguage language, HPySlotWrapper wrapper, TruffleString name) { - switch (wrapper) { - case NULL: - return new HPyMethKeywordsRoot(language, name); - case UNARYFUNC: - return new HPyMethNoargsRoot(language, name, false); - case BINARYFUNC: - case BINARYFUNC_L: - return new HPyMethORoot(language, name, false); - case BINARYFUNC_R: - return new HPyMethReverseBinaryRoot(language, name, false); - case INIT: - return new HPyMethInitProcRoot(language, name); - case TERNARYFUNC: - return new HPyMethTernaryRoot(language, name); - case LENFUNC: - return new HPyMethNoargsRoot(language, name, true); - case INQUIRYPRED: - return new HPyMethInquiryRoot(language, name); - case INDEXARGFUNC: - return new HPyMethSSizeArgFuncRoot(language, name); - case OBJOBJARGPROC: - return new HPyMethObjObjArgProcRoot(language, name); - case OBJOBJPROC: - return new HPyMethObjObjProcRoot(language, name); - case SQ_ITEM: - return new HPyMethSqItemWrapperRoot(language, name); - case SQ_SETITEM: - case SQ_DELITEM: - // SQ_DELITEM is really the same as SQ_SETITEM but with a default - return new HPyMethSqSetitemWrapperRoot(language, name); - case RICHCMP_LT: - case RICHCMP_LE: - case RICHCMP_EQ: - case RICHCMP_NE: - case RICHCMP_GT: - case RICHCMP_GE: - return new HPyMethRichcmpOpRootNode(language, name, getCompareOpCode(wrapper)); - case GETBUFFER: - return new HPyGetBufferRootNode(language, name); - case RELEASEBUFFER: - return new HPyReleaseBufferRootNode(language, name); - case HASHFUNC: - return new HPyMethHashRoot(language, name); - case CALL: - return new HPyMethCallRoot(language, name); - default: - // TODO(fa): support remaining slot wrappers - throw CompilerDirectives.shouldNotReachHere("unsupported HPy slot wrapper: wrap_" + wrapper.name().toLowerCase()); - } - - } - - /** - * Resolve the requested slot wrapper to the numeric op code as defined by HPy's enum - * {@code HPy_RichCmpOp}. - */ - private static int getCompareOpCode(HPySlotWrapper sig) { - // op codes for binary comparisons (defined in 'object.h') - switch (sig) { - case RICHCMP_LT: - return 0; - case RICHCMP_LE: - return 1; - case RICHCMP_EQ: - return 2; - case RICHCMP_NE: - return 3; - case RICHCMP_GT: - return 4; - case RICHCMP_GE: - return 5; - } - throw CompilerDirectives.shouldNotReachHere(); - } - - /** - * Invokes an HPy C function. It takes care of argument and result conversion and always passes - * the HPy context as a first parameter. - */ - public abstract static class HPyExternalFunctionInvokeNode extends Node { - - @Child private HPyConvertArgsToSulongNode toSulongNode; - @Child private HPyCheckFunctionResultNode checkFunctionResultNode; - @Child private HPyCloseArgHandlesNode handleCloseNode; - - HPyExternalFunctionInvokeNode() { - CompilerAsserts.neverPartOfCompilation(); - this.toSulongNode = HPyAllAsHandleNodeGen.create(); - this.checkFunctionResultNode = HPyCheckHandleResultNodeGen.create(); - this.handleCloseNode = this.toSulongNode.createCloseHandleNode(); - } - - HPyExternalFunctionInvokeNode(HPyConvertArgsToSulongNode convertArgsNode) { - CompilerAsserts.neverPartOfCompilation(); - this.toSulongNode = convertArgsNode != null ? convertArgsNode : HPyAllAsHandleNodeGen.create(); - this.checkFunctionResultNode = HPyCheckHandleResultNodeGen.create(); - this.handleCloseNode = this.toSulongNode.createCloseHandleNode(); - } - - HPyExternalFunctionInvokeNode(HPyCheckFunctionResultNode checkFunctionResultNode, HPyConvertArgsToSulongNode convertArgsNode) { - CompilerAsserts.neverPartOfCompilation(); - this.toSulongNode = convertArgsNode != null ? convertArgsNode : HPyAllAsHandleNodeGen.create(); - this.checkFunctionResultNode = checkFunctionResultNode != null ? checkFunctionResultNode : HPyCheckHandleResultNodeGen.create(); - this.handleCloseNode = this.toSulongNode.createCloseHandleNode(); - } - - public abstract Object execute(VirtualFrame frame, TruffleString name, Object callable, GraalHPyContext hPyContext, Object[] frameArgs); - - @Specialization(limit = "1") - Object doIt(VirtualFrame frame, TruffleString name, Object callable, GraalHPyContext hPyContext, Object[] arguments, - @Cached("createFor(this)") IndirectCallData indirectCallData, - @CachedLibrary("callable") InteropLibrary lib, - @Cached PRaiseNode raiseNode) { - Object[] convertedArguments = new Object[arguments.length + 1]; - toSulongNode.executeInto(frame, arguments, 0, convertedArguments, 1); - - // first arg is always the HPyContext - convertedArguments[0] = hPyContext.getBackend(); - - PythonLanguage language = PythonLanguage.get(this); - PythonContext ctx = hPyContext.getContext(); - PythonThreadState pythonThreadState = ctx.getThreadState(language); - - // If any code requested the caught exception (i.e. used 'sys.exc_info()'), we store - // it to the context since we cannot propagate it through the native frames. - Object state = IndirectCallContext.enter(frame, pythonThreadState, indirectCallData); - - try { - return checkFunctionResultNode.execute(pythonThreadState, name, lib.execute(callable, convertedArguments)); - } catch (UnsupportedTypeException | UnsupportedMessageException e) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.CALLING_NATIVE_FUNC_FAILED, name, e); - } catch (ArityException e) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.CALLING_NATIVE_FUNC_EXPECTED_ARGS, name, e.getExpectedMinArity(), e.getActualArity()); - } finally { - // special case after calling a C function: transfer caught exception back to frame - // to simulate the global state semantics - PArguments.setException(frame, pythonThreadState.getCaughtException()); - IndirectCallContext.exit(frame, pythonThreadState, state); - - // close all handles (if necessary) - if (handleCloseNode != null) { - handleCloseNode.executeInto(frame, convertedArguments, 1); - } - } - } - } - - abstract static class HPyMethodDescriptorRootNode extends PRootNode { - @Child private CalleeContext calleeContext; - @Child private HPyExternalFunctionInvokeNode invokeNode; - @Child private ReadIndexedArgumentNode readSelfNode; - @Child private ReadIndexedArgumentNode readCallableNode; - @Child private ReadIndexedArgumentNode readContextNode; - - private final TruffleString name; - - @TruffleBoundary - public HPyMethodDescriptorRootNode(PythonLanguage language, TruffleString name, HPyConvertArgsToSulongNode convertArgsToSulongNode) { - super(language); - this.name = name; - this.invokeNode = HPyExternalFunctionInvokeNodeGen.create(convertArgsToSulongNode); - } - - @TruffleBoundary - public HPyMethodDescriptorRootNode(PythonLanguage language, TruffleString name, HPyCheckFunctionResultNode checkFunctionResultNode, HPyConvertArgsToSulongNode convertArgsToSulongNode) { - super(language); - this.name = name; - this.invokeNode = HPyExternalFunctionInvokeNodeGen.create(checkFunctionResultNode, convertArgsToSulongNode); - } - - protected static Object intToBoolean(Object result) { - if (result instanceof Integer) { - return ((Integer) result) != 0; - } else if (result instanceof Long) { - return ((Long) result) != 0; - } - throw CompilerDirectives.shouldNotReachHere(); - } - - @Override - public Object execute(VirtualFrame frame) { - Object callable = ensureReadCallableNode().execute(frame); - GraalHPyContext hpyContext = readContext(frame); - Object[] cArguments = prepareCArguments(frame, hpyContext); - getCalleeContext().enter(frame); - try { - return processResult(frame, invokeNode.execute(frame, name, callable, hpyContext, cArguments)); - } finally { - getCalleeContext().exit(frame, this); - closeCArguments(frame, hpyContext, cArguments); - } - } - - protected abstract Object[] prepareCArguments(VirtualFrame frame, GraalHPyContext hpyContext); - - protected Object processResult(@SuppressWarnings("unused") VirtualFrame frame, Object result) { - return result; - } - - @SuppressWarnings("unused") - protected void closeCArguments(VirtualFrame frame, GraalHPyContext hpyContext, Object[] cArguments) { - // nothing to do by default - } - - protected final HPyExternalFunctionInvokeNode getInvokeNode() { - return invokeNode; - } - - protected final Object getSelf(VirtualFrame frame) { - if (readSelfNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readSelfNode = insert(ReadIndexedArgumentNode.create(0)); - } - return readSelfNode.execute(frame); - } - - protected final CalleeContext getCalleeContext() { - if (calleeContext == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - calleeContext = insert(CalleeContext.create()); - } - return calleeContext; - } - - protected final ReadIndexedArgumentNode ensureReadCallableNode() { - if (readCallableNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - // we insert a hidden argument after the hidden context argument - int hiddenArg = getSignature().getParameterIds().length + 1; - readCallableNode = insert(ReadIndexedArgumentNode.create(hiddenArg)); - } - return readCallableNode; - } - - protected final GraalHPyContext readContext(VirtualFrame frame) { - if (readContextNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - // we insert a hidden argument at the end of the positional arguments - int hiddenArg = getSignature().getParameterIds().length; - readContextNode = insert(ReadIndexedArgumentNode.create(hiddenArg)); - } - Object hpyContext = readContextNode.execute(frame); - if (hpyContext instanceof GraalHPyContext) { - return (GraalHPyContext) hpyContext; - } - throw CompilerDirectives.shouldNotReachHere("invalid HPy context"); - } - - @Override - public String getName() { - return name.toJavaStringUncached(); - } - - public TruffleString getTSName() { - return name; - } - - @Override - public String toString() { - return ""; - } - - @Override - public boolean isInternal() { - return true; - } - - @Override - public boolean isPythonInternal() { - return true; - } - - @Override - public boolean setsUpCalleeContext() { - return true; - } - } - - static final class HPyMethNoargsRoot extends HPyMethodDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(1, false, -1, false, tsArray("self"), KEYWORDS_HIDDEN_CALLABLE, true); - - public HPyMethNoargsRoot(PythonLanguage language, TruffleString name, boolean nativePrimitiveResult) { - super(language, name, nativePrimitiveResult ? HPyCheckPrimitiveResultNodeGen.create() : HPyCheckHandleResultNodeGen.create(), HPyAllAsHandleNodeGen.create()); - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, @SuppressWarnings("unused") GraalHPyContext hpyContext) { - return new Object[]{getSelf(frame)}; - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - } - - static final class HPyMethORoot extends HPyMethodDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(-1, false, -1, false, tsArray("self", "arg"), KEYWORDS_HIDDEN_CALLABLE, true); - - @Child private ReadIndexedArgumentNode readArgNode; - - public HPyMethORoot(PythonLanguage language, TruffleString name, boolean nativePrimitiveResult) { - super(language, name, nativePrimitiveResult ? HPyCheckPrimitiveResultNodeGen.create() : HPyCheckHandleResultNodeGen.create(), HPyAllAsHandleNodeGen.create()); - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, @SuppressWarnings("unused") GraalHPyContext hpyContext) { - return new Object[]{getSelf(frame), getArg(frame)}; - } - - private Object getArg(VirtualFrame frame) { - if (readArgNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readArgNode = insert(ReadIndexedArgumentNode.create(1)); - } - return readArgNode.execute(frame); - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - } - - static final class HPyMethVarargsRoot extends HPyMethodDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(-1, false, 1, false, tsArray("self"), KEYWORDS_HIDDEN_CALLABLE, true); - - @Child private ReadVarArgsNode readVarargsNode; - - @TruffleBoundary - public HPyMethVarargsRoot(PythonLanguage language, TruffleString name) { - super(language, name, HPyVarargsToSulongNodeGen.create()); - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, GraalHPyContext hpyContext) { - Object[] args = getVarargs(frame); - return new Object[]{getSelf(frame), hpyContext.createArgumentsArray(args), (long) args.length}; - } - - @Override - protected void closeCArguments(VirtualFrame frame, GraalHPyContext hpyContext, Object[] cArguments) { - hpyContext.freeArgumentsArray(cArguments[1]); - } - - private Object[] getVarargs(VirtualFrame frame) { - if (readVarargsNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readVarargsNode = insert(ReadVarArgsNode.create(true)); - } - return readVarargsNode.executeObjectArray(frame); - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - } - - static final class HPyMethKeywordsRoot extends HPyMethodDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(-1, true, 1, false, tsArray("self"), KEYWORDS_HIDDEN_CALLABLE, true); - - @Child private ReadVarArgsNode readVarargsNode; - @Child private ReadVarKeywordsNode readKwargsNode; - @Child private PythonObjectFactory factory; - - @TruffleBoundary - public HPyMethKeywordsRoot(PythonLanguage language, TruffleString name) { - super(language, name, HPyKeywordsToSulongNodeGen.create()); - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, GraalHPyContext hpyContext) { - Object[] positionalArgs = getVarargs(frame); - PKeyword[] keywords = getKwargs(frame); - long nPositionalArgs = positionalArgs.length; - - Object[] args; - Object kwnamesTuple; - // this condition is implicitly profiled by 'getKwnamesTuple' - if (keywords.length > 0) { - args = PythonUtils.arrayCopyOf(positionalArgs, positionalArgs.length + keywords.length); - TruffleString[] kwnames = new TruffleString[keywords.length]; - for (int i = 0; i < keywords.length; i++) { - args[positionalArgs.length + i] = keywords[i].getValue(); - kwnames[i] = keywords[i].getName(); - } - kwnamesTuple = getKwnamesTuple(kwnames); - } else { - args = positionalArgs; - kwnamesTuple = GraalHPyHandle.NULL_HANDLE_DELEGATE; - } - return new Object[]{getSelf(frame), createArgumentsArray(hpyContext, args), nPositionalArgs, kwnamesTuple}; - } - - @Override - protected void closeCArguments(VirtualFrame frame, GraalHPyContext hpyContext, Object[] cArguments) { - hpyContext.freeArgumentsArray(cArguments[1]); - } - - private Object createArgumentsArray(GraalHPyContext hpyContext, Object[] args) { - return hpyContext.createArgumentsArray(args); - } - - private Object[] getVarargs(VirtualFrame frame) { - if (readVarargsNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readVarargsNode = insert(ReadVarArgsNode.create(true)); - } - return readVarargsNode.executeObjectArray(frame); - } - - private PKeyword[] getKwargs(VirtualFrame frame) { - if (PArguments.getKeywordArguments(frame).length == 0) { - return PKeyword.EMPTY_KEYWORDS; - } - if (readKwargsNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readKwargsNode = insert(ReadVarKeywordsNode.create()); - } - return (PKeyword[]) readKwargsNode.execute(frame); - } - - private PTuple getKwnamesTuple(TruffleString[] kwnames) { - if (factory == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - factory = insert(PythonObjectFactory.create()); - } - return factory.createTuple(kwnames); - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - } - - static final class HPyMethInitProcRoot extends HPyMethodDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(-1, true, 1, false, tsArray("self"), KEYWORDS_HIDDEN_CALLABLE, true); - - @Child private ReadVarArgsNode readVarargsNode; - @Child private ReadVarKeywordsNode readKwargsNode; - - @TruffleBoundary - public HPyMethInitProcRoot(PythonLanguage language, TruffleString name) { - super(language, name, HPyCheckPrimitiveResultNodeGen.create(), HPyKeywordsToSulongNodeGen.create()); - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, GraalHPyContext hpyContext) { - Object[] args = getVarargs(frame); - return new Object[]{getSelf(frame), hpyContext.createArgumentsArray(args), (long) args.length, getKwargs(frame)}; - } - - @Override - protected void closeCArguments(VirtualFrame frame, GraalHPyContext hpyContext, Object[] cArguments) { - hpyContext.freeArgumentsArray(cArguments[1]); - } - - @Override - @SuppressWarnings("unused") - protected Object processResult(VirtualFrame frame, Object result) { - // If no error occurred, the init function always returns None. - // Possible errors are already handled in the HPyExternalFunctionInvokeNode. - return PNone.NONE; - } - - private Object[] getVarargs(VirtualFrame frame) { - if (readVarargsNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readVarargsNode = insert(ReadVarArgsNode.create(true)); - } - return readVarargsNode.executeObjectArray(frame); - } - - private Object getKwargs(VirtualFrame frame) { - if (readKwargsNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readKwargsNode = insert(ReadVarKeywordsNode.createForUserFunction(EMPTY_TRUFFLESTRING_ARRAY)); - } - return readKwargsNode.execute(frame); - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - } - - static final class HPyMethTernaryRoot extends HPyMethodDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(3, false, -1, false, tsArray("x", "y", "z"), KEYWORDS_HIDDEN_CALLABLE, true); - - @Child private ReadIndexedArgumentNode readArg1Node; - @Child private ReadIndexedArgumentNode readArg2Node; - - public HPyMethTernaryRoot(PythonLanguage language, TruffleString name) { - super(language, name, HPyAllAsHandleNodeGen.create()); - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, @SuppressWarnings("unused") GraalHPyContext hpyContext) { - return new Object[]{getSelf(frame), getArg1(frame), getArg2(frame)}; - } - - private Object getArg1(VirtualFrame frame) { - if (readArg1Node == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readArg1Node = insert(ReadIndexedArgumentNode.create(1)); - } - return readArg1Node.execute(frame); - } - - private Object getArg2(VirtualFrame frame) { - if (readArg2Node == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readArg2Node = insert(ReadIndexedArgumentNode.create(2)); - } - Object arg2 = readArg2Node.execute(frame); - return arg2 != PNone.NO_VALUE ? arg2 : PNone.NONE; - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - } - - static class HPyMethSSizeArgFuncRoot extends HPyMethodDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(2, false, -1, false, tsArray("$self", "n"), KEYWORDS_HIDDEN_CALLABLE, true); - - @Child private ReadIndexedArgumentNode readArg1Node; - - public HPyMethSSizeArgFuncRoot(PythonLanguage language, TruffleString name) { - super(language, name, HPySSizeArgFuncToSulongNodeGen.create()); - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, @SuppressWarnings("unused") GraalHPyContext hpyContext) { - return new Object[]{getSelf(frame), getArg1(frame)}; - } - - protected Object getArg1(VirtualFrame frame) { - if (readArg1Node == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readArg1Node = insert(ReadIndexedArgumentNode.create(1)); - } - return readArg1Node.execute(frame); - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - } - - /** - * Implements semantics of {@code typeobject.c: wrap_sq_item}. - */ - static final class HPyMethSqItemWrapperRoot extends HPyMethSSizeArgFuncRoot { - - @Child private GetIndexNode getIndexNode; - - public HPyMethSqItemWrapperRoot(PythonLanguage language, TruffleString name) { - super(language, name); - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, @SuppressWarnings("unused") GraalHPyContext hpyContext) { - Object self = getSelf(frame); - return new Object[]{self, getIndex(self, getArg1(frame))}; - } - - private int getIndex(Object self, Object index) { - if (getIndexNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - getIndexNode = insert(CExtCommonNodes.GetIndexNode.create()); - } - return getIndexNode.execute(self, index); - } - } - - /** - * Implements semantics of {@code typeobject.c: wrap_sq_setitem}. - */ - static final class HPyMethSqSetitemWrapperRoot extends HPyMethSSizeObjArgProcRoot { - - @Child private GetIndexNode getIndexNode; - - public HPyMethSqSetitemWrapperRoot(PythonLanguage language, TruffleString name) { - super(language, name); - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, @SuppressWarnings("unused") GraalHPyContext hpyContext) { - Object self = getSelf(frame); - return new Object[]{self, getIndex(self, getArg1(frame)), getArg2(frame)}; - } - - private int getIndex(Object self, Object index) { - if (getIndexNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - getIndexNode = insert(CExtCommonNodes.GetIndexNode.create()); - } - return getIndexNode.execute(self, index); - } - } - - static final class HPyMethSSizeSSizeArgFuncRoot extends HPyMethodDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(3, false, -1, false, tsArray("$self", "n", "m"), KEYWORDS_HIDDEN_CALLABLE, true); - - @Child private ReadIndexedArgumentNode readArg1Node; - @Child private ReadIndexedArgumentNode readArg2Node; - - public HPyMethSSizeSSizeArgFuncRoot(PythonLanguage language, TruffleString name) { - super(language, name, HPySSizeArgFuncToSulongNodeGen.create()); - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, @SuppressWarnings("unused") GraalHPyContext hpyContext) { - return new Object[]{getSelf(frame), getArg1(frame), getArg2(frame)}; - } - - private Object getArg1(VirtualFrame frame) { - if (readArg1Node == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readArg1Node = insert(ReadIndexedArgumentNode.create(1)); - } - return readArg1Node.execute(frame); - } - - private Object getArg2(VirtualFrame frame) { - if (readArg2Node == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readArg2Node = insert(ReadIndexedArgumentNode.create(2)); - } - return readArg2Node.execute(frame); - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - } - - /** - * Very similar to {@link HPyMethNoargsRoot} but converts the result to a boolean. - */ - static final class HPyMethInquiryRoot extends HPyMethodDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(-1, false, -1, false, tsArray("self"), KEYWORDS_HIDDEN_CALLABLE); - - public HPyMethInquiryRoot(PythonLanguage language, TruffleString name) { - super(language, name, HPyCheckPrimitiveResultNodeGen.create(), HPyAllAsHandleNodeGen.create()); - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, @SuppressWarnings("unused") GraalHPyContext hpyContext) { - return new Object[]{getSelf(frame)}; - } - - @Override - protected Object processResult(VirtualFrame frame, Object result) { - // 'HPyCheckPrimitiveResultNode' already guarantees that the result is 'int' or 'long'. - return intToBoolean(result); - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - } - - static final class HPyMethObjObjArgProcRoot extends HPyMethodDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(-1, false, 1, false, tsArray("$self", "x"), KEYWORDS_HIDDEN_CALLABLE, true); - - @Child private ReadIndexedArgumentNode readArg1Node; - @Child private ReadVarArgsNode readVarargsNode; - @Child private PRaiseNode raiseNode; - - public HPyMethObjObjArgProcRoot(PythonLanguage language, TruffleString name) { - super(language, name, HPyCheckPrimitiveResultNodeGen.create(), HPyAllAsHandleNodeGen.create()); - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, @SuppressWarnings("unused") GraalHPyContext hpyContext) { - Object[] varargs = getVarargs(frame); - if (varargs.length == 0) { - return new Object[]{getSelf(frame), getArg1(frame), PNone.NO_VALUE}; - } else if (varargs.length == 1) { - return new Object[]{getSelf(frame), getArg1(frame), varargs[0]}; - } else { - throw getRaiseNode().raise(PythonBuiltinClassType.TypeError, - ErrorMessages.TAKES_FROM_D_TO_D_POS_ARG_S_BUT_D_S_GIVEN_S, - getName(), 2, 3, "s", 1 + varargs.length, "were", ""); - } - } - - private PRaiseNode getRaiseNode() { - if (raiseNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - raiseNode = insert(PRaiseNode.create()); - } - return raiseNode; - } - - private Object[] getVarargs(VirtualFrame frame) { - if (readVarargsNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readVarargsNode = insert(ReadVarArgsNode.create(true)); - } - return readVarargsNode.executeObjectArray(frame); - } - - private Object getArg1(VirtualFrame frame) { - if (readArg1Node == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readArg1Node = insert(ReadIndexedArgumentNode.create(1)); - } - return readArg1Node.execute(frame); - } - - @Override - protected Object processResult(VirtualFrame frame, Object result) { - // 'HPyCheckPrimitiveResultNode' already guarantees that the result is 'int' or 'long'. - return intToBoolean(result); - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - } - - static final class HPyMethObjObjProcRoot extends HPyMethodDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(2, false, -1, false, tsArray("$self", "other"), KEYWORDS_HIDDEN_CALLABLE, true); - - @Child private ReadIndexedArgumentNode readArg1Node; - - public HPyMethObjObjProcRoot(PythonLanguage language, TruffleString name) { - super(language, name, HPyCheckPrimitiveResultNodeGen.create(), HPyAllAsHandleNodeGen.create()); - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, @SuppressWarnings("unused") GraalHPyContext hpyContext) { - return new Object[]{getSelf(frame), getArg1(frame)}; - } - - private Object getArg1(VirtualFrame frame) { - if (readArg1Node == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readArg1Node = insert(ReadIndexedArgumentNode.create(1)); - } - return readArg1Node.execute(frame); - } - - @Override - protected Object processResult(VirtualFrame frame, Object result) { - // 'HPyCheckPrimitiveResultNode' already guarantees that the result is 'int' or 'long'. - return intToBoolean(result); - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - } - - static class HPyMethSSizeObjArgProcRoot extends HPyMethodDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(3, false, -1, false, tsArray("$self", "arg0", "arg1"), KEYWORDS_HIDDEN_CALLABLE, true); - - @Child private ReadIndexedArgumentNode readArg1Node; - @Child private ReadIndexedArgumentNode readArg2Node; - - public HPyMethSSizeObjArgProcRoot(PythonLanguage language, TruffleString name) { - super(language, name, HPyCheckPrimitiveResultNodeGen.create(), HPySSizeObjArgProcToSulongNodeGen.create()); - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, @SuppressWarnings("unused") GraalHPyContext hpyContext) { - return new Object[]{getSelf(frame), getArg1(frame), getArg2(frame)}; - } - - protected Object getArg1(VirtualFrame frame) { - if (readArg1Node == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readArg1Node = insert(ReadIndexedArgumentNode.create(1)); - } - return readArg1Node.execute(frame); - } - - protected Object getArg2(VirtualFrame frame) { - if (readArg2Node == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readArg2Node = insert(ReadIndexedArgumentNode.create(2)); - } - return readArg2Node.execute(frame); - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - } - - static final class HPyMethReverseBinaryRoot extends HPyMethodDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(-1, false, -1, false, tsArray("self", "other"), KEYWORDS_HIDDEN_CALLABLE, true); - - @Child private ReadIndexedArgumentNode readOtherNode; - - public HPyMethReverseBinaryRoot(PythonLanguage language, TruffleString name, boolean nativePrimitiveResult) { - super(language, name, nativePrimitiveResult ? HPyCheckPrimitiveResultNodeGen.create() : HPyCheckHandleResultNodeGen.create(), HPyAllAsHandleNodeGen.create()); - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, @SuppressWarnings("unused") GraalHPyContext hpyContext) { - return new Object[]{getOther(frame), getSelf(frame)}; - } - - private Object getOther(VirtualFrame frame) { - if (readOtherNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readOtherNode = insert(ReadIndexedArgumentNode.create(1)); - } - return readOtherNode.execute(frame); - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - } - - public abstract static class HPyCheckFunctionResultNode extends Node { - - public abstract Object execute(PythonThreadState pythonThreadState, TruffleString name, Object value); - } - - // roughly equivalent to _Py_CheckFunctionResult in Objects/call.c - @GenerateUncached - @GenerateInline(false) - @ImportStatic(PGuards.class) - public abstract static class HPyCheckHandleResultNode extends HPyCheckFunctionResultNode { - - @Specialization - static Object doLongNull(PythonThreadState pythonThreadState, TruffleString name, Object value, - @Bind("this") Node inliningTarget, - @Cached HPyCloseAndGetHandleNode closeAndGetHandleNode, - @Cached TransformExceptionFromNativeNode transformExceptionFromNativeNode) { - Object delegate = closeAndGetHandleNode.execute(inliningTarget, value); - transformExceptionFromNativeNode.execute(inliningTarget, pythonThreadState, name, delegate == GraalHPyHandle.NULL_HANDLE_DELEGATE, true); - return delegate; - } - } - - /** - * Similar to {@link HPyCheckFunctionResultNode}, this node checks a primitive result of a - * native function. This node guarantees that an {@code int} or {@code long} is returned. - */ - @GenerateUncached - @GenerateInline(false) - @ImportStatic(PGuards.class) - abstract static class HPyCheckPrimitiveResultNode extends HPyCheckFunctionResultNode { - public abstract int executeInt(PythonThreadState context, TruffleString name, int value); - - public abstract long executeLong(PythonThreadState context, TruffleString name, long value); - - @Specialization - static int doInteger(PythonThreadState pythonThreadState, TruffleString name, int value, - @Bind("this") Node inliningTarget, - @Shared @Cached TransformExceptionFromNativeNode transformExceptionFromNativeNode) { - transformExceptionFromNativeNode.execute(inliningTarget, pythonThreadState, name, value == -1, false); - return value; - } - - @Specialization(replaces = "doInteger") - static long doLong(PythonThreadState pythonThreadState, TruffleString name, long value, - @Bind("this") Node inliningTarget, - @Shared @Cached TransformExceptionFromNativeNode transformExceptionFromNativeNode) { - transformExceptionFromNativeNode.execute(inliningTarget, pythonThreadState, name, value == -1, false); - return value; - } - - @Specialization(limit = "1") - static Object doObject(PythonThreadState pythonThreadState, TruffleString name, Object value, - @Bind("this") Node inliningTarget, - @CachedLibrary("value") InteropLibrary lib, - @Shared @Cached PRaiseNode.Lazy raiseNode, - @Shared @Cached TransformExceptionFromNativeNode transformExceptionFromNativeNode) { - if (lib.fitsInLong(value)) { - try { - long lvalue = lib.asLong(value); - transformExceptionFromNativeNode.execute(inliningTarget, pythonThreadState, name, lvalue == -1, false); - return lvalue; - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } - throw raiseNode.get(inliningTarget).raise(SystemError, ErrorMessages.FUNC_S_DIDNT_RETURN_INT, name); - } - } - - /** - * Does not actually check the result of a function (since this is used when {@code void} - * functions are called) but checks if an error occurred during execution of the function. - */ - @GenerateUncached - @GenerateInline(false) - @ImportStatic(PGuards.class) - abstract static class HPyCheckVoidResultNode extends HPyCheckFunctionResultNode { - - @Specialization - static Object doGeneric(PythonThreadState threadState, TruffleString name, Object value, - @Bind("this") Node inliningTarget, - @Cached TransformExceptionFromNativeNode transformExceptionFromNativeNode) { - /* - * A 'void' function never indicates an error but an error could still happen. So this - * must also be checked. The actual result value (which will be something like NULL or - * 0) is not used. - */ - transformExceptionFromNativeNode.execute(inliningTarget, threadState, name, false, true); - return value; - } - } - - static final class HPyMethRichcmpOpRootNode extends HPyMethodDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(-1, false, -1, false, tsArray("self", "other"), KEYWORDS_HIDDEN_CALLABLE, true); - @Child private ReadIndexedArgumentNode readArgNode; - - private final int op; - - HPyMethRichcmpOpRootNode(PythonLanguage language, TruffleString name, int op) { - super(language, name, HPyRichcmpFuncArgsToSulongNodeGen.create()); - this.readArgNode = ReadIndexedArgumentNode.create(1); - this.op = op; - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, @SuppressWarnings("unused") GraalHPyContext hpyContext) { - return new Object[]{getSelf(frame), readArgNode.execute(frame), op}; - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - } - - /** - * A simple and lightweight Python root node that invokes a native getter function. The native - * call target and the native closure pointer are passed as Python closure. - */ - abstract static class HPyGetSetDescriptorRootNode extends PRootNode { - - @Child private CalleeContext calleeContext; - @Child private HPyExternalFunctionInvokeNode invokeNode; - @Child private ReadIndexedArgumentNode readCallableNode; - @Child private ReadIndexedArgumentNode readContextNode; - @Child private ReadIndexedArgumentNode readClosureNode; - - private final TruffleString name; - - HPyGetSetDescriptorRootNode(PythonLanguage language, TruffleString name) { - super(language); - this.name = name; - } - - @Override - public Object execute(VirtualFrame frame) { - getCalleeContext().enter(frame); - try { - Object target = readCallable(frame); - GraalHPyContext hpyContext = readContext(frame); - Object closure = readClosure(frame); - return ensureInvokeNode().execute(frame, name, target, hpyContext, createArguments(frame, closure)); - } finally { - getCalleeContext().exit(frame, this); - } - } - - protected abstract HPyConvertArgsToSulongNode createArgumentConversionNode(); - - protected abstract HPyCheckFunctionResultNode createResultConversionNode(); - - protected abstract Object[] createArguments(VirtualFrame frame, Object closure); - - @Override - public String getName() { - return name.toJavaStringUncached(); - } - - private CalleeContext getCalleeContext() { - if (calleeContext == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - calleeContext = insert(CalleeContext.create()); - } - return calleeContext; - } - - private HPyExternalFunctionInvokeNode ensureInvokeNode() { - if (invokeNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - invokeNode = insert(HPyExternalFunctionInvokeNodeGen.create(createResultConversionNode(), createArgumentConversionNode())); - } - return invokeNode; - } - - protected final Object readCallable(VirtualFrame frame) { - if (readCallableNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - // we insert a hidden argument after the hidden context argument - int hiddenArg = getSignature().getParameterIds().length + 1; - readCallableNode = insert(ReadIndexedArgumentNode.create(hiddenArg)); - } - return readCallableNode.execute(frame); - } - - private GraalHPyContext readContext(VirtualFrame frame) { - if (readContextNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - // we insert a hidden argument at the end of the positional arguments - int hiddenArg = getSignature().getParameterIds().length; - readContextNode = insert(ReadIndexedArgumentNode.create(hiddenArg)); - } - Object hpyContext = readContextNode.execute(frame); - if (hpyContext instanceof GraalHPyContext) { - return (GraalHPyContext) hpyContext; - } - throw CompilerDirectives.shouldNotReachHere("invalid HPy context"); - } - - protected final Object readClosure(VirtualFrame frame) { - if (readClosureNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - // we insert a hidden closure argument after the hidden context arg - int hiddenArg = getSignature().getParameterIds().length + 2; - readClosureNode = insert(ReadIndexedArgumentNode.create(hiddenArg)); - } - return readClosureNode.execute(frame); - } - - @Override - public boolean isPythonInternal() { - return true; - } - - @Override - public boolean isInternal() { - return true; - } - - @Override - public boolean setsUpCalleeContext() { - return true; - } - } - - /** - * A simple and lightweight Python root node that invokes a native getter function. The native - * call target and the native closure pointer are passed as Python closure. - */ - static final class HPyGetSetDescriptorGetterRootNode extends HPyGetSetDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(-1, false, -1, false, tsArray("$self"), KEYWORDS_HIDDEN_CALLABLE_AND_CLOSURE, true); - - HPyGetSetDescriptorGetterRootNode(PythonLanguage language, TruffleString name) { - super(language, name); - } - - @Override - protected Object[] createArguments(VirtualFrame frame, Object closure) { - return new Object[]{PArguments.getArgument(frame, 0), closure}; - } - - @Override - protected HPyConvertArgsToSulongNode createArgumentConversionNode() { - return HPyGetSetGetterToSulongNodeGen.create(); - } - - @Override - protected HPyCheckFunctionResultNode createResultConversionNode() { - return HPyCheckHandleResultNodeGen.create(); - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - - @TruffleBoundary - public static PBuiltinFunction createFunction(GraalHPyContext hpyContext, Object enclosingType, TruffleString propertyName, Object target, Object closure) { - PythonContext pythonContext = hpyContext.getContext(); - PythonLanguage lang = pythonContext.getLanguage(); - RootCallTarget callTarget = lang.createCachedCallTarget(l -> new HPyGetSetDescriptorGetterRootNode(l, propertyName), HPyGetSetDescriptorGetterRootNode.class, propertyName); - PythonObjectFactory factory = pythonContext.getCore().factory(); - return factory.createBuiltinFunction(propertyName, enclosingType, PythonUtils.EMPTY_OBJECT_ARRAY, createKwDefaults(target, closure, hpyContext), 0, callTarget); - } - } - - static final class HPyLegacyGetSetDescriptorGetterRoot extends GetterRoot { - - @Child private HPyGetNativeSpacePointerNode getNativeSpacePointerNode; - - protected HPyLegacyGetSetDescriptorGetterRoot(PythonLanguage language, TruffleString name, PExternalFunctionWrapper provider) { - super(language, name, provider); - } - - /* - * TODO(fa): It's still unclear how to handle HPy native space pointers when passed to an - * 'AsPythonObjectNode'. This can happen when, e.g., the getter returns the 'self' pointer. - */ - @Override - protected Object[] prepareCArguments(VirtualFrame frame) { - Object[] objects = super.prepareCArguments(frame); - if (getNativeSpacePointerNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - getNativeSpacePointerNode = insert(HPyGetNativeSpacePointerNodeGen.create()); - } - /* - * We now need to pass the native space pointer in a way that the PythonToNativeNode - * correctly exposes the bare pointer object. For this, we pack the pointer into a - * PythonAbstractNativeObject which will just be unwrapped. - */ - Object nativeSpacePtr = getNativeSpacePointerNode.executeCached(objects[0]); - if (nativeSpacePtr == PNone.NO_VALUE) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(this, SystemError, ErrorMessages.ATTEMPTING_GETTER_NO_NATIVE_SPACE); - } - objects[0] = new PythonAbstractNativeObject(nativeSpacePtr); - return objects; - } - - @TruffleBoundary - public static PBuiltinFunction createLegacyFunction(GraalHPyContext context, PythonLanguage lang, Object owner, TruffleString propertyName, Object target, Object closure) { - PythonContext pythonContext = context.getContext(); - PythonObjectFactory factory = pythonContext.factory(); - RootCallTarget rootCallTarget = lang.createCachedCallTarget(l -> new HPyLegacyGetSetDescriptorGetterRoot(l, propertyName, PExternalFunctionWrapper.GETTER), - HPyLegacyGetSetDescriptorGetterRoot.class, propertyName); - if (rootCallTarget == null) { - throw CompilerDirectives.shouldNotReachHere("Calling non-native get descriptor functions is not support in HPy"); - } - target = CExtContext.ensureExecutable(target, PExternalFunctionWrapper.GETTER); - return factory.createBuiltinFunction(propertyName, owner, PythonUtils.EMPTY_OBJECT_ARRAY, ExternalFunctionNodes.createKwDefaults(target, closure), 0, rootCallTarget); - } - } - - /** - * A simple and lightweight Python root node that invokes a native setter function. The native - * call target and the native closure pointer are passed as Python closure. - */ - static final class HPyGetSetDescriptorSetterRootNode extends HPyGetSetDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(-1, false, -1, false, tsArray("$self", "value"), KEYWORDS_HIDDEN_CALLABLE_AND_CLOSURE, true); - - private HPyGetSetDescriptorSetterRootNode(PythonLanguage language, TruffleString name) { - super(language, name); - } - - @Override - protected Object[] createArguments(VirtualFrame frame, Object closure) { - return new Object[]{PArguments.getArgument(frame, 0), PArguments.getArgument(frame, 1), closure}; - } - - @Override - protected HPyConvertArgsToSulongNode createArgumentConversionNode() { - return HPyGetSetSetterToSulongNodeGen.create(); - } - - @Override - protected HPyCheckFunctionResultNode createResultConversionNode() { - return HPyCheckPrimitiveResultNodeGen.create(); - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - - @TruffleBoundary - public static PBuiltinFunction createFunction(GraalHPyContext hpyContext, Object enclosingType, TruffleString propertyName, Object target, Object closure) { - PythonContext pythonContext = hpyContext.getContext(); - PythonLanguage lang = pythonContext.getLanguage(); - RootCallTarget callTarget = lang.createCachedCallTarget(l -> new HPyGetSetDescriptorSetterRootNode(l, propertyName), HPyGetSetDescriptorSetterRootNode.class, propertyName); - PythonObjectFactory factory = pythonContext.factory(); - return factory.createBuiltinFunction(propertyName, enclosingType, PythonUtils.EMPTY_OBJECT_ARRAY, createKwDefaults(target, closure, hpyContext), 0, callTarget); - } - - } - - static final class HPyLegacyGetSetDescriptorSetterRoot extends SetterRoot { - - @Child private HPyGetNativeSpacePointerNode getNativeSpacePointerNode; - - private HPyLegacyGetSetDescriptorSetterRoot(PythonLanguage language, TruffleString name, PExternalFunctionWrapper provider) { - super(language, name, provider); - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame) { - Object[] objects = super.prepareCArguments(frame); - if (getNativeSpacePointerNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - getNativeSpacePointerNode = insert(HPyGetNativeSpacePointerNodeGen.create()); - } - /* - * We now need to pass the native space pointer in a way that the PythonToNativeNode - * correctly exposes the bare pointer object. For this, we pack the pointer into a - * PythonAbstractNativeObject which will just be unwrapped. - */ - Object nativeSpacePtr = getNativeSpacePointerNode.executeCached(objects[0]); - if (nativeSpacePtr == PNone.NO_VALUE) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(this, SystemError, ErrorMessages.ATTEMPTING_SETTER_NO_NATIVE_SPACE); - } - objects[0] = new PythonAbstractNativeObject(nativeSpacePtr); - return objects; - } - - @TruffleBoundary - public static PBuiltinFunction createLegacyFunction(GraalHPyContext context, PythonLanguage lang, Object owner, TruffleString propertyName, Object target, Object closure) { - PythonContext pythonContext = context.getContext(); - PythonObjectFactory factory = pythonContext.factory(); - RootCallTarget rootCallTarget = lang.createCachedCallTarget(l -> new HPyLegacyGetSetDescriptorSetterRoot(l, propertyName, PExternalFunctionWrapper.SETTER), - HPyLegacyGetSetDescriptorSetterRoot.class, propertyName); - if (rootCallTarget == null) { - throw CompilerDirectives.shouldNotReachHere("Calling non-native get descriptor functions is not support in HPy"); - } - target = CExtContext.ensureExecutable(target, PExternalFunctionWrapper.SETTER); - return factory.createBuiltinFunction(propertyName, owner, PythonUtils.EMPTY_OBJECT_ARRAY, ExternalFunctionNodes.createKwDefaults(target, closure), 0, rootCallTarget); - } - } - - /** - * Root node to call a C functions with signature - * {@code int (*HPyFunc_getbufferproc)(HPyContext ctx, HPy self, HPy_buffer *buffer, int flags)} - * . The {@code buffer} arguments will be created by this root node since it needs the C - * extension context and the result of a call to this function is an instance of - * {@link CExtPyBuffer}. - */ - static final class HPyGetBufferRootNode extends HPyMethodDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(-1, false, 1, false, tsArray("self", "flags"), KEYWORDS_HIDDEN_CALLABLE); - - @Child private ReadIndexedArgumentNode readArg1Node; - @Child private FromCharPointerNode fromCharPointerNode; - @Child private GraalHPyCAccess.AllocateNode allocateNode; - @Child private GraalHPyCAccess.FreeNode freeNode; - @Child private GraalHPyCAccess.ReadPointerNode readPointerNode; - @Child private GraalHPyCAccess.ReadGenericNode readGenericNode; - @Child private GraalHPyCAccess.ReadHPyNode readHPyNode; - @Child private GraalHPyCAccess.IsNullNode isNullNode; - - @TruffleBoundary - public HPyGetBufferRootNode(PythonLanguage language, TruffleString name) { - super(language, name, HPyCheckPrimitiveResultNodeGen.create(), HPyGetBufferProcToSulongNodeGen.create()); - } - - @Override - public CExtPyBuffer execute(VirtualFrame frame) { - getCalleeContext().enter(frame); - Object bufferPtr = null; - GraalHPyContext hpyContext = null; - try { - Object callable = ensureReadCallableNode().execute(frame); - hpyContext = readContext(frame); - bufferPtr = ensureAllocateNode(hpyContext).malloc(hpyContext, HPyContextSignatureType.HPy_buffer); - Object[] cArguments = new Object[]{getSelf(frame), bufferPtr, getArg1(frame)}; - getInvokeNode().execute(frame, getTSName(), callable, hpyContext, cArguments); - return createPyBuffer(hpyContext, bufferPtr); - } finally { - if (hpyContext != null && bufferPtr != null) { - ensureFreeNode(hpyContext).free(hpyContext, bufferPtr); - } - getCalleeContext().exit(frame, this); - } - } - - /** - * Reads the values from C struct {@code HPy_buffer}, converts them appropriately and - * creates an instance of {@link CExtPyBuffer}. - * - *
      -         *     typedef struct {
      -         *         void *buf;
      -         *         HPy obj;
      -         *         Py_ssize_t len;
      -         *         Py_ssize_t itemsize;
      -         *         int readonly;
      -         *         int ndim;
      -         *         char *format;
      -         *         Py_ssize_t *shape;
      -         *         Py_ssize_t *strides;
      -         *         Py_ssize_t *suboffsets;
      -         *         void *internal;
      -         * } HPy_buffer;
      -         * 
      - * - */ - private CExtPyBuffer createPyBuffer(GraalHPyContext ctx, Object bufferPtr) { - if (readGenericNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readGenericNode = insert(GraalHPyCAccess.ReadGenericNode.create(ctx)); - } - if (readPointerNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readPointerNode = insert(GraalHPyCAccess.ReadPointerNode.create(ctx)); - } - if (readHPyNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readHPyNode = insert(GraalHPyCAccess.ReadHPyNode.create(ctx)); - } - if (isNullNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - isNullNode = insert(GraalHPyCAccess.IsNullNode.create(ctx)); - } - if (fromCharPointerNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - fromCharPointerNode = insert(FromCharPointerNodeGen.create()); - } - int len = readGenericNode.readInt(ctx, bufferPtr, GraalHPyCField.HPy_buffer__len); - Object buf = readPointerNode.read(ctx, bufferPtr, GraalHPyCField.HPy_buffer__buf); - /* - * Since we are now the owner of the handle and no one else will ever use it, we need to - * close it. - */ - Object owner = readHPyNode.readAndClose(ctx, bufferPtr, GraalHPyCField.HPy_buffer__obj); - - int ndim = readGenericNode.readInt(ctx, bufferPtr, GraalHPyCField.HPy_buffer__ndim); - int itemSize = readGenericNode.readInt(ctx, bufferPtr, GraalHPyCField.HPy_buffer__itemsize); - boolean readonly = readGenericNode.readInt(ctx, bufferPtr, GraalHPyCField.HPy_buffer__readonly) != 0; - TruffleString format = fromCharPointerNode.execute(readPointerNode.read(ctx, bufferPtr, GraalHPyCField.HPy_buffer__format)); - Object shapePtr = readPointerNode.read(ctx, bufferPtr, GraalHPyCField.HPy_buffer__shape); - Object stridesPtr = readPointerNode.read(ctx, bufferPtr, GraalHPyCField.HPy_buffer__strides); - Object suboffsetsPtr = readPointerNode.read(ctx, bufferPtr, GraalHPyCField.HPy_buffer__suboffsets); - Object internal = readPointerNode.read(ctx, bufferPtr, GraalHPyCField.HPy_buffer__internal); - int[] shape = null; - int[] strides = null; - int[] subOffsets = null; - if (ndim > 0) { - if (!isNullNode.execute(ctx, shapePtr)) { - shape = readLongAsIntArray(ctx, shapePtr, ndim); - } - if (!isNullNode.execute(ctx, stridesPtr)) { - strides = readLongAsIntArray(ctx, stridesPtr, ndim); - } - if (!isNullNode.execute(ctx, suboffsetsPtr)) { - subOffsets = readLongAsIntArray(ctx, suboffsetsPtr, ndim); - } - } - return new CExtPyBuffer(buf, owner, len, itemSize, readonly, ndim, format, shape, strides, subOffsets, internal); - } - - private int[] readLongAsIntArray(GraalHPyContext ctx, Object pointer, int elements) { - GraalHPyCAccess.ReadGenericNode readI64Node = ensureReadGenericNode(ctx); - int elemSize = ctx.getCTypeSize(HPyContextSignatureType.HPy_ssize_t); - int[] result = new int[elements]; - for (int i = 0; i < result.length; i++) { - result[i] = readI64Node.executeInt(ctx, pointer, (long) i * elemSize, HPyContextSignatureType.HPy_ssize_t); - } - return result; - } - - private GraalHPyCAccess.AllocateNode ensureAllocateNode(GraalHPyContext ctx) { - if (allocateNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - allocateNode = insert(GraalHPyCAccess.AllocateNode.create(ctx)); - } - return allocateNode; - } - - private GraalHPyCAccess.FreeNode ensureFreeNode(GraalHPyContext ctx) { - if (freeNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - freeNode = insert(GraalHPyCAccess.FreeNode.create(ctx)); - } - return freeNode; - } - - private GraalHPyCAccess.ReadGenericNode ensureReadGenericNode(GraalHPyContext ctx) { - if (readGenericNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readGenericNode = insert(GraalHPyCAccess.ReadGenericNode.create(ctx)); - } - return readGenericNode; - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, GraalHPyContext hpyContext) { - throw CompilerDirectives.shouldNotReachHere(); - } - - private Object getArg1(VirtualFrame frame) { - if (readArg1Node == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readArg1Node = insert(ReadIndexedArgumentNode.create(1)); - } - return readArg1Node.execute(frame); - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - } - - /** - * Root node to call a C functions with signature - * {@code void (*HPyFunc_releasebufferproc)(HPyContext ctx, HPy self, HPy_buffer *buffer)} . - */ - static final class HPyReleaseBufferRootNode extends HPyMethodDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(-1, false, 1, false, tsArray("self", "buffer"), KEYWORDS_HIDDEN_CALLABLE); - - @Child private ReadIndexedArgumentNode readArg1Node; - @Child private GraalHPyCAccess.FreeNode freeNode; - @Child private GraalHPyCAccess.ReadPointerNode readPointerNode; - @Child private GraalHPyCAccess.ReadHPyNode readHPyNode; - - @TruffleBoundary - public HPyReleaseBufferRootNode(PythonLanguage language, TruffleString name) { - super(language, name, HPyCheckVoidResultNodeGen.create(), HPyReleaseBufferProcToSulongNodeGen.create()); - } - - @Override - public Object execute(VirtualFrame frame) { - getCalleeContext().enter(frame); - try { - Object callable = ensureReadCallableNode().execute(frame); - GraalHPyContext hpyContext = readContext(frame); - Object arg1 = getArg1(frame); - if (!(arg1 instanceof CExtPyBuffer buffer)) { - throw CompilerDirectives.shouldNotReachHere("invalid argument"); - } - GraalHPyBuffer hpyBuffer = new GraalHPyBuffer(hpyContext, buffer); - try { - getInvokeNode().execute(frame, getTSName(), callable, hpyContext, new Object[]{getSelf(frame), hpyBuffer}); - } finally { - if (hpyBuffer.isPointer()) { - hpyBuffer.free(hpyContext, ensureFreeNode(hpyContext), ensureReadPointerNode(hpyContext), ensureReadHPyNode(hpyContext)); - } - } - return PNone.NONE; - } finally { - getCalleeContext().exit(frame, this); - } - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, GraalHPyContext hpyContext) { - throw CompilerDirectives.shouldNotReachHere(); - } - - @Override - protected Object processResult(VirtualFrame frame, Object result) { - throw CompilerDirectives.shouldNotReachHere(); - } - - private Object getArg1(VirtualFrame frame) { - if (readArg1Node == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readArg1Node = insert(ReadIndexedArgumentNode.create(1)); - } - return readArg1Node.execute(frame); - } - - private GraalHPyCAccess.FreeNode ensureFreeNode(GraalHPyContext ctx) { - if (freeNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - freeNode = insert(GraalHPyCAccess.FreeNode.create(ctx)); - } - return freeNode; - } - - private GraalHPyCAccess.ReadPointerNode ensureReadPointerNode(GraalHPyContext ctx) { - if (readPointerNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readPointerNode = insert(GraalHPyCAccess.ReadPointerNode.create(ctx)); - } - return readPointerNode; - } - - private GraalHPyCAccess.ReadHPyNode ensureReadHPyNode(GraalHPyContext ctx) { - if (readHPyNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readHPyNode = insert(GraalHPyCAccess.ReadHPyNode.create(ctx)); - } - return readHPyNode; - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - } - - /** - * Very similar to {@link HPyMethNoargsRoot} but converts the result to a boolean. - */ - static final class HPyMethHashRoot extends HPyMethodDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(-1, false, -1, false, tsArray("self"), KEYWORDS_HIDDEN_CALLABLE); - - public HPyMethHashRoot(PythonLanguage language, TruffleString name) { - super(language, name, HPyCheckPrimitiveResultNodeGen.create(), HPyAllAsHandleNodeGen.create()); - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, @SuppressWarnings("unused") GraalHPyContext hpyContext) { - return new Object[]{getSelf(frame)}; - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - } - - static final class HPyMethCallRoot extends HPyMethodDescriptorRootNode { - private static final Signature SIGNATURE = new Signature(-1, true, 1, false, tsArray("self"), KEYWORDS_HIDDEN_CONTEXT, true); - - @Child private ReadVarArgsNode readVarargsNode; - @Child private ReadVarKeywordsNode readKwargsNode; - @Child private PythonObjectFactory factory; - - @TruffleBoundary - public HPyMethCallRoot(PythonLanguage language, TruffleString name) { - super(language, name, HPyKeywordsToSulongNodeGen.create()); - } - - @Override - public Object execute(VirtualFrame frame) { - GraalHPyContext hpyContext = readContext(frame); - Object[] cArguments = prepareCArguments(frame, hpyContext); - Object self = cArguments[0]; - Object callable; - if (self instanceof PythonObject pythonObject) { - callable = GraalHPyData.getHPyCallFunction(pythonObject); - } else { - callable = null; - } - if (callable == null) { - throw PRaiseNode.raiseUncached(this, TypeError, ErrorMessages.HPY_OBJECT_DOES_NOT_SUPPORT_CALL, self); - } - - getCalleeContext().enter(frame); - try { - return getInvokeNode().execute(frame, getTSName(), callable, hpyContext, cArguments); - } finally { - getCalleeContext().exit(frame, this); - closeCArguments(frame, hpyContext, cArguments); - } - } - - @Override - protected Object[] prepareCArguments(VirtualFrame frame, GraalHPyContext hpyContext) { - Object[] positionalArgs = getVarargs(frame); - PKeyword[] keywords = getKwargs(frame); - long nPositionalArgs = positionalArgs.length; - - Object[] args; - Object kwnamesTuple; - // this condition is implicitly profiled by 'getKwnamesTuple' - if (keywords.length > 0) { - args = PythonUtils.arrayCopyOf(positionalArgs, positionalArgs.length + keywords.length); - TruffleString[] kwnames = new TruffleString[keywords.length]; - for (int i = 0; i < keywords.length; i++) { - args[positionalArgs.length + i] = keywords[i].getValue(); - kwnames[i] = keywords[i].getName(); - } - kwnamesTuple = getKwnamesTuple(kwnames); - } else { - args = positionalArgs; - kwnamesTuple = GraalHPyHandle.NULL_HANDLE_DELEGATE; - } - return new Object[]{getSelf(frame), createArgumentsArray(hpyContext, args), nPositionalArgs, kwnamesTuple}; - } - - @Override - protected void closeCArguments(VirtualFrame frame, GraalHPyContext hpyContext, Object[] cArguments) { - hpyContext.freeArgumentsArray(cArguments[1]); - } - - private Object createArgumentsArray(GraalHPyContext hpyContext, Object[] args) { - return hpyContext.createArgumentsArray(args); - } - - private Object[] getVarargs(VirtualFrame frame) { - if (readVarargsNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readVarargsNode = insert(ReadVarArgsNode.create(true)); - } - return readVarargsNode.executeObjectArray(frame); - } - - private PKeyword[] getKwargs(VirtualFrame frame) { - if (PArguments.getKeywordArguments(frame).length == 0) { - return PKeyword.EMPTY_KEYWORDS; - } - if (readKwargsNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - readKwargsNode = insert(ReadVarKeywordsNode.create()); - } - return (PKeyword[]) readKwargsNode.execute(frame); - } - - private PTuple getKwnamesTuple(TruffleString[] kwnames) { - if (factory == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - factory = insert(PythonObjectFactory.create()); - } - return factory.createTuple(kwnames); - } - - @Override - public Signature getSignature() { - return SIGNATURE; - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyMode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyMode.java deleted file mode 100644 index 0191a7054a..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyMode.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; - -public enum HPyMode { - MODE_INVALID(-1), - MODE_UNIVERSAL(0), - MODE_DEBUG(1), - MODE_TRACE(2); - /* - * We do currently not test the combinations of debug and trace mode, so we do not offer them - * right now. This may change in future. - */ - // DEBUG_TRACE(3), - // TRACE_DEBUG(4) - - private final int value; - - HPyMode(int value) { - this.value = value; - } - - public int getValue() { - return value; - } - - @TruffleBoundary - public static HPyMode fromValue(int i) { - for (HPyMode mode : values()) { - if (mode.value == i) { - return mode; - } - } - return MODE_INVALID; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyTypeExtra.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyTypeExtra.java deleted file mode 100644 index 16a6c18c4e..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyTypeExtra.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -public final class HPyTypeExtra { - public final long flags; - public final long basicSize; - public final long itemSize; - public final Object tpName; - public final int builtinShape; - - public Object defaultCallFunc; - public Object hpyDestroyFunc; - public long vectorcallOffset = Long.MIN_VALUE; - - public HPyTypeExtra(long flags, long basicSize, long itemSize, Object tpName, int builtinShape) { - this.flags = flags; - this.basicSize = basicSize; - this.itemSize = itemSize; - this.tpName = tpName; - this.builtinShape = builtinShape; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/PythonHPyObject.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/PythonHPyObject.java deleted file mode 100644 index a632fa184e..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/PythonHPyObject.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy; - -import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.truffle.api.object.Shape; - -public final class PythonHPyObject extends PythonObject { - - public PythonHPyObject(Object pythonClass, Shape instanceShape, Object hpyNativeSpace) { - super(pythonClass, instanceShape); - if (hpyNativeSpace != null) { - GraalHPyData.setHPyNativeSpace(this, hpyNativeSpace); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/jni/GraalHPyJNICallHelperFunctionNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/jni/GraalHPyJNICallHelperFunctionNode.java deleted file mode 100644 index 237f547787..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/jni/GraalHPyJNICallHelperFunctionNode.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy.jni; - -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNativeSymbol; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyCallHelperFunctionNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.HPyJNIFromCharPointerNode; -import com.oracle.truffle.api.CompilerDirectives; - -/** - * This is the implementation of {@link HPyCallHelperFunctionNode} for the JNI backend. This node - * calls helper functions also via JNI. The goal of this node is minimal footprint and best - * uncached/interpreter performance. - */ -final class GraalHPyJNICallHelperFunctionNode extends HPyCallHelperFunctionNode { - - static final GraalHPyJNICallHelperFunctionNode UNCACHED = new GraalHPyJNICallHelperFunctionNode(); - - private GraalHPyJNICallHelperFunctionNode() { - } - - @Override - protected Object execute(GraalHPyContext context, GraalHPyNativeSymbol name, Object[] args) { - assert context.getBackend() instanceof GraalHPyJNIContext; - return switch (name) { - case GRAAL_HPY_GET_ERRNO -> GraalHPyJNIContext.getErrno(); - case GRAAL_HPY_GET_STRERROR -> GraalHPyJNIContext.getStrerror((int) args[0]); - case GRAAL_HPY_STRLEN -> HPyJNIFromCharPointerNode.strlen((long) args[0]); - default -> throw CompilerDirectives.shouldNotReachHere("not yet implemented"); - }; - } - - @Override - public boolean isAdoptable() { - return false; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/jni/GraalHPyJNIContext.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/jni/GraalHPyJNIContext.java deleted file mode 100644 index 890ac8db1d..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/jni/GraalHPyJNIContext.java +++ /dev/null @@ -1,3036 +0,0 @@ -/* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy.jni; - -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError; -import static com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.UNSAFE; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.IMMUTABLE_HANDLE_COUNT; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.SINGLETON_HANDLE_ELIPSIS; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.SINGLETON_HANDLE_NONE; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.SINGLETON_HANDLE_NOT_IMPLEMENTED; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.SIZEOF_LONG; -import static com.oracle.graal.python.nodes.StringLiterals.J_DEBUG; -import static com.oracle.graal.python.nodes.StringLiterals.J_NFI_LANGUAGE; -import static com.oracle.graal.python.nodes.StringLiterals.J_TRACE; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; -import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; -import static com.oracle.graal.python.util.PythonUtils.tsLiteral; - -import java.io.IOException; -import java.nio.file.LinkOption; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; -import java.util.Objects; - -import org.graalvm.nativeimage.ImageInfo; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.PNotImplemented; -import com.oracle.graal.python.builtins.objects.bytes.PBytes; -import com.oracle.graal.python.builtins.objects.capsule.PyCapsule; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodesFactory.AsNativePrimitiveNodeGen; -import com.oracle.graal.python.builtins.objects.cext.common.CExtContext; -import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ApiInitException; -import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ImportException; -import com.oracle.graal.python.builtins.objects.cext.common.NativePointer; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyBoxing; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.AllocateNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.BulkFreeHandleReferencesNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.FreeNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.GetElementPtrNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.IsNullNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadDoubleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadFloatNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadGenericNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadHPyArrayNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadHPyFieldNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadHPyNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadI32Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadI64Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadI8ArrayNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadPointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteDoubleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteGenericNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteHPyFieldNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteHPyNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteI32Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteI64Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WritePointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteSizeTNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCField; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.HPyABIVersion; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.HPyUpcall; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctions; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctions.CapsuleKey; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctions.GraalHPyCapsuleGet; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctions.GraalHPyContextFunction; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctions.GraalHPyContextVarGet; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctions.HPyBinaryContextFunction; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctions.HPyTernaryContextFunction; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyData; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyHandle; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNativeContext; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyAsCharPointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyCallHelperFunctionNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyFromCharPointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyGetNativeSpacePointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyRaiseNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyTransformExceptionToNativeNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyTypeGetNameNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.GraalHPyModuleCreateNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.GraalHPyModuleExecNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyAsNativeInt64NodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyAsPythonObjectNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyPackKeywordArgsNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyRaiseNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextMember; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignature; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyMode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeAllocateNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeBulkFreeHandleReferencesNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeFreeNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeGetElementPtrNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeIsNullNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeReadDoubleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeReadFloatNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeReadGenericNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeReadHPyArrayNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeReadHPyFieldNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeReadHPyNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeReadI32Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeReadI64Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeReadI8ArrayNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeReadPointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeWriteDoubleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeWriteGenericNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeWriteHPyFieldNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeWriteHPyNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeWriteI32Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeWriteI64Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeWritePointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodes.UnsafeWriteSizeTNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodesFactory.HPyJNIAsCharPointerNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNINodesFactory.HPyJNIFromCharPointerNodeGen; -import com.oracle.graal.python.builtins.objects.common.EconomicMapStorage; -import com.oracle.graal.python.builtins.objects.common.EmptyStorage; -import com.oracle.graal.python.builtins.objects.common.HashingStorage; -import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItem; -import com.oracle.graal.python.builtins.objects.contextvars.PContextVar; -import com.oracle.graal.python.builtins.objects.dict.PDict; -import com.oracle.graal.python.builtins.objects.ellipsis.PEllipsis; -import com.oracle.graal.python.builtins.objects.function.PKeyword; -import com.oracle.graal.python.builtins.objects.ints.PInt; -import com.oracle.graal.python.builtins.objects.list.PList; -import com.oracle.graal.python.builtins.objects.module.PythonModule; -import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; -import com.oracle.graal.python.builtins.objects.type.PythonClass; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode; -import com.oracle.graal.python.lib.CanBeDoubleNode; -import com.oracle.graal.python.lib.PyFloatAsDoubleNode; -import com.oracle.graal.python.lib.PyIndexCheckNode; -import com.oracle.graal.python.lib.PyLongAsDoubleNode; -import com.oracle.graal.python.lib.PyObjectGetAttr; -import com.oracle.graal.python.lib.PyObjectGetItem; -import com.oracle.graal.python.lib.PyObjectSetItem; -import com.oracle.graal.python.lib.PyObjectSizeNodeGen; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PGuards; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; -import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.call.special.CallTernaryMethodNode; -import com.oracle.graal.python.nodes.classes.IsSubtypeNode; -import com.oracle.graal.python.nodes.classes.IsSubtypeNodeGen; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.object.GetOrCreateDictNode; -import com.oracle.graal.python.nodes.object.IsNodeGen; -import com.oracle.graal.python.nodes.util.CannotCastException; -import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; -import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.PythonImageBuildOptions; -import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.runtime.PythonOptions.HPyBackendMode; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectSlowPathFactory; -import com.oracle.graal.python.runtime.sequence.PSequence; -import com.oracle.graal.python.runtime.sequence.storage.DoubleSequenceStorage; -import com.oracle.graal.python.runtime.sequence.storage.IntSequenceStorage; -import com.oracle.graal.python.runtime.sequence.storage.LongSequenceStorage; -import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage; -import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; -import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.TruffleFile; -import com.oracle.truffle.api.TruffleLogger; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.UnknownIdentifierException; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.library.ExportLibrary; -import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.source.Source; -import com.oracle.truffle.api.strings.InternalByteArray; -import com.oracle.truffle.api.strings.NativeAllocator; -import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.api.strings.TruffleString.AsNativeNode; -import com.oracle.truffle.api.strings.TruffleString.Encoding; -import com.oracle.truffle.api.strings.TruffleString.GetInternalByteArrayNode; -import com.oracle.truffle.api.strings.TruffleString.GetInternalNativePointerNode; -import com.oracle.truffle.api.strings.TruffleString.SwitchEncodingNode; - -/** - * This object is used to override specific native upcall pointers in the HPyContext. This is - * queried for every member of HPyContext by {@code graal_hpy_context_to_native}, and overrides the - * original values (which are NFI closures for functions in {@code hpy.c}, subsequently calling into - * {@link GraalHPyContextFunctions}. - */ -@ExportLibrary(InteropLibrary.class) -public final class GraalHPyJNIContext extends GraalHPyNativeContext { - - private static final String J_NAME = "HPy Universal ABI (GraalVM JNI backend)"; - - private static final TruffleLogger LOGGER = GraalHPyContext.getLogger(GraalHPyJNIContext.class); - - static final NativeAllocator TS_NATIVE_ALLOCATOR = byteSize -> new NativePointer(UNSAFE.allocateMemory(byteSize)); - - private static boolean jniBackendLoaded = false; - - private final PythonObjectSlowPathFactory slowPathFactory; - private final int[] counts; - - private final int[] ctypeSizes; - private final int[] cfieldOffsets; - - private long hPyDebugContext; - private long hPyTraceContext; - private long nativePointer; - - /** - * This list holds a strong reference to all loaded extension libraries to keep the library - * objects alive. This is necessary because NFI will {@code dlclose} the library (and thus - * {@code munmap} all code) if the library object is no longer reachable. However, it can happen - * that we still store raw function pointers (as Java {@code long} values) in - * {@link GraalHPyJNIFunctionPointer} objects which are invoked asynchronously. For - * example, destroy functions will be executed on a different thread some time after the object - * died. Buffer release functions run on the main thread but like an async action at some - * unknown point in time after the buffer owner died. - * - * Since we have no control over the execution order of those cleaners, we need to ensure that - * the code is still mapped. - */ - private final List loadedExtensions = new LinkedList<>(); - - public GraalHPyJNIContext(GraalHPyContext context, boolean traceUpcalls) { - super(context, traceUpcalls); - assert !PythonImageBuildOptions.WITHOUT_JNI; - this.slowPathFactory = context.getContext().factory(); - this.counts = traceUpcalls ? new int[HPyJNIUpcall.VALUES.length] : null; - this.ctypeSizes = new int[HPyContextSignatureType.values().length]; - this.cfieldOffsets = new int[GraalHPyCField.values().length]; - } - - @Override - protected String getName() { - return J_NAME; - } - - @Override - protected Object loadExtensionLibrary(Node location, PythonContext context, TruffleString name, TruffleString path) throws ImportException { - CompilerAsserts.neverPartOfCompilation(); - TruffleFile extLibFile = context.getPublicTruffleFileRelaxed(path, context.getSoAbi()); - try { - /* - * Even in the JNI backend, we load the library with NFI (instead of using - * 'System.load') because NFI may take care of additional security checks. - */ - String src = "load \"" + extLibFile + '"'; - Source loadSrc = Source.newBuilder(J_NFI_LANGUAGE, src, "load:" + name).internal(true).build(); - Object extLib = context.getEnv().parseInternal(loadSrc).call(); - loadedExtensions.add(extLib); - return extLib; - } catch (SecurityException e) { - throw new ImportException(CExtContext.wrapJavaException(e, location), name, path, ErrorMessages.CANNOT_LOAD_M, path, e); - } - } - - @Override - protected HPyABIVersion getHPyABIVersion(Object extLib, String getMajorVersionFuncName, String getMinorVersionFuncName) throws UnknownIdentifierException { - CompilerAsserts.neverPartOfCompilation(); - try { - InteropLibrary lib = InteropLibrary.getUncached(extLib); - Object majorVersionFun = lib.readMember(extLib, getMajorVersionFuncName); - Object minorVersionFun = lib.readMember(extLib, getMinorVersionFuncName); - int requiredMajorVersion = (int) GraalHPyJNITrampolines.executeModuleInit(coerceToPointer(majorVersionFun)); - int requiredMinorVersion = (int) GraalHPyJNITrampolines.executeModuleInit(coerceToPointer(minorVersionFun)); - return new HPyABIVersion(requiredMajorVersion, requiredMinorVersion); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - } - - @Override - protected Object initHPyModule(Object extLib, String initFuncName, TruffleString name, TruffleString path, HPyMode mode) - throws ImportException, ApiInitException { - CompilerAsserts.neverPartOfCompilation(); - /* - * We eagerly initialize the debug mode here to be able to produce an error message now if - * we cannot use it. - */ - if (Objects.requireNonNull(mode) == HPyMode.MODE_DEBUG) { - initHPyDebugContext(); - } else if (mode == HPyMode.MODE_TRACE) { - initHPyTraceContext(); - } - - Object initFunction; - try { - InteropLibrary lib = InteropLibrary.getUncached(extLib); - initFunction = lib.readMember(extLib, initFuncName); - } catch (UnknownIdentifierException | UnsupportedMessageException e1) { - throw new ImportException(null, name, path, ErrorMessages.CANNOT_INITIALIZE_EXT_NO_ENTRY, name, path, initFuncName); - } - // NFI doesn't know if a symbol is executable, so it always reports false - assert !InteropLibrary.getUncached().isExecutable(initFunction); - - // coerce 'initFunction' to a native pointer and invoke it via JNI trampoline - long moduleDefPtr; - moduleDefPtr = GraalHPyJNITrampolines.executeModuleInit(coerceToPointer(initFunction)); - return convertLongArg(HPyContextSignatureType.HPyModuleDefPtr, moduleDefPtr); - } - - @Override - protected HPyUpcall[] getUpcalls() { - return HPyJNIUpcall.VALUES; - } - - @Override - protected int[] getUpcallCounts() { - return counts; - } - - @Override - protected int getCTypeSize(HPyContextSignatureType ctype) { - return ctypeSizes[ctype.ordinal()]; - } - - @Override - protected int getCFieldOffset(GraalHPyCField cfield) { - return cfieldOffsets[cfield.ordinal()]; - } - - @Override - protected NativePointer nativeToInteropPointer(Object object) { - assert object instanceof Long; - return new NativePointer((Long) object); - } - - static long interopPointerToNative(Object object, InteropLibrary lib) { - if (!lib.isPointer(object)) { - lib.toNative(object); - } - try { - return lib.asPointer(object); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } - - @Override - protected Object getNativeNull() { - return 0L; - } - - @ExportMessage - boolean isPointer() { - return nativePointer != 0; - } - - @ExportMessage - long asPointer() throws UnsupportedMessageException { - if (isPointer()) { - return nativePointer; - } - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw UnsupportedMessageException.create(); - } - - /** - * Internal method for transforming the HPy universal context to native. This is mostly like the - * interop message {@code toNative} but may of course fail if native access is not allowed. This - * method can be used to force the context to native if a native pointer is needed that will be - * handed to a native (e.g. JNI or NFI) function. - */ - @Override - protected void toNativeInternal() { - if (nativePointer == 0) { - CompilerDirectives.transferToInterpreter(); - assert PythonLanguage.get(null).getEngineOption(PythonOptions.HPyBackend) == HPyBackendMode.JNI; - if (!getContext().getEnv().isNativeAccessAllowed()) { - throw new RuntimeException(ErrorMessages.NATIVE_ACCESS_NOT_ALLOWED.toJavaStringUncached()); - } - loadJNIBackend(); - nativePointer = initJNI(this, context, createContextHandleArray(), ctypeSizes, cfieldOffsets); - if (nativePointer == 0) { - throw CompilerDirectives.shouldNotReachHere("Could not initialize HPy JNI backend."); - } - } - } - - @Override - protected void initNativeFastPaths() { - /* - * Currently, the native fast path functions are only available if the JNI backend is used - * because they rely on 'initJNI' being called. In the future, we might also want to use the - * native fast path functions for the NFI backend. - */ - assert useNativeFastPaths(); - initJNINativeFastPaths(nativePointer); - } - - @SuppressWarnings("restricted") - public static void loadJNIBackend() { - if (!(ImageInfo.inImageBuildtimeCode() || jniBackendLoaded)) { - String pythonJNIPath; - pythonJNIPath = getJNILibrary(); - try { - LOGGER.fine("Loading HPy JNI backend from " + pythonJNIPath); - System.load(pythonJNIPath); - jniBackendLoaded = true; - } catch (NullPointerException | UnsatisfiedLinkError e) { - LOGGER.severe("HPy JNI backend library could not be found: " + pythonJNIPath); - LOGGER.severe("Error was: " + e); - } - } - } - - public static String getJNILibrary() { - CompilerAsserts.neverPartOfCompilation(); - PythonContext context = PythonContext.get(null); - TruffleFile libPath = context.getPublicTruffleFileRelaxed(context.getJNIHome()).resolve(PythonContext.J_PYTHON_JNI_LIBRARY_NAME).getAbsoluteFile(); - try { - return libPath.getCanonicalFile(LinkOption.NOFOLLOW_LINKS).toString(); - } catch (IOException e) { - LOGGER.severe(String.format("Cannot determine canonical path for %s: %s", libPath, e)); - throw new IllegalStateException(e); - } - } - - @Override - protected void initNativeContext() { - /* - * We eagerly initialize any native resources (e.g. allocating off-heap memory for - * 'HPyContext') for the JNI backend because this method will be called if we are up to load - * an HPy extension module with the JNI backend and there is no way to run the JNI backend - * without native resources. - */ - toNative(); - } - - @Override - protected void finalizeNativeContext() { - finalizeJNIContext(nativePointer); - nativePointer = 0; - if (hPyDebugContext != 0) { - finalizeJNIDebugContext(hPyDebugContext); - hPyDebugContext = 0; - } - if (hPyTraceContext != 0) { - finalizeJNITraceContext(hPyTraceContext); - hPyTraceContext = 0; - } - loadedExtensions.clear(); - } - - @Override - public void initHPyDebugContext() throws ApiInitException { - if (hPyDebugContext == 0) { - CompilerDirectives.transferToInterpreter(); - if (!getContext().getEnv().isNativeAccessAllowed() || getContext().getLanguage().getEngineOption(PythonOptions.HPyBackend) != HPyBackendMode.JNI) { - throw new ApiInitException(ErrorMessages.HPY_S_MODE_NOT_AVAILABLE, J_DEBUG); - } - try { - toNativeInternal(); - long debugCtxPtr = initJNIDebugContext(nativePointer); - if (debugCtxPtr == 0) { - throw new RuntimeException("Could not initialize HPy debug context"); - } - hPyDebugContext = debugCtxPtr; - } catch (CannotCastException e) { - // TODO(fa): this can go away once 'isNativeAccessAllowed' is always correctly set - throw new ApiInitException(ErrorMessages.HPY_S_MODE_NOT_AVAILABLE, J_DEBUG); - } - } - } - - @Override - public void initHPyTraceContext() throws ApiInitException { - if (hPyTraceContext == 0) { - CompilerDirectives.transferToInterpreter(); - if (!getContext().getEnv().isNativeAccessAllowed() || getContext().getLanguage().getEngineOption(PythonOptions.HPyBackend) != HPyBackendMode.JNI) { - throw new ApiInitException(ErrorMessages.HPY_S_MODE_NOT_AVAILABLE, J_TRACE); - } - try { - toNativeInternal(); - long traceCtxPtr = initJNITraceContext(nativePointer); - if (traceCtxPtr == 0) { - throw new RuntimeException("Could not initialize HPy trace context"); - } - hPyTraceContext = traceCtxPtr; - } catch (CannotCastException e) { - // TODO(fa): this can go away once 'isNativeAccessAllowed' is always correctly set - throw new ApiInitException(ErrorMessages.HPY_S_MODE_NOT_AVAILABLE, "trace"); - } - } - } - - @Override - protected Object createArgumentsArray(Object[] args) { - return context.createNativeArguments(args); - } - - @Override - protected void freeArgumentsArray(Object argsArray) { - if (argsArray instanceof Long argsArrayPtr) { - context.freeNativeArgumentsUntil(argsArrayPtr); - } - } - - /** - * Equivalent of {@code hpy_debug_get_ctx}. In fact, this method is called from the native - * {@code hpy_jni.c: hpy_debug_get_ctx} function to get the debug context's pointer via JNI. So, - * if you change the name of this function, also modify {@code hpy_jni.c} appropriately. - */ - long getHPyDebugContext() { - /* - * It is a valid path that this method is called but the debug context has not yet been - * initialized. In particular, this can happen if the leak detector is used which calls - * methods of the native debug module. The native methods may call function - * 'hpy_debug_get_ctx' which upcalls to this method. All this may happen before any HPy - * extension was loaded with debug mode enabled. - */ - if (hPyDebugContext == 0) { - try { - initHPyDebugContext(); - } catch (ApiInitException e) { - throw CompilerDirectives.shouldNotReachHere(e.getMessage()); - } - } - return hPyDebugContext; - } - - @Override - @TruffleBoundary - public PythonModule getHPyDebugModule() throws ImportException { - // force the universal context to native; we need a real pointer for JNI - toNativeInternal(); - - // initialize the debug module via JNI - long debugModuleDef = initJNIDebugModule(nativePointer); - if (debugModuleDef == 0) { - throw new ImportException(null, null, null, ErrorMessages.HPY_S_MODE_NOT_AVAILABLE, "debug"); - } - return loadInternalModule(debugModuleDef, tsLiteral("_debug")); - } - - /** - * Equivalent of {@code hpy_trace_get_ctx}. In fact, this method is called from the native - * {@code hpy_jni.c: hpy_trace_get_ctx} function to get the debug context's pointer via JNI. So, - * if you change the name of this function, also modify {@code hpy_jni.c} appropriately. - */ - long getHPyTraceContext() { - /* - * It is a valid path that this method is called but the debug context has not yet been - * initialized. In particular, this can happen if the leak detector is used which calls - * methods of the native debug module. The native methods may call function - * 'hpy_debug_get_ctx' which upcalls to this method. All this may happen before any HPy - * extension was loaded with debug mode enabled. - */ - if (hPyTraceContext == 0) { - try { - initHPyTraceContext(); - } catch (ApiInitException e) { - throw CompilerDirectives.shouldNotReachHere(e.getMessage()); - } - } - return hPyTraceContext; - } - - @Override - @TruffleBoundary - public PythonModule getHPyTraceModule() throws ImportException { - // force the universal context to native; we need a real pointer for JNI - toNativeInternal(); - - // initialize the debug module via JNI - long debugModuleDef = initJNITraceModule(nativePointer); - if (debugModuleDef == 0) { - throw new ImportException(null, null, null, ErrorMessages.HPY_S_MODE_NOT_AVAILABLE, "trace"); - } - return loadInternalModule(debugModuleDef, tsLiteral("_trace")); - } - - private PythonModule loadInternalModule(long debugModuleDef, TruffleString name) { - CompilerAsserts.neverPartOfCompilation(); - assert getContext().getEnv().isNativeAccessAllowed(); - assert getContext().getLanguage().getEngineOption(PythonOptions.HPyBackend) == HPyBackendMode.JNI; - - /* - * Note: we don't need a 'spec' object since that's only required if the module has slot - * HPy_mod_create which is guaranteed to be missing in this case. - */ - Object moduleDefPtrObj = convertLongArg(HPyContextSignatureType.HPyModuleDefPtr, debugModuleDef); - Object nativeModule = GraalHPyModuleCreateNodeGen.getUncached().execute(context, name, null, moduleDefPtrObj); - if (nativeModule instanceof PythonModule pythonModule) { - GraalHPyModuleExecNodeGen.getUncached().execute(null, context, pythonModule); - return (PythonModule) nativeModule; - } - /* - * Since we have the internal modules fully under control, this is clearly an internal - * error. - */ - throw new RuntimeException(name.toJavaStringUncached() + " module is expected to be a Python module object"); - } - - @Override - protected void setNativeCache(long cachePtr) { - assert useNativeFastPaths(); - setNativeSpaceFunction(nativePointer, cachePtr); - } - - @Override - public HPyCallHelperFunctionNode createCallHelperFunctionNode() { - return GraalHPyJNICallHelperFunctionNode.UNCACHED; - } - - @Override - public HPyCallHelperFunctionNode getUncachedCallHelperFunctionNode() { - return GraalHPyJNICallHelperFunctionNode.UNCACHED; - } - - @Override - public HPyFromCharPointerNode createFromCharPointerNode() { - return HPyJNIFromCharPointerNodeGen.create(); - } - - @Override - public HPyFromCharPointerNode getUncachedFromCharPointerNode() { - return HPyJNIFromCharPointerNodeGen.getUncached(); - } - - @Override - public HPyAsCharPointerNode createAsCharPointerNode() { - return HPyJNIAsCharPointerNodeGen.create(); - } - - @Override - public HPyAsCharPointerNode getUncachedAsCharPointerNode() { - return HPyJNIAsCharPointerNodeGen.getUncached(); - } - - @Override - public AllocateNode createAllocateNode() { - return UnsafeAllocateNode.UNCACHED; - } - - @Override - public AllocateNode getUncachedAllocateNode() { - return UnsafeAllocateNode.UNCACHED; - } - - @Override - public FreeNode createFreeNode() { - return UnsafeFreeNode.UNCACHED; - } - - @Override - public FreeNode getUncachedFreeNode() { - return UnsafeFreeNode.UNCACHED; - } - - @Override - public BulkFreeHandleReferencesNode createBulkFreeHandleReferencesNode() { - return UnsafeBulkFreeHandleReferencesNode.UNCACHED; - } - - @Override - public GetElementPtrNode createGetElementPtrNode() { - return UnsafeGetElementPtrNode.UNCACHED; - } - - @Override - public GetElementPtrNode getUncachedGetElementPtrNode() { - return UnsafeGetElementPtrNode.UNCACHED; - } - - @Override - public ReadI32Node createReadI32Node() { - return UnsafeReadI32Node.UNCACHED; - } - - @Override - public ReadI32Node getUncachedReadI32Node() { - return UnsafeReadI32Node.UNCACHED; - } - - @Override - public ReadI64Node createReadI64Node() { - return UnsafeReadI64Node.UNCACHED; - } - - @Override - public ReadI64Node getUncachedReadI64Node() { - return UnsafeReadI64Node.UNCACHED; - } - - @Override - public ReadFloatNode createReadFloatNode() { - return UnsafeReadFloatNode.UNCACHED; - } - - @Override - public ReadFloatNode getUncachedReadFloatNode() { - return UnsafeReadFloatNode.UNCACHED; - } - - @Override - public ReadDoubleNode createReadDoubleNode() { - return UnsafeReadDoubleNode.UNCACHED; - } - - @Override - public ReadDoubleNode getUncachedReadDoubleNode() { - return UnsafeReadDoubleNode.UNCACHED; - } - - @Override - public ReadPointerNode createReadPointerNode() { - return UnsafeReadPointerNode.UNCACHED; - } - - @Override - public ReadPointerNode getUncachedReadPointerNode() { - return UnsafeReadPointerNode.UNCACHED; - } - - @Override - public IsNullNode createIsNullNode() { - return UnsafeIsNullNode.UNCACHED; - } - - @Override - public IsNullNode getUncachedIsNullNode() { - return UnsafeIsNullNode.UNCACHED; - } - - @Override - public ReadGenericNode createReadGenericNode() { - return UnsafeReadGenericNode.UNCACHED; - } - - @Override - public ReadGenericNode getUncachedReadGenericNode() { - return UnsafeReadGenericNode.UNCACHED; - } - - @Override - public ReadHPyNode createReadHPyNode() { - return UnsafeReadHPyNode.UNCACHED; - } - - @Override - public ReadHPyNode getUncachedReadHPyNode() { - return UnsafeReadHPyNode.UNCACHED; - } - - @Override - public ReadHPyFieldNode createReadHPyFieldNode() { - return UnsafeReadHPyFieldNode.UNCACHED; - } - - @Override - public ReadHPyFieldNode getUncachedReadFieldHPyNode() { - return UnsafeReadHPyFieldNode.UNCACHED; - } - - @Override - public WriteDoubleNode createWriteDoubleNode() { - return UnsafeWriteDoubleNode.UNCACHED; - } - - @Override - public WriteDoubleNode getUncachedWriteDoubleNode() { - return UnsafeWriteDoubleNode.UNCACHED; - } - - @Override - public WriteI32Node createWriteI32Node() { - return UnsafeWriteI32Node.UNCACHED; - } - - @Override - public WriteI32Node getUncachedWriteI32Node() { - return UnsafeWriteI32Node.UNCACHED; - } - - @Override - public WriteI64Node createWriteI64Node() { - return UnsafeWriteI64Node.UNCACHED; - } - - @Override - public WriteI64Node getUncachedWriteI64Node() { - return UnsafeWriteI64Node.UNCACHED; - } - - @Override - public WriteHPyNode createWriteHPyNode() { - return UnsafeWriteHPyNode.UNCACHED; - } - - @Override - public WriteHPyNode getUncachedWriteHPyNode() { - return UnsafeWriteHPyNode.UNCACHED; - } - - @Override - public WritePointerNode createWritePointerNode() { - return UnsafeWritePointerNode.UNCACHED; - } - - @Override - public WritePointerNode getUncachedWritePointerNode() { - return UnsafeWritePointerNode.UNCACHED; - } - - @Override - public ReadI8ArrayNode createReadI8ArrayNode() { - return UnsafeReadI8ArrayNode.UNCACHED; - } - - @Override - public ReadI8ArrayNode getUncachedReadI8ArrayNode() { - return UnsafeReadI8ArrayNode.UNCACHED; - } - - @Override - public ReadHPyArrayNode createReadHPyArrayNode() { - return UnsafeReadHPyArrayNode.UNCACHED; - } - - @Override - public ReadHPyArrayNode getUncachedReadHPyArrayNode() { - return UnsafeReadHPyArrayNode.UNCACHED; - } - - @Override - public WriteSizeTNode createWriteSizeTNode() { - return UnsafeWriteSizeTNode.UNCACHED; - } - - @Override - public WriteSizeTNode getUncachedWriteSizeTNode() { - return UnsafeWriteSizeTNode.UNCACHED; - } - - @Override - public WriteGenericNode createWriteGenericNode() { - return UnsafeWriteGenericNode.UNCACHED; - } - - @Override - public WriteGenericNode getUncachedWriteGenericNode() { - return UnsafeWriteGenericNode.UNCACHED; - } - - @Override - public WriteHPyFieldNode createWriteHPyFieldNode() { - return UnsafeWriteHPyFieldNode.UNCACHED; - } - - @Override - public WriteHPyFieldNode getUncachedWriteHPyFieldNode() { - return UnsafeWriteHPyFieldNode.UNCACHED; - } - - /* JNI helper functions */ - - @TruffleBoundary - public static native int strcmp(long s1, long s2); - - @TruffleBoundary - private static native int setNativeSpaceFunction(long uctxPointer, long cachePtr); - - @TruffleBoundary - private static native int initJNINativeFastPaths(long uctxPointer); - - @TruffleBoundary - public static native int getErrno(); - - @TruffleBoundary - public static native long getStrerror(int errno); - - /* HPY internal JNI trampoline declarations */ - - @TruffleBoundary - private static native long initJNI(GraalHPyJNIContext backend, GraalHPyContext hpyContext, long[] ctxHandles, int[] ctypeSizes, int[] cfieldOffsets); - - @TruffleBoundary - private static native int finalizeJNIContext(long uctxPointer); - - @TruffleBoundary - private static native long initJNIDebugContext(long uctxPointer); - - @TruffleBoundary - private static native int finalizeJNIDebugContext(long dctxPointer); - - @TruffleBoundary - private static native long initJNIDebugModule(long uctxPointer); - - @TruffleBoundary - private static native long initJNITraceContext(long uctxPointer); - - @TruffleBoundary - private static native int finalizeJNITraceContext(long dctxPointer); - - @TruffleBoundary - private static native long initJNITraceModule(long uctxPointer); - - @TruffleBoundary - static native void bulkFreeNativeSpace(long[] nativeSpacePtrs, long[] destroyFuncPtrs, int n); - - enum HPyJNIUpcall implements HPyUpcall { - HPyUnicodeFromJCharArray, - HPyBulkClose, - HPySequenceFromArray, - - // {{start jni upcalls}} - // @formatter:off - // Checkstyle: stop - // DO NOT EDIT THIS PART! - // This part is automatically generated by hpy.tools.autogen.graalpy.autogen_ctx_jni_upcall_enum - HPyDup, - HPyClose, - HPyLongFromInt32t, - HPyLongFromUInt32t, - HPyLongFromInt64t, - HPyLongFromUInt64t, - HPyLongFromSizet, - HPyLongFromSsizet, - HPyLongAsInt32t, - HPyLongAsUInt32t, - HPyLongAsUInt32tMask, - HPyLongAsInt64t, - HPyLongAsUInt64t, - HPyLongAsUInt64tMask, - HPyLongAsSizet, - HPyLongAsSsizet, - HPyLongAsVoidPtr, - HPyLongAsDouble, - HPyFloatFromDouble, - HPyFloatAsDouble, - HPyBoolFromBool, - HPyLength, - HPyNumberCheck, - HPyAdd, - HPySubtract, - HPyMultiply, - HPyMatrixMultiply, - HPyFloorDivide, - HPyTrueDivide, - HPyRemainder, - HPyDivmod, - HPyPower, - HPyNegative, - HPyPositive, - HPyAbsolute, - HPyInvert, - HPyLshift, - HPyRshift, - HPyAnd, - HPyXor, - HPyOr, - HPyIndex, - HPyLong, - HPyFloat, - HPyInPlaceAdd, - HPyInPlaceSubtract, - HPyInPlaceMultiply, - HPyInPlaceMatrixMultiply, - HPyInPlaceFloorDivide, - HPyInPlaceTrueDivide, - HPyInPlaceRemainder, - HPyInPlacePower, - HPyInPlaceLshift, - HPyInPlaceRshift, - HPyInPlaceAnd, - HPyInPlaceXor, - HPyInPlaceOr, - HPyCallableCheck, - HPyCallTupleDict, - HPyCall, - HPyCallMethod, - HPyFatalError, - HPyErrSetString, - HPyErrSetObject, - HPyErrSetFromErrnoWithFilename, - HPyErrSetFromErrnoWithFilenameObjects, - HPyErrOccurred, - HPyErrExceptionMatches, - HPyErrNoMemory, - HPyErrClear, - HPyErrNewException, - HPyErrNewExceptionWithDoc, - HPyErrWarnEx, - HPyErrWriteUnraisable, - HPyIsTrue, - HPyTypeFromSpec, - HPyTypeGenericNew, - HPyGetAttr, - HPyGetAttrs, - HPyHasAttr, - HPyHasAttrs, - HPySetAttr, - HPySetAttrs, - HPyGetItem, - HPyGetItemi, - HPyGetItems, - HPyContains, - HPySetItem, - HPySetItemi, - HPySetItems, - HPyDelItem, - HPyDelItemi, - HPyDelItems, - HPyType, - HPyTypeCheck, - HPyTypeGetName, - HPyTypeIsSubtype, - HPyIs, - HPyAsStructObject, - HPyAsStructLegacy, - HPyAsStructType, - HPyAsStructLong, - HPyAsStructFloat, - HPyAsStructUnicode, - HPyAsStructTuple, - HPyAsStructList, - HPyTypeGetBuiltinShape, - HPyNew, - HPyRepr, - HPyStr, - HPyASCII, - HPyBytes, - HPyRichCompare, - HPyRichCompareBool, - HPyHash, - HPyBytesCheck, - HPyBytesSize, - HPyBytesGETSIZE, - HPyBytesAsString, - HPyBytesASSTRING, - HPyBytesFromString, - HPyBytesFromStringAndSize, - HPyUnicodeFromString, - HPyUnicodeCheck, - HPyUnicodeAsASCIIString, - HPyUnicodeAsLatin1String, - HPyUnicodeAsUTF8String, - HPyUnicodeAsUTF8AndSize, - HPyUnicodeFromWideChar, - HPyUnicodeDecodeFSDefault, - HPyUnicodeDecodeFSDefaultAndSize, - HPyUnicodeEncodeFSDefault, - HPyUnicodeReadChar, - HPyUnicodeDecodeASCII, - HPyUnicodeDecodeLatin1, - HPyUnicodeFromEncodedObject, - HPyUnicodeSubstring, - HPyListCheck, - HPyListNew, - HPyListAppend, - HPyDictCheck, - HPyDictNew, - HPyDictKeys, - HPyDictCopy, - HPyTupleCheck, - HPyTupleFromArray, - HPySliceUnpack, - HPyImportImportModule, - HPyCapsuleNew, - HPyCapsuleGet, - HPyCapsuleIsValid, - HPyCapsuleSet, - HPyFromPyObject, - HPyAsPyObject, - HPyCallRealFunctionFromTrampoline, - HPyListBuilderNew, - HPyListBuilderSet, - HPyListBuilderBuild, - HPyListBuilderCancel, - HPyTupleBuilderNew, - HPyTupleBuilderSet, - HPyTupleBuilderBuild, - HPyTupleBuilderCancel, - HPyTrackerNew, - HPyTrackerAdd, - HPyTrackerForgetAll, - HPyTrackerClose, - HPyFieldStore, - HPyFieldLoad, - HPyReenterPythonExecution, - HPyLeavePythonExecution, - HPyGlobalStore, - HPyGlobalLoad, - HPyDump, - HPyCompiles, - HPyEvalCode, - HPyContextVarNew, - HPyContextVarGet, - HPyContextVarSet, - HPySetCallFunction; - - // @formatter:on - // Checkstyle: resume - // {{end jni upcalls}} - - @CompilationFinal(dimensions = 1) private static final HPyJNIUpcall[] VALUES = values(); - - @Override - public String getName() { - return name(); - } - } - - private void increment(HPyJNIUpcall upcall) { - if (counts != null) { - counts[upcall.ordinal()]++; - } - } - - private static PythonBuiltinClassType getBuiltinClass(Object cls) { - if (cls instanceof PythonBuiltinClassType) { - return (PythonBuiltinClassType) cls; - } else if (cls instanceof PythonBuiltinClass) { - return ((PythonBuiltinClass) cls).getType(); - } else { - return null; - } - } - - private int typeCheck(long handle, Object type) { - Object receiver; - if (GraalHPyBoxing.isBoxedDouble(handle)) { - receiver = PythonBuiltinClassType.PFloat; - } else if (GraalHPyBoxing.isBoxedInt(handle)) { - receiver = PythonBuiltinClassType.PInt; - } else { - receiver = GetClassNode.executeUncached(context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(handle))); - } - - if (receiver == type) { - return 1; - } - - PythonBuiltinClassType receiverBuiltin = getBuiltinClass(receiver); - if (receiverBuiltin != null) { - PythonBuiltinClassType typeBuiltin = getBuiltinClass(type); - if (typeBuiltin == null) { - // builtin type cannot be a subclass of a non-builtin type - return 0; - } - // fast path for builtin types: walk class hierarchy - while (true) { - if (receiverBuiltin == typeBuiltin) { - return 1; - } - if (receiverBuiltin == PythonBuiltinClassType.PythonObject) { - return 0; - } - receiverBuiltin = receiverBuiltin.getBase(); - } - } - - try { - return IsSubtypeNode.getUncached().execute(receiver, type) ? 1 : 0; - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(context, e); - return 0; - } - } - - /** - * Coerces an object to a native pointer (i.e. a {@code void *}; represented as Java - * {@code long}). This is similar to {@link #expectPointer(Object)} but will send - * {@link InteropLibrary#toNative(Object)} if the object is not a pointer already. - */ - static long coerceToPointer(Object value) { - if (value == null) { - return 0; - } - if (value instanceof Long) { - return (long) value; - } - if (value instanceof NativePointer nativePointer) { - return nativePointer.asPointer(); - } - return interopPointerToNative(value, InteropLibrary.getUncached(value)); - } - - /** - * Expects an object that can be casted (without coercion) to a native pointer (i.e. a - * {@code void *}; represented as Java {@code long}). This method will return {@code 0} in case - * of errors. - */ - public static long expectPointer(Object value) { - if (value instanceof Long) { - return (long) value; - } - InteropLibrary interopLibrary = InteropLibrary.getUncached(value); - if (interopLibrary.isPointer(value)) { - try { - return interopLibrary.asPointer(value); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere("cannot cast " + value); - } - } - return 0; - } - - private long capsuleNameToNative(Object name) { - if (name instanceof TruffleString tname) { - // The capsule's name may either be a native pointer or a TruffleString. - return HPyJNIAsCharPointerNodeGen.getUncached().executeLong(context, tname, Encoding.UTF_8); - } - return coerceToPointer(name); - } - - private long createHPyObject(long typeHandle, long dataOutVar) { - Object type = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(typeHandle)); - PythonObject pythonObject; - - /* - * Check if argument is actually a type. We will only accept PythonClass because that's the - * only one that makes sense here. - */ - if (type instanceof PythonClass clazz) { - // allocate native space - long basicSize = clazz.getBasicSize(); - if (basicSize == -1) { - // create the managed Python object - pythonObject = slowPathFactory.createPythonObject(clazz, clazz.getInstanceShape()); - } else { - /* - * Since this is a JNI upcall method, we know that (1) we are not running in some - * managed mode, and (2) the data will be used in real native code. Hence, we can - * immediately allocate native memory via Unsafe. - */ - long dataPtr = UNSAFE.allocateMemory(basicSize); - UNSAFE.setMemory(dataPtr, basicSize, (byte) 0); - if (dataOutVar != 0) { - UNSAFE.putAddress(dataOutVar, dataPtr); - } - pythonObject = slowPathFactory.createPythonHPyObject(clazz, dataPtr); - Object destroyFunc = clazz.getHPyDestroyFunc(); - context.createHandleReference(pythonObject, dataPtr, destroyFunc != PNone.NO_VALUE ? destroyFunc : null); - } - Object defaultCallFunc = clazz.getHPyDefaultCallFunc(); - if (defaultCallFunc != null) { - GraalHPyData.setHPyCallFunction(pythonObject, defaultCallFunc); - } - } else { - // check if argument is still a type (e.g. a built-in type, ...) - if (!IsTypeNode.executeUncached(type)) { - return HPyRaiseNodeGen.getUncached().raiseIntWithoutFrame(context, 0, PythonBuiltinClassType.TypeError, ErrorMessages.HPY_NEW_ARG_1_MUST_BE_A_TYPE); - } - // TODO(fa): this should actually call __new__ - pythonObject = slowPathFactory.createPythonObject(type); - } - return GraalHPyBoxing.boxHandle(context.getHPyHandleForObject(pythonObject)); - } - - // {{start ctx funcs}} - public int ctxTypeCheck(long bits, long typeBits) { - increment(HPyJNIUpcall.HPyTypeCheck); - Object type = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(typeBits)); - return typeCheck(bits, type); - } - - public int ctxTypeCheckg(long bits, long typeGlobalBits) { - increment(HPyJNIUpcall.HPyTypeCheck); - Object type = context.getObjectForHPyGlobal(GraalHPyBoxing.unboxHandle(typeGlobalBits)); - return typeCheck(bits, type); - } - - public long ctxLength(long handle) { - increment(HPyJNIUpcall.HPyLength); - assert GraalHPyBoxing.isBoxedHandle(handle); - - Object receiver = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(handle)); - - Object clazz = GetClassNode.executeUncached(receiver); - if (clazz == PythonBuiltinClassType.PList || clazz == PythonBuiltinClassType.PTuple) { - PSequence sequence = (PSequence) receiver; - SequenceStorage storage = sequence.getSequenceStorage(); - return storage.length(); - } - try { - return PyObjectSizeNodeGen.executeUncached(receiver); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(context, e); - return -1; - } - } - - public int ctxListCheck(long handle) { - increment(HPyJNIUpcall.HPyListCheck); - if (GraalHPyBoxing.isBoxedHandle(handle)) { - Object obj = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(handle)); - Object clazz = GetClassNode.executeUncached(obj); - return PInt.intValue(clazz == PythonBuiltinClassType.PList || IsSubtypeNodeGen.getUncached().execute(clazz, PythonBuiltinClassType.PList)); - } else { - return 0; - } - } - - public long ctxUnicodeFromWideChar(long wcharArrayPtr, long size) { - increment(HPyJNIUpcall.HPyUnicodeFromWideChar); - - if (!PInt.isIntRange(size)) { - // NULL handle - return 0; - } - int isize = (int) size; - // TODO GR-37216: use TruffleString.FromNativePointer? - char[] decoded = new char[isize]; - for (int i = 0; i < size; i++) { - int wchar = UNSAFE.getInt(wcharArrayPtr + (long) Integer.BYTES * i); - if (Character.isBmpCodePoint(wchar)) { - decoded[i] = (char) wchar; - } else { - // TODO(fa): handle this case - throw new RuntimeException(); - } - } - TruffleString result = toTruffleStringUncached(new String(decoded, 0, isize)); - return GraalHPyBoxing.boxHandle(context.getHPyHandleForObject(result)); - } - - public long ctxUnicodeFromJCharArray(char[] arr) { - increment(HPyJNIUpcall.HPyUnicodeFromJCharArray); - TruffleString string = TruffleString.fromCharArrayUTF16Uncached(arr).switchEncodingUncached(TS_ENCODING); - return GraalHPyBoxing.boxHandle(context.getHPyHandleForObject(string)); - } - - public long ctxDictNew() { - increment(HPyJNIUpcall.HPyDictNew); - PDict dict = slowPathFactory.createDict(); - return GraalHPyBoxing.boxHandle(context.getHPyHandleForObject(dict)); - } - - public long ctxListNew(long llen) { - try { - increment(HPyJNIUpcall.HPyListNew); - int len = CastToJavaIntExactNode.executeUncached(llen); - Object[] data = new Object[len]; - Arrays.fill(data, PNone.NONE); - PList list = slowPathFactory.createList(data); - return GraalHPyBoxing.boxHandle(context.getHPyHandleForObject(list)); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(context, e); - // NULL handle - return 0; - } - } - - /** - * Implementation of context function {@code ctx_Tuple_FromArray} (JNI upcall). This method can - * optionally steal the item handles in order to avoid repeated upcalls just to close them. This - * is useful to implement, e.g., tuple builder. - */ - public long ctxSequenceFromArray(long[] hItems, boolean steal, boolean create_list) { - increment(HPyJNIUpcall.HPySequenceFromArray); - - Object[] objects = new Object[hItems.length]; - for (int i = 0; i < hItems.length; i++) { - long hBits = hItems[i]; - objects[i] = context.bitsAsPythonObject(hBits); - if (steal) { - closeNativeHandle(hBits); - } - } - Object result; - if (create_list) { - result = slowPathFactory.createList(objects); - } else { - result = slowPathFactory.createTuple(objects); - } - return GraalHPyBoxing.boxHandle(context.getHPyHandleForObject(result)); - } - - public long ctxFieldLoad(long bits, long idx) { - increment(HPyJNIUpcall.HPyFieldLoad); - Object owner = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(bits)); - // HPyField index is always non-zero because zero means: uninitialized - assert idx > 0; - Object referent = GraalHPyData.getHPyField((PythonObject) owner, (int) idx); - return GraalHPyBoxing.boxHandle(context.getHPyHandleForObject(referent)); - } - - public long ctxFieldStore(long bits, long idx, long value) { - increment(HPyJNIUpcall.HPyFieldStore); - PythonObject owner = (PythonObject) context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(bits)); - Object referent = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(value)); - return GraalHPyData.setHPyField(owner, referent, (int) idx); - } - - public long ctxGlobalLoad(long bits) { - increment(HPyJNIUpcall.HPyGlobalLoad); - assert GraalHPyBoxing.isBoxedHandle(bits); - return GraalHPyBoxing.boxHandle(context.getHPyHandleForObject(context.getObjectForHPyGlobal(GraalHPyBoxing.unboxHandle(bits)))); - } - - public long ctxGlobalStore(long bits, long v) { - increment(HPyJNIUpcall.HPyGlobalStore); - assert GraalHPyBoxing.isBoxedHandle(bits); - return context.createGlobal(context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(v)), GraalHPyBoxing.unboxHandle(bits)); - } - - public long ctxType(long bits) { - increment(HPyJNIUpcall.HPyType); - Object clazz; - if (GraalHPyBoxing.isBoxedHandle(bits)) { - clazz = GetClassNode.executeUncached(context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(bits))); - } else if (GraalHPyBoxing.isBoxedInt(bits)) { - clazz = GetClassNode.executeUncached(GraalHPyBoxing.unboxInt(bits)); - } else if (GraalHPyBoxing.isBoxedDouble(bits)) { - clazz = GetClassNode.executeUncached(GraalHPyBoxing.unboxDouble(bits)); - } else { - assert false; - clazz = null; - } - return GraalHPyBoxing.boxHandle(context.getHPyHandleForObject(clazz)); - } - - public long ctxTypeGetName(long bits) { - increment(HPyJNIUpcall.HPyTypeGetName); - assert GraalHPyBoxing.isBoxedHandle(bits); - Object clazz = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(bits)); - Object tpName = HPyTypeGetNameNode.executeUncached(context, clazz); - try { - return coerceToPointer(tpName); - } catch (CannotCastException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } - - public long ctxContextVarGet(long varBits, long defBits, long errBits) { - increment(HPyJNIUpcall.HPyContextVarGet); - assert GraalHPyBoxing.isBoxedHandle(varBits); - Object var = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(varBits)); - if (!(var instanceof PContextVar)) { - try { - throw PRaiseNode.raiseUncached(null, TypeError, ErrorMessages.INSTANCE_OF_CONTEXTVAR_EXPECTED); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(context, e); - } - return errBits; - } - PythonContext ctx = getContext(); - PythonLanguage lang = ctx.getLanguage(); - Object def = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(defBits)); - Object res = GraalHPyContextVarGet.getObject(ctx.getThreadState(lang), (PContextVar) var, def); - if (res == GraalHPyHandle.NULL_HANDLE_DELEGATE) { - return 0; - } - return GraalHPyBoxing.boxHandle(context.getHPyHandleForObject(res)); - } - - public int ctxIs(long aBits, long bBits) { - Object a = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(aBits)); - Object b = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(bBits)); - try { - return PInt.intValue(IsNodeGen.getUncached().execute(a, b)); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(context, e); - return -1; - } - } - - public int ctxIsg(long aBits, long bBits) { - Object a = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(aBits)); - Object b = context.getObjectForHPyGlobal(GraalHPyBoxing.unboxHandle(bBits)); - try { - return PInt.intValue(IsNodeGen.getUncached().execute(a, b)); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(context, e); - return -1; - } - } - - public long ctxCapsuleNew(long pointer, long name, long destructor) { - if (pointer == 0) { - return HPyRaiseNodeGen.getUncached().raiseIntWithoutFrame(context, 0, ValueError, ErrorMessages.HPYCAPSULE_NEW_NULL_PTR_ERROR); - } - long hpyDestructor; - if (destructor != 0) { - long cpyTrampoline = UNSAFE.getLong(destructor); // HPyCapsule_Destructor.cpy_trampoline - hpyDestructor = UNSAFE.getLong(destructor + SIZEOF_LONG); // HPyCapsule_Destructor.impl - if (cpyTrampoline == 0 || hpyDestructor == 0) { - return HPyRaiseNodeGen.getUncached().raiseIntWithoutFrame(context, 0, ValueError, ErrorMessages.INVALID_HPYCAPSULE_DESTRUCTOR); - } - } else { - hpyDestructor = 0; - } - PyCapsule result = slowPathFactory.createCapsule(pointer, new NativePointer(name)); - if (hpyDestructor != 0) { - result.registerDestructor(hpyDestructor); - } - return GraalHPyBoxing.boxHandle(context.getHPyHandleForObject(result)); - } - - static boolean capsuleNameMatches(long name1, long name2) { - // additional shortcut (compared to CPython) to avoid a unnecessary downcalls - if (name1 == name2) { - return true; - } - /* - * If one of them is NULL, then both need to be NULL. However, at this point we have - * invariant 'name1 != name2' because of the above shortcut. - */ - if (name1 == 0 || name2 == 0) { - return false; - } - return strcmp(name1, name2) == 0; - } - - public long ctxCapsuleGet(long capsuleBits, int key, long namePtr) { - Object capsule = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(capsuleBits)); - try { - if (!(capsule instanceof PyCapsule pyCapsule) || ((PyCapsule) capsule).getPointer() == null) { - return HPyRaiseNodeGen.getUncached().raiseIntWithoutFrame(context, 0, ValueError, GraalHPyCapsuleGet.getErrorMessage(key)); - } - GraalHPyCapsuleGet.isLegalCapsule(capsule, key, PRaiseNode.getUncached()); - Object result; - switch (key) { - case CapsuleKey.Pointer -> { - if (!capsuleNameMatches(namePtr, coerceToPointer(capsuleNameToNative(pyCapsule.getName())))) { - return HPyRaiseNodeGen.getUncached().raiseIntWithoutFrame(context, 0, ValueError, GraalHPyCapsuleGet.INCORRECT_NAME); - } - result = pyCapsule.getPointer(); - } - case CapsuleKey.Context -> result = pyCapsule.getContext(); - // The capsule's name may either be a native pointer or a TruffleString. - case CapsuleKey.Name -> result = capsuleNameToNative(pyCapsule.getName()); - case CapsuleKey.Destructor -> result = pyCapsule.getDestructor(); - default -> throw CompilerDirectives.shouldNotReachHere("invalid key"); - } - return coerceToPointer(result); - } catch (CannotCastException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } - - public long ctxGetAttrs(long receiverHandle, String name) { - increment(HPyJNIUpcall.HPyGetAttrs); - Object receiver = context.bitsAsPythonObject(receiverHandle); - TruffleString tsName = toTruffleStringUncached(name); - Object result; - try { - result = PyObjectGetAttr.executeUncached(receiver, tsName); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(context, e); - return 0; - } - return context.pythonObjectAsBits(result); - } - - @SuppressWarnings("static-method") - public long ctxFloatFromDouble(double value) { - increment(HPyJNIUpcall.HPyFloatFromDouble); - return GraalHPyBoxing.boxDouble(value); - } - - public double ctxFloatAsDouble(long handle) { - increment(HPyJNIUpcall.HPyFloatAsDouble); - - if (GraalHPyBoxing.isBoxedDouble(handle)) { - return GraalHPyBoxing.unboxDouble(handle); - } else if (GraalHPyBoxing.isBoxedInt(handle)) { - return GraalHPyBoxing.unboxInt(handle); - } else { - Object object = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(handle)); - try { - return PyFloatAsDoubleNode.executeUncached(object); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(context, e); - return -1.0; - } - } - } - - public int ctxLongAsInt32t(long h) { - increment(HPyJNIUpcall.HPyLongAsInt32t); - if (GraalHPyBoxing.isBoxedInt(h)) { - return GraalHPyBoxing.unboxInt(h); - } - return executeIntBinaryContextFunction(HPyContextMember.CTX_LONG_ASINT32_T, h); - } - - public int ctxLongAsUInt32t(long h) { - increment(HPyJNIUpcall.HPyLongAsUInt32t); - // we may only unbox positive values; negative values will raise an error - int unboxedVal; - if (GraalHPyBoxing.isBoxedInt(h) && (unboxedVal = GraalHPyBoxing.unboxInt(h)) >= 0) { - return unboxedVal; - } - return executeIntBinaryContextFunction(HPyContextMember.CTX_LONG_ASUINT32_T, h); - } - - public int ctxLongAsUInt32tMask(long h) { - increment(HPyJNIUpcall.HPyLongAsUInt32tMask); - if (GraalHPyBoxing.isBoxedInt(h)) { - return GraalHPyBoxing.unboxInt(h); - } - return executeIntBinaryContextFunction(HPyContextMember.CTX_LONG_ASUINT32_TMASK, h); - } - - public long ctxLongAsInt64t(long handle) { - increment(HPyJNIUpcall.HPyLongAsInt64t); - - if (GraalHPyBoxing.isBoxedInt(handle)) { - return GraalHPyBoxing.unboxInt(handle); - } else { - Object object = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(handle)); - try { - return (long) AsNativePrimitiveNodeGen.getUncached().execute(object, 1, java.lang.Long.BYTES, true); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(context, e); - return -1L; - } - } - } - - public long ctxLongAsUInt64t(long h) { - increment(HPyJNIUpcall.HPyLongAsUInt64t); - return executeLongBinaryContextFunction(HPyContextMember.CTX_LONG_ASUINT64_T, h); - } - - public long ctxLongAsUInt64tMask(long h) { - increment(HPyJNIUpcall.HPyLongAsUInt64tMask); - return executeLongBinaryContextFunction(HPyContextMember.CTX_LONG_ASUINT64_TMASK, h); - } - - public double ctxLongAsDouble(long handle) { - increment(HPyJNIUpcall.HPyLongAsDouble); - - if (GraalHPyBoxing.isBoxedInt(handle)) { - return GraalHPyBoxing.unboxInt(handle); - } else { - Object object = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(handle)); - try { - return PyLongAsDoubleNode.executeUncached(object); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(context, e); - return -1L; - } - } - } - - public long ctxLongFromInt32t(int v) { - increment(HPyJNIUpcall.HPyLongFromInt32t); - return GraalHPyBoxing.boxInt(v); - } - - public long ctxLongFromUInt32t(int value) { - increment(HPyJNIUpcall.HPyLongFromUInt32t); - return executeLongBinaryContextFunction(HPyContextMember.CTX_LONG_FROMUINT32_T, value); - } - - public long ctxLongFromInt64t(long v) { - increment(HPyJNIUpcall.HPyLongFromInt64t); - if (PInt.isIntRange(v)) { - return GraalHPyBoxing.boxInt((int) v); - } - return executeLongBinaryContextFunction(HPyContextMember.CTX_LONG_FROMINT64_T, v); - } - - public long ctxLongFromUInt64t(long v) { - increment(HPyJNIUpcall.HPyLongFromUInt64t); - return executeLongBinaryContextFunction(HPyContextMember.CTX_LONG_FROMUINT64_T, v); - } - - public long ctxBoolFromBool(boolean v) { - increment(HPyJNIUpcall.HPyBoolFromBool); - Python3Core core = context.getContext(); - return GraalHPyBoxing.boxHandle(context.getHPyHandleForObject(v ? core.getTrue() : core.getFalse())); - } - - public long ctxAsStructObject(long h) { - increment(HPyJNIUpcall.HPyAsStructObject); - Object receiver = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(h)); - return expectPointer(HPyGetNativeSpacePointerNode.executeUncached(receiver)); - } - - public long ctxAsStructLegacy(long h) { - increment(HPyJNIUpcall.HPyAsStructLegacy); - Object receiver = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(h)); - return expectPointer(HPyGetNativeSpacePointerNode.executeUncached(receiver)); - } - - public long ctxAsStructType(long h) { - increment(HPyJNIUpcall.HPyAsStructType); - Object receiver = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(h)); - return expectPointer(HPyGetNativeSpacePointerNode.executeUncached(receiver)); - } - - public long ctxAsStructLong(long h) { - increment(HPyJNIUpcall.HPyAsStructLong); - Object receiver = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(h)); - return expectPointer(HPyGetNativeSpacePointerNode.executeUncached(receiver)); - } - - public long ctxAsStructFloat(long h) { - increment(HPyJNIUpcall.HPyAsStructFloat); - Object receiver = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(h)); - return expectPointer(HPyGetNativeSpacePointerNode.executeUncached(receiver)); - } - - public long ctxAsStructUnicode(long h) { - increment(HPyJNIUpcall.HPyAsStructUnicode); - Object receiver = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(h)); - return expectPointer(HPyGetNativeSpacePointerNode.executeUncached(receiver)); - } - - public long ctxAsStructTuple(long h) { - increment(HPyJNIUpcall.HPyAsStructTuple); - Object receiver = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(h)); - return expectPointer(HPyGetNativeSpacePointerNode.executeUncached(receiver)); - } - - public long ctxAsStructList(long h) { - increment(HPyJNIUpcall.HPyAsStructList); - Object receiver = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(h)); - return expectPointer(HPyGetNativeSpacePointerNode.executeUncached(receiver)); - } - - // Note: assumes that receiverHandle is not a boxed primitive value - public int ctxSetItems(long receiverHandle, String name, long valueHandle) { - increment(HPyJNIUpcall.HPySetItems); - Object receiver = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(receiverHandle)); - Object value = context.bitsAsPythonObject(valueHandle); - if (value == GraalHPyHandle.NULL_HANDLE_DELEGATE) { - HPyRaiseNode.raiseIntUncached(context, -1, SystemError, ErrorMessages.HPY_UNEXPECTED_HPY_NULL); - return -1; - } - TruffleString tsName = toTruffleStringUncached(name); - try { - PyObjectSetItem.executeUncached(receiver, tsName, value); - return 0; - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(context, e); - return -1; - } - } - - // Note: assumes that receiverHandle is not a boxed primitive value - public long ctxGetItems(long receiverHandle, String name) { - increment(HPyJNIUpcall.HPyGetItems); - Object receiver = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(receiverHandle)); - TruffleString tsName = toTruffleStringUncached(name); - Object result; - try { - result = PyObjectGetItem.executeUncached(receiver, tsName); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(context, e); - return 0; - } - return GraalHPyBoxing.boxHandle(context.getHPyHandleForObject(result)); - } - - public long ctxNew(long typeHandle, long dataOutVar) { - increment(HPyJNIUpcall.HPyNew); - return createHPyObject(typeHandle, dataOutVar); - } - - @SuppressWarnings("unused") - public long ctxTypeGenericNew(long typeHandle, long args, long nargs, long kw) { - increment(HPyJNIUpcall.HPyTypeGenericNew); - return createHPyObject(typeHandle, 0); - } - - /** - * Close a native handle received from a JNI upcall (hence represented by a Java {code long}). - */ - private void closeNativeHandle(long handle) { - if (GraalHPyBoxing.isBoxedHandle(handle)) { - context.releaseHPyHandleForObject(GraalHPyBoxing.unboxHandle(handle)); - } - } - - public void ctxClose(long handle) { - increment(HPyJNIUpcall.HPyClose); - closeNativeHandle(handle); - } - - public void ctxBulkClose(long unclosedHandlePtr, int size) { - increment(HPyJNIUpcall.HPyBulkClose); - for (int i = 0; i < size; i++) { - long handle = UNSAFE.getLong(unclosedHandlePtr); - unclosedHandlePtr += 8; - assert GraalHPyBoxing.isBoxedHandle(handle); - assert handle >= IMMUTABLE_HANDLE_COUNT; - context.releaseHPyHandleForObject(GraalHPyBoxing.unboxHandle(handle)); - } - } - - public long ctxDup(long handle) { - increment(HPyJNIUpcall.HPyDup); - if (GraalHPyBoxing.isBoxedHandle(handle)) { - Object delegate = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(handle)); - return GraalHPyBoxing.boxHandle(context.getHPyHandleForObject(delegate)); - } else { - return handle; - } - } - - public long ctxGetItemi(long hCollection, long lidx) { - increment(HPyJNIUpcall.HPyGetItemi); - try { - // If handle 'hCollection' is a boxed int or double, the object is not subscriptable. - if (!GraalHPyBoxing.isBoxedHandle(hCollection)) { - throw PRaiseNode.raiseUncached(null, PythonBuiltinClassType.TypeError, ErrorMessages.OBJ_NOT_SUBSCRIPTABLE, 0); - } - Object receiver = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(hCollection)); - Object clazz = GetClassNode.executeUncached(receiver); - if (clazz == PythonBuiltinClassType.PList || clazz == PythonBuiltinClassType.PTuple) { - if (!PInt.isIntRange(lidx)) { - throw PRaiseNode.raiseUncached(null, PythonBuiltinClassType.IndexError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, lidx); - } - int idx = (int) lidx; - PSequence sequence = (PSequence) receiver; - SequenceStorage storage = sequence.getSequenceStorage(); - if (storage instanceof IntSequenceStorage) { - return GraalHPyBoxing.boxInt(((IntSequenceStorage) storage).getIntItemNormalized(idx)); - } else if (storage instanceof DoubleSequenceStorage) { - return GraalHPyBoxing.boxDouble(((DoubleSequenceStorage) storage).getDoubleItemNormalized(idx)); - } else if (storage instanceof LongSequenceStorage) { - long lresult = ((LongSequenceStorage) storage).getLongItemNormalized(idx); - if (com.oracle.graal.python.builtins.objects.ints.PInt.isIntRange(lresult)) { - return GraalHPyBoxing.boxInt((int) lresult); - } - return GraalHPyBoxing.boxHandle(context.getHPyHandleForObject(lresult)); - } else if (storage instanceof ObjectSequenceStorage) { - Object result = ((ObjectSequenceStorage) storage).getObjectItemNormalized(idx); - if (result instanceof Integer) { - return GraalHPyBoxing.boxInt((int) result); - } else if (result instanceof Double) { - return GraalHPyBoxing.boxDouble((double) result); - } - return GraalHPyBoxing.boxHandle(context.getHPyHandleForObject(result)); - } - // TODO: other storages... - } - Object result = PyObjectGetItem.executeUncached(receiver, lidx); - return GraalHPyBoxing.boxHandle(context.getHPyHandleForObject(result)); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(context, e); - // NULL handle - return 0; - } - } - - /** - * HPy signature: {@code HPy_SetItem(HPyContext ctx, HPy obj, HPy key, HPy value)} - * - * @param hSequence - * @param hKey - * @param hValue - * @return {@code 0} on success; {@code -1} on error - */ - public int ctxSetItem(long hSequence, long hKey, long hValue) { - increment(HPyJNIUpcall.HPySetItem); - try { - // If handle 'hSequence' is a boxed int or double, the object is not a sequence. - if (!GraalHPyBoxing.isBoxedHandle(hSequence)) { - throw PRaiseNode.raiseUncached(null, PythonBuiltinClassType.TypeError, ErrorMessages.OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT, 0); - } - Object receiver = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(hSequence)); - Object clazz = GetClassNode.executeUncached(receiver); - Object key = HPyAsPythonObjectNodeGen.getUncached().execute(hKey); - Object value = HPyAsPythonObjectNodeGen.getUncached().execute(hValue); - - // fast path - if (clazz == PythonBuiltinClassType.PDict) { - PDict dict = (PDict) receiver; - HashingStorage dictStorage = dict.getDictStorage(); - - // super-fast path for string keys - if (key instanceof TruffleString) { - if (dictStorage instanceof EmptyStorage) { - dictStorage = PDict.createNewStorage(1); - dict.setDictStorage(dictStorage); - } - - if (dictStorage instanceof EconomicMapStorage) { - ((EconomicMapStorage) dictStorage).putUncached((TruffleString) key, value); - return 0; - } - // fall through to generic case - } - dict.setDictStorage(HashingStorageSetItem.executeUncached(dictStorage, key, value)); - return 0; - } else if (clazz == PythonBuiltinClassType.PList && PGuards.isInteger(key) && ctxListSetItem(receiver, ((Number) key).longValue(), hValue)) { - return 0; - } - return setItemGeneric(receiver, clazz, key, value); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(context, e); - // non-null value indicates an error - return -1; - } - } - - public int ctxSetItemi(long hSequence, long lidx, long hValue) { - increment(HPyJNIUpcall.HPySetItemi); - try { - // If handle 'hSequence' is a boxed int or double, the object is not a sequence. - if (!GraalHPyBoxing.isBoxedHandle(hSequence)) { - throw PRaiseNode.raiseUncached(null, PythonBuiltinClassType.TypeError, ErrorMessages.OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT, 0); - } - Object receiver = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(hSequence)); - Object clazz = GetClassNode.executeUncached(receiver); - - if (clazz == PythonBuiltinClassType.PList && ctxListSetItem(receiver, lidx, hValue)) { - return 0; - } - Object value = HPyAsPythonObjectNodeGen.getUncached().execute(hValue); - return setItemGeneric(receiver, clazz, lidx, value); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(context, e); - // non-null value indicates an error - return -1; - } - } - - private boolean ctxListSetItem(Object receiver, long lidx, long hValue) { - // fast path for list - if (!PInt.isIntRange(lidx)) { - throw PRaiseNode.raiseUncached(null, PythonBuiltinClassType.IndexError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, lidx); - } - int idx = (int) lidx; - PList sequence = (PList) receiver; - SequenceStorage storage = sequence.getSequenceStorage(); - if (storage instanceof IntSequenceStorage && GraalHPyBoxing.isBoxedInt(hValue)) { - ((IntSequenceStorage) storage).setIntItemNormalized(idx, GraalHPyBoxing.unboxInt(hValue)); - return true; - } else if (storage instanceof DoubleSequenceStorage && GraalHPyBoxing.isBoxedDouble(hValue)) { - ((DoubleSequenceStorage) storage).setDoubleItemNormalized(idx, GraalHPyBoxing.unboxDouble(hValue)); - return true; - } else if (storage instanceof LongSequenceStorage && GraalHPyBoxing.isBoxedInt(hValue)) { - ((LongSequenceStorage) storage).setLongItemNormalized(idx, GraalHPyBoxing.unboxInt(hValue)); - return true; - } else if (storage instanceof ObjectSequenceStorage) { - Object value = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(hValue)); - ((ObjectSequenceStorage) storage).setObjectItemNormalized(idx, value); - return true; - } - // TODO: other storages... - return false; - } - - @TruffleBoundary - private static int setItemGeneric(Object receiver, Object clazz, Object key, Object value) { - Object setItemAttribute = LookupCallableSlotInMRONode.getUncached(SpecialMethodSlot.SetItem).execute(clazz); - if (setItemAttribute == PNone.NO_VALUE) { - throw PRaiseNode.raiseUncached(null, PythonBuiltinClassType.TypeError, ErrorMessages.OBJ_NOT_SUBSCRIPTABLE, receiver); - } - CallTernaryMethodNode.getUncached().execute(null, setItemAttribute, receiver, key, value); - return 0; - } - - public int ctxNumberCheck(long handle) { - increment(HPyJNIUpcall.HPyNumberCheck); - if (GraalHPyBoxing.isBoxedDouble(handle) || GraalHPyBoxing.isBoxedInt(handle)) { - return 1; - } - Object receiver = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(handle)); - - try { - if (PyIndexCheckNode.executeUncached(receiver) || CanBeDoubleNode.executeUncached(receiver)) { - return 1; - } - Object receiverType = GetClassNode.executeUncached(receiver); - return PInt.intValue(LookupCallableSlotInMRONode.getUncached(SpecialMethodSlot.Int).execute(receiverType) != PNone.NO_VALUE); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(context, e); - return 0; - } - } - - public long ctxLongFromSizet(long value) { - increment(HPyJNIUpcall.HPyLongFromSizet); - return executeLongBinaryContextFunction(HPyContextMember.CTX_LONG_FROMSIZE_T, value); - } - - public long ctxLongFromSsizet(long value) { - increment(HPyJNIUpcall.HPyLongFromSsizet); - return executeLongBinaryContextFunction(HPyContextMember.CTX_LONG_FROMSSIZE_T, value); - } - - public long ctxLongAsSizet(long h) { - increment(HPyJNIUpcall.HPyLongAsSizet); - return executeLongBinaryContextFunction(HPyContextMember.CTX_LONG_ASSIZE_T, h); - } - - public long ctxLongAsSsizet(long h) { - increment(HPyJNIUpcall.HPyLongAsSsizet); - return executeLongBinaryContextFunction(HPyContextMember.CTX_LONG_ASSSIZE_T, h); - } - - public long ctxLongAsVoidPtr(long h) { - increment(HPyJNIUpcall.HPyLongAsVoidPtr); - return executeLongBinaryContextFunction(HPyContextMember.CTX_LONG_ASVOIDPTR, h); - } - - public long ctxAdd(long h1, long h2) { - increment(HPyJNIUpcall.HPyAdd); - return executeLongTernaryContextFunction(HPyContextMember.CTX_ADD, h1, h2); - } - - public long ctxSubtract(long h1, long h2) { - increment(HPyJNIUpcall.HPySubtract); - return executeLongTernaryContextFunction(HPyContextMember.CTX_SUBTRACT, h1, h2); - } - - public long ctxMultiply(long h1, long h2) { - increment(HPyJNIUpcall.HPyMultiply); - return executeLongTernaryContextFunction(HPyContextMember.CTX_MULTIPLY, h1, h2); - } - - public long ctxMatrixMultiply(long h1, long h2) { - increment(HPyJNIUpcall.HPyMatrixMultiply); - return executeLongTernaryContextFunction(HPyContextMember.CTX_MATRIXMULTIPLY, h1, h2); - } - - public long ctxFloorDivide(long h1, long h2) { - increment(HPyJNIUpcall.HPyFloorDivide); - return executeLongTernaryContextFunction(HPyContextMember.CTX_FLOORDIVIDE, h1, h2); - } - - public long ctxTrueDivide(long h1, long h2) { - increment(HPyJNIUpcall.HPyTrueDivide); - return executeLongTernaryContextFunction(HPyContextMember.CTX_TRUEDIVIDE, h1, h2); - } - - public long ctxRemainder(long h1, long h2) { - increment(HPyJNIUpcall.HPyRemainder); - return executeLongTernaryContextFunction(HPyContextMember.CTX_REMAINDER, h1, h2); - } - - public long ctxDivmod(long h1, long h2) { - increment(HPyJNIUpcall.HPyDivmod); - return executeLongTernaryContextFunction(HPyContextMember.CTX_DIVMOD, h1, h2); - } - - public long ctxPower(long h1, long h2, long h3) { - increment(HPyJNIUpcall.HPyPower); - return executeLongContextFunction(HPyContextMember.CTX_POWER, new long[]{h1, h2, h3}); - } - - public long ctxNegative(long h1) { - increment(HPyJNIUpcall.HPyNegative); - return executeLongBinaryContextFunction(HPyContextMember.CTX_NEGATIVE, h1); - } - - public long ctxPositive(long h1) { - increment(HPyJNIUpcall.HPyPositive); - return executeLongBinaryContextFunction(HPyContextMember.CTX_POSITIVE, h1); - } - - public long ctxAbsolute(long h1) { - increment(HPyJNIUpcall.HPyAbsolute); - return executeLongBinaryContextFunction(HPyContextMember.CTX_ABSOLUTE, h1); - } - - public long ctxInvert(long h1) { - increment(HPyJNIUpcall.HPyInvert); - return executeLongBinaryContextFunction(HPyContextMember.CTX_INVERT, h1); - } - - public long ctxLshift(long h1, long h2) { - increment(HPyJNIUpcall.HPyLshift); - return executeLongTernaryContextFunction(HPyContextMember.CTX_LSHIFT, h1, h2); - } - - public long ctxRshift(long h1, long h2) { - increment(HPyJNIUpcall.HPyRshift); - return executeLongTernaryContextFunction(HPyContextMember.CTX_RSHIFT, h1, h2); - } - - public long ctxAnd(long h1, long h2) { - increment(HPyJNIUpcall.HPyAnd); - return executeLongTernaryContextFunction(HPyContextMember.CTX_AND, h1, h2); - } - - public long ctxXor(long h1, long h2) { - increment(HPyJNIUpcall.HPyXor); - return executeLongTernaryContextFunction(HPyContextMember.CTX_XOR, h1, h2); - } - - public long ctxOr(long h1, long h2) { - increment(HPyJNIUpcall.HPyOr); - return executeLongTernaryContextFunction(HPyContextMember.CTX_OR, h1, h2); - } - - public long ctxIndex(long h1) { - increment(HPyJNIUpcall.HPyIndex); - return executeLongBinaryContextFunction(HPyContextMember.CTX_INDEX, h1); - } - - public long ctxLong(long h1) { - increment(HPyJNIUpcall.HPyLong); - return executeLongBinaryContextFunction(HPyContextMember.CTX_LONG, h1); - } - - public long ctxFloat(long h1) { - increment(HPyJNIUpcall.HPyFloat); - return executeLongBinaryContextFunction(HPyContextMember.CTX_FLOAT, h1); - } - - public long ctxInPlaceAdd(long h1, long h2) { - increment(HPyJNIUpcall.HPyInPlaceAdd); - return executeLongTernaryContextFunction(HPyContextMember.CTX_INPLACEADD, h1, h2); - } - - public long ctxInPlaceSubtract(long h1, long h2) { - increment(HPyJNIUpcall.HPyInPlaceSubtract); - return executeLongTernaryContextFunction(HPyContextMember.CTX_INPLACESUBTRACT, h1, h2); - } - - public long ctxInPlaceMultiply(long h1, long h2) { - increment(HPyJNIUpcall.HPyInPlaceMultiply); - return executeLongTernaryContextFunction(HPyContextMember.CTX_INPLACEMULTIPLY, h1, h2); - } - - public long ctxInPlaceMatrixMultiply(long h1, long h2) { - increment(HPyJNIUpcall.HPyInPlaceMatrixMultiply); - return executeLongTernaryContextFunction(HPyContextMember.CTX_INPLACEMATRIXMULTIPLY, h1, h2); - } - - public long ctxInPlaceFloorDivide(long h1, long h2) { - increment(HPyJNIUpcall.HPyInPlaceFloorDivide); - return executeLongTernaryContextFunction(HPyContextMember.CTX_INPLACEFLOORDIVIDE, h1, h2); - } - - public long ctxInPlaceTrueDivide(long h1, long h2) { - increment(HPyJNIUpcall.HPyInPlaceTrueDivide); - return executeLongTernaryContextFunction(HPyContextMember.CTX_INPLACETRUEDIVIDE, h1, h2); - } - - public long ctxInPlaceRemainder(long h1, long h2) { - increment(HPyJNIUpcall.HPyInPlaceRemainder); - return executeLongTernaryContextFunction(HPyContextMember.CTX_INPLACEREMAINDER, h1, h2); - } - - public long ctxInPlacePower(long h1, long h2, long h3) { - increment(HPyJNIUpcall.HPyInPlacePower); - return executeLongContextFunction(HPyContextMember.CTX_INPLACEPOWER, new long[]{h1, h2, h3}); - } - - public long ctxInPlaceLshift(long h1, long h2) { - increment(HPyJNIUpcall.HPyInPlaceLshift); - return executeLongTernaryContextFunction(HPyContextMember.CTX_INPLACELSHIFT, h1, h2); - } - - public long ctxInPlaceRshift(long h1, long h2) { - increment(HPyJNIUpcall.HPyInPlaceRshift); - return executeLongTernaryContextFunction(HPyContextMember.CTX_INPLACERSHIFT, h1, h2); - } - - public long ctxInPlaceAnd(long h1, long h2) { - increment(HPyJNIUpcall.HPyInPlaceAnd); - return executeLongTernaryContextFunction(HPyContextMember.CTX_INPLACEAND, h1, h2); - } - - public long ctxInPlaceXor(long h1, long h2) { - increment(HPyJNIUpcall.HPyInPlaceXor); - return executeLongTernaryContextFunction(HPyContextMember.CTX_INPLACEXOR, h1, h2); - } - - public long ctxInPlaceOr(long h1, long h2) { - increment(HPyJNIUpcall.HPyInPlaceOr); - return executeLongTernaryContextFunction(HPyContextMember.CTX_INPLACEOR, h1, h2); - } - - public int ctxCallableCheck(long h) { - increment(HPyJNIUpcall.HPyCallableCheck); - return executeIntBinaryContextFunction(HPyContextMember.CTX_CALLABLE_CHECK, h); - } - - public long ctxCallTupleDict(long callable, long args, long kw) { - increment(HPyJNIUpcall.HPyCallTupleDict); - return executeLongContextFunction(HPyContextMember.CTX_CALLTUPLEDICT, new long[]{callable, args, kw}); - } - - public void ctxFatalError(long message) { - increment(HPyJNIUpcall.HPyFatalError); - executeIntBinaryContextFunction(HPyContextMember.CTX_FATALERROR, message); - } - - public void ctxErrSetString(long h_type, long message) { - increment(HPyJNIUpcall.HPyErrSetString); - executeIntTernaryContextFunction(HPyContextMember.CTX_ERR_SETSTRING, h_type, message); - } - - public void ctxErrSetObject(long h_type, long h_value) { - increment(HPyJNIUpcall.HPyErrSetObject); - executeIntTernaryContextFunction(HPyContextMember.CTX_ERR_SETOBJECT, h_type, h_value); - } - - public long ctxErrSetFromErrnoWithFilename(long h_type, long filename_fsencoded) { - increment(HPyJNIUpcall.HPyErrSetFromErrnoWithFilename); - return executeLongTernaryContextFunction(HPyContextMember.CTX_ERR_SETFROMERRNOWITHFILENAME, h_type, filename_fsencoded); - } - - public void ctxErrSetFromErrnoWithFilenameObjects(long h_type, long filename1, long filename2) { - increment(HPyJNIUpcall.HPyErrSetFromErrnoWithFilenameObjects); - executeIntContextFunction(HPyContextMember.CTX_ERR_SETFROMERRNOWITHFILENAMEOBJECTS, new long[]{h_type, filename1, filename2}); - } - - public int ctxErrOccurred() { - increment(HPyJNIUpcall.HPyErrOccurred); - return executeIntContextFunction(HPyContextMember.CTX_ERR_OCCURRED, new long[]{}); - } - - public int ctxErrExceptionMatches(long exc) { - increment(HPyJNIUpcall.HPyErrExceptionMatches); - return executeIntBinaryContextFunction(HPyContextMember.CTX_ERR_EXCEPTIONMATCHES, exc); - } - - public void ctxErrNoMemory() { - increment(HPyJNIUpcall.HPyErrNoMemory); - executeIntContextFunction(HPyContextMember.CTX_ERR_NOMEMORY, new long[]{}); - } - - public void ctxErrClear() { - increment(HPyJNIUpcall.HPyErrClear); - executeIntContextFunction(HPyContextMember.CTX_ERR_CLEAR, new long[]{}); - } - - public long ctxErrNewException(long name, long base, long dict) { - increment(HPyJNIUpcall.HPyErrNewException); - return executeLongContextFunction(HPyContextMember.CTX_ERR_NEWEXCEPTION, new long[]{name, base, dict}); - } - - public long ctxErrNewExceptionWithDoc(long name, long doc, long base, long dict) { - increment(HPyJNIUpcall.HPyErrNewExceptionWithDoc); - return executeLongContextFunction(HPyContextMember.CTX_ERR_NEWEXCEPTIONWITHDOC, new long[]{name, doc, base, dict}); - } - - public int ctxErrWarnEx(long category, long message, long stack_level) { - increment(HPyJNIUpcall.HPyErrWarnEx); - return executeIntContextFunction(HPyContextMember.CTX_ERR_WARNEX, new long[]{category, message, stack_level}); - } - - public void ctxErrWriteUnraisable(long obj) { - increment(HPyJNIUpcall.HPyErrWriteUnraisable); - executeIntBinaryContextFunction(HPyContextMember.CTX_ERR_WRITEUNRAISABLE, obj); - } - - public int ctxIsTrue(long h) { - increment(HPyJNIUpcall.HPyIsTrue); - return executeIntBinaryContextFunction(HPyContextMember.CTX_ISTRUE, h); - } - - public long ctxTypeFromSpec(long spec, long params) { - increment(HPyJNIUpcall.HPyTypeFromSpec); - return executeLongTernaryContextFunction(HPyContextMember.CTX_TYPE_FROMSPEC, spec, params); - } - - public long ctxGetAttr(long obj, long name) { - increment(HPyJNIUpcall.HPyGetAttr); - return executeLongTernaryContextFunction(HPyContextMember.CTX_GETATTR, obj, name); - } - - public int ctxHasAttr(long obj, long name) { - increment(HPyJNIUpcall.HPyHasAttr); - return executeIntTernaryContextFunction(HPyContextMember.CTX_HASATTR, obj, name); - } - - public int ctxHasAttrs(long obj, long name) { - increment(HPyJNIUpcall.HPyHasAttrs); - return executeIntTernaryContextFunction(HPyContextMember.CTX_HASATTR_S, obj, name); - } - - public int ctxSetAttr(long obj, long name, long value) { - increment(HPyJNIUpcall.HPySetAttr); - return executeIntContextFunction(HPyContextMember.CTX_SETATTR, new long[]{obj, name, value}); - } - - public int ctxSetAttrs(long obj, long name, long value) { - increment(HPyJNIUpcall.HPySetAttrs); - return executeIntContextFunction(HPyContextMember.CTX_SETATTR_S, new long[]{obj, name, value}); - } - - public long ctxGetItem(long obj, long key) { - increment(HPyJNIUpcall.HPyGetItem); - return executeLongTernaryContextFunction(HPyContextMember.CTX_GETITEM, obj, key); - } - - public int ctxContains(long container, long key) { - increment(HPyJNIUpcall.HPyContains); - return executeIntTernaryContextFunction(HPyContextMember.CTX_CONTAINS, container, key); - } - - public int ctxTypeIsSubtype(long sub, long type) { - increment(HPyJNIUpcall.HPyTypeIsSubtype); - return executeIntTernaryContextFunction(HPyContextMember.CTX_TYPE_ISSUBTYPE, sub, type); - } - - public long ctxRepr(long obj) { - increment(HPyJNIUpcall.HPyRepr); - return executeLongBinaryContextFunction(HPyContextMember.CTX_REPR, obj); - } - - public long ctxStr(long obj) { - increment(HPyJNIUpcall.HPyStr); - return executeLongBinaryContextFunction(HPyContextMember.CTX_STR, obj); - } - - public long ctxASCII(long obj) { - increment(HPyJNIUpcall.HPyASCII); - return executeLongBinaryContextFunction(HPyContextMember.CTX_ASCII, obj); - } - - public long ctxBytes(long obj) { - increment(HPyJNIUpcall.HPyBytes); - return executeLongBinaryContextFunction(HPyContextMember.CTX_BYTES, obj); - } - - public long ctxRichCompare(long v, long w, int op) { - increment(HPyJNIUpcall.HPyRichCompare); - return executeLongContextFunction(HPyContextMember.CTX_RICHCOMPARE, new Object[]{v, w, op}); - } - - public int ctxRichCompareBool(long v, long w, int op) { - increment(HPyJNIUpcall.HPyRichCompareBool); - return executeIntContextFunction(HPyContextMember.CTX_RICHCOMPAREBOOL, new Object[]{v, w, op}); - } - - public long ctxHash(long obj) { - increment(HPyJNIUpcall.HPyHash); - return executeLongBinaryContextFunction(HPyContextMember.CTX_HASH, obj); - } - - public int ctxBytesCheck(long h) { - increment(HPyJNIUpcall.HPyBytesCheck); - if (GraalHPyBoxing.isBoxedHandle(h)) { - Object object = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(h)); - if (object instanceof PBytes) { - return 1; - } - return executeIntBinaryContextFunction(HPyContextMember.CTX_BYTES_CHECK, h); - } - return 0; - } - - public long ctxBytesSize(long h) { - increment(HPyJNIUpcall.HPyBytesSize); - return executeLongBinaryContextFunction(HPyContextMember.CTX_BYTES_SIZE, h); - } - - public long ctxBytesGETSIZE(long h) { - increment(HPyJNIUpcall.HPyBytesGETSIZE); - return executeLongBinaryContextFunction(HPyContextMember.CTX_BYTES_GET_SIZE, h); - } - - public long ctxBytesAsString(long h) { - increment(HPyJNIUpcall.HPyBytesAsString); - return executeLongBinaryContextFunction(HPyContextMember.CTX_BYTES_ASSTRING, h); - } - - public long ctxBytesASSTRING(long h) { - increment(HPyJNIUpcall.HPyBytesASSTRING); - return executeLongBinaryContextFunction(HPyContextMember.CTX_BYTES_AS_STRING, h); - } - - public long ctxBytesFromString(long v) { - increment(HPyJNIUpcall.HPyBytesFromString); - return executeLongBinaryContextFunction(HPyContextMember.CTX_BYTES_FROMSTRING, v); - } - - public long ctxBytesFromStringAndSize(long v, long len) { - increment(HPyJNIUpcall.HPyBytesFromStringAndSize); - return executeLongTernaryContextFunction(HPyContextMember.CTX_BYTES_FROMSTRINGANDSIZE, v, len); - } - - public long ctxUnicodeFromString(long utf8) { - increment(HPyJNIUpcall.HPyUnicodeFromString); - return executeLongBinaryContextFunction(HPyContextMember.CTX_UNICODE_FROMSTRING, utf8); - } - - public int ctxUnicodeCheck(long h) { - increment(HPyJNIUpcall.HPyUnicodeCheck); - return executeIntBinaryContextFunction(HPyContextMember.CTX_UNICODE_CHECK, h); - } - - public long ctxUnicodeAsASCIIString(long h) { - increment(HPyJNIUpcall.HPyUnicodeAsASCIIString); - return executeLongBinaryContextFunction(HPyContextMember.CTX_UNICODE_ASASCIISTRING, h); - } - - public long ctxUnicodeAsLatin1String(long h) { - increment(HPyJNIUpcall.HPyUnicodeAsLatin1String); - return executeLongBinaryContextFunction(HPyContextMember.CTX_UNICODE_ASLATIN1STRING, h); - } - - public long ctxUnicodeAsUTF8String(long h) { - increment(HPyJNIUpcall.HPyUnicodeAsUTF8String); - return executeLongBinaryContextFunction(HPyContextMember.CTX_UNICODE_ASUTF8STRING, h); - } - - public long ctxUnicodeAsUTF8AndSize(long h, long size) { - increment(HPyJNIUpcall.HPyUnicodeAsUTF8AndSize); - Object string = context.bitsAsPythonObject(h); - TruffleString tsUtf8; - try { - tsUtf8 = SwitchEncodingNode.getUncached().execute(CastToTruffleStringNode.executeUncached(string), Encoding.UTF_8); - } catch (CannotCastException e) { - return HPyRaiseNode.raiseIntUncached(context, 0, TypeError, ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP); - } - TruffleString nativeTName = AsNativeNode.getUncached().execute(tsUtf8, TS_NATIVE_ALLOCATOR, Encoding.UTF_8, false, true); - Object result = GetInternalNativePointerNode.getUncached().execute(nativeTName, Encoding.UTF_8); - if (size != 0) { - InternalByteArray internalByteArray = GetInternalByteArrayNode.getUncached().execute(tsUtf8, Encoding.UTF_8); - UnsafeWriteSizeTNode.write(size, internalByteArray.getLength()); - } - - if (result instanceof NativePointer nativePointer) { - return nativePointer.asPointer(); - } - return interopPointerToNative(result, InteropLibrary.getUncached(result)); - } - - public long ctxUnicodeDecodeFSDefault(long v) { - increment(HPyJNIUpcall.HPyUnicodeDecodeFSDefault); - return executeLongBinaryContextFunction(HPyContextMember.CTX_UNICODE_DECODEFSDEFAULT, v); - } - - public long ctxUnicodeDecodeFSDefaultAndSize(long v, long size) { - increment(HPyJNIUpcall.HPyUnicodeDecodeFSDefaultAndSize); - return executeLongTernaryContextFunction(HPyContextMember.CTX_UNICODE_DECODEFSDEFAULTANDSIZE, v, size); - } - - public long ctxUnicodeEncodeFSDefault(long h) { - increment(HPyJNIUpcall.HPyUnicodeEncodeFSDefault); - return executeLongBinaryContextFunction(HPyContextMember.CTX_UNICODE_ENCODEFSDEFAULT, h); - } - - public int ctxUnicodeReadChar(long h, long index) { - increment(HPyJNIUpcall.HPyUnicodeReadChar); - return executeIntTernaryContextFunction(HPyContextMember.CTX_UNICODE_READCHAR, h, index); - } - - public long ctxUnicodeDecodeASCII(long s, long size, long errors) { - increment(HPyJNIUpcall.HPyUnicodeDecodeASCII); - return executeLongContextFunction(HPyContextMember.CTX_UNICODE_DECODEASCII, new long[]{s, size, errors}); - } - - public long ctxUnicodeDecodeLatin1(long s, long size, long errors) { - increment(HPyJNIUpcall.HPyUnicodeDecodeLatin1); - return executeLongContextFunction(HPyContextMember.CTX_UNICODE_DECODELATIN1, new long[]{s, size, errors}); - } - - public long ctxUnicodeFromEncodedObject(long obj, long encoding, long errors) { - increment(HPyJNIUpcall.HPyUnicodeFromEncodedObject); - return executeLongContextFunction(HPyContextMember.CTX_UNICODE_FROMENCODEDOBJECT, new long[]{obj, encoding, errors}); - } - - public long ctxUnicodeSubstring(long obj, long start, long end) { - increment(HPyJNIUpcall.HPyUnicodeSubstring); - return executeLongContextFunction(HPyContextMember.CTX_UNICODE_SUBSTRING, new long[]{obj, start, end}); - } - - public int ctxListAppend(long h_list, long h_item) { - increment(HPyJNIUpcall.HPyListAppend); - return executeIntTernaryContextFunction(HPyContextMember.CTX_LIST_APPEND, h_list, h_item); - } - - public int ctxDictCheck(long h) { - increment(HPyJNIUpcall.HPyDictCheck); - return executeIntBinaryContextFunction(HPyContextMember.CTX_DICT_CHECK, h); - } - - public long ctxDictKeys(long h) { - increment(HPyJNIUpcall.HPyDictKeys); - return executeLongBinaryContextFunction(HPyContextMember.CTX_DICT_KEYS, h); - } - - public int ctxTupleCheck(long h) { - increment(HPyJNIUpcall.HPyTupleCheck); - return executeIntBinaryContextFunction(HPyContextMember.CTX_TUPLE_CHECK, h); - } - - public int ctxSliceUnpack(long slice, long start, long stop, long step) { - increment(HPyJNIUpcall.HPySliceUnpack); - return executeIntContextFunction(HPyContextMember.CTX_SLICE_UNPACK, new long[]{slice, start, stop, step}); - } - - public long ctxContextVarNew(long name, long default_value) { - increment(HPyJNIUpcall.HPyContextVarNew); - return executeLongTernaryContextFunction(HPyContextMember.CTX_CONTEXTVAR_NEW, name, default_value); - } - - public long ctxContextVarSet(long context_var, long value) { - increment(HPyJNIUpcall.HPyContextVarSet); - return executeLongTernaryContextFunction(HPyContextMember.CTX_CONTEXTVAR_SET, context_var, value); - } - - public long ctxImportImportModule(long name) { - increment(HPyJNIUpcall.HPyImportImportModule); - return executeLongBinaryContextFunction(HPyContextMember.CTX_IMPORT_IMPORTMODULE, name); - } - - public int ctxCapsuleIsValid(long capsule, long name) { - increment(HPyJNIUpcall.HPyCapsuleIsValid); - return executeIntTernaryContextFunction(HPyContextMember.CTX_CAPSULE_ISVALID, capsule, name); - } - - public int ctxCapsuleSet(long capsule, int key, long value) { - increment(HPyJNIUpcall.HPyCapsuleSet); - return executeIntContextFunction(HPyContextMember.CTX_CAPSULE_SET, new Object[]{capsule, key, value}); - } - - public long ctxFromPyObject(long obj) { - increment(HPyJNIUpcall.HPyFromPyObject); - return executeLongBinaryContextFunction(HPyContextMember.CTX_FROMPYOBJECT, obj); - } - - public long ctxAsPyObject(long h) { - increment(HPyJNIUpcall.HPyAsPyObject); - return executeLongBinaryContextFunction(HPyContextMember.CTX_ASPYOBJECT, h); - } - - public long ctxListBuilderNew(long initial_size) { - increment(HPyJNIUpcall.HPyListBuilderNew); - return executeLongBinaryContextFunction(HPyContextMember.CTX_LISTBUILDER_NEW, initial_size); - } - - public void ctxListBuilderSet(long builder, long index, long h_item) { - increment(HPyJNIUpcall.HPyListBuilderSet); - executeIntContextFunction(HPyContextMember.CTX_LISTBUILDER_SET, new long[]{builder, index, h_item}); - } - - public long ctxListBuilderBuild(long builder) { - increment(HPyJNIUpcall.HPyListBuilderBuild); - return executeLongBinaryContextFunction(HPyContextMember.CTX_LISTBUILDER_BUILD, builder); - } - - public void ctxListBuilderCancel(long builder) { - increment(HPyJNIUpcall.HPyListBuilderCancel); - executeIntBinaryContextFunction(HPyContextMember.CTX_LISTBUILDER_CANCEL, builder); - } - - public long ctxTupleBuilderNew(long initial_size) { - increment(HPyJNIUpcall.HPyTupleBuilderNew); - return executeLongBinaryContextFunction(HPyContextMember.CTX_TUPLEBUILDER_NEW, initial_size); - } - - public void ctxTupleBuilderSet(long builder, long index, long h_item) { - increment(HPyJNIUpcall.HPyTupleBuilderSet); - executeIntContextFunction(HPyContextMember.CTX_TUPLEBUILDER_SET, new long[]{builder, index, h_item}); - } - - public long ctxTupleBuilderBuild(long builder) { - increment(HPyJNIUpcall.HPyTupleBuilderBuild); - return executeLongBinaryContextFunction(HPyContextMember.CTX_TUPLEBUILDER_BUILD, builder); - } - - public void ctxTupleBuilderCancel(long builder) { - increment(HPyJNIUpcall.HPyTupleBuilderCancel); - executeIntBinaryContextFunction(HPyContextMember.CTX_TUPLEBUILDER_CANCEL, builder); - } - - public void ctxReenterPythonExecution(long state) { - increment(HPyJNIUpcall.HPyReenterPythonExecution); - executeIntBinaryContextFunction(HPyContextMember.CTX_REENTERPYTHONEXECUTION, state); - } - - public long ctxLeavePythonExecution() { - increment(HPyJNIUpcall.HPyLeavePythonExecution); - return executeLongContextFunction(HPyContextMember.CTX_LEAVEPYTHONEXECUTION, new long[]{}); - } - - public void ctxDump(long h) { - increment(HPyJNIUpcall.HPyDump); - executeIntBinaryContextFunction(HPyContextMember.CTX_DUMP, h); - } - - public long ctxCall(long callable, long args, long lnargs, long kwnames) { - increment(HPyJNIUpcall.HPyCall); - // some assumptions that may be made - assert callable != 0 && GraalHPyBoxing.isBoxedHandle(callable); - assert kwnames == 0 || GraalHPyBoxing.isBoxedHandle(kwnames); - assert args != 0 || lnargs == 0; - try { - if (!PInt.isIntRange(lnargs)) { - throw PRaiseNode.raiseUncached(null, PythonBuiltinClassType.TypeError, ErrorMessages.OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT, 0); - } - int nargs = (int) lnargs; - Object callableObj = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(callable)); - - PKeyword[] keywords; - Object[] argsArr = new Object[nargs]; - for (int i = 0; i < argsArr.length; i++) { - long argBits = UNSAFE.getLong(args + i * SIZEOF_LONG); - argsArr[i] = context.bitsAsPythonObject(argBits); - } - - if (kwnames != 0) { - Object kwnamesObj = context.getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(kwnames)); - if (kwnamesObj instanceof PTuple kwnamesTuple) { - int nkw = kwnamesTuple.getSequenceStorage().length(); - Object[] kwvalues = new Object[nkw]; - long kwvaluesPtr = args + nargs * SIZEOF_LONG; - for (int i = 0; i < kwvalues.length; i++) { - long argBits = UNSAFE.getLong(kwvaluesPtr + i * SIZEOF_LONG); - kwvalues[i] = context.bitsAsPythonObject(argBits); - } - keywords = HPyPackKeywordArgsNodeGen.getUncached().execute(null, kwvalues, kwnamesTuple, nkw); - } else { - // fatal error (CPython would just cause a memory corruption) - throw CompilerDirectives.shouldNotReachHere(); - } - } else { - keywords = PKeyword.EMPTY_KEYWORDS; - } - - Object result = CallNode.executeUncached(callableObj, argsArr, keywords); - return context.pythonObjectAsBits(result); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(e); - return 0; - } catch (Throwable t) { - throw checkThrowableBeforeNative(t, "HPy context function", HPyJNIUpcall.HPyCall.getName()); - } - } - - public long ctxCallMethod(long name, long args, long nargs, long kwnames) { - increment(HPyJNIUpcall.HPyCallMethod); - return executeLongContextFunction(HPyContextMember.CTX_CALLMETHOD, new long[]{name, args, nargs, kwnames}); - } - - public int ctxDelItem(long obj, long key) { - increment(HPyJNIUpcall.HPyDelItem); - return executeIntTernaryContextFunction(HPyContextMember.CTX_DELITEM, obj, key); - } - - public int ctxDelItemi(long obj, long idx) { - increment(HPyJNIUpcall.HPyDelItemi); - return executeIntTernaryContextFunction(HPyContextMember.CTX_DELITEM_I, obj, idx); - } - - public int ctxDelItems(long obj, long utf8_key) { - increment(HPyJNIUpcall.HPyDelItems); - return executeIntTernaryContextFunction(HPyContextMember.CTX_DELITEM_S, obj, utf8_key); - } - - public int ctxTypeGetBuiltinShape(long h_type) { - increment(HPyJNIUpcall.HPyTypeGetBuiltinShape); - assert GraalHPyBoxing.isBoxedHandle(h_type); - Object typeObject = context.bitsAsPythonObject(h_type); - int result = GraalHPyDef.getBuiltinShapeFromHiddenAttribute(typeObject); - if (result == -2) { - return HPyRaiseNode.raiseIntUncached(context, -2, TypeError, ErrorMessages.S_MUST_BE_S, "arg", "type"); - } - assert GraalHPyDef.isValidBuiltinShape(result); - return result; - } - - public long ctxDictCopy(long h) { - increment(HPyJNIUpcall.HPyDictCopy); - return executeLongBinaryContextFunction(HPyContextMember.CTX_DICT_COPY, h); - } - - public long ctxCompiles(long utf8_source, long utf8_filename, int kind) { - increment(HPyJNIUpcall.HPyCompiles); - return executeLongContextFunction(HPyContextMember.CTX_COMPILE_S, new Object[]{utf8_source, utf8_filename, kind}); - } - - public long ctxEvalCode(long code, long globals, long locals) { - increment(HPyJNIUpcall.HPyEvalCode); - return executeLongContextFunction(HPyContextMember.CTX_EVALCODE, new long[]{code, globals, locals}); - } - - public int ctxSetCallFunction(long h, long func) { - increment(HPyJNIUpcall.HPySetCallFunction); - return executeIntTernaryContextFunction(HPyContextMember.CTX_SETCALLFUNCTION, h, func); - } - // {{end ctx funcs}} - - private long createConstant(Object value) { - return context.getHPyContextHandle(value); - } - - private long createBuiltinsConstant() { - return createConstant(GetOrCreateDictNode.executeUncached(context.getContext().getBuiltins())); - } - - private static long createSingletonConstant(Object value, int handle) { - assert GraalHPyContext.getHPyHandleForSingleton(value) == handle; - return handle; - } - - private long createTypeConstant(PythonBuiltinClassType value) { - return context.getHPyContextHandle(context.getContext().lookupType(value)); - } - - /** - * Creates the context handles, i.e., allocates a handle for each object that is available in - * {@code HPyContext} (e.g. {@code HPyContext.h_None}). This table is then intended to be used - * to initialize the native {@code HPyContext *}. The handles are stored in a {@code long} array - * and the index for each handle is the context index (i.e. the index as specified in - * HPy's {@code public_api.h}). - */ - private long[] createContextHandleArray() { - // {{start ctx handles array}} - // @formatter:off - // Checkstyle: stop - // DO NOT EDIT THIS PART! - // This part is automatically generated by hpy.tools.autogen.graalpy.autogen_ctx_handles_init - long[] ctxHandles = new long[244]; - ctxHandles[0] = createSingletonConstant(PNone.NONE, SINGLETON_HANDLE_NONE); - ctxHandles[1] = createConstant(context.getContext().getTrue()); - ctxHandles[2] = createConstant(context.getContext().getFalse()); - ctxHandles[3] = createSingletonConstant(PNotImplemented.NOT_IMPLEMENTED, SINGLETON_HANDLE_NOT_IMPLEMENTED); - ctxHandles[4] = createSingletonConstant(PEllipsis.INSTANCE, SINGLETON_HANDLE_ELIPSIS); - ctxHandles[5] = createTypeConstant(PythonBuiltinClassType.PBaseException); - ctxHandles[6] = createTypeConstant(PythonBuiltinClassType.Exception); - ctxHandles[7] = createTypeConstant(PythonBuiltinClassType.StopAsyncIteration); - ctxHandles[8] = createTypeConstant(PythonBuiltinClassType.StopIteration); - ctxHandles[9] = createTypeConstant(PythonBuiltinClassType.GeneratorExit); - ctxHandles[10] = createTypeConstant(PythonBuiltinClassType.ArithmeticError); - ctxHandles[11] = createTypeConstant(PythonBuiltinClassType.LookupError); - ctxHandles[12] = createTypeConstant(PythonBuiltinClassType.AssertionError); - ctxHandles[13] = createTypeConstant(PythonBuiltinClassType.AttributeError); - ctxHandles[14] = createTypeConstant(PythonBuiltinClassType.BufferError); - ctxHandles[15] = createTypeConstant(PythonBuiltinClassType.EOFError); - ctxHandles[16] = createTypeConstant(PythonBuiltinClassType.FloatingPointError); - ctxHandles[17] = createTypeConstant(PythonBuiltinClassType.OSError); - ctxHandles[18] = createTypeConstant(PythonBuiltinClassType.ImportError); - ctxHandles[19] = createTypeConstant(PythonBuiltinClassType.ModuleNotFoundError); - ctxHandles[20] = createTypeConstant(PythonBuiltinClassType.IndexError); - ctxHandles[21] = createTypeConstant(PythonBuiltinClassType.KeyError); - ctxHandles[22] = createTypeConstant(PythonBuiltinClassType.KeyboardInterrupt); - ctxHandles[23] = createTypeConstant(PythonBuiltinClassType.MemoryError); - ctxHandles[24] = createTypeConstant(PythonBuiltinClassType.NameError); - ctxHandles[25] = createTypeConstant(PythonBuiltinClassType.OverflowError); - ctxHandles[26] = createTypeConstant(PythonBuiltinClassType.RuntimeError); - ctxHandles[27] = createTypeConstant(PythonBuiltinClassType.RecursionError); - ctxHandles[28] = createTypeConstant(PythonBuiltinClassType.NotImplementedError); - ctxHandles[29] = createTypeConstant(PythonBuiltinClassType.SyntaxError); - ctxHandles[30] = createTypeConstant(PythonBuiltinClassType.IndentationError); - ctxHandles[31] = createTypeConstant(PythonBuiltinClassType.TabError); - ctxHandles[32] = createTypeConstant(PythonBuiltinClassType.ReferenceError); - ctxHandles[33] = createTypeConstant(SystemError); - ctxHandles[34] = createTypeConstant(PythonBuiltinClassType.SystemExit); - ctxHandles[35] = createTypeConstant(PythonBuiltinClassType.TypeError); - ctxHandles[36] = createTypeConstant(PythonBuiltinClassType.UnboundLocalError); - ctxHandles[37] = createTypeConstant(PythonBuiltinClassType.UnicodeError); - ctxHandles[38] = createTypeConstant(PythonBuiltinClassType.UnicodeEncodeError); - ctxHandles[39] = createTypeConstant(PythonBuiltinClassType.UnicodeDecodeError); - ctxHandles[40] = createTypeConstant(PythonBuiltinClassType.UnicodeTranslateError); - ctxHandles[41] = createTypeConstant(PythonBuiltinClassType.ValueError); - ctxHandles[42] = createTypeConstant(PythonBuiltinClassType.ZeroDivisionError); - ctxHandles[43] = createTypeConstant(PythonBuiltinClassType.BlockingIOError); - ctxHandles[44] = createTypeConstant(PythonBuiltinClassType.BrokenPipeError); - ctxHandles[45] = createTypeConstant(PythonBuiltinClassType.ChildProcessError); - ctxHandles[46] = createTypeConstant(PythonBuiltinClassType.ConnectionError); - ctxHandles[47] = createTypeConstant(PythonBuiltinClassType.ConnectionAbortedError); - ctxHandles[48] = createTypeConstant(PythonBuiltinClassType.ConnectionRefusedError); - ctxHandles[49] = createTypeConstant(PythonBuiltinClassType.ConnectionResetError); - ctxHandles[50] = createTypeConstant(PythonBuiltinClassType.FileExistsError); - ctxHandles[51] = createTypeConstant(PythonBuiltinClassType.FileNotFoundError); - ctxHandles[52] = createTypeConstant(PythonBuiltinClassType.InterruptedError); - ctxHandles[53] = createTypeConstant(PythonBuiltinClassType.IsADirectoryError); - ctxHandles[54] = createTypeConstant(PythonBuiltinClassType.NotADirectoryError); - ctxHandles[55] = createTypeConstant(PythonBuiltinClassType.PermissionError); - ctxHandles[56] = createTypeConstant(PythonBuiltinClassType.ProcessLookupError); - ctxHandles[57] = createTypeConstant(PythonBuiltinClassType.TimeoutError); - ctxHandles[58] = createTypeConstant(PythonBuiltinClassType.Warning); - ctxHandles[59] = createTypeConstant(PythonBuiltinClassType.UserWarning); - ctxHandles[60] = createTypeConstant(PythonBuiltinClassType.DeprecationWarning); - ctxHandles[61] = createTypeConstant(PythonBuiltinClassType.PendingDeprecationWarning); - ctxHandles[62] = createTypeConstant(PythonBuiltinClassType.SyntaxWarning); - ctxHandles[63] = createTypeConstant(PythonBuiltinClassType.RuntimeWarning); - ctxHandles[64] = createTypeConstant(PythonBuiltinClassType.FutureWarning); - ctxHandles[65] = createTypeConstant(PythonBuiltinClassType.ImportWarning); - ctxHandles[66] = createTypeConstant(PythonBuiltinClassType.UnicodeWarning); - ctxHandles[67] = createTypeConstant(PythonBuiltinClassType.BytesWarning); - ctxHandles[68] = createTypeConstant(PythonBuiltinClassType.ResourceWarning); - ctxHandles[69] = createTypeConstant(PythonBuiltinClassType.PythonObject); - ctxHandles[70] = createTypeConstant(PythonBuiltinClassType.PythonClass); - ctxHandles[71] = createTypeConstant(PythonBuiltinClassType.Boolean); - ctxHandles[72] = createTypeConstant(PythonBuiltinClassType.PInt); - ctxHandles[73] = createTypeConstant(PythonBuiltinClassType.PFloat); - ctxHandles[74] = createTypeConstant(PythonBuiltinClassType.PString); - ctxHandles[75] = createTypeConstant(PythonBuiltinClassType.PTuple); - ctxHandles[76] = createTypeConstant(PythonBuiltinClassType.PList); - ctxHandles[238] = createTypeConstant(PythonBuiltinClassType.PComplex); - ctxHandles[239] = createTypeConstant(PythonBuiltinClassType.PBytes); - ctxHandles[240] = createTypeConstant(PythonBuiltinClassType.PMemoryView); - ctxHandles[241] = createTypeConstant(PythonBuiltinClassType.Capsule); - ctxHandles[242] = createTypeConstant(PythonBuiltinClassType.PSlice); - ctxHandles[243] = createBuiltinsConstant(); - return ctxHandles; - - // @formatter:on - // Checkstyle: resume - // {{end ctx handles array}} - } - - private Object executeContextFunction(HPyContextMember member, long[] arguments) { - HPyContextSignature signature = member.getSignature(); - HPyContextSignatureType[] argTypes = signature.parameterTypes(); - assert arguments.length == argTypes.length - 1; - Object[] argCast = new Object[argTypes.length]; - argCast[0] = context; - for (int i = 1; i < argCast.length; i++) { - argCast[i] = convertLongArg(argTypes[i], arguments[i - 1]); - } - return GraalHPyContextFunction.getUncached(member).execute(argCast); - } - - private Object executeBinaryContextFunction(HPyContextMember member, long larg0) { - HPyContextSignature signature = member.getSignature(); - HPyContextSignatureType[] argTypes = signature.parameterTypes(); - assert argTypes.length - 1 == 1; - Object arg0 = convertLongArg(argTypes[1], larg0); - return ((HPyBinaryContextFunction) GraalHPyContextFunction.getUncached(member)).execute(context, arg0); - } - - private Object executeTernaryContextFunction(HPyContextMember member, long larg0, long larg1) { - HPyContextSignature signature = member.getSignature(); - HPyContextSignatureType[] argTypes = signature.parameterTypes(); - assert argTypes.length - 1 == 2; - Object arg0 = convertLongArg(argTypes[1], larg0); - Object arg1 = convertLongArg(argTypes[2], larg1); - return ((HPyTernaryContextFunction) GraalHPyContextFunction.getUncached(member)).execute(context, arg0, arg1); - } - - private Object executeContextFunction(HPyContextMember member, Object[] arguments) { - HPyContextSignature signature = member.getSignature(); - HPyContextSignatureType[] argTypes = signature.parameterTypes(); - assert arguments.length == argTypes.length - 1; - Object[] argCast = new Object[argTypes.length]; - argCast[0] = context; - for (int i = 1; i < argCast.length; i++) { - argCast[i] = convertArg(argTypes[i], arguments[i - 1]); - } - return GraalHPyContextFunction.getUncached(member).execute(argCast); - } - - private long executeLongContextFunction(HPyContextMember member, long[] arguments) { - try { - Object result = executeContextFunction(member, arguments); - return convertLongRet(member.getSignature().returnType(), result); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(e); - return getLongErrorValue(member.getSignature().returnType()); - } catch (Throwable t) { - throw checkThrowableBeforeNative(t, "HPy context function", member.getName()); - } - } - - private long executeLongBinaryContextFunction(HPyContextMember member, long arg0) { - try { - Object result = executeBinaryContextFunction(member, arg0); - return convertLongRet(member.getSignature().returnType(), result); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(e); - return getLongErrorValue(member.getSignature().returnType()); - } catch (Throwable t) { - throw checkThrowableBeforeNative(t, "HPy context function", member.getName()); - } - } - - private long executeLongTernaryContextFunction(HPyContextMember member, long arg0, long arg1) { - try { - Object result = executeTernaryContextFunction(member, arg0, arg1); - return convertLongRet(member.getSignature().returnType(), result); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(e); - return getLongErrorValue(member.getSignature().returnType()); - } catch (Throwable t) { - throw checkThrowableBeforeNative(t, "HPy context function", member.getName()); - } - } - - private int executeIntContextFunction(HPyContextMember member, long[] arguments) { - try { - Object result = executeContextFunction(member, arguments); - return convertIntRet(member.getSignature().returnType(), result); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(e); - return getIntErrorValue(member.getSignature().returnType()); - } catch (Throwable t) { - throw checkThrowableBeforeNative(t, "HPy context function", member.getName()); - } - } - - @TruffleBoundary - private int executeIntBinaryContextFunction(HPyContextMember member, long arg0) { - try { - Object result = executeBinaryContextFunction(member, arg0); - return convertIntRet(member.getSignature().returnType(), result); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(e); - return getIntErrorValue(member.getSignature().returnType()); - } catch (Throwable t) { - throw checkThrowableBeforeNative(t, "HPy context function", member.getName()); - } - } - - private int executeIntTernaryContextFunction(HPyContextMember member, long arg0, long arg1) { - try { - Object result = executeTernaryContextFunction(member, arg0, arg1); - return convertIntRet(member.getSignature().returnType(), result); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(e); - return getIntErrorValue(member.getSignature().returnType()); - } catch (Throwable t) { - throw checkThrowableBeforeNative(t, "HPy context function", member.getName()); - } - } - - private long executeLongContextFunction(HPyContextMember member, Object[] arguments) { - try { - Object result = executeContextFunction(member, arguments); - return convertLongRet(member.getSignature().returnType(), result); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(e); - return getLongErrorValue(member.getSignature().returnType()); - } catch (Throwable t) { - throw checkThrowableBeforeNative(t, "HPy context function", member.getName()); - } - } - - private int executeIntContextFunction(HPyContextMember member, Object[] arguments) { - try { - Object result = executeContextFunction(member, arguments); - return convertIntRet(member.getSignature().returnType(), result); - } catch (PException e) { - HPyTransformExceptionToNativeNode.executeUncached(e); - return getIntErrorValue(member.getSignature().returnType()); - } catch (Throwable t) { - throw checkThrowableBeforeNative(t, "HPy context function", member.getName()); - } - } - - private Object convertLongArg(HPyContextSignatureType type, long argBits) { - return switch (type) { - case HPy, HPyThreadState, HPyListBuilder, HPyTupleBuilder -> context.bitsAsPythonObject(argBits); - case Int, HPy_UCS4 -> -1; - case Int64_t, Uint64_t, Size_t, HPy_ssize_t, HPy_hash_t, VoidPtr, CVoid -> argBits; - case Int32_t, Uint32_t -> argBits & 0xFFFFFFFFL; - case CDouble -> throw CompilerDirectives.shouldNotReachHere("invalid argument handle"); - case HPyModuleDefPtr, HPyType_SpecPtr, HPyType_SpecParamPtr, HPy_ssize_tPtr, ConstHPyPtr, HPyPtr, HPyCallFunctionPtr, CharPtr, ConstCharPtr -> argBits; - case Cpy_PyObjectPtr -> nativeToInteropPointer(argBits); - default -> throw CompilerDirectives.shouldNotReachHere("unsupported arg type"); - }; - } - - private Object convertArg(HPyContextSignatureType type, Object arg) { - return switch (type) { - case Int, Int32_t, Uint32_t, HPy_UCS4, _HPyCapsule_key, HPy_SourceKind -> (Integer) arg; - default -> convertLongArg(type, (Long) arg); - }; - } - - private long convertLongRet(HPyContextSignatureType type, Object result) { - return switch (type) { - case HPy, HPyThreadState, HPyListBuilder, HPyTupleBuilder -> GraalHPyBoxing.boxHandle(context.getHPyHandleForObject(result)); - case VoidPtr, CharPtr, ConstCharPtr, Cpy_PyObjectPtr -> coerceToPointer(result); - case Int64_t, Uint64_t, Size_t, HPy_ssize_t, HPy_hash_t -> (Long) HPyAsNativeInt64NodeGen.getUncached().execute(result); - default -> throw CompilerDirectives.shouldNotReachHere(); - }; - } - - private int convertIntRet(HPyContextSignatureType type, Object result) { - return switch (type) { - case Int, Int32_t, Uint32_t, HPy_UCS4 -> (int) result; - case CVoid -> 0; - default -> throw CompilerDirectives.shouldNotReachHere(); - }; - } - - private long getLongErrorValue(HPyContextSignatureType type) { - return switch (type) { - case HPy, VoidPtr, CharPtr, ConstCharPtr, Cpy_PyObjectPtr, HPyListBuilder, HPyTupleBuilder, HPyThreadState -> 0; - case Int64_t, Uint64_t, Size_t, HPy_ssize_t, HPy_hash_t -> -1L; - default -> throw CompilerDirectives.shouldNotReachHere(); - }; - } - - private int getIntErrorValue(HPyContextSignatureType type) { - return switch (type) { - case Int, Int32_t, Uint32_t, HPy_UCS4 -> -1; - case CVoid -> 0; - case HPyType_BuiltinShape -> -2; - default -> throw CompilerDirectives.shouldNotReachHere(); - }; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/jni/GraalHPyJNIConvertArgNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/jni/GraalHPyJNIConvertArgNode.java deleted file mode 100644 index db63b1a2d1..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/jni/GraalHPyJNIConvertArgNode.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy.jni; - -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyBoxing; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.GetHPyHandleForSingleton; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.LLVMType; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFactory.GetHPyHandleForSingletonNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyHandle; -import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.ConditionProfile; - -public abstract class GraalHPyJNIConvertArgNode extends Node { - - private static final GraalHPyJNIConvertArgUncachedNode UNCACHED = new GraalHPyJNIConvertArgUncachedNode(); - - @NeverDefault - public static GraalHPyJNIConvertArgNode create(@SuppressWarnings("unused") LLVMType signature) { - return new GraalHPyJNIConvertArgCachedNode(); - } - - public static GraalHPyJNIConvertArgNode getUncached(@SuppressWarnings("unused") LLVMType signature) { - return UNCACHED; - } - - public abstract long execute(Object[] arguments, int i); - - protected static GraalHPyJNIContext getHPyContext(Object[] arguments) { - Object backend = arguments[0]; - if (backend instanceof GraalHPyJNIContext jniBackend) { - return jniBackend; - } - /* - * That's clearly an internal error because we cannot have a GraalHPyJNIConvertArgNode - * instance if we are not using the JNI backend. - */ - throw CompilerDirectives.shouldNotReachHere("first argument is expected to the HPy context"); - } - - static final class GraalHPyJNIConvertArgCachedNode extends GraalHPyJNIConvertArgNode { - /** - * Carefully picked limit. Expected possible argument object types are: LLVM native pointer, - * LLVM managed pointer, {@link GraalHPyContext}, and {@link GraalHPyHandle}. - */ - private static final int CACHE_LIMIT = 4; - - @Child private InteropLibrary interopLibrary; - @CompilationFinal private ConditionProfile profile; - @Child GetHPyHandleForSingleton getHPyHandleForSingleton; - - @Override - public long execute(Object[] arguments, int i) { - CompilerAsserts.partialEvaluationConstant(i); - // TODO(fa): improved cached implementation; use state bits to remember types we've - // seen per argument - Object value = arguments[i]; - - if (value instanceof GraalHPyHandle handle) { - Object delegate = handle.getDelegate(); - if (GraalHPyBoxing.isBoxablePrimitive(delegate)) { - if (delegate instanceof Integer) { - return GraalHPyBoxing.boxInt((Integer) delegate); - } - assert delegate instanceof Double; - return GraalHPyBoxing.boxDouble((Double) delegate); - } else { - return handle.getId(getHPyContext(arguments).getHPyContext(), ensureProfile(), ensureHandleForSingletonNode()); - } - } else if (value instanceof Long) { - return (long) value; - } else { - if (interopLibrary == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - interopLibrary = insert(InteropLibrary.getFactory().createDispatched(CACHE_LIMIT)); - } - if (!interopLibrary.isPointer(value)) { - interopLibrary.toNative(value); - } - try { - return interopLibrary.asPointer(value); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } - } - - private ConditionProfile ensureProfile() { - if (profile == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - profile = ConditionProfile.create(); - } - return profile; - } - - private GetHPyHandleForSingleton ensureHandleForSingletonNode() { - if (getHPyHandleForSingleton == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - getHPyHandleForSingleton = insert(GetHPyHandleForSingletonNodeGen.create()); - } - return getHPyHandleForSingleton; - } - } - - static final class GraalHPyJNIConvertArgUncachedNode extends GraalHPyJNIConvertArgNode { - - @Override - public long execute(Object[] arguments, int i) { - Object value = arguments[i]; - if (value instanceof GraalHPyHandle handle) { - Object delegate = handle.getDelegate(); - if (GraalHPyBoxing.isBoxablePrimitive(delegate)) { - if (delegate instanceof Integer) { - return GraalHPyBoxing.boxInt((Integer) delegate); - } - assert delegate instanceof Double; - return GraalHPyBoxing.boxDouble((Double) delegate); - } else { - return handle.getIdUncached(getHPyContext(arguments).getHPyContext()); - } - } else if (value instanceof Long) { - return (long) value; - } else { - InteropLibrary interopLibrary = InteropLibrary.getUncached(value); - if (!interopLibrary.isPointer(value)) { - interopLibrary.toNative(value); - } - try { - return interopLibrary.asPointer(value); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/jni/GraalHPyJNIFunctionPointer.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/jni/GraalHPyJNIFunctionPointer.java deleted file mode 100644 index 670b66bb97..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/jni/GraalHPyJNIFunctionPointer.java +++ /dev/null @@ -1,516 +0,0 @@ -/* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy.jni; - -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.LLVMType; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyMode; -import com.oracle.graal.python.runtime.PythonImageBuildOptions; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.TruffleObject; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.library.CachedLibrary; -import com.oracle.truffle.api.library.ExportLibrary; -import com.oracle.truffle.api.library.ExportMessage; - -/** - * Represents a native function pointer that will be called using an appropriate JNI trampoline - * function depending on the {@link #signature} and the {@link #mode} enum. - */ -@ExportLibrary(InteropLibrary.class) -public final class GraalHPyJNIFunctionPointer implements TruffleObject { - final long pointer; - final LLVMType signature; - - /** - * Function pointers created through {@code HPyModule_Create} or {@code HPyType_FromSpec} - * remembers if the context that created it was in debug mode. Depending on this flag, we decide - * which trampolines (universal or debug) we need to use. For reference: In CPython this is - * implicitly given by the fact that the HPy context is stored in a C global variable - * {@code _ctx_for_trampolines}. - */ - final HPyMode mode; - - public GraalHPyJNIFunctionPointer(long pointer, LLVMType signature, HPyMode mode) { - assert !PythonImageBuildOptions.WITHOUT_JNI; - this.pointer = pointer; - this.signature = signature; - this.mode = mode; - } - - @ExportMessage - @SuppressWarnings("static-method") - boolean isExecutable() { - return true; - } - - @ExportMessage - static final class Execute { - - @Specialization(guards = "receiver.signature == cachedSignature", limit = "1") - static Object doCached(GraalHPyJNIFunctionPointer receiver, Object[] arguments, - @CachedLibrary(limit = "1") InteropLibrary interopLibrary, - @Cached("receiver.signature") LLVMType cachedSignature, - @Cached(parameters = "receiver.signature") GraalHPyJNIConvertArgNode convertArgNode) { - // Make it explicit, that we cannot to JNI calls if WITHOUT_JNI is true. - if (PythonImageBuildOptions.WITHOUT_JNI) { - throw CompilerDirectives.shouldNotReachHere(); - } - return switch (receiver.mode) { - case MODE_UNIVERSAL -> callUniversal(receiver, cachedSignature, convertHPyContext(arguments), arguments, interopLibrary, convertArgNode); - case MODE_DEBUG -> callDebug(receiver, cachedSignature, convertHPyDebugContext(arguments), arguments, interopLibrary, convertArgNode); - case MODE_TRACE -> callUniversal(receiver, cachedSignature, convertHPyTraceContext(arguments), arguments, interopLibrary, convertArgNode); - default -> throw CompilerDirectives.shouldNotReachHere("unsupported HPy mode"); - }; - } - - /** - * Uses the appropriate trampoline to call the native function pointer. - */ - private static long callUniversal(GraalHPyJNIFunctionPointer receiver, LLVMType signature, long ctx, Object[] arguments, - InteropLibrary interopLibrary, GraalHPyJNIConvertArgNode convertArgNode) { - switch (signature) { - case HPyModule_init: - return GraalHPyJNITrampolines.executeModuleInit(receiver.pointer); - case HPyModule_create: - return GraalHPyJNITrampolines.executeModcreate(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - case HPyFunc_noargs: - return GraalHPyJNITrampolines.executeNoargs(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - case HPyFunc_unaryfunc: - return GraalHPyJNITrampolines.executeUnaryfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - case HPyFunc_getiterfunc: - return GraalHPyJNITrampolines.executeGetiterfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - case HPyFunc_iternextfunc: - return GraalHPyJNITrampolines.executeIternextfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - case HPyFunc_reprfunc: - return GraalHPyJNITrampolines.executeReprfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - case HPyFunc_lenfunc: - return GraalHPyJNITrampolines.executeLenfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - case HPyFunc_hashfunc: - return GraalHPyJNITrampolines.executeHashfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - case HPyFunc_binaryfunc: - return GraalHPyJNITrampolines.executeBinaryfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2)); - case HPyFunc_o: - return GraalHPyJNITrampolines.executeO(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2)); - case HPyFunc_getter: - return GraalHPyJNITrampolines.executeGetter(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2)); - case HPyFunc_getattrfunc: - return GraalHPyJNITrampolines.executeGetattrfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2)); - case HPyFunc_getattrofunc: - return GraalHPyJNITrampolines.executeGetattrofunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2)); - case HPyFunc_ssizeargfunc: - return GraalHPyJNITrampolines.executeSsizeargfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2)); - case HPyFunc_traverseproc: - return GraalHPyJNITrampolines.executeTraverseproc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2)); - case HPyFunc_varargs: - return GraalHPyJNITrampolines.executeVarargs(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2), - convertArgNode.execute(arguments, 3)); - case HPyFunc_ternaryfunc: - return GraalHPyJNITrampolines.executeTernaryfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2), - convertArgNode.execute(arguments, 3)); - case HPyFunc_descrgetfunc: - return GraalHPyJNITrampolines.executeDescrgetfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2), - convertArgNode.execute(arguments, 3)); - case HPyFunc_ssizessizeargfunc: - return GraalHPyJNITrampolines.executeSsizessizeargfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2), - convertArgNode.execute(arguments, 3)); - case HPyFunc_keywords: - return GraalHPyJNITrampolines.executeKeywords(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2), - convertArgNode.execute(arguments, 3), convertArgNode.execute(arguments, 4)); - case HPyFunc_inquiry: - return GraalHPyJNITrampolines.executeInquiry(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - case HPyFunc_ssizeobjargproc: - return GraalHPyJNITrampolines.executeSsizeobjargproc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), (long) arguments[2], convertArgNode.execute(arguments, 3)); - case HPyFunc_initproc: - return GraalHPyJNITrampolines.executeInitproc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2), (long) arguments[3], - convertArgNode.execute(arguments, 4)); - case HPyFunc_ssizessizeobjargproc: - return GraalHPyJNITrampolines.executeSsizessizeobjargproc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), (long) arguments[2], (long) arguments[3], - convertArgNode.execute(arguments, 4)); - case HPyFunc_setter: - return GraalHPyJNITrampolines.executeSetter(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2), - convertArgNode.execute(arguments, 3)); - case HPyFunc_setattrfunc: - return GraalHPyJNITrampolines.executeSetattrfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2), - convertArgNode.execute(arguments, 3)); - case HPyFunc_objobjargproc: - return GraalHPyJNITrampolines.executeObjobjargproc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2), - convertArgNode.execute(arguments, 3)); - case HPyFunc_descrsetfunc: - return GraalHPyJNITrampolines.executeDescrsetfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2), - convertArgNode.execute(arguments, 3)); - case HPyFunc_setattrofunc: - return GraalHPyJNITrampolines.executeSetattrofunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2), - convertArgNode.execute(arguments, 3)); - case HPyFunc_freefunc: - GraalHPyJNITrampolines.executeFreefunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - return 0; - case HPyFunc_richcmpfunc: - return GraalHPyJNITrampolines.executeRichcmpfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2), (int) arguments[3]); - case HPyFunc_objobjproc: - return GraalHPyJNITrampolines.executeObjobjproc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2)); - case HPyFunc_getbufferproc: - return GraalHPyJNITrampolines.executeGetbufferproc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2), (int) arguments[3]); - case HPyFunc_releasebufferproc: - GraalHPyJNITrampolines.executeReleasebufferproc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), convertArgNode.execute(arguments, 2)); - return 0; - case HPyFunc_destroyfunc: - GraalHPyJNITrampolines.executeDestroyfunc(receiver.pointer, convertPointer(arguments[0], interopLibrary)); - return 0; - case HPyFunc_destructor: - GraalHPyJNITrampolines.executeDestructor(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - return 0; - } - throw CompilerDirectives.shouldNotReachHere(); - } - - /** - * When we are in debug mode, we need to use different trampolines for calling the HPy - * extension functions because object parameters (that will become handles) will be wrapped - * in debug handles ({@code DHPy}) and, vice versa, object return values need to be - * unwrapped. This un/-wrapping is done by the trampoline via calling {@code DHPy_open} and - * {@code DHPy_unwrap}. - */ - private static long callTrace(GraalHPyJNIFunctionPointer receiver, LLVMType signature, Object[] arguments, - InteropLibrary interopLibrary, GraalHPyJNIConvertArgNode convertArgNode) { - switch (signature) { - case HPyModule_init: - // there is no difference to the universal mode - return GraalHPyJNITrampolines.executeModuleInit(receiver.pointer); - case HPyModule_create: - return GraalHPyJNITrampolines.executeDebugModcreate(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1)); - case HPyFunc_noargs: - return GraalHPyJNITrampolines.executeDebugNoargs(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1)); - case HPyFunc_unaryfunc: - return GraalHPyJNITrampolines.executeDebugUnaryfunc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1)); - case HPyFunc_getiterfunc: - return GraalHPyJNITrampolines.executeDebugGetiterfunc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1)); - case HPyFunc_iternextfunc: - return GraalHPyJNITrampolines.executeDebugIternextfunc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1)); - case HPyFunc_reprfunc: - return GraalHPyJNITrampolines.executeDebugReprfunc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1)); - case HPyFunc_lenfunc: - return GraalHPyJNITrampolines.executeDebugLenfunc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1)); - case HPyFunc_hashfunc: - // HPy_ssize_t (*HPyFunc_lenfunc)(HPyContext *ctx, HPy); - // HPy_hash_t (*HPyFunc_hashfunc)(HPyContext *ctx, HPy); - return GraalHPyJNITrampolines.executeDebugHashfunc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1)); - case HPyFunc_binaryfunc: - return GraalHPyJNITrampolines.executeDebugBinaryfunc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2)); - case HPyFunc_o: - return GraalHPyJNITrampolines.executeDebugO(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2)); - case HPyFunc_getattrofunc: - return GraalHPyJNITrampolines.executeDebugGetattrofunc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2)); - case HPyFunc_getattrfunc: - // HPy (*HPyFunc_getattrfunc) (HPyContext *ctx, HPy, char *); - return GraalHPyJNITrampolines.executeDebugGetattrfunc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2)); - case HPyFunc_ssizeargfunc: - // HPy (*HPyFunc_ssizeargfunc)(HPyContext *ctx, HPy, HPy_ssize_t); - return GraalHPyJNITrampolines.executeDebugSsizeargfunc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2)); - case HPyFunc_getter: - // HPy (*HPyFunc_getter) (HPyContext *ctx, HPy, void *); - return GraalHPyJNITrampolines.executeDebugGetter(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2)); - case HPyFunc_traverseproc: - // int (*HPyFunc_traverseproc)(void *, HPyFunc_visitproc, void *); - return GraalHPyJNITrampolines.executeTraverseproc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2)); - case HPyFunc_varargs: - // HPy (*HPyFunc_varargs)(HPyContext *, HPy, HPy *, HPy_ssize_t); - return GraalHPyJNITrampolines.executeDebugVarargs(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3)); - case HPyFunc_ternaryfunc: - // HPy (*HPyFunc_ternaryfunc)(HPyContext *, HPy, HPy, HPy) - return GraalHPyJNITrampolines.executeDebugTernaryfunc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3)); - case HPyFunc_descrgetfunc: - return GraalHPyJNITrampolines.executeDebugDescrgetfunc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3)); - // HPy (*HPyFunc_descrgetfunc)(HPyContext *, HPy, HPy, HPy) - case HPyFunc_ssizessizeargfunc: - // HPy (*HPyFunc_ssizessizeargfunc)(HPyContext *, HPy, HPy_ssize_t, - // HPy_ssize_t); - return GraalHPyJNITrampolines.executeDebugSsizessizeargfunc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3)); - case HPyFunc_keywords: - // HPy (*HPyFunc_keywords)(HPyContext *, HPy, HPy *, HPy_ssize_t , HPy) - return GraalHPyJNITrampolines.executeDebugKeywords(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3), convertArgNode.execute(arguments, 4)); - case HPyFunc_inquiry: - return GraalHPyJNITrampolines.executeDebugInquiry(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1)); - case HPyFunc_ssizeobjargproc: - return GraalHPyJNITrampolines.executeDebugSsizeobjargproc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), (long) arguments[2], - convertArgNode.execute(arguments, 3)); - case HPyFunc_initproc: - return GraalHPyJNITrampolines.executeDebugInitproc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), (long) arguments[3], convertArgNode.execute(arguments, 4)); - case HPyFunc_ssizessizeobjargproc: - return GraalHPyJNITrampolines.executeDebugSsizessizeobjargproc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), (long) arguments[2], - (long) arguments[3], convertArgNode.execute(arguments, 4)); - case HPyFunc_setter: - // int (*HPyFunc_setter)(HPyContext *ctx, HPy, HPy, void *); - return GraalHPyJNITrampolines.executeDebugSetter(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3)); - case HPyFunc_setattrfunc: - // int (*HPyFunc_setattrfunc)(HPyContext *ctx, HPy, char *, HPy); - return GraalHPyJNITrampolines.executeDebugSetattrfunc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3)); - case HPyFunc_objobjargproc: - return GraalHPyJNITrampolines.executeDebugObjobjargproc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3)); - case HPyFunc_descrsetfunc: - return GraalHPyJNITrampolines.executeDebugDescrsetfunc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3)); - case HPyFunc_setattrofunc: - return GraalHPyJNITrampolines.executeDebugSetattrofunc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3)); - case HPyFunc_freefunc: - // no handles involved in freefunc; we can use the universal trampoline - GraalHPyJNITrampolines.executeDebugFreefunc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1)); - return 0; - case HPyFunc_richcmpfunc: - // HPy (*HPyFunc_richcmpfunc)(HPyContext *ctx, HPy, HPy, HPy_RichCmpOp) - return GraalHPyJNITrampolines.executeDebugRichcmpfunc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), (int) arguments[3]); - case HPyFunc_objobjproc: - return GraalHPyJNITrampolines.executeDebugObjobjproc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2)); - case HPyFunc_getbufferproc: - return GraalHPyJNITrampolines.executeDebugGetbufferproc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), (int) arguments[3]); - case HPyFunc_releasebufferproc: - GraalHPyJNITrampolines.executeDebugReleasebufferproc(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2)); - return 0; - case HPyFunc_destroyfunc: - GraalHPyJNITrampolines.executeDestroyfunc(convertPointer(arguments[0], interopLibrary), receiver.pointer); - return 0; - case HPyFunc_destructor: - GraalHPyJNITrampolines.executeDebugDestructor(receiver.pointer, convertHPyTraceContext(arguments), convertArgNode.execute(arguments, 1)); - return 0; - } - throw CompilerDirectives.shouldNotReachHere(); - } - - /** - * When we are in debug mode, we need to use different trampolines for calling the HPy - * extension functions because object parameters (that will become handles) will be wrapped - * in debug handles ({@code DHPy}) and, vice versa, object return values need to be - * unwrapped. This un/-wrapping is done by the trampoline via calling {@code DHPy_open} and - * {@code DHPy_unwrap}. - */ - private static long callDebug(GraalHPyJNIFunctionPointer receiver, LLVMType signature, long ctx, Object[] arguments, - InteropLibrary interopLibrary, GraalHPyJNIConvertArgNode convertArgNode) { - switch (signature) { - case HPyModule_init: - // there is not difference to the universal mode - return GraalHPyJNITrampolines.executeModuleInit(receiver.pointer); - case HPyModule_create: - return GraalHPyJNITrampolines.executeDebugModcreate(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - case HPyFunc_noargs: - return GraalHPyJNITrampolines.executeDebugNoargs(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - case HPyFunc_unaryfunc: - return GraalHPyJNITrampolines.executeDebugUnaryfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - case HPyFunc_getiterfunc: - return GraalHPyJNITrampolines.executeDebugGetiterfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - case HPyFunc_iternextfunc: - return GraalHPyJNITrampolines.executeDebugIternextfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - case HPyFunc_reprfunc: - return GraalHPyJNITrampolines.executeDebugReprfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - case HPyFunc_lenfunc: - return GraalHPyJNITrampolines.executeDebugLenfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - case HPyFunc_hashfunc: - // HPy_ssize_t (*HPyFunc_lenfunc)(HPyContext *ctx, HPy); - // HPy_hash_t (*HPyFunc_hashfunc)(HPyContext *ctx, HPy); - return GraalHPyJNITrampolines.executeDebugHashfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - case HPyFunc_binaryfunc: - return GraalHPyJNITrampolines.executeDebugBinaryfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2)); - case HPyFunc_o: - return GraalHPyJNITrampolines.executeDebugO(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2)); - case HPyFunc_getattrofunc: - return GraalHPyJNITrampolines.executeDebugGetattrofunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2)); - case HPyFunc_getattrfunc: - // HPy (*HPyFunc_getattrfunc) (HPyContext *ctx, HPy, char *); - return GraalHPyJNITrampolines.executeDebugGetattrfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2)); - case HPyFunc_ssizeargfunc: - // HPy (*HPyFunc_ssizeargfunc)(HPyContext *ctx, HPy, HPy_ssize_t); - return GraalHPyJNITrampolines.executeDebugSsizeargfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2)); - case HPyFunc_getter: - // HPy (*HPyFunc_getter) (HPyContext *ctx, HPy, void *); - return GraalHPyJNITrampolines.executeDebugGetter(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2)); - case HPyFunc_traverseproc: - // int (*HPyFunc_traverseproc)(void *, HPyFunc_visitproc, void *); - return GraalHPyJNITrampolines.executeTraverseproc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2)); - case HPyFunc_varargs: - // HPy (*HPyFunc_varargs)(HPyContext *, HPy, HPy *, HPy_ssize_t); - return GraalHPyJNITrampolines.executeDebugVarargs(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3)); - case HPyFunc_ternaryfunc: - // HPy (*HPyFunc_ternaryfunc)(HPyContext *, HPy, HPy, HPy) - return GraalHPyJNITrampolines.executeDebugTernaryfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3)); - case HPyFunc_descrgetfunc: - return GraalHPyJNITrampolines.executeDebugDescrgetfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3)); - // HPy (*HPyFunc_descrgetfunc)(HPyContext *, HPy, HPy, HPy) - case HPyFunc_ssizessizeargfunc: - // HPy (*HPyFunc_ssizessizeargfunc)(HPyContext *, HPy, HPy_ssize_t, - // HPy_ssize_t); - return GraalHPyJNITrampolines.executeDebugSsizessizeargfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3)); - case HPyFunc_keywords: - // HPy (*HPyFunc_keywords)(HPyContext *, HPy, HPy *, HPy_ssize_t , HPy) - return GraalHPyJNITrampolines.executeDebugKeywords(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3), convertArgNode.execute(arguments, 4)); - case HPyFunc_inquiry: - return GraalHPyJNITrampolines.executeDebugInquiry(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - case HPyFunc_ssizeobjargproc: - return GraalHPyJNITrampolines.executeDebugSsizeobjargproc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), (long) arguments[2], - convertArgNode.execute(arguments, 3)); - case HPyFunc_initproc: - return GraalHPyJNITrampolines.executeDebugInitproc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), (long) arguments[3], convertArgNode.execute(arguments, 4)); - case HPyFunc_ssizessizeobjargproc: - return GraalHPyJNITrampolines.executeDebugSsizessizeobjargproc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), (long) arguments[2], - (long) arguments[3], convertArgNode.execute(arguments, 4)); - case HPyFunc_setter: - // int (*HPyFunc_setter)(HPyContext *ctx, HPy, HPy, void *); - return GraalHPyJNITrampolines.executeDebugSetter(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3)); - case HPyFunc_setattrfunc: - // int (*HPyFunc_setattrfunc)(HPyContext *ctx, HPy, char *, HPy); - return GraalHPyJNITrampolines.executeDebugSetattrfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3)); - case HPyFunc_objobjargproc: - return GraalHPyJNITrampolines.executeDebugObjobjargproc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3)); - case HPyFunc_descrsetfunc: - return GraalHPyJNITrampolines.executeDebugDescrsetfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3)); - case HPyFunc_setattrofunc: - return GraalHPyJNITrampolines.executeDebugSetattrofunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), convertArgNode.execute(arguments, 3)); - case HPyFunc_freefunc: - // no handles involved in freefunc; we can use the universal trampoline - GraalHPyJNITrampolines.executeDebugFreefunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - return 0; - case HPyFunc_richcmpfunc: - // HPy (*HPyFunc_richcmpfunc)(HPyContext *ctx, HPy, HPy, HPy_RichCmpOp) - return GraalHPyJNITrampolines.executeDebugRichcmpfunc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), (int) arguments[3]); - case HPyFunc_objobjproc: - return GraalHPyJNITrampolines.executeDebugObjobjproc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2)); - case HPyFunc_getbufferproc: - return GraalHPyJNITrampolines.executeDebugGetbufferproc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2), (int) arguments[3]); - case HPyFunc_releasebufferproc: - GraalHPyJNITrampolines.executeDebugReleasebufferproc(receiver.pointer, ctx, convertArgNode.execute(arguments, 1), - convertArgNode.execute(arguments, 2)); - return 0; - case HPyFunc_destroyfunc: - GraalHPyJNITrampolines.executeDestroyfunc(convertPointer(arguments[0], interopLibrary), receiver.pointer); - return 0; - case HPyFunc_destructor: - GraalHPyJNITrampolines.executeDebugDestructor(receiver.pointer, ctx, convertArgNode.execute(arguments, 1)); - return 0; - } - throw CompilerDirectives.shouldNotReachHere(); - } - - private static long convertHPyContext(Object[] arguments) { - GraalHPyJNIContext jniBackend = GraalHPyJNIConvertArgNode.getHPyContext(arguments); - try { - return jniBackend.asPointer(); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } - - private static long convertHPyDebugContext(Object[] arguments) { - GraalHPyJNIContext jniBackend = GraalHPyJNIConvertArgNode.getHPyContext(arguments); - assert jniBackend.getHPyDebugContext() != 0; - return jniBackend.getHPyDebugContext(); - } - - private static long convertHPyTraceContext(Object[] arguments) { - GraalHPyJNIContext jniBackend = GraalHPyJNIConvertArgNode.getHPyContext(arguments); - assert jniBackend.getHPyTraceContext() != 0; - return jniBackend.getHPyTraceContext(); - } - - private static long convertPointer(Object argument, InteropLibrary interopLibrary) { - if (!interopLibrary.isPointer(argument)) { - interopLibrary.toNative(argument); - } - try { - return interopLibrary.asPointer(argument); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } - } - - @ExportMessage - @SuppressWarnings("static-method") - boolean isPointer() { - return true; - } - - @ExportMessage - long asPointer() { - return pointer; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/jni/GraalHPyJNINodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/jni/GraalHPyJNINodes.java deleted file mode 100644 index bef2dab579..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/jni/GraalHPyJNINodes.java +++ /dev/null @@ -1,848 +0,0 @@ -/* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy.jni; - -import static com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.UNSAFE; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyHandle.NULL_HANDLE_DELEGATE; -import static com.oracle.graal.python.builtins.objects.cext.hpy.jni.GraalHPyJNIContext.coerceToPointer; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; - -import com.oracle.graal.python.builtins.objects.cext.common.NativePointer; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyBoxing; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.AllocateNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.BulkFreeHandleReferencesNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.FreeNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.GetElementPtrNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.IsNullNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadDoubleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadFloatNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadGenericNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadHPyArrayNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadHPyFieldNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadHPyNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadI32Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadI64Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadI8ArrayNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadPointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteDoubleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteGenericNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteHPyFieldNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteHPyNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteI32Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteI64Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WritePointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteSizeTNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.GraalHPyHandleReference; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyData; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyAsCharPointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyFromCharPointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType; -import com.oracle.graal.python.builtins.objects.ints.PInt; -import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.library.CachedLibrary; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; -import com.oracle.truffle.api.profiles.InlinedExactClassProfile; -import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.api.strings.TruffleString.Encoding; - -import sun.misc.Unsafe; - -abstract class GraalHPyJNINodes { - - private GraalHPyJNINodes() { - } - - static final class UnsafeIsNullNode extends IsNullNode { - - static final UnsafeIsNullNode UNCACHED = new UnsafeIsNullNode(); - - private UnsafeIsNullNode() { - } - - @Override - protected boolean execute(@SuppressWarnings("unused") GraalHPyContext ctx, Object pointer) { - return coerceToPointer(pointer) == 0; - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeAllocateNode extends AllocateNode { - - static final UnsafeAllocateNode UNCACHED = new UnsafeAllocateNode(); - - private UnsafeAllocateNode() { - } - - @Override - protected Object execute(@SuppressWarnings("unused") GraalHPyContext ctx, long size, boolean zero) { - long result = UNSAFE.allocateMemory(size); - if (zero) { - UNSAFE.setMemory(result, size, (byte) 0); - } - return result; - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeFreeNode extends FreeNode { - - static final UnsafeFreeNode UNCACHED = new UnsafeFreeNode(); - - private UnsafeFreeNode() { - } - - @Override - protected void execute(@SuppressWarnings("unused") GraalHPyContext ctx, Object pointer) { - UNSAFE.freeMemory(coerceToPointer(pointer)); - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeBulkFreeHandleReferencesNode extends BulkFreeHandleReferencesNode { - - private static final int BULK_CAPACITY = 1024; - - static final UnsafeBulkFreeHandleReferencesNode UNCACHED = new UnsafeBulkFreeHandleReferencesNode(); - - private UnsafeBulkFreeHandleReferencesNode() { - } - - @Override - @TruffleBoundary - protected void execute(@SuppressWarnings("unused") GraalHPyContext ctx, GraalHPyHandleReference[] references) { - long[] nativeSpacePtrs = new long[BULK_CAPACITY]; - long[] destroyFuncPtrs = new long[BULK_CAPACITY]; - int i = 0; - for (GraalHPyHandleReference ref : references) { - long destroyFunPtr = coerceToPointer(ref.getDestroyFunc()); - long nativeSpacePtr = coerceToPointer(ref.getNativeSpace()); - if (destroyFunPtr == 0) { - // in this case, we can just use 'free' - UNSAFE.freeMemory(nativeSpacePtr); - } else { - if (i >= BULK_CAPACITY) { - GraalHPyJNIContext.bulkFreeNativeSpace(nativeSpacePtrs, destroyFuncPtrs, BULK_CAPACITY); - i = 0; - } - destroyFuncPtrs[i] = destroyFunPtr; - nativeSpacePtrs[i] = nativeSpacePtr; - i++; - } - } - if (i > 0) { - GraalHPyJNIContext.bulkFreeNativeSpace(nativeSpacePtrs, destroyFuncPtrs, i); - } - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeGetElementPtrNode extends GetElementPtrNode { - static final UnsafeGetElementPtrNode UNCACHED = new UnsafeGetElementPtrNode(); - - private UnsafeGetElementPtrNode() { - } - - @Override - public Object execute(@SuppressWarnings("unused") GraalHPyContext ctx, Object pointer, long offset) { - return coerceToPointer(pointer) + offset; - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeReadI8ArrayNode extends ReadI8ArrayNode { - - static final UnsafeReadI8ArrayNode UNCACHED = new UnsafeReadI8ArrayNode(); - - private UnsafeReadI8ArrayNode() { - } - - @Override - protected byte[] execute(GraalHPyContext ctx, Object pointer, long offset, long n) { - if (!PInt.isIntRange(n)) { - throw CompilerDirectives.shouldNotReachHere("cannot fit long into int"); - } - byte[] result = new byte[(int) n]; - long ptr = coerceToPointer(pointer) + offset; - UNSAFE.copyMemory(null, ptr, result, Unsafe.ARRAY_BYTE_BASE_OFFSET, n); - return result; - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeReadHPyNode extends ReadHPyNode { - - static final UnsafeReadHPyNode UNCACHED = new UnsafeReadHPyNode(); - - private UnsafeReadHPyNode() { - } - - @Override - protected Object execute(GraalHPyContext ctx, Object pointer, long offset, boolean close) { - assert ctx.getCTypeSize(HPyContextSignatureType.HPy) == UNSAFE.addressSize(); - long bits = UNSAFE.getAddress(coerceToPointer(pointer) + offset); - Object result = ctx.bitsAsPythonObject(bits); - if (close && GraalHPyBoxing.isBoxedHandle(bits)) { - ctx.releaseHPyHandleForObject(GraalHPyBoxing.unboxHandle(bits)); - } - return result; - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeReadHPyFieldNode extends ReadHPyFieldNode { - - static final UnsafeReadHPyFieldNode UNCACHED = new UnsafeReadHPyFieldNode(); - - private UnsafeReadHPyFieldNode() { - } - - @Override - protected Object execute(GraalHPyContext ctx, PythonObject owner, Object pointer, long offset, boolean close) { - assert ctx.getCTypeSize(HPyContextSignatureType.HPy) == UNSAFE.addressSize(); - long bits = UNSAFE.getAddress(coerceToPointer(pointer) + offset); - if (!PInt.isIntRange(bits)) { - throw CompilerDirectives.shouldNotReachHere(); - } - int idx = (int) bits; - if (idx == 0) { - return NULL_HANDLE_DELEGATE; - } - return GraalHPyData.getHPyField(owner, idx); - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeReadHPyArrayNode extends ReadHPyArrayNode { - - static final UnsafeReadHPyArrayNode UNCACHED = new UnsafeReadHPyArrayNode(); - - private UnsafeReadHPyArrayNode() { - } - - @Override - protected Object[] execute(GraalHPyContext ctx, Object pointer, long offset, long n) { - if (!PInt.isIntRange(n)) { - throw CompilerDirectives.shouldNotReachHere("cannot fit long into int"); - } - long basePtr = coerceToPointer(pointer); - Object[] result = new Object[(int) n]; - for (int i = 0; i < result.length; i++) { - result[i] = ctx.bitsAsPythonObject(UNSAFE.getAddress(basePtr + (i + offset) * UNSAFE.addressSize())); - } - return result; - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeReadI32Node extends ReadI32Node { - - static final UnsafeReadI32Node UNCACHED = new UnsafeReadI32Node(); - - private UnsafeReadI32Node() { - } - - @Override - protected int execute(@SuppressWarnings("unused") GraalHPyContext ctx, Object pointer, long offset) { - return UNSAFE.getInt(coerceToPointer(pointer) + offset); - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeReadI64Node extends ReadI64Node { - - static final UnsafeReadI64Node UNCACHED = new UnsafeReadI64Node(); - - private UnsafeReadI64Node() { - } - - @Override - protected long execute(@SuppressWarnings("unused") GraalHPyContext ctx, Object pointer, long offset) { - return UNSAFE.getLong(coerceToPointer(pointer) + offset); - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeReadFloatNode extends ReadFloatNode { - - static final UnsafeReadFloatNode UNCACHED = new UnsafeReadFloatNode(); - - private UnsafeReadFloatNode() { - } - - @Override - protected double execute(@SuppressWarnings("unused") GraalHPyContext ctx, Object pointer, long offset) { - return UNSAFE.getFloat(coerceToPointer(pointer) + offset); - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeReadDoubleNode extends ReadDoubleNode { - - static final UnsafeReadDoubleNode UNCACHED = new UnsafeReadDoubleNode(); - - private UnsafeReadDoubleNode() { - } - - @Override - protected double execute(@SuppressWarnings("unused") GraalHPyContext ctx, Object pointer, long offset) { - return UNSAFE.getDouble(coerceToPointer(pointer) + offset); - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeReadPointerNode extends ReadPointerNode { - - static final UnsafeReadPointerNode UNCACHED = new UnsafeReadPointerNode(); - - private UnsafeReadPointerNode() { - } - - @Override - protected Object execute(@SuppressWarnings("unused") GraalHPyContext ctx, Object pointer, long offset) { - return UNSAFE.getAddress(coerceToPointer(pointer) + offset); - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeReadGenericNode extends ReadGenericNode { - - static final UnsafeReadGenericNode UNCACHED = new UnsafeReadGenericNode(); - - private UnsafeReadGenericNode() { - } - - @Override - protected Object execute(@SuppressWarnings("unused") GraalHPyContext ctx, Object pointer, long offset, HPyContextSignatureType type) { - long addr = coerceToPointer(pointer) + offset; - switch (type) { - case Int8_t, Uint8_t, Bool: - return UNSAFE.getByte(addr); - case Int16_t, Uint16_t: - return UNSAFE.getShort(addr); - case Int32_t, Uint32_t: - return UNSAFE.getInt(addr); - case Int64_t, Uint64_t: - return UNSAFE.getLong(addr); - case CFloat: - return UNSAFE.getFloat(addr); - case CDouble: - return UNSAFE.getDouble(addr); - case HPyContextPtr, VoidPtr, VoidPtrPtr, HPyPtr, ConstHPyPtr, Wchar_tPtr, ConstWchar_tPtr, CharPtr: - case ConstCharPtr, DataPtr, DataPtrPtr, Cpy_PyObjectPtr, HPyModuleDefPtr, HPyType_SpecPtr: - case HPyType_SpecParamPtr, HPyDefPtr, HPyFieldPtr, HPyGlobalPtr, HPyCapsule_DestructorPtr, PyType_SlotPtr: - return UNSAFE.getAddress(addr); - default: - int size = ctx.getCTypeSize(type); - switch (size) { - case 1: - return UNSAFE.getByte(addr); - case 2: - return UNSAFE.getShort(addr); - case 4: - return UNSAFE.getInt(addr); - case 8: - return UNSAFE.getLong(addr); - } - - throw CompilerDirectives.shouldNotReachHere(); - } - } - - @Override - protected int executeInt(@SuppressWarnings("unused") GraalHPyContext ctx, Object pointer, long offset, HPyContextSignatureType type) { - return (int) executeLong(ctx, pointer, offset, type); - } - - @Override - protected long executeLong(@SuppressWarnings("unused") GraalHPyContext ctx, Object pointer, long offset, HPyContextSignatureType type) { - long addr = coerceToPointer(pointer) + offset; - int size; - switch (type) { - case Int8_t, Uint8_t, Bool: - size = 1; - break; - case Int16_t, Uint16_t: - size = 2; - break; - case Int32_t, Uint32_t: - size = 4; - break; - case Int64_t, Uint64_t: - size = 8; - break; - default: - size = ctx.getCTypeSize(type); - break; - } - switch (size) { - case 1: - return UNSAFE.getByte(addr); - case 2: - return UNSAFE.getShort(addr); - case 4: - return UNSAFE.getInt(addr); - case 8: - return UNSAFE.getLong(addr); - default: - throw CompilerDirectives.shouldNotReachHere(); - } - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeWriteI32Node extends WriteI32Node { - - static final UnsafeWriteI32Node UNCACHED = new UnsafeWriteI32Node(); - - private UnsafeWriteI32Node() { - } - - @Override - protected void execute(@SuppressWarnings("unused") GraalHPyContext ctx, Object pointer, long offset, int value) { - UNSAFE.putInt(coerceToPointer(pointer) + offset, value); - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeWriteI64Node extends WriteI64Node { - - static final UnsafeWriteI64Node UNCACHED = new UnsafeWriteI64Node(); - - private UnsafeWriteI64Node() { - } - - @Override - protected void execute(@SuppressWarnings("unused") GraalHPyContext ctx, Object pointer, long offset, long value) { - UNSAFE.putLong(coerceToPointer(pointer) + offset, value); - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeWriteDoubleNode extends WriteDoubleNode { - - static final UnsafeWriteDoubleNode UNCACHED = new UnsafeWriteDoubleNode(); - - private UnsafeWriteDoubleNode() { - } - - @Override - protected void execute(@SuppressWarnings("unused") GraalHPyContext ctx, Object pointer, long offset, double value) { - UNSAFE.putDouble(coerceToPointer(pointer) + offset, value); - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeWriteGenericNode extends WriteGenericNode { - - static final UnsafeWriteGenericNode UNCACHED = new UnsafeWriteGenericNode(); - - private UnsafeWriteGenericNode() { - } - - @Override - protected void execute(GraalHPyContext ctx, Object pointer, long offset, HPyContextSignatureType type, long value) { - long addr = coerceToPointer(pointer) + offset; - int size; - switch (type) { - case Int8_t, Uint8_t, Bool: - size = 1; - break; - case Int16_t, Uint16_t: - size = 2; - break; - case Int32_t, Uint32_t: - size = 4; - break; - case Int64_t, Uint64_t: - size = 8; - break; - default: - size = ctx.getCTypeSize(type); - break; - } - switch (size) { - case 1: - UNSAFE.putByte(addr, (byte) value); - break; - case 2: - UNSAFE.putShort(addr, (short) value); - break; - case 4: - UNSAFE.putInt(addr, (int) value); - break; - case 8: - UNSAFE.putLong(addr, value); - break; - default: - throw CompilerDirectives.shouldNotReachHere(); - } - } - - @Override - protected void execute(GraalHPyContext ctx, Object pointer, long offset, HPyContextSignatureType type, Object value) { - long addr = coerceToPointer(pointer) + offset; - switch (type) { - case Int8_t, Uint8_t, Bool: - UNSAFE.putByte(addr, (byte) value); - break; - case Int16_t, Uint16_t: - UNSAFE.putShort(addr, (short) value); - break; - case Int32_t, Uint32_t: - UNSAFE.putInt(addr, (int) value); - break; - case Int64_t, Uint64_t: - UNSAFE.putLong(addr, (long) value); - break; - case CFloat: - UNSAFE.putFloat(addr, (float) value); - break; - case CDouble: - UNSAFE.putDouble(addr, (double) value); - break; - case HPyContextPtr, VoidPtr, VoidPtrPtr, HPyPtr, ConstHPyPtr, Wchar_tPtr, ConstWchar_tPtr, CharPtr: - case ConstCharPtr, DataPtr, DataPtrPtr, Cpy_PyObjectPtr, HPyModuleDefPtr, HPyType_SpecPtr: - case HPyType_SpecParamPtr, HPyDefPtr, HPyFieldPtr, HPyGlobalPtr, HPyCapsule_DestructorPtr, PyType_SlotPtr: - UNSAFE.putAddress(addr, (long) value); - break; - default: - int size = ctx.getCTypeSize(type); - switch (size) { - case 1: - UNSAFE.putByte(addr, (byte) value); - break; - case 2: - UNSAFE.putShort(addr, (short) value); - break; - case 4: - UNSAFE.putInt(addr, (int) value); - break; - case 8: - UNSAFE.putLong(addr, (long) value); - break; - default: - throw CompilerDirectives.shouldNotReachHere(); - } - } - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeWriteHPyNode extends WriteHPyNode { - - static final UnsafeWriteHPyNode UNCACHED = new UnsafeWriteHPyNode(); - - private UnsafeWriteHPyNode() { - } - - @Override - protected void execute(GraalHPyContext ctx, Object pointer, long offset, Object value) { - long bits = ctx.pythonObjectAsBits(value); - UNSAFE.putAddress(coerceToPointer(pointer) + offset, bits); - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeWriteHPyFieldNode extends WriteHPyFieldNode { - - static final UnsafeWriteHPyFieldNode UNCACHED = new UnsafeWriteHPyFieldNode(); - - private UnsafeWriteHPyFieldNode() { - } - - @Override - protected void execute(GraalHPyContext ctx, PythonObject owner, Object pointer, long offset, Object value) { - long address = coerceToPointer(pointer) + offset; - long loldValue = UNSAFE.getAddress(address); - if (!PInt.isIntRange(loldValue)) { - throw CompilerDirectives.shouldNotReachHere(); - } - int oldValue = (int) loldValue; - // TODO: (tfel) do not actually allocate the index / free the existing one when - // value can be stored as tagged handle - if (value == NULL_HANDLE_DELEGATE && oldValue == 0) { - // assigning HPy_NULL to a field that already holds HPy_NULL, nothing to do - } else { - int newValue = GraalHPyData.setHPyField(owner, value, oldValue); - if (oldValue != newValue) { - UNSAFE.putAddress(address, newValue); - } - } - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeWritePointerNode extends WritePointerNode { - - static final UnsafeWritePointerNode UNCACHED = new UnsafeWritePointerNode(); - - private UnsafeWritePointerNode() { - } - - @Override - protected void execute(GraalHPyContext ctx, Object basePointer, long offset, Object valuePointer) { - UNSAFE.putAddress(coerceToPointer(basePointer) + offset, coerceToPointer(valuePointer)); - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - static final class UnsafeWriteSizeTNode extends WriteSizeTNode { - - static final UnsafeWriteSizeTNode UNCACHED = new UnsafeWriteSizeTNode(); - - private UnsafeWriteSizeTNode() { - } - - @Override - protected void execute(GraalHPyContext ctx, Object basePointer, long offset, long valuePointer) { - write(coerceToPointer(basePointer) + offset, valuePointer); - } - - static void write(long address, long value) { - UNSAFE.putAddress(address, value); - } - - @Override - public boolean isAdoptable() { - return false; - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyJNIFromCharPointerNode extends HPyFromCharPointerNode { - - @Specialization - static TruffleString doLong(@SuppressWarnings("unused") GraalHPyContext hpyContext, long charPtr, int n, Encoding encoding, boolean copy, - @Bind("this") Node inliningTarget, - @Exclusive @Cached InlinedConditionProfile lengthProfile, - @Exclusive @Cached TruffleString.FromNativePointerNode fromNativePointerNode, - @Exclusive @Cached TruffleString.SwitchEncodingNode switchEncodingNode) { - int length = lengthProfile.profile(inliningTarget, n < 0) ? strlen(charPtr) : n; - return read(new NativePointer(charPtr), length, encoding, copy, fromNativePointerNode, switchEncodingNode); - } - - @Specialization - static TruffleString doNativePointer(@SuppressWarnings("unused") GraalHPyContext hpyContext, NativePointer charPtr, int n, Encoding encoding, boolean copy, - @Bind("this") Node inliningTarget, - @Exclusive @Cached InlinedConditionProfile lengthProfile, - @Exclusive @Cached TruffleString.FromNativePointerNode fromNativePointerNode, - @Exclusive @Cached TruffleString.SwitchEncodingNode switchEncodingNode) { - int length = lengthProfile.profile(inliningTarget, n < 0) ? strlen(charPtr.asPointer()) : n; - return read(charPtr, length, encoding, copy, fromNativePointerNode, switchEncodingNode); - } - - @Specialization(replaces = {"doLong", "doNativePointer"}) - static TruffleString doGeneric(@SuppressWarnings("unused") GraalHPyContext hpyContext, Object charPtr, int n, Encoding encoding, boolean copy, - @Bind("this") Node inliningTarget, - @Exclusive @CachedLibrary(limit = "1") InteropLibrary lib, - @Exclusive @Cached InlinedConditionProfile lengthProfile, - @Exclusive @Cached TruffleString.FromNativePointerNode fromNativePointerNode, - @Exclusive @Cached TruffleString.SwitchEncodingNode switchEncodingNode) { - - long lcharPtr; - Object interopPtr; - if (charPtr instanceof Long ltmp) { - interopPtr = new NativePointer(ltmp); - lcharPtr = ltmp; - } else if (charPtr instanceof NativePointer nativeCharPtr) { - interopPtr = nativeCharPtr; - lcharPtr = nativeCharPtr.asPointer(); - } else { - try { - interopPtr = charPtr; - lcharPtr = lib.asPointer(charPtr); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - } - int length = lengthProfile.profile(inliningTarget, n < 0) ? strlen(lcharPtr) : n; - return read(interopPtr, length, encoding, copy, fromNativePointerNode, switchEncodingNode); - } - - private static TruffleString read(Object charPtr, int length, Encoding encoding, boolean copy, - TruffleString.FromNativePointerNode fromNativePointerNode, - TruffleString.SwitchEncodingNode switchEncodingNode) { - assert length >= 0; - TruffleString result = fromNativePointerNode.execute(charPtr, 0, length, encoding, copy); - if (TS_ENCODING != encoding) { - return switchEncodingNode.execute(result, TS_ENCODING); - } - return result; - } - - static int strlen(long charPtr) { - int length = 0; - while (UNSAFE.getByte(charPtr + length) != 0) { - length++; - } - return length; - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyJNIAsCharPointerNode extends HPyAsCharPointerNode { - - abstract long executeLong(GraalHPyContext hpyContext, TruffleString string, Encoding encoding); - - @Specialization - static long doGeneric(@SuppressWarnings("unused") GraalHPyContext hpyContext, TruffleString string, Encoding encoding, - @Bind("this") Node inliningTarget, - @Cached InlinedExactClassProfile classProfile, - @Cached TruffleString.SwitchEncodingNode switchEncodingNode, - @Cached TruffleString.AsNativeNode asNativeNode, - @Cached TruffleString.GetInternalNativePointerNode getInternalNativePointerNode) { - TruffleString tsEncoded = switchEncodingNode.execute(string, encoding); - TruffleString tsNative = asNativeNode.execute(tsEncoded, GraalHPyJNIContext.TS_NATIVE_ALLOCATOR, encoding, false, true); - Object profiledInteropPointer = classProfile.profile(inliningTarget, getInternalNativePointerNode.execute(tsNative, encoding)); - if (profiledInteropPointer instanceof NativePointer nativePointer) { - return nativePointer.asPointer(); - } - return interopPointerToNative(profiledInteropPointer); - } - - @TruffleBoundary - private static long interopPointerToNative(Object object) { - return GraalHPyJNIContext.interopPointerToNative(object, InteropLibrary.getUncached(object)); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/jni/GraalHPyJNITrampolines.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/jni/GraalHPyJNITrampolines.java deleted file mode 100644 index a15956b467..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/jni/GraalHPyJNITrampolines.java +++ /dev/null @@ -1,351 +0,0 @@ -/* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy.jni; - -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; - -abstract class GraalHPyJNITrampolines { - - /* manual HPY JNI trampoline declarations */ - - @TruffleBoundary - public static native long executeModuleInit(long target); - - @TruffleBoundary - public static native void executeDestroyfunc(long target, long dataptr); - - // int (*HPyFunc_traverseproc)(void *, HPyFunc_visitproc, void *); - public static long executeTraverseproc(long target, long self, long visitproc, long field) { - throw CompilerDirectives.shouldNotReachHere("traverseproc should never be called"); - } - - /* generated HPY JNI trampoline declarations */ - - // {{start autogen}} - // @formatter:off - // Checkstyle: stop - // DO NOT EDIT THIS PART! - // This part is automatically generated by hpy.tools.autogen.graalpy.autogen_ctx_jni - // typedef HPy (*HPyFunc_noargs)(HPyContext *ctx, HPy self) - @TruffleBoundary - public static native long executeNoargs(long target, long ctx, long self); - - // typedef HPy (*HPyFunc_o)(HPyContext *ctx, HPy self, HPy arg) - @TruffleBoundary - public static native long executeO(long target, long ctx, long self, long arg); - - // typedef HPy (*HPyFunc_varargs)(HPyContext *ctx, HPy self, const HPy *args, size_t nargs) - @TruffleBoundary - public static native long executeVarargs(long target, long ctx, long self, long args, long nargs); - - // typedef HPy (*HPyFunc_keywords)(HPyContext *ctx, HPy self, const HPy *args, size_t nargs, HPy kwnames) - @TruffleBoundary - public static native long executeKeywords(long target, long ctx, long self, long args, long nargs, long kwnames); - - // typedef HPy (*HPyFunc_unaryfunc)(HPyContext *ctx, HPy) - @TruffleBoundary - public static native long executeUnaryfunc(long target, long ctx, long arg0); - - // typedef HPy (*HPyFunc_binaryfunc)(HPyContext *ctx, HPy, HPy) - @TruffleBoundary - public static native long executeBinaryfunc(long target, long ctx, long arg0, long arg1); - - // typedef HPy (*HPyFunc_ternaryfunc)(HPyContext *ctx, HPy, HPy, HPy) - @TruffleBoundary - public static native long executeTernaryfunc(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef int (*HPyFunc_inquiry)(HPyContext *ctx, HPy) - @TruffleBoundary - public static native int executeInquiry(long target, long ctx, long arg0); - - // typedef HPy_ssize_t (*HPyFunc_lenfunc)(HPyContext *ctx, HPy) - @TruffleBoundary - public static native long executeLenfunc(long target, long ctx, long arg0); - - // typedef HPy (*HPyFunc_ssizeargfunc)(HPyContext *ctx, HPy, HPy_ssize_t) - @TruffleBoundary - public static native long executeSsizeargfunc(long target, long ctx, long arg0, long arg1); - - // typedef HPy (*HPyFunc_ssizessizeargfunc)(HPyContext *ctx, HPy, HPy_ssize_t, HPy_ssize_t) - @TruffleBoundary - public static native long executeSsizessizeargfunc(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef int (*HPyFunc_ssizeobjargproc)(HPyContext *ctx, HPy, HPy_ssize_t, HPy) - @TruffleBoundary - public static native int executeSsizeobjargproc(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef int (*HPyFunc_ssizessizeobjargproc)(HPyContext *ctx, HPy, HPy_ssize_t, HPy_ssize_t, HPy) - @TruffleBoundary - public static native int executeSsizessizeobjargproc(long target, long ctx, long arg0, long arg1, long arg2, long arg3); - - // typedef int (*HPyFunc_objobjargproc)(HPyContext *ctx, HPy, HPy, HPy) - @TruffleBoundary - public static native int executeObjobjargproc(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef void (*HPyFunc_freefunc)(HPyContext *ctx, void *) - @TruffleBoundary - public static native void executeFreefunc(long target, long ctx, long arg0); - - // typedef HPy (*HPyFunc_getattrfunc)(HPyContext *ctx, HPy, char *) - @TruffleBoundary - public static native long executeGetattrfunc(long target, long ctx, long arg0, long arg1); - - // typedef HPy (*HPyFunc_getattrofunc)(HPyContext *ctx, HPy, HPy) - @TruffleBoundary - public static native long executeGetattrofunc(long target, long ctx, long arg0, long arg1); - - // typedef int (*HPyFunc_setattrfunc)(HPyContext *ctx, HPy, char *, HPy) - @TruffleBoundary - public static native int executeSetattrfunc(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef int (*HPyFunc_setattrofunc)(HPyContext *ctx, HPy, HPy, HPy) - @TruffleBoundary - public static native int executeSetattrofunc(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef HPy (*HPyFunc_reprfunc)(HPyContext *ctx, HPy) - @TruffleBoundary - public static native long executeReprfunc(long target, long ctx, long arg0); - - // typedef HPy_hash_t (*HPyFunc_hashfunc)(HPyContext *ctx, HPy) - @TruffleBoundary - public static native long executeHashfunc(long target, long ctx, long arg0); - - // typedef HPy (*HPyFunc_richcmpfunc)(HPyContext *ctx, HPy, HPy, HPy_RichCmpOp) - @TruffleBoundary - public static native long executeRichcmpfunc(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef HPy (*HPyFunc_getiterfunc)(HPyContext *ctx, HPy) - @TruffleBoundary - public static native long executeGetiterfunc(long target, long ctx, long arg0); - - // typedef HPy (*HPyFunc_iternextfunc)(HPyContext *ctx, HPy) - @TruffleBoundary - public static native long executeIternextfunc(long target, long ctx, long arg0); - - // typedef HPy (*HPyFunc_descrgetfunc)(HPyContext *ctx, HPy, HPy, HPy) - @TruffleBoundary - public static native long executeDescrgetfunc(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef int (*HPyFunc_descrsetfunc)(HPyContext *ctx, HPy, HPy, HPy) - @TruffleBoundary - public static native int executeDescrsetfunc(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef int (*HPyFunc_initproc)(HPyContext *ctx, HPy self, const HPy *args, HPy_ssize_t nargs, HPy kw) - @TruffleBoundary - public static native int executeInitproc(long target, long ctx, long self, long args, long nargs, long kw); - - // typedef HPy (*HPyFunc_newfunc)(HPyContext *ctx, HPy type, const HPy *args, HPy_ssize_t nargs, HPy kw) - @TruffleBoundary - public static native long executeNewfunc(long target, long ctx, long type, long args, long nargs, long kw); - - // typedef HPy (*HPyFunc_getter)(HPyContext *ctx, HPy, void *) - @TruffleBoundary - public static native long executeGetter(long target, long ctx, long arg0, long arg1); - - // typedef int (*HPyFunc_setter)(HPyContext *ctx, HPy, HPy, void *) - @TruffleBoundary - public static native int executeSetter(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef int (*HPyFunc_objobjproc)(HPyContext *ctx, HPy, HPy) - @TruffleBoundary - public static native int executeObjobjproc(long target, long ctx, long arg0, long arg1); - - // typedef int (*HPyFunc_getbufferproc)(HPyContext *ctx, HPy, HPy_buffer *, int) - @TruffleBoundary - public static native int executeGetbufferproc(long target, long ctx, long arg0, long arg1, int arg2); - - // typedef void (*HPyFunc_releasebufferproc)(HPyContext *ctx, HPy, HPy_buffer *) - @TruffleBoundary - public static native void executeReleasebufferproc(long target, long ctx, long arg0, long arg1); - - // typedef void (*HPyFunc_destructor)(HPyContext *ctx, HPy) - @TruffleBoundary - public static native void executeDestructor(long target, long ctx, long arg0); - - // typedef HPy (*HPyFunc_mod_create)(HPyContext *ctx, HPy) - @TruffleBoundary - public static native long executeModcreate(long target, long ctx, long arg0); - - // typedef HPy (*HPyFunc_noargs)(HPyContext *ctx, HPy self) - @TruffleBoundary - public static native long executeDebugNoargs(long target, long ctx, long self); - - // typedef HPy (*HPyFunc_o)(HPyContext *ctx, HPy self, HPy arg) - @TruffleBoundary - public static native long executeDebugO(long target, long ctx, long self, long arg); - - // typedef HPy (*HPyFunc_varargs)(HPyContext *ctx, HPy self, const HPy *args, size_t nargs) - @TruffleBoundary - public static native long executeDebugVarargs(long target, long ctx, long self, long args, long nargs); - - // typedef HPy (*HPyFunc_keywords)(HPyContext *ctx, HPy self, const HPy *args, size_t nargs, HPy kwnames) - @TruffleBoundary - public static native long executeDebugKeywords(long target, long ctx, long self, long args, long nargs, long kwnames); - - // typedef HPy (*HPyFunc_unaryfunc)(HPyContext *ctx, HPy) - @TruffleBoundary - public static native long executeDebugUnaryfunc(long target, long ctx, long arg0); - - // typedef HPy (*HPyFunc_binaryfunc)(HPyContext *ctx, HPy, HPy) - @TruffleBoundary - public static native long executeDebugBinaryfunc(long target, long ctx, long arg0, long arg1); - - // typedef HPy (*HPyFunc_ternaryfunc)(HPyContext *ctx, HPy, HPy, HPy) - @TruffleBoundary - public static native long executeDebugTernaryfunc(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef int (*HPyFunc_inquiry)(HPyContext *ctx, HPy) - @TruffleBoundary - public static native int executeDebugInquiry(long target, long ctx, long arg0); - - // typedef HPy_ssize_t (*HPyFunc_lenfunc)(HPyContext *ctx, HPy) - @TruffleBoundary - public static native long executeDebugLenfunc(long target, long ctx, long arg0); - - // typedef HPy (*HPyFunc_ssizeargfunc)(HPyContext *ctx, HPy, HPy_ssize_t) - @TruffleBoundary - public static native long executeDebugSsizeargfunc(long target, long ctx, long arg0, long arg1); - - // typedef HPy (*HPyFunc_ssizessizeargfunc)(HPyContext *ctx, HPy, HPy_ssize_t, HPy_ssize_t) - @TruffleBoundary - public static native long executeDebugSsizessizeargfunc(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef int (*HPyFunc_ssizeobjargproc)(HPyContext *ctx, HPy, HPy_ssize_t, HPy) - @TruffleBoundary - public static native int executeDebugSsizeobjargproc(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef int (*HPyFunc_ssizessizeobjargproc)(HPyContext *ctx, HPy, HPy_ssize_t, HPy_ssize_t, HPy) - @TruffleBoundary - public static native int executeDebugSsizessizeobjargproc(long target, long ctx, long arg0, long arg1, long arg2, long arg3); - - // typedef int (*HPyFunc_objobjargproc)(HPyContext *ctx, HPy, HPy, HPy) - @TruffleBoundary - public static native int executeDebugObjobjargproc(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef void (*HPyFunc_freefunc)(HPyContext *ctx, void *) - @TruffleBoundary - public static native void executeDebugFreefunc(long target, long ctx, long arg0); - - // typedef HPy (*HPyFunc_getattrfunc)(HPyContext *ctx, HPy, char *) - @TruffleBoundary - public static native long executeDebugGetattrfunc(long target, long ctx, long arg0, long arg1); - - // typedef HPy (*HPyFunc_getattrofunc)(HPyContext *ctx, HPy, HPy) - @TruffleBoundary - public static native long executeDebugGetattrofunc(long target, long ctx, long arg0, long arg1); - - // typedef int (*HPyFunc_setattrfunc)(HPyContext *ctx, HPy, char *, HPy) - @TruffleBoundary - public static native int executeDebugSetattrfunc(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef int (*HPyFunc_setattrofunc)(HPyContext *ctx, HPy, HPy, HPy) - @TruffleBoundary - public static native int executeDebugSetattrofunc(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef HPy (*HPyFunc_reprfunc)(HPyContext *ctx, HPy) - @TruffleBoundary - public static native long executeDebugReprfunc(long target, long ctx, long arg0); - - // typedef HPy_hash_t (*HPyFunc_hashfunc)(HPyContext *ctx, HPy) - @TruffleBoundary - public static native long executeDebugHashfunc(long target, long ctx, long arg0); - - // typedef HPy (*HPyFunc_richcmpfunc)(HPyContext *ctx, HPy, HPy, HPy_RichCmpOp) - @TruffleBoundary - public static native long executeDebugRichcmpfunc(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef HPy (*HPyFunc_getiterfunc)(HPyContext *ctx, HPy) - @TruffleBoundary - public static native long executeDebugGetiterfunc(long target, long ctx, long arg0); - - // typedef HPy (*HPyFunc_iternextfunc)(HPyContext *ctx, HPy) - @TruffleBoundary - public static native long executeDebugIternextfunc(long target, long ctx, long arg0); - - // typedef HPy (*HPyFunc_descrgetfunc)(HPyContext *ctx, HPy, HPy, HPy) - @TruffleBoundary - public static native long executeDebugDescrgetfunc(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef int (*HPyFunc_descrsetfunc)(HPyContext *ctx, HPy, HPy, HPy) - @TruffleBoundary - public static native int executeDebugDescrsetfunc(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef int (*HPyFunc_initproc)(HPyContext *ctx, HPy self, const HPy *args, HPy_ssize_t nargs, HPy kw) - @TruffleBoundary - public static native int executeDebugInitproc(long target, long ctx, long self, long args, long nargs, long kw); - - // typedef HPy (*HPyFunc_newfunc)(HPyContext *ctx, HPy type, const HPy *args, HPy_ssize_t nargs, HPy kw) - @TruffleBoundary - public static native long executeDebugNewfunc(long target, long ctx, long type, long args, long nargs, long kw); - - // typedef HPy (*HPyFunc_getter)(HPyContext *ctx, HPy, void *) - @TruffleBoundary - public static native long executeDebugGetter(long target, long ctx, long arg0, long arg1); - - // typedef int (*HPyFunc_setter)(HPyContext *ctx, HPy, HPy, void *) - @TruffleBoundary - public static native int executeDebugSetter(long target, long ctx, long arg0, long arg1, long arg2); - - // typedef int (*HPyFunc_objobjproc)(HPyContext *ctx, HPy, HPy) - @TruffleBoundary - public static native int executeDebugObjobjproc(long target, long ctx, long arg0, long arg1); - - // typedef int (*HPyFunc_getbufferproc)(HPyContext *ctx, HPy, HPy_buffer *, int) - @TruffleBoundary - public static native int executeDebugGetbufferproc(long target, long ctx, long arg0, long arg1, int arg2); - - // typedef void (*HPyFunc_releasebufferproc)(HPyContext *ctx, HPy, HPy_buffer *) - @TruffleBoundary - public static native void executeDebugReleasebufferproc(long target, long ctx, long arg0, long arg1); - - // typedef void (*HPyFunc_destructor)(HPyContext *ctx, HPy) - @TruffleBoundary - public static native void executeDebugDestructor(long target, long ctx, long arg0); - - // typedef HPy (*HPyFunc_mod_create)(HPyContext *ctx, HPy) - @TruffleBoundary - public static native long executeDebugModcreate(long target, long ctx, long arg0); - - // @formatter:on - // Checkstyle: resume - // {{end autogen}} -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/llvm/GraalHPyInitObject.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/llvm/GraalHPyInitObject.java deleted file mode 100644 index 2278ff6ce0..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/llvm/GraalHPyInitObject.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy.llvm; - -import com.oracle.graal.python.builtins.objects.PythonAbstractObject; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.interop.ArityException; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.TruffleObject; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.library.ExportLibrary; -import com.oracle.truffle.api.library.ExportMessage; - -/** - * A simple interop-capable object that is used to initialize the HPy LLVM backend. - */ -@ExportLibrary(InteropLibrary.class) -public final class GraalHPyInitObject implements TruffleObject { - - private static final String J_SET_HPY_CONTEXT_NATIVE_TYPE = "setHPyContextNativeType"; - private static final String J_SET_HPY_NATIVE_TYPE = "setHPyNativeType"; - private static final String J_SET_HPY_ARRAY_NATIVE_TYPE = "setHPyArrayNativeType"; - private static final String J_SET_NATIVE_CACHE_FUNCTION_PTR = "setNativeCacheFunctionPtr"; - - private final GraalHPyLLVMContext backend; - - public GraalHPyInitObject(GraalHPyLLVMContext backend) { - this.backend = backend; - } - - @ExportMessage - @SuppressWarnings("static-method") - boolean hasMembers() { - return true; - } - - @ExportMessage - @TruffleBoundary - @SuppressWarnings("static-method") - Object getMembers(@SuppressWarnings("unused") boolean includeInternal) { - return new PythonAbstractObject.Keys( - new String[]{J_SET_HPY_CONTEXT_NATIVE_TYPE, J_SET_HPY_NATIVE_TYPE, J_SET_HPY_ARRAY_NATIVE_TYPE, J_SET_NATIVE_CACHE_FUNCTION_PTR}); - } - - @ExportMessage - @TruffleBoundary - @SuppressWarnings("static-method") - boolean isMemberInvocable(String key) { - return switch (key) { - case J_SET_HPY_CONTEXT_NATIVE_TYPE, J_SET_HPY_NATIVE_TYPE, J_SET_HPY_ARRAY_NATIVE_TYPE, J_SET_NATIVE_CACHE_FUNCTION_PTR -> true; - default -> false; - }; - } - - @ExportMessage - @TruffleBoundary - Object invokeMember(String key, Object[] arguments) throws UnsupportedMessageException, ArityException { - if (arguments.length != 1) { - throw ArityException.create(1, 1, arguments.length); - } - - switch (key) { - case J_SET_HPY_CONTEXT_NATIVE_TYPE -> backend.hpyContextNativeTypeID = arguments[0]; - case J_SET_HPY_NATIVE_TYPE -> backend.hpyNativeTypeID = arguments[0]; - case J_SET_HPY_ARRAY_NATIVE_TYPE -> backend.hpyArrayNativeTypeID = arguments[0]; - case J_SET_NATIVE_CACHE_FUNCTION_PTR -> backend.setNativeSpaceFunction = arguments[0]; - default -> throw UnsupportedMessageException.create(); - } - return 0; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/llvm/GraalHPyLLVMCallHelperFunctionNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/llvm/GraalHPyLLVMCallHelperFunctionNode.java deleted file mode 100644 index 0122356b89..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/llvm/GraalHPyLLVMCallHelperFunctionNode.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy.llvm; - -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNativeSymbol; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyCallHelperFunctionNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodes.HPyLLVMCallHelperFunctionNode; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.nodes.Node; - -/** - * This is the implementation of {@link HPyCallHelperFunctionNode} for the LLVM backend. This node - * currently just delegates to {@link HPyLLVMCallHelperFunctionNode} but this may change in the - * future. - */ -@GenerateUncached -@GenerateInline(false) -abstract class GraalHPyLLVMCallHelperFunctionNode extends HPyCallHelperFunctionNode { - - @Specialization - static Object doGeneric(GraalHPyContext context, GraalHPyNativeSymbol name, Object[] args, - @Bind("this") Node inliningTarget, - @Cached HPyLLVMCallHelperFunctionNode callHPyFunction) { - return callHPyFunction.execute(inliningTarget, context, name, args); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/llvm/GraalHPyLLVMContext.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/llvm/GraalHPyLLVMContext.java deleted file mode 100644 index fc4f0452c6..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/llvm/GraalHPyLLVMContext.java +++ /dev/null @@ -1,1357 +0,0 @@ -/* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy.llvm; - -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.SINGLETON_HANDLE_ELIPSIS; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.SINGLETON_HANDLE_NONE; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.SINGLETON_HANDLE_NOT_IMPLEMENTED; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNativeSymbol.GRAAL_HPY_CONTEXT_TO_NATIVE; -import static com.oracle.graal.python.nodes.StringLiterals.J_LLVM_LANGUAGE; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; -import static com.oracle.graal.python.util.PythonUtils.tsLiteral; - -import java.io.IOException; -import java.util.HashMap; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.PNotImplemented; -import com.oracle.graal.python.builtins.objects.PythonAbstractObject; -import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CStringWrapper; -import com.oracle.graal.python.builtins.objects.cext.common.CExtAsPythonObjectNode; -import com.oracle.graal.python.builtins.objects.cext.common.CExtContext; -import com.oracle.graal.python.builtins.objects.cext.common.CExtToNativeNode; -import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ApiInitException; -import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ImportException; -import com.oracle.graal.python.builtins.objects.cext.common.NativePointer; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyBoxing; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.AllocateNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.BulkFreeHandleReferencesNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.FreeNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.GetElementPtrNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.IsNullNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadDoubleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadFloatNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadGenericNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadHPyArrayNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadHPyFieldNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadHPyNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadI32Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadI64Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadI8ArrayNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadPointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteDoubleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteGenericNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteHPyFieldNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteHPyNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteI32Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteI64Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WritePointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteSizeTNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCField; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.HPyABIVersion; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.HPyUpcall; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctions; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctions.GraalHPyContextFunction; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyHandle; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNativeContext; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNativeSymbol; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyAsCharPointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyCallHelperFunctionNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyDummyToJavaNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyFromCharPointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyTransformExceptionToNativeNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyAsContextNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyAsHandleNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyAsNativeInt64NodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyAsPythonObjectNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodesFactory.HPyTransformExceptionToNativeNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextMember; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyMode; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodes.HPyLLVMCallHelperFunctionNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMAsCharPointerNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMBulkFreeHandleReferencesNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMFreeNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMFromCharPointerNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMGetElementPtrNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMIsNullNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMReadDoubleNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMReadFloatNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMReadGenericNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMReadHPyArrayNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMReadHPyFieldNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMReadHPyNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMReadI32NodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMReadI64NodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMReadPointerNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMWriteDoubleNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMWriteGenericNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMWriteHPyFieldNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMWriteHPyNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMWriteI32NodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMWriteI64NodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMWritePointerNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMWriteSizeTNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.LLVMAllocateNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.LLVMReadI8ArrayNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.HPyArrayWrappers.HPyArrayWrapper; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.HPyArrayWrappers.IntArrayWrapper; -import com.oracle.graal.python.builtins.objects.ellipsis.PEllipsis; -import com.oracle.graal.python.builtins.objects.module.PythonModule; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.StringLiterals; -import com.oracle.graal.python.nodes.object.GetOrCreateDictNode; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.runtime.PythonOptions.HPyBackendMode; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.TruffleFile; -import com.oracle.truffle.api.TruffleLanguage.Env; -import com.oracle.truffle.api.TruffleLogger; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.GenerateCached; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.ReportPolymorphism.Megamorphic; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.interop.ArityException; -import com.oracle.truffle.api.interop.InteropException; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.TruffleObject; -import com.oracle.truffle.api.interop.UnknownIdentifierException; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.interop.UnsupportedTypeException; -import com.oracle.truffle.api.library.CachedLibrary; -import com.oracle.truffle.api.library.ExportLibrary; -import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.ExplodeLoop; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.source.Source; -import com.oracle.truffle.api.source.Source.SourceBuilder; -import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.llvm.spi.NativeTypeLibrary; - -/** - * This object is used to override specific native upcall pointers in the HPyContext. This is - * queried for every member of HPyContext by {@code graal_hpy_context_to_native}, and overrides the - * original values (which are NFI closures for functions in {@code hpy.c}, subsequently calling into - * {@link GraalHPyContextFunctions}. - */ -@ExportLibrary(InteropLibrary.class) -@ExportLibrary(value = NativeTypeLibrary.class, useForAOT = false) -public final class GraalHPyLLVMContext extends GraalHPyNativeContext { - - private static final String J_NAME = "HPy Universal ABI (GraalVM LLVM backend)"; - private static final TruffleLogger LOGGER = GraalHPyContext.getLogger(GraalHPyLLVMContext.class); - - /** A resolving cache from Java string to HPyContextMember */ - public static HashMap contextMembersByName; - - private final int[] counts; - - /** the native type ID of C struct 'HPyContext' */ - @CompilationFinal Object hpyContextNativeTypeID; - - /** the native type ID of C struct 'HPy' */ - @CompilationFinal Object hpyNativeTypeID; - @CompilationFinal Object hpyArrayNativeTypeID; - @CompilationFinal Object setNativeSpaceFunction; - - @CompilationFinal(dimensions = 1) private final int[] ctypeSizes; - @CompilationFinal(dimensions = 1) private final int[] cfieldOffsets; - - @CompilationFinal(dimensions = 1) private final Object[] hpyContextMembers; - @CompilationFinal(dimensions = 1) private final Object[] nativeSymbolCache; - - Object nativePointer; - - public GraalHPyLLVMContext(GraalHPyContext context, boolean traceUpcalls) { - super(context, traceUpcalls); - Object[] ctxMembers = createMembers(tsLiteral(J_NAME)); - this.ctypeSizes = new int[HPyContextSignatureType.values().length]; - this.cfieldOffsets = new int[GraalHPyCField.values().length]; - if (traceUpcalls) { - this.counts = new int[HPyContextMember.VALUES.length]; - /* - * For upcall tracing, each executable member is wrapped into an HPyExecuteWrapper which - * does the tracing - */ - for (int i = 0; i < ctxMembers.length; i++) { - Object m = ctxMembers[i]; - if (m instanceof HPyExecuteWrapper executeWrapper) { - ctxMembers[i] = new HPyExecuteWrapperTraceUpcall(this.counts, i, executeWrapper); - } - } - } else { - this.counts = null; - } - // This will assign handles to the remaining context constants - for (Object member : ctxMembers) { - if (member instanceof GraalHPyHandle handle) { - int id = handle.getIdUncached(context); - assert id > 0 && id < GraalHPyContext.IMMUTABLE_HANDLE_COUNT; - assert id > GraalHPyBoxing.SINGLETON_HANDLE_MAX || - context.getHPyHandleForObject(handle.getDelegate()) == id; - } - } - this.hpyContextMembers = ctxMembers; - this.nativeSymbolCache = new Object[GraalHPyNativeSymbol.values().length]; - } - - void setHPyContextNativeType(Object nativeType) { - this.hpyContextNativeTypeID = nativeType; - } - - public Object getHPyNativeType() { - assert this.hpyNativeTypeID != null : "HPy native type ID not available"; - return hpyNativeTypeID; - } - - public Object getHPyArrayNativeType() { - assert this.hpyArrayNativeTypeID != null : "HPy* native type ID not available"; - return hpyArrayNativeTypeID; - } - - @Override - protected int getCTypeSize(HPyContextSignatureType ctype) { - assert ctypeSizes != null; - return ctypeSizes[ctype.ordinal()]; - } - - @Override - protected int getCFieldOffset(GraalHPyCField cfield) { - assert cfieldOffsets != null; - return cfieldOffsets[cfield.ordinal()]; - } - - @Override - protected Object nativeToInteropPointer(Object object) { - return object; - } - - Object[] getNativeSymbolCache() { - return nativeSymbolCache; - } - - @Override - protected Object getNativeNull() { - return NativePointer.createNull(); - } - - @Override - protected String getName() { - return J_NAME; - } - - /** - * Load {@code libhpy} with LLVM and return the library object. - */ - public static Object loadLLVMLibrary(PythonContext context) throws IOException { - CompilerAsserts.neverPartOfCompilation(); - Env env = context.getEnv(); - TruffleFile homePath = env.getInternalTruffleFile(context.getCAPIHome().toJavaStringUncached()); - // e.g. "libhpy-native.so" - TruffleFile capiFile = homePath.resolve(context.getLLVMSupportExt("hpy")); - try { - LOGGER.fine("Loading HPy LLVM backend from " + capiFile); - SourceBuilder capiSrcBuilder = Source.newBuilder(J_LLVM_LANGUAGE, capiFile); - if (!context.getLanguage().getEngineOption(PythonOptions.ExposeInternalSources)) { - capiSrcBuilder.internal(true); - } - return context.getEnv().parseInternal(capiSrcBuilder.build()).call(); - } catch (RuntimeException e) { - LOGGER.severe(String.format("Fatal error occurred when loading %s", capiFile)); - /* - * Just loading the library is not expected to throw any legitimate exceptions because - * it does not have any 'ctors' that could raise, e.g., a Python exception. So, any - * exception is considered to be fatal. - */ - throw CompilerDirectives.shouldNotReachHere(e); - } - } - - @Override - protected Object loadExtensionLibrary(Node location, PythonContext context, TruffleString name, TruffleString path) throws ImportException, IOException { - CompilerAsserts.neverPartOfCompilation(); - return CExtContext.loadLLVMLibrary(location, context, name, path); - } - - @Override - protected HPyABIVersion getHPyABIVersion(Object extLib, String getMajorVersionFuncName, String getMinorVersionFuncName) throws InteropException { - CompilerAsserts.neverPartOfCompilation(); - InteropLibrary lib = InteropLibrary.getUncached(extLib); - Object majorVersionFun = lib.readMember(extLib, getMajorVersionFuncName); - Object minorVersionFun = lib.readMember(extLib, getMinorVersionFuncName); - InteropLibrary funLib = InteropLibrary.getUncached(majorVersionFun); - assert (funLib.accepts(minorVersionFun)); - int requiredMajorVersion = expectInt(funLib.execute(majorVersionFun)); - int requiredMinorVersion = expectInt(funLib.execute(minorVersionFun)); - return new HPyABIVersion(requiredMajorVersion, requiredMinorVersion); - } - - @Override - protected Object initHPyModule(Object llvmLibrary, String initFuncName, TruffleString name, TruffleString path, HPyMode mode) - throws UnsupportedMessageException, ArityException, UnsupportedTypeException, ImportException { - CompilerAsserts.neverPartOfCompilation(); - assert mode == HPyMode.MODE_UNIVERSAL; - Object initFunction; - InteropLibrary lib = InteropLibrary.getUncached(llvmLibrary); - if (lib.isMemberReadable(llvmLibrary, initFuncName)) { - try { - initFunction = lib.readMember(llvmLibrary, initFuncName); - } catch (UnknownIdentifierException | UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - } else { - throw new ImportException(null, name, path, ErrorMessages.CANNOT_INITIALIZE_EXT_NO_ENTRY, name, path, initFuncName); - } - /* - * LLVM always answers message 'isExecutable' correctly. If the pointer object is not - * executable, this most certainly means that the loaded library does not contain bitcode, - * and so we fail. - */ - if (!InteropLibrary.getUncached().isExecutable(initFunction)) { - throw new ImportException(null, name, path, ErrorMessages.NO_FUNCTION_FOUND, "", initFuncName, path); - } - return InteropLibrary.getUncached().execute(initFunction, this); - } - - @Override - protected void initNativeContext() throws ApiInitException { - Object hpyLibrary = context.getLLVMLibrary(); - InteropLibrary interopLibrary = InteropLibrary.getFactory().getUncached(hpyLibrary); - try { - interopLibrary.invokeMember(hpyLibrary, "graal_hpy_init", context, new GraalHPyInitObject(this), new IntArrayWrapper(ctypeSizes), new IntArrayWrapper(cfieldOffsets)); - } catch (InteropException e) { - throw new ApiInitException(e); - } - assert nativeSymbolCache != null; - for (GraalHPyNativeSymbol symbol : GraalHPyNativeSymbol.values()) { - try { - String name = symbol.getName(); - Object nativeSymbol = interopLibrary.readMember(hpyLibrary, name); - assert nativeSymbolCache[symbol.ordinal()] == null; - nativeSymbolCache[symbol.ordinal()] = nativeSymbol; - } catch (UnknownIdentifierException e) { - throw new ApiInitException(ErrorMessages.INVALID_CAPI_FUNC, TruffleString.fromJavaStringUncached(symbol.getName(), TS_ENCODING)); - } catch (UnsupportedMessageException e) { - throw new ApiInitException(ErrorMessages.CORRUPTED_CAPI_LIB_OBJ, hpyLibrary); - } - } - } - - @Override - protected void initNativeFastPaths() { - throw CompilerDirectives.shouldNotReachHere(""); - } - - @Override - protected HPyUpcall[] getUpcalls() { - return HPyContextMember.VALUES; - } - - @Override - protected int[] getUpcallCounts() { - return counts; - } - - @Override - protected void finalizeNativeContext() { - - } - - @Override - public void initHPyDebugContext() throws ApiInitException { - // debug mode is currently not available with the LLVM backend - throw new ApiInitException(ErrorMessages.HPY_S_MODE_NOT_AVAILABLE, StringLiterals.J_DEBUG); - } - - @Override - public PythonModule getHPyDebugModule() throws ImportException { - // debug mode is currently not available with the LLVM backend - throw new ImportException(null, null, null, ErrorMessages.HPY_S_MODE_NOT_AVAILABLE, StringLiterals.J_DEBUG); - } - - @Override - public void initHPyTraceContext() throws ApiInitException { - // debug mode is currently not available with the LLVM backend - throw new ApiInitException(ErrorMessages.HPY_S_MODE_NOT_AVAILABLE, StringLiterals.J_TRACE); - } - - @Override - public PythonModule getHPyTraceModule() throws ImportException { - // trace mode is currently not available with the LLVM backend - throw new ImportException(null, null, null, ErrorMessages.HPY_S_MODE_NOT_AVAILABLE, StringLiterals.J_TRACE); - } - - @Override - protected void setNativeCache(long cachePtr) { - assert useNativeFastPaths(); - try { - InteropLibrary.getUncached().execute(setNativeSpaceFunction, nativePointer, cachePtr); - } catch (UnsupportedTypeException | ArityException | UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } - - @Override - public HPyCallHelperFunctionNode createCallHelperFunctionNode() { - return GraalHPyLLVMCallHelperFunctionNodeGen.create(); - } - - @Override - public HPyCallHelperFunctionNode getUncachedCallHelperFunctionNode() { - return GraalHPyLLVMCallHelperFunctionNodeGen.getUncached(); - } - - @Override - public HPyFromCharPointerNode createFromCharPointerNode() { - return HPyLLVMFromCharPointerNodeGen.create(); - } - - @Override - public HPyFromCharPointerNode getUncachedFromCharPointerNode() { - return HPyLLVMFromCharPointerNodeGen.getUncached(); - } - - @Override - public HPyAsCharPointerNode createAsCharPointerNode() { - return HPyLLVMAsCharPointerNodeGen.create(); - } - - @Override - public HPyAsCharPointerNode getUncachedAsCharPointerNode() { - return HPyLLVMAsCharPointerNodeGen.getUncached(); - } - - @Override - public AllocateNode createAllocateNode() { - return LLVMAllocateNodeGen.create(); - } - - @Override - public AllocateNode getUncachedAllocateNode() { - return LLVMAllocateNodeGen.getUncached(); - } - - @Override - public FreeNode createFreeNode() { - return HPyLLVMFreeNodeGen.create(); - } - - @Override - public FreeNode getUncachedFreeNode() { - return HPyLLVMFreeNodeGen.getUncached(); - } - - @Override - public BulkFreeHandleReferencesNode createBulkFreeHandleReferencesNode() { - return HPyLLVMBulkFreeHandleReferencesNodeGen.create(); - } - - @Override - public GetElementPtrNode createGetElementPtrNode() { - return HPyLLVMGetElementPtrNodeGen.create(); - } - - @Override - public GetElementPtrNode getUncachedGetElementPtrNode() { - return HPyLLVMGetElementPtrNodeGen.getUncached(); - } - - @Override - public IsNullNode createIsNullNode() { - return HPyLLVMIsNullNodeGen.create(); - } - - @Override - public IsNullNode getUncachedIsNullNode() { - return HPyLLVMIsNullNodeGen.getUncached(); - } - - @Override - public ReadI32Node createReadI32Node() { - return HPyLLVMReadI32NodeGen.create(); - } - - @Override - public ReadI32Node getUncachedReadI32Node() { - return HPyLLVMReadI32NodeGen.getUncached(); - } - - @Override - public ReadI64Node createReadI64Node() { - return HPyLLVMReadI64NodeGen.create(); - } - - @Override - public ReadI64Node getUncachedReadI64Node() { - return HPyLLVMReadI64NodeGen.getUncached(); - } - - @Override - public ReadFloatNode createReadFloatNode() { - return HPyLLVMReadFloatNodeGen.create(); - } - - @Override - public ReadFloatNode getUncachedReadFloatNode() { - return HPyLLVMReadFloatNodeGen.getUncached(); - } - - @Override - public ReadDoubleNode createReadDoubleNode() { - return HPyLLVMReadDoubleNodeGen.create(); - } - - @Override - public ReadDoubleNode getUncachedReadDoubleNode() { - return HPyLLVMReadDoubleNodeGen.getUncached(); - } - - @Override - public ReadPointerNode createReadPointerNode() { - return HPyLLVMReadPointerNodeGen.create(); - } - - @Override - public ReadPointerNode getUncachedReadPointerNode() { - return HPyLLVMReadPointerNodeGen.getUncached(); - } - - @Override - public WriteDoubleNode createWriteDoubleNode() { - return HPyLLVMWriteDoubleNodeGen.create(); - } - - @Override - public WriteDoubleNode getUncachedWriteDoubleNode() { - return HPyLLVMWriteDoubleNodeGen.getUncached(); - } - - @Override - public WriteI32Node createWriteI32Node() { - return HPyLLVMWriteI32NodeGen.create(); - } - - @Override - public WriteI32Node getUncachedWriteI32Node() { - return HPyLLVMWriteI32NodeGen.getUncached(); - } - - @Override - public WriteI64Node createWriteI64Node() { - return HPyLLVMWriteI64NodeGen.create(); - } - - @Override - public WriteI64Node getUncachedWriteI64Node() { - return HPyLLVMWriteI64NodeGen.getUncached(); - } - - @Override - public WriteHPyNode createWriteHPyNode() { - return HPyLLVMWriteHPyNodeGen.create(); - } - - @Override - public WriteHPyNode getUncachedWriteHPyNode() { - return HPyLLVMWriteHPyNodeGen.getUncached(); - } - - @Override - public ReadI8ArrayNode createReadI8ArrayNode() { - return LLVMReadI8ArrayNodeGen.create(); - } - - @Override - public ReadI8ArrayNode getUncachedReadI8ArrayNode() { - return LLVMReadI8ArrayNodeGen.getUncached(); - } - - @Override - public ReadHPyNode createReadHPyNode() { - return HPyLLVMReadHPyNodeGen.create(); - } - - @Override - public ReadHPyNode getUncachedReadHPyNode() { - return HPyLLVMReadHPyNodeGen.getUncached(); - } - - @Override - public ReadHPyFieldNode createReadHPyFieldNode() { - return HPyLLVMReadHPyFieldNodeGen.create(); - } - - @Override - public ReadHPyFieldNode getUncachedReadFieldHPyNode() { - return HPyLLVMReadHPyFieldNodeGen.getUncached(); - } - - @Override - public ReadGenericNode createReadGenericNode() { - return HPyLLVMReadGenericNodeGen.create(); - } - - @Override - public ReadGenericNode getUncachedReadGenericNode() { - return HPyLLVMReadGenericNodeGen.getUncached(); - } - - @Override - public ReadHPyArrayNode createReadHPyArrayNode() { - return HPyLLVMReadHPyArrayNodeGen.create(); - } - - @Override - public ReadHPyArrayNode getUncachedReadHPyArrayNode() { - return HPyLLVMReadHPyArrayNodeGen.getUncached(); - } - - @Override - public WritePointerNode createWritePointerNode() { - return HPyLLVMWritePointerNodeGen.create(); - } - - @Override - public WritePointerNode getUncachedWritePointerNode() { - return HPyLLVMWritePointerNodeGen.getUncached(); - } - - @Override - public WriteSizeTNode createWriteSizeTNode() { - return HPyLLVMWriteSizeTNodeGen.create(); - } - - @Override - public WriteSizeTNode getUncachedWriteSizeTNode() { - return HPyLLVMWriteSizeTNodeGen.getUncached(); - } - - @Override - public WriteGenericNode createWriteGenericNode() { - return HPyLLVMWriteGenericNodeGen.create(); - } - - @Override - public WriteGenericNode getUncachedWriteGenericNode() { - return HPyLLVMWriteGenericNodeGen.getUncached(); - } - - @Override - public WriteHPyFieldNode createWriteHPyFieldNode() { - return HPyLLVMWriteHPyFieldNodeGen.create(); - } - - @Override - public WriteHPyFieldNode getUncachedWriteHPyFieldNode() { - return HPyLLVMWriteHPyFieldNodeGen.getUncached(); - } - - @ExportMessage - boolean isPointer() { - return nativePointer != null; - } - - @ExportMessage(limit = "1") - long asPointer(@CachedLibrary("this.nativePointer") InteropLibrary lib) throws UnsupportedMessageException { - if (isPointer()) { - return lib.asPointer(nativePointer); - } - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw UnsupportedMessageException.create(); - } - - /** - * Internal method for transforming the HPy universal context to native. This is mostly like the - * interop message {@code toNative} but may of course fail if native access is not allowed. This - * method can be used to force the context to native if a native pointer is needed that will be - * handed to a native (e.g. JNI or NFI) function. - */ - @Override - protected void toNativeInternal() { - CompilerDirectives.transferToInterpreter(); - assert !isPointer(); - assert PythonLanguage.get(null).getEngineOption(PythonOptions.HPyBackend) == HPyBackendMode.LLVM; - nativePointer = HPyLLVMCallHelperFunctionNode.callUncached(context, GRAAL_HPY_CONTEXT_TO_NATIVE, this); - } - - @Override - protected Object createArgumentsArray(Object[] args) { - return new HPyArrayWrapper(context, args); - } - - @Override - protected void freeArgumentsArray(Object argsArray) { - if (argsArray instanceof HPyArrayWrapper hpyArrayWrapper) { - hpyArrayWrapper.close(); - } - } - - private static int expectInt(Object value) { - if (value instanceof Integer i) { - return i; - } - InteropLibrary lib = InteropLibrary.getUncached(value); - if (lib.fitsInInt(value)) { - try { - return lib.asInt(value); - } catch (UnsupportedMessageException e) { - // fall through - } - } - throw CompilerDirectives.shouldNotReachHere(); - } - - private static Object createConstant(Object value) { - return GraalHPyHandle.create(value); - } - - private Object createBuiltinsConstant() { - return createConstant(GetOrCreateDictNode.executeUncached(context.getContext().getBuiltins())); - } - - private static Object createSingletonConstant(Object value, int handle) { - return GraalHPyHandle.createSingleton(value, handle); - } - - private Object createTypeConstant(PythonBuiltinClassType value) { - return GraalHPyHandle.create(context.getContext().lookupType(value)); - } - - private static HPyExecuteWrapper createContextFunction(HPyContextMember member) { - return new HPyExecuteWrapper(member); - } - - private Object[] createMembers(TruffleString name) { - Object[] members = new Object[HPyContextMember.VALUES.length]; - - members[HPyContextMember.NAME.ordinal()] = new CStringWrapper(name); - // TODO(fa): we should use the value of macro HPY_ABI_VERSION here - members[HPyContextMember.ABI_VERSION.ordinal()] = 0; - - // {{start llvm ctx init}} - // @formatter:off - // Checkstyle: stop - // DO NOT EDIT THIS PART! - // This part is automatically generated by hpy.tools.autogen.graalpy.autogen_ctx_llvm_init - members[HPyContextMember.H_NONE.ordinal()] = createSingletonConstant(PNone.NONE, SINGLETON_HANDLE_NONE); - members[HPyContextMember.H_TRUE.ordinal()] = createConstant(context.getContext().getTrue()); - members[HPyContextMember.H_FALSE.ordinal()] = createConstant(context.getContext().getFalse()); - members[HPyContextMember.H_NOTIMPLEMENTED.ordinal()] = createSingletonConstant(PNotImplemented.NOT_IMPLEMENTED, SINGLETON_HANDLE_NOT_IMPLEMENTED); - members[HPyContextMember.H_ELLIPSIS.ordinal()] = createSingletonConstant(PEllipsis.INSTANCE, SINGLETON_HANDLE_ELIPSIS); - members[HPyContextMember.H_BASEEXCEPTION.ordinal()] = createTypeConstant(PythonBuiltinClassType.PBaseException); - members[HPyContextMember.H_EXCEPTION.ordinal()] = createTypeConstant(PythonBuiltinClassType.Exception); - members[HPyContextMember.H_STOPASYNCITERATION.ordinal()] = createTypeConstant(PythonBuiltinClassType.StopAsyncIteration); - members[HPyContextMember.H_STOPITERATION.ordinal()] = createTypeConstant(PythonBuiltinClassType.StopIteration); - members[HPyContextMember.H_GENERATOREXIT.ordinal()] = createTypeConstant(PythonBuiltinClassType.GeneratorExit); - members[HPyContextMember.H_ARITHMETICERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.ArithmeticError); - members[HPyContextMember.H_LOOKUPERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.LookupError); - members[HPyContextMember.H_ASSERTIONERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.AssertionError); - members[HPyContextMember.H_ATTRIBUTEERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.AttributeError); - members[HPyContextMember.H_BUFFERERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.BufferError); - members[HPyContextMember.H_EOFERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.EOFError); - members[HPyContextMember.H_FLOATINGPOINTERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.FloatingPointError); - members[HPyContextMember.H_OSERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.OSError); - members[HPyContextMember.H_IMPORTERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.ImportError); - members[HPyContextMember.H_MODULENOTFOUNDERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.ModuleNotFoundError); - members[HPyContextMember.H_INDEXERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.IndexError); - members[HPyContextMember.H_KEYERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.KeyError); - members[HPyContextMember.H_KEYBOARDINTERRUPT.ordinal()] = createTypeConstant(PythonBuiltinClassType.KeyboardInterrupt); - members[HPyContextMember.H_MEMORYERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.MemoryError); - members[HPyContextMember.H_NAMEERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.NameError); - members[HPyContextMember.H_OVERFLOWERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.OverflowError); - members[HPyContextMember.H_RUNTIMEERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.RuntimeError); - members[HPyContextMember.H_RECURSIONERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.RecursionError); - members[HPyContextMember.H_NOTIMPLEMENTEDERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.NotImplementedError); - members[HPyContextMember.H_SYNTAXERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.SyntaxError); - members[HPyContextMember.H_INDENTATIONERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.IndentationError); - members[HPyContextMember.H_TABERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.TabError); - members[HPyContextMember.H_REFERENCEERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.ReferenceError); - members[HPyContextMember.H_SYSTEMERROR.ordinal()] = createTypeConstant(SystemError); - members[HPyContextMember.H_SYSTEMEXIT.ordinal()] = createTypeConstant(PythonBuiltinClassType.SystemExit); - members[HPyContextMember.H_TYPEERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.TypeError); - members[HPyContextMember.H_UNBOUNDLOCALERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.UnboundLocalError); - members[HPyContextMember.H_UNICODEERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.UnicodeError); - members[HPyContextMember.H_UNICODEENCODEERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.UnicodeEncodeError); - members[HPyContextMember.H_UNICODEDECODEERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.UnicodeDecodeError); - members[HPyContextMember.H_UNICODETRANSLATEERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.UnicodeTranslateError); - members[HPyContextMember.H_VALUEERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.ValueError); - members[HPyContextMember.H_ZERODIVISIONERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.ZeroDivisionError); - members[HPyContextMember.H_BLOCKINGIOERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.BlockingIOError); - members[HPyContextMember.H_BROKENPIPEERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.BrokenPipeError); - members[HPyContextMember.H_CHILDPROCESSERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.ChildProcessError); - members[HPyContextMember.H_CONNECTIONERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.ConnectionError); - members[HPyContextMember.H_CONNECTIONABORTEDERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.ConnectionAbortedError); - members[HPyContextMember.H_CONNECTIONREFUSEDERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.ConnectionRefusedError); - members[HPyContextMember.H_CONNECTIONRESETERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.ConnectionResetError); - members[HPyContextMember.H_FILEEXISTSERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.FileExistsError); - members[HPyContextMember.H_FILENOTFOUNDERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.FileNotFoundError); - members[HPyContextMember.H_INTERRUPTEDERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.InterruptedError); - members[HPyContextMember.H_ISADIRECTORYERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.IsADirectoryError); - members[HPyContextMember.H_NOTADIRECTORYERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.NotADirectoryError); - members[HPyContextMember.H_PERMISSIONERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.PermissionError); - members[HPyContextMember.H_PROCESSLOOKUPERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.ProcessLookupError); - members[HPyContextMember.H_TIMEOUTERROR.ordinal()] = createTypeConstant(PythonBuiltinClassType.TimeoutError); - members[HPyContextMember.H_WARNING.ordinal()] = createTypeConstant(PythonBuiltinClassType.Warning); - members[HPyContextMember.H_USERWARNING.ordinal()] = createTypeConstant(PythonBuiltinClassType.UserWarning); - members[HPyContextMember.H_DEPRECATIONWARNING.ordinal()] = createTypeConstant(PythonBuiltinClassType.DeprecationWarning); - members[HPyContextMember.H_PENDINGDEPRECATIONWARNING.ordinal()] = createTypeConstant(PythonBuiltinClassType.PendingDeprecationWarning); - members[HPyContextMember.H_SYNTAXWARNING.ordinal()] = createTypeConstant(PythonBuiltinClassType.SyntaxWarning); - members[HPyContextMember.H_RUNTIMEWARNING.ordinal()] = createTypeConstant(PythonBuiltinClassType.RuntimeWarning); - members[HPyContextMember.H_FUTUREWARNING.ordinal()] = createTypeConstant(PythonBuiltinClassType.FutureWarning); - members[HPyContextMember.H_IMPORTWARNING.ordinal()] = createTypeConstant(PythonBuiltinClassType.ImportWarning); - members[HPyContextMember.H_UNICODEWARNING.ordinal()] = createTypeConstant(PythonBuiltinClassType.UnicodeWarning); - members[HPyContextMember.H_BYTESWARNING.ordinal()] = createTypeConstant(PythonBuiltinClassType.BytesWarning); - members[HPyContextMember.H_RESOURCEWARNING.ordinal()] = createTypeConstant(PythonBuiltinClassType.ResourceWarning); - members[HPyContextMember.H_BASEOBJECTTYPE.ordinal()] = createTypeConstant(PythonBuiltinClassType.PythonObject); - members[HPyContextMember.H_TYPETYPE.ordinal()] = createTypeConstant(PythonBuiltinClassType.PythonClass); - members[HPyContextMember.H_BOOLTYPE.ordinal()] = createTypeConstant(PythonBuiltinClassType.Boolean); - members[HPyContextMember.H_LONGTYPE.ordinal()] = createTypeConstant(PythonBuiltinClassType.PInt); - members[HPyContextMember.H_FLOATTYPE.ordinal()] = createTypeConstant(PythonBuiltinClassType.PFloat); - members[HPyContextMember.H_UNICODETYPE.ordinal()] = createTypeConstant(PythonBuiltinClassType.PString); - members[HPyContextMember.H_TUPLETYPE.ordinal()] = createTypeConstant(PythonBuiltinClassType.PTuple); - members[HPyContextMember.H_LISTTYPE.ordinal()] = createTypeConstant(PythonBuiltinClassType.PList); - members[HPyContextMember.H_COMPLEXTYPE.ordinal()] = createTypeConstant(PythonBuiltinClassType.PComplex); - members[HPyContextMember.H_BYTESTYPE.ordinal()] = createTypeConstant(PythonBuiltinClassType.PBytes); - members[HPyContextMember.H_MEMORYVIEWTYPE.ordinal()] = createTypeConstant(PythonBuiltinClassType.PMemoryView); - members[HPyContextMember.H_CAPSULETYPE.ordinal()] = createTypeConstant(PythonBuiltinClassType.Capsule); - members[HPyContextMember.H_SLICETYPE.ordinal()] = createTypeConstant(PythonBuiltinClassType.PSlice); - members[HPyContextMember.H_BUILTINS.ordinal()] = createBuiltinsConstant(); - - members[HPyContextMember.CTX_DUP.ordinal()] = createContextFunction(HPyContextMember.CTX_DUP); - members[HPyContextMember.CTX_CLOSE.ordinal()] = createContextFunction(HPyContextMember.CTX_CLOSE); - members[HPyContextMember.CTX_LONG_FROMINT32_T.ordinal()] = createContextFunction(HPyContextMember.CTX_LONG_FROMINT32_T); - members[HPyContextMember.CTX_LONG_FROMUINT32_T.ordinal()] = createContextFunction(HPyContextMember.CTX_LONG_FROMUINT32_T); - members[HPyContextMember.CTX_LONG_FROMINT64_T.ordinal()] = createContextFunction(HPyContextMember.CTX_LONG_FROMINT64_T); - members[HPyContextMember.CTX_LONG_FROMUINT64_T.ordinal()] = createContextFunction(HPyContextMember.CTX_LONG_FROMUINT64_T); - members[HPyContextMember.CTX_LONG_FROMSIZE_T.ordinal()] = createContextFunction(HPyContextMember.CTX_LONG_FROMSIZE_T); - members[HPyContextMember.CTX_LONG_FROMSSIZE_T.ordinal()] = createContextFunction(HPyContextMember.CTX_LONG_FROMSSIZE_T); - members[HPyContextMember.CTX_LONG_ASINT32_T.ordinal()] = createContextFunction(HPyContextMember.CTX_LONG_ASINT32_T); - members[HPyContextMember.CTX_LONG_ASUINT32_T.ordinal()] = createContextFunction(HPyContextMember.CTX_LONG_ASUINT32_T); - members[HPyContextMember.CTX_LONG_ASUINT32_TMASK.ordinal()] = createContextFunction(HPyContextMember.CTX_LONG_ASUINT32_TMASK); - members[HPyContextMember.CTX_LONG_ASINT64_T.ordinal()] = createContextFunction(HPyContextMember.CTX_LONG_ASINT64_T); - members[HPyContextMember.CTX_LONG_ASUINT64_T.ordinal()] = createContextFunction(HPyContextMember.CTX_LONG_ASUINT64_T); - members[HPyContextMember.CTX_LONG_ASUINT64_TMASK.ordinal()] = createContextFunction(HPyContextMember.CTX_LONG_ASUINT64_TMASK); - members[HPyContextMember.CTX_LONG_ASSIZE_T.ordinal()] = createContextFunction(HPyContextMember.CTX_LONG_ASSIZE_T); - members[HPyContextMember.CTX_LONG_ASSSIZE_T.ordinal()] = createContextFunction(HPyContextMember.CTX_LONG_ASSSIZE_T); - members[HPyContextMember.CTX_LONG_ASVOIDPTR.ordinal()] = createContextFunction(HPyContextMember.CTX_LONG_ASVOIDPTR); - members[HPyContextMember.CTX_LONG_ASDOUBLE.ordinal()] = createContextFunction(HPyContextMember.CTX_LONG_ASDOUBLE); - members[HPyContextMember.CTX_FLOAT_FROMDOUBLE.ordinal()] = createContextFunction(HPyContextMember.CTX_FLOAT_FROMDOUBLE); - members[HPyContextMember.CTX_FLOAT_ASDOUBLE.ordinal()] = createContextFunction(HPyContextMember.CTX_FLOAT_ASDOUBLE); - members[HPyContextMember.CTX_BOOL_FROMBOOL.ordinal()] = createContextFunction(HPyContextMember.CTX_BOOL_FROMBOOL); - members[HPyContextMember.CTX_LENGTH.ordinal()] = createContextFunction(HPyContextMember.CTX_LENGTH); - members[HPyContextMember.CTX_NUMBER_CHECK.ordinal()] = createContextFunction(HPyContextMember.CTX_NUMBER_CHECK); - members[HPyContextMember.CTX_ADD.ordinal()] = createContextFunction(HPyContextMember.CTX_ADD); - members[HPyContextMember.CTX_SUBTRACT.ordinal()] = createContextFunction(HPyContextMember.CTX_SUBTRACT); - members[HPyContextMember.CTX_MULTIPLY.ordinal()] = createContextFunction(HPyContextMember.CTX_MULTIPLY); - members[HPyContextMember.CTX_MATRIXMULTIPLY.ordinal()] = createContextFunction(HPyContextMember.CTX_MATRIXMULTIPLY); - members[HPyContextMember.CTX_FLOORDIVIDE.ordinal()] = createContextFunction(HPyContextMember.CTX_FLOORDIVIDE); - members[HPyContextMember.CTX_TRUEDIVIDE.ordinal()] = createContextFunction(HPyContextMember.CTX_TRUEDIVIDE); - members[HPyContextMember.CTX_REMAINDER.ordinal()] = createContextFunction(HPyContextMember.CTX_REMAINDER); - members[HPyContextMember.CTX_DIVMOD.ordinal()] = createContextFunction(HPyContextMember.CTX_DIVMOD); - members[HPyContextMember.CTX_POWER.ordinal()] = createContextFunction(HPyContextMember.CTX_POWER); - members[HPyContextMember.CTX_NEGATIVE.ordinal()] = createContextFunction(HPyContextMember.CTX_NEGATIVE); - members[HPyContextMember.CTX_POSITIVE.ordinal()] = createContextFunction(HPyContextMember.CTX_POSITIVE); - members[HPyContextMember.CTX_ABSOLUTE.ordinal()] = createContextFunction(HPyContextMember.CTX_ABSOLUTE); - members[HPyContextMember.CTX_INVERT.ordinal()] = createContextFunction(HPyContextMember.CTX_INVERT); - members[HPyContextMember.CTX_LSHIFT.ordinal()] = createContextFunction(HPyContextMember.CTX_LSHIFT); - members[HPyContextMember.CTX_RSHIFT.ordinal()] = createContextFunction(HPyContextMember.CTX_RSHIFT); - members[HPyContextMember.CTX_AND.ordinal()] = createContextFunction(HPyContextMember.CTX_AND); - members[HPyContextMember.CTX_XOR.ordinal()] = createContextFunction(HPyContextMember.CTX_XOR); - members[HPyContextMember.CTX_OR.ordinal()] = createContextFunction(HPyContextMember.CTX_OR); - members[HPyContextMember.CTX_INDEX.ordinal()] = createContextFunction(HPyContextMember.CTX_INDEX); - members[HPyContextMember.CTX_LONG.ordinal()] = createContextFunction(HPyContextMember.CTX_LONG); - members[HPyContextMember.CTX_FLOAT.ordinal()] = createContextFunction(HPyContextMember.CTX_FLOAT); - members[HPyContextMember.CTX_INPLACEADD.ordinal()] = createContextFunction(HPyContextMember.CTX_INPLACEADD); - members[HPyContextMember.CTX_INPLACESUBTRACT.ordinal()] = createContextFunction(HPyContextMember.CTX_INPLACESUBTRACT); - members[HPyContextMember.CTX_INPLACEMULTIPLY.ordinal()] = createContextFunction(HPyContextMember.CTX_INPLACEMULTIPLY); - members[HPyContextMember.CTX_INPLACEMATRIXMULTIPLY.ordinal()] = createContextFunction(HPyContextMember.CTX_INPLACEMATRIXMULTIPLY); - members[HPyContextMember.CTX_INPLACEFLOORDIVIDE.ordinal()] = createContextFunction(HPyContextMember.CTX_INPLACEFLOORDIVIDE); - members[HPyContextMember.CTX_INPLACETRUEDIVIDE.ordinal()] = createContextFunction(HPyContextMember.CTX_INPLACETRUEDIVIDE); - members[HPyContextMember.CTX_INPLACEREMAINDER.ordinal()] = createContextFunction(HPyContextMember.CTX_INPLACEREMAINDER); - members[HPyContextMember.CTX_INPLACEPOWER.ordinal()] = createContextFunction(HPyContextMember.CTX_INPLACEPOWER); - members[HPyContextMember.CTX_INPLACELSHIFT.ordinal()] = createContextFunction(HPyContextMember.CTX_INPLACELSHIFT); - members[HPyContextMember.CTX_INPLACERSHIFT.ordinal()] = createContextFunction(HPyContextMember.CTX_INPLACERSHIFT); - members[HPyContextMember.CTX_INPLACEAND.ordinal()] = createContextFunction(HPyContextMember.CTX_INPLACEAND); - members[HPyContextMember.CTX_INPLACEXOR.ordinal()] = createContextFunction(HPyContextMember.CTX_INPLACEXOR); - members[HPyContextMember.CTX_INPLACEOR.ordinal()] = createContextFunction(HPyContextMember.CTX_INPLACEOR); - members[HPyContextMember.CTX_CALLABLE_CHECK.ordinal()] = createContextFunction(HPyContextMember.CTX_CALLABLE_CHECK); - members[HPyContextMember.CTX_CALLTUPLEDICT.ordinal()] = createContextFunction(HPyContextMember.CTX_CALLTUPLEDICT); - members[HPyContextMember.CTX_CALL.ordinal()] = createContextFunction(HPyContextMember.CTX_CALL); - members[HPyContextMember.CTX_CALLMETHOD.ordinal()] = createContextFunction(HPyContextMember.CTX_CALLMETHOD); - members[HPyContextMember.CTX_FATALERROR.ordinal()] = createContextFunction(HPyContextMember.CTX_FATALERROR); - members[HPyContextMember.CTX_ERR_SETSTRING.ordinal()] = createContextFunction(HPyContextMember.CTX_ERR_SETSTRING); - members[HPyContextMember.CTX_ERR_SETOBJECT.ordinal()] = createContextFunction(HPyContextMember.CTX_ERR_SETOBJECT); - members[HPyContextMember.CTX_ERR_SETFROMERRNOWITHFILENAME.ordinal()] = createContextFunction(HPyContextMember.CTX_ERR_SETFROMERRNOWITHFILENAME); - members[HPyContextMember.CTX_ERR_SETFROMERRNOWITHFILENAMEOBJECTS.ordinal()] = createContextFunction(HPyContextMember.CTX_ERR_SETFROMERRNOWITHFILENAMEOBJECTS); - members[HPyContextMember.CTX_ERR_OCCURRED.ordinal()] = createContextFunction(HPyContextMember.CTX_ERR_OCCURRED); - members[HPyContextMember.CTX_ERR_EXCEPTIONMATCHES.ordinal()] = createContextFunction(HPyContextMember.CTX_ERR_EXCEPTIONMATCHES); - members[HPyContextMember.CTX_ERR_NOMEMORY.ordinal()] = createContextFunction(HPyContextMember.CTX_ERR_NOMEMORY); - members[HPyContextMember.CTX_ERR_CLEAR.ordinal()] = createContextFunction(HPyContextMember.CTX_ERR_CLEAR); - members[HPyContextMember.CTX_ERR_NEWEXCEPTION.ordinal()] = createContextFunction(HPyContextMember.CTX_ERR_NEWEXCEPTION); - members[HPyContextMember.CTX_ERR_NEWEXCEPTIONWITHDOC.ordinal()] = createContextFunction(HPyContextMember.CTX_ERR_NEWEXCEPTIONWITHDOC); - members[HPyContextMember.CTX_ERR_WARNEX.ordinal()] = createContextFunction(HPyContextMember.CTX_ERR_WARNEX); - members[HPyContextMember.CTX_ERR_WRITEUNRAISABLE.ordinal()] = createContextFunction(HPyContextMember.CTX_ERR_WRITEUNRAISABLE); - members[HPyContextMember.CTX_ISTRUE.ordinal()] = createContextFunction(HPyContextMember.CTX_ISTRUE); - members[HPyContextMember.CTX_TYPE_FROMSPEC.ordinal()] = createContextFunction(HPyContextMember.CTX_TYPE_FROMSPEC); - members[HPyContextMember.CTX_TYPE_GENERICNEW.ordinal()] = createContextFunction(HPyContextMember.CTX_TYPE_GENERICNEW); - members[HPyContextMember.CTX_GETATTR.ordinal()] = createContextFunction(HPyContextMember.CTX_GETATTR); - members[HPyContextMember.CTX_GETATTR_S.ordinal()] = createContextFunction(HPyContextMember.CTX_GETATTR_S); - members[HPyContextMember.CTX_HASATTR.ordinal()] = createContextFunction(HPyContextMember.CTX_HASATTR); - members[HPyContextMember.CTX_HASATTR_S.ordinal()] = createContextFunction(HPyContextMember.CTX_HASATTR_S); - members[HPyContextMember.CTX_SETATTR.ordinal()] = createContextFunction(HPyContextMember.CTX_SETATTR); - members[HPyContextMember.CTX_SETATTR_S.ordinal()] = createContextFunction(HPyContextMember.CTX_SETATTR_S); - members[HPyContextMember.CTX_GETITEM.ordinal()] = createContextFunction(HPyContextMember.CTX_GETITEM); - members[HPyContextMember.CTX_GETITEM_I.ordinal()] = createContextFunction(HPyContextMember.CTX_GETITEM_I); - members[HPyContextMember.CTX_GETITEM_S.ordinal()] = createContextFunction(HPyContextMember.CTX_GETITEM_S); - members[HPyContextMember.CTX_CONTAINS.ordinal()] = createContextFunction(HPyContextMember.CTX_CONTAINS); - members[HPyContextMember.CTX_SETITEM.ordinal()] = createContextFunction(HPyContextMember.CTX_SETITEM); - members[HPyContextMember.CTX_SETITEM_I.ordinal()] = createContextFunction(HPyContextMember.CTX_SETITEM_I); - members[HPyContextMember.CTX_SETITEM_S.ordinal()] = createContextFunction(HPyContextMember.CTX_SETITEM_S); - members[HPyContextMember.CTX_DELITEM.ordinal()] = createContextFunction(HPyContextMember.CTX_DELITEM); - members[HPyContextMember.CTX_DELITEM_I.ordinal()] = createContextFunction(HPyContextMember.CTX_DELITEM_I); - members[HPyContextMember.CTX_DELITEM_S.ordinal()] = createContextFunction(HPyContextMember.CTX_DELITEM_S); - members[HPyContextMember.CTX_TYPE.ordinal()] = createContextFunction(HPyContextMember.CTX_TYPE); - members[HPyContextMember.CTX_TYPECHECK.ordinal()] = createContextFunction(HPyContextMember.CTX_TYPECHECK); - members[HPyContextMember.CTX_TYPE_GETNAME.ordinal()] = createContextFunction(HPyContextMember.CTX_TYPE_GETNAME); - members[HPyContextMember.CTX_TYPE_ISSUBTYPE.ordinal()] = createContextFunction(HPyContextMember.CTX_TYPE_ISSUBTYPE); - members[HPyContextMember.CTX_IS.ordinal()] = createContextFunction(HPyContextMember.CTX_IS); - members[HPyContextMember.CTX_ASSTRUCT_OBJECT.ordinal()] = createContextFunction(HPyContextMember.CTX_ASSTRUCT_OBJECT); - members[HPyContextMember.CTX_ASSTRUCT_LEGACY.ordinal()] = createContextFunction(HPyContextMember.CTX_ASSTRUCT_LEGACY); - members[HPyContextMember.CTX_ASSTRUCT_TYPE.ordinal()] = createContextFunction(HPyContextMember.CTX_ASSTRUCT_TYPE); - members[HPyContextMember.CTX_ASSTRUCT_LONG.ordinal()] = createContextFunction(HPyContextMember.CTX_ASSTRUCT_LONG); - members[HPyContextMember.CTX_ASSTRUCT_FLOAT.ordinal()] = createContextFunction(HPyContextMember.CTX_ASSTRUCT_FLOAT); - members[HPyContextMember.CTX_ASSTRUCT_UNICODE.ordinal()] = createContextFunction(HPyContextMember.CTX_ASSTRUCT_UNICODE); - members[HPyContextMember.CTX_ASSTRUCT_TUPLE.ordinal()] = createContextFunction(HPyContextMember.CTX_ASSTRUCT_TUPLE); - members[HPyContextMember.CTX_ASSTRUCT_LIST.ordinal()] = createContextFunction(HPyContextMember.CTX_ASSTRUCT_LIST); - members[HPyContextMember.CTX_TYPE_GETBUILTINSHAPE.ordinal()] = createContextFunction(HPyContextMember.CTX_TYPE_GETBUILTINSHAPE); - members[HPyContextMember.CTX_NEW.ordinal()] = createContextFunction(HPyContextMember.CTX_NEW); - members[HPyContextMember.CTX_REPR.ordinal()] = createContextFunction(HPyContextMember.CTX_REPR); - members[HPyContextMember.CTX_STR.ordinal()] = createContextFunction(HPyContextMember.CTX_STR); - members[HPyContextMember.CTX_ASCII.ordinal()] = createContextFunction(HPyContextMember.CTX_ASCII); - members[HPyContextMember.CTX_BYTES.ordinal()] = createContextFunction(HPyContextMember.CTX_BYTES); - members[HPyContextMember.CTX_RICHCOMPARE.ordinal()] = createContextFunction(HPyContextMember.CTX_RICHCOMPARE); - members[HPyContextMember.CTX_RICHCOMPAREBOOL.ordinal()] = createContextFunction(HPyContextMember.CTX_RICHCOMPAREBOOL); - members[HPyContextMember.CTX_HASH.ordinal()] = createContextFunction(HPyContextMember.CTX_HASH); - members[HPyContextMember.CTX_BYTES_CHECK.ordinal()] = createContextFunction(HPyContextMember.CTX_BYTES_CHECK); - members[HPyContextMember.CTX_BYTES_SIZE.ordinal()] = createContextFunction(HPyContextMember.CTX_BYTES_SIZE); - members[HPyContextMember.CTX_BYTES_GET_SIZE.ordinal()] = createContextFunction(HPyContextMember.CTX_BYTES_GET_SIZE); - members[HPyContextMember.CTX_BYTES_ASSTRING.ordinal()] = createContextFunction(HPyContextMember.CTX_BYTES_ASSTRING); - members[HPyContextMember.CTX_BYTES_AS_STRING.ordinal()] = createContextFunction(HPyContextMember.CTX_BYTES_AS_STRING); - members[HPyContextMember.CTX_BYTES_FROMSTRING.ordinal()] = createContextFunction(HPyContextMember.CTX_BYTES_FROMSTRING); - members[HPyContextMember.CTX_BYTES_FROMSTRINGANDSIZE.ordinal()] = createContextFunction(HPyContextMember.CTX_BYTES_FROMSTRINGANDSIZE); - members[HPyContextMember.CTX_UNICODE_FROMSTRING.ordinal()] = createContextFunction(HPyContextMember.CTX_UNICODE_FROMSTRING); - members[HPyContextMember.CTX_UNICODE_CHECK.ordinal()] = createContextFunction(HPyContextMember.CTX_UNICODE_CHECK); - members[HPyContextMember.CTX_UNICODE_ASASCIISTRING.ordinal()] = createContextFunction(HPyContextMember.CTX_UNICODE_ASASCIISTRING); - members[HPyContextMember.CTX_UNICODE_ASLATIN1STRING.ordinal()] = createContextFunction(HPyContextMember.CTX_UNICODE_ASLATIN1STRING); - members[HPyContextMember.CTX_UNICODE_ASUTF8STRING.ordinal()] = createContextFunction(HPyContextMember.CTX_UNICODE_ASUTF8STRING); - members[HPyContextMember.CTX_UNICODE_ASUTF8ANDSIZE.ordinal()] = createContextFunction(HPyContextMember.CTX_UNICODE_ASUTF8ANDSIZE); - members[HPyContextMember.CTX_UNICODE_FROMWIDECHAR.ordinal()] = createContextFunction(HPyContextMember.CTX_UNICODE_FROMWIDECHAR); - members[HPyContextMember.CTX_UNICODE_DECODEFSDEFAULT.ordinal()] = createContextFunction(HPyContextMember.CTX_UNICODE_DECODEFSDEFAULT); - members[HPyContextMember.CTX_UNICODE_DECODEFSDEFAULTANDSIZE.ordinal()] = createContextFunction(HPyContextMember.CTX_UNICODE_DECODEFSDEFAULTANDSIZE); - members[HPyContextMember.CTX_UNICODE_ENCODEFSDEFAULT.ordinal()] = createContextFunction(HPyContextMember.CTX_UNICODE_ENCODEFSDEFAULT); - members[HPyContextMember.CTX_UNICODE_READCHAR.ordinal()] = createContextFunction(HPyContextMember.CTX_UNICODE_READCHAR); - members[HPyContextMember.CTX_UNICODE_DECODEASCII.ordinal()] = createContextFunction(HPyContextMember.CTX_UNICODE_DECODEASCII); - members[HPyContextMember.CTX_UNICODE_DECODELATIN1.ordinal()] = createContextFunction(HPyContextMember.CTX_UNICODE_DECODELATIN1); - members[HPyContextMember.CTX_UNICODE_FROMENCODEDOBJECT.ordinal()] = createContextFunction(HPyContextMember.CTX_UNICODE_FROMENCODEDOBJECT); - members[HPyContextMember.CTX_UNICODE_SUBSTRING.ordinal()] = createContextFunction(HPyContextMember.CTX_UNICODE_SUBSTRING); - members[HPyContextMember.CTX_LIST_CHECK.ordinal()] = createContextFunction(HPyContextMember.CTX_LIST_CHECK); - members[HPyContextMember.CTX_LIST_NEW.ordinal()] = createContextFunction(HPyContextMember.CTX_LIST_NEW); - members[HPyContextMember.CTX_LIST_APPEND.ordinal()] = createContextFunction(HPyContextMember.CTX_LIST_APPEND); - members[HPyContextMember.CTX_DICT_CHECK.ordinal()] = createContextFunction(HPyContextMember.CTX_DICT_CHECK); - members[HPyContextMember.CTX_DICT_NEW.ordinal()] = createContextFunction(HPyContextMember.CTX_DICT_NEW); - members[HPyContextMember.CTX_DICT_KEYS.ordinal()] = createContextFunction(HPyContextMember.CTX_DICT_KEYS); - members[HPyContextMember.CTX_DICT_COPY.ordinal()] = createContextFunction(HPyContextMember.CTX_DICT_COPY); - members[HPyContextMember.CTX_TUPLE_CHECK.ordinal()] = createContextFunction(HPyContextMember.CTX_TUPLE_CHECK); - members[HPyContextMember.CTX_TUPLE_FROMARRAY.ordinal()] = createContextFunction(HPyContextMember.CTX_TUPLE_FROMARRAY); - members[HPyContextMember.CTX_SLICE_UNPACK.ordinal()] = createContextFunction(HPyContextMember.CTX_SLICE_UNPACK); - members[HPyContextMember.CTX_IMPORT_IMPORTMODULE.ordinal()] = createContextFunction(HPyContextMember.CTX_IMPORT_IMPORTMODULE); - members[HPyContextMember.CTX_CAPSULE_NEW.ordinal()] = createContextFunction(HPyContextMember.CTX_CAPSULE_NEW); - members[HPyContextMember.CTX_CAPSULE_GET.ordinal()] = createContextFunction(HPyContextMember.CTX_CAPSULE_GET); - members[HPyContextMember.CTX_CAPSULE_ISVALID.ordinal()] = createContextFunction(HPyContextMember.CTX_CAPSULE_ISVALID); - members[HPyContextMember.CTX_CAPSULE_SET.ordinal()] = createContextFunction(HPyContextMember.CTX_CAPSULE_SET); - members[HPyContextMember.CTX_FROMPYOBJECT.ordinal()] = createContextFunction(HPyContextMember.CTX_FROMPYOBJECT); - members[HPyContextMember.CTX_ASPYOBJECT.ordinal()] = createContextFunction(HPyContextMember.CTX_ASPYOBJECT); - members[HPyContextMember.CTX_LISTBUILDER_NEW.ordinal()] = createContextFunction(HPyContextMember.CTX_LISTBUILDER_NEW); - members[HPyContextMember.CTX_LISTBUILDER_SET.ordinal()] = createContextFunction(HPyContextMember.CTX_LISTBUILDER_SET); - members[HPyContextMember.CTX_LISTBUILDER_BUILD.ordinal()] = createContextFunction(HPyContextMember.CTX_LISTBUILDER_BUILD); - members[HPyContextMember.CTX_LISTBUILDER_CANCEL.ordinal()] = createContextFunction(HPyContextMember.CTX_LISTBUILDER_CANCEL); - members[HPyContextMember.CTX_TUPLEBUILDER_NEW.ordinal()] = createContextFunction(HPyContextMember.CTX_TUPLEBUILDER_NEW); - members[HPyContextMember.CTX_TUPLEBUILDER_SET.ordinal()] = createContextFunction(HPyContextMember.CTX_TUPLEBUILDER_SET); - members[HPyContextMember.CTX_TUPLEBUILDER_BUILD.ordinal()] = createContextFunction(HPyContextMember.CTX_TUPLEBUILDER_BUILD); - members[HPyContextMember.CTX_TUPLEBUILDER_CANCEL.ordinal()] = createContextFunction(HPyContextMember.CTX_TUPLEBUILDER_CANCEL); - members[HPyContextMember.CTX_TRACKER_NEW.ordinal()] = createContextFunction(HPyContextMember.CTX_TRACKER_NEW); - members[HPyContextMember.CTX_TRACKER_ADD.ordinal()] = createContextFunction(HPyContextMember.CTX_TRACKER_ADD); - members[HPyContextMember.CTX_TRACKER_FORGETALL.ordinal()] = createContextFunction(HPyContextMember.CTX_TRACKER_FORGETALL); - members[HPyContextMember.CTX_TRACKER_CLOSE.ordinal()] = createContextFunction(HPyContextMember.CTX_TRACKER_CLOSE); - members[HPyContextMember.CTX_FIELD_STORE.ordinal()] = createContextFunction(HPyContextMember.CTX_FIELD_STORE); - members[HPyContextMember.CTX_FIELD_LOAD.ordinal()] = createContextFunction(HPyContextMember.CTX_FIELD_LOAD); - members[HPyContextMember.CTX_REENTERPYTHONEXECUTION.ordinal()] = createContextFunction(HPyContextMember.CTX_REENTERPYTHONEXECUTION); - members[HPyContextMember.CTX_LEAVEPYTHONEXECUTION.ordinal()] = createContextFunction(HPyContextMember.CTX_LEAVEPYTHONEXECUTION); - members[HPyContextMember.CTX_GLOBAL_STORE.ordinal()] = createContextFunction(HPyContextMember.CTX_GLOBAL_STORE); - members[HPyContextMember.CTX_GLOBAL_LOAD.ordinal()] = createContextFunction(HPyContextMember.CTX_GLOBAL_LOAD); - members[HPyContextMember.CTX_DUMP.ordinal()] = createContextFunction(HPyContextMember.CTX_DUMP); - members[HPyContextMember.CTX_COMPILE_S.ordinal()] = createContextFunction(HPyContextMember.CTX_COMPILE_S); - members[HPyContextMember.CTX_EVALCODE.ordinal()] = createContextFunction(HPyContextMember.CTX_EVALCODE); - members[HPyContextMember.CTX_CONTEXTVAR_NEW.ordinal()] = createContextFunction(HPyContextMember.CTX_CONTEXTVAR_NEW); - members[HPyContextMember.CTX_CONTEXTVAR_GET.ordinal()] = createContextFunction(HPyContextMember.CTX_CONTEXTVAR_GET); - members[HPyContextMember.CTX_CONTEXTVAR_SET.ordinal()] = createContextFunction(HPyContextMember.CTX_CONTEXTVAR_SET); - members[HPyContextMember.CTX_SETCALLFUNCTION.ordinal()] = createContextFunction(HPyContextMember.CTX_SETCALLFUNCTION); - - // @formatter:on - // Checkstyle: resume - // {{end llvm ctx init}} - - return members; - } - - @TruffleBoundary - public static int getIndex(String key) { - if (contextMembersByName == null) { - HashMap contextMemberHashMap = new HashMap<>(); - for (HPyContextMember member : HPyContextMember.VALUES) { - contextMemberHashMap.put(member.getName(), member); - } - // allow races; it doesn't matter since contents will always be the same - contextMembersByName = contextMemberHashMap; - } - HPyContextMember member = contextMembersByName.get(key); - return member == null ? -1 : member.ordinal(); - } - - @ExportMessage - @SuppressWarnings("static-method") - boolean hasMembers() { - return true; - } - - @ExportMessage - @SuppressWarnings("static-method") - Object getMembers(@SuppressWarnings("unused") boolean includeInternal) { - String[] names = new String[HPyContextMember.VALUES.length]; - for (int i = 0; i < names.length; i++) { - names[i] = HPyContextMember.VALUES[i].getName(); - } - return new PythonAbstractObject.Keys(names); - } - - @ExportMessage - @ImportStatic(GraalHPyLLVMContext.class) - static class IsMemberReadable { - @Specialization(guards = "cachedKey.equals(key)", limit = "1") - static boolean isMemberReadableCached(@SuppressWarnings("unused") GraalHPyLLVMContext context, @SuppressWarnings("unused") String key, - @Cached(value = "key") @SuppressWarnings("unused") String cachedKey, - @Cached(value = "getIndex(key)") int cachedIdx) { - return cachedIdx != -1; - } - - @Specialization(replaces = "isMemberReadableCached") - static boolean isMemberReadable(@SuppressWarnings("unused") GraalHPyLLVMContext context, String key) { - return getIndex(key) != -1; - } - } - - @ExportMessage - Object readMember(String key, - @Bind("$node") Node inliningTarget, - @Shared("readMemberNode") @Cached GraalHPyReadMemberNode readMemberNode) { - return readMemberNode.execute(inliningTarget, this, key); - } - - @ExportMessage - @SuppressWarnings("static-method") - boolean hasNativeType() { - return true; - } - - @ExportMessage - Object getNativeType() { - return hpyContextNativeTypeID; - } - - @GenerateUncached - @GenerateInline - @GenerateCached(false) - @ImportStatic(GraalHPyLLVMContext.class) - abstract static class GraalHPyReadMemberNode extends Node { - - public abstract Object execute(Node node, GraalHPyLLVMContext backend, String key); - - @Specialization(guards = "cachedKey == key", limit = "1") - static Object doMemberCached(GraalHPyLLVMContext backend, String key, - @Cached("key") @SuppressWarnings("unused") String cachedKey, - @Cached("getIndex(key)") int cachedIdx) { - // TODO(fa) once everything is implemented, remove this check - if (cachedIdx != -1) { - Object value = backend.hpyContextMembers[cachedIdx]; - if (value != null) { - return value; - } - } - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw CompilerDirectives.shouldNotReachHere(PythonUtils.formatJString("context function %s not yet implemented: ", key)); - } - - @Specialization(replaces = "doMemberCached") - static Object doMember(GraalHPyLLVMContext backend, String key) { - return doMemberCached(backend, key, key, getIndex(key)); - } - } - - @ExportMessage - boolean isMemberInvocable(String key, - @Bind("$node") Node inliningTarget, - @Shared("readMemberNode") @Cached GraalHPyReadMemberNode readMemberNode, - @Shared("memberInvokeLib") @CachedLibrary(limit = "1") InteropLibrary memberInvokeLib) { - Object member = readMemberNode.execute(inliningTarget, this, key); - return member != null && memberInvokeLib.isExecutable(member); - } - - @ExportMessage - Object invokeMember(String key, Object[] args, - @Bind("$node") Node inliningTarget, - @Shared("readMemberNode") @Cached GraalHPyReadMemberNode readMemberNode, - @Shared("memberInvokeLib") @CachedLibrary(limit = "1") InteropLibrary memberInvokeLib) - throws UnsupportedMessageException, UnsupportedTypeException, ArityException { - Object member = readMemberNode.execute(inliningTarget, this, key); - assert member != null; - /* - * Optimization: the first argument *MUST* always be the context. If not, we can just set - * 'this'. - */ - args[0] = context; - return memberInvokeLib.execute(member, args); - } - - @GenerateUncached - @GenerateInline - @GenerateCached(false) - @SuppressWarnings("truffle-inlining") - abstract static class HPyExecuteContextFunction extends Node { - public abstract Object execute(Node inliningTarget, HPyContextMember member, Object[] arguments) throws ArityException; - - @Specialization(guards = "member == cachedMember", limit = "1") - static Object doCached(Node inliningTarget, @SuppressWarnings("unused") HPyContextMember member, Object[] arguments, - @Cached("member") HPyContextMember cachedMember, - @Cached(parameters = "member") GraalHPyContextFunction contextFunctionNode, - @Cached("createRetNode(member)") CExtToNativeNode retNode, - @Cached("createArgNodes(member)") CExtAsPythonObjectNode[] argNodes, - @Cached HPyTransformExceptionToNativeNode transformExceptionToNativeNode) throws ArityException { - checkArity(arguments, cachedMember.getSignature().parameterTypes().length); - try { - try { - Object[] argCast; - if (argNodes != null) { - argCast = new Object[argNodes.length]; - castArguments(arguments, argCast, argNodes); - } else { - argCast = arguments; - } - Object result = contextFunctionNode.execute(argCast); - if (retNode != null) { - result = retNode.execute(result); - } - return result; - } catch (Throwable t) { - throw checkThrowableBeforeNative(t, "HPy context function", cachedMember.getName()); - } - } catch (PException e) { - transformExceptionToNativeNode.execute(inliningTarget, e); - return getErrorValue(inliningTarget, cachedMember.getSignature().returnType()); - } - } - - @Specialization(replaces = "doCached") - @Megamorphic - @TruffleBoundary - static Object doUncached(Node inliningTarget, HPyContextMember member, Object[] arguments) throws ArityException { - return doCached(inliningTarget, member, arguments, member, GraalHPyContextFunction.getUncached(member), getUncachedRetNode(member), getUncachedArgNodes(member), - HPyTransformExceptionToNativeNodeGen.getUncached()); - } - - private static void checkArity(Object[] arguments, int expectedArity) throws ArityException { - if (arguments.length != expectedArity) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw ArityException.create(expectedArity, expectedArity, arguments.length); - } - } - - @ExplodeLoop - private static void castArguments(Object[] arguments, Object[] argCast, CExtAsPythonObjectNode[] argNodes) { - for (int i = 0; i < argNodes.length; i++) { - argCast[i] = argNodes[i] == null ? arguments[i] : argNodes[i].execute(arguments[i]); - } - } - - private static Object getErrorValue(Node inliningTarget, HPyContextSignatureType type) { - return switch (type) { - case Int, Int32_t, Uint32_t, HPy_UCS4 -> -1; - case Int64_t, Uint64_t, Size_t, HPy_ssize_t, HPy_hash_t -> -1L; - case CDouble -> -1.0; - case HPy -> GraalHPyHandle.NULL_HANDLE; - case VoidPtr, CharPtr, ConstCharPtr, Cpy_PyObjectPtr -> PythonContext.get(inliningTarget).getNativeNull(); - case CVoid -> PNone.NO_VALUE; - default -> throw CompilerDirectives.shouldNotReachHere("unsupported return type"); - }; - } - - static CExtToNativeNode createRetNode(HPyContextMember member) { - return switch (member.getSignature().returnType()) { - case HPy, HPyThreadState -> HPyAsHandleNodeGen.create(); - case HPy_ssize_t, HPy_hash_t -> HPyAsNativeInt64NodeGen.create(); - default -> null; - }; - } - - static CExtToNativeNode getUncachedRetNode(HPyContextMember member) { - return switch (member.getSignature().returnType()) { - case HPy, HPyThreadState -> HPyAsHandleNodeGen.getUncached(); - case HPy_ssize_t, HPy_hash_t -> HPyAsNativeInt64NodeGen.getUncached(); - default -> null; - }; - } - - /* - * Special cases: the following context functions need the bare handles. Hence, we leave the - * conversion up to the context function impl. - */ - private static boolean noArgumentConversion(HPyContextMember member) { - return switch (member) { - case CTX_CLOSE, CTX_TRACKER_ADD -> true; - default -> false; - }; - } - - static CExtAsPythonObjectNode[] createArgNodes(HPyContextMember member) { - if (noArgumentConversion(member)) { - return null; - } - HPyContextSignatureType[] argTypes = member.getSignature().parameterTypes(); - CExtAsPythonObjectNode[] argNodes = new CExtAsPythonObjectNode[argTypes.length]; - for (int i = 0; i < argNodes.length; i++) { - argNodes[i] = switch (argTypes[i]) { - case HPyContextPtr -> HPyAsContextNodeGen.create(); - case HPy, HPyThreadState -> HPyAsPythonObjectNodeGen.create(); - default -> HPyDummyToJavaNode.getUncached(); - }; - } - return argNodes; - } - - static CExtAsPythonObjectNode[] getUncachedArgNodes(HPyContextMember member) { - if (noArgumentConversion(member)) { - return null; - } - HPyContextSignatureType[] argTypes = member.getSignature().parameterTypes(); - CExtAsPythonObjectNode[] argNodes = new CExtAsPythonObjectNode[argTypes.length]; - for (int i = 0; i < argNodes.length; i++) { - argNodes[i] = switch (argTypes[i]) { - case HPyContextPtr -> HPyAsContextNodeGen.getUncached(); - case HPy, HPyThreadState -> HPyAsPythonObjectNodeGen.getUncached(); - default -> HPyDummyToJavaNode.getUncached(); - }; - } - return argNodes; - } - } - - @ExportLibrary(InteropLibrary.class) - static final class HPyExecuteWrapper implements TruffleObject { - final HPyContextMember member; - - HPyExecuteWrapper(HPyContextMember member) { - this.member = member; - } - - @ExportMessage - boolean isExecutable() { - return true; - } - - @ExportMessage - Object execute(Object[] arguments, - @Bind("$node") Node inliningTarget, - @Cached HPyExecuteContextFunction call) throws ArityException { - return call.execute(inliningTarget, member, arguments); - } - } - - @ExportLibrary(InteropLibrary.class) - static final class HPyExecuteWrapperTraceUpcall implements TruffleObject { - - private final int[] counts; - private final int index; - - final HPyExecuteWrapper delegate; - - public HPyExecuteWrapperTraceUpcall(int[] counts, int index, HPyExecuteWrapper delegate) { - this.counts = counts; - this.index = index; - this.delegate = delegate; - } - - @ExportMessage - boolean isExecutable() { - return true; - } - - @ExportMessage - Object execute(Object[] arguments, - @CachedLibrary("this.delegate") InteropLibrary lib) throws UnsupportedMessageException, UnsupportedTypeException, ArityException { - counts[index]++; - return lib.execute(delegate, arguments); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/llvm/GraalHPyLLVMNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/llvm/GraalHPyLLVMNodes.java deleted file mode 100644 index f48b29dcc6..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/llvm/GraalHPyLLVMNodes.java +++ /dev/null @@ -1,914 +0,0 @@ -/* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy.llvm; - -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNativeSymbol.GRAAL_HPY_WRITE_D; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNativeSymbol.GRAAL_HPY_WRITE_HPY; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNativeSymbol.GRAAL_HPY_WRITE_HPY_SSIZE_T; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNativeSymbol.GRAAL_HPY_WRITE_I32; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNativeSymbol.GRAAL_HPY_WRITE_I64; -import static com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNativeSymbol.GRAAL_HPY_WRITE_PTR; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; - -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.cext.capi.PySequenceArrayWrapper; -import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CArrayWrapper; -import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CByteArrayWrapper; -import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CStringWrapper; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.EnsureTruffleStringNode; -import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.GetByteArrayNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.AllocateNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.BulkFreeHandleReferencesNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.FreeNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.GetElementPtrNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.IsNullNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadDoubleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadFloatNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadGenericNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadHPyArrayNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadHPyFieldNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadHPyNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadI32Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadI64Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadI8ArrayNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.ReadPointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteDoubleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteGenericNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteHPyFieldNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteHPyNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteI32Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteI64Node; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WritePointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyCAccess.WriteSizeTNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.GraalHPyHandleReference; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyHandle; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNativeSymbol; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyAsCharPointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyAsHandleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyAsPythonObjectNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyCloseAndGetHandleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyFieldLoadNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyFieldStoreNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyFromCharPointerNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyContextSignatureType; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.HPyLLVMCallHelperFunctionNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.GraalHPyLLVMNodesFactory.LLVMAllocateNodeGen; -import com.oracle.graal.python.builtins.objects.cext.hpy.llvm.HPyArrayWrappers.HPyArrayWrapper; -import com.oracle.graal.python.builtins.objects.ints.PInt; -import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.util.OverflowException; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.GenerateCached; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.interop.ArityException; -import com.oracle.truffle.api.interop.InteropException; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.InvalidArrayIndexException; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.interop.UnsupportedTypeException; -import com.oracle.truffle.api.library.CachedLibrary; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; -import com.oracle.truffle.api.profiles.InlinedExactClassProfile; -import com.oracle.truffle.api.strings.InternalByteArray; -import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.api.strings.TruffleString.Encoding; - -import sun.misc.Unsafe; - -abstract class GraalHPyLLVMNodes { - - private GraalHPyLLVMNodes() { - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMIsNullNode extends IsNullNode { - @Specialization(limit = "2") - static boolean doGeneric(@SuppressWarnings("unused") GraalHPyContext hpyContext, Object pointer, - @CachedLibrary("pointer") InteropLibrary lib) { - return lib.isNull(pointer); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class LLVMAllocateNode extends AllocateNode { - - @Specialization - static Object doGeneric(GraalHPyContext ctx, long size, @SuppressWarnings("unused") boolean zero, - @Bind("this") Node inliningTarget, - @Cached HPyLLVMCallHelperFunctionNode callHelperNode) { - return callHelperNode.call(inliningTarget, ctx, GraalHPyNativeSymbol.GRAAL_HPY_CALLOC, size, 1L); - } - - static LLVMAllocateNode create() { - return LLVMAllocateNodeGen.create(); - } - - static LLVMAllocateNode getUncached() { - return LLVMAllocateNodeGen.getUncached(); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMFreeNode extends FreeNode { - - @Specialization - static void doGeneric(GraalHPyContext ctx, Object pointer, - @Bind("this") Node inliningTarget, - @Cached HPyLLVMCallHelperFunctionNode callHelperNode) { - callHelperNode.call(inliningTarget, ctx, GraalHPyNativeSymbol.GRAAL_HPY_FREE, pointer); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMBulkFreeHandleReferencesNode extends BulkFreeHandleReferencesNode { - - @Specialization - static void doGeneric(GraalHPyContext ctx, GraalHPyHandleReference[] references, - @Bind("this") Node inliningTarget, - @Cached HPyLLVMCallHelperFunctionNode callHelperNode) { - NativeSpaceArrayWrapper nativeSpaceArrayWrapper = new NativeSpaceArrayWrapper(references); - callHelperNode.call(inliningTarget, ctx, GraalHPyNativeSymbol.GRAAL_HPY_BULK_FREE, nativeSpaceArrayWrapper); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMGetElementPtrNode extends GetElementPtrNode { - - @Specialization - static Object doGeneric(GraalHPyContext ctx, Object pointer, long offset, - @Bind("this") Node inliningTarget, - @Cached HPyLLVMCallHelperFunctionNode callHelperNode) { - return callHelperNode.call(inliningTarget, ctx, GraalHPyNativeSymbol.GRAAL_HPY_GET_ELEMENT_PTR, pointer, offset); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class LLVMReadI8ArrayNode extends ReadI8ArrayNode { - - @Specialization(limit = "1") - static byte[] doGeneric(GraalHPyContext ctx, Object pointer, long offset, long n, - @Bind("this") Node inliningTarget, - @CachedLibrary("pointer") InteropLibrary interopLib, - @Cached GetByteArrayNode getByteArrayNode, - @Cached HPyLLVMCallHelperFunctionNode callHPyFunction) { - if (!PInt.isIntRange(n)) { - throw CompilerDirectives.shouldNotReachHere("cannot fit long into int"); - } - Object typedPointer; - if (!interopLib.hasArrayElements(pointer)) { - typedPointer = callHPyFunction.call(inliningTarget, ctx, GraalHPyNativeSymbol.GRAAL_HPY_FROM_I8_ARRAY, pointer, n); - } else { - typedPointer = pointer; - } - try { - return getByteArrayNode.execute(inliningTarget, typedPointer, n); - } catch (OverflowException | InteropException ex) { - throw CompilerDirectives.shouldNotReachHere(ex); - } - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMReadHPyNode extends ReadHPyNode { - - @Specialization(guards = "!close") - static Object doGet(GraalHPyContext ctx, Object pointer, long offset, @SuppressWarnings("unused") boolean close, - @Bind("this") Node inliningTarget, - @Exclusive @Cached HPyLLVMCallHelperFunctionNode callHelperNode, - @Exclusive @Cached HPyAsPythonObjectNode asPythonObjectNode) { - Object nativeValue = callHelperNode.call(inliningTarget, ctx, GraalHPyNativeSymbol.GRAAL_HPY_READ_HPY, pointer, offset); - return asPythonObjectNode.execute(nativeValue); - } - - @Specialization(guards = "close") - static Object doClose(GraalHPyContext ctx, Object pointer, long offset, @SuppressWarnings("unused") boolean close, - @Bind("this") Node inliningTarget, - @Exclusive @Cached HPyLLVMCallHelperFunctionNode callHelperNode, - @Exclusive @Cached HPyCloseAndGetHandleNode closeAndGetHandleNode) { - Object nativeValue = callHelperNode.call(inliningTarget, ctx, GraalHPyNativeSymbol.GRAAL_HPY_READ_HPY, pointer, offset); - return closeAndGetHandleNode.execute(inliningTarget, nativeValue); - } - - @Specialization(replaces = {"doGet", "doClose"}) - static Object doGeneric(GraalHPyContext ctx, Object pointer, long offset, @SuppressWarnings("unused") boolean close, - @Bind("this") Node inliningTarget, - @Exclusive @Cached HPyLLVMCallHelperFunctionNode callHelperNode, - @Exclusive @Cached HPyAsPythonObjectNode asPythonObjectNode, - @Exclusive @Cached HPyCloseAndGetHandleNode closeAndGetHandleNode) { - Object nativeValue = callHelperNode.call(inliningTarget, ctx, GraalHPyNativeSymbol.GRAAL_HPY_READ_HPY, pointer, offset); - if (close) { - return closeAndGetHandleNode.execute(inliningTarget, nativeValue); - } - return asPythonObjectNode.execute(nativeValue); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMReadHPyFieldNode extends ReadHPyFieldNode { - - @Specialization - static Object doGeneric(GraalHPyContext ctx, PythonObject owner, Object pointer, long offset, @SuppressWarnings("unused") boolean close, - @Bind("this") Node inliningTarget, - @Cached HPyLLVMCallHelperFunctionNode callHelperNode, - @Cached HPyFieldLoadNode hpyFieldLoadNode) { - Object nativeValue = callHelperNode.call(inliningTarget, ctx, GraalHPyNativeSymbol.GRAAL_HPY_READ_HPYFIELD, pointer, offset); - return hpyFieldLoadNode.execute(inliningTarget, owner, nativeValue); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMReadHPyArrayNode extends ReadHPyArrayNode { - - @Specialization - static Object[] doHPyArrayWrapper(@SuppressWarnings("unused") GraalHPyContext ctx, HPyArrayWrapper pointer, long loffset, long ln, - @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile profile) { - int n = ensureIntRange(ln); - int offset = ensureIntRange(loffset); - Object[] delegate = pointer.getDelegate(); - if (profile.profile(inliningTarget, offset == 0 && delegate.length == n)) { - return delegate; - } - return PythonUtils.arrayCopyOfRange(delegate, offset, offset + n); - } - - @Specialization - static Object[] doPointer(GraalHPyContext ctx, Object pointer, long offset, long ln, - @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "1") InteropLibrary arrayLib, - @Cached HPyLLVMCallHelperFunctionNode callHelperNode, - @Cached HPyAsPythonObjectNode asPythonObjectNode) { - int n = ensureIntRange(ln); - Object typedArrayPtr = callHelperNode.call(inliningTarget, ctx, GraalHPyNativeSymbol.GRAAL_HPY_FROM_HPY_ARRAY, pointer, offset + ln); - if (!arrayLib.hasArrayElements(typedArrayPtr)) { - throw CompilerDirectives.shouldNotReachHere("returned pointer object must have array type"); - } - - Object[] elements = new Object[n]; - try { - for (int i = 0; i < elements.length; i++) { - /* - * This will read an element of a 'VoidPtr arr[]' and the returned value will be - * 'void *'. So, there is no need to read any further element (in particular - * "_i") to get the internal handle value. - */ - Object element = arrayLib.readArrayElement(typedArrayPtr, offset + i); - elements[i] = asPythonObjectNode.execute(element); - } - return elements; - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } catch (InvalidArrayIndexException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(arrayLib, SystemError, ErrorMessages.CANNOT_ACCESS_IDX, e.getInvalidIndex(), n); - } - } - - private static int ensureIntRange(long n) { - if (PInt.isIntRange(n)) { - return (int) n; - } - throw CompilerDirectives.shouldNotReachHere("cannot fit long into int"); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMReadI32Node extends ReadI32Node { - - @Specialization - static int doGeneric(GraalHPyContext ctx, Object pointer, long offset, - @Bind("this") Node inliningTarget, - @Cached HPyLLVMCallHelperFunctionNode callHelperFunction, - @CachedLibrary(limit = "1") InteropLibrary lib) { - - Object nativeValue = callHelperFunction.call(inliningTarget, ctx, GraalHPyNativeSymbol.GRAAL_HPY_READ_I32, pointer, offset); - if (nativeValue instanceof Integer) { - return (int) nativeValue; - } - if (lib.fitsInInt(nativeValue)) { - try { - return lib.asInt(nativeValue); - } catch (UnsupportedMessageException e) { - // fall through - } - } - throw CompilerDirectives.shouldNotReachHere(); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMReadI64Node extends ReadI64Node { - - @Specialization - static long doGeneric(GraalHPyContext ctx, Object pointer, long offset, - @Bind("this") Node inliningTarget, - @Cached HPyLLVMCallHelperFunctionNode callHelperFunction, - @CachedLibrary(limit = "1") InteropLibrary lib) { - - Object nativeValue = callHelperFunction.call(inliningTarget, ctx, GraalHPyNativeSymbol.GRAAL_HPY_READ_I64, pointer, offset); - if (nativeValue instanceof Long) { - return (long) nativeValue; - } - if (lib.fitsInLong(nativeValue)) { - try { - return lib.asLong(nativeValue); - } catch (UnsupportedMessageException e) { - // fall through - } - } - throw CompilerDirectives.shouldNotReachHere(); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMReadFloatNode extends ReadFloatNode { - - @Specialization - static double doGeneric(GraalHPyContext ctx, Object pointer, long offset, - @Bind("this") Node inliningTarget, - @Cached HPyLLVMCallHelperFunctionNode callHelperFunction, - @CachedLibrary(limit = "1") InteropLibrary lib) { - - // note: C function 'graal_hpy_read_f' already returns a C double - Object nativeValue = callHelperFunction.call(inliningTarget, ctx, GraalHPyNativeSymbol.GRAAL_HPY_READ_F, pointer, offset); - if (nativeValue instanceof Double d) { - return d; - } - if (lib.fitsInDouble(nativeValue)) { - try { - return lib.asDouble(nativeValue); - } catch (UnsupportedMessageException e) { - // fall through - } - } - throw CompilerDirectives.shouldNotReachHere(); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMReadDoubleNode extends ReadDoubleNode { - - @Specialization - static double doGeneric(GraalHPyContext ctx, Object pointer, long offset, - @Bind("this") Node inliningTarget, - @Cached HPyLLVMCallHelperFunctionNode callHelperFunction, - @CachedLibrary(limit = "1") InteropLibrary lib) { - - Object nativeValue = callHelperFunction.call(inliningTarget, ctx, GraalHPyNativeSymbol.GRAAL_HPY_READ_D, pointer, offset); - if (nativeValue instanceof Double d) { - return d; - } - if (lib.fitsInDouble(nativeValue)) { - try { - return lib.asDouble(nativeValue); - } catch (UnsupportedMessageException e) { - // fall through - } - } - throw CompilerDirectives.shouldNotReachHere(); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMReadPointerNode extends ReadPointerNode { - - @Specialization - static Object doGeneric(GraalHPyContext ctx, Object pointer, long offset, - @Bind("this") Node inliningTarget, - @Cached HPyLLVMCallHelperFunctionNode callHelperFunction) { - return callHelperFunction.call(inliningTarget, ctx, GraalHPyNativeSymbol.GRAAL_HPY_READ_PTR, pointer, offset); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMReadGenericNode extends ReadGenericNode { - - @Override - protected final int executeInt(GraalHPyContext ctx, Object pointer, long offset, HPyContextSignatureType size) { - Object object = execute(ctx, pointer, offset, size); - if (object instanceof Integer i) { - return i; - } else if (object instanceof Long l) { - return (int) (long) l; - } - return numberAsInt((Number) object); - } - - @Override - protected final long executeLong(GraalHPyContext ctx, Object pointer, long offset, HPyContextSignatureType size) { - Object object = execute(ctx, pointer, offset, size); - if (object instanceof Integer i) { - return (int) i; - } else if (object instanceof Long l) { - return l; - } - return numberAsLong((Number) object); - } - - @Specialization - static Object doGeneric(GraalHPyContext ctx, Object pointer, long offset, HPyContextSignatureType ctype, - @Bind("this") Node inliningTarget, - @Cached HPyLLVMCallHelperFunctionNode callHelperFunction) { - return callHelperFunction.call(inliningTarget, ctx, getReadAccessorName(ctx, ctype), pointer, offset); - } - - static GraalHPyNativeSymbol getReadAccessorName(GraalHPyContext ctx, HPyContextSignatureType type) { - switch (type) { - case Int8_t: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_I8; - case Uint8_t: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_UI8; - case Int16_t: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_I16; - case Uint16_t: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_UI16; - case Int32_t: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_I32; - case Uint32_t: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_UI32; - case Int64_t: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_I64; - case Uint64_t: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_UI64; - case Int: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_I; - case Long: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_L; - case CFloat: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_F; - case CDouble: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_D; - case HPyContextPtr, VoidPtr, VoidPtrPtr, HPyPtr, ConstHPyPtr, Wchar_tPtr, ConstWchar_tPtr, CharPtr: - case ConstCharPtr, DataPtr, DataPtrPtr, Cpy_PyObjectPtr, HPyModuleDefPtr, HPyType_SpecPtr: - case HPyType_SpecParamPtr, HPyDefPtr, HPyFieldPtr, HPyGlobalPtr, HPyCapsule_DestructorPtr, PyType_SlotPtr: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_PTR; - case Bool: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_BOOL; - case UnsignedInt: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_UI; - case UnsignedLong: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_UL; - case HPy_ssize_t: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_HPY_SSIZE_T; - } - int size = ctx.getCTypeSize(type); - switch (size) { - case 1: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_I8; - case 2: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_I16; - case 4: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_I32; - case 8: - return GraalHPyNativeSymbol.GRAAL_HPY_READ_I64; - } - throw CompilerDirectives.shouldNotReachHere("invalid member type"); - } - - @TruffleBoundary - private int numberAsInt(Number number) { - return number.intValue(); - } - - @TruffleBoundary - private long numberAsLong(Number number) { - return number.longValue(); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMWriteI32Node extends WriteI32Node { - - @Specialization - static void doGeneric(GraalHPyContext ctx, Object basePointer, long offset, int value, - @Bind("this") Node inliningTarget, - @Cached HPyLLVMCallHelperFunctionNode callHelperFunction) { - callHelperFunction.call(inliningTarget, ctx, GRAAL_HPY_WRITE_I32, basePointer, offset, value); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMWriteI64Node extends WriteI64Node { - - @Specialization - static void doGeneric(GraalHPyContext ctx, Object basePointer, long offset, long value, - @Bind("this") Node inliningTarget, - @Cached HPyLLVMCallHelperFunctionNode callHelperFunction) { - callHelperFunction.call(inliningTarget, ctx, GRAAL_HPY_WRITE_I64, basePointer, offset, value); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMWriteSizeTNode extends WriteSizeTNode { - - @Specialization - static void doGeneric(GraalHPyContext ctx, Object basePointer, long offset, long value, - @Bind("this") Node inliningTarget, - @Cached HPyLLVMCallHelperFunctionNode callHelperFunction) { - callHelperFunction.call(inliningTarget, ctx, GRAAL_HPY_WRITE_HPY_SSIZE_T, basePointer, offset, value); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMWriteDoubleNode extends WriteDoubleNode { - - @Specialization - static void doGeneric(GraalHPyContext ctx, Object basePointer, long offset, double value, - @Bind("this") Node inliningTarget, - @Cached HPyLLVMCallHelperFunctionNode callHelperFunction) { - callHelperFunction.call(inliningTarget, ctx, GRAAL_HPY_WRITE_D, basePointer, offset, value); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMWriteGenericNode extends WriteGenericNode { - - @Specialization(guards = {"type == cachedType"}, limit = "1") - static void doCached(GraalHPyContext ctx, Object pointer, long offset, @SuppressWarnings("unused") HPyContextSignatureType type, Object value, - @Bind("this") Node inliningTarget, - @Cached("type") HPyContextSignatureType cachedType, - @Exclusive @Cached HPyLLVMCallHelperFunctionNode callHelperFunction) { - callHelperFunction.call(inliningTarget, ctx, getWriteAccessor(ctx, cachedType), pointer, offset, value); - } - - @Specialization(replaces = "doCached") - static void doGeneric(GraalHPyContext ctx, Object pointer, long offset, HPyContextSignatureType type, Object value, - @Bind("this") Node inliningTarget, - @Exclusive @Cached HPyLLVMCallHelperFunctionNode callHelperFunction) { - callHelperFunction.call(inliningTarget, ctx, getWriteAccessor(ctx, type), pointer, offset, value); - } - - static GraalHPyNativeSymbol getWriteAccessor(GraalHPyContext ctx, HPyContextSignatureType type) { - switch (type) { - case Int8_t: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_I8; - case Uint8_t: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_UI8; - case Int16_t: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_I16; - case Uint16_t: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_UI16; - case Int32_t: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_I32; - case Uint32_t: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_UI32; - case Int64_t: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_I64; - case Uint64_t: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_UI64; - case Int: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_I; - case Long: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_L; - case CFloat: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_F; - case CDouble: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_D; - case HPyContextPtr, VoidPtr, VoidPtrPtr, HPyPtr, ConstHPyPtr, Wchar_tPtr, ConstWchar_tPtr, CharPtr: - case ConstCharPtr, DataPtr, DataPtrPtr, Cpy_PyObjectPtr, HPyModuleDefPtr, HPyType_SpecPtr: - case HPyType_SpecParamPtr, HPyDefPtr, HPyFieldPtr, HPyGlobalPtr, HPyCapsule_DestructorPtr, PyType_SlotPtr: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_PTR; - case Bool: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_BOOL; - case UnsignedInt: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_UI; - case UnsignedLong: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_UL; - case HPy_ssize_t: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_HPY_SSIZE_T; - } - int size = ctx.getCTypeSize(type); - switch (size) { - case 1: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_I8; - case 2: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_I16; - case 4: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_I32; - case 8: - return GraalHPyNativeSymbol.GRAAL_HPY_WRITE_I64; - } - throw CompilerDirectives.shouldNotReachHere("invalid member type"); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMWriteHPyNode extends WriteHPyNode { - - @Specialization - static void doGeneric(GraalHPyContext ctx, Object basePointer, long offset, Object object, - @Bind("this") Node inliningTarget, - @Cached HPyAsHandleNode asHandleNode, - @Cached HPyLLVMCallHelperFunctionNode callWriteDataNode) { - callWriteDataNode.call(inliningTarget, ctx, GRAAL_HPY_WRITE_HPY, basePointer, offset, asHandleNode.execute(object)); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMWriteHPyFieldNode extends WriteHPyFieldNode { - - @Specialization - static void doGeneric(GraalHPyContext ctx, PythonObject owner, Object pointer, long offset, Object referent, - @Bind("this") Node inliningTarget, - @Cached HPyFieldStoreNode fieldStoreNode, - @Cached HPyAsHandleNode asHandleNode, - @Cached HPyLLVMCallHelperFunctionNode callGetElementPtr, - @Cached HPyLLVMCallHelperFunctionNode callHelperFunctionNode) { - Object hpyFieldPtr = HPyLLVMGetElementPtrNode.doGeneric(ctx, pointer, offset, inliningTarget, callGetElementPtr); - Object hpyFieldObject = callHelperFunctionNode.call(inliningTarget, ctx, GraalHPyNativeSymbol.GRAAL_HPY_GET_FIELD_I, hpyFieldPtr); - int idx = fieldStoreNode.execute(inliningTarget, owner, hpyFieldObject, referent); - GraalHPyHandle newHandle = asHandleNode.executeField(referent, idx); - callHelperFunctionNode.call(inliningTarget, ctx, GraalHPyNativeSymbol.GRAAL_HPY_SET_FIELD_I, hpyFieldPtr, newHandle); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMWritePointerNode extends WritePointerNode { - - @Specialization - static void doGeneric(GraalHPyContext ctx, Object basePointer, long offset, Object valuePointer, - @Bind("this") Node inliningTarget, - @Cached HPyLLVMCallHelperFunctionNode callWriteDataNode) { - callWriteDataNode.call(inliningTarget, ctx, GRAAL_HPY_WRITE_PTR, basePointer, offset, valuePointer); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMFromCharPointerNode extends HPyFromCharPointerNode { - - @Specialization - @SuppressWarnings("unused") - static TruffleString doCStringWrapper(GraalHPyContext hpyContext, CStringWrapper cStringWrapper, int n, Encoding encoding, boolean copy) { - return cStringWrapper.getString(); - } - - @Specialization - static TruffleString doCByteArrayWrapper(@SuppressWarnings("unused") GraalHPyContext hpyContext, CByteArrayWrapper cByteArrayWrapper, int n, Encoding encoding, boolean copy, - @Shared @Cached TruffleString.FromByteArrayNode fromByteArrayNode, - @Shared @Cached TruffleString.SwitchEncodingNode switchEncodingNode) { - CompilerAsserts.partialEvaluationConstant(encoding); - CompilerAsserts.partialEvaluationConstant(copy); - byte[] byteArray = cByteArrayWrapper.getByteArray(); - int length = n < 0 ? byteArray.length : n; - return switchEncodingNode.execute(fromByteArrayNode.execute(byteArray, 0, length, encoding, copy), TS_ENCODING); - } - - @Specialization(guards = {"!isCArrayWrapper(charPtr)", "isPointer(lib, charPtr)"}) - static TruffleString doPointer(GraalHPyContext hpyContext, Object charPtr, int n, Encoding encoding, boolean copy, - @Shared @CachedLibrary(limit = "2") InteropLibrary lib, - @Cached TruffleString.FromNativePointerNode fromNative, - @Shared @Cached TruffleString.SwitchEncodingNode switchEncodingNode) { - CompilerAsserts.partialEvaluationConstant(encoding); - CompilerAsserts.partialEvaluationConstant(copy); - long pointer; - try { - pointer = lib.asPointer(charPtr); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - int length; - if (n < 0) { - length = 0; - /* - * We use 'PythonContext.getUnsafe()' here to ensure that native access is allowed - * because this specialization can be reached if 'charPtr' is not a CArrayWrapper - * but a pointer. An attacker could create a TruffleObject that answers - * 'isPointer()' with 'true' (but isn't really a native pointer). - */ - Unsafe unsafe = hpyContext.getContext().getUnsafe(); - while (unsafe.getByte(pointer + length) != 0) { - length++; - } - } else { - length = n; - } - return switchEncodingNode.execute(fromNative.execute(charPtr, 0, length, encoding, copy), TS_ENCODING); - } - - @Specialization(guards = {"!isCArrayWrapper(charPtr)", "!isPointer(lib, charPtr)"}) - static TruffleString doForeignArray(@SuppressWarnings("unused") GraalHPyContext hpyContext, Object charPtr, int n, Encoding encoding, @SuppressWarnings("unused") boolean copy, - @Shared @CachedLibrary(limit = "2") InteropLibrary lib, - @CachedLibrary(limit = "1") InteropLibrary elementLib, - @Bind("this") Node inliningTarget, - @Cached GraalHPyLLVMCallHelperFunctionNode callHelperFunctionNode, - @Cached GetByteArrayNode getByteArrayNode, - @Shared @Cached TruffleString.FromByteArrayNode fromByteArrayNode, - @Shared @Cached TruffleString.SwitchEncodingNode switchEncodingNode) { - CompilerAsserts.partialEvaluationConstant(encoding); - CompilerAsserts.partialEvaluationConstant(copy); - - Object typedCharPtr; - int length; - try { - if (!lib.hasArrayElements(charPtr)) { - /* - * If the foreign object does not have array elements, we assume it is an LLVM - * pointer where we can attach a type. We use size 'n' if available, otherwise - * we determine the size by looking for the zero-byte. - */ - int size = n < 0 ? Integer.MAX_VALUE : n; - typedCharPtr = callHelperFunctionNode.call(hpyContext, GraalHPyNativeSymbol.GRAAL_HPY_FROM_I8_ARRAY, charPtr, size); - if (n < 0) { - length = 0; - while (elementLib.asByte(lib.readArrayElement(typedCharPtr, length)) != 0) { - length++; - } - } else { - length = n; - } - } else { - /* - * Simple case: the foreign object has array elements, so just use the array - * size and read the elements. - */ - typedCharPtr = charPtr; - length = n < 0 ? PInt.intValueExact(lib.getArraySize(charPtr)) : n; - } - assert lib.hasArrayElements(typedCharPtr); - assert length >= 0; - byte[] bytes = getByteArrayNode.execute(inliningTarget, typedCharPtr, length); - // since we created a fresh byte array, we don't need to copy it - return switchEncodingNode.execute(fromByteArrayNode.execute(bytes, 0, bytes.length, encoding, false), TS_ENCODING); - } catch (InteropException | OverflowException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - } - - static boolean isCArrayWrapper(Object object) { - return object instanceof CArrayWrapper || object instanceof PySequenceArrayWrapper; - } - - static boolean isPointer(InteropLibrary lib, Object object) { - return lib.isPointer(object); - } - } - - @GenerateUncached - @GenerateInline(false) - abstract static class HPyLLVMAsCharPointerNode extends HPyAsCharPointerNode { - - @Specialization(guards = "isNativeAccessAllowed(hpyContext)") - static Object doNative(GraalHPyContext hpyContext, TruffleString string, Encoding encoding, - @Bind("this") Node inliningTarget, - @Exclusive @Cached HPyLLVMCallHelperFunctionNode callHelperNode, - @Exclusive @Cached TruffleString.SwitchEncodingNode switchEncodingNode, - @Exclusive @Cached TruffleString.AsNativeNode asNativeNode, - @Exclusive @Cached TruffleString.GetInternalNativePointerNode getInternalNativePointerNode) { - TruffleString tsEncoded = switchEncodingNode.execute(string, encoding); - TruffleString tsNative = asNativeNode.execute(tsEncoded, byteSize -> callHelperNode.call(inliningTarget, hpyContext, GraalHPyNativeSymbol.GRAAL_HPY_CALLOC, byteSize, 1L), encoding, - false, true); - return getInternalNativePointerNode.execute(tsNative, encoding); - } - - @Specialization(replaces = "doNative") - static Object doGeneric(@SuppressWarnings("unused") GraalHPyContext hpyContext, TruffleString string, Encoding encoding, - @Exclusive @Cached TruffleString.SwitchEncodingNode switchEncodingNode, - @Exclusive @Cached TruffleString.GetInternalByteArrayNode getInternalByteArrayNode) { - TruffleString tsEncoded = switchEncodingNode.execute(string, encoding); - InternalByteArray internalByteArray = getInternalByteArrayNode.execute(tsEncoded, encoding); - return new CByteArrayWrapper(internalByteArray.getArray()); - - } - - static boolean isNativeAccessAllowed(GraalHPyContext hpyContext) { - return hpyContext.getContext().isNativeAccessAllowed(); - } - } - - @GenerateUncached - @GenerateInline - @GenerateCached(false) - public abstract static class HPyLLVMImportSymbolNode extends PNodeWithContext { - - public abstract Object execute(Node inliningTarget, GraalHPyContext hpyContext, GraalHPyNativeSymbol symbol); - - @Specialization(guards = {"isSingleContext()", "cachedSymbol == symbol"}, limit = "1") - static Object doSymbolCached(@SuppressWarnings("unused") GraalHPyContext nativeContext, @SuppressWarnings("unused") GraalHPyNativeSymbol symbol, - @SuppressWarnings("unused") @Cached("symbol") GraalHPyNativeSymbol cachedSymbol, - @Cached("getLLVMSymbol(nativeContext, symbol)") Object llvmSymbol) { - return llvmSymbol; - } - - @Specialization(replaces = "doSymbolCached") - static Object doGeneric(Node inliningTarget, GraalHPyContext hpyContext, GraalHPyNativeSymbol symbol, - @Cached InlinedExactClassProfile exactClassProfile) { - return getLLVMSymbol(exactClassProfile.profile(inliningTarget, hpyContext), symbol); - } - - static Object getLLVMSymbol(GraalHPyContext hpyContext, GraalHPyNativeSymbol symbol) { - if (hpyContext.getBackend() instanceof GraalHPyLLVMContext hpyLLVMContext) { - return hpyLLVMContext.getNativeSymbolCache()[symbol.ordinal()]; - } - throw CompilerDirectives.shouldNotReachHere(); - } - } - - @GenerateUncached - @GenerateInline - @GenerateCached(false) - public abstract static class HPyLLVMCallHelperFunctionNode extends PNodeWithContext { - - public static Object callUncached(GraalHPyContext context, GraalHPyNativeSymbol name, Object... args) { - return HPyLLVMCallHelperFunctionNodeGen.getUncached().execute(null, context, name, args); - } - - public final Object call(Node inliningTarget, GraalHPyContext context, GraalHPyNativeSymbol name, Object... args) { - return execute(inliningTarget, context, name, args); - } - - public abstract Object execute(Node inliningTarget, GraalHPyContext context, GraalHPyNativeSymbol name, Object[] args); - - @Specialization - static Object doIt(Node inliningTarget, GraalHPyContext context, GraalHPyNativeSymbol name, Object[] args, - @CachedLibrary(limit = "1") InteropLibrary interopLibrary, - @Cached HPyLLVMImportSymbolNode importCExtSymbolNode, - @Cached EnsureTruffleStringNode ensureTruffleStringNode, - @Cached PRaiseNode.Lazy raiseNode) { - try { - Object llvmFunction = importCExtSymbolNode.execute(inliningTarget, context, name); - return ensureTruffleStringNode.execute(inliningTarget, interopLibrary.execute(llvmFunction, args)); - } catch (UnsupportedTypeException | ArityException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, e); - } catch (UnsupportedMessageException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.HPY_CAPI_SYM_NOT_CALLABLE, name); - } - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/llvm/HPyArrayWrappers.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/llvm/HPyArrayWrappers.java deleted file mode 100644 index 6fb73174d7..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/llvm/HPyArrayWrappers.java +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy.llvm; - -import java.util.Arrays; - -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyHandle; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyAsHandleNode; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyCloseHandleNode; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.GenerateCached; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.InvalidArrayIndexException; -import com.oracle.truffle.api.interop.TruffleObject; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.interop.UnsupportedTypeException; -import com.oracle.truffle.api.library.CachedLibrary; -import com.oracle.truffle.api.library.ExportLibrary; -import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.ExplodeLoop; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.ConditionProfile; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; -import com.oracle.truffle.llvm.spi.NativeTypeLibrary; - -abstract class HPyArrayWrappers { - - /** - * Wraps a sequence object (like a list) such that it behaves like a {@code HPy} array (C type - * {@code HPy *}). - */ - @ExportLibrary(InteropLibrary.class) - @ExportLibrary(value = NativeTypeLibrary.class, useForAOT = false) - static final class HPyArrayWrapper implements TruffleObject { - - private static final int UNINITIALIZED = 0; - private static final int INVALIDATED = -1; - - final GraalHPyContext hpyContext; - - final Object[] delegate; - - private final GraalHPyHandle[] wrappers; - private long nativePointer = UNINITIALIZED; - - public HPyArrayWrapper(GraalHPyContext hpyContext, Object[] delegate) { - this.hpyContext = hpyContext; - this.delegate = delegate; - this.wrappers = new GraalHPyHandle[delegate.length]; - } - - public Object[] getDelegate() { - return delegate; - } - - void setNativePointer(long nativePointer) { - assert nativePointer != UNINITIALIZED; - this.nativePointer = nativePointer; - } - - long getNativePointer() { - return this.nativePointer; - } - - @Override - public int hashCode() { - CompilerAsserts.neverPartOfCompilation(); - final int prime = 31; - int result = 1; - result = prime * result + Arrays.hashCode(delegate); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - // n.b.: (tfel) This is hopefully fine here, since if we get to this - // code path, we don't speculate that either of those objects is - // constant anymore, so any caching on them won't happen anyway - return delegate == ((HPyArrayWrapper) obj).delegate; - } - - @SuppressWarnings("static-method") - @ExportMessage - boolean hasArrayElements() { - return true; - } - - @ExportMessage - long getArraySize() { - return delegate.length; - } - - @ExportMessage - boolean isArrayElementReadable(long index) { - return 0 <= index && index < delegate.length; - } - - @ExportMessage - Object readArrayElement(long index, - @Cached HPyAsHandleNode asHandleNode) throws InvalidArrayIndexException { - if (index < 0 || index > delegate.length) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw InvalidArrayIndexException.create(index); - } - int i = (int) index; - GraalHPyHandle wrapper = wrappers[i]; - if (wrapper == null) { - wrapper = asHandleNode.execute(delegate[i]); - wrappers[i] = wrapper; - } - return wrapper; - } - - @ExportMessage - boolean isPointer() { - return nativePointer != UNINITIALIZED; - } - - @ExportMessage - long asPointer() throws UnsupportedMessageException { - if (!isPointer()) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw UnsupportedMessageException.create(); - } - return nativePointer; - } - - @ExportMessage - void toNative() { - if (!isPointer()) { - setNativePointer(hpyContext.createNativeArguments(delegate)); - } - } - - @ExportMessage - @SuppressWarnings("static-method") - boolean hasNativeType() { - return hpyContext.getBackend() instanceof GraalHPyLLVMContext; - } - - @ExportMessage - Object getNativeType() { - if (hpyContext.getBackend() instanceof GraalHPyLLVMContext llvmContext) { - return llvmContext.getHPyArrayNativeType(); - } - throw CompilerDirectives.shouldNotReachHere(); - } - - void close() { - for (int i = 0; i < wrappers.length; i++) { - if (wrappers[i] != null) { - HPyCloseHandleNode.executeUncached(wrappers[i]); - wrappers[i] = null; - } - } - if (isPointer()) { - hpyContext.freeNativeArgumentsArray(delegate.length); - } - } - } - - @GenerateInline - @GenerateCached(false) - @ImportStatic(PythonUtils.class) - abstract static class HPyCloseArrayWrapperNode extends Node { - - public abstract void execute(Node inliningTarget, HPyArrayWrapper wrapper); - - @Specialization(guards = {"cachedLen == wrapper.delegate.length", "cachedLen <= 8"}, limit = "1") - @ExplodeLoop - static void doCachedLen(Node inliningTarget, HPyArrayWrapper wrapper, - @Cached("wrapper.delegate.length") int cachedLen, - @Exclusive @Cached HPyCloseHandleNode closeHandleNode, - @Cached(value = "createConditionProfiles(cachedLen)", dimensions = 1) ConditionProfile[] profiles, - @Exclusive @Cached InlinedConditionProfile isPointerProfile) { - for (int i = 0; i < cachedLen; i++) { - Object element = wrapper.delegate[i]; - if (profiles[i].profile(element instanceof GraalHPyHandle)) { - closeHandleNode.execute(inliningTarget, element); - } - } - if (isPointerProfile.profile(inliningTarget, wrapper.isPointer())) { - wrapper.hpyContext.freeNativeArgumentsArray(wrapper.delegate.length); - wrapper.setNativePointer(HPyArrayWrapper.INVALIDATED); - } - } - - @Specialization(replaces = "doCachedLen") - static void doLoop(Node inliningTarget, HPyArrayWrapper wrapper, - @Exclusive @Cached HPyCloseHandleNode closeHandleNode, - @Exclusive @Cached InlinedConditionProfile profile, - @Exclusive @Cached InlinedConditionProfile isPointerProfile) { - int n = wrapper.delegate.length; - for (int i = 0; i < n; i++) { - Object element = wrapper.delegate[i]; - if (profile.profile(inliningTarget, element instanceof GraalHPyHandle)) { - closeHandleNode.execute(inliningTarget, element); - } - } - if (isPointerProfile.profile(inliningTarget, wrapper.isPointer())) { - wrapper.hpyContext.freeNativeArgumentsArray(wrapper.delegate.length); - wrapper.setNativePointer(HPyArrayWrapper.INVALIDATED); - } - } - - } - - /** - * Wraps a sequence object (like a list) such that it behaves like a {@code HPy} array (C type - * {@code HPy *}). - */ - @ExportLibrary(InteropLibrary.class) - static final class IntArrayWrapper implements TruffleObject { - - final int[] delegate; - - public IntArrayWrapper(int[] delegate) { - this.delegate = delegate; - } - - public int[] getDelegate() { - return delegate; - } - - @SuppressWarnings("static-method") - @ExportMessage - boolean hasArrayElements() { - return true; - } - - @ExportMessage - long getArraySize() { - return delegate.length; - } - - @ExportMessage(name = "isArrayElementReadable") - @ExportMessage(name = "isArrayElementModifiable") - boolean isValidIndex(long index) { - return 0 <= index && index < delegate.length; - } - - @ExportMessage - boolean isArrayElementInsertable(@SuppressWarnings("unused") long index) { - return false; - } - - @ExportMessage - @TruffleBoundary - Object readArrayElement(long index) throws InvalidArrayIndexException { - return delegate[checkIndex(index)]; - } - - @ExportMessage - @TruffleBoundary - void writeArrayElement(long index, Object value, - @CachedLibrary(limit = "1") InteropLibrary lib) throws UnsupportedTypeException, InvalidArrayIndexException { - delegate[checkIndex(index)] = coerceToInt(value, lib); - } - - private int coerceToInt(Object value, InteropLibrary lib) throws UnsupportedTypeException { - if (value instanceof Integer i) { - return i; - } - if (lib.fitsInInt(value)) { - try { - return lib.asInt(value); - } catch (UnsupportedMessageException e) { - // fall through - } - } - throw UnsupportedTypeException.create(new Object[]{value}); - } - - private int checkIndex(long index) throws InvalidArrayIndexException { - if (index < 0 || index > delegate.length) { - throw InvalidArrayIndexException.create(index); - } - return (int) index; - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/llvm/NativeSpaceArrayWrapper.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/llvm/NativeSpaceArrayWrapper.java deleted file mode 100644 index ce9f1732f0..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/llvm/NativeSpaceArrayWrapper.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.cext.hpy.llvm; - -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext.GraalHPyHandleReference; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyHandle; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.TruffleObject; -import com.oracle.truffle.api.library.ExportLibrary; -import com.oracle.truffle.api.library.ExportMessage; - -/** - * This class implements a simple interop array that has elements with following layout: - * - *
      - *     [nativeSpacePtr0, destroyFun0, nativeSpacePtr1, destroyFun1, ...]
      - * 
      - * - * So, each element at indices {@code i % 2 == 0} is a native space pointer and each element at - * indices {@code i % 2 == 1} is the corresponding pointer to a destroy function. On the C side, - * this should be use like this: - * - *
      - *     typedef void (*destroyfunc_t)(void *);
      - *     void bulk_cleanup(void *nativeSpaceArrayWrapper) {
      - *         int64_t n = polyglot_get_array_size(nativeSpaceArrayWrapper);
      - *         void *nativeSpacePtr;
      - *         destroyfunc_t destroyfunc;
      - *         for (int64_t i = 0; i < n; i += 2) {
      - *             nativeSpacePtr = nativeSpaceArrayWrapper[i];
      - *             destroyfunc = nativeSpaceArrayWrapper[i+1];
      - *             ... 
      - *         }
      - *     }
      - * 
      - */ -@ExportLibrary(InteropLibrary.class) -final class NativeSpaceArrayWrapper implements TruffleObject { - - final GraalHPyHandleReference[] data; - - public NativeSpaceArrayWrapper(GraalHPyHandleReference[] data) { - this.data = data; - } - - @ExportMessage - @SuppressWarnings("static-method") - boolean hasArrayElements() { - return true; - } - - @ExportMessage - long getArraySize() { - return data.length * 2L; - } - - @ExportMessage - boolean isArrayElementReadable(long i) { - return i < data.length * 2L; - } - - @ExportMessage - Object readArrayElement(long i) { - GraalHPyHandleReference ref = data[(int) i / 2]; - if (ref != null) { - if (i % 2 == 0) { - return ref.getNativeSpace(); - } else { - Object destroyFunc = ref.getDestroyFunc(); - return destroyFunc != null ? destroyFunc : GraalHPyHandle.NULL_HANDLE; - } - } - /* - * At this point, we need to return something that fulfills 'interopLib.isNull(obj)'. - * However, it MUST NOT be any 'PythonAbstractObject' because the interop messages could try - * to acquire the GIL. - */ - return GraalHPyHandle.NULL_HANDLE; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/structs/CConstants.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/structs/CConstants.java index 47f21f9fb1..f4ee44d620 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/structs/CConstants.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/structs/CConstants.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -90,7 +90,7 @@ public int intValue() { CompilerDirectives.transferToInterpreterAndInvalidate(); resolve(); if (intValue == -1) { - throw PRaiseNode.raiseUncached(null, SystemError, INTERNAL_INT_OVERFLOW); + throw PRaiseNode.raiseStatic(null, SystemError, INTERNAL_INT_OVERFLOW); } return intValue; } @@ -104,10 +104,10 @@ private static void resolve() { for (CConstants constant : VALUES) { constant.longValue = constants[constant.ordinal()]; if (constant.longValue == -1) { - throw PRaiseNode.raiseUncached(null, SystemError, toTruffleStringUncached("internal limitation - cannot extract constants with value '-1'")); + throw PRaiseNode.raiseStatic(null, SystemError, toTruffleStringUncached("internal limitation - cannot extract constants with value '-1'")); } if ((constant.longValue & 0xFFFF0000L) == 0xDEAD0000L) { - throw PRaiseNode.raiseUncached(null, SystemError, toTruffleStringUncached("marker value reached, regenerate C code (mx python-capi)")); + throw PRaiseNode.raiseStatic(null, SystemError, toTruffleStringUncached("marker value reached, regenerate C code (mx python-capi)")); } if (constant.longValue == (int) constant.longValue) { constant.intValue = (int) constant.longValue; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/structs/CFields.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/structs/CFields.java index 2ddb1ef60c..bcc5fa16f9 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/structs/CFields.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/structs/CFields.java @@ -64,6 +64,7 @@ import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Py_buffer; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Py_hash_t; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Py_ssize_t; +import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.UINTPTR_T; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.UNSIGNED_INT; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.UNSIGNED_LONG; import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.WCHAR_T_PTR; @@ -338,6 +339,21 @@ public enum CFields { PyThreadState__curexc_traceback(PyObject), PyThreadState__dict(PyObject), PyThreadState__small_ints(PyObjectPtr), + PyThreadState__gc(Pointer), + + GCState__enabled(Int), + GCState__debug(Int), + GCState__generations(Pointer), + GCState__generation0(Pointer), + GCState__collecting(Int), + + GCGeneration__threshold(Int), + GCGeneration__count(Int), + + PyGC_Head___gc_prev(UINTPTR_T), + PyGC_Head___gc_next(UINTPTR_T), + GraalPyGC_CycleNode__item(PyObject), + GraalPyGC_CycleNode__next(Pointer), PyBaseExceptionObject__dict(PyObject), PyBaseExceptionObject__args(PyObject), diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/structs/CStructAccess.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/structs/CStructAccess.java index 7f98cf7033..d41b1d6d15 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/structs/CStructAccess.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/structs/CStructAccess.java @@ -59,6 +59,7 @@ import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccessFactory.FreeNodeGen; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccessFactory.GetElementPtrNodeGen; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccessFactory.ReadCharPtrNodeGen; +import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccessFactory.ReadI32NodeGen; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccessFactory.ReadObjectNodeGen; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccessFactory.ReadPointerNodeGen; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccessFactory.WriteIntNodeGen; @@ -250,13 +251,12 @@ public final boolean accepts(ArgDescriptor desc) { } @Specialization - static Object getLong(long pointer, long offset) { - assert offset >= 0; + static long getLong(long pointer, long offset) { return pointer + offset; } @Specialization(guards = {"!isLong(pointer)", "lib.isPointer(pointer)"}, limit = "3") - static Object getPointer(Object pointer, long offset, + static long getPointer(Object pointer, long offset, @CachedLibrary("pointer") InteropLibrary lib) { return getLong(asPointer(pointer, lib), offset); } @@ -404,6 +404,10 @@ static int readManaged(Object pointer, long offset, @GenerateUncached public abstract static class ReadI32Node extends ReadBaseNode { + public static int readUncached(Object pointer, CFields field) { + return ReadI32NodeGen.getUncached().read(pointer, field); + } + abstract int execute(Object pointer, long offset); public final int read(Object pointer, CFields field) { @@ -762,11 +766,6 @@ public final Object[] readPyObjectArray(Object pointer, int elements, int offset return result; } - public final Object readStructArrayElement(Object pointer, long element, CFields field) { - assert accepts(field); - return execute(pointer, element * field.struct.size() + field.offset()); - } - @Specialization static Object readLong(long pointer, long offset, @Shared @Cached NativePtrToPythonNode toPython) { @@ -1069,6 +1068,10 @@ public final void writeArrayElement(Object pointer, long element, int value) { execute(pointer, element * Integer.BYTES, value); } + public final void writeStructArrayElement(Object pointer, long element, CFields field, int value) { + execute(pointer, element * field.struct.size() + field.offset(), value); + } + @Specialization static void writeLong(long pointer, long offset, int value) { assert offset >= 0; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/structs/CStructs.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/structs/CStructs.java index f72a8a21cc..073c105796 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/structs/CStructs.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/structs/CStructs.java @@ -90,7 +90,11 @@ public enum CStructs { PyThreadState, wchar_t, long__long, - Py_ssize_t; + Py_ssize_t, + GCState, + PyGC_Head, + GraalPyGC_CycleNode, + GCGeneration; @CompilationFinal(dimensions = 1) public static final CStructs[] VALUES = values(); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/code/CodeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/code/CodeBuiltins.java index 013bdc4b46..b426a403b3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/code/CodeBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/code/CodeBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -28,10 +28,8 @@ import static com.oracle.graal.python.annotations.ArgumentClinic.VALUE_EMPTY_TSTRING; import static com.oracle.graal.python.annotations.ArgumentClinic.VALUE_NONE; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.nodes.StringLiterals.T_NONE; +import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.objectArrayToTruffleStringArray; @@ -39,7 +37,11 @@ import java.util.Arrays; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -47,26 +49,39 @@ import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.PNotImplemented; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; +import com.oracle.graal.python.builtins.objects.bytes.PBytes; +import com.oracle.graal.python.builtins.objects.code.CodeBuiltinsClinicProviders.CodeConstructorNodeClinicProviderGen; +import com.oracle.graal.python.builtins.objects.common.SequenceNodes; import com.oracle.graal.python.builtins.objects.str.StringNodes.InternStringNode; import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.HashBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare.RichCmpBuiltinNode; +import com.oracle.graal.python.compiler.BytecodeCodeUnit; import com.oracle.graal.python.compiler.CodeUnit; import com.oracle.graal.python.compiler.OpCodes; import com.oracle.graal.python.compiler.SourceMap; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.lib.PyObjectHashNode; +import com.oracle.graal.python.lib.RichCmpOp; +import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.IndirectCallData; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.PythonOptions; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.bytecode.BytecodeNode; +import com.oracle.truffle.api.bytecode.Instruction; +import com.oracle.truffle.api.bytecode.SourceInformationTree; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; @@ -76,25 +91,92 @@ import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.source.SourceSection; import com.oracle.truffle.api.strings.TruffleString; @CoreFunctions(extendClasses = PythonBuiltinClassType.PCode) public final class CodeBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = CodeBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return CodeBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "code", minNumOfPositionalArgs = 16, numOfPositionalOnlyArgs = 18, parameterNames = { + "$cls", "argcount", "posonlyargcount", "kwonlyargcount", "nlocals", "stacksize", "flags", "codestring", + "constants", "names", "varnames", "filename", "name", "qualname", "firstlineno", + "linetable", "exceptiontable", "freevars", "cellvars"}) + @ArgumentClinic(name = "argcount", conversion = ArgumentClinic.ClinicConversion.Int) + @ArgumentClinic(name = "posonlyargcount", conversion = ArgumentClinic.ClinicConversion.Int) + @ArgumentClinic(name = "kwonlyargcount", conversion = ArgumentClinic.ClinicConversion.Int) + @ArgumentClinic(name = "nlocals", conversion = ArgumentClinic.ClinicConversion.Int) + @ArgumentClinic(name = "stacksize", conversion = ArgumentClinic.ClinicConversion.Int) + @ArgumentClinic(name = "flags", conversion = ArgumentClinic.ClinicConversion.Int) + @ArgumentClinic(name = "filename", conversion = ArgumentClinic.ClinicConversion.TString) + @ArgumentClinic(name = "name", conversion = ArgumentClinic.ClinicConversion.TString) + @ArgumentClinic(name = "qualname", conversion = ArgumentClinic.ClinicConversion.TString) + @ArgumentClinic(name = "firstlineno", conversion = ArgumentClinic.ClinicConversion.Int) + @GenerateNodeFactory + public abstract static class CodeConstructorNode extends PythonClinicBuiltinNode { + @Specialization + static PCode call(VirtualFrame frame, @SuppressWarnings("unused") Object cls, int argcount, + int posonlyargcount, int kwonlyargcount, + int nlocals, int stacksize, int flags, + PBytes codestring, PTuple constants, PTuple names, PTuple varnames, + TruffleString filename, TruffleString name, TruffleString qualname, + int firstlineno, PBytes linetable, @SuppressWarnings("unused") PBytes exceptiontable, + PTuple freevars, PTuple cellvars, + @Bind("this") Node inliningTarget, + @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, + @Cached CodeNodes.CreateCodeNode createCodeNode, + @Cached SequenceNodes.GetObjectArrayNode getObjectArrayNode, + @Cached CastToTruffleStringNode castToTruffleStringNode) { + byte[] codeBytes = bufferLib.getCopiedByteArray(codestring); + byte[] linetableBytes = bufferLib.getCopiedByteArray(linetable); + + Object[] constantsArr = getObjectArrayNode.execute(inliningTarget, constants); + TruffleString[] namesArr = objectArrayToTruffleStringArray(inliningTarget, getObjectArrayNode.execute(inliningTarget, names), castToTruffleStringNode); + TruffleString[] varnamesArr = objectArrayToTruffleStringArray(inliningTarget, getObjectArrayNode.execute(inliningTarget, varnames), castToTruffleStringNode); + TruffleString[] freevarsArr = objectArrayToTruffleStringArray(inliningTarget, getObjectArrayNode.execute(inliningTarget, freevars), castToTruffleStringNode); + TruffleString[] cellcarsArr = objectArrayToTruffleStringArray(inliningTarget, getObjectArrayNode.execute(inliningTarget, cellvars), castToTruffleStringNode); + + return createCodeNode.execute(frame, argcount, posonlyargcount, kwonlyargcount, + nlocals, stacksize, flags, + codeBytes, constantsArr, namesArr, + varnamesArr, freevarsArr, cellcarsArr, + filename, name, qualname, + firstlineno, linetableBytes); + } + + @Fallback + @SuppressWarnings("unused") + static PCode call(Object cls, Object argcount, Object kwonlyargcount, Object posonlyargcount, + Object nlocals, Object stacksize, Object flags, + Object codestring, Object constants, Object names, Object varnames, + Object filename, Object name, Object qualname, + Object firstlineno, Object linetable, Object exceptiontable, + Object freevars, Object cellvars, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.INVALID_ARGS, "code"); + } + + @Override + protected ArgumentClinicProvider getArgumentClinic() { + return CodeConstructorNodeClinicProviderGen.INSTANCE; + } + } + @Builtin(name = "co_freevars", minNumOfPositionalArgs = 1, isGetter = true) @GenerateNodeFactory public abstract static class GetFreeVarsNode extends PythonUnaryBuiltinNode { @Specialization static Object get(PCode self, @Bind("this") Node inliningTarget, - @Cached InternStringNode internStringNode, - @Cached PythonObjectFactory factory) { - return internStrings(inliningTarget, self.getFreeVars(), internStringNode, factory); + @Cached InternStringNode internStringNode) { + return internStrings(inliningTarget, self.getFreeVars(), internStringNode); } } @@ -104,9 +186,8 @@ public abstract static class GetCellVarsNode extends PythonUnaryBuiltinNode { @Specialization static Object get(PCode self, @Bind("this") Node inliningTarget, - @Cached InternStringNode internStringNode, - @Cached PythonObjectFactory factory) { - return internStrings(inliningTarget, self.getCellVars(), internStringNode, factory); + @Cached InternStringNode internStringNode) { + return internStrings(inliningTarget, self.getCellVars(), internStringNode); } } @@ -215,8 +296,8 @@ static Object get(PCode self) { public abstract static class GetCodeNode extends PythonUnaryBuiltinNode { @Specialization static Object get(PCode self, - @Cached PythonObjectFactory factory) { - return self.co_code(factory); + @Bind PythonLanguage language) { + return self.co_code(language); } } @@ -226,9 +307,8 @@ public abstract static class GetConstsNode extends PythonUnaryBuiltinNode { @Specialization static Object get(PCode self, @Bind("this") Node inliningTarget, - @Cached InternStringNode internStringNode, - @Cached PythonObjectFactory factory) { - return internStrings(inliningTarget, self.getConstants(), internStringNode, factory); + @Cached InternStringNode internStringNode) { + return internStrings(inliningTarget, self.getConstants(), internStringNode); } } @@ -238,9 +318,8 @@ public abstract static class GetNamesNode extends PythonUnaryBuiltinNode { @Specialization static Object get(PCode self, @Bind("this") Node inliningTarget, - @Cached InternStringNode internStringNode, - @Cached PythonObjectFactory factory) { - return internStrings(inliningTarget, self.getNames(), internStringNode, factory); + @Cached InternStringNode internStringNode) { + return internStrings(inliningTarget, self.getNames(), internStringNode); } } @@ -250,9 +329,8 @@ public abstract static class GetVarNamesNode extends PythonUnaryBuiltinNode { @Specialization static Object get(PCode self, @Bind("this") Node inliningTarget, - @Cached InternStringNode internStringNode, - @Cached PythonObjectFactory factory) { - return internStrings(inliningTarget, self.getVarnames(), internStringNode, factory); + @Cached InternStringNode internStringNode) { + return internStrings(inliningTarget, self.getVarnames(), internStringNode); } } @@ -263,13 +341,13 @@ static Object get(PCode self, public abstract static class GetLineTableNode extends PythonUnaryBuiltinNode { @Specialization static Object get(PCode self, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { byte[] linetable = self.getLinetable(); if (linetable == null) { // TODO: this is for the moment undefined (see co_code) linetable = PythonUtils.EMPTY_BYTE_ARRAY; } - return factory.createBytes(linetable); + return PFactory.createBytes(language, linetable); } } @@ -279,9 +357,9 @@ abstract static class GetExceptionTableNode extends PythonUnaryBuiltinNode { @Specialization @SuppressWarnings("unused") static Object get(PCode self, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { // We store our exception table together with the bytecode, not in this field - return factory.createEmptyBytes(); + return PFactory.createEmptyBytes(language); } } @@ -296,30 +374,111 @@ private static final class IteratorData { @Specialization @TruffleBoundary static Object lines(PCode self) { - PythonObjectFactory factory = PythonContext.get(null).factory(); + PythonLanguage language = PythonLanguage.get(null); PTuple tuple; CodeUnit co = self.getCodeUnit(); if (co != null) { - SourceMap map = co.getSourceMap(); - List lines = new ArrayList<>(); - if (map != null && map.startLineMap.length > 0) { - IteratorData data = new IteratorData(); - data.line = map.startLineMap[0]; - co.iterateBytecode((int bci, OpCodes op, int oparg, byte[] followingArgs) -> { - int nextStart = bci + op.length(); - if (map.startLineMap[bci] != data.line || nextStart == co.code.length) { - lines.add(factory.createTuple(new int[]{data.start, nextStart, data.line})); - data.line = map.startLineMap[bci]; - data.start = nextStart; - } - }); + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + PBytecodeDSLRootNode rootNode = (PBytecodeDSLRootNode) self.getRootNodeForExtraction(); + List lines = computeLinesForBytecodeDSLInterpreter(rootNode); + tuple = PFactory.createTuple(language, lines.toArray()); + } else { + BytecodeCodeUnit bytecodeCo = (BytecodeCodeUnit) co; + SourceMap map = bytecodeCo.getSourceMap(); + List lines = new ArrayList<>(); + if (map != null && map.startLineMap.length > 0) { + IteratorData data = new IteratorData(); + data.line = map.startLineMap[0]; + bytecodeCo.iterateBytecode((int bci, OpCodes op, int oparg, byte[] followingArgs) -> { + int nextStart = bci + op.length(); + if (map.startLineMap[bci] != data.line || nextStart == bytecodeCo.code.length) { + lines.add(PFactory.createTuple(language, new int[]{data.start, nextStart, data.line})); + data.line = map.startLineMap[bci]; + data.start = nextStart; + } + }); + } + tuple = PFactory.createTuple(language, lines.toArray()); } - tuple = factory.createTuple(lines.toArray()); } else { - tuple = factory.createEmptyTuple(); + tuple = PFactory.createEmptyTuple(language); } return PyObjectGetIter.executeUncached(tuple); } + + private static List computeLinesForBytecodeDSLInterpreter(PBytecodeDSLRootNode root) { + BytecodeNode bytecodeNode = root.getBytecodeNode(); + List triples = new ArrayList<>(); + SourceInformationTree sourceInformationTree = bytecodeNode.getSourceInformationTree(); + assert sourceInformationTree.getSourceSection() != null; + traverseSourceInformationTree(sourceInformationTree, triples); + return convertTripleBcisToInstructionIndices(bytecodeNode, root.getLanguage(), triples); + } + + /** + * This function traverses the source information tree recursively to compute a list of + * consecutive bytecode ranges with their corresponding line numbers. + *

      + * Each node in the tree covers a bytecode range. Each child covers some sub-range. The + * bytecodes covered by a particular node are the bytecodes within its range that are *not* + * covered by the node's children. + *

      + * For example, consider a node covering [0, 20] with children covering [4, 9] and [15, 18]. + * The node itself covers the ranges [0, 4], [9, 15], and [18, 20]. These ranges are + * assigned the line number of the node. + */ + private static void traverseSourceInformationTree(SourceInformationTree tree, List triples) { + int startIndex = tree.getStartBytecodeIndex(); + int startLine = tree.getSourceSection().getStartLine(); + for (SourceInformationTree child : tree.getChildren()) { + if (startIndex < child.getStartBytecodeIndex()) { + // range before child.start is uncovered + triples.add(new int[]{startIndex, child.getStartBytecodeIndex(), startLine}); + } + // recursively handle [child.start, child.end] + traverseSourceInformationTree(child, triples); + startIndex = child.getEndBytecodeIndex(); + } + + if (startIndex < tree.getEndBytecodeIndex()) { + // range after last_child.end is uncovered + triples.add(new int[]{startIndex, tree.getEndBytecodeIndex(), startLine}); + } + } + + /** + * The bci ranges in the triples are not stable and can change when the bytecode is + * instrumented. We create new triples with stable instruction indices by walking the + * instructions. + */ + private static List convertTripleBcisToInstructionIndices(BytecodeNode bytecodeNode, PythonLanguage language, List triples) { + List result = new ArrayList<>(triples.size()); + int tripleIndex = 0; + int[] triple = triples.get(0); + assert triple[0] == 0 : "the first bytecode range should start from 0"; + + int startInstructionIndex = 0; + int instructionIndex = 0; + for (Instruction instruction : bytecodeNode.getInstructions()) { + if (instruction.getBytecodeIndex() == triple[1] /* end bci */) { + result.add(PFactory.createTuple(language, new int[]{startInstructionIndex, instructionIndex, triple[2]})); + startInstructionIndex = instructionIndex; + triple = triples.get(++tripleIndex); + assert triple[0] == instruction.getBytecodeIndex() : "bytecode ranges should be consecutive"; + } + + if (!instruction.isInstrumentation()) { + // Emulate CPython's fixed 2-word instructions. + instructionIndex += 2; + } + } + + result.add(PFactory.createTuple(language, new int[]{startInstructionIndex, instructionIndex, triple[2]})); + assert tripleIndex == triples.size() : "every bytecode range should have been converted to an instruction range"; + + return result; + } + } @Builtin(name = "co_positions", minNumOfPositionalArgs = 1) @@ -329,28 +488,49 @@ abstract static class CoPositionsNode extends PythonUnaryBuiltinNode { @Specialization @TruffleBoundary Object positions(PCode self) { - PythonObjectFactory factory = PythonContext.get(null).factory(); + PythonLanguage language = PythonLanguage.get(null); PTuple tuple; CodeUnit co = self.getCodeUnit(); if (co != null) { - SourceMap map = co.getSourceMap(); List lines = new ArrayList<>(); - if (map != null && map.startLineMap.length > 0) { - byte[] bytecode = co.code; - for (int i = 0; i < bytecode.length;) { - lines.add(factory.createTuple(new int[]{map.startLineMap[i], map.endLineMap[i], map.startColumnMap[i], map.endColumnMap[i]})); - i += OpCodes.fromOpCode(bytecode[i]).length(); + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + PBytecodeDSLRootNode rootNode = (PBytecodeDSLRootNode) self.getRootNodeForExtraction(); + for (Instruction instruction : rootNode.getBytecodeNode().getInstructions()) { + if (instruction.isInstrumentation()) { + // Skip instrumented instructions. The co_positions array should agree + // with the logical instruction index. + continue; + } + SourceSection section = rootNode.getSourceSectionForLocation(instruction.getLocation()); + lines.add(PFactory.createTuple(language, new int[]{ + section.getStartLine(), + section.getEndLine(), + // 1-based inclusive to 0-based inclusive + section.getStartColumn() - 1, + // 1-based inclusive to 0-based exclusive (-1 + 1 = 0) + section.getEndColumn() + })); + } + } else { + BytecodeCodeUnit bytecodeCo = (BytecodeCodeUnit) co; + SourceMap map = bytecodeCo.getSourceMap(); + if (map != null && map.startLineMap.length > 0) { + byte[] bytecode = bytecodeCo.code; + for (int i = 0; i < bytecode.length;) { + lines.add(PFactory.createTuple(language, new int[]{map.startLineMap[i], map.endLineMap[i], map.startColumnMap[i], map.endColumnMap[i]})); + i += OpCodes.fromOpCode(bytecode[i]).length(); + } } } - tuple = factory.createTuple(lines.toArray()); + tuple = PFactory.createTuple(language, lines.toArray()); } else { - tuple = factory.createEmptyTuple(); + tuple = PFactory.createEmptyTuple(language); } return PyObjectGetIter.executeUncached(tuple); } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class CodeReprNode extends PythonUnaryBuiltinNode { @Specialization @@ -363,59 +543,60 @@ static TruffleString repr(PCode self, } } - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.tp_richcompare, isComplex = true) @GenerateNodeFactory - public abstract static class CodeEqNode extends PythonBinaryBuiltinNode { + public abstract static class CodeEqNode extends RichCmpBuiltinNode { - @Specialization + @Specialization(guards = "op.isEqOrNe()") @TruffleBoundary - boolean eq(PCode self, PCode other) { + boolean eq(PCode self, PCode other, RichCmpOp op) { if (self == other) { - return true; + return op.isEq(); } // it's quite difficult for our deserialized code objects to tell if they are the same if (self.getRootNode() != null && other.getRootNode() != null) { if (!self.getName().equalsUncached(other.getName(), TS_ENCODING)) { - return false; + return op.isNe(); } if (self.co_argcount() != other.co_argcount() || self.co_posonlyargcount() != other.co_posonlyargcount() || self.co_kwonlyargcount() != other.co_kwonlyargcount() || self.co_nlocals() != other.co_nlocals() || self.co_flags() != other.co_flags() || self.co_firstlineno() != other.co_firstlineno()) { - return false; + return op.isNe(); } if (!Arrays.equals(self.getCodestring(), other.getCodestring())) { - return false; + return op.isNe(); } // TODO compare co_const - return Arrays.equals(self.getNames(), other.getNames()) && Arrays.equals(self.getVarnames(), other.getVarnames()) && Arrays.equals(self.getFreeVars(), other.getFreeVars()) && + boolean eq = Arrays.equals(self.getNames(), other.getNames()) && Arrays.equals(self.getVarnames(), other.getVarnames()) && Arrays.equals(self.getFreeVars(), other.getFreeVars()) && Arrays.equals(self.getCellVars(), other.getCellVars()); + return eq == op.isEq(); } - return false; + return op.isNe(); } @SuppressWarnings("unused") @Fallback - Object fail(Object self, Object other) { + Object fail(Object self, Object other, RichCmpOp op) { return PNotImplemented.NOT_IMPLEMENTED; } } - @Builtin(name = J___HASH__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_hash, isComplex = true) @GenerateNodeFactory - public abstract static class CodeHashNode extends PythonUnaryBuiltinNode { + public abstract static class CodeHashNode extends HashBuiltinNode { @Specialization static long hash(VirtualFrame frame, PCode self, @Bind("this") Node inliningTarget, - @Cached PyObjectHashNode hashNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @Cached PyObjectHashNode hashNode) { long h, h0, h1, h2, h3, h4, h5, h6; h0 = hashNode.execute(frame, inliningTarget, self.co_name()); - h1 = hashNode.execute(frame, inliningTarget, self.co_code(factory)); - h2 = hashNode.execute(frame, inliningTarget, self.co_consts(factory)); - h3 = hashNode.execute(frame, inliningTarget, self.co_names(factory)); - h4 = hashNode.execute(frame, inliningTarget, self.co_varnames(factory)); - h5 = hashNode.execute(frame, inliningTarget, self.co_freevars(factory)); - h6 = hashNode.execute(frame, inliningTarget, self.co_cellvars(factory)); + h1 = hashNode.execute(frame, inliningTarget, self.co_code(language)); + h2 = hashNode.execute(frame, inliningTarget, self.co_consts(language)); + h3 = hashNode.execute(frame, inliningTarget, self.co_names(language)); + h4 = hashNode.execute(frame, inliningTarget, self.co_varnames(language)); + h5 = hashNode.execute(frame, inliningTarget, self.co_freevars(language)); + h6 = hashNode.execute(frame, inliningTarget, self.co_cellvars(language)); h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^ self.co_argcount() ^ self.co_posonlyargcount() ^ self.co_kwonlyargcount() ^ @@ -509,9 +690,10 @@ private static boolean hasStrings(Object[] values) { return false; } - private static PTuple internStrings(Node inliningTarget, Object[] values, InternStringNode internStringNode, PythonObjectFactory factory) { + private static PTuple internStrings(Node inliningTarget, Object[] values, InternStringNode internStringNode) { + PythonLanguage language = PythonLanguage.get(inliningTarget); if (values == null) { - return factory.createEmptyTuple(); + return PFactory.createEmptyTuple(language); } Object[] result; if (!hasStrings(values)) { @@ -526,6 +708,6 @@ private static PTuple internStrings(Node inliningTarget, Object[] values, Intern } } } - return factory.createTuple(result); + return PFactory.createTuple(language, result); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/code/CodeNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/code/CodeNodes.java index e216da0c4e..45e204f3b0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/code/CodeNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/code/CodeNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,20 +46,24 @@ import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.MarshalModuleBuiltins; -import com.oracle.graal.python.builtins.objects.code.CodeNodesFactory.GetCodeCallTargetNodeGen; import com.oracle.graal.python.builtins.objects.code.CodeNodesFactory.GetCodeRootNodeGen; import com.oracle.graal.python.builtins.objects.function.PFunction; import com.oracle.graal.python.builtins.objects.function.Signature; +import com.oracle.graal.python.compiler.BytecodeCodeUnit; import com.oracle.graal.python.compiler.CodeUnit; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRootNode; import com.oracle.graal.python.nodes.bytecode.PBytecodeGeneratorFunctionRootNode; import com.oracle.graal.python.nodes.bytecode.PBytecodeRootNode; +import com.oracle.graal.python.nodes.bytecode_dsl.BytecodeDSLCodeUnit; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLGeneratorFunctionRootNode; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode; import com.oracle.graal.python.nodes.util.BadOPCodeNode; import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext; import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.PythonOptions; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.graal.python.util.Supplier; import com.oracle.truffle.api.CallTarget; @@ -76,7 +80,6 @@ import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.RootNode; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.source.Source; import com.oracle.truffle.api.strings.TruffleString; @@ -95,8 +98,8 @@ public PCode execute(VirtualFrame frame, int argcount, TruffleString filename, TruffleString name, TruffleString qualname, int firstlineno, byte[] linetable) { - PythonLanguage language = PythonLanguage.get(this); PythonContext context = PythonContext.get(this); + PythonLanguage language = context.getLanguage(this); Object state = IndirectCallContext.enter(frame, language, context, indirectCallData); try { return createCode(language, context, argcount, @@ -139,35 +142,44 @@ private static PCode createCode(PythonLanguage language, PythonContext context, signature = new Signature(positionalOnlyArgCount, (flags & PCode.CO_VARKEYWORDS) != 0, varArgsIndex, - positionalOnlyArgCount > 0, parameterNames, kwOnlyNames); } else { - ct = create().deserializeForBytecodeInterpreter(language, codedata, cellvars, freevars); + ct = create().deserializeForBytecodeInterpreter(language, context, codedata, cellvars, freevars); signature = ((PRootNode) ct.getRootNode()).getSignature(); } if (filename != null) { context.setCodeFilename(ct, filename); } - PythonObjectFactory factory = context.factory(); - return factory.createCode(ct, signature, nlocals, stacksize, flags, constants, names, varnames, freevars, cellvars, filename, name, qualname, firstlineno, linetable); + return PFactory.createCode(language, ct, signature, nlocals, stacksize, flags, constants, names, varnames, freevars, cellvars, filename, name, qualname, firstlineno, linetable); } @SuppressWarnings("static-method") - private RootCallTarget deserializeForBytecodeInterpreter(PythonLanguage language, byte[] data, TruffleString[] cellvars, TruffleString[] freevars) { - CodeUnit code = MarshalModuleBuiltins.deserializeCodeUnit(data); - if (cellvars != null && !Arrays.equals(code.cellvars, cellvars) || freevars != null && !Arrays.equals(code.freevars, freevars)) { - code = new CodeUnit(code.name, code.qualname, code.argCount, code.kwOnlyArgCount, code.positionalOnlyArgCount, code.stacksize, code.code, - code.srcOffsetTable, code.flags, code.names, code.varnames, - cellvars != null ? cellvars : code.cellvars, freevars != null ? freevars : code.freevars, - code.cell2arg, code.constants, code.primitiveConstants, code.exceptionHandlerRanges, code.conditionProfileCount, - code.startLine, code.startColumn, code.endLine, code.endColumn, - code.outputCanQuicken, code.variableShouldUnbox, - code.generalizeInputsMap, code.generalizeVarsMap); - } - RootNode rootNode = PBytecodeRootNode.create(language, code, PythonUtils.createFakeSource()); - if (code.isGeneratorOrCoroutine()) { - rootNode = new PBytecodeGeneratorFunctionRootNode(language, rootNode.getFrameDescriptor(), (PBytecodeRootNode) rootNode, code.name); + private RootCallTarget deserializeForBytecodeInterpreter(PythonLanguage language, PythonContext context, byte[] data, TruffleString[] cellvars, TruffleString[] freevars) { + CodeUnit codeUnit = MarshalModuleBuiltins.deserializeCodeUnit(null, context, data); + RootNode rootNode = null; + + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + BytecodeDSLCodeUnit code = (BytecodeDSLCodeUnit) codeUnit; + rootNode = code.createRootNode(context, PythonUtils.createFakeSource()); + if (code.isGeneratorOrCoroutine()) { + rootNode = new PBytecodeDSLGeneratorFunctionRootNode(language, rootNode.getFrameDescriptor(), (PBytecodeDSLRootNode) rootNode, code.name); + } + } else { + BytecodeCodeUnit code = (BytecodeCodeUnit) codeUnit; + if (cellvars != null && !Arrays.equals(code.cellvars, cellvars) || freevars != null && !Arrays.equals(code.freevars, freevars)) { + code = new BytecodeCodeUnit(code.name, code.qualname, code.argCount, code.kwOnlyArgCount, code.positionalOnlyArgCount, code.flags, code.names, + code.varnames, cellvars != null ? cellvars : code.cellvars, freevars != null ? freevars : code.freevars, code.cell2arg, + code.constants, code.startLine, + code.startColumn, code.endLine, code.endColumn, code.code, code.srcOffsetTable, + code.primitiveConstants, code.exceptionHandlerRanges, code.stacksize, code.conditionProfileCount, + code.outputCanQuicken, code.variableShouldUnbox, + code.generalizeInputsMap, code.generalizeVarsMap); + } + rootNode = PBytecodeRootNode.create(context.getLanguage(), code, PythonUtils.createFakeSource()); + if (code.isGeneratorOrCoroutine()) { + rootNode = new PBytecodeGeneratorFunctionRootNode(context.getLanguage(), rootNode.getFrameDescriptor(), (PBytecodeRootNode) rootNode, code.name); + } } return PythonUtils.getOrCreateCallTarget(rootNode); } @@ -183,12 +195,11 @@ public static PCode createCode(PythonContext context, int flags, byte[] codedata return context.getEnv().parsePublic(source); }; - PythonObjectFactory factory = context.factory(); if (context.isCoreInitialized() || isNotAModule) { - return factory.createCode(createCode, flags, firstlineno, lnotab, filename); + return PFactory.createCode(language, (RootCallTarget) createCode.get(), flags, firstlineno, lnotab, filename); } else { RootCallTarget ct = (RootCallTarget) language.cacheCode(filename, createCode); - return factory.createCode(ct, flags, firstlineno, lnotab, filename); + return PFactory.createCode(language, ct, flags, firstlineno, lnotab, filename); } } @@ -203,34 +214,17 @@ public static CreateCodeNode create() { @GenerateCached(false) public abstract static class GetCodeCallTargetNode extends PNodeWithContext { - GetCodeCallTargetNode() { - } - public abstract RootCallTarget execute(Node inliningTarget, PCode code); - public static RootCallTarget executeUncached(PCode code) { - return GetCodeCallTargetNodeGen.getUncached().execute(null, code); - } - @Specialization(guards = {"cachedCode == code", "isSingleContext()"}, limit = "2") static RootCallTarget doCachedCode(@SuppressWarnings("unused") PCode code, - @SuppressWarnings("unused") @Cached(value = "code", weak = true) PCode cachedCode, - @Cached(value = "code.initializeCallTarget()", weak = true) RootCallTarget cachedRootCallTarget) { - return cachedRootCallTarget; + @Cached(value = "code", weak = true) PCode cachedCode) { + return cachedCode.getRootCallTarget(); } @Specialization(replaces = "doCachedCode") - static RootCallTarget doGeneric(Node inliningTarget, PCode code, - @Cached InlinedConditionProfile hasCtProfile) { - return getInMultiContext(inliningTarget, code, hasCtProfile); - } - - public static RootCallTarget getInMultiContext(Node inliningTarget, PCode code, InlinedConditionProfile hasCtProfile) { - RootCallTarget ct = code.callTarget; - if (hasCtProfile.profile(inliningTarget, ct == null)) { - ct = code.initializeCallTarget(); - } - return ct; + static RootCallTarget doGeneric(PCode code) { + return code.getRootCallTarget(); } } @@ -264,10 +258,8 @@ public static Signature getInSingleContextMode(Node inliningTarget, PCode code) } @Specialization(replaces = "doCached") - static Signature doCode(Node inliningTarget, PCode code, - @Cached InlinedConditionProfile signatureProfile, - @Cached InlinedConditionProfile ctProfile) { - return code.getSignature(inliningTarget, signatureProfile); + static Signature doCode(PCode code) { + return code.getSignature(); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/code/PCode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/code/PCode.java index 01c3431132..ab6f6bc32d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/code/PCode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/code/PCode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -59,37 +59,38 @@ import com.oracle.graal.python.builtins.objects.function.Signature; import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.compiler.BytecodeCodeUnit; import com.oracle.graal.python.compiler.CodeUnit; import com.oracle.graal.python.compiler.OpCodes; import com.oracle.graal.python.nodes.PRootNode; import com.oracle.graal.python.nodes.bytecode.PBytecodeGeneratorFunctionRootNode; import com.oracle.graal.python.nodes.bytecode.PBytecodeGeneratorRootNode; import com.oracle.graal.python.nodes.bytecode.PBytecodeRootNode; +import com.oracle.graal.python.nodes.bytecode_dsl.BytecodeDSLCodeUnit; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLGeneratorFunctionRootNode; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode; import com.oracle.graal.python.nodes.object.IsForeignObjectNode; import com.oracle.graal.python.runtime.GilNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.PythonOptions; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.BoolSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.DoubleSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.LongSequenceStorage; import com.oracle.graal.python.util.PythonUtils; -import com.oracle.graal.python.util.Supplier; -import com.oracle.truffle.api.CallTarget; import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.RootCallTarget; +import com.oracle.truffle.api.bytecode.BytecodeNode; +import com.oracle.truffle.api.bytecode.ContinuationRootNode; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.RootNode; import com.oracle.truffle.api.object.Shape; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.source.SourceSection; import com.oracle.truffle.api.strings.TruffleString; @@ -108,11 +109,8 @@ public final class PCode extends PythonBuiltinObject { /* GraalPy-specific */ public static final int CO_GRAALPYHON_MODULE = 0x1000; - // callTargetSupplier may be null, in which case callTarget and signature will be - // set. Otherwise, these are lazily created from the supplier. - private Supplier callTargetSupplier; - RootCallTarget callTarget; - @CompilationFinal private Signature signature; + private final RootCallTarget callTarget; + private final Signature signature; // number of local variables private int nlocals = -1; @@ -149,7 +147,7 @@ public final class PCode extends PythonBuiltinObject { public PCode(Object cls, Shape instanceShape, RootCallTarget callTarget) { super(cls, instanceShape); this.callTarget = callTarget; - initializeSignature(callTarget); + this.signature = Signature.fromCallTarget(callTarget); } public PCode(Object cls, Shape instanceShape, RootCallTarget callTarget, int flags, int firstlineno, byte[] linetable, TruffleString filename) { @@ -160,19 +158,16 @@ public PCode(Object cls, Shape instanceShape, RootCallTarget callTarget, int fla this.filename = filename; } - public PCode(Object cls, Shape instanceShape, Supplier callTargetSupplier, int flags, int firstlineno, byte[] linetable, TruffleString filename) { - super(cls, instanceShape); - this.callTargetSupplier = callTargetSupplier; - this.flags = flags; - this.firstlineno = firstlineno; - this.linetable = linetable; - this.filename = filename; + public PCode(Object cls, Shape instanceShape, RootCallTarget callTarget, Signature signature, BytecodeCodeUnit codeUnit) { + this(cls, instanceShape, callTarget, signature, codeUnit.varnames.length, -1, -1, null, null, + null, null, null, null, + codeUnit.name, codeUnit.qualname, -1, codeUnit.srcOffsetTable); } - public PCode(Object cls, Shape instanceShape, RootCallTarget callTarget, Signature signature, CodeUnit codeUnit) { + public PCode(Object cls, Shape instanceShape, RootCallTarget callTarget, Signature signature, BytecodeDSLCodeUnit codeUnit) { this(cls, instanceShape, callTarget, signature, codeUnit.varnames.length, -1, -1, null, null, null, null, null, null, - codeUnit.name, codeUnit.qualname, -1, codeUnit.srcOffsetTable); + codeUnit.name, codeUnit.qualname, -1, null); } public PCode(Object cls, Shape instanceShape, RootCallTarget callTarget, Signature signature, int nlocals, @@ -196,6 +191,7 @@ public PCode(Object cls, Shape instanceShape, RootCallTarget callTarget, Signatu this.cellvars = cellvars; this.callTarget = callTarget; this.signature = signature; + assert signature != null; } private static TruffleString[] extractFreeVars(RootNode rootNode) { @@ -266,13 +262,14 @@ private static String getSourceSectionFileName(SourceSection src) { @TruffleBoundary private static int extractFirstLineno(RootNode rootNode) { RootNode funcRootNode = rootNodeForExtraction(rootNode); - if (funcRootNode instanceof PBytecodeRootNode) { - CodeUnit co = ((PBytecodeRootNode) funcRootNode).getCodeUnit(); + CodeUnit co = getCodeUnit(funcRootNode); + if (co != null) { if ((co.flags & CO_GRAALPYHON_MODULE) != 0) { return 1; } return co.startLine; } + SourceSection sourceSection = funcRootNode.getSourceSection(); if (sourceSection != null) { return sourceSection.getStartLine(); @@ -288,10 +285,15 @@ private static TruffleString extractName(RootNode rootNode) { @TruffleBoundary private static int extractStackSize(RootNode rootNode) { RootNode funcRootNode = rootNodeForExtraction(rootNode); - if (funcRootNode instanceof PBytecodeRootNode) { - CodeUnit code = ((PBytecodeRootNode) funcRootNode).getCodeUnit(); + if (funcRootNode instanceof PBytecodeRootNode bytecodeRootNode) { + BytecodeCodeUnit code = bytecodeRootNode.getCodeUnit(); return code.stacksize + code.varnames.length + code.cellvars.length + code.freevars.length; } + /** + * NB: This fallback case includes PBytecodeDSLRootNode. The Bytecode DSL stack does not + * mirror a CPython stack (it's an operand stack for its own instruction set), so the frame + * size is our best estimate. + */ return funcRootNode.getFrameDescriptor().getNumberOfSlots(); } @@ -307,8 +309,18 @@ private static TruffleString[] extractVarnames(RootNode node) { @TruffleBoundary private static Object[] extractConstants(RootNode node) { RootNode rootNode = rootNodeForExtraction(node); - if (rootNode instanceof PBytecodeRootNode) { - CodeUnit co = ((PBytecodeRootNode) rootNode).getCodeUnit(); + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + if (rootNode instanceof PBytecodeDSLRootNode bytecodeDSLRootNode) { + BytecodeDSLCodeUnit co = bytecodeDSLRootNode.getCodeUnit(); + List constants = new ArrayList<>(); + for (int i = 0; i < co.constants.length; i++) { + Object constant = convertConstantToPythonSpace(rootNode, co.constants[i]); + constants.add(constant); + } + return constants.toArray(new Object[0]); + } + } else if (rootNode instanceof PBytecodeRootNode bytecodeRootNode) { + BytecodeCodeUnit co = bytecodeRootNode.getCodeUnit(); Set bytecodeConstants = new HashSet<>(); for (int bci = 0; bci < co.code.length;) { OpCodes op = OpCodes.fromOpCode(co.code[bci]); @@ -355,11 +367,20 @@ private static TruffleString[] extractNames(RootNode node) { } private static RootNode rootNodeForExtraction(RootNode rootNode) { - if (rootNode instanceof PBytecodeGeneratorFunctionRootNode) { - return ((PBytecodeGeneratorFunctionRootNode) rootNode).getBytecodeRootNode(); - } - if (rootNode instanceof PBytecodeGeneratorRootNode) { - return ((PBytecodeGeneratorRootNode) rootNode).getBytecodeRootNode(); + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + if (rootNode instanceof PBytecodeDSLGeneratorFunctionRootNode generatorFunctionRootNode) { + return generatorFunctionRootNode.getBytecodeRootNode(); + } + if (rootNode instanceof ContinuationRootNode generatorRootNode) { + return (RootNode) generatorRootNode.getSourceRootNode(); + } + } else { + if (rootNode instanceof PBytecodeGeneratorFunctionRootNode generatorFunctionRootNode) { + return generatorFunctionRootNode.getBytecodeRootNode(); + } + if (rootNode instanceof PBytecodeGeneratorRootNode generatorRootNode) { + return generatorRootNode.getBytecodeRootNode(); + } } return rootNode; } @@ -376,8 +397,12 @@ private static int extractFlags(RootNode node) { private static CodeUnit getCodeUnit(RootNode node) { RootNode rootNode = rootNodeForExtraction(node); - if (rootNode instanceof PBytecodeRootNode) { - return ((PBytecodeRootNode) rootNode).getCodeUnit(); + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + if (rootNode instanceof PBytecodeDSLRootNode bytecodeDSLRootNode) { + return bytecodeDSLRootNode.getCodeUnit(); + } + } else if (rootNode instanceof PBytecodeRootNode bytecodeRootNode) { + return bytecodeRootNode.getCodeUnit(); } return null; } @@ -386,6 +411,10 @@ RootNode getRootNode() { return getRootCallTarget().getRootNode(); } + RootNode getRootNodeForExtraction() { + return rootNodeForExtraction(getRootNode()); + } + public TruffleString[] getFreeVars() { if (freevars == null) { freevars = extractFreeVars(getRootNode()); @@ -433,23 +462,19 @@ public int getFirstLineNo() { } @TruffleBoundary - public int bciToLine(int bci) { + public int lastiToLine(int lasti) { RootNode funcRootNode = rootNodeForExtraction(getRootNode()); - if (funcRootNode instanceof PBytecodeRootNode bytecodeRootNode) { - return bytecodeRootNode.bciToLine(bci); + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + if (funcRootNode instanceof PBytecodeDSLRootNode bytecodeDSLRootNode) { + BytecodeNode bytecodeNode = bytecodeDSLRootNode.getBytecodeNode(); + return bytecodeDSLRootNode.bciToLine(PBytecodeDSLRootNode.lastiToBci(lasti, bytecodeNode), bytecodeNode); + } + } else if (funcRootNode instanceof PBytecodeRootNode bytecodeRootNode) { + return bytecodeRootNode.bciToLine(bytecodeRootNode.lastiToBci(lasti)); } return -1; } - @TruffleBoundary - public int lastiToBci(int lasti) { - RootNode funcRootNode = rootNodeForExtraction(getRootNode()); - if (funcRootNode instanceof PBytecodeRootNode bytecodeRootNode) { - return bytecodeRootNode.lastiToBci(lasti); - } - return lasti; - } - public TruffleString getName() { if (name == null) { name = extractName(getRootNode()); @@ -527,34 +552,38 @@ public Object[] getConstants() { @TruffleBoundary private static Object convertConstantToPythonSpace(RootNode rootNode, Object o) { - PythonObjectFactory factory = PythonObjectFactory.getUncached(); + PythonLanguage language = PythonLanguage.get(null); if (o instanceof CodeUnit) { - CodeUnit code = ((CodeUnit) o); - PBytecodeRootNode bytecodeRootNode = PBytecodeRootNode.create(PythonLanguage.get(rootNode), code, getSourceSection(rootNode).getSource()); - return factory.createCode(bytecodeRootNode.getCallTarget(), bytecodeRootNode.getSignature(), code); + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + BytecodeDSLCodeUnit code = (BytecodeDSLCodeUnit) o; + PBytecodeDSLRootNode root = code.createRootNode(PythonContext.get(rootNode), getSourceSection(rootNode).getSource()); + return PFactory.createCode(language, root.getCallTarget(), root.getSignature(), code); + } else { + BytecodeCodeUnit code = (BytecodeCodeUnit) o; + PBytecodeRootNode bytecodeRootNode = PBytecodeRootNode.create(language, code, getSourceSection(rootNode).getSource()); + return PFactory.createCode(language, bytecodeRootNode.getCallTarget(), bytecodeRootNode.getSignature(), code); + } } else if (o instanceof BigInteger) { - return factory.createInt((BigInteger) o); + return PFactory.createInt(language, (BigInteger) o); } else if (o instanceof int[]) { - return factory.createTuple((int[]) o); + return PFactory.createTuple(language, (int[]) o); } else if (o instanceof long[]) { - return factory.createTuple(new LongSequenceStorage((long[]) o)); + return PFactory.createTuple(language, new LongSequenceStorage((long[]) o)); } else if (o instanceof double[]) { - return factory.createTuple(new DoubleSequenceStorage((double[]) o)); + return PFactory.createTuple(language, new DoubleSequenceStorage((double[]) o)); } else if (o instanceof boolean[]) { - return factory.createTuple(new BoolSequenceStorage((boolean[]) o)); + return PFactory.createTuple(language, new BoolSequenceStorage((boolean[]) o)); } else if (o instanceof byte[]) { - return factory.createBytes((byte[]) o); - } else if (o instanceof TruffleString[]) { - TruffleString[] strings = (TruffleString[]) o; + return PFactory.createBytes(language, (byte[]) o); + } else if (o instanceof TruffleString[] strings) { Object[] array = new Object[strings.length]; System.arraycopy(strings, 0, array, 0, strings.length); - return factory.createTuple(array); - } else if (o instanceof Object[]) { - Object[] objects = (Object[]) o; - return factory.createTuple(objects.clone()); + return PFactory.createTuple(language, array); + } else if (o instanceof Object[] objects) { + return PFactory.createTuple(language, objects.clone()); } // Ensure no conversion is missing - assert !IsForeignObjectNode.executeUncached(o); + assert !IsForeignObjectNode.executeUncached(o) : o; return o; } @@ -599,49 +628,10 @@ public boolean takesVarKeywordArgs() { } public Signature getSignature() { - return getSignature(null, InlinedConditionProfile.getUncached()); - } - - public Signature getSignature(Node inliningTarget, InlinedConditionProfile signatureProfile) { - if (signatureProfile.profile(inliningTarget, signature == null)) { - if (CompilerDirectives.isPartialEvaluationConstant(this)) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - } - if (callTarget == null) { - callTarget = initializeCallTarget(); - } - signature = initializeSignature(callTarget); - } - return signature; - } - - @TruffleBoundary - synchronized Signature initializeSignature(RootCallTarget rootCallTarget) { - assert PythonContext.get(null).ownsGil(); // otherwise this is racy - if (signature == null) { - if (rootCallTarget.getRootNode() instanceof PRootNode) { - signature = ((PRootNode) rootCallTarget.getRootNode()).getSignature(); - } else { - signature = Signature.createVarArgsAndKwArgsOnly(); - } - } return signature; } public RootCallTarget getRootCallTarget() { - if (callTarget == null) { - initializeCallTarget(); - } - return callTarget; - } - - @TruffleBoundary - synchronized RootCallTarget initializeCallTarget() { - assert PythonContext.get(null).ownsGil(); // otherwise this is racy - if (callTarget == null) { - callTarget = (RootCallTarget) callTargetSupplier.get(); - callTargetSupplier = null; - } return callTarget; } @@ -694,35 +684,33 @@ public String toString() { @TruffleBoundary public String toDisassembledString(boolean quickened) { RootNode rootNode = getRootCallTarget().getRootNode(); - if (rootNode instanceof PBytecodeGeneratorRootNode r) { + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER && rootNode instanceof PBytecodeDSLRootNode dslRoot) { + return dslRoot.getCodeUnit().toString(quickened); + } else if (rootNode instanceof PBytecodeGeneratorRootNode r) { rootNode = r.getBytecodeRootNode(); } else if (rootNode instanceof PBytecodeGeneratorFunctionRootNode r) { rootNode = r.getBytecodeRootNode(); } - if (rootNode instanceof PBytecodeRootNode) { - CodeUnit code = ((PBytecodeRootNode) rootNode).getCodeUnit(); - if (quickened) { - return code.toString(((PBytecodeRootNode) rootNode).getBytecode()); - } - return code.toString(); + if (rootNode instanceof PBytecodeRootNode bytecodeRootNode) { + return bytecodeRootNode.getCodeUnit().toString(quickened); } return J_EMPTY_STRING; } - private static PTuple createTuple(Object[] array, PythonObjectFactory factory) { + private static PTuple createTuple(PythonLanguage language, Object[] array) { Object[] data = array; if (data == null) { data = PythonUtils.EMPTY_OBJECT_ARRAY; } - return factory.createTuple(data); + return PFactory.createTuple(language, data); } - private static PBytes createBytes(byte[] array, PythonObjectFactory factory) { + private static PBytes createBytes(byte[] array, PythonLanguage language) { byte[] bytes = array; if (bytes == null) { bytes = PythonUtils.EMPTY_BYTE_ARRAY; } - return factory.createBytes(bytes); + return PFactory.createBytes(language, bytes); } public TruffleString co_name() { @@ -743,32 +731,32 @@ public TruffleString co_filename() { return fName; } - public PBytes co_code(PythonObjectFactory factory) { - return createBytes(this.getCodestring(), factory); + public PBytes co_code(PythonLanguage language) { + return createBytes(this.getCodestring(), language); } - public PBytes co_lnotab(PythonObjectFactory factory) { - return createBytes(this.getLinetable(), factory); + public PBytes co_lnotab(PythonLanguage language) { + return createBytes(this.getLinetable(), language); } - public PTuple co_consts(PythonObjectFactory factory) { - return createTuple(this.getConstants(), factory); + public PTuple co_consts(PythonLanguage language) { + return createTuple(language, this.getConstants()); } - public PTuple co_names(PythonObjectFactory factory) { - return createTuple(this.getNames(), factory); + public PTuple co_names(PythonLanguage language) { + return createTuple(language, this.getNames()); } - public PTuple co_varnames(PythonObjectFactory factory) { - return createTuple(this.getVarnames(), factory); + public PTuple co_varnames(PythonLanguage language) { + return createTuple(language, this.getVarnames()); } - public PTuple co_freevars(PythonObjectFactory factory) { - return createTuple(this.getFreeVars(), factory); + public PTuple co_freevars(PythonLanguage language) { + return createTuple(language, this.getFreeVars()); } - public PTuple co_cellvars(PythonObjectFactory factory) { - return createTuple(this.getCellVars(), factory); + public PTuple co_cellvars(PythonLanguage language) { + return createTuple(language, this.getCellVars()); } public int co_argcount() { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/BufferStorageNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/BufferStorageNodes.java index e9e3600b2d..4c5652bd89 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/BufferStorageNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/BufferStorageNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,6 +45,7 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.ints.PInt; @@ -58,8 +59,9 @@ import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.util.CastToJavaLongExactNode; import com.oracle.graal.python.nodes.util.CastToJavaUnsignedLongNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.BufferFormat; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Cached.Shared; @@ -125,12 +127,12 @@ static long unpackSignedLong(@SuppressWarnings("unused") BufferFormat format, Ob @Specialization(guards = "format == UINT_64") static Object unpackUnsignedLong(Node inliningTarget, @SuppressWarnings("unused") BufferFormat format, Object buffer, int offset, + @Bind PythonLanguage language, @Shared @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, - @Cached InlinedConditionProfile needsPIntProfile, - @Shared("factory") @Cached(inline = false) PythonObjectFactory factory) { + @Cached InlinedConditionProfile needsPIntProfile) { long signedLong = bufferLib.readLong(buffer, offset); if (needsPIntProfile.profile(inliningTarget, signedLong < 0)) { - return factory.createInt(PInt.longToUnsignedBigInteger(signedLong)); + return PFactory.createInt(language, PInt.longToUnsignedBigInteger(signedLong)); } else { return signedLong; } @@ -156,19 +158,19 @@ static boolean unpackBoolean(@SuppressWarnings("unused") BufferFormat format, Ob @Specialization(guards = "format == CHAR") static PBytes unpackChar(@SuppressWarnings("unused") BufferFormat format, Object buffer, int offset, - @Shared @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, - @Shared("factory") @Cached(inline = false) PythonObjectFactory factory) { - return factory.createBytes(new byte[]{bufferLib.readByte(buffer, offset)}); + @Bind PythonLanguage language, + @Shared @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib) { + return PFactory.createBytes(language, new byte[]{bufferLib.readByte(buffer, offset)}); } @Specialization(guards = "format == UNICODE") static TruffleString unpackUnicode(Node inliningTarget, @SuppressWarnings("unused") BufferFormat format, Object buffer, int offset, @Shared @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached(inline = false) TruffleString.FromCodePointNode fromCodePointNode) { int codePoint = bufferLib.readInt(buffer, offset); if (!Character.isValidCodePoint(codePoint)) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.UNMAPPABLE_CHARACTER); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.UNMAPPABLE_CHARACTER); } return fromCodePointNode.execute(codePoint, TS_ENCODING, true); } @@ -184,9 +186,9 @@ public abstract static class PackValueNode extends Node { @Specialization(guards = "format == UINT_8") static void packUnsignedByteInt(Node inliningTarget, @SuppressWarnings("unused") BufferFormat format, int value, Object buffer, int offset, @Shared @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { if (value < 0 || value > 0xFF) { - throw raiseNode.get(inliningTarget).raise(OverflowError); + throw raiseNode.raise(inliningTarget, OverflowError); } bufferLib.writeByte(buffer, offset, (byte) value); } @@ -195,10 +197,10 @@ static void packUnsignedByteInt(Node inliningTarget, @SuppressWarnings("unused") static void packUnsignedByteGeneric(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") BufferFormat format, Object object, Object buffer, int offset, @Shared @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @Shared @Cached PyNumberAsSizeNode asSizeNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { int value = asSizeNode.executeExact(frame, inliningTarget, object); if (value < 0 || value > 0xFF) { - throw raiseNode.get(inliningTarget).raise(OverflowError); + throw raiseNode.raise(inliningTarget, OverflowError); } bufferLib.writeByte(buffer, offset, (byte) value); } @@ -207,10 +209,10 @@ static void packUnsignedByteGeneric(VirtualFrame frame, Node inliningTarget, @Su static void packSignedByteGeneric(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") BufferFormat format, Object object, Object buffer, int offset, @Shared @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @Shared @Cached PyNumberAsSizeNode asSizeNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { int value = asSizeNode.executeExact(frame, inliningTarget, object); if (value < Byte.MIN_VALUE || value > Byte.MAX_VALUE) { - throw raiseNode.get(inliningTarget).raise(OverflowError); + throw raiseNode.raise(inliningTarget, OverflowError); } bufferLib.writeByte(buffer, offset, (byte) value); } @@ -219,10 +221,10 @@ static void packSignedByteGeneric(VirtualFrame frame, Node inliningTarget, @Supp static void packSignedShortGeneric(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") BufferFormat format, Object object, Object buffer, int offset, @Shared @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @Shared @Cached PyNumberAsSizeNode asSizeNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { int value = asSizeNode.executeExact(frame, inliningTarget, object); if (value < Short.MIN_VALUE || value > Short.MAX_VALUE) { - throw raiseNode.get(inliningTarget).raise(OverflowError); + throw raiseNode.raise(inliningTarget, OverflowError); } bufferLib.writeShort(buffer, offset, (short) value); } @@ -231,10 +233,10 @@ static void packSignedShortGeneric(VirtualFrame frame, Node inliningTarget, @Sup static void packUnsignedShortGeneric(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") BufferFormat format, Object object, Object buffer, int offset, @Shared @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @Shared @Cached PyNumberAsSizeNode asSizeNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { int value = asSizeNode.executeExact(frame, inliningTarget, object); if (value < 0 || value > (Short.MAX_VALUE << 1) + 1) { - throw raiseNode.get(inliningTarget).raise(OverflowError); + throw raiseNode.raise(inliningTarget, OverflowError); } bufferLib.writeShort(buffer, offset, (short) value); } @@ -258,10 +260,10 @@ static void packUnsignedIntGeneric(VirtualFrame frame, Node inliningTarget, @Sup @Shared @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @Shared @Cached PyNumberIndexNode indexNode, @Shared @Cached CastToJavaLongExactNode castToLong, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { long value = castToLong.execute(inliningTarget, indexNode.execute(frame, inliningTarget, object)); if (value < 0 || value > ((long) (Integer.MAX_VALUE) << 1L) + 1L) { - throw raiseNode.get(inliningTarget).raise(OverflowError); + throw raiseNode.raise(inliningTarget, OverflowError); } bufferLib.writeInt(buffer, offset, (int) value); } @@ -301,19 +303,19 @@ static void packDouble(VirtualFrame frame, Node inliningTarget, @SuppressWarning } @Specialization(guards = "format == BOOLEAN") - static void packBoolean(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") BufferFormat format, Object object, Object buffer, int offset, + static void packBoolean(VirtualFrame frame, @SuppressWarnings("unused") BufferFormat format, Object object, Object buffer, int offset, @Shared @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @Cached PyObjectIsTrueNode isTrue) { - byte value = isTrue.execute(frame, inliningTarget, object) ? (byte) 1 : (byte) 0; + byte value = isTrue.execute(frame, object) ? (byte) 1 : (byte) 0; bufferLib.writeByte(buffer, offset, value); } @Specialization(guards = "format == CHAR") static void packChar(Node inliningTarget, @SuppressWarnings("unused") BufferFormat format, PBytes object, Object buffer, int offset, @Shared @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { if (bufferLib.getBufferLength(object) != 1) { - throw raiseNode.get(inliningTarget).raise(OverflowError); + throw raiseNode.raise(inliningTarget, OverflowError); } byte value = bufferLib.readByte(object, 0); bufferLib.writeByte(buffer, offset, value); @@ -321,9 +323,8 @@ static void packChar(Node inliningTarget, @SuppressWarnings("unused") BufferForm @Specialization(guards = {"format == CHAR", "!isPBytes(object)"}) @SuppressWarnings("unused") - static void packChar(Node inliningTarget, BufferFormat format, Object object, Object buffer, int offset, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - throw raiseNode.get(inliningTarget).raise(TypeError); + static void packChar(Node inliningTarget, BufferFormat format, Object object, Object buffer, int offset) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError); } @Specialization(guards = "format == UNICODE") @@ -332,13 +333,13 @@ static void packDouble(Node inliningTarget, @SuppressWarnings("unused") BufferFo @Cached StringNodes.CastToTruffleStringCheckedNode cast, @Cached(inline = false) TruffleString.CodePointLengthNode codePointLengthNode, @Cached(inline = false) TruffleString.CodePointAtIndexNode codePointAtIndexNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { TruffleString str = cast.cast(inliningTarget, object, ErrorMessages.ARRAY_ITEM_MUST_BE_UNICODE); if (codePointLengthNode.execute(str, TS_ENCODING) == 1) { int codePoint = codePointAtIndexNode.execute(str, 0, TS_ENCODING); bufferLib.writeInt(buffer, offset, codePoint); } else { - throw raiseNode.get(inliningTarget).raise(TypeError); + throw raiseNode.raise(inliningTarget, TypeError); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/DynamicObjectStorage.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/DynamicObjectStorage.java index fab601ee85..808297aad0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/DynamicObjectStorage.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/DynamicObjectStorage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -125,6 +125,7 @@ protected static Object[] keyArray(DynamicObjectStorage self) { return DynamicObjectStorage.keyArray(self.store.getShape()); } + @TruffleBoundary protected static Object[] keyArray(Shape shape) { return shape.getKeyList().toArray(); } @@ -235,14 +236,14 @@ static Object notString(Frame frame, DynamicObjectStorage self, Object key, long @Shared("readKey") @Cached ReadAttributeFromPythonObjectNode readKey, @Exclusive @Cached("self.store.getShape()") Shape cachedShape, @Exclusive @Cached(value = "keyArray(cachedShape)", dimensions = 1) Object[] keyList, - @Shared("eqNode") @Cached PyObjectRichCompareBool.EqNode eqNode, + @Shared("eqNode") @Cached PyObjectRichCompareBool eqNode, @Shared("hashNode") @Cached PyObjectHashNode hashNode, @Shared("noValueProfile") @Cached InlinedConditionProfile noValueProfile) { long hash = hashIn == -1 ? hashNode.execute(frame, inliningTarget, key) : hashIn; for (Object currentKey : keyList) { if (currentKey instanceof TruffleString) { long keyHash = hashNode.execute(frame, inliningTarget, currentKey); - if (keyHash == hash && eqNode.compare(frame, inliningTarget, key, currentKey)) { + if (keyHash == hash && eqNode.executeEq(frame, inliningTarget, key, currentKey)) { return string(inliningTarget, self, (TruffleString) currentKey, -1, readKey, noValueProfile); } } @@ -254,7 +255,7 @@ static Object notString(Frame frame, DynamicObjectStorage self, Object key, long static Object notStringLoop(Frame frame, DynamicObjectStorage self, Object key, long hashIn, @Bind("this") Node inliningTarget, @Shared("readKey") @Cached ReadAttributeFromPythonObjectNode readKey, - @Shared("eqNode") @Cached PyObjectRichCompareBool.EqNode eqNode, + @Shared("eqNode") @Cached PyObjectRichCompareBool eqNode, @Shared("hashNode") @Cached PyObjectHashNode hashNode, @Shared("noValueProfile") @Cached InlinedConditionProfile noValueProfile) { long hash = hashIn == -1 ? hashNode.execute(frame, inliningTarget, key) : hashIn; @@ -263,7 +264,7 @@ static Object notStringLoop(Frame frame, DynamicObjectStorage self, Object key, Object currentKey = getNext(keys); if (currentKey instanceof TruffleString) { long keyHash = hashNode.execute(frame, inliningTarget, currentKey); - if (keyHash == hash && eqNode.compare(frame, inliningTarget, key, currentKey)) { + if (keyHash == hash && eqNode.executeEq(frame, inliningTarget, key, currentKey)) { return string(inliningTarget, self, (TruffleString) currentKey, -1, readKey, noValueProfile); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/EconomicMapStorage.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/EconomicMapStorage.java index d6943f1508..0fce48416a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/EconomicMapStorage.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/EconomicMapStorage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -50,6 +50,7 @@ import com.oracle.graal.python.builtins.objects.common.ObjectHashMap.DictKey; import com.oracle.graal.python.builtins.objects.common.ObjectHashMap.MapCursor; import com.oracle.graal.python.builtins.objects.common.ObjectHashMap.PutNode; +import com.oracle.graal.python.builtins.objects.common.ObjectHashMap.PutUnsafeNode; import com.oracle.graal.python.lib.PyObjectHashNode; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; @@ -131,11 +132,15 @@ void clear() { map.clear(); } + public boolean mapIsEqualTo(ObjectHashMap other) { + return other == this.map; + } + public HashingStorage copy() { return new EconomicMapStorage(this.map, true); } - protected void setValueForAllKeys(VirtualFrame frame, Node inliningTarget, Object value, PutNode putNode, InlinedLoopConditionProfile loopProfile) { + protected void setValueForAllKeys(VirtualFrame frame, Node inliningTarget, Object value, PutUnsafeNode putNode, InlinedLoopConditionProfile loopProfile) { MapCursor cursor = map.getEntries(); final int size = map.size(); loopProfile.profileCounted(inliningTarget, size); @@ -147,26 +152,23 @@ protected void setValueForAllKeys(VirtualFrame frame, Node inliningTarget, Objec @TruffleBoundary public void putUncached(TruffleString key, Object value) { - ObjectHashMap.PutNode.putUncached(this.map, key, PyObjectHashNode.hash(key, HashCodeNode.getUncached()), value); - } - - private void putUncached(Object key, Object value) { - ObjectHashMap.PutNode.putUncached(this.map, key, PyObjectHashNode.executeUncached(key), value); + PutUnsafeNode.putUncached(this.map, key, PyObjectHashNode.hash(key, HashCodeNode.getUncached()), value); } - // Solves boot-order problem, do not use in normal code or during startup when __eq__ of - // builtins may not be properly set-up - public void putUncachedWithJavaEq(Object key, long keyHash, Object value) { - ObjectHashMap.PutNode.putUncachedWithJavaEq(this.map, key, keyHash, value); + @TruffleBoundary + public void putUncached(Object key, Object value) { + PutNode.getUncached().execute(null, null, this.map, key, PyObjectHashNode.executeUncached(key), value); } - public void putUncachedWithJavaEq(TruffleString key, Object value) { - putUncachedWithJavaEq(key, PyObjectHashNode.hash(key, HashCodeNode.getUncached()), value); + @TruffleBoundary + public void putUncached(int key, Object value) { + PutUnsafeNode.putUncached(this.map, key, PyObjectHashNode.hash(key), value); } - public void putUncachedWithJavaEq(String key, Object value) { + @TruffleBoundary + public void putUncached(String key, Object value) { TruffleString ts = toTruffleStringUncached(key); - putUncachedWithJavaEq(ts, value); + putUncached(ts, value); } private static void putAllUncached(LinkedHashMap map, EconomicMapStorage result) { @@ -212,7 +214,7 @@ public abstract static class EconomicMapSetStringKey extends SpecializedSetStrin @Specialization static void doIt(Node inliningTarget, HashingStorage self, TruffleString key, Object value, @Cached PyObjectHashNode hashNode, - @Cached PutNode putNode) { + @Cached PutUnsafeNode putNode) { putNode.put(null, inliningTarget, ((EconomicMapStorage) self).map, key, hashNode.execute(null, inliningTarget, key), value); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/ForeignHashingStorage.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/ForeignHashingStorage.java new file mode 100644 index 0000000000..9aee630703 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/ForeignHashingStorage.java @@ -0,0 +1,275 @@ +/* + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.builtins.objects.common; + +import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError; +import static com.oracle.graal.python.runtime.exception.PythonErrorType.KeyError; +import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; + +import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PNodeWithContext; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.interop.PForeignToPTypeNode; +import com.oracle.graal.python.nodes.object.IsForeignObjectNode; +import com.oracle.graal.python.runtime.GilNode; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.StopIterationException; +import com.oracle.truffle.api.interop.UnknownKeyException; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.interop.UnsupportedTypeException; +import com.oracle.truffle.api.library.CachedLibrary; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; + +/* + * NOTE: We are not using IndirectCallContext here in this file because it seems unlikely that these interop messages + * would call back to Python and that we would also need precise frame info for that case. + * Adding it shouldn't hurt peak, but might be a non-trivial overhead in interpreter. + */ +public final class ForeignHashingStorage extends HashingStorage { + + public final Object foreignDict; + + public ForeignHashingStorage(Object foreignDict) { + assert IsForeignObjectNode.executeUncached(foreignDict); + assert InteropLibrary.getUncached().hasHashEntries(foreignDict); + this.foreignDict = foreignDict; + } + + @GenerateUncached + @GenerateInline + @GenerateCached(false) + public abstract static class LengthNode extends PNodeWithContext { + public abstract int execute(Node inliningTarget, ForeignHashingStorage storage); + + @InliningCutoff + @Specialization + static int length(Node inliningTarget, ForeignHashingStorage storage, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop, + @Cached(inline = false) GilNode gil, + @Cached InlinedBranchProfile errorProfile) { + long size; + gil.release(true); + try { + size = interop.getHashSize(storage.foreignDict); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } finally { + gil.acquire(); + } + + return PInt.long2int(inliningTarget, size, errorProfile); + } + } + + @GenerateUncached + @GenerateInline + @GenerateCached(false) + public abstract static class GetNode extends PNodeWithContext { + public abstract Object execute(Node inliningTarget, ForeignHashingStorage storage, Object key); + + @InliningCutoff + @Specialization + static Object get(Node inliningTarget, ForeignHashingStorage storage, Object key, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop, + @Cached(inline = false) GilNode gil, + @Cached(inline = false) PForeignToPTypeNode toPythonNode, + @Cached PRaiseNode raiseNode) { + var dict = storage.foreignDict; + Object value; + gil.release(true); + try { + value = interop.readHashValue(dict, key); + } catch (UnknownKeyException e) { + return null; + } catch (UnsupportedMessageException e) { + throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.ATTR_S_OF_S_OBJ_IS_NOT_READABLE, key, dict); + } finally { + gil.acquire(); + } + + return toPythonNode.executeConvert(value); + } + } + + @GenerateUncached + @GenerateInline + @GenerateCached(false) + public abstract static class PutNode extends PNodeWithContext { + public abstract void execute(Node inliningTarget, ForeignHashingStorage storage, Object key, Object value); + + @InliningCutoff + @Specialization + static void put(Node inliningTarget, ForeignHashingStorage storage, Object key, Object value, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop, + @Cached(inline = false) GilNode gil, + @Cached PRaiseNode raiseNode) { + var dict = storage.foreignDict; + gil.release(true); + try { + interop.writeHashEntry(dict, key, value); + } catch (UnknownKeyException e) { + throw raiseNode.raise(inliningTarget, KeyError, new Object[]{key}); + } catch (UnsupportedMessageException e) { + if (interop.isHashEntryExisting(dict, key)) { + throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.ATTR_S_OF_S_OBJ_IS_NOT_WRITABLE, key, dict); + } else { + throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.ATTR_S_OF_S_OBJ_IS_NOT_INSERTABLE, key, dict); + } + } catch (UnsupportedTypeException e) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.TYPE_P_NOT_SUPPORTED_BY_FOREIGN_OBJ, value); + } finally { + gil.acquire(); + } + } + } + + @GenerateUncached + @GenerateInline + @GenerateCached(false) + public abstract static class RemoveNode extends PNodeWithContext { + public abstract boolean execute(Node inliningTarget, ForeignHashingStorage storage, Object key); + + @InliningCutoff + @Specialization + static boolean remove(Node inliningTarget, ForeignHashingStorage storage, Object key, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop, + @Cached(inline = false) GilNode gil, + @Cached PRaiseNode raiseNode) { + var dict = storage.foreignDict; + + gil.release(true); + try { + interop.removeHashEntry(dict, key); + } catch (UnknownKeyException e) { + return false; + } catch (UnsupportedMessageException e) { + throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.ATTR_S_OF_S_OBJ_IS_NOT_REMOVABLE, key, dict); + } finally { + gil.acquire(); + } + + return true; + } + } + + @GenerateUncached + @GenerateInline + @GenerateCached(false) + public abstract static class PopNode extends PNodeWithContext { + public abstract Object execute(Node inliningTarget, ForeignHashingStorage storage, Object key); + + @InliningCutoff + @Specialization + static Object pop(Node inliningTarget, ForeignHashingStorage storage, Object key, + @Cached GetNode getNode, + @Cached RemoveNode removeNode, + @Cached(inline = false) PForeignToPTypeNode toPythonNode) { + Object value = getNode.execute(inliningTarget, storage, key); + + if (!removeNode.execute(inliningTarget, storage, key)) { + return null; + } + + return toPythonNode.executeConvert(value); + } + } + + @GenerateUncached + @GenerateInline + @GenerateCached(false) + public abstract static class ClearNode extends PNodeWithContext { + public abstract void execute(Node inliningTarget, ForeignHashingStorage storage); + + @Specialization + static void clear(Node inliningTarget, ForeignHashingStorage storage, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop, + @Cached(inline = false) GilNode gil, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary iteratorInterop, + @Cached PRaiseNode raiseNode) { + // We cannot just remove while iterating otherwise we get e.g. + // ConcurrentModificationException with java.util.HashMap + // So we remove keys by batch of 32 keys. + gil.release(true); + try { + Object[] keys = new Object[32]; + int i; + do { + i = 0; + var iterator = interop.getHashKeysIterator(storage.foreignDict); + while (i < keys.length && iteratorInterop.hasIteratorNextElement(iterator)) { + var key = iteratorInterop.getIteratorNextElement(iterator); + keys[i++] = key; + } + + for (int k = 0; k < i; k++) { + remove(inliningTarget, storage.foreignDict, keys[k], interop, raiseNode); + } + } while (i == keys.length); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } catch (StopIterationException e) { + // continue + } finally { + gil.acquire(); + } + } + + private static void remove(Node inliningTarget, Object dict, Object key, InteropLibrary interop, PRaiseNode raiseNode) { + try { + interop.removeHashEntry(dict, key); + } catch (UnknownKeyException e) { + // already removed concurrently + } catch (UnsupportedMessageException e) { + throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.ATTR_S_OF_S_OBJ_IS_NOT_REMOVABLE, key, dict); + } + } + } + +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/FormatNodeBase.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/FormatNodeBase.java index c29dde81fc..23a122ad6d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/FormatNodeBase.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/FormatNodeBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,27 +40,23 @@ */ package com.oracle.graal.python.builtins.objects.common; -import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; +import com.oracle.graal.python.lib.PyObjectStrAsObjectNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; +@GenerateCached(false) public abstract class FormatNodeBase extends PythonBinaryClinicBuiltinNode { - @Override - protected ArgumentClinicProvider getArgumentClinic() { - // must be implemented here, because DSL creates a generated node for this class - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new AbstractMethodError(); - } - // applies to all types: empty format string => use __str__ @Specialization(guards = "formatString.isEmpty()") public static Object formatEmptyString(VirtualFrame frame, Object self, @SuppressWarnings("unused") TruffleString formatString, - @Cached("create(Str)") LookupAndCallUnaryNode lookupAndCallNode) { - return lookupAndCallNode.executeObject(frame, self); + @Bind Node inliningTarget, + @Cached PyObjectStrAsObjectNode str) { + return str.execute(frame, inliningTarget, self); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/HashingCollectionNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/HashingCollectionNodes.java index c5765c54a1..edd88d1e13 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/HashingCollectionNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/HashingCollectionNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -51,15 +51,18 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIteratorKey; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIteratorNext; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItem; +import com.oracle.graal.python.builtins.objects.common.ObjectHashMap.PutUnsafeNode; +import com.oracle.graal.python.builtins.objects.dict.DictNodes; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.dict.PDictView; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.builtins.objects.set.PBaseSet; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -85,18 +88,20 @@ public abstract class HashingCollectionNodes { @GenerateCached @ImportStatic(PGuards.class) public abstract static class SetItemNode extends PNodeWithContext { - public abstract void execute(Frame frame, Node inliningTarget, PHashingCollection c, Object key, Object value); + public abstract void execute(Frame frame, Node inliningTarget, Object c, Object key, Object value); - public final void executeCached(Frame frame, PHashingCollection c, Object key, Object value) { + public final void executeCached(Frame frame, Object c, Object key, Object value) { execute(frame, this, c, key, value); } @Specialization - static void doSetItem(Frame frame, Node inliningTarget, PHashingCollection c, Object key, Object value, + static void doSetItem(Frame frame, Node inliningTarget, Object c, Object key, Object value, + @Cached DictNodes.GetDictStorageNode getStorageNode, + @Cached DictNodes.UpdateDictStorageNode updateStorageNode, @Cached HashingStorageSetItem setItem) { - HashingStorage storage = c.getDictStorage(); - storage = setItem.execute(frame, inliningTarget, storage, key, value); - c.setDictStorage(storage); + var storage = getStorageNode.execute(inliningTarget, c); + var newStorage = setItem.execute(frame, inliningTarget, storage, key, value); + updateStorageNode.execute(inliningTarget, c, storage, newStorage); } @NeverDefault @@ -118,8 +123,8 @@ abstract static class SetValueHashingStorageNode extends PNodeWithContext { @Specialization static HashingStorage doEconomicStorage(VirtualFrame frame, Node inliningTarget, EconomicMapStorage map, Object value, - @Cached ObjectHashMap.PutNode putNode, - @Cached InlinedLoopConditionProfile loopProfile) { + @Shared("putNode") @Cached PutUnsafeNode putNode, + @Shared("loopProfile") @Cached InlinedLoopConditionProfile loopProfile) { // We want to avoid calling __hash__() during map.put map.setValueForAllKeys(frame, inliningTarget, value, putNode, loopProfile); return map; @@ -131,14 +136,25 @@ static HashingStorage doGeneric(VirtualFrame frame, Node inliningTarget, Hashing @Cached HashingStorageSetItem setItem, @Cached HashingStorageGetIterator getIterator, @Cached HashingStorageIteratorNext itNext, - @Cached HashingStorageIteratorKey itKey) { + @Cached HashingStorageIteratorKey itKey, + @Shared("putNode") @Cached PutUnsafeNode putNode, + @Shared("loopProfile") @Cached InlinedLoopConditionProfile loopProfile) { HashingStorageIterator it = getIterator.execute(inliningTarget, map); - HashingStorage storage = map; while (itNext.execute(inliningTarget, map, it)) { - Object key = itKey.execute(inliningTarget, storage, it); - storage = setItem.execute(frame, inliningTarget, storage, key, value); + Object key = itKey.execute(inliningTarget, map, it); + HashingStorage newStorage = setItem.execute(frame, inliningTarget, map, key, value); + if (newStorage != map) { + // when the storage changes, the iterator state is not a reliable cursor + // anymore and we need to restart. + if (newStorage instanceof EconomicMapStorage mapStorage) { + mapStorage.setValueForAllKeys(frame, inliningTarget, value, putNode, loopProfile); + return mapStorage; + } else { + throw CompilerDirectives.shouldNotReachHere("We only generalize to EconomicMapStorage"); + } + } } - return storage; + return map; } protected static boolean isEconomicMapStorage(Object o) { @@ -147,43 +163,63 @@ protected static boolean isEconomicMapStorage(Object o) { } /** - * Gets clone of the keys of the storage with all values either set to given value or with no - * guarantees about the values if {@link PNone#NO_VALUE} is passed as {@code value}. + * Gets clone of the keys of the storage with all values set to given value or (when used to + * create a set or frozenset) to NO_VALUE. */ @GenerateInline(inlineByDefault = true) public abstract static class GetClonedHashingStorageNode extends PNodeWithContext { - public abstract HashingStorage execute(VirtualFrame frame, Node inliningTarget, Object iterator, Object value); + protected abstract HashingStorage execute(VirtualFrame frame, Node inliningTarget, Object iterator, Object value); + + /** + * Gets clone of the keys of the storage with all values either set to given value or, if + * that is PNone.NO_VALUE, all values set to PNone.NONE. Use this method to clone into a + * dict or other object where the values may be accessible from Python to avoid a) + * PNone.NO_VALUE leaking to Python. + */ + public final HashingStorage getForDictionaries(VirtualFrame frame, Node inliningTarget, Object iterator, Object value) { + return execute(frame, inliningTarget, iterator, value == PNone.NO_VALUE ? PNone.NONE : value); + } - public final HashingStorage doNoValue(VirtualFrame frame, Node inliningTarget, Object iterator) { + /** + * Gets a clone of the keys of the storage with all values set to NO_VALUE. This must be + * used *only* to create new storages for use in sets and frozensets where the values cannot + * be accessed from user code. + */ + public final HashingStorage getForSets(VirtualFrame frame, Node inliningTarget, Object iterator) { return execute(frame, inliningTarget, iterator, PNone.NO_VALUE); } - public final HashingStorage doNoValueCached(VirtualFrame frame, Object iterator) { + /** + * IMPORTANT: Only for sets and frozensets. + * + * @see #getForSets(VirtualFrame, Node, Object) + */ + public final HashingStorage getForSetsCached(VirtualFrame frame, Object iterator) { return execute(frame, null, iterator, PNone.NO_VALUE); } - @Specialization(guards = "isNoValue(value)") - static HashingStorage doHashingCollectionNoValue(Node inliningTarget, PHashingCollection other, @SuppressWarnings("unused") Object value, - @Shared("copyNode") @Cached HashingStorageCopy copyNode) { + // This for cloning sets (we come here from doNoValue or doNoValueCached). If we clone from + // some other PHashingCollection, we would hold on to keys in the sets, and if we were to + // clone for some other PHashingCollection (not PBaseSet), we might leak NO_VALUE into user + // code. + @Specialization(guards = "isNoValue(givenValue)") + static HashingStorage doSet(Node inliningTarget, PBaseSet other, @SuppressWarnings("unused") Object givenValue, + @Cached HashingStorageCopy copyNode) { return copyNode.execute(inliningTarget, other.getDictStorage()); } - @Specialization(guards = "isNoValue(value)") - static HashingStorage doPDictKeyViewNoValue(Node inliningTarget, PDictView.PDictKeysView other, Object value, - @Shared("copyNode") @Cached HashingStorageCopy copyNode) { - return doHashingCollectionNoValue(inliningTarget, other.getWrappedDict(), value, copyNode); - } - - @Specialization(guards = "!isNoValue(value)") - static HashingStorage doHashingCollection(VirtualFrame frame, PHashingCollection other, Object value, + @Specialization(replaces = "doSet") + static HashingStorage doHashingCollection(VirtualFrame frame, PHashingCollection other, Object givenValue, @Shared @Cached(inline = false) GetClonedHashingCollectionNode hashingCollectionNode) { - return hashingCollectionNode.execute(frame, other, value); + Object value = givenValue == PNone.NO_VALUE ? PNone.NONE : givenValue; + return hashingCollectionNode.execute(frame, other.getDictStorage(), value); } - @Specialization(guards = "!isNoValue(value)") - static HashingStorage doPDictView(VirtualFrame frame, PDictView.PDictKeysView other, Object value, + @Specialization + static HashingStorage doPDictView(VirtualFrame frame, PDictView.PDictKeysView other, Object givenValue, @Shared @Cached(inline = false) GetClonedHashingCollectionNode hashingCollectionNode) { - return hashingCollectionNode.execute(frame, other.getWrappedDict(), value); + Object value = givenValue == PNone.NO_VALUE ? PNone.NONE : givenValue; + return hashingCollectionNode.execute(frame, other.getWrappedStorage(), value); } @Specialization(guards = "isString(strObj)") @@ -212,8 +248,7 @@ static HashingStorage doString(Node inliningTarget, Object strObj, Object value, @InliningCutoff static HashingStorage doIterable(VirtualFrame frame, Node inliningTarget, Object other, Object value, @Cached PyObjectGetIter getIter, - @Cached(inline = false) GetNextNode nextNode, - @Cached IsBuiltinObjectProfile errorProfile, + @Cached PyIterNextNode nextNode, @Exclusive @Cached HashingStorageSetItem setStorageItem) { HashingStorage curStorage = EmptyStorage.INSTANCE; Object iterator = getIter.execute(frame, inliningTarget, other); @@ -221,9 +256,8 @@ static HashingStorage doIterable(VirtualFrame frame, Node inliningTarget, Object while (true) { Object key; try { - key = nextNode.execute(frame, iterator); - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); + key = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { return curStorage; } curStorage = setStorageItem.execute(frame, inliningTarget, curStorage, key, val); @@ -237,15 +271,15 @@ public static GetClonedHashingStorageNode create() { @GenerateInline(false) // Intentionally lazy abstract static class GetClonedHashingCollectionNode extends Node { - abstract HashingStorage execute(VirtualFrame frame, PHashingCollection other, Object value); + abstract HashingStorage execute(VirtualFrame frame, HashingStorage other, Object value); @Specialization - static HashingStorage doHashingCollection(VirtualFrame frame, PHashingCollection other, Object value, + static HashingStorage doHashingCollection(VirtualFrame frame, HashingStorage other, Object value, @Bind("this") Node inliningTarget, @Cached SetValueHashingStorageNode setValue, @Cached HashingStorageCopy copyNode) { assert !PGuards.isNoValue(value); - HashingStorage storage = copyNode.execute(inliningTarget, other.getDictStorage()); + HashingStorage storage = copyNode.execute(inliningTarget, other); storage = setValue.execute(frame, inliningTarget, storage, value); return storage; } @@ -255,6 +289,8 @@ static HashingStorage doHashingCollection(VirtualFrame frame, PHashingCollection /** * Returns {@link HashingStorage} with the same keys as the given iterator. There is no * guarantee about the values! + * + * @see com.oracle.graal.python.builtins.objects.dict.DictNodes.GetDictStorageNode */ @GenerateInline(inlineByDefault = true) public abstract static class GetSetStorageNode extends PNodeWithContext { @@ -272,14 +308,14 @@ static HashingStorage doHashingCollection(PHashingCollection other) { @Specialization static HashingStorage doPDictView(PDictView.PDictKeysView other) { - return other.getWrappedDict().getDictStorage(); + return other.getWrappedStorage(); } @Specialization(guards = {"!isPHashingCollection(other)", "!isDictKeysView(other)"}) @InliningCutoff static HashingStorage doGeneric(VirtualFrame frame, Node inliningTarget, Object other, @Cached GetClonedHashingStorageNode getHashingStorageNode) { - return getHashingStorageNode.doNoValue(frame, inliningTarget, other); + return getHashingStorageNode.getForSets(frame, inliningTarget, other); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/HashingStorage.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/HashingStorage.java index 2ee0284555..9f5ab122b3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/HashingStorage.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/HashingStorage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,11 +40,9 @@ */ package com.oracle.graal.python.builtins.objects.common; -import static com.oracle.graal.python.builtins.objects.function.PKeyword.EMPTY_KEYWORDS; import static com.oracle.graal.python.nodes.SpecialMethodNames.T_KEYS; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; -import static com.oracle.graal.python.util.PythonUtils.EMPTY_OBJECT_ARRAY; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.common.HashingStorageFactory.InitNodeGen; @@ -54,6 +52,8 @@ import com.oracle.graal.python.builtins.objects.common.SequenceNodes.LenNode; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.function.PKeyword; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.lib.IteratorExhausted; import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyObjectGetItem; import com.oracle.graal.python.lib.PyObjectGetIter; @@ -61,9 +61,8 @@ import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; import com.oracle.graal.python.nodes.builtins.ListNodes.FastConstructListNode; -import com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode; +import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.exception.PException; @@ -102,20 +101,20 @@ static HashingStorage doKeywords(@SuppressWarnings("unused") PNone iterable, PKe return new KeywordsStorage(kwargs); } - @Specialization(guards = {"isEmpty(kwargs)", "hasBuiltinDictIter(inliningTarget, dict, getClassNode, lookupIter)"}) + @Specialization(guards = {"isEmpty(kwargs)", "hasBuiltinDictIter(inliningTarget, dict, getClassNode, getSlots)"}) static HashingStorage doPDict(PDict dict, @SuppressWarnings("unused") PKeyword[] kwargs, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, + @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode.GetPythonObjectClassNode getClassNode, - @SuppressWarnings("unused") @Shared @Cached(parameters = "Iter") LookupCallableSlotInMRONode lookupIter, + @SuppressWarnings("unused") @Shared @Cached GetCachedTpSlotsNode getSlots, @Shared @Cached HashingStorageCopy copyNode) { return copyNode.execute(inliningTarget, dict.getDictStorage()); } - @Specialization(guards = {"!isEmpty(kwargs)", "hasBuiltinDictIter(inliningTarget, dict, getClassNode, lookupIter)"}) + @Specialization(guards = {"!isEmpty(kwargs)", "hasBuiltinDictIter(inliningTarget, dict, getClassNode, getSlots)"}) static HashingStorage doPDictKwargs(VirtualFrame frame, PDict dict, PKeyword[] kwargs, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, + @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode.GetPythonObjectClassNode getClassNode, - @SuppressWarnings("unused") @Shared @Cached(parameters = "Iter") LookupCallableSlotInMRONode lookupIter, + @SuppressWarnings("unused") @Shared @Cached GetCachedTpSlotsNode getSlots, @Shared @Cached HashingStorageCopy copyNode, @Exclusive @Cached HashingStorageAddAllToOther addAllToOther) { HashingStorage iterableDictStorage = dict.getDictStorage(); @@ -183,12 +182,11 @@ public static HashingStorage addKeyValuesToStorage(VirtualFrame frame, ArrayBuil return storage; } - public static HashingStorage addKeyValuesToStorage(VirtualFrame frame, PDict self, Object other, Object keyAttr, + public static HashingStorage addKeyValuesToStorage(VirtualFrame frame, HashingStorage storage, Object other, Object keyAttr, Node inliningTarget, ObjectToArrayPairNode toArrayPair, HashingStorageSetItem setItem) { ArrayBuilder elements = toArrayPair.execute(frame, other, keyAttr); - HashingStorage storage = self.getDictStorage(); return addKeyValuesToStorage(frame, elements, storage, inliningTarget, setItem); } @@ -209,15 +207,20 @@ public abstract static class ObjectToArrayPairNode extends PNodeWithContext { static ArrayBuilder partialMerge(VirtualFrame frame, Object mapping, Object keyAttr, @Bind("this") Node inliningTarget, @Shared @Cached PyObjectGetIter getIter, - @Shared @Cached(neverDefault = false) PyIterNextNode nextNode, + @Shared @Cached PyIterNextNode nextNode, @Shared @Cached PyObjectGetItem getItemNode, - @Cached CallVarargsMethodNode callKeysMethod) { + @Cached CallNode callKeysMethod) { // We don't need to pass self as the attribute object has it already. - Object keysIterable = callKeysMethod.execute(frame, keyAttr, EMPTY_OBJECT_ARRAY, EMPTY_KEYWORDS); + Object keysIterable = callKeysMethod.execute(frame, keyAttr); Object keysIt = getIter.execute(frame, inliningTarget, keysIterable); ArrayBuilder elements = new ArrayBuilder<>(); - Object keyObj; - while ((keyObj = nextNode.execute(frame, keysIt)) != null) { + while (true) { + Object keyObj; + try { + keyObj = nextNode.execute(frame, inliningTarget, keysIt); + } catch (IteratorExhausted e) { + break; + } Object valueObj = getItemNode.execute(frame, inliningTarget, mapping, keyObj); elements.add(new KeyValue(keyObj, valueObj)); } @@ -229,19 +232,24 @@ static ArrayBuilder partialMerge(VirtualFrame frame, Object mapping, O static ArrayBuilder partialMergeFromSeq2(VirtualFrame frame, Object iterable, @SuppressWarnings("unused") PNone keyAttr, @Bind("this") Node inliningTarget, @Shared @Cached PyObjectGetIter getIter, - @Shared @Cached(neverDefault = false) PyIterNextNode nextNode, + @Shared @Cached PyIterNextNode nextNode, @Shared @Cached PyObjectGetItem getItemNode, @Cached FastConstructListNode createListNode, @Cached LenNode seqLenNode, - @Cached PRaiseNode.Lazy raise, + @Cached PRaiseNode raise, @Cached InlinedConditionProfile lengthTwoProfile, @Cached IsBuiltinObjectProfile isTypeErrorProfile) throws PException { Object it = getIter.execute(frame, inliningTarget, iterable); ArrayBuilder elements = new ArrayBuilder<>(); - Object next; int len = 2; try { - while ((next = nextNode.execute(frame, it)) != null) { + while (true) { + Object next; + try { + next = nextNode.execute(frame, inliningTarget, it); + } catch (IteratorExhausted e) { + break; + } PSequence element = createListNode.execute(frame, inliningTarget, next); assert element != null; // This constructs a new list using the builtin type. So, the object cannot @@ -249,7 +257,7 @@ static ArrayBuilder partialMergeFromSeq2(VirtualFrame frame, Object it len = seqLenNode.execute(inliningTarget, element); if (lengthTwoProfile.profile(inliningTarget, len != 2)) { - throw raise.get(inliningTarget).raise(ValueError, ErrorMessages.DICT_UPDATE_SEQ_ELEM_HAS_LENGTH_2_REQUIRED, elements.size(), len); + throw raise.raise(inliningTarget, ValueError, ErrorMessages.DICT_UPDATE_SEQ_ELEM_HAS_LENGTH_2_REQUIRED, elements.size(), len); } Object key = getItemNode.execute(frame, inliningTarget, element, 0); Object value = getItemNode.execute(frame, inliningTarget, element, 1); @@ -258,7 +266,7 @@ static ArrayBuilder partialMergeFromSeq2(VirtualFrame frame, Object it } catch (PException e) { if (!lengthTwoProfile.profile(inliningTarget, len != 2) && isTypeErrorProfile.profileException(inliningTarget, e, TypeError)) { - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.CANNOT_CONVERT_DICT_UPDATE_SEQ, elements.size()); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.CANNOT_CONVERT_DICT_UPDATE_SEQ, elements.size()); } throw e; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/HashingStorageNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/HashingStorageNodes.java index ddf47b3eb0..18034362c9 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/HashingStorageNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/HashingStorageNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,6 +40,9 @@ */ package com.oracle.graal.python.builtins.objects.common; +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; +import static com.oracle.graal.python.nodes.ErrorMessages.FOREIGN_OBJ_ISNT_REVERSE_ITERABLE; + import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.common.EconomicMapStorage.EconomicMapSetStringKey; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodesFactory.CachedHashingStorageGetItemNodeGen; @@ -51,7 +54,6 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodesFactory.HashingStorageGetItemWithHashNodeGen; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodesFactory.HashingStorageGetIteratorNodeGen; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodesFactory.HashingStorageGetReverseIteratorNodeGen; -import com.oracle.graal.python.builtins.objects.common.HashingStorageNodesFactory.HashingStorageIteratorKeyHashNodeGen; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodesFactory.HashingStorageIteratorKeyNodeGen; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodesFactory.HashingStorageIteratorNextNodeGen; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodesFactory.HashingStorageIteratorValueNodeGen; @@ -60,10 +62,15 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodesFactory.HashingStorageSetItemWithHashNodeGen; import com.oracle.graal.python.builtins.objects.common.KeywordsStorage.GetKeywordsStorageItemNode; import com.oracle.graal.python.builtins.objects.common.ObjectHashMap.PutNode; +import com.oracle.graal.python.builtins.objects.common.ObjectHashMap.PutUnsafeNode; import com.oracle.graal.python.lib.PyObjectHashNode; import com.oracle.graal.python.lib.PyObjectRichCompareBool; import com.oracle.graal.python.lib.PyUnicodeCheckExactNode; import com.oracle.graal.python.nodes.PGuards; +import com.oracle.graal.python.nodes.PNodeWithContext; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.interop.PForeignToPTypeNode; +import com.oracle.graal.python.nodes.object.IsForeignObjectNode; import com.oracle.graal.python.nodes.util.CastBuiltinStringToTruffleStringNode; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives; @@ -81,6 +88,10 @@ import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.InvalidArrayIndexException; +import com.oracle.truffle.api.interop.StopIterationException; +import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.LoopNode; import com.oracle.truffle.api.nodes.Node; @@ -102,12 +113,16 @@ private HashingStorageGuards() { * implementation. */ public static boolean mayHaveSideEffectingEq(PHashingCollection wrapper) { - return wrapper.getDictStorage() instanceof EconomicMapStorage; + return mayHaveSideEffectingEq(wrapper.getDictStorage()); + } + + public static boolean mayHaveSideEffectingEq(HashingStorage storage) { + return storage instanceof EconomicMapStorage; } public static boolean mayHaveSideEffects(PHashingCollection wrapper) { HashingStorage s = wrapper.getDictStorage(); - return !(s instanceof EconomicMapStorage && ((EconomicMapStorage) s).map.hasSideEffect()); + return s instanceof EconomicMapStorage && ((EconomicMapStorage) s).map.hasSideEffectingKeys(); } } @@ -146,6 +161,12 @@ static Object keywords(Frame frame, Node inliningTarget, KeywordsStorage self, O @Cached GetKeywordsStorageItemNode getNode) { return getNode.execute(frame, inliningTarget, self, key, keyHash); } + + @Specialization + static Object foreign(Node inliningTarget, ForeignHashingStorage self, Object key, long keyHash, + @Cached ForeignHashingStorage.GetNode getNode) { + return getNode.execute(inliningTarget, self, key); + } } @GenerateUncached @@ -204,6 +225,12 @@ static Object keywords(Frame frame, Node inliningTarget, KeywordsStorage self, O @Cached GetKeywordsStorageItemNode getNode) { return getNode.execute(frame, inliningTarget, self, key, -1); } + + @Specialization + static Object foreign(Node inliningTarget, ForeignHashingStorage self, Object key, + @Cached ForeignHashingStorage.GetNode getNode) { + return getNode.execute(inliningTarget, self, key); + } } @GenerateInline(false) @@ -226,7 +253,7 @@ abstract static class SpecializedSetStringKey extends Node { public abstract void execute(Node inliningTarget, HashingStorage self, TruffleString key, Object value); } - static EconomicMapStorage dynamicObjectStorageToEconomicMap(Node inliningTarget, DynamicObjectStorage s, DynamicObjectLibrary dylib, PyObjectHashNode hashNode, PutNode putNode) { + static EconomicMapStorage dynamicObjectStorageToEconomicMap(Node inliningTarget, DynamicObjectStorage s, DynamicObjectLibrary dylib, PyObjectHashNode hashNode, PutUnsafeNode putNode) { // TODO: shouldn't we invalidate all MRO assumptions in this case? DynamicObject store = s.store; EconomicMapStorage result = EconomicMapStorage.create(dylib.getShape(store).getPropertyCount()); @@ -261,24 +288,16 @@ public final HashingStorage executeCached(Frame frame, HashingStorage self, Obje @Specialization static HashingStorage economicMap(Frame frame, Node inliningTarget, EconomicMapStorage self, Object key, long keyHash, Object value, - @Exclusive @Cached PyUnicodeCheckExactNode isBuiltinString, - @Exclusive @Cached ObjectHashMap.PutNode putNode) { + @Exclusive @Cached PutNode putNode) { putNode.execute(frame, inliningTarget, self.map, key, keyHash, value); - if (!self.map.hasSideEffect() && !isBuiltinString.execute(inliningTarget, key)) { - self.map.setSideEffectingKeysFlag(); - } return self; } @Specialization static HashingStorage empty(Frame frame, Node inliningTarget, @SuppressWarnings("unused") EmptyStorage self, Object key, long keyHash, Object value, - @Exclusive @Cached PyUnicodeCheckExactNode isBuiltinString, - @Exclusive @Cached ObjectHashMap.PutNode putNode) { + @Exclusive @Cached PutNode putNode) { EconomicMapStorage storage = EconomicMapStorage.create(1); putNode.execute(frame, inliningTarget, storage.map, key, keyHash, value); - if (!isBuiltinString.execute(inliningTarget, key)) { - storage.map.setSideEffectingKeysFlag(); - } return storage; } @@ -309,13 +328,19 @@ static HashingStorage dom(Frame frame, Node inliningTarget, DynamicObjectStorage @Specialization @InliningCutoff static HashingStorage keywords(Frame frame, Node inliningTarget, KeywordsStorage self, Object key, long keyHash, Object value, - @Exclusive @Cached PyUnicodeCheckExactNode isBuiltinString, - @Exclusive @Cached ObjectHashMap.PutNode putNode, + @Exclusive @Cached PutNode putNode, @Cached EconomicMapSetStringKey specializedPutNode) { // TODO: do we want to try DynamicObjectStorage if the key is a string? EconomicMapStorage result = EconomicMapStorage.create(self.length()); self.addAllTo(inliningTarget, result, specializedPutNode); - return economicMap(frame, inliningTarget, result, key, keyHash, value, isBuiltinString, putNode); + return economicMap(frame, inliningTarget, result, key, keyHash, value, putNode); + } + + @Specialization + static HashingStorage foreign(Node inliningTarget, ForeignHashingStorage self, Object key, long keyHash, Object value, + @Cached ForeignHashingStorage.PutNode putNode) { + putNode.execute(inliningTarget, self, key, value); + return self; } @GenerateUncached @@ -340,8 +365,9 @@ static HashingStorage domStringKey(Node inliningTarget, DynamicObjectStorage sel static HashingStorage domTransition(Frame frame, Node inliningTarget, DynamicObjectStorage self, Object key, @SuppressWarnings("unused") long keyHash, Object value, @SuppressWarnings("unused") boolean transition, DynamicObjectLibrary dylib, @Cached PyObjectHashNode hashNode, - @Cached ObjectHashMap.PutNode putNode) { - EconomicMapStorage result = dynamicObjectStorageToEconomicMap(inliningTarget, self, dylib, hashNode, putNode); + @Cached PutUnsafeNode putUnsafeNode, + @Cached PutNode putNode) { + EconomicMapStorage result = dynamicObjectStorageToEconomicMap(inliningTarget, self, dylib, hashNode, putUnsafeNode); putNode.execute(frame, inliningTarget, result.map, key, keyHash, value); return result; } @@ -382,27 +408,22 @@ public final HashingStorage execute(Node inliningTarget, HashingStorage self, Tr @Specialization static HashingStorage economicMap(Frame frame, Node inliningTarget, EconomicMapStorage self, Object key, Object value, - @Exclusive @Cached PyUnicodeCheckExactNode isBuiltinString, @Exclusive @Cached PyObjectHashNode hashNode, - @Exclusive @Cached ObjectHashMap.PutNode putNode) { + @Exclusive @Cached PutNode putNode) { putNode.execute(frame, inliningTarget, self.map, key, hashNode.execute(frame, inliningTarget, key), value); - if (!self.map.hasSideEffect() && !isBuiltinString.execute(inliningTarget, key)) { - self.map.setSideEffectingKeysFlag(); - } return self; } @Specialization static HashingStorage empty(Frame frame, Node inliningTarget, @SuppressWarnings("unused") EmptyStorage self, Object key, Object value, - @Exclusive @Cached PyUnicodeCheckExactNode isBuiltinString, @Exclusive @Cached PyObjectHashNode hashNode, - @Exclusive @Cached ObjectHashMap.PutNode putNode) { + @Exclusive @Cached PutNode putNode) { // The ObjectHashMap.PutNode is @Exclusive because profiles for a put into a freshly new // allocated map can be quite different to profiles in the other situations when we are // putting into a map that already has or will have some more items in it // It is also @Cached(inline = false) because inlining it triggers GR-44836 // TODO: do we want to try DynamicObjectStorage if the key is a string? - return economicMap(frame, inliningTarget, EconomicMapStorage.create(1), key, value, isBuiltinString, hashNode, putNode); + return economicMap(frame, inliningTarget, EconomicMapStorage.create(1), key, value, hashNode, putNode); } @Specialization(guards = "!self.shouldTransitionOnPut()") @@ -433,13 +454,19 @@ static HashingStorage dom(Frame frame, Node inliningTarget, DynamicObjectStorage @InliningCutoff static HashingStorage keywords(Frame frame, Node inliningTarget, KeywordsStorage self, Object key, Object value, @Exclusive @Cached PyObjectHashNode hashNode, - @Exclusive @Cached PyUnicodeCheckExactNode isBuiltinString, - @Exclusive @Cached ObjectHashMap.PutNode putNode, + @Exclusive @Cached PutNode putNode, @Cached EconomicMapSetStringKey specializedPutNode) { // TODO: do we want to try DynamicObjectStorage if the key is a string? EconomicMapStorage result = EconomicMapStorage.create(self.length()); self.addAllTo(inliningTarget, result, specializedPutNode); - return economicMap(frame, inliningTarget, result, key, value, isBuiltinString, hashNode, putNode); + return economicMap(frame, inliningTarget, result, key, value, hashNode, putNode); + } + + @Specialization + static HashingStorage foreign(Node inliningTarget, ForeignHashingStorage self, Object key, Object value, + @Cached ForeignHashingStorage.PutNode putNode) { + putNode.execute(inliningTarget, self, key, value); + return self; } @GenerateUncached @@ -464,8 +491,9 @@ static HashingStorage domStringKey(Node inliningTarget, DynamicObjectStorage sel static HashingStorage domTransition(Frame frame, Node inliningTarget, DynamicObjectStorage self, Object key, Object value, @SuppressWarnings("unused") boolean transition, DynamicObjectLibrary dylib, @Cached PyObjectHashNode hashNode, - @Cached ObjectHashMap.PutNode putNode) { - EconomicMapStorage result = dynamicObjectStorageToEconomicMap(inliningTarget, self, dylib, hashNode, putNode); + @Cached PutUnsafeNode putUnsafeNode, + @Cached PutNode putNode) { + EconomicMapStorage result = dynamicObjectStorageToEconomicMap(inliningTarget, self, dylib, hashNode, putUnsafeNode); putNode.execute(frame, inliningTarget, result.map, key, hashNode.execute(frame, inliningTarget, key), value); return result; } @@ -477,43 +505,46 @@ static HashingStorage domTransition(Frame frame, Node inliningTarget, DynamicObj @GenerateCached(false) @ImportStatic({PGuards.class}) public abstract static class HashingStorageDelItem extends Node { - public static void executeUncached(HashingStorage self, Object key, PHashingCollection toUpdate) { - HashingStorageDelItemNodeGen.getUncached().executeWithAsserts(null, null, self, key, false, toUpdate); + public static boolean executeUncached(HashingStorage self, Object key, Object toUpdate) { + return (boolean) HashingStorageDelItemNodeGen.getUncached().executeWithAsserts(null, null, self, key, false, toUpdate); } public static void executeUncachedWithHash(EconomicMapStorage storage, Object key, long hash) { ObjectHashMapFactory.RemoveNodeGen.getUncached().execute(null, null, storage.map, key, hash); } - public final void execute(Node inliningTarget, HashingStorage self, TruffleString key, PHashingCollection toUpdate) { + public final boolean execute(Node inliningTarget, HashingStorage self, TruffleString key, Object toUpdate) { // Shortcut for frequent usage with TruffleString. We do not need a frame in such case, // because the string's __hash__ does not need it. Some fast-paths avoid even invoking // __hash__ for string keys - executeWithAsserts(null, inliningTarget, self, key, false, toUpdate); + return (boolean) executeWithAsserts(null, inliningTarget, self, key, false, toUpdate); } - public final void execute(Frame frame, Node inliningTarget, HashingStorage self, Object key, PHashingCollection toUpdate) { - executeWithAsserts(frame, inliningTarget, self, key, false, toUpdate); + public final boolean execute(Frame frame, Node inliningTarget, HashingStorage self, Object key, Object toUpdate) { + return (boolean) executeWithAsserts(frame, inliningTarget, self, key, false, toUpdate); } - public final Object executePop(Node inliningTarget, HashingStorage self, TruffleString key, PHashingCollection toUpdate) { - return executeWithAsserts(null, inliningTarget, self, key, true, toUpdate); - } - - public final Object executePop(Frame frame, Node inliningTarget, HashingStorage self, Object key, PHashingCollection toUpdate) { + public final Object executePop(Frame frame, Node inliningTarget, HashingStorage self, Object key, Object toUpdate) { return executeWithAsserts(frame, inliningTarget, self, key, true, toUpdate); } - final Object executeWithAsserts(Frame frame, Node inliningTarget, HashingStorage self, Object key, boolean isPop, PHashingCollection toUpdate) { - assert toUpdate != null; - CompilerAsserts.partialEvaluationConstant(isPop); - return executeImpl(frame, inliningTarget, self, key, isPop, toUpdate); + final Object executeWithAsserts(Frame frame, Node inliningTarget, HashingStorage self, Object key, boolean needsValue, Object toUpdate) { + assert toUpdate instanceof PHashingCollection || (IsForeignObjectNode.executeUncached(toUpdate) && InteropLibrary.getUncached().hasHashEntries(toUpdate)) : toUpdate; + CompilerAsserts.partialEvaluationConstant(needsValue); + Object result = executeImpl(frame, inliningTarget, self, key, needsValue, toUpdate); + assert needsValue || result instanceof Boolean; + return result; } - abstract Object executeImpl(Frame frame, Node inliningTarget, HashingStorage self, Object key, boolean isPop, PHashingCollection toUpdate); + /* + * When needsValue is true, this node either returns the value which was associated with key + * if found, and null otherwise. When needsValue is false, it returns true if it found and + * removed the key and false otherwise. + */ + abstract Object executeImpl(Frame frame, Node inliningTarget, HashingStorage self, Object key, boolean needsValue, Object toUpdate); @Specialization(guards = "isEconomicMapOrEmpty(self)") - static Object economicMap(Frame frame, Node inliningTarget, HashingStorage self, Object key, boolean isPop, @SuppressWarnings("unused") PHashingCollection toUpdate, + static Object economicMap(Frame frame, Node inliningTarget, HashingStorage self, Object key, boolean needsValue, @SuppressWarnings("unused") Object toUpdate, @Exclusive @Cached InlinedBranchProfile isEconomicMapProfile, @Exclusive @Cached PyObjectHashNode hashNode, @Exclusive @Cached ObjectHashMap.RemoveNode removeNode) { @@ -522,14 +553,14 @@ static Object economicMap(Frame frame, Node inliningTarget, HashingStorage self, if (self instanceof EconomicMapStorage economicMap) { isEconomicMapProfile.enter(inliningTarget); Object result = removeNode.execute(frame, inliningTarget, economicMap.map, key, hash); - return isPop ? result : null; + return needsValue ? result : result != null; } - return null; + return needsValue ? null : false; } @Specialization @InliningCutoff - static Object domStringKey(Frame frame, Node inliningTarget, DynamicObjectStorage self, Object keyObj, boolean isPop, @SuppressWarnings("unused") PHashingCollection toUpdate, + static Object domStringKey(Frame frame, Node inliningTarget, DynamicObjectStorage self, Object keyObj, boolean needsValue, @SuppressWarnings("unused") Object toUpdate, @Cached PyUnicodeCheckExactNode isBuiltinString, @Cached CastBuiltinStringToTruffleStringNode castStr, @Exclusive @Cached PyObjectHashNode hashNode, @@ -538,11 +569,11 @@ static Object domStringKey(Frame frame, Node inliningTarget, DynamicObjectStorag if (!isBuiltinString.execute(inliningTarget, keyObj)) { // Just for the potential side effects hashNode.execute(frame, inliningTarget, keyObj); - return null; + return needsValue ? null : false; } TruffleString key = castStr.execute(inliningTarget, keyObj); DynamicObject store = self.store; - if (isPop) { + if (needsValue) { Object val = dylib.getOrDefault(store, key, PNone.NO_VALUE); if (val == PNone.NO_VALUE) { return null; @@ -554,14 +585,16 @@ static Object domStringKey(Frame frame, Node inliningTarget, DynamicObjectStorag } else { if (dylib.putIfPresent(store, key, PNone.NO_VALUE)) { self.invalidateAttributeInMROFinalAssumption(key, inliningTarget, invalidateMroProfile); + return true; + } else { + return false; } - return null; } } @Specialization @InliningCutoff - static Object keywords(Frame frame, Node inliningTarget, KeywordsStorage self, Object key, boolean isPop, PHashingCollection toUpdate, + static Object keywords(Frame frame, Node inliningTarget, KeywordsStorage self, Object key, boolean needsValue, PHashingCollection toUpdate, @Exclusive @Cached PyObjectHashNode hashNode, @Exclusive @Cached ObjectHashMap.RemoveNode removeNode, @Cached EconomicMapSetStringKey specializedPutNode) { @@ -569,7 +602,19 @@ static Object keywords(Frame frame, Node inliningTarget, KeywordsStorage self, O self.addAllTo(inliningTarget, newStorage, specializedPutNode); toUpdate.setDictStorage(newStorage); Object result = removeNode.execute(frame, inliningTarget, newStorage.map, key, hashNode.execute(frame, inliningTarget, key)); - return isPop ? result : null; + return needsValue ? result : result != null; + } + + @Specialization(guards = "!needsValue") + static boolean foreignRemove(Node inliningTarget, ForeignHashingStorage self, Object key, boolean needsValue, Object toUpdate, + @Cached ForeignHashingStorage.RemoveNode removeNode) { + return removeNode.execute(inliningTarget, self, key); + } + + @Specialization(guards = "needsValue") + static Object foreignPop(Node inliningTarget, ForeignHashingStorage self, Object key, boolean needsValue, Object toUpdate, + @Cached ForeignHashingStorage.PopNode popNode) { + return popNode.execute(inliningTarget, self, key); } } @@ -598,7 +643,7 @@ static int economicMap(EconomicMapStorage self) { @Specialization @InliningCutoff - static int dom(Node inliningTarget, DynamicObjectStorage self, + static int dom(DynamicObjectStorage self, @Cached(inline = false) DynamicObjectStorage.LengthNode lengthNode) { return lengthNode.execute(self); } @@ -613,6 +658,12 @@ static int empty(EmptyStorage self) { static int keywords(KeywordsStorage self) { return self.length(); } + + @Specialization + static int foreign(Node inliningTarget, ForeignHashingStorage self, + @Cached ForeignHashingStorage.LengthNode lengthNode) { + return lengthNode.execute(inliningTarget, self); + } } @GenerateUncached @@ -635,6 +686,13 @@ static HashingStorage dom(Node inliningTarget, DynamicObjectStorage self, return self; } + @Specialization + static HashingStorage foreign(Node inliningTarget, ForeignHashingStorage self, + @Cached ForeignHashingStorage.ClearNode clearNode) { + clearNode.execute(inliningTarget, self); + return self; + } + @Fallback static HashingStorage empty(@SuppressWarnings("unused") HashingStorage self) { return EmptyStorage.INSTANCE; @@ -681,6 +739,17 @@ static DynamicObjectStorage dom(Node inliningTarget, DynamicObjectStorage dom, static HashingStorage keywords(KeywordsStorage self) { return self.copy(); } + + @Specialization + static HashingStorage foreign(Node inliningTarget, ForeignHashingStorage self, + @Cached HashingStorageAddAllToOther addAllToOther) { + // We don't know if __eq__ on the keys has side effects and might mutate this dict so + // assume yes + var copy = EconomicMapStorage.createWithSideEffects(); + var result = addAllToOther.execute(null, inliningTarget, self, copy); + assert result == copy; + return copy; + } } @ValueType @@ -688,27 +757,31 @@ public static final class HashingStorageIterator { int index = -1; Object currentValue; final Object[] domKeys; - final DynamicObjectLibrary dylib; + final Object foreignHashEntriesIterator; final boolean isReverse; public HashingStorageIterator() { - domKeys = null; - dylib = null; - isReverse = false; + this(false); } public HashingStorageIterator(boolean isReverse) { - domKeys = null; - dylib = null; + this.domKeys = null; + this.foreignHashEntriesIterator = null; this.isReverse = isReverse; } - public HashingStorageIterator(Object[] domKeys, DynamicObjectLibrary dylib, boolean isReverse) { + public HashingStorageIterator(Object[] domKeys, boolean isReverse) { this.domKeys = domKeys; - this.dylib = dylib; + this.foreignHashEntriesIterator = null; this.isReverse = isReverse; } + public HashingStorageIterator(Object foreignHashEntriesIterator) { + this.domKeys = null; + this.foreignHashEntriesIterator = foreignHashEntriesIterator; + this.isReverse = false; + } + /** * Captures internal state of the iterator such that it can be iterated and then restored * back to that state and eventually iterated again. @@ -724,8 +797,7 @@ public void setState(int state) { @GenerateUncached @GenerateInline(inlineByDefault = true) - @ImportStatic({PGuards.class}) - public abstract static class HashingStorageGetIterator extends Node { + public abstract static class HashingStorageGetIterator extends PNodeWithContext { public static HashingStorageIterator executeUncached(HashingStorage storage) { return HashingStorageGetIteratorNodeGen.getUncached().execute(null, storage); } @@ -755,7 +827,7 @@ static HashingStorageIterator economicMap(@SuppressWarnings("unused") EconomicMa @Specialization static HashingStorageIterator dom(DynamicObjectStorage self, @CachedLibrary(limit = "3") DynamicObjectLibrary dylib) { - return new HashingStorageIterator(dylib.getKeyArray(self.store), dylib, false); + return new HashingStorageIterator(dylib.getKeyArray(self.store), false); } @Specialization @@ -767,13 +839,22 @@ static HashingStorageIterator empty(@SuppressWarnings("unused") EmptyStorage sel static HashingStorageIterator keywords(@SuppressWarnings("unused") KeywordsStorage self) { return new HashingStorageIterator(); } + + @Specialization + static HashingStorageIterator foreign(ForeignHashingStorage self, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop) { + try { + return new HashingStorageIterator(interop.getHashEntriesIterator(self.foreignDict)); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } } @GenerateUncached @GenerateInline @GenerateCached(false) - @ImportStatic({PGuards.class}) - public abstract static class HashingStorageGetReverseIterator extends Node { + public abstract static class HashingStorageGetReverseIterator extends PNodeWithContext { public static HashingStorageIterator executeUncached(HashingStorage storage) { return HashingStorageGetReverseIteratorNodeGen.getUncached().execute(null, storage); } @@ -796,7 +877,7 @@ static HashingStorageIterator economicMap(@SuppressWarnings("unused") EconomicMa @Specialization static HashingStorageIterator dom(DynamicObjectStorage self, @CachedLibrary(limit = "3") DynamicObjectLibrary dylib) { - HashingStorageIterator it = new HashingStorageIterator(dylib.getKeyArray(self.store), dylib, true); + HashingStorageIterator it = new HashingStorageIterator(dylib.getKeyArray(self.store), true); it.index = it.domKeys.length; return it; } @@ -812,12 +893,18 @@ static HashingStorageIterator keywords(@SuppressWarnings("unused") KeywordsStora it.index = self.length(); return it; } + + @Specialization + static HashingStorageIterator foreign(@SuppressWarnings("unused") ForeignHashingStorage self, + @Bind("this") Node inliningTarget) { + // InteropLibrary does not provide a reverse HashEntriesIterator + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, FOREIGN_OBJ_ISNT_REVERSE_ITERABLE); + } } @GenerateUncached @GenerateInline(inlineByDefault = true) - @ImportStatic({PGuards.class}) - public abstract static class HashingStorageIteratorNext extends Node { + public abstract static class HashingStorageIteratorNext extends PNodeWithContext { public static boolean executeUncached(HashingStorage storage, HashingStorageIterator it) { return HashingStorageIteratorNextNodeGen.getUncached().execute(null, storage, it); } @@ -870,11 +957,12 @@ static boolean economicMapReverse(EconomicMapStorage self, HashingStorageIterato } @Specialization(guards = "!it.isReverse") - static boolean dom(DynamicObjectStorage self, HashingStorageIterator it) { + static boolean dom(DynamicObjectStorage self, HashingStorageIterator it, + @Shared @CachedLibrary(limit = "3") DynamicObjectLibrary dylib) { it.index++; while (it.index < it.domKeys.length) { if (it.domKeys[it.index] instanceof TruffleString) { - Object val = it.dylib.getOrDefault(self.store, it.domKeys[it.index], PNone.NO_VALUE); + Object val = dylib.getOrDefault(self.store, it.domKeys[it.index], PNone.NO_VALUE); if (val != PNone.NO_VALUE) { it.currentValue = val; return true; @@ -887,11 +975,12 @@ static boolean dom(DynamicObjectStorage self, HashingStorageIterator it) { } @Specialization(guards = "it.isReverse") - static boolean domReverse(DynamicObjectStorage self, HashingStorageIterator it) { + static boolean domReverse(DynamicObjectStorage self, HashingStorageIterator it, + @Shared @CachedLibrary(limit = "3") DynamicObjectLibrary dylib) { it.index--; while (it.index >= 0) { if (it.domKeys[it.index] instanceof TruffleString) { - Object val = it.dylib.getOrDefault(self.store, it.domKeys[it.index], PNone.NO_VALUE); + Object val = dylib.getOrDefault(self.store, it.domKeys[it.index], PNone.NO_VALUE); if (val != PNone.NO_VALUE) { it.currentValue = val; return true; @@ -918,12 +1007,35 @@ static boolean keywords(KeywordsStorage self, HashingStorageIterator it) { static boolean keywordsReverse(@SuppressWarnings("unused") KeywordsStorage self, HashingStorageIterator it) { return --it.index >= 0; } + + @Specialization(guards = "!it.isReverse") + static boolean foreign(ForeignHashingStorage self, HashingStorageIterator it, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop) { + var iterator = it.foreignHashEntriesIterator; + try { + if (!interop.hasIteratorNextElement(iterator)) { + return false; + } + + var keyValue = interop.getIteratorNextElement(iterator); + it.currentValue = keyValue; + return true; + } catch (UnsupportedMessageException | StopIterationException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } + + @Specialization(guards = "it.isReverse") + static boolean foreignReverse(@SuppressWarnings("unused") ForeignHashingStorage self, HashingStorageIterator it, + @Bind("this") Node inliningTarget) { + // InteropLibrary does not provide a reverse HashEntriesIterator + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, FOREIGN_OBJ_ISNT_REVERSE_ITERABLE); + } } @GenerateUncached @GenerateInline(inlineByDefault = true) - @ImportStatic({PGuards.class}) - public abstract static class HashingStorageIteratorValue extends Node { + public abstract static class HashingStorageIteratorValue extends PNodeWithContext { public static Object executeUncached(HashingStorage storage, HashingStorageIterator it) { return HashingStorageIteratorValueNodeGen.getUncached().execute(null, storage, it); } @@ -959,12 +1071,24 @@ static boolean empty(EmptyStorage self, HashingStorageIterator it) { static Object keywords(KeywordsStorage self, HashingStorageIterator it) { return self.keywords[it.index].getValue(); } + + @InliningCutoff + @Specialization + static Object foreign(ForeignHashingStorage self, HashingStorageIterator it, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop, + @Cached(inline = false) PForeignToPTypeNode toPythonNode) { + try { + var value = interop.readArrayElement(it.currentValue, 1); + return toPythonNode.executeConvert(value); + } catch (UnsupportedMessageException | InvalidArrayIndexException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } } @GenerateUncached @GenerateInline(inlineByDefault = true) - @ImportStatic({PGuards.class}) - public abstract static class HashingStorageIteratorKey extends Node { + public abstract static class HashingStorageIteratorKey extends PNodeWithContext { public static Object executeUncached(HashingStorage storage, HashingStorageIterator it) { return HashingStorageIteratorKeyNodeGen.getUncached().execute(null, storage, it); } @@ -1000,19 +1124,27 @@ static boolean empty(EmptyStorage self, HashingStorageIterator it) { static Object keywords(KeywordsStorage self, HashingStorageIterator it) { return self.keywords[it.index].getName(); } + + @InliningCutoff + @Specialization + static Object foreign(ForeignHashingStorage self, HashingStorageIterator it, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop, + @Cached(inline = false) PForeignToPTypeNode toPythonNode) { + try { + var key = interop.readArrayElement(it.currentValue, 0); + return toPythonNode.executeConvert(key); + } catch (UnsupportedMessageException | InvalidArrayIndexException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } } @GenerateUncached @GenerateInline @GenerateCached(false) - @ImportStatic({PGuards.class}) - public abstract static class HashingStorageIteratorKeyHash extends Node { - - public static long executeUncached(HashingStorage storage, HashingStorageIterator it) { - return HashingStorageIteratorKeyHashNodeGen.getUncached().execute(null, storage, it); - } + public abstract static class HashingStorageIteratorKeyHash extends PNodeWithContext { - public abstract long execute(Node node, HashingStorage storage, HashingStorageIterator it); + public abstract long execute(Frame frame, Node inliningTarget, HashingStorage storage, HashingStorageIterator it); @Specialization static long economicMap(EconomicMapStorage self, HashingStorageIterator it) { @@ -1036,6 +1168,21 @@ static long keywords(KeywordsStorage self, HashingStorageIterator it, @Shared("hash") @Cached(inline = false) TruffleString.HashCodeNode hashNode) { return PyObjectHashNode.hash(self.keywords[it.index].getName(), hashNode); } + + @InliningCutoff + @Specialization + static long foreign(Frame frame, Node inliningTarget, ForeignHashingStorage self, HashingStorageIterator it, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop, + @Cached(inline = false) PForeignToPTypeNode toPythonNode, + @Cached PyObjectHashNode hashNode) { + try { + var key = interop.readArrayElement(it.currentValue, 0); + key = toPythonNode.executeConvert(key); + return hashNode.execute(frame, inliningTarget, key); + } catch (UnsupportedMessageException | InvalidArrayIndexException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } } @GenerateInline @@ -1044,17 +1191,17 @@ public abstract static class HashingStoragePop extends Node { /** * Returns {@code null} if there is nothing to pop, otherwise popped [key, value]. */ - public abstract Object[] execute(Node inliningTarget, HashingStorage storage, PHashingCollection toUpdate); + public abstract Object[] execute(Node inliningTarget, HashingStorage storage, Object toUpdate); @Specialization - static Object[] economicMap(Node inliningTarget, EconomicMapStorage self, @SuppressWarnings("unused") PHashingCollection toUpdate, + static Object[] economicMap(Node inliningTarget, EconomicMapStorage self, @SuppressWarnings("unused") Object toUpdate, @Cached ObjectHashMap.PopNode popNode) { return popNode.execute(inliningTarget, self.map); } // Other storages should not have any side effects, it's OK if they call __eq__ @Fallback - static Object[] others(Node inliningTarget, HashingStorage storage, PHashingCollection toUpdate, + static Object[] others(Node inliningTarget, HashingStorage storage, Object toUpdate, @Cached HashingStorageDelItem delItem, @Cached HashingStorageGetReverseIterator getReverseIterator, @Cached HashingStorageIteratorNext iterNext, @@ -1088,7 +1235,7 @@ static boolean doIt(Frame frame, Node inliningTarget, HashingStorage aStorage, H @Cached HashingStorageIteratorKey aIterKey, @Cached HashingStorageIteratorValue aIterValue, @Cached HashingStorageIteratorKeyHash aIterHash, - @Cached PyObjectRichCompareBool.EqNode eqNode, + @Cached PyObjectRichCompareBool eqNode, @Cached InlinedLoopConditionProfile loopProfile, @Cached InlinedLoopConditionProfile earlyExitProfile) { if (lenANode.execute(inliningTarget, aStorage) != lenBNode.execute(inliningTarget, bStorage)) { @@ -1103,10 +1250,10 @@ static boolean doIt(Frame frame, Node inliningTarget, HashingStorage aStorage, H } Object aKey = aIterKey.execute(inliningTarget, aStorage, aIter); - long aHash = aIterHash.execute(inliningTarget, aStorage, aIter); + long aHash = aIterHash.execute(frame, inliningTarget, aStorage, aIter); Object bValue = getBNode.execute(frame, inliningTarget, bStorage, aKey, aHash); Object aValue = aIterValue.execute(inliningTarget, aStorage, aIter); - if (earlyExitProfile.profile(inliningTarget, !(bValue == null || !eqNode.compare(frame, inliningTarget, bValue, aValue)))) { + if (earlyExitProfile.profile(inliningTarget, !(bValue == null || !eqNode.executeEq(frame, inliningTarget, bValue, aValue)))) { // if->continue such that the "true" count of the profile represents the // loop iterations and the "false" count the early exit continue; @@ -1206,13 +1353,13 @@ public abstract static class HashingStorageXorCallback extends HashingStorageFor @Specialization static ResultAndOther doGeneric(Frame frame, Node inliningTarget, HashingStorage storage, HashingStorageIterator it, ResultAndOther acc, - @Cached ObjectHashMap.PutNode putResultNode, + @Cached PutNode putResultNode, @Cached HashingStorageGetItemWithHash getFromOther, @Cached HashingStorageIteratorKey iterKey, @Cached HashingStorageIteratorValue iterValue, @Cached HashingStorageIteratorKeyHash iterHash) { Object key = iterKey.execute(inliningTarget, storage, it); - long hash = iterHash.execute(inliningTarget, storage, it); + long hash = iterHash.execute(frame, inliningTarget, storage, it); Object otherValue = getFromOther.execute(frame, inliningTarget, acc.other, key, hash); if (otherValue == null) { putResultNode.put(frame, inliningTarget, acc.result, key, hash, iterValue.execute(inliningTarget, storage, it)); @@ -1258,12 +1405,12 @@ public abstract static class HashingStorageIntersectCallback extends HashingStor @Specialization static ResultAndOther doGeneric(Frame frame, Node inliningTarget, HashingStorage storage, HashingStorageIterator it, ResultAndOther acc, - @Cached ObjectHashMap.PutNode putResultNode, + @Cached PutNode putResultNode, @Cached HashingStorageGetItemWithHash getFromOther, @Cached HashingStorageIteratorKey iterKey, @Cached HashingStorageIteratorKeyHash iterHash) { Object key = iterKey.execute(inliningTarget, storage, it); - long hash = iterHash.execute(inliningTarget, storage, it); + long hash = iterHash.execute(frame, inliningTarget, storage, it); Object otherValue = getFromOther.execute(frame, inliningTarget, acc.other, key, hash); if (otherValue != null) { putResultNode.put(frame, inliningTarget, acc.result, key, hash, otherValue); @@ -1304,13 +1451,13 @@ public abstract static class HashingStorageDiffCallback extends HashingStorageFo @Specialization static ResultAndOther doGeneric(Frame frame, Node inliningTarget, HashingStorage storage, HashingStorageIterator it, ResultAndOther acc, - @Cached ObjectHashMap.PutNode putResultNode, + @Cached PutNode putResultNode, @Cached HashingStorageGetItemWithHash getFromOther, @Cached HashingStorageIteratorKey iterKey, @Cached HashingStorageIteratorKeyHash iterHash, @Cached HashingStorageIteratorValue iterValue) { Object key = iterKey.execute(inliningTarget, storage, it); - long hash = iterHash.execute(inliningTarget, storage, it); + long hash = iterHash.execute(frame, inliningTarget, storage, it); Object otherValue = getFromOther.execute(frame, inliningTarget, acc.other, key, hash); if (otherValue == null) { putResultNode.put(frame, inliningTarget, acc.result, key, hash, iterValue.execute(inliningTarget, storage, it)); @@ -1358,7 +1505,7 @@ static HashingStorage doGeneric(Frame frame, Node inliningTarget, HashingStorage @Cached HashingStorageIteratorKey iterKey, @Cached HashingStorageIteratorKeyHash iterHash) { Object key = iterKey.execute(inliningTarget, aStorage, it); - long hash = iterHash.execute(inliningTarget, aStorage, it); + long hash = iterHash.execute(frame, inliningTarget, aStorage, it); Object otherValue = getFromOther.execute(frame, inliningTarget, bStorage, key, hash); if (otherValue == null) { throw AbortIteration.INSTANCE; @@ -1371,17 +1518,17 @@ static HashingStorage doGeneric(Frame frame, Node inliningTarget, HashingStorage @GenerateInline @GenerateCached(false) @ImportStatic({PGuards.class}) - public abstract static class HashingStorageCompareKeys extends Node { - public abstract int execute(Frame frame, Node inliningTarget, HashingStorage a, HashingStorage b); + public abstract static class IsKeysSubset extends Node { + public abstract boolean execute(Frame frame, Node inliningTarget, HashingStorage a, HashingStorage b); @Specialization(guards = "aStorage == bStorage") @SuppressWarnings("unused") - static int doSame(HashingStorage aStorage, HashingStorage bStorage) { - return 0; + static boolean doSame(HashingStorage aStorage, HashingStorage bStorage) { + return true; } @Specialization(guards = "aStorage != bStorage") - static int doGeneric(Frame frame, Node inliningTarget, HashingStorage aStorage, HashingStorage bStorage, + static boolean doGeneric(Frame frame, Node inliningTarget, HashingStorage aStorage, HashingStorage bStorage, @Cached HashingStorageLen aLenNode, @Cached HashingStorageLen bLenNode, @Cached HashingStorageForEach forEachA, @@ -1389,18 +1536,14 @@ static int doGeneric(Frame frame, Node inliningTarget, HashingStorage aStorage, int aLen = aLenNode.execute(inliningTarget, aStorage); int bLen = bLenNode.execute(inliningTarget, bStorage); if (aLen > bLen) { - return 1; + return false; } try { forEachA.execute(frame, inliningTarget, aStorage, callback, bStorage); } catch (AbortIteration ignored) { - return 1; - } - if (aLen == bLen) { - return 0; - } else { - return -1; + return false; } + return true; } } @@ -1422,7 +1565,7 @@ static HashingStorage doGeneric(Frame frame, Node inliningTarget, HashingStorage @Cached HashingStorageIteratorKey iterKey, @Cached HashingStorageIteratorKeyHash iterHash) { Object key = iterKey.execute(inliningTarget, aStorage, it); - long hash = iterHash.execute(inliningTarget, aStorage, it); + long hash = iterHash.execute(frame, inliningTarget, aStorage, it); Object otherValue = getFromOther.execute(frame, inliningTarget, bStorage, key, hash); if (otherValue != null) { throw AbortIteration.INSTANCE; @@ -1501,8 +1644,12 @@ static HashingStorage generic2Generic(Frame frame, Node inliningTarget, HashingS @GenerateUncached @GenerateInline(inlineByDefault = true) public abstract static class HashingStorageAddAllToOther extends Node { - public static void executeUncached(HashingStorage source, PHashingCollection dest) { - HashingStorageAddAllToOtherNodeGen.getUncached().execute(null, null, source, dest); + + /** + * The caller must use dest.setDictStorage(result) + */ + public static HashingStorage executeUncached(HashingStorage source, HashingStorage dest) { + return HashingStorageAddAllToOtherNodeGen.getUncached().execute(null, null, source, dest); } @NeverDefault @@ -1518,6 +1665,9 @@ public final HashingStorage executeCached(Frame frame, HashingStorage source, Ha return execute(frame, this, source, dest); } + /** + * The caller must use dest.setDictStorage(result) or use DictNodes.UpdateDictStorageNode + */ public abstract HashingStorage execute(Frame frame, Node inliningTarget, HashingStorage source, HashingStorage dest); @Specialization(guards = "source == dest") diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/IndexNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/IndexNodes.java index a651a07fa3..88544ace1f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/IndexNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/IndexNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,7 +46,6 @@ import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.PRaiseNode.Lazy; import com.oracle.graal.python.util.OverflowException; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; @@ -193,7 +192,7 @@ abstract static class NormalizeIndexWithBoundsCheckNode extends NormalizeIndexCu static int doInt(int index, int length, TruffleString errorMessage, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile negativeIndexProfile, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { int normalizedIndex = index; if (negativeIndexProfile.profile(inliningTarget, normalizedIndex < 0)) { normalizedIndex += length; @@ -205,7 +204,7 @@ static int doInt(int index, int length, TruffleString errorMessage, @Specialization static int doBool(boolean bIndex, int length, TruffleString errorMessage, @Bind("this") Node inliningTarget, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { int index = PInt.intValue(bIndex); checkBounds(inliningTarget, raiseNode, errorMessage, index, length); return index; @@ -215,7 +214,7 @@ static int doBool(boolean bIndex, int length, TruffleString errorMessage, static int doLong(long lIndex, int length, TruffleString errorMessage, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile negativeIndexProfile, - @Shared @Cached PRaiseNode.Lazy raiseNode) throws OverflowException { + @Shared @Cached PRaiseNode raiseNode) throws OverflowException { int index = PInt.intValueExact(lIndex); return doInt(index, length, errorMessage, inliningTarget, negativeIndexProfile, raiseNode); } @@ -224,11 +223,11 @@ static int doLong(long lIndex, int length, TruffleString errorMessage, int doLongOvf(long index, int length, TruffleString errorMessage, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile negativeIndexProfile, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { try { return doLong(index, length, errorMessage, inliningTarget, negativeIndexProfile, raiseNode); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raiseNumberTooLarge(PythonBuiltinClassType.IndexError, index); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.IndexError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, index); } } @@ -236,7 +235,7 @@ int doLongOvf(long index, int length, TruffleString errorMessage, static int doPInt(PInt index, int length, TruffleString errorMessage, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile negativeIndexProfile, - @Shared @Cached PRaiseNode.Lazy raiseNode) throws OverflowException { + @Shared @Cached PRaiseNode raiseNode) throws OverflowException { int idx = index.intValueExact(); return doInt(idx, length, errorMessage, inliningTarget, negativeIndexProfile, raiseNode); } @@ -245,11 +244,11 @@ static int doPInt(PInt index, int length, TruffleString errorMessage, int doPIntOvf(PInt index, int length, TruffleString errorMessage, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile negativeIndexProfile, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { try { return doPInt(index, length, errorMessage, inliningTarget, negativeIndexProfile, raiseNode); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raiseNumberTooLarge(PythonBuiltinClassType.IndexError, index); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.IndexError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, index); } } @@ -257,7 +256,7 @@ int doPIntOvf(PInt index, int length, TruffleString errorMessage, static long doLongLong(long lIndex, long length, TruffleString errorMessage, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile negativeIndexProfile, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { long normalizedIndex = lIndex; if (negativeIndexProfile.profile(inliningTarget, normalizedIndex < 0)) { normalizedIndex += length; @@ -306,7 +305,7 @@ static int doLongOvf(long index, int length, TruffleString errorMessage, try { return doLong(index, length, errorMessage, inliningTarget, negativeIndexProfile); } catch (OverflowException e) { - throw raiseNode.raiseNumberTooLarge(PythonBuiltinClassType.IndexError, index); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.IndexError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, index); } } @@ -326,7 +325,7 @@ static int doPIntOvf(PInt index, int length, TruffleString errorMessage, try { return doPInt(index, length, errorMessage, inliningTarget, negativeIndexProfile); } catch (OverflowException e) { - throw raiseNode.raiseNumberTooLarge(PythonBuiltinClassType.IndexError, index); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.IndexError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, index); } } @@ -342,26 +341,26 @@ static long doLongLong(long index, long length, @SuppressWarnings("unused") Truf } } - public static void checkBounds(Node inliningTarget, PRaiseNode.Lazy raiseNode, TruffleString errorMessage, int idx, int length) { + public static void checkBounds(Node inliningTarget, PRaiseNode raiseNode, TruffleString errorMessage, int idx, int length) { if (idx < 0 || idx >= length) { raiseIndexError(inliningTarget, errorMessage, raiseNode); } } - public static void checkBounds(Node inliningTarget, PRaiseNode.Lazy raiseNode, TruffleString errorMessage, long idx, long length) { + public static void checkBounds(Node inliningTarget, PRaiseNode raiseNode, TruffleString errorMessage, long idx, long length) { if (idx < 0 || idx >= length) { raiseIndexError(inliningTarget, errorMessage, raiseNode); } } - public static void checkBounds(Node inliningTarget, PRaiseNode.Lazy raiseNode, TruffleString errorMessage, int idx, long length) { + public static void checkBounds(Node inliningTarget, PRaiseNode raiseNode, TruffleString errorMessage, int idx, long length) { if (idx < 0 || idx >= length) { raiseIndexError(inliningTarget, errorMessage, raiseNode); } } @InliningCutoff - private static void raiseIndexError(Node inliningTarget, TruffleString errorMessage, Lazy raiseNode) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.IndexError, errorMessage); + private static void raiseIndexError(Node inliningTarget, TruffleString errorMessage, PRaiseNode raiseNode) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.IndexError, errorMessage); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/KeywordsStorage.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/KeywordsStorage.java index 77418464c8..cdee12929c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/KeywordsStorage.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/KeywordsStorage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -68,7 +68,7 @@ public class KeywordsStorage extends HashingStorage { final PKeyword[] keywords; - protected KeywordsStorage(PKeyword[] keywords) { + public KeywordsStorage(PKeyword[] keywords) { this.keywords = keywords; } @@ -130,7 +130,7 @@ static Object string(KeywordsStorage self, TruffleString key, @SuppressWarnings( } @Specialization(guards = "isBuiltinString.execute(inliningTarget, key)", limit = "1") - static Object pstring(@SuppressWarnings("unused") Node inliningTarget, KeywordsStorage self, PString key, @SuppressWarnings("unused") long hash, + static Object pstring(Node inliningTarget, KeywordsStorage self, PString key, @SuppressWarnings("unused") long hash, @SuppressWarnings("unused") @Exclusive @Cached PyUnicodeCheckExactNode isBuiltinString, @Cached CastToTruffleStringNode castToTruffleStringNode, @Shared("tsEqual") @Cached(inline = false) TruffleString.EqualNode equalNode) { @@ -138,15 +138,15 @@ static Object pstring(@SuppressWarnings("unused") Node inliningTarget, KeywordsS } @Specialization(guards = "!isBuiltinString.execute(inliningTarget, key)", limit = "1") - static Object notString(Frame frame, @SuppressWarnings("unused") Node inliningTarget, KeywordsStorage self, Object key, long hashIn, + static Object notString(Frame frame, Node inliningTarget, KeywordsStorage self, Object key, long hashIn, @SuppressWarnings("unused") @Exclusive @Cached PyUnicodeCheckExactNode isBuiltinString, @Cached PyObjectHashNode hashNode, - @Cached PyObjectRichCompareBool.EqNode eqNode) { + @Cached PyObjectRichCompareBool eqNode) { long hash = hashIn == -1 ? hashNode.execute(frame, inliningTarget, key) : hashIn; for (int i = 0; i < self.keywords.length; i++) { TruffleString currentKey = self.keywords[i].getName(); long keyHash = hashNode.execute(frame, inliningTarget, currentKey); - if (keyHash == hash && eqNode.compare(frame, inliningTarget, key, currentKey)) { + if (keyHash == hash && eqNode.executeEq(frame, inliningTarget, key, currentKey)) { return self.keywords[i].getValue(); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/ObjectHashMap.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/ObjectHashMap.java index d988bb4c9c..5ec9b1c41f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/ObjectHashMap.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/ObjectHashMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,21 +44,21 @@ import java.util.Arrays; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass; -import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.common.ObjectHashMapFactory.IsSideEffectingKeyNodeGen; +import com.oracle.graal.python.builtins.objects.common.ObjectHashMapFactory.PutNodeGen; +import com.oracle.graal.python.builtins.objects.str.PString; import com.oracle.graal.python.lib.PyObjectRichCompareBool; -import com.oracle.graal.python.lib.PyObjectRichCompareBool.EqNode; +import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.nodes.LoopNode; @@ -70,47 +70,47 @@ /** * Generic dictionary/set backing storage implementation. - * + *

      * The basic algorithm is hash table with open addressing for collision resolution. For that we need * to have a fixed order of indexes to probe if collision happens. Simple implementations use linear - * serach (+/-1) from the bucket where the collision happened. We use the same more advanced scheme - * as PyPy/CPython. It relies on the fact that recurrence + * search (+/-1) from the bucket where the collision happened. We use the same more advanced scheme + * as PyPy/CPython. It relies on the fact that the recurrence * * * j = ((5*j) + 1) mod N^2 * - * + *

      * generates all numbers from 0 to (N^2)-1, but not in linear order, i.e., for j=1, N=3, we get: 1 6 * 7 4 5 2 3 0. In our case we set j to the index of the bucket that has the collision. To make this * scheme also dependent on the higher bits of the hash, we use this formula (also like CPython): * * - * pertrub >>= PERTURB_SHIFT - * j = ((5*j) + pertrub + 1) mod N^2 + * perturb >>= PERTURB_SHIFT + * j = ((5*j) + perturb + 1) mod N^2 * - * + *

      * Which is not guaranteed to generate numbers from 0 to (N^2)-1 in general, but when the perturb * value is shifted often enough, it becomes 0, and then we're effectively using the original * version of the recurrence that does guarantee that. - * + *

      * Additionally, we use the same trick as PyPy/CPython: there is one sparse array, which is the * actual hash table, but it does not contain the entries, it contains indices into compact arrays * with hashes and keys and values. This not only should be memory efficient and cache friendly, but * it preserves the insertion order, which is a requirement. - * + *

      * On top of the PyPy/CPython design: we use the highest bit in the indices stored in the sparse * array to indicate whether given bucket participates in some collisions chain. When searching * through a collision chain, we can stop at items that do not have this bit set. The practical * implications of this is that for close to full maps, lookups of items that are not present in the * map are faster, because we can terminate the collisions chain chasing earlier. - * + *

      * Notable use case that does not (yet) work well with this approach: repeated insertion and removal * of the same key. This keeps on adding dummy entries when removing the entry and creating long * collisions chains that the insertion needs to follow to find a free slot. This all repeats until * the insertion concludes that the map is too full and rehashes it, in this case actually not * growing it, but just removing the dummy entries. The same seems to happen on CPython also, but * can be improved. - * + *

      * Areas for future improvements: *

        *
      • Use byte[] array for the sparse indices array and determine the size of an index according to @@ -204,8 +204,9 @@ private static int unwrapIndex(int value) { boolean hasSideEffectingKeys; public ObjectHashMap(int capacity, boolean hasSideEffects) { + int allocateSize; if (capacity <= INITIAL_INDICES_SIZE) { - allocateData(INITIAL_INDICES_SIZE); + allocateSize = INITIAL_INDICES_SIZE; } else { // We need the hash table of this size, in order to accommodate "capacity" many entries int indicesCapacity = capacity + (capacity / 3); @@ -216,13 +217,14 @@ public ObjectHashMap(int capacity, boolean hasSideEffects) { // reach the memory limit. We'd fail on the memory limit earlier -> difference in // behavior, so we take it easy if the requested size is too large. Maybe we should // rather revisit all such callsites instead of fixing this here... - allocateData(MAX_PREALLOCATED_INDICES_SIZE); + allocateSize = MAX_PREALLOCATED_INDICES_SIZE; } else { int pow2 = getNextPow2(indicesCapacity); assert pow2 > INITIAL_INDICES_SIZE; - allocateData(pow2); + allocateSize = pow2; } } + allocateData(allocateSize); hasSideEffectingKeys = hasSideEffects; } @@ -249,10 +251,6 @@ private void allocateData(int newSize) { keysAndValues = new Object[usableSize * 2]; } - public void setSideEffectingKeysFlag() { - hasSideEffectingKeys = true; - } - public void clear() { size = 0; usedHashes = 0; @@ -276,7 +274,7 @@ public MapCursor getEntries() { return new MapCursor(); } - public boolean hasSideEffect() { + public boolean hasSideEffectingKeys() { return hasSideEffectingKeys; } @@ -436,10 +434,7 @@ public static Object doGetWithRestart(Frame frame, Node inliningTarget, ObjectHa @Cached InlinedCountingConditionProfile foundEqKey, @Cached InlinedCountingConditionProfile collisionFoundNoValue, @Cached InlinedCountingConditionProfile collisionFoundEqKey, - @Cached PyObjectRichCompareBool.EqNode eqNode) { - // Must not call generic __eq__ before builtins are initialized - // If this assert fires: we'll need something like putUncachedWithJavaEq also for get - assert map.size == 0 || SpecialMethodSlot.areBuiltinSlotsInitialized(); + @Cached PyObjectRichCompareBool eqNode) { while (true) { try { return doGet(frame, map, key, keyHash, inliningTarget, foundNullKey, foundSameHashKey, @@ -457,7 +452,7 @@ static Object doGet(Frame frame, ObjectHashMap map, Object key, long keyHash, InlinedCountingConditionProfile foundEqKey, InlinedCountingConditionProfile collisionFoundNoValue, InlinedCountingConditionProfile collisionFoundEqKey, - PyObjectRichCompareBool.EqNode eqNode) throws RestartLookupException { + PyObjectRichCompareBool eqNode) throws RestartLookupException { assert map.checkInternalState(); int[] indices = map.indices; int indicesLen = indices.length; @@ -485,7 +480,7 @@ static Object doGet(Frame frame, ObjectHashMap map, Object key, long keyHash, private static Object getCollision(Frame frame, ObjectHashMap map, Object key, long keyHash, Node inliningTarget, InlinedCountingConditionProfile collisionFoundNoValue, InlinedCountingConditionProfile collisionFoundEqKey, - EqNode eqNode, int[] indices, int indicesLen, int compactIndex) throws RestartLookupException { + PyObjectRichCompareBool eqNode, int[] indices, int indicesLen, int compactIndex) throws RestartLookupException { int index; // collision: intentionally counted loop long perturb = keyHash; @@ -524,10 +519,90 @@ private static Object getCollision(Frame frame, ObjectHashMap map, Object key, l } } + @GenerateUncached + @GenerateInline + @GenerateCached(false) + abstract static class UpdateSideEffectingFlag extends Node { + public abstract void execute(Node inliningTarget, ObjectHashMap self, Object key); + + @Specialization(guards = "self.hasSideEffectingKeys()") + static void flagAlreadySet(@SuppressWarnings("unused") ObjectHashMap self, @SuppressWarnings("unused") Object key) { + // nop + } + + @Specialization(guards = "!self.hasSideEffectingKeys()") + static void flagNotSet(Node inliningTarget, ObjectHashMap self, Object key, + @Cached IsSideEffectingKey isSideEffectingKey) { + if (isSideEffectingKey.execute(inliningTarget, key)) { + self.hasSideEffectingKeys = true; + } + } + } + + @GenerateUncached + @GenerateInline + @GenerateCached(false) + @ImportStatic(PGuards.class) + abstract static class IsSideEffectingKey extends Node { + public abstract boolean execute(Node inliningTarget, Object key); + + @Specialization + static boolean doBuiltinString(@SuppressWarnings("unused") int key) { + return false; + } + + @Specialization + static boolean doString(@SuppressWarnings("unused") long key) { + return false; + } + + @Specialization + static boolean doString(@SuppressWarnings("unused") TruffleString object) { + return false; + } + + @Specialization(guards = "isBuiltinPString(string)") + static boolean doBuiltinString(@SuppressWarnings("unused") PString string) { + return false; + } + + @Fallback + static boolean doOthers(@SuppressWarnings("unused") Object key) { + return true; + } + } + @GenerateUncached @GenerateInline @GenerateCached(false) public abstract static class PutNode extends Node { + public static PutNode getUncached() { + return PutNodeGen.getUncached(); + } + + public final void put(Frame frame, Node inliningTarget, ObjectHashMap map, DictKey key, Object value) { + execute(frame, inliningTarget, map, key.getValue(), key.getPythonHash(), value); + } + + public final void put(Frame frame, Node inliningTarget, ObjectHashMap map, Object key, long keyHash, Object value) { + execute(frame, inliningTarget, map, key, keyHash, value); + } + + abstract void execute(Frame frame, Node inliningTarget, ObjectHashMap map, Object key, long keyHash, Object value); + + @Specialization + static void doIt(Frame frame, Node inliningTarget, ObjectHashMap map, Object key, long keyHash, Object value, + @Cached UpdateSideEffectingFlag updateSideEffectingFlag, + @Cached PutUnsafeNode putUnsafeNode) { + updateSideEffectingFlag.execute(inliningTarget, map, key); + putUnsafeNode.execute(frame, inliningTarget, map, key, keyHash, value); + } + } + + @GenerateUncached + @GenerateInline + @GenerateCached(false) + public abstract static class PutUnsafeNode extends Node { public final void put(Frame frame, Node inliningTarget, ObjectHashMap map, DictKey key, Object value) { execute(frame, inliningTarget, map, key.getValue(), key.getPythonHash(), value); } @@ -542,14 +617,6 @@ public static void putUncached(ObjectHashMap map, Object key, long keyHash, Obje abstract void execute(Frame frame, Node inliningTarget, ObjectHashMap map, Object key, long keyHash, Object value); - static void putUncachedWithJavaEq(ObjectHashMap map, Object key, long keyHash, Object value) { - assert isJavaEqualsAllowed(key) : key; - doPutWithRestart(null, null, map, key, keyHash, value, - InlinedBranchProfile.getUncached(), InlinedCountingConditionProfile.getUncached(), InlinedCountingConditionProfile.getUncached(), - InlinedCountingConditionProfile.getUncached(), InlinedCountingConditionProfile.getUncached(), InlinedBranchProfile.getUncached(), InlinedBranchProfile.getUncached(), - null); - } - // "public" for testing... @Specialization public static void doPutWithRestart(Frame frame, Node inliningTarget, ObjectHashMap map, Object key, long keyHash, Object value, @@ -560,10 +627,9 @@ public static void doPutWithRestart(Frame frame, Node inliningTarget, ObjectHash @Cached InlinedCountingConditionProfile collisionFoundEqKey, @Cached InlinedBranchProfile rehash1Profile, @Cached InlinedBranchProfile rehash2Profile, - @Cached PyObjectRichCompareBool.EqNode eqNode) { - // Must not call generic __eq__ before builtins are initialized - // If this assert fires: make sure to use putUncachedWithJavaEq during initialization - assert map.size == 0 || (SpecialMethodSlot.areBuiltinSlotsInitialized() || eqNode == null); + @Cached PyObjectRichCompareBool eqNode) { + // If this assert fires: you're probably using PutUnsafeNode, but should use PutNode + assert map.hasSideEffectingKeys || (!IsSideEffectingKeyNodeGen.getUncached().execute(null, key)); while (true) { try { doPut(frame, map, key, keyHash, value, inliningTarget, foundNullKey, foundEqKey, @@ -584,7 +650,7 @@ static void doPut(Frame frame, ObjectHashMap map, Object key, long keyHash, Obje InlinedCountingConditionProfile collisionFoundEqKey, InlinedBranchProfile rehash1Profile, InlinedBranchProfile rehash2Profile, - PyObjectRichCompareBool.EqNode eqNode) throws RestartLookupException { + PyObjectRichCompareBool eqNode) throws RestartLookupException { assert map.checkInternalState(); int[] indices = map.indices; int indicesLen = indices.length; @@ -608,7 +674,7 @@ static void doPut(Frame frame, ObjectHashMap map, Object key, long keyHash, Obje @InliningCutoff private static void putCollision(Frame frame, ObjectHashMap map, Object key, long keyHash, Object value, Node inliningTarget, InlinedCountingConditionProfile collisionFoundNoValue, InlinedCountingConditionProfile collisionFoundEqKey, - InlinedBranchProfile rehash2Profile, EqNode eqNode, + InlinedBranchProfile rehash2Profile, PyObjectRichCompareBool eqNode, int[] indices, int indicesLen, int compactIndex) throws RestartLookupException { markCollision(indices, compactIndex); long perturb = keyHash; @@ -719,7 +785,7 @@ public static Object doRemoveWithRestart(Frame frame, Node inliningTarget, Objec @Cached InlinedCountingConditionProfile collisionFoundNoValue, @Cached InlinedCountingConditionProfile collisionFoundEqKey, @Cached InlinedBranchProfile compactProfile, - @Cached PyObjectRichCompareBool.EqNode eqNode) { + @Cached PyObjectRichCompareBool eqNode) { while (true) { try { return doRemove(frame, inliningTarget, map, key, keyHash, foundNullKey, foundEqKey, @@ -737,7 +803,7 @@ static Object doRemove(Frame frame, Node inliningTarget, ObjectHashMap map, Obje InlinedCountingConditionProfile collisionFoundNoValue, InlinedCountingConditionProfile collisionFoundEqKey, InlinedBranchProfile compactProfile, - PyObjectRichCompareBool.EqNode eqNode) throws RestartLookupException { + PyObjectRichCompareBool eqNode) throws RestartLookupException { assert map.checkInternalState(); // TODO: move this to the point after we find the value to remove? if (CompilerDirectives.injectBranchProbability(SLOWPATH_PROBABILITY, map.needsCompaction())) { @@ -772,7 +838,7 @@ static Object doRemove(Frame frame, Node inliningTarget, ObjectHashMap map, Obje @InliningCutoff private static Object removeCollision(Frame frame, Node inliningTarget, ObjectHashMap map, Object key, long keyHash, InlinedCountingConditionProfile collisionFoundNoValue, InlinedCountingConditionProfile collisionFoundEqKey, - EqNode eqNode, int[] indices, int indicesLen, int compactIndex) throws RestartLookupException { + PyObjectRichCompareBool eqNode, int[] indices, int indicesLen, int compactIndex) throws RestartLookupException { int unwrappedIndex; long perturb = keyHash; int searchLimit = getBucketsCount(indices) + PERTURB_SHIFTS_COUT; @@ -824,7 +890,7 @@ public Throwable fillInStackTrace() { } private boolean keysEqual(int[] originalIndices, Frame frame, Node inliningTarget, int index, Object key, long keyHash, - PyObjectRichCompareBool.EqNode eqNode) throws RestartLookupException { + PyObjectRichCompareBool eqNode) throws RestartLookupException { if (hashes[index] != keyHash) { return false; } @@ -832,11 +898,7 @@ private boolean keysEqual(int[] originalIndices, Frame frame, Node inliningTarge if (originalKey == key) { return true; } - if (CompilerDirectives.inInterpreter() && eqNode == null) { - // this is hack, see putUncachedWithJavaEq - return javaEquals(originalKey, key); - } - boolean result = eqNode.compare(frame, inliningTarget, originalKey, key); + boolean result = eqNode.executeEq(frame, inliningTarget, originalKey, key); if (getKey(index) != originalKey || indices != originalIndices) { // Either someone overridden the slot we are just examining, or rehasing reallocated the // indices array. We need to restart the lookup. Other situations are OK: @@ -854,18 +916,6 @@ private boolean keysEqual(int[] originalIndices, Frame frame, Node inliningTarge return result; } - private static boolean javaEquals(Object a, Object b) { - CompilerAsserts.neverPartOfCompilation(); - assert isJavaEqualsAllowed(a) : a; - assert isJavaEqualsAllowed(b) : b; - return a.equals(b); - } - - private static boolean isJavaEqualsAllowed(Object o) { - return o instanceof PythonManagedClass || o instanceof PythonBuiltinClassType || // - o instanceof PythonNativeClass || o instanceof Number || o instanceof TruffleString; - } - /** * Called when we need space for new entry. It determines the new size from the number of slots * occupied by real values (i.e., does not count dummy entries), so the new size may be actually diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceNodes.java index 34de5272c6..d2637b0baf 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,26 +43,38 @@ import static com.oracle.graal.python.nodes.ErrorMessages.IS_NOT_A_SEQUENCE; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; +import com.oracle.graal.python.builtins.objects.bytes.PBytesLike; import com.oracle.graal.python.builtins.objects.common.SequenceNodesFactory.CachedGetObjectArrayNodeGen; import com.oracle.graal.python.builtins.objects.common.SequenceNodesFactory.GetObjectArrayNodeGen; import com.oracle.graal.python.builtins.objects.common.SequenceNodesFactory.SetSequenceStorageNodeGen; +import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.str.PString; import com.oracle.graal.python.builtins.objects.str.StringNodes; +import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.lib.PySequenceCheckNode; import com.oracle.graal.python.nodes.PGuards; +import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.object.IsForeignObjectNode; import com.oracle.graal.python.runtime.sequence.PSequence; +import com.oracle.graal.python.runtime.sequence.storage.ForeignSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; public abstract class SequenceNodes { @@ -115,7 +127,33 @@ static boolean doWithStorage(Node inliningTarget, PSequence seq, long idx, @GenerateUncached @GenerateInline(inlineByDefault = true) - public abstract static class GetSequenceStorageNode extends Node { + public abstract static class GetPSequenceStorageNode extends PNodeWithContext { + public abstract SequenceStorage execute(Node inliningTarget, PSequence seq); + + @Specialization + static SequenceStorage doTuple(PTuple seq) { + return seq.getSequenceStorage(); + } + + @Specialization + static SequenceStorage doBytesLike(PBytesLike seq) { + return seq.getSequenceStorage(); + } + + @Specialization + static SequenceStorage doList(PList seq) { + return seq.getSequenceStorage(); + } + + @Specialization + static SequenceStorage doSequence(@SuppressWarnings("unused") PSequence seq) { + throw CompilerDirectives.shouldNotReachHere(); + } + } + + @GenerateUncached + @GenerateInline(inlineByDefault = true) + public abstract static class GetSequenceStorageNode extends PNodeWithContext { public abstract SequenceStorage execute(Node inliningTarget, Object seq); @@ -127,25 +165,30 @@ public final SequenceStorage executeCached(Object seq) { return execute(this, seq); } - @Specialization(guards = {"seq.getClass() == cachedClass"}, limit = "2") - static SequenceStorage doSequenceCached(PSequence seq, - @Cached("seq.getClass()") Class cachedClass) { - return CompilerDirectives.castExact(seq, cachedClass).getSequenceStorage(); - } - - @Specialization(replaces = "doSequenceCached") - static SequenceStorage doSequence(PSequence seq) { - return seq.getSequenceStorage(); + @Specialization + static SequenceStorage doSequence(Node inliningTarget, PSequence seq, + @Cached GetPSequenceStorageNode getPSequenceStorageNode) { + return getPSequenceStorageNode.execute(inliningTarget, seq); } - @Specialization(guards = "!isPSequence(seq)") - static SequenceStorage doFallback(@SuppressWarnings("unused") Object seq) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("cannot get sequence storage of non-sequence object"); + // Note: this does not seem currently used but is good to accept foreign lists in more + // places + @Specialization(guards = {"isForeignObjectNode.execute(inliningTarget, seq)", "interop.hasArrayElements(seq)"}, limit = "1") + static SequenceStorage doForeign(Node inliningTarget, Object seq, + @Cached IsForeignObjectNode isForeignObjectNode, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop, + @Cached InlinedBranchProfile errorProfile) { + try { + long size = interop.getArraySize(seq); + return new ForeignSequenceStorage(seq, PInt.long2int(inliningTarget, size, errorProfile)); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(); + } } - static boolean isPSequence(Object object) { - return object instanceof PSequence; + @Fallback + static SequenceStorage doFallback(Node inliningTarget, Object seq) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, IS_NOT_A_SEQUENCE, seq); } @NeverDefault @@ -227,9 +270,9 @@ public abstract static class CheckIsSequenceNode extends Node { @Specialization static void check(Node inliningTarget, Object obj, @Cached PySequenceCheckNode sequenceCheckNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (!sequenceCheckNode.execute(inliningTarget, obj)) { - throw raiseNode.get(inliningTarget).raise(TypeError, IS_NOT_A_SEQUENCE, obj); + throw raiseNode.raise(inliningTarget, TypeError, IS_NOT_A_SEQUENCE, obj); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceStorageNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceStorageNodes.java index 79919e814b..f01905d609 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceStorageNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceStorageNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -26,7 +26,6 @@ package com.oracle.graal.python.builtins.objects.common; import static com.oracle.graal.python.builtins.objects.common.IndexNodes.checkBounds; -import static com.oracle.graal.python.builtins.objects.iterator.IteratorBuiltins.NextHelperNode.STOP_MARKER; import static com.oracle.graal.python.runtime.exception.PythonErrorType.IndexError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.MemoryError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.OverflowError; @@ -43,8 +42,8 @@ import java.lang.reflect.Array; import java.util.Arrays; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.modules.SysModuleBuiltins; import com.oracle.graal.python.builtins.objects.bytes.BytesNodes; import com.oracle.graal.python.builtins.objects.bytes.PBytesLike; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes; @@ -55,13 +54,9 @@ import com.oracle.graal.python.builtins.objects.common.IndexNodes.NormalizeIndexNode; import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetSequenceStorageNode; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.AppendNodeGen; -import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.CmpNodeGen; -import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.ConcatBaseNodeGen; -import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.ConcatNodeGen; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.CreateStorageFromIteratorNodeFactory.CreateStorageFromIteratorNodeCachedNodeGen; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.DeleteNodeGen; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.ExtendNodeGen; -import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.GetElementTypeNodeGen; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.GetItemDynamicNodeGen; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.GetItemNodeGen; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.GetItemScalarNodeGen; @@ -76,6 +71,7 @@ import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.SetItemNodeGen; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.StorageToNativeNodeGen; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.ToByteArrayNodeGen; +import com.oracle.graal.python.builtins.objects.floats.PFloat; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.iterator.IteratorBuiltins.NextHelperNode; import com.oracle.graal.python.builtins.objects.iterator.IteratorNodes.BuiltinIteratorLengthHint; @@ -90,11 +86,16 @@ import com.oracle.graal.python.builtins.objects.slice.SliceNodes.ComputeIndices; import com.oracle.graal.python.builtins.objects.str.PString; import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.CallSlotTpIterNextNode; +import com.oracle.graal.python.lib.IteratorExhausted; import com.oracle.graal.python.lib.PyIndexCheckNode; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.lib.PyObjectRichCompareBool; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; @@ -102,8 +103,6 @@ import com.oracle.graal.python.nodes.SpecialMethodNames; import com.oracle.graal.python.nodes.StringLiterals; import com.oracle.graal.python.nodes.builtins.ListNodes; -import com.oracle.graal.python.nodes.expression.BinaryComparisonNode; -import com.oracle.graal.python.nodes.expression.CoerceToBooleanNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; @@ -113,26 +112,27 @@ import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.native_memory.NativeBuffer; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.PSequence; import com.oracle.graal.python.runtime.sequence.storage.ArrayBasedSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.BoolSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.DoubleSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.EmptySequenceStorage; +import com.oracle.graal.python.runtime.sequence.storage.ForeignSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.IntSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.LongSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.MroSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.NativeByteSequenceStorage; +import com.oracle.graal.python.runtime.sequence.storage.NativeIntSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.NativeObjectSequenceStorage; +import com.oracle.graal.python.runtime.sequence.storage.NativePrimitiveSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.NativeSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage.StorageType; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorageFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStoreException; -import com.oracle.graal.python.runtime.sequence.storage.NativePrimitiveSequenceStorage; -import com.oracle.graal.python.runtime.sequence.storage.NativeIntSequenceStorage; import com.oracle.graal.python.util.BiFunction; import com.oracle.graal.python.util.OverflowException; import com.oracle.graal.python.util.PythonUtils; @@ -167,6 +167,7 @@ import com.oracle.truffle.api.profiles.InlinedExactClassProfile; import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile; import com.oracle.truffle.api.strings.TruffleString; + import sun.misc.Unsafe; public abstract class SequenceStorageNodes { @@ -179,12 +180,12 @@ public abstract static class SequenceStorageSqItemNode extends Node { @Specialization static Object doIt(Node inliningTarget, SequenceStorage self, int index, TruffleString errorMessage, - @Cached PRaiseNode.Lazy raiseNode, - @Cached SequenceStorageNodes.GetItemScalarNode getItemNode) { + @Cached PRaiseNode raiseNode, + @Cached GetItemScalarNode getItemNode) { return getItem(inliningTarget, self, index, errorMessage, raiseNode, getItemNode); } - private static Object getItem(Node inliningTarget, SequenceStorage storage, int index, TruffleString errorMessage, PRaiseNode.Lazy raiseNode, GetItemScalarNode getItemNode) { + private static Object getItem(Node inliningTarget, SequenceStorage storage, int index, TruffleString errorMessage, PRaiseNode raiseNode, GetItemScalarNode getItemNode) { checkBounds(inliningTarget, raiseNode, errorMessage, index, storage.length()); return getItemNode.execute(inliningTarget, storage, index); } @@ -192,7 +193,7 @@ private static Object getItem(Node inliningTarget, SequenceStorage storage, int @FunctionalInterface public interface StorageWrapperFactory { - Object create(PythonObjectFactory factory, SequenceStorage newStorage); + Object create(PythonLanguage language, SequenceStorage newStorage); } @GenerateInline @@ -214,11 +215,11 @@ abstract Object executeImpl(VirtualFrame frame, Node inliningTarget, SequenceSto @Specialization(guards = "!isPSlice(idx)") static Object doNonSlice(VirtualFrame frame, Node inliningTarget, SequenceStorage storage, Object idx, - TruffleString indexBoundsErrorMessage, StorageWrapperFactory wrapperFactory, + TruffleString indexBoundsErrorMessage, @SuppressWarnings("unused") StorageWrapperFactory wrapperFactory, @Cached PyNumberAsSizeNode numberAsSizeNode, @Cached InlinedConditionProfile negativeIndexProfile, - @Cached PRaiseNode.Lazy raiseNode, - @Cached SequenceStorageNodes.GetItemScalarNode getItemNode) { + @Cached PRaiseNode raiseNode, + @Cached GetItemScalarNode getItemNode) { int index = numberAsSizeNode.executeExact(frame, inliningTarget, idx, PythonBuiltinClassType.IndexError); if (negativeIndexProfile.profile(inliningTarget, index < 0)) { index += storage.length(); @@ -228,15 +229,15 @@ static Object doNonSlice(VirtualFrame frame, Node inliningTarget, SequenceStorag @Specialization static Object doSlice(VirtualFrame frame, Node inliningTarget, SequenceStorage storage, PSlice slice, - @SuppressWarnings("unused") TruffleString indexBoundsErrorMessage, StorageWrapperFactory wrapperFactory, - @Cached(inline = false) PythonObjectFactory factory, + TruffleString indexBoundsErrorMessage, StorageWrapperFactory wrapperFactory, + @Bind PythonLanguage language, @Cached CoerceToIntSlice sliceCast, @Cached(inline = false) ComputeIndices compute, @Cached(inline = false) GetItemSliceNode getItemSliceNode, @Cached LenOfRangeNode sliceLen) { SliceInfo info = compute.execute(frame, sliceCast.execute(inliningTarget, slice), storage.length()); SequenceStorage newStorage = getItemSliceNode.execute(storage, info.start, info.stop, info.step, sliceLen.len(inliningTarget, info)); - return wrapperFactory.create(factory, newStorage); + return wrapperFactory.create(language, newStorage); } } @@ -266,7 +267,7 @@ static boolean compatibleAssign(Node inliningTarget, SequenceStorage lhs, Sequen case Byte: return rhsType == Byte || rhsType == Uninitialized || rhsType == Empty; case Int: - return rhsType == StorageType.Byte || rhsType == StorageType.Int || rhsType == Uninitialized || rhsType == Empty; + return rhsType == Byte || rhsType == Int || rhsType == Uninitialized || rhsType == Empty; case Long: return rhsType == Byte || rhsType == Int || rhsType == Long || rhsType == Uninitialized || rhsType == Empty; case Double: @@ -318,7 +319,7 @@ static boolean compatibleAssign(Node inliningTarget, SequenceStorage lhs, Sequen @ImportStatic(PythonOptions.class) abstract static class SequenceStorageBaseNode extends PNodeWithContext { - protected static final int MAX_SEQUENCE_STORAGES = 9; + // Number of subclasses of ArrayBasedSequenceStorage protected static final int MAX_BASIC_STORAGES = 7; protected static boolean isNative(SequenceStorage store) { @@ -330,11 +331,11 @@ protected static boolean isEmpty(SequenceStorage left) { } protected static boolean isBoolean(StorageType et) { - return et == SequenceStorage.StorageType.Boolean; + return et == Boolean; } protected static boolean isByte(StorageType et) { - return et == StorageType.Byte; + return et == Byte; } protected static boolean isByteLike(StorageType et) { @@ -342,15 +343,15 @@ protected static boolean isByteLike(StorageType et) { } protected static boolean isInt(StorageType et) { - return et == StorageType.Int; + return et == Int; } protected static boolean isLong(StorageType et) { - return et == StorageType.Long; + return et == Long; } - protected static boolean isDouble(SequenceStorage.StorageType et) { - return et == StorageType.Double; + protected static boolean isDouble(StorageType et) { + return et == Double; } protected static boolean isObject(StorageType et) { @@ -403,9 +404,9 @@ public abstract static class GetItemNode extends NormalizingNode { @Child private GetItemScalarNode getItemScalarNode; @Child private GetItemSliceNode getItemSliceNode; - private final BiFunction factoryMethod; + private final BiFunction factoryMethod; - public GetItemNode(NormalizeIndexNode normalizeIndexNode, BiFunction factoryMethod) { + public GetItemNode(NormalizeIndexNode normalizeIndexNode, BiFunction factoryMethod) { super(normalizeIndexNode); this.factoryMethod = factoryMethod; } @@ -461,13 +462,12 @@ protected Object doScalarGeneric(VirtualFrame frame, SequenceStorage storage, Ob @SuppressWarnings("truffle-static-method") protected Object doSlice(VirtualFrame frame, SequenceStorage storage, PSlice slice, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, @Cached CoerceToIntSlice sliceCast, @Cached ComputeIndices compute, @Cached LenOfRangeNode sliceLen) { SliceInfo info = compute.execute(frame, sliceCast.execute(inliningTarget, slice), storage.length()); if (factoryMethod != null) { - return factoryMethod.apply(getGetItemSliceNode().execute(storage, info.start, info.stop, info.step, sliceLen.len(inliningTarget, info)), factory); + return factoryMethod.apply(getGetItemSliceNode().execute(storage, info.start, info.stop, info.step, sliceLen.len(inliningTarget, info)), PythonLanguage.get(inliningTarget)); } CompilerDirectives.transferToInterpreterAndInvalidate(); throw new IllegalStateException(); @@ -505,18 +505,18 @@ public static GetItemNode create() { } @NeverDefault - public static GetItemNode create(NormalizeIndexNode normalizeIndexNode, BiFunction factoryMethod) { + public static GetItemNode create(NormalizeIndexNode normalizeIndexNode, BiFunction factoryMethod) { return GetItemNodeGen.create(normalizeIndexNode, factoryMethod); } @NeverDefault - public static SequenceStorageNodes.GetItemNode createForList() { - return SequenceStorageNodes.GetItemNode.create(NormalizeIndexNode.forList(), (s, f) -> f.createList(s)); + public static GetItemNode createForList() { + return GetItemNode.create(NormalizeIndexNode.forList(), (s, l) -> PFactory.createList(l, s)); } @NeverDefault - public static SequenceStorageNodes.GetItemNode createForTuple() { - return SequenceStorageNodes.GetItemNode.create(NormalizeIndexNode.forTuple(), (s, f) -> f.createTuple(s)); + public static GetItemNode createForTuple() { + return GetItemNode.create(NormalizeIndexNode.forTuple(), (s, l) -> PFactory.createTuple(l, s)); } } @@ -544,7 +544,7 @@ protected static Object doScalarInt(Node inliningTarget, SequenceStorage storage @GenerateInline(inlineByDefault = true) @GenerateCached @ImportStatic(SequenceStorageBaseNode.class) - public abstract static class GetItemScalarNode extends Node { + public abstract static class GetItemScalarNode extends PNodeWithContext { public abstract Object execute(Node inliningTarget, SequenceStorage s, int idx); @@ -552,11 +552,6 @@ public final Object executeCached(SequenceStorage s, int idx) { return execute(null, s, idx); } - @NeverDefault - public static GetItemScalarNode create() { - return GetItemScalarNodeGen.create(); - } - public static Object executeUncached(SequenceStorage s, int idx) { return GetItemScalarNodeGen.getUncached().execute(null, s, idx); } @@ -631,6 +626,17 @@ protected static Object doNative(NativeSequenceStorage storage, int idx, @Cached(inline = false) GetNativeItemScalarNode getItem) { return getItem.execute(storage, idx); } + + @Specialization + protected static Object doForeign(Node inliningTarget, ForeignSequenceStorage storage, int idx, + @Cached ForeignSequenceStorage.ReadNode readNode) { + return readNode.execute(inliningTarget, storage, idx); + } + + @NeverDefault + public static GetItemScalarNode create() { + return GetItemScalarNodeGen.create(); + } } @GenerateUncached @@ -654,9 +660,9 @@ protected static int doNativeByte(NativeByteSequenceStorage storage, int idx, } @GenerateUncached - @ImportStatic({SequenceStorage.StorageType.class, SequenceStorageBaseNode.class}) + @ImportStatic({StorageType.class, SequenceStorageBaseNode.class}) @SuppressWarnings("truffle-inlining") // footprint reduction 40 -> 21 - public abstract static class GetItemSliceNode extends Node { + public abstract static class GetItemSliceNode extends PNodeWithContext { public abstract SequenceStorage execute(SequenceStorage s, int start, int stop, int step, int length); @@ -814,6 +820,17 @@ protected static SequenceStorage doNativeObject(NativeObjectSequenceStorage stor return new ObjectSequenceStorage(newArray); } + @Specialization + protected static SequenceStorage doForeign(ForeignSequenceStorage storage, int start, @SuppressWarnings("unused") int stop, int step, int length, + @Bind("this") Node inliningTarget, + @Cached ForeignSequenceStorage.ReadNode readNode) { + Object[] newArray = new Object[length]; + for (int i = start, j = 0; j < length; i += step, j++) { + newArray[j] = readNode.execute(inliningTarget, storage, i); + } + return new ObjectSequenceStorage(newArray); + } + private static NativeBuffer doNativePrimitiveSliceInBound(PythonContext pythonCtx, int start, int step, int sliceLength, NativePrimitiveSequenceStorage storage) { var unsafe = pythonCtx.getUnsafe(); long itemSize = storage.getItemSize(); @@ -1185,16 +1202,16 @@ public static SetItemNode create(TruffleString invalidItemErrorMessage) { } @NeverDefault - public static SequenceStorageNodes.SetItemNode createForList() { - return SequenceStorageNodes.SetItemNode.create(NormalizeIndexNode.forListAssign(), ListGeneralizationNode::create); + public static SetItemNode createForList() { + return SetItemNode.create(NormalizeIndexNode.forListAssign(), ListGeneralizationNode::create); } } @GenerateUncached - @GenerateInline(value = true) + @GenerateInline @GenerateCached(false) @ImportStatic({SequenceStorageBaseNode.class, PGuards.class}) - public abstract static class AbstractSetItemScalarNode extends Node { + public abstract static class AbstractSetItemScalarNode extends PNodeWithContext { public abstract void execute(Node inliningTarget, SequenceStorage s, int idx, Object value); @@ -1281,6 +1298,12 @@ protected static void doObject(@SuppressWarnings("unused") Node inliningTarget, storage.setObjectItemNormalized(idx, value); } + @Specialization + protected static void doForeign(Node inliningTarget, ForeignSequenceStorage storage, int idx, Object value, + @Cached ForeignSequenceStorage.WriteNode writeNode) { + writeNode.execute(inliningTarget, storage, idx, value); + } + @Fallback @SuppressWarnings("unused") static void doError(@SuppressWarnings("unused") Node inliningTarget, SequenceStorage s, int idx, Object item) { @@ -1525,7 +1548,7 @@ protected static boolean isArrayBasedSequenceStorage(Object o) { @GenerateInline @GenerateCached(false) @ImportStatic(SequenceStorageBaseNode.class) - public abstract static class ReverseNode extends Node { + public abstract static class ReverseNode extends PNodeWithContext { public abstract void execute(Node inliningTarget, SequenceStorage storage); @@ -1592,6 +1615,25 @@ static void doNative(NativeSequenceStorage storage, reverseNativeNode.execute(storage); } + @Specialization + @InliningCutoff + static void doForeign(Node inliningTarget, ForeignSequenceStorage storage, + @Cached ForeignSequenceStorage.ReadNoConversionNode readNode, + @Cached ForeignSequenceStorage.WriteNode writeNode) { + int length = storage.length(); + if (length > 0) { + int head = 0; + int tail = length - 1; + int middle = (length - 1) / 2; + + for (; head <= middle; head++, tail--) { + Object temp = readNode.execute(inliningTarget, storage, head); + writeNode.execute(inliningTarget, storage, head, readNode.execute(inliningTarget, storage, tail)); + writeNode.execute(inliningTarget, storage, tail, temp); + } + } + } + @GenerateUncached @GenerateInline(false) abstract static class ReverseNativeNode extends Node { @@ -1706,7 +1748,7 @@ static void multiStep(SequenceStorage self, SliceInfo sinfo, SequenceStorage val } else { /*- Assign slice */ if (wrongLength.profile(inliningTarget, needed != slicelen)) { - raiseNode.raise(ValueError, ErrorMessages.ATTEMPT_TO_ASSIGN_SEQ_OF_SIZE_TO_SLICE_OF_SIZE, needed, slicelen); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.ATTEMPT_TO_ASSIGN_SEQ_OF_SIZE_TO_SLICE_OF_SIZE, needed, slicelen); } for (int cur = start, i = 0; i < slicelen; cur += step, i++) { setLeftItemNode.execute(inliningTarget, self, cur, getRightItemNode.execute(inliningTarget, data, i)); @@ -1771,7 +1813,7 @@ static void singleStep(SequenceStorage self, int lo, int hi, SequenceStorage dat ensureCapacityNode.execute(inliningTarget, self, len + growth); if (memoryError.profile(inliningTarget, len > Integer.MAX_VALUE - growth)) { - throw raiseNode.raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } len += growth; @@ -1837,180 +1879,199 @@ static NativeSequenceStorage doObject(Object[] arr, int length, boolean createRe } } + @GenerateInline + @GenerateCached(false) public abstract static class CmpNode extends SequenceStorageBaseNode { - @Child private BinaryComparisonNode cmpOp; - @Child private CoerceToBooleanNode castToBooleanNode; - - protected CmpNode(BinaryComparisonNode cmpOp) { - this.cmpOp = cmpOp; - } - - public abstract boolean execute(VirtualFrame frame, SequenceStorage left, SequenceStorage right); - - private boolean testingEqualsWithDifferingLengths(int llen, int rlen) { - // shortcut: if the lengths differ, the lists differ. - CompilerAsserts.compilationConstant(cmpOp.getClass()); - if (cmpOp instanceof BinaryComparisonNode.EqNode) { - if (llen != rlen) { - return true; - } - } - return false; - } + public abstract boolean execute(VirtualFrame frame, Node inliningTarget, SequenceStorage left, SequenceStorage right, + boolean isListComparison, Object leftSeq, Object rightSeq, RichCmpOp op); @SuppressWarnings("unused") @Specialization(guards = {"isEmpty(left)", "isEmpty(right)"}) - boolean doEmpty(SequenceStorage left, SequenceStorage right) { - return cmpOp.cmp(0, 0); + static boolean doEmpty(SequenceStorage left, SequenceStorage right, boolean isListComparison, Object leftSeq, Object rightSeq, RichCmpOp op) { + return op.compare(0, 0); } @Specialization - boolean doBoolStorage(BoolSequenceStorage left, BoolSequenceStorage right) { + static boolean doBoolStorage(Node inliningTarget, BoolSequenceStorage left, BoolSequenceStorage right, boolean isListComparison, Object leftSeq, Object rightSeq, + RichCmpOp op, + @Shared @Cached InlinedLoopConditionProfile loopProfile) { int llen = left.length(); int rlen = right.length(); - if (testingEqualsWithDifferingLengths(llen, rlen)) { - return false; + if (op.isEqOrNe() && llen != rlen) { + return op == RichCmpOp.Py_NE; } - for (int i = 0; i < Math.min(llen, rlen); i++) { + // intentionally imprecise loop profile to avoid its overhead... + loopProfile.profileCounted(inliningTarget, Math.min(llen, rlen)); + for (int i = 0; loopProfile.inject(inliningTarget, i < Math.min(llen, rlen)); i++) { int litem = PInt.intValue(left.getBoolItemNormalized(i)); int ritem = PInt.intValue(right.getBoolItemNormalized(i)); if (litem != ritem) { - return cmpOp.cmp(litem, ritem); + LoopNode.reportLoopCount(inliningTarget, i); + return op.compare(litem, ritem); } } - return cmpOp.cmp(llen, rlen); + LoopNode.reportLoopCount(inliningTarget, Math.min(llen, rlen)); + return op.compare(llen, rlen); } @Specialization - boolean doByteStorage(ByteSequenceStorage left, ByteSequenceStorage right) { + static boolean doByteStorage(Node inliningTarget, ByteSequenceStorage left, ByteSequenceStorage right, boolean isListComparison, Object leftSeq, Object rightSeq, + RichCmpOp op, + @Shared @Cached InlinedLoopConditionProfile loopProfile) { int llen = left.length(); int rlen = right.length(); - if (testingEqualsWithDifferingLengths(llen, rlen)) { - return false; + if (op.isEqOrNe() && llen != rlen) { + return op == RichCmpOp.Py_NE; } - for (int i = 0; i < Math.min(llen, rlen); i++) { + // intentionally imprecise loop profile to avoid its overhead... + loopProfile.profileCounted(inliningTarget, Math.min(llen, rlen)); + for (int i = 0; loopProfile.inject(inliningTarget, i < Math.min(llen, rlen)); i++) { byte litem = left.getByteItemNormalized(i); byte ritem = right.getByteItemNormalized(i); if (litem != ritem) { - return cmpOp.cmp(litem, ritem); + LoopNode.reportLoopCount(inliningTarget, i); + return op.compare(litem, ritem); } } - return cmpOp.cmp(llen, rlen); + LoopNode.reportLoopCount(inliningTarget, Math.min(llen, rlen)); + return op.compare(llen, rlen); } @Specialization - boolean doIntStorage(IntSequenceStorage left, IntSequenceStorage right) { + static boolean doIntStorage(Node inliningTarget, IntSequenceStorage left, IntSequenceStorage right, boolean isListComparison, Object leftSeq, Object rightSeq, RichCmpOp op, + @Shared @Cached InlinedLoopConditionProfile loopProfile) { int llen = left.length(); int rlen = right.length(); - if (testingEqualsWithDifferingLengths(llen, rlen)) { - return false; + if (op.isEqOrNe() && llen != rlen) { + return op == RichCmpOp.Py_NE; } - for (int i = 0; i < Math.min(llen, rlen); i++) { + // intentionally imprecise loop profile to avoid its overhead... + loopProfile.profileCounted(inliningTarget, Math.min(llen, rlen)); + for (int i = 0; loopProfile.inject(inliningTarget, i < Math.min(llen, rlen)); i++) { int litem = left.getIntItemNormalized(i); int ritem = right.getIntItemNormalized(i); if (litem != ritem) { - return cmpOp.cmp(litem, ritem); + LoopNode.reportLoopCount(inliningTarget, i); + return op.compare(litem, ritem); } } - return cmpOp.cmp(llen, rlen); + LoopNode.reportLoopCount(inliningTarget, Math.min(llen, rlen)); + return op.compare(llen, rlen); } @Specialization - boolean doLongStorage(LongSequenceStorage left, LongSequenceStorage right) { + static boolean doLongStorage(Node inliningTarget, LongSequenceStorage left, LongSequenceStorage right, boolean isListComparison, Object leftSeq, Object rightSeq, + RichCmpOp op, + @Shared @Cached InlinedLoopConditionProfile loopProfile) { int llen = left.length(); int rlen = right.length(); - if (testingEqualsWithDifferingLengths(llen, rlen)) { - return false; + if (op.isEqOrNe() && llen != rlen) { + return op == RichCmpOp.Py_NE; } - for (int i = 0; i < Math.min(llen, rlen); i++) { + // intentionally imprecise loop profile to avoid its overhead... + loopProfile.profileCounted(inliningTarget, Math.min(llen, rlen)); + for (int i = 0; loopProfile.inject(inliningTarget, i < Math.min(llen, rlen)); i++) { long litem = left.getLongItemNormalized(i); long ritem = right.getLongItemNormalized(i); if (litem != ritem) { - return cmpOp.cmp(litem, ritem); + LoopNode.reportLoopCount(inliningTarget, i); + return op.compare(litem, ritem); } } - return cmpOp.cmp(llen, rlen); + LoopNode.reportLoopCount(inliningTarget, Math.min(llen, rlen)); + return op.compare(llen, rlen); } @Specialization - boolean doDoubleStorage(DoubleSequenceStorage left, DoubleSequenceStorage right) { + static boolean doDoubleStorage(Node inliningTarget, DoubleSequenceStorage left, DoubleSequenceStorage right, boolean isListComparison, Object leftSeq, Object rightSeq, + RichCmpOp op, + @Shared @Cached InlinedLoopConditionProfile loopProfile) { int llen = left.length(); int rlen = right.length(); - if (testingEqualsWithDifferingLengths(llen, rlen)) { - return false; + if (op.isEqOrNe() && llen != rlen) { + return op == RichCmpOp.Py_NE; } - for (int i = 0; i < Math.min(llen, rlen); i++) { + // intentionally imprecise loop profile to avoid its overhead... + loopProfile.profileCounted(inliningTarget, Math.min(llen, rlen)); + for (int i = 0; loopProfile.inject(inliningTarget, i < Math.min(llen, rlen)); i++) { double litem = left.getDoubleItemNormalized(i); double ritem = right.getDoubleItemNormalized(i); - if (java.lang.Double.compare(litem, ritem) != 0) { - return cmpOp.cmp(litem, ritem); + if (!PFloat.areIdentical(litem, ritem)) { + LoopNode.reportLoopCount(inliningTarget, i); + return op.compare(litem, ritem); } } - return cmpOp.cmp(llen, rlen); + LoopNode.reportLoopCount(inliningTarget, Math.min(llen, rlen)); + return op.compare(llen, rlen); } @Specialization @SuppressWarnings("truffle-static-method") - boolean doGeneric(VirtualFrame frame, SequenceStorage left, SequenceStorage right, - @Bind("this") Node inliningTarget, - @Cached PyObjectRichCompareBool.EqNode eqNode, + static boolean doGeneric(VirtualFrame frame, Node inliningTarget, SequenceStorage left, SequenceStorage right, boolean isListComparison, Object leftSeq, Object rightSeq, + RichCmpOp op, + @Cached PyObjectRichCompareBool eqNode, + @Cached PyObjectRichCompareBool cmpNode, + @Exclusive @Cached InlinedLoopConditionProfile loopProfile, + @Cached InlinedBranchProfile storageHasChanged, @Cached GetItemScalarNode getLeftItemNode, - @Cached GetItemScalarNode getRightItemNode) { + @Cached GetItemScalarNode getRightItemNode, + @Cached ListNodes.GetListStorageNode getListStorageNode) { int llen = left.length(); int rlen = right.length(); - if (testingEqualsWithDifferingLengths(llen, rlen)) { - return false; + if (op.isEqOrNe() && llen != rlen) { + return op == RichCmpOp.Py_NE; } - for (int i = 0; i < Math.min(llen, rlen); i++) { + // intentionally imprecise loop profile to avoid its overhead... + loopProfile.profileCounted(inliningTarget, Math.min(left.length(), right.length())); + for (int i = 0; loopProfile.inject(inliningTarget, i < Math.min(left.length(), right.length())); i++) { Object leftItem = getLeftItemNode.execute(inliningTarget, left, i); Object rightItem = getRightItemNode.execute(inliningTarget, right, i); - if (!eqNode.compare(frame, inliningTarget, leftItem, rightItem)) { - return cmpGeneric(frame, leftItem, rightItem); + if (!eqNode.execute(frame, inliningTarget, leftItem, rightItem, RichCmpOp.Py_EQ)) { + LoopNode.reportLoopCount(inliningTarget, i); + // Following CPython semantics: we must compare the length again... + SequenceStorage newLeft = null, newRight = null; + if (isListComparison) { + newLeft = getListStorageNode.execute(inliningTarget, leftSeq); + newRight = getListStorageNode.execute(inliningTarget, rightSeq); + if (i >= newLeft.length() || i >= newRight.length()) { + storageHasChanged.enter(inliningTarget); + return op.compare(newLeft.length(), newRight.length()); + } + } + // Then apply shortcut for eq/ne... + if (op.isEqOrNe()) { + return op.isNe(); + } + // Then re-read the items, because the __eq__ call could have changed them + if (isListComparison) { + leftItem = getLeftItemNode.execute(inliningTarget, newLeft, i); + rightItem = getRightItemNode.execute(inliningTarget, newRight, i); + } + // Then do the final comparison of now possibly different items + return cmpNode.execute(frame, inliningTarget, leftItem, rightItem, op); + } + // Note: the semantics of CPython (which is tested in its unit tests) is that the + // loop should re-read the list size in every iteration. For us this means also + // re-reading the storage. See {@code test_list.py: + // ListTest.test_equal_operator_modifying_operand}. + // + // This node is either used to compare two tuples or to compare two lists, which can + // be either PList or a foreign list. We assume that tuples are immutable, which is + // not entirely correct (C API), but taking care of that eventuality is stretching + // this too far. + CompilerAsserts.partialEvaluationConstant(isListComparison); + if (isListComparison) { + SequenceStorage newLeft = getListStorageNode.execute(inliningTarget, leftSeq); + SequenceStorage newRight = getListStorageNode.execute(inliningTarget, rightSeq); + if (left != newLeft || right != newRight) { + storageHasChanged.enter(inliningTarget); + left = newLeft; + right = newRight; + } } } - return cmpOp.cmp(llen, rlen); - } - - private boolean cmpGeneric(VirtualFrame frame, Object left, Object right) { - return castToBoolean(frame, cmpOp.executeObject(frame, left, right)); - } - - private boolean castToBoolean(VirtualFrame frame, Object value) { - if (castToBooleanNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - castToBooleanNode = insert(CoerceToBooleanNode.createIfTrueNode()); - } - return castToBooleanNode.executeBooleanCached(frame, value); - } - - @NeverDefault - public static CmpNode createLe() { - return CmpNodeGen.create(BinaryComparisonNode.LeNode.create()); - } - - @NeverDefault - public static CmpNode createLt() { - return CmpNodeGen.create(BinaryComparisonNode.LtNode.create()); - } - - @NeverDefault - public static CmpNode createGe() { - return CmpNodeGen.create(BinaryComparisonNode.GeNode.create()); - } - - @NeverDefault - public static CmpNode createGt() { - return CmpNodeGen.create(BinaryComparisonNode.GtNode.create()); - } - - @NeverDefault - public static CmpNode createEq() { - return CmpNodeGen.create(BinaryComparisonNode.EqNode.create()); - } - - @NeverDefault - public static CmpNode createNe() { - return CmpNodeGen.create(BinaryComparisonNode.NeNode.create()); + LoopNode.reportLoopCount(inliningTarget, Math.min(left.length(), right.length())); + return op.compare(left.length(), right.length()); } } @@ -2142,7 +2203,8 @@ static boolean isByteSequenceStorage(SequenceStorage s) { } @SuppressWarnings("truffle-inlining") // footprint reduction 68 -> 49 - abstract static class ConcatBaseNode extends SequenceStorageBaseNode { + @GenerateUncached + public abstract static class ConcatBaseNode extends SequenceStorageBaseNode { public abstract SequenceStorage execute(SequenceStorage dest, SequenceStorage left, SequenceStorage right); @@ -2154,7 +2216,7 @@ static SequenceStorage doLeftEmpty(@SuppressWarnings("unused") EmptySequenceStor try { return copyNode.execute(inliningTarget, right); } catch (OutOfMemoryError e) { - throw raiseNode.raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } } @@ -2166,7 +2228,7 @@ static SequenceStorage doRightEmpty(@SuppressWarnings("unused") EmptySequenceSto try { return copyNode.execute(inliningTarget, left); } catch (OutOfMemoryError e) { - throw raiseNode.raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } } @@ -2235,12 +2297,12 @@ static SequenceStorage doArrayBasedManagedEmptySameType(ArrayBasedSequenceStorag static SequenceStorage doGenericInplace(@SuppressWarnings("unused") SequenceStorage dest, SequenceStorage left, SequenceStorage right, @Bind("this") Node inliningTarget, @Exclusive @Cached GetItemScalarNode getItemRightNode, - @Exclusive @Cached InitializeItemScalarNode initalizeItemNode, + @Exclusive @Cached InitializeItemScalarNode initializeItemNode, @Exclusive @Cached SetLenNode setLenNode) { int len1 = left.length(); int len2 = right.length(); for (int i = 0; i < len2; i++) { - initalizeItemNode.execute(inliningTarget, left, i + len1, getItemRightNode.execute(inliningTarget, right, i)); + initializeItemNode.execute(inliningTarget, left, i + len1, getItemRightNode.execute(inliningTarget, right, i)); } setLenNode.execute(inliningTarget, left, len1 + len2); return left; @@ -2251,15 +2313,15 @@ static SequenceStorage doGeneric(SequenceStorage dest, SequenceStorage left, Seq @Bind("this") Node inliningTarget, @Exclusive @Cached GetItemScalarNode getItemLeftNode, @Exclusive @Cached GetItemScalarNode getItemRightNode, - @Exclusive @Cached InitializeItemScalarNode initalizeItemNode, + @Exclusive @Cached InitializeItemScalarNode initializeItemNode, @Exclusive @Cached SetLenNode setLenNode) { int len1 = left.length(); int len2 = right.length(); for (int i = 0; i < len1; i++) { - initalizeItemNode.execute(inliningTarget, dest, i, getItemLeftNode.execute(inliningTarget, left, i)); + initializeItemNode.execute(inliningTarget, dest, i, getItemLeftNode.execute(inliningTarget, left, i)); } for (int i = 0; i < len2; i++) { - initalizeItemNode.execute(inliningTarget, dest, i + len1, getItemRightNode.execute(inliningTarget, right, i)); + initializeItemNode.execute(inliningTarget, dest, i + len1, getItemRightNode.execute(inliningTarget, right, i)); } setLenNode.execute(inliningTarget, dest, len1 + len2); return dest; @@ -2271,105 +2333,33 @@ private static void concat(Object dest, Object arr1, int len1, Object arr2, int } } - /** - * Concatenates two sequence storages; creates a storage of a suitable type and writes the - * result to the new storage. - */ - public abstract static class ConcatNode extends SequenceStorageBaseNode { - private static final TruffleString DEFAULT_ERROR_MSG = ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP; - - @Child private ConcatBaseNode concatBaseNode = ConcatBaseNodeGen.create(); - @Child private GeneralizationNode genNode; - - private final Supplier genNodeProvider; - - /* - * CPython is inconsistent when too repeats are done. Most types raise MemoryError, but e.g. - * bytes raises OverflowError when the memory might be available but the size overflows - * sys.maxint - */ - private final PythonBuiltinClassType errorForOverflow; - - ConcatNode(Supplier genNodeProvider, PythonBuiltinClassType errorForOverflow) { - this.genNodeProvider = genNodeProvider; - this.errorForOverflow = errorForOverflow; - } + @GenerateInline + @GenerateCached(false) + @GenerateUncached + public abstract static class ConcatListOrTupleNode extends Node { - public abstract SequenceStorage execute(SequenceStorage left, SequenceStorage right); + public abstract SequenceStorage execute(Node inliningTarget, SequenceStorage left, SequenceStorage right); @Specialization - SequenceStorage doRight(SequenceStorage left, SequenceStorage right, - @Bind("this") Node inliningTarget, - @Cached CreateEmptyNode createEmptyNode, - @Cached InlinedConditionProfile shouldOverflow, + static SequenceStorage concat(Node inliningTarget, SequenceStorage left, SequenceStorage right, + @Cached CreateEmpty2Node create, + @Cached(inline = false) ConcatBaseNode concat, @Cached PRaiseNode raiseNode) { - int destlen = 0; try { int len1 = left.length(); int len2 = right.length(); - // we eagerly generalize the store to avoid possible cascading generalizations - destlen = PythonUtils.addExact(len1, len2); - if (errorForOverflow == OverflowError && shouldOverflow.profile(inliningTarget, destlen >= SysModuleBuiltins.MAXSIZE)) { - // cpython raises an overflow error when this happens - throw raiseNode.raise(OverflowError); + int destlen = PythonUtils.addExact(len1, len2); + SequenceStorage empty = create.execute(inliningTarget, left, right, destlen); + empty.setNewLength(destlen); + try { + return concat.execute(empty, left, right); + } catch (SequenceStoreException e) { + throw CompilerDirectives.shouldNotReachHere(); } - SequenceStorage generalized = generalizeStore(createEmpty(createEmptyNode, inliningTarget, left, right, destlen), right); - return doConcat(generalized, left, right); - } catch (OutOfMemoryError e) { - throw raiseNode.raise(MemoryError); - } catch (OverflowException e) { - throw raiseNode.raise(errorForOverflow); + } catch (OutOfMemoryError | OverflowException e) { + throw raiseNode.raise(inliningTarget, MemoryError); } } - - private SequenceStorage createEmpty(CreateEmptyNode createEmptyNode, Node inliningTarget, SequenceStorage l, SequenceStorage r, int len) { - if (l instanceof EmptySequenceStorage) { - return createEmptyNode.execute(inliningTarget, r, len, -1); - } - return createEmptyNode.execute(inliningTarget, l, len, len); - } - - private SequenceStorage doConcat(SequenceStorage dest, SequenceStorage leftProfiled, SequenceStorage rightProfiled) { - try { - return concatBaseNode.execute(dest, leftProfiled, rightProfiled); - } catch (SequenceStoreException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("generalized sequence storage cannot take value: " + e.getIndicationValue()); - } - } - - private SequenceStorage generalizeStore(SequenceStorage storage, Object value) { - if (genNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - genNode = insert(genNodeProvider.get()); - } - return genNode.executeCached(storage, value); - } - - @NeverDefault - public static ConcatNode create() { - return create(() -> NoGeneralizationCustomMessageNode.create(DEFAULT_ERROR_MSG), MemoryError); - } - - @NeverDefault - public static ConcatNode createWithOverflowError() { - return create(() -> NoGeneralizationCustomMessageNode.create(DEFAULT_ERROR_MSG), OverflowError); - } - - @NeverDefault - public static ConcatNode create(TruffleString msg) { - return create(() -> NoGeneralizationCustomMessageNode.create(msg), MemoryError); - } - - @NeverDefault - public static ConcatNode create(Supplier genNodeProvider) { - return create(genNodeProvider, MemoryError); - } - - @NeverDefault - private static ConcatNode create(Supplier genNodeProvider, PythonBuiltinClassType errorForOverflow) { - return ConcatNodeGen.create(genNodeProvider, errorForOverflow); - } } @ImportStatic(PGuards.class) @@ -2431,25 +2421,31 @@ SequenceStorage doWithoutStorage(VirtualFrame frame, SequenceStorage left, Objec @Bind("this") Node inliningTarget, @Cached PyObjectGetIter getIter, @Exclusive @Cached EnsureCapacityNode ensureCapacityNode, - @Cached GetNextNode getNextNode, - @Cached IsBuiltinObjectProfile errorProfile, + @Cached GetObjectSlotsNode getSlots, + @Cached CallSlotTpIterNextNode callIterNext, + @Cached IsBuiltinObjectProfile stopIterationProfile, + @Cached InlinedLoopConditionProfile loopProfile, @Cached AppendNode appendNode) { SequenceStorage currentStore = left; int lenLeft = currentStore.length(); Object it = getIter.execute(frame, inliningTarget, iterable); + TpSlot iterNext = getSlots.execute(inliningTarget, it).tp_iternext(); if (len > 0) { ensureCapacityNode.execute(inliningTarget, left, lengthResult(lenLeft, len)); } - while (true) { - Object value; + boolean exhausted = false; + while (loopProfile.profile(inliningTarget, !exhausted)) { try { - value = getNextNode.execute(frame, it); + Object value = callIterNext.execute(frame, inliningTarget, iterNext, it); currentStore = appendNode.execute(inliningTarget, currentStore, value, genNodeProvider); + } catch (IteratorExhausted e) { + exhausted = true; } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - return currentStore; + e.expectStopIteration(inliningTarget, stopIterationProfile); + exhausted = true; } } + return currentStore; } private SequenceStorage generalizeStore(SequenceStorage storage, Object value) { @@ -2472,8 +2468,6 @@ public static ExtendNode create(GenNodeSupplier genNodeProvider) { } public abstract static class RepeatNode extends SequenceStorageBaseNode { - @Child private RepeatNode recursive; - /* * CPython is inconsistent when too repeats are done. Most types raise MemoryError, but e.g. * bytes raises OverflowError when the memory might be available but the size overflows @@ -2485,8 +2479,6 @@ protected RepeatNode(PythonBuiltinClassType errorForOverflow) { this.errorForOverflow = errorForOverflow; } - public abstract SequenceStorage execute(VirtualFrame frame, SequenceStorage left, Object times); - public abstract SequenceStorage execute(VirtualFrame frame, SequenceStorage left, int times); @Specialization @@ -2504,95 +2496,102 @@ static SequenceStorage doZeroRepeat(SequenceStorage s, @SuppressWarnings("unused /* special but common case: something like '[False] * n' */ @Specialization(guards = {"s.length() == 1", "times > 0"}) BoolSequenceStorage doBoolSingleElement(BoolSequenceStorage s, int times, + @Bind("this") Node inliningTarget, @Shared @Cached PRaiseNode raiseNode) { try { boolean[] repeated = new boolean[PythonUtils.multiplyExact(s.length(), times)]; Arrays.fill(repeated, s.getBoolItemNormalized(0)); return new BoolSequenceStorage(repeated); } catch (OutOfMemoryError e) { - throw raiseNode.raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } catch (OverflowException e) { - throw raiseNode.raise(errorForOverflow); + throw raiseNode.raise(inliningTarget, errorForOverflow); } } /* special but common case: something like '["\x00"] * n' */ @Specialization(guards = {"s.length() == 1", "times > 0"}) ByteSequenceStorage doByteSingleElement(ByteSequenceStorage s, int times, + @Bind("this") Node inliningTarget, @Shared @Cached PRaiseNode raiseNode) { try { byte[] repeated = new byte[PythonUtils.multiplyExact(s.length(), times)]; Arrays.fill(repeated, s.getByteItemNormalized(0)); return new ByteSequenceStorage(repeated); } catch (OutOfMemoryError e) { - throw raiseNode.raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } catch (OverflowException e) { - throw raiseNode.raise(errorForOverflow); + throw raiseNode.raise(inliningTarget, errorForOverflow); } } /* special but common case: something like '[0] * n' */ @Specialization(guards = {"s.length() == 1", "times > 0"}) IntSequenceStorage doIntSingleElement(IntSequenceStorage s, int times, + @Bind("this") Node inliningTarget, @Shared @Cached PRaiseNode raiseNode) { try { int[] repeated = new int[PythonUtils.multiplyExact(s.length(), times)]; Arrays.fill(repeated, s.getIntItemNormalized(0)); return new IntSequenceStorage(repeated); } catch (OutOfMemoryError e) { - throw raiseNode.raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } catch (OverflowException e) { - throw raiseNode.raise(errorForOverflow); + throw raiseNode.raise(inliningTarget, errorForOverflow); } } /* special but common case: something like '[0L] * n' */ @Specialization(guards = {"s.length() == 1", "times > 0"}) LongSequenceStorage doLongSingleElement(LongSequenceStorage s, int times, + @Bind("this") Node inliningTarget, @Shared @Cached PRaiseNode raiseNode) { try { long[] repeated = new long[PythonUtils.multiplyExact(s.length(), times)]; Arrays.fill(repeated, s.getLongItemNormalized(0)); return new LongSequenceStorage(repeated); } catch (OutOfMemoryError e) { - throw raiseNode.raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } catch (OverflowException e) { - throw raiseNode.raise(errorForOverflow); + throw raiseNode.raise(inliningTarget, errorForOverflow); } } /* special but common case: something like '[0.0] * n' */ @Specialization(guards = {"s.length() == 1", "times > 0"}) DoubleSequenceStorage doDoubleSingleElement(DoubleSequenceStorage s, int times, + @Bind("this") Node inliningTarget, @Shared @Cached PRaiseNode raiseNode) { try { double[] repeated = new double[PythonUtils.multiplyExact(s.length(), times)]; Arrays.fill(repeated, s.getDoubleItemNormalized(0)); return new DoubleSequenceStorage(repeated); } catch (OutOfMemoryError e) { - throw raiseNode.raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } catch (OverflowException e) { - throw raiseNode.raise(errorForOverflow); + throw raiseNode.raise(inliningTarget, errorForOverflow); } } /* special but common case: something like '[None] * n' */ @Specialization(guards = {"s.length() == 1", "times > 0"}) ObjectSequenceStorage doObjectSingleElement(ObjectSequenceStorage s, int times, + @Bind("this") Node inliningTarget, @Shared @Cached PRaiseNode raiseNode) { try { Object[] repeated = new Object[PythonUtils.multiplyExact(s.length(), times)]; Arrays.fill(repeated, s.getObjectItemNormalized(0)); return new ObjectSequenceStorage(repeated); } catch (OutOfMemoryError e) { - throw raiseNode.raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } catch (OverflowException e) { - throw raiseNode.raise(errorForOverflow); + throw raiseNode.raise(inliningTarget, errorForOverflow); } } @Specialization(limit = "MAX_BASIC_STORAGES", guards = {"times > 0", "!isNative(s)", "s.getClass() == cachedClass"}) SequenceStorage doArrayBasedManaged(ArrayBasedSequenceStorage s, int times, + @Bind("this") Node inliningTarget, @Shared @Cached PRaiseNode raiseNode, @Cached("s.getClass()") Class cachedClass) { try { @@ -2606,9 +2605,9 @@ SequenceStorage doArrayBasedManaged(ArrayBasedSequenceStorage s, int times, repeated.setNewLength(newLength); return repeated; } catch (OutOfMemoryError e) { - throw raiseNode.raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } catch (OverflowException e) { - throw raiseNode.raise(errorForOverflow); + throw raiseNode.raise(inliningTarget, errorForOverflow); } } @@ -2640,28 +2639,10 @@ SequenceStorage doGeneric(SequenceStorage s, int times, repeated.setNewLength(newLen); return repeated; } catch (OutOfMemoryError e) { - throw raiseNode.raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } catch (OverflowException e) { - throw raiseNode.raise(errorForOverflow); - } - } - - @Specialization(guards = "!isInt(times)") - @SuppressWarnings("truffle-static-method") - SequenceStorage doNonInt(VirtualFrame frame, SequenceStorage s, Object times, - @Bind("this") Node inliningTarget, - @Cached PyIndexCheckNode indexCheckNode, - @Cached PyNumberAsSizeNode asSizeNode, - @Shared @Cached PRaiseNode raiseNode) { - if (!indexCheckNode.execute(inliningTarget, times)) { - throw raiseNode.raise(TypeError, ErrorMessages.CANT_MULTIPLY_SEQ_BY_NON_INT, times); - } - int i = asSizeNode.executeExact(frame, inliningTarget, times); - if (recursive == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - recursive = insert(RepeatNodeGen.create(errorForOverflow)); + throw raiseNode.raise(inliningTarget, errorForOverflow); } - return recursive.execute(frame, s, i); } private static void repeat(Object dest, Object src, int len, int times) { @@ -2737,10 +2718,10 @@ public static int doDoubleStorage(DoubleSequenceStorage s, double item) { @Specialization static int doGeneric(VirtualFrame frame, Node inliningTarget, SequenceStorage self, Object item, @Cached(inline = false) GetItemScalarNode getItemNode, - @Cached PyObjectRichCompareBool.EqNode eqNode) { + @Cached PyObjectRichCompareBool eqNode) { for (int i = 0; i < self.length(); i++) { Object seqItem = getItemNode.execute(inliningTarget, self, i); - if (eqNode.compare(frame, inliningTarget, seqItem, item)) { + if (eqNode.execute(frame, inliningTarget, seqItem, item, RichCmpOp.Py_EQ)) { return i; } } @@ -2800,7 +2781,7 @@ protected SequenceStorage doGeneric(SequenceStorage s, Object indicationVal, return s; } - throw raiseNode.raise(TypeError, getErrorMessage()); + throw raiseNode.raise(inliningTarget, TypeError, getErrorMessage()); } protected TruffleString getErrorMessage() { @@ -3071,6 +3052,23 @@ static ArrayBasedSequenceStorage doIt(Node inliningTarget, SequenceStorage s, in @GenerateInline @GenerateCached(false) + @GenerateUncached + public abstract static class CreateEmpty2Node extends SequenceStorageBaseNode { + + public abstract SequenceStorage execute(Node inliningTarget, SequenceStorage s1, SequenceStorage s2, int cap); + + @Specialization + static SequenceStorage doIt(Node inliningTarget, SequenceStorage s1, SequenceStorage s2, int cap, + @Cached GetElementType getElementType1, + @Cached GetElementType getElementType2, + @Cached CreateEmptyForTypesNode create) { + return create.execute(inliningTarget, getElementType1.execute(inliningTarget, s1), getElementType2.execute(inliningTarget, s2), cap); + } + } + + @GenerateInline + @GenerateCached(false) + @GenerateUncached abstract static class CreateEmptyForTypeNode extends SequenceStorageBaseNode { public abstract ArrayBasedSequenceStorage execute(Node inliningTarget, StorageType type, int cap); @@ -3086,7 +3084,7 @@ static ByteSequenceStorage doByte(@SuppressWarnings("unused") StorageType type, } @Specialization(guards = "isInt(type)") - static IntSequenceStorage doInt(@SuppressWarnings("unused") SequenceStorage.StorageType type, int cap) { + static IntSequenceStorage doInt(@SuppressWarnings("unused") StorageType type, int cap) { return new IntSequenceStorage(cap); } @@ -3096,7 +3094,7 @@ static LongSequenceStorage doLong(@SuppressWarnings("unused") StorageType type, } @Specialization(guards = "isDouble(type)") - static DoubleSequenceStorage doDouble(@SuppressWarnings("unused") SequenceStorage.StorageType type, int cap) { + static DoubleSequenceStorage doDouble(@SuppressWarnings("unused") StorageType type, int cap) { return new DoubleSequenceStorage(cap); } @@ -3106,6 +3104,46 @@ static ObjectSequenceStorage doObject(@SuppressWarnings("unused") StorageType ty } } + @GenerateInline + @GenerateCached(false) + @GenerateUncached + @ImportStatic(StorageType.class) + abstract static class CreateEmptyForTypesNode extends SequenceStorageBaseNode { + + public abstract SequenceStorage execute(Node inliningTarget, StorageType type1, StorageType type2, int cap); + + @Specialization(guards = {"type1 == type2 || type2 == Empty", "type1 != Empty"}) + static SequenceStorage doSameOr1Empty(Node inliningTarget, StorageType type1, @SuppressWarnings("unused") StorageType type2, int cap, + @Shared @Cached CreateEmptyForTypeNode create) { + return create.execute(inliningTarget, type1, cap); + } + + @Specialization(guards = {"type1 == Empty", "type2 != Empty"}) + static SequenceStorage do2Empty(Node inliningTarget, @SuppressWarnings("unused") StorageType type1, StorageType type2, int cap, + @Shared @Cached CreateEmptyForTypeNode create) { + return create.execute(inliningTarget, type2, cap); + } + + @Specialization(guards = {"type1 == Empty", "type2 == Empty", "cap == 0"}) + static SequenceStorage doBothEmpty(@SuppressWarnings("unused") StorageType type1, @SuppressWarnings("unused") StorageType type2, @SuppressWarnings("unused") int cap) { + return EmptySequenceStorage.INSTANCE; + } + + @Specialization(guards = "generalizeToLong(type1, type2)") + static SequenceStorage doLong(@SuppressWarnings("unused") StorageType type1, @SuppressWarnings("unused") StorageType type2, int cap) { + return new LongSequenceStorage(cap); + } + + @Fallback + static SequenceStorage doObject(@SuppressWarnings("unused") StorageType type1, @SuppressWarnings("unused") StorageType type2, int cap) { + return new ObjectSequenceStorage(cap); + } + + protected static boolean generalizeToLong(StorageType type1, StorageType type2) { + return isInt(type1) && isLong(type2) || isLong(type1) && isInt(type2); + } + } + @GenerateUncached @GenerateInline @GenerateCached(false) @@ -3167,6 +3205,11 @@ static void doMro(MroSequenceStorage storage, int cap) { throw CompilerDirectives.shouldNotReachHere(); } + @Specialization + static void doForeign(ForeignSequenceStorage storage, int cap) { + // nothing we can do + } + @GenerateInline(false) @GenerateUncached abstract static class EnsureCapacityNativeNode extends Node { @@ -3178,7 +3221,7 @@ static void doNativeByte(NativeByteSequenceStorage s, int cap, @Shared @CachedLibrary(limit = "2") InteropLibrary lib, @Shared @Cached CStructAccess.AllocateNode alloc, @Shared @Cached CStructAccess.FreeNode free, - @Shared @Cached PRaiseNode.Lazy raiseNode, + @Shared @Cached PRaiseNode raiseNode, @Cached CStructAccess.ReadByteNode read, @Cached CStructAccess.WriteByteNode write) { int oldCapacity = s.getCapacity(); @@ -3187,7 +3230,7 @@ static void doNativeByte(NativeByteSequenceStorage s, int cap, Object oldMem = s.getPtr(); Object newMem = alloc.alloc(newCapacity); if (lib.isNull(newMem)) { - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } // TODO: turn this into a memcpy for (long i = 0; i < oldCapacity; i++) { @@ -3205,7 +3248,7 @@ static void doNativeObject(NativeObjectSequenceStorage s, int cap, @Shared @CachedLibrary(limit = "2") InteropLibrary lib, @Shared @Cached CStructAccess.AllocateNode alloc, @Shared @Cached CStructAccess.FreeNode free, - @Shared @Cached PRaiseNode.Lazy raiseNode, + @Shared @Cached PRaiseNode raiseNode, @Cached CStructAccess.ReadPointerNode read, @Cached CStructAccess.WritePointerNode write) { int oldCapacity = s.getCapacity(); @@ -3215,7 +3258,7 @@ static void doNativeObject(NativeObjectSequenceStorage s, int cap, long bytes = newCapacity * 8; Object newMem = alloc.alloc(bytes); if (lib.isNull(newMem)) { - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } // TODO: turn this into a memcpy for (long i = 0; i < oldCapacity; i++) { @@ -3302,7 +3345,7 @@ static SequenceStorage doNativeInt(Node inliningTarget, NativeIntSequenceStorage static SequenceStorage doNativeBytes(NativeByteSequenceStorage s, @Shared @Cached(inline = false) GetNativeItemScalarNode getItem) { byte[] bytes = new byte[s.length()]; - for (int i = 0; i < s.length(); i++) { + for (int i = 0; i < bytes.length; i++) { bytes[i] = (byte) (int) getItem.execute(s, i); } return new ByteSequenceStorage(bytes); @@ -3312,11 +3355,21 @@ static SequenceStorage doNativeBytes(NativeByteSequenceStorage s, static SequenceStorage doNativeObjects(NativeObjectSequenceStorage s, @Shared @Cached(inline = false) GetNativeItemScalarNode getItem) { Object[] objects = new Object[s.length()]; - for (int i = 0; i < s.length(); i++) { + for (int i = 0; i < objects.length; i++) { objects[i] = getItem.execute(s, i); } return new ObjectSequenceStorage(objects); } + + @Specialization + static SequenceStorage doForeign(Node inliningTarget, ForeignSequenceStorage s, + @Cached ForeignSequenceStorage.ReadNode readNode) { + Object[] objects = new Object[s.length()]; + for (int i = 0; i < objects.length; i++) { + objects[i] = readNode.execute(inliningTarget, s, i); + } + return new ObjectSequenceStorage(objects); + } } @GenerateUncached @@ -3386,7 +3439,7 @@ static Object[] doNative(NativeSequenceStorage s, @GenerateInline @GenerateCached(false) @ImportStatic(SequenceStorageBaseNode.class) - public abstract static class SetLenNode extends Node { + public abstract static class SetLenNode extends PNodeWithContext { public abstract void execute(Node inliningTarget, SequenceStorage s, int len); @@ -3410,6 +3463,18 @@ static void doNative(NativeSequenceStorage s, int len, static void doNativePrimitive(NativePrimitiveSequenceStorage s, int len) { s.setNewLength(len); } + + @Specialization + static void doForeign(Node inliningTarget, ForeignSequenceStorage s, int len, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop, + @Cached InlinedBranchProfile errorProfile, + @Cached ForeignSequenceStorage.RemoveNode removeNode) { + int size; + while ((size = s.getArraySize(inliningTarget, interop, errorProfile)) > len) { + removeNode.execute(inliningTarget, s, size - 1); + } + s.setNewLength(size); + } } @GenerateUncached @@ -3423,12 +3488,14 @@ public abstract static class SetNativeLenNode extends Node { static void doShrink(NativeObjectSequenceStorage s, int len, @Bind("this") Node inliningTarget, @Cached CStructAccess.ReadPointerNode readNode, + @Cached CStructAccess.WritePointerNode writeNode, @Cached CExtNodes.XDecRefPointerNode decRefPointerNode) { if (len < s.length()) { // When shrinking, we need to decref the items that are now past the end for (int i = len; i < s.length(); i++) { Object elementPointer = readNode.readArrayElement(s.getPtr(), i); decRefPointerNode.execute(inliningTarget, elementPointer); + writeNode.writeArrayElement(s.getPtr(), i, 0L); } } s.setNewLength(len); @@ -3519,13 +3586,13 @@ public abstract static class DeleteItemNode extends SequenceStorageBaseNode { public abstract void execute(Node node, SequenceStorage s, int idx); - @Specialization(guards = "isLastItem(s, idx)") + @Specialization(guards = {"isLastItem(s, idx)", "!isForeignSequenceStorage(s)"}) static void doLastItem(Node inliningTarget, SequenceStorage s, @SuppressWarnings("unused") int idx, @Exclusive @Cached SetLenNode setLenNode) { setLenNode.execute(inliningTarget, s, s.length() - 1); } - @Specialization + @Specialization(guards = {"!isNativeObjectStorage(s)", "!isForeignSequenceStorage(s)"}) static void doGeneric(Node inliningTarget, SequenceStorage s, int idx, @Cached GetItemScalarNode getItemNode, @Cached SetItemScalarNode setItemNode, @@ -3538,6 +3605,27 @@ static void doGeneric(Node inliningTarget, SequenceStorage s, int idx, setLenNode.execute(inliningTarget, s, len - 1); } + @Specialization + static void doNativeObjectStorage(Node inliningTarget, NativeObjectSequenceStorage s, int idx, + @Cached(inline = false) CStructAccess.ReadPointerNode readPointerNode, + @Cached(inline = false) CStructAccess.WritePointerNode writePointerNode, + @Cached CExtNodes.XDecRefPointerNode decRefNode) { + int len = s.length(); + Object deleted = readPointerNode.readArrayElement(s.getPtr(), idx); + for (int i = idx; i < len - 1; i++) { + writePointerNode.writeArrayElement(s.getPtr(), i, readPointerNode.readArrayElement(s.getPtr(), i + 1)); + } + writePointerNode.writeArrayElement(s.getPtr(), len - 1, 0L); + s.setNewLength(len - 1); + decRefNode.execute(inliningTarget, deleted); + } + + @Specialization + static void doForeign(Node inliningTarget, ForeignSequenceStorage s, int idx, + @Cached ForeignSequenceStorage.RemoveNode removeNode) { + removeNode.execute(inliningTarget, s, idx); + } + protected static boolean isLastItem(SequenceStorage s, int idx) { return idx == s.length() - 1; } @@ -3596,7 +3684,7 @@ static void multipleSteps(Node inliningTarget, SequenceStorage store, SliceInfo multipleSteps(store, sinfo, inliningTarget, setLenNode, ensureCapacityNode, memove); } - static void multipleSteps(SequenceStorage self, PSlice.SliceInfo sinfo, + static void multipleSteps(SequenceStorage self, SliceInfo sinfo, Node inliningTarget, SetLenNode setLenNode, EnsureCapacityNode ensureCapacityNode, @@ -3652,21 +3740,52 @@ static void multipleSteps(SequenceStorage self, PSlice.SliceInfo sinfo, @ImportStatic(SequenceStorageBaseNode.class) public abstract static class GetElementType extends Node { - public abstract SequenceStorage.StorageType execute(Node inliningTarget, SequenceStorage s); + public abstract StorageType execute(Node inliningTarget, SequenceStorage s); - @Specialization(limit = "MAX_SEQUENCE_STORAGES", guards = {"s.getClass() == cachedClass"}) - static StorageType doCached(SequenceStorage s, - @Cached("s.getClass()") Class cachedClass) { - return cachedClass.cast(s).getElementType(); + @Specialization + static StorageType type(EmptySequenceStorage s) { + return Empty; } - @Specialization(replaces = "doCached") - static SequenceStorage.StorageType doUncached(SequenceStorage s) { - return s.getElementType(); + @Specialization + static StorageType type(BoolSequenceStorage s) { + return Boolean; } - public static GetElementType getUncached() { - return GetElementTypeNodeGen.getUncached(); + @Specialization + static StorageType type(ByteSequenceStorage s) { + return Byte; + } + + @Specialization + static StorageType type(NativeByteSequenceStorage s) { + return Byte; + } + + @Specialization + static StorageType type(IntSequenceStorage s) { + return Int; + } + + @Specialization + static StorageType type(NativeIntSequenceStorage s) { + return Int; + } + + @Specialization + static StorageType type(LongSequenceStorage s) { + return Long; + } + + @Specialization + static StorageType type(DoubleSequenceStorage s) { + return Double; + } + + @Fallback + static StorageType type(SequenceStorage s) { + assert s.getElementType() == StorageType.Generic : s + ": " + s.getElementType(); + return StorageType.Generic; } } @@ -3730,10 +3849,10 @@ int doDouble(DoubleSequenceStorage s, double item, int start, int end) { @Specialization static int doGeneric(VirtualFrame frame, Node inliningTarget, SequenceStorage s, Object item, int start, int end, @Cached GetItemScalarNode getItemNode, - @Cached PyObjectRichCompareBool.EqNode eqNode) { + @Cached PyObjectRichCompareBool eqNode) { for (int i = start; i < getLength(s, end); i++) { Object seqItem = getItemNode.execute(inliningTarget, s, i); - if (eqNode.compare(frame, inliningTarget, seqItem, item)) { + if (eqNode.execute(frame, inliningTarget, seqItem, item, RichCmpOp.Py_EQ)) { return i; } } @@ -3961,12 +4080,44 @@ static SequenceStorage doNativeInt(Node inliningTarget, NativeIntSequenceStorage } @Specialization - protected static SequenceStorage doNativeStorage(Node inliningTarget, NativeSequenceStorage storage, int index, Object value, + protected static SequenceStorage doNativeObjectStorage(Node inliningTarget, NativeObjectSequenceStorage storage, int index, Object value, @Exclusive @Cached EnsureCapacityNode ensureCapacityNode, - @Cached(inline = false) GetItemScalarNode getItem, - @Cached SetItemScalarNode setItem) { + @Cached(inline = false) CStructAccess.ReadPointerNode readPointerNode, + @Cached(inline = false) CStructAccess.WritePointerNode writePointerNode, + @Cached PythonToNativeNewRefNode toNative) { int newLength = storage.length() + 1; ensureCapacityNode.execute(inliningTarget, storage, newLength); + for (int i = storage.length(); i > index; i--) { + writePointerNode.writeArrayElement(storage.getPtr(), i, readPointerNode.readArrayElement(storage.getPtr(), i - 1)); + } + writePointerNode.writeArrayElement(storage.getPtr(), index, toNative.execute(value)); + storage.setNewLength(newLength); + return storage; + } + + @Specialization + protected static SequenceStorage doNativeByteStorage(Node inliningTarget, NativeByteSequenceStorage storage, int index, Object value, + @Exclusive @Cached EnsureCapacityNode ensureCapacityNode, + @Cached(inline = false) CStructAccess.ReadByteNode readByteNode, + @Cached(inline = false) CStructAccess.WriteByteNode writeByteNode, + @Cached CastToByteNode castToByteNode) { + int newLength = storage.length() + 1; + ensureCapacityNode.execute(inliningTarget, storage, newLength); + for (int i = storage.length(); i > index; i--) { + writeByteNode.writeArrayElement(storage.getPtr(), i, readByteNode.readArrayElement(storage.getPtr(), i - 1)); + } + writeByteNode.writeArrayElement(storage.getPtr(), index, castToByteNode.execute(null, value)); + storage.setNewLength(newLength); + return storage; + } + + @Specialization + protected static SequenceStorage doForeign(Node inliningTarget, ForeignSequenceStorage storage, int index, Object value, + @Cached ForeignSequenceStorage.ReadNode getItem, + @Cached ForeignSequenceStorage.WriteNode setItem) { + int newLength = storage.length() + 1; + // NOTE: important to try to append first so in case that fails the foreign array is + // unmodified for (int i = storage.length(); i > index; i--) { setItem.execute(inliningTarget, storage, i, getItem.execute(inliningTarget, storage, i - 1)); } @@ -3985,11 +4136,11 @@ public final SequenceStorage execute(VirtualFrame frame, Object iterator) { private static final int START_SIZE = 4; - protected SequenceStorage createStorage(VirtualFrame frame, Object iterator, int len, StorageType type, GetNextNode nextNode, IsBuiltinObjectProfile errorProfile, + protected SequenceStorage createStorage(VirtualFrame frame, Object iterator, int len, StorageType type, PyIterNextNode nextNode, Node inliningTarget, InlinedCountingConditionProfile growArrayProfile) { final int size = len > 0 ? len : START_SIZE; if (type == Uninitialized || type == Empty) { - return createStorageUninitialized(frame, inliningTarget, iterator, nextNode, errorProfile, size); + return createStorageUninitialized(frame, inliningTarget, iterator, nextNode, size); } else { int i = 0; Object array = null; @@ -3998,107 +4149,118 @@ protected SequenceStorage createStorage(VirtualFrame frame, Object iterator, int case Boolean: { boolean[] elements = new boolean[size]; array = elements; - try { - while (true) { - boolean value = nextNode.executeBoolean(frame, iterator); - if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { - array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); - } - elements[i++] = value; + while (true) { + Object next; + try { + next = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { + LoopNode.reportLoopCount(this, i); + break; + } + boolean value = PGuards.expectBoolean(next); + if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { + array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); } - } catch (PException e) { - LoopNode.reportLoopCount(this, i); - e.expectStopIteration(inliningTarget, errorProfile); + elements[i++] = value; } return new BoolSequenceStorage(elements, i); } case Byte: { byte[] elements = new byte[size]; array = elements; - try { - while (true) { - int value = nextNode.executeInt(frame, iterator); - byte bvalue; - try { - bvalue = PInt.byteValueExact(value); - if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { - array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); - } - elements[i++] = bvalue; - } catch (OverflowException e) { - throw new UnexpectedResultException(value); + while (true) { + Object next; + try { + next = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { + LoopNode.reportLoopCount(this, i); + break; + } + int value = PGuards.expectInteger(next); + byte bvalue; + try { + bvalue = PInt.byteValueExact(value); + if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { + array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); } + elements[i++] = bvalue; + } catch (OverflowException e) { + throw new UnexpectedResultException(value); } - } catch (PException e) { - LoopNode.reportLoopCount(this, i); - e.expectStopIteration(inliningTarget, errorProfile); } return new ByteSequenceStorage(elements, i); } case Int: { int[] elements = new int[size]; array = elements; - try { - while (true) { - int value = nextNode.executeInt(frame, iterator); - if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { - array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); - } - elements[i++] = value; + while (true) { + Object next; + try { + next = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { + LoopNode.reportLoopCount(this, i); + break; + } + int value = PGuards.expectInteger(next); + if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { + array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); } - } catch (PException e) { - LoopNode.reportLoopCount(this, i); - e.expectStopIteration(inliningTarget, errorProfile); + elements[i++] = value; } return new IntSequenceStorage(elements, i); } case Long: { long[] elements = new long[size]; array = elements; - try { - while (true) { - long value = nextNode.executeLong(frame, iterator); - if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { - array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); - } - elements[i++] = value; + while (true) { + Object next; + try { + next = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { + LoopNode.reportLoopCount(this, i); + break; + } + long value = PGuards.expectLong(next); + if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { + array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); } - } catch (PException e) { - LoopNode.reportLoopCount(this, i); - e.expectStopIteration(inliningTarget, errorProfile); + elements[i++] = value; } return new LongSequenceStorage(elements, i); } case Double: { double[] elements = new double[size]; array = elements; - try { - while (true) { - double value = nextNode.executeDouble(frame, iterator); - if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { - array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); - } - elements[i++] = value; + while (true) { + Object next; + try { + next = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { + LoopNode.reportLoopCount(this, i); + break; + } + double value = PGuards.expectDouble(next); + if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { + array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); } - } catch (PException e) { - LoopNode.reportLoopCount(this, i); - e.expectStopIteration(inliningTarget, errorProfile); + elements[i++] = value; } return new DoubleSequenceStorage(elements, i); } case Generic: { Object[] elements = new Object[size]; - try { - while (true) { - Object value = nextNode.execute(frame, iterator); - if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { - elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); - } - elements[i++] = value; + while (true) { + Object value; + try { + value = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { + LoopNode.reportLoopCount(this, i); + break; } - } catch (PException e) { - LoopNode.reportLoopCount(this, i); - e.expectStopIteration(inliningTarget, errorProfile); + if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { + elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); + } + elements[i++] = value; } return new ObjectSequenceStorage(elements, i); } @@ -4107,33 +4269,32 @@ protected SequenceStorage createStorage(VirtualFrame frame, Object iterator, int throw new RuntimeException("unexpected state"); } } catch (UnexpectedResultException e) { - return genericFallback(frame, iterator, array, i, e.getResult(), nextNode, errorProfile, inliningTarget, growArrayProfile); + return genericFallback(frame, iterator, array, i, e.getResult(), nextNode, inliningTarget, growArrayProfile); } } } - private SequenceStorage createStorageUninitialized(VirtualFrame frame, Node inliningTarget, Object iterator, GetNextNode nextNode, IsBuiltinObjectProfile errorProfile, int size) { + private SequenceStorage createStorageUninitialized(VirtualFrame frame, Node inliningTarget, Object iterator, PyIterNextNode nextNode, int size) { Object[] elements = new Object[size]; int i = 0; while (true) { + Object value; try { - Object value = nextNode.execute(frame, iterator); - if (i >= elements.length) { - // Intentionally not profiled, because "size" can be reprofiled after this - // first initialization run - elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); - } - elements[i++] = value; - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); + value = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { LoopNode.reportLoopCount(this, i); - break; + return SequenceStorageFactory.createStorage(PythonUtils.arrayCopyOf(elements, i)); + } + if (i >= elements.length) { + // Intentionally not profiled, because "size" can be reprofiled after this + // first initialization run + elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); } + elements[i++] = value; } - return SequenceStorageFactory.createStorage(PythonUtils.arrayCopyOf(elements, i)); } - private SequenceStorage genericFallback(VirtualFrame frame, Object iterator, Object array, int count, Object result, GetNextNode nextNode, IsBuiltinObjectProfile errorProfile, + private SequenceStorage genericFallback(VirtualFrame frame, Object iterator, Object array, int count, Object result, PyIterNextNode nextNode, Node inliningTarget, InlinedCountingConditionProfile growArrayProfile) { Object[] elements = new Object[Array.getLength(array) * 2]; int i = 0; @@ -4142,142 +4303,167 @@ private SequenceStorage genericFallback(VirtualFrame frame, Object iterator, Obj } elements[i++] = result; while (true) { + Object value; try { - Object value = nextNode.execute(frame, iterator); - if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { - elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); - } - elements[i++] = value; - } catch (PException e) { + value = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { LoopNode.reportLoopCount(this, i); - e.expectStopIteration(inliningTarget, errorProfile); - break; + return new ObjectSequenceStorage(elements, i); + } + if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { + elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); } + elements[i++] = value; } - return new ObjectSequenceStorage(elements, i); } /** * This version is specific to builtin iterators and looks for STOP_MARKER instead of * StopIteration. */ - protected static SequenceStorage createStorageFromBuiltin(VirtualFrame frame, PBuiltinIterator iterator, int len, SequenceStorage.StorageType type, NextHelperNode nextNode, + protected static SequenceStorage createStorageFromBuiltin(VirtualFrame frame, PBuiltinIterator iterator, int len, StorageType type, NextHelperNode nextNode, IsBuiltinObjectProfile errorProfile, Node inliningTarget, InlinedCountingConditionProfile growArrayProfile, InlinedLoopConditionProfile loopProfile) { final int size = len > 0 ? len : START_SIZE; + int i = 0; + boolean exhausted = false; if (type == Uninitialized || type == Empty) { Object[] elements = new Object[size]; - int i = 0; - try { - Object value; - for (; loopProfile.profile(inliningTarget, (value = nextNode.execute(frame, inliningTarget, iterator, false)) != STOP_MARKER); i++) { + while (loopProfile.profile(inliningTarget, !exhausted)) { + try { + Object value = nextNode.execute(frame, inliningTarget, iterator); if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); } - elements[i] = value; + elements[i++] = value; + } catch (IteratorExhausted e) { + exhausted = true; + } catch (PException e) { + e.expectStopIteration(inliningTarget, errorProfile); + exhausted = true; } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); } return SequenceStorageFactory.createStorage(PythonUtils.arrayCopyOf(elements, i)); } else { - int i = 0; Object array = null; try { - Object value; switch (type) { case Boolean: { boolean[] elements = new boolean[size]; array = elements; - try { - for (; loopProfile.profile(inliningTarget, (value = nextNode.execute(frame, inliningTarget, iterator, false)) != STOP_MARKER); i++) { + while (loopProfile.profile(inliningTarget, !exhausted)) { + try { + Object value = nextNode.execute(frame, inliningTarget, iterator); if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); array = elements; } elements[i] = PGuards.expectBoolean(value); + } catch (IteratorExhausted e) { + exhausted = true; + } catch (PException e) { + e.expectStopIteration(inliningTarget, errorProfile); + exhausted = true; } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); } return new BoolSequenceStorage(elements, i); } case Byte: { byte[] elements = new byte[size]; array = elements; - try { - for (; loopProfile.profile(inliningTarget, (value = nextNode.execute(frame, inliningTarget, iterator, false)) != STOP_MARKER); i++) { + while (loopProfile.profile(inliningTarget, !exhausted)) { + try { + Object value = nextNode.execute(frame, inliningTarget, iterator); byte bvalue; try { bvalue = PInt.byteValueExact(PGuards.expectInteger(value)); - if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { - array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); - } - elements[i] = bvalue; } catch (OverflowException e) { throw new UnexpectedResultException(value); } + if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { + array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); + } + elements[i++] = bvalue; + } catch (IteratorExhausted e) { + exhausted = true; + } catch (PException e) { + e.expectStopIteration(inliningTarget, errorProfile); + exhausted = true; } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); } return new ByteSequenceStorage(elements, i); } case Int: { int[] elements = new int[size]; array = elements; - try { - for (; loopProfile.profile(inliningTarget, (value = nextNode.execute(frame, inliningTarget, iterator, false)) != STOP_MARKER); i++) { + while (loopProfile.profile(inliningTarget, !exhausted)) { + try { + Object value = nextNode.execute(frame, inliningTarget, iterator); if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); } - elements[i] = PGuards.expectInteger(value); + elements[i++] = PGuards.expectInteger(value); + } catch (IteratorExhausted e) { + exhausted = true; + } catch (PException e) { + e.expectStopIteration(inliningTarget, errorProfile); + exhausted = true; } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); } return new IntSequenceStorage(elements, i); } case Long: { long[] elements = new long[size]; array = elements; - try { - for (; loopProfile.profile(inliningTarget, (value = nextNode.execute(frame, inliningTarget, iterator, false)) != STOP_MARKER); i++) { + while (loopProfile.profile(inliningTarget, !exhausted)) { + try { + Object value = nextNode.execute(frame, inliningTarget, iterator); if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); } - elements[i] = PGuards.expectLong(value); + elements[i++] = PGuards.expectLong(value); + } catch (IteratorExhausted e) { + exhausted = true; + } catch (PException e) { + e.expectStopIteration(inliningTarget, errorProfile); + exhausted = true; } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); } return new LongSequenceStorage(elements, i); } case Double: { double[] elements = new double[size]; array = elements; - try { - for (; loopProfile.profile(inliningTarget, (value = nextNode.execute(frame, inliningTarget, iterator, false)) != STOP_MARKER); i++) { + while (loopProfile.profile(inliningTarget, !exhausted)) { + try { + Object value = nextNode.execute(frame, inliningTarget, iterator); if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { array = elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); } - elements[i] = PGuards.expectDouble(value); + elements[i++] = PGuards.expectDouble(value); + } catch (IteratorExhausted e) { + exhausted = true; + } catch (PException e) { + e.expectStopIteration(inliningTarget, errorProfile); + exhausted = true; } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); } return new DoubleSequenceStorage(elements, i); } case Generic: { Object[] elements = new Object[size]; - try { - for (; loopProfile.profile(inliningTarget, (value = nextNode.execute(frame, inliningTarget, iterator, false)) != STOP_MARKER); i++) { + while (loopProfile.profile(inliningTarget, !exhausted)) { + try { + Object value = nextNode.execute(frame, inliningTarget, iterator); if (growArrayProfile.profile(inliningTarget, i >= elements.length)) { elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); } - elements[i] = value; + elements[i++] = value; + } catch (IteratorExhausted e) { + exhausted = true; + } catch (PException e) { + e.expectStopIteration(inliningTarget, errorProfile); + exhausted = true; } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); } return new ObjectSequenceStorage(elements, i); } @@ -4286,7 +4472,7 @@ protected static SequenceStorage createStorageFromBuiltin(VirtualFrame frame, PB throw new RuntimeException("unexpected state"); } } catch (UnexpectedResultException e) { - return genericFallback(frame, iterator, array, i, e.getResult(), nextNode, inliningTarget, errorProfile); + return genericFallback(frame, iterator, array, i - 1, e.getResult(), nextNode, inliningTarget, errorProfile); } } } @@ -4299,16 +4485,18 @@ private static SequenceStorage genericFallback(VirtualFrame frame, PBuiltinItera elements[i] = Array.get(array, i); } elements[i++] = result; - Object value; - try { - while ((value = nextNode.execute(frame, inliningTarget, iterator, false)) != STOP_MARKER) { + while (true) { + try { + Object value = nextNode.execute(frame, inliningTarget, iterator); if (i >= elements.length) { elements = PythonUtils.arrayCopyOf(elements, elements.length * 2); } elements[i++] = value; + } catch (IteratorExhausted e) { + break; + } catch (PException e) { + e.expectStopIteration(inliningTarget, errorProfile); } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); } return new ObjectSequenceStorage(elements, i); } @@ -4316,13 +4504,13 @@ private static SequenceStorage genericFallback(VirtualFrame frame, PBuiltinItera @SuppressWarnings("truffle-static-method") public abstract static class CreateStorageFromIteratorNodeCached extends CreateStorageFromIteratorNode { - @CompilationFinal private SequenceStorage.StorageType expectedElementType = Uninitialized; + @CompilationFinal private StorageType expectedElementType = Uninitialized; private static final int MAX_PREALLOCATE_SIZE = 32; @CompilationFinal int startSizeProfiled = START_SIZE; public boolean isBuiltinIterator(GetClassNode getClass, Node inliningTarget, Object iterator) { - return iterator instanceof PBuiltinIterator && getClass.execute(inliningTarget, (PBuiltinIterator) iterator) == PythonBuiltinClassType.PIterator; + return iterator instanceof PBuiltinIterator && getClass.execute(inliningTarget, iterator) == PythonBuiltinClassType.PIterator; } public static SequenceStorage getSequenceStorage(Node inliningTarget, GetInternalIteratorSequenceStorage node, PBuiltinIterator iterator) { @@ -4375,11 +4563,10 @@ public SequenceStorage createBuiltinKnownLen(VirtualFrame frame, PBuiltinIterato public SequenceStorage createGenericUnknownLen(VirtualFrame frame, Object iterator, @SuppressWarnings("unused") int len, @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, - @Shared("errProfile") @Cached IsBuiltinObjectProfile errorProfile, @Shared("arrayGrowProfile") @Cached InlinedCountingConditionProfile arrayGrowProfile, @Shared @Cached GetElementType getElementType, - @Shared @Cached GetNextNode getNextNode) { - SequenceStorage s = createStorage(frame, iterator, startSizeProfiled, expectedElementType, getNextNode, errorProfile, inliningTarget, arrayGrowProfile); + @Shared @Cached PyIterNextNode nextNode) { + SequenceStorage s = createStorage(frame, iterator, startSizeProfiled, expectedElementType, nextNode, inliningTarget, arrayGrowProfile); return profileResult(getElementType, inliningTarget, s, true); } @@ -4387,11 +4574,10 @@ public SequenceStorage createGenericUnknownLen(VirtualFrame frame, Object iterat public SequenceStorage createGenericKnownLen(VirtualFrame frame, Object iterator, int len, @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached GetClassNode getClassNode, - @Shared("errProfile") @Cached IsBuiltinObjectProfile errorProfile, @Shared("arrayGrowProfile") @Cached InlinedCountingConditionProfile arrayGrowProfile, @Shared @Cached GetElementType getElementType, - @Shared @Cached GetNextNode getNextNode) { - SequenceStorage s = createStorage(frame, iterator, len, expectedElementType, getNextNode, errorProfile, inliningTarget, arrayGrowProfile); + @Shared @Cached PyIterNextNode nextNode) { + SequenceStorage s = createStorage(frame, iterator, len, expectedElementType, nextNode, inliningTarget, arrayGrowProfile); return profileResult(getElementType, inliningTarget, s, false); } @@ -4425,11 +4611,11 @@ private static SequenceStorage executeImpl(Object iterator, int len) { if (GetPythonObjectClassNode.executeUncached(pbi) == PythonBuiltinClassType.PIterator && pbi.index == 0 && !pbi.isExhausted()) { SequenceStorage s = GetInternalIteratorSequenceStorage.executeUncached(pbi); if (s != null) { - return SequenceStorageNodes.CopyNode.executeUncached(s); + return CopyNode.executeUncached(s); } } } - return create().createStorageUninitialized(null, null, iterator, GetNextNode.getUncached(), IsBuiltinObjectProfile.getUncached(), len >= 0 ? len : START_SIZE); + return create().createStorageUninitialized(null, null, iterator, PyIterNextNode.getUncached(), len >= 0 ? len : START_SIZE); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SortNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SortNodes.java index 10bff230df..bd6c7bd2b2 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SortNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SortNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -50,11 +50,11 @@ import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.builtins.objects.function.Signature; import com.oracle.graal.python.builtins.objects.str.StringUtils; -import com.oracle.graal.python.lib.PyObjectIsTrueNode; +import com.oracle.graal.python.lib.RichCmpOp; +import com.oracle.graal.python.lib.PyObjectRichCompareBool.CachedPyObjectRichCompareBool; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRootNode; import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.expression.BinaryComparisonNode; import com.oracle.graal.python.runtime.ExecutionContext; import com.oracle.graal.python.runtime.ExecutionContext.CallContext; import com.oracle.graal.python.runtime.ExecutionContext.IndirectCalleeContext; @@ -100,12 +100,11 @@ public SortingPair(Object key, Object value) { } private static class ObjectComparatorRootNode extends PRootNode { - private static final Signature SIGNATURE = new Signature(-1, false, -1, false, tsArray("a", "b"), PythonUtils.EMPTY_TRUFFLESTRING_ARRAY); + private static final Signature SIGNATURE = new Signature(-1, false, -1, tsArray("a", "b"), PythonUtils.EMPTY_TRUFFLESTRING_ARRAY); @Child private ExecutionContext.CalleeContext calleeContext = ExecutionContext.CalleeContext.create(); - @Child private PyObjectIsTrueNode isTrueNode = PyObjectIsTrueNode.create(); - @Child private BinaryComparisonNode.LtNode ltNodeA = BinaryComparisonNode.LtNode.create(); - @Child private BinaryComparisonNode.LtNode ltNodeB = BinaryComparisonNode.LtNode.create(); + @Child private CachedPyObjectRichCompareBool ltNodeA = CachedPyObjectRichCompareBool.create(); + @Child private CachedPyObjectRichCompareBool ltNodeB = CachedPyObjectRichCompareBool.create(); enum Result { LT(-1), @@ -131,9 +130,9 @@ public Object execute(VirtualFrame frame) { Object[] arguments = frame.getArguments(); Object a = arguments[PArguments.USER_ARGUMENTS_OFFSET]; Object b = arguments[PArguments.USER_ARGUMENTS_OFFSET + 1]; - if (isTrueNode.executeCached(frame, ltNodeA.executeObject(frame, a, b))) { + if (ltNodeA.execute(frame, a, b, RichCmpOp.Py_LT)) { return Result.LT; - } else if (isTrueNode.executeCached(frame, ltNodeB.executeObject(frame, b, a))) { + } else if (ltNodeB.execute(frame, b, a, RichCmpOp.Py_LT)) { return Result.GT; } else { return Result.EQ; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/complex/ComplexBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/complex/ComplexBuiltins.java index a541d93bb6..e985ae9016 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/complex/ComplexBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/complex/ComplexBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,54 +42,54 @@ import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyComplexObject__cval__imag; import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyComplexObject__cval__real; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ABS__; +import static com.oracle.graal.python.nodes.BuiltinNames.J_COMPLEX; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___COMPLEX__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FORMAT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GETNEWARGS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEG__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___POS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___POW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RPOW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RSUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RTRUEDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___TRUEDIV__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___COMPLEX__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.OverflowError; +import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ZeroDivisionError; import static com.oracle.graal.python.runtime.formatting.FormattingUtils.validateForFloat; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.modules.SysModuleBuiltins; +import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.PNotImplemented; import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; +import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes; +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes; +import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; import com.oracle.graal.python.builtins.objects.common.FormatNodeBase; import com.oracle.graal.python.builtins.objects.complex.ComplexBuiltinsClinicProviders.FormatNodeClinicProviderGen; import com.oracle.graal.python.builtins.objects.floats.FloatBuiltins; +import com.oracle.graal.python.builtins.objects.floats.FloatUtils; +import com.oracle.graal.python.builtins.objects.floats.PFloat; import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.builtins.objects.str.PString; import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.HashBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.NbBoolBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare; +import com.oracle.graal.python.lib.CanBeDoubleNode; import com.oracle.graal.python.lib.PyComplexCheckExactNode; import com.oracle.graal.python.lib.PyComplexCheckNode; import com.oracle.graal.python.lib.PyFloatAsDoubleNode; @@ -97,27 +97,34 @@ import com.oracle.graal.python.lib.PyLongAsDoubleNode; import com.oracle.graal.python.lib.PyLongCheckNode; import com.oracle.graal.python.lib.PyObjectHashNode; +import com.oracle.graal.python.lib.PyObjectReprAsObjectNode; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; +import com.oracle.graal.python.nodes.object.BuiltinClassProfiles; +import com.oracle.graal.python.nodes.truffle.PythonIntegerAndFloatTypes; +import com.oracle.graal.python.nodes.util.CastToJavaStringNode; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonErrorType; import com.oracle.graal.python.runtime.formatting.ComplexFormatter; import com.oracle.graal.python.runtime.formatting.InternalFormat; import com.oracle.graal.python.runtime.formatting.InternalFormat.Spec; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.CompilerDirectives.ValueType; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; @@ -215,6 +222,486 @@ static ComplexValue doOther(Node inliningTarget, Object v) { } } + // complex([real[, imag]]) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_COMPLEX, minNumOfPositionalArgs = 1, parameterNames = {"$cls", "real", "imag"}) + @GenerateNodeFactory + public abstract static class ComplexNewNode extends PythonTernaryBuiltinNode { + @Child private PyObjectReprAsObjectNode reprNode; + @Child private LookupAndCallUnaryNode callComplexNode; + @Child private WarningsModuleBuiltins.WarnNode warnNode; + + @GenerateInline + @GenerateCached(false) + @GenerateUncached + abstract static class CreateComplexNode extends Node { + public abstract Object execute(Node inliningTarget, Object cls, double real, double imaginary); + + public static Object executeUncached(Object cls, double real, double imaginary) { + return ComplexBuiltinsFactory.ComplexNewNodeFactory.CreateComplexNodeGen.getUncached().execute(null, cls, real, imaginary); + } + + @Specialization(guards = "!needsNativeAllocationNode.execute(inliningTarget, cls)", limit = "1") + static PComplex doManaged(@SuppressWarnings("unused") Node inliningTarget, Object cls, double real, double imaginary, + @SuppressWarnings("unused") @Cached TypeNodes.NeedsNativeAllocationNode needsNativeAllocationNode, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createComplex(language, cls, getInstanceShape.execute(cls), real, imaginary); + } + + @Fallback + static Object doNative(Node inliningTarget, Object cls, double real, double imaginary, + @Cached(inline = false) CExtNodes.PCallCapiFunction callCapiFunction, + @Cached(inline = false) CApiTransitions.PythonToNativeNode toNativeNode, + @Cached(inline = false) CApiTransitions.NativeToPythonTransferNode toPythonNode, + @Cached(inline = false) ExternalFunctionNodes.DefaultCheckFunctionResultNode checkFunctionResultNode) { + NativeCAPISymbol symbol = NativeCAPISymbol.FUN_COMPLEX_SUBTYPE_FROM_DOUBLES; + Object nativeResult = callCapiFunction.call(symbol, toNativeNode.execute(cls), real, imaginary); + return toPythonNode.execute(checkFunctionResultNode.execute(PythonContext.get(inliningTarget), symbol.getTsName(), nativeResult)); + } + } + + @Specialization(guards = {"isNoValue(real)", "isNoValue(imag)"}) + @SuppressWarnings("unused") + static Object complexFromNone(Object cls, PNone real, PNone imag, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode) { + return createComplexNode.execute(inliningTarget, cls, 0, 0); + } + + @Specialization + static Object complexFromIntInt(Object cls, int real, int imaginary, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode) { + return createComplexNode.execute(inliningTarget, cls, real, imaginary); + } + + @Specialization + static Object complexFromLongLong(Object cls, long real, long imaginary, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode) { + return createComplexNode.execute(inliningTarget, cls, real, imaginary); + } + + @Specialization + static Object complexFromLongLong(Object cls, PInt real, PInt imaginary, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode) { + return createComplexNode.execute(inliningTarget, cls, real.doubleValueWithOverflow(inliningTarget), + imaginary.doubleValueWithOverflow(inliningTarget)); + } + + @Specialization + static Object complexFromDoubleDouble(Object cls, double real, double imaginary, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode) { + return createComplexNode.execute(inliningTarget, cls, real, imaginary); + } + + @Specialization(guards = "isNoValue(imag)") + static Object complexFromDouble(Object cls, double real, @SuppressWarnings("unused") PNone imag, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode) { + return createComplexNode.execute(inliningTarget, cls, real, 0); + } + + @Specialization(guards = "isNoValue(imag)") + Object complexFromDouble(VirtualFrame frame, Object cls, PFloat real, @SuppressWarnings("unused") PNone imag, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode, + @Cached.Shared @Cached CanBeDoubleNode canBeDoubleNode, + @Cached.Shared("floatAsDouble") @Cached PyFloatAsDoubleNode asDoubleNode, + @Cached.Shared("isComplex") @Cached PyComplexCheckExactNode isComplexType, + @Cached.Shared("isComplexResult") @Cached PyComplexCheckExactNode isResultComplexType, + @Cached.Shared("isPrimitive") @Cached BuiltinClassProfiles.IsBuiltinClassExactProfile isPrimitiveProfile, + @Cached.Shared("isBuiltinObj") @Cached PyComplexCheckExactNode isBuiltinObjectProfile, + @Cached.Shared @Cached PRaiseNode raiseNode) { + return complexFromObject(frame, cls, real, imag, inliningTarget, createComplexNode, canBeDoubleNode, asDoubleNode, isComplexType, isResultComplexType, isPrimitiveProfile, + isBuiltinObjectProfile, + raiseNode); + } + + @Specialization(guards = "isNoValue(imag)") + static Object complexFromInt(Object cls, int real, @SuppressWarnings("unused") PNone imag, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode) { + return createComplexNode.execute(inliningTarget, cls, real, 0); + } + + @Specialization(guards = "isNoValue(imag)") + static Object complexFromLong(Object cls, long real, @SuppressWarnings("unused") PNone imag, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode) { + return createComplexNode.execute(inliningTarget, cls, real, 0); + } + + @Specialization(guards = "isNoValue(imag)") + Object complexFromLong(VirtualFrame frame, Object cls, PInt real, @SuppressWarnings("unused") PNone imag, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode, + @Cached.Shared @Cached CanBeDoubleNode canBeDoubleNode, + @Cached.Shared("floatAsDouble") @Cached PyFloatAsDoubleNode asDoubleNode, + @Cached.Shared("isComplex") @Cached PyComplexCheckExactNode isComplexType, + @Cached.Shared("isComplexResult") @Cached PyComplexCheckExactNode isResultComplexType, + @Cached.Shared("isPrimitive") @Cached BuiltinClassProfiles.IsBuiltinClassExactProfile isPrimitiveProfile, + @Cached.Shared("isBuiltinObj") @Cached PyComplexCheckExactNode complexCheck, + @Cached.Shared @Cached PRaiseNode raiseNode) { + return complexFromObject(frame, cls, real, imag, inliningTarget, createComplexNode, canBeDoubleNode, asDoubleNode, isComplexType, isResultComplexType, isPrimitiveProfile, complexCheck, + raiseNode); + } + + @Specialization(guards = {"isNoValue(imag)", "!isNoValue(number)", "!isString(number)"}) + Object complexFromObject(VirtualFrame frame, Object cls, Object number, @SuppressWarnings("unused") PNone imag, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode, + @Cached.Shared @Cached CanBeDoubleNode canBeDoubleNode, + @Cached.Shared("floatAsDouble") @Cached PyFloatAsDoubleNode asDoubleNode, + @Cached.Shared("isComplex") @Cached PyComplexCheckExactNode isComplexType, + @Cached.Shared("isComplexResult") @Cached PyComplexCheckExactNode isResultComplexType, + @Cached.Shared("isPrimitive") @Cached BuiltinClassProfiles.IsBuiltinClassExactProfile isPrimitiveProfile, + @Cached.Shared("isBuiltinObj") @Cached PyComplexCheckExactNode complexCheck, + @Cached.Shared @Cached PRaiseNode raiseNode) { + PComplex value = getComplexNumberFromObject(frame, number, inliningTarget, isComplexType, isResultComplexType, raiseNode); + if (value == null) { + if (canBeDoubleNode.execute(inliningTarget, number)) { + return createComplexNode.execute(inliningTarget, cls, asDoubleNode.execute(frame, inliningTarget, number), 0.0); + } else { + throw raiseFirstArgError(number, inliningTarget, raiseNode); + } + } + if (isPrimitiveProfile.profileClass(inliningTarget, cls, PythonBuiltinClassType.PComplex)) { + if (complexCheck.execute(inliningTarget, value)) { + return value; + } + return PFactory.createComplex(PythonLanguage.get(inliningTarget), value.getReal(), value.getImag()); + } + return createComplexNode.execute(inliningTarget, cls, value.getReal(), value.getImag()); + } + + @Specialization + static Object complexFromLongComplex(Object cls, long one, PComplex two, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode) { + return createComplexNode.execute(inliningTarget, cls, one - two.getImag(), two.getReal()); + } + + @Specialization + static Object complexFromPIntComplex(Object cls, PInt one, PComplex two, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode) { + return createComplexNode.execute(inliningTarget, cls, one.doubleValueWithOverflow(inliningTarget) - two.getImag(), two.getReal()); + } + + @Specialization + static Object complexFromDoubleComplex(Object cls, double one, PComplex two, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode) { + return createComplexNode.execute(inliningTarget, cls, one - two.getImag(), two.getReal()); + } + + @Specialization(guards = "!isString(one)") + Object complexFromComplexLong(VirtualFrame frame, Object cls, Object one, long two, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode, + @Cached.Shared @Cached CanBeDoubleNode canBeDoubleNode, + @Cached.Shared("floatAsDouble") @Cached PyFloatAsDoubleNode asDoubleNode, + @Cached.Shared("isComplex") @Cached PyComplexCheckExactNode isComplexType, + @Cached.Shared("isComplexResult") @Cached PyComplexCheckExactNode isResultComplexType, + @Cached.Shared @Cached PRaiseNode raiseNode) { + PComplex value = getComplexNumberFromObject(frame, one, inliningTarget, isComplexType, isResultComplexType, raiseNode); + if (value == null) { + if (canBeDoubleNode.execute(inliningTarget, one)) { + return createComplexNode.execute(inliningTarget, cls, asDoubleNode.execute(frame, inliningTarget, one), two); + } else { + throw raiseFirstArgError(one, inliningTarget, raiseNode); + } + } + return createComplexNode.execute(inliningTarget, cls, value.getReal(), value.getImag() + two); + } + + @Specialization(guards = "!isString(one)") + Object complexFromComplexDouble(VirtualFrame frame, Object cls, Object one, double two, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode, + @Cached.Shared @Cached CanBeDoubleNode canBeDoubleNode, + @Cached.Shared("floatAsDouble") @Cached PyFloatAsDoubleNode asDoubleNode, + @Cached.Shared("isComplex") @Cached PyComplexCheckExactNode isComplexType, + @Cached.Shared("isComplexResult") @Cached PyComplexCheckExactNode isResultComplexType, + @Cached.Shared @Cached PRaiseNode raiseNode) { + PComplex value = getComplexNumberFromObject(frame, one, inliningTarget, isComplexType, isResultComplexType, raiseNode); + if (value == null) { + if (canBeDoubleNode.execute(inliningTarget, one)) { + return createComplexNode.execute(inliningTarget, cls, asDoubleNode.execute(frame, inliningTarget, one), two); + } else { + throw raiseFirstArgError(one, inliningTarget, raiseNode); + } + } + return createComplexNode.execute(inliningTarget, cls, value.getReal(), value.getImag() + two); + } + + @Specialization(guards = "!isString(one)") + Object complexFromComplexPInt(VirtualFrame frame, Object cls, Object one, PInt two, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode, + @Cached.Shared @Cached CanBeDoubleNode canBeDoubleNode, + @Cached.Shared("floatAsDouble") @Cached PyFloatAsDoubleNode asDoubleNode, + @Cached.Shared("isComplex") @Cached PyComplexCheckExactNode isComplexType, + @Cached.Shared("isComplexResult") @Cached PyComplexCheckExactNode isResultComplexType, + @Cached.Shared @Cached PRaiseNode raiseNode) { + PComplex value = getComplexNumberFromObject(frame, one, inliningTarget, isComplexType, isResultComplexType, raiseNode); + if (value == null) { + if (canBeDoubleNode.execute(inliningTarget, one)) { + return createComplexNode.execute(inliningTarget, cls, asDoubleNode.execute(frame, inliningTarget, one), two.doubleValueWithOverflow(this)); + } else { + throw raiseFirstArgError(one, inliningTarget, raiseNode); + } + } + return createComplexNode.execute(inliningTarget, cls, value.getReal(), value.getImag() + two.doubleValueWithOverflow(this)); + } + + @Specialization(guards = "!isString(one)") + Object complexFromComplexComplex(VirtualFrame frame, Object cls, Object one, PComplex two, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode, + @Cached.Shared @Cached CanBeDoubleNode canBeDoubleNode, + @Cached.Shared("floatAsDouble") @Cached PyFloatAsDoubleNode asDoubleNode, + @Cached.Shared("isComplex") @Cached PyComplexCheckExactNode isComplexType, + @Cached.Shared("isComplexResult") @Cached PyComplexCheckExactNode isResultComplexType, + @Cached.Shared @Cached PRaiseNode raiseNode) { + PComplex value = getComplexNumberFromObject(frame, one, inliningTarget, isComplexType, isResultComplexType, raiseNode); + if (value == null) { + if (canBeDoubleNode.execute(inliningTarget, one)) { + return createComplexNode.execute(inliningTarget, cls, asDoubleNode.execute(frame, inliningTarget, one) - two.getImag(), two.getReal()); + } else { + throw raiseFirstArgError(one, inliningTarget, raiseNode); + } + } + return createComplexNode.execute(inliningTarget, cls, value.getReal() - two.getImag(), value.getImag() + two.getReal()); + } + + @Specialization(guards = {"!isString(one)", "!isNoValue(two)", "!isPComplex(two)"}) + @SuppressWarnings("truffle-static-method") + Object complexFromComplexObject(VirtualFrame frame, Object cls, Object one, Object two, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached CreateComplexNode createComplexNode, + @Cached.Shared @Cached CanBeDoubleNode canBeDoubleNode, + @Cached.Shared("floatAsDouble") @Cached PyFloatAsDoubleNode asDoubleNode, + @Cached.Shared("isComplex") @Cached PyComplexCheckExactNode isComplexType, + @Cached.Shared("isComplexResult") @Cached PyComplexCheckExactNode isResultComplexType, + @Cached.Shared @Cached PRaiseNode raiseNode) { + PComplex oneValue = getComplexNumberFromObject(frame, one, inliningTarget, isComplexType, isResultComplexType, raiseNode); + if (canBeDoubleNode.execute(inliningTarget, two)) { + double twoValue = asDoubleNode.execute(frame, inliningTarget, two); + if (oneValue == null) { + if (canBeDoubleNode.execute(inliningTarget, one)) { + return createComplexNode.execute(inliningTarget, cls, asDoubleNode.execute(frame, inliningTarget, one), twoValue); + } else { + throw raiseFirstArgError(one, inliningTarget, raiseNode); + } + } + return createComplexNode.execute(inliningTarget, cls, oneValue.getReal(), oneValue.getImag() + twoValue); + } else { + throw raiseSecondArgError(two, inliningTarget, raiseNode); + } + } + + @Specialization + Object complexFromString(VirtualFrame frame, Object cls, TruffleString real, Object imaginary, + @Bind("this") Node inliningTarget, + @Cached TruffleString.ToJavaStringNode toJavaStringNode, + @Cached.Shared @Cached PRaiseNode raiseNode) { + if (imaginary != PNone.NO_VALUE) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.COMPLEX_CANT_TAKE_ARG); + } + return convertStringToComplex(frame, inliningTarget, toJavaStringNode.execute(real), cls, real, raiseNode); + } + + @Specialization + Object complexFromString(VirtualFrame frame, Object cls, PString real, Object imaginary, + @Bind("this") Node inliningTarget, + @Cached CastToJavaStringNode castToStringNode, + @Cached.Shared @Cached PRaiseNode raiseNode) { + if (imaginary != PNone.NO_VALUE) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.COMPLEX_CANT_TAKE_ARG); + } + return convertStringToComplex(frame, inliningTarget, castToStringNode.execute(real), cls, real, raiseNode); + } + + private Object callComplex(VirtualFrame frame, Object object) { + if (callComplexNode == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + callComplexNode = insert(LookupAndCallUnaryNode.create(T___COMPLEX__)); + } + return callComplexNode.executeObject(frame, object); + } + + private WarningsModuleBuiltins.WarnNode getWarnNode() { + if (warnNode == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + warnNode = insert(WarningsModuleBuiltins.WarnNode.create()); + } + return warnNode; + } + + private static PException raiseFirstArgError(Object x, Node inliningTarget, PRaiseNode raiseNode) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ARG_MUST_BE_STRING_OR_NUMBER, "complex() first", x); + } + + private static PException raiseSecondArgError(Object x, Node inliningTarget, PRaiseNode raiseNode) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ARG_MUST_BE_NUMBER, "complex() second", x); + } + + private PComplex getComplexNumberFromObject(VirtualFrame frame, Object object, Node inliningTarget, + PyComplexCheckExactNode isComplexType, PyComplexCheckExactNode isResultComplexType, PRaiseNode raiseNode) { + if (isComplexType.execute(inliningTarget, object)) { + return (PComplex) object; + } else { + Object result = callComplex(frame, object); + if (result instanceof PComplex) { + if (!isResultComplexType.execute(inliningTarget, result)) { + getWarnNode().warnFormat(frame, null, PythonBuiltinClassType.DeprecationWarning, 1, + ErrorMessages.WARN_P_RETURNED_NON_P, + object, "__complex__", "complex", result, "complex"); + } + return (PComplex) result; + } else if (result != PNone.NO_VALUE) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.COMPLEX_RETURNED_NON_COMPLEX, result); + } + if (object instanceof PComplex) { + // the class extending PComplex but doesn't have __complex__ method + return (PComplex) object; + } + return null; + } + } + + @Fallback + @SuppressWarnings("unused") + static Object complexGeneric(Object cls, Object realObj, Object imaginaryObj, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "complex.__new__(X): X", cls); + } + + // Adapted from CPython's complex_subtype_from_string + private Object convertStringToComplex(VirtualFrame frame, Node inliningTarget, String src, Object cls, Object origObj, PRaiseNode raiseNode) { + String str = FloatUtils.removeUnicodeAndUnderscores(src); + if (str == null) { + if (reprNode == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + reprNode = insert(PyObjectReprAsObjectNode.create()); + } + Object strStr = reprNode.executeCached(frame, origObj); + if (PGuards.isString(strStr)) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.COULD_NOT_CONVERT_STRING_TO_COMPLEX, strStr); + } else { + // During the formatting of "ValueError: invalid literal ..." exception, + // CPython attempts to raise "TypeError: __repr__ returned non-string", + // which gets later overwitten with the original "ValueError", + // but without any message (since the message formatting failed) + throw raiseNode.raise(inliningTarget, ValueError); + } + } + Object c = convertStringToComplexOrNull(str, cls); + if (c == null) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.COMPLEX_ARG_IS_MALFORMED_STR); + } + return c; + } + + // Adapted from CPython's complex_from_string_inner + @TruffleBoundary + private Object convertStringToComplexOrNull(String str, Object cls) { + int len = str.length(); + + // position on first nonblank + int i = FloatUtils.skipAsciiWhitespace(str, 0, len); + + boolean gotBracket; + if (i < len && str.charAt(i) == '(') { + // Skip over possible bracket from repr(). + gotBracket = true; + i = FloatUtils.skipAsciiWhitespace(str, i + 1, len); + } else { + gotBracket = false; + } + + double x, y; + boolean expectJ; + + // first look for forms starting with + FloatUtils.StringToDoubleResult res1 = FloatUtils.stringToDouble(str, i, len); + if (res1 != null) { + // all 4 forms starting with land here + i = res1.position; + char ch = i < len ? str.charAt(i) : '\0'; + if (ch == '+' || ch == '-') { + // j | j + x = res1.value; + FloatUtils.StringToDoubleResult res2 = FloatUtils.stringToDouble(str, i, len); + if (res2 != null) { + // j + y = res2.value; + i = res2.position; + } else { + // j + y = ch == '+' ? 1.0 : -1.0; + i++; + } + expectJ = true; + } else if (ch == 'j' || ch == 'J') { + // j + i++; + y = res1.value; + x = 0; + expectJ = false; + } else { + // + x = res1.value; + y = 0; + expectJ = false; + } + } else { + // not starting with ; must be j or j + char ch = i < len ? str.charAt(i) : '\0'; + if (ch == '+' || ch == '-') { + // j + y = ch == '+' ? 1.0 : -1.0; + i++; + } else { + // j + y = 1.0; + } + x = 0; + expectJ = true; + } + + if (expectJ) { + char ch = i < len ? str.charAt(i) : '\0'; + if (!(ch == 'j' || ch == 'J')) { + return null; + } + i++; + } + + // trailing whitespace and closing bracket + i = FloatUtils.skipAsciiWhitespace(str, i, len); + if (gotBracket) { + // if there was an opening parenthesis, then the corresponding + // closing parenthesis should be right here + if (i >= len || str.charAt(i) != ')') { + return null; + } + i = FloatUtils.skipAsciiWhitespace(str, i + 1, len); + } + + // we should now be at the end of the string + if (i != len) { + return null; + } + return CreateComplexNode.executeUncached(cls, x, y); + } + } + @Builtin(name = J___COMPLEX__, minNumOfPositionalArgs = 1) @GenerateNodeFactory abstract static class ComplexNode extends PythonUnaryBuiltinNode { @@ -222,19 +709,18 @@ abstract static class ComplexNode extends PythonUnaryBuiltinNode { static Object complex(Object self, @Bind("this") Node inliningTarget, @Cached PyComplexCheckExactNode check, - @Cached ToComplexValueNode toComplexValueNode, - @Cached PythonObjectFactory.Lazy factory) { + @Cached ToComplexValueNode toComplexValueNode) { if (check.execute(inliningTarget, self)) { return self; } else { ComplexValue c = toComplexValueNode.execute(inliningTarget, self); - return factory.get(inliningTarget).createComplex(c.real, c.imag); + return PFactory.createComplex(PythonLanguage.get(inliningTarget), c.real, c.imag); } } } + @Slot(value = SlotKind.nb_absolute, isComplex = true) @GenerateNodeFactory - @Builtin(name = J___ABS__, minNumOfPositionalArgs = 1) public abstract static class AbsNode extends PythonUnaryBuiltinNode { public abstract double executeDouble(Object arg); @@ -244,7 +730,7 @@ public abstract static class AbsNode extends PythonUnaryBuiltinNode { static double abs(Object self, @Bind("this") Node inliningTarget, @Cached ToComplexValueNode toComplexValueNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { ComplexValue c = toComplexValueNode.execute(inliningTarget, self); double x = c.getReal(); double y = c.getImag(); @@ -278,7 +764,7 @@ static double abs(Object self, // remove scaling double r = scalb(scaledH, middleExp); if (Double.isInfinite(r)) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.OverflowError, ErrorMessages.ABSOLUTE_VALUE_TOO_LARGE); + throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError, ErrorMessages.ABSOLUTE_VALUE_TOO_LARGE); } return r; } @@ -389,14 +875,14 @@ public static AbsNode create() { abstract static class AddNode extends BinaryOpBuiltinNode { @Specialization static PComplex doInt(PComplex left, int right, - @Shared @Cached PythonObjectFactory factory) { - return factory.createComplex(left.getReal() + right, left.getImag()); + @Bind PythonLanguage language) { + return PFactory.createComplex(language, left.getReal() + right, left.getImag()); } @Specialization static PComplex doDouble(PComplex left, double right, - @Shared @Cached PythonObjectFactory factory) { - return factory.createComplex(left.getReal() + right, left.getImag()); + @Bind PythonLanguage language) { + return PFactory.createComplex(language, left.getReal() + right, left.getImag()); } @Specialization @@ -405,20 +891,19 @@ static Object doGeneric(Object leftObj, Object rightObj, @Cached ToComplexValueNode toComplexLeft, @Cached ToComplexValueNode toComplexRight, @Cached InlinedConditionProfile notImplementedProfile, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { ComplexValue left = toComplexLeft.execute(inliningTarget, leftObj); ComplexValue right = toComplexRight.execute(inliningTarget, rightObj); if (notImplementedProfile.profile(inliningTarget, left == null || right == null)) { return PNotImplemented.NOT_IMPLEMENTED; } - return factory.createComplex(left.getReal() + right.getReal(), left.getImag() + right.getImag()); + return PFactory.createComplex(language, left.getReal() + right.getReal(), left.getImag() + right.getImag()); } } - @Builtin(name = J___RTRUEDIV__, minNumOfPositionalArgs = 2, reverseOperation = true) - @Builtin(name = J___TRUEDIV__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.nb_true_divide, isComplex = true) @GenerateNodeFactory - public abstract static class DivNode extends PythonBinaryBuiltinNode { + public abstract static class DivNode extends BinaryOpBuiltinNode { public abstract PComplex executeComplex(VirtualFrame frame, Object left, Object right); @@ -435,8 +920,8 @@ static Object doComplex(Object leftObj, Object rightObj, @Cached InlinedConditionProfile notImplementedProfile, @Cached InlinedConditionProfile topConditionProfile, @Cached InlinedConditionProfile zeroDivisionProfile, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { ComplexValue left = toComplexLeft.execute(inliningTarget, leftObj); ComplexValue right = toComplexRight.execute(inliningTarget, rightObj); if (notImplementedProfile.profile(inliningTarget, left == null || right == null)) { @@ -449,7 +934,7 @@ static Object doComplex(Object leftObj, Object rightObj, if (topConditionProfile.profile(inliningTarget, absRightReal >= absRightImag)) { /* divide tops and bottom by right.real */ if (zeroDivisionProfile.profile(inliningTarget, absRightReal == 0.0)) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.ZeroDivisionError, ErrorMessages.S_DIVISION_BY_ZERO, "complex"); + throw raiseNode.raise(inliningTarget, PythonErrorType.ZeroDivisionError, ErrorMessages.S_DIVISION_BY_ZERO, "complex"); } else { double ratio = right.getImag() / right.getReal(); double denom = right.getReal() + right.getImag() * ratio; @@ -463,16 +948,16 @@ static Object doComplex(Object leftObj, Object rightObj, real = (left.getReal() * ratio + left.getImag()) / denom; imag = (left.getImag() * ratio - left.getReal()) / denom; } - return factory.createComplex(real, imag); + return PFactory.createComplex(language, real, imag); } - static PComplex doubleDivComplex(double left, PComplex right, PythonObjectFactory factory) { + static PComplex doubleDivComplex(double left, PComplex right, PythonLanguage language) { double oprealSq = right.getReal() * right.getReal(); double opimagSq = right.getImag() * right.getImag(); double realPart = right.getReal() * left; double imagPart = right.getImag() * left; double denom = oprealSq + opimagSq; - return factory.createComplex(realPart / denom, -imagPart / denom); + return PFactory.createComplex(language, realPart / denom, -imagPart / denom); } } @@ -485,14 +970,14 @@ static Object doComplex(Object leftObj, Object rightObj, @Cached ToComplexValueNode toComplexLeft, @Cached ToComplexValueNode toComplexRight, @Cached InlinedConditionProfile notImplementedProfile, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { ComplexValue left = toComplexLeft.execute(inliningTarget, leftObj); ComplexValue right = toComplexRight.execute(inliningTarget, rightObj); if (notImplementedProfile.profile(inliningTarget, left == null || right == null)) { return PNotImplemented.NOT_IMPLEMENTED; } ComplexValue res = multiply(left, right); - return factory.createComplex(res.getReal(), res.getImag()); + return PFactory.createComplex(language, res.getReal(), res.getImag()); } static ComplexValue multiply(ComplexValue left, ComplexValue right) { @@ -503,18 +988,17 @@ static ComplexValue multiply(ComplexValue left, ComplexValue right) { } @GenerateNodeFactory - @Builtin(name = J___RSUB__, minNumOfPositionalArgs = 2, reverseOperation = true) - @Builtin(name = J___SUB__, minNumOfPositionalArgs = 2) - abstract static class SubNode extends PythonBinaryBuiltinNode { + @Slot(value = SlotKind.nb_subtract, isComplex = true) + abstract static class SubNode extends BinaryOpBuiltinNode { static PComplex doComplex(PComplex left, double right, - @Shared @Cached PythonObjectFactory factory) { - return factory.createComplex(left.getReal() - right, left.getImag()); + @Bind PythonLanguage language) { + return PFactory.createComplex(language, left.getReal() - right, left.getImag()); } @Specialization static PComplex doComplex(PComplex left, int right, - @Shared @Cached PythonObjectFactory factory) { - return factory.createComplex(left.getReal() - right, left.getImag()); + @Bind PythonLanguage language) { + return PFactory.createComplex(language, left.getReal() - right, left.getImag()); } @Specialization @@ -523,24 +1007,21 @@ static Object doComplex(Object leftObj, Object rightObj, @Cached ToComplexValueNode toComplexLeft, @Cached ToComplexValueNode toComplexRight, @Cached InlinedConditionProfile notImplementedProfile, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { ComplexValue left = toComplexLeft.execute(inliningTarget, leftObj); ComplexValue right = toComplexRight.execute(inliningTarget, rightObj); if (notImplementedProfile.profile(inliningTarget, left == null || right == null)) { return PNotImplemented.NOT_IMPLEMENTED; } - return factory.createComplex(left.getReal() - right.getReal(), left.getImag() - right.getImag()); + return PFactory.createComplex(language, left.getReal() - right.getReal(), left.getImag() - right.getImag()); } } - @Builtin(name = J___RPOW__, minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 3, reverseOperation = true) - @Builtin(name = J___POW__, minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 3) - @TypeSystemReference(PythonArithmeticTypes.class) + @Slot(value = SlotKind.nb_power, isComplex = true) @GenerateNodeFactory abstract static class PowerNode extends PythonTernaryBuiltinNode { @Specialization - @InliningCutoff static Object doGeneric(Object leftObj, Object rightObj, @SuppressWarnings("unused") PNone mod, @Bind("this") Node inliningTarget, @Cached ToComplexValueNode toComplexLeft, @@ -551,8 +1032,8 @@ static Object doGeneric(Object leftObj, Object rightObj, @SuppressWarnings("unus @Cached InlinedBranchProfile smallPositiveProfile, @Cached InlinedBranchProfile smallNegativeProfile, @Cached InlinedBranchProfile complexProfile, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { ComplexValue left = toComplexLeft.execute(inliningTarget, leftObj); ComplexValue right = toComplexRight.execute(inliningTarget, rightObj); if (notImplementedProfile.profile(inliningTarget, left == null || right == null)) { @@ -561,27 +1042,27 @@ static Object doGeneric(Object leftObj, Object rightObj, @SuppressWarnings("unus PComplex result; if (right.getReal() == 0.0 && right.getImag() == 0.0) { rightZeroProfile.enter(inliningTarget); - result = factory.createComplex(1.0, 0.0); + result = PFactory.createComplex(language, 1.0, 0.0); } else if (left.getReal() == 0.0 && left.getImag() == 0.0) { leftZeroProfile.enter(inliningTarget); if (right.getImag() != 0.0 || right.getReal() < 0.0) { - throw PRaiseNode.raiseUncached(inliningTarget, ZeroDivisionError, ErrorMessages.COMPLEX_ZERO_TO_NEGATIVE_POWER); + throw PRaiseNode.raiseStatic(inliningTarget, ZeroDivisionError, ErrorMessages.COMPLEX_ZERO_TO_NEGATIVE_POWER); } - result = factory.createComplex(0.0, 0.0); + result = PFactory.createComplex(language, 0.0, 0.0); } else if (right.getImag() == 0.0 && right.getReal() == (int) right.getReal() && right.getReal() < 100 && right.getReal() > -100) { if (right.getReal() >= 0) { smallPositiveProfile.enter(inliningTarget); - result = complexToSmallPositiveIntPower(left, (int) right.getReal(), factory); + result = complexToSmallPositiveIntPower(left, (int) right.getReal(), language); } else { smallNegativeProfile.enter(inliningTarget); - result = DivNode.doubleDivComplex(1.0, complexToSmallPositiveIntPower(left, -(int) right.getReal(), factory), factory); + result = DivNode.doubleDivComplex(1.0, complexToSmallPositiveIntPower(left, -(int) right.getReal(), language), language); } } else { complexProfile.enter(inliningTarget); - result = complexToComplexBoundary(left.getReal(), left.getImag(), right.getReal(), right.getImag(), factory); + result = complexToComplexBoundary(left.getReal(), left.getImag(), right.getReal(), right.getImag(), language); } if (Double.isInfinite(result.getReal()) || Double.isInfinite(result.getImag())) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.COMPLEX_EXPONENTIATION); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.COMPLEX_EXPONENTIATION); } return result; } @@ -590,11 +1071,11 @@ static Object doGeneric(Object leftObj, Object rightObj, @SuppressWarnings("unus @InliningCutoff @SuppressWarnings("unused") static Object error(Object left, Object right, Object mod, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.COMPLEX_MODULO); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.COMPLEX_MODULO); } - private static PComplex complexToSmallPositiveIntPower(ComplexValue x, long n, PythonObjectFactory factory) { + private static PComplex complexToSmallPositiveIntPower(ComplexValue x, long n, PythonLanguage language) { long mask = 1; ComplexValue r = new ComplexValue(1.0, 0.0); ComplexValue p = x; @@ -605,11 +1086,11 @@ private static PComplex complexToSmallPositiveIntPower(ComplexValue x, long n, P mask <<= 1; p = MulNode.multiply(p, p); } - return factory.createComplex(r.getReal(), r.getImag()); + return PFactory.createComplex(language, r.getReal(), r.getImag()); } @TruffleBoundary - private static PComplex complexToComplexBoundary(double leftRead, double leftImag, double rightReal, double rightImag, PythonObjectFactory factory) { + private static PComplex complexToComplexBoundary(double leftRead, double leftImag, double rightReal, double rightImag, PythonLanguage language) { PComplex result; double vabs = Math.hypot(leftRead, leftImag); double len = Math.pow(vabs, rightReal); @@ -619,14 +1100,15 @@ private static PComplex complexToComplexBoundary(double leftRead, double leftIma len /= Math.exp(at * rightImag); phase += rightImag * Math.log(vabs); } - result = factory.createComplex(len * Math.cos(phase), len * Math.sin(phase)); + result = PFactory.createComplex(language, len * Math.cos(phase), len * Math.sin(phase)); return result; } } @GenerateInline @GenerateCached(false) - @TypeSystemReference(PythonArithmeticTypes.class) + @GenerateUncached + @TypeSystemReference(PythonIntegerAndFloatTypes.class) abstract static class ComplexEqNode extends Node { public abstract Object execute(Node inliningTarget, Object left, Object right); @@ -674,74 +1156,28 @@ static PNotImplemented doNotImplemented(Object left, Object right) { } } + @Slot(SlotKind.tp_richcompare) @GenerateNodeFactory - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) - abstract static class EqNode extends PythonBinaryBuiltinNode { - @Specialization - static Object doComplex(Object left, Object right, - @Bind("this") Node inliningTarget, - @Cached ComplexEqNode complexEqNode) { - return complexEqNode.execute(inliningTarget, left, right); - } - } - - @GenerateNodeFactory - @Builtin(name = J___NE__, minNumOfPositionalArgs = 2) - abstract static class NeNode extends PythonBinaryBuiltinNode { + @GenerateUncached + abstract static class ComplexRichCmpNode extends TpSlotRichCompare.RichCmpBuiltinNode { @Specialization - static Object doComplex(Object left, Object right, + static Object doComplex(Object left, Object right, RichCmpOp op, @Bind("this") Node inliningTarget, - @Cached ComplexEqNode complexEqNode) { - Object res = complexEqNode.execute(inliningTarget, left, right); - if (res == PNotImplemented.NOT_IMPLEMENTED) { + @Cached ComplexEqNode complexEqNode, + @Cached InlinedConditionProfile isNotImplementedProfile) { + if (!op.isEqOrNe()) { return PNotImplemented.NOT_IMPLEMENTED; } - return !(boolean) res; - } - } - - @GenerateNodeFactory - @Builtin(name = J___GE__, minNumOfPositionalArgs = 2) - abstract static class GeNode extends PythonBinaryBuiltinNode { - @SuppressWarnings("unused") - @Specialization - static PNotImplemented doGeneric(Object left, Object right) { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - - @GenerateNodeFactory - @Builtin(name = J___GT__, minNumOfPositionalArgs = 2) - abstract static class GtNode extends PythonBinaryBuiltinNode { - @SuppressWarnings("unused") - @Specialization - static PNotImplemented doGeneric(Object left, Object right) { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - - @GenerateNodeFactory - @Builtin(name = J___LT__, minNumOfPositionalArgs = 2) - abstract static class LtNode extends PythonBinaryBuiltinNode { - @SuppressWarnings("unused") - @Specialization - static PNotImplemented doGeneric(Object left, Object right) { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - - @GenerateNodeFactory - @Builtin(name = J___LE__, minNumOfPositionalArgs = 2) - abstract static class LeNode extends PythonBinaryBuiltinNode { - @SuppressWarnings("unused") - @Specialization - static PNotImplemented doGeneric(Object left, Object right) { - return PNotImplemented.NOT_IMPLEMENTED; + Object result = complexEqNode.execute(inliningTarget, left, right); + if (isNotImplementedProfile.profile(inliningTarget, result == PNotImplemented.NOT_IMPLEMENTED)) { + return PNotImplemented.NOT_IMPLEMENTED; + } + return (boolean) result == (op == RichCmpOp.Py_EQ); } } @GenerateNodeFactory - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization @InliningCutoff @@ -774,7 +1210,7 @@ protected ArgumentClinicProvider getArgumentClinic() { static TruffleString format(Object self, TruffleString formatString, @Bind("this") Node inliningTarget, @Cached ToComplexValueNode toComplexValueNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { ComplexValue c = toComplexValueNode.execute(inliningTarget, self); InternalFormat.Spec spec = InternalFormat.fromText(formatString, Spec.NONE, '>', inliningTarget); validateSpec(inliningTarget, spec, raiseNode); @@ -788,14 +1224,14 @@ private static TruffleString doFormat(Node raisingNode, double real, double imag return formatter.pad().getResult(); } - private static void validateSpec(Node inliningTarget, Spec spec, PRaiseNode.Lazy raiseNode) { + private static void validateSpec(Node inliningTarget, Spec spec, PRaiseNode raiseNode) { if (spec.getFill(' ') == '0') { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.ZERO_PADDING_NOT_ALLOWED_FOR_COMPLEX_FMT); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.ZERO_PADDING_NOT_ALLOWED_FOR_COMPLEX_FMT); } char align = spec.getAlign('>'); if (align == '=') { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.S_ALIGNMENT_FLAG_NOT_ALLOWED_FOR_COMPLEX_FMT, align); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.S_ALIGNMENT_FLAG_NOT_ALLOWED_FOR_COMPLEX_FMT, align); } } } @@ -813,29 +1249,29 @@ static boolean bool(Object self, } } + @Slot(value = SlotKind.nb_negative, isComplex = true) @GenerateNodeFactory - @Builtin(name = J___NEG__, minNumOfPositionalArgs = 1) abstract static class NegNode extends PythonUnaryBuiltinNode { @Specialization static PComplex neg(Object self, @Bind("this") Node inliningTarget, @Cached ToComplexValueNode toComplexValueNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { ComplexValue c = toComplexValueNode.execute(inliningTarget, self); - return factory.createComplex(-c.getReal(), -c.getImag()); + return PFactory.createComplex(language, -c.getReal(), -c.getImag()); } } + @Slot(value = SlotKind.nb_positive, isComplex = true) @GenerateNodeFactory - @Builtin(name = J___POS__, minNumOfPositionalArgs = 1) abstract static class PosNode extends PythonUnaryBuiltinNode { @Specialization static PComplex pos(Object self, @Bind("this") Node inliningTarget, @Cached ToComplexValueNode toComplexValueNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { ComplexValue c = toComplexValueNode.execute(inliningTarget, self); - return factory.createComplex(c.getReal(), c.getImag()); + return PFactory.createComplex(language, c.getReal(), c.getImag()); } } @@ -846,9 +1282,9 @@ abstract static class GetNewArgsNode extends PythonUnaryBuiltinNode { static PTuple get(Object self, @Bind("this") Node inliningTarget, @Cached ToComplexValueNode toComplexValueNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { ComplexValue c = toComplexValueNode.execute(inliningTarget, self); - return factory.createTuple(new Object[]{c.getReal(), c.getImag()}); + return PFactory.createTuple(language, new Object[]{c.getReal(), c.getImag()}); } } @@ -884,9 +1320,9 @@ static double getNative(PythonAbstractNativeObject self, } } + @Slot(value = SlotKind.tp_hash, isComplex = true) @GenerateNodeFactory - @Builtin(name = J___HASH__, minNumOfPositionalArgs = 1) - abstract static class HashNode extends PythonUnaryBuiltinNode { + abstract static class HashNode extends HashBuiltinNode { @Specialization static long doPComplex(Object self, @Bind("this") Node inliningTarget, @@ -907,9 +1343,9 @@ abstract static class ConjugateNode extends PythonUnaryBuiltinNode { static PComplex hash(Object self, @Bind("this") Node inliningTarget, @Cached ToComplexValueNode toComplexValueNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { ComplexValue c = toComplexValueNode.execute(inliningTarget, self); - return factory.createComplex(c.getReal(), -c.getImag()); + return PFactory.createComplex(language, c.getReal(), -c.getImag()); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/ContextBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/ContextBuiltins.java index 4db65cfc07..6327e7da89 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/ContextBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/ContextBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,13 +41,14 @@ package com.oracle.graal.python.builtins.objects.contextvars; import static com.oracle.graal.python.nodes.PGuards.isNoValue; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CONTAINS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.HashNotImplemented; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -57,6 +58,7 @@ import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.MpSubscriptBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqContains.SqContainsBuiltinNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.call.CallNode; @@ -64,7 +66,7 @@ import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -76,6 +78,7 @@ import com.oracle.truffle.api.profiles.InlinedConditionProfile; @CoreFunctions(extendClasses = PythonBuiltinClassType.ContextVarsContext) +@HashNotImplemented public final class ContextBuiltins extends PythonBuiltins { public static final TpSlots SLOTS = ContextBuiltinsSlotsGen.SLOTS; @@ -84,6 +87,17 @@ protected List> getNodeFa return ContextBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "Context", minNumOfPositionalArgs = 1) + @GenerateNodeFactory + public abstract static class ContextNode extends PythonUnaryBuiltinNode { + @Specialization + static Object construct(@SuppressWarnings("unused") Object cls, + @Bind PythonLanguage language) { + return PFactory.createContextVarsContext(language); + } + } + @Slot(SlotKind.mp_length) @GenerateUncached @GenerateNodeFactory @@ -100,18 +114,18 @@ public abstract static class GetContextVar extends MpSubscriptBuiltinNode { @Specialization Object get(PContextVarsContext self, Object key, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raise) { + @Cached PRaiseNode raise) { return getContextVar(inliningTarget, self, key, null, raise); } } - @Builtin(name = J___ITER__, declaresExplicitSelf = true, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory public abstract static class Iter extends PythonUnaryBuiltinNode { @Specialization static Object iter(PContextVarsContext self, - @Cached PythonObjectFactory factory) { - return factory.createContextIterator(self, PContextIterator.ItemKind.KEYS); + @Bind PythonLanguage language) { + return PFactory.createContextIterator(language, self, PContextIterator.ItemKind.KEYS); } } @@ -120,8 +134,8 @@ static Object iter(PContextVarsContext self, public abstract static class Keys extends PythonUnaryBuiltinNode { @Specialization static Object keys(PContextVarsContext self, - @Cached PythonObjectFactory factory) { - return factory.createContextIterator(self, PContextIterator.ItemKind.KEYS); + @Bind PythonLanguage language) { + return PFactory.createContextIterator(language, self, PContextIterator.ItemKind.KEYS); } } @@ -130,8 +144,8 @@ static Object keys(PContextVarsContext self, public abstract static class Values extends PythonUnaryBuiltinNode { @Specialization static Object values(PContextVarsContext self, - @Cached PythonObjectFactory factory) { - return factory.createContextIterator(self, PContextIterator.ItemKind.VALUES); + @Bind PythonLanguage language) { + return PFactory.createContextIterator(language, self, PContextIterator.ItemKind.VALUES); } } @@ -140,8 +154,8 @@ static Object values(PContextVarsContext self, public abstract static class Items extends PythonUnaryBuiltinNode { @Specialization static Object items(PContextVarsContext self, - @Cached PythonObjectFactory factory) { - return factory.createContextIterator(self, PContextIterator.ItemKind.ITEMS); + @Bind PythonLanguage language) { + return PFactory.createContextIterator(language, self, PContextIterator.ItemKind.ITEMS); } } @@ -149,11 +163,12 @@ static Object items(PContextVarsContext self, @GenerateNodeFactory public abstract static class Run extends PythonBuiltinNode { @Specialization - Object get(VirtualFrame frame, PContextVarsContext self, Object fun, Object[] args, PKeyword[] keywords, + static Object get(VirtualFrame frame, PContextVarsContext self, Object fun, Object[] args, PKeyword[] keywords, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached CallNode call, - @Cached PRaiseNode.Lazy raise) { - PythonContext.PythonThreadState threadState = getContext().getThreadState(getLanguage()); + @Cached PRaiseNode raise) { + PythonContext.PythonThreadState threadState = context.getThreadState(context.getLanguage(inliningTarget)); self.enter(inliningTarget, threadState, raise); try { return call.execute(frame, fun, args, keywords); @@ -168,8 +183,8 @@ Object get(VirtualFrame frame, PContextVarsContext self, Object fun, Object[] ar public abstract static class Copy extends PythonUnaryBuiltinNode { @Specialization static Object doCopy(PContextVarsContext self, - @Cached PythonObjectFactory factory) { - PContextVarsContext ret = factory.createContextVarsContext(); + @Bind PythonLanguage language) { + PContextVarsContext ret = PFactory.createContextVarsContext(language); ret.contextVarValues = self.contextVarValues; return ret; } @@ -183,32 +198,33 @@ public abstract static class GetMethod extends PythonBuiltinNode { Object doGetDefault(PContextVarsContext self, Object key, Object def, @Bind("this") Node inliningTarget, @Cached InlinedConditionProfile noValueProfile, - @Cached PRaiseNode.Lazy raise) { + @Cached PRaiseNode raise) { Object defVal = noValueProfile.profile(inliningTarget, isNoValue(def)) ? PNone.NONE : def; return getContextVar(inliningTarget, self, key, defVal, raise); } } - @Builtin(name = J___CONTAINS__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.sq_contains, isComplex = true) @GenerateNodeFactory - public abstract static class Contains extends PythonBuiltinNode { + public abstract static class Contains extends SqContainsBuiltinNode { @Specialization boolean doIn(PContextVarsContext self, Object key, + @Bind("this") Node inliningTarget, @Cached PRaiseNode raise) { if (key instanceof PContextVar var) { return self.contextVarValues.lookup(var, var.getHash()) != null; } - throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.CONTEXTVAR_KEY_EXPECTED, key); + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.CONTEXTVAR_KEY_EXPECTED, key); } } - private static Object getContextVar(Node inliningTarget, PContextVarsContext self, Object key, Object def, PRaiseNode.Lazy raise) { + private static Object getContextVar(Node inliningTarget, PContextVarsContext self, Object key, Object def, PRaiseNode raise) { if (key instanceof PContextVar ctxVar) { Object value = self.contextVarValues.lookup(key, ctxVar.getHash()); if (value == null) { if (def == null) { - throw raise.get(inliningTarget).raise(PythonBuiltinClassType.KeyError, new Object[]{key}); + throw raise.raise(inliningTarget, PythonBuiltinClassType.KeyError, new Object[]{key}); } else { return def; } @@ -216,7 +232,7 @@ private static Object getContextVar(Node inliningTarget, PContextVarsContext sel return value; } } else { - throw raise.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.CONTEXTVAR_KEY_EXPECTED, key); + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.CONTEXTVAR_KEY_EXPECTED, key); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/ContextIteratorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/ContextIteratorBuiltins.java index fa79001cd4..7e77838bb5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/ContextIteratorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/ContextIteratorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,34 +40,33 @@ */ package com.oracle.graal.python.builtins.objects.contextvars; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__; - import java.util.List; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.nodes.Node; @CoreFunctions(extendClasses = PythonBuiltinClassType.ContextIterator) public final class ContextIteratorBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = ContextIteratorBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return ContextIteratorBuiltinsFactory.getFactories(); } - @Builtin(name = J___ITER__, declaresExplicitSelf = true, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory public abstract static class Iter extends PythonUnaryBuiltinNode { @Specialization @@ -76,17 +75,15 @@ static Object iter(PContextIterator self) { } } - @Builtin(name = J___NEXT__, declaresExplicitSelf = true, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iternext, isComplex = true) @GenerateNodeFactory - public abstract static class Next extends PythonUnaryBuiltinNode { + public abstract static class Next extends TpIterNextBuiltin { @Specialization static Object next(PContextIterator self, - @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - Object next = self.next(factory); + @Bind PythonLanguage language) { + Object next = self.next(language); if (next == null) { - throw raiseNode.get(inliningTarget).raiseStopIteration(); + throw iteratorExhausted(); } else { return next; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/ContextVarBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/ContextVarBuiltins.java index bac8931e0d..6786558dbf 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/ContextVarBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/ContextVarBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -49,17 +49,25 @@ import java.util.List; import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.contextvars.ContextVarBuiltinsClinicProviders.ContextVarNodeClinicProviderGen; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; @@ -68,15 +76,41 @@ import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.InlinedConditionProfile; +import com.oracle.truffle.api.strings.TruffleString; @CoreFunctions(extendClasses = PythonBuiltinClassType.ContextVar) public final class ContextVarBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = ContextVarBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return ContextVarBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "ContextVar", minNumOfPositionalArgs = 2, parameterNames = {"cls", "name", "default"}) + @ArgumentClinic(name = "name", conversion = ArgumentClinic.ClinicConversion.TString) + @GenerateNodeFactory + public abstract static class ContextVarNode extends PythonTernaryClinicBuiltinNode { + + @Override + protected ArgumentClinicProvider getArgumentClinic() { + return ContextVarNodeClinicProviderGen.INSTANCE; + } + + @Specialization + protected static Object constructDef(@SuppressWarnings("unused") Object cls, TruffleString name, Object def, + @Bind("this") Node inliningTarget, + @Cached InlinedConditionProfile noValueProfile, + @Bind PythonLanguage language) { + if (noValueProfile.profile(inliningTarget, isNoValue(def))) { + def = PContextVar.NO_DEFAULT; + } + return PFactory.createContextVar(language, name, def); + } + } + @Builtin(name = "get", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2) @GenerateNodeFactory public abstract static class GetNode extends PythonBinaryBuiltinNode { @@ -84,14 +118,15 @@ public abstract static class GetNode extends PythonBinaryBuiltinNode { static Object get(PContextVar self, Object def, @Bind("this") Node inliningTarget, @Cached InlinedConditionProfile defIsNoValueProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object defValue = defIsNoValueProfile.profile(inliningTarget, isNoValue(def)) ? PContextVar.NO_DEFAULT : def; - PythonContext.PythonThreadState threadState = PythonContext.get(inliningTarget).getThreadState(PythonLanguage.get(inliningTarget)); + PythonContext context = PythonContext.get(inliningTarget); + PythonContext.PythonThreadState threadState = context.getThreadState(context.getLanguage(inliningTarget)); Object value = self.get(threadState, defValue); if (value != null) { return value; } - throw raiseNode.get(inliningTarget).raise(LookupError); + throw raiseNode.raise(inliningTarget, LookupError); } } @@ -99,12 +134,14 @@ static Object get(PContextVar self, Object def, @GenerateNodeFactory public abstract static class SetNode extends PythonBinaryBuiltinNode { @Specialization - Object set(PContextVar self, Object value, - @Cached PythonObjectFactory factory) { - PythonContext.PythonThreadState threadState = getContext().getThreadState(getLanguage()); + static Object set(PContextVar self, Object value, + @Bind("this") Node inliningTarget, + @Bind PythonContext context) { + PythonLanguage language = context.getLanguage(inliningTarget); + PythonContext.PythonThreadState threadState = context.getThreadState(language); Object oldValue = self.getValue(threadState); self.setValue(threadState, value); - return factory.createContextVarsToken(self, oldValue); + return PFactory.createContextVarsToken(language, self, oldValue); } } @@ -112,12 +149,13 @@ Object set(PContextVar self, Object value, @GenerateNodeFactory public abstract static class ResetNode extends PythonBinaryBuiltinNode { @Specialization - Object reset(PContextVar self, PContextVarsToken token, + static Object reset(PContextVar self, PContextVarsToken token, @Bind("this") Node inliningTarget, - @Shared @Cached PRaiseNode.Lazy raise) { + @Bind PythonContext pythonContext, + @Shared @Cached PRaiseNode raise) { if (self == token.getVar()) { token.use(inliningTarget, raise); - PythonContext.PythonThreadState threadState = getContext().getThreadState(getLanguage()); + PythonContext.PythonThreadState threadState = pythonContext.getThreadState(pythonContext.getLanguage(inliningTarget)); if (token.getOldValue() == null) { PContextVarsContext context = threadState.getContextVarsContext(); context.contextVarValues = context.contextVarValues.without(self, self.getHash()); @@ -125,7 +163,7 @@ Object reset(PContextVar self, PContextVarsToken token, self.setValue(threadState, token.getOldValue()); } } else { - throw raise.get(inliningTarget).raise(ValueError, ErrorMessages.TOKEN_FOR_DIFFERENT_CONTEXTVAR, token); + throw raise.raise(inliningTarget, ValueError, ErrorMessages.TOKEN_FOR_DIFFERENT_CONTEXTVAR, token); } return PNone.NONE; } @@ -133,8 +171,8 @@ Object reset(PContextVar self, PContextVarsToken token, @Specialization(guards = "!isToken(token)") Object doError(@SuppressWarnings("unused") PContextVar self, Object token, @Bind("this") Node inliningTarget, - @Shared @Cached PRaiseNode.Lazy raise) { - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.INSTANCE_OF_TOKEN_EXPECTED, token); + @Shared @Cached PRaiseNode raise) { + throw raise.raise(inliningTarget, TypeError, ErrorMessages.INSTANCE_OF_TOKEN_EXPECTED, token); } static boolean isToken(Object obj) { @@ -147,8 +185,8 @@ static boolean isToken(Object obj) { public abstract static class ClassGetItemNode extends PythonBinaryBuiltinNode { @Specialization static Object classGetItem(Object cls, Object key, - @Cached PythonObjectFactory factory) { - return factory.createGenericAlias(cls, key); + @Bind PythonLanguage language) { + return PFactory.createGenericAlias(language, cls, key); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/Hamt.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/Hamt.java index 6f1aaf07b2..34d24f1e50 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/Hamt.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/Hamt.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -147,7 +147,7 @@ private static TreePart partWithEntry(TreePart original, Entry newEntry, int has if (original instanceof Entry) { Entry existing = (Entry) original; if (newEntry.hash == existing.hash) { - if (PyObjectRichCompareBool.EqNode.compareUncached(newEntry.key, existing.key)) { + if (PyObjectRichCompareBool.executeEqUncached(newEntry.key, existing.key)) { return newEntry; } else { return new CollisionPart(existing.hash, existing, newEntry); @@ -230,7 +230,7 @@ private static Object lookupKeyInPart(TreePart part, Object key, int hash, int h } if (part instanceof Entry) { Entry existing = (Entry) part; - if (existing.hash == hash && PyObjectRichCompareBool.EqNode.compareUncached(existing.key, key)) { + if (existing.hash == hash && PyObjectRichCompareBool.executeEqUncached(existing.key, key)) { return existing.value; } return null; @@ -256,7 +256,7 @@ private static Object lookupKeyInPart(TreePart part, Object key, int hash, int h return null; } for (Entry entry : existing.elems) { - if (PyObjectRichCompareBool.EqNode.compareUncached(entry.key, key)) { + if (PyObjectRichCompareBool.executeEqUncached(entry.key, key)) { return entry.value; } } @@ -325,7 +325,7 @@ private static TreePart partWithoutKey(TreePart root, Object key, int hash, int } if (root instanceof Entry) { Entry existing = (Entry) root; - if (existing.hash == hash && PyObjectRichCompareBool.EqNode.compareUncached(existing.key, key)) { + if (existing.hash == hash && PyObjectRichCompareBool.executeEqUncached(existing.key, key)) { return null; } return root; @@ -369,7 +369,7 @@ private static TreePart partWithoutKey(TreePart root, Object key, int hash, int CollisionPart existing = (CollisionPart) root; if (existing.hash == hash) { for (int i = 0; i < existing.elems.length; ++i) { - if (PyObjectRichCompareBool.EqNode.compareUncached(existing.elems[i].key, key)) { + if (PyObjectRichCompareBool.executeEqUncached(existing.elems[i].key, key)) { if (existing.elems.length == 1) { return null; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/PContextIterator.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/PContextIterator.java index 17ab98a5e3..401b98a7f3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/PContextIterator.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/PContextIterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,8 +40,9 @@ */ package com.oracle.graal.python.builtins.objects.contextvars; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.object.Shape; @@ -51,14 +52,14 @@ public enum ItemKind { VALUES, ITEMS; - public Object apply(Hamt.Entry item, PythonObjectFactory factory) { + public Object apply(Hamt.Entry item, PythonLanguage language) { switch (this) { case KEYS: return item.key; case VALUES: return item.value; case ITEMS: - return factory.createTuple(new Object[]{item.key, item.value}); + return PFactory.createTuple(language, new Object[]{item.key, item.value}); default: throw CompilerDirectives.shouldNotReachHere("null ItemKind in PHamtIterator"); } @@ -76,8 +77,8 @@ public PContextIterator(Object cls, Shape instanceShape, PContextVarsContext ctx } // can return null - public Object next(PythonObjectFactory factory) { + public Object next(PythonLanguage language) { Hamt.Entry item = it.next(); - return item == null ? null : kind.apply(item, factory); + return item == null ? null : kind.apply(item, language); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/PContextVarsContext.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/PContextVarsContext.java index d26463bb45..9896cf8266 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/PContextVarsContext.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/PContextVarsContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -52,9 +52,9 @@ public class PContextVarsContext extends PythonBuiltinObject { Hamt contextVarValues; private PContextVarsContext previousContext = null; - public void enter(Node inliningTarget, PythonContext.PythonThreadState threadState, PRaiseNode.Lazy raise) { + public void enter(Node inliningTarget, PythonContext.PythonThreadState threadState, PRaiseNode raise) { if (previousContext != null) { - throw raise.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.CANNOT_ENTER_CONTEXT_ALREADY_ENTERED, this); + throw raise.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.CANNOT_ENTER_CONTEXT_ALREADY_ENTERED, this); } previousContext = threadState.getContextVarsContext(); assert previousContext != null : "ThreadState had null Context. This should not happen"; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/PContextVarsToken.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/PContextVarsToken.java index 1c0e80d1a8..ea4b0c6c90 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/PContextVarsToken.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/PContextVarsToken.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -60,9 +60,9 @@ public PContextVarsToken(PContextVar var, Object oldValue, Object cls, Shape ins this.oldValue = oldValue; } - public void use(Node inliningTarget, PRaiseNode.Lazy raise) { + public void use(Node inliningTarget, PRaiseNode raise) { if (used) { - throw raise.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.TOKEN_ALREADY_USED, this); + throw raise.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.TOKEN_ALREADY_USED, this); } used = true; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/TokenBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/TokenBuiltins.java index 231f12ad28..b67f235d64 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/TokenBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/contextvars/TokenBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,30 +45,53 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.HashNotImplemented; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.attributes.WriteAttributeToPythonObjectNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.dsl.Cached; +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @CoreFunctions(extendClasses = PythonBuiltinClassType.ContextVarsToken) +@HashNotImplemented public final class TokenBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = TokenBuiltinsSlotsGen.SLOTS; @Override protected List> getNodeFactories() { return TokenBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "Token", minNumOfPositionalArgs = 1) + @GenerateNodeFactory + public abstract static class TokenNode extends PythonUnaryBuiltinNode { + @Specialization + Object construct(@SuppressWarnings("unused") Object cls, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.TOKEN_ONLY_BY_CONTEXTVAR); + } + } + @Builtin(name = "var", isGetter = true, minNumOfPositionalArgs = 1) @GenerateNodeFactory public abstract static class VarAttr extends PythonBuiltinNode { @@ -101,8 +124,8 @@ public void postInitialize(Python3Core core) { public abstract static class ClassGetItemNode extends PythonBinaryBuiltinNode { @Specialization static Object classGetItem(Object cls, Object key, - @Cached PythonObjectFactory factory) { - return factory.createGenericAlias(cls, key); + @Bind PythonLanguage language) { + return PFactory.createGenericAlias(language, cls, key); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/deque/DequeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/deque/DequeBuiltins.java index 765ba88c0a..d712b3d5dc 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/deque/DequeBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/deque/DequeBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,32 +44,17 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.MemoryError; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.RuntimeError; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.StopIteration; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError; import static com.oracle.graal.python.nodes.BuiltinNames.J_APPEND; +import static com.oracle.graal.python.nodes.BuiltinNames.J_DEQUE; import static com.oracle.graal.python.nodes.BuiltinNames.J_EXTEND; import static com.oracle.graal.python.nodes.ErrorMessages.DEQUE_MUTATED_DURING_REMOVE; import static com.oracle.graal.python.nodes.ErrorMessages.DEQUE_REMOVE_X_NOT_IN_DEQUE; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CLASS_GETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CONTAINS__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___COPY__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DELITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IADD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NE__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REVERSED__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___HASH__; import static com.oracle.graal.python.nodes.StringLiterals.T_ELLIPSIS_IN_BRACKETS; import static com.oracle.graal.python.nodes.StringLiterals.T_LPAREN; import static com.oracle.graal.python.nodes.StringLiterals.T_RPAREN; @@ -79,37 +64,43 @@ import java.util.Iterator; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; +import com.oracle.graal.python.annotations.HashNotImplemented; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.PNotImplemented; import com.oracle.graal.python.builtins.objects.common.IndexNodes.NormalizeIndexCustomMessageNode; -import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeDelItemNodeClinicProviderGen; -import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeInplaceMulNodeClinicProviderGen; import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeInsertNodeClinicProviderGen; import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeRotateNodeClinicProviderGen; -import com.oracle.graal.python.builtins.objects.deque.DequeBuiltinsClinicProviders.DequeSetItemNodeClinicProviderGen; +import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.SqConcatBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqItemBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqRepeatBuiltinNode; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqAssItem.SqAssItemBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqContains.SqContainsBuiltinNode; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.lib.PyObjectGetStateNode; import com.oracle.graal.python.lib.PyObjectRichCompareBool; import com.oracle.graal.python.lib.PyObjectStrAsTruffleStringNode; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; @@ -120,6 +111,7 @@ import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; @@ -127,15 +119,12 @@ import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.util.ComparisonOp; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.GenerateCached; -import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.NodeFactory; @@ -148,6 +137,7 @@ import com.oracle.truffle.api.strings.TruffleStringBuilder; @CoreFunctions(extendClasses = PythonBuiltinClassType.PDeque) +@HashNotImplemented public final class DequeBuiltins extends PythonBuiltins { public static final TpSlots SLOTS = DequeBuiltinsSlotsGen.SLOTS; @@ -156,15 +146,23 @@ protected List> getNodeFa return DequeBuiltinsFactory.getFactories(); } - @Override - public void initialize(Python3Core core) { - super.initialize(core); - // setting None means that this type is unhashable - addBuiltinConstant(T___HASH__, PNone.NONE); + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_DEQUE, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class DequeNode extends PythonVarargsBuiltinNode { + + @Specialization + @SuppressWarnings("unused") + PDeque doGeneric(Object cls, Object[] args, PKeyword[] kwargs, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createDeque(language, cls, getInstanceShape.execute(cls)); + } } // deque.__init__(self, [iterable, [maxlen]]) - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, parameterNames = {"$self", "iterable", "maxlen"}) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "deque", minNumOfPositionalArgs = 1, parameterNames = {"$self", "iterable", "maxlen"}) @GenerateNodeFactory public abstract static class DequeInitNode extends PythonTernaryBuiltinNode { @@ -179,17 +177,16 @@ static PNone doIterable(VirtualFrame frame, PDeque self, Object iterable, @Suppr @Bind("this") Node inliningTarget, @Exclusive @Cached InlinedConditionProfile sizeZeroProfile, @Exclusive @Cached PyObjectGetIter getIter, - @Exclusive @Cached GetNextNode getNextNode, - @Exclusive @Cached IsBuiltinObjectProfile isStopIterationProfile) { + @Exclusive @Cached PyIterNextNode nextNode) { if (sizeZeroProfile.profile(inliningTarget, self.getSize() != 0)) { self.clear(); } Object iterator = getIter.execute(frame, inliningTarget, iterable); while (true) { try { - self.append(getNextNode.execute(frame, iterator)); - } catch (PException e) { - e.expect(inliningTarget, PythonBuiltinClassType.StopIteration, isStopIterationProfile); + Object next = nextNode.execute(frame, inliningTarget, iterator); + self.append(next); + } catch (IteratorExhausted e) { break; } } @@ -202,15 +199,14 @@ static PNone doGeneric(VirtualFrame frame, PDeque self, Object iterable, Object @Exclusive @Cached InlinedConditionProfile sizeZeroProfile, @Cached CastToJavaIntExactNode castToIntNode, @Exclusive @Cached PyObjectGetIter getIter, - @Exclusive @Cached GetNextNode getNextNode, + @Exclusive @Cached PyIterNextNode nextNode, @Exclusive @Cached IsBuiltinObjectProfile isTypeErrorProfile, - @Exclusive @Cached IsBuiltinObjectProfile isStopIterationProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (!PGuards.isPNone(maxlenObj)) { try { int maxlen = castToIntNode.execute(inliningTarget, maxlenObj); if (maxlen < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MAXLEN_MUST_BE_NONNEG); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MAXLEN_MUST_BE_NONNEG); } self.setMaxLength(maxlen); } catch (PException e) { @@ -219,14 +215,14 @@ static PNone doGeneric(VirtualFrame frame, PDeque self, Object iterable, Object * OverflowError */ e.expect(inliningTarget, TypeError, isTypeErrorProfile); - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "int"); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "int"); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.INTEGER_REQUIRED); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.INTEGER_REQUIRED); } } if (iterable != PNone.NO_VALUE) { - doIterable(frame, self, iterable, PNone.NO_VALUE, inliningTarget, sizeZeroProfile, getIter, getNextNode, isStopIterationProfile); + doIterable(frame, self, iterable, PNone.NO_VALUE, inliningTarget, sizeZeroProfile, getIter, nextNode); } return PNone.NONE; } @@ -293,9 +289,11 @@ public abstract static class DequeCopyNode extends PythonUnaryBuiltinNode { @Specialization static PDeque doGeneric(PDeque self, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached GetClassNode getClassNode, - @Cached PythonObjectFactory factory) { - PDeque copy = factory.createDeque(getClassNode.execute(inliningTarget, self)); + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + Object cls = getClassNode.execute(inliningTarget, self); + PDeque copy = PFactory.createDeque(language, cls, getInstanceShape.execute(cls)); copy.setMaxLength(self.getMaxLength()); copy.addAll(self); return copy; @@ -313,11 +311,11 @@ int doGeneric(PDeque self, Object value) { int n = 0; int startState = self.getState(); for (Object item : self.data) { - if (PyObjectRichCompareBool.EqNode.compareUncached(item, value)) { + if (PyObjectRichCompareBool.executeUncached(item, value, RichCmpOp.Py_EQ)) { n++; } if (startState != self.getState()) { - throw PRaiseNode.raiseUncached(this, RuntimeError, ErrorMessages.DEQUE_MUTATED_DURING_ITERATION); + throw PRaiseNode.raiseStatic(this, RuntimeError, ErrorMessages.DEQUE_MUTATED_DURING_ITERATION); } } return n; @@ -350,36 +348,34 @@ PNone doGeneric(VirtualFrame frame, PDeque self, Object other, @Cached InlinedConditionProfile selfIsOtherProfile, @Cached InlinedConditionProfile maxLenZeroProfile, @Cached PyObjectGetIter getIter, - @Cached GetNextNode getNextNode, - @Cached IsBuiltinObjectProfile isStopIterationProfile) { + @Cached PyIterNextNode nextNode) { if (selfIsOtherProfile.profile(inliningTarget, self == other)) { return doSelf(self, self); } Object it = getIter.execute(frame, inliningTarget, other); if (maxLenZeroProfile.profile(inliningTarget, self.getMaxLength() == 0)) { - consumeIterator(frame, it, getNextNode, inliningTarget, isStopIterationProfile); + consumeIterator(frame, it, nextNode, inliningTarget); return PNone.NONE; } while (true) { try { - appendOperation(self, getNextNode.execute(frame, it)); - } catch (PException e) { - e.expect(inliningTarget, StopIteration, isStopIterationProfile); + Object next = nextNode.execute(frame, inliningTarget, it); + appendOperation(self, next); + } catch (IteratorExhausted e) { break; } } - consumeIterator(frame, it, getNextNode, inliningTarget, isStopIterationProfile); + consumeIterator(frame, it, nextNode, inliningTarget); return PNone.NONE; } - private static void consumeIterator(VirtualFrame frame, Object it, GetNextNode getNextNode, Node inliningTarget, IsBuiltinObjectProfile isStopIterationProfile) { + private static void consumeIterator(VirtualFrame frame, Object it, PyIterNextNode getNextNode, Node inliningTarget) { while (true) { try { - getNextNode.execute(frame, it); - } catch (PException e) { - e.expect(inliningTarget, StopIteration, isStopIterationProfile); + getNextNode.execute(frame, inliningTarget, it); + } catch (IteratorExhausted e) { break; } } @@ -403,16 +399,16 @@ public abstract static class DequeIndexNode extends PythonQuaternaryBuiltinNode @Specialization(guards = {"isNoValue(start)", "isNoValue(stop)"}) static int doWithoutSlice(VirtualFrame frame, PDeque self, Object value, @SuppressWarnings("unused") PNone start, @SuppressWarnings("unused") PNone stop, @Bind("this") Node inliningTarget, - @Shared("eqNode") @Cached PyObjectRichCompareBool.EqNode eqNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared("eqNode") @Cached PyObjectRichCompareBool eqNode, + @Shared @Cached PRaiseNode raiseNode) { return doWithIntSlice(frame, self, value, 0, self.getSize(), inliningTarget, eqNode, raiseNode); } @Specialization static int doWithIntSlice(VirtualFrame frame, PDeque self, Object value, int start, int stop, @Bind("this") Node inliningTarget, - @Shared("eqNode") @Cached PyObjectRichCompareBool.EqNode eqNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared("eqNode") @Cached PyObjectRichCompareBool eqNode, + @Shared @Cached PRaiseNode raiseNode) { int size = self.getSize(); int normStart = normalize(start, size); int normStop = normalize(stop, size); @@ -431,25 +427,25 @@ static int doWithIntSlice(VirtualFrame frame, PDeque self, Object value, int sta */ Object item = next(iterator); if (normStart <= idx) { - if (eqNode.compare(frame, inliningTarget, item, value)) { + if (eqNode.execute(frame, inliningTarget, item, value, RichCmpOp.Py_EQ)) { return idx; } if (startState != self.getState()) { - throw raiseNode.get(inliningTarget).raise(RuntimeError, ErrorMessages.DEQUE_MUTATED_DURING_ITERATION); + throw raiseNode.raise(inliningTarget, RuntimeError, ErrorMessages.DEQUE_MUTATED_DURING_ITERATION); } } } - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.S_IS_NOT_DEQUE, value); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.S_IS_NOT_DEQUE, value); } @Specialization static int doGeneric(VirtualFrame frame, PDeque self, Object value, Object start, Object stop, @Bind("this") Node inliningTarget, - @Exclusive @Cached PyObjectRichCompareBool.EqNode eqNode, + @Exclusive @Cached PyObjectRichCompareBool eqNode, @Cached CastToJavaIntExactNode castToIntNode, @Cached PyNumberAsSizeNode startIndexNode, @Cached PyNumberAsSizeNode stopIndexNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { int istart; int istop; if (start != PNone.NO_VALUE) { @@ -495,7 +491,7 @@ protected ArgumentClinicProvider getArgumentClinic() { PNone doGeneric(PDeque self, int index, Object value) { int n = self.getSize(); if (self.getMaxLength() == n) { - throw PRaiseNode.raiseUncached(this, IndexError, ErrorMessages.DEQUE_AT_MAX_SIZE); + throw PRaiseNode.raiseStatic(this, IndexError, ErrorMessages.DEQUE_AT_MAX_SIZE); } // shortcuts for simple cases @@ -525,10 +521,10 @@ public abstract static class DequePopNode extends PythonUnaryBuiltinNode { @Specialization static Object doGeneric(PDeque self, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object value = self.pop(); if (value == null) { - throw raiseNode.get(inliningTarget).raise(IndexError, ErrorMessages.POP_FROM_EMPTY_DEQUE); + throw raiseNode.raise(inliningTarget, IndexError, ErrorMessages.POP_FROM_EMPTY_DEQUE); } return value; } @@ -542,10 +538,10 @@ public abstract static class DequePopLeftNode extends PythonUnaryBuiltinNode { @Specialization static Object doGeneric(PDeque self, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object value = self.popLeft(); if (value == null) { - throw raiseNode.get(inliningTarget).raise(IndexError, ErrorMessages.POP_FROM_EMPTY_DEQUE); + throw raiseNode.raise(inliningTarget, IndexError, ErrorMessages.POP_FROM_EMPTY_DEQUE); } return value; } @@ -563,9 +559,9 @@ Object doGeneric(PDeque self, Object value) { int n = self.getSize(); for (int i = 0; i < n; i++) { try { - boolean result = PyObjectRichCompareBool.EqNode.compareUncached(self.peekLeft(), value); + boolean result = PyObjectRichCompareBool.executeUncached(self.peekLeft(), value, RichCmpOp.Py_EQ); if (n != self.getSize()) { - throw PRaiseNode.raiseUncached(this, IndexError, DEQUE_MUTATED_DURING_REMOVE); + throw PRaiseNode.raiseStatic(this, IndexError, DEQUE_MUTATED_DURING_REMOVE); } if (result) { Object removed = self.popLeft(); @@ -585,7 +581,7 @@ Object doGeneric(PDeque self, Object value) { throw e; } } - throw PRaiseNode.raiseUncached(this, ValueError, DEQUE_REMOVE_X_NOT_IN_DEQUE); + throw PRaiseNode.raiseStatic(this, ValueError, DEQUE_REMOVE_X_NOT_IN_DEQUE); } } @@ -673,7 +669,7 @@ static int doGeneric(PDeque self) { } // deque.__iadd__(v) - @Builtin(name = J___IADD__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.sq_inplace_concat, isComplex = true) @GenerateNodeFactory public abstract static class DequeInplaceAddNode extends PythonBinaryBuiltinNode { @@ -693,8 +689,7 @@ static PDeque doDeque(PDeque self, PDeque other) { static PDeque doOther(VirtualFrame frame, PDeque self, Object other, @Bind("this") Node inliningTarget, @Cached PyObjectGetIter getIter, - @Cached GetNextNode getNextNode, - @Cached IsBuiltinObjectProfile isStopIterationProfile) { + @Cached PyIterNextNode nextNode) { if (other instanceof PDeque) { return doDeque(self, (PDeque) other); } @@ -706,9 +701,9 @@ static PDeque doOther(VirtualFrame frame, PDeque self, Object other, Object iterator = getIter.execute(frame, inliningTarget, other); while (true) { try { - self.append(getNextNode.execute(frame, iterator)); - } catch (PException e) { - e.expect(inliningTarget, PythonBuiltinClassType.StopIteration, isStopIterationProfile); + Object next = nextNode.execute(frame, inliningTarget, iterator); + self.append(next); + } catch (IteratorExhausted e) { break; } } @@ -723,7 +718,7 @@ public abstract static class DequeAddNode extends SqConcatBuiltinNode { @Specialization @TruffleBoundary static PDeque doDeque(PDeque self, PDeque other) { - PDeque newDeque = PythonObjectFactory.getUncached().createDeque(); + PDeque newDeque = PFactory.createDeque(PythonLanguage.get(null)); newDeque.setMaxLength(self.getMaxLength()); newDeque.addAll(self); newDeque.addAll(other); @@ -733,24 +728,18 @@ static PDeque doDeque(PDeque self, PDeque other) { @Specialization(replaces = "doDeque") static PDeque doGeneric(PDeque self, Object other, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (!(other instanceof PDeque)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CAN_ONLY_CONCATENATE_DEQUE_NOT_P_TO_DEQUE, other); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CAN_ONLY_CONCATENATE_DEQUE_NOT_P_TO_DEQUE, other); } return doDeque(self, (PDeque) other); } } - // deque.__mul__(v) - @Builtin(name = J___IMUL__, minNumOfPositionalArgs = 2, parameterNames = {"$self", "n"}) + // deque.__imul__(v) + @Slot(value = SlotKind.sq_inplace_repeat, isComplex = true) @GenerateNodeFactory - @ArgumentClinic(name = "n", conversion = ClinicConversion.Index) - public abstract static class DequeInplaceMulNode extends PythonBinaryClinicBuiltinNode { - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return DequeInplaceMulNodeClinicProviderGen.INSTANCE; - } + public abstract static class DequeInplaceMulNode extends SqRepeatBuiltinNode { @Specialization PDeque doGeneric(PDeque self, int n) { @@ -769,7 +758,7 @@ static PDeque doGeneric(Node node, PDeque self, int n) { } if (size > Integer.MAX_VALUE / n) { - throw PRaiseNode.raiseUncached(node, MemoryError); + throw PRaiseNode.raiseStatic(node, MemoryError); } // Reduce the number of repetitions when maxlen would be exceeded @@ -793,27 +782,27 @@ public abstract static class DequeMulNode extends SqRepeatBuiltinNode { @Specialization @TruffleBoundary PDeque doGeneric(PDeque self, int n) { - PDeque newDeque = PythonObjectFactory.getUncached().createDeque(); + PDeque newDeque = PFactory.createDeque(PythonLanguage.get(null)); newDeque.setMaxLength(self.getMaxLength()); newDeque.addAll(self); return DequeInplaceMulNode.doGeneric(this, newDeque, n); } } - @Builtin(name = J___CONTAINS__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.sq_contains, isComplex = true) @GenerateNodeFactory - public abstract static class DequeContainsNode extends PythonBinaryBuiltinNode { + public abstract static class DequeContainsNode extends SqContainsBuiltinNode { @Specialization @TruffleBoundary boolean doGeneric(PDeque self, Object value) { int startState = self.getState(); for (Object item : self.data) { - if (PyObjectRichCompareBool.EqNode.compareUncached(item, value)) { + if (PyObjectRichCompareBool.executeUncached(item, value, RichCmpOp.Py_EQ)) { return true; } if (startState != self.getState()) { - throw PRaiseNode.raiseUncached(this, RuntimeError, ErrorMessages.DEQUE_MUTATED_DURING_ITERATION); + throw PRaiseNode.raiseStatic(this, RuntimeError, ErrorMessages.DEQUE_MUTATED_DURING_ITERATION); } } return false; @@ -842,53 +831,27 @@ Object doGetItem(PDeque self, int idx) { } } - @Builtin(name = J___SETITEM__, minNumOfPositionalArgs = 3, parameterNames = {"$self", "n", "value"}) + @Slot(value = SlotKind.sq_ass_item, isComplex = true) @GenerateNodeFactory - @ArgumentClinic(name = "n", conversion = ClinicConversion.Index) - public abstract static class DequeSetItemNode extends PythonTernaryClinicBuiltinNode { - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return DequeSetItemNodeClinicProviderGen.INSTANCE; - } + public abstract static class DequeSetItemNode extends SqAssItemBuiltinNode { @Specialization - static PNone doGeneric(PDeque self, int idx, Object value, + static void setOrDel(PDeque self, int idx, Object value, @Cached NormalizeIndexCustomMessageNode normalizeIndexNode) { int normIdx = normalizeIndexNode.execute(idx, self.getSize(), ErrorMessages.DEQUE_INDEX_OUT_OF_RANGE); self.setItem(normIdx, value != PNone.NO_VALUE ? value : null); - return PNone.NONE; - } - } - - @Builtin(name = J___DELITEM__, minNumOfPositionalArgs = 2, parameterNames = {"$self", "n"}) - @GenerateNodeFactory - @ArgumentClinic(name = "n", conversion = ClinicConversion.Index) - public abstract static class DequeDelItemNode extends PythonBinaryClinicBuiltinNode { - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return DequeDelItemNodeClinicProviderGen.INSTANCE; - } - - @Specialization - static PNone doGeneric(PDeque self, int idx, - @Cached NormalizeIndexCustomMessageNode normalizeIndexNode) { - int normIdx = normalizeIndexNode.execute(idx, self.getSize(), ErrorMessages.DEQUE_INDEX_OUT_OF_RANGE); - self.setItem(normIdx, null); - return PNone.NONE; } } // deque.__iter__() - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory public abstract static class DequeIterNode extends PythonUnaryBuiltinNode { @Specialization static PDequeIter doGeneric(PDeque self, - @Cached PythonObjectFactory factory) { - return factory.createDequeIter(self); + @Bind PythonLanguage language) { + return PFactory.createDequeIter(language, self); } } @@ -899,13 +862,13 @@ public abstract static class DequeReversedNode extends PythonUnaryBuiltinNode { @Specialization static PDequeIter doGeneric(PDeque self, - @Cached PythonObjectFactory factory) { - return factory.createDequeRevIter(self); + @Bind PythonLanguage language) { + return PFactory.createDequeRevIter(language, self); } } // deque.__repr__() - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class DequeReprNode extends PythonUnaryBuiltinNode { @@ -919,7 +882,7 @@ TruffleString repr(PDeque self) { Node outerNode = ref.set(this); try { Object[] items = self.data.toArray(); - PList asList = PythonObjectFactory.getUncached().createList(items); + PList asList = PFactory.createList(PythonLanguage.get(null), items); int maxLength = self.getMaxLength(); TruffleStringBuilder sb = TruffleStringBuilder.create(TS_ENCODING); sb.appendStringUncached(GetNameNode.executeUncached(GetPythonObjectClassNode.executeUncached(self))); @@ -948,158 +911,83 @@ Object doGeneric(VirtualFrame frame, PDeque self, @Cached PyObjectGetIter getIter, @Cached PyObjectGetStateNode getStateNode, @Cached GetClassNode getClassNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { Object clazz = getClassNode.execute(inliningTarget, self); Object state = getStateNode.execute(frame, inliningTarget, self); Object it = getIter.execute(frame, inliningTarget, self); - PTuple emptyTuple = factory.createEmptyTuple(); + PTuple emptyTuple = PFactory.createEmptyTuple(language); int maxLength = self.getMaxLength(); if (maxLength != -1) { - return factory.createTuple(new Object[]{clazz, factory.createTuple(new Object[]{emptyTuple, maxLength}), state, it}); + return PFactory.createTuple(language, new Object[]{clazz, PFactory.createTuple(language, new Object[]{emptyTuple, maxLength}), state, it}); } - return factory.createTuple(new Object[]{clazz, emptyTuple, state, it}); + return PFactory.createTuple(language, new Object[]{clazz, emptyTuple, state, it}); } } - @GenerateInline - @GenerateCached(false) - public abstract static class DequeCompareHelperNode extends Node { - - abstract Object execute(VirtualFrame frame, Node inliningTarget, Object self, Object other, ComparisonOp op, PyObjectRichCompareBool.ComparisonBaseNode cmpNode); - - @Specialization(guards = {"self == other", "op.isEqualityOp()"}) + @Slot(value = SlotKind.tp_richcompare, isComplex = true) + @GenerateNodeFactory + public abstract static class DequeRichCmpNode extends TpSlotRichCompare.RichCmpBuiltinNode { + @Specialization(guards = {"self == other", "op.isEqOrNe()"}) @SuppressWarnings("unused") - static boolean doSame(PDeque self, PDeque other, ComparisonOp op, PyObjectRichCompareBool.ComparisonBaseNode cmpNode) { - return op == ComparisonOp.EQ; + static boolean doSame(PDeque self, PDeque other, RichCmpOp op) { + return op == RichCmpOp.Py_EQ; } - @Specialization(guards = {"self.getSize() != other.getSize()", "op.isEqualityOp()"}) + @Specialization(guards = {"self.getSize() != other.getSize()", "op.isEqOrNe()"}) @SuppressWarnings("unused") - static boolean doDifferentLengths(PDeque self, PDeque other, ComparisonOp op, PyObjectRichCompareBool.ComparisonBaseNode cmpNode) { - return op == ComparisonOp.NE; + static boolean doDifferentLengths(PDeque self, PDeque other, RichCmpOp op) { + return op == RichCmpOp.Py_NE; } @Specialization(guards = "!isPDeque(self) || !isPDeque(other)") @SuppressWarnings("unused") - static Object doOther(Object self, Object other, ComparisonOp op, PyObjectRichCompareBool.ComparisonBaseNode cmpNode) { + static Object doOther(Object self, Object other, RichCmpOp op) { return PNotImplemented.NOT_IMPLEMENTED; } @Specialization(guards = "isGenericCase(self, other, op)") - static Object doGeneric(VirtualFrame frame, Node inliningTarget, PDeque self, PDeque other, @SuppressWarnings("unused") ComparisonOp op, PyObjectRichCompareBool.ComparisonBaseNode cmpNode, + static Object doGeneric(VirtualFrame frame, PDeque self, PDeque other, RichCmpOp op, + @Bind("$node") Node inliningTarget, @Cached PyObjectGetIter getIterSelf, @Cached PyObjectGetIter getIterOther, - @Cached(inline = false) GetNextNode selfItNextNode, - @Cached(inline = false) GetNextNode otherItNextNode, - @Cached PyObjectRichCompareBool.EqNode eqNode, - @Cached IsBuiltinObjectProfile profile) { + @Cached PyIterNextNode selfItNextNode, + @Cached PyIterNextNode otherItNextNode, + @Cached PyObjectRichCompareBool eqNode, + @Cached PyObjectRichCompareBool cmpNode) { Object ait = getIterSelf.execute(frame, inliningTarget, self); Object bit = getIterOther.execute(frame, inliningTarget, other); while (true) { + Object selfItem, otherItem; try { - Object selfItem = selfItNextNode.execute(frame, ait); - Object otherItem = otherItNextNode.execute(frame, bit); - if (!eqNode.compare(frame, inliningTarget, selfItem, otherItem)) { - return cmpNode.compare(frame, inliningTarget, selfItem, otherItem); - } - } catch (PException e) { - e.expect(inliningTarget, StopIteration, profile); - return cmpNode.compare(frame, inliningTarget, self.getSize(), other.getSize()); + selfItem = selfItNextNode.execute(frame, inliningTarget, ait); + otherItem = otherItNextNode.execute(frame, inliningTarget, bit); + } catch (IteratorExhausted e) { + break; + } + if (!eqNode.execute(frame, inliningTarget, selfItem, otherItem, RichCmpOp.Py_EQ)) { + return cmpNode.execute(frame, inliningTarget, selfItem, otherItem, op); } } + return cmpNode.execute(frame, inliningTarget, self.getSize(), other.getSize(), op); } static boolean isPDeque(Object object) { return object instanceof PDeque; } - static boolean isGenericCase(PDeque self, PDeque other, ComparisonOp op) { - return !op.isEqualityOp() || (self != other && self.getSize() == other.getSize()); - } - } - - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class DequeEqNode extends PythonBinaryBuiltinNode { - @Specialization - static Object doCmp(VirtualFrame frame, Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached DequeCompareHelperNode helperNode, - @Cached PyObjectRichCompareBool.EqNode cmpNode) { - return helperNode.execute(frame, inliningTarget, self, other, ComparisonOp.EQ, cmpNode); - } - } - - @Builtin(name = J___NE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class DequeNeNode extends PythonBinaryBuiltinNode { - @Specialization - static Object doCmp(VirtualFrame frame, Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached DequeCompareHelperNode helperNode, - @Cached PyObjectRichCompareBool.NeNode cmpNode) { - return helperNode.execute(frame, inliningTarget, self, other, ComparisonOp.NE, cmpNode); - } - } - - @Builtin(name = J___LE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class DequeLeNode extends PythonBinaryBuiltinNode { - @Specialization - static Object doCmp(VirtualFrame frame, Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached DequeCompareHelperNode helperNode, - @Cached PyObjectRichCompareBool.LeNode cmpNode) { - return helperNode.execute(frame, inliningTarget, self, other, ComparisonOp.LE, cmpNode); + static boolean isGenericCase(PDeque self, PDeque other, RichCmpOp op) { + return !op.isEqOrNe() || (self != other && self.getSize() == other.getSize()); } } - @Builtin(name = J___LT__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class DequeLtNode extends PythonBinaryBuiltinNode { - @Specialization - static Object doCmp(VirtualFrame frame, Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached DequeCompareHelperNode helperNode, - @Cached PyObjectRichCompareBool.LtNode cmpNode) { - return helperNode.execute(frame, inliningTarget, self, other, ComparisonOp.LT, cmpNode); - } - } - - @Builtin(name = J___GE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class DequeGeNode extends PythonBinaryBuiltinNode { - @Specialization - static Object doCmp(VirtualFrame frame, Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached DequeCompareHelperNode helperNode, - @Cached PyObjectRichCompareBool.GeNode cmpNode) { - return helperNode.execute(frame, inliningTarget, self, other, ComparisonOp.GE, cmpNode); - } - - } - - @Builtin(name = J___GT__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class DequeGtNode extends PythonBinaryBuiltinNode { - @Specialization - static Object doCmp(VirtualFrame frame, Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached DequeCompareHelperNode helperNode, - @Cached PyObjectRichCompareBool.GtNode cmpNode) { - return helperNode.execute(frame, inliningTarget, self, other, ComparisonOp.GT, cmpNode); - } - - } - @Builtin(name = J___CLASS_GETITEM__, minNumOfPositionalArgs = 2, isClassmethod = true) @GenerateNodeFactory public abstract static class ClassGetItemNode extends PythonBinaryBuiltinNode { @Specialization static Object classGetItem(Object cls, Object key, - @Cached PythonObjectFactory factory) { - return factory.createGenericAlias(cls, key); + @Bind PythonLanguage language) { + return PFactory.createGenericAlias(language, cls, key); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/deque/DequeIterBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/deque/DequeIterBuiltins.java index 66e8f2e586..fbe1d7ac6a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/deque/DequeIterBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/deque/DequeIterBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,106 +40,71 @@ */ package com.oracle.graal.python.builtins.objects.deque; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.RuntimeError; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LENGTH_HINT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; +import static com.oracle.graal.python.nodes.BuiltinNames.J_DEQUE_ITER; -import java.util.ConcurrentModificationException; import java.util.List; -import java.util.NoSuchElementException; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.lib.PyNumberIndexNode; +import com.oracle.graal.python.nodes.BuiltinNames; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; +import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; -@CoreFunctions(extendClasses = {PythonBuiltinClassType.PDequeIter, PythonBuiltinClassType.PDequeRevIter}) +@CoreFunctions(extendClasses = PythonBuiltinClassType.PDequeIter) public final class DequeIterBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = DequeIterBuiltinsSlotsGen.SLOTS; @Override protected List> getNodeFactories() { return DequeIterBuiltinsFactory.getFactories(); } - // _deque_iterator.__iter__() - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_DEQUE_ITER, minNumOfPositionalArgs = 2, parameterNames = {"$self", "iterable", "index"}) @GenerateNodeFactory - public abstract static class DequeIterIterNode extends PythonUnaryBuiltinNode { + public abstract static class DequeIterNode extends PythonTernaryBuiltinNode { @Specialization - static PDequeIter doGeneric(PDequeIter self) { - return self; - } - } - - // _deque_iterator.__next__() - @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1) - @GenerateNodeFactory - public abstract static class DequeIterNextNode extends PythonUnaryBuiltinNode { - - public abstract Object execute(PDequeIter self); - - @Specialization - @TruffleBoundary - Object doGeneric(PDequeIter self) { - try { - if (self.startState == self.deque.getState()) { - if (!self.hasNext()) { - assert self.lengthHint() == 0; - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.StopIteration); - } - return self.next(); + static PDequeIter doGeneric(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object deque, Object indexObj, + @Bind("this") Node inliningTarget, + @Cached InlinedConditionProfile dequeProfile, + @Cached InlinedConditionProfile indexNoneProfile, + @Cached PyNumberIndexNode toIndexNode, + @Cached CastToJavaIntExactNode castToJavaIntExactNode, + @Cached DequeIterCommonBuiltins.DequeIterNextNode getNextNode, + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { + if (!dequeProfile.profile(inliningTarget, deque instanceof PDeque)) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.EXPECTED_OBJ_TYPE_S_GOT_P, BuiltinNames.T_DEQUE, deque); + } + PDequeIter dequeIter = PFactory.createDequeIter(language, (PDeque) deque); + if (indexNoneProfile.profile(inliningTarget, indexObj != PNone.NO_VALUE)) { + int index = castToJavaIntExactNode.execute(inliningTarget, toIndexNode.execute(frame, inliningTarget, indexObj)); + for (int i = 0; i < index; i++) { + getNextNode.execute(dequeIter); } - } catch (NoSuchElementException e) { - throw CompilerDirectives.shouldNotReachHere(); - } catch (ConcurrentModificationException e) { - // fall through } - self.reset(); - throw PRaiseNode.raiseUncached(this, RuntimeError, ErrorMessages.DEQUE_MUTATED_DURING_ITERATION); - } - } - - // _deque_iterator.__length_hint__() - @Builtin(name = J___LENGTH_HINT__, minNumOfPositionalArgs = 1) - @GenerateNodeFactory - public abstract static class DequeIterLengthHintNode extends PythonUnaryBuiltinNode { - - @Specialization - static int doGeneric(PDequeIter self) { - return self.lengthHint(); - } - } - - // _deque_iterator.__reduce__() - @Builtin(name = J___REDUCE__, minNumOfPositionalArgs = 1) - @GenerateNodeFactory - public abstract static class DequeIterReduceNode extends PythonUnaryBuiltinNode { - - @Specialization - static PTuple doGeneric(PDequeIter self, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached PythonObjectFactory factory) { - Object clazz = getClassNode.execute(inliningTarget, self); - return factory.createTuple(new Object[]{clazz, factory.createTuple(new Object[]{self.deque, self.deque.getSize() - self.lengthHint()})}); + return dequeIter; } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/deque/DequeIterCommonBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/deque/DequeIterCommonBuiltins.java new file mode 100644 index 0000000000..32012e8ab8 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/deque/DequeIterCommonBuiltins.java @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.builtins.objects.deque; + +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.RuntimeError; +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LENGTH_HINT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; + +import java.util.ConcurrentModificationException; +import java.util.List; +import java.util.NoSuchElementException; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.builtins.CoreFunctions; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; + +@CoreFunctions(extendClasses = {PythonBuiltinClassType.PDequeIter, PythonBuiltinClassType.PDequeRevIter}) +public final class DequeIterCommonBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = DequeIterCommonBuiltinsSlotsGen.SLOTS; + + @Override + protected List> getNodeFactories() { + return DequeIterCommonBuiltinsFactory.getFactories(); + } + + // _deque_iterator.__iter__() + @Slot(value = SlotKind.tp_iter, isComplex = true) + @GenerateNodeFactory + public abstract static class DequeIterIterNode extends PythonUnaryBuiltinNode { + + @Specialization + static PDequeIter doGeneric(PDequeIter self) { + return self; + } + } + + // _deque_iterator.__next__() + @Slot(value = SlotKind.tp_iternext, isComplex = true) + @GenerateNodeFactory + public abstract static class DequeIterNextNode extends TpIterNextBuiltin { + + public abstract Object execute(PDequeIter self); + + @Specialization + @TruffleBoundary + Object doGeneric(PDequeIter self) { + try { + if (self.startState == self.deque.getState()) { + if (!self.hasNext()) { + assert self.lengthHint() == 0; + throw iteratorExhausted(); + } + return self.next(); + } + } catch (NoSuchElementException e) { + throw CompilerDirectives.shouldNotReachHere(); + } catch (ConcurrentModificationException e) { + // fall through + } + self.reset(); + throw PRaiseNode.raiseStatic(this, RuntimeError, ErrorMessages.DEQUE_MUTATED_DURING_ITERATION); + } + } + + // _deque_iterator.__length_hint__() + @Builtin(name = J___LENGTH_HINT__, minNumOfPositionalArgs = 1) + @GenerateNodeFactory + public abstract static class DequeIterLengthHintNode extends PythonUnaryBuiltinNode { + + @Specialization + static int doGeneric(PDequeIter self) { + return self.lengthHint(); + } + } + + // _deque_iterator.__reduce__() + @Builtin(name = J___REDUCE__, minNumOfPositionalArgs = 1) + @GenerateNodeFactory + public abstract static class DequeIterReduceNode extends PythonUnaryBuiltinNode { + + @Specialization + static PTuple doGeneric(PDequeIter self, + @Bind("this") Node inliningTarget, + @Cached GetClassNode getClassNode, + @Bind PythonLanguage language) { + Object clazz = getClassNode.execute(inliningTarget, self); + return PFactory.createTuple(language, new Object[]{clazz, PFactory.createTuple(language, new Object[]{self.deque, self.deque.getSize() - self.lengthHint()})}); + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/deque/DequeRevIterBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/deque/DequeRevIterBuiltins.java new file mode 100644 index 0000000000..bd9261862e --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/deque/DequeRevIterBuiltins.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.builtins.objects.deque; + +import static com.oracle.graal.python.nodes.BuiltinNames.J_DEQUE_REV_ITER; + +import java.util.List; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; +import com.oracle.graal.python.builtins.CoreFunctions; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.lib.PyNumberIndexNode; +import com.oracle.graal.python.nodes.BuiltinNames; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; +import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; + +@CoreFunctions(extendClasses = PythonBuiltinClassType.PDequeRevIter) +public class DequeRevIterBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = DequeRevIterBuiltinsSlotsGen.SLOTS; + + @Override + protected List> getNodeFactories() { + return DequeRevIterBuiltinsFactory.getFactories(); + } + + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_DEQUE_REV_ITER, minNumOfPositionalArgs = 2, parameterNames = {"$self", "iterable", "index"}) + @GenerateNodeFactory + public abstract static class DequeRevIterNode extends PythonTernaryBuiltinNode { + @Specialization + static PDequeIter doGeneric(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object deque, Object indexObj, + @Bind("this") Node inliningTarget, + @Cached InlinedConditionProfile dequeProfile, + @Cached InlinedConditionProfile indexNoneProfile, + @Cached PyNumberIndexNode toIndexNode, + @Cached CastToJavaIntExactNode castToJavaIntExactNode, + @Cached DequeIterCommonBuiltins.DequeIterNextNode getNextNode, + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { + if (!dequeProfile.profile(inliningTarget, deque instanceof PDeque)) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.EXPECTED_OBJ_TYPE_S_GOT_P, BuiltinNames.T_DEQUE, deque); + } + PDequeIter dequeIter = PFactory.createDequeRevIter(language, (PDeque) deque); + if (indexNoneProfile.profile(inliningTarget, indexObj != PNone.NO_VALUE)) { + int index = castToJavaIntExactNode.execute(inliningTarget, toIndexNode.execute(frame, inliningTarget, indexObj)); + for (int i = 0; i < index; i++) { + getNextNode.execute(dequeIter); + } + } + return dequeIter; + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DefaultDictBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DefaultDictBuiltins.java index ff61967cc8..1c0de526dd 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DefaultDictBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DefaultDictBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,16 +41,17 @@ package com.oracle.graal.python.builtins.objects.dict; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; +import static com.oracle.graal.python.nodes.BuiltinNames.J_DEFAULTDICT; import static com.oracle.graal.python.nodes.ErrorMessages.FIRST_ARG_MUST_BE_CALLABLE_S; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___MISSING__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROR__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -61,7 +62,9 @@ import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode; import com.oracle.graal.python.lib.PyCallableCheckNode; import com.oracle.graal.python.lib.PyDictSetItem; import com.oracle.graal.python.lib.PyObjectGetIter; @@ -69,11 +72,11 @@ import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -88,12 +91,27 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PDefaultDict) public final class DefaultDictBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = DefaultDictBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return DefaultDictBuiltinsFactory.getFactories(); } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_DEFAULTDICT, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class DefaultDictNode extends PythonVarargsBuiltinNode { + @Specialization + @SuppressWarnings("unused") + PDefaultDict doGeneric(Object cls, Object[] args, PKeyword[] kwargs, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createDefaultDict(language, cls, getInstanceShape.execute(cls)); + } + } + + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization @@ -120,11 +138,11 @@ static Object reduce(VirtualFrame frame, PDefaultDict self, @Bind("this") Node inliningTarget, @Cached GetClassNode getClassNode, @Cached PyObjectGetIter getIter, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { final Object defaultFactory = self.getDefaultFactory(); - PTuple args = (defaultFactory == PNone.NONE) ? factory.createEmptyTuple() : factory.createTuple(new Object[]{defaultFactory}); - Object iter = getIter.execute(frame, inliningTarget, factory.createDictItemsView(self)); - return factory.createTuple(new Object[]{getClassNode.execute(inliningTarget, self), args, PNone.NONE, PNone.NONE, iter}); + PTuple args = (defaultFactory == PNone.NONE) ? PFactory.createEmptyTuple(language) : PFactory.createTuple(language, new Object[]{defaultFactory}); + Object iter = getIter.execute(frame, inliningTarget, PFactory.createDictItemsView(language, self)); + return PFactory.createTuple(language, new Object[]{getClassNode.execute(inliningTarget, self), args, PNone.NONE, PNone.NONE, iter}); } } @@ -136,8 +154,8 @@ public abstract static class CopyNode extends PythonUnaryBuiltinNode { static PDefaultDict copy(@SuppressWarnings("unused") VirtualFrame frame, PDefaultDict self, @Bind("this") Node inliningTarget, @Cached HashingStorageCopy copyNode, - @Cached PythonObjectFactory factory) { - return factory.createDefaultDict(self.getDefaultFactory(), copyNode.execute(inliningTarget, self.getDictStorage())); + @Bind PythonLanguage language) { + return PFactory.createDefaultDict(language, self.getDefaultFactory(), copyNode.execute(inliningTarget, self.getDictStorage())); } } @@ -146,9 +164,8 @@ static PDefaultDict copy(@SuppressWarnings("unused") VirtualFrame frame, PDefaul public abstract static class MissingNode extends PythonBinaryBuiltinNode { @Specialization(guards = "isNone(self.getDefaultFactory())") static Object doNoFactory(@SuppressWarnings("unused") PDefaultDict self, Object key, - @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.KeyError, new Object[]{key}); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.KeyError, new Object[]{key}); } @Specialization(guards = "!isNone(self.getDefaultFactory())") @@ -162,21 +179,22 @@ static Object doMissing(VirtualFrame frame, PDefaultDict self, Object key, } } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "defaultdict", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory - public abstract static class InitNode extends PythonBuiltinNode { + public abstract static class InitNode extends PythonVarargsBuiltinNode { @Specialization static Object doInit(VirtualFrame frame, PDefaultDict self, Object[] args, PKeyword[] kwargs, @Bind("this") Node inliningTarget, @Cached DictBuiltins.InitNode dictInitNode, @Cached PyCallableCheckNode callableCheckNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object[] newArgs = args; Object newDefault = PNone.NONE; if (newArgs.length > 0) { newDefault = newArgs[0]; if (newDefault != PNone.NONE && !callableCheckNode.execute(inliningTarget, newDefault)) { - throw raiseNode.get(inliningTarget).raise(TypeError, FIRST_ARG_MUST_BE_CALLABLE_S, " or None"); + throw raiseNode.raise(inliningTarget, TypeError, FIRST_ARG_MUST_BE_CALLABLE_S, " or None"); } newArgs = PythonUtils.arrayCopyOfRange(args, 1, args.length); } @@ -202,17 +220,16 @@ Object get(PDefaultDict self, @SuppressWarnings("unused") PNone value) { } } - @Builtin(name = J___OR__, minNumOfPositionalArgs = 2) - @Builtin(name = J___ROR__, minNumOfPositionalArgs = 2, reverseOperation = true) + @Slot(value = SlotKind.nb_or, isComplex = true) @GenerateNodeFactory - abstract static class OrNode extends PythonBinaryBuiltinNode { + abstract static class OrNode extends BinaryOpBuiltinNode { @Specialization static Object or(VirtualFrame frame, PDict self, PDict other, @Bind("this") Node inliningTarget, @Cached GetClassNode getClassNode, @Cached CallNode callNode, @Cached DictNodes.UpdateNode updateNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { PDefaultDict dd = (PDefaultDict) (self instanceof PDefaultDict ? self : other); Object type = getClassNode.execute(inliningTarget, dd); Object result = callNode.execute(frame, type, dd.getDefaultFactory(), self); @@ -221,7 +238,7 @@ static Object or(VirtualFrame frame, PDict self, PDict other, return result; } else { /* Cpython doesn't check for this and ends up with SystemError */ - throw raiseNode.get(inliningTarget).raise(TypeError); + throw raiseNode.raise(inliningTarget, TypeError); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictBuiltins.java index feb5b88c81..3343033f36 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -26,29 +26,23 @@ package com.oracle.graal.python.builtins.objects.dict; import static com.oracle.graal.python.builtins.objects.PNone.NO_VALUE; +import static com.oracle.graal.python.nodes.BuiltinNames.J_DICT; import static com.oracle.graal.python.nodes.SpecialMethodNames.J_ITEMS; import static com.oracle.graal.python.nodes.SpecialMethodNames.J_KEYS; import static com.oracle.graal.python.nodes.SpecialMethodNames.J_VALUES; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CLASS_GETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CONTAINS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DELITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REVERSED__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___HASH__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.KeyError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.HashNotImplemented; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -56,6 +50,8 @@ import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.common.EmptyStorage; +import com.oracle.graal.python.builtins.objects.common.ForeignHashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes; import com.oracle.graal.python.builtins.objects.common.HashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageAddAllToOther; @@ -70,21 +66,30 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStoragePop; import com.oracle.graal.python.builtins.objects.dict.DictBuiltinsFactory.DispatchMissingNodeGen; import com.oracle.graal.python.builtins.objects.function.PKeyword; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.MpSubscriptBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotMpAssSubscript.MpAssSubscriptBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare.RichCmpBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqContains.SqContainsBuiltinNode; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyDictCheckNode; import com.oracle.graal.python.lib.PyDictSetDefault; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyObjectGetIter; +import com.oracle.graal.python.lib.PyObjectSetItem; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.SpecialMethodNames; import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.call.special.CallTernaryMethodNode; import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; +import com.oracle.graal.python.nodes.call.special.SpecialMethodNotFound; +import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; @@ -93,14 +98,12 @@ import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateInline; @@ -110,16 +113,22 @@ import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.object.Shape; import com.oracle.truffle.api.profiles.InlinedConditionProfile; -@CoreFunctions(extendClasses = {PythonBuiltinClassType.PDict, PythonBuiltinClassType.PDefaultDict}) +/** + * NOTE: self can either be a PDict or a foreign dict (hasHashEntries()). + * {@link DictNodes.GetDictStorageNode} should be used to get the {@link HashingStorage} and to get + * a proper error and not allow other objects as arguments. + */ +@CoreFunctions(extendClasses = PythonBuiltinClassType.PDict) +@HashNotImplemented public final class DictBuiltins extends PythonBuiltins { public static final TpSlots SLOTS = DictBuiltinsSlotsGen.SLOTS; @Override public void initialize(Python3Core core) { super.initialize(core); - addBuiltinConstant(T___HASH__, PNone.NONE); } @Override @@ -127,7 +136,42 @@ protected List 0"}) - Object doKeywords(VirtualFrame frame, PDict self, @SuppressWarnings("unused") Object[] args, PKeyword[] kwargs, + Object doKeywords(VirtualFrame frame, Object self, @SuppressWarnings("unused") Object[] args, PKeyword[] kwargs, @Bind("this") Node inliningTarget, - @Shared("addAllToOther") @Cached HashingStorageAddAllToOther addAllToOtherNode) { - addAllToOtherNode.execute(frame, inliningTarget, getInitNode().execute(frame, NO_VALUE, kwargs), self); + @Shared @Cached DictNodes.GetDictStorageNode getStorageNode, + @Shared @Cached DictNodes.UpdateDictStorageNode updateDictStorageNode, + @Shared @Cached HashingStorageAddAllToOther addAllToOtherNode) { + HashingStorage add = getInitNode().execute(frame, NO_VALUE, kwargs); + var storage = getStorageNode.execute(inliningTarget, self); + var newStorage = addAllToOtherNode.execute(frame, inliningTarget, add, storage); + updateDictStorageNode.execute(inliningTarget, self, storage, newStorage); return PNone.NONE; } @SuppressWarnings("unused") @Specialization(guards = {"args.length == 0", "kwargs.length == 0"}) - static Object doEmpty(PDict self, Object[] args, PKeyword[] kwargs) { + static Object doEmpty(Object self, Object[] args, PKeyword[] kwargs) { return PNone.NONE; } @Specialization(guards = "args.length > 1") - Object doGeneric(@SuppressWarnings("unused") PDict self, Object[] args, @SuppressWarnings("unused") PKeyword[] kwargs) { - throw raise(TypeError, ErrorMessages.EXPECTED_AT_MOST_D_ARGS_GOT_D, "dict", 1, args.length); + Object doGeneric(@SuppressWarnings("unused") Object self, Object[] args, @SuppressWarnings("unused") PKeyword[] kwargs) { + throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.EXPECTED_AT_MOST_D_ARGS_GOT_D, "dict", 1, args.length); } } @@ -175,7 +229,7 @@ Object doGeneric(@SuppressWarnings("unused") PDict self, Object[] args, @Suppres abstract static class SetDefaultNode extends PythonTernaryClinicBuiltinNode { @Specialization - Object doIt(VirtualFrame frame, PDict dict, Object key, Object defaultValue, + Object doIt(VirtualFrame frame, Object dict, Object key, Object defaultValue, @Bind("this") Node inliningTarget, @Cached PyDictSetDefault setDefault) { return setDefault.execute(frame, inliningTarget, dict, key, defaultValue); @@ -192,17 +246,19 @@ protected ArgumentClinicProvider getArgumentClinic() { @GenerateNodeFactory public abstract static class PopNode extends PythonTernaryBuiltinNode { @Specialization - static Object popDefault(VirtualFrame frame, PDict dict, Object key, Object defaultValue, + static Object popDefault(VirtualFrame frame, Object dict, Object key, Object defaultValue, @Bind("this") Node inliningTarget, + @Cached DictNodes.GetDictStorageNode getStorageNode, @Cached InlinedConditionProfile hasKeyProfile, @Cached HashingStorageDelItem delItem, - @Cached PRaiseNode.Lazy raiseNode) { - Object retVal = delItem.executePop(frame, inliningTarget, dict.getDictStorage(), key, dict); + @Cached PRaiseNode raiseNode) { + var storage = getStorageNode.execute(inliningTarget, dict); + Object retVal = delItem.executePop(frame, inliningTarget, storage, key, dict); if (hasKeyProfile.profile(inliningTarget, retVal != null)) { return retVal; } else { if (PGuards.isNoValue(defaultValue)) { - throw raiseNode.get(inliningTarget).raise(KeyError, new Object[]{key}); + throw raiseNode.raise(inliningTarget, KeyError, new Object[]{key}); } else { return defaultValue; } @@ -216,16 +272,18 @@ static Object popDefault(VirtualFrame frame, PDict dict, Object key, Object defa public abstract static class PopItemNode extends PythonUnaryBuiltinNode { @Specialization - static Object popItem(PDict dict, + static Object popItem(Object dict, @Bind("this") Node inliningTarget, + @Cached DictNodes.GetDictStorageNode getStorageNode, @Cached HashingStoragePop popNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - Object[] result = popNode.execute(inliningTarget, dict.getDictStorage(), dict); + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { + var storage = getStorageNode.execute(inliningTarget, dict); + Object[] result = popNode.execute(inliningTarget, storage, dict); if (result == null) { - throw raiseNode.get(inliningTarget).raise(KeyError, ErrorMessages.IS_EMPTY, "popitem(): dictionary"); + throw raiseNode.raise(inliningTarget, KeyError, ErrorMessages.IS_EMPTY, "popitem(): dictionary"); } - return factory.createTuple(result); + return PFactory.createTuple(language, result); } } @@ -235,9 +293,15 @@ static Object popItem(PDict dict, public abstract static class KeysNode extends PythonUnaryBuiltinNode { @Specialization - PDictView keys(PDict self, - @Cached PythonObjectFactory factory) { - return factory.createDictKeysView(self); + static PDictView keys(PDict self, + @Bind PythonLanguage language) { + return PFactory.createDictKeysView(language, self); + } + + @Fallback + static PDictView foreign(Object self, + @Bind PythonLanguage language) { + return PFactory.createDictKeysView(language, self, new ForeignHashingStorage(self)); } } @@ -248,8 +312,14 @@ public abstract static class ItemsNode extends PythonUnaryBuiltinNode { @Specialization static PDictView items(PDict self, - @Cached PythonObjectFactory factory) { - return factory.createDictItemsView(self); + @Bind PythonLanguage language) { + return PFactory.createDictItemsView(language, self); + } + + @Fallback + static PDictView foreign(Object self, + @Bind PythonLanguage language) { + return PFactory.createDictItemsView(language, self, new ForeignHashingStorage(self)); } } @@ -258,10 +328,12 @@ static PDictView items(PDict self, @GenerateNodeFactory public abstract static class GetNode extends PythonTernaryBuiltinNode { @Specialization - static Object doWithDefault(VirtualFrame frame, PDict self, Object key, Object defaultValue, + static Object doWithDefault(VirtualFrame frame, Object self, Object key, Object defaultValue, @Bind("this") Node inliningTarget, + @Cached DictNodes.GetDictStorageNode getStorageNode, @Cached HashingStorageGetItem getItem) { - final Object value = getItem.execute(frame, inliningTarget, self.getDictStorage(), key); + var storage = getStorageNode.execute(inliningTarget, self); + final Object value = getItem.execute(frame, inliningTarget, storage, key); return value != null ? value : (defaultValue == PNone.NO_VALUE ? PNone.NONE : defaultValue); } } @@ -272,32 +344,34 @@ public abstract static class GetItemNode extends MpSubscriptBuiltinNode { @Child private DispatchMissingNode missing; @Specialization - Object getItem(VirtualFrame frame, PDict self, Object key, + Object getItem(VirtualFrame frame, Object self, Object key, @Bind("this") Node inliningTarget, + @Cached DictNodes.GetDictStorageNode getStorageNode, @Cached InlinedConditionProfile notFoundProfile, @Cached HashingStorageGetItem getItem, @Cached PRaiseNode raiseNode) { - final Object result = getItem.execute(frame, inliningTarget, self.getDictStorage(), key); + var storage = getStorageNode.execute(inliningTarget, self); + final Object result = getItem.execute(frame, inliningTarget, storage, key); if (notFoundProfile.profile(inliningTarget, result == null)) { - return handleMissing(frame, self, key, raiseNode); + return handleMissing(frame, inliningTarget, self, key, raiseNode); } return result; } @InliningCutoff - private Object handleMissing(VirtualFrame frame, PDict self, Object key, PRaiseNode raiseNode) { - if (!PGuards.isBuiltinDict(self)) { + private Object handleMissing(VirtualFrame frame, Node inliningTarget, Object self, Object key, PRaiseNode raiseNode) { + if (self instanceof PDict dict && !PGuards.isBuiltinDict(dict)) { if (missing == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); missing = insert(DispatchMissingNodeGen.create()); } - return missing.execute(frame, self, key); + return missing.execute(frame, dict, key); } - throw raiseNode.raise(KeyError, new Object[]{key}); + throw raiseNode.raise(inliningTarget, KeyError, new Object[]{key}); } } - @ImportStatic(SpecialMethodSlot.class) + @ImportStatic(SpecialMethodNames.class) @GenerateInline(false) // not inlining this node since GetItemNode prefers lazy creation protected abstract static class DispatchMissingNode extends Node { @@ -306,55 +380,51 @@ protected abstract static class DispatchMissingNode extends Node { @Specialization static Object missing(VirtualFrame frame, Object self, Object key, @Bind("this") Node inliningTarget, - @Cached("create(Missing)") LookupAndCallBinaryNode callMissing, - @Cached PRaiseNode.Lazy raiseNode) { - Object result = callMissing.executeObject(frame, self, key); - if (result == PNotImplemented.NOT_IMPLEMENTED) { - throw raiseNode.get(inliningTarget).raise(KeyError, new Object[]{key}); + @Cached("create(T___MISSING__)") LookupAndCallBinaryNode callMissing, + @Cached PRaiseNode raiseNode) { + try { + return callMissing.executeObject(frame, self, key); + } catch (SpecialMethodNotFound ignored) { + throw raiseNode.raise(inliningTarget, KeyError, new Object[]{key}); } - return result; } } - @Builtin(name = J___SETITEM__, minNumOfPositionalArgs = 3) + @Slot(value = SlotKind.mp_ass_subscript, isComplex = true) @GenerateNodeFactory - public abstract static class SetItemNode extends PythonTernaryBuiltinNode { - @Specialization - static Object run(VirtualFrame frame, PDict self, Object key, Object value, + abstract static class SetItemNode extends MpAssSubscriptBuiltinNode { + @Specialization(guards = "!isNoValue(value)") + static void run(VirtualFrame frame, Object self, Object key, Object value, @Bind("this") Node inliningTarget, @Cached HashingCollectionNodes.SetItemNode setItemNode) { setItemNode.execute(frame, inliningTarget, self, key, value); - return PNone.NONE; } - } - @Builtin(name = J___DELITEM__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class DelItemNode extends PythonBinaryBuiltinNode { - @Specialization - static Object run(VirtualFrame frame, PDict self, Object key, + @Specialization(guards = "isNoValue(value)") + static void run(VirtualFrame frame, Object self, Object key, @SuppressWarnings("unused") Object value, @Bind("this") Node inliningTarget, + @Cached DictNodes.GetDictStorageNode getStorageNode, @Cached HashingStorageDelItem delItem, - @Cached PRaiseNode.Lazy raiseNode) { - Object found = delItem.executePop(frame, inliningTarget, self.getDictStorage(), key, self); - if (found != null) { - return PNone.NONE; + @Cached PRaiseNode raiseNode) { + var storage = getStorageNode.execute(inliningTarget, self); + if (!delItem.execute(frame, inliningTarget, storage, key, self)) { + throw raiseNode.raise(inliningTarget, KeyError, new Object[]{key}); } - throw raiseNode.get(inliningTarget).raise(KeyError, new Object[]{key}); } } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory public abstract static class IterNode extends PythonUnaryBuiltinNode { @Specialization - static Object run(@SuppressWarnings("unused") PDict self, + static Object run(Object self, @Bind("this") Node inliningTarget, + @Cached DictNodes.GetDictStorageNode getStorageNode, @Cached HashingStorageLen lenNode, @Cached HashingStorageGetIterator getIterator, - @Cached PythonObjectFactory factory) { - HashingStorage dictStorage = self.getDictStorage(); - return factory.createDictKeyIterator(getIterator.execute(inliningTarget, dictStorage), dictStorage, lenNode.execute(inliningTarget, dictStorage)); + @Bind PythonLanguage language) { + var storage = getStorageNode.execute(inliningTarget, self); + return PFactory.createDictKeyIterator(language, getIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage)); } } @@ -362,43 +432,55 @@ static Object run(@SuppressWarnings("unused") PDict self, @GenerateNodeFactory public abstract static class ReversedNode extends PythonUnaryBuiltinNode { @Specialization - static Object run(PDict self, + static Object run(Object self, @Bind("this") Node inliningTarget, + @Cached DictNodes.GetDictStorageNode getStorageNode, @Cached HashingStorageLen lenNode, @Cached HashingStorageGetReverseIterator getReverseIterator, - @Cached PythonObjectFactory factory) { - HashingStorage storage = self.getDictStorage(); - return factory.createDictKeyIterator(getReverseIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage)); + @Bind PythonLanguage language) { + var storage = getStorageNode.execute(inliningTarget, self); + return PFactory.createDictKeyIterator(language, getReverseIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage)); } } - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.tp_richcompare, isComplex = true) @GenerateNodeFactory - public abstract static class EqNode extends PythonBinaryBuiltinNode { + public abstract static class EqNode extends RichCmpBuiltinNode { - @Specialization - static Object doDictDict(VirtualFrame frame, PDict self, PDict other, + @Specialization(guards = "op.isEqOrNe()") + static Object doDictDict(VirtualFrame frame, PDict self, PDict other, RichCmpOp op, @Bind("this") Node inliningTarget, - @Cached HashingStorageEq eqNode) { - return eqNode.execute(frame, inliningTarget, self.getDictStorage(), other.getDictStorage()); + @Exclusive @Cached HashingStorageEq eqNode) { + return eqNode.execute(frame, inliningTarget, self.getDictStorage(), other.getDictStorage()) == op.isEq(); } @Fallback - @SuppressWarnings("unused") - static PNotImplemented doGeneric(Object self, Object other) { - return PNotImplemented.NOT_IMPLEMENTED; + static Object doGeneric(VirtualFrame frame, Object self, Object other, RichCmpOp op, + @Bind("this") Node inliningTarget, + @Cached PyDictCheckNode isDictNode, + @Exclusive @Cached HashingStorageEq eqNode, + @Cached DictNodes.GetDictStorageNode getStorageNode) { + if (op.isEqOrNe() && isDictNode.execute(inliningTarget, other)) { + var selfStorage = getStorageNode.execute(inliningTarget, self); + var otherStorage = getStorageNode.execute(inliningTarget, other); + return eqNode.execute(frame, inliningTarget, selfStorage, otherStorage) == op.isEq(); + } else { + return PNotImplemented.NOT_IMPLEMENTED; + } } } - @Builtin(name = J___CONTAINS__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.sq_contains, isComplex = true) @GenerateNodeFactory - public abstract static class ContainsNode extends PythonBinaryBuiltinNode { + public abstract static class ContainsNode extends SqContainsBuiltinNode { @Specialization - static boolean run(VirtualFrame frame, PDict self, Object key, + static boolean run(VirtualFrame frame, Object self, Object key, @Bind("this") Node inliningTarget, + @Cached DictNodes.GetDictStorageNode getStorageNode, @Cached HashingStorageGetItem getItem) { - return getItem.hasKey(frame, inliningTarget, self.getDictStorage(), key); + var storage = getStorageNode.execute(inliningTarget, self); + return getItem.hasKey(frame, inliningTarget, storage, key); } } @@ -407,10 +489,12 @@ static boolean run(VirtualFrame frame, PDict self, Object key, @GenerateNodeFactory public abstract static class LenNode extends LenBuiltinNode { @Specialization - static int len(PDict self, + static int len(Object self, @Bind("this") Node inliningTarget, + @Cached DictNodes.GetDictStorageNode getStorageNode, @Cached HashingStorageLen lenNode) { - return lenNode.execute(inliningTarget, self.getDictStorage()); + var storage = getStorageNode.execute(inliningTarget, self); + return lenNode.execute(inliningTarget, storage); } } @@ -420,11 +504,13 @@ static int len(PDict self, public abstract static class CopyNode extends PythonUnaryBuiltinNode { @Specialization - static PDict copy(@SuppressWarnings("unused") VirtualFrame frame, PDict dict, + static PDict copy(Object dict, @Bind("this") Node inliningTarget, + @Cached DictNodes.GetDictStorageNode getStorageNode, @Cached HashingStorageCopy copyNode, - @Cached PythonObjectFactory factory) { - return factory.createDict(copyNode.execute(inliningTarget, dict.getDictStorage())); + @Bind PythonLanguage language) { + var storage = getStorageNode.execute(inliningTarget, dict); + return PFactory.createDict(language, copyNode.execute(inliningTarget, storage)); } } @@ -434,11 +520,14 @@ static PDict copy(@SuppressWarnings("unused") VirtualFrame frame, PDict dict, public abstract static class ClearNode extends PythonUnaryBuiltinNode { @Specialization - static PNone clear(PDict dict, + static PNone clear(Object dict, @Bind("this") Node inliningTarget, + @Cached DictNodes.GetDictStorageNode getStorageNode, + @Cached DictNodes.UpdateDictStorageNode updateStorageNode, @Cached HashingStorageClear clearNode) { - HashingStorage newStorage = clearNode.execute(inliningTarget, dict.getDictStorage()); - dict.setDictStorage(newStorage); + var storage = getStorageNode.execute(inliningTarget, dict); + HashingStorage newStorage = clearNode.execute(inliningTarget, storage); + updateStorageNode.execute(inliningTarget, dict, storage, newStorage); return PNone.NONE; } } @@ -450,8 +539,14 @@ public abstract static class ValuesNode extends PythonUnaryBuiltinNode { @Specialization static PDictView values(PDict self, - @Cached PythonObjectFactory factory) { - return factory.createDictValuesView(self); + @Bind PythonLanguage language) { + return PFactory.createDictValuesView(language, self); + } + + @Fallback + static PDictView foreign(Object self, + @Bind PythonLanguage language) { + return PFactory.createDictValuesView(language, self, new ForeignHashingStorage(self)); } } @@ -462,63 +557,57 @@ public abstract static class UpdateNode extends PythonBuiltinNode { @SuppressWarnings("unused") @Specialization(guards = {"args.length == 0", "kwargs.length == 0"}) - static Object updateEmpy(VirtualFrame frame, PDict self, Object[] args, PKeyword[] kwargs) { + static Object updateEmpy(VirtualFrame frame, Object self, Object[] args, PKeyword[] kwargs) { return PNone.NONE; } @Specialization(guards = {"args.length == 1", "kwargs.length == 0"}) - static Object update(VirtualFrame frame, PDict self, Object[] args, @SuppressWarnings("unused") PKeyword[] kwargs, + static Object update(VirtualFrame frame, Object self, Object[] args, @SuppressWarnings("unused") PKeyword[] kwargs, @Shared("updateNode") @Cached DictNodes.UpdateNode updateNode) { updateNode.execute(frame, self, args[0]); return PNone.NONE; } - @Specialization(guards = {"args.length == 0", "kwargs.length > 0"}) - static Object update(VirtualFrame frame, PDict self, @SuppressWarnings("unused") Object[] args, PKeyword[] kwargs, - @Bind("this") Node inliningTarget, - @Shared("initNode") @Cached HashingStorage.InitNode initNode, - @Shared("addAllToOther") @Cached HashingStorageAddAllToOther addAllToOtherNode) { - updateKwargs(frame, inliningTarget, self, kwargs, initNode, addAllToOtherNode); - return PNone.NONE; - } - - @Specialization(guards = {"args.length == 1", "kwargs.length > 0"}) - static Object update(VirtualFrame frame, PDict self, Object[] args, PKeyword[] kwargs, + @Specialization(guards = {"args.length <= 1", "kwargs.length > 0"}) + static Object update(VirtualFrame frame, Object self, Object[] args, PKeyword[] kwargs, @Bind("this") Node inliningTarget, + @Cached DictNodes.GetDictStorageNode getStorageNode, + @Cached DictNodes.UpdateDictStorageNode updateDictStorageNode, @Shared("updateNode") @Cached DictNodes.UpdateNode updateNode, - @Shared("initNode") @Cached HashingStorage.InitNode initNode, - @Shared("addAllToOther") @Cached HashingStorageAddAllToOther addAllToOtherNode) { - updateNode.execute(frame, self, args[0]); - updateKwargs(frame, inliningTarget, self, kwargs, initNode, addAllToOtherNode); + @Cached HashingStorage.InitNode initNode, + @Cached HashingStorageAddAllToOther addAllToOtherNode) { + if (args.length > 0) { + updateNode.execute(frame, self, args[0]); + } + HashingStorage kwargsStorage = initNode.execute(frame, NO_VALUE, kwargs); + var storage = getStorageNode.execute(inliningTarget, self); + var newStorage = addAllToOtherNode.execute(frame, inliningTarget, kwargsStorage, storage); + updateDictStorageNode.execute(inliningTarget, self, storage, newStorage); return PNone.NONE; } @Specialization(guards = "args.length > 1") @SuppressWarnings("unused") - static Object error(PDict self, Object[] args, PKeyword[] kwargs, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.EXPECTED_AT_MOST_D_ARGS_GOT_D, "update", 1, args.length); + static Object error(Object self, Object[] args, PKeyword[] kwargs, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.EXPECTED_AT_MOST_D_ARGS_GOT_D, "update", 1, args.length); } - private static void updateKwargs(VirtualFrame frame, Node inliningTarget, PDict self, PKeyword[] kwargs, HashingStorage.InitNode initNode, HashingStorageAddAllToOther addAllToOtherNode) { - addAllToOtherNode.execute(frame, inliningTarget, initNode.execute(frame, PNone.NO_VALUE, kwargs), self); - } } // fromkeys() @Builtin(name = "fromkeys", minNumOfPositionalArgs = 2, parameterNames = {"$cls", "iterable", "value"}, isClassmethod = true) - @ImportStatic(SpecialMethodSlot.class) @GenerateNodeFactory public abstract static class FromKeysNode extends PythonTernaryBuiltinNode { @Specialization(guards = "isBuiltinDict(inliningTarget, cls, isSameTypeNode)", limit = "1") - static Object doKeys(VirtualFrame frame, Object cls, Object iterable, Object value, + static Object doKeys(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object iterable, Object value, @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Cached IsSameTypeNode isSameTypeNode, @Cached HashingCollectionNodes.GetClonedHashingStorageNode getHashingStorageNode, - @Cached PythonObjectFactory factory) { - HashingStorage s = getHashingStorageNode.execute(frame, inliningTarget, iterable, value); - return factory.createDict(cls, s); + @Bind PythonLanguage language) { + HashingStorage s = getHashingStorageNode.getForDictionaries(frame, inliningTarget, iterable, value); + return PFactory.createDict(language, s); } @Fallback @@ -526,30 +615,21 @@ static Object doKeys(VirtualFrame frame, Object cls, Object iterable, Object val @Bind("this") Node inliningTarget, @Cached PyObjectGetIter getIter, @Cached CallNode callCtor, - @Cached GetClassNode getClassNode, - @Cached(parameters = "SetItem") LookupSpecialMethodSlotNode lookupSetItem, - @Cached CallTernaryMethodNode callSetItem, - @Cached GetNextNode nextNode, - @Cached IsBuiltinObjectProfile errorProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PyObjectSetItem setItem, + @Cached PyIterNextNode nextNode) { Object dict = callCtor.execute(frame, cls); Object val = value == PNone.NO_VALUE ? PNone.NONE : value; Object it = getIter.execute(frame, inliningTarget, iterable); - Object setitemMethod = lookupSetItem.execute(frame, getClassNode.execute(inliningTarget, dict), dict); - if (setitemMethod != PNone.NO_VALUE) { - while (true) { - try { - Object key = nextNode.execute(frame, it); - callSetItem.execute(frame, setitemMethod, dict, key, val); - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - break; - } + while (true) { + Object key; + try { + key = nextNode.execute(frame, inliningTarget, it); + } catch (IteratorExhausted e) { + break; } - return dict; - } else { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.P_OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT, iterable); + setItem.execute(frame, inliningTarget, dict, key, val); } + return dict; } protected static boolean isBuiltinDict(Node inliningTarget, Object cls, IsSameTypeNode isSameTypeNode) { @@ -557,17 +637,20 @@ protected static boolean isBuiltinDict(Node inliningTarget, Object cls, IsSameTy } } - @Builtin(name = J___OR__, minNumOfPositionalArgs = 2) - @Builtin(name = J___ROR__, minNumOfPositionalArgs = 2, reverseOperation = true) + @Slot(value = SlotKind.nb_or, isComplex = true) + @ImportStatic(PythonBuiltinClassType.class) @GenerateNodeFactory - abstract static class OrNode extends PythonBinaryBuiltinNode { - @Specialization - static PDict or(VirtualFrame frame, PDict self, PDict other, + abstract static class OrNode extends BinaryOpBuiltinNode { + @Specialization(guards = {"isDictNode.execute(inliningTarget, self)", "isDictNode.execute(inliningTarget, other)"}, limit = "1") + static PDict or(VirtualFrame frame, Object self, Object other, @Bind("this") Node inliningTarget, + @Cached PyDictCheckNode isDictNode, + @Cached DictNodes.GetDictStorageNode getStorageNode, @Cached HashingStorageCopy copyNode, @Cached DictNodes.UpdateNode updateNode, - @Cached PythonObjectFactory factory) { - PDict merged = factory.createDict(copyNode.execute(inliningTarget, self.getDictStorage())); + @Bind PythonLanguage language) { + var storage = getStorageNode.execute(inliningTarget, self); + PDict merged = PFactory.createDict(language, copyNode.execute(inliningTarget, storage)); updateNode.execute(frame, merged, other); return merged; } @@ -579,11 +662,11 @@ static Object or(Object self, Object other) { } } - @Builtin(name = J___IOR__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.nb_inplace_or, isComplex = true) @GenerateNodeFactory abstract static class IOrNode extends PythonBinaryBuiltinNode { @Specialization - PDict or(VirtualFrame frame, PDict self, Object other, + Object or(VirtualFrame frame, Object self, Object other, @Cached DictNodes.UpdateNode updateNode) { updateNode.execute(frame, self, other); return self; @@ -595,8 +678,8 @@ PDict or(VirtualFrame frame, PDict self, Object other, public abstract static class ClassGetItemNode extends PythonBinaryBuiltinNode { @Specialization static Object classGetItem(Object cls, Object key, - @Cached PythonObjectFactory factory) { - return factory.createGenericAlias(cls, key); + @Bind PythonLanguage language) { + return PFactory.createGenericAlias(language, cls, key); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictNodes.java index 4e7e704a77..39eb1e090f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,9 +41,12 @@ package com.oracle.graal.python.builtins.objects.dict; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.RuntimeError; -import static com.oracle.graal.python.builtins.objects.common.HashingStorage.addKeyValuesToStorage; +import static com.oracle.graal.python.nodes.ErrorMessages.DESCRIPTOR_REQUIRES_S_OBJ_RECEIVED_P; import static com.oracle.graal.python.nodes.SpecialMethodNames.T_KEYS; +import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.common.ForeignHashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorage.ObjectToArrayPairNode; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageAddAllToOther; @@ -54,82 +57,154 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageLen; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItem; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageTransferItem; +import com.oracle.graal.python.builtins.objects.common.PHashingCollection; import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.object.BuiltinClassProfiles; +import com.oracle.graal.python.nodes.object.IsForeignObjectNode; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; public abstract class DictNodes { - @ImportStatic(HashingStorageGuards.class) - @SuppressWarnings("truffle-inlining") // footprint reduction 188 -> 170 - public abstract static class UpdateNode extends PNodeWithContext { - public abstract void execute(Frame frame, PDict self, Object other); - @SuppressWarnings("unused") - @Specialization(guards = "isIdentical(self, other)") - public static void updateSelf(VirtualFrame frame, PDict self, Object other) { + @GenerateUncached + @GenerateInline(inlineByDefault = true) + public abstract static class GetDictStorageNode extends PNodeWithContext { + + public abstract HashingStorage execute(Node inliningTarget, Object object); + + @Specialization + static HashingStorage doPHashingCollection(PHashingCollection dict) { + return dict.getDictStorage(); + } + + @Specialization(guards = {"isForeignObjectNode.execute(inliningTarget, dict)", "interop.hasHashEntries(dict)"}, limit = "1") + static HashingStorage doForeign(Node inliningTarget, Object dict, + @Cached IsForeignObjectNode isForeignObjectNode, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop) { + return new ForeignHashingStorage(dict); } - @Specialization(guards = "!mayHaveSideEffectingEq(self)") - public static void updateDictNoSideEffects(PDict self, PDict other, + @Fallback + static HashingStorage doFallback(Node inliningTarget, Object object) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, DESCRIPTOR_REQUIRES_S_OBJ_RECEIVED_P, "dict", object); + } + } + + @GenerateInline + @GenerateCached(false) + @GenerateUncached + public abstract static class UpdateDictStorageNode extends PNodeWithContext { + + public abstract void execute(Node inliningTarget, Object dict, HashingStorage oldStorage, HashingStorage newStorage); + + @Specialization + static void doPHashingCollection(Node inliningTarget, PHashingCollection dict, HashingStorage oldStorage, HashingStorage newStorage, + @Exclusive @Cached InlinedConditionProfile generalizedProfile) { + if (generalizedProfile.profile(inliningTarget, oldStorage != newStorage)) { + dict.setDictStorage(newStorage); + } + } + + @Fallback + static void doForeign(Object dict, HashingStorage oldStorage, HashingStorage newStorage) { + if (oldStorage != newStorage) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + throw CompilerDirectives.shouldNotReachHere("foreign dict storage should never need to be replaced: " + dict); + } + } + + } + + @SuppressWarnings("truffle-inlining") // footprint reduction 52 -> 36 + public abstract static class UpdateNode extends PNodeWithContext { + public abstract void execute(Frame frame, Object self, Object other); + + @Specialization + static void updateDictGeneric(VirtualFrame frame, Object self, Object other, @Bind("this") Node inliningTarget, - @Exclusive @Cached HashingStorageAddAllToOther addAllToOther) { + @Cached BuiltinClassProfiles.IsBuiltinObjectProfile isDictNode, + @Cached DictNodes.GetDictStorageNode getStorageNode, + @Cached UpdateInnerNode updateInnerNode) { + if (self != other) { + var selfStorage = getStorageNode.execute(inliningTarget, self); + boolean isDict = isDictNode.profileObject(inliningTarget, other, PythonBuiltinClassType.PDict); + HashingStorage otherStorage = isDict ? getStorageNode.execute(inliningTarget, other) : null; + updateInnerNode.execute(frame, inliningTarget, self, selfStorage, other, otherStorage); + } + } + + @NeverDefault + public static UpdateNode create() { + return DictNodesFactory.UpdateNodeGen.create(); + } + } + + @ImportStatic(HashingStorageGuards.class) + @GenerateInline + @GenerateCached(false) + public abstract static class UpdateInnerNode extends PNodeWithContext { + public abstract void execute(Frame frame, Node inliningTarget, Object self, HashingStorage selfStorage, Object other, Object otherStorage); + + @Specialization(guards = "!mayHaveSideEffectingEq(selfStorage)") + public static void updateDictNoSideEffects(Node inliningTarget, Object self, HashingStorage selfStorage, Object other, HashingStorage otherStorage, + @Exclusive @Cached HashingStorageAddAllToOther addAllToOther, + @Exclusive @Cached DictNodes.UpdateDictStorageNode updateStorageNode) { // The contract is such that we iterate over 'other' and add its elements to 'self'. If // 'other' gets mutated during the iteration, we should raise. This can happen via a // side effect of '__eq__' of some key in self, we should not run any other arbitrary // code here (hashes are reused from the 'other' storage). - addAllToOther.execute(null, inliningTarget, other.getDictStorage(), self); + var newStorage = addAllToOther.execute(null, inliningTarget, otherStorage, selfStorage); + updateStorageNode.execute(inliningTarget, self, selfStorage, newStorage); } - @Specialization(guards = "mayHaveSideEffectingEq(self)") - public static void updateDictGeneric(VirtualFrame frame, PDict self, PDict other, - @Bind("this") Node inliningTarget, + @Specialization(guards = "mayHaveSideEffectingEq(selfStorage)") + public static void updateDictGeneric(VirtualFrame frame, Node inliningTarget, Object self, HashingStorage selfStorage, Object other, HashingStorage otherStorage, + @Exclusive @Cached DictNodes.UpdateDictStorageNode updateStorageNode, @Cached HashingStorageTransferItem transferItem, @Cached HashingStorageGetIterator getOtherIter, @Cached HashingStorageIteratorNext iterNext, @Cached HashingStorageLen otherLenNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - HashingStorage selfStorage = self.getDictStorage(); - HashingStorage otherStorage = other.getDictStorage(); + @Cached PRaiseNode raiseNode) { int initialSize = otherLenNode.execute(inliningTarget, otherStorage); HashingStorageIterator itOther = getOtherIter.execute(inliningTarget, otherStorage); + var newStorage = selfStorage; while (iterNext.execute(inliningTarget, otherStorage, itOther)) { - selfStorage = transferItem.execute(frame, inliningTarget, otherStorage, itOther, selfStorage); + newStorage = transferItem.execute(frame, inliningTarget, otherStorage, itOther, newStorage); if (initialSize != otherLenNode.execute(inliningTarget, otherStorage)) { - throw raiseNode.get(inliningTarget).raise(RuntimeError, ErrorMessages.MUTATED_DURING_UPDATE, "dict"); + throw raiseNode.raise(inliningTarget, RuntimeError, ErrorMessages.MUTATED_DURING_UPDATE, "dict"); } } - self.setDictStorage(selfStorage); + updateStorageNode.execute(inliningTarget, self, selfStorage, newStorage); } - @Specialization(guards = "!isDict(other)") - public static void updateArg(VirtualFrame frame, PDict self, Object other, - @Bind("this") Node inliningTarget, + @Specialization(guards = "otherStorage == null") + public static void updateArg(VirtualFrame frame, Node inliningTarget, Object self, HashingStorage selfStorage, Object other, Object otherStorage, + @Exclusive @Cached DictNodes.UpdateDictStorageNode updateStorageNode, @Cached HashingStorageSetItem setItem, @Cached PyObjectLookupAttr lookupKeys, - @Cached ObjectToArrayPairNode toArrayPair) { + @Cached(inline = false) ObjectToArrayPairNode toArrayPair) { Object keyAttr = lookupKeys.execute(frame, inliningTarget, other, T_KEYS); - HashingStorage storage = addKeyValuesToStorage(frame, self, other, keyAttr, + HashingStorage newStorage = HashingStorage.addKeyValuesToStorage(frame, selfStorage, other, keyAttr, inliningTarget, toArrayPair, setItem); - self.setDictStorage(storage); - } - - public static boolean isIdentical(PDict dict, Object other) { - return dict == other; - } - - @NeverDefault - public static UpdateNode create() { - return DictNodesFactory.UpdateNodeGen.create(); + updateStorageNode.execute(inliningTarget, self, selfStorage, newStorage); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictReprBuiltin.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictReprBuiltin.java index b208e57d5a..356007269e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictReprBuiltin.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictReprBuiltin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,9 +40,10 @@ */ package com.oracle.graal.python.builtins.objects.dict; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REPR__; +import static com.oracle.graal.python.nodes.StringLiterals.T_COLON_SPACE; import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA_SPACE; +import static com.oracle.graal.python.nodes.StringLiterals.T_ELLIPSIS_IN_BRACES; import static com.oracle.graal.python.nodes.StringLiterals.T_LBRACE; import static com.oracle.graal.python.nodes.StringLiterals.T_LPAREN; import static com.oracle.graal.python.nodes.StringLiterals.T_RBRACE; @@ -52,19 +53,21 @@ import java.util.List; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.common.HashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageForEach; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageForEachCallback; -import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetItem; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIterator; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIteratorKey; +import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIteratorValue; import com.oracle.graal.python.builtins.objects.dict.PDictView.PDictItemsView; import com.oracle.graal.python.builtins.objects.dict.PDictView.PDictKeysView; import com.oracle.graal.python.builtins.objects.dict.PDictView.PDictValuesView; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; @@ -76,7 +79,7 @@ import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.CompilerDirectives.ValueType; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; @@ -93,32 +96,30 @@ @CoreFunctions(extendClasses = {PythonBuiltinClassType.PDictKeysView, PythonBuiltinClassType.PDictItemsView, PythonBuiltinClassType.PDictValuesView, PythonBuiltinClassType.PDict}) public final class DictReprBuiltin extends PythonBuiltins { + public static final TpSlots SLOTS = DictReprBuiltinSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return DictReprBuiltinFactory.getFactories(); } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { - private static final TruffleString T_ELLIPSIS = tsLiteral("{...}"); - private static final TruffleString T_COLONSPACE = tsLiteral(": "); private static final TruffleString T_LPAREN_BRACKET = tsLiteral("(["); private static final TruffleString T_RPAREN_BRACKET = tsLiteral("])"); @Override public abstract TruffleString execute(VirtualFrame VirtualFrame, Object arg); - @CompilerDirectives.ValueType + @ValueType protected static final class ReprState { private final Object self; - private final HashingStorage dictStorage; private final TruffleStringBuilder result; private final int initialLength; - ReprState(Object self, HashingStorage dictStorage, TruffleStringBuilder result) { + ReprState(Object self, TruffleStringBuilder result) { this.self = self; - this.dictStorage = dictStorage; this.result = result; initialLength = result.byteLength(); } @@ -141,12 +142,12 @@ protected final int getLimit() { protected static TruffleString getReprString(Node inliningTarget, Object obj, ReprState s, LookupAndCallUnaryDynamicNode reprNode, CastToTruffleStringNode castStr, - PRaiseNode.Lazy raiseNode) { - Object reprObj = s == null || obj != s.self ? reprNode.executeObject(obj, T___REPR__) : T_ELLIPSIS; + PRaiseNode raiseNode) { + Object reprObj = s == null || obj != s.self ? reprNode.executeObject(obj, T___REPR__) : T_ELLIPSIS_IN_BRACES; try { return castStr.execute(inliningTarget, reprObj); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.RETURNED_NON_STRING, "__repr__", reprObj); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.RETURNED_NON_STRING, "__repr__", reprObj); } } @@ -167,12 +168,13 @@ public static ReprState append(@SuppressWarnings("unused") Node node, HashingSto @Bind("this") Node inliningTarget, @Cached LookupAndCallUnaryDynamicNode reprNode, @Cached CastToTruffleStringNode castStr, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached InlinedConditionProfile lengthCheck, @Cached HashingStorageIteratorKey itKey, @Cached TruffleStringBuilder.AppendStringNode appendStringNode) { appendSeparator(inliningTarget, s, lengthCheck, appendStringNode); - appendStringNode.execute(s.result, getReprString(inliningTarget, itKey.execute(inliningTarget, storage, it), null, reprNode, castStr, raiseNode)); + Object key = itKey.execute(inliningTarget, storage, it); + appendStringNode.execute(s.result, getReprString(inliningTarget, key, null, reprNode, castStr, raiseNode)); return s; } } @@ -187,14 +189,13 @@ public static ReprState dict(Frame frame, @SuppressWarnings("unused") Node node, @Bind("this") Node inliningTarget, @Cached LookupAndCallUnaryDynamicNode reprNode, @Cached CastToTruffleStringNode castStr, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached InlinedConditionProfile lengthCheck, - @Cached HashingStorageIteratorKey itKey, - @Cached HashingStorageGetItem getItem, + @Cached HashingStorageIteratorValue itValue, @Cached TruffleStringBuilder.AppendStringNode appendStringNode) { appendSeparator(inliningTarget, s, lengthCheck, appendStringNode); - Object key = itKey.execute(inliningTarget, storage, it); - appendStringNode.execute(s.result, getReprString(inliningTarget, getItem.execute(frame, inliningTarget, s.dictStorage, key), s, reprNode, castStr, raiseNode)); + Object value = itValue.execute(inliningTarget, storage, it); + appendStringNode.execute(s.result, getReprString(inliningTarget, value, s, reprNode, castStr, raiseNode)); return s; } } @@ -210,17 +211,18 @@ public static ReprState dict(Frame frame, @SuppressWarnings("unused") Node node, @Cached LookupAndCallUnaryDynamicNode keyReprNode, @Cached LookupAndCallUnaryDynamicNode valueReprNode, @Cached CastToTruffleStringNode castStr, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached InlinedConditionProfile lengthCheck, @Cached HashingStorageIteratorKey itKey, - @Cached HashingStorageGetItem getItem, + @Cached HashingStorageIteratorValue itValue, @Cached TruffleStringBuilder.AppendStringNode appendStringNode) { appendSeparator(inliningTarget, s, lengthCheck, appendStringNode); appendStringNode.execute(s.result, T_LPAREN); Object key = itKey.execute(inliningTarget, storage, it); + Object value = itValue.execute(inliningTarget, storage, it); appendStringNode.execute(s.result, getReprString(inliningTarget, key, null, keyReprNode, castStr, raiseNode)); appendStringNode.execute(s.result, T_COMMA_SPACE); - appendStringNode.execute(s.result, getReprString(inliningTarget, getItem.execute(frame, inliningTarget, s.dictStorage, key), s, valueReprNode, castStr, raiseNode)); + appendStringNode.execute(s.result, getReprString(inliningTarget, value, s, valueReprNode, castStr, raiseNode)); appendStringNode.execute(s.result, T_RPAREN); return s; } @@ -237,38 +239,41 @@ public static ReprState dict(Frame frame, @SuppressWarnings("unused") Node node, @Cached LookupAndCallUnaryDynamicNode keyReprNode, @Cached LookupAndCallUnaryDynamicNode valueReprNode, @Cached CastToTruffleStringNode castStr, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached InlinedConditionProfile lengthCheck, @Cached HashingStorageIteratorKey itKey, - @Cached HashingStorageGetItem getItem, + @Cached HashingStorageIteratorValue itValue, @Cached TruffleStringBuilder.AppendStringNode appendStringNode) { Object key = itKey.execute(inliningTarget, storage, it); + Object value = itValue.execute(inliningTarget, storage, it); TruffleString keyReprString = getReprString(inliningTarget, key, null, keyReprNode, castStr, raiseNode); - TruffleString valueReprString = getReprString(inliningTarget, getItem.execute(frame, inliningTarget, s.dictStorage, key), s, valueReprNode, castStr, raiseNode); + TruffleString valueReprString = getReprString(inliningTarget, value, s, valueReprNode, castStr, raiseNode); appendSeparator(inliningTarget, s, lengthCheck, appendStringNode); appendStringNode.execute(s.result, keyReprString); - appendStringNode.execute(s.result, T_COLONSPACE); + appendStringNode.execute(s.result, T_COLON_SPACE); appendStringNode.execute(s.result, valueReprString); return s; } } - @Specialization // use same limit as for EachRepr nodes library - public static TruffleString repr(PDict dict, + @Specialization(guards = "!isDictView(dict)") // use same limit as for EachRepr nodes + // library + public static TruffleString repr(Object dict, @Bind("this") Node inliningTarget, + @Cached DictNodes.GetDictStorageNode getStorageNode, @Cached("create(3)") ForEachDictRepr consumerNode, @Shared @Cached HashingStorageForEach forEachNode, @Shared @Cached TruffleStringBuilder.AppendStringNode appendStringNode, @Shared @Cached TruffleStringBuilder.ToStringNode toStringNode) { PythonContext ctxt = PythonContext.get(forEachNode); if (!ctxt.reprEnter(dict)) { - return T_ELLIPSIS; + return T_ELLIPSIS_IN_BRACES; } try { TruffleStringBuilder sb = TruffleStringBuilder.create(TS_ENCODING); appendStringNode.execute(sb, T_LBRACE); - HashingStorage dictStorage = dict.getDictStorage(); - forEachNode.execute(null, inliningTarget, dictStorage, consumerNode, new ReprState(dict, dictStorage, sb)); + var storage = getStorageNode.execute(inliningTarget, dict); + forEachNode.execute(null, inliningTarget, storage, consumerNode, new ReprState(dict, sb)); appendStringNode.execute(sb, T_RBRACE); return toStringNode.execute(sb); } finally { @@ -320,8 +325,8 @@ private static TruffleString viewRepr(Node inliningTarget, PDictView view, Truff TruffleStringBuilder sb = TruffleStringBuilder.create(TS_ENCODING); appendStringNode.execute(sb, type); appendStringNode.execute(sb, T_LPAREN_BRACKET); - HashingStorage dictStorage = view.getWrappedDict().getDictStorage(); - forEachNode.execute(null, inliningTarget, dictStorage, consumerNode, new ReprState(view, dictStorage, sb)); + HashingStorage dictStorage = view.getWrappedStorage(); + forEachNode.execute(null, inliningTarget, dictStorage, consumerNode, new ReprState(view, sb)); appendStringNode.execute(sb, T_RPAREN_BRACKET); return toStringNode.execute(sb); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictValuesBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictValuesBuiltins.java index 356851d85d..ad2262067f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictValuesBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictValuesBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -25,11 +25,11 @@ */ package com.oracle.graal.python.builtins.objects.dict; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REVERSED__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; @@ -45,7 +45,7 @@ import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -68,8 +68,8 @@ protected List> getNodeFa abstract static class MappingNode extends PythonUnaryBuiltinNode { @Specialization static Object mapping(PDictView self, - @Cached PythonObjectFactory factory) { - return factory.createMappingproxy(self.getWrappedDict()); + @Bind PythonLanguage language) { + return PFactory.createMappingproxy(language, self.getWrappedDict()); } } @@ -81,11 +81,11 @@ public abstract static class LenNode extends LenBuiltinNode { static int run(PDictView self, @Bind("this") Node inliningTarget, @Cached HashingStorageLen lenNode) { - return lenNode.execute(inliningTarget, self.getWrappedDict().getDictStorage()); + return lenNode.execute(inliningTarget, self.getWrappedStorage()); } } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory public abstract static class IterNode extends PythonUnaryBuiltinNode { @Specialization @@ -93,9 +93,9 @@ static Object doPDictValuesView(PDictValuesView self, @Bind("this") Node inliningTarget, @Cached HashingStorageLen lenNode, @Cached HashingStorageGetIterator getIterator, - @Cached PythonObjectFactory factory) { - HashingStorage storage = self.getWrappedDict().getDictStorage(); - return factory.createDictValueIterator(getIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage)); + @Bind PythonLanguage language) { + HashingStorage storage = self.getWrappedStorage(); + return PFactory.createDictValueIterator(language, getIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage)); } } @@ -107,9 +107,9 @@ static Object doPDictValuesView(PDictValuesView self, @Bind("this") Node inliningTarget, @Cached HashingStorageLen lenNode, @Cached HashingStorageGetReverseIterator getReverseIter, - @Cached PythonObjectFactory factory) { - HashingStorage storage = self.getWrappedDict().getDictStorage(); - return factory.createDictValueIterator(getReverseIter.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage)); + @Bind PythonLanguage language) { + HashingStorage storage = self.getWrappedStorage(); + return PFactory.createDictValueIterator(language, getReverseIter.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage)); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictViewBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictViewBuiltins.java index c42b6726cf..05a917e4d8 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictViewBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictViewBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,26 +41,11 @@ package com.oracle.graal.python.builtins.objects.dict; import static com.oracle.graal.python.nodes.SpecialMethodNames.J_ISDISJOINT; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___AND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CONTAINS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RAND__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REVERSED__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RSUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RXOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___XOR__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; @@ -86,25 +71,25 @@ import com.oracle.graal.python.builtins.objects.set.PSet; import com.oracle.graal.python.builtins.objects.set.SetNodes; import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare; +import com.oracle.graal.python.lib.RichCmpOp; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqContains.SqContainsBuiltinNode; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyObjectGetIter; +import com.oracle.graal.python.lib.PyObjectIsTrueNode; import com.oracle.graal.python.lib.PyObjectRichCompareBool; import com.oracle.graal.python.lib.PyObjectSizeNode; +import com.oracle.graal.python.lib.PySequenceContainsNode; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode; -import com.oracle.graal.python.nodes.expression.CoerceToBooleanNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; -import com.oracle.graal.python.util.ComparisonOp; -import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; @@ -117,6 +102,7 @@ import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.LoopNode; import com.oracle.truffle.api.nodes.Node; @@ -137,8 +123,8 @@ protected List> getNodeFa abstract static class MappingNode extends PythonUnaryBuiltinNode { @Specialization static Object mapping(PDictView self, - @Cached PythonObjectFactory factory) { - return factory.createMappingproxy(self.getWrappedDict()); + @Bind PythonLanguage language) { + return PFactory.createMappingproxy(language, self.getWrappedDict()); } } @@ -150,11 +136,11 @@ public abstract static class LenNode extends LenBuiltinNode { static int len(PDictView self, @Bind("this") Node inliningTarget, @Cached HashingStorageLen len) { - return len.execute(inliningTarget, self.getWrappedDict().getDictStorage()); + return len.execute(inliningTarget, self.getWrappedStorage()); } } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory public abstract static class IterNode extends PythonUnaryBuiltinNode { @Specialization @@ -162,9 +148,9 @@ static Object getKeysViewIter(@SuppressWarnings("unused") PDictKeysView self, @Bind("this") Node inliningTarget, @Shared("len") @Cached HashingStorageLen lenNode, @Shared("getit") @Cached HashingStorageGetIterator getIterator, - @Shared @Cached PythonObjectFactory factory) { - HashingStorage storage = self.getWrappedDict().getDictStorage(); - return factory.createDictKeyIterator(getIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage)); + @Bind PythonLanguage language) { + HashingStorage storage = self.getWrappedStorage(); + return PFactory.createDictKeyIterator(language, getIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage)); } @Specialization @@ -172,9 +158,9 @@ static Object getItemsViewIter(PDictItemsView self, @Bind("this") Node inliningTarget, @Shared("len") @Cached HashingStorageLen lenNode, @Shared("getit") @Cached HashingStorageGetIterator getIterator, - @Shared @Cached PythonObjectFactory factory) { - HashingStorage storage = self.getWrappedDict().getDictStorage(); - return factory.createDictItemIterator(getIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage)); + @Bind PythonLanguage language) { + HashingStorage storage = self.getWrappedStorage(); + return PFactory.createDictItemIterator(language, getIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage)); } } @@ -186,9 +172,9 @@ static Object getReversedKeysViewIter(PDictKeysView self, @Bind("this") Node inliningTarget, @Shared @Cached HashingStorageLen lenNode, @Shared @Cached HashingStorageGetReverseIterator getReverseIterator, - @Shared @Cached PythonObjectFactory factory) { - HashingStorage storage = self.getWrappedDict().getDictStorage(); - return factory.createDictKeyIterator(getReverseIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage)); + @Bind PythonLanguage language) { + HashingStorage storage = self.getWrappedStorage(); + return PFactory.createDictKeyIterator(language, getReverseIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage)); } @Specialization @@ -196,17 +182,17 @@ static Object getReversedItemsViewIter(PDictItemsView self, @Bind("this") Node inliningTarget, @Shared @Cached HashingStorageLen lenNode, @Shared @Cached HashingStorageGetReverseIterator getReverseIterator, - @Shared @Cached PythonObjectFactory factory) { - HashingStorage storage = self.getWrappedDict().getDictStorage(); - return factory.createDictItemIterator(getReverseIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage)); + @Bind PythonLanguage language) { + HashingStorage storage = self.getWrappedStorage(); + return PFactory.createDictItemIterator(language, getReverseIterator.execute(inliningTarget, storage), storage, lenNode.execute(inliningTarget, storage)); } } - @Builtin(name = J___CONTAINS__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.sq_contains, isComplex = true) @GenerateNodeFactory - public abstract static class ContainsNode extends PythonBinaryBuiltinNode { + public abstract static class ContainsNode extends SqContainsBuiltinNode { @SuppressWarnings("unused") - @Specialization(guards = "len.execute(inliningTarget, self.getWrappedDict().getDictStorage()) == 0", limit = "1") + @Specialization(guards = "len.execute(inliningTarget, self.getWrappedStorage()) == 0", limit = "1") static boolean containsEmpty(PDictView self, Object key, @Bind("this") Node inliningTarget, @Cached HashingStorageLen len) { @@ -217,24 +203,24 @@ static boolean containsEmpty(PDictView self, Object key, static boolean contains(VirtualFrame frame, PDictKeysView self, Object key, @Bind("this") Node inliningTarget, @Exclusive @Cached HashingStorageGetItem getItem) { - return getItem.hasKey(frame, inliningTarget, self.getWrappedDict().getDictStorage(), key); + return getItem.hasKey(frame, inliningTarget, self.getWrappedStorage(), key); } @Specialization static boolean contains(VirtualFrame frame, PDictItemsView self, PTuple key, @Bind("this") Node inliningTarget, @Exclusive @Cached HashingStorageGetItem getItem, - @Cached PyObjectRichCompareBool.EqNode eqNode, + @Cached PyObjectRichCompareBool eqNode, @Cached InlinedConditionProfile tupleLenProfile, @Cached("createNotNormalized()") SequenceStorageNodes.GetItemNode getTupleItemNode) { SequenceStorage tupleStorage = key.getSequenceStorage(); if (tupleLenProfile.profile(inliningTarget, tupleStorage.length() != 2)) { return false; } - HashingStorage dictStorage = self.getWrappedDict().getDictStorage(); + HashingStorage dictStorage = self.getWrappedStorage(); Object value = getItem.execute(frame, inliningTarget, dictStorage, getTupleItemNode.execute(tupleStorage, 0)); if (value != null) { - return eqNode.compare(frame, inliningTarget, value, getTupleItemNode.execute(tupleStorage, 1)); + return eqNode.execute(frame, inliningTarget, value, getTupleItemNode.execute(tupleStorage, 1), RichCmpOp.Py_EQ); } else { return false; } @@ -260,7 +246,7 @@ public abstract static class IsDisjointNode extends PythonBinaryBuiltinNode { static boolean disjointSame(PDictView self, @SuppressWarnings("unused") PDictView other, @Bind("this") Node inliningTarget, @Cached @Shared HashingStorageLen len) { - return len.execute(inliningTarget, self.getWrappedDict().getDictStorage()) == 0; + return len.execute(inliningTarget, self.getWrappedStorage()) == 0; } @Specialization(guards = {"self != other"}) @@ -285,7 +271,7 @@ static boolean disjoint(VirtualFrame frame, PDictView self, PBaseSet other, private static boolean disjointImpl(VirtualFrame frame, Node inliningTarget, PDictView self, Object other, HashingStorageLen len, InlinedConditionProfile sizeProfile, PyObjectSizeNode sizeNode, ContainedInNode contained) { - if (sizeProfile.profile(inliningTarget, len.execute(inliningTarget, self.getWrappedDict().getDictStorage()) <= sizeNode.execute(frame, inliningTarget, other))) { + if (sizeProfile.profile(inliningTarget, len.execute(inliningTarget, self.getWrappedStorage()) <= sizeNode.execute(frame, inliningTarget, other))) { return !contained.execute(frame, self, other); } else { return !contained.execute(frame, other, self); @@ -304,39 +290,12 @@ static boolean disjoint(VirtualFrame frame, PDictView self, Object other, * view comparisons dictates that we need to use iteration to compare them in the general case. */ protected abstract static class ContainedInNode extends PNodeWithContext { - @Child private GetNextNode next; - @Child private LookupAndCallBinaryNode contains; - @Child private CoerceToBooleanNode cast; private final boolean checkAll; public ContainedInNode(boolean checkAll) { this.checkAll = checkAll; } - private GetNextNode getNext() { - if (next == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - next = insert(GetNextNode.create()); - } - return next; - } - - private LookupAndCallBinaryNode getContains() { - if (contains == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - contains = insert(LookupAndCallBinaryNode.create(SpecialMethodSlot.Contains)); - } - return contains; - } - - private CoerceToBooleanNode getCast() { - if (cast == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - cast = insert(CoerceToBooleanNode.createIfTrueNode()); - } - return cast; - } - public abstract boolean execute(VirtualFrame frame, Object self, Object other); @Specialization @@ -344,18 +303,23 @@ public boolean doIt(VirtualFrame frame, Object self, Object other, @Bind("this") Node inliningTarget, @Cached InlinedLoopConditionProfile loopConditionProfile, @Cached PyObjectGetIter getIterNode, - @Cached IsBuiltinObjectProfile stopProfile) { + @Cached PyIterNextNode nextNode, + @Cached PySequenceContainsNode containsNode, + @Cached PyObjectIsTrueNode isTrueNode) { Object iterator = getIterNode.execute(frame, inliningTarget, self); boolean ok = checkAll; int i = 0; try { while (loopConditionProfile.profile(inliningTarget, checkAll && ok || !checkAll && !ok)) { - Object item = getNext().execute(frame, iterator); - ok = getCast().executeBooleanCached(frame, getContains().executeObject(frame, other, item)); + Object item; + try { + item = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { + break; + } + ok = isTrueNode.execute(frame, containsNode.execute(frame, inliningTarget, other, item)); i++; } - } catch (PException e) { - e.expectStopIteration(inliningTarget, stopProfile); } finally { LoopNode.reportLoopCount(this, i < 0 ? Integer.MAX_VALUE : i); } @@ -373,93 +337,83 @@ static ContainedInNode create(boolean all) { } } - @GenerateInline - @GenerateCached(false) - abstract static class DictViewRichcompareHelperNode extends Node { - - abstract Object execute(VirtualFrame frame, Node inliningTarget, Object self, Object other, ComparisonOp op); + @Slot(value = SlotKind.tp_richcompare, isComplex = true) + @GenerateNodeFactory + abstract static class DictViewRichcompareHelperNode extends TpSlotRichCompare.RichCmpBuiltinNode { - protected static boolean reverse(ComparisonOp op) { - return op == ComparisonOp.GE || op == ComparisonOp.GT; + protected static boolean reverse(RichCmpOp op) { + return op == RichCmpOp.Py_GE || op == RichCmpOp.Py_GT; } - @Specialization - static boolean doView(VirtualFrame frame, Node inliningTarget, PDictView self, PBaseSet other, ComparisonOp op, - @Shared @Cached HashingStorageLen selfLenNode, - @Shared @Cached HashingStorageLen otherLenNode, - @Shared @Cached(inline = false) ContainedInNode allContained) { - int lenSelf = selfLenNode.execute(inliningTarget, self.getWrappedDict().getDictStorage()); - int lenOther = otherLenNode.execute(inliningTarget, other.getDictStorage()); - return op.cmpResultToBool(lenSelf - lenOther) && (reverse(op) ? allContained.execute(frame, other, self) : allContained.execute(frame, self, other)); + static boolean isDictViewOrSet(Object o) { + return o instanceof PDictView || o instanceof PBaseSet; } - @Specialization - static boolean doView(VirtualFrame frame, Node inliningTarget, PDictView self, PDictView other, ComparisonOp op, - @Shared @Cached HashingStorageLen selfLenNode, - @Shared @Cached HashingStorageLen otherLenNode, - @Shared @Cached(inline = false) ContainedInNode allContained) { - int lenSelf = selfLenNode.execute(inliningTarget, self.getWrappedDict().getDictStorage()); - int lenOther = otherLenNode.execute(inliningTarget, other.getWrappedDict().getDictStorage()); - return op.cmpResultToBool(lenSelf - lenOther) && (reverse(op) ? allContained.execute(frame, other, self) : allContained.execute(frame, self, other)); + @Specialization(guards = "isDictViewOrSet(other)") + static boolean doIt(VirtualFrame frame, PDictView self, Object other, RichCmpOp originalOp, + @Bind("$node") Node inliningTarget, + @Cached InlinedConditionProfile isSetProfile, + @Cached InlinedConditionProfile lenCheckProfile, + @Cached InlinedConditionProfile reverseProfile, + @Cached HashingStorageLen selfLenNode, + @Cached HashingStorageLen otherLenNode, + @Cached(inline = false) ContainedInNode allContained) { + // Note: more compact (to help hosted inlining) implementation, but should be in the end + // the same as CPython dictview_richcompare + RichCmpOp op = originalOp != RichCmpOp.Py_NE ? originalOp : RichCmpOp.Py_EQ; + + int lenSelf = selfLenNode.execute(inliningTarget, self.getWrappedStorage()); + HashingStorage otherStorage; + if (isSetProfile.profile(inliningTarget, other instanceof PBaseSet)) { + otherStorage = ((PBaseSet) other).getDictStorage(); + } else { + otherStorage = ((PDictView) other).getWrappedStorage(); + } + + int lenOther = otherLenNode.execute(inliningTarget, otherStorage); + if (lenCheckProfile.profile(inliningTarget, !op.compareResultToBool(lenSelf - lenOther))) { + return originalOp == RichCmpOp.Py_NE; + } + Object left = self; + Object right = other; + if (reverseProfile.profile(inliningTarget, reverse(op))) { + left = other; + right = self; + } + boolean result = allContained.execute(frame, left, right); + if (originalOp == RichCmpOp.Py_NE) { + result = !result; + } + return result; } @Fallback @SuppressWarnings("unused") - static PNotImplemented wrongTypes(Object self, Object other, ComparisonOp op) { + static PNotImplemented wrongTypes(Object self, Object other, RichCmpOp op) { return PNotImplemented.NOT_IMPLEMENTED; } } - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class EqNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object doIt(VirtualFrame frame, Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached DictViewRichcompareHelperNode helperNode) { - return helperNode.execute(frame, inliningTarget, self, other, ComparisonOp.EQ); - } - } - - @Builtin(name = J___NE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class NeNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object notEqual(VirtualFrame frame, Object self, Object other, - @Cached EqNode eqNode) { - Object result = eqNode.execute(frame, self, other); - if (result == PNotImplemented.NOT_IMPLEMENTED) { - return result; - } else { - assert result instanceof Boolean; - return !((Boolean) result); - } - } - } - - @Builtin(name = J___SUB__, minNumOfPositionalArgs = 2) - @Builtin(name = J___RSUB__, minNumOfPositionalArgs = 2, reverseOperation = true) + @Slot(value = SlotKind.nb_subtract, isComplex = true) @GenerateNodeFactory - abstract static class SubNode extends PythonBinaryBuiltinNode { + abstract static class SubNode extends BinaryOpBuiltinNode { @Specialization static PBaseSet doKeysView(VirtualFrame frame, PDictKeysView self, PBaseSet other, @Bind("this") Node inliningTarget, @Shared("diff") @Cached HashingStorageDiff diffNode, - @Shared @Cached PythonObjectFactory factory) { - HashingStorage storage = diffNode.execute(frame, inliningTarget, self.getWrappedDict().getDictStorage(), other.getDictStorage()); - return factory.createSet(storage); + @Bind PythonLanguage language) { + HashingStorage storage = diffNode.execute(frame, inliningTarget, self.getWrappedStorage(), other.getDictStorage()); + return PFactory.createSet(language, storage); } @Specialization static PBaseSet doKeysView(VirtualFrame frame, PDictKeysView self, PDictKeysView other, @Bind("this") Node inliningTarget, @Shared("diff") @Cached HashingStorageDiff diffNode, - @Shared @Cached PythonObjectFactory factory) { - HashingStorage storage = diffNode.execute(frame, inliningTarget, self.getWrappedDict().getDictStorage(), other.getWrappedDict().getDictStorage()); - return factory.createSet(storage); + @Bind PythonLanguage language) { + HashingStorage storage = diffNode.execute(frame, inliningTarget, self.getWrappedStorage(), other.getWrappedStorage()); + return PFactory.createSet(language, storage); } @Specialization @@ -467,11 +421,11 @@ static PBaseSet doKeysView(VirtualFrame frame, PDictKeysView self, Object other, @Bind("this") Node inliningTarget, @Shared("constrSet") @Cached SetNodes.ConstructSetNode constructSetNode, @Shared("diff") @Cached HashingStorageDiff diffNode, - @Shared @Cached PythonObjectFactory factory) { - HashingStorage left = self.getWrappedDict().getDictStorage(); - HashingStorage right = constructSetNode.executeWith(frame, other).getDictStorage(); + @Bind PythonLanguage language) { + HashingStorage left = self.getWrappedStorage(); + HashingStorage right = constructSetNode.execute(frame, other).getDictStorage(); HashingStorage storage = diffNode.execute(frame, inliningTarget, left, right); - return factory.createSet(storage); + return PFactory.createSet(language, storage); } @Specialization @@ -479,10 +433,10 @@ static PBaseSet doItemsView(VirtualFrame frame, PDictItemsView self, PBaseSet ot @Bind("this") Node inliningTarget, @Shared("constrSet") @Cached SetNodes.ConstructSetNode constructSetNode, @Shared("diff") @Cached HashingStorageDiff diffNode, - @Shared @Cached PythonObjectFactory factory) { - PSet selfSet = constructSetNode.executeWith(frame, self); + @Bind PythonLanguage language) { + PSet selfSet = constructSetNode.execute(frame, self); HashingStorage storage = diffNode.execute(frame, inliningTarget, selfSet.getDictStorage(), other.getDictStorage()); - return factory.createSet(storage); + return PFactory.createSet(language, storage); } @Specialization @@ -490,276 +444,105 @@ static PBaseSet doGeneric(VirtualFrame frame, Object self, Object other, @Bind("this") Node inliningTarget, @Shared("constrSet") @Cached SetNodes.ConstructSetNode constructSetNode, @Shared("diff") @Cached HashingStorageDiff diffNode, - @Shared @Cached PythonObjectFactory factory) { - HashingStorage left = constructSetNode.executeWith(frame, self).getDictStorage(); - HashingStorage right = constructSetNode.executeWith(frame, other).getDictStorage(); + @Bind PythonLanguage language) { + HashingStorage left = constructSetNode.execute(frame, self).getDictStorage(); + HashingStorage right = constructSetNode.execute(frame, other).getDictStorage(); HashingStorage storage = diffNode.execute(frame, inliningTarget, left, right); - return factory.createSet(storage); + return PFactory.createSet(language, storage); } } - @Builtin(name = J___AND__, minNumOfPositionalArgs = 2) - @Builtin(name = J___RAND__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class AndNode extends PythonBinaryBuiltinNode { - - @Specialization - static PBaseSet doKeysView(VirtualFrame frame, PDictKeysView self, PBaseSet other, - @Bind("this") Node inliningTarget, - @Shared("intersect") @Cached HashingStorageIntersect intersectNode, - @Shared @Cached PythonObjectFactory factory) { - HashingStorage left = self.getWrappedDict().getDictStorage(); - HashingStorage right = other.getDictStorage(); - HashingStorage intersectedStorage = intersectNode.execute(frame, inliningTarget, left, right); - return factory.createSet(intersectedStorage); - } - - @Specialization - static PBaseSet doKeysView(VirtualFrame frame, PDictKeysView self, PDictKeysView other, - @Bind("this") Node inliningTarget, - @Shared("intersect") @Cached HashingStorageIntersect intersectNode, - @Shared @Cached PythonObjectFactory factory) { - HashingStorage left = self.getWrappedDict().getDictStorage(); - HashingStorage right = other.getWrappedDict().getDictStorage(); - HashingStorage intersectedStorage = intersectNode.execute(frame, inliningTarget, left, right); - return factory.createSet(intersectedStorage); - } - - @Specialization - static PBaseSet doKeysView(VirtualFrame frame, PDictKeysView self, Object other, - @Bind("this") Node inliningTarget, - @Shared("constrSet") @Cached SetNodes.ConstructSetNode constructSetNode, - @Shared("intersect") @Cached HashingStorageIntersect intersectNode, - @Shared @Cached PythonObjectFactory factory) { - HashingStorage left = self.getWrappedDict().getDictStorage(); - HashingStorage right = constructSetNode.executeWith(frame, other).getDictStorage(); - HashingStorage intersectedStorage = intersectNode.execute(frame, inliningTarget, left, right); - return factory.createSet(intersectedStorage); - } - - @Specialization - static PBaseSet doItemsView(VirtualFrame frame, PDictItemsView self, PBaseSet other, - @Bind("this") Node inliningTarget, - @Shared("intersect") @Cached HashingStorageIntersect intersectNode, - @Shared("constrSet") @Cached SetNodes.ConstructSetNode constructSetNode, - @Shared @Cached PythonObjectFactory factory) { - PSet selfSet = constructSetNode.executeWith(frame, self); - HashingStorage left = selfSet.getDictStorage(); - HashingStorage right = other.getDictStorage(); - HashingStorage intersectedStorage = intersectNode.execute(frame, inliningTarget, left, right); - return factory.createSet(intersectedStorage); - } - - @Specialization - static PBaseSet doItemsView(VirtualFrame frame, PDictItemsView self, PDictItemsView other, - @Bind("this") Node inliningTarget, - @Shared("intersect") @Cached HashingStorageIntersect intersectNode, - @Shared("constrSet") @Cached SetNodes.ConstructSetNode constructSetNode, - @Shared @Cached PythonObjectFactory factory) { - PSet selfSet = constructSetNode.executeWith(frame, self); - PSet otherSet = constructSetNode.executeWith(frame, other); - HashingStorage left = selfSet.getDictStorage(); - HashingStorage right = otherSet.getDictStorage(); - HashingStorage intersectedStorage = intersectNode.execute(frame, inliningTarget, left, right); - return factory.createSet(intersectedStorage); - } - - @Specialization - static PBaseSet doItemsView(VirtualFrame frame, PDictItemsView self, Object other, - @Bind("this") Node inliningTarget, - @Shared("constrSet") @Cached SetNodes.ConstructSetNode constructSetNode, - @Shared("intersect") @Cached HashingStorageIntersect intersectNode, - @Shared @Cached PythonObjectFactory factory) { - HashingStorage left = constructSetNode.executeWith(frame, self).getDictStorage(); - HashingStorage right = constructSetNode.executeWith(frame, other).getDictStorage(); - HashingStorage intersectedStorage = intersectNode.execute(frame, inliningTarget, left, right); - return factory.createSet(intersectedStorage); - } - } - - @Builtin(name = J___OR__, minNumOfPositionalArgs = 2) - @Builtin(name = J___ROR__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class OrNode extends PythonBinaryBuiltinNode { - - protected static HashingStorage union(Node inliningTarget, HashingStorageCopy copyNode, HashingStorageAddAllToOther addAllToOther, HashingStorage left, HashingStorage right) { - return left.union(inliningTarget, right, copyNode, addAllToOther); - } - - @Specialization - static PBaseSet doKeysView(@SuppressWarnings("unused") VirtualFrame frame, PDictKeysView self, PBaseSet other, - @Bind("this") Node inliningTarget, - @Shared("copy") @Cached HashingStorageCopy copyNode, - @Shared("addAll") @Cached HashingStorageAddAllToOther addAllToOther, - @Shared @Cached PythonObjectFactory factory) { - return factory.createSet(union(inliningTarget, copyNode, addAllToOther, self.getWrappedDict().getDictStorage(), other.getDictStorage())); - } - - @Specialization - static PBaseSet doKeysView(@SuppressWarnings("unused") VirtualFrame frame, PDictKeysView self, PDictKeysView other, - @Bind("this") Node inliningTarget, - @Shared("copy") @Cached HashingStorageCopy copyNode, - @Shared("addAll") @Cached HashingStorageAddAllToOther addAllToOther, - @Shared @Cached PythonObjectFactory factory) { - return factory.createSet(union(inliningTarget, copyNode, addAllToOther, self.getWrappedDict().getDictStorage(), other.getWrappedDict().getDictStorage())); - } - - @Specialization - static PBaseSet doKeysView(@SuppressWarnings("unused") VirtualFrame frame, PDictKeysView self, Object other, - @Bind("this") Node inliningTarget, - @Shared @Cached SetNodes.ConstructSetNode constructSetNode, - @Shared("copy") @Cached HashingStorageCopy copyNode, - @Shared("addAll") @Cached HashingStorageAddAllToOther addAllToOther, - @Shared @Cached PythonObjectFactory factory) { - return factory.createSet(union(inliningTarget, copyNode, addAllToOther, self.getWrappedDict().getDictStorage(), constructSetNode.executeWith(frame, other).getDictStorage())); - } + @GenerateInline + @GenerateCached(false) + abstract static class GetStorageForBinopNode extends Node { + public abstract HashingStorage execute(Frame frame, Node inliningTarget, Object obj); @Specialization - static PBaseSet doItemsView(VirtualFrame frame, PDictItemsView self, PBaseSet other, - @Bind("this") Node inliningTarget, - @Shared("copy") @Cached HashingStorageCopy copyNode, - @Shared("addAll") @Cached HashingStorageAddAllToOther addAllToOther, - @Shared @Cached SetNodes.ConstructSetNode constructSetNode, - @Shared @Cached PythonObjectFactory factory) { - PSet selfSet = constructSetNode.executeWith(frame, self); - return factory.createSet(union(inliningTarget, copyNode, addAllToOther, selfSet.getDictStorage(), other.getDictStorage())); + static HashingStorage doView(PDictKeysView obj) { + return obj.getWrappedStorage(); } @Specialization - static PBaseSet doItemsView(VirtualFrame frame, PDictItemsView self, PDictItemsView other, - @Bind("this") Node inliningTarget, - @Shared("copy") @Cached HashingStorageCopy copyNode, - @Shared("addAll") @Cached HashingStorageAddAllToOther addAllToOther, - @Shared @Cached SetNodes.ConstructSetNode constructSetNode, - @Shared @Cached PythonObjectFactory factory) { - PSet selfSet = constructSetNode.executeWith(frame, self); - PSet otherSet = constructSetNode.executeWith(frame, other); - return factory.createSet(union(inliningTarget, copyNode, addAllToOther, selfSet.getDictStorage(), otherSet.getDictStorage())); + static HashingStorage doSet(PBaseSet obj) { + return obj.getDictStorage(); } - @Specialization - static PBaseSet doItemsView(VirtualFrame frame, PDictItemsView self, Object other, - @Bind("this") Node inliningTarget, - @Shared @Cached SetNodes.ConstructSetNode constructSetNode, - @Shared("copy") @Cached HashingStorageCopy copyNode, - @Shared("addAll") @Cached HashingStorageAddAllToOther addAllToOther, - @Shared @Cached PythonObjectFactory factory) { - HashingStorage selfStorage = constructSetNode.executeWith(frame, self).getDictStorage(); - HashingStorage otherStorage = constructSetNode.executeWith(frame, other).getDictStorage(); - return factory.createSet(union(inliningTarget, copyNode, addAllToOther, selfStorage, otherStorage)); + @Fallback + static HashingStorage doOther(VirtualFrame frame, Object obj, + @Cached SetNodes.ConstructSetNode constructSetNode) { + return constructSetNode.execute(frame, obj).getDictStorage(); } } - @Builtin(name = J___XOR__, minNumOfPositionalArgs = 2) - @Builtin(name = J___RXOR__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class XorNode extends PythonBinaryBuiltinNode { - - protected static HashingStorage xor(VirtualFrame frame, Node inliningTarget, HashingStorageXor xorNode, HashingStorage left, HashingStorage right) { - return xorNode.execute(frame, inliningTarget, left, right); - } - - @Specialization - static PBaseSet doKeysView(VirtualFrame frame, PDictKeysView self, PBaseSet other, - @Bind("this") Node inliningTarget, - @Shared("xorNode") @Cached HashingStorageXor xorNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createSet(xor(frame, inliningTarget, xorNode, self.getWrappedDict().getDictStorage(), other.getDictStorage())); - } - - @Specialization - static PBaseSet doKeysView(VirtualFrame frame, PDictKeysView self, PDictKeysView other, - @Bind("this") Node inliningTarget, - @Shared("xorNode") @Cached HashingStorageXor xorNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createSet(xor(frame, inliningTarget, xorNode, self.getWrappedDict().getDictStorage(), other.getWrappedDict().getDictStorage())); - } - - @Specialization - static PBaseSet doKeysView(VirtualFrame frame, PDictKeysView self, Object other, - @Bind("this") Node inliningTarget, - @Shared("constructSet") @Cached SetNodes.ConstructSetNode constructSetNode, - @Shared("xorNode") @Cached HashingStorageXor xorNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createSet(xor(frame, inliningTarget, xorNode, self.getWrappedDict().getDictStorage(), constructSetNode.executeWith(frame, other).getDictStorage())); - } - - @Specialization - static PBaseSet doItemsView(VirtualFrame frame, PDictItemsView self, PBaseSet other, - @Bind("this") Node inliningTarget, - @Shared("xorNode") @Cached HashingStorageXor xorNode, - @Shared("constructSet") @Cached SetNodes.ConstructSetNode constructSetNode, - @Shared @Cached PythonObjectFactory factory) { - PSet selfSet = constructSetNode.executeWith(frame, self); - return factory.createSet(xor(frame, inliningTarget, xorNode, selfSet.getDictStorage(), other.getDictStorage())); - } + @GenerateInline + @GenerateCached(false) + abstract static class GetCopiedStorageForBinopNode extends Node { + public abstract HashingStorage execute(Frame frame, Node inliningTarget, Object obj); @Specialization - static PBaseSet doItemsView(@SuppressWarnings("unused") VirtualFrame frame, PDictItemsView self, PDictItemsView other, - @Bind("this") Node inliningTarget, - @Shared("xorNode") @Cached HashingStorageXor xorNode, - @Shared("constructSet") @Cached SetNodes.ConstructSetNode constructSetNode, - @Shared @Cached PythonObjectFactory factory) { - PSet selfSet = constructSetNode.executeWith(frame, self); - PSet otherSet = constructSetNode.executeWith(frame, other); - return factory.createSet(xor(frame, inliningTarget, xorNode, selfSet.getDictStorage(), otherSet.getDictStorage())); + static HashingStorage doView(Node inliningTarget, PDictKeysView obj, + @Shared @Cached HashingStorageCopy copyNode) { + return copyNode.execute(inliningTarget, obj.getWrappedStorage()); } @Specialization - static PBaseSet doItemsView(@SuppressWarnings("unused") VirtualFrame frame, PDictItemsView self, Object other, - @Bind("this") Node inliningTarget, - @Shared("constructSet") @Cached SetNodes.ConstructSetNode constructSetNode, - @Shared("xorNode") @Cached HashingStorageXor xorNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createSet(xor(frame, inliningTarget, xorNode, constructSetNode.executeWith(frame, self).getDictStorage(), constructSetNode.executeWith(frame, other).getDictStorage())); + static HashingStorage doSet(Node inliningTarget, PBaseSet obj, + @Shared @Cached HashingStorageCopy copyNode) { + return copyNode.execute(inliningTarget, obj.getDictStorage()); } - } - @Builtin(name = J___LE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class LessEqualNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object doIt(VirtualFrame frame, Object self, Object other, - @Bind("this") Node inliningTarget, - @Cached DictViewRichcompareHelperNode helperNode) { - return helperNode.execute(frame, inliningTarget, self, other, ComparisonOp.LE); + @Fallback + static HashingStorage doOther(VirtualFrame frame, Object obj, + @Cached SetNodes.ConstructSetNode constructSetNode) { + return constructSetNode.execute(frame, obj).getDictStorage(); } } - @Builtin(name = J___GE__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.nb_and, isComplex = true) @GenerateNodeFactory - abstract static class GreaterEqualNode extends PythonBinaryBuiltinNode { + abstract static class AndNode extends BinaryOpBuiltinNode { @Specialization - static Object doIt(VirtualFrame frame, Object self, Object other, + static PBaseSet doGeneric(VirtualFrame frame, Object self, Object other, @Bind("this") Node inliningTarget, - @Cached DictViewRichcompareHelperNode helperNode) { - return helperNode.execute(frame, inliningTarget, self, other, ComparisonOp.GE); + @Cached GetStorageForBinopNode getStorage, + @Cached HashingStorageIntersect intersectNode, + @Bind PythonLanguage language) { + HashingStorage left = getStorage.execute(frame, inliningTarget, self); + HashingStorage right = getStorage.execute(frame, inliningTarget, other); + return PFactory.createSet(language, intersectNode.execute(frame, inliningTarget, left, right)); } } - @Builtin(name = J___LT__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.nb_or, isComplex = true) @GenerateNodeFactory - abstract static class LessThanNode extends PythonBinaryBuiltinNode { + public abstract static class OrNode extends BinaryOpBuiltinNode { @Specialization - static Object doIt(VirtualFrame frame, Object self, Object other, + static PBaseSet doGeneric(VirtualFrame frame, Object self, Object other, @Bind("this") Node inliningTarget, - @Cached DictViewRichcompareHelperNode helperNode) { - return helperNode.execute(frame, inliningTarget, self, other, ComparisonOp.LT); + @Cached GetCopiedStorageForBinopNode getStorage, + @Cached HashingStorageAddAllToOther addAllToOther, + @Bind PythonLanguage language) { + HashingStorage left = getStorage.execute(frame, inliningTarget, self); + HashingStorage right = getStorage.execute(frame, inliningTarget, other); + return PFactory.createSet(language, addAllToOther.execute(frame, inliningTarget, left, right)); } } - @Builtin(name = J___GT__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.nb_xor, isComplex = true) @GenerateNodeFactory - abstract static class GreaterThanNode extends PythonBinaryBuiltinNode { + public abstract static class XorNode extends BinaryOpBuiltinNode { @Specialization - static Object doIt(VirtualFrame frame, Object self, Object other, + static PBaseSet doGeneric(VirtualFrame frame, Object self, Object other, @Bind("this") Node inliningTarget, - @Cached DictViewRichcompareHelperNode helperNode) { - return helperNode.execute(frame, inliningTarget, self, other, ComparisonOp.GT); + @Cached GetStorageForBinopNode getStorage, + @Cached HashingStorageXor xor, + @Bind PythonLanguage language) { + HashingStorage left = getStorage.execute(frame, inliningTarget, self); + HashingStorage right = getStorage.execute(frame, inliningTarget, other); + return PFactory.createSet(language, xor.execute(frame, inliningTarget, left, right)); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/PDict.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/PDict.java index 4863f14ef6..b184f8ad4e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/PDict.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/PDict.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -101,7 +101,7 @@ public static HashingStorage createNewStorage(int expectedSize) { } public void update(PDict other) { - HashingStorageAddAllToOther.executeUncached(other.getDictStorage(), this); + setDictStorage(HashingStorageAddAllToOther.executeUncached(other.getDictStorage(), storage)); } @Override @@ -117,7 +117,7 @@ static boolean hasHashEntries(@SuppressWarnings("unused") PDict self) { @ExportMessage static long getHashSize(PDict self, - @Bind("$node") Node inliningTarget, + @Bind Node inliningTarget, @Exclusive @Cached GilNode gil, @Cached HashingStorageLen lenNode) { boolean mustRelease = gil.acquire(); @@ -132,7 +132,7 @@ static long getHashSize(PDict self, @ExportMessage(name = "isHashEntryModifiable") @ExportMessage(name = "isHashEntryRemovable") static boolean isHashEntryReadable(PDict self, Object key, - @Bind("$node") Node inliningTarget, + @Bind Node inliningTarget, @Exclusive @Cached GilNode gil, @Shared("getItem") @Cached HashingStorageGetItem getItem, @Exclusive @Cached PForeignToPTypeNode convertNode) { @@ -146,7 +146,7 @@ static boolean isHashEntryReadable(PDict self, Object key, @ExportMessage static Object readHashValue(PDict self, Object key, - @Bind("$node") Node inliningTarget, + @Bind Node inliningTarget, @Exclusive @Cached GilNode gil, @Exclusive @Cached HashingStorageGetItem getItem, @Exclusive @Cached PForeignToPTypeNode convertNode) throws UnknownKeyException { @@ -166,7 +166,7 @@ static Object readHashValue(PDict self, Object key, @ExportMessage static boolean isHashEntryInsertable(PDict self, Object key, - @Bind("$node") Node inliningTarget, + @Bind Node inliningTarget, @Exclusive @Cached GilNode gil, @Cached PyObjectHashNode hashNode, @Exclusive @Cached HashingStorageGetItem getItem, @@ -213,15 +213,15 @@ static void writeHashEntry(PDict self, Object key, Object value, @ExportMessage static void removeHashEntry(PDict self, Object key, - @Bind("$node") Node inliningTarget, + @Bind Node inliningTarget, @Exclusive @Cached GilNode gil, @Cached HashingStorageDelItem delItem, @Exclusive @Cached PForeignToPTypeNode convertNode) throws UnknownKeyException { boolean mustRelease = gil.acquire(); try { Object pKey = convertNode.executeConvert(key); - Object found = delItem.executePop(null, inliningTarget, self.getDictStorage(), pKey, self); - if (found == null) { + boolean found = delItem.execute(null, inliningTarget, self.getDictStorage(), pKey, self); + if (!found) { throw UnknownKeyException.create(key); } } finally { @@ -231,7 +231,7 @@ static void removeHashEntry(PDict self, Object key, @ExportMessage static Object getHashEntriesIterator(PDict self, - @Bind("$node") Node inliningTarget, + @Bind Node inliningTarget, @Exclusive @Cached GilNode gil, @Shared("getIter") @Cached PyObjectGetIter getIter, @Shared("callMethod") @Cached PyObjectCallMethodObjArgs callMethod) { @@ -246,7 +246,7 @@ static Object getHashEntriesIterator(PDict self, @ExportMessage static Object getHashKeysIterator(PDict self, - @Bind("$node") Node inliningTarget, + @Bind Node inliningTarget, @Exclusive @Cached GilNode gil, @Shared("getIter") @Cached PyObjectGetIter getIter, @Shared("callMethod") @Cached PyObjectCallMethodObjArgs callMethod) { @@ -261,7 +261,7 @@ static Object getHashKeysIterator(PDict self, @ExportMessage static Object getHashValuesIterator(PDict self, - @Bind("$node") Node inliningTarget, + @Bind Node inliningTarget, @Exclusive @Cached GilNode gil, @Shared("getIter") @Cached PyObjectGetIter getIter, @Shared("callMethod") @Cached PyObjectCallMethodObjArgs callMethod) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/PDictView.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/PDictView.java index 40ca31b563..9281651f4f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/PDictView.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/PDictView.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,6 +40,7 @@ */ package com.oracle.graal.python.builtins.objects.dict; +import com.oracle.graal.python.builtins.objects.common.ForeignHashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes; import com.oracle.graal.python.builtins.objects.common.PHashingCollection; @@ -47,20 +48,35 @@ import com.oracle.truffle.api.object.Shape; public abstract class PDictView extends PythonBuiltinObject { - private final PHashingCollection dict; + private final Object dict; + private final ForeignHashingStorage foreignHashingStorage; private final String name; public PDictView(Object clazz, Shape instanceShape, String name, PHashingCollection dict) { + this(clazz, instanceShape, name, dict, null); + } + + public PDictView(Object clazz, Shape instanceShape, String name, Object dict, ForeignHashingStorage foreignHashingStorage) { super(clazz, instanceShape); this.name = name; assert dict != null; this.dict = dict; + assert foreignHashingStorage == null || foreignHashingStorage.foreignDict == dict; + this.foreignHashingStorage = foreignHashingStorage; } - public final PHashingCollection getWrappedDict() { + public final Object getWrappedDict() { return dict; } + public final HashingStorage getWrappedStorage() { + if (foreignHashingStorage != null) { + return foreignHashingStorage; + } else { + return ((PHashingCollection) dict).getDictStorage(); + } + } + public String getName() { return name; } @@ -88,6 +104,10 @@ public static final class PDictKeysView extends PDictView { public PDictKeysView(Object clazz, Shape instanceShape, PHashingCollection dict) { super(clazz, instanceShape, "dict_keys", dict); } + + public PDictKeysView(Object clazz, Shape instanceShape, Object dict, ForeignHashingStorage foreignHashingStorage) { + super(clazz, instanceShape, "dict_keys", dict, foreignHashingStorage); + } } // ----------------------------------------------------------------------------------------------------------------- @@ -106,6 +126,10 @@ public static final class PDictValuesView extends PDictView { public PDictValuesView(Object clazz, Shape instanceShape, PHashingCollection dict) { super(clazz, instanceShape, "dict_values", dict); } + + public PDictValuesView(Object clazz, Shape instanceShape, Object dict, ForeignHashingStorage foreignHashingStorage) { + super(clazz, instanceShape, "dict_values", dict, foreignHashingStorage); + } } // ----------------------------------------------------------------------------------------------------------------- @@ -124,5 +148,9 @@ public static final class PDictItemsView extends PDictView { public PDictItemsView(Object clazz, Shape instanceShape, PHashingCollection dict) { super(clazz, instanceShape, "dict_items", dict); } + + public PDictItemsView(Object clazz, Shape instanceShape, Object dict, ForeignHashingStorage foreignHashingStorage) { + super(clazz, instanceShape, "dict_items", dict, foreignHashingStorage); + } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ellipsis/EllipsisBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ellipsis/EllipsisBuiltins.java index 334b32744c..0ebc937019 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ellipsis/EllipsisBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ellipsis/EllipsisBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,43 +41,53 @@ package com.oracle.graal.python.builtins.objects.ellipsis; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.util.List; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.strings.TruffleString; @CoreFunctions(extendClasses = PythonBuiltinClassType.PEllipsis) -@SuppressWarnings("unused") public final class EllipsisBuiltins extends PythonBuiltins { - private static final TruffleString T_ELLIPSIS = tsLiteral("Ellipsis"); + public static final TruffleString T_ELLIPSIS = tsLiteral("Ellipsis"); + + public static final TpSlots SLOTS = EllipsisBuiltinsSlotsGen.SLOTS; @Override protected List> getNodeFactories() { return EllipsisBuiltinsFactory.getFactories(); } - @Override - public void postInitialize(Python3Core core) { - super.postInitialize(core); - core.getBuiltins().setAttribute(T_ELLIPSIS, PEllipsis.INSTANCE); + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "ellipsis", minNumOfPositionalArgs = 1) + @GenerateNodeFactory + public abstract static class EllipsisTypeNode extends PythonBuiltinNode { + @SuppressWarnings("unused") + @Specialization + public static PEllipsis call(Object cls) { + return PEllipsis.INSTANCE; + } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory - abstract static class ReprNode extends PythonBuiltinNode { + abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization @SuppressWarnings("unused") static Object doit(PEllipsis self) { @@ -87,7 +97,7 @@ static Object doit(PEllipsis self) { @Builtin(name = J___REDUCE__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2) @GenerateNodeFactory - public abstract static class ReduceNode extends PythonBuiltinNode { + public abstract static class ReduceNode extends PythonBinaryBuiltinNode { @Specialization @SuppressWarnings("unused") Object doit(PEllipsis self, Object ignored) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/enumerate/EnumerateBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/enumerate/EnumerateBuiltins.java index 57f9e9dd34..0494dbb965 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/enumerate/EnumerateBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/enumerate/EnumerateBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -25,26 +25,42 @@ */ package com.oracle.graal.python.builtins.objects.enumerate; +import static com.oracle.graal.python.nodes.BuiltinNames.J_ENUMERATE; +import static com.oracle.graal.python.nodes.PGuards.isInteger; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CLASS_GETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; +import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.CallSlotTpIterNextNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; +import com.oracle.graal.python.lib.PyObjectGetIter; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; @@ -54,29 +70,85 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PEnumerate) public final class EnumerateBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = EnumerateBuiltinsSlotsGen.SLOTS; @Override protected List> getNodeFactories() { return EnumerateBuiltinsFactory.getFactories(); } - @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1) + // enumerate(iterable, start=0) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_ENUMERATE, minNumOfPositionalArgs = 2, parameterNames = {"cls", "iterable", "start"}) @GenerateNodeFactory - public abstract static class NextNode extends PythonUnaryBuiltinNode { + public abstract static class EnumerateNode extends PythonBuiltinNode { + + @Specialization + static PEnumerate doNone(VirtualFrame frame, Object cls, Object iterable, @SuppressWarnings("unused") PNone keywordArg, + @Bind("this") Node inliningTarget, + @Shared("getIter") @Cached PyObjectGetIter getIter, + @Bind PythonLanguage language, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createEnumerate(language, cls, getInstanceShape.execute(cls), getIter.execute(frame, inliningTarget, iterable), 0); + } + + @Specialization + static PEnumerate doInt(VirtualFrame frame, Object cls, Object iterable, int start, + @Bind("this") Node inliningTarget, + @Shared("getIter") @Cached PyObjectGetIter getIter, + @Bind PythonLanguage language, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createEnumerate(language, cls, getInstanceShape.execute(cls), getIter.execute(frame, inliningTarget, iterable), start); + } + + @Specialization + static PEnumerate doLong(VirtualFrame frame, Object cls, Object iterable, long start, + @Bind("this") Node inliningTarget, + @Shared("getIter") @Cached PyObjectGetIter getIter, + @Bind PythonLanguage language, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createEnumerate(language, cls, getInstanceShape.execute(cls), getIter.execute(frame, inliningTarget, iterable), start); + } + + @Specialization + static PEnumerate doPInt(VirtualFrame frame, Object cls, Object iterable, PInt start, + @Bind("this") Node inliningTarget, + @Shared("getIter") @Cached PyObjectGetIter getIter, + @Bind PythonLanguage language, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createEnumerate(language, cls, getInstanceShape.execute(cls), getIter.execute(frame, inliningTarget, iterable), start); + } + + static boolean isIntegerIndex(Object idx) { + return isInteger(idx) || idx instanceof PInt; + } + + @Specialization(guards = "!isIntegerIndex(start)") + static void enumerate(@SuppressWarnings("unused") Object cls, @SuppressWarnings("unused") Object iterable, Object start, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, start); + } + } + + @Slot(value = SlotKind.tp_iternext, isComplex = true) + @GenerateNodeFactory + public abstract static class NextNode extends TpIterNextBuiltin { @Specialization static Object doNext(VirtualFrame frame, PEnumerate self, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached InlinedConditionProfile bigIntIndexProfile, - @Cached GetNextNode next, - @Cached PythonObjectFactory factory) { - Object index = self.getAndIncrementIndex(inliningTarget, factory, bigIntIndexProfile); - Object nextValue = next.execute(frame, self.getDecoratedIterator()); - return factory.createTuple((new Object[]{index, nextValue})); + @Cached GetObjectSlotsNode getSlots, + @Cached CallSlotTpIterNextNode callIterNext) { + Object index = self.getAndIncrementIndex(inliningTarget, language, bigIntIndexProfile); + Object it = self.getDecoratedIterator(); + Object nextValue = callIterNext.execute(frame, inliningTarget, getSlots.execute(inliningTarget, it).tp_iternext(), it); + return PFactory.createTuple(language, (new Object[]{index, nextValue})); } } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory public abstract static class IterNode extends PythonUnaryBuiltinNode { @@ -92,13 +164,13 @@ public abstract static class ReduceNode extends PythonUnaryBuiltinNode { @Specialization static Object reduce(PEnumerate self, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached InlinedConditionProfile bigIntIndexProfile, - @Cached GetClassNode getClassNode, - @Cached PythonObjectFactory factory) { + @Cached GetClassNode getClassNode) { Object iterator = self.getDecoratedIterator(); Object index = self.getIndex(inliningTarget, bigIntIndexProfile); - PTuple contents = factory.createTuple(new Object[]{iterator, index}); - return factory.createTuple(new Object[]{getClassNode.execute(inliningTarget, self), contents}); + PTuple contents = PFactory.createTuple(language, new Object[]{iterator, index}); + return PFactory.createTuple(language, new Object[]{getClassNode.execute(inliningTarget, self), contents}); } } @@ -107,8 +179,8 @@ static Object reduce(PEnumerate self, public abstract static class ClassGetItemNode extends PythonBinaryBuiltinNode { @Specialization static Object classGetItem(Object cls, Object key, - @Cached PythonObjectFactory factory) { - return factory.createGenericAlias(cls, key); + @Bind PythonLanguage language) { + return PFactory.createGenericAlias(language, cls, key); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/enumerate/PEnumerate.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/enumerate/PEnumerate.java index 88d62ba68c..4cc18fb6e4 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/enumerate/PEnumerate.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/enumerate/PEnumerate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -25,9 +25,10 @@ */ package com.oracle.graal.python.builtins.objects.enumerate; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.object.Shape; import com.oracle.truffle.api.profiles.InlinedConditionProfile; @@ -53,10 +54,10 @@ public Object getDecoratedIterator() { return iterator; } - public Object getAndIncrementIndex(Node inliningTarget, PythonObjectFactory factory, InlinedConditionProfile bigIntIndexProfile) { + public Object getAndIncrementIndex(Node inliningTarget, PythonLanguage language, InlinedConditionProfile bigIntIndexProfile) { if (bigIntIndexProfile.profile(inliningTarget, bigIndex != null)) { PInt idx = bigIndex; - bigIndex = factory.createInt(bigIndex.inc()); + bigIndex = PFactory.createInt(language, bigIndex.inc()); return idx; } return index++; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/AttributeErrorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/AttributeErrorBuiltins.java new file mode 100644 index 0000000000..bc25caa14e --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/AttributeErrorBuiltins.java @@ -0,0 +1,235 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.builtins.objects.exception; + +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GETSTATE__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; +import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; +import static com.oracle.graal.python.util.PythonUtils.tsLiteral; + +import java.util.List; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; +import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.builtins.CoreFunctions; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.common.EmptyStorage; +import com.oracle.graal.python.builtins.objects.common.HashingStorage; +import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes; +import com.oracle.graal.python.builtins.objects.dict.PDict; +import com.oracle.graal.python.builtins.objects.function.PKeyword; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; +import com.oracle.graal.python.nodes.object.BuiltinClassProfiles; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.nodes.object.GetDictIfExistsNode; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; +import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile; +import com.oracle.truffle.api.strings.TruffleString; + +@CoreFunctions(extendClasses = PythonBuiltinClassType.AttributeError) +public final class AttributeErrorBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = AttributeErrorBuiltinsSlotsGen.SLOTS; + + @Override + protected List> getNodeFactories() { + return AttributeErrorBuiltinsFactory.getFactories(); + } + + private static final int IDX_NAME = 0; + private static final int IDX_OBJ = 1; + private static final int NUM_ATTRS = IDX_OBJ + 1; + + private static final TruffleString T_NAME = tsLiteral("name"); + private static final TruffleString T_OBJ = tsLiteral("obj"); + + private static final BaseExceptionAttrNode.StorageFactory ATTR_FACTORY = (args) -> new Object[NUM_ATTRS]; + + public static Object[] dataForObjKey(Object obj, Object key) { + return new Object[]{key, obj}; + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + abstract static class InitNode extends PythonVarargsBuiltinNode { + + @Specialization + static Object init(PBaseException self, Object[] args, PKeyword[] kwargs, + @Bind Node inliningTarget, + @Cached BaseExceptionBuiltins.BaseExceptionInitNode baseExceptionInitNode, + @Cached TruffleString.EqualNode equalNameNode, + @Cached TruffleString.EqualNode equalObjNode, + @Cached InlinedLoopConditionProfile loopProfile, + @Cached PRaiseNode raiseNode) { + baseExceptionInitNode.execute(self, args); + Object[] attrs = new Object[NUM_ATTRS]; + loopProfile.profileCounted(inliningTarget, kwargs.length); + for (int i = 0; loopProfile.inject(inliningTarget, i < kwargs.length); i++) { + PKeyword kw = kwargs[i]; + TruffleString kwName = kw.getName(); + if (equalNameNode.execute(kwName, T_NAME, TS_ENCODING)) { + attrs[IDX_NAME] = kw.getValue(); + } else if (equalObjNode.execute(kwName, T_OBJ, TS_ENCODING)) { + attrs[IDX_OBJ] = kw.getValue(); + } else { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.S_IS_AN_INVALID_ARG_FOR_S, kw.getName(), "AttributeError"); + } + } + self.setExceptionAttributes(attrs); + return PNone.NONE; + } + } + + @Builtin(name = "name", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, isGetter = true, isSetter = true, allowsDelete = true, doc = "attribute name") + @GenerateNodeFactory + public abstract static class NameNode extends PythonBinaryBuiltinNode { + @Specialization + static Object generic(PBaseException self, Object value, + @Cached BaseExceptionAttrNode attrNode) { + return attrNode.execute(self, value, IDX_NAME, ATTR_FACTORY); + } + } + + @Builtin(name = "obj", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, isGetter = true, isSetter = true, allowsDelete = true, doc = "object") + @GenerateNodeFactory + public abstract static class ObjNode extends PythonBinaryBuiltinNode { + @Specialization + static Object generic(PBaseException self, Object value, + @Cached BaseExceptionAttrNode attrNode) { + return attrNode.execute(self, value, IDX_OBJ, ATTR_FACTORY); + } + } + + @Builtin(name = J___GETSTATE__, minNumOfPositionalArgs = 1) + @GenerateNodeFactory + public abstract static class GetStateNode extends PythonUnaryBuiltinNode { + + @Specialization + static Object get(PBaseException self, + @Bind("this") Node inliningTarget, + @Cached BaseExceptionAttrNode attrNode, + @Cached GetDictIfExistsNode getDictIfExistsNode, + @Cached HashingStorageNodes.HashingStorageSetItem setHashingStorageItem, + @Cached HashingStorageNodes.HashingStorageCopy copyStorageNode, + @Bind PythonLanguage language) { + PDict dict = getDictIfExistsNode.execute(self); + /* + * Note from CPython: We specifically are not pickling the obj attribute since there are + * many cases where it is unlikely to be picklable. + */ + Object name = attrNode.get(self, IDX_NAME, ATTR_FACTORY); + if (name != null) { + HashingStorage storage = (dict != null) ? copyStorageNode.execute(inliningTarget, dict.getDictStorage()) : EmptyStorage.INSTANCE; + storage = setHashingStorageItem.execute(inliningTarget, storage, T_NAME, name); + return PFactory.createDict(language, storage); + } else if (dict != null) { + return dict; + } else { + return PNone.NONE; + } + } + } + + @Builtin(name = J___REDUCE__, minNumOfPositionalArgs = 1) + @GenerateNodeFactory + public abstract static class ReduceNode extends PythonUnaryBuiltinNode { + + @Specialization + static Object reduce(VirtualFrame frame, PBaseException self, + @Bind("this") Node inliningTarget, + @Cached GetClassNode getClassNode, + @Cached ExceptionNodes.GetArgsNode getArgsNode, + @Cached GetStateNode getStateNode, + @Bind PythonLanguage language) { + Object clazz = getClassNode.execute(inliningTarget, self); + Object args = getArgsNode.execute(inliningTarget, self); + Object state = getStateNode.execute(frame, self); + return PFactory.createTuple(language, new Object[]{clazz, args, state}); + } + } + + @GenerateInline + @GenerateCached(false) + @GenerateUncached + public abstract static class SetAttributeErrorContext extends Node { + public abstract PException execute(Node inliningTarget, PException e, Object obj, Object name); + + @Specialization + static PException set(Node inliningTarget, PException e, Object obj, Object name, + @Cached BuiltinClassProfiles.IsBuiltinObjectProfile errorProfile, + @Cached BaseExceptionAttrNode attrNode, + @Cached InlinedConditionProfile writeAttrsProfile) { + e.expectAttributeError(inliningTarget, errorProfile); + if (writeAttrsProfile.profile(inliningTarget, e.getUnreifiedException() instanceof PBaseException exception && + exception.getExceptionAttributes() != null && + exception.getExceptionAttributes()[IDX_NAME] == null && exception.getExceptionAttributes()[IDX_OBJ] == null)) { + PBaseException exception = (PBaseException) e.getUnreifiedException(); + attrNode.set(exception, name, IDX_NAME, ATTR_FACTORY); + attrNode.set(exception, obj, IDX_OBJ, ATTR_FACTORY); + } + throw e; + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/BaseExceptionAttrNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/BaseExceptionAttrNode.java index 727aa9aa65..15bd3afcaa 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/BaseExceptionAttrNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/BaseExceptionAttrNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,7 +44,6 @@ import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.nodes.PGuards; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; @@ -59,11 +58,7 @@ @SuppressWarnings("truffle-inlining") // footprint reduction 36 -> 20 public abstract class BaseExceptionAttrNode extends Node { public interface StorageFactory { - Object[] create(Object[] args, PythonObjectFactory factory); - - default Object[] create(Object[] args) { - return create(args, null); - } + Object[] create(Object[] args); default Object[] create() { return create(null); @@ -99,13 +94,12 @@ abstract static class EnsureAttrStorageNode extends Node { static Object[] ensure(PBaseException self, StorageFactory storageFactory, @Bind("this") Node inliningTarget, @Cached ExceptionNodes.GetArgsNode getArgsNode, - @Cached SequenceStorageNodes.GetInternalObjectArrayNode getInternalObjectArrayNode, - @Cached PythonObjectFactory factory) { + @Cached SequenceStorageNodes.GetInternalObjectArrayNode getInternalObjectArrayNode) { Object[] attributes = self.getExceptionAttributes(); if (attributes == null) { PTuple argsTuple = getArgsNode.execute(inliningTarget, self); Object[] args = getInternalObjectArrayNode.execute(inliningTarget, argsTuple.getSequenceStorage()); - attributes = storageFactory.create(args, factory); + attributes = storageFactory.create(args); self.setExceptionAttributes(attributes); } return attributes; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/BaseExceptionBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/BaseExceptionBuiltins.java index 1a28b8dce0..9171f0dd0d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/BaseExceptionBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/BaseExceptionBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -35,11 +35,8 @@ import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___SUPPRESS_CONTEXT__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___TRACEBACK__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_PARENS; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; import static com.oracle.graal.python.nodes.StringLiterals.T_LPAREN; @@ -48,12 +45,20 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; +import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes; +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes; +import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; import com.oracle.graal.python.builtins.objects.common.HashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageForEach; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageForEachCallback; @@ -67,6 +72,8 @@ import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.traceback.PTraceback; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyExceptionInstanceCheckNode; import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.lib.PyObjectLookupAttr; @@ -91,11 +98,10 @@ import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaBooleanNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.nodes.util.SplitArgsNode; +import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; -import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.ValueType; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -111,39 +117,64 @@ import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.InlinedBranchProfile; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.strings.TruffleStringBuilder; @CoreFunctions(extendClasses = PythonBuiltinClassType.PBaseException) public final class BaseExceptionBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = BaseExceptionBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return BaseExceptionBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "BaseException", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class BaseExceptionNode extends PythonVarargsBuiltinNode { + + @Specialization(guards = "!needsNativeAllocationNode.execute(inliningTarget, cls)", limit = "1") + static Object doManaged(Object cls, @SuppressWarnings("unused") Object[] args, @SuppressWarnings("unused") PKeyword[] kwargs, + @Bind("this") Node inliningTarget, + @SuppressWarnings("unused") @Cached.Exclusive @Cached TypeNodes.NeedsNativeAllocationNode needsNativeAllocationNode, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Cached InlinedConditionProfile argsProfile) { + PTuple argsTuple; + if (argsProfile.profile(inliningTarget, args.length == 0)) { + argsTuple = null; + } else { + argsTuple = PFactory.createTuple(language, args); + } + return PFactory.createBaseException(language, cls, getInstanceShape.execute(cls), null, argsTuple); + } + + @Specialization(guards = "needsNativeAllocationNode.execute(inliningTarget, cls)", limit = "1") + static Object doNativeSubtype(Object cls, Object[] args, @SuppressWarnings("unused") PKeyword[] kwargs, + @SuppressWarnings("unused") @Bind("this") Node inliningTarget, + @SuppressWarnings("unused") @Cached.Exclusive @Cached TypeNodes.NeedsNativeAllocationNode needsNativeAllocationNode, + @Bind PythonLanguage language, + @Cached CExtNodes.PCallCapiFunction callCapiFunction, + @Cached CApiTransitions.PythonToNativeNode toNativeNode, + @Cached CApiTransitions.NativeToPythonTransferNode toPythonNode, + @Cached ExternalFunctionNodes.DefaultCheckFunctionResultNode checkFunctionResultNode) { + Object argsTuple = args.length > 0 ? PFactory.createTuple(language, args) : PFactory.createEmptyTuple(language); + Object nativeResult = callCapiFunction.call(NativeCAPISymbol.FUN_EXCEPTION_SUBTYPE_NEW, toNativeNode.execute(cls), toNativeNode.execute(argsTuple)); + return toPythonNode.execute(checkFunctionResultNode.execute(PythonContext.get(inliningTarget), NativeCAPISymbol.FUN_EXCEPTION_SUBTYPE_NEW.getTsName(), nativeResult)); + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory public abstract static class BaseExceptionInitNode extends PythonVarargsBuiltinNode { - @Child private SplitArgsNode splitArgsNode; public final Object execute(Object self, Object[] args) { return execute(null, self, args, PKeyword.EMPTY_KEYWORDS); } - @Override - public Object varArgExecute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported { - if (arguments.length == 0) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw VarargsBuiltinDirectInvocationNotSupported.INSTANCE; - } - if (splitArgsNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - splitArgsNode = insert(SplitArgsNode.create()); - } - Object[] argsWithoutSelf = splitArgsNode.executeCached(arguments); - return execute(frame, arguments[0], argsWithoutSelf, keywords); - } - @Specialization(guards = {"args.length == 0", "keywords.length == 0"}) static Object doNoArguments(PBaseException self, @SuppressWarnings("unused") Object[] args, @SuppressWarnings("unused") PKeyword[] keywords) { self.setArgs(null); @@ -151,35 +182,41 @@ static Object doNoArguments(PBaseException self, @SuppressWarnings("unused") Obj } @Specialization(guards = {"args.length != 0", "keywords.length == 0"}) - Object doWithArguments(PBaseException self, Object[] args, @SuppressWarnings("unused") PKeyword[] keywords) { - self.setArgs(factory().createTuple(args)); + Object doWithArguments(PBaseException self, Object[] args, @SuppressWarnings("unused") PKeyword[] keywords, + @Bind PythonLanguage language) { + self.setArgs(PFactory.createTuple(language, args)); return PNone.NONE; } @Specialization(replaces = {"doNoArguments", "doWithArguments"}) - Object doGeneric(PBaseException self, Object[] args, PKeyword[] keywords) { + static Object doGeneric(PBaseException self, Object[] args, PKeyword[] keywords, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { if (keywords.length != 0) { - throw raise(TypeError, P_TAKES_NO_KEYWORD_ARGS, self); + throw raiseNode.raise(inliningTarget, TypeError, P_TAKES_NO_KEYWORD_ARGS, self); } if (args.length == 0) { self.setArgs(null); } else { - self.setArgs(factory().createTuple(args)); + self.setArgs(PFactory.createTuple(language, args)); } return PNone.NONE; } @Specialization - Object doNative(PythonAbstractNativeObject self, Object[] args, PKeyword[] keywords, + static Object doNative(PythonAbstractNativeObject self, Object[] args, PKeyword[] keywords, @Bind("this") Node inliningTarget, - @Cached ExceptionNodes.SetArgsNode setArgsNode) { + @Cached ExceptionNodes.SetArgsNode setArgsNode, + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { if (keywords.length != 0) { - throw raise(TypeError, P_TAKES_NO_KEYWORD_ARGS, self); + throw raiseNode.raise(inliningTarget, TypeError, P_TAKES_NO_KEYWORD_ARGS, self); } if (args.length == 0) { - setArgsNode.execute(inliningTarget, self, factory().createEmptyTuple()); + setArgsNode.execute(inliningTarget, self, PFactory.createEmptyTuple(language)); } else { - setArgsNode.execute(inliningTarget, self, factory().createTuple(args)); + setArgsNode.execute(inliningTarget, self, PFactory.createTuple(language, args)); } return PNone.NONE; } @@ -202,9 +239,9 @@ static Object args(VirtualFrame frame, Object self, Object value, @Cached CastToListNode castToList, @Cached SequenceStorageNodes.CopyInternalArrayNode copy, @Cached ExceptionNodes.SetArgsNode setArgsNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { PList list = castToList.execute(frame, value); - setArgsNode.execute(inliningTarget, self, factory.createTuple(copy.execute(inliningTarget, list.getSequenceStorage()))); + setArgsNode.execute(inliningTarget, self, PFactory.createTuple(language, copy.execute(inliningTarget, list.getSequenceStorage()))); return PNone.NONE; } } @@ -238,10 +275,9 @@ public static Object setCause(Object self, @SuppressWarnings("unused") PNone val @Specialization(guards = {"!isNoValue(value)", "!check.execute(inliningTarget, value)"}) public static Object cause(@SuppressWarnings("unused") Object self, @SuppressWarnings("unused") Object value, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached PyExceptionInstanceCheckNode check, - @Cached PRaiseNode raise) { - throw raise.raise(TypeError, ErrorMessages.EXCEPTION_CAUSE_MUST_BE_NONE_OR_DERIVE_FROM_BASE_EX); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.EXCEPTION_CAUSE_MUST_BE_NONE_OR_DERIVE_FROM_BASE_EX); } } @@ -274,10 +310,9 @@ public static Object setContext(Object self, @SuppressWarnings("unused") PNone v @Specialization(guards = {"!isNoValue(value)", "!check.execute(inliningTarget, value)"}) public static Object context(@SuppressWarnings("unused") Object self, @SuppressWarnings("unused") Object value, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached PyExceptionInstanceCheckNode check, - @Cached PRaiseNode raise) { - throw raise.raise(TypeError, ErrorMessages.EXCEPTION_CONTEXT_MUST_BE_NONE_OR_DERIVE_FROM_BASE_EX); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.EXCEPTION_CONTEXT_MUST_BE_NONE_OR_DERIVE_FROM_BASE_EX); } } @@ -296,12 +331,12 @@ static Object setSuppressContext(Object self, Object valueObj, @Bind("this") Node inliningTarget, @Cached ExceptionNodes.SetSuppressContextNode setSuppressContextNode, @Cached CastToJavaBooleanNode castToJavaBooleanNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { boolean value; try { value = castToJavaBooleanNode.execute(inliningTarget, valueObj); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.ATTR_VALUE_MUST_BE_BOOL); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ATTR_VALUE_MUST_BE_BOOL); } setSuppressContextNode.execute(inliningTarget, self, value); return PNone.NONE; @@ -337,8 +372,8 @@ static Object setTraceback(Object self, PTraceback tb, @Fallback static Object setTraceback(@SuppressWarnings("unused") Object self, @SuppressWarnings("unused") Object tb, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.MUST_BE_S_OR_S, "__traceback__", "a traceback", "None"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.TypeError, ErrorMessages.MUST_BE_S_OR_S, "__traceback__", "a traceback", "None"); } } @@ -383,8 +418,8 @@ static Object dict(Object self, @SuppressWarnings("unused") PNone mapping, @Specialization(guards = {"!isNoValue(mapping)", "!isDict(mapping)"}) static PNone dict(@SuppressWarnings("unused") Object self, Object mapping, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, mapping); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, mapping); } } @@ -397,15 +432,15 @@ static Object reduce(VirtualFrame frame, Object self, @Cached GetClassNode getClassNode, @Cached ExceptionNodes.GetArgsNode argsNode, @Cached DictNode dictNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { Object clazz = getClassNode.execute(inliningTarget, self); PTuple args = argsNode.execute(inliningTarget, self); Object dict = dictNode.execute(frame, self, PNone.NO_VALUE); - return factory.createTuple(new Object[]{clazz, args, dict}); + return PFactory.createTuple(language, new Object[]{clazz, args, dict}); } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory public abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization @@ -443,7 +478,7 @@ Object repr(VirtualFrame frame, Object self, } } - @Builtin(name = J___STR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_str, isComplex = true) @GenerateNodeFactory public abstract static class StrNode extends PythonUnaryBuiltinNode { @Specialization @@ -499,7 +534,7 @@ public static ExcState doIt(Frame frame, @SuppressWarnings("unused") Node node, @Cached HashingStorageIteratorKeyHash itKeyHash, @Cached HashingStorageGetItemWithHash getItem) { Object key = itKey.execute(inliningTarget, storage, it); - Object value = getItem.execute(frame, inliningTarget, state.dictStorage, key, itKeyHash.execute(inliningTarget, storage, it)); + Object value = getItem.execute(frame, inliningTarget, state.dictStorage, key, itKeyHash.execute(frame, inliningTarget, storage, it)); setAttr.execute(frame, inliningTarget, state.exception, key, value); return state; } @@ -518,9 +553,9 @@ static Object setDict(VirtualFrame frame, Object self, PDict state, @Specialization(guards = "!isDict(state)") static Object generic(@SuppressWarnings("unused") Object self, Object state, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (state != PNone.NONE) { - throw raiseNode.get(inliningTarget).raise(TypeError, STATE_IS_NOT_A_DICT); + throw raiseNode.raise(inliningTarget, TypeError, STATE_IS_NOT_A_DICT); } return PNone.NONE; } @@ -536,20 +571,20 @@ Object addNote(VirtualFrame frame, Object self, Object note, @Cached PyObjectLookupAttr lookupAttr, @Cached PyObjectSetAttr setAttr, @Cached ListNodes.AppendNode appendNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { if (!unicodeCheckNode.execute(inliningTarget, note)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.NOTE_MUST_BE_A_STR_NOT_P, note); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.NOTE_MUST_BE_A_STR_NOT_P, note); } Object notes = lookupAttr.execute(frame, inliningTarget, self, T___NOTES__); if (notes == PNone.NO_VALUE) { - notes = factory.createList(); + notes = PFactory.createList(language); setAttr.execute(frame, inliningTarget, self, T___NOTES__, notes); } if (notes instanceof PList notesList) { appendNode.execute(notesList, note); } else { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANNOT_ADD_NOTE_NOTES_IS_NOT_A_LIST); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANNOT_ADD_NOTE_NOTES_IS_NOT_A_LIST); } return PNone.NONE; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/BaseExceptionGroupBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/BaseExceptionGroupBuiltins.java index 46f8dc41fb..900f56d397 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/BaseExceptionGroupBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/BaseExceptionGroupBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,8 +46,8 @@ import static com.oracle.graal.python.nodes.BuiltinNames.T___NOTES__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___MODULE__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CLASS_GETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; +import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; @@ -55,6 +55,9 @@ import java.util.List; import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -69,9 +72,11 @@ import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.builtins.objects.traceback.PTraceback; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyErrExceptionMatchesNode; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; +import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.lib.PyObjectIsTrueNode; import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.lib.PyObjectSetAttr; @@ -80,16 +85,20 @@ import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.builtins.ListNodes; +import com.oracle.graal.python.nodes.builtins.TupleNodes; import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.nodes.util.CannotCastException; +import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext; import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.runtime.object.PythonObjectSlowPathFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; @@ -99,11 +108,15 @@ import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile; import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.strings.TruffleStringBuilder; @CoreFunctions(extendClasses = PythonBuiltinClassType.PBaseExceptionGroup) public class BaseExceptionGroupBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = BaseExceptionGroupBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return BaseExceptionGroupBuiltinsFactory.getFactories(); @@ -116,17 +129,89 @@ public void postInitialize(Python3Core core) { private static void createExceptionGroupType(Python3Core core) { PythonModule builtins = core.getBuiltins(); + PythonLanguage language = core.getLanguage(); Object typeBuiltin = builtins.getAttribute(T_TYPE); - PythonObjectSlowPathFactory factory = core.factory(); - PTuple bases = factory.createTuple(new Object[]{PythonBuiltinClassType.PBaseExceptionGroup, PythonBuiltinClassType.Exception}); + PTuple bases = PFactory.createTuple(language, new Object[]{PythonBuiltinClassType.PBaseExceptionGroup, PythonBuiltinClassType.Exception}); EconomicMapStorage dictStorage = EconomicMapStorage.create(1); - dictStorage.putUncachedWithJavaEq(T___MODULE__, T_BUILTINS); - PDict dict = factory.createDict(dictStorage); + dictStorage.putUncached(T___MODULE__, T_BUILTINS); + PDict dict = PFactory.createDict(language, dictStorage); Object exceptionGroupType = CallNode.executeUncached(typeBuiltin, T_EXCEPTION_GROUP, bases, dict); builtins.setAttribute(T_EXCEPTION_GROUP, exceptionGroupType); } - @Builtin(name = J___STR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "BaseExceptionGroup.__new__", minNumOfPositionalArgs = 3) + @GenerateNodeFactory + public abstract static class BaseExceptionGroupNode extends PythonTernaryBuiltinNode { + + @Specialization + static Object doManaged(VirtualFrame frame, Object cls, Object messageObj, Object exceptionsObj, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Cached CastToTruffleStringNode castToStringNode, + @Cached PySequenceCheckNode sequenceCheckNode, + @Cached TupleNodes.ConstructTupleNode toTupleNode, + @Cached SequenceStorageNodes.ToArrayNode toArrayNode, + @Cached PyObjectGetAttr getAttr, + @Cached InlinedLoopConditionProfile loopConditionProfile, + @Cached GetClassNode getClassNode, + @Cached BuiltinClassProfiles.IsBuiltinClassProfile exceptionProfile, + @Cached BuiltinClassProfiles.IsBuiltinClassProfile baseExceptionProfile, + @Cached TypeNodes.IsSameTypeNode isSameTypeNode, + @Cached PRaiseNode raiseNode) { + TruffleString message; + try { + message = castToStringNode.execute(inliningTarget, messageObj); + } catch (CannotCastException ex) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ARG_D_MUST_BE_S_NOT_P, "BaseExceptionGroup", 1, "str", messageObj); + } + if (!sequenceCheckNode.execute(inliningTarget, exceptionsObj)) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.SECOND_ARGUMENT_EXCEPTIONS_MUST_BE_A_SEQUENCE); + } + PTuple exceptionsTuple = toTupleNode.execute(frame, exceptionsObj); + Object[] exceptions = toArrayNode.execute(inliningTarget, exceptionsTuple.getSequenceStorage()); + if (exceptions.length == 0) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.SECOND_ARGUMENT_EXCEPTIONS_MUST_BE_A_NON_EMPTY_SEQUENCE); + } + PythonContext context = PythonContext.get(inliningTarget); + Object exceptionGroupType = getAttr.execute(inliningTarget, context.getBuiltins(), T_EXCEPTION_GROUP); + boolean nestedBaseExceptions = false; + loopConditionProfile.profileCounted(inliningTarget, exceptions.length); + for (int i = 0; loopConditionProfile.inject(inliningTarget, i < exceptions.length); i++) { + Object exceptionType = getClassNode.execute(inliningTarget, exceptions[i]); + if (exceptionProfile.profileClass(inliningTarget, exceptionType, PythonBuiltinClassType.Exception)) { + continue; + } + if (baseExceptionProfile.profileClass(inliningTarget, exceptionType, PythonBuiltinClassType.PBaseException)) { + nestedBaseExceptions = true; + } else { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.ITEM_D_OF_SECOND_ARGUMENT_EXCEPTIONS_IS_NOT_AN_EXCEPTION, i); + } + } + if (isSameTypeNode.execute(inliningTarget, cls, PythonBuiltinClassType.PBaseExceptionGroup)) { + if (!nestedBaseExceptions) { + /* + * All nested exceptions are Exception subclasses, wrap them in an + * ExceptionGroup + */ + cls = exceptionGroupType; + } + } else if (isSameTypeNode.execute(inliningTarget, cls, exceptionGroupType)) { + if (nestedBaseExceptions) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANNOT_NEST_BASE_EXCEPTIONS_IN_AN_EXCEPTION_GROUP); + } + } else { + /* user-defined subclass */ + if (nestedBaseExceptions && exceptionProfile.profileClass(inliningTarget, cls, PythonBuiltinClassType.Exception)) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANNOT_NEST_BASE_EXCEPTIONS_IN_N, cls); + } + } + return PFactory.createBaseExceptionGroup(language, cls, getInstanceShape.execute(cls), message, exceptions, new Object[]{messageObj, exceptionsObj}); + } + } + + @Slot(value = SlotKind.tp_str, isComplex = true) @GenerateNodeFactory abstract static class StrNode extends PythonUnaryBuiltinNode { @@ -166,8 +251,8 @@ static TruffleString message(PBaseExceptionGroup self) { abstract static class ExceptionsNode extends PythonUnaryBuiltinNode { @Specialization static Object exceptions(PBaseExceptionGroup self, - @Cached PythonObjectFactory factory) { - return factory.createTuple(self.getExceptions()); + @Bind PythonLanguage language) { + return PFactory.createTuple(language, self.getExceptions()); } } @@ -188,10 +273,9 @@ private static PBaseExceptionGroup subset(Node inliningTarget, PBaseExceptionGro if (exceptions.length == 0) { return null; } - PythonObjectSlowPathFactory factory = PythonContext.get(inliningTarget).factory(); - Object egObj = PyObjectCallMethodObjArgs.executeUncached(orig, T_DERIVE, factory.createTuple(exceptions)); + Object egObj = PyObjectCallMethodObjArgs.executeUncached(orig, T_DERIVE, PFactory.createTuple(PythonLanguage.get(null), exceptions)); if (!(egObj instanceof PBaseExceptionGroup eg)) { - throw PRaiseNode.raiseUncached(inliningTarget, TypeError, ErrorMessages.DERIVE_MUST_RETURN_AN_INSTANCE_OF_BASE_EXCEPTION_GROUP); + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.DERIVE_MUST_RETURN_AN_INSTANCE_OF_BASE_EXCEPTION_GROUP); } Object tb = ExceptionNodes.GetTracebackNode.executeUncached(orig); if (tb instanceof PTraceback) { @@ -232,12 +316,12 @@ private static MatcherType getMatcherType(Node inliningTarget, Object value) { for (int i = 0; i < storage.length(); i++) { Object elem = SequenceStorageNodes.GetItemScalarNode.executeUncached(storage, i); if (!isExceptionTypeUncached(elem)) { - throw PRaiseNode.raiseUncached(inliningTarget, TypeError, ErrorMessages.EXPECTED_A_FUNCTION_EXCEPTION_TYPE_OR_TUPLE_OF_EXCEPTION_TYPES); + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.EXPECTED_A_FUNCTION_EXCEPTION_TYPE_OR_TUPLE_OF_EXCEPTION_TYPES); } } return MatcherType.BY_TYPE; } - throw PRaiseNode.raiseUncached(inliningTarget, TypeError, ErrorMessages.EXPECTED_A_FUNCTION_EXCEPTION_TYPE_OR_TUPLE_OF_EXCEPTION_TYPES); + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.EXPECTED_A_FUNCTION_EXCEPTION_TYPE_OR_TUPLE_OF_EXCEPTION_TYPES); } private static boolean isExceptionTypeUncached(Object value) { @@ -257,7 +341,7 @@ private static boolean splitCheckMatch(Object exception, MatcherType matcherType private record SplitResult(Object match, Object rest) { static final SplitResult EMPTY = new SplitResult(null, null); - }; + } @TruffleBoundary private static SplitResult splitRecursive(Node inliningTarget, Object exception, MatcherType matcherType, Object matcherValue, boolean constructRest) { @@ -310,10 +394,9 @@ abstract static class SplitNode extends PythonBinaryBuiltinNode { @Specialization static Object split(VirtualFrame frame, PBaseExceptionGroup self, Object matcherValue, @Bind("this") Node inliningTarget, - @Cached("createFor(this)") IndirectCallData indirectCallData, - @Cached PythonObjectFactory factory) { - PythonLanguage language = PythonLanguage.get(inliningTarget); + @Cached("createFor(this)") IndirectCallData indirectCallData) { PythonContext context = PythonContext.get(inliningTarget); + PythonLanguage language = context.getLanguage(inliningTarget); Object state = IndirectCallContext.enter(frame, language, context, indirectCallData); /* * TODO this could benefit from PE, but the recusions and list building make that @@ -327,7 +410,7 @@ static Object split(VirtualFrame frame, PBaseExceptionGroup self, Object matcher } Object match = result.match != null ? result.match : PNone.NONE; Object rest = result.rest != null ? result.rest : PNone.NONE; - return factory.createTuple(new Object[]{match, rest}); + return PFactory.createTuple(language, new Object[]{match, rest}); } } @@ -338,8 +421,8 @@ abstract static class SubgroupNode extends PythonBinaryBuiltinNode { static Object subgroup(VirtualFrame frame, PBaseExceptionGroup self, Object matcherValue, @Bind("this") Node inliningTarget, @Cached("createFor(this)") IndirectCallData indirectCallData) { - PythonLanguage language = PythonLanguage.get(inliningTarget); PythonContext context = PythonContext.get(inliningTarget); + PythonLanguage language = context.getLanguage(inliningTarget); Object state = IndirectCallContext.enter(frame, language, context, indirectCallData); /* * TODO this could benefit from PE, but the recusions and list building make that @@ -360,8 +443,8 @@ static Object subgroup(VirtualFrame frame, PBaseExceptionGroup self, Object matc abstract static class ClassGetItemNode extends PythonBinaryBuiltinNode { @Specialization static Object classGetItem(Object cls, Object key, - @Cached PythonObjectFactory factory) { - return factory.createGenericAlias(cls, key); + @Bind PythonLanguage language) { + return PFactory.createGenericAlias(language, cls, key); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/ExceptionNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/ExceptionNodes.java index 440138db6a..7765db96c0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/ExceptionNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/ExceptionNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,10 +41,13 @@ package com.oracle.graal.python.builtins.objects.exception; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; +import static com.oracle.graal.python.nodes.StringLiterals.T_COLON_SPACE; +import static com.oracle.graal.python.nodes.StringLiterals.T_NO_MESSAGE; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import java.util.IllegalFormatException; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; import com.oracle.graal.python.builtins.objects.cext.structs.CFields; @@ -55,22 +58,29 @@ import com.oracle.graal.python.lib.PyExceptionInstanceCheckNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; +import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.object.IsForeignObjectNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.formatting.ErrorMessageFormatter; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.exception.AbstractTruffleException; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.strings.TruffleString; +import com.oracle.truffle.api.strings.TruffleStringBuilder; public final class ExceptionNodes { private static Object nullToNone(Object obj) { @@ -147,7 +157,7 @@ static void doNative(Node inliningTarget, PythonAbstractNativeObject exception, @Specialization @SuppressWarnings("unused") static void doInterop(Node inliningTarget, AbstractTruffleException exception, Object value) { - throw PRaiseNode.raiseUncached(inliningTarget, TypeError, ErrorMessages.CANNOT_SET_PROPERTY_ON_INTEROP_EXCEPTION); + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CANNOT_SET_PROPERTY_ON_INTEROP_EXCEPTION); } } @@ -211,7 +221,7 @@ static void doNative(Node inliningTarget, PythonAbstractNativeObject exception, @Specialization @SuppressWarnings("unused") static void doInterop(Node inliningTarget, AbstractTruffleException exception, Object value) { - throw PRaiseNode.raiseUncached(inliningTarget, TypeError, ErrorMessages.CANNOT_SET_PROPERTY_ON_INTEROP_EXCEPTION); + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CANNOT_SET_PROPERTY_ON_INTEROP_EXCEPTION); } } @@ -270,7 +280,7 @@ static void doNative(@SuppressWarnings("unused") Node inliningTarget, PythonAbst @Specialization @SuppressWarnings("unused") static void doInterop(Node inliningTarget, AbstractTruffleException exception, boolean value) { - throw PRaiseNode.raiseUncached(inliningTarget, TypeError, ErrorMessages.CANNOT_SET_PROPERTY_ON_INTEROP_EXCEPTION); + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CANNOT_SET_PROPERTY_ON_INTEROP_EXCEPTION); } } @@ -342,14 +352,14 @@ static void doNative(Node inliningTarget, PythonAbstractNativeObject exception, @Specialization @SuppressWarnings("unused") static void doInterop(Node inliningTarget, AbstractTruffleException exception, Object value) { - throw PRaiseNode.raiseUncached(inliningTarget, TypeError, ErrorMessages.CANNOT_SET_PROPERTY_ON_INTEROP_EXCEPTION); + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CANNOT_SET_PROPERTY_ON_INTEROP_EXCEPTION); } } @GenerateUncached @GenerateInline @GenerateCached(false) - public abstract static class GetArgsNode extends Node { + public abstract static class GetArgsNode extends PNodeWithContext { public abstract PTuple execute(Node inliningTarget, Object exception); public static PTuple executeUncached(Object e) { @@ -373,17 +383,17 @@ private static String getFormattedMessage(TruffleString format, Object... args) @Specialization static PTuple doManaged(Node inliningTarget, PBaseException self, - @Shared @Cached(inline = false) PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached InlinedConditionProfile nullArgsProfile, @Cached InlinedConditionProfile hasMessageFormat, @Cached(inline = false) TruffleString.FromJavaStringNode fromJavaStringNode) { PTuple args = self.getArgs(); if (nullArgsProfile.profile(inliningTarget, args == null)) { if (hasMessageFormat.profile(inliningTarget, !self.hasMessageFormat())) { - args = factory.createEmptyTuple(); + args = PFactory.createEmptyTuple(language); } else { // lazily format the exception message: - args = factory.createTuple(new Object[]{fromJavaStringNode.execute(getFormattedMessage(self.getMessageFormat(), self.getMessageArgs()), TS_ENCODING)}); + args = PFactory.createTuple(language, new Object[]{fromJavaStringNode.execute(getFormattedMessage(self.getMessageFormat(), self.getMessageArgs()), TS_ENCODING)}); } self.setArgs(args); } @@ -398,10 +408,49 @@ static PTuple doNative(@SuppressWarnings("unused") Node inliningTarget, PythonAb } @Specialization - @SuppressWarnings("unused") - static PTuple doInterop(Node inliningTarget, AbstractTruffleException exception, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - return factory.createEmptyTuple(); + static PTuple doInterop(AbstractTruffleException exception, + @Bind PythonLanguage language, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop, + @Cached(inline = false) TruffleString.SwitchEncodingNode switchEncodingNode) { + assert IsForeignObjectNode.executeUncached(exception); + try { + TruffleString message; + if (interop.hasExceptionMessage(exception)) { + Object messageObject = interop.getExceptionMessage(exception); + message = switchEncodingNode.execute(interop.asTruffleString(messageObject), TS_ENCODING); + } else { + message = T_NO_MESSAGE; + } + + if (interop.hasMetaObject(exception)) { + return PFactory.createTuple(language, new Object[]{concat(getMetaObjectName(exception), message)}); + } else { + return PFactory.createTuple(language, new Object[]{message}); + } + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } + + @TruffleBoundary + public static TruffleString getMetaObjectName(Object self) { + InteropLibrary interop = InteropLibrary.getUncached(); + try { + Object metaObject = interop.getMetaObject(self); + Object className = interop.getMetaQualifiedName(metaObject); + return interop.asTruffleString(className); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } + + @TruffleBoundary + private static TruffleString concat(TruffleString a, TruffleString b) { + TruffleStringBuilder sb = TruffleStringBuilder.create(TS_ENCODING); + sb.appendStringUncached(a); + sb.appendStringUncached(T_COLON_SPACE); + sb.appendStringUncached(b); + return sb.toStringUncached(); } } @@ -430,7 +479,7 @@ static void doNative(@SuppressWarnings("unused") Node inliningTarget, PythonAbst @Specialization @SuppressWarnings("unused") static void doInterop(Node inliningTarget, AbstractTruffleException exception, PTuple argsTuple) { - throw PRaiseNode.raiseUncached(inliningTarget, TypeError, ErrorMessages.CANNOT_SET_PROPERTY_ON_INTEROP_EXCEPTION); + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CANNOT_SET_PROPERTY_ON_INTEROP_EXCEPTION); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/ImportErrorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/ImportErrorBuiltins.java index f3a69f4d82..03b25d2da6 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/ImportErrorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/ImportErrorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,9 +41,7 @@ package com.oracle.graal.python.builtins.objects.exception; import static com.oracle.graal.python.nodes.ErrorMessages.S_IS_AN_INVALID_ARG_FOR_S; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__; import static com.oracle.graal.python.nodes.StringLiterals.T_NAME; import static com.oracle.graal.python.nodes.StringLiterals.T_PATH; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; @@ -51,6 +49,10 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -62,16 +64,16 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItem; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.function.PKeyword; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.lib.PyUnicodeCheckExactNode; +import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.object.GetDictIfExistsNode; -import com.oracle.graal.python.nodes.util.SplitArgsNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -84,6 +86,8 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.ImportError) public final class ImportErrorBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = ImportErrorBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return ImportErrorBuiltinsFactory.getFactories(); @@ -94,7 +98,7 @@ protected List> getNodeFa protected static final int IDX_PATH = 2; public static final int IMPORT_ERR_NUM_ATTRS = IDX_PATH + 1; - public static final BaseExceptionAttrNode.StorageFactory IMPORT_ERROR_ATTR_FACTORY = (args, factory) -> { + public static final BaseExceptionAttrNode.StorageFactory IMPORT_ERROR_ATTR_FACTORY = (args) -> { Object[] attrs = new Object[IMPORT_ERR_NUM_ATTRS]; if (args.length == 1) { attrs[IDX_MSG] = args[0]; @@ -108,35 +112,21 @@ protected List> getNodeFa * 'takesVarArgs = true' and ' takesVarKeywordArgs = true' because otherwise the created root * node would fail. */ - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, // - takesVarArgs = true, varArgsMarker = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory public abstract static class ImportErrorInitNode extends PythonVarargsBuiltinNode { private static final TruffleString NAME = tsLiteral("name"); private static final TruffleString PATH = tsLiteral("path"); - @Child private SplitArgsNode splitArgsNode; - - @Override - public Object varArgExecute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported { - if (arguments.length == 0) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw VarargsBuiltinDirectInvocationNotSupported.INSTANCE; - } - if (splitArgsNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - splitArgsNode = insert(SplitArgsNode.create()); - } - Object[] argsWithoutSelf = splitArgsNode.executeCached(arguments); - return execute(frame, arguments[0], argsWithoutSelf, keywords); - } - @Specialization - Object init(PBaseException self, Object[] args, PKeyword[] kwargs, + static Object init(PBaseException self, Object[] args, PKeyword[] kwargs, + @Bind("this") Node inliningTarget, @Cached BaseExceptionBuiltins.BaseExceptionInitNode baseExceptionInitNode, - @Cached TruffleString.EqualNode equalNode) { + @Cached TruffleString.EqualNode equalNode, + @Cached PRaiseNode raiseNode) { baseExceptionInitNode.execute(self, args); - Object[] attrs = IMPORT_ERROR_ATTR_FACTORY.create(args, null); + Object[] attrs = IMPORT_ERROR_ATTR_FACTORY.create(args); for (PKeyword kw : kwargs) { TruffleString kwName = kw.getName(); if (equalNode.execute(kwName, NAME, TS_ENCODING)) { @@ -144,7 +134,7 @@ Object init(PBaseException self, Object[] args, PKeyword[] kwargs, } else if (equalNode.execute(kwName, PATH, TS_ENCODING)) { attrs[IDX_PATH] = kw.getValue(); } else { - throw raise(PythonBuiltinClassType.TypeError, S_IS_AN_INVALID_ARG_FOR_S, kw.getName(), "ImportError"); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, S_IS_AN_INVALID_ARG_FOR_S, kw.getName(), "ImportError"); } } self.setExceptionAttributes(attrs); @@ -186,7 +176,7 @@ Object generic(PBaseException self, Object value, @GenerateNodeFactory public abstract static class ImportErrorReduceNode extends PythonUnaryBuiltinNode { private static Object getState(Node inliningTarget, PBaseException self, GetDictIfExistsNode getDictIfExistsNode, HashingStorageSetItem setHashingStorageItem, - HashingStorageCopy copyStorageNode, BaseExceptionAttrNode attrNode, PythonObjectFactory factory) { + HashingStorageCopy copyStorageNode, BaseExceptionAttrNode attrNode, PythonLanguage language) { PDict dict = getDictIfExistsNode.execute(self); final Object name = attrNode.get(self, IDX_NAME, IMPORT_ERROR_ATTR_FACTORY); final Object path = attrNode.get(self, IDX_PATH, IMPORT_ERROR_ATTR_FACTORY); @@ -198,7 +188,7 @@ private static Object getState(Node inliningTarget, PBaseException self, GetDict if (path != null) { storage = setHashingStorageItem.execute(inliningTarget, storage, T_PATH, path); } - return factory.createDict(storage); + return PFactory.createDict(language, storage); } else if (dict != null) { return dict; } else { @@ -215,18 +205,18 @@ static Object reduce(PBaseException self, @Cached ExceptionNodes.GetArgsNode getArgsNode, @Cached HashingStorageSetItem setHashingStorageItem, @Cached HashingStorageCopy copyStorageNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { Object clazz = getClassNode.execute(inliningTarget, self); Object args = getArgsNode.execute(inliningTarget, self); - Object state = getState(inliningTarget, self, getDictIfExistsNode, setHashingStorageItem, copyStorageNode, attrNode, factory); + Object state = getState(inliningTarget, self, getDictIfExistsNode, setHashingStorageItem, copyStorageNode, attrNode, language); if (state == PNone.NONE) { - return factory.createTuple(new Object[]{clazz, args}); + return PFactory.createTuple(language, new Object[]{clazz, args}); } - return factory.createTuple(new Object[]{clazz, args, state}); + return PFactory.createTuple(language, new Object[]{clazz, args, state}); } } - @Builtin(name = J___STR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_str, isComplex = true) @GenerateNodeFactory public abstract static class ImportErrorStrNode extends PythonUnaryBuiltinNode { @Specialization diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/KeyErrorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/KeyErrorBuiltins.java index 7ac6e20448..0075902b70 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/KeyErrorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/KeyErrorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,16 +40,16 @@ */ package com.oracle.graal.python.builtins.objects.exception; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__; - import java.util.List; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; @@ -65,12 +65,14 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.KeyError) public final class KeyErrorBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = KeyErrorBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return KeyErrorBuiltinsFactory.getFactories(); } - @Builtin(name = J___STR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_str, isComplex = true) @GenerateNodeFactory abstract static class KeyErrorStrNode extends PythonUnaryBuiltinNode { @Specialization diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/OsErrorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/OsErrorBuiltins.java index ba106fac08..57a3b285d3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/OsErrorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/OsErrorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -52,16 +52,15 @@ import static com.oracle.graal.python.builtins.objects.exception.OSErrorEnum.ESRCH; import static com.oracle.graal.python.builtins.objects.exception.OSErrorEnum.ETIMEDOUT; import static com.oracle.graal.python.nodes.ErrorMessages.P_TAKES_NO_KEYWORD_ARGS; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEW__; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -75,11 +74,12 @@ import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyArgCheckPositionalNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyNumberCheckNode; -import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode; import com.oracle.graal.python.lib.PyObjectStrAsTruffleStringNode; import com.oracle.graal.python.nodes.ErrorMessages; @@ -88,10 +88,10 @@ import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.object.BuiltinClassProfiles; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.object.GetDictIfExistsNode; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.dsl.Bind; @@ -117,12 +117,14 @@ public final class OsErrorBuiltins extends PythonBuiltins { public static final int IDX_WRITTEN = 5; public static final int OS_ERR_NUM_ATTRS = IDX_WRITTEN + 1; - public static final BaseExceptionAttrNode.StorageFactory OS_ERROR_ATTR_FACTORY = (args, factory) -> { + public static final BaseExceptionAttrNode.StorageFactory OS_ERROR_ATTR_FACTORY = (args) -> { final Object[] attrs = new Object[OS_ERR_NUM_ATTRS]; attrs[IDX_WRITTEN] = -1; return attrs; }; + public static final TpSlots SLOTS = OsErrorBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return OsErrorBuiltinsFactory.getFactories(); @@ -135,7 +137,7 @@ public void postInitialize(Python3Core core) { core.registerTypeInBuiltins(tsLiteral("IOError"), PythonBuiltinClassType.OSError); } - static boolean osErrorUseInit(VirtualFrame frame, Node inliningTarget, Python3Core core, Object type, PyObjectGetAttr getAttr) { + static boolean osErrorUseInit(Node inliningTarget, Object type, GetCachedTpSlotsNode getSlots) { // When __init__ is defined in an OSError subclass, we want any extraneous argument // to __new__ to be ignored. The only reasonable solution, given __new__ takes a // variable number of arguments, is to defer arg parsing and initialization to __init__. @@ -143,12 +145,8 @@ static boolean osErrorUseInit(VirtualFrame frame, Node inliningTarget, Python3Co // arguments. // // (see http://bugs.python.org/issue12555#msg148829 ) - final PythonBuiltinClass osErrorType = core.lookupType(PythonBuiltinClassType.OSError); - final Object tpInit = getAttr.execute(frame, inliningTarget, type, T___INIT__); - final Object tpNew = getAttr.execute(frame, inliningTarget, type, T___NEW__); - final Object osErrInit = getAttr.execute(frame, inliningTarget, osErrorType, T___INIT__); - final Object osErrNew = getAttr.execute(frame, inliningTarget, osErrorType, T___NEW__); - return tpInit != osErrInit && tpNew == osErrNew; + TpSlots slots = getSlots.execute(inliningTarget, type); + return slots.tp_init() != SLOTS.tp_init() && slots.tp_new() == SLOTS.tp_new(); } static PythonBuiltinClassType errno2errorType(int errno) { @@ -262,31 +260,33 @@ static Object[] osErrorParseArgs(Object[] args, Node inliningTarget, PyArgCheckP return parsed; } - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory protected abstract static class OSErrorNewNode extends PythonBuiltinNode { @Specialization static Object newCData(VirtualFrame frame, Object subType, Object[] args, PKeyword[] kwds, @Bind("this") Node inliningTarget, - @Cached PyObjectGetAttr getAttr, + @Cached GetCachedTpSlotsNode getSlots, @Cached PyNumberCheckNode pyNumberCheckNode, @Cached PyNumberAsSizeNode pyNumberAsSizeNode, + @Cached BuiltinClassProfiles.IsBuiltinClassExactProfile isOSErrorExact, @Cached PyArgCheckPositionalNode checkPositionalNode, @Cached BaseExceptionBuiltins.BaseExceptionInitNode baseInitNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Cached PRaiseNode raiseNode) { Object type = subType; Object[] parsedArgs = new Object[IDX_WRITTEN + 1]; - final Python3Core core = PythonContext.get(inliningTarget); - if (!osErrorUseInit(frame, inliningTarget, core, type, getAttr)) { + if (!osErrorUseInit(inliningTarget, type, getSlots)) { if (kwds.length != 0) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, P_TAKES_NO_KEYWORD_ARGS, type); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, P_TAKES_NO_KEYWORD_ARGS, type); } parsedArgs = osErrorParseArgs(args, inliningTarget, checkPositionalNode); final Object errnoVal = parsedArgs[IDX_ERRNO]; if (errnoVal != null && PGuards.canBeInteger(errnoVal) && - subType == PythonBuiltinClassType.OSError) { + isOSErrorExact.profileClass(inliningTarget, subType, PythonBuiltinClassType.OSError)) { final int errno = pyNumberAsSizeNode.executeExact(frame, inliningTarget, errnoVal); Object newType = errno2errorType(errno); if (newType != null) { @@ -295,17 +295,18 @@ static Object newCData(VirtualFrame frame, Object subType, Object[] args, PKeywo } } - PBaseException self = factory.createBaseException(type); - if (!osErrorUseInit(frame, inliningTarget, core, type, getAttr)) { + PBaseException self = PFactory.createBaseException(language, type, getInstanceShape.execute(type)); + if (!osErrorUseInit(inliningTarget, type, getSlots)) { osErrorInit(frame, inliningTarget, self, type, args, parsedArgs, pyNumberCheckNode, pyNumberAsSizeNode, baseInitNode); } else { - self.setArgs(factory.createEmptyTuple()); + self.setArgs(PFactory.createEmptyTuple(language)); } return self; } } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory public abstract static class OSErrorInitNode extends PythonBuiltinNode { public abstract Object execute(VirtualFrame frame, PBaseException self, Object[] args, PKeyword[] kwds); @@ -314,20 +315,20 @@ public abstract static class OSErrorInitNode extends PythonBuiltinNode { static Object initNoArgs(VirtualFrame frame, PBaseException self, Object[] args, PKeyword[] kwds, @Bind("this") Node inliningTarget, @Cached GetClassNode getClassNode, - @Cached PyObjectGetAttr getAttr, + @Cached GetCachedTpSlotsNode getSlots, @Cached PyNumberCheckNode pyNumberCheckNode, @Cached PyNumberAsSizeNode pyNumberAsSizeNode, @Cached PyArgCheckPositionalNode checkPositionalNode, @Cached BaseExceptionBuiltins.BaseExceptionInitNode baseInitNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { final Object type = getClassNode.execute(inliningTarget, self); - if (!osErrorUseInit(frame, inliningTarget, PythonContext.get(inliningTarget), type, getAttr)) { + if (!osErrorUseInit(inliningTarget, type, getSlots)) { // Everything already done in OSError_new return PNone.NONE; } if (kwds.length != 0) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, P_TAKES_NO_KEYWORD_ARGS, type); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, P_TAKES_NO_KEYWORD_ARGS, type); } Object[] parsedArgs = osErrorParseArgs(args, inliningTarget, checkPositionalNode); @@ -408,8 +409,8 @@ boolean isInvalid(PBaseException self) { @Specialization(guards = "isInvalid(self)") @SuppressWarnings("unused") static Object generic(PBaseException self, Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.AttributeError, ErrorMessages.CHARACTERS_WRITTEN); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.AttributeError, ErrorMessages.CHARACTERS_WRITTEN); } @Specialization(guards = "!isInvalid(self)") @@ -424,7 +425,7 @@ static Object generic(PBaseException self, Object value, } } - @Builtin(name = J___STR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_str, isComplex = true) @GenerateNodeFactory public abstract static class OSErrorStrNode extends PythonUnaryBuiltinNode { @Specialization @@ -472,7 +473,7 @@ static Object reduce(PBaseException self, @Cached GetClassNode getClassNode, @Cached GetDictIfExistsNode getDictNode, @Cached SequenceStorageNodes.GetItemScalarNode getItemNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { PTuple args = getArgsNode.execute(inliningTarget, self); final Object filename = attrNode.get(self, IDX_FILENAME, OS_ERROR_ATTR_FACTORY); final Object filename2 = attrNode.get(self, IDX_FILENAME2, OS_ERROR_ATTR_FACTORY); @@ -488,15 +489,15 @@ static Object reduce(PBaseException self, argData[3] = PNone.NONE; argData[4] = filename2; } - args = factory.createTuple(argData); + args = PFactory.createTuple(language, argData); } final Object type = getClassNode.execute(inliningTarget, self); final PDict dict = getDictNode.execute(self); if (dict != null) { - return factory.createTuple(new Object[]{type, args, dict}); + return PFactory.createTuple(language, new Object[]{type, args, dict}); } else { - return factory.createTuple(new Object[]{type, args}); + return PFactory.createTuple(language, new Object[]{type, args}); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/PBaseException.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/PBaseException.java index 780c0c2e69..354d9a9d93 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/PBaseException.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/PBaseException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,7 +46,6 @@ import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass; -import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetItemScalarNode; import com.oracle.graal.python.builtins.objects.frame.PFrame; import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.traceback.LazyTraceback; @@ -54,21 +53,17 @@ import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; import com.oracle.graal.python.builtins.objects.type.TypeNodes; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode; import com.oracle.graal.python.lib.PyExceptionInstanceCheckNode; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromPythonObjectNode; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; import com.oracle.graal.python.runtime.GilNode; +import com.oracle.graal.python.runtime.exception.ExceptionUtils; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.formatting.ErrorMessageFormatter; -import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; @@ -235,36 +230,6 @@ public Object[] getMessageArgs() { return messageArgs != null ? messageArgs.clone() : PythonUtils.EMPTY_OBJECT_ARRAY; } - @TruffleBoundary - public String getFormattedMessage() { - final Object clazz = GetPythonObjectClassNode.executeUncached(this); - String typeName = GetNameNode.doSlowPath(clazz).toJavaStringUncached(); - if (args == null) { - if (messageArgs != null && messageArgs.length > 0) { - return typeName + ": " + ErrorMessageFormatter.format(messageFormat.toJavaStringUncached(), getMessageArgs()); - } else if (hasMessageFormat) { - return typeName + ": " + messageFormat.toJavaStringUncached(); - } else { - return typeName; - } - } else { - SequenceStorage storage = args.getSequenceStorage(); - if (storage.length() == 0) { - return typeName; - } else { - StringBuilder builder = new StringBuilder(typeName); - builder.append(": "); - for (int i = 0; i < storage.length(); i++) { - if (i > 0) { - builder.append(", "); - } - builder.append(GetItemScalarNode.executeUncached(storage, i)); - } - return builder.toString(); - } - } - } - @Override public String toString() { CompilerAsserts.neverPartOfCompilation(); @@ -384,7 +349,7 @@ boolean hasExceptionMessage() { String getExceptionMessage(@Shared("gil") @Cached GilNode gil) { boolean mustRelease = gil.acquire(); try { - return getFormattedMessage(); + return ExceptionUtils.getExceptionMessage(this); } finally { gil.release(mustRelease); } @@ -425,32 +390,21 @@ int getExceptionExitStatus( } @ExportMessage - boolean hasExceptionCause(@Shared("gil") @Cached GilNode gil) { - boolean mustRelease = gil.acquire(); - try { - return cause != null || (!suppressContext && context != null); - } finally { - gil.release(mustRelease); - } + boolean hasExceptionCause() { + return cause != null || !suppressContext && context != null; } @ExportMessage Object getExceptionCause( @Bind("$node") Node inliningTarget, - @Exclusive @Cached InlinedBranchProfile unsupportedProfile, - @Shared("gil") @Cached GilNode gil) throws UnsupportedMessageException { - boolean mustRelease = gil.acquire(); - try { - if (cause != null) { - return cause; - } - if (!suppressContext && context != null) { - return context; - } - unsupportedProfile.enter(inliningTarget); - throw UnsupportedMessageException.create(); - } finally { - gil.release(mustRelease); + @Exclusive @Cached InlinedBranchProfile unsupportedProfile) throws UnsupportedMessageException { + if (cause != null) { + return cause; + } + if (!suppressContext && context != null) { + return context; } + unsupportedProfile.enter(inliningTarget); + throw UnsupportedMessageException.create(); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/PrepareExceptionNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/PrepareExceptionNode.java index 68ea9891c9..bc6cf47604 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/PrepareExceptionNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/PrepareExceptionNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,6 +42,7 @@ import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.modules.BuiltinFunctions; import com.oracle.graal.python.builtins.objects.PNone; @@ -55,7 +56,7 @@ import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; @@ -90,10 +91,9 @@ static Object doException(PythonAbstractNativeObject exc, @SuppressWarnings("unu @Specialization(guards = {"check.execute(inliningTarget, exc)", "!isPNone(value)"}) static Object doException(@SuppressWarnings("unused") PBaseException exc, @SuppressWarnings("unused") Object value, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared @Cached PyExceptionInstanceCheckNode check, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.INSTANCE_EX_MAY_NOT_HAVE_SEP_VALUE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.INSTANCE_EX_MAY_NOT_HAVE_SEP_VALUE); } @Specialization(guards = {"isTypeNode.execute(inliningTarget, type)", "!isPNone(value)", "!isPTuple(value)"}, limit = "1") @@ -106,7 +106,7 @@ static Object doExceptionOrCreate(VirtualFrame frame, Object type, Object value, @Shared @Cached IsSubtypeNode isSubtypeNode, @Shared @Cached PRaiseNode raiseNode, @Shared("callCtor") @Cached CallNode callConstructor) { - checkExceptionClass(type, isSubtypeNode, raiseNode); + checkExceptionClass(inliningTarget, type, isSubtypeNode, raiseNode); if (isInstanceProfile.profile(inliningTarget, isInstanceNode.executeWith(frame, value, type))) { return value; } else { @@ -127,7 +127,7 @@ static Object doCreate(VirtualFrame frame, Object type, @SuppressWarnings("unuse @Shared @Cached IsSubtypeNode isSubtypeNode, @Shared @Cached PRaiseNode raiseNode, @Shared("callCtor") @Cached CallNode callConstructor) { - checkExceptionClass(type, isSubtypeNode, raiseNode); + checkExceptionClass(inliningTarget, type, isSubtypeNode, raiseNode); Object instance = callConstructor.execute(frame, type); if (check.execute(inliningTarget, instance)) { return instance; @@ -145,7 +145,7 @@ static Object doCreateTuple(VirtualFrame frame, Object type, PTuple value, @Shared @Cached IsSubtypeNode isSubtypeNode, @Shared @Cached PRaiseNode raiseNode, @Shared("callCtor") @Cached CallNode callConstructor) { - checkExceptionClass(type, isSubtypeNode, raiseNode); + checkExceptionClass(inliningTarget, type, isSubtypeNode, raiseNode); Object[] args = getObjectArrayNode.execute(inliningTarget, value); Object instance = callConstructor.execute(frame, type, args); if (check.execute(inliningTarget, instance)) { @@ -158,9 +158,8 @@ static Object doCreateTuple(VirtualFrame frame, Object type, PTuple value, @Specialization(guards = "fallbackGuard(type, inliningTarget, isTypeNode)", limit = "1") static Object doError(Object type, @SuppressWarnings("unused") Object value, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached IsTypeNode isTypeNode, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.EXCEPTIONS_MUST_BE_CLASSES_OR_INSTANCES_DERIVING_FROM_BASE_EX, type); + @SuppressWarnings("unused") @Exclusive @Cached IsTypeNode isTypeNode) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.EXCEPTIONS_MUST_BE_CLASSES_OR_INSTANCES_DERIVING_FROM_BASE_EX, type); } static boolean fallbackGuard(Object type, Node inliningTarget, IsTypeNode isTypeNode) { @@ -172,12 +171,12 @@ private static PBaseException handleInstanceNotAnException(Object type, Object i * Instead of throwing the exception here, we replace the created exception with it. This is * done to match CPython's behavior of `generator.throw` */ - return PythonObjectFactory.getUncached().createBaseException(TypeError, ErrorMessages.CALLING_N_SHOULD_HAVE_RETURNED_AN_INSTANCE_OF_BASE_EXCEPTION_NOT_P, new Object[]{type, instance}); + return PFactory.createBaseException(PythonLanguage.get(null), TypeError, ErrorMessages.CALLING_N_SHOULD_HAVE_RETURNED_AN_INSTANCE_OF_BASE_EXCEPTION_NOT_P, new Object[]{type, instance}); } - private static void checkExceptionClass(Object type, IsSubtypeNode isSubtypeNode, PRaiseNode raiseNode) { + private static void checkExceptionClass(Node inliningTarget, Object type, IsSubtypeNode isSubtypeNode, PRaiseNode raiseNode) { if (!isSubtypeNode.execute(type, PythonBuiltinClassType.PBaseException)) { - throw raiseNode.raise(TypeError, ErrorMessages.EXCEPTIONS_MUST_BE_CLASSES_OR_INSTANCES_DERIVING_FROM_BASE_EX, type); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.EXCEPTIONS_MUST_BE_CLASSES_OR_INSTANCES_DERIVING_FROM_BASE_EX, type); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/StopIterationBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/StopIterationBuiltins.java index 2a4b436cbf..57a8042c24 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/StopIterationBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/StopIterationBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,21 +40,21 @@ */ package com.oracle.graal.python.builtins.objects.exception; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; - import java.util.List; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.function.PKeyword; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; -import com.oracle.graal.python.nodes.util.SplitArgsNode; -import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; @@ -64,37 +64,25 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.StopIteration) public final class StopIterationBuiltins extends PythonBuiltins { - public static final BaseExceptionAttrNode.StorageFactory STOP_ITERATION_ATTR_FACTORY = (args, factory) -> new Object[]{(args != null && args.length > 0) ? args[0] : PNone.NONE}; + public static final BaseExceptionAttrNode.StorageFactory STOP_ITERATION_ATTR_FACTORY = (args) -> new Object[]{(args != null && args.length > 0) ? args[0] : PNone.NONE}; + + public static final TpSlots SLOTS = StopIterationBuiltinsSlotsGen.SLOTS; @Override protected List> getNodeFactories() { return StopIterationBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory public abstract static class StopIterationInitNode extends PythonVarargsBuiltinNode { - @Child private SplitArgsNode splitArgsNode; - - @Override - public final Object varArgExecute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) { - if (arguments.length == 0 || keywords.length != 0) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw VarargsBuiltinDirectInvocationNotSupported.INSTANCE; - } - if (splitArgsNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - splitArgsNode = insert(SplitArgsNode.create()); - } - Object[] argsWithoutSelf = splitArgsNode.executeCached(arguments); - return execute(frame, arguments[0], argsWithoutSelf, keywords); - } @Specialization - static Object init(PBaseException self, Object[] args, + static Object init(VirtualFrame frame, PBaseException self, Object[] args, PKeyword[] keywords, @Cached BaseExceptionBuiltins.BaseExceptionInitNode baseExceptionInitNode) { - baseExceptionInitNode.execute(self, args); - self.setExceptionAttributes(STOP_ITERATION_ATTR_FACTORY.create(args, null)); + baseExceptionInitNode.execute(frame, self, args, keywords); + self.setExceptionAttributes(STOP_ITERATION_ATTR_FACTORY.create(args)); return PNone.NONE; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/SyntaxErrorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/SyntaxErrorBuiltins.java index e929e4184f..84dcfc8428 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/SyntaxErrorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/SyntaxErrorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,20 +43,23 @@ import static com.oracle.graal.python.nodes.ErrorMessages.MISSING_PARENTHESES_IN_CALL_TO_EXEC; import static com.oracle.graal.python.nodes.ErrorMessages.MISSING_PARENTHESES_IN_CALL_TO_PRINT; import static com.oracle.graal.python.nodes.ErrorMessages.TUPLE_OUT_OF_BOUNDS; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import java.util.List; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; +import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.lib.PyLongAsLongAndOverflowNode; import com.oracle.graal.python.lib.PyLongCheckExactNode; import com.oracle.graal.python.lib.PyObjectStrAsTruffleStringNode; @@ -70,7 +73,6 @@ import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.graal.python.util.OverflowException; -import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -94,14 +96,17 @@ public final class SyntaxErrorBuiltins extends PythonBuiltins { public static final int IDX_PRINT_FILE_AND_LINE = 7; public static final int SYNTAX_ERR_NUM_ATTRS = IDX_PRINT_FILE_AND_LINE + 1; - public static final BaseExceptionAttrNode.StorageFactory SYNTAX_ERROR_ATTR_FACTORY = (args, factory) -> new Object[SYNTAX_ERR_NUM_ATTRS]; + public static final BaseExceptionAttrNode.StorageFactory SYNTAX_ERROR_ATTR_FACTORY = (args) -> new Object[SYNTAX_ERR_NUM_ATTRS]; + + public static final TpSlots SLOTS = SyntaxErrorBuiltinsSlotsGen.SLOTS; @Override protected List> getNodeFactories() { return SyntaxErrorBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory public abstract static class SyntaxErrorInitNode extends PythonBuiltinNode { private static final String PREFIX_PRINT = "print "; @@ -111,7 +116,7 @@ public abstract static class SyntaxErrorInitNode extends PythonBuiltinNode { private static final char CHR_COMMA = ','; private static final char CHR_SEMICOLON = ';'; - @CompilerDirectives.TruffleBoundary + @TruffleBoundary private static String getLegacyPrintStatementMsg(String text) { int endPos = text.indexOf(CHR_SEMICOLON); if (endPos == -1) { @@ -128,7 +133,7 @@ private static String getLegacyPrintStatementMsg(String text) { return String.format(MISSING_PARENTHESES_IN_CALL_TO_PRINT.toJavaStringUncached(), data, maybeEndArg); } - @CompilerDirectives.TruffleBoundary + @TruffleBoundary private static Object checkForLegacyStatements(String text, int start) { // Ignore leading whitespace final String trimmedText = trimLeft(text, start); @@ -149,7 +154,7 @@ private static Object checkForLegacyStatements(String text, int start) { return null; } - @CompilerDirectives.TruffleBoundary + @TruffleBoundary private static Object reportMissingParentheses(Object msg, String text) { // Skip entirely if there is an opening parenthesis final int leftParenIndex = text.indexOf(CHR_LEFTPAREN); @@ -183,14 +188,14 @@ private static String trimLeft(String str, int start) { } @Specialization - static Object init(VirtualFrame frame, PBaseException self, Object[] args, + static Object init(VirtualFrame frame, PBaseException self, Object[] args, PKeyword[] keywords, @Bind("this") Node inliningTarget, @Cached CastToJavaStringNode castToJavaStringNode, @Cached TupleNodes.ConstructTupleNode constructTupleNode, @Cached SequenceStorageNodes.GetItemNode getItemNode, @Cached BaseExceptionBuiltins.BaseExceptionInitNode baseExceptionInitNode, - @Cached PRaiseNode.Lazy raiseNode) { - baseExceptionInitNode.execute(self, args); + @Cached PRaiseNode raiseNode) { + baseExceptionInitNode.execute(frame, self, args, keywords); Object[] attrs = SYNTAX_ERROR_ATTR_FACTORY.create(); if (args.length >= 1) { attrs[IDX_MSG] = args[0]; @@ -200,7 +205,7 @@ static Object init(VirtualFrame frame, PBaseException self, Object[] args, final SequenceStorage storage = info.getSequenceStorage(); if (storage.length() != 4) { // not a very good error message, but it's what Python 2.4 gives - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.IndexError, TUPLE_OUT_OF_BOUNDS); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.IndexError, TUPLE_OUT_OF_BOUNDS); } attrs[IDX_FILENAME] = getItemNode.execute(storage, 0); @@ -300,7 +305,7 @@ Object generic(PBaseException self, Object value, } } - @Builtin(name = J___STR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_str, isComplex = true) @GenerateNodeFactory public abstract static class SyntaxErrorStrNode extends PythonUnaryBuiltinNode { @Specialization diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/SystemExitBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/SystemExitBuiltins.java index 79b59ad75d..dce5260aa3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/SystemExitBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/SystemExitBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,18 +40,22 @@ */ package com.oracle.graal.python.builtins.objects.exception; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; - import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.function.PKeyword; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; @@ -60,12 +64,14 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.SystemExit) public final class SystemExitBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = SystemExitBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return SystemExitBuiltinsFactory.getFactories(); } - public static final BaseExceptionAttrNode.StorageFactory SYSTEM_EXIT_ATTR_FACTORY = (args, factory) -> { + public static final BaseExceptionAttrNode.StorageFactory SYSTEM_EXIT_ATTR_FACTORY = (args) -> { Object code; switch (args.length) { case 0: @@ -75,20 +81,20 @@ protected List> getNodeFa code = args[0]; break; default: - code = factory.createTuple(args); + code = PFactory.createTuple(PythonLanguage.get(null), args); } return new Object[]{code}; }; - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory public abstract static class InitNode extends PythonBuiltinNode { @Specialization - static Object initNoArgs(PBaseException self, Object[] args, - @Cached BaseExceptionBuiltins.BaseExceptionInitNode baseExceptionInitNode, - @Cached PythonObjectFactory factory) { - baseExceptionInitNode.execute(self, args); - self.setExceptionAttributes(SYSTEM_EXIT_ATTR_FACTORY.create(args, factory)); + static Object initNoArgs(PBaseException self, Object[] args, PKeyword[] keywords, + @Cached BaseExceptionBuiltins.BaseExceptionInitNode baseExceptionInitNode) { + baseExceptionInitNode.execute(null, self, args, keywords); + self.setExceptionAttributes(SYSTEM_EXIT_ATTR_FACTORY.create(args)); return PNone.NONE; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/UnicodeDecodeErrorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/UnicodeDecodeErrorBuiltins.java index a3d7b4c833..8ed216902a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/UnicodeDecodeErrorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/UnicodeDecodeErrorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -49,23 +49,25 @@ import static com.oracle.graal.python.builtins.objects.exception.UnicodeErrorBuiltins.getArgAsBytes; import static com.oracle.graal.python.builtins.objects.exception.UnicodeErrorBuiltins.getArgAsInt; import static com.oracle.graal.python.builtins.objects.exception.UnicodeErrorBuiltins.getArgAsString; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.UnicodeDecodeError; import java.util.List; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.bytes.PBytesLike; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; +import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.str.StringNodes.CastToTruffleStringCheckedNode; import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.lib.PyObjectSizeNode; import com.oracle.graal.python.lib.PyObjectStrAsTruffleStringNode; import com.oracle.graal.python.nodes.ErrorMessages; @@ -93,25 +95,28 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.UnicodeDecodeError) public final class UnicodeDecodeErrorBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = UnicodeDecodeErrorBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return UnicodeDecodeErrorBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory public abstract static class UnicodeDecodeErrorInitNode extends PythonBuiltinNode { public abstract Object execute(VirtualFrame frame, PBaseException self, Object[] args); @Specialization - static Object initNoArgs(VirtualFrame frame, PBaseException self, Object[] args, + static Object initNoArgs(VirtualFrame frame, PBaseException self, Object[] args, PKeyword[] keywords, @Bind("this") Node inliningTarget, @Cached UnicodeErrorBuiltins.GetArgAsBytesNode getArgAsBytesNode, @Cached CastToTruffleStringNode toStringNode, @Cached CastToJavaIntExactNode toJavaIntExactNode, @Cached BaseExceptionBuiltins.BaseExceptionInitNode baseInitNode, - @Cached PRaiseNode.Lazy raiseNode) { - baseInitNode.execute(self, args); + @Cached PRaiseNode raiseNode) { + baseInitNode.execute(frame, self, args, keywords); // PyArg_ParseTuple(args, "UOnnU"), TODO: add proper error messages self.setExceptionAttributes(new Object[]{ getArgAsString(inliningTarget, args, 0, raiseNode, toStringNode), @@ -124,7 +129,7 @@ static Object initNoArgs(VirtualFrame frame, PBaseException self, Object[] args, } } - @Builtin(name = J___STR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_str, isComplex = true) @GenerateNodeFactory public abstract static class UnicodeEncodeErrorStrNode extends PythonUnaryBuiltinNode { @Specialization @@ -177,14 +182,14 @@ static PBaseException createNew(VirtualFrame frame, Node inliningTarget, @Suppre int endPos, TruffleString reason, @Cached(inline = false) CallNode callNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object obj = callNode.execute(frame, UnicodeDecodeError, encoding, inputObject, startPos, endPos, reason); if (obj instanceof PBaseException exception) { return exception; } // Shouldn't happen unless the user manually replaces the method, which is really // unexpected and shouldn't be permitted at all, but currently it is - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.SHOULD_HAVE_RETURNED_EXCEPTION, UnicodeDecodeError, obj); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.SHOULD_HAVE_RETURNED_EXCEPTION, UnicodeDecodeError, obj); } @Specialization(guards = "exceptionObject != null") @@ -210,17 +215,17 @@ public abstract static class PyUnicodeDecodeErrorGetObjectNode extends Node { public abstract Object execute(Node inliningTarget, PBaseException exceptionObject); @Specialization - static Object doIt(VirtualFrame frame, Node inliningTarget, PBaseException exceptionObject, + static Object doIt(Node inliningTarget, PBaseException exceptionObject, @Cached(inline = false) BaseExceptionAttrNode attrNode, @Cached GetClassNode getClassNode, @Cached(inline = false) IsSubtypeNode isSubtypeNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object obj = attrNode.get(exceptionObject, IDX_OBJECT, UNICODE_ERROR_ATTR_FACTORY); if (obj == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_ATTRIBUTE_NOT_SET, "object"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_ATTRIBUTE_NOT_SET, "object"); } - if (!isSubtypeNode.execute(frame, getClassNode.execute(inliningTarget, obj), PythonBuiltinClassType.PBytes)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_ATTRIBUTE_MUST_BE_BYTES, "object"); + if (!isSubtypeNode.execute(getClassNode.execute(inliningTarget, obj), PythonBuiltinClassType.PBytes)) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_ATTRIBUTE_MUST_BE_BYTES, "object"); } return obj; } @@ -297,10 +302,10 @@ public abstract static class PyUnicodeDecodeErrorGetEncodingNode extends Node { static TruffleString doIt(Node inliningTarget, PBaseException exceptionObject, @Cached(inline = false) BaseExceptionAttrNode attrNode, @Cached CastToTruffleStringCheckedNode castToStringNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object obj = attrNode.get(exceptionObject, IDX_ENCODING, UNICODE_ERROR_ATTR_FACTORY); if (obj == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_ATTRIBUTE_NOT_SET, "encoding"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_ATTRIBUTE_NOT_SET, "encoding"); } return castToStringNode.cast(inliningTarget, obj, ErrorMessages.S_ATTRIBUTE_MUST_BE_UNICODE, "encoding"); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/UnicodeEncodeErrorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/UnicodeEncodeErrorBuiltins.java index 36f7588105..ecb356adee 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/UnicodeEncodeErrorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/UnicodeEncodeErrorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -49,20 +49,22 @@ import static com.oracle.graal.python.builtins.objects.exception.UnicodeErrorBuiltins.UNICODE_ERROR_ATTR_FACTORY; import static com.oracle.graal.python.builtins.objects.exception.UnicodeErrorBuiltins.getArgAsInt; import static com.oracle.graal.python.builtins.objects.exception.UnicodeErrorBuiltins.getArgAsString; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import java.util.List; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.str.StringNodes.CastToTruffleStringCheckedNode; import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.lib.PyObjectStrAsTruffleStringNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; @@ -86,24 +88,27 @@ @CoreFunctions(extendClasses = UnicodeEncodeError) public final class UnicodeEncodeErrorBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = UnicodeEncodeErrorBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return UnicodeEncodeErrorBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory public abstract static class UnicodeEncodeErrorInitNode extends PythonBuiltinNode { - public abstract Object execute(PBaseException self, Object[] args); @Specialization - static Object initNoArgs(PBaseException self, Object[] args, + static Object initNoArgs(VirtualFrame frame, PBaseException self, Object[] args, PKeyword[] keywords, @Bind("this") Node inliningTarget, @Cached CastToTruffleStringNode toStringNode, @Cached CastToJavaIntExactNode toJavaIntExactNode, @Cached BaseExceptionBuiltins.BaseExceptionInitNode baseInitNode, - @Cached PRaiseNode.Lazy raiseNode) { - baseInitNode.execute(self, args); + @Cached PRaiseNode raiseNode) { + baseInitNode.execute(frame, self, args, keywords); // PyArg_ParseTuple(args, "UUnnU"), TODO: add proper error messages self.setExceptionAttributes(new Object[]{ getArgAsString(inliningTarget, args, 0, raiseNode, toStringNode), @@ -116,7 +121,7 @@ static Object initNoArgs(PBaseException self, Object[] args, } } - @Builtin(name = J___STR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_str, isComplex = true) @GenerateNodeFactory public abstract static class UnicodeEncodeErrorStrNode extends PythonUnaryBuiltinNode { @Specialization @@ -178,14 +183,14 @@ static PBaseException createNew(VirtualFrame frame, Node inliningTarget, @Suppre int startPos, int endPos, TruffleString reason, @Cached(inline = false) CallNode callNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object obj = callNode.execute(frame, UnicodeEncodeError, encoding, inputObject, startPos, endPos, reason); if (obj instanceof PBaseException exception) { return exception; } // Shouldn't happen unless the user manually replaces the method, which is really // unexpected and shouldn't be permitted at all, but currently it is - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.SHOULD_HAVE_RETURNED_EXCEPTION, UnicodeEncodeError, obj); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.SHOULD_HAVE_RETURNED_EXCEPTION, UnicodeEncodeError, obj); } @Specialization(guards = "exceptionObject != null") @@ -214,10 +219,10 @@ public abstract static class PyUnicodeEncodeOrTranslateErrorGetObjectNode extend static TruffleString doIt(Node inliningTarget, PBaseException exceptionObject, @Cached(inline = false) BaseExceptionAttrNode attrNode, @Cached CastToTruffleStringCheckedNode castToStringNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object obj = attrNode.get(exceptionObject, IDX_OBJECT, UNICODE_ERROR_ATTR_FACTORY); if (obj == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_ATTRIBUTE_NOT_SET, "object"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_ATTRIBUTE_NOT_SET, "object"); } return castToStringNode.cast(inliningTarget, obj, ErrorMessages.S_ATTRIBUTE_MUST_BE_UNICODE, "object"); } @@ -294,10 +299,10 @@ public abstract static class PyUnicodeEncodeErrorGetEncodingNode extends Node { static TruffleString doIt(Node inliningTarget, PBaseException exceptionObject, @Cached(inline = false) BaseExceptionAttrNode attrNode, @Cached CastToTruffleStringCheckedNode castToStringNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object obj = attrNode.get(exceptionObject, IDX_ENCODING, UNICODE_ERROR_ATTR_FACTORY); if (obj == null) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_ATTRIBUTE_NOT_SET, "encoding"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_ATTRIBUTE_NOT_SET, "encoding"); } return castToStringNode.cast(inliningTarget, obj, ErrorMessages.S_ATTRIBUTE_MUST_BE_UNICODE, "encoding"); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/UnicodeErrorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/UnicodeErrorBuiltins.java index ed6fa8973d..38d08d7198 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/UnicodeErrorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/UnicodeErrorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,6 +44,7 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -60,7 +61,7 @@ import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.IndirectCallData; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -84,24 +85,24 @@ public final class UnicodeErrorBuiltins extends PythonBuiltins { public static final int IDX_REASON = 4; public static final int UNICODE_ERR_NUM_ATTRS = IDX_REASON + 1; - public static final BaseExceptionAttrNode.StorageFactory UNICODE_ERROR_ATTR_FACTORY = (args, factory) -> new Object[UNICODE_ERR_NUM_ATTRS]; + public static final BaseExceptionAttrNode.StorageFactory UNICODE_ERROR_ATTR_FACTORY = (args) -> new Object[UNICODE_ERR_NUM_ATTRS]; @Override protected List> getNodeFactories() { return UnicodeErrorBuiltinsFactory.getFactories(); } - public static TruffleString getArgAsString(Node inliningTarget, Object[] args, int index, PRaiseNode.Lazy raiseNode, CastToTruffleStringNode castNode) { + public static TruffleString getArgAsString(Node inliningTarget, Object[] args, int index, PRaiseNode raiseNode, CastToTruffleStringNode castNode) { if (args.length < index + 1 || !PGuards.isString(args[index])) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError); } else { return castNode.execute(inliningTarget, args[index]); } } - public static int getArgAsInt(Node inliningTarget, Object[] args, int index, PRaiseNode.Lazy raiseNode, CastToJavaIntExactNode castNode) { + public static int getArgAsInt(Node inliningTarget, Object[] args, int index, PRaiseNode raiseNode, CastToJavaIntExactNode castNode) { if (args.length < index + 1 || !(PGuards.isInteger(args[index]) || PGuards.isPInt(args[index]))) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError); } else { return castNode.execute(inliningTarget, args[index]); } @@ -115,11 +116,11 @@ public abstract static class GetArgAsBytesNode extends PNodeWithContext { @Specialization @TruffleBoundary static PBytes doString(TruffleString value, - @Shared @Cached(inline = false) PythonObjectFactory factory) { + @Bind PythonLanguage language) { // TODO GR-37601: cbasca cPython works directly with bytes while we have Java strings // which are encoded, here we decode using the system encoding but this might not be the // correct / ideal case - return factory.createBytes(value.toJavaStringUncached().getBytes()); + return PFactory.createBytes(language, value.toJavaStringUncached().getBytes()); } @Specialization @@ -131,20 +132,20 @@ static PBytes doBytes(PBytes value) { static PBytes doOther(VirtualFrame frame, Object value, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") PythonBufferAccessLibrary bufferLib, - @Shared @Cached(inline = false) PythonObjectFactory factory) { + @Bind PythonLanguage language) { try { final byte[] buffer = bufferLib.getInternalOrCopiedByteArray(value); final int bufferLength = bufferLib.getBufferLength(value); - return factory.createBytes(buffer, 0, bufferLength); + return PFactory.createBytes(language, buffer, bufferLength); } finally { bufferLib.release(value, frame, indirectCallData); } } } - public static Object getArgAsBytes(VirtualFrame frame, Node inliningTarget, Object[] args, int index, PRaiseNode.Lazy raiseNode, GetArgAsBytesNode getArgAsBytesNode) { + public static Object getArgAsBytes(VirtualFrame frame, Node inliningTarget, Object[] args, int index, PRaiseNode raiseNode, GetArgAsBytesNode getArgAsBytesNode) { if (args.length < index + 1) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError); } else { return getArgAsBytesNode.execute(frame, inliningTarget, args[index]); } @@ -208,8 +209,8 @@ static Object setPInt(PBaseException self, PInt value, @Specialization(guards = {"!isNoValue(value)", "!canBeInteger(value)"}) @SuppressWarnings("unused") static Object generic(PBaseException self, Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, INTEGER_REQUIRED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, INTEGER_REQUIRED); } } @@ -245,8 +246,8 @@ static Object setPInt(PBaseException self, PInt value, @Specialization(guards = {"!isNoValue(value)", "!canBeInteger(value)"}) @SuppressWarnings("unused") static Object generic(PBaseException self, Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, INTEGER_REQUIRED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, INTEGER_REQUIRED); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/UnicodeTranslateErrorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/UnicodeTranslateErrorBuiltins.java index 3ffffd7c75..de7cabf855 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/UnicodeTranslateErrorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/UnicodeTranslateErrorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,19 +47,21 @@ import static com.oracle.graal.python.builtins.objects.exception.UnicodeErrorBuiltins.UNICODE_ERROR_ATTR_FACTORY; import static com.oracle.graal.python.builtins.objects.exception.UnicodeErrorBuiltins.getArgAsInt; import static com.oracle.graal.python.builtins.objects.exception.UnicodeErrorBuiltins.getArgAsString; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import java.util.List; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.lib.PyObjectStrAsTruffleStringNode; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; @@ -80,24 +82,26 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.UnicodeTranslateError) public final class UnicodeTranslateErrorBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = UnicodeTranslateErrorBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return UnicodeTranslateErrorBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory public abstract static class UnicodeTranslateErrorInitNode extends PythonBuiltinNode { - public abstract Object execute(PBaseException self, Object[] args); @Specialization - static Object initNoArgs(PBaseException self, Object[] args, + static Object initNoArgs(VirtualFrame frame, PBaseException self, Object[] args, PKeyword[] keywords, @Bind("this") Node inliningTarget, @Cached CastToTruffleStringNode toStringNode, @Cached CastToJavaIntExactNode toJavaIntExactNode, @Cached BaseExceptionBuiltins.BaseExceptionInitNode baseInitNode, - @Cached PRaiseNode.Lazy raiseNode) { - baseInitNode.execute(self, args); + @Cached PRaiseNode raiseNode) { + baseInitNode.execute(frame, self, args, keywords); // PyArg_ParseTuple(args, "UnnU"), TODO: add proper error messages self.setExceptionAttributes(new Object[]{ null, // placeholder for object so we do not redefine the access indexes @@ -112,7 +116,7 @@ static Object initNoArgs(PBaseException self, Object[] args, } } - @Builtin(name = J___STR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_str, isComplex = true) @GenerateNodeFactory public abstract static class UnicodeTranslateErrorStrNode extends PythonUnaryBuiltinNode { @Specialization diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/FloatBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/FloatBuiltins.java index ee18afa692..2ec6609e3d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/FloatBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/FloatBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -28,38 +28,12 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; import static com.oracle.graal.python.nodes.BuiltinNames.J_FLOAT; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ABS__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CEIL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DIVMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOAT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOORDIV__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOOR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FORMAT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GETFORMAT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GETNEWARGS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___MOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEG__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___POS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___POW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RDIVMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RFLOORDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RMOD__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROUND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RPOW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RSUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RTRUEDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___TRUEDIV__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___TRUNC__; import static com.oracle.graal.python.runtime.formatting.FormattingUtils.validateForFloat; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; @@ -71,32 +45,44 @@ import java.nio.ByteOrder; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes; import com.oracle.graal.python.builtins.objects.common.FormatNodeBase; import com.oracle.graal.python.builtins.objects.floats.FloatBuiltinsClinicProviders.FormatNodeClinicProviderGen; import com.oracle.graal.python.builtins.objects.floats.FloatUtils.PFloatUnboxing; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.HashBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.NbBoolBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare; import com.oracle.graal.python.lib.PyFloatCheckNode; +import com.oracle.graal.python.lib.PyFloatFromString; import com.oracle.graal.python.lib.PyLongFromDoubleNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; +import com.oracle.graal.python.lib.PyNumberFloatNode; +import com.oracle.graal.python.lib.PyNumberPowerNode; import com.oracle.graal.python.lib.PyObjectHashNode; +import com.oracle.graal.python.lib.PyUnicodeCheckExactNode; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallTernaryNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallVarargsNode; +import com.oracle.graal.python.nodes.call.CallNode; +import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; @@ -104,7 +90,7 @@ import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; +import com.oracle.graal.python.nodes.object.BuiltinClassProfiles; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaDoubleNode; import com.oracle.graal.python.runtime.exception.PException; @@ -112,7 +98,7 @@ import com.oracle.graal.python.runtime.formatting.FloatFormatter; import com.oracle.graal.python.runtime.formatting.InternalFormat; import com.oracle.graal.python.runtime.formatting.InternalFormat.Spec; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; @@ -125,12 +111,15 @@ import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.UnexpectedResultException; +import com.oracle.truffle.api.object.Shape; +import com.oracle.truffle.api.profiles.BranchProfile; import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.strings.TruffleString.FromJavaStringNode; @@ -152,13 +141,13 @@ private static double castToDoubleChecked(Node inliningTarget, Object obj, CastT try { return cast.execute(inliningTarget, obj); } catch (CannotCastException e) { - throw raiseWrongSelf(obj); + throw raiseWrongSelf(inliningTarget, obj); } } @InliningCutoff - private static PException raiseWrongSelf(Object obj) { - throw PRaiseNode.getUncached().raise(TypeError, ErrorMessages.DESCRIPTOR_REQUIRES_S_OBJ_RECEIVED_P, "float", obj); + private static PException raiseWrongSelf(Node inliningTarget, Object obj) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.DESCRIPTOR_REQUIRES_S_OBJ_RECEIVED_P, "float", obj); } @GenerateCached(false) @@ -181,7 +170,7 @@ Object doOther(Object object, @GenerateCached(false) abstract static class AbstractNumericBinaryBuiltin extends BinaryOpBuiltinNode { - @Child private PRaiseNode raiseNode; + private final BranchProfile errorProfile = BranchProfile.create(); protected abstract Object op(double a, double b); @@ -213,20 +202,132 @@ Object doOther(Object a, Object b, void raiseDivisionByZero(boolean cond) { if (cond) { - if (raiseNode == null) { + errorProfile.enter(); + throw PRaiseNode.raiseStatic(this, PythonErrorType.ZeroDivisionError, ErrorMessages.DIVISION_BY_ZERO); + } + } + } + + // float([x]) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_FLOAT, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2) + @GenerateNodeFactory + public abstract static class FloatNewNode extends PythonBinaryBuiltinNode { + + @Child NonPrimitiveFloatNode nonPrimitiveFloatNode; + + @Specialization + Object doIt(VirtualFrame frame, Object cls, Object arg, + @Bind("this") Node inliningTarget, + @Cached BuiltinClassProfiles.IsBuiltinClassExactProfile isPrimitiveFloatProfile, + @Cached PrimitiveFloatNode primitiveFloatNode, + @Cached TypeNodes.NeedsNativeAllocationNode needsNativeAllocationNode) { + if (isPrimitiveFloat(inliningTarget, cls, isPrimitiveFloatProfile)) { + return primitiveFloatNode.execute(frame, inliningTarget, arg); + } else { + boolean needsNativeAllocation = needsNativeAllocationNode.execute(inliningTarget, cls); + if (nonPrimitiveFloatNode == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); - if (isAdoptable()) { - raiseNode = insert(PRaiseNode.create()); - } else { - raiseNode = PRaiseNode.getUncached(); - } + nonPrimitiveFloatNode = insert(FloatBuiltinsFactory.FloatNewNodeFactory.NonPrimitiveFloatNodeGen.create()); } - throw raiseNode.raise(PythonErrorType.ZeroDivisionError, ErrorMessages.DIVISION_BY_ZERO); + return nonPrimitiveFloatNode.execute(frame, cls, arg, needsNativeAllocation); } } + + @GenerateCached(false) + @GenerateInline + @ImportStatic(PGuards.class) + abstract static class PrimitiveFloatNode extends Node { + abstract double execute(VirtualFrame frame, Node inliningTarget, Object arg); + + @Specialization + static double floatFromDouble(double arg) { + return arg; + } + + @Specialization + static double floatFromInt(int arg) { + return arg; + } + + @Specialization + static double floatFromLong(long arg) { + return arg; + } + + @Specialization + static double floatFromBoolean(boolean arg) { + return arg ? 1d : 0d; + } + + @Specialization(guards = "isNoValue(obj)") + static double floatFromNoValue(@SuppressWarnings("unused") PNone obj) { + return 0.0; + } + + @Fallback + @InliningCutoff + static double floatFromObject(VirtualFrame frame, Node inliningTarget, Object obj, + @Cached PyUnicodeCheckExactNode stringCheck, + @Cached PyFloatFromString fromString, + @Cached PyNumberFloatNode pyNumberFloat) { + if (stringCheck.execute(inliningTarget, obj)) { + return fromString.execute(frame, inliningTarget, obj); + } + return pyNumberFloat.execute(frame, inliningTarget, obj); + } + } + + @ImportStatic(PGuards.class) + @GenerateInline(false) // intentionally lazy + abstract static class NonPrimitiveFloatNode extends Node { + abstract Object execute(VirtualFrame frame, Object cls, Object arg, boolean needsNativeAllocation); + + @Specialization(guards = {"!needsNativeAllocation", "isNoValue(obj)"}) + @InliningCutoff + static Object floatFromNoneManagedSubclass(Object cls, PNone obj, @SuppressWarnings("unused") boolean needsNativeAllocation, + @Bind PythonLanguage language, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) { + Shape shape = getInstanceShape.execute(cls); + return PFactory.createFloat(language, cls, shape, PrimitiveFloatNode.floatFromNoValue(obj)); + } + + @Specialization(guards = "!needsNativeAllocation") + @InliningCutoff + static Object floatFromObjectManagedSubclass(VirtualFrame frame, Object cls, Object obj, @SuppressWarnings("unused") boolean needsNativeAllocation, + @Bind("this") @SuppressWarnings("unused") Node inliningTarget, + @Bind PythonLanguage language, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Shared @Cached PrimitiveFloatNode recursiveCallNode) { + Shape shape = getInstanceShape.execute(cls); + return PFactory.createFloat(language, cls, shape, recursiveCallNode.execute(frame, inliningTarget, obj)); + } + + // logic similar to float_subtype_new(PyTypeObject *type, PyObject *x) from CPython + // floatobject.c we have to first create a temporary float, then fill it into + // a natively allocated subtype structure + @Specialization(guards = {"needsNativeAllocation", // + "isSubtypeOfFloat( isSubtype, cls)"}, limit = "1") + @InliningCutoff + static Object floatFromObjectNativeSubclass(VirtualFrame frame, Object cls, Object obj, @SuppressWarnings("unused") boolean needsNativeAllocation, + @Bind("this") @SuppressWarnings("unused") Node inliningTarget, + @Cached @SuppressWarnings("unused") IsSubtypeNode isSubtype, + @Cached CExtNodes.FloatSubtypeNew subtypeNew, + @Shared @Cached PrimitiveFloatNode recursiveCallNode) { + return subtypeNew.call(cls, recursiveCallNode.execute(frame, inliningTarget, obj)); + } + + protected static boolean isSubtypeOfFloat(IsSubtypeNode isSubtypeNode, Object cls) { + return isSubtypeNode.execute(cls, PythonBuiltinClassType.PFloat); + } + } + + protected static boolean isPrimitiveFloat(Node inliningTarget, Object cls, BuiltinClassProfiles.IsBuiltinClassExactProfile isPrimitiveProfile) { + return isPrimitiveProfile.profileClass(inliningTarget, cls, PythonBuiltinClassType.PFloat); + } } - @Builtin(name = J___STR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_str, isComplex = true) @GenerateNodeFactory public abstract static class StrNode extends AbstractNumericUnaryBuiltin { public static final Spec spec = new Spec(' ', '>', Spec.NONE, false, Spec.UNSPECIFIED, Spec.NONE, 0, 'r'); @@ -244,7 +345,7 @@ public static TruffleString doFormat(double d, FloatFormatter f) { } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends StrNode { } @@ -274,7 +375,7 @@ private static TruffleString doFormat(Node raisingNode, double self, TruffleStri } } - @Builtin(name = J___ABS__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.nb_absolute, isComplex = true) @GenerateNodeFactory abstract static class AbsNode extends AbstractNumericUnaryBuiltin { @@ -305,7 +406,7 @@ static boolean doOther(Object object, } } - @Builtin(name = J___INT__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.nb_int, isComplex = true) @Builtin(name = J___TRUNC__, minNumOfPositionalArgs = 1) @GenerateNodeFactory abstract static class IntNode extends PythonUnaryBuiltinNode { @@ -319,7 +420,7 @@ static Object doDouble(Object self, } } - @Builtin(name = J___FLOAT__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.nb_float, isComplex = true) @GenerateNodeFactory abstract static class FloatNode extends AbstractNumericUnaryBuiltin { @Override @@ -338,8 +439,7 @@ protected Object op(double a, double b) { } } - @Builtin(name = J___RSUB__, minNumOfPositionalArgs = 2, reverseOperation = true) - @Builtin(name = J___SUB__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.nb_subtract, isComplex = true) @GenerateNodeFactory abstract static class SubNode extends AbstractNumericBinaryBuiltin { @@ -359,8 +459,7 @@ protected Object op(double a, double b) { } } - @Builtin(name = J___RPOW__, minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 3, reverseOperation = true) - @Builtin(name = J___POW__, minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 3) + @Slot(value = SlotKind.nb_power, isComplex = true) @GenerateNodeFactory public abstract static class PowNode extends PythonTernaryBuiltinNode { protected abstract double executeDouble(VirtualFrame frame, double left, double right, PNone none) throws UnexpectedResultException; @@ -378,7 +477,7 @@ public final Object execute(double left, double right) { @Specialization static double doDI(double left, int right, @SuppressWarnings("unused") PNone none, @Bind("this") Node inliningTarget, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { return doOperation(inliningTarget, left, right, raiseNode); } @@ -386,7 +485,7 @@ static double doDI(double left, int right, @SuppressWarnings("unused") PNone non * The special cases we need to deal with always return 1, so 0 means no special case, not a * result. */ - private static double doSpecialCases(Node inliningTarget, double left, double right, PRaiseNode.Lazy raiseNode) { + private static double doSpecialCases(Node inliningTarget, double left, double right, PRaiseNode raiseNode) { // see cpython://Objects/floatobject.c#float_pow for special cases if (Double.isNaN(right) && left == 1) { // 1**nan = 1, unlike on Java @@ -398,12 +497,12 @@ private static double doSpecialCases(Node inliningTarget, double left, double ri } if (left == 0 && right < 0 && Double.isFinite(right)) { // 0**w is an error if w is finite and negative, unlike Java - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ZeroDivisionError, ErrorMessages.POW_ZERO_CANNOT_RAISE_TO_NEGATIVE_POWER); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ZeroDivisionError, ErrorMessages.POW_ZERO_CANNOT_RAISE_TO_NEGATIVE_POWER); } return 0; } - private static double doOperation(Node inliningTarget, double left, double right, PRaiseNode.Lazy raiseNode) { + private static double doOperation(Node inliningTarget, double left, double right, PRaiseNode raiseNode) { if (doSpecialCases(inliningTarget, left, right, raiseNode) == 1) { return 1.0; } @@ -414,16 +513,16 @@ private static double doOperation(Node inliningTarget, double left, double right @InliningCutoff static double doDD(VirtualFrame frame, double left, double right, @SuppressWarnings("unused") PNone none, @Bind("this") Node inliningTarget, - @Shared("powCall") @Cached("create(Pow)") LookupAndCallTernaryNode callPow, - @Shared @Cached PRaiseNode.Lazy raiseNode) throws UnexpectedResultException { + @Shared @Cached PyNumberPowerNode powerNode, + @Shared @Cached PRaiseNode raiseNode) throws UnexpectedResultException { if (doSpecialCases(inliningTarget, left, right, raiseNode) == 1) { return 1.0; } if (left < 0 && Double.isFinite(left) && Double.isFinite(right) && (right % 1 != 0)) { CompilerDirectives.transferToInterpreterAndInvalidate(); // Negative numbers raised to fractional powers become complex. - PythonObjectFactory factory = PythonObjectFactory.getUncached(); - throw new UnexpectedResultException(callPow.execute(frame, factory.createComplex(left, 0), factory.createComplex(right, 0), none)); + PythonLanguage language = PythonLanguage.get(inliningTarget); + throw new UnexpectedResultException(powerNode.execute(frame, PFactory.createComplex(language, left, 0), PFactory.createComplex(language, right, 0), none)); } return Math.pow(left, right); } @@ -432,16 +531,15 @@ static double doDD(VirtualFrame frame, double left, double right, @SuppressWarni @InliningCutoff static Object doDDToComplex(VirtualFrame frame, double left, double right, PNone none, @Bind("this") Node inliningTarget, - @Shared("powCall") @Cached("create(Pow)") LookupAndCallTernaryNode callPow, - @Exclusive @Cached PythonObjectFactory.Lazy factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PyNumberPowerNode powerNode, + @Exclusive @Cached PRaiseNode raiseNode) { if (doSpecialCases(inliningTarget, left, right, raiseNode) == 1) { return 1.0; } if (left < 0 && Double.isFinite(left) && Double.isFinite(right) && (right % 1 != 0)) { // Negative numbers raised to fractional powers become complex. - PythonObjectFactory pof = factory.get(inliningTarget); - return callPow.execute(frame, pof.createComplex(left, 0), pof.createComplex(right, 0), none); + PythonLanguage language = PythonLanguage.get(inliningTarget); + return powerNode.execute(frame, PFactory.createComplex(language, left, 0), PFactory.createComplex(language, right, 0), none); } return Math.pow(left, right); } @@ -451,11 +549,10 @@ static Object doDDToComplex(VirtualFrame frame, double left, double right, PNone static Object doGeneric(VirtualFrame frame, Object left, Object right, Object mod, @Bind("this") Node inliningTarget, @Cached CastToJavaDoubleNode castToJavaDoubleNode, - @Shared("powCall") @Cached("create(Pow)") LookupAndCallTernaryNode callPow, - @Exclusive @Cached PythonObjectFactory.Lazy factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PyNumberPowerNode powerNode, + @Exclusive @Cached PRaiseNode raiseNode) { if (!(mod instanceof PNone)) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.POW_3RD_ARG_NOT_ALLOWED_UNLESS_INTEGERS); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.POW_3RD_ARG_NOT_ALLOWED_UNLESS_INTEGERS); } double leftDouble, rightDouble; @@ -465,7 +562,7 @@ static Object doGeneric(VirtualFrame frame, Object left, Object right, Object mo } catch (CannotCastException e) { return PNotImplemented.NOT_IMPLEMENTED; } - return doDDToComplex(frame, leftDouble, rightDouble, PNone.NONE, inliningTarget, callPow, factory, raiseNode); + return doDDToComplex(frame, leftDouble, rightDouble, PNone.NONE, inliningTarget, powerNode, raiseNode); } public static PowNode create() { @@ -473,8 +570,7 @@ public static PowNode create() { } } - @Builtin(name = J___RFLOORDIV__, minNumOfPositionalArgs = 2, reverseOperation = true) - @Builtin(name = J___FLOORDIV__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.nb_floor_divide, isComplex = true) @GenerateNodeFactory abstract static class FloorDivNode extends AbstractNumericBinaryBuiltin { @Override @@ -484,31 +580,36 @@ protected Object op(double left, double right) { } } - @Builtin(name = J___RDIVMOD__, minNumOfPositionalArgs = 2, reverseOperation = true) - @Builtin(name = J___DIVMOD__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.nb_divmod, isComplex = true) @GenerateNodeFactory abstract static class DivModNode extends AbstractNumericBinaryBuiltin { - @Child private PythonObjectFactory factory = PythonObjectFactory.create(); @Override protected PTuple op(double left, double right) { raiseDivisionByZero(right == 0); - return factory.createTuple(new Object[]{Math.floor(left / right), ModNode.mod(left, right)}); + PythonLanguage language = PythonLanguage.get(this); + return PFactory.createTuple(language, new Object[]{Math.floor(left / right), ModNode.mod(left, right)}); } } - @Builtin(name = J___HASH__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_hash, isComplex = true) @GenerateNodeFactory - abstract static class HashNode extends AbstractNumericUnaryBuiltin { - @Override - protected Object op(double self) { - return PyObjectHashNode.hash(self); + abstract static class HashNode extends HashBuiltinNode { + @Specialization + static long doDouble(double num) { + return PyObjectHashNode.hash(num); + } + + @Specialization(replaces = "doDouble") + static long doOther(Object object, + @Bind("this") Node inliningTarget, + @Cached CastToJavaDoubleNode cast) { + return doDouble(castToDoubleChecked(inliningTarget, object, cast)); } } @Builtin(name = "fromhex", minNumOfPositionalArgs = 2, isClassmethod = true) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) public abstract static class FromHexNode extends PythonBuiltinNode { @TruffleBoundary @@ -517,7 +618,7 @@ private double fromHex(String arg) { String str = arg.trim().toLowerCase(); if (str.isEmpty()) { - throw PRaiseNode.raiseUncached(this, PythonErrorType.ValueError, ErrorMessages.INVALID_STRING); + throw PRaiseNode.raiseStatic(this, PythonErrorType.ValueError, ErrorMessages.INVALID_STRING); } else if (str.equals("inf") || str.equals("infinity") || str.equals("+inf") || str.equals("+infinity")) { return Double.POSITIVE_INFINITY; } else if (str.equals("-inf") || str.equals("-infinity")) { @@ -534,7 +635,7 @@ private double fromHex(String arg) { } if (str.isEmpty()) { - throw PRaiseNode.raiseUncached(this, PythonErrorType.ValueError, ErrorMessages.INVALID_STRING); + throw PRaiseNode.raiseStatic(this, PythonErrorType.ValueError, ErrorMessages.INVALID_STRING); } if (!str.startsWith("0x")) { @@ -552,12 +653,12 @@ private double fromHex(String arg) { try { double result = Double.parseDouble(str); if (Double.isInfinite(result)) { - throw PRaiseNode.raiseUncached(this, PythonErrorType.OverflowError, ErrorMessages.HEX_VALUE_TOO_LARGE_AS_FLOAT); + throw PRaiseNode.raiseStatic(this, PythonErrorType.OverflowError, ErrorMessages.HEX_VALUE_TOO_LARGE_AS_FLOAT); } return result; } catch (NumberFormatException ex) { - throw PRaiseNode.raiseUncached(this, PythonErrorType.ValueError, ErrorMessages.INVALID_STRING); + throw PRaiseNode.raiseStatic(this, PythonErrorType.ValueError, ErrorMessages.INVALID_STRING); } } @@ -568,18 +669,18 @@ private double fromHex(String arg) { } @Specialization(guards = "!isPythonBuiltinClass(cl)") - Object fromhexO(Object cl, TruffleString arg, - @Cached("create(T___CALL__)") LookupAndCallVarargsNode constr, + Object fromhexO(VirtualFrame frame, Object cl, TruffleString arg, + @Cached CallNode callNode, @Shared("ts2js") @Cached TruffleString.ToJavaStringNode toJavaStringNode) { double value = fromHex(toJavaStringNode.execute(arg)); - return constr.execute(null, cl, new Object[]{cl, value}); + return callNode.execute(frame, cl, value); } @Fallback @SuppressWarnings("unused") static double fromhex(Object object, Object arg, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.TypeError, ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP); } } @@ -634,8 +735,7 @@ static TruffleString doDouble(Object value, } } - @Builtin(name = J___RMOD__, minNumOfPositionalArgs = 2, reverseOperation = true) - @Builtin(name = J___MOD__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.nb_remainder, isComplex = true) @GenerateNodeFactory public abstract static class ModNode extends AbstractNumericBinaryBuiltin { @Override @@ -657,8 +757,7 @@ public static double mod(double left, double right) { } } - @Builtin(name = J___RTRUEDIV__, minNumOfPositionalArgs = 2, reverseOperation = true) - @Builtin(name = J___TRUEDIV__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.nb_true_divide, isComplex = true) @GenerateNodeFactory abstract static class DivNode extends AbstractNumericBinaryBuiltin { @Override @@ -699,14 +798,14 @@ private static double op(double x, int n) { @Specialization static double round(double x, int n, @Bind("this") Node inliningTarget, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (Double.isNaN(x) || Double.isInfinite(x) || x == 0.0) { // nans, infinities and zeros round to themselves return x; } double d = op(x, n); if (Double.isInfinite(d)) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.ROUNDED_VALUE_TOO_LARGE); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.ROUNDED_VALUE_TOO_LARGE); } return d; } @@ -716,29 +815,29 @@ static Object round(VirtualFrame frame, Object x, Object n, @Bind("this") Node inliningTarget, @Exclusive @Cached CastToJavaDoubleNode cast, @Cached PyNumberAsSizeNode asSizeNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { return round(castToDoubleChecked(inliningTarget, x, cast), asSizeNode.executeLossy(frame, inliningTarget, n), inliningTarget, raiseNode); } @Specialization static Object round(Object xObj, @SuppressWarnings("unused") PNone none, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Exclusive @Cached CastToJavaDoubleNode cast, @Cached InlinedConditionProfile nanProfile, @Cached InlinedConditionProfile infProfile, @Cached InlinedConditionProfile isLongProfile, - @Cached PythonObjectFactory.Lazy factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { double x = castToDoubleChecked(inliningTarget, xObj, cast); if (nanProfile.profile(inliningTarget, Double.isNaN(x))) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.ValueError, ErrorMessages.CANNOT_CONVERT_S_TO_INT, "float NaN"); + throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ErrorMessages.CANNOT_CONVERT_S_TO_INT, "float NaN"); } if (infProfile.profile(inliningTarget, Double.isInfinite(x))) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.OverflowError, ErrorMessages.CANNOT_CONVERT_S_TO_INT, "float infinity"); + throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError, ErrorMessages.CANNOT_CONVERT_S_TO_INT, "float infinity"); } double result = round(x, 0, inliningTarget, raiseNode); if (isLongProfile.profile(inliningTarget, result > Long.MAX_VALUE || result < Long.MIN_VALUE)) { - return factory.get(inliningTarget).createInt(toBigInteger(result)); + return PFactory.createInt(language, toBigInteger(result)); } else { return (long) result; } @@ -752,72 +851,70 @@ private static BigInteger toBigInteger(double d) { @GenerateInline @GenerateCached(false) + @GenerateUncached @TypeSystemReference(PFloatUnboxing.class) public abstract static class ComparisonHelperNode extends Node { - @FunctionalInterface - interface Op { - boolean compute(double a, double b); - } - - abstract Object execute(Node inliningTarget, Object left, Object right, Op op); + abstract Object execute(Node inliningTarget, Object left, Object right, RichCmpOp op); @Specialization - static boolean doDD(double a, double b, Op op) { - return op.compute(a, b); + static boolean doDD(double a, double b, RichCmpOp op) { + return op.compare(a, b); } @Specialization - static boolean doDI(double a, int b, Op op) { - return op.compute(a, b); + static boolean doDI(double a, int b, RichCmpOp op) { + return op.compare(a, b); } @Specialization(guards = "check.execute(inliningTarget, bObj)", replaces = "doDD", limit = "1") @InliningCutoff - static boolean doOO(Node inliningTarget, Object aObj, Object bObj, Op op, + static boolean doOO(Node inliningTarget, Object aObj, Object bObj, RichCmpOp op, @SuppressWarnings("unused") @Cached PyFloatCheckNode check, @Exclusive @Cached CastToJavaDoubleNode cast) { double a = castToDoubleChecked(inliningTarget, aObj, cast); double b = castToDoubleChecked(inliningTarget, bObj, cast); - return op.compute(a, b); + return op.compare(a, b); } @Specialization(replaces = "doDI") @InliningCutoff - static boolean doOI(Node inliningTarget, Object aObj, int b, Op op, + static boolean doOI(Node inliningTarget, Object aObj, int b, RichCmpOp op, @Shared @Cached CastToJavaDoubleNode cast) { double a = castToDoubleChecked(inliningTarget, aObj, cast); - return op.compute(a, b); + return op.compare(a, b); } @Specialization @InliningCutoff - static boolean doOL(Node inliningTarget, Object aObj, long b, Op op, + static boolean doOL(Node inliningTarget, Object aObj, long b, RichCmpOp op, @Exclusive @Cached CastToJavaDoubleNode cast, @Cached InlinedConditionProfile longFitsToDoubleProfile) { double a = castToDoubleChecked(inliningTarget, aObj, cast); - return op.compute(compareDoubleToLong(inliningTarget, a, b, longFitsToDoubleProfile), 0.0); + double a1 = compareDoubleToLong(inliningTarget, a, b, longFitsToDoubleProfile); + return op.compare(a1, 0.0); } @Specialization @InliningCutoff - static boolean doOPInt(Node inliningTarget, Object aObj, PInt b, Op op, + static boolean doOPInt(Node inliningTarget, Object aObj, PInt b, RichCmpOp op, @Shared @Cached CastToJavaDoubleNode cast) { double a = castToDoubleChecked(inliningTarget, aObj, cast); - return op.compute(compareDoubleToLargeInt(a, b), 0.0); + double a1 = compareDoubleToLargeInt(a, b); + return op.compare(a1, 0.0); } @Specialization @InliningCutoff - static boolean doOB(Node inliningTarget, Object aObj, boolean b, Op op, + static boolean doOB(Node inliningTarget, Object aObj, boolean b, RichCmpOp op, @Shared @Cached CastToJavaDoubleNode cast) { double a = castToDoubleChecked(inliningTarget, aObj, cast); - return op.compute(a, b ? 1 : 0); + return op.compare(a, b ? 1 : 0); } @Fallback @SuppressWarnings("unused") - static PNotImplemented fallback(Object a, Object b, Op op) { + static PNotImplemented fallback(Object a, Object b, RichCmpOp op) { return PNotImplemented.NOT_IMPLEMENTED; } @@ -857,78 +954,24 @@ private static double compareUsingBigDecimal(double v, BigInteger w) { } } - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class EqNode extends PythonBinaryBuiltinNode { - @Specialization - static Object doIt(Object left, Object right, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode comparisonHelperNode) { - return comparisonHelperNode.execute(inliningTarget, left, right, (a, b) -> a == b); - } - } - - @Builtin(name = J___NE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class NeNode extends PythonBinaryBuiltinNode { - @Specialization - static Object doIt(Object left, Object right, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode comparisonHelperNode) { - return comparisonHelperNode.execute(inliningTarget, left, right, (a, b) -> a != b); - } - } - - @Builtin(name = J___LT__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class LtNode extends PythonBinaryBuiltinNode { - @Specialization - static Object doIt(Object left, Object right, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode comparisonHelperNode) { - return comparisonHelperNode.execute(inliningTarget, left, right, (a, b) -> a < b); - } - } - - @Builtin(name = J___LE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class LeNode extends PythonBinaryBuiltinNode { - @Specialization - static Object doIt(Object left, Object right, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode comparisonHelperNode) { - return comparisonHelperNode.execute(inliningTarget, left, right, (a, b) -> a <= b); - } - } - - @Builtin(name = J___GT__, minNumOfPositionalArgs = 2) + @Slot(SlotKind.tp_richcompare) @GenerateNodeFactory - public abstract static class GtNode extends PythonBinaryBuiltinNode { - @Specialization - static Object doIt(Object left, Object right, - @Bind("this") Node inliningTarget, - @Cached ComparisonHelperNode comparisonHelperNode) { - return comparisonHelperNode.execute(inliningTarget, left, right, (a, b) -> a > b); - } - } - - @Builtin(name = J___GE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class GeNode extends PythonBinaryBuiltinNode { + @GenerateUncached + public abstract static class EqNode extends TpSlotRichCompare.RichCmpBuiltinNode { @Specialization - static Object doIt(Object left, Object right, + static Object doIt(Object left, Object right, RichCmpOp op, @Bind("this") Node inliningTarget, @Cached ComparisonHelperNode comparisonHelperNode) { - return comparisonHelperNode.execute(inliningTarget, left, right, (a, b) -> a >= b); + return comparisonHelperNode.execute(inliningTarget, left, right, op); } } - @Builtin(name = J___POS__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.nb_positive, isComplex = true) @GenerateNodeFactory abstract static class PosNode extends FloatNode { } - @Builtin(name = J___NEG__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.nb_negative, isComplex = true) @GenerateNodeFactory abstract static class NegNode extends AbstractNumericUnaryBuiltin { @Override @@ -939,7 +982,6 @@ protected Object op(double arg) { @Builtin(name = J___FLOOR__, minNumOfPositionalArgs = 1) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class FloorNode extends PythonUnaryBuiltinNode { @Specialization static Object floor(Object self, @@ -952,7 +994,6 @@ static Object floor(Object self, @Builtin(name = J___CEIL__, minNumOfPositionalArgs = 1) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class CeilNode extends PythonUnaryBuiltinNode { @Specialization static Object ceil(Object self, @@ -986,17 +1027,17 @@ abstract static class AsIntegerRatio extends PythonUnaryBuiltinNode { @Specialization static PTuple get(Object selfObj, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached CastToJavaDoubleNode cast, @Cached InlinedConditionProfile nanProfile, @Cached InlinedConditionProfile infProfile, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { double self = castToDoubleChecked(inliningTarget, selfObj, cast); if (nanProfile.profile(inliningTarget, Double.isNaN(self))) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.ValueError, ErrorMessages.CANNOT_CONVERT_S_TO_INT_RATIO, "NaN"); + throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ErrorMessages.CANNOT_CONVERT_S_TO_INT_RATIO, "NaN"); } if (infProfile.profile(inliningTarget, Double.isInfinite(self))) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.OverflowError, ErrorMessages.CANNOT_CONVERT_S_TO_INT_RATIO, "Infinity"); + throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError, ErrorMessages.CANNOT_CONVERT_S_TO_INT_RATIO, "Infinity"); } // At the first time find mantissa and exponent. This is functionality of @@ -1030,11 +1071,11 @@ static PTuple get(Object selfObj, } // count the ratio - return factory.createTuple(countIt(mantissa, exponent)); + return PFactory.createTuple(language, countIt(language, mantissa, exponent)); } @TruffleBoundary - private static Object[] countIt(double mantissa, int exponent) { + private static Object[] countIt(PythonLanguage language, double mantissa, int exponent) { double m = mantissa; int e = exponent; for (int i = 0; i < 300 && Double.compare(m, Math.floor(m)) != 0; i++) { @@ -1053,8 +1094,7 @@ private static Object[] countIt(double mantissa, int exponent) { if (numerator.bitLength() < Long.SIZE && denominator.bitLength() < Long.SIZE) { return new Object[]{numerator.longValue(), denominator.longValue()}; } - PythonObjectFactory factory = PythonObjectFactory.getUncached(); - return new Object[]{factory.createInt(numerator), factory.createInt(denominator)}; + return new Object[]{PFactory.createInt(language, numerator), PFactory.createInt(language, denominator)}; } } @@ -1098,8 +1138,8 @@ static TruffleString getFormat(@SuppressWarnings("unused") Object cls, @Suppress @Fallback static TruffleString getFormat(@SuppressWarnings("unused") Object cls, @SuppressWarnings("unused") Object typeStr, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.ValueError, ErrorMessages.ARG_D_MUST_BE_S_OR_S, "__getformat__()", 1, "double", "float"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.ValueError, ErrorMessages.ARG_D_MUST_BE_S_OR_S, "__getformat__()", 1, "double", "float"); } @Override @@ -1120,11 +1160,10 @@ protected Object op(double value) { @Builtin(name = J___GETNEWARGS__, minNumOfPositionalArgs = 1) @GenerateNodeFactory abstract static class GetNewArgsNode extends AbstractNumericUnaryBuiltin { - @Child private PythonObjectFactory factory = PythonObjectFactory.create(); - @Override protected Object op(double self) { - return factory.createTuple(new Object[]{factory.createFloat(self)}); + PythonLanguage language = PythonLanguage.get(this); + return PFactory.createTuple(language, new Object[]{PFactory.createFloat(language, self)}); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/FloatUtils.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/FloatUtils.java index 0e4130d507..2daac66bb1 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/FloatUtils.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/FloatUtils.java @@ -239,7 +239,11 @@ public static StringToDoubleResult stringToDouble(String str, int start, int len public static double parseValidString(String substr) { double d = Double.parseDouble(substr); if (!Double.isFinite(d)) { - d = new BigDecimal(substr).doubleValue(); + try { + d = new BigDecimal(substr).doubleValue(); + } catch (NumberFormatException e) { + // Can happen when the number is too large, just let it return +-infinity then + } } return d; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/PFloat.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/PFloat.java index 4c66a4af24..6205c8c21b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/PFloat.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/PFloat.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -26,13 +26,10 @@ // skip GIL package com.oracle.graal.python.builtins.objects.floats; -import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; - import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.CachedLibrary; @@ -40,7 +37,6 @@ import com.oracle.truffle.api.library.ExportMessage; import com.oracle.truffle.api.library.ExportMessage.Ignore; import com.oracle.truffle.api.object.Shape; -import com.oracle.truffle.api.strings.TruffleString; @SuppressWarnings("truffle-abstract-export") @ExportLibrary(InteropLibrary.class) @@ -86,30 +82,19 @@ public static PFloat create(Object cls, Shape instanceShape, double value) { return new PFloat(cls, instanceShape, value); } - @TruffleBoundary - public static TruffleString doubleToString(double item) { - String d = Double.toString(item); - int exp = d.indexOf("E"); - if (exp != -1) { - int l = d.length() - 1; - if (exp == (l - 2)) { - if (d.charAt(exp + 1) == '-') { - if (Integer.valueOf(d.charAt(l) + "") == 4) { - /*- Java convert double when 0.000###... while Python does it when 0.0000####... */ - d = Double.toString((item * 10)).replace(".", ".0"); - } else { - d = d.substring(0, l) + "0" + d.substring(l); - } - - exp = d.indexOf("E"); - } - } - if (exp != -1 && d.charAt(exp + 1) != '-') { - d = d.substring(0, exp + 1) + "+" + d.substring(exp + 1, l + 1); - } - d = d.toLowerCase(); - } - return toTruffleStringUncached(d); + public static int compare(double x, double y) { + return (x < y) ? -1 : ((x == y) ? 0 : 1); + } + + /** + * CPython does identity check in {@code PyObject_RichCompareBool}. We do not really have + * identity for doubles, so we cannot say if NaNs, which are by definition not equal + * (PyObjectRichCompare always returns false for NaN and NaN), are identical or not. So we + * choose that all NaNs with equal bit patterns are identical. This method should be used in + * places which use {@code PyObject_RichCompareBool} in CPython. + */ + public static boolean areIdentical(double x, double y) { + return x == y || Double.doubleToRawLongBits(x) == Double.doubleToRawLongBits(y); } @ExportMessage diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/AccessForeignItemNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/AccessForeignItemNodes.java deleted file mode 100644 index e1d4bdea97..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/AccessForeignItemNodes.java +++ /dev/null @@ -1,483 +0,0 @@ -/* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.foreign; - -import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.IndexError; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.KeyError; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; - -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.common.IndexNodes.NormalizeIndexNode; -import com.oracle.graal.python.builtins.objects.foreign.AccessForeignItemNodesFactory.RemoveForeignItemNodeGen; -import com.oracle.graal.python.builtins.objects.foreign.AccessForeignItemNodesFactory.SetForeignItemNodeGen; -import com.oracle.graal.python.builtins.objects.range.RangeNodes.LenOfRangeNode; -import com.oracle.graal.python.builtins.objects.slice.PSlice; -import com.oracle.graal.python.builtins.objects.slice.PSlice.SliceInfo; -import com.oracle.graal.python.builtins.objects.slice.SliceNodes.CoerceToIntSlice; -import com.oracle.graal.python.builtins.objects.slice.SliceNodes.ComputeIndices; -import com.oracle.graal.python.builtins.objects.str.StringBuiltins; -import com.oracle.graal.python.lib.GetNextNode; -import com.oracle.graal.python.lib.PyObjectGetIter; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.nodes.interop.PForeignToPTypeNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; -import com.oracle.graal.python.runtime.GilNode; -import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.Fallback; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.InvalidArrayIndexException; -import com.oracle.truffle.api.interop.UnknownKeyException; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.interop.UnsupportedTypeException; -import com.oracle.truffle.api.library.CachedLibrary; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedBranchProfile; -import com.oracle.truffle.api.strings.TruffleString; - -abstract class AccessForeignItemNodes { - - @ImportStatic(PythonOptions.class) - @TypeSystemReference(PythonArithmeticTypes.class) - protected abstract static class AccessForeignItemBaseNode extends PNodeWithContext { - @Child PRaiseNode raiseNode; - - protected PException raise(PythonBuiltinClassType type, TruffleString msg, Object... arguments) { - if (raiseNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - raiseNode = insert(PRaiseNode.create()); - } - return raiseNode.raise(type, msg, arguments); - } - - protected static boolean isSlice(Object o) { - return o instanceof PSlice; - } - - protected int getForeignSize(Object object, InteropLibrary libForObject) { - long foreignSizeObj = 0; - try { - foreignSizeObj = libForObject.getArraySize(object); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - if (foreignSizeObj <= Integer.MAX_VALUE) { - return (int) foreignSizeObj; - } - throw raise(TypeError, ErrorMessages.NUMBER_S_CANNOT_FIT_INTO_INDEXSIZED_INT, foreignSizeObj); - } - - protected SliceInfo materializeSlice(VirtualFrame frame, PSlice idxSlice, Object object, ComputeIndices compute, InteropLibrary libForObject) { - int foreignSize = getForeignSize(object, libForObject); - return compute.execute(frame, idxSlice, foreignSize); - } - } - - protected abstract static class GetForeignItemNode extends AccessForeignItemBaseNode { - @Child private PForeignToPTypeNode toPythonNode; - - public abstract Object execute(VirtualFrame frame, Object object, Object idx); - - @Specialization(guards = "lib.hasArrayElements(object)") - Object doArraySlice(VirtualFrame frame, Object object, PSlice idxSlice, - @Bind("this") Node inliningTarget, - @Shared("lib") @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary lib, - @Cached PythonObjectFactory factory, - @Cached CoerceToIntSlice sliceCast, - @Cached ComputeIndices compute, - @Cached LenOfRangeNode sliceLen, - @Shared("gil") @Cached GilNode gil) { - SliceInfo mslice = materializeSlice(frame, sliceCast.execute(inliningTarget, idxSlice), object, compute, lib); - gil.release(true); - try { - Object[] values = new Object[sliceLen.len(inliningTarget, mslice)]; - for (int i = mslice.start, j = 0; i < mslice.stop; i += mslice.step, j++) { - values[j] = readForeignIndex(object, i, lib); - } - return factory.createList(values); - } finally { - gil.acquire(); - } - } - - @Specialization(guards = {"lib.hasArrayElements(object)", "!isPSlice(key)"}) - Object doArrayIndex(Object object, Object key, - @Cached NormalizeIndexNode normalize, - @Shared("lib") @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary lib, - @Shared("gil") @Cached GilNode gil) { - if (lib.isNumber(key) && lib.fitsInLong(key)) { - gil.release(true); - try { - return readForeignIndex(object, normalize.executeLong(lib.asLong(key), lib.getArraySize(object)), lib); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } finally { - gil.acquire(); - } - } else if (lib.isBoolean(key)) { - gil.release(true); - try { - return readForeignIndex(object, lib.asBoolean(key) ? 1 : 0, lib); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } finally { - gil.acquire(); - } - } else { - throw raise(TypeError, ErrorMessages.OBJ_INDEX_MUST_BE_INT_OR_SLICES, object, key); - } - } - - @Specialization(guards = {"lib.isString(object)", "!lib.hasArrayElements(object)"}) - Object doString(VirtualFrame frame, Object object, Object idx, - @Shared("lib") @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary lib, - @Shared("switchEncoding") @Cached TruffleString.SwitchEncodingNode switchEncodingNode, - @Cached StringBuiltins.StrGetItemNode getItemNode, - @Shared("gil") @Cached GilNode gil) { - TruffleString string; - gil.release(true); - try { - string = switchEncodingNode.execute(lib.asTruffleString(object), TS_ENCODING); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } finally { - gil.acquire(); - } - return getItemNode.execute(frame, string, idx); - } - - @Specialization(guards = {"lib.hasHashEntries(object)"}) - Object doHashKey(Object object, Object key, - @Shared("lib") @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary lib, - @Shared("switchEncoding") @Cached TruffleString.SwitchEncodingNode switchEncodingNode, - @Shared("gil") @Cached GilNode gil) { - if (lib.isHashEntryReadable(object, key)) { - gil.release(true); - try { - return getToPythonNode().executeConvert(lib.readHashValue(object, key)); - } catch (UnsupportedMessageException | UnknownKeyException e) { - throw keyError(this, key, lib, switchEncodingNode); - } finally { - gil.acquire(); - } - } - throw keyError(this, key, lib, switchEncodingNode); - } - - @Fallback - @SuppressWarnings("unused") - Object doFail(Object object, Object key) { - throw raise(TypeError, ErrorMessages.OBJ_NOT_SUBSCRIPTABLE, object); - } - - public Object readForeignIndex(Object object, long index, InteropLibrary libForObject) { - if (libForObject.isArrayElementReadable(object, index)) { - try { - return getToPythonNode().executeConvert(libForObject.readArrayElement(object, index)); - } catch (UnsupportedMessageException ex) { - throw raise(IndexError, ErrorMessages.ITEM_S_OF_S_OBJ_IS_NOT_READABLE, index, object); - } catch (InvalidArrayIndexException ex) { - throw raise(IndexError, ErrorMessages.INVALID_INDEX_S, index); - } - } - throw raise(IndexError, ErrorMessages.INVALID_INDEX_S, index); - } - - private PForeignToPTypeNode getToPythonNode() { - if (toPythonNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - toPythonNode = insert(PForeignToPTypeNode.create()); - } - return toPythonNode; - } - - } - - @ImportStatic(SpecialMethodNames.class) - protected abstract static class SetForeignItemNode extends AccessForeignItemBaseNode { - - public abstract Object execute(VirtualFrame frame, Object object, Object idx, Object value); - - @Specialization(guards = "lib.hasArrayElements(object)") - @SuppressWarnings("truffle-static-method") - public Object doArraySlice(VirtualFrame frame, Object object, PSlice idxSlice, Object pvalues, - @Bind("this") Node inliningTarget, - @Shared("lib") @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary lib, - @Cached PyObjectGetIter getIter, - @Cached GetNextNode getNext, - @Exclusive @Cached InlinedBranchProfile wrongIndex, - @Cached CoerceToIntSlice sliceCast, - @Cached ComputeIndices compute, - @Shared("gil") @Cached GilNode gil) { - SliceInfo mslice = materializeSlice(frame, sliceCast.execute(inliningTarget, idxSlice), object, compute, lib); - Object iter = getIter.execute(frame, inliningTarget, pvalues); - for (int i = mslice.start; i < mslice.stop; i += mslice.step) { - Object value = getNext.execute(frame, iter); - gil.release(true); - try { - writeForeignIndex(inliningTarget, object, i, value, lib, wrongIndex); - } finally { - gil.acquire(); - } - } - return PNone.NONE; - } - - @Specialization(guards = {"lib.hasArrayElements(object)", "!isPSlice(key)"}) - Object doArrayIndex(Object object, Object key, Object value, - @Bind("this") Node inliningTarget, - @Cached NormalizeIndexNode normalize, - @Exclusive @Cached InlinedBranchProfile wrongIndex, - @Shared("lib") @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary lib, - @Shared("gil") @Cached GilNode gil) { - if (lib.isNumber(key) && lib.fitsInInt(key)) { - gil.release(true); - try { - writeForeignIndex(inliningTarget, object, normalize.execute(lib.asInt(key), (int) lib.getArraySize(object)), value, lib, wrongIndex); - return PNone.NONE; - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } finally { - gil.acquire(); - } - } else if (lib.isBoolean(key)) { - gil.release(true); - try { - writeForeignIndex(inliningTarget, object, lib.asBoolean(key) ? 1 : 0, value, lib, wrongIndex); - return PNone.NONE; - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } finally { - gil.acquire(); - } - } else { - throw raise(TypeError, ErrorMessages.OBJ_INDEX_MUST_BE_INT_OR_SLICES, object, key); - } - } - - @Specialization(guards = {"lib.hasHashEntries(object)"}) - Object doHashKey(Object object, Object key, Object value, - @Bind("this") Node inliningTarget, - @Exclusive @Cached InlinedBranchProfile wrongIndex, - @Shared("lib") @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary lib, - @Cached TruffleString.SwitchEncodingNode switchEncodingNode, - @Shared("gil") @Cached GilNode gil) { - if (lib.isHashEntryWritable(object, key)) { - gil.release(true); - try { - lib.writeHashEntry(object, key, value); - return PNone.NONE; - } catch (UnknownKeyException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } catch (UnsupportedMessageException e) { - if (lib.isHashEntryExisting(object, key)) { - return raise(AttributeError, ErrorMessages.ATTR_S_OF_S_OBJ_IS_NOT_WRITABLE, key, object); - } else { - return raise(AttributeError, ErrorMessages.ATTR_S_OF_S_OBJ_IS_NOT_INSERTABLE, key, object); - } - } catch (UnsupportedTypeException e) { - throw raise(TypeError, ErrorMessages.TYPE_P_NOT_SUPPORTED_BY_FOREIGN_OBJ, value); - } catch (Throwable e) { - throw e; - } finally { - gil.acquire(); - } - } - wrongIndex.enter(inliningTarget); - gil.release(true); - try { - throw keyError(this, key, lib, switchEncodingNode); - } finally { - gil.acquire(); - } - } - - @Fallback - @SuppressWarnings("unused") - Object doFail(Object object, Object key, Object value) { - throw raise(TypeError, ErrorMessages.OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT, object); - } - - private void writeForeignIndex(Node inliningTarget, Object object, int idx, Object value, InteropLibrary libForObject, InlinedBranchProfile wrongIndex) { - if (libForObject.isArrayElementWritable(object, idx)) { - try { - libForObject.writeArrayElement(object, idx, value); - return; - } catch (InvalidArrayIndexException e) { - throw raise(IndexError, ErrorMessages.INVALID_INDEX_S, idx); - } catch (UnsupportedMessageException e) { - throw raise(IndexError, ErrorMessages.ITEM_S_OF_S_OBJ_IS_NOT_WRITABLE, idx, object); - } catch (UnsupportedTypeException e) { - throw raise(TypeError, ErrorMessages.TYPE_P_NOT_SUPPORTED_BY_FOREIGN_OBJ, value); - } - } - wrongIndex.enter(inliningTarget); - throw raise(IndexError, ErrorMessages.INVALID_INDEX_S, idx); - } - - public static SetForeignItemNode create() { - return SetForeignItemNodeGen.create(); - } - } - - protected abstract static class RemoveForeignItemNode extends AccessForeignItemBaseNode { - - public abstract Object execute(VirtualFrame frame, Object object, Object idx); - - @Specialization(guards = "lib.hasArrayElements(object)") - Object doArraySlice(VirtualFrame frame, Object object, PSlice idxSlice, - @Shared("lib") @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary lib, - @Bind("this") Node inliningTarget, - @Cached CoerceToIntSlice sliceCast, - @Cached ComputeIndices compute, - @Shared("gil") @Cached GilNode gil) { - SliceInfo mslice = materializeSlice(frame, sliceCast.execute(inliningTarget, idxSlice), object, compute, lib); - gil.release(true); - try { - for (int i = mslice.start; i < mslice.stop; i += mslice.step) { - removeForeignValue(object, i, lib); - } - } finally { - gil.acquire(); - } - return PNone.NONE; - } - - @Specialization(guards = {"lib.hasArrayElements(object)", "!isPSlice(key)"}) - Object doArrayIndex(Object object, Object key, - @Cached NormalizeIndexNode normalize, - @Shared("lib") @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary lib, - @Shared("gil") @Cached GilNode gil) { - if (lib.isNumber(key) && lib.fitsInInt(key)) { - gil.release(true); - try { - removeForeignValue(object, normalize.execute(lib.asInt(key), (int) lib.getArraySize(object)), lib); - return PNone.NONE; - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } finally { - gil.acquire(); - } - } else if (lib.isBoolean(key)) { - gil.release(true); - try { - removeForeignValue(object, lib.asBoolean(key) ? 1 : 0, lib); - return PNone.NONE; - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } finally { - gil.acquire(); - } - } else { - throw raise(TypeError, ErrorMessages.OBJ_INDEX_MUST_BE_INT_OR_SLICES, object, key); - } - } - - @Specialization(guards = {"lib.hasHashEntries(object)"}) - Object doHashKey(Object object, Object key, - @Shared("lib") @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary lib, - @Cached TruffleString.SwitchEncodingNode switchEncodingNode, - @Shared("gil") @Cached GilNode gil) { - if (lib.isHashEntryRemovable(object, key)) { - gil.release(true); - try { - lib.removeHashEntry(object, key); - return PNone.NONE; - } catch (UnknownKeyException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } catch (UnsupportedMessageException e) { - return raise(AttributeError, ErrorMessages.ATTR_S_OF_S_OBJ_IS_NOT_REMOVABLE, key, object); - } finally { - gil.acquire(); - } - } - throw keyError(this, key, lib, switchEncodingNode); - } - - @Fallback - @SuppressWarnings("unused") - Object doFail(Object object, Object key) { - throw raise(TypeError, ErrorMessages.OBJ_DOESNT_SUPPORT_DELETION, object); - } - - private void removeForeignValue(Object object, int idx, InteropLibrary libForObject) { - if (libForObject.isArrayElementRemovable(object, idx)) { - try { - libForObject.removeArrayElement(object, idx); - return; - } catch (InvalidArrayIndexException ex) { - throw raise(IndexError, ErrorMessages.INVALID_INDEX_S, idx); - } catch (UnsupportedMessageException e) { - throw raise(IndexError, ErrorMessages.ITEM_S_OF_S_OBJ_IS_NOT_REMOVABLE, idx, object); - } - } - throw raise(IndexError, ErrorMessages.INVALID_INDEX_S, idx); - } - - public static RemoveForeignItemNode create() { - return RemoveForeignItemNodeGen.create(); - } - } - - private static PException keyError(AccessForeignItemBaseNode node, Object key, InteropLibrary lib, TruffleString.SwitchEncodingNode switchEncodingNode) { - try { - return node.raise(KeyError, switchEncodingNode.execute(lib.asTruffleString(lib.toDisplayString(key, true)), TS_ENCODING)); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignAbstractClassBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignAbstractClassBuiltins.java new file mode 100644 index 0000000000..cbc0b82c5f --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignAbstractClassBuiltins.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. + * Copyright (c) 2014, Regents of the University of California + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.oracle.graal.python.builtins.objects.foreign; + +import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___BASES__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INSTANCECHECK__; + +import java.util.List; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.builtins.CoreFunctions; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.runtime.GilNode; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.library.CachedLibrary; + +/* + * NOTE: We are not using IndirectCallContext here in this file + * because it seems unlikely that these interop messages would call back to Python + * and that we would also need precise frame info for that case. + * Adding it shouldn't hurt peak, but might be a non-trivial overhead in interpreter. + */ +@CoreFunctions(extendClasses = PythonBuiltinClassType.ForeignAbstractClass) +public final class ForeignAbstractClassBuiltins extends PythonBuiltins { + @Override + protected List> getNodeFactories() { + return ForeignAbstractClassBuiltinsFactory.getFactories(); + } + + @Builtin(name = J___BASES__, minNumOfPositionalArgs = 1, isGetter = true, isSetter = false) + @GenerateNodeFactory + abstract static class BasesNode extends PythonUnaryBuiltinNode { + @Specialization + static Object getBases(Object self, + @Bind PythonLanguage language) { + return PFactory.createEmptyTuple(language); + } + } + + @Builtin(name = J___INSTANCECHECK__, minNumOfPositionalArgs = 2) + @GenerateNodeFactory + abstract static class InstancecheckNode extends PythonBinaryBuiltinNode { + @Specialization(limit = "3") + static Object check(Object self, Object instance, + @CachedLibrary("self") InteropLibrary lib, + @Cached GilNode gil) { + gil.release(true); + try { + return lib.isMetaInstance(self, instance); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(); + } finally { + gil.acquire(); + } + } + } + +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignBooleanBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignBooleanBuiltins.java new file mode 100644 index 0000000000..a3f22962e9 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignBooleanBuiltins.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. + * Copyright (c) 2014, Regents of the University of California + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.oracle.graal.python.builtins.objects.foreign; + +import java.util.List; + +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.builtins.CoreFunctions; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.NbBoolBuiltinNode; +import com.oracle.graal.python.lib.PyObjectStrAsTruffleStringNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.runtime.GilNode; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.library.CachedLibrary; +import com.oracle.truffle.api.nodes.Node; + +/* + * This class handles foreign booleans and reimplements the methods of Python bool. + * We avoid inheriting from bool as that brings many complications, and we want to reuse the logic from ForeignNumberBuiltins. + * + * NOTE: We are not using IndirectCallContext here in this file + * because it seems unlikely that these interop messages would call back to Python + * and that we would also need precise frame info for that case. + * Adding it shouldn't hurt peak, but might be a non-trivial overhead in interpreter. + */ +@CoreFunctions(extendClasses = PythonBuiltinClassType.ForeignBoolean) +public final class ForeignBooleanBuiltins extends PythonBuiltins { + public static TpSlots SLOTS = ForeignBooleanBuiltinsSlotsGen.SLOTS; + + @Override + protected List> getNodeFactories() { + return ForeignBooleanBuiltinsFactory.getFactories(); + } + + @Slot(SlotKind.nb_bool) + @GenerateUncached + @GenerateNodeFactory + abstract static class BoolNode extends NbBoolBuiltinNode { + @Specialization(limit = "getCallSiteInlineCacheMaxDepth()") + static boolean bool(Object receiver, + @CachedLibrary("receiver") InteropLibrary lib, + @Cached GilNode gil) { + gil.release(true); + try { + return lib.asBoolean(receiver); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } finally { + gil.acquire(); + } + } + } + + @Slot(value = SlotKind.nb_index, isComplex = true) + @GenerateNodeFactory + abstract static class IndexNode extends PythonUnaryBuiltinNode { + @Specialization(limit = "3") + protected static int doIt(Object object, + @CachedLibrary("object") InteropLibrary lib, + @Cached GilNode gil) { + gil.release(true); + try { + try { + return PInt.intValue(lib.asBoolean(object)); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere("foreign value claims to be a boolean but isn't"); + } + } finally { + gil.acquire(); + } + } + } + + @Slot(value = SlotKind.tp_str, isComplex = true) + @Slot(value = SlotKind.tp_repr, isComplex = true) + @GenerateNodeFactory + abstract static class StrNode extends PythonUnaryBuiltinNode { + @Specialization + Object str(VirtualFrame frame, Object object, + @Bind("this") Node inliningTarget, + @CachedLibrary(limit = "3") InteropLibrary lib, + @Cached GilNode gil, + @Cached PyObjectStrAsTruffleStringNode strNode) { + final Object value; + try { + gil.release(true); + try { + value = lib.asBoolean(object); + } finally { + gil.acquire(); + } + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + + return strNode.execute(frame, inliningTarget, value); + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignExecutableBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignExecutableBuiltins.java new file mode 100644 index 0000000000..2f7c3644de --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignExecutableBuiltins.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. + * Copyright (c) 2014, Regents of the University of California + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.oracle.graal.python.builtins.objects.foreign; + +import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___DOC__; +import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___NAME__; +import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__; + +import java.util.List; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; +import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.builtins.CoreFunctions; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.interop.PForeignToPTypeNode; +import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext; +import com.oracle.graal.python.runtime.GilNode; +import com.oracle.graal.python.runtime.IndirectCallData; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.interop.ArityException; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnknownIdentifierException; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.interop.UnsupportedTypeException; +import com.oracle.truffle.api.library.CachedLibrary; +import com.oracle.truffle.api.nodes.Node; + +@CoreFunctions(extendClasses = PythonBuiltinClassType.ForeignExecutable) +public final class ForeignExecutableBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = ForeignExecutableBuiltinsSlotsGen.SLOTS; + + @Override + protected List> getNodeFactories() { + return ForeignExecutableBuiltinsFactory.getFactories(); + } + + @Builtin(name = J___NAME__, minNumOfPositionalArgs = 1, isGetter = true) + @GenerateNodeFactory + public abstract static class NameNode extends PythonUnaryBuiltinNode { + @Specialization + static Object getName(Object self, + @Bind("this") Node inliningTarget, + @Cached PRaiseNode raiseNode, + @Cached PForeignToPTypeNode toPythonNode, + @CachedLibrary(limit = "2") InteropLibrary lib) { + try { + if (lib.isMemberReadable(self, J___NAME__)) { + return toPythonNode.executeConvert(lib.readMember(self, J___NAME__)); + } else if (lib.hasExecutableName(self)) { + return toPythonNode.executeConvert(lib.getExecutableName(self)); + } else { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, self, T___NAME__); + } + } catch (UnsupportedMessageException | UnknownIdentifierException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } + } + + @Builtin(name = J___DOC__, minNumOfPositionalArgs = 1, isGetter = true) + @GenerateNodeFactory + public abstract static class DocNode extends PythonUnaryBuiltinNode { + @Specialization + static Object getName(Object self, + @Bind("this") Node inliningTarget, + @Cached PRaiseNode raiseNode, + @Cached PForeignToPTypeNode toPythonNode, + @CachedLibrary(limit = "2") InteropLibrary lib) { + if (lib.isMemberReadable(self, J___DOC__)) { + try { + return toPythonNode.executeConvert(lib.readMember(self, J___DOC__)); + } catch (UnsupportedMessageException | UnknownIdentifierException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } else { + return PNone.NONE; + } + } + } + + @Slot(value = SlotKind.tp_call, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true) + @GenerateNodeFactory + public abstract static class CallNode extends PythonBuiltinNode { + @Specialization + static Object doInteropCall(VirtualFrame frame, Object callee, Object[] arguments, + @Bind("this") Node inliningTarget, + @Cached("createFor(this)") IndirectCallData indirectCallData, + @CachedLibrary(limit = "4") InteropLibrary lib, + @Cached PForeignToPTypeNode toPTypeNode, + @Cached GilNode gil, + @Cached PRaiseNode raiseNode) { + PythonContext context = PythonContext.get(inliningTarget); + PythonLanguage language = context.getLanguage(inliningTarget); + try { + Object state = IndirectCallContext.enter(frame, language, context, indirectCallData); + gil.release(true); + try { + return toPTypeNode.executeConvert(lib.execute(callee, arguments)); + } finally { + gil.acquire(); + IndirectCallContext.exit(frame, language, context, state); + } + } catch (ArityException | UnsupportedTypeException e) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.INVALID_INSTANTIATION_OF_FOREIGN_OBJ); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } + } + +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignInstantiableBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignInstantiableBuiltins.java new file mode 100644 index 0000000000..d6fead055e --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignInstantiableBuiltins.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. + * Copyright (c) 2014, Regents of the University of California + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.oracle.graal.python.builtins.objects.foreign; + +import java.util.List; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; +import com.oracle.graal.python.builtins.CoreFunctions; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinNode; +import com.oracle.graal.python.nodes.interop.PForeignToPTypeNode; +import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext; +import com.oracle.graal.python.runtime.GilNode; +import com.oracle.graal.python.runtime.IndirectCallData; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.exception.PythonErrorType; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.interop.ArityException; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.interop.UnsupportedTypeException; +import com.oracle.truffle.api.library.CachedLibrary; +import com.oracle.truffle.api.nodes.Node; + +@CoreFunctions(extendClasses = PythonBuiltinClassType.ForeignInstantiable) +public final class ForeignInstantiableBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = ForeignInstantiableBuiltinsSlotsGen.SLOTS; + + @Override + protected List> getNodeFactories() { + return ForeignInstantiableBuiltinsFactory.getFactories(); + } + + @Slot(value = SlotKind.tp_call, isComplex = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true) + @GenerateNodeFactory + public abstract static class CallNode extends PythonBuiltinNode { + @Specialization + static Object doInteropCall(VirtualFrame frame, Object callee, Object[] arguments, + @SuppressWarnings("unused") @Bind("this") Node inliningTarget, + @Cached("createFor(this)") IndirectCallData indirectCallData, + @CachedLibrary(limit = "4") InteropLibrary lib, + @Cached PForeignToPTypeNode toPTypeNode, + @Cached GilNode gil, + @Cached PRaiseNode raiseNode) { + PythonContext context = PythonContext.get(inliningTarget); + PythonLanguage language = context.getLanguage(inliningTarget); + try { + Object state = IndirectCallContext.enter(frame, language, context, indirectCallData); + gil.release(true); + try { + return toPTypeNode.executeConvert(lib.instantiate(callee, arguments)); + } finally { + gil.acquire(); + IndirectCallContext.exit(frame, language, context, state); + } + } catch (ArityException | UnsupportedTypeException e) { + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.INVALID_INSTANTIATION_OF_FOREIGN_OBJ); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } + } + +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignIterableBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignIterableBuiltins.java new file mode 100644 index 0000000000..f7e2711f0e --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignIterableBuiltins.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. + * Copyright (c) 2014, Regents of the University of California + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.oracle.graal.python.builtins.objects.foreign; + +import java.util.List; + +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.builtins.CoreFunctions; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.interop.PForeignToPTypeNode; +import com.oracle.graal.python.runtime.GilNode; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.library.CachedLibrary; + +/* + * NOTE: We are not using IndirectCallContext here in this file + * because it seems unlikely that these interop messages would call back to Python + * and that we would also need precise frame info for that case. + * Adding it shouldn't hurt peak, but might be a non-trivial overhead in interpreter. + */ +@CoreFunctions(extendClasses = PythonBuiltinClassType.ForeignIterable) +public final class ForeignIterableBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = ForeignIterableBuiltinsSlotsGen.SLOTS; + + @Override + protected List> getNodeFactories() { + return ForeignIterableBuiltinsFactory.getFactories(); + } + + @Slot(value = SlotKind.tp_iter, isComplex = true) + @GenerateNodeFactory + public abstract static class IterNode extends PythonUnaryBuiltinNode { + + @Specialization(limit = "3") + static Object doGeneric(Object object, + @CachedLibrary("object") InteropLibrary lib, + @Cached PForeignToPTypeNode convertNode, + @Cached GilNode gil) { + gil.release(true); + try { + return convertNode.executeConvert(lib.getIterator(object)); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } finally { + gil.acquire(); + } + } + } + +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignNumberBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignNumberBuiltins.java new file mode 100644 index 0000000000..ae0430d70a --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignNumberBuiltins.java @@ -0,0 +1,785 @@ +/* + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. + * Copyright (c) 2014, Regents of the University of California + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.oracle.graal.python.builtins.objects.foreign; + +import static com.oracle.graal.python.builtins.objects.str.StringUtils.simpleTruffleStringFormatUncached; +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CEIL__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOOR__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROUND__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___TRUNC__; +import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; + +import java.util.List; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.builtins.CoreFunctions; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.PythonAbstractObject; +import com.oracle.graal.python.builtins.objects.foreign.ForeignObjectBuiltins.ForeignGetattrNode; +import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins; +import com.oracle.graal.python.builtins.objects.object.ObjectNodes; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotGetAttr.GetAttrBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.NbBoolBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare; +import com.oracle.graal.python.lib.PyNumberAbsoluteNode; +import com.oracle.graal.python.lib.PyNumberAddNode; +import com.oracle.graal.python.lib.PyNumberAndNode; +import com.oracle.graal.python.lib.PyNumberDivmodNode; +import com.oracle.graal.python.lib.PyNumberFloatNode; +import com.oracle.graal.python.lib.PyNumberFloorDivideNode; +import com.oracle.graal.python.lib.PyNumberInvertNode; +import com.oracle.graal.python.lib.PyNumberLongNode; +import com.oracle.graal.python.lib.PyNumberLshiftNode; +import com.oracle.graal.python.lib.PyNumberMultiplyNode; +import com.oracle.graal.python.lib.PyNumberNegativeNode; +import com.oracle.graal.python.lib.PyNumberOrNode; +import com.oracle.graal.python.lib.PyNumberPositiveNode; +import com.oracle.graal.python.lib.PyNumberPowerNode; +import com.oracle.graal.python.lib.PyNumberRemainderNode; +import com.oracle.graal.python.lib.PyNumberRshiftNode; +import com.oracle.graal.python.lib.PyNumberSubtractNode; +import com.oracle.graal.python.lib.PyNumberTrueDivideNode; +import com.oracle.graal.python.lib.PyNumberXorNode; +import com.oracle.graal.python.lib.PyObjectRichCompare; +import com.oracle.graal.python.lib.PyObjectStrAsTruffleStringNode; +import com.oracle.graal.python.lib.RichCmpOp; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.SpecialMethodNames; +import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode; +import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; +import com.oracle.graal.python.nodes.call.special.SpecialMethodNotFound; +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.graal.python.nodes.expression.UnaryOpNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; +import com.oracle.graal.python.nodes.object.IsForeignObjectNode; +import com.oracle.graal.python.runtime.GilNode; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Shared; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.library.CachedLibrary; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; +import com.oracle.truffle.api.strings.TruffleString; + +/* + * This class handles foreign numbers, whether they are integral or floating-point, + * since interop has no message to know which one, and it would be impractical to handle + * foreign integers in IntBuiltins for instance. + * We are also handling part of foreign booleans here since Python ForeignBoolean inherits from ForeignNumber, + * to avoid duplication and to be similar to Python bool/int. + * + * NOTE: We are not using IndirectCallContext here in this file + * because it seems unlikely that these interop messages would call back to Python + * and that we would also need precise frame info for that case. + * Adding it shouldn't hurt peak, but might be a non-trivial overhead in interpreter. + */ +@CoreFunctions(extendClasses = PythonBuiltinClassType.ForeignNumber) +public final class ForeignNumberBuiltins extends PythonBuiltins { + public static TpSlots SLOTS = ForeignNumberBuiltinsSlotsGen.SLOTS; + + @Override + protected List> getNodeFactories() { + return ForeignNumberBuiltinsFactory.getFactories(); + } + + @GenerateInline + @GenerateCached(false) + abstract static class UnboxForeignObjectNode extends Node { + public abstract Object execute(Node inliningTarget, Object value); + + @Specialization(guards = "lib.isBoolean(obj)") + boolean doBool(Object obj, + @Shared @CachedLibrary(limit = "3") InteropLibrary lib, + @Shared @Cached(inline = false) GilNode gil) { + gil.release(true); + try { + return lib.asBoolean(obj); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } finally { + gil.acquire(); + } + } + + @Specialization(guards = "lib.fitsInLong(obj)") + long doLong(Object obj, + @Shared @CachedLibrary(limit = "3") InteropLibrary lib, + @Shared @Cached(inline = false) GilNode gil) { + assert !lib.isBoolean(obj); + gil.release(true); + try { + return lib.asLong(obj); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } finally { + gil.acquire(); + } + } + + @Specialization(guards = {"!lib.fitsInLong(obj)", "lib.fitsInBigInteger(obj)"}) + PInt doBigInt(Object obj, + @Bind PythonLanguage language, + @Shared @CachedLibrary(limit = "3") InteropLibrary lib, + @Shared @Cached(inline = false) GilNode gil) { + assert !lib.isBoolean(obj); + gil.release(true); + try { + return PFactory.createInt(language, lib.asBigInteger(obj)); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } finally { + gil.acquire(); + } + } + + @Specialization(guards = {"!lib.fitsInLong(obj)", "!lib.fitsInBigInteger(obj)", "lib.fitsInDouble(obj)"}) + double doDouble(Object obj, + @Shared @CachedLibrary(limit = "3") InteropLibrary lib, + @Shared @Cached(inline = false) GilNode gil) { + assert !lib.isBoolean(obj); + gil.release(true); + try { + return lib.asDouble(obj); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } finally { + gil.acquire(); + } + } + + @Fallback + @SuppressWarnings("unused") + public static Object doGeneric(Object left) { + return null; + } + } + + @GenerateInline + @GenerateCached(false) + abstract static class UnboxNode extends Node { + public final Object execute(Node inliningTarget, Object value) { + Object unboxed = executeInternal(inliningTarget, value); + assert unboxed == null || !IsForeignObjectNode.executeUncached(unboxed) : unboxed; + return unboxed; + } + + protected abstract Object executeInternal(Node inliningTarget, Object value); + + @Specialization + static boolean unbox(boolean value) { + return value; + } + + @Specialization + static int unbox(int value) { + return value; + } + + @Specialization + static long unbox(long value) { + return value; + } + + @Specialization + static PInt unbox(PInt value) { + return value; + } + + @Specialization + static double unbox(double value) { + return value; + } + + @Fallback + static Object unbox(Node inliningTarget, Object value, + @Cached IsForeignObjectNode isForeignObjectNode, + @Cached UnboxForeignObjectNode unboxForeignObjectNode) { + if (isForeignObjectNode.execute(inliningTarget, value)) { + return unboxForeignObjectNode.execute(inliningTarget, value); + } else { + return null; + } + } + } + + abstract static class ForeignUnaryNode extends PythonUnaryBuiltinNode { + @Child private UnaryOpNode op; + + protected ForeignUnaryNode(UnaryOpNode op) { + this.op = op; + } + + @Specialization + Object doGeneric(VirtualFrame frame, Object value, + @Bind("this") Node inliningTarget, + @Cached UnboxNode unboxNode) { + Object unboxed = unboxNode.execute(inliningTarget, value); + assert unboxed != null; + return op.execute(frame, unboxed); + } + } + + abstract static class ForeignBinaryNode extends BinaryOpBuiltinNode { + @Child private BinaryOpNode op; + protected final boolean reverse; + + protected ForeignBinaryNode(BinaryOpNode op, boolean reverse) { + this.op = op; + this.reverse = reverse; + } + + @Specialization + Object doGeneric(VirtualFrame frame, Object left, Object right, + @Bind("this") Node inliningTarget, + @Cached UnboxNode unboxNode) { + Object unboxed = unboxNode.execute(inliningTarget, left); + if (unboxed != null) { + if (!reverse) { + return op.execute(frame, unboxed, right); + } else { + return op.execute(frame, right, unboxed); + } + } else { + return PNotImplemented.NOT_IMPLEMENTED; + } + } + } + + @GenerateInline + @GenerateCached(false) + abstract static class ForeignBinarySlotNode extends Node { + abstract Object execute(VirtualFrame frame, Node inliningTarget, Object left, Object right, BinaryOpNode binaryOpNode); + + @Specialization + static Object doIt(VirtualFrame frame, Node inliningTarget, Object left, Object right, BinaryOpNode op, + @Cached IsForeignObjectNode isForeignLeft, + @Cached IsForeignObjectNode isForeignRight, + @Cached UnboxNode unboxLeft, + @Cached UnboxNode unboxRight) { + boolean leftIsForeign = isForeignLeft.execute(inliningTarget, left); + boolean rightIsForeign = isForeignRight.execute(inliningTarget, right); + if (!leftIsForeign && !rightIsForeign) { + return PNotImplemented.NOT_IMPLEMENTED; + } + + Object newLeft = unboxLeft.execute(inliningTarget, left); + Object newRight = unboxRight.execute(inliningTarget, right); + if (newLeft == null || newRight == null) { + return PNotImplemented.NOT_IMPLEMENTED; + } + return op.execute(frame, newLeft, newRight); + } + } + + @Slot(SlotKind.nb_bool) + @GenerateUncached + @GenerateNodeFactory + abstract static class BoolNode extends NbBoolBuiltinNode { + @Specialization(limit = "getCallSiteInlineCacheMaxDepth()") + static boolean bool(Object receiver, + @CachedLibrary("receiver") InteropLibrary lib, + @Cached GilNode gil) { + assert !lib.isBoolean(receiver); + gil.release(true); + try { + if (lib.fitsInLong(receiver)) { + return lib.asLong(receiver) != 0; + } + if (lib.fitsInBigInteger(receiver)) { + return lib.asBigInteger(receiver).signum() != 0; + } + if (lib.fitsInDouble(receiver)) { + return lib.asDouble(receiver) != 0.0; + } + return false; + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } finally { + gil.acquire(); + } + } + } + + @Slot(value = SlotKind.nb_positive, isComplex = true) + @GenerateNodeFactory + abstract static class PosNode extends ForeignUnaryNode { + PosNode() { + super(PyNumberPositiveNode.create()); + } + } + + @Slot(value = SlotKind.nb_negative, isComplex = true) + @GenerateNodeFactory + abstract static class NegNode extends ForeignUnaryNode { + NegNode() { + super(PyNumberNegativeNode.create()); + } + } + + @Slot(value = SlotKind.nb_invert, isComplex = true) + @GenerateNodeFactory + abstract static class InvertNode extends ForeignUnaryNode { + InvertNode() { + super(PyNumberInvertNode.create()); + } + } + + @Slot(value = SlotKind.nb_absolute, isComplex = true) + @GenerateNodeFactory + abstract static class AbsNode extends ForeignUnaryNode { + AbsNode() { + super(PyNumberAbsoluteNode.create()); + } + } + + @Builtin(name = J___CEIL__, minNumOfPositionalArgs = 1) + @GenerateNodeFactory + abstract static class CeilNode extends ForeignUnaryNode { + CeilNode() { + super(LookupAndCallUnaryNode.create(SpecialMethodNames.T___CEIL__)); + } + } + + @Builtin(name = J___FLOOR__, minNumOfPositionalArgs = 1) + @GenerateNodeFactory + abstract static class FloorNode extends ForeignUnaryNode { + FloorNode() { + super(LookupAndCallUnaryNode.create(SpecialMethodNames.T___FLOOR__)); + } + } + + @Builtin(name = J___TRUNC__, minNumOfPositionalArgs = 1) + @GenerateNodeFactory + abstract static class TruncNode extends ForeignUnaryNode { + TruncNode() { + super(LookupAndCallUnaryNode.create(SpecialMethodNames.T___TRUNC__)); + } + } + + @Slot(value = SlotKind.nb_int, isComplex = true) + @GenerateNodeFactory + abstract static class IntNode extends PythonUnaryBuiltinNode { + @Specialization + Object doGeneric(VirtualFrame frame, Object self, + @Bind("this") Node inliningTarget, + @Cached UnboxNode unboxNode, + @Cached PyNumberLongNode longNode) { + Object unboxed = unboxNode.execute(inliningTarget, self); + return longNode.execute(frame, inliningTarget, unboxed); + } + } + + @Slot(value = SlotKind.nb_float, isComplex = true) + @GenerateNodeFactory + abstract static class FloatNode extends PythonUnaryBuiltinNode { + @Specialization + Object doGeneric(VirtualFrame frame, Object self, + @Bind("this") Node inliningTarget, + @Cached UnboxNode unboxNode, + @Cached PyNumberFloatNode floatNode) { + Object unboxed = unboxNode.execute(inliningTarget, self); + return floatNode.execute(frame, inliningTarget, unboxed); + } + } + + @Slot(value = SlotKind.nb_add, isComplex = true) + @GenerateNodeFactory + abstract static class AddNode extends BinaryOpBuiltinNode { + @Specialization + static Object doIt(VirtualFrame frame, Object left, Object right, + @Bind("this") Node inliningTarget, + @Cached ForeignBinarySlotNode binarySlotNode, + @Cached(inline = false) PyNumberAddNode opNode) { + return binarySlotNode.execute(frame, inliningTarget, left, right, opNode); + } + } + + @Slot(value = SlotKind.nb_subtract, isComplex = true) + @GenerateNodeFactory + abstract static class SubNode extends BinaryOpBuiltinNode { + @Specialization + static Object doIt(VirtualFrame frame, Object left, Object right, + @Bind("this") Node inliningTarget, + @Cached ForeignBinarySlotNode binarySlotNode, + @Cached(inline = false) PyNumberSubtractNode opNode) { + return binarySlotNode.execute(frame, inliningTarget, left, right, opNode); + } + } + + @Slot(value = SlotKind.nb_multiply, isComplex = true) + @GenerateNodeFactory + abstract static class MulNode extends BinaryOpBuiltinNode { + @Specialization + static Object doIt(VirtualFrame frame, Object left, Object right, + @Bind("this") Node inliningTarget, + @Cached ForeignBinarySlotNode binarySlotNode, + @Cached(inline = false) PyNumberMultiplyNode opNode) { + return binarySlotNode.execute(frame, inliningTarget, left, right, opNode); + } + } + + @Slot(value = SlotKind.nb_remainder, isComplex = true) + @GenerateNodeFactory + abstract static class ModNode extends BinaryOpBuiltinNode { + @Specialization + static Object doIt(VirtualFrame frame, Object left, Object right, + @Bind("this") Node inliningTarget, + @Cached ForeignBinarySlotNode binarySlotNode, + @Cached(inline = false) PyNumberRemainderNode opNode) { + return binarySlotNode.execute(frame, inliningTarget, left, right, opNode); + } + } + + @Slot(value = SlotKind.nb_lshift, isComplex = true) + @GenerateNodeFactory + abstract static class LShiftNode extends BinaryOpBuiltinNode { + @Specialization + static Object doIt(VirtualFrame frame, Object left, Object right, + @Bind("this") Node inliningTarget, + @Cached ForeignBinarySlotNode binarySlotNode, + @Cached(inline = false) PyNumberLshiftNode opNode) { + return binarySlotNode.execute(frame, inliningTarget, left, right, opNode); + } + } + + @Slot(value = SlotKind.nb_rshift, isComplex = true) + @GenerateNodeFactory + abstract static class RShiftNode extends BinaryOpBuiltinNode { + @Specialization + static Object doIt(VirtualFrame frame, Object left, Object right, + @Bind("this") Node inliningTarget, + @Cached ForeignBinarySlotNode binarySlotNode, + @Cached(inline = false) PyNumberRshiftNode opNode) { + return binarySlotNode.execute(frame, inliningTarget, left, right, opNode); + } + } + + @Slot(value = SlotKind.nb_and, isComplex = true) + @GenerateNodeFactory + abstract static class AndNode extends BinaryOpBuiltinNode { + @Specialization + static Object doIt(VirtualFrame frame, Object left, Object right, + @Bind("this") Node inliningTarget, + @Cached ForeignBinarySlotNode binarySlotNode, + @Cached(inline = false) PyNumberAndNode opNode) { + return binarySlotNode.execute(frame, inliningTarget, left, right, opNode); + } + } + + @Slot(value = SlotKind.nb_xor, isComplex = true) + @GenerateNodeFactory + abstract static class XorNode extends BinaryOpBuiltinNode { + @Specialization + static Object doIt(VirtualFrame frame, Object left, Object right, + @Bind("this") Node inliningTarget, + @Cached ForeignBinarySlotNode binarySlotNode, + @Cached(inline = false) PyNumberXorNode opNode) { + return binarySlotNode.execute(frame, inliningTarget, left, right, opNode); + } + } + + @Slot(value = SlotKind.nb_or, isComplex = true) + @GenerateNodeFactory + abstract static class OrNode extends BinaryOpBuiltinNode { + @Specialization + static Object doIt(VirtualFrame frame, Object left, Object right, + @Bind("this") Node inliningTarget, + @Cached ForeignBinarySlotNode binarySlotNode, + @Cached(inline = false) PyNumberOrNode opNode) { + return binarySlotNode.execute(frame, inliningTarget, left, right, opNode); + } + } + + @Slot(value = SlotKind.nb_floor_divide, isComplex = true) + @GenerateNodeFactory + abstract static class FloorDivNode extends BinaryOpBuiltinNode { + @Specialization + static Object doIt(VirtualFrame frame, Object left, Object right, + @Bind("this") Node inliningTarget, + @Cached ForeignBinarySlotNode binarySlotNode, + @Cached(inline = false) PyNumberFloorDivideNode opNode) { + return binarySlotNode.execute(frame, inliningTarget, left, right, opNode); + } + } + + @Slot(value = SlotKind.nb_true_divide, isComplex = true) + @GenerateNodeFactory + abstract static class TrueDivNode extends BinaryOpBuiltinNode { + @Specialization + static Object doIt(VirtualFrame frame, Object left, Object right, + @Bind("this") Node inliningTarget, + @Cached ForeignBinarySlotNode binarySlotNode, + @Cached(inline = false) PyNumberTrueDivideNode opNode) { + return binarySlotNode.execute(frame, inliningTarget, left, right, opNode); + } + } + + @Slot(value = SlotKind.nb_divmod, isComplex = true) + @GenerateNodeFactory + abstract static class DivModNode extends BinaryOpBuiltinNode { + @Specialization + static Object doIt(VirtualFrame frame, Object left, Object right, + @Bind("this") Node inliningTarget, + @Cached ForeignBinarySlotNode binarySlotNode, + @Cached(inline = false) PyNumberDivmodNode opNode) { + return binarySlotNode.execute(frame, inliningTarget, left, right, opNode); + } + } + + @Slot(value = SlotKind.nb_power, isComplex = true) + @GenerateNodeFactory + abstract static class PowNode extends PythonTernaryBuiltinNode { + + @Specialization + static Object doIt(VirtualFrame frame, Object v, Object w, Object z, + @Bind("this") Node inliningTarget, + @Cached UnboxNode unboxV, + @Cached UnboxNode unboxW, + @Cached UnboxNode unboxZ, + @Cached PyNumberPowerNode power) { + v = unboxV.execute(inliningTarget, v); + w = unboxW.execute(inliningTarget, w); + if (!(z instanceof PNone)) { + z = unboxZ.execute(inliningTarget, z); + } + if (v == null || w == null || z == null) { + return PNotImplemented.NOT_IMPLEMENTED; + } + return power.execute(frame, v, w, z); + } + } + + @Builtin(name = J___ROUND__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2) + @GenerateNodeFactory + abstract static class RoundNode extends PythonBinaryBuiltinNode { + + @Specialization + Object doGeneric(VirtualFrame frame, Object self, Object n, + @Bind("this") Node inliningTarget, + @Cached UnboxNode unboxNode, + @Cached("create(T___ROUND__)") LookupAndCallBinaryNode callRound) { + Object unboxed = unboxNode.execute(inliningTarget, self); + try { + return callRound.executeObject(frame, unboxed, n); + } catch (SpecialMethodNotFound ignore) { + throw CompilerDirectives.shouldNotReachHere(); + } + } + } + + @Slot(value = SlotKind.tp_richcompare, isComplex = true) + @GenerateNodeFactory + public abstract static class ForeignBinaryComparisonNode extends TpSlotRichCompare.RichCmpBuiltinNode { + @Specialization + Object doComparison(VirtualFrame frame, Object left, Object right, RichCmpOp op, + @Bind("this") Node inliningTarget, + @Cached UnboxNode unboxNode, + @Cached IsBuiltinObjectProfile exProfile, + @Cached PyObjectRichCompare richCompareNode) { + Object unboxed = unboxNode.execute(inliningTarget, left); + if (unboxed != null) { + try { + return richCompareNode.execute(frame, inliningTarget, unboxed, right, op); + } catch (PException ex) { + ex.expect(inliningTarget, PythonBuiltinClassType.TypeError, exProfile); + } + } + return PNotImplemented.NOT_IMPLEMENTED; + } + } + + @Slot(value = SlotKind.nb_index, isComplex = true) + @GenerateNodeFactory + abstract static class IndexNode extends PythonUnaryBuiltinNode { + @Specialization(limit = "3") + protected static Object doIt(Object object, + @Bind("this") Node inliningTarget, + @Cached PRaiseNode raiseNode, + @CachedLibrary("object") InteropLibrary lib, + @Cached GilNode gil) { + assert !lib.isBoolean(object); + gil.release(true); + try { + if (lib.fitsInInt(object)) { + try { + return lib.asInt(object); + } catch (UnsupportedMessageException e) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + throw new IllegalStateException("foreign value claims it fits into index-sized int, but doesn't"); + } + } + if (lib.fitsInLong(object)) { + try { + return lib.asLong(object); + } catch (UnsupportedMessageException e) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + throw new IllegalStateException("foreign value claims it fits into index-sized long, but doesn't"); + } + } + if (lib.fitsInBigInteger(object)) { + try { + var big = lib.asBigInteger(object); + return PFactory.createInt(PythonLanguage.get(inliningTarget), big); + } catch (UnsupportedMessageException e) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + throw new IllegalStateException("foreign value claims to be a big integer but isn't"); + } + } + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, object); + } finally { + gil.acquire(); + } + } + } + + @Slot(value = SlotKind.tp_str, isComplex = true) + @GenerateNodeFactory + abstract static class StrNode extends PythonUnaryBuiltinNode { + @Child private TruffleString.SwitchEncodingNode switchEncodingNode; + + @Specialization + Object str(VirtualFrame frame, Object object, + @Bind("this") Node inliningTarget, + @Cached UnboxNode unboxNode, + @CachedLibrary(limit = "3") InteropLibrary lib, + @Cached PyObjectStrAsTruffleStringNode strNode, + @Cached InlinedBranchProfile defaultCase) { + final Object value = unboxNode.execute(inliningTarget, object); + if (value == null) { + defaultCase.enter(inliningTarget); + return defaultConversion(frame, lib, object); + } + return strNode.execute(frame, inliningTarget, value); + } + + protected TruffleString.SwitchEncodingNode getSwitchEncodingNode() { + if (switchEncodingNode == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + switchEncodingNode = insert(TruffleString.SwitchEncodingNode.create()); + } + return switchEncodingNode; + } + + protected TruffleString defaultConversion(VirtualFrame frame, InteropLibrary lib, Object object) { + try { + return getSwitchEncodingNode().execute(lib.asTruffleString(lib.toDisplayString(object)), TS_ENCODING); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere("toDisplayString result not convertible to String"); + } + } + } + + @Slot(value = SlotKind.tp_repr, isComplex = true) + @GenerateNodeFactory + abstract static class ReprNode extends StrNode { + @Child private ObjectNodes.DefaultObjectReprNode defaultReprNode; + + @Override + protected TruffleString defaultConversion(VirtualFrame frame, InteropLibrary lib, Object object) { + try { + if (getContext().getEnv().isHostObject(object)) { + boolean isMetaObject = lib.isMetaObject(object); + Object metaObject = null; + if (isMetaObject) { + metaObject = object; + } else if (lib.hasMetaObject(object)) { + metaObject = lib.getMetaObject(object); + } + if (metaObject != null) { + TruffleString displayName = getSwitchEncodingNode().execute(lib.asTruffleString(lib.toDisplayString(metaObject)), TS_ENCODING); + return simpleTruffleStringFormatUncached("<%s[%s] at 0x%s>", isMetaObject ? "JavaClass" : "JavaObject", displayName, + PythonAbstractObject.systemHashCodeAsHexString(object)); + } + } + } catch (UnsupportedMessageException e) { + // fallthrough to default + } + if (defaultReprNode == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + defaultReprNode = insert(ObjectNodes.DefaultObjectReprNode.create()); + } + return defaultReprNode.executeCached(frame, object); + } + } + + // NOTE: This does not get called e.g. for `~foreign`, only for non-__dunder__ methods or + // explicit calls like `foreign.__invert__()`. + @Slot(value = SlotKind.tp_getattro, isComplex = true) + @GenerateNodeFactory + abstract static class GetAttributeNode extends GetAttrBuiltinNode { + @Specialization + static Object doIt(VirtualFrame frame, Object self, Object name, + @Bind("this") Node inliningTarget, + @Cached UnboxNode unboxNode, + @Cached ObjectBuiltins.GetAttributeNode objectGetattrNode, + @Cached IsBuiltinObjectProfile isAttrError, + @Cached ForeignGetattrNode foreignGetattrNode) { + /* + * We unbox so we automatically get all methods from bool, int or float. We want the + * default Python attribute lookup first and try foreign members last. Because method + * calls in a Python source should prioritize Python methods over foreign methods. + */ + Object unboxed = unboxNode.execute(inliningTarget, self); + if (unboxed != null) { + try { + return objectGetattrNode.execute(frame, unboxed, name); + } catch (PException e) { + e.expect(inliningTarget, PythonBuiltinClassType.AttributeError, isAttrError); + } + } + + return foreignGetattrNode.execute(inliningTarget, self, name); + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignObjectBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignObjectBuiltins.java index 45bbd06aef..ec35c37e72 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignObjectBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignObjectBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -27,55 +27,11 @@ package com.oracle.graal.python.builtins.objects.foreign; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.AttributeError; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; import static com.oracle.graal.python.builtins.objects.str.StringUtils.simpleTruffleStringFormatUncached; -import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___BASES__; -import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___BASES__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___AND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CONTAINS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DELITEM__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DIR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DIVMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOORDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INDEX__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INSTANCECHECK__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RAND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RDIVMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RFLOORDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RSUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RTRUEDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RXOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___TRUEDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___XOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INSTANCECHECK__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LEN__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEXT__; -import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA_SPACE; -import static com.oracle.graal.python.nodes.StringLiterals.T_ELLIPSIS_IN_BRACKETS; -import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_BRACKETS; -import static com.oracle.graal.python.nodes.StringLiterals.T_LBRACKET; -import static com.oracle.graal.python.nodes.StringLiterals.T_NONE; -import static com.oracle.graal.python.nodes.StringLiterals.T_RBRACKET; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; -import java.math.BigInteger; import java.util.List; import com.oracle.graal.python.PythonLanguage; @@ -86,74 +42,52 @@ import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.PNotImplemented; import com.oracle.graal.python.builtins.objects.PythonAbstractObject; -import com.oracle.graal.python.builtins.objects.function.PKeyword; -import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.builtins.objects.list.ListBuiltins; +import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins; import com.oracle.graal.python.builtins.objects.object.ObjectNodes; -import com.oracle.graal.python.builtins.objects.str.StringBuiltins; +import com.oracle.graal.python.builtins.objects.set.PSet; +import com.oracle.graal.python.builtins.objects.set.SetNodes; import com.oracle.graal.python.builtins.objects.type.TpSlots; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.MpSubscriptBuiltinNode; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; +import com.oracle.graal.python.builtins.objects.type.TypeBuiltins; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotGetAttr.GetAttrBuiltinNode; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.NbBoolBuiltinNode; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.HashBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSetAttr.SetAttrBuiltinNode; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqItemBuiltinNode; -import com.oracle.graal.python.lib.PyNumberAddNode; -import com.oracle.graal.python.lib.PyNumberAsSizeNode; -import com.oracle.graal.python.lib.PyNumberMultiplyNode; -import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode; -import com.oracle.graal.python.lib.PyObjectRichCompareBool; -import com.oracle.graal.python.lib.PyObjectStrAsTruffleStringNode; +import com.oracle.graal.python.lib.PyObjectReprAsObjectNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.expression.BinaryArithmetic; -import com.oracle.graal.python.nodes.expression.BinaryArithmetic.BitAndNode; -import com.oracle.graal.python.nodes.expression.BinaryArithmetic.BitOrNode; -import com.oracle.graal.python.nodes.expression.BinaryArithmetic.BitXorNode; -import com.oracle.graal.python.nodes.expression.BinaryComparisonNode; -import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.graal.python.nodes.builtins.ListNodes; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.interop.PForeignToPTypeNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; -import com.oracle.graal.python.nodes.object.IsForeignObjectNode; +import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaStringNode; -import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext; import com.oracle.graal.python.runtime.GilNode; -import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateNodeFactory; -import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.interop.ArityException; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.InvalidArrayIndexException; -import com.oracle.truffle.api.interop.StopIterationException; import com.oracle.truffle.api.interop.UnknownIdentifierException; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.interop.UnsupportedTypeException; @@ -162,8 +96,13 @@ import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.api.strings.TruffleStringBuilder; +/* + * NOTE: We are not using IndirectCallContext here in this file + * because it seems unlikely that these interop messages would call back to Python + * and that we would also need precise frame info for that case. + * Adding it shouldn't hurt peak, but might be a non-trivial overhead in interpreter. + */ @CoreFunctions(extendClasses = PythonBuiltinClassType.ForeignObject) public final class ForeignObjectBuiltins extends PythonBuiltins { public static TpSlots SLOTS = ForeignObjectBuiltinsSlotsGen.SLOTS; @@ -173,615 +112,11 @@ protected List> getNodeFa return ForeignObjectBuiltinsFactory.getFactories(); } - @Slot(SlotKind.nb_bool) - @GenerateUncached + @Slot(value = SlotKind.tp_hash, isComplex = true) @GenerateNodeFactory - abstract static class BoolNode extends NbBoolBuiltinNode { + abstract static class HashNode extends HashBuiltinNode { @Specialization(limit = "getCallSiteInlineCacheMaxDepth()") - static boolean bool(Object receiver, - @CachedLibrary("receiver") InteropLibrary lib, - @Cached GilNode gil) { - gil.release(true); - try { - if (lib.isBoolean(receiver)) { - return lib.asBoolean(receiver); - } - if (lib.fitsInLong(receiver)) { - return lib.asLong(receiver) != 0; - } - if (lib.fitsInBigInteger(receiver)) { - return !isBigIntegerZero(lib.asBigInteger(receiver)); - } - if (lib.fitsInDouble(receiver)) { - return lib.asDouble(receiver) != 0.0; - } - if (lib.hasArrayElements(receiver)) { - return lib.getArraySize(receiver) != 0; - } - if (lib.hasHashEntries(receiver)) { - return lib.getHashSize(receiver) != 0; - } - if (lib.isString(receiver)) { - return !lib.asTruffleString(receiver).isEmpty(); - } - return !lib.isNull(receiver); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } finally { - gil.acquire(); - } - } - - @TruffleBoundary - static boolean isBigIntegerZero(BigInteger number) { - return number.compareTo(BigInteger.ZERO) == 0; - } - } - - static Object[] unpackForeignArray(Object left, InteropLibrary lib, PForeignToPTypeNode convert) { - try { - long sizeObj = lib.getArraySize(left); - if (sizeObj < Integer.MAX_VALUE) { - int size = (int) sizeObj; - Object[] data = new Object[size]; - - // read data - for (int i = 0; i < size; i++) { - data[i] = convert.executeConvert(lib.readArrayElement(left, i)); - } - - return data; - } - } catch (UnsupportedMessageException | InvalidArrayIndexException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("object does not unpack to array as it claims to"); - } - return null; - } - - @Slot(SlotKind.sq_length) - @Slot(SlotKind.mp_length) - @GenerateUncached - @GenerateNodeFactory - abstract static class LenNode extends LenBuiltinNode { - @Specialization - static int len(Object self, - @Bind("this") Node inliningTarget, - @CachedLibrary(limit = "3") InteropLibrary lib, - @Cached GilNode gil, - @Cached PRaiseNode.Lazy raiseNode) { - gil.release(true); - long result = 0; - boolean hasResult = false; - try { - if (lib.hasArrayElements(self)) { - result = lib.getArraySize(self); - hasResult = true; - } else if (lib.isIterator(self) || lib.hasIterator(self)) { - return 0; // a value signifying it has a length, but it's unknown - } else if (lib.hasHashEntries(self)) { - result = lib.getHashSize(self); - hasResult = true; - } - } catch (UnsupportedMessageException e) { - // fall through - } finally { - gil.acquire(); - } - if (hasResult) { - return PyNumberAsSizeNode.doLongExact(inliningTarget, result, OverflowError, raiseNode); - } else { - throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.FOREIGN_OBJ_HAS_NO_ATTR_S, T___LEN__); - } - } - } - - // TODO: remove once all dunder methods are converted to slots and to - // NormalizeForeignForBinopNode - abstract static class ForeignBinaryNode extends BinaryOpBuiltinNode { - @Child private BinaryOpNode op; - protected final boolean reverse; - - protected ForeignBinaryNode(BinaryOpNode op, boolean reverse) { - this.op = op; - this.reverse = reverse; - } - - @Specialization(guards = {"lib.isBoolean(left)"}) - Object doComparisonBool(VirtualFrame frame, Object left, Object right, - @Shared @CachedLibrary(limit = "3") InteropLibrary lib, - @Shared @Cached GilNode gil) { - boolean leftBoolean; - gil.release(true); - try { - leftBoolean = lib.asBoolean(left); - } catch (UnsupportedMessageException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("object does not unpack to boolean as it claims to"); - } finally { - gil.acquire(); - } - if (!reverse) { - return op.executeObject(frame, leftBoolean, right); - } else { - return op.executeObject(frame, right, leftBoolean); - } - - } - - @Specialization(guards = "lib.fitsInLong(left)") - Object doComparisonLong(VirtualFrame frame, Object left, Object right, - @Shared @CachedLibrary(limit = "3") InteropLibrary lib, - @Shared @Cached GilNode gil) { - assert !lib.isBoolean(left); - long leftLong; - gil.release(true); - try { - leftLong = lib.asLong(left); - } catch (UnsupportedMessageException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("object does not unpack to long as it claims to"); - } finally { - gil.acquire(); - } - if (!reverse) { - return op.executeObject(frame, leftLong, right); - } else { - return op.executeObject(frame, right, leftLong); - } - } - - @Specialization(guards = {"!lib.fitsInLong(left)", "lib.fitsInBigInteger(left)"}) - Object doComparisonBigInt(VirtualFrame frame, Object left, Object right, - @Shared @CachedLibrary(limit = "3") InteropLibrary lib, - @Shared @Cached GilNode gil, - @Cached.Exclusive @Cached PythonObjectFactory factory) { - assert !lib.isBoolean(left); - BigInteger leftBigInteger; - PInt leftInt; - gil.release(true); - try { - leftBigInteger = lib.asBigInteger(left); - leftInt = factory.createInt(leftBigInteger); - } catch (UnsupportedMessageException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("object does not unpack to BigInteger as it claims to"); - } finally { - gil.acquire(); - } - if (!reverse) { - return op.executeObject(frame, leftInt, right); - } else { - return op.executeObject(frame, right, leftInt); - } - } - - @Specialization(guards = {"!lib.fitsInLong(left)", "!lib.fitsInBigInteger(left)", "lib.fitsInDouble(left)"}) - Object doComparisonDouble(VirtualFrame frame, Object left, Object right, - @Shared @CachedLibrary(limit = "3") InteropLibrary lib, - @Shared @Cached GilNode gil) { - assert !lib.isBoolean(left); - double leftDouble; - gil.release(true); - try { - leftDouble = lib.asDouble(left); - } catch (UnsupportedMessageException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("object does not unpack to double as it claims to"); - } finally { - gil.acquire(); - } - if (!reverse) { - return op.executeObject(frame, leftDouble, right); - } else { - return op.executeObject(frame, right, leftDouble); - } - } - - @Specialization(guards = {"!lib.fitsInLong(left)", "!lib.fitsInBigInteger(left)", "!lib.fitsInDouble(left)", "lib.isString(left)"}) - Object doComparisonString(VirtualFrame frame, Object left, Object right, - @Shared @CachedLibrary(limit = "3") InteropLibrary lib, - @Cached TruffleString.SwitchEncodingNode switchEncodingNode, - @Shared @Cached GilNode gil) { - assert !lib.isBoolean(left); - TruffleString leftString; - gil.release(true); - try { - leftString = switchEncodingNode.execute(lib.asTruffleString(left), TS_ENCODING); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } finally { - gil.acquire(); - } - if (!reverse) { - return op.executeObject(frame, leftString, right); - } else { - return op.executeObject(frame, right, leftString); - } - } - - @SuppressWarnings("unused") - @Fallback - public static PNotImplemented doGeneric(Object left, Object right) { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - - @GenerateInline - @GenerateCached(false) - abstract static class NormalizeForeignForBinopNode extends Node { - public abstract Object execute(Node inliningTarget, Object value, boolean doArray); - - @Specialization(guards = {"lib.isBoolean(obj)"}) - Object doBool(Object obj, @SuppressWarnings("unused") boolean doArray, - @Shared @CachedLibrary(limit = "3") InteropLibrary lib, - @Shared @Cached(inline = false) GilNode gil) { - gil.release(true); - try { - return lib.asBoolean(obj); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } finally { - gil.acquire(); - } - } - - @Specialization(guards = "lib.fitsInLong(obj)") - Object doLong(Object obj, @SuppressWarnings("unused") boolean doArray, - @Shared @CachedLibrary(limit = "3") InteropLibrary lib, - @Shared @Cached(inline = false) GilNode gil) { - assert !lib.isBoolean(obj); - gil.release(true); - try { - return lib.asLong(obj); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } finally { - gil.acquire(); - } - } - - @Specialization(guards = {"!lib.fitsInLong(obj)", "lib.fitsInBigInteger(obj)"}) - Object doBigInt(Object obj, @SuppressWarnings("unused") boolean doArray, - @Shared @CachedLibrary(limit = "3") InteropLibrary lib, - @Shared @Cached(inline = false) GilNode gil, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - assert !lib.isBoolean(obj); - gil.release(true); - try { - return factory.createInt(lib.asBigInteger(obj)); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } finally { - gil.acquire(); - } - } - - @Specialization(guards = {"!lib.fitsInLong(obj)", "!lib.fitsInBigInteger(obj)", "lib.fitsInDouble(obj)"}) - Object doDouble(Object obj, @SuppressWarnings("unused") boolean doArray, - @Shared @CachedLibrary(limit = "3") InteropLibrary lib, - @Shared @Cached(inline = false) GilNode gil) { - assert !lib.isBoolean(obj); - gil.release(true); - try { - return lib.asDouble(obj); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } finally { - gil.acquire(); - } - } - - @Specialization(guards = {"!lib.fitsInLong(obj)", "!lib.fitsInBigInteger(obj)", "!lib.fitsInDouble(obj)", "lib.isString(obj)"}) - Object doString(Object obj, @SuppressWarnings("unused") boolean doArray, - @Shared @CachedLibrary(limit = "3") InteropLibrary lib, - @Cached(inline = false) TruffleString.SwitchEncodingNode switchEncodingNode, - @Shared @Cached(inline = false) GilNode gil) { - assert !lib.isBoolean(obj); - gil.release(true); - try { - return switchEncodingNode.execute(lib.asTruffleString(obj), TS_ENCODING); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } finally { - gil.acquire(); - } - } - - @Specialization(guards = {"doArray", "!lib.isBoolean(obj)", "!lib.fitsInLong(obj)", "!lib.fitsInBigInteger(obj)", // - "!lib.fitsInDouble(obj)", "!lib.isString(obj)", "lib.hasArrayElements(obj)"}) - Object doArray(Object obj, @SuppressWarnings("unused") boolean doArray, - @Shared @CachedLibrary(limit = "3") InteropLibrary lib, - @Shared @Cached(inline = false) GilNode gil, - @Cached(inline = false) PForeignToPTypeNode convert, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - gil.release(true); - try { - return factory.createList(unpackForeignArray(obj, lib, convert)); - } finally { - gil.acquire(); - } - } - - @Fallback - @SuppressWarnings("unused") - public static Object doGeneric(Object left, boolean doArray) { - return null; - } - } - - @GenerateInline - @GenerateCached(false) - abstract static class ForeignBinarySlotNode extends Node { - abstract Object execute(VirtualFrame frame, Node inliningTarget, Object left, Object right, - boolean leftDoArray, boolean rightDoArray, BinaryOpNode binaryOpNode); - - @Specialization - static Object doIt(VirtualFrame frame, Node inliningTarget, Object left, Object right, - boolean leftDoArray, boolean rightDoArray, BinaryOpNode op, - @Cached IsForeignObjectNode isForeignLeft, - @Cached IsForeignObjectNode isForeignRight, - @Cached NormalizeForeignForBinopNode normalizeLeft, - @Cached NormalizeForeignForBinopNode normalizeRight) { - boolean leftIsForeign = isForeignLeft.execute(inliningTarget, left); - boolean rightIsForeign = isForeignRight.execute(inliningTarget, right); - if (!leftIsForeign && !rightIsForeign) { - return PNotImplemented.NOT_IMPLEMENTED; - } - - Object newLeft = normalizeLeft.execute(inliningTarget, left, leftDoArray); - Object newRight = normalizeRight.execute(inliningTarget, right, rightDoArray); - assert newLeft == null || !IsForeignObjectNode.executeUncached(newLeft) : newLeft; - assert newRight == null || !IsForeignObjectNode.executeUncached(newRight) : newRight; - if (newLeft == null || newRight == null) { - return PNotImplemented.NOT_IMPLEMENTED; - } - return op.executeObject(frame, newLeft, newRight); - } - } - - @Slot(value = SlotKind.nb_add, isComplex = true) - @GenerateNodeFactory - abstract static class AddNode extends BinaryOpBuiltinNode { - @Specialization - static Object doIt(VirtualFrame frame, Object left, Object right, - @Bind("this") Node inliningTarget, - @Cached ForeignBinarySlotNode binarySlotNode, - @Cached(inline = false) PyNumberAddNode addNode) { - return binarySlotNode.execute(frame, inliningTarget, left, right, true, true, addNode); - } - } - - @Slot(value = SlotKind.nb_multiply, isComplex = true) - @GenerateNodeFactory - abstract static class MulNode extends BinaryOpBuiltinNode { - @Specialization - static Object doIt(VirtualFrame frame, Object left, Object right, - @Bind("this") Node inliningTarget, - @Cached ForeignBinarySlotNode binarySlotNode, - @Cached(inline = false) PyNumberMultiplyNode mulNode) { - return binarySlotNode.execute(frame, inliningTarget, left, right, true, true, mulNode); - } - } - - @Builtin(name = J___SUB__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class SubNode extends ForeignBinaryNode { - SubNode() { - super(BinaryArithmetic.Sub.create(), false); - } - } - - @Builtin(name = J___RSUB__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class RSubNode extends ForeignBinaryNode { - RSubNode() { - super(BinaryArithmetic.Sub.create(), true); - } - } - - @Builtin(name = J___TRUEDIV__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class TrueDivNode extends ForeignBinaryNode { - TrueDivNode() { - super(BinaryArithmetic.TrueDiv.create(), false); - } - } - - @Builtin(name = J___RTRUEDIV__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class RTrueDivNode extends ForeignBinaryNode { - RTrueDivNode() { - super(BinaryArithmetic.TrueDiv.create(), true); - } - } - - @Builtin(name = J___FLOORDIV__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class FloorDivNode extends ForeignBinaryNode { - FloorDivNode() { - super(BinaryArithmetic.FloorDiv.create(), false); - } - } - - @Builtin(name = J___RFLOORDIV__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class RFloorDivNode extends ForeignBinaryNode { - RFloorDivNode() { - super(BinaryArithmetic.FloorDiv.create(), true); - } - } - - @Builtin(name = J___DIVMOD__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class DivModNode extends ForeignBinaryNode { - DivModNode() { - super(BinaryArithmetic.DivMod.create(), false); - } - } - - @Builtin(name = J___RDIVMOD__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class RDivModNode extends ForeignBinaryNode { - RDivModNode() { - super(BinaryArithmetic.DivMod.create(), true); - } - } - - public abstract static class ForeignBinaryComparisonNode extends PythonBinaryBuiltinNode { - @Child private BinaryComparisonNode comparisonNode; - - protected ForeignBinaryComparisonNode(BinaryComparisonNode op) { - this.comparisonNode = op; - } - - @Specialization(guards = {"lib.isBoolean(left)"}) - Object doComparisonBool(VirtualFrame frame, Object left, Object right, - @Shared @CachedLibrary(limit = "3") InteropLibrary lib, - @Shared @Cached GilNode gil) { - boolean leftBoolean; - gil.release(true); - try { - leftBoolean = lib.asBoolean(left); - } catch (UnsupportedMessageException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("object does not unpack to boolean for comparison as it claims to"); - } finally { - gil.acquire(); - } - return comparisonNode.executeObject(frame, leftBoolean, right); - } - - @Specialization(guards = {"lib.fitsInLong(left)"}) - Object doComparisonLong(VirtualFrame frame, Object left, Object right, - @Shared @CachedLibrary(limit = "3") InteropLibrary lib, - @Shared @Cached GilNode gil) { - long leftLong; - gil.release(true); - try { - leftLong = lib.asLong(left); - } catch (UnsupportedMessageException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("object does not unpack to long for comparison as it claims to"); - } finally { - gil.acquire(); - } - return comparisonNode.executeObject(frame, leftLong, right); - } - - @Specialization(guards = {"!lib.fitsInLong(left)", "lib.fitsInBigInteger(left)"}) - Object doComparisonBigInt(VirtualFrame frame, Object left, Object right, - @Shared @CachedLibrary(limit = "3") InteropLibrary lib, - @Shared @Cached GilNode gil, - @Cached PythonObjectFactory factory) { - BigInteger leftBigInteger; - PInt leftInt; - gil.release(true); - try { - leftBigInteger = lib.asBigInteger(left); - leftInt = factory.createInt(leftBigInteger); - } catch (UnsupportedMessageException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("object does not unpack to BigInteger as it claims to"); - } finally { - gil.acquire(); - } - return comparisonNode.executeObject(frame, leftInt, right); - } - - @Specialization(guards = {"lib.fitsInDouble(left)"}) - Object doComparisonDouble(VirtualFrame frame, Object left, Object right, - @Shared @CachedLibrary(limit = "3") InteropLibrary lib, - @Shared @Cached GilNode gil) { - double leftDouble; - gil.release(true); - try { - leftDouble = lib.asDouble(left); - } catch (UnsupportedMessageException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("object does not unpack to double for comparison as it claims to"); - } finally { - gil.acquire(); - } - return comparisonNode.executeObject(frame, leftDouble, right); - } - - @Specialization(guards = "lib.isNull(left)") - Object doComparison(VirtualFrame frame, @SuppressWarnings("unused") Object left, Object right, - @SuppressWarnings("unused") @Shared @CachedLibrary(limit = "3") InteropLibrary lib) { - return comparisonNode.executeObject(frame, PNone.NONE, right); - } - - @Specialization(guards = "lib.isString(left)") - Object doComparisonString(VirtualFrame frame, @SuppressWarnings("unused") Object left, Object right, - @Shared @CachedLibrary(limit = "3") InteropLibrary lib, - @Shared @Cached GilNode gil, - @Cached TruffleString.SwitchEncodingNode switchEncodingNode) { - TruffleString leftString; - gil.release(true); - try { - leftString = switchEncodingNode.execute(lib.asTruffleString(left), TS_ENCODING); - } catch (UnsupportedMessageException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("object does not unpack to string for comparison as it claims to"); - } finally { - gil.acquire(); - } - return comparisonNode.executeObject(frame, leftString, right); - } - - @SuppressWarnings("unused") - @Fallback - public static PNotImplemented doGeneric(Object left, Object right) { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - - @Builtin(name = J___LT__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class LtNode extends ForeignBinaryComparisonNode { - protected LtNode() { - super(BinaryComparisonNode.LtNode.create()); - } - } - - @Builtin(name = J___LE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class LeNode extends ForeignBinaryComparisonNode { - protected LeNode() { - super(BinaryComparisonNode.LeNode.create()); - } - } - - @Builtin(name = J___GT__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class GtNode extends ForeignBinaryComparisonNode { - protected GtNode() { - super(BinaryComparisonNode.GtNode.create()); - } - } - - @Builtin(name = J___GE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class GeNode extends ForeignBinaryComparisonNode { - protected GeNode() { - super(BinaryComparisonNode.GeNode.create()); - } - } - - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class EqNode extends ForeignBinaryComparisonNode { - protected EqNode() { - super(BinaryComparisonNode.EqNode.create()); - } - } - - @Builtin(name = J___HASH__, minNumOfPositionalArgs = 1) - @GenerateNodeFactory - abstract static class HashNode extends PythonUnaryBuiltinNode { - @Specialization(limit = "getCallSiteInlineCacheMaxDepth()") - static int hash(Object self, + static long hash(Object self, @CachedLibrary("self") InteropLibrary library) { if (library.hasIdentity(self)) { try { @@ -799,241 +134,6 @@ private static int hashCodeBoundary(Object self) { } } - @Builtin(name = J___CONTAINS__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class ContainsNode extends PythonBinaryBuiltinNode { - @Specialization - static Object contains(VirtualFrame frame, Object self, Object arg, - // accesses both self and iterator - @CachedLibrary(limit = "3") InteropLibrary library, - @Bind("this") Node inliningTarget, - @Cached PyObjectRichCompareBool.EqNode eqNode, - @Cached TruffleString.SwitchEncodingNode switchEncodingNode, - @Cached StringBuiltins.ContainsNode containsNode, - @Cached PForeignToPTypeNode convertNode, - @Cached PRaiseNode.Lazy raiseNode) { - try { - if (library.isString(self)) { - TruffleString selfStr = switchEncodingNode.execute(library.asTruffleString(self), TS_ENCODING); - return containsNode.execute(frame, selfStr, arg); - } - if (library.hasArrayElements(self)) { - for (int i = 0; i < library.getArraySize(self); i++) { - if (library.isArrayElementReadable(self, i)) { - Object element = convertNode.executeConvert(library.readArrayElement(self, i)); - if (eqNode.compare(frame, inliningTarget, arg, element)) { - return true; - } - } - } - return false; - } - Object iterator = null; - if (library.isIterator(self)) { - iterator = self; - } else if (library.hasHashEntries(self)) { - iterator = library.getHashKeysIterator(self); - } else if (library.hasIterator(self)) { - iterator = library.getIterator(self); - } - if (iterator != null) { - try { - while (library.hasIteratorNextElement(iterator)) { - Object next = convertNode.executeConvert(library.getIteratorNextElement(iterator)); - if (eqNode.compare(frame, inliningTarget, arg, next)) { - return true; - } - } - } catch (StopIterationException e) { - // fallthrough - } - return false; - } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.FOREIGN_OBJ_ISNT_ITERABLE); - } catch (UnsupportedMessageException | InvalidArrayIndexException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - } - } - - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) - @GenerateNodeFactory - public abstract static class IterNode extends PythonUnaryBuiltinNode { - - @Specialization(limit = "3") - static Object doGeneric(Object object, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode raiseNode, - @CachedLibrary("object") InteropLibrary lib, - @Cached PForeignToPTypeNode convertNode, - @Cached TruffleString.SwitchEncodingNode switchEncodingNode, - @Cached GilNode gil) { - gil.release(true); - try { - if (lib.isIterator(object)) { - return convertNode.executeConvert(object); - } else if (lib.hasIterator(object)) { - return convertNode.executeConvert(lib.getIterator(object)); - } else if (lib.hasArrayElements(object)) { - long size = lib.getArraySize(object); - if (size < Integer.MAX_VALUE) { - return factory.createForeignArrayIterator(object); - } - throw raiseNode.raise(TypeError, ErrorMessages.FOREIGN_OBJ_ISNT_ITERABLE); - } else if (lib.isString(object)) { - return factory.createStringIterator(switchEncodingNode.execute(lib.asTruffleString(object), TS_ENCODING)); - } else if (lib.hasHashEntries(object)) { - // just like dict.__iter__, we take the keys by default - return convertNode.executeConvert(lib.getHashKeysIterator(object)); - } - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } finally { - gil.acquire(); - } - throw raiseNode.raise(TypeError, ErrorMessages.FOREIGN_OBJ_ISNT_ITERABLE); - } - } - - @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1) - @GenerateNodeFactory - public abstract static class NextNode extends PythonUnaryBuiltinNode { - - @Specialization(limit = "getCallSiteInlineCacheMaxDepth()") - static Object doForeignArray(Object iterator, - @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile notIterator, - @Cached PRaiseNode raiseNode, - @CachedLibrary("iterator") InteropLibrary lib, - @Cached PForeignToPTypeNode convertNode, - @Cached GilNode gil) { - if (notIterator.profile(inliningTarget, lib.isIterator(iterator))) { - gil.release(true); - try { - return convertNode.executeConvert(lib.getIteratorNextElement(iterator)); - } catch (StopIterationException e) { - throw raiseNode.raiseStopIteration(); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere("iterator claimed to be iterator but wasn't"); - } finally { - gil.acquire(); - } - } else { - throw raiseNode.raise(AttributeError, ErrorMessages.FOREIGN_OBJ_HAS_NO_ATTR_S, T___NEXT__); - } - } - } - - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) - @GenerateNodeFactory - abstract static class NewNode extends PythonBuiltinNode { - /** - * A foreign function call specializes on the length of the passed arguments. Any - * optimization based on the callee has to happen on the other side.a - */ - @Specialization(guards = {"isForeignObjectNode.execute(inliningTarget, callee)", "!isNoValue(callee)", "keywords.length == 0"}, limit = "1") - static Object doInteropCall(Object callee, Object[] arguments, @SuppressWarnings("unused") PKeyword[] keywords, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached IsForeignObjectNode isForeignObjectNode, - @CachedLibrary(limit = "3") InteropLibrary lib, - @Cached PForeignToPTypeNode toPTypeNode, - @Cached GilNode gil, - @Cached PRaiseNode.Lazy raiseNode) { - gil.release(true); - try { - Object res = lib.instantiate(callee, arguments); - return toPTypeNode.executeConvert(res); - } catch (ArityException | UnsupportedTypeException | UnsupportedMessageException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.INVALID_INSTANTIATION_OF_FOREIGN_OBJ); - } finally { - gil.acquire(); - } - } - - @Fallback - @SuppressWarnings("unused") - static Object doGeneric(Object callee, Object arguments, Object keywords, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.INVALID_INSTANTIATION_OF_FOREIGN_OBJ); - } - } - - @Builtin(name = J___CALL__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) - @GenerateNodeFactory - public abstract static class CallNode extends PythonBuiltinNode { - public final Object executeWithArgs(VirtualFrame frame, Object callee, Object[] arguments) { - return execute(frame, callee, arguments, PKeyword.EMPTY_KEYWORDS); - } - - public abstract Object execute(VirtualFrame frame, Object callee, Object[] arguments, PKeyword[] keywords); - - /** - * A foreign function call specializes on the length of the passed arguments. Any - * optimization based on the callee has to happen on the other side. - */ - @Specialization(guards = {"isForeignObjectNode.execute(inliningTarget, callee)", "!isNoValue(callee)", "keywords.length == 0"}, limit = "1") - static Object doInteropCall(VirtualFrame frame, Object callee, Object[] arguments, @SuppressWarnings("unused") PKeyword[] keywords, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @Cached("createFor(this)") IndirectCallData indirectCallData, - @SuppressWarnings("unused") @Cached IsForeignObjectNode isForeignObjectNode, - @CachedLibrary(limit = "4") InteropLibrary lib, - @Cached PForeignToPTypeNode toPTypeNode, - @Cached GilNode gil, - @Cached PRaiseNode.Lazy raiseNode) { - PythonLanguage language = PythonLanguage.get(inliningTarget); - PythonContext context = PythonContext.get(inliningTarget); - try { - Object state = IndirectCallContext.enter(frame, language, context, indirectCallData); - gil.release(true); - try { - if (lib.isExecutable(callee)) { - return toPTypeNode.executeConvert(lib.execute(callee, arguments)); - } else { - return toPTypeNode.executeConvert(lib.instantiate(callee, arguments)); - } - } finally { - gil.acquire(); - IndirectCallContext.exit(frame, language, context, state); - } - } catch (ArityException | UnsupportedTypeException | UnsupportedMessageException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.INVALID_INSTANTIATION_OF_FOREIGN_OBJ); - } - } - - @Fallback - @SuppressWarnings("unused") - static Object doGeneric(Object callee, Object arguments, Object keywords, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.INVALID_INSTANTIATION_OF_FOREIGN_OBJ); - } - - @NeverDefault - public static CallNode create() { - return ForeignObjectBuiltinsFactory.CallNodeFactory.create(null); - } - } - - @Slot(value = SlotKind.sq_item, isComplex = true) - @GenerateNodeFactory - abstract static class ForeignSqItemNode extends SqItemBuiltinNode { - @Specialization(limit = "3") - static Object doit(VirtualFrame frame, Object object, int key, - @CachedLibrary("object") InteropLibrary interop, - @Cached AccessForeignItemNodes.GetForeignItemNode getForeignItemNode) { - return getForeignItemNode.readForeignIndex(object, key, interop); - } - } - - @Slot(value = SlotKind.mp_subscript, isComplex = true) - @GenerateNodeFactory - abstract static class ForeignMpSubNode extends MpSubscriptBuiltinNode { - @Specialization - static Object doit(VirtualFrame frame, Object object, Object key, - @Cached AccessForeignItemNodes.GetForeignItemNode getForeignItemNode) { - return getForeignItemNode.execute(frame, object, key); - } - } - @Slot(value = SlotKind.tp_getattro, isComplex = true) @GenerateNodeFactory abstract static class GetAttributeNode extends GetAttrBuiltinNode { @@ -1043,10 +143,12 @@ static Object doIt(VirtualFrame frame, Object self, Object name, @Cached ObjectBuiltins.GetAttributeNode objectGetattrNode, @Cached IsBuiltinObjectProfile isAttrError, @Cached ForeignGetattrNode foreignGetattrNode) { + /* + * We want the default Python attribute lookup first and try foreign members last. + * Because method calls in a Python source should prioritize Python methods over foreign + * methods. + */ try { - // We want the default Python attribute lookup first and try foreign members last. - // Because method calls in a Python source should prioritize Python methods over - // foreign methods. return objectGetattrNode.execute(frame, self, name); } catch (PException e) { e.expect(inliningTarget, PythonBuiltinClassType.AttributeError, isAttrError); @@ -1063,8 +165,8 @@ private static String asJavaPrefixedMethod(String prefix, String member) { @GenerateInline @GenerateCached(false) @ImportStatic(PythonOptions.class) - abstract static class ForeignGetattrNode extends Node { - abstract Object execute(Node inliningTarget, Object object, Object name); + public abstract static class ForeignGetattrNode extends Node { + public abstract Object execute(Node inliningTarget, Object object, Object name); @Specialization static Object doIt(Node inliningTarget, Object object, Object memberObj, @@ -1072,10 +174,16 @@ static Object doIt(Node inliningTarget, Object object, Object memberObj, @Cached(inline = false) CastToJavaStringNode castToString, @Cached(inline = false) GilNode gil, @Cached(inline = false) PForeignToPTypeNode toPythonNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { gil.release(true); try { - String member = castToString.execute(memberObj); + String member; + try { + member = castToString.execute(memberObj); + } catch (CannotCastException e) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ATTR_NAME_MUST_BE_STRING, memberObj); + } + if (read.isMemberReadable(object, member)) { return toPythonNode.executeConvert(read.readMember(object, member)); } else if (PythonLanguage.get(inliningTarget).getEngineOption(PythonOptions.EmulateJython)) { @@ -1091,13 +199,11 @@ static Object doIt(Node inliningTarget, Object object, Object memberObj, } } } - } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_NAME_MUST_BE_STRING, memberObj); } catch (UnknownIdentifierException | UnsupportedMessageException | ArityException ignore) { } finally { gil.acquire(); } - throw raiseNode.get(inliningTarget).raise(PythonErrorType.AttributeError, ErrorMessages.FOREIGN_OBJ_HAS_NO_ATTR_S, memberObj); + throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.FOREIGN_OBJ_HAS_NO_ATTR_S, memberObj); } } @@ -1111,13 +217,13 @@ static void doSet(Object object, Object key, Object value, @Shared @CachedLibrary(limit = "3") InteropLibrary lib, @Shared @Cached CastToJavaStringNode castToString, @Shared @Cached GilNode gil, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { gil.release(true); String member; try { member = castToString.execute(key); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_NAME_MUST_BE_STRING, key); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_NAME_MUST_BE_STRING, key); } try { try { @@ -1140,11 +246,11 @@ static void doSet(Object object, Object key, Object value, } } } catch (UnsupportedTypeException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.INVALID_TYPE_FOR_S, key); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.INVALID_TYPE_FOR_S, key); } finally { gil.acquire(); } - throw raiseNode.get(inliningTarget).raise(PythonErrorType.AttributeError, ErrorMessages.FOREIGN_OBJ_HAS_NO_ATTR_S, key); + throw raiseNode.raise(inliningTarget, PythonErrorType.AttributeError, ErrorMessages.FOREIGN_OBJ_HAS_NO_ATTR_S, key); } @Specialization(guards = "isNoValue(value)") @@ -1153,188 +259,99 @@ static void doDelete(Object object, Object key, @SuppressWarnings("unused") PNon @Shared @CachedLibrary(limit = "3") InteropLibrary lib, @Shared @Cached CastToJavaStringNode castToString, @Shared @Cached GilNode gil, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { gil.release(true); try { lib.removeMember(object, castToString.execute(key)); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_NAME_MUST_BE_STRING, key); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_NAME_MUST_BE_STRING, key); } catch (UnknownIdentifierException | UnsupportedMessageException e) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.AttributeError, ErrorMessages.FOREIGN_OBJ_HAS_NO_ATTR_S, key); + throw raiseNode.raise(inliningTarget, PythonErrorType.AttributeError, ErrorMessages.FOREIGN_OBJ_HAS_NO_ATTR_S, key); } finally { gil.acquire(); } } } - @Builtin(name = J___SETITEM__, minNumOfPositionalArgs = 3) - @GenerateNodeFactory - abstract static class SetitemNode extends PythonTernaryBuiltinNode { - @Child private AccessForeignItemNodes.SetForeignItemNode setForeignItemNode = AccessForeignItemNodes.SetForeignItemNode.create(); - - @Specialization - Object doit(VirtualFrame frame, Object object, Object key, Object value) { - setForeignItemNode.execute(frame, object, key, value); - return PNone.NONE; - } - } - - @Builtin(name = J___DELITEM__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class DelitemNode extends PythonBinaryBuiltinNode { - @Child private AccessForeignItemNodes.RemoveForeignItemNode delForeignItemNode = AccessForeignItemNodes.RemoveForeignItemNode.create(); - - @Specialization - PNone doit(VirtualFrame frame, Object object, Object key) { - delForeignItemNode.execute(frame, object, key); - return PNone.NONE; - } - } - @Builtin(name = J___DIR__, minNumOfPositionalArgs = 1) @GenerateNodeFactory abstract static class DirNode extends PythonUnaryBuiltinNode { @Specialization - protected Object doIt(Object object, + protected Object doIt(VirtualFrame frame, Object object, @Bind("this") Node inliningTarget, @CachedLibrary(limit = "3") InteropLibrary lib, + @CachedLibrary(limit = "3") InteropLibrary arrayInterop, + @CachedLibrary(limit = "3") InteropLibrary stringInterop, + @Cached TruffleString.SwitchEncodingNode switchEncodingNode, @Cached GilNode gil, - @Cached PythonObjectFactory.Lazy factory) { - if (lib.hasMembers(object)) { + @Cached InlinedConditionProfile profile, + @Cached GetClassNode getClassNode, + @Cached TypeBuiltins.DirNode typeDirNode, + @Cached SetNodes.AddNode addNode, + @Cached(inline = false) ListBuiltins.ListSortNode sortNode, + @Cached(inline = false) ListNodes.ConstructListNode constructListNode) { + // Inspired by ObjectBuiltins.DirNode + var pythonClass = getClassNode.execute(inliningTarget, object); + PSet attributes = typeDirNode.execute(frame, pythonClass); + + if (profile.profile(inliningTarget, lib.hasMembers(object))) { + final Object members; gil.release(true); try { - return lib.getMembers(object); + members = lib.getMembers(object); } catch (UnsupportedMessageException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("foreign object claims to have members, but does not return them"); + throw CompilerDirectives.shouldNotReachHere("foreign object claims to have members, but does not return them"); } finally { gil.acquire(); } - } else { - return factory.get(inliningTarget).createList(); - } - } - } - @Builtin(name = J___INDEX__, minNumOfPositionalArgs = 1) - @GenerateNodeFactory - abstract static class IndexNode extends PythonUnaryBuiltinNode { - @Specialization(limit = "3") - protected static Object doIt(Object object, - @Cached PRaiseNode raiseNode, - @CachedLibrary("object") InteropLibrary lib, - @Cached GilNode gil, - @Cached PythonObjectFactory factory) { - gil.release(true); - try { - if (lib.isBoolean(object)) { - try { - return PInt.intValue(lib.asBoolean(object)); - } catch (UnsupportedMessageException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("foreign value claims to be a boolean but isn't"); - } - } - if (lib.fitsInInt(object)) { - try { - return lib.asInt(object); - } catch (UnsupportedMessageException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("foreign value claims it fits into index-sized int, but doesn't"); - } - } - if (lib.fitsInLong(object)) { - try { - return lib.asLong(object); - } catch (UnsupportedMessageException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("foreign value claims it fits into index-sized long, but doesn't"); - } - } - if (lib.fitsInBigInteger(object)) { - try { - var big = lib.asBigInteger(object); - return factory.createInt(big); - } catch (UnsupportedMessageException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("foreign value claims to be a big integer but isn't"); + try { + long size = arrayInterop.getArraySize(members); + for (int i = 0; i < size; i++) { + TruffleString memberString = stringInterop.asTruffleString(arrayInterop.readArrayElement(members, i)); + memberString = switchEncodingNode.execute(memberString, TS_ENCODING); + addNode.execute(frame, attributes, memberString); } + } catch (UnsupportedMessageException | InvalidArrayIndexException e) { + throw CompilerDirectives.shouldNotReachHere(e); } - throw raiseNode.raiseIntegerInterpretationError(object); - } finally { - gil.acquire(); } + + // set to sorted list, like in PyObjectDir + PList list = constructListNode.execute(frame, attributes); + sortNode.execute(frame, list); + return list; } } - @Builtin(name = J___STR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_str, isComplex = true) @GenerateNodeFactory abstract static class StrNode extends PythonUnaryBuiltinNode { @Child private TruffleString.SwitchEncodingNode switchEncodingNode; + private static final TpSlot FOREIGN_REPR = SLOTS.tp_repr(); + @Specialization Object str(VirtualFrame frame, Object object, @Bind("this") Node inliningTarget, + @Cached GetObjectSlotsNode getSlots, + @Cached PyObjectReprAsObjectNode reprNode, @CachedLibrary(limit = "3") InteropLibrary lib, - @Cached GilNode gil, - @Cached PyObjectStrAsTruffleStringNode strNode, - @Cached StrForeignArrayNode strForeignArrayNode, - @Cached InlinedBranchProfile isNull, - @Cached InlinedBranchProfile isBoolean, - @Cached InlinedBranchProfile isString, - @Cached InlinedBranchProfile isLong, - @Cached InlinedBranchProfile isDouble, + @Cached ObjectNodes.DefaultObjectReprNode defaultReprNode, + @Cached InlinedBranchProfile isIterator, @Cached InlinedBranchProfile defaultCase) { - try { - if (lib.isNull(object)) { - isNull.enter(inliningTarget); - return T_NONE; - } else if (lib.isBoolean(object)) { - isBoolean.enter(inliningTarget); - boolean value; - gil.release(true); - try { - value = lib.asBoolean(object); - } finally { - gil.acquire(); - } - return strNode.execute(frame, inliningTarget, value); - } else if (lib.isString(object)) { - isString.enter(inliningTarget); - TruffleString value; - gil.release(true); - try { - value = lib.asTruffleString(object); - } finally { - gil.acquire(); - } - return strNode.execute(frame, inliningTarget, getSwitchEncodingNode().execute(value, TS_ENCODING)); - } else if (lib.fitsInLong(object)) { - isLong.enter(inliningTarget); - long value; - gil.release(true); - try { - value = lib.asLong(object); - } finally { - gil.acquire(); - } - return strNode.execute(frame, inliningTarget, value); - } else if (lib.fitsInDouble(object)) { - isDouble.enter(inliningTarget); - double value; - gil.release(true); - try { - value = lib.asDouble(object); - } finally { - gil.acquire(); - } - return strNode.execute(frame, inliningTarget, value); - } else if (lib.hasArrayElements(object)) { - return strForeignArrayNode.execute(frame, object, lib); - } - } catch (UnsupportedMessageException e) { - // Fall back to the generic impl + // Check if __repr__ is defined before foreign, if so call that, like object.__str__ + // would do + TpSlots slots = getSlots.execute(inliningTarget, object); + if (slots.tp_repr() != FOREIGN_REPR) { + return reprNode.execute(frame, inliningTarget, object); } + + if (lib.isIterator(object)) { + isIterator.enter(inliningTarget); + return defaultReprNode.execute(frame, inliningTarget, object); + } + defaultCase.enter(inliningTarget); return defaultConversion(frame, lib, object); } @@ -1347,7 +364,7 @@ protected TruffleString.SwitchEncodingNode getSwitchEncodingNode() { return switchEncodingNode; } - protected TruffleString defaultConversion(@SuppressWarnings("unused") VirtualFrame frame, InteropLibrary lib, Object object) { + protected TruffleString defaultConversion(VirtualFrame frame, InteropLibrary lib, Object object) { try { return getSwitchEncodingNode().execute(lib.asTruffleString(lib.toDisplayString(object)), TS_ENCODING); } catch (UnsupportedMessageException e) { @@ -1356,61 +373,7 @@ protected TruffleString defaultConversion(@SuppressWarnings("unused") VirtualFra } } - @GenerateInline(false) // Uncommon path - abstract static class StrForeignArrayNode extends Node { - abstract TruffleString execute(VirtualFrame frame, Object object, InteropLibrary lib) throws UnsupportedMessageException; - - @Specialization - static TruffleString str(VirtualFrame frame, Object object, InteropLibrary lib, - @Bind("this") Node inliningTarget, - @Cached GilNode gil, - @Cached PyObjectReprAsTruffleStringNode reprNode, - @Cached TruffleStringBuilder.AppendStringNode appendStringNode, - @Cached TruffleStringBuilder.ToStringNode toStringNode) throws UnsupportedMessageException { - if (!PythonContext.get(inliningTarget).reprEnter(object)) { - return T_ELLIPSIS_IN_BRACKETS; - } - try { - long length; - gil.release(true); - try { - length = lib.getArraySize(object); - } finally { - gil.acquire(); - } - if (length == 0) { - return T_EMPTY_BRACKETS; - } - TruffleStringBuilder buf = TruffleStringBuilder.create(TS_ENCODING); - appendStringNode.execute(buf, T_LBRACKET); - boolean initial = true; - for (int index = 0; index < length; index++) { - if (initial) { - initial = false; - } else { - appendStringNode.execute(buf, T_COMMA_SPACE); - } - Object value; - gil.release(true); - try { - value = lib.readArrayElement(object, index); - } catch (InvalidArrayIndexException e) { - // Concurrent modification? - break; - } finally { - gil.acquire(); - } - appendStringNode.execute(buf, reprNode.execute(frame, inliningTarget, value)); - } - appendStringNode.execute(buf, T_RBRACKET); - return toStringNode.execute(buf); - } finally { - PythonContext.get(inliningTarget).reprLeave(object); - } - } - } - - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends StrNode { @Child private ObjectNodes.DefaultObjectReprNode defaultReprNode; @@ -1443,130 +406,4 @@ protected TruffleString defaultConversion(VirtualFrame frame, InteropLibrary lib } } - @Builtin(name = J___BASES__, minNumOfPositionalArgs = 1, isGetter = true, isSetter = false) - @GenerateNodeFactory - @ImportStatic(PGuards.class) - abstract static class BasesNode extends PythonUnaryBuiltinNode { - @Specialization(limit = "3") - static Object getBases(Object self, - @Bind("this") Node inliningTarget, - @CachedLibrary("self") InteropLibrary lib, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { - if (lib.isMetaObject(self)) { - return factory.createTuple(PythonUtils.EMPTY_OBJECT_ARRAY); - } else { - throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.FOREIGN_OBJ_HAS_NO_ATTR_S, T___BASES__); - } - } - } - - @Builtin(name = J___INSTANCECHECK__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - @ImportStatic(PGuards.class) - abstract static class InstancecheckNode extends PythonBinaryBuiltinNode { - @Specialization(limit = "3") - static Object check(Object self, Object instance, - @Bind("this") Node inliningTarget, - @CachedLibrary("self") InteropLibrary lib, - @Cached GilNode gil, - @Cached PRaiseNode.Lazy raiseNode) { - if (lib.isMetaObject(self)) { - gil.release(true); - try { - return lib.isMetaInstance(self, instance); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(); - } finally { - gil.acquire(); - } - } else { - throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.FOREIGN_OBJ_HAS_NO_ATTR_S, T___INSTANCECHECK__); - } - } - } - - @Builtin(name = J___RAND__, minNumOfPositionalArgs = 2) - @Builtin(name = J___AND__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class AndNode extends PythonBinaryBuiltinNode { - @Specialization(limit = "3") - protected static Object op(VirtualFrame frame, Object left, Object right, - @Cached BitAndNode andNode, - @CachedLibrary("left") InteropLibrary lib, - @Cached GilNode gil) { - if (lib.isNumber(left) && lib.fitsInLong(left)) { - try { - long leftLong; - gil.release(true); - try { - leftLong = lib.asLong(left); - } finally { - gil.acquire(); - } - return andNode.executeObject(frame, leftLong, right); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } else { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - } - - @Builtin(name = J___ROR__, minNumOfPositionalArgs = 2) - @Builtin(name = J___OR__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class OrNode extends PythonBinaryBuiltinNode { - @Specialization(limit = "3") - protected static Object op(VirtualFrame frame, Object left, Object right, - @Cached BitOrNode orNode, - @CachedLibrary("left") InteropLibrary lib, - @Cached GilNode gil) { - if (lib.isNumber(left) && lib.fitsInLong(left)) { - try { - long leftLong; - gil.release(true); - try { - leftLong = lib.asLong(left); - } finally { - gil.acquire(); - } - return orNode.executeObject(frame, leftLong, right); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } else { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - } - - @Builtin(name = J___RXOR__, minNumOfPositionalArgs = 2) - @Builtin(name = J___XOR__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class XorNode extends PythonBinaryBuiltinNode { - @Specialization(limit = "3") - protected static Object op(VirtualFrame frame, Object left, Object right, - @Cached BitXorNode xorNode, - @CachedLibrary("left") InteropLibrary lib, - @Cached GilNode gil) { - if (lib.isNumber(left) && lib.fitsInLong(left)) { - try { - long leftLong; - gil.release(true); - try { - leftLong = lib.asLong(left); - } finally { - gil.acquire(); - } - return xorNode.executeObject(frame, leftLong, right); - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere(); - } - } else { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/frame/FrameBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/frame/FrameBuiltins.java index aedd3d0878..e91e50c63c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/frame/FrameBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/frame/FrameBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -26,10 +26,12 @@ package com.oracle.graal.python.builtins.objects.frame; import static com.oracle.graal.python.builtins.objects.PythonAbstractObject.objectHashCodeAsHexString; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -44,6 +46,7 @@ import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins.DictNode; import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.lib.PyLongAsLongAndOverflowNode; import com.oracle.graal.python.lib.PyLongCheckExactNode; import com.oracle.graal.python.nodes.ErrorMessages; @@ -58,7 +61,8 @@ import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaBooleanNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.OverflowException; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.RootCallTarget; @@ -78,12 +82,14 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PFrame) public final class FrameBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = FrameBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return FrameBuiltinsFactory.getFactories(); } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization @@ -109,8 +115,7 @@ public abstract static class GetGlobalsNode extends PythonBuiltinNode { public abstract Object execute(VirtualFrame frame, PFrame self); @Specialization - Object get(VirtualFrame curFrame, PFrame self, - @Cached PythonObjectFactory factory) { + Object get(VirtualFrame curFrame, PFrame self) { PythonObject globals = self.getGlobals(); if (globals instanceof PythonModule) { if (getDictNode == null) { @@ -119,7 +124,7 @@ Object get(VirtualFrame curFrame, PFrame self, } return getDictNode.execute(curFrame, globals, PNone.NO_VALUE); } else { - return globals != null ? globals : factory.createDict(); + return globals != null ? globals : PFactory.createDict(PythonLanguage.get(this)); } } @@ -155,8 +160,8 @@ public abstract static class LinenoNode extends PythonBinaryBuiltinNode { @Specialization Object delete(VirtualFrame frame, PFrame self, DescriptorDeleteMarker ignored, @Bind("this") Node inliningTarget, - @Cached @Cached.Exclusive PRaiseNode.Lazy raise) { - raise.get(inliningTarget).raise(PythonBuiltinClassType.AttributeError, ErrorMessages.CANNOT_DELETE); + @Cached @Cached.Exclusive PRaiseNode raise) { + raise.raise(inliningTarget, PythonBuiltinClassType.AttributeError, ErrorMessages.CANNOT_DELETE); return PNone.NONE; } @@ -186,7 +191,7 @@ PNone set(VirtualFrame frame, PFrame self, Object newLineno, @Bind("this") Node inliningTarget, @Cached @Cached.Exclusive InlinedConditionProfile isCurrentFrameProfile, @Cached @Cached.Exclusive MaterializeFrameNode materializeNode, - @Cached @Cached.Exclusive PRaiseNode.Lazy raise, + @Cached @Cached.Exclusive PRaiseNode raise, @Cached PyLongCheckExactNode isLong, @Cached PyLongAsLongAndOverflowNode toLong) { syncLocationIfNeeded(frame, self, this, inliningTarget, isCurrentFrameProfile, materializeNode); @@ -197,16 +202,18 @@ PNone set(VirtualFrame frame, PFrame self, Object newLineno, if (lineno <= Integer.MAX_VALUE && lineno >= Integer.MIN_VALUE) { self.setJumpDestLine((int) lineno); } else { - throw raise.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.LINENO_OUT_OF_RANGE); + throw raise.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.LINENO_OUT_OF_RANGE); } } catch (OverflowException e) { - throw raise.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.LINENO_OUT_OF_RANGE); + throw raise.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.LINENO_OUT_OF_RANGE); } } else { - throw raise.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.LINENO_MUST_BE_AN_INTEGER); + throw raise.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.LINENO_MUST_BE_AN_INTEGER); } } else { - throw raise.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.CANT_JUMP_FROM_S_EVENT, getContext().getThreadState(getLanguage()).getTracingWhat().pythonName); + PythonContext context = getContext(); + throw raise.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.CANT_JUMP_FROM_S_EVENT, + context.getThreadState(context.getLanguage(inliningTarget)).getTracingWhat().pythonName); } return PNone.NONE; } @@ -258,7 +265,7 @@ static Object doSet(PFrame self, Object v, @Bind("this") Node inliningTarget, try { self.setTraceLine(cast.execute(inliningTarget, v)); } catch (CannotCastException e) { - throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.ATTRIBUTE_VALUE_MUST_BE_BOOL); + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ATTRIBUTE_VALUE_MUST_BE_BOOL); } return PNone.NONE; } @@ -271,10 +278,10 @@ public abstract static class GetCodeNode extends PythonBuiltinNode { @Specialization static PCode get(PFrame self, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { RootCallTarget ct = self.getTarget(); assert ct != null; - return factory.createCode(ct); + return PFactory.createCode(language, ct); } @NeverDefault diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/frame/PFrame.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/frame/PFrame.java index 9dcfce8caf..a98bea7397 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/frame/PFrame.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/frame/PFrame.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -50,22 +50,27 @@ import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.nodes.bytecode.PBytecodeGeneratorRootNode; import com.oracle.graal.python.nodes.bytecode.PBytecodeRootNode; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode; import com.oracle.graal.python.nodes.frame.GetFrameLocalsNode; import com.oracle.graal.python.nodes.frame.MaterializeFrameNode; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.RootCallTarget; +import com.oracle.truffle.api.bytecode.BytecodeNode; import com.oracle.truffle.api.frame.MaterializedFrame; import com.oracle.truffle.api.nodes.Node; public final class PFrame extends PythonBuiltinObject { + private static final int UNINITIALIZED_LINE = -2; + private Object[] arguments; private final MaterializedFrame locals; private Object localsDict; private final Reference virtualFrameInfo; private Node location; private RootCallTarget callTarget; - private int line = -2; + private int line = UNINITIALIZED_LINE; private int bci = -1; /* @@ -187,7 +192,7 @@ public PFrame(PythonLanguage lang, @SuppressWarnings("unused") Object threadStat this.virtualFrameInfo = curFrameInfo; curFrameInfo.setPyFrame(this); this.location = GetCodeRootNode.executeUncached(code); - this.line = this.location == null ? code.getFirstLineNo() : -2; + this.line = this.location == null ? code.getFirstLineNo() : UNINITIALIZED_LINE; this.arguments = frameArgs; this.locals = null; this.localsDict = localsDict; @@ -225,7 +230,10 @@ public PFrame.Reference getBackref() { } public void setBackref(PFrame.Reference backref) { - assert this.backref == null || this.backref == backref : "setBackref tried to set a backref different to the one that was previously attached"; + // GR-41914 + // @formatter:off + // assert this.backref == null || this.backref == backref : "setBackref tried to set a backref different to the one that was previously attached"; + // @formatter:on this.backref = backref; } @@ -251,11 +259,16 @@ public boolean didJump() { @TruffleBoundary public int getLine() { - if (line == -2) { + if (line == UNINITIALIZED_LINE) { if (location == null) { line = -1; - } else if (location instanceof PBytecodeRootNode) { - return ((PBytecodeRootNode) location).bciToLine(bci); + } else if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + if (location instanceof BytecodeNode bytecodeNode) { + PBytecodeDSLRootNode rootNode = (PBytecodeDSLRootNode) bytecodeNode.getRootNode(); + return rootNode.bciToLine(bci, bytecodeNode); + } + } else if (location instanceof PBytecodeRootNode bytecodeRootNode) { + return bytecodeRootNode.bciToLine(bci); } } return line; @@ -301,6 +314,10 @@ public Node getLocation() { return location; } + public BytecodeNode getBytecodeNode() { + return (location instanceof BytecodeNode bytecodeNode) ? bytecodeNode : null; + } + public int getBci() { return bci; } @@ -310,15 +327,21 @@ public void setBci(int bci) { } public int getLasti() { - return bciToLasti(bci); + return bciToLasti(bci, location); } @TruffleBoundary - public int bciToLasti(int bci) { - if (location instanceof PBytecodeRootNode bytecodeRootNode) { - return bytecodeRootNode.bciToLasti(bci); - } else if (location instanceof PBytecodeGeneratorRootNode generatorRootNode) { - return generatorRootNode.getBytecodeRootNode().bciToLasti(bci); + public static int bciToLasti(int bci, Node location) { + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + if (bci >= 0 && location instanceof BytecodeNode bytecodeNode) { + return PBytecodeDSLRootNode.bciToLasti(bci, bytecodeNode); + } + } else { + if (location instanceof PBytecodeRootNode bytecodeRootNode) { + return bytecodeRootNode.bciToLasti(bci); + } else if (location instanceof PBytecodeGeneratorRootNode generatorRootNode) { + return generatorRootNode.getBytecodeRootNode().bciToLasti(bci); + } } return -1; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/AbstractFunctionBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/AbstractFunctionBuiltins.java index 0582591478..4e9cf01f09 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/AbstractFunctionBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/AbstractFunctionBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -36,7 +36,6 @@ import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___MODULE__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___TEXT_SIGNATURE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__; import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA_SPACE; import static com.oracle.graal.python.nodes.StringLiterals.T_EQ; import static com.oracle.graal.python.nodes.StringLiterals.T_LPAREN; @@ -48,6 +47,10 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -57,21 +60,21 @@ import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.builtins.objects.object.PythonObject; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.lib.PyObjectGetItem; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.StringLiterals; -import com.oracle.graal.python.nodes.argument.CreateArgumentsNode; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode; -import com.oracle.graal.python.nodes.call.CallDispatchNode; +import com.oracle.graal.python.nodes.call.CallDispatchers; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.object.GetOrCreateDictNode; import com.oracle.graal.python.nodes.object.SetDictNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; @@ -83,6 +86,7 @@ import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.strings.TruffleStringBuilder; @@ -91,26 +95,29 @@ @CoreFunctions(extendClasses = {PythonBuiltinClassType.PFunction, PythonBuiltinClassType.PBuiltinFunction, PythonBuiltinClassType.WrapperDescriptor}) public final class AbstractFunctionBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = AbstractFunctionBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return AbstractFunctionBuiltinsFactory.getFactories(); } - @Builtin(name = J___CALL__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_call, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory public abstract static class CallNode extends PythonBuiltinNode { @Specialization - protected Object doIt(VirtualFrame frame, PFunction self, Object[] arguments, PKeyword[] keywords, - @Shared @Cached CreateArgumentsNode createArgs, - @Shared @Cached CallDispatchNode dispatch) { - return dispatch.executeCall(frame, self, createArgs.execute(self, arguments, keywords)); + Object doIt(VirtualFrame frame, PFunction self, Object[] arguments, PKeyword[] keywords, + @Bind Node inliningTarget, + @Cached CallDispatchers.FunctionCachedCallNode callNode) { + return callNode.execute(frame, inliningTarget, self, arguments, keywords); } @Specialization - protected Object doIt(VirtualFrame frame, PBuiltinFunction self, Object[] arguments, PKeyword[] keywords, - @Shared @Cached CreateArgumentsNode createArgs, - @Shared @Cached CallDispatchNode dispatch) { - return dispatch.executeCall(frame, self, createArgs.execute(self, arguments, keywords)); + Object doIt(VirtualFrame frame, PBuiltinFunction self, Object[] arguments, PKeyword[] keywords, + @Bind Node inliningTarget, + @Cached CallDispatchers.BuiltinFunctionCachedCallNode callNode) { + return callNode.execute(frame, inliningTarget, self, arguments, keywords); } } @@ -119,19 +126,19 @@ protected Object doIt(VirtualFrame frame, PBuiltinFunction self, Object[] argume public abstract static class GetClosureNode extends PythonBuiltinNode { @Specialization(guards = "!isBuiltinFunction(self)") Object getClosure(PFunction self, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { PCell[] closure = self.getClosure(); if (closure == null) { return PNone.NONE; } - return factory.createTuple(closure); + return PFactory.createTuple(language, closure); } @SuppressWarnings("unused") @Fallback static Object getClosure(Object self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(AttributeError, ErrorMessages.OBJ_S_HAS_NO_ATTR_S, "builtin_function_or_method", "__closure__"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, AttributeError, ErrorMessages.OBJ_S_HAS_NO_ATTR_S, "builtin_function_or_method", "__closure__"); } } @@ -155,8 +162,8 @@ Object getGlobals(PFunction self, @SuppressWarnings("unused") @Fallback static Object getGlobals(Object self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(AttributeError, ErrorMessages.OBJ_S_HAS_NO_ATTR_S, "builtin_function_or_method", "__globals__"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, AttributeError, ErrorMessages.OBJ_S_HAS_NO_ATTR_S, "builtin_function_or_method", "__globals__"); } } @@ -208,8 +215,8 @@ static Object setModule(PFunction self, Object value, @SuppressWarnings("unused") @Specialization static Object getModule(PBuiltinFunction self, Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(AttributeError, ErrorMessages.OBJ_S_HAS_NO_ATTR_S, "builtin_function_or_method", "__module__"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, AttributeError, ErrorMessages.OBJ_S_HAS_NO_ATTR_S, "builtin_function_or_method", "__module__"); } } @@ -221,10 +228,11 @@ static Object getModule(PFunction self, @SuppressWarnings("unused") PNone none, @Bind("this") Node inliningTarget, @Cached ReadAttributeFromObjectNode readObject, @Shared @Cached WriteAttributeToObjectNode writeObject, - @Cached PythonObjectFactory.Lazy factory) { + @Cached InlinedBranchProfile createAnnotations) { Object annotations = readObject.execute(self, T___ANNOTATIONS__); if (annotations == PNone.NO_VALUE) { - annotations = factory.get(inliningTarget).createDict(); + createAnnotations.enter(inliningTarget); + annotations = PFactory.createDict(PythonLanguage.get(inliningTarget)); writeObject.execute(self, T___ANNOTATIONS__, annotations); } return annotations; @@ -240,8 +248,8 @@ static Object getModule(PFunction self, Object value, @SuppressWarnings("unused") @Specialization static Object getModule(PBuiltinFunction self, Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(AttributeError, ErrorMessages.OBJ_S_HAS_NO_ATTR_S, "builtin_function_or_method", "__annotations__"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, AttributeError, ErrorMessages.OBJ_S_HAS_NO_ATTR_S, "builtin_function_or_method", "__annotations__"); } } @@ -265,15 +273,15 @@ static Object dict(PFunction self, @SuppressWarnings("unused") PNone mapping, @Specialization(guards = {"!isNoValue(mapping)", "!isDict(mapping)"}) static PNone dict(@SuppressWarnings("unused") PFunction self, Object mapping, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, mapping); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, mapping); } @Specialization @SuppressWarnings("unused") static Object builtinCode(PBuiltinFunction self, Object mapping, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(AttributeError, ErrorMessages.OBJ_S_HAS_NO_ATTR_S, "builtin_function_or_method", "__dict__"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, AttributeError, ErrorMessages.OBJ_S_HAS_NO_ATTR_S, "builtin_function_or_method", "__dict__"); } } @@ -285,10 +293,10 @@ public abstract static class TextSignatureNode extends PythonBinaryBuiltinNode { static Object getFunction(PFunction self, @SuppressWarnings("unused") PNone none, @Bind("this") Node inliningTarget, @Cached ReadAttributeFromObjectNode readNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object signature = readNode.execute(self, T___TEXT_SIGNATURE__); if (signature == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.OBJ_S_HAS_NO_ATTR_S, "function", "__text_signature__"); + throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.OBJ_S_HAS_NO_ATTR_S, "function", "__text_signature__"); } return signature; } @@ -306,7 +314,7 @@ static TruffleString getBuiltin(PBuiltinFunction self, @SuppressWarnings("unused @Bind("this") Node inliningTarget) { Signature signature = self.getSignature(); if (signature.isHidden()) { - throw PRaiseNode.raiseUncached(inliningTarget, AttributeError, ErrorMessages.HAS_NO_ATTR, self, T___TEXT_SIGNATURE__); + throw PRaiseNode.raiseStatic(inliningTarget, AttributeError, ErrorMessages.HAS_NO_ATTR, self, T___TEXT_SIGNATURE__); } return signatureToText(signature, false); } @@ -375,8 +383,8 @@ private static boolean appendCommaIfNeeded(TruffleStringBuilder sb, boolean firs @Specialization(guards = "!isNoValue(value)") static Object setBuiltin(@SuppressWarnings("unused") PBuiltinFunction self, @SuppressWarnings("unused") Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(AttributeError, ErrorMessages.ATTR_S_OF_S_IS_NOT_WRITABLE, "__text_signature__", "builtin_function_or_method"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, AttributeError, ErrorMessages.ATTR_S_OF_S_IS_NOT_WRITABLE, "__text_signature__", "builtin_function_or_method"); } public static TextSignatureNode create() { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/BuiltinFunctionBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/BuiltinFunctionBuiltins.java index 2a98c32ba2..8aa39bc6d5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/BuiltinFunctionBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/BuiltinFunctionBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -31,7 +31,7 @@ import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___NAME__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___QUALNAME__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___SIGNATURE__; -import static com.oracle.graal.python.nodes.SpecialAttributeNames.T__SIGNATURE__; +import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___SIGNATURE__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OBJCLASS__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; import static com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode.T_DOLLAR_DECL_TYPE; @@ -41,6 +41,7 @@ import java.util.ArrayList; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -57,9 +58,8 @@ import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; @@ -67,7 +67,6 @@ import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @@ -90,8 +89,8 @@ static TruffleString getName(PBuiltinFunction self, @SuppressWarnings("unused") @Specialization(guards = "!isNoValue(value)") static TruffleString setName(@SuppressWarnings("unused") PBuiltinFunction self, @SuppressWarnings("unused") Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.AttributeError, ErrorMessages.ATTR_S_OF_S_IS_NOT_WRITABLE, "__name__", "builtin function"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.AttributeError, ErrorMessages.ATTR_S_OF_S_IS_NOT_WRITABLE, "__name__", "builtin function"); } } @@ -105,19 +104,18 @@ static TruffleString getQualname(PBuiltinFunction self, @SuppressWarnings("unuse @Specialization(guards = "!isNoValue(value)") static TruffleString setQualname(@SuppressWarnings("unused") PBuiltinFunction self, @SuppressWarnings("unused") Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.AttributeError, ErrorMessages.ATTR_S_OF_S_IS_NOT_WRITABLE, "__qualname__", "builtin function"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.AttributeError, ErrorMessages.ATTR_S_OF_S_IS_NOT_WRITABLE, "__qualname__", "builtin function"); } } @Builtin(name = J___OBJCLASS__, minNumOfPositionalArgs = 1, isGetter = true) - @TypeSystemReference(PythonArithmeticTypes.class) @GenerateNodeFactory public abstract static class ObjclassNode extends PythonUnaryBuiltinNode { @Specialization(guards = "self.getEnclosingType() == null") static Object objclassMissing(@SuppressWarnings("unused") PBuiltinFunction self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.AttributeError, ErrorMessages.OBJ_S_HAS_NO_ATTR_S, "builtin_function_or_method", "__objclass__"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.AttributeError, ErrorMessages.OBJ_S_HAS_NO_ATTR_S, "builtin_function_or_method", "__objclass__"); } @Specialization(guards = "self.getEnclosingType() != null") @@ -133,11 +131,11 @@ public abstract static class ReduceNode extends PythonUnaryBuiltinNode { Object doBuiltinFunc(VirtualFrame frame, PBuiltinFunction func, @Bind("this") Node inliningTarget, @Cached PyObjectGetAttr getAttr, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { PythonModule builtins = getContext().getBuiltins(); Object getattr = getAttr.execute(frame, inliningTarget, builtins, T_GETATTR); - PTuple args = factory.createTuple(new Object[]{func.getEnclosingType(), func.getName()}); - return factory.createTuple(new Object[]{getattr, args}); + PTuple args = PFactory.createTuple(language, new Object[]{func.getEnclosingType(), func.getName()}); + return PFactory.createTuple(language, new Object[]{getattr, args}); } } @@ -150,7 +148,7 @@ public abstract static class SignatureNode extends PythonUnaryBuiltinNode { static Object doIt(PBuiltinFunction fun, @Bind("this") Node inliningTarget) { if (fun.getSignature().isHidden()) { - throw PRaiseNode.raiseUncached(inliningTarget, AttributeError, ErrorMessages.HAS_NO_ATTR, fun, T__SIGNATURE__); + throw PRaiseNode.raiseStatic(inliningTarget, AttributeError, ErrorMessages.HAS_NO_ATTR, fun, T___SIGNATURE__); } return createInspectSignature(fun.getSignature(), false); } @@ -214,7 +212,7 @@ public static Object createInspectSignature(Signature signature, boolean skipSel parameters.add(callNode.executeWithoutFrame(inspectParameter, StringLiterals.T_KWARGS, ParameterKinds.VAR_KEYWORD.get(parameterKinds, inspectParameter))); } - return callNode.executeWithoutFrame(inspectSignature, PythonObjectFactory.getUncached().createTuple(parameters.toArray())); + return callNode.executeWithoutFrame(inspectSignature, PFactory.createTuple(PythonLanguage.get(null), parameters.toArray())); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/BuiltinMethodDescriptor.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/BuiltinMethodDescriptor.java deleted file mode 100644 index 9191c44680..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/BuiltinMethodDescriptor.java +++ /dev/null @@ -1,414 +0,0 @@ -/* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.function; - -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; - -import java.lang.annotation.Annotation; -import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; - -import com.oracle.graal.python.builtins.Builtin; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.PythonOS; -import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltin; -import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.dsl.GeneratedBy; -import com.oracle.truffle.api.dsl.NodeFactory; - -/** - * Context independent wrapper of a method that can be stored in special method slots. These - * wrappers are context and also language instance independent. - * - * @see com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot - */ -public abstract class BuiltinMethodDescriptor { - - /** - * Size of this cache is limited by the number of builtins in GraalPython. First few contexts - * may, in theory, experience lock contention while this cache is being filled up, but after - * that there should be no cache misses and no locking to update the cache. - * - * Another way to look at this is that it is a map of all builtins, like - * {@link PythonBuiltinClassType} is list of all builtin types, but initialized at runtime. - * - * Not having this cache per {@link com.oracle.graal.python.PythonLanguage} allows to save the - * indirection when comparing to some well known {@link BuiltinMethodDescriptor} in guards. - */ - private static final ConcurrentHashMap CACHE = new ConcurrentHashMap<>(); - - /** - * First caller of this method within given {@code PythonLanguage} instance should add a cache - * entry for this builtin's call target. - */ - public static BuiltinMethodDescriptor get(PBuiltinFunction function) { - CompilerAsserts.neverPartOfCompilation(); - NodeFactory factory = function.getBuiltinNodeFactory(); - if (factory == null) { - return null; - } - Builtin builtinAnnotation = findBuiltinAnnotation(function.getName().toJavaStringUncached(), factory); - if (builtinAnnotation == null || builtinAnnotation.needsFrame()) { - return null; - } - - PythonBuiltinClassType type = null; - Object enclosing = function.getEnclosingType(); - if (enclosing instanceof PythonBuiltinClassType) { - type = (PythonBuiltinClassType) enclosing; - } else if (enclosing instanceof PythonBuiltinClass) { - type = ((PythonBuiltinClass) enclosing).getType(); - } else { - assert enclosing == null; - } - - return get(function.getName().toJavaStringUncached(), factory, type); - } - - static BuiltinMethodDescriptor get(String name, NodeFactory factory, PythonBuiltinClassType type) { - Builtin builtinAnnotation = findBuiltinAnnotation(name, factory); - if (builtinAnnotation == null) { - // New slots HACK: to be removed. This is only used for comparing with existing slot - // found at runtime, the dummy value will not match anything - return new UnaryBuiltinDescriptor(name, null, PythonBuiltinClassType.PythonObject, new Builtin() { - - @Override - public Class annotationType() { - return Builtin.class; - } - - @Override - public String name() { - return name; - } - - @Override - public String doc() { - return null; - } - - @Override - public PythonOS os() { - return null; - } - - @Override - public PythonBuiltinClassType constructsClass() { - return null; - } - - @Override - public PythonBuiltinClassType[] base() { - return new PythonBuiltinClassType[0]; - } - - @Override - public int minNumOfPositionalArgs() { - return 0; - } - - @Override - public int maxNumOfPositionalArgs() { - return 0; - } - - @Override - public int numOfPositionalOnlyArgs() { - return 0; - } - - @Override - public boolean isGetter() { - return false; - } - - @Override - public boolean isSetter() { - return false; - } - - @Override - public boolean allowsDelete() { - return false; - } - - @Override - public boolean takesVarArgs() { - return false; - } - - @Override - public boolean varArgsMarker() { - return false; - } - - @Override - public boolean takesVarKeywordArgs() { - return false; - } - - @Override - public String[] parameterNames() { - return new String[0]; - } - - @Override - public String[] keywordOnlyNames() { - return new String[0]; - } - - @Override - public boolean isPublic() { - return false; - } - - @Override - public boolean isClassmethod() { - return false; - } - - @Override - public boolean isStaticmethod() { - return false; - } - - @Override - public boolean needsFrame() { - return false; - } - - @Override - public boolean alwaysNeedsCallerFrame() { - return false; - } - - @Override - public boolean declaresExplicitSelf() { - return false; - } - - @Override - public boolean reverseOperation() { - return false; - } - - @Override - public String raiseErrorName() { - return null; - } - - @Override - public boolean forceSplitDirectCalls() { - return false; - } - - @Override - public boolean autoRegister() { - return false; - } - }); - } - assert builtinAnnotation != null && !builtinAnnotation.needsFrame(); - return get(name, factory, type, builtinAnnotation); - } - - private static BuiltinMethodDescriptor get(String name, NodeFactory factory, PythonBuiltinClassType type, Builtin builtinAnnotation) { - CompilerAsserts.neverPartOfCompilation(); - if (factory.getClass().getAnnotation(GeneratedBy.class) == null) { - // For non-generated factories, we do not assume that they are singletons, so we cannot - // use them for our cache that must be bounded in size - return null; - } - Class nodeClass = factory.getNodeClass(); - BuiltinMethodDescriptor result = null; - if (PythonUnaryBuiltinNode.class.isAssignableFrom(nodeClass)) { - result = new UnaryBuiltinDescriptor(name, factory, type, builtinAnnotation); - assert result.getBuiltinAnnotation().minNumOfPositionalArgs() <= 1 : name; - } else if (PythonBinaryBuiltinNode.class.isAssignableFrom(nodeClass)) { - result = new BinaryBuiltinDescriptor(name, factory, type, builtinAnnotation); - assert result.getBuiltinAnnotation().minNumOfPositionalArgs() <= 2 : name; - } else if (PythonTernaryBuiltinNode.class.isAssignableFrom(nodeClass)) { - result = new TernaryBuiltinDescriptor(name, factory, type, builtinAnnotation); - assert result.getBuiltinAnnotation().minNumOfPositionalArgs() <= 3 : name; - } - if (result != null) { - return CACHE.computeIfAbsent(result, x -> x); - } - return null; - } - - public static boolean isInstance(Object obj) { - return obj instanceof BuiltinMethodDescriptor; - } - - private static Builtin findBuiltinAnnotation(String name, NodeFactory factory) { - // Temporary hack until new slots fully replace "special method slots" and these descriptors - if (TpSlotBuiltin.isSlotFactory(factory)) { - return null; - } - for (Builtin builtin : factory.getNodeClass().getAnnotationsByType(Builtin.class)) { - if (builtin.name().equals(name)) { - return builtin; - } - if (builtin.constructsClass() != PythonBuiltinClassType.nil && J___NEW__.equals(name)) { - return builtin; - } - } - throw new IllegalStateException(String.format( - "Cannot find corresponding builtin annotation on class %s for builtin '%s'", - factory.getNodeClass().getSimpleName(), name)); - } - - private final NodeFactory factory; - private final PythonBuiltinClassType type; - // The builtin annotation allows us to differentiate between builtins shared for reversible - // operations, such as int.__mul__ and int.__rmul__, which have the same node factory - private final Builtin builtinAnnotation; - // Shortcuts for fields of builtinAnnotation that are accessed on a fast-path - private final String name; - private final boolean isReverseOperation; - private final int minNumOfPositionalArgs; - - private BuiltinMethodDescriptor(String name, NodeFactory factory, PythonBuiltinClassType type, Builtin builtinAnnotation) { - assert name.equals(builtinAnnotation.name()); - this.name = name; - this.factory = factory; - this.type = type; - this.builtinAnnotation = builtinAnnotation; - this.isReverseOperation = builtinAnnotation.reverseOperation(); - this.minNumOfPositionalArgs = builtinAnnotation.minNumOfPositionalArgs(); - } - - public final NodeFactory getFactory() { - return factory; - } - - public final boolean isDescriptorOf(PBuiltinFunction fun) { - return fun.getDescriptor() == this; - } - - public final PythonBuiltinClassType getEnclosingType() { - return type; - } - - public final String getName() { - return name; - } - - public final boolean isReverseOperation() { - return isReverseOperation; - } - - public final int minNumOfPositionalArgs() { - return minNumOfPositionalArgs; - } - - public final Builtin getBuiltinAnnotation() { - return builtinAnnotation; - } - - @Override - public final boolean equals(Object o) { - CompilerAsserts.neverPartOfCompilation(); - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - BuiltinMethodDescriptor that = (BuiltinMethodDescriptor) o; - // Rudimentary check of the assumption that builtin node factories are singletons, if we - // create&cache BuiltinMethodDescriptors with non-singleton factories, we do not have the - // guarantee that the cache size is bounded - assert (factory.getNodeClass() == that.factory.getNodeClass()) == (factory == that.factory) : name; - return factory == that.factory && type == that.type && name.equals(that.name); - } - - @Override - public final int hashCode() { - CompilerAsserts.neverPartOfCompilation(); - return Objects.hash(factory, type, name); - } - - @Override - public String toString() { - CompilerAsserts.neverPartOfCompilation(); - return getClass().getSimpleName() + "{" + type + "." + name + '}'; - } - - // Note: manually written subclass for each builtin works better with Truffle DSL than one - // generic class that would parametrize the 'factory' field - - public static final class UnaryBuiltinDescriptor extends BuiltinMethodDescriptor { - public UnaryBuiltinDescriptor(String name, NodeFactory factory, PythonBuiltinClassType type, Builtin builtinAnnotation) { - super(name, factory, type, builtinAnnotation); - } - - public PythonUnaryBuiltinNode createNode() { - return (PythonUnaryBuiltinNode) getFactory().createNode(); - } - } - - public static final class BinaryBuiltinDescriptor extends BuiltinMethodDescriptor { - public BinaryBuiltinDescriptor(String name, NodeFactory factory, PythonBuiltinClassType type, Builtin builtinAnnotation) { - super(name, factory, type, builtinAnnotation); - } - - public PythonBinaryBuiltinNode createNode() { - return (PythonBinaryBuiltinNode) getFactory().createNode(); - } - } - - public static final class TernaryBuiltinDescriptor extends BuiltinMethodDescriptor { - public TernaryBuiltinDescriptor(String name, NodeFactory factory, PythonBuiltinClassType type, Builtin builtinAnnotation) { - super(name, factory, type, builtinAnnotation); - } - - public PythonTernaryBuiltinNode createNode() { - return (PythonTernaryBuiltinNode) getFactory().createNode(); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/BuiltinMethodDescriptors.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/BuiltinMethodDescriptors.java deleted file mode 100644 index 7a4aafab1c..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/BuiltinMethodDescriptors.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.function; - -import static com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.get; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; - -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.dict.DictBuiltinsFactory; - -/** - * Enum-like class with some useful well known descriptors. Because of initialization order issues, - * these constants cannot be places in {@link BuiltinMethodDescriptor} class. - */ -public abstract class BuiltinMethodDescriptors { - public static final BuiltinMethodDescriptor DICT_ITER = get(J___ITER__, DictBuiltinsFactory.IterNodeFactory.getInstance(), PythonBuiltinClassType.PDict); - - private BuiltinMethodDescriptors() { - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/FunctionBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/FunctionBuiltins.java index 95372770ba..bd2b4581a4 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/FunctionBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/FunctionBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -26,6 +26,7 @@ package com.oracle.graal.python.builtins.objects.function; +import static com.oracle.graal.python.nodes.BuiltinNames.T_LAMBDA_NAME; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___CODE__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___DEFAULTS__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___DOC__; @@ -36,7 +37,6 @@ import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___QUALNAME__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J_TRUFFLE_SOURCE; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.nodes.truffle.TruffleStringMigrationHelpers.assertNoJavaString; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; @@ -44,14 +44,17 @@ import java.util.ArrayList; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.PythonAbstractObject; +import com.oracle.graal.python.builtins.objects.cell.PCell; import com.oracle.graal.python.builtins.objects.code.PCode; import com.oracle.graal.python.builtins.objects.common.HashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetIterator; @@ -73,10 +76,10 @@ import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetFunctionCodeNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; @@ -87,7 +90,6 @@ import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @@ -100,14 +102,88 @@ protected List> getNodeFa return FunctionBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "function", minNumOfPositionalArgs = 3, parameterNames = {"$cls", "code", "globals", "name", "argdefs", "closure"}) + @GenerateNodeFactory + public abstract static class FunctionNode extends PythonBuiltinNode { + + @Specialization + static PFunction function(@SuppressWarnings("unused") Object cls, PCode code, PDict globals, TruffleString name, @SuppressWarnings("unused") PNone defaultArgs, + @SuppressWarnings("unused") PNone closure, + @Bind PythonLanguage language) { + return PFactory.createFunction(language, name, code, globals, null); + } + + @Specialization + static PFunction function(@SuppressWarnings("unused") Object cls, PCode code, PDict globals, @SuppressWarnings("unused") PNone name, @SuppressWarnings("unused") PNone defaultArgs, + PTuple closure, + @Bind("this") Node inliningTarget, + @Shared("getObjectArrayNode") @Cached GetObjectArrayNode getObjectArrayNode, + @Bind PythonLanguage language) { + return PFactory.createFunction(language, T_LAMBDA_NAME, code, globals, PCell.toCellArray(getObjectArrayNode.execute(inliningTarget, closure))); + } + + @Specialization + static PFunction function(@SuppressWarnings("unused") Object cls, PCode code, PDict globals, @SuppressWarnings("unused") PNone name, @SuppressWarnings("unused") PNone defaultArgs, + @SuppressWarnings("unused") PNone closure, + @SuppressWarnings("unused") @Shared("getObjectArrayNode") @Cached GetObjectArrayNode getObjectArrayNode, + @Bind PythonLanguage language) { + return PFactory.createFunction(language, T_LAMBDA_NAME, code, globals, null); + } + + @Specialization + static PFunction function(@SuppressWarnings("unused") Object cls, PCode code, PDict globals, TruffleString name, @SuppressWarnings("unused") PNone defaultArgs, PTuple closure, + @Bind("this") Node inliningTarget, + @Shared("getObjectArrayNode") @Cached GetObjectArrayNode getObjectArrayNode, + @Bind PythonLanguage language) { + return PFactory.createFunction(language, name, code, globals, PCell.toCellArray(getObjectArrayNode.execute(inliningTarget, closure))); + } + + @Specialization + static PFunction function(@SuppressWarnings("unused") Object cls, PCode code, PDict globals, @SuppressWarnings("unused") PNone name, PTuple defaultArgs, + @SuppressWarnings("unused") PNone closure, + @Bind("this") Node inliningTarget, + @Shared("getObjectArrayNode") @Cached GetObjectArrayNode getObjectArrayNode, + @Bind PythonLanguage language) { + // TODO split defaults of positional args from kwDefaults + return PFactory.createFunction(language, code.getName(), code, globals, getObjectArrayNode.execute(inliningTarget, defaultArgs), null, null); + } + + @Specialization + static PFunction function(@SuppressWarnings("unused") Object cls, PCode code, PDict globals, TruffleString name, PTuple defaultArgs, @SuppressWarnings("unused") PNone closure, + @Bind("this") Node inliningTarget, + @Shared("getObjectArrayNode") @Cached GetObjectArrayNode getObjectArrayNode, + @Bind PythonLanguage language) { + // TODO split defaults of positional args from kwDefaults + return PFactory.createFunction(language, name, code, globals, getObjectArrayNode.execute(inliningTarget, defaultArgs), null, null); + } + + @Specialization + static PFunction function(@SuppressWarnings("unused") Object cls, PCode code, PDict globals, TruffleString name, PTuple defaultArgs, PTuple closure, + @Bind("this") Node inliningTarget, + @Shared("getObjectArrayNode") @Cached GetObjectArrayNode getObjectArrayNode, + @Bind PythonLanguage language) { + // TODO split defaults of positional args from kwDefaults + return PFactory.createFunction(language, name, code, globals, getObjectArrayNode.execute(inliningTarget, defaultArgs), null, + PCell.toCellArray(getObjectArrayNode.execute(inliningTarget, closure))); + } + + @Fallback + @SuppressWarnings("unused") + static PFunction function(@SuppressWarnings("unused") Object cls, Object code, Object globals, Object name, Object defaultArgs, Object closure, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.FUNC_CONSTRUCTION_NOT_SUPPORTED, cls, code, globals, name, defaultArgs, closure); + } + } + @Slot(SlotKind.tp_descr_get) @GenerateUncached @GenerateNodeFactory public abstract static class GetNode extends DescrGetBuiltinNode { @Specialization(guards = {"!isPNone(instance)"}) static PMethod doMethod(PFunction self, Object instance, @SuppressWarnings("unused") Object klass, - @Cached PythonObjectFactory factory) { - return factory.createMethod(instance, self); + @Bind PythonLanguage language) { + return PFactory.createMethod(language, instance, self); } @Specialization @@ -116,8 +192,7 @@ static Object doFunction(PFunction self, @SuppressWarnings("unused") PNone insta } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) - @TypeSystemReference(PythonArithmeticTypes.class) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization @@ -176,10 +251,10 @@ static Object setQualname(PFunction self, Object value, public abstract static class GetDefaultsNode extends PythonBinaryBuiltinNode { @Specialization(guards = "isNoValue(defaults)") static Object defaults(PFunction self, @SuppressWarnings("unused") PNone defaults, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { Object[] argDefaults = self.getDefaults(); assert argDefaults != null; - return (argDefaults.length == 0) ? PNone.NONE : factory.createTuple(argDefaults); + return (argDefaults.length == 0) ? PNone.NONE : PFactory.createTuple(language, argDefaults); } @Specialization @@ -205,8 +280,8 @@ static Object setDefaults(PFunction self, @SuppressWarnings("unused") PNone defa @Fallback @SuppressWarnings("unused") static Object setDefaults(Object self, Object defaults, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.MUST_BE_SET_TO_S_NOT_P, T___DEFAULTS__, "tuple"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.MUST_BE_SET_TO_S_NOT_P, T___DEFAULTS__, "tuple"); } } @@ -215,9 +290,9 @@ static Object setDefaults(Object self, Object defaults, public abstract static class GetKeywordDefaultsNode extends PythonBinaryBuiltinNode { @Specialization(guards = "isNoValue(arg)") static Object get(PFunction self, @SuppressWarnings("unused") PNone arg, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { PKeyword[] kwdefaults = self.getKwDefaults(); - return (kwdefaults.length > 0) ? factory.createDict(kwdefaults) : PNone.NONE; + return (kwdefaults.length > 0) ? PFactory.createDict(language, kwdefaults) : PNone.NONE; } @Specialization(guards = "!isNoValue(arg)") @@ -237,7 +312,7 @@ Object set(PFunction self, PDict arg) { if (key instanceof PString) { key = ((PString) key).getValueUncached(); } else if (!(key instanceof TruffleString)) { - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.TypeError, ErrorMessages.KEYWORD_NAMES_MUST_BE_STR_GOT_P, key); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.TypeError, ErrorMessages.KEYWORD_NAMES_MUST_BE_STR_GOT_P, key); } keywords.add(new PKeyword((TruffleString) key, HashingStorageIteratorValue.executeUncached(storage, it))); } @@ -274,8 +349,8 @@ static Object doMethod(PMethod method, @Fallback static Object doGeneric(Object object, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.GETTING_THER_SOURCE_NOT_SUPPORTED_FOR_P, object); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.GETTING_THER_SOURCE_NOT_SUPPORTED_FOR_P, object); } } @@ -293,11 +368,11 @@ static Object getCodeU(PFunction self, @SuppressWarnings("unused") PNone none, @Specialization static Object setCode(PFunction self, PCode code, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int closureLength = self.getClosure() == null ? 0 : self.getClosure().length; int freeVarsLength = code.getFreeVars().length; if (closureLength != freeVarsLength) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.REQUIRES_CODE_OBJ, self.getName(), closureLength, freeVarsLength); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.REQUIRES_CODE_OBJ, self.getName(), closureLength, freeVarsLength); } self.setCode(code); return PNone.NONE; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/MethodDescriptorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/MethodDescriptorBuiltins.java index 7aa0278c7f..106f225cbb 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/MethodDescriptorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/MethodDescriptorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,13 +40,11 @@ */ package com.oracle.graal.python.builtins.objects.function; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; - import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; -import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; @@ -58,15 +56,13 @@ import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.strings.TruffleString; @CoreFunctions(extendClasses = PythonBuiltinClassType.PBuiltinFunction) @@ -85,8 +81,8 @@ protected List> getNodeFa public abstract static class GetNode extends DescrGetBuiltinNode { @Specialization(guards = "!isNoValue(instance)") static PMethod doMethod(PFunction self, Object instance, Object klass, - @Shared @Cached PythonObjectFactory factory) { - return factory.createMethod(instance, self); + @Bind PythonLanguage language) { + return PFactory.createMethod(language, instance, self); } @Specialization(guards = "isNoValue(instance)") @@ -96,14 +92,14 @@ static Object doFunction(PFunction self, Object instance, Object klass) { @Specialization(guards = {"!isNoValue(instance)", "!self.needsDeclaringType()"}) static PBuiltinMethod doBuiltinMethod(PBuiltinFunction self, Object instance, Object klass, - @Shared @Cached PythonObjectFactory factory) { - return factory.createBuiltinMethod(instance, self); + @Bind PythonLanguage language) { + return PFactory.createBuiltinMethod(language, instance, self); } @Specialization(guards = {"!isNoValue(instance)", "self.needsDeclaringType()"}) static PBuiltinMethod doBuiltinMethodWithDeclaringClass(PBuiltinFunction self, Object instance, Object klass, - @Shared @Cached PythonObjectFactory factory) { - return factory.createBuiltinMethod(instance, self, self.getEnclosingType()); + @Bind PythonLanguage language) { + return PFactory.createBuiltinMethod(language, instance, self, self.getEnclosingType()); } @Specialization(guards = "isNoValue(instance)") @@ -112,8 +108,7 @@ static Object doBuiltinFunction(PBuiltinFunction self, Object instance, Object k } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) - @TypeSystemReference(PythonArithmeticTypes.class) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization(guards = "self.getEnclosingType() == null") @@ -126,7 +121,7 @@ static TruffleString reprModuleFunction(PBuiltinFunction self, @Specialization(guards = "self.getEnclosingType() != null") static TruffleString reprClassFunction(PBuiltinFunction self, @Cached.Shared("formatter") @Cached StringUtils.SimpleTruffleStringFormatNode simpleTruffleStringFormatNode) { - return simpleTruffleStringFormatNode.format("", self.getName(), TypeNodes.GetNameNode.doSlowPath(self.getEnclosingType())); + return simpleTruffleStringFormatNode.format("", self.getName(), TypeNodes.GetNameNode.executeUncached(self.getEnclosingType())); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/PArguments.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/PArguments.java index 25baa2d572..febb49e675 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/PArguments.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/PArguments.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -28,6 +28,8 @@ import com.oracle.graal.python.builtins.objects.cell.PCell; import com.oracle.graal.python.builtins.objects.frame.PFrame; import com.oracle.graal.python.builtins.objects.object.PythonObject; +import com.oracle.graal.python.runtime.PythonOptions; +import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.exception.AbstractTruffleException; @@ -217,6 +219,11 @@ public static Object getExceptionUnchecked(Object[] arguments) { return arguments[INDEX_CURRENT_EXCEPTION]; } + public static boolean hasException(Object[] arguments) { + Object exception = getExceptionUnchecked(arguments); + return exception != null && exception != PException.NO_EXCEPTION; + } + public static void setException(Frame frame, AbstractTruffleException exc) { setException(frame.getArguments(), exc); } @@ -280,6 +287,7 @@ public static int getUserArgumentLength(Object[] arguments) { } public static MaterializedFrame getGeneratorFrame(Object[] arguments) { + assert !PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER; return (MaterializedFrame) arguments[INDEX_GENERATOR_FRAME]; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/PBuiltinFunction.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/PBuiltinFunction.java index 9d452b879a..e82e1c3677 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/PBuiltinFunction.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/PBuiltinFunction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -28,9 +28,9 @@ import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DOC__; import static com.oracle.graal.python.nodes.StringLiterals.T_DOT; -import java.lang.invoke.VarHandle; import java.util.Arrays; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.BoundBuiltinCallable; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -45,7 +45,7 @@ import com.oracle.graal.python.nodes.PRootNode; import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; @@ -79,7 +79,6 @@ public final class PBuiltinFunction extends PythonBuiltinObject implements Bound private final int flags; private final TpSlot slot; private final PExternalFunctionWrapper slotWrapper; - private BuiltinMethodDescriptor descriptor; @CompilationFinal(dimensions = 1) private final Object[] defaults; @CompilationFinal(dimensions = 1) private final PKeyword[] kwDefaults; @@ -88,7 +87,7 @@ public PBuiltinFunction(PythonBuiltinClassType cls, Shape shape, TruffleString n super(cls, shape); this.name = PythonUtils.toPString(name); if (enclosingType != null) { - this.qualname = StringUtils.cat(GetNameNode.doSlowPath(enclosingType), T_DOT, name); + this.qualname = StringUtils.cat(GetNameNode.executeUncached(enclosingType), T_DOT, name); } else { this.qualname = name; } @@ -106,7 +105,7 @@ public PBuiltinFunction(PythonBuiltinClassType cls, Shape shape, TruffleString n this(cls, shape, name, enclosingType, defaults, kwDefaults, flags, callTarget, null, null); } - private static PKeyword[] generateKwDefaults(Signature signature) { + public static PKeyword[] generateKwDefaults(Signature signature) { TruffleString[] keywordNames = signature.getKeywordNames(); PKeyword[] kwDefaults = PKeyword.create(keywordNames.length); for (int i = 0; i < keywordNames.length; i++) { @@ -157,19 +156,6 @@ public NodeFactory getBuiltinNodeFactory() { } } - public boolean isReverseOperationSlot() { - return isReverseOperationSlot(callTarget); - } - - public static boolean isReverseOperationSlot(RootCallTarget ct) { - RootNode functionRootNode = ct.getRootNode(); - if (functionRootNode instanceof BuiltinFunctionRootNode) { - return ((BuiltinFunctionRootNode) functionRootNode).getBuiltin().reverseOperation(); - } else { - return false; - } - } - public int getFlags() { return flags; } @@ -250,11 +236,11 @@ public String toString() { } @Override - public PBuiltinFunction boundToObject(PythonBuiltinClassType klass, PythonObjectFactory factory) { + public PBuiltinFunction boundToObject(PythonBuiltinClassType klass, PythonLanguage language) { if (klass == enclosingType) { return this; } else { - PBuiltinFunction func = factory.createBuiltinFunction(this, klass); + PBuiltinFunction func = PFactory.createBuiltinFunction(language, this, klass); func.setAttribute(T___DOC__, getAttribute(T___DOC__)); return func; } @@ -278,23 +264,4 @@ boolean hasExecutableName() { TruffleString getExecutableName() { return getName(); } - - public void setDescriptor(BuiltinMethodDescriptor value) { - assert value.getName().equals(getName().toJavaStringUncached()) && getBuiltinNodeFactory() == value.getFactory() : getName() + " vs " + value; - // Only make sure that info is fully initialized, otherwise it is fine if it is set multiple - // times from different threads, all of them should set the same value - VarHandle.storeStoreFence(); - BuiltinMethodDescriptor local = descriptor; - assert local == null || local == value : value; - this.descriptor = value; - } - - /** - * The descriptor is set lazily once this builtin function is stored in any special method slot. - * I.e., one can assume that any builtin function looked up via special method slots has its - * descriptor set. - */ - public BuiltinMethodDescriptor getDescriptor() { - return descriptor; - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/PFunction.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/PFunction.java index fb32adb968..f527d415b3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/PFunction.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/PFunction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -43,6 +43,7 @@ import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.Truffle; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -62,12 +63,12 @@ public final class PFunction extends PythonObject { private TruffleString qualname; private boolean forceSplitDirectCalls; private final Assumption codeStableAssumption; - private final Assumption defaultsStableAssumption; private final PythonObject globals; @CompilationFinal private boolean isBuiltin; @CompilationFinal(dimensions = 1) private final PCell[] closure; @CompilationFinal private PCode finalCode; private PCode code; + private RootCallTarget callTarget; @CompilationFinal(dimensions = 1) private Object[] finalDefaultValues; private Object[] defaultValues; @CompilationFinal(dimensions = 1) private PKeyword[] finalKwDefaultValues; @@ -79,25 +80,23 @@ public PFunction(PythonLanguage lang, TruffleString name, TruffleString qualname } public PFunction(PythonLanguage lang, TruffleString name, TruffleString qualname, PCode code, PythonObject globals, Object[] defaultValues, - PKeyword[] kwDefaultValues, - PCell[] closure) { - this(lang, name, qualname, code, globals, defaultValues, kwDefaultValues, closure, Truffle.getRuntime().createAssumption(), Truffle.getRuntime().createAssumption()); + PKeyword[] kwDefaultValues, PCell[] closure) { + this(lang, name, qualname, code, globals, defaultValues, kwDefaultValues, closure, Truffle.getRuntime().createAssumption()); } public PFunction(PythonLanguage lang, TruffleString name, TruffleString qualname, PCode code, PythonObject globals, Object[] defaultValues, - PKeyword[] kwDefaultValues, - PCell[] closure, Assumption codeStableAssumption, Assumption defaultsStableAssumption) { + PKeyword[] kwDefaultValues, PCell[] closure, Assumption codeStableAssumption) { super(PythonBuiltinClassType.PFunction, PythonBuiltinClassType.PFunction.getInstanceShape(lang)); this.name = name; this.qualname = qualname; assert code != null; this.code = this.finalCode = code; + this.callTarget = code.getRootCallTarget(); this.globals = globals; this.defaultValues = this.finalDefaultValues = defaultValues == null ? PythonUtils.EMPTY_OBJECT_ARRAY : defaultValues; this.kwDefaultValues = this.finalKwDefaultValues = kwDefaultValues == null ? PKeyword.EMPTY_KEYWORDS : kwDefaultValues; this.closure = closure; this.codeStableAssumption = codeStableAssumption; - this.defaultsStableAssumption = defaultsStableAssumption; this.forceSplitDirectCalls = false; } @@ -105,10 +104,6 @@ public Assumption getCodeStableAssumption() { return codeStableAssumption; } - public Assumption getDefaultsStableAssumption() { - return defaultsStableAssumption; - } - public PythonObject getGlobals() { return globals; } @@ -185,17 +180,22 @@ public PCode getCode() { return code; } + public RootCallTarget getCallTarget() { + return callTarget; + } + @TruffleBoundary public void setCode(PCode code) { codeStableAssumption.invalidate("code changed for function " + getName()); assert code != null : "code cannot be null"; this.finalCode = null; this.code = code; + this.callTarget = code.getRootCallTarget(); } public Object[] getDefaults() { if (CompilerDirectives.inCompiledCode() && CompilerDirectives.isPartialEvaluationConstant(this)) { - if (defaultsStableAssumption.isValid()) { + if (codeStableAssumption.isValid()) { return finalDefaultValues; } } @@ -204,14 +204,14 @@ public Object[] getDefaults() { @TruffleBoundary public void setDefaults(Object[] defaults) { - this.defaultsStableAssumption.invalidate("defaults changed for function " + getName()); + this.codeStableAssumption.invalidate("defaults changed for function " + getName()); this.finalDefaultValues = null; // avoid leak, and make code that wrongly uses it crash this.defaultValues = defaults; } public PKeyword[] getKwDefaults() { if (CompilerDirectives.inCompiledCode() && CompilerDirectives.isPartialEvaluationConstant(this)) { - if (defaultsStableAssumption.isValid()) { + if (codeStableAssumption.isValid()) { return finalKwDefaultValues; } } @@ -220,7 +220,7 @@ public PKeyword[] getKwDefaults() { @TruffleBoundary public void setKwDefaults(PKeyword[] defaults) { - this.defaultsStableAssumption.invalidate("kw defaults changed for function " + getName()); + this.codeStableAssumption.invalidate("kw defaults changed for function " + getName()); this.finalDefaultValues = null; // avoid leak, and make code that wrongly uses it crash this.kwDefaultValues = defaults; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/Signature.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/Signature.java index cfa9c1edca..4c5cd9fa77 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/Signature.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/Signature.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -31,17 +31,19 @@ import java.util.ArrayList; import java.util.List; +import com.oracle.graal.python.nodes.PRootNode; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.strings.TruffleString; public final class Signature { - public static final Signature EMPTY = new Signature(-1, false, -1, false, PythonUtils.EMPTY_TRUFFLESTRING_ARRAY, PythonUtils.EMPTY_TRUFFLESTRING_ARRAY); + public static final Signature EMPTY = new Signature(-1, false, -1, PythonUtils.EMPTY_TRUFFLESTRING_ARRAY, PythonUtils.EMPTY_TRUFFLESTRING_ARRAY); + public static final Signature GENERIC_VARARGS = new Signature(-1, true, 0, null, null); private final int varArgIndex; private final int positionalOnlyArgIndex; - private final boolean isVarArgsMarker; private final boolean takesVarKeywordArgs; private final boolean checkEnclosingType; // See javadoc for isHidden @@ -52,32 +54,31 @@ public final class Signature { private final TruffleString raiseErrorName; - public Signature(boolean takesVarKeywordArgs, int takesVarArgs, boolean varArgsMarker, + public Signature(boolean takesVarKeywordArgs, int takesVarArgs, TruffleString[] parameterIds, TruffleString[] keywordNames) { - this(-1, takesVarKeywordArgs, takesVarArgs, varArgsMarker, parameterIds, keywordNames); + this(-1, takesVarKeywordArgs, takesVarArgs, parameterIds, keywordNames); } - public Signature(int positionOnlyArgIndex, boolean takesVarKeywordArgs, int takesVarArgs, boolean varArgsMarker, + public Signature(int positionOnlyArgIndex, boolean takesVarKeywordArgs, int takesVarArgs, TruffleString[] parameterIds, TruffleString[] keywordNames) { - this(positionOnlyArgIndex, takesVarKeywordArgs, takesVarArgs, varArgsMarker, parameterIds, keywordNames, false); + this(positionOnlyArgIndex, takesVarKeywordArgs, takesVarArgs, parameterIds, keywordNames, false); } - public Signature(int positionOnlyArgIndex, boolean takesVarKeywordArgs, int takesVarArgs, boolean varArgsMarker, + public Signature(int positionOnlyArgIndex, boolean takesVarKeywordArgs, int takesVarArgs, TruffleString[] parameterIds, TruffleString[] keywordNames, boolean checkEnclosingType) { - this(positionOnlyArgIndex, takesVarKeywordArgs, takesVarArgs, varArgsMarker, parameterIds, keywordNames, checkEnclosingType, T_EMPTY_STRING); + this(positionOnlyArgIndex, takesVarKeywordArgs, takesVarArgs, parameterIds, keywordNames, checkEnclosingType, T_EMPTY_STRING); } - public Signature(int positionOnlyArgIndex, boolean takesVarKeywordArgs, int takesVarArgs, boolean varArgsMarker, + public Signature(int positionOnlyArgIndex, boolean takesVarKeywordArgs, int takesVarArgs, TruffleString[] parameterIds, TruffleString[] keywordNames, boolean checkEnclosingType, TruffleString raiseErrorName) { - this(positionOnlyArgIndex, takesVarKeywordArgs, takesVarArgs, varArgsMarker, parameterIds, keywordNames, checkEnclosingType, raiseErrorName, false); + this(positionOnlyArgIndex, takesVarKeywordArgs, takesVarArgs, parameterIds, keywordNames, checkEnclosingType, raiseErrorName, false); } - public Signature(int positionOnlyArgIndex, boolean takesVarKeywordArgs, int takesVarArgs, boolean varArgsMarker, + public Signature(int positionOnlyArgIndex, boolean takesVarKeywordArgs, int takesVarArgs, TruffleString[] parameterIds, TruffleString[] keywordNames, boolean checkEnclosingType, TruffleString raiseErrorName, boolean hidden) { this.positionalOnlyArgIndex = positionOnlyArgIndex; this.takesVarKeywordArgs = takesVarKeywordArgs; this.varArgIndex = takesVarArgs; - this.isVarArgsMarker = varArgsMarker; this.positionalParameterNames = (parameterIds != null) ? parameterIds : PythonUtils.EMPTY_TRUFFLESTRING_ARRAY; this.keywordOnlyNames = (keywordNames != null) ? keywordNames : PythonUtils.EMPTY_TRUFFLESTRING_ARRAY; this.checkEnclosingType = checkEnclosingType; @@ -85,10 +86,6 @@ public Signature(int positionOnlyArgIndex, boolean takesVarKeywordArgs, int take this.hidden = hidden; } - public static Signature createVarArgsAndKwArgsOnly() { - return new Signature(-1, true, 0, false, null, null); - } - public int getNumOfRequiredKeywords() { return keywordOnlyNames.length; } @@ -106,18 +103,10 @@ public int getPositionalOnlyArgIndex() { return positionalOnlyArgIndex; } - public int getVarargsIdx() { - return varArgIndex; - } - public boolean takesVarArgs() { return varArgIndex != -1; } - public boolean isVarArgsMarker() { - return isVarArgsMarker; - } - public boolean takesVarKeywordArgs() { return takesVarKeywordArgs; } @@ -150,7 +139,7 @@ public boolean takesKeywordArgs() { } public boolean takesPositionalOnly() { - return !takesVarArgs() && !takesVarKeywordArgs && !isVarArgsMarker && keywordOnlyNames.length == 0; + return !takesVarArgs() && !takesVarKeywordArgs && keywordOnlyNames.length == 0; } public boolean takesNoArguments() { @@ -173,4 +162,8 @@ public TruffleString getRaiseErrorName() { public boolean isHidden() { return hidden; } + + public static Signature fromCallTarget(RootCallTarget callTarget) { + return callTarget.getRootNode() instanceof PRootNode rootNode ? rootNode.getSignature() : Signature.GENERIC_VARARGS; + } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/WrapperDescriptorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/WrapperDescriptorBuiltins.java index 64ebc9484e..8cddaa5ee1 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/WrapperDescriptorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/WrapperDescriptorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,13 +40,11 @@ */ package com.oracle.graal.python.builtins.objects.function; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; - import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; -import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; @@ -58,15 +56,13 @@ import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.strings.TruffleString; @CoreFunctions(extendClasses = PythonBuiltinClassType.WrapperDescriptor) @@ -85,8 +81,8 @@ protected List> getNodeFa public abstract static class GetNode extends DescrGetBuiltinNode { @Specialization(guards = {"!isNoValue(instance)"}) static PMethod doMethod(PFunction self, Object instance, Object klass, - @Shared @Cached PythonObjectFactory factory) { - return factory.createMethod(PythonBuiltinClassType.MethodWrapper, instance, self); + @Bind PythonLanguage language) { + return PFactory.createMethod(language, PythonBuiltinClassType.MethodWrapper, PythonBuiltinClassType.MethodWrapper.getInstanceShape(language), instance, self); } @Specialization(guards = "isNoValue(instance)") @@ -96,8 +92,8 @@ static Object doFunction(PFunction self, Object instance, Object klass) { @Specialization(guards = {"!isNoValue(instance)"}) static PBuiltinMethod doBuiltinMethod(PBuiltinFunction self, Object instance, Object klass, - @Shared @Cached PythonObjectFactory factory) { - return factory.createBuiltinMethod(PythonBuiltinClassType.MethodWrapper, instance, self); + @Bind PythonLanguage language) { + return PFactory.createBuiltinMethod(language, PythonBuiltinClassType.MethodWrapper, PythonBuiltinClassType.MethodWrapper.getInstanceShape(language), instance, self); } @Specialization(guards = "isNoValue(instance)") @@ -106,8 +102,7 @@ static Object doBuiltinFunction(PBuiltinFunction self, Object instance, Object k } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) - @TypeSystemReference(PythonArithmeticTypes.class) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization @@ -117,7 +112,7 @@ static TruffleString reprClassFunction(PBuiltinFunction self, // XXX: this is wrong return simpleTruffleStringFormatNode.format("", self.getName()); } else { - return simpleTruffleStringFormatNode.format("", self.getName(), TypeNodes.GetNameNode.doSlowPath(self.getEnclosingType())); + return simpleTruffleStringFormatNode.format("", self.getName(), TypeNodes.GetNameNode.executeUncached(self.getEnclosingType())); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/CommonGeneratorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/CommonGeneratorBuiltins.java index 0a204506da..f115918692 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/CommonGeneratorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/CommonGeneratorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -61,14 +61,15 @@ import com.oracle.graal.python.builtins.objects.frame.PFrame; import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.builtins.objects.traceback.PTraceback; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; +import com.oracle.graal.python.lib.IteratorExhausted; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.bytecode.FrameInfo; import com.oracle.graal.python.nodes.bytecode.GeneratorReturnException; import com.oracle.graal.python.nodes.bytecode.GeneratorYieldResult; -import com.oracle.graal.python.nodes.call.CallTargetInvokeNode; -import com.oracle.graal.python.nodes.call.GenericInvokeNode; +import com.oracle.graal.python.nodes.call.CallDispatchers; import com.oracle.graal.python.nodes.frame.MaterializeFrameNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; @@ -77,10 +78,10 @@ import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CallTarget; -import com.oracle.truffle.api.RootCallTarget; +import com.oracle.truffle.api.Truffle; +import com.oracle.truffle.api.bytecode.ContinuationResult; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; @@ -93,6 +94,7 @@ import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.MaterializedFrame; import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.DirectCallNode; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.profiles.InlinedConditionProfile; @@ -105,7 +107,7 @@ public final class CommonGeneratorBuiltins extends PythonBuiltins { * is invoked using {@code next(g)} outside of any {@code except} handler but the generator * requests the exception state, then the exception state will be written into the arguments. If * we now use the same arguments array every time, the next invocation would think that there is - * not excepion but in fact, the a subsequent call ot {@code next} may have a different + * not an exception but in fact, a subsequent call to {@code next} may have a different * exception state. * *
        @@ -135,33 +137,34 @@ protected List> getNodeFa
                 return CommonGeneratorBuiltinsFactory.getFactories();
             }
         
        -    private static void checkResumable(Node inliningTarget, PGenerator self, PRaiseNode.Lazy raiseNode) {
        +    private static void checkResumable(Node inliningTarget, PGenerator self, PRaiseNode raiseNode) {
                 if (self.isFinished()) {
                     if (self.isAsyncGen()) {
        -                throw raiseNode.get(inliningTarget).raise(StopAsyncIteration);
        +                throw raiseNode.raise(inliningTarget, StopAsyncIteration);
                     }
                     if (self.isCoroutine()) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.CANNOT_REUSE_CORO);
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.CANNOT_REUSE_CORO);
                     }
        -            throw raiseNode.get(inliningTarget).raiseStopIteration();
        +            throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.StopIteration);
                 }
                 if (self.isRunning()) {
        -            throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.GENERATOR_ALREADY_EXECUTING);
        +            throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.GENERATOR_ALREADY_EXECUTING);
                 }
             }
         
             @GenerateInline
             @GenerateCached(false)
        -    @ImportStatic({PGuards.class, PythonOptions.class})
        +    @ImportStatic({PGuards.class, PythonOptions.class, CallDispatchers.class})
             abstract static class ResumeGeneratorNode extends Node {
                 public abstract Object execute(VirtualFrame frame, Node inliningTarget, PGenerator self, Object sendValue);
         
        -        @Specialization(guards = "sameCallTarget(self.getCurrentCallTarget(), call.getCallTarget())", limit = "getCallSiteInlineCacheMaxDepth()")
        +        @Specialization(guards = {"!isBytecodeDSLInterpreter()", "sameCallTarget(self.getCurrentCallTarget(), callNode)"}, limit = "getCallSiteInlineCacheMaxDepth()")
                 static Object cached(VirtualFrame frame, Node inliningTarget, PGenerator self, Object sendValue,
        -                        @Cached(value = "createDirectCall(self.getCurrentCallTarget())", inline = false) CallTargetInvokeNode call,
        +                        @Cached(parameters = "self.getCurrentCallTarget()") DirectCallNode callNode,
        +                        @Cached CallDispatchers.SimpleDirectInvokeNode invoke,
                                 @Exclusive @Cached InlinedBranchProfile returnProfile,
                                 @Exclusive @Cached IsBuiltinObjectProfile errorProfile,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Exclusive @Cached PRaiseNode raiseNode) {
                     self.setRunning(true);
                     Object[] arguments = prepareArguments(self);
                     if (sendValue != null) {
        @@ -169,26 +172,80 @@ static Object cached(VirtualFrame frame, Node inliningTarget, PGenerator self, O
                     }
                     GeneratorYieldResult result;
                     try {
        -                result = (GeneratorYieldResult) call.execute(frame, null, null, null, arguments);
        +                result = (GeneratorYieldResult) invoke.execute(frame, inliningTarget, callNode, arguments);
                     } catch (PException e) {
                         throw handleException(self, inliningTarget, errorProfile, raiseNode, e);
                     } catch (GeneratorReturnException e) {
                         returnProfile.enter(inliningTarget);
        -                throw handleReturn(self, e, raiseNode.get(inliningTarget));
        +                throw handleReturn(inliningTarget, self, e.value);
                     } finally {
                         self.setRunning(false);
                     }
                     return handleResult(inliningTarget, self, result);
                 }
         
        -        @Specialization(replaces = "cached")
        +        @Specialization(guards = {"isBytecodeDSLInterpreter()", "sameCallTarget(self.getCurrentCallTarget(), callNode)"}, limit = "getCallSiteInlineCacheMaxDepth()")
        +        static Object cachedBytecodeDSL(VirtualFrame frame, Node inliningTarget, PGenerator self, Object sendValue,
        +                        @Cached(parameters = "self.getCurrentCallTarget()") DirectCallNode callNode,
        +                        @Cached CallDispatchers.SimpleDirectInvokeNode invoke,
        +                        @Cached("self.getContinuation() == null") boolean firstCall,
        +                        @Exclusive @Cached InlinedBranchProfile returnProfile,
        +                        @Exclusive @Cached IsBuiltinObjectProfile errorProfile,
        +                        @Exclusive @Cached PRaiseNode raiseNode) {
        +            self.setRunning(true);
        +            Object generatorResult;
        +            try {
        +                ContinuationResult continuation = self.getContinuation();
        +                Object[] arguments;
        +                // TODO: GR-62196, Bytecode DSL does not have the same shape of arguments array for
        +                // continuation calls:
        +
        +                // 1) in the manual interpreter, we always pass an array of the same length (with
        +                // slots defined in PArguments), this argument array is used for callee context
        +                // enter/exit in PBytecodeGeneratorRootNode as opposed to the original arguments
        +                // array taken from the PGenerator object. Moreover, this array is a copy of
        +                // PGenerator arguments, and the comment above prepareArguments seems to indicate
        +                // that we indeed need a fresh copy, because we do not want to share the state
        +                // stored in the arguments between invocations
        +
        +                // 2) Bytecode DSL doesn't do callee context enter/exit for individual calls,
        +                // but for the whole coroutine
        +
        +                // 3) when walking the stack, e.g., in MaterializeFrameNode, we must take care of
        +                // this additional arguments shape and unwrap the materialized frame from the
        +                // continuation frame to access its arguments array that will have the desired
        +                // "PArguments shape", however this will be a shared arguments array, so it is a
        +                // question if this unwrapping would be correct, see 1).
        +
        +                if (firstCall) {
        +                    // First invocation: call the regular root node.
        +                    arguments = prepareArguments(self);
        +                } else {
        +                    // Subsequent invocations: call a continuation root node.
        +                    arguments = new Object[]{continuation.getFrame(), sendValue};
        +                }
        +                generatorResult = invoke.execute(frame, inliningTarget, callNode, arguments);
        +            } catch (PException e) {
        +                throw handleException(self, inliningTarget, errorProfile, raiseNode, e);
        +            } finally {
        +                self.setRunning(false);
        +            }
        +            if (generatorResult instanceof ContinuationResult continuation) {
        +                return handleResult(inliningTarget, self, continuation);
        +            } else {
        +                returnProfile.enter(inliningTarget);
        +                throw handleReturn(inliningTarget, self, generatorResult);
        +            }
        +
        +        }
        +
        +        @Specialization(replaces = "cached", guards = "!isBytecodeDSLInterpreter()")
                 @Megamorphic
                 static Object generic(VirtualFrame frame, Node inliningTarget, PGenerator self, Object sendValue,
        -                        @Cached InlinedConditionProfile hasFrameProfile,
        -                        @Cached(inline = false) GenericInvokeNode call,
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke,
                                 @Exclusive @Cached InlinedBranchProfile returnProfile,
                                 @Exclusive @Cached IsBuiltinObjectProfile errorProfile,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Exclusive @Cached PRaiseNode raiseNode) {
                     self.setRunning(true);
                     Object[] arguments = prepareArguments(self);
                     if (sendValue != null) {
        @@ -196,60 +253,82 @@ static Object generic(VirtualFrame frame, Node inliningTarget, PGenerator self,
                     }
                     GeneratorYieldResult result;
                     try {
        -                if (hasFrameProfile.profile(inliningTarget, frame != null)) {
        -                    result = (GeneratorYieldResult) call.execute(frame, self.getCurrentCallTarget(), arguments);
        -                } else {
        -                    result = (GeneratorYieldResult) call.execute(self.getCurrentCallTarget(), arguments);
        -                }
        +                result = (GeneratorYieldResult) invoke.execute(frame, inliningTarget, self.getCurrentCallTarget(), arguments);
                     } catch (PException e) {
                         throw handleException(self, inliningTarget, errorProfile, raiseNode, e);
                     } catch (GeneratorReturnException e) {
                         returnProfile.enter(inliningTarget);
        -                throw handleReturn(self, e, raiseNode.get(inliningTarget));
        +                throw handleReturn(inliningTarget, self, e.value);
                     } finally {
                         self.setRunning(false);
                     }
                     return handleResult(inliningTarget, self, result);
                 }
         
        -        private static PException handleException(PGenerator self, Node inliningTarget, IsBuiltinObjectProfile profile, PRaiseNode.Lazy raiseNode, PException e) {
        +        @Specialization(replaces = "cachedBytecodeDSL", guards = "isBytecodeDSLInterpreter()")
        +        @Megamorphic
        +        static Object genericBytecodeDSL(VirtualFrame frame, Node inliningTarget, PGenerator self, Object sendValue,
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke,
        +                        @Cached InlinedConditionProfile firstInvocationProfile,
        +                        @Cached InlinedBranchProfile returnProfile,
        +                        @Cached IsBuiltinObjectProfile errorProfile,
        +                        @Cached PRaiseNode raiseNode) {
        +            self.setRunning(true);
        +            Object generatorResult;
        +            try {
        +                ContinuationResult continuation = self.getContinuation();
        +                Object[] arguments;
        +                if (firstInvocationProfile.profile(inliningTarget, continuation == null)) {
        +                    // First invocation: call the regular root node.
        +                    arguments = prepareArguments(self);
        +                } else {
        +                    // Subsequent invocations: call a continuation root node.
        +                    arguments = new Object[]{continuation.getFrame(), sendValue};
        +                }
        +
        +                generatorResult = invoke.execute(frame, inliningTarget, self.getCurrentCallTarget(), arguments);
        +            } catch (PException e) {
        +                throw handleException(self, inliningTarget, errorProfile, raiseNode, e);
        +            } finally {
        +                self.setRunning(false);
        +            }
        +            if (generatorResult instanceof ContinuationResult continuation) {
        +                return handleResult(inliningTarget, self, continuation);
        +            } else {
        +                returnProfile.enter(inliningTarget);
        +                throw handleReturn(inliningTarget, self, generatorResult);
        +            }
        +        }
        +
        +        private static PException handleException(PGenerator self, Node inliningTarget, IsBuiltinObjectProfile profile, PRaiseNode raiseNode, PException e) {
                     self.markAsFinished();
                     if (self.isAsyncGen()) {
                         // Async generators need to wrap StopAsyncIteration in a runtime error
                         if (profile.profileException(inliningTarget, e, StopAsyncIteration)) {
        -                    throw raiseNode.get(inliningTarget).raiseWithCause(RuntimeError, e.getEscapedException(), ErrorMessages.ASYNCGEN_RAISED_ASYNCSTOPITER);
        +                    throw raiseNode.raiseWithCause(inliningTarget, RuntimeError, e, ErrorMessages.ASYNCGEN_RAISED_ASYNCSTOPITER);
                         }
                     }
                     // PEP 479 - StopIteration raised from generator body needs to be wrapped in
                     // RuntimeError
                     e.expectStopIteration(inliningTarget, profile);
        -            throw raiseNode.get(inliningTarget).raiseWithCause(RuntimeError, e.getEscapedException(), ErrorMessages.GENERATOR_RAISED_STOPITER);
        +            throw raiseNode.raiseWithCause(inliningTarget, RuntimeError, e, ErrorMessages.GENERATOR_RAISED_STOPITER);
                 }
         
        -        private static Object handleResult(Node node, PGenerator self, GeneratorYieldResult result) {
        -            self.handleResult(PythonLanguage.get(node), result);
        -            return result.yieldValue;
        +        private static Object handleResult(Node node, PGenerator self, Object result) {
        +            return self.handleResult(PythonLanguage.get(node), result);
                 }
         
        -        private static PException handleReturn(PGenerator self, GeneratorReturnException e, PRaiseNode raiseNode) {
        +        private static PException handleReturn(Node inliningTarget, PGenerator self, Object returnValue) {
                     self.markAsFinished();
                     if (self.isAsyncGen()) {
        -                throw raiseNode.raise(StopAsyncIteration);
        +                throw PRaiseNode.raiseStatic(inliningTarget, StopAsyncIteration);
                     }
        -            if (e.value != PNone.NONE) {
        -                throw raiseNode.raise(StopIteration, new Object[]{e.value});
        +            if (returnValue != PNone.NONE) {
        +                throw PRaiseNode.raiseStatic(inliningTarget, StopIteration, new Object[]{returnValue});
                     } else {
        -                throw raiseNode.raise(StopIteration);
        +                throw TpIterNextBuiltin.iteratorExhausted();
                     }
                 }
        -
        -        protected static CallTargetInvokeNode createDirectCall(CallTarget target) {
        -            return CallTargetInvokeNode.create(target, false, true);
        -        }
        -
        -        protected static boolean sameCallTarget(RootCallTarget target1, CallTarget target2) {
        -            return target1 == target2;
        -        }
             }
         
             @Builtin(name = "send", minNumOfPositionalArgs = 2)
        @@ -260,14 +339,18 @@ public abstract static class SendNode extends PythonBinaryBuiltinNode {
                 static Object send(VirtualFrame frame, PGenerator self, Object value,
                                 @Bind("this") Node inliningTarget,
                                 @Cached ResumeGeneratorNode resumeGeneratorNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     // even though this isn't a builtin for async generators, SendNode is used on async
                     // generators by PAsyncGenSend
                     checkResumable(inliningTarget, self, raiseNode);
                     if (!self.isStarted() && value != PNone.NONE) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.SEND_NON_NONE_TO_UNSTARTED_GENERATOR);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.SEND_NON_NONE_TO_UNSTARTED_GENERATOR);
        +            }
        +            try {
        +                return resumeGeneratorNode.execute(frame, inliningTarget, self, value);
        +            } catch (IteratorExhausted e) {
        +                throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.StopIteration);
                     }
        -            return resumeGeneratorNode.execute(frame, inliningTarget, self, value);
                 }
             }
         
        @@ -288,16 +371,15 @@ static Object sendThrow(VirtualFrame frame, PGenerator self, Object typ, Object
                                 @Cached ExceptionNodes.GetTracebackNode getTracebackNode,
                                 @Cached ExceptionNodes.SetTracebackNode setTracebackNode,
                                 @Cached ExceptionNodes.SetContextNode setContextNode,
        -                        @Cached PythonObjectFactory.Lazy factory,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     boolean hasTb = hasTbProfile.profile(inliningTarget, !(tb instanceof PNone));
                     if (hasTb && !(tb instanceof PTraceback)) {
                         invalidTbProfile.enter(inliningTarget);
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.THROW_THIRD_ARG_MUST_BE_TRACEBACK);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.THROW_THIRD_ARG_MUST_BE_TRACEBACK);
                     }
                     if (self.isRunning()) {
                         runningProfile.enter(inliningTarget);
        -                throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.GENERATOR_ALREADY_EXECUTING);
        +                throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.GENERATOR_ALREADY_EXECUTING);
                     }
                     Object instance = prepareExceptionNode.execute(frame, typ, val);
                     if (hasTb) {
        @@ -307,12 +389,16 @@ static Object sendThrow(VirtualFrame frame, PGenerator self, Object typ, Object
                     setContextNode.execute(inliningTarget, instance, PNone.NONE); // Will be filled when
                                                                                   // caught
                     if (self.isCoroutine() && self.isFinished()) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.CANNOT_REUSE_CORO);
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.CANNOT_REUSE_CORO);
                     }
                     if (startedProfile.profile(inliningTarget, self.isStarted() && !self.isFinished())) {
                         // Pass it to the generator where it will be thrown by the last yield, the location
                         // will be filled there
        -                return resumeGeneratorNode.execute(frame, inliningTarget, self, new ThrowData(instance, PythonOptions.isPExceptionWithJavaStacktrace(language)));
        +                try {
        +                    return resumeGeneratorNode.execute(frame, inliningTarget, self, new ThrowData(instance, PythonOptions.isPExceptionWithJavaStacktrace(language)));
        +                } catch (IteratorExhausted e) {
        +                    throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.StopIteration);
        +                }
                     } else {
                         // Unstarted generator, we cannot pass the exception into the generator as there is
                         // nothing that would handle it.
        @@ -320,15 +406,20 @@ static Object sendThrow(VirtualFrame frame, PGenerator self, Object typ, Object
                         // its frame to the traceback manually.
                         self.markAsFinished();
                         Node location = self.getCurrentCallTarget().getRootNode();
        -                MaterializedFrame generatorFrame = PArguments.getGeneratorFrame(self.getArguments());
        -                PFrame pFrame = MaterializeFrameNode.materializeGeneratorFrame(location, generatorFrame, PFrame.Reference.EMPTY, factory.get(inliningTarget));
        +                MaterializedFrame generatorFrame;
        +                if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) {
        +                    generatorFrame = Truffle.getRuntime().createMaterializedFrame(PArguments.create(), self.getRootNode().getFrameDescriptor());
        +                } else {
        +                    generatorFrame = PArguments.getGeneratorFrame(self.getArguments());
        +                }
        +                PFrame pFrame = MaterializeFrameNode.materializeGeneratorFrame(location, generatorFrame, PFrame.Reference.EMPTY);
                         FrameInfo info = (FrameInfo) generatorFrame.getFrameDescriptor().getInfo();
        -                pFrame.setLine(info.getRootNode().getFirstLineno());
        +                pFrame.setLine(info.getFirstLineNumber());
                         Object existingTracebackObj = getTracebackNode.execute(inliningTarget, instance);
        -                PTraceback newTraceback = factory.get(inliningTarget).createTraceback(pFrame, pFrame.getLine(),
        +                PTraceback newTraceback = PFactory.createTraceback(language, pFrame, pFrame.getLine(),
                                         (existingTracebackObj instanceof PTraceback existingTraceback) ? existingTraceback : null);
                         setTracebackNode.execute(inliningTarget, instance, newTraceback);
        -                throw PException.fromObject(instance, location, PythonOptions.isPExceptionWithJavaStacktrace(language));
        +                throw PException.fromObject(instance, inliningTarget, PythonOptions.isPExceptionWithJavaStacktrace(language));
                     }
                 }
             }
        @@ -343,18 +434,20 @@ static Object close(VirtualFrame frame, PGenerator self,
                                 @Cached IsBuiltinObjectProfile isStopIteration,
                                 @Cached ResumeGeneratorNode resumeGeneratorNode,
                                 @Cached InlinedConditionProfile isStartedPorfile,
        -                        @Cached PythonObjectFactory factory,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     if (self.isRunning()) {
        -                throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.GENERATOR_ALREADY_EXECUTING);
        +                throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.GENERATOR_ALREADY_EXECUTING);
                     }
                     if (isStartedPorfile.profile(inliningTarget, self.isStarted() && !self.isFinished())) {
        -                PBaseException pythonException = factory.createBaseException(GeneratorExit);
        +                PBaseException pythonException = PFactory.createBaseException(PythonLanguage.get(inliningTarget), GeneratorExit);
                         // Pass it to the generator where it will be thrown by the last yield, the location
                         // will be filled there
                         boolean withJavaStacktrace = PythonOptions.isPExceptionWithJavaStacktrace(PythonLanguage.get(inliningTarget));
                         try {
                             resumeGeneratorNode.execute(frame, inliningTarget, self, new ThrowData(pythonException, withJavaStacktrace));
        +                } catch (IteratorExhausted e) {
        +                    // This is the "success" path
        +                    return PNone.NONE;
                         } catch (PException pe) {
                             if (isGeneratorExit.profileException(inliningTarget, pe, GeneratorExit) || isStopIteration.profileException(inliningTarget, pe, StopIteration)) {
                                 // This is the "success" path
        @@ -364,7 +457,7 @@ static Object close(VirtualFrame frame, PGenerator self,
                         } finally {
                             self.markAsFinished();
                         }
        -                throw raiseNode.get(inliningTarget).raise(RuntimeError, ErrorMessages.GENERATOR_IGNORED_EXIT);
        +                throw raiseNode.raise(inliningTarget, RuntimeError, ErrorMessages.GENERATOR_IGNORED_EXIT);
                     } else {
                         self.markAsFinished();
                         return PNone.NONE;
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/CoroutineBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/CoroutineBuiltins.java
        index f5ee0623fd..85a25d7d98 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/CoroutineBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/CoroutineBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,18 +40,22 @@
          */
         package com.oracle.graal.python.builtins.objects.generator;
         
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___AWAIT__;
        -
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
         import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
        +import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        @@ -60,9 +64,13 @@
         import com.oracle.truffle.api.frame.VirtualFrame;
         import com.oracle.truffle.api.nodes.Node;
         import com.oracle.truffle.api.profiles.InlinedConditionProfile;
        +import com.oracle.truffle.api.strings.TruffleString;
         
         @CoreFunctions(extendClasses = PythonBuiltinClassType.PCoroutine)
         public final class CoroutineBuiltins extends PythonBuiltins {
        +
        +    public static final TpSlots SLOTS = CoroutineBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return CoroutineBuiltinsFactory.getFactories();
        @@ -74,9 +82,8 @@ public abstract static class GetCode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static Object getCode(PGenerator self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached InlinedConditionProfile hasCodeProfile,
        -                        @Cached PythonObjectFactory.Lazy factory) {
        -            return self.getOrCreateCode(inliningTarget, hasCodeProfile, factory);
        +                        @Cached InlinedConditionProfile hasCodeProfile) {
        +            return self.getOrCreateCode(inliningTarget, hasCodeProfile);
                 }
             }
         
        @@ -118,13 +125,23 @@ static boolean suspended(PGenerator self) {
                 }
             }
         
        -    @Builtin(name = J___AWAIT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.am_await, isComplex = true)
             @GenerateNodeFactory
             abstract static class AwaitNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static Object await(PGenerator self,
        -                        @Cached PythonObjectFactory factory) {
        -            return factory.createCoroutineWrapper(self);
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createCoroutineWrapper(language, self);
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
        +    @GenerateNodeFactory
        +    abstract static class ReprNode extends PythonUnaryBuiltinNode {
        +        @Specialization
        +        static TruffleString repr(PGenerator self,
        +                        @Cached SimpleTruffleStringFormatNode simpleTruffleStringFormatNode) {
        +            return simpleTruffleStringFormatNode.format("", self.getQualname(), PythonAbstractObject.objectHashCode(self));
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/GeneratorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/GeneratorBuiltins.java
        index 2aecfbec5d..01342aa0c9 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/GeneratorBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/GeneratorBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2017, 2024, Oracle and/or its affiliates.
        + * Copyright (c) 2017, 2025, Oracle and/or its affiliates.
          * Copyright (c) 2014, Regents of the University of California
          *
          * All rights reserved.
        @@ -31,13 +31,13 @@
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___QUALNAME__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CLASS_GETITEM__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
         import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        @@ -48,14 +48,20 @@
         import com.oracle.graal.python.builtins.objects.function.PArguments;
         import com.oracle.graal.python.builtins.objects.str.StringNodes;
         import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
         import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
        -import com.oracle.graal.python.nodes.bytecode.FrameInfo;
        +import com.oracle.graal.python.nodes.bytecode.BytecodeFrameInfo;
        +import com.oracle.graal.python.nodes.bytecode_dsl.BytecodeDSLFrameInfo;
         import com.oracle.graal.python.nodes.frame.MaterializeFrameNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.PythonOptions;
        +import com.oracle.graal.python.runtime.object.PFactory;
        +import com.oracle.truffle.api.bytecode.BytecodeLocation;
        +import com.oracle.truffle.api.bytecode.ContinuationResult;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        @@ -70,15 +76,17 @@
         @CoreFunctions(extendClasses = PythonBuiltinClassType.PGenerator)
         public final class GeneratorBuiltins extends PythonBuiltins {
         
        -    private static void checkResumable(Node inliningTarget, PGenerator self, PRaiseNode.Lazy raiseNode) {
        +    private static void checkResumable(Node inliningTarget, PGenerator self, PRaiseNode raiseNode) {
                 if (self.isFinished()) {
        -            throw raiseNode.get(inliningTarget).raiseStopIteration();
        +            throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.StopIteration);
                 }
                 if (self.isRunning()) {
        -            throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.GENERATOR_ALREADY_EXECUTING);
        +            throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.GENERATOR_ALREADY_EXECUTING);
                 }
             }
         
        +    public static final TpSlots SLOTS = GeneratorBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return GeneratorBuiltinsFactory.getFactories();
        @@ -128,7 +136,7 @@ static Object setQualname(PGenerator self, Object value,
                 }
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
         
        @@ -138,15 +146,20 @@ static Object iter(PGenerator self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1, doc = "Implement next(self).")
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization
                 static Object next(VirtualFrame frame, PGenerator self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached CommonGeneratorBuiltins.ResumeGeneratorNode resumeGeneratorNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        -            checkResumable(inliningTarget, self, raiseNode);
        +                        @Cached PRaiseNode raiseNode) {
        +            if (self.isFinished()) {
        +                throw iteratorExhausted();
        +            }
        +            if (self.isRunning()) {
        +                throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.GENERATOR_ALREADY_EXECUTING);
        +            }
                     return resumeGeneratorNode.execute(frame, inliningTarget, self, null);
                 }
             }
        @@ -157,9 +170,8 @@ public abstract static class GetCodeNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static Object getCode(PGenerator self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached InlinedConditionProfile hasCodeProfile,
        -                        @Cached PythonObjectFactory.Lazy factory) {
        -            return self.getOrCreateCode(inliningTarget, hasCodeProfile, factory);
        +                        @Cached InlinedConditionProfile hasCodeProfile) {
        +            return self.getOrCreateCode(inliningTarget, hasCodeProfile);
                 }
             }
         
        @@ -173,8 +185,8 @@ static Object getRunning(PGenerator self, @SuppressWarnings("unused") PNone none
         
                 @Specialization(guards = "!isNoValue(obj)")
                 static Object setRunning(@SuppressWarnings("unused") PGenerator self, @SuppressWarnings("unused") Object obj,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(AttributeError, ErrorMessages.ATTRIBUTE_S_OF_P_OBJECTS_IS_NOT_WRITABLE, "gi_running", self);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, AttributeError, ErrorMessages.ATTRIBUTE_S_OF_P_OBJECTS_IS_NOT_WRITABLE, "gi_running", self);
                 }
             }
         
        @@ -182,19 +194,29 @@ static Object setRunning(@SuppressWarnings("unused") PGenerator self, @SuppressW
             @GenerateNodeFactory
             public abstract static class GetFrameNode extends PythonUnaryBuiltinNode {
                 @Specialization
        -        static Object getFrame(PGenerator self,
        -                        @Cached PythonObjectFactory factory) {
        +        static Object getFrame(PGenerator self) {
                     if (self.isFinished()) {
                         return PNone.NONE;
                     } else {
        -                MaterializedFrame generatorFrame = PArguments.getGeneratorFrame(self.getArguments());
        -                Node location = ((FrameInfo) generatorFrame.getFrameDescriptor().getInfo()).getRootNode();
        -                PFrame frame = MaterializeFrameNode.materializeGeneratorFrame(location, generatorFrame, PFrame.Reference.EMPTY, factory);
        -                FrameInfo info = (FrameInfo) generatorFrame.getFrameDescriptor().getInfo();
        -                int bci = self.getBci();
        -                frame.setBci(bci);
        -                frame.setLine(info.getRootNode().bciToLine(bci));
        -                return frame;
        +                if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) {
        +                    ContinuationResult continuation = self.getContinuation();
        +                    BytecodeLocation location = continuation.getBytecodeLocation();
        +                    MaterializedFrame generatorFrame = continuation.getFrame();
        +                    BytecodeDSLFrameInfo info = (BytecodeDSLFrameInfo) generatorFrame.getFrameDescriptor().getInfo();
        +                    PFrame frame = MaterializeFrameNode.materializeGeneratorFrame(location.getBytecodeNode(), generatorFrame, PFrame.Reference.EMPTY);
        +                    int bci = location.getBytecodeIndex();
        +                    frame.setBci(bci);
        +                    frame.setLine(info.getRootNode().bciToLine(bci, location.getBytecodeNode()));
        +                    return frame;
        +                } else {
        +                    MaterializedFrame generatorFrame = PArguments.getGeneratorFrame(self.getArguments());
        +                    BytecodeFrameInfo info = (BytecodeFrameInfo) generatorFrame.getFrameDescriptor().getInfo();
        +                    PFrame frame = MaterializeFrameNode.materializeGeneratorFrame(info.getRootNode(), generatorFrame, PFrame.Reference.EMPTY);
        +                    int bci = self.getBci();
        +                    frame.setBci(bci);
        +                    frame.setLine(info.getRootNode().bciToLine(bci));
        +                    return frame;
        +                }
                     }
                 }
             }
        @@ -218,13 +240,13 @@ static boolean suspended(PGenerator self) {
                 }
             }
         
        -    @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
             @GenerateNodeFactory
             abstract static class ReprNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static TruffleString repr(PGenerator self,
                                 @Cached SimpleTruffleStringFormatNode simpleTruffleStringFormatNode) {
        -            return simpleTruffleStringFormatNode.format("", self.getName(), PythonAbstractObject.objectHashCode(self));
        +            return simpleTruffleStringFormatNode.format("", self.getQualname(), PythonAbstractObject.objectHashCode(self));
                 }
             }
         
        @@ -233,8 +255,8 @@ static TruffleString repr(PGenerator self,
             public abstract static class ClassGetItemNode extends PythonBinaryBuiltinNode {
                 @Specialization
                 static Object classGetItem(Object cls, Object key,
        -                        @Cached PythonObjectFactory factory) {
        -            return factory.createGenericAlias(cls, key);
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createGenericAlias(language, cls, key);
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/PGenerator.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/PGenerator.java
        index 2325e7cfc9..7f7888b099 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/PGenerator.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/PGenerator.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2017, 2023, Oracle and/or its affiliates.
        + * Copyright (c) 2017, 2025, Oracle and/or its affiliates.
          * Copyright (c) 2013, Regents of the University of California
          *
          * All rights reserved.
        @@ -31,15 +31,21 @@
         import com.oracle.graal.python.builtins.objects.code.PCode;
         import com.oracle.graal.python.builtins.objects.function.PArguments;
         import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
        +import com.oracle.graal.python.nodes.bytecode.BytecodeFrameInfo;
         import com.oracle.graal.python.nodes.bytecode.FrameInfo;
         import com.oracle.graal.python.nodes.bytecode.GeneratorYieldResult;
         import com.oracle.graal.python.nodes.bytecode.PBytecodeGeneratorRootNode;
         import com.oracle.graal.python.nodes.bytecode.PBytecodeRootNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.nodes.bytecode_dsl.BytecodeDSLFrameInfo;
        +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode;
        +import com.oracle.graal.python.runtime.PythonOptions;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.CompilerDirectives;
         import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
        +import com.oracle.truffle.api.bytecode.ContinuationResult;
         import com.oracle.truffle.api.RootCallTarget;
         import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.nodes.RootNode;
         import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         import com.oracle.truffle.api.strings.TruffleString;
         
        @@ -47,32 +53,94 @@ public class PGenerator extends PythonBuiltinObject {
         
             private TruffleString name;
             private TruffleString qualname;
        -    /**
        -     * Call targets with copies of the generator's AST. Each call target corresponds to one possible
        -     * entry point into the generator: the first call, and continuation for each yield. Each AST can
        -     * then specialize towards which nodes are executed when starting from that particular entry
        -     * point. When yielding, the next index to the next call target to continue from is updated via
        -     * {@link #handleResult}.
        -     */
        -    @CompilationFinal(dimensions = 1) protected final RootCallTarget[] callTargets;
        -    protected final Object[] arguments;
        -    private boolean finished;
        -    private PCode code;
        -    private int currentCallTarget;
        -    private final PBytecodeRootNode bytecodeRootNode;
             private final FrameInfo frameInfo;
        +
        +    private boolean finished;
             // running means it is currently on the stack, not just started
             private boolean running;
             private final boolean isCoroutine;
             private final boolean isAsyncGen;
         
        +    private PCode code;
        +    protected final Object[] arguments;
        +
        +    // TODO (GR-38700): remove BytecodeState after migrated to the Bytecode DSL interpreter.
        +    protected static class BytecodeState {
        +        private final PBytecodeRootNode rootNode;
        +
        +        /**
        +         * Call targets with copies of the generator's AST. Each call target corresponds to one
        +         * possible entry point into the generator: the first call, and continuation for each yield.
        +         * Each AST can then specialize towards which nodes are executed when starting from that
        +         * particular entry point. When yielding, the next index to the next call target to continue
        +         * from is updated via {@link #handleResult}.
        +         */
        +        @CompilationFinal(dimensions = 1) private final RootCallTarget[] callTargets;
        +        private int currentCallTarget;
        +
        +        public BytecodeState(PBytecodeRootNode rootNode, RootCallTarget[] callTargets) {
        +            this.rootNode = rootNode;
        +            this.callTargets = callTargets;
        +            this.currentCallTarget = 0;
        +        }
        +
        +        public RootCallTarget getCurrentCallTarget() {
        +            return callTargets[currentCallTarget];
        +        }
        +
        +        public PBytecodeGeneratorRootNode getCurrentRootNode() {
        +            return (PBytecodeGeneratorRootNode) getCurrentCallTarget().getRootNode();
        +        }
        +
        +        public Object handleResult(PythonLanguage language, GeneratorYieldResult result) {
        +            currentCallTarget = result.resumeBci;
        +            if (callTargets[currentCallTarget] == null) {
        +                CompilerDirectives.transferToInterpreterAndInvalidate();
        +                PBytecodeGeneratorRootNode generatorRootNode = new PBytecodeGeneratorRootNode(language, rootNode, result.resumeBci, result.resumeStackTop);
        +                callTargets[currentCallTarget] = generatorRootNode.getCallTarget();
        +            }
        +            return result.yieldValue;
        +        }
        +    }
        +
        +    private static class BytecodeDSLState {
        +        private final PBytecodeDSLRootNode rootNode;
        +        private ContinuationResult yieldResult;
        +
        +        public BytecodeDSLState(PBytecodeDSLRootNode rootNode) {
        +            this.rootNode = rootNode;
        +            this.yieldResult = null;
        +        }
        +
        +        public Object handleResult(ContinuationResult result) {
        +            yieldResult = result;
        +            return result.getResult();
        +        }
        +    }
        +
        +    // This is either BytecodeState or BytecodeDSLState.
        +    private final Object state;
        +
        +    private BytecodeState getBytecodeState() {
        +        return (BytecodeState) state;
        +    }
        +
        +    private BytecodeDSLState getBytecodeDSLState() {
        +        return (BytecodeDSLState) state;
        +    }
        +
             // An explicit isIterableCoroutine argument is needed for iterable coroutines (generally created
             // via types.coroutine)
             public static PGenerator create(PythonLanguage lang, TruffleString name, TruffleString qualname, PBytecodeRootNode rootNode, RootCallTarget[] callTargets, Object[] arguments,
                             PythonBuiltinClassType cls, boolean isIterableCoroutine) {
                 // note: also done in PAsyncGen.create
                 rootNode.createGeneratorFrame(arguments);
        -        return new PGenerator(lang, name, qualname, rootNode, callTargets, arguments, cls, isIterableCoroutine);
        +        return new PGenerator(lang, name, qualname, arguments, cls, isIterableCoroutine, new BytecodeState(rootNode, callTargets));
        +    }
        +
        +    public static PGenerator create(PythonLanguage lang, TruffleString name, TruffleString qualname, PBytecodeDSLRootNode rootNode, Object[] arguments,
        +                    PythonBuiltinClassType cls, boolean isIterableCoroutine) {
        +        return new PGenerator(lang, name, qualname, arguments, cls, isIterableCoroutine, new BytecodeDSLState(rootNode));
             }
         
             public static PGenerator create(PythonLanguage lang, TruffleString name, TruffleString qualname, PBytecodeRootNode rootNode, RootCallTarget[] callTargets, Object[] arguments,
        @@ -80,61 +148,79 @@ public static PGenerator create(PythonLanguage lang, TruffleString name, Truffle
                 return create(lang, name, qualname, rootNode, callTargets, arguments, cls, false);
             }
         
        -    protected PGenerator(PythonLanguage lang, TruffleString name, TruffleString qualname, PBytecodeRootNode rootNode, RootCallTarget[] callTargets, Object[] arguments, PythonBuiltinClassType cls,
        -                    boolean isIterableCoroutine) {
        +    public static PGenerator create(PythonLanguage lang, TruffleString name, TruffleString qualname, PBytecodeDSLRootNode rootNode, Object[] arguments,
        +                    PythonBuiltinClassType cls) {
        +        return create(lang, name, qualname, rootNode, arguments, cls, false);
        +    }
        +
        +    protected PGenerator(PythonLanguage lang, TruffleString name, TruffleString qualname, Object[] arguments, PythonBuiltinClassType cls, boolean isIterableCoroutine, Object state) {
                 super(cls, cls.getInstanceShape(lang));
                 this.name = name;
                 this.qualname = qualname;
        -        this.callTargets = callTargets;
        -        this.currentCallTarget = 0;
                 this.arguments = arguments;
                 this.finished = false;
        -        this.bytecodeRootNode = rootNode;
        -        this.frameInfo = (FrameInfo) rootNode.getFrameDescriptor().getInfo();
                 this.isCoroutine = isIterableCoroutine || cls == PythonBuiltinClassType.PCoroutine;
                 this.isAsyncGen = cls == PythonBuiltinClassType.PAsyncGenerator;
        +        if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) {
        +            BytecodeDSLState bytecodeDSLState = (BytecodeDSLState) state;
        +            this.state = state;
        +            this.frameInfo = (BytecodeDSLFrameInfo) bytecodeDSLState.rootNode.getFrameDescriptor().getInfo();
        +        } else {
        +            BytecodeState bytecodeState = (BytecodeState) state;
        +            this.state = state;
        +            this.frameInfo = (BytecodeFrameInfo) bytecodeState.rootNode.getFrameDescriptor().getInfo();
        +        }
             }
         
        -    public final void handleResult(PythonLanguage language, GeneratorYieldResult result) {
        -        currentCallTarget = result.resumeBci;
        -        if (callTargets[currentCallTarget] == null) {
        -            CompilerDirectives.transferToInterpreterAndInvalidate();
        -            PBytecodeGeneratorRootNode rootNode = new PBytecodeGeneratorRootNode(language, bytecodeRootNode, result.resumeBci, result.resumeStackTop);
        -            callTargets[currentCallTarget] = rootNode.getCallTarget();
        +    public RootNode getRootNode() {
        +        if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) {
        +            return getBytecodeDSLState().rootNode;
        +        } else {
        +            return getBytecodeState().rootNode;
                 }
             }
         
             /**
        -     * Returns the call target that should be used the next time the generator is called. Each time
        -     * a generator call target returns through a yield, the generator should be updated with the
        -     * next yield index to use via {@link #handleResult}
        +     * Returns the call target that should be used the next time the generator is called.
              */
        -    public final RootCallTarget getCurrentCallTarget() {
        -        return callTargets[currentCallTarget];
        +    public RootCallTarget getCurrentCallTarget() {
        +        if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) {
        +            BytecodeDSLState bytecodeDSLState = getBytecodeDSLState();
        +            if (bytecodeDSLState.yieldResult == null) {
        +                return bytecodeDSLState.rootNode.getCallTarget();
        +            }
        +            return bytecodeDSLState.yieldResult.getContinuationCallTarget();
        +        } else {
        +            return getBytecodeState().getCurrentCallTarget();
        +        }
             }
         
        -    public final Object getYieldFrom() {
        -        if (running || finished) {
        +    public Object getYieldFrom() {
        +        if (isRunning() || isFinished()) {
                     return null;
                 }
        -        return frameInfo.getYieldFrom(PArguments.getGeneratorFrame(arguments), getBci(), getCurrentRootNode().getResumeStackTop());
        -    }
         
        -    private PBytecodeGeneratorRootNode getCurrentRootNode() {
        -        return (PBytecodeGeneratorRootNode) getCurrentCallTarget().getRootNode();
        +        if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) {
        +            throw new UnsupportedOperationException("not implemented"); // TODO: GR-64250
        +        } else {
        +            return frameInfo.getYieldFrom(PArguments.getGeneratorFrame(arguments), getBci(), getBytecodeState().getCurrentRootNode().getResumeStackTop());
        +        }
        +
             }
         
        -    public final boolean isStarted() {
        -        return currentCallTarget != 0 && !running;
        +    public boolean isStarted() {
        +        if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) {
        +            return getBytecodeDSLState().yieldResult != null && !isRunning();
        +        } else {
        +            return getBytecodeState().currentCallTarget != 0 && !isRunning();
        +        }
             }
         
        -    public final int getBci() {
        -        if (!isStarted()) {
        -            return -1;
        -        } else if (finished) {
        -            return bytecodeRootNode.getCodeUnit().code.length;
        +    public Object handleResult(PythonLanguage language, Object result) {
        +        if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) {
        +            return getBytecodeDSLState().handleResult((ContinuationResult) result);
                 } else {
        -            return getCurrentRootNode().getResumeBci();
        +            return getBytecodeState().handleResult(language, (GeneratorYieldResult) result);
                 }
             }
         
        @@ -155,11 +241,10 @@ public final String toString() {
                 return "";
             }
         
        -    public final PCode getOrCreateCode(Node inliningTarget, InlinedConditionProfile hasCodeProfile, PythonObjectFactory.Lazy factory) {
        +    public final PCode getOrCreateCode(Node inliningTarget, InlinedConditionProfile hasCodeProfile) {
                 if (hasCodeProfile.profile(inliningTarget, code == null)) {
        -            RootCallTarget callTarget;
        -            callTarget = bytecodeRootNode.getCallTarget();
        -            code = factory.get(inliningTarget).createCode(callTarget);
        +            RootCallTarget callTarget = getRootNode().getCallTarget();
        +            code = PFactory.createCode(PythonLanguage.get(inliningTarget), callTarget);
                 }
                 return code;
             }
        @@ -196,4 +281,20 @@ public final boolean isCoroutine() {
             public final boolean isAsyncGen() {
                 return isAsyncGen;
             }
        +
        +    public int getBci() {
        +        assert !PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER;
        +        if (!isStarted()) {
        +            return -1;
        +        } else if (isFinished()) {
        +            return getBytecodeState().rootNode.getCodeUnit().code.length;
        +        } else {
        +            return getBytecodeState().getCurrentRootNode().getResumeBci();
        +        }
        +    }
        +
        +    public ContinuationResult getContinuation() {
        +        assert PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER;
        +        return getBytecodeDSLState().yieldResult;
        +    }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/DescriptorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/DescriptorBuiltins.java
        index 09f580f2da..0d569b0e38 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/DescriptorBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/DescriptorBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -55,7 +55,6 @@
         import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
         import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode;
         import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetIndexedSlotsCountNode;
        -import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode;
         import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.attributes.GetAttributeNode.GetFixedAttributeNode;
        @@ -142,10 +141,10 @@ abstract static class DescriptorCheckNode extends Node {
                 static void check(Node inliningTarget, Object descrType, Object name, Object obj,
                                 @Cached GetClassNode getClassNode,
                                 @Cached(inline = false) IsSubtypeNode isSubtypeNode,
        -                        @Cached(inline = false) PRaiseNode raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     Object type = getClassNode.execute(inliningTarget, obj);
                     if (!isSubtypeNode.execute(type, descrType)) {
        -                throw raiseNode.raise(TypeError, ErrorMessages.DESC_S_FOR_N_DOESNT_APPLY_TO_N, name, descrType, type);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.DESC_S_FOR_N_DOESNT_APPLY_TO_N, name, descrType, type);
                     }
                 }
             }
        @@ -158,27 +157,26 @@ public abstract static class DescrGetNode extends Node {
                 @Specialization
                 Object doGetSetDescriptor(VirtualFrame frame, GetSetDescriptor descr, Object obj,
                                 @Bind("this") Node inliningTarget,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode,
        -                        @Cached GetNameNode getNameNode,
        +                        @Exclusive @Cached PRaiseNode raiseNode,
                                 @Cached CallUnaryMethodNode callNode) {
                     if (descr.getGet() != null) {
                         return callNode.executeObject(frame, descr.getGet(), obj);
                     } else {
        -                throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.ATTR_S_OF_S_IS_NOT_READABLE, descr.getName(), getNameNode.execute(inliningTarget, descr.getType()));
        +                throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.ATTR_S_OF_N_IS_NOT_READABLE, descr.getName(), descr.getType());
                     }
                 }
         
                 @Specialization
                 Object doIndexedSlotDescriptor(IndexedSlotDescriptor descr, PythonAbstractObject obj,
                                 @Bind("this") Node inliningTarget,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode,
        +                        @Exclusive @Cached PRaiseNode raiseNode,
                                 @Cached GetOrCreateIndexedSlots getSlotsNode) {
                     Object[] slots = getSlotsNode.execute(inliningTarget, obj);
                     Object val = slots[descr.getIndex()];
                     if (val != null) {
                         return val;
                     }
        -            throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.OBJ_N_HAS_NO_ATTR_S, descr.getType(), descr.getName());
        +            throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.OBJ_N_HAS_NO_ATTR_S, descr.getType(), descr.getName());
                 }
             }
         
        @@ -189,13 +187,12 @@ public abstract static class DescrSetNode extends Node {
                 @Specialization
                 Object doGetSetDescriptor(VirtualFrame frame, GetSetDescriptor descr, Object obj, Object value,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached GetNameNode getNameNode,
        -                        @Cached PRaiseNode.Lazy raiseNode,
        +                        @Cached PRaiseNode raiseNode,
                                 @Cached CallBinaryMethodNode callNode) {
                     if (descr.getSet() != null) {
                         return callNode.executeObject(frame, descr.getSet(), obj, value);
                     } else {
        -                throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.ATTR_S_OF_S_OBJ_IS_NOT_WRITABLE, descr.getName(), getNameNode.execute(inliningTarget, descr.getType()));
        +                throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.ATTR_S_OF_N_OBJ_IS_NOT_WRITABLE, descr.getName(), descr.getType());
                     }
                 }
         
        @@ -215,8 +212,7 @@ public abstract static class DescrDeleteNode extends Node {
                 @Specialization
                 Object doGetSetDescriptor(VirtualFrame frame, GetSetDescriptor descr, Object obj,
                                 @Bind("this") Node inliningTarget,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode,
        -                        @Cached GetNameNode getNameNode,
        +                        @Exclusive @Cached PRaiseNode raiseNode,
                                 @Cached CallBinaryMethodNode callNode,
                                 @Cached InlinedBranchProfile branchProfile) {
                     if (descr.allowsDelete()) {
        @@ -224,9 +220,9 @@ Object doGetSetDescriptor(VirtualFrame frame, GetSetDescriptor descr, Object obj
                     } else {
                         branchProfile.enter(inliningTarget);
                         if (descr.getSet() != null) {
        -                    throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANNOT_DELETE_ATTRIBUTE, getNameNode.execute(inliningTarget, descr.getType()), descr.getName());
        +                    throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANNOT_DELETE_ATTRIBUTE, descr.getType(), descr.getName());
                         } else {
        -                    throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.ATTRIBUTE_S_OF_P_OBJECTS_IS_NOT_WRITABLE, descr.getName(), obj);
        +                    throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.ATTRIBUTE_S_OF_P_OBJECTS_IS_NOT_WRITABLE, descr.getName(), obj);
                         }
                     }
                 }
        @@ -234,7 +230,7 @@ Object doGetSetDescriptor(VirtualFrame frame, GetSetDescriptor descr, Object obj
                 @Specialization
                 Object doIndexedSlotDescriptor(IndexedSlotDescriptor descr, PythonAbstractObject obj,
                                 @Bind("this") Node inliningTarget,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode,
        +                        @Exclusive @Cached PRaiseNode raiseNode,
                                 @Cached GetOrCreateIndexedSlots getSlotsNode,
                                 @Cached InlinedConditionProfile profile) {
                     // PyMember_SetOne - Check if the attribute is set.
        @@ -243,7 +239,7 @@ Object doIndexedSlotDescriptor(IndexedSlotDescriptor descr, PythonAbstractObject
                         slots[descr.getIndex()] = null;
                         return PNone.NONE;
                     }
        -            throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.AttributeError, ErrorMessages.S, descr.getName());
        +            throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.AttributeError, ErrorMessages.S, descr.getName());
                 }
             }
         
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/GetSetDescriptor.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/GetSetDescriptor.java
        index e148bf4e8c..c928893384 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/GetSetDescriptor.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/GetSetDescriptor.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -47,7 +47,7 @@
         import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
         import com.oracle.graal.python.builtins.objects.str.PString;
         import com.oracle.graal.python.nodes.SpecialAttributeNames;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.graal.python.util.PythonUtils;
         import com.oracle.truffle.api.object.Shape;
         import com.oracle.truffle.api.strings.TruffleString;
        @@ -102,11 +102,11 @@ public boolean allowsDelete() {
                 return allowsDelete;
             }
         
        -    public GetSetDescriptor boundToObject(PythonBuiltinClassType klass, PythonObjectFactory factory) {
        +    public GetSetDescriptor boundToObject(PythonBuiltinClassType klass, PythonLanguage language) {
                 if (klass == type) {
                     return this;
                 } else {
        -            return factory.createGetSetDescriptor(get, set, getName(), klass, allowsDelete);
        +            return PFactory.createGetSetDescriptor(language, get, set, getName(), klass, allowsDelete);
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/GetSetDescriptorTypeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/GetSetDescriptorTypeBuiltins.java
        index 0b693af60b..6b7afbcc72 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/GetSetDescriptorTypeBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/GetSetDescriptorTypeBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -41,7 +41,6 @@
         package com.oracle.graal.python.builtins.objects.getsetdescriptor;
         
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OBJCLASS__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
         
         import java.util.List;
         
        @@ -101,7 +100,7 @@ static Object doIndexedSlotDescriptor(IndexedSlotDescriptor self) {
                 }
             }
         
        -    @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
             @GenerateNodeFactory
             abstract static class GetSetReprNode extends PythonUnaryBuiltinNode {
                 @Specialization
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/MemberDescriptorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/MemberDescriptorBuiltins.java
        index 880a385966..204e64277c 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/MemberDescriptorBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/MemberDescriptorBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -41,10 +41,10 @@
         package com.oracle.graal.python.builtins.objects.getsetdescriptor;
         
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.annotations.Slot;
         import com.oracle.graal.python.annotations.Slot.SlotKind;
         import com.oracle.graal.python.builtins.Builtin;
        @@ -66,7 +66,7 @@
         import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.Cached.Shared;
        @@ -90,7 +90,7 @@ protected List> getNodeFa
                 return MemberDescriptorBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
             @GenerateNodeFactory
             abstract static class MemberDescriptorReprNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -109,10 +109,10 @@ abstract static class MemberDescriptorReduceNode extends PythonUnaryBuiltinNode
                 Object doGeneric(GetSetDescriptor descr,
                                 @Cached ReadAttributeFromObjectNode readAttributeFromObjectNode,
                                 @Cached GetIdNode getIdNode,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object getattr = readAttributeFromObjectNode.execute(getContext().getBuiltins(), BuiltinNames.T_GETATTR);
                     Object id = getIdNode.execute(getattr);
        -            return factory.createTuple(new Object[]{id, factory.createTuple(new Object[]{descr.getType(), descr.getName()})});
        +            return PFactory.createTuple(language, new Object[]{id, PFactory.createTuple(language, new Object[]{descr.getType(), descr.getName()})});
                 }
             }
         
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntBuiltins.java
        index 68ea65ac88..e1fa889ae0 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,51 +40,13 @@
          */
         package com.oracle.graal.python.builtins.objects.ints;
         
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ABS__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___AND__;
        +import static com.oracle.graal.python.nodes.BuiltinNames.J_INT;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CEIL__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DIVMOD__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOAT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOORDIV__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FLOOR__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FORMAT__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GETNEWARGS__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GE__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INDEX__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INVERT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LE__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LSHIFT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___MOD__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEG__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NE__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OR__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___POS__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___POW__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RAND__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RDIVMOD__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RFLOORDIV__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RLSHIFT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RMOD__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROR__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROUND__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RPOW__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RRSHIFT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RSHIFT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RSUB__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RTRUEDIV__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RXOR__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SUB__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___TRUEDIV__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___TRUFFLE_RICHCOMPARE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___TRUNC__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___XOR__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___BYTES__;
         import static com.oracle.graal.python.nodes.StringLiterals.T_BIG;
         import static com.oracle.graal.python.nodes.StringLiterals.T_LITTLE;
        @@ -98,10 +60,12 @@
         import java.math.RoundingMode;
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.annotations.ArgumentClinic;
         import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion;
         import com.oracle.graal.python.annotations.Slot;
         import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        @@ -111,21 +75,49 @@
         import com.oracle.graal.python.builtins.objects.PNotImplemented;
         import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
         import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
        +import com.oracle.graal.python.builtins.objects.bytes.BytesNodes.BytesFromObject;
         import com.oracle.graal.python.builtins.objects.bytes.PBytes;
         import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
         import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr;
        -import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
         import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.FromNativeSubclassNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PointerCompareNode;
         import com.oracle.graal.python.builtins.objects.common.FormatNodeBase;
        +import com.oracle.graal.python.builtins.objects.floats.PFloat;
         import com.oracle.graal.python.builtins.objects.ints.IntBuiltinsClinicProviders.FormatNodeClinicProviderGen;
        -import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.ints.IntBuiltinsClinicProviders.FromBytesNodeClinicProviderGen;
        +import com.oracle.graal.python.builtins.objects.ints.IntBuiltinsClinicProviders.ToBytesNodeClinicProviderGen;
        +import com.oracle.graal.python.builtins.objects.ints.IntBuiltinsFactory.AddNodeFactory;
        +import com.oracle.graal.python.builtins.objects.ints.IntBuiltinsFactory.AndNodeFactory;
        +import com.oracle.graal.python.builtins.objects.ints.IntBuiltinsFactory.FloorDivNodeFactory;
        +import com.oracle.graal.python.builtins.objects.ints.IntBuiltinsFactory.LShiftNodeFactory;
        +import com.oracle.graal.python.builtins.objects.ints.IntBuiltinsFactory.ModNodeFactory;
        +import com.oracle.graal.python.builtins.objects.ints.IntBuiltinsFactory.MulNodeFactory;
        +import com.oracle.graal.python.builtins.objects.ints.IntBuiltinsFactory.NegNodeFactory;
        +import com.oracle.graal.python.builtins.objects.ints.IntBuiltinsFactory.OrNodeFactory;
        +import com.oracle.graal.python.builtins.objects.ints.IntBuiltinsFactory.PowNodeFactory;
        +import com.oracle.graal.python.builtins.objects.ints.IntBuiltinsFactory.RShiftNodeFactory;
        +import com.oracle.graal.python.builtins.objects.ints.IntBuiltinsFactory.SubNodeFactory;
        +import com.oracle.graal.python.builtins.objects.ints.IntBuiltinsFactory.TrueDivNodeFactory;
        +import com.oracle.graal.python.builtins.objects.ints.IntBuiltinsFactory.XorNodeFactory;
        +import com.oracle.graal.python.builtins.objects.ints.IntNodes.PyLongFromByteArray;
         import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.HashBuiltinNode;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.NbBoolBuiltinNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare.RichCmpBuiltinNode;
         import com.oracle.graal.python.lib.PyLongCheckNode;
        +import com.oracle.graal.python.lib.PyLongCopy;
        +import com.oracle.graal.python.lib.PyLongFromUnicodeObject;
        +import com.oracle.graal.python.lib.PyNumberAsSizeNode;
         import com.oracle.graal.python.lib.PyNumberFloatNode;
        +import com.oracle.graal.python.lib.PyNumberLongNode;
         import com.oracle.graal.python.lib.PyObjectHashNode;
        +import com.oracle.graal.python.lib.PyUnicodeCheckNode;
        +import com.oracle.graal.python.lib.RichCmpOp;
         import com.oracle.graal.python.nodes.ErrorMessages;
        +import com.oracle.graal.python.nodes.PGuards;
        +import com.oracle.graal.python.nodes.PNodeWithContext;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.SpecialMethodNames;
         import com.oracle.graal.python.nodes.call.CallNode;
        @@ -138,17 +130,16 @@
         import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
        -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles;
        +import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassExactProfile;
         import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode;
        -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
        +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes;
         import com.oracle.graal.python.runtime.PythonContext;
         import com.oracle.graal.python.runtime.exception.PythonErrorType;
         import com.oracle.graal.python.runtime.formatting.FloatFormatter;
         import com.oracle.graal.python.runtime.formatting.IntegerFormatter;
         import com.oracle.graal.python.runtime.formatting.InternalFormat;
         import com.oracle.graal.python.runtime.formatting.InternalFormat.Spec;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        -import com.oracle.graal.python.util.ComparisonOp;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.graal.python.util.OverflowException;
         import com.oracle.graal.python.util.PythonUtils;
         import com.oracle.truffle.api.CompilerDirectives;
        @@ -175,38 +166,144 @@
         import com.oracle.truffle.api.library.CachedLibrary;
         import com.oracle.truffle.api.nodes.Node;
         import com.oracle.truffle.api.nodes.UnexpectedResultException;
        +import com.oracle.truffle.api.profiles.BranchProfile;
         import com.oracle.truffle.api.profiles.InlinedBranchProfile;
         import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         import com.oracle.truffle.api.profiles.InlinedIntValueProfile;
         import com.oracle.truffle.api.strings.TruffleString;
        +import com.oracle.truffle.api.strings.TruffleString.EqualNode;
        +import com.oracle.truffle.api.strings.TruffleString.FromJavaStringNode;
        +import com.oracle.truffle.api.strings.TruffleString.FromLongNode;
         
         @CoreFunctions(extendClasses = PythonBuiltinClassType.PInt)
         public final class IntBuiltins extends PythonBuiltins {
             public static final TpSlots SLOTS = IntBuiltinsSlotsGen.SLOTS;
         
        +    private static void raiseDivisionByZero(Node inliningTarget, boolean cond, PRaiseNode raiseNode) {
        +        if (cond) {
        +            raiseDivisionByZero(inliningTarget, raiseNode);
        +        }
        +    }
        +
        +    @InliningCutoff
        +    private static void raiseDivisionByZero(Node inliningTarget, PRaiseNode raiseNode) {
        +        throw raiseNode.raise(inliningTarget, PythonErrorType.ZeroDivisionError, ErrorMessages.S_DIVISION_OR_MODULO_BY_ZERO, "integer");
        +    }
        +
             @Override
             protected List> getNodeFactories() {
                 return IntBuiltinsFactory.getFactories();
             }
         
        -    private abstract static class IntBinaryBuiltinNode extends PythonBinaryBuiltinNode {
        -        protected static void raiseDivisionByZero(Node inliningTarget, boolean cond, InlinedBranchProfile divisionByZeroProfile, PRaiseNode.Lazy raiseNode) {
        -            if (cond) {
        -                raiseDivByZero(inliningTarget, divisionByZeroProfile, raiseNode.get(inliningTarget));
        +    // int(x=0)
        +    // int(x, base=10)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = J_INT, minNumOfPositionalArgs = 1, parameterNames = {"cls", "x", "base"}, numOfPositionalOnlyArgs = 2)
        +    @GenerateNodeFactory
        +    public abstract static class IntNewNode extends PythonTernaryBuiltinNode {
        +
        +        @Specialization
        +        static Object doGeneric(VirtualFrame frame, Object cls, Object x, Object baseObj,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached IntNodeInnerNode innerNode,
        +                        @Cached IsBuiltinClassExactProfile isPrimitiveIntProfile,
        +                        @Cached CreateIntSubclassNode createIntSubclassNode) {
        +            Object result = innerNode.execute(frame, inliningTarget, x, baseObj);
        +            if (isPrimitiveIntProfile.profileClass(inliningTarget, cls, PythonBuiltinClassType.PInt)) {
        +                return result;
        +            } else {
        +                return createIntSubclassNode.execute(inliningTarget, cls, result);
                     }
                 }
         
        -        @InliningCutoff
        -        private static void raiseDivByZero(Node inliningTarget, InlinedBranchProfile divisionByZeroProfile, PRaiseNode raiseNode) {
        -            divisionByZeroProfile.enter(inliningTarget);
        -            throw raiseNode.raise(PythonErrorType.ZeroDivisionError, ErrorMessages.S_DIVISION_OR_MODULO_BY_ZERO, "integer");
        +        @GenerateInline
        +        @GenerateCached(false)
        +        abstract static class CreateIntSubclassNode extends Node {
        +            public abstract Object execute(Node inliningTarget, Object cls, Object intObj);
        +
        +            @Specialization
        +            static Object doSubclass(Object cls, int value,
        +                            @Bind PythonLanguage language,
        +                            @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) {
        +                return PFactory.createInt(language, cls, getInstanceShape.execute(cls), value);
        +            }
        +
        +            @Specialization
        +            static Object doSubclass(Object cls, long value,
        +                            @Bind PythonLanguage language,
        +                            @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) {
        +                return PFactory.createInt(language, cls, getInstanceShape.execute(cls), value);
        +            }
        +
        +            @Specialization
        +            static Object doSubclass(Object cls, boolean value,
        +                            @Bind PythonLanguage language,
        +                            @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) {
        +                return PFactory.createInt(language, cls, getInstanceShape.execute(cls), PInt.intValue(value));
        +            }
        +
        +            @Specialization
        +            static Object doSubclass(Object cls, PInt value,
        +                            @Bind PythonLanguage language,
        +                            @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) {
        +                return PFactory.createInt(language, cls, getInstanceShape.execute(cls), value.getValue());
        +            }
        +        }
        +
        +        @GenerateInline
        +        @GenerateCached(false)
        +        @ImportStatic(PGuards.class)
        +        abstract static class IntNodeInnerNode extends Node {
        +            public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object x, Object base);
        +
        +            @Specialization(guards = "isNoValue(baseObj)")
        +            static Object doNoBase(VirtualFrame frame, Node inliningTarget, Object x, @SuppressWarnings("unused") Object baseObj,
        +                            @Cached InlinedBranchProfile noX,
        +                            @Cached PyNumberLongNode pyNumberLongNode) {
        +                if (x == PNone.NO_VALUE) {
        +                    noX.enter(inliningTarget);
        +                    return 0;
        +                } else {
        +                    return pyNumberLongNode.execute(frame, inliningTarget, x);
        +                }
        +            }
        +
        +            @Fallback
        +            @InliningCutoff
        +            static Object doWithBase(VirtualFrame frame, Node inliningTarget, Object x, Object baseObj,
        +                            @Cached InlinedBranchProfile missingArgument,
        +                            @Cached InlinedBranchProfile wrongBase,
        +                            @Cached InlinedBranchProfile cannotConvert,
        +                            @Cached PyNumberAsSizeNode asSizeNode,
        +                            @Cached PyUnicodeCheckNode unicodeCheckNode,
        +                            @Cached PyLongFromUnicodeObject longFromUnicode,
        +                            @Cached BytesNodes.BytesLikeCheck bytesLikeCheck,
        +                            @Cached PyNumberLongNode.LongFromBufferNode fromBufferNode,
        +                            @Cached PRaiseNode raiseNode) {
        +                if (x == PNone.NO_VALUE) {
        +                    missingArgument.enter(inliningTarget);
        +                    throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.INT_MISSING_STRING_ARGUMENT);
        +                }
        +                int base = asSizeNode.executeLossy(frame, inliningTarget, baseObj);
        +                if ((base != 0 && base < 2) || base > 36) {
        +                    wrongBase.enter(inliningTarget);
        +                    throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.INT_BASE_MUST_BE_2_AND_36_OR_0);
        +                }
        +                if (unicodeCheckNode.execute(inliningTarget, x)) {
        +                    return longFromUnicode.execute(inliningTarget, x, base);
        +                } else if (bytesLikeCheck.execute(inliningTarget, x)) {
        +                    return fromBufferNode.execute(frame, x, base);
        +                }
        +                cannotConvert.enter(inliningTarget);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.INT_CANT_CONVERT_STRING_WITH_EXPL_BASE);
        +            }
                 }
             }
         
             @Builtin(name = J___ROUND__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2)
             @GenerateNodeFactory
             @ImportStatic(MathGuards.class)
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        +    @TypeSystemReference(PythonIntegerTypes.class)
             abstract static class RoundNode extends PythonBinaryBuiltinNode {
                 @SuppressWarnings("unused")
                 @Specialization
        @@ -224,70 +321,70 @@ static long roundLongNone(long arg, PNone n) {
                 @Specialization
                 static PInt roundPIntNone(PInt arg, PNone n,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory.Lazy factory) {
        -            return factory.get(inliningTarget).createInt(arg.getValue());
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, arg.getValue());
                 }
         
                 @Specialization
                 static Object roundLongInt(long arg, int n,
                                 @Bind("this") Node inliningTarget,
                                 @Shared("intOvf") @Cached InlinedBranchProfile intOverflow,
        -                        @Shared @Cached PythonObjectFactory.Lazy factory) {
        +                        @Shared("longOvf") @Cached InlinedBranchProfile longOverflow) {
                     if (n >= 0) {
                         return arg;
                     }
        -            return makeInt(inliningTarget, op(arg, n), intOverflow, factory);
        +            return makeInt(inliningTarget, op(arg, n), intOverflow, longOverflow);
                 }
         
                 @Specialization
                 static Object roundPIntInt(PInt arg, int n,
                                 @Bind("this") Node inliningTarget,
                                 @Shared("intOvf") @Cached InlinedBranchProfile intOverflow,
        -                        @Shared @Cached PythonObjectFactory.Lazy factory) {
        +                        @Shared("longOvf") @Cached InlinedBranchProfile longOverflow) {
                     if (n >= 0) {
                         return arg;
                     }
        -            return makeInt(inliningTarget, op(arg.getValue(), n), intOverflow, factory);
        +            return makeInt(inliningTarget, op(arg.getValue(), n), intOverflow, longOverflow);
                 }
         
                 @Specialization
                 static Object roundLongLong(long arg, long n,
                                 @Bind("this") Node inliningTarget,
                                 @Shared("intOvf") @Cached InlinedBranchProfile intOverflow,
        -                        @Shared @Cached PythonObjectFactory.Lazy factory) {
        +                        @Shared("longOvf") @Cached InlinedBranchProfile longOverflow) {
                     if (n >= 0) {
                         return arg;
                     }
                     if (n < Integer.MIN_VALUE) {
                         return 0;
                     }
        -            return makeInt(inliningTarget, op(arg, (int) n), intOverflow, factory);
        +            return makeInt(inliningTarget, op(arg, (int) n), intOverflow, longOverflow);
                 }
         
                 @Specialization
                 static Object roundPIntLong(PInt arg, long n,
                                 @Bind("this") Node inliningTarget,
                                 @Shared("intOvf") @Cached InlinedBranchProfile intOverflow,
        -                        @Shared @Cached PythonObjectFactory.Lazy factory) {
        +                        @Shared("longOvf") @Cached InlinedBranchProfile longOverflow) {
                     if (n >= 0) {
                         return arg;
                     }
                     if (n < Integer.MIN_VALUE) {
                         return 0;
                     }
        -            return makeInt(inliningTarget, op(arg.getValue(), (int) n), intOverflow, factory);
        +            return makeInt(inliningTarget, op(arg.getValue(), (int) n), intOverflow, longOverflow);
                 }
         
                 @Specialization
                 static Object roundPIntLong(long arg, PInt n,
                                 @Bind("this") Node inliningTarget,
                                 @Shared("intOvf") @Cached InlinedBranchProfile intOverflow,
        -                        @Shared @Cached PythonObjectFactory.Lazy factory) {
        +                        @Shared("longOvf") @Cached InlinedBranchProfile longOverflow) {
                     if (n.isZeroOrPositive()) {
                         return arg;
                     }
                     try {
        -                return makeInt(inliningTarget, op(arg, n.intValueExact()), intOverflow, factory);
        +                return makeInt(inliningTarget, op(arg, n.intValueExact()), intOverflow, longOverflow);
                     } catch (OverflowException e) {
                         // n is < -2^31, max. number of base-10 digits in BigInteger is 2^31 * log10(2)
                         return 0;
        @@ -298,12 +395,12 @@ static Object roundPIntLong(long arg, PInt n,
                 static Object roundPIntPInt(PInt arg, PInt n,
                                 @Bind("this") Node inliningTarget,
                                 @Shared("intOvf") @Cached InlinedBranchProfile intOverflow,
        -                        @Shared @Cached PythonObjectFactory.Lazy factory) {
        +                        @Shared("longOvf") @Cached InlinedBranchProfile longOverflow) {
                     if (n.isZeroOrPositive()) {
                         return arg;
                     }
                     try {
        -                return makeInt(inliningTarget, op(arg.getValue(), n.intValueExact()), intOverflow, factory);
        +                return makeInt(inliningTarget, op(arg.getValue(), n.intValueExact()), intOverflow, longOverflow);
                     } catch (OverflowException e) {
                         // n is < -2^31, max. number of base-10 digits in BigInteger is 2^31 * log10(2)
                         return 0;
        @@ -313,11 +410,11 @@ static Object roundPIntPInt(PInt arg, PInt n,
                 @Specialization(guards = {"!isInteger(n)"})
                 @SuppressWarnings("unused")
                 static Object roundPIntPInt(Object arg, Object n,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, n);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, n);
                 }
         
        -        private static Object makeInt(Node inliningTarget, BigDecimal d, InlinedBranchProfile intOverflow, PythonObjectFactory.Lazy factory) {
        +        private static Object makeInt(Node inliningTarget, BigDecimal d, InlinedBranchProfile intOverflow, InlinedBranchProfile longOverflow) {
                     try {
                         return intValueExact(d);
                     } catch (OverflowException e) {
        @@ -328,10 +425,10 @@ private static Object makeInt(Node inliningTarget, BigDecimal d, InlinedBranchPr
                         return longValueExact(d);
                     } catch (OverflowException e) {
                         // does not fit long, try BigInteger
        +                longOverflow.enter(inliningTarget);
                     }
                     try {
        -                // lazy factory initialization should serve as branch profile
        -                return factory.get(inliningTarget).createInt(toBigIntegerExact(d));
        +                return PFactory.createInt(PythonLanguage.get(inliningTarget), toBigIntegerExact(d));
                     } catch (OverflowException e) {
                         // has non-zero fractional part, which should not happen
                         throw CompilerDirectives.shouldNotReachHere("non-integer produced after rounding an integer", e);
        @@ -388,67 +485,67 @@ private static BigDecimal op(BigInteger arg, int n) {
         
             @Slot(value = SlotKind.nb_add, isComplex = true)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        +    @TypeSystemReference(PythonIntegerTypes.class)
             public abstract static class AddNode extends BinaryOpBuiltinNode {
                 public abstract Object execute(int left, int right);
         
                 @Specialization(rewriteOn = ArithmeticException.class)
        -        static int add(int left, int right) {
        +        static int doII(int left, int right) {
                     return Math.addExact(left, right);
                 }
         
        -        @Specialization(rewriteOn = ArithmeticException.class)
        -        static long addLong(long left, long right) {
        +        @Specialization(replaces = "doII", rewriteOn = ArithmeticException.class)
        +        static long doLL(long left, long right) {
                     return Math.addExact(left, right);
                 }
         
        -        @Specialization
        -        static Object addLongWithOverflow(long x, long y,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +        @Specialization(replaces = "doLL")
        +        static Object doLLOvf(long x, long y,
        +                        @Bind PythonLanguage language) {
                     /* Inlined version of Math.addExact(x, y) with BigInteger fallback. */
                     long r = x + y;
                     // HD 2-12 Overflow iff both arguments have the opposite sign of the result
                     if (((x ^ r) & (y ^ r)) < 0) {
        -                return factory.createInt(op(PInt.longToBigInteger(x), PInt.longToBigInteger(y)));
        +                return PFactory.createInt(language, add(PInt.longToBigInteger(x), PInt.longToBigInteger(y)));
                     }
                     return r;
                 }
         
                 @Specialization(rewriteOn = OverflowException.class)
        -        static Object addPIntLongAndNarrow(PInt left, long right) throws OverflowException {
        -            return PInt.longValueExact(op(left.getValue(), PInt.longToBigInteger(right)));
        +        static Object doPLNarrow(PInt left, long right) throws OverflowException {
        +            return PInt.longValueExact(add(left.getValue(), PInt.longToBigInteger(right)));
                 }
         
        -        @Specialization(replaces = "addPIntLongAndNarrow")
        -        static Object addPIntLong(PInt left, long right,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createInt(op(left.getValue(), PInt.longToBigInteger(right)));
        +        @Specialization(replaces = "doPLNarrow")
        +        static Object doPL(PInt left, long right,
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, add(left.getValue(), PInt.longToBigInteger(right)));
                 }
         
                 @Specialization(rewriteOn = OverflowException.class)
        -        static Object addLongPIntAndNarrow(long left, PInt right) throws OverflowException {
        -            return PInt.longValueExact(op(PInt.longToBigInteger(left), right.getValue()));
        +        static Object doLPNarrow(long left, PInt right) throws OverflowException {
        +            return PInt.longValueExact(add(PInt.longToBigInteger(left), right.getValue()));
                 }
         
        -        @Specialization(replaces = "addLongPIntAndNarrow")
        -        static Object addLongPInt(long left, PInt right,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createInt(op(PInt.longToBigInteger(left), right.getValue()));
        +        @Specialization(replaces = "doLPNarrow")
        +        static Object doLP(long left, PInt right,
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, add(PInt.longToBigInteger(left), right.getValue()));
                 }
         
                 @Specialization(rewriteOn = OverflowException.class)
        -        static Object addPIntPIntAndNarrow(PInt left, PInt right) throws OverflowException {
        -            return PInt.longValueExact(op(left.getValue(), right.getValue()));
        +        static Object doPPNarrow(PInt left, PInt right) throws OverflowException {
        +            return PInt.longValueExact(add(left.getValue(), right.getValue()));
                 }
         
        -        @Specialization(replaces = "addPIntPIntAndNarrow")
        -        static Object addPIntPInt(PInt left, PInt right,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createInt(op(left.getValue(), right.getValue()));
        +        @Specialization(replaces = "doPPNarrow")
        +        static Object doPP(PInt left, PInt right,
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, add(left.getValue(), right.getValue()));
                 }
         
                 @TruffleBoundary
        -        static BigInteger op(BigInteger left, BigInteger right) {
        +        public static BigInteger add(BigInteger left, BigInteger right) {
                     return left.add(right);
                 }
         
        @@ -466,15 +563,14 @@ static PNotImplemented doGeneric(Object left, Object right) {
         
                 @NeverDefault
                 public static AddNode create() {
        -            return IntBuiltinsFactory.AddNodeFactory.create();
        +            return AddNodeFactory.create();
                 }
             }
         
        -    @Builtin(name = J___RSUB__, minNumOfPositionalArgs = 2, reverseOperation = true)
        -    @Builtin(name = J___SUB__, minNumOfPositionalArgs = 2)
        +    @Slot(value = SlotKind.nb_subtract, isComplex = true)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        -    public abstract static class SubNode extends PythonBinaryBuiltinNode {
        +    @TypeSystemReference(PythonIntegerTypes.class)
        +    public abstract static class SubNode extends BinaryOpBuiltinNode {
                 public abstract Object execute(int left, int right);
         
                 @Specialization(rewriteOn = ArithmeticException.class)
        @@ -482,7 +578,7 @@ static int doII(int x, int y) throws ArithmeticException {
                     return Math.subtractExact(x, y);
                 }
         
        -        @Specialization
        +        @Specialization(replaces = "doII")
                 static long doIIOvf(int x, int y) {
                     return (long) x - (long) y;
                 }
        @@ -492,54 +588,54 @@ static long doLL(long x, long y) throws ArithmeticException {
                     return Math.subtractExact(x, y);
                 }
         
        -        @Specialization
        +        @Specialization(replaces = "doLL")
                 static Object doLongWithOverflow(long x, long y,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +                        @Bind("this") Node inliningTarget) {
                     /* Inlined version of Math.subtractExact(x, y) with BigInteger fallback. */
                     long r = x - y;
                     // HD 2-12 Overflow iff the arguments have different signs and
                     // the sign of the result is different than the sign of x
                     if (((x ^ y) & (x ^ r)) < 0) {
        -                return factory.createInt(op(PInt.longToBigInteger(x), PInt.longToBigInteger(y)));
        +                return PFactory.createInt(PythonLanguage.get(inliningTarget), sub(PInt.longToBigInteger(x), PInt.longToBigInteger(y)));
                     }
                     return r;
                 }
         
                 @Specialization(rewriteOn = OverflowException.class)
                 static long doPIntLongAndNarrow(PInt left, long right) throws OverflowException {
        -            return PInt.longValueExact(op(left.getValue(), PInt.longToBigInteger(right)));
        +            return PInt.longValueExact(sub(left.getValue(), PInt.longToBigInteger(right)));
                 }
         
                 @Specialization(replaces = "doPIntLongAndNarrow")
                 static PInt doPIntLong(PInt left, long right,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createInt(op(left.getValue(), PInt.longToBigInteger(right)));
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, sub(left.getValue(), PInt.longToBigInteger(right)));
                 }
         
                 @Specialization(rewriteOn = OverflowException.class)
                 static long doLongPIntAndNarrow(long left, PInt right) throws OverflowException {
        -            return PInt.longValueExact(op(PInt.longToBigInteger(left), right.getValue()));
        +            return PInt.longValueExact(sub(PInt.longToBigInteger(left), right.getValue()));
                 }
         
                 @Specialization(replaces = "doLongPIntAndNarrow")
                 static PInt doLongPInt(long left, PInt right,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createInt(op(PInt.longToBigInteger(left), right.getValue()));
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, sub(PInt.longToBigInteger(left), right.getValue()));
                 }
         
                 @Specialization(rewriteOn = OverflowException.class)
                 static long doPIntPIntAndNarrow(PInt left, PInt right) throws OverflowException {
        -            return PInt.longValueExact(op(left.getValue(), right.getValue()));
        +            return PInt.longValueExact(sub(left.getValue(), right.getValue()));
                 }
         
                 @Specialization(replaces = "doPIntPIntAndNarrow")
                 static PInt doPIntPInt(PInt left, PInt right,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createInt(op(left.getValue(), right.getValue()));
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, sub(left.getValue(), right.getValue()));
                 }
         
                 @TruffleBoundary
        -        private static BigInteger op(BigInteger left, BigInteger right) {
        +        public static BigInteger sub(BigInteger left, BigInteger right) {
                     return left.subtract(right);
                 }
         
        @@ -551,46 +647,45 @@ static PNotImplemented doGeneric(Object left, Object right) {
         
                 @NeverDefault
                 public static SubNode create() {
        -            return IntBuiltinsFactory.SubNodeFactory.create();
        +            return SubNodeFactory.create();
                 }
             }
         
        -    @Builtin(name = J___RTRUEDIV__, minNumOfPositionalArgs = 2, reverseOperation = true)
        -    @Builtin(name = J___TRUEDIV__, minNumOfPositionalArgs = 2)
        +    @Slot(value = SlotKind.nb_true_divide, isComplex = true)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        -    public abstract static class TrueDivNode extends PythonBinaryBuiltinNode {
        +    @TypeSystemReference(PythonIntegerTypes.class)
        +    public abstract static class TrueDivNode extends BinaryOpBuiltinNode {
                 public abstract Object execute(int left, int right);
         
                 @Specialization
                 static double divII(int x, int y,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     return divDD(x, y, inliningTarget, raiseNode);
                 }
         
                 @Specialization(guards = {"fitsIntoDouble(x)", "fitsIntoDouble(y)"})
                 static double divLL(long x, long y,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     return divDD(x, y, inliningTarget, raiseNode);
                 }
         
                 @Specialization(guards = {"!fitsIntoDouble(x) || !fitsIntoDouble(y)"})
                 static double divLLLarge(long x, long y,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     if (y == 0) {
        -                throw raiseNode.get(inliningTarget).raise(PythonErrorType.ZeroDivisionError, ErrorMessages.DIVISION_BY_ZERO);
        +                throw raiseNode.raise(inliningTarget, PythonErrorType.ZeroDivisionError, ErrorMessages.DIVISION_BY_ZERO);
                     }
                     return op(inliningTarget, PInt.longToBigInteger(x), PInt.longToBigInteger(y));
                 }
         
                 static double divDD(double x, double y,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     if (y == 0) {
        -                throw raiseNode.get(inliningTarget).raise(PythonErrorType.ZeroDivisionError, ErrorMessages.DIVISION_BY_ZERO);
        +                throw raiseNode.raise(inliningTarget, PythonErrorType.ZeroDivisionError, ErrorMessages.DIVISION_BY_ZERO);
                     }
                     return x / y;
                 }
        @@ -598,9 +693,9 @@ static double divDD(double x, double y,
                 @Specialization
                 static double doPI(long left, PInt right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     if (right.isZero()) {
        -                throw raiseNode.get(inliningTarget).raise(PythonErrorType.ZeroDivisionError, ErrorMessages.DIVISION_BY_ZERO);
        +                throw raiseNode.raise(inliningTarget, PythonErrorType.ZeroDivisionError, ErrorMessages.DIVISION_BY_ZERO);
                     }
                     return op(inliningTarget, PInt.longToBigInteger(left), right.getValue());
                 }
        @@ -608,9 +703,9 @@ static double doPI(long left, PInt right,
                 @Specialization
                 static double doPL(PInt left, long right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     if (right == 0) {
        -                throw raiseNode.get(inliningTarget).raise(PythonErrorType.ZeroDivisionError, ErrorMessages.DIVISION_BY_ZERO);
        +                throw raiseNode.raise(inliningTarget, PythonErrorType.ZeroDivisionError, ErrorMessages.DIVISION_BY_ZERO);
                     }
                     return op(inliningTarget, left.getValue(), PInt.longToBigInteger(right));
                 }
        @@ -618,9 +713,9 @@ static double doPL(PInt left, long right,
                 @Specialization
                 static double doPP(PInt left, PInt right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     if (right.isZero()) {
        -                throw raiseNode.get(inliningTarget).raise(PythonErrorType.ZeroDivisionError, ErrorMessages.DIVISION_BY_ZERO);
        +                throw raiseNode.raise(inliningTarget, PythonErrorType.ZeroDivisionError, ErrorMessages.DIVISION_BY_ZERO);
                     }
                     return op(inliningTarget, left.getValue(), right.getValue());
                 }
        @@ -631,7 +726,7 @@ static double doPP(PInt left, PInt right,
                  */
                 @TruffleBoundary
                 private static double op(Node raisingNode, BigInteger a, BigInteger b) {
        -            final int precisionOfDouble = 17;
        +            final int precisionOfDouble = 18;
                     if (fitsIntoDouble(a) && fitsIntoDouble(b)) {
                         return a.doubleValue() / b.doubleValue();
                     }
        @@ -642,12 +737,12 @@ private static double op(Node raisingNode, BigInteger a, BigInteger b) {
                     BigDecimal result = aDecimal.divide(bDecimal, bPrec - aPrec + precisionOfDouble, RoundingMode.HALF_EVEN);
                     double d = result.doubleValue();
                     if (Double.isInfinite(d)) {
        -                throw PRaiseNode.raiseUncached(raisingNode, OverflowError, ErrorMessages.INTEGER_DIVISION_RESULT_TOO_LARGE);
        +                throw PRaiseNode.raiseStatic(raisingNode, OverflowError, ErrorMessages.INTEGER_DIVISION_RESULT_TOO_LARGE);
                     }
                     return d;
                 }
         
        -        protected static boolean fitsIntoDouble(long x) {
        +        public static boolean fitsIntoDouble(long x) {
                     return x < (1L << 52) && x > -(1L << 52);
                 }
         
        @@ -663,86 +758,76 @@ static PNotImplemented doGeneric(Object left, Object right) {
         
                 @NeverDefault
                 public static TrueDivNode create() {
        -            return IntBuiltinsFactory.TrueDivNodeFactory.create();
        +            return TrueDivNodeFactory.create();
                 }
             }
         
        -    @Builtin(name = J___RFLOORDIV__, minNumOfPositionalArgs = 2, reverseOperation = true)
        -    @Builtin(name = J___FLOORDIV__, minNumOfPositionalArgs = 2)
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        +    @Slot(value = SlotKind.nb_floor_divide, isComplex = true)
        +    @TypeSystemReference(PythonIntegerTypes.class)
             @GenerateNodeFactory
        -    public abstract static class FloorDivNode extends IntBinaryBuiltinNode {
        +    public abstract static class FloorDivNode extends BinaryOpBuiltinNode {
                 public abstract Object execute(int left, int right);
         
        +        private static final long INT_OVERFLOW_VALUE = (long) Integer.MAX_VALUE + 1;
        +        private static final BigInteger LONG_OVERFLOW_VALUE = BigInteger.valueOf(Long.MAX_VALUE).add(BigInteger.ONE);
        +
                 @Specialization
        -        static int doII(int left, int right,
        +        static Object doII(int left, int right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            raiseDivisionByZero(inliningTarget, right == 0, divisionByZeroProfile, raiseNode);
        +                        @Shared @Cached BranchProfile overflowValueProfile,
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            raiseDivisionByZero(inliningTarget, right == 0, raiseNode);
        +            if (left == Integer.MIN_VALUE && right == -1) {
        +                overflowValueProfile.enter();
        +                return INT_OVERFLOW_VALUE;
        +            }
                     return Math.floorDiv(left, right);
                 }
         
        -        @Specialization(rewriteOn = OverflowException.class)
        -        static long doLL(long left, long right,
        +        @Specialization
        +        static Object doLL(long left, long right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) throws OverflowException {
        +                        @Shared @Cached BranchProfile overflowValueProfile,
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            raiseDivisionByZero(inliningTarget, right == 0, raiseNode);
                     if (left == Long.MIN_VALUE && right == -1) {
        -                throw OverflowException.INSTANCE;
        +                overflowValueProfile.enter();
        +                return PFactory.createInt(PythonLanguage.get(inliningTarget), LONG_OVERFLOW_VALUE);
                     }
        -            raiseDivisionByZero(inliningTarget, right == 0, divisionByZeroProfile, raiseNode);
                     return Math.floorDiv(left, right);
                 }
         
        -        @Specialization(replaces = "doLL")
        -        static PInt doLLOverflow(long left, long right,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            return doPiPi(factory.createInt(left), factory.createInt(right), inliningTarget, divisionByZeroProfile, factory, raiseNode);
        -        }
        -
        -        @Specialization(rewriteOn = OverflowException.class)
        -        static int doIPi(int left, PInt right,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) throws OverflowException {
        -            raiseDivisionByZero(inliningTarget, right.isZero(), divisionByZeroProfile, raiseNode);
        -            return Math.floorDiv(left, right.intValueExact());
        -        }
        -
        -        @Specialization(replaces = "doIPi")
        -        static int doIPiOvf(int left, PInt right,
        +        @Specialization
        +        static Object doIPi(int left, PInt right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            raiseDivisionByZero(inliningTarget, right.isZero(), divisionByZeroProfile, raiseNode);
        +                        @Shared @Cached BranchProfile overflowValueProfile,
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     try {
        -                return Math.floorDiv(left, right.intValueExact());
        +                int rightValue = right.intValueExact();
        +                raiseDivisionByZero(inliningTarget, rightValue == 0, raiseNode);
        +                if (left == Integer.MIN_VALUE && rightValue == -1) {
        +                    overflowValueProfile.enter();
        +                    return INT_OVERFLOW_VALUE;
        +                }
        +                return Math.floorDiv(left, rightValue);
                     } catch (OverflowException e) {
                         return left < 0 == right.isNegative() ? 0 : -1;
                     }
                 }
         
        -        @Specialization(rewriteOn = OverflowException.class)
        -        static long doLPi(long left, PInt right,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) throws OverflowException {
        -            raiseDivisionByZero(inliningTarget, right.isZero(), divisionByZeroProfile, raiseNode);
        -            return Math.floorDiv(left, right.longValueExact());
        -        }
        -
        -        @Specialization(replaces = "doLPi")
        -        static long doLPiOvf(long left, PInt right,
        +        @Specialization
        +        static Object doLPi(long left, PInt right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            raiseDivisionByZero(inliningTarget, right.isZero(), divisionByZeroProfile, raiseNode);
        +                        @Shared @Cached BranchProfile overflowValueProfile,
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     try {
        -                return Math.floorDiv(left, right.longValueExact());
        +                long rightValue = right.longValueExact();
        +                raiseDivisionByZero(inliningTarget, rightValue == 0, raiseNode);
        +                if (left == Long.MIN_VALUE && rightValue == -1) {
        +                    overflowValueProfile.enter();
        +                    return PFactory.createInt(PythonLanguage.get(inliningTarget), LONG_OVERFLOW_VALUE);
        +                }
        +                return Math.floorDiv(left, rightValue);
                     } catch (OverflowException e) {
                         return left < 0 == right.isNegative() ? 0 : -1;
                     }
        @@ -751,58 +836,52 @@ static long doLPiOvf(long left, PInt right,
                 @Specialization(rewriteOn = OverflowException.class)
                 static long doPiIAndNarrow(PInt left, int right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) throws OverflowException {
        -            raiseDivisionByZero(inliningTarget, right == 0, divisionByZeroProfile, raiseNode);
        +                        @Shared @Cached PRaiseNode raiseNode) throws OverflowException {
        +            raiseDivisionByZero(inliningTarget, right == 0, raiseNode);
                     return PInt.longValueExact(op(left.getValue(), PInt.longToBigInteger(right)));
                 }
         
                 @Specialization(replaces = "doPiIAndNarrow")
                 static PInt doPiI(PInt left, int right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            raiseDivisionByZero(inliningTarget, right == 0, divisionByZeroProfile, raiseNode);
        -            return factory.createInt(op(left.getValue(), PInt.longToBigInteger(right)));
        +                        @Bind PythonLanguage language,
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            raiseDivisionByZero(inliningTarget, right == 0, raiseNode);
        +            return PFactory.createInt(language, op(left.getValue(), PInt.longToBigInteger(right)));
                 }
         
                 @Specialization(rewriteOn = OverflowException.class)
                 static long doPiLAndNarrow(PInt left, long right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) throws OverflowException {
        -            raiseDivisionByZero(inliningTarget, right == 0, divisionByZeroProfile, raiseNode);
        +                        @Shared @Cached PRaiseNode raiseNode) throws OverflowException {
        +            raiseDivisionByZero(inliningTarget, right == 0, raiseNode);
                     return PInt.longValueExact(op(left.getValue(), PInt.longToBigInteger(right)));
                 }
         
                 @Specialization(replaces = "doPiLAndNarrow")
                 static PInt doPiL(PInt left, long right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            raiseDivisionByZero(inliningTarget, right == 0, divisionByZeroProfile, raiseNode);
        -            return factory.createInt(op(left.getValue(), PInt.longToBigInteger(right)));
        +                        @Bind PythonLanguage language,
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            raiseDivisionByZero(inliningTarget, right == 0, raiseNode);
        +            return PFactory.createInt(language, op(left.getValue(), PInt.longToBigInteger(right)));
                 }
         
                 @Specialization(rewriteOn = OverflowException.class)
                 static long doPiPiAndNarrow(PInt left, PInt right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) throws OverflowException {
        -            raiseDivisionByZero(inliningTarget, right.isZero(), divisionByZeroProfile, raiseNode);
        +                        @Shared @Cached PRaiseNode raiseNode) throws OverflowException {
        +            raiseDivisionByZero(inliningTarget, right.isZero(), raiseNode);
                     return PInt.longValueExact(op(left.getValue(), right.getValue()));
                 }
         
                 @Specialization(replaces = "doPiPiAndNarrow")
                 static PInt doPiPi(PInt left, PInt right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            raiseDivisionByZero(inliningTarget, right.isZero(), divisionByZeroProfile, raiseNode);
        -            return factory.createInt(op(left.getValue(), right.getValue()));
        +                        @Bind PythonLanguage language,
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            raiseDivisionByZero(inliningTarget, right.isZero(), raiseNode);
        +            return PFactory.createInt(language, op(left.getValue(), right.getValue()));
                 }
         
                 @TruffleBoundary
        @@ -824,59 +903,32 @@ static PNotImplemented doGeneric(Object right, Object left) {
         
                 @NeverDefault
                 public static FloorDivNode create() {
        -            return IntBuiltinsFactory.FloorDivNodeFactory.create();
        +            return FloorDivNodeFactory.create();
                 }
             }
         
        -    @Builtin(name = J___RDIVMOD__, minNumOfPositionalArgs = 2, reverseOperation = true)
        -    @Builtin(name = J___DIVMOD__, minNumOfPositionalArgs = 2)
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        +    @Slot(value = SlotKind.nb_divmod, isComplex = true)
             @GenerateNodeFactory
        -    abstract static class DivModNode extends IntBinaryBuiltinNode {
        -        @Specialization
        -        static PTuple doLL(int left, int right,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            raiseDivisionByZero(inliningTarget, right == 0, divisionByZeroProfile, raiseNode);
        -            return factory.createTuple(new Object[]{Math.floorDiv(left, right), Math.floorMod(left, right)});
        -        }
        +    abstract static class DivModNode extends BinaryOpBuiltinNode {
         
                 @Specialization
        -        static PTuple doLL(long left, long right,
        +        static Object doGeneric(VirtualFrame frame, Object left, Object right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            raiseDivisionByZero(inliningTarget, right == 0, divisionByZeroProfile, raiseNode);
        -            return factory.createTuple(new Object[]{Math.floorDiv(left, right), Math.floorMod(left, right)});
        -        }
        -
        -        @Specialization(guards = {"accepts(left)", "accepts(right)"})
        -        static PTuple doGenericInt(VirtualFrame frame, Object left, Object right,
                                 @Cached FloorDivNode floorDivNode,
        -                        @Cached ModNode modNode,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createTuple(new Object[]{floorDivNode.execute(frame, left, right), modNode.execute(frame, left, right)});
        -        }
        -
        -        @SuppressWarnings("unused")
        -        @Fallback
        -        static PNotImplemented doGeneric(Object left, Object right) {
        -            return PNotImplemented.NOT_IMPLEMENTED;
        -        }
        -
        -        protected static boolean accepts(Object obj) {
        -            return obj instanceof Integer || obj instanceof Long || obj instanceof PInt;
        +                        @Cached ModNode modNode) {
        +            Object div = floorDivNode.execute(frame, left, right);
        +            if (div == PNotImplemented.NOT_IMPLEMENTED) {
        +                return PNotImplemented.NOT_IMPLEMENTED;
        +            }
        +            Object mod = modNode.execute(frame, left, right);
        +            return PFactory.createTuple(PythonLanguage.get(inliningTarget), new Object[]{div, mod});
                 }
             }
         
        -    @Builtin(name = J___MOD__, minNumOfPositionalArgs = 2)
        -    @Builtin(name = J___RMOD__, minNumOfPositionalArgs = 2, reverseOperation = true)
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        +    @Slot(value = SlotKind.nb_remainder, isComplex = true)
        +    @TypeSystemReference(PythonIntegerTypes.class)
             @GenerateNodeFactory
        -    public abstract static class ModNode extends IntBinaryBuiltinNode {
        +    public abstract static class ModNode extends BinaryOpBuiltinNode {
                 public abstract int executeInt(int left, int right) throws UnexpectedResultException;
         
                 public abstract Object execute(int left, int right);
        @@ -884,114 +936,102 @@ public abstract static class ModNode extends IntBinaryBuiltinNode {
                 @Specialization
                 static int doII(int left, int right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            raiseDivisionByZero(inliningTarget, right == 0, divisionByZeroProfile, raiseNode);
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            raiseDivisionByZero(inliningTarget, right == 0, raiseNode);
                     return Math.floorMod(left, right);
                 }
         
                 @Specialization
                 static long doLL(long left, long right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            raiseDivisionByZero(inliningTarget, right == 0, divisionByZeroProfile, raiseNode);
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            raiseDivisionByZero(inliningTarget, right == 0, raiseNode);
                     return Math.floorMod(left, right);
                 }
         
                 @Specialization(guards = "right.isZeroOrPositive()", rewriteOn = OverflowException.class)
                 static long doLPiAndNarrow(long left, PInt right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) throws OverflowException {
        -            raiseDivisionByZero(inliningTarget, right.isZero(), divisionByZeroProfile, raiseNode);
        +                        @Shared @Cached PRaiseNode raiseNode) throws OverflowException {
        +            raiseDivisionByZero(inliningTarget, right.isZero(), raiseNode);
                     return PInt.longValueExact(op(PInt.longToBigInteger(left), right.getValue()));
                 }
         
                 @Specialization(guards = "right.isZeroOrPositive()", replaces = "doLPiAndNarrow")
                 static PInt doLPi(long left, PInt right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            raiseDivisionByZero(inliningTarget, right.isZero(), divisionByZeroProfile, raiseNode);
        -            return factory.createInt(op(PInt.longToBigInteger(left), right.getValue()));
        +                        @Bind PythonLanguage language,
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            raiseDivisionByZero(inliningTarget, right.isZero(), raiseNode);
        +            return PFactory.createInt(language, op(PInt.longToBigInteger(left), right.getValue()));
                 }
         
                 @Specialization(guards = "!right.isZeroOrPositive()", rewriteOn = OverflowException.class)
                 static long doLPiNegativeAndNarrow(long left, PInt right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) throws OverflowException {
        -            raiseDivisionByZero(inliningTarget, right.isZero(), divisionByZeroProfile, raiseNode);
        +                        @Shared @Cached PRaiseNode raiseNode) throws OverflowException {
        +            raiseDivisionByZero(inliningTarget, right.isZero(), raiseNode);
                     return PInt.longValueExact(opNeg(PInt.longToBigInteger(left), right.getValue()));
                 }
         
                 @Specialization(guards = "!right.isZeroOrPositive()", replaces = "doLPiNegativeAndNarrow")
                 static PInt doLPiNegative(long left, PInt right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            raiseDivisionByZero(inliningTarget, right.isZero(), divisionByZeroProfile, raiseNode);
        -            return factory.createInt(opNeg(PInt.longToBigInteger(left), right.getValue()));
        +                        @Bind PythonLanguage language,
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            raiseDivisionByZero(inliningTarget, right.isZero(), raiseNode);
        +            return PFactory.createInt(language, opNeg(PInt.longToBigInteger(left), right.getValue()));
                 }
         
                 @Specialization(guards = "right >= 0", rewriteOn = OverflowException.class)
                 static long doPiLAndNarrow(PInt left, long right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) throws OverflowException {
        -            raiseDivisionByZero(inliningTarget, right == 0, divisionByZeroProfile, raiseNode);
        +                        @Shared @Cached PRaiseNode raiseNode) throws OverflowException {
        +            raiseDivisionByZero(inliningTarget, right == 0, raiseNode);
                     return PInt.longValueExact(op(left.getValue(), PInt.longToBigInteger(right)));
                 }
         
                 @Specialization(guards = "right >= 0", replaces = "doPiLAndNarrow")
                 static PInt doPiL(PInt left, long right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            raiseDivisionByZero(inliningTarget, right == 0, divisionByZeroProfile, raiseNode);
        -            return factory.createInt(op(left.getValue(), PInt.longToBigInteger(right)));
        +                        @Bind PythonLanguage language,
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            raiseDivisionByZero(inliningTarget, right == 0, raiseNode);
        +            return PFactory.createInt(language, op(left.getValue(), PInt.longToBigInteger(right)));
                 }
         
                 @Specialization(guards = "right < 0", rewriteOn = OverflowException.class)
                 static long doPiLNegAndNarrow(PInt left, long right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) throws OverflowException {
        -            raiseDivisionByZero(inliningTarget, right == 0, divisionByZeroProfile, raiseNode);
        +                        @Shared @Cached PRaiseNode raiseNode) throws OverflowException {
        +            raiseDivisionByZero(inliningTarget, right == 0, raiseNode);
                     return PInt.longValueExact(opNeg(left.getValue(), PInt.longToBigInteger(right)));
                 }
         
                 @Specialization(guards = "right < 0", replaces = "doPiLNegAndNarrow")
                 static PInt doPiLNeg(PInt left, long right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            raiseDivisionByZero(inliningTarget, right == 0, divisionByZeroProfile, raiseNode);
        -            return factory.createInt(opNeg(left.getValue(), PInt.longToBigInteger(right)));
        +                        @Bind PythonLanguage language,
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            raiseDivisionByZero(inliningTarget, right == 0, raiseNode);
        +            return PFactory.createInt(language, opNeg(left.getValue(), PInt.longToBigInteger(right)));
                 }
         
                 @Specialization(guards = "right.isZeroOrPositive()", rewriteOn = OverflowException.class)
                 static long doPiPiAndNarrow(PInt left, PInt right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) throws OverflowException {
        -            raiseDivisionByZero(inliningTarget, right.isZero(), divisionByZeroProfile, raiseNode);
        +                        @Shared @Cached PRaiseNode raiseNode) throws OverflowException {
        +            raiseDivisionByZero(inliningTarget, right.isZero(), raiseNode);
                     return PInt.longValueExact(op(left.getValue(), right.getValue()));
                 }
         
                 @Specialization(guards = "right.isZeroOrPositive()", replaces = "doPiPiAndNarrow")
                 static PInt doPiPi(PInt left, PInt right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached InlinedBranchProfile divisionByZeroProfile,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            raiseDivisionByZero(inliningTarget, right.isZero(), divisionByZeroProfile, raiseNode);
        -            return factory.createInt(op(left.getValue(), right.getValue()));
        +                        @Bind PythonLanguage language,
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            raiseDivisionByZero(inliningTarget, right.isZero(), raiseNode);
        +            return PFactory.createInt(language, op(left.getValue(), right.getValue()));
                 }
         
                 @Specialization(guards = "!right.isZeroOrPositive()", rewriteOn = OverflowException.class)
        @@ -1001,8 +1041,8 @@ static long doPiPiNegAndNarrow(PInt left, PInt right) throws OverflowException {
         
                 @Specialization(guards = "!right.isZeroOrPositive()", replaces = "doPiPiNegAndNarrow")
                 static PInt doPiPiNeg(PInt left, PInt right,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createInt(opNeg(left.getValue(), right.getValue()));
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, opNeg(left.getValue(), right.getValue()));
                 }
         
                 @TruffleBoundary
        @@ -1030,13 +1070,13 @@ static PNotImplemented doGeneric(Object left, Object right) {
         
                 @NeverDefault
                 public static ModNode create() {
        -            return IntBuiltinsFactory.ModNodeFactory.create();
        +            return ModNodeFactory.create();
                 }
             }
         
             @Slot(value = SlotKind.nb_multiply, isComplex = true)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        +    @TypeSystemReference(PythonIntegerTypes.class)
             public abstract static class MulNode extends BinaryOpBuiltinNode {
                 public abstract Object execute(int left, int right);
         
        @@ -1055,9 +1095,9 @@ static long doLL(long x, long y) {
                     return Math.multiplyExact(x, y);
                 }
         
        -        @Specialization
        +        @Specialization(replaces = "doLL")
                 static Object doLongWithOverflow(long x, long y,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +                        @Bind("this") Node inliningTarget) {
                     /* Inlined version of Math.multiplyExact(x, y) with BigInteger fallback. */
                     long r = x * y;
                     long ax = Math.abs(x);
        @@ -1068,7 +1108,7 @@ static Object doLongWithOverflow(long x, long y,
                         // and check for the special case of Long.MIN_VALUE * -1
                         if (((y != 0) && (r / y != x)) ||
                                         (x == Long.MIN_VALUE && y == -1)) {
        -                    return factory.createInt(mul(PInt.longToBigInteger(x), PInt.longToBigInteger(y)));
        +                    return PFactory.createInt(PythonLanguage.get(inliningTarget), mul(PInt.longToBigInteger(x), PInt.longToBigInteger(y)));
                         }
                     }
                     return r;
        @@ -1086,37 +1126,37 @@ static int doPIntLongZero(@SuppressWarnings("unused") long left, @SuppressWarnin
         
                 @Specialization(guards = "right == 1")
                 static PInt doPIntLongOne(PInt left, @SuppressWarnings("unused") long right,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     // we must return a new object with the same value
        -            return factory.createInt(left.getValue());
        +            return PFactory.createInt(language, left.getValue());
                 }
         
                 @Specialization(guards = "left == 1")
                 PInt doPIntLongOne(@SuppressWarnings("unused") long left, PInt right,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createInt(right.getValue());
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, right.getValue());
                 }
         
                 @Specialization(guards = {"right != 0", "right != 1"})
                 static PInt doPIntLong(PInt left, long right,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createInt(mul(left.getValue(), PInt.longToBigInteger(right)));
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, mul(left.getValue(), PInt.longToBigInteger(right)));
                 }
         
                 @Specialization(guards = {"left != 0", "left != 1"})
                 PInt doPIntLong(long left, PInt right,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createInt(mul(PInt.longToBigInteger(left), right.getValue()));
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, mul(PInt.longToBigInteger(left), right.getValue()));
                 }
         
                 @Specialization
                 static PInt doPIntPInt(PInt left, PInt right,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createInt(mul(left.getValue(), right.getValue()));
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, mul(left.getValue(), right.getValue()));
                 }
         
                 @TruffleBoundary
        -        static BigInteger mul(BigInteger a, BigInteger b) {
        +        public static BigInteger mul(BigInteger a, BigInteger b) {
                     if (!BigInteger.ZERO.equals(b) && b.and(b.subtract(BigInteger.ONE)).equals(BigInteger.ZERO)) {
                         return bigIntegerShift(a, b.getLowestSetBit());
                     } else {
        @@ -1142,14 +1182,13 @@ static PNotImplemented doGeneric(Object left, Object right) {
         
                 @NeverDefault
                 public static MulNode create() {
        -            return IntBuiltinsFactory.MulNodeFactory.create();
        +            return MulNodeFactory.create();
                 }
             }
         
        -    @Builtin(name = J___RPOW__, minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 3, reverseOperation = true)
        -    @Builtin(name = J___POW__, minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 3)
        +    @Slot(value = SlotKind.nb_power, isComplex = true)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        +    @TypeSystemReference(PythonIntegerTypes.class)
             @ImportStatic(MathGuards.class)
             @ReportPolymorphism
             public abstract static class PowNode extends PythonTernaryBuiltinNode {
        @@ -1203,8 +1242,8 @@ static long doLLFast(long left, long right, @SuppressWarnings("unused") PNone no
                 @Specialization(guards = "right >= 0", replaces = "doLLFast")
                 @InliningCutoff
                 PInt doLLPos(long left, long right, @SuppressWarnings("unused") PNone none,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createInt(op(PInt.longToBigInteger(left), right));
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, op(PInt.longToBigInteger(left), right));
                 }
         
                 @Specialization(guards = "right < 0")
        @@ -1212,9 +1251,9 @@ PInt doLLPos(long left, long right, @SuppressWarnings("unused") PNone none,
                 double doLLNeg(long left, long right, @SuppressWarnings("unused") PNone none,
                                 @Bind("this") Node inliningTarget,
                                 @Shared("leftIsZero") @Cached InlinedConditionProfile leftIsZero,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     if (leftIsZero.profile(inliningTarget, left == 0)) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ZeroDivisionError, ErrorMessages.POW_ZERO_CANNOT_RAISE_TO_NEGATIVE_POWER);
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ZeroDivisionError, ErrorMessages.POW_ZERO_CANNOT_RAISE_TO_NEGATIVE_POWER);
                     }
                     return Math.pow(left, right);
                 }
        @@ -1224,7 +1263,7 @@ PInt doLLPos(long left, long right, @SuppressWarnings("unused") PNone none,
                 Object doLPNarrow(long left, PInt right, @SuppressWarnings("unused") PNone none,
                                 @Bind("this") Node inliningTarget,
                                 @Shared("leftIsZero") @Cached InlinedConditionProfile leftIsZero,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) throws OverflowException {
        +                        @Shared @Cached PRaiseNode raiseNode) throws OverflowException {
                     long lright = right.longValueExact();
                     if (lright >= 0) {
                         return doLLFast(left, lright, none);
        @@ -1234,11 +1273,10 @@ Object doLPNarrow(long left, PInt right, @SuppressWarnings("unused") PNone none,
         
                 @Specialization(replaces = "doLPNarrow")
                 @InliningCutoff
        -        Object doLP(long left, PInt right, @SuppressWarnings("unused") PNone none,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +        Object doLP(long left, PInt right, @SuppressWarnings("unused") PNone none) {
                     Object result = op(PInt.longToBigInteger(left), right.getValue());
                     if (result instanceof BigInteger) {
        -                return factory.createInt((BigInteger) result);
        +                return PFactory.createInt(PythonLanguage.get(this), (BigInteger) result);
                     } else {
                         return result;
                     }
        @@ -1253,8 +1291,8 @@ long doPLNarrow(PInt left, long right, @SuppressWarnings("unused") PNone none) t
                 @Specialization(guards = "right >= 0", replaces = "doPLNarrow")
                 @InliningCutoff
                 PInt doPLPos(PInt left, long right, @SuppressWarnings("unused") PNone none,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createInt(op(left.getValue(), right));
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, op(left.getValue(), right));
                 }
         
                 @Specialization(guards = "right < 0")
        @@ -1262,20 +1300,20 @@ PInt doPLPos(PInt left, long right, @SuppressWarnings("unused") PNone none,
                 double doPLNeg(PInt left, long right, @SuppressWarnings("unused") PNone none,
                                 @Bind("this") Node inliningTarget,
                                 @Shared("leftIsZero") @Cached InlinedConditionProfile leftIsZero,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            if (leftIsZero.profile(inliningTarget, left.isZero())) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ZeroDivisionError, ErrorMessages.POW_ZERO_CANNOT_RAISE_TO_NEGATIVE_POWER);
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            double leftDouble = PInt.doubleValueWithOverflow(this, left.getValue());
        +            if (leftIsZero.profile(inliningTarget, leftDouble == 0.0)) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ZeroDivisionError, ErrorMessages.POW_ZERO_CANNOT_RAISE_TO_NEGATIVE_POWER);
                     }
        -            return TrueDivNode.op(this, BigInteger.ONE, op(left.getValue(), -right));
        +            return Math.pow(leftDouble, right);
                 }
         
                 @Specialization
                 @InliningCutoff
        -        Object doPP(PInt left, PInt right, @SuppressWarnings("unused") PNone none,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +        Object doPP(PInt left, PInt right, @SuppressWarnings("unused") PNone none) {
                     Object result = op(left.getValue(), right.getValue());
                     if (result instanceof BigInteger) {
        -                return factory.createInt((BigInteger) result);
        +                return PFactory.createInt(PythonLanguage.get(this), (BigInteger) result);
                     } else {
                         return result;
                     }
        @@ -1298,9 +1336,9 @@ static long doLLPosLPos(long left, long right, long mod) {
                 static long doLLPosLGeneric(long left, long right, long mod,
                                 @Bind("this") Node inliningTarget,
                                 @Exclusive @Cached InlinedConditionProfile modNegativeProfile,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Exclusive @Cached PRaiseNode raiseNode) {
                     if (mod == 0) {
        -                throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.POW_THIRD_ARG_CANNOT_BE_ZERO);
        +                throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.POW_THIRD_ARG_CANNOT_BE_ZERO);
                     }
                     try {
                         if (modNegativeProfile.profile(inliningTarget, mod < 0)) {
        @@ -1317,8 +1355,7 @@ static long doLLPosLGeneric(long left, long right, long mod,
                 // see cpython://Objects/longobject.c#long_pow
                 @Specialization(replaces = "doPP")
                 @InliningCutoff
        -        Object powModulo(Object x, Object y, Object z,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +        Object powModulo(Object x, Object y, Object z) {
                     if (!(MathGuards.isInteger(x) && MathGuards.isInteger(y))) {
                         return PNotImplemented.NOT_IMPLEMENTED;
                     }
        @@ -1331,7 +1368,7 @@ Object powModulo(Object x, Object y, Object z,
                         return PNotImplemented.NOT_IMPLEMENTED;
                     }
                     if (result instanceof BigInteger) {
        -                return factory.createInt((BigInteger) result);
        +                return PFactory.createInt(PythonLanguage.get(this), (BigInteger) result);
                     } else {
                         return result;
                     }
        @@ -1350,7 +1387,7 @@ private Object objectOp(Object left, Object right, Object mod) {
                     BigInteger bigRight = integerToBigInteger(right);
                     BigInteger bigMod = integerToBigInteger(mod);
                     if (bigMod.signum() == 0) {
        -                throw PRaiseNode.raiseUncached(this, ValueError, ErrorMessages.POW_THIRD_ARG_CANNOT_BE_ZERO);
        +                throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.POW_THIRD_ARG_CANNOT_BE_ZERO);
                     } else {
                         BigInteger bigModPos;
                         if (bigMod.signum() < 0) {
        @@ -1368,7 +1405,7 @@ private Object objectOp(Object left, Object right, Object mod) {
                         } catch (ArithmeticException e) {
                             // a positive mod was used, so this exception must mean the exponent was
                             // negative and the base is not relatively prime to the exponent
        -                    throw PRaiseNode.raiseUncached(this, ValueError, ErrorMessages.POW_BASE_NOT_INVERTIBLE);
        +                    throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.POW_BASE_NOT_INVERTIBLE);
                         }
                     }
                 }
        @@ -1419,14 +1456,13 @@ private Object op(BigInteger left, BigInteger right) {
                             // we'll raise unless left is one of the shortcut values
                             return op(left, Long.MAX_VALUE);
                         }
        -            } else if (left.signum() == 0) {
        -                throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.ZeroDivisionError, ErrorMessages.POW_ZERO_CANNOT_RAISE_TO_NEGATIVE_POWER);
                     } else {
        -                try {
        -                    return Math.pow(left.longValueExact(), right.longValueExact());
        -                } catch (ArithmeticException e) {
        -                    return Math.pow(left.doubleValue(), right.doubleValue());
        +                double leftDouble = PInt.doubleValueWithOverflow(this, left);
        +                double rightDouble = PInt.doubleValueWithOverflow(this, right);
        +                if (leftDouble == 0.0) {
        +                    throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.ZeroDivisionError, ErrorMessages.POW_ZERO_CANNOT_RAISE_TO_NEGATIVE_POWER);
                         }
        +                return Math.pow(leftDouble, rightDouble);
                     }
                 }
         
        @@ -1452,18 +1488,18 @@ private BigInteger op(BigInteger a, long b) {
                     }
                     if (b != (int) b) {
                         // exponent does not fit in an int, this is likely going to cause out-of-memory
        -                throw PRaiseNode.raiseUncached(this, PythonErrorType.ArithmeticError, ErrorMessages.EXPONENT_TOO_LARGE);
        +                throw PRaiseNode.raiseStatic(this, PythonErrorType.ArithmeticError, ErrorMessages.EXPONENT_TOO_LARGE);
                     }
                     return a.pow((int) b);
                 }
         
                 @NeverDefault
                 public static PowNode create() {
        -            return IntBuiltinsFactory.PowNodeFactory.create();
        +            return PowNodeFactory.create();
                 }
             }
         
        -    @Builtin(name = J___ABS__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.nb_absolute, isComplex = true)
             @GenerateNodeFactory
             abstract static class AbsNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -1473,16 +1509,14 @@ static Object absInt(int arg) {
         
                 @Specialization
                 static Object absLong(long arg,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory.Lazy factory) {
        -            return PInt.abs(inliningTarget, arg, factory);
        +                        @Bind("this") Node inliningTarget) {
        +            return PInt.abs(inliningTarget, arg);
                 }
         
                 @Specialization
                 static PInt absPInt(PInt arg,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory.Lazy factory) {
        -            return factory.get(inliningTarget).createInt(arg.abs());
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, arg.abs());
                 }
         
                 @Specialization
        @@ -1493,7 +1527,7 @@ static int absBoolean(boolean arg) {
         
             @Builtin(name = J___CEIL__, minNumOfPositionalArgs = 1)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        +    @TypeSystemReference(PythonIntegerTypes.class)
             abstract static class CeilNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static int ceil(int arg) {
        @@ -1513,7 +1547,7 @@ static PInt ceil(PInt arg) {
         
             @Builtin(name = J___FLOOR__, minNumOfPositionalArgs = 1)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        +    @TypeSystemReference(PythonIntegerTypes.class)
             abstract static class FloorNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static int floor(int arg) {
        @@ -1527,35 +1561,38 @@ static long floor(long arg) {
         
                 @Specialization
                 static PInt floor(PInt arg,
        -                        @Cached PythonObjectFactory factory) {
        -            return factory.createInt(arg.getValue());
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, arg.getValue());
                 }
             }
         
        -    @Builtin(name = J___POS__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.nb_positive, isComplex = true)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
             abstract static class PosNode extends PythonUnaryBuiltinNode {
                 @Specialization
        -        static int pos(int arg) {
        +        static Integer pos(Integer arg) {
                     return arg;
                 }
         
                 @Specialization
        -        static long pos(long arg) {
        +        static Long pos(Long arg) {
                     return arg;
                 }
         
                 @Specialization
                 static PInt pos(PInt arg,
        -                        @Cached PythonObjectFactory factory) {
        -            return factory.createInt(arg.getValue());
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, arg.getValue());
        +        }
        +
        +        @Specialization
        +        static int pos(boolean arg) {
        +            return PInt.intValue(arg);
                 }
             }
         
        -    @Builtin(name = J___NEG__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.nb_negative, isComplex = true)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
             public abstract static class NegNode extends PythonUnaryBuiltinNode {
                 public abstract Object execute(int value);
         
        @@ -1576,15 +1613,20 @@ static long neg(long arg) {
         
                 @Specialization
                 static PInt negOvf(long arg,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     BigInteger value = arg == Long.MIN_VALUE ? negate(PInt.longToBigInteger(arg)) : PInt.longToBigInteger(-arg);
        -            return factory.createInt(value);
        +            return PFactory.createInt(language, value);
                 }
         
                 @Specialization
                 static PInt doPInt(PInt operand,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createInt(negate(operand.getValue()));
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, negate(operand.getValue()));
        +        }
        +
        +        @Specialization
        +        static int doBoolean(boolean arg) {
        +            return -PInt.intValue(arg);
                 }
         
                 @TruffleBoundary
        @@ -1594,13 +1636,12 @@ static BigInteger negate(BigInteger value) {
         
                 @NeverDefault
                 public static NegNode create() {
        -            return IntBuiltinsFactory.NegNodeFactory.create();
        +            return NegNodeFactory.create();
                 }
             }
         
        -    @Builtin(name = J___INVERT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.nb_invert, isComplex = true)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
             abstract static class InvertNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static int neg(boolean arg) {
        @@ -1619,8 +1660,8 @@ static long neg(long arg) {
         
                 @Specialization
                 static PInt doPInt(PInt operand,
        -                        @Cached PythonObjectFactory factory) {
        -            return factory.createInt(not(operand.getValue()));
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, not(operand.getValue()));
                 }
         
                 @TruffleBoundary
        @@ -1629,16 +1670,15 @@ static BigInteger not(BigInteger value) {
                 }
             }
         
        -    @Builtin(name = J___LSHIFT__, minNumOfPositionalArgs = 2)
        -    @Builtin(name = J___RLSHIFT__, minNumOfPositionalArgs = 2, reverseOperation = true)
        +    @Slot(value = SlotKind.nb_lshift, isComplex = true)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        -    public abstract static class LShiftNode extends PythonBinaryBuiltinNode {
        +    @TypeSystemReference(PythonIntegerTypes.class)
        +    public abstract static class LShiftNode extends BinaryOpBuiltinNode {
                 public abstract int executeInt(int left, int right) throws UnexpectedResultException;
         
                 public abstract Object execute(int left, int right);
         
        -        private static long leftShiftExact(Node inliningTarget, long left, long right, PRaiseNode.Lazy raiseNode) throws OverflowException {
        +        private static long leftShiftExact(Node inliningTarget, long left, long right, PRaiseNode raiseNode) throws OverflowException {
                     if (right >= Long.SIZE || right < 0) {
                         shiftError(inliningTarget, right, raiseNode);
                     }
        @@ -1652,7 +1692,7 @@ private static long leftShiftExact(Node inliningTarget, long left, long right, P
                     return result;
                 }
         
        -        private static int leftShiftExact(Node inliningTarget, int left, int right, PRaiseNode.Lazy raiseNode) throws OverflowException {
        +        private static int leftShiftExact(Node inliningTarget, int left, int right, PRaiseNode raiseNode) throws OverflowException {
                     if (right >= Integer.SIZE || right < 0) {
                         shiftError(inliningTarget, right, raiseNode);
                     }
        @@ -1666,18 +1706,18 @@ private static int leftShiftExact(Node inliningTarget, int left, int right, PRai
                     return result;
                 }
         
        -        private static void shiftError(Node inliningTarget, long shiftCount, PRaiseNode.Lazy raiseNode) throws OverflowException {
        +        private static void shiftError(Node inliningTarget, long shiftCount, PRaiseNode raiseNode) throws OverflowException {
                     if (shiftCount >= Integer.SIZE) {
                         throw OverflowException.INSTANCE;
                     } else if (shiftCount < 0) {
        -                throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.NEGATIVE_SHIFT_COUNT);
        +                throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NEGATIVE_SHIFT_COUNT);
                     }
                 }
         
                 @Specialization(rewriteOn = OverflowException.class)
                 static int doII(int left, int right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) throws OverflowException {
        +                        @Shared @Cached PRaiseNode raiseNode) throws OverflowException {
                     raiseNegativeShiftCount(inliningTarget, right < 0, raiseNode);
                     return leftShiftExact(inliningTarget, left, right, raiseNode);
                 }
        @@ -1685,20 +1725,19 @@ static int doII(int left, int right,
                 @Specialization
                 static Object doIIOvf(int left, int right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     raiseNegativeShiftCount(inliningTarget, right < 0, raiseNode);
                     try {
                         return leftShiftExact(inliningTarget, left, right, raiseNode);
                     } catch (OverflowException e) {
        -                return doGuardedBiI(inliningTarget, PInt.longToBigInteger(left), right, factory, raiseNode);
        +                return doGuardedBiI(inliningTarget, PInt.longToBigInteger(left), right, raiseNode);
                     }
                 }
         
                 @Specialization(rewriteOn = OverflowException.class)
                 static long doLL(long left, long right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) throws OverflowException {
        +                        @Shared @Cached PRaiseNode raiseNode) throws OverflowException {
                     raiseNegativeShiftCount(inliningTarget, right < 0, raiseNode);
                     return leftShiftExact(inliningTarget, left, right, raiseNode);
                 }
        @@ -1706,24 +1745,21 @@ static long doLL(long left, long right,
                 @Specialization
                 static Object doILOvf(int left, long right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            return doLLOvf(left, right, inliningTarget, factory, raiseNode);
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            return doLLOvf(left, right, inliningTarget, raiseNode);
                 }
         
                 @Specialization
                 static Object doLIOvf(long left, int right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            return doLLOvf(left, right, inliningTarget, factory, raiseNode);
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            return doLLOvf(left, right, inliningTarget, raiseNode);
                 }
         
                 @Specialization
                 static Object doLLOvf(long left, long right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     raiseNegativeShiftCount(inliningTarget, right < 0, raiseNode);
                     try {
                         return leftShiftExact(inliningTarget, left, right, raiseNode);
        @@ -1731,12 +1767,12 @@ static Object doLLOvf(long left, long right,
                         int rightI = (int) right;
                         if (rightI == right) {
                             try {
        -                        return factory.createInt(op(PInt.longToBigInteger(left), rightI));
        +                        return PFactory.createInt(PythonLanguage.get(inliningTarget), op(PInt.longToBigInteger(left), rightI));
                             } catch (OverflowException ex) {
                                 // fallback to the raise of overflow error
                             }
                         }
        -                throw raiseNode.get(inliningTarget).raise(PythonErrorType.OverflowError);
        +                throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError);
                     }
                 }
         
        @@ -1748,17 +1784,17 @@ static int doIPiZero(@SuppressWarnings("unused") int left, @SuppressWarnings("un
                 @Specialization(replaces = "doIPiZero")
                 static PInt doIPi(int left, PInt right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Bind PythonLanguage language,
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     raiseNegativeShiftCount(inliningTarget, !right.isZeroOrPositive(), raiseNode);
                     if (left == 0) {
        -                return factory.createInt(BigInteger.ZERO);
        +                return PFactory.createInt(language, BigInteger.ZERO);
                     }
                     try {
                         int iright = right.intValueExact();
        -                return factory.createInt(op(PInt.longToBigInteger(left), iright));
        +                return PFactory.createInt(language, op(PInt.longToBigInteger(left), iright));
                     } catch (OverflowException e) {
        -                throw raiseNode.get(inliningTarget).raise(PythonErrorType.OverflowError);
        +                throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError);
                     }
                 }
         
        @@ -1772,47 +1808,45 @@ static int doLPiZero(@SuppressWarnings("unused") long left, @SuppressWarnings("u
                 @Specialization(replaces = "doLPiZero")
                 static PInt doLPi(long left, PInt right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     raiseNegativeShiftCount(inliningTarget, !right.isZeroOrPositive(), raiseNode);
        +            PythonLanguage language = PythonLanguage.get(inliningTarget);
                     if (left == 0) {
        -                return factory.createInt(BigInteger.ZERO);
        +                return PFactory.createInt(language, BigInteger.ZERO);
                     }
                     try {
                         int iright = right.intValueExact();
        -                return factory.createInt(op(PInt.longToBigInteger(left), iright));
        +                return PFactory.createInt(language, op(PInt.longToBigInteger(left), iright));
                     } catch (OverflowException e) {
        -                throw raiseNode.get(inliningTarget).raise(PythonErrorType.OverflowError);
        +                throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError);
                     }
                 }
         
                 @Specialization
                 static PInt doPiI(PInt left, int right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     raiseNegativeShiftCount(inliningTarget, right < 0, raiseNode);
        -            return doGuardedBiI(inliningTarget, left.getValue(), right, factory, raiseNode);
        +            return doGuardedBiI(inliningTarget, left.getValue(), right, raiseNode);
                 }
         
        -        static PInt doGuardedBiI(Node inliningTarget, BigInteger left, int right, PythonObjectFactory factory, PRaiseNode.Lazy raiseNode) {
        +        static PInt doGuardedBiI(Node inliningTarget, BigInteger left, int right, PRaiseNode raiseNode) {
                     try {
        -                return factory.createInt(op(left, right));
        +                return PFactory.createInt(PythonLanguage.get(inliningTarget), op(left, right));
                     } catch (OverflowException e) {
        -                throw raiseNode.get(inliningTarget).raise(PythonErrorType.OverflowError);
        +                throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError);
                     }
                 }
         
                 @Specialization
                 static PInt doPiL(PInt left, long right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     int rightI = (int) right;
                     if (rightI == right) {
        -                return doPiI(left, rightI, inliningTarget, factory, raiseNode);
        +                return doPiI(left, rightI, inliningTarget, raiseNode);
                     } else {
        -                throw raiseNode.get(inliningTarget).raise(PythonErrorType.OverflowError);
        +                throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError);
                     }
                 }
         
        @@ -1824,16 +1858,16 @@ static int doPiPiZero(@SuppressWarnings("unused") PInt left, @SuppressWarnings("
                 @Specialization(replaces = "doPiPiZero")
                 static PInt doPiPi(PInt left, PInt right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     raiseNegativeShiftCount(inliningTarget, !right.isZeroOrPositive(), raiseNode);
        +            PythonLanguage language = PythonLanguage.get(inliningTarget);
                     if (left.isZero()) {
        -                return factory.createInt(BigInteger.ZERO);
        +                return PFactory.createInt(language, BigInteger.ZERO);
                     }
                     try {
        -                return factory.createInt(op(left.getValue(), right.intValueExact()));
        +                return PFactory.createInt(language, op(left.getValue(), right.intValueExact()));
                     } catch (OverflowException e) {
        -                throw raiseNode.get(inliningTarget).raise(PythonErrorType.OverflowError);
        +                throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError);
                     }
                 }
         
        @@ -1852,23 +1886,22 @@ static BigInteger op(BigInteger left, int right) throws OverflowException {
                     }
                 }
         
        -        private static void raiseNegativeShiftCount(Node inliningTarget, boolean cond, PRaiseNode.Lazy raiseNode) {
        +        private static void raiseNegativeShiftCount(Node inliningTarget, boolean cond, PRaiseNode raiseNode) {
                     if (cond) {
        -                throw raiseNode.get(inliningTarget).raise(PythonErrorType.ValueError, ErrorMessages.NEGATIVE_SHIFT_COUNT);
        +                throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ErrorMessages.NEGATIVE_SHIFT_COUNT);
                     }
                 }
         
                 @NeverDefault
                 public static LShiftNode create() {
        -            return IntBuiltinsFactory.LShiftNodeFactory.create();
        +            return LShiftNodeFactory.create();
                 }
             }
         
        -    @Builtin(name = J___RSHIFT__, minNumOfPositionalArgs = 2)
        -    @Builtin(name = J___RRSHIFT__, minNumOfPositionalArgs = 2, reverseOperation = true)
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        +    @Slot(value = SlotKind.nb_rshift, isComplex = true)
        +    @TypeSystemReference(PythonIntegerTypes.class)
             @GenerateNodeFactory
        -    public abstract static class RShiftNode extends PythonBinaryBuiltinNode {
        +    public abstract static class RShiftNode extends BinaryOpBuiltinNode {
                 public abstract int executeInt(int left, int right) throws UnexpectedResultException;
         
                 public abstract Object execute(int left, int right);
        @@ -1876,7 +1909,7 @@ public abstract static class RShiftNode extends PythonBinaryBuiltinNode {
                 @Specialization(guards = "right < 32")
                 static int doIISmall(int left, int right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     raiseNegativeShiftCount(inliningTarget, right < 0, raiseNode);
                     return left >> right;
                 }
        @@ -1884,7 +1917,7 @@ static int doIISmall(int left, int right,
                 @Specialization(replaces = "doIISmall")
                 static int doII(int left, int right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     raiseNegativeShiftCount(inliningTarget, right < 0, raiseNode);
                     // Note: according to JLS, if 'left' is an int, then only the 5 LSBs of 'right' are
                     // considered. However, Python would consider more bits, so do the max possible shift.
        @@ -1894,7 +1927,7 @@ static int doII(int left, int right,
                 @Specialization(guards = "right < 64")
                 static long doLLSmall(long left, long right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     raiseNegativeShiftCount(inliningTarget, right < 0, raiseNode);
                     return left >> right;
                 }
        @@ -1902,7 +1935,7 @@ static long doLLSmall(long left, long right,
                 @Specialization(replaces = "doLLSmall")
                 static long doLL(long left, long right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     raiseNegativeShiftCount(inliningTarget, right < 0, raiseNode);
                     // for explanation, see 'doII'
                     return left >> (right >= 64 ? 63 : right);
        @@ -1911,37 +1944,35 @@ static long doLL(long left, long right,
                 @Specialization
                 static Object doIPi(int left, PInt right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            return doHugeShift(inliningTarget, PInt.longToBigInteger(left), right, factory, raiseNode);
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            return doHugeShift(inliningTarget, PInt.longToBigInteger(left), right, raiseNode);
                 }
         
                 @Specialization
                 static Object doLPi(long left, PInt right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            return doHugeShift(inliningTarget, PInt.longToBigInteger(left), right, factory, raiseNode);
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            return doHugeShift(inliningTarget, PInt.longToBigInteger(left), right, raiseNode);
                 }
         
                 @Specialization
                 static PInt doPiI(PInt left, int right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Bind PythonLanguage language,
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     raiseNegativeShiftCount(inliningTarget, right < 0, raiseNode);
        -            return factory.createInt(op(left.getValue(), right));
        +            return PFactory.createInt(language, op(left.getValue(), right));
                 }
         
                 @Specialization
                 static Object doPiL(PInt left, long right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Bind PythonLanguage language,
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     raiseNegativeShiftCount(inliningTarget, right < 0, raiseNode);
                     int rightI = (int) right;
                     if (rightI == right) {
        -                return factory.createInt(op(left.getValue(), rightI));
        +                return PFactory.createInt(language, op(left.getValue(), rightI));
                     }
                     // right is >= 2**31, BigInteger's bitLength is at most 2**31-1
                     // therefore the result of shifting right is just the sign bit
        @@ -1951,14 +1982,13 @@ static Object doPiL(PInt left, long right,
                 @Specialization
                 static Object doPInt(PInt left, PInt right,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            return doHugeShift(inliningTarget, left.getValue(), right, factory, raiseNode);
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            return doHugeShift(inliningTarget, left.getValue(), right, raiseNode);
                 }
         
        -        private static void raiseNegativeShiftCount(Node inliningTarget, boolean cond, PRaiseNode.Lazy raiseNode) {
        +        private static void raiseNegativeShiftCount(Node inliningTarget, boolean cond, PRaiseNode raiseNode) {
                     if (cond) {
        -                throw raiseNode.get(inliningTarget).raise(PythonErrorType.ValueError, ErrorMessages.NEGATIVE_SHIFT_COUNT);
        +                throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ErrorMessages.NEGATIVE_SHIFT_COUNT);
                     }
                 }
         
        @@ -1968,10 +1998,10 @@ static PNotImplemented doGeneric(Object a, Object b) {
                     return PNotImplemented.NOT_IMPLEMENTED;
                 }
         
        -        private static Object doHugeShift(Node inliningTarget, BigInteger left, PInt right, PythonObjectFactory factory, PRaiseNode.Lazy raiseNode) {
        +        private static Object doHugeShift(Node inliningTarget, BigInteger left, PInt right, PRaiseNode raiseNode) {
                     raiseNegativeShiftCount(inliningTarget, !right.isZeroOrPositive(), raiseNode);
                     try {
        -                return factory.createInt(op(left, right.intValueExact()));
        +                return PFactory.createInt(PythonLanguage.get(inliningTarget), op(left, right.intValueExact()));
                     } catch (OverflowException e) {
                         // right is >= 2**31, BigInteger's bitLength is at most 2**31-1
                         // therefore the result of shifting right is just the sign bit
        @@ -1986,11 +2016,12 @@ private static BigInteger op(BigInteger left, int right) {
         
                 @NeverDefault
                 public static RShiftNode create() {
        -            return IntBuiltinsFactory.RShiftNodeFactory.create();
        +            return RShiftNodeFactory.create();
                 }
             }
         
        -    abstract static class BinaryBitwiseNode extends PythonBinaryBuiltinNode {
        +    @GenerateCached(false)
        +    abstract static class BinaryBitwiseNode extends BinaryOpBuiltinNode {
         
                 @SuppressWarnings("unused")
                 protected int op(int left, int right) {
        @@ -2066,20 +2097,20 @@ long voidPtrsManaged(VirtualFrame frame, PythonNativeVoidPtr a, PythonNativeVoid
         
                 @Specialization
                 PInt doPInt(long left, PInt right,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createInt(op(PInt.longToBigInteger(left), right.getValue()));
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, op(PInt.longToBigInteger(left), right.getValue()));
                 }
         
                 @Specialization
                 PInt doPInt(PInt left, long right,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createInt(op(left.getValue(), PInt.longToBigInteger(right)));
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, op(left.getValue(), PInt.longToBigInteger(right)));
                 }
         
                 @Specialization
                 PInt doPInt(PInt left, PInt right,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createInt(op(left.getValue(), right.getValue()));
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, op(left.getValue(), right.getValue()));
                 }
         
                 @SuppressWarnings("unused")
        @@ -2089,9 +2120,8 @@ static PNotImplemented doGeneric(Object a, Object b) {
                 }
             }
         
        -    @Builtin(name = J___RAND__, minNumOfPositionalArgs = 2)
        -    @Builtin(name = J___AND__, minNumOfPositionalArgs = 2)
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        +    @Slot(value = SlotKind.nb_and, isComplex = true)
        +    @TypeSystemReference(PythonIntegerTypes.class)
             @GenerateNodeFactory
             public abstract static class AndNode extends BinaryBitwiseNode {
         
        @@ -2113,13 +2143,12 @@ protected final BigInteger op(BigInteger left, BigInteger right) {
         
                 @NeverDefault
                 public static AndNode create() {
        -            return IntBuiltinsFactory.AndNodeFactory.create();
        +            return AndNodeFactory.create();
                 }
             }
         
        -    @Builtin(name = J___ROR__, minNumOfPositionalArgs = 2)
        -    @Builtin(name = J___OR__, minNumOfPositionalArgs = 2)
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        +    @Slot(value = SlotKind.nb_or, isComplex = true)
        +    @TypeSystemReference(PythonIntegerTypes.class)
             @GenerateNodeFactory
             public abstract static class OrNode extends BinaryBitwiseNode {
         
        @@ -2141,13 +2170,12 @@ public final BigInteger op(BigInteger left, BigInteger right) {
         
                 @NeverDefault
                 public static OrNode create() {
        -            return IntBuiltinsFactory.OrNodeFactory.create();
        +            return OrNodeFactory.create();
                 }
             }
         
        -    @Builtin(name = J___RXOR__, minNumOfPositionalArgs = 2)
        -    @Builtin(name = J___XOR__, minNumOfPositionalArgs = 2)
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        +    @Slot(value = SlotKind.nb_xor, isComplex = true)
        +    @TypeSystemReference(PythonIntegerTypes.class)
             @GenerateNodeFactory
             public abstract static class XorNode extends BinaryBitwiseNode {
                 @Override
        @@ -2168,472 +2196,213 @@ public BigInteger op(BigInteger left, BigInteger right) {
         
                 @NeverDefault
                 public static XorNode create() {
        -            return IntBuiltinsFactory.XorNodeFactory.create();
        +            return XorNodeFactory.create();
                 }
             }
         
        -    @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2)
        -    @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        -    public abstract static class EqNode extends PythonBinaryBuiltinNode {
        -        @Specialization
        -        static boolean eqLL(long a, long b) {
        -            return a == b;
        -        }
        -
        -        @Specialization
        -        static boolean eqPIntBoolean(PInt a, boolean b) {
        -            return b ? a.isOne() : a.isZero();
        -        }
        -
        -        @Specialization
        -        static boolean eqBooleanPInt(boolean a, PInt b) {
        -            return a ? b.isOne() : b.isZero();
        -        }
        -
        -        @Specialization(rewriteOn = OverflowException.class)
        -        static boolean eqPiL(PInt a, long b) throws OverflowException {
        -            return a.longValueExact() == b;
        -        }
        -
        -        @Specialization
        -        static boolean eqPiLOvf(PInt a, long b) {
        -            try {
        -                return a.longValueExact() == b;
        -            } catch (OverflowException e) {
        -                return false;
        -            }
        -        }
        -
        -        @Specialization(rewriteOn = OverflowException.class)
        -        static boolean eqLPi(long b, PInt a) throws OverflowException {
        -            return a.longValueExact() == b;
        -        }
        -
        -        @Specialization
        -        static boolean eqPiLOvf(long b, PInt a) {
        -            try {
        -                return a.longValueExact() == b;
        -            } catch (OverflowException e) {
        -                return false;
        -            }
        -        }
        -
        -        @Specialization
        -        static boolean eqPiPi(PInt a, PInt b) {
        -            return a.compareTo(b) == 0;
        -        }
        -
        -        // left: PythonNativeVoidPtr
        -
        -        @Specialization
        -        static boolean eqLongVoidPtr(VirtualFrame frame, long a, PythonNativeVoidPtr b,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared("h") @Cached PyObjectHashNode hashNode) {
        -            return eqVoidPtrLong(frame, b, a, inliningTarget, hashNode);
        -        }
        -
        -        @Specialization
        -        static boolean eqPIntVoidPtr(PInt a, PythonNativeVoidPtr b) {
        -            return eqVoidPtrPInt(b, a);
        -        }
        -
        -        @Specialization
        -        static boolean eqVoidPtrLong(VirtualFrame frame, PythonNativeVoidPtr a, long b,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared("h") @Cached PyObjectHashNode hashNode) {
        -            if (a.isNativePointer()) {
        -                long ptrVal = a.getNativePointer();
        -                // pointers are considered unsigned
        -                return ptrVal == b;
        -            }
        -            return hashNode.execute(frame, inliningTarget, a) == b;
        -        }
        -
        -        @Specialization(guards = {"a.isNativePointer()", "b.isNativePointer()"})
        -        static boolean voidPtrsNative(PythonNativeVoidPtr a, PythonNativeVoidPtr b) {
        -            long ptrVal = a.getNativePointer();
        -            // pointers are considered unsigned
        -            return ptrVal == b.getNativePointer();
        -        }
        -
        -        @Specialization(guards = {"a.isNativePointer()", "!b.isNativePointer()"})
        -        static boolean voidPtrsANative(VirtualFrame frame, PythonNativeVoidPtr a, PythonNativeVoidPtr b,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared("h") @Cached PyObjectHashNode hashNode) {
        -            long ptrVal = a.getNativePointer();
        -            // pointers are considered unsigned
        -            return ptrVal == hashNode.execute(frame, inliningTarget, b);
        -        }
        -
        -        @Specialization(guards = {"!a.isNativePointer()", "b.isNativePointer()"})
        -        static boolean voidPtrsBNative(VirtualFrame frame, PythonNativeVoidPtr a, PythonNativeVoidPtr b,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared("h") @Cached PyObjectHashNode hashNode) {
        -            long ptrVal = b.getNativePointer();
        -            // pointers are considered unsigned
        -            return ptrVal == hashNode.execute(frame, inliningTarget, a);
        -        }
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @TypeSystemReference(PythonIntegerTypes.class)
        +    @ImportStatic(FromNativeSubclassNode.class)
        +    abstract static class RichCompareHelperNode extends Node {
         
        -        @Specialization(guards = {"!a.isNativePointer()", "!b.isNativePointer()"})
        -        static boolean voidPtrsManaged(VirtualFrame frame, PythonNativeVoidPtr a, PythonNativeVoidPtr b,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared("h") @Cached PyObjectHashNode hashNode) {
        -            return hashNode.execute(frame, inliningTarget, a) == hashNode.execute(frame, inliningTarget, b);
        -        }
        +        abstract Object execute(VirtualFrame frame, Node inliningTarget, Object left, Object right, RichCmpOp op);
         
                 @Specialization
        -        @TruffleBoundary
        -        static boolean eqVoidPtrPInt(PythonNativeVoidPtr a, PInt b) {
        -            if (a.isNativePointer()) {
        -                long ptrVal = a.getNativePointer();
        -                if (ptrVal < 0) {
        -                    // pointers are considered unsigned
        -                    BigInteger bi = PInt.longToBigInteger(ptrVal).add(BigInteger.ONE.shiftLeft(64));
        -                    return bi.equals(b.getValue());
        -                }
        -                return PInt.longToBigInteger(ptrVal).equals(b.getValue());
        -            }
        -            try {
        -                return PyObjectHashNode.executeUncached(a) == b.longValueExact();
        -            } catch (OverflowException e) {
        -                return false;
        -            }
        +        static boolean doII(int left, int right, RichCmpOp op) {
        +            return op.compareResultToBool(Integer.compare(left, right));
                 }
         
        -        @Fallback
        -        @SuppressWarnings("unused")
        -        static PNotImplemented eq(Object a, Object b) {
        -            return PNotImplemented.NOT_IMPLEMENTED;
        -        }
        -    }
        -
        -    @Builtin(name = J___NE__, minNumOfPositionalArgs = 2)
        -    @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        -    abstract static class NeNode extends PythonBinaryBuiltinNode {
                 @Specialization
        -        static boolean eqLL(long a, long b) {
        -            return a != b;
        +        static boolean doLL(long left, long right, RichCmpOp op) {
        +            return op.compareResultToBool(Long.compare(left, right));
                 }
         
                 @Specialization(rewriteOn = OverflowException.class)
        -        static boolean eqPiL(PInt a, long b) throws OverflowException {
        -            return a.longValueExact() != b;
        -        }
        -
        -        @Specialization(replaces = "eqPiL")
        -        static boolean eqPiLOvf(PInt a, long b) {
        -            try {
        -                return a.longValueExact() != b;
        -            } catch (OverflowException e) {
        -                return true;
        -            }
        +        static boolean doLPExact(long left, PInt right, RichCmpOp op) throws OverflowException {
        +            return op.compareResultToBool(Long.compare(left, right.longValueExact()));
                 }
         
                 @Specialization(rewriteOn = OverflowException.class)
        -        static boolean eqLPi(long b, PInt a) throws OverflowException {
        -            return a.longValueExact() != b;
        +        static boolean doPLExact(PInt left, long right, RichCmpOp op) throws OverflowException {
        +            return op.compareResultToBool(Long.compare(left.longValueExact(), right));
                 }
         
        -        @Specialization(replaces = "eqLPi")
        -        static boolean eqLPiOvf(long b, PInt a) {
        -            try {
        -                return a.longValueExact() != b;
        -            } catch (OverflowException e) {
        -                return true;
        -            }
        -        }
        -
        -        @Specialization
        -        static boolean eqPiPi(PInt a, PInt b) {
        -            return a.compareTo(b) != 0;
        -        }
        -
        -        @SuppressWarnings("unused")
        -        @Fallback
        -        static PNotImplemented eq(Object a, Object b) {
        -            return PNotImplemented.NOT_IMPLEMENTED;
        -        }
        -    }
        -
        -    @Builtin(name = J___LT__, minNumOfPositionalArgs = 2)
        -    @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        -    @ImportStatic(FromNativeSubclassNode.class)
        -    public abstract static class LtNode extends PythonBinaryBuiltinNode {
        -        @Specialization
        -        static boolean doII(int left, int right) {
        -            return left < right;
        +        @Specialization(replaces = "doLPExact")
        +        static boolean doLP(long left, PInt right, RichCmpOp op) {
        +            return op.compareResultToBool(PInt.compareTo(left, right));
                 }
         
        -        @Specialization
        -        static boolean doLL(long left, long right) {
        -            return left < right;
        +        @Specialization(replaces = "doPLExact")
        +        static boolean doPL(PInt left, long right, RichCmpOp op) {
        +            return op.compareResultToBool(left.compareTo(right));
                 }
         
                 @Specialization
        -        static boolean doLP(long left, PInt right) {
        -            try {
        -                return left < right.longValueExact();
        -            } catch (OverflowException e) {
        -                return right.doubleValue() > 0;
        -            }
        +        static boolean doPP(PInt left, PInt right, RichCmpOp op) {
        +            return op.compareResultToBool(left.compareTo(right));
                 }
         
        -        @Specialization
        -        static boolean doPL(PInt left, long right) {
        -            try {
        -                return left.longValueExact() < right;
        -            } catch (OverflowException e) {
        -                return left.doubleValue() < 0;
        -            }
        -        }
        -
        -        @Specialization
        -        static boolean doPP(PInt left, PInt right) {
        -            return left.compareTo(right) < 0;
        -        }
        -
        -        @Specialization(guards = "isFloatSubtype(frame, inliningTarget, y, getClass, isSubtype)")
        -        static boolean doDN(VirtualFrame frame, long x, PythonAbstractNativeObject y,
        -                        @SuppressWarnings("unused") @Bind("this") Node inliningTarget,
        +        @Specialization(guards = "isFloatSubtype(inliningTarget, y, getClass, isSubtype)")
        +        @InliningCutoff
        +        static boolean doDN(VirtualFrame frame, Node inliningTarget, long x, PythonAbstractNativeObject y, RichCmpOp op,
                                 @SuppressWarnings("unused") @Shared @Cached GetPythonObjectClassNode getClass,
                                 @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtype,
                                 @Shared @Cached FromNativeSubclassNode nativeRight) {
        -            return x < nativeRight.execute(frame, y);
        +            return op.compareResultToBool(PFloat.compare(x, nativeRight.execute(frame, y)));
                 }
         
                 @Specialization(guards = {
        -                        "isFloatSubtype(frame, inliningTarget, x, getClass, isSubtype)",
        -                        "isFloatSubtype(frame, inliningTarget, y, getClass, isSubtype)"})
        -        static boolean doDN(VirtualFrame frame, PythonAbstractNativeObject x, PythonAbstractNativeObject y,
        -                        @SuppressWarnings("unused") @Bind("this") Node inliningTarget,
        +                        "isFloatSubtype(inliningTarget, x, getClass, isSubtype)",
        +                        "isFloatSubtype(inliningTarget, y, getClass, isSubtype)"})
        +        @InliningCutoff
        +        static boolean doDN(VirtualFrame frame, Node inliningTarget, PythonAbstractNativeObject x, PythonAbstractNativeObject y, RichCmpOp op,
                                 @SuppressWarnings("unused") @Shared @Cached GetPythonObjectClassNode getClass,
                                 @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtype,
                                 @Shared @Cached FromNativeSubclassNode nativeLeft,
                                 @Shared @Cached FromNativeSubclassNode nativeRight) {
        -            return nativeLeft.execute(frame, x) < nativeRight.execute(frame, y);
        +            return op.compareResultToBool(PFloat.compare(nativeLeft.execute(frame, x), nativeRight.execute(frame, y)));
                 }
         
        -        @Specialization(guards = "isFloatSubtype(frame, inliningTarget, x, getClass, isSubtype)")
        -        static boolean doDN(VirtualFrame frame, PythonAbstractNativeObject x, double y,
        -                        @SuppressWarnings("unused") @Bind("this") Node inliningTarget,
        +        @Specialization(guards = "isFloatSubtype(inliningTarget, x, getClass, isSubtype)")
        +        @InliningCutoff
        +        static boolean doDN(VirtualFrame frame, Node inliningTarget, PythonAbstractNativeObject x, double y, RichCmpOp op,
                                 @SuppressWarnings("unused") @Shared @Cached GetPythonObjectClassNode getClass,
                                 @SuppressWarnings("unused") @Shared @Cached IsSubtypeNode isSubtype,
                                 @Shared @Cached FromNativeSubclassNode nativeLeft) {
        -            return nativeLeft.execute(frame, x) < y;
        +            return op.compareResultToBool(PFloat.compare(nativeLeft.execute(frame, x), y));
                 }
         
        -        @Specialization
        -        static boolean doVoidPtr(PythonNativeVoidPtr x, long y,
        -                        @Bind("this") Node inliningTarget,
        -                        @Cached CExtNodes.PointerCompareNode ltNode) {
        -            return ltNode.execute(inliningTarget, ComparisonOp.LT, x, y);
        -        }
        +        // Note: native int subclasses are still represented as Java PInt, just with a different
        +        // Python level class
         
        -        @SuppressWarnings("unused")
        -        @Fallback
        -        static PNotImplemented doGeneric(Object a, Object b) {
        -            return PNotImplemented.NOT_IMPLEMENTED;
        -        }
        -    }
        -
        -    @Builtin(name = J___LE__, minNumOfPositionalArgs = 2)
        -    @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        -    abstract static class LeNode extends PythonBinaryBuiltinNode {
        -        @Specialization
        -        static boolean doII(int left, int right) {
        -            return left <= right;
        -        }
        -
        -        @Specialization
        -        static boolean doLL(long left, long right) {
        -            return left <= right;
        +        static boolean someIsNativePtr(Object a, Object b) {
        +            return a instanceof PythonNativeVoidPtr || b instanceof PythonNativeVoidPtr;
                 }
         
        -        @Specialization
        -        static boolean doLP(long left, PInt right) {
        -            try {
        -                return left <= right.longValueExact();
        -            } catch (OverflowException e) {
        -                return right.doubleValue() > 0;
        -            }
        -        }
        -
        -        @Specialization
        -        static boolean doPL(PInt left, long right) {
        -            try {
        -                return left.longValueExact() <= right;
        -            } catch (OverflowException e) {
        -                return left.doubleValue() < 0;
        +        @Specialization(guards = "someIsNativePtr(x, y)")
        +        @InliningCutoff
        +        static Object doVoidPtr(VirtualFrame frame, Node inliningTarget, Object x, Object y, RichCmpOp op,
        +                        @Cached PointerCompareNode pointerCompareNode,
        +                        @Cached EqNodeNativePtr pointerEqNode) {
        +            if (op.isEqOrNe()) {
        +                Object result = pointerEqNode.execute(frame, x, y);
        +                if (result == PNotImplemented.NOT_IMPLEMENTED) {
        +                    return result;
        +                }
        +                return ((boolean) result) == op.isEq();
                     }
        +            return pointerCompareNode.execute(inliningTarget, op, x, y);
                 }
         
        -        @Specialization
        -        static boolean doPP(PInt left, PInt right) {
        -            return left.compareTo(right) <= 0;
        -        }
        +        @TypeSystemReference(PythonIntegerTypes.class)
        +        abstract static class EqNodeNativePtr extends PNodeWithContext {
         
        -        @SuppressWarnings("unused")
        -        @Fallback
        -        static PNotImplemented doGeneric(Object a, Object b) {
        -            return PNotImplemented.NOT_IMPLEMENTED;
        -        }
        -    }
        -
        -    @Builtin(name = J___GT__, minNumOfPositionalArgs = 2)
        -    @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        -    public abstract static class GtNode extends PythonBinaryBuiltinNode {
        -
        -        @Specialization
        -        static boolean doII(int left, int right) {
        -            return left > right;
        -        }
        -
        -        @Specialization
        -        static boolean doLL(long left, long right) {
        -            return left > right;
        -        }
        +            abstract Object execute(VirtualFrame frame, Object a, Object b);
         
        -        @Specialization
        -        static boolean doLP(long left, PInt right) {
        -            try {
        -                return left > right.longValueExact();
        -            } catch (OverflowException e) {
        -                return right.doubleValue() < 0;
        +            @Specialization
        +            static boolean eqLongVoidPtr(VirtualFrame frame, long a, PythonNativeVoidPtr b,
        +                            @Bind("this") Node inliningTarget,
        +                            @Shared("h") @Cached PyObjectHashNode hashNode) {
        +                return eqVoidPtrLong(frame, b, a, inliningTarget, hashNode);
                     }
        -        }
         
        -        @Specialization
        -        static boolean doPL(PInt left, long right) {
        -            try {
        -                return left.longValueExact() > right;
        -            } catch (OverflowException e) {
        -                return left.doubleValue() > 0;
        +            @Specialization
        +            static boolean eqPIntVoidPtr(PInt a, PythonNativeVoidPtr b) {
        +                return eqVoidPtrPInt(b, a);
                     }
        -        }
        -
        -        @Specialization
        -        static boolean doPP(PInt left, PInt right) {
        -            return left.compareTo(right) > 0;
        -        }
         
        -        @SuppressWarnings("unused")
        -        @Fallback
        -        static PNotImplemented doGeneric(Object a, Object b) {
        -            return PNotImplemented.NOT_IMPLEMENTED;
        -        }
        -    }
        -
        -    @Builtin(name = J___GE__, minNumOfPositionalArgs = 2)
        -    @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        -    abstract static class GeNode extends PythonBinaryBuiltinNode {
        -
        -        @Specialization
        -        static boolean doII(int left, int right) {
        -            return left >= right;
        -        }
        -
        -        @Specialization
        -        static boolean doLL(long left, long right) {
        -            return left >= right;
        -        }
        -
        -        @Specialization
        -        static boolean doLP(long left, PInt right) {
        -            try {
        -                return left >= right.longValueExact();
        -            } catch (OverflowException e) {
        -                return right.doubleValue() < 0;
        +            @Specialization
        +            static boolean eqVoidPtrLong(VirtualFrame frame, PythonNativeVoidPtr a, long b,
        +                            @Bind("this") Node inliningTarget,
        +                            @Shared("h") @Cached PyObjectHashNode hashNode) {
        +                if (a.isNativePointer()) {
        +                    long ptrVal = a.getNativePointer();
        +                    // pointers are considered unsigned
        +                    return ptrVal == b;
        +                }
        +                return hashNode.execute(frame, inliningTarget, a) == b;
                     }
        -        }
         
        -        @Specialization
        -        static boolean doPL(PInt left, long right) {
        -            try {
        -                return left.longValueExact() >= right;
        -            } catch (OverflowException e) {
        -                return left.doubleValue() > 0;
        +            @Specialization(guards = {"a.isNativePointer()", "b.isNativePointer()"})
        +            static boolean voidPtrsNative(PythonNativeVoidPtr a, PythonNativeVoidPtr b) {
        +                long ptrVal = a.getNativePointer();
        +                // pointers are considered unsigned
        +                return ptrVal == b.getNativePointer();
                     }
        -        }
        -
        -        @Specialization
        -        static boolean doPP(PInt left, PInt right) {
        -            return left.compareTo(right) >= 0;
        -        }
        -
        -        @SuppressWarnings("unused")
        -        @Fallback
        -        static PNotImplemented doGeneric(Object a, Object b) {
        -            return PNotImplemented.NOT_IMPLEMENTED;
        -        }
        -    }
        -
        -    @GenerateInline
        -    @GenerateCached(false)
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        -    abstract static class RichCompareHelperNode extends Node {
         
        -        abstract Object execute(Node inliningTarget, Object left, Object right, ComparisonOp op);
        -
        -        @Specialization
        -        static boolean doII(int left, int right, ComparisonOp op) {
        -            return op.cmpResultToBool(Integer.compare(left, right));
        -        }
        -
        -        @Specialization
        -        static boolean doLL(long left, long right, ComparisonOp op) {
        -            return op.cmpResultToBool(Long.compare(left, right));
        -        }
        +            @Specialization(guards = {"a.isNativePointer()", "!b.isNativePointer()"})
        +            static boolean voidPtrsANative(VirtualFrame frame, PythonNativeVoidPtr a, PythonNativeVoidPtr b,
        +                            @Bind("this") Node inliningTarget,
        +                            @Shared("h") @Cached PyObjectHashNode hashNode) {
        +                long ptrVal = a.getNativePointer();
        +                // pointers are considered unsigned
        +                return ptrVal == hashNode.execute(frame, inliningTarget, b);
        +            }
         
        -        @Specialization
        -        static boolean doLP(long left, PInt right, ComparisonOp op) {
        -            return op.cmpResultToBool(PInt.compareTo(left, right));
        -        }
        +            @Specialization(guards = {"!a.isNativePointer()", "b.isNativePointer()"})
        +            static boolean voidPtrsBNative(VirtualFrame frame, PythonNativeVoidPtr a, PythonNativeVoidPtr b,
        +                            @Bind("this") Node inliningTarget,
        +                            @Shared("h") @Cached PyObjectHashNode hashNode) {
        +                long ptrVal = b.getNativePointer();
        +                // pointers are considered unsigned
        +                return ptrVal == hashNode.execute(frame, inliningTarget, a);
        +            }
         
        -        @Specialization
        -        static boolean doPL(PInt left, long right, ComparisonOp op) {
        -            return op.cmpResultToBool(left.compareTo(right));
        -        }
        +            @Specialization(guards = {"!a.isNativePointer()", "!b.isNativePointer()"})
        +            static boolean voidPtrsManaged(VirtualFrame frame, PythonNativeVoidPtr a, PythonNativeVoidPtr b,
        +                            @Bind("this") Node inliningTarget,
        +                            @Shared("h") @Cached PyObjectHashNode hashNode) {
        +                return hashNode.execute(frame, inliningTarget, a) == hashNode.execute(frame, inliningTarget, b);
        +            }
         
        -        @Specialization
        -        static boolean doPP(PInt left, PInt right, ComparisonOp op) {
        -            return op.cmpResultToBool(left.compareTo(right));
        -        }
        +            @Specialization
        +            @TruffleBoundary
        +            static boolean eqVoidPtrPInt(PythonNativeVoidPtr a, PInt b) {
        +                if (a.isNativePointer()) {
        +                    long ptrVal = a.getNativePointer();
        +                    if (ptrVal < 0) {
        +                        // pointers are considered unsigned
        +                        BigInteger bi = PInt.longToBigInteger(ptrVal).add(BigInteger.ONE.shiftLeft(64));
        +                        return bi.equals(b.getValue());
        +                    }
        +                    return PInt.longToBigInteger(ptrVal).equals(b.getValue());
        +                }
        +                try {
        +                    return PyObjectHashNode.executeUncached(a) == b.longValueExact();
        +                } catch (OverflowException e) {
        +                    return false;
        +                }
        +            }
         
        -        @Specialization
        -        static boolean doVoidPtr(Node inliningTarget, PythonNativeVoidPtr x, long y, ComparisonOp op,
        -                        @Cached CExtNodes.PointerCompareNode ltNode) {
        -            return ltNode.execute(inliningTarget, op, x, y);
        +            @SuppressWarnings("unused")
        +            @Fallback
        +            static PNotImplemented doGeneric(Object a, Object b) {
        +                return PNotImplemented.NOT_IMPLEMENTED;
        +            }
                 }
         
                 @SuppressWarnings("unused")
                 @Fallback
        -        static PNotImplemented doGeneric(Object a, Object b, ComparisonOp op) {
        +        static PNotImplemented doGeneric(Object a, Object b, RichCmpOp op) {
                     return PNotImplemented.NOT_IMPLEMENTED;
                 }
             }
         
        -    @Builtin(name = J___TRUFFLE_RICHCOMPARE__, minNumOfPositionalArgs = 3)
        +    @Slot(value = SlotKind.tp_richcompare, isComplex = true)
             @GenerateNodeFactory
        -    @ImportStatic(ComparisonOp.class)
        -    abstract static class RichCompareNode extends PythonTernaryBuiltinNode {
        -
        -        @Specialization(guards = {"opCode == cachedOp.opCode"}, limit = "6")
        -        static Object doCached(Object left, Object right, @SuppressWarnings("unused") int opCode,
        +    abstract static class RichCompareNode extends RichCmpBuiltinNode {
        +        @Specialization(guards = {"opCode == cachedOp"}, limit = "6")
        +        static Object doCached(VirtualFrame frame, Object left, Object right, @SuppressWarnings("unused") RichCmpOp opCode,
                                 @Bind("this") Node inliningTarget,
                                 @Cached PyLongCheckNode checkLeft,
                                 @Cached PyLongCheckNode checkRight,
        -                        @SuppressWarnings("unused") @Cached("fromOpCode(opCode)") ComparisonOp cachedOp,
        +                        @SuppressWarnings("unused") @Cached("opCode") RichCmpOp cachedOp,
                                 @Cached RichCompareHelperNode cmpNode) {
                     if (!checkLeft.execute(inliningTarget, left) || !checkRight.execute(inliningTarget, right)) {
                         return PNotImplemented.NOT_IMPLEMENTED;
                     }
        -            return cmpNode.execute(inliningTarget, left, right, cachedOp);
        +            return cmpNode.execute(frame, inliningTarget, left, right, cachedOp);
                 }
             }
         
        @@ -2644,7 +2413,7 @@ static Object doCached(Object left, Object right, @SuppressWarnings("unused") in
             @ArgumentClinic(name = "signed", conversion = ClinicConversion.Boolean, defaultValue = "false")
             @GenerateNodeFactory
             @SuppressWarnings("unused")
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        +    @TypeSystemReference(PythonIntegerTypes.class)
             public abstract static class ToBytesNode extends PythonClinicBuiltinNode {
         
                 @TruffleBoundary
        @@ -2655,33 +2424,33 @@ private static boolean isBigEndian(Node raisingNode, TruffleString order) {
                     if (order.equalsUncached(T_LITTLE, TS_ENCODING)) {
                         return false;
                     }
        -            throw PRaiseNode.raiseUncached(raisingNode, PythonErrorType.ValueError, ErrorMessages.BYTEORDER_MUST_BE_LITTLE_OR_BIG);
        +            throw PRaiseNode.raiseStatic(raisingNode, ValueError, ErrorMessages.BYTEORDER_MUST_BE_LITTLE_OR_BIG);
                 }
         
                 @Specialization
                 static PBytes fromLong(long self, int byteCount, TruffleString byteorder, boolean signed,
                                 @Bind("this") Node inliningTarget,
        +                        @Bind PythonLanguage language,
                                 @Exclusive @Cached InlinedConditionProfile negativeByteCountProfile,
                                 @Exclusive @Cached InlinedConditionProfile negativeNumberProfile,
                                 @Exclusive @Cached InlinedConditionProfile overflowProfile,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Exclusive @Cached PRaiseNode raiseNode) {
                     if (negativeByteCountProfile.profile(inliningTarget, byteCount < 0)) {
        -                throw raiseNode.get(inliningTarget).raise(PythonErrorType.ValueError, ErrorMessages.MESSAGE_LENGTH_ARGUMENT);
        +                throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ErrorMessages.MESSAGE_LENGTH_ARGUMENT);
                     }
                     if (self < 0) {
                         if (negativeNumberProfile.profile(inliningTarget, !signed)) {
        -                    throw raiseNode.get(inliningTarget).raise(PythonErrorType.OverflowError, ErrorMessages.MESSAGE_CONVERT_NEGATIVE);
        +                    throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError, ErrorMessages.MESSAGE_CONVERT_NEGATIVE);
                         }
                     }
        -            return factory.createBytes(fromLong(self, byteCount, isBigEndian(inliningTarget, byteorder), signed,
        +            return PFactory.createBytes(language, fromLong(self, byteCount, isBigEndian(inliningTarget, byteorder), signed,
                                     inliningTarget, overflowProfile, raiseNode));
                 }
         
                 public static byte[] fromLong(long self, int byteCount, boolean isBigEndian, boolean signed,
                                 Node inliningTarget,
                                 InlinedConditionProfile overflowProfile,
        -                        PRaiseNode.Lazy raiseNode) {
        +                        PRaiseNode raiseNode) {
                     byte signByte = 0;
                     if (self < 0) {
                         assert signed : ErrorMessages.MESSAGE_CONVERT_NEGATIVE;
        @@ -2709,8 +2478,8 @@ public static byte[] fromLong(long self, int byteCount, boolean isBigEndian, boo
                         index += delta;
                     }
         
        -            if (overflowProfile.profile(inliningTarget, !signed && number != 0 || (signed && bytes.length == 1 && bytes[0] != self) || (byteCount == 0 && self != 0))) {
        -                throw raiseNode.get(inliningTarget).raise(PythonErrorType.OverflowError, ErrorMessages.MESSAGE_INT_TO_BIG);
        +            if (overflowProfile.profile(inliningTarget, !signed && number != 0 || (signed && bytes.length == 1 && bytes[0] != self) || (byteCount == 0 && self != 0 && self != -1))) {
        +                throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError, ErrorMessages.MESSAGE_INT_TO_BIG);
                     }
         
                     if (signed) {
        @@ -2726,7 +2495,7 @@ public static byte[] fromLong(long self, int byteCount, boolean isBigEndian, boo
                 private static byte getSignByte(BigInteger value, boolean signed, Node raisingNode) {
                     if (value.compareTo(BigInteger.ZERO) < 0) {
                         if (!signed) {
        -                    throw PRaiseNode.raiseUncached(raisingNode, PythonErrorType.OverflowError, ErrorMessages.MESSAGE_CONVERT_NEGATIVE);
        +                    throw PRaiseNode.raiseStatic(raisingNode, OverflowError, ErrorMessages.MESSAGE_CONVERT_NEGATIVE);
                         }
                         return -1;
                     }
        @@ -2741,21 +2510,21 @@ private static byte[] getBytes(BigInteger value) {
                 @Specialization
                 static PBytes fromPIntInt(PInt self, int byteCount, TruffleString byteorder, boolean signed,
                                 @Bind("this") Node inliningTarget,
        +                        @Bind PythonLanguage language,
                                 @Exclusive @Cached InlinedConditionProfile negativeByteCountProfile,
                                 @Exclusive @Cached InlinedConditionProfile overflowProfile,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Exclusive @Cached PRaiseNode raiseNode) {
                     if (negativeByteCountProfile.profile(inliningTarget, byteCount < 0)) {
        -                throw raiseNode.get(inliningTarget).raise(PythonErrorType.ValueError, ErrorMessages.MESSAGE_LENGTH_ARGUMENT);
        +                throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ErrorMessages.MESSAGE_LENGTH_ARGUMENT);
                     }
        -            return factory.createBytes(fromBigInteger(self, byteCount, isBigEndian(inliningTarget, byteorder), signed,
        +            return PFactory.createBytes(language, fromBigInteger(self, byteCount, isBigEndian(inliningTarget, byteorder), signed,
                                     inliningTarget, overflowProfile, raiseNode));
                 }
         
                 public static byte[] fromBigInteger(PInt self, int byteCount, boolean isBigEndian, boolean signed,
                                 Node inliningTarget,
                                 InlinedConditionProfile overflowProfile,
        -                        PRaiseNode.Lazy raiseNode) {
        +                        PRaiseNode raiseNode) {
                     BigInteger value = self.getValue();
                     byte signByte = getSignByte(value, signed, inliningTarget);
                     byte[] bytes = getBytes(value);
        @@ -2773,7 +2542,7 @@ public static byte[] fromBigInteger(PInt self, int byteCount, boolean isBigEndia
                         }
                         if (overflowProfile.profile(inliningTarget, len > byteCount)) {
                             // the corrected len is still bigger then we need.
        -                    throw raiseNode.get(inliningTarget).raise(PythonErrorType.OverflowError, ErrorMessages.MESSAGE_INT_TO_BIG);
        +                    throw raiseNode.raise(inliningTarget, PythonErrorType.OverflowError, ErrorMessages.MESSAGE_INT_TO_BIG);
                         }
                         // the array starts with sign bytes and has to be truncated to the requested
                         // size
        @@ -2815,11 +2584,11 @@ public static byte[] fromBigInteger(PInt self, int byteCount, boolean isBigEndia
         
                 @Override
                 protected ArgumentClinicProvider getArgumentClinic() {
        -            return IntBuiltinsClinicProviders.ToBytesNodeClinicProviderGen.INSTANCE;
        +            return ToBytesNodeClinicProviderGen.INSTANCE;
                 }
             }
         
        -    @Builtin(name = "from_bytes", minNumOfPositionalArgs = 2, parameterNames = {"cls", "bytes", "byteorder"}, varArgsMarker = true, keywordOnlyNames = {"signed"}, isClassmethod = true)
        +    @Builtin(name = "from_bytes", minNumOfPositionalArgs = 2, parameterNames = {"cls", "bytes", "byteorder"}, keywordOnlyNames = {"signed"}, isClassmethod = true)
             @ArgumentClinic(name = "byteorder", conversion = ClinicConversion.TString, defaultValue = "T_BIG")
             @ArgumentClinic(name = "signed", conversion = ClinicConversion.Boolean, defaultValue = "false")
             @ImportStatic(SpecialMethodNames.class)
        @@ -2829,29 +2598,29 @@ public abstract static class FromBytesNode extends PythonClinicBuiltinNode {
                 @Specialization
                 static Object fromObject(VirtualFrame frame, Object cl, Object object, TruffleString byteorder, boolean signed,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached("create(Bytes)") LookupAndCallUnaryNode callBytes,
        +                        @Cached("create(T___BYTES__)") LookupAndCallUnaryNode callBytes,
                                 @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib,
        -                        @Cached BuiltinClassProfiles.IsBuiltinClassExactProfile isBuiltinIntProfile,
        +                        @Cached IsBuiltinClassExactProfile isBuiltinIntProfile,
                                 @Cached InlinedBranchProfile hasBytesProfile,
        -                        @Cached TruffleString.EqualNode equalNode,
        -                        @Cached BytesNodes.BytesFromObject bytesFromObject,
        -                        @Cached IntNodes.PyLongFromByteArray fromByteArray,
        +                        @Cached EqualNode equalNode,
        +                        @Cached BytesFromObject bytesFromObject,
        +                        @Cached PyLongFromByteArray fromByteArray,
                                 @Cached CallNode callCtor,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     boolean littleEndian;
                     if (equalNode.execute(byteorder, T_BIG, TS_ENCODING)) {
                         littleEndian = false;
                     } else if (equalNode.execute(byteorder, T_LITTLE, TS_ENCODING)) {
                         littleEndian = true;
                     } else {
        -                throw raiseNode.get(inliningTarget).raise(PythonErrorType.ValueError, ErrorMessages.BYTEORDER_MUST_BE_LITTLE_OR_BIG);
        +                throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ErrorMessages.BYTEORDER_MUST_BE_LITTLE_OR_BIG);
                     }
                     byte[] bytes;
                     Object bytesObj = callBytes.executeObject(frame, object);
                     if (bytesObj != PNone.NO_VALUE) {
                         hasBytesProfile.enter(inliningTarget);
                         if (!(bytesObj instanceof PBytes)) {
        -                    throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.RETURNED_NONBYTES, T___BYTES__);
        +                    throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.RETURNED_NONBYTES, T___BYTES__);
                         }
                         bytes = bufferLib.getCopiedByteArray(bytesObj);
                     } else {
        @@ -2867,7 +2636,7 @@ static Object fromObject(VirtualFrame frame, Object cl, Object object, TruffleSt
         
                 @Override
                 protected ArgumentClinicProvider getArgumentClinic() {
        -            return IntBuiltinsClinicProviders.FromBytesNodeClinicProviderGen.INSTANCE;
        +            return FromBytesNodeClinicProviderGen.INSTANCE;
                 }
             }
         
        @@ -2902,24 +2671,24 @@ static boolean toBoolean(PythonNativeVoidPtr self,
                 }
             }
         
        -    @Builtin(name = J___STR__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_str, isComplex = true)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        -    abstract static class StrNode extends PythonBuiltinNode {
        +    @TypeSystemReference(PythonIntegerTypes.class)
        +    abstract static class StrNode extends PythonUnaryBuiltinNode {
         
                 @Specialization
                 static TruffleString doL(long self,
        -                        @Shared("fromLong") @Cached TruffleString.FromLongNode fromLongNode) {
        +                        @Shared("fromLong") @Cached FromLongNode fromLongNode) {
                     return fromLongNode.execute(self, TS_ENCODING, false);
                 }
         
                 @Specialization
                 static TruffleString doPInt(PInt self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached TruffleString.FromJavaStringNode fromJavaStringNode,
        +                        @Cached FromJavaStringNode fromJavaStringNode,
                                 @Cached InlinedIntValueProfile maxDigitsProfile,
                                 @Cached InlinedIntValueProfile maxDigitsBitLengthProfile,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     PythonContext context = PythonContext.get(inliningTarget);
                     int intMaxStrDigits = maxDigitsProfile.profile(inliningTarget, context.getIntMaxStrDigits());
                     /*
        @@ -2937,7 +2706,7 @@ static TruffleString doPInt(PInt self,
                     if (intMaxStrDigits > 0) {
                         int bitLength = positiveBitLength(self);
                         if (bitLength >= maxDigitsBitLengthProfile.profile(inliningTarget, context.getMinIntBitLengthOverLimit())) {
        -                    throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.EXCEEDS_THE_LIMIT_FOR_INTEGER_STRING_CONVERSION, intMaxStrDigits);
        +                    throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.EXCEEDS_THE_LIMIT_FOR_INTEGER_STRING_CONVERSION, intMaxStrDigits);
                         }
                     }
                     String value = self.toString();
        @@ -2948,7 +2717,7 @@ static TruffleString doPInt(PInt self,
                     if (intMaxStrDigits > 0) {
                         int digits = self.isNegative() ? value.length() - 1 : value.length();
                         if (digits > intMaxStrDigits) {
        -                    throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.EXCEEDS_THE_LIMIT_FOR_INTEGER_STRING_CONVERSION);
        +                    throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.EXCEEDS_THE_LIMIT_FOR_INTEGER_STRING_CONVERSION);
                         }
                     }
                     return fromJavaStringNode.execute(value, TS_ENCODING);
        @@ -2963,12 +2732,12 @@ private static int positiveBitLength(PInt self) {
                 static TruffleString doNativeVoidPtr(VirtualFrame frame, PythonNativeVoidPtr self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached PyObjectHashNode hashNode,
        -                        @Shared("fromLong") @Cached TruffleString.FromLongNode fromLongNode) {
        +                        @Shared("fromLong") @Cached FromLongNode fromLongNode) {
                     return doL(hashNode.execute(frame, inliningTarget, self), fromLongNode);
                 }
             }
         
        -    @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
             @GenerateNodeFactory
             abstract static class ReprNode extends StrNode {
             }
        @@ -2982,19 +2751,19 @@ protected ArgumentClinicProvider getArgumentClinic() {
                     return FormatNodeClinicProviderGen.INSTANCE;
                 }
         
        -        // We cannot use PythonArithmeticTypes, because for empty format string we need to call the
        +        // We cannot use PythonIntegerTypes, because for empty format string we need to call the
                 // boolean's __str__ and not int's __str__ (that specialization is inherited)
                 @Specialization(guards = "!formatString.isEmpty()")
                 static TruffleString formatB(boolean self, TruffleString formatString,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     return formatI(self ? 1 : 0, formatString, inliningTarget, raiseNode);
                 }
         
                 @Specialization(guards = "!formatString.isEmpty()")
                 static TruffleString formatI(int self, TruffleString formatString,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     Spec spec = getSpec(formatString, inliningTarget);
                     if (isDoubleSpec(spec)) {
                         return formatDouble(spec, self, inliningTarget);
        @@ -3006,17 +2775,17 @@ static TruffleString formatI(int self, TruffleString formatString,
                 @Specialization(guards = "!formatString.isEmpty()")
                 static TruffleString formatL(VirtualFrame frame, long self, TruffleString formatString,
                                 @Bind("this") Node inliningTarget,
        +                        @Bind PythonLanguage language,
                                 @Shared @Cached PyNumberFloatNode floatNode,
        -                        @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            return formatPI(frame, factory.createInt(self), formatString, inliningTarget, floatNode, raiseNode);
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            return formatPI(frame, PFactory.createInt(language, self), formatString, inliningTarget, floatNode, raiseNode);
                 }
         
                 @Specialization(guards = "!formatString.isEmpty()")
                 static TruffleString formatPI(VirtualFrame frame, PInt self, TruffleString formatString,
                                 @Bind("this") Node inliningTarget,
                                 @Shared @Cached PyNumberFloatNode floatNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     Spec spec = getSpec(formatString, inliningTarget);
                     if (isDoubleSpec(spec)) {
                         // lazy init of floatNode serves as branch profile
        @@ -3063,25 +2832,25 @@ private static TruffleString formatPInt(PInt self, Spec spec, Node raisingNode)
                     return formatter.pad().getResult();
                 }
         
        -        private static void validateIntegerSpec(Node inliningTarget, PRaiseNode.Lazy raiseNode, Spec spec) {
        +        private static void validateIntegerSpec(Node inliningTarget, PRaiseNode raiseNode, Spec spec) {
                     if (Spec.specified(spec.precision)) {
        -                throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.PRECISION_NOT_ALLOWED_FOR_INT);
        +                throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.PRECISION_NOT_ALLOWED_FOR_INT);
                     }
                     if (spec.type == 'c') {
                         if (Spec.specified(spec.sign)) {
        -                    throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.SIGN_NOT_ALLOWED_WITH_C_FOR_INT);
        +                    throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.SIGN_NOT_ALLOWED_WITH_C_FOR_INT);
                         } else if (spec.alternate) {
        -                    throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.ALTERNATE_NOT_ALLOWED_WITH_C_FOR_INT);
        +                    throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.ALTERNATE_NOT_ALLOWED_WITH_C_FOR_INT);
                         }
                     }
                 }
             }
         
        -    @Builtin(name = J___HASH__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_hash, isComplex = true)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        -    abstract static class HashNode extends PythonUnaryBuiltinNode {
        -
        +    @TypeSystemReference(PythonIntegerTypes.class)
        +    @GenerateUncached
        +    public abstract static class HashNode extends HashBuiltinNode {
                 @Specialization
                 static long hash(int self) {
                     return PyObjectHashNode.hash(self);
        @@ -3119,7 +2888,7 @@ private static long hashCodeBoundary(Object object) {
         
             @Builtin(name = "bit_count", minNumOfPositionalArgs = 1)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        +    @TypeSystemReference(PythonIntegerTypes.class)
             abstract static class BitCountNode extends PythonBuiltinNode {
                 @Specialization
                 static int bitCount(int i) {
        @@ -3140,8 +2909,10 @@ static int bitCount(PInt i) {
         
             @Builtin(name = "bit_length", minNumOfPositionalArgs = 1)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        -    abstract static class BitLengthNode extends PythonBuiltinNode {
        +    @TypeSystemReference(PythonIntegerTypes.class)
        +    public abstract static class BitLengthNode extends PythonUnaryBuiltinNode {
        +        public abstract int execute(Object argument);
        +
                 @Specialization
                 static int bitLength(int argument) {
                     return Integer.SIZE - Integer.numberOfLeadingZeros(Math.abs(argument));
        @@ -3159,6 +2930,22 @@ static int bitLength(PInt argument) {
                 }
             }
         
        +    @Builtin(name = "is_integer", minNumOfPositionalArgs = 1)
        +    @GenerateNodeFactory
        +    @TypeSystemReference(PythonIntegerTypes.class)
        +    abstract static class IsIntegerNode extends PythonUnaryBuiltinNode {
        +        @Specialization
        +        static boolean doLong(long argument) {
        +            return true;
        +        }
        +
        +        @Specialization
        +        @TruffleBoundary
        +        static boolean doPInt(PInt argument) {
        +            return true;
        +        }
        +    }
        +
             @GenerateNodeFactory
             @Builtin(name = "real", minNumOfPositionalArgs = 1, isGetter = true, doc = "the real part of a complex number")
             abstract static class RealNode extends IntNode {
        @@ -3200,8 +2987,8 @@ static int get(@SuppressWarnings("unused") Object self) {
             abstract static class AsIntegerRatioNode extends PythonBuiltinNode {
                 @Specialization
                 static Object get(VirtualFrame frame, Object self, @Cached IntNode intNode,
        -                        @Cached PythonObjectFactory factory) {
        -            return factory.createTuple(new Object[]{intNode.execute(frame, self), 1});
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createTuple(language, new Object[]{intNode.execute(frame, self), 1});
                 }
             }
         
        @@ -3211,83 +2998,34 @@ abstract static class TruncNode extends IntNode {
         
             }
         
        -    @Builtin(name = J___INT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.nb_int, isComplex = true)
        +    @Slot(value = SlotKind.nb_index, isComplex = true)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
             abstract static class IntNode extends PythonUnaryBuiltinNode {
         
                 @Specialization
        -        static int doB(boolean self) {
        -            return self ? 1 : 0;
        -        }
        -
        -        @Specialization
        -        static int doI(int self) {
        -            return self;
        -        }
        -
        -        @Specialization
        -        static long doL(long self) {
        -            return self;
        -        }
        -
        -        @Specialization(guards = "isBuiltinPInt(self)")
        -        static PInt doPInt(PInt self) {
        -            return self;
        -        }
        -
        -        @Specialization(guards = "!isBuiltinPInt(self)", rewriteOn = OverflowException.class)
        -        static int doPIntOverridenNarrowInt(PInt self) throws OverflowException {
        -            return self.intValueExact();
        -        }
        -
        -        @Specialization(guards = "!isBuiltinPInt(self)", replaces = "doPIntOverridenNarrowInt", rewriteOn = OverflowException.class)
        -        static long doPIntOverridenNarrowLong(PInt self) throws OverflowException {
        -            return self.longValueExact();
        -        }
        -
        -        @Specialization(guards = "!isBuiltinPInt(self)", replaces = "doPIntOverridenNarrowLong")
        -        static PInt doPIntOverriden(PInt self,
        -                        @Cached PythonObjectFactory factory) {
        -            return factory.createInt(self.getValue());
        -        }
        -
        -        @Specialization
        -        static PythonNativeVoidPtr doL(PythonNativeVoidPtr self) {
        -            return self;
        +        static Object doCopy(Object self,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached PyLongCopy copy) {
        +            return copy.execute(inliningTarget, self);
                 }
             }
         
        -    @Builtin(name = J___INDEX__, minNumOfPositionalArgs = 1)
        -    @GenerateNodeFactory
        -    abstract static class IndexNode extends IntNode {
        -    }
        -
             @Builtin(name = J___GETNEWARGS__, minNumOfPositionalArgs = 1)
             @GenerateNodeFactory
             abstract static class GetNewArgsNode extends PythonUnaryBuiltinNode {
                 @Specialization
        -        static Object doI(int self,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createTuple(new Object[]{factory.createInt(self)});
        -        }
        -
        -        @Specialization
        -        static Object doL(long self,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createTuple(new Object[]{factory.createInt(self)});
        -        }
        -
        -        @Specialization
        -        static Object getPI(PInt self,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createTuple(new Object[]{factory.createInt(self.getValue())});
        +        static Object doI(Object self,
        +                        @Bind("this") Node inliningTarget,
        +                        @Bind PythonLanguage language,
        +                        @Cached PyLongCopy copy) {
        +            return PFactory.createTuple(language, new Object[]{copy.execute(inliningTarget, self)});
                 }
             }
         
        -    @Builtin(name = J___FLOAT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.nb_float, isComplex = true)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        +    @TypeSystemReference(PythonIntegerTypes.class)
             public abstract static class FloatNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static double doBoolean(boolean self) {
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntNodes.java
        index 8f2ce4b2fb..4cd53ffff2 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntNodes.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntNodes.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -45,9 +45,10 @@
         
         import java.math.BigInteger;
         
        +import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.graal.python.util.NumericSupport;
         import com.oracle.graal.python.util.OverflowException;
         import com.oracle.truffle.api.dsl.Cached;
        @@ -149,26 +150,26 @@ static byte[] doPrimitive(long value, int size, boolean bigEndian,
         
                 @Specialization
                 static byte[] doArbitraryBytesLong(Node inliningTarget, long value, int size, boolean bigEndian,
        -                        @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared("raiseNode") @Cached PRaiseNode raiseNode) {
                     final byte[] bytes = new byte[size];
                     NumericSupport support = bigEndian ? NumericSupport.bigEndian() : NumericSupport.littleEndian();
                     try {
                         support.putBigInteger(bytes, 0, PInt.longToBigInteger(value), size);
                     } catch (OverflowException oe) {
        -                throw raiseNode.get(inliningTarget).raise(OverflowError, TOO_LARGE_TO_CONVERT, "int");
        +                throw raiseNode.raise(inliningTarget, OverflowError, TOO_LARGE_TO_CONVERT, "int");
                     }
                     return bytes;
                 }
         
                 @Specialization
                 static byte[] doPInt(Node inliningTarget, PInt value, int size, boolean bigEndian,
        -                        @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared("raiseNode") @Cached PRaiseNode raiseNode) {
                     final byte[] bytes = new byte[size];
                     NumericSupport support = bigEndian ? NumericSupport.bigEndian() : NumericSupport.littleEndian();
                     try {
                         support.putBigInteger(bytes, 0, value.getValue(), size);
                     } catch (OverflowException oe) {
        -                throw raiseNode.get(inliningTarget).raise(OverflowError, TOO_LARGE_TO_CONVERT, "int");
        +                throw raiseNode.raise(inliningTarget, OverflowError, TOO_LARGE_TO_CONVERT, "int");
                     }
                     return bytes;
                 }
        @@ -197,8 +198,7 @@ static Object doOther(Node inliningTarget, byte[] data, boolean littleEndian, bo
                                 @Cached InlinedBranchProfile fastPath4,
                                 @Cached InlinedBranchProfile fastPath8,
                                 @Cached InlinedBranchProfile generic,
        -                        @Cached(inline = false) PythonObjectFactory factory,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     NumericSupport support = littleEndian ? NumericSupport.littleEndian() : NumericSupport.bigEndian();
                     if (signed) {
                         switch (data.length) {
        @@ -227,10 +227,10 @@ static Object doOther(Node inliningTarget, byte[] data, boolean littleEndian, bo
                             long longValue = PInt.longValue(integer);
                             return PInt.isIntRange(longValue) ? (int) longValue : longValue;
                         } else {
        -                    return factory.createInt(integer);
        +                    return PFactory.createInt(PythonLanguage.get(inliningTarget), integer);
                         }
                     } catch (OverflowException e) {
        -                throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.BYTE_ARRAY_TOO_LONG_TO_CONVERT_TO_INT);
        +                throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.BYTE_ARRAY_TOO_LONG_TO_CONVERT_TO_INT);
                     }
                 }
             }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/PInt.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/PInt.java
        index ce363dcbfe..1b8e62a498 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/PInt.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/PInt.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2017, 2024, Oracle and/or its affiliates.
        + * Copyright (c) 2017, 2025, Oracle and/or its affiliates.
          * Copyright (c) 2013, Regents of the University of California
          *
          * All rights reserved.
        @@ -30,6 +30,7 @@
         import java.math.BigInteger;
         import java.util.Objects;
         
        +import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.modules.SysModuleBuiltins;
         import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
        @@ -37,7 +38,7 @@
         import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.runtime.PythonContext;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.graal.python.util.OverflowException;
         import com.oracle.truffle.api.CompilerDirectives;
         import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
        @@ -52,6 +53,7 @@
         import com.oracle.truffle.api.library.ExportMessage.Ignore;
         import com.oracle.truffle.api.nodes.Node;
         import com.oracle.truffle.api.object.Shape;
        +import com.oracle.truffle.api.profiles.InlinedBranchProfile;
         import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         
         @SuppressWarnings("truffle-abstract-export")
        @@ -401,7 +403,7 @@ public double doubleValueWithOverflow(Node raisingNode) {
             public static double doubleValueWithOverflow(Node raisingNode, BigInteger value) {
                 double d = value.doubleValue();
                 if (Double.isInfinite(d)) {
        -            throw PRaiseNode.raiseUncached(raisingNode, OverflowError, ErrorMessages.INT_TOO_LARGE_TO_CONVERT_TO_FLOAT);
        +            throw PRaiseNode.raiseStatic(raisingNode, OverflowError, ErrorMessages.INT_TOO_LARGE_TO_CONVERT_TO_FLOAT);
                 }
                 return d;
             }
        @@ -599,6 +601,15 @@ public static boolean isIntRange(long val) {
                 return val == (int) val;
             }
         
        +    public static int long2int(Node inliningTarget, long size, InlinedBranchProfile errorProfile) {
        +        int intSize = (int) size;
        +        if (intSize != size) {
        +            errorProfile.enter(inliningTarget);
        +            throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.OverflowError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, size);
        +        }
        +        return intSize;
        +    }
        +
             public static Object abs(int v) {
                 if (v == Integer.MIN_VALUE) {
                     return -(long) Integer.MIN_VALUE;
        @@ -606,9 +617,9 @@ public static Object abs(int v) {
                 return Math.abs(v);
             }
         
        -    public static Object abs(Node inliningTarget, long v, PythonObjectFactory.Lazy factory) {
        +    public static Object abs(Node inliningTarget, long v) {
                 if (v == Long.MIN_VALUE) {
        -            return factory.get(inliningTarget).createInt(abs(PInt.longToBigInteger(v)));
        +            return PFactory.createInt(PythonLanguage.get(inliningTarget), abs(PInt.longToBigInteger(v)));
                 }
                 return Math.abs(v);
             }
        @@ -678,15 +689,14 @@ private boolean fitsIn(BigInteger left, BigInteger right) {
              * Creates a Python {@code int} object from a Java {@code long} value by interpreting it as an
              * unsigned number.
              *
        -     * @param factory Python object factory
              * @param profile condition profile for the case when the unsigned value fits into Java
              *            {@code long}
              * @param value the value
              * @return either {@code Long} or {@code PInt} containing an unsigned value with bit pattern
              *         matching that of {@code value}
              */
        -    public static Object createPythonIntFromUnsignedLong(Node inliningTarget, PythonObjectFactory factory, InlinedConditionProfile profile, long value) {
        -        return profile.profile(inliningTarget, value >= 0) ? value : factory.createInt(longToUnsignedBigInt(value));
        +    public static Object createPythonIntFromUnsignedLong(Node inliningTarget, PythonLanguage language, InlinedConditionProfile profile, long value) {
        +        return profile.profile(inliningTarget, value >= 0) ? value : PFactory.createInt(language, longToUnsignedBigInt(value));
             }
         
             @TruffleBoundary
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/ForeignIteratorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/ForeignIteratorBuiltins.java
        deleted file mode 100644
        index a9d4c6635f..0000000000
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/ForeignIteratorBuiltins.java
        +++ /dev/null
        @@ -1,98 +0,0 @@
        -/*
        - * Copyright (c) 2017, 2023, Oracle and/or its affiliates.
        - * Copyright (c) 2013, Regents of the University of California
        - *
        - * All rights reserved.
        - *
        - * Redistribution and use in source and binary forms, with or without modification, are
        - * permitted provided that the following conditions are met:
        - *
        - * 1. Redistributions of source code must retain the above copyright notice, this list of
        - * conditions and the following disclaimer.
        - * 2. Redistributions in binary form must reproduce the above copyright notice, this list of
        - * conditions and the following disclaimer in the documentation and/or other materials provided
        - * with the distribution.
        - *
        - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
        - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
        - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
        - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
        - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
        - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
        - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
        - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
        - * OF THE POSSIBILITY OF SUCH DAMAGE.
        - */
        -package com.oracle.graal.python.builtins.objects.iterator;
        -
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
        -
        -import java.util.List;
        -
        -import com.oracle.graal.python.builtins.Builtin;
        -import com.oracle.graal.python.builtins.CoreFunctions;
        -import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        -import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.lib.PyNumberAsSizeNode;
        -import com.oracle.graal.python.nodes.PRaiseNode;
        -import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
        -import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        -import com.oracle.graal.python.nodes.interop.PForeignToPTypeNode;
        -import com.oracle.graal.python.runtime.GilNode;
        -import com.oracle.truffle.api.dsl.Bind;
        -import com.oracle.truffle.api.dsl.Cached;
        -import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        -import com.oracle.truffle.api.dsl.NodeFactory;
        -import com.oracle.truffle.api.dsl.Specialization;
        -import com.oracle.truffle.api.interop.InteropLibrary;
        -import com.oracle.truffle.api.interop.InvalidArrayIndexException;
        -import com.oracle.truffle.api.interop.UnsupportedMessageException;
        -import com.oracle.truffle.api.library.CachedLibrary;
        -import com.oracle.truffle.api.nodes.Node;
        -
        -@CoreFunctions(extendClasses = PythonBuiltinClassType.PForeignArrayIterator)
        -public final class ForeignIteratorBuiltins extends PythonBuiltins {
        -
        -    @Override
        -    protected List> getNodeFactories() {
        -        return ForeignIteratorBuiltinsFactory.getFactories();
        -    }
        -
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        -    @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        -        @Specialization
        -        static Object next(PForeignArrayIterator foreignIter,
        -                        @Bind("this") Node inliningTarget,
        -                        @Cached PForeignToPTypeNode fromForeignNode,
        -                        @Cached PyNumberAsSizeNode asSizeNode,
        -                        @CachedLibrary(limit = "3") InteropLibrary interop,
        -                        @Cached GilNode gil,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        -            if (foreignIter.getCursor() >= foreignIter.getSize(interop, inliningTarget, asSizeNode)) {
        -                throw raiseNode.get(inliningTarget).raiseStopIteration();
        -            }
        -
        -            gil.release(true);
        -            try {
        -                Object element = interop.readArrayElement(foreignIter.getForeignArray(), foreignIter.advance());
        -                return fromForeignNode.executeConvert(element);
        -            } catch (UnsupportedMessageException | InvalidArrayIndexException e) {
        -                throw raiseNode.get(inliningTarget).raiseStopIteration();
        -            } finally {
        -                gil.acquire();
        -            }
        -        }
        -    }
        -
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        -    @GenerateNodeFactory
        -    public abstract static class IterNode extends PythonUnaryBuiltinNode {
        -
        -        @Specialization
        -        static PForeignArrayIterator doForeignArrayIterator(PForeignArrayIterator self) {
        -            return self;
        -        }
        -    }
        -}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/IteratorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/IteratorBuiltins.java
        index 12eb2d9e49..39619733d0 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/IteratorBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/IteratorBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2024, Oracle and/or its affiliates.
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates.
          * Copyright (c) 2014, Regents of the University of California
          *
          * All rights reserved.
        @@ -26,10 +26,10 @@
         package com.oracle.graal.python.builtins.objects.iterator;
         
         import static com.oracle.graal.python.builtins.PythonBuiltinClassType.RuntimeError;
        +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
         import static com.oracle.graal.python.nodes.BuiltinNames.T_ITER;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        +import static com.oracle.graal.python.nodes.ErrorMessages.DESCRIPTOR_REQUIRES_S_OBJ_RECEIVED_P;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LENGTH_HINT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__;
         import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING;
        @@ -38,6 +38,9 @@
         import java.math.BigInteger;
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        @@ -59,37 +62,50 @@
         import com.oracle.graal.python.builtins.objects.list.PList;
         import com.oracle.graal.python.builtins.objects.module.PythonModule;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
         import com.oracle.graal.python.lib.PyNumberAsSizeNode;
         import com.oracle.graal.python.lib.PyObjectGetAttr;
         import com.oracle.graal.python.lib.PyObjectSizeNode;
         import com.oracle.graal.python.lib.PySequenceGetItemNode;
         import com.oracle.graal.python.nodes.ErrorMessages;
        +import com.oracle.graal.python.nodes.PNodeWithContext;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.nodes.interop.PForeignToPTypeNode;
         import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile;
        +import com.oracle.graal.python.nodes.object.IsForeignObjectNode;
         import com.oracle.graal.python.nodes.util.CastToJavaBigIntegerNode;
        +import com.oracle.graal.python.runtime.GilNode;
         import com.oracle.graal.python.runtime.PythonContext;
         import com.oracle.graal.python.runtime.exception.PException;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
        +import com.oracle.truffle.api.CompilerDirectives;
         import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.Cached.Exclusive;
         import com.oracle.truffle.api.dsl.Cached.Shared;
        +import com.oracle.truffle.api.dsl.Fallback;
         import com.oracle.truffle.api.dsl.GenerateCached;
         import com.oracle.truffle.api.dsl.GenerateInline;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
         import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.interop.InteropLibrary;
        +import com.oracle.truffle.api.interop.StopIterationException;
        +import com.oracle.truffle.api.interop.UnsupportedMessageException;
        +import com.oracle.truffle.api.library.CachedLibrary;
         import com.oracle.truffle.api.nodes.Node;
         import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         import com.oracle.truffle.api.profiles.InlinedExactClassProfile;
         import com.oracle.truffle.api.strings.TruffleString;
         
        +/** NOTE: self can either be a PBuiltinIterator or a foreign iterator (isIterator()). */
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PIterator, PythonBuiltinClassType.PArrayIterator,
                         PythonBuiltinClassType.PDictItemIterator, PythonBuiltinClassType.PDictReverseItemIterator,
                         PythonBuiltinClassType.PDictKeyIterator, PythonBuiltinClassType.PDictReverseKeyIterator,
        @@ -101,167 +117,148 @@ public final class IteratorBuiltins extends PythonBuiltins {
              * class.
              */
         
        +    public static final TpSlots SLOTS = IteratorBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return IteratorBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
         
                 @Specialization
        -        static Object exhausted(VirtualFrame frame, PBuiltinIterator self,
        +        static Object exhausted(VirtualFrame frame, Object self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached NextHelperNode nextHelperNode) {
        -            return nextHelperNode.execute(frame, inliningTarget, self, true);
        +            return nextHelperNode.execute(frame, inliningTarget, self);
                 }
             }
         
             @GenerateInline
             @GenerateCached(false)
        -    public abstract static class NextHelperNode extends Node {
        -
        -        public static final Object STOP_MARKER = new Object();
        +    public abstract static class NextHelperNode extends PNodeWithContext {
         
        -        public abstract Object execute(VirtualFrame frame, Node inliningTarget, PBuiltinIterator iterator, boolean throwStopIteration);
        +        public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object iterator);
         
        -        private static Object stopIteration(Node inliningTarget, PBuiltinIterator self, boolean throwStopIteration, PRaiseNode.Lazy raiseNode) {
        +        private static Object stopIteration(PBuiltinIterator self) {
                     self.setExhausted();
        -            if (throwStopIteration) {
        -                throw raiseNode.get(inliningTarget).raiseStopIteration();
        -            } else {
        -                return STOP_MARKER;
        -            }
        +            throw TpIterNextBuiltin.iteratorExhausted();
                 }
         
                 @Specialization(guards = "self.isExhausted()")
        -        static Object exhausted(Node inliningTarget, @SuppressWarnings("unused") PBuiltinIterator self, boolean throwStopIteration,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        -            if (throwStopIteration) {
        -                throw raiseNode.get(inliningTarget).raiseStopIteration();
        -            } else {
        -                return STOP_MARKER;
        -            }
        +        static Object exhausted(@SuppressWarnings("unused") PBuiltinIterator self) {
        +            throw TpIterNextBuiltin.iteratorExhausted();
                 }
         
                 @Specialization(guards = "!self.isExhausted()")
        -        static Object next(Node inliningTarget, PArrayIterator self, boolean throwStopIteration,
        +        static Object next(Node inliningTarget, PArrayIterator self,
                                 @Cached InlinedExactClassProfile itemTypeProfile,
        -                        @Cached ArrayNodes.GetValueNode getValueNode,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached ArrayNodes.GetValueNode getValueNode) {
                     PArray array = self.array;
                     if (self.getIndex() < array.getLength()) {
                         return itemTypeProfile.profile(inliningTarget, getValueNode.execute(inliningTarget, array, self.index++));
                     }
        -            return stopIteration(inliningTarget, self, throwStopIteration, raiseNode);
        +            return stopIteration(self);
                 }
         
                 @Specialization(guards = "!self.isExhausted()")
        -        static Object next(Node inliningTarget, PIntegerSequenceIterator self, boolean throwStopIteration,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +        static Object next(PIntegerSequenceIterator self) {
                     if (self.getIndex() < self.sequence.length()) {
                         return self.sequence.getIntItemNormalized(self.index++);
                     }
        -            return stopIteration(inliningTarget, self, throwStopIteration, raiseNode);
        +            return stopIteration(self);
                 }
         
                 @Specialization(guards = "!self.isExhausted()")
        -        static Object next(Node inliningTarget, PObjectSequenceIterator self, boolean throwStopIteration,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +        static Object next(PObjectSequenceIterator self) {
                     if (self.getIndex() < self.sequence.length()) {
                         return self.sequence.getObjectItemNormalized(self.index++);
                     }
        -            return stopIteration(inliningTarget, self, throwStopIteration, raiseNode);
        +            return stopIteration(self);
                 }
         
                 @Specialization(guards = "!self.isExhausted()")
        -        static Object next(Node inliningTarget, PIntRangeIterator self, boolean throwStopIteration,
        -                        @Exclusive @Cached InlinedConditionProfile profile,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +        static Object next(Node inliningTarget, PIntRangeIterator self,
        +                        @Exclusive @Cached InlinedConditionProfile profile) {
                     if (profile.profile(inliningTarget, self.hasNextInt())) {
                         return self.nextInt();
                     }
        -            return stopIteration(inliningTarget, self, throwStopIteration, raiseNode);
        +            return stopIteration(self);
                 }
         
                 @Specialization(guards = "!self.isExhausted()")
        -        static Object next(Node inliningTarget, PBigRangeIterator self, boolean throwStopIteration,
        -                        @Cached PythonObjectFactory.Lazy factory,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +        static Object next(PBigRangeIterator self,
        +                        @Bind PythonLanguage language) {
                     if (self.hasNextBigInt()) {
        -                return factory.get(inliningTarget).createInt(self.nextBigInt());
        +                return PFactory.createInt(language, self.nextBigInt());
                     }
        -            return stopIteration(inliningTarget, self, throwStopIteration, raiseNode);
        +            return stopIteration(self);
                 }
         
                 @Specialization(guards = "!self.isExhausted()")
        -        static Object next(Node inliningTarget, PDoubleSequenceIterator self, boolean throwStopIteration,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +        static Object next(PDoubleSequenceIterator self) {
                     if (self.getIndex() < self.sequence.length()) {
                         return self.sequence.getDoubleItemNormalized(self.index++);
                     }
        -            return stopIteration(inliningTarget, self, throwStopIteration, raiseNode);
        +            return stopIteration(self);
                 }
         
                 @Specialization(guards = "!self.isExhausted()")
        -        static Object next(Node inliningTarget, PLongSequenceIterator self, boolean throwStopIteration,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +        static Object next(PLongSequenceIterator self) {
                     if (self.getIndex() < self.sequence.length()) {
                         return self.sequence.getLongItemNormalized(self.index++);
                     }
        -            return stopIteration(inliningTarget, self, throwStopIteration, raiseNode);
        +            return stopIteration(self);
                 }
         
                 @Specialization(guards = "!self.isExhausted()")
        -        static Object next(Node inliningTarget, PStringIterator self, boolean throwStopIteration,
        +        static Object next(PStringIterator self,
                                 @Cached(inline = false) TruffleString.CodePointLengthNode codePointLengthNode,
        -                        @Cached(inline = false) TruffleString.SubstringNode substringNode,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached(inline = false) TruffleString.SubstringNode substringNode) {
                     if (self.getIndex() < codePointLengthNode.execute(self.value, TS_ENCODING)) {
                         return substringNode.execute(self.value, self.index++, 1, TS_ENCODING, false);
                     }
        -            return stopIteration(inliningTarget, self, throwStopIteration, raiseNode);
        +            return stopIteration(self);
                 }
         
                 @Specialization(guards = "!self.isExhausted()")
        -        static Object nextHashingStorageIter(Node inliningTarget, PHashingStorageIterator self, boolean throwStopIteration,
        +        static Object nextHashingStorageIter(Node inliningTarget, PHashingStorageIterator self,
                                 @Exclusive @Cached InlinedConditionProfile sizeChanged,
                                 @Cached HashingStorageLen lenNode,
                                 @Cached HashingStorageIteratorNext nextNode,
                                 @Cached PHashingStorageIteratorNextValue itValueNode,
                                 @Exclusive @Cached InlinedConditionProfile profile,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Exclusive @Cached PRaiseNode raiseNode) {
                     HashingStorage storage = self.getHashingStorage();
                     final HashingStorageIterator it = self.getIterator();
                     if (profile.profile(inliningTarget, nextNode.execute(inliningTarget, storage, it))) {
                         if (sizeChanged.profile(inliningTarget, self.checkSizeChanged(inliningTarget, lenNode))) {
                             String name = PBaseSetIterator.isInstance(self) ? "Set" : "dictionary";
        -                    throw raiseNode.get(inliningTarget).raise(RuntimeError, ErrorMessages.CHANGED_SIZE_DURING_ITERATION, name);
        +                    throw raiseNode.raise(inliningTarget, RuntimeError, ErrorMessages.CHANGED_SIZE_DURING_ITERATION, name);
                         }
                         self.index++;
                         return itValueNode.execute(inliningTarget, self, storage, it);
                     }
        -            return stopIteration(inliningTarget, self, throwStopIteration, raiseNode);
        +            return stopIteration(self);
                 }
         
                 @Specialization(guards = {"!self.isExhausted()", "self.isPSequence()"})
        -        static Object next(Node inliningTarget, PSequenceIterator self, boolean throwStopIteration,
        +        static Object next(Node inliningTarget, PSequenceIterator self,
                                 @Cached SequenceNodes.GetSequenceStorageNode getStorage,
        -                        @Cached(value = "createNotNormalized()", inline = false) SequenceStorageNodes.GetItemNode getItemNode,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached(value = "createNotNormalized()", inline = false) SequenceStorageNodes.GetItemNode getItemNode) {
                     SequenceStorage s = getStorage.execute(inliningTarget, self.getPSequence());
                     if (self.getIndex() < s.length()) {
                         return getItemNode.execute(s, self.index++);
                     }
        -            return stopIteration(inliningTarget, self, throwStopIteration, raiseNode);
        +            return stopIteration(self);
                 }
         
                 @Specialization(guards = {"!self.isExhausted()", "!self.isPSequence()"})
        -        static Object next(VirtualFrame frame, Node inliningTarget, PSequenceIterator self, boolean throwStopIteration,
        +        static Object next(VirtualFrame frame, Node inliningTarget, PSequenceIterator self,
                                 @Cached(inline = false) PySequenceGetItemNode getItem,
        -                        @Cached IsBuiltinObjectProfile profile,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached IsBuiltinObjectProfile profile) {
                     try {
                         /*
                          * This must use PySequence_GetItem and not any other get item nodes. The reason is
        @@ -273,8 +270,30 @@ static Object next(VirtualFrame frame, Node inliningTarget, PSequenceIterator se
                         return getItem.execute(frame, self.getObject(), self.index++);
                     } catch (PException e) {
                         e.expectIndexError(inliningTarget, profile);
        -                return stopIteration(inliningTarget, self, throwStopIteration, raiseNode);
        +                return stopIteration(self);
        +            }
        +        }
        +
        +        @Specialization(guards = {"isForeignObjectNode.execute(inliningTarget, self)", "interop.isIterator(self)"}, limit = "1")
        +        static Object foreign(@SuppressWarnings("unused") Node inliningTarget, Object self,
        +                        @SuppressWarnings("unused") @Cached IsForeignObjectNode isForeignObjectNode,
        +                        @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop,
        +                        @Cached(inline = false) GilNode gil,
        +                        @Cached(inline = false) PForeignToPTypeNode toPythonNode) {
        +            final Object element;
        +
        +            gil.release(true);
        +            try {
        +                element = interop.getIteratorNextElement(self);
        +            } catch (StopIterationException e) {
        +                throw TpIterNextBuiltin.iteratorExhausted();
        +            } catch (UnsupportedMessageException e) {
        +                throw CompilerDirectives.shouldNotReachHere("iterator claimed to be iterator but wasn't");
        +            } finally {
        +                gil.acquire();
                     }
        +
        +            return toPythonNode.executeConvert(element);
                 }
         
                 @GenerateInline
        @@ -296,10 +315,10 @@ static Object doDictKey(Node inliningTarget, @SuppressWarnings("unused") PDictVi
         
                     @Specialization
                     static PTuple doDictItem(Node inliningTarget, @SuppressWarnings("unused") PDictView.PDictItemIterator self, HashingStorage storage, HashingStorageIterator it,
        +                            @Bind PythonLanguage language,
                                     @Shared("val") @Cached HashingStorageIteratorValue itValueNode,
        -                            @Shared("key") @Cached HashingStorageIteratorKey itKeyNode,
        -                            @Cached(inline = false) PythonObjectFactory factory) {
        -                return factory.createTuple(new Object[]{itKeyNode.execute(inliningTarget, storage, it), itValueNode.execute(inliningTarget, storage, it)});
        +                            @Shared("key") @Cached HashingStorageIteratorKey itKeyNode) {
        +                return PFactory.createTuple(language, new Object[]{itKeyNode.execute(inliningTarget, storage, it), itValueNode.execute(inliningTarget, storage, it)});
                     }
         
                     @Specialization
        @@ -310,7 +329,7 @@ static Object doSetKey(Node inliningTarget, @SuppressWarnings("unused") PBaseSet
                 }
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -363,8 +382,8 @@ static int lengthHint(PIntRangeIterator self) {
         
                 @Specialization(guards = "!self.isExhausted()")
                 static Object lengthHint(PBigRangeIterator self,
        -                        @Cached PythonObjectFactory factory) {
        -            return factory.createInt(self.getRemainingLength());
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createInt(language, self.getRemainingLength());
                 }
         
                 @Specialization(guards = "!self.isExhausted()")
        @@ -416,144 +435,162 @@ static int lengthHint(VirtualFrame frame, PSequenceIterator self,
                     return len < 0 ? 0 : len;
                 }
         
        -        @Builtin(name = J___REDUCE__, minNumOfPositionalArgs = 1)
        -        @GenerateNodeFactory
        -        public abstract static class ReduceNode extends PythonUnaryBuiltinNode {
        -
        -            @Specialization
        -            Object reduce(VirtualFrame frame, PArrayIterator self,
        -                            @Bind("this") Node inliningTarget,
        -                            @Shared @Cached InlinedConditionProfile exhaustedProfile,
        -                            @Shared @Cached PyObjectGetAttr getAttrNode,
        -                            @Shared @Cached PythonObjectFactory factory) {
        -                PythonContext context = PythonContext.get(this);
        -                if (!exhaustedProfile.profile(inliningTarget, self.isExhausted())) {
        -                    return reduceInternal(frame, inliningTarget, self.array, self.getIndex(), context, getAttrNode, factory);
        -                } else {
        -                    return reduceInternal(frame, inliningTarget, factory.createEmptyTuple(), context, getAttrNode, factory);
        -                }
        +        @Specialization(guards = {"isForeignObjectNode.execute(inliningTarget, self)", "interop.isIterator(self)"}, limit = "1")
        +        static int foreign(Object self,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached IsForeignObjectNode isForeignObjectNode,
        +                        @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop,
        +                        @Cached GilNode gil) {
        +            gil.release(true);
        +            try {
        +                return interop.hasIteratorNextElement(self) ? 1 : 0;
        +            } catch (UnsupportedMessageException e) {
        +                throw CompilerDirectives.shouldNotReachHere("iterator claimed to be iterator but wasn't");
        +            } finally {
        +                gil.acquire();
                     }
        +        }
        +    }
         
        -            @Specialization
        -            Object reduce(VirtualFrame frame, PHashingStorageIterator self,
        -                            @Bind("this") Node inliningTarget,
        -                            @Cached SequenceStorageNodes.CreateStorageFromIteratorNode storageNode,
        -                            // unused profile to avoid mixing shared and non-shared inlined nodes
        -                            @SuppressWarnings("unused") @Shared @Cached InlinedConditionProfile exhaustedProfile,
        -                            @Shared @Cached PyObjectGetAttr getAttrNode,
        -                            @Shared @Cached PythonObjectFactory factory) {
        -                int index = self.index;
        -                boolean isExhausted = self.isExhausted();
        -                int state = self.getIterator().getState();
        -                PList list = factory.createList(storageNode.execute(frame, self));
        -                self.getIterator().setState(state);
        -                self.setExhausted(isExhausted);
        -                self.index = index;
        -                return reduceInternal(frame, inliningTarget, list, PythonContext.get(this), getAttrNode, factory);
        -            }
        +    @Builtin(name = J___REDUCE__, minNumOfPositionalArgs = 1)
        +    @GenerateNodeFactory
        +    public abstract static class ReduceNode extends PythonUnaryBuiltinNode {
         
        -            @Specialization
        -            Object reduce(VirtualFrame frame, PIntegerSequenceIterator self,
        -                            @Bind("this") Node inliningTarget,
        -                            @Shared @Cached PyObjectGetAttr getAttrNode,
        -                            @Shared @Cached PythonObjectFactory factory) {
        -                PythonContext context = PythonContext.get(this);
        -                if (self.isExhausted()) {
        -                    return reduceInternal(frame, inliningTarget, factory.createList(), null, context, getAttrNode, factory);
        -                }
        -                return reduceInternal(frame, inliningTarget, self.getObject(), self.getIndex(), context, getAttrNode, factory);
        +        @Specialization
        +        static Object reduce(VirtualFrame frame, PArrayIterator self,
        +                        @Bind("this") Node inliningTarget,
        +                        @Bind PythonContext context,
        +                        @Shared @Cached InlinedConditionProfile exhaustedProfile,
        +                        @Shared @Cached PyObjectGetAttr getAttrNode) {
        +            if (!exhaustedProfile.profile(inliningTarget, self.isExhausted())) {
        +                return reduceInternal(frame, inliningTarget, self.array, self.getIndex(), context, getAttrNode);
        +            } else {
        +                return reduceInternal(frame, inliningTarget, PFactory.createEmptyTuple(context.getLanguage(inliningTarget)), context, getAttrNode);
                     }
        +        }
         
        -            @Specialization
        -            Object reduce(VirtualFrame frame, PPrimitiveIterator self,
        -                            @Bind("this") Node inliningTarget,
        -                            @Shared @Cached PyObjectGetAttr getAttrNode,
        -                            @Shared @Cached PythonObjectFactory factory) {
        -                PythonContext context = PythonContext.get(this);
        -                if (self.isExhausted()) {
        -                    return reduceInternal(frame, inliningTarget, factory.createList(), null, context, getAttrNode, factory);
        -                }
        -                return reduceInternal(frame, inliningTarget, self.getObject(), self.getIndex(), context, getAttrNode, factory);
        -            }
        +        @Specialization
        +        static Object reduce(VirtualFrame frame, PHashingStorageIterator self,
        +                        @Bind("this") Node inliningTarget,
        +                        @Bind PythonContext context,
        +                        @Cached SequenceStorageNodes.CreateStorageFromIteratorNode storageNode,
        +                        // unused profile to avoid mixing shared and non-shared inlined nodes
        +                        @SuppressWarnings("unused") @Shared @Cached InlinedConditionProfile exhaustedProfile,
        +                        @Shared @Cached PyObjectGetAttr getAttrNode) {
        +            int index = self.index;
        +            boolean isExhausted = self.isExhausted();
        +            int state = self.getIterator().getState();
        +            PList list = PFactory.createList(context.getLanguage(inliningTarget), storageNode.execute(frame, self));
        +            self.getIterator().setState(state);
        +            self.setExhausted(isExhausted);
        +            self.index = index;
        +            return reduceInternal(frame, inliningTarget, list, context, getAttrNode);
        +        }
         
        -            @Specialization
        -            Object reduce(VirtualFrame frame, PStringIterator self,
        -                            @Bind("this") Node inliningTarget,
        -                            @Shared @Cached PyObjectGetAttr getAttrNode,
        -                            @Shared @Cached PythonObjectFactory factory) {
        -                PythonContext context = PythonContext.get(this);
        -                if (self.isExhausted()) {
        -                    return reduceInternal(frame, inliningTarget, T_EMPTY_STRING, null, context, getAttrNode, factory);
        -                }
        -                return reduceInternal(frame, inliningTarget, self.value, self.getIndex(), context, getAttrNode, factory);
        +        @Specialization
        +        static Object reduce(VirtualFrame frame, PIntegerSequenceIterator self,
        +                        @Bind("this") Node inliningTarget,
        +                        @Bind PythonContext context,
        +                        @Shared @Cached PyObjectGetAttr getAttrNode) {
        +            if (self.isExhausted()) {
        +                return reduceInternal(frame, inliningTarget, PFactory.createList(context.getLanguage(inliningTarget)), null, context, getAttrNode);
                     }
        +            return reduceInternal(frame, inliningTarget, self.getObject(), self.getIndex(), context, getAttrNode);
        +        }
         
        -            @Specialization
        -            Object reduce(VirtualFrame frame, PIntRangeIterator self,
        -                            @Bind("this") Node inliningTarget,
        -                            @Shared @Cached PyObjectGetAttr getAttrNode,
        -                            @Shared @Cached PythonObjectFactory factory) {
        -                int start = self.getStart();
        -                int stop = self.getStop();
        -                int step = self.getStep();
        -                int len = self.getLen();
        -                return reduceInternal(frame, inliningTarget, factory.createIntRange(start, stop, step, len), self.getIndex(), PythonContext.get(this), getAttrNode, factory);
        +        @Specialization
        +        static Object reduce(VirtualFrame frame, PPrimitiveIterator self,
        +                        @Bind("this") Node inliningTarget,
        +                        @Bind PythonContext context,
        +                        @Shared @Cached PyObjectGetAttr getAttrNode) {
        +            if (self.isExhausted()) {
        +                return reduceInternal(frame, inliningTarget, PFactory.createList(context.getLanguage(inliningTarget)), null, context, getAttrNode);
                     }
        +            return reduceInternal(frame, inliningTarget, self.getObject(), self.getIndex(), context, getAttrNode);
        +        }
         
        -            @Specialization
        -            Object reduce(VirtualFrame frame, PBigRangeIterator self,
        -                            @Bind("this") Node inliningTarget,
        -                            @Shared @Cached PyObjectGetAttr getAttrNode,
        -                            @Shared @Cached PythonObjectFactory factory) {
        -                PInt start = self.getStart();
        -                PInt stop = self.getStop();
        -                PInt step = self.getStep();
        -                PInt len = self.getLen();
        -                return reduceInternal(frame, inliningTarget, factory.createBigRange(start, stop, step, len), self.getLongIndex(factory), PythonContext.get(this), getAttrNode, factory);
        +        @Specialization
        +        static Object reduce(VirtualFrame frame, PStringIterator self,
        +                        @Bind("this") Node inliningTarget,
        +                        @Bind PythonContext context,
        +                        @Shared @Cached PyObjectGetAttr getAttrNode) {
        +            if (self.isExhausted()) {
        +                return reduceInternal(frame, inliningTarget, T_EMPTY_STRING, null, context, getAttrNode);
                     }
        +            return reduceInternal(frame, inliningTarget, self.value, self.getIndex(), context, getAttrNode);
        +        }
         
        -            @Specialization(guards = "self.isPSequence()")
        -            Object reduce(VirtualFrame frame, PSequenceIterator self,
        -                            @Bind("this") Node inliningTarget,
        -                            @Shared @Cached PyObjectGetAttr getAttrNode,
        -                            @Shared @Cached PythonObjectFactory factory) {
        -                PythonContext context = PythonContext.get(this);
        -                if (self.isExhausted()) {
        -                    return reduceInternal(frame, inliningTarget, factory.createTuple(new Object[0]), null, context, getAttrNode, factory);
        -                }
        -                return reduceInternal(frame, inliningTarget, self.getPSequence(), self.getIndex(), context, getAttrNode, factory);
        -            }
        +        @Specialization
        +        static Object reduce(VirtualFrame frame, PIntRangeIterator self,
        +                        @Bind("this") Node inliningTarget,
        +                        @Bind PythonContext context,
        +                        @Shared @Cached PyObjectGetAttr getAttrNode) {
        +            int start = self.getStart();
        +            int stop = self.getStop();
        +            int step = self.getStep();
        +            int len = self.getLen();
        +            PythonLanguage language = context.getLanguage(inliningTarget);
        +            return reduceInternal(frame, inliningTarget, PFactory.createIntRange(language, start, stop, step, len), self.getIndex(), context, getAttrNode);
        +        }
         
        -            @Specialization(guards = "!self.isPSequence()")
        -            Object reduceNonSeq(@SuppressWarnings({"unused"}) VirtualFrame frame, PSequenceIterator self,
        -                            @Bind("this") Node inliningTarget,
        -                            @Shared @Cached PyObjectGetAttr getAttrNode,
        -                            @Shared @Cached PythonObjectFactory factory) {
        -                PythonContext context = PythonContext.get(this);
        -                if (!self.isExhausted()) {
        -                    return reduceInternal(frame, inliningTarget, self.getObject(), self.getIndex(), context, getAttrNode, factory);
        -                } else {
        -                    return reduceInternal(frame, inliningTarget, factory.createTuple(new Object[0]), null, context, getAttrNode, factory);
        -                }
        +        @Specialization
        +        static Object reduce(VirtualFrame frame, PBigRangeIterator self,
        +                        @Bind("this") Node inliningTarget,
        +                        @Bind PythonContext context,
        +                        @Shared @Cached PyObjectGetAttr getAttrNode) {
        +            PInt start = self.getStart();
        +            PInt stop = self.getStop();
        +            PInt step = self.getStep();
        +            PInt len = self.getLen();
        +            PythonLanguage language = context.getLanguage(inliningTarget);
        +            return reduceInternal(frame, inliningTarget, PFactory.createBigRange(language, start, stop, step, len), self.getLongIndex(language), context, getAttrNode);
        +        }
        +
        +        @Specialization(guards = "self.isPSequence()")
        +        static Object reduce(VirtualFrame frame, PSequenceIterator self,
        +                        @Bind("this") Node inliningTarget,
        +                        @Bind PythonContext context,
        +                        @Shared @Cached PyObjectGetAttr getAttrNode) {
        +            if (self.isExhausted()) {
        +                return reduceInternal(frame, inliningTarget, PFactory.createTuple(context.getLanguage(inliningTarget), new Object[0]), null, context, getAttrNode);
                     }
        +            return reduceInternal(frame, inliningTarget, self.getPSequence(), self.getIndex(), context, getAttrNode);
        +        }
         
        -            private static PTuple reduceInternal(VirtualFrame frame, Node inliningTarget, Object arg, PythonContext context, PyObjectGetAttr getAttrNode, PythonObjectFactory factory) {
        -                return reduceInternal(frame, inliningTarget, arg, null, context, getAttrNode, factory);
        +        @Specialization(guards = "!self.isPSequence()")
        +        static Object reduceNonSeq(@SuppressWarnings({"unused"}) VirtualFrame frame, PSequenceIterator self,
        +                        @Bind("this") Node inliningTarget,
        +                        @Bind PythonContext context,
        +                        @Shared @Cached PyObjectGetAttr getAttrNode) {
        +            if (!self.isExhausted()) {
        +                return reduceInternal(frame, inliningTarget, self.getObject(), self.getIndex(), context, getAttrNode);
        +            } else {
        +                return reduceInternal(frame, inliningTarget, PFactory.createTuple(context.getLanguage(inliningTarget), new Object[0]), null, context, getAttrNode);
                     }
        +        }
         
        -            private static PTuple reduceInternal(VirtualFrame frame, Node inliningTarget, Object arg, Object state, PythonContext context, PyObjectGetAttr getAttrNode, PythonObjectFactory factory) {
        -                PythonModule builtins = context.getBuiltins();
        -                Object iter = getAttrNode.execute(frame, inliningTarget, builtins, T_ITER);
        -                PTuple args = factory.createTuple(new Object[]{arg});
        -                // callable, args, state (optional)
        -                if (state != null) {
        -                    return factory.createTuple(new Object[]{iter, args, state});
        -                } else {
        -                    return factory.createTuple(new Object[]{iter, args});
        -                }
        -            }
        +        @Fallback
        +        static int other(Object self,
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, TypeError, DESCRIPTOR_REQUIRES_S_OBJ_RECEIVED_P, "iterator", self);
        +        }
        +
        +        private static PTuple reduceInternal(VirtualFrame frame, Node inliningTarget, Object arg, PythonContext context, PyObjectGetAttr getAttrNode) {
        +            return reduceInternal(frame, inliningTarget, arg, null, context, getAttrNode);
                 }
         
        +        private static PTuple reduceInternal(VirtualFrame frame, Node inliningTarget, Object arg, Object state, PythonContext context, PyObjectGetAttr getAttrNode) {
        +            PythonModule builtins = context.getBuiltins();
        +            PythonLanguage language = context.getLanguage(inliningTarget);
        +            Object iter = getAttrNode.execute(frame, inliningTarget, builtins, T_ITER);
        +            PTuple args = PFactory.createTuple(language, new Object[]{arg});
        +            // callable, args, state (optional)
        +            if (state != null) {
        +                return PFactory.createTuple(language, new Object[]{iter, args, state});
        +            } else {
        +                return PFactory.createTuple(language, new Object[]{iter, args});
        +            }
        +        }
             }
         
             @Builtin(name = J___SETSTATE__, minNumOfPositionalArgs = 2)
        @@ -561,7 +598,7 @@ private static PTuple reduceInternal(VirtualFrame frame, Node inliningTarget, Ob
             public abstract static class SetStateNode extends PythonBinaryBuiltinNode {
                 @Specialization
                 @TruffleBoundary
        -        public static Object reduce(PBigRangeIterator self, Object index,
        +        static Object setstate(PBigRangeIterator self, Object index,
                                 @Bind("this") Node inliningTarget,
                                 @Cached CastToJavaBigIntegerNode castToJavaBigIntegerNode) {
                     BigInteger idx = castToJavaBigIntegerNode.execute(inliningTarget, index);
        @@ -573,7 +610,7 @@ public static Object reduce(PBigRangeIterator self, Object index,
                 }
         
                 @Specialization(guards = "!isPBigRangeIterator(self)")
        -        public static Object reduce(VirtualFrame frame, PBuiltinIterator self, Object index,
        +        static Object setstate(VirtualFrame frame, PBuiltinIterator self, Object index,
                                 @Bind("this") Node inliningTarget,
                                 @Cached PyNumberAsSizeNode asSizeNode) {
                     int idx = asSizeNode.executeExact(frame, inliningTarget, index);
        @@ -584,6 +621,12 @@ public static Object reduce(VirtualFrame frame, PBuiltinIterator self, Object in
                     return PNone.NONE;
                 }
         
        +        @Fallback
        +        static Object other(Object self, Object index,
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, TypeError, DESCRIPTOR_REQUIRES_S_OBJ_RECEIVED_P, "iterator", self);
        +        }
        +
                 protected static boolean isPBigRangeIterator(Object obj) {
                     return obj instanceof PBigRangeIterator;
                 }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/IteratorNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/IteratorNodes.java
        index 3ba590ad02..d7563f4347 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/IteratorNodes.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/IteratorNodes.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -61,12 +61,12 @@
         import com.oracle.graal.python.builtins.objects.str.PString;
         import com.oracle.graal.python.builtins.objects.str.StringNodes;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot;
         import com.oracle.graal.python.builtins.objects.type.TpSlots;
         import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.CallSlotLenNode;
        -import com.oracle.graal.python.lib.GetNextNode;
        +import com.oracle.graal.python.lib.IteratorExhausted;
         import com.oracle.graal.python.lib.PyIndexCheckNode;
        +import com.oracle.graal.python.lib.PyIterNextNode;
         import com.oracle.graal.python.lib.PyNumberAsSizeNode;
         import com.oracle.graal.python.lib.PyObjectGetIter;
         import com.oracle.graal.python.nodes.ErrorMessages;
        @@ -75,13 +75,11 @@
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.SpecialMethodNames;
         import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode;
        -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode;
        +import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodNode;
         import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile;
         import com.oracle.graal.python.nodes.object.GetClassNode;
         import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode;
        -import com.oracle.graal.python.nodes.object.IsForeignObjectNode;
         import com.oracle.graal.python.nodes.util.CastBuiltinStringToTruffleStringNode;
        -import com.oracle.graal.python.runtime.GilNode;
         import com.oracle.graal.python.runtime.exception.PException;
         import com.oracle.graal.python.runtime.sequence.PSequence;
         import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
        @@ -98,9 +96,6 @@
         import com.oracle.truffle.api.dsl.ImportStatic;
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
        -import com.oracle.truffle.api.interop.InteropLibrary;
        -import com.oracle.truffle.api.interop.UnsupportedMessageException;
        -import com.oracle.truffle.api.library.CachedLibrary;
         import com.oracle.truffle.api.nodes.Node;
         import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile;
        @@ -116,7 +111,7 @@ public abstract class IteratorNodes {
              */
             @GenerateInline
             @GenerateCached(false)
        -    @ImportStatic({PGuards.class, SpecialMethodNames.class, SpecialMethodSlot.class})
        +    @ImportStatic({PGuards.class, SpecialMethodNames.class})
             public abstract static class GetLength extends PNodeWithContext {
         
                 public abstract int execute(VirtualFrame frame, Node inliningTarget, Object iterable);
        @@ -172,25 +167,17 @@ static int length(@SuppressWarnings("unused") PNone iterable) {
                 @Fallback
                 @InliningCutoff
                 static int length(VirtualFrame frame, Node inliningTarget, Object iterable,
        -                        @Cached IsForeignObjectNode isForeignObjectNode,
        -                        @Cached(inline = false) GetLengthForeign getLengthForeign,
                                 @Cached GetClassNode getClassNode,
                                 @Cached GetCachedTpSlotsNode getSlotsNode,
                                 @Cached PyIndexCheckNode indexCheckNode,
                                 @Cached PyNumberAsSizeNode asSizeNode,
        -                        @Cached(value = "create(LengthHint)", inline = false) LookupSpecialMethodSlotNode lenHintNode,
        +                        @Cached LookupSpecialMethodNode.Dynamic lenHintNode,
                                 @Cached CallSlotLenNode callSlotLenNode,
                                 @Cached(inline = false) CallUnaryMethodNode dispatchLenOrLenHint,
                                 @Cached IsBuiltinObjectProfile errorProfile,
                                 @Cached InlinedConditionProfile hasLenProfile,
                                 @Cached InlinedConditionProfile hasLengthHintProfile,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        -            if (isForeignObjectNode.execute(inliningTarget, iterable)) {
        -                int foreignLen = getLengthForeign.execute(iterable);
        -                if (foreignLen != -1) {
        -                    return foreignLen;
        -                }
        -            }
        +                        @Cached PRaiseNode raiseNode) {
                     Object clazz = getClassNode.execute(inliningTarget, iterable);
                     TpSlots slots = getSlotsNode.execute(inliningTarget, clazz);
                     if (hasLenProfile.profile(inliningTarget, slots.combined_sq_mp_length() != null)) {
        @@ -203,9 +190,7 @@ static int length(VirtualFrame frame, Node inliningTarget, Object iterable,
                             e.expect(inliningTarget, TypeError, errorProfile);
                         }
                     }
        -            // TODO: __len_hint__ is not a slot, but it is resolved using _PyObject_LookupSpecial,
        -            // so looked up only on type, so we can cache it in slots
        -            Object attrLenHintObj = lenHintNode.execute(frame, clazz, iterable);
        +            Object attrLenHintObj = lenHintNode.execute(frame, inliningTarget, clazz, T___LENGTH_HINT__, iterable);
                     if (hasLengthHintProfile.profile(inliningTarget, attrLenHintObj != PNone.NO_VALUE)) {
                         Object len = null;
                         try {
        @@ -217,11 +202,11 @@ static int length(VirtualFrame frame, Node inliningTarget, Object iterable,
                             if (indexCheckNode.execute(inliningTarget, len)) {
                                 int intLen = asSizeNode.executeExact(frame, inliningTarget, len);
                                 if (intLen < 0) {
        -                            throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.LENGTH_HINT_SHOULD_RETURN_MT_ZERO);
        +                            throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.LENGTH_HINT_SHOULD_RETURN_MT_ZERO);
                                 }
                                 return intLen;
                             } else {
        -                        throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MUST_BE_INTEGER_NOT_P, T___LENGTH_HINT__, len);
        +                        throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MUST_BE_INTEGER_NOT_P, T___LENGTH_HINT__, len);
                             }
                         }
                     }
        @@ -229,35 +214,6 @@ static int length(VirtualFrame frame, Node inliningTarget, Object iterable,
                 }
             }
         
        -    /**
        -     * Handles the special case of foreign Strings. If the input is not a string, returns -1.
        -     */
        -    @GenerateInline(false) // Intentionally lazy initialized
        -    public abstract static class GetLengthForeign extends PNodeWithContext {
        -        public abstract int execute(Object foreign);
        -
        -        @Specialization
        -        static int doIt(Object foreign,
        -                        @Bind("this") Node inliningTarget,
        -                        @Cached InlinedConditionProfile isString,
        -                        @CachedLibrary(limit = "3") InteropLibrary iLib,
        -                        @Cached TruffleString.SwitchEncodingNode switchEncodingNode,
        -                        @Cached TruffleString.CodePointLengthNode codePointLengthNode,
        -                        @Cached GilNode gil) {
        -            if (isString.profile(inliningTarget, iLib.isString(foreign))) {
        -                gil.release(true);
        -                try {
        -                    return codePointLengthNode.execute(switchEncodingNode.execute(iLib.asTruffleString(foreign), TS_ENCODING), TS_ENCODING);
        -                } catch (UnsupportedMessageException e) {
        -                    throw CompilerDirectives.shouldNotReachHere();
        -                } finally {
        -                    gil.acquire();
        -                }
        -            }
        -            return -1;
        -        }
        -    }
        -
             @ImportStatic(PGuards.class)
             @GenerateInline
             @GenerateCached(false)
        @@ -409,19 +365,19 @@ public static Object[] doIt(PSequence iterable,
                 @Fallback
                 public static Object[] doIt(VirtualFrame frame, Object iterable,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached GetNextNode getNextNode,
        -                        @Cached IsBuiltinObjectProfile stopIterationProfile,
        -                        @Cached PyObjectGetIter getIter) {
        +                        @Cached PyObjectGetIter getIter,
        +                        @Cached PyIterNextNode nextNode) {
                     Object it = getIter.execute(frame, inliningTarget, iterable);
                     List result = createlist();
                     while (true) {
                         try {
        -                    result.add(getNextNode.execute(frame, it));
        -                } catch (PException e) {
        -                    e.expectStopIteration(inliningTarget, stopIterationProfile);
        -                    return result.toArray(new Object[result.size()]);
        +                    Object next = nextNode.execute(frame, inliningTarget, it);
        +                    result.add(next);
        +                } catch (IteratorExhausted e) {
        +                    break;
                         }
                     }
        +            return result.toArray(new Object[result.size()]);
                 }
         
                 @TruffleBoundary
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/PBigRangeIterator.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/PBigRangeIterator.java
        index b5272521dc..21a3cff0ba 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/PBigRangeIterator.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/PBigRangeIterator.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -42,8 +42,9 @@
         
         import java.math.BigInteger;
         
        +import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.builtins.objects.ints.PInt;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
         import com.oracle.truffle.api.object.Shape;
         
        @@ -98,8 +99,8 @@ public PInt getLen() {
                 return len;
             }
         
        -    public PInt getLongIndex(PythonObjectFactory factory) {
        -        return factory.createInt(longIndex);
        +    public PInt getLongIndex(PythonLanguage language) {
        +        return PFactory.createInt(language, longIndex);
             }
         
             public void setLongIndex(BigInteger idx) {
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/PForeignArrayIterator.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/PForeignArrayIterator.java
        deleted file mode 100644
        index 50c22c4c75..0000000000
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/PForeignArrayIterator.java
        +++ /dev/null
        @@ -1,81 +0,0 @@
        -/*
        - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
        - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        - *
        - * The Universal Permissive License (UPL), Version 1.0
        - *
        - * Subject to the condition set forth below, permission is hereby granted to any
        - * person obtaining a copy of this software, associated documentation and/or
        - * data (collectively the "Software"), free of charge and under any and all
        - * copyright rights in the Software, and any and all patent rights owned or
        - * freely licensable by each licensor hereunder covering either (i) the
        - * unmodified Software as contributed to or provided by such licensor, or (ii)
        - * the Larger Works (as defined below), to deal in both
        - *
        - * (a) the Software, and
        - *
        - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
        - * one is included with the Software each a "Larger Work" to which the Software
        - * is contributed by such licensors),
        - *
        - * without restriction, including without limitation the rights to copy, create
        - * derivative works of, display, perform, and distribute the Software and make,
        - * use, sell, offer for sale, import, export, have made, and have sold the
        - * Software and the Larger Work(s), and to sublicense the foregoing rights on
        - * either these or other terms.
        - *
        - * This license is subject to the following condition:
        - *
        - * The above copyright notice and either this complete permission notice or at a
        - * minimum a reference to the UPL must be included in all copies or substantial
        - * portions of the Software.
        - *
        - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        - * SOFTWARE.
        - */
        -// skip GIL
        -package com.oracle.graal.python.builtins.objects.iterator;
        -
        -import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
        -import com.oracle.graal.python.lib.PyNumberAsSizeNode;
        -import com.oracle.truffle.api.interop.InteropLibrary;
        -import com.oracle.truffle.api.interop.UnsupportedMessageException;
        -import com.oracle.truffle.api.nodes.Node;
        -import com.oracle.truffle.api.object.Shape;
        -
        -public final class PForeignArrayIterator extends PythonBuiltinObject {
        -
        -    private final Object foreignArray;
        -    private int cursor;
        -
        -    public PForeignArrayIterator(Object cls, Shape instanceShape, Object foreignArray) {
        -        super(cls, instanceShape);
        -        this.foreignArray = foreignArray;
        -    }
        -
        -    public Object getForeignArray() {
        -        return foreignArray;
        -    }
        -
        -    public int getSize(InteropLibrary lib, Node inliningTarget, PyNumberAsSizeNode asSizeNode) {
        -        try {
        -            final long size = lib.getArraySize(foreignArray);
        -            return asSizeNode.executeExact(null, inliningTarget, size);
        -        } catch (UnsupportedMessageException ex) {
        -            return 0;
        -        }
        -    }
        -
        -    public int getCursor() {
        -        return cursor;
        -    }
        -
        -    public int advance() {
        -        return cursor++;
        -    }
        -}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/PZipBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/PZipBuiltins.java
        deleted file mode 100644
        index b2cf04b42a..0000000000
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/PZipBuiltins.java
        +++ /dev/null
        @@ -1,163 +0,0 @@
        -/*
        - * Copyright (c) 2017, 2023, Oracle and/or its affiliates.
        - * Copyright (c) 2014, Regents of the University of California
        - *
        - * All rights reserved.
        - *
        - * Redistribution and use in source and binary forms, with or without modification, are
        - * permitted provided that the following conditions are met:
        - *
        - * 1. Redistributions of source code must retain the above copyright notice, this list of
        - * conditions and the following disclaimer.
        - * 2. Redistributions in binary form must reproduce the above copyright notice, this list of
        - * conditions and the following disclaimer in the documentation and/or other materials provided
        - * with the distribution.
        - *
        - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
        - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
        - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
        - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
        - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
        - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
        - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
        - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
        - * OF THE POSSIBILITY OF SUCH DAMAGE.
        - */
        -package com.oracle.graal.python.builtins.objects.iterator;
        -
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__;
        -
        -import java.util.List;
        -
        -import com.oracle.graal.python.builtins.Builtin;
        -import com.oracle.graal.python.builtins.CoreFunctions;
        -import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        -import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.builtins.objects.PNone;
        -import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        -import com.oracle.graal.python.lib.GetNextNode;
        -import com.oracle.graal.python.lib.PyObjectIsTrueNode;
        -import com.oracle.graal.python.nodes.ErrorMessages;
        -import com.oracle.graal.python.nodes.PRaiseNode;
        -import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
        -import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
        -import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile;
        -import com.oracle.graal.python.nodes.object.GetClassNode;
        -import com.oracle.graal.python.runtime.exception.PException;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        -import com.oracle.truffle.api.dsl.Bind;
        -import com.oracle.truffle.api.dsl.Cached;
        -import com.oracle.truffle.api.dsl.Cached.Shared;
        -import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        -import com.oracle.truffle.api.dsl.NodeFactory;
        -import com.oracle.truffle.api.dsl.Specialization;
        -import com.oracle.truffle.api.frame.VirtualFrame;
        -import com.oracle.truffle.api.nodes.Node;
        -import com.oracle.truffle.api.profiles.InlinedConditionProfile;
        -
        -@CoreFunctions(extendClasses = PythonBuiltinClassType.PZip)
        -public final class PZipBuiltins extends PythonBuiltins {
        -
        -    @Override
        -    protected List> getNodeFactories() {
        -        return PZipBuiltinsFactory.getFactories();
        -    }
        -
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        -    @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        -
        -        @Specialization(guards = "isEmpty(self.getIterators())")
        -        static Object doEmpty(@SuppressWarnings("unused") PZip self,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raiseStopIteration();
        -        }
        -
        -        @Specialization(guards = {"!isEmpty(self.getIterators())", "!self.isStrict()"})
        -        static Object doNext(VirtualFrame frame, PZip self,
        -                        @Shared @Cached GetNextNode next,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            Object[] iterators = self.getIterators();
        -            Object[] tupleElements = new Object[iterators.length];
        -            for (int i = 0; i < iterators.length; i++) {
        -                tupleElements[i] = next.execute(frame, iterators[i]);
        -            }
        -            return factory.createTuple(tupleElements);
        -        }
        -
        -        @Specialization(guards = {"!isEmpty(self.getIterators())", "self.isStrict()"})
        -        static Object doNext(VirtualFrame frame, PZip self,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached GetNextNode next,
        -                        @Cached IsBuiltinObjectProfile classProfile,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        -            Object[] iterators = self.getIterators();
        -            Object[] tupleElements = new Object[iterators.length];
        -            int i = 0;
        -            try {
        -                for (; i < iterators.length; i++) {
        -                    tupleElements[i] = next.execute(frame, iterators[i]);
        -                }
        -                return factory.createTuple(tupleElements);
        -            } catch (PException e) {
        -                e.expectStopIteration(inliningTarget, classProfile);
        -                if (i > 0) {
        -                    throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.ZIP_ARG_D_IS_SHORTER_THEN_ARG_SD, i + 1, i == 1 ? " " : "s 1-", i);
        -                }
        -                for (i = 1; i < iterators.length; i++) {
        -                    try {
        -                        next.execute(frame, iterators[i]);
        -                        throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.ZIP_ARG_D_IS_LONGER_THEN_ARG_SD, i + 1, i == 1 ? " " : "s 1-", i);
        -                    } catch (PException e2) {
        -                        e2.expectStopIteration(inliningTarget, classProfile);
        -                    }
        -                }
        -                throw e;
        -            }
        -        }
        -    }
        -
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        -    @GenerateNodeFactory
        -    public abstract static class IterNode extends PythonUnaryBuiltinNode {
        -
        -        @Specialization
        -        static Object doPZip(PZip self) {
        -            return self;
        -        }
        -    }
        -
        -    @Builtin(name = J___REDUCE__, minNumOfPositionalArgs = 1)
        -    @GenerateNodeFactory
        -    public abstract static class ReduceNode extends PythonUnaryBuiltinNode {
        -
        -        @Specialization
        -        static Object reduce(PZip self,
        -                        @Bind("this") Node inliningTarget,
        -                        @Cached InlinedConditionProfile strictProfile,
        -                        @Cached GetClassNode getClass,
        -                        @Cached PythonObjectFactory factory) {
        -            Object type = getClass.execute(inliningTarget, self);
        -            PTuple tuple = factory.createTuple(self.getIterators());
        -            Object[] elements = strictProfile.profile(inliningTarget, self.isStrict()) ? new Object[]{type, tuple, true} : new Object[]{type, tuple};
        -            return factory.createTuple(elements);
        -        }
        -    }
        -
        -    @Builtin(name = J___SETSTATE__, minNumOfPositionalArgs = 2)
        -    @GenerateNodeFactory
        -    abstract static class SetStateNode extends PythonBinaryBuiltinNode {
        -        @Specialization
        -        Object doit(VirtualFrame frame, PZip self, Object state,
        -                        @Bind("this") Node inliningTarget,
        -                        @Cached PyObjectIsTrueNode isTrueNode) {
        -            self.setStrict(isTrueNode.execute(frame, inliningTarget, state));
        -            return PNone.NONE;
        -        }
        -    }
        -}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/SentinelIteratorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/SentinelIteratorBuiltins.java
        index 96d3fbb4a8..8f67a0fe2e 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/SentinelIteratorBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/SentinelIteratorBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2017, 2024, Oracle and/or its affiliates.
        + * Copyright (c) 2017, 2025, Oracle and/or its affiliates.
          * Copyright (c) 2013, Regents of the University of California
          *
          * All rights reserved.
        @@ -26,27 +26,29 @@
         package com.oracle.graal.python.builtins.objects.iterator;
         
         import static com.oracle.graal.python.nodes.BuiltinNames.T_ITER;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
         import com.oracle.graal.python.builtins.objects.module.PythonModule;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
         import com.oracle.graal.python.lib.PyObjectGetAttr;
         import com.oracle.graal.python.lib.PyObjectRichCompareBool;
        -import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.call.CallNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
         import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile;
         import com.oracle.graal.python.runtime.PythonContext;
         import com.oracle.graal.python.runtime.exception.PException;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        @@ -58,23 +60,24 @@
         @CoreFunctions(extendClasses = PythonBuiltinClassType.PSentinelIterator)
         public final class SentinelIteratorBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = SentinelIteratorBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return SentinelIteratorBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization
                 static Object doIterator(VirtualFrame frame, PSentinelIterator iterator,
                                 @Bind("this") Node inliningTarget,
                                 @Cached CallNode callNode,
                                 @Cached IsBuiltinObjectProfile errorProfile,
        -                        @Cached PyObjectRichCompareBool.EqNode eqNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PyObjectRichCompareBool eqNode) {
                     if (iterator.sentinelReached()) {
        -                throw raiseNode.get(inliningTarget).raiseStopIteration();
        +                throw iteratorExhausted();
                     }
                     Object nextValue;
                     try {
        @@ -82,18 +85,18 @@ static Object doIterator(VirtualFrame frame, PSentinelIterator iterator,
                     } catch (PException e) {
                         e.expectStopIteration(inliningTarget, errorProfile);
                         iterator.markSentinelReached();
        -                throw e;
        +                throw iteratorExhausted();
                     }
        -            boolean iteratorDone = eqNode.compare(frame, inliningTarget, nextValue, iterator.getSentinel());
        +            boolean iteratorDone = eqNode.executeEq(frame, inliningTarget, nextValue, iterator.getSentinel());
                     if (iteratorDone) {
                         iterator.markSentinelReached();
        -                throw raiseNode.get(inliningTarget).raiseStopIteration();
        +                throw iteratorExhausted();
                     }
                     return nextValue;
                 }
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
         
        @@ -110,16 +113,16 @@ abstract static class ReduceNode extends PythonUnaryBuiltinNode {
                 static Object reduce(VirtualFrame frame, PSentinelIterator self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached PyObjectGetAttr getAttr,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     PythonModule builtins = PythonContext.get(inliningTarget).getBuiltins();
                     Object iter = getAttr.execute(frame, inliningTarget, builtins, T_ITER);
                     Object[] args;
                     if (self.sentinelReached()) {
        -                args = new Object[]{factory.createEmptyTuple()};
        +                args = new Object[]{PFactory.createEmptyTuple(language)};
                     } else {
                         args = new Object[]{self.getCallable(), self.getSentinel()};
                     }
        -            return factory.createTuple(new Object[]{iter, factory.createTuple(args)});
        +            return PFactory.createTuple(language, new Object[]{iter, PFactory.createTuple(language, args)});
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/ZipBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/ZipBuiltins.java
        new file mode 100644
        index 0000000000..b312d55883
        --- /dev/null
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/ZipBuiltins.java
        @@ -0,0 +1,233 @@
        +/*
        + * Copyright (c) 2017, 2025, Oracle and/or its affiliates.
        + * Copyright (c) 2014, Regents of the University of California
        + *
        + * All rights reserved.
        + *
        + * Redistribution and use in source and binary forms, with or without modification, are
        + * permitted provided that the following conditions are met:
        + *
        + * 1. Redistributions of source code must retain the above copyright notice, this list of
        + * conditions and the following disclaimer.
        + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of
        + * conditions and the following disclaimer in the documentation and/or other materials provided
        + * with the distribution.
        + *
        + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
        + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
        + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
        + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
        + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
        + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
        + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
        + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
        + * OF THE POSSIBILITY OF SUCH DAMAGE.
        + */
        +package com.oracle.graal.python.builtins.objects.iterator;
        +
        +import static com.oracle.graal.python.nodes.BuiltinNames.J_ZIP;
        +import static com.oracle.graal.python.nodes.BuiltinNames.T_ZIP;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__;
        +import static com.oracle.graal.python.nodes.StringLiterals.T_STRICT;
        +import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
        +import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
        +
        +import java.util.List;
        +
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
        +import com.oracle.graal.python.builtins.Builtin;
        +import com.oracle.graal.python.builtins.CoreFunctions;
        +import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        +import com.oracle.graal.python.builtins.PythonBuiltins;
        +import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.function.PKeyword;
        +import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.CallSlotTpIterNextNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
        +import com.oracle.graal.python.lib.IteratorExhausted;
        +import com.oracle.graal.python.lib.PyIterNextNode;
        +import com.oracle.graal.python.lib.PyObjectGetIter;
        +import com.oracle.graal.python.lib.PyObjectIsTrueNode;
        +import com.oracle.graal.python.nodes.ErrorMessages;
        +import com.oracle.graal.python.nodes.PGuards;
        +import com.oracle.graal.python.nodes.PRaiseNode;
        +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
        +import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.nodes.object.GetClassNode;
        +import com.oracle.graal.python.runtime.object.PFactory;
        +import com.oracle.truffle.api.dsl.Bind;
        +import com.oracle.truffle.api.dsl.Cached;
        +import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        +import com.oracle.truffle.api.dsl.NodeFactory;
        +import com.oracle.truffle.api.dsl.Specialization;
        +import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.nodes.LoopNode;
        +import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.profiles.InlinedConditionProfile;
        +import com.oracle.truffle.api.strings.TruffleString;
        +
        +@CoreFunctions(extendClasses = PythonBuiltinClassType.PZip)
        +public final class ZipBuiltins extends PythonBuiltins {
        +
        +    public static final TpSlots SLOTS = ZipBuiltinsSlotsGen.SLOTS;
        +
        +    @Override
        +    protected List> getNodeFactories() {
        +        return ZipBuiltinsFactory.getFactories();
        +    }
        +
        +    // zip(*iterables)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = J_ZIP, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
        +    @GenerateNodeFactory
        +    public abstract static class ZipNode extends PythonBuiltinNode {
        +        static boolean isNoneOrEmptyPKeyword(Object value) {
        +            return PGuards.isPNone(value) || (value instanceof PKeyword[] kw && kw.length == 0);
        +        }
        +
        +        @Specialization(guards = "isNoneOrEmptyPKeyword(kw)")
        +        static PZip zip(VirtualFrame frame, Object cls, Object[] args, @SuppressWarnings("unused") Object kw,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached.Exclusive @Cached PyObjectGetIter getIter,
        +                        @Cached.Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) {
        +            return zip(frame, inliningTarget, cls, args, false, getIter, getInstanceShape);
        +        }
        +
        +        @Specialization(guards = "kw.length == 1")
        +        static PZip zip(VirtualFrame frame, Object cls, Object[] args, PKeyword[] kw,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached TruffleString.EqualNode eqNode,
        +                        @Cached.Exclusive @Cached PyObjectGetIter getIter,
        +                        @Cached PyObjectIsTrueNode isTrueNode,
        +                        @Cached InlinedConditionProfile profile,
        +                        @Cached.Shared @Cached TypeNodes.GetInstanceShape getInstanceShape,
        +                        @Cached.Exclusive @Cached PRaiseNode raiseNode) {
        +            if (profile.profile(inliningTarget, eqNode.execute(kw[0].getName(), T_STRICT, TS_ENCODING))) {
        +                return zip(frame, inliningTarget, cls, args, isTrueNode.execute(frame, kw[0].getValue()), getIter, getInstanceShape);
        +            }
        +            throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_IS_AN_INVALID_ARG_FOR_S, kw[0].getName(), T_ZIP);
        +        }
        +
        +        @Specialization(guards = "kw.length != 1")
        +        static Object zip(@SuppressWarnings("unused") Object cls, @SuppressWarnings("unused") Object[] args, PKeyword[] kw,
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.S_TAKES_AT_MOST_ONE_KEYWORD_ARGUMENT_D_GIVEN, T_ZIP, kw.length);
        +        }
        +
        +        private static PZip zip(VirtualFrame frame, Node inliningTarget, Object cls, Object[] args, boolean strict, PyObjectGetIter getIter, TypeNodes.GetInstanceShape getInstanceShape) {
        +            Object[] iterables = new Object[args.length];
        +            LoopNode.reportLoopCount(inliningTarget, args.length);
        +            for (int i = 0; i < args.length; i++) {
        +                Object item = args[i];
        +                iterables[i] = getIter.execute(frame, inliningTarget, item);
        +            }
        +            return PFactory.createZip(PythonLanguage.get(inliningTarget), cls, getInstanceShape.execute(cls), iterables, strict);
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
        +    @GenerateNodeFactory
        +    public abstract static class NextNode extends TpIterNextBuiltin {
        +
        +        @Specialization(guards = "isEmpty(self.getIterators())")
        +        static Object doEmpty(@SuppressWarnings("unused") PZip self) {
        +            throw iteratorExhausted();
        +        }
        +
        +        @Specialization(guards = {"!isEmpty(self.getIterators())", "!self.isStrict()"})
        +        static Object doNext(VirtualFrame frame, PZip self,
        +                        @Bind Node inliningTarget,
        +                        @Bind PythonLanguage language,
        +                        @Cached GetObjectSlotsNode getSlots,
        +                        @Cached CallSlotTpIterNextNode callIterNext) {
        +            Object[] iterators = self.getIterators();
        +            Object[] tupleElements = new Object[iterators.length];
        +            for (int i = 0; i < iterators.length; i++) {
        +                Object it = iterators[i];
        +                /*
        +                 * Not using PyIterNext because the non-strict version should pass through existing
        +                 * StopIteration
        +                 */
        +                tupleElements[i] = callIterNext.execute(frame, inliningTarget, getSlots.execute(inliningTarget, it).tp_iternext(), it);
        +            }
        +            return PFactory.createTuple(language, tupleElements);
        +        }
        +
        +        @Specialization(guards = {"!isEmpty(self.getIterators())", "self.isStrict()"})
        +        static Object doNext(VirtualFrame frame, PZip self,
        +                        @Bind("this") Node inliningTarget,
        +                        @Bind PythonLanguage language,
        +                        @Cached PyIterNextNode nextNode,
        +                        @Cached PRaiseNode raiseNode) {
        +            Object[] iterators = self.getIterators();
        +            Object[] tupleElements = new Object[iterators.length];
        +            int i = 0;
        +            for (; i < iterators.length; i++) {
        +                try {
        +                    tupleElements[i] = nextNode.execute(frame, inliningTarget, iterators[i]);
        +                } catch (IteratorExhausted e) {
        +                    if (i > 0) {
        +                        throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.ZIP_ARG_D_IS_SHORTER_THEN_ARG_SD, i + 1, i == 1 ? " " : "s 1-", i);
        +                    }
        +                    for (i = 1; i < iterators.length; i++) {
        +                        try {
        +                            nextNode.execute(frame, inliningTarget, iterators[i]);
        +                        } catch (IteratorExhausted e1) {
        +                            continue;
        +                        }
        +                        throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.ZIP_ARG_D_IS_LONGER_THEN_ARG_SD, i + 1, i == 1 ? " " : "s 1-", i);
        +                    }
        +                    throw e;
        +                }
        +            }
        +            return PFactory.createTuple(language, tupleElements);
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
        +    @GenerateNodeFactory
        +    public abstract static class IterNode extends PythonUnaryBuiltinNode {
        +
        +        @Specialization
        +        static Object doPZip(PZip self) {
        +            return self;
        +        }
        +    }
        +
        +    @Builtin(name = J___REDUCE__, minNumOfPositionalArgs = 1)
        +    @GenerateNodeFactory
        +    public abstract static class ReduceNode extends PythonUnaryBuiltinNode {
        +
        +        @Specialization
        +        static Object reduce(PZip self,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached InlinedConditionProfile strictProfile,
        +                        @Cached GetClassNode getClass,
        +                        @Bind PythonLanguage language) {
        +            Object type = getClass.execute(inliningTarget, self);
        +            PTuple tuple = PFactory.createTuple(language, self.getIterators());
        +            Object[] elements = strictProfile.profile(inliningTarget, self.isStrict()) ? new Object[]{type, tuple, true} : new Object[]{type, tuple};
        +            return PFactory.createTuple(language, elements);
        +        }
        +    }
        +
        +    @Builtin(name = J___SETSTATE__, minNumOfPositionalArgs = 2)
        +    @GenerateNodeFactory
        +    abstract static class SetStateNode extends PythonBinaryBuiltinNode {
        +        @Specialization
        +        Object doit(VirtualFrame frame, PZip self, Object state,
        +                        @Cached PyObjectIsTrueNode isTrueNode) {
        +            self.setStrict(isTrueNode.execute(frame, state));
        +            return PNone.NONE;
        +        }
        +    }
        +}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/AccumulateBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/AccumulateBuiltins.java
        index ecd5340a1f..34341e93e0 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/AccumulateBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/AccumulateBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,29 +40,36 @@
          */
         package com.oracle.graal.python.builtins.objects.itertools;
         
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.builtins.modules.BuiltinFunctions;
         import com.oracle.graal.python.builtins.objects.PNone;
         import com.oracle.graal.python.builtins.objects.list.PList;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.CallSlotTpIterNextNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
         import com.oracle.graal.python.lib.PyNumberAddNode;
         import com.oracle.graal.python.lib.PyObjectGetIter;
         import com.oracle.graal.python.nodes.call.CallNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
        +import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
         import com.oracle.graal.python.nodes.object.GetClassNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        @@ -76,12 +83,34 @@
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PAccumulate})
         public final class AccumulateBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = AccumulateBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return AccumulateBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "accumulate", minNumOfPositionalArgs = 2, parameterNames = {"cls", "iterable", "func"}, keywordOnlyNames = {"initial"})
        +    @GenerateNodeFactory
        +    public abstract static class AccumulateNode extends PythonBuiltinNode {
        +
        +        @Specialization
        +        protected static PAccumulate construct(VirtualFrame frame, Object cls, Object iterable, Object func, Object initial,
        +                        @Bind("this") Node inliningTarget,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape,
        +                        @Cached PyObjectGetIter getIter) {
        +            PAccumulate self = PFactory.createAccumulate(language, cls, getInstanceShape.execute(cls));
        +            self.setIterable(getIter.execute(frame, inliningTarget, iterable));
        +            self.setFunc(func instanceof PNone ? null : func);
        +            self.setTotal(null);
        +            self.setInitial(initial instanceof PNone ? null : initial);
        +            return self;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -90,13 +119,14 @@ static Object iter(PAccumulate self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization
                 static Object next(VirtualFrame frame, PAccumulate self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached BuiltinFunctions.NextNode nextNode,
        +                        @Cached GetObjectSlotsNode getSlots,
        +                        @Cached CallSlotTpIterNextNode callIterNext,
                                 @Cached PyNumberAddNode addNode,
                                 @Cached CallNode callNode,
                                 @Cached InlinedBranchProfile hasInitialProfile,
        @@ -108,14 +138,15 @@ static Object next(VirtualFrame frame, PAccumulate self,
                         self.setInitial(null);
                         return self.getTotal();
                     }
        -            Object value = nextNode.execute(frame, self.getIterable(), PNone.NO_VALUE);
        +            Object it = self.getIterable();
        +            Object value = callIterNext.execute(frame, inliningTarget, getSlots.execute(inliningTarget, it).tp_iternext(), it);
                     if (self.getTotal() == null) {
                         markerProfile.enter(inliningTarget);
                         self.setTotal(value);
                         return value;
                     }
                     if (hasFuncProfile.profile(inliningTarget, self.getFunc() == null)) {
        -                self.setTotal(addNode.execute(frame, inliningTarget, self.getTotal(), value));
        +                self.setTotal(addNode.execute(frame, self.getTotal(), value));
                     } else {
                         self.setTotal(callNode.execute(frame, self.getFunc(), self.getTotal(), value));
                     }
        @@ -136,7 +167,7 @@ static Object reduceNoFunc(VirtualFrame frame, PAccumulate self,
                                 @Cached InlinedBranchProfile totalMarkerProfile,
                                 @Cached InlinedBranchProfile elseProfile,
                                 @Cached PyObjectGetIter getIter,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object func = self.getFunc();
                     if (func == null) {
                         func = PNone.NONE;
        @@ -145,39 +176,39 @@ static Object reduceNoFunc(VirtualFrame frame, PAccumulate self,
                         hasInitialProfile.enter(inliningTarget);
         
                         Object type = getClassNode.execute(inliningTarget, self);
        -                PChain chain = factory.createChain(PythonBuiltinClassType.PChain);
        -                chain.setSource(getIter.execute(frame, inliningTarget, factory.createList(new Object[]{self.getIterable()})));
        -                PTuple initialTuple = factory.createTuple(new Object[]{self.getInitial()});
        +                PChain chain = PFactory.createChain(language);
        +                chain.setSource(getIter.execute(frame, inliningTarget, PFactory.createList(language, new Object[]{self.getIterable()})));
        +                PTuple initialTuple = PFactory.createTuple(language, new Object[]{self.getInitial()});
                         chain.setActive(getIter.execute(frame, inliningTarget, initialTuple));
         
        -                PTuple tuple = factory.createTuple(new Object[]{chain, func});
        -                return factory.createTuple(new Object[]{type, tuple, PNone.NONE});
        +                PTuple tuple = PFactory.createTuple(language, new Object[]{chain, func});
        +                return PFactory.createTuple(language, new Object[]{type, tuple, PNone.NONE});
                     } else if (self.getTotal() == PNone.NONE) {
                         totalNoneProfile.enter(inliningTarget);
         
        -                PChain chain = factory.createChain(PythonBuiltinClassType.PChain);
        -                PList noneList = factory.createList(new Object[]{PNone.NONE});
        +                PChain chain = PFactory.createChain(language);
        +                PList noneList = PFactory.createList(language, new Object[]{PNone.NONE});
                         Object noneIter = getIter.execute(frame, inliningTarget, noneList);
        -                chain.setSource(getIter.execute(frame, inliningTarget, factory.createList(new Object[]{noneIter, self.getIterable()})));
        +                chain.setSource(getIter.execute(frame, inliningTarget, PFactory.createList(language, new Object[]{noneIter, self.getIterable()})));
                         chain.setActive(PNone.NONE);
        -                PAccumulate accumulate = factory.createAccumulate(PythonBuiltinClassType.PAccumulate);
        +                PAccumulate accumulate = PFactory.createAccumulate(language);
                         accumulate.setIterable(chain);
                         accumulate.setFunc(func);
         
        -                PTuple tuple = factory.createTuple(new Object[]{accumulate, 1, PNone.NONE});
        -                return factory.createTuple(new Object[]{PythonBuiltinClassType.PIslice, tuple});
        +                PTuple tuple = PFactory.createTuple(language, new Object[]{accumulate, 1, PNone.NONE});
        +                return PFactory.createTuple(language, new Object[]{PythonBuiltinClassType.PIslice, tuple});
                     } else if (self.getTotal() != null) {
                         totalMarkerProfile.enter(inliningTarget);
         
                         Object type = getClassNode.execute(inliningTarget, self);
        -                PTuple tuple = factory.createTuple(new Object[]{self.getIterable(), func});
        -                return factory.createTuple(new Object[]{type, tuple, self.getTotal()});
        +                PTuple tuple = PFactory.createTuple(language, new Object[]{self.getIterable(), func});
        +                return PFactory.createTuple(language, new Object[]{type, tuple, self.getTotal()});
                     } else {
                         elseProfile.enter(inliningTarget);
         
                         Object type = getClassNode.execute(inliningTarget, self);
        -                PTuple tuple = factory.createTuple(new Object[]{self.getIterable(), func});
        -                return factory.createTuple(new Object[]{type, tuple});
        +                PTuple tuple = PFactory.createTuple(language, new Object[]{self.getIterable(), func});
        +                return PFactory.createTuple(language, new Object[]{type, tuple});
                     }
                 }
         
        @@ -192,5 +223,4 @@ static Object setState(PAccumulate self, Object state) {
                     return PNone.NONE;
                 }
             }
        -
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/ChainBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/ChainBuiltins.java
        index 32e0311ef5..e2e2ac2525 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/ChainBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/ChainBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -44,33 +44,40 @@
         import static com.oracle.graal.python.nodes.ErrorMessages.ARGUMENTS_MUST_BE_ITERATORS;
         import static com.oracle.graal.python.nodes.ErrorMessages.IS_NOT_A;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CLASS_GETITEM__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.builtins.modules.BuiltinFunctions;
         import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.function.PKeyword;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
         import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins.GetItemNode;
         import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins.LenNode;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
        +import com.oracle.graal.python.lib.IteratorExhausted;
         import com.oracle.graal.python.lib.PyIterCheckNode;
        +import com.oracle.graal.python.lib.PyIterNextNode;
         import com.oracle.graal.python.lib.PyObjectGetIter;
        +import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile;
        +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
         import com.oracle.graal.python.nodes.object.GetClassNode;
         import com.oracle.graal.python.runtime.exception.PException;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        -import com.oracle.graal.python.util.PythonUtils;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        @@ -85,12 +92,41 @@
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PChain})
         public final class ChainBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = ChainBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return ChainBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "chain", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
        +    @GenerateNodeFactory
        +    public abstract static class ChainNode extends PythonVarargsBuiltinNode {
        +
        +        @Specialization
        +        static PChain construct(VirtualFrame frame, Object cls, Object[] args, PKeyword[] keywords,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached(inline = false /* uncommon path */) TypeNodes.HasObjectInitNode hasObjectInitNode,
        +                        @Cached PyObjectGetIter getIter,
        +                        @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (!isTypeNode.execute(inliningTarget, cls)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
        +            }
        +            if (keywords.length > 0 && hasObjectInitNode.executeCached(cls)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "chain()");
        +            }
        +            PChain self = PFactory.createChain(language, cls, getInstanceShape.execute(cls));
        +            self.setSource(getIter.execute(frame, inliningTarget, PFactory.createList(language, args)));
        +            self.setActive(PNone.NONE);
        +            return self;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -99,38 +135,45 @@ static Object iter(PChain self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization
                 static Object next(VirtualFrame frame, PChain self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached PyObjectGetIter getIter,
        -                        @Cached BuiltinFunctions.NextNode nextNode,
        -                        @Cached IsBuiltinObjectProfile isStopIterationProfile,
        -                        @Cached InlinedBranchProfile nextExceptioProfile,
        -                        @Cached InlinedLoopConditionProfile loopProfile,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PyIterNextNode nextNode,
        +                        @Cached InlinedBranchProfile nextExceptionProfile,
        +                        @Cached InlinedLoopConditionProfile loopProfile) {
                     while (loopProfile.profile(inliningTarget, self.getSource() != PNone.NONE)) {
                         if (self.getActive() == PNone.NONE) {
                             try {
        -                        Object next = nextNode.execute(frame, self.getSource(), PNone.NO_VALUE);
        +                        Object next;
        +                        try {
        +                            next = nextNode.execute(frame, inliningTarget, self.getSource());
        +                        } catch (IteratorExhausted e) {
        +                            self.setSource(PNone.NONE);
        +                            throw e;
        +                        } catch (PException e) {
        +                            nextExceptionProfile.enter(inliningTarget);
        +                            self.setSource(PNone.NONE);
        +                            throw e;
        +                        }
                                 Object iter = getIter.execute(frame, inliningTarget, next);
                                 self.setActive(iter);
                             } catch (PException e) {
        -                        nextExceptioProfile.enter(inliningTarget);
        +                        nextExceptionProfile.enter(inliningTarget);
                                 self.setSource(PNone.NONE);
                                 throw e;
                             }
                         }
                         try {
        -                    return nextNode.execute(frame, self.getActive(), PNone.NO_VALUE);
        -                } catch (PException e) {
        -                    e.expectStopIteration(inliningTarget, isStopIterationProfile);
        +                    return nextNode.execute(frame, inliningTarget, self.getActive());
        +                } catch (IteratorExhausted e) {
                             self.setActive(PNone.NONE);
                         }
                     }
        -            throw raiseNode.get(inliningTarget).raiseStopIteration();
        +            throw iteratorExhausted();
                 }
             }
         
        @@ -141,8 +184,8 @@ public abstract static class FromIterNode extends PythonBinaryBuiltinNode {
                 static Object fromIter(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object arg,
                                 @Bind("this") Node inliningTarget,
                                 @Cached PyObjectGetIter getIter,
        -                        @Cached PythonObjectFactory factory) {
        -            PChain instance = factory.createChain(PythonBuiltinClassType.PChain);
        +                        @Bind PythonLanguage language) {
        +            PChain instance = PFactory.createChain(language);
                     instance.setSource(getIter.execute(frame, inliningTarget, arg));
                     instance.setActive(PNone.NONE);
                     return instance;
        @@ -158,19 +201,19 @@ static Object reducePos(PChain self,
                                 @Cached GetClassNode getClass,
                                 @Cached InlinedConditionProfile hasSourceProfile,
                                 @Cached InlinedConditionProfile hasActiveProfile,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object type = getClass.execute(inliningTarget, self);
        -            PTuple empty = factory.createTuple(PythonUtils.EMPTY_OBJECT_ARRAY);
        +            PTuple empty = PFactory.createEmptyTuple(language);
                     if (hasSourceProfile.profile(inliningTarget, self.getSource() != PNone.NONE)) {
                         if (hasActiveProfile.profile(inliningTarget, self.getActive() != PNone.NONE)) {
        -                    PTuple tuple = factory.createTuple(new Object[]{self.getSource(), self.getActive()});
        -                    return factory.createTuple(new Object[]{type, empty, tuple});
        +                    PTuple tuple = PFactory.createTuple(language, new Object[]{self.getSource(), self.getActive()});
        +                    return PFactory.createTuple(language, new Object[]{type, empty, tuple});
                         } else {
        -                    PTuple tuple = factory.createTuple(new Object[]{self.getSource()});
        -                    return factory.createTuple(new Object[]{type, empty, tuple});
        +                    PTuple tuple = PFactory.createTuple(language, new Object[]{self.getSource()});
        +                    return PFactory.createTuple(language, new Object[]{type, empty, tuple});
                         }
                     } else {
        -                return factory.createTuple(new Object[]{type, empty});
        +                return PFactory.createTuple(language, new Object[]{type, empty});
                     }
                 }
             }
        @@ -185,13 +228,13 @@ static Object setState(VirtualFrame frame, PChain self, Object state,
                                 @Cached GetItemNode getItemNode,
                                 @Cached InlinedBranchProfile len2Profile,
                                 @Cached PyIterCheckNode iterCheckNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     if (!(state instanceof PTuple)) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, IS_NOT_A, "state", "a length 1 or 2 tuple");
        +                throw raiseNode.raise(inliningTarget, TypeError, IS_NOT_A, "state", "a length 1 or 2 tuple");
                     }
                     int len = (int) lenNode.execute(frame, state);
                     if (len < 1 || len > 2) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, IS_NOT_A, "state", "a length 1 or 2 tuple");
        +                throw raiseNode.raise(inliningTarget, TypeError, IS_NOT_A, "state", "a length 1 or 2 tuple");
                     }
                     Object source = getItemNode.execute(frame, state, 0);
                     checkIterator(inliningTarget, iterCheckNode, source, raiseNode);
        @@ -205,9 +248,9 @@ static Object setState(VirtualFrame frame, PChain self, Object state,
                     return PNone.NONE;
                 }
         
        -        private static void checkIterator(Node inliningTarget, PyIterCheckNode iterCheckNode, Object obj, PRaiseNode.Lazy raiseNode) throws PException {
        +        private static void checkIterator(Node inliningTarget, PyIterCheckNode iterCheckNode, Object obj, PRaiseNode raiseNode) throws PException {
                     if (!iterCheckNode.execute(inliningTarget, obj)) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ARGUMENTS_MUST_BE_ITERATORS);
        +                throw raiseNode.raise(inliningTarget, TypeError, ARGUMENTS_MUST_BE_ITERATORS);
                     }
                 }
             }
        @@ -217,8 +260,8 @@ private static void checkIterator(Node inliningTarget, PyIterCheckNode iterCheck
             public abstract static class ClassGetItemNode extends PythonBinaryBuiltinNode {
                 @Specialization
                 static Object classGetItem(Object cls, Object key,
        -                        @Cached PythonObjectFactory factory) {
        -            return factory.createGenericAlias(cls, key);
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createGenericAlias(language, cls, key);
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CombinationsBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CombinationsBuiltins.java
        index 7380de3ab0..cc64734b7c 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CombinationsBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CombinationsBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -42,31 +42,41 @@
         
         import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
         import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
        +import static com.oracle.graal.python.nodes.ErrorMessages.MUST_BE_NON_NEGATIVE;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETSTATE__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.ArgumentClinic;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
         import com.oracle.graal.python.builtins.objects.PNone;
         import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
        +import com.oracle.graal.python.builtins.objects.iterator.IteratorNodes;
        +import com.oracle.graal.python.builtins.objects.itertools.CombinationsBuiltinsClinicProviders.CombinationsNodeClinicProviderGen;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
         import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
         import com.oracle.graal.python.nodes.object.GetClassNode;
         import com.oracle.graal.python.nodes.util.CannotCastException;
         import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode;
        -import com.oracle.graal.python.runtime.exception.PException;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
         import com.oracle.graal.python.util.PythonUtils;
         import com.oracle.truffle.api.CompilerAsserts;
        @@ -77,19 +87,69 @@
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
         import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.Specialization;
        +import com.oracle.truffle.api.frame.VirtualFrame;
         import com.oracle.truffle.api.nodes.Node;
         import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile;
        +import com.oracle.truffle.api.profiles.LoopConditionProfile;
         
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PCombinations, PythonBuiltinClassType.PCombinationsWithReplacement})
         public final class CombinationsBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = CombinationsBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return CombinationsBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "combinations", minNumOfPositionalArgs = 3, parameterNames = {"cls", "iterable", "r"})
        +    @ArgumentClinic(name = "r", conversion = ArgumentClinic.ClinicConversion.Int)
        +    @GenerateNodeFactory
        +    public abstract static class CombinationsNode extends PythonTernaryClinicBuiltinNode {
        +
        +        @Override
        +        protected ArgumentClinicProvider getArgumentClinic() {
        +            return CombinationsNodeClinicProviderGen.INSTANCE;
        +        }
        +
        +        @Specialization
        +        static Object construct(VirtualFrame frame, Object cls, Object iterable, int r,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Cached IteratorNodes.ToArrayNode toArrayNode,
        +                        @Cached LoopConditionProfile indicesLoopProfile,
        +                        @Cached InlinedConditionProfile wrongTypeProfile,
        +                        @Cached InlinedConditionProfile negativeProfile,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (!wrongTypeProfile.profile(inliningTarget, isTypeNode.execute(inliningTarget, cls))) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
        +            }
        +            if (negativeProfile.profile(inliningTarget, r < 0)) {
        +                throw raiseNode.raise(inliningTarget, ValueError, MUST_BE_NON_NEGATIVE, "r");
        +            }
        +
        +            PCombinations self = PFactory.createCombinations(language, cls, getInstanceShape.execute(cls));
        +            self.setPool(toArrayNode.execute(frame, iterable));
        +
        +            int[] indices = new int[r];
        +            indicesLoopProfile.profileCounted(r);
        +            for (int i = 0; indicesLoopProfile.inject(i < r); i++) {
        +                indices[i] = i;
        +            }
        +            self.setIndices(indices);
        +            self.setR(r);
        +            self.setLastResult(null);
        +            self.setStopped(r > self.getPool().length);
        +
        +            return self;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -98,20 +158,20 @@ static Object iter(PAbstractCombinations self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @SuppressWarnings("unused")
                 @Specialization(guards = "self.isStopped()")
                 static Object nextStopped(PAbstractCombinations self,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raiseStopIteration();
        +                        @Bind("this") Node inliningTarget) {
        +            throw iteratorExhausted();
                 }
         
                 @Specialization(guards = {"!self.isStopped()", "isLastResultNull(self)"})
                 static Object nextNoResult(PAbstractCombinations self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached @Shared PythonObjectFactory factory,
        +                        @Bind PythonLanguage language,
                                 @Cached @Exclusive InlinedLoopConditionProfile loopConditionProfile) {
                     // On the first pass, initialize result tuple using the indices
                     Object[] result = new Object[self.getR()];
        @@ -121,31 +181,27 @@ static Object nextNoResult(PAbstractCombinations self,
                         result[i] = self.getPool()[idx];
                     }
                     self.setLastResult(result);
        -            return factory.createTuple(result);
        +            return PFactory.createTuple(language, result);
                 }
         
                 @Specialization(guards = {"!self.isStopped()", "!isLastResultNull(self)"})
                 static Object next(PCombinations self,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory factory,
                                 @Shared @Cached InlinedLoopConditionProfile indexLoopProfile,
        -                        @Shared @Cached InlinedLoopConditionProfile resultLoopProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            return nextInternal(inliningTarget, self, factory, indexLoopProfile, resultLoopProfile, raiseNode);
        +                        @Shared @Cached InlinedLoopConditionProfile resultLoopProfile) {
        +            return nextInternal(inliningTarget, self, indexLoopProfile, resultLoopProfile);
                 }
         
                 @Specialization(guards = {"!self.isStopped()", "!isLastResultNull(self)"})
                 static Object next(PCombinationsWithReplacement self,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached PythonObjectFactory factory,
                                 @Shared @Cached InlinedLoopConditionProfile indexLoopProfile,
        -                        @Shared @Cached InlinedLoopConditionProfile resultLoopProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            return nextInternal(inliningTarget, self, factory, indexLoopProfile, resultLoopProfile, raiseNode);
        +                        @Shared @Cached InlinedLoopConditionProfile resultLoopProfile) {
        +            return nextInternal(inliningTarget, self, indexLoopProfile, resultLoopProfile);
                 }
         
        -        private static Object nextInternal(Node inliningTarget, PAbstractCombinations self, PythonObjectFactory factory, InlinedLoopConditionProfile indexLoopProfile,
        -                        InlinedLoopConditionProfile resultLoopProfile, PRaiseNode.Lazy raiseNode) throws PException {
        +        private static Object nextInternal(Node inliningTarget, PAbstractCombinations self, InlinedLoopConditionProfile indexLoopProfile,
        +                        InlinedLoopConditionProfile resultLoopProfile) {
         
                     CompilerAsserts.partialEvaluationConstant(self.getClass());
         
        @@ -162,7 +218,7 @@ private static Object nextInternal(Node inliningTarget, PAbstractCombinations se
                     // If i is negative, then the indices are all at their maximum value and we're done
                     if (i < 0) {
                         self.setStopped(true);
        -                throw raiseNode.get(inliningTarget).raiseStopIteration();
        +                throw iteratorExhausted();
                     }
         
                     // Increment the current index which we know is not at its maximum.
        @@ -182,7 +238,7 @@ private static Object nextInternal(Node inliningTarget, PAbstractCombinations se
                         result[j] = elem;
                     }
                     self.setLastResult(result);
        -            return factory.createTuple(result);
        +            return PFactory.createTuple(PythonLanguage.get(inliningTarget), result);
                 }
         
                 protected boolean isLastResultNull(PAbstractCombinations self) {
        @@ -200,18 +256,18 @@ static Object reduce(PAbstractCombinations self,
                                 @Cached InlinedConditionProfile hasNoLastResultProfile,
                                 @Cached InlinedConditionProfile stoppedProfile,
                                 @Cached GetClassNode getClassNode,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object type = getClassNode.execute(inliningTarget, self);
                     if (hasNoLastResultProfile.profile(inliningTarget, self.getLastResult() == null)) {
        -                PTuple args = factory.createTuple(new Object[]{factory.createTuple(self.getPool()), self.getR()});
        -                return factory.createTuple(new Object[]{type, args});
        +                PTuple args = PFactory.createTuple(language, new Object[]{PFactory.createTuple(language, self.getPool()), self.getR()});
        +                return PFactory.createTuple(language, new Object[]{type, args});
                     } else if (stoppedProfile.profile(inliningTarget, self.isStopped())) {
        -                PTuple args = factory.createTuple(new Object[]{factory.createEmptyTuple(), self.getR()});
        -                return factory.createTuple(new Object[]{type, args});
        +                PTuple args = PFactory.createTuple(language, new Object[]{PFactory.createEmptyTuple(language), self.getR()});
        +                return PFactory.createTuple(language, new Object[]{type, args});
                     }
        -            PTuple indices = factory.createTuple(PythonUtils.arrayCopyOf(self.getIndices(), self.getR()));
        -            PTuple args = factory.createTuple(new Object[]{factory.createTuple(self.getPool()), self.getR()});
        -            return factory.createTuple(new Object[]{type, args, indices});
        +            PTuple indices = PFactory.createTuple(language, PythonUtils.arrayCopyOf(self.getIndices(), self.getR()));
        +            PTuple args = PFactory.createTuple(language, new Object[]{PFactory.createTuple(language, self.getPool()), self.getR()});
        +            return PFactory.createTuple(language, new Object[]{type, args, indices});
                 }
             }
         
        @@ -224,7 +280,7 @@ static Object setState(PAbstractCombinations self, Object stateObj,
                                 @Bind("this") Node inliningTarget,
                                 @Cached CastToJavaIntExactNode cast,
                                 @Cached SequenceStorageNodes.GetItemScalarNode getItemNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     int n = self.getPool().length;
                     if (stateObj instanceof PTuple state && state.getSequenceStorage().length() == self.getR()) {
                         SequenceStorage storage = state.getSequenceStorage();
        @@ -241,7 +297,7 @@ static Object setState(PAbstractCombinations self, Object stateObj,
                                 self.getIndices()[i] = index;
                             }
                         } catch (CannotCastException e) {
        -                    throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.INTEGER_REQUIRED);
        +                    throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.INTEGER_REQUIRED);
                         }
                         Object[] result = new Object[self.getR()];
                         for (int i = 0; i < self.getR(); i++) {
        @@ -250,9 +306,8 @@ static Object setState(PAbstractCombinations self, Object stateObj,
                         self.setLastResult(result);
                         return PNone.NONE;
                     } else {
        -                throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.INVALID_ARGS, T___SETSTATE__);
        +                throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.INVALID_ARGS, T___SETSTATE__);
                     }
                 }
             }
        -
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CombinationsWithReplacementBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CombinationsWithReplacementBuiltins.java
        new file mode 100644
        index 0000000000..86d85322d3
        --- /dev/null
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CombinationsWithReplacementBuiltins.java
        @@ -0,0 +1,125 @@
        +/*
        + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
        + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        + *
        + * The Universal Permissive License (UPL), Version 1.0
        + *
        + * Subject to the condition set forth below, permission is hereby granted to any
        + * person obtaining a copy of this software, associated documentation and/or
        + * data (collectively the "Software"), free of charge and under any and all
        + * copyright rights in the Software, and any and all patent rights owned or
        + * freely licensable by each licensor hereunder covering either (i) the
        + * unmodified Software as contributed to or provided by such licensor, or (ii)
        + * the Larger Works (as defined below), to deal in both
        + *
        + * (a) the Software, and
        + *
        + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
        + * one is included with the Software each a "Larger Work" to which the Software
        + * is contributed by such licensors),
        + *
        + * without restriction, including without limitation the rights to copy, create
        + * derivative works of, display, perform, and distribute the Software and make,
        + * use, sell, offer for sale, import, export, have made, and have sold the
        + * Software and the Larger Work(s), and to sublicense the foregoing rights on
        + * either these or other terms.
        + *
        + * This license is subject to the following condition:
        + *
        + * The above copyright notice and either this complete permission notice or at a
        + * minimum a reference to the UPL must be included in all copies or substantial
        + * portions of the Software.
        + *
        + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        + * SOFTWARE.
        + */
        +package com.oracle.graal.python.builtins.objects.itertools;
        +
        +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
        +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError;
        +import static com.oracle.graal.python.nodes.ErrorMessages.MUST_BE_NON_NEGATIVE;
        +
        +import java.util.List;
        +
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.ArgumentClinic;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
        +import com.oracle.graal.python.builtins.CoreFunctions;
        +import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        +import com.oracle.graal.python.builtins.PythonBuiltins;
        +import com.oracle.graal.python.builtins.objects.iterator.IteratorNodes;
        +import com.oracle.graal.python.builtins.objects.itertools.CombinationsWithReplacementBuiltinsClinicProviders.CombinationsWithReplacementNodeClinicProviderGen;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.nodes.ErrorMessages;
        +import com.oracle.graal.python.nodes.PRaiseNode;
        +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
        +import com.oracle.graal.python.runtime.object.PFactory;
        +import com.oracle.truffle.api.dsl.Bind;
        +import com.oracle.truffle.api.dsl.Cached;
        +import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        +import com.oracle.truffle.api.dsl.NodeFactory;
        +import com.oracle.truffle.api.dsl.Specialization;
        +import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.profiles.InlinedConditionProfile;
        +
        +@CoreFunctions(extendClasses = PythonBuiltinClassType.PCombinationsWithReplacement)
        +public class CombinationsWithReplacementBuiltins extends PythonBuiltins {
        +
        +    public static final TpSlots SLOTS = CombinationsWithReplacementBuiltinsSlotsGen.SLOTS;
        +
        +    @Override
        +    protected List> getNodeFactories() {
        +        return CombinationsWithReplacementBuiltinsFactory.getFactories();
        +    }
        +
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "combinations_with_replacement", minNumOfPositionalArgs = 3, parameterNames = {
        +                    "cls", "iterable", "r"})
        +    @ArgumentClinic(name = "r", conversion = ArgumentClinic.ClinicConversion.Int)
        +    @GenerateNodeFactory
        +    public abstract static class CombinationsWithReplacementNode extends PythonTernaryClinicBuiltinNode {
        +
        +        @Override
        +        protected ArgumentClinicProvider getArgumentClinic() {
        +            return CombinationsWithReplacementNodeClinicProviderGen.INSTANCE;
        +        }
        +
        +        @Specialization
        +        static Object construct(VirtualFrame frame, Object cls, Object iterable, int r,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Cached IteratorNodes.ToArrayNode toArrayNode,
        +                        @Cached InlinedConditionProfile wrongTypeProfile,
        +                        @Cached InlinedConditionProfile negativeProfile,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (!wrongTypeProfile.profile(inliningTarget, isTypeNode.execute(inliningTarget, cls))) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
        +            }
        +            if (negativeProfile.profile(inliningTarget, r < 0)) {
        +                throw raiseNode.raise(inliningTarget, ValueError, MUST_BE_NON_NEGATIVE, "r");
        +            }
        +            PCombinationsWithReplacement self = PFactory.createCombinationsWithReplacement(language, cls, getInstanceShape.execute(cls));
        +            self.setPool(toArrayNode.execute(frame, iterable));
        +            self.setR(r);
        +
        +            self.setIndices(new int[r]);
        +            self.setLastResult(null);
        +            self.setStopped(self.getPool().length == 0 && r > 0);
        +
        +            return self;
        +        }
        +    }
        +}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CompressBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CompressBuiltins.java
        index 19a8b863c0..5713ec178f 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CompressBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CompressBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,24 +40,35 @@
          */
         package com.oracle.graal.python.builtins.objects.itertools;
         
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
        +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.builtins.modules.BuiltinFunctions;
        -import com.oracle.graal.python.builtins.objects.PNone;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.CallSlotTpIterNextNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
        +import com.oracle.graal.python.lib.PyObjectGetIter;
         import com.oracle.graal.python.lib.PyObjectIsTrueNode;
        +import com.oracle.graal.python.nodes.ErrorMessages;
        +import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
         import com.oracle.graal.python.nodes.object.GetClassNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        @@ -70,12 +81,36 @@
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PCompress})
         public final class CompressBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = CompressBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return CompressBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "compress", minNumOfPositionalArgs = 3, parameterNames = {"cls", "data", "selectors"})
        +    @GenerateNodeFactory
        +    public abstract static class CompressNode extends PythonTernaryBuiltinNode {
        +        @Specialization
        +        static PCompress construct(VirtualFrame frame, Object cls, Object data, Object selectors,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached PyObjectGetIter getIter,
        +                        @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (!isTypeNode.execute(inliningTarget, cls)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
        +            }
        +            PCompress self = PFactory.createCompress(language, cls, getInstanceShape.execute(cls));
        +            self.setData(getIter.execute(frame, inliningTarget, data));
        +            self.setSelectors(getIter.execute(frame, inliningTarget, selectors));
        +            return self;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -84,22 +119,31 @@ static Object iter(PCompress self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization
                 static Object next(VirtualFrame frame, PCompress self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached BuiltinFunctions.NextNode nextNode,
        +                        @Cached GetObjectSlotsNode getDataSlots,
        +                        @Cached GetObjectSlotsNode getSelectorsSlots,
        +                        @Cached CallSlotTpIterNextNode callIterNextData,
        +                        @Cached CallSlotTpIterNextNode callIterNextSelectors,
                                 @Cached PyObjectIsTrueNode isTrue,
                                 @Cached InlinedLoopConditionProfile loopConditionProfile) {
        -            Object nextSelector;
        -            Object nextItem;
        +            Object data = self.getData();
        +            Object selectors = self.getSelectors();
        +            TpSlot dataIterNext = getDataSlots.execute(inliningTarget, data).tp_iternext();
        +            TpSlot selectorsIterNext = getSelectorsSlots.execute(inliningTarget, selectors).tp_iternext();
        +            Object result = null;
                     do {
        -                nextItem = nextNode.execute(frame, self.getData(), PNone.NO_VALUE);
        -                nextSelector = nextNode.execute(frame, self.getSelectors(), PNone.NO_VALUE);
        -            } while (loopConditionProfile.profile(inliningTarget, !isTrue.execute(frame, inliningTarget, nextSelector)));
        -            return nextItem;
        +                Object datum = callIterNextData.execute(frame, inliningTarget, dataIterNext, data);
        +                Object selector = callIterNextSelectors.execute(frame, inliningTarget, selectorsIterNext, selectors);
        +                if (isTrue.execute(frame, selector)) {
        +                    result = datum;
        +                }
        +            } while (loopConditionProfile.profile(inliningTarget, result == null));
        +            return result;
                 }
             }
         
        @@ -110,11 +154,10 @@ public abstract static class ReduceNode extends PythonUnaryBuiltinNode {
                 static Object reduce(PCompress self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached GetClassNode getClassNode,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object type = getClassNode.execute(inliningTarget, self);
        -            PTuple tuple = factory.createTuple(new Object[]{self.getData(), self.getSelectors()});
        -            return factory.createTuple(new Object[]{type, tuple});
        +            PTuple tuple = PFactory.createTuple(language, new Object[]{self.getData(), self.getSelectors()});
        +            return PFactory.createTuple(language, new Object[]{type, tuple});
                 }
             }
        -
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CountBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CountBuiltins.java
        index 9999eca821..642df410dd 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CountBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CountBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,30 +40,43 @@
          */
         package com.oracle.graal.python.builtins.objects.itertools;
         
        +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
        +import static com.oracle.graal.python.nodes.ErrorMessages.NUMBER_IS_REQUIRED;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.ArgumentClinic;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        +import com.oracle.graal.python.builtins.objects.itertools.CountBuiltinsClinicProviders.CountNodeClinicProviderGen;
         import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
         import com.oracle.graal.python.lib.PyNumberAddNode;
        +import com.oracle.graal.python.lib.PyNumberCheckNode;
         import com.oracle.graal.python.lib.PyObjectGetAttr;
         import com.oracle.graal.python.lib.PyObjectReprAsObjectNode;
         import com.oracle.graal.python.lib.PyObjectTypeCheck;
        +import com.oracle.graal.python.nodes.ErrorMessages;
        +import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
         import com.oracle.graal.python.nodes.object.GetClassNode;
         import com.oracle.graal.python.nodes.util.CastToJavaLongExactNode;
         import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        @@ -78,12 +91,50 @@
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PCount})
         public final class CountBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = CountBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return CountBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "count", minNumOfPositionalArgs = 1, parameterNames = {"cls", "start", "step"})
        +    @ArgumentClinic(name = "start", defaultValue = "0", useDefaultForNone = true)
        +    @ArgumentClinic(name = "step", defaultValue = "1", useDefaultForNone = true)
        +    @GenerateNodeFactory
        +    public abstract static class CountNode extends PythonTernaryClinicBuiltinNode {
        +
        +        @Override
        +        protected ArgumentClinicProvider getArgumentClinic() {
        +            return CountNodeClinicProviderGen.INSTANCE;
        +        }
        +
        +        @Specialization
        +        static Object construct(Object cls, Object start, Object step,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached PyNumberCheckNode checkNode,
        +                        @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (!isTypeNode.execute(inliningTarget, cls)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
        +            }
        +            if (!checkNode.execute(inliningTarget, start)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, NUMBER_IS_REQUIRED);
        +            }
        +            if (!checkNode.execute(inliningTarget, step)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, NUMBER_IS_REQUIRED);
        +            }
        +            PCount self = PFactory.createCount(language, cls, getInstanceShape.execute(cls));
        +            self.setCnt(start);
        +            self.setStep(step);
        +            return self;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -92,20 +143,19 @@ static Object iter(PCount self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization
                 static Object next(VirtualFrame frame, PCount self,
        -                        @Bind("this") Node inliningTarget,
                                 @Cached PyNumberAddNode addNode) {
                     Object cnt = self.getCnt();
        -            self.setCnt(addNode.execute(frame, inliningTarget, self.getCnt(), self.getStep()));
        +            self.setCnt(addNode.execute(frame, self.getCnt(), self.getStep()));
                     return cnt;
                 }
             }
         
        -    @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
             @GenerateNodeFactory
             public abstract static class ReprNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -140,16 +190,16 @@ static Object reducePos(PCount self,
                                 @Cached CastToJavaLongExactNode castLongNode,
                                 @Cached PyObjectTypeCheck typeCheckNode,
                                 @Cached InlinedConditionProfile hasDefaultStep,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object type = getClassNode.execute(inliningTarget, self);
                     PTuple tuple;
                     if (hasDefaultStep.profile(inliningTarget,
                                     !typeCheckNode.execute(inliningTarget, self.getStep(), PythonBuiltinClassType.PInt) || castLongNode.execute(inliningTarget, self.getStep()) != 1)) {
        -                tuple = factory.createTuple(new Object[]{self.getCnt(), self.getStep()});
        +                tuple = PFactory.createTuple(language, new Object[]{self.getCnt(), self.getStep()});
                     } else {
        -                tuple = factory.createTuple(new Object[]{self.getCnt()});
        +                tuple = PFactory.createTuple(language, new Object[]{self.getCnt()});
                     }
        -            return factory.createTuple(new Object[]{type, tuple});
        +            return PFactory.createTuple(language, new Object[]{type, tuple});
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CycleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CycleBuiltins.java
        index 5a4955219f..7c87288434 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CycleBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/CycleBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -43,8 +43,6 @@
         import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
         import static com.oracle.graal.python.nodes.ErrorMessages.IS_NOT_A;
         import static com.oracle.graal.python.nodes.ErrorMessages.STATE_ARGUMENT_D_MUST_BE_A_S;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETSTATE__;
        @@ -53,35 +51,44 @@
         import java.util.Arrays;
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.builtins.modules.BuiltinFunctions;
         import com.oracle.graal.python.builtins.objects.PNone;
         import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ToArrayNode;
        +import com.oracle.graal.python.builtins.objects.function.PKeyword;
         import com.oracle.graal.python.builtins.objects.list.PList;
        -import com.oracle.graal.python.builtins.objects.object.PythonObject;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
         import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins.GetItemNode;
         import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins.LenNode;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
        +import com.oracle.graal.python.lib.IteratorExhausted;
        +import com.oracle.graal.python.lib.PyIterNextNode;
         import com.oracle.graal.python.lib.PyNumberAsSizeNode;
         import com.oracle.graal.python.lib.PyObjectGetIter;
         import com.oracle.graal.python.lib.PyObjectLookupAttr;
        +import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
         import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile;
         import com.oracle.graal.python.nodes.object.GetClassNode;
         import com.oracle.graal.python.runtime.exception.PException;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.Cached.Exclusive;
        -import com.oracle.truffle.api.dsl.Cached.Shared;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
         import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.Specialization;
        @@ -92,12 +99,47 @@
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PCycle})
         public final class CycleBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = CycleBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return CycleBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "cycle", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
        +    @GenerateNodeFactory
        +    public abstract static class CycleNode extends PythonVarargsBuiltinNode {
        +
        +        @Specialization
        +        static PCycle construct(VirtualFrame frame, Object cls, Object[] args, PKeyword[] keywords,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached(inline = false /* uncommon path */) TypeNodes.HasObjectInitNode hasObjectInitNode,
        +                        @Cached PyObjectGetIter getIter,
        +                        @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (!isTypeNode.execute(inliningTarget, cls)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
        +            }
        +            if (keywords.length > 0 && hasObjectInitNode.executeCached(cls)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "cycle()");
        +            }
        +            if (args.length != 1) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_EXPECTED_D_ARGS, "cycle", 1);
        +            }
        +            Object iterable = args[0];
        +            PCycle self = PFactory.createCycle(language, cls, getInstanceShape.execute(cls));
        +            self.setSaved(new ArrayList<>());
        +            self.setIterable(getIter.execute(frame, inliningTarget, iterable));
        +            self.setIndex(0);
        +            self.setFirstpass(false);
        +            return self;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -106,33 +148,30 @@ static Object iter(PCycle self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization
                 static Object next(VirtualFrame frame, PCycle self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached BuiltinFunctions.NextNode nextNode,
        -                        @Cached IsBuiltinObjectProfile isStopIterationProfile,
        +                        @Cached PyIterNextNode nextNode,
                                 @Cached InlinedBranchProfile iterableProfile,
        -                        @Cached InlinedBranchProfile firstPassProfile,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached InlinedBranchProfile firstPassProfile) {
                     if (self.getIterable() != null) {
                         iterableProfile.enter(inliningTarget);
                         try {
        -                    Object item = nextNode.execute(frame, self.getIterable(), PNone.NO_VALUE);
        +                    Object item = nextNode.execute(frame, inliningTarget, self.getIterable());
                             if (!self.isFirstpass()) {
                                 firstPassProfile.enter(inliningTarget);
                                 add(self.getSaved(), item);
                             }
                             return item;
        -                } catch (PException e) {
        -                    e.expectStopIteration(inliningTarget, isStopIterationProfile);
        +                } catch (IteratorExhausted e) {
                             self.setIterable(null);
                         }
                     }
                     if (isEmpty(self.getSaved())) {
        -                throw raiseNode.get(inliningTarget).raiseStopIteration();
        +                throw iteratorExhausted();
                     }
                     Object item = get(self.getSaved(), self.getIndex());
                     self.setIndex(self.getIndex() + 1);
        @@ -170,11 +209,11 @@ public abstract static class ReduceNode extends PythonUnaryBuiltinNode {
                 static Object reduce(PCycle self,
                                 @Bind("this") Node inliningTarget,
                                 @Exclusive @Cached GetClassNode getClass,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object type = getClass.execute(inliningTarget, self);
        -            PTuple iterableTuple = factory.createTuple(new Object[]{self.getIterable()});
        -            PTuple tuple = factory.createTuple(new Object[]{getSavedList(self, factory), self.isFirstpass()});
        -            return factory.createTuple(new Object[]{type, iterableTuple, tuple});
        +            PTuple iterableTuple = PFactory.createTuple(language, new Object[]{self.getIterable()});
        +            PTuple tuple = PFactory.createTuple(language, new Object[]{getSavedList(self, language), self.isFirstpass()});
        +            return PFactory.createTuple(language, new Object[]{type, iterableTuple, tuple});
                 }
         
                 @Specialization(guards = "!hasIterable(self)")
        @@ -185,22 +224,22 @@ static Object reduceNoIterable(VirtualFrame frame, PCycle self,
                                 @Cached CallUnaryMethodNode callNode,
                                 @Cached PyObjectGetIter getIterNode,
                                 @Cached InlinedBranchProfile indexProfile,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object type = getClass.execute(inliningTarget, self);
        -            PList savedList = getSavedList(self, factory);
        +            PList savedList = getSavedList(self, language);
                     Object it = getIterNode.execute(frame, inliningTarget, savedList);
                     if (self.getIndex() > 0) {
                         indexProfile.enter(inliningTarget);
                         Object setStateCallable = lookupAttrNode.execute(frame, inliningTarget, it, T___SETSTATE__);
                         callNode.executeObject(frame, setStateCallable, self.getIndex());
                     }
        -            PTuple iteratorTuple = factory.createTuple(new Object[]{it});
        -            PTuple tuple = factory.createTuple(new Object[]{savedList, true});
        -            return factory.createTuple(new Object[]{type, iteratorTuple, tuple});
        +            PTuple iteratorTuple = PFactory.createTuple(language, new Object[]{it});
        +            PTuple tuple = PFactory.createTuple(language, new Object[]{savedList, true});
        +            return PFactory.createTuple(language, new Object[]{type, iteratorTuple, tuple});
                 }
         
        -        static PList getSavedList(PCycle self, PythonObjectFactory factory) {
        -            return factory.createList(toArray(self.getSaved()));
        +        static PList getSavedList(PCycle self, PythonLanguage language) {
        +            return PFactory.createList(language, toArray(self.getSaved()));
                 }
         
                 @TruffleBoundary
        @@ -216,8 +255,6 @@ protected boolean hasIterable(PCycle self) {
             @Builtin(name = J___SETSTATE__, minNumOfPositionalArgs = 2)
             @GenerateNodeFactory
             public abstract static class SetStateNode extends PythonBinaryBuiltinNode {
        -        abstract Object execute(VirtualFrame frame, PythonObject self, Object state);
        -
                 @Specialization
                 static Object setState(VirtualFrame frame, PCycle self, Object state,
                                 @Bind("this") Node inliningTarget,
        @@ -226,13 +263,13 @@ static Object setState(VirtualFrame frame, PCycle self, Object state,
                                 @Cached IsBuiltinObjectProfile isTypeErrorProfile,
                                 @Cached ToArrayNode toArrayNode,
                                 @Cached PyNumberAsSizeNode asSizeNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     if (!((state instanceof PTuple) && ((int) lenNode.execute(frame, state) == 2))) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, IS_NOT_A, "state", "2-tuple");
        +                throw raiseNode.raise(inliningTarget, TypeError, IS_NOT_A, "state", "2-tuple");
                     }
                     Object obj = getItemNode.execute(frame, state, 0);
                     if (!(obj instanceof PList)) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, STATE_ARGUMENT_D_MUST_BE_A_S, 1, "Plist");
        +                throw raiseNode.raise(inliningTarget, TypeError, STATE_ARGUMENT_D_MUST_BE_A_S, 1, "Plist");
                     }
                     PList saved = (PList) obj;
         
        @@ -241,7 +278,7 @@ static Object setState(VirtualFrame frame, PCycle self, Object state,
                         firstPass = asSizeNode.executeLossy(frame, inliningTarget, getItemNode.execute(frame, state, 1)) != 0;
                     } catch (PException e) {
                         e.expectTypeError(inliningTarget, isTypeErrorProfile);
        -                throw raiseNode.get(inliningTarget).raise(TypeError, STATE_ARGUMENT_D_MUST_BE_A_S, 2, "int");
        +                throw raiseNode.raise(inliningTarget, TypeError, STATE_ARGUMENT_D_MUST_BE_A_S, 2, "int");
                     }
         
                     Object[] savedArray = toArrayNode.execute(inliningTarget, saved.getSequenceStorage());
        @@ -256,5 +293,4 @@ private static ArrayList toList(Object[] savedArray) {
                     return new ArrayList<>(Arrays.asList(savedArray));
                 }
             }
        -
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/DropwhileBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/DropwhileBuiltins.java
        index ea5ed1903a..273a8b3db5 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/DropwhileBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/DropwhileBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,33 +40,45 @@
          */
         package com.oracle.graal.python.builtins.objects.itertools;
         
        +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
         import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError;
         import static com.oracle.graal.python.nodes.ErrorMessages.INVALID_ARGS;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETSTATE__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.builtins.modules.BuiltinFunctions;
         import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.function.PKeyword;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.CallSlotTpIterNextNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
        +import com.oracle.graal.python.lib.PyObjectGetIter;
         import com.oracle.graal.python.lib.PyObjectIsTrueNode;
        +import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.call.CallNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
         import com.oracle.graal.python.nodes.object.GetClassNode;
         import com.oracle.graal.python.nodes.util.CannotCastException;
         import com.oracle.graal.python.nodes.util.CastToJavaBooleanNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        @@ -80,12 +92,46 @@
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PDropwhile})
         public final class DropwhileBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = DropwhileBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return DropwhileBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "dropwhile", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
        +    @GenerateNodeFactory
        +    public abstract static class DropwhileNode extends PythonVarargsBuiltinNode {
        +        @Specialization
        +        static PDropwhile construct(VirtualFrame frame, Object cls, Object[] args, PKeyword[] keywords,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached(inline = false /* uncommon path */) TypeNodes.HasObjectInitNode hasObjectInitNode,
        +                        @Cached PyObjectGetIter getIter,
        +                        @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (!isTypeNode.execute(inliningTarget, cls)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
        +            }
        +            if (keywords.length > 0 && hasObjectInitNode.executeCached(cls)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "dropwhile()");
        +            }
        +            if (args.length != 2) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_EXPECTED_D_ARGS, "dropwhile", 2);
        +            }
        +            Object predicate = args[0];
        +            Object iterable = args[1];
        +            PDropwhile self = PFactory.createDropwhile(language, cls, getInstanceShape.execute(cls));
        +            self.setPredicate(predicate);
        +            self.setIterable(getIter.execute(frame, inliningTarget, iterable));
        +            self.setDoneDropping(false);
        +            return self;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -94,27 +140,32 @@ static Object iter(PDropwhile self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization
                 static Object next(VirtualFrame frame, PDropwhile self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached BuiltinFunctions.NextNode nextNode,
        +                        @Cached GetObjectSlotsNode getSlots,
        +                        @Cached CallSlotTpIterNextNode callIterNext,
                                 @Cached CallNode callNode,
                                 @Cached PyObjectIsTrueNode isTrue,
                                 @Cached InlinedBranchProfile doneDroppingProfile,
                                 @Cached InlinedLoopConditionProfile loopProfile) {
        -
        -            while (loopProfile.profile(inliningTarget, !self.isDoneDropping())) {
        -                Object n = nextNode.execute(frame, self.getIterable(), PNone.NO_VALUE);
        -                if (!isTrue.execute(frame, inliningTarget, callNode.execute(frame, self.getPredicate(), n))) {
        +            Object iterable = self.getIterable();
        +            TpSlot iterNext = getSlots.execute(inliningTarget, iterable).tp_iternext();
        +            Object result = null;
        +            do {
        +                Object item = callIterNext.execute(frame, inliningTarget, iterNext, iterable);
        +                if (self.isDoneDropping()) {
        +                    result = item;
        +                } else if (!isTrue.execute(frame, callNode.execute(frame, self.getPredicate(), item))) {
                             doneDroppingProfile.enter(inliningTarget);
                             self.setDoneDropping(true);
        -                    return n;
        +                    result = item;
                         }
        -            }
        -            return nextNode.execute(frame, self.getIterable(), PNone.NO_VALUE);
        +            } while (loopProfile.profile(inliningTarget, result == null));
        +            return result;
                 }
             }
         
        @@ -125,10 +176,10 @@ public abstract static class ReduceNode extends PythonUnaryBuiltinNode {
                 static Object reduce(PDropwhile self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached GetClassNode getClassNode,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object type = getClassNode.execute(inliningTarget, self);
        -            PTuple tuple = factory.createTuple(new Object[]{self.getPredicate(), self.getIterable()});
        -            return factory.createTuple(new Object[]{type, tuple, self.isDoneDropping()});
        +            PTuple tuple = PFactory.createTuple(language, new Object[]{self.getPredicate(), self.getIterable()});
        +            return PFactory.createTuple(language, new Object[]{type, tuple, self.isDoneDropping()});
                 }
             }
         
        @@ -139,14 +190,13 @@ public abstract static class SetStateNode extends PythonBinaryBuiltinNode {
                 static Object setState(PDropwhile self, Object state,
                                 @Bind("this") Node inliningTarget,
                                 @Cached CastToJavaBooleanNode castToBoolean,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     try {
                         self.setDoneDropping(castToBoolean.execute(inliningTarget, state));
                     } catch (CannotCastException e) {
        -                throw raiseNode.get(inliningTarget).raise(ValueError, INVALID_ARGS, T___SETSTATE__);
        +                throw raiseNode.raise(inliningTarget, ValueError, INVALID_ARGS, T___SETSTATE__);
                     }
                     return PNone.NONE;
                 }
             }
        -
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/FilterfalseBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/FilterfalseBuiltins.java
        index 70ce4fc44a..250c674075 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/FilterfalseBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/FilterfalseBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,28 +40,41 @@
          */
         package com.oracle.graal.python.builtins.objects.itertools;
         
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
        +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.builtins.modules.BuiltinFunctions;
         import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.function.PKeyword;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.CallSlotTpIterNextNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
        +import com.oracle.graal.python.lib.PyObjectGetIter;
         import com.oracle.graal.python.lib.PyObjectIsTrueNode;
        +import com.oracle.graal.python.nodes.ErrorMessages;
        +import com.oracle.graal.python.nodes.PGuards;
        +import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.call.CallNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
         import com.oracle.graal.python.nodes.object.GetClassNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
        -import com.oracle.truffle.api.dsl.Cached.Shared;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
         import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.Specialization;
        @@ -73,12 +86,46 @@
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PFilterfalse})
         public final class FilterfalseBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = FilterfalseBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return FilterfalseBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "filterfalse", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
        +    @GenerateNodeFactory
        +    public abstract static class FilterFalseNode extends PythonVarargsBuiltinNode {
        +
        +        @Specialization
        +        static PFilterfalse construct(VirtualFrame frame, Object cls, Object[] args, PKeyword[] keywords,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached(inline = false /* uncommon path */) TypeNodes.HasObjectInitNode hasObjectInitNode,
        +                        @Cached PyObjectGetIter getIter,
        +                        @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (!isTypeNode.execute(inliningTarget, cls)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
        +            }
        +            if (keywords.length > 0 && hasObjectInitNode.executeCached(cls)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "filterfalse()");
        +            }
        +            if (args.length != 2) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_EXPECTED_D_ARGS, "filterfalse", 2);
        +            }
        +            Object func = args[0];
        +            Object sequence = args[1];
        +            PFilterfalse self = PFactory.createFilterfalse(language, cls, getInstanceShape.execute(cls));
        +            self.setFunc(PGuards.isPNone(func) ? null : func);
        +            self.setSequence(getIter.execute(frame, inliningTarget, sequence));
        +            return self;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -87,38 +134,33 @@ static Object iter(PFilterfalse self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        -        @Specialization(guards = "hasFunc(self)")
        +    public abstract static class NextNode extends TpIterNextBuiltin {
        +        @Specialization
                 static Object next(VirtualFrame frame, PFilterfalse self,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached BuiltinFunctions.NextNode nextNode,
        +                        @Cached GetObjectSlotsNode getSlots,
        +                        @Cached CallSlotTpIterNextNode callIterNext,
                                 @Cached CallNode callNode,
        -                        @Shared @Cached PyObjectIsTrueNode isTrue,
        -                        @Shared @Cached InlinedLoopConditionProfile loopConditionProfile) {
        -            Object n;
        -            do {
        -                n = nextNode.execute(frame, self.getSequence(), PNone.NO_VALUE);
        -            } while (loopConditionProfile.profile(inliningTarget, isTrue.execute(frame, inliningTarget, callNode.execute(frame, self.getFunc(), n))));
        -            return n;
        -        }
        -
        -        @Specialization(guards = "!hasFunc(self)")
        -        static Object nextNoFunc(VirtualFrame frame, PFilterfalse self,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached BuiltinFunctions.NextNode nextNode,
        -                        @Shared @Cached PyObjectIsTrueNode isTrue,
        -                        @Shared @Cached InlinedLoopConditionProfile loopConditionProfile) {
        -            Object n;
        +                        @Cached PyObjectIsTrueNode isTrue,
        +                        @Cached InlinedConditionProfile hasFuncProfile,
        +                        @Cached InlinedLoopConditionProfile loopConditionProfile) {
        +            Object sequence = self.getSequence();
        +            TpSlot iterNext = getSlots.execute(inliningTarget, sequence).tp_iternext();
        +            Object func = self.getFunc();
        +            boolean hasFunc = hasFuncProfile.profile(inliningTarget, func != null);
        +            Object result;
        +            boolean cont;
                     do {
        -                n = nextNode.execute(frame, self.getSequence(), PNone.NO_VALUE);
        -            } while (loopConditionProfile.profile(inliningTarget, isTrue.execute(frame, inliningTarget, n)));
        -            return n;
        -        }
        -
        -        protected boolean hasFunc(PFilterfalse self) {
        -            return self.getFunc() != null;
        +                result = callIterNext.execute(frame, inliningTarget, iterNext, sequence);
        +                Object good = result;
        +                if (hasFunc) {
        +                    good = callNode.execute(frame, func, result);
        +                }
        +                cont = isTrue.execute(frame, good);
        +            } while (loopConditionProfile.profile(inliningTarget, cont));
        +            return result;
                 }
             }
         
        @@ -130,15 +172,14 @@ Object reduce(PFilterfalse self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached InlinedConditionProfile hasNoFuncProfile,
                                 @Cached GetClassNode getClassNode,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object func = self.getFunc();
                     if (hasNoFuncProfile.profile(inliningTarget, func == null)) {
                         func = PNone.NONE;
                     }
                     Object type = getClassNode.execute(inliningTarget, self);
        -            PTuple tuple = factory.createTuple(new Object[]{func, self.getSequence()});
        -            return factory.createTuple(new Object[]{type, tuple});
        +            PTuple tuple = PFactory.createTuple(language, new Object[]{func, self.getSequence()});
        +            return PFactory.createTuple(language, new Object[]{type, tuple});
                 }
             }
        -
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/GroupByBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/GroupByBuiltins.java
        index a00f7d7545..530655ee00 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/GroupByBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/GroupByBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -42,29 +42,41 @@
         
         import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
         import static com.oracle.graal.python.nodes.ErrorMessages.IS_NOT_A;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.ArgumentClinic;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.builtins.modules.BuiltinFunctions;
         import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.itertools.GroupByBuiltinsClinicProviders.GroupByNodeClinicProviderGen;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
         import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
        +import com.oracle.graal.python.lib.PyIterNextNode;
        +import com.oracle.graal.python.lib.PyObjectGetIter;
         import com.oracle.graal.python.lib.PyObjectRichCompareBool;
        +import com.oracle.graal.python.nodes.ErrorMessages;
        +import com.oracle.graal.python.nodes.PGuards;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.call.CallNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
         import com.oracle.graal.python.nodes.object.GetClassNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        @@ -79,12 +91,43 @@
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PGroupBy})
         public final class GroupByBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = GroupByBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return GroupByBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "groupby", minNumOfPositionalArgs = 2, parameterNames = {"cls", "iterable", "key"})
        +    @ArgumentClinic(name = "key", defaultValue = "PNone.NONE")
        +    @GenerateNodeFactory
        +    public abstract static class GroupByNode extends PythonTernaryClinicBuiltinNode {
        +
        +        @Override
        +        protected ArgumentClinicProvider getArgumentClinic() {
        +            return GroupByNodeClinicProviderGen.INSTANCE;
        +        }
        +
        +        @Specialization
        +        static PGroupBy construct(VirtualFrame frame, Object cls, Object iterable, Object key,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached PyObjectGetIter getIter,
        +                        @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (!isTypeNode.execute(inliningTarget, cls)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
        +            }
        +            PGroupBy self = PFactory.createGroupBy(language, cls, getInstanceShape.execute(cls));
        +            self.setKeyFunc(PGuards.isNone(key) ? null : key);
        +            self.setIt(getIter.execute(frame, inliningTarget, iterable));
        +            return self;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -93,36 +136,36 @@ static Object iter(PGroupBy self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization
                 static Object next(VirtualFrame frame, PGroupBy self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached BuiltinFunctions.NextNode nextNode,
        +                        @Cached PyIterNextNode nextNode,
                                 @Cached CallNode callNode,
        -                        @Cached PyObjectRichCompareBool.EqNode eqNode,
        +                        @Cached PyObjectRichCompareBool eqNode,
                                 @Cached InlinedBranchProfile eqProfile,
                                 @Cached InlinedConditionProfile hasFuncProfile,
                                 @Cached InlinedLoopConditionProfile loopConditionProfile,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     self.setCurrGrouper(null);
                     while (loopConditionProfile.profile(inliningTarget, doGroupByStep(frame, inliningTarget, self, eqProfile, eqNode))) {
                         self.groupByStep(frame, inliningTarget, nextNode, callNode, hasFuncProfile);
                     }
                     self.setTgtKey(self.getCurrKey());
        -            PGrouper grouper = factory.createGrouper(self, self.getTgtKey());
        -            return factory.createTuple(new Object[]{self.getCurrKey(), grouper});
        +            PGrouper grouper = PFactory.createGrouper(language, self, self.getTgtKey());
        +            return PFactory.createTuple(language, new Object[]{self.getCurrKey(), grouper});
                 }
         
        -        private static boolean doGroupByStep(VirtualFrame frame, Node inliningTarget, PGroupBy self, InlinedBranchProfile eqProfile, PyObjectRichCompareBool.EqNode eqNode) {
        +        private static boolean doGroupByStep(VirtualFrame frame, Node inliningTarget, PGroupBy self, InlinedBranchProfile eqProfile, PyObjectRichCompareBool eqNode) {
                     if (self.getCurrKey() == null) {
                         return true;
                     } else if (self.getTgtKey() == null) {
                         return false;
                     } else {
                         eqProfile.enter(inliningTarget);
        -                if (!eqNode.compare(frame, inliningTarget, self.getTgtKey(), self.getCurrKey())) {
        +                if (!eqNode.executeEq(frame, inliningTarget, self.getTgtKey(), self.getCurrKey())) {
                             return false;
                         }
                     }
        @@ -139,18 +182,18 @@ static Object reduceMarkerNotSet(PGroupBy self,
                                 @Cached InlinedConditionProfile noKeyFuncProfile,
                                 @Cached InlinedConditionProfile noValuesProfile,
                                 @Cached GetClassNode getClassNode,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object keyFunc = self.getKeyFunc();
                     if (noKeyFuncProfile.profile(inliningTarget, keyFunc == null)) {
                         keyFunc = PNone.NONE;
                     }
                     Object type = getClassNode.execute(inliningTarget, self);
        -            PTuple tuple1 = factory.createTuple(new Object[]{self.getIt(), keyFunc});
        +            PTuple tuple1 = PFactory.createTuple(language, new Object[]{self.getIt(), keyFunc});
                     if (noValuesProfile.profile(inliningTarget, !valuesSet(self))) {
        -                return factory.createTuple(new Object[]{type, tuple1});
        +                return PFactory.createTuple(language, new Object[]{type, tuple1});
                     }
        -            PTuple tuple2 = factory.createTuple(new Object[]{self.getCurrValue(), self.getTgtKey(), self.getCurrKey()});
        -            return factory.createTuple(new Object[]{type, tuple1, tuple2});
        +            PTuple tuple2 = PFactory.createTuple(language, new Object[]{self.getCurrValue(), self.getTgtKey(), self.getCurrKey()});
        +            return PFactory.createTuple(language, new Object[]{type, tuple1, tuple2});
                 }
         
                 private static boolean valuesSet(PGroupBy self) {
        @@ -167,9 +210,9 @@ static Object setState(VirtualFrame frame, PGroupBy self, Object state,
                                 @Bind("this") Node inliningTarget,
                                 @Cached TupleBuiltins.LenNode lenNode,
                                 @Cached TupleBuiltins.GetItemNode getItemNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     if (!(state instanceof PTuple) || (int) lenNode.execute(frame, state) != 3) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, IS_NOT_A, "state", "3-tuple");
        +                throw raiseNode.raise(inliningTarget, TypeError, IS_NOT_A, "state", "3-tuple");
                     }
         
                     Object currValue = getItemNode.execute(frame, state, 0);
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/GrouperBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/GrouperBuiltins.java
        index 527efebabd..d50c11d35e 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/GrouperBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/GrouperBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,32 +40,39 @@
          */
         package com.oracle.graal.python.builtins.objects.itertools;
         
        +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
         import static com.oracle.graal.python.nodes.BuiltinNames.T_ITER;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.builtins.modules.BuiltinFunctions;
         import com.oracle.graal.python.builtins.objects.module.PythonModule;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
        +import com.oracle.graal.python.lib.PyIterNextNode;
         import com.oracle.graal.python.lib.PyObjectGetAttr;
         import com.oracle.graal.python.lib.PyObjectRichCompareBool;
         import com.oracle.graal.python.nodes.BuiltinNames;
        +import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.call.CallNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
         import com.oracle.graal.python.nodes.object.GetClassNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
        -import com.oracle.truffle.api.dsl.Cached.Shared;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
         import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.Specialization;
        @@ -77,12 +84,36 @@
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PGrouper})
         public final class GrouperBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = GrouperBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return GrouperBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "_grouper", minNumOfPositionalArgs = 2, parameterNames = {"$self", "parent", "tgtkey"})
        +    @GenerateNodeFactory
        +    public abstract static class GrouperNode extends PythonTernaryBuiltinNode {
        +        @Specialization
        +        static PGrouper construct(Object cls, Object parent, Object tgtKey,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached InlinedConditionProfile wrongTypeProfile,
        +                        @Cached InlinedConditionProfile isPGroupByProfile,
        +                        @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Bind PythonLanguage language,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (!wrongTypeProfile.profile(inliningTarget, isTypeNode.execute(inliningTarget, cls))) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
        +            }
        +            if (!isPGroupByProfile.profile(inliningTarget, parent instanceof PGroupBy)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.INCORRECT_USAGE_OF_INTERNAL_GROUPER);
        +            }
        +            return PFactory.createGrouper(language, (PGroupBy) parent, tgtKey);
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -91,32 +122,31 @@ static Object iter(PGrouper self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization
                 static Object next(VirtualFrame frame, PGrouper self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached BuiltinFunctions.NextNode nextNode,
        +                        @Cached PyIterNextNode nextNode,
                                 @Cached CallNode callNode,
        -                        @Cached PyObjectRichCompareBool.EqNode eqNode,
        +                        @Cached PyObjectRichCompareBool eqNode,
                                 @Cached InlinedBranchProfile currGrouperProfile,
                                 @Cached InlinedBranchProfile currValueMarkerProfile,
                                 @Cached InlinedBranchProfile currValueTgtProfile,
        -                        @Cached InlinedConditionProfile hasFuncProfile,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached InlinedConditionProfile hasFuncProfile) {
                     PGroupBy gbo = self.getParent();
                     if (gbo.getCurrGrouper() != self) {
                         currGrouperProfile.enter(inliningTarget);
        -                throw raiseNode.get(inliningTarget).raiseStopIteration();
        +                throw iteratorExhausted();
                     }
                     if (gbo.getCurrValue() == null) {
                         currValueMarkerProfile.enter(inliningTarget);
                         gbo.groupByStep(frame, inliningTarget, nextNode, callNode, hasFuncProfile);
                     }
        -            if (!eqNode.compare(frame, inliningTarget, self.getTgtKey(), gbo.getCurrKey())) {
        +            if (!eqNode.executeEq(frame, inliningTarget, self.getTgtKey(), gbo.getCurrKey())) {
                         currValueTgtProfile.enter(inliningTarget);
        -                throw raiseNode.get(inliningTarget).raiseStopIteration();
        +                throw iteratorExhausted();
                     }
                     Object r = gbo.getCurrValue();
                     gbo.setCurrValue(null);
        @@ -131,21 +161,21 @@ public abstract static class ReduceNode extends PythonUnaryBuiltinNode {
                 static Object reduce(PGrouper self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached GetClassNode getClassNode,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object type = getClassNode.execute(inliningTarget, self);
        -            PTuple tuple = factory.createTuple(new Object[]{self.getParent(), self.getTgtKey()});
        -            return factory.createTuple(new Object[]{type, tuple});
        +            PTuple tuple = PFactory.createTuple(language, new Object[]{self.getParent(), self.getTgtKey()});
        +            return PFactory.createTuple(language, new Object[]{type, tuple});
                 }
         
                 @Specialization(guards = "!currValueIsSelf(self)")
                 Object reduceCurrNotSelf(VirtualFrame frame, @SuppressWarnings("unused") PGrouper self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached PyObjectGetAttr getAttrNode,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     PythonModule builtins = getContext().getCore().lookupBuiltinModule(BuiltinNames.T_BUILTINS);
                     Object iterCallable = getAttrNode.execute(frame, inliningTarget, builtins, T_ITER);
                     // return Py_BuildValue("N(())", _PyEval_GetBuiltinId(&PyId_iter));
        -            return factory.createTuple(new Object[]{iterCallable, factory.createTuple(new Object[]{factory.createEmptyTuple()})});
        +            return PFactory.createTuple(language, new Object[]{iterCallable, PFactory.createTuple(language, new Object[]{PFactory.createEmptyTuple(language)})});
                 }
         
                 protected boolean currValueIsSelf(PGrouper self) {
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/IsliceBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/IsliceBuiltins.java
        index bcc61d9783..68aa0c3b81 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/IsliceBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/IsliceBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,54 +40,180 @@
          */
         package com.oracle.graal.python.builtins.objects.itertools;
         
        +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError;
        +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
         import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError;
         import static com.oracle.graal.python.nodes.ErrorMessages.INVALID_ARGS;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
        +import static com.oracle.graal.python.nodes.ErrorMessages.ISLICE_WRONG_ARGS;
        +import static com.oracle.graal.python.nodes.ErrorMessages.STEP_FOR_ISLICE_MUST_BE;
        +import static com.oracle.graal.python.nodes.ErrorMessages.S_FOR_ISLICE_MUST_BE;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETSTATE__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.builtins.modules.BuiltinFunctions;
        +import com.oracle.graal.python.builtins.modules.SysModuleBuiltins;
         import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.function.PKeyword;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.CallSlotTpIterNextNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
        +import com.oracle.graal.python.lib.IteratorExhausted;
        +import com.oracle.graal.python.lib.PyNumberAsSizeNode;
         import com.oracle.graal.python.lib.PyObjectGetIter;
        +import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
         import com.oracle.graal.python.nodes.object.GetClassNode;
         import com.oracle.graal.python.nodes.util.CannotCastException;
         import com.oracle.graal.python.nodes.util.CastToJavaIntLossyNode;
         import com.oracle.graal.python.runtime.exception.PException;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.Cached.Exclusive;
        -import com.oracle.truffle.api.dsl.Cached.Shared;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
         import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
         import com.oracle.truffle.api.nodes.Node;
         import com.oracle.truffle.api.profiles.InlinedBranchProfile;
        +import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile;
         
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PIslice})
         public final class IsliceBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = IsliceBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return IsliceBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "islice", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
        +    @GenerateNodeFactory
        +    public abstract static class IsliceNode extends PythonVarargsBuiltinNode {
        +        @Specialization
        +        static Object constructOne(VirtualFrame frame, Object cls, Object[] args, PKeyword[] keywords,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached(inline = false /* uncommon path */) TypeNodes.HasObjectInitNode hasObjectInitNode,
        +                        @Cached PyObjectGetIter getIter,
        +                        @Cached PyNumberAsSizeNode asIntNode,
        +                        @Cached InlinedBranchProfile hasStart,
        +                        @Cached InlinedBranchProfile hasStop,
        +                        @Cached InlinedBranchProfile hasStep,
        +                        @Cached InlinedBranchProfile stopNotInt,
        +                        @Cached InlinedBranchProfile startNotInt,
        +                        @Cached InlinedBranchProfile stopWrongValue,
        +                        @Cached InlinedBranchProfile stepWrongValue,
        +                        @Cached InlinedBranchProfile wrongValue,
        +                        @Cached InlinedBranchProfile overflowBranch,
        +                        @Cached InlinedConditionProfile argsLen1,
        +                        @Cached InlinedConditionProfile argsLen2,
        +                        @Cached InlinedConditionProfile argsLen3,
        +                        @Cached InlinedBranchProfile wrongTypeBranch,
        +                        @Cached InlinedBranchProfile wrongArgsBranch,
        +                        @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (!isTypeNode.execute(inliningTarget, cls)) {
        +                wrongTypeBranch.enter(inliningTarget);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
        +            }
        +            if (keywords.length > 0 && hasObjectInitNode.executeCached(cls)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "islice()");
        +            }
        +            if (args.length < 2 || args.length > 4) {
        +                wrongArgsBranch.enter(inliningTarget);
        +                throw raiseNode.raise(inliningTarget, TypeError, ISLICE_WRONG_ARGS);
        +            }
        +            int start = 0;
        +            int step = 1;
        +            int stop = -1;
        +            if (argsLen1.profile(inliningTarget, args.length == 2)) {
        +                if (args[1] != PNone.NONE) {
        +                    hasStop.enter(inliningTarget);
        +                    try {
        +                        stop = asIntNode.executeExact(frame, inliningTarget, args[1], OverflowError);
        +                    } catch (PException e) {
        +                        stopNotInt.enter(inliningTarget);
        +                        throw raiseNode.raise(inliningTarget, ValueError, S_FOR_ISLICE_MUST_BE, "Indices");
        +                    }
        +                }
        +                if (stop < -1 || stop > SysModuleBuiltins.MAXSIZE) {
        +                    stopWrongValue.enter(inliningTarget);
        +                    throw raiseNode.raise(inliningTarget, ValueError, S_FOR_ISLICE_MUST_BE, "Indices");
        +                }
        +            } else if (argsLen2.profile(inliningTarget, args.length == 3) || argsLen3.profile(inliningTarget, args.length == 4)) {
        +                if (args[1] != PNone.NONE) {
        +                    hasStart.enter(inliningTarget);
        +                    try {
        +                        start = asIntNode.executeExact(frame, inliningTarget, args[1], OverflowError);
        +                    } catch (PException e) {
        +                        startNotInt.enter(inliningTarget);
        +                        throw raiseNode.raise(inliningTarget, ValueError, S_FOR_ISLICE_MUST_BE, "Indices");
        +                    }
        +                }
        +                if (args[2] != PNone.NONE) {
        +                    hasStop.enter(inliningTarget);
        +                    try {
        +                        stop = asIntNode.executeExact(frame, inliningTarget, args[2], OverflowError);
        +                    } catch (PException e) {
        +                        stopNotInt.enter(inliningTarget);
        +                        throw raiseNode.raise(inliningTarget, ValueError, S_FOR_ISLICE_MUST_BE, "Stop argument");
        +                    }
        +                }
        +                if (start < 0 || stop < -1 || start > SysModuleBuiltins.MAXSIZE || stop > SysModuleBuiltins.MAXSIZE) {
        +                    wrongValue.enter(inliningTarget);
        +                    throw raiseNode.raise(inliningTarget, ValueError, S_FOR_ISLICE_MUST_BE, "Indices");
        +                }
        +            }
        +            if (argsLen3.profile(inliningTarget, args.length == 4)) {
        +                if (args[3] != PNone.NONE) {
        +                    hasStep.enter(inliningTarget);
        +                    try {
        +                        step = asIntNode.executeExact(frame, inliningTarget, args[3], OverflowError);
        +                    } catch (PException e) {
        +                        overflowBranch.enter(inliningTarget);
        +                        step = -1;
        +                    }
        +                }
        +                if (step < 1) {
        +                    stepWrongValue.enter(inliningTarget);
        +                    throw raiseNode.raise(inliningTarget, ValueError, STEP_FOR_ISLICE_MUST_BE);
        +                }
        +            }
        +            Object iterable = args[0];
        +            PIslice self = PFactory.createIslice(language, cls, getInstanceShape.execute(cls));
        +            self.setIterable(getIter.execute(frame, inliningTarget, iterable));
        +            self.setNext(start);
        +            self.setStop(stop);
        +            self.setStep(step);
        +            self.setCnt(0);
        +            return self;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -96,57 +222,47 @@ static Object iter(PIslice self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization(guards = "isNone(self.getIterable())")
        -        static Object next(@SuppressWarnings("unused") PIslice self,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raiseStopIteration();
        +        static Object next(@SuppressWarnings("unused") PIslice self) {
        +            throw iteratorExhausted();
                 }
         
                 @Specialization(guards = "!isNone(self.getIterable())")
                 static Object next(VirtualFrame frame, PIslice self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached BuiltinFunctions.NextNode nextNode,
        +                        @Cached GetObjectSlotsNode getSlots,
        +                        @Cached CallSlotTpIterNextNode callIterNext,
                                 @Cached InlinedLoopConditionProfile loopProfile,
        -                        @Cached InlinedBranchProfile nextExceptionProfile,
        -                        @Cached InlinedBranchProfile nextExceptionProfile2,
        -                        @Cached InlinedBranchProfile setNextProfile,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached InlinedBranchProfile setNextProfile) {
                     Object it = self.getIterable();
        +            TpSlot iterNext = getSlots.execute(inliningTarget, it).tp_iternext();
                     int stop = self.getStop();
                     Object item;
        -            while (loopProfile.profile(inliningTarget, self.getCnt() < self.getNext())) {
        -                try {
        -                    item = nextNode.execute(frame, it, PNone.NO_VALUE);
        -                } catch (PException e) {
        -                    nextExceptionProfile.enter(inliningTarget);
        -                    // C code uses any exception to clear the iterator
        +            try {
        +                while (loopProfile.profile(inliningTarget, self.getCnt() < self.getNext())) {
        +                    callIterNext.execute(frame, inliningTarget, iterNext, it);
        +                    self.setCnt(self.getCnt() + 1);
        +                }
        +                if (stop != -1 && self.getCnt() >= stop) {
                             self.setIterable(PNone.NONE);
        -                    throw e;
        +                    throw iteratorExhausted();
                         }
        +                item = callIterNext.execute(frame, inliningTarget, iterNext, it);
                         self.setCnt(self.getCnt() + 1);
        -            }
        -            if (stop != -1 && self.getCnt() >= stop) {
        -                self.setIterable(PNone.NONE);
        -                throw raiseNode.get(inliningTarget).raiseStopIteration();
        -            }
        -            try {
        -                item = nextNode.execute(frame, it, PNone.NO_VALUE);
        -            } catch (PException e) {
        -                nextExceptionProfile2.enter(inliningTarget);
        +                int oldNext = self.getNext();
        +                self.setNext(self.getNext() + self.getStep());
        +                if (self.getNext() < oldNext || (stop != -1 && self.getNext() > stop)) {
        +                    setNextProfile.enter(inliningTarget);
        +                    self.setNext(stop);
        +                }
        +                return item;
        +            } catch (IteratorExhausted | PException e) {
                         self.setIterable(PNone.NONE);
                         throw e;
                     }
        -            self.setCnt(self.getCnt() + 1);
        -            int oldNext = self.getNext();
        -            self.setNext(self.getNext() + self.getStep());
        -            if (self.getNext() < oldNext || (stop != -1 && self.getNext() > stop)) {
        -                setNextProfile.enter(inliningTarget);
        -                self.setNext(stop);
        -            }
        -            return item;
                 }
             }
         
        @@ -158,22 +274,22 @@ static Object reduceNoIterable(VirtualFrame frame, PIslice self,
                                 @Bind("this") Node inliningTarget,
                                 @Exclusive @Cached GetClassNode getClassNode,
                                 @Cached PyObjectGetIter getIter,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     // return type(self), (iter([]), 0), 0
                     Object type = getClassNode.execute(inliningTarget, self);
        -            PTuple tuple = factory.createTuple(new Object[]{getIter.execute(frame, inliningTarget, factory.createList()), 0});
        -            return factory.createTuple(new Object[]{type, tuple, 0});
        +            PTuple tuple = PFactory.createTuple(language, new Object[]{getIter.execute(frame, inliningTarget, PFactory.createList(language)), 0});
        +            return PFactory.createTuple(language, new Object[]{type, tuple, 0});
                 }
         
                 @Specialization(guards = "!isNone(self.getIterable())")
                 static Object reduce(PIslice self,
                                 @Bind("this") Node inliningTarget,
                                 @Exclusive @Cached GetClassNode getClassNode,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object type = getClassNode.execute(inliningTarget, self);
                     Object stop = (self.getStop() == -1) ? PNone.NONE : self.getStop();
        -            PTuple tuple = factory.createTuple(new Object[]{self.getIterable(), self.getNext(), stop, self.getStep()});
        -            return factory.createTuple(new Object[]{type, tuple, self.getCnt()});
        +            PTuple tuple = PFactory.createTuple(language, new Object[]{self.getIterable(), self.getNext(), stop, self.getStep()});
        +            return PFactory.createTuple(language, new Object[]{type, tuple, self.getCnt()});
                 }
             }
         
        @@ -184,14 +300,13 @@ public abstract static class SetStateNode extends PythonBinaryBuiltinNode {
                 static Object setState(PIslice self, Object state,
                                 @Bind("this") Node inliningTarget,
                                 @Cached CastToJavaIntLossyNode castInt,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     try {
                         self.setCnt(castInt.execute(inliningTarget, state));
                     } catch (CannotCastException e) {
        -                throw raiseNode.get(inliningTarget).raise(ValueError, INVALID_ARGS, T___SETSTATE__);
        +                throw raiseNode.raise(inliningTarget, ValueError, INVALID_ARGS, T___SETSTATE__);
                     }
                     return PNone.NONE;
                 }
             }
        -
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/PGroupBy.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/PGroupBy.java
        index 9ab040d504..1d7b90b5f5 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/PGroupBy.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/PGroupBy.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,9 +40,8 @@
          */
         package com.oracle.graal.python.builtins.objects.itertools;
         
        -import com.oracle.graal.python.builtins.modules.BuiltinFunctions;
        -import com.oracle.graal.python.builtins.objects.PNone;
         import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
        +import com.oracle.graal.python.lib.PyIterNextNode;
         import com.oracle.graal.python.nodes.call.CallNode;
         import com.oracle.truffle.api.frame.VirtualFrame;
         import com.oracle.truffle.api.nodes.Node;
        @@ -110,8 +109,8 @@ public void setCurrKey(Object currKey) {
                 this.currKey = currKey;
             }
         
        -    void groupByStep(VirtualFrame frame, Node inliningTarget, BuiltinFunctions.NextNode nextNode, CallNode callNode, InlinedConditionProfile hasFuncProfile) {
        -        Object newValue = nextNode.execute(frame, it, PNone.NO_VALUE);
        +    void groupByStep(VirtualFrame frame, Node inliningTarget, PyIterNextNode nextNode, CallNode callNode, InlinedConditionProfile hasFuncProfile) {
        +        Object newValue = nextNode.execute(frame, inliningTarget, it);
                 Object newKey;
                 if (hasFuncProfile.profile(inliningTarget, keyFunc == null)) {
                     newKey = newValue;
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/PTeeDataObject.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/PTeeDataObject.java
        index 2fabb2896f..ddc0353cd9 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/PTeeDataObject.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/PTeeDataObject.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -43,12 +43,12 @@
         import static com.oracle.graal.python.builtins.objects.itertools.TeeDataObjectBuiltins.LINKCELLS;
         import static com.oracle.graal.python.nodes.ErrorMessages.CANNOT_REENTER_TEE_ITERATOR;
         
        +import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        -import com.oracle.graal.python.builtins.modules.BuiltinFunctions;
        -import com.oracle.graal.python.builtins.objects.PNone;
         import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
        +import com.oracle.graal.python.lib.PyIterNextNode;
         import com.oracle.graal.python.nodes.PRaiseNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.frame.VirtualFrame;
         import com.oracle.truffle.api.nodes.Node;
         import com.oracle.truffle.api.object.Shape;
        @@ -113,33 +113,32 @@ public void setNextlink(PTeeDataObject nextlink) {
                 this.nextlink = nextlink;
             }
         
        -    PTeeDataObject jumplink(PythonObjectFactory factory) {
        +    PTeeDataObject jumplink(PythonLanguage language) {
                 if (getNextlink() == null) {
        -            PTeeDataObject dataObj = factory.createTeeDataObject(getIt());
        +            PTeeDataObject dataObj = PFactory.createTeeDataObject(language, getIt());
                     nextlink = dataObj;
                 }
                 return nextlink;
             }
         
        -    Object getItem(VirtualFrame frame, Node inliningTarget, int i, BuiltinFunctions.NextNode nextNode, PRaiseNode.Lazy raiseNode) {
        +    Object getItem(VirtualFrame frame, Node inliningTarget, int i, PyIterNextNode nextNode, PRaiseNode raiseNode) {
                 assert i < TeeDataObjectBuiltins.LINKCELLS;
                 if (i < numread) {
                     return values[i];
                 } else {
                     assert i == numread;
                     if (running) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, CANNOT_REENTER_TEE_ITERATOR);
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, CANNOT_REENTER_TEE_ITERATOR);
                     }
         
                     running = true;
        -            Object value;
                     try {
        -                value = nextNode.execute(frame, it, PNone.NO_VALUE);
        +                Object value = nextNode.execute(frame, inliningTarget, it);
        +                values[numread++] = value;
        +                return value;
                     } finally {
                         running = false;
                     }
        -            values[numread++] = value;
        -            return value;
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/PairwiseBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/PairwiseBuiltins.java
        index 775ebb45f6..6a3b2829ea 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/PairwiseBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/PairwiseBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,23 +40,31 @@
          */
         package com.oracle.graal.python.builtins.objects.itertools;
         
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
        +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
         
         import java.util.List;
         
        -import com.oracle.graal.python.builtins.Builtin;
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.builtins.modules.BuiltinFunctions;
        -import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.CallSlotTpIterNextNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
        +import com.oracle.graal.python.lib.IteratorExhausted;
        +import com.oracle.graal.python.lib.PyObjectGetIter;
        +import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile;
         import com.oracle.graal.python.runtime.exception.PException;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        @@ -68,12 +76,37 @@
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PPairwise})
         public final class PairwiseBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = PairwiseBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return PairwiseBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "pairwise", minNumOfPositionalArgs = 2)
        +    @GenerateNodeFactory
        +    public abstract static class PairwaiseNode extends PythonBinaryBuiltinNode {
        +        @Specialization
        +        static PPairwise construct(VirtualFrame frame, Object cls, Object iterable,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached PyObjectGetIter getIter,
        +                        @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (!isTypeNode.execute(inliningTarget, cls)) {
        +                // Note: @Fallback or other @Specialization generate data-class
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
        +            }
        +
        +            PPairwise self = PFactory.createPairwise(language, cls, getInstanceShape.execute(cls));
        +            self.setIterable(getIter.execute(frame, inliningTarget, iterable));
        +            return self;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -82,37 +115,40 @@ static Object iter(PPairwise self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization(guards = "self.getIterable() != null")
                 static Object next(VirtualFrame frame, PPairwise self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached BuiltinFunctions.NextNode nextNode,
        -                        @Cached IsBuiltinObjectProfile isStopIterationProfile,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Cached GetObjectSlotsNode getSlots,
        +                        @Cached CallSlotTpIterNextNode callIterNext,
        +                        @Bind PythonLanguage language) {
                     Object item;
                     Object old = self.getOld();
        -            if (self.getOld() == null) {
        -                old = nextNode.execute(frame, self.getIterable(), PNone.NO_VALUE);
        -                self.setOld(old);
        -            }
        +            Object iterable = self.getIterable();
                     try {
        -                item = nextNode.execute(frame, self.getIterable(), PNone.NO_VALUE);
        +                if (self.getOld() == null) {
        +                    old = callIterNext.execute(frame, inliningTarget, getSlots.execute(inliningTarget, iterable).tp_iternext(), iterable);
        +                    self.setOld(old);
        +                    iterable = self.getIterable();
        +                    if (iterable == null) {
        +                        throw iteratorExhausted();
        +                    }
        +                }
        +                item = callIterNext.execute(frame, inliningTarget, getSlots.execute(inliningTarget, iterable).tp_iternext(), iterable);
                         self.setOld(item);
        -            } catch (PException e) {
        -                e.expectStopIteration(inliningTarget, isStopIterationProfile);
        -                self.setIterable(null);
        +                return PFactory.createTuple(language, new Object[]{old, item});
        +            } catch (IteratorExhausted | PException e) {
                         self.setOld(null);
        +                self.setIterable(null);
                         throw e;
                     }
        -            return factory.createTuple(new Object[]{old, item});
                 }
         
                 @Specialization(guards = "self.getIterable() == null")
        -        static Object next(@SuppressWarnings("unused") PPairwise self,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raiseStopIteration();
        +        static Object next(@SuppressWarnings("unused") PPairwise self) {
        +            throw iteratorExhausted();
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/PermutationsBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/PermutationsBuiltins.java
        index 3d3851bfb2..44cda304dd 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/PermutationsBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/PermutationsBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -42,34 +42,47 @@
         
         import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
         import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError;
        +import static com.oracle.graal.python.nodes.ErrorMessages.EXPECTED_INT_AS_R;
         import static com.oracle.graal.python.nodes.ErrorMessages.INVALID_ARGS;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
        +import static com.oracle.graal.python.nodes.ErrorMessages.MUST_BE_NON_NEGATIVE;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETSTATE__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.ArgumentClinic;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
         import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.iterator.IteratorNodes;
        +import com.oracle.graal.python.builtins.objects.itertools.PermutationsBuiltinsClinicProviders.PermutationsNodeClinicProviderGen;
         import com.oracle.graal.python.builtins.objects.list.PList;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
         import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins.GetItemNode;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
         import com.oracle.graal.python.lib.PyObjectSizeNode;
         import com.oracle.graal.python.nodes.ErrorMessages;
        +import com.oracle.graal.python.nodes.PGuards;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
         import com.oracle.graal.python.nodes.object.GetClassNode;
         import com.oracle.graal.python.nodes.util.CannotCastException;
         import com.oracle.graal.python.nodes.util.CastToJavaBooleanNode;
         import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.Cached.Shared;
        @@ -77,6 +90,7 @@
         import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.nodes.LoopNode;
         import com.oracle.truffle.api.nodes.Node;
         import com.oracle.truffle.api.profiles.InlinedBranchProfile;
         import com.oracle.truffle.api.profiles.InlinedConditionProfile;
        @@ -85,12 +99,93 @@
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PPermutations})
         public final class PermutationsBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = PermutationsBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return PermutationsBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "permutations", minNumOfPositionalArgs = 2, parameterNames = {"cls", "iterable", "r"})
        +    @ArgumentClinic(name = "r", defaultValue = "PNone.NONE")
        +    @GenerateNodeFactory
        +    public abstract static class PermutationsNode extends PythonTernaryClinicBuiltinNode {
        +        @Override
        +        protected ArgumentClinicProvider getArgumentClinic() {
        +            return PermutationsNodeClinicProviderGen.INSTANCE;
        +        }
        +
        +        @Specialization
        +        static Object construct(VirtualFrame frame, Object cls, Object iterable, Object rArg,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached InlinedConditionProfile rIsNoneProfile,
        +                        @Cached IteratorNodes.ToArrayNode toArrayNode,
        +                        @Cached CastToJavaIntExactNode castToInt,
        +                        @Cached InlinedConditionProfile wrongTypeProfile,
        +                        @Cached InlinedBranchProfile wrongRprofile,
        +                        @Cached InlinedBranchProfile negRprofile,
        +                        @Cached InlinedConditionProfile nrProfile,
        +                        @Cached InlinedLoopConditionProfile indicesLoopProfile,
        +                        @Cached InlinedLoopConditionProfile cyclesLoopProfile,
        +                        @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (!wrongTypeProfile.profile(inliningTarget, isTypeNode.execute(inliningTarget, cls))) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
        +            }
        +            int r;
        +            Object[] pool = toArrayNode.execute(frame, iterable);
        +            if (rIsNoneProfile.profile(inliningTarget, PGuards.isNone(rArg))) {
        +                r = pool.length;
        +            } else {
        +                try {
        +                    r = castToInt.execute(inliningTarget, rArg);
        +                } catch (CannotCastException e) {
        +                    wrongRprofile.enter(inliningTarget);
        +                    throw raiseNode.raise(inliningTarget, TypeError, EXPECTED_INT_AS_R);
        +                }
        +                if (r < 0) {
        +                    negRprofile.enter(inliningTarget);
        +                    throw raiseNode.raise(inliningTarget, ValueError, MUST_BE_NON_NEGATIVE, "r");
        +                }
        +            }
        +            PPermutations self = PFactory.createPermutations(language, cls, getInstanceShape.execute(cls));
        +            self.setPool(pool);
        +            self.setR(r);
        +            int n = pool.length;
        +            self.setN(n);
        +            int nMinusR = n - r;
        +            if (nrProfile.profile(inliningTarget, nMinusR < 0)) {
        +                self.setStopped(true);
        +                self.setRaisedStopIteration(true);
        +            } else {
        +                self.setStopped(false);
        +                int[] indices = new int[n];
        +                indicesLoopProfile.profileCounted(inliningTarget, indices.length);
        +                LoopNode.reportLoopCount(inliningTarget, indices.length);
        +                for (int i = 0; indicesLoopProfile.inject(inliningTarget, i < indices.length); i++) {
        +                    indices[i] = i;
        +                }
        +                self.setIndices(indices);
        +                int[] cycles = new int[r];
        +                int idx = 0;
        +                cyclesLoopProfile.profileCounted(inliningTarget, r);
        +                LoopNode.reportLoopCount(inliningTarget, r);
        +                for (int i = n; cyclesLoopProfile.inject(inliningTarget, i > nMinusR); i--) {
        +                    cycles[idx++] = i;
        +                }
        +                self.setCycles(cycles);
        +                self.setRaisedStopIteration(false);
        +                self.setStarted(false);
        +                return self;
        +            }
        +            return self;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -99,14 +194,13 @@ static Object iter(PPermutations self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization(guards = "self.isStopped()")
        -        static Object next(PPermutations self,
        -                        @Cached PRaiseNode raiseNode) {
        +        static Object next(PPermutations self) {
                     self.setRaisedStopIteration(true);
        -            throw raiseNode.raiseStopIteration();
        +            throw iteratorExhausted();
                 }
         
                 @Specialization(guards = "!self.isStopped()")
        @@ -117,8 +211,7 @@ static Object next(PPermutations self,
                                 @Cached InlinedLoopConditionProfile resultLoopProfile,
                                 @Cached InlinedLoopConditionProfile mainLoopProfile,
                                 @Cached InlinedLoopConditionProfile shiftIndicesProfile,
        -                        @Cached PythonObjectFactory factory,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Bind PythonLanguage language) {
                     int r = self.getR();
         
                     int[] indices = self.getIndices();
        @@ -139,7 +232,7 @@ static Object next(PPermutations self,
                             int tmp = indices[i];
                             indices[i] = indices[indices.length - j];
                             indices[indices.length - j] = tmp;
        -                    return factory.createTuple(result);
        +                    return PFactory.createTuple(language, result);
                         }
                         cycles[i] = indices.length - i;
                         int n1 = indices.length - 1;
        @@ -155,11 +248,11 @@ static Object next(PPermutations self,
         
                     self.setStopped(true);
                     if (isStartedProfile.profile(inliningTarget, self.isStarted())) {
        -                throw raiseNode.get(inliningTarget).raiseStopIteration();
        +                throw iteratorExhausted();
                     } else {
                         self.setStarted(true);
                     }
        -            return factory.createTuple(result);
        +            return PFactory.createTuple(language, result);
                 }
             }
         
        @@ -170,29 +263,29 @@ public abstract static class ReduceNode extends PythonUnaryBuiltinNode {
                 static Object reduce(PPermutations self,
                                 @Bind("this") Node inliningTarget,
                                 @Shared @Cached GetClassNode getClassNode,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object type = getClassNode.execute(inliningTarget, self);
        -            PList poolList = factory.createList(self.getPool());
        -            PTuple tuple = factory.createTuple(new Object[]{poolList, self.getR()});
        +            PList poolList = PFactory.createList(language, self.getPool());
        +            PTuple tuple = PFactory.createTuple(language, new Object[]{poolList, self.getR()});
         
                     // we must pickle the indices and use them for setstate
        -            PTuple indicesTuple = factory.createTuple(self.getIndices());
        -            PTuple cyclesTuple = factory.createTuple(self.getCycles());
        -            PTuple tuple2 = factory.createTuple(new Object[]{indicesTuple, cyclesTuple, self.isStarted()});
        +            PTuple indicesTuple = PFactory.createTuple(language, self.getIndices());
        +            PTuple cyclesTuple = PFactory.createTuple(language, self.getCycles());
        +            PTuple tuple2 = PFactory.createTuple(language, new Object[]{indicesTuple, cyclesTuple, self.isStarted()});
         
                     Object[] result = new Object[]{type, tuple, tuple2};
        -            return factory.createTuple(result);
        +            return PFactory.createTuple(language, result);
                 }
         
                 @Specialization(guards = "self.isRaisedStopIteration()")
                 static Object reduceStopped(PPermutations self,
                                 @Bind("this") Node inliningTarget,
                                 @Shared @Cached GetClassNode getClassNode,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object type = getClassNode.execute(inliningTarget, self);
        -            PTuple tuple = factory.createTuple(new Object[]{factory.createEmptyTuple(), self.getR()});
        +            PTuple tuple = PFactory.createTuple(language, new Object[]{PFactory.createEmptyTuple(language), self.getR()});
                     Object[] result = new Object[]{type, tuple};
        -            return factory.createTuple(result);
        +            return PFactory.createTuple(language, result);
                 }
             }
         
        @@ -209,16 +302,16 @@ static Object setState(VirtualFrame frame, PPermutations self, Object state,
                                 @Cached InlinedLoopConditionProfile cyclesProfile,
                                 @Cached CastToJavaBooleanNode castBoolean,
                                 @Cached CastToJavaIntExactNode castInt,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     try {
                         if (sizeNode.execute(frame, inliningTarget, state) != 3) {
        -                    throw raiseNode.get(inliningTarget).raise(ValueError, INVALID_ARGS, T___SETSTATE__);
        +                    throw raiseNode.raise(inliningTarget, ValueError, INVALID_ARGS, T___SETSTATE__);
                         }
                         Object indices = getItemNode.execute(frame, state, 0);
                         Object cycles = getItemNode.execute(frame, state, 1);
                         int poolLen = self.getPool().length;
                         if (sizeNode.execute(frame, inliningTarget, indices) != poolLen || sizeNode.execute(frame, inliningTarget, cycles) != self.getR()) {
        -                    throw raiseNode.get(inliningTarget).raise(ValueError, INVALID_ARGS, T___SETSTATE__);
        +                    throw raiseNode.raise(inliningTarget, ValueError, INVALID_ARGS, T___SETSTATE__);
                         }
         
                         self.setStarted(castBoolean.execute(inliningTarget, getItemNode.execute(frame, state, 2)));
        @@ -246,9 +339,8 @@ static Object setState(VirtualFrame frame, PPermutations self, Object state,
         
                         return PNone.NONE;
                     } catch (CannotCastException e) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.INTEGER_REQUIRED);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.INTEGER_REQUIRED);
                     }
                 }
             }
        -
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/ProductBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/ProductBuiltins.java
        index 0496482d7a..d3a4d6d591 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/ProductBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/ProductBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,37 +40,47 @@
          */
         package com.oracle.graal.python.builtins.objects.itertools;
         
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
        +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
        +import static com.oracle.graal.python.nodes.ErrorMessages.ARG_CANNOT_BE_NEGATIVE;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
         import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.iterator.IteratorNodes;
         import com.oracle.graal.python.builtins.objects.list.PList;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
         import com.oracle.graal.python.lib.PyLongAsIntNode;
         import com.oracle.graal.python.lib.PyObjectGetItem;
        +import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
        +import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
         import com.oracle.graal.python.nodes.object.GetClassNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.graal.python.util.PythonUtils;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.Cached.Exclusive;
        -import com.oracle.truffle.api.dsl.Cached.Shared;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
         import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.nodes.LoopNode;
         import com.oracle.truffle.api.nodes.Node;
         import com.oracle.truffle.api.profiles.InlinedBranchProfile;
         import com.oracle.truffle.api.profiles.InlinedConditionProfile;
        @@ -79,12 +89,122 @@
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PProduct})
         public final class ProductBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = ProductBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return ProductBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "product", minNumOfPositionalArgs = 1, takesVarArgs = true, keywordOnlyNames = {"repeat"})
        +    @GenerateNodeFactory
        +    public abstract static class ProductNode extends PythonBuiltinNode {
        +
        +        @Specialization(guards = "isTypeNode.execute(inliningTarget, cls)")
        +        static Object constructNoneRepeat(VirtualFrame frame, Object cls, Object[] iterables, @SuppressWarnings("unused") PNone repeat,
        +                        @SuppressWarnings("unused") @Bind("this") Node inliningTarget,
        +                        @Cached.Shared @Cached IteratorNodes.ToArrayNode toArrayNode,
        +                        @SuppressWarnings("unused") @Cached.Shared("typeNode") @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Bind PythonLanguage language,
        +                        @Cached.Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) {
        +            PProduct self = PFactory.createProduct(language, cls, getInstanceShape.execute(cls));
        +            constructOneRepeat(frame, self, iterables, toArrayNode);
        +            return self;
        +        }
        +
        +        @Specialization(guards = {"isTypeNode.execute(inliningTarget, cls)", "repeat == 1"}, limit = "1")
        +        static Object constructOneRepeat(VirtualFrame frame, Object cls, Object[] iterables, @SuppressWarnings("unused") int repeat,
        +                        @SuppressWarnings("unused") @Bind("this") Node inliningTarget,
        +                        @Cached.Shared @Cached IteratorNodes.ToArrayNode toArrayNode,
        +                        @SuppressWarnings("unused") @Exclusive @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Bind PythonLanguage language,
        +                        @Cached.Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) {
        +            PProduct self = PFactory.createProduct(language, cls, getInstanceShape.execute(cls));
        +            constructOneRepeat(frame, self, iterables, toArrayNode);
        +            return self;
        +        }
        +
        +        @Specialization(guards = {"isTypeNode.execute(inliningTarget, cls)", "repeat > 1"}, limit = "1")
        +        static Object construct(VirtualFrame frame, Object cls, Object[] iterables, int repeat,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached.Shared @Cached IteratorNodes.ToArrayNode toArrayNode,
        +                        @Cached InlinedLoopConditionProfile loopProfile,
        +                        @SuppressWarnings("unused") @Exclusive @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Bind PythonLanguage language,
        +                        @Cached.Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) {
        +            Object[][] lists = unpackIterables(frame, iterables, toArrayNode);
        +            Object[][] gears = new Object[lists.length * repeat][];
        +            loopProfile.profileCounted(inliningTarget, repeat);
        +            LoopNode.reportLoopCount(inliningTarget, repeat);
        +            for (int i = 0; loopProfile.inject(inliningTarget, i < repeat); i++) {
        +                PythonUtils.arraycopy(lists, 0, gears, i * lists.length, lists.length);
        +            }
        +            PProduct self = PFactory.createProduct(language, cls, getInstanceShape.execute(cls));
        +            construct(self, gears);
        +            return self;
        +        }
        +
        +        @Specialization(guards = {"isTypeNode.execute(inliningTarget, cls)", "repeat == 0"}, limit = "1")
        +        static Object constructNoRepeat(Object cls, @SuppressWarnings("unused") Object[] iterables, @SuppressWarnings("unused") int repeat,
        +                        @SuppressWarnings("unused") @Bind("this") Node inliningTarget,
        +                        @SuppressWarnings("unused") @Exclusive @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Bind PythonLanguage language,
        +                        @Cached.Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) {
        +            PProduct self = PFactory.createProduct(language, cls, getInstanceShape.execute(cls));
        +            self.setGears(new Object[0][]);
        +            self.setIndices(new int[0]);
        +            self.setLst(null);
        +            self.setStopped(false);
        +            return self;
        +        }
        +
        +        @SuppressWarnings("unused")
        +        @Specialization(guards = {"isTypeNode.execute(inliningTarget, cls)", "repeat < 0"}, limit = "1")
        +        static Object constructNeg(Object cls, Object[] iterables, int repeat,
        +                        @Bind("this") Node inliningTarget,
        +                        @Exclusive @Cached TypeNodes.IsTypeNode isTypeNode) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ARG_CANNOT_BE_NEGATIVE, "repeat");
        +        }
        +
        +        private static void constructOneRepeat(VirtualFrame frame, PProduct self, Object[] iterables, IteratorNodes.ToArrayNode toArrayNode) {
        +            Object[][] gears = unpackIterables(frame, iterables, toArrayNode);
        +            construct(self, gears);
        +        }
        +
        +        private static void construct(PProduct self, Object[][] gears) {
        +            self.setGears(gears);
        +            for (int i = 0; i < gears.length; i++) {
        +                if (gears[i].length == 0) {
        +                    self.setIndices(null);
        +                    self.setLst(null);
        +                    self.setStopped(true);
        +                    return;
        +                }
        +            }
        +            self.setIndices(new int[gears.length]);
        +            self.setLst(null);
        +            self.setStopped(false);
        +        }
        +
        +        private static Object[][] unpackIterables(VirtualFrame frame, Object[] iterables, IteratorNodes.ToArrayNode toArrayNode) {
        +            Object[][] lists = new Object[iterables.length][];
        +            for (int i = 0; i < lists.length; i++) {
        +                lists[i] = toArrayNode.execute(frame, iterables[i]);
        +            }
        +            return lists;
        +        }
        +
        +        @Specialization(guards = "!isTypeNode.execute(inliningTarget, cls)")
        +        @SuppressWarnings("unused")
        +        static Object construct(Object cls, Object iterables, Object repeat,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached.Shared("typeNode") @Cached TypeNodes.IsTypeNode isTypeNode) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -93,22 +213,22 @@ static Object iter(PProduct self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
         
                 @Specialization(guards = {"!self.isStopped()", "!hasLst(self)"})
                 static Object next(PProduct self,
                                 @Bind("this") Node inliningTarget,
                                 @Exclusive @Cached InlinedLoopConditionProfile loopProfile,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object[] lst = new Object[self.getGears().length];
                     loopProfile.profileCounted(inliningTarget, lst.length);
                     for (int i = 0; loopProfile.inject(inliningTarget, i < lst.length); i++) {
                         lst[i] = self.getGears()[i][0];
                     }
                     self.setLst(lst);
        -            return factory.createTuple(lst);
        +            return PFactory.createTuple(language, lst);
                 }
         
                 @Specialization(guards = {"!self.isStopped()", "hasLst(self)"})
        @@ -119,8 +239,7 @@ static Object next(PProduct self,
                                 @Cached InlinedBranchProfile wasStoppedProfile,
                                 @Exclusive @Cached InlinedLoopConditionProfile loopProfile,
                                 @Cached InlinedBranchProfile doneProfile,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Bind PythonLanguage language) {
                     Object[][] gears = self.getGears();
                     int x = gears.length - 1;
                     if (gearsProfile.profile(inliningTarget, x >= 0)) {
        @@ -140,20 +259,18 @@ static Object next(PProduct self,
         
                     if (self.isStopped()) {
                         wasStoppedProfile.enter(inliningTarget);
        -                throw raiseNode.get(inliningTarget).raiseStopIteration();
        +                throw iteratorExhausted();
                     }
         
                     // the existing lst array can be changed in a following next call
                     Object[] ret = new Object[self.getLst().length];
                     PythonUtils.arraycopy(self.getLst(), 0, ret, 0, ret.length);
        -            return factory.createTuple(ret);
        +            return PFactory.createTuple(language, ret);
                 }
         
        -        @SuppressWarnings("unused")
                 @Specialization(guards = "self.isStopped()")
        -        static Object nextStopped(PProduct self,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raiseStopIteration();
        +        static Object nextStopped(@SuppressWarnings("unused") PProduct self) {
        +            throw iteratorExhausted();
                 }
         
                 private static void rotatePreviousGear(Node inliningTarget, PProduct self, InlinedLoopConditionProfile loopProfile, InlinedBranchProfile doneProfile) {
        @@ -198,26 +315,26 @@ static Object reduce(PProduct self,
                                 @Cached InlinedConditionProfile stoppedProfile,
                                 @Cached InlinedConditionProfile noLstProfile,
                                 @Cached GetClassNode getClassNode,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object type = getClassNode.execute(inliningTarget, self);
                     if (stoppedProfile.profile(inliningTarget, self.isStopped())) {
        -                PTuple empty = factory.createEmptyTuple();
        -                return factory.createTuple(new Object[]{type, factory.createTuple(new Object[]{empty})});
        +                PTuple empty = PFactory.createEmptyTuple(language);
        +                return PFactory.createTuple(language, new Object[]{type, PFactory.createTuple(language, new Object[]{empty})});
                     }
        -            PTuple gearTuples = createGearTuple(self, factory);
        +            PTuple gearTuples = createGearTuple(self, language);
                     if (noLstProfile.profile(inliningTarget, self.getLst() == null)) {
        -                return factory.createTuple(new Object[]{type, gearTuples});
        +                return PFactory.createTuple(language, new Object[]{type, gearTuples});
                     }
        -            PTuple indicesTuple = factory.createTuple(PythonUtils.arrayCopyOf(self.getIndices(), self.getIndices().length));
        -            return factory.createTuple(new Object[]{type, gearTuples, indicesTuple});
        +            PTuple indicesTuple = PFactory.createTuple(language, PythonUtils.arrayCopyOf(self.getIndices(), self.getIndices().length));
        +            return PFactory.createTuple(language, new Object[]{type, gearTuples, indicesTuple});
                 }
         
        -        private static PTuple createGearTuple(PProduct self, PythonObjectFactory factory) {
        +        private static PTuple createGearTuple(PProduct self, PythonLanguage language) {
                     PList[] lists = new PList[self.getGears().length];
                     for (int i = 0; i < lists.length; i++) {
        -                lists[i] = factory.createList(self.getGears()[i]);
        +                lists[i] = PFactory.createList(language, self.getGears()[i]);
                     }
        -            return factory.createTuple(lists);
        +            return PFactory.createTuple(language, lists);
                 }
             }
         
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/RepeatBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/RepeatBuiltins.java
        index 58f51d17dd..4b7df9414d 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/RepeatBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/RepeatBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -43,28 +43,35 @@
         import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
         import static com.oracle.graal.python.nodes.ErrorMessages.LEN_OF_UNSIZED_OBJECT;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LENGTH_HINT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        +import com.oracle.graal.python.builtins.objects.PNone;
         import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
        +import com.oracle.graal.python.lib.PyNumberAsSizeNode;
         import com.oracle.graal.python.lib.PyObjectGetAttr;
         import com.oracle.graal.python.lib.PyObjectReprAsObjectNode;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
         import com.oracle.graal.python.nodes.object.GetClassNode;
         import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.Cached.Shared;
        @@ -79,12 +86,37 @@
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PRepeat})
         public final class RepeatBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = RepeatBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return RepeatBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "repeat", minNumOfPositionalArgs = 2, parameterNames = {"$self", "object", "times"})
        +    @GenerateNodeFactory
        +    public abstract static class RepeatNode extends PythonTernaryBuiltinNode {
        +
        +        @Specialization
        +        static Object construct(VirtualFrame frame, Object cls, Object object, Object timesObj,
        +                        @Bind("this") Node inliningTarget,
        +                        @Bind PythonLanguage language,
        +                        @Cached PyNumberAsSizeNode asSizeNode,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape) {
        +            PRepeat self = PFactory.createRepeat(language, cls, getInstanceShape.execute(cls));
        +            self.setElement(object);
        +            if (timesObj != PNone.NO_VALUE) {
        +                int times = asSizeNode.executeExact(frame, inliningTarget, timesObj);
        +                self.setCnt(times > 0 ? times : 0);
        +            } else {
        +                self.setCnt(-1);
        +            }
        +            return self;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -93,20 +125,18 @@ static Object iter(PRepeat self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization(guards = "self.getCnt() > 0")
                 static Object nextPos(PRepeat self) {
                     self.setCnt(self.getCnt() - 1);
                     return self.getElement();
                 }
         
        -        @SuppressWarnings("unused")
                 @Specialization(guards = "self.getCnt() == 0")
        -        static Object nextZero(PRepeat self,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raiseStopIteration();
        +        static Object nextZero(@SuppressWarnings("unused") PRepeat self) {
        +            throw iteratorExhausted();
                 }
         
                 @Specialization(guards = "self.getCnt() < 0")
        @@ -126,8 +156,8 @@ static Object hintPos(PRepeat self) {
                 @SuppressWarnings("unused")
                 @Specialization(guards = "self.getCnt() < 0")
                 static Object hintNeg(PRepeat self,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(TypeError, LEN_OF_UNSIZED_OBJECT);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, TypeError, LEN_OF_UNSIZED_OBJECT);
                 }
             }
         
        @@ -139,7 +169,7 @@ static Object reduce(PRepeat self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached InlinedConditionProfile negativeCountProfile,
                                 @Cached GetClassNode getClass,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object type = getClass.execute(inliningTarget, self);
                     Object[] tupleElements;
                     if (negativeCountProfile.profile(inliningTarget, self.getCnt() < 0)) {
        @@ -147,12 +177,12 @@ static Object reduce(PRepeat self,
                     } else {
                         tupleElements = new Object[]{self.getElement(), self.getCnt()};
                     }
        -            PTuple tuple = factory.createTuple(tupleElements);
        -            return factory.createTuple(new Object[]{type, tuple});
        +            PTuple tuple = PFactory.createTuple(language, tupleElements);
        +            return PFactory.createTuple(language, new Object[]{type, tuple});
                 }
             }
         
        -    @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
             @GenerateNodeFactory
             public abstract static class ReprNode extends PythonUnaryBuiltinNode {
                 @Specialization(guards = "self.getCnt() >= 0")
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/StarmapBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/StarmapBuiltins.java
        index 96bbb96001..fd242fa0c5 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/StarmapBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/StarmapBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,26 +40,36 @@
          */
         package com.oracle.graal.python.builtins.objects.itertools;
         
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
        +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.builtins.modules.BuiltinFunctions;
        -import com.oracle.graal.python.builtins.objects.PNone;
         import com.oracle.graal.python.builtins.objects.function.PKeyword;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.CallSlotTpIterNextNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
        +import com.oracle.graal.python.lib.PyObjectGetIter;
        +import com.oracle.graal.python.nodes.ErrorMessages;
        +import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.argument.positional.ExecutePositionalStarargsNode;
         import com.oracle.graal.python.nodes.call.CallNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
         import com.oracle.graal.python.nodes.object.GetClassNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        @@ -71,12 +81,45 @@
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PStarmap})
         public final class StarmapBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = StarmapBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return StarmapBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "starmap", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
        +    @GenerateNodeFactory
        +    public abstract static class StarmapNode extends PythonVarargsBuiltinNode {
        +        @Specialization
        +        static PStarmap construct(VirtualFrame frame, Object cls, Object[] args, PKeyword[] keywords,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached(inline = false /* uncommon path */) TypeNodes.HasObjectInitNode hasObjectInitNode,
        +                        @Cached PyObjectGetIter getIter,
        +                        @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (!isTypeNode.execute(inliningTarget, cls)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
        +            }
        +            if (keywords.length > 0 && hasObjectInitNode.executeCached(cls)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "starmap()");
        +            }
        +            if (args.length != 2) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_EXPECTED_D_ARGS, "starmap", 2);
        +            }
        +            Object fun = args[0];
        +            Object iterable = args[1];
        +            PStarmap self = PFactory.createStarmap(language, cls, getInstanceShape.execute(cls));
        +            self.setFun(fun);
        +            self.setIterable(getIter.execute(frame, inliningTarget, iterable));
        +            return self;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -85,15 +128,18 @@ static Object iter(PStarmap self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization
                 static Object nextPos(VirtualFrame frame, PStarmap self,
        -                        @Cached BuiltinFunctions.NextNode nextNode,
        +                        @Bind Node inliningTarget,
        +                        @Cached GetObjectSlotsNode getSlots,
        +                        @Cached CallSlotTpIterNextNode callIterNext,
                                 @Cached CallNode callNode,
                                 @Cached ExecutePositionalStarargsNode getArgsNode) {
        -            Object obj = nextNode.execute(frame, self.getIterable(), PNone.NO_VALUE);
        +            Object it = self.getIterable();
        +            Object obj = callIterNext.execute(frame, inliningTarget, getSlots.execute(inliningTarget, it).tp_iternext(), it);
                     Object[] args = getArgsNode.executeWith(frame, obj);
                     return callNode.execute(frame, self.getFun(), args, PKeyword.EMPTY_KEYWORDS);
                 }
        @@ -106,12 +152,11 @@ public abstract static class ReduceNode extends PythonUnaryBuiltinNode {
                 static Object reducePos(PStarmap self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached GetClassNode getClassNode,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object type = getClassNode.execute(inliningTarget, self);
                     // return type(self), (self.fun, self.iterable)
        -            PTuple tuple = factory.createTuple(new Object[]{self.getFun(), self.getIterable()});
        -            return factory.createTuple(new Object[]{type, tuple});
        +            PTuple tuple = PFactory.createTuple(language, new Object[]{self.getFun(), self.getIterable()});
        +            return PFactory.createTuple(language, new Object[]{type, tuple});
                 }
             }
        -
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/TakewhileBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/TakewhileBuiltins.java
        index 634798e2ac..b1544ba1b2 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/TakewhileBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/TakewhileBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,26 +40,36 @@
          */
         package com.oracle.graal.python.builtins.objects.itertools;
         
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
        +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.builtins.modules.BuiltinFunctions;
        -import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.function.PKeyword;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.CallSlotTpIterNextNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
        +import com.oracle.graal.python.lib.PyObjectGetIter;
         import com.oracle.graal.python.lib.PyObjectIsTrueNode;
        +import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.call.CallNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
         import com.oracle.graal.python.nodes.object.GetClassNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.graal.python.util.PythonUtils;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
        @@ -72,12 +82,45 @@
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PTakewhile})
         public final class TakewhileBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = TakewhileBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return TakewhileBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "takewhile", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
        +    @GenerateNodeFactory
        +    public abstract static class TakewhileNode extends PythonVarargsBuiltinNode {
        +        @Specialization
        +        static PTakewhile construct(VirtualFrame frame, Object cls, Object[] args, PKeyword[] keywords,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached(inline = false /* uncommon path */) TypeNodes.HasObjectInitNode hasObjectInitNode,
        +                        @Cached PyObjectGetIter getIter,
        +                        @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (!isTypeNode.execute(inliningTarget, cls)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
        +            }
        +            if (keywords.length > 0 && hasObjectInitNode.executeCached(cls)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "takewhile()");
        +            }
        +            if (args.length != 2) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_EXPECTED_D_ARGS, "takewhile", 2);
        +            }
        +            Object predicate = args[0];
        +            Object iterable = args[1];
        +            PTakewhile self = PFactory.createTakewhile(language, cls, getInstanceShape.execute(cls));
        +            self.setPredicate(predicate);
        +            self.setIterable(getIter.execute(frame, inliningTarget, iterable));
        +            return self;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -86,21 +129,22 @@ static Object iter(PTakewhile self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization
                 static Object next(VirtualFrame frame, PTakewhile self,
        -                        @Bind("this") Node inliningTarget,
        -                        @Cached BuiltinFunctions.NextNode nextNode,
        +                        @Bind Node inliningTarget,
        +                        @Cached GetObjectSlotsNode getSlots,
        +                        @Cached CallSlotTpIterNextNode callIterNext,
                                 @Cached CallNode callNode,
                                 @Cached PyObjectIsTrueNode isTrue,
        -                        @Cached PythonObjectFactory factory,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        -            Object value = nextNode.execute(frame, self.getIterable(), PNone.NO_VALUE);
        -            if (!isTrue.execute(frame, inliningTarget, callNode.execute(frame, self.getPredicate(), value))) {
        -                self.setIterable(factory.createSequenceIterator(factory.createList(PythonUtils.EMPTY_OBJECT_ARRAY)));
        -                throw raiseNode.get(inliningTarget).raiseStopIteration();
        +                        @Bind PythonLanguage language) {
        +            Object it = self.getIterable();
        +            Object value = callIterNext.execute(frame, inliningTarget, getSlots.execute(inliningTarget, it).tp_iternext(), it);
        +            if (!isTrue.execute(frame, callNode.execute(frame, self.getPredicate(), value))) {
        +                self.setIterable(PFactory.createSequenceIterator(language, PFactory.createList(language, PythonUtils.EMPTY_OBJECT_ARRAY)));
        +                throw iteratorExhausted();
                     }
                     return value;
                 }
        @@ -113,10 +157,10 @@ public abstract static class ReduceNode extends PythonUnaryBuiltinNode {
                 static Object reduce(PTakewhile self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached GetClassNode getClassNode,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object type = getClassNode.execute(inliningTarget, self);
        -            PTuple tuple = factory.createTuple(new Object[]{self.getPredicate(), self.getIterable()});
        -            return factory.createTuple(new Object[]{type, tuple});
        +            PTuple tuple = PFactory.createTuple(language, new Object[]{self.getPredicate(), self.getIterable()});
        +            return PFactory.createTuple(language, new Object[]{type, tuple});
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/TeeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/TeeBuiltins.java
        index 29fad45e82..a9733a1d57 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/TeeBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/TeeBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -47,25 +47,27 @@
         import static com.oracle.graal.python.nodes.ErrorMessages.INTEGER_REQUIRED_GOT;
         import static com.oracle.graal.python.nodes.ErrorMessages.IS_NOT_A;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___COPY__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___COPY__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.builtins.modules.BuiltinFunctions;
         import com.oracle.graal.python.builtins.objects.PNone;
        -import com.oracle.graal.python.builtins.objects.object.PythonObject;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
         import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins;
         import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins.LenNode;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
        +import com.oracle.graal.python.lib.PyIterNextNode;
         import com.oracle.graal.python.lib.PyObjectGetIter;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
        @@ -75,10 +77,9 @@
         import com.oracle.graal.python.nodes.object.GetClassNode;
         import com.oracle.graal.python.nodes.util.CannotCastException;
         import com.oracle.graal.python.nodes.util.CastToJavaIntLossyNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
        -import com.oracle.truffle.api.dsl.Cached.Shared;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
         import com.oracle.truffle.api.dsl.ImportStatic;
         import com.oracle.truffle.api.dsl.NeverDefault;
        @@ -91,12 +92,15 @@
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PTee})
         public final class TeeBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = TeeBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return TeeBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___NEW__, minNumOfPositionalArgs = 2)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(minNumOfPositionalArgs = 2)
             @GenerateNodeFactory
             public abstract static class NewNode extends PythonBinaryBuiltinNode {
                 @Specialization
        @@ -105,13 +109,13 @@ static Object newTee(VirtualFrame frame, @SuppressWarnings("unused") Object cls,
                                 @Cached PyObjectGetIter getIter,
                                 @Cached("createCopyNode()") LookupAndCallUnaryNode copyNode,
                                 @Cached InlinedConditionProfile isTeeInstanceProfile,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object it = getIter.execute(frame, inliningTarget, iterable);
                     if (isTeeInstanceProfile.profile(inliningTarget, it instanceof PTee)) {
                         return copyNode.executeObject(frame, it);
                     } else {
        -                PTeeDataObject dataObj = factory.createTeeDataObject(it);
        -                return factory.createTee(dataObj, 0);
        +                PTeeDataObject dataObj = PFactory.createTeeDataObject(language, it);
        +                return PFactory.createTee(language, dataObj, 0);
                     }
                 }
         
        @@ -126,12 +130,12 @@ protected LookupAndCallUnaryNode createCopyNode() {
             public abstract static class CopyNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static Object copy(PTee self,
        -                        @Cached PythonObjectFactory factory) {
        -            return factory.createTee(self.getDataobj(), self.getIndex());
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createTee(language, self.getDataobj(), self.getIndex());
                 }
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -140,55 +144,47 @@ static Object iter(PTee self) {
                 }
             }
         
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @ImportStatic(TeeDataObjectBuiltins.class)
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        -        @Specialization(guards = "self.getIndex() < LINKCELLS")
        -        static Object next(VirtualFrame frame, PTee self,
        +    public abstract static class NextNode extends TpIterNextBuiltin {
        +        @Specialization
        +        static Object doIt(VirtualFrame frame, PTee self,
                                 @Bind("this") Node inliningTarget,
        -                        @Shared @Cached BuiltinFunctions.NextNode nextNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Bind PythonLanguage language,
        +                        @Cached InlinedConditionProfile indexConditionProfile,
        +                        @Cached PyIterNextNode nextNode,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (indexConditionProfile.profile(inliningTarget, self.getIndex() >= LINKCELLS)) {
        +                self.setDataObj(self.getDataobj().jumplink(language));
        +                self.setIndex(0);
        +            }
                     Object value = self.getDataobj().getItem(frame, inliningTarget, self.getIndex(), nextNode, raiseNode);
                     self.setIndex(self.getIndex() + 1);
                     return value;
                 }
        -
        -        @Specialization(guards = "self.getIndex() >= LINKCELLS")
        -        static Object nextNext(VirtualFrame frame, PTee self,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached BuiltinFunctions.NextNode nextNode,
        -                        @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            self.setDataObj(self.getDataobj().jumplink(factory));
        -            Object value = self.getDataobj().getItem(frame, inliningTarget, 0, nextNode, raiseNode);
        -            self.setIndex(1);
        -            return value;
        -        }
             }
         
             @Builtin(name = J___REDUCE__, minNumOfPositionalArgs = 1)
             @GenerateNodeFactory
             public abstract static class ReduceNode extends PythonUnaryBuiltinNode {
        -        abstract Object execute(VirtualFrame frame, PythonObject self);
         
                 @Specialization
                 static Object reduce(PTee self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached GetClassNode getClass,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     // return type(self), ((),), (self.dataobj, self.index)
                     Object type = getClass.execute(inliningTarget, self);
        -            PTuple tuple1 = factory.createTuple(new Object[]{factory.createEmptyTuple()});
        -            PTuple tuple2 = factory.createTuple(new Object[]{self.getDataobj(), self.getIndex()});
        -            return factory.createTuple(new Object[]{type, tuple1, tuple2});
        +            PTuple tuple1 = PFactory.createTuple(language, new Object[]{PFactory.createEmptyTuple(language)});
        +            PTuple tuple2 = PFactory.createTuple(language, new Object[]{self.getDataobj(), self.getIndex()});
        +            return PFactory.createTuple(language, new Object[]{type, tuple1, tuple2});
                 }
             }
         
             @Builtin(name = J___SETSTATE__, minNumOfPositionalArgs = 2)
             @GenerateNodeFactory
             public abstract static class SetStateNode extends PythonBinaryBuiltinNode {
        -        abstract Object execute(VirtualFrame frame, PythonObject self, Object state);
         
                 @Specialization
                 static Object setState(VirtualFrame frame, PTee self, Object state,
        @@ -196,14 +192,14 @@ static Object setState(VirtualFrame frame, PTee self, Object state,
                                 @Cached LenNode lenNode,
                                 @Cached TupleBuiltins.GetItemNode getItemNode,
                                 @Cached CastToJavaIntLossyNode castToIntNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
         
                     if (!(state instanceof PTuple) || (int) lenNode.execute(frame, state) != 2) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, IS_NOT_A, "state", "2-tuple");
        +                throw raiseNode.raise(inliningTarget, TypeError, IS_NOT_A, "state", "2-tuple");
                     }
                     Object dataObject = getItemNode.execute(frame, state, 0);
                     if (!(dataObject instanceof PTeeDataObject)) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, IS_NOT_A, "state", "_tee_dataobject");
        +                throw raiseNode.raise(inliningTarget, TypeError, IS_NOT_A, "state", "_tee_dataobject");
                     }
                     self.setDataObj((PTeeDataObject) dataObject);
                     Object secondElement = getItemNode.execute(frame, state, 1);
        @@ -211,10 +207,10 @@ static Object setState(VirtualFrame frame, PTee self, Object state,
                     try {
                         index = castToIntNode.execute(inliningTarget, secondElement);
                     } catch (CannotCastException e) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, INTEGER_REQUIRED_GOT, secondElement);
        +                throw raiseNode.raise(inliningTarget, TypeError, INTEGER_REQUIRED_GOT, secondElement);
                     }
                     if (index < 0 || index > LINKCELLS) {
        -                throw raiseNode.get(inliningTarget).raise(ValueError, INDEX_OUT_OF_RANGE);
        +                throw raiseNode.raise(inliningTarget, ValueError, INDEX_OUT_OF_RANGE);
                     }
                     self.setIndex(index);
                     return PNone.NONE;
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/TeeDataObjectBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/TeeDataObjectBuiltins.java
        index ec23f0beac..fef12b270a 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/TeeDataObjectBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/TeeDataObjectBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -46,13 +46,15 @@
         import static com.oracle.graal.python.nodes.ErrorMessages.S_MUST_BE_S;
         import static com.oracle.graal.python.nodes.ErrorMessages.TDATAOBJECT_SHOULDNT_HAVE_NEXT;
         import static com.oracle.graal.python.nodes.ErrorMessages.TDATAOBJECT_SHOULD_NOT_HAVE_MORE_LINKS;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___COPY__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.annotations.ArgumentClinic;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        @@ -60,17 +62,21 @@
         import com.oracle.graal.python.builtins.modules.BuiltinFunctions.LenNode;
         import com.oracle.graal.python.builtins.objects.PNone;
         import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
        +import com.oracle.graal.python.builtins.objects.function.PKeyword;
         import com.oracle.graal.python.builtins.objects.list.PList;
         import com.oracle.graal.python.builtins.objects.object.PythonObject;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
        -import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryClinicBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
         import com.oracle.graal.python.nodes.object.GetClassNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.graal.python.util.PythonUtils;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
        @@ -86,12 +92,34 @@ public final class TeeDataObjectBuiltins extends PythonBuiltins {
         
             static final int LINKCELLS = 128;
         
        +    public static final TpSlots SLOTS = TeeDataObjectBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return TeeDataObjectBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, parameterNames = {"$self", "it", "values", "nxt"})
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "_tee_dataobject", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
        +    @GenerateNodeFactory
        +    public abstract static class TeeDataObjectNode extends PythonVarargsBuiltinNode {
        +        @SuppressWarnings("unused")
        +        @Specialization
        +        PTeeDataObject construct(Object cls, Object[] arguments, PKeyword[] keywords,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Cached InlinedBranchProfile errorProfile,
        +                        @Bind PythonLanguage language) {
        +            if (!isTypeNode.execute(inliningTarget, cls)) {
        +                errorProfile.enter(inliningTarget);
        +                throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
        +            }
        +            return PFactory.createTeeDataObject(language);
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_init, isComplex = true)
        +    @SlotSignature(name = "TeeDataObject", minNumOfPositionalArgs = 1, parameterNames = {"$self", "it", "values", "nxt"})
             @ArgumentClinic(name = "values", defaultValue = "PNone.NONE", useDefaultForNone = true)
             @ArgumentClinic(name = "nxt", defaultValue = "PNone.NONE", useDefaultForNone = true)
             @GenerateNodeFactory
        @@ -124,23 +152,23 @@ private static void init(PTeeDataObject self, Object it, PTeeDataObject nxt) {
                     self.setNextlink(nxt);
                 }
         
        -        @Specialization(guards = "isList(values)")
        +        @Specialization
                 static Object init(VirtualFrame frame, PTeeDataObject self, Object it, PList values, Object nxt,
                                 @Bind("this") Node inliningTarget,
                                 @Cached LenNode lenNode,
                                 @Cached SequenceStorageNodes.GetInternalObjectArrayNode getInternalObjectArrayNode,
                                 @Cached InlinedBranchProfile numreadLCProfile,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     int numread = (int) lenNode.execute(frame, values);
                     if (numread == LINKCELLS) {
                         numreadLCProfile.enter(inliningTarget);
                         if (!(nxt instanceof PTeeDataObject)) {
        -                    throw raiseNode.get(inliningTarget).raise(ValueError, S_MUST_BE_S, "_tee_dataobject next link", "_tee_dataobject");
        +                    throw raiseNode.raise(inliningTarget, ValueError, S_MUST_BE_S, "_tee_dataobject next link", "_tee_dataobject");
                         }
                     } else if (numread > LINKCELLS) {
        -                throw raiseNode.get(inliningTarget).raise(ValueError, TDATAOBJECT_SHOULD_NOT_HAVE_MORE_LINKS, LINKCELLS);
        +                throw raiseNode.raise(inliningTarget, ValueError, TDATAOBJECT_SHOULD_NOT_HAVE_MORE_LINKS, LINKCELLS);
                     } else if (!(nxt instanceof PNone)) {
        -                throw raiseNode.get(inliningTarget).raise(ValueError, TDATAOBJECT_SHOULDNT_HAVE_NEXT);
        +                throw raiseNode.raise(inliningTarget, ValueError, TDATAOBJECT_SHOULDNT_HAVE_NEXT);
                     }
                     self.setIt(it);
                     Object[] valuesArray = getInternalObjectArrayNode.execute(inliningTarget, values.getSequenceStorage());
        @@ -156,12 +184,8 @@ static Object init(VirtualFrame frame, PTeeDataObject self, Object it, PList val
                 @SuppressWarnings("unused")
                 @Specialization(guards = {"!isList(values)", "!isNone(values)"})
                 static Object init(VirtualFrame frame, PTeeDataObject self, Object it, Object values, Object nxt,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(TypeError, ARG_D_MUST_BE_S_NOT_P, "teedataobject()", 2, "list", values);
        -        }
        -
        -        protected LookupAndCallUnaryNode createCopyNode() {
        -            return LookupAndCallUnaryNode.create(T___COPY__);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ARG_D_MUST_BE_S_NOT_P, "teedataobject()", 2, "list", values);
                 }
             }
         
        @@ -174,14 +198,14 @@ public abstract static class ReduceNode extends PythonUnaryBuiltinNode {
                 static Object reduce(PTeeDataObject self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached GetClassNode getClass,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     int numread = self.getNumread();
                     Object[] values = new Object[numread];
                     PythonUtils.arraycopy(self.getValues(), 0, values, 0, numread);
                     Object type = getClass.execute(inliningTarget, self);
                     Object nextlink = self.getNextlink();
        -            PTuple tuple = factory.createTuple(new Object[]{self.getIt(), factory.createList(values), nextlink == null ? PNone.NONE : nextlink});
        -            return factory.createTuple(new Object[]{type, tuple});
        +            PTuple tuple = PFactory.createTuple(language, new Object[]{self.getIt(), PFactory.createList(language, values), nextlink == null ? PNone.NONE : nextlink});
        +            return PFactory.createTuple(language, new Object[]{type, tuple});
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/ZipLongestBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/ZipLongestBuiltins.java
        index 0384b449f1..144fb87465 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/ZipLongestBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/itertools/ZipLongestBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,48 +40,102 @@
          */
         package com.oracle.graal.python.builtins.objects.itertools;
         
        -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.StopIteration;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
        +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.builtins.modules.BuiltinFunctions;
         import com.oracle.graal.python.builtins.objects.PNone;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
        +import com.oracle.graal.python.lib.IteratorExhausted;
        +import com.oracle.graal.python.lib.PyIterNextNode;
        +import com.oracle.graal.python.lib.PyObjectGetIter;
        +import com.oracle.graal.python.nodes.ErrorMessages;
        +import com.oracle.graal.python.nodes.PGuards;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
        +import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile;
         import com.oracle.graal.python.nodes.object.GetClassNode;
         import com.oracle.graal.python.runtime.exception.PException;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
         import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.nodes.LoopNode;
         import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.profiles.InlinedBranchProfile;
         import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile;
         
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PZipLongest})
         public final class ZipLongestBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = ZipLongestBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return ZipLongestBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "zip_longest", minNumOfPositionalArgs = 1, takesVarArgs = true, keywordOnlyNames = {"fillvalue"})
        +    @GenerateNodeFactory
        +    public abstract static class ZipLongestNode extends PythonBuiltinNode {
        +        @Specialization
        +        static Object construct(VirtualFrame frame, Object cls, Object[] args, Object fillValueIn,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached PyObjectGetIter getIterNode,
        +                        @Cached InlinedConditionProfile fillIsNone,
        +                        @Cached InlinedLoopConditionProfile loopProfile,
        +                        @Cached TypeNodes.IsTypeNode isTypeNode,
        +                        @Cached InlinedBranchProfile errorProfile,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (!isTypeNode.execute(inliningTarget, cls)) {
        +                // Note: @Fallback or other @Specialization generate data-class
        +                errorProfile.enter(inliningTarget);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls);
        +            }
        +
        +            Object fillValue = fillValueIn;
        +            if (fillIsNone.profile(inliningTarget, PGuards.isPNone(fillValue))) {
        +                fillValue = null;
        +            }
        +
        +            PZipLongest self = PFactory.createZipLongest(language, cls, getInstanceShape.execute(cls));
        +            self.setFillValue(fillValue);
        +            self.setNumActive(args.length);
        +
        +            Object[] itTuple = new Object[args.length];
        +            loopProfile.profileCounted(inliningTarget, itTuple.length);
        +            LoopNode.reportLoopCount(inliningTarget, itTuple.length);
        +            for (int i = 0; loopProfile.inject(inliningTarget, i < itTuple.length); i++) {
        +                itTuple[i] = getIterNode.execute(frame, inliningTarget, args[i]);
        +            }
        +            self.setItTuple(itTuple);
        +            return self;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -90,33 +144,23 @@ static Object iter(PZipLongest self) {
                 }
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        -        @SuppressWarnings("unused")
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization(guards = "zeroSize(self)")
        -        static Object nextNoFillValue(VirtualFrame frame, PZipLongest self,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raiseStopIteration();
        +        static Object nextNoFillValue(@SuppressWarnings("unused") PZipLongest self) {
        +            throw iteratorExhausted();
                 }
         
                 @Specialization(guards = "!zeroSize(self)")
                 static Object next(VirtualFrame frame, PZipLongest self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached BuiltinFunctions.NextNode nextNode,
        -                        @Cached IsBuiltinObjectProfile isStopIterationProfile,
        +                        @Cached PyIterNextNode nextNode,
                                 @Cached InlinedConditionProfile noItProfile,
                                 @Cached InlinedConditionProfile noActiveProfile,
                                 @Cached InlinedLoopConditionProfile loopProfile,
        -                        @Cached InlinedConditionProfile isNullFillProfile,
        -                        @Cached PythonObjectFactory factory,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached InlinedConditionProfile isNullFillProfile) {
                     Object fillValue = isNullFillProfile.profile(inliningTarget, isNullFillValue(self)) ? PNone.NONE : self.getFillValue();
        -            return next(frame, inliningTarget, self, fillValue, nextNode, isStopIterationProfile, loopProfile, noItProfile, noActiveProfile, factory, raiseNode);
        -        }
        -
        -        private static Object next(VirtualFrame frame, Node inliningTarget, PZipLongest self, Object fillValue, BuiltinFunctions.NextNode nextNode, IsBuiltinObjectProfile isStopIterationProfile,
        -                        InlinedLoopConditionProfile loopProfile, InlinedConditionProfile noItProfile, InlinedConditionProfile noActiveProfile, PythonObjectFactory factory, PRaiseNode.Lazy raiseNode) {
                     Object[] result = new Object[self.getItTuple().length];
                     loopProfile.profileCounted(inliningTarget, result.length);
                     for (int i = 0; loopProfile.inject(inliningTarget, i < result.length); i++) {
        @@ -126,25 +170,23 @@ private static Object next(VirtualFrame frame, Node inliningTarget, PZipLongest
                             item = fillValue;
                         } else {
                             try {
        -                        item = nextNode.execute(frame, it, PNone.NO_VALUE);
        -                    } catch (PException e) {
        -                        if (isStopIterationProfile.profileException(inliningTarget, e, StopIteration)) {
        -                            self.setNumActive(self.getNumActive() - 1);
        -                            if (noActiveProfile.profile(inliningTarget, self.getNumActive() == 0)) {
        -                                throw raiseNode.get(inliningTarget).raiseStopIteration();
        -                            } else {
        -                                item = fillValue;
        -                                self.getItTuple()[i] = PNone.NONE;
        -                            }
        +                        item = nextNode.execute(frame, inliningTarget, it);
        +                    } catch (IteratorExhausted e) {
        +                        self.setNumActive(self.getNumActive() - 1);
        +                        if (noActiveProfile.profile(inliningTarget, self.getNumActive() == 0)) {
        +                            throw iteratorExhausted();
                                 } else {
        -                            self.setNumActive(0);
        -                            throw e;
        +                            item = fillValue;
        +                            self.getItTuple()[i] = PNone.NONE;
                                 }
        +                    } catch (PException e) {
        +                        self.setNumActive(0);
        +                        throw e;
                             }
                         }
                         result[i] = item;
                     }
        -            return factory.createTuple(result);
        +            return PFactory.createTuple(PythonLanguage.get(inliningTarget), result);
                 }
         
                 protected static boolean isNullFillValue(PZipLongest self) {
        @@ -166,7 +208,7 @@ static Object reduce(PZipLongest self,
                                 @Cached InlinedConditionProfile noFillValueProfile,
                                 @Cached InlinedLoopConditionProfile loopProfile,
                                 @Cached InlinedConditionProfile noItProfile,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object fillValue = self.getFillValue();
                     if (noFillValueProfile.profile(inliningTarget, fillValue == null)) {
                         fillValue = PNone.NONE;
        @@ -177,13 +219,13 @@ static Object reduce(PZipLongest self,
                     for (int i = 0; loopProfile.profile(inliningTarget, i < its.length); i++) {
                         Object it = self.getItTuple()[i];
                         if (noItProfile.profile(inliningTarget, it == PNone.NONE)) {
        -                    its[i] = factory.createEmptyTuple();
        +                    its[i] = PFactory.createEmptyTuple(language);
                         } else {
                             its[i] = it;
                         }
                     }
        -            PTuple tuple = factory.createTuple(its);
        -            return factory.createTuple(new Object[]{type, tuple, fillValue});
        +            PTuple tuple = PFactory.createTuple(language, its);
        +            return PFactory.createTuple(language, new Object[]{type, tuple, fillValue});
                 }
             }
         
        @@ -196,5 +238,4 @@ static Object setState(PZipLongest self, Object state) {
                     return PNone.NONE;
                 }
             }
        -
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/ListBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/ListBuiltins.java
        index c4bd696b11..68abe0c743 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/ListBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/ListBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2017, 2024, Oracle and/or its affiliates.
        + * Copyright (c) 2017, 2025, Oracle and/or its affiliates.
          * Copyright (c) 2013, Regents of the University of California
          *
          * All rights reserved.
        @@ -27,24 +27,10 @@
         
         import static com.oracle.graal.python.nodes.BuiltinNames.J_APPEND;
         import static com.oracle.graal.python.nodes.BuiltinNames.J_EXTEND;
        +import static com.oracle.graal.python.nodes.BuiltinNames.J_LIST;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J_SORT;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CLASS_GETITEM__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CONTAINS__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DELITEM__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GE__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IADD__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IMUL__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LE__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NE__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REVERSED__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETITEM__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___HASH__;
         import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA_SPACE;
         import static com.oracle.graal.python.nodes.StringLiterals.T_ELLIPSIS_IN_BRACKETS;
         import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_BRACKETS;
        @@ -55,29 +41,29 @@
         import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError;
         import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
         
        -import java.math.BigInteger;
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.annotations.ArgumentClinic;
        +import com.oracle.graal.python.annotations.HashNotImplemented;
         import com.oracle.graal.python.annotations.Slot;
         import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.Python3Core;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.builtins.modules.MathGuards;
         import com.oracle.graal.python.builtins.objects.PNone;
         import com.oracle.graal.python.builtins.objects.PNotImplemented;
         import com.oracle.graal.python.builtins.objects.common.IndexNodes.NormalizeIndexNode;
        -import com.oracle.graal.python.builtins.objects.common.SequenceNodes;
         import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
         import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.CreateStorageFromIteratorNode;
         import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ListGeneralizationNode;
         import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.SequenceStorageMpSubscriptNode;
         import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.SequenceStorageSqItemNode;
         import com.oracle.graal.python.builtins.objects.common.SortNodes.SortSequenceStorageNode;
        -import com.oracle.graal.python.builtins.objects.ints.PInt;
        +import com.oracle.graal.python.builtins.objects.function.PKeyword;
         import com.oracle.graal.python.builtins.objects.iterator.IteratorNodes;
         import com.oracle.graal.python.builtins.objects.iterator.PDoubleSequenceIterator;
         import com.oracle.graal.python.builtins.objects.iterator.PIntegerSequenceIterator;
        @@ -85,69 +71,82 @@
         import com.oracle.graal.python.builtins.objects.iterator.PSequenceIterator;
         import com.oracle.graal.python.builtins.objects.range.PIntRange;
         import com.oracle.graal.python.builtins.objects.str.PString;
        -import com.oracle.graal.python.builtins.objects.tuple.PTuple;
         import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.MpSubscriptBuiltinNode;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.SqConcatBuiltinNode;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotMpAssSubscript.MpAssSubscriptBuiltinNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqItemBuiltinNode;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqRepeatBuiltinNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqAssItem.SqAssItemBuiltinNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqContains.SqContainsBuiltinNode;
         import com.oracle.graal.python.lib.PyIndexCheckNode;
        +import com.oracle.graal.python.lib.PyListCheckNode;
         import com.oracle.graal.python.lib.PyObjectGetIter;
         import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode;
         import com.oracle.graal.python.lib.PyObjectRichCompareBool;
        +import com.oracle.graal.python.lib.RichCmpOp;
         import com.oracle.graal.python.nodes.ErrorMessages;
        -import com.oracle.graal.python.nodes.PGuards;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.builtins.ListNodes;
         import com.oracle.graal.python.nodes.builtins.ListNodes.AppendNode;
        -import com.oracle.graal.python.nodes.builtins.ListNodes.IndexNode;
        +import com.oracle.graal.python.nodes.builtins.ListNodes.ClearListStorageNode;
        +import com.oracle.graal.python.nodes.builtins.ListNodes.GetClassForNewListNode;
        +import com.oracle.graal.python.nodes.builtins.ListNodes.GetListStorageNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode;
        -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryClinicBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
        -import com.oracle.graal.python.nodes.object.GetClassNode;
        -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
         import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
         import com.oracle.graal.python.runtime.PythonContext;
         import com.oracle.graal.python.runtime.exception.PythonErrorType;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        -import com.oracle.graal.python.runtime.sequence.PSequence;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.graal.python.runtime.sequence.storage.DoubleSequenceStorage;
         import com.oracle.graal.python.runtime.sequence.storage.EmptySequenceStorage;
         import com.oracle.graal.python.runtime.sequence.storage.IntSequenceStorage;
         import com.oracle.graal.python.runtime.sequence.storage.LongSequenceStorage;
         import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
        -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
         import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
        +import com.oracle.truffle.api.dsl.Cached.Exclusive;
         import com.oracle.truffle.api.dsl.Cached.Shared;
         import com.oracle.truffle.api.dsl.Fallback;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
         import com.oracle.truffle.api.dsl.GenerateUncached;
        -import com.oracle.truffle.api.dsl.ImportStatic;
         import com.oracle.truffle.api.dsl.NeverDefault;
         import com.oracle.truffle.api.dsl.Specialization;
        -import com.oracle.truffle.api.dsl.TypeSystemReference;
         import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.nodes.LoopNode;
         import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.profiles.InlinedBranchProfile;
         import com.oracle.truffle.api.profiles.InlinedConditionProfile;
        +import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile;
         import com.oracle.truffle.api.strings.TruffleString;
         import com.oracle.truffle.api.strings.TruffleStringBuilder;
         import com.oracle.truffle.api.strings.TruffleStringIterator;
         
        +/**
        + * NOTE: self can either be a PList or a foreign list (hasArrayElements()).
        + * {@link GetListStorageNode} should be used instead of
        + * {@link com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetSequenceStorageNode} to
        + * get a proper error and not allow other sequences, just PList or foreign list.
        + */
         @CoreFunctions(extendClasses = PythonBuiltinClassType.PList)
        +@HashNotImplemented
         public final class ListBuiltins extends PythonBuiltins {
             public static final TpSlots SLOTS = ListBuiltinsSlotsGen.SLOTS;
         
             @Override
             public void initialize(Python3Core core) {
                 super.initialize(core);
        -        this.addBuiltinConstant(T___HASH__, PNone.NONE);
             }
         
             @Override
        @@ -155,18 +154,41 @@ protected List Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) index;
        -            where = normalizeIndex(where, list.getSequenceStorage().length());
        -            return insertNode.execute(frame, list, where, value);
        -        }
        -
        -        @Specialization
        -        static PNone insertPIntIndex(VirtualFrame frame, PList list, PInt index, Object value,
        -                        @Shared @Cached ListInsertNode insertNode) {
        -            int where = normalizePIntForIndex(index);
        -            where = normalizeIndex(where, list.getSequenceStorage().length());
        -            return insertNode.execute(frame, list, where, value);
        -        }
        -
        -        @Specialization(guards = {"!isIntegerOrPInt(i)"})
        -        static PNone insert(VirtualFrame frame, PList list, Object i, Object value,
        -                        @Cached("createInteger(ERROR_MSG)") IndexNode indexNode,
        -                        @Shared @Cached ListInsertNode insertNode) {
        -            Object indexValue = indexNode.execute(frame, i);
        -            return insertNode.execute(frame, list, indexValue, value);
        -        }
        -
        -        @TruffleBoundary
        -        private static int normalizePIntForIndex(PInt index) {
        -            int where = 0;
        -            BigInteger bigIndex = index.getValue();
        -            if (bigIndex.compareTo(BigInteger.valueOf(Integer.MIN_VALUE)) < 0) {
        -                where = 0;
        -            } else if (bigIndex.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) > 0) {
        -                where = Integer.MAX_VALUE;
        -            } else {
        -                where = bigIndex.intValue();
        -            }
        -            return where;
        -        }
        -
        -        private static int normalizeIndex(int index, int len) {
        -            int idx = index;
        -            if (idx < 0) {
        -                idx += len;
        -                if (idx < 0) {
        -                    idx = 0;
        +            SequenceStorage store = getStorageNode.execute(inliningTarget, list);
        +            int len = store.length();
        +            if (index < 0) {
        +                negativeProfile.enter(inliningTarget);
        +                index += len;
        +                if (index < 0) {
        +                    index = 0;
                         }
                     }
        -            if (idx > len) {
        -                idx = len;
        +            if (index > len) {
        +                tooFarProfile.enter(inliningTarget);
        +                index = len;
                     }
        -            return idx;
        -        }
        -
        -        protected static boolean isNotSpecialCase(PList list, Object value) {
        -            return !((PGuards.isIntStorage(list) && value instanceof Integer) || (PGuards.isLongStorage(list) && PGuards.isInteger(value)) ||
        -                            (PGuards.isDoubleStorage(list) && value instanceof Double));
        +            SequenceStorage newStorage = insertItem.execute(inliningTarget, store, index, value);
        +            updateStorageNode.execute(inliningTarget, list, store, newStorage);
        +            return PNone.NONE;
                 }
         
        -        protected static boolean isIntegerOrPInt(Object index) {
        -            return index instanceof Integer || index instanceof PInt;
        +        @Override
        +        protected ArgumentClinicProvider getArgumentClinic() {
        +            return ListBuiltinsClinicProviders.ListInsertNodeClinicProviderGen.INSTANCE;
                 }
        -
             }
         
             // list.remove(x)
        @@ -545,22 +536,27 @@ protected static boolean isIntegerOrPInt(Object index) {
             public abstract static class ListRemoveNode extends PythonBinaryBuiltinNode {
         
                 @Specialization
        -        static PNone remove(VirtualFrame frame, PList list, Object value,
        +        static PNone remove(VirtualFrame frame, Object list, Object value,
                                 @Bind("this") Node inliningTarget,
        +                        @Cached GetListStorageNode getStorageNode,
                                 @Cached("createNotNormalized()") SequenceStorageNodes.GetItemNode getItemNode,
        +                        @Cached InlinedLoopConditionProfile loopProfile,
                                 @Cached SequenceStorageNodes.DeleteNode deleteNode,
        -                        @Cached PyObjectRichCompareBool.EqNode eqNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        -            SequenceStorage listStore = list.getSequenceStorage();
        +                        @Cached PyObjectRichCompareBool eqNode,
        +                        @Cached PRaiseNode raiseNode) {
        +            SequenceStorage listStore = getStorageNode.execute(inliningTarget, list);
                     int len = listStore.length();
        +            loopProfile.profileCounted(inliningTarget, len);
                     for (int i = 0; i < len; i++) {
                         Object object = getItemNode.execute(listStore, i);
        -                if (eqNode.compare(frame, inliningTarget, object, value)) {
        +                if (eqNode.execute(frame, inliningTarget, object, value, RichCmpOp.Py_EQ)) {
                             deleteNode.execute(frame, listStore, i);
        +                    LoopNode.reportLoopCount(inliningTarget, i);
                             return PNone.NONE;
                         }
                     }
        -            throw raiseNode.get(inliningTarget).raise(PythonErrorType.ValueError, ErrorMessages.NOT_IN_LIST_MESSAGE);
        +            LoopNode.reportLoopCount(inliningTarget, len);
        +            throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ErrorMessages.NOT_IN_LIST_MESSAGE);
                 }
             }
         
        @@ -570,20 +566,24 @@ static PNone remove(VirtualFrame frame, PList list, Object value,
             public abstract static class ListPopNode extends PythonBinaryBuiltinNode {
         
                 @Specialization
        -        static Object popLast(VirtualFrame frame, PList list, @SuppressWarnings("unused") PNone none,
        +        static Object popLast(VirtualFrame frame, Object list, @SuppressWarnings("unused") PNone none,
        +                        @Bind("this") Node inliningTarget,
        +                        @Shared @Cached GetListStorageNode getStorageNode,
                                 @Shared @Cached("createDelete()") SequenceStorageNodes.DeleteNode deleteNode,
                                 @Shared @Cached SequenceStorageNodes.GetItemNode getItemNode) {
        -            SequenceStorage store = list.getSequenceStorage();
        +            SequenceStorage store = getStorageNode.execute(inliningTarget, list);
                     Object ret = getItemNode.execute(store, -1);
                     deleteNode.execute(frame, store, -1);
                     return ret;
                 }
         
                 @Specialization(guards = {"!isNoValue(idx)", "!isPSlice(idx)"})
        -        static Object doIndex(VirtualFrame frame, PList list, Object idx,
        +        static Object doIndex(VirtualFrame frame, Object list, Object idx,
        +                        @Bind("this") Node inliningTarget,
        +                        @Shared @Cached GetListStorageNode getStorageNode,
                                 @Shared @Cached("createDelete()") SequenceStorageNodes.DeleteNode deleteNode,
                                 @Shared @Cached SequenceStorageNodes.GetItemNode getItemNode) {
        -            SequenceStorage store = list.getSequenceStorage();
        +            SequenceStorage store = getStorageNode.execute(inliningTarget, list);
                     Object ret = getItemNode.execute(frame, store, idx);
                     deleteNode.execute(frame, store, idx);
                     return ret;
        @@ -591,8 +591,8 @@ static Object doIndex(VirtualFrame frame, PList list, Object idx,
         
                 @Fallback
                 static Object doError(@SuppressWarnings("unused") Object list, Object arg,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, arg);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, arg);
                 }
         
                 @NeverDefault
        @@ -607,154 +607,44 @@ private static NormalizeIndexNode createNormalize() {
             }
         
             // list.index(x)
        -    @Builtin(name = "index", minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 4)
        -    @TypeSystemReference(PythonArithmeticTypes.class)
        -    @ImportStatic(MathGuards.class)
        +    @Builtin(name = "index", minNumOfPositionalArgs = 2, numOfPositionalOnlyArgs = 4, parameterNames = {"$self", "value", "start", "stop"})
        +    @ArgumentClinic(name = "start", conversion = ArgumentClinic.ClinicConversion.SliceIndex, defaultValue = "0")
        +    @ArgumentClinic(name = "stop", conversion = ArgumentClinic.ClinicConversion.SliceIndex, defaultValue = "Integer.MAX_VALUE")
             @GenerateNodeFactory
        -    public abstract static class ListIndexNode extends PythonBuiltinNode {
        -        protected static final TruffleString ERROR_TYPE_MESSAGE = ErrorMessages.SLICE_INDICES_TYPE_ERROR;
        -
        -        public abstract int execute(VirtualFrame frame, Object arg1, Object arg2, Object arg3, Object arg4);
        +    public abstract static class ListIndexNode extends PythonQuaternaryClinicBuiltinNode {
         
        -        private static int correctIndex(SequenceStorage s, long index) {
        -            long resultIndex = index;
        -            if (resultIndex < 0) {
        -                resultIndex += s.length();
        -                if (resultIndex < 0) {
        -                    return 0;
        -                }
        +        @Specialization
        +        static Object index(VirtualFrame frame, Object self, Object value, int start, int stop,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached GetListStorageNode getListStorageNode,
        +                        @Cached InlinedBranchProfile startAdjust,
        +                        @Cached InlinedBranchProfile stopAdjust,
        +                        @Cached SequenceStorageNodes.ItemIndexNode indexNode,
        +                        @Cached PRaiseNode raiseNode) {
        +            SequenceStorage s = getListStorageNode.execute(inliningTarget, self);
        +            start = adjustIndex(inliningTarget, s, start, startAdjust);
        +            stop = adjustIndex(inliningTarget, s, stop, stopAdjust);
        +            int idx = indexNode.execute(frame, inliningTarget, s, value, start, stop);
        +            if (idx != -1) {
        +                return idx;
                     }
        -            return (int) Math.min(resultIndex, Integer.MAX_VALUE);
        +            throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ErrorMessages.X_NOT_IN_LIST);
                 }
         
        -        @TruffleBoundary(transferToInterpreterOnException = false)
        -        private static int correctIndex(SequenceStorage s, PInt index) {
        -            BigInteger value = index.getValue();
        -            if (value.compareTo(BigInteger.ZERO) < 0) {
        -                BigInteger resultAdd = value.add(BigInteger.valueOf(s.length()));
        -                if (resultAdd.compareTo(BigInteger.ZERO) < 0) {
        +        private static int adjustIndex(Node inliningTarget, SequenceStorage s, int index, InlinedBranchProfile profile) {
        +            if (index < 0) {
        +                profile.enter(inliningTarget);
        +                index += s.length();
        +                if (index < 0) {
                             return 0;
                         }
        -                return resultAdd.intValue();
                     }
        -            return value.min(BigInteger.valueOf(Integer.MAX_VALUE)).intValue();
        +            return index;
                 }
         
        -        private static int findIndex(VirtualFrame frame, Node inliningTarget, SequenceStorageNodes.ItemIndexNode itemIndexNode, SequenceStorage s, Object value, int start, int end,
        -                        PRaiseNode.Lazy raiseNode) {
        -            int idx = itemIndexNode.execute(frame, inliningTarget, s, value, start, end);
        -            if (idx != -1) {
        -                return idx;
        -            }
        -            throw raiseNode.get(inliningTarget).raise(PythonErrorType.ValueError, ErrorMessages.X_NOT_IN_LIST);
        -        }
        -
        -        @Specialization
        -        static int index(VirtualFrame frame, PList self, Object value, @SuppressWarnings("unused") PNone start, @SuppressWarnings("unused") PNone end,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached SequenceStorageNodes.ItemIndexNode itemIndexNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            SequenceStorage s = self.getSequenceStorage();
        -            return findIndex(frame, inliningTarget, itemIndexNode, s, value, 0, s.length(), raiseNode);
        -        }
        -
        -        @Specialization
        -        static int index(VirtualFrame frame, PList self, Object value, long start, @SuppressWarnings("unused") PNone end,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached SequenceStorageNodes.ItemIndexNode itemIndexNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            SequenceStorage s = self.getSequenceStorage();
        -            return findIndex(frame, inliningTarget, itemIndexNode, s, value, correctIndex(s, start), s.length(), raiseNode);
        -        }
        -
        -        @Specialization
        -        static int index(VirtualFrame frame, PList self, Object value, long start, long end,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached SequenceStorageNodes.ItemIndexNode itemIndexNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            SequenceStorage s = self.getSequenceStorage();
        -            return findIndex(frame, inliningTarget, itemIndexNode, s, value, correctIndex(s, start), correctIndex(s, end), raiseNode);
        -        }
        -
        -        @Specialization
        -        static int indexPI(VirtualFrame frame, PList self, Object value, PInt start, @SuppressWarnings("unused") PNone end,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached SequenceStorageNodes.ItemIndexNode itemIndexNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            SequenceStorage s = self.getSequenceStorage();
        -            return findIndex(frame, inliningTarget, itemIndexNode, s, value, correctIndex(s, start), s.length(), raiseNode);
        -        }
        -
        -        @Specialization
        -        static int indexPIPI(VirtualFrame frame, PList self, Object value, PInt start, PInt end,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached SequenceStorageNodes.ItemIndexNode itemIndexNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            SequenceStorage s = self.getSequenceStorage();
        -            return findIndex(frame, inliningTarget, itemIndexNode, s, value, correctIndex(s, start), correctIndex(s, end), raiseNode);
        -        }
        -
        -        @Specialization
        -        static int indexLPI(VirtualFrame frame, PList self, Object value, long start, PInt end,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached SequenceStorageNodes.ItemIndexNode itemIndexNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            SequenceStorage s = self.getSequenceStorage();
        -            return findIndex(frame, inliningTarget, itemIndexNode, s, value, correctIndex(s, start), correctIndex(s, end), raiseNode);
        -        }
        -
        -        @Specialization
        -        static int indexPIL(VirtualFrame frame, PList self, Object value, PInt start, Long end,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached SequenceStorageNodes.ItemIndexNode itemIndexNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            SequenceStorage s = self.getSequenceStorage();
        -            return findIndex(frame, inliningTarget, itemIndexNode, s, value, correctIndex(s, start), correctIndex(s, end), raiseNode);
        -        }
        -
        -        @Specialization
        -        @SuppressWarnings("unused")
        -        static int indexDO(PTuple self, Object value, double start, Object end,
        -                        @Shared("raise") @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(TypeError, ERROR_TYPE_MESSAGE);
        -        }
        -
        -        @Specialization
        -        @SuppressWarnings("unused")
        -        static int indexOD(PTuple self, Object value, Object start, double end,
        -                        @Shared("raise") @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(TypeError, ERROR_TYPE_MESSAGE);
        -        }
        -
        -        @Specialization(guards = "!isNumber(start)")
        -        static int indexO(VirtualFrame frame, PTuple self, Object value, Object start, PNone end,
        -                        @Shared @Cached("createNumber(ERROR_TYPE_MESSAGE)") IndexNode startNode,
        -                        @Shared @Cached("createIndexNode()") ListIndexNode indexNode) {
        -            Object startValue = startNode.execute(frame, start);
        -            return indexNode.execute(frame, self, value, startValue, end);
        -        }
        -
        -        @Specialization(guards = {"!isNumber(end)"})
        -        static int indexLO(VirtualFrame frame, PTuple self, Object value, long start, Object end,
        -                        @Shared @Cached("createNumber(ERROR_TYPE_MESSAGE)") IndexNode endNode,
        -                        @Shared @Cached("createIndexNode()") ListIndexNode indexNode) {
        -            Object endValue = endNode.execute(frame, end);
        -            return indexNode.execute(frame, self, value, start, endValue);
        -        }
        -
        -        @Specialization(guards = {"!isNumber(start) || !isNumber(end)"})
        -        static int indexOO(VirtualFrame frame, PTuple self, Object value, Object start, Object end,
        -                        @Shared @Cached("createNumber(ERROR_TYPE_MESSAGE)") IndexNode startNode,
        -                        @Shared @Cached("createNumber(ERROR_TYPE_MESSAGE)") IndexNode endNode,
        -                        @Shared @Cached("createIndexNode()") ListIndexNode indexNode) {
        -            Object startValue = startNode.execute(frame, start);
        -            Object endValue = endNode.execute(frame, end);
        -            return indexNode.execute(frame, self, value, startValue, endValue);
        -        }
        -
        -        @NeverDefault
        -        protected ListIndexNode createIndexNode() {
        -            return ListBuiltinsFactory.ListIndexNodeFactory.create(null);
        +        @Override
        +        protected ArgumentClinicProvider getArgumentClinic() {
        +            return ListBuiltinsClinicProviders.ListIndexNodeClinicProviderGen.INSTANCE;
                 }
             }
         
        @@ -764,18 +654,23 @@ protected ListIndexNode createIndexNode() {
             public abstract static class ListCountNode extends PythonBuiltinNode {
         
                 @Specialization
        -        long count(VirtualFrame frame, PList self, Object value,
        +        long count(VirtualFrame frame, Object list, Object value,
                                 @Bind("this") Node inliningTarget,
        +                        @Cached InlinedLoopConditionProfile loopProfile,
        +                        @Cached GetListStorageNode getStorageNode,
                                 @Cached("createNotNormalized()") SequenceStorageNodes.GetItemNode getItemNode,
        -                        @Cached PyObjectRichCompareBool.EqNode eqNode) {
        +                        @Cached PyObjectRichCompareBool eqNode) {
                     long count = 0;
        -            SequenceStorage s = self.getSequenceStorage();
        -            for (int i = 0; i < s.length(); i++) {
        +            SequenceStorage s = getStorageNode.execute(inliningTarget, list);
        +            loopProfile.profileCounted(inliningTarget, s.length());
        +            for (int i = 0; loopProfile.inject(inliningTarget, i < s.length()); i++) {
                         Object seqItem = getItemNode.execute(s, i);
        -                if (eqNode.compare(frame, inliningTarget, seqItem, value)) {
        +                if (eqNode.execute(frame, inliningTarget, seqItem, value, RichCmpOp.Py_EQ)) {
        +                    LoopNode.reportLoopCount(inliningTarget, i);
                             count++;
                         }
                     }
        +            LoopNode.reportLoopCount(inliningTarget, s.length());
                     return count;
                 }
         
        @@ -787,10 +682,13 @@ long count(VirtualFrame frame, PList self, Object value,
             public abstract static class ListClearNode extends PythonUnaryBuiltinNode {
         
                 @Specialization
        -        static PNone clear(PList list) {
        -            list.setSequenceStorage(EmptySequenceStorage.INSTANCE);
        +        static PNone clear(Object list,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached ClearListStorageNode clearSequenceNode) {
        +            clearSequenceNode.execute(inliningTarget, list);
                     return PNone.NONE;
                 }
        +
             }
         
             // list.reverse()
        @@ -799,10 +697,12 @@ static PNone clear(PList list) {
             public abstract static class ListReverseNode extends PythonUnaryBuiltinNode {
         
                 @Specialization
        -        static PNone reverse(PList list,
        +        static PNone reverse(Object list,
                                 @Bind("this") Node inliningTarget,
        +                        @Cached GetListStorageNode getStorageNode,
                                 @Cached SequenceStorageNodes.ReverseNode reverseNode) {
        -            reverseNode.execute(inliningTarget, list.getSequenceStorage());
        +            var sequenceStorage = getStorageNode.execute(inliningTarget, list);
        +            reverseNode.execute(inliningTarget, sequenceStorage);
                     return PNone.NONE;
                 }
         
        @@ -813,24 +713,24 @@ static PNone reverse(PList list,
             @ArgumentClinic(name = "reverse", conversion = ArgumentClinic.ClinicConversion.IntToBoolean, defaultValue = "false")
             @GenerateNodeFactory
             public abstract static class ListSortNode extends PythonClinicBuiltinNode {
        -        public final Object execute(VirtualFrame frame, PList list) {
        +        public final Object execute(VirtualFrame frame, Object list) {
                     return execute(frame, list, PNone.NO_VALUE, false);
                 }
         
        -        public abstract Object execute(VirtualFrame frame, PList list, Object keyfunc, boolean reverse);
        +        public abstract Object execute(VirtualFrame frame, Object list, Object keyfunc, boolean reverse);
         
                 @Specialization
        -        static Object doGeneric(VirtualFrame frame, PList list, Object keyfunc, boolean reverse,
        +        static Object doPList(VirtualFrame frame, PList list, Object keyfunc, boolean reverse,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached SortSequenceStorageNode sortSequenceStorageNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached SortSequenceStorageNode sortSequenceStorageNode,
        +                        @Cached PRaiseNode raiseNode) {
                     SequenceStorage storage = list.getSequenceStorage();
                     // Make the list temporarily empty to prevent concurrent modification
                     list.setSequenceStorage(EmptySequenceStorage.INSTANCE);
                     try {
                         sortSequenceStorageNode.execute(frame, storage, keyfunc, reverse);
                         if (list.getSequenceStorage() != EmptySequenceStorage.INSTANCE) {
        -                    throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.LIST_MODIFIED_DURING_SOFT);
        +                    throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.LIST_MODIFIED_DURING_SORT);
                         }
                     } finally {
                         list.setSequenceStorage(storage);
        @@ -838,6 +738,16 @@ static Object doGeneric(VirtualFrame frame, PList list, Object keyfunc, boolean
                     return PNone.NONE;
                 }
         
        +        @Specialization(guards = "!isList(list)")
        +        static Object doForeign(VirtualFrame frame, Object list, Object keyfunc, boolean reverse,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached GetListStorageNode getStorageNode,
        +                        @Shared @Cached SortSequenceStorageNode sortSequenceStorageNode) {
        +            SequenceStorage storage = getStorageNode.execute(inliningTarget, list);
        +            sortSequenceStorageNode.execute(frame, storage, keyfunc, reverse);
        +            return PNone.NONE;
        +        }
        +
                 @NeverDefault
                 public static ListSortNode create() {
                     return ListBuiltinsFactory.ListSortNodeFactory.create(null);
        @@ -856,8 +766,10 @@ protected ArgumentClinicProvider getArgumentClinic() {
             public abstract static class LenNode extends LenBuiltinNode {
         
                 @Specialization
        -        int doGeneric(PList list) {
        -            return list.getSequenceStorage().length();
        +        int doGeneric(Object list,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached GetListStorageNode getStorageNode) {
        +            return getStorageNode.execute(inliningTarget, list).length();
                 }
             }
         
        @@ -865,46 +777,44 @@ int doGeneric(PList list) {
             @GenerateNodeFactory
             abstract static class ConcatNode extends SqConcatBuiltinNode {
                 @Specialization
        -        static PList doPList(PList left, PList other,
        +        static PList doPList(Object left, Object right,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached GetClassNode getClassNode,
        -                        @Cached("createConcat()") SequenceStorageNodes.ConcatNode concatNode,
        -                        @Cached PythonObjectFactory factory) {
        -            SequenceStorage newStore = concatNode.execute(left.getSequenceStorage(), other.getSequenceStorage());
        -            return factory.createList(getClassNode.execute(inliningTarget, left), newStore);
        -        }
        -
        -        @Specialization(guards = "!isList(right)")
        -        static Object doGeneric(@SuppressWarnings("unused") Object left, Object right,
        +                        @Cached PyListCheckNode isListNode,
        +                        @Cached GetListStorageNode getStorageNode,
        +                        @Cached GetClassForNewListNode getClassForNewListNode,
        +                        @Cached SequenceStorageNodes.ConcatListOrTupleNode concatNode,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape,
                                 @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(TypeError, ErrorMessages.CAN_ONLY_CONCAT_S_NOT_P_TO_S, "list", right, "list");
        -        }
        +            if (!isListNode.execute(inliningTarget, right)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CAN_ONLY_CONCAT_S_NOT_P_TO_S, "list", right, "list");
        +            }
         
        -        @NeverDefault
        -        protected static SequenceStorageNodes.ConcatNode createConcat() {
        -            return SequenceStorageNodes.ConcatNode.create(ListGeneralizationNode::create);
        +            var leftStorage = getStorageNode.execute(inliningTarget, left);
        +            var rightStorage = getStorageNode.execute(inliningTarget, right);
        +            SequenceStorage newStore = concatNode.execute(inliningTarget, leftStorage, rightStorage);
        +            Object newClass = getClassForNewListNode.execute(inliningTarget, left);
        +            return PFactory.createList(language, newClass, getInstanceShape.execute(newClass), newStore);
                 }
             }
         
        -    @Builtin(name = J___IADD__, minNumOfPositionalArgs = 2)
        +    @Slot(value = SlotKind.sq_inplace_concat, isComplex = true)
             @GenerateNodeFactory
             abstract static class IAddNode extends PythonBinaryBuiltinNode {
                 @Specialization
        -        PList extendSequence(VirtualFrame frame, PList list, Object iterable,
        +        Object extendSequence(VirtualFrame frame, Object list, Object iterable,
                                 @Bind("this") Node inliningTarget,
        +                        @Cached GetListStorageNode getStorageNode,
        +                        @Cached ListNodes.UpdateListStorageNode updateStorageNode,
                                 @Cached IteratorNodes.GetLength lenNode,
                                 @Cached("createExtend()") SequenceStorageNodes.ExtendNode extendNode) {
        +            var sequenceStorage = getStorageNode.execute(inliningTarget, list);
                     int len = lenNode.execute(frame, inliningTarget, iterable);
        -            updateSequenceStorage(list, extendNode.execute(frame, list.getSequenceStorage(), iterable, len));
        +            var newStorage = extendNode.execute(frame, sequenceStorage, iterable, len);
        +            updateStorageNode.execute(inliningTarget, list, sequenceStorage, newStorage);
                     return list;
                 }
         
        -        private static void updateSequenceStorage(PList list, SequenceStorage s) {
        -            if (list.getSequenceStorage() != s) {
        -                list.setSequenceStorage(s);
        -            }
        -        }
        -
                 @NeverDefault
                 protected static SequenceStorageNodes.ExtendNode createExtend() {
                     return SequenceStorageNodes.ExtendNode.create(ListGeneralizationNode.SUPPLIER);
        @@ -915,183 +825,77 @@ protected static SequenceStorageNodes.ExtendNode createExtend() {
             @GenerateNodeFactory
             abstract static class MulNode extends SqRepeatBuiltinNode {
                 @Specialization
        -        static PList doPListInt(VirtualFrame frame, PList left, int right,
        +        static Object doPListInt(VirtualFrame frame, Object left, int right,
                                 @Bind("this") Node inliningTarget,
        +                        @Cached PyListCheckNode isListNode,
        +                        @Cached GetListStorageNode getStorageNode,
                                 @Cached SequenceStorageNodes.RepeatNode repeatNode,
        -                        @Cached PythonObjectFactory factory,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Bind PythonLanguage language,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (!isListNode.execute(inliningTarget, left)) {
        +                return PNotImplemented.NOT_IMPLEMENTED;
        +            }
        +
        +            var sequenceStorage = getStorageNode.execute(inliningTarget, left);
                     try {
        -                SequenceStorage repeated = repeatNode.execute(frame, left.getSequenceStorage(), right);
        -                return factory.createList(repeated);
        +                SequenceStorage repeated = repeatNode.execute(frame, sequenceStorage, right);
        +                return PFactory.createList(language, repeated);
                     } catch (ArithmeticException | OutOfMemoryError e) {
        -                throw raiseNode.get(inliningTarget).raise(MemoryError);
        +                throw raiseNode.raise(inliningTarget, MemoryError);
                     }
                 }
             }
         
        -    @Builtin(name = J___IMUL__, minNumOfPositionalArgs = 2)
        +    @Slot(value = SlotKind.sq_inplace_repeat, isComplex = true)
             @GenerateNodeFactory
        -    abstract static class IMulNode extends PythonBinaryBuiltinNode {
        +    abstract static class IMulNode extends SqRepeatBuiltinNode {
                 @Specialization
        -        static Object doGeneric(VirtualFrame frame, PList list, Object right,
        +        static Object doGeneric(VirtualFrame frame, Object list, int right,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached InlinedConditionProfile updatedProfile,
        +                        @Cached GetListStorageNode getStorageNode,
        +                        @Cached ListNodes.UpdateListStorageNode updateStorageNode,
                                 @Cached SequenceStorageNodes.RepeatNode repeatNode) {
        -
        -            SequenceStorage store = list.getSequenceStorage();
        +            SequenceStorage store = getStorageNode.execute(inliningTarget, list);
                     SequenceStorage updated = repeatNode.execute(frame, store, right);
        -            if (updatedProfile.profile(inliningTarget, store != updated)) {
        -                list.setSequenceStorage(updated);
        -            }
        +            updateStorageNode.execute(inliningTarget, list, store, updated);
                     return list;
                 }
        -
        -        protected IMulNode createIMulNode() {
        -            return ListBuiltinsFactory.IMulNodeFactory.create();
        -        }
             }
         
        -    @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2)
        +    @Slot(value = SlotKind.tp_richcompare, isComplex = true)
             @GenerateNodeFactory
        -    abstract static class EqNode extends PythonBinaryBuiltinNode {
        -
        -        protected static boolean isObjectStorage(PList left, PList right) {
        -            return PGuards.isObjectStorage(left) || PGuards.isObjectStorage(right);
        -        }
        -
        -        @Specialization(guards = "!isObjectStorage(left, right)")
        -        boolean doPList(VirtualFrame frame, PList left, PList right,
        -                        @Shared @Cached("createEq()") SequenceStorageNodes.CmpNode neNode) {
        -            return neNode.execute(frame, left.getSequenceStorage(), right.getSequenceStorage());
        -        }
        -
        -        /**
        -         * This is a fix for the bpo-38588 bug. See
        -         * {@code test_list.py: ListTest.test_equal_operator_modifying_operand}
        -         */
        -        @Specialization(guards = "isObjectStorage(left, right)")
        -        boolean doPListObjectStorage(VirtualFrame frame, PList left, PList right,
        -                        @Shared @Cached("createEq()") SequenceStorageNodes.CmpNode neNode) {
        -            final SequenceStorage leftStorage = left.getSequenceStorage();
        -            final SequenceStorage rightStorage = right.getSequenceStorage();
        -            final boolean result = neNode.execute(frame, leftStorage, rightStorage);
        -            /*
        -             * This will check if the underlying storage has been modified and if so, we do the
        -             * check again.
        -             */
        -            if (leftStorage == left.getSequenceStorage() && rightStorage == right.getSequenceStorage()) {
        -                return result;
        -            }
        -            /*
        -             * To avoid possible infinite recursion case, we call the default specialization.
        -             */
        -            return doPList(frame, left, right, neNode);
        -        }
        -
        -        @Fallback
        -        @SuppressWarnings("unused")
        -        Object doOther(Object left, Object right) {
        -            return PNotImplemented.NOT_IMPLEMENTED;
        -        }
        -    }
        -
        -    @Builtin(name = J___NE__, minNumOfPositionalArgs = 2)
        -    @GenerateNodeFactory
        -    abstract static class NeNode extends PythonBinaryBuiltinNode {
        -
        -        @Specialization
        -        boolean doPList(VirtualFrame frame, PList left, PList right,
        -                        @Cached("createEq()") SequenceStorageNodes.CmpNode eqNode) {
        -            return !eqNode.execute(frame, left.getSequenceStorage(), right.getSequenceStorage());
        -        }
        -
        -        @Fallback
        -        @SuppressWarnings("unused")
        -        PNotImplemented doOther(Object left, Object right) {
        -            return PNotImplemented.NOT_IMPLEMENTED;
        -        }
        -    }
        -
        -    @Builtin(name = J___GE__, minNumOfPositionalArgs = 2)
        -    @GenerateNodeFactory
        -    abstract static class GeNode extends PythonBinaryBuiltinNode {
        -
        -        @Specialization
        -        boolean doPList(VirtualFrame frame, PList left, PList right,
        -                        @Cached("createGe()") SequenceStorageNodes.CmpNode neNode) {
        -            return neNode.execute(frame, left.getSequenceStorage(), right.getSequenceStorage());
        -        }
        -
        -        @Fallback
        -        @SuppressWarnings("unused")
        -        PNotImplemented doOther(Object left, Object right) {
        -            return PNotImplemented.NOT_IMPLEMENTED;
        -        }
        -
        -    }
        -
        -    @Builtin(name = J___LE__, minNumOfPositionalArgs = 2)
        -    @GenerateNodeFactory
        -    abstract static class LeNode extends PythonBinaryBuiltinNode {
        -
        +    abstract static class ListRichCmpNode extends TpSlotRichCompare.RichCmpBuiltinNode {
                 @Specialization
        -        boolean doPList(VirtualFrame frame, PList left, PList right,
        -                        @Cached("createLe()") SequenceStorageNodes.CmpNode neNode) {
        -            return neNode.execute(frame, left.getSequenceStorage(), right.getSequenceStorage());
        -        }
        -
        -        @Fallback
        -        @SuppressWarnings("unused")
        -        PNotImplemented doOther(Object left, Object right) {
        -            return PNotImplemented.NOT_IMPLEMENTED;
        -        }
        -
        -    }
        -
        -    @Builtin(name = J___GT__, minNumOfPositionalArgs = 2)
        -    @GenerateNodeFactory
        -    abstract static class GtNode extends PythonBinaryBuiltinNode {
        -
        -        @Specialization
        -        boolean doPList(VirtualFrame frame, PList left, PList right,
        -                        @Cached("createGt()") SequenceStorageNodes.CmpNode neNode) {
        -            return neNode.execute(frame, left.getSequenceStorage(), right.getSequenceStorage());
        -        }
        -
        -        @Fallback
        -        PNotImplemented doOther(@SuppressWarnings("unused") Object left, @SuppressWarnings("unused") Object right) {
        -            return PNotImplemented.NOT_IMPLEMENTED;
        -        }
        -    }
        -
        -    @Builtin(name = J___LT__, minNumOfPositionalArgs = 2)
        -    @GenerateNodeFactory
        -    abstract static class LtNode extends PythonBinaryBuiltinNode {
        -        @Specialization
        -        boolean doPList(VirtualFrame frame, PList left, PList right,
        -                        @Cached("createLt()") SequenceStorageNodes.CmpNode neNode) {
        -            return neNode.execute(frame, left.getSequenceStorage(), right.getSequenceStorage());
        -        }
        -
        -        @Fallback
        -        PNotImplemented contains(@SuppressWarnings("unused") Object self, @SuppressWarnings("unused") Object other) {
        -            return PNotImplemented.NOT_IMPLEMENTED;
        +        static Object doIt(VirtualFrame frame, Object left, Object right, RichCmpOp op,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached PyListCheckNode isLeftList,
        +                        @Cached PyListCheckNode isRightList,
        +                        @Cached InlinedConditionProfile listCheckProfile,
        +                        @Cached SequenceStorageNodes.CmpNode cmpNode,
        +                        @Cached GetListStorageNode getStorageNode) {
        +            if (listCheckProfile.profile(inliningTarget, isLeftList.execute(inliningTarget, left) && isRightList.execute(inliningTarget, right))) {
        +                var leftStorage = getStorageNode.execute(inliningTarget, left);
        +                var rightStorage = getStorageNode.execute(inliningTarget, right);
        +                return cmpNode.execute(frame, inliningTarget, leftStorage, rightStorage, true, left, right, op);
        +            } else {
        +                return PNotImplemented.NOT_IMPLEMENTED;
        +            }
                 }
             }
         
        -    @Builtin(name = J___CONTAINS__, minNumOfPositionalArgs = 2)
        +    @Slot(value = SlotKind.sq_contains, isComplex = true)
             @GenerateNodeFactory
        -    abstract static class ContainsNode extends PythonBinaryBuiltinNode {
        +    abstract static class ContainsNode extends SqContainsBuiltinNode {
                 @Specialization
        -        boolean contains(VirtualFrame frame, PSequence self, Object other,
        +        boolean contains(VirtualFrame frame, Object self, Object other,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached SequenceNodes.GetSequenceStorageNode getStorage,
        +                        @Cached GetListStorageNode getStorage,
                                 @Cached SequenceStorageNodes.ContainsNode containsNode) {
                     return containsNode.execute(frame, inliningTarget, getStorage.execute(inliningTarget, self), other);
                 }
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
         
        @@ -1101,31 +905,26 @@ public abstract static class IterNode extends PythonUnaryBuiltinNode {
                  */
                 @Specialization(guards = {"isIntStorage(primary)"})
                 static PIntegerSequenceIterator doPListInt(PList primary,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createIntegerSequenceIterator((IntSequenceStorage) primary.getSequenceStorage(), primary);
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createIntegerSequenceIterator(language, (IntSequenceStorage) primary.getSequenceStorage(), primary);
                 }
         
                 @Specialization(guards = {"isLongStorage(primary)"})
                 static PLongSequenceIterator doPListLong(PList primary,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createLongSequenceIterator((LongSequenceStorage) primary.getSequenceStorage(), primary);
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createLongSequenceIterator(language, (LongSequenceStorage) primary.getSequenceStorage(), primary);
                 }
         
                 @Specialization(guards = {"isDoubleStorage(primary)"})
                 static PDoubleSequenceIterator doPListDouble(PList primary,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createDoubleSequenceIterator((DoubleSequenceStorage) primary.getSequenceStorage(), primary);
        -        }
        -
        -        @Specialization(guards = {"!isIntStorage(primary)", "!isLongStorage(primary)", "!isDoubleStorage(primary)"})
        -        static PSequenceIterator doPList(PList primary,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return factory.createSequenceIterator(primary);
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createDoubleSequenceIterator(language, (DoubleSequenceStorage) primary.getSequenceStorage(), primary);
                 }
         
                 @Fallback
        -        static Object doGeneric(@SuppressWarnings("unused") Object self) {
        -            return PNone.NONE;
        +        static PSequenceIterator doOther(Object primary,
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createSequenceIterator(language, primary);
                 }
             }
         
        @@ -1133,12 +932,12 @@ static Object doGeneric(@SuppressWarnings("unused") Object self) {
             @GenerateNodeFactory
             abstract static class ReverseNode extends PythonUnaryBuiltinNode {
                 @Specialization
        -        static Object reverse(PList self,
        +        static Object reverse(Object self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode,
        -                        @Cached PythonObjectFactory factory) {
        -            int len = getSequenceStorageNode.execute(inliningTarget, self).length();
        -            return factory.createSequenceReverseIterator(PythonBuiltinClassType.PReverseIterator, self, len);
        +                        @Cached GetListStorageNode getStorage,
        +                        @Bind PythonLanguage language) {
        +            int len = getStorage.execute(inliningTarget, self).length();
        +            return PFactory.createSequenceReverseIterator(language, self, len);
                 }
             }
         
        @@ -1147,8 +946,8 @@ static Object reverse(PList self,
             public abstract static class ClassGetItemNode extends PythonBinaryBuiltinNode {
                 @Specialization
                 static Object classGetItem(Object cls, Object key,
        -                        @Cached PythonObjectFactory factory) {
        -            return factory.createGenericAlias(cls, key);
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createGenericAlias(language, cls, key);
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/PList.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/PList.java
        index e19628f80a..bfac3f0179 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/PList.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/PList.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2017, 2024, Oracle and/or its affiliates.
        + * Copyright (c) 2017, 2025, Oracle and/or its affiliates.
          * Copyright (c) 2013, Regents of the University of California
          *
          * All rights reserved.
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/map/MapBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/map/MapBuiltins.java
        index daea43de4e..31fc00e6d4 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/map/MapBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/map/MapBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,63 +40,113 @@
          */
         package com.oracle.graal.python.builtins.objects.map;
         
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
        +import static com.oracle.graal.python.nodes.BuiltinNames.J_MAP;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
        +import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
         import com.oracle.graal.python.builtins.objects.function.PKeyword;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        -import com.oracle.graal.python.lib.GetNextNode;
        -import com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
        +import com.oracle.graal.python.lib.PyIterNextNode;
        +import com.oracle.graal.python.lib.PyObjectGetIter;
        +import com.oracle.graal.python.nodes.ErrorMessages;
        +import com.oracle.graal.python.nodes.PRaiseNode;
        +import com.oracle.graal.python.nodes.call.CallNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
        +import com.oracle.graal.python.runtime.object.PFactory;
        +import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.Cached.Shared;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
         import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile;
         
         @CoreFunctions(extendClasses = PythonBuiltinClassType.PMap)
         public final class MapBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = MapBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return MapBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = J_MAP, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
        +    @GenerateNodeFactory
        +    public abstract static class MapNode extends PythonVarargsBuiltinNode {
        +        @Specialization
        +        static PMap doit(VirtualFrame frame, Object cls, Object[] args, PKeyword[] keywords,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached(inline = false /* uncommon path */) TypeNodes.HasObjectInitNode hasObjectInitNode,
        +                        @Cached InlinedLoopConditionProfile loopProfile,
        +                        @Cached PyObjectGetIter getIter,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (keywords.length > 0 && hasObjectInitNode.executeCached(cls)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "map()");
        +            }
        +            if (args.length < 2) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MAP_MUST_HAVE_AT_LEAST_TWO_ARGUMENTS);
        +            }
        +            PMap map = PFactory.createMap(language, cls, getInstanceShape.execute(cls));
        +            map.setFunction(args[0]);
        +            Object[] iterators = new Object[args.length - 1];
        +            loopProfile.profileCounted(inliningTarget, iterators.length);
        +            for (int i = 0; loopProfile.inject(inliningTarget, i < iterators.length); i++) {
        +                iterators[i] = getIter.execute(frame, inliningTarget, args[i + 1]);
        +            }
        +            map.setIterators(iterators);
        +            return map;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    public abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization(guards = "self.getIterators().length == 1")
                 Object doOne(VirtualFrame frame, PMap self,
        -                        @Shared @Cached CallVarargsMethodNode callNode,
        -                        @Shared @Cached GetNextNode next) {
        -            return callNode.execute(frame, self.getFunction(), new Object[]{next.execute(frame, self.getIterators()[0])}, PKeyword.EMPTY_KEYWORDS);
        +                        @Bind Node inliningTarget,
        +                        @Shared @Cached CallNode callNode,
        +                        @Shared @Cached PyIterNextNode nextNode) {
        +            Object item = nextNode.execute(frame, inliningTarget, self.getIterators()[0]);
        +            return callNode.execute(frame, self.getFunction(), item);
                 }
         
                 @Specialization(replaces = "doOne")
                 Object doNext(VirtualFrame frame, PMap self,
        -                        @Shared @Cached CallVarargsMethodNode callNode,
        -                        @Shared @Cached GetNextNode next) {
        +                        @Bind Node inliningTarget,
        +                        @Shared @Cached CallNode callNode,
        +                        @Shared @Cached PyIterNextNode nextNode) {
                     Object[] iterators = self.getIterators();
                     Object[] arguments = new Object[iterators.length];
                     for (int i = 0; i < iterators.length; i++) {
        -                arguments[i] = next.execute(frame, iterators[i]);
        +                arguments[i] = nextNode.execute(frame, inliningTarget, iterators[i]);
                     }
        -            return callNode.execute(frame, self.getFunction(), arguments, PKeyword.EMPTY_KEYWORDS);
        +            return callNode.execute(frame, self.getFunction(), arguments);
                 }
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             public abstract static class IterNode extends PythonUnaryBuiltinNode {
         
        @@ -111,12 +161,12 @@ static PMap iter(PMap self) {
             public abstract static class ReduceNode extends PythonBuiltinNode {
                 @Specialization
                 static PTuple doit(PMap self, @SuppressWarnings("unused") Object ignored,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object[] iterators = self.getIterators();
                     Object[] args = new Object[iterators.length + 1];
                     args[0] = self.getFunction();
                     System.arraycopy(iterators, 0, args, 1, iterators.length);
        -            return factory.createTuple(new Object[]{PythonBuiltinClassType.PMap, factory.createTuple(args)});
        +            return PFactory.createTuple(language, new Object[]{PythonBuiltinClassType.PMap, PFactory.createTuple(language, args)});
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/mappingproxy/MappingproxyBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/mappingproxy/MappingproxyBuiltins.java
        index 8e3be8bb49..a8e6ba7b6e 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/mappingproxy/MappingproxyBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/mappingproxy/MappingproxyBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2017, 2024, Oracle and/or its affiliates.
        + * Copyright (c) 2017, 2025, Oracle and/or its affiliates.
          * Copyright (c) 2013, Regents of the University of California
          *
          * All rights reserved.
        @@ -32,16 +32,7 @@
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J_KEYS;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J_VALUES;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CLASS_GETITEM__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CONTAINS__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IOR__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OR__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REVERSED__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROR__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T_COPY;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T_GET;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T_ITEMS;
        @@ -51,33 +42,43 @@
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.annotations.Slot;
         import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
         import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.list.PList;
         import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode;
        +import com.oracle.graal.python.builtins.objects.tuple.PTuple;
         import com.oracle.graal.python.builtins.objects.type.TpSlots;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.MpSubscriptBuiltinNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqContains.SqContainsBuiltinNode;
        +import com.oracle.graal.python.lib.PyMappingCheckNode;
        +import com.oracle.graal.python.lib.PyNumberOrNode;
         import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
         import com.oracle.graal.python.lib.PyObjectGetItem;
         import com.oracle.graal.python.lib.PyObjectGetIter;
         import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode;
        -import com.oracle.graal.python.lib.PyObjectRichCompareBool;
        +import com.oracle.graal.python.lib.PyObjectRichCompare;
         import com.oracle.graal.python.lib.PyObjectSizeNode;
         import com.oracle.graal.python.lib.PyObjectStrAsObjectNode;
        +import com.oracle.graal.python.lib.PySequenceContainsNode;
        +import com.oracle.graal.python.lib.RichCmpOp;
         import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
        -import com.oracle.graal.python.nodes.expression.BinaryArithmetic;
        -import com.oracle.graal.python.nodes.expression.BinaryOpNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.exception.PythonErrorType;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.Cached.Shared;
        @@ -97,7 +98,33 @@ protected List= 0) {
        -                    selfXPtr = getCallCapiFunction().call(NativeCAPISymbol.FUN_TRUFFLE_ADD_SUBOFFSET, selfPtr, selfOffset, self.getBufferSuboffsets()[dim]);
        +                    selfXPtr = callCapiFunction.call(NativeCAPISymbol.FUN_TRUFFLE_ADD_SUBOFFSET, selfPtr, selfOffset, self.getBufferSuboffsets()[dim]);
                             selfXOffset = 0;
                         }
                         if (other.getBufferSuboffsets() != null && other.getBufferSuboffsets()[dim] >= 0) {
        -                    otherXPtr = getCallCapiFunction().call(NativeCAPISymbol.FUN_TRUFFLE_ADD_SUBOFFSET, otherPtr, otherOffset, other.getBufferSuboffsets()[dim]);
        +                    otherXPtr = callCapiFunction.call(NativeCAPISymbol.FUN_TRUFFLE_ADD_SUBOFFSET, otherPtr, otherOffset, other.getBufferSuboffsets()[dim]);
                             otherXOffset = 0;
                         }
                         if (dim == ndim - 1) {
                             Object selfItem = readSelf.execute(frame, self, selfXPtr, selfXOffset);
                             Object otherItem = readOther.execute(frame, other, otherXPtr, otherXOffset);
        -                    if (!eqNode.compare(frame, inliningTarget, selfItem, otherItem)) {
        +                    if (!eqNode.executeEq(frame, inliningTarget, selfItem, otherItem)) {
                                 return false;
                             }
                         } else {
        -                    if (!recursive(frame, inliningTarget, eqNode, self, other, readSelf, readOther, dim + 1, ndim, selfXPtr, selfXOffset, otherXPtr, otherXOffset)) {
        +                    if (!recursive(frame, inliningTarget, eqNode, callCapiFunction, self, other, readSelf, readOther, dim + 1, ndim, selfXPtr, selfXOffset, otherXPtr, otherXOffset)) {
                                 return false;
                             }
                         }
        @@ -406,24 +469,6 @@ private boolean recursive(VirtualFrame frame, Node inliningTarget, PyObjectRichC
                     }
                     return true;
                 }
        -
        -        private CExtNodes.PCallCapiFunction getCallCapiFunction() {
        -            if (callCapiFunction == null) {
        -                CompilerDirectives.transferToInterpreterAndInvalidate();
        -                callCapiFunction = insert(CExtNodes.PCallCapiFunction.create());
        -            }
        -            return callCapiFunction;
        -        }
        -    }
        -
        -    @Builtin(name = J___DELITEM__, minNumOfPositionalArgs = 1)
        -    @GenerateNodeFactory
        -    public abstract static class DelItemNode extends PythonUnaryBuiltinNode {
        -        @Specialization
        -        static Object error(@SuppressWarnings("unused") PMemoryView self,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_DELETE_MEMORY);
        -        }
             }
         
             @Builtin(name = "tolist", minNumOfPositionalArgs = 1)
        @@ -434,38 +479,38 @@ public abstract static class ToListNode extends PythonUnaryBuiltinNode {
                 @Specialization(guards = {"self.getDimensions() == cachedDimensions", "cachedDimensions < 8"}, limit = "3")
                 Object tolistCached(VirtualFrame frame, PMemoryView self,
                                 @Bind("this") Node inliningTarget,
        +                        @Bind PythonLanguage language,
                                 @Cached("self.getDimensions()") int cachedDimensions,
                                 @Shared @Cached MemoryViewNodes.ReadItemAtNode readItemAtNode,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     if (cachedDimensions == 0) {
                         // That's not a list but CPython does it this way
                         return readItemAtNode.execute(frame, self, self.getBufferPointer(), self.getOffset());
                     } else {
        -                return recursive(frame, self, readItemAtNode, 0, cachedDimensions, self.getBufferPointer(), self.getOffset(), factory);
        +                return recursive(frame, self, readItemAtNode, 0, cachedDimensions, self.getBufferPointer(), self.getOffset(), language);
                     }
                 }
         
                 @Specialization(replaces = "tolistCached")
                 Object tolist(VirtualFrame frame, PMemoryView self,
                                 @Bind("this") Node inliningTarget,
        +                        @Bind PythonLanguage language,
                                 @Shared @Cached MemoryViewNodes.ReadItemAtNode readItemAtNode,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     if (self.getDimensions() == 0) {
                         return readItemAtNode.execute(frame, self, self.getBufferPointer(), self.getOffset());
                     } else {
        -                return recursiveBoundary(frame, self, readItemAtNode, 0, self.getDimensions(), self.getBufferPointer(), self.getOffset(), factory);
        +                return recursiveBoundary(frame, self, readItemAtNode, 0, self.getDimensions(), self.getBufferPointer(), self.getOffset(), language);
                     }
                 }
         
        -        private PList recursiveBoundary(VirtualFrame frame, PMemoryView self, MemoryViewNodes.ReadItemAtNode readItemAtNode, int dim, int ndim, Object ptr, int offset, PythonObjectFactory factory) {
        -            return recursive(frame, self, readItemAtNode, dim, ndim, ptr, offset, factory);
        +        private PList recursiveBoundary(VirtualFrame frame, PMemoryView self, MemoryViewNodes.ReadItemAtNode readItemAtNode, int dim, int ndim, Object ptr, int offset, PythonLanguage language) {
        +            return recursive(frame, self, readItemAtNode, dim, ndim, ptr, offset, language);
                 }
         
        -        private PList recursive(VirtualFrame frame, PMemoryView self, MemoryViewNodes.ReadItemAtNode readItemAtNode, int dim, int ndim, Object ptr, int initialOffset, PythonObjectFactory factory) {
        +        private PList recursive(VirtualFrame frame, PMemoryView self, MemoryViewNodes.ReadItemAtNode readItemAtNode, int dim, int ndim, Object ptr, int initialOffset, PythonLanguage language) {
                     int offset = initialOffset;
                     Object[] objects = new Object[self.getBufferShape()[dim]];
                     for (int i = 0; i < self.getBufferShape()[dim]; i++) {
        @@ -478,11 +523,11 @@ private PList recursive(VirtualFrame frame, PMemoryView self, MemoryViewNodes.Re
                         if (dim == ndim - 1) {
                             objects[i] = readItemAtNode.execute(frame, self, xptr, xoffset);
                         } else {
        -                    objects[i] = recursive(frame, self, readItemAtNode, dim + 1, ndim, xptr, xoffset, factory);
        +                    objects[i] = recursive(frame, self, readItemAtNode, dim + 1, ndim, xptr, xoffset, language);
                         }
                         offset += self.getBufferStrides()[dim];
                     }
        -            return factory.createList(objects);
        +            return PFactory.createList(language, objects);
                 }
         
                 private CExtNodes.PCallCapiFunction getCallCapiFunction() {
        @@ -509,9 +554,9 @@ public abstract static class ToBytesNode extends PythonBinaryClinicBuiltinNode {
                 @Specialization
                 PBytes tobytes(PMemoryView self, TruffleString order,
                                 @Bind("this") Node inliningTarget,
        +                        @Bind PythonLanguage language,
                                 @Cached TruffleString.EqualNode equalNode,
        -                        @Cached PythonObjectFactory factory,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     byte[] bytes;
                     // The nodes act as branch profiles
        @@ -520,9 +565,9 @@ PBytes tobytes(PMemoryView self, TruffleString order,
                     } else if (equalNode.execute(order, T_F, TS_ENCODING)) {
                         bytes = getToJavaBytesFortranOrderNode().execute(self);
                     } else {
        -                throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.ORDER_MUST_BE_C_F_OR_A);
        +                throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.ORDER_MUST_BE_C_F_OR_A);
                     }
        -            return factory.createBytes(bytes);
        +            return PFactory.createBytes(language, bytes);
                 }
         
                 @Override
        @@ -559,7 +604,7 @@ TruffleString none(PMemoryView self, @SuppressWarnings("unused") PNone sep, @Sup
                                 @Shared("p") @Cached InlinedConditionProfile earlyExit,
                                 @Shared("b") @Cached MemoryViewNodes.ToJavaBytesNode toJavaBytesNode,
                                 @Shared("h") @Cached BytesNodes.ByteToHexNode toHexNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     return hex(self, (byte) 0, 0, inliningTarget, earlyExit, toJavaBytesNode, toHexNode, raiseNode);
                 }
         
        @@ -569,7 +614,7 @@ TruffleString hex(PMemoryView self, byte sep, int bytesPerSepGroup,
                                 @Shared("p") @Cached InlinedConditionProfile earlyExit,
                                 @Shared("b") @Cached MemoryViewNodes.ToJavaBytesNode toJavaBytesNode,
                                 @Shared("h") @Cached BytesNodes.ByteToHexNode toHexNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     if (earlyExit.profile(inliningTarget, self.getLength() == 0)) {
                         return T_EMPTY_STRING;
        @@ -594,11 +639,11 @@ public final Object call(VirtualFrame frame, Object arg) {
         
                 @Specialization
                 static PMemoryView toreadonly(PMemoryView self,
        +                        @Bind PythonLanguage language,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached PythonObjectFactory factory,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
        -            return factory.createMemoryView(PythonContext.get(inliningTarget), self.getLifecycleManager(), self.getBuffer(), self.getOwner(), self.getLength(), true,
        +            return PFactory.createMemoryView(language, PythonContext.get(inliningTarget), self.getLifecycleManager(), self.getBuffer(), self.getOwner(), self.getLength(), true,
                                     self.getItemSize(), self.getFormat(), self.getFormatString(), self.getDimensions(), self.getBufferPointer(),
                                     self.getOffset(), self.getBufferShape(), self.getBufferStrides(), self.getBufferSuboffsets(), self.getFlags());
                 }
        @@ -614,10 +659,9 @@ static PMemoryView cast(PMemoryView self, TruffleString formatString, @SuppressW
                                 @Bind("this") Node inliningTarget,
                                 @Shared @Cached TruffleString.CodePointLengthNode lengthNode,
                                 @Shared @Cached TruffleString.CodePointAtIndexNode atIndexNode,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Exclusive @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
        -            return doCast(inliningTarget, self, formatString, 1, null, PythonContext.get(inliningTarget), lengthNode, atIndexNode, factory, raiseNode);
        +            return doCast(inliningTarget, self, formatString, 1, null, PythonContext.get(inliningTarget), lengthNode, atIndexNode, raiseNode);
                 }
         
                 @Specialization(guards = "isPTuple(shapeObj) || isList(shapeObj)")
        @@ -628,8 +672,7 @@ static PMemoryView cast(VirtualFrame frame, PMemoryView self, TruffleString form
                                 @Cached PyNumberAsSizeNode asSizeNode,
                                 @Shared @Cached TruffleString.CodePointLengthNode lengthNode,
                                 @Shared @Cached TruffleString.CodePointAtIndexNode atIndexNode,
        -                        @Shared @Cached PythonObjectFactory factory,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Exclusive @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     SequenceStorage storage = getSequenceStorageNode.execute(inliningTarget, shapeObj);
                     int ndim = storage.length();
        @@ -637,39 +680,39 @@ static PMemoryView cast(VirtualFrame frame, PMemoryView self, TruffleString form
                     for (int i = 0; i < ndim; i++) {
                         shape[i] = asSizeNode.executeExact(frame, inliningTarget, getItemScalarNode.execute(inliningTarget, storage, i));
                         if (shape[i] <= 0) {
        -                    throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MEMORYVIEW_CAST_ELEMENTS_MUST_BE_POSITIVE_INTEGERS);
        +                    throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MEMORYVIEW_CAST_ELEMENTS_MUST_BE_POSITIVE_INTEGERS);
                         }
                     }
        -            return doCast(inliningTarget, self, formatString, ndim, shape, PythonContext.get(inliningTarget), lengthNode, atIndexNode, factory, raiseNode);
        +            return doCast(inliningTarget, self, formatString, ndim, shape, PythonContext.get(inliningTarget), lengthNode, atIndexNode, raiseNode);
                 }
         
                 @Specialization(guards = {"!isPTuple(shape)", "!isList(shape)", "!isPNone(shape)"})
                 @SuppressWarnings("unused")
                 static PMemoryView error(PMemoryView self, TruffleString format, Object shape,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(TypeError, ErrorMessages.ARG_S_MUST_BE_A_LIST_OR_TUPLE, "shape");
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.ARG_S_MUST_BE_A_LIST_OR_TUPLE, "shape");
                 }
         
                 private static PMemoryView doCast(Node inliningTarget, PMemoryView self, TruffleString formatString, int ndim, int[] shape, PythonContext context, TruffleString.CodePointLengthNode lengthNode,
        -                        TruffleString.CodePointAtIndexNode atIndexNode, PythonObjectFactory factory, PRaiseNode.Lazy raiseNode) {
        +                        TruffleString.CodePointAtIndexNode atIndexNode, PRaiseNode raiseNode) {
                     if (!self.isCContiguous()) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MEMORYVIEW_CASTS_RESTRICTED_TO_C_CONTIGUOUS);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MEMORYVIEW_CASTS_RESTRICTED_TO_C_CONTIGUOUS);
                     }
                     BufferFormat format = BufferFormat.forMemoryView(formatString, lengthNode, atIndexNode);
                     int itemsize = format.bytesize;
                     if (itemsize < 0) {
        -                throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MEMORYVIEW_DESTINATION_FORMAT_ERROR);
        +                throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MEMORYVIEW_DESTINATION_FORMAT_ERROR);
                     }
                     if (!MemoryViewNodes.isByteFormat(format) && !MemoryViewNodes.isByteFormat(self.getFormat())) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MEMORYVIEW_CANNOT_CAST_NON_BYTE);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MEMORYVIEW_CANNOT_CAST_NON_BYTE);
                     }
                     if (self.getLength() % itemsize != 0) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MEMORYVIEW_LENGTH_NOT_MULTIPLE_OF_ITEMSIZE);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MEMORYVIEW_LENGTH_NOT_MULTIPLE_OF_ITEMSIZE);
                     }
                     if (shape != null || self.getDimensions() != 1) {
                         for (int i = 0; i < self.getDimensions(); i++) {
                             if (self.getBufferShape()[i] == 0) {
        -                        throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MEMORYVIEW_CANNOT_CAST_VIEW_WITH_ZEROS_IN_SHAPE_OR_STRIDES);
        +                        throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MEMORYVIEW_CANNOT_CAST_VIEW_WITH_ZEROS_IN_SHAPE_OR_STRIDES);
                             }
                         }
                     }
        @@ -681,30 +724,30 @@ private static PMemoryView doCast(Node inliningTarget, PMemoryView self, Truffle
                         newStrides = null;
                         flags |= PMemoryView.FLAG_SCALAR;
                         if (self.getLength() != itemsize) {
        -                    throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MEMORYVIEW_CAST_WRONG_LENGTH);
        +                    throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MEMORYVIEW_CAST_WRONG_LENGTH);
                         }
                     } else {
                         if (shape == null) {
                             newShape = new int[]{self.getLength() / itemsize};
                         } else {
                             if (ndim != 1 && self.getDimensions() != 1) {
        -                        throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MEMORYVIEW_CAST_MUST_BE_1D_TO_ND_OR_ND_TO_1D);
        +                        throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MEMORYVIEW_CAST_MUST_BE_1D_TO_ND_OR_ND_TO_1D);
                             }
                             if (ndim > PMemoryView.MAX_DIM) {
        -                        throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MEMORYVIEW_NUMBER_OF_DIMENSIONS_MUST_NOT_EXCEED_D, ndim);
        +                        throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MEMORYVIEW_NUMBER_OF_DIMENSIONS_MUST_NOT_EXCEED_D, ndim);
                             }
                             int newLength = itemsize;
                             for (int i = 0; i < ndim; i++) {
                                 newLength *= shape[i];
                             }
                             if (newLength != self.getLength()) {
        -                        throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MEMORYVIEW_CAST_WRONG_LENGTH);
        +                        throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MEMORYVIEW_CAST_WRONG_LENGTH);
                             }
                             newShape = shape;
                         }
                         newStrides = PMemoryView.initStridesFromShape(ndim, itemsize, shape);
                     }
        -            return factory.createMemoryView(context, self.getLifecycleManager(), self.getBuffer(), self.getOwner(), self.getLength(), self.isReadOnly(),
        +            return PFactory.createMemoryView(PythonLanguage.get(inliningTarget), context, self.getLifecycleManager(), self.getBuffer(), self.getOwner(), self.getLength(), self.isReadOnly(),
                                     itemsize, format, formatString, ndim, self.getBufferPointer(),
                                     self.getOffset(), newShape, newStrides, null, flags);
                 }
        @@ -724,13 +767,13 @@ public abstract static class LenNode extends LenBuiltinNode {
                 static int len(PMemoryView self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached InlinedConditionProfile zeroDimProfile,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     return zeroDimProfile.profile(inliningTarget, self.getDimensions() == 0) ? 1 : self.getBufferShape()[0];
                 }
             }
         
        -    @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
             @GenerateNodeFactory
             abstract static class ReprNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -744,22 +787,22 @@ static TruffleString repr(PMemoryView self,
                 }
             }
         
        -    @Builtin(name = J___HASH__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_hash, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class HashNode extends PythonUnaryBuiltinNode {
        +    public abstract static class HashNode extends HashBuiltinNode {
                 @Specialization
        -        static int hash(PMemoryView self,
        +        static long hash(PMemoryView self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached InlinedConditionProfile cachedProfile,
                                 @Cached InlinedConditionProfile writableProfile,
                                 @Cached MemoryViewNodes.ToJavaBytesNode toJavaBytesNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     if (cachedProfile.profile(inliningTarget, self.getCachedHash() != -1)) {
                         return self.getCachedHash();
                     }
                     self.checkReleased(inliningTarget, raiseNode);
                     if (writableProfile.profile(inliningTarget, !self.isReadOnly())) {
        -                throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.CANNOT_HASH_WRITEABLE_MEMORYVIEW);
        +                throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.CANNOT_HASH_WRITEABLE_MEMORYVIEW);
                     } else {
                         // TODO avoid copying
                         int hash = hashArray(toJavaBytesNode.execute(self));
        @@ -780,7 +823,7 @@ public abstract static class EnterNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static Object enter(PMemoryView self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     return self;
                 }
        @@ -816,7 +859,7 @@ public abstract static class ItemSizeNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static int get(PMemoryView self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     return self.getItemSize();
                 }
        @@ -829,7 +872,7 @@ public abstract static class NBytesNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static int get(PMemoryView self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     return self.getLength();
                 }
        @@ -842,7 +885,7 @@ public abstract static class ObjNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static Object get(PMemoryView self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     return self.getOwner() != null ? self.getOwner() : PNone.NONE;
                 }
        @@ -855,7 +898,7 @@ public abstract static class FormatNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static Object get(PMemoryView self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     return self.getFormatString() != null ? self.getFormatString() : T_UINT_8_TYPE_CODE;
                 }
        @@ -868,14 +911,14 @@ public abstract static class ShapeNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static Object get(PMemoryView self,
                                 @Bind("this") Node inliningTarget,
        +                        @Bind PythonLanguage language,
                                 @Cached InlinedConditionProfile nullProfile,
        -                        @Cached PythonObjectFactory factory,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     if (nullProfile.profile(inliningTarget, self.getBufferShape() == null)) {
        -                return factory.createEmptyTuple();
        +                return PFactory.createEmptyTuple(language);
                     }
        -            return factory.createTuple(new IntSequenceStorage(self.getBufferShape()));
        +            return PFactory.createTuple(language, new IntSequenceStorage(self.getBufferShape()));
                 }
             }
         
        @@ -886,14 +929,14 @@ public abstract static class StridesNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static Object get(PMemoryView self,
                                 @Bind("this") Node inliningTarget,
        +                        @Bind PythonLanguage language,
                                 @Cached InlinedConditionProfile nullProfile,
        -                        @Cached PythonObjectFactory factory,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     if (nullProfile.profile(inliningTarget, self.getBufferStrides() == null)) {
        -                return factory.createEmptyTuple();
        +                return PFactory.createEmptyTuple(language);
                     }
        -            return factory.createTuple(new IntSequenceStorage(self.getBufferStrides()));
        +            return PFactory.createTuple(language, new IntSequenceStorage(self.getBufferStrides()));
                 }
             }
         
        @@ -904,14 +947,14 @@ public abstract static class SuboffsetsNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static Object get(PMemoryView self,
                                 @Bind("this") Node inliningTarget,
        +                        @Bind PythonLanguage language,
                                 @Cached InlinedConditionProfile nullProfile,
        -                        @Cached PythonObjectFactory factory,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     if (nullProfile.profile(inliningTarget, self.getBufferSuboffsets() == null)) {
        -                return factory.createEmptyTuple();
        +                return PFactory.createEmptyTuple(language);
                     }
        -            return factory.createTuple(new IntSequenceStorage(self.getBufferSuboffsets()));
        +            return PFactory.createTuple(language, new IntSequenceStorage(self.getBufferSuboffsets()));
                 }
             }
         
        @@ -922,7 +965,7 @@ public abstract static class ReadonlyNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static boolean get(PMemoryView self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     return self.isReadOnly();
                 }
        @@ -935,7 +978,7 @@ public abstract static class NDimNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static int get(PMemoryView self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     return self.getDimensions();
                 }
        @@ -948,7 +991,7 @@ public abstract static class CContiguousNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static boolean get(PMemoryView self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     return self.isCContiguous();
                 }
        @@ -961,7 +1004,7 @@ public abstract static class FContiguousNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static boolean get(PMemoryView self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     return self.isFortranContiguous();
                 }
        @@ -974,7 +1017,7 @@ public abstract static class ContiguousNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static boolean get(PMemoryView self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     return self.isAnyContiguous();
                 }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/memoryview/MemoryViewNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/memoryview/MemoryViewNodes.java
        index 227216af94..00d5a649ba 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/memoryview/MemoryViewNodes.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/memoryview/MemoryViewNodes.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -103,7 +103,7 @@ static void checkBufferBounds(Node node, PMemoryView self, PythonBufferAccessLib
                      * reference counting.
                      */
                     CompilerDirectives.transferToInterpreterAndInvalidate();
        -            throw PRaiseNode.raiseUncached(node, IndexError, ErrorMessages.INVALID_BUFFER_ACCESS);
        +            throw PRaiseNode.raiseStatic(node, IndexError, ErrorMessages.INVALID_BUFFER_ACCESS);
                 }
             }
         
        @@ -158,7 +158,7 @@ static Object unpack(Node inliningTarget, BufferFormat format, @SuppressWarnings
                 @Fallback
                 @SuppressWarnings("unused")
                 static Object notImplemented(Node inliningTarget, BufferFormat format, TruffleString formatStr, Object buffer, int offset) {
        -            throw PRaiseNode.raiseUncached(inliningTarget, NotImplementedError, ErrorMessages.MEMORYVIEW_FORMAT_S_NOT_SUPPORTED, formatStr);
        +            throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, ErrorMessages.MEMORYVIEW_FORMAT_S_NOT_SUPPORTED, formatStr);
                 }
             }
         
        @@ -172,19 +172,19 @@ public abstract static class PackValueNode extends Node {
                 static void pack(VirtualFrame frame, Node inliningTarget, BufferFormat format, TruffleString formatStr, Object value, Object buffer, int offset,
                                 @Cached IsBuiltinObjectProfile errorProfile,
                                 @Cached BufferStorageNodes.PackValueNode packValueNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     try {
                         packValueNode.execute(frame, inliningTarget, format, value, buffer, offset);
                     } catch (PException e) {
                         e.expect(inliningTarget, OverflowError, errorProfile);
        -                throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MEMORYVIEW_INVALID_VALUE_FOR_FORMAT_S, formatStr);
        +                throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MEMORYVIEW_INVALID_VALUE_FOR_FORMAT_S, formatStr);
                     }
                 }
         
                 @Fallback
                 @SuppressWarnings("unused")
                 static void notImplemented(Node inliningTarget, BufferFormat format, TruffleString formatStr, Object object, Object buffer, int offset) {
        -            throw PRaiseNode.raiseUncached(inliningTarget, NotImplementedError, ErrorMessages.MEMORYVIEW_FORMAT_S_NOT_SUPPORTED, formatStr);
        +            throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, ErrorMessages.MEMORYVIEW_FORMAT_S_NOT_SUPPORTED, formatStr);
                 }
             }
         
        @@ -340,7 +340,7 @@ abstract static class PointerLookupNode extends Node {
         
                 public abstract MemoryPointer execute(VirtualFrame frame, PMemoryView self, int index);
         
        -        private void lookupDimension(Node inliningTarget, PMemoryView self, MemoryPointer ptr, int dim, int initialIndex, InlinedConditionProfile hasSuboffsetsProfile, PRaiseNode.Lazy raiseNode) {
        +        private void lookupDimension(Node inliningTarget, PMemoryView self, MemoryPointer ptr, int dim, int initialIndex, InlinedConditionProfile hasSuboffsetsProfile, PRaiseNode raiseNode) {
                     int index = initialIndex;
                     int[] shape = self.getBufferShape();
                     int nitems = shape[dim];
        @@ -348,7 +348,7 @@ private void lookupDimension(Node inliningTarget, PMemoryView self, MemoryPointe
                         index += nitems;
                     }
                     if (index < 0 || index >= nitems) {
        -                throw raiseNode.get(inliningTarget).raise(IndexError, ErrorMessages.INDEX_OUT_OF_BOUNDS_ON_DIMENSION_D, dim + 1);
        +                throw raiseNode.raise(inliningTarget, IndexError, ErrorMessages.INDEX_OUT_OF_BOUNDS_ON_DIMENSION_D, dim + 1);
                     }
         
                     ptr.offset += self.getBufferStrides()[dim] * index;
        @@ -367,17 +367,17 @@ MemoryPointer resolveInt(PMemoryView self, int index,
                                 @Bind("this") Node inliningTarget,
                                 @Shared @Cached InlinedConditionProfile hasOneDimensionProfile,
                                 @Shared @Cached InlinedConditionProfile hasSuboffsetsProfile,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     if (hasOneDimensionProfile.profile(inliningTarget, self.getDimensions() == 1)) {
                         MemoryPointer ptr = new MemoryPointer(self.getBufferPointer(), self.getOffset());
                         lookupDimension(inliningTarget, self, ptr, 0, index, hasSuboffsetsProfile, raiseNode);
                         return ptr;
                     }
                     if (self.getDimensions() == 0) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.INVALID_INDEXING_OF_0_DIM_MEMORY);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.INVALID_INDEXING_OF_0_DIM_MEMORY);
                     } else {
                         // CPython doesn't implement this either, as of 3.8
        -                throw raiseNode.get(inliningTarget).raise(NotImplementedError, ErrorMessages.MULTI_DIMENSIONAL_SUB_VIEWS_NOT_IMPLEMENTED);
        +                throw raiseNode.raise(inliningTarget, NotImplementedError, ErrorMessages.MULTI_DIMENSIONAL_SUB_VIEWS_NOT_IMPLEMENTED);
                     }
                 }
         
        @@ -391,7 +391,7 @@ MemoryPointer resolveTupleCached(VirtualFrame frame, PMemoryView self, PTuple in
                                 @Cached("self.getDimensions()") int cachedDimensions,
                                 @Shared @Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode,
                                 @Shared @Cached SequenceStorageNodes.GetItemScalarNode getItemNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     SequenceStorage indicesStorage = getSequenceStorageNode.execute(inliningTarget, indices);
                     checkTupleLength(inliningTarget, indicesStorage, cachedDimensions, raiseNode);
                     MemoryPointer ptr = new MemoryPointer(self.getBufferPointer(), self.getOffset());
        @@ -410,7 +410,7 @@ MemoryPointer resolveTupleGeneric(VirtualFrame frame, PMemoryView self, PTuple i
                                 @Shared @Cached PyIndexCheckNode indexCheckNode,
                                 @Shared @Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode,
                                 @Shared @Cached SequenceStorageNodes.GetItemScalarNode getItemNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     SequenceStorage indicesStorage = getSequenceStorageNode.execute(inliningTarget, indices);
                     int ndim = self.getDimensions();
                     checkTupleLength(inliningTarget, indicesStorage, ndim, raiseNode);
        @@ -429,30 +429,30 @@ MemoryPointer resolveIntObj(VirtualFrame frame, PMemoryView self, Object indexOb
                                 @Shared @Cached InlinedConditionProfile hasOneDimensionProfile,
                                 @Shared @Cached InlinedConditionProfile hasSuboffsetsProfile,
                                 @Shared @Cached PyIndexCheckNode indexCheckNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     final int index = convertIndex(frame, inliningTarget, indexCheckNode, indexObj, raiseNode);
                     return resolveInt(self, index, inliningTarget, hasOneDimensionProfile, hasSuboffsetsProfile, raiseNode);
                 }
         
        -        private static void checkTupleLength(Node inliningTarget, SequenceStorage indicesStorage, int ndim, PRaiseNode.Lazy raiseNode) {
        +        private static void checkTupleLength(Node inliningTarget, SequenceStorage indicesStorage, int ndim, PRaiseNode raiseNode) {
                     int length = indicesStorage.length();
                     if (length == ndim) {
                         return;
                     }
                     // Error cases
                     if (ndim == 0) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.INVALID_INDEXING_OF_0_DIM_MEMORY);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.INVALID_INDEXING_OF_0_DIM_MEMORY);
                     } else if (length > ndim) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANNOT_INDEX_D_DIMENSION_VIEW_WITH_D, ndim, length);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANNOT_INDEX_D_DIMENSION_VIEW_WITH_D, ndim, length);
                     } else {
                         // CPython doesn't implement this either, as of 3.8
        -                throw raiseNode.get(inliningTarget).raise(NotImplementedError, ErrorMessages.SUB_VIEWS_NOT_IMPLEMENTED);
        +                throw raiseNode.raise(inliningTarget, NotImplementedError, ErrorMessages.SUB_VIEWS_NOT_IMPLEMENTED);
                     }
                 }
         
        -        private int convertIndex(VirtualFrame frame, Node inliningTarget, PyIndexCheckNode indexCheckNode, Object indexObj, PRaiseNode.Lazy raiseNode) {
        +        private int convertIndex(VirtualFrame frame, Node inliningTarget, PyIndexCheckNode indexCheckNode, Object indexObj, PRaiseNode raiseNode) {
                     if (!indexCheckNode.execute(inliningTarget, indexObj)) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MEMORYVIEW_INVALID_SLICE_KEY);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MEMORYVIEW_INVALID_SLICE_KEY);
                     }
                     return getAsSizeNode().executeExact(frame, inliningTarget, indexObj, IndexError);
                 }
        @@ -486,7 +486,7 @@ byte[] tobytesCached(PMemoryView self,
                                 @Cached("self.getDimensions()") int cachedDimensions,
                                 @Shared @Cached ReadBytesAtNode readBytesAtNode,
                                 @Shared @Cached CExtNodes.PCallCapiFunction callCapiFunction,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     byte[] bytes = new byte[self.getLength()];
                     if (cachedDimensions == 0) {
        @@ -502,7 +502,7 @@ byte[] tobytesGeneric(PMemoryView self,
                                 @Bind("this") Node inliningTarget,
                                 @Shared @Cached ReadBytesAtNode readBytesAtNode,
                                 @Shared @Cached CExtNodes.PCallCapiFunction callCapiFunction,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     self.checkReleased(inliningTarget, raiseNode);
                     byte[] bytes = new byte[self.getLength()];
                     if (self.getDimensions() == 0) {
        @@ -596,8 +596,9 @@ public final void execute(PMemoryView self) {
         
                 @Specialization(guards = "self.getReference() == null")
                 static void releaseSimple(PMemoryView self,
        +                        @Bind("this") Node inliningTarget,
                                 @Shared("raise") @Cached PRaiseNode raiseNode) {
        -            self.checkExports(raiseNode);
        +            self.checkExports(inliningTarget, raiseNode);
                     self.setReleased();
                 }
         
        @@ -607,7 +608,7 @@ static void releaseNative(VirtualFrame frame, PMemoryView self,
                                 @Cached("createFor(this)") IndirectCallData indirectCallData,
                                 @Cached ReleaseBufferNode releaseNode,
                                 @Shared("raise") @Cached PRaiseNode raiseNode) {
        -            self.checkExports(raiseNode);
        +            self.checkExports(inliningTarget, raiseNode);
                     if (self.checkShouldReleaseBuffer()) {
                         releaseNode.execute(frame, inliningTarget, indirectCallData, self.getLifecycleManager());
                     }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/memoryview/PMemoryView.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/memoryview/PMemoryView.java
        index fb958911da..f0eed188e5 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/memoryview/PMemoryView.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/memoryview/PMemoryView.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -250,9 +250,9 @@ public void setShouldReleaseImmediately(boolean shouldReleaseImmediately) {
                 this.shouldReleaseImmediately = shouldReleaseImmediately;
             }
         
        -    public void checkReleased(Node inliningTarget, PRaiseNode.Lazy raiseNode) {
        +    public void checkReleased(Node inliningTarget, PRaiseNode raiseNode) {
                 if (isReleased()) {
        -            throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.MEMORYVIEW_FORBIDDEN_RELEASED);
        +            throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.MEMORYVIEW_FORBIDDEN_RELEASED);
                 }
             }
         
        @@ -263,10 +263,10 @@ boolean checkShouldReleaseBuffer() {
                 return false;
             }
         
        -    void checkExports(PRaiseNode node) {
        +    void checkExports(Node inliningTarget, PRaiseNode node) {
                 long exportsValue = getExports().get();
                 if (exportsValue > 0) {
        -            throw node.raise(BufferError, ErrorMessages.MEMORYVIEW_HAS_D_EXPORTED_BUFFERS, exportsValue);
        +            throw node.raise(inliningTarget, BufferError, ErrorMessages.MEMORYVIEW_HAS_D_EXPORTED_BUFFERS, exportsValue);
                 }
             }
         
        @@ -290,29 +290,29 @@ int getBufferLength() {
             @ExportMessage
             Object acquire(int requestedFlags,
                             @Bind("$node") Node inliningTarget,
        -                    @Cached PRaiseNode.Lazy raiseNode) {
        +                    @Cached PRaiseNode raiseNode) {
                 checkReleased(inliningTarget, raiseNode);
                 if (BufferFlags.requestsWritable(requestedFlags) && readonly) {
        -            throw raiseNode.get(inliningTarget).raise(BufferError, ErrorMessages.MV_UNDERLYING_BUF_ISNT_WRITABLE);
        +            throw raiseNode.raise(inliningTarget, BufferError, ErrorMessages.MV_UNDERLYING_BUF_ISNT_WRITABLE);
                 }
                 if (BufferFlags.requestsCContiguous(requestedFlags) && !isCContiguous()) {
        -            throw raiseNode.get(inliningTarget).raise(BufferError, ErrorMessages.MV_UNDERLYING_BUF_ISNT_C_CONTIGUOUS);
        +            throw raiseNode.raise(inliningTarget, BufferError, ErrorMessages.MV_UNDERLYING_BUF_ISNT_C_CONTIGUOUS);
                 }
                 if (BufferFlags.requestsFContiguous(requestedFlags) && !isFortranContiguous()) {
        -            throw raiseNode.get(inliningTarget).raise(BufferError, ErrorMessages.MV_UNDERLYING_BUF_ISNT_FORTRAN_CONTIGUOUS);
        +            throw raiseNode.raise(inliningTarget, BufferError, ErrorMessages.MV_UNDERLYING_BUF_ISNT_FORTRAN_CONTIGUOUS);
                 }
                 if (BufferFlags.requestsAnyContiguous(requestedFlags) && !isAnyContiguous()) {
        -            throw raiseNode.get(inliningTarget).raise(BufferError, ErrorMessages.MV_UNDERLYING_BUF_ISNT_CONTIGUOUS);
        +            throw raiseNode.raise(inliningTarget, BufferError, ErrorMessages.MV_UNDERLYING_BUF_ISNT_CONTIGUOUS);
                 }
                 if (!BufferFlags.requestsIndirect(requestedFlags) && (flags & FLAG_PIL) != 0) {
        -            throw raiseNode.get(inliningTarget).raise(BufferError, ErrorMessages.MV_UNDERLYING_BUF_REQUIRES_SUBOFFSETS);
        +            throw raiseNode.raise(inliningTarget, BufferError, ErrorMessages.MV_UNDERLYING_BUF_REQUIRES_SUBOFFSETS);
                 }
                 if (!BufferFlags.requestsStrides(requestedFlags) && !isCContiguous()) {
        -            throw raiseNode.get(inliningTarget).raise(BufferError, ErrorMessages.MV_UNDERLYING_BUF_ISNT_C_CONTIGUOUS);
        +            throw raiseNode.raise(inliningTarget, BufferError, ErrorMessages.MV_UNDERLYING_BUF_ISNT_C_CONTIGUOUS);
                 }
                 // TODO should reflect the cast to unsigned bytes if necessary
                 if (!BufferFlags.requestsShape(requestedFlags) && BufferFlags.requestsFormat(requestedFlags)) {
        -            throw raiseNode.get(inliningTarget).raise(BufferError, ErrorMessages.MV_CANNOT_CAST_UNSIGNED_BYTES_IF_FMT_FLAG);
        +            throw raiseNode.raise(inliningTarget, BufferError, ErrorMessages.MV_CANNOT_CAST_UNSIGNED_BYTES_IF_FMT_FLAG);
                 }
                 exports.incrementAndGet();
                 return this;
        @@ -329,7 +329,7 @@ void release(
                  * should be no such helper memoryviews, the C buffer should have a separate implementation.
                  */
                 if (shouldReleaseImmediately) {
        -            checkExports(raiseNode);
        +            checkExports(inliningTarget, raiseNode);
                     if (checkShouldReleaseBuffer()) {
                         releaseNode.execute(inliningTarget, getLifecycleManager());
                     }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/AbstractBuiltinMethodBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/AbstractBuiltinMethodBuiltins.java
        index 19861c30e8..815e3ca134 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/AbstractBuiltinMethodBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/AbstractBuiltinMethodBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2017, 2023, Oracle and/or its affiliates.
        + * Copyright (c) 2017, 2025, Oracle and/or its affiliates.
          * Copyright (c) 2014, Regents of the University of California
          *
          * All rights reserved.
        @@ -116,7 +116,7 @@ static TruffleString getQualName(VirtualFrame frame, PMethod method,
                                 @Shared @Cached InlinedConditionProfile isGlobalProfile,
                                 @Shared @Cached GetClassNode getClassNode,
                                 @Shared @Cached SimpleTruffleStringFormatNode simpleTruffleStringFormatNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     return makeQualname(frame, inliningTarget, method, method.getSelf(), getQualNameAttrNode, getNameAttrNode, castToStringNode, getClassNode, isTypeNode, isGlobalProfile,
                                     simpleTruffleStringFormatNode, raiseNode);
                 }
        @@ -131,19 +131,19 @@ static TruffleString getQualName(VirtualFrame frame, PBuiltinMethod method,
                                 @Shared @Cached InlinedConditionProfile isGlobalProfile,
                                 @Shared @Cached GetClassNode getClassNode,
                                 @Shared @Cached SimpleTruffleStringFormatNode simpleTruffleStringFormatNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     return makeQualname(frame, inliningTarget, method, method.getSelf(), getQualNameAttrNode, getNameAttrNode, castToStringNode, getClassNode, isTypeNode, isGlobalProfile,
                                     simpleTruffleStringFormatNode, raiseNode);
                 }
         
                 private static TruffleString makeQualname(VirtualFrame frame, Node inliningTarget, Object method, Object self, GetAttributeNode getQualNameAttrNode, GetAttributeNode getNameAttrNode,
                                 CastToTruffleStringNode castToStringNode, GetClassNode getClassNode, TypeNodes.IsTypeNode isTypeNode, InlinedConditionProfile isGlobalProfile,
        -                        SimpleTruffleStringFormatNode simpleTruffleStringFormatNode, PRaiseNode.Lazy raiseNode) {
        +                        SimpleTruffleStringFormatNode simpleTruffleStringFormatNode, PRaiseNode raiseNode) {
                     TruffleString methodName;
                     try {
                         methodName = castToStringNode.execute(inliningTarget, getNameAttrNode.executeObject(frame, method));
                     } catch (CannotCastException e) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.IS_NOT_A_UNICODE_OBJECT, T___NAME__);
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.IS_NOT_A_UNICODE_OBJECT, T___NAME__);
                     }
                     if (isGlobalProfile.profile(inliningTarget, self == PNone.NO_VALUE || self instanceof PythonModule)) {
                         return methodName;
        @@ -154,7 +154,7 @@ private static TruffleString makeQualname(VirtualFrame frame, Node inliningTarge
                     try {
                         typeQualName = castToStringNode.execute(inliningTarget, getQualNameAttrNode.executeObject(frame, type));
                     } catch (CannotCastException e) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.IS_NOT_A_UNICODE_OBJECT, T___QUALNAME__);
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.IS_NOT_A_UNICODE_OBJECT, T___QUALNAME__);
                     }
         
                     return simpleTruffleStringFormatNode.format("%s.%s", typeQualName, methodName);
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/AbstractMethodBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/AbstractMethodBuiltins.java
        index 8bb97d2bc9..7207cf976f 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/AbstractMethodBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/AbstractMethodBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2017, 2024, Oracle and/or its affiliates.
        + * Copyright (c) 2017, 2025, Oracle and/or its affiliates.
          * Copyright (c) 2014, Regents of the University of California
          *
          * All rights reserved.
        @@ -37,34 +37,40 @@
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___MODULE__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___QUALNAME__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         
         import java.util.List;
         
         import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
         import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.PNotImplemented;
         import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
         import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
         import com.oracle.graal.python.builtins.objects.function.PKeyword;
         import com.oracle.graal.python.builtins.objects.module.PythonModule;
         import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
         import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.HashBuiltinNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare.RichCmpBuiltinNode;
         import com.oracle.graal.python.lib.PyObjectGetAttr;
         import com.oracle.graal.python.lib.PyObjectLookupAttr;
        +import com.oracle.graal.python.lib.RichCmpOp;
         import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PGuards;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.attributes.GetAttributeNode;
         import com.oracle.graal.python.nodes.attributes.ReadAttributeFromPythonObjectNode;
         import com.oracle.graal.python.nodes.attributes.WriteAttributeToPythonObjectNode;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
        @@ -76,7 +82,7 @@
         import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext;
         import com.oracle.graal.python.runtime.IndirectCallData;
         import com.oracle.graal.python.runtime.PythonContext;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.graal.python.util.PythonUtils;
         import com.oracle.truffle.api.CompilerDirectives;
         import com.oracle.truffle.api.dsl.Bind;
        @@ -89,47 +95,37 @@
         import com.oracle.truffle.api.frame.VirtualFrame;
         import com.oracle.truffle.api.interop.InteropLibrary;
         import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         import com.oracle.truffle.api.strings.TruffleString;
         
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PMethod, PythonBuiltinClassType.PBuiltinFunctionOrMethod, PythonBuiltinClassType.MethodWrapper})
         public final class AbstractMethodBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = AbstractMethodBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return AbstractMethodBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___CALL__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
        +    @Slot(value = SlotKind.tp_call, isComplex = true)
        +    @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
             @GenerateNodeFactory
        -    public abstract static class CallNode extends PythonVarargsBuiltinNode {
        -        @Child private com.oracle.graal.python.nodes.call.CallNode callNode = com.oracle.graal.python.nodes.call.CallNode.create();
        -
        -        @Specialization(guards = "isFunction(self.getFunction())")
        -        protected Object doIt(VirtualFrame frame, PMethod self, Object[] arguments, PKeyword[] keywords) {
        -            return callNode.execute(frame, self, arguments, keywords);
        -        }
        -
        -        @Specialization(guards = "isFunction(self.getFunction())")
        -        protected Object doIt(VirtualFrame frame, PBuiltinMethod self, Object[] arguments, PKeyword[] keywords) {
        -            return callNode.execute(frame, self, arguments, keywords);
        -        }
        +    abstract static class CallNode extends PythonVarargsBuiltinNode {
         
        -        @Specialization(guards = "!isFunction(self.getFunction())")
        -        protected Object doItNonFunction(VirtualFrame frame, PMethod self, Object[] arguments, PKeyword[] keywords) {
        +        @Specialization
        +        static Object doItNonFunction(VirtualFrame frame, PMethod self, Object[] arguments, PKeyword[] keywords,
        +                        @Cached com.oracle.graal.python.nodes.call.CallNode callNode) {
                     return callNode.execute(frame, self.getFunction(), PythonUtils.prependArgument(self.getSelf(), arguments), keywords);
                 }
         
        -        @Specialization(guards = "!isFunction(self.getFunction())")
        -        protected Object doItNonFunction(VirtualFrame frame, PBuiltinMethod self, Object[] arguments, PKeyword[] keywords) {
        -            return callNode.execute(frame, self.getFunction(), PythonUtils.prependArgument(self.getSelf(), arguments), keywords);
        +        @Specialization
        +        static Object doItNonFunction(VirtualFrame frame, PBuiltinMethod self, Object[] arguments, PKeyword[] keywords,
        +                        @Bind Node inliningTarget,
        +                        @Cached CallDispatchers.BuiltinMethodCachedCallNode callNode) {
        +            return callNode.execute(frame, inliningTarget, self, arguments, keywords);
                 }
         
        -        @Override
        -        public Object varArgExecute(VirtualFrame frame, @SuppressWarnings("unused") Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported {
        -            Object[] argsWithoutSelf = new Object[arguments.length - 1];
        -            PythonUtils.arraycopy(arguments, 1, argsWithoutSelf, 0, argsWithoutSelf.length);
        -            return execute(frame, arguments[0], argsWithoutSelf, keywords);
        -        }
             }
         
             @Builtin(name = J___SELF__, minNumOfPositionalArgs = 1, isGetter = true)
        @@ -149,9 +145,9 @@ protected static Object doIt(PBuiltinMethod self) {
                 }
             }
         
        -    @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2)
        +    @Slot(value = SlotKind.tp_richcompare, isComplex = true)
             @GenerateNodeFactory
        -    abstract static class EqNode extends PythonBinaryBuiltinNode {
        +    abstract static class EqNode extends RichCmpBuiltinNode {
         
                 @Child private InteropLibrary identicalLib = InteropLibrary.getFactory().createDispatched(3);
                 @Child private InteropLibrary identicalLib2 = InteropLibrary.getFactory().createDispatched(3);
        @@ -172,25 +168,46 @@ private boolean eq(Object function1, Object function2, Object self1, Object self
                     return true;
                 }
         
        -        @Specialization
        -        boolean eq(PMethod self, PMethod other) {
        -            return eq(self.getFunction(), other.getFunction(), self.getSelf(), other.getSelf());
        -        }
        +        @Specialization(guards = "op.isEqOrNe()")
        +        boolean eqOrNe(Object self, Object other, RichCmpOp op,
        +                        @Bind("$node") Node inliningTarget,
        +                        @Cached InlinedConditionProfile isBuiltinProfile,
        +                        @Cached InlinedConditionProfile isMethodProfile) {
        +            Object selfFunction, otherFunction;
        +            Object selfSelf, otherSelf;
        +
        +            if (isBuiltinProfile.profile(inliningTarget, self instanceof PBuiltinMethod)) {
        +                selfFunction = ((PBuiltinMethod) self).getBuiltinFunction();
        +                selfSelf = ((PBuiltinMethod) self).getSelf();
        +            } else if (isMethodProfile.profile(inliningTarget, self instanceof PMethod)) {
        +                selfFunction = ((PMethod) self).getFunction();
        +                selfSelf = ((PMethod) self).getSelf();
        +            } else {
        +                return op.isNe();
        +            }
         
        -        @Specialization
        -        boolean eq(PBuiltinMethod self, PBuiltinMethod other) {
        -            return eq(self.getFunction(), other.getFunction(), self.getSelf(), other.getSelf());
        +            if (isBuiltinProfile.profile(inliningTarget, other instanceof PBuiltinMethod)) {
        +                otherFunction = ((PBuiltinMethod) other).getBuiltinFunction();
        +                otherSelf = ((PBuiltinMethod) other).getSelf();
        +            } else if (isMethodProfile.profile(inliningTarget, other instanceof PMethod)) {
        +                otherFunction = ((PMethod) other).getFunction();
        +                otherSelf = ((PMethod) other).getSelf();
        +            } else {
        +                return op.isNe();
        +            }
        +
        +            return eq(selfFunction, otherFunction, selfSelf, otherSelf) == op.isEq();
                 }
         
                 @Fallback
        -        static boolean eq(@SuppressWarnings("unused") Object self, @SuppressWarnings("unused") Object other) {
        -            return false;
        +        static Object others(Object self, Object other, RichCmpOp op) {
        +            return PNotImplemented.NOT_IMPLEMENTED;
                 }
             }
         
        -    @Builtin(name = J___HASH__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_hash, isComplex = true)
             @GenerateNodeFactory
        -    abstract static class HashNode extends PythonUnaryBuiltinNode {
        +    abstract static class HashNode extends HashBuiltinNode {
                 @Specialization
                 static long hash(PMethod self) {
                     return PythonAbstractObject.systemHashCode(self.getSelf()) ^ PythonAbstractObject.systemHashCode(self.getFunction());
        @@ -218,8 +235,8 @@ static Object getModule(VirtualFrame frame, PBuiltinMethod self, @SuppressWarnin
                         return module;
                     }
                     if (self.getSelf() instanceof PythonModule) {
        -                PythonLanguage language = PythonLanguage.get(inliningTarget);
                         PythonContext context = PythonContext.get(inliningTarget);
        +                PythonLanguage language = context.getLanguage(inliningTarget);
                         Object state = IndirectCallContext.enter(frame, language, context, indirectCallData);
                         try {
                             return lookup.execute(null, inliningTarget, self.getSelf(), T___NAME__);
        @@ -245,8 +262,8 @@ static Object getModule(VirtualFrame frame, PMethod self, @SuppressWarnings("unu
         
                 @Specialization(guards = "!isNoValue(value)")
                 static Object getModule(@SuppressWarnings("unused") PMethod self, @SuppressWarnings("unused") Object value,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(AttributeError, ErrorMessages.OBJ_S_HAS_NO_ATTR_S, "method", T___MODULE__);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, AttributeError, ErrorMessages.OBJ_S_HAS_NO_ATTR_S, "method", T___MODULE__);
                 }
             }
         
        @@ -333,7 +350,7 @@ static TruffleString doSelfIsObject(VirtualFrame frame, PMethod method,
                                 @Shared("getQualname") @Cached PyObjectGetAttr getQualname,
                                 @Shared("lookupName") @Cached PyObjectLookupAttr lookupName,
                                 @Shared("formatter") @Cached SimpleTruffleStringFormatNode simpleTruffleStringFormatNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     return getQualName(frame, inliningTarget, method.getSelf(), method.getFunction(), getClassNode, isTypeNode, toStringNode, getQualname, lookupName, simpleTruffleStringFormatNode,
                                     raiseNode);
                 }
        @@ -347,21 +364,21 @@ static TruffleString doSelfIsObject(VirtualFrame frame, PBuiltinMethod method,
                                 @Shared("getQualname") @Cached PyObjectGetAttr getQualname,
                                 @Shared("lookupName") @Cached PyObjectLookupAttr lookupName,
                                 @Shared("formatter") @Cached SimpleTruffleStringFormatNode simpleTruffleStringFormatNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     return getQualName(frame, inliningTarget, method.getSelf(), method.getFunction(), getClassNode, isTypeNode, toStringNode, getQualname, lookupName, simpleTruffleStringFormatNode,
                                     raiseNode);
                 }
         
                 private static TruffleString getQualName(VirtualFrame frame, Node inliningTarget, Object self, Object func, GetClassNode getClassNode, TypeNodes.IsTypeNode isTypeNode,
                                 CastToTruffleStringNode toStringNode, PyObjectGetAttr getQualname, PyObjectLookupAttr lookupName, SimpleTruffleStringFormatNode simpleTruffleStringFormatNode,
        -                        PRaiseNode.Lazy raiseNode) {
        +                        PRaiseNode raiseNode) {
                     Object type = isTypeNode.execute(inliningTarget, self) ? self : getClassNode.execute(inliningTarget, self);
         
                     try {
                         TruffleString typeQualName = toStringNode.execute(inliningTarget, getQualname.execute(frame, inliningTarget, type, T___QUALNAME__));
                         return simpleTruffleStringFormatNode.format("%s.%s", typeQualName, getName(frame, inliningTarget, func, toStringNode, lookupName));
                     } catch (CannotCastException cce) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.IS_NOT_A_UNICODE_OBJECT, T___QUALNAME__);
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.IS_NOT_A_UNICODE_OBJECT, T___QUALNAME__);
                     }
                 }
         
        @@ -403,11 +420,11 @@ PTuple doSelfIsObject(VirtualFrame frame, PMethod method, @SuppressWarnings("unu
                                 @Shared("toStringNode") @Cached CastToTruffleStringNode toStringNode,
                                 @Shared("getGetAttr") @Cached PyObjectGetAttr getGetAttr,
                                 @Shared("getName") @Cached PyObjectGetAttr getName,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     PythonModule builtins = getContext().getBuiltins();
                     Object getattr = getGetAttr.execute(frame, inliningTarget, builtins, T_GETATTR);
        -            PTuple args = factory.createTuple(new Object[]{method.getSelf(), getName(frame, inliningTarget, method.getFunction(), toStringNode, getName)});
        -            return factory.createTuple(new Object[]{getattr, args});
        +            PTuple args = PFactory.createTuple(language, new Object[]{method.getSelf(), getName(frame, inliningTarget, method.getFunction(), toStringNode, getName)});
        +            return PFactory.createTuple(language, new Object[]{getattr, args});
                 }
         
                 @Specialization(guards = "!isSelfModuleOrNull(method)")
        @@ -416,11 +433,11 @@ PTuple doSelfIsObject(VirtualFrame frame, PBuiltinMethod method, @SuppressWarnin
                                 @Shared("toStringNode") @Cached CastToTruffleStringNode toStringNode,
                                 @Shared("getGetAttr") @Cached PyObjectGetAttr getGetAttr,
                                 @Shared("getName") @Cached PyObjectGetAttr getName,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     PythonModule builtins = getContext().getBuiltins();
                     Object getattr = getGetAttr.execute(frame, inliningTarget, builtins, T_GETATTR);
        -            PTuple args = factory.createTuple(new Object[]{method.getSelf(), getName(frame, inliningTarget, method.getFunction(), toStringNode, getName)});
        -            return factory.createTuple(new Object[]{getattr, args});
        +            PTuple args = PFactory.createTuple(language, new Object[]{method.getSelf(), getName(frame, inliningTarget, method.getFunction(), toStringNode, getName)});
        +            return PFactory.createTuple(language, new Object[]{getattr, args});
                 }
         
                 private static TruffleString getName(VirtualFrame frame, Node inliningTarget, Object func, CastToTruffleStringNode toStringNode, PyObjectGetAttr getName) {
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/BuiltinClassmethodBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/BuiltinClassmethodBuiltins.java
        index 3cb22be5d9..6bfe4c858a 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/BuiltinClassmethodBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/BuiltinClassmethodBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -49,18 +49,20 @@
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___QUALNAME__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___TEXT_SIGNATURE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OBJCLASS__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___OBJCLASS__;
         import static com.oracle.graal.python.nodes.StringLiterals.T_QUESTIONMARK;
         
         import java.util.List;
         
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
         import com.oracle.graal.python.builtins.objects.PNone;
         import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
         import com.oracle.graal.python.builtins.objects.type.TypeNodes;
         import com.oracle.graal.python.lib.PyObjectGetAttr;
         import com.oracle.graal.python.lib.PyObjectLookupAttr;
        @@ -79,6 +81,8 @@
         @CoreFunctions(extendClasses = PythonBuiltinClassType.PBuiltinClassMethod)
         public final class BuiltinClassmethodBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = BuiltinClassmethodBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return BuiltinClassmethodBuiltinsFactory.getFactories();
        @@ -139,7 +143,7 @@ static Object textSignature(VirtualFrame frame, PDecoratedMethod self,
                 }
             }
         
        -    @Builtin(name = J___REPR__, maxNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
             @GenerateNodeFactory
             abstract static class ReprNode extends PythonUnaryBuiltinNode {
                 @Specialization
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/BuiltinFunctionOrMethodBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/BuiltinFunctionOrMethodBuiltins.java
        index b0c80b9bc1..c24bbecd7e 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/BuiltinFunctionOrMethodBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/BuiltinFunctionOrMethodBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -42,12 +42,13 @@
         
         import static com.oracle.graal.python.builtins.PythonBuiltinClassType.AttributeError;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___SIGNATURE__;
        -import static com.oracle.graal.python.nodes.SpecialAttributeNames.T__SIGNATURE__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
        +import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___SIGNATURE__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        @@ -59,6 +60,7 @@
         import com.oracle.graal.python.builtins.objects.function.Signature;
         import com.oracle.graal.python.builtins.objects.module.PythonModule;
         import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
         import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode;
         import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
        @@ -82,12 +84,14 @@
         @CoreFunctions(extendClasses = PythonBuiltinClassType.PBuiltinFunctionOrMethod)
         public final class BuiltinFunctionOrMethodBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = BuiltinFunctionOrMethodBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return BuiltinFunctionOrMethodBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
             @GenerateNodeFactory
             abstract static class ReprNode extends PythonUnaryBuiltinNode {
                 static boolean isBuiltinFunction(PBuiltinMethod self) {
        @@ -152,7 +156,7 @@ public Object doIt(Object fun,
                                 @Bind("this") Node inliningTarget) {
                     Signature signature = GetSignatureNode.executeUncached(fun);
                     if (signature.isHidden()) {
        -                throw PRaiseNode.raiseUncached(inliningTarget, AttributeError, ErrorMessages.HAS_NO_ATTR, fun, T__SIGNATURE__);
        +                throw PRaiseNode.raiseStatic(inliningTarget, AttributeError, ErrorMessages.HAS_NO_ATTR, fun, T___SIGNATURE__);
                     }
                     return BuiltinFunctionBuiltins.SignatureNode.createInspectSignature(signature, true);
                 }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/ClassmethodBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/ClassmethodBuiltins.java
        index 9534170b94..2462d80a52 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/ClassmethodBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/ClassmethodBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,52 +40,40 @@
          */
         package com.oracle.graal.python.builtins.objects.method;
         
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
        +import static com.oracle.graal.python.nodes.BuiltinNames.J_CLASSMETHOD;
         import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
         import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.annotations.Slot;
         import com.oracle.graal.python.annotations.Slot.SlotKind;
        -import com.oracle.graal.python.builtins.Builtin;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
        -import com.oracle.graal.python.builtins.objects.function.PFunction;
        -import com.oracle.graal.python.builtins.objects.function.PKeyword;
        +import com.oracle.graal.python.builtins.objects.PNone;
         import com.oracle.graal.python.builtins.objects.type.TpSlots;
        -import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
        +import com.oracle.graal.python.lib.PyObjectLookupAttr;
         import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode;
        -import com.oracle.graal.python.nodes.ErrorMessages;
        -import com.oracle.graal.python.nodes.PGuards;
        -import com.oracle.graal.python.nodes.PNodeWithContext;
        -import com.oracle.graal.python.nodes.PRaiseNode;
        +import com.oracle.graal.python.lib.PyObjectSetAttr;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        -import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
        -import com.oracle.graal.python.nodes.object.GetClassNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        -import com.oracle.graal.python.util.PythonUtils;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
        -import com.oracle.truffle.api.dsl.Cached.Shared;
        -import com.oracle.truffle.api.dsl.GenerateCached;
        -import com.oracle.truffle.api.dsl.GenerateInline;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        -import com.oracle.truffle.api.dsl.GenerateUncached;
        -import com.oracle.truffle.api.dsl.ImportStatic;
         import com.oracle.truffle.api.dsl.NodeFactory;
        -import com.oracle.truffle.api.dsl.ReportPolymorphism;
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
         import com.oracle.truffle.api.nodes.Node;
         import com.oracle.truffle.api.strings.TruffleString;
         import com.oracle.truffle.api.strings.TruffleStringBuilder;
         
        -@CoreFunctions(extendClasses = {PythonBuiltinClassType.PClassmethod, PythonBuiltinClassType.PBuiltinClassMethod})
        +@CoreFunctions(extendClasses = PythonBuiltinClassType.PClassmethod)
         public final class ClassmethodBuiltins extends PythonBuiltins {
         
             public static final TpSlots SLOTS = ClassmethodBuiltinsSlotsGen.SLOTS;
        @@ -95,120 +83,34 @@ protected List> getNodeFa
                 return ClassmethodBuiltinsFactory.getFactories();
             }
         
        -    @Slot(SlotKind.tp_descr_get)
        -    @ReportPolymorphism
        -    @GenerateUncached
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = J_CLASSMETHOD, minNumOfPositionalArgs = 2)
             @GenerateNodeFactory
        -    abstract static class GetNode extends DescrGetBuiltinNode {
        -        /*-
        -        TODO: (GR-53082) this is not handling following code-path added to CPython at some later point:
        -        if (Py_TYPE(cm->cm_callable)->tp_descr_get != NULL) {
        -            return Py_TYPE(cm->cm_callable)->tp_descr_get(cm->cm_callable, type, type);
        -        }
        -        
        -        Additionally, in CPython tp_descrget is not shared between classmethod_descriptor and classmethod,
        -        we should investigate if we can really share the implementation
        -        */
        -
        -        // If self.getCallable() is null, let the next @Specialization handle that
        -        @Specialization(guards = {"isSingleContext()", "isNoValue(type)", "cachedSelf == self", "cachedCallable != null"}, limit = "3")
        -        static Object getCached(@SuppressWarnings("unused") PDecoratedMethod self, Object obj, @SuppressWarnings("unused") Object type,
        -                        @Bind("this") Node inliningTarget,
        -                        @SuppressWarnings("unused") @Cached(value = "self", weak = true) PDecoratedMethod cachedSelf,
        -                        @SuppressWarnings("unused") @Cached(value = "self.getCallable()", weak = true) Object cachedCallable,
        -                        @Shared @Cached GetClassNode getClass,
        -                        @Shared @Cached MakeMethodNode makeMethod) {
        -            return makeMethod.execute(inliningTarget, getClass.execute(inliningTarget, obj), cachedCallable);
        -        }
        -
        -        @Specialization(guards = "isNoValue(type)", replaces = "getCached")
        -        static Object get(PDecoratedMethod self, Object obj, @SuppressWarnings("unused") Object type,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached GetClassNode getClass,
        -                        @Shared @Cached MakeMethodNode makeMethod,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            return doGet(inliningTarget, self, getClass.execute(inliningTarget, obj), makeMethod, raiseNode);
        -        }
        -
        -        // If self.getCallable() is null, let the next @Specialization handle that
        -        @Specialization(guards = {"isSingleContext()", "!isNoValue(type)", "cachedSelf == self", "cachedCallable != null"}, limit = "3")
        -        static Object getTypeCached(@SuppressWarnings("unused") PDecoratedMethod self, @SuppressWarnings("unused") Object obj, Object type,
        -                        @Bind("this") Node inliningTarget,
        -                        @SuppressWarnings("unused") @Cached(value = "self", weak = true) PDecoratedMethod cachedSelf,
        -                        @SuppressWarnings("unused") @Cached(value = "self.getCallable()", weak = true) Object cachedCallable,
        -                        @Shared @Cached MakeMethodNode makeMethod) {
        -            return makeMethod.execute(inliningTarget, type, cachedCallable);
        -        }
        -
        -        @Specialization(guards = "!isNoValue(type)", replaces = "getTypeCached")
        -        static Object getType(PDecoratedMethod self, @SuppressWarnings("unused") Object obj, Object type,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached MakeMethodNode makeMethod,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            return doGet(inliningTarget, self, type, makeMethod, raiseNode);
        -        }
        -
        -        private static Object doGet(Node inliningTarget, PDecoratedMethod self, Object type, MakeMethodNode makeMethod, PRaiseNode.Lazy raiseNode) {
        -            Object callable = self.getCallable();
        -            if (callable == null) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.UNINITIALIZED_S_OBJECT);
        -            }
        -            return makeMethod.execute(inliningTarget, type, callable);
        -        }
        -    }
        -
        -    @GenerateInline
        -    @GenerateCached(false)
        -    @GenerateUncached
        -    @ImportStatic(PGuards.class)
        -    @ReportPolymorphism
        -    abstract static class MakeMethodNode extends PNodeWithContext {
        -        abstract Object execute(Node inliningTarget, Object self, Object func);
        -
        +    public abstract static class ClassmethodNode extends PythonBinaryBuiltinNode {
                 @Specialization
        -        Object method(Object self, PFunction func,
        -                        @Shared("factory") @Cached(inline = false) PythonObjectFactory factory) {
        -            return factory.createMethod(self, func);
        -        }
        -
        -        @Specialization(guards = "!func.needsDeclaringType()")
        -        Object methodBuiltin(Object self, PBuiltinFunction func,
        -                        @Shared("factory") @Cached(inline = false) PythonObjectFactory factory) {
        -            return factory.createBuiltinMethod(self, func);
        -        }
        -
        -        @Specialization(guards = "func.needsDeclaringType()")
        -        Object methodBuiltinWithDeclaringType(Object self, PBuiltinFunction func,
        -                        @Shared("factory") @Cached(inline = false) PythonObjectFactory factory) {
        -            return factory.createBuiltinMethod(self, func, func.getEnclosingType());
        -        }
        -
        -        @Specialization(guards = "!isFunction(func)")
        -        Object generic(Object self, Object func,
        -                        @Shared("factory") @Cached(inline = false) PythonObjectFactory factory) {
        -            return factory.createMethod(self, func);
        +        static Object doObjectIndirect(Object cls, @SuppressWarnings("unused") Object callable,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape) {
        +            return PFactory.createClassmethod(language, cls, getInstanceShape.execute(cls));
                 }
             }
         
        -    @Builtin(name = J___CALL__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
        +    @Slot(value = SlotKind.tp_init, isComplex = true)
        +    @Slot.SlotSignature(name = "classmethod", minNumOfPositionalArgs = 2)
             @GenerateNodeFactory
        -    abstract static class CallNode extends PythonVarargsBuiltinNode {
        -        @Child private com.oracle.graal.python.nodes.call.CallNode callNode = com.oracle.graal.python.nodes.call.CallNode.create();
        -
        +    abstract static class InitNode extends PythonBinaryBuiltinNode {
                 @Specialization
        -        protected Object doIt(VirtualFrame frame, PDecoratedMethod self, Object[] arguments, PKeyword[] keywords) {
        -            return callNode.execute(frame, self.getCallable(), arguments, keywords);
        -        }
        -
        -        @Override
        -        public Object varArgExecute(VirtualFrame frame, @SuppressWarnings("unused") Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported {
        -            Object[] argsWithoutSelf = new Object[arguments.length - 1];
        -            PythonUtils.arraycopy(arguments, 1, argsWithoutSelf, 0, argsWithoutSelf.length);
        -            return execute(frame, arguments[0], argsWithoutSelf, keywords);
        +        protected PNone init(VirtualFrame frame, PDecoratedMethod self, Object callable,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached PyObjectLookupAttr lookup,
        +                        @Cached PyObjectSetAttr setAttr) {
        +            self.setCallable(callable);
        +            DecoratedMethodBuiltins.wraps(frame, self, callable, inliningTarget, lookup, setAttr);
        +            return PNone.NONE;
                 }
             }
         
        -    @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
             @GenerateNodeFactory
             abstract static class ReprNode extends PythonUnaryBuiltinNode {
                 private static final TruffleString PREFIX = tsLiteral("> getNodeFactories() {
        +        return ClassmethodCommonBuiltinsFactory.getFactories();
        +    }
        +
        +    @Slot(SlotKind.tp_descr_get)
        +    @ReportPolymorphism
        +    @GenerateUncached
        +    @GenerateNodeFactory
        +    abstract static class GetNode extends DescrGetBuiltinNode {
        +        /*-
        +        TODO: (GR-53082) this is not handling following code-path added to CPython at some later point:
        +        if (Py_TYPE(cm->cm_callable)->tp_descr_get != NULL) {
        +            return Py_TYPE(cm->cm_callable)->tp_descr_get(cm->cm_callable, type, type);
        +        }
        +        
        +        Additionally, in CPython tp_descrget is not shared between classmethod_descriptor and classmethod,
        +        we should investigate if we can really share the implementation
        +        */
        +
        +        // If self.getCallable() is null, let the next @Specialization handle that
        +        @Specialization(guards = {"isSingleContext()", "isNoValue(type)", "cachedSelf == self", "cachedCallable != null"}, limit = "3")
        +        static Object getCached(@SuppressWarnings("unused") PDecoratedMethod self, Object obj, @SuppressWarnings("unused") Object type,
        +                        @Bind("this") Node inliningTarget,
        +                        @SuppressWarnings("unused") @Cached(value = "self", weak = true) PDecoratedMethod cachedSelf,
        +                        @SuppressWarnings("unused") @Cached(value = "self.getCallable()", weak = true) Object cachedCallable,
        +                        @Shared @Cached GetClassNode getClass,
        +                        @Shared @Cached MakeMethodNode makeMethod) {
        +            return makeMethod.execute(inliningTarget, getClass.execute(inliningTarget, obj), cachedCallable);
        +        }
        +
        +        @Specialization(guards = "isNoValue(type)", replaces = "getCached")
        +        static Object get(PDecoratedMethod self, Object obj, @SuppressWarnings("unused") Object type,
        +                        @Bind("this") Node inliningTarget,
        +                        @Shared @Cached GetClassNode getClass,
        +                        @Shared @Cached MakeMethodNode makeMethod,
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            return doGet(inliningTarget, self, getClass.execute(inliningTarget, obj), makeMethod, raiseNode);
        +        }
        +
        +        // If self.getCallable() is null, let the next @Specialization handle that
        +        @Specialization(guards = {"isSingleContext()", "!isNoValue(type)", "cachedSelf == self", "cachedCallable != null"}, limit = "3")
        +        static Object getTypeCached(@SuppressWarnings("unused") PDecoratedMethod self, @SuppressWarnings("unused") Object obj, Object type,
        +                        @Bind("this") Node inliningTarget,
        +                        @SuppressWarnings("unused") @Cached(value = "self", weak = true) PDecoratedMethod cachedSelf,
        +                        @SuppressWarnings("unused") @Cached(value = "self.getCallable()", weak = true) Object cachedCallable,
        +                        @Shared @Cached MakeMethodNode makeMethod) {
        +            return makeMethod.execute(inliningTarget, type, cachedCallable);
        +        }
        +
        +        @Specialization(guards = "!isNoValue(type)", replaces = "getTypeCached")
        +        static Object getType(PDecoratedMethod self, @SuppressWarnings("unused") Object obj, Object type,
        +                        @Bind("this") Node inliningTarget,
        +                        @Shared @Cached MakeMethodNode makeMethod,
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            return doGet(inliningTarget, self, type, makeMethod, raiseNode);
        +        }
        +
        +        private static Object doGet(Node inliningTarget, PDecoratedMethod self, Object type, MakeMethodNode makeMethod, PRaiseNode raiseNode) {
        +            Object callable = self.getCallable();
        +            if (callable == null) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.UNINITIALIZED_S_OBJECT);
        +            }
        +            return makeMethod.execute(inliningTarget, type, callable);
        +        }
        +    }
        +
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @GenerateUncached
        +    @ImportStatic(PGuards.class)
        +    @ReportPolymorphism
        +    abstract static class MakeMethodNode extends PNodeWithContext {
        +        abstract Object execute(Node inliningTarget, Object self, Object func);
        +
        +        @Specialization
        +        Object method(Object self, PFunction func,
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createMethod(language, self, func);
        +        }
        +
        +        @Specialization(guards = "!func.needsDeclaringType()")
        +        Object methodBuiltin(Object self, PBuiltinFunction func,
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createBuiltinMethod(language, self, func);
        +        }
        +
        +        @Specialization(guards = "func.needsDeclaringType()")
        +        Object methodBuiltinWithDeclaringType(Object self, PBuiltinFunction func,
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createBuiltinMethod(language, self, func, func.getEnclosingType());
        +        }
        +
        +        @Specialization(guards = "!isFunction(func)")
        +        Object generic(Object self, Object func,
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createMethod(language, self, func);
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_call, isComplex = true)
        +    @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
        +    @GenerateNodeFactory
        +    abstract static class CallNode extends PythonVarargsBuiltinNode {
        +        @Child private com.oracle.graal.python.nodes.call.CallNode callNode = com.oracle.graal.python.nodes.call.CallNode.create();
        +
        +        @Specialization
        +        protected Object doIt(VirtualFrame frame, PDecoratedMethod self, Object[] arguments, PKeyword[] keywords) {
        +            return callNode.execute(frame, self.getCallable(), arguments, keywords);
        +        }
        +
        +    }
        +}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/DecoratedMethodBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/DecoratedMethodBuiltins.java
        index b0035c2e05..76e01baa7d 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/DecoratedMethodBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/DecoratedMethodBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -49,7 +49,6 @@
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___MODULE__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___QUALNAME__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ISABSTRACTMETHOD__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ISABSTRACTMETHOD__;
         
        @@ -86,42 +85,24 @@
         @CoreFunctions(extendClasses = {PythonBuiltinClassType.PStaticmethod, PythonBuiltinClassType.PClassmethod})
         public final class DecoratedMethodBuiltins extends PythonBuiltins {
         
        -    @Override
        -    protected List> getNodeFactories() {
        -        return DecoratedMethodBuiltinsFactory.getFactories();
        +    static void wraps(VirtualFrame frame, PDecoratedMethod self, Object callable, Node inliningTarget, PyObjectLookupAttr lookup, PyObjectSetAttr setAttr) {
        +        copyAttr(frame, inliningTarget, callable, self, T___MODULE__, lookup, setAttr);
        +        copyAttr(frame, inliningTarget, callable, self, T___NAME__, lookup, setAttr);
        +        copyAttr(frame, inliningTarget, callable, self, T___QUALNAME__, lookup, setAttr);
        +        copyAttr(frame, inliningTarget, callable, self, T___DOC__, lookup, setAttr);
        +        copyAttr(frame, inliningTarget, callable, self, T___ANNOTATIONS__, lookup, setAttr);
             }
         
        -    @Builtin(name = J___INIT__, minNumOfPositionalArgs = 2)
        -    @GenerateNodeFactory
        -    abstract static class InitNode extends PythonBinaryBuiltinNode {
        -        @Specialization
        -        protected PNone init(VirtualFrame frame, PDecoratedMethod self, Object callable,
        -                        @Bind("this") Node inliningTarget,
        -                        @Cached PyObjectLookupAttr lookupModule,
        -                        @Cached PyObjectSetAttr setModule,
        -                        @Cached PyObjectLookupAttr lookupName,
        -                        @Cached PyObjectSetAttr setName,
        -                        @Cached PyObjectLookupAttr lookupQualname,
        -                        @Cached PyObjectSetAttr setQualname,
        -                        @Cached PyObjectLookupAttr lookupDoc,
        -                        @Cached PyObjectSetAttr setDoc,
        -                        @Cached PyObjectLookupAttr lookupAnnotations,
        -                        @Cached PyObjectSetAttr setAnnotations) {
        -            self.setCallable(callable);
        -            copyAttr(frame, inliningTarget, callable, self, T___MODULE__, lookupModule, setModule);
        -            copyAttr(frame, inliningTarget, callable, self, T___NAME__, lookupName, setName);
        -            copyAttr(frame, inliningTarget, callable, self, T___QUALNAME__, lookupQualname, setQualname);
        -            copyAttr(frame, inliningTarget, callable, self, T___DOC__, lookupDoc, setDoc);
        -            copyAttr(frame, inliningTarget, callable, self, T___ANNOTATIONS__, lookupAnnotations, setAnnotations);
        -            return PNone.NONE;
        +    private static void copyAttr(VirtualFrame frame, Node inliningTarget, Object wrapped, Object wrapper, TruffleString name, PyObjectLookupAttr lookup, PyObjectSetAttr set) {
        +        Object attr = lookup.execute(frame, inliningTarget, wrapped, name);
        +        if (attr != PNone.NO_VALUE) {
        +            set.execute(frame, inliningTarget, wrapper, name, attr);
                 }
        +    }
         
        -        private static void copyAttr(VirtualFrame frame, Node inliningTarget, Object wrapped, Object wrapper, TruffleString name, PyObjectLookupAttr lookup, PyObjectSetAttr set) {
        -            Object attr = lookup.execute(frame, inliningTarget, wrapped, name);
        -            if (attr != PNone.NO_VALUE) {
        -                set.execute(frame, inliningTarget, wrapper, name, attr);
        -            }
        -        }
        +    @Override
        +    protected List> getNodeFactories() {
        +        return DecoratedMethodBuiltinsFactory.getFactories();
             }
         
             @Builtin(name = J___FUNC__, minNumOfPositionalArgs = 1, isGetter = true)
        @@ -155,8 +136,8 @@ static Object setDict(PDecoratedMethod self, PDict mapping,
         
                 @Specialization(guards = {"!isNoValue(mapping)", "!isDict(mapping)"})
                 static Object setDict(@SuppressWarnings("unused") PDecoratedMethod self, Object mapping,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(TypeError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, mapping);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, mapping);
                 }
             }
         
        @@ -171,7 +152,7 @@ static boolean isAbstract(VirtualFrame frame, PDecoratedMethod self,
                                 @Cached InlinedConditionProfile hasAttrProfile) {
                     Object result = lookup.execute(frame, inliningTarget, self.getCallable(), T___ISABSTRACTMETHOD__);
                     if (hasAttrProfile.profile(inliningTarget, result != PNone.NO_VALUE)) {
        -                return isTrue.execute(frame, inliningTarget, result);
        +                return isTrue.execute(frame, result);
                     }
                     return false;
                 }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/InstancemethodBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/InstancemethodBuiltins.java
        index 77e7d15380..19304a7d04 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/InstancemethodBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/InstancemethodBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -41,19 +41,19 @@
         package com.oracle.graal.python.builtins.objects.method;
         
         import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
        +import static com.oracle.graal.python.nodes.BuiltinNames.J_INSTANCEMETHOD;
         import static com.oracle.graal.python.nodes.ErrorMessages.FIRST_ARG_MUST_BE_CALLABLE_S;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___DOC__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___FUNC__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DOC__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.annotations.Slot;
         import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        @@ -64,6 +64,7 @@
         import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins;
         import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode;
         import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotGetAttr.GetAttrBuiltinNode;
         import com.oracle.graal.python.lib.PyCallableCheckNode;
        @@ -77,8 +78,7 @@
         import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
         import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile;
         import com.oracle.graal.python.runtime.exception.PException;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        -import com.oracle.graal.python.util.PythonUtils;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
        @@ -102,7 +102,20 @@ protected List> getNodeFa
                 return InstancemethodBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___INIT__, minNumOfPositionalArgs = 2)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = J_INSTANCEMETHOD, minNumOfPositionalArgs = 2)
        +    @GenerateNodeFactory
        +    public abstract static class InstancemethodNode extends PythonBinaryBuiltinNode {
        +        @Specialization
        +        static Object doObjectIndirect(Object cls, @SuppressWarnings("unused") Object callable,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape) {
        +            return PFactory.createInstancemethod(language, cls, getInstanceShape.execute(cls));
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_init, isComplex = true)
        +    @SlotSignature(name = "instancemethod", minNumOfPositionalArgs = 2)
             @GenerateNodeFactory
             abstract static class InitNode extends PythonBinaryBuiltinNode {
                 @Specialization(guards = "checkCallableNode.execute(this, callable)")
        @@ -115,8 +128,8 @@ static PNone init(PDecoratedMethod self, Object callable,
                 @Specialization(guards = "!checkCallableNode.execute(this, callable)")
                 static PNone noCallble(@SuppressWarnings("unused") PDecoratedMethod self, Object callable,
                                 @Shared("checkCallable") @SuppressWarnings("unused") @Cached PyCallableCheckNode checkCallableNode,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(TypeError, FIRST_ARG_MUST_BE_CALLABLE_S, callable);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, TypeError, FIRST_ARG_MUST_BE_CALLABLE_S, callable);
                 }
             }
         
        @@ -159,7 +172,8 @@ static Object doc(VirtualFrame frame, PDecoratedMethod self,
                 }
             }
         
        -    @Builtin(name = J___CALL__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
        +    @Slot(value = SlotKind.tp_call, isComplex = true)
        +    @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
             @GenerateNodeFactory
             public abstract static class CallNode extends PythonVarargsBuiltinNode {
                 @Specialization
        @@ -168,12 +182,6 @@ protected static Object doIt(VirtualFrame frame, PDecoratedMethod self, Object[]
                     return callNode.execute(frame, self.getCallable(), arguments, keywords);
                 }
         
        -        @Override
        -        public Object varArgExecute(VirtualFrame frame, @SuppressWarnings("unused") Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported {
        -            Object[] argsWithoutSelf = new Object[arguments.length - 1];
        -            PythonUtils.arraycopy(arguments, 1, argsWithoutSelf, 0, argsWithoutSelf.length);
        -            return execute(frame, arguments[0], argsWithoutSelf, keywords);
        -        }
             }
         
             @Slot(SlotKind.tp_descr_get)
        @@ -183,16 +191,15 @@ public abstract static class GetNode extends DescrGetBuiltinNode {
                 @Specialization
                 static Object doGeneric(PDecoratedMethod self, Object obj, @SuppressWarnings("unused") Object cls,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached InlinedConditionProfile objIsNoneProfile,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Cached InlinedConditionProfile objIsNoneProfile) {
                     if (objIsNoneProfile.profile(inliningTarget, obj == PNone.NO_VALUE)) {
                         return self.getCallable();
                     }
        -            return factory.createMethod(obj, self.getCallable());
        +            return PFactory.createMethod(PythonLanguage.get(inliningTarget), obj, self.getCallable());
                 }
             }
         
        -    @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
             @GenerateNodeFactory
             abstract static class ReprNode extends PythonUnaryBuiltinNode {
                 @Specialization
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/MethodBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/MethodBuiltins.java
        index 23b8f10f15..3d666dec18 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/MethodBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/MethodBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2017, 2024, Oracle and/or its affiliates.
        + * Copyright (c) 2017, 2025, Oracle and/or its affiliates.
          * Copyright (c) 2014, Regents of the University of California
          *
          * All rights reserved.
        @@ -34,25 +34,29 @@
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___CODE__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___QUALNAME__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GETATTRIBUTE__;
         import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.annotations.Slot;
         import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
         import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
        +import com.oracle.graal.python.builtins.objects.function.PFunction;
         import com.oracle.graal.python.builtins.objects.function.PKeyword;
         import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins;
         import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode;
         import com.oracle.graal.python.builtins.objects.type.TpSlots;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotGetAttr.GetAttrBuiltinNode;
        +import com.oracle.graal.python.lib.PyCallableCheckNode;
         import com.oracle.graal.python.lib.PyObjectGetAttr;
         import com.oracle.graal.python.lib.PyObjectLookupAttr;
         import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode;
        @@ -63,13 +67,14 @@
         import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetKeywordDefaultsNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
         import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile;
         import com.oracle.graal.python.nodes.object.GetOrCreateDictNode;
         import com.oracle.graal.python.nodes.util.CannotCastException;
         import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
         import com.oracle.graal.python.runtime.exception.PException;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
        @@ -91,6 +96,36 @@ protected List> getNodeFa
                 return MethodBuiltinsFactory.getFactories();
             }
         
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "method", minNumOfPositionalArgs = 3)
        +    @GenerateNodeFactory
        +    public abstract static class MethodTypeNode extends PythonTernaryBuiltinNode {
        +        @Specialization
        +        static Object method(@SuppressWarnings("unused") Object cls, PFunction func, Object self,
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createMethod(language, self, func);
        +        }
        +
        +        @Specialization
        +        static Object methodBuiltin(@SuppressWarnings("unused") Object cls, PBuiltinFunction func, Object self,
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createMethod(language, self, func);
        +        }
        +
        +        @Specialization
        +        static Object methodGeneric(@SuppressWarnings("unused") Object cls, Object func, Object self,
        +                        @Bind("this") Node inliningTarget,
        +                        @Bind PythonLanguage language,
        +                        @Cached PyCallableCheckNode callableCheck,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (callableCheck.execute(inliningTarget, func)) {
        +                return PFactory.createMethod(language, self, func);
        +            } else {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.FIRST_ARG_MUST_BE_CALLABLE_S, "");
        +            }
        +        }
        +    }
        +
             @Builtin(name = J___FUNC__, minNumOfPositionalArgs = 1, isGetter = true)
             @GenerateNodeFactory
             public abstract static class FuncNode extends PythonBuiltinNode {
        @@ -132,14 +167,14 @@ static Object doIt(VirtualFrame frame, PMethod self, Object keyObj,
                                 @Cached ObjectBuiltins.GetAttributeNode objectGetattrNode,
                                 @Cached IsBuiltinObjectProfile errorProfile,
                                 @Cached CastToTruffleStringNode castKeyToStringNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     // TODO: (GR-53090) this is different to what CPython does and CPython also does not
                     // define tp_descrget for method
                     TruffleString key;
                     try {
                         key = castKeyToStringNode.execute(inliningTarget, keyObj);
                     } catch (CannotCastException e) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.ATTR_NAME_MUST_BE_STRING, keyObj);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ATTR_NAME_MUST_BE_STRING, keyObj);
                     }
         
                     try {
        @@ -153,12 +188,12 @@ static Object doIt(VirtualFrame frame, PMethod self, Object keyObj,
                 @Specialization(guards = "!isPMethod(self)")
                 @InliningCutoff
                 static Object getattribute(Object self, @SuppressWarnings("unused") Object key,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, T___GETATTRIBUTE__, "method", self);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, T___GETATTRIBUTE__, "method", self);
                 }
             }
         
        -    @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
             @GenerateNodeFactory
             abstract static class ReprNode extends PythonUnaryBuiltinNode {
                 @Specialization
        @@ -190,11 +225,10 @@ public abstract static class GetMethodDefaultsNode extends PythonUnaryBuiltinNod
                 @Specialization
                 static Object defaults(PMethod self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached GetDefaultsNode getDefaultsNode,
        -                        @Cached PythonObjectFactory.Lazy factory) {
        +                        @Cached GetDefaultsNode getDefaultsNode) {
                     Object[] argDefaults = getDefaultsNode.execute(inliningTarget, self);
                     assert argDefaults != null;
        -            return (argDefaults.length == 0) ? PNone.NONE : factory.get(inliningTarget).createTuple(argDefaults);
        +            return (argDefaults.length == 0) ? PNone.NONE : PFactory.createTuple(PythonLanguage.get(inliningTarget), argDefaults);
                 }
             }
         
        @@ -204,10 +238,9 @@ public abstract static class GetMethodKwdefaultsNode extends PythonUnaryBuiltinN
                 @Specialization
                 static Object kwDefaults(PMethod self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached GetKeywordDefaultsNode getKeywordDefaultsNode,
        -                        @Cached PythonObjectFactory.Lazy factory) {
        +                        @Cached GetKeywordDefaultsNode getKeywordDefaultsNode) {
                     PKeyword[] kwdefaults = getKeywordDefaultsNode.execute(inliningTarget, self);
        -            return (kwdefaults.length > 0) ? factory.get(inliningTarget).createDict(kwdefaults) : PNone.NONE;
        +            return (kwdefaults.length > 0) ? PFactory.createDict(PythonLanguage.get(inliningTarget), kwdefaults) : PNone.NONE;
                 }
             }
         
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/MethodWrapperBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/MethodWrapperBuiltins.java
        index 6150da3a0c..166463c045 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/MethodWrapperBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/MethodWrapperBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -42,16 +42,18 @@
         
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OBJCLASS__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
         import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
         import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
         import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode;
         import com.oracle.graal.python.nodes.attributes.GetAttributeNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
        @@ -71,6 +73,8 @@
         @CoreFunctions(extendClasses = PythonBuiltinClassType.MethodWrapper)
         public final class MethodWrapperBuiltins extends PythonBuiltins {
         
        +    public static final TpSlots SLOTS = MethodWrapperBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return MethodWrapperBuiltinsFactory.getFactories();
        @@ -85,7 +89,7 @@ Object objclass(PBuiltinMethod self) {
                 }
             }
         
        -    @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
             @GenerateNodeFactory
             abstract static class ReprNode extends PythonUnaryBuiltinNode {
                 @Specialization
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/PDecoratedMethod.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/PDecoratedMethod.java
        index e4462ae95b..c132d51694 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/PDecoratedMethod.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/PDecoratedMethod.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,12 +40,13 @@
          */
         package com.oracle.graal.python.builtins.objects.method;
         
        +import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.builtins.BoundBuiltinCallable;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.objects.function.Signature;
         import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
         import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.CompilerDirectives;
         import com.oracle.truffle.api.object.Shape;
         
        @@ -74,14 +75,14 @@ public void setCallable(Object callable) {
             }
         
             @SuppressWarnings("unchecked")
        -    public Object boundToObject(PythonBuiltinClassType binding, PythonObjectFactory factory) {
        +    public Object boundToObject(PythonBuiltinClassType binding, PythonLanguage language) {
                 if (GetPythonObjectClassNode.executeUncached(this) != PythonBuiltinClassType.PStaticmethod) {
                     if (callable instanceof BoundBuiltinCallable) {
        -                return factory.createBuiltinClassmethodFromCallableObj(((BoundBuiltinCallable) callable).boundToObject(binding, factory));
        +                return PFactory.createBuiltinClassmethodFromCallableObj(language, ((BoundBuiltinCallable) callable).boundToObject(binding, language));
                     }
                 } else {
                     if (callable instanceof PBuiltinMethod) {
        -                return factory.createStaticmethodFromCallableObj(((PBuiltinMethod) callable).getBuiltinFunction().boundToObject(binding, factory));
        +                return PFactory.createStaticmethodFromCallableObj(language, ((PBuiltinMethod) callable).getBuiltinFunction().boundToObject(binding, language));
                     }
                 }
                 return this;
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/StaticmethodBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/StaticmethodBuiltins.java
        index 5ef47ed787..0c9c0fb70a 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/StaticmethodBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/StaticmethodBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,29 +40,35 @@
          */
         package com.oracle.graal.python.builtins.objects.method;
         
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
        +import static com.oracle.graal.python.nodes.BuiltinNames.J_STATICMETHOD;
         import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
         import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.annotations.Slot;
         import com.oracle.graal.python.annotations.Slot.SlotKind;
        -import com.oracle.graal.python.builtins.Builtin;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        +import com.oracle.graal.python.builtins.objects.PNone;
         import com.oracle.graal.python.builtins.objects.function.PKeyword;
         import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode;
        +import com.oracle.graal.python.lib.PyObjectLookupAttr;
         import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode;
        +import com.oracle.graal.python.lib.PyObjectSetAttr;
         import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.call.CallNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        @@ -85,6 +91,33 @@ protected List> getNodeFa
                 return StaticmethodBuiltinsFactory.getFactories();
             }
         
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = J_STATICMETHOD, minNumOfPositionalArgs = 2)
        +    @GenerateNodeFactory
        +    public abstract static class StaticmethodNode extends PythonBinaryBuiltinNode {
        +        @Specialization
        +        static Object doObjectIndirect(Object cls, @SuppressWarnings("unused") Object callable,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape) {
        +            return PFactory.createStaticmethod(language, cls, getInstanceShape.execute(cls));
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_init, isComplex = true)
        +    @SlotSignature(name = "staticmethod", minNumOfPositionalArgs = 2)
        +    @GenerateNodeFactory
        +    abstract static class InitNode extends PythonBinaryBuiltinNode {
        +        @Specialization
        +        protected PNone init(VirtualFrame frame, PDecoratedMethod self, Object callable,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached PyObjectLookupAttr lookup,
        +                        @Cached PyObjectSetAttr setAttr) {
        +            self.setCallable(callable);
        +            DecoratedMethodBuiltins.wraps(frame, self, callable, inliningTarget, lookup, setAttr);
        +            return PNone.NONE;
        +        }
        +    }
        +
             @Slot(SlotKind.tp_descr_get)
             @ReportPolymorphism
             @GenerateUncached
        @@ -103,16 +136,17 @@ static Object getCached(@SuppressWarnings("unused") PDecoratedMethod self, @Supp
                 @Specialization(replaces = "getCached")
                 static Object get(PDecoratedMethod self, @SuppressWarnings("unused") Object obj, @SuppressWarnings("unused") Object type,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     Object callable = self.getCallable();
                     if (callable == null) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.UNINITIALIZED_S_OBJECT);
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.UNINITIALIZED_S_OBJECT);
                     }
                     return callable;
                 }
             }
         
        -    @Builtin(name = J___CALL__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
        +    @Slot(value = SlotKind.tp_call, isComplex = true)
        +    @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
             @GenerateNodeFactory
             abstract static class CallMethodNode extends PythonVarargsBuiltinNode {
                 @Specialization
        @@ -122,7 +156,7 @@ static Object call(VirtualFrame frame, PDecoratedMethod self, Object[] args, PKe
                 }
             }
         
        -    @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
             @GenerateNodeFactory
             abstract static class ReprNode extends PythonUnaryBuiltinNode {
                 private static final TruffleString PREFIX = tsLiteral("= fstatResult[ST_SIZE]) {
        +                        throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.MMAP_S_IS_GREATER_THAN_FILE_SIZE, "offset");
        +                    }
        +                    // Unlike in CPython, this always fits in the long range
        +                    length = fstatResult[ST_SIZE] - offset;
        +                } else if (fstatResult != null && (offset > fstatResult[ST_SIZE] || fstatResult[ST_SIZE] - offset < length)) {
        +                    throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.MMAP_S_IS_GREATER_THAN_FILE_SIZE, "length");
        +                }
        +            }
        +
        +            // Fixup the flags if we want to use anonymous map
        +            int dupFd;
        +            if (fd == ANONYMOUS_FD) {
        +                dupFd = ANONYMOUS_FD;
        +                flags |= MAP_ANONYMOUS.value;
        +                // TODO: CPython uses mapping to "/dev/zero" on systems that do not support
        +                // MAP_ANONYMOUS, maybe this can be detected and handled by the POSIX layer
        +            } else {
        +                try {
        +                    dupFd = posixSupport.dup(posixSupport1, fd);
        +                } catch (PosixException e) {
        +                    throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e);
        +                }
        +            }
        +
        +            Object mmapHandle;
        +            try {
        +                mmapHandle = posixSupport.mmap(posixSupport1, length, prot, flags, dupFd, offset);
        +            } catch (PosixException e) {
        +                throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e);
        +            }
        +            PythonContext context = PythonContext.get(inliningTarget);
        +            return PFactory.createMMap(context.getLanguage(inliningTarget), context, clazz, getInstanceShape.execute(clazz), mmapHandle, dupFd, length, access);
        +        }
        +
        +        @Specialization(guards = "isIllegal(fd)")
        +        @SuppressWarnings("unused")
        +        static PMMap doIllegal(Object clazz, int fd, long lengthIn, int flagsIn, int protIn, int accessIn, long offset,
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.OSError);
        +        }
        +
        +        protected static boolean isIllegal(int fd) {
        +            return fd < -1;
        +        }
        +    }
        +
             @Slot(value = SlotKind.sq_item, isComplex = true)
             @GenerateNodeFactory
             public abstract static class MMapSqItemNode extends SqItemBuiltinNode {
                 @Specialization
                 static PBytes doInt(VirtualFrame frame, PMMap self, int index,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached PRaiseNode.Lazy raiseNode,
        +                        @Bind PythonContext context,
        +                        @Cached PRaiseNode raiseNode,
                                 @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
        -                        @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixSupportLib,
        -                        @Cached PythonObjectFactory factory) {
        +                        @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixSupportLib) {
                     long len = self.getLength();
                     checkBounds(inliningTarget, raiseNode, MMAP_INDEX_OUT_OF_RANGE, index, len);
                     try {
        -                byte b = posixSupportLib.mmapReadByte(PosixSupport.get(inliningTarget), self.getPosixSupportHandle(), index);
        +                byte b = posixSupportLib.mmapReadByte(context.getPosixSupport(), self.getPosixSupportHandle(), index);
                         // CPython indeed returns bytes object from sq_item, although it returns single byte
                         // value as integer from mp_subscript, see, e.g.: `for i in mmap_object: print(i)`
        -                return factory.createBytes(new byte[]{b});
        +                return PFactory.createBytes(context.getLanguage(inliningTarget), new byte[]{b});
                     } catch (PosixException e) {
                         throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e);
                     }
        @@ -187,17 +337,18 @@ public abstract static class GetItemNode extends MpSubscriptBuiltinNode {
                 @Specialization(guards = "!isPSlice(idxObj)")
                 static int doSingle(VirtualFrame frame, PMMap self, Object idxObj,
                                 @Bind("this") Node inliningTarget,
        +                        @Bind PythonContext context,
                                 @Exclusive @Cached InlinedConditionProfile negativeIndexProfile,
        -                        @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixSupportLib,
        +                        @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixSupportLib,
                                 @Cached PyLongAsLongNode asLongNode,
                                 @Exclusive @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Exclusive @Cached PRaiseNode raiseNode) {
                     long i = asLongNode.execute(frame, inliningTarget, idxObj);
                     long len = self.getLength();
                     long idx = negativeIndexProfile.profile(inliningTarget, i < 0) ? i + len : i;
                     checkBounds(inliningTarget, raiseNode, MMAP_INDEX_OUT_OF_RANGE, idx, len);
                     try {
        -                return posixSupportLib.mmapReadByte(PosixSupport.get(inliningTarget), self.getPosixSupportHandle(), idx) & 0xFF;
        +                return posixSupportLib.mmapReadByte(context.getPosixSupport(), self.getPosixSupportHandle(), idx) & 0xFF;
                     } catch (PosixException e) {
                         throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e);
                     }
        @@ -206,89 +357,167 @@ static int doSingle(VirtualFrame frame, PMMap self, Object idxObj,
                 @Specialization
                 static Object doSlice(VirtualFrame frame, PMMap self, PSlice idx,
                                 @Bind("this") Node inliningTarget,
        -                        @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixSupportLib,
        +                        @Bind PythonContext context,
        +                        @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixSupportLib,
                                 @Exclusive @Cached InlinedConditionProfile emptyProfile,
                                 @Cached CoerceToIntSlice sliceCast,
                                 @Cached ComputeIndices compute,
                                 @Cached LenOfRangeNode sliceLenNode,
                                 @Exclusive @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
        -                        @Cached PythonObjectFactory factory,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Exclusive @Cached PRaiseNode raiseNode) {
                     try {
                         SliceInfo info = compute.execute(frame, sliceCast.execute(inliningTarget, idx), PInt.intValueExact(self.getLength()));
                         int len = sliceLenNode.len(inliningTarget, info);
                         if (emptyProfile.profile(inliningTarget, len == 0)) {
        -                    return factory.createEmptyBytes();
        +                    return PFactory.createEmptyBytes(context.getLanguage(inliningTarget));
                         }
        -                byte[] result = readBytes(frame, inliningTarget, self, posixSupportLib, PosixSupport.get(inliningTarget), info.start, len, constructAndRaiseNode);
        -                return factory.createBytes(result);
        +                byte[] result = readBytes(frame, inliningTarget, self, posixSupportLib, context.getPosixSupport(), info.start, len, constructAndRaiseNode);
        +                return PFactory.createBytes(context.getLanguage(inliningTarget), result);
                     } catch (OverflowException e) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.OverflowError, e);
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.OverflowError, e);
                     }
                 }
             }
         
        -    @Builtin(name = J___SETITEM__, minNumOfPositionalArgs = 3)
        +    @Slot(value = SlotKind.sq_ass_item, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class SetItemNode extends PythonTernaryBuiltinNode {
        +    public abstract static class SetItemNode extends SqAssItemBuiltinNode {
         
        -        @Specialization(guards = "!isPSlice(idxObj)")
        -        static PNone doSingle(VirtualFrame frame, PMMap self, Object idxObj, Object val,
        +        @Specialization
        +        static void doSingle(VirtualFrame frame, PMMap self, int index, Object val,
                                 @Bind("this") Node inliningTarget,
        -                        @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixSupportLib,
        -                        @Cached PyLongAsLongNode asLongNode,
        -                        @Cached("createCoerce()") CastToByteNode castToByteNode,
        -                        @Exclusive @Cached InlinedConditionProfile outOfRangeProfile,
        -                        @Exclusive @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        -            long i = asLongNode.execute(frame, inliningTarget, idxObj);
        +                        @Bind PythonContext context,
        +                        @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixSupportLib,
        +                        @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib,
        +                        @Cached PyBytesCheckNode checkNode,
        +                        @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
        +                        @Cached PRaiseNode raiseNode) {
        +            // NB: sq_ass_item and mp_ass_subscript implementations behave differently even with
        +            // integer indices
        +            if (self.isClosed()) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, MMAP_CLOSED_OR_INVALID);
        +            }
                     long len = self.getLength();
        -            long idx = i < 0 ? i + len : i;
        -            if (outOfRangeProfile.profile(inliningTarget, idx < 0 || idx >= len)) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.IndexError, MMAP_INDEX_OUT_OF_RANGE);
        +            long idx = index < 0 ? index + len : index;
        +            if (idx < 0 || idx >= len) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.IndexError, MMAP_INDEX_OUT_OF_RANGE);
                     }
        -            byte[] bytes = {castToByteNode.execute(frame, val)};
        -            writeBuffer(frame, inliningTarget, posixSupportLib, self, idx, bytes, 1, constructAndRaiseNode);
        -            return PNone.NONE;
        -        }
        -
        -        @Specialization
        -        static PNone doSlice(VirtualFrame frame, PMMap self, PSlice idx, PBytesLike val,
        -                        @Bind("this") Node inliningTarget,
        -                        @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixSupportLib,
        -                        @Cached ToByteArrayNode toByteArrayNode,
        -                        @Exclusive @Cached InlinedConditionProfile invalidStepProfile,
        -                        @Cached CoerceToIntSlice sliceCast,
        -                        @Cached ComputeIndices compute,
        -                        @Cached LenOfRangeNode sliceLen,
        -                        @Exclusive @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +            if (val == PNone.NO_VALUE) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, MMAP_OBJECT_DOESNT_SUPPORT_ITEM_DELETION);
        +            }
        +            if (!(checkNode.execute(inliningTarget, val) && bufferLib.getBufferLength(val) == 1)) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.IndexError, MMAP_ASSIGNMENT_MUST_BE_LENGTH_1_BYTES);
        +            }
        +            if (self.isReadonly()) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, MMAP_CANNOT_MODIFY_READONLY_MEMORY);
        +            }
        +            byte b = bufferLib.readByte(val, 0);
                     try {
        -                long len = self.getLength();
        -                SliceInfo info = compute.execute(frame, sliceCast.execute(inliningTarget, idx), PInt.intValueExact(len));
        -                if (invalidStepProfile.profile(inliningTarget, info.step != 1)) {
        -                    throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.SystemError, ErrorMessages.STEP_1_NOT_SUPPORTED);
        -                }
        -                byte[] bytes = toByteArrayNode.execute(inliningTarget, val.getSequenceStorage());
        -                writeBuffer(frame, inliningTarget, posixSupportLib, self, info.start, bytes, sliceLen.len(inliningTarget, info), constructAndRaiseNode);
        -                return PNone.NONE;
        -            } catch (OverflowException e) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.OverflowError, e);
        +                posixSupportLib.mmapWriteByte(context.getPosixSupport(), self.getPosixSupportHandle(), idx, b);
        +            } catch (PosixException ex) {
        +                throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, ex);
                     }
                 }
        +    }
        +
        +    @Slot(value = SlotKind.mp_ass_subscript, isComplex = true)
        +    @GenerateNodeFactory
        +    public abstract static class SetSubscriptNode extends MpAssSubscriptBuiltinNode {
         
        -        private static void writeBuffer(VirtualFrame frame, Node inliningTarget, PosixSupportLibrary posixSupportLib, PMMap mmap, long idx, byte[] bytes, int len,
        -                        PConstructAndRaiseNode.Lazy constructAndRaiseNode) {
        +        @Specialization(guards = "!isPSlice(idxObj)")
        +        static void doSingle(VirtualFrame frame, PMMap self, Object idxObj, Object valueObj,
        +                        @Bind("this") Node inliningTarget,
        +                        @Bind PythonContext context,
        +                        @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixSupportLib,
        +                        @Cached PyIndexCheckNode checkNode,
        +                        @Cached PyNumberAsSizeNode asSizeNode,
        +                        @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            // NB: sq_ass_item and mp_ass_subscript implementations behave differently even with
        +            // integer indices
        +            if (self.isClosed()) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, MMAP_CLOSED_OR_INVALID);
        +            }
        +            if (self.isReadonly()) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, MMAP_CANNOT_MODIFY_READONLY_MEMORY);
        +            }
        +            if (!checkNode.execute(inliningTarget, idxObj)) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, MMAP_INDICES_MUST_BE_INTEGER);
        +            }
        +            long idx = asSizeNode.executeExact(frame, inliningTarget, idxObj, PythonBuiltinClassType.IndexError);
        +            long len = self.getLength();
        +            idx = idx < 0 ? idx + len : idx;
        +            if (idx < 0 || idx >= len) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.IndexError, MMAP_INDEX_OUT_OF_RANGE);
        +            }
        +            if (valueObj == PNone.NO_VALUE) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, MMAP_OBJECT_DOESNT_SUPPORT_ITEM_DELETION);
        +            }
        +            if (!checkNode.execute(inliningTarget, valueObj)) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, MMAP_ITEM_VALUE_MUST_BE_AN_INT);
        +            }
        +            int value = asSizeNode.executeExact(frame, inliningTarget, valueObj, PythonBuiltinClassType.TypeError);
        +            if (value < 0 || value > 255) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, MMAP_ITEM_VALUE_MUST_BE_IN_RANGE);
        +            }
                     try {
        -                posixSupportLib.mmapWriteBytes(PosixSupport.get(inliningTarget), mmap.getPosixSupportHandle(), idx, bytes, len);
        +                posixSupportLib.mmapWriteByte(context.getPosixSupport(), self.getPosixSupportHandle(), idx, (byte) value);
                     } catch (PosixException ex) {
                         throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, ex);
                     }
                 }
         
        -        @NeverDefault
        -        protected static CastToByteNode createCoerce() {
        -            return CastToByteNode.create(true);
        +        @Specialization
        +        static void doSlice(VirtualFrame frame, PMMap self, PSlice slice, Object valueObj,
        +                        @Bind("this") Node inliningTarget,
        +                        @Bind PythonContext context,
        +                        @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixSupportLib,
        +                        @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib,
        +                        @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
        +                        @Cached SliceNodes.SliceUnpack sliceUnpack,
        +                        @Cached SliceNodes.AdjustIndices adjustIndices,
        +                        @Cached InlinedConditionProfile step1Profile,
        +                        @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
        +                        @Shared @Cached PRaiseNode raiseNode) {
        +            if (self.isClosed()) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, MMAP_CLOSED_OR_INVALID);
        +            }
        +            if (self.isReadonly()) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, MMAP_CANNOT_MODIFY_READONLY_MEMORY);
        +            }
        +            int len;
        +            try {
        +                len = PInt.intValueExact(self.getLength());
        +            } catch (OverflowException e) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.OverflowError);
        +            }
        +            SliceInfo info = adjustIndices.execute(inliningTarget, len, sliceUnpack.execute(inliningTarget, slice));
        +            if (valueObj == PNone.NO_VALUE) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, MMAP_OBJECT_DOESNT_SUPPORT_SLICE_DELETION);
        +            }
        +            Object buffer = acquireLib.acquireReadonly(valueObj);
        +            try {
        +                int bufferLen = bufferLib.getBufferLength(buffer);
        +                if (info.sliceLength != bufferLen) {
        +                    throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.IndexError, MMAP_SLICE_ASSIGNMENT_IS_WRONG_SIZE);
        +                }
        +                if (info.sliceLength > 0) {
        +                    try {
        +                        if (step1Profile.profile(inliningTarget, info.step == 1)) {
        +                            posixSupportLib.mmapWriteBytes(context.getPosixSupport(), self.getPosixSupportHandle(),
        +                                            info.start, bufferLib.getInternalOrCopiedByteArray(buffer), bufferLen);
        +                        } else {
        +                            for (int cur = info.start, i = 0; i < info.sliceLength; cur += info.step, i++) {
        +                                posixSupportLib.mmapWriteByte(context.getPosixSupport(), self.getPosixSupportHandle(), cur, bufferLib.readByte(buffer, i));
        +                            }
        +                        }
        +                    } catch (PosixException ex) {
        +                        throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, ex);
        +                    }
        +                }
        +            } finally {
        +                bufferLib.release(buffer);
        +            }
                 }
             }
         
        @@ -300,7 +529,7 @@ public abstract static class LenNode extends LenBuiltinNode {
                 @Specialization
                 static int len(PMMap self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     return PyNumberAsSizeNode.doLongExact(inliningTarget, self.getLength(), PythonBuiltinClassType.OverflowError, raiseNode);
                 }
             }
        @@ -331,9 +560,10 @@ static Object size(VirtualFrame frame, PMMap self, @SuppressWarnings("unused") O
             abstract static class CloseNode extends PythonUnaryBuiltinNode {
         
                 @Specialization
        -        PNone close(PMMap self,
        -                        @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixSupportLib) {
        -            self.close(posixSupportLib, getPosixSupport());
        +        static PNone close(PMMap self,
        +                        @Bind PythonContext context,
        +                        @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixSupportLib) {
        +            self.close(posixSupportLib, context.getPosixSupport());
                     return PNone.NONE;
                 }
             }
        @@ -365,9 +595,9 @@ abstract static class ResizeNode extends PythonBuiltinNode {
                 @Specialization
                 @SuppressWarnings("unused")
                 static long resize(PMMap self, Object n,
        -                        @Cached PRaiseNode raiseNode) {
        +                        @Bind("this") Node inliningTarget) {
                     // TODO: implement resize in NFI
        -            throw raiseNode.raise(PythonBuiltinClassType.SystemError, ErrorMessages.RESIZING_NOT_AVAILABLE);
        +            throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.SystemError, ErrorMessages.RESIZING_NOT_AVAILABLE);
                 }
             }
         
        @@ -382,20 +612,20 @@ static long readline(PMMap self) {
         
             @Builtin(name = "read_byte", minNumOfPositionalArgs = 1)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
             abstract static class ReadByteNode extends PythonUnaryBuiltinNode {
         
                 @Specialization
                 static int readByte(VirtualFrame frame, PMMap self,
                                 @Bind("this") Node inliningTarget,
        -                        @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixSupportLib,
        +                        @Bind PythonContext context,
        +                        @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixSupportLib,
                                 @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     if (self.getPos() >= self.getLength()) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, READ_BYTE_OUT_OF_RANGE);
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, READ_BYTE_OUT_OF_RANGE);
                     }
                     try {
        -                byte res = posixSupportLib.mmapReadByte(PosixSupport.get(inliningTarget), self.getPosixSupportHandle(), self.getPos());
        +                byte res = posixSupportLib.mmapReadByte(context.getPosixSupport(), self.getPosixSupportHandle(), self.getPos());
                         self.setPos(self.getPos() + 1);
                         return res & 0xFF;
                     } catch (PosixException e) {
        @@ -406,21 +636,20 @@ static int readByte(VirtualFrame frame, PMMap self,
         
             @Builtin(name = "read", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
             abstract static class ReadNode extends PythonBuiltinNode {
         
                 @Specialization
                 static PBytes read(VirtualFrame frame, PMMap self, Object n,
                                 @Bind("this") Node inliningTarget,
        +                        @Bind PythonContext context,
                                 @Cached InlinedConditionProfile noneProfile,
                                 @Cached InlinedConditionProfile emptyProfile,
        -                        @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib,
        +                        @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib,
                                 @Cached PyIndexCheckNode indexCheckNode,
                                 @Cached PyNumberAsSizeNode asSizeNode,
                                 @Cached InlinedConditionProfile negativeProfile,
                                 @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
        -                        @Cached PythonObjectFactory factory,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     long nread;
                     // intentionally accept NO_VALUE and NONE; both mean that we read unlimited # of bytes
                     if (noneProfile.profile(inliningTarget, isPNone(n))) {
        @@ -428,7 +657,7 @@ static PBytes read(VirtualFrame frame, PMMap self, Object n,
                     } else {
                         // _Py_convert_optional_to_ssize_t:
                         if (!indexCheckNode.execute(inliningTarget, n)) {
        -                    throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.ARG_SHOULD_BE_INT_OR_NONE, n);
        +                    throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ARG_SHOULD_BE_INT_OR_NONE, n);
                         }
                         nread = asSizeNode.executeExact(frame, inliningTarget, n);
         
        @@ -439,14 +668,14 @@ static PBytes read(VirtualFrame frame, PMMap self, Object n,
                         }
                     }
                     if (emptyProfile.profile(inliningTarget, nread == 0)) {
        -                return factory.createEmptyBytes();
        +                return PFactory.createEmptyBytes(context.getLanguage(inliningTarget));
                     }
                     try {
        -                byte[] buffer = MMapBuiltins.readBytes(frame, inliningTarget, self, posixLib, PosixSupport.get(inliningTarget), self.getPos(), PythonUtils.toIntExact(nread), constructAndRaiseNode);
        +                byte[] buffer = MMapBuiltins.readBytes(frame, inliningTarget, self, posixLib, context.getPosixSupport(), self.getPos(), PythonUtils.toIntExact(nread), constructAndRaiseNode);
                         self.setPos(self.getPos() + buffer.length);
        -                return factory.createBytes(buffer);
        +                return PFactory.createBytes(context.getLanguage(inliningTarget), buffer);
                     } catch (OverflowException e) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.OverflowError, ErrorMessages.TOO_MANY_REMAINING_BYTES_TO_BE_STORED);
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.OverflowError, ErrorMessages.TOO_MANY_REMAINING_BYTES_TO_BE_STORED);
                     }
                 }
             }
        @@ -457,12 +686,12 @@ abstract static class ReadlineNode extends PythonUnaryBuiltinNode {
                 private static final int BUFFER_SIZE = 1024;
         
                 @Specialization
        -        Object readline(VirtualFrame frame, PMMap self,
        +        static Object readline(VirtualFrame frame, PMMap self,
                                 @Bind("this") Node inliningTarget,
        -                        @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib,
        +                        @Bind PythonContext context,
        +                        @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib,
                                 @Cached SequenceStorageNodes.AppendNode appendNode,
        -                        @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) {
                     // Posix abstraction is leaking here a bit: with read mmapped memory, we'd just read
                     // byte by byte, but that would be very inefficient with emulated mmap, so we use a
                     // small buffer
        @@ -471,7 +700,7 @@ Object readline(VirtualFrame frame, PMMap self,
                     int nread;
                     outer: while (self.getPos() < self.getLength()) {
                         try {
        -                    nread = posixLib.mmapReadBytes(getPosixSupport(), self.getPosixSupportHandle(), self.getPos(), buffer, (int) Math.min(self.getRemaining(), buffer.length));
        +                    nread = posixLib.mmapReadBytes(context.getPosixSupport(), self.getPosixSupportHandle(), self.getPos(), buffer, (int) Math.min(self.getRemaining(), buffer.length));
                         } catch (PosixException e) {
                             throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e);
                         }
        @@ -485,7 +714,7 @@ Object readline(VirtualFrame frame, PMMap self,
                         }
                         self.setPos(self.getPos() + nread);
                     }
        -            return factory.createBytes(res);
        +            return PFactory.createBytes(context.getLanguage(inliningTarget), res);
                 }
             }
         
        @@ -502,21 +731,22 @@ protected ArgumentClinicProvider getArgumentClinic() {
                 @Specialization(limit = "3")
                 static int doIt(VirtualFrame frame, PMMap self, Object dataBuffer,
                                 @Bind("this") Node inliningTarget,
        +                        @Bind PythonContext context,
                                 @Cached("createFor(this)") IndirectCallData indirectCallData,
                                 @CachedLibrary("dataBuffer") PythonBufferAccessLibrary bufferLib,
        -                        @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib,
        +                        @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib,
                                 @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     try {
                         if (!self.isWriteable()) {
        -                    throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MMAP_CANNOT_MODIFY_READONLY_MEMORY);
        +                    throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MMAP_CANNOT_MODIFY_READONLY_MEMORY);
                         }
                         byte[] dataBytes = bufferLib.getInternalOrCopiedByteArray(dataBuffer);
                         int dataLen = bufferLib.getBufferLength(dataBuffer);
                         if (self.getPos() > self.getLength() || self.getLength() - self.getPos() < dataLen) {
        -                    throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.DATA_OUT_OF_RANGE);
        +                    throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.DATA_OUT_OF_RANGE);
                         }
        -                posixLib.mmapWriteBytes(PosixSupport.get(inliningTarget), self.getPosixSupportHandle(), self.getPos(), dataBytes, dataLen);
        +                posixLib.mmapWriteBytes(context.getPosixSupport(), self.getPosixSupportHandle(), self.getPos(), dataBytes, dataLen);
                         self.setPos(self.getPos() + dataLen);
                         return dataLen;
                     } catch (PosixException e) {
        @@ -531,7 +761,6 @@ static int doIt(VirtualFrame frame, PMMap self, Object dataBuffer,
             @ArgumentClinic(name = "dist", conversion = ClinicConversion.LongIndex)
             @ArgumentClinic(name = "how", conversion = ClinicConversion.Int)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
             abstract static class SeekNode extends PythonTernaryClinicBuiltinNode {
                 @Override
                 protected ArgumentClinicProvider getArgumentClinic() {
        @@ -542,7 +771,7 @@ protected ArgumentClinicProvider getArgumentClinic() {
                 static Object seek(PMMap self, long dist, int how,
                                 @Bind("this") Node inliningTarget,
                                 @Cached InlinedBranchProfile errorProfile,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     long where;
                     switch (how) {
                         case 0: // relative to start
        @@ -556,10 +785,10 @@ static Object seek(PMMap self, long dist, int how,
                             break;
                         default:
                             errorProfile.enter(inliningTarget);
        -                    throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.UNKNOWN_S_TYPE, "seek");
        +                    throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.UNKNOWN_S_TYPE, "seek");
                     }
                     if (where > self.getLength() || where < 0) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.SEEK_OUT_OF_RANGE);
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.SEEK_OUT_OF_RANGE);
                     }
                     self.setPos(where);
                     return PNone.NONE;
        @@ -569,7 +798,6 @@ static Object seek(PMMap self, long dist, int how,
             @Builtin(name = "find", minNumOfPositionalArgs = 2, parameterNames = {"$self", "sub", "start", "end"})
             @ArgumentClinic(name = "sub", conversion = ClinicConversion.ReadableBuffer)
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonArithmeticTypes.class)
             public abstract static class FindNode extends PythonQuaternaryClinicBuiltinNode {
                 private static final int BUFFER_SIZE = 1024; // keep in sync with test_mmap.py
         
        @@ -581,13 +809,14 @@ protected ArgumentClinicProvider getArgumentClinic() {
                 @Specialization(limit = "3")
                 static long find(VirtualFrame frame, PMMap self, Object subBuffer, Object startIn, Object endIn,
                                 @Bind("this") Node inliningTarget,
        +                        @Bind PythonContext context,
                                 @Cached("createFor(this)") IndirectCallData indirectCallData,
                                 @CachedLibrary("subBuffer") PythonBufferAccessLibrary bufferLib,
                                 @Cached LongIndexConverterNode startConverter,
                                 @Cached LongIndexConverterNode endConverter,
        -                        @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib,
        +                        @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib,
                                 @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     try {
                         long start = normalizeIndex(frame, startConverter, startIn, self.getLength(), self.getPos());
                         long end = normalizeIndex(frame, endConverter, endIn, self.getLength(), self.getLength());
        @@ -606,7 +835,7 @@ static long find(VirtualFrame frame, PMMap self, Object subBuffer, Object startI
                         byte[] firstBuffer = new byte[bufferSize];
                         byte[] secondBuffer = new byte[bufferSize];
         
        -                readBytes(frame, inliningTarget, self, posixLib, start, secondBuffer, constructAndRaiseNode, raiseNode);
        +                readBytes(frame, inliningTarget, self, posixLib, context.getPosixSupport(), start, secondBuffer, constructAndRaiseNode, raiseNode);
                         for (long selfIdx = start; selfIdx <= end - subLen; selfIdx++, buffersIndex++) {
                             // Make sure that the buffers have enough room for the search
                             if (buffersIndex + subLen > bufferSize * 2) {
        @@ -615,7 +844,7 @@ static long find(VirtualFrame frame, PMMap self, Object subBuffer, Object startI
                                 secondBuffer = tmp;
                                 buffersIndex -= bufferSize; // move to the tail of the first buffer now
                                 long readIndex = selfIdx + subLen - 1;
        -                        readBytes(frame, inliningTarget, self, posixLib, readIndex, secondBuffer, constructAndRaiseNode, raiseNode);
        +                        readBytes(frame, inliningTarget, self, posixLib, context.getPosixSupport(), readIndex, secondBuffer, constructAndRaiseNode, raiseNode);
                                 // It's OK if we read less than buffer size, the outer loop condition
                                 // 'selfIdx <= end' and the check in readBytes should cover that we don't
                                 // read
        @@ -645,14 +874,14 @@ static long find(VirtualFrame frame, PMMap self, Object subBuffer, Object startI
                     }
                 }
         
        -        private static void readBytes(VirtualFrame frame, Node inliningTarget, PMMap self, PosixSupportLibrary posixLib, long index, byte[] buffer, PConstructAndRaiseNode.Lazy constructAndRaiseNode,
        -                        PRaiseNode.Lazy raiseNode) {
        +        private static void readBytes(VirtualFrame frame, Node inliningTarget, PMMap self, PosixSupportLibrary posixLib, PosixSupport posixSupport, long index, byte[] buffer,
        +                        PConstructAndRaiseNode.Lazy constructAndRaiseNode, PRaiseNode raiseNode) {
                     try {
                         long remaining = self.getLength() - index;
                         int toReadLen = remaining > buffer.length ? buffer.length : (int) remaining;
        -                int nread = posixLib.mmapReadBytes(PosixSupport.get(inliningTarget), self.getPosixSupportHandle(), index, buffer, toReadLen);
        +                int nread = posixLib.mmapReadBytes(posixSupport, self.getPosixSupportHandle(), index, buffer, toReadLen);
                         if (toReadLen != nread) {
        -                    throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.SystemError, MMAP_CHANGED_LENGTH);
        +                    throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.SystemError, MMAP_CHANGED_LENGTH);
                         }
                     } catch (PosixException ex) {
                         throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, ex);
        @@ -687,12 +916,13 @@ protected ArgumentClinicProvider getArgumentClinic() {
                 }
         
                 @Specialization
        -        Object flush(VirtualFrame frame, PMMap self, long offset, Object sizeObj,
        +        static Object flush(VirtualFrame frame, PMMap self, long offset, Object sizeObj,
                                 @Bind("this") Node inliningTarget,
        +                        @Bind PythonContext context,
                                 @Cached LongIndexConverterNode sizeConversion,
        -                        @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib,
        +                        @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib,
                                 @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     long size;
                     if (sizeObj == PNone.NO_VALUE) {
                         size = self.getLength();
        @@ -701,14 +931,14 @@ Object flush(VirtualFrame frame, PMMap self, long offset, Object sizeObj,
                     }
         
                     if (size < 0 || offset < 0 || self.getLength() - offset < size) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.FLUSH_VALUES_OUT_OF_RANGE);
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.FLUSH_VALUES_OUT_OF_RANGE);
                     }
                     if (self.getAccess() == ACCESS_READ || self.getAccess() == ACCESS_COPY) {
                         return PNone.NONE;
                     }
         
                     try {
        -                posixLib.mmapFlush(getPosixSupport(), self.getPosixSupportHandle(), offset, self.getLength());
        +                posixLib.mmapFlush(context.getPosixSupport(), self.getPosixSupportHandle(), offset, self.getLength());
                     } catch (PosixException e) {
                         throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e);
                     }
        @@ -749,5 +979,4 @@ public Object execute(VirtualFrame frame) {
                     }
                 }
             }
        -
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/FrozenModules.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/FrozenModules.java
        index 1ea437e878..bef91e264c 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/FrozenModules.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/FrozenModules.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -216,9 +216,12 @@ private static final class Map {
                 private static final PythonFrozenModule __PHELLO___HAM_EGGS = new PythonFrozenModule("__PHELLO___HAM_EGGS", "__phello__.ham.eggs", false);
                 private static final PythonFrozenModule __PHELLO___SPAM = new PythonFrozenModule("__PHELLO___SPAM", "__phello__.spam", false);
                 private static final PythonFrozenModule FROZEN_ONLY = new PythonFrozenModule("FROZEN_ONLY", null, false);
        +        private static final PythonFrozenModule POLYGLOT_ARROW = new PythonFrozenModule("POLYGLOT_ARROW", null, false);
                 private static final PythonFrozenModule _SYSCONFIGDATA = new PythonFrozenModule("_SYSCONFIGDATA", null, false);
        +        private static final PythonFrozenModule _POLYGLOT = new PythonFrozenModule("_POLYGLOT", null, false);
        +        private static final PythonFrozenModule _POLYGLOT_DATETIME = new PythonFrozenModule("_POLYGLOT_DATETIME", null, false);
        +        private static final PythonFrozenModule _POLYGLOT_TIME = new PythonFrozenModule("_POLYGLOT_TIME", null, false);
                 private static final PythonFrozenModule GRAALPY___GRAALPYTHON__ = new PythonFrozenModule("GRAALPY___GRAALPYTHON__", null, false);
        -        private static final PythonFrozenModule GRAALPY__INTEROP_BEHAVIOR = new PythonFrozenModule("GRAALPY__INTEROP_BEHAVIOR", null, false);
                 private static final PythonFrozenModule GRAALPY__SRE = new PythonFrozenModule("GRAALPY__SRE", null, false);
                 private static final PythonFrozenModule GRAALPY__SYSCONFIG = new PythonFrozenModule("GRAALPY__SYSCONFIG", null, false);
                 private static final PythonFrozenModule GRAALPY__WEAKREF = new PythonFrozenModule("GRAALPY__WEAKREF", null, false);
        @@ -226,7 +229,7 @@ private static final class Map {
                 private static final PythonFrozenModule GRAALPY_JAVA = new PythonFrozenModule("GRAALPY_JAVA", null, false);
                 private static final PythonFrozenModule GRAALPY_PIP_HOOK = new PythonFrozenModule("GRAALPY_PIP_HOOK", null, false);
                 private static final PythonFrozenModule GRAALPY_UNICODEDATA = new PythonFrozenModule("GRAALPY_UNICODEDATA", null, false);
        -        private static final PythonFrozenModule GRAALPY_SULONG_SUPPORT = new PythonFrozenModule("GRAALPY_SULONG_SUPPORT", null, false);
        +        private static final PythonFrozenModule GRAALPY__NT = new PythonFrozenModule("GRAALPY__NT", null, false);
             }
         
             public static final PythonFrozenModule lookup(String name) {
        @@ -591,12 +594,18 @@ public static final PythonFrozenModule lookup(String name) {
                         return Map.__PHELLO___SPAM;
                     case "__hello_only__":
                         return Map.FROZEN_ONLY;
        +            case "polyglot.arrow":
        +                return Map.POLYGLOT_ARROW;
                     case "_sysconfigdata":
                         return Map._SYSCONFIGDATA;
        +            case "_polyglot":
        +                return Map._POLYGLOT;
        +            case "_polyglot_datetime":
        +                return Map._POLYGLOT_DATETIME;
        +            case "_polyglot_time":
        +                return Map._POLYGLOT_TIME;
                     case "graalpy.__graalpython__":
                         return Map.GRAALPY___GRAALPYTHON__;
        -            case "graalpy._interop_behavior":
        -                return Map.GRAALPY__INTEROP_BEHAVIOR;
                     case "graalpy._sre":
                         return Map.GRAALPY__SRE;
                     case "graalpy._sysconfig":
        @@ -611,8 +620,8 @@ public static final PythonFrozenModule lookup(String name) {
                         return Map.GRAALPY_PIP_HOOK;
                     case "graalpy.unicodedata":
                         return Map.GRAALPY_UNICODEDATA;
        -            case "graalpy.sulong_support":
        -                return Map.GRAALPY_SULONG_SUPPORT;
        +            case "graalpy._nt":
        +                return Map.GRAALPY__NT;
                     default:
                         return null;
                 }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/ModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/ModuleBuiltins.java
        index 242e06cae6..d4cdb74bf8 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/ModuleBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/ModuleBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -41,6 +41,7 @@
         package com.oracle.graal.python.builtins.objects.module;
         
         import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
        +import static com.oracle.graal.python.nodes.BuiltinNames.J_MODULE;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___ANNOTATIONS__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___DICT__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___ANNOTATIONS__;
        @@ -51,7 +52,6 @@
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___PACKAGE__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___SPEC__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DIR__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DIR__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GETATTRIBUTE__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GETATTR__;
        @@ -60,9 +60,11 @@
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.annotations.ArgumentClinic;
         import com.oracle.graal.python.annotations.Slot;
         import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        @@ -70,12 +72,16 @@
         import com.oracle.graal.python.builtins.objects.PNone;
         import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
         import com.oracle.graal.python.builtins.objects.dict.PDict;
        +import com.oracle.graal.python.builtins.objects.function.PKeyword;
         import com.oracle.graal.python.builtins.objects.module.ModuleBuiltinsClinicProviders.ModuleNodeClinicProviderGen;
         import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins;
         import com.oracle.graal.python.builtins.objects.str.StringNodes.CastToTruffleStringCheckedNode;
         import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodes;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotGetAttr.GetAttrBuiltinNode;
         import com.oracle.graal.python.lib.PyDictGetItem;
        +import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
        +import com.oracle.graal.python.lib.PyObjectIsTrueNode;
         import com.oracle.graal.python.lib.PyObjectLookupAttr;
         import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PNodeWithContext;
        @@ -84,8 +90,8 @@
         import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
         import com.oracle.graal.python.nodes.builtins.ListNodes;
         import com.oracle.graal.python.nodes.call.CallNode;
        -import com.oracle.graal.python.nodes.expression.CoerceToBooleanNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
        +import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        @@ -96,8 +102,9 @@
         import com.oracle.graal.python.nodes.object.SetDictNode;
         import com.oracle.graal.python.nodes.util.CannotCastException;
         import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
        +import com.oracle.graal.python.runtime.PythonContext;
         import com.oracle.graal.python.runtime.exception.PException;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
        @@ -110,6 +117,7 @@
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
         import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.profiles.InlinedBranchProfile;
         import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         import com.oracle.truffle.api.strings.TruffleString;
         
        @@ -124,9 +132,25 @@ protected List> getNodeFa
                 return ModuleBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___INIT__, minNumOfPositionalArgs = 2, declaresExplicitSelf = true, parameterNames = {"self", "name", "doc"})
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = J_MODULE, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
             @GenerateNodeFactory
        +    public abstract static class ModuleNewNode extends PythonBuiltinNode {
        +
        +        @Specialization
        +        @SuppressWarnings("unused")
        +        static Object doGeneric(Object cls, Object[] varargs, PKeyword[] kwargs,
        +                        @Bind("this") Node inliningTarget,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape) {
        +            return PFactory.createPythonModule(language, cls, getInstanceShape.execute(cls));
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_init, isComplex = true)
        +    @SlotSignature(name = "module", minNumOfPositionalArgs = 2, parameterNames = {"self", "name", "doc"})
             @ArgumentClinic(name = "name", conversion = ArgumentClinic.ClinicConversion.TString)
        +    @GenerateNodeFactory
             public abstract static class ModuleNode extends PythonClinicBuiltinNode {
                 @Override
                 protected ArgumentClinicProvider getArgumentClinic() {
        @@ -169,7 +193,7 @@ static Object dir(VirtualFrame frame, PythonModule self,
                                 @Cached ListNodes.ConstructListNode constructListNode,
                                 @Cached CallNode callNode,
                                 @Cached PyObjectLookupAttr lookup,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     Object dictObj = lookup.execute(frame, inliningTarget, self, T___DICT__);
                     if (dictObj instanceof PDict dict) {
                         Object dirFunc = pyDictGetItem.execute(frame, inliningTarget, dict, T___DIR__);
        @@ -179,7 +203,7 @@ static Object dir(VirtualFrame frame, PythonModule self,
                             return constructListNode.execute(frame, dict);
                         }
                     } else {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.IS_NOT_A_DICTIONARY, ".__dict__");
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.IS_NOT_A_DICTIONARY, ".__dict__");
                     }
                 }
             }
        @@ -192,11 +216,10 @@ public abstract static class ModuleDictNode extends PythonBinaryBuiltinNode {
                 static Object doManaged(PythonModule self, @SuppressWarnings("unused") PNone none,
                                 @Bind("this") Node inliningTarget,
                                 @Exclusive @Cached GetDictIfExistsNode getDict,
        -                        @Cached SetDictNode setDict,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Cached SetDictNode setDict) {
                     PDict dict = getDict.execute(self);
                     if (dict == null) {
        -                dict = createDict(inliningTarget, self, setDict, factory);
        +                dict = createDict(inliningTarget, self, setDict);
                     }
                     return dict;
                 }
        @@ -205,22 +228,22 @@ static Object doManaged(PythonModule self, @SuppressWarnings("unused") PNone non
                 static Object doNativeObject(PythonAbstractNativeObject self, @SuppressWarnings("unused") PNone none,
                                 @Bind("this") Node inliningTarget,
                                 @Exclusive @Cached GetDictIfExistsNode getDict,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     PDict dict = getDict.execute(self);
                     if (dict == null) {
        -                doError(self, none, raiseNode.get(inliningTarget));
        +                doError(self, none, raiseNode);
                     }
                     return dict;
                 }
         
                 @Fallback
                 static Object doError(Object self, @SuppressWarnings("unused") Object dict,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.DESCRIPTOR_DICT_FOR_MOD_OBJ_DOES_NOT_APPLY_FOR_P, self);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.DESCRIPTOR_DICT_FOR_MOD_OBJ_DOES_NOT_APPLY_FOR_P, self);
                 }
         
        -        private static PDict createDict(Node inliningTarget, PythonModule self, SetDictNode setDict, PythonObjectFactory factory) {
        -            PDict dict = factory.createDictFixedStorage(self);
        +        private static PDict createDict(Node inliningTarget, PythonModule self, SetDictNode setDict) {
        +            PDict dict = PFactory.createDictFixedStorage(PythonLanguage.get(inliningTarget), self);
                     setDict.execute(inliningTarget, self, dict);
                     return dict;
                 }
        @@ -228,7 +251,7 @@ private static PDict createDict(Node inliningTarget, PythonModule self, SetDictN
         
             @Slot(value = SlotKind.tp_getattro, isComplex = true)
             @GenerateNodeFactory
        -    public abstract static class ModuleGetattritbuteNode extends GetAttrBuiltinNode {
        +    public abstract static class ModuleGetattributeNode extends GetAttrBuiltinNode {
                 @Specialization
                 static Object getattributeStr(VirtualFrame frame, PythonModule self, TruffleString key,
                                 @Shared @Cached ObjectBuiltins.GetAttributeNode objectGetattrNode,
        @@ -269,9 +292,9 @@ static Object getattribute(VirtualFrame frame, PythonModule self, TruffleString
                                     @Cached ReadAttributeFromObjectNode readGetattr,
                                     @Cached InlinedConditionProfile customGetAttr,
                                     @Cached CallNode callNode,
        -                            @Cached CoerceToBooleanNode.YesNode castToBooleanNode,
        +                            @Cached PyObjectIsTrueNode castToBooleanNode,
                                     @Cached CastToTruffleStringNode castNameToStringNode,
        -                            @Cached PRaiseNode.Lazy raiseNode) {
        +                            @Cached PRaiseNode raiseNode) {
                         e.expect(inliningTarget, PythonBuiltinClassType.AttributeError, isAttrError);
                         Object getAttr = readGetattr.execute(self, T___GETATTR__);
                         if (customGetAttr.profile(inliningTarget, getAttr != PNone.NO_VALUE)) {
        @@ -288,21 +311,21 @@ static Object getattribute(VirtualFrame frame, PythonModule self, TruffleString
                                 Object moduleSpec = readGetattr.execute(self, T___SPEC__);
                                 if (moduleSpec != PNone.NO_VALUE) {
                                     Object isInitializing = readGetattr.execute(moduleSpec, T__INITIALIZING);
        -                            if (isInitializing != PNone.NO_VALUE && castToBooleanNode.executeBoolean(frame, inliningTarget, isInitializing)) {
        -                                throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.MODULE_PARTIALLY_INITIALIZED_S_HAS_NO_ATTR_S, moduleName, key);
        +                            if (isInitializing != PNone.NO_VALUE && castToBooleanNode.execute(frame, isInitializing)) {
        +                                throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.MODULE_PARTIALLY_INITIALIZED_S_HAS_NO_ATTR_S, moduleName, key);
                                     }
                                 }
        -                        throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.MODULE_S_HAS_NO_ATTR_S, moduleName, key);
        +                        throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.MODULE_S_HAS_NO_ATTR_S, moduleName, key);
                             }
        -                    throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.MODULE_HAS_NO_ATTR_S, key);
        +                    throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.MODULE_HAS_NO_ATTR_S, key);
                         }
                     }
                 }
         
                 @Specialization(guards = "!isPythonModule(self)")
                 static Object getattribute(Object self, @SuppressWarnings("unused") Object key,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, T___GETATTRIBUTE__, "module", self);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, T___GETATTRIBUTE__, "module", self);
                 }
             }
         
        @@ -314,10 +337,11 @@ static Object get(Object self, @SuppressWarnings("unused") Object value,
                                 @Bind("this") Node inliningTarget,
                                 @Shared("read") @Cached ReadAttributeFromObjectNode read,
                                 @Shared("write") @Cached WriteAttributeToObjectNode write,
        -                        @Cached PythonObjectFactory.Lazy factory) {
        +                        @Cached InlinedBranchProfile createAnnotations) {
                     Object annotations = read.execute(self, T___ANNOTATIONS__);
                     if (annotations == PNone.NO_VALUE) {
        -                annotations = factory.get(inliningTarget).createDict();
        +                createAnnotations.enter(inliningTarget);
        +                annotations = PFactory.createDict(PythonLanguage.get(inliningTarget));
                         write.execute(self, T___ANNOTATIONS__, annotations);
                     }
                     return annotations;
        @@ -328,10 +352,10 @@ static Object delete(Object self, @SuppressWarnings("unused") Object value,
                                 @Bind("this") Node inliningTarget,
                                 @Shared("read") @Cached ReadAttributeFromObjectNode read,
                                 @Shared("write") @Cached WriteAttributeToObjectNode write,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     Object annotations = read.execute(self, T___ANNOTATIONS__);
                     if (annotations == PNone.NO_VALUE) {
        -                throw raiseNode.get(inliningTarget).raise(AttributeError, new Object[]{T___ANNOTATIONS__});
        +                throw raiseNode.raise(inliningTarget, AttributeError, new Object[]{T___ANNOTATIONS__});
                     }
                     write.execute(self, T___ANNOTATIONS__, PNone.NO_VALUE);
                     return PNone.NONE;
        @@ -344,4 +368,19 @@ static Object set(Object self, Object value,
                     return PNone.NONE;
                 }
             }
        +
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
        +    @GenerateNodeFactory
        +    abstract static class ReprNode extends PythonUnaryBuiltinNode {
        +
        +        public static final TruffleString T__MODULE_REPR = tsLiteral("_module_repr");
        +
        +        @Specialization
        +        Object repr(VirtualFrame frame, Object self,
        +                        @Bind Node inliningTarget,
        +                        @Bind PythonContext context,
        +                        @Cached PyObjectCallMethodObjArgs callMethod) {
        +            return callMethod.execute(frame, inliningTarget, context.getImportlib(), T__MODULE_REPR, self);
        +        }
        +    }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/ModuleGetNameNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/ModuleGetNameNode.java
        index 547ad995af..88118ab53b 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/ModuleGetNameNode.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/ModuleGetNameNode.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -69,13 +69,13 @@ public abstract class ModuleGetNameNode extends Node {
             static TruffleString doPythonModule(Node inliningTarget, PythonModule module,
                             @Cached(inline = false) ReadAttributeFromObjectNode readNameNode,
                             @Cached CastToTruffleStringNode castToTruffleStringNode,
        -                    @Cached PRaiseNode.Lazy raiseNode) {
        +                    @Cached PRaiseNode raiseNode) {
         
                 try {
                     Object name = readNameNode.execute(module, SpecialAttributeNames.T___NAME__);
                     return castToTruffleStringNode.execute(inliningTarget, name);
                 } catch (CannotCastException e) {
        -            throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.SystemError, ErrorMessages.NAMELESS_MODULE);
        +            throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.SystemError, ErrorMessages.NAMELESS_MODULE);
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/PythonFrozenModule.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/PythonFrozenModule.java
        index fe76a33414..b20fc5df77 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/PythonFrozenModule.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/PythonFrozenModule.java
        @@ -47,6 +47,7 @@
         import java.io.IOException;
         import java.io.InputStream;
         
        +import com.oracle.graal.python.runtime.PythonOptions;
         import com.oracle.truffle.api.strings.TruffleString;
         
         public final class PythonFrozenModule {
        @@ -56,7 +57,7 @@ public final class PythonFrozenModule {
         
             private static byte[] getByteCode(String symbol) {
                 try {
        -            InputStream resourceAsStream = PythonFrozenModule.class.getResourceAsStream("Frozen" + symbol + ".bin");
        +            InputStream resourceAsStream = PythonFrozenModule.class.getResourceAsStream("Frozen" + symbol + "." + getSuffix());
                     if (resourceAsStream != null) {
                         return resourceAsStream.readAllBytes();
                     }
        @@ -66,6 +67,14 @@ private static byte[] getByteCode(String symbol) {
                 return null;
             }
         
        +    private static String getSuffix() {
        +        if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) {
        +            return "bin_dsl";
        +        } else {
        +            return "bin";
        +        }
        +    }
        +
             public PythonFrozenModule(String symbol, String originalName, boolean isPackage) {
                 this(toTruffleStringUncached(originalName), getByteCode(symbol), isPackage);
             }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/PythonModule.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/PythonModule.java
        index 8392d3ef94..ba26300675 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/PythonModule.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/PythonModule.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2017, 2024, Oracle and/or its affiliates.
        + * Copyright (c) 2017, 2025, Oracle and/or its affiliates.
          * Copyright (c) 2013, Regents of the University of California
          *
          * All rights reserved.
        @@ -41,7 +41,7 @@
         import com.oracle.graal.python.builtins.objects.object.PythonObject;
         import com.oracle.graal.python.nodes.PGuards;
         import com.oracle.graal.python.nodes.object.SetDictNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
         import com.oracle.truffle.api.object.Shape;
         import com.oracle.truffle.api.strings.TruffleString;
        @@ -55,6 +55,26 @@ public final class PythonModule extends PythonObject {
             private Object nativeModuleDef;
             private Object nativeModuleState;
         
        +    /**
        +     * Replicates the native references of this module's native state in Java.
        +     * 

        + * Since a module can have a native module state where it is valid to store native references to + * other objects, we need this field to replicate those references in Java if we make the handle + * table reference weak in order to break possible reference cycles. This field will ever only + * be set if the module's native definition provides a traverse function (see + * {@code moduleobject.c: module_traverse}). The condition for this is: + * + *

        +     * {@code
        +     * if (m -> md_def && m -> md_def -> m_traverse && (m -> md_def -> m_size <= 0 || m -> md_state != NULL)) {
        +     *     // ...
        +     * }
        +     * }
        +     * 
        + *

        + */ + private Object[] replicatedNativeReferences; + private PythonBuiltins builtins; private Object moduleState; @@ -89,9 +109,9 @@ private PythonModule(PythonLanguage lang, TruffleString moduleName) { */ @TruffleBoundary public static PythonModule createInternal(TruffleString moduleName) { - PythonObjectFactory factory = PythonObjectFactory.getUncached(); - PythonModule pythonModule = new PythonModule(PythonLanguage.get(null), moduleName); - PDict dict = factory.createDictFixedStorage(pythonModule); + PythonLanguage language = PythonLanguage.get(null); + PythonModule pythonModule = new PythonModule(language, moduleName); + PDict dict = PFactory.createDictFixedStorage(language, pythonModule); SetDictNode.executeUncached(pythonModule, dict); return pythonModule; } @@ -134,4 +154,14 @@ public void setNativeModuleState(Object nativeModuleState) { this.nativeModuleState = nativeModuleState; } + /** + * For a description, see {@link #replicatedNativeReferences}. + */ + public void setReplicatedNativeReferences(Object[] replicatedNativeReferences) { + this.replicatedNativeReferences = replicatedNativeReferences; + } + + public Object[] getReplicatedNativeReferences() { + return this.replicatedNativeReferences; + } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/namespace/SimpleNamespaceBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/namespace/SimpleNamespaceBuiltins.java index 8a2222ac7c..025c028c77 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/namespace/SimpleNamespaceBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/namespace/SimpleNamespaceBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,10 +42,7 @@ import static com.oracle.graal.python.nodes.ErrorMessages.NO_POSITIONAL_ARGUMENTS_EXPECTED; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___DICT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REPR__; import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA_SPACE; import static com.oracle.graal.python.nodes.StringLiterals.T_EQ; @@ -58,9 +55,12 @@ import java.util.Comparator; import java.util.List; -import com.oracle.graal.python.nodes.attributes.WriteAttributeToPythonObjectNode; import org.graalvm.collections.Pair; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -78,13 +78,16 @@ import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.str.StringUtils; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare.RichCmpBuiltinNode; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.attributes.WriteAttributeToPythonObjectNode; import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassExactProfile; @@ -94,7 +97,7 @@ import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -111,19 +114,36 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PSimpleNamespace) public final class SimpleNamespaceBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = SimpleNamespaceBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return SimpleNamespaceBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "SimpleNamespace", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class SimpleNamespaceNode extends PythonVarargsBuiltinNode { + @Specialization + static PSimpleNamespace doit(Object cls, @SuppressWarnings("unused") Object[] args, @SuppressWarnings("unused") PKeyword[] keywords, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createSimpleNamespace(language, cls, getInstanceShape.execute(cls)); + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory protected abstract static class SimpleNamespaceInitNode extends PythonVarargsBuiltinNode { @Specialization - Object init(PSimpleNamespace self, Object[] args, PKeyword[] kwargs, - @Cached WriteAttributeToPythonObjectNode writeAttrNode) { + static Object init(PSimpleNamespace self, Object[] args, PKeyword[] kwargs, + @Bind("this") Node inliningTarget, + @Cached WriteAttributeToPythonObjectNode writeAttrNode, + @Cached PRaiseNode raiseNode) { if (args.length > 0) { - throw raise(PythonBuiltinClassType.TypeError, NO_POSITIONAL_ARGUMENTS_EXPECTED); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, NO_POSITIONAL_ARGUMENTS_EXPECTED); } for (PKeyword keyword : kwargs) { writeAttrNode.execute(self, keyword.getName(), keyword.getValue()); @@ -143,20 +163,20 @@ Object getDict(PSimpleNamespace self, } } - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.tp_richcompare, isComplex = true) @GenerateNodeFactory - public abstract static class SimpleNamespaceEqNode extends PythonBinaryBuiltinNode { + public abstract static class SimpleNamespaceEqNode extends RichCmpBuiltinNode { @Specialization - static Object eq(VirtualFrame frame, PSimpleNamespace self, PSimpleNamespace other, + static Object eq(VirtualFrame frame, PSimpleNamespace self, PSimpleNamespace other, RichCmpOp op, @Bind("this") Node inliningTarget, @Cached GetOrCreateDictNode getDict, @Cached DictBuiltins.EqNode eqNode) { - return eqNode.execute(frame, getDict.execute(inliningTarget, self), getDict.execute(inliningTarget, other)); + return eqNode.execute(frame, getDict.execute(inliningTarget, self), getDict.execute(inliningTarget, other), op); } @Fallback @SuppressWarnings("unused") - static PNotImplemented doGeneric(Object self, Object other) { + static PNotImplemented doGeneric(Object self, Object other, RichCmpOp op) { return PNotImplemented.NOT_IMPLEMENTED; } } @@ -169,14 +189,14 @@ static Object reduce(PSimpleNamespace self, @Bind("this") Node inliningTarget, @Cached GetClassNode getClassNode, @Cached GetOrCreateDictNode getDict, - @Cached PythonObjectFactory factory) { - PTuple args = factory.createEmptyTuple(); + @Bind PythonLanguage language) { + PTuple args = PFactory.createEmptyTuple(language); final PDict dict = getDict.execute(inliningTarget, self); - return factory.createTuple(new Object[]{getClassNode.execute(inliningTarget, self), args, dict}); + return PFactory.createTuple(language, new Object[]{getClassNode.execute(inliningTarget, self), args, dict}); } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class SimpleNamespaceReprNode extends PythonUnaryBuiltinNode { private static final TruffleString T_RECURSE = tsLiteral("...)"); @@ -232,7 +252,7 @@ protected static TruffleString getReprString(Node inliningTarget, Object obj, try { return castStr.execute(inliningTarget, reprObj); } catch (CannotCastException e) { - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.RETURNED_NON_STRING, "__repr__", reprObj); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.RETURNED_NON_STRING, "__repr__", reprObj); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/ObjectBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/ObjectBuiltins.java index a516a2fbb9..b8e6894e9a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/ObjectBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/ObjectBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -26,6 +26,8 @@ package com.oracle.graal.python.builtins.objects.object; +import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_OBJECT_NEW; +import static com.oracle.graal.python.nodes.BuiltinNames.J_OBJECT; import static com.oracle.graal.python.nodes.PGuards.isDeleteMarker; import static com.oracle.graal.python.nodes.PGuards.isDict; import static com.oracle.graal.python.nodes.PGuards.isNoValue; @@ -33,30 +35,23 @@ import static com.oracle.graal.python.nodes.PGuards.isPythonObject; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___CLASS__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___DICT__; +import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___ABSTRACTMETHODS__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___CLASS__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DICT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DIR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FORMAT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GETSTATE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT_SUBCLASS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NE__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE_EX__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SIZEOF__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SUBCLASSHOOK__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___TRUFFLE_RICHCOMPARE__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T_JOIN; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T_SORT; import static com.oracle.graal.python.nodes.SpecialMethodNames.T_UPDATE; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LEN__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REDUCE__; +import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA_SPACE; import static com.oracle.graal.python.nodes.StringLiterals.T_NONE; import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; @@ -64,33 +59,42 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.modules.BuiltinConstructorsFactory; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; +import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; +import com.oracle.graal.python.builtins.objects.cext.structs.CFields; +import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.getsetdescriptor.DescriptorBuiltins.DescrDeleteNode; import com.oracle.graal.python.builtins.objects.getsetdescriptor.DescriptorBuiltins.DescrGetNode; import com.oracle.graal.python.builtins.objects.getsetdescriptor.DescriptorBuiltins.DescrSetNode; import com.oracle.graal.python.builtins.objects.getsetdescriptor.DescriptorDeleteMarker; +import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; import com.oracle.graal.python.builtins.objects.object.ObjectBuiltinsClinicProviders.FormatNodeClinicProviderGen; import com.oracle.graal.python.builtins.objects.object.ObjectBuiltinsClinicProviders.ReduceExNodeClinicProviderGen; -import com.oracle.graal.python.builtins.objects.object.ObjectBuiltinsFactory.GetAttributeNodeFactory; import com.oracle.graal.python.builtins.objects.object.ObjectBuiltinsFactory.DictNodeFactory; +import com.oracle.graal.python.builtins.objects.object.ObjectBuiltinsFactory.GetAttributeNodeFactory; import com.oracle.graal.python.builtins.objects.set.PSet; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; +import com.oracle.graal.python.builtins.objects.type.TypeFlags; import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.TypeNodes.CheckCompatibleForAssigmentNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetBaseClassNode; @@ -98,35 +102,37 @@ import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.CallSlotDescrGet; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrSet; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotGetAttr.GetAttrBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.HashBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRepr.CallSlotReprNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSetAttr.SetAttrBuiltinNode; +import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; +import com.oracle.graal.python.lib.PyObjectIsTrueNode; import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.lib.PyObjectSizeNode; +import com.oracle.graal.python.lib.PyObjectStrAsObjectNode; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.HiddenAttr; import com.oracle.graal.python.nodes.PGuards; +import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.PRaiseNode.Lazy; import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode; +import com.oracle.graal.python.nodes.builtins.ListNodes; import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; -import com.oracle.graal.python.nodes.expression.BinaryComparisonNode; -import com.oracle.graal.python.nodes.expression.BinaryComparisonNodeFactory; -import com.oracle.graal.python.nodes.expression.CoerceToBooleanNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassExactProfile; +import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassProfile; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsOtherBuiltinClassProfile; import com.oracle.graal.python.nodes.object.DeleteDictNode; import com.oracle.graal.python.nodes.object.GetClassNode; @@ -135,8 +141,8 @@ import com.oracle.graal.python.nodes.object.SetDictNode; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.nodes.util.SplitArgsNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; @@ -147,6 +153,8 @@ import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.Idempotent; import com.oracle.truffle.api.dsl.ImportStatic; @@ -155,7 +163,6 @@ import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.nodes.UnexpectedResultException; import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.strings.TruffleString; @@ -180,63 +187,193 @@ static Object getClass(Object self, @SuppressWarnings("unused") PNone value, return getClassNode.execute(inliningTarget, self); } - @Specialization(guards = "isNativeClass(klass)") - static Object setClass(@SuppressWarnings("unused") Object self, @SuppressWarnings("unused") Object klass, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CLASS_ASSIGNMENT_ONLY_SUPPORTED_FOR_HEAP_TYPES_OR_MODTYPE_SUBCLASSES); - } - - @Specialization(guards = "isPythonClass(value) || isPythonBuiltinClassType(value)") - static PNone setClass(VirtualFrame frame, PythonObject self, Object value, + @Specialization(guards = "!isNoValue(value)") + static PNone setClass(VirtualFrame frame, Object self, Object value, @Bind("this") Node inliningTarget, - @Cached HiddenAttr.WriteNode writeHiddenAttrNode, - @Cached IsOtherBuiltinClassProfile classProfile1, - @Cached IsOtherBuiltinClassProfile classProfile2, + @Cached TypeNodes.IsTypeNode isTypeNode, + @Cached IsBuiltinClassProfile isModuleProfile, + @Cached TypeNodes.GetTypeFlagsNode getTypeFlagsNode, @Cached CheckCompatibleForAssigmentNode checkCompatibleForAssigmentNode, @Exclusive @Cached GetClassNode getClassNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Cached SetClassNode setClassNode, + @Cached PRaiseNode raiseNode) { + if (!isTypeNode.execute(inliningTarget, value)) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CLASS_MUST_BE_SET_TO_CLASS, value); + } Object type = getClassNode.execute(inliningTarget, self); - if (isBuiltinClassNotModule(inliningTarget, value, classProfile1) || PGuards.isNativeClass(value) || isBuiltinClassNotModule(inliningTarget, type, classProfile2) || - PGuards.isNativeClass(type)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CLASS_ASSIGNMENT_ONLY_SUPPORTED_FOR_HEAP_TYPES_OR_MODTYPE_SUBCLASSES); + boolean bothModuleSubtypes = isModuleProfile.profileClass(inliningTarget, type, PythonBuiltinClassType.PythonModule) && + isModuleProfile.profileClass(inliningTarget, value, PythonBuiltinClassType.PythonModule); + boolean bothMutable = (getTypeFlagsNode.execute(type) & TypeFlags.IMMUTABLETYPE) == 0 && (getTypeFlagsNode.execute(value) & TypeFlags.IMMUTABLETYPE) == 0; + if (!bothModuleSubtypes && !bothMutable) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CLASS_ASSIGNMENT_ONLY_SUPPORTED_FOR_HEAP_TYPES_OR_MODTYPE_SUBCLASSES); } checkCompatibleForAssigmentNode.execute(frame, type, value); - writeHiddenAttrNode.execute(inliningTarget, self, HiddenAttr.CLASS, value); + setClassNode.execute(inliningTarget, self, value); + return PNone.NONE; } - private static boolean isBuiltinClassNotModule(Node inliningTarget, Object type, IsOtherBuiltinClassProfile classProfile) { - return classProfile.profileIsOtherBuiltinClass(inliningTarget, type, PythonBuiltinClassType.PythonModule); - } + @GenerateInline + @GenerateCached(false) + abstract static class SetClassNode extends Node { + public abstract void execute(Node inliningTarget, Object self, Object newClass); - @Specialization(guards = {"isPythonClass(value) || isPythonBuiltinClassType(value)", "!isPythonObject(self)"}) - static Object getClass(@SuppressWarnings("unused") Object self, @SuppressWarnings("unused") Object value, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CLASS_ASSIGNMENT_ONLY_SUPPORTED_FOR_HEAP_TYPES_OR_MODTYPE_SUBCLASSES); - } + @Specialization + static void doPythonObject(Node inliningTarget, PythonObject self, Object newClass, + @Cached HiddenAttr.WriteNode writeHiddenAttrNode) { + writeHiddenAttrNode.execute(inliningTarget, self, HiddenAttr.CLASS, newClass); + } - @Fallback - static Object getClassError(@SuppressWarnings("unused") Object self, Object value, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CLASS_MUST_BE_SET_TO_CLASS, value); + @Specialization + static void doNative(PythonAbstractNativeObject self, Object newClass, + @Cached(inline = false) CStructAccess.WriteObjectNewRefNode writeObjectNewRefNode) { + writeObjectNewRefNode.writeToObject(self, CFields.PyObject__ob_type, newClass); + } } } - @Builtin(name = J___INIT__, takesVarArgs = true, minNumOfPositionalArgs = 1, takesVarKeywordArgs = true) + // object() + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_OBJECT, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory - @ImportStatic(SpecialMethodSlot.class) - public abstract static class InitNode extends PythonVarargsBuiltinNode { - @Child private SplitArgsNode splitArgsNode; + public abstract static class ObjectNode extends PythonVarargsBuiltinNode { + + @Child private ReportAbstractClassNode reportAbstractClassNode; + + @GenerateInline(false) // Used lazily + abstract static class ReportAbstractClassNode extends PNodeWithContext { + public abstract PException execute(VirtualFrame frame, Object type); + + @Specialization + static PException report(VirtualFrame frame, Object type, + @Bind("this") Node inliningTarget, + @Cached PyObjectCallMethodObjArgs callSort, + @Cached PyObjectCallMethodObjArgs callJoin, + @Cached PyObjectSizeNode sizeNode, + @Cached ReadAttributeFromObjectNode readAttributeFromObjectNode, + @Cached CastToTruffleStringNode cast, + @Cached ListNodes.ConstructListNode constructListNode, + @Cached PRaiseNode raiseNode) { + PList list = constructListNode.execute(frame, readAttributeFromObjectNode.execute(type, T___ABSTRACTMETHODS__)); + int methodCount = sizeNode.execute(frame, inliningTarget, list); + callSort.execute(frame, inliningTarget, list, T_SORT); + TruffleString joined = cast.execute(inliningTarget, callJoin.execute(frame, inliningTarget, T_COMMA_SPACE, T_JOIN, list)); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANT_INSTANTIATE_ABSTRACT_CLASS_WITH_ABSTRACT_METHODS, type, methodCount > 1 ? "s" : "", joined); + } + } - @Override - public final Object varArgExecute(VirtualFrame frame, @SuppressWarnings("unused") Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported { - if (splitArgsNode == null) { + @GenerateInline + @GenerateCached(false) + abstract static class CheckExcessArgsNode extends Node { + abstract void execute(Node inliningTarget, Object type, Object[] args, PKeyword[] kwargs); + + @Specialization(guards = {"args.length == 0", "kwargs.length == 0"}) + @SuppressWarnings("unused") + static void doNothing(Object type, Object[] args, PKeyword[] kwargs) { + } + + @Fallback + @SuppressWarnings("unused") + static void check(Node inliningTarget, Object type, Object[] args, PKeyword[] kwargs, + @Cached GetCachedTpSlotsNode getSlots, + @Cached PRaiseNode raiseNode) { + TpSlots slots = getSlots.execute(inliningTarget, type); + if (slots.tp_new() != SLOTS.tp_new()) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.NEW_TAKES_ONE_ARG); + } + if (slots.tp_init() == SLOTS.tp_init()) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.NEW_TAKES_NO_ARGS, type); + } + } + } + + @Specialization(guards = {"!self.needsNativeAllocation()"}) + Object doManagedObject(VirtualFrame frame, PythonManagedClass self, Object[] varargs, PKeyword[] kwargs, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Shared @Cached CheckExcessArgsNode checkExcessArgsNode, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) { + checkExcessArgsNode.execute(inliningTarget, self, varargs, kwargs); + if (self.isAbstractClass()) { + throw reportAbstractClass(frame, self); + } + return PFactory.createPythonObject(language, self, getInstanceShape.execute(self)); + } + + @Specialization + static Object doBuiltinTypeType(PythonBuiltinClassType self, Object[] varargs, PKeyword[] kwargs, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Shared @Cached CheckExcessArgsNode checkExcessArgsNode, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) { + checkExcessArgsNode.execute(inliningTarget, self, varargs, kwargs); + return PFactory.createPythonObject(language, self, getInstanceShape.execute(self)); + } + + @Specialization(guards = "self.needsNativeAllocation()") + @SuppressWarnings("truffle-static-method") + @InliningCutoff + Object doNativeObjectIndirect(VirtualFrame frame, PythonManagedClass self, Object[] varargs, PKeyword[] kwargs, + @Bind("this") Node inliningTarget, + @Shared @Cached CheckExcessArgsNode checkExcessArgsNode, + @Shared @Cached CallNativeGenericNewNode callNativeGenericNewNode) { + checkExcessArgsNode.execute(inliningTarget, self, varargs, kwargs); + if (self.isAbstractClass()) { + throw reportAbstractClass(frame, self); + } + return callNativeGenericNewNode.execute(inliningTarget, self); + } + + @Specialization(guards = "isNativeClass(self)") + @SuppressWarnings("truffle-static-method") + @InliningCutoff + Object doNativeObjectDirect(VirtualFrame frame, Object self, Object[] varargs, PKeyword[] kwargs, + @Bind("this") Node inliningTarget, + @Shared @Cached CheckExcessArgsNode checkExcessArgsNode, + @Exclusive @Cached TypeNodes.GetTypeFlagsNode getTypeFlagsNode, + @Shared @Cached CallNativeGenericNewNode callNativeGenericNewNode) { + checkExcessArgsNode.execute(inliningTarget, self, varargs, kwargs); + if ((getTypeFlagsNode.execute(self) & TypeFlags.IS_ABSTRACT) != 0) { + throw reportAbstractClass(frame, self); + } + return callNativeGenericNewNode.execute(inliningTarget, self); + } + + @GenerateInline + @GenerateCached(false) + protected abstract static class CallNativeGenericNewNode extends Node { + abstract Object execute(Node inliningTarget, Object cls); + + @Specialization + static Object call(Object cls, + @Cached(inline = false) CApiTransitions.PythonToNativeNode toNativeNode, + @Cached(inline = false) CApiTransitions.NativeToPythonTransferNode toPythonNode, + @Cached(inline = false) CExtNodes.PCallCapiFunction callCapiFunction) { + return toPythonNode.execute(callCapiFunction.call(FUN_PY_OBJECT_NEW, toNativeNode.execute(cls))); + } + } + + @SuppressWarnings("unused") + @Fallback + Object fallback(Object o, Object[] varargs, PKeyword[] kwargs) { + throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "object.__new__(X): X", o); + } + + @InliningCutoff + private PException reportAbstractClass(VirtualFrame frame, Object type) { + if (reportAbstractClassNode == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); - splitArgsNode = insert(SplitArgsNode.create()); + reportAbstractClassNode = insert(ObjectBuiltinsFactory.ObjectNodeFactory.ReportAbstractClassNodeGen.create()); } - return execute(frame, arguments[0], splitArgsNode.executeCached(arguments), keywords); + return reportAbstractClassNode.execute(frame, type); } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(takesVarArgs = true, minNumOfPositionalArgs = 1, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class InitNode extends PythonVarargsBuiltinNode { @Specialization(guards = {"arguments.length == 0", "keywords.length == 0"}) @SuppressWarnings("unused") @@ -249,46 +386,45 @@ static PNone initNoArgs(Object self, Object[] arguments, PKeyword[] keywords) { static PNone init(Object self, Object[] arguments, PKeyword[] keywords, @Bind("this") Node inliningTarget, @Cached GetClassNode getClassNode, - @Cached(parameters = "Init") LookupCallableSlotInMRONode lookupInit, - @Cached(parameters = "New") LookupCallableSlotInMRONode lookupNew, - @Cached TypeNodes.CheckCallableIsSpecificBuiltinNode checkSlotIs, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached GetCachedTpSlotsNode getSlots, + @Cached PRaiseNode raiseNode) { if (arguments.length != 0 || keywords.length != 0) { Object type = getClassNode.execute(inliningTarget, self); - if (!checkSlotIs.execute(inliningTarget, lookupInit.execute(type), ObjectBuiltinsFactory.InitNodeFactory.getInstance())) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.INIT_TAKES_ONE_ARG_OBJECT); + TpSlots slots = getSlots.execute(inliningTarget, type); + if (slots.tp_init() != SLOTS.tp_init()) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.INIT_TAKES_ONE_ARG_OBJECT); } - if (checkSlotIs.execute(inliningTarget, lookupNew.execute(type), BuiltinConstructorsFactory.ObjectNodeFactory.getInstance())) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.INIT_TAKES_ONE_ARG, type); + if (slots.tp_new() == SLOTS.tp_new()) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.INIT_TAKES_ONE_ARG, type); } } return PNone.NONE; } } - @Builtin(name = J___HASH__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_hash, isComplex = true) @GenerateNodeFactory - public abstract static class HashNode extends PythonUnaryBuiltinNode { + public abstract static class HashNode extends HashBuiltinNode { @Specialization - public int hash(PythonBuiltinClassType self) { + public long hash(PythonBuiltinClassType self) { return hash(getContext().lookupType(self)); } @TruffleBoundary @Specialization(guards = "!isPythonBuiltinClassType(self)") - public static int hash(Object self) { + public static long hash(Object self) { return self.hashCode(); } } - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.tp_richcompare, isComplex = true) @GenerateNodeFactory - public abstract static class EqNode extends PythonBinaryBuiltinNode { - @Specialization - static Object eq(Object self, Object other, + public abstract static class EqNode extends TpSlotRichCompare.RichCmpBuiltinNode { + @Specialization(guards = "op.isEq()") + static Object eq(Object self, Object other, RichCmpOp op, @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile isEq, + @Exclusive @Cached InlinedConditionProfile isEq, @Cached IsNode isNode) { if (isEq.profile(inliningTarget, isNode.execute(self, other))) { return true; @@ -298,50 +434,51 @@ static Object eq(Object self, Object other, return PNotImplemented.NOT_IMPLEMENTED; } } - } - @Builtin(name = J___NE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - @ImportStatic(SpecialMethodSlot.class) - public abstract static class NeNode extends PythonBinaryBuiltinNode { - - @Specialization - static Object doGeneric(VirtualFrame frame, Object self, Object other, + @Specialization(guards = "op.isNe()") + static Object ne(VirtualFrame frame, Object self, Object other, RichCmpOp op, @Bind("this") Node inliningTarget, - @Cached(parameters = "Eq") LookupAndCallBinaryNode eqNode, - @Cached("createIfFalseNode()") CoerceToBooleanNode ifFalseNode) { - Object result = eqNode.executeObject(frame, self, other); - if (result == PNotImplemented.NOT_IMPLEMENTED) { - return result; + @Exclusive @Cached InlinedConditionProfile isEq, + @Cached GetObjectSlotsNode getSlotsNode, + @Cached TpSlotRichCompare.CallSlotRichCmpNode callSlotRichCmp, + @Cached PyObjectIsTrueNode isTrueNode) { + // By default, __ne__() delegates to __eq__() and inverts the result, unless the latter + // returns NotImplemented + TpSlot selfRichCmp = getSlotsNode.execute(inliningTarget, self).tp_richcmp(); + if (selfRichCmp == null) { + return PNotImplemented.NOT_IMPLEMENTED; } - return ifFalseNode.executeBoolean(frame, inliningTarget, result); + Object result = callSlotRichCmp.execute(frame, inliningTarget, selfRichCmp, self, other, RichCmpOp.Py_EQ); + if (result != PNotImplemented.NOT_IMPLEMENTED) { + return !isTrueNode.execute(frame, result); + } + return PNotImplemented.NOT_IMPLEMENTED; } - } - @Builtin(name = J___LT__, minNumOfPositionalArgs = 2) - @Builtin(name = J___LE__, minNumOfPositionalArgs = 2) - @Builtin(name = J___GT__, minNumOfPositionalArgs = 2) - @Builtin(name = J___GE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class LtLeGtGeNode extends PythonBinaryBuiltinNode { - @Specialization - @SuppressWarnings("unused") - static Object notImplemented(Object self, Object other) { + @Fallback + static Object doOthers(Object self, Object other, RichCmpOp op) { return PNotImplemented.NOT_IMPLEMENTED; } } - @Builtin(name = J___STR__, minNumOfPositionalArgs = 1, doc = "Return str(self).") + @Slot(value = SlotKind.tp_str, isComplex = true) @GenerateNodeFactory abstract static class StrNode extends PythonUnaryBuiltinNode { @Specialization static Object str(VirtualFrame frame, Object self, - @Cached("create(Repr)") LookupAndCallUnaryNode reprNode) { - return reprNode.executeObject(frame, self); + @Bind Node inliningTarget, + @Cached GetObjectSlotsNode getSlots, + @Cached CallSlotReprNode callSlot, + @Cached ObjectNodes.DefaultObjectReprNode defaultRepr) { + TpSlots slots = getSlots.execute(inliningTarget, self); + if (slots.tp_repr() != null) { + return callSlot.execute(frame, inliningTarget, slots.tp_repr(), self); + } + return defaultRepr.execute(frame, inliningTarget, self); } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @@ -385,7 +522,7 @@ Object doItTruffleString(VirtualFrame frame, Object object, @SuppressWarnings("u @Exclusive @Cached GetClassNode getClassNode, @Exclusive @Cached GetObjectSlotsNode getSlotsNode, @Cached("create(cachedKey)") LookupAttributeInMRONode lookup, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { Object type = getClassNode.execute(inliningTarget, object); Object descr = lookup.execute(type); return fullLookup(frame, inliningTarget, object, cachedKey, type, descr, getSlotsNode, raiseNode); @@ -399,12 +536,12 @@ Object doIt(VirtualFrame frame, Object object, Object keyObj, @Exclusive @Cached GetClassNode getClassNode, @Exclusive @Cached GetObjectSlotsNode getSlotsNode, @Cached CastToTruffleStringNode castKeyToStringNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { TruffleString key; try { key = castKeyToStringNode.execute(inliningTarget, keyObj); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_NAME_MUST_BE_STRING, keyObj); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_NAME_MUST_BE_STRING, keyObj); } Object type = getClassNode.execute(inliningTarget, object); @@ -412,7 +549,7 @@ Object doIt(VirtualFrame frame, Object object, Object keyObj, return fullLookup(frame, inliningTarget, object, key, type, descr, getSlotsNode, raiseNode); } - private Object fullLookup(VirtualFrame frame, Node inliningTarget, Object object, TruffleString key, Object type, Object descr, GetObjectSlotsNode getSlotsNode, Lazy raiseNode) { + private Object fullLookup(VirtualFrame frame, Node inliningTarget, Object object, TruffleString key, Object type, Object descr, GetObjectSlotsNode getSlotsNode, PRaiseNode raiseNode) { boolean hasDescr = descr != PNone.NO_VALUE; if (hasDescr && (profileFlags & HAS_DESCR) == 0) { CompilerDirectives.transferToInterpreterAndInvalidate(); @@ -446,7 +583,7 @@ private Object fullLookup(VirtualFrame frame, Node inliningTarget, Object object return dispatch(frame, object, type, descr, descrGetSlot); } } - throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, object, key); + throw raiseNode.raiseAttributeError(inliningTarget, object, key); } private Object readAttribute(Object object, TruffleString key) { @@ -598,8 +735,8 @@ private static Object getDescrFromBuiltinBase(Node inliningTarget, Object type, @Specialization(guards = {"!isNoValue(mapping)", "!isDict(mapping)", "!isDeleteMarker(mapping)"}) static Object dict(@SuppressWarnings("unused") Object self, Object mapping, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, mapping); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, mapping); } @Specialization(guards = "isFallback(self, mapping, inliningTarget, getClassNode, otherBuiltinClassProfile, isBuiltinClassProfile)", limit = "1") @@ -608,9 +745,8 @@ static Object raise(Object self, Object mapping, @Bind("this") Node inliningTarget, @Exclusive @Cached IsOtherBuiltinClassProfile otherBuiltinClassProfile, @Exclusive @Cached IsBuiltinClassExactProfile isBuiltinClassProfile, - @Exclusive @Cached GetClassNode getClassNode, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, self, "__dict__"); + @Exclusive @Cached GetClassNode getClassNode) { + throw PRaiseNode.raiseStatic(inliningTarget, AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, self, "__dict__"); } static boolean isFallback(Object self, Object mapping, Node inliningTarget, @@ -642,60 +778,15 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(guards = "!formatString.isEmpty()") static Object format(Object self, @SuppressWarnings("unused") TruffleString formatString, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.UNSUPPORTED_FORMAT_STRING_PASSED_TO_P_FORMAT, self); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.UNSUPPORTED_FORMAT_STRING_PASSED_TO_P_FORMAT, self); } @Specialization(guards = "formatString.isEmpty()") static Object format(VirtualFrame frame, Object self, @SuppressWarnings("unused") TruffleString formatString, - @Cached("create(Str)") LookupAndCallUnaryNode strCall) { - return strCall.executeObject(frame, self); - } - } - - @Builtin(name = J___TRUFFLE_RICHCOMPARE__, minNumOfPositionalArgs = 3) - @GenerateNodeFactory - abstract static class RichCompareNode extends PythonTernaryBuiltinNode { - protected static final int NO_SLOW_PATH = Integer.MAX_VALUE; - @CompilationFinal private boolean seenNonBoolean = false; - - static BinaryComparisonNode createOp(int op) { - switch (op) { - case 0: - return BinaryComparisonNodeFactory.LtNodeGen.create(); - case 4: - return BinaryComparisonNodeFactory.GtNodeGen.create(); - case 2: - return BinaryComparisonNodeFactory.EqNodeGen.create(); - case 5: - return BinaryComparisonNodeFactory.GeNodeGen.create(); - case 1: - return BinaryComparisonNodeFactory.LeNodeGen.create(); - case 3: - return BinaryComparisonNodeFactory.NeNodeGen.create(); - default: - throw new RuntimeException("unexpected operation: " + op); - } - } - - @Specialization(guards = "op == cachedOp", limit = "NO_SLOW_PATH") - @SuppressWarnings("truffle-static-method") - boolean richcmp(VirtualFrame frame, Object left, Object right, @SuppressWarnings("unused") int op, - @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached("op") int cachedOp, - @Cached("createOp(op)") BinaryComparisonNode node, - @Cached CoerceToBooleanNode.YesNode castToBooleanNode) { - if (!seenNonBoolean) { - try { - return node.executeBool(frame, left, right); - } catch (UnexpectedResultException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - seenNonBoolean = true; - return castToBooleanNode.executeBoolean(frame, inliningTarget, e.getResult()); - } - } else { - return castToBooleanNode.executeBoolean(frame, inliningTarget, node.executeObject(frame, left, right)); - } + @Bind Node inliningTarget, + @Cached PyObjectStrAsObjectNode str) { + return str.execute(frame, inliningTarget, self); } } @@ -717,10 +808,6 @@ static Object notImplemented(Object self, Object[] arguments, PKeyword[] keyword return PNotImplemented.NOT_IMPLEMENTED; } - @Override - public Object varArgExecute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported { - return PNotImplemented.NOT_IMPLEMENTED; - } } @Builtin(name = J___SIZEOF__, minNumOfPositionalArgs = 1) @@ -806,11 +893,11 @@ static Object dir(VirtualFrame frame, Object obj, @Cached GetClassNode getClassNode, @Cached IsSubtypeNode isSubtypeNode, @Cached com.oracle.graal.python.builtins.objects.type.TypeBuiltins.DirNode dirNode, - @Cached PythonObjectFactory factory) { - PSet names = factory.createSet(); + @Bind PythonLanguage language) { + PSet names = PFactory.createSet(language); Object updateCallable = lookupAttrNode.execute(frame, inliningTarget, names, T_UPDATE); Object ns = lookupAttrNode.execute(frame, inliningTarget, obj, T___DICT__); - if (isSubtypeNode.execute(frame, getClassNode.execute(inliningTarget, ns), PythonBuiltinClassType.PDict)) { + if (isSubtypeNode.execute(getClassNode.execute(inliningTarget, ns), PythonBuiltinClassType.PDict)) { callNode.execute(frame, updateCallable, ns); } Object klass = lookupAttrNode.execute(frame, inliningTarget, obj, T___CLASS__); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/ObjectNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/ObjectNodes.java index 0deaee0ff2..983c513996 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/ObjectNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/ObjectNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -107,6 +107,8 @@ import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrSet.CallSlotDescrSet; @@ -140,7 +142,7 @@ import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.object.IDUtils; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.Assumption; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; @@ -329,8 +331,8 @@ static Object id(boolean self, @Specialization static Object id(double self, - @Shared @Cached PythonObjectFactory factory) { - return IDUtils.getId(self, factory); + @Bind PythonLanguage language) { + return IDUtils.getId(language, self); } @Specialization @@ -342,8 +344,8 @@ static Object id(PFloat self, @Specialization static Object id(long self, - @Shared @Cached PythonObjectFactory factory) { - return IDUtils.getId(self, factory); + @Bind PythonLanguage language) { + return IDUtils.getId(language, self); } @Specialization @@ -461,14 +463,14 @@ static Pair doNewArgsEx(VirtualFrame frame, Object getNewArgsExA @Cached SequenceStorageNodes.GetItemNode getItemNode, @Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode, @Cached PyObjectSizeNode sizeNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { Object newargs = callNode.execute(frame, getNewArgsExAttr); if (!tupleCheckNode.execute(inliningTarget, newargs)) { - throw raiseNode.get(inliningTarget).raise(TypeError, SHOULD_RETURN_TYPE_A_NOT_TYPE_B, T___GETNEWARGS_EX__, "tuple", newargs); + throw raiseNode.raise(inliningTarget, TypeError, SHOULD_RETURN_TYPE_A_NOT_TYPE_B, T___GETNEWARGS_EX__, "tuple", newargs); } int length = sizeNode.execute(frame, inliningTarget, newargs); if (length != 2) { - throw raiseNode.get(inliningTarget).raise(ValueError, SHOULD_RETURN_A_NOT_B, T___GETNEWARGS_EX__, "tuple of length 2", length); + throw raiseNode.raise(inliningTarget, ValueError, SHOULD_RETURN_A_NOT_B, T___GETNEWARGS_EX__, "tuple of length 2", length); } SequenceStorage sequenceStorage = getSequenceStorageNode.execute(inliningTarget, newargs); @@ -476,10 +478,10 @@ static Pair doNewArgsEx(VirtualFrame frame, Object getNewArgsExA Object kwargs = getItemNode.execute(sequenceStorage, 1); if (!tupleCheckNode.execute(inliningTarget, args)) { - throw raiseNode.get(inliningTarget).raise(TypeError, MUST_BE_TYPE_A_NOT_TYPE_B, "first item of the tuple returned by __getnewargs_ex__", "tuple", args); + throw raiseNode.raise(inliningTarget, TypeError, MUST_BE_TYPE_A_NOT_TYPE_B, "first item of the tuple returned by __getnewargs_ex__", "tuple", args); } if (!isDictSubClassNode.execute(inliningTarget, kwargs)) { - throw raiseNode.get(inliningTarget).raise(TypeError, MUST_BE_TYPE_A_NOT_TYPE_B, "second item of the tuple returned by __getnewargs_ex__", "dict", kwargs); + throw raiseNode.raise(inliningTarget, TypeError, MUST_BE_TYPE_A_NOT_TYPE_B, "second item of the tuple returned by __getnewargs_ex__", "dict", kwargs); } return Pair.create(args, kwargs); @@ -490,10 +492,10 @@ static Pair doNewArgs(VirtualFrame frame, @SuppressWarnings("unu @Bind("this") Node inliningTarget, @Exclusive @Cached CallNode callNode, @Exclusive @Cached PyTupleCheckNode tupleCheckNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { Object args = callNode.execute(frame, getNewArgsAttr); if (!tupleCheckNode.execute(inliningTarget, args)) { - throw raiseNode.get(inliningTarget).raise(TypeError, SHOULD_RETURN_TYPE_A_NOT_TYPE_B, T___GETNEWARGS__, "tuple", args); + throw raiseNode.raise(inliningTarget, TypeError, SHOULD_RETURN_TYPE_A_NOT_TYPE_B, T___GETNEWARGS__, "tuple", args); } return Pair.create(args, PNone.NONE); } @@ -519,7 +521,7 @@ static Object[] getstate(VirtualFrame frame, Node inliningTarget, Object type, @Cached SequenceStorageNodes.ToArrayNode toArrayNode, @Cached PyImportImport importNode, @Cached PyObjectCallMethodObjArgs callMethod, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object slotnames = read.execute(type, T___SLOTNAMES__); boolean hadCachedSlotnames = false; if (slotnames != PNone.NO_VALUE) { @@ -533,9 +535,9 @@ static Object[] getstate(VirtualFrame frame, Node inliningTarget, Object type, } else if (slotnames == PNone.NONE) { return EMPTY_OBJECT_ARRAY; } else if (hadCachedSlotnames) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.COPYREG_SLOTNAMES_DIDN_T_RETURN_A_LIST_OR_NONE); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.COPYREG_SLOTNAMES_DIDN_T_RETURN_A_LIST_OR_NONE); } else { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.N_SLOTNAMES_SHOULD_BE_A_LIST_OR_NONE_NOT_P, type, slotnames); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.N_SLOTNAMES_SHOULD_BE_A_LIST_OR_NONE_NOT_P, type, slotnames); } } } @@ -556,12 +558,11 @@ static Object getstate(VirtualFrame frame, Node inliningTarget, Object obj, bool @Cached PyObjectLookupAttrO lookupAttr, @Cached HashingStorageSetItem setHashingStorageItem, @Cached CheckBasesizeForGetState checkBasesize, - @Cached PythonObjectFactory.Lazy factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object state; Object type = getClassNode.execute(inliningTarget, obj); if (required && getItemsizeNode.execute(inliningTarget, type) != 0) { - throw raiseNode.get(inliningTarget).raise(TypeError, CANNOT_PICKLE_OBJECT_TYPE, obj); + throw raiseNode.raise(inliningTarget, TypeError, CANNOT_PICKLE_OBJECT_TYPE, obj); } Object dict = lookupAttr.execute(frame, inliningTarget, obj, T___DICT__); @@ -574,7 +575,7 @@ static Object getstate(VirtualFrame frame, Node inliningTarget, Object obj, bool Object[] slotnames = getSlotNamesNode.execute(frame, inliningTarget, type); if (required && !checkBasesize.execute(inliningTarget, obj, type, slotnames.length)) { - throw raiseNode.get(inliningTarget).raise(TypeError, CANNOT_PICKLE_OBJECT_TYPE, obj); + throw raiseNode.raise(inliningTarget, TypeError, CANNOT_PICKLE_OBJECT_TYPE, obj); } if (slotnames.length > 0) { @@ -592,8 +593,9 @@ static Object getstate(VirtualFrame frame, Node inliningTarget, Object obj, bool * If we found some slot attributes, pack them in a tuple along the original * attribute dictionary. */ - PDict slotsState = factory.get(inliningTarget).createDict(slotsStorage); - state = factory.get(inliningTarget).createTuple(new Object[]{state, slotsState}); + PythonLanguage language = PythonLanguage.get(inliningTarget); + PDict slotsState = PFactory.createDict(language, slotsStorage); + state = PFactory.createTuple(language, new Object[]{state, slotsState}); } } @@ -662,7 +664,7 @@ abstract static class CommonReduceNode extends PNodeWithContext { @Specialization(guards = "proto >= 2") static Object reduceNewObj(VirtualFrame frame, Node inliningTarget, Object obj, @SuppressWarnings("unused") int proto, @Cached GetClassNode getClassNode, - @Cached(value = "create(T___NEW__)", inline = false) LookupAttributeInMRONode lookupNew, + @Cached GetCachedTpSlotsNode getSlots, @Cached PyObjectLookupAttr lookupAttr, @Exclusive @Cached PyImportImport importNode, @Cached InlinedConditionProfile newObjProfile, @@ -675,11 +677,12 @@ static Object reduceNewObj(VirtualFrame frame, Node inliningTarget, Object obj, @Cached PyObjectSizeNode sizeNode, @Exclusive @Cached PyObjectCallMethodObjArgs callMethod, @Cached PyObjectGetIter getIter, - @Cached(inline = false) PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { Object cls = getClassNode.execute(inliningTarget, obj); - if (lookupNew.execute(cls) == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(TypeError, CANNOT_PICKLE_OBJECT_TYPE, obj); + TpSlots slots = getSlots.execute(inliningTarget, cls); + if (slots.tp_new() == null) { + throw raiseNode.raise(inliningTarget, TypeError, CANNOT_PICKLE_OBJECT_TYPE, obj); } Pair rv = getNewArgsNode.execute(frame, obj); @@ -703,12 +706,12 @@ static Object reduceNewObj(VirtualFrame frame, Node inliningTarget, Object obj, } else { newargsVals = new Object[]{cls}; } - newargs = factory.createTuple(newargsVals); + newargs = PFactory.createTuple(language, newargsVals); } else if (hasArgsProfile.profile(inliningTarget, hasargs)) { newobj = lookupAttr.execute(frame, inliningTarget, copyReg, T___NEWOBJ_EX__); - newargs = factory.createTuple(new Object[]{cls, args, kwargs}); + newargs = PFactory.createTuple(language, new Object[]{cls, args, kwargs}); } else { - throw raiseNode.get(inliningTarget).raiseBadInternalCall(); + throw raiseNode.raiseBadInternalCall(inliningTarget); } boolean objIsList = isSubClassNode.executeWith(frame, cls, PythonBuiltinClassType.PList); @@ -719,7 +722,7 @@ static Object reduceNewObj(VirtualFrame frame, Node inliningTarget, Object obj, Object listitems = objIsList ? getIter.execute(frame, inliningTarget, obj) : PNone.NONE; Object dictitems = objIsDict ? getIter.execute(frame, inliningTarget, callMethod.execute(frame, inliningTarget, obj, T_ITEMS)) : PNone.NONE; - return factory.createTuple(new Object[]{newobj, newargs, state, listitems, dictitems}); + return PFactory.createTuple(language, new Object[]{newobj, newargs, state, listitems, dictitems}); } @Specialization(guards = "proto < 2") @@ -847,7 +850,7 @@ static void doStringKey(Node inliningTarget, VirtualFrame frame, Object object, @Shared @Cached(inline = false) LookupAttributeInMRONode.Dynamic getExisting, @Shared @Cached(inline = false) ReadAttributeFromObjectNode attrRead, @Shared @Cached InlinedBranchProfile deleteNonExistingBranchProfile, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { setAttr(inliningTarget, frame, object, key, value, writeNode, getClassNode, hasDescriptor, getDescrSlotsNode, callSetNode, getExisting, attrRead, deleteNonExistingBranchProfile, raiseNode); @@ -864,18 +867,18 @@ static void doGeneric(Node inliningTarget, VirtualFrame frame, Object object, Ob @Shared @Cached(inline = false) LookupAttributeInMRONode.Dynamic getExisting, @Shared @Cached(inline = false) ReadAttributeFromObjectNode attrRead, @Shared @Cached InlinedBranchProfile deleteNonExistingBranchProfile, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { TruffleString key = castAttributeKey(inliningTarget, keyObject, castKeyToStringNode, raiseNode); setAttr(inliningTarget, frame, object, key, value, writeNode, getClassNode, hasDescriptor, getDescrSlotsNode, callSetNode, getExisting, attrRead, deleteNonExistingBranchProfile, raiseNode); } - public static TruffleString castAttributeKey(Node inliningTarget, Object keyObject, CastToTruffleStringNode castKeyToStringNode, PRaiseNode.Lazy raiseNode) { + public static TruffleString castAttributeKey(Node inliningTarget, Object keyObject, CastToTruffleStringNode castKeyToStringNode, PRaiseNode raiseNode) { try { return castKeyToStringNode.execute(inliningTarget, keyObject); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ATTR_NAME_MUST_BE_STRING, keyObject); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ATTR_NAME_MUST_BE_STRING, keyObject); } } @@ -884,7 +887,7 @@ private static void setAttr(Node inliningTarget, VirtualFrame frame, Object obje InlinedConditionProfile hasDescriptor, GetObjectSlotsNode getDescrSlotsNode, CallSlotDescrSet callSetNode, LookupAttributeInMRONode.Dynamic getExisting, ReadAttributeFromObjectNode attrRead, InlinedBranchProfile deleteNonExistingBranchProfile, - PRaiseNode.Lazy raiseNode) { + PRaiseNode raiseNode) { Object type = getClassNode.execute(inliningTarget, object); Object descr = getExisting.execute(type, key); if (hasDescriptor.profile(inliningTarget, !PGuards.isNoValue(descr))) { @@ -912,9 +915,9 @@ private static void setAttr(Node inliningTarget, VirtualFrame frame, Object obje } if (descr != PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.ATTR_S_READONLY, key); + throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.ATTR_S_READONLY, key); } else { - throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.HAS_NO_ATTR, object, key); + throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.HAS_NO_ATTR, object, key); } } @@ -959,8 +962,8 @@ static void doIt(Node inliningTarget, VirtualFrame frame, Object object, Truffle } if (isDeleteProfile.profile(inliningTarget, value == PNone.NO_VALUE)) { - Object found = delHashingStorageItem.executePop(frame, inliningTarget, dict.getDictStorage(), key, dict); - if (found == null) { + boolean found = delHashingStorageItem.execute(frame, inliningTarget, dict.getDictStorage(), key, dict); + if (!found) { raiseAttributeError(object, key, raiseAttributeErrorNode, type); } } else { @@ -987,18 +990,14 @@ public abstract static class RaiseAttributeErrorNode extends Node { static void doIt(Object object, Object key, Object type, @Bind("this") Node inliningTarget, @Cached PRaiseNode raiseNode, - @Cached IsSubtypeNode isSubtypeNode, - @Cached TypeNodes.GetNameNode getTypeName) { + @Cached IsSubtypeNode isSubtypeNode) { TruffleString message; - Object firstArg; if (isSubtypeNode.execute(type, PythonBuiltinClassType.PythonClass)) { - message = ErrorMessages.TYPE_S_HAS_NO_ATTR; - firstArg = getTypeName.execute(inliningTarget, object); + message = ErrorMessages.TYPE_N_HAS_NO_ATTR; } else { message = ErrorMessages.HAS_NO_ATTR; - firstArg = object; } - raiseNode.raise(PythonBuiltinClassType.AttributeError, message, firstArg, key); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.AttributeError, message, object, key); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/PythonObject.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/PythonObject.java index a0383d1ea6..b2366ab49d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/PythonObject.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/PythonObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -72,8 +72,6 @@ public class PythonObject extends PythonAbstractObject { private final Object initialPythonClass; - private Object[] hpyData; - @SuppressWarnings("this-escape") // escapes in the assertion public PythonObject(Object pythonClass, Shape instanceShape) { super(instanceShape); @@ -158,12 +156,4 @@ public String toString() { public static int getCallSiteInlineCacheMaxDepth() { return PythonOptions.getCallSiteInlineCacheMaxDepth(); } - - public final Object[] getHPyData() { - return hpyData; - } - - public final void setHPyData(Object[] hpyFields) { - this.hpyData = hpyFields; - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictBuiltins.java index 8aeb81c88c..a129279d04 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,18 +46,8 @@ import static com.oracle.graal.python.nodes.SpecialMethodNames.J_ITEMS; import static com.oracle.graal.python.nodes.SpecialMethodNames.J_KEYS; import static com.oracle.graal.python.nodes.SpecialMethodNames.J_VALUES; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DELITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REVERSED__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETITEM__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SIZEOF__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T_ITEMS; import static com.oracle.graal.python.nodes.StringLiterals.T_ELLIPSIS; @@ -68,7 +58,11 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -81,7 +75,11 @@ import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.ordereddict.POrderedDict.ODictNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotMpAssSubscript.MpAssSubscriptBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare.RichCmpBuiltinNode; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.lib.PyObjectDelItem; import com.oracle.graal.python.lib.PyObjectGetItem; @@ -92,6 +90,7 @@ import com.oracle.graal.python.lib.PyObjectRichCompareBool; import com.oracle.graal.python.lib.PyObjectSetItem; import com.oracle.graal.python.lib.PySequenceContainsNode; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.builtins.ListNodes; @@ -108,7 +107,7 @@ import com.oracle.graal.python.nodes.object.GetOrCreateDictNode; import com.oracle.graal.python.nodes.object.SetDictNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -128,12 +127,15 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.POrderedDict) public class OrderedDictBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = OrderedDictBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return OrderedDictBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @Builtin(name = "update", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory abstract static class InitNode extends PythonBuiltinNode { @@ -141,25 +143,25 @@ abstract static class InitNode extends PythonBuiltinNode { static PNone update(VirtualFrame frame, PDict self, Object[] args, PKeyword[] kwargs, @Bind("this") Node inliningTarget, @Cached UpdateFromArgsNode update, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object mapping = PNone.NO_VALUE; if (args.length == 1) { mapping = args[0]; } else if (args.length > 1) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.EXPECTED_AT_MOST_D_ARGS_GOT_D, 1, args.length); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.EXPECTED_AT_MOST_D_ARGS_GOT_D, 1, args.length); } update.execute(frame, inliningTarget, self, mapping, kwargs); return PNone.NONE; } } - @Builtin(name = J___SETITEM__, minNumOfPositionalArgs = 3) + @Slot(value = SlotKind.mp_ass_subscript, isComplex = true) @GenerateNodeFactory - abstract static class SetItemNode extends PythonTernaryBuiltinNode { - @Specialization - static PNone setitem(VirtualFrame frame, POrderedDict self, Object key, Object value, + abstract static class SetItemNode extends MpAssSubscriptBuiltinNode { + @Specialization(guards = "!isNoValue(value)") + static void setitem(VirtualFrame frame, POrderedDict self, Object key, Object value, @Bind("this") Node inliningTarget, - @Cached PyObjectHashNode hashNode, + @Shared @Cached PyObjectHashNode hashNode, @Cached HashingStorageNodes.HashingStorageSetItemWithHash setItemWithHash, @Cached InlinedBranchProfile storageUpdated, @Cached ObjectHashMap.GetNode getNode, @@ -175,29 +177,23 @@ static PNone setitem(VirtualFrame frame, POrderedDict self, Object key, Object v self.append(node); putNode.put(frame, inliningTarget, self.nodes, key, hash, node); } - return PNone.NONE; } - } - @Builtin(name = J___DELITEM__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class DelItemNode extends PythonBinaryBuiltinNode { - @Specialization - static PNone delitem(VirtualFrame frame, POrderedDict self, Object key, + @Specialization(guards = "isNoValue(value)") + static void delitem(VirtualFrame frame, POrderedDict self, Object key, @SuppressWarnings("unused") Object value, @Bind("this") Node inliningTarget, - @Cached PyObjectHashNode hashNode, + @Shared @Cached PyObjectHashNode hashNode, @Cached HashingStorageNodes.HashingStorageDelItem delItem, @Cached ObjectHashMap.RemoveNode removeNode, @Cached PRaiseNode raiseNode) { long hash = hashNode.execute(frame, inliningTarget, key); ODictNode node = (ODictNode) removeNode.execute(frame, inliningTarget, self.nodes, key, hash); if (node == null) { - throw raiseNode.raise(KeyError, new Object[]{key}); + throw raiseNode.raise(inliningTarget, KeyError, new Object[]{key}); } self.remove(node); // TODO with hash delItem.execute(frame, inliningTarget, self.getDictStorage(), key, self); - return PNone.NONE; } } @@ -240,10 +236,9 @@ static void update(VirtualFrame frame, Node inliningTarget, Object self, Object } } - @Builtin(name = J___OR__, minNumOfPositionalArgs = 2) - @Builtin(name = J___ROR__, minNumOfPositionalArgs = 2, reverseOperation = true) + @Slot(value = SlotKind.nb_or, isComplex = true) @GenerateNodeFactory - abstract static class OrNode extends PythonBinaryBuiltinNode { + abstract static class OrNode extends BinaryOpBuiltinNode { @Specialization static Object or(VirtualFrame frame, POrderedDict left, PDict right, @Bind("this") Node inliningTarget, @@ -273,7 +268,7 @@ static Object or(Object self, Object other) { } } - @Builtin(name = J___IOR__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.nb_inplace_or, isComplex = true) @GenerateNodeFactory abstract static class IOrNode extends PythonBinaryBuiltinNode { @Specialization @@ -295,14 +290,14 @@ static Object reduce(VirtualFrame frame, POrderedDict self, @Cached PyObjectGetStateNode getStateNode, @Cached PyObjectCallMethodObjArgs callMethod, @Cached PyObjectGetIter getIter, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { Object type = getClassNode.execute(inliningTarget, self); Object state = getStateNode.execute(frame, inliningTarget, self); - Object args = factory.createEmptyTuple(); + Object args = PFactory.createEmptyTuple(language); // Might be overridden Object items = callMethod.execute(frame, inliningTarget, self, T_ITEMS); Object itemsIter = getIter.execute(frame, inliningTarget, items); - return factory.createTuple(new Object[]{type, args, state, PNone.NONE, itemsIter}); + return PFactory.createTuple(language, new Object[]{type, args, state, PNone.NONE, itemsIter}); } } @@ -340,7 +335,7 @@ static Object pop(VirtualFrame frame, POrderedDict self, Object key, Object defa @Cached PySequenceContainsNode containsNode, @Cached PyObjectGetItem getItem, @Cached PyObjectDelItem delItem, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { // XXX the CPython implementation is weird when self is a subclass if (containsNode.execute(frame, inliningTarget, self, key)) { Object value = getItem.execute(frame, inliningTarget, self, key); @@ -349,7 +344,7 @@ static Object pop(VirtualFrame frame, POrderedDict self, Object key, Object defa } else if (defaultValue != PNone.NO_VALUE) { return defaultValue; } else { - throw raiseNode.get(inliningTarget).raise(KeyError, new Object[]{key}); + throw raiseNode.raise(inliningTarget, KeyError, new Object[]{key}); } } } @@ -363,17 +358,17 @@ static Object popitem(VirtualFrame frame, POrderedDict self, boolean last, @Bind("this") Node inliningTarget, @Cached HashingStorageNodes.HashingStorageDelItem delItem, @Cached ObjectHashMap.RemoveNode removeNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raise) { + @Bind PythonLanguage language, + @Cached PRaiseNode raise) { ODictNode node = last ? self.last : self.first; if (node == null) { - throw raise.get(inliningTarget).raise(KeyError, ErrorMessages.IS_EMPTY, "dictionary"); + throw raise.raise(inliningTarget, KeyError, ErrorMessages.IS_EMPTY, "dictionary"); } self.remove(node); removeNode.execute(frame, inliningTarget, self.nodes, node.key, node.hash); // TODO with hash Object value = delItem.executePop(frame, inliningTarget, self.getDictStorage(), node.key, self); - return factory.createTuple(new Object[]{node.key, value}); + return PFactory.createTuple(language, new Object[]{node.key, value}); } @Override @@ -422,13 +417,13 @@ static PNone move(VirtualFrame frame, POrderedDict self, Object key, boolean las @Cached PRaiseNode raiseNode) { if (self.first == null) { // Empty - throw raiseNode.raise(KeyError, new Object[]{key}); + throw raiseNode.raise(inliningTarget, KeyError, new Object[]{key}); } if ((last ? self.last : self.first).key != key) { long hash = hashNode.execute(frame, inliningTarget, key); ODictNode node = (ODictNode) getNode.execute(frame, inliningTarget, self.nodes, key, hash); if (node == null) { - throw raiseNode.raise(KeyError, new Object[]{key}); + throw raiseNode.raise(inliningTarget, KeyError, new Object[]{key}); } if (last) { if (self.last != node) { @@ -456,8 +451,8 @@ protected ArgumentClinicProvider getArgumentClinic() { abstract static class KeysNode extends PythonUnaryBuiltinNode { @Specialization static Object keys(POrderedDict self, - @Cached PythonObjectFactory factory) { - return factory.createOrderedDictKeys(self); + @Bind PythonLanguage language) { + return PFactory.createOrderedDictKeys(language, self); } } @@ -466,8 +461,8 @@ static Object keys(POrderedDict self, abstract static class ValuesNode extends PythonUnaryBuiltinNode { @Specialization static Object values(POrderedDict self, - @Cached PythonObjectFactory factory) { - return factory.createOrderedDictValues(self); + @Bind PythonLanguage language) { + return PFactory.createOrderedDictValues(language, self); } } @@ -476,18 +471,18 @@ static Object values(POrderedDict self, abstract static class ItemsNode extends PythonUnaryBuiltinNode { @Specialization static Object items(POrderedDict self, - @Cached PythonObjectFactory factory) { - return factory.createOrderedDictItems(self); + @Bind PythonLanguage language) { + return PFactory.createOrderedDictItems(language, self); } } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory abstract static class IterNode extends PythonUnaryBuiltinNode { @Specialization static Object iter(POrderedDict self, - @Cached PythonObjectFactory factory) { - return factory.createOrderedDictIterator(self, POrderedDictIterator.IteratorType.KEYS, false); + @Bind PythonLanguage language) { + return PFactory.createOrderedDictIterator(language, self, POrderedDictIterator.IteratorType.KEYS, false); } } @@ -496,12 +491,12 @@ static Object iter(POrderedDict self, abstract static class ReversedNode extends PythonUnaryBuiltinNode { @Specialization static Object iter(POrderedDict self, - @Cached PythonObjectFactory factory) { - return factory.createOrderedDictIterator(self, POrderedDictIterator.IteratorType.KEYS, true); + @Bind PythonLanguage language) { + return PFactory.createOrderedDictIterator(language, self, POrderedDictIterator.IteratorType.KEYS, true); } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization @@ -548,7 +543,7 @@ abstract static class EqHelperNode extends Node { @Specialization static boolean cmp(VirtualFrame frame, Node inliningTarget, POrderedDict self, POrderedDict other, @Cached HashingStorageNodes.HashingStorageGetItemWithHash getItem, - @Cached PyObjectRichCompareBool.EqNode eqNode) { + @Cached PyObjectRichCompareBool eqNode) { ODictNode lnode = self.first; ODictNode rnode = other.first; do { @@ -558,12 +553,12 @@ static boolean cmp(VirtualFrame frame, Node inliningTarget, POrderedDict self, P if (lnode == null || rnode == null) { return false; } - if (!eqNode.compare(frame, inliningTarget, lnode.key, rnode.key)) { + if (!eqNode.executeEq(frame, inliningTarget, lnode.key, rnode.key)) { return false; } Object lvalue = getItem.execute(frame, inliningTarget, self.getDictStorage(), lnode.key, lnode.hash); Object rvalue = getItem.execute(frame, inliningTarget, other.getDictStorage(), rnode.key, rnode.hash); - if (!eqNode.compare(frame, inliningTarget, lvalue, rvalue)) { + if (!eqNode.executeEq(frame, inliningTarget, lvalue, rvalue)) { return false; } lnode = lnode.next; @@ -578,36 +573,19 @@ static boolean cmp(VirtualFrame frame, Node inliningTarget, POrderedDict self, P } } - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.tp_richcompare, isComplex = true) @GenerateNodeFactory - abstract static class EqNode extends PythonBinaryBuiltinNode { - @Specialization - static boolean cmp(VirtualFrame frame, POrderedDict self, PDict other, + abstract static class EqNode extends RichCmpBuiltinNode { + @Specialization(guards = "op.isEqOrNe()") + static boolean cmp(VirtualFrame frame, POrderedDict self, PDict other, RichCmpOp op, @Bind("this") Node inliningTarget, @Cached EqHelperNode eqHelperNode) { - return eqHelperNode.execute(frame, inliningTarget, self, other); + return eqHelperNode.execute(frame, inliningTarget, self, other) == op.isEq(); } @Fallback @SuppressWarnings("unused") - static Object cmp(Object self, Object other) { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - - @Builtin(name = J___NE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class NeNode extends PythonBinaryBuiltinNode { - @Specialization - static boolean cmp(VirtualFrame frame, POrderedDict self, PDict other, - @Bind("this") Node inliningTarget, - @Cached EqHelperNode eqHelperNode) { - return !eqHelperNode.execute(frame, inliningTarget, self, other); - } - - @Fallback - @SuppressWarnings("unused") - static Object cmp(Object self, Object other) { + static Object cmp(Object self, Object other, RichCmpOp op) { return PNotImplemented.NOT_IMPLEMENTED; } } @@ -632,8 +610,8 @@ static Object dict(Object self, @SuppressWarnings("unused") PNone mapping, @Specialization(guards = {"!isNoValue(mapping)", "!isDict(mapping)"}) static PNone dict(@SuppressWarnings("unused") Object self, Object mapping, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, mapping); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, mapping); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictItemsBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictItemsBuiltins.java index e789b2024d..51eb883711 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictItemsBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictItemsBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,38 +40,44 @@ */ package com.oracle.graal.python.builtins.objects.ordereddict; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REVERSED__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.dict.PDictView.PDictItemsView; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.dsl.Cached; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; @CoreFunctions(extendClasses = PythonBuiltinClassType.POrderedDictItems) public class OrderedDictItemsBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = OrderedDictItemsBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return OrderedDictItemsBuiltinsFactory.getFactories(); } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory abstract static class IterNode extends PythonUnaryBuiltinNode { @Specialization static Object iter(PDictItemsView self, - @Cached PythonObjectFactory factory) { - return factory.createOrderedDictIterator((POrderedDict) self.getWrappedDict(), POrderedDictIterator.IteratorType.ITEMS, false); + @Bind PythonLanguage language) { + return PFactory.createOrderedDictIterator(language, (POrderedDict) self.getWrappedDict(), POrderedDictIterator.IteratorType.ITEMS, false); } } @@ -80,8 +86,8 @@ static Object iter(PDictItemsView self, abstract static class ReversedNode extends PythonUnaryBuiltinNode { @Specialization static Object iter(PDictItemsView self, - @Cached PythonObjectFactory factory) { - return factory.createOrderedDictIterator((POrderedDict) self.getWrappedDict(), POrderedDictIterator.IteratorType.ITEMS, true); + @Bind PythonLanguage language) { + return PFactory.createOrderedDictIterator(language, (POrderedDict) self.getWrappedDict(), POrderedDictIterator.IteratorType.ITEMS, true); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictIteratorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictIteratorBuiltins.java index 0ea2b63941..6cabab4c6f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictIteratorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictIteratorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,14 +42,14 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.KeyError; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.RuntimeError; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.StopIteration; import static com.oracle.graal.python.nodes.BuiltinNames.T_ITER; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -57,6 +57,8 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes; import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; @@ -64,7 +66,7 @@ import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -75,12 +77,15 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.POrderedDictIterator) public class OrderedDictIteratorBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = OrderedDictIteratorBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return OrderedDictIteratorBuiltinsFactory.getFactories(); } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory abstract static class IterNode extends PythonUnaryBuiltinNode { @Specialization @@ -89,20 +94,19 @@ static Object iter(POrderedDictIterator self) { } } - @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iternext, isComplex = true) @GenerateNodeFactory - abstract static class NextNode extends PythonUnaryBuiltinNode { + abstract static class NextNode extends TpIterNextBuiltin { @Specialization static Object next(VirtualFrame frame, POrderedDictIterator self, @Bind("this") Node inliningTarget, @Cached PRaiseNode raiseNode, - @Cached HashingStorageNodes.HashingStorageGetItemWithHash getItem, - @Cached PythonObjectFactory factory) { + @Cached HashingStorageNodes.HashingStorageGetItemWithHash getItem) { if (self.current == null) { - throw raiseNode.raise(StopIteration); + throw iteratorExhausted(); } if (self.size != self.dict.nodes.size()) { - throw raiseNode.raise(RuntimeError, ErrorMessages.CHANGED_SIZE_DURING_ITERATION, "OrderedDict"); + throw raiseNode.raise(inliningTarget, RuntimeError, ErrorMessages.CHANGED_SIZE_DURING_ITERATION, "OrderedDict"); } Object result; Object key = self.current.key; @@ -111,12 +115,12 @@ static Object next(VirtualFrame frame, POrderedDictIterator self, } else { Object value = getItem.execute(frame, inliningTarget, self.dict.getDictStorage(), key, self.current.hash); if (value == null) { - throw raiseNode.raise(KeyError, new Object[]{key}); + throw raiseNode.raise(inliningTarget, KeyError, new Object[]{key}); } if (self.type == POrderedDictIterator.IteratorType.VALUES) { result = value; } else { - result = factory.createTuple(new Object[]{key, value}); + result = PFactory.createTuple(PythonLanguage.get(inliningTarget), new Object[]{key, value}); } } if (!self.reversed) { @@ -135,16 +139,16 @@ abstract static class ReduceNode extends PythonUnaryBuiltinNode { static Object reduce(VirtualFrame frame, POrderedDictIterator self, @Bind("this") Node inliningTarget, @Cached PyObjectGetAttr getAttr, - @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached ListNodes.ConstructListNode constructListNode) { PythonContext context = PythonContext.get(inliningTarget); Object iterBuiltin = getAttr.execute(frame, inliningTarget, context.getBuiltins(), T_ITER); - POrderedDictIterator copy = factory.createOrderedDictIterator(self.dict, self.type, self.reversed); + POrderedDictIterator copy = PFactory.createOrderedDictIterator(language, self.dict, self.type, self.reversed); copy.current = self.current; /* iterate the temporary into a list */ PList list = constructListNode.execute(frame, copy); - PTuple args = factory.createTuple(new Object[]{list}); - return factory.createTuple(new Object[]{iterBuiltin, args}); + PTuple args = PFactory.createTuple(language, new Object[]{list}); + return PFactory.createTuple(language, new Object[]{iterBuiltin, args}); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictKeysBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictKeysBuiltins.java index b394891511..be0eb506e2 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictKeysBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictKeysBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,38 +40,44 @@ */ package com.oracle.graal.python.builtins.objects.ordereddict; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REVERSED__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.dict.PDictView.PDictKeysView; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.dsl.Cached; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; @CoreFunctions(extendClasses = PythonBuiltinClassType.POrderedDictKeys) public class OrderedDictKeysBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = OrderedDictKeysBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return OrderedDictKeysBuiltinsFactory.getFactories(); } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory abstract static class IterNode extends PythonUnaryBuiltinNode { @Specialization static Object iter(PDictKeysView self, - @Cached PythonObjectFactory factory) { - return factory.createOrderedDictIterator((POrderedDict) self.getWrappedDict(), POrderedDictIterator.IteratorType.KEYS, false); + @Bind PythonLanguage language) { + return PFactory.createOrderedDictIterator(language, (POrderedDict) self.getWrappedDict(), POrderedDictIterator.IteratorType.KEYS, false); } } @@ -80,8 +86,8 @@ static Object iter(PDictKeysView self, abstract static class ReversedNode extends PythonUnaryBuiltinNode { @Specialization static Object iter(PDictKeysView self, - @Cached PythonObjectFactory factory) { - return factory.createOrderedDictIterator((POrderedDict) self.getWrappedDict(), POrderedDictIterator.IteratorType.KEYS, true); + @Bind PythonLanguage language) { + return PFactory.createOrderedDictIterator(language, (POrderedDict) self.getWrappedDict(), POrderedDictIterator.IteratorType.KEYS, true); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictValuesBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictValuesBuiltins.java index 66b74ea5b8..8c5699fa6e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictValuesBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ordereddict/OrderedDictValuesBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,38 +40,44 @@ */ package com.oracle.graal.python.builtins.objects.ordereddict; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REVERSED__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.dict.PDictView.PDictValuesView; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.dsl.Cached; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; @CoreFunctions(extendClasses = PythonBuiltinClassType.POrderedDictValues) public class OrderedDictValuesBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = OrderedDictValuesBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return OrderedDictValuesBuiltinsFactory.getFactories(); } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory abstract static class IterNode extends PythonUnaryBuiltinNode { @Specialization static Object iter(PDictValuesView self, - @Cached PythonObjectFactory factory) { - return factory.createOrderedDictIterator((POrderedDict) self.getWrappedDict(), POrderedDictIterator.IteratorType.VALUES, false); + @Bind PythonLanguage language) { + return PFactory.createOrderedDictIterator(language, (POrderedDict) self.getWrappedDict(), POrderedDictIterator.IteratorType.VALUES, false); } } @@ -80,8 +86,8 @@ static Object iter(PDictValuesView self, abstract static class ReversedNode extends PythonUnaryBuiltinNode { @Specialization static Object iter(PDictValuesView self, - @Cached PythonObjectFactory factory) { - return factory.createOrderedDictIterator((POrderedDict) self.getWrappedDict(), POrderedDictIterator.IteratorType.VALUES, true); + @Bind PythonLanguage language) { + return PFactory.createOrderedDictIterator(language, (POrderedDict) self.getWrappedDict(), POrderedDictIterator.IteratorType.VALUES, true); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/posix/DirEntryBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/posix/DirEntryBuiltins.java index b56730346a..ab0bc89d7c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/posix/DirEntryBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/posix/DirEntryBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,7 +43,6 @@ import static com.oracle.graal.python.builtins.modules.PosixModuleBuiltins.opaquePathToBytes; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CLASS_GETITEM__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FSPATH__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.runtime.PosixConstants.AT_FDCWD; import static com.oracle.graal.python.runtime.PosixConstants.DT_DIR; import static com.oracle.graal.python.runtime.PosixConstants.DT_LNK; @@ -56,8 +55,11 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -69,19 +71,19 @@ import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum; import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode; import com.oracle.graal.python.nodes.PConstructAndRaiseNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.PosixSupport; import com.oracle.graal.python.runtime.PosixSupportLibrary; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; @@ -100,6 +102,8 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PDirEntry) public final class DirEntryBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = DirEntryBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return DirEntryBuiltinsFactory.getFactories(); @@ -109,17 +113,17 @@ protected List> getNodeFa @GenerateNodeFactory abstract static class NameNode extends PythonUnaryBuiltinNode { @Specialization - Object nameAsBytes(VirtualFrame frame, PDirEntry self, + static Object nameAsBytes(VirtualFrame frame, PDirEntry self, @Bind("this") Node inliningTarget, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached InlinedConditionProfile produceBytesProfile, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { if (produceBytesProfile.profile(inliningTarget, self.produceBytes())) { - return opaquePathToBytes(posixLib.dirEntryGetName(getPosixSupport(), self.dirEntryData), posixLib, getPosixSupport(), factory); + return opaquePathToBytes(posixLib.dirEntryGetName(context.getPosixSupport(), self.dirEntryData), posixLib, context.getPosixSupport(), context.getLanguage(inliningTarget)); } else { - return posixLib.getPathAsString(getPosixSupport(), posixLib.dirEntryGetName(getPosixSupport(), self.dirEntryData)); + return posixLib.getPathAsString(context.getPosixSupport(), posixLib.dirEntryGetName(context.getPosixSupport(), self.dirEntryData)); } } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); @@ -127,17 +131,16 @@ Object nameAsBytes(VirtualFrame frame, PDirEntry self, } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization static TruffleString repr(VirtualFrame frame, PDirEntry self, @Bind("this") Node inliningTarget, @Cached NameNode nameNode, - @Cached("create(Repr)") LookupAndCallUnaryNode reprNode, - @Cached CastToTruffleStringNode castToStringNode, + @Cached PyObjectReprAsTruffleStringNode repr, @Cached SimpleTruffleStringFormatNode simpleTruffleStringFormatNode) { - return simpleTruffleStringFormatNode.format("", castToStringNode.execute(inliningTarget, reprNode.executeObject(frame, nameNode.execute(frame, self)))); + return simpleTruffleStringFormatNode.format("", repr.execute(frame, inliningTarget, nameNode.execute(frame, self))); } } @@ -154,25 +157,25 @@ static PosixPath cached(PDirEntry self) { @Specialization(guards = "self.pathCache == null") static PosixPath createBytes(VirtualFrame frame, Node inliningTarget, PDirEntry self, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached InlinedConditionProfile produceBytesProfile, @Cached InlinedConditionProfile posixPathProfile, - @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, - @Cached PythonObjectFactory.Lazy factory, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { Object opaquePath; try { if (posixPathProfile.profile(inliningTarget, self.scandirPath instanceof PosixPath)) { - opaquePath = posixLib.dirEntryGetPath(PosixSupport.get(inliningTarget), self.dirEntryData, ((PosixPath) self.scandirPath).value); + opaquePath = posixLib.dirEntryGetPath(context.getPosixSupport(), self.dirEntryData, ((PosixPath) self.scandirPath).value); } else { - opaquePath = posixLib.dirEntryGetName(PosixSupport.get(inliningTarget), self.dirEntryData); + opaquePath = posixLib.dirEntryGetName(context.getPosixSupport(), self.dirEntryData); } } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } if (produceBytesProfile.profile(inliningTarget, self.produceBytes())) { - self.pathCache = new PosixPath(opaquePathToBytes(opaquePath, posixLib, PosixSupport.get(inliningTarget), factory.get(inliningTarget)), opaquePath, true); + self.pathCache = new PosixPath(opaquePathToBytes(opaquePath, posixLib, context.getPosixSupport(), context.getLanguage(inliningTarget)), opaquePath, true); } else { - self.pathCache = new PosixPath(posixLib.getPathAsString(PosixSupport.get(inliningTarget), opaquePath), opaquePath, false); + self.pathCache = new PosixPath(posixLib.getPathAsString(context.getPosixSupport(), opaquePath), opaquePath, false); } return self.pathCache; } @@ -215,7 +218,7 @@ long inode(VirtualFrame frame, PDirEntry self, } } - @Builtin(name = "stat", minNumOfPositionalArgs = 1, parameterNames = {"$self"}, varArgsMarker = true, keywordOnlyNames = { + @Builtin(name = "stat", minNumOfPositionalArgs = 1, parameterNames = {"$self"}, keywordOnlyNames = { "follow_symlinks"}, doc = "return stat_result object for the entry; cached per entry") @ArgumentClinic(name = "follow_symlinks", conversion = ClinicConversion.Boolean, defaultValue = "true") @GenerateNodeFactory @@ -253,32 +256,32 @@ static PTuple cachedLStat(PDirEntry self, boolean followSymlinks, boolean catchN @Specialization(guards = {"followSymlinks", "self.statCache == null", "isSymlink"}, limit = "1") static PTuple uncachedStatWithSymlink(VirtualFrame frame, PDirEntry self, boolean followSymlinks, boolean catchNoent, @Bind("this") Node inliningTarget, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @SuppressWarnings("unused") @Cached IsSymlinkNode isSymlinkNode, @SuppressWarnings("unused") @Bind("isSymlinkNode.executeBoolean(frame, self)") boolean isSymlink, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, @Shared("cachedPosixPathNode") @Cached CachedPosixPathNode cachedPosixPathNode, @Shared("positiveLongProfile") @Cached InlinedConditionProfile positiveLongProfile, - @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Shared @Cached PythonObjectFactory factory) { + @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { // There are two caches - one for `follow_symlinks=True` and the other for // 'follow_symlinks=False`. They are different only when the dir entry is a symlink. - return uncachedLStatWithSymlink(frame, self, followSymlinks, catchNoent, inliningTarget, posixLib, cachedPosixPathNode, positiveLongProfile, constructAndRaiseNode, factory); + return uncachedLStatWithSymlink(frame, self, followSymlinks, catchNoent, inliningTarget, context, posixLib, cachedPosixPathNode, positiveLongProfile, constructAndRaiseNode); } @Specialization(guards = {"!followSymlinks", "self.lstatCache == null"}) static PTuple uncachedLStatWithSymlink(VirtualFrame frame, PDirEntry self, boolean followSymlinks, boolean catchNoent, @Bind("this") Node inliningTarget, - @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Shared("cachedPosixPathNode") @Cached CachedPosixPathNode cachedPosixPathNode, @Shared("positiveLongProfile") @Cached InlinedConditionProfile positiveLongProfile, - @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Shared @Cached PythonObjectFactory factory) { + @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { PTuple res; int dirFd = self.scandirPath instanceof PosixFd ? ((PosixFd) self.scandirPath).fd : AT_FDCWD.value; PosixPath posixPath = cachedPosixPathNode.execute(frame, inliningTarget, self); try { - long[] rawStat = posixLib.fstatat(PosixSupport.get(inliningTarget), dirFd, posixPath.value, followSymlinks); - res = PosixModuleBuiltins.createStatResult(inliningTarget, factory, positiveLongProfile, rawStat); + long[] rawStat = posixLib.fstatat(context.getPosixSupport(), dirFd, posixPath.value, followSymlinks); + res = PosixModuleBuiltins.createStatResult(inliningTarget, context.getLanguage(inliningTarget), positiveLongProfile, rawStat); } catch (PosixException e) { if (catchNoent && e.getErrorCode() == OSErrorEnum.ENOENT.getNumber()) { return null; @@ -315,7 +318,6 @@ abstract static class TestModeNode extends Node { private final long expectedMode; private final int expectedDirEntryType; - private StatHelperNode statHelperNode; protected TestModeNode(long expectedMode, int expectedDirEntryType) { this.expectedMode = expectedMode; @@ -327,8 +329,9 @@ protected TestModeNode(long expectedMode, int expectedDirEntryType) { @Specialization(guards = "followSymlinks") boolean testModeUsingStat(VirtualFrame frame, PDirEntry self, boolean followSymlinks, @Bind("this") Node inliningTarget, + @Shared @Cached StatHelperNode statHelperNode, @Shared @Cached SequenceStorageNodes.GetItemScalarNode getItemScalarNode) { - PTuple statResult = getStatHelperNode().execute(frame, self, followSymlinks, true); + PTuple statResult = statHelperNode.execute(frame, self, followSymlinks, true); if (statResult == null) { // file not found return false; @@ -341,21 +344,14 @@ boolean testModeUsingStat(VirtualFrame frame, PDirEntry self, boolean followSyml @Specialization(guards = "!followSymlinks") boolean useTypeIfKnown(VirtualFrame frame, PDirEntry self, @SuppressWarnings("unused") boolean followSymlinks, @Bind("this") Node inliningTarget, + @Shared @Cached StatHelperNode statHelperNode, @Shared @Cached SequenceStorageNodes.GetItemScalarNode getItemScalarNode, @CachedLibrary(limit = "1") PosixSupportLibrary posixLib) { int entryType = posixLib.dirEntryGetType(PosixSupport.get(this), self.dirEntryData); if (entryType != DT_UNKNOWN.value) { return entryType == expectedDirEntryType; } - return testModeUsingStat(frame, self, false, inliningTarget, getItemScalarNode); - } - - private StatHelperNode getStatHelperNode() { - if (statHelperNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - statHelperNode = insert(DirEntryBuiltinsFactory.StatHelperNodeGen.create()); - } - return statHelperNode; + return testModeUsingStat(frame, self, false, inliningTarget, statHelperNode, getItemScalarNode); } @NeverDefault @@ -392,7 +388,7 @@ static boolean isSymlink(VirtualFrame frame, PDirEntry self, } } - @Builtin(name = "is_file", minNumOfPositionalArgs = 1, parameterNames = {"$self"}, varArgsMarker = true, keywordOnlyNames = {"follow_symlinks"}) + @Builtin(name = "is_file", minNumOfPositionalArgs = 1, parameterNames = {"$self"}, keywordOnlyNames = {"follow_symlinks"}) @ArgumentClinic(name = "follow_symlinks", conversion = ClinicConversion.Boolean, defaultValue = "true") @GenerateNodeFactory abstract static class IsFileNode extends PythonClinicBuiltinNode { @@ -409,7 +405,7 @@ static boolean isFile(VirtualFrame frame, PDirEntry self, boolean followSymlinks } } - @Builtin(name = "is_dir", minNumOfPositionalArgs = 1, parameterNames = {"$self"}, varArgsMarker = true, keywordOnlyNames = {"follow_symlinks"}) + @Builtin(name = "is_dir", minNumOfPositionalArgs = 1, parameterNames = {"$self"}, keywordOnlyNames = {"follow_symlinks"}) @ArgumentClinic(name = "follow_symlinks", conversion = ClinicConversion.Boolean, defaultValue = "true") @GenerateNodeFactory abstract static class IsDirNode extends PythonClinicBuiltinNode { @@ -431,8 +427,8 @@ static boolean isDir(VirtualFrame frame, PDirEntry self, boolean followSymlinks, public abstract static class ClassGetItemNode extends PythonBinaryBuiltinNode { @Specialization static Object classGetItem(Object cls, Object key, - @Cached PythonObjectFactory factory) { - return factory.createGenericAlias(cls, key); + @Bind PythonLanguage language) { + return PFactory.createGenericAlias(language, cls, key); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/posix/ScandirIteratorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/posix/ScandirIteratorBuiltins.java index 89ba012a09..2cc289f1ed 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/posix/ScandirIteratorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/posix/ScandirIteratorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,19 +42,20 @@ import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ENTER__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EXIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__; import java.util.List; import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; import com.oracle.graal.python.nodes.PConstructAndRaiseNode; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; @@ -63,7 +64,7 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CallTarget; import com.oracle.truffle.api.TruffleLanguage; import com.oracle.truffle.api.dsl.Bind; @@ -79,6 +80,8 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PScandirIterator) public final class ScandirIteratorBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = ScandirIteratorBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return ScandirIteratorBuiltinsFactory.getFactories(); @@ -95,7 +98,7 @@ PNone close(PScandirIterator self, } } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory abstract static class IterNode extends PythonUnaryBuiltinNode { @Specialization @@ -104,27 +107,26 @@ PScandirIterator iter(PScandirIterator self) { } } - @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iternext, isComplex = true) @GenerateNodeFactory - abstract static class NextNode extends PythonUnaryBuiltinNode { + abstract static class NextNode extends TpIterNextBuiltin { @Specialization - static PDirEntry next(VirtualFrame frame, PScandirIterator self, + static Object next(VirtualFrame frame, PScandirIterator self, @Bind("this") Node inliningTarget, @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language) { if (self.ref.isReleased()) { - throw raiseNode.get(inliningTarget).raiseStopIteration(); + throw iteratorExhausted(); } PosixSupport posixSupport = PosixSupport.get(inliningTarget); try { Object dirEntryData = posixLib.readdir(posixSupport, self.ref.getReference()); if (dirEntryData == null) { self.ref.rewindAndClose(posixLib, posixSupport); - throw raiseNode.get(inliningTarget).raiseStopIteration(); + throw iteratorExhausted(); } - return factory.createDirEntry(dirEntryData, self.path); + return PFactory.createDirEntry(language, dirEntryData, self.path); } catch (PosixException e) { self.ref.rewindAndClose(posixLib, posixSupport); throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/property/PropertyBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/property/PropertyBuiltins.java index 16389ab647..cfb7c5d4e6 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/property/PropertyBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/property/PropertyBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,22 +41,25 @@ package com.oracle.graal.python.builtins.objects.property; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.AttributeError; +import static com.oracle.graal.python.nodes.BuiltinNames.J_PROPERTY; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___DOC__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DOC__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ISABSTRACTMETHOD__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SET_NAME__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ISABSTRACTMETHOD__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode; @@ -76,12 +79,13 @@ import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassExactProfile; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassProfile; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; @@ -106,7 +110,20 @@ protected List> getNodeFa return PropertyBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, parameterNames = {"$self", "fget", "fset", "fdel", "doc"}) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_PROPERTY, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class PropertyNode extends PythonVarargsBuiltinNode { + @Specialization + static PProperty doit(Object cls, @SuppressWarnings("unused") Object[] args, @SuppressWarnings("unused") PKeyword[] keywords, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createProperty(language, cls, getInstanceShape.execute(cls)); + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "property", parameterNames = {"$self", "fget", "fset", "fdel", "doc"}) @GenerateNodeFactory abstract static class PropertyInitNode extends PythonBuiltinNode { @@ -156,7 +173,7 @@ abstract static class PropertyFuncNode extends PythonBinaryBuiltinNode { @Specialization(guards = "!isNoValue(value)") @SuppressWarnings("unused") static Object doSet(PProperty self, Object value, - @Cached PRaiseNode raiseNode) { + @Bind("this") Node inliningTarget) { /* * That's a bit unfortunate: if we define 'isGetter = true' and 'isSetter = false' then * this will use a GetSetDescriptor which has a slightly different error message for @@ -164,7 +181,7 @@ static Object doSet(PProperty self, Object value, * with expected message. This should be fixed by distinguishing between getset and * member descriptors. */ - throw raiseNode.raise(PythonBuiltinClassType.AttributeError, ErrorMessages.READONLY_ATTRIBUTE); + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.AttributeError, ErrorMessages.READONLY_ATTRIBUTE); } } @@ -256,7 +273,7 @@ static Object copy(PProperty pold, Object getArg, Object setArg, Object delArg) // shortcut: create new property object directly if (IsBuiltinClassProfile.profileClassSlowPath(type, PythonBuiltinClassType.PProperty)) { - PProperty copy = PythonObjectFactory.getUncached().createProperty(); + PProperty copy = PFactory.createProperty(PythonLanguage.get(null)); PropertyInitNode.doGeneric(copy, get, set, del, doc); return copy; } @@ -313,9 +330,9 @@ PException error(VirtualFrame frame, PProperty self, Object obj, String what, TruffleString qualName = getQualNameNode.execute(inliningTarget, getClassNode.execute(inliningTarget, obj)); if (self.getPropertyName() != null) { TruffleString propertyName = reprNode.execute(frame, inliningTarget, self.getPropertyName()); - throw raiseNode.raise(AttributeError, ErrorMessages.PROPERTY_S_OF_S_OBJECT_HAS_NO_S, propertyName, qualName, what); + throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.PROPERTY_S_OF_S_OBJECT_HAS_NO_S, propertyName, qualName, what); } else { - throw raiseNode.raise(AttributeError, ErrorMessages.PROPERTY_OF_S_OBJECT_HAS_NO_S, qualName, what); + throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.PROPERTY_OF_S_OBJECT_HAS_NO_S, qualName, what); } } } @@ -398,7 +415,7 @@ private static boolean isAbstract(VirtualFrame frame, Node inliningTarget, PyObj } Object result = lookup.execute(frame, inliningTarget, func, T___ISABSTRACTMETHOD__); if (result != PNone.NO_VALUE) { - return isTrueNode.execute(frame, inliningTarget, result); + return isTrueNode.execute(frame, result); } return false; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/queue/SimpleQueueBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/queue/SimpleQueueBuiltins.java index a149c1b169..9ab1d24d08 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/queue/SimpleQueueBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/queue/SimpleQueueBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,18 +43,25 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.Empty; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError; +import static com.oracle.graal.python.nodes.BuiltinNames.J_SIMPLE_QUEUE; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CLASS_GETITEM__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.queue.SimpleQueueBuiltinsClinicProviders.SimpleQueueGetNodeClinicProviderGen; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyLongAsLongAndOverflowNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; @@ -67,7 +74,7 @@ import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaDoubleNode; import com.oracle.graal.python.runtime.GilNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.OverflowException; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; @@ -84,11 +91,26 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PSimpleQueue) public final class SimpleQueueBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = SimpleQueueBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return SimpleQueueBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_SIMPLE_QUEUE, minNumOfPositionalArgs = 1) + @GenerateNodeFactory + public abstract static class SimpleQueueNode extends PythonUnaryBuiltinNode { + + @Specialization + static PSimpleQueue doGeneric(Object cls, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createSimpleQueue(language, cls, getInstanceShape.execute(cls)); + } + } + @Builtin(name = "empty", minNumOfPositionalArgs = 1, // doc = "empty($self, /)\n--\n\nReturn True if the queue is empty, False otherwise (not reliable!).") @GenerateNodeFactory @@ -127,12 +149,12 @@ public abstract static class SimpleQueueGetNoWaitNode extends PythonUnaryBuiltin @Specialization static Object doNoTimeout(PSimpleQueue self, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object result = self.poll(); if (result != null) { return result; } - throw raiseNode.get(inliningTarget).raise(Empty); + throw raiseNode.raise(inliningTarget, Empty); } } @@ -164,7 +186,7 @@ protected ArgumentClinicProvider getArgumentClinic() { static Object doNoTimeout(PSimpleQueue self, boolean block, @SuppressWarnings("unused") Object timeout, @Bind("this") Node inliningTarget, @Shared @Cached GilNode gil, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { // CPython first tries a non-blocking get without releasing the GIL Object result = self.poll(); if (result != null) { @@ -182,7 +204,7 @@ static Object doNoTimeout(PSimpleQueue self, boolean block, @SuppressWarnings("u gil.acquire(); } } - throw raiseNode.get(inliningTarget).raise(Empty); + throw raiseNode.raise(inliningTarget, Empty); } @Specialization(guards = "withTimeout(block, timeout)") @@ -191,7 +213,7 @@ static Object doTimeout(VirtualFrame frame, PSimpleQueue self, boolean block, Ob @Cached PyLongAsLongAndOverflowNode asLongNode, @Cached CastToJavaDoubleNode castToDouble, @Shared @Cached GilNode gil, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { assert block; // convert timeout object (given in seconds) to a Java long in microseconds @@ -202,12 +224,12 @@ static Object doTimeout(VirtualFrame frame, PSimpleQueue self, boolean block, Ob try { ltimeout = PythonUtils.multiplyExact(asLongNode.execute(frame, inliningTarget, timeout), 1000000); } catch (OverflowException oe) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.TIMEOUT_VALUE_TOO_LARGE); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.TIMEOUT_VALUE_TOO_LARGE); } } if (ltimeout < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.TIMEOUT_MUST_BE_NON_NEG_NUM); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.TIMEOUT_MUST_BE_NON_NEG_NUM); } // CPython first tries a non-blocking get without releasing the GIL @@ -228,7 +250,7 @@ static Object doTimeout(VirtualFrame frame, PSimpleQueue self, boolean block, Ob } finally { gil.acquire(); } - throw raiseNode.get(inliningTarget).raise(Empty); + throw raiseNode.raise(inliningTarget, Empty); } static boolean withTimeout(boolean block, Object timeout) { @@ -252,13 +274,13 @@ public abstract static class SimpleQueuePutNode extends PythonQuaternaryBuiltinN @Specialization static PNone doGeneric(PSimpleQueue self, Object item, @SuppressWarnings("unused") Object block, @SuppressWarnings("unused") Object timeout, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (!self.put(item)) { /* * CPython uses a Python list as backing storage. This will throw an OverflowError * if no more elements can be added to the list. */ - throw raiseNode.get(inliningTarget).raise(OverflowError); + throw raiseNode.raise(inliningTarget, OverflowError); } return PNone.NONE; } @@ -277,13 +299,13 @@ public abstract static class SimpleQueuePutNoWaitNode extends PythonBinaryBuilti @Specialization static PNone doGeneric(PSimpleQueue self, Object item, @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (!self.put(item)) { /* * CPython uses a Python list as backing storage. This will throw an OverflowError * if no more elements can be added to the list. */ - throw raiseNode.get(inliningTarget).raise(OverflowError); + throw raiseNode.raise(inliningTarget, OverflowError); } return PNone.NONE; } @@ -294,8 +316,8 @@ static PNone doGeneric(PSimpleQueue self, Object item, public abstract static class ClassGetItemNode extends PythonBinaryBuiltinNode { @Specialization static Object classGetItem(Object cls, Object key, - @Cached PythonObjectFactory factory) { - return factory.createGenericAlias(cls, key); + @Bind PythonLanguage language) { + return PFactory.createGenericAlias(language, cls, key); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/random/RandomBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/random/RandomBuiltins.java index f17d91e9e0..173bfee093 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/random/RandomBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/random/RandomBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,6 +42,7 @@ import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; +import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.math.BigInteger; import java.nio.ByteBuffer; @@ -49,8 +50,12 @@ import java.security.SecureRandom; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -59,17 +64,22 @@ import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetObjectArrayNode; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyObjectHashNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode; +import com.oracle.graal.python.nodes.call.special.SpecialMethodNotFound; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; import com.oracle.graal.python.nodes.util.CastToJavaUnsignedLongNode; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -80,17 +90,45 @@ import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.strings.TruffleString; @CoreFunctions(extendClasses = PythonBuiltinClassType.PRandom) public final class RandomBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = RandomBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return RandomBuiltinsFactory.getFactories(); } + // _random.Random([seed]) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "Random", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, takesVarKeywordArgs = true) + @GenerateNodeFactory + abstract static class PRandomNode extends PythonBuiltinNode { + private static final TruffleString T_SEED = tsLiteral("seed"); + + @Child LookupAndCallBinaryNode setSeed = LookupAndCallBinaryNode.create(T_SEED); + + @Specialization + PRandom random(VirtualFrame frame, Object cls, Object seed, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + PRandom random = PFactory.createRandom(language, cls, getInstanceShape.execute(cls)); + try { + setSeed.executeObject(frame, random, seed != PNone.NO_VALUE ? seed : PNone.NONE); + } catch (SpecialMethodNotFound ignore) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.SystemError); + } + return random; + } + } + @Builtin(name = "seed", minNumOfPositionalArgs = 1, parameterNames = {"$self", "seed"}) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) + @TypeSystemReference(PythonIntegerTypes.class) public abstract static class SeedNode extends PythonBuiltinNode { @Specialization @TruffleBoundary @@ -159,10 +197,10 @@ static PNone setstate(PRandom random, PTuple tuple, @Bind("this") Node inliningTarget, @Cached GetObjectArrayNode getObjectArrayNode, @Cached CastToJavaUnsignedLongNode castNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object[] arr = getObjectArrayNode.execute(inliningTarget, tuple); if (arr.length != PRandom.N + 1) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.ValueError, ErrorMessages.STATE_VECTOR_INVALID); + throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ErrorMessages.STATE_VECTOR_INVALID); } int[] state = new int[PRandom.N]; for (int i = 0; i < PRandom.N; ++i) { @@ -171,7 +209,7 @@ static PNone setstate(PRandom random, PTuple tuple, } long index = castNode.execute(inliningTarget, arr[PRandom.N]); if (index < 0 || index > PRandom.N) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.ValueError, ErrorMessages.STATE_VECTOR_INVALID); + throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ErrorMessages.STATE_VECTOR_INVALID); } random.restore(state, (int) index); return PNone.NONE; @@ -180,8 +218,8 @@ static PNone setstate(PRandom random, PTuple tuple, @Fallback @SuppressWarnings("unused") static Object setstate(Object random, Object state, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.STATE_VECTOR_MUST_BE_A_TUPLE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.STATE_VECTOR_MUST_BE_A_TUPLE); } } @@ -191,8 +229,8 @@ public abstract static class GetStateNode extends PythonBuiltinNode { @Specialization static PTuple getstate(PRandom random, - @Cached PythonObjectFactory factory) { - return factory.createTuple(encodeState(random)); + @Bind PythonLanguage language) { + return PFactory.createTuple(language, encodeState(random)); } @TruffleBoundary @@ -235,8 +273,8 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(guards = "k < 0") @SuppressWarnings("unused") static int negative(PRandom random, int k, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.NUMBER_OF_BITS_MUST_BE_NON_NEGATIVE); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.NUMBER_OF_BITS_MUST_BE_NON_NEGATIVE); } @Specialization(guards = "k == 0") @@ -275,7 +313,7 @@ static PInt genBigInteger(PRandom random, int k) { bb.putInt(4 * i, x); } bb.putInt(0, random.nextInt() >>> (32 - (k % 32))); - return PythonObjectFactory.getUncached().createInt(new BigInteger(1, bb.array())); + return PFactory.createInt(PythonLanguage.get(null), new BigInteger(1, bb.array())); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/range/RangeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/range/RangeBuiltins.java index 2fa9c621ed..0d6b756f32 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/range/RangeBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/range/RangeBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -29,20 +29,20 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError; import static com.oracle.graal.python.builtins.objects.common.IndexNodes.checkBounds; +import static com.oracle.graal.python.nodes.BuiltinNames.J_RANGE; +import static com.oracle.graal.python.nodes.ErrorMessages.ARG_MUST_NOT_BE_ZERO; import static com.oracle.graal.python.nodes.ErrorMessages.RANGE_OUT_OF_BOUNDS; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CONTAINS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; +import static com.oracle.graal.python.nodes.PGuards.isNoValue; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import java.math.BigInteger; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -67,31 +67,39 @@ import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.MpSubscriptBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.HashBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.NbBoolBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare.RichCmpBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqItemBuiltinNode; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqContains.SqContainsBuiltinNode; +import com.oracle.graal.python.lib.IteratorExhausted; import com.oracle.graal.python.lib.PyIndexCheckNode; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyLongCheckExactNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; +import com.oracle.graal.python.lib.PyNumberIndexNode; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.lib.PyObjectHashNode; import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode; import com.oracle.graal.python.lib.PyObjectRichCompareBool; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaBigIntegerNode; +import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.exception.PythonErrorType; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.OverflowException; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; @@ -106,10 +114,12 @@ import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.ReportPolymorphism; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.strings.TruffleString; @@ -122,14 +132,164 @@ protected List> getNodeFa return RangeBuiltinsFactory.getFactories(); } - @Builtin(name = J___HASH__, minNumOfPositionalArgs = 1) + // range(stop) + // range(start, stop[, step]) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_RANGE, minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 4) @GenerateNodeFactory - public abstract static class HashNode extends PythonBuiltinNode { + @ReportPolymorphism + public abstract static class RangeNode extends PythonQuaternaryBuiltinNode { + // stop + @Specialization(guards = "isStop(start, stop, step)") + static Object doIntStop(Object cls, int stop, @SuppressWarnings("unused") PNone start, @SuppressWarnings("unused") PNone step, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Shared("exceptionProfile") @Cached InlinedBranchProfile exceptionProfile, + @Shared("lenOfRangeNodeExact") @Cached LenOfIntRangeNodeExact lenOfRangeNodeExact, + @Shared("createBigRangeNode") @Cached RangeNodes.CreateBigRangeNode createBigRangeNode, + @Shared @Cached PRaiseNode raiseNode) { + return doInt(cls, 0, stop, 1, inliningTarget, language, exceptionProfile, lenOfRangeNodeExact, createBigRangeNode, raiseNode); + } + + @Specialization(guards = "isStop(start, stop, step)") + static Object doPintStop(Object cls, PInt stop, @SuppressWarnings("unused") PNone start, @SuppressWarnings("unused") PNone step, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Shared("lenOfRangeNode") @Cached RangeNodes.LenOfRangeNode lenOfRangeNode, + @Shared @Cached PRaiseNode raiseNode) { + return doPint(cls, PFactory.createInt(language, BigInteger.ZERO), stop, PFactory.createInt(language, BigInteger.ONE), inliningTarget, language, lenOfRangeNode, raiseNode); + } + + @Specialization(guards = "isStop(start, stop, step)") + static Object doGenericStop(VirtualFrame frame, Object cls, Object stop, @SuppressWarnings("unused") PNone start, @SuppressWarnings("unused") PNone step, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Shared("exceptionProfile") @Cached InlinedBranchProfile exceptionProfile, + @Shared("lenOfRangeNodeExact") @Cached LenOfIntRangeNodeExact lenOfRangeNodeExact, + @Shared("createBigRangeNode") @Cached RangeNodes.CreateBigRangeNode createBigRangeNode, + @Shared("cast") @Cached CastToJavaIntExactNode cast, + @Shared("overflowProfile") @Cached IsBuiltinObjectProfile overflowProfile, + @Shared("indexNode") @Cached PyNumberIndexNode indexNode, + @Shared @Cached PRaiseNode raiseNode) { + return doGeneric(frame, cls, 0, stop, 1, inliningTarget, language, exceptionProfile, lenOfRangeNodeExact, createBigRangeNode, cast, overflowProfile, indexNode, raiseNode); + } + + // start stop + @Specialization(guards = "isStartStop(start, stop, step)") + static Object doIntStartStop(Object cls, int start, int stop, @SuppressWarnings("unused") PNone step, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Shared("exceptionProfile") @Cached InlinedBranchProfile exceptionProfile, + @Shared("lenOfRangeNodeExact") @Cached LenOfIntRangeNodeExact lenOfRangeNodeExact, + @Shared("createBigRangeNode") @Cached RangeNodes.CreateBigRangeNode createBigRangeNode, + @Shared @Cached PRaiseNode raiseNode) { + return doInt(cls, start, stop, 1, inliningTarget, language, exceptionProfile, lenOfRangeNodeExact, createBigRangeNode, raiseNode); + } + + @Specialization(guards = "isStartStop(start, stop, step)") + static Object doPintStartStop(Object cls, PInt start, PInt stop, @SuppressWarnings("unused") PNone step, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Shared("lenOfRangeNode") @Cached RangeNodes.LenOfRangeNode lenOfRangeNode, + @Shared @Cached PRaiseNode raiseNode) { + return doPint(cls, start, stop, PFactory.createInt(language, BigInteger.ONE), inliningTarget, language, lenOfRangeNode, raiseNode); + } + + @Specialization(guards = "isStartStop(start, stop, step)") + static Object doGenericStartStop(VirtualFrame frame, Object cls, Object start, Object stop, @SuppressWarnings("unused") PNone step, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Shared("exceptionProfile") @Cached InlinedBranchProfile exceptionProfile, + @Shared("lenOfRangeNodeExact") @Cached LenOfIntRangeNodeExact lenOfRangeNodeExact, + @Shared("createBigRangeNode") @Cached RangeNodes.CreateBigRangeNode createBigRangeNode, + @Shared("cast") @Cached CastToJavaIntExactNode cast, + @Shared("overflowProfile") @Cached IsBuiltinObjectProfile overflowProfile, + @Shared("indexNode") @Cached PyNumberIndexNode indexNode, + @Shared @Cached PRaiseNode raiseNode) { + return doGeneric(frame, cls, start, stop, 1, inliningTarget, language, exceptionProfile, lenOfRangeNodeExact, createBigRangeNode, cast, overflowProfile, indexNode, raiseNode); + } + + // start stop step + @Specialization + static Object doInt(@SuppressWarnings("unused") Object cls, int start, int stop, int step, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Shared("exceptionProfile") @Cached InlinedBranchProfile exceptionProfile, + @Shared("lenOfRangeNodeExact") @Cached LenOfIntRangeNodeExact lenOfRangeNode, + @Shared("createBigRangeNode") @Cached RangeNodes.CreateBigRangeNode createBigRangeNode, + @Shared @Cached PRaiseNode raiseNode) { + if (step == 0) { + throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ARG_MUST_NOT_BE_ZERO, "range()", 3); + } + try { + int len = lenOfRangeNode.executeInt(inliningTarget, start, stop, step); + return PFactory.createIntRange(language, start, stop, step, len); + } catch (OverflowException e) { + exceptionProfile.enter(inliningTarget); + return createBigRangeNode.execute(inliningTarget, start, stop, step); + } + } + + @Specialization + static Object doPint(@SuppressWarnings("unused") Object cls, PInt start, PInt stop, PInt step, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Shared("lenOfRangeNode") @Cached RangeNodes.LenOfRangeNode lenOfRangeNode, + @Shared @Cached PRaiseNode raiseNode) { + if (step.isZero()) { + throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ARG_MUST_NOT_BE_ZERO, "range()", 3); + } + BigInteger len = lenOfRangeNode.execute(inliningTarget, start.getValue(), stop.getValue(), step.getValue()); + return PFactory.createBigRange(language, start, stop, step, PFactory.createInt(language, len)); + } + + @Specialization(guards = "isStartStopStep(start, stop, step)") + static Object doGeneric(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object start, Object stop, Object step, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Shared("exceptionProfile") @Cached InlinedBranchProfile exceptionProfile, + @Shared("lenOfRangeNodeExact") @Cached LenOfIntRangeNodeExact lenOfRangeNodeExact, + @Shared("createBigRangeNode") @Cached RangeNodes.CreateBigRangeNode createBigRangeNode, + @Shared("cast") @Cached CastToJavaIntExactNode cast, + @Shared("overflowProfile") @Cached IsBuiltinObjectProfile overflowProfile, + @Shared("indexNode") @Cached PyNumberIndexNode indexNode, + @Shared @Cached PRaiseNode raiseNode) { + Object lstart = indexNode.execute(frame, inliningTarget, start); + Object lstop = indexNode.execute(frame, inliningTarget, stop); + Object lstep = indexNode.execute(frame, inliningTarget, step); + + try { + int istart = cast.execute(inliningTarget, lstart); + int istop = cast.execute(inliningTarget, lstop); + int istep = cast.execute(inliningTarget, lstep); + return doInt(cls, istart, istop, istep, inliningTarget, language, exceptionProfile, lenOfRangeNodeExact, createBigRangeNode, raiseNode); + } catch (PException e) { + e.expect(inliningTarget, PythonErrorType.OverflowError, overflowProfile); + return createBigRangeNode.execute(inliningTarget, lstart, lstop, lstep); + } + } + + protected static boolean isStop(Object start, Object stop, Object step) { + return isNoValue(start) && !isNoValue(stop) && isNoValue(step); + } + + protected static boolean isStartStop(Object start, Object stop, Object step) { + return !isNoValue(start) && !isNoValue(stop) && isNoValue(step); + } + + protected static boolean isStartStopStep(Object start, Object stop, Object step) { + return !isNoValue(start) && !isNoValue(stop) && !isNoValue(step); + } + } + + @Slot(value = SlotKind.tp_hash, isComplex = true) + @GenerateNodeFactory + public abstract static class HashNode extends HashBuiltinNode { @Specialization static long hash(VirtualFrame frame, PIntRange self, @Bind("this") Node inliningTarget, - @Shared("hashNode") @Cached PyObjectHashNode hashNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @Shared("hashNode") @Cached PyObjectHashNode hashNode) { Object[] content = new Object[3]; int intLength = self.getIntLength(); content[0] = intLength; @@ -143,14 +303,14 @@ static long hash(VirtualFrame frame, PIntRange self, content[1] = self.getIntStart(); content[2] = self.getIntStep(); } - return hashNode.execute(frame, inliningTarget, factory.createTuple(content)); + return hashNode.execute(frame, inliningTarget, PFactory.createTuple(language, content)); } @Specialization static long hash(VirtualFrame frame, PBigRange self, @Bind("this") Node inliningTarget, - @Shared("hashNode") @Cached PyObjectHashNode hashNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @Shared("hashNode") @Cached PyObjectHashNode hashNode) { Object[] content = new Object[3]; PInt length = self.getPIntLength(); content[0] = length; @@ -164,13 +324,13 @@ static long hash(VirtualFrame frame, PBigRange self, content[1] = self.getStart(); content[2] = self.getStep(); } - return hashNode.execute(frame, inliningTarget, factory.createTuple(content)); + return hashNode.execute(frame, inliningTarget, PFactory.createTuple(language, content)); } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory - abstract static class ReprNode extends PythonBuiltinNode { + abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization public static TruffleString repr(PRange self, @Bind("this") Node inliningTarget, @@ -207,12 +367,12 @@ static int doPBigRange(VirtualFrame frame, PBigRange self, @Bind("this") Node inliningTarget, @Cached PyIndexCheckNode indexCheckNode, @Cached PyNumberAsSizeNode asSizeNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object length = self.getLength(); if (indexCheckNode.execute(inliningTarget, length)) { return asSizeNode.executeExact(frame, inliningTarget, length); } - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, length); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, length); } @NeverDefault @@ -241,19 +401,19 @@ boolean doPBigRange(PBigRange self) { } } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory abstract static class IterNode extends PythonUnaryBuiltinNode { @Specialization static Object doPIntRange(PIntRange self, - @Shared @Cached PythonObjectFactory factory) { - return factory.createIntRangeIterator(self); + @Bind PythonLanguage language) { + return PFactory.createIntRangeIterator(language, self); } @Specialization static Object doPIntRange(PBigRange self, - @Shared @Cached PythonObjectFactory factory) { - return factory.createBigRangeIterator(self); + @Bind PythonLanguage language) { + return PFactory.createBigRangeIterator(language, self); } } @@ -296,17 +456,16 @@ public abstract static class ReduceNode extends PythonUnaryBuiltinNode { @Specialization static Object reduce(PRange self, @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached PythonObjectFactory factory) { - PTuple args = factory.createTuple(new Object[]{self.getStart(), self.getStop(), self.getStep()}); - return factory.createTuple(new Object[]{getClassNode.execute(inliningTarget, self), args}); + @Bind PythonLanguage language, + @Cached GetClassNode getClassNode) { + PTuple args = PFactory.createTuple(language, new Object[]{self.getStart(), self.getStop(), self.getStep()}); + return PFactory.createTuple(language, new Object[]{getClassNode.execute(inliningTarget, self), args}); } } - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.tp_richcompare, isComplex = true) @GenerateNodeFactory - abstract static class EqNode extends PythonBinaryBuiltinNode { - + abstract static class EqNode extends RichCmpBuiltinNode { private static boolean eqInt(PIntRange range, int len, int start, int step) { return eqInt(range.getIntLength(), range.getIntStart(), range.getIntStep(), len, start, step); @@ -347,17 +506,17 @@ private static boolean eqBigInt(BigInteger llen, BigInteger lstart, BigInteger l return lstep.compareTo(rstep) == 0; } - @Specialization - static boolean eqIntInt(PIntRange left, PIntRange right) { + @Specialization(guards = "op.isEqOrNe()") + static boolean eqIntInt(PIntRange left, PIntRange right, RichCmpOp op) { if (left == right) { - return true; + return op.isEq(); } return eqInt(left.getIntLength(), left.getIntStart(), left.getIntStep(), - right.getIntLength(), right.getIntStart(), right.getIntStep()); + right.getIntLength(), right.getIntStart(), right.getIntStep()) == op.isEq(); } - @Specialization - static boolean eqIntBig(VirtualFrame frame, PIntRange left, PBigRange right, + @Specialization(guards = "op.isEqOrNe()") + static boolean eqIntBig(VirtualFrame frame, PIntRange left, PBigRange right, RichCmpOp op, @Bind("this") Node inliningTarget, @Shared @Cached RangeNodes.CoerceToBigRange intToBigRange, @Shared @Cached PyNumberAsSizeNode asSizeNode) { @@ -365,14 +524,14 @@ static boolean eqIntBig(VirtualFrame frame, PIntRange left, PBigRange right, int rlen = asSizeNode.executeExact(frame, inliningTarget, right.getPIntLength()); int rstart = asSizeNode.executeExact(frame, inliningTarget, right.getPIntStart()); int rstep = asSizeNode.executeExact(frame, inliningTarget, right.getPIntStep()); - return eqInt(left, rlen, rstart, rstep); + return eqInt(left, rlen, rstart, rstep) == op.isEq(); } catch (PException e) { - return eqBigInt(intToBigRange.execute(inliningTarget, left), right); + return eqBigInt(intToBigRange.execute(inliningTarget, left), right, op); } } - @Specialization - static boolean eqIntBig(VirtualFrame frame, PBigRange left, PIntRange right, + @Specialization(guards = "op.isEqOrNe()") + static boolean eqIntBig(VirtualFrame frame, PBigRange left, PIntRange right, RichCmpOp op, @Bind("this") Node inliningTarget, @Shared @Cached RangeNodes.CoerceToBigRange intToBigRange, @Shared @Cached PyNumberAsSizeNode asSizeNode) { @@ -380,24 +539,24 @@ static boolean eqIntBig(VirtualFrame frame, PBigRange left, PIntRange right, int llen = asSizeNode.executeExact(frame, inliningTarget, left.getPIntLength()); int lstart = asSizeNode.executeExact(frame, inliningTarget, left.getPIntStart()); int lstep = asSizeNode.executeExact(frame, inliningTarget, left.getPIntStep()); - return eqInt(right, llen, lstart, lstep); + return eqInt(right, llen, lstart, lstep) == op.isEq(); } catch (PException e) { - return eqBigInt(left, intToBigRange.execute(inliningTarget, right)); + return eqBigInt(left, intToBigRange.execute(inliningTarget, right), op); } } - @Specialization - static boolean eqBigInt(PBigRange left, PBigRange right) { + @Specialization(guards = "op.isEqOrNe()") + static boolean eqBigInt(PBigRange left, PBigRange right, RichCmpOp op) { if (left == right) { - return true; + return op.isEq(); } return eqBigInt(left.getBigIntegerLength(), left.getBigIntegerStart(), left.getBigIntegerStep(), - right.getBigIntegerLength(), right.getBigIntegerStart(), right.getBigIntegerStep()); + right.getBigIntegerLength(), right.getBigIntegerStart(), right.getBigIntegerStep()) == op.isEq(); } @Fallback @SuppressWarnings("unused") - static Object doOther(Object left, Object right) { + static Object doOther(Object left, Object right, RichCmpOp op) { return PNotImplemented.NOT_IMPLEMENTED; } } @@ -409,7 +568,7 @@ public abstract static class RangeSqItemNode extends SqItemBuiltinNode { static int doInt(PIntRange self, int index, @Bind("this") Node inliningTarget, @Cached InlinedConditionProfile negativeIndexProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (negativeIndexProfile.profile(inliningTarget, index < 0)) { index += self.getIntLength(); } @@ -421,8 +580,8 @@ static int doInt(PIntRange self, int index, @InliningCutoff static Object doBigInt(PBigRange self, int index, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory) { - return factory.createInt(self.getBigIntItemNormalized(GetItemNode.computeBigRangeItem(inliningTarget, self, index))); + @Bind PythonLanguage language) { + return PFactory.createInt(language, self.getBigIntItemNormalized(GetItemNode.computeBigRangeItem(inliningTarget, self, index))); } } @@ -464,9 +623,8 @@ static Object doPRange(VirtualFrame frame, PIntRange self, Object idx, static Object doPRange(PBigRange self, Object idx, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @Shared @Cached CastToJavaBigIntegerNode toBigInt, - @SuppressWarnings("unused") @Shared @Cached PyIndexCheckNode indexCheckNode, - @Shared @Cached PythonObjectFactory factory) { - return factory.createInt(self.getBigIntItemNormalized(computeBigRangeItem(inliningTarget, self, idx, toBigInt))); + @SuppressWarnings("unused") @Shared @Cached PyIndexCheckNode indexCheckNode) { + return PFactory.createInt(PythonLanguage.get(inliningTarget), self.getBigIntItemNormalized(computeBigRangeItem(inliningTarget, self, idx, toBigInt))); } @Specialization(guards = "!canBeIndex(this, slice, indexCheckNode)") @@ -479,13 +637,12 @@ static Object doPRangeSliceSlowPath(VirtualFrame frame, PIntRange self, PSlice s @Shared @Cached CoerceToObjectSlice toBigIntSlice, @Shared @Cached LenOfIntRangeNodeExact lenOfRangeNodeExact, @Shared @Cached RangeNodes.LenOfRangeNode lenOfRangeNode, - @SuppressWarnings("unused") @Shared @Cached PyIndexCheckNode indexCheckNode, - @Shared @Cached PythonObjectFactory factory) { + @SuppressWarnings("unused") @Shared @Cached PyIndexCheckNode indexCheckNode) { try { final int rStart = self.getIntStart(); final int rStep = self.getIntStep(); SliceInfo info = compute.execute(frame, slice, self.getIntLength()); - return createRange(inliningTarget, info, rStart, rStep, lenOfRangeNodeExact, factory); + return createRange(inliningTarget, info, rStart, rStep, lenOfRangeNodeExact); } catch (PException pe) { pe.expect(inliningTarget, PythonBuiltinClassType.OverflowError, profileError); // pass @@ -496,7 +653,7 @@ static Object doPRangeSliceSlowPath(VirtualFrame frame, PIntRange self, PSlice s BigInteger rangeStart = rangeBI.getBigIntegerStart(); BigInteger rangeStep = rangeBI.getBigIntegerStep(); - SliceObjectInfo info = PObjectSlice.computeIndicesSlowPath(toBigIntSlice.execute(slice), rangeBI.getBigIntegerLength(), null); + SliceObjectInfo info = PObjectSlice.computeIndicesSlowPath(toBigIntSlice.execute(slice), rangeBI.getBigIntegerLength(), false); return createRange(inliningTarget, info, rangeStart, rangeStep, lenOfRangeNode); } @@ -514,14 +671,13 @@ static Object doPRangeSliceSlowPath(VirtualFrame frame, PBigRange self, PSlice s @Shared @Cached RangeNodes.LenOfRangeNode lenOfRangeNode, @SuppressWarnings("unused") @Shared @Cached PyIndexCheckNode indexCheckNode, @Shared @Cached PyNumberAsSizeNode asSizeNode, - @Shared @Cached PythonObjectFactory factory, // unused node to avoid mixing shared and non-shared inlined nodes - @SuppressWarnings("unused") @Shared @Cached PRaiseNode.Lazy raiseNode) { + @SuppressWarnings("unused") @Shared @Cached PRaiseNode raiseNode) { try { int rStart = asSizeNode.executeExact(frame, inliningTarget, self.getStart()); int rStep = asSizeNode.executeExact(frame, inliningTarget, self.getStep()); SliceInfo info = compute.execute(frame, slice, asSizeNode.executeExact(frame, inliningTarget, self.getLength())); - return createRange(inliningTarget, info, rStart, rStep, lenOfRangeNodeExact, factory); + return createRange(inliningTarget, info, rStart, rStep, lenOfRangeNodeExact); } catch (PException pe) { pe.expect(inliningTarget, PythonBuiltinClassType.OverflowError, profileError); // pass @@ -532,7 +688,7 @@ static Object doPRangeSliceSlowPath(VirtualFrame frame, PBigRange self, PSlice s BigInteger rangeStart = rangeBI.getBigIntegerStart(); BigInteger rangeStep = rangeBI.getBigIntegerStep(); - SliceObjectInfo info = PObjectSlice.computeIndicesSlowPath(toBigIntSlice.execute(slice), rangeBI.getBigIntegerLength(), null); + SliceObjectInfo info = PObjectSlice.computeIndicesSlowPath(toBigIntSlice.execute(slice), rangeBI.getBigIntegerLength(), false); return createRange(inliningTarget, info, rangeStart, rangeStep, lenOfRangeNode); } @@ -552,24 +708,23 @@ static Object doGeneric(VirtualFrame frame, PRange self, Object idx, @Shared @Cached PyIndexCheckNode indexCheckNode, @Shared @Cached PyNumberAsSizeNode asSizeNode, @Shared @Cached IndexNodes.NormalizeIndexCustomMessageNode normalize, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { if (isNumIndexProfile.profile(inliningTarget, canBeIndex(inliningTarget, idx, indexCheckNode))) { if (self instanceof PIntRange) { return doPRange(frame, (PIntRange) self, idx, inliningTarget, indexCheckNode, asSizeNode, normalize); } - return doPRange((PBigRange) self, idx, inliningTarget, toBigInt, indexCheckNode, factory); + return doPRange((PBigRange) self, idx, inliningTarget, toBigInt, indexCheckNode); } if (isSliceIndexProfile.profile(inliningTarget, idx instanceof PSlice)) { PSlice slice = (PSlice) idx; if (self instanceof PIntRange) { return doPRangeSliceSlowPath(frame, (PIntRange) self, slice, inliningTarget, compute, profileError, toBigIntRange, toBigIntSlice, lenOfRangeNodeExact, lenOfRangeNode, - indexCheckNode, factory); + indexCheckNode); } return doPRangeSliceSlowPath(frame, (PBigRange) self, slice, inliningTarget, isNumIndexProfile, isSliceIndexProfile, compute, profileError, toBigIntRange, toBigIntSlice, - lenOfRangeNodeExact, lenOfRangeNode, indexCheckNode, asSizeNode, factory, raiseNode); + lenOfRangeNodeExact, lenOfRangeNode, indexCheckNode, asSizeNode, raiseNode); } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.OBJ_INDEX_MUST_BE_INT_OR_SLICES, "range", idx); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.OBJ_INDEX_MUST_BE_INT_OR_SLICES, "range", idx); } @TruffleBoundary @@ -594,17 +749,17 @@ private static BigInteger computeBigRangeItem(Node inliningTarget, PBigRange ran } if (i.compareTo(BigInteger.ZERO) < 0 || i.compareTo(length) >= 0) { - throw PRaiseNode.raiseUncached(inliningTarget, IndexError, ErrorMessages.RANGE_OBJ_IDX_OUT_OF_RANGE); + throw PRaiseNode.raiseStatic(inliningTarget, IndexError, ErrorMessages.RANGE_OBJ_IDX_OUT_OF_RANGE); } return i; } - private static PIntRange createRange(Node inliningTarget, SliceInfo info, int rStart, int rStep, LenOfIntRangeNodeExact lenOfRangeNode, PythonObjectFactory factory) throws OverflowException { + private static PIntRange createRange(Node inliningTarget, SliceInfo info, int rStart, int rStep, LenOfIntRangeNodeExact lenOfRangeNode) throws OverflowException { int newStep = rStep * info.step; int newStart = rStart + info.start * rStep; int newStop = rStart + info.stop * rStep; int len = lenOfRangeNode.executeInt(inliningTarget, newStart, newStop, newStep); - return factory.createIntRange(newStart, newStop, newStep, len); + return PFactory.createIntRange(PythonLanguage.get(inliningTarget), newStart, newStop, newStep, len); } @TruffleBoundary @@ -617,8 +772,8 @@ private static PBigRange createRange(Node inliningTarget, SliceObjectInfo info, BigInteger start = rStart.add(sliceStart.multiply(rStep)); BigInteger stop = rStart.add(sliceStop.multiply(rStep)); BigInteger len = lenOfRangeNode.execute(inliningTarget, start, stop, step); - PythonObjectFactory factory = PythonObjectFactory.getUncached(); - return factory.createBigRange(factory.createInt(start), factory.createInt(stop), factory.createInt(step), factory.createInt(len)); + PythonLanguage language = PythonLanguage.get(null); + return PFactory.createBigRange(language, PFactory.createInt(language, start), PFactory.createInt(language, stop), PFactory.createInt(language, step), PFactory.createInt(language, len)); } @NeverDefault @@ -631,11 +786,11 @@ public static GetItemNode getUncached() { } } - @Builtin(name = J___CONTAINS__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.sq_contains, isComplex = true) @GenerateNodeFactory @ImportStatic(PGuards.class) - @TypeSystemReference(PythonArithmeticTypes.class) - abstract static class ContainsNode extends PythonBinaryBuiltinNode { + @TypeSystemReference(PythonIntegerTypes.class) + abstract static class ContainsNode extends SqContainsBuiltinNode { private static final BigInteger MINUS_ONE = BigInteger.ONE.negate(); public abstract boolean execute(VirtualFrame frame, PRange self, Object value); @@ -789,23 +944,21 @@ static boolean containsSlowNum(PBigRange self, PInt other, static boolean containsIterator(VirtualFrame frame, PRange self, Object elem, @Bind("this") Node inliningTarget, @Cached PyObjectGetIter getIter, - @Cached GetNextNode nextNode, - @Cached PyObjectRichCompareBool.EqNode eqNode, - @Cached IsBuiltinObjectProfile errorProfile, + @Cached PyIterNextNode nextNode, + @Cached PyObjectRichCompareBool eqNode, @SuppressWarnings("unused") @Exclusive @Cached PyLongCheckExactNode isBuiltin) { Object iter = getIter.execute(frame, inliningTarget, self); while (true) { + Object item; try { - Object item = nextNode.execute(frame, iter); - if (eqNode.compare(frame, inliningTarget, elem, item)) { - return true; - } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - break; + item = nextNode.execute(frame, inliningTarget, iter); + } catch (IteratorExhausted e) { + return false; + } + if (eqNode.executeEq(frame, inliningTarget, elem, item)) { + return true; } } - return false; } @NeverDefault @@ -843,14 +996,14 @@ private static BigInteger slowIntIndex(Node inliningTarget, PBigRange self, Obje static int doFastRange(VirtualFrame frame, PIntRange self, int elem, @Bind("this") Node inliningTarget, @Shared @Cached ContainsNode containsNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (containsNode.execute(frame, self, elem)) { int index = fastIntIndex(self, elem); if (index != -1) { return index; } } - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.D_IS_NOT_IN_RANGE, elem); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.D_IS_NOT_IN_RANGE, elem); } @Specialization(guards = "canBeInteger(elem)") @@ -858,7 +1011,7 @@ static Object doFastRangeGeneric(VirtualFrame frame, PIntRange self, Object elem @Bind("this") Node inliningTarget, @Shared @Cached ContainsNode containsNode, @Cached PyNumberAsSizeNode asSizeNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (containsNode.execute(frame, self, elem)) { int value = asSizeNode.executeExact(frame, inliningTarget, elem); int index = fastIntIndex(self, value); @@ -866,7 +1019,7 @@ static Object doFastRangeGeneric(VirtualFrame frame, PIntRange self, Object elem return index; } } - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.IS_NOT_IN_RANGE, elem); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.IS_NOT_IN_RANGE, elem); } @Specialization(guards = "canBeInteger(elem)") @@ -874,15 +1027,14 @@ static Object doLongRange(VirtualFrame frame, PBigRange self, Object elem, @Bind("this") Node inliningTarget, @Shared @Cached ContainsNode containsNode, @Cached CastToJavaBigIntegerNode castToBigInt, - @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { if (containsNode.execute(frame, self, elem)) { BigInteger index = slowIntIndex(inliningTarget, self, elem, castToBigInt); if (index != null) { - return factory.createInt(index); + return PFactory.createInt(PythonLanguage.get(inliningTarget), index); } } - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.D_IS_NOT_IN_RANGE, elem); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.D_IS_NOT_IN_RANGE, elem); } /** @@ -892,29 +1044,28 @@ static Object doLongRange(VirtualFrame frame, PBigRange self, Object elem, @Specialization(guards = "!canBeInteger(elem)") static Object containsIterator(VirtualFrame frame, PIntRange self, Object elem, @Bind("this") Node inliningTarget, - @Cached GetNextNode nextNode, @Cached PyObjectGetIter getIter, - @Cached PyObjectRichCompareBool.EqNode eqNode, - @Cached IsBuiltinObjectProfile errorProfile, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Cached PyIterNextNode nextNode, + @Cached PyObjectRichCompareBool eqNode, + @Exclusive @Cached PRaiseNode raiseNode) { int idx = 0; Object iter = getIter.execute(frame, inliningTarget, self); while (true) { + Object item; try { - Object item = nextNode.execute(frame, iter); - if (eqNode.compare(frame, inliningTarget, elem, item)) { - return idx; - } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); + item = nextNode.execute(frame, inliningTarget, iter); + } catch (IteratorExhausted e) { break; } + if (eqNode.executeEq(frame, inliningTarget, elem, item)) { + return idx; + } if (idx == SysModuleBuiltins.MAXSIZE) { - throw raiseNode.get(inliningTarget).raiseOverflow(); + throw raiseNode.raiseOverflow(inliningTarget); } idx++; } - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.D_IS_NOT_IN_RANGE, elem); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.D_IS_NOT_IN_RANGE, elem); } } @@ -992,27 +1143,25 @@ static boolean isFallback(Object value) { static int doGeneric(VirtualFrame frame, PRange self, Object elem, @Bind("this") Node inliningTarget, @Cached PyObjectGetIter getIter, - @Cached GetNextNode nextNode, - @Cached PyObjectRichCompareBool.EqNode eqNode, - @Cached IsBuiltinObjectProfile errorProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PyIterNextNode nextNode, + @Cached PyObjectRichCompareBool eqNode, + @Cached PRaiseNode raiseNode) { int count = 0; Object iter = getIter.execute(frame, inliningTarget, self); while (true) { + Object item; try { - Object item = nextNode.execute(frame, iter); - if (eqNode.compare(frame, inliningTarget, elem, item)) { - if (count == SysModuleBuiltins.MAXSIZE) { - throw raiseNode.get(inliningTarget).raiseOverflow(); - } - count = count + 1; + item = nextNode.execute(frame, inliningTarget, iter); + } catch (IteratorExhausted e) { + return count; + } + if (eqNode.executeEq(frame, inliningTarget, elem, item)) { + if (count == SysModuleBuiltins.MAXSIZE) { + throw raiseNode.raiseOverflow(inliningTarget); } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - break; + count = count + 1; } } - return count; } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/range/RangeNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/range/RangeNodes.java index 057719c193..ef29cc7899 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/range/RangeNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/range/RangeNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,12 +45,13 @@ import java.math.BigInteger; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.slice.PSlice.SliceInfo; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.SpecialMethodNames; import com.oracle.graal.python.nodes.util.CastToJavaBigIntegerNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.OverflowException; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; @@ -72,9 +73,9 @@ public abstract static class CreateBigRangeNode extends Node { public abstract PBigRange execute(Node inliningTarget, Object start, Object stop, Object step); @TruffleBoundary - private static void checkStepZero(Node inliningTarget, BigInteger stepBI, PRaiseNode.Lazy raise) { + private static void checkStepZero(Node inliningTarget, BigInteger stepBI, PRaiseNode raise) { if (stepBI.compareTo(BigInteger.ZERO) == 0) { - throw raise.get(inliningTarget).raise(ValueError, ARG_MUST_NOT_BE_ZERO, "range()", 3); + throw raise.raise(inliningTarget, ValueError, ARG_MUST_NOT_BE_ZERO, "range()", 3); } } @@ -84,14 +85,15 @@ static PBigRange createBigRange(Node inliningTarget, Object start, Object stop, @Cached CastToJavaBigIntegerNode startToBI, @Cached CastToJavaBigIntegerNode stopToBI, @Cached CastToJavaBigIntegerNode stepToBI, - @Cached PRaiseNode.Lazy raise, - @Cached(inline = false) PythonObjectFactory factory) { + @Cached PRaiseNode raise) { BigInteger stepBI = stepToBI.execute(inliningTarget, step); checkStepZero(inliningTarget, stepBI, raise); BigInteger startBI = startToBI.execute(inliningTarget, start); BigInteger stopBI = stopToBI.execute(inliningTarget, stop); BigInteger len = lenOfRangeNode.execute(inliningTarget, startBI, stopBI, stepBI); - return factory.createBigRange(factory.createInt(startBI), factory.createInt(stopBI), factory.createInt(stepBI), factory.createInt(len)); + PythonLanguage language = PythonLanguage.get(inliningTarget); + return PFactory.createBigRange(language, PFactory.createInt(language, startBI), PFactory.createInt(language, stopBI), PFactory.createInt(language, stepBI), + PFactory.createInt(language, len)); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/referencetype/PReferenceType.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/referencetype/PReferenceType.java index 204448a4ec..b528f8efdc 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/referencetype/PReferenceType.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/referencetype/PReferenceType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -51,7 +51,7 @@ public class PReferenceType extends PythonBuiltinObject { public static class WeakRefStorage extends WeakReference { - private final Object callback; + private Object callback; private final PReferenceType ref; private final long pointer; @@ -72,7 +72,7 @@ public PReferenceType getRef() { /** * get the native pointer of the referent. - * + * * @return the native pointer if referent is a native reference, otherwise, 0. */ public long getPointer() { @@ -80,7 +80,7 @@ public long getPointer() { } } - private final WeakRefStorage store; + private WeakRefStorage store; private long hash = -1; @TruffleBoundary @@ -89,16 +89,40 @@ public PReferenceType(Object cls, Shape instanceShape, Object pythonObject, Obje this.store = new WeakRefStorage(this, pythonObject, callback, queue); } + /** + * In CPython, this functions clears the reference without calling the callback. This is not + * exactly what we can do here since the WeakRefStorage is already enqueued. We clear the + * callback so that when the Java WeakReference is enqueued because the Object was collected, + * there is no callback to run anymore, and we also drop the store reference here entirely so + * that the object is not longer reachable through this weakref. + */ + public void clearRef() { + WeakRefStorage s = this.store; + if (s != null) { + s.callback = null; + this.store = null; + } + } + public Object getCallback() { - if (this.store.callback == null) { + Object callback = null; + WeakRefStorage s = this.store; + if (s != null) { + callback = s.callback; + } + if (callback == null) { return PNone.NONE; } - return this.store.callback; + return callback; } @TruffleBoundary public Object getObject() { - return this.store.get(); + WeakRefStorage s = this.store; + if (s != null) { + return s.get(); + } + return null; } public Object getPyObject() { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/referencetype/ReferenceTypeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/referencetype/ReferenceTypeBuiltins.java index 0cc8893301..db79c0854a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/referencetype/ReferenceTypeBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/referencetype/ReferenceTypeBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,45 +41,65 @@ package com.oracle.graal.python.builtins.objects.referencetype; import static com.oracle.graal.python.builtins.objects.PythonAbstractObject.objectHashCode; +import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_weaklistoffset; +import static com.oracle.graal.python.nodes.HiddenAttr.WEAKLIST; +import static com.oracle.graal.python.nodes.HiddenAttr.WEAK_REF_QUEUE; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALLBACK__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CLASS_GETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; +import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; +import java.lang.ref.ReferenceQueue; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.PythonAbstractObject; +import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; +import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; +import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; +import com.oracle.graal.python.builtins.objects.referencetype.ReferenceTypeBuiltinsFactory.ReferenceTypeNodeFactory; import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; +import com.oracle.graal.python.builtins.objects.type.PythonClass; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.HashBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare.RichCmpBuiltinNode; import com.oracle.graal.python.lib.PyObjectHashNode; import com.oracle.graal.python.lib.PyObjectLookupAttr; +import com.oracle.graal.python.lib.PyObjectRichCompare; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.HiddenAttr; +import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.expression.BinaryComparisonNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.object.BuiltinClassProfiles; import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; @@ -89,12 +109,144 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PReferenceType) public final class ReferenceTypeBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = ReferenceTypeBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return ReferenceTypeBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 3) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "ReferenceType", minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 3, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class ReferenceTypeNode extends PythonBuiltinNode { + @Child private CStructAccess.ReadI64Node getTpWeaklistoffsetNode; + + public abstract PReferenceType execute(Object cls, Object object, Object callback); + + @Specialization(guards = "!isNativeObject(object)") + static PReferenceType refType(Object cls, Object object, @SuppressWarnings("unused") PNone none, + @Bind("this") Node inliningTarget, + @Cached.Exclusive @Cached GetClassNode getClassNode, + @Cached HiddenAttr.ReadNode readWeaklistNode, + @Cached HiddenAttr.WriteNode writeWeakListNode, + @Bind PythonLanguage language, + @Cached.Exclusive @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Cached.Exclusive @Cached HiddenAttr.ReadNode readQueueNode, + @Cached.Exclusive @Cached PRaiseNode raiseNode) { + Object obj = object; + if (object instanceof PythonBuiltinClassType tobj) { + obj = PythonContext.get(inliningTarget).getCore().lookupType(tobj); + } + + Object clazz = getClassNode.execute(inliningTarget, obj); + boolean allowed = true; + if (clazz instanceof PythonBuiltinClassType type) { + allowed = type.getWeaklistoffset() != 0; + } + if (!allowed) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANNOT_CREATE_WEAK_REFERENCE_TO, obj); + } + assert obj instanceof PythonAbstractObject; + Object wr = readWeaklistNode.execute(inliningTarget, (PythonAbstractObject) obj, WEAKLIST, null); + if (wr != null) { + return (PReferenceType) wr; // is must be a PReferenceType instance. + } + + PReferenceType ref = PFactory.createReferenceType(language, cls, getInstanceShape.execute(cls), obj, null, getWeakReferenceQueue(inliningTarget, readQueueNode)); + writeWeakListNode.execute(inliningTarget, (PythonAbstractObject) obj, WEAKLIST, ref); + return ref; + } + + @Specialization(guards = {"!isNativeObject(object)", "!isPNone(callback)"}) + static PReferenceType refTypeWithCallback(Object cls, Object object, Object callback, + @Bind("this") Node inliningTarget, + @Cached.Exclusive @Cached HiddenAttr.ReadNode readQueueNode, + @Bind PythonLanguage language, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createReferenceType(language, cls, getInstanceShape.execute(cls), object, callback, getWeakReferenceQueue(inliningTarget, readQueueNode)); + } + + @Specialization + @SuppressWarnings("truffle-static-method") + PReferenceType refType(Object cls, PythonAbstractNativeObject pythonObject, Object callback, + @Bind("this") Node inliningTarget, + @Cached.Exclusive @Cached GetClassNode getClassNode, + @Cached BuiltinClassProfiles.IsBuiltinClassExactProfile profile, + @Cached TypeNodes.GetMroNode getMroNode, + @Bind PythonLanguage language, + @Shared @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Cached.Exclusive @Cached HiddenAttr.ReadNode readQueueNode, + @Cached.Exclusive @Cached PRaiseNode raiseNode) { + Object actualCallback = callback instanceof PNone ? null : callback; + Object clazz = getClassNode.execute(inliningTarget, pythonObject); + + // if the object is a type, a weak ref is allowed + boolean allowed = false; + if (profile.profileClass(inliningTarget, clazz, PythonBuiltinClassType.PythonClass)) { + allowed = true; + } else { + // if the object's type is a native type, we need to consider 'tp_weaklistoffset' + if (PGuards.isNativeClass(clazz) || clazz instanceof PythonClass && ((PythonClass) clazz).needsNativeAllocation()) { + for (Object base : getMroNode.execute(inliningTarget, clazz)) { + if (PGuards.isNativeClass(base)) { + if (getTpWeaklistoffsetNode == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + getTpWeaklistoffsetNode = insert(CStructAccess.ReadI64Node.create()); + } + long tpWeaklistoffset = getTpWeaklistoffsetNode.readFromObj((PythonNativeClass) base, PyTypeObject__tp_weaklistoffset); + if (tpWeaklistoffset != 0) { + allowed = true; + break; + } + } else if (base instanceof PythonClass /* not PythonBuiltinClass */) { + // any subclass of a normal (non-builtin) class supports weakrefs + allowed = true; + break; + } + } + } + } + if (allowed) { + CApiTransitions.addNativeWeakRef(getContext(), pythonObject); + return PFactory.createReferenceType(language, cls, getInstanceShape.execute(cls), pythonObject, actualCallback, getWeakReferenceQueue(inliningTarget, readQueueNode)); + } else { + return refType(cls, pythonObject, actualCallback, raiseNode); + } + } + + @Fallback + static PReferenceType refType(@SuppressWarnings("unused") Object cls, Object object, @SuppressWarnings("unused") Object callback, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CANNOT_CREATE_WEAK_REFERENCE_TO, object); + } + + @SuppressWarnings("unchecked") + private static ReferenceQueue getWeakReferenceQueue(Node inliningTarget, HiddenAttr.ReadNode readNode) { + PythonContext context = PythonContext.get(inliningTarget); + Object queueObject = readNode.execute(inliningTarget, context.lookupType(PythonBuiltinClassType.PReferenceType), WEAK_REF_QUEUE, null); + if (queueObject != null) { + return (ReferenceQueue) queueObject; + } else { + if (context.isCoreInitialized()) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + throw new IllegalStateException("the weak reference queue was modified!"); + } else { + // returning a null reference queue is fine, it just means + // that the finalizer won't run + return null; + } + } + } + + @NeverDefault + public static ReferenceTypeNode create() { + return ReferenceTypeNodeFactory.create(null); + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "ref", minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 3) @GenerateNodeFactory public abstract static class InitNode extends PythonTernaryBuiltinNode { @Specialization @@ -115,7 +267,8 @@ public Object getCallback(PReferenceType self) { } // ref.__call__() - @Builtin(name = J___CALL__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_call, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1) @GenerateNodeFactory public abstract static class RefTypeCallNode extends PythonBuiltinNode { @Specialization @@ -125,9 +278,9 @@ public Object call(PReferenceType self) { } // ref.__hash__ - @Builtin(name = J___HASH__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_hash, isComplex = true) @GenerateNodeFactory - public abstract static class RefTypeHashNode extends PythonUnaryBuiltinNode { + public abstract static class RefTypeHashNode extends HashBuiltinNode { static long HASH_UNSET = -1; @Specialization(guards = "self.getHash() != HASH_UNSET") @@ -140,28 +293,28 @@ static long computeHash(VirtualFrame frame, PReferenceType self, @Bind("this") Node inliningTarget, @Cached InlinedConditionProfile referentProfile, @Cached PyObjectHashNode hashNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object referent = self.getObject(); if (referentProfile.profile(inliningTarget, referent != null)) { long hash = hashNode.execute(frame, inliningTarget, referent); self.setHash(hash); return hash; } else { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.WEAK_OBJ_GONE_AWAY); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.WEAK_OBJ_GONE_AWAY); } } @Fallback - static int hashWrong(@SuppressWarnings("unused") Object self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, "__hash__", "weakref", self); + static long hashWrong(@SuppressWarnings("unused") Object self, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, "__hash__", "weakref", self); } } // ref.__repr__ - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory - abstract static class RefTypeReprNode extends PythonBuiltinNode { + abstract static class RefTypeReprNode extends PythonUnaryBuiltinNode { @Specialization(guards = "self.getObject() == null") static TruffleString repr(PReferenceType self, @Shared("formatter") @Cached SimpleTruffleStringFormatNode simpleTruffleStringFormatNode) { @@ -193,46 +346,25 @@ private static String toStr(Object o) { } } - // ref.__eq__ - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - public abstract static class RefTypeEqNode extends PythonBuiltinNode { - @Specialization(guards = {"self.getObject() != null", "other.getObject() != null"}) - Object eq(VirtualFrame frame, PReferenceType self, PReferenceType other, - @Cached BinaryComparisonNode.EqNode eqNode) { - return eqNode.executeObject(frame, self.getObject(), other.getObject()); - } - - @Specialization(guards = "self.getObject() == null || other.getObject() == null") - boolean eq(PReferenceType self, PReferenceType other) { - return self == other; - } - - @Fallback - @SuppressWarnings("unused") - Object eq(Object self, Object other) { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - - // ref.__ne__ - @Builtin(name = J___NE__, minNumOfPositionalArgs = 2) + // ref.__eq__ and __ne__ + @Slot(value = SlotKind.tp_richcompare, isComplex = true) @GenerateNodeFactory - public abstract static class RefTypeNeNode extends PythonBuiltinNode { - @Specialization(guards = {"self.getObject() != null", "other.getObject() != null"}) - Object ne(VirtualFrame frame, PReferenceType self, PReferenceType other, - @Cached BinaryComparisonNode.NeNode neNode) { - return neNode.executeObject(frame, self.getObject(), other.getObject()); + public abstract static class RefTypeEqNode extends RichCmpBuiltinNode { + @Specialization(guards = {"self.getObject() != null", "other.getObject() != null", "op.isEqOrNe()"}) + static Object withObjs(VirtualFrame frame, PReferenceType self, PReferenceType other, RichCmpOp op, + @Bind("$node") Node inliningTarget, + @Cached PyObjectRichCompare richCompareNode) { + return richCompareNode.execute(frame, inliningTarget, self.getObject(), other.getObject(), op); } - @Specialization(guards = "self.getObject() == null || other.getObject() == null") - boolean ne(PReferenceType self, PReferenceType other) { - return self != other; + @Specialization(guards = {"self.getObject() == null || other.getObject() == null", "op.isEqOrNe()"}) + static boolean withoutObjs(PReferenceType self, PReferenceType other, RichCmpOp op) { + return (self == other) == op.isEq(); } @Fallback @SuppressWarnings("unused") - Object eq(Object self, Object other) { + static Object others(Object self, Object other, RichCmpOp op) { return PNotImplemented.NOT_IMPLEMENTED; } } @@ -242,8 +374,8 @@ Object eq(Object self, Object other) { public abstract static class ClassGetItemNode extends PythonBinaryBuiltinNode { @Specialization static Object classGetItem(Object cls, Object key, - @Cached PythonObjectFactory factory) { - return factory.createGenericAlias(cls, key); + @Bind PythonLanguage language) { + return PFactory.createGenericAlias(language, cls, key); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/reversed/ReversedBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/reversed/ReversedBuiltins.java index b90831ab25..cc94bad098 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/reversed/ReversedBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/reversed/ReversedBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -25,46 +25,72 @@ */ package com.oracle.graal.python.builtins.objects.reversed; +import static com.oracle.graal.python.nodes.BuiltinNames.J_REVERSED; import static com.oracle.graal.python.nodes.ErrorMessages.OBJ_HAS_NO_LEN; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LENGTH_HINT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETSTATE__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; +import static com.oracle.graal.python.util.PythonUtils.addExact; +import static com.oracle.graal.python.util.PythonUtils.multiplyExact; +import static com.oracle.graal.python.util.PythonUtils.negateExact; +import static com.oracle.graal.python.util.PythonUtils.subtractExact; +import java.math.BigInteger; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.common.SequenceNodes; +import com.oracle.graal.python.builtins.objects.iterator.PBigRangeIterator; import com.oracle.graal.python.builtins.objects.iterator.PBuiltinIterator; +import com.oracle.graal.python.builtins.objects.object.PythonObject; +import com.oracle.graal.python.builtins.objects.range.PBigRange; +import com.oracle.graal.python.builtins.objects.range.PIntRange; +import com.oracle.graal.python.builtins.objects.str.PString; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyObjectSizeNode; +import com.oracle.graal.python.lib.PySequenceCheckNode; import com.oracle.graal.python.lib.PySequenceGetItemNode; +import com.oracle.graal.python.lib.PySequenceSizeNode; +import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; +import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.graal.python.util.OverflowException; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.strings.TruffleString; @CoreFunctions(extendClasses = PythonBuiltinClassType.PReverseIterator) @@ -75,27 +101,118 @@ public final class ReversedBuiltins extends PythonBuiltins { * class. */ + public static final TpSlots SLOTS = ReversedBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return ReversedBuiltinsFactory.getFactories(); } - @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1) + // reversed(seq) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_REVERSED, minNumOfPositionalArgs = 2) @GenerateNodeFactory - public abstract static class NextNode extends PythonUnaryBuiltinNode { + public abstract static class ReversedNode extends PythonBuiltinNode { - @Specialization(guards = "self.isExhausted()") - static Object exhausted(@SuppressWarnings("unused") PBuiltinIterator self, + @Specialization + static PythonObject reversed(@SuppressWarnings("unused") Object cls, PIntRange range, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Cached InlinedBranchProfile overflowProfile) { + int lstart = range.getIntStart(); + int lstep = range.getIntStep(); + int ulen = range.getIntLength(); + try { + int new_stop = subtractExact(lstart, lstep); + int new_start = addExact(new_stop, multiplyExact(ulen, lstep)); + return PFactory.createIntRangeIterator(language, new_start, new_stop, negateExact(lstep), ulen); + } catch (OverflowException e) { + overflowProfile.enter(inliningTarget); + return handleOverflow(language, lstart, lstep, ulen); + } + } + + @CompilerDirectives.TruffleBoundary + private static PBigRangeIterator handleOverflow(PythonLanguage language, int lstart, int lstep, int ulen) { + BigInteger bstart = BigInteger.valueOf(lstart); + BigInteger bstep = BigInteger.valueOf(lstep); + BigInteger blen = BigInteger.valueOf(ulen); + BigInteger new_stop = bstart.subtract(bstep); + BigInteger new_start = new_stop.add(blen.multiply(bstep)); + + return PFactory.createBigRangeIterator(language, new_start, new_stop, bstep.negate(), blen); + } + + @Specialization + @CompilerDirectives.TruffleBoundary + static PythonObject reversed(@SuppressWarnings("unused") Object cls, PBigRange range) { + BigInteger lstart = range.getBigIntegerStart(); + BigInteger lstep = range.getBigIntegerStep(); + BigInteger ulen = range.getBigIntegerLength(); + + BigInteger new_stop = lstart.subtract(lstep); + BigInteger new_start = new_stop.add(ulen.multiply(lstep)); + + return PFactory.createBigRangeIterator(PythonLanguage.get(null), new_start, new_stop, lstep.negate(), ulen); + } + + @Specialization + static PythonObject reversed(Object cls, PString value, + @Bind("this") Node inliningTarget, + @Cached CastToTruffleStringNode castToStringNode, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createStringReverseIterator(language, cls, getInstanceShape.execute(cls), castToStringNode.execute(inliningTarget, value)); + } + + @Specialization + static PythonObject reversed(Object cls, TruffleString value, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createStringReverseIterator(language, cls, getInstanceShape.execute(cls), value); + } + + @Specialization(guards = {"!isString(sequence)", "!isPRange(sequence)"}) + static Object reversed(VirtualFrame frame, Object cls, Object sequence, + @Bind("this") Node inliningTarget, + @Cached GetClassNode getClassNode, + @Cached("create(T___REVERSED__)") LookupSpecialMethodNode lookupReversed, + @Cached CallUnaryMethodNode callReversed, + @Cached PySequenceSizeNode pySequenceSizeNode, + @Cached InlinedConditionProfile noReversedProfile, + @Cached PySequenceCheckNode pySequenceCheck, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape, @Cached PRaiseNode raiseNode) { - throw raiseNode.raiseStopIteration(); + Object sequenceKlass = getClassNode.execute(inliningTarget, sequence); + Object reversed = lookupReversed.execute(frame, sequenceKlass, sequence); + if (noReversedProfile.profile(inliningTarget, reversed == PNone.NO_VALUE)) { + if (!pySequenceCheck.execute(inliningTarget, sequence)) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.OBJ_ISNT_REVERSIBLE, sequence); + } else { + int lengthHint = pySequenceSizeNode.execute(frame, inliningTarget, sequence); + return PFactory.createSequenceReverseIterator(language, cls, getInstanceShape.execute(cls), sequence, lengthHint); + } + } else { + return callReversed.executeObject(frame, reversed, sequence); + } + } + } + + @Slot(value = SlotKind.tp_iternext, isComplex = true) + @GenerateNodeFactory + public abstract static class NextNode extends TpIterNextBuiltin { + + @Specialization(guards = "self.isExhausted()") + static Object exhausted(@SuppressWarnings("unused") PBuiltinIterator self) { + throw iteratorExhausted(); } @Specialization(guards = "!self.isExhausted()") static Object next(VirtualFrame frame, PSequenceReverseIterator self, @Bind("this") Node inliningTarget, @Cached PySequenceGetItemNode getItemNode, - @Cached IsBuiltinObjectProfile profile, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Cached IsBuiltinObjectProfile profile) { if (self.index >= 0) { try { return getItemNode.execute(frame, self.getObject(), self.index--); @@ -104,23 +221,21 @@ static Object next(VirtualFrame frame, PSequenceReverseIterator self, } } self.setExhausted(); - throw raiseNode.get(inliningTarget).raiseStopIteration(); + throw iteratorExhausted(); } @Specialization(guards = "!self.isExhausted()") static Object next(PStringReverseIterator self, - @Bind("this") Node inliningTarget, - @Cached TruffleString.SubstringNode substringNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Cached TruffleString.SubstringNode substringNode) { if (self.index >= 0) { return substringNode.execute(self.value, self.index--, 1, TS_ENCODING, false); } self.setExhausted(); - throw raiseNode.get(inliningTarget).raiseStopIteration(); + throw iteratorExhausted(); } } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory public abstract static class IterNode extends PythonUnaryBuiltinNode { @@ -148,10 +263,10 @@ static int lengthHint(PStringReverseIterator self) { static int lengthHint(PSequenceReverseIterator self, @Bind("this") Node inliningTarget, @Cached SequenceNodes.LenNode lenNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int len = lenNode.execute(inliningTarget, self.getPSequence()); if (len == -1) { - throw raiseNode.get(inliningTarget).raise(TypeError, OBJ_HAS_NO_LEN, self); + throw raiseNode.raise(inliningTarget, TypeError, OBJ_HAS_NO_LEN, self); } if (len < self.index) { return 0; @@ -179,22 +294,22 @@ public abstract static class ReduceNode extends PythonUnaryBuiltinNode { static Object reduce(PStringReverseIterator self, @Bind("this") Node inliningTarget, @Shared("getClassNode") @Cached GetClassNode getClassNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { if (self.isExhausted()) { - return reduceInternal(inliningTarget, self, "", null, getClassNode, factory); + return reduceInternal(inliningTarget, self, "", null, getClassNode, language); } - return reduceInternal(inliningTarget, self, self.value, self.index, getClassNode, factory); + return reduceInternal(inliningTarget, self, self.value, self.index, getClassNode, language); } @Specialization(guards = "self.isPSequence()") static Object reduce(PSequenceReverseIterator self, @Bind("this") Node inliningTarget, @Shared("getClassNode") @Cached GetClassNode getClassNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { if (self.isExhausted()) { - return reduceInternal(inliningTarget, self, factory.createList(), null, getClassNode, factory); + return reduceInternal(inliningTarget, self, PFactory.createList(language), null, getClassNode, language); } - return reduceInternal(inliningTarget, self, self.getPSequence(), self.index, getClassNode, factory); + return reduceInternal(inliningTarget, self, self.getPSequence(), self.index, getClassNode, language); } @Specialization(guards = "!self.isPSequence()") @@ -202,19 +317,19 @@ static Object reduce(VirtualFrame frame, PSequenceReverseIterator self, @Bind("this") Node inliningTarget, @Cached("create(T___REDUCE__)") LookupAndCallUnaryNode callReduce, @Shared("getClassNode") @Cached GetClassNode getClassNode, - @Shared @Cached PythonObjectFactory factory) { - Object content = callReduce.executeObject(frame, self.getPSequence()); - return reduceInternal(inliningTarget, self, content, self.index, getClassNode, factory); + @Bind PythonLanguage language) { + Object content = callReduce.executeObject(frame, self.getObject()); + return reduceInternal(inliningTarget, self, content, self.index, getClassNode, language); } - private static PTuple reduceInternal(Node inliningTarget, Object self, Object arg, Object state, GetClassNode getClassNode, PythonObjectFactory factory) { + private static PTuple reduceInternal(Node inliningTarget, Object self, Object arg, Object state, GetClassNode getClassNode, PythonLanguage language) { Object revIter = getClassNode.execute(inliningTarget, self); - PTuple args = factory.createTuple(new Object[]{arg}); + PTuple args = PFactory.createTuple(language, new Object[]{arg}); // callable, args, state (optional) if (state != null) { - return factory.createTuple(new Object[]{revIter, args, state}); + return PFactory.createTuple(language, new Object[]{revIter, args, state}); } else { - return factory.createTuple(new Object[]{revIter, args}); + return PFactory.createTuple(language, new Object[]{revIter, args}); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/set/BaseSetBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/set/BaseSetBuiltins.java index ce4dfb071c..918371c29e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/set/BaseSetBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/set/BaseSetBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,17 +41,7 @@ package com.oracle.graal.python.builtins.objects.set; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CLASS_GETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CONTAINS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RSUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SUB__; import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA_SPACE; import static com.oracle.graal.python.nodes.StringLiterals.T_ELLIPSIS_IN_PARENS; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_PARENS; @@ -63,19 +53,18 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.PNotImplemented; import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes; import com.oracle.graal.python.builtins.objects.common.HashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageAreDisjoint; -import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageCompareKeys; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageCopy; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetItem; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetIterator; @@ -83,26 +72,31 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIteratorKey; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIteratorNext; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageLen; +import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.IsKeysSubset; import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqContains.SqContainsBuiltinNode; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.lib.PyObjectGetStateNode; import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; @@ -127,7 +121,7 @@ protected List> getNodeFa return BaseSetBuiltinsFactory.getFactories(); } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class BaseReprNode extends PythonUnaryBuiltinNode { private static void fillItems(VirtualFrame frame, Node inliningTarget, HashingStorage storage, TruffleStringBuilder sb, PyObjectReprAsTruffleStringNode repr, @@ -190,7 +184,7 @@ public static Object repr(VirtualFrame frame, PBaseSet self, } } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory protected abstract static class BaseIterNode extends PythonUnaryBuiltinNode { @Specialization @@ -198,9 +192,9 @@ static Object doBaseSet(PBaseSet self, @Bind("this") Node inliningTarget, @Cached HashingStorageLen lenNode, @Cached HashingStorageGetIterator getIterator, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { HashingStorage storage = self.getDictStorage(); - return factory.createBaseSetIterator(self, getIterator.execute(inliningTarget, storage), lenNode.execute(inliningTarget, storage)); + return PFactory.createBaseSetIterator(language, self, getIterator.execute(inliningTarget, storage), lenNode.execute(inliningTarget, storage)); } } @@ -229,7 +223,7 @@ static Object reduce(VirtualFrame frame, PBaseSet self, @Cached HashingStorageIteratorKey getIterKey, @Cached GetClassNode getClassNode, @Cached PyObjectGetStateNode getStateNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { HashingStorage storage = self.getDictStorage(); int len = lenNode.execute(inliningTarget, storage); Object[] keysArray = new Object[len]; @@ -239,32 +233,70 @@ static Object reduce(VirtualFrame frame, PBaseSet self, assert hasNext; keysArray[i] = getIterKey.execute(inliningTarget, storage, it); } - PTuple contents = factory.createTuple(new Object[]{factory.createList(keysArray)}); + PTuple contents = PFactory.createTuple(language, new Object[]{PFactory.createList(language, keysArray)}); Object state = getStateNode.execute(frame, inliningTarget, self); - return factory.createTuple(new Object[]{getClassNode.execute(inliningTarget, self), contents, state}); + return PFactory.createTuple(language, new Object[]{getClassNode.execute(inliningTarget, self), contents, state}); } } - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.tp_richcompare, isComplex = true) @GenerateNodeFactory - protected abstract static class BaseEqNode extends PythonBinaryBuiltinNode { + protected abstract static class BaseSetRichCmpNode extends TpSlotRichCompare.RichCmpBuiltinNode { + static boolean lengthsMismatch(int len1, int len2, RichCmpOp op) { + return switch (op) { + case Py_EQ -> len1 != len2; + case Py_LT -> len1 >= len2; + case Py_GT -> len1 <= len2; + case Py_LE -> len1 > len2; + case Py_GE -> len1 < len2; + case Py_NE -> throw CompilerDirectives.shouldNotReachHere(); + }; + } + @Specialization - static boolean doSetSameType(VirtualFrame frame, PBaseSet self, PBaseSet other, + static Object doIt(VirtualFrame frame, PBaseSet self, PBaseSet other, RichCmpOp opIn, @Bind("this") Node inliningTarget, - @Cached HashingStorageCompareKeys compareKeys) { - return compareKeys.execute(frame, inliningTarget, self.getDictStorage(), other.getDictStorage()) == 0; + @Cached HashingStorageLen lenSelfNode, + @Cached HashingStorageLen lenOtherNode, + @Cached InlinedConditionProfile sizeProfile, + @Cached IsKeysSubset issubsetNode) { + boolean wasNe = opIn.isNe(); + RichCmpOp op = opIn; + if (wasNe) { + op = RichCmpOp.Py_EQ; + } + + final int len1 = lenSelfNode.execute(inliningTarget, self.getDictStorage()); + final int len2 = lenOtherNode.execute(inliningTarget, other.getDictStorage()); + if (sizeProfile.profile(inliningTarget, lengthsMismatch(len1, len2, op))) { + return wasNe; + } + + PBaseSet left, right; + if (op.isEq() || op.isLe() || op.isLt()) { + left = self; + right = other; + } else { + left = other; + right = self; + } + boolean result = issubsetNode.execute(frame, inliningTarget, left.getDictStorage(), right.getDictStorage()); + if (wasNe) { + return !result; + } + return result; } @Fallback @SuppressWarnings("unused") - static PNotImplemented doGeneric(Object self, Object other) { + static PNotImplemented doGeneric(Object self, Object other, RichCmpOp op) { return PNotImplemented.NOT_IMPLEMENTED; } } - @Builtin(name = J___CONTAINS__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.sq_contains, isComplex = true) @GenerateNodeFactory - protected abstract static class BaseContainsNode extends PythonBinaryBuiltinNode { + protected abstract static class BaseContainsNode extends SqContainsBuiltinNode { @Specialization static boolean contains(VirtualFrame frame, PBaseSet self, Object key, @@ -275,23 +307,34 @@ static boolean contains(VirtualFrame frame, PBaseSet self, Object key, } } - @Builtin(name = J___SUB__, minNumOfPositionalArgs = 2) - @Builtin(name = J___RSUB__, minNumOfPositionalArgs = 2, reverseOperation = true) + @GenerateInline + @GenerateCached(false) + abstract static class CreateSetNode extends Node { + public abstract PBaseSet execute(Node inliningTarget, HashingStorage storage, PBaseSet template); + + @Specialization + static PBaseSet doSet(HashingStorage storage, @SuppressWarnings("unused") PSet template, + @Bind PythonLanguage language) { + return PFactory.createSet(language, storage); + } + + @Specialization + static PBaseSet doFrozenSet(HashingStorage storage, @SuppressWarnings("unused") PFrozenSet template, + @Bind PythonLanguage language) { + return PFactory.createFrozenSet(language, storage); + } + } + + @Slot(value = SlotKind.nb_subtract, isComplex = true) @GenerateNodeFactory - abstract static class SubNode extends PythonBinaryBuiltinNode { + abstract static class SubNode extends BinaryOpBuiltinNode { @Specialization static PBaseSet doPBaseSet(@SuppressWarnings("unused") VirtualFrame frame, PBaseSet left, PBaseSet right, @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile leftProfile, - @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, @Cached HashingStorageNodes.HashingStorageDiff diffNode, - @Cached PythonObjectFactory factory) { - HashingStorage storage = diffNode.execute(frame, inliningTarget, left.getDictStorage(), getSetStorageNode.execute(frame, inliningTarget, right)); - if (leftProfile.profile(inliningTarget, left instanceof PFrozenSet)) { - return factory.createFrozenSet(storage); - } else { - return factory.createSet(storage); - } + @Cached CreateSetNode createSetNode) { + HashingStorage storage = diffNode.execute(frame, inliningTarget, left.getDictStorage(), right.getDictStorage()); + return createSetNode.execute(inliningTarget, storage, left); } @Fallback @@ -301,6 +344,79 @@ static Object doOther(Object self, Object other) { } } + @Slot(value = SlotKind.nb_and, isComplex = true) + @GenerateNodeFactory + public abstract static class AndNode extends BinaryOpBuiltinNode { + + @Specialization + static PBaseSet doPBaseSet(VirtualFrame frame, PBaseSet self, PBaseSet other, + @Bind("this") Node inliningTarget, + @Cached HashingStorageNodes.HashingStorageLen lenNode, + @Cached HashingStorageNodes.HashingStorageIntersect intersectNode, + @Cached InlinedConditionProfile swapProfile, + @Cached CreateSetNode createSetNode) { + HashingStorage storage1 = self.getDictStorage(); + HashingStorage storage2 = other.getDictStorage(); + // Try to minimize the number of __eq__ calls + if (swapProfile.profile(inliningTarget, lenNode.execute(inliningTarget, storage2) > lenNode.execute(inliningTarget, storage1))) { + HashingStorage tmp = storage1; + storage1 = storage2; + storage2 = tmp; + } + HashingStorage storage = intersectNode.execute(frame, inliningTarget, storage2, storage1); + return createSetNode.execute(inliningTarget, storage, self); + } + + @SuppressWarnings("unused") + @Fallback + Object doOther(Object self, Object other) { + return PNotImplemented.NOT_IMPLEMENTED; + } + } + + @Slot(value = SlotKind.nb_or, isComplex = true) + @GenerateNodeFactory + public abstract static class OrNode extends BinaryOpBuiltinNode { + @Specialization + static Object doSet(VirtualFrame frame, PBaseSet self, PBaseSet other, + @Bind("this") Node inliningTarget, + @Cached HashingStorageCopy copyStorage, + @Cached HashingStorageNodes.HashingStorageAddAllToOther addAllToOther, + @Cached CreateSetNode createSetNode) { + HashingStorage resultStorage = copyStorage.execute(inliningTarget, self.getDictStorage()); + resultStorage = addAllToOther.execute(frame, inliningTarget, other.getDictStorage(), resultStorage); + return createSetNode.execute(inliningTarget, resultStorage, self); + } + + @SuppressWarnings("unused") + @Fallback + Object doOther(Object self, Object other) { + return PNotImplemented.NOT_IMPLEMENTED; + } + } + + @Slot(value = SlotKind.nb_xor, isComplex = true) + @GenerateNodeFactory + @ImportStatic(PGuards.class) + public abstract static class XorNode extends BinaryOpBuiltinNode { + + @Specialization + static Object doSet(VirtualFrame frame, PBaseSet self, PBaseSet other, + @Bind("this") Node inliningTarget, + @Cached HashingStorageNodes.HashingStorageXor xorNode, + @Cached CreateSetNode createSetNode) { + // TODO: calls __eq__ wrong number of times compared to CPython (GR-42240) + HashingStorage storage = xorNode.execute(frame, inliningTarget, self.getDictStorage(), other.getDictStorage()); + return createSetNode.execute(inliningTarget, storage, self); + } + + @SuppressWarnings("unused") + @Fallback + Object doOther(Object self, Object other) { + return PNotImplemented.NOT_IMPLEMENTED; + } + } + @Builtin(name = "issubset", minNumOfPositionalArgs = 2) @GenerateNodeFactory protected abstract static class BaseIsSubsetNode extends PythonBinaryBuiltinNode { @@ -308,9 +424,9 @@ protected abstract static class BaseIsSubsetNode extends PythonBinaryBuiltinNode static boolean isSubSetGeneric(VirtualFrame frame, PBaseSet self, Object other, @Bind("this") Node inliningTarget, @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, - @Cached HashingStorageCompareKeys compareKeys) { + @Cached IsKeysSubset compareKeys) { HashingStorage otherStorage = getSetStorageNode.execute(frame, inliningTarget, other); - return compareKeys.execute(frame, inliningTarget, self.getDictStorage(), otherStorage) <= 0; + return compareKeys.execute(frame, inliningTarget, self.getDictStorage(), otherStorage); } } @@ -321,9 +437,9 @@ protected abstract static class BaseIsSupersetNode extends PythonBinaryBuiltinNo static boolean isSuperSetGeneric(VirtualFrame frame, PBaseSet self, Object other, @Bind("this") Node inliningTarget, @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, - @Cached HashingStorageCompareKeys compareKeys) { + @Cached HashingStorageNodes.IsKeysSubset compareKeys) { HashingStorage otherStorage = getSetStorageNode.execute(frame, inliningTarget, other); - return compareKeys.execute(frame, inliningTarget, otherStorage, self.getDictStorage()) <= 0; + return compareKeys.execute(frame, inliningTarget, otherStorage, self.getDictStorage()); } } @@ -351,114 +467,27 @@ static boolean isDisjointGeneric(VirtualFrame frame, Object self, Object other, @Bind("this") Node inliningTarget, @Cached HashingStorageGetItem getHashingStorageItem, @Cached PyObjectGetIter getIter, - @Cached GetNextNode getNextNode, - @Cached IsBuiltinObjectProfile errorProfile) { + @Cached PyIterNextNode nextNode) { HashingStorage selfStorage = ((PBaseSet) self).getDictStorage(); Object iterator = getIter.execute(frame, inliningTarget, other); while (true) { + Object nextValue; try { - Object nextValue = getNextNode.execute(frame, iterator); - if (getHashingStorageItem.hasKey(frame, inliningTarget, selfStorage, nextValue)) { - return false; - } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); + nextValue = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { return true; } + if (getHashingStorageItem.hasKey(frame, inliningTarget, selfStorage, nextValue)) { + return false; + } } } } - @Builtin(name = J___LE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - protected abstract static class BaseLessEqualNode extends PythonBinaryBuiltinNode { - @Specialization - static boolean doLE(VirtualFrame frame, PBaseSet self, PBaseSet other, - @Bind("this") Node inliningTarget, - @Cached HashingStorageCompareKeys compareKeys) { - return compareKeys.execute(frame, inliningTarget, self.getDictStorage(), other.getDictStorage()) <= 0; - } - - @Fallback - @SuppressWarnings("unused") - static PNotImplemented doNotImplemented(Object self, Object other) { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - - @Builtin(name = J___GE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - protected abstract static class BaseGreaterEqualNode extends PythonBinaryBuiltinNode { - @Specialization - static boolean doGE(VirtualFrame frame, PBaseSet self, PBaseSet other, - @Bind("this") Node inliningTarget, - @Cached HashingStorageCompareKeys compareKeys) { - return compareKeys.execute(frame, inliningTarget, other.getDictStorage(), self.getDictStorage()) <= 0; - } - - @Fallback - @SuppressWarnings("unused") - static PNotImplemented doNotImplemented(Object self, Object other) { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - - @Builtin(name = J___LT__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - protected abstract static class BaseLessThanNode extends PythonBinaryBuiltinNode { - - @Specialization - static boolean isLessThan(VirtualFrame frame, PBaseSet self, PBaseSet other, - @Bind("this") Node inliningTarget, - @Cached HashingStorageLen lenSelfNode, - @Cached HashingStorageLen lenOtherNode, - @Cached HashingStorageCompareKeys compareKeys, - @Cached InlinedConditionProfile sizeProfile) { - final int len1 = lenSelfNode.execute(inliningTarget, self.getDictStorage()); - final int len2 = lenOtherNode.execute(inliningTarget, other.getDictStorage()); - if (sizeProfile.profile(inliningTarget, len1 >= len2)) { - return false; - } - return BaseLessEqualNode.doLE(frame, self, other, inliningTarget, compareKeys); - } - - @Fallback - @SuppressWarnings("unused") - static PNotImplemented doNotImplemented(Object self, Object other) { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - - @Builtin(name = J___GT__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - protected abstract static class BaseGreaterThanNode extends PythonBinaryBuiltinNode { - - @Specialization - static boolean isGreaterThan(VirtualFrame frame, PBaseSet self, PBaseSet other, - @Bind("this") Node inliningTarget, - @Cached HashingStorageLen aLenNode, - @Cached HashingStorageLen bLenNode, - @Cached HashingStorageCompareKeys compareKeys, - @Cached InlinedConditionProfile sizeProfile) { - final int len1 = aLenNode.execute(inliningTarget, self.getDictStorage()); - final int len2 = bLenNode.execute(inliningTarget, other.getDictStorage()); - if (sizeProfile.profile(inliningTarget, len1 <= len2)) { - return false; - } - return BaseGreaterEqualNode.doGE(frame, self, other, inliningTarget, compareKeys); - } - - @Fallback - @SuppressWarnings("unused") - static PNotImplemented doNotImplemented(Object self, Object other) { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - @GenerateInline @GenerateCached(false) - @ImportStatic({PGuards.class, SpecialMethodSlot.class}) + @ImportStatic(PGuards.class) protected abstract static class ConvertKeyNode extends PNodeWithContext { public abstract Object execute(Node inliningTarget, Object key); @@ -470,12 +499,15 @@ static Object doNotPSet(Object key) { @Specialization static Object doPSet(Node inliningTarget, PSet key, @Cached HashingStorageCopy copyNode, - @Cached GetClassNode getClassNode, - @Cached(parameters = "Hash", inline = false) LookupCallableSlotInMRONode lookupHash, - @Cached PythonObjectFactory.Lazy factory) { - Object hashDescr = lookupHash.execute(getClassNode.execute(inliningTarget, key)); - if (hashDescr instanceof PNone) { - return factory.get(inliningTarget).createFrozenSet(copyNode.execute(inliningTarget, key.getDictStorage())); + @Cached GetObjectSlotsNode getSlotsNode) { + // This follows the logic in CPython's setobject.c:set_contains + // TODO: CPython first tries the search and only if it gets back TypeError and the key + // type is set, then it transforms it to frozenset. The issue is that the TypeError can + // come from the tp_hash implementation or from the tp_richcompare also called during + // the search + TpSlots slots = getSlotsNode.execute(inliningTarget, key); + if (slots.tp_hash() == null || slots.tp_hash() == TpSlotHashFun.HASH_NOT_IMPLEMENTED) { + return PFactory.createFrozenSet(PythonLanguage.get(inliningTarget), copyNode.execute(inliningTarget, key.getDictStorage())); } else { return key; } @@ -487,8 +519,8 @@ static Object doPSet(Node inliningTarget, PSet key, public abstract static class ClassGetItemNode extends PythonBinaryBuiltinNode { @Specialization static Object classGetItem(Object cls, Object key, - @Cached PythonObjectFactory factory) { - return factory.createGenericAlias(cls, key); + @Bind PythonLanguage language) { + return PFactory.createGenericAlias(language, cls, key); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/set/FrozenSetBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/set/FrozenSetBuiltins.java index 5d4d42f3fe..f4beb6e2c3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/set/FrozenSetBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/set/FrozenSetBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -25,25 +25,24 @@ */ package com.oracle.graal.python.builtins.objects.set; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___AND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RAND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RXOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___XOR__; +import static com.oracle.graal.python.nodes.BuiltinNames.J_FROZENSET; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.common.EmptyStorage; import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes; import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes.GetSetStorageNode; import com.oracle.graal.python.builtins.objects.common.HashingStorage; +import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageAddAllToOther; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageCopy; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageDiff; @@ -53,82 +52,93 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIteratorKey; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIteratorNext; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageXor; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.HashBuiltinNode; import com.oracle.graal.python.lib.PyObjectHashNode; -import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsAnyBuiltinObjectProfile; -import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.nodes.object.BuiltinClassProfiles; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateNodeFactory; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; /** * binary operations are implemented in {@link BaseSetBuiltins} */ @CoreFunctions(extendClasses = {PythonBuiltinClassType.PFrozenSet}) public final class FrozenSetBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = FrozenSetBuiltinsSlotsGen.SLOTS; @Override protected List> getNodeFactories() { return FrozenSetBuiltinsFactory.getFactories(); } - @Builtin(name = "copy", minNumOfPositionalArgs = 1) + // frozenset([iterable]) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_FROZENSET, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2) @GenerateNodeFactory - public abstract static class CopyNode extends PythonUnaryBuiltinNode { + public abstract static class FrozenSetNode extends PythonBinaryBuiltinNode { - @Specialization - static PFrozenSet subFrozensetIdentity(PFrozenSet arg, + @Specialization(guards = "isNoValue(arg)") + static PFrozenSet frozensetEmpty(Object cls, @SuppressWarnings("unused") PNone arg, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createFrozenSet(language, cls, getInstanceShape.execute(cls), EmptyStorage.INSTANCE); + } + + @Specialization(guards = "isBuiltinClass.profileIsAnyBuiltinClass(inliningTarget, cls)") + static PFrozenSet frozensetIdentity(@SuppressWarnings("unused") Object cls, PFrozenSet arg, + @SuppressWarnings("unused") @Bind("this") Node inliningTarget, + @Shared("isBuiltinProfile") @SuppressWarnings("unused") @Cached BuiltinClassProfiles.IsAnyBuiltinClassProfile isBuiltinClass) { + return arg; + } + + @Specialization(guards = "!isBuiltinClass.profileIsAnyBuiltinClass(inliningTarget, cls)") + static PFrozenSet subFrozensetIdentity(Object cls, PFrozenSet arg, + @SuppressWarnings("unused") @Bind("this") Node inliningTarget, + @Shared("isBuiltinProfile") @SuppressWarnings("unused") @Cached BuiltinClassProfiles.IsAnyBuiltinClassProfile isBuiltinClass, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createFrozenSet(language, cls, getInstanceShape.execute(cls), arg.getDictStorage()); + } + + @Specialization(guards = {"!isNoValue(iterable)", "!isPFrozenSet(iterable)"}) + static PFrozenSet frozensetIterable(VirtualFrame frame, Object cls, Object iterable, @Bind("this") Node inliningTarget, - @Cached IsAnyBuiltinObjectProfile isBuiltinClass, - @Cached PythonObjectFactory.Lazy factory) { - if (isBuiltinClass.profileIsAnyBuiltinObject(inliningTarget, arg)) { - return arg; - } else { - return factory.get(inliningTarget).createFrozenSet(arg.getDictStorage()); - } + @Cached HashingCollectionNodes.GetClonedHashingStorageNode getHashingStorageNode, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + HashingStorage storage = getHashingStorageNode.getForSets(frame, inliningTarget, iterable); + return PFactory.createFrozenSet(language, cls, getInstanceShape.execute(cls), storage); } } - @Builtin(name = J___AND__, minNumOfPositionalArgs = 2) - @Builtin(name = J___RAND__, minNumOfPositionalArgs = 2) + @Builtin(name = "copy", minNumOfPositionalArgs = 1) @GenerateNodeFactory - @ImportStatic(PGuards.class) - abstract static class AndNode extends PythonBinaryBuiltinNode { + public abstract static class CopyNode extends PythonUnaryBuiltinNode { - @Specialization(guards = "canDoSetBinOp(right)") - static PBaseSet doPBaseSet(@SuppressWarnings("unused") VirtualFrame frame, PFrozenSet left, Object right, - @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile rightIsSetProfile, - @Cached GetSetStorageNode getSetStorageNode, - @Cached HashingStorageIntersect intersectNode, - @Cached PythonObjectFactory factory) { - HashingStorage storage = intersectNode.execute(frame, inliningTarget, left.getDictStorage(), getSetStorageNode.execute(frame, inliningTarget, right)); - if (rightIsSetProfile.profile(inliningTarget, right instanceof PBaseSet)) { - return factory.createFrozenSet(storage); - } else { - return factory.createSet(storage); - } + @Specialization(guards = "isBuiltinFrozenSet(self)") + static PFrozenSet frozenSetIdentity(PFrozenSet self) { + return self; } - @Fallback - static Object doAnd(Object self, Object other, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_FOR_S_P_AND_P, "&", self, other); + @Specialization(guards = "!isBuiltinFrozenSet(self)") + static PFrozenSet doGeneric(PFrozenSet self, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Cached HashingStorageNodes.HashingStorageCopy copy) { + return PFactory.createFrozenSet(language, copy.execute(inliningTarget, self.getDictStorage())); } } @@ -138,8 +148,8 @@ public abstract static class IntersectNode extends PythonBuiltinNode { @Specialization(guards = "isNoValue(other)") static PFrozenSet doSet(@SuppressWarnings("unused") VirtualFrame frame, PFrozenSet self, @SuppressWarnings("unused") PNone other, - @Shared @Cached PythonObjectFactory factory) { - return factory.createFrozenSet(self.getDictStorage()); + @Bind PythonLanguage language) { + return PFactory.createFrozenSet(language, self.getDictStorage()); } @Specialization(guards = {"args.length == len", "args.length < 32"}, limit = "3") @@ -149,12 +159,12 @@ static PBaseSet doCached(VirtualFrame frame, PFrozenSet self, Object[] args, @Shared @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, @Shared @Cached HashingStorageCopy copyNode, @Shared @Cached HashingStorageIntersect intersectNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { HashingStorage result = copyNode.execute(inliningTarget, self.getDictStorage()); for (int i = 0; i < len; i++) { result = intersectNode.execute(frame, inliningTarget, result, getSetStorageNode.execute(frame, inliningTarget, args[i])); } - return factory.createFrozenSet(result); + return PFactory.createFrozenSet(language, result); } @Specialization(replaces = "doCached") @@ -163,12 +173,12 @@ static PBaseSet doGeneric(VirtualFrame frame, PFrozenSet self, Object[] args, @Shared @Cached GetSetStorageNode getSetStorageNode, @Shared @Cached HashingStorageCopy copyNode, @Shared @Cached HashingStorageIntersect intersectNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { HashingStorage result = copyNode.execute(inliningTarget, self.getDictStorage()); for (int i = 0; i < args.length; i++) { result = intersectNode.execute(frame, inliningTarget, result, getSetStorageNode.execute(frame, inliningTarget, args[i])); } - return factory.createFrozenSet(result); + return PFactory.createFrozenSet(language, result); } static boolean isOther(Object arg) { @@ -180,67 +190,9 @@ static PFrozenSet doSet(@SuppressWarnings("unused") VirtualFrame frame, PFrozenS @Bind("this") Node inliningTarget, @Shared @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, @Shared @Cached HashingStorageIntersect intersectNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { HashingStorage result = intersectNode.execute(frame, inliningTarget, self.getDictStorage(), getSetStorageNode.execute(frame, inliningTarget, other)); - return factory.createFrozenSet(result); - } - } - - @Builtin(name = J___OR__, minNumOfPositionalArgs = 2) - @Builtin(name = J___ROR__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - @ImportStatic(PGuards.class) - abstract static class OrNode extends PythonBinaryBuiltinNode { - - @Specialization(guards = "canDoSetBinOp(right)") - static PBaseSet doPBaseSet(@SuppressWarnings("unused") VirtualFrame frame, PFrozenSet left, Object right, - @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile rightIsSetProfile, - @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, - @Cached HashingStorageCopy copyNode, - @Cached HashingStorageAddAllToOther addAllToOther, - @Cached PythonObjectFactory factory) { - HashingStorage storage = left.getDictStorage().union(inliningTarget, getSetStorageNode.execute(frame, inliningTarget, right), copyNode, addAllToOther); - if (rightIsSetProfile.profile(inliningTarget, right instanceof PBaseSet)) { - return factory.createFrozenSet(storage); - } else { - return factory.createSet(storage); - } - } - - @Fallback - static Object doOr(Object self, Object other, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_FOR_S_P_AND_P, "|", self, other); - } - } - - @Builtin(name = J___XOR__, minNumOfPositionalArgs = 2) - @Builtin(name = J___RXOR__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - @ImportStatic(PGuards.class) - abstract static class XorNode extends PythonBinaryBuiltinNode { - - @Specialization(guards = "canDoSetBinOp(right)") - static PBaseSet doPBaseSet(@SuppressWarnings("unused") VirtualFrame frame, PFrozenSet left, Object right, - @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile rightIsSetProfile, - @Cached GetSetStorageNode getSetStorageNode, - @Cached HashingStorageXor xorNode, - @Cached PythonObjectFactory factory) { - HashingStorage rightStorage = getSetStorageNode.execute(frame, inliningTarget, right); - HashingStorage storage = xorNode.execute(frame, inliningTarget, left.getDictStorage(), rightStorage); - if (rightIsSetProfile.profile(inliningTarget, right instanceof PBaseSet)) { - return factory.createFrozenSet(storage); - } else { - return factory.createSet(storage); - } - } - - @Fallback - static Object doOr(Object self, Object other, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_FOR_S_P_AND_P, "^", self, other); + return PFactory.createFrozenSet(language, result); } } @@ -253,9 +205,9 @@ static PFrozenSet doSet(@SuppressWarnings("unused") VirtualFrame frame, PFrozenS @Bind("this") Node inliningTarget, @Cached HashingCollectionNodes.GetSetStorageNode getHashingStorage, @Cached HashingStorageXor xorNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { HashingStorage result = xorNode.execute(frame, inliningTarget, self.getDictStorage(), getHashingStorage.execute(frame, inliningTarget, other)); - return factory.createFrozenSet(result); + return PFactory.createFrozenSet(language, result); } } @@ -265,8 +217,8 @@ public abstract static class DifferenceNode extends PythonBuiltinNode { @Specialization(guards = "isNoValue(other)") static PFrozenSet doSet(@SuppressWarnings("unused") VirtualFrame frame, PFrozenSet self, @SuppressWarnings("unused") PNone other, - @Shared @Cached PythonObjectFactory factory) { - return factory.createFrozenSet(self.getDictStorage()); + @Bind PythonLanguage language) { + return PFactory.createFrozenSet(language, self.getDictStorage()); } @Specialization(guards = {"args.length == len", "args.length < 32"}, limit = "3") @@ -276,12 +228,12 @@ static PBaseSet doCached(VirtualFrame frame, PFrozenSet self, Object[] args, @Shared @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, @Shared @Cached HashingStorageCopy copyNode, @Shared @Cached HashingStorageDiff diffNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { HashingStorage result = copyNode.execute(inliningTarget, self.getDictStorage()); for (int i = 0; i < len; i++) { result = diffNode.execute(frame, inliningTarget, result, getSetStorageNode.execute(frame, inliningTarget, args[i])); } - return factory.createFrozenSet(result); + return PFactory.createFrozenSet(language, result); } @Specialization(replaces = "doCached") @@ -290,12 +242,12 @@ static PBaseSet doGeneric(VirtualFrame frame, PFrozenSet self, Object[] args, @Shared @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, @Shared @Cached HashingStorageCopy copyNode, @Shared @Cached HashingStorageDiff diffNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { HashingStorage result = copyNode.execute(inliningTarget, self.getDictStorage()); for (int i = 0; i < args.length; i++) { result = diffNode.execute(frame, inliningTarget, result, getSetStorageNode.execute(frame, inliningTarget, args[i])); } - return factory.createFrozenSet(result); + return PFactory.createFrozenSet(language, result); } static boolean isOther(Object arg) { @@ -307,9 +259,9 @@ static PFrozenSet doSet(@SuppressWarnings("unused") VirtualFrame frame, PFrozenS @Bind("this") Node inliningTarget, @Shared @Cached GetSetStorageNode getSetStorageNode, @Shared @Cached HashingStorageDiff diffNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { HashingStorage result = diffNode.execute(frame, inliningTarget, self.getDictStorage(), getSetStorageNode.execute(frame, inliningTarget, other)); - return factory.createFrozenSet(result); + return PFactory.createFrozenSet(language, result); } } @@ -324,12 +276,12 @@ static PBaseSet doCached(VirtualFrame frame, PBaseSet self, Object[] args, @Shared @Cached GetSetStorageNode getHashingStorage, @Shared @Cached HashingStorageCopy copyNode, @Shared @Cached HashingStorageAddAllToOther addAllToOther, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { HashingStorage result = copyNode.execute(inliningTarget, self.getDictStorage()); for (int i = 0; i < len; i++) { result = addAllToOther.execute(frame, inliningTarget, getHashingStorage.execute(frame, inliningTarget, args[i]), result); } - return factory.createFrozenSet(result); + return PFactory.createFrozenSet(language, result); } @Specialization(replaces = "doCached") @@ -338,18 +290,18 @@ static PBaseSet doGeneric(VirtualFrame frame, PBaseSet self, Object[] args, @Shared @Cached GetSetStorageNode getHashingStorage, @Shared @Cached HashingStorageCopy copyNode, @Shared @Cached HashingStorageAddAllToOther addAllToOther, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { HashingStorage result = copyNode.execute(inliningTarget, self.getDictStorage()); for (int i = 0; i < args.length; i++) { result = addAllToOther.execute(frame, inliningTarget, getHashingStorage.execute(frame, inliningTarget, args[i]), result); } - return factory.createFrozenSet(result); + return PFactory.createFrozenSet(language, result); } } - @Builtin(name = J___HASH__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_hash, isComplex = true) @GenerateNodeFactory - public abstract static class HashNode extends PythonUnaryBuiltinNode { + public abstract static class HashNode extends HashBuiltinNode { protected static long HASH_UNSET = -1; @Specialization(guards = {"self.getHash() != HASH_UNSET"}) @@ -406,10 +358,5 @@ public static long computeHash(VirtualFrame frame, PFrozenSet self, private static long shuffleBits(long value) { return ((value ^ 0x55b4db3) ^ (value << 16)) * 0xd93f34d7; } - - @Fallback - static Object genericHash(@SuppressWarnings("unused") Object self) { - return PNotImplemented.NOT_IMPLEMENTED; - } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/set/SetBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/set/SetBuiltins.java index 558c037221..baf225ebf0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/set/SetBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/set/SetBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -26,22 +26,16 @@ package com.oracle.graal.python.builtins.objects.set; import static com.oracle.graal.python.nodes.BuiltinNames.J_ADD; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___AND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IAND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ISUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___IXOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RAND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RXOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___XOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___HASH__; +import static com.oracle.graal.python.nodes.BuiltinNames.J_SET; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.HashNotImplemented; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; @@ -57,6 +51,7 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageCopy; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageDiff; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIntersect; +import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageLen; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStoragePop; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItem; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageXor; @@ -65,7 +60,10 @@ import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.builtins.objects.dict.PDictView; import com.oracle.graal.python.builtins.objects.str.PString; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; @@ -75,12 +73,10 @@ import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.PSequence; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.dsl.Bind; @@ -97,17 +93,19 @@ import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; /** * binary operations are implemented in {@link BaseSetBuiltins} */ @CoreFunctions(extendClasses = PythonBuiltinClassType.PSet) +@HashNotImplemented public final class SetBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = SetBuiltinsSlotsGen.SLOTS; @Override public void initialize(Python3Core core) { super.initialize(core); - addBuiltinConstant(T___HASH__, PNone.NONE); } @Override @@ -115,7 +113,31 @@ protected List> getNodeFa return SetBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2) + // set([iterable]) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_SET, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class SetNode extends PythonBuiltinNode { + @Specialization(guards = "isBuiltinSet(cls)") + public PSet setEmpty(@SuppressWarnings("unused") Object cls, @SuppressWarnings("unused") Object arg, + @Bind PythonLanguage language) { + return PFactory.createSet(language); + } + + @Fallback + public PSet setEmpty(Object cls, @SuppressWarnings("unused") Object arg, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createSet(language, cls, getInstanceShape.execute(cls)); + } + + protected static boolean isBuiltinSet(Object cls) { + return cls == PythonBuiltinClassType.PSet; + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "set", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2) @GenerateNodeFactory @ImportStatic(PGuards.class) public abstract static class InitNode extends PythonBuiltinNode { @@ -133,15 +155,15 @@ static PNone doNoValue(PSet self, @SuppressWarnings("unused") PNone iterable, static PNone doGeneric(VirtualFrame frame, PSet self, Object iterable, @Bind("this") Node inliningTarget, @Cached HashingCollectionNodes.GetClonedHashingStorageNode getHashingStorageNode) { - HashingStorage storage = getHashingStorageNode.doNoValue(frame, inliningTarget, iterable); + HashingStorage storage = getHashingStorageNode.getForSets(frame, inliningTarget, iterable); self.setDictStorage(storage); return PNone.NONE; } @Fallback static PNone fail(@SuppressWarnings("unused") VirtualFrame frame, @SuppressWarnings("unused") Object self, Object iterable, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.SET_DOES_NOT_SUPPORT_ITERABLE_OBJ, iterable); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.SET_DOES_NOT_SUPPORT_ITERABLE_OBJ, iterable); } } @@ -153,8 +175,8 @@ public abstract static class CopyNode extends PythonBuiltinNode { static PSet doSet(PSet self, @Bind("this") Node inliningTarget, @Cached HashingStorageCopy copyNode, - @Cached PythonObjectFactory factory) { - return factory.createSet(copyNode.execute(inliningTarget, self.getDictStorage())); + @Bind PythonLanguage language) { + return PFactory.createSet(language, copyNode.execute(inliningTarget, self.getDictStorage())); } } @@ -184,43 +206,14 @@ public static Object add(VirtualFrame frame, PSet self, Object o, } } - @Builtin(name = J___OR__, minNumOfPositionalArgs = 2) - @Builtin(name = J___ROR__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - @ImportStatic(PGuards.class) - public abstract static class OrNode extends PythonBinaryBuiltinNode { - @Specialization(guards = "canDoSetBinOp(other)") - static Object doSet(VirtualFrame frame, PSet self, Object other, - @Bind("this") Node inliningTarget, - @Cached HashingCollectionNodes.GetSetStorageNode getHashingStorage, - @Cached HashingStorageCopy copyStorage, - @Cached HashingStorageAddAllToOther addAllToOther, - @Cached PythonObjectFactory factory) { - // Note: we cannot reuse 'otherStorage' because we need to add from other -> self, in - // order to execute __eq__ of keys in 'self' and not other - HashingStorage otherStorage = getHashingStorage.execute(frame, inliningTarget, other); - HashingStorage resultStorage = copyStorage.execute(inliningTarget, self.getDictStorage()); - PSet result = factory.createSet(resultStorage); - addAllToOther.execute(frame, inliningTarget, otherStorage, result); - return result; - } - - @SuppressWarnings("unused") - @Fallback - Object doOr(Object self, Object other) { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - - @Builtin(name = J___IOR__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.nb_inplace_or, isComplex = true) @GenerateNodeFactory public abstract static class IOrNode extends PythonBinaryBuiltinNode { - @Specialization(guards = "canDoSetBinOp(other)") - Object doSet(VirtualFrame frame, PSet self, Object other, + @Specialization + Object doSet(VirtualFrame frame, PSet self, PBaseSet other, @Bind("this") Node inliningTarget, - @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, @Cached HashingStorageAddAllToOther addAllToOther) { - addAllToOther.execute(frame, inliningTarget, getSetStorageNode.execute(frame, inliningTarget, other), self); + addAllToOther.execute(frame, inliningTarget, other.getDictStorage(), self); return self; } @@ -242,12 +235,12 @@ static PBaseSet doCached(VirtualFrame frame, PSet self, Object[] args, @Shared @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, @Shared @Cached HashingStorageCopy copyNode, @Shared @Cached HashingStorageAddAllToOther addAllToOther, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { HashingStorage result = copyNode.execute(inliningTarget, self.getDictStorage()); for (int i = 0; i < len; i++) { result = addAllToOther.execute(frame, inliningTarget, getSetStorageNode.execute(frame, inliningTarget, args[i]), result); } - return factory.createSet(result); + return PFactory.createSet(language, result); } @Specialization(replaces = "doCached") @@ -256,12 +249,12 @@ static PBaseSet doGeneric(VirtualFrame frame, PSet self, Object[] args, @Shared @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, @Shared @Cached HashingStorageCopy copyNode, @Shared @Cached HashingStorageAddAllToOther addAllToOther, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { HashingStorage result = copyNode.execute(inliningTarget, self.getDictStorage()); for (int i = 0; i < args.length; i++) { result = addAllToOther.execute(frame, inliningTarget, getSetStorageNode.execute(frame, inliningTarget, args[i]), result); } - return factory.createSet(result); + return PFactory.createSet(language, result); } } @@ -284,7 +277,7 @@ static void update(VirtualFrame frame, PHashingCollection collection, PHashingCo static void update(VirtualFrame frame, PHashingCollection collection, PDictView.PDictKeysView other, @Bind("this") Node inliningTarget, @Shared("addAll") @Cached HashingStorageAddAllToOther addAllToOther) { - HashingStorage dictStorage = other.getWrappedDict().getDictStorage(); + HashingStorage dictStorage = other.getWrappedStorage(); addAllToOther.execute(frame, inliningTarget, dictStorage, collection); } @@ -315,17 +308,15 @@ static void doIterable(VirtualFrame frame, PHashingCollection collection, Object @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Exclusive @Cached GetPythonObjectClassNode getClassNode, @Cached PyObjectGetIter getIter, - @Cached GetNextNode nextNode, - @Cached IsBuiltinObjectProfile errorProfile, + @Cached PyIterNextNode nextNode, @Exclusive @Cached HashingStorageSetItem setStorageItem) { HashingStorage curStorage = collection.getDictStorage(); Object iterator = getIter.execute(frame, inliningTarget, other); while (true) { Object key; try { - key = nextNode.execute(frame, iterator); - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); + key = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { collection.setDictStorage(curStorage); return; } @@ -401,41 +392,25 @@ static PNone doSet(VirtualFrame frame, PSet self, Object other, } } - @Builtin(name = J___AND__, minNumOfPositionalArgs = 2) - @Builtin(name = J___RAND__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - @ImportStatic(PGuards.class) - public abstract static class AndNode extends PythonBinaryBuiltinNode { - - @Specialization(guards = "canDoSetBinOp(right)") - static PBaseSet doPBaseSet(VirtualFrame frame, PSet left, Object right, - @Bind("this") Node inliningTarget, - @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, - @Cached HashingStorageIntersect intersectNode, - @Cached PythonObjectFactory factory) { - HashingStorage storage = intersectNode.execute(frame, inliningTarget, getSetStorageNode.execute(frame, inliningTarget, right), left.getDictStorage()); - return factory.createSet(storage); - } - - @SuppressWarnings("unused") - @Fallback - Object doAnd(Object self, Object other) { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - - @Builtin(name = J___IAND__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.nb_inplace_and, isComplex = true) @GenerateNodeFactory public abstract static class IAndNode extends PythonBinaryBuiltinNode { - @Specialization(guards = "canDoSetBinOp(right)") - static PBaseSet doPBaseSet(VirtualFrame frame, PSet left, Object right, + @Specialization + static PBaseSet doPBaseSet(VirtualFrame frame, PSet left, PBaseSet right, @Bind("this") Node inliningTarget, - @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, + @Cached HashingStorageLen lenNode, + @Cached InlinedConditionProfile swapProfile, @Cached HashingStorageIntersect intersectNode) { - // We cannot reuse the left storage without breaking the CPython "contract" of how many - // times we can call __eq__ on which key - HashingStorage storage = intersectNode.execute(frame, inliningTarget, getSetStorageNode.execute(frame, inliningTarget, right), left.getDictStorage()); + HashingStorage storage1 = left.getDictStorage(); + HashingStorage storage2 = right.getDictStorage(); + // Try to minimize the number of __eq__ calls + if (swapProfile.profile(inliningTarget, lenNode.execute(inliningTarget, storage2) > lenNode.execute(inliningTarget, storage1))) { + HashingStorage tmp = storage1; + storage1 = storage2; + storage2 = tmp; + } + HashingStorage storage = intersectNode.execute(frame, inliningTarget, storage2, storage1); left.setDictStorage(storage); return left; } @@ -454,10 +429,9 @@ public abstract static class IntersectNode extends PythonBuiltinNode { @Specialization(guards = "isNoValue(other)") Object doSet(@SuppressWarnings("unused") VirtualFrame frame, PSet self, @SuppressWarnings("unused") PNone other, @Bind("this") Node inliningTarget, - @Shared @Cached HashingStorageCopy copyNode, - @Shared @Cached PythonObjectFactory factory) { + @Shared @Cached HashingStorageCopy copyNode) { HashingStorage result = copyNode.execute(inliningTarget, self.getDictStorage()); - return createResult(self, result, factory); + return createResult(self, result); } @Specialization(guards = {"args.length == len", "args.length < 32"}, limit = "3") @@ -466,13 +440,12 @@ Object doCached(VirtualFrame frame, PSet self, Object[] args, @Cached("args.length") int len, @Shared @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, @Shared @Cached HashingStorageCopy copyNode, - @Shared @Cached HashingStorageIntersect intersectNode, - @Shared @Cached PythonObjectFactory factory) { + @Shared @Cached HashingStorageIntersect intersectNode) { HashingStorage result = copyNode.execute(inliningTarget, self.getDictStorage()); for (int i = 0; i < len; i++) { result = intersectNode.execute(frame, inliningTarget, result, getSetStorageNode.execute(frame, inliningTarget, args[i])); } - return createResult(self, result, factory); + return createResult(self, result); } @Specialization(replaces = "doCached") @@ -480,13 +453,12 @@ Object doGeneric(VirtualFrame frame, PSet self, Object[] args, @Bind("this") Node inliningTarget, @Shared @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, @Shared @Cached HashingStorageCopy copyNode, - @Shared @Cached HashingStorageIntersect intersectNode, - @Shared @Cached PythonObjectFactory factory) { + @Shared @Cached HashingStorageIntersect intersectNode) { HashingStorage result = copyNode.execute(inliningTarget, self.getDictStorage()); for (int i = 0; i < args.length; i++) { result = intersectNode.execute(frame, inliningTarget, result, getSetStorageNode.execute(frame, inliningTarget, args[i])); } - return createResult(self, result, factory); + return createResult(self, result); } static boolean isOther(Object arg) { @@ -499,14 +471,14 @@ Object doSet(VirtualFrame frame, PSet self, Object other, @Shared @Cached GetSetStorageNode getSetStorageNode, @Shared @Cached HashingStorageCopy copyNode, @Shared @Cached HashingStorageIntersect intersectNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { HashingStorage result = copyNode.execute(inliningTarget, self.getDictStorage()); result = intersectNode.execute(frame, inliningTarget, result, getSetStorageNode.execute(frame, inliningTarget, other)); - return createResult(self, result, factory); + return PFactory.createSet(language, result); } - protected Object createResult(PSet self, HashingStorage result, PythonObjectFactory factory) { - return factory.createSet(result); + protected Object createResult(PSet self, HashingStorage result) { + return PFactory.createSet(PythonLanguage.get(this), result); } } @@ -514,47 +486,22 @@ protected Object createResult(PSet self, HashingStorage result, PythonObjectFact @GenerateNodeFactory @ImportStatic({SpecialMethodNames.class}) public abstract static class IntersectUpdateNode extends IntersectNode { - @Override - protected Object createResult(PSet self, HashingStorage result, PythonObjectFactory factory) { + protected Object createResult(PSet self, HashingStorage result) { // In order to be compatible w.r.t. __eq__ calls we cannot reuse self storage self.setDictStorage(result); return PNone.NONE; } } - @Builtin(name = J___XOR__, minNumOfPositionalArgs = 2) - @Builtin(name = J___RXOR__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - @ImportStatic(PGuards.class) - public abstract static class XorNode extends PythonBinaryBuiltinNode { - - @Specialization(guards = "canDoSetBinOp(other)") - static Object doSet(VirtualFrame frame, PSet self, Object other, - @Bind("this") Node inliningTarget, - @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, - @Cached HashingStorageXor xorNode, - @Cached PythonObjectFactory factory) { - // TODO: calls __eq__ wrong number of times compared to CPython (GR-42240) - return factory.createSet(xorNode.execute(frame, inliningTarget, self.getDictStorage(), getSetStorageNode.execute(frame, inliningTarget, other))); - } - - @SuppressWarnings("unused") - @Fallback - Object doOr(Object self, Object other) { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - - @Builtin(name = J___IXOR__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.nb_inplace_xor, isComplex = true) @GenerateNodeFactory public abstract static class IXorNode extends PythonBinaryBuiltinNode { - @Specialization(guards = "canDoSetBinOp(other)") - static Object doSet(VirtualFrame frame, PSet self, Object other, + @Specialization + static Object doSet(VirtualFrame frame, PSet self, PBaseSet other, @Bind("this") Node inliningTarget, - @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, @Cached HashingStorageXor xorNode) { - self.setDictStorage(xorNode.execute(frame, inliningTarget, self.getDictStorage(), getSetStorageNode.execute(frame, inliningTarget, other))); + self.setDictStorage(xorNode.execute(frame, inliningTarget, self.getDictStorage(), other.getDictStorage())); return self; } @@ -574,9 +521,9 @@ static PSet doSet(VirtualFrame frame, PSet self, Object other, @Bind("this") Node inliningTarget, @Cached GetSetStorageNode getHashingStorage, @Cached HashingStorageXor xorNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { HashingStorage result = xorNode.execute(frame, inliningTarget, self.getDictStorage(), getHashingStorage.execute(frame, inliningTarget, other)); - return factory.createSet(result); + return PFactory.createSet(language, result); } } @@ -632,15 +579,14 @@ static PNone doSetOther(VirtualFrame frame, PSet self, Object other, } } - @Builtin(name = J___ISUB__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.nb_inplace_subtract, isComplex = true) @GenerateNodeFactory abstract static class ISubNode extends PythonBinaryBuiltinNode { - @Specialization(guards = "canDoSetBinOp(right)") - static PBaseSet doPBaseSet(VirtualFrame frame, PSet left, Object right, + @Specialization + static PBaseSet doPBaseSet(VirtualFrame frame, PSet left, PBaseSet right, @Bind("this") Node inliningTarget, - @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, @Cached HashingStorageDiff diffNode) { - HashingStorage storage = diffNode.execute(frame, inliningTarget, left.getDictStorage(), getSetStorageNode.execute(frame, inliningTarget, right)); + HashingStorage storage = diffNode.execute(frame, inliningTarget, left.getDictStorage(), right.getDictStorage()); left.setDictStorage(storage); return left; } @@ -658,8 +604,8 @@ public abstract static class DifferenceNode extends PythonBuiltinNode { @Specialization(guards = "isNoValue(other)") static PSet doSet(@SuppressWarnings("unused") VirtualFrame frame, PSet self, @SuppressWarnings("unused") PNone other, - @Shared @Cached PythonObjectFactory factory) { - return factory.createSet(self.getDictStorage()); + @Bind PythonLanguage language) { + return PFactory.createSet(language, self.getDictStorage()); } @Specialization(guards = {"args.length == len", "args.length < 32"}, limit = "3") @@ -669,12 +615,12 @@ static PBaseSet doCached(VirtualFrame frame, PSet self, Object[] args, @Shared @Cached HashingCollectionNodes.GetSetStorageNode getSetStorageNode, @Shared @Cached HashingStorageCopy copyNode, @Shared @Cached HashingStorageDiff diffNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { HashingStorage result = copyNode.execute(inliningTarget, self.getDictStorage()); for (int i = 0; i < len; i++) { result = diffNode.execute(frame, inliningTarget, result, getSetStorageNode.execute(frame, inliningTarget, args[i])); } - return factory.createSet(result); + return PFactory.createSet(language, result); } @Specialization(replaces = "doCached") @@ -683,12 +629,12 @@ static PBaseSet doGeneric(VirtualFrame frame, PSet self, Object[] args, @Shared @Cached GetSetStorageNode getSetStorageNode, @Shared @Cached HashingStorageCopy copyNode, @Shared @Cached HashingStorageDiff diffNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { HashingStorage result = copyNode.execute(inliningTarget, self.getDictStorage()); for (int i = 0; i < args.length; i++) { result = diffNode.execute(frame, inliningTarget, result, getSetStorageNode.execute(frame, inliningTarget, args[i])); } - return factory.createSet(result); + return PFactory.createSet(language, result); } static boolean isOther(Object arg) { @@ -700,9 +646,9 @@ static PSet doSet(VirtualFrame frame, PSet self, Object other, @Bind("this") Node inliningTarget, @Shared @Cached GetSetStorageNode getSetStorageNode, @Shared @Cached HashingStorageDiff diffNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { HashingStorage result = diffNode.execute(frame, inliningTarget, self.getDictStorage(), getSetStorageNode.execute(frame, inliningTarget, other)); - return factory.createSet(result); + return PFactory.createSet(language, result); } } @@ -761,9 +707,9 @@ abstract static class RemoveNode extends PythonBinaryBuiltinNode { static Object remove(VirtualFrame frame, PSet self, Object key, @Bind("this") Node inliningTarget, @Cached com.oracle.graal.python.builtins.objects.set.SetNodes.DiscardNode discardNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (!discardNode.execute(frame, self, key)) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.KeyError, new Object[]{key}); + throw raiseNode.raise(inliningTarget, PythonErrorType.KeyError, new Object[]{key}); } return PNone.NONE; } @@ -787,13 +733,12 @@ public abstract static class PopNode extends PythonUnaryBuiltinNode { static Object remove(PSet self, @Bind("this") Node inliningTarget, @Cached HashingStoragePop popNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object[] result = popNode.execute(inliningTarget, self.getDictStorage(), self); if (result != null) { return result[0]; } - throw raiseNode.get(inliningTarget).raise(PythonErrorType.KeyError, ErrorMessages.POP_FROM_EMPTY_SET); + throw raiseNode.raise(inliningTarget, PythonErrorType.KeyError, ErrorMessages.POP_FROM_EMPTY_SET); } } - } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/set/SetNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/set/SetNodes.java index 2886aea9b2..137c1d2b66 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/set/SetNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/set/SetNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,21 +41,20 @@ package com.oracle.graal.python.builtins.objects.set; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageDelItem; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.bytecode.OperationProxy; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; @@ -66,68 +65,44 @@ import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.api.strings.TruffleStringIterator; public abstract class SetNodes { @GenerateUncached @SuppressWarnings("truffle-inlining") // footprint reduction 116 -> 98 public abstract static class ConstructSetNode extends PNodeWithContext { - public abstract PSet execute(Frame frame, Object cls, Object value); + public abstract PSet execute(Frame frame, Object value); - public final PSet executeWith(Frame frame, Object value) { - return this.execute(frame, PythonBuiltinClassType.PSet, value); - } - - @Specialization - static PSet setString(VirtualFrame frame, Object cls, TruffleString arg, - @Bind("this") Node inliningTarget, - @Exclusive @Cached PythonObjectFactory factory, - @Exclusive @Cached HashingCollectionNodes.SetItemNode setItemNode, - @Cached TruffleString.CreateCodePointIteratorNode createCodePointIteratorNode, - @Cached TruffleStringIterator.NextNode nextNode, - @Cached TruffleString.FromCodePointNode fromCodePointNode) { - PSet set = factory.createSet(cls); - TruffleStringIterator it = createCodePointIteratorNode.execute(arg, TS_ENCODING); - while (it.hasNext()) { - int cp = nextNode.execute(it); - TruffleString s = fromCodePointNode.execute(cp, TS_ENCODING, true); - setItemNode.execute(frame, inliningTarget, set, s, PNone.NONE); - } - return set; - } - - @Specialization(guards = "emptyArguments(none)") - static PSet set(Object cls, @SuppressWarnings("unused") PNone none, - @Exclusive @Cached PythonObjectFactory factory) { - return factory.createSet(cls); + @Specialization(guards = "isNoValue(none)") + static PSet set(@SuppressWarnings("unused") PNone none, + @Bind PythonLanguage language) { + return PFactory.createSet(language); } @Specialization(guards = "!isNoValue(iterable)") - static PSet setIterable(VirtualFrame frame, Object cls, Object iterable, + static PSet setIterable(VirtualFrame frame, Object iterable, @Bind("this") Node inliningTarget, - @Exclusive @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Exclusive @Cached HashingCollectionNodes.SetItemNode setItemNode, @Cached PyObjectGetIter getIter, - @Cached GetNextNode nextNode, - @Cached IsBuiltinObjectProfile errorProfile) { - PSet set = factory.createSet(cls); + @Cached PyIterNextNode nextNode) { + PSet set = PFactory.createSet(language); Object iterator = getIter.execute(frame, inliningTarget, iterable); while (true) { + Object next; try { - setItemNode.execute(frame, inliningTarget, set, nextNode.execute(frame, iterator), PNone.NONE); - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); + next = nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { return set; } + setItemNode.execute(frame, inliningTarget, set, next, PNone.NONE); } } @Fallback - static PSet setObject(@SuppressWarnings("unused") Object cls, Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.OBJ_NOT_ITERABLE, value); + static PSet setObject(Object value, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.OBJ_NOT_ITERABLE, value); } @NeverDefault @@ -141,6 +116,7 @@ public static ConstructSetNode getUncached() { } @GenerateUncached + @OperationProxy.Proxyable @SuppressWarnings("truffle-inlining") // footprint reduction 92 -> 73 public abstract static class AddNode extends PNodeWithContext { public abstract void execute(Frame frame, PSet self, Object o); @@ -172,8 +148,7 @@ boolean discard(VirtualFrame frame, PSet self, Object key, @Cached BaseSetBuiltins.ConvertKeyNode conv, @Cached HashingStorageDelItem delItem) { Object checkedKey = conv.execute(inliningTarget, key); - Object found = delItem.executePop(frame, inliningTarget, self.getDictStorage(), checkedKey, self); - return found != null; + return delItem.execute(frame, inliningTarget, self.getDictStorage(), checkedKey, self); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/slice/PObjectSlice.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/slice/PObjectSlice.java index 5379a81015..c66da77e16 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/slice/PObjectSlice.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/slice/PObjectSlice.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -48,7 +48,7 @@ import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.CompilerDirectives.ValueType; @@ -128,13 +128,13 @@ private static int pySign(BigInteger n) { * _PySlice_GetLongIndices */ @TruffleBoundary - public static SliceObjectInfo computeIndicesSlowPath(PObjectSlice slice, Object lengthIn, PythonObjectFactory factory) { + public static SliceObjectInfo computeIndicesSlowPath(PObjectSlice slice, Object lengthIn, boolean usePInt) { boolean stepIsNegative; BigInteger lower, upper; BigInteger start, stop, step, length; length = (BigInteger) lengthIn; if (pySign(length) < 0) { - throw PRaiseNode.raiseUncached(null, ValueError, ErrorMessages.LENGTH_SHOULD_NOT_BE_NEG); + throw PRaiseNode.raiseStatic(null, ValueError, ErrorMessages.LENGTH_SHOULD_NOT_BE_NEG); } if (slice.getStep() == PNone.NONE) { step = ONE; @@ -143,7 +143,7 @@ public static SliceObjectInfo computeIndicesSlowPath(PObjectSlice slice, Object step = (BigInteger) slice.getStep(); stepIsNegative = pySign(step) < 0; if (pySign(step) == 0) { - throw PRaiseNode.raiseUncached(null, ValueError, ErrorMessages.SLICE_STEP_CANNOT_BE_ZERO); + throw PRaiseNode.raiseStatic(null, ValueError, ErrorMessages.SLICE_STEP_CANNOT_BE_ZERO); } } @@ -194,8 +194,9 @@ public static SliceObjectInfo computeIndicesSlowPath(PObjectSlice slice, Object } } - if (factory != null) { - return new SliceObjectInfo(factory.createInt(start), factory.createInt(stop), factory.createInt(step)); + if (usePInt) { + PythonLanguage language = PythonLanguage.get(null); + return new SliceObjectInfo(PFactory.createInt(language, start), PFactory.createInt(language, stop), PFactory.createInt(language, step)); } else { return new SliceObjectInfo(start, stop, step); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/slice/PSlice.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/slice/PSlice.java index 2989727c5e..d49fed28e8 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/slice/PSlice.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/slice/PSlice.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -110,7 +110,7 @@ public record SliceInfoLong(long start, long stop, long step) { protected static void checkNegative(int length) { if (length < 0) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(null, ValueError, ErrorMessages.LENGTH_SHOULD_NOT_BE_NEG); + throw PRaiseNode.raiseStatic(null, ValueError, ErrorMessages.LENGTH_SHOULD_NOT_BE_NEG); } } @@ -142,7 +142,7 @@ public static SliceInfo computeIndices(Object startIn, Object stopIn, Object ste stepIsNegative = pySign(step) < 0; if (pySign(step) == 0) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(null, ValueError, ErrorMessages.SLICE_STEP_CANNOT_BE_ZERO); + throw PRaiseNode.raiseStatic(null, ValueError, ErrorMessages.SLICE_STEP_CANNOT_BE_ZERO); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/slice/SliceBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/slice/SliceBuiltins.java index 59bdeab756..df3df4f9d3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/slice/SliceBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/slice/SliceBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -25,59 +25,102 @@ */ package com.oracle.graal.python.builtins.objects.slice; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.HashNotImplemented; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.PNotImplemented; import com.oracle.graal.python.builtins.objects.slice.PSlice.SliceInfo; import com.oracle.graal.python.builtins.objects.slice.SliceNodes.CoerceToObjectSlice; import com.oracle.graal.python.builtins.objects.slice.SliceNodes.ComputeIndices; import com.oracle.graal.python.builtins.objects.slice.SliceNodes.SliceCastToToBigInt; import com.oracle.graal.python.builtins.objects.slice.SliceNodes.SliceExactCastToInt; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare.RichCmpBuiltinNode; +import com.oracle.graal.python.lib.PyObjectRichCompare; import com.oracle.graal.python.lib.PyObjectRichCompareBool; +import com.oracle.graal.python.lib.PySliceNew; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Cached.Shared; +import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.strings.TruffleString; @CoreFunctions(extendClasses = PythonBuiltinClassType.PSlice) +@HashNotImplemented public final class SliceBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = SliceBuiltinsSlotsGen.SLOTS; @Override protected List> getNodeFactories() { return SliceBuiltinsFactory.getFactories(); } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + // slice(stop) + // slice(start, stop[, step]) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "slice", minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 4) @GenerateNodeFactory - abstract static class ReprNode extends PythonBuiltinNode { + public abstract static class SliceNode extends PythonQuaternaryBuiltinNode { + @Specialization(guards = {"isNoValue(second)"}) + @SuppressWarnings("unused") + static Object singleArg(Object cls, Object first, Object second, Object third, + @Bind("this") Node inliningTarget, + @Shared @Cached PySliceNew sliceNode) { + return sliceNode.execute(inliningTarget, PNone.NONE, first, PNone.NONE); + } + + @Specialization(guards = {"!isNoValue(stop)", "isNoValue(step)"}) + @SuppressWarnings("unused") + static Object twoArgs(Object cls, Object start, Object stop, Object step, + @Bind("this") Node inliningTarget, + @Shared @Cached PySliceNew sliceNode) { + return sliceNode.execute(inliningTarget, start, stop, PNone.NONE); + } + + @Fallback + static Object threeArgs(@SuppressWarnings("unused") Object cls, Object start, Object stop, Object step, + @Bind("this") Node inliningTarget, + @Shared @Cached PySliceNew sliceNode) { + return sliceNode.execute(inliningTarget, start, stop, step); + } + } + + @Slot(value = SlotKind.tp_repr, isComplex = true) + @GenerateNodeFactory + abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization @TruffleBoundary public static TruffleString repr(PSlice self) { @@ -85,38 +128,78 @@ public static TruffleString repr(PSlice self) { } } - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.tp_richcompare, isComplex = true) @GenerateNodeFactory - abstract static class EqNode extends PythonBuiltinNode { + abstract static class EqNode extends RichCmpBuiltinNode { @Specialization - static boolean sliceCmp(PIntSlice left, PIntSlice right) { - return left.equals(right); - } - - /** - * As per {@link "https://github.com/python/cpython/blob/master/Objects/sliceobject.c#L569"} - * - * - * both {@code left} and {@code right} must be a slice. - * - * @return CPython returns {@code NOTIMPLEMENTED} which will eventually yield {@value false} - * , so we shortcut and return {@value false}. - */ - @SuppressWarnings("unused") - @Specialization(guards = "!isPSlice(right)") - static boolean notEqual(PSlice left, Object right) { - return false; + static boolean doIntSliceEq(PIntSlice left, PIntSlice right, RichCmpOp op, + @Bind("$node") Node inliningTarget, + @Cached InlinedConditionProfile startCmpProfile, + @Cached InlinedConditionProfile stopCmpProfile, + @Cached InlinedConditionProfile stepCmpProfile, + @Cached PRaiseNode raiseNode) { + // Inlined tuple comparison specialized for ints + if (startCmpProfile.profile(inliningTarget, left.start != right.start)) { + return cmpVal(inliningTarget, left.start, right.start, left.startIsNone, right.startIsNone, op, raiseNode); + } + if (stopCmpProfile.profile(inliningTarget, left.stop != right.stop)) { + return cmpVal(inliningTarget, left.stop, right.stop, false, false, op, raiseNode); + } + if (stepCmpProfile.profile(inliningTarget, left.step != right.step)) { + return cmpVal(inliningTarget, left.step, right.step, left.stepIsNone, right.stepIsNone, op, raiseNode); + } + return op.isEq() || op.isLe() || op.isGe(); } - @Specialization - static boolean sliceCmpWithLib(VirtualFrame frame, PSlice left, PSlice right, + private static boolean cmpVal(Node inliningTarget, int leftVal, int rightVal, boolean leftValIsNone, boolean rightValIsNone, RichCmpOp op, PRaiseNode raiseNode) { + if (op.isEqOrNe()) { + return op.isNe(); + } + if (leftValIsNone || rightValIsNone) { + Object leftObj = leftValIsNone ? PNone.NONE : leftVal; + Object rightObj = rightValIsNone ? PNone.NONE : rightVal; + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.NOT_SUPPORTED_BETWEEN_INSTANCES, op.getOpName(), leftObj, rightObj); + } + return op.compare(leftVal, rightVal); + } + + static boolean noIntSlices(PSlice a, PSlice b) { + return !(a instanceof PIntSlice && b instanceof PIntSlice); + } + + @Specialization(guards = {"noIntSlices(left, right)", "left == right"}) + static boolean sliceCmpIdentical(VirtualFrame frame, PSlice left, PSlice right, RichCmpOp op) { + // CPython fast-path, can have visible behavior, because we skip richcmp + return op.isEq() || op.isLe() || op.isGe(); + } + + @Specialization(guards = {"noIntSlices(left, right)", "left != right"}) + static Object sliceCmpWithLib(VirtualFrame frame, PSlice left, PSlice right, RichCmpOp op, @Bind("this") Node inliningTarget, - @Cached PyObjectRichCompareBool.EqNode eqNode) { - return eqNode.compare(frame, inliningTarget, left.getStart(), right.getStart()) && - eqNode.compare(frame, inliningTarget, left.getStop(), right.getStop()) && - eqNode.compare(frame, inliningTarget, left.getStep(), right.getStep()); + @Cached InlinedConditionProfile startCmpProfile, + @Cached InlinedConditionProfile stopCmpProfile, + @Cached InlinedConditionProfile stepCmpProfile, + @Cached PyObjectRichCompareBool eqNode, + @Cached PyObjectRichCompare cmpNode) { + // Inlined tuple comparison specialized for tuples of 3 items to avoid the tuples + // allocation + if (startCmpProfile.profile(inliningTarget, !eqNode.executeEq(frame, inliningTarget, left.getStart(), right.getStart()))) { + return cmpNode.execute(frame, inliningTarget, left.getStart(), right.getStart(), op); + } + if (stopCmpProfile.profile(inliningTarget, !eqNode.executeEq(frame, inliningTarget, left.getStop(), right.getStop()))) { + return cmpNode.execute(frame, inliningTarget, left.getStop(), right.getStop(), op); + } + if (stepCmpProfile.profile(inliningTarget, !eqNode.executeEq(frame, inliningTarget, left.getStep(), right.getStep()))) { + return cmpNode.execute(frame, inliningTarget, left.getStep(), right.getStep(), op); + } + return op.isEq() || op.isLe() || op.isGe(); } + @Fallback + @SuppressWarnings("unused") + static Object doOthers(VirtualFrame frame, Object left, Object right, RichCmpOp op) { + return PNotImplemented.NOT_IMPLEMENTED; + } } @Builtin(name = "start", minNumOfPositionalArgs = 1, isGetter = true) @@ -168,9 +251,9 @@ protected static Object get(PObjectSlice self) { @GenerateNodeFactory abstract static class IndicesNode extends PythonBinaryBuiltinNode { - private static PTuple doPSlice(VirtualFrame frame, PSlice self, int length, ComputeIndices compute, PythonObjectFactory factory) { + private static PTuple doPSlice(VirtualFrame frame, PSlice self, int length, ComputeIndices compute, PythonLanguage language) { SliceInfo sliceInfo = compute.execute(frame, self, length); - return factory.createTuple(new Object[]{sliceInfo.start, sliceInfo.stop, sliceInfo.step}); + return PFactory.createTuple(language, new Object[]{sliceInfo.start, sliceInfo.stop, sliceInfo.step}); } protected static boolean isSafeIntSlice(PSlice self, Object length) { @@ -179,31 +262,31 @@ protected static boolean isSafeIntSlice(PSlice self, Object length) { @Specialization static PTuple safeInt(VirtualFrame frame, PIntSlice self, int length, - @Shared @Cached ComputeIndices compute, - @Shared @Cached PythonObjectFactory factory) { - return doPSlice(frame, self, length, compute, factory); + @Bind PythonLanguage language, + @Shared @Cached ComputeIndices compute) { + return doPSlice(frame, self, length, compute, language); } @Specialization(guards = "!isPNone(length)", rewriteOn = PException.class) static PTuple doSliceObject(VirtualFrame frame, PSlice self, Object length, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Exclusive @Cached SliceExactCastToInt toInt, - @Shared @Cached ComputeIndices compute, - @Shared @Cached PythonObjectFactory factory) { - return doPSlice(frame, self, (int) toInt.execute(frame, inliningTarget, length), compute, factory); + @Shared @Cached ComputeIndices compute) { + return doPSlice(frame, self, (int) toInt.execute(frame, inliningTarget, length), compute, language); } @Specialization(guards = "!isPNone(length)", replaces = {"doSliceObject"}) static PTuple doSliceObjectWithSlowPath(VirtualFrame frame, PSlice self, Object length, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Exclusive @Cached SliceExactCastToInt toInt, @Shared @Cached ComputeIndices compute, @Cached IsBuiltinObjectProfile profileError, @Cached SliceCastToToBigInt castLengthNode, - @Cached CoerceToObjectSlice castNode, - @Shared @Cached PythonObjectFactory factory) { + @Cached CoerceToObjectSlice castNode) { try { - return doPSlice(frame, self, (int) toInt.execute(frame, inliningTarget, length), compute, factory); + return doPSlice(frame, self, (int) toInt.execute(frame, inliningTarget, length), compute, language); } catch (PException pe) { if (!profileError.profileException(inliningTarget, pe, PythonBuiltinClassType.OverflowError)) { throw pe; @@ -212,25 +295,14 @@ static PTuple doSliceObjectWithSlowPath(VirtualFrame frame, PSlice self, Object } Object lengthIn = castLengthNode.execute(inliningTarget, length); - PObjectSlice.SliceObjectInfo sliceInfo = PObjectSlice.computeIndicesSlowPath(castNode.execute(self), lengthIn, factory); - return factory.createTuple(new Object[]{sliceInfo.start, sliceInfo.stop, sliceInfo.step}); + PObjectSlice.SliceObjectInfo sliceInfo = PObjectSlice.computeIndicesSlowPath(castNode.execute(self), lengthIn, true); + return PFactory.createTuple(language, new Object[]{sliceInfo.start, sliceInfo.stop, sliceInfo.step}); } @Specialization(guards = {"isPNone(length)"}) static PTuple lengthNone(@SuppressWarnings("unused") PSlice self, @SuppressWarnings("unused") Object length, - @Cached PRaiseNode raise) { - throw raise.raise(ValueError); - } - } - - @Builtin(name = J___HASH__, minNumOfPositionalArgs = 1) - @GenerateNodeFactory - public abstract static class HashNode extends PythonBuiltinNode { - @SuppressWarnings("unused") - @Specialization - public static long hash(PSlice self, - @Cached PRaiseNode raise) { - throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.UNHASHABLE_TYPE_P, PythonBuiltinClassType.PSlice); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError); } } @@ -240,10 +312,10 @@ public abstract static class ReduceNode extends PythonUnaryBuiltinNode { @Specialization static Object reduce(PSlice self, @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached PythonObjectFactory factory) { - PTuple args = factory.createTuple(new Object[]{self.getStart(), self.getStop(), self.getStep()}); - return factory.createTuple(new Object[]{getClassNode.execute(inliningTarget, self), args}); + @Bind PythonLanguage language, + @Cached GetClassNode getClassNode) { + PTuple args = PFactory.createTuple(language, new Object[]{self.getStart(), self.getStop(), self.getStep()}); + return PFactory.createTuple(language, new Object[]{getClassNode.execute(inliningTarget, self), args}); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/slice/SliceNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/slice/SliceNodes.java index 7432624a01..e867c633bd 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/slice/SliceNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/slice/SliceNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,6 +45,7 @@ import java.math.BigInteger; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.ints.IntNodes.PyLongSign; import com.oracle.graal.python.lib.PyIndexCheckNode; @@ -57,7 +58,7 @@ import com.oracle.graal.python.nodes.util.CastToJavaBigIntegerNode; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.OverflowException; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; @@ -84,34 +85,34 @@ public abstract static class CreateSliceNode extends PNodeWithContext { @SuppressWarnings("unused") static PSlice doInt(int start, int stop, PNone step, - @Shared("factory") @Cached PythonObjectFactory factory) { - return factory.createIntSlice(start, stop, 1, false, true); + @Bind PythonLanguage language) { + return PFactory.createIntSlice(language, start, stop, 1, false, true); } @Specialization static PSlice doInt(int start, int stop, int step, - @Shared("factory") @Cached PythonObjectFactory factory) { - return factory.createIntSlice(start, stop, step); + @Bind PythonLanguage language) { + return PFactory.createIntSlice(language, start, stop, step); } @Specialization @SuppressWarnings("unused") static PSlice doInt(PNone start, int stop, PNone step, - @Shared("factory") @Cached PythonObjectFactory factory) { - return factory.createIntSlice(0, stop, 1, true, true); + @Bind PythonLanguage language) { + return PFactory.createIntSlice(language, 0, stop, 1, true, true); } @Specialization @SuppressWarnings("unused") static PSlice doInt(PNone start, int stop, int step, - @Shared("factory") @Cached PythonObjectFactory factory) { - return factory.createIntSlice(0, stop, step, true, false); + @Bind PythonLanguage language) { + return PFactory.createIntSlice(language, 0, stop, step, true, false); } @Fallback static PSlice doGeneric(Object start, Object stop, Object step, - @Shared("factory") @Cached PythonObjectFactory factory) { - return factory.createObjectSlice(start, stop, step); + @Bind PythonLanguage language) { + return PFactory.createObjectSlice(language, start, stop, step); } @NeverDefault @@ -136,13 +137,13 @@ public abstract static class AdjustIndices extends PNodeWithContext { @Specialization static PSlice.SliceInfo calc(Node inliningTarget, int length, PSlice.SliceInfo slice, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int start = slice.start; int stop = slice.stop; int step = slice.step; if (step == 0) { - raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.SLICE_STEP_CANNOT_BE_ZERO); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.SLICE_STEP_CANNOT_BE_ZERO); } assert step > Integer.MIN_VALUE : "step must not be minimum integer value"; @@ -206,8 +207,8 @@ PSlice.SliceInfo doSliceObject(VirtualFrame frame, PObjectSlice slice, int lengt @Specialization(guards = "length < 0") PSlice.SliceInfo doSliceInt(@SuppressWarnings("unused") PSlice slice, @SuppressWarnings("unused") int length, - @Cached PRaiseNode raise) { - throw raise.raise(ValueError, ErrorMessages.LENGTH_SHOULD_NOT_BE_NEG); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.LENGTH_SHOULD_NOT_BE_NEG); } } @@ -226,8 +227,8 @@ PObjectSlice doSliceInt(PIntSlice slice, @Shared @Cached SliceCastToToBigInt start, @Shared @Cached SliceCastToToBigInt stop, @Shared @Cached SliceCastToToBigInt step, - @Shared @Cached PythonObjectFactory factory) { - return factory.createObjectSlice(start.execute(inliningTarget, slice.getStart()), stop.execute(inliningTarget, slice.getStop()), step.execute(inliningTarget, slice.getStep())); + @Bind PythonLanguage language) { + return PFactory.createObjectSlice(language, start.execute(inliningTarget, slice.getStart()), stop.execute(inliningTarget, slice.getStop()), step.execute(inliningTarget, slice.getStep())); } protected static boolean isBigInt(PObjectSlice slice) { @@ -245,8 +246,8 @@ PObjectSlice doSliceObject(PObjectSlice slice, @Shared @Cached SliceCastToToBigInt start, @Shared @Cached SliceCastToToBigInt stop, @Shared @Cached SliceCastToToBigInt step, - @Shared @Cached PythonObjectFactory factory) { - return factory.createObjectSlice(start.execute(inliningTarget, slice.getStart()), stop.execute(inliningTarget, slice.getStop()), step.execute(inliningTarget, slice.getStep())); + @Bind PythonLanguage language) { + return PFactory.createObjectSlice(language, start.execute(inliningTarget, slice.getStart()), stop.execute(inliningTarget, slice.getStop()), step.execute(inliningTarget, slice.getStep())); } } @@ -271,8 +272,8 @@ static PSlice doSliceObject(Node inliningTarget, PObjectSlice slice, @Cached SliceLossyCastToInt start, @Cached SliceLossyCastToInt stop, @Cached SliceLossyCastToInt step, - @Cached(inline = false) PythonObjectFactory factory) { - return factory.createObjectSlice(start.execute(inliningTarget, slice.getStart()), stop.execute(inliningTarget, slice.getStop()), step.execute(inliningTarget, slice.getStep())); + @Bind PythonLanguage language) { + return PFactory.createObjectSlice(language, start.execute(inliningTarget, slice.getStart()), stop.execute(inliningTarget, slice.getStop()), step.execute(inliningTarget, slice.getStep())); } } @@ -296,7 +297,7 @@ static PSlice.SliceInfo doSliceInt(PIntSlice slice) { @InliningCutoff static PSlice.SliceInfo doSliceObject(Node inliningTarget, PObjectSlice slice, @Cached SliceLossyCastToInt toInt, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { /* this is harder to get right than you might think */ int start, stop, step; if (slice.getStep() == PNone.NONE) { @@ -304,7 +305,7 @@ static PSlice.SliceInfo doSliceObject(Node inliningTarget, PObjectSlice slice, } else { step = (int) toInt.execute(inliningTarget, slice.getStep()); if (step == 0) { - raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.SLICE_STEP_CANNOT_BE_ZERO); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.SLICE_STEP_CANNOT_BE_ZERO); } } @@ -338,10 +339,10 @@ public abstract static class SliceUnpackLong extends PNodeWithContext { @Specialization static PSlice.SliceInfoLong doSliceInt(Node inliningTarget, PIntSlice slice, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { long step = slice.getIntStep(); if (step == 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.SLICE_STEP_CANNOT_BE_ZERO); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.SLICE_STEP_CANNOT_BE_ZERO); } long start; @@ -356,7 +357,7 @@ static PSlice.SliceInfoLong doSliceInt(Node inliningTarget, PIntSlice slice, @Specialization static PSlice.SliceInfoLong doSliceObject(Node inliningTarget, PObjectSlice slice, @Cached SliceLossyCastToLong toInt, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { /* this is harder to get right than you might think */ long start, stop, step; if (slice.getStep() == PNone.NONE) { @@ -364,7 +365,7 @@ static PSlice.SliceInfoLong doSliceObject(Node inliningTarget, PObjectSlice slic } else { step = toInt.execute(inliningTarget, slice.getStep()); if (step == 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.SLICE_STEP_CANNOT_BE_ZERO); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.SLICE_STEP_CANNOT_BE_ZERO); } /* * Same as in CPython 'PySlice_Unpack': Here step might be -Long.MAX_VALUE-1; in @@ -409,13 +410,13 @@ protected static Object doNone(@SuppressWarnings("unused") PNone i) { @Specialization(guards = "!isPNone(i)") protected static Object doGeneric(Node inliningTarget, Object i, @Cached InlinedBranchProfile exceptionProfile, - @Cached PRaiseNode.Lazy raise, + @Cached PRaiseNode raise, @Cached CastToJavaBigIntegerNode cast) { try { return cast.execute(inliningTarget, i); } catch (PException e) { exceptionProfile.enter(inliningTarget); - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.SLICE_INDICES_MUST_BE_INT_NONE_HAVE_INDEX); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.SLICE_INDICES_MUST_BE_INT_NONE_HAVE_INDEX); } } } @@ -435,13 +436,13 @@ protected static Object doNone(@SuppressWarnings("unused") PNone i) { @Specialization(guards = "!isPNone(i)") protected static Object doGeneric(Node inliningTarget, Object i, - @Cached PRaiseNode.Lazy raise, + @Cached PRaiseNode raise, @Cached PyIndexCheckNode indexCheckNode, @Cached PyNumberAsSizeNode asSizeNode) { if (indexCheckNode.execute(inliningTarget, i)) { return asSizeNode.executeExact(null, inliningTarget, i); } - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.SLICE_INDICES_MUST_BE_INT_NONE_HAVE_INDEX); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.SLICE_INDICES_MUST_BE_INT_NONE_HAVE_INDEX); } } @@ -461,14 +462,14 @@ protected static Object doNone(@SuppressWarnings("unused") PNone i) { @Specialization(guards = "!isPNone(i)") protected static Object doGeneric(Node inliningTarget, Object i, @Cached InlinedBranchProfile exceptionProfile, - @Cached PRaiseNode.Lazy raise, + @Cached PRaiseNode raise, @Cached PyIndexCheckNode indexCheckNode, @Cached PyNumberAsSizeNode asSizeNode) { if (indexCheckNode.execute(inliningTarget, i)) { return asSizeNode.executeLossy(null, inliningTarget, i); } exceptionProfile.enter(inliningTarget); - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.SLICE_INDICES_MUST_BE_INT_NONE_HAVE_INDEX); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.SLICE_INDICES_MUST_BE_INT_NONE_HAVE_INDEX); } } @@ -482,7 +483,7 @@ public abstract static class SliceLossyCastToLong extends Node { @Specialization(guards = "!isPNone(i)") static long doGeneric(Node inliningTarget, Object i, - @Cached PRaiseNode.Lazy raise, + @Cached PRaiseNode raise, @Cached PyIndexCheckNode indexCheckNode, @Cached(inline = false) PyLongSign signNode, @Cached PyLongAsLongAndOverflowNode asSizeNode) { @@ -496,7 +497,7 @@ static long doGeneric(Node inliningTarget, Object i, return Long.MAX_VALUE; } } - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.SLICE_INDICES_MUST_BE_INT_NONE_HAVE_INDEX); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.SLICE_INDICES_MUST_BE_INT_NONE_HAVE_INDEX); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketBuiltins.java index afd7e26044..c58aa3ab58 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -51,8 +51,6 @@ import static com.oracle.graal.python.builtins.objects.exception.OSErrorEnum.ENOTSOCK; import static com.oracle.graal.python.builtins.objects.socket.PSocket.INVALID_FD; import static com.oracle.graal.python.nodes.BuiltinNames.T__SOCKET; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.runtime.PosixConstants.SOL_SOCKET; import static com.oracle.graal.python.runtime.PosixConstants.SO_ERROR; import static com.oracle.graal.python.runtime.PosixConstants.SO_PROTOCOL; @@ -60,7 +58,11 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -73,9 +75,10 @@ import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum; import com.oracle.graal.python.builtins.objects.socket.SocketUtils.TimeoutHelper; import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyLongAsIntNode; import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.HiddenAttr; import com.oracle.graal.python.nodes.PConstructAndRaiseNode; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; @@ -86,6 +89,7 @@ import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.runtime.GilNode; import com.oracle.graal.python.runtime.IndirectCallData; @@ -98,7 +102,7 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary.UniversalSockAddrLibrary; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.graal.python.util.TimeUtils; import com.oracle.truffle.api.CompilerDirectives; @@ -119,14 +123,16 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PSocket) public final class SocketBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = SocketBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return SocketBuiltinsFactory.getFactories(); } - private static void checkSelectable(Node inliningTarget, PRaiseNode.Lazy raiseNode, PSocket socket) { + private static void checkSelectable(Node inliningTarget, PRaiseNode raiseNode, PSocket socket) { if (!isSelectable(socket)) { - throw raiseNode.get(inliningTarget).raise(OSError, ErrorMessages.UNABLE_TO_SELECT_ON_SOCKET); + throw raiseNode.raise(inliningTarget, OSError, ErrorMessages.UNABLE_TO_SELECT_ON_SOCKET); } } @@ -134,7 +140,22 @@ private static boolean isSelectable(PSocket socket) { return socket.getTimeoutNs() <= 0 || socket.getFd() < PosixConstants.FD_SETSIZE.value; } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, parameterNames = {"$self", "family", "type", "proto", "fileno"}) + // socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "socket", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @GenerateNodeFactory + public abstract static class SocketNode extends PythonVarargsBuiltinNode { + // All the "real" work is done by __init__ + @Specialization + Object socket(Object cls, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createSocket(language, cls, getInstanceShape.execute(cls)); + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(name = "socket", minNumOfPositionalArgs = 1, parameterNames = {"$self", "family", "type", "proto", "fileno"}) @ArgumentClinic(name = "family", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "-1") @ArgumentClinic(name = "type", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "-1") @ArgumentClinic(name = "proto", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "-1") @@ -142,10 +163,10 @@ private static boolean isSelectable(PSocket socket) { public abstract static class InitNode extends PythonClinicBuiltinNode { @Specialization static Object init(VirtualFrame frame, PSocket self, int familyIn, int typeIn, int protoIn, @SuppressWarnings("unused") PNone fileno, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Bind("this") Node inliningTarget, @Exclusive @Cached SysModuleBuiltins.AuditNode auditNode, - @Exclusive @Cached HiddenAttr.ReadNode readNode, @Cached GilNode gil, @Exclusive @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { // sic! CPython really has __new__ there, even though it's in __init__ @@ -162,7 +183,6 @@ static Object init(VirtualFrame frame, PSocket self, int familyIn, int typeIn, i if (proto == -1) { proto = 0; } - PythonContext context = PythonContext.get(inliningTarget); try { // TODO SOCK_CLOEXEC? int fd; @@ -174,7 +194,7 @@ static Object init(VirtualFrame frame, PSocket self, int familyIn, int typeIn, i } try { posixLib.setInheritable(context.getPosixSupport(), fd, false); - sockInit(inliningTarget, context, posixLib, readNode, self, fd, family, type, proto); + sockInit(context, posixLib, self, fd, family, type, proto); } catch (Exception e) { // If we failed before giving the fd to python-land, close it CompilerDirectives.transferToInterpreterAndInvalidate(); @@ -193,21 +213,20 @@ static Object init(VirtualFrame frame, PSocket self, int familyIn, int typeIn, i @Specialization(guards = "!isPNone(fileno)") static Object init(VirtualFrame frame, PSocket self, int familyIn, int typeIn, int protoIn, Object fileno, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @CachedLibrary(limit = "1") UniversalSockAddrLibrary addrLib, @Bind("this") Node inliningTarget, @Exclusive @Cached SysModuleBuiltins.AuditNode auditNode, - @Exclusive @Cached HiddenAttr.ReadNode readNode, @Cached PyLongAsIntNode asIntNode, @Exclusive @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { // sic! CPython really has __new__ there, even though it's in __init__ auditNode.audit(inliningTarget, "socket.__new__", self, familyIn, typeIn, protoIn); - PythonContext context = PythonContext.get(inliningTarget); int fd = asIntNode.execute(frame, inliningTarget, fileno); if (fd < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.NEG_FILE_DESC); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NEG_FILE_DESC); } int family = familyIn; try { @@ -233,14 +252,14 @@ static Object init(VirtualFrame frame, PSocket self, int familyIn, int typeIn, i } else { proto = 0; } - sockInit(inliningTarget, context, posixLib, readNode, self, fd, family, type, proto); + sockInit(context, posixLib, self, fd, family, type, proto); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } return PNone.NONE; } - private static void sockInit(Node inliningTarget, PythonContext context, PosixSupportLibrary posixLib, HiddenAttr.ReadNode readNode, + private static void sockInit(PythonContext context, PosixSupportLibrary posixLib, PSocket self, int fd, int family, int type, int proto) throws PosixException { self.setFd(fd); self.setFamily(family); @@ -267,7 +286,7 @@ protected ArgumentClinicProvider getArgumentClinic() { } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory abstract static class ReprNode extends PythonUnaryBuiltinNode { @Specialization @@ -284,23 +303,23 @@ abstract static class AcceptNode extends PythonUnaryBuiltinNode { @Specialization static Object accept(VirtualFrame frame, PSocket self, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached SocketNodes.MakeSockAddrNode makeSockAddrNode, @Cached GilNode gil, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { checkSelectable(inliningTarget, raiseNode, self); try { - PosixSupport posixSupport = PosixSupport.get(inliningTarget); + PosixSupport posixSupport = context.getPosixSupport(); PosixSupportLibrary.AcceptResult acceptResult = SocketUtils.callSocketFunctionWithRetry(frame, inliningTarget, constructAndRaiseNode, posixLib, posixSupport, gil, self, (p, s) -> p.accept(s, self.getFd()), false, false); try { Object pythonAddr = makeSockAddrNode.execute(frame, inliningTarget, acceptResult.sockAddr); posixLib.setInheritable(posixSupport, acceptResult.socketFd, false); - return factory.createTuple(new Object[]{acceptResult.socketFd, pythonAddr}); + return PFactory.createTuple(context.getLanguage(inliningTarget), new Object[]{acceptResult.socketFd, pythonAddr}); } catch (Exception e) { // If we failed before giving the fd to python-land, close it CompilerDirectives.transferToInterpreterAndInvalidate(); @@ -322,9 +341,10 @@ static Object accept(VirtualFrame frame, PSocket self, @GenerateNodeFactory abstract static class BindNode extends PythonBinaryBuiltinNode { @Specialization - Object bind(VirtualFrame frame, PSocket self, Object address, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLibrary, + static Object bind(VirtualFrame frame, PSocket self, Object address, @Bind("this") Node inliningTarget, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLibrary, @Cached SocketNodes.GetSockAddrArgNode getSockAddrArgNode, @Cached SysModuleBuiltins.AuditNode auditNode, @Cached GilNode gil, @@ -335,7 +355,7 @@ Object bind(VirtualFrame frame, PSocket self, Object address, try { gil.release(true); try { - posixLibrary.bind(getPosixSupport(), self.getFd(), addr); + posixLibrary.bind(context.getPosixSupport(), self.getFd(), addr); } finally { gil.acquire(); } @@ -351,9 +371,10 @@ Object bind(VirtualFrame frame, PSocket self, Object address, @GenerateNodeFactory abstract static class CloseNode extends PythonUnaryBuiltinNode { @Specialization - Object close(VirtualFrame frame, PSocket socket, + static Object close(VirtualFrame frame, PSocket socket, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached GilNode gil, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { int fd = socket.getFd(); @@ -362,7 +383,7 @@ Object close(VirtualFrame frame, PSocket socket, socket.setFd(INVALID_FD); gil.release(true); try { - posixLib.close(getPosixSupport(), fd); + posixLib.close(context.getPosixSupport(), fd); } finally { gil.acquire(); } @@ -382,8 +403,9 @@ Object close(VirtualFrame frame, PSocket socket, @GenerateNodeFactory abstract static class ConnectNode extends PythonBinaryBuiltinNode { @Specialization - Object connect(VirtualFrame frame, PSocket self, Object address, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + static Object connect(VirtualFrame frame, PSocket self, Object address, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Bind("this") Node inliningTarget, @Cached SocketNodes.GetSockAddrArgNode getSockAddrArgNode, @Cached GilNode gil, @@ -394,7 +416,7 @@ Object connect(VirtualFrame frame, PSocket self, Object address, auditNode.audit(inliningTarget, "socket.connect", self, address); try { - doConnect(frame, inliningTarget, constructAndRaiseNode, posixLib, getPosixSupport(), gil, self, connectAddr); + doConnect(frame, inliningTarget, constructAndRaiseNode, posixLib, context.getPosixSupport(), gil, self, connectAddr); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -442,8 +464,9 @@ static void doConnect(Frame frame, Node inliningTarget, PConstructAndRaiseNode.L @GenerateNodeFactory abstract static class ConnectExNode extends PythonBinaryBuiltinNode { @Specialization - Object connectEx(VirtualFrame frame, PSocket self, Object address, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + static Object connectEx(VirtualFrame frame, PSocket self, Object address, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Bind("this") Node inliningTarget, @Cached SocketNodes.GetSockAddrArgNode getSockAddrArgNode, @Cached GilNode gil, @@ -454,7 +477,7 @@ Object connectEx(VirtualFrame frame, PSocket self, Object address, auditNode.audit(inliningTarget, "socket.connect", self, address); // sic! connect try { - ConnectNode.doConnect(frame, inliningTarget, constructAndRaiseNode, posixLib, getPosixSupport(), gil, self, connectAddr); + ConnectNode.doConnect(frame, inliningTarget, constructAndRaiseNode, posixLib, context.getPosixSupport(), gil, self, connectAddr); } catch (PosixException e) { return e.getErrorCode(); } @@ -467,9 +490,10 @@ Object connectEx(VirtualFrame frame, PSocket self, Object address, @GenerateNodeFactory abstract static class GetPeerNameNode extends PythonUnaryBuiltinNode { @Specialization - Object get(VirtualFrame frame, PSocket socket, + static Object get(VirtualFrame frame, PSocket socket, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached SocketNodes.MakeSockAddrNode makeSockAddrNode, @Cached GilNode gil, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { @@ -477,7 +501,7 @@ Object get(VirtualFrame frame, PSocket socket, UniversalSockAddr addr; gil.release(true); try { - addr = posixLib.getpeername(getPosixSupport(), socket.getFd()); + addr = posixLib.getpeername(context.getPosixSupport(), socket.getFd()); } finally { gil.acquire(); } @@ -493,9 +517,10 @@ Object get(VirtualFrame frame, PSocket socket, @GenerateNodeFactory abstract static class GetSockNameNode extends PythonUnaryBuiltinNode { @Specialization - Object get(VirtualFrame frame, PSocket socket, + static Object get(VirtualFrame frame, PSocket socket, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached SocketNodes.MakeSockAddrNode makeSockAddrNode, @Cached GilNode gil, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { @@ -503,7 +528,7 @@ Object get(VirtualFrame frame, PSocket socket, UniversalSockAddr addr; gil.release(true); try { - addr = posixLib.getsockname(getPosixSupport(), socket.getFd()); + addr = posixLib.getsockname(context.getPosixSupport(), socket.getFd()); } finally { gil.acquire(); } @@ -519,7 +544,7 @@ Object get(VirtualFrame frame, PSocket socket, @GenerateNodeFactory public abstract static class GetBlockingNode extends PythonUnaryBuiltinNode { @Specialization - public static boolean get(PSocket socket) { + static boolean get(PSocket socket) { return socket.getTimeoutNs() != 0; } } @@ -544,9 +569,10 @@ static Object get(PSocket socket) { @GenerateNodeFactory abstract static class ListenNode extends PythonBinaryClinicBuiltinNode { @Specialization - Object listen(VirtualFrame frame, PSocket self, int backlogIn, + static Object listen(VirtualFrame frame, PSocket self, int backlogIn, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached GilNode gil, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { int backlog = backlogIn; @@ -556,7 +582,7 @@ Object listen(VirtualFrame frame, PSocket self, int backlogIn, try { gil.release(true); try { - posixLib.listen(getPosixSupport(), self.getFd(), backlog); + posixLib.listen(context.getPosixSupport(), self.getFd(), backlog); } finally { gil.acquire(); } @@ -579,37 +605,38 @@ protected ArgumentClinicProvider getArgumentClinic() { @GenerateNodeFactory abstract static class RecvNode extends PythonTernaryClinicBuiltinNode { @Specialization - Object recv(VirtualFrame frame, PSocket socket, int recvlen, int flags, + static Object recv(VirtualFrame frame, PSocket socket, int recvlen, int flags, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached GilNode gil, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (recvlen < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.NEG_BUFF_SIZE_IN_RECV); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NEG_BUFF_SIZE_IN_RECV); } checkSelectable(inliningTarget, raiseNode, socket); + PythonLanguage language = context.getLanguage(inliningTarget); if (recvlen == 0) { - return factory.createEmptyBytes(); + return PFactory.createEmptyBytes(language); } byte[] bytes; try { bytes = new byte[recvlen]; } catch (OutOfMemoryError error) { - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } try { - int outlen = SocketUtils.callSocketFunctionWithRetry(frame, inliningTarget, constructAndRaiseNode, posixLib, getPosixSupport(), gil, socket, + int outlen = SocketUtils.callSocketFunctionWithRetry(frame, inliningTarget, constructAndRaiseNode, posixLib, context.getPosixSupport(), gil, socket, (p, s) -> p.recv(s, socket.getFd(), bytes, 0, bytes.length, flags), false, false); if (outlen == 0) { - return factory.createEmptyBytes(); + return PFactory.createEmptyBytes(language); } // TODO maybe resize if much smaller? - return factory.createBytes(bytes, outlen); + return PFactory.createBytes(language, bytes, outlen); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -628,16 +655,16 @@ protected ArgumentClinicProvider getArgumentClinic() { @GenerateNodeFactory abstract static class RecvFromNode extends PythonTernaryClinicBuiltinNode { @Specialization - Object recvFrom(VirtualFrame frame, PSocket socket, int recvlen, int flags, + static Object recvFrom(VirtualFrame frame, PSocket socket, int recvlen, int flags, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached GilNode gil, @Cached SocketNodes.MakeSockAddrNode makeSockAddrNode, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (recvlen < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.NEG_BUFF_SIZE_IN_RECVFROM); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NEG_BUFF_SIZE_IN_RECVFROM); } checkSelectable(inliningTarget, raiseNode, socket); @@ -645,21 +672,22 @@ Object recvFrom(VirtualFrame frame, PSocket socket, int recvlen, int flags, try { bytes = new byte[recvlen]; } catch (OutOfMemoryError error) { - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } try { - RecvfromResult result = SocketUtils.callSocketFunctionWithRetry(frame, inliningTarget, constructAndRaiseNode, posixLib, getPosixSupport(), gil, socket, + RecvfromResult result = SocketUtils.callSocketFunctionWithRetry(frame, inliningTarget, constructAndRaiseNode, posixLib, context.getPosixSupport(), gil, socket, (p, s) -> p.recvfrom(s, socket.getFd(), bytes, 0, bytes.length, flags), false, false); PBytes resultBytes; + PythonLanguage language = context.getLanguage(inliningTarget); if (result.readBytes == 0) { - resultBytes = factory.createEmptyBytes(); + resultBytes = PFactory.createEmptyBytes(language); } else { // TODO maybe resize if much smaller? - resultBytes = factory.createBytes(bytes, result.readBytes); + resultBytes = PFactory.createBytes(language, bytes, result.readBytes); } - return factory.createTuple(new Object[]{resultBytes, makeSockAddrNode.execute(frame, inliningTarget, result.sockAddr)}); + return PFactory.createTuple(language, new Object[]{resultBytes, makeSockAddrNode.execute(frame, inliningTarget, result.sockAddr)}); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -680,17 +708,18 @@ abstract static class RecvIntoNode extends PythonQuaternaryClinicBuiltinNode { @Specialization(limit = "3") static Object recvInto(VirtualFrame frame, PSocket socket, Object bufferObj, int recvlenIn, int flags, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("bufferObj") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached GilNode gil, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object buffer = bufferAcquireLib.acquireWritable(bufferObj, frame, indirectCallData); try { if (recvlenIn < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.NEG_BUFF_SIZE_IN_RECV_INTO); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NEG_BUFF_SIZE_IN_RECV_INTO); } int buflen = bufferLib.getBufferLength(buffer); int recvlen = recvlenIn; @@ -698,7 +727,7 @@ static Object recvInto(VirtualFrame frame, PSocket socket, Object bufferObj, int recvlen = buflen; } if (buflen < recvlen) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.BUFF_TOO_SMALL); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.BUFF_TOO_SMALL); } checkSelectable(inliningTarget, raiseNode, socket); @@ -711,13 +740,13 @@ static Object recvInto(VirtualFrame frame, PSocket socket, Object bufferObj, int try { bytes = new byte[recvlen]; } catch (OutOfMemoryError error) { - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } } final int len = recvlen; try { - int outlen = SocketUtils.callSocketFunctionWithRetry(frame, inliningTarget, constructAndRaiseNode, posixLib, PosixSupport.get(inliningTarget), gil, socket, + int outlen = SocketUtils.callSocketFunctionWithRetry(frame, inliningTarget, constructAndRaiseNode, posixLib, context.getPosixSupport(), gil, socket, (p, s) -> p.recv(s, socket.getFd(), bytes, 0, len, flags), false, false); if (!directWrite) { @@ -747,19 +776,19 @@ abstract static class RecvFromIntoNode extends PythonQuaternaryClinicBuiltinNode @Specialization(limit = "3") static Object recvFromInto(VirtualFrame frame, PSocket socket, Object bufferObj, int recvlenIn, int flags, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("bufferObj") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached GilNode gil, @Cached SocketNodes.MakeSockAddrNode makeSockAddrNode, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object buffer = bufferAcquireLib.acquireWritable(bufferObj, frame, indirectCallData); try { if (recvlenIn < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.NEG_BUFF_SIZE_IN_RECVFROM_INTO); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NEG_BUFF_SIZE_IN_RECVFROM_INTO); } int buflen = bufferLib.getBufferLength(buffer); int recvlen = recvlenIn; @@ -767,7 +796,7 @@ static Object recvFromInto(VirtualFrame frame, PSocket socket, Object bufferObj, recvlen = buflen; } if (buflen < recvlen) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.NBYTES_GREATER_THAT_BUFF); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NBYTES_GREATER_THAT_BUFF); } checkSelectable(inliningTarget, raiseNode, socket); @@ -780,18 +809,18 @@ static Object recvFromInto(VirtualFrame frame, PSocket socket, Object bufferObj, try { bytes = new byte[recvlen]; } catch (OutOfMemoryError error) { - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } } try { - RecvfromResult result = SocketUtils.callSocketFunctionWithRetry(frame, inliningTarget, constructAndRaiseNode, posixLib, PosixSupport.get(inliningTarget), gil, socket, + RecvfromResult result = SocketUtils.callSocketFunctionWithRetry(frame, inliningTarget, constructAndRaiseNode, posixLib, context.getPosixSupport(), gil, socket, (p, s) -> p.recvfrom(s, socket.getFd(), bytes, 0, bytes.length, flags), false, false); if (!directWrite) { bufferLib.writeFromByteArray(buffer, 0, bytes, 0, result.readBytes); } - return factory.createTuple(new Object[]{result.readBytes, makeSockAddrNode.execute(frame, inliningTarget, result.sockAddr)}); + return PFactory.createTuple(context.getLanguage(inliningTarget), new Object[]{result.readBytes, makeSockAddrNode.execute(frame, inliningTarget, result.sockAddr)}); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -814,13 +843,14 @@ abstract static class SendNode extends PythonTernaryClinicBuiltinNode { @Specialization(limit = "3") static int send(VirtualFrame frame, PSocket socket, Object bufferObj, int flags, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("bufferObj") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached GilNode gil, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object buffer = bufferAcquireLib.acquireReadonly(bufferObj, frame, indirectCallData); try { checkSelectable(inliningTarget, raiseNode, socket); @@ -829,7 +859,7 @@ static int send(VirtualFrame frame, PSocket socket, Object bufferObj, int flags, byte[] bytes = bufferLib.getInternalOrCopiedByteArray(buffer); try { - return SocketUtils.callSocketFunctionWithRetry(frame, inliningTarget, constructAndRaiseNode, posixLib, PosixSupport.get(inliningTarget), gil, socket, + return SocketUtils.callSocketFunctionWithRetry(frame, inliningTarget, constructAndRaiseNode, posixLib, context.getPosixSupport(), gil, socket, (p, s) -> p.send(s, socket.getFd(), bytes, 0, len, flags), true, false); } catch (PosixException e) { @@ -854,13 +884,14 @@ abstract static class SendAllNode extends PythonTernaryClinicBuiltinNode { @Specialization(limit = "3") static Object sendAll(VirtualFrame frame, PSocket socket, Object bufferObj, int flags, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("bufferObj") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached GilNode gil, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object buffer = bufferAcquireLib.acquireReadonly(bufferObj, frame, indirectCallData); try { checkSelectable(inliningTarget, raiseNode, socket); @@ -879,7 +910,7 @@ static Object sendAll(VirtualFrame frame, PSocket socket, Object bufferObj, int try { final int offset1 = offset; final int len1 = len; - int outlen = SocketUtils.callSocketFunctionWithRetry(frame, inliningTarget, constructAndRaiseNode, posixLib, PosixSupport.get(inliningTarget), gil, socket, + int outlen = SocketUtils.callSocketFunctionWithRetry(frame, inliningTarget, constructAndRaiseNode, posixLib, context.getPosixSupport(), gil, socket, (p, s) -> p.send(s, socket.getFd(), bytes, offset1, len1, flags), true, false, timeoutHelper); offset += outlen; @@ -912,17 +943,18 @@ abstract static class SendToNode extends PythonBuiltinNode { @Specialization(limit = "3") static Object sendTo(VirtualFrame frame, PSocket socket, Object bufferObj, Object flagsOrAddress, Object maybeAddress, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("bufferObj") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached InlinedConditionProfile hasFlagsProfile, @Cached PyLongAsIntNode asIntNode, @Cached SocketNodes.GetSockAddrArgNode getSockAddrArgNode, @Cached SysModuleBuiltins.AuditNode auditNode, @Cached GilNode gil, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int flags; Object address; if (hasFlagsProfile.profile(inliningTarget, maybeAddress == PNone.NO_VALUE)) { @@ -944,7 +976,7 @@ static Object sendTo(VirtualFrame frame, PSocket socket, Object bufferObj, Objec byte[] bytes = bufferLib.getInternalOrCopiedByteArray(buffer); try { - return SocketUtils.callSocketFunctionWithRetry(frame, inliningTarget, constructAndRaiseNode, posixLib, PosixSupport.get(inliningTarget), gil, socket, + return SocketUtils.callSocketFunctionWithRetry(frame, inliningTarget, constructAndRaiseNode, posixLib, context.getPosixSupport(), gil, socket, (p, s) -> p.sendto(s, socket.getFd(), bytes, 0, len, flags, addr), true, false); } catch (PosixException e) { @@ -961,12 +993,13 @@ static Object sendTo(VirtualFrame frame, PSocket socket, Object bufferObj, Objec @GenerateNodeFactory public abstract static class SetBlockingNode extends PythonBinaryClinicBuiltinNode { @Specialization - PNone doBoolean(VirtualFrame frame, PSocket socket, boolean blocking, + static PNone doBoolean(VirtualFrame frame, PSocket socket, boolean blocking, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - posixLib.setBlocking(getPosixSupport(), socket.getFd(), blocking); + posixLib.setBlocking(context.getPosixSupport(), socket.getFd(), blocking); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -985,15 +1018,16 @@ protected ArgumentClinicProvider getArgumentClinic() { @GenerateNodeFactory abstract static class SetTimeoutNode extends PythonBinaryBuiltinNode { @Specialization - Object setTimeout(VirtualFrame frame, PSocket socket, Object seconds, + static Object setTimeout(VirtualFrame frame, PSocket socket, Object seconds, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached SocketNodes.ParseTimeoutNode parseTimeoutNode, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { long timeout = parseTimeoutNode.execute(frame, inliningTarget, seconds); socket.setTimeoutNs(timeout); try { - posixLib.setBlocking(getPosixSupport(), socket.getFd(), timeout < 0); + posixLib.setBlocking(context.getPosixSupport(), socket.getFd(), timeout < 0); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -1007,12 +1041,13 @@ Object setTimeout(VirtualFrame frame, PSocket socket, Object seconds, @GenerateNodeFactory abstract static class ShutdownNode extends PythonBinaryClinicBuiltinNode { @Specialization - Object shutdown(VirtualFrame frame, PSocket socket, int how, + static Object shutdown(VirtualFrame frame, PSocket socket, int how, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { - posixLib.shutdown(getPosixSupport(), socket.getFd(), how); + posixLib.shutdown(context.getPosixSupport(), socket.getFd(), how); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -1084,8 +1119,9 @@ int detach(PSocket socket) { abstract static class SetSockOptNode extends PythonClinicBuiltinNode { @Specialization(guards = "isNoValue(none)") static Object setInt(VirtualFrame frame, PSocket socket, int level, int option, Object value, @SuppressWarnings("unused") PNone none, + @Bind PythonContext context, @Cached("createFor(this)") IndirectCallData indirectCallData, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @CachedLibrary(limit = "3") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @Bind("this") Node inliningTarget, @@ -1109,7 +1145,7 @@ static Object setInt(VirtualFrame frame, PSocket socket, int level, int option, } try { - posixLib.setsockopt(PosixSupport.get(inliningTarget), socket.getFd(), level, option, bytes, len); + posixLib.setsockopt(context.getPosixSupport(), socket.getFd(), level, option, bytes, len); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -1118,18 +1154,19 @@ static Object setInt(VirtualFrame frame, PSocket socket, int level, int option, @Specialization(guards = "isNone(none)") static Object setNull(VirtualFrame frame, PSocket socket, int level, int option, @SuppressWarnings("unused") PNone none, Object buflenObj, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Bind("this") Node inliningTarget, @Exclusive @Cached PyLongAsIntNode asIntNode, @Exclusive @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int buflen = asIntNode.execute(frame, inliningTarget, buflenObj); if (buflen < 0) { // GraalPython-specific because we don't have unsigned integers - throw raiseNode.get(inliningTarget).raise(OSError, ErrorMessages.SETSECKOPT_BUFF_OUT_OFRANGE); + throw raiseNode.raise(inliningTarget, OSError, ErrorMessages.SETSECKOPT_BUFF_OUT_OFRANGE); } try { - posixLib.setsockopt(PosixSupport.get(inliningTarget), socket.getFd(), level, option, null, buflen); + posixLib.setsockopt(context.getPosixSupport(), socket.getFd(), level, option, null, buflen); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -1139,8 +1176,8 @@ static Object setNull(VirtualFrame frame, PSocket socket, int level, int option, @Fallback @SuppressWarnings("unused") static Object error(Object self, Object level, Object option, Object flag1, Object flag2, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.SETSECKOPT_REQUIRERS_3RD_ARG_NULL); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.SETSECKOPT_REQUIRERS_3RD_ARG_NULL); } @Override @@ -1156,23 +1193,23 @@ protected ArgumentClinicProvider getArgumentClinic() { @GenerateNodeFactory abstract static class GetSockOptNode extends PythonQuaternaryClinicBuiltinNode { @Specialization - Object getSockOpt(VirtualFrame frame, PSocket socket, int level, int option, int buflen, + static Object getSockOpt(VirtualFrame frame, PSocket socket, int level, int option, int buflen, @Bind("this") Node inliningTarget, - @CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { if (buflen == 0) { byte[] result = new byte[4]; - posixLib.getsockopt(getPosixSupport(), socket.getFd(), level, option, result, result.length); + posixLib.getsockopt(context.getPosixSupport(), socket.getFd(), level, option, result, result.length); return PythonUtils.ARRAY_ACCESSOR.getInt(result, 0); } else if (buflen > 0 && buflen < 1024) { byte[] result = new byte[buflen]; - int len = posixLib.getsockopt(getPosixSupport(), socket.getFd(), level, option, result, result.length); - return factory.createBytes(result, len); + int len = posixLib.getsockopt(context.getPosixSupport(), socket.getFd(), level, option, result, result.length); + return PFactory.createBytes(context.getLanguage(inliningTarget), result, len); } else { - throw raiseNode.get(inliningTarget).raise(OSError, ErrorMessages.GETSECKOPT_BUFF_OUT_OFRANGE); + throw raiseNode.raise(inliningTarget, OSError, ErrorMessages.GETSECKOPT_BUFF_OUT_OFRANGE); } } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketNodes.java index db3af25fef..3bd1e0eac4 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -62,6 +62,7 @@ import java.util.Arrays; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.CodecsModuleBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; @@ -97,7 +98,7 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary.UnsupportedPosixFeatureException; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.TimeUtils; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -132,14 +133,14 @@ static UniversalSockAddr doInet(VirtualFrame frame, @SuppressWarnings("unused") @Cached @Shared("idnaConverter") IdnaFromStringOrBytesConverterNode idnaConverter, @Cached @Shared("errorProfile") IsBuiltinObjectProfile errorProfile, @Cached @Shared("setIpAddr") SetIpAddrNode setIpAddrNode, - @Cached @Shared PRaiseNode.Lazy raiseNode) { + @Cached @Shared PRaiseNode raiseNode) { PythonContext context = PythonContext.get(inliningTarget); if (!(address instanceof PTuple)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_AF_INET_VALUES_MUST_BE_TUPLE_NOT_P, caller, address); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_AF_INET_VALUES_MUST_BE_TUPLE_NOT_P, caller, address); } Object[] hostAndPort = getObjectArrayNode.execute(inliningTarget, address); if (hostAndPort.length != 2) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.AF_INET_VALUES_MUST_BE_PAIR); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.AF_INET_VALUES_MUST_BE_PAIR); } byte[] host = idnaConverter.execute(frame, hostAndPort[0]); int port = parsePort(frame, caller, asIntNode, inliningTarget, errorProfile, hostAndPort[1], raiseNode); @@ -158,14 +159,14 @@ static UniversalSockAddr doInet6(VirtualFrame frame, @SuppressWarnings("unused") @Cached @Shared("idnaConverter") IdnaFromStringOrBytesConverterNode idnaConverter, @Cached @Shared("errorProfile") IsBuiltinObjectProfile errorProfile, @Cached @Shared("setIpAddr") SetIpAddrNode setIpAddrNode, - @Cached @Shared PRaiseNode.Lazy raiseNode) { + @Cached @Shared PRaiseNode raiseNode) { PythonContext context = PythonContext.get(inliningTarget); if (!(address instanceof PTuple)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_AF_INET_VALUES_MUST_BE_TUPLE_NOT_S, caller, address); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_AF_INET_VALUES_MUST_BE_TUPLE_NOT_S, caller, address); } Object[] hostAndPort = getObjectArrayNode.execute(inliningTarget, address); if (hostAndPort.length < 2 || hostAndPort.length > 4) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.AF_INET6_ADDR_MUST_BE_TUPLE); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.AF_INET6_ADDR_MUST_BE_TUPLE); } byte[] host = idnaConverter.execute(frame, hostAndPort[0]); int port = parsePort(frame, caller, asIntNode, inliningTarget, errorProfile, hostAndPort[1], raiseNode); @@ -173,7 +174,7 @@ static UniversalSockAddr doInet6(VirtualFrame frame, @SuppressWarnings("unused") if (hostAndPort.length > 2) { flowinfo = asIntNode.execute(frame, inliningTarget, hostAndPort[2]); if (flowinfo < 0 || flowinfo > 0xfffff) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.S_FLOWINFO_RANGE, caller); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.S_FLOWINFO_RANGE, caller); } } int scopeid = 0; @@ -196,7 +197,7 @@ static UniversalSockAddr doUnix(VirtualFrame frame, @SuppressWarnings("unused") @CachedLibrary(limit = "1") PythonBufferAcquireLibrary bufferAcquireLib, @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, @CachedLibrary(limit = "1") @Shared("posixLib") PosixSupportLibrary posixLib, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { byte[] path; if (unicodeCheckNode.execute(inliningTarget, address)) { // PyUnicode_EncodeFSDefault @@ -219,17 +220,17 @@ static UniversalSockAddr doUnix(VirtualFrame frame, @SuppressWarnings("unused") try { return posixLib.createUniversalSockAddrUnix(posixSupport, new UnixSockAddr(path)); } catch (UnsupportedPosixFeatureException e) { - throw raiseNode.get(inliningTarget).raise(OSError, ErrorMessages.AF_UNIX_NOT_SUPPORTED, caller); + throw raiseNode.raise(inliningTarget, OSError, ErrorMessages.AF_UNIX_NOT_SUPPORTED, caller); } catch (InvalidUnixSocketPathException e) { - throw raiseNode.get(inliningTarget).raise(OSError, ErrorMessages.AF_UNIX_PATH_TOO_LONG, caller); + throw raiseNode.raise(inliningTarget, OSError, ErrorMessages.AF_UNIX_PATH_TOO_LONG, caller); } } @Specialization(guards = {"!isInet(socket)", "!isInet6(socket)", "!isUnix(socket)"}) @SuppressWarnings("unused") static UniversalSockAddr getSockAddr(VirtualFrame frame, PSocket socket, Object address, String caller, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(OSError, ErrorMessages.BAD_FAMILY, caller); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, OSError, ErrorMessages.BAD_FAMILY, caller); } static boolean isInet(PSocket socket) { @@ -245,7 +246,7 @@ static boolean isUnix(PSocket socket) { } private static int parsePort(VirtualFrame frame, String caller, PyLongAsIntNode asIntNode, Node inliningTarget, IsBuiltinObjectProfile errorProfile, Object portObj, - PRaiseNode.Lazy raiseNode) { + PRaiseNode raiseNode) { int port; try { port = asIntNode.execute(frame, inliningTarget, portObj); @@ -254,7 +255,7 @@ private static int parsePort(VirtualFrame frame, String caller, PyLongAsIntNode port = -1; } if (port < 0 || port > 0xffff) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.S_PORT_RANGE, caller); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.S_PORT_RANGE, caller); } return port; } @@ -279,7 +280,7 @@ static UniversalSockAddr setipaddr(VirtualFrame frame, byte[] name, int family, @Cached InetPtoNCachedPNode inetPtoNCachedPNode, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, @Cached GilNode gil, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { PythonContext context = PythonContext.get(inliningTarget); Object posixSupport = context.getPosixSupport(); try { @@ -291,7 +292,7 @@ static UniversalSockAddr setipaddr(VirtualFrame frame, byte[] name, int family, family, SOCK_DGRAM.value, 0, AI_PASSIVE.value); try { if (addrInfoLib.next(cursor)) { - throw raiseNode.get(inliningTarget).raise(OSError, ErrorMessages.WILD_CARD_RESOLVED_TO_MULTIPLE_ADDRESS); + throw raiseNode.raise(inliningTarget, OSError, ErrorMessages.WILD_CARD_RESOLVED_TO_MULTIPLE_ADDRESS); } return addrInfoLib.getSockAddr(cursor); } finally { @@ -304,7 +305,7 @@ static UniversalSockAddr setipaddr(VirtualFrame frame, byte[] name, int family, /* special-case broadcast - inet_addr() below can return INADDR_NONE for this */ if (Arrays.equals(name, BROADCAST_IP) || Arrays.equals(name, BROADCAST)) { if (family != AF_INET.value && family != AF_UNSPEC.value) { - throw raiseNode.get(inliningTarget).raise(OSError, ErrorMessages.ADDRESS_FAMILY_MISMATCHED); + throw raiseNode.raise(inliningTarget, OSError, ErrorMessages.ADDRESS_FAMILY_MISMATCHED); } return posixLib.createUniversalSockAddrInet4(posixSupport, new Inet4SockAddr(0, INADDR_BROADCAST.value)); } @@ -394,38 +395,38 @@ public abstract static class MakeSockAddrNode extends Node { static Object makeSockAddr(VirtualFrame frame, Node inliningTarget, UniversalSockAddr addr, @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, @CachedLibrary("addr") UniversalSockAddrLibrary addrLib, - @Cached(inline = false) PythonObjectFactory factory, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, @Cached(inline = false) TruffleString.FromJavaStringNode fromJavaStringNode, @Cached(inline = false) TruffleString.FromByteArrayNode fromByteArrayNode, @Cached(inline = false) TruffleString.SwitchEncodingNode switchEncodingNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { PythonContext context = PythonContext.get(inliningTarget); + PythonLanguage language = context.getLanguage(inliningTarget); int family = addrLib.getFamily(addr); if (family == AF_INET.value) { Inet4SockAddr inet4SockAddr = addrLib.asInet4SockAddr(addr); Object posixSupport = context.getPosixSupport(); TruffleString addressString = posixLib.getPathAsString(posixSupport, posixLib.inet_ntop(posixSupport, family, inet4SockAddr.getAddressAsBytes())); - return factory.createTuple(new Object[]{addressString, inet4SockAddr.getPort()}); + return PFactory.createTuple(language, new Object[]{addressString, inet4SockAddr.getPort()}); } else if (family == AF_INET6.value) { Inet6SockAddr inet6SockAddr = addrLib.asInet6SockAddr(addr); Object posixSupport = context.getPosixSupport(); TruffleString addressString = posixLib.getPathAsString(posixSupport, posixLib.inet_ntop(posixSupport, family, inet6SockAddr.getAddress())); - return factory.createTuple(new Object[]{addressString, inet6SockAddr.getPort(), inet6SockAddr.getFlowInfo(), inet6SockAddr.getScopeId()}); + return PFactory.createTuple(language, new Object[]{addressString, inet6SockAddr.getPort(), inet6SockAddr.getFlowInfo(), inet6SockAddr.getScopeId()}); } else if (family == AF_UNIX.value) { UnixSockAddr unixSockAddr = addrLib.asUnixSockAddr(addr); byte[] path = unixSockAddr.getPath(); if (PosixConstants.IS_LINUX && path.length > 0 && path[0] == 0) { // linux-specific "abstract" address - return factory.createBytes(arrayCopyOf(path, path.length)); + return PFactory.createBytes(language, arrayCopyOf(path, path.length)); } return bytesToString(path, fromByteArrayNode, switchEncodingNode); } else if (family == AF_UNSPEC.value) { // Can be returned from recvfrom when used on a connected socket return PNone.NONE; } else { - throw raiseNode.get(inliningTarget).raise(NotImplementedError, toTruffleStringUncached("makesockaddr: unknown address family")); + throw raiseNode.raise(inliningTarget, NotImplementedError, toTruffleStringUncached("makesockaddr: unknown address family")); } } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSError(frame, e.getErrorCode(), fromJavaStringNode.execute(e.getMessage(), TS_ENCODING)); @@ -457,7 +458,7 @@ static Object makeAddr(VirtualFrame frame, Node inliningTarget, UniversalSockAdd @CachedLibrary("addr") UniversalSockAddrLibrary addrLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, @Cached(inline = false) TruffleString.FromJavaStringNode fromJavaStringNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { PythonContext context = PythonContext.get(inliningTarget); int family = addrLib.getFamily(addr); @@ -470,7 +471,7 @@ static Object makeAddr(VirtualFrame frame, Node inliningTarget, UniversalSockAdd Object posixSupport = context.getPosixSupport(); return posixLib.getPathAsString(posixSupport, posixLib.inet_ntop(posixSupport, family, inet6SockAddr.getAddress())); } else { - throw raiseNode.get(inliningTarget).raise(NotImplementedError, toTruffleStringUncached("makesockaddr: unknown address family")); + throw raiseNode.raise(inliningTarget, NotImplementedError, toTruffleStringUncached("makesockaddr: unknown address family")); } } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSError(frame, e.getErrorCode(), fromJavaStringNode.execute(e.getMessage(), TS_ENCODING)); @@ -500,7 +501,7 @@ byte[] convert(VirtualFrame frame, Object value, @Cached TruffleString.SwitchEncodingNode switchEncodingNode, @Cached TruffleString.CopyToByteArrayNode copyToByteArrayNode, @Cached CodecsModuleBuiltins.EncodeNode encodeNode, - @Cached PRaiseNode.Lazy raise) { + @Cached PRaiseNode raise) { Object bytes; if (unicodeCheckNode.execute(inliningTarget, value)) { TruffleString string = castToString.execute(inliningTarget, value); @@ -517,9 +518,9 @@ byte[] convert(VirtualFrame frame, Object value, bytes = value; } else { if (builtinName != null) { - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.ARG_MUST_BE_STRING_OR_BYTELIKE_OR_BYTEARRAY, builtinName, argumentIndex, value); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.ARG_MUST_BE_STRING_OR_BYTELIKE_OR_BYTEARRAY, builtinName, argumentIndex, value); } else { - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.STR_BYTES_OR_BYTEARRAY_EXPECTED, value); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.STR_BYTES_OR_BYTEARRAY_EXPECTED, value); } } return bufferLib.getCopiedByteArray(bytes); @@ -553,10 +554,10 @@ static long parse(@SuppressWarnings("unused") PNone none) { @Specialization(guards = "!isNone(seconds)") static long parse(VirtualFrame frame, Node inliningTarget, Object seconds, @Cached PyTimeFromObjectNode timeFromObjectNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { long timeout = timeFromObjectNode.execute(frame, inliningTarget, seconds, RoundType.TIMEOUT, TimeUtils.SEC_TO_NS); if (timeout < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.TIMEOUT_VALUE_OUT_OF_RANGE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.TIMEOUT_VALUE_OUT_OF_RANGE); } return timeout; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/CertUtils.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/CertUtils.java index 76902ffaf2..f0a7459c18 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/CertUtils.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/CertUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -101,6 +101,7 @@ import org.bouncycastle.pkcs.PKCSException; import org.bouncycastle.util.encoders.DecoderException; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.common.HashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItem; import com.oracle.graal.python.builtins.objects.dict.PDict; @@ -108,8 +109,7 @@ import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PConstructAndRaiseNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.runtime.object.PythonObjectSlowPathFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.TruffleFile; import com.oracle.truffle.api.strings.TruffleString; @@ -186,19 +186,19 @@ static boolean isCrl(boolean[] keyUsage) { * _ssl.c#_decode_certificate */ @TruffleBoundary - public static PDict decodeCertificate(PythonObjectSlowPathFactory factory, X509Certificate cert) throws CertificateParsingException { - PDict dict = factory.createDict(); + public static PDict decodeCertificate(X509Certificate cert, PythonLanguage language) throws CertificateParsingException { + PDict dict = PFactory.createDict(language); HashingStorage storage = dict.getDictStorage(); try { - storage = setItem(storage, T_JAVA_X509_OCSP, parseOCSP(cert, factory)); - storage = setItem(storage, T_JAVA_X509_CA_ISSUERS, parseCAIssuers(cert, factory)); - storage = setItem(storage, T_JAVA_X509_ISSUER, createTupleForX509Name(cert.getIssuerX500Principal().getName("RFC1779"), factory)); + storage = setItem(storage, T_JAVA_X509_OCSP, parseOCSP(cert, language)); + storage = setItem(storage, T_JAVA_X509_CA_ISSUERS, parseCAIssuers(cert, language)); + storage = setItem(storage, T_JAVA_X509_ISSUER, createTupleForX509Name(cert.getIssuerX500Principal().getName("RFC1779"), language)); storage = setItem(storage, T_JAVA_X509_NOT_AFTER, getNotAfter(cert)); storage = setItem(storage, T_JAVA_X509_NOT_BEFORE, getNotBefore(cert)); storage = setItem(storage, T_JAVA_X509_SERIAL_NUMBER, getSerialNumber(cert)); - storage = setItem(storage, T_JAVA_X509_CRL_DISTRIBUTION_POINTS, parseCRLPoints(cert, factory)); - storage = setItem(storage, T_JAVA_X509_SUBJECT, createTupleForX509Name(cert.getSubjectX500Principal().getName("RFC1779"), factory)); - storage = setItem(storage, T_JAVA_X509_SUBJECT_ALT_NAME, parseSubjectAltName(cert, factory)); + storage = setItem(storage, T_JAVA_X509_CRL_DISTRIBUTION_POINTS, parseCRLPoints(cert, language)); + storage = setItem(storage, T_JAVA_X509_SUBJECT, createTupleForX509Name(cert.getSubjectX500Principal().getName("RFC1779"), language)); + storage = setItem(storage, T_JAVA_X509_SUBJECT_ALT_NAME, parseSubjectAltName(cert, language)); storage = setItem(storage, T_JAVA_X509_VERSION, getVersion(cert)); } catch (RuntimeException re) { throw PConstructAndRaiseNode.raiseUncachedSSLError(SSLErrorCode.ERROR_SSL, re); @@ -246,23 +246,23 @@ private static TruffleString formatDate(Date d) { } @TruffleBoundary - private static PTuple createTupleForX509Name(String name, PythonObjectFactory factory) { + private static PTuple createTupleForX509Name(String name, PythonLanguage language) { List result = new ArrayList<>(); for (String component : name.split(",")) { String[] kv = component.split("="); if (kv.length == 2) { - PTuple innerTuple = factory.createTuple(new Object[]{ASN1Helper.translateKeyToPython(kv[0].trim()), toTruffleStringUncached(kv[1].trim())}); - result.add(factory.createTuple(new Object[]{innerTuple})); + PTuple innerTuple = PFactory.createTuple(language, new Object[]{ASN1Helper.translateKeyToPython(kv[0].trim()), toTruffleStringUncached(kv[1].trim())}); + result.add(PFactory.createTuple(language, new Object[]{innerTuple})); } } // The String form is in the LDAP format, where the elements are in reverse order from what // was in the certificate Collections.reverse(result); - return factory.createTuple(result.toArray(new Object[0])); + return PFactory.createTuple(language, result.toArray(new Object[0])); } @TruffleBoundary - private static PTuple parseSubjectAltName(X509Certificate certificate, PythonObjectFactory factory) throws CertificateParsingException { + private static PTuple parseSubjectAltName(X509Certificate certificate, PythonLanguage language) throws CertificateParsingException { List tuples = new ArrayList<>(16); Collection> altNames = certificate.getSubjectAlternativeNames(); if (altNames != null) { @@ -279,38 +279,39 @@ private static PTuple parseSubjectAltName(X509Certificate certificate, PythonObj switch (type) { // see openssl v3_alt.c#i2v_GENERAL_NAME() case 0: - tuples.add(factory.createTuple(new Object[]{T_OTHERNAME, stringValue})); + tuples.add(PFactory.createTuple(language, new Object[]{T_OTHERNAME, stringValue})); break; case 1: - tuples.add(factory.createTuple(new Object[]{T_EMAIL, stringValue})); + tuples.add(PFactory.createTuple(language, new Object[]{T_EMAIL, stringValue})); break; case 2: - tuples.add(factory.createTuple(new Object[]{T_DNS, stringValue})); + tuples.add(PFactory.createTuple(language, new Object[]{T_DNS, stringValue})); break; case 3: - tuples.add(factory.createTuple(new Object[]{T_X_400_NAME, stringValue})); + tuples.add(PFactory.createTuple(language, new Object[]{T_X_400_NAME, stringValue})); break; case 4: - tuples.add(factory.createTuple(new Object[]{T_DIR_NAME, value instanceof String ? createTupleForX509Name((String) value, factory) : factory.createEmptyTuple()})); + tuples.add(PFactory.createTuple(language, + new Object[]{T_DIR_NAME, value instanceof String ? createTupleForX509Name((String) value, language) : PFactory.createEmptyTuple(language)})); break; case 5: - tuples.add(factory.createTuple(new Object[]{T_EDI_PARTY_NAME, stringValue})); + tuples.add(PFactory.createTuple(language, new Object[]{T_EDI_PARTY_NAME, stringValue})); break; case 6: - tuples.add(factory.createTuple(new Object[]{T_URI, stringValue})); + tuples.add(PFactory.createTuple(language, new Object[]{T_URI, stringValue})); break; case 7: - tuples.add(factory.createTuple(new Object[]{T_IP_ADDRESS, stringValue})); + tuples.add(PFactory.createTuple(language, new Object[]{T_IP_ADDRESS, stringValue})); break; case 8: - tuples.add(factory.createTuple(new Object[]{T_REGISTERED_ID, stringValue})); + tuples.add(PFactory.createTuple(language, new Object[]{T_REGISTERED_ID, stringValue})); break; default: continue; } } } - return factory.createTuple(tuples.toArray(new Object[tuples.size()])); + return PFactory.createTuple(language, tuples.toArray(new Object[tuples.size()])); } return null; } @@ -464,7 +465,7 @@ void iterateSequence(DerSequenceConsumer consumer, T value) thr } @TruffleBoundary - private static PTuple parseCRLPoints(X509Certificate cert, PythonObjectFactory factory) throws CertificateParsingException { + private static PTuple parseCRLPoints(X509Certificate cert, PythonLanguage language) throws CertificateParsingException { List result = new ArrayList<>(); byte[] bytes = cert.getExtensionValue(OID_CRL_DISTRIBUTION_POINTS); if (bytes == null) { @@ -502,14 +503,14 @@ private static PTuple parseCRLPoints(X509Certificate cert, PythonObjectFactory f } }, result); if (result.size() > 0) { - return factory.createTuple(result.toArray(new Object[result.size()])); + return PFactory.createTuple(language, result.toArray(new Object[result.size()])); } else { return null; } } @TruffleBoundary - private static PTuple parseCAIssuers(X509Certificate cert, PythonObjectFactory factory) throws CertificateParsingException { + private static PTuple parseCAIssuers(X509Certificate cert, PythonLanguage language) throws CertificateParsingException { List result = new ArrayList<>(); byte[] bytes = cert.getExtensionValue(OID_AUTHORITY_INFO_ACCESS); if (bytes == null) { @@ -538,14 +539,14 @@ private static PTuple parseCAIssuers(X509Certificate cert, PythonObjectFactory f } }, result); if (result.size() > 0) { - return factory.createTuple(result.toArray(new Object[result.size()])); + return PFactory.createTuple(language, result.toArray(new Object[result.size()])); } else { return null; } } @TruffleBoundary - private static PTuple parseOCSP(X509Certificate cert, PythonObjectFactory factory) throws CertificateParsingException { + private static PTuple parseOCSP(X509Certificate cert, PythonLanguage language) throws CertificateParsingException { List result = new ArrayList<>(); byte[] bytes = cert.getExtensionValue(OID_AUTHORITY_INFO_ACCESS); if (bytes == null) { @@ -574,7 +575,7 @@ private static PTuple parseOCSP(X509Certificate cert, PythonObjectFactory factor } }, result); if (result.size() > 0) { - return factory.createTuple(result.toArray(new Object[result.size()])); + return PFactory.createTuple(language, result.toArray(new Object[result.size()])); } else { return null; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/MemoryBIOBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/MemoryBIOBuiltins.java index b4c0a6403a..51428ff7b8 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/MemoryBIOBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/MemoryBIOBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,7 +45,11 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -53,6 +57,8 @@ import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; import com.oracle.graal.python.builtins.objects.bytes.PBytes; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.nodes.PConstructAndRaiseNode; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; @@ -60,7 +66,7 @@ import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.runtime.IndirectCallData; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.OverflowException; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -73,18 +79,23 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PMemoryBIO) public final class MemoryBIOBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = MemoryBIOBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return MemoryBIOBuiltinsFactory.getFactories(); } - @Builtin(name = "MemoryBIO", constructsClass = PythonBuiltinClassType.PMemoryBIO, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "MemoryBIO", minNumOfPositionalArgs = 1) @GenerateNodeFactory abstract static class MemoryBIONode extends PythonUnaryBuiltinNode { @Specialization static PMemoryBIO create(Object type, - @Cached PythonObjectFactory factory) { - return factory.createMemoryBIO(type); + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createMemoryBIO(language, type, getInstanceShape.execute(type)); } } @@ -112,9 +123,9 @@ static boolean eof(PMemoryBIO self) { abstract static class ReadNode extends PythonBinaryClinicBuiltinNode { @Specialization static PBytes read(PMemoryBIO self, int size, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { int len = size >= 0 ? size : Integer.MAX_VALUE; - return factory.createBytes(self.read(len)); + return PFactory.createBytes(language, self.read(len)); } @Override @@ -133,7 +144,7 @@ static int write(VirtualFrame frame, PMemoryBIO self, Object buffer, @Cached("createFor(this)") IndirectCallData indirectCallData, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { if (self.didWriteEOF()) { throw constructAndRaiseNode.get(inliningTarget).raiseSSLError(frame, SSL_CANNOT_WRITE_AFTER_EOF); @@ -144,7 +155,7 @@ static int write(VirtualFrame frame, PMemoryBIO self, Object buffer, self.write(bytes, len); return len; } catch (OverflowException | OutOfMemoryError e) { - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } } finally { bufferLib.release(buffer, frame, indirectCallData); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLCipherSelector.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLCipherSelector.java index b69faff792..7ef0a4df79 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLCipherSelector.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLCipherSelector.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -111,7 +111,7 @@ private static void selectSingle(Node node, String cipherString, List if (cipherString.startsWith("@STRENGTH")) { selected.sort(Comparator.comparingInt(SSLCipher::getStrengthBits).reversed()); } else if (cipherString.startsWith("@SECLEVEL=")) { - throw PRaiseNode.raiseUncached(node, NotImplementedError, toTruffleStringUncached("@SECLEVEL not implemented")); + throw PRaiseNode.raiseStatic(node, NotImplementedError, toTruffleStringUncached("@SECLEVEL not implemented")); } else { throw PConstructAndRaiseNode.raiseUncachedSSLError(ErrorMessages.NO_CIPHER_CAN_BE_SELECTED); } @@ -133,7 +133,7 @@ private static List getCiphersForCipherString(Node node, String ciphe List ciphers = SSLCipherStringMapping.get(component); if (ciphers == null) { if (component.equals("PROFILE=SYSTEM")) { - throw PRaiseNode.raiseUncached(node, NotImplementedError, toTruffleStringUncached("PROFILE=SYSTEM not implemented")); + throw PRaiseNode.raiseStatic(node, NotImplementedError, toTruffleStringUncached("PROFILE=SYSTEM not implemented")); } return Collections.emptyList(); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLContextBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLContextBuiltins.java index e91e60e84f..2011290203 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLContextBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLContextBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -78,7 +78,11 @@ import org.bouncycastle.util.encoders.DecoderException; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -101,6 +105,8 @@ import com.oracle.graal.python.builtins.objects.ssl.CertUtils.NeedsPasswordException; import com.oracle.graal.python.builtins.objects.ssl.CertUtils.NoCertificateFoundException; import com.oracle.graal.python.builtins.objects.str.StringNodes; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyCallableCheckNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyNumberIndexNode; @@ -120,14 +126,13 @@ import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaLongExactNode; import com.oracle.graal.python.nodes.util.CastToJavaStringNode; import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.IPAddressUtil; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; @@ -141,7 +146,6 @@ import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; @@ -152,12 +156,15 @@ public final class SSLContextBuiltins extends PythonBuiltins { private static final TruffleString T_ENVIRON = tsLiteral("environ"); + public static final TpSlots SLOTS = SSLContextBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return SSLContextBuiltinsFactory.getFactories(); } - @Builtin(name = "_SSLContext", constructsClass = PythonBuiltinClassType.PSSLContext, minNumOfPositionalArgs = 2, parameterNames = {"type", "protocol"}) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "_SSLContext", minNumOfPositionalArgs = 2, parameterNames = {"type", "protocol"}) @ArgumentClinic(name = "protocol", conversion = ArgumentClinic.ClinicConversion.Int) @GenerateNodeFactory abstract static class SSLContextNode extends PythonBinaryClinicBuiltinNode { @@ -165,12 +172,13 @@ abstract static class SSLContextNode extends PythonBinaryClinicBuiltinNode { @Specialization static PSSLContext createContext(VirtualFrame frame, Object type, int protocol, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { SSLMethod method = SSLMethod.fromPythonId(protocol); if (method == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.INVALID_OR_UNSUPPORTED_PROTOCOL_VERSION, "NULL"); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.INVALID_OR_UNSUPPORTED_PROTOCOL_VERSION, "NULL"); } try { boolean checkHostname; @@ -182,7 +190,8 @@ static PSSLContext createContext(VirtualFrame frame, Object type, int protocol, checkHostname = false; verifyMode = SSLModuleBuiltins.SSL_CERT_NONE; } - PSSLContext context = factory.createSSLContext(type, method, SSLModuleBuiltins.X509_V_FLAG_TRUSTED_FIRST, checkHostname, verifyMode, createSSLContext()); + PSSLContext context = PFactory.createSSLContext(language, type, getInstanceShape.execute(type), method, SSLModuleBuiltins.X509_V_FLAG_TRUSTED_FIRST, checkHostname, verifyMode, + createSSLContext()); long options = SSLOptions.SSL_OP_ALL; if (method != SSLMethod.SSL3) { options |= SSLOptions.SSL_OP_NO_SSLv3; @@ -190,7 +199,7 @@ static PSSLContext createContext(VirtualFrame frame, Object type, int protocol, context.setOptions(options); return context; } catch (NoSuchAlgorithmException e) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.INVALID_OR_UNSUPPORTED_PROTOCOL_VERSION, e); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.INVALID_OR_UNSUPPORTED_PROTOCOL_VERSION, e); } catch (KeyManagementException e) { throw constructAndRaiseNode.get(inliningTarget).raiseSSLError(frame, SSLErrorCode.ERROR_SSL, e); } @@ -227,9 +236,9 @@ static SSLEngine createSSLEngine(Node raisingNode, PSSLContext context, boolean parameters.setServerNames(Collections.singletonList(new SNIHostName(serverHostname))); } catch (IllegalArgumentException e) { if (serverHostname.contains("\0")) { - throw PRaiseNode.raiseUncached(raisingNode, TypeError, ErrorMessages.ARG_MUST_BE_ENCODED_NON_NULL); + throw PRaiseNode.raiseStatic(raisingNode, TypeError, ErrorMessages.ARG_MUST_BE_ENCODED_NON_NULL); } - throw PRaiseNode.raiseUncached(raisingNode, ValueError, ErrorMessages.INVALID_HOSTNAME); + throw PRaiseNode.raiseStatic(raisingNode, ValueError, ErrorMessages.INVALID_HOSTNAME); } if (context.getCheckHostname()) { parameters.setEndpointIdentificationAlgorithm("HTTPS"); @@ -284,15 +293,15 @@ abstract static class WrapSocketNode extends PythonClinicBuiltinNode { @Specialization static Object wrap(PSSLContext context, PSocket sock, boolean serverSide, Object serverHostnameObj, Object owner, @SuppressWarnings("unused") PNone session, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached StringNodes.CastToTruffleStringCheckedNode cast, - @Cached TruffleString.ToJavaStringNode toJavaStringNode, - @Cached PythonObjectFactory factory) { + @Cached TruffleString.ToJavaStringNode toJavaStringNode) { TruffleString serverHostname = null; if (!(serverHostnameObj instanceof PNone)) { serverHostname = cast.cast(inliningTarget, serverHostnameObj, ErrorMessages.S_MUST_BE_NONE_OR_STRING, "serverHostname", serverHostnameObj); } SSLEngine engine = createSSLEngine(inliningTarget, context, serverSide, serverHostname == null ? null : toJavaStringNode.execute(serverHostname)); - PSSLSocket sslSocket = factory.createSSLSocket(PythonBuiltinClassType.PSSLSocket, context, engine, sock); + PSSLSocket sslSocket = PFactory.createSSLSocket(language, context, engine, sock); if (!(owner instanceof PNone)) { sslSocket.setOwner(owner); } @@ -303,8 +312,8 @@ static Object wrap(PSSLContext context, PSocket sock, boolean serverSide, Object @Fallback @SuppressWarnings("unused") static Object wrap(Object context, Object sock, Object serverSide, Object serverHostname, Object owner, Object session, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.INVALID_WRAP_SOCKET_CALL); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.INVALID_WRAP_SOCKET_CALL); } @Override @@ -321,15 +330,15 @@ abstract static class WrapBIONode extends PythonClinicBuiltinNode { static Object wrap(PSSLContext context, PMemoryBIO incoming, PMemoryBIO outgoing, boolean serverSide, Object serverHostnameObj, Object owner, @SuppressWarnings("unused") PNone session, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached StringNodes.CastToTruffleStringCheckedNode cast, - @Cached TruffleString.ToJavaStringNode toJavaStringNode, - @Cached PythonObjectFactory factory) { + @Cached TruffleString.ToJavaStringNode toJavaStringNode) { TruffleString serverHostname = null; if (!(serverHostnameObj instanceof PNone)) { serverHostname = cast.cast(inliningTarget, serverHostnameObj, ErrorMessages.S_MUST_BE_NONE_OR_STRING, "serverHostname", serverHostnameObj); } SSLEngine engine = createSSLEngine(inliningTarget, context, serverSide, serverHostname == null ? null : toJavaStringNode.execute(serverHostname)); - PSSLSocket sslSocket = factory.createSSLSocket(PythonBuiltinClassType.PSSLSocket, context, engine, incoming, outgoing); + PSSLSocket sslSocket = PFactory.createSSLSocket(language, context, engine, incoming, outgoing); if (!(owner instanceof PNone)) { sslSocket.setOwner(owner); } @@ -340,8 +349,8 @@ static Object wrap(PSSLContext context, PMemoryBIO incoming, PMemoryBIO outgoing @Fallback @SuppressWarnings("unused") static Object wrap(Object context, Object incoming, Object outgoing, Object serverSide, Object serverHostname, Object owner, Object session, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.INVALID_WRAP_BIO_CALL); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.INVALID_WRAP_BIO_CALL); } @Override @@ -360,9 +369,8 @@ static boolean getCheckHostname(PSSLContext self, @SuppressWarnings("unused") PN @Specialization(guards = "!isNoValue(value)") static Object setCheckHostname(VirtualFrame frame, PSSLContext self, Object value, - @Bind("this") Node inliningTarget, @Cached PyObjectIsTrueNode isTrueNode) { - boolean checkHostname = isTrueNode.execute(frame, inliningTarget, value); + boolean checkHostname = isTrueNode.execute(frame, value); if (checkHostname && self.getVerifyMode() == SSLModuleBuiltins.SSL_CERT_NONE) { self.setVerifyMode(SSLModuleBuiltins.SSL_CERT_REQUIRED); } @@ -430,10 +438,10 @@ static int get(PSSLContext self, @SuppressWarnings("unused") PNone value) { static Object set(VirtualFrame frame, PSSLContext self, Object value, @Bind("this") Node inliningTarget, @Cached PyNumberAsSizeNode asSizeNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int mode = asSizeNode.executeLossy(frame, inliningTarget, value); if (mode == SSLModuleBuiltins.SSL_CERT_NONE && self.getCheckHostname()) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.CANNOT_SET_VERIFY_MODE_TO_CERT_NONE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.CANNOT_SET_VERIFY_MODE_TO_CERT_NONE); } switch (mode) { case SSLModuleBuiltins.SSL_CERT_NONE: @@ -442,14 +450,14 @@ static Object set(VirtualFrame frame, PSSLContext self, Object value, self.setVerifyMode(mode); return PNone.NONE; default: - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.INVALID_VALUE_FOR_VERIFY_MODE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.INVALID_VALUE_FOR_VERIFY_MODE); } } } - private static void setMinMaxVersion(Node inliningTarget, PRaiseNode.Lazy raiseNode, PSSLContext context, boolean maximum, int value) { + private static void setMinMaxVersion(Node inliningTarget, PRaiseNode raiseNode, PSSLContext context, boolean maximum, int value) { if (context.getMethod().isSingleVersion()) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.CONTEXT_DOESNT_SUPPORT_MIN_MAX); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.CONTEXT_DOESNT_SUPPORT_MIN_MAX); } SSLProtocol selected = null; switch (value) { @@ -467,7 +475,7 @@ private static void setMinMaxVersion(Node inliningTarget, PRaiseNode.Lazy raiseN } } if (selected == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.UNSUPPORTED_PROTOCOL_VERSION, value); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.UNSUPPORTED_PROTOCOL_VERSION, value); } } if (maximum) { @@ -489,7 +497,7 @@ static int get(PSSLContext self, @SuppressWarnings("unused") Object none) { static Object set(VirtualFrame frame, PSSLContext self, Object obj, @Bind("this") Node inliningTarget, @Cached PyNumberAsSizeNode asSizeNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { setMinMaxVersion(inliningTarget, raiseNode, self, false, asSizeNode.executeExact(frame, inliningTarget, obj)); return PNone.NONE; } @@ -507,7 +515,7 @@ static int get(PSSLContext self, @SuppressWarnings("unused") Object none) { static Object set(VirtualFrame frame, PSSLContext self, Object obj, @Bind("this") Node inliningTarget, @Cached PyNumberAsSizeNode asSizeNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { setMinMaxVersion(inliningTarget, raiseNode, self, true, asSizeNode.executeExact(frame, inliningTarget, obj)); return PNone.NONE; } @@ -518,13 +526,14 @@ static Object set(VirtualFrame frame, PSSLContext self, Object obj, abstract static class GetCiphersNode extends PythonUnaryBuiltinNode { @Specialization @TruffleBoundary - static PList getCiphers(PSSLContext self) { + static PList getCiphers(PSSLContext self, + @Bind PythonLanguage language) { List ciphers = self.computeEnabledCiphers(self.getContext().createSSLEngine()); Object[] dicts = new Object[ciphers.size()]; for (int i = 0; i < dicts.length; i++) { - dicts[i] = PythonObjectFactory.getUncached().createDict(ciphers.get(i).asKeywords()); + dicts[i] = PFactory.createDict(language, ciphers.get(i).asKeywords()); } - return PythonObjectFactory.getUncached().createList(dicts); + return PFactory.createList(language, dicts); } } @@ -547,22 +556,21 @@ protected ArgumentClinicProvider getArgumentClinic() { @Builtin(name = "num_tickets", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, isGetter = true, isSetter = true) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class NumTicketsNode extends PythonBinaryBuiltinNode { @SuppressWarnings("unused") @Specialization(guards = "isNoValue(value)") static int get(PSSLContext self, PNone value, - @Shared @Cached PRaiseNode raiseNode) { + @Bind("this") Node inliningTarget) { // not used yet so rather raise error - throw raiseNode.raise(NotImplementedError); + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError); } @SuppressWarnings("unused") @Specialization(guards = "!isNoValue(value)") static Object set(VirtualFrame frame, PSSLContext self, Object value, - @Shared @Cached PRaiseNode raiseNode) { + @Bind("this") Node inliningTarget) { // not used yet so rather raise error - throw raiseNode.raise(NotImplementedError); + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError); // int num; // try { // num = (int) castToLong.execute(lib.asIndexWithFrame(value, frame)); @@ -585,8 +593,8 @@ static Object set(VirtualFrame frame, PSSLContext self, Object value, abstract static class SNICallbackNode extends PythonBinaryBuiltinNode { @Specialization static Object notImplemented(@SuppressWarnings("unused") PSSLContext self, @SuppressWarnings("unused") Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(NotImplementedError); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError); } } @@ -642,13 +650,13 @@ Object set(VirtualFrame frame, PSSLContext self, @NeverDefault @TruffleBoundary protected PBytes createCertFileKey() { - return PythonObjectFactory.getUncached().createBytes("SSL_CERT_FILE".getBytes()); + return PFactory.createBytes(PythonLanguage.get(null), "SSL_CERT_FILE".getBytes()); } @NeverDefault @TruffleBoundary protected PBytes createCertDirKey() { - return PythonObjectFactory.getUncached().createBytes("SSL_CERT_DIR".getBytes()); + return PFactory.createBytes(PythonLanguage.get(null), "SSL_CERT_DIR".getBytes()); } @NeverDefault @@ -684,8 +692,8 @@ abstract static class CertStoreStatsNode extends PythonUnaryBuiltinNode { @Specialization static Object storeStats(VirtualFrame frame, PSSLContext self, @Bind("this") Node inliningTarget, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { int x509 = 0, crl = 0, ca = 0; for (X509Certificate cert : self.getCACerts()) { @@ -699,7 +707,7 @@ static Object storeStats(VirtualFrame frame, PSSLContext self, } } } - return factory.createDict(new PKeyword[]{new PKeyword(T_X509, x509), new PKeyword(T_CRL, crl), new PKeyword(T_X509_CA, ca)}); + return PFactory.createDict(language, new PKeyword[]{new PKeyword(T_X509, x509), new PKeyword(T_CRL, crl), new PKeyword(T_X509_CA, ca)}); } catch (Exception ex) { throw constructAndRaiseNode.get(inliningTarget).raiseSSLError(frame, SSLErrorCode.ERROR_SSL, ex); } @@ -708,7 +716,6 @@ static Object storeStats(VirtualFrame frame, PSSLContext self, @Builtin(name = "load_verify_locations", minNumOfPositionalArgs = 1, parameterNames = {"$self", "cafile", "capath", "cadata"}) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class LoadVerifyLocationsNode extends PythonQuaternaryBuiltinNode { @Specialization Object load(VirtualFrame frame, PSSLContext self, Object cafile, Object capath, Object cadata, @@ -719,15 +726,15 @@ Object load(VirtualFrame frame, PSSLContext self, Object cafile, Object capath, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, @Cached TruffleString.ToJavaStringNode toJavaStringNode, @Cached TruffleString.EqualNode eqNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (cafile instanceof PNone && capath instanceof PNone && cadata instanceof PNone) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CA_FILE_PATH_DATA_CANNOT_BE_ALL_OMMITED); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CA_FILE_PATH_DATA_CANNOT_BE_ALL_OMMITED); } if (!(cafile instanceof PNone) && !PGuards.isString(cafile) && !PGuards.isBytes(cafile)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_SHOULD_BE_A_VALID_FILESYSTEMPATH, "cafile"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_SHOULD_BE_A_VALID_FILESYSTEMPATH, "cafile"); } if (!(capath instanceof PNone) && !PGuards.isString(capath) && !PGuards.isBytes(capath)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_SHOULD_BE_A_VALID_FILESYSTEMPATH, "capath"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_SHOULD_BE_A_VALID_FILESYSTEMPATH, "capath"); } final TruffleFile file; if (!(cafile instanceof PNone)) { @@ -754,7 +761,7 @@ Object load(VirtualFrame frame, PSSLContext self, Object cafile, Object capath, if (cadata instanceof PBytesLike) { certificates = fromBytesLike(toBytes.execute(inliningTarget, ((PBytesLike) cadata).getSequenceStorage())); } else { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_SHOULD_BE_ASCII_OR_BYTELIKE, "cadata"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_SHOULD_BE_ASCII_OR_BYTELIKE, "cadata"); } } self.setCAEntries(certificates); @@ -786,10 +793,10 @@ private TruffleFile toTruffleFile(VirtualFrame frame, Node inliningTarget, PyUni } } - private static List fromString(Node inliningTarget, String dataString, PRaiseNode.Lazy raiseNode) + private static List fromString(Node inliningTarget, String dataString, PRaiseNode raiseNode) throws IOException, CertificateException, CRLException { if (dataString.isEmpty()) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.EMPTY_CERTIFICATE_DATA); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.EMPTY_CERTIFICATE_DATA); } return getCertificates(dataString); } @@ -831,7 +838,6 @@ private static Collection fromBytesLike(byte[] bytes) { @Builtin(name = "load_cert_chain", minNumOfPositionalArgs = 2, parameterNames = {"$self", "certfile", "keyfile", "password"}) @GenerateNodeFactory - @TypeSystemReference(PythonArithmeticTypes.class) abstract static class LoadCertChainNode extends PythonQuaternaryBuiltinNode { @Specialization Object load(VirtualFrame frame, PSSLContext self, Object certfile, Object keyfile, Object passwordObj, @@ -841,12 +847,12 @@ Object load(VirtualFrame frame, PSSLContext self, Object certfile, Object keyfil @Cached GetPasswordNode getPasswordNode, @Cached TruffleString.ToJavaStringNode toJavaStringNode, @Cached TruffleString.EqualNode eqNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (!PGuards.isString(certfile) && !PGuards.isBytes(certfile)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_SHOULD_BE_A_VALID_FILESYSTEMPATH, "certfile"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_SHOULD_BE_A_VALID_FILESYSTEMPATH, "certfile"); } if (!(keyfile instanceof PNone) && !PGuards.isString(keyfile) && !PGuards.isBytes(keyfile)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_SHOULD_BE_A_VALID_FILESYSTEMPATH, "keyfile"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_SHOULD_BE_A_VALID_FILESYSTEMPATH, "keyfile"); } Object kf = keyfile instanceof PNone ? certfile : keyfile; TruffleFile certTruffleFile = toTruffleFile(frame, inliningTarget, asPath.execute(frame, certfile), toJavaStringNode, eqNode, constructAndRaiseNode); @@ -863,7 +869,7 @@ Object load(VirtualFrame frame, PSSLContext self, Object certfile, Object keyfil throw CompilerDirectives.shouldNotReachHere(); } } - throw raiseNode.get(inliningTarget).raise(NotImplementedError, ErrorMessages.PASSWORD_NOT_IMPLEMENTED); + throw raiseNode.raise(inliningTarget, NotImplementedError, ErrorMessages.PASSWORD_NOT_IMPLEMENTED); } } catch (IOException ex) { throw constructAndRaiseNode.get(inliningTarget).raiseSSLError(frame, SSLErrorCode.ERROR_SSL, ex); @@ -884,7 +890,7 @@ private BufferedReader getReader(TruffleFile file, String arg) throws IOExceptio LOGGER.fine(() -> String.format("load_cert_chain %s:%s", arg, file.getPath())); return file.newBufferedReader(); } catch (CannotCastException e) { - throw PRaiseNode.raiseUncached(this, TypeError, ErrorMessages.S_SHOULD_BE_A_VALID_FILESYSTEMPATH, arg); + throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.S_SHOULD_BE_A_VALID_FILESYSTEMPATH, arg); } } @@ -933,20 +939,22 @@ abstract static class GetPasswordNode extends PNodeWithContext { @Specialization(guards = "isString(password)") static char[] doString(Object password, + @Bind("this") Node inliningTarget, @Cached CastToJavaStringNode cast, @Shared @Cached PRaiseNode raiseNode) { String str = cast.execute(password); - checkPasswordLength(raiseNode, str.length()); + checkPasswordLength(raiseNode, str.length(), inliningTarget); return stringToChars(str); } @Specialization(limit = "2") static char[] doBytes(PBytesLike bytes, + @Bind("this") Node inliningTarget, @CachedLibrary("bytes") PythonBufferAccessLibrary bufferLib, @Shared @Cached PRaiseNode raiseNode) { byte[] data = bufferLib.getInternalOrCopiedByteArray(bytes); int length = bufferLib.getBufferLength(bytes); - checkPasswordLength(raiseNode, length); + checkPasswordLength(raiseNode, length, inliningTarget); char[] res = new char[length]; for (int i = 0; i < res.length; i++) { res[i] = (char) data[i]; @@ -966,9 +974,9 @@ static char[] doCallable(VirtualFrame frame, Object callable, if (PGuards.isString(result) || result instanceof PBytesLike) { return recursive.execute(frame, result); } - throw raiseNode.raise(TypeError, ErrorMessages.PSSWD_CALLBACK_MUST_RETURN_STR); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.PSSWD_CALLBACK_MUST_RETURN_STR); } - throw raiseNode.raise(TypeError, ErrorMessages.PSSWD_SHOULD_BE_STR_OR_CALLABLE); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.PSSWD_SHOULD_BE_STR_OR_CALLABLE); } @TruffleBoundary @@ -976,9 +984,9 @@ private static char[] stringToChars(String str) { return str.toCharArray(); } - private static void checkPasswordLength(PRaiseNode raiseNode, int length) { + private static void checkPasswordLength(PRaiseNode raiseNode, int length, Node inliningTarget) { if (length > MAX_LEN) { - throw raiseNode.raise(ValueError, ErrorMessages.PSSWD_CANNOT_BE_LONGER_THAN_D_BYTES, MAX_LEN); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.PSSWD_CANNOT_BE_LONGER_THAN_D_BYTES, MAX_LEN); } } } @@ -989,11 +997,11 @@ abstract static class LoadDhParamsNode extends PythonBinaryBuiltinNode { @SuppressWarnings("unused") @Specialization static PNone load(VirtualFrame frame, PSSLContext self, Object pathObject, - @Cached PyUnicodeFSDecoderNode asPath, - @Cached PRaiseNode raiseNode) { + @Bind("this") Node inliningTarget, + @Cached PyUnicodeFSDecoderNode asPath) { TruffleString path = asPath.execute(frame, pathObject); // not used yet so rather raise error - throw raiseNode.raise(NotImplementedError); + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError); // File file = new File(path); // if (!file.exists()) { // throw raiseOSError(frame, OSErrorEnum.ENOENT); @@ -1057,16 +1065,16 @@ abstract static class GetCACerts extends PythonBinaryClinicBuiltinNode { @Specialization(guards = "!binary_form") Object getCerts(VirtualFrame frame, PSSLContext self, @SuppressWarnings("unused") boolean binary_form, @Bind("this") Node inliningTarget, - @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language, + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { try { List result = PythonUtils.newList(); for (X509Certificate cert : self.getCACerts()) { if (CertUtils.isCA(cert, CertUtils.getKeyUsage(cert))) { - PythonUtils.add(result, CertUtils.decodeCertificate(getContext().factory(), cert)); + PythonUtils.add(result, CertUtils.decodeCertificate(cert, language)); } } - return factory.createList(PythonUtils.toArray(result)); + return PFactory.createList(language, PythonUtils.toArray(result)); } catch (KeyStoreException | NoSuchAlgorithmException | CertificateParsingException ex) { throw constructAndRaiseNode.get(inliningTarget).raiseSSLError(frame, SSLErrorCode.ERROR_SSL, ex); } @@ -1074,15 +1082,15 @@ Object getCerts(VirtualFrame frame, PSSLContext self, @SuppressWarnings("unused" @Specialization(guards = "binary_form") static Object getCertsBinary(PSSLContext self, @SuppressWarnings("unused") boolean binary_form, - @Shared @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { try { List result = PythonUtils.newList(); for (X509Certificate cert : self.getCACerts()) { if (CertUtils.isCA(cert, CertUtils.getKeyUsage(cert))) { - PythonUtils.add(result, factory.createBytes(CertUtils.getEncoded(cert))); + PythonUtils.add(result, PFactory.createBytes(language, CertUtils.getEncoded(cert))); } } - return factory.createList(PythonUtils.toArray(result)); + return PFactory.createList(language, PythonUtils.toArray(result)); } catch (KeyStoreException | NoSuchAlgorithmException | CertificateEncodingException ex) { throw PConstructAndRaiseNode.raiseUncachedSSLError(SSLErrorCode.ERROR_SSL, ex); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLErrorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLErrorBuiltins.java index 4347b6ea97..bcd86d8391 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLErrorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLErrorBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,12 +43,13 @@ import static com.oracle.graal.python.builtins.objects.exception.OsErrorBuiltins.IDX_STRERROR; import static com.oracle.graal.python.builtins.objects.exception.OsErrorBuiltins.IDX_WRITTEN; import static com.oracle.graal.python.builtins.objects.ssl.SSLErrorCode.ERROR_CERT_VERIFICATION; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.util.List; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -59,13 +60,13 @@ import com.oracle.graal.python.builtins.objects.exception.OsErrorBuiltins; import com.oracle.graal.python.builtins.objects.exception.PBaseException; import com.oracle.graal.python.builtins.objects.function.PKeyword; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.lib.PyObjectStrAsObjectNode; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -85,9 +86,11 @@ public final class SSLErrorBuiltins extends PythonBuiltins { static final int IDX_VERIFY_MESSAGE = IDX_WRITTEN + 4; static final int SSL_ERR_NUM_ATTRS = IDX_VERIFY_MESSAGE + 1; - public static final BaseExceptionAttrNode.StorageFactory SSL_ERROR_ATTR_FACTORY = (args, factory) -> new Object[SSL_ERR_NUM_ATTRS]; + public static final BaseExceptionAttrNode.StorageFactory SSL_ERROR_ATTR_FACTORY = (args) -> new Object[SSL_ERR_NUM_ATTRS]; public static final TruffleString T_SSL_IN_BRACKETS = tsLiteral("[SSL]"); + public static final TpSlots SLOTS = SSLErrorBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return SSLErrorBuiltinsFactory.getFactories(); @@ -116,17 +119,17 @@ public static void setSSLErrorAttributes(PBaseException self, SSLErrorCode error self.setExceptionAttributes(data); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory public abstract static class SSLErrorInitNode extends PythonBuiltinNode { public abstract Object execute(VirtualFrame frame, PBaseException self, Object[] args, PKeyword[] kwds); @Specialization static Object init(VirtualFrame frame, PBaseException self, Object[] args, PKeyword[] kwds, - @Cached OsErrorBuiltins.OSErrorInitNode initNode, - @Cached PythonObjectFactory factory) { + @Cached OsErrorBuiltins.OSErrorInitNode initNode) { initNode.execute(frame, self, args, kwds); - Object[] sslAttrs = SSL_ERROR_ATTR_FACTORY.create(args, factory); + Object[] sslAttrs = SSL_ERROR_ATTR_FACTORY.create(args); PythonUtils.arraycopy(self.getExceptionAttributes(), 0, sslAttrs, 0, self.getExceptionAttributes().length); self.setExceptionAttributes(sslAttrs); return PNone.NONE; @@ -173,7 +176,7 @@ Object generic(PBaseException self, Object value, } } - @Builtin(name = J___STR__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_str, isComplex = true) @GenerateNodeFactory abstract static class StrNode extends PythonUnaryBuiltinNode { @Specialization diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLOperationNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLOperationNode.java index fc04f6d46f..8dc68a63fb 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLOperationNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLOperationNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -177,7 +177,7 @@ static void doSocket(VirtualFrame frame, Node inliningTarget, PSSLSocket socket, @Cached(inline = false) GilNode gil, @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, @Cached(inline = false) TruffleString.FromJavaStringNode fromJavaStringNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { assert socket.getSocket() != null; prepare(socket); TimeoutHelper timeoutHelper = null; @@ -270,7 +270,7 @@ static void doSocket(VirtualFrame frame, Node inliningTarget, PSSLSocket socket, } catch (SSLException e) { throw handleSSLException(e); } catch (OverflowException | OutOfMemoryError node) { - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } PythonContext.triggerAsyncActions(inliningTarget); } @@ -279,7 +279,7 @@ static void doSocket(VirtualFrame frame, Node inliningTarget, PSSLSocket socket, @Specialization(guards = "socket.getSocket() == null") static void doMemory(VirtualFrame frame, Node inliningTarget, PSSLSocket socket, ByteBuffer appInput, ByteBuffer targetBuffer, SSLOperation operation, @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { prepare(socket); SSLOperationStatus status; try { @@ -312,7 +312,7 @@ static void doMemory(VirtualFrame frame, Node inliningTarget, PSSLSocket socket, } catch (SSLException e) { throw handleSSLException(e); } catch (OverflowException | OutOfMemoryError node) { - throw raiseNode.get(inliningTarget).raise(MemoryError); + throw raiseNode.raise(inliningTarget, MemoryError); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLSocketBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLSocketBuiltins.java index 1acb11c3bf..1e25fb80b3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLSocketBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLSocketBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -57,6 +57,7 @@ import javax.net.ssl.SSLPeerUnverifiedException; import javax.net.ssl.SSLSession; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; @@ -75,8 +76,7 @@ import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.runtime.IndirectCallData; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; @@ -104,18 +104,18 @@ abstract static class ReadNode extends PythonTernaryClinicBuiltinNode { @Specialization(guards = "isNoValue(buffer)") static Object read(VirtualFrame frame, PSSLSocket self, int len, @SuppressWarnings("unused") PNone buffer, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Shared @Cached SSLOperationNode sslOperationNode, - @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { if (len == 0) { - return factory.createBytes(new byte[0]); + return PFactory.createBytes(language, new byte[0]); } else if (len < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.SIZE_SHOULD_NOT_BE_NEGATIVE); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.SIZE_SHOULD_NOT_BE_NEGATIVE); } ByteBuffer output = PythonUtils.allocateByteBuffer(len); sslOperationNode.read(frame, inliningTarget, self, output); PythonUtils.flipBuffer(output); - return factory.createBytes(PythonUtils.getBufferArray(output), PythonUtils.getBufferLimit(output)); + return PFactory.createBytes(language, PythonUtils.getBufferArray(output), PythonUtils.getBufferLimit(output)); } @Specialization(guards = "!isNoValue(bufferObj)", limit = "3") @@ -126,7 +126,7 @@ static Object readInto(VirtualFrame frame, PSSLSocket self, int len, Object buff @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib, @Shared @Cached SSLOperationNode sslOperationNode, // unused node to avoid mixing shared and non-shared inlined nodes - @SuppressWarnings("unused") @Shared @Cached PRaiseNode.Lazy raiseNode) { + @SuppressWarnings("unused") @Shared @Cached PRaiseNode raiseNode) { Object buffer = bufferAcquireLib.acquireWritableWithTypeError(bufferObj, "read", frame, indirectCallData); try { int bufferLen = bufferLib.getBufferLength(buffer); @@ -294,9 +294,9 @@ static Object get(@SuppressWarnings("unused") PSSLSocket self, @SuppressWarnings @Specialization(guards = "!isNoValue(obj)") static Object set(@SuppressWarnings("unused") PSSLSocket self, @SuppressWarnings("unused") Object obj, - @Cached PRaiseNode raiseNode) { + @Bind("this") Node inliningTarget) { // JDK API doesn't support setting session ID - throw raiseNode.raise(NotImplementedError); + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError); } } @@ -316,15 +316,15 @@ abstract static class GetPeerCertNode extends PythonBinaryClinicBuiltinNode { @Specialization(guards = "der") static Object getPeerCertDER(PSSLSocket self, @SuppressWarnings("unused") boolean der, @Bind("this") Node inliningTarget, - @Shared @Cached PythonObjectFactory.Lazy factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Shared @Cached PRaiseNode raiseNode) { if (!self.isHandshakeComplete()) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.HANDSHAKE_NOT_DONE_YET); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.HANDSHAKE_NOT_DONE_YET); } Certificate certificate = getCertificate(self.getEngine()); if (certificate != null) { try { - return factory.get(inliningTarget).createBytes(getEncoded(certificate)); + return PFactory.createBytes(language, getEncoded(certificate)); } catch (CertificateEncodingException e) { // Fallthrough } @@ -337,20 +337,20 @@ static Object getPeerCertDER(PSSLSocket self, @SuppressWarnings("unused") boolea @Specialization(guards = "!der") static PDict getPeerCertDict(PSSLSocket self, @SuppressWarnings("unused") boolean der, @Bind("this") Node inliningTarget, - @Shared @Cached PythonObjectFactory.Lazy factory, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Shared @Cached PRaiseNode raiseNode) { if (!self.isHandshakeComplete()) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.HANDSHAKE_NOT_DONE_YET); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.HANDSHAKE_NOT_DONE_YET); } Certificate certificate = getCertificate(self.getEngine()); if (certificate instanceof X509Certificate) { try { - return CertUtils.decodeCertificate(PythonContext.get(inliningTarget).factory(), (X509Certificate) certificate); + return CertUtils.decodeCertificate((X509Certificate) certificate, language); } catch (CertificateParsingException e) { - return factory.get(inliningTarget).createDict(); + return PFactory.createDict(language); } } - return factory.get(inliningTarget).createDict(); + return PFactory.createDict(language); } @TruffleBoundary @@ -387,9 +387,9 @@ abstract static class GetChannelBinding extends PythonBinaryClinicBuiltinNode { @Specialization @SuppressWarnings("unused") static Object getChannelBinding(PSSLSocket self, TruffleString sbType, - @Cached PRaiseNode raiseNode) { + @Bind("this") Node inliningTarget) { // JDK doesn't have an API to access what we need. BouncyCastle could provide this - throw raiseNode.raise(ValueError, ErrorMessages.S_CHANNEL_BINDING_NOT_IMPLEMENTED, sbType); + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.S_CHANNEL_BINDING_NOT_IMPLEMENTED, sbType); } @Override @@ -403,7 +403,7 @@ protected ArgumentClinicProvider getArgumentClinic() { abstract static class CipherNode extends PythonUnaryBuiltinNode { @Specialization static Object getCipher(PSSLSocket self, - @Cached PythonObjectFactory factory) { + @Bind PythonLanguage language) { if (!self.isHandshakeComplete()) { return PNone.NONE; } @@ -411,7 +411,7 @@ static Object getCipher(PSSLSocket self, if (cipher == null) { return PNone.NONE; } - return factory.createTuple(new Object[]{cipher.getOpensslName(), cipher.getProtocol(), cipher.getStrengthBits()}); + return PFactory.createTuple(language, new Object[]{cipher.getOpensslName(), cipher.getProtocol(), cipher.getStrengthBits()}); } @TruffleBoundary @@ -434,13 +434,14 @@ Object get(PSSLSocket socket) { if (!socket.isHandshakeComplete()) { return PNone.NONE; } + PythonLanguage language = PythonLanguage.get(null); List ciphers = socket.getContext().computeEnabledCiphers(socket.getEngine()); Object[] result = new Object[ciphers.size()]; for (int i = 0; i < ciphers.size(); i++) { SSLCipher cipher = ciphers.get(i); - result[i] = PythonObjectFactory.getUncached().createTuple(new Object[]{cipher.getOpensslName(), cipher.getProtocol(), cipher.getStrengthBits()}); + result[i] = PFactory.createTuple(language, new Object[]{cipher.getOpensslName(), cipher.getProtocol(), cipher.getStrengthBits()}); } - return PythonObjectFactory.getUncached().createList(result); + return PFactory.createList(language, result); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/NativeCharSequence.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/NativeCharSequence.java index 68617081bc..eefae6e3dd 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/NativeCharSequence.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/NativeCharSequence.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,13 +46,8 @@ import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.ReadUnicodeArrayNode; -import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.TruffleLogger; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.strings.TruffleString.Encoding; @@ -97,17 +92,6 @@ public int length() { return TruffleString.CodePointLengthNode.getUncached().execute(materialize(), TS_ENCODING); } - int length(Node inliningTarget, InteropLibrary lib, CastToJavaIntExactNode castToJavaIntNode) { - try { - int arraySize = castToJavaIntNode.execute(inliningTarget, lib.getArraySize(ptr)); - assert arraySize % elementSize == 0; - // we need to subtract the terminating null character - return arraySize / elementSize; - } catch (UnsupportedMessageException e) { - throw CompilerDirectives.shouldNotReachHere("pointer of NativeCharSequence is not an array"); - } - } - @Override public char charAt(int index) { return (char) TruffleString.CodePointAtIndexNode.getUncached().execute(materialize(), index, TS_ENCODING); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/StringBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/StringBuiltins.java index 756e3b6b84..ca4dec0357 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/StringBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/StringBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -32,29 +32,15 @@ import static com.oracle.graal.python.nodes.BuiltinNames.J_REMOVEPREFIX; import static com.oracle.graal.python.nodes.BuiltinNames.J_REMOVESUFFIX; import static com.oracle.graal.python.nodes.BuiltinNames.J_STARTSWITH; +import static com.oracle.graal.python.nodes.BuiltinNames.J_STR; import static com.oracle.graal.python.nodes.BuiltinNames.T_ENDSWITH; import static com.oracle.graal.python.nodes.BuiltinNames.T_FORMAT; import static com.oracle.graal.python.nodes.BuiltinNames.T_STARTSWITH; import static com.oracle.graal.python.nodes.ErrorMessages.FILL_CHAR_MUST_BE_UNICODE_CHAR_NOT_P; import static com.oracle.graal.python.nodes.ErrorMessages.S_ENCODER_RETURNED_P_INSTEAD_OF_BYTES; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CONTAINS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___FORMAT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GETNEWARGS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___MOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___RMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___STR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___TRUFFLE_RICHCOMPARE__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ADD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___EQ__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GETITEM__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GETNEWARGS__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___HASH__; @@ -63,6 +49,7 @@ import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REPR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___STR__; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; +import static com.oracle.graal.python.nodes.StringLiterals.T_UTF8; import static com.oracle.graal.python.nodes.truffle.TruffleStringMigrationHelpers.assertNoJavaString; import static com.oracle.graal.python.runtime.exception.PythonErrorType.IndexError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; @@ -84,6 +71,7 @@ import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -92,9 +80,12 @@ import com.oracle.graal.python.builtins.modules.CodecsModuleBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; +import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary; +import com.oracle.graal.python.builtins.objects.bytes.BytesCommonBuiltins; import com.oracle.graal.python.builtins.objects.bytes.PByteArray; import com.oracle.graal.python.builtins.objects.bytes.PBytes; -import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; +import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes; import com.oracle.graal.python.builtins.objects.common.FormatNodeBase; import com.oracle.graal.python.builtins.objects.common.HashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetIterator; @@ -128,16 +119,23 @@ import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins; import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.MpSubscriptBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.SqConcatBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.HashBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqItemBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqRepeatBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqContains.SqContainsBuiltinNode; import com.oracle.graal.python.lib.PyIndexCheckNode; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyObjectGetItem; import com.oracle.graal.python.lib.PyObjectHashNode; +import com.oracle.graal.python.lib.PyObjectStrAsObjectNode; import com.oracle.graal.python.lib.PyUnicodeCheckNode; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; @@ -150,13 +148,12 @@ import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; +import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassExactProfile; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; @@ -168,9 +165,7 @@ import com.oracle.graal.python.runtime.formatting.InternalFormat.Spec; import com.oracle.graal.python.runtime.formatting.StringFormatProcessor; import com.oracle.graal.python.runtime.formatting.TextFormatter; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.util.ComparisonOp; -import com.oracle.graal.python.util.IntPredicate; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; @@ -179,14 +174,15 @@ import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.ImportStatic; +import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.profiles.InlinedConditionProfile; @@ -201,6 +197,11 @@ import com.oracle.truffle.api.strings.TruffleStringBuilder; import com.oracle.truffle.api.strings.TruffleStringIterator; +/** + * NOTE: self can either be a TruffleString, PString, PythonNativeObject string or a foreign string + * (isString()). Use {@link CastToTruffleStringCheckedNode} or {@link CastToTruffleStringNode} to + * convert to TruffleString. + */ @CoreFunctions(extendClasses = PythonBuiltinClassType.PString) public final class StringBuiltins extends PythonBuiltins { public static final TpSlots SLOTS = StringBuiltinsSlotsGen.SLOTS; @@ -210,7 +211,178 @@ protected List 0) { - throw PRaiseNode.raiseUncached(node, ValueError, EXPECTED_RBRACE_BEFORE_END_OF_STRING); + throw PRaiseNode.raiseStatic(node, ValueError, EXPECTED_RBRACE_BEFORE_END_OF_STRING); } Object rendered = renderField(node, fieldStart, i, recursive, level, formatNode); out.append(rendered); @@ -217,13 +217,13 @@ private Field parseField(Node node, int start, int end) { if (c == '!') { i += 1; if (i == end) { - throw PRaiseNode.raiseUncached(node, ValueError, EXPECTED_CONVERSION); + throw PRaiseNode.raiseStatic(node, ValueError, EXPECTED_CONVERSION); } conversion = s.charAt(i); i += 1; if (i < end) { if (s.charAt(i) != ':') { - throw PRaiseNode.raiseUncached(node, ValueError, EXPECTED_S_AFTER_FORMAT_CONVERSION, ':'); + throw PRaiseNode.raiseStatic(node, ValueError, EXPECTED_S_AFTER_FORMAT_CONVERSION, ':'); } i += 1; } @@ -237,7 +237,7 @@ private Field parseField(Node node, int start, int end) { i += 1; } } else if (c == '{') { - throw PRaiseNode.raiseUncached(node, ValueError, UNEXPECTED_S_IN_FIELD_NAME, "'{'"); + throw PRaiseNode.raiseStatic(node, ValueError, UNEXPECTED_S_IN_FIELD_NAME, "'{'"); } i += 1; } @@ -274,10 +274,10 @@ private Object getArgument(Node node, String name) { if (useNumeric) { if (this.autoNumberingState == ANS_MANUAL) { if (isEmpty) { - throw PRaiseNode.raiseUncached(node, ValueError, SWITCHING_FROM_MANUAL_TO_AUTOMATIC_NUMBERING); + throw PRaiseNode.raiseStatic(node, ValueError, SWITCHING_FROM_MANUAL_TO_AUTOMATIC_NUMBERING); } } else if (!isEmpty) { - throw PRaiseNode.raiseUncached(node, ValueError, SWITCHING_FROM_AUTOMATIC_TO_MANUAL_NUMBERING); + throw PRaiseNode.raiseStatic(node, ValueError, SWITCHING_FROM_AUTOMATIC_TO_MANUAL_NUMBERING); } } if (isEmpty) { @@ -289,13 +289,13 @@ private Object getArgument(Node node, String name) { String kwarg = intString; arg = getKeyword(node, kwarg); } else if (index > SysModuleBuiltins.MAXSIZE) { - throw PRaiseNode.raiseUncached(node, ValueError, TOO_MANY_DECIMAL_DIGITS_IN_FORMAT_STRING); + throw PRaiseNode.raiseStatic(node, ValueError, TOO_MANY_DECIMAL_DIGITS_IN_FORMAT_STRING); } else { if (this.args == null) { - throw PRaiseNode.raiseUncached(node, ValueError, FORMAT_STR_CONTAINS_POS_FIELDS); + throw PRaiseNode.raiseStatic(node, ValueError, FORMAT_STR_CONTAINS_POS_FIELDS); } if (index >= this.args.length) { - throw PRaiseNode.raiseUncached(node, IndexError, REPLACEMENT_INDEX_S_OUT_OF_RANGE, index); + throw PRaiseNode.raiseStatic(node, IndexError, REPLACEMENT_INDEX_S_OUT_OF_RANGE, index); } arg = this.args[index]; } @@ -320,7 +320,7 @@ private Object resolveLookups(Node node, Object obj, String name, int startArg, i += 1; } if (start == i) { - throw PRaiseNode.raiseUncached(node, ValueError, EMPTY_ATTR_IN_FORMAT_STR); + throw PRaiseNode.raiseStatic(node, ValueError, EMPTY_ATTR_IN_FORMAT_STR); } TruffleString attr = toTruffleStringUncached(name.substring(start, i)); if (result != null) { @@ -341,11 +341,11 @@ private Object resolveLookups(Node node, Object obj, String name, int startArg, i += 1; } if (!gotBracket) { - throw PRaiseNode.raiseUncached(node, ValueError, MISSING_S, "']'"); + throw PRaiseNode.raiseStatic(node, ValueError, MISSING_S, "']'"); } String s = name.substring(start, i); if (s.isEmpty()) { - throw PRaiseNode.raiseUncached(node, ValueError, EMPTY_ATTR_IN_FORMAT_STR); + throw PRaiseNode.raiseStatic(node, ValueError, EMPTY_ATTR_IN_FORMAT_STR); } int index = toInt(node, s); Object item = index != -1 ? index : toTruffleStringUncached(s); @@ -356,7 +356,7 @@ private Object resolveLookups(Node node, Object obj, String name, int startArg, this.parserList.add(new Object[]{false, item}); } } else { - throw PRaiseNode.raiseUncached(node, ValueError, ONLY_S_AND_S_AMY_FOLLOW_S, "'['", "'.'", "']'"); + throw PRaiseNode.raiseStatic(node, ValueError, ONLY_S_AND_S_AMY_FOLLOW_S, "'['", "'.'", "']'"); } } return result; @@ -372,7 +372,7 @@ private static int toInt(Node node, String s) { } catch (NumberFormatException e) { return -1; } catch (ArithmeticException e) { - throw PRaiseNode.raiseUncached(node, ValueError, TOO_MANY_DECIMAL_DIGITS_IN_FORMAT_STRING); + throw PRaiseNode.raiseStatic(node, ValueError, TOO_MANY_DECIMAL_DIGITS_IN_FORMAT_STRING); } } @@ -462,7 +462,7 @@ private static Object convert(Node node, Object obj, char conversion) { case 'a': return PyObjectAsciiNode.executeUncached(obj); default: - throw PRaiseNode.raiseUncached(node, ValueError, INVALID_CONVERSION); + throw PRaiseNode.raiseStatic(node, ValueError, INVALID_CONVERSION); } } @@ -491,7 +491,7 @@ private Object getKeyword(Node node, String key) { return result; } } - throw PRaiseNode.raiseUncached(node, KeyError, tKey); + throw PRaiseNode.raiseStatic(node, KeyError, tKey); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/struct/StructBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/struct/StructBuiltins.java index ef7ef6c4c9..f35aefce49 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/struct/StructBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/struct/StructBuiltins.java @@ -1,10 +1,56 @@ -/* Copyright (c) 2020, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2020, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2020 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 */ package com.oracle.graal.python.builtins.objects.struct; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_BOOL; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_CHAR; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_DOUBLE; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_FLOAT; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_HALF_FLOAT; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_INT; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_LONG; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_LONG_LONG; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_PAD_BYTE; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_PASCAL_STRING; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_SHORT; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_SIGNED_CHAR; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_SIZE_T; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_STRING; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_UNSIGNED_CHAR; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_UNSIGNED_INT; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_UNSIGNED_LONG; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_UNSIGNED_LONG_LONG; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_UNSIGNED_SHORT; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_UNSIGNED_SIZE_T; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_VOID_PTR; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_BOOL; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_CHAR; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_DOUBLE; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_FLOAT; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_HALF_FLOAT; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_INT; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_LONG; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_LONG_LONG; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_PAD_BYTE; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_PASCAL_STRING; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_SHORT; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_SIGNED_CHAR; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_SIZE_T; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_STRING; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_UNSIGNED_CHAR; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_UNSIGNED_INT; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_UNSIGNED_LONG; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_UNSIGNED_LONG_LONG; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_UNSIGNED_SHORT; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_UNSIGNED_SIZE_T; +import static com.oracle.graal.python.builtins.objects.struct.FormatCode.T_LBL_VOID_PTR; +import static com.oracle.graal.python.nodes.ErrorMessages.ARG_MUST_BE_STR_OR_BYTES; +import static com.oracle.graal.python.nodes.ErrorMessages.BAD_CHR_IN_STRUCT_FMT; +import static com.oracle.graal.python.nodes.ErrorMessages.EMBEDDED_NULL_CHARACTER; +import static com.oracle.graal.python.nodes.ErrorMessages.REPEAT_COUNT_WITHOUT_FMT; import static com.oracle.graal.python.nodes.ErrorMessages.STRUCT_ITER_CANNOT_UNPACK_FROM_STRUCT_OF_SIZE_0; import static com.oracle.graal.python.nodes.ErrorMessages.STRUCT_ITER_UNPACK_REQ_A_BUFFER_OF_A_MUL_OF_BYTES; import static com.oracle.graal.python.nodes.ErrorMessages.STRUCT_NOT_ENOUGH_DATA_TO_UNPACK_N_BYTES; @@ -13,37 +59,55 @@ import static com.oracle.graal.python.nodes.ErrorMessages.STRUCT_PACK_EXPECTED_N_ITEMS_GOT_K; import static com.oracle.graal.python.nodes.ErrorMessages.STRUCT_PACK_INTO_REQ_BUFFER_TO_PACK; import static com.oracle.graal.python.nodes.ErrorMessages.STRUCT_UNPACK_FROM_REQ_AT_LEAST_N_BYTES; -import static com.oracle.graal.python.nodes.ErrorMessages.UNPACK_REQ_A_BUFFER_OF_N_BYTES; import static com.oracle.graal.python.nodes.ErrorMessages.S_TAKES_NO_KEYWORD_ARGS; +import static com.oracle.graal.python.nodes.ErrorMessages.UNPACK_REQ_A_BUFFER_OF_N_BYTES; import static com.oracle.graal.python.runtime.exception.PythonErrorType.StructError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; +import java.nio.ByteOrder; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.PythonOS; +import com.oracle.graal.python.builtins.modules.StructModuleBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; +import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.iterator.PStructUnpackIterator; +import com.oracle.graal.python.builtins.objects.str.PString; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; +import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.IndirectCallData; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.graal.python.util.PythonUtils; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; @@ -82,11 +146,298 @@ public static Object[] unpackInternal(PStruct self, StructNodes.UnpackValueNode return values; } + public static final TpSlots SLOTS = StructBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return StructBuiltinsFactory.getFactories(); } + @ImportStatic(PythonUtils.class) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "Struct", minNumOfPositionalArgs = 2) + @GenerateNodeFactory + public abstract static class ConstructStructNode extends PythonBinaryBuiltinNode { + public static final int NUM_BYTES_LIMIT; + + private static final int SHORT_ALIGN = Short.BYTES; + private static final int INT_ALIGN = Integer.BYTES; + private static final int LONG_ALIGN = Long.BYTES; + private static final int FLOAT_ALIGN = Float.BYTES; + private static final int DOUBLE_ALIGN = Double.BYTES; + + private static final char ALIGNMENT_NATIVE_NATIVE = '@'; + private static final char ALIGNMENT_NATIVE_STD = '='; + private static final char ALIGNMENT_LE_STD = '<'; + private static final char ALIGNMENT_BE_STD = '>'; + private static final char ALIGNMENT_NET_BE_STD = '!'; + private static final char DEFAULT_ALIGNMENT = ALIGNMENT_NATIVE_NATIVE; + // format def tables + private static final FormatDef[] FMT_TABLE = new FormatDef[128]; + private static final FormatDef[] FMT_TABLE_NATIVE = new FormatDef[128]; + static { + Set numBytes = new HashSet<>(); + + setFormatDefEntry(FMT_TABLE, FMT_PAD_BYTE, T_LBL_PAD_BYTE, 1, numBytes); + setFormatDefEntry(FMT_TABLE, FMT_SIGNED_CHAR, T_LBL_SIGNED_CHAR, 1, numBytes); + setFormatDefEntry(FMT_TABLE, FMT_UNSIGNED_CHAR, T_LBL_UNSIGNED_CHAR, 1, numBytes); + setFormatDefEntry(FMT_TABLE, FMT_CHAR, T_LBL_CHAR, 1, numBytes); + setFormatDefEntry(FMT_TABLE, FMT_STRING, T_LBL_STRING, 1, numBytes); + setFormatDefEntry(FMT_TABLE, FMT_PASCAL_STRING, T_LBL_PASCAL_STRING, 1, numBytes); + setFormatDefEntry(FMT_TABLE, FMT_SHORT, T_LBL_SHORT, 2, numBytes); + setFormatDefEntry(FMT_TABLE, FMT_UNSIGNED_SHORT, T_LBL_UNSIGNED_SHORT, 2, numBytes); + setFormatDefEntry(FMT_TABLE, FMT_INT, T_LBL_INT, 4, numBytes); + setFormatDefEntry(FMT_TABLE, FMT_UNSIGNED_INT, T_LBL_UNSIGNED_INT, 4, numBytes); + setFormatDefEntry(FMT_TABLE, FMT_LONG, T_LBL_LONG, 4, numBytes); + setFormatDefEntry(FMT_TABLE, FMT_UNSIGNED_LONG, T_LBL_UNSIGNED_LONG, 4, numBytes); + setFormatDefEntry(FMT_TABLE, FMT_LONG_LONG, T_LBL_LONG_LONG, 8, numBytes); + setFormatDefEntry(FMT_TABLE, FMT_UNSIGNED_LONG_LONG, T_LBL_UNSIGNED_LONG_LONG, 8, numBytes); + setFormatDefEntry(FMT_TABLE, FMT_BOOL, T_LBL_BOOL, 1, numBytes); + setFormatDefEntry(FMT_TABLE, FMT_HALF_FLOAT, T_LBL_HALF_FLOAT, 2, numBytes); + setFormatDefEntry(FMT_TABLE, FMT_FLOAT, T_LBL_FLOAT, 4, numBytes); + setFormatDefEntry(FMT_TABLE, FMT_DOUBLE, T_LBL_DOUBLE, 8, numBytes); + + // native format table + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_PAD_BYTE, T_LBL_PAD_BYTE, Byte.BYTES, numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_SIGNED_CHAR, T_LBL_SIGNED_CHAR, Byte.BYTES, numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_UNSIGNED_CHAR, T_LBL_UNSIGNED_CHAR, Byte.BYTES, numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_CHAR, T_LBL_CHAR, Byte.BYTES, numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_STRING, T_LBL_STRING, Byte.BYTES, numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_PASCAL_STRING, T_LBL_PASCAL_STRING, Byte.BYTES, numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_SHORT, T_LBL_SHORT, Short.BYTES, SHORT_ALIGN, numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_UNSIGNED_SHORT, T_LBL_UNSIGNED_SHORT, Short.BYTES, SHORT_ALIGN, numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_INT, T_LBL_INT, Integer.BYTES, INT_ALIGN, numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_UNSIGNED_INT, T_LBL_UNSIGNED_INT, Integer.BYTES, INT_ALIGN, numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_LONG, T_LBL_LONG, + PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32 ? Integer.BYTES : Long.BYTES, + PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32 ? INT_ALIGN : LONG_ALIGN, + numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_UNSIGNED_LONG, T_LBL_UNSIGNED_LONG, + PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32 ? Integer.BYTES : Long.BYTES, + PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32 ? INT_ALIGN : LONG_ALIGN, + numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_SIZE_T, T_LBL_SIZE_T, Long.BYTES, LONG_ALIGN, numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_UNSIGNED_SIZE_T, T_LBL_UNSIGNED_SIZE_T, Long.BYTES, LONG_ALIGN, numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_LONG_LONG, T_LBL_LONG_LONG, Long.BYTES, LONG_ALIGN, numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_UNSIGNED_LONG_LONG, T_LBL_UNSIGNED_LONG_LONG, Long.BYTES, LONG_ALIGN, numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_BOOL, T_LBL_BOOL, Byte.BYTES, 0, numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_HALF_FLOAT, T_LBL_HALF_FLOAT, Float.BYTES / 2, SHORT_ALIGN, numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_FLOAT, T_LBL_FLOAT, Float.BYTES, FLOAT_ALIGN, numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_DOUBLE, T_LBL_DOUBLE, Double.BYTES, DOUBLE_ALIGN, numBytes); + setFormatDefEntry(FMT_TABLE_NATIVE, FMT_VOID_PTR, T_LBL_VOID_PTR, Long.BYTES, LONG_ALIGN, numBytes); + + NUM_BYTES_LIMIT = numBytes.size(); + } + + static void setFormatDefEntry(FormatDef[] table, char format, TruffleString label, int size, Set numBytes) { + setFormatDefEntry(table, format, label, size, 0, numBytes); + } + + static void setFormatDefEntry(FormatDef[] table, char format, TruffleString label, int size, int alignment, Set numBytes) { + table[format] = new FormatDef(format, label, size, alignment); + numBytes.add(size); + } + + public final PStruct execute(Object format) { + return execute(PythonBuiltinClassType.PStruct, format); + } + + public abstract PStruct execute(Object cls, Object format); + + @Specialization(guards = "isAscii(format, getCodeRangeNode)") + static PStruct struct(@SuppressWarnings("unused") Object cls, TruffleString format, + @Bind("this") Node inliningTarget, + @Cached.Shared @Cached TruffleString.CopyToByteArrayNode copyToByteArrayNode, + @Cached.Shared @Cached TruffleString.SwitchEncodingNode switchEncodingNode, + @SuppressWarnings("unused") @Cached.Shared @Cached TruffleString.GetCodeRangeNode getCodeRangeNode) { + byte[] fmt = PythonUtils.getAsciiBytes(format, copyToByteArrayNode, switchEncodingNode); + return PFactory.createStruct(PythonLanguage.get(inliningTarget), createStructInternal(inliningTarget, fmt)); + } + + @Specialization + static PStruct struct(Object cls, PString format, + @Bind("this") Node inliningTarget, + @Cached CastToTruffleStringNode castToTruffleStringNode, + @Cached.Shared @Cached TruffleString.CopyToByteArrayNode copyToByteArrayNode, + @Cached.Shared @Cached TruffleString.SwitchEncodingNode switchEncodingNode, + @SuppressWarnings("unused") @Cached.Shared @Cached TruffleString.GetCodeRangeNode getCodeRangeNode) { + return struct(cls, castToTruffleStringNode.execute(inliningTarget, format), inliningTarget, copyToByteArrayNode, switchEncodingNode, getCodeRangeNode); + } + + @Specialization(limit = "1") + static PStruct struct(@SuppressWarnings("unused") Object cls, PBytes format, + @Bind("this") Node inliningTarget, + @CachedLibrary("format") PythonBufferAccessLibrary bufferLib) { + byte[] fmt = bufferLib.getCopiedByteArray(format); + return PFactory.createStruct(PythonLanguage.get(inliningTarget), createStructInternal(inliningTarget, fmt)); + } + + @Specialization(guards = {"!isPBytes(format)", "!isPString(format)", "!isAsciiTruffleString(format, getCodeRangeNode)"}) + static PStruct fallback(@SuppressWarnings("unused") Object cls, Object format, + @SuppressWarnings("unused") @Cached.Shared @Cached TruffleString.GetCodeRangeNode getCodeRangeNode, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, StructError, ARG_MUST_BE_STR_OR_BYTES, "Struct()", format); + } + + protected static boolean isAsciiTruffleString(Object o, TruffleString.GetCodeRangeNode getCodeRangeNode) { + return o instanceof TruffleString && PythonUtils.isAscii((TruffleString) o, getCodeRangeNode); + } + + @CompilerDirectives.TruffleBoundary + private static PStruct.StructInfo createStructInternal(Node raisingNode, byte[] format) { + int size = 0; + int len = 0; + int nCodes = 0; + int num; + + if (StructModuleBuiltins.containsNullCharacter(format)) { + throw PRaiseNode.raiseStatic(raisingNode, PythonBuiltinClassType.StructError, EMBEDDED_NULL_CHARACTER); + } + + char alignment = DEFAULT_ALIGNMENT; + int start = 0; + + if (format.length > 0 && isAlignment((char) format[0])) { + alignment = (char) format[0]; + start = 1; + } + + final FormatAlignment formatAlignment = whichAlignment(alignment); + FormatDef[] formatTable = (formatAlignment.nativeSizing) ? FMT_TABLE_NATIVE : FMT_TABLE; + + // first pass: validation + for (int i = start; i < format.length; i++) { + char c = (char) format[i]; + if (c == ' ') { + continue; + } else if ('0' <= c && c <= '9') { + num = c - '0'; + while (++i < format.length && '0' <= (c = (char) format[i]) && c <= '9') { + if (num >= Integer.MAX_VALUE / 10 && (num > Integer.MAX_VALUE / 10 || (c - '0') > Integer.MAX_VALUE % 10)) { + throw PRaiseNode.raiseStatic(raisingNode, StructError, ErrorMessages.STRUCT_SIZE_TOO_LONG); + } + num = num * 10 + (c - '0'); + } + if (i == format.length) { + throw PRaiseNode.raiseStatic(raisingNode, StructError, REPEAT_COUNT_WITHOUT_FMT); + } + } else { + num = 1; + } + + FormatDef formatDef = getEntry(raisingNode, c, formatTable); + + switch (c) { + case 's': // fall through + case 'p': + len++; + nCodes++; + break; + case 'x': + break; + default: + len += num; + if (num != 0) { + nCodes++; + } + break; + } + + int itemSize = formatDef.size; + size = align(size, c, formatDef); + if (size == -1) { + throw PRaiseNode.raiseStatic(raisingNode, StructError, ErrorMessages.STRUCT_SIZE_TOO_LONG); + } + + if (num > (Integer.MAX_VALUE - size) / itemSize) { + throw PRaiseNode.raiseStatic(raisingNode, StructError, ErrorMessages.STRUCT_SIZE_TOO_LONG); + } + size += num * itemSize; + } + + // second pass - fill in the codes (no validation needed) + FormatCode[] codes = new FormatCode[nCodes]; + int structSize = size; + int structLen = len; + + int j = 0; + size = 0; + for (int i = start; i < format.length; i++) { + char c = (char) format[i]; + if (c == ' ') { + continue; + } else if ('0' <= c && c <= '9') { + num = c - '0'; + while (++i < format.length && '0' <= (c = (char) format[i]) && c <= '9') { + num = num * 10 + (c - '0'); + } + } else { + num = 1; + } + + FormatDef formatDef = getEntry(raisingNode, c, formatTable); + size = align(size, c, formatDef); + if (c == 's' || c == 'p') { + codes[j++] = new FormatCode(formatDef, size, num, 1); + size += num; + } else if (c == 'x') { + size += num; + } else if (num != 0) { + codes[j++] = new FormatCode(formatDef, size, formatDef.size, num); + size += formatDef.size * num; + } + } + + return new PStruct.StructInfo(format, structSize, structLen, formatAlignment, codes); + } + + private static FormatDef getEntry(Node raisingNode, char format, FormatDef[] table) { + FormatDef formatDef = table[format]; + if (formatDef != null) { + return formatDef; + } + throw PRaiseNode.raiseStatic(raisingNode, StructError, BAD_CHR_IN_STRUCT_FMT, format); + } + + private static boolean isAlignment(char alignment) { + return alignment == ALIGNMENT_LE_STD || + alignment == ALIGNMENT_BE_STD || + alignment == ALIGNMENT_NET_BE_STD || + alignment == ALIGNMENT_NATIVE_STD || + alignment == ALIGNMENT_NATIVE_NATIVE; + } + + private static FormatAlignment whichAlignment(char alignment) { + switch (alignment) { + case ALIGNMENT_LE_STD: + return new FormatAlignment(false, false); + case ALIGNMENT_BE_STD: + case ALIGNMENT_NET_BE_STD: + return new FormatAlignment(true, false); + case ALIGNMENT_NATIVE_STD: + return new FormatAlignment(ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN, false); + case ALIGNMENT_NATIVE_NATIVE: + default: + return new FormatAlignment(ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN, true); + } + } + + private static int align(int size, char c, FormatDef formatDef) { + int extra; + int alignedSize = size; + if (formatDef.format == c) { + if (formatDef.alignment > 0 && alignedSize > 0) { + extra = (formatDef.alignment - 1) - (alignedSize - 1) % (formatDef.alignment); + if (extra > Integer.MAX_VALUE - alignedSize) { + return -1; + } + alignedSize += extra; + } + } + return alignedSize; + } + } + @Builtin(name = "pack", minNumOfPositionalArgs = 1, parameterNames = {"$self"}, takesVarArgs = true, takesVarKeywordArgs = true, forceSplitDirectCalls = true) @GenerateNodeFactory public abstract static class StructPackNode extends PythonVarargsBuiltinNode { @@ -94,24 +445,21 @@ public final Object execute(VirtualFrame frame, PStruct self, Object[] args) { return execute(frame, self, args, PKeyword.EMPTY_KEYWORDS); } - @Override - public Object varArgExecute(VirtualFrame frame, Object self, Object[] arguments, @SuppressWarnings("unused") PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported { - return this.execute(frame, self, arguments, PKeyword.EMPTY_KEYWORDS); - } - @Specialization - Object pack(VirtualFrame frame, PStruct self, Object[] args, PKeyword[] keywords, + static Object pack(VirtualFrame frame, PStruct self, Object[] args, PKeyword[] keywords, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached StructNodes.PackValueNode packValueNode, - @Cached PythonObjectFactory factory) { + @Cached PRaiseNode raiseNode) { if (keywords.length != 0) { - throw raise(TypeError, S_TAKES_NO_KEYWORD_ARGS, "pack()"); + throw raiseNode.raise(inliningTarget, TypeError, S_TAKES_NO_KEYWORD_ARGS, "pack()"); } if (args.length != self.getLen()) { - throw raise(StructError, STRUCT_PACK_EXPECTED_N_ITEMS_GOT_K, self.getLen(), args.length); + throw raiseNode.raise(inliningTarget, StructError, STRUCT_PACK_EXPECTED_N_ITEMS_GOT_K, self.getLen(), args.length); } byte[] bytes = new byte[self.getSize()]; packInternal(frame, self, packValueNode, args, bytes, 0); - return factory.createBytes(bytes); + return PFactory.createBytes(language, bytes); } } @@ -133,11 +481,11 @@ static Object packInto(VirtualFrame frame, PStruct self, Object buffer, int offs @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib, @Cached StructNodes.PackValueNode packValueNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { final long size = self.getUnsignedSize(); if (args.length != self.getLen()) { - throw raiseNode.get(inliningTarget).raise(StructError, STRUCT_PACK_EXPECTED_N_ITEMS_GOT_K, size, args.length); + throw raiseNode.raise(inliningTarget, StructError, STRUCT_PACK_EXPECTED_N_ITEMS_GOT_K, size, args.length); } int bufferOffset = offset; int bufferLen = bufferLib.getBufferLength(buffer); @@ -153,12 +501,12 @@ static Object packInto(VirtualFrame frame, PStruct self, Object buffer, int offs if (bufferOffset < 0) { // Check that negative offset is low enough to fit data if (bufferOffset + size > 0) { - throw raiseNode.get(inliningTarget).raise(StructError, STRUCT_NO_SPACE_TO_PACK_N_BYTES, size, bufferOffset); + throw raiseNode.raise(inliningTarget, StructError, STRUCT_NO_SPACE_TO_PACK_N_BYTES, size, bufferOffset); } // Check that negative offset is not crossing buffer boundary if (bufferOffset + bufferLen < 0) { - throw raiseNode.get(inliningTarget).raise(StructError, STRUCT_OFFSET_OUT_OF_RANGE, bufferOffset, bufferLen); + throw raiseNode.raise(inliningTarget, StructError, STRUCT_OFFSET_OUT_OF_RANGE, bufferOffset, bufferLen); } bufferOffset += bufferLen; @@ -169,7 +517,7 @@ static Object packInto(VirtualFrame frame, PStruct self, Object buffer, int offs assert bufferOffset >= 0; assert size >= 0; - throw raiseNode.get(inliningTarget).raise(StructError, STRUCT_PACK_INTO_REQ_BUFFER_TO_PACK, size + bufferOffset, size, bufferOffset, bufferLen); + throw raiseNode.raise(inliningTarget, StructError, STRUCT_PACK_INTO_REQ_BUFFER_TO_PACK, size + bufferOffset, size, bufferOffset, bufferLen); } // TODO: GR-54860 use buffer API in the packing process @@ -203,18 +551,18 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(limit = "3") static Object unpack(VirtualFrame frame, PStruct self, Object buffer, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib, @Cached StructNodes.UnpackValueNode unpackValueNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { int bytesLen = bufferLib.getBufferLength(buffer); byte[] bytes = bufferLib.getInternalOrCopiedByteArray(buffer); if (bytesLen != self.getSize()) { - throw raiseNode.get(inliningTarget).raise(StructError, UNPACK_REQ_A_BUFFER_OF_N_BYTES, self.getSize()); + throw raiseNode.raise(inliningTarget, StructError, UNPACK_REQ_A_BUFFER_OF_N_BYTES, self.getSize()); } - return factory.createTuple(unpackInternal(self, unpackValueNode, bytes, 0)); + return PFactory.createTuple(language, unpackInternal(self, unpackValueNode, bytes, 0)); } finally { bufferLib.release(buffer, frame, indirectCallData); } @@ -235,17 +583,17 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(limit = "3") static Object iterUnpack(VirtualFrame frame, PStruct self, Object buffer, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { if (self.getSize() == 0) { - throw raiseNode.get(inliningTarget).raise(StructError, STRUCT_ITER_CANNOT_UNPACK_FROM_STRUCT_OF_SIZE_0); + throw raiseNode.raise(inliningTarget, StructError, STRUCT_ITER_CANNOT_UNPACK_FROM_STRUCT_OF_SIZE_0); } int bufferLen = bufferLib.getBufferLength(buffer); if (bufferLen % self.getSize() != 0) { - throw raiseNode.get(inliningTarget).raise(StructError, STRUCT_ITER_UNPACK_REQ_A_BUFFER_OF_A_MUL_OF_BYTES, self.getSize()); + throw raiseNode.raise(inliningTarget, StructError, STRUCT_ITER_UNPACK_REQ_A_BUFFER_OF_A_MUL_OF_BYTES, self.getSize()); } } catch (Exception e) { bufferLib.release(buffer, frame, indirectCallData); @@ -253,7 +601,7 @@ static Object iterUnpack(VirtualFrame frame, PStruct self, Object buffer, } // The buffer ownership is transferred to the iterator // TODO: GR-54860 release it when iterator is collected - final PStructUnpackIterator structUnpackIterator = factory.createStructUnpackIterator(self, buffer); + final PStructUnpackIterator structUnpackIterator = PFactory.createStructUnpackIterator(language, self, buffer); structUnpackIterator.index = 0; return structUnpackIterator; } @@ -274,11 +622,11 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization(limit = "3") static Object unpackFrom(VirtualFrame frame, PStruct self, Object buffer, int offset, @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib, @Cached StructNodes.UnpackValueNode unpackValueNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { int bufferOffset = offset; int bytesLen = bufferLib.getBufferLength(buffer); @@ -287,20 +635,20 @@ static Object unpackFrom(VirtualFrame frame, PStruct self, Object buffer, int of final long size = self.getUnsignedSize(); if (bufferOffset < 0) { if (bufferOffset + size > 0) { - throw raiseNode.get(inliningTarget).raise(StructError, STRUCT_NOT_ENOUGH_DATA_TO_UNPACK_N_BYTES, size, bufferOffset); + throw raiseNode.raise(inliningTarget, StructError, STRUCT_NOT_ENOUGH_DATA_TO_UNPACK_N_BYTES, size, bufferOffset); } if (bufferOffset + bytesLen < 0) { - throw raiseNode.get(inliningTarget).raise(StructError, STRUCT_OFFSET_OUT_OF_RANGE, bufferOffset, bytesLen); + throw raiseNode.raise(inliningTarget, StructError, STRUCT_OFFSET_OUT_OF_RANGE, bufferOffset, bytesLen); } bufferOffset += bytesLen; } if ((bytesLen - bufferOffset) < size) { - throw raiseNode.get(inliningTarget).raise(StructError, STRUCT_UNPACK_FROM_REQ_AT_LEAST_N_BYTES, size + bufferOffset, size, bufferOffset, bytesLen); + throw raiseNode.raise(inliningTarget, StructError, STRUCT_UNPACK_FROM_REQ_AT_LEAST_N_BYTES, size + bufferOffset, size, bufferOffset, bytesLen); } - return factory.createTuple(unpackInternal(self, unpackValueNode, bytes, bufferOffset)); + return PFactory.createTuple(language, unpackInternal(self, unpackValueNode, bytes, bufferOffset)); } finally { bufferLib.release(buffer, frame, indirectCallData); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/struct/StructNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/struct/StructNodes.java index f10cb66615..a3067ac10d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/struct/StructNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/struct/StructNodes.java @@ -1,17 +1,10 @@ -/* Copyright (c) 2020, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2020, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2020 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 */ package com.oracle.graal.python.builtins.objects.struct; -import static com.oracle.graal.python.builtins.modules.StructModuleBuiltins.ConstructStructNode.NUM_BYTES_LIMIT; -import static com.oracle.graal.python.nodes.ErrorMessages.ARG_FOR_N_MUST_BE; -import static com.oracle.graal.python.nodes.ErrorMessages.ARG_NOT_T; -import static com.oracle.graal.python.nodes.ErrorMessages.ARG_O_O_RANGE; -import static com.oracle.graal.python.nodes.ErrorMessages.FMT_REQ_RANGE; -import static com.oracle.graal.python.nodes.ErrorMessages.STRUCT_CHR_FMT_BYTES_1; -import static com.oracle.graal.python.nodes.ErrorMessages.STRUCT_FMT_NOT_YET_SUPPORTED; import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_BOOL; import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_CHAR; import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_DOUBLE; @@ -20,12 +13,20 @@ import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_PASCAL_STRING; import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_STRING; import static com.oracle.graal.python.builtins.objects.struct.FormatCode.FMT_VOID_PTR; +import static com.oracle.graal.python.builtins.objects.struct.StructBuiltins.ConstructStructNode.NUM_BYTES_LIMIT; +import static com.oracle.graal.python.nodes.ErrorMessages.ARG_FOR_N_MUST_BE; +import static com.oracle.graal.python.nodes.ErrorMessages.ARG_NOT_T; +import static com.oracle.graal.python.nodes.ErrorMessages.ARG_O_O_RANGE; +import static com.oracle.graal.python.nodes.ErrorMessages.FMT_REQ_RANGE; +import static com.oracle.graal.python.nodes.ErrorMessages.STRUCT_CHR_FMT_BYTES_1; +import static com.oracle.graal.python.nodes.ErrorMessages.STRUCT_FMT_NOT_YET_SUPPORTED; import static com.oracle.graal.python.nodes.PGuards.isBytes; import static com.oracle.graal.python.runtime.exception.PythonErrorType.NotImplementedError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.StructError; import java.math.BigInteger; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; import com.oracle.graal.python.builtins.objects.bytes.PBytesLike; @@ -44,7 +45,7 @@ import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.util.CastToJavaBigIntegerNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.NumericSupport; import com.oracle.graal.python.util.OverflowException; import com.oracle.graal.python.util.PythonUtils; @@ -81,13 +82,13 @@ static long get(VirtualFrame frame, Object value, boolean unsigned, @Cached PyLongCheckNode pyLongCheckNode, @Cached PyNumberIndexNode indexNode, @Cached PyLongAsLongNode pyLongAsLongNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object longValue; if (!pyLongCheckNode.execute(inliningTarget, value)) { if (indexCheckNode.execute(inliningTarget, value)) { longValue = indexNode.execute(frame, inliningTarget, value); } else { - throw raiseNode.get(inliningTarget).raise(StructError, ARG_NOT_T, "an integer"); + throw raiseNode.raise(inliningTarget, StructError, ARG_NOT_T, "an integer"); } } else { longValue = value; @@ -98,10 +99,10 @@ static long get(VirtualFrame frame, Object value, boolean unsigned, x = pyLongAsLongNode.execute(frame, inliningTarget, longValue); } catch (PException pe) { pe.expect(inliningTarget, PythonBuiltinClassType.OverflowError, errorProfile); - throw raiseNode.get(inliningTarget).raise(StructError, ARG_O_O_RANGE); + throw raiseNode.raise(inliningTarget, StructError, ARG_O_O_RANGE); } if (unsigned && x < 0) { - throw raiseNode.get(inliningTarget).raise(StructError, ARG_O_O_RANGE); + throw raiseNode.raise(inliningTarget, StructError, ARG_O_O_RANGE); } return x; } @@ -158,30 +159,30 @@ public static boolean isSupportedFormat(FormatCode formatCode) { } // checks - private static PException raiseNumberError(FormatCode formatCode, PRaiseNode raiseNode) { + private static PException raiseNumberError(Node inliningTarget, FormatCode formatCode, PRaiseNode raiseNode) { if (formatCode.formatDef.name == null) { - return raiseNode.raise(StructError, ARG_O_O_RANGE); + return raiseNode.raise(inliningTarget, StructError, ARG_O_O_RANGE); } - return raiseNode.raise(StructError, FMT_REQ_RANGE, formatCode.formatDef.name, formatCode.formatDef.min, formatCode.formatDef.max); + return raiseNode.raise(inliningTarget, StructError, FMT_REQ_RANGE, formatCode.formatDef.name, formatCode.formatDef.min, formatCode.formatDef.max); } private static PException raiseNumberErrorUncached(Node raisingNode, FormatCode formatCode) { if (formatCode.formatDef.name == null) { - return PRaiseNode.raiseUncached(raisingNode, StructError, ARG_O_O_RANGE); + return PRaiseNode.raiseStatic(raisingNode, StructError, ARG_O_O_RANGE); } - return PRaiseNode.raiseUncached(raisingNode, StructError, FMT_REQ_RANGE, formatCode.formatDef.name, formatCode.formatDef.min, formatCode.formatDef.max); + return PRaiseNode.raiseStatic(raisingNode, StructError, FMT_REQ_RANGE, formatCode.formatDef.name, formatCode.formatDef.min, formatCode.formatDef.max); } - public static long checkLong(Node inliningTarget, FormatCode formatCode, long value, PRaiseNode.Lazy raiseNode) { + public static long checkLong(Node inliningTarget, FormatCode formatCode, long value, PRaiseNode raiseNode) { if (value < formatCode.formatDef.min || value > formatCode.formatDef.max) { - throw raiseNumberError(formatCode, raiseNode.get(inliningTarget)); + throw raiseNumberError(inliningTarget, formatCode, raiseNode); } return value; } - public static long checkLongUnsigned(Node inliningTarget, FormatCode formatCode, long value, PRaiseNode.Lazy raiseNode) { + public static long checkLongUnsigned(Node inliningTarget, FormatCode formatCode, long value, PRaiseNode raiseNode) { if (value < formatCode.formatDef.min || Long.compareUnsigned(value, formatCode.formatDef.max) > 0) { - throw raiseNumberError(formatCode, raiseNode.get(inliningTarget)); + throw raiseNumberError(inliningTarget, formatCode, raiseNode); } return value; } @@ -221,7 +222,7 @@ public abstract static class PackValueNode extends StructBaseNode { public abstract void execute(VirtualFrame frame, FormatCode formatCode, FormatAlignment formatAlignment, Object value, byte[] buffer, int offset); private static void packLongInternal(Node inliningTarget, FormatCode formatCode, long value, byte[] buffer, int offset, NumericSupport numericSupport, int numBytes, - InlinedConditionProfile profileSigned, PRaiseNode.Lazy raiseNode) { + InlinedConditionProfile profileSigned, PRaiseNode raiseNode) { final long num; if (profileSigned.profile(inliningTarget, formatCode.isUnsigned())) { num = checkLongUnsigned(inliningTarget, formatCode, value, raiseNode); @@ -236,7 +237,7 @@ static void packLong(FormatCode formatCode, @SuppressWarnings("unused") FormatAl @Bind("this") Node inliningTarget, @Cached("getNumericSupport(formatAlignment)") NumericSupport numericSupport, @Shared @Cached InlinedConditionProfile profileSigned, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { packLongInternal(inliningTarget, formatCode, value, buffer, offset, numericSupport, formatCode.numBytes(), profileSigned, raiseNode); } @@ -245,7 +246,7 @@ static void packInt(FormatCode formatCode, @SuppressWarnings("unused") FormatAli @Bind("this") Node inliningTarget, @Cached("getNumericSupport(formatAlignment)") NumericSupport numericSupport, @Shared @Cached InlinedConditionProfile profileSigned, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { packLongInternal(inliningTarget, formatCode, value, buffer, offset, numericSupport, formatCode.numBytes(), profileSigned, raiseNode); } @@ -254,12 +255,12 @@ static void packPInt(FormatCode formatCode, @SuppressWarnings("unused") FormatAl @Bind("this") Node inliningTarget, @Cached("getNumericSupport(formatAlignment)") NumericSupport numericSupport, @Shared @Cached CastToJavaBigIntegerNode toJavaBigIntegerNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { try { BigInteger num = checkBigInt(inliningTarget, formatCode, toJavaBigIntegerNode.execute(inliningTarget, value)); numericSupport.putBigInteger(buffer, offset, num, formatCode.numBytes()); } catch (OverflowException oe) { - throw raiseNode.get(inliningTarget).raise(StructError, ARG_O_O_RANGE); + throw raiseNode.raise(inliningTarget, StructError, ARG_O_O_RANGE); } } @@ -267,7 +268,7 @@ static void packPInt(FormatCode formatCode, @SuppressWarnings("unused") FormatAl static void packFloat(FormatCode formatCode, @SuppressWarnings("unused") FormatAlignment formatAlignment, double value, byte[] buffer, int offset, @Bind("this") Node inliningTarget, @Cached("getNumericSupport(formatAlignment)") NumericSupport numericSupport, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { numericSupport.putDouble(inliningTarget, buffer, offset, value, formatCode.numBytes(), raiseNode); } @@ -275,7 +276,7 @@ static void packFloat(FormatCode formatCode, @SuppressWarnings("unused") FormatA static void packPFloat(FormatCode formatCode, FormatAlignment formatAlignment, PFloat value, byte[] buffer, int offset, @Bind("this") Node inliningTarget, @Cached("getNumericSupport(formatAlignment)") NumericSupport numericSupport, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { packFloat(formatCode, formatAlignment, value.getValue(), buffer, offset, inliningTarget, numericSupport, raiseNode); } @@ -290,13 +291,13 @@ static void packBytes(FormatCode formatCode, @SuppressWarnings("unused") FormatA @Bind("this") Node inliningTarget, @Shared @Cached("createEqualityProfile()") PrimitiveValueProfile formatProfile, @CachedLibrary("value") PythonBufferAccessLibrary bufferLib, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { int n = bufferLib.getBufferLength(value); switch (formatProfile.profile(formatCode.formatDef.format)) { case FMT_CHAR: if (n != 1) { - throw raiseNode.get(inliningTarget).raise(StructError, STRUCT_CHR_FMT_BYTES_1); + throw raiseNode.raise(inliningTarget, StructError, STRUCT_CHR_FMT_BYTES_1); } assert n <= buffer.length - offset; bufferLib.readIntoByteArray(value, 0, buffer, offset, n); @@ -339,7 +340,7 @@ static void packObjectCached(VirtualFrame frame, FormatCode formatCode, FormatAl @Shared @Cached InlinedConditionProfile profileSigned, @Shared @Cached IsBuiltinObjectProfile errorProfile, @Shared @CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { if (isNumberUpToSize8Unsigned(formatCode)) { packLong(formatCode, formatAlignment, getLongNode.execute(frame, value, formatCode.isUnsigned()), buffer, offset, inliningTarget, numericSupport, profileSigned, raiseNode); } else if (isNumberSize8Unsigned(formatCode)) { @@ -350,29 +351,29 @@ static void packObjectCached(VirtualFrame frame, FormatCode formatCode, FormatAl BigInteger num = checkBigInt(inliningTarget, formatCode, toJavaBigIntegerNode.execute(inliningTarget, value)); getNumericSupport(formatAlignment).putBigInteger(buffer, offset, num, formatCode.numBytes()); } catch (OverflowException oe) { - throw raiseNode.get(inliningTarget).raise(StructError, ARG_O_O_RANGE); + throw raiseNode.raise(inliningTarget, StructError, ARG_O_O_RANGE); } catch (PException pe) { pe.expect(inliningTarget, PythonBuiltinClassType.TypeError, errorProfile); - throw raiseNode.get(inliningTarget).raise(StructError, ARG_NOT_T, "an integer"); + throw raiseNode.raise(inliningTarget, StructError, ARG_NOT_T, "an integer"); } } } else if (isFmtFloat(formatCode)) { if (!canBeDoubleNode.execute(inliningTarget, value)) { - throw raiseNode.get(inliningTarget).raise(StructError, ARG_NOT_T, "a float"); + throw raiseNode.raise(inliningTarget, StructError, ARG_NOT_T, "a float"); } packFloat(formatCode, formatAlignment, asDoubleNode.execute(frame, inliningTarget, value), buffer, offset, inliningTarget, numericSupport, raiseNode); } else if (isFmtVoidPtr(formatCode)) { getLongNode.execute(frame, value, formatCode.isUnsigned()); packLong(formatCode, formatAlignment, getLongNode.execute(frame, value, formatCode.isUnsigned()), buffer, offset, inliningTarget, numericSupport, profileSigned, raiseNode); } else if (isFmtBoolean(formatCode)) { - packBoolean(formatCode, formatAlignment, isTrueNode.execute(frame, inliningTarget, value), buffer, offset); + packBoolean(formatCode, formatAlignment, isTrueNode.execute(frame, value), buffer, offset); } else if (isFmtBytes(formatCode)) { if (!isBytes(value)) { - throw raiseNode.get(inliningTarget).raise(StructError, ARG_FOR_N_MUST_BE, formatCode.formatDef.format, "bytes"); + throw raiseNode.raise(inliningTarget, StructError, ARG_FOR_N_MUST_BE, formatCode.formatDef.format, "bytes"); } packBytes(formatCode, formatAlignment, (PBytesLike) value, buffer, offset, inliningTarget, formatProfile, bufferLib, raiseNode); } else { - throw raiseNode.get(inliningTarget).raise(NotImplementedError, STRUCT_FMT_NOT_YET_SUPPORTED, formatCode); + throw raiseNode.raise(inliningTarget, NotImplementedError, STRUCT_FMT_NOT_YET_SUPPORTED, formatCode); } } @@ -388,7 +389,7 @@ static void packObject(VirtualFrame frame, FormatCode formatCode, FormatAlignmen @Shared @Cached InlinedConditionProfile profileSigned, @Shared @Cached IsBuiltinObjectProfile errorProfile, @Shared @CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { packObjectCached(frame, formatCode, formatAlignment, value, buffer, offset, inliningTarget, getLongNode, toJavaBigIntegerNode, canBeDoubleNode, asDoubleNode, isTrueNode, getNumericSupport(formatAlignment), formatProfile, profileSigned, errorProfile, bufferLib, raiseNode); @@ -406,8 +407,7 @@ static Object unpack8Cached(FormatCode formatCode, @SuppressWarnings("unused") F @Cached("formatCode.numBytes()") int numBytes, @Cached("getNumericSupport(formatAlignment)") NumericSupport numericSupport, @Shared @Cached InlinedConditionProfile profilePIntResult, - @Shared @Cached InlinedConditionProfile profileSigned, - @Shared @Cached PythonObjectFactory.Lazy factory) { + @Shared @Cached InlinedConditionProfile profileSigned) { long num; if (profileSigned.profile(inliningTarget, formatCode.isUnsigned())) { num = numericSupport.getLongUnsigned(buffer, offset, numBytes); @@ -416,7 +416,7 @@ static Object unpack8Cached(FormatCode formatCode, @SuppressWarnings("unused") F num = handleSign(formatCode, num); } if (profilePIntResult.profile(inliningTarget, formatCode.isUnsigned() && num < 0)) { - return factory.get(inliningTarget).createInt(getAsUnsignedBigInt(num)); + return PFactory.createInt(PythonLanguage.get(inliningTarget), getAsUnsignedBigInt(num)); } return num; } @@ -425,10 +425,9 @@ static Object unpack8Cached(FormatCode formatCode, @SuppressWarnings("unused") F static Object unpack8(FormatCode formatCode, @SuppressWarnings("unused") FormatAlignment formatAlignment, byte[] buffer, int offset, @Bind("this") Node inliningTarget, @Shared @Cached InlinedConditionProfile profilePIntResult, - @Shared @Cached InlinedConditionProfile profileSigned, - @Shared @Cached PythonObjectFactory.Lazy factory) { + @Shared @Cached InlinedConditionProfile profileSigned) { return unpack8Cached(formatCode, formatAlignment, buffer, offset, inliningTarget, formatCode.numBytes(), - getNumericSupport(formatAlignment), profilePIntResult, profileSigned, factory); + getNumericSupport(formatAlignment), profilePIntResult, profileSigned); } @Specialization(guards = {"isFmtFloat(formatCode)", "numericSupport == getNumericSupport(formatAlignment)"}, limit = "3") @@ -441,12 +440,10 @@ static Object unpackFloat8(FormatCode formatCode, @SuppressWarnings("unused") Fo @SuppressWarnings("unused") static Object unpackVoidPtr(FormatCode formatCode, FormatAlignment formatAlignment, byte[] buffer, int offset, @Bind("this") Node inliningTarget, - @Shared @Cached InlinedConditionProfile profilePIntResult, - @Shared @Cached PythonObjectFactory.Lazy factory, - @Shared @Cached PRaiseNode raiseNode) { + @Shared @Cached InlinedConditionProfile profilePIntResult) { long num = getNumericSupport(formatAlignment).getLongUnsigned(buffer, offset, formatCode.numBytes()); if (profilePIntResult.profile(inliningTarget, num < 0)) { - return factory.get(inliningTarget).createInt(getAsUnsignedBigInt(num)); + return PFactory.createInt(PythonLanguage.get(inliningTarget), getAsUnsignedBigInt(num)); } return num; } @@ -459,8 +456,7 @@ static Object unpackBool(@SuppressWarnings("unused") FormatCode formatCode, @Sup @Specialization(guards = "isFmtBytes(formatCode)") static Object unpackBytes(@SuppressWarnings("unused") FormatCode formatCode, @SuppressWarnings("unused") FormatAlignment formatAlignment, byte[] buffer, int offset, @Bind("this") Node inliningTarget, - @Cached(value = "createIdentityProfile()", inline = false) ValueProfile formatProfile, - @Shared @Cached PythonObjectFactory.Lazy factory) { + @Cached(value = "createIdentityProfile()", inline = false) ValueProfile formatProfile) { byte[] bytes; switch (formatProfile.profile(formatCode.formatDef.format)) { case FMT_CHAR: @@ -479,14 +475,14 @@ static Object unpackBytes(@SuppressWarnings("unused") FormatCode formatCode, @Su bytes = new byte[n]; PythonUtils.arraycopy(buffer, offset + 1, bytes, 0, n); } - return factory.get(inliningTarget).createBytes(bytes); + return PFactory.createBytes(PythonLanguage.get(inliningTarget), bytes); } @Specialization(guards = "!isSupportedFormat(formatCode)") @SuppressWarnings("unused") static byte[] unpackUnsupported(FormatCode formatCode, FormatAlignment formatAlignment, byte[] buffer, int offset, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(NotImplementedError, STRUCT_FMT_NOT_YET_SUPPORTED, formatCode); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, STRUCT_FMT_NOT_YET_SUPPORTED, formatCode); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/struct/StructUnpackIteratorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/struct/StructUnpackIteratorBuiltins.java index 706ba0f621..b3bb9309cc 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/struct/StructUnpackIteratorBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/struct/StructUnpackIteratorBuiltins.java @@ -1,19 +1,20 @@ -/* Copyright (c) 2020, 2024, Oracle and/or its affiliates. +/* Copyright (c) 2020, 2025, Oracle and/or its affiliates. * Copyright (C) 1996-2020 Python Software Foundation * * Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 */ package com.oracle.graal.python.builtins.objects.struct; -import static com.oracle.graal.python.nodes.ErrorMessages.CANNOT_CREATE_P_OBJECTS; import static com.oracle.graal.python.builtins.objects.struct.StructBuiltins.unpackInternal; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; +import static com.oracle.graal.python.nodes.ErrorMessages.CANNOT_CREATE_P_OBJECTS; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LENGTH_HINT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__; import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -21,12 +22,14 @@ import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.iterator.PStructUnpackIterator; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.runtime.IndirectCallData; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -38,22 +41,26 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PStructUnpackIterator) public class StructUnpackIteratorBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = StructUnpackIteratorBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return StructUnpackIteratorBuiltinsFactory.getFactories(); } - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory protected abstract static class NewNode extends PythonBuiltinNode { @Specialization static Object createNew(Object type, @SuppressWarnings("unused") Object[] args, @SuppressWarnings("unused") PKeyword[] kwds, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, CANNOT_CREATE_P_OBJECTS, type); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, CANNOT_CREATE_P_OBJECTS, type); } } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory public abstract static class IterNode extends PythonUnaryBuiltinNode { @Specialization @@ -76,23 +83,20 @@ static int lenHint(PStructUnpackIterator self, } } - @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iternext, isComplex = true) @GenerateNodeFactory - public abstract static class NextNode extends PythonUnaryBuiltinNode { + public abstract static class NextNode extends TpIterNextBuiltin { @Specialization(guards = "self.isExhausted()") - static Object nextExhausted(@SuppressWarnings("unused") PStructUnpackIterator self, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.StopIteration); + static Object nextExhausted(@SuppressWarnings("unused") PStructUnpackIterator self) { + throw iteratorExhausted(); } @Specialization(guards = "!self.isExhausted()", limit = "3") static Object next(VirtualFrame frame, PStructUnpackIterator self, - @Bind("this") Node inliningTarget, @Cached("createFor(this)") IndirectCallData indirectCallData, @Cached StructNodes.UnpackValueNode unpackValueNode, @CachedLibrary("self.getBuffer()") PythonBufferAccessLibrary bufferLib, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language) { final PStruct struct = self.getStruct(); final Object buffer = self.getBuffer(); final int bufferLen = bufferLib.getBufferLength(buffer); @@ -100,7 +104,7 @@ static Object next(VirtualFrame frame, PStructUnpackIterator self, if (struct == null || self.index >= bufferLen) { self.setExhausted(); bufferLib.release(buffer, frame, indirectCallData); - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.StopIteration); + throw iteratorExhausted(); } assert self.index + struct.getSize() <= bufferLen; @@ -117,7 +121,7 @@ static Object next(VirtualFrame frame, PStructUnpackIterator self, } // TODO: GR-54860 handle buffers directly in unpack - Object result = factory.createTuple(unpackInternal(struct, unpackValueNode, bytes, offset)); + Object result = PFactory.createTuple(language, unpackInternal(struct, unpackValueNode, bytes, offset)); self.index += struct.getSize(); return result; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/superobject/SuperBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/superobject/SuperBuiltins.java index c691778620..5c44fb206c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/superobject/SuperBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/superobject/SuperBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,18 +41,19 @@ package com.oracle.graal.python.builtins.objects.superobject; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.RuntimeError; +import static com.oracle.graal.python.nodes.BuiltinNames.J_SUPER; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___SELF_CLASS__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___SELF__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___THISCLASS__; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___CLASS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -60,6 +61,7 @@ import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.cell.CellBuiltins; import com.oracle.graal.python.builtins.objects.cell.PCell; +import com.oracle.graal.python.builtins.objects.foreign.ForeignObjectBuiltins.ForeignGetattrNode; import com.oracle.graal.python.builtins.objects.frame.PFrame; import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.builtins.objects.function.PKeyword; @@ -83,21 +85,26 @@ import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; +import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.SpecialAttributeNames; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; import com.oracle.graal.python.nodes.bytecode.FrameInfo; import com.oracle.graal.python.nodes.bytecode.PBytecodeRootNode; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.frame.ReadCallerFrameNode; import com.oracle.graal.python.nodes.frame.ReadCallerFrameNode.FrameSelector; import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.nodes.object.IsForeignObjectNode; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -114,6 +121,7 @@ import com.oracle.truffle.api.frame.MaterializedFrame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.BranchProfile; import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.strings.TruffleString; @@ -191,34 +199,43 @@ static Object uncached(SuperObject self) { } } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, alwaysNeedsCallerFrame = true) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_SUPER, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 3) + @GenerateNodeFactory + public abstract static class SuperNode extends PythonTernaryBuiltinNode { + @Specialization(guards = "isBuiltinSuper(cls)") + static Object doBuiltin(@SuppressWarnings("unused") Object cls, @SuppressWarnings("unused") Object type, @SuppressWarnings("unused") Object object, + @Bind PythonLanguage language) { + return PFactory.createSuperObject(language); + } + + @Fallback + static Object doOther(Object cls, @SuppressWarnings("unused") Object type, @SuppressWarnings("unused") Object object, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createSuperObject(language, cls, getInstanceShape.execute(cls)); + } + + protected static boolean isBuiltinSuper(Object cls) { + return cls == PythonBuiltinClassType.Super; + } + } + + @Slot(value = SlotKind.tp_init, isComplex = true) + @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, alwaysNeedsCallerFrame = true) @GenerateNodeFactory public abstract static class SuperInitNode extends PythonVarargsBuiltinNode { @Child private IsSubtypeNode isSubtypeNode; @Child private GetClassNode getClassNode; @Child private PyObjectLookupAttr getAttrNode; @Child private TypeNodes.IsTypeNode isTypeNode; - - @Override - public Object varArgExecute(VirtualFrame frame, @SuppressWarnings("unused") Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported { - if (keywords.length != 0) { - throw raise(RuntimeError, ErrorMessages.UNEXPECTED_KEYWORD_ARGS, "super()"); - } - if (arguments.length == 1) { - return execute(frame, arguments[0], PNone.NO_VALUE, PNone.NO_VALUE); - } else if (arguments.length == 2) { - return execute(frame, arguments[0], arguments[1], PNone.NO_VALUE); - } else if (arguments.length == 3) { - return execute(frame, arguments[0], arguments[1], arguments[2]); - } else { - throw raise(RuntimeError, ErrorMessages.INVALID_NUMBER_OF_ARGUMENTS, "super()"); - } - } + private final BranchProfile errorProfile = BranchProfile.create(); @Override public final Object execute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) { if (keywords.length != 0) { - throw raise(RuntimeError, ErrorMessages.UNEXPECTED_KEYWORD_ARGS, "super()"); + errorProfile.enter(); + throw PRaiseNode.raiseStatic(this, RuntimeError, ErrorMessages.UNEXPECTED_KEYWORD_ARGS, "super()"); } if (arguments.length == 0) { return execute(frame, self, PNone.NO_VALUE, PNone.NO_VALUE); @@ -227,16 +244,19 @@ public final Object execute(VirtualFrame frame, Object self, Object[] arguments, } else if (arguments.length == 2) { return execute(frame, self, arguments[0], arguments[1]); } else { - throw raise(RuntimeError, ErrorMessages.TOO_MANY_ARG, "super()"); + errorProfile.enter(); + throw PRaiseNode.raiseStatic(this, RuntimeError, ErrorMessages.TOO_MANY_ARG, "super()"); } } protected abstract Object execute(VirtualFrame frame, Object self, Object cls, Object obj); @Specialization(guards = "!isNoValue(cls)") - PNone init(VirtualFrame frame, SuperObject self, Object cls, Object obj) { + PNone init(VirtualFrame frame, SuperObject self, Object cls, Object obj, + @Bind("this") Node inliningTarget, + @Cached PRaiseNode raiseNode) { if (!(obj instanceof PNone)) { - Object type = supercheck(frame, cls, obj); + Object type = supercheck(frame, inliningTarget, cls, obj, raiseNode); self.init(cls, type, obj); } else { self.init(cls, null, null); @@ -255,13 +275,19 @@ protected boolean isInBuiltinFunctionRoot() { @Specialization(guards = {"!isInBuiltinFunctionRoot()", "isNoValue(clsArg)", "isNoValue(objArg)"}) PNone initInPlace(VirtualFrame frame, SuperObject self, @SuppressWarnings("unused") PNone clsArg, @SuppressWarnings("unused") PNone objArg, @Bind("this") Node inliningTarget, + @Shared @Cached PRaiseNode raiseNode, @Shared @Cached CellBuiltins.GetRefNode getRefNode) { - PBytecodeRootNode rootNode = (PBytecodeRootNode) getRootNode(); - Frame localFrame = frame; - if (rootNode.getCodeUnit().isGeneratorOrCoroutine()) { - localFrame = PArguments.getGeneratorFrame(frame); + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + PBytecodeDSLRootNode rootNode = (PBytecodeDSLRootNode) getRootNode(); + return initFromLocalFrame(frame, inliningTarget, self, rootNode, frame, getRefNode, raiseNode); + } else { + PBytecodeRootNode rootNode = (PBytecodeRootNode) getRootNode(); + Frame localFrame = frame; + if (rootNode.getCodeUnit().isGeneratorOrCoroutine()) { + localFrame = PArguments.getGeneratorFrame(frame); + } + return initFromLocalFrame(frame, inliningTarget, self, rootNode, localFrame, getRefNode, raiseNode); } - return initFromLocalFrame(frame, inliningTarget, self, rootNode, localFrame, getRefNode); } /** @@ -270,41 +296,65 @@ PNone initInPlace(VirtualFrame frame, SuperObject self, @SuppressWarnings("unuse @Specialization(guards = {"isInBuiltinFunctionRoot()", "isNoValue(clsArg)", "isNoValue(objArg)"}) PNone init(VirtualFrame frame, SuperObject self, @SuppressWarnings("unused") PNone clsArg, @SuppressWarnings("unused") PNone objArg, @Bind("this") Node inliningTarget, + @Shared @Cached PRaiseNode raiseNode, @Cached ReadCallerFrameNode readCaller, @Shared @Cached CellBuiltins.GetRefNode getRefNode) { PFrame target = readCaller.executeWith(frame, FrameSelector.SKIP_PYTHON_BUILTIN, 0); if (target == null) { - throw raise(RuntimeError, ErrorMessages.NO_CURRENT_FRAME, "super()"); + throw raiseNode.raise(inliningTarget, RuntimeError, ErrorMessages.NO_CURRENT_FRAME, "super()"); } MaterializedFrame locals = target.getLocals(); if (locals == null) { - throw raise(RuntimeError, ErrorMessages.SUPER_NO_CLASS); + throw raiseNode.raise(inliningTarget, RuntimeError, ErrorMessages.SUPER_NO_CLASS); } FrameInfo frameInfo = (FrameInfo) locals.getFrameDescriptor().getInfo(); - return initFromLocalFrame(frame, inliningTarget, self, frameInfo.getRootNode(), locals, getRefNode); + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + return initFromLocalFrame(frame, inliningTarget, self, (PBytecodeDSLRootNode) frameInfo.getRootNode(), locals, getRefNode, raiseNode); + } else { + return initFromLocalFrame(frame, inliningTarget, self, (PBytecodeRootNode) frameInfo.getRootNode(), locals, getRefNode, raiseNode); + } + } + + private PNone initFromLocalFrame(VirtualFrame frame, Node inliningTarget, SuperObject self, PBytecodeRootNode rootNode, Frame localFrame, CellBuiltins.GetRefNode getRefNode, + PRaiseNode raiseNode) { + PCell classCell = rootNode.readClassCell(localFrame); + if (classCell == null) { + throw raiseNode.raise(inliningTarget, RuntimeError, ErrorMessages.SUPER_NO_CLASS); + } + Object cls = getRefNode.execute(inliningTarget, classCell); + if (cls == null) { + // the cell is empty + throw raiseNode.raise(inliningTarget, RuntimeError, ErrorMessages.SUPER_EMPTY_CLASS); + } + Object obj = rootNode.readSelf(localFrame); + if (obj == null) { + throw raiseNode.raise(inliningTarget, RuntimeError, ErrorMessages.NO_ARGS, "super()"); + } + return init(frame, self, cls, obj, inliningTarget, raiseNode); } - private PNone initFromLocalFrame(VirtualFrame frame, Node inliningTarget, SuperObject self, PBytecodeRootNode rootNode, Frame localFrame, CellBuiltins.GetRefNode getRefNode) { + private PNone initFromLocalFrame(VirtualFrame frame, Node inliningTarget, SuperObject self, PBytecodeDSLRootNode rootNode, Frame localFrame, CellBuiltins.GetRefNode getRefNode, + PRaiseNode raiseNode) { PCell classCell = rootNode.readClassCell(localFrame); if (classCell == null) { - throw raise(RuntimeError, ErrorMessages.SUPER_NO_CLASS); + throw raiseNode.raise(inliningTarget, RuntimeError, ErrorMessages.SUPER_NO_CLASS); } Object cls = getRefNode.execute(inliningTarget, classCell); if (cls == null) { // the cell is empty - throw raise(RuntimeError, ErrorMessages.SUPER_EMPTY_CLASS); + throw raiseNode.raise(inliningTarget, RuntimeError, ErrorMessages.SUPER_EMPTY_CLASS); } Object obj = rootNode.readSelf(localFrame); if (obj == null) { - throw raise(RuntimeError, ErrorMessages.NO_ARGS, "super()"); + throw raiseNode.raise(inliningTarget, RuntimeError, ErrorMessages.NO_ARGS, "super()"); } - return init(frame, self, cls, obj); + return init(frame, self, cls, obj, inliningTarget, raiseNode); } @SuppressWarnings("unused") @Fallback PNone initFallback(Object self, Object cls, Object obj) { - throw raise(RuntimeError, ErrorMessages.INVALID_ARGS, "super()"); + throw PRaiseNode.raiseStatic(this, RuntimeError, ErrorMessages.INVALID_ARGS, "super()"); } private IsSubtypeNode getIsSubtype() { @@ -339,7 +389,7 @@ private PyObjectLookupAttr getGetAttr() { return getAttrNode; } - private Object supercheck(VirtualFrame frame, Object cls, Object object) { + private Object supercheck(VirtualFrame frame, Node inliningTarget, Object cls, Object object, PRaiseNode raiseNode) { /* * Check that a super() call makes sense. Return a type object. * @@ -356,19 +406,19 @@ private Object supercheck(VirtualFrame frame, Object cls, Object object) { * proxy for obj. */ if (ensureIsTypeNode().executeCached(object)) { - if (getIsSubtype().execute(frame, object, cls)) { + if (getIsSubtype().execute(object, cls)) { return object; } } Object objectType = getGetClass().executeCached(object); - if (getIsSubtype().execute(frame, objectType, cls)) { + if (getIsSubtype().execute(objectType, cls)) { return objectType; } else { try { Object classObject = getGetAttr().executeCached(frame, object, SpecialAttributeNames.T___CLASS__); if (ensureIsTypeNode().executeCached(classObject)) { - if (getIsSubtype().execute(frame, classObject, cls)) { + if (getIsSubtype().execute(classObject, cls)) { return classObject; } } @@ -376,7 +426,7 @@ private Object supercheck(VirtualFrame frame, Object cls, Object object) { // error is ignored } - throw raise(PythonErrorType.TypeError, ErrorMessages.SUPER_OBJ_MUST_BE_INST_SUB_OR_TYPE); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.SUPER_OBJ_MUST_BE_INST_SUB_OR_TYPE); } } } @@ -410,8 +460,10 @@ static Object doIt(Node inliningTarget, SuperObject self, Object obj, @Cached GetTypeNode getType, @Cached(inline = false) SuperInitNode superInit, @Cached GetClassNode getClass, - @Cached(inline = false) PythonObjectFactory factory) { - SuperObject newSuper = factory.createSuperObject(getClass.execute(inliningTarget, self)); + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + Object cls = getClass.execute(inliningTarget, self); + SuperObject newSuper = PFactory.createSuperObject(language, cls, getInstanceShape.execute(cls)); superInit.execute(null, newSuper, getType.execute(inliningTarget, self), obj); return newSuper; } @@ -423,7 +475,7 @@ public abstract static class GetattributeNode extends GetAttrBuiltinNode { @Child private ReadAttributeFromObjectNode readFromDict = ReadAttributeFromObjectNode.createForceType(); @Child private CallSlotDescrGet callGetSlotNode; @Child private GetTypeNode getType; - @Child private GetObjectNode getObject; + @Child private GetObjectNode getObject = GetObjectNodeGen.create(); @Child private ObjectBuiltins.GetAttributeNode objectGetattributeNode; @Child private GetMroNode getMroNode; @Child private IsSameTypeNode isSameTypeNode; @@ -444,7 +496,9 @@ Object get(VirtualFrame frame, SuperObject self, Object attr, @Cached GetObjectTypeNode getObjectType, @Cached CastToTruffleStringCheckedNode castToTruffleStringNode, @Cached InlinedConditionProfile hasDescrGetProfile, - @Cached InlinedConditionProfile getObjectIsStartObjectProfile) { + @Cached InlinedConditionProfile getObjectIsStartObjectProfile, + @Cached IsForeignObjectNode isForeignObjectNode, + @Cached ForeignGetattrNode foreignGetattrNode) { Object startType = getObjectType.execute(inliningTarget, self); if (startType == null) { return genericGetAttr(frame, self, attr); @@ -465,12 +519,13 @@ Object get(VirtualFrame frame, SuperObject self, Object attr, getType = insert(GetTypeNodeGen.create()); } + Object type = getType.executeCached(self); PythonAbstractClass[] mro = getMro(startType); /* No need to check the last one: it's gonna be skipped anyway. */ int i = 0; int n = mro.length; for (i = 0; i + 1 < n; i++) { - if (isSameType(getType.executeCached(self), mro[i])) { + if (isSameType(type, mro[i])) { break; } } @@ -493,15 +548,12 @@ Object get(VirtualFrame frame, SuperObject self, Object attr, CompilerDirectives.transferToInterpreterAndInvalidate(); callGetSlotNode = insert(CallSlotDescrGet.create()); } - if (getObject == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - getObject = insert(GetObjectNodeGen.create()); - } + Object object = getObject.executeCached(self); Object obj; - if (getObjectIsStartObjectProfile.profile(inliningTarget, getObject.executeCached(self) == startType)) { + if (getObjectIsStartObjectProfile.profile(inliningTarget, object == startType)) { obj = PNone.NO_VALUE; } else { - obj = self.getObject(); + obj = object; } res = callGetSlotNode.executeCached(frame, resSlots.tp_descr_get(), res, obj, startType); } @@ -509,6 +561,15 @@ Object get(VirtualFrame frame, SuperObject self, Object attr, } } + Object object = getObject.executeCached(self); + if (isForeignObjectNode.execute(inliningTarget, object)) { + try { + return foreignGetattrNode.execute(inliningTarget, object, stringAttr); + } catch (PException e) { + // continue to genericGetAttr() + } + } + return genericGetAttr(frame, self, stringAttr); } @@ -576,7 +637,7 @@ Object getClass(SuperObject self, } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory public abstract static class SuperReprNode extends PythonUnaryBuiltinNode { @Specialization diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/CommonLockBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/CommonLockBuiltins.java new file mode 100644 index 0000000000..ab0b6244ba --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/CommonLockBuiltins.java @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.builtins.objects.thread; + +import static com.oracle.graal.python.builtins.objects.thread.AbstractPythonLock.TIMEOUT_MAX; +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ENTER__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EXIT__; +import static com.oracle.graal.python.runtime.exception.PythonErrorType.OverflowError; +import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; + +import java.util.List; + +import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.builtins.CoreFunctions; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; +import com.oracle.graal.python.builtins.objects.thread.CommonLockBuiltinsClinicProviders.AcquireLockNodeClinicProviderGen; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; +import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; +import com.oracle.graal.python.runtime.GilNode; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Shared; +import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.ImportStatic; +import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.strings.TruffleString; + +@CoreFunctions(extendClasses = {PythonBuiltinClassType.PLock, PythonBuiltinClassType.PRLock}) +public final class CommonLockBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = CommonLockBuiltinsSlotsGen.SLOTS; + + @Override + protected List> getNodeFactories() { + return CommonLockBuiltinsFactory.getFactories(); + } + + public static final boolean DEFAULT_BLOCKING = AbstractPythonLock.DEFAULT_BLOCKING; + public static final double UNSET_TIMEOUT = AbstractPythonLock.UNSET_TIMEOUT; + + @Builtin(name = "acquire", minNumOfPositionalArgs = 1, parameterNames = {"self", "blocking", "timeout"}) + @ArgumentClinic(name = "blocking", conversion = ArgumentClinic.ClinicConversion.Boolean, defaultValue = "CommonLockBuiltins.DEFAULT_BLOCKING", useDefaultForNone = true) + @ArgumentClinic(name = "timeout", conversion = ArgumentClinic.ClinicConversion.Double, defaultValue = "CommonLockBuiltins.UNSET_TIMEOUT", useDefaultForNone = true) + @ImportStatic({CommonLockBuiltins.class, AbstractPythonLock.class}) + @GenerateNodeFactory + public abstract static class AcquireLockNode extends PythonTernaryClinicBuiltinNode { + + @Override + protected ArgumentClinicProvider getArgumentClinic() { + return AcquireLockNodeClinicProviderGen.INSTANCE; + } + + @Specialization(guards = {"!invalidArgs(blocking, timeout)", "!blocking"}) + static boolean nonBlocking(PLock self, @SuppressWarnings("unused") boolean blocking, @SuppressWarnings("unused") double timeout) { + // acquire lock + return self.acquireNonBlocking(); + } + + @Specialization(guards = {"!invalidArgs(blocking, timeout)", "!blocking"}) + static boolean nonBlocking(PRLock self, @SuppressWarnings("unused") boolean blocking, @SuppressWarnings("unused") double timeout) { + // acquire lock + return self.acquireNonBlocking(); + } + + @Specialization(guards = {"!invalidArgs(blocking, timeout)", "timeout == UNSET_TIMEOUT", "blocking"}) + boolean acBlocking(PLock self, @SuppressWarnings("unused") boolean blocking, @SuppressWarnings("unused") double timeout, + @Cached.Shared("g") @Cached GilNode gil) { + // acquire lock + gil.release(true); + try { + return self.acquireBlocking(this); + } finally { + gil.acquire(); + } + } + + @Specialization(guards = {"!invalidArgs(blocking, timeout)", "timeout == UNSET_TIMEOUT", "blocking"}) + boolean acBlocking(PRLock self, @SuppressWarnings("unused") boolean blocking, @SuppressWarnings("unused") double timeout, + @Cached.Shared("g") @Cached GilNode gil) { + // acquire lock + gil.release(true); + try { + return self.acquireBlocking(this); + } finally { + gil.acquire(); + } + } + + @Specialization(guards = {"!invalidArgs(blocking, timeout)", "timeout != UNSET_TIMEOUT", "blocking"}) + boolean acTimeOut(AbstractPythonLock self, @SuppressWarnings("unused") boolean blocking, double timeout, + @Cached.Shared("g") @Cached GilNode gil) { + // acquire lock + gil.release(true); + try { + return self.acquireTimeout(this, timeout); + } finally { + gil.acquire(); + } + } + + @SuppressWarnings("unused") + @Specialization(guards = {"invalidArgs(blocking, timeout)", "timeout != UNSET_TIMEOUT", "!blocking"}) + static boolean err1(AbstractPythonLock self, boolean blocking, double timeout, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.CANT_SPECIFY_TIMEOUT_FOR_NONBLOCKING); + } + + @SuppressWarnings("unused") + @Specialization(guards = {"invalidArgs(blocking, timeout)", "timeout != UNSET_TIMEOUT", "isNeg(timeout)"}) + static boolean err2(AbstractPythonLock self, boolean blocking, double timeout, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, ValueError, ErrorMessages.TIMEOUT_VALUE_MUST_BE_POSITIVE); + } + + @SuppressWarnings("unused") + @Specialization(guards = {"invalidArgs(blocking, timeout)", "timeout != UNSET_TIMEOUT", "timeout > TIMEOUT_MAX"}) + static boolean err3(AbstractPythonLock self, boolean blocking, double timeout, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, OverflowError, ErrorMessages.TIMEOUT_VALUE_TOO_LARGE); + } + + protected static boolean invalidArgs(boolean blocking, double timeout) { + return timeout != UNSET_TIMEOUT && (!blocking || timeout < 0 || timeout > TIMEOUT_MAX); + } + + protected boolean isNeg(double timeout) { + return timeout < 0; + } + } + + @Builtin(name = "acquire_lock", minNumOfPositionalArgs = 1, parameterNames = {"self", "blocking", "timeout"}) + @GenerateNodeFactory + public abstract static class AcquireLockLockNode extends PythonTernaryBuiltinNode { + @Specialization + static Object acquire(VirtualFrame frame, PLock self, Object blocking, Object timeout, + @Cached AcquireLockNode acquireLockNode) { + return acquireLockNode.execute(frame, self, blocking, timeout); + } + } + + @Builtin(name = J___ENTER__, minNumOfPositionalArgs = 1, parameterNames = {"self", "blocking", "timeout"}) + @GenerateNodeFactory + abstract static class EnterLockNode extends PythonTernaryBuiltinNode { + @Specialization + static Object acquire(VirtualFrame frame, AbstractPythonLock self, Object blocking, Object timeout, + @Cached AcquireLockNode acquireLockNode) { + return acquireLockNode.execute(frame, self, blocking, timeout); + } + } + + @Builtin(name = "release", minNumOfPositionalArgs = 1) + @GenerateNodeFactory + public abstract static class ReleaseLockNode extends PythonUnaryBuiltinNode { + @Specialization + static Object doRelease(PLock self) { + self.release(); + return PNone.NONE; + } + + @Specialization + static Object doRelease(PRLock self, + @Bind("this") Node inliningTarget, + @Cached PRaiseNode raiseNode) { + if (!self.isOwned()) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, ErrorMessages.LOCK_NOT_HELD); + } + self.release(); + return PNone.NONE; + } + } + + @Builtin(name = J___EXIT__, minNumOfPositionalArgs = 4) + @GenerateNodeFactory + abstract static class ExitLockNode extends PythonBuiltinNode { + @Specialization + @TruffleBoundary + static Object exit(AbstractPythonLock self, @SuppressWarnings("unused") Object type, @SuppressWarnings("unused") Object value, @SuppressWarnings("unused") Object traceback) { + self.release(); + return PNone.NONE; + } + } + + @Builtin(name = "locked", minNumOfPositionalArgs = 1) + @GenerateNodeFactory + abstract static class IsLockedLockNode extends PythonUnaryBuiltinNode { + @Specialization + static boolean isLocked(PLock self) { + return self.locked(); + } + } + + @Slot(value = SlotKind.tp_repr, isComplex = true) + @GenerateNodeFactory + abstract static class ReprLockNode extends PythonUnaryBuiltinNode { + @Specialization + static TruffleString repr(PLock self, + @Shared("formatter") @Cached SimpleTruffleStringFormatNode simpleTruffleStringFormatNode) { + return simpleTruffleStringFormatNode.format("<%s %s object at %d>", + (self.locked()) ? "locked" : "unlocked", + GetNameNode.executeUncached(GetPythonObjectClassNode.executeUncached(self)), + self.hashCode()); + } + + @Specialization + static TruffleString repr(PRLock self, + @Shared("formatter") @Cached SimpleTruffleStringFormatNode simpleTruffleStringFormatNode) { + return simpleTruffleStringFormatNode.format("<%s %s object owner=%d count=%d at %d>", + (self.locked()) ? "locked" : "unlocked", + GetNameNode.executeUncached(GetPythonObjectClassNode.executeUncached(self)), + self.getOwnerId(), + self.getCount(), + self.hashCode()); + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/LockBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/LockBuiltins.java deleted file mode 100644 index 41c435b6b4..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/LockBuiltins.java +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.thread; - -import static com.oracle.graal.python.builtins.objects.thread.AbstractPythonLock.TIMEOUT_MAX; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ENTER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EXIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.OverflowError; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; - -import java.util.List; - -import com.oracle.graal.python.annotations.ArgumentClinic; -import com.oracle.graal.python.builtins.Builtin; -import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; -import com.oracle.graal.python.runtime.GilNode; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.GenerateNodeFactory; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.NodeFactory; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.strings.TruffleString; - -@CoreFunctions(extendClasses = {PythonBuiltinClassType.PLock, PythonBuiltinClassType.PRLock}) -public final class LockBuiltins extends PythonBuiltins { - @Override - protected List> getNodeFactories() { - return LockBuiltinsFactory.getFactories(); - } - - public static final boolean DEFAULT_BLOCKING = AbstractPythonLock.DEFAULT_BLOCKING; - public static final double UNSET_TIMEOUT = AbstractPythonLock.UNSET_TIMEOUT; - - @Builtin(name = "acquire", minNumOfPositionalArgs = 1, parameterNames = {"self", "blocking", "timeout"}) - @ArgumentClinic(name = "blocking", conversion = ArgumentClinic.ClinicConversion.Boolean, defaultValue = "LockBuiltins.DEFAULT_BLOCKING", useDefaultForNone = true) - @ArgumentClinic(name = "timeout", conversion = ArgumentClinic.ClinicConversion.Double, defaultValue = "LockBuiltins.UNSET_TIMEOUT", useDefaultForNone = true) - @ImportStatic({LockBuiltins.class, AbstractPythonLock.class}) - @GenerateNodeFactory - public abstract static class AcquireLockNode extends PythonTernaryClinicBuiltinNode { - - @Override - protected ArgumentClinicProvider getArgumentClinic() { - return LockBuiltinsClinicProviders.AcquireLockNodeClinicProviderGen.INSTANCE; - } - - @Specialization(guards = {"!invalidArgs(blocking, timeout)", "!blocking"}) - static boolean nonBlocking(PLock self, @SuppressWarnings("unused") boolean blocking, @SuppressWarnings("unused") double timeout) { - // acquire lock - return self.acquireNonBlocking(); - } - - @Specialization(guards = {"!invalidArgs(blocking, timeout)", "!blocking"}) - static boolean nonBlocking(PRLock self, @SuppressWarnings("unused") boolean blocking, @SuppressWarnings("unused") double timeout) { - // acquire lock - return self.acquireNonBlocking(); - } - - @Specialization(guards = {"!invalidArgs(blocking, timeout)", "timeout == UNSET_TIMEOUT", "blocking"}) - boolean acBlocking(PLock self, @SuppressWarnings("unused") boolean blocking, @SuppressWarnings("unused") double timeout, - @Cached.Shared("g") @Cached GilNode gil) { - // acquire lock - gil.release(true); - try { - return self.acquireBlocking(this); - } finally { - gil.acquire(); - } - } - - @Specialization(guards = {"!invalidArgs(blocking, timeout)", "timeout == UNSET_TIMEOUT", "blocking"}) - boolean acBlocking(PRLock self, @SuppressWarnings("unused") boolean blocking, @SuppressWarnings("unused") double timeout, - @Cached.Shared("g") @Cached GilNode gil) { - // acquire lock - gil.release(true); - try { - return self.acquireBlocking(this); - } finally { - gil.acquire(); - } - } - - @Specialization(guards = {"!invalidArgs(blocking, timeout)", "timeout != UNSET_TIMEOUT", "blocking"}) - boolean acTimeOut(AbstractPythonLock self, @SuppressWarnings("unused") boolean blocking, double timeout, - @Cached.Shared("g") @Cached GilNode gil) { - // acquire lock - gil.release(true); - try { - return self.acquireTimeout(this, timeout); - } finally { - gil.acquire(); - } - } - - @SuppressWarnings("unused") - @Specialization(guards = {"invalidArgs(blocking, timeout)", "timeout != UNSET_TIMEOUT", "!blocking"}) - static boolean err1(AbstractPythonLock self, boolean blocking, double timeout, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.CANT_SPECIFY_TIMEOUT_FOR_NONBLOCKING); - } - - @SuppressWarnings("unused") - @Specialization(guards = {"invalidArgs(blocking, timeout)", "timeout != UNSET_TIMEOUT", "isNeg(timeout)"}) - static boolean err2(AbstractPythonLock self, boolean blocking, double timeout, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(ValueError, ErrorMessages.TIMEOUT_VALUE_MUST_BE_POSITIVE); - } - - @SuppressWarnings("unused") - @Specialization(guards = {"invalidArgs(blocking, timeout)", "timeout != UNSET_TIMEOUT", "timeout > TIMEOUT_MAX"}) - static boolean err3(AbstractPythonLock self, boolean blocking, double timeout, - @Shared @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(OverflowError, ErrorMessages.TIMEOUT_VALUE_TOO_LARGE); - } - - protected static boolean invalidArgs(boolean blocking, double timeout) { - return timeout != UNSET_TIMEOUT && (!blocking || timeout < 0 || timeout > TIMEOUT_MAX); - } - - protected boolean isNeg(double timeout) { - return timeout < 0; - } - } - - @Builtin(name = "acquire_lock", minNumOfPositionalArgs = 1, parameterNames = {"self", "blocking", "timeout"}) - @GenerateNodeFactory - public abstract static class AcquireLockLockNode extends PythonTernaryBuiltinNode { - @Specialization - static Object acquire(VirtualFrame frame, PLock self, Object blocking, Object timeout, - @Cached AcquireLockNode acquireLockNode) { - return acquireLockNode.execute(frame, self, blocking, timeout); - } - } - - @Builtin(name = J___ENTER__, minNumOfPositionalArgs = 1, parameterNames = {"self", "blocking", "timeout"}) - @GenerateNodeFactory - abstract static class EnterLockNode extends PythonTernaryBuiltinNode { - @Specialization - static Object acquire(VirtualFrame frame, AbstractPythonLock self, Object blocking, Object timeout, - @Cached AcquireLockNode acquireLockNode) { - return acquireLockNode.execute(frame, self, blocking, timeout); - } - } - - @Builtin(name = "release", minNumOfPositionalArgs = 1) - @GenerateNodeFactory - public abstract static class ReleaseLockNode extends PythonUnaryBuiltinNode { - @Specialization - static Object doRelease(PLock self) { - self.release(); - return PNone.NONE; - } - - @Specialization - static Object doRelease(PRLock self, - @Bind("this") Node inliningTarget, - @Cached PRaiseNode.Lazy raiseNode) { - if (!self.isOwned()) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, ErrorMessages.LOCK_NOT_HELD); - } - self.release(); - return PNone.NONE; - } - } - - @Builtin(name = J___EXIT__, minNumOfPositionalArgs = 4) - @GenerateNodeFactory - abstract static class ExitLockNode extends PythonBuiltinNode { - @Specialization - @TruffleBoundary - static Object exit(AbstractPythonLock self, @SuppressWarnings("unused") Object type, @SuppressWarnings("unused") Object value, @SuppressWarnings("unused") Object traceback) { - self.release(); - return PNone.NONE; - } - } - - @Builtin(name = "locked", minNumOfPositionalArgs = 1) - @GenerateNodeFactory - abstract static class IsLockedLockNode extends PythonUnaryBuiltinNode { - @Specialization - static boolean isLocked(PLock self) { - return self.locked(); - } - } - - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) - @GenerateNodeFactory - abstract static class ReprLockNode extends PythonUnaryBuiltinNode { - @Specialization - static TruffleString repr(PLock self, - @Shared("formatter") @Cached SimpleTruffleStringFormatNode simpleTruffleStringFormatNode) { - return simpleTruffleStringFormatNode.format("<%s %s object at %d>", - (self.locked()) ? "locked" : "unlocked", - GetNameNode.executeUncached(GetPythonObjectClassNode.executeUncached(self)), - self.hashCode()); - } - - @Specialization - static TruffleString repr(PRLock self, - @Shared("formatter") @Cached SimpleTruffleStringFormatNode simpleTruffleStringFormatNode) { - return simpleTruffleStringFormatNode.format("<%s %s object owner=%d count=%d at %d>", - (self.locked()) ? "locked" : "unlocked", - GetNameNode.executeUncached(GetPythonObjectClassNode.executeUncached(self)), - self.getOwnerId(), - self.getCount(), - self.hashCode()); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/LockTypeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/LockTypeBuiltins.java new file mode 100644 index 0000000000..d4c334dde2 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/LockTypeBuiltins.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.builtins.objects.thread; + +import java.util.List; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; +import com.oracle.graal.python.builtins.CoreFunctions; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Specialization; + +@CoreFunctions(extendClasses = PythonBuiltinClassType.PLock) +public class LockTypeBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = LockTypeBuiltinsSlotsGen.SLOTS; + + @Override + protected List> getNodeFactories() { + return LockTypeBuiltinsFactory.getFactories(); + } + + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "LockType", minNumOfPositionalArgs = 1) + @GenerateNodeFactory + public abstract static class ConstructLockNode extends PythonUnaryBuiltinNode { + @Specialization + PLock construct(Object cls, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createLock(language, cls, getInstanceShape.execute(cls)); + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/PThreadLocal.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/PThreadLocal.java index 4b3f583d5f..5c46139e74 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/PThreadLocal.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/PThreadLocal.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -55,7 +55,6 @@ import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.util.PythonUtils; @@ -63,7 +62,6 @@ import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.library.ExportLibrary; import com.oracle.truffle.api.library.ExportMessage; @@ -73,7 +71,6 @@ import com.oracle.truffle.api.strings.TruffleString; @ExportLibrary(InteropLibrary.class) -@ImportStatic(SpecialMethodSlot.class) public final class PThreadLocal extends PythonBuiltinObject { private final ThreadLocal threadLocalDict; private final Object[] args; @@ -136,7 +133,7 @@ private Object readMember(Node inliningTarget, String member, HashingStorageGetI @ExportMessage public boolean isMemberReadable(String member, - @Bind("$node") Node inliningTarget, + @Bind Node inliningTarget, @Shared("getItem") @Cached HashingStorageGetItem getItem, @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode) { return readMember(inliningTarget, member, getItem, fromJavaStringNode) != null; @@ -144,7 +141,7 @@ public boolean isMemberReadable(String member, @ExportMessage public boolean isMemberModifiable(String member, - @Bind("$node") Node inliningTarget, + @Bind Node inliningTarget, @Shared("getItem") @Cached HashingStorageGetItem getItem, @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode) { return readMember(inliningTarget, member, getItem, fromJavaStringNode) != null; @@ -152,7 +149,7 @@ public boolean isMemberModifiable(String member, @ExportMessage public boolean isMemberInsertable(String member, - @Bind("$node") Node inliningTarget, + @Bind Node inliningTarget, @Shared("getItem") @Cached HashingStorageGetItem getItem, @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode) { return !isMemberReadable(member, inliningTarget, getItem, fromJavaStringNode); @@ -160,7 +157,7 @@ public boolean isMemberInsertable(String member, @ExportMessage public boolean isMemberInvocable(String member, - @Bind("$node") Node inliningTarget, + @Bind Node inliningTarget, @Shared("getItem") @Cached HashingStorageGetItem getItem, @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode) { PDict localDict = getThreadLocalDict(); @@ -169,7 +166,7 @@ public boolean isMemberInvocable(String member, @ExportMessage public boolean isMemberRemovable(String member, - @Bind("$node") Node inliningTarget, + @Bind Node inliningTarget, @Shared("getItem") @Cached HashingStorageGetItem getItem, @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode) { return isMemberReadable(member, inliningTarget, getItem, fromJavaStringNode); @@ -177,7 +174,7 @@ public boolean isMemberRemovable(String member, @ExportMessage public boolean hasMemberReadSideEffects(String member, - @Bind("$node") Node inliningTarget, + @Bind Node inliningTarget, @Shared("getItem") @Cached HashingStorageGetItem getItem, @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode, @Shared @Cached GetObjectSlotsNode getSlotsNode) { @@ -187,7 +184,7 @@ public boolean hasMemberReadSideEffects(String member, @ExportMessage public boolean hasMemberWriteSideEffects(String member, - @Bind("$node") Node inliningTarget, + @Bind Node inliningTarget, @Shared("getItem") @Cached HashingStorageGetItem getItem, @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode, @Shared @Cached GetObjectSlotsNode getSlotsNode) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/RLockBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/RLockBuiltins.java index 845bf35846..ca89c93435 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/RLockBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/RLockBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,6 +42,10 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -49,6 +53,8 @@ import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; @@ -57,7 +63,7 @@ import com.oracle.graal.python.nodes.util.CastToJavaUnsignedLongNode; import com.oracle.graal.python.runtime.GilNode; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -68,11 +74,26 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PRLock) public final class RLockBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = RLockBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return RLockBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "RLock", minNumOfPositionalArgs = 1) + @GenerateNodeFactory + public abstract static class ConstructRLockNode extends PythonUnaryBuiltinNode { + @Specialization + PRLock construct(Object cls, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + return PFactory.createRLock(language, cls, getInstanceShape.execute(cls)); + } + } + @Builtin(name = "_is_owned", minNumOfPositionalArgs = 1) @GenerateNodeFactory abstract static class IsOwnedRLockNode extends PythonUnaryBuiltinNode { @@ -121,13 +142,13 @@ abstract static class ReleaseSaveRLockNode extends PythonUnaryBuiltinNode { static Object releaseSave(PRLock self, @Bind("this") Node inliningTarget, @Cached InlinedConditionProfile countProfile, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { int count = self.getCount(); if (countProfile.profile(inliningTarget, count == 0)) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.RuntimeError, ErrorMessages.CANNOT_RELEASE_UNAQUIRED_LOCK); + throw raiseNode.raise(inliningTarget, PythonErrorType.RuntimeError, ErrorMessages.CANNOT_RELEASE_UNAQUIRED_LOCK); } - PTuple retVal = factory.createTuple(new Object[]{count, self.getOwnerId()}); + PTuple retVal = PFactory.createTuple(language, new Object[]{count, self.getOwnerId()}); self.releaseAll(); return retVal; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/ThreadBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/ThreadBuiltins.java deleted file mode 100644 index d932d54da1..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/ThreadBuiltins.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.thread; - -import java.util.List; - -import com.oracle.graal.python.builtins.Builtin; -import com.oracle.graal.python.builtins.CoreFunctions; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.GenerateNodeFactory; -import com.oracle.truffle.api.dsl.NodeFactory; -import com.oracle.truffle.api.dsl.Specialization; - -@CoreFunctions(extendClasses = PythonBuiltinClassType.PThread) -public final class ThreadBuiltins extends PythonBuiltins { - @Override - protected List> getNodeFactories() { - return ThreadBuiltinsFactory.getFactories(); - } - - @Builtin(name = "native_id", minNumOfPositionalArgs = 1, isGetter = true) - @GenerateNodeFactory - public abstract static class GetNativeIdNode extends PythonUnaryBuiltinNode { - @Specialization - @TruffleBoundary - protected static long get(PThread self) { - return self.getId(); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/ThreadLocalBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/ThreadLocalBuiltins.java index 947e2607c1..57e98241a2 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/ThreadLocalBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/ThreadLocalBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,13 +41,13 @@ package com.oracle.graal.python.builtins.objects.thread; import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___DICT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -55,10 +55,13 @@ import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetItem; import com.oracle.graal.python.builtins.objects.dict.PDict; +import com.oracle.graal.python.builtins.objects.function.PKeyword; +import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins; import com.oracle.graal.python.builtins.objects.object.ObjectNodes; import com.oracle.graal.python.builtins.objects.object.ObjectNodes.GenericSetAttrWithDictNode; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.CallSlotDescrGet; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrSet; @@ -69,10 +72,12 @@ import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; @@ -96,12 +101,24 @@ protected List> getNodeFa return ThreadLocalBuiltinsFactory.getFactories(); } - @Builtin(name = J___INIT__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "_local", minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) @GenerateNodeFactory - abstract static class InitNode extends PythonUnaryBuiltinNode { + public abstract static class ThreadLocalNode extends PythonBuiltinNode { @Specialization - PNone repr(@SuppressWarnings("unused") PThreadLocal self) { - return PNone.NONE; + static PThreadLocal construct(Object cls, Object[] args, PKeyword[] keywordArgs, + @Bind Node inliningTarget, + @Bind PythonLanguage language, + @Cached TpSlots.GetCachedTpSlotsNode getSlots, + @Cached PRaiseNode raiseNode, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + if (args.length != 0 || keywordArgs.length != 0) { + TpSlots slots = getSlots.execute(inliningTarget, cls); + if (slots.tp_init() == ObjectBuiltins.SLOTS.tp_init()) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.INITIALIZATION_ARGUMENTS_ARE_NOT_SUPPORTED); + } + } + return PFactory.createThreadLocal(language, cls, getInstanceShape.execute(cls), args, keywordArgs); } } @@ -133,14 +150,14 @@ Object doIt(VirtualFrame frame, PThreadLocal object, Object keyObj, @Cached InlinedConditionProfile hasDescrProfile, @Cached InlinedConditionProfile hasDescrGetProfile, @Cached InlinedConditionProfile hasValueProfile, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { // Note: getting thread local dict has potential side-effects, don't move PDict localDict = getThreadLocalDict.execute(frame, object); TruffleString key; try { key = castKeyToStringNode.execute(inliningTarget, keyObj); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_NAME_MUST_BE_STRING, keyObj); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_NAME_MUST_BE_STRING, keyObj); } Object type = getClassNode.execute(inliningTarget, object); @@ -167,7 +184,7 @@ Object doIt(VirtualFrame frame, PThreadLocal object, Object keyObj, return dispatch(frame, object, type, descr, descrGetSlot); } } - throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, object, key); + throw raiseNode.raiseAttributeError(inliningTarget, object, key); } private Object dispatch(VirtualFrame frame, Object object, Object type, Object descr, TpSlot get) { @@ -199,7 +216,7 @@ static void doGeneric(VirtualFrame frame, PThreadLocal object, Object keyObject, @Bind("this") Node inliningTarget, @Exclusive @Cached ThreadLocalNodes.GetThreadLocalDict getThreadLocalDict, @Cached CastToTruffleStringNode castKeyToStringNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Exclusive @Cached GenericSetAttrWithDictNode setAttrWithDictNode) { // Note: getting thread local dict has potential side-effects, don't move PDict localDict = getThreadLocalDict.execute(frame, object); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/ThreadLocalNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/ThreadLocalNodes.java index b42bebeab3..b1dcea9c3d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/ThreadLocalNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/ThreadLocalNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,17 +40,20 @@ */ package com.oracle.graal.python.builtins.objects.thread; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.dict.PDict; -import com.oracle.graal.python.lib.PyObjectLookupAttr; +import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotVarargs.CallSlotTpInitNode; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; public abstract class ThreadLocalNodes { @@ -59,17 +62,20 @@ public abstract static class GetThreadLocalDict extends PNodeWithContext { public abstract PDict execute(VirtualFrame frame, PThreadLocal self); @Specialization - PDict get(VirtualFrame frame, PThreadLocal self, + static PDict get(VirtualFrame frame, PThreadLocal self, @Bind("this") Node inliningTarget, - @Cached PythonObjectFactory factory, - @Cached PyObjectLookupAttr lookup, - @Cached CallNode callNode) { + @Cached InlinedBranchProfile create, + @Cached GetObjectSlotsNode getSlots, + @Cached CallSlotTpInitNode callInit) { PDict dict = self.getThreadLocalDict(); if (dict == null) { - dict = factory.createDict(); + create.enter(inliningTarget); + dict = PFactory.createDict(PythonLanguage.get(inliningTarget)); self.setThreadLocalDict(dict); - Object initMethod = lookup.execute(frame, inliningTarget, self, SpecialMethodNames.T___INIT__); - callNode.execute(frame, initMethod, self.getArgs(), self.getKeywords()); + TpSlots slots = getSlots.execute(inliningTarget, self); + if (slots.tp_init() != ObjectBuiltins.SLOTS.tp_init()) { + callInit.execute(frame, inliningTarget, slots.tp_init(), self, self.getArgs(), self.getKeywords()); + } } return dict; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tokenize/TokenizerIterBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tokenize/TokenizerIterBuiltins.java index f7a393dcbb..d44f366398 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tokenize/TokenizerIterBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tokenize/TokenizerIterBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,24 +40,31 @@ */ package com.oracle.graal.python.builtins.objects.tokenize; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import java.util.List; -import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.tokenize.TokenizerIterBuiltinsClinicProviders.TokenizerIterNodeClinicProviderGen; import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.pegparser.tokenizer.Token; import com.oracle.graal.python.pegparser.tokenizer.Token.Kind; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; @@ -69,12 +76,33 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PTokenizerIter) public final class TokenizerIterBuiltins extends PythonBuiltins { + public static final TpSlots SLOTS = TokenizerIterBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return TokenizerIterBuiltinsFactory.getFactories(); } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "TokenizerIter", minNumOfPositionalArgs = 2, parameterNames = {"$cls", "source"}) + @ArgumentClinic(name = "source", conversion = ArgumentClinic.ClinicConversion.TString) + @GenerateNodeFactory + public abstract static class TokenizerIterNode extends PythonBinaryClinicBuiltinNode { + + @Override + protected ArgumentClinicProvider getArgumentClinic() { + return TokenizerIterNodeClinicProviderGen.INSTANCE; + } + + @Specialization + static PTokenizerIter tokenizerIter(@SuppressWarnings("unused") Object cls, TruffleString source, + @Bind PythonLanguage language, + @Cached TruffleString.ToJavaStringNode toJavaStringNode) { + return PFactory.createTokenizerIter(language, toJavaStringNode.execute(source)); + } + } + + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory abstract static class IterNode extends PythonUnaryBuiltinNode { @Specialization @@ -83,20 +111,20 @@ static PTokenizerIter iter(PTokenizerIter self) { } } - @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iternext, isComplex = true) @GenerateNodeFactory - abstract static class NextNode extends PythonUnaryBuiltinNode { + abstract static class NextNode extends TpIterNextBuiltin { private static final TruffleString T_EOF = tsLiteral("EOF"); @Specialization static PTuple next(PTokenizerIter self, @Bind("this") Node inliningTarget, @Cached TruffleString.FromJavaStringNode fromJavaStringNode, - @Cached PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { Token token = self.getNextToken(); if (token.type == Kind.ERRORTOKEN || token.type == Kind.ENDMARKER) { - throw raiseNode.get(inliningTarget).raiseStopIteration(T_EOF); + throw raiseNode.raiseStopIteration(inliningTarget, T_EOF); } int startColumn; int endColumn; @@ -110,7 +138,7 @@ static PTuple next(PTokenizerIter self, if (token.type == Kind.NEWLINE) { endColumn--; } - return factory.createTuple(new Object[]{ + return PFactory.createTuple(language, new Object[]{ fromJavaStringNode.execute(self.getTokenString(token), TS_ENCODING), token.type, token.sourceRange.startLine, diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/traceback/LazyTraceback.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/traceback/LazyTraceback.java index a63b7d14b6..8de472f4bb 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/traceback/LazyTraceback.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/traceback/LazyTraceback.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -154,8 +154,8 @@ public static boolean elementWantedForTraceback(TruffleStackTraceElement element if (frame != null) { // only include frames of non-builtin python functions Object info = frame.getFrameDescriptor().getInfo(); - if (info instanceof FrameInfo) { - return ((FrameInfo) info).getRootNode().frameIsVisibleToPython(); + if (info instanceof FrameInfo frameInfo) { + return frameInfo.includeInTraceback(); } } return false; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/traceback/MaterializeLazyTracebackNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/traceback/MaterializeLazyTracebackNode.java index 0f90e1a881..a08af605d8 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/traceback/MaterializeLazyTracebackNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/traceback/MaterializeLazyTracebackNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,8 +40,9 @@ */ package com.oracle.graal.python.builtins.objects.traceback; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; @@ -71,7 +72,7 @@ * frames that the exception has passed through during the unwinding plus the frame where it was * caught. It doesn't include the frames above it (to the top). Secondly, the traceback is never * frozen. The traceback accumulates more frames when the exception gets reraised. To correct the - * mismatch between Truffle and Python eception handling, we need to wrap {@link PException}s in + * mismatch between Truffle and Python exception handling, we need to wrap {@link PException}s in * {@link LazyTraceback} objects when caught and adhere to particular rules of exception handling * mentioned below. *

        @@ -134,7 +135,6 @@ static PTraceback getMaterialized(LazyTraceback tb) { @Fallback static PTraceback getTraceback(Node inliningTarget, LazyTraceback tb, - @Cached(inline = false) PythonObjectFactory factory, @Cached InlinedLoopConditionProfile loopConditionProfile) { PTraceback newTraceback = null; LazyTraceback current = tb; @@ -143,7 +143,7 @@ static PTraceback getTraceback(Node inliningTarget, LazyTraceback tb, if (current.isMaterialized()) { newTraceback = current.getTraceback(); } else { - newTraceback = factory.createTraceback(current); + newTraceback = PFactory.createTraceback(PythonLanguage.get(inliningTarget), current); } break; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/traceback/PTraceback.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/traceback/PTraceback.java index 3d04a261ab..21011830be 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/traceback/PTraceback.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/traceback/PTraceback.java @@ -46,7 +46,10 @@ import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.frame.PFrame; import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; +import com.oracle.truffle.api.bytecode.BytecodeNode; +import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; public final class PTraceback extends PythonBuiltinObject { @@ -56,6 +59,7 @@ public final class PTraceback extends PythonBuiltinObject { private PFrame.Reference frameInfo; private int lineno = UNKNOWN_LINE_NUMBER; private int bci = -1; + private BytecodeNode bytecodeNode = null; private int lasti = -1; private PTraceback next; private LazyTraceback lazyTraceback; @@ -107,13 +111,20 @@ public int getLineno() { public int getLasti(PFrame pFrame) { if (lasti == -1 && bci >= 0) { - lasti = pFrame.bciToLasti(bci); + Node location; + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + location = bytecodeNode; + } else { + location = pFrame.getLocation(); + } + lasti = PFrame.bciToLasti(bci, location); } return lasti; } - public void setBci(int bci) { + public void setLocation(int bci, BytecodeNode bytecodeNode) { this.bci = bci; + this.bytecodeNode = bytecodeNode; // nullable this.lasti = -1; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/traceback/TracebackBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/traceback/TracebackBuiltins.java index 228a0a26ed..6d1275e6e4 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/traceback/TracebackBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/traceback/TracebackBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -35,6 +35,11 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -43,6 +48,8 @@ import com.oracle.graal.python.builtins.objects.frame.PFrame; import com.oracle.graal.python.builtins.objects.frame.PFrame.Reference; import com.oracle.graal.python.builtins.objects.function.PArguments; +import com.oracle.graal.python.builtins.objects.traceback.TracebackBuiltinsClinicProviders.TracebackTypeNodeClinicProviderGen; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.bytecode.PBytecodeGeneratorRootNode; @@ -52,8 +59,11 @@ import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.exception.PythonErrorType; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.TruffleStackTrace; import com.oracle.truffle.api.TruffleStackTraceElement; @@ -75,18 +85,65 @@ @CoreFunctions(extendClasses = PythonBuiltinClassType.PTraceback) public final class TracebackBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = TracebackBuiltinsSlotsGen.SLOTS; + @Override protected List> getNodeFactories() { return TracebackBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = "TracebackType", minNumOfPositionalArgs = 5, parameterNames = {"$cls", "tb_next", "tb_frame", + "tb_lasti", + "tb_lineno"}) + @ArgumentClinic(name = "tb_lasti", conversion = ArgumentClinic.ClinicConversion.Index) + @ArgumentClinic(name = "tb_lineno", conversion = ArgumentClinic.ClinicConversion.Index) + @GenerateNodeFactory + public abstract static class TracebackTypeNode extends PythonClinicBuiltinNode { + @Specialization + static Object createTraceback(@SuppressWarnings("unused") Object cls, PTraceback next, PFrame pframe, int lasti, int lineno, + @Bind PythonLanguage language) { + return PFactory.createTracebackWithLasti(language, pframe, lineno, lasti, next); + } + + @Specialization + static Object createTraceback(@SuppressWarnings("unused") Object cls, @SuppressWarnings("unused") PNone next, PFrame pframe, int lasti, int lineno, + @Bind PythonLanguage language) { + return PFactory.createTracebackWithLasti(language, pframe, lineno, lasti, null); + } + + @Specialization(guards = {"!isPTraceback(next)", "!isNone(next)"}) + @SuppressWarnings("unused") + static Object errorNext(Object cls, Object next, Object frame, Object lasti, Object lineno, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.TypeError, ErrorMessages.EXPECTED_TRACEBACK_OBJ_OR_NONE, next); + } + + @Specialization(guards = "!isPFrame(frame)") + @SuppressWarnings("unused") + static Object errorFrame(Object cls, Object next, Object frame, Object lasti, Object lineno, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.TypeError, ErrorMessages.TRACEBACK_TYPE_ARG_MUST_BE_FRAME, frame); + } + + protected static boolean isPFrame(Object obj) { + return obj instanceof PFrame; + } + + @Override + protected ArgumentClinicProvider getArgumentClinic() { + return TracebackTypeNodeClinicProviderGen.INSTANCE; + } + } + @Builtin(name = J___DIR__, minNumOfPositionalArgs = 1) @GenerateNodeFactory public abstract static class DirNode extends PythonBuiltinNode { @Specialization static Object dir(@SuppressWarnings("unused") PTraceback self, - @Cached PythonObjectFactory factory) { - return factory.createList(PTraceback.getTbFieldNames()); + @Bind PythonLanguage language) { + return PFactory.createList(language, PTraceback.getTbFieldNames()); } } @@ -109,8 +166,7 @@ static void doExisting(@SuppressWarnings("unused") PTraceback tb) { @Specialization(guards = "!tb.isMaterialized()") static void doMaterialize(Node inliningTarget, PTraceback tb, @Cached(inline = false) MaterializeFrameNode materializeFrameNode, - @Cached MaterializeLazyTracebackNode materializeLazyTracebackNode, - @Cached(inline = false) PythonObjectFactory factory) { + @Cached MaterializeLazyTracebackNode materializeLazyTracebackNode) { /* * Truffle stacktrace consists of the frames captured during the unwinding and the * frames that are now on the Java stack. We don't want the frames from the stack to @@ -136,15 +192,15 @@ static void doMaterialize(Node inliningTarget, PTraceback tb, TruffleStackTraceElement element = stackTrace.get(truffleIndex); if (LazyTraceback.elementWantedForTraceback(element)) { PFrame pFrame = materializeFrame(element, materializeFrameNode); - next = factory.createTraceback(pFrame, pFrame.getLine(), next); - next.setBci(pFrame.getBci()); + next = PFactory.createTraceback(PythonLanguage.get(null), pFrame, pFrame.getLine(), next); + next.setLocation(pFrame.getBci(), pFrame.getBytecodeNode()); pyIndex++; } } } if (lazyTraceback.catchingFrameWantedForTraceback()) { - tb.setBci(pException.getCatchBci()); - tb.setLineno(pException.getCatchRootNode().bciToLine(pException.getCatchBci())); + tb.setLocation(pException.getCatchBci(), pException.getBytecodeNode()); + tb.setLineno(pException.getCatchLine()); tb.setNext(next); } else { assert next != null; @@ -272,12 +328,12 @@ static Object set(PTraceback self, PTraceback next, @Bind("this") Node inliningTarget, @Cached InlinedLoopConditionProfile loopProfile, @Exclusive @Cached MaterializeTruffleStacktraceNode materializeTruffleStacktraceNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { // Check for loops PTraceback tb = next; while (loopProfile.profile(inliningTarget, tb != null)) { if (tb == self) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.TRACEBACK_LOOP_DETECTED); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.TRACEBACK_LOOP_DETECTED); } tb = tb.getNext(); } @@ -301,8 +357,8 @@ static Object clear(PTraceback self, @SuppressWarnings("unused") PNone next, @Specialization(guards = {"!isPNone(next)", "!isPTraceback(next)"}) static Object setError(@SuppressWarnings("unused") PTraceback self, Object next, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.EXPECTED_TRACEBACK_OBJ, next); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.EXPECTED_TRACEBACK_OBJ, next); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/InstantiableStructSequenceBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/InstantiableStructSequenceBuiltins.java new file mode 100644 index 0000000000..215ab8bbd1 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/InstantiableStructSequenceBuiltins.java @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.builtins.objects.tuple; + +import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; + +import java.util.Collections; +import java.util.List; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.builtins.CoreFunctions; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; +import com.oracle.graal.python.builtins.objects.dict.PDict; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.lib.PyDictGetItem; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.builtins.ListNodes; +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; +import com.oracle.graal.python.nodes.object.BuiltinClassProfiles; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage; +import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; +import com.oracle.truffle.api.strings.TruffleString; + +@CoreFunctions(extendClasses = { + PythonBuiltinClassType.PStatResult, + PythonBuiltinClassType.PStatvfsResult, + PythonBuiltinClassType.PTerminalSize, + PythonBuiltinClassType.PUnameResult, + PythonBuiltinClassType.PStructTime, + PythonBuiltinClassType.PProfilerEntry, + PythonBuiltinClassType.PProfilerSubentry, + PythonBuiltinClassType.PStructPasswd, + PythonBuiltinClassType.PStructRusage, + PythonBuiltinClassType.PFloatInfo, + PythonBuiltinClassType.PIntInfo, + PythonBuiltinClassType.PHashInfo, + PythonBuiltinClassType.PThreadInfo, + PythonBuiltinClassType.PUnraisableHookArgs}) +public class InstantiableStructSequenceBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = InstantiableStructSequenceBuiltinsSlotsGen.SLOTS; + + @Override + protected List> getNodeFactories() { + return Collections.emptyList(); + } + + @Slot(value = Slot.SlotKind.tp_new, isComplex = true) + @Slot.SlotSignature(minNumOfPositionalArgs = 2, parameterNames = {"$cls", "sequence", "dict"}) + @GenerateNodeFactory + public abstract static class NewNode extends PythonTernaryBuiltinNode { + + @Specialization + static PTuple withDict(VirtualFrame frame, Object cls, Object sequence, Object dict, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Cached StructSequenceBuiltins.GetSizeNode getSizeNode, + @Cached StructSequenceBuiltins.GetFieldNamesNode getFieldNamesNode, + @Cached ListNodes.FastConstructListNode fastConstructListNode, + @Cached SequenceStorageNodes.GetItemScalarNode getItem, + @Cached BuiltinClassProfiles.IsBuiltinObjectProfile notASequenceProfile, + @Cached InlinedBranchProfile wrongLenProfile, + @Cached TypeNodes.GetInstanceShape getInstanceShape, + @Cached PyDictGetItem dictGetItem, + @Cached InlinedConditionProfile hasDictProfile, + @Cached PRaiseNode raiseNode) { + SequenceStorage seq; + try { + seq = fastConstructListNode.execute(frame, inliningTarget, sequence).getSequenceStorage(); + } catch (PException e) { + e.expect(inliningTarget, TypeError, notASequenceProfile); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CONSTRUCTOR_REQUIRES_A_SEQUENCE); + } + + boolean hasDict = hasDictProfile.profile(inliningTarget, dict instanceof PDict); + if (!hasDict && dict != PNone.NO_VALUE) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.TAKES_A_DICT_AS_SECOND_ARG_IF_ANY, StructSequence.getTpName(cls)); + } + + int len = seq.length(); + int minLen = getSizeNode.execute(frame, inliningTarget, cls, StructSequence.T_N_SEQUENCE_FIELDS); + int maxLen = getSizeNode.execute(frame, inliningTarget, cls, StructSequence.T_N_FIELDS); + int unnamedFields = getSizeNode.execute(frame, inliningTarget, cls, StructSequence.T_N_UNNAMED_FIELDS); + + if (len < minLen || len > maxLen) { + wrongLenProfile.enter(inliningTarget); + if (minLen == maxLen) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.TAKES_A_D_SEQUENCE, StructSequence.getTpName(cls), minLen, len); + } + if (len < minLen) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.TAKES_AN_AT_LEAST_D_SEQUENCE, StructSequence.getTpName(cls), minLen, len); + } else { // len > maxLen + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.TAKES_AN_AT_MOST_D_SEQUENCE, StructSequence.getTpName(cls), maxLen, len); + } + } + + Object[] dst = new Object[maxLen]; + for (int i = 0; i < seq.length(); i++) { + dst[i] = getItem.execute(inliningTarget, seq, i); + } + TruffleString[] fieldNames = hasDict ? getFieldNamesNode.execute(inliningTarget, cls) : null; + for (int i = seq.length(); i < dst.length; ++i) { + if (hasDict) { + Object o = dictGetItem.execute(frame, inliningTarget, (PDict) dict, fieldNames[i - unnamedFields]); + dst[i] = o == null ? PNone.NONE : o; + } else { + dst[i] = PNone.NONE; + } + } + return PFactory.createTuple(language, cls, getInstanceShape.execute(cls), new ObjectSequenceStorage(dst, minLen)); + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/PTuple.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/PTuple.java index d91d651368..b80c95a225 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/PTuple.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/PTuple.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/StructSequence.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/StructSequence.java index 45fd01e7a8..71ae4abd50 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/StructSequence.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/StructSequence.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,95 +40,50 @@ */ package com.oracle.graal.python.builtins.objects.tuple; +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.NotImplementedError; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DOC__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEW__; -import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA_SPACE; -import static com.oracle.graal.python.nodes.StringLiterals.T_EQ; -import static com.oracle.graal.python.nodes.StringLiterals.T_LPAREN; -import static com.oracle.graal.python.nodes.StringLiterals.T_RPAREN; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REDUCE__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REPR__; import static com.oracle.graal.python.util.PythonUtils.EMPTY_TRUFFLESTRING_ARRAY; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.toTruffleStringArrayUncached; -import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; import static com.oracle.graal.python.util.PythonUtils.tsArray; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; -import java.util.Arrays; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; -import org.graalvm.nativeimage.ImageInfo; - import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.common.EconomicMapStorage; -import com.oracle.graal.python.builtins.objects.common.HashingStorage; -import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetItem; -import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItem; +import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; -import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetItemNode; -import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ToArrayNode; -import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.function.Signature; import com.oracle.graal.python.builtins.objects.getsetdescriptor.GetSetDescriptor; -import com.oracle.graal.python.builtins.objects.object.ObjectNodes.GetFullyQualifiedClassNameNode; -import com.oracle.graal.python.builtins.objects.tuple.StructSequenceFactory.DisabledNewNodeGen; -import com.oracle.graal.python.builtins.objects.tuple.StructSequenceFactory.NewNodeGen; -import com.oracle.graal.python.builtins.objects.tuple.StructSequenceFactory.ReduceNodeGen; -import com.oracle.graal.python.builtins.objects.tuple.StructSequenceFactory.ReprNodeGen; +import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; +import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeFlags; import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode; -import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltin; import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.HiddenAttr; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.PRootNode; -import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode; -import com.oracle.graal.python.nodes.builtins.ListNodes.FastConstructListNode; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; -import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; -import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.runtime.object.PythonObjectSlowPathFactory; -import com.oracle.graal.python.runtime.sequence.PSequence; -import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage; -import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; -import com.oracle.graal.python.util.Function; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.graal.python.util.PythonUtils.PrototypeNodeFactory; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.graal.python.runtime.sequence.storage.NativeSequenceStorage; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.RootCallTarget; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.api.strings.TruffleStringBuilder; /** * Allows definitions of tuple-like structs with named fields (like structseq.c in CPython). @@ -151,88 +106,33 @@ public class StructSequence { * type's name in the descriptor and this will improve code sharing. */ public static sealed class Descriptor permits BuiltinTypeDescriptor { - public final TruffleString docString; public final int inSequence; public final TruffleString[] fieldNames; public final TruffleString[] fieldDocStrings; - public final boolean allowInstances; - public Descriptor(TruffleString docString, int inSequence, TruffleString[] fieldNames, TruffleString[] fieldDocStrings, boolean allowInstances) { + public Descriptor(int inSequence, TruffleString[] fieldNames, TruffleString[] fieldDocStrings) { assert fieldDocStrings == null || fieldNames.length == fieldDocStrings.length; - this.docString = docString; this.inSequence = inSequence; this.fieldNames = fieldNames; this.fieldDocStrings = fieldDocStrings; - this.allowInstances = allowInstances; - } - - public Descriptor(TruffleString docString, int inSequence, TruffleString[] fieldNames, TruffleString[] fieldDocStrings) { - this(docString, inSequence, fieldNames, fieldDocStrings, true); - } - - // This shifts the names in a confusing way, but that is what CPython does: - // >>> s = os.stat('.') - // >>> s.st_atime - // 1607033732.3041613 - // >>> s - // os.stat_result(..., st_atime=1607033732, ...) - // - // note that st_atime accessed by name returns float (index 10), but in repr the same label - // is assigned to the int value at index 7 - TruffleString[] getFieldsForRepr() { - TruffleString[] fieldNamesForRepr = new TruffleString[inSequence]; - int k = 0; - for (int idx = 0; idx < fieldNames.length && k < inSequence; ++idx) { - if (fieldNames[idx] != null) { - fieldNamesForRepr[k++] = fieldNames[idx]; - } - } - // each field < inSequence must have a name - assert k == inSequence; - return fieldNamesForRepr; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof Descriptor)) { - return false; - } - Descriptor that = (Descriptor) o; - return inSequence == that.inSequence && allowInstances == that.allowInstances && Objects.equals(docString, that.docString) && Arrays.equals(fieldNames, that.fieldNames) && - Arrays.equals(fieldDocStrings, that.fieldDocStrings); - } - - @Override - public int hashCode() { - int result = Objects.hash(docString, inSequence, allowInstances); - result = 31 * result + Arrays.hashCode(fieldNames); - result = 31 * result + Arrays.hashCode(fieldDocStrings); - return result; } } /** * Very similar to {@code PyStructSequence_Desc} but already specific to a built-in type. Used - * for built-in structseq objects. + * for built-in structseq objects. All BuiltinTypeDescriptor instances should be kept in + * {@code static final} fields to ensure there is a finite number of them. */ public static final class BuiltinTypeDescriptor extends Descriptor { public final PythonBuiltinClassType type; - private final boolean initializedInBuildTime = ImageInfo.inImageBuildtimeCode(); - public BuiltinTypeDescriptor(PythonBuiltinClassType type, String docString, int inSequence, String[] fieldNames, String[] fieldDocStrings, boolean allowInstances) { - super(docString == null ? null : toTruffleStringUncached(docString), inSequence, toTruffleStringArrayUncached(fieldNames), toTruffleStringArrayUncached(fieldDocStrings), allowInstances); + public BuiltinTypeDescriptor(PythonBuiltinClassType type, int inSequence, String[] fieldNames, String[] fieldDocStrings) { + super(inSequence, toTruffleStringArrayUncached(fieldNames), toTruffleStringArrayUncached(fieldDocStrings)); assert type.getBase() == PythonBuiltinClassType.PTuple; assert !type.isAcceptableBase(); this.type = type; } - public BuiltinTypeDescriptor(PythonBuiltinClassType type, String docString, int inSequence, String[] fieldNames, String[] fieldDocStrings) { - this(type, docString, inSequence, fieldNames, fieldDocStrings, true); - } - @Override public boolean equals(Object o) { if (this == o) { @@ -251,28 +151,17 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(super.hashCode(), type); } - - public boolean wasInitializedAtBuildTime() { - return initializedInBuildTime; - } - } - - public record DescriptorCallTargets(RootCallTarget reprBuiltin, RootCallTarget reduceBuiltin, RootCallTarget newBuiltin) { } @TruffleBoundary public static void initType(Python3Core core, BuiltinTypeDescriptor desc) { - initType(core.factory(), core.getLanguage(), core.lookupType(desc.type), desc); - } - - @TruffleBoundary - public static void initType(PythonLanguage language, Object klass, Descriptor desc) { - initType(PythonContext.get(null).factory(), language, klass, desc); + initType(core.getContext(), core.lookupType(desc.type), desc); } @TruffleBoundary - public static void initType(PythonObjectSlowPathFactory factory, PythonLanguage language, Object klass, Descriptor desc) { + public static void initType(PythonContext context, PythonAbstractClass klass, Descriptor desc) { assert IsSubtypeNode.getUncached().execute(klass, PythonBuiltinClassType.PTuple); + PythonLanguage language = context.getLanguage(); long flags = TypeNodes.GetTypeFlagsNode.executeUncached(klass); if ((flags & TypeFlags.IMMUTABLETYPE) != 0) { @@ -282,268 +171,70 @@ public static void initType(PythonObjectSlowPathFactory factory, PythonLanguage // create descriptors for accessing named fields by their names int unnamedFields = 0; + List namedFields = new ArrayList<>(desc.fieldNames.length); for (int idx = 0; idx < desc.fieldNames.length; ++idx) { - if (desc.fieldNames[idx] != null) { + TruffleString fieldName = desc.fieldNames[idx]; + if (fieldName != null) { TruffleString doc = desc.fieldDocStrings == null ? null : desc.fieldDocStrings[idx]; - createMember(factory, language, klass, desc.fieldNames[idx], doc, idx); + createMember(language, klass, fieldName, doc, idx); + namedFields.add(fieldName); } else { unnamedFields++; } } - - DescriptorCallTargets callTargets = language.getOrCreateStructSequenceCallTargets(desc, d -> new DescriptorCallTargets( - createBuiltinCallTarget(language, desc, ReprNode.class, ReprNodeGen::create, true), - createBuiltinCallTarget(language, desc, ReduceNode.class, ReduceNodeGen::create, true), - desc.allowInstances ? // - createBuiltinCallTarget(language, desc, NewNode.class, NewNodeGen::create, false) : // - createBuiltinCallTarget(language, desc, DisabledNewNode.class, ignore -> DisabledNewNodeGen.create(), false))); - - createMethod(factory, klass, ReprNode.class, callTargets.reprBuiltin); - createMethod(factory, klass, ReduceNode.class, callTargets.reduceBuiltin); - WriteAttributeToObjectNode writeAttrNode = WriteAttributeToObjectNode.getUncached(true); - /* - * Only set __doc__ if given. It may be 'null' e.g. in case of initializing a native class - * where 'tp_doc' is set in native code already. - */ - if (desc.docString != null) { - writeAttrNode.execute(klass, T___DOC__, desc.docString); + if (klass instanceof PythonManagedClass managedClass) { + /* + * The methods and slots are already set for each PBCT, but we need to store the field + * names. + */ + HiddenAttr.WriteNode.executeUncached(managedClass, HiddenAttr.STRUCTSEQ_FIELD_NAMES, namedFields.toArray(new TruffleString[0])); + } else if (klass instanceof PythonAbstractNativeObject nativeClass) { + /* + * We need to add the methods. Note that PyType_Ready already ran, so we just write the + * method wrappers. Field names are already populated in tp_members on the native side. + */ + TpSlotBuiltin newSlot = null; + if ((flags & TypeFlags.DISALLOW_INSTANTIATION) == 0) { + newSlot = (TpSlotBuiltin) InstantiableStructSequenceBuiltins.SLOTS.tp_new(); + writeAttrNode.execute(klass, T___NEW__, newSlot.createBuiltin(context, klass, T___NEW__, TpSlots.TpSlotMeta.TP_NEW.getNativeSignature())); + } + /* + * The tp_new slot doesn't get updated by writing the python wrapper. See the comments + * about tp_new in TpSlots.updateSlots. We have to write it manually + */ + nativeClass.setTpSlots(nativeClass.getTpSlots().copy().set(TpSlots.TpSlotMeta.TP_NEW, newSlot).build()); + TpSlots.toNative(nativeClass.getPtr(), TpSlots.TpSlotMeta.TP_NEW, newSlot, context.getNativeNull()); + TpSlotBuiltin reprSlot = (TpSlotBuiltin) StructSequenceBuiltins.SLOTS.tp_repr(); + writeAttrNode.execute(klass, T___REPR__, reprSlot.createBuiltin(context, klass, T___REPR__, TpSlots.TpSlotMeta.TP_REPR.getNativeSignature())); + PythonBuiltinClass template = context.lookupType(PythonBuiltinClassType.PFloatInfo); + copyMethod(language, klass, T___REDUCE__, template); } writeAttrNode.execute(klass, T_N_SEQUENCE_FIELDS, desc.inSequence); writeAttrNode.execute(klass, T_N_FIELDS, desc.fieldNames.length); writeAttrNode.execute(klass, T_N_UNNAMED_FIELDS, unnamedFields); - if (ReadAttributeFromObjectNode.getUncachedForceType().execute(klass, T___NEW__) == PNone.NO_VALUE) { - Builtin builtin = NewNode.class.getAnnotation(Builtin.class); - PythonUtils.createConstructor(factory, klass, builtin, callTargets.newBuiltin); - } - if ((flags & TypeFlags.IMMUTABLETYPE) != 0) { - // Restore flags - TypeNodes.SetTypeFlagsNode.executeUncached(klass, flags); - } + TypeNodes.SetTypeFlagsNode.executeUncached(klass, flags); } - private static RootCallTarget createBuiltinCallTarget(PythonLanguage l, Descriptor descriptor, Class nodeClass, Function nodeFactory, - boolean declaresExplicitSelf) { - Builtin builtin = nodeClass.getAnnotation(Builtin.class); - return new BuiltinFunctionRootNode(l, builtin, new PrototypeNodeFactory(nodeFactory.apply(descriptor)), declaresExplicitSelf).getCallTarget(); + private static void copyMethod(PythonLanguage language, PythonAbstractClass klass, TruffleString name, PythonBuiltinClass template) { + PBuiltinFunction templateMethod = (PBuiltinFunction) template.getAttribute(name); + PBuiltinFunction method = PFactory.createBuiltinFunction(language, templateMethod, klass); + WriteAttributeToObjectNode.getUncached(true).execute(klass, name, method); } - private static void createMember(PythonObjectSlowPathFactory factory, PythonLanguage language, Object klass, TruffleString name, TruffleString doc, int idx) { + private static void createMember(PythonLanguage language, Object klass, TruffleString name, TruffleString doc, int idx) { RootCallTarget callTarget = language.createStructSeqIndexedMemberAccessCachedCallTarget((l) -> new GetStructMemberNode(l, idx), idx); - PBuiltinFunction getter = factory.createBuiltinFunction(name, klass, 0, 0, callTarget); - GetSetDescriptor callable = factory.createGetSetDescriptor(getter, null, name, klass, false); + PBuiltinFunction getter = PFactory.createBuiltinFunction(language, name, klass, 0, 0, callTarget); + GetSetDescriptor callable = PFactory.createGetSetDescriptor(language, getter, null, name, klass, false); if (doc != null) { callable.setAttribute(T___DOC__, doc); } WriteAttributeToObjectNode.getUncached(true).execute(klass, name, callable); } - private static void createMethod(PythonObjectSlowPathFactory factory, Object klass, Class nodeClass, RootCallTarget callTarget) { - Builtin builtin = nodeClass.getAnnotation(Builtin.class); - PythonUtils.createMethod(factory, klass, builtin, callTarget, PythonBuiltinClassType.PTuple, 0); - } - - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true) - public abstract static class DisabledNewNode extends PythonVarargsBuiltinNode { - - @Override - @SuppressWarnings("unused") - public final Object varArgExecute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported { - if (arguments.length > 0) { - return error(arguments[0], PythonUtils.EMPTY_OBJECT_ARRAY, PKeyword.EMPTY_KEYWORDS); - } - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw VarargsBuiltinDirectInvocationNotSupported.INSTANCE; - } - - @Specialization - @SuppressWarnings("unused") - Object error(Object cls, Object[] arguments, PKeyword[] keywords) { - throw raise(TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, StructSequence.getTpName(cls)); - } - } - - @Builtin(name = J___NEW__, minNumOfPositionalArgs = 2, parameterNames = {"$cls", "sequence", "dict"}) - public abstract static class NewNode extends PythonTernaryBuiltinNode { - - @CompilationFinal(dimensions = 1) private final TruffleString[] fieldNames; - private final int inSequence; - - NewNode(Descriptor desc) { - this.fieldNames = desc.fieldNames; - this.inSequence = desc.inSequence; - } - - @NeverDefault - public static NewNode create(Descriptor desc) { - return NewNodeGen.create(desc); - } - - @Specialization(guards = "isNoValue(dict)") - @SuppressWarnings("truffle-static-method") - PTuple withoutDict(VirtualFrame frame, Object cls, Object sequence, @SuppressWarnings("unused") PNone dict, - @Bind("this") Node inliningTarget, - @Exclusive @Cached FastConstructListNode fastConstructListNode, - @Exclusive @Cached ToArrayNode toArrayNode, - @Exclusive @Cached IsBuiltinObjectProfile notASequenceProfile, - @Exclusive @Cached InlinedBranchProfile wrongLenProfile, - @Exclusive @Cached InlinedBranchProfile needsReallocProfile, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - Object[] src = sequenceToArray(frame, inliningTarget, sequence, fastConstructListNode, toArrayNode, notASequenceProfile, raiseNode); - Object[] dst = processSequence(inliningTarget, cls, src, wrongLenProfile, needsReallocProfile, raiseNode); - for (int i = src.length; i < dst.length; ++i) { - dst[i] = PNone.NONE; - } - return factory.createTuple(cls, new ObjectSequenceStorage(dst, inSequence)); - } - - @Specialization - @SuppressWarnings("truffle-static-method") - PTuple withDict(VirtualFrame frame, Object cls, Object sequence, PDict dict, - @Bind("this") Node inliningTarget, - @Exclusive @Cached FastConstructListNode fastConstructListNode, - @Exclusive @Cached ToArrayNode toArrayNode, - @Exclusive @Cached IsBuiltinObjectProfile notASequenceProfile, - @Exclusive @Cached InlinedBranchProfile wrongLenProfile, - @Exclusive @Cached InlinedBranchProfile needsReallocProfile, - @Cached HashingStorageGetItem getItem, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - Object[] src = sequenceToArray(frame, inliningTarget, sequence, fastConstructListNode, toArrayNode, notASequenceProfile, raiseNode); - Object[] dst = processSequence(inliningTarget, cls, src, wrongLenProfile, needsReallocProfile, raiseNode); - HashingStorage hs = dict.getDictStorage(); - for (int i = src.length; i < dst.length; ++i) { - Object o = getItem.execute(inliningTarget, hs, fieldNames[i]); - dst[i] = o == null ? PNone.NONE : o; - } - return factory.createTuple(cls, new ObjectSequenceStorage(dst, inSequence)); - } - - @Specialization(guards = {"!isNoValue(dict)", "!isDict(dict)"}) - @SuppressWarnings("unused") - static PTuple doDictError(VirtualFrame frame, Object cls, Object sequence, Object dict, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.TAKES_A_DICT_AS_SECOND_ARG_IF_ANY, StructSequence.getTpName(cls)); - } - - private static Object[] sequenceToArray(VirtualFrame frame, Node inliningTarget, Object sequence, FastConstructListNode fastConstructListNode, - ToArrayNode toArrayNode, IsBuiltinObjectProfile notASequenceProfile, PRaiseNode.Lazy raiseNode) { - PSequence seq; - try { - seq = fastConstructListNode.execute(frame, inliningTarget, sequence); - } catch (PException e) { - e.expect(inliningTarget, TypeError, notASequenceProfile); - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CONSTRUCTOR_REQUIRES_A_SEQUENCE); - } - return toArrayNode.execute(inliningTarget, seq.getSequenceStorage()); - } - - private Object[] processSequence(Node inliningTarget, Object cls, Object[] src, InlinedBranchProfile wrongLenProfile, InlinedBranchProfile needsReallocProfile, PRaiseNode.Lazy raiseNode) { - int len = src.length; - int minLen = inSequence; - int maxLen = fieldNames.length; - - if (len < minLen || len > maxLen) { - wrongLenProfile.enter(inliningTarget); - if (minLen == maxLen) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.TAKES_A_D_SEQUENCE, StructSequence.getTpName(cls), minLen, len); - } - if (len < minLen) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.TAKES_AN_AT_LEAST_D_SEQUENCE, StructSequence.getTpName(cls), minLen, len); - } else { // len > maxLen - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.TAKES_AN_AT_MOST_D_SEQUENCE, StructSequence.getTpName(cls), maxLen, len); - } - } - - if (len != maxLen) { - needsReallocProfile.enter(inliningTarget); - Object[] dst = new Object[maxLen]; - PythonUtils.arraycopy(src, 0, dst, 0, len); - return dst; - } - return src; - } - } - - @Builtin(name = J___REDUCE__, minNumOfPositionalArgs = 1) - abstract static class ReduceNode extends PythonUnaryBuiltinNode { - - @CompilationFinal(dimensions = 1) private final TruffleString[] fieldNames; - private final int inSequence; - - ReduceNode(Descriptor desc) { - this.fieldNames = desc.fieldNames; - this.inSequence = desc.inSequence; - } - - @Specialization - PTuple reduce(PTuple self, - @Bind("this") Node inliningTarget, - @Cached HashingStorageSetItem setHashingStorageItem, - @Cached GetClassNode getClass, - @Cached PythonObjectFactory factory) { - assert self.getSequenceStorage() instanceof ObjectSequenceStorage; - Object[] data = CompilerDirectives.castExact(self.getSequenceStorage(), ObjectSequenceStorage.class).getInternalObjectArray(); - assert data.length == fieldNames.length; - PTuple seq; - PDict dict; - if (fieldNames.length == inSequence) { - seq = factory.createTuple(data); - dict = factory.createDict(); - } else { - HashingStorage storage = EconomicMapStorage.create(fieldNames.length - inSequence); - for (int i = inSequence; i < fieldNames.length; ++i) { - storage = setHashingStorageItem.execute(inliningTarget, storage, fieldNames[i], data[i]); - } - seq = factory.createTuple(Arrays.copyOf(data, inSequence)); - dict = factory.createDict(storage); - } - PTuple seqDictPair = factory.createTuple(new Object[]{seq, dict}); - return factory.createTuple(new Object[]{getClass.execute(inliningTarget, self), seqDictPair}); - } - } - - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) - abstract static class ReprNode extends PythonUnaryBuiltinNode { - - @CompilationFinal(dimensions = 1) private final TruffleString[] fieldNames; - - ReprNode(Descriptor desc) { - this.fieldNames = desc.getFieldsForRepr(); - } - - @Specialization - public TruffleString repr(VirtualFrame frame, PTuple self, - @Bind("this") Node inliningTarget, - @Cached GetFullyQualifiedClassNameNode getFullyQualifiedClassNameNode, - @Cached("createNotNormalized()") GetItemNode getItemNode, - @Cached PyObjectReprAsTruffleStringNode reprNode, - @Cached TruffleStringBuilder.AppendStringNode appendStringNode, - @Cached TruffleStringBuilder.ToStringNode toStringNode) { - TruffleStringBuilder sb = TruffleStringBuilder.create(TS_ENCODING); - appendStringNode.execute(sb, getFullyQualifiedClassNameNode.execute(frame, inliningTarget, self)); - appendStringNode.execute(sb, T_LPAREN); - SequenceStorage tupleStore = self.getSequenceStorage(); - if (fieldNames.length > 0) { - appendStringNode.execute(sb, fieldNames[0]); - appendStringNode.execute(sb, T_EQ); - appendStringNode.execute(sb, reprNode.execute(frame, inliningTarget, getItemNode.execute(tupleStore, 0))); - for (int i = 1; i < fieldNames.length; i++) { - appendStringNode.execute(sb, T_COMMA_SPACE); - appendStringNode.execute(sb, fieldNames[i]); - appendStringNode.execute(sb, T_EQ); - appendStringNode.execute(sb, reprNode.execute(frame, inliningTarget, getItemNode.execute(tupleStore, i))); - } - } - appendStringNode.execute(sb, T_RPAREN); - return toStringNode.execute(sb); - } - } - private static class GetStructMemberNode extends PRootNode { - public static final Signature SIGNATURE = new Signature(-1, false, -1, false, tsArray("$self"), EMPTY_TRUFFLESTRING_ARRAY); + public static final Signature SIGNATURE = new Signature(-1, false, -1, tsArray("$self"), EMPTY_TRUFFLESTRING_ARRAY); private final int fieldIdx; GetStructMemberNode(PythonLanguage language, int fieldIdx) { @@ -554,6 +245,9 @@ private static class GetStructMemberNode extends PRootNode { @Override public Object execute(VirtualFrame frame) { PTuple self = (PTuple) PArguments.getArgument(frame, 0); + if (self.getSequenceStorage() instanceof NativeSequenceStorage && fieldIdx >= self.getSequenceStorage().length()) { + throw PRaiseNode.raiseStatic(this, NotImplementedError, ErrorMessages.UNSUPPORTED_ACCESS_OF_STRUCT_SEQUENCE_NATIVE_STORAGE); + } return SequenceStorageNodes.GetItemScalarNode.executeUncached(self.getSequenceStorage(), fieldIdx); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/StructSequenceBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/StructSequenceBuiltins.java new file mode 100644 index 0000000000..7786b2fe94 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/StructSequenceBuiltins.java @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.builtins.objects.tuple; + +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__; +import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA_SPACE; +import static com.oracle.graal.python.nodes.StringLiterals.T_EQ; +import static com.oracle.graal.python.nodes.StringLiterals.T_LPAREN; +import static com.oracle.graal.python.nodes.StringLiterals.T_RPAREN; +import static com.oracle.graal.python.runtime.exception.PythonErrorType.NotImplementedError; +import static com.oracle.graal.python.util.PythonUtils.EMPTY_TRUFFLESTRING_ARRAY; +import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; + +import java.util.ArrayList; +import java.util.List; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.Slot; +import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.builtins.Builtin; +import com.oracle.graal.python.builtins.CoreFunctions; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; +import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; +import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes; +import com.oracle.graal.python.builtins.objects.cext.structs.CFields; +import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; +import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; +import com.oracle.graal.python.builtins.objects.dict.PDict; +import com.oracle.graal.python.builtins.objects.object.ObjectNodes; +import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.lib.PyDictSetItem; +import com.oracle.graal.python.lib.PyNumberAsSizeNode; +import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.HiddenAttr; +import com.oracle.graal.python.nodes.PGuards; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.graal.python.runtime.sequence.storage.NativeSequenceStorage; +import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Shared; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateNodeFactory; +import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.strings.TruffleString; +import com.oracle.truffle.api.strings.TruffleStringBuilder; + +@CoreFunctions(extendClasses = { + PythonBuiltinClassType.PStatResult, + PythonBuiltinClassType.PStatvfsResult, + PythonBuiltinClassType.PTerminalSize, + PythonBuiltinClassType.PUnameResult, + PythonBuiltinClassType.PStructTime, + PythonBuiltinClassType.PProfilerEntry, + PythonBuiltinClassType.PProfilerSubentry, + PythonBuiltinClassType.PStructPasswd, + PythonBuiltinClassType.PStructRusage, + PythonBuiltinClassType.PVersionInfo, + PythonBuiltinClassType.PWindowsVersion, + PythonBuiltinClassType.PFlags, + PythonBuiltinClassType.PFloatInfo, + PythonBuiltinClassType.PIntInfo, + PythonBuiltinClassType.PHashInfo, + PythonBuiltinClassType.PThreadInfo, + PythonBuiltinClassType.PUnraisableHookArgs}) +public final class StructSequenceBuiltins extends PythonBuiltins { + + public static final TpSlots SLOTS = StructSequenceBuiltinsSlotsGen.SLOTS; + + @Override + protected List> getNodeFactories() { + return StructSequenceBuiltinsFactory.getFactories(); + } + + @GenerateInline + @GenerateCached(false) + abstract static class GetSizeNode extends Node { + public abstract int execute(VirtualFrame frame, Node inliningTarget, Object type, TruffleString key); + + @Specialization + static int doPBCT(VirtualFrame frame, Node inliningTarget, PythonBuiltinClassType type, TruffleString key, + @Shared @Cached("createForceType()") ReadAttributeFromObjectNode read, + @Shared @Cached PyNumberAsSizeNode asSizeNode) { + return doGeneric(frame, inliningTarget, PythonContext.get(inliningTarget).lookupType(type), key, read, asSizeNode); + } + + @Fallback + static int doGeneric(VirtualFrame frame, Node inliningTarget, Object type, TruffleString key, + @Shared @Cached("createForceType()") ReadAttributeFromObjectNode read, + @Shared @Cached PyNumberAsSizeNode asSizeNode) { + return asSizeNode.executeExact(frame, inliningTarget, read.execute(type, key)); + } + } + + @GenerateInline + @GenerateCached(false) + abstract static class GetFieldNamesNode extends Node { + public abstract TruffleString[] execute(Node inliningTarget, Object type); + + @Specialization + static TruffleString[] doPBCT(Node inliningTarget, PythonBuiltinClassType type, + @Shared @Cached HiddenAttr.ReadNode readNode) { + return doManaged(inliningTarget, PythonContext.get(inliningTarget).lookupType(type), readNode); + } + + @Specialization + static TruffleString[] doManaged(Node inliningTarget, PythonManagedClass type, + @Shared @Cached HiddenAttr.ReadNode readNode) { + return (TruffleString[]) readNode.execute(inliningTarget, type, HiddenAttr.STRUCTSEQ_FIELD_NAMES, EMPTY_TRUFFLESTRING_ARRAY); + } + + @Specialization + @TruffleBoundary + static TruffleString[] doNative(PythonAbstractNativeObject type) { + CStructAccess.ReadPointerNode read = CStructAccess.ReadPointerNode.getUncached(); + Object membersPtr = read.readFromObj(type, CFields.PyTypeObject__tp_members); + List members = new ArrayList<>(); + InteropLibrary lib = InteropLibrary.getUncached(); + if (!PGuards.isNullOrZero(membersPtr, lib)) { + for (int i = 0;; i++) { + Object memberNamePtr = read.readStructArrayElement(membersPtr, i, CFields.PyMemberDef__name); + if (PGuards.isNullOrZero(memberNamePtr, lib)) { + break; + } + TruffleString name = CExtNodes.FromCharPointerNode.executeUncached(memberNamePtr); + members.add(name); + } + } + return members.toArray(new TruffleString[0]); + } + } + + @Slot(value = SlotKind.tp_repr, isComplex = true) + @GenerateNodeFactory + abstract static class ReprNode extends PythonUnaryBuiltinNode { + + @Specialization + static TruffleString repr(VirtualFrame frame, PTuple self, + @Bind("this") Node inliningTarget, + @Cached GetClassNode getClassNode, + @Cached GetFieldNamesNode getFieldNamesNode, + @Cached ObjectNodes.GetFullyQualifiedNameNode getQName, + @Cached SequenceStorageNodes.GetItemScalarNode getItemNode, + @Cached PyObjectReprAsTruffleStringNode reprNode, + @Cached TruffleStringBuilder.AppendStringNode appendStringNode, + @Cached TruffleStringBuilder.ToStringNode toStringNode) { + Object type = getClassNode.execute(inliningTarget, self); + TruffleStringBuilder sb = TruffleStringBuilder.create(TS_ENCODING); + appendStringNode.execute(sb, getQName.execute(frame, type)); + appendStringNode.execute(sb, T_LPAREN); + SequenceStorage tupleStore = self.getSequenceStorage(); + int visibleSize = tupleStore.length(); + TruffleString[] fieldNames = getFieldNamesNode.execute(inliningTarget, type); + if (visibleSize > 0) { + appendStringNode.execute(sb, fieldNames[0]); + appendStringNode.execute(sb, T_EQ); + appendStringNode.execute(sb, reprNode.execute(frame, inliningTarget, getItemNode.execute(inliningTarget, tupleStore, 0))); + for (int i = 1; i < visibleSize; i++) { + appendStringNode.execute(sb, T_COMMA_SPACE); + appendStringNode.execute(sb, fieldNames[i]); + appendStringNode.execute(sb, T_EQ); + appendStringNode.execute(sb, reprNode.execute(frame, inliningTarget, getItemNode.execute(inliningTarget, tupleStore, i))); + } + } + appendStringNode.execute(sb, T_RPAREN); + return toStringNode.execute(sb); + } + } + + @Builtin(name = J___REDUCE__, minNumOfPositionalArgs = 1) + @GenerateNodeFactory + abstract static class ReduceNode extends PythonUnaryBuiltinNode { + + @Specialization + static PTuple reduce(VirtualFrame frame, PTuple self, + @Bind("this") Node inliningTarget, + @Cached GetClassNode getClass, + @Cached GetSizeNode getSizeNode, + @Cached GetFieldNamesNode getFieldNamesNode, + @Cached SequenceStorageNodes.GetItemScalarNode getSeqItem, + @Cached SequenceStorageNodes.GetItemSliceNode getSeqSlice, + @Cached PyDictSetItem dictSetItem, + @Cached PRaiseNode raiseNode, + @Bind PythonLanguage language) { + SequenceStorage storage = self.getSequenceStorage(); + Object type = getClass.execute(inliningTarget, self); + int nFields = getSizeNode.execute(frame, inliningTarget, type, StructSequence.T_N_FIELDS); + int nVisibleFields = storage.length(); + int nUnnamedFields = getSizeNode.execute(frame, inliningTarget, type, StructSequence.T_N_UNNAMED_FIELDS); + PTuple tuple = PFactory.createTuple(language, getSeqSlice.execute(storage, 0, nVisibleFields, 1, nVisibleFields)); + PDict dict = PFactory.createDict(language); + if (nFields > nVisibleFields) { + if (storage instanceof NativeSequenceStorage) { + // TODO Native storage conversion wouldn't preserve the items past length + throw raiseNode.raise(inliningTarget, NotImplementedError, ErrorMessages.UNSUPPORTED_ACCESS_OF_STRUCT_SEQUENCE_NATIVE_STORAGE); + } + assert storage.getCapacity() >= nFields; + TruffleString[] fieldNames = getFieldNamesNode.execute(inliningTarget, type); + for (int i = nVisibleFields; i < nFields; i++) { + TruffleString n = fieldNames[i - nUnnamedFields]; + // We're reading past length, GetItemScalarNode doesn't do a bounds check + dictSetItem.execute(inliningTarget, dict, n, getSeqItem.execute(inliningTarget, storage, i)); + } + } + return PFactory.createTuple(language, new Object[]{type, PFactory.createTuple(language, new Object[]{tuple, dict})}); + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/TupleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/TupleBuiltins.java index e4f66cd8fc..633dcc0b72 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/TupleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/TupleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2014, Regents of the University of California * * All rights reserved. @@ -25,19 +25,9 @@ */ package com.oracle.graal.python.builtins.objects.tuple; +import static com.oracle.graal.python.nodes.BuiltinNames.J_TUPLE; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CLASS_GETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CONTAINS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__; import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GETNEWARGS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___LT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___TRUFFLE_RICHCOMPARE__; import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA; import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA_SPACE; import static com.oracle.graal.python.nodes.StringLiterals.T_ELLIPSIS_IN_PARENS; @@ -50,20 +40,19 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; -import com.oracle.graal.python.builtins.modules.MathGuards; import com.oracle.graal.python.builtins.objects.PNotImplemented; import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; +import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; -import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.CmpNode; -import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ConcatNode; -import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ListGeneralizationNode; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.SequenceStorageMpSubscriptNode; import com.oracle.graal.python.builtins.objects.iterator.PDoubleSequenceIterator; import com.oracle.graal.python.builtins.objects.iterator.PIntegerSequenceIterator; @@ -72,13 +61,16 @@ import com.oracle.graal.python.builtins.objects.iterator.PSequenceIterator; import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltinsClinicProviders.IndexNodeClinicProviderGen; import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.MpSubscriptBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.SqConcatBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.HashBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.LenBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqItemBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.SqRepeatBuiltinNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqContains.SqContainsBuiltinNode; import com.oracle.graal.python.lib.PyIndexCheckNode; -import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyObjectHashNode; import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode; import com.oracle.graal.python.lib.PyObjectRichCompareBool; @@ -86,41 +78,35 @@ import com.oracle.graal.python.lib.PyTupleCheckNode; import com.oracle.graal.python.lib.PyTupleGetItem; import com.oracle.graal.python.lib.PyTupleSizeNode; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.builtins.TupleNodes; import com.oracle.graal.python.nodes.builtins.TupleNodes.GetNativeTupleStorage; import com.oracle.graal.python.nodes.builtins.TupleNodes.GetTupleStorage; +import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryClinicBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.DoubleSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.IntSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.LongSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; -import com.oracle.graal.python.util.ComparisonOp; -import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; -import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateNodeFactory; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.InlinedBranchProfile; @@ -137,12 +123,64 @@ protected List> getNodeFa return TupleBuiltinsFactory.getFactories(); } + // tuple([iterable]) + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_TUPLE, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2) + @GenerateNodeFactory + public abstract static class TupleNode extends PythonBinaryBuiltinNode { + + @Specialization(guards = "isBuiltinTupleType(cls)") + static Object doBuiltin(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object iterable, + @Shared @Cached TupleNodes.ConstructTupleNode constructTupleNode) { + return constructTupleNode.execute(frame, iterable); + } + + @Specialization(guards = "!needsNativeAllocationNode.execute(inliningTarget, cls)", replaces = "doBuiltin") + static PTuple constructTuple(VirtualFrame frame, Object cls, Object iterable, + @SuppressWarnings("unused") @Bind("this") Node inliningTarget, + @SuppressWarnings("unused") @Shared @Cached TypeNodes.NeedsNativeAllocationNode needsNativeAllocationNode, + @Shared @Cached TupleNodes.ConstructTupleNode constructTupleNode, + @Cached TypeNodes.IsSameTypeNode isSameTypeNode, + @Bind PythonLanguage language, + @Cached TypeNodes.GetInstanceShape getInstanceShape) { + PTuple tuple = constructTupleNode.execute(frame, iterable); + if (isSameTypeNode.execute(inliningTarget, cls, PythonBuiltinClassType.PTuple)) { + return tuple; + } else { + return PFactory.createTuple(language, cls, getInstanceShape.execute(cls), tuple.getSequenceStorage()); + } + } + + // delegate to tuple_subtype_new(PyTypeObject *type, PyObject *x) + @Specialization(guards = {"needsNativeAllocationNode.execute(inliningTarget, cls)", "isSubtypeOfTuple( isSubtype, cls)"}, limit = "1") + @InliningCutoff + static Object doNative(@SuppressWarnings("unused") VirtualFrame frame, Object cls, Object iterable, + @SuppressWarnings("unused") @Bind("this") Node inliningTarget, + @SuppressWarnings("unused") @Shared @Cached TypeNodes.NeedsNativeAllocationNode needsNativeAllocationNode, + @Cached @SuppressWarnings("unused") IsSubtypeNode isSubtype, + @Cached CExtNodes.TupleSubtypeNew subtypeNew) { + return subtypeNew.call(cls, iterable); + } + + protected static boolean isBuiltinTupleType(Object cls) { + return cls == PythonBuiltinClassType.PTuple; + } + + protected static boolean isSubtypeOfTuple(IsSubtypeNode isSubtypeNode, Object cls) { + return isSubtypeNode.execute(cls, PythonBuiltinClassType.PTuple); + } + + @Fallback + static PTuple tupleObject(Object cls, @SuppressWarnings("unused") Object arg, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.IS_NOT_TYPE_OBJ, "'cls'", cls); + } + } + // index(element) @Builtin(name = "index", minNumOfPositionalArgs = 2, parameterNames = {"$self", "value", "start", "stop"}) @ArgumentClinic(name = "start", conversion = ArgumentClinic.ClinicConversion.SliceIndex, defaultValue = "0") @ArgumentClinic(name = "stop", conversion = ArgumentClinic.ClinicConversion.SliceIndex, defaultValue = "Integer.MAX_VALUE") - @TypeSystemReference(PythonArithmeticTypes.class) - @ImportStatic(MathGuards.class) @GenerateNodeFactory public abstract static class IndexNode extends PythonQuaternaryClinicBuiltinNode { @@ -158,7 +196,7 @@ int index(VirtualFrame frame, Object self, Object value, int startIn, int endIn, @Cached InlinedBranchProfile startLe0Profile, @Cached InlinedBranchProfile endLe0Profile, @Cached SequenceStorageNodes.ItemIndexNode itemIndexNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { SequenceStorage storage = getTupleStorage.execute(inliningTarget, self); int start = startIn; if (start < 0) { @@ -180,7 +218,7 @@ int index(VirtualFrame frame, Object self, Object value, int startIn, int endIn, if (idx != -1) { return idx; } - throw raiseNode.get(inliningTarget).raise(PythonErrorType.ValueError, ErrorMessages.X_NOT_IN_TUPLE); + throw raiseNode.raise(inliningTarget, PythonErrorType.ValueError, ErrorMessages.X_NOT_IN_TUPLE); } } @@ -189,16 +227,16 @@ int index(VirtualFrame frame, Object self, Object value, int startIn, int endIn, public abstract static class CountNode extends PythonBinaryBuiltinNode { @Specialization - long count(VirtualFrame frame, Object self, Object value, + static long count(VirtualFrame frame, Object self, Object value, @Bind("this") Node inliningTarget, @Cached GetTupleStorage getTupleStorage, @Cached("createNotNormalized()") SequenceStorageNodes.GetItemNode getItemNode, - @Cached PyObjectRichCompareBool.EqNode eqNode) { + @Cached PyObjectRichCompareBool eqNode) { long count = 0; SequenceStorage tupleStore = getTupleStorage.execute(inliningTarget, self); for (int i = 0; i < tupleStore.length(); i++) { Object seqItem = getItemNode.execute(tupleStore, i); - if (eqNode.compare(frame, inliningTarget, seqItem, value)) { + if (eqNode.execute(frame, inliningTarget, seqItem, value, RichCmpOp.Py_EQ)) { count++; } } @@ -219,7 +257,7 @@ public int len(Object self, } } - @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_repr, isComplex = true) @GenerateNodeFactory public abstract static class ReprNode extends PythonUnaryBuiltinNode { @Override @@ -294,160 +332,38 @@ static Object doIt(VirtualFrame frame, Object self, Object idx, @Bind("this") Node inliningTarget, @Cached InlinedConditionProfile validProfile, @Cached PyIndexCheckNode indexCheckNode, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached GetTupleStorage getTupleStorage, @Cached SequenceStorageMpSubscriptNode subscriptNode) { if (!validProfile.profile(inliningTarget, SequenceStorageMpSubscriptNode.isValidIndex(inliningTarget, idx, indexCheckNode))) { raiseNonIntIndex(inliningTarget, raiseNode, idx); } return subscriptNode.execute(frame, inliningTarget, getTupleStorage.execute(inliningTarget, self), idx, - ErrorMessages.TUPLE_OUT_OF_BOUNDS, PythonObjectFactory::createTuple); + ErrorMessages.TUPLE_OUT_OF_BOUNDS, PFactory::createTuple); } @InliningCutoff - private static void raiseNonIntIndex(Node inliningTarget, PRaiseNode.Lazy raiseNode, Object index) { - raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.OBJ_INDEX_MUST_BE_INT_OR_SLICES, "tuple", index); - } - } - - @GenerateCached(false) - abstract static class AbstractCmpNode extends PythonBinaryBuiltinNode { - @Specialization - static boolean doPTuple(VirtualFrame frame, PTuple left, PTuple right, - @Shared("cmp") @Cached("createCmp()") SequenceStorageNodes.CmpNode cmp) { - return cmp.execute(frame, left.getSequenceStorage(), right.getSequenceStorage()); - } - - @Specialization(guards = {"checkRight.execute(inliningTarget, right)"}, limit = "1", replaces = "doPTuple") - static boolean doTuple(VirtualFrame frame, Object left, Object right, - @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached PyTupleCheckNode checkRight, - @Cached GetTupleStorage getLeft, - @Cached GetTupleStorage getRight, - @Shared("cmp") @Cached("createCmp()") SequenceStorageNodes.CmpNode cmp) { - return cmp.execute(frame, getLeft.execute(inliningTarget, left), getRight.execute(inliningTarget, right)); - } - - @Fallback - @SuppressWarnings("unused") - static Object doOther(Object left, Object right) { - return PNotImplemented.NOT_IMPLEMENTED; - } - - @NeverDefault - protected abstract SequenceStorageNodes.CmpNode createCmp(); - } - - @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class EqNode extends AbstractCmpNode { - - @NeverDefault - @Override - protected CmpNode createCmp() { - return SequenceStorageNodes.CmpNode.createEq(); - } - } - - @Builtin(name = J___NE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class NeNode extends AbstractCmpNode { - - @NeverDefault - @Override - protected CmpNode createCmp() { - return SequenceStorageNodes.CmpNode.createNe(); - } - } - - @Builtin(name = J___GE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class GeNode extends AbstractCmpNode { - - @NeverDefault - @Override - protected CmpNode createCmp() { - return SequenceStorageNodes.CmpNode.createGe(); - } - } - - @Builtin(name = J___LE__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class LeNode extends AbstractCmpNode { - - @NeverDefault - @Override - protected CmpNode createCmp() { - return SequenceStorageNodes.CmpNode.createLe(); - } - } - - @Builtin(name = J___GT__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class GtNode extends AbstractCmpNode { - - @NeverDefault - @Override - protected CmpNode createCmp() { - return SequenceStorageNodes.CmpNode.createGt(); - } - } - - @Builtin(name = J___LT__, minNumOfPositionalArgs = 2) - @GenerateNodeFactory - abstract static class LtNode extends AbstractCmpNode { - - @NeverDefault - @Override - protected CmpNode createCmp() { - return SequenceStorageNodes.CmpNode.createLt(); + private static void raiseNonIntIndex(Node inliningTarget, PRaiseNode raiseNode, Object index) { + raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.OBJ_INDEX_MUST_BE_INT_OR_SLICES, "tuple", index); } } - @Builtin(name = J___TRUFFLE_RICHCOMPARE__, minNumOfPositionalArgs = 3) + @Slot(value = SlotKind.tp_richcompare, isComplex = true) @GenerateNodeFactory - @ImportStatic(ComparisonOp.class) - abstract static class RichCompareNode extends PythonTernaryBuiltinNode { - - @Specialization(guards = {"opCode == cachedOp.opCode"}, limit = "6") - static Object doPTuple(VirtualFrame frame, PTuple left, PTuple right, @SuppressWarnings("unused") int opCode, - @SuppressWarnings("unused") @Cached("fromOpCode(opCode)") ComparisonOp cachedOp, - @Exclusive @Cached("createCmpNode(cachedOp)") SequenceStorageNodes.CmpNode cmpNode) { - return cmpNode.execute(frame, left.getSequenceStorage(), right.getSequenceStorage()); - } - - @Specialization(guards = {"opCode == cachedOp.opCode"}, limit = "6", replaces = "doPTuple") - static Object doGeneric(VirtualFrame frame, Object left, Object right, @SuppressWarnings("unused") int opCode, + abstract static class TupleRichCmpNode extends TpSlotRichCompare.RichCmpBuiltinNode { + @Specialization + static Object doTuple(VirtualFrame frame, Object left, Object right, RichCmpOp op, @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached("fromOpCode(opCode)") ComparisonOp cachedOp, @Cached PyTupleCheckNode checkLeft, @Cached PyTupleCheckNode checkRight, + @Cached InlinedConditionProfile tupleCheckProfile, @Cached GetTupleStorage getLeft, @Cached GetTupleStorage getRight, - @Exclusive @Cached("createCmpNode(cachedOp)") SequenceStorageNodes.CmpNode cmpNode) { - if (!checkLeft.execute(inliningTarget, left) || !checkRight.execute(inliningTarget, right)) { + @Cached SequenceStorageNodes.CmpNode cmp) { + if (tupleCheckProfile.profile(inliningTarget, !checkLeft.execute(inliningTarget, left) || !checkRight.execute(inliningTarget, right))) { return PNotImplemented.NOT_IMPLEMENTED; } - return cmpNode.execute(frame, getLeft.execute(inliningTarget, left), getRight.execute(inliningTarget, right)); - } - - @NeverDefault - static SequenceStorageNodes.CmpNode createCmpNode(ComparisonOp op) { - switch (op) { - case LE: - return SequenceStorageNodes.CmpNode.createLe(); - case LT: - return SequenceStorageNodes.CmpNode.createLt(); - case EQ: - return SequenceStorageNodes.CmpNode.createEq(); - case NE: - return SequenceStorageNodes.CmpNode.createNe(); - case GT: - return SequenceStorageNodes.CmpNode.createGt(); - case GE: - return SequenceStorageNodes.CmpNode.createGe(); - } - throw CompilerDirectives.shouldNotReachHere(); + return cmp.execute(frame, inliningTarget, getLeft.execute(inliningTarget, left), getRight.execute(inliningTarget, right), false, null, null, op); } } @@ -461,21 +377,18 @@ static PTuple doTuple(Object left, Object right, @SuppressWarnings("unused") @Cached PyTupleCheckNode checkRight, @Cached GetTupleStorage getLeft, @Cached GetTupleStorage getRight, - @Cached("createConcat()") ConcatNode concatNode, - @Cached PythonObjectFactory factory) { - SequenceStorage concatenated = concatNode.execute(getLeft.execute(inliningTarget, left), getRight.execute(inliningTarget, right)); - return factory.createTuple(concatenated); - } - - @NeverDefault - protected static SequenceStorageNodes.ConcatNode createConcat() { - return SequenceStorageNodes.ConcatNode.create(ListGeneralizationNode::create); + @Cached SequenceStorageNodes.ConcatListOrTupleNode concatNode, + @Bind PythonLanguage language) { + SequenceStorage leftStorage = getLeft.execute(inliningTarget, left); + SequenceStorage rightStorage = getRight.execute(inliningTarget, right); + SequenceStorage concatenated = concatNode.execute(inliningTarget, leftStorage, rightStorage); + return PFactory.createTuple(language, concatenated); } @Fallback static Object doGeneric(@SuppressWarnings("unused") Object left, Object right, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.CAN_ONLY_CONCAT_S_NOT_P_TO_S, "tuple", right, "tuple"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CAN_ONLY_CONCAT_S_NOT_P_TO_S, "tuple", right, "tuple"); } } @@ -489,20 +402,18 @@ static Object doTuple(VirtualFrame frame, Object left, int repeats, @Cached PyTupleCheckExactNode checkTuple, @Cached GetTupleStorage getLeft, @Cached InlinedConditionProfile isSingleRepeat, - @Cached PyNumberAsSizeNode asSizeNode, - @Cached SequenceStorageNodes.RepeatNode repeatNode, - @Cached PythonObjectFactory.Lazy factory) { + @Cached SequenceStorageNodes.RepeatNode repeatNode) { if (isSingleRepeat.profile(inliningTarget, repeats == 1 && checkTuple.execute(inliningTarget, left))) { return left; } else { - return factory.get(inliningTarget).createTuple(repeatNode.execute(frame, getLeft.execute(inliningTarget, left), repeats)); + return PFactory.createTuple(PythonLanguage.get(inliningTarget), repeatNode.execute(frame, getLeft.execute(inliningTarget, left), repeats)); } } } - @Builtin(name = J___CONTAINS__, minNumOfPositionalArgs = 2) + @Slot(value = SlotKind.sq_contains, isComplex = true) @GenerateNodeFactory - abstract static class ContainsNode extends PythonBinaryBuiltinNode { + abstract static class ContainsNode extends SqContainsBuiltinNode { @Specialization boolean contains(VirtualFrame frame, Object self, Object other, @Bind("this") Node inliningTarget, @@ -510,52 +421,51 @@ boolean contains(VirtualFrame frame, Object self, Object other, @Cached SequenceStorageNodes.ContainsNode containsNode) { return containsNode.execute(frame, inliningTarget, getTupleStorage.execute(inliningTarget, self), other); } - } - @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_iter, isComplex = true) @GenerateNodeFactory public abstract static class IterNode extends PythonUnaryBuiltinNode { @Specialization(guards = {"isIntStorage(primary)"}) static PIntegerSequenceIterator doPTupleInt(PTuple primary, - @Shared @Cached PythonObjectFactory factory) { - return factory.createIntegerSequenceIterator((IntSequenceStorage) primary.getSequenceStorage(), primary); + @Bind PythonLanguage language) { + return PFactory.createIntegerSequenceIterator(language, (IntSequenceStorage) primary.getSequenceStorage(), primary); } @Specialization(guards = {"isObjectStorage(primary)"}) static PObjectSequenceIterator doPTupleObject(PTuple primary, - @Shared @Cached PythonObjectFactory factory) { - return factory.createObjectSequenceIterator((ObjectSequenceStorage) primary.getSequenceStorage(), primary); + @Bind PythonLanguage language) { + return PFactory.createObjectSequenceIterator(language, (ObjectSequenceStorage) primary.getSequenceStorage(), primary); } @Specialization(guards = {"isLongStorage(primary)"}) static PLongSequenceIterator doPTupleLong(PTuple primary, - @Shared @Cached PythonObjectFactory factory) { - return factory.createLongSequenceIterator((LongSequenceStorage) primary.getSequenceStorage(), primary); + @Bind PythonLanguage language) { + return PFactory.createLongSequenceIterator(language, (LongSequenceStorage) primary.getSequenceStorage(), primary); } @Specialization(guards = {"isDoubleStorage(primary)"}) static PDoubleSequenceIterator doPTupleDouble(PTuple primary, - @Shared @Cached PythonObjectFactory factory) { - return factory.createDoubleSequenceIterator((DoubleSequenceStorage) primary.getSequenceStorage(), primary); + @Bind PythonLanguage language) { + return PFactory.createDoubleSequenceIterator(language, (DoubleSequenceStorage) primary.getSequenceStorage(), primary); } @Specialization(guards = {"!isIntStorage(primary)", "!isLongStorage(primary)", "!isDoubleStorage(primary)"}) static PSequenceIterator doPTuple(PTuple primary, - @Shared @Cached PythonObjectFactory factory) { - return factory.createSequenceIterator(primary); + @Bind PythonLanguage language) { + return PFactory.createSequenceIterator(language, primary); } @Specialization static PSequenceIterator doNativeTuple(PythonAbstractNativeObject primary, - @Shared @Cached PythonObjectFactory factory) { - return factory.createSequenceIterator(primary); + @Bind PythonLanguage language) { + return PFactory.createSequenceIterator(language, primary); } } - @Builtin(name = J___HASH__, minNumOfPositionalArgs = 1) + @Slot(value = SlotKind.tp_hash, isComplex = true) @GenerateNodeFactory - public abstract static class HashNode extends PythonUnaryBuiltinNode { + public abstract static class HashNode extends HashBuiltinNode { protected static long HASH_UNSET = -1; @Specialization(guards = {"self.getHash() != HASH_UNSET"}) @@ -612,8 +522,8 @@ public abstract static class GetNewargsNode extends PythonUnaryBuiltinNode { static PTuple doIt(Object self, @Bind("this") Node inliningTarget, @Cached GetTupleStorage getTupleStorage, - @Cached PythonObjectFactory factory) { - return factory.createTuple(new Object[]{factory.createTuple(getTupleStorage.execute(inliningTarget, self))}); + @Bind PythonLanguage language) { + return PFactory.createTuple(language, new Object[]{PFactory.createTuple(language, getTupleStorage.execute(inliningTarget, self))}); } } @@ -622,8 +532,8 @@ static PTuple doIt(Object self, public abstract static class ClassGetItemNode extends PythonBinaryBuiltinNode { @Specialization static Object classGetItem(Object cls, Object key, - @Cached PythonObjectFactory factory) { - return factory.createGenericAlias(cls, key); + @Bind PythonLanguage language) { + return PFactory.createGenericAlias(language, cls, key); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/TupleGetterBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/TupleGetterBuiltins.java index 33d8405fc1..6a57486201 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/TupleGetterBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/TupleGetterBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,6 +40,7 @@ */ package com.oracle.graal.python.builtins.objects.tuple; +import static com.oracle.graal.python.nodes.BuiltinNames.J_TUPLE_GETTER; import static com.oracle.graal.python.nodes.ErrorMessages.CANT_DELETE_ATTRIBUTE; import static com.oracle.graal.python.nodes.ErrorMessages.CANT_SET_ATTRIBUTE; import static com.oracle.graal.python.nodes.ErrorMessages.DESC_FOR_INDEX_S_FOR_S_DOESNT_APPLY_TO_P; @@ -49,13 +50,17 @@ import java.util.List; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; +import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.tuple.TupleGetterBuiltinsClinicProviders.TupleGetterNodeClinicProviderGen; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.DescrGetBuiltinNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrSet.DescrSetBuiltinNode; @@ -64,9 +69,11 @@ import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; @@ -87,6 +94,23 @@ protected List> getNodeFa return TupleGetterBuiltinsFactory.getFactories(); } + @Slot(value = SlotKind.tp_new, isComplex = true) + @SlotSignature(name = J_TUPLE_GETTER, parameterNames = {"cls", "index", "doc"}) + @ArgumentClinic(name = "index", conversion = ArgumentClinic.ClinicConversion.Index) + @GenerateNodeFactory + public abstract static class TupleGetterNode extends PythonTernaryClinicBuiltinNode { + @Override + protected ArgumentClinicProvider getArgumentClinic() { + return TupleGetterNodeClinicProviderGen.INSTANCE; + } + + @Specialization + Object construct(@SuppressWarnings("unused") Object cls, int index, Object doc, + @Bind PythonLanguage language) { + return PFactory.createTupleGetter(language, index, doc); + } + } + @Builtin(name = J___REDUCE__, minNumOfPositionalArgs = 1) @GenerateNodeFactory public abstract static class ReduceNode extends PythonUnaryBuiltinNode { @@ -94,9 +118,9 @@ public abstract static class ReduceNode extends PythonUnaryBuiltinNode { static Object reduce(PTupleGetter self, @Bind("this") Node inliningTarget, @Cached GetClassNode getClassNode, - @Cached PythonObjectFactory factory) { - PTuple args = factory.createTuple(new Object[]{self.getIndex(), self.getDoc()}); - return factory.createTuple(new Object[]{getClassNode.execute(inliningTarget, self), args}); + @Bind PythonLanguage language) { + PTuple args = PFactory.createTuple(language, new Object[]{self.getIndex(), self.getDoc()}); + return PFactory.createTuple(language, new Object[]{getClassNode.execute(inliningTarget, self), args}); } } @@ -108,10 +132,10 @@ static Object getTuple(VirtualFrame frame, PTupleGetter self, PTuple instance, @ @Bind("this") Node inliningTarget, @Cached PyObjectSizeNode sizeNode, @Cached TupleBuiltins.GetItemNode getItemNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { final int index = self.getIndex(); if (index >= sizeNode.execute(frame, inliningTarget, instance)) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.IndexError, TUPLE_OUT_OF_BOUNDS); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.IndexError, TUPLE_OUT_OF_BOUNDS); } return getItemNode.execute(frame, instance, index); } @@ -124,9 +148,9 @@ static Object getNone(@SuppressWarnings("unused") VirtualFrame frame, PTupleGett @Fallback @InliningCutoff static Object getOthers(@SuppressWarnings("unused") VirtualFrame frame, Object self, Object instance, @SuppressWarnings("unused") Object owner, - @Cached PRaiseNode raiseNode) { + @Bind("this") Node inliningTarget) { final int index = ((PTupleGetter) self).getIndex(); - throw raiseNode.raise(PythonBuiltinClassType.TypeError, DESC_FOR_INDEX_S_FOR_S_DOESNT_APPLY_TO_P, + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, DESC_FOR_INDEX_S_FOR_S_DOESNT_APPLY_TO_P, index, "tuple subclasses", instance); } } @@ -139,9 +163,9 @@ abstract static class DescrSet extends DescrSetBuiltinNode { @SuppressWarnings("unused") void set(PTupleGetter self, Object instance, Object value) { if (PGuards.isNoValue(value)) { - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.AttributeError, CANT_DELETE_ATTRIBUTE); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.AttributeError, CANT_DELETE_ATTRIBUTE); } else { - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.AttributeError, CANT_SET_ATTRIBUTE); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.AttributeError, CANT_SET_ATTRIBUTE); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/MethodsFlags.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/MethodsFlags.java deleted file mode 100644 index a4fc7a63ff..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/MethodsFlags.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.type; - -import com.oracle.graal.python.annotations.CApiConstants; - -/** - * This class is a simple representation of methods slots occupation of `cls->tp_as_number`, - * `cls->tp_as_sequence` and `cls->tp_as_mapping`. Builtins types are populated manually and then - * assigned in {@link com.oracle.graal.python.builtins.PythonBuiltinClassType}. While other heap - * types are set during type initalization in {@link SpecialMethodSlot}. - * - * Use {@link com.oracle.graal.python.lib.GetMethodsFlagsNode} to retrieve slots occupation of a - * given class. - */ -@CApiConstants -public abstract class MethodsFlags { - - // PyNumberMethods - - /* - * Number implementations must check *both* arguments for proper type and implement the - * necessary conversions in the slot functions themselves. - */ - - public static final long NB_SUBTRACT = 1L << 1; - public static final long NB_MULTIPLY = 1L << 2; - public static final long NB_REMAINDER = 1L << 3; - public static final long NB_DIVMOD = 1L << 4; - public static final long NB_POWER = 1L << 5; - public static final long NB_NEGATIVE = 1L << 6; - public static final long NB_POSITIVE = 1L << 7; - public static final long NB_ABSOLUTE = 1L << 8; - public static final long NB_BOOL = 1L << 9; - public static final long NB_INVERT = 1L << 10; - public static final long NB_LSHIFT = 1L << 11; - public static final long NB_RSHIFT = 1L << 12; - public static final long NB_AND = 1L << 13; - public static final long NB_XOR = 1L << 14; - public static final long NB_OR = 1L << 15; - public static final long NB_INT = 1L << 16; - public static final long NB_FLOAT = 1L << 18; - public static final long NB_INPLACE_ADD = 1L << 19; - public static final long NB_INPLACE_SUBTRACT = 1L << 20; - public static final long NB_INPLACE_MULTIPLY = 1L << 21; - public static final long NB_INPLACE_REMAINDER = 1L << 22; - public static final long NB_INPLACE_POWER = 1L << 23; - public static final long NB_INPLACE_LSHIFT = 1L << 24; - public static final long NB_INPLACE_RSHIFT = 1L << 25; - public static final long NB_INPLACE_AND = 1L << 26; - public static final long NB_INPLACE_XOR = 1L << 27; - public static final long NB_INPLACE_OR = 1L << 28; - public static final long NB_FLOOR_DIVIDE = 1L << 29; - public static final long NB_TRUE_DIVIDE = 1L << 30; - public static final long NB_INPLACE_FLOOR_DIVIDE = 1L << 31; - public static final long NB_INPLACE_TRUE_DIVIDE = 1L << 32; - public static final long NB_INDEX = 1L << 33; - public static final long NB_MATRIX_MULTIPLY = 1L << 34; - public static final long NB_INPLACE_MATRIX_MULTIPLY = 1L << 35; - - // this is helpful to determine if the binop slot is of a heaptype. - public static final long SLOT1BINFULL = 1L << 39; - - private static final long SLOT1BINFULL_METHODS = SLOT1BINFULL | NB_SUBTRACT | NB_POWER | NB_FLOOR_DIVIDE | - NB_TRUE_DIVIDE | NB_LSHIFT | NB_RSHIFT | NB_AND | NB_XOR | NB_OR | NB_MULTIPLY | NB_REMAINDER | - NB_DIVMOD | NB_MATRIX_MULTIPLY; - - // PySequenceMethods - - public static final long SQ_LENGTH = 1L << 40; - public static final long SQ_REPEAT = 1L << 42; - public static final long SQ_ITEM = 1L << 43; - public static final long SQ_ASS_ITEM = 1L << 45; - public static final long SQ_CONTAINS = 1L << 47; - public static final long SQ_INPLACE_CONCAT = 1L << 48; - public static final long SQ_INPLACE_REPEAT = 1L << 49; - - // PyMappingMethods - - public static final long MP_LENGTH = 1L << 50; - public static final long MP_SUBSCRIPT = 1L << 51; - public static final long MP_ASS_SUBSCRIPT = 1L << 52; - - public static final long AM_AWAIT = 1L << 54; - public static final long AM_AITER = 1L << 55; - public static final long AM_ANEXT = 1L << 56; - public static final long AM_SEND = 1L << 57; - - public static final long ASYNC_METHODS = AM_AWAIT | AM_AITER | AM_ANEXT | AM_SEND; - public static final long SEQUENCE_METHODS = SQ_LENGTH | SQ_ITEM | SQ_ASS_ITEM | SQ_INPLACE_CONCAT | SQ_INPLACE_REPEAT | SQ_REPEAT | SQ_CONTAINS; - public static final long MAPPING_METHODS = MP_LENGTH | MP_SUBSCRIPT | MP_ASS_SUBSCRIPT; - - // builtins methods flags - - public static final long DEFAULT_M_FLAGS = 0; - - public static final long TYPE_M_FLAGS = NB_OR; - - public static final long NONE_M_FLAGS = NB_BOOL; - public static final long INT_M_FLAGS = NB_SUBTRACT | NB_MULTIPLY | NB_REMAINDER | NB_DIVMOD | - NB_POWER | NB_NEGATIVE | NB_POSITIVE | NB_ABSOLUTE | NB_BOOL | NB_INVERT | NB_LSHIFT | - NB_RSHIFT | NB_AND | NB_XOR | NB_OR | NB_INT | NB_FLOAT | - NB_FLOOR_DIVIDE | NB_TRUE_DIVIDE | NB_INDEX; - public static final long BOOLEAN_M_FLAGS = INT_M_FLAGS /* base */ | NB_AND | NB_XOR | NB_OR; - public static final long FLOAT_M_FLAGS = NB_SUBTRACT | NB_MULTIPLY | NB_REMAINDER | NB_DIVMOD | - NB_POWER | NB_NEGATIVE | NB_POSITIVE | NB_ABSOLUTE | NB_BOOL | NB_INT | NB_FLOAT | - NB_FLOOR_DIVIDE | NB_TRUE_DIVIDE; - public static final long BYTE_ARRAY_M_FLAGS = NB_REMAINDER | SQ_LENGTH | SQ_REPEAT | - SQ_ITEM | SQ_ASS_ITEM | SQ_CONTAINS | SQ_INPLACE_CONCAT | SQ_INPLACE_REPEAT | MP_LENGTH | - MP_SUBSCRIPT | MP_ASS_SUBSCRIPT; - public static final long BYTES_M_FLAGS = NB_REMAINDER | SQ_LENGTH | SQ_REPEAT | SQ_ITEM | - SQ_CONTAINS | MP_LENGTH | MP_SUBSCRIPT; - public static final long COMPLEX_M_FLAGS = NB_SUBTRACT | NB_MULTIPLY | NB_POWER | NB_NEGATIVE | - NB_POSITIVE | NB_ABSOLUTE | NB_BOOL | NB_TRUE_DIVIDE; - public static final long DICT_M_FLAGS = NB_OR | NB_INPLACE_OR | SQ_CONTAINS | MP_LENGTH | MP_SUBSCRIPT | - MP_ASS_SUBSCRIPT; - public static final long DICTVALUESVIEW_M_FLAGS = SQ_LENGTH; - public static final long DICTKEYSVIEW_M_FLAGS = NB_SUBTRACT | NB_AND | NB_XOR | NB_OR | SQ_LENGTH | - SQ_CONTAINS; - - public static final long DICTITEMSVIEW_M_FLAGS = NB_SUBTRACT | NB_AND | NB_XOR | NB_OR | SQ_LENGTH | - SQ_CONTAINS; - public static final long LIST_M_FLAGS = SQ_LENGTH | SQ_REPEAT | SQ_ITEM | SQ_ASS_ITEM | SQ_CONTAINS | - SQ_INPLACE_CONCAT | SQ_INPLACE_REPEAT | MP_LENGTH | MP_SUBSCRIPT | MP_ASS_SUBSCRIPT; - public static final long TUPLE_M_FLAGS = SQ_LENGTH | SQ_REPEAT | SQ_ITEM | SQ_CONTAINS | - MP_LENGTH | MP_SUBSCRIPT; - public static final long MEMORYVIEW_M_FLAGS = SQ_LENGTH | SQ_ITEM | MP_LENGTH | MP_SUBSCRIPT | - MP_ASS_SUBSCRIPT; - public static final long RANGE_M_FLAGS = NB_BOOL | SQ_LENGTH | SQ_ITEM | SQ_CONTAINS | MP_LENGTH | - MP_SUBSCRIPT; - public static final long FROZENSET_M_FLAGS = NB_SUBTRACT | NB_AND | NB_XOR | NB_OR | SQ_LENGTH | - SQ_CONTAINS; - public static final long SET_M_FLAGS = NB_SUBTRACT | NB_AND | NB_XOR | NB_OR | - NB_INPLACE_SUBTRACT | NB_INPLACE_AND | NB_INPLACE_XOR | NB_INPLACE_OR | SQ_LENGTH | SQ_CONTAINS; - public static final long STRING_M_FLAGS = NB_REMAINDER | SQ_LENGTH | SQ_REPEAT | SQ_ITEM | - SQ_CONTAINS | MP_LENGTH | MP_SUBSCRIPT; - - public static final long DEFAULTDICT_M_FLAGS = NB_OR | DICT_M_FLAGS; - public static final long DEQUE_M_FLAGS = SQ_LENGTH | SQ_REPEAT | - SQ_ITEM | SQ_ASS_ITEM | SQ_CONTAINS | SQ_INPLACE_CONCAT | SQ_INPLACE_REPEAT; - - public static final long MAPPINGPROXY_M_FLAGS = NB_OR | NB_INPLACE_OR | SQ_CONTAINS | MP_LENGTH | MP_SUBSCRIPT; - public static final long ARRAY_M_FLAGS = SQ_LENGTH | SQ_REPEAT | SQ_ITEM | SQ_ASS_ITEM | - SQ_CONTAINS | SQ_INPLACE_CONCAT | SQ_INPLACE_REPEAT | MP_LENGTH | MP_SUBSCRIPT | MP_ASS_SUBSCRIPT; - public static final long MMAP_M_FLAGS = SQ_LENGTH | SQ_ITEM | SQ_ASS_ITEM | - MP_LENGTH | MP_SUBSCRIPT | MP_ASS_SUBSCRIPT; - - public static final long GENERIC_ALIAS_M_FLAGS = NB_OR | MP_SUBSCRIPT; - public static final long UNION_TYPE_M_FLAGS = NB_OR | MP_SUBSCRIPT; - - public static final long CONTEXT_M_FLAGS = SQ_CONTAINS | MP_LENGTH | MP_SUBSCRIPT; - - public static final long GENERATOR_M_FLAGS = AM_SEND; - public static final long COROUTINE_M_FLAGS = AM_AWAIT | AM_SEND; - public static final long ASYNC_GENERATOR_M_FLAGS = AM_AITER | AM_ANEXT | AM_SEND; - public static final long ASYNC_GENERATOR_ASEND_M_FLAGS = AM_AWAIT; - public static final long ASYNC_GENERATOR_ATHROW_M_FLAGS = AM_AWAIT; - - // _ctypes - public static final long PYCFUNCPTRTYPE_M_FLAGS = SQ_REPEAT | TYPE_M_FLAGS; - public static final long PYCARRAY_M_FLAGS = SQ_LENGTH | SQ_ITEM | SQ_ASS_ITEM | MP_LENGTH | MP_SUBSCRIPT | - MP_ASS_SUBSCRIPT; - public static final long PYCARRAYTYPE_M_FLAGS = SQ_REPEAT | TYPE_M_FLAGS; - public static final long PYCFUNCPTR_M_FLAGS = NB_BOOL; - public static final long PYCPOINTER_M_FLAGS = NB_BOOL | SQ_ITEM | SQ_ASS_ITEM | MP_SUBSCRIPT; - public static final long PYCPOINTERTYPE_M_FLAGS = SQ_REPEAT | TYPE_M_FLAGS; - public static final long PYCSIMPLETYPE_M_FLAGS = SQ_REPEAT | TYPE_M_FLAGS; - public static final long PYCSTRUCTTYPE_M_FLAGS = SQ_REPEAT | TYPE_M_FLAGS; - public static final long SIMPLECDATA_M_FLAGS = NB_BOOL; - public static final long UNIONTYPE_M_FLAGS = SQ_REPEAT | TYPE_M_FLAGS; - - public static final long FOREIGNOBJECT_M_FLAGS = NB_BOOL | SQ_LENGTH | MP_LENGTH | NB_MULTIPLY | - NB_SUBTRACT | NB_DIVMOD | NB_FLOOR_DIVIDE | NB_TRUE_DIVIDE | NB_AND | NB_XOR | NB_OR | NB_INDEX | - SQ_CONTAINS | MP_SUBSCRIPT | MP_ASS_SUBSCRIPT; - -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonAbstractClass.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonAbstractClass.java index 5566234976..9c4612eb40 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonAbstractClass.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonAbstractClass.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,6 +45,8 @@ public interface PythonAbstractClass extends TruffleObject { + public static final PythonAbstractClass[] EMPTY_ARRAY = {}; + void lookupChanged(); static boolean isInstance(Object object) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonBuiltinClass.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonBuiltinClass.java index fc3fa13658..7e8ba5d0e3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonBuiltinClass.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonBuiltinClass.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -31,6 +31,7 @@ import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; +import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; @@ -69,7 +70,6 @@ public PythonBuiltinClass(PythonLanguage lang, PythonBuiltinClassType builtinCla super(lang, builtinClass.getType(), builtinClass.getType().getInstanceShape(lang), builtinClass.getInstanceShape(lang), builtinClass.getName(), base, new PythonAbstractClass[]{base}, builtinClass.getSlots()); this.type = builtinClass; - this.methodsFlags = type.getMethodsFlags(); } @Override @@ -78,7 +78,7 @@ public void setAttribute(TruffleString name, Object value) { if (!PythonContext.get(null).isCoreInitialized()) { setAttributeUnsafe(name, value); } else { - throw PRaiseNode.raiseUncached(null, TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_R_OF_IMMUTABLE_TYPE_N, PyObjectReprAsTruffleStringNode.executeUncached(name), this); + throw PRaiseNode.raiseStatic(null, TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_R_OF_IMMUTABLE_TYPE_N, PyObjectReprAsTruffleStringNode.executeUncached(name), this); } } @@ -89,7 +89,7 @@ public void setAttributeUnsafe(TruffleString name, Object value) { super.setAttribute(name, value); } - public final PythonBuiltinClassType getType() { + public PythonBuiltinClassType getType() { return type; } @@ -101,10 +101,6 @@ public void onAttributeUpdate(TruffleString key, Object newValue) { // builtins. So there should be no assumptions to invalidate yet assert !getMethodResolutionOrder().invalidateAttributeInMROFinalAssumptions(key); assert checkSpecialMethodUpdate(key, newValue); - SpecialMethodSlot slot = SpecialMethodSlot.findSpecialSlotUncached(key); - if (slot != null) { - SpecialMethodSlot.fixupSpecialMethodSlot(this, slot, newValue); - } // NO_VALUE changes MRO lookup results without actually changing any Shapes in the MRO, this // can prevent some optimizations, so it is best to avoid any code that triggers such code // paths during initialization @@ -117,7 +113,7 @@ private static boolean checkSpecialMethodUpdate(TruffleString key, Object newVal // only with PythonBuiltinClassType#slots // TODO: change to the commented out line below once all @Builtin are converted to @Slot // assert ... || (newValue instanceof PBuiltinFunction pbf && pbf.getSlot() != null); - assert !TpSlots.isSpecialMethod(key) || (newValue instanceof PBuiltinFunction pbf); + assert !TpSlots.isSpecialMethod(key) || newValue instanceof PBuiltinFunction || newValue instanceof PBuiltinMethod; return true; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonClass.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonClass.java index b8db247479..12e0b93c84 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonClass.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonClass.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -32,8 +32,6 @@ import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyTypeExtra; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetSubclassesAsArrayNode; import com.oracle.graal.python.nodes.HiddenAttr; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromPythonObjectNode; @@ -71,8 +69,6 @@ public final class PythonClass extends PythonManagedClass { private static final int MRO_SUBTYPES_MAX = 64; private static final int MRO_SHAPE_INVALIDATIONS_MAX = 5; - public HPyTypeExtra hPyTypeExtra; - private final AtomicReference slotsFinalAssumption = new AtomicReference<>(); private MroShape mroShape; // only set if there's no inheritance from native types /** @@ -382,59 +378,4 @@ static void updateMroShapeSubTypes(PythonBuiltinClass klass) { } } } - - public long getBasicSize() { - return hPyTypeExtra != null ? hPyTypeExtra.basicSize : -1; - } - - public long getItemSize() { - return hPyTypeExtra != null ? hPyTypeExtra.itemSize : -1; - } - - public Object getHPyDestroyFunc() { - if (hPyTypeExtra != null) { - return hPyTypeExtra.hpyDestroyFunc; - } - return null; - } - - public Object getTpName() { - return hPyTypeExtra != null ? hPyTypeExtra.tpName : null; - } - - public long getFlags() { - return hPyTypeExtra != null ? hPyTypeExtra.flags : 0; - } - - public int getBuiltinShape() { - return hPyTypeExtra != null ? hPyTypeExtra.builtinShape : GraalHPyDef.HPyType_BUILTIN_SHAPE_LEGACY; - } - - public Object getHPyDefaultCallFunc() { - return hPyTypeExtra != null ? hPyTypeExtra.defaultCallFunc : null; - } - - public long getHPyVectorcallOffset() { - return hPyTypeExtra != null ? hPyTypeExtra.vectorcallOffset : Long.MIN_VALUE; - } - - public void setHPyDestroyFunc(Object destroyFunc) { - hPyTypeExtra.hpyDestroyFunc = destroyFunc; - } - - public void setHPyDefaultCallFunc(Object defaultCallFunc) { - hPyTypeExtra.defaultCallFunc = defaultCallFunc; - } - - public void setHPyVectorcallOffset(int vectorcallOffset) { - hPyTypeExtra.vectorcallOffset = vectorcallOffset; - } - - public void setHPyTypeExtra(HPyTypeExtra hpyTypeExtra) { - this.hPyTypeExtra = hpyTypeExtra; - } - - public boolean isHPyType() { - return hPyTypeExtra != null; - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonManagedClass.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonManagedClass.java index ddf02c227a..504dbe24ab 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonManagedClass.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonManagedClass.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -45,13 +45,12 @@ import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.MroSequenceStorage; -import com.oracle.truffle.api.Assumption; import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.object.Shape; import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.strings.TruffleString.CodePointAtIndexNode; @@ -72,17 +71,8 @@ public abstract class PythonManagedClass extends PythonObject implements PythonA private TruffleString qualName; private int indexedSlotCount; - /** - * Access using methods in {@link SpecialMethodSlot}. - * - * @see SpecialMethodSlot - */ - Object[] specialMethodSlots; - protected TpSlots tpSlots; - @CompilationFinal protected long methodsFlags = 0L; - /** {@code true} if the MRO contains a native class. */ private final boolean needsNativeAllocation; @CompilationFinal private boolean mroInitialized = false; @@ -113,7 +103,8 @@ protected PythonManagedClass(PythonLanguage lang, Object typeClass, Shape classS unsafeSetSuperClass(baseClasses); } - this.setMRO(ComputeMroNode.doSlowPath(this, invokeMro)); + // TODO should pass node for exception location + this.setMRO(ComputeMroNode.doSlowPath(null, this, invokeMro)); if (invokeMro) { mroInitialized = true; } @@ -131,7 +122,7 @@ protected PythonManagedClass(PythonLanguage lang, Object typeClass, Shape classS this.instanceShape = lang.getShapeForClass(this); } - this.subClasses = PythonObjectFactory.getUncached().createDict(); + this.subClasses = PFactory.createDict(lang); } public boolean isMROInitialized() { @@ -142,18 +133,14 @@ public boolean isMROInitialized() { * Invoke metaclass mro() method and set the result as new method resolution order. */ @TruffleBoundary - public void invokeMro() { - PythonAbstractClass[] mro = ComputeMroNode.invokeMro(this); + public void invokeMro(Node node) { + PythonAbstractClass[] mro = ComputeMroNode.invokeMro(node, this); if (mro != null) { this.setMRO(mro); } mroInitialized = true; } - public Assumption getLookupStableAssumption() { - return methodResolutionOrder.getLookupStableAssumption(); - } - /** * This method needs to be called if the mro changes. (currently not used) */ @@ -242,15 +229,7 @@ public void setAttribute(TruffleString key, Object value) { public boolean canSkipOnAttributeUpdate(TruffleString key, @SuppressWarnings("unused") Object value, TruffleString.CodePointLengthNode codePointLengthNode, TruffleString.CodePointAtIndexNode codePointAtIndexNode) { return !methodResolutionOrder.hasAttributeInMROFinalAssumptions() && - !SpecialMethodSlot.canBeSpecial(key, codePointLengthNode, codePointAtIndexNode); - } - - public final void onAttributeUpdate(Object key, Object value) { - // In compilation: use a profile and call the String key overload - CompilerAsserts.neverPartOfCompilation(); - if (key instanceof TruffleString) { - onAttributeUpdate((TruffleString) key, value); - } + !TpSlots.canBeSpecialMethod(key, codePointLengthNode, codePointAtIndexNode); } @TruffleBoundary @@ -262,24 +241,9 @@ public void onAttributeUpdate(TruffleString key, Object value) { // not initialized yet TpSlots.updateSlot(this, key); } - // TODO: will be removed: - SpecialMethodSlot slot = SpecialMethodSlot.findSpecialSlotUncached(key); - if (slot != null) { - SpecialMethodSlot.fixupSpecialMethodSlot(this, slot, value); - } } } - @TruffleBoundary - public void setMethodsFlags(long flag) { - assert CompilerDirectives.inInterpreter(); - methodsFlags |= flag; - } - - public long getMethodsFlags() { - return methodsFlags; - } - /** * This method supports initialization and solves boot-order problems and should not normally be * used. @@ -294,7 +258,8 @@ private void unsafeSetSuperClass(PythonAbstractClass... newBaseClasses) { for (PythonAbstractClass base : getBaseClasses()) { if (base instanceof PythonManagedClass && !((PythonManagedClass) base).mroInitialized) { - throw PRaiseNode.getUncached().raise(TypeError, ErrorMessages.CANNOT_EXTEND_INCOMPLETE_P, base); + // TODO should pass node for exception location + throw PRaiseNode.raiseStatic(null, TypeError, ErrorMessages.CANNOT_EXTEND_INCOMPLETE_P, base); } } for (PythonAbstractClass base : getBaseClasses()) { @@ -309,7 +274,7 @@ private void unsafeSetSuperClass(PythonAbstractClass... newBaseClasses) { } @TruffleBoundary - public final void setBases(Object newBaseClass, PythonAbstractClass[] newBaseClasses) { + public final void setBases(Node node, Object newBaseClass, PythonAbstractClass[] newBaseClasses) { Object oldBase = getBase(); PythonAbstractClass[] oldBaseClasses = getBaseClasses(); PythonAbstractClass[] oldMRO = this.methodResolutionOrder.getInternalClassArray(); @@ -328,12 +293,12 @@ public final void setBases(Object newBaseClass, PythonAbstractClass[] newBaseCla this.base = newBaseClass; this.baseClasses = newBaseClasses; this.methodResolutionOrder.lookupChanged(); - this.setMRO(ComputeMroNode.doSlowPath(this)); + this.setMRO(ComputeMroNode.doSlowPath(node, this)); for (PythonAbstractClass scls : subclassesArray) { if (scls instanceof PythonManagedClass pmc) { pmc.methodResolutionOrder.lookupChanged(); - pmc.setMRO(ComputeMroNode.doSlowPath(scls)); + pmc.setMRO(ComputeMroNode.doSlowPath(node, scls)); } } } catch (PException pe) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/SpecialMethodSlot.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/SpecialMethodSlot.java deleted file mode 100644 index 6b3089a4e3..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/SpecialMethodSlot.java +++ /dev/null @@ -1,1264 +0,0 @@ -/* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.builtins.objects.type; - -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.AM_AITER; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.AM_ANEXT; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.AM_AWAIT; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.MP_ASS_SUBSCRIPT; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_AND; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_DIVMOD; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_FLOAT; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_FLOOR_DIVIDE; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_INDEX; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_INPLACE_ADD; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_INPLACE_MULTIPLY; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_INT; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_LSHIFT; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_MATRIX_MULTIPLY; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_OR; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_POWER; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_REMAINDER; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_RSHIFT; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_SUBTRACT; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_TRUE_DIVIDE; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_XOR; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.SQ_ASS_ITEM; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.SQ_CONTAINS; -import static com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot.Flags.NO_BUILTIN_DESCRIPTORS; -import static com.oracle.graal.python.nodes.HiddenAttr.METHODS_FLAGS; -import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DICT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___AENTER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___AEXIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___AITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___AND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ANEXT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___AWAIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___BYTES__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___CALL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___CONTAINS__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DELATTR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DELITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DIVMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ENTER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___EQ__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___EXIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FLOAT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FLOORDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FORMAT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___HASH__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IADD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INDEX__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INIT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INSTANCECHECK__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ITER__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LENGTH_HINT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MATMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MISSING__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEXT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NE__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___OR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___POW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RAND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RDIVMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REPR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REVERSED__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RFLOORDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RLSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RMATMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ROR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ROUND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RPOW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RRSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RSUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RTRUEDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RXOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETITEM__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SET_NAME__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___STR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SUBCLASSCHECK__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___TRUEDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___XOR__; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; -import static com.oracle.graal.python.util.PythonUtils.tsLiteral; - -import java.util.ArrayDeque; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Objects; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; -import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass; -import com.oracle.graal.python.builtins.objects.common.HashingStorage; -import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetItem; -import com.oracle.graal.python.builtins.objects.dict.PDict; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor; -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetBaseClassNode; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetMroStorageNode; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetSubclassesAsArrayNode; -import com.oracle.graal.python.lib.GetMethodsFlagsNodeGen; -import com.oracle.graal.python.nodes.HiddenAttr; -import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; -import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; -import com.oracle.graal.python.nodes.attributes.ReadAttributeFromPythonObjectNode; -import com.oracle.graal.python.nodes.object.GetDictIfExistsNode; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.sequence.storage.MroSequenceStorage; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Idempotent; -import com.oracle.truffle.api.dsl.NodeFactory; -import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.api.utilities.CyclicAssumption; - -/** - * Subset of special methods that is cached in {@link PythonManagedClass} and - * {@link PythonBuiltinClassType}. - * - * For {@link PythonManagedClass}, we cache the result of special method lookup in a context - * specific form: exactly the context specific object that regular MRO lookup would give. For - * {@link PythonBuiltinClassType}, we cache only primitive and other context independent values and - * additionally instances of {@link BuiltinMethodDescriptor}, which wrap context independent - * information about the method that would be the result of the lookup. This information is further - * split to language independent (per VM) part, which is the node factory, and per language part, - * which is the call target. Call targets are cached in an array in the {@link PythonLanguage} - * instance, and {@link BuiltinMethodDescriptor} holds only index into that array. - * - * The state of the special methods cache in {@link PythonManagedClass} should mostly reflect what - * would be "cached" in the corresponding special slots in CPython. CPython updates the slots in - * {@code type.__setattr__}, we do the same and additionally also in - * {@link com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode}, which is used - * directly from some places bypassing {@code type.__setattr__}. - * - * The cache in {@link PythonBuiltinClassType} may contain {@code null} entries, which indicate that - * given slot cannot be cached in a context independent way. In such case, one needs to resolve to - * {@link PythonBuiltinClass} and lookup the slot there. - * - * The cache makes an assumption that builtin types do not change after GraalPython is fully - * initialized. - */ -public enum SpecialMethodSlot { - DelAttr(T___DELATTR__), - - Dict(T___DICT__), - - Iter(T___ITER__), - Next(T___NEXT__), - Await(T___AWAIT__, AM_AWAIT), - - AEnter(T___AENTER__), - AExit(T___AEXIT__), - - AIter(T___AITER__, AM_AITER), - ANext(T___ANEXT__, AM_ANEXT), - - New(T___NEW__, NO_BUILTIN_DESCRIPTORS), - Init(T___INIT__, NO_BUILTIN_DESCRIPTORS), - SetName(T___SET_NAME__, NO_BUILTIN_DESCRIPTORS), - InstanceCheck(T___INSTANCECHECK__), - Subclasscheck(T___SUBCLASSCHECK__), - Call(T___CALL__, NO_BUILTIN_DESCRIPTORS), - - SetItem(T___SETITEM__, SQ_ASS_ITEM | MP_ASS_SUBSCRIPT), - DelItem(T___DELITEM__, SQ_ASS_ITEM | MP_ASS_SUBSCRIPT), - - Exit(T___EXIT__), - Enter(T___ENTER__), - - LengthHint(T___LENGTH_HINT__), - Contains(T___CONTAINS__, SQ_CONTAINS), - Hash(T___HASH__), - Index(T___INDEX__, NB_INDEX), - Float(T___FLOAT__, NB_FLOAT), - Int(T___INT__, NB_INT), - Str(T___STR__), - Repr(T___REPR__), - // Note: __format__ does not seem to be actual slot in CPython, but it is looked up frequently - Format(T___FORMAT__), - Missing(T___MISSING__), - - Eq(T___EQ__), - Ne(T___NE__), - Lt(T___LT__), - Le(T___LE__), - Gt(T___GT__), - Ge(T___GE__), - - And(T___AND__, NB_AND), - RAnd(T___RAND__, NB_AND), - Or(T___OR__, NB_OR), - ROr(T___ROR__, NB_OR), - Xor(T___XOR__, NB_XOR), - RXor(T___RXOR__, NB_XOR), - // Don't add SQ_CONCAT, CPython doesn't add a wrapper for it - Sub(T___SUB__, NB_SUBTRACT), - RSub(T___RSUB__, NB_SUBTRACT), - // Don't add SQ_REPEAT, CPython doesn't add a wrapper for it - MatMul(T___MATMUL__, NB_MATRIX_MULTIPLY), - RMatMul(T___RMATMUL__, NB_MATRIX_MULTIPLY), - Mod(T___MOD__, NB_REMAINDER), - RMod(T___RMOD__, NB_REMAINDER), - DivMod(T___DIVMOD__, NB_DIVMOD), - RDivMod(T___RDIVMOD__, NB_DIVMOD), - Pow(T___POW__, NB_POWER), - RPow(T___RPOW__, NB_POWER), - TrueDiv(T___TRUEDIV__, NB_TRUE_DIVIDE), - RTrueDiv(T___RTRUEDIV__, NB_TRUE_DIVIDE), - FloorDiv(T___FLOORDIV__, NB_FLOOR_DIVIDE), - RFloorDiv(T___RFLOORDIV__, NB_FLOOR_DIVIDE), - LShift(T___LSHIFT__, NB_LSHIFT), - RLShift(T___RLSHIFT__, NB_LSHIFT), - RShift(T___RSHIFT__, NB_RSHIFT), - RRShift(T___RRSHIFT__, NB_RSHIFT), - Round(T___ROUND__), - - IAdd(T___IADD__, NB_INPLACE_ADD), - IMul(T___IMUL__, NB_INPLACE_MULTIPLY), - - Reversed(T___REVERSED__), - Bytes(T___BYTES__); - - static class Flags { - static final boolean NO_BUILTIN_DESCRIPTORS = false; - } - - public static final SpecialMethodSlot[] VALUES = values(); - - private final TruffleString name; - @CompilationFinal private SpecialMethodSlot reverse; - /** - * Indicates if given slot may or must not store context independent (AST cacheable) - * {@link BuiltinMethodDescriptor} objects. - * - * Values of some slots are always or mostly passed to call node variants that can handle - * {@link BuiltinMethodDescriptor}. This does not hold most notably for slots that are passed to - * {@link com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode}, like - * {@code __new__}. For those we do not allow storing the {@link BuiltinMethodDescriptor} in the - * slot, so that lookup using that slot always resolves to context dependent runtime object, - * such as {@link PBuiltinFunction}. - * - * An alternative would be to update the whole calling machinery ({@code InvokeNode}, - * {@code GetSignature}, ...) to handle {@link BuiltinMethodDescriptor} and extend - * {@link BuiltinMethodDescriptor} to contain all the information that is necessary for this - * (GR-32148). - */ - private final boolean allowsBuiltinDescriptors; - private final long methodsFlag; - - SpecialMethodSlot(TruffleString name, long methodsFlag, boolean allowsBuiltinDescriptors) { - this.name = name; - this.allowsBuiltinDescriptors = allowsBuiltinDescriptors; - this.methodsFlag = methodsFlag; - } - - SpecialMethodSlot(TruffleString name, boolean allowsBuiltinDescriptors) { - this(name, 0, allowsBuiltinDescriptors); - } - - SpecialMethodSlot(TruffleString name, long methodsFlag) { - this(name, methodsFlag, true); - } - - SpecialMethodSlot(TruffleString name) { - this(name, 0, true); - } - - static { - And.reverse = RAnd; - Or.reverse = ROr; - Sub.reverse = RSub; - DivMod.reverse = RDivMod; - TrueDiv.reverse = RTrueDiv; - FloorDiv.reverse = RFloorDiv; - LShift.reverse = RLShift; - RShift.reverse = RRShift; - Xor.reverse = RXor; - MatMul.reverse = RMatMul; - Pow.reverse = RPow; - Mod.reverse = RMod; - assert checkFind(); - assert checkReverseSlots(); - } - - public TruffleString getName() { - return name; - } - - public SpecialMethodSlot getReverse() { - return reverse; - } - - public long getMethodsFlag() { - return methodsFlag; - } - - public Object getValue(PythonManagedClass klass) { - assert klass.specialMethodSlots != null; - return klass.specialMethodSlots[ordinal()]; - } - - @Idempotent - public Object getValue(PythonBuiltinClassType klassType) { - // should not be called during initialization - return klassType.getSpecialMethodSlots()[ordinal()]; - } - - private void setValue(PythonManagedClass klass, Object value, PythonContext context) { - // For builtin classes, we should see these updates only during initialization - assert !context.isInitialized() || !(klass instanceof PythonBuiltinClass) || - ((PythonBuiltinClass) klass).getType().getSpecialMethodSlots() == null : String.format("%s.%s = %s", klass, getName(), value); - klass.specialMethodSlots[ordinal()] = asSlotValue(this, value, context.getLanguage()); - if (klass instanceof PythonClass) { - ((PythonClass) klass).invalidateSlotsFinalAssumption(); - } - } - - // -------------------------------------------------- - // Initialization of the builtin types/classes: - - /** - * Initialized builtin classes and types right after they were initialized and populated with - * builtin methods, i.e., before calling the Python initialization part. - */ - public static void initializeBuiltinsSpecialMethodSlots(Python3Core core) { - // Initialize the builtin classes (once per context) - for (PythonBuiltinClassType type : PythonBuiltinClassType.VALUES) { - initializeBuiltinClassSpecialMethodSlots(core, core.lookupType(type)); - } - // Initialize the builtin types (once per VM) - initializeBuiltinTypeSlots(core); - } - - private static void initializeBuiltinClassSpecialMethodSlots(Python3Core core, PythonBuiltinClass klass) { - CompilerAsserts.neverPartOfCompilation(); - if (klass.specialMethodSlots != null) { - // Already initialized - return; - } - - // First initialize the base class' slots - PythonBuiltinClassType klassType = klass.getType(); - if (klassType.getBase() != null) { - PythonBuiltinClass base = core.lookupType(klassType.getBase()); - initializeBuiltinClassSpecialMethodSlots(core, base); - Object[] baseSlots = base.specialMethodSlots; - klass.specialMethodSlots = Arrays.copyOf(baseSlots, baseSlots.length); - } else { - Object[] slots = new Object[VALUES.length]; - Arrays.fill(slots, PNone.NO_VALUE); - klass.specialMethodSlots = slots; - } - - ReadAttributeFromObjectNode readNode = ReadAttributeFromObjectNode.getUncachedForceType(); - for (SpecialMethodSlot slot : VALUES) { - Object value = readNode.execute(klass, slot.getName()); - if (value != PNone.NO_VALUE) { - slot.setValue(klass, value, core.getContext()); - } - } - } - - private static final Object builtinSlotsInitializationLock = new Object(); - private static volatile boolean builtinSlotsInitialized; - - public static boolean areBuiltinSlotsInitialized() { - return builtinSlotsInitialized; - } - - /** - * Initialized builtin type according to its respective builtin class. Only context independent - * values are pushed from the class to the type, because types are shared across contexts. This - * initialization should run only once per VM and this method takes care of that. - */ - private static void initializeBuiltinTypeSlots(Python3Core core) { - synchronized (builtinSlotsInitializationLock) { - if (builtinSlotsInitialized) { - return; - } - initializeBuiltinTypeSlotsImpl(core); - builtinSlotsInitialized = true; - } - } - - private static void initializeBuiltinTypeSlotsImpl(Python3Core core) { - for (PythonBuiltinClassType type : PythonBuiltinClassType.VALUES) { - Object[] typeSlots = new Object[VALUES.length]; - PythonBuiltinClass klass = core.lookupType(type); - for (SpecialMethodSlot slot : VALUES) { - if (type.redefinesSlot(slot)) { - continue; - } - Object value = slot.getValue(klass); - if (value instanceof PBuiltinFunction && slot.allowsBuiltinDescriptors) { - BuiltinMethodDescriptor info = BuiltinMethodDescriptor.get((PBuiltinFunction) value); - if (info != null) { - typeSlots[slot.ordinal()] = info; - } - } else if ((value instanceof BuiltinMethodDescriptor && slot.allowsBuiltinDescriptors) || PythonLanguage.canCache(value)) { - typeSlots[slot.ordinal()] = value; - } - } - type.setSpecialMethodSlots(typeSlots); - } - } - - // -------------------------------------------------- - // Initialization and updates of the user classes: - - @TruffleBoundary - public static void reinitializeSpecialMethodSlots(PythonManagedClass klass, PythonLanguage language) { - reinitializeSpecialMethodSlots((Object) klass, language); - } - - @TruffleBoundary - public static void reinitializeSpecialMethodSlots(PythonNativeClass klass, PythonLanguage language) { - reinitializeSpecialMethodSlots((Object) klass, language); - } - - private static void reinitializeSpecialMethodSlots(Object klass, PythonLanguage language) { - PythonAbstractClass[] subClasses; - if (klass instanceof PythonManagedClass managedClass) { - // specialMethodSlots can be null if the type is just being initialized, for example, - // when the initialization calls the "mro" method, which may execute arbitrary code - // including setting its __bases__ to something. - // TODO: LookupAttributeInMRONode and other places rely on specialMethodSlots being - // always initialized, can it happen that some code invoked during type initialization - // is going to lookup something in that type's MRO? - if (managedClass.specialMethodSlots != null) { - managedClass.specialMethodSlots = null; - initializeSpecialMethodSlots(managedClass, GetMroStorageNode.executeUncached(managedClass), language); - } - subClasses = GetSubclassesAsArrayNode.executeUncached(managedClass); - } else if (klass instanceof PythonNativeClass clazz) { - subClasses = GetSubclassesAsArrayNode.executeUncached(clazz); - } else { - throw new AssertionError(Objects.toString(klass)); - } - for (PythonAbstractClass subClass : subClasses) { - reinitializeSpecialMethodSlots(subClass, language); - } - } - - public static void initializeSpecialMethodSlots(PythonManagedClass klass, MroSequenceStorage mro, PythonLanguage language) { - klass.specialMethodSlots = initializeSpecialMethodsSlots(klass, mro, language); - } - - @TruffleBoundary - private static Object[] initializeSpecialMethodsSlots(PythonManagedClass klass, MroSequenceStorage mro, PythonLanguage language) { - // Note: the classes in MRO may not have their special slots initialized, which is - // pathological case that can happen if MRO is fiddled with during MRO computation - - // Fast-path: If MRO(klass) == (A, B, C, ...) and A == klass and MRO(B) == (B, C, ...), then - // we can just "extend" the slots of B with the new overrides in A. This fast-path seem to - // handle large majority of the situations - if (mro.length() >= 2 && klass.getBaseClasses().length <= 1) { - PythonAbstractClass firstType = mro.getPythonClassItemNormalized(0); - PythonAbstractClass secondType = mro.getPythonClassItemNormalized(1); - if (firstType == klass && PythonManagedClass.isInstance(secondType)) { - PythonManagedClass managedBase = PythonManagedClass.cast(secondType); - if (managedBase.specialMethodSlots != null) { - if (isMroSubtype(mro, managedBase)) { - Object[] result = PythonUtils.arrayCopyOf(managedBase.specialMethodSlots, managedBase.specialMethodSlots.length); - setSlotsFromManaged(result, klass, language); - fixupNewSlot(result, klass); - setMethodsFlags(result, klass); - return result; - } - } - } - } - - // Deal with this pathological case - if (mro.length() == 0) { - Object[] slots = new Object[VALUES.length]; - Arrays.fill(slots, PNone.NO_VALUE); - return slots; - } - - // Check the last klass in MRO and use copy its slots for the beginning (if available) - // In most cases this will be `object`, which contains most of the slots - Object[] slots = null; - PythonAbstractClass lastType = mro.getPythonClassItemNormalized(mro.length() - 1); - boolean slotsInitializedFromLast = false; - if (PythonManagedClass.isInstance(lastType)) { - PythonManagedClass lastClass = PythonManagedClass.cast(lastType); - if (lastClass.specialMethodSlots != null) { - slots = PythonUtils.arrayCopyOf(lastClass.specialMethodSlots, lastClass.specialMethodSlots.length); - slotsInitializedFromLast = true; - } - } - if (!slotsInitializedFromLast) { - slots = new Object[VALUES.length]; - Arrays.fill(slots, PNone.NO_VALUE); - } - - // Traverse MRO in reverse order overriding the initial slots values if we find new override - int skip = slotsInitializedFromLast ? 1 : 0; - for (int i = mro.length() - skip - 1; i >= 0; i--) { - PythonAbstractClass base = mro.getPythonClassItemNormalized(i); - if (PythonManagedClass.isInstance(base)) { - setSlotsFromManaged(slots, PythonManagedClass.cast(base), language); - } else { - setSlotsFromGeneric(slots, base, language); - } - } - fixupNewSlot(slots, klass); - setMethodsFlags(slots, klass); - return slots; - } - - private static boolean isMroSubtype(MroSequenceStorage superTypeMro, PythonManagedClass subType) { - if (subType instanceof PythonBuiltinClass && ((PythonBuiltinClass) subType).getType() == PythonBuiltinClassType.PythonObject) { - // object is subclass of everything - return true; - } - MroSequenceStorage subTypeMro = GetMroStorageNode.executeUncached(subType); - boolean isMroSubtype = subTypeMro.length() == superTypeMro.length() - 1; - if (isMroSubtype) { - for (int i = 0; i < subTypeMro.length(); i++) { - if (superTypeMro.getPythonClassItemNormalized(i + 1) != subTypeMro.getPythonClassItemNormalized(i)) { - isMroSubtype = false; - break; - } - } - } - return isMroSubtype; - } - - private static void setMethodsFlag(PythonManagedClass klass, long flag, PythonContext context) { - if (flag == 0) { - return; - } - - long isHeaptype = context.isCoreInitialized() ? MethodsFlags.SLOT1BINFULL : 0L; - klass.setMethodsFlags(flag | isHeaptype); - } - - private static void setMethodsFlag(PythonNativeClass cls, long flag, PythonContext context) { - if (flag == 0) { - return; - } - - long flags = GetMethodsFlagsNodeGen.getUncached().execute(null, cls); - if ((flags & flag) == 0) { - // mq: We should put a wrapped function in the native slot. - CyclicAssumption assumption = context.getNativeClassStableAssumption(cls, false); - if (assumption != null && assumption.getAssumption().isValid()) { - assumption.invalidate("methods flags have changed after class creation"); - } - if (cls instanceof PythonAbstractNativeObject nclass) { - HiddenAttr.WriteNode.executeUncached(nclass, METHODS_FLAGS, flags | flag); - } - } - } - - private static void setMethodsFlags(Object[] slots, PythonManagedClass klass) { - long methodsFlags = 0; - for (SpecialMethodSlot slot : VALUES) { - if (slot.getMethodsFlag() > 0 && slots[slot.ordinal()] != PNone.NO_VALUE) { - methodsFlags |= slot.getMethodsFlag(); - } - } - - if (klass.getInitialPythonClass() instanceof PythonBuiltinClassType builtinClass) { - methodsFlags |= builtinClass.getMethodsFlags(); - } - - setMethodsFlag(klass, methodsFlags, PythonContext.get(null)); - } - - /** - * CPython has a bug in their {@code tp_new} slot inheritance. Packages, notably pandas, rely on - * the bug being present, so we have to try to replicate the same behavior. - *

        - * CPython first inherits {@code tp_new} from the dominant base ({@code tp_base}) and creates a - * {@code __new__} special method for it. Later, they update all slots to match what's in the - * object's special methods, which are looked up in MRO. In case of multiple inheritance, the - * MRO-inherited {@code __new__} may be different from the {@code tp_base}-inherited one. - * Normally, one would expect that the MRO-inherited one wins, as is the case for all other - * slots. See the code in {@code update_one_slot}, it does this: - * - *

        -        ...
        -        void **ptr = slotptr(type, offset);
        -        ...
        -        descr = find_name_in_mro(type, p->name_strobj, &error);
        -        ...
        -        else if (Py_IS_TYPE(descr, &PyCFunction_Type) &&
        -                 PyCFunction_GET_FUNCTION(descr) ==
        -                 (PyCFunction)(void(*)(void))tp_new_wrapper &&
        -                 ptr == (void**)&type->tp_new)
        -        {
        -            specific = (void *)type->tp_new;
        -        }
        -     * 
        - * - * Apparently, they wanted to make an optimization that avoids using the wrapper if the wrapper - * was for the same {@code tp_new} as was inherited from {@code tp_base}. But they only check - * that it's a wrapper, but they forgot to check that it's for the same type. The wrapper - * function carries the type in its self, so they should have also checked that - * {@code PyCFunction_GET_SELF(descr) == type}. So in summary, {@code tp_new} is inherited - * through {@code tp_base} when the one in MRO is builtin/native, and it's inherited through MRO - * otherwise. - *

        - * We approximate the check for the wrapper by checking that it's a builtin method, and it's - * named {@code __new__}. - */ - private static void fixupNewSlot(Object[] slots, Object type) { - Object mroInheritedNew = slots[New.ordinal()]; - if (mroInheritedNew instanceof PBuiltinMethod builtinMethod) { - mroInheritedNew = builtinMethod.getBuiltinFunction(); - } - if (mroInheritedNew instanceof PBuiltinFunction builtinFunction && builtinFunction.getName().equalsUncached(New.name, TS_ENCODING)) { - Object tpBaseInheritedNew = ReadAttributeFromObjectNode.getUncachedForceType().execute(type, New.name); - if (tpBaseInheritedNew == PNone.NO_VALUE) { - Object base = GetBaseClassNode.executeUncached(type); - tpBaseInheritedNew = LookupCallableSlotInMRONode.getUncached(New).execute(base); - } - slots[New.ordinal()] = tpBaseInheritedNew; - } - } - - private static void setSlotsFromManaged(Object[] slots, PythonManagedClass source, PythonLanguage language) { - PDict dict = GetDictIfExistsNode.getUncached().execute(source); - if (dict == null) { - for (SpecialMethodSlot slot : VALUES) { - final Object value = ReadAttributeFromPythonObjectNode.executeUncached(source, slot.getName(), PNone.NO_VALUE); - if (value != PNone.NO_VALUE) { - slots[slot.ordinal()] = asSlotValue(slot, value, language); - } - } - } else { - HashingStorage storage = dict.getDictStorage(); - for (SpecialMethodSlot slot : VALUES) { - final Object value = HashingStorageGetItem.executeUncached(storage, slot.getName()); - if (value != null) { - slots[slot.ordinal()] = asSlotValue(slot, value, language); - } - } - } - } - - private static void setSlotsFromGeneric(Object[] slots, PythonAbstractClass base, PythonLanguage language) { - ReadAttributeFromObjectNode readAttNode = ReadAttributeFromObjectNode.getUncachedForceType(); - for (SpecialMethodSlot slot : VALUES) { - Object value = readAttNode.execute(base, slot.getName()); - if (value != PNone.NO_VALUE) { - slots[slot.ordinal()] = asSlotValue(slot, value, language); - } - } - } - - @TruffleBoundary - public static void fixupSpecialMethodSlot(PythonNativeClass klass, SpecialMethodSlot slot, Object value) { - Object newValue = value; - if (value == PNone.NO_VALUE) { - // We are removing the value: find the new value for the class that is being updated and - // proceed with that - newValue = LookupAttributeInMRONode.lookupSlowPath(klass, slot.getName()); - } - fixupSpecialMethodInSubClasses(GetSubclassesAsArrayNode.executeUncached(klass), slot, newValue, PythonContext.get(null)); - } - - @TruffleBoundary - public static void fixupSpecialMethodSlot(PythonManagedClass klass, SpecialMethodSlot slot, Object value) { - if (klass.specialMethodSlots == null) { - // This can happen during type initialization, we'll initialize the slots when the - // whole initialization is done. We do the assert only if we maintain the stack of types - // currently being initialized - assert initializingTypes == null || initializingTypes.contains(klass); - return; - } - - Object oldValue = slot.getValue(klass); - if (value == oldValue) { - return; - } - - Object newValue = value; - if (value == PNone.NO_VALUE) { - // We are removing the value: find the new value for the class that is being updated and - // proceed with that - newValue = LookupAttributeInMRONode.lookupSlowPath(klass, slot.getName()); - } - - PythonContext context = PythonContext.get(null); - slot.setValue(klass, newValue, context); - if (oldValue == PNone.NO_VALUE) { - setMethodsFlag(klass, slot.getMethodsFlag(), context); - } - fixupSpecialMethodInSubClasses(GetSubclassesAsArrayNode.executeUncached(klass), slot, value, context); - } - - // Note: originalValue == null means originalValue is not available - private static void fixupSpecialMethodSlotInternal(PythonManagedClass klass, SpecialMethodSlot slot, Object newValue, PythonContext context) { - Object currentOldValue = slot.getValue(klass); - // Even if this slot was occupied by the same value as in the base, it does not mean that - // the value was here because it was inherited from the base class where we now overridden - // that slot. To stay on the safe side, we consult the MRO here. - Object currentNewValue = LookupAttributeInMRONode.lookupSlowPath(klass, slot.getName()); - if (newValue != PNone.NO_VALUE) { - // If the newly written value is not NO_VALUE, then should either override the slot with - // the new value or leave it unchanged if it inherited the value from some other class - assert currentNewValue != PNone.NO_VALUE; - assert asSlotValue(slot, currentNewValue, context.getLanguage()) == currentOldValue || currentNewValue == newValue; - } - // Else if the newly written value was NO_VALUE, then we either remove the slot or we pull - // its value from some other class in the MRO - if (currentOldValue != currentNewValue) { - // Something actually changed, fixup subclasses... - slot.setValue(klass, currentNewValue, context); - fixupSpecialMethodInSubClasses(GetSubclassesAsArrayNode.executeUncached(klass), slot, newValue, context); - } - } - - private static void fixupSpecialMethodSlot(Object klass, SpecialMethodSlot slot, Object newValue, PythonContext context) { - if (klass instanceof PythonManagedClass clazz) { - setMethodsFlag(clazz, slot.getMethodsFlag(), context); - fixupSpecialMethodSlotInternal((PythonManagedClass) klass, slot, newValue, context); - } else if (klass instanceof PythonNativeClass clazz) { - setMethodsFlag(clazz, slot.getMethodsFlag(), context); - fixupSpecialMethodInSubClasses(GetSubclassesAsArrayNode.executeUncached(clazz), slot, newValue, context); - } else { - throw new AssertionError(Objects.toString(klass)); - } - } - - private static void fixupSpecialMethodInSubClasses(PythonAbstractClass[] subClasses, SpecialMethodSlot slot, Object newValue, PythonContext context) { - for (PythonAbstractClass subClass : subClasses) { - fixupSpecialMethodSlot(subClass, slot, newValue, context); - } - } - - private static Object asSlotValue(SpecialMethodSlot slot, Object value, PythonLanguage language) { - if (value instanceof PBuiltinFunction && slot.allowsBuiltinDescriptors) { - PBuiltinFunction builtinFun = (PBuiltinFunction) value; - BuiltinMethodDescriptor info = BuiltinMethodDescriptor.get(builtinFun); - if (info != null) { - if (builtinFun.getDescriptor() == null) { - // Note: number of all builtins >> number of builtins used in slots, so it is - // better to do this lazily - language.registerBuiltinDescriptorCallTarget(info, builtinFun.getCallTarget()); - builtinFun.setDescriptor(info); - } - return info; - } - } - return value; - } - - // -------------------------------------------------- - // Lookup of the slots: - - /** - * Fast check that can rule out that given name is a special slot. - */ - public static boolean canBeSpecial(TruffleString name, TruffleString.CodePointLengthNode codePointLengthNode, TruffleString.CodePointAtIndexNode codePointAtIndexNode) { - int len = codePointLengthNode.execute(name, TS_ENCODING); - return len > 5 && codePointAtIndexNode.execute(name, len - 2, TS_ENCODING) == '_' && codePointAtIndexNode.execute(name, len - 1, TS_ENCODING) == '_' && - codePointAtIndexNode.execute(name, 1, TS_ENCODING) == '_' && codePointAtIndexNode.execute(name, 0, TS_ENCODING) == '_'; - } - - @TruffleBoundary - public static SpecialMethodSlot findSpecialSlotUncached(TruffleString name) { - return findSpecialSlot(name, TruffleString.CodePointLengthNode.getUncached(), TruffleString.CodePointAtIndexNode.getUncached(), TruffleString.EqualNode.getUncached()); - } - - public static SpecialMethodSlot findSpecialSlot(TruffleString name, TruffleString.CodePointLengthNode codePointLengthNode, TruffleString.CodePointAtIndexNode codePointAtIndexNode, - TruffleString.EqualNode eqNode) { - if (!canBeSpecial(name, codePointLengthNode, codePointAtIndexNode)) { - return null; - } - int x = codePointAtIndexNode.execute(name, 2, TS_ENCODING) * 26 + codePointAtIndexNode.execute(name, 3, TS_ENCODING); - switch (x) { - case 'g' * 26 + 'e': // ge - if (eqNode.execute(name, T___GE__, TS_ENCODING)) { - return Ge; - } - break; - case 's' * 26 + 'e': // se - if (eqNode.execute(name, T___SET_NAME__, TS_ENCODING)) { - return SetName; - } - if (eqNode.execute(name, T___SETITEM__, TS_ENCODING)) { - return SetItem; - } - break; - case 'd' * 26 + 'e': // de - if (eqNode.execute(name, T___DELATTR__, TS_ENCODING)) { - return DelAttr; - } - if (eqNode.execute(name, T___DELITEM__, TS_ENCODING)) { - return DelItem; - } - break; - case 'd' * 26 + 'i': // di - if (eqNode.execute(name, T___DICT__, TS_ENCODING)) { - return Dict; - } - if (eqNode.execute(name, T___DIVMOD__, TS_ENCODING)) { - return DivMod; - } - break; - case 'i' * 26 + 't': // it - if (eqNode.execute(name, T___ITER__, TS_ENCODING)) { - return Iter; - } - break; - case 'n' * 26 + 'e': // ne - if (eqNode.execute(name, T___NEXT__, TS_ENCODING)) { - return Next; - } - if (eqNode.execute(name, T___NEW__, TS_ENCODING)) { - return New; - } - if (eqNode.execute(name, T___NE__, TS_ENCODING)) { - return Ne; - } - break; - case 'i' * 26 + 'n': // in - if (eqNode.execute(name, T___INIT__, TS_ENCODING)) { - return Init; - } - if (eqNode.execute(name, T___INSTANCECHECK__, TS_ENCODING)) { - return InstanceCheck; - } - if (eqNode.execute(name, T___INDEX__, TS_ENCODING)) { - return Index; - } - if (eqNode.execute(name, T___INT__, TS_ENCODING)) { - return Int; - } - break; - case 's' * 26 + 'u': // su - if (eqNode.execute(name, T___SUBCLASSCHECK__, TS_ENCODING)) { - return Subclasscheck; - } - if (eqNode.execute(name, T___SUB__, TS_ENCODING)) { - return Sub; - } - break; - case 'c' * 26 + 'a': // ca - if (eqNode.execute(name, T___CALL__, TS_ENCODING)) { - return Call; - } - break; - case 'e' * 26 + 'x': // ex - if (eqNode.execute(name, T___EXIT__, TS_ENCODING)) { - return Exit; - } - break; - case 'e' * 26 + 'n': // en - if (eqNode.execute(name, T___ENTER__, TS_ENCODING)) { - return Enter; - } - break; - case 'l' * 26 + 'e': // le - if (eqNode.execute(name, T___LENGTH_HINT__, TS_ENCODING)) { - return LengthHint; - } - if (eqNode.execute(name, T___LE__, TS_ENCODING)) { - return Le; - } - break; - case 'c' * 26 + 'o': // co - if (eqNode.execute(name, T___CONTAINS__, TS_ENCODING)) { - return Contains; - } - break; - case 'h' * 26 + 'a': // ha - if (eqNode.execute(name, T___HASH__, TS_ENCODING)) { - return Hash; - } - break; - case 'f' * 26 + 'l': // fl - if (eqNode.execute(name, T___FLOAT__, TS_ENCODING)) { - return Float; - } - if (eqNode.execute(name, T___FLOORDIV__, TS_ENCODING)) { - return FloorDiv; - } - break; - case 's' * 26 + 't': // st - if (eqNode.execute(name, T___STR__, TS_ENCODING)) { - return Str; - } - break; - case 'r' * 26 + 'e': // re - if (eqNode.execute(name, T___REPR__, TS_ENCODING)) { - return Repr; - } - if (eqNode.execute(name, T___REVERSED__, TS_ENCODING)) { - return Reversed; - } - break; - case 'f' * 26 + 'o': // fo - if (eqNode.execute(name, T___FORMAT__, TS_ENCODING)) { - return Format; - } - break; - case 'm' * 26 + 'i': // mi - if (eqNode.execute(name, T___MISSING__, TS_ENCODING)) { - return Missing; - } - break; - case 'e' * 26 + 'q': // eq - if (eqNode.execute(name, T___EQ__, TS_ENCODING)) { - return Eq; - } - break; - case 'l' * 26 + 't': // lt - if (eqNode.execute(name, T___LT__, TS_ENCODING)) { - return Lt; - } - break; - case 'g' * 26 + 't': // gt - if (eqNode.execute(name, T___GT__, TS_ENCODING)) { - return Gt; - } - break; - case 'a' * 26 + 'n': // an - if (eqNode.execute(name, T___AND__, TS_ENCODING)) { - return And; - } - if (eqNode.execute(name, T___ANEXT__, TS_ENCODING)) { - return ANext; - } - break; - case 'r' * 26 + 'a': // ra - if (eqNode.execute(name, T___RAND__, TS_ENCODING)) { - return RAnd; - } - break; - case 'o' * 26 + 'r': // or - if (eqNode.execute(name, T___OR__, TS_ENCODING)) { - return Or; - } - break; - case 'r' * 26 + 'o': // ro - if (eqNode.execute(name, T___ROR__, TS_ENCODING)) { - return ROr; - } - if (eqNode.execute(name, T___ROUND__, TS_ENCODING)) { - return Round; - } - break; - case 'x' * 26 + 'o': // xo - if (eqNode.execute(name, T___XOR__, TS_ENCODING)) { - return Xor; - } - break; - case 'r' * 26 + 'x': // rx - if (eqNode.execute(name, T___RXOR__, TS_ENCODING)) { - return RXor; - } - break; - case 'r' * 26 + 's': // rs - if (eqNode.execute(name, T___RSUB__, TS_ENCODING)) { - return RSub; - } - if (eqNode.execute(name, T___RSHIFT__, TS_ENCODING)) { - return RShift; - } - break; - case 'r' * 26 + 'm': // rm - if (eqNode.execute(name, T___RMATMUL__, TS_ENCODING)) { - return RMatMul; - } - if (eqNode.execute(name, T___RMOD__, TS_ENCODING)) { - return RMod; - } - break; - case 'm' * 26 + 'a': // ma - if (eqNode.execute(name, T___MATMUL__, TS_ENCODING)) { - return MatMul; - } - break; - case 'm' * 26 + 'o': // mo - if (eqNode.execute(name, T___MOD__, TS_ENCODING)) { - return Mod; - } - break; - case 'r' * 26 + 'd': // rd - if (eqNode.execute(name, T___RDIVMOD__, TS_ENCODING)) { - return RDivMod; - } - break; - case 'p' * 26 + 'o': // po - if (eqNode.execute(name, T___POW__, TS_ENCODING)) { - return Pow; - } - break; - case 'r' * 26 + 'p': // rp - if (eqNode.execute(name, T___RPOW__, TS_ENCODING)) { - return RPow; - } - break; - case 't' * 26 + 'r': // tr - if (eqNode.execute(name, T___TRUEDIV__, TS_ENCODING)) { - return TrueDiv; - } - break; - case 'r' * 26 + 't': // rt - if (eqNode.execute(name, T___RTRUEDIV__, TS_ENCODING)) { - return RTrueDiv; - } - break; - case 'r' * 26 + 'f': // rf - if (eqNode.execute(name, T___RFLOORDIV__, TS_ENCODING)) { - return RFloorDiv; - } - break; - case 'l' * 26 + 's': // ls - if (eqNode.execute(name, T___LSHIFT__, TS_ENCODING)) { - return LShift; - } - break; - case 'r' * 26 + 'l': // rl - if (eqNode.execute(name, T___RLSHIFT__, TS_ENCODING)) { - return RLShift; - } - break; - case 'r' * 26 + 'r': // rr - if (eqNode.execute(name, T___RRSHIFT__, TS_ENCODING)) { - return RRShift; - } - break; - case 'i' * 26 + 'a': // ia - if (eqNode.execute(name, T___IADD__, TS_ENCODING)) { - return IAdd; - } - break; - case 'i' * 26 + 'm': // im - if (eqNode.execute(name, T___IMUL__, TS_ENCODING)) { - return IMul; - } - break; - case 'b' * 26 + 'y': // by - if (eqNode.execute(name, T___BYTES__, TS_ENCODING)) { - return Bytes; - } - break; - case 'a' * 26 + 'w': // aw - if (eqNode.execute(name, T___AWAIT__, TS_ENCODING)) { - return Await; - } - break; - case 'a' * 26 + 'e': // ae - if (eqNode.execute(name, T___AENTER__, TS_ENCODING)) { - return AEnter; - } - if (eqNode.execute(name, T___AEXIT__, TS_ENCODING)) { - return AExit; - } - break; - case 'a' * 26 + 'i': // ai - if (eqNode.execute(name, T___AITER__, TS_ENCODING)) { - return AIter; - } - break; - } - return null; - } - - private static boolean checkReverseSlots() { - TruffleString prefix = tsLiteral("__"); - TruffleString rPrefix = tsLiteral("__r"); - for (SpecialMethodSlot slot : VALUES) { - TruffleString slotName = slot.getName(); - if (rPrefix.regionEqualsUncached(0, slotName, 0, 3, TS_ENCODING)) { - int slotNameLen = slotName.codePointLengthUncached(TS_ENCODING); - TruffleString slotNamePart = slotName.substringUncached(3, slotNameLen - 3, TS_ENCODING, true); - SpecialMethodSlot rslot = findSpecialSlotUncached(prefix.concatUncached(slotNamePart, TS_ENCODING, false)); - if (rslot != null && rslot.reverse != slot) { - assert false : slotName; - return false; - } - } - } - return true; - } - - private static boolean checkFind() { - for (SpecialMethodSlot slot : VALUES) { - if (findSpecialSlotUncached(slot.getName()) != slot) { - assert false : slot; - return false; - } - } - return findSpecialSlotUncached(tsLiteral("__bogus__")) == null; - } - - // -------------------------------------------------- - // Methods for validation, some used in asserts, some unused but left here to aid local - // debugging - - /** - * Checks that there were no builtins' slots overridden except those explicitly marked so by - * {@link PythonBuiltinClassType#redefinesSlot}. - */ - public static boolean checkSlotOverrides(Python3Core core) { - assert builtinSlotsInitialized; - HashSet mismatches = new HashSet<>(); - for (PythonBuiltinClassType type : PythonBuiltinClassType.VALUES) { - PythonBuiltinClass klass = core.lookupType(type); - for (SpecialMethodSlot slot : VALUES) { - Object typeValue = slot.getValue(type); - if (typeValue != null) { - Object klassValue = slot.getValue(klass); - if (klassValue.equals(typeValue)) { - // values are same: OK - continue; - } - if (typeValue instanceof BuiltinMethodDescriptor && klassValue instanceof PBuiltinFunction && - ((BuiltinMethodDescriptor) typeValue).isDescriptorOf((PBuiltinFunction) klassValue)) { - // BuiltinMethodDescriptor and matching PBuiltinFunction: OK - continue; - } - mismatches.add(type.getName().toJavaStringUncached() + "." + slot.getName().toJavaStringUncached()); - } - } - } - // If this assertion fails, update the list of the redefinedSlots for the offending types - // See the static block in PythonBuiltinClassType - assert mismatches.size() == 0 : String.join(", ", mismatches); - return true; - } - - private static final ArrayDeque initializingTypes; // types that are being initialized - - static { - // Uncomment to start using validateSlots - // initializingTypes = new ArrayDeque<>(); - initializingTypes = null; - } - - public static boolean pushInitializedTypePlaceholder() { - if (initializingTypes != null) { - initializingTypes.push(42); - } - return true; - } - - public static boolean replaceInitializedTypeTop(Object type) { - if (initializingTypes != null) { - assert (Integer) initializingTypes.pop() == 42; - initializingTypes.push(type); - } - return true; - } - - public static boolean popInitializedType() { - if (initializingTypes != null) { - initializingTypes.pop(); - } - return true; - } - - // Note: this only works in single context, single threaded case! - // Uncomment the initialization of initializingTypes in the static block - @SuppressWarnings("unused") - public static boolean validateSlots(Object klassIn) { - if (initializingTypes.contains(klassIn)) { - return true; - } - ReadAttributeFromPythonObjectNode uncachedReadAttrNode = ReadAttributeFromPythonObjectNode.getUncached(); - final Python3Core core = PythonContext.get(uncachedReadAttrNode); - Object klass = klassIn; - if (klass instanceof PythonBuiltinClassType) { - PythonBuiltinClassType type = (PythonBuiltinClassType) klass; - klass = core.lookupType(type); - if (initializingTypes.contains(klass)) { - return true; - } - if (type.getSpecialMethodSlots() == null) { - return true; - } - for (SpecialMethodSlot slot : VALUES) { - Object actual = LookupAttributeInMRONode.findAttr(core, type, slot.getName(), uncachedReadAttrNode); - Object expected = slot.getValue(type); - if (expected instanceof BuiltinMethodDescriptor) { - assert actual instanceof PBuiltinFunction; - assert ((BuiltinMethodDescriptor) expected).isDescriptorOf((PBuiltinFunction) actual); - } else if (expected != null) { - assert PythonLanguage.canCache(expected); - assert actual == expected; - } - } - klass = core.lookupType(type); - } - if (klass instanceof PythonManagedClass) { - PythonManagedClass managed = (PythonManagedClass) klass; - for (SpecialMethodSlot slot : VALUES) { - Object actual = LookupAttributeInMRONode.lookupSlowPath(managed, slot.getName()); - Object expected = slot.getValue(managed); - if (expected instanceof NodeFactory) { - assert actual instanceof PBuiltinFunction; - assert ((PBuiltinFunction) actual).getBuiltinNodeFactory() == expected; - } else { - assert actual == expected; - } - } - } - return true; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TpSlots.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TpSlots.java index 5d0011cc73..2350b6a6dd 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TpSlots.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TpSlots.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,20 +40,84 @@ */ package com.oracle.graal.python.builtins.objects.type; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ABS__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ADD__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___AITER__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___AND__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ANEXT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___AWAIT__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___BOOL__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___CALL__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___CONTAINS__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DELATTR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DELETE__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DELITEM__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DIVMOD__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___EQ__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FLOAT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FLOORDIV__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GETATTRIBUTE__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GETATTR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GETITEM__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GET__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GE__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___HASH__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IADD__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IAND__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IFLOORDIV__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ILSHIFT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IMATMUL__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IMOD__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IMUL__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INDEX__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INIT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INVERT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IOR__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IPOW__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IRSHIFT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ISUB__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ITER__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ITRUEDIV__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IXOR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LEN__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LE__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LSHIFT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MATMUL__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MOD__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MUL__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEG__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEW__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEXT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NE__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___OR__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___POS__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___POW__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RADD__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RAND__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RDIVMOD__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REPR__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RFLOORDIV__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RLSHIFT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RMATMUL__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RMOD__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RMUL__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ROR__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RPOW__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RRSHIFT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RSHIFT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RSUB__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RTRUEDIV__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RXOR__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETATTR__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETITEM__; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SET__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___STR__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SUB__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___TRUEDIV__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___XOR__; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.getUncachedInterop; @@ -68,63 +132,89 @@ import java.util.Set; import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.BoundBuiltinCallable; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; +import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol; import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.BinaryOpSlotFuncWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.BinarySlotFuncWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.CallWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.DescrGetFunctionWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.DescrSetFunctionWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.GetAttrWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.HashfuncWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.InitWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.InquiryWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.IterNextWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.LenfuncWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.NbInPlacePowerWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.NbPowerWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.NewWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.ObjobjargWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.RichcmpFunctionWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.SetattrWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.SqContainsWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.SsizeargfuncSlotWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.SsizeobjargprocWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.TpSlotWrapper; +import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.UnaryFuncWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.PythonClassNativeWrapper; -import com.oracle.graal.python.builtins.objects.cext.common.CExtContext; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef.HPySlotWrapper; -import com.oracle.graal.python.builtins.objects.cext.hpy.HPyExternalFunctionNodes; +import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.EnsureExecutableNode; import com.oracle.graal.python.builtins.objects.cext.structs.CFields; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess.ReadPointerNode; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess.WritePointerNode; +import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetItem; +import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; +import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; import com.oracle.graal.python.builtins.objects.type.TpSlotsFactory.GetObjectSlotsNodeGen; import com.oracle.graal.python.builtins.objects.type.TpSlotsFactory.GetTpSlotsNodeGen; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetSubclassesAsArrayNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltin; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotCExtNative; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotHPyNative; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotManaged; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotNative; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPython; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPythonSingle; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.TpSlotBinaryFuncBuiltin; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.TpSlotSqConcat; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.TpSlotBinaryIOpBuiltin; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.TpSlotBinaryOpBuiltin; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.TpSlotBinaryOpPython; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.TpSlotReversiblePython; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.TpSlotDescrGetBuiltin; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrSet.TpSlotDescrSetBuiltin; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrSet.TpSlotDescrSetPython; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotGetAttr.TpSlotGetAttrBuiltin; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotGetAttr.TpSlotGetAttrPython; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.TpSlotHashBuiltin; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotInquiry.TpSlotInquiryBuiltin; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpSlotIterNextBuiltin; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.TpSlotLenBuiltin; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotMpAssSubscript.TpSlotMpAssSubscriptBuiltin; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotMpAssSubscript.TpSlotMpAssSubscriptPython; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotNbPower.TpSlotNbPowerBuiltin; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare.TpSlotRichCmpBuiltin; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare.TpSlotRichCmpPython; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSetAttr.TpSlotSetAttrBuiltin; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSetAttr.TpSlotSetAttrPython; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.TpSlotSizeArgFunBuiltin; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqAssItem.TpSlotSqAssItemBuiltin; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqAssItem.TpSlotSqAssItemPython; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqContains.TpSlotSqContainsBuiltin; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotUnaryFunc.TpSlotUnaryFuncBuiltin; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotVarargs.TpSlotNewBuiltin; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotVarargs.TpSlotVarargsBuiltin; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; -import com.oracle.graal.python.nodes.attributes.WriteAttributeToPythonObjectNode; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.object.GetDictIfExistsNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.sequence.storage.MroSequenceStorage; import com.oracle.graal.python.util.InlineWeakValueProfile; @@ -142,6 +232,7 @@ import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.object.DynamicObjectLibrary; import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.strings.TruffleString; @@ -154,7 +245,7 @@ *
          *     Builtins:
          *      - initialization of the slots: static ctor of {@link PythonBuiltinClassType}
        - *      - initialization of the wrappers: context initialization calls {@link TpSlots#addOperatorsToBuiltin(Map, Python3Core, PythonBuiltinClassType)}
        + *      - initialization of the wrappers: context initialization calls {@link #addOperatorsToBuiltin(Python3Core, PythonBuiltinClassType, PythonBuiltinClass)}
          *      - all the slots are static and shared per JVM, builtins do not allow to update attributes after ctx initialization
          *
          *     Native classes:
        @@ -163,7 +254,7 @@
          *              - eventually will be replaced with one upcall to managed implementation of CPython's add_operators
          *                  that will use the {@link #SLOTDEFS} definitions and unsafe to read the slots
          *          - type_ready_inherit: does the slot inheritance in native
        - *          - type_ready_graalpy_process_inherited_slots: up-calls PyTruffle_AddInheritedSlots to:
        + *          - after type_ready_inherit: up-calls PyTruffle_AddInheritedSlots to:
          *              - transfer the native slots to their managed mirror {@link TpSlots}
          *              - re-validate cached lookups in TpSlotPython, see comment in {@link #fromNative(PythonAbstractNativeObject, PythonContext)}
          *              - fixup getsets and members
        @@ -199,30 +290,83 @@
          *            should be {@link #tp_getattro()}. We assume that no builtins define this slot.
          */
         public record TpSlots(TpSlot nb_bool, //
        -                TpSlot nb_add,
        +                TpSlot nb_index, //
        +                TpSlot nb_int, //
        +                TpSlot nb_float, //
        +                TpSlot nb_absolute, //
        +                TpSlot nb_positive, //
        +                TpSlot nb_negative, //
        +                TpSlot nb_invert, //
        +                TpSlot nb_add, //
        +                TpSlot nb_subtract, //
                         TpSlot nb_multiply, //
        +                TpSlot nb_remainder, //
        +                TpSlot nb_lshift, //
        +                TpSlot nb_rshift, //
        +                TpSlot nb_and, //
        +                TpSlot nb_xor, //
        +                TpSlot nb_or, //
        +                TpSlot nb_floor_divide, //
        +                TpSlot nb_true_divide, //
        +                TpSlot nb_divmod, //
        +                TpSlot nb_matrix_multiply, //
        +                TpSlot nb_power, //
        +                TpSlot nb_inplace_add, //
        +                TpSlot nb_inplace_subtract, //
        +                TpSlot nb_inplace_multiply, //
        +                TpSlot nb_inplace_remainder, //
        +                TpSlot nb_inplace_lshift, //
        +                TpSlot nb_inplace_rshift, //
        +                TpSlot nb_inplace_and, //
        +                TpSlot nb_inplace_xor, //
        +                TpSlot nb_inplace_or, //
        +                TpSlot nb_inplace_floor_divide, //
        +                TpSlot nb_inplace_true_divide, //
        +                TpSlot nb_inplace_matrix_multiply, //
        +                TpSlot nb_inplace_power, //
                         TpSlot sq_length, //
                         TpSlot sq_item, //
        +                TpSlot sq_ass_item, //
                         TpSlot sq_concat, //
                         TpSlot sq_repeat, //
        +                TpSlot sq_inplace_concat, //
        +                TpSlot sq_inplace_repeat, //
        +                TpSlot sq_contains, //
                         TpSlot mp_length, //
                         TpSlot mp_subscript, //
        +                TpSlot mp_ass_subscript, //
                         TpSlot combined_sq_mp_length, //
                         TpSlot combined_mp_sq_length, //
        +                TpSlot tp_richcmp, //
                         TpSlot tp_descr_get, //
                         TpSlot tp_descr_set, //
        +                TpSlot tp_hash, //
                         TpSlot tp_getattro, //
                         TpSlot tp_getattr, //
                         TpSlot combined_tp_getattro_getattr, //
                         TpSlot tp_setattro, //
                         TpSlot tp_setattr,
                         TpSlot combined_tp_setattro_setattr,
        +                TpSlot tp_iter, //
        +                TpSlot tp_iternext, //
        +                TpSlot tp_repr, //
        +                TpSlot tp_str, //
        +                TpSlot tp_init, //
        +                TpSlot tp_new, //
        +                TpSlot tp_call, //
        +                TpSlot am_await, //
        +                TpSlot am_aiter, //
        +                TpSlot am_anext, //
                         boolean has_as_number,
                         boolean has_as_sequence,
        -                boolean has_as_mapping) {
        +                boolean has_as_mapping,
        +                boolean has_as_async) {
         
             private static final TruffleLogger LOGGER = PythonLanguage.getLogger(TpSlot.class);
         
        +    // Force class initialization earlier
        +    private static final TpSlot NEXT_NOT_IMPLEMENTED = TpSlotIterNext.NEXT_NOT_IMPLEMENTED;
        +
             @FunctionalInterface
             private interface TpSlotGetter {
                 TpSlot get(TpSlots slots);
        @@ -279,18 +423,36 @@ public TpSlot create(Object[] callables, TruffleString[] names, Object klass) {
             }
         
             public enum TpSlotGroup {
        -        AS_NUMBER(CFields.PyTypeObject__tp_as_number),
        -        AS_SEQUENCE(CFields.PyTypeObject__tp_as_sequence),
        -        AS_MAPPING(CFields.PyTypeObject__tp_as_mapping),
        -        NO_GROUP(null); // Must be last
        +        AS_NUMBER(TpSlots::has_as_number, CFields.PyTypeObject__tp_as_number),
        +        AS_SEQUENCE(TpSlots::has_as_sequence, CFields.PyTypeObject__tp_as_sequence),
        +        AS_MAPPING(TpSlots::has_as_mapping, CFields.PyTypeObject__tp_as_mapping),
        +        AS_ASYNC(TpSlots::has_as_async, CFields.PyTypeObject__tp_as_async),
        +        NO_GROUP(null, null); // Must be last
         
                 public static final TpSlotGroup[] VALID_VALUES = Arrays.copyOf(values(), values().length - 1);
         
        +        private final GroupGetter getter;
                 private final CFields cField;
         
        -        TpSlotGroup(CFields cField) {
        +        TpSlotGroup(GroupGetter getter, CFields cField) {
        +            this.getter = getter;
                     this.cField = cField;
                 }
        +
        +        public boolean getValue(TpSlots slots) {
        +            assert this != NO_GROUP;
        +            return getter.get(slots);
        +        }
        +
        +        public boolean readFromNative(PythonAbstractNativeObject pythonClass) {
        +            Object ptr = ReadPointerNode.getUncached().readFromObj(pythonClass, cField);
        +            return !InteropLibrary.getUncached().isNull(ptr);
        +        }
        +    }
        +
        +    @FunctionalInterface
        +    interface GroupGetter {
        +        boolean get(TpSlots slot);
             }
         
             /**
        @@ -305,22 +467,278 @@ public enum TpSlotMeta {
                                 CFields.PyNumberMethods__nb_bool,
                                 PExternalFunctionWrapper.INQUIRY,
                                 InquiryWrapper::new),
        +        NB_INDEX(
        +                        TpSlots::nb_index,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotUnaryFuncBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_index,
        +                        PExternalFunctionWrapper.UNARYFUNC,
        +                        UnaryFuncWrapper::new),
        +        NB_INT(
        +                        TpSlots::nb_int,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotUnaryFuncBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_int,
        +                        PExternalFunctionWrapper.UNARYFUNC,
        +                        UnaryFuncWrapper::new),
        +        NB_FLOAT(
        +                        TpSlots::nb_float,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotUnaryFuncBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_float,
        +                        PExternalFunctionWrapper.UNARYFUNC,
        +                        UnaryFuncWrapper::new),
        +        NB_ABSOLUTE(
        +                        TpSlots::nb_absolute,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotUnaryFuncBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_absolute,
        +                        PExternalFunctionWrapper.UNARYFUNC,
        +                        UnaryFuncWrapper::new),
        +        NB_POSITIVE(
        +                        TpSlots::nb_positive,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotUnaryFuncBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_positive,
        +                        PExternalFunctionWrapper.UNARYFUNC,
        +                        UnaryFuncWrapper::new),
        +        NB_NEGATIVE(
        +                        TpSlots::nb_negative,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotUnaryFuncBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_negative,
        +                        PExternalFunctionWrapper.UNARYFUNC,
        +                        UnaryFuncWrapper::new),
        +        NB_INVERT(
        +                        TpSlots::nb_invert,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotUnaryFuncBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_invert,
        +                        PExternalFunctionWrapper.UNARYFUNC,
        +                        UnaryFuncWrapper::new),
                 NB_ADD(
                                 TpSlots::nb_add,
        -                        TpSlotBinaryOpPython.class,
        +                        TpSlotReversiblePython.class,
                                 TpSlotBinaryOpBuiltin.class,
                                 TpSlotGroup.AS_NUMBER,
                                 CFields.PyNumberMethods__nb_add,
                                 PExternalFunctionWrapper.BINARYFUNC,
                                 BinaryOpSlotFuncWrapper::createAdd),
        +        NB_SUBTRACT(
        +                        TpSlots::nb_subtract,
        +                        TpSlotReversiblePython.class,
        +                        TpSlotBinaryOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_subtract,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinaryOpSlotFuncWrapper::createSubtract),
                 NB_MULTIPLY(
                                 TpSlots::nb_multiply,
        -                        TpSlotBinaryOpPython.class,
        +                        TpSlotReversiblePython.class,
                                 TpSlotBinaryOpBuiltin.class,
                                 TpSlotGroup.AS_NUMBER,
                                 CFields.PyNumberMethods__nb_multiply,
                                 PExternalFunctionWrapper.BINARYFUNC,
                                 BinaryOpSlotFuncWrapper::createMultiply),
        +        NB_REMAINDER(
        +                        TpSlots::nb_remainder,
        +                        TpSlotReversiblePython.class,
        +                        TpSlotBinaryOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_remainder,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinaryOpSlotFuncWrapper::createRemainder),
        +        NB_LSHIFT(
        +                        TpSlots::nb_lshift,
        +                        TpSlotReversiblePython.class,
        +                        TpSlotBinaryOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_lshift,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinaryOpSlotFuncWrapper::createLShift),
        +        NB_RSHIFT(
        +                        TpSlots::nb_rshift,
        +                        TpSlotReversiblePython.class,
        +                        TpSlotBinaryOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_rshift,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinaryOpSlotFuncWrapper::createRShift),
        +        NB_AND(
        +                        TpSlots::nb_and,
        +                        TpSlotReversiblePython.class,
        +                        TpSlotBinaryOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_and,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinaryOpSlotFuncWrapper::createAnd),
        +        NB_XOR(
        +                        TpSlots::nb_xor,
        +                        TpSlotReversiblePython.class,
        +                        TpSlotBinaryOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_xor,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinaryOpSlotFuncWrapper::createXor),
        +        NB_OR(
        +                        TpSlots::nb_or,
        +                        TpSlotReversiblePython.class,
        +                        TpSlotBinaryOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_or,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinaryOpSlotFuncWrapper::createOr),
        +        NB_FLOOR_DIVIDE(
        +                        TpSlots::nb_floor_divide,
        +                        TpSlotReversiblePython.class,
        +                        TpSlotBinaryOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_floor_divide,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinaryOpSlotFuncWrapper::createFloorDivide),
        +        NB_TRUE_DIVIDE(
        +                        TpSlots::nb_true_divide,
        +                        TpSlotReversiblePython.class,
        +                        TpSlotBinaryOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_true_divide,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinaryOpSlotFuncWrapper::createTrueDivide),
        +        NB_DIVMOD(
        +                        TpSlots::nb_divmod,
        +                        TpSlotReversiblePython.class,
        +                        TpSlotBinaryOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_divmod,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinaryOpSlotFuncWrapper::createDivMod),
        +        NB_MATRIX_MULTIPLY(
        +                        TpSlots::nb_matrix_multiply,
        +                        TpSlotReversiblePython.class,
        +                        TpSlotBinaryOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_matrix_multiply,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinaryOpSlotFuncWrapper::createMatrixMultiply),
        +        NB_POWER(
        +                        TpSlots::nb_power,
        +                        TpSlotReversiblePython.class,
        +                        TpSlotNbPowerBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_power,
        +                        PExternalFunctionWrapper.TERNARYFUNC,
        +                        NbPowerWrapper::new),
        +        NB_INPLACE_ADD(
        +                        TpSlots::nb_inplace_add,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotBinaryIOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_inplace_add,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinarySlotFuncWrapper::new),
        +        NB_INPLACE_SUBTRACT(
        +                        TpSlots::nb_inplace_subtract,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotBinaryIOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_inplace_subtract,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinarySlotFuncWrapper::new),
        +        NB_INPLACE_MULTIPLY(
        +                        TpSlots::nb_inplace_multiply,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotBinaryIOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_inplace_multiply,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinarySlotFuncWrapper::new),
        +        NB_INPLACE_REMAINDER(
        +                        TpSlots::nb_inplace_remainder,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotBinaryIOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_inplace_remainder,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinarySlotFuncWrapper::new),
        +        NB_INPLACE_LSHIFT(
        +                        TpSlots::nb_inplace_lshift,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotBinaryIOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_inplace_lshift,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinarySlotFuncWrapper::new),
        +        NB_INPLACE_RSHIFT(
        +                        TpSlots::nb_inplace_rshift,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotBinaryIOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_inplace_rshift,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinarySlotFuncWrapper::new),
        +        NB_INPLACE_AND(
        +                        TpSlots::nb_inplace_and,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotBinaryIOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_inplace_and,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinarySlotFuncWrapper::new),
        +        NB_INPLACE_XOR(
        +                        TpSlots::nb_inplace_xor,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotBinaryIOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_inplace_xor,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinarySlotFuncWrapper::new),
        +        NB_INPLACE_OR(
        +                        TpSlots::nb_inplace_or,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotBinaryIOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_inplace_or,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinarySlotFuncWrapper::new),
        +        NB_INPLACE_FLOOR_DIVIDE(
        +                        TpSlots::nb_inplace_floor_divide,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotBinaryIOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_inplace_floor_divide,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinarySlotFuncWrapper::new),
        +        NB_INPLACE_TRUE_DIVIDE(
        +                        TpSlots::nb_inplace_true_divide,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotBinaryIOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_inplace_true_divide,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinarySlotFuncWrapper::new),
        +        NB_INPLACE_MATRIX_MULTIPLY(
        +                        TpSlots::nb_inplace_matrix_multiply,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotBinaryIOpBuiltin.class,
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_inplace_matrix_multiply,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinarySlotFuncWrapper::new),
        +        NB_INPLACE_POWER(
        +                        TpSlots::nb_inplace_power,
        +                        TpSlotPythonSingle.class,
        +                        null, // No builtin implementations
        +                        TpSlotGroup.AS_NUMBER,
        +                        CFields.PyNumberMethods__nb_inplace_power,
        +                        PExternalFunctionWrapper.TERNARYFUNC,
        +                        NbInPlacePowerWrapper::new),
                 SQ_LENGTH(
                                 TpSlots::sq_length,
                                 TpSlotPythonSingle.class,
        @@ -345,6 +763,14 @@ public enum TpSlotMeta {
                                 CFields.PySequenceMethods__sq_item,
                                 PExternalFunctionWrapper.GETITEM,
                                 SsizeargfuncSlotWrapper::new),
        +        SQ_ASS_ITEM(
        +                        TpSlots::sq_ass_item,
        +                        TpSlotSqAssItemPython.class,
        +                        TpSlotSqAssItemBuiltin.class,
        +                        TpSlotGroup.AS_SEQUENCE,
        +                        CFields.PySequenceMethods__sq_ass_item,
        +                        PExternalFunctionWrapper.SETITEM,
        +                        SsizeobjargprocWrapper::new),
                 SQ_REPEAT(
                                 TpSlots::sq_repeat,
                                 TpSlotPythonSingle.class,
        @@ -353,6 +779,30 @@ public enum TpSlotMeta {
                                 CFields.PySequenceMethods__sq_repeat,
                                 PExternalFunctionWrapper.SSIZE_ARG,
                                 SsizeargfuncSlotWrapper::new),
        +        SQ_INPLACE_CONCAT(
        +                        TpSlots::sq_inplace_concat,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotBinaryIOpBuiltin.class,
        +                        TpSlotGroup.AS_SEQUENCE,
        +                        CFields.PySequenceMethods__sq_inplace_concat,
        +                        PExternalFunctionWrapper.BINARYFUNC,
        +                        BinarySlotFuncWrapper::new),
        +        SQ_INPLACE_REPEAT(
        +                        TpSlots::sq_inplace_repeat,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotSizeArgFunBuiltin.class,
        +                        TpSlotGroup.AS_SEQUENCE,
        +                        CFields.PySequenceMethods__sq_inplace_repeat,
        +                        PExternalFunctionWrapper.SSIZE_ARG,
        +                        SsizeargfuncSlotWrapper::new),
        +        SQ_CONTAINS(
        +                        TpSlots::sq_contains,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotSqContainsBuiltin.class,
        +                        TpSlotGroup.AS_SEQUENCE,
        +                        CFields.PySequenceMethods__sq_contains,
        +                        PExternalFunctionWrapper.OBJOBJPROC,
        +                        SqContainsWrapper::new),
                 MP_LENGTH(
                                 TpSlots::mp_length,
                                 TpSlotPythonSingle.class,
        @@ -369,6 +819,22 @@ public enum TpSlotMeta {
                                 CFields.PyMappingMethods__mp_subscript,
                                 PExternalFunctionWrapper.BINARYFUNC,
                                 BinarySlotFuncWrapper::new),
        +        MP_ASS_SUBSCRIPT(
        +                        TpSlots::mp_ass_subscript,
        +                        TpSlotMpAssSubscriptPython.class,
        +                        TpSlotMpAssSubscriptBuiltin.class,
        +                        TpSlotGroup.AS_MAPPING,
        +                        CFields.PyMappingMethods__mp_ass_subscript,
        +                        PExternalFunctionWrapper.OBJOBJARGPROC,
        +                        ObjobjargWrapper::new),
        +        TP_RICHCOMPARE(
        +                        TpSlots::tp_richcmp,
        +                        TpSlotRichCmpPython.class,
        +                        TpSlotRichCmpBuiltin.class,
        +                        TpSlotGroup.NO_GROUP,
        +                        CFields.PyTypeObject__tp_richcompare,
        +                        PExternalFunctionWrapper.RICHCMP,
        +                        RichcmpFunctionWrapper::new),
                 TP_DESCR_GET(
                                 TpSlots::tp_descr_get,
                                 TpSlotPythonSingle.class,
        @@ -385,6 +851,14 @@ public enum TpSlotMeta {
                                 CFields.PyTypeObject__tp_descr_set,
                                 PExternalFunctionWrapper.DESCR_SET,
                                 DescrSetFunctionWrapper::new),
        +        TP_HASH(
        +                        TpSlots::tp_hash,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotHashBuiltin.class,
        +                        TpSlotGroup.NO_GROUP,
        +                        CFields.PyTypeObject__tp_hash,
        +                        PExternalFunctionWrapper.HASHFUNC,
        +                        HashfuncWrapper::new),
                 TP_GETATTRO(
                                 TpSlots::tp_getattro,
                                 TpSlotGetAttrPython.class,
        @@ -416,7 +890,87 @@ public enum TpSlotMeta {
                                 TpSlotGroup.NO_GROUP,
                                 CFields.PyTypeObject__tp_setattr,
                                 PExternalFunctionWrapper.SETATTR,
        -                        new NativeWrapperFactory.ShouldNotReach("tp_setattr"));
        +                        new NativeWrapperFactory.ShouldNotReach("tp_setattr")),
        +        TP_ITER(
        +                        TpSlots::tp_iter,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotUnaryFuncBuiltin.class,
        +                        TpSlotGroup.NO_GROUP,
        +                        CFields.PyTypeObject__tp_iter,
        +                        PExternalFunctionWrapper.UNARYFUNC,
        +                        UnaryFuncWrapper::new),
        +        TP_ITERNEXT(
        +                        TpSlots::tp_iternext,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotIterNextBuiltin.class,
        +                        TpSlotGroup.NO_GROUP,
        +                        CFields.PyTypeObject__tp_iternext,
        +                        PExternalFunctionWrapper.ITERNEXT,
        +                        IterNextWrapper::new),
        +        TP_REPR(
        +                        TpSlots::tp_repr,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotUnaryFuncBuiltin.class,
        +                        TpSlotGroup.NO_GROUP,
        +                        CFields.PyTypeObject__tp_repr,
        +                        PExternalFunctionWrapper.UNARYFUNC,
        +                        UnaryFuncWrapper::new),
        +        TP_STR(
        +                        TpSlots::tp_str,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotUnaryFuncBuiltin.class,
        +                        TpSlotGroup.NO_GROUP,
        +                        CFields.PyTypeObject__tp_str,
        +                        PExternalFunctionWrapper.UNARYFUNC,
        +                        UnaryFuncWrapper::new),
        +        TP_INIT(
        +                        TpSlots::tp_init,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotVarargsBuiltin.class,
        +                        TpSlotGroup.NO_GROUP,
        +                        CFields.PyTypeObject__tp_init,
        +                        PExternalFunctionWrapper.INITPROC,
        +                        InitWrapper::new),
        +        TP_NEW(
        +                        TpSlots::tp_new,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotNewBuiltin.class,
        +                        TpSlotGroup.NO_GROUP,
        +                        CFields.PyTypeObject__tp_new,
        +                        PExternalFunctionWrapper.NEW,
        +                        NewWrapper::new),
        +        TP_CALL(
        +                        TpSlots::tp_call,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotVarargsBuiltin.class,
        +                        TpSlotGroup.NO_GROUP,
        +                        CFields.PyTypeObject__tp_call,
        +                        PExternalFunctionWrapper.CALL,
        +                        CallWrapper::new),
        +        AM_AWAIT(
        +                        TpSlots::am_await,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotUnaryFuncBuiltin.class,
        +                        TpSlotGroup.AS_ASYNC,
        +                        CFields.PyAsyncMethods__am_await,
        +                        PExternalFunctionWrapper.UNARYFUNC,
        +                        UnaryFuncWrapper::new),
        +        AM_AITER(
        +                        TpSlots::am_aiter,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotUnaryFuncBuiltin.class,
        +                        TpSlotGroup.AS_ASYNC,
        +                        CFields.PyAsyncMethods__am_aiter,
        +                        PExternalFunctionWrapper.UNARYFUNC,
        +                        UnaryFuncWrapper::new),
        +        AM_ANEXT(
        +                        TpSlots::am_anext,
        +                        TpSlotPythonSingle.class,
        +                        TpSlotUnaryFuncBuiltin.class,
        +                        TpSlotGroup.AS_ASYNC,
        +                        CFields.PyAsyncMethods__am_anext,
        +                        PExternalFunctionWrapper.UNARYFUNC,
        +                        UnaryFuncWrapper::new);
         
                 public static final TpSlotMeta[] VALUES = values();
         
        @@ -538,29 +1092,21 @@ public TpSlotGroup getGroup() {
              * @param wrapper {@code descrobject.h:wrapperbase#wrapper}
              */
             public record TpSlotDef(TruffleString name, PythonFunctionFactory functionFactory,
        -                    PExternalFunctionWrapper wrapper, HPySlotWrapper hpyWrapper) {
        -        public static TpSlotDef withoutHPy(TruffleString name, PythonFunctionFactory functionFactory, PExternalFunctionWrapper wrapper) {
        -            return new TpSlotDef(name, functionFactory, wrapper, null);
        +                    PExternalFunctionWrapper wrapper) {
        +        public static TpSlotDef create(TruffleString name, PythonFunctionFactory functionFactory, PExternalFunctionWrapper wrapper) {
        +            return new TpSlotDef(name, functionFactory, wrapper);
                 }
         
                 public static TpSlotDef withSimpleFunction(TruffleString name, PExternalFunctionWrapper wrapper) {
        -            return new TpSlotDef(name, SimplePythonWrapper.INSTANCE, wrapper, null);
        -        }
        -
        -        public static TpSlotDef withSimpleFunction(TruffleString name, PExternalFunctionWrapper wrapper, HPySlotWrapper hpyWrapper) {
        -            return new TpSlotDef(name, SimplePythonWrapper.INSTANCE, wrapper, hpyWrapper);
        +            return new TpSlotDef(name, SimplePythonWrapper.INSTANCE, wrapper);
                 }
         
                 public static TpSlotDef withNoFunctionNoWrapper(TruffleString name) {
        -            return new TpSlotDef(name, null, null, null);
        +            return new TpSlotDef(name, null, null);
                 }
         
                 public static TpSlotDef withNoFunction(TruffleString name, PExternalFunctionWrapper wrapper) {
        -            return new TpSlotDef(name, null, wrapper, null);
        -        }
        -
        -        public static TpSlotDef withNoFunction(TruffleString name, PExternalFunctionWrapper wrapper, HPySlotWrapper hpyWrapper) {
        -            return new TpSlotDef(name, null, wrapper, hpyWrapper);
        +            return new TpSlotDef(name, null, wrapper);
                 }
             }
         
        @@ -586,35 +1132,118 @@ private static void addSlotDef(LinkedHashMap defs, TpSl
                 addSlotDef(s, TpSlotMeta.TP_SETATTR,
                                 TpSlotDef.withNoFunctionNoWrapper(T___SETATTR__),
                                 TpSlotDef.withNoFunctionNoWrapper(T___DELATTR__));
        +        addSlotDef(s, TpSlotMeta.TP_HASH, TpSlotDef.withSimpleFunction(T___HASH__, PExternalFunctionWrapper.HASHFUNC));
                 addSlotDef(s, TpSlotMeta.TP_GETATTRO,
        -                        TpSlotDef.withoutHPy(T___GETATTRIBUTE__, TpSlotGetAttrPython::create, PExternalFunctionWrapper.BINARYFUNC),
        -                        TpSlotDef.withoutHPy(T___GETATTR__, TpSlotGetAttrPython::create, null));
        +                        TpSlotDef.create(T___GETATTRIBUTE__, TpSlotGetAttrPython::create, PExternalFunctionWrapper.BINARYFUNC),
        +                        TpSlotDef.create(T___GETATTR__, TpSlotGetAttrPython::create, null));
                 addSlotDef(s, TpSlotMeta.TP_SETATTRO,
        -                        TpSlotDef.withoutHPy(T___SETATTR__, TpSlotSetAttrPython::create, PExternalFunctionWrapper.SETATTRO),
        -                        TpSlotDef.withoutHPy(T___DELATTR__, TpSlotSetAttrPython::create, PExternalFunctionWrapper.DELATTRO));
        +                        TpSlotDef.create(T___SETATTR__, TpSlotSetAttrPython::create, PExternalFunctionWrapper.SETATTRO),
        +                        TpSlotDef.create(T___DELATTR__, TpSlotSetAttrPython::create, PExternalFunctionWrapper.DELATTRO));
        +        addSlotDef(s, TpSlotMeta.TP_RICHCOMPARE,
        +                        TpSlotDef.create(T___LT__, TpSlotRichCmpPython::create, PExternalFunctionWrapper.BINARYFUNC),
        +                        TpSlotDef.create(T___LE__, TpSlotRichCmpPython::create, PExternalFunctionWrapper.BINARYFUNC),
        +                        TpSlotDef.create(T___EQ__, TpSlotRichCmpPython::create, PExternalFunctionWrapper.BINARYFUNC),
        +                        TpSlotDef.create(T___NE__, TpSlotRichCmpPython::create, PExternalFunctionWrapper.BINARYFUNC),
        +                        TpSlotDef.create(T___GT__, TpSlotRichCmpPython::create, PExternalFunctionWrapper.BINARYFUNC),
        +                        TpSlotDef.create(T___GE__, TpSlotRichCmpPython::create, PExternalFunctionWrapper.BINARYFUNC));
                 addSlotDef(s, TpSlotMeta.TP_DESCR_GET, TpSlotDef.withSimpleFunction(T___GET__, PExternalFunctionWrapper.DESCR_GET));
                 addSlotDef(s, TpSlotMeta.TP_DESCR_SET, //
        -                        TpSlotDef.withoutHPy(T___SET__, TpSlotDescrSetPython::create, PExternalFunctionWrapper.DESCR_SET), //
        -                        TpSlotDef.withoutHPy(T___DELETE__, TpSlotDescrSetPython::create, PExternalFunctionWrapper.DESCR_DELETE));
        +                        TpSlotDef.create(T___SET__, TpSlotDescrSetPython::create, PExternalFunctionWrapper.DESCR_SET), //
        +                        TpSlotDef.create(T___DELETE__, TpSlotDescrSetPython::create, PExternalFunctionWrapper.DESCR_DELETE));
        +        addSlotDef(s, TpSlotMeta.TP_ITER, TpSlotDef.withSimpleFunction(T___ITER__, PExternalFunctionWrapper.UNARYFUNC));
        +        addSlotDef(s, TpSlotMeta.TP_ITERNEXT, TpSlotDef.withSimpleFunction(T___NEXT__, PExternalFunctionWrapper.ITERNEXT));
        +        addSlotDef(s, TpSlotMeta.TP_STR, TpSlotDef.withSimpleFunction(T___STR__, PExternalFunctionWrapper.UNARYFUNC));
        +        addSlotDef(s, TpSlotMeta.TP_REPR, TpSlotDef.withSimpleFunction(T___REPR__, PExternalFunctionWrapper.UNARYFUNC));
        +        addSlotDef(s, TpSlotMeta.TP_INIT, TpSlotDef.withSimpleFunction(T___INIT__, PExternalFunctionWrapper.INITPROC));
        +        addSlotDef(s, TpSlotMeta.TP_NEW, TpSlotDef.withSimpleFunction(T___NEW__, PExternalFunctionWrapper.NEW));
        +        addSlotDef(s, TpSlotMeta.TP_CALL, TpSlotDef.withSimpleFunction(T___CALL__, PExternalFunctionWrapper.CALL));
                 addSlotDef(s, TpSlotMeta.NB_ADD,
        -                        TpSlotDef.withoutHPy(T___ADD__, TpSlotBinaryOpPython::create, PExternalFunctionWrapper.BINARYFUNC_L),
        -                        TpSlotDef.withoutHPy(T___RADD__, TpSlotBinaryOpPython::create, PExternalFunctionWrapper.BINARYFUNC_R));
        +                        TpSlotDef.create(T___ADD__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_L),
        +                        TpSlotDef.create(T___RADD__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_R));
        +        addSlotDef(s, TpSlotMeta.NB_SUBTRACT,
        +                        TpSlotDef.create(T___SUB__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_L),
        +                        TpSlotDef.create(T___RSUB__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_R));
                 addSlotDef(s, TpSlotMeta.NB_MULTIPLY,
        -                        TpSlotDef.withoutHPy(T___MUL__, TpSlotBinaryOpPython::create, PExternalFunctionWrapper.BINARYFUNC_L),
        -                        TpSlotDef.withoutHPy(T___RMUL__, TpSlotBinaryOpPython::create, PExternalFunctionWrapper.BINARYFUNC_R));
        +                        TpSlotDef.create(T___MUL__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_L),
        +                        TpSlotDef.create(T___RMUL__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_R));
        +        addSlotDef(s, TpSlotMeta.NB_REMAINDER,
        +                        TpSlotDef.create(T___MOD__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_L),
        +                        TpSlotDef.create(T___RMOD__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_R));
        +        addSlotDef(s, TpSlotMeta.NB_LSHIFT,
        +                        TpSlotDef.create(T___LSHIFT__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_L),
        +                        TpSlotDef.create(T___RLSHIFT__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_R));
        +        addSlotDef(s, TpSlotMeta.NB_RSHIFT,
        +                        TpSlotDef.create(T___RSHIFT__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_L),
        +                        TpSlotDef.create(T___RRSHIFT__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_R));
        +        addSlotDef(s, TpSlotMeta.NB_AND,
        +                        TpSlotDef.create(T___AND__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_L),
        +                        TpSlotDef.create(T___RAND__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_R));
        +        addSlotDef(s, TpSlotMeta.NB_XOR,
        +                        TpSlotDef.create(T___XOR__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_L),
        +                        TpSlotDef.create(T___RXOR__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_R));
        +        addSlotDef(s, TpSlotMeta.NB_OR,
        +                        TpSlotDef.create(T___OR__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_L),
        +                        TpSlotDef.create(T___ROR__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_R));
        +        addSlotDef(s, TpSlotMeta.NB_FLOOR_DIVIDE,
        +                        TpSlotDef.create(T___FLOORDIV__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_L),
        +                        TpSlotDef.create(T___RFLOORDIV__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_R));
        +        addSlotDef(s, TpSlotMeta.NB_TRUE_DIVIDE,
        +                        TpSlotDef.create(T___TRUEDIV__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_L),
        +                        TpSlotDef.create(T___RTRUEDIV__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_R));
        +        addSlotDef(s, TpSlotMeta.NB_DIVMOD,
        +                        TpSlotDef.create(T___DIVMOD__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_L),
        +                        TpSlotDef.create(T___RDIVMOD__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_R));
        +        addSlotDef(s, TpSlotMeta.NB_MATRIX_MULTIPLY,
        +                        TpSlotDef.create(T___MATMUL__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_L),
        +                        TpSlotDef.create(T___RMATMUL__, TpSlotReversiblePython::create, PExternalFunctionWrapper.BINARYFUNC_R));
        +        addSlotDef(s, TpSlotMeta.NB_POWER,
        +                        TpSlotDef.create(T___POW__, TpSlotReversiblePython::create, PExternalFunctionWrapper.TERNARYFUNC),
        +                        TpSlotDef.create(T___RPOW__, TpSlotReversiblePython::create, PExternalFunctionWrapper.TERNARYFUNC_R));
        +        addSlotDef(s, TpSlotMeta.NB_INPLACE_ADD, TpSlotDef.withSimpleFunction(T___IADD__, PExternalFunctionWrapper.BINARYFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_INPLACE_SUBTRACT, TpSlotDef.withSimpleFunction(T___ISUB__, PExternalFunctionWrapper.BINARYFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_INPLACE_MULTIPLY, TpSlotDef.withSimpleFunction(T___IMUL__, PExternalFunctionWrapper.BINARYFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_INPLACE_REMAINDER, TpSlotDef.withSimpleFunction(T___IMOD__, PExternalFunctionWrapper.BINARYFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_INPLACE_LSHIFT, TpSlotDef.withSimpleFunction(T___ILSHIFT__, PExternalFunctionWrapper.BINARYFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_INPLACE_RSHIFT, TpSlotDef.withSimpleFunction(T___IRSHIFT__, PExternalFunctionWrapper.BINARYFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_INPLACE_AND, TpSlotDef.withSimpleFunction(T___IAND__, PExternalFunctionWrapper.BINARYFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_INPLACE_XOR, TpSlotDef.withSimpleFunction(T___IXOR__, PExternalFunctionWrapper.BINARYFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_INPLACE_OR, TpSlotDef.withSimpleFunction(T___IOR__, PExternalFunctionWrapper.BINARYFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_INPLACE_FLOOR_DIVIDE, TpSlotDef.withSimpleFunction(T___IFLOORDIV__, PExternalFunctionWrapper.BINARYFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_INPLACE_TRUE_DIVIDE, TpSlotDef.withSimpleFunction(T___ITRUEDIV__, PExternalFunctionWrapper.BINARYFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_INPLACE_MATRIX_MULTIPLY, TpSlotDef.withSimpleFunction(T___IMATMUL__, PExternalFunctionWrapper.BINARYFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_INPLACE_POWER, TpSlotDef.withSimpleFunction(T___IPOW__, PExternalFunctionWrapper.TERNARYFUNC));
                 addSlotDef(s, TpSlotMeta.NB_BOOL, TpSlotDef.withSimpleFunction(T___BOOL__, PExternalFunctionWrapper.INQUIRY));
        -        addSlotDef(s, TpSlotMeta.MP_LENGTH, TpSlotDef.withSimpleFunction(T___LEN__, PExternalFunctionWrapper.LENFUNC, HPySlotWrapper.LENFUNC));
        -        addSlotDef(s, TpSlotMeta.MP_SUBSCRIPT, TpSlotDef.withSimpleFunction(T___GETITEM__, PExternalFunctionWrapper.BINARYFUNC, HPySlotWrapper.BINARYFUNC));
        -        addSlotDef(s, TpSlotMeta.SQ_LENGTH, TpSlotDef.withSimpleFunction(T___LEN__, PExternalFunctionWrapper.LENFUNC, HPySlotWrapper.LENFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_INDEX, TpSlotDef.withSimpleFunction(T___INDEX__, PExternalFunctionWrapper.UNARYFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_INT, TpSlotDef.withSimpleFunction(T___INT__, PExternalFunctionWrapper.UNARYFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_FLOAT, TpSlotDef.withSimpleFunction(T___FLOAT__, PExternalFunctionWrapper.UNARYFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_ABSOLUTE, TpSlotDef.withSimpleFunction(T___ABS__, PExternalFunctionWrapper.UNARYFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_POSITIVE, TpSlotDef.withSimpleFunction(T___POS__, PExternalFunctionWrapper.UNARYFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_NEGATIVE, TpSlotDef.withSimpleFunction(T___NEG__, PExternalFunctionWrapper.UNARYFUNC));
        +        addSlotDef(s, TpSlotMeta.NB_INVERT, TpSlotDef.withSimpleFunction(T___INVERT__, PExternalFunctionWrapper.UNARYFUNC));
        +        addSlotDef(s, TpSlotMeta.MP_LENGTH, TpSlotDef.withSimpleFunction(T___LEN__, PExternalFunctionWrapper.LENFUNC));
        +        addSlotDef(s, TpSlotMeta.MP_SUBSCRIPT, TpSlotDef.withSimpleFunction(T___GETITEM__, PExternalFunctionWrapper.BINARYFUNC));
        +        addSlotDef(s, TpSlotMeta.MP_ASS_SUBSCRIPT,
        +                        TpSlotDef.create(T___SETITEM__, TpSlotMpAssSubscriptPython::create, PExternalFunctionWrapper.OBJOBJARGPROC),
        +                        TpSlotDef.create(T___DELITEM__, TpSlotMpAssSubscriptPython::create, PExternalFunctionWrapper.MP_DELITEM));
        +        addSlotDef(s, TpSlotMeta.SQ_LENGTH, TpSlotDef.withSimpleFunction(T___LEN__, PExternalFunctionWrapper.LENFUNC));
                 // sq_concat does not have a slotdef for __radd__ unlike sq_repeat. This have consequences
                 // w.r.t. inheritance from native classes, where sq_repeat is not overridden by __mul__.
                 // Makes one wonder whether this CPython behavior is intended.
                 // see test_sq_repeat_mul_without_rmul_inheritance
                 addSlotDef(s, TpSlotMeta.SQ_CONCAT, TpSlotDef.withNoFunction(T___ADD__, PExternalFunctionWrapper.BINARYFUNC));
                 addSlotDef(s, TpSlotMeta.SQ_REPEAT,
        -                        TpSlotDef.withNoFunction(T___MUL__, PExternalFunctionWrapper.SSIZE_ARG, HPySlotWrapper.INDEXARGFUNC),
        -                        TpSlotDef.withNoFunction(T___RMUL__, PExternalFunctionWrapper.SSIZE_ARG, HPySlotWrapper.INDEXARGFUNC));
        -        addSlotDef(s, TpSlotMeta.SQ_ITEM, TpSlotDef.withSimpleFunction(T___GETITEM__, PExternalFunctionWrapper.GETITEM, HPySlotWrapper.SQ_ITEM));
        +                        TpSlotDef.withNoFunction(T___MUL__, PExternalFunctionWrapper.SSIZE_ARG),
        +                        TpSlotDef.withNoFunction(T___RMUL__, PExternalFunctionWrapper.SSIZE_ARG));
        +        addSlotDef(s, TpSlotMeta.SQ_ITEM, TpSlotDef.withSimpleFunction(T___GETITEM__, PExternalFunctionWrapper.GETITEM));
        +        addSlotDef(s, TpSlotMeta.SQ_ASS_ITEM,
        +                        TpSlotDef.create(T___SETITEM__, TpSlotSqAssItemPython::create, PExternalFunctionWrapper.SETITEM),
        +                        TpSlotDef.create(T___DELITEM__, TpSlotSqAssItemPython::create, PExternalFunctionWrapper.DELITEM));
        +        addSlotDef(s, TpSlotMeta.SQ_INPLACE_CONCAT, TpSlotDef.withNoFunction(T___IADD__, PExternalFunctionWrapper.BINARYFUNC));
        +        addSlotDef(s, TpSlotMeta.SQ_INPLACE_REPEAT, TpSlotDef.withNoFunction(T___IMUL__, PExternalFunctionWrapper.SSIZE_ARG));
        +        addSlotDef(s, TpSlotMeta.SQ_CONTAINS, TpSlotDef.withSimpleFunction(T___CONTAINS__, PExternalFunctionWrapper.OBJOBJPROC));
        +        addSlotDef(s, TpSlotMeta.AM_AWAIT, TpSlotDef.withSimpleFunction(T___AWAIT__, PExternalFunctionWrapper.UNARYFUNC));
        +        addSlotDef(s, TpSlotMeta.AM_ANEXT, TpSlotDef.withSimpleFunction(T___ANEXT__, PExternalFunctionWrapper.UNARYFUNC));
        +        addSlotDef(s, TpSlotMeta.AM_AITER, TpSlotDef.withSimpleFunction(T___AITER__, PExternalFunctionWrapper.UNARYFUNC));
         
                 SLOTDEFS = s;
                 SPECIAL2SLOT = new HashMap<>(SLOTDEFS.size() * 2);
        @@ -637,6 +1266,11 @@ public static TpSlots createEmpty() {
              */
             public static TpSlots fromNative(PythonAbstractNativeObject pythonClass, PythonContext ctx) {
                 var builder = TpSlots.newBuilder();
        +        for (TpSlotGroup group : TpSlotGroup.VALID_VALUES) {
        +            if (group.readFromNative(pythonClass)) {
        +                builder.setExplicitGroup(group);
        +            }
        +        }
                 for (TpSlotMeta def : TpSlotMeta.VALUES) {
                     if (!def.hasNativeWrapperFactory()) {
                         continue;
        @@ -651,12 +1285,26 @@ public static TpSlots fromNative(PythonAbstractNativeObject pythonClass, PythonC
                     TpSlotWrapper existingSlotWrapper = null;
                     if (interop.isPointer(field)) {
                         try {
        -                    Object executable = ctx.getCApiContext().getClosureExecutable(interop.asPointer(field));
        +                    long fieldPointer = interop.asPointer(field);
        +                    Object executable = ctx.getCApiContext().getClosureExecutable(fieldPointer);
                             if (executable instanceof TpSlotWrapper execWrapper) {
                                 existingSlotWrapper = execWrapper;
                             } else if (executable != null) {
                                 // This can happen for legacy slots where the delegate would be a PFunction
        -                        LOGGER.warning(() -> String.format("Unexpected executable for slot pointer: %s", executable));
        +                        LOGGER.fine(() -> String.format("Unexpected executable for slot pointer: %s", executable));
        +                    } else if (def == TpSlotMeta.TP_HASH) {
        +                        // If the slot is not tp_iternext, but the value is
        +                        // PyObject_HashNotImplemented, we still assign it to the slot as wrapped
        +                        // native executable later on
        +                        if (CApiContext.isIdenticalToSymbol(fieldPointer, NativeCAPISymbol.FUN_PYOBJECT_HASH_NOT_IMPLEMENTED)) {
        +                            builder.set(def, TpSlotHashFun.HASH_NOT_IMPLEMENTED);
        +                            continue;
        +                        }
        +                    } else if (def == TpSlotMeta.TP_ITERNEXT) {
        +                        if (CApiContext.isIdenticalToSymbol(fieldPointer, NativeCAPISymbol.FUN_PY_OBJECT_NEXT_NOT_IMPLEMENTED)) {
        +                            builder.set(def, TpSlotIterNext.NEXT_NOT_IMPLEMENTED);
        +                            continue;
        +                        }
                             }
                         } catch (UnsupportedMessageException e) {
                             throw new IllegalStateException(e);
        @@ -700,13 +1348,13 @@ public static TpSlots fromNative(PythonAbstractNativeObject pythonClass, PythonC
                     }
                     // There is no mapping from this pointer to existing TpSlot, we create a new
                     // TpSlotNative wrapping the executable
        -            Object executable = CExtContext.ensureExecutable(field, def.nativeSignature);
        +            Object executable = EnsureExecutableNode.executeUncached(field, def.nativeSignature);
                     builder.set(def, TpSlotNative.createCExtSlot(executable));
                 }
                 return builder.build();
             }
         
        -    private static void toNative(Object ptrToWrite, TpSlotMeta def, TpSlot value, Object nullValue) {
        +    public static void toNative(Object ptrToWrite, TpSlotMeta def, TpSlot value, Object nullValue) {
                 assert !(ptrToWrite instanceof PythonAbstractNativeObject); // this should be the pointer
                 Object slotNativeValue = def.getNativeValue(value, nullValue);
                 toNative(ptrToWrite, def, slotNativeValue, nullValue);
        @@ -737,7 +1385,13 @@ private static void toNative(Object prtToWrite, TpSlotMeta def, Object slotNativ
             }
         
             @TruffleBoundary
        -    public static void inherit(PythonClass klass, MroSequenceStorage mro, boolean allocateAllGroups) {
        +    public static void inherit(PythonClass klass, PDict namespace, MroSequenceStorage mro, boolean allocateAllGroups) {
        +        Builder klassSlots = buildInherited(klass, null, mro, allocateAllGroups);
        +        klass.setTpSlots(klassSlots.build());
        +    }
        +
        +    @TruffleBoundary
        +    public static TpSlots.Builder buildInherited(PythonClass klass, PDict namespace, MroSequenceStorage mro, boolean allocateAllGroups) {
                 // partially implements CPython:type_ready_inherit
                 // slots of native classes are initialized in PyTruffle_AddInheritedSlots, they are just a
                 // mirror of the native slots initialized and inherited on the native side
        @@ -746,15 +1400,19 @@ public static void inherit(PythonClass klass, MroSequenceStorage mro, boolean al
                 if (allocateAllGroups) {
                     klassSlots.allocateAllGroups();
                 }
        +        if (klass.getBase() != null) {
        +            // tp_new is first inherited from tp_base in type_ready_set_new
        +            klassSlots.set(TpSlotMeta.TP_NEW, GetTpSlotsNode.executeUncached(klass.getBase()).tp_new());
        +        }
                 for (int i = 0; i < mro.length(); i++) {
                     PythonAbstractClass type = mro.getPythonClassItemNormalized(i);
                     TpSlots slots = GetTpSlotsNode.executeUncached(type);
                     assert slots != null || type == klass;
                     if (slots != null) {
        -                klassSlots.inherit(slots);
        +                klassSlots.inherit(klass, namespace, slots);
                     }
                 }
        -        klass.setTpSlots(klassSlots.build());
        +        return klassSlots;
             }
         
             public static boolean canBeSpecialMethod(TruffleString name, TruffleString.CodePointLengthNode codePointLengthNode, TruffleString.CodePointAtIndexNode codePointAtIndexNode) {
        @@ -789,6 +1447,11 @@ private static TpSlotMeta resolveSlotdups(Builder slots, TruffleString name) {
             /**
              * Mirrors CPython's {@code typeobject.c:fixup_slot_dispatchers}.
              */
        +    @TruffleBoundary
        +    public static void fixupSlotDispatchers(PythonClass klass, TpSlots.Builder slots) {
        +        updateSlots(klass, slots, SLOTDEFS.entrySet());
        +    }
        +
             @TruffleBoundary
             public static void fixupSlotDispatchers(PythonClass klass) {
                 updateSlots(klass, klass.getTpSlots(), SLOTDEFS.entrySet());
        @@ -879,19 +1542,18 @@ private static Builder updateSlots(PythonAbstractClass klass, Builder slots, Set
                     // dynamic lookup.
                     for (int i = 0; i < defs.length; i++) {
                         TruffleString name = defs[i].name();
        -                Object decr = lookup.execute(klass, name);
        -                genericCallables[i] = decr;
        +                Object descr = lookup.execute(klass, name);
        +                genericCallables[i] = descr;
                         genericCallablesNames[i] = name;
        -                if (decr == PNone.NO_VALUE) {
        -                    /*- TODO:
        -                    if (ptr == (void**)&type->tp_iternext) {
        -                        specific = (void *)_PyObject_NextNotImplemented;
        -                    }*/
        +                if (descr == PNone.NO_VALUE) {
        +                    if (slot == TpSlotMeta.TP_ITERNEXT) {
        +                        specific = NEXT_NOT_IMPLEMENTED;
        +                    }
                             continue;
                         }
                         // Is the value a builtin function (in CPython PyWrapperDescr_Type) that wraps a
                         // builtin or native slot?
        -                if (decr instanceof PBuiltinFunction builtin && builtin.getSlot() != null) {
        +                if (descr instanceof PBuiltinFunction builtin && builtin.getSlot() != null) {
                             /*
                              * CPython source comment: if the special method is a wrapper_descriptor with
                              * the correct name but the type has precisely one slot set for that name and
        @@ -930,38 +1592,61 @@ private static Builder updateSlots(PythonAbstractClass klass, Builder slots, Set
                                  */
                                 useGeneric = true;
                             }
        -
        -                    // TODO: special cases:
        -                    // PyCFunction_Type && tp_new (looks like just optimization)
        -                    // descr == Py_None && ptr == (void**)&type->tp_hash ->
        -                    // PyObject_HashNotImplemented
        +                } else if (slot == TpSlotMeta.TP_NEW && descr instanceof PBuiltinMethod method && method.getBuiltinFunction().getSlot() != null &&
        +                                !(slots.get(TpSlotMeta.TP_NEW) instanceof TpSlotPython)) {
        +                    /*
        +                     * From CPython: The __new__ wrapper is not a wrapper descriptor, so must be
        +                     * special-cased differently. If we don't do this, creating an instance will
        +                     * always use slot_tp_new which will look up __new__ in the MRO which will call
        +                     * tp_new_wrapper which will look through the base classes looking for a static
        +                     * base and call its tp_new (usually PyType_GenericNew), after performing
        +                     * various sanity checks and constructing a new argument list. Cut all that
        +                     * nonsense short -- this speeds up instance creation tremendously.
        +                     */
        +                    /*
        +                     * msimacek note: This optimization is not implemented correctly in CPython -
        +                     * it's missing a check that the method is for the same type. This can manifest
        +                     * with multiple-inheritance when the __new__ method inherited from the MRO is
        +                     * different from the current value in tp_new, which was populated from
        +                     * tp_base->tp_new earlier. If the one from tp_base is a wrapper, it will pass
        +                     * this check and stay in the slot, diverging from the __new__ wrapper inherited
        +                     * in MRO. This behavior is already relied upon in the wild (pandas) so we don't
        +                     * check the type either.
        +                     *
        +                     * The last part of the condition is GraalPy-specific because we cache the
        +                     * Python method in the slot. So we make it go to the generic path to make sure
        +                     * it creates a new wrapper for the right method.
        +                     *
        +                     * See test_tp_new_bug_to_bug_compatibility in cpyext/test_object.py
        +                     */
        +                    specific = slots.get(TpSlotMeta.TP_NEW);
        +                } else if (descr == PNone.NONE && slot == TpSlotMeta.TP_HASH) {
        +                    specific = TpSlotHashFun.HASH_NOT_IMPLEMENTED;
                         } else {
                             useGeneric = true;
                             generic = defs[i].functionFactory;
                         }
                     }
         
        +            TpSlot newValue = null;
                     if (specific != null && !useGeneric) {
        -                slots.set(slot, specific);
        -            } else {
        -                TpSlot newValue = null;
        -                if (generic != null) {
        -                    newValue = generic.create(genericCallables, genericCallablesNames, klass);
        -                }
        -                slots.set(slot, newValue);
        -                if (klass instanceof PythonAbstractNativeObject nativeClass) {
        -                    // Update the slots on the native side if this is a native class
        -                    toNative(nativeClass.getPtr(), slot, newValue, nativeNull);
        -                }
        -                if (klass instanceof PythonManagedClass managedClass) {
        -                    // Update the slots on the native side if this is a managed class that has a
        -                    // native mirror allocated already
        -                    PythonClassNativeWrapper classNativeWrapper = managedClass.getClassNativeWrapper();
        -                    if (classNativeWrapper != null) {
        -                        Object replacement = classNativeWrapper.getReplacementIfInitialized();
        -                        if (replacement != null) {
        -                            toNative(replacement, slot, newValue, nativeNull);
        -                        }
        +                newValue = specific;
        +            } else if (generic != null) {
        +                newValue = generic.create(genericCallables, genericCallablesNames, klass);
        +            }
        +            slots.set(slot, newValue);
        +            if (klass instanceof PythonAbstractNativeObject nativeClass) {
        +                // Update the slots on the native side if this is a native class
        +                toNative(nativeClass.getPtr(), slot, newValue, nativeNull);
        +            }
        +            if (klass instanceof PythonManagedClass managedClass) {
        +                // Update the slots on the native side if this is a managed class that has a
        +                // native mirror allocated already
        +                PythonClassNativeWrapper classNativeWrapper = managedClass.getClassNativeWrapper();
        +                if (classNativeWrapper != null) {
        +                    Object replacement = classNativeWrapper.getReplacementIfInitialized();
        +                    if (replacement != null) {
        +                        toNative(replacement, slot, newValue, nativeNull);
                             }
                         }
                     }
        @@ -1010,7 +1695,7 @@ private static boolean checkNoMagicOverrides(Python3Core core, PythonBuiltinClas
                 return true;
             }
         
        -    public static void addOperatorsToBuiltin(Map> builtins, Python3Core core, PythonBuiltinClassType type) {
        +    public static void addOperatorsToBuiltin(Python3Core core, PythonBuiltinClassType type, PythonBuiltinClass pythonBuiltinClass) {
                 TpSlots slots = type.getDeclaredSlots();
                 assert checkNoMagicOverrides(core, type);
         
        @@ -1018,75 +1703,31 @@ public static void addOperatorsToBuiltin(Map builtinSlot)) {
                         continue;
                     }
                     for (TpSlotDef slotDef : slotDefGroup.getValue()) {
        -                if (slotDef.wrapper() != null && !builtins.containsKey(slotDef.name())) {
        +                if (slotDef.wrapper() != null && pythonBuiltinClass.getAttribute(slotDef.name()) == PNone.NO_VALUE) {
                             var value = builtinSlot.createBuiltin(core, type, slotDef.name(), slotDef.wrapper());
        -                    builtins.put(slotDef.name(), value);
        +                    pythonBuiltinClass.setAttribute(slotDef.name(), value);
                         }
                     }
                 }
             }
         
        -    /**
        -     * Version of CPython's {@code add_operators} that assumes only native slots. This is useful for
        -     * the HPy case where users cannot "steal" other type's slots or builtin slots. TODO: (GR-53923)
        -     * extend this to support python/builtin slots, use it instead of PyTruffleType_AddSlot upcalls.
        -     */
        -    @TruffleBoundary
        -    public void addOperators(PythonClass type) {
        -        // Current version assumes no dict and writes to the object directly
        -        assert GetDictIfExistsNode.getUncached().execute(type) == null;
        -
        -        PythonContext context = PythonContext.get(null);
        -        var factory = context.factory();
        -        PythonLanguage language = context.getLanguage();
        -        for (Entry slotDefEntry : SLOTDEFS.entrySet()) {
        -            TpSlotMeta tpSlotMeta = slotDefEntry.getKey();
        -            for (TpSlotDef tpSlotDef : slotDefEntry.getValue()) {
        -                if (tpSlotDef.wrapper == null) {
        -                    continue;
        -                }
        -                TpSlot value = tpSlotMeta.getValue(this);
        -                if (value == null) {
        -                    continue;
        -                }
        -                Object existingValue = ReadAttributeFromObjectNode.getUncachedForceType().execute(type, tpSlotDef.name);
        -                if (!PGuards.isNoValue(existingValue)) {
        -                    continue;
        -                }
        -                // TODO: special case for PyObject_HashNotImplemented once we have tp_hash
        -                Object wrapperDescriptor = null;
        -                if (value instanceof TpSlotBuiltin builtinSlot) {
        -                    wrapperDescriptor = builtinSlot.createBuiltin(context, type, tpSlotDef.name, tpSlotDef.wrapper);
        -                } else if (value instanceof TpSlotPython) {
        -                    // TODO: see CExtNodes$CreateFunctionNode
        -                    throw new IllegalStateException("addOperators: TpSlotPython not implemented yet");
        -                } else if (value instanceof TpSlotNative nativeSlot) {
        -                    if (nativeSlot instanceof TpSlotHPyNative hpySlot) {
        -                        wrapperDescriptor = HPyExternalFunctionNodes.createWrapperFunction(language, context.getHPyContext(), tpSlotDef.hpyWrapper, hpySlot, tpSlotDef.wrapper, tpSlotDef.name,
        -                                        nativeSlot.getCallable(), type,
        -                                        factory);
        -                    } else {
        -                        wrapperDescriptor = PExternalFunctionWrapper.createWrapperFunction(tpSlotDef.name, (TpSlotCExtNative) nativeSlot, type, tpSlotDef.wrapper, language, factory);
        -                    }
        -                }
        -                assert wrapperDescriptor != null;
        -                // TODO: optionally take TpDict and write into it if provided
        -                WriteAttributeToPythonObjectNode.executeUncached(type, tpSlotDef.name, wrapperDescriptor);
        -            }
        -        }
        -    }
        -
             public Builder copy() {
                 var result = new Builder();
                 for (TpSlotMeta def : TpSlotMeta.VALUES) {
                     result.set(def, def.getValue(this));
                 }
                 for (TpSlotGroup group : TpSlotGroup.VALID_VALUES) {
        -            result.setExplicitGroup(group);
        +            if (group.getValue(this)) {
        +                result.setExplicitGroup(group);
        +            }
                 }
                 return result;
             }
        @@ -1095,10 +1736,6 @@ public static Builder newBuilder() {
                 return new Builder();
             }
         
        -    public static TpSlots merge(TpSlots a, TpSlots b) {
        -        return a.copy().merge(b).build();
        -    }
        -
             public static final class Builder {
                 private final TpSlot[] values = new TpSlot[TpSlotMeta.VALUES.length];
                 private final boolean[] explicitGroups = new boolean[TpSlotGroup.VALID_VALUES.length];
        @@ -1128,45 +1765,60 @@ public Builder overrideIgnoreGroups(TpSlots other) {
                     return this;
                 }
         
        -        private Builder inherit(TpSlots other) {
        +        private Builder inherit(PythonClass klass, PDict namespace, TpSlots base) {
                     // similar to CPython:inherit_slots
                     // indirect slots (from tp_as_number etc.) are not inherited if the group is not
                     // allocated explicitly. Note: native heap types and managed types have always all
                     // groups allocated.
                     for (TpSlotMeta def : TpSlotMeta.VALUES) {
        +                if (def == TpSlotMeta.TP_RICHCOMPARE || def == TpSlotMeta.TP_HASH ||
        +                                def == TpSlotMeta.TP_GETATTRO || def == TpSlotMeta.TP_GETATTR ||
        +                                def == TpSlotMeta.TP_SETATTRO || def == TpSlotMeta.TP_SETATTR) {
        +                    // handled manually below the loop
        +                    continue;
        +                }
                         if (def.group != TpSlotGroup.NO_GROUP && !explicitGroups[def.group.ordinal()]) {
                             continue;
                         }
                         TpSlot current = values[def.ordinal()];
        -                TpSlot otherValue = def.getter.get(other);
        +                TpSlot otherValue = def.getter.get(base);
                         TpSlot newValue = current != null ? current : otherValue;
                         set(def, newValue);
                     }
        +            if (get(TpSlotMeta.TP_GETATTR) == null && get(TpSlotMeta.TP_GETATTRO) == null) {
        +                set(TpSlotMeta.TP_GETATTR, base.tp_getattr());
        +                set(TpSlotMeta.TP_GETATTRO, base.tp_getattro());
        +            }
        +            if (get(TpSlotMeta.TP_SETATTR) == null && get(TpSlotMeta.TP_SETATTRO) == null) {
        +                set(TpSlotMeta.TP_SETATTR, base.tp_setattr());
        +                set(TpSlotMeta.TP_SETATTRO, base.tp_setattro());
        +            }
        +            if (get(TpSlotMeta.TP_RICHCOMPARE) == null && get(TpSlotMeta.TP_HASH) == null) {
        +                if (!overridesHash(namespace)) {
        +                    set(TpSlotMeta.TP_RICHCOMPARE, base.tp_richcmp());
        +                    set(TpSlotMeta.TP_HASH, base.tp_hash());
        +                }
        +            }
                     return this;
                 }
         
        -        /**
        -         * Should be used when merging together generated slots from two or more
        -         * {@link com.oracle.graal.python.builtins.PythonBuiltins}. Checks that slots are not
        -         * overriding each other.
        -         */
        -        public Builder merge(TpSlots other) {
        -            for (TpSlotMeta def : TpSlotMeta.VALUES) {
        -                TpSlot current = values[def.ordinal()];
        -                TpSlot otherValue = def.getter.get(other);
        -                if (otherValue != null) {
        -                    assert current == null : def.name();
        -                    set(def, otherValue);
        -                }
        +        private static boolean overridesHash(PDict namespace) {
        +            if (namespace == null) {
        +                return false;
                     }
        -            return this;
        +            Object eq = HashingStorageGetItem.executeUncached(namespace.getDictStorage(), T___EQ__);
        +            if (eq == null) {
        +                Object hash = HashingStorageGetItem.executeUncached(namespace.getDictStorage(), T___HASH__);
        +                return hash != null;
        +            }
        +            return true;
                 }
         
                 private TpSlot fistNonNull(TpSlotMeta a, TpSlotMeta b) {
                     return values[a.ordinal()] != null ? values[a.ordinal()] : values[b.ordinal()];
                 }
         
        -        private TpSlot get(TpSlotMeta s) {
        +        TpSlot get(TpSlotMeta s) {
                     return values[s.ordinal()];
                 }
         
        @@ -1190,27 +1842,77 @@ public TpSlots build() {
                     TpSlot tp_set_attro_attr = fistNonNull(TpSlotMeta.TP_SETATTRO, TpSlotMeta.TP_SETATTR);
                     return new TpSlots(
                                     get(TpSlotMeta.NB_BOOL), //
        +                            get(TpSlotMeta.NB_INDEX), //
        +                            get(TpSlotMeta.NB_INT), //
        +                            get(TpSlotMeta.NB_FLOAT), //
        +                            get(TpSlotMeta.NB_ABSOLUTE), //
        +                            get(TpSlotMeta.NB_POSITIVE), //
        +                            get(TpSlotMeta.NB_NEGATIVE), //
        +                            get(TpSlotMeta.NB_INVERT), //
                                     get(TpSlotMeta.NB_ADD), //
        +                            get(TpSlotMeta.NB_SUBTRACT), //
                                     get(TpSlotMeta.NB_MULTIPLY), //
        +                            get(TpSlotMeta.NB_REMAINDER), //
        +                            get(TpSlotMeta.NB_LSHIFT), //
        +                            get(TpSlotMeta.NB_RSHIFT), //
        +                            get(TpSlotMeta.NB_AND), //
        +                            get(TpSlotMeta.NB_XOR), //
        +                            get(TpSlotMeta.NB_OR), //
        +                            get(TpSlotMeta.NB_FLOOR_DIVIDE), //
        +                            get(TpSlotMeta.NB_TRUE_DIVIDE), //
        +                            get(TpSlotMeta.NB_DIVMOD), //
        +                            get(TpSlotMeta.NB_MATRIX_MULTIPLY), //
        +                            get(TpSlotMeta.NB_POWER), //
        +                            get(TpSlotMeta.NB_INPLACE_ADD), //
        +                            get(TpSlotMeta.NB_INPLACE_SUBTRACT), //
        +                            get(TpSlotMeta.NB_INPLACE_MULTIPLY), //
        +                            get(TpSlotMeta.NB_INPLACE_REMAINDER), //
        +                            get(TpSlotMeta.NB_INPLACE_LSHIFT), //
        +                            get(TpSlotMeta.NB_INPLACE_RSHIFT), //
        +                            get(TpSlotMeta.NB_INPLACE_AND), //
        +                            get(TpSlotMeta.NB_INPLACE_XOR), //
        +                            get(TpSlotMeta.NB_INPLACE_OR), //
        +                            get(TpSlotMeta.NB_INPLACE_FLOOR_DIVIDE), //
        +                            get(TpSlotMeta.NB_INPLACE_TRUE_DIVIDE), //
        +                            get(TpSlotMeta.NB_INPLACE_MATRIX_MULTIPLY), //
        +                            get(TpSlotMeta.NB_INPLACE_POWER), //
                                     get(TpSlotMeta.SQ_LENGTH), //
                                     get(TpSlotMeta.SQ_ITEM), //
        +                            get(TpSlotMeta.SQ_ASS_ITEM), //
                                     get(TpSlotMeta.SQ_CONCAT), //
                                     get(TpSlotMeta.SQ_REPEAT), //
        +                            get(TpSlotMeta.SQ_INPLACE_CONCAT), //
        +                            get(TpSlotMeta.SQ_INPLACE_REPEAT), //
        +                            get(TpSlotMeta.SQ_CONTAINS), //
                                     get(TpSlotMeta.MP_LENGTH), //
                                     get(TpSlotMeta.MP_SUBSCRIPT), //
        +                            get(TpSlotMeta.MP_ASS_SUBSCRIPT), //
                                     sq_mp_length, //
                                     mp_sq_length, //
        +                            get(TpSlotMeta.TP_RICHCOMPARE), //
                                     get(TpSlotMeta.TP_DESCR_GET), //
                                     get(TpSlotMeta.TP_DESCR_SET), //
        +                            get(TpSlotMeta.TP_HASH), //
                                     get(TpSlotMeta.TP_GETATTRO), //
                                     get(TpSlotMeta.TP_GETATTR), //
                                     tp_get_attro_attr,
                                     get(TpSlotMeta.TP_SETATTRO),
                                     get(TpSlotMeta.TP_SETATTR),
                                     tp_set_attro_attr,
        +                            get(TpSlotMeta.TP_ITER), //
        +                            get(TpSlotMeta.TP_ITERNEXT), //
        +                            get(TpSlotMeta.TP_REPR), //
        +                            get(TpSlotMeta.TP_STR), //
        +                            get(TpSlotMeta.TP_INIT), //
        +                            get(TpSlotMeta.TP_NEW), //
        +                            get(TpSlotMeta.TP_CALL), //
        +                            get(TpSlotMeta.AM_AWAIT), //
        +                            get(TpSlotMeta.AM_AITER), //
        +                            get(TpSlotMeta.AM_ANEXT), //
                                     hasGroup(TpSlotGroup.AS_NUMBER),
                                     hasGroup(TpSlotGroup.AS_SEQUENCE),
        -                            hasGroup(TpSlotGroup.AS_MAPPING));
        +                            hasGroup(TpSlotGroup.AS_MAPPING),
        +                            hasGroup(TpSlotGroup.AS_ASYNC));
                 }
             }
         
        @@ -1302,6 +2004,10 @@ public final TpSlots executeCached(Object pythonObject) {
                     return execute(this, pythonObject);
                 }
         
        +        public static TpSlots executeUncached(Object pythonObject) {
        +            return GetObjectSlotsNodeGen.getUncached().execute(null, pythonObject);
        +        }
        +
                 @NeverDefault
                 public static GetObjectSlotsNode create() {
                     return GetObjectSlotsNodeGen.create();
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeBuiltins.java
        index db97380f28..796dfbad88 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2017, 2024, Oracle and/or its affiliates.
        + * Copyright (c) 2017, 2025, Oracle and/or its affiliates.
          * Copyright (c) 2014, Regents of the University of California
          *
          * All rights reserved.
        @@ -50,33 +50,25 @@
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___ABSTRACTMETHODS__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___ANNOTATIONS__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___BASES__;
        -import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___CLASS__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DICT__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DOC__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___MODULE__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___QUALNAME__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J_MRO;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DIR__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INIT__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INSTANCECHECK__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OR__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___PREPARE__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROR__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SUBCLASSCHECK__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SUBCLASSES__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SUBCLASSHOOK__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T_MRO;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T_UPDATE;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GET__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INIT__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEW__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MRO_ENTRIES__;
         import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError;
        +import static com.oracle.graal.python.runtime.exception.PythonErrorType.NotImplementedError;
         import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
         import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
        -import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
         
         import java.util.Arrays;
         import java.util.List;
        @@ -84,17 +76,16 @@
         import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.annotations.Slot;
         import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
        -import com.oracle.graal.python.builtins.modules.BuiltinConstructorsFactory;
         import com.oracle.graal.python.builtins.modules.SysModuleBuiltins;
         import com.oracle.graal.python.builtins.objects.PNone;
         import com.oracle.graal.python.builtins.objects.PNotImplemented;
         import com.oracle.graal.python.builtins.objects.bytes.PBytes;
         import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
        -import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass;
         import com.oracle.graal.python.builtins.objects.cext.capi.PySequenceArrayWrapper;
         import com.oracle.graal.python.builtins.objects.cext.structs.CFields;
         import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess;
        @@ -102,26 +93,21 @@
         import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetObjectArrayNode;
         import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ToArrayNode;
         import com.oracle.graal.python.builtins.objects.dict.PDict;
        +import com.oracle.graal.python.builtins.objects.exception.AttributeErrorBuiltins;
         import com.oracle.graal.python.builtins.objects.function.AbstractFunctionBuiltins;
        -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor;
        -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
        -import com.oracle.graal.python.builtins.objects.function.PFunction;
         import com.oracle.graal.python.builtins.objects.function.PKeyword;
        -import com.oracle.graal.python.builtins.objects.function.Signature;
         import com.oracle.graal.python.builtins.objects.getsetdescriptor.DescriptorDeleteMarker;
         import com.oracle.graal.python.builtins.objects.list.PList;
        -import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
        -import com.oracle.graal.python.builtins.objects.method.PMethod;
        -import com.oracle.graal.python.builtins.objects.object.ObjectBuiltinsFactory;
        +import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins;
         import com.oracle.graal.python.builtins.objects.object.ObjectNodes;
        -import com.oracle.graal.python.builtins.objects.object.PythonObject;
         import com.oracle.graal.python.builtins.objects.set.PSet;
         import com.oracle.graal.python.builtins.objects.str.PString;
         import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode;
         import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode;
        -import com.oracle.graal.python.builtins.objects.type.TypeBuiltinsFactory.CallNodeFactory;
        -import com.oracle.graal.python.builtins.objects.type.TypeBuiltinsFactory.CallNodeHelperNodeGen;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetTpSlotsNode;
        +import com.oracle.graal.python.builtins.objects.type.TypeBuiltinsFactory.TypeNodeFactory;
         import com.oracle.graal.python.builtins.objects.type.TypeNodes.CheckCompatibleForAssigmentNode;
         import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetBaseClassNode;
         import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetBestBaseClassNode;
        @@ -132,15 +118,18 @@
         import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode;
         import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlot;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.CallSlotDescrGet;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrSet;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotGetAttr.GetAttrBuiltinNode;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSetAttr.SetAttrBuiltinNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotVarargs;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotVarargs.CallSlotTpInitNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotVarargs.CallSlotTpNewNode;
         import com.oracle.graal.python.builtins.objects.types.GenericTypeNodes;
         import com.oracle.graal.python.lib.PyObjectIsTrueNode;
         import com.oracle.graal.python.lib.PyObjectLookupAttr;
         import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode;
        -import com.oracle.graal.python.lib.PyTupleCheckNode;
         import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PConstructAndRaiseNode;
         import com.oracle.graal.python.nodes.PGuards;
        @@ -150,33 +139,22 @@
         import com.oracle.graal.python.nodes.StringLiterals;
         import com.oracle.graal.python.nodes.attributes.GetAttributeNode.GetFixedAttributeNode;
         import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode;
        -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode;
         import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
         import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
        -import com.oracle.graal.python.nodes.builtins.FunctionNodes;
        -import com.oracle.graal.python.nodes.call.special.CallTernaryMethodNode;
        -import com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode;
        -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode;
        -import com.oracle.graal.python.nodes.classes.AbstractObjectGetBasesNode;
        -import com.oracle.graal.python.nodes.classes.AbstractObjectIsSubclassNode;
         import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
        -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassExactProfile;
        -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile;
         import com.oracle.graal.python.nodes.object.GetClassNode;
         import com.oracle.graal.python.nodes.object.GetDictIfExistsNode;
        -import com.oracle.graal.python.nodes.truffle.PythonTypes;
         import com.oracle.graal.python.nodes.util.CannotCastException;
         import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
        -import com.oracle.graal.python.nodes.util.SplitArgsNode;
         import com.oracle.graal.python.runtime.PythonContext;
         import com.oracle.graal.python.runtime.exception.PException;
         import com.oracle.graal.python.runtime.exception.PythonErrorType;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.graal.python.util.PythonUtils;
         import com.oracle.truffle.api.CompilerDirectives;
         import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
        @@ -192,11 +170,10 @@
         import com.oracle.truffle.api.dsl.ImportStatic;
         import com.oracle.truffle.api.dsl.NeverDefault;
         import com.oracle.truffle.api.dsl.NodeFactory;
        -import com.oracle.truffle.api.dsl.ReportPolymorphism;
         import com.oracle.truffle.api.dsl.Specialization;
        -import com.oracle.truffle.api.dsl.TypeSystemReference;
         import com.oracle.truffle.api.frame.VirtualFrame;
         import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.profiles.BranchProfile;
         import com.oracle.truffle.api.profiles.InlinedBranchProfile;
         import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         import com.oracle.truffle.api.strings.TruffleString;
        @@ -210,7 +187,7 @@ protected List> getNodeFa
                 return TypeBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
             @GenerateNodeFactory
             @ImportStatic(SpecialAttributeNames.class)
             abstract static class ReprNode extends PythonUnaryBuiltinNode {
        @@ -241,43 +218,41 @@ static TruffleString repr(VirtualFrame frame, Object self,
         
             @Builtin(name = J___DOC__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, isGetter = true, isSetter = true, allowsDelete = true)
             @GenerateNodeFactory
        -    @ImportStatic(SpecialAttributeNames.class)
             public abstract static class DocNode extends PythonBinaryBuiltinNode {
         
        -        private static final TruffleString BUILTIN_DOC = tsLiteral("type(object_or_name, bases, dict)\n" + //
        -                        "type(object) -> the object's type\n" + //
        -                        "type(name, bases, dict) -> a new type");
        -
                 @Specialization(guards = "isNoValue(value)")
        -        Object getDoc(PythonBuiltinClassType self, @SuppressWarnings("unused") PNone value) {
        -            return getDoc(getContext().lookupType(self), value);
        +        static Object getDoc(PythonBuiltinClassType self, @SuppressWarnings("unused") PNone value) {
        +            return self.getDoc() != null ? self.getDoc() : PNone.NONE;
                 }
         
                 @Specialization(guards = "isNoValue(value)")
                 @TruffleBoundary
                 static Object getDoc(PythonBuiltinClass self, @SuppressWarnings("unused") PNone value) {
        -            // see type.c#type_get_doc()
        -            if (IsBuiltinClassExactProfile.profileClassSlowPath(self, PythonBuiltinClassType.PythonClass)) {
        -                return BUILTIN_DOC;
        -            } else {
        -                return self.getAttribute(T___DOC__);
        -            }
        +            return getDoc(self.getType(), value);
                 }
         
                 @Specialization(guards = {"isNoValue(value)", "!isPythonBuiltinClass(self)"})
        -        static Object getDoc(VirtualFrame frame, PythonClass self, @SuppressWarnings("unused") PNone value) {
        +        static Object getDoc(VirtualFrame frame, PythonClass self, @SuppressWarnings("unused") PNone value,
        +                        @Bind Node inliningTarget,
        +                        @Cached ReadAttributeFromObjectNode read,
        +                        @Cached GetClassNode getClassNode,
        +                        @Cached GetCachedTpSlotsNode getSlots,
        +                        @Cached CallSlotDescrGet callGet) {
                     // see type.c#type_get_doc()
        -            Object res = self.getAttribute(T___DOC__);
        -            Object resClass = GetClassNode.executeUncached(res);
        -            Object get = LookupAttributeInMRONode.Dynamic.getUncached().execute(resClass, T___GET__);
        -            if (PGuards.isCallable(get)) {
        -                return CallTernaryMethodNode.getUncached().execute(frame, get, res, PNone.NONE, self);
        +            Object res = read.execute(self, T___DOC__);
        +            if (res == NO_VALUE) {
        +                return PNone.NONE;
        +            }
        +            Object resClass = getClassNode.execute(inliningTarget, res);
        +            TpSlots resSlots = getSlots.execute(inliningTarget, resClass);
        +            if (resSlots.tp_descr_get() != null) {
        +                return callGet.execute(frame, inliningTarget, resSlots.tp_descr_get(), res, NO_VALUE, self);
                     }
                     return res;
                 }
         
                 @Specialization
        -        static Object getDoc(PythonNativeClass self, @SuppressWarnings("unused") PNone value) {
        +        static Object getDoc(PythonAbstractNativeObject self, @SuppressWarnings("unused") PNone value) {
                     return ReadAttributeFromObjectNode.getUncachedForceType().execute(self, T___DOC__);
                 }
         
        @@ -289,31 +264,30 @@ static Object setDoc(PythonClass self, Object value) {
         
                 @Specialization(guards = {"!isNoValue(value)", "!isDeleteMarker(value)", "isKindOfBuiltinClass(self)"})
                 static Object doc(Object self, @SuppressWarnings("unused") Object value,
        -                        @Shared @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, T___DOC__, self);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, T___DOC__, self);
                 }
         
                 @Specialization
                 static Object doc(Object self, @SuppressWarnings("unused") DescriptorDeleteMarker marker,
        -                        @Shared @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.CANT_DELETE_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, T___DOC__, self);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.TypeError, ErrorMessages.CANT_DELETE_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, T___DOC__, self);
                 }
             }
         
             @Builtin(name = J___MRO__, minNumOfPositionalArgs = 1, isGetter = true)
             @GenerateNodeFactory
        -    abstract static class MroAttrNode extends PythonBuiltinNode {
        +    abstract static class MroAttrNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static Object doit(Object klass,
                                 @Bind("this") Node inliningTarget,
                                 @Cached TypeNodes.GetMroNode getMroNode,
        -                        @Cached InlinedConditionProfile notInitialized,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Cached InlinedConditionProfile notInitialized) {
                     if (notInitialized.profile(inliningTarget, klass instanceof PythonManagedClass && !((PythonManagedClass) klass).isMROInitialized())) {
                         return PNone.NONE;
                     }
                     PythonAbstractClass[] mro = getMroNode.execute(inliningTarget, klass);
        -            return factory.createTuple(mro);
        +            return PFactory.createTuple(PythonLanguage.get(inliningTarget), mro);
                 }
             }
         
        @@ -324,314 +298,217 @@ public abstract static class MroNode extends PythonUnaryBuiltinNode {
                 static Object doit(Object klass,
                                 @SuppressWarnings("unused") @Bind("this") Node inliningTarget,
                                 @SuppressWarnings("unused") @Cached TypeNodes.IsTypeNode isTypeNode,
        -                        @Cached GetMroNode getMroNode,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Cached GetMroNode getMroNode) {
                     PythonAbstractClass[] mro = getMroNode.execute(inliningTarget, klass);
        -            return factory.createList(Arrays.copyOf(mro, mro.length, Object[].class));
        +            return PFactory.createList(PythonLanguage.get(inliningTarget), Arrays.copyOf(mro, mro.length, Object[].class));
                 }
         
                 @Fallback
                 @SuppressWarnings("unused")
                 static Object doit(Object object,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, T_MRO, "type", object);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, T_MRO, "type", object);
                 }
             }
         
        -    @Builtin(name = J___INIT__, takesVarArgs = true, minNumOfPositionalArgs = 1, takesVarKeywordArgs = true)
        +    // type(object, bases, dict)
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true, needsFrame = true)
             @GenerateNodeFactory
        -    public abstract static class InitNode extends PythonVarargsBuiltinNode {
        -        @Child private SplitArgsNode splitArgsNode;
        +    public abstract static class TypeNode extends PythonVarargsBuiltinNode {
        +        @Child private IsSubtypeNode isSubtypeNode;
        +        @Child private TypeNodes.IsAcceptableBaseNode isAcceptableBaseNode;
        +        private final BranchProfile errorProfile = BranchProfile.create();
        +
        +        public abstract Object execute(VirtualFrame frame, Object cls, Object name, Object bases, Object dict, PKeyword[] kwds);
         
                 @Override
        -        public final Object varArgExecute(VirtualFrame frame, @SuppressWarnings("unused") Object self, Object[] arguments, PKeyword[] keywords) throws VarargsBuiltinDirectInvocationNotSupported {
        -            if (splitArgsNode == null) {
        -                CompilerDirectives.transferToInterpreterAndInvalidate();
        -                splitArgsNode = insert(SplitArgsNode.create());
        +        public final Object execute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) {
        +            if (arguments.length == 3) {
        +                return execute(frame, self, arguments[0], arguments[1], arguments[2], keywords);
        +            } else {
        +                errorProfile.enter();
        +                throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.TAKES_EXACTLY_D_ARGUMENTS_D_GIVEN, "type.__new__", 3, arguments.length);
                     }
        -            return execute(frame, arguments[0], splitArgsNode.executeCached(arguments), keywords);
                 }
         
        -        @Specialization
        -        Object init(@SuppressWarnings("unused") Object self, Object[] arguments, @SuppressWarnings("unused") PKeyword[] kwds) {
        -            if (arguments.length != 1 && arguments.length != 3) {
        -                throw raise(TypeError, ErrorMessages.TAKES_D_OR_D_ARGS, "type.__init__()", 1, 3);
        +        @Specialization(guards = "isString(wName)")
        +        @SuppressWarnings("truffle-static-method")
        +        Object typeNew(VirtualFrame frame, Object cls, Object wName, PTuple bases, PDict namespaceOrig, PKeyword[] kwds,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached GetClassNode getClassNode,
        +                        @Cached GetCachedTpSlotsNode getSlots,
        +                        @Cached CallSlotTpNewNode callNew,
        +                        @Cached IsTypeNode isTypeNode,
        +                        @Cached PyObjectLookupAttr lookupMroEntriesNode,
        +                        @Cached CastToTruffleStringNode castStr,
        +                        @Cached TypeNodes.CreateTypeNode createType,
        +                        @Cached GetObjectArrayNode getObjectArrayNode) {
        +            // Determine the proper metatype to deal with this
        +            TruffleString name = castStr.execute(inliningTarget, wName);
        +            Object metaclass = cls;
        +            Object winner = calculateMetaclass(frame, inliningTarget, metaclass, bases, getClassNode, isTypeNode, lookupMroEntriesNode, getObjectArrayNode);
        +            if (winner != metaclass) {
        +                TpSlot winnerNew = getSlots.execute(inliningTarget, winner).tp_new();
        +                if (winnerNew != SLOTS.tp_new()) {
        +                    // Pass it to the winner
        +                    return callNew.execute(frame, inliningTarget, winnerNew, winner, new Object[]{name, bases, namespaceOrig}, kwds);
        +                }
        +                metaclass = winner;
                     }
        -            return PNone.NONE;
        -        }
        -    }
         
        -    @Builtin(name = J___CALL__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
        -    @GenerateNodeFactory
        -    public abstract static class CallNode extends PythonVarargsBuiltinNode {
        -        @Child CallNodeHelper callNodeHelper;
        +            return createType.execute(frame, namespaceOrig, name, bases, metaclass, kwds);
        +        }
         
        -        @NeverDefault
        -        public static CallNode create() {
        -            return CallNodeFactory.create();
        +        @Fallback
        +        Object generic(@SuppressWarnings("unused") Object cls, @SuppressWarnings("unused") Object name, Object bases, Object namespace, @SuppressWarnings("unused") PKeyword[] kwds) {
        +            if (!(bases instanceof PTuple)) {
        +                throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.ARG_D_MUST_BE_S_NOT_P, "type.__new__()", 2, "tuple", bases);
        +            } else if (!(namespace instanceof PDict)) {
        +                throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.ARG_D_MUST_BE_S_NOT_P, "type.__new__()", 3, "dict", bases);
        +            } else {
        +                throw CompilerDirectives.shouldNotReachHere("type fallback reached incorrectly");
        +            }
                 }
         
        -        @Override
        -        public final Object varArgExecute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) {
        -            return execute(frame, self, arguments, keywords);
        +        private Object calculateMetaclass(VirtualFrame frame, Node inliningTarget, Object cls, PTuple bases, GetClassNode getClassNode, IsTypeNode isTypeNode,
        +                        PyObjectLookupAttr lookupMroEntries, GetObjectArrayNode getObjectArrayNode) {
        +            Object winner = cls;
        +            for (Object base : getObjectArrayNode.execute(inliningTarget, bases)) {
        +                if (!isTypeNode.execute(inliningTarget, base) && lookupMroEntries.execute(frame, inliningTarget, base, T___MRO_ENTRIES__) != NO_VALUE) {
        +                    throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.TYPE_DOESNT_SUPPORT_MRO_ENTRY_RESOLUTION);
        +                }
        +                if (!ensureIsAcceptableBaseNode().execute(base)) {
        +                    throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.TYPE_IS_NOT_ACCEPTABLE_BASE_TYPE, base);
        +                }
        +                Object typ = getClassNode.execute(inliningTarget, base);
        +                if (isSubType(winner, typ)) {
        +                    continue;
        +                } else if (isSubType(typ, winner)) {
        +                    winner = typ;
        +                    continue;
        +                }
        +                throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.METACLASS_CONFLICT);
        +            }
        +            return winner;
                 }
         
        -        private CallNodeHelper getCallNodeHelper() {
        -            if (callNodeHelper == null) {
        +        protected boolean isSubType(Object subclass, Object superclass) {
        +            if (isSubtypeNode == null) {
                         CompilerDirectives.transferToInterpreterAndInvalidate();
        -                callNodeHelper = insert(CallNodeHelperNodeGen.create());
        +                isSubtypeNode = insert(IsSubtypeNode.create());
                     }
        -            return callNodeHelper;
        +            return isSubtypeNode.execute(subclass, superclass);
        +        }
        +
        +        @NeverDefault
        +        public static TypeNode create() {
        +            return TypeNodeFactory.create();
                 }
         
        -        @Specialization(guards = "isNoValue(self)")
        -        Object selfInArgs(VirtualFrame frame, @SuppressWarnings("unused") Object self, Object[] arguments, PKeyword[] keywords,
        +        @Specialization(guards = {"!isNoValue(bases)", "!isNoValue(dict)"})
        +        Object typeGeneric(VirtualFrame frame, Object cls, Object name, Object bases, Object dict, PKeyword[] kwds,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached CallNodeHelper callNodeHelper,
        -                        @Cached SplitArgsNode splitArgsNode,
        -                        @Exclusive @Cached IsSameTypeNode isSameTypeNode,
        -                        @Exclusive @Cached GetClassNode getClassNode) {
        -            if (isSameTypeNode.execute(inliningTarget, PythonBuiltinClassType.PythonClass, arguments[0])) {
        -                if (arguments.length == 2 && keywords.length == 0) {
        -                    return getClassNode.execute(inliningTarget, arguments[1]);
        -                } else if (arguments.length != 4) {
        -                    throw raise(TypeError, ErrorMessages.TAKES_D_OR_D_ARGS, "type()", 1, 3);
        -                }
        +                        @Cached TypeNode nextTypeNode,
        +                        @Cached PRaiseNode raiseNode,
        +                        @Exclusive @Cached IsTypeNode isTypeNode) {
        +            if (!(name instanceof TruffleString || name instanceof PString)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MUST_BE_STRINGS_NOT_P, "type() argument 1", name);
        +            } else if (!(bases instanceof PTuple)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MUST_BE_STRINGS_NOT_P, "type() argument 2", bases);
        +            } else if (!(dict instanceof PDict)) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MUST_BE_STRINGS_NOT_P, "type() argument 3", dict);
        +            } else if (!isTypeNode.execute(inliningTarget, cls)) {
        +                // TODO: this is actually allowed, deal with it
        +                throw raiseNode.raise(inliningTarget, NotImplementedError, ErrorMessages.CREATING_CLASS_NON_CLS_META_CLS);
        +            }
        +            return nextTypeNode.execute(frame, cls, name, bases, dict, kwds);
        +        }
        +
        +        private TypeNodes.IsAcceptableBaseNode ensureIsAcceptableBaseNode() {
        +            if (isAcceptableBaseNode == null) {
        +                CompilerDirectives.transferToInterpreterAndInvalidate();
        +                isAcceptableBaseNode = insert(TypeNodes.IsAcceptableBaseNode.create());
                     }
        -            return callNodeHelper.execute(frame, arguments[0], splitArgsNode.execute(inliningTarget, arguments), keywords);
        +            return isAcceptableBaseNode;
                 }
        +    }
         
        -        @Fallback
        -        Object selfSeparate(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords,
        +    @Slot(value = SlotKind.tp_init, isComplex = true)
        +    @SlotSignature(takesVarArgs = true, minNumOfPositionalArgs = 1, takesVarKeywordArgs = true)
        +    @GenerateNodeFactory
        +    public abstract static class InitNode extends PythonVarargsBuiltinNode {
        +
        +        @Specialization
        +        static Object init(@SuppressWarnings("unused") Object self, Object[] arguments, PKeyword[] kwds,
        +                        @Bind Node inliningTarget,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (arguments.length != 1 && arguments.length != 3) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.TAKES_D_OR_D_ARGS, "type.__init__()", 1, 3);
        +            }
        +            if (arguments.length == 1 && kwds.length != 0) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_TAKES_NO_KEYWORD_ARGS, "type.__init__()");
        +            }
        +            return PNone.NONE;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_call, isComplex = true)
        +    @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
        +    @GenerateNodeFactory
        +    public abstract static class CallNode extends PythonVarargsBuiltinNode {
        +
        +        @Specialization
        +        Object call(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords,
                                 @Bind("this") Node inliningTarget,
        -                        @Exclusive @Cached IsSameTypeNode isSameTypeNode,
        -                        @Exclusive @Cached GetClassNode getClassNode) {
        +                        @Cached IsSameTypeNode isSameTypeNode,
        +                        @Cached GetClassNode getClassNode,
        +                        @Cached PRaiseNode raiseNode,
        +                        @Cached CreateInstanceNode createInstanceNode) {
                     if (isSameTypeNode.execute(inliningTarget, PythonBuiltinClassType.PythonClass, self)) {
                         if (arguments.length == 1 && keywords.length == 0) {
                             return getClassNode.execute(inliningTarget, arguments[0]);
                         } else if (arguments.length != 3) {
        -                    throw raise(TypeError, ErrorMessages.TAKES_D_OR_D_ARGS, "type()", 1, 3);
        +                    throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.TAKES_D_OR_D_ARGS, "type()", 1, 3);
                         }
                     }
        -            return getCallNodeHelper().execute(frame, self, arguments, keywords);
        +            return createInstanceNode.execute(frame, inliningTarget, self, arguments, keywords);
                 }
             }
         
             @GenerateInline
             @GenerateCached(false)
        -    public abstract static class BindNew extends PNodeWithContext {
        -        public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object descriptor, Object type);
        -
        -        @Specialization
        -        static Object doBuiltinMethod(PBuiltinMethod descriptor, @SuppressWarnings("unused") Object type) {
        -            return descriptor;
        -        }
        +    protected abstract static class CreateInstanceNode extends PNodeWithContext {
         
        -        @Specialization
        -        static Object doBuiltinDescriptor(BuiltinMethodDescriptor descriptor, @SuppressWarnings("unused") Object type) {
        -            return descriptor;
        -        }
        +        abstract Object execute(VirtualFrame frame, Node inliningTarget, Object self, Object[] args, PKeyword[] keywords);
         
                 @Specialization
        -        static Object doFunction(PFunction descriptor, @SuppressWarnings("unused") Object type) {
        -            return descriptor;
        -        }
        -
        -        @Fallback
        -        static Object doBind(VirtualFrame frame, Node inliningTarget, Object descriptor, Object type,
        -                        @Cached GetObjectSlotsNode getSlotsNode,
        -                        @Cached CallSlotDescrGet callGetSlot) {
        -            var getMethod = getSlotsNode.execute(inliningTarget, descriptor).tp_descr_get();
        -            if (getMethod != null) {
        -                return callGetSlot.execute(frame, inliningTarget, getMethod, descriptor, NO_VALUE, type);
        +        static Object doGeneric(VirtualFrame frame, Node inliningTarget, Object type, Object[] arguments, PKeyword[] keywords,
        +                        @Cached InlinedConditionProfile builtinProfile,
        +                        @Cached GetCachedTpSlotsNode getTypeSlots,
        +                        @Cached GetCachedTpSlotsNode getInstanceSlots,
        +                        @Cached GetClassNode getInstanceClassNode,
        +                        @Cached IsSubtypeNode isSubtypeNode,
        +                        @Cached CallSlotTpNewNode callNew,
        +                        @Cached CallSlotTpInitNode callInit,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (builtinProfile.profile(inliningTarget, type instanceof PythonBuiltinClass)) {
        +                // PythonBuiltinClassType should help the code after this to optimize better
        +                type = ((PythonBuiltinClass) type).getType();
                     }
        -            return descriptor;
        -        }
        -    }
        -
        -    @ReportPolymorphism
        -    protected abstract static class CallNodeHelper extends PNodeWithContext {
        -        @Child private CallVarargsMethodNode dispatchNew = CallVarargsMethodNode.create();
        -        @Child private LookupCallableSlotInMRONode lookupNew = LookupCallableSlotInMRONode.create(SpecialMethodSlot.New);
        -        @Child private CallVarargsMethodNode dispatchInit;
        -        @Child private LookupSpecialMethodSlotNode lookupInit;
        -        @Child private IsSubtypeNode isSubTypeNode;
        -        @Child private TypeNodes.GetNameNode getNameNode;
        -
        -        abstract Object execute(VirtualFrame frame, Object self, Object[] args, PKeyword[] keywords);
        -
        -        @Specialization(limit = "getCallSiteInlineCacheMaxDepth()", guards = {"isSingleContext()", "self == cachedSelf"})
        -        protected Object doIt0BuiltinSingle(VirtualFrame frame, @SuppressWarnings("unused") PythonBuiltinClass self, Object[] arguments, PKeyword[] keywords,
        -                        @Bind("this") Node inliningTarget,
        -                        @Cached("self") PythonBuiltinClass cachedSelf,
        -                        @Shared @Cached GetClassNode getInstanceClassNode,
        -                        @Shared @Cached InlinedConditionProfile hasInit,
        -                        @Shared @Cached InlinedConditionProfile gotInitResult,
        -                        @Shared @Cached BindNew bindNew,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            PythonBuiltinClassType type = cachedSelf.getType();
        -            return op(frame, inliningTarget, type, arguments, keywords, getInstanceClassNode, hasInit, gotInitResult, bindNew, raiseNode);
        -        }
        -
        -        @Specialization(limit = "getCallSiteInlineCacheMaxDepth()", guards = {"isSingleContext()", "self == cachedSelf"})
        -        protected Object doIt0User(VirtualFrame frame, @SuppressWarnings("unused") PythonClass self, Object[] arguments, PKeyword[] keywords,
        -                        @Bind("this") Node inliningTarget,
        -                        @Cached(value = "self", weak = true) PythonClass cachedSelf,
        -                        @Shared @Cached GetClassNode getInstanceClassNode,
        -                        @Shared @Cached InlinedConditionProfile hasInit,
        -                        @Shared @Cached InlinedConditionProfile gotInitResult,
        -                        @Shared @Cached BindNew bindNew,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            return op(frame, inliningTarget, cachedSelf, arguments, keywords, getInstanceClassNode, hasInit, gotInitResult, bindNew, raiseNode);
        -        }
        -
        -        @Specialization(limit = "getCallSiteInlineCacheMaxDepth()", guards = {"self.getType() == cachedType"})
        -        protected Object doIt0BuiltinMulti(VirtualFrame frame, @SuppressWarnings("unused") PythonBuiltinClass self, Object[] arguments, PKeyword[] keywords,
        -                        @Bind("this") Node inliningTarget,
        -                        @Cached("self.getType()") PythonBuiltinClassType cachedType,
        -                        @Shared @Cached GetClassNode getInstanceClassNode,
        -                        @Shared @Cached InlinedConditionProfile hasInit,
        -                        @Shared @Cached InlinedConditionProfile gotInitResult,
        -                        @Shared @Cached BindNew bindNew,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            return op(frame, inliningTarget, cachedType, arguments, keywords, getInstanceClassNode, hasInit, gotInitResult, bindNew, raiseNode);
        -        }
        -
        -        @Specialization(limit = "getCallSiteInlineCacheMaxDepth()", guards = {"self == cachedType"})
        -        protected Object doIt0BuiltinType(VirtualFrame frame, @SuppressWarnings("unused") PythonBuiltinClassType self, Object[] arguments, PKeyword[] keywords,
        -                        @Bind("this") Node inliningTarget,
        -                        @Cached("self") PythonBuiltinClassType cachedType,
        -                        @Shared @Cached GetClassNode getInstanceClassNode,
        -                        @Shared @Cached InlinedConditionProfile hasInit,
        -                        @Shared @Cached InlinedConditionProfile gotInitResult,
        -                        @Shared @Cached BindNew bindNew,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            return op(frame, inliningTarget, cachedType, arguments, keywords, getInstanceClassNode, hasInit, gotInitResult, bindNew, raiseNode);
        -        }
        -
        -        @Specialization(replaces = {"doIt0BuiltinSingle", "doIt0BuiltinMulti"})
        -        protected Object doItIndirect0Builtin(VirtualFrame frame, PythonBuiltinClass self, Object[] arguments, PKeyword[] keywords,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached GetClassNode getInstanceClassNode,
        -                        @Shared @Cached InlinedConditionProfile hasInit,
        -                        @Shared @Cached InlinedConditionProfile gotInitResult,
        -                        @Shared @Cached BindNew bindNew,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            PythonBuiltinClassType type = self.getType();
        -            return op(frame, inliningTarget, type, arguments, keywords, getInstanceClassNode, hasInit, gotInitResult, bindNew, raiseNode);
        -        }
        -
        -        @Specialization(replaces = "doIt0BuiltinType")
        -        protected Object doItIndirect0BuiltinType(VirtualFrame frame, PythonBuiltinClassType self, Object[] arguments, PKeyword[] keywords,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached GetClassNode getInstanceClassNode,
        -                        @Shared @Cached InlinedConditionProfile hasInit,
        -                        @Shared @Cached InlinedConditionProfile gotInitResult,
        -                        @Shared @Cached BindNew bindNew,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            return op(frame, inliningTarget, self, arguments, keywords, getInstanceClassNode, hasInit, gotInitResult, bindNew, raiseNode);
        -        }
        -
        -        @Specialization(replaces = {"doIt0User"})
        -        protected Object doItIndirect0User(VirtualFrame frame, PythonClass self, Object[] arguments, PKeyword[] keywords,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached GetClassNode getInstanceClassNode,
        -                        @Shared @Cached InlinedConditionProfile hasInit,
        -                        @Shared @Cached InlinedConditionProfile gotInitResult,
        -                        @Shared @Cached BindNew bindNew,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            return op(frame, inliningTarget, self, arguments, keywords, getInstanceClassNode, hasInit, gotInitResult, bindNew, raiseNode);
        -        }
        -
        -        /* self is native */
        -        @Specialization(limit = "getCallSiteInlineCacheMaxDepth()", guards = {"isSingleContext()", "self == cachedSelf"})
        -        protected Object doIt1(VirtualFrame frame, @SuppressWarnings("unused") PythonAbstractNativeObject self, Object[] arguments, PKeyword[] keywords,
        -                        @Bind("this") Node inliningTarget,
        -                        @Cached("self") PythonAbstractNativeObject cachedSelf,
        -                        @Shared @Cached GetClassNode getInstanceClassNode,
        -                        @Shared @Cached GetTypeFlagsNode getTypeFlagsNode,
        -                        @Shared @Cached InlinedConditionProfile hasInit,
        -                        @Shared @Cached InlinedConditionProfile gotInitResult,
        -                        @Shared @Cached BindNew bindNew,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            checkFlags(self, inliningTarget, getTypeFlagsNode, raiseNode);
        -            return op(frame, inliningTarget, PythonNativeClass.cast(cachedSelf), arguments, keywords, getInstanceClassNode, hasInit, gotInitResult, bindNew, raiseNode);
        -        }
        -
        -        @Specialization(replaces = "doIt1")
        -        protected Object doItIndirect1(VirtualFrame frame, PythonAbstractNativeObject self, Object[] arguments, PKeyword[] keywords,
        -                        @Bind("this") Node inliningTarget,
        -                        @Shared @Cached GetClassNode getInstanceClassNode,
        -                        @Shared @Cached GetTypeFlagsNode getTypeFlagsNode,
        -                        @Shared @Cached InlinedConditionProfile hasInit,
        -                        @Shared @Cached InlinedConditionProfile gotInitResult,
        -                        @Shared @Cached BindNew bindNew,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        -            checkFlags(self, inliningTarget, getTypeFlagsNode, raiseNode);
        -            return op(frame, inliningTarget, PythonNativeClass.cast(self), arguments, keywords, getInstanceClassNode, hasInit, gotInitResult, bindNew, raiseNode);
        -        }
        -
        -        private void checkFlags(PythonAbstractNativeObject self, Node inliningTarget, GetTypeFlagsNode getTypeFlagsNode, PRaiseNode.Lazy raiseNode) {
        -            if ((getTypeFlagsNode.execute(self) & TypeFlags.DISALLOW_INSTANTIATION) != 0) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANNOT_CREATE_INSTANCES, getTypeName(self));
        +            TpSlots typeSlots = getTypeSlots.execute(inliningTarget, type);
        +            if (typeSlots.tp_new() == null) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANNOT_CREATE_N_INSTANCES, type);
                     }
        -        }
        -
        -        private Object op(VirtualFrame frame, Node inliningTarget, Object self, Object[] arguments, PKeyword[] keywords, GetClassNode getInstanceClassNode,
        -                        InlinedConditionProfile hasInit, InlinedConditionProfile gotInitResult, BindNew bindNew, PRaiseNode.Lazy raiseNode) {
        -            Object newMethod = lookupNew.execute(self);
        -            assert newMethod != NO_VALUE;
        -            Object[] newArgs = PythonUtils.prependArgument(self, arguments);
        -            Object newInstance = dispatchNew.execute(frame, bindNew.execute(frame, inliningTarget, newMethod, self), newArgs, keywords);
        -            callInit(inliningTarget, newInstance, self, frame, arguments, keywords, getInstanceClassNode, hasInit, gotInitResult, raiseNode);
        -            return newInstance;
        -        }
        -
        -        private void callInit(Node inliningTarget, Object newInstance, Object self, VirtualFrame frame, Object[] arguments, PKeyword[] keywords, GetClassNode getInstanceClassNode,
        -                        InlinedConditionProfile hasInit, InlinedConditionProfile gotInitResult, PRaiseNode.Lazy raiseNode) {
        +            Object newInstance = callNew.execute(frame, inliningTarget, typeSlots.tp_new(), type, arguments, keywords);
                     Object newInstanceKlass = getInstanceClassNode.execute(inliningTarget, newInstance);
        -            if (isSubType(newInstanceKlass, self)) {
        -                Object initMethod = getInitNode().execute(frame, newInstanceKlass, newInstance);
        -                if (hasInit.profile(inliningTarget, initMethod != NO_VALUE)) {
        -                    Object[] initArgs = PythonUtils.prependArgument(newInstance, arguments);
        -                    Object initResult = getDispatchNode().execute(frame, initMethod, initArgs, keywords);
        -                    if (gotInitResult.profile(inliningTarget, initResult != PNone.NONE && initResult != NO_VALUE)) {
        -                        throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.SHOULD_RETURN_NONE, "__init__()");
        -                    }
        +            if (isSubtypeNode.execute(newInstanceKlass, type)) {
        +                TpSlots instanceSlots = getInstanceSlots.execute(inliningTarget, newInstanceKlass);
        +                if (instanceSlots.tp_init() != null) {
        +                    callInit.execute(frame, inliningTarget, instanceSlots.tp_init(), newInstance, arguments, keywords);
                         }
                     }
        -        }
        -
        -        private LookupSpecialMethodSlotNode getInitNode() {
        -            if (lookupInit == null) {
        -                CompilerDirectives.transferToInterpreterAndInvalidate();
        -                lookupInit = insert(LookupSpecialMethodSlotNode.create(SpecialMethodSlot.Init));
        -            }
        -            return lookupInit;
        -        }
        -
        -        private CallVarargsMethodNode getDispatchNode() {
        -            if (dispatchInit == null) {
        -                CompilerDirectives.transferToInterpreterAndInvalidate();
        -                dispatchInit = insert(CallVarargsMethodNode.create());
        -            }
        -            return dispatchInit;
        -        }
        -
        -        private boolean isSubType(Object left, Object right) {
        -            if (isSubTypeNode == null) {
        -                CompilerDirectives.transferToInterpreterAndInvalidate();
        -                isSubTypeNode = insert(IsSubtypeNode.create());
        -            }
        -            return isSubTypeNode.execute(left, right);
        -        }
        -
        -        private TruffleString getTypeName(Object clazz) {
        -            if (getNameNode == null) {
        -                CompilerDirectives.transferToInterpreterAndInvalidate();
        -                getNameNode = insert(TypeNodes.GetNameNode.create());
        -            }
        -            return getNameNode.executeCached(clazz);
        +            return newInstance;
                 }
             }
         
        @@ -656,12 +533,12 @@ protected Object doIt(VirtualFrame frame, Object object, Object keyObj,
                                 @Cached InlinedBranchProfile hasValueProfile,
                                 @Cached InlinedBranchProfile hasNonDescriptorValueProfile,
                                 @Cached InlinedBranchProfile errorProfile,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     TruffleString key;
                     try {
                         key = castToString.execute(inliningTarget, keyObj);
                     } catch (CannotCastException e) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_NAME_MUST_BE_STRING, keyObj);
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ATTR_NAME_MUST_BE_STRING, keyObj);
                     }
         
                     Object metatype = getClassNode.execute(inliningTarget, object);
        @@ -698,7 +575,7 @@ protected Object doIt(VirtualFrame frame, Object object, Object keyObj,
                         }
                     }
                     errorProfile.enter(inliningTarget);
        -            throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.OBJ_N_HAS_NO_ATTR_S, object, key);
        +            throw raiseNode.raiseWithData(inliningTarget, AttributeError, AttributeErrorBuiltins.dataForObjKey(object, key), ErrorMessages.OBJ_N_HAS_NO_ATTR_S, object, key);
                 }
         
                 private Object readAttribute(Object object, TruffleString key) {
        @@ -752,7 +629,7 @@ static void set(VirtualFrame frame, Object object, Object key, Object value,
                 @TruffleBoundary
                 void setBuiltin(Object object, Object key, Object value) {
                     if (PythonContext.get(this).isInitialized()) {
        -                throw PRaiseNode.raiseUncached(this, TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_R_OF_IMMUTABLE_TYPE_N, PyObjectReprAsTruffleStringNode.executeUncached(key), object);
        +                throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_R_OF_IMMUTABLE_TYPE_N, PyObjectReprAsTruffleStringNode.executeUncached(key), object);
                     } else {
                         set(null, object, key, value, null, ObjectNodes.GenericSetAttrNode.getUncached(), WriteAttributeToObjectNode.getUncached(true));
                     }
        @@ -770,8 +647,8 @@ public abstract static class PrepareNode extends PythonBuiltinNode {
                 @SuppressWarnings("unused")
                 @Specialization
                 Object doIt(Object args, Object kwargs,
        -                        @Cached PythonObjectFactory factory) {
        -            return factory.createDict(new DynamicObjectStorage(PythonLanguage.get(this)));
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createDict(language, new DynamicObjectStorage(language));
                 }
             }
         
        @@ -783,15 +660,14 @@ abstract static class BasesNode extends PythonBinaryBuiltinNode {
                 @Specialization
                 static Object getBases(Object self, @SuppressWarnings("unused") PNone value,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached TypeNodes.GetBaseClassesNode getBaseClassesNode,
        -                        @Cached PythonObjectFactory factory) {
        -            return factory.createTuple(getBaseClassesNode.execute(inliningTarget, self));
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetBaseClassesNode getBaseClassesNode) {
        +            return PFactory.createTuple(language, getBaseClassesNode.execute(inliningTarget, self));
                 }
         
                 @Specialization
                 static Object setBases(VirtualFrame frame, PythonClass cls, PTuple value,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached GetNameNode getName,
                                 @Cached GetObjectArrayNode getArray,
                                 @Cached GetBaseClassNode getBase,
                                 @Cached GetBestBaseClassNode getBestBase,
        @@ -799,18 +675,18 @@ static Object setBases(VirtualFrame frame, PythonClass cls, PTuple value,
                                 @Cached IsSubtypeNode isSubtypeNode,
                                 @Cached IsSameTypeNode isSameTypeNode,
                                 @Cached GetMroNode getMroNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
         
                     Object[] a = getArray.execute(inliningTarget, value);
                     if (a.length == 0) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CAN_ONLY_ASSIGN_NON_EMPTY_TUPLE_TO_P, cls);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CAN_ONLY_ASSIGN_NON_EMPTY_TUPLE_TO_P, cls);
                     }
                     PythonAbstractClass[] baseClasses = new PythonAbstractClass[a.length];
                     for (int i = 0; i < a.length; i++) {
                         if (PGuards.isPythonClass(a[i])) {
        -                    if (isSubtypeNode.execute(frame, a[i], cls) ||
        +                    if (isSubtypeNode.execute(a[i], cls) ||
                                             hasMRO(inliningTarget, getMroNode, a[i]) && typeIsSubtypeBaseChain(inliningTarget, a[i], cls, getBase, isSameTypeNode)) {
        -                        throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.BASES_ITEM_CAUSES_INHERITANCE_CYCLE);
        +                        throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.BASES_ITEM_CAUSES_INHERITANCE_CYCLE);
                             }
                             if (a[i] instanceof PythonBuiltinClassType) {
                                 baseClasses[i] = PythonContext.get(inliningTarget).lookupType((PythonBuiltinClassType) a[i]);
        @@ -818,7 +694,7 @@ static Object setBases(VirtualFrame frame, PythonClass cls, PTuple value,
                                 baseClasses[i] = (PythonAbstractClass) a[i];
                             }
                         } else {
        -                    throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MUST_BE_TUPLE_OF_CLASSES_NOT_P, getName.execute(inliningTarget, cls), "__bases__", a[i]);
        +                    throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MUST_BE_TUPLE_OF_CLASSES_NOT_P, cls, "__bases__", a[i]);
                         }
                     }
         
        @@ -830,8 +706,7 @@ static Object setBases(VirtualFrame frame, PythonClass cls, PTuple value,
                     Object oldBase = getBase.execute(inliningTarget, cls);
                     checkCompatibleForAssigment.execute(frame, oldBase, newBestBase);
         
        -            cls.setBases(newBestBase, baseClasses);
        -            SpecialMethodSlot.reinitializeSpecialMethodSlots(cls, PythonLanguage.get(inliningTarget));
        +            cls.setBases(inliningTarget, newBestBase, baseClasses);
                     TpSlots.updateAllSlots(cls);
         
                     return PNone.NONE;
        @@ -856,14 +731,14 @@ private static boolean typeIsSubtypeBaseChain(Node inliningTarget, Object a, Obj
         
                 @Specialization(guards = "!isPTuple(value)")
                 static Object setObject(@SuppressWarnings("unused") PythonClass cls, @SuppressWarnings("unused") Object value,
        -                        @Shared @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(TypeError, ErrorMessages.CAN_ONLY_ASSIGN_S_TO_S_S_NOT_P, "tuple", GetNameNode.executeUncached(cls), "__bases__", value);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CAN_ONLY_ASSIGN_S_TO_S_S_NOT_P, "tuple", GetNameNode.executeUncached(cls), "__bases__", value);
                 }
         
                 @Specialization
                 static Object setBuiltin(@SuppressWarnings("unused") PythonBuiltinClass cls, @SuppressWarnings("unused") Object value,
        -                        @Shared @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, J___BASES__, cls);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, J___BASES__, cls);
                 }
         
             }
        @@ -885,25 +760,25 @@ static Object base(Object self,
             abstract static class DictNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 Object doType(PythonBuiltinClassType self,
        -                        @Shared @Cached GetDictIfExistsNode getDict,
        -                        @Shared @Cached PythonObjectFactory factory) {
        -            return doManaged(getContext().lookupType(self), getDict, factory);
        +                        @Bind PythonLanguage language,
        +                        @Shared @Cached GetDictIfExistsNode getDict) {
        +            return doManaged(getContext().lookupType(self), language, getDict);
                 }
         
                 @Specialization
                 static Object doManaged(PythonManagedClass self,
        -                        @Shared @Cached GetDictIfExistsNode getDict,
        -                        @Shared @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language,
        +                        @Shared @Cached GetDictIfExistsNode getDict) {
                     PDict dict = getDict.execute(self);
                     if (dict == null) {
        -                dict = factory.createDictFixedStorage(self, self.getMethodResolutionOrder());
        +                dict = PFactory.createDictFixedStorage(language, self, self.getMethodResolutionOrder());
                         // The mapping is unmodifiable, so we don't have to assign it back
                     }
        -            return factory.createMappingproxy(dict);
        +            return PFactory.createMappingproxy(language, dict);
                 }
         
                 @Specialization
        -        static Object doNative(PythonNativeClass self,
        +        static Object doNative(PythonAbstractNativeObject self,
                                 @Cached CStructAccess.ReadObjectNode getTpDictNode) {
                     return getTpDictNode.readFromObj(self, CFields.PyTypeObject__tp_dict);
                 }
        @@ -911,56 +786,13 @@ static Object doNative(PythonNativeClass self,
         
             @Builtin(name = J___INSTANCECHECK__, minNumOfPositionalArgs = 2)
             @GenerateNodeFactory
        -    public abstract static class InstanceCheckNode extends PythonBinaryBuiltinNode {
        -        @Child private PyObjectLookupAttr getAttributeNode;
        -
        -        public abstract boolean executeWith(VirtualFrame frame, Object cls, Object instance);
        -
        -        public PyObjectLookupAttr getGetAttributeNode() {
        -            if (getAttributeNode == null) {
        -                CompilerDirectives.transferToInterpreterAndInvalidate();
        -                getAttributeNode = insert(PyObjectLookupAttr.create());
        -            }
        -            return getAttributeNode;
        -        }
        -
        -        private PythonObject getInstanceClassAttr(VirtualFrame frame, Object instance) {
        -            Object classAttr = getGetAttributeNode().executeCached(frame, instance, T___CLASS__);
        -            if (classAttr instanceof PythonObject) {
        -                return (PythonObject) classAttr;
        -            }
        -            return null;
        -        }
        +    abstract static class InstanceCheckNode extends PythonBinaryBuiltinNode {
         
        -        @Specialization(guards = "isTypeNode.execute(inliningTarget, cls)", limit = "1")
        -        @SuppressWarnings("truffle-static-method")
        -        boolean isInstance(VirtualFrame frame, Object cls, Object instance,
        +        @Specialization
        +        static boolean isInstance(VirtualFrame frame, Object cls, Object instance,
                                 @Bind("this") Node inliningTarget,
        -                        @SuppressWarnings("unused") @Cached TypeNodes.IsTypeNode isTypeNode,
        -                        @Cached GetClassNode getClassNode,
        -                        @Cached IsSubtypeNode isSubtypeNode) {
        -            if (instance instanceof PythonObject && isSubtypeNode.execute(frame, getClassNode.execute(inliningTarget, instance), cls)) {
        -                return true;
        -            }
        -
        -            Object instanceClass = getGetAttributeNode().executeCached(frame, instance, T___CLASS__);
        -            return PGuards.isManagedClass(instanceClass) && isSubtypeNode.execute(frame, instanceClass, cls);
        -        }
        -
        -        @Fallback
        -        @SuppressWarnings("truffle-static-method")
        -        boolean isInstance(VirtualFrame frame, Object cls, Object instance,
        -                        @Bind("this") Node inliningTarget,
        -                        @Cached InlinedConditionProfile typeErrorProfile,
        -                        @Cached AbstractObjectIsSubclassNode abstractIsSubclassNode,
        -                        @Cached AbstractObjectGetBasesNode getBasesNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        -            if (typeErrorProfile.profile(inliningTarget, getBasesNode.execute(frame, cls) == null)) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.ISINSTANCE_ARG_2_MUST_BE_TYPE_OR_TUPLE_OF_TYPE, instance);
        -            }
        -
        -            PythonObject instanceClass = getInstanceClassAttr(frame, instance);
        -            return instanceClass != null && abstractIsSubclassNode.execute(frame, instanceClass, cls);
        +                        @Cached TypeNodes.GenericInstanceCheckNode genericInstanceCheckNode) {
        +            return genericInstanceCheckNode.execute(frame, inliningTarget, instance, cls);
                 }
             }
         
        @@ -968,54 +800,11 @@ boolean isInstance(VirtualFrame frame, Object cls, Object instance,
             @GenerateNodeFactory
             abstract static class SubclassCheckNode extends PythonBinaryBuiltinNode {
         
        -        @Specialization(guards = {"!isNativeClass(cls)", "!isNativeClass(derived)"})
        -        static boolean doManagedManaged(VirtualFrame frame, Object cls, Object derived,
        -                        @Bind("this") Node inliningTarget,
        -                        @Exclusive @Cached IsSameTypeNode isSameTypeNode,
        -                        @Exclusive @Cached IsSubtypeNode isSubtypeNode) {
        -            return isSameTypeNode.execute(inliningTarget, cls, derived) || isSubtypeNode.execute(frame, derived, cls);
        -        }
        -
                 @Specialization
        -        static boolean doObjectObject(VirtualFrame frame, Object cls, Object derived,
        +        static boolean check(VirtualFrame frame, Object cls, Object derived,
                                 @Bind("this") Node inliningTarget,
        -                        @Exclusive @Cached IsSameTypeNode isSameTypeNode,
        -                        @Exclusive @Cached IsSubtypeNode isSubtypeNode,
        -                        @Cached IsBuiltinObjectProfile isAttrErrorProfile,
        -                        @Cached("create(T___BASES__)") GetFixedAttributeNode getBasesAttrNode,
        -                        @Cached PyTupleCheckNode tupleCheck,
        -                        @Cached TypeNodes.IsTypeNode isClsTypeNode,
        -                        @Cached TypeNodes.IsTypeNode isDerivedTypeNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        -            if (isSameTypeNode.execute(inliningTarget, cls, derived)) {
        -                return true;
        -            }
        -
        -            // no profiles required because IsTypeNode profiles already
        -            if (isClsTypeNode.execute(inliningTarget, cls) && isDerivedTypeNode.execute(inliningTarget, derived)) {
        -                return isSubtypeNode.execute(frame, derived, cls);
        -            }
        -            if (!checkClass(frame, inliningTarget, derived, getBasesAttrNode, tupleCheck, isAttrErrorProfile)) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ARG_D_MUST_BE_S, "issubclass()", 1, "class");
        -            }
        -            if (!checkClass(frame, inliningTarget, cls, getBasesAttrNode, tupleCheck, isAttrErrorProfile)) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.ISSUBCLASS_MUST_BE_CLASS_OR_TUPLE);
        -            }
        -            return false;
        -        }
        -
        -        // checks if object has '__bases__' (see CPython 'abstract.c' function
        -        // 'recursive_issubclass')
        -        private static boolean checkClass(VirtualFrame frame, Node inliningTarget, Object obj, GetFixedAttributeNode getBasesAttrNode, PyTupleCheckNode tupleCheck,
        -                        IsBuiltinObjectProfile isAttrErrorProfile) {
        -            Object basesObj;
        -            try {
        -                basesObj = getBasesAttrNode.executeObject(frame, obj);
        -            } catch (PException e) {
        -                e.expectAttributeError(inliningTarget, isAttrErrorProfile);
        -                return false;
        -            }
        -            return tupleCheck.execute(inliningTarget, basesObj);
        +                        @Cached TypeNodes.GenericSubclassCheckNode genericSubclassCheckNode) {
        +            return genericSubclassCheckNode.execute(frame, inliningTarget, derived, cls);
                 }
             }
         
        @@ -1036,18 +825,16 @@ abstract static class SubclassesNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static PList getSubclasses(Object cls,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached(inline = true) GetSubclassesAsArrayNode getSubclassesNode,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Cached(inline = true) GetSubclassesAsArrayNode getSubclassesNode) {
                     // TODO: missing: keep track of subclasses
                     PythonAbstractClass[] array = getSubclassesNode.execute(inliningTarget, cls);
                     Object[] classes = new Object[array.length];
                     PythonUtils.arraycopy(array, 0, classes, 0, array.length);
        -            return factory.createList(classes);
        +            return PFactory.createList(PythonLanguage.get(inliningTarget), classes);
                 }
             }
         
             @GenerateNodeFactory
        -    @TypeSystemReference(PythonTypes.class)
             abstract static class AbstractSlotNode extends PythonBinaryBuiltinNode {
             }
         
        @@ -1058,15 +845,15 @@ abstract static class CheckSetSpecialTypeAttrNode extends Node {
         
                 @Specialization
                 static void check(Node inliningTarget, Object type, Object value, TruffleString name,
        -                        @Cached PRaiseNode.Lazy raiseNode,
        +                        @Cached PRaiseNode raiseNode,
                                 @Cached(inline = false) GetTypeFlagsNode getTypeFlagsNode,
                                 @Cached SysModuleBuiltins.AuditNode auditNode) {
                     if (PGuards.isKindOfBuiltinClass(type) || (getTypeFlagsNode.execute(type) & TypeFlags.IMMUTABLETYPE) != 0) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, name, type);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, name, type);
                     }
                     if (value == DescriptorDeleteMarker.INSTANCE) {
                         // Sic, it's not immutable, but CPython has this message
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANT_DELETE_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, name, type);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANT_DELETE_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, name, type);
                     }
                     auditNode.audit(inliningTarget, "object.__setattr__", type, name, value);
                 }
        @@ -1076,29 +863,10 @@ static void check(Node inliningTarget, Object type, Object value, TruffleString
                             allowsDelete = true /* Delete handled by CheckSetSpecialTypeAttrNode */)
             abstract static class NameNode extends AbstractSlotNode {
                 @Specialization(guards = "isNoValue(value)")
        -        static TruffleString getNameType(PythonBuiltinClassType cls, @SuppressWarnings("unused") PNone value) {
        -            return cls.getName();
        -        }
        -
        -        @Specialization(guards = "isNoValue(value)")
        -        static TruffleString getNameBuiltin(PythonManagedClass cls, @SuppressWarnings("unused") PNone value) {
        -            return cls.getName();
        -        }
        -
        -        @Specialization(guards = "isNoValue(value)")
        -        static Object getName(PythonAbstractNativeObject cls, @SuppressWarnings("unused") PNone value,
        -                        @Cached CStructAccess.ReadCharPtrNode getTpNameNode,
        -                        @Shared("cpLen") @Cached TruffleString.CodePointLengthNode codePointLengthNode,
        -                        @Cached TruffleString.LastIndexOfCodePointNode indexOfCodePointNode,
        -                        @Cached TruffleString.SubstringNode substringNode) {
        -            // 'tp_name' contains the fully-qualified name, i.e., 'module.A.B...'
        -            TruffleString tpName = getTpNameNode.readFromObj(cls, PyTypeObject__tp_name);
        -            int nameLen = codePointLengthNode.execute(tpName, TS_ENCODING);
        -            int lastDot = indexOfCodePointNode.execute(tpName, '.', nameLen, 0, TS_ENCODING);
        -            if (lastDot < 0) {
        -                return tpName;
        -            }
        -            return substringNode.execute(tpName, lastDot + 1, nameLen - lastDot - 1, TS_ENCODING, true);
        +        static TruffleString getNameType(Object cls, @SuppressWarnings("unused") PNone value,
        +                        @Bind Node inliningTarget,
        +                        @Cached GetNameNode getNameNode) {
        +            return getNameNode.execute(inliningTarget, cls);
                 }
         
                 @GenerateInline
        @@ -1113,16 +881,16 @@ static void set(PythonClass type, TruffleString value) {
         
                     @Specialization
                     static void set(PythonAbstractNativeObject type, TruffleString value,
        +                            @Bind PythonLanguage language,
                                     @Cached(inline = false) CStructAccess.WritePointerNode writePointerNode,
                                     @Cached(inline = false) CStructAccess.WriteObjectNewRefNode writeObject,
                                     @Cached(inline = false) TruffleString.SwitchEncodingNode switchEncodingNode,
        -                            @Cached(inline = false) TruffleString.CopyToByteArrayNode copyToByteArrayNode,
        -                            @Cached(inline = false) PythonObjectFactory factory) {
        +                            @Cached(inline = false) TruffleString.CopyToByteArrayNode copyToByteArrayNode) {
                         value = switchEncodingNode.execute(value, TruffleString.Encoding.UTF_8);
                         byte[] bytes = copyToByteArrayNode.execute(value, TruffleString.Encoding.UTF_8);
        -                PBytes bytesObject = factory.createBytes(bytes);
        +                PBytes bytesObject = PFactory.createBytes(language, bytes);
                         writePointerNode.writeToObj(type, PyTypeObject__tp_name, PySequenceArrayWrapper.ensureNativeSequence(bytesObject));
        -                PString pString = factory.createString(value);
        +                PString pString = PFactory.createString(language, value);
                         pString.setUtf8Bytes(bytesObject);
                         writeObject.writeToObject(type, PyHeapTypeObject__ht_name, pString);
                     }
        @@ -1132,22 +900,22 @@ static void set(PythonAbstractNativeObject type, TruffleString value,
                 static Object setName(VirtualFrame frame, Object cls, Object value,
                                 @Bind("this") Node inliningTarget,
                                 @Cached CheckSetSpecialTypeAttrNode check,
        -                        @Exclusive @Cached CastToTruffleStringNode castToTruffleStringNode,
        +                        @Cached CastToTruffleStringNode castToTruffleStringNode,
                                 @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
                                 @Cached TruffleString.IsValidNode isValidNode,
        -                        @Shared("cpLen") @Cached TruffleString.CodePointLengthNode codePointLengthNode,
        +                        @Cached TruffleString.CodePointLengthNode codePointLengthNode,
                                 @Cached TruffleString.IndexOfCodePointNode indexOfCodePointNode,
                                 @Cached SetNameInnerNode innerNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     check.execute(inliningTarget, cls, value, T___NAME__);
                     TruffleString string;
                     try {
                         string = castToTruffleStringNode.execute(inliningTarget, value);
                     } catch (CannotCastException e) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.CAN_ONLY_ASSIGN_S_TO_P_S_NOT_P, "string", cls, T___NAME__, value);
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.CAN_ONLY_ASSIGN_S_TO_P_S_NOT_P, "string", cls, T___NAME__, value);
                     }
                     if (indexOfCodePointNode.execute(string, 0, 0, codePointLengthNode.execute(string, TS_ENCODING), TS_ENCODING) >= 0) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.TYPE_NAME_NO_NULL_CHARS);
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.TYPE_NAME_NO_NULL_CHARS);
                     }
                     if (!isValidNode.execute(string, TS_ENCODING)) {
                         throw constructAndRaiseNode.get(inliningTarget).raiseUnicodeEncodeError(frame, "utf-8", string, 0, string.codePointLengthUncached(TS_ENCODING), "can't encode classname");
        @@ -1175,10 +943,10 @@ static TruffleString getModuleBuiltin(PythonBuiltinClass cls, @SuppressWarnings(
                 static Object getModule(PythonClass cls, @SuppressWarnings("unused") PNone value,
                                 @Bind("this") Node inliningTarget,
                                 @Cached ReadAttributeFromObjectNode readAttrNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     Object module = readAttrNode.execute(cls, T___MODULE__);
                     if (module == NO_VALUE) {
        -                throw raiseNode.get(inliningTarget).raise(AttributeError);
        +                throw raiseNode.raise(inliningTarget, AttributeError);
                     }
                     return module;
                 }
        @@ -1191,7 +959,7 @@ static Object setModule(PythonClass cls, Object value,
                 }
         
                 @Specialization(guards = "isNoValue(value)")
        -        static Object getModule(PythonNativeClass cls, @SuppressWarnings("unused") PNone value,
        +        static Object getModule(PythonAbstractNativeObject cls, @SuppressWarnings("unused") PNone value,
                                 @Bind("this") Node inliningTarget,
                                 @Cached("createForceType()") ReadAttributeFromObjectNode readAttr,
                                 @Shared @Cached GetTypeFlagsNode getFlags,
        @@ -1199,12 +967,12 @@ static Object getModule(PythonNativeClass cls, @SuppressWarnings("unused") PNone
                                 @Cached TruffleString.CodePointLengthNode codePointLengthNode,
                                 @Cached TruffleString.IndexOfCodePointNode indexOfCodePointNode,
                                 @Cached TruffleString.SubstringNode substringNode,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     // see function 'typeobject.c: type_module'
                     if ((getFlags.execute(cls) & TypeFlags.HEAPTYPE) != 0) {
                         Object module = readAttr.execute(cls, T___MODULE__);
                         if (module == NO_VALUE) {
        -                    throw raiseNode.get(inliningTarget).raise(AttributeError);
        +                    throw raiseNode.raise(inliningTarget, AttributeError);
                         }
                         return module;
                     } else {
        @@ -1220,14 +988,14 @@ static Object getModule(PythonNativeClass cls, @SuppressWarnings("unused") PNone
                 }
         
                 @Specialization(guards = "!isNoValue(value)")
        -        static Object setNative(PythonNativeClass cls, Object value,
        +        static Object setNative(PythonAbstractNativeObject cls, Object value,
                                 @Bind("this") Node inliningTarget,
                                 @Shared @Cached GetTypeFlagsNode getFlags,
                                 @Cached("createForceType()") WriteAttributeToObjectNode writeAttr,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     long flags = getFlags.execute(cls);
                     if ((flags & TypeFlags.HEAPTYPE) == 0) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANT_SET_N_S, cls, T___MODULE__);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANT_SET_N_S, cls, T___MODULE__);
                     }
                     writeAttr.execute(cls, T___MODULE__, value);
                     return PNone.NONE;
        @@ -1235,14 +1003,14 @@ static Object setNative(PythonNativeClass cls, Object value,
         
                 @Specialization(guards = "!isNoValue(value)")
                 static Object setModuleType(@SuppressWarnings("unused") PythonBuiltinClassType cls, @SuppressWarnings("unused") Object value,
        -                        @Shared("raise") @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.TypeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
                 }
         
                 @Specialization(guards = "!isNoValue(value)")
                 static Object setModuleBuiltin(@SuppressWarnings("unused") PythonBuiltinClass cls, @SuppressWarnings("unused") Object value,
        -                        @Shared("raise") @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.TypeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE, "built-in/extension 'type'");
                 }
             }
         
        @@ -1260,24 +1028,15 @@ static TruffleString getName(PythonManagedClass cls, @SuppressWarnings("unused")
                 }
         
                 @Specialization(guards = "isNoValue(value)")
        -        static Object getNative(PythonNativeClass cls, @SuppressWarnings("unused") PNone value,
        +        static Object getNative(PythonAbstractNativeObject cls, @SuppressWarnings("unused") PNone value,
        +                        @Bind Node inliningTarget,
                                 @Cached GetTypeFlagsNode getTypeFlagsNode,
                                 @Cached CStructAccess.ReadObjectNode getHtName,
        -                        @Cached CStructAccess.ReadCharPtrNode getTpNameNode,
        -                        @Cached TruffleString.CodePointLengthNode codePointLengthNode,
        -                        @Cached TruffleString.IndexOfCodePointNode indexOfCodePointNode,
        -                        @Cached TruffleString.SubstringNode substringNode) {
        +                        @Cached GetNameNode getNameNode) {
                     if ((getTypeFlagsNode.execute(cls) & TypeFlags.HEAPTYPE) != 0) {
                         return getHtName.readFromObj(cls, PyHeapTypeObject__ht_qualname);
                     } else {
        -                // 'tp_name' contains the fully-qualified name, i.e., 'module.A.B...'
        -                TruffleString tpName = getTpNameNode.readFromObj(cls, PyTypeObject__tp_name);
        -                int nameLen = codePointLengthNode.execute(tpName, TS_ENCODING);
        -                int firstDot = indexOfCodePointNode.execute(tpName, '.', 0, nameLen, TS_ENCODING);
        -                if (firstDot < 0) {
        -                    return tpName;
        -                }
        -                return substringNode.execute(tpName, firstDot + 1, nameLen - firstDot - 1, TS_ENCODING, true);
        +                return getNameNode.execute(inliningTarget, cls);
                     }
                 }
         
        @@ -1304,13 +1063,13 @@ static Object setName(Object cls, Object value,
                                 @Cached CheckSetSpecialTypeAttrNode check,
                                 @Cached CastToTruffleStringNode castToStringNode,
                                 @Cached SetQualNameInnerNode innerNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     check.execute(inliningTarget, cls, value, T___QUALNAME__);
                     TruffleString stringValue;
                     try {
                         stringValue = castToStringNode.execute(inliningTarget, value);
                     } catch (CannotCastException e) {
        -                throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.CAN_ONLY_ASSIGN_STR_TO_QUALNAME, cls, value);
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.CAN_ONLY_ASSIGN_STR_TO_QUALNAME, cls, value);
                     }
                     innerNode.execute(inliningTarget, cls, stringValue);
                     return PNone.NONE;
        @@ -1370,11 +1129,11 @@ static Object doGeneric(Object self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached IsTypeNode isTypeNode,
                                 @Cached GetTypeFlagsNode getTypeFlagsNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     if (PGuards.isClass(inliningTarget, self, isTypeNode)) {
                         return getTypeFlagsNode.execute(self);
                     }
        -            throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.DESC_FLAG_FOR_TYPE_DOESNT_APPLY_TO_OBJ, self);
        +            throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.DESC_FLAG_FOR_TYPE_DOESNT_APPLY_TO_OBJ, self);
                 }
             }
         
        @@ -1386,7 +1145,7 @@ static Object get(Object self, @SuppressWarnings("unused") PNone none,
                                 @Bind("this") Node inliningTarget,
                                 @Exclusive @Cached IsSameTypeNode isSameTypeNode,
                                 @Exclusive @Cached ReadAttributeFromObjectNode readAttributeFromObjectNode,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Exclusive @Cached PRaiseNode raiseNode) {
                     // Avoid returning this descriptor
                     if (!isSameTypeNode.execute(inliningTarget, self, PythonBuiltinClassType.PythonClass)) {
                         Object result = readAttributeFromObjectNode.execute(self, T___ABSTRACTMETHODS__);
        @@ -1394,7 +1153,7 @@ static Object get(Object self, @SuppressWarnings("unused") PNone none,
                             return result;
                         }
                     }
        -            throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.OBJ_N_HAS_NO_ATTR_S, self, T___ABSTRACTMETHODS__);
        +            throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.OBJ_N_HAS_NO_ATTR_S, self, T___ABSTRACTMETHODS__);
                 }
         
                 @Specialization(guards = {"!isNoValue(value)", "!isDeleteMarker(value)"})
        @@ -1403,13 +1162,13 @@ static Object set(VirtualFrame frame, PythonClass self, Object value,
                                 @Cached PyObjectIsTrueNode isTrueNode,
                                 @Exclusive @Cached IsSameTypeNode isSameTypeNode,
                                 @Exclusive @Cached WriteAttributeToObjectNode writeAttributeToObjectNode,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Exclusive @Cached PRaiseNode raiseNode) {
                     if (!isSameTypeNode.execute(inliningTarget, self, PythonBuiltinClassType.PythonClass)) {
                         writeAttributeToObjectNode.execute(self, T___ABSTRACTMETHODS__, value);
        -                self.setAbstractClass(isTrueNode.execute(frame, inliningTarget, value));
        +                self.setAbstractClass(isTrueNode.execute(frame, value));
                         return PNone.NONE;
                     }
        -            throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.CANT_SET_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, J___ABSTRACTMETHODS__, self);
        +            throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.CANT_SET_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, J___ABSTRACTMETHODS__, self);
                 }
         
                 @Specialization(guards = "!isNoValue(value)")
        @@ -1418,7 +1177,7 @@ static Object delete(PythonClass self, @SuppressWarnings("unused") DescriptorDel
                                 @Exclusive @Cached IsSameTypeNode isSameTypeNode,
                                 @Exclusive @Cached ReadAttributeFromObjectNode readAttributeFromObjectNode,
                                 @Exclusive @Cached WriteAttributeToObjectNode writeAttributeToObjectNode,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Exclusive @Cached PRaiseNode raiseNode) {
                     if (!isSameTypeNode.execute(inliningTarget, self, PythonBuiltinClassType.PythonClass)) {
                         if (readAttributeFromObjectNode.execute(self, T___ABSTRACTMETHODS__) != NO_VALUE) {
                             writeAttributeToObjectNode.execute(self, T___ABSTRACTMETHODS__, NO_VALUE);
        @@ -1426,14 +1185,14 @@ static Object delete(PythonClass self, @SuppressWarnings("unused") DescriptorDel
                             return PNone.NONE;
                         }
                     }
        -            throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.CANT_SET_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, J___ABSTRACTMETHODS__, self);
        +            throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.CANT_SET_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, J___ABSTRACTMETHODS__, self);
                 }
         
                 @Fallback
                 @SuppressWarnings("unused")
                 static Object set(Object self, Object value,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(AttributeError, ErrorMessages.CANT_SET_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, J___ABSTRACTMETHODS__, self);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, AttributeError, ErrorMessages.CANT_SET_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, J___ABSTRACTMETHODS__, self);
                 }
             }
         
        @@ -1449,14 +1208,13 @@ static PSet dir(VirtualFrame frame, Object klass,
                                 @Cached PyObjectLookupAttr lookupAttrNode,
                                 @Cached com.oracle.graal.python.nodes.call.CallNode callNode,
                                 @Cached ToArrayNode toArrayNode,
        -                        @Cached("createGetAttrNode()") GetFixedAttributeNode getBasesNode,
        -                        @Cached PythonObjectFactory factory) {
        -            return dir(frame, inliningTarget, klass, lookupAttrNode, callNode, getBasesNode, toArrayNode, factory);
        +                        @Cached("createGetAttrNode()") GetFixedAttributeNode getBasesNode) {
        +            return dir(frame, inliningTarget, klass, lookupAttrNode, callNode, getBasesNode, toArrayNode);
                 }
         
                 private static PSet dir(VirtualFrame frame, Node inliningTarget, Object klass, PyObjectLookupAttr lookupAttrNode, com.oracle.graal.python.nodes.call.CallNode callNode,
        -                        GetFixedAttributeNode getBasesNode, ToArrayNode toArrayNode, PythonObjectFactory factory) {
        -            PSet names = factory.createSet();
        +                        GetFixedAttributeNode getBasesNode, ToArrayNode toArrayNode) {
        +            PSet names = PFactory.createSet(PythonLanguage.get(inliningTarget));
                     Object updateCallable = lookupAttrNode.execute(frame, inliningTarget, names, T_UPDATE);
                     Object ns = lookupAttrNode.execute(frame, inliningTarget, klass, T___DICT__);
                     if (ns != NO_VALUE) {
        @@ -1468,7 +1226,7 @@ private static PSet dir(VirtualFrame frame, Node inliningTarget, Object klass, P
                         for (Object cls : bases) {
                             // Note that since we are only interested in the keys, the order
                             // we merge classes is unimportant
        -                    Object baseNames = dir(frame, inliningTarget, cls, lookupAttrNode, callNode, getBasesNode, toArrayNode, factory);
        +                    Object baseNames = dir(frame, inliningTarget, cls, lookupAttrNode, callNode, getBasesNode, toArrayNode);
                             callNode.execute(frame, updateCallable, baseNames);
                         }
                     }
        @@ -1486,10 +1244,9 @@ public static DirNode create() {
                 }
             }
         
        -    @Builtin(name = J___OR__, minNumOfPositionalArgs = 2)
        -    @Builtin(name = J___ROR__, minNumOfPositionalArgs = 2, reverseOperation = true)
        +    @Slot(value = SlotKind.nb_or, isComplex = true)
             @GenerateNodeFactory
        -    abstract static class OrNode extends PythonBinaryBuiltinNode {
        +    abstract static class OrNode extends BinaryOpBuiltinNode {
                 @Specialization
                 Object union(Object self, Object other,
                                 @Cached GenericTypeNodes.UnionTypeOrNode orNode) {
        @@ -1503,17 +1260,18 @@ abstract static class AnnotationsNode extends PythonBinaryBuiltinNode {
                 @Specialization(guards = "isNoValue(value)")
                 static Object get(Object self, @SuppressWarnings("unused") Object value,
                                 @Bind("this") Node inliningTarget,
        +                        @Cached InlinedBranchProfile createDict,
                                 @Shared("read") @Cached ReadAttributeFromObjectNode read,
                                 @Shared("write") @Cached WriteAttributeToObjectNode write,
        -                        @Cached PythonObjectFactory.Lazy factory,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Exclusive @Cached PRaiseNode raiseNode) {
                     Object annotations = read.execute(self, T___ANNOTATIONS__);
                     if (annotations == NO_VALUE) {
        -                annotations = factory.get(inliningTarget).createDict();
        +                createDict.enter(inliningTarget);
        +                annotations = PFactory.createDict(PythonLanguage.get(inliningTarget));
                         try {
                             write.execute(self, T___ANNOTATIONS__, annotations);
                         } catch (PException e) {
        -                    throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, self, T___ANNOTATIONS__);
        +                    throw raiseNode.raise(inliningTarget, AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, self, T___ANNOTATIONS__);
                         }
                     }
                     return annotations;
        @@ -1524,15 +1282,15 @@ static Object delete(Object self, @SuppressWarnings("unused") Object value,
                                 @Bind("this") Node inliningTarget,
                                 @Shared("read") @Cached ReadAttributeFromObjectNode read,
                                 @Shared("write") @Cached WriteAttributeToObjectNode write,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     Object annotations = read.execute(self, T___ANNOTATIONS__);
                     try {
                         write.execute(self, T___ANNOTATIONS__, NO_VALUE);
                     } catch (PException e) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, T___ANNOTATIONS__, self);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, T___ANNOTATIONS__, self);
                     }
                     if (annotations == NO_VALUE) {
        -                throw raiseNode.get(inliningTarget).raise(AttributeError, new Object[]{T___ANNOTATIONS__});
        +                throw raiseNode.raise(inliningTarget, AttributeError, new Object[]{T___ANNOTATIONS__});
                     }
                     return PNone.NONE;
                 }
        @@ -1541,11 +1299,11 @@ static Object delete(Object self, @SuppressWarnings("unused") Object value,
                 static Object set(Object self, Object value,
                                 @Bind("this") Node inliningTarget,
                                 @Shared("write") @Cached WriteAttributeToObjectNode write,
        -                        @Shared @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Shared @Cached PRaiseNode raiseNode) {
                     try {
                         write.execute(self, T___ANNOTATIONS__, value);
                     } catch (PException e) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, T___ANNOTATIONS__, self);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_S_OF_IMMUTABLE_TYPE_N, T___ANNOTATIONS__, self);
                     }
                     return PNone.NONE;
                 }
        @@ -1560,25 +1318,16 @@ static Object signature(Object type) {
                     if (!(type instanceof PythonBuiltinClassType || type instanceof PythonBuiltinClass)) {
                         return PNone.NONE;
                     }
        +            TpSlots slots = GetTpSlotsNode.executeUncached(type);
                     /* Best effort at getting at least something */
        -            Object newSlot = LookupCallableSlotInMRONode.getUncached(SpecialMethodSlot.New).execute(type);
        -            if (!TypeNodes.CheckCallableIsSpecificBuiltinNode.executeUncached(newSlot, BuiltinConstructorsFactory.ObjectNodeFactory.getInstance())) {
        -                return fromMethod(LookupAttributeInMRONode.Dynamic.getUncached().execute(type, T___NEW__));
        +            if (slots.tp_new() instanceof TpSlotVarargs.TpSlotVarargsBuiltin builtin && builtin != ObjectBuiltins.SLOTS.tp_new()) {
        +                return AbstractFunctionBuiltins.TextSignatureNode.signatureToText(builtin.getSignature(), true);
                     }
        -            Object initSlot = LookupCallableSlotInMRONode.getUncached(SpecialMethodSlot.Init).execute(type);
        -            if (!TypeNodes.CheckCallableIsSpecificBuiltinNode.executeUncached(initSlot, ObjectBuiltinsFactory.InitNodeFactory.getInstance())) {
        -                return fromMethod(LookupAttributeInMRONode.Dynamic.getUncached().execute(type, T___INIT__));
        +            if (slots.tp_init() instanceof TpSlotVarargs.TpSlotVarargsBuiltin builtin && builtin != ObjectBuiltins.SLOTS.tp_init()) {
        +                return AbstractFunctionBuiltins.TextSignatureNode.signatureToText(builtin.getSignature(), true);
                     }
                     // object() signature
                     return StringLiterals.T_EMPTY_PARENS;
                 }
        -
        -        private static Object fromMethod(Object method) {
        -            if (method instanceof PBuiltinFunction || method instanceof PBuiltinMethod || method instanceof PFunction || method instanceof PMethod) {
        -                Signature signature = FunctionNodes.GetSignatureNode.executeUncached(method);
        -                return AbstractFunctionBuiltins.TextSignatureNode.signatureToText(signature, true);
        -            }
        -            return PNone.NONE;
        -        }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeNodes.java
        index e78aeabdb1..e492ce2c13 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeNodes.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeNodes.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -42,6 +42,7 @@
         
         import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError;
         import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
        +import static com.oracle.graal.python.builtins.objects.PNone.NO_VALUE;
         import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_SUBCLASS_CHECK;
         import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyHeapTypeObject__ht_qualname;
         import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_base;
        @@ -82,6 +83,7 @@
         import static com.oracle.graal.python.nodes.HiddenAttr.ITEMSIZE;
         import static com.oracle.graal.python.nodes.HiddenAttr.WEAKLISTOFFSET;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___CLASSCELL__;
        +import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___CLASS__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DICT__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DOC__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___QUALNAME__;
        @@ -89,6 +91,7 @@
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___WEAKREF__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T_MRO;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___CLASS_GETITEM__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___HASH__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INIT_SUBCLASS__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEW__;
         import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
        @@ -114,8 +117,6 @@
         import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PCallCapiFunction;
         import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol;
         import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitionsFactory.PythonToNativeNodeGen;
        -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef;
        -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyObjectBuiltins.HPyObjectNewNode;
         import com.oracle.graal.python.builtins.objects.cext.structs.CFields;
         import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess;
         import com.oracle.graal.python.builtins.objects.common.EconomicMapStorage;
        @@ -140,7 +141,6 @@
         import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetItemScalarNode;
         import com.oracle.graal.python.builtins.objects.dict.PDict;
         import com.oracle.graal.python.builtins.objects.frame.PFrame;
        -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor;
         import com.oracle.graal.python.builtins.objects.function.PArguments;
         import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
         import com.oracle.graal.python.builtins.objects.function.PFunction;
        @@ -149,7 +149,6 @@
         import com.oracle.graal.python.builtins.objects.getsetdescriptor.IndexedSlotDescriptor;
         import com.oracle.graal.python.builtins.objects.ints.PInt;
         import com.oracle.graal.python.builtins.objects.list.PList;
        -import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
         import com.oracle.graal.python.builtins.objects.module.PythonModule;
         import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins;
         import com.oracle.graal.python.builtins.objects.object.ObjectBuiltinsFactory;
        @@ -158,6 +157,9 @@
         import com.oracle.graal.python.builtins.objects.str.StringUtils;
         import com.oracle.graal.python.builtins.objects.superobject.SuperObject;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots.Builder;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots.TpSlotMeta;
         import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.GetBaseClassNodeGen;
         import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.GetBaseClassesNodeGen;
         import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.GetBasicSizeNodeGen;
        @@ -167,6 +169,7 @@
         import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.GetSolidBaseNodeGen;
         import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.GetSubclassesAsArrayNodeGen;
         import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.GetSubclassesNodeGen;
        +import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.GetTpNameNodeGen;
         import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.GetTypeFlagsNodeGen;
         import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.InstancesOfTypeHaveDictNodeGen;
         import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.InstancesOfTypeHaveWeakrefsNodeGen;
        @@ -174,7 +177,8 @@
         import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.IsSameTypeNodeGen;
         import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.IsTypeNodeGen;
         import com.oracle.graal.python.builtins.objects.type.TypeNodesFactory.SetTypeFlagsNodeGen;
        -import com.oracle.graal.python.lib.PyDictDelItem;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun;
        +import com.oracle.graal.python.lib.PyObjectLookupAttr;
         import com.oracle.graal.python.lib.PyObjectSizeNode;
         import com.oracle.graal.python.lib.PyUnicodeCheckNode;
         import com.oracle.graal.python.nodes.ErrorMessages;
        @@ -187,28 +191,28 @@
         import com.oracle.graal.python.nodes.SpecialMethodNames;
         import com.oracle.graal.python.nodes.attributes.GetAttributeNode;
         import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode;
        -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode;
        -import com.oracle.graal.python.nodes.attributes.LookupInheritedSlotNode;
         import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
         import com.oracle.graal.python.nodes.call.CallNode;
         import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode;
        +import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodNode;
        +import com.oracle.graal.python.nodes.classes.AbstractObjectGetBasesNode;
        +import com.oracle.graal.python.nodes.classes.AbstractObjectIsSubclassNode;
         import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
         import com.oracle.graal.python.nodes.expression.CastToListExpressionNode.CastToListNode;
         import com.oracle.graal.python.nodes.frame.ReadCallerFrameNode;
         import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode;
        -import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassProfile;
         import com.oracle.graal.python.nodes.object.GetClassNode;
         import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode;
         import com.oracle.graal.python.nodes.object.GetOrCreateDictNode;
        -import com.oracle.graal.python.nodes.truffle.PythonTypes;
         import com.oracle.graal.python.nodes.util.CannotCastException;
         import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
         import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext;
         import com.oracle.graal.python.runtime.IndirectCallData;
         import com.oracle.graal.python.runtime.PythonContext;
         import com.oracle.graal.python.runtime.exception.PException;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.exception.PythonErrorType;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.graal.python.runtime.sequence.PSequence;
         import com.oracle.graal.python.runtime.sequence.storage.MroSequenceStorage;
         import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage;
        @@ -230,10 +234,8 @@
         import com.oracle.truffle.api.dsl.GenerateUncached;
         import com.oracle.truffle.api.dsl.ImportStatic;
         import com.oracle.truffle.api.dsl.NeverDefault;
        -import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.ReportPolymorphism;
         import com.oracle.truffle.api.dsl.Specialization;
        -import com.oracle.truffle.api.dsl.TypeSystemReference;
         import com.oracle.truffle.api.frame.Frame;
         import com.oracle.truffle.api.frame.VirtualFrame;
         import com.oracle.truffle.api.interop.InteropLibrary;
        @@ -266,16 +268,16 @@ public static long executeUncached(Object clazz) {
                 }
         
                 @Specialization
        -        long doBuiltinClassType(PythonBuiltinClassType clazz,
        +        static long doBuiltinClassType(PythonBuiltinClassType clazz,
                                 @Bind("this") Node inliningTarget,
                                 @Shared("read") @Cached HiddenAttr.ReadNode readHiddenFlagsNode,
                                 @Shared("write") @Cached HiddenAttr.WriteNode writeHiddenFlagsNode,
                                 @Shared("profile") @Cached InlinedCountingConditionProfile profile) {
        -            return doManaged(PythonContext.get(this).getCore().lookupType(clazz), inliningTarget, readHiddenFlagsNode, writeHiddenFlagsNode, profile);
        +            return doManaged(PythonContext.get(inliningTarget).getCore().lookupType(clazz), inliningTarget, readHiddenFlagsNode, writeHiddenFlagsNode, profile);
                 }
         
                 @Specialization
        -        long doManaged(PythonManagedClass clazz,
        +        static long doManaged(PythonManagedClass clazz,
                                 @Bind("this") Node inliningTarget,
                                 @Shared("read") @Cached HiddenAttr.ReadNode readHiddenFlagsNode,
                                 @Shared("write") @Cached HiddenAttr.WriteNode writeHiddenFlagsNode,
        @@ -299,7 +301,7 @@ static long doNative(PythonNativeClass clazz,
                 }
         
                 @TruffleBoundary
        -        private long computeFlags(PythonManagedClass clazz) {
        +        private static long computeFlags(PythonManagedClass clazz) {
                     if (clazz instanceof PythonBuiltinClass) {
                         return defaultBuiltinFlags(((PythonBuiltinClass) clazz).getType());
                     }
        @@ -316,7 +318,7 @@ private long computeFlags(PythonManagedClass clazz) {
                         result |= MANAGED_DICT;
                     }
         
        -            PythonContext context = PythonContext.get(this);
        +            PythonContext context = PythonContext.get(null);
                     // flags are inherited
                     MroSequenceStorage mroStorage = GetMroStorageNode.executeUncached(clazz);
                     int n = mroStorage.length();
        @@ -404,7 +406,7 @@ private static long defaultBuiltinFlags(PythonBuiltinClassType clazz) {
                             result = DEFAULT | HAVE_GC | METHOD_DESCRIPTOR;
                             break;
                         case PLruListElem:
        -                    result = DEFAULT | HAVE_GC | DISALLOW_INSTANTIATION;
        +                    result = DEFAULT | HAVE_GC;
                             break;
                         case PBytesIOBuf:
                         case PMethod:
        @@ -465,6 +467,7 @@ private static long defaultBuiltinFlags(PythonBuiltinClassType clazz) {
                             break;
                     }
                     result |= clazz.isAcceptableBase() ? BASETYPE : 0;
        +            result |= clazz.disallowInstantiation() ? DISALLOW_INSTANTIATION : 0;
                     PythonBuiltinClassType iter = clazz;
                     while (iter != null) {
                         if (iter == PythonBuiltinClassType.PBaseException) {
        @@ -591,7 +594,7 @@ private static MroSequenceStorage doPythonClass(PythonManagedClass obj, Node inl
         
                 @InliningCutoff
                 private static void initializeMRO(PythonManagedClass obj, Node inliningTarget, InlinedConditionProfile isPythonClass, PythonLanguage language) {
        -            PythonAbstractClass[] mro = ComputeMroNode.doSlowPath(obj, false);
        +            PythonAbstractClass[] mro = ComputeMroNode.doSlowPath(inliningTarget, obj, false);
                     if (isPythonClass.profile(inliningTarget, obj instanceof PythonClass)) {
                         ((PythonClass) obj).setMRO(mro, language);
                     } else {
        @@ -633,7 +636,7 @@ static MroSequenceStorage doNativeClass(Node inliningTarget, PythonNativeClass o
                         }
                     }
                     raiseSystemErrorBranch.enter(inliningTarget);
        -            throw PRaiseNode.raiseUncached(inliningTarget, PythonBuiltinClassType.SystemError, ErrorMessages.INVALID_MRO_OBJ);
        +            throw PRaiseNode.raiseStatic(inliningTarget, SystemError, ErrorMessages.INVALID_MRO_OBJ);
                 }
         
                 private static Object initializeType(Node inliningTarget, PythonNativeClass obj, CStructAccess.ReadObjectNode getTpMroNode) {
        @@ -643,7 +646,7 @@ private static Object initializeType(Node inliningTarget, PythonNativeClass obj,
                     // call 'PyType_Ready' on the type
                     int res = (int) PCallCapiFunction.callUncached(NativeCAPISymbol.FUN_PY_TYPE_READY, PythonToNativeNodeGen.getUncached().execute(obj));
                     if (res < 0) {
        -                PRaiseNode.raiseUncached(inliningTarget, PythonBuiltinClassType.SystemError, ErrorMessages.LAZY_INITIALIZATION_FAILED, GetNameNode.executeUncached(obj));
        +                throw PRaiseNode.raiseStatic(inliningTarget, SystemError, ErrorMessages.LAZY_INITIALIZATION_FAILED, obj);
                     }
         
                     Object tupleObj = getTpMroNode.readFromObj(obj, PyTypeObject__tp_mro);
        @@ -670,7 +673,7 @@ static MroSequenceStorage doSlowPath(Node inliningTarget, Object obj) {
                                 return (MroSequenceStorage) sequenceStorage;
                             }
                         }
        -                throw PRaiseNode.raiseUncached(inliningTarget, PythonBuiltinClassType.SystemError, ErrorMessages.INVALID_MRO_OBJ);
        +                throw PRaiseNode.raiseStatic(inliningTarget, SystemError, ErrorMessages.INVALID_MRO_OBJ);
                     }
                     throw new IllegalStateException("unknown type " + obj.getClass().getName());
                 }
        @@ -685,17 +688,17 @@ public static GetMroStorageNode getUncached() {
                 }
             }
         
        +    /**
        +     * Equivalent of {@code _PyType_Name}. Returns unqualified name. Different from
        +     * {@code GetTpNameNode}.
        +     */
             @GenerateUncached
        -    @GenerateInline(inlineByDefault = true)
        -    @GenerateCached
        +    @GenerateInline
        +    @GenerateCached(false)
             public abstract static class GetNameNode extends Node {
         
                 public abstract TruffleString execute(Node inliningTarget, Object obj);
         
        -        public final TruffleString executeCached(Object obj) {
        -            return execute(this, obj);
        -        }
        -
                 public static TruffleString executeUncached(Object obj) {
                     return GetNameNodeGen.getUncached().execute(null, obj);
                 }
        @@ -712,26 +715,55 @@ static TruffleString doBuiltinClassType(PythonBuiltinClassType obj) {
         
                 @Specialization
                 TruffleString doNativeClass(PythonNativeClass obj,
        -                        @Cached(inline = false) CStructAccess.ReadCharPtrNode getTpNameNode) {
        -            return getTpNameNode.readFromObj(obj, PyTypeObject__tp_name);
        +                        @Cached CStructAccess.ReadCharPtrNode getTpNameNode,
        +                        @Cached TruffleString.CodePointLengthNode codePointLengthNode,
        +                        @Cached TruffleString.LastIndexOfCodePointNode indexOfCodePointNode,
        +                        @Cached TruffleString.SubstringNode substringNode) {
        +            // 'tp_name' contains the fully-qualified name, i.e., 'module.A.B...'
        +            TruffleString tpName = getTpNameNode.readFromObj(obj, PyTypeObject__tp_name);
        +            int nameLen = codePointLengthNode.execute(tpName, TS_ENCODING);
        +            int lastDot = indexOfCodePointNode.execute(tpName, '.', nameLen, 0, TS_ENCODING);
        +            if (lastDot < 0) {
        +                return tpName;
        +            }
        +            return substringNode.execute(tpName, lastDot + 1, nameLen - lastDot - 1, TS_ENCODING, true);
                 }
        +    }
         
        -        @Specialization(replaces = {"doManagedClass", "doBuiltinClassType", "doNativeClass"})
        -        @TruffleBoundary
        -        public static TruffleString doSlowPath(Object obj) {
        -            if (obj instanceof PythonManagedClass) {
        -                return ((PythonManagedClass) obj).getName();
        -            } else if (obj instanceof PythonBuiltinClassType) {
        -                return ((PythonBuiltinClassType) obj).getName();
        -            } else if (PGuards.isNativeClass(obj)) {
        -                return CStructAccess.ReadCharPtrNode.getUncached().readFromObj((PythonNativeClass) obj, PyTypeObject__tp_name);
        -            }
        -            throw new IllegalStateException("unknown type " + obj.getClass().getName());
        +    /*
        +     * Equivalent of getting {@code tp_name} field. Returns unqualified name for heaptypes, but
        +     * qualified name for builtins. Typically used in exception messages.
        +     */
        +    @GenerateUncached
        +    @GenerateInline
        +    @GenerateCached(false)
        +    public abstract static class GetTpNameNode extends Node {
        +
        +        public abstract TruffleString execute(Node inliningTarget, Object obj);
        +
        +        public static TruffleString executeUncached(Object obj) {
        +            return GetTpNameNodeGen.getUncached().execute(null, obj);
                 }
         
        -        @NeverDefault
        -        public static GetNameNode create() {
        -            return GetNameNodeGen.create();
        +        @Specialization
        +        static TruffleString doPythonClass(PythonClass obj) {
        +            return obj.getName();
        +        }
        +
        +        @Specialization
        +        static TruffleString doBuiltinClass(PythonBuiltinClass obj) {
        +            return doBuiltinClassType(obj.getType());
        +        }
        +
        +        @Specialization
        +        static TruffleString doBuiltinClassType(PythonBuiltinClassType obj) {
        +            return obj.getPrintName();
        +        }
        +
        +        @Specialization
        +        TruffleString doNativeClass(PythonNativeClass obj,
        +                        @Cached(inline = false) CStructAccess.ReadCharPtrNode getTpNameNode) {
        +            return getTpNameNode.readFromObj(obj, PyTypeObject__tp_name);
                 }
             }
         
        @@ -768,7 +800,6 @@ static TruffleString getQualName(Node inliningTarget, PythonAbstractNativeObject
                 }
             }
         
        -    @TypeSystemReference(PythonTypes.class)
             @GenerateUncached
             @GenerateInline
             @GenerateCached(false)
        @@ -784,19 +815,9 @@ protected static void unsafeAddSubclass(Object base, Object subclass) {
                     long hash = ObjectBuiltins.HashNode.hash(subclass);
                     PDict dict = executeUncached(base);
                     HashingStorage storage = dict.getDictStorage();
        -            // Booting order problem: special method slot for object.__eq__ is not initialized yet
        -            // In the unlikely event of hash collision __eq__ would fail
        -            if (HashingStorageLen.executeUncached(storage) == 0) {
        -                // This should not call __eq__
        -                HashingStorageSetItemWithHash setItem = HashingStorageSetItemWithHashNodeGen.getUncached();
        -                storage = setItem.execute(null, null, storage, subclass, hash, subclass);
        -                dict.setDictStorage(storage);
        -            } else {
        -                // the storage must be EconomicMap, because keys should not be Strings so there is
        -                // no other option left
        -                EconomicMapStorage mapStorage = (EconomicMapStorage) storage;
        -                mapStorage.putUncachedWithJavaEq(subclass, hash, subclass);
        -            }
        +            HashingStorageSetItemWithHash setItem = HashingStorageSetItemWithHashNodeGen.getUncached();
        +            storage = setItem.execute(null, null, storage, subclass, hash, subclass);
        +            dict.setDictStorage(storage);
                 }
         
                 protected static void unsafeRemoveSubclass(Object base, Object subclass) {
        @@ -821,7 +842,7 @@ static PDict doPythonClass(Node inliningTarget, PythonBuiltinClassType obj) {
                 }
         
                 @Specialization
        -        static PDict doNativeClass(Node inliningTarget, PythonNativeClass obj,
        +        static PDict doNativeClass(Node inliningTarget, PythonAbstractNativeObject obj,
                                 @Cached(inline = false) CStructAccess.ReadObjectNode getTpSubclassesNode,
                                 @Cached InlinedExactClassProfile profile) {
                     Object tpSubclasses = getTpSubclassesNode.readFromObj(obj, PyTypeObject__tp_subclasses);
        @@ -925,7 +946,7 @@ PythonAbstractClass[] doPythonClass(PythonBuiltinClassType obj) {
         
                 @Specialization
                 static PythonAbstractClass[] doNative(Node inliningTarget, PythonNativeClass obj,
        -                        @Cached PRaiseNode.Lazy raise,
        +                        @Cached PRaiseNode raise,
                                 @Cached(inline = false) CStructAccess.ReadObjectNode getTpBasesNode,
                                 @Cached InlinedExactClassProfile resultTypeProfile,
                                 @Cached GetInternalObjectArrayNode toArrayNode) {
        @@ -936,10 +957,10 @@ static PythonAbstractClass[] doNative(Node inliningTarget, PythonNativeClass obj
                         try {
                             return cast(values, storage);
                         } catch (ClassCastException e) {
        -                    throw raise.get(inliningTarget).raise(PythonBuiltinClassType.SystemError, ErrorMessages.UNSUPPORTED_OBJ_IN, "tp_bases");
        +                    throw raise.raise(inliningTarget, PythonBuiltinClassType.SystemError, ErrorMessages.UNSUPPORTED_OBJ_IN, "tp_bases");
                         }
                     }
        -            throw raise.get(inliningTarget).raise(PythonBuiltinClassType.SystemError, ErrorMessages.TYPE_DOES_NOT_PROVIDE_BASES);
        +            throw raise.raise(inliningTarget, PythonBuiltinClassType.SystemError, ErrorMessages.TYPE_DOES_NOT_PROVIDE_BASES);
                 }
         
                 // TODO: get rid of this
        @@ -984,7 +1005,7 @@ static Object doNative(Node inliningTarget, PythonNativeClass obj,
                         return result;
                     }
                     CompilerDirectives.transferToInterpreterAndInvalidate();
        -            throw PRaiseNode.raiseUncached(inliningTarget, SystemError, ErrorMessages.INVALID_BASE_TYPE_OBJ_FOR_CLASS, GetNameNode.doSlowPath(obj), result);
        +            throw PRaiseNode.raiseStatic(inliningTarget, SystemError, ErrorMessages.INVALID_BASE_TYPE_OBJ_FOR_CLASS, obj, result);
                 }
         
                 public static GetBaseClassNode getUncached() {
        @@ -1014,7 +1035,7 @@ static PythonAbstractClass getOne(PythonAbstractClass[] bases) {
                 static PythonAbstractClass getBestBase(Node inliningTarget, PythonAbstractClass[] bases,
                                 @Cached(inline = false) IsSubtypeNode isSubTypeNode,
                                 @Cached GetSolidBaseNode getSolidBaseNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     return bestBase(inliningTarget, bases, getSolidBaseNode, isSubTypeNode, raiseNode);
                 }
         
        @@ -1029,7 +1050,7 @@ static PythonAbstractClass fallback(PythonAbstractClass[] bases) {
                 /**
                  * Aims to get as close as possible to typeobject.best_base().
                  */
        -        private static PythonAbstractClass bestBase(Node inliningTarget, PythonAbstractClass[] bases, GetSolidBaseNode getSolidBaseNode, IsSubtypeNode isSubTypeNode, PRaiseNode.Lazy raiseNode)
        +        private static PythonAbstractClass bestBase(Node inliningTarget, PythonAbstractClass[] bases, GetSolidBaseNode getSolidBaseNode, IsSubtypeNode isSubTypeNode, PRaiseNode raiseNode)
                                 throws PException {
                     PythonAbstractClass base = null;
                     Object winner = null;
        @@ -1045,7 +1066,7 @@ private static PythonAbstractClass bestBase(Node inliningTarget, PythonAbstractC
                             winner = candidate;
                             base = basei;
                         } else {
        -                    throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MULTIPLE_BASES_LAYOUT_CONFLICT);
        +                    throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MULTIPLE_BASES_LAYOUT_CONFLICT);
                         }
                     }
                     return base;
        @@ -1085,8 +1106,6 @@ public abstract static class CheckCompatibleForAssigmentNode extends PNodeWithCo
                 @Child private LookupAttributeInMRONode lookupSlotsNode;
                 @Child private LookupAttributeInMRONode lookupNewNode;
                 @Child private PyObjectSizeNode sizeNode;
        -        @Child private PRaiseNode raiseNode;
        -        @Child private GetNameNode getTypeNameNode;
                 @Child private ReadAttributeFromObjectNode readAttr;
                 @Child private InstancesOfTypeHaveDictNode instancesHaveDictNode;
         
        @@ -1100,7 +1119,7 @@ boolean isCompatible(VirtualFrame frame, Object oldBase, Object newBase,
                                 @Cached GetBaseClassNode getBaseClassNode) {
                     if (!compatibleForAssignment(frame, inliningTarget, oldBase, newBase, isSameTypeNode, getBaseClassNode)) {
                         errorSlotsBranch.enter(inliningTarget);
        -                throw getRaiseNode().raise(TypeError, ErrorMessages.CLASS_ASSIGNMENT_S_LAYOUT_DIFFERS_FROM_S, getTypeName(newBase), getTypeName(oldBase));
        +                throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CLASS_ASSIGNMENT_N_LAYOUT_DIFFERS_FROM_N, newBase, oldBase);
                     }
                     return true;
                 }
        @@ -1195,14 +1214,6 @@ private boolean compareSlots(VirtualFrame frame, Object aType, Object bType, Obj
                     return aSize == bSize;
                 }
         
        -        private TruffleString getTypeName(Object clazz) {
        -            if (getTypeNameNode == null) {
        -                CompilerDirectives.transferToInterpreterAndInvalidate();
        -                getTypeNameNode = insert(TypeNodes.GetNameNode.create());
        -            }
        -            return getTypeNameNode.executeCached(clazz);
        -        }
        -
                 private Object getSlotsFromType(Object type) {
                     Object slots = getReadAttr().execute(type, T___SLOTS__);
                     return slots != PNone.NO_VALUE ? slots : null;
        @@ -1247,14 +1258,6 @@ private LookupAttributeInMRONode getLookupNewNode() {
                     }
                     return lookupNewNode;
                 }
        -
        -        private PRaiseNode getRaiseNode() {
        -            if (raiseNode == null) {
        -                CompilerDirectives.transferToInterpreterAndInvalidate();
        -                raiseNode = insert(PRaiseNode.create());
        -            }
        -            return raiseNode;
        -        }
             }
         
             /**
        @@ -1447,7 +1450,7 @@ private static boolean extraivars(Object type, Object base, Object typeSlots) {
                                     DynamicObjectLibrary.getUncached());
                     Object baseNewMethod = LookupAttributeInMRONode.lookup(T___NEW__, GetMroStorageNode.executeUncached(base), ReadAttributeFromObjectNode.getUncached(), true,
                                     DynamicObjectLibrary.getUncached());
        -            return !HasSameConstructorNode.isSameFunction(typeNewMethod, baseNewMethod);
        +            return typeNewMethod != baseNewMethod;
                 }
         
                 @TruffleBoundary
        @@ -1597,17 +1600,17 @@ static final class NotSameTypeException extends ControlFlowException {
             public abstract static class ComputeMroNode extends Node {
         
                 @TruffleBoundary
        -        public static PythonAbstractClass[] doSlowPath(PythonAbstractClass cls) {
        -            return doSlowPath(cls, true);
        +        public static PythonAbstractClass[] doSlowPath(Node node, PythonAbstractClass cls) {
        +            return doSlowPath(node, cls, true);
                 }
         
                 @TruffleBoundary
        -        public static PythonAbstractClass[] doSlowPath(PythonAbstractClass cls, boolean invokeMro) {
        -            return computeMethodResolutionOrder(cls, invokeMro);
        +        public static PythonAbstractClass[] doSlowPath(Node node, PythonAbstractClass cls, boolean invokeMro) {
        +            return computeMethodResolutionOrder(node, cls, invokeMro);
                 }
         
                 @TruffleBoundary
        -        static PythonAbstractClass[] invokeMro(PythonAbstractClass cls) {
        +        static PythonAbstractClass[] invokeMro(Node node, PythonAbstractClass cls) {
                     Object type = GetClassNode.executeUncached(cls);
                     if (IsTypeNode.executeUncached(type) && type instanceof PythonClass) {
                         Object mroMeth = LookupAttributeInMRONode.Dynamic.getUncached().execute(type, T_MRO);
        @@ -1615,20 +1618,20 @@ static PythonAbstractClass[] invokeMro(PythonAbstractClass cls) {
                             Object mroObj = CallUnaryMethodNode.getUncached().executeObject(mroMeth, cls);
                             if (mroObj instanceof PSequence mroSequence) {
                                 SequenceStorage mroStorage = mroSequence.getSequenceStorage();
        -                        return mroCheck(cls, GetInternalObjectArrayNode.executeUncached(mroStorage), mroStorage);
        +                        return mroCheck(node, cls, GetInternalObjectArrayNode.executeUncached(mroStorage), mroStorage);
                             }
        -                    throw PRaiseNode.getUncached().raise(TypeError, ErrorMessages.OBJ_NOT_ITERABLE, cls);
        +                    throw PRaiseNode.raiseStatic(node, TypeError, ErrorMessages.OBJ_NOT_ITERABLE, cls);
                         }
                     }
                     return null;
                 }
         
        -        private static PythonAbstractClass[] computeMethodResolutionOrder(PythonAbstractClass cls, boolean invokeMro) {
        +        private static PythonAbstractClass[] computeMethodResolutionOrder(Node node, PythonAbstractClass cls, boolean invokeMro) {
                     CompilerAsserts.neverPartOfCompilation();
         
                     PythonAbstractClass[] currentMRO;
                     if (invokeMro) {
        -                PythonAbstractClass[] mro = invokeMro(cls);
        +                PythonAbstractClass[] mro = invokeMro(node, cls);
                         if (mro != null) {
                             return mro;
                         }
        @@ -1657,12 +1660,12 @@ private static PythonAbstractClass[] computeMethodResolutionOrder(PythonAbstract
                         toMerge[baseClasses.length] = new MROMergeState(baseClasses);
                         ArrayList mro = new ArrayList<>();
                         mro.add(cls);
        -                currentMRO = mergeMROs(toMerge, mro);
        +                currentMRO = mergeMROs(node, toMerge, mro);
                     }
                     return currentMRO;
                 }
         
        -        private static PythonAbstractClass[] mroCheck(Object cls, Object[] mro, SequenceStorage storage) {
        +        private static PythonAbstractClass[] mroCheck(Node node, Object cls, Object[] mro, SequenceStorage storage) {
                     List resultMro = new ArrayList<>(storage.length());
                     Object solid = GetSolidBaseNode.executeUncached(cls);
                     for (int i = 0; i < storage.length(); i++) {
        @@ -1671,17 +1674,17 @@ private static PythonAbstractClass[] mroCheck(Object cls, Object[] mro, Sequence
                             continue;
                         }
                         if (!IsTypeNode.executeUncached(object)) {
        -                    throw PRaiseNode.getUncached().raise(TypeError, ErrorMessages.S_RETURNED_NON_CLASS, "mro()", object);
        +                    throw PRaiseNode.raiseStatic(node, TypeError, ErrorMessages.S_RETURNED_NON_CLASS, "mro()", object);
                         }
                         if (!IsSubtypeNode.getUncached().execute(solid, GetSolidBaseNode.executeUncached(object))) {
        -                    throw PRaiseNode.getUncached().raise(TypeError, ErrorMessages.S_RETURNED_BASE_WITH_UNSUITABLE_LAYOUT, "mro()", object);
        +                    throw PRaiseNode.raiseStatic(node, TypeError, ErrorMessages.S_RETURNED_BASE_WITH_UNSUITABLE_LAYOUT, "mro()", object);
                         }
                         resultMro.add((PythonAbstractClass) object);
                     }
                     return resultMro.toArray(new PythonAbstractClass[resultMro.size()]);
                 }
         
        -        private static PythonAbstractClass[] mergeMROs(MROMergeState[] toMerge, List mro) {
        +        private static PythonAbstractClass[] mergeMROs(Node node, MROMergeState[] toMerge, List mro) {
                     int idx;
                     scan: for (idx = 0; idx < toMerge.length; idx++) {
                         if (toMerge[idx].isMerged()) {
        @@ -1716,11 +1719,11 @@ private static PythonAbstractClass[] mergeMROs(MROMergeState[] toMerge, List it = notMerged.iterator();
        -                StringBuilder bases = new StringBuilder(GetNameNode.doSlowPath(it.next()).toJavaStringUncached());
        +                StringBuilder bases = new StringBuilder(GetNameNode.executeUncached(it.next()).toJavaStringUncached());
                         while (it.hasNext()) {
        -                    bases.append(", ").append(GetNameNode.doSlowPath(it.next()));
        +                    bases.append(", ").append(GetNameNode.executeUncached(it.next()));
                         }
        -                throw PRaiseNode.getUncached().raise(TypeError, ErrorMessages.CANNOT_GET_CONSISTEMT_METHOD_RESOLUTION, bases.toString());
        +                throw PRaiseNode.raiseStatic(node, TypeError, ErrorMessages.CANNOT_GET_CONSISTEMT_METHOD_RESOLUTION, bases.toString());
                     }
         
                     return mro.toArray(new PythonAbstractClass[mro.size()]);
        @@ -1794,11 +1797,6 @@ public abstract static class IsAcceptableBaseNode extends Node {
         
                 @Specialization
                 static boolean doUserClass(PythonClass obj) {
        -            // Special case for custom classes created via HPy: They are managed classes but can
        -            // have custom flags. The flags may prohibit subtyping.
        -            if (obj.isHPyType()) {
        -                return (obj.getFlags() & GraalHPyDef.HPy_TPFLAGS_BASETYPE) != 0;
        -            }
                     return true;
                 }
         
        @@ -1841,6 +1839,10 @@ public abstract static class GetInstanceShape extends PNodeWithContext {
         
                 public abstract Shape execute(Object clazz);
         
        +        public static Shape executeUncached(Object clazz) {
        +            return TypeNodesFactory.GetInstanceShapeNodeGen.getUncached().execute(clazz);
        +        }
        +
                 @Specialization(guards = "clazz == cachedClazz", limit = "1")
                 @SuppressWarnings("unused")
                 protected Shape doBuiltinClassTypeCached(PythonBuiltinClassType clazz,
        @@ -1896,13 +1898,16 @@ protected static Shape doNativeClass(PythonAbstractNativeObject clazz,
                 @Specialization(guards = {"!isManagedClass(clazz)", "!isPythonBuiltinClassType(clazz)"})
                 @InliningCutoff
                 protected static Shape doError(@SuppressWarnings("unused") Object clazz,
        -                        @Cached PRaiseNode raise) {
        -            throw raise.raise(PythonBuiltinClassType.SystemError, ErrorMessages.CANNOT_GET_SHAPE_OF_NATIVE_CLS);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.SystemError, ErrorMessages.CANNOT_GET_SHAPE_OF_NATIVE_CLS);
                 }
         
        +        public static GetInstanceShape getUncached() {
        +            return TypeNodesFactory.GetInstanceShapeNodeGen.getUncached();
        +        }
             }
         
        -    @ImportStatic({SpecialMethodNames.class, SpecialAttributeNames.class, SpecialMethodSlot.class})
        +    @ImportStatic({SpecialMethodNames.class, SpecialAttributeNames.class})
             public abstract static class CreateTypeNode extends Node {
                 public abstract PythonClass execute(VirtualFrame frame, PDict namespaceOrig, TruffleString name, PTuple bases, Object metaclass, PKeyword[] kwds);
         
        @@ -1944,105 +1949,118 @@ protected PythonClass makeType(VirtualFrame frame, PDict namespaceOrig, TruffleS
                                 @Cached HashingStorageIteratorNext itNext,
                                 @Cached HashingStorageIteratorKey itKey,
                                 @Cached HashingStorageIteratorValue itValue,
        -                        @Cached PyDictDelItem delItemNamespace,
        -                        @Cached("create(SetName)") LookupInheritedSlotNode getSetNameNode,
        +                        @Cached HashingStorageDelItem delItemNamespace,
        +                        @Cached GetClassNode getClassNode,
        +                        @Cached("create(T___SET_NAME__)") LookupSpecialMethodNode getSetNameNode,
                                 @Cached CallNode callSetNameNode,
                                 @Cached CallNode callInitSubclassNode,
                                 @Cached("create(T___INIT_SUBCLASS__)") GetAttributeNode getInitSubclassNode,
                                 @Cached GetMroStorageNode getMroStorageNode,
        -                        @Cached PythonObjectFactory factory,
        +                        @Bind PythonLanguage language,
                                 @Cached PRaiseNode raise,
                                 @Cached AllocateTypeWithMetaclassNode typeMetaclass) {
        -            try {
        -                assert SpecialMethodSlot.pushInitializedTypePlaceholder();
        -                PDict namespace = factory.createDict();
        -                PythonLanguage language = PythonLanguage.get(this);
        -                namespace.setDictStorage(initNode.execute(frame, namespaceOrig, PKeyword.EMPTY_KEYWORDS));
        -                PythonClass newType = typeMetaclass.execute(frame, name, bases, namespace, metaclass);
        -
        -                // set '__module__' attribute
        -                Object moduleAttr = ensureReadAttrNode().execute(newType, SpecialAttributeNames.T___MODULE__);
        -                if (moduleAttr == PNone.NO_VALUE) {
        -                    PythonObject globals;
        -                    if (getRootNode() instanceof BuiltinFunctionRootNode) {
        -                        PFrame callerFrame = getReadCallerFrameNode().executeWith(frame, 0);
        -                        globals = callerFrame != null ? callerFrame.getGlobals() : null;
        -                    } else {
        -                        globals = PArguments.getGlobals(frame);
        -                    }
        -                    if (globals != null) {
        -                        TruffleString moduleName = getModuleNameFromGlobals(inliningTarget, globals, getItemGlobals);
        -                        if (moduleName != null) {
        -                            newType.setAttribute(SpecialAttributeNames.T___MODULE__, moduleName);
        -                        }
        +            PDict namespace = PFactory.createDict(language);
        +            namespace.setDictStorage(initNode.execute(frame, namespaceOrig, PKeyword.EMPTY_KEYWORDS));
        +            PythonClass newType = typeMetaclass.execute(frame, name, bases, namespace, metaclass);
        +
        +            // set '__module__' attribute
        +            Object moduleAttr = ensureReadAttrNode().execute(newType, SpecialAttributeNames.T___MODULE__);
        +            if (moduleAttr == PNone.NO_VALUE) {
        +                PythonObject globals;
        +                if (getRootNode() instanceof BuiltinFunctionRootNode) {
        +                    PFrame callerFrame = getReadCallerFrameNode().executeWith(frame, 0);
        +                    globals = callerFrame != null ? callerFrame.getGlobals() : null;
        +                } else {
        +                    globals = PArguments.getGlobals(frame);
        +                }
        +                if (globals != null) {
        +                    TruffleString moduleName = getModuleNameFromGlobals(inliningTarget, globals, getItemGlobals);
        +                    if (moduleName != null) {
        +                        newType.setAttribute(SpecialAttributeNames.T___MODULE__, moduleName);
                             }
                         }
        +            }
         
        -                // delete __qualname__ from namespace
        -                delItemNamespace.execute(inliningTarget, namespace, T___QUALNAME__);
        +            // delete __qualname__ from namespace
        +            delItemNamespace.execute(inliningTarget, namespace.getDictStorage(), T___QUALNAME__, namespace);
         
        -                // initialize '__doc__' attribute
        -                if (newType.getAttribute(SpecialAttributeNames.T___DOC__) == PNone.NO_VALUE) {
        -                    newType.setAttribute(SpecialAttributeNames.T___DOC__, PNone.NONE);
        -                }
        +            // initialize '__doc__' attribute
        +            if (newType.getAttribute(SpecialAttributeNames.T___DOC__) == PNone.NO_VALUE) {
        +                newType.setAttribute(SpecialAttributeNames.T___DOC__, PNone.NONE);
        +            }
         
        -                // set __class__ cell contents
        -                Object classcell = getItemNamespace.execute(inliningTarget, namespace.getDictStorage(), SpecialAttributeNames.T___CLASSCELL__);
        -                if (classcell != null) {
        -                    if (classcell instanceof PCell) {
        -                        ((PCell) classcell).setRef(newType);
        -                    } else {
        -                        throw raise.raise(TypeError, ErrorMessages.MUST_BE_A_CELL, "__classcell__");
        -                    }
        -                    delItemNamespace.execute(inliningTarget, namespace, SpecialAttributeNames.T___CLASSCELL__);
        +            // set __class__ cell contents
        +            Object classcell = getItemNamespace.execute(inliningTarget, namespace.getDictStorage(), SpecialAttributeNames.T___CLASSCELL__);
        +            if (classcell != null) {
        +                if (classcell instanceof PCell) {
        +                    ((PCell) classcell).setRef(newType);
        +                } else {
        +                    throw raise.raise(inliningTarget, TypeError, ErrorMessages.MUST_BE_A_CELL, "__classcell__");
                         }
        +                delItemNamespace.execute(inliningTarget, namespace.getDictStorage(), SpecialAttributeNames.T___CLASSCELL__, namespace);
        +            }
        +
        +            // Initialization of the type slots:
        +            //
        +            // For now, we have the same helper functions as CPython and we execute them in the
        +            // same order even-though we could squash them and optimize the wrapping and
        +            // unwrapping of slots, but it would be more difficult to make sure that at the end
        +            // of the day we produce exactly the same results, especially if there are native
        +            // types in the MRO (we can, e.g., optimize this only for pure Python types to keep
        +            // it still simple).
        +            //
        +            // From CPython point of view: we are in "type_new_impl", we call PyType_Ready,
        +            // which calls:
        +            //
        +            // - type_ready_fill_dict, which calls add_operators, which fills the dunder methods
        +            // from the slots. Here we are creating a managed type, so there cannot be any
        +            // native slots, so this is a no-op for us.
        +            //
        +            // - type_ready_inherit to inherit the type slots. Here we may inherit slots from
        +            // native classes in the MRO and things would get complicated if we did not follow
        +            // CPython structure.
        +            //
        +            // - type_ready_set_hash: sets tp_hash=PyObject_HashNotImplemented and __hash__=None
        +            // if tp_hash is NULL (it must be, this is managed class) and there's no __hash__
        +            // magic method.
        +            //
        +            // - fixup_slot_dispatchers to set the slots according to magic methods.
        +
        +            Builder inheritedSlots = TpSlots.buildInherited(newType, namespace, getMroStorageNode.execute(inliningTarget, newType), true);
        +            // type_ready_set_hash
        +            if (inheritedSlots.get(TpSlotMeta.TP_HASH) == null) {
        +                Object dunderHash = getItemNamespace.execute(inliningTarget, namespace.getDictStorage(), T___HASH__);
        +                if (dunderHash == null) {
        +                    inheritedSlots.set(TpSlotMeta.TP_HASH, TpSlotHashFun.HASH_NOT_IMPLEMENTED);
        +                    newType.setAttribute(T___HASH__, PNone.NONE);
        +                }
        +            }
        +            TpSlots.fixupSlotDispatchers(newType, inheritedSlots);
        +            newType.setTpSlots(inheritedSlots.build());
         
        -                SpecialMethodSlot.initializeSpecialMethodSlots(newType, getMroStorageNode.execute(inliningTarget, newType), language);
        -
        -                // Initialization of the type slots:
        -                //
        -                // For now, we have the same helper functions as CPython and we execute them in the
        -                // same order even-though we could squash them and optimize the wrapping and
        -                // unwrapping of slots, but it would be more difficult to make sure that at the end
        -                // of the day we produce exactly the same results, especially if there are native
        -                // types in the MRO (we can, e.g., optimize this only for pure Python types to keep
        -                // it still simple).
        -                //
        -                // From CPython point of view: we are in "type_new_impl", we call PyType_Ready,
        -                // which calls type_ready_inherit to inherit the slots, and then
        -                // fixup_slot_dispatchers to set the slots according to magic methods.
        -                //
        -                // We do not need to map slots to magic methods (add_operators in CPython), because
        -                // this is a managed class and it cannot define its own slots.
        -                TpSlots.inherit(newType, getMroStorageNode.execute(inliningTarget, newType), true);
        -                TpSlots.fixupSlotDispatchers(newType);
        -
        -                HashingStorage storage = namespace.getDictStorage();
        -                HashingStorageIterator it = getIterator.execute(inliningTarget, storage);
        -                while (itNext.execute(inliningTarget, storage, it)) {
        -                    Object value = itValue.execute(inliningTarget, storage, it);
        -                    Object setName = getSetNameNode.execute(value);
        -                    if (setName != PNone.NO_VALUE) {
        -                        Object key = itKey.execute(inliningTarget, storage, it);
        -                        try {
        -                            callSetNameNode.execute(frame, setName, value, newType, key);
        -                        } catch (PException e) {
        -                            throw raise.raiseWithCause(PythonBuiltinClassType.RuntimeError, e.getEscapedException(), ErrorMessages.ERROR_CALLING_SET_NAME, value, key, newType);
        -                        }
        +            HashingStorage storage = namespace.getDictStorage();
        +            HashingStorageIterator it = getIterator.execute(inliningTarget, storage);
        +            while (itNext.execute(inliningTarget, storage, it)) {
        +                Object value = itValue.execute(inliningTarget, storage, it);
        +                Object setName = getSetNameNode.execute(frame, getClassNode.execute(inliningTarget, value), value);
        +                if (setName != PNone.NO_VALUE) {
        +                    Object key = itKey.execute(inliningTarget, storage, it);
        +                    try {
        +                        callSetNameNode.execute(frame, setName, value, newType, key);
        +                    } catch (PException e) {
        +                        throw raise.raiseWithCause(inliningTarget, PythonBuiltinClassType.RuntimeError, e, ErrorMessages.ERROR_CALLING_SET_NAME, value, key, newType);
                             }
                         }
        +            }
         
        -                // Call __init_subclass__ on the parent of a newly generated type
        -                SuperObject superObject = factory.createSuperObject(PythonBuiltinClassType.Super);
        -                superObject.init(newType, newType, newType);
        -                callInitSubclassNode.execute(frame, getInitSubclassNode.executeObject(frame, superObject), PythonUtils.EMPTY_OBJECT_ARRAY, kwds);
        +            // Call __init_subclass__ on the parent of a newly generated type
        +            SuperObject superObject = PFactory.createSuperObject(language);
        +            superObject.init(newType, newType, newType);
        +            callInitSubclassNode.execute(frame, getInitSubclassNode.executeObject(frame, superObject), PythonUtils.EMPTY_OBJECT_ARRAY, kwds);
         
        -                newType.initializeMroShape(language);
        +            newType.initializeMroShape(language);
         
        -                return newType;
        -            } finally {
        -                assert SpecialMethodSlot.popInitializedType();
        -            }
        +            return newType;
                 }
         
                 private TruffleString getModuleNameFromGlobals(Node inliningTarget, PythonObject globals, HashingStorageGetItem getItem) {
        @@ -2067,7 +2085,7 @@ private TruffleString getModuleNameFromGlobals(Node inliningTarget, PythonObject
                 }
             }
         
        -    @ImportStatic({SpecialMethodNames.class, SpecialAttributeNames.class, SpecialMethodSlot.class})
        +    @ImportStatic({SpecialMethodNames.class, SpecialAttributeNames.class})
             @GenerateInline(false) // footprint reduction 208 -> 190
             protected abstract static class AllocateTypeWithMetaclassNode extends Node {
         
        @@ -2105,7 +2123,7 @@ static PythonClass typeMetaclass(VirtualFrame frame, TruffleString name, PTuple
                                 @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
                                 @Cached PRaiseNode raise,
                                 @Cached GetObjectArrayNode getObjectArray,
        -                        @Cached PythonObjectFactory factory,
        +                        @Cached GetInstanceShape getInstanceShape,
                                 @Cached CastToListNode castToListNode,
                                 @Cached PyUnicodeCheckNode stringCheck,
                                 @Cached TruffleString.IsValidNode isValidNode,
        @@ -2114,8 +2132,8 @@ static PythonClass typeMetaclass(VirtualFrame frame, TruffleString name, PTuple
                                 @Cached TruffleString.EqualNode equalNode,
                                 @Cached CastToTruffleStringNode castToStringNode,
                                 @Cached GetItemSizeNode getItemSize) {
        -            PythonLanguage language = PythonLanguage.get(inliningTarget);
                     PythonContext context = PythonContext.get(inliningTarget);
        +            PythonLanguage language = context.getLanguage(inliningTarget);
                     Python3Core core = context.getCore();
                     TypeNewContext ctx = new TypeNewContext();
                     Object[] array = getObjectArray.execute(inliningTarget, bases);
        @@ -2133,7 +2151,7 @@ static PythonClass typeMetaclass(VirtualFrame frame, TruffleString name, PTuple
                             } else if (array[i] instanceof PythonBuiltinClassType) {
                                 basesArray[i] = core.lookupType((PythonBuiltinClassType) array[i]);
                             } else {
        -                        throw raise.raise(PythonBuiltinClassType.NotImplementedError, ErrorMessages.CREATING_CLASS_NON_CLS_BASES);
        +                        throw raise.raise(inliningTarget, PythonBuiltinClassType.NotImplementedError, ErrorMessages.CREATING_CLASS_NON_CLS_BASES);
                             }
                         }
                     }
        @@ -2146,35 +2164,23 @@ static PythonClass typeMetaclass(VirtualFrame frame, TruffleString name, PTuple
                         throw constructAndRaiseNode.get(inliningTarget).raiseUnicodeEncodeError(frame, "utf-8", name, 0, codePointLengthNode.execute(name, TS_ENCODING), "can't encode class name");
                     }
                     if (indexOfCodePointNode.execute(name, 0, 0, codePointLengthNode.execute(name, TS_ENCODING), TS_ENCODING) >= 0) {
        -                throw raise.raise(PythonBuiltinClassType.ValueError, ErrorMessages.TYPE_NAME_NO_NULL_CHARS);
        +                throw raise.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.TYPE_NAME_NO_NULL_CHARS);
                     }
         
                     // 1.) create class, but avoid calling mro method - it might try to access __dict__ so
                     // we have to copy dict slots first
        -            PythonClass pythonClass = factory.createPythonClass(metaclass, name, false, base, basesArray);
        -            assert SpecialMethodSlot.replaceInitializedTypeTop(pythonClass);
        +            PythonClass pythonClass = PFactory.createPythonClass(language, metaclass, getInstanceShape.execute(metaclass), name, false, base, basesArray);
         
                     // 2.) copy the dictionary slots
        -            copyDictSlots(frame, inliningTarget, ctx, pythonClass, namespace, setHashingStorageItem,
        +            copyDictSlots(frame, inliningTarget, language, ctx, pythonClass, namespace, setHashingStorageItem,
                                     getHashingStorageIterator, hashingStorageItNext, hashingStorageItKey, hashingStorageItKeyHash, hashingStorageItValue,
        -                            constructAndRaiseNode, factory, raise, isValidNode, equalNode, codePointLengthNode, getOrCreateDictNode, stringCheck, castToStringNode);
        +                            constructAndRaiseNode, raise, isValidNode, equalNode, codePointLengthNode, getOrCreateDictNode, stringCheck, castToStringNode);
                     if (!ctx.qualnameSet) {
                         pythonClass.setQualName(name);
                     }
         
                     // 3.) invoke metaclass mro() method
        -            pythonClass.invokeMro();
        -
        -            // CPython masks the __hash__ method with None when __eq__ is overriden, but __hash__ is
        -            // not
        -            HashingStorage namespaceStorage = namespace.getDictStorage();
        -            Object hashMethod = getHashingStorageItem.execute(frame, inliningTarget, namespaceStorage, SpecialMethodNames.T___HASH__);
        -            if (hashMethod == null) {
        -                Object eqMethod = getHashingStorageItem.execute(frame, inliningTarget, namespaceStorage, SpecialMethodNames.T___EQ__);
        -                if (eqMethod != null) {
        -                    pythonClass.setAttribute(SpecialMethodNames.T___HASH__, PNone.NONE);
        -                }
        -            }
        +            pythonClass.invokeMro(inliningTarget);
         
                     // may_add_dict = base->tp_dictoffset == 0
                     ctx.mayAddDict = !hasDictNode.execute(base);
        @@ -2208,7 +2214,7 @@ static PythonClass typeMetaclass(VirtualFrame frame, TruffleString name, PTuple
                         int slotlen = slotsStorage.length();
         
                         if (slotlen > 0 && hasItemSize) {
        -                    throw raise.raise(TypeError, ErrorMessages.NONEMPTY_SLOTS_NOT_ALLOWED_FOR_SUBTYPE_OF_S, base);
        +                    throw raise.raise(inliningTarget, TypeError, ErrorMessages.NONEMPTY_SLOTS_NOT_ALLOWED_FOR_SUBTYPE_OF_S, base);
                         }
         
                         for (int i = 0; i < slotlen; i++) {
        @@ -2218,20 +2224,20 @@ static PythonClass typeMetaclass(VirtualFrame frame, TruffleString name, PTuple
                             if (stringCheck.execute(inliningTarget, element)) {
                                 slotName = castToStringNode.execute(inliningTarget, element);
                                 if (!(boolean) isIdentifier.execute(frame, slotName)) {
        -                            throw raise.raise(TypeError, ErrorMessages.SLOTS_MUST_BE_IDENTIFIERS);
        +                            throw raise.raise(inliningTarget, TypeError, ErrorMessages.SLOTS_MUST_BE_IDENTIFIERS);
                                 }
                             } else {
        -                        throw raise.raise(TypeError, ErrorMessages.MUST_BE_STRINGS_NOT_P, "__slots__ items", element);
        +                        throw raise.raise(inliningTarget, TypeError, ErrorMessages.MUST_BE_STRINGS_NOT_P, "__slots__ items", element);
                             }
                             if (equalNode.execute(slotName, T___DICT__, TS_ENCODING)) {
                                 if (!ctx.mayAddDict || ctx.addDict) {
        -                            throw raise.raise(TypeError, ErrorMessages.DICT_SLOT_DISALLOWED_WE_GOT_ONE);
        +                            throw raise.raise(inliningTarget, TypeError, ErrorMessages.DICT_SLOT_DISALLOWED_WE_GOT_ONE);
                                 }
                                 ctx.addDict = true;
        -                        addDictDescrAttribute(basesArray, pythonClass, factory);
        +                        addDictDescrAttribute(basesArray, pythonClass, language);
                             } else if (equalNode.execute(slotName, T___WEAKREF__, TS_ENCODING)) {
                                 if (!ctx.mayAddWeak || ctx.addWeak) {
        -                            throw raise.raise(TypeError, ErrorMessages.WEAKREF_SLOT_DISALLOWED_WE_GOT_ONE);
        +                            throw raise.raise(inliningTarget, TypeError, ErrorMessages.WEAKREF_SLOT_DISALLOWED_WE_GOT_ONE);
                                 }
                                 ctx.addWeak = true;
                             }
        @@ -2253,19 +2259,19 @@ static PythonClass typeMetaclass(VirtualFrame frame, TruffleString name, PTuple
                     int indexedSlotCount = getIndexedSlotsCountNode.execute(inliningTarget, base);
                     if (ctx.copiedSlots != null) {
                         for (TruffleString slotName : ctx.copiedSlots) {
        -                    IndexedSlotDescriptor slotDesc = factory.createIndexedSlotDescriptor(slotName, indexedSlotCount++, pythonClass);
        +                    IndexedSlotDescriptor slotDesc = PFactory.createIndexedSlotDescriptor(language, slotName, indexedSlotCount++, pythonClass);
                             pythonClass.setAttribute(slotName, slotDesc);
                         }
                     }
                     pythonClass.setIndexedSlotCount(indexedSlotCount);
         
                     if (ctx.addDict) {
        -                addDictDescrAttribute(basesArray, pythonClass, factory);
        +                addDictDescrAttribute(basesArray, pythonClass, language);
                     } else if (ctx.mayAddDict) {
                         pythonClass.setHasSlotsButNoDictFlag();
                     }
                     if (ctx.addWeak) {
        -                addWeakrefDescrAttribute(pythonClass, factory);
        +                addWeakrefDescrAttribute(pythonClass, language);
                     }
         
                     if (pythonClass.needsNativeAllocation()) {
        @@ -2297,31 +2303,31 @@ private static void typeNewSlotBases(TypeNewContext ctx, Object primaryBase, Pyt
                 }
         
                 @TruffleBoundary
        -        private static void addDictDescrAttribute(PythonAbstractClass[] basesArray, PythonClass pythonClass, PythonObjectFactory factory) {
        +        private static void addDictDescrAttribute(PythonAbstractClass[] basesArray, PythonClass pythonClass, PythonLanguage language) {
                     // Note: we need to avoid MRO lookup of __dict__ using slots because they are not
                     // initialized yet
                     if ((!hasPythonClassBases(basesArray) && LookupAttributeInMRONode.lookupSlowPath(pythonClass, T___DICT__) == PNone.NO_VALUE) || basesHaveSlots(basesArray)) {
                         Builtin dictBuiltin = ObjectBuiltins.DictNode.class.getAnnotation(Builtin.class);
                         RootCallTarget callTarget = PythonLanguage.get(null).createCachedCallTarget(
                                         l -> new BuiltinFunctionRootNode(l, dictBuiltin, ObjectBuiltinsFactory.DictNodeFactory.getInstance(), true), ObjectBuiltins.DictNode.class);
        -                setAttribute(T___DICT__, dictBuiltin, callTarget, pythonClass, factory);
        +                setAttribute(T___DICT__, dictBuiltin, callTarget, pythonClass, language);
                     }
                 }
         
                 @TruffleBoundary
        -        private static void addWeakrefDescrAttribute(PythonClass pythonClass, PythonObjectFactory factory) {
        +        private static void addWeakrefDescrAttribute(PythonClass pythonClass, PythonLanguage language) {
                     if (LookupAttributeInMRONode.lookupSlowPath(pythonClass, T___WEAKREF__) == PNone.NO_VALUE) {
                         Builtin builtin = GetWeakRefsNode.class.getAnnotation(Builtin.class);
                         RootCallTarget callTarget = PythonLanguage.get(null).createCachedCallTarget(
                                         l -> new BuiltinFunctionRootNode(l, builtin, WeakRefModuleBuiltinsFactory.GetWeakRefsNodeFactory.getInstance(), true), GetWeakRefsNode.class);
        -                setAttribute(T___WEAKREF__, builtin, callTarget, pythonClass, factory);
        +                setAttribute(T___WEAKREF__, builtin, callTarget, pythonClass, language);
                     }
                 }
         
        -        private static void setAttribute(TruffleString name, Builtin builtin, RootCallTarget callTarget, PythonClass pythonClass, PythonObjectFactory factory) {
        +        private static void setAttribute(TruffleString name, Builtin builtin, RootCallTarget callTarget, PythonClass pythonClass, PythonLanguage language) {
                     int flags = PBuiltinFunction.getFlags(builtin, callTarget);
        -            PBuiltinFunction function = factory.createBuiltinFunction(name, pythonClass, 1, flags, callTarget);
        -            GetSetDescriptor desc = factory.createGetSetDescriptor(function, function, name, pythonClass, true);
        +            PBuiltinFunction function = PFactory.createBuiltinFunction(language, name, pythonClass, 1, flags, callTarget);
        +            GetSetDescriptor desc = PFactory.createGetSetDescriptor(language, function, function, name, pythonClass, true);
                     pythonClass.setAttribute(name, desc);
                 }
         
        @@ -2411,10 +2417,11 @@ private static long installMemberDescriptors(PythonManagedClass pythonClass, Tru
                     return slotOffset;
                 }
         
        -        private static void copyDictSlots(VirtualFrame frame, Node inliningTarget, TypeNewContext ctx, PythonClass pythonClass, PDict namespace, HashingStorageSetItemWithHash setHashingStorageItem,
        +        private static void copyDictSlots(VirtualFrame frame, Node inliningTarget, PythonLanguage language, TypeNewContext ctx, PythonClass pythonClass, PDict namespace,
        +                        HashingStorageSetItemWithHash setHashingStorageItem,
                                 HashingStorageGetIterator getHashingStorageIterator, HashingStorageIteratorNext hashingStorageItNext, HashingStorageIteratorKey hashingStorageItKey,
                                 HashingStorageIteratorKeyHash hashingStorageItKeyHash, HashingStorageIteratorValue hashingStorageItValue,
        -                        PConstructAndRaiseNode.Lazy constructAndRaiseNode, PythonObjectFactory factory, PRaiseNode raise, IsValidNode isValidNode,
        +                        PConstructAndRaiseNode.Lazy constructAndRaiseNode, PRaiseNode raise, IsValidNode isValidNode,
                                 EqualNode equalNode, CodePointLengthNode codePointLengthNode, GetOrCreateDictNode getOrCreateDictNode, PyUnicodeCheckNode stringCheck,
                                 CastToTruffleStringNode castToStringNode) {
                     // copy the dictionary slots over, as CPython does through PyDict_Copy
        @@ -2434,7 +2441,7 @@ private static void copyDictSlots(VirtualFrame frame, Node inliningTarget, TypeN
                             if (equalNode.execute(T___NEW__, key, TS_ENCODING)) {
                                 // see CPython: if it's a plain function, make it a static function
                                 if (value instanceof PFunction) {
        -                            pythonClass.setAttribute(key, factory.createStaticmethodFromCallableObj(value));
        +                            pythonClass.setAttribute(key, PFactory.createStaticmethodFromCallableObj(language, value));
                                 } else {
                                     pythonClass.setAttribute(key, value);
                                 }
        @@ -2445,7 +2452,7 @@ private static void copyDictSlots(VirtualFrame frame, Node inliningTarget, TypeN
                                 // __class_getitem__: if they are plain functions, make them
                                 // classmethods
                                 if (value instanceof PFunction) {
        -                            pythonClass.setAttribute(key, factory.createClassmethodFromCallableObj(value));
        +                            pythonClass.setAttribute(key, PFactory.createClassmethodFromCallableObj(language, value));
                                 } else {
                                     pythonClass.setAttribute(key, value);
                                 }
        @@ -2472,7 +2479,7 @@ private static void copyDictSlots(VirtualFrame frame, Node inliningTarget, TypeN
                                     pythonClass.setQualName(castToStringNode.execute(inliningTarget, value));
                                     ctx.qualnameSet = true;
                                 } catch (CannotCastException e) {
        -                            throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.MUST_BE_S_NOT_P, "type __qualname__", "str", value);
        +                            throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.MUST_BE_S_NOT_P, "type __qualname__", "str", value);
                                 }
                                 continue;
                             }
        @@ -2488,7 +2495,7 @@ private static void copyDictSlots(VirtualFrame frame, Node inliningTarget, TypeN
                         // Creates DynamicObjectStorage which ignores non-string keys
                         typeDict = getOrCreateDictNode.execute(inliningTarget, pythonClass);
                         // Writing a non string key converts DynamicObjectStorage to EconomicMapStorage
        -                long keyHash = hashingStorageItKeyHash.execute(inliningTarget, namespaceStorage, it);
        +                long keyHash = hashingStorageItKeyHash.execute(frame, inliningTarget, namespaceStorage, it);
                         HashingStorage updatedStore = setHashingStorageItem.execute(frame, inliningTarget, typeDict.getDictStorage(), keyObj, keyHash, value);
                         typeDict.setDictStorage(updatedStore);
                     }
        @@ -2511,7 +2518,7 @@ private static TruffleString[] copySlots(Node inliningTarget, TypeNewContext ctx
                         try {
                             slotName = PythonUtils.mangleName(className, slotName);
                         } catch (OutOfMemoryError e) {
        -                    throw PRaiseNode.raiseUncached(inliningTarget, PythonBuiltinClassType.OverflowError, ErrorMessages.PRIVATE_IDENTIFIER_TOO_LARGE_TO_BE_MANGLED);
        +                    throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.OverflowError, ErrorMessages.PRIVATE_IDENTIFIER_TOO_LARGE_TO_BE_MANGLED);
                         }
                         if (slotName == null) {
                             return null;
        @@ -2523,7 +2530,7 @@ private static TruffleString[] copySlots(Node inliningTarget, TypeNewContext ctx
                         if (!T___CLASSCELL__.equalsUncached(slotName, TS_ENCODING) && !T___QUALNAME__.equalsUncached(slotName, TS_ENCODING) &&
                                         HashingStorageGetItem.hasKeyUncached(namespace.getDictStorage(), slotName)) {
                             // __qualname__ and __classcell__ will be deleted later
        -                    throw PRaiseNode.raiseUncached(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.S_S_CONFLICTS_WITH_CLASS_VARIABLE, slotName, "__slots__");
        +                    throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.S_S_CONFLICTS_WITH_CLASS_VARIABLE, slotName, "__slots__");
                         }
                         j++;
                     }
        @@ -2754,101 +2761,122 @@ static boolean doOther(@SuppressWarnings("unused") Object cls) {
             @GenerateUncached
             @GenerateInline
             @GenerateCached(false)
        -    @ImportStatic(SpecialMethodSlot.class)
             public abstract static class HasSameConstructorNode extends Node {
         
                 public abstract boolean execute(Node inliningTarget, Object leftClass, Object rightClass);
         
                 @Specialization
                 static boolean doGeneric(Node inliningTarget, Object left, Object right,
        -                        @Cached(parameters = "New", inline = false) LookupCallableSlotInMRONode lookupLeftNode,
        -                        @Cached(parameters = "New", inline = false) LookupCallableSlotInMRONode lookupRightNode,
        +                        @Cached(inline = false) LookupAttributeInMRONode.Dynamic lookupNew,
                                 @Cached InlinedExactClassProfile leftNewProfile,
                                 @Cached InlinedExactClassProfile rightNewProfile) {
                     assert IsTypeNode.executeUncached(left);
                     assert IsTypeNode.executeUncached(right);
         
        -            Object leftNew = leftNewProfile.profile(inliningTarget, lookupLeftNode.execute(left));
        -            Object rightNew = rightNewProfile.profile(inliningTarget, lookupRightNode.execute(right));
        -            return isSameFunction(leftNew, rightNew);
        -        }
        -
        -        static boolean isSameFunction(Object leftFunc, Object rightFunc) {
        -            Object leftResolved = leftFunc;
        -            if (leftFunc instanceof PBuiltinFunction builtinFunction) {
        -                Object typeDecorated = HPyObjectNewNode.getDecoratedSuperConstructor(builtinFunction);
        -                if (typeDecorated != null) {
        -                    leftResolved = typeDecorated;
        -                }
        -            }
        -            Object rightResolved = rightFunc;
        -            if (rightFunc instanceof PBuiltinFunction builtinFunction) {
        -                Object baseDecorated = HPyObjectNewNode.getDecoratedSuperConstructor(builtinFunction);
        -                if (baseDecorated != null) {
        -                    rightResolved = baseDecorated;
        -                }
        -            }
        -            return leftResolved == rightResolved;
        +            Object leftNew = leftNewProfile.profile(inliningTarget, lookupNew.execute(left, T___NEW__));
        +            Object rightNew = rightNewProfile.profile(inliningTarget, lookupNew.execute(right, T___NEW__));
        +            return leftNew == rightNew;
                 }
             }
         
             /**
        -     * Check whether a given function, method or slot descriptor is a specific builtin function.
        -     * Used in cases where CPython compares slot for referential equality with a C function to check
        -     * for overriding, for example {@code type->tp_init == object_init}. For object {@code __init__}
        -     * in particular, there is a shortcut node {@link HasObjectInitNode}.
        +     * Check whether given type didn't override default object {@code __init__}. Equivalent of
        +     * CPython's {@code type->tp_init == object_init} check.
              */
        -    @GenerateInline
        -    @GenerateCached(false)
        -    @GenerateUncached
        -    public abstract static class CheckCallableIsSpecificBuiltinNode extends Node {
        -        public abstract boolean execute(Node inliningTarget, Object methodOrDescriptor, NodeFactory nodeFactory);
        +    @GenerateInline(inlineByDefault = true)
        +    public abstract static class HasObjectInitNode extends Node {
        +        public abstract boolean execute(Node inliningTarget, Object type);
         
        -        public static boolean executeUncached(Object methodOrDescriptor, NodeFactory nodeFactory) {
        -            return TypeNodesFactory.CheckCallableIsSpecificBuiltinNodeGen.getUncached().execute(null, methodOrDescriptor, nodeFactory);
        +        public final boolean executeCached(Object type) {
        +            return execute(this, type);
                 }
         
                 @Specialization
        -        static boolean check(PBuiltinFunction function, NodeFactory nodeFactory) {
        -            return function.getBuiltinNodeFactory() == nodeFactory;
        +        static boolean check(Node inliningTarget, Object type,
        +                        @Cached GetCachedTpSlotsNode getSlots) {
        +            TpSlots slots = getSlots.execute(inliningTarget, type);
        +            return slots.tp_init() == ObjectBuiltins.SLOTS.tp_init();
                 }
        +    }
         
        -        @Specialization
        -        static boolean check(PBuiltinMethod method, NodeFactory nodeFactory) {
        -            return method.getBuiltinFunction().getBuiltinNodeFactory() == nodeFactory;
        -        }
        +    /** Equivalent of CPython's {@code recursive_isinstance} */
        +    @GenerateInline
        +    @GenerateCached(false)
        +    public abstract static class GenericInstanceCheckNode extends Node {
        +
        +        public abstract boolean execute(VirtualFrame frame, Node inliningTarget, Object instance, Object cls);
        +
        +        @Specialization(guards = "isTypeNode.execute(inliningTarget, cls)", limit = "1")
        +        static boolean isInstance(VirtualFrame frame, Node inliningTarget, Object instance, Object cls,
        +                        @Cached PyObjectLookupAttr lookupAttr,
        +                        @Cached IsTypeNode isTypeNode,
        +                        @Cached InlinedConditionProfile classSameResult,
        +                        @Cached GetClassNode getClassNode,
        +                        @Cached IsSubtypeNode isSubtypeNode) {
        +            Object type = getClassNode.execute(inliningTarget, instance);
        +            if (isSubtypeNode.execute(type, cls)) {
        +                return true;
        +            }
         
        -        @Specialization
        -        static boolean check(BuiltinMethodDescriptor descriptor, NodeFactory nodeFactory) {
        -            return descriptor.getFactory() == nodeFactory;
        +            Object instanceClass = lookupAttr.execute(frame, inliningTarget, instance, T___CLASS__);
        +            if (classSameResult.profile(inliningTarget, instanceClass == type)) {
        +                // We already did a check on this type
        +                return false;
        +            } else if (isTypeNode.execute(inliningTarget, instanceClass)) {
        +                return isSubtypeNode.execute(instanceClass, cls);
        +            } else {
        +                return false;
        +            }
                 }
         
                 @Fallback
        -        @SuppressWarnings("unused")
        -        static boolean check(Object descriptor, NodeFactory nodeFactory) {
        -            return false;
        +        static boolean isInstance(VirtualFrame frame, Node inliningTarget, Object instance, Object cls,
        +                        @Cached PyObjectLookupAttr lookupAttr,
        +                        @Cached AbstractObjectIsSubclassNode abstractIsSubclassNode,
        +                        @Cached AbstractObjectGetBasesNode getBasesNode,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (getBasesNode.execute(frame, inliningTarget, cls) == null) {
        +                throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.ISINSTANCE_ARG_2_MUST_BE_TYPE_OR_TUPLE_OF_TYPE, instance);
        +            }
        +
        +            Object instanceClass = lookupAttr.execute(frame, inliningTarget, instance, T___CLASS__);
        +            if (instanceClass != NO_VALUE) {
        +                return abstractIsSubclassNode.execute(frame, instanceClass, cls);
        +            } else {
        +                return false;
        +            }
                 }
             }
         
        -    /**
        -     * Check whether given type didn't override default object {@code __init__}. Equivalent of
        -     * CPython's {@code type->tp_init == object_init} check.
        -     */
        -    @GenerateInline(inlineByDefault = true)
        -    @ImportStatic(SpecialMethodSlot.class)
        -    public abstract static class HasObjectInitNode extends Node {
        -        public abstract boolean execute(Node inliningTarget, Object type);
        +    /** Equivalent of CPython's {@code recursive_issubclass} */
        +    @GenerateInline
        +    @GenerateCached(false)
        +    public abstract static class GenericSubclassCheckNode extends Node {
         
        -        public final boolean executeCached(Object type) {
        -            return execute(this, type);
        +        public abstract boolean execute(VirtualFrame frame, Node inliningTarget, Object derived, Object cls);
        +
        +        @Specialization(guards = {"isTypeNode.execute(inliningTarget, cls)", "isTypeNode.execute(inliningTarget, derived)"}, limit = "1")
        +        static boolean doTypes(Node inliningTarget, Object derived, Object cls,
        +                        @SuppressWarnings("unused") @Cached IsTypeNode isTypeNode,
        +                        @Cached IsSameTypeNode isSameTypeNode,
        +                        @Cached IsSubtypeNode isSubtypeNode) {
        +            return isSameTypeNode.execute(inliningTarget, cls, derived) || isSubtypeNode.execute(derived, cls);
                 }
         
        -        @Specialization
        -        static boolean check(Node inliningTarget, Object type,
        -                        @Cached(parameters = "Init", inline = false) LookupCallableSlotInMRONode lookup,
        -                        @Cached CheckCallableIsSpecificBuiltinNode check) {
        -            Object slot = lookup.execute(type);
        -            return check.execute(inliningTarget, slot, ObjectBuiltinsFactory.InitNodeFactory.getInstance());
        +        @Fallback
        +        @InliningCutoff
        +        static boolean doObjects(VirtualFrame frame, Node inliningTarget, Object derived, Object cls,
        +                        @Cached AbstractObjectGetBasesNode getBasesNode,
        +                        @Cached AbstractObjectIsSubclassNode abstractIsSubclassNode,
        +                        @Cached PRaiseNode raiseDerived,
        +                        @Cached PRaiseNode raiseCls) {
        +            if (getBasesNode.execute(frame, inliningTarget, derived) == null) {
        +                throw raiseDerived.raise(inliningTarget, TypeError, ErrorMessages.ARG_D_MUST_BE_S, "issubclass()", 1, "class");
        +            }
        +            if (getBasesNode.execute(frame, inliningTarget, cls) == null) {
        +                throw raiseCls.raise(inliningTarget, TypeError, ErrorMessages.ISSUBCLASS_MUST_BE_CLASS_OR_TUPLE);
        +            }
        +            return abstractIsSubclassNode.execute(frame, derived, cls);
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/BuiltinDispatchers.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/BuiltinDispatchers.java
        deleted file mode 100644
        index 8a5079c5e0..0000000000
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/BuiltinDispatchers.java
        +++ /dev/null
        @@ -1,77 +0,0 @@
        -/*
        - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
        - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        - *
        - * The Universal Permissive License (UPL), Version 1.0
        - *
        - * Subject to the condition set forth below, permission is hereby granted to any
        - * person obtaining a copy of this software, associated documentation and/or
        - * data (collectively the "Software"), free of charge and under any and all
        - * copyright rights in the Software, and any and all patent rights owned or
        - * freely licensable by each licensor hereunder covering either (i) the
        - * unmodified Software as contributed to or provided by such licensor, or (ii)
        - * the Larger Works (as defined below), to deal in both
        - *
        - * (a) the Software, and
        - *
        - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
        - * one is included with the Software each a "Larger Work" to which the Software
        - * is contributed by such licensors),
        - *
        - * without restriction, including without limitation the rights to copy, create
        - * derivative works of, display, perform, and distribute the Software and make,
        - * use, sell, offer for sale, import, export, have made, and have sold the
        - * Software and the Larger Work(s), and to sublicense the foregoing rights on
        - * either these or other terms.
        - *
        - * This license is subject to the following condition:
        - *
        - * The above copyright notice and either this complete permission notice or at a
        - * minimum a reference to the UPL must be included in all copies or substantial
        - * portions of the Software.
        - *
        - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        - * SOFTWARE.
        - */
        -package com.oracle.graal.python.builtins.objects.type.slots;
        -
        -import com.oracle.graal.python.PythonLanguage;
        -import com.oracle.graal.python.runtime.ExecutionContext.CallContext;
        -import com.oracle.graal.python.runtime.ExecutionContext.IndirectCalleeContext;
        -import com.oracle.graal.python.runtime.PythonContext;
        -import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
        -import com.oracle.truffle.api.CallTarget;
        -import com.oracle.truffle.api.frame.VirtualFrame;
        -import com.oracle.truffle.api.nodes.IndirectCallNode;
        -import com.oracle.truffle.api.nodes.Node;
        -import com.oracle.truffle.api.profiles.InlinedConditionProfile;
        -
        -public class BuiltinDispatchers {
        -    static Object callGenericBuiltin(VirtualFrame frame, Node inliningTarget, int callTargetIndex, Object[] arguments,
        -                    CallContext callContext, InlinedConditionProfile isNullFrameProfile, IndirectCallNode indirectCallNode) {
        -        PythonLanguage language = PythonLanguage.get(inliningTarget);
        -        CallTarget callTarget = language.getBuiltinSlotCallTarget(callTargetIndex);
        -        if (isNullFrameProfile.profile(inliningTarget, frame != null)) {
        -            callContext.prepareIndirectCall(frame, arguments, inliningTarget);
        -            return indirectCallNode.call(callTarget, arguments);
        -        } else {
        -            return callWithNullFrame(inliningTarget, indirectCallNode, language, arguments, callTarget);
        -        }
        -    }
        -
        -    private static Object callWithNullFrame(Node inliningTarget, IndirectCallNode indirectCallNode, PythonLanguage language, Object[] arguments, CallTarget callTarget) {
        -        PythonContext context = PythonContext.get(inliningTarget);
        -        PythonThreadState threadState = context.getThreadState(language);
        -        Object state = IndirectCalleeContext.enterIndirect(threadState, arguments);
        -        try {
        -            return indirectCallNode.call(callTarget, arguments);
        -        } finally {
        -            IndirectCalleeContext.exit(threadState, state);
        -        }
        -    }
        -}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/BuiltinSlotWrapperSignature.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/BuiltinSlotWrapperSignature.java
        index cafd60aae0..7821b0d686 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/BuiltinSlotWrapperSignature.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/BuiltinSlotWrapperSignature.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/HPyDispatchers.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/HPyDispatchers.java
        deleted file mode 100644
        index 96fe528b10..0000000000
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/HPyDispatchers.java
        +++ /dev/null
        @@ -1,90 +0,0 @@
        -/*
        - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
        - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        - *
        - * The Universal Permissive License (UPL), Version 1.0
        - *
        - * Subject to the condition set forth below, permission is hereby granted to any
        - * person obtaining a copy of this software, associated documentation and/or
        - * data (collectively the "Software"), free of charge and under any and all
        - * copyright rights in the Software, and any and all patent rights owned or
        - * freely licensable by each licensor hereunder covering either (i) the
        - * unmodified Software as contributed to or provided by such licensor, or (ii)
        - * the Larger Works (as defined below), to deal in both
        - *
        - * (a) the Software, and
        - *
        - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
        - * one is included with the Software each a "Larger Work" to which the Software
        - * is contributed by such licensors),
        - *
        - * without restriction, including without limitation the rights to copy, create
        - * derivative works of, display, perform, and distribute the Software and make,
        - * use, sell, offer for sale, import, export, have made, and have sold the
        - * Software and the Larger Work(s), and to sublicense the foregoing rights on
        - * either these or other terms.
        - *
        - * This license is subject to the following condition:
        - *
        - * The above copyright notice and either this complete permission notice or at a
        - * minimum a reference to the UPL must be included in all copies or substantial
        - * portions of the Software.
        - *
        - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        - * SOFTWARE.
        - */
        -package com.oracle.graal.python.builtins.objects.type.slots;
        -
        -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyAsHandleNode;
        -import com.oracle.graal.python.builtins.objects.function.PArguments;
        -import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext;
        -import com.oracle.graal.python.runtime.IndirectCallData;
        -import com.oracle.graal.python.runtime.PythonContext;
        -import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
        -import com.oracle.truffle.api.CompilerDirectives;
        -import com.oracle.truffle.api.dsl.Cached;
        -import com.oracle.truffle.api.dsl.GenerateCached;
        -import com.oracle.truffle.api.dsl.GenerateInline;
        -import com.oracle.truffle.api.dsl.GenerateUncached;
        -import com.oracle.truffle.api.dsl.Specialization;
        -import com.oracle.truffle.api.frame.VirtualFrame;
        -import com.oracle.truffle.api.interop.InteropException;
        -import com.oracle.truffle.api.interop.InteropLibrary;
        -import com.oracle.truffle.api.library.CachedLibrary;
        -import com.oracle.truffle.api.nodes.Node;
        -
        -class HPyDispatchers {
        -    private HPyDispatchers() {
        -    }
        -
        -    @GenerateInline
        -    @GenerateUncached
        -    @GenerateCached(false)
        -    public abstract static class UnaryHPySlotDispatcherNode extends Node {
        -        public abstract Object execute(VirtualFrame frame, Node inliningTarget, PythonContext ctx, PythonThreadState threadState, Object nativeSlotCallable, Object self);
        -
        -        @Specialization
        -        static Object doIt(VirtualFrame frame, PythonContext ctx, PythonThreadState threadState, Object nativeSlotCallable, Object self,
        -                        @Cached("createFor(this)") IndirectCallData callData,
        -                        @Cached(inline = false) HPyAsHandleNode toHandleNode,
        -                        @CachedLibrary(limit = "3") InteropLibrary lib) {
        -            Object hpyCtx = ctx.getHPyContext().getBackend();
        -            Object state = IndirectCallContext.enter(frame, threadState, callData);
        -            try {
        -                return lib.execute(nativeSlotCallable, hpyCtx, toHandleNode.execute(self));
        -            } catch (InteropException e) {
        -                throw CompilerDirectives.shouldNotReachHere(e);
        -            } finally {
        -                if (frame != null) {
        -                    PArguments.setException(frame, threadState.getCaughtException());
        -                }
        -                IndirectCallContext.exit(frame, threadState, state);
        -            }
        -        }
        -    }
        -}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/PythonDispatchers.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/PythonDispatchers.java
        index 0f9085ce7d..361747db39 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/PythonDispatchers.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/PythonDispatchers.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,15 +40,16 @@
          */
         package com.oracle.graal.python.builtins.objects.type.slots;
         
        +import com.oracle.graal.python.builtins.objects.PNotImplemented;
         import com.oracle.graal.python.builtins.objects.function.PArguments;
         import com.oracle.graal.python.builtins.objects.function.PFunction;
         import com.oracle.graal.python.builtins.objects.function.Signature;
        -import com.oracle.graal.python.nodes.PGuards;
         import com.oracle.graal.python.nodes.PNodeWithContext;
         import com.oracle.graal.python.nodes.call.BoundDescriptor;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
         import com.oracle.graal.python.nodes.call.CallNode;
        -import com.oracle.graal.python.nodes.call.FunctionInvokeNode;
         import com.oracle.graal.python.nodes.call.special.MaybeBindDescriptorNode;
        +import com.oracle.graal.python.runtime.exception.PException;
         import com.oracle.graal.python.util.PythonUtils;
         import com.oracle.truffle.api.CompilerAsserts;
         import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
        @@ -58,9 +59,9 @@
         import com.oracle.truffle.api.dsl.GenerateUncached;
         import com.oracle.truffle.api.dsl.Idempotent;
         import com.oracle.truffle.api.dsl.ImportStatic;
        -import com.oracle.truffle.api.dsl.NeverDefault;
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.nodes.DirectCallNode;
         import com.oracle.truffle.api.nodes.Node;
         import com.oracle.truffle.api.utilities.TruffleWeakReference;
         
        @@ -78,17 +79,12 @@ static boolean isSimpleSignature(PFunction callable, int positionArgsCount) {
                     CompilerAsserts.partialEvaluationConstant(result); // should hold in single context
                     return result;
                 }
        -
        -        @NeverDefault
        -        static FunctionInvokeNode createInvokeNode(PFunction callee) {
        -            return FunctionInvokeNode.create(callee);
        -        }
             }
         
             @GenerateUncached
             @GenerateInline
             @GenerateCached(false)
        -    @ImportStatic(PGuards.class)
        +    @ImportStatic(CallDispatchers.class)
             abstract static class UnaryPythonSlotDispatcherNode extends PythonSlotDispatcherNodeBase {
                 final Object execute(VirtualFrame frame, Node inliningTarget, Object callable, Object type, Object self) {
                     assert !(callable instanceof TruffleWeakReference);
        @@ -100,12 +96,13 @@ final Object execute(VirtualFrame frame, Node inliningTarget, Object callable, O
         
                 @Specialization(guards = {"isSingleContext()", "callee == cachedCallee", "isSimpleSignature(cachedCallee, 1)"}, //
                                 limit = "getCallSiteInlineCacheMaxDepth()", assumptions = "cachedCallee.getCodeStableAssumption()")
        -        protected static Object doCachedPFunction(VirtualFrame frame, @SuppressWarnings("unused") PFunction callee, @SuppressWarnings("unused") Object type, Object self,
        +        protected static Object doCachedPFunction(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") PFunction callee, @SuppressWarnings("unused") Object type, Object self,
                                 @SuppressWarnings("unused") @Cached("callee") PFunction cachedCallee,
        -                        @Cached("createInvokeNode(cachedCallee)") FunctionInvokeNode invoke) {
        +                        @Cached("createDirectCallNodeFor(callee)") DirectCallNode callNode,
        +                        @Cached CallDispatchers.FunctionDirectInvokeNode invoke) {
                     Object[] arguments = PArguments.create(1);
                     PArguments.setArgument(arguments, 0, self);
        -            return invoke.execute(frame, arguments);
        +            return invoke.execute(frame, inliningTarget, callNode, cachedCallee, arguments);
                 }
         
                 @Specialization(replaces = "doCachedPFunction")
        @@ -130,32 +127,51 @@ static Object doGeneric(VirtualFrame frame, Node inliningTarget, Object callable
             @GenerateUncached
             @GenerateInline
             @GenerateCached(false)
        +    @ImportStatic(CallDispatchers.class)
             abstract static class BinaryPythonSlotDispatcherNode extends PythonSlotDispatcherNodeBase {
                 final Object execute(VirtualFrame frame, Node inliningTarget, Object callable, Object type, Object self, Object arg1) {
                     assert !(callable instanceof TruffleWeakReference);
                     assert !(type instanceof TruffleWeakReference);
        -            return executeImpl(frame, inliningTarget, callable, type, self, arg1);
        +            return executeImpl(frame, inliningTarget, callable, type, self, arg1, false);
        +        }
        +
        +        final Object executeIgnoreDescriptorBindErrors(VirtualFrame frame, Node inliningTarget, Object callable, Object type, Object self, Object arg1) {
        +            assert !(callable instanceof TruffleWeakReference);
        +            assert !(type instanceof TruffleWeakReference);
        +            return executeImpl(frame, inliningTarget, callable, type, self, arg1, true);
                 }
         
        -        abstract Object executeImpl(VirtualFrame frame, Node inliningTarget, Object callable, Object type, Object self, Object arg1);
        +        abstract Object executeImpl(VirtualFrame frame, Node inliningTarget, Object callable, Object type, Object self, Object arg1, boolean ignoreDescBindErrors);
         
                 @Specialization(guards = {"isSingleContext()", "callee == cachedCallee", "isSimpleSignature(cachedCallee, 2)"}, //
                                 limit = "getCallSiteInlineCacheMaxDepth()", assumptions = "cachedCallee.getCodeStableAssumption()")
        -        protected static Object doCachedPFunction(VirtualFrame frame, @SuppressWarnings("unused") PFunction callee, @SuppressWarnings("unused") Object type, Object self, Object arg1,
        +        protected static Object doCachedPFunction(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") PFunction callee, @SuppressWarnings("unused") Object type, Object self,
        +                        Object arg1,
        +                        boolean ignoreDescBindErrors,
                                 @SuppressWarnings("unused") @Cached("callee") PFunction cachedCallee,
        -                        @Cached("createInvokeNode(cachedCallee)") FunctionInvokeNode invoke) {
        +                        @Cached("createDirectCallNodeFor(callee)") DirectCallNode callNode,
        +                        @Cached CallDispatchers.FunctionDirectInvokeNode invoke) {
                     Object[] arguments = PArguments.create(2);
                     PArguments.setArgument(arguments, 0, self);
                     PArguments.setArgument(arguments, 1, arg1);
        -            return invoke.execute(frame, arguments);
        +            return invoke.execute(frame, inliningTarget, callNode, cachedCallee, arguments);
                 }
         
                 @Specialization(replaces = "doCachedPFunction")
                 @InliningCutoff
        -        static Object doGeneric(VirtualFrame frame, Node inliningTarget, Object callableObj, Object type, Object self, Object arg1,
        +        static Object doGeneric(VirtualFrame frame, Node inliningTarget, Object callableObj, Object type, Object self, Object arg1, boolean ignoreDescBindErrors,
                                 @Cached MaybeBindDescriptorNode bindDescriptorNode,
                                 @Cached(inline = false) CallNode callNode) {
        -            Object bound = bindDescriptorNode.execute(frame, inliningTarget, callableObj, self, type);
        +            Object bound;
        +            try {
        +                bound = bindDescriptorNode.execute(frame, inliningTarget, callableObj, self, type);
        +            } catch (PException ex) {
        +                if (ignoreDescBindErrors) {
        +                    return PNotImplemented.NOT_IMPLEMENTED;
        +                } else {
        +                    throw ex;
        +                }
        +            }
                     Object[] arguments;
                     Object callable;
                     if (bound instanceof BoundDescriptor boundDescr) {
        @@ -172,6 +188,7 @@ static Object doGeneric(VirtualFrame frame, Node inliningTarget, Object callable
             @GenerateUncached
             @GenerateInline
             @GenerateCached(false)
        +    @ImportStatic(CallDispatchers.class)
             abstract static class TernaryPythonSlotDispatcherNode extends PythonSlotDispatcherNodeBase {
                 final Object execute(VirtualFrame frame, Node inliningTarget, Object callable, Object type, Object self, Object arg1, Object arg2) {
                     assert !(callable instanceof TruffleWeakReference);
        @@ -183,15 +200,16 @@ final Object execute(VirtualFrame frame, Node inliningTarget, Object callable, O
         
                 @Specialization(guards = {"isSingleContext()", "callee == cachedCallee", "isSimpleSignature(cachedCallee, 3)"}, //
                                 limit = "getCallSiteInlineCacheMaxDepth()", assumptions = "cachedCallee.getCodeStableAssumption()")
        -        protected static Object doCachedPFunction(VirtualFrame frame, @SuppressWarnings("unused") PFunction callee, @SuppressWarnings("unused") Object type, Object self,
        +        protected static Object doCachedPFunction(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") PFunction callee, @SuppressWarnings("unused") Object type, Object self,
                                 Object arg1, Object arg2,
                                 @SuppressWarnings("unused") @Cached("callee") PFunction cachedCallee,
        -                        @Cached("createInvokeNode(cachedCallee)") FunctionInvokeNode invoke) {
        +                        @Cached("createDirectCallNodeFor(callee)") DirectCallNode callNode,
        +                        @Cached CallDispatchers.FunctionDirectInvokeNode invoke) {
                     Object[] arguments = PArguments.create(3);
                     PArguments.setArgument(arguments, 0, self);
                     PArguments.setArgument(arguments, 1, arg1);
                     PArguments.setArgument(arguments, 2, arg2);
        -            return invoke.execute(frame, arguments);
        +            return invoke.execute(frame, inliningTarget, callNode, cachedCallee, arguments);
                 }
         
                 @Specialization(replaces = "doCachedPFunction")
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/Slot2Builtin.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/Slot2Builtin.java
        index a866813b67..4acd65aa27 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/Slot2Builtin.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/Slot2Builtin.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -44,8 +44,8 @@
         
         import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
        -import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonOS;
        +import com.oracle.graal.python.util.PythonUtils;
         
         /**
          * Adopts the {@link SlotSignature} annotation to {@link Builtin} annotation, so that the builtin
        @@ -82,16 +82,6 @@ public PythonOS os() {
                 return PythonOS.PLATFORM_ANY;
             }
         
        -    @Override
        -    public PythonBuiltinClassType constructsClass() {
        -        return PythonBuiltinClassType.nil;
        -    }
        -
        -    @Override
        -    public PythonBuiltinClassType[] base() {
        -        return new PythonBuiltinClassType[0];
        -    }
        -
             @Override
             public int minNumOfPositionalArgs() {
                 return signature != null ? signature.minNumOfPositionalArgs() : annotation.minNumOfPositionalArgs();
        @@ -99,12 +89,12 @@ public int minNumOfPositionalArgs() {
         
             @Override
             public int maxNumOfPositionalArgs() {
        -        return -1;
        +        return annotation != null ? annotation.maxNumOfPositionalArgs() : -1;
             }
         
             @Override
             public int numOfPositionalOnlyArgs() {
        -        return -1;
        +        return annotation != null ? annotation.numOfPositionalOnlyArgs() : -1;
             }
         
             @Override
        @@ -127,14 +117,9 @@ public boolean takesVarArgs() {
                 return annotation != null && annotation.takesVarArgs();
             }
         
        -    @Override
        -    public boolean varArgsMarker() {
        -        return false;
        -    }
        -
             @Override
             public boolean takesVarKeywordArgs() {
        -        return false;
        +        return annotation != null && annotation.takesVarKeywordArgs();
             }
         
             @Override
        @@ -144,12 +129,7 @@ public String[] parameterNames() {
         
             @Override
             public String[] keywordOnlyNames() {
        -        return new String[0];
        -    }
        -
        -    @Override
        -    public boolean isPublic() {
        -        return true;
        +        return annotation != null ? annotation.keywordOnlyNames() : PythonUtils.EMPTY_STRING_ARRAY;
             }
         
             @Override
        @@ -177,14 +157,9 @@ public boolean declaresExplicitSelf() {
                 return false;
             }
         
        -    @Override
        -    public boolean reverseOperation() {
        -        return false;
        -    }
        -
             @Override
             public String raiseErrorName() {
        -        return annotation != null ? annotation.raiseErrorName() : "";
        +        return annotation != null ? annotation.name() : "";
             }
         
             @Override
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/SlotWrapperDocstrings.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/SlotWrapperDocstrings.java
        new file mode 100644
        index 0000000000..032f1dc8c4
        --- /dev/null
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/SlotWrapperDocstrings.java
        @@ -0,0 +1,135 @@
        +/*
        + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
        + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        + *
        + * The Universal Permissive License (UPL), Version 1.0
        + *
        + * Subject to the condition set forth below, permission is hereby granted to any
        + * person obtaining a copy of this software, associated documentation and/or
        + * data (collectively the "Software"), free of charge and under any and all
        + * copyright rights in the Software, and any and all patent rights owned or
        + * freely licensable by each licensor hereunder covering either (i) the
        + * unmodified Software as contributed to or provided by such licensor, or (ii)
        + * the Larger Works (as defined below), to deal in both
        + *
        + * (a) the Software, and
        + *
        + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
        + * one is included with the Software each a "Larger Work" to which the Software
        + * is contributed by such licensors),
        + *
        + * without restriction, including without limitation the rights to copy, create
        + * derivative works of, display, perform, and distribute the Software and make,
        + * use, sell, offer for sale, import, export, have made, and have sold the
        + * Software and the Larger Work(s), and to sublicense the foregoing rights on
        + * either these or other terms.
        + *
        + * This license is subject to the following condition:
        + *
        + * The above copyright notice and either this complete permission notice or at a
        + * minimum a reference to the UPL must be included in all copies or substantial
        + * portions of the Software.
        + *
        + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        + * SOFTWARE.
        + */
        +package com.oracle.graal.python.builtins.objects.type.slots;
        +
        +import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
        +
        +import com.oracle.truffle.api.strings.TruffleString;
        +
        +public enum SlotWrapperDocstrings {
        +    __repr__("Return repr(self)."),
        +    __hash__("Return hash(self)."),
        +    __call__("Call self as a function."),
        +    __str__("Return str(self)."),
        +    __getattribute__("Return getattr(self, name)."),
        +    __setattr__("Implement setattr(self, name, value)."),
        +    __delattr__("Implement delattr(self, name)."),
        +    __lt__("Return selfvalue."),
        +    __ge__("Return self>=value."),
        +    __iter__("Implement iter(self)."),
        +    __next__("Implement next(self)."),
        +    __get__("Return an attribute of instance, which is of type owner."),
        +    __set__("Set an attribute of instance to value."),
        +    __delete__("Delete an attribute of instance."),
        +    __init__("Initialize self.  See help(type(self)) for accurate signature."),
        +    __new__("Create and return new object.  See help(type) for accurate signature."),
        +    __await__("Return an iterator to be used in await expression."),
        +    __aiter__("Return an awaitable, that resolves in asynchronous iterator."),
        +    __anext__("Return a value or raise StopAsyncIteration."),
        +    __add__("Return self+value."),
        +    __radd__("Return value+self."),
        +    __sub__("Return self-value."),
        +    __rsub__("Return value-self."),
        +    __mul__("Return self*value."),
        +    __rmul__("Return value*self."),
        +    __mod__("Return self%value."),
        +    __rmod__("Return value%self."),
        +    __divmod__("Return divmod(self, value)."),
        +    __rdivmod__("Return divmod(value, self)."),
        +    __pow__("Return pow(self, value, mod)."),
        +    __rpow__("Return pow(value, self, mod)."),
        +    __neg__("-self"),
        +    __pos__("+self"),
        +    __abs__("abs(self)"),
        +    __bool__("True if self else False"),
        +    __invert__("~self"),
        +    __lshift__("Return self<>value."),
        +    __rrshift__("Return value>>self."),
        +    __and__("Return self&value."),
        +    __rand__("Return value&self."),
        +    __xor__("Return self^value."),
        +    __rxor__("Return value^self."),
        +    __or__("Return self|value."),
        +    __ror__("Return value|self."),
        +    __int__("int(self)"),
        +    __float__("float(self)"),
        +    __iadd__("Return self+=value."),
        +    __isub__("Return self-=value."),
        +    __imul__("Return self*=value."),
        +    __imod__("Return self%=value."),
        +    __ipow__("Return self**=value."),
        +    __ilshift__("Return self<<=value."),
        +    __irshift__("Return self>>=value."),
        +    __iand__("Return self&=value."),
        +    __ixor__("Return self^=value."),
        +    __ior__("Return self|=value."),
        +    __floordiv__("Return self//value."),
        +    __rfloordiv__("Return value//self."),
        +    __truediv__("Return self/value."),
        +    __rtruediv__("Return value/self."),
        +    __ifloordiv__("Return self//=value."),
        +    __itruediv__("Return self/=value."),
        +    __index__("Return self converted to an integer, if self is suitable for use as an index into a list."),
        +    __matmul__("Return self@value."),
        +    __rmatmul__("Return value@self."),
        +    __imatmul__("Return self@=value."),
        +    __len__("Return len(self)."),
        +    __getitem__("Return self[key]."),
        +    __setitem__("Set self[key] to value."),
        +    __delitem__("Delete self[key]."),
        +    __contains__("Return key in self.");
        +
        +    public final TruffleString docstring;
        +
        +    SlotWrapperDocstrings(String docstring) {
        +        this.docstring = tsLiteral(docstring);
        +    }
        +
        +    public static TruffleString getDocstring(String name) {
        +        return valueOf(name).docstring;
        +    }
        +}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlot.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlot.java
        index d74d2513c6..69d19626d8 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlot.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlot.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -41,6 +41,7 @@
         package com.oracle.graal.python.builtins.objects.type.slots;
         
         import static com.oracle.graal.python.builtins.PythonBuiltins.numDefaults;
        +import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PYOBJECT_HASH_NOT_IMPLEMENTED;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DOC__;
         
         import java.util.concurrent.atomic.AtomicInteger;
        @@ -50,19 +51,23 @@
         import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.Python3Core;
        +import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext;
         import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper;
        +import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol;
         import com.oracle.graal.python.builtins.objects.cext.capi.PyProcsWrapper.TpSlotWrapper;
         import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
        +import com.oracle.graal.python.builtins.objects.object.PythonObject;
         import com.oracle.graal.python.builtins.objects.type.TpSlots.TpSlotMeta;
         import com.oracle.graal.python.builtins.objects.type.slots.NodeFactoryUtils.NodeFactoryBase;
         import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode.Dynamic;
         import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.runtime.PythonContext;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.CompilerDirectives;
         import com.oracle.truffle.api.RootCallTarget;
        -import com.oracle.truffle.api.TruffleLogger;
         import com.oracle.truffle.api.dsl.Fallback;
         import com.oracle.truffle.api.dsl.GenerateCached;
         import com.oracle.truffle.api.dsl.GenerateInline;
        @@ -81,7 +86,6 @@
          * {@link com.oracle.graal.python.builtins.objects.type.TpSlots} object.
          */
         public abstract class TpSlot {
        -    private static final TruffleLogger LOGGER = PythonLanguage.getLogger(TpSlot.class);
         
             /**
              * Transforms the slot object to an interop object that can be sent to native.
        @@ -95,37 +99,27 @@ public static Object toNative(TpSlotMeta slotMeta, TpSlot slot, Object defaultVa
                     // This returns PyProcsWrapper, which will, in its toNative message, register the
                     // pointer in C API context, such that we can map back from a pointer that we get from C
                     // to the PyProcsWrapper and from that to the slot instance again in TpSlots#fromNative
        -            assert PythonContext.get(null).ownsGil(); // without GIL: use AtomicReference & CAS
        -            if (managedSlot.slotWrapper == null) {
        -                managedSlot.slotWrapper = slotMeta.createNativeWrapper(managedSlot);
        -            }
        -            return managedSlot.slotWrapper;
        +            return getNativeWrapper(slotMeta, managedSlot);
                 } else {
                     throw CompilerDirectives.shouldNotReachHere("TpSlotWrapper should wrap only managed slots. Native slots should go directly to native unwrapped.");
                 }
             }
         
        -    /**
        -     * If the interop object represents a pointer to existing {@link TpSlot}, then returns that
        -     * slot, otherwise {@code null}.
        -     */
        -    public static TpSlot fromNative(PythonContext ctx, Object ptr, InteropLibrary interop) {
        -        if (interop.isPointer(ptr)) {
        -            try {
        -                Object delegate = ctx.getCApiContext().getClosureDelegate(interop.asPointer(ptr));
        -                if (delegate instanceof TpSlot s) {
        -                    return s;
        -                } else if (delegate != null) {
        -                    // This can happen for legacy slots where the delegate would be a PFunction
        -                    LOGGER.warning(() -> String.format("Unexpected delegate for slot pointer: %s", delegate));
        -                }
        -            } catch (UnsupportedMessageException e) {
        -                throw new IllegalStateException(e);
        -            }
        -        } else if (ptr instanceof TpSlotWrapper slotWrapper) {
        -            return slotWrapper.getSlot();
        -        }
        -        return null;
        +    private static Object getNativeWrapper(TpSlotMeta slotMeta, TpSlotManaged slot) {
        +        if (slot == TpSlotHashFun.HASH_NOT_IMPLEMENTED) {
        +            // If there are more such cases, we should add generic mapping mechanism
        +            // This translation other way around is also done in TpSlots.fromNative
        +            // We must not cache this in the singleton slot object, it would hold onto and leak
        +            // Python objects
        +            return CApiContext.getNativeSymbol(null, FUN_PYOBJECT_HASH_NOT_IMPLEMENTED);
        +        } else if (slot == TpSlotIterNext.NEXT_NOT_IMPLEMENTED) {
        +            return CApiContext.getNativeSymbol(null, NativeCAPISymbol.FUN_PY_OBJECT_NEXT_NOT_IMPLEMENTED);
        +        }
        +        assert PythonContext.get(null).ownsGil(); // without GIL: use AtomicReference & CAS
        +        if (slot.slotWrapper == null) {
        +            slot.slotWrapper = slotMeta.createNativeWrapper(slot);
        +        }
        +        return slot.slotWrapper;
             }
         
             /**
        @@ -166,7 +160,11 @@ private static boolean hasExpectedType(TpSlot x) {
              * Marker base class for managed slots: either builtin slots or user defined Python slots.
              */
             public abstract static sealed class TpSlotManaged extends TpSlot permits TpSlotBuiltin, TpSlotPython {
        -        private TpSlotWrapper slotWrapper;
        +        /**
        +         * Represents native callable that delegates to this slot. Should be {@link TpSlotWrapper}
        +         * most of the time, but we allow overriding those wrappers with native implementation.
        +         */
        +        private Object slotWrapper;
             }
         
             /**
        @@ -207,7 +205,7 @@ static TruffleWeakReference asWeakRef(Object value) {
              * stored determines the signature. On Java level we have to do a call with boxed arguments
              * array and cannot optimize for specific signature.
              */
        -    public abstract static sealed class TpSlotNative extends TpSlot permits TpSlotCExtNative, TpSlotHPyNative {
        +    public abstract static sealed class TpSlotNative extends TpSlot permits TpSlotCExtNative {
                 final Object callable;
         
                 public TpSlotNative(Object callable) {
        @@ -218,10 +216,6 @@ public static TpSlotNative createCExtSlot(Object callable) {
                     return new TpSlotCExtNative(callable);
                 }
         
        -        public static TpSlotNative createHPySlot(Object callable) {
        -            return new TpSlotHPyNative(callable);
        -        }
        -
                 public final boolean isSameCallable(TpSlotNative other, InteropLibrary interop) {
                     if (this == other || this.callable == other.callable) {
                         return true;
        @@ -255,19 +249,6 @@ public TpSlotCExtNative(Object callable) {
                 }
             }
         
        -    /**
        -     * HPy slots currently "pretend" to be Python magic methods. They are added to a newly
        -     * constructed type in HPyCreateTypeFromSpecNode, which triggers {@code TpSlots#updateSlot} for
        -     * every added slot. In the future HPy slots should be treated like native slots, except that
        -     * they will have another dispatch method in CallXYZSlot nodes, see {@link TpSlotLen} for an
        -     * example.
        -     */
        -    public static final class TpSlotHPyNative extends TpSlotNative {
        -        public TpSlotHPyNative(Object callable) {
        -            super(callable);
        -        }
        -    }
        -
             /**
              * Represents a slot that should delegate to a builtin node. Outside of this package, builtin
              * slots are opaque. The leaf subclasses of this class are specific to concrete signature of
        @@ -327,31 +308,46 @@ final SlotSignature getSlotSignatureAnnotation() {
                  * return {@code null}. This can happen if user puts incompatible builtin slot value into a
                  * slot, e.g., puts {@code descrsetfunc} builtin into {@code tp_getattro} slot.
                  */
        -        public abstract PBuiltinFunction createBuiltin(Python3Core core, Object type, TruffleString tsName, PExternalFunctionWrapper wrapper);
        +        public abstract PythonObject createBuiltin(Python3Core core, Object type, TruffleString tsName, PExternalFunctionWrapper wrapper);
         
        -        // helper method
        +        /**
        +         * Helper method for creating a {@link PBuiltinFunction} as a wrapper for slots. Intended to
        +         * be used from implementation of
        +         * {@link #createBuiltin(Python3Core, Object, TruffleString, PExternalFunctionWrapper)}.
        +         */
                 final PBuiltinFunction createBuiltin(Python3Core core, Object type, TruffleString tsName, BuiltinSlotWrapperSignature signature, PExternalFunctionWrapper wrapper,
                                 NodeFactory factory) {
                     String name = tsName.toJavaStringUncached();
        -            RootCallTarget callTarget = createBuiltinCallTarget(core.getLanguage(), signature, factory, name);
        -            Builtin builtin = ((BuiltinFunctionRootNode) callTarget.getRootNode()).getBuiltin();
        -            PBuiltinFunction function = core.factory().createWrapperDescriptor(tsName, type, numDefaults(builtin), 0, callTarget, this, wrapper);
        -            function.setAttribute(T___DOC__, PNone.NONE);
        +
        +            SlotSignature slotSignature = factory.getNodeClass().getAnnotation(SlotSignature.class);
        +            Builtin builtin = new Slot2Builtin(slotSignature, name, signature);
        +            Class nodeClass = NodeFactoryBase.getWrappedNodeClass(factory);
        +            validateSlotNode(factory, nodeClass, slotSignature);
        +            PythonBuiltinClassType builtinType = type instanceof PythonBuiltinClassType bt ? bt : null;
        +            RootCallTarget callTarget = core.getLanguage().createCachedCallTarget(l -> new BuiltinFunctionRootNode(l, builtin, factory, true, builtinType), factory.getNodeClass(), nodeClass,
        +                            builtinType, name);
        +
        +            PBuiltinFunction function = PFactory.createWrapperDescriptor(core.getLanguage(), tsName, type, numDefaults(builtin), 0, callTarget, this, wrapper);
        +            function.setAttribute(T___DOC__, SlotWrapperDocstrings.getDocstring(name));
                     return function;
                 }
         
                 /**
        -         * Helper method for creating a {@link RootCallTarget}, it may be used in
        +         * Helper method for creating a {@link RootCallTarget} for raw slots. Should be used in
                  * {@link #initialize(PythonLanguage)} to create the slot call target if the slot node can
                  * be wrapped by {@link BuiltinFunctionRootNode}.
                  */
        -        static RootCallTarget createBuiltinCallTarget(PythonLanguage language, BuiltinSlotWrapperSignature signature, NodeFactory factory, String name) {
        +        static RootCallTarget createSlotCallTarget(PythonLanguage language, BuiltinSlotWrapperSignature signature, NodeFactory factory, String name) {
                     SlotSignature slotSignature = factory.getNodeClass().getAnnotation(SlotSignature.class);
                     Builtin builtin = new Slot2Builtin(slotSignature, name, signature);
                     Class nodeClass = NodeFactoryBase.getWrappedNodeClass(factory);
        +            validateSlotNode(factory, nodeClass, slotSignature);
        +            return language.createCachedCallTarget(l -> new BuiltinFunctionRootNode(l, builtin, factory, true), factory.getNodeClass(), nodeClass, name);
        +        }
        +
        +        private static void validateSlotNode(NodeFactory factory, Class nodeClass, SlotSignature slotSignature) {
                     assert nodeClass == factory.getNodeClass() || slotSignature == null : //
                                     "@SlotSignature cannot be used for builtin slot nodes that are wrapped into multiple builtin magic methods";
        -            return language.createCachedCallTarget(l -> new BuiltinFunctionRootNode(l, builtin, factory, true), factory.getNodeClass(), nodeClass, name);
                 }
         
                 public static boolean isSlotFactory(NodeFactory factory) {
        @@ -359,7 +355,6 @@ public static boolean isSlotFactory(NodeFactory factory) {
                                     NodeFactoryUtils.NodeFactoryBase.class.isAssignableFrom(factory.getClass());
                 }
             }
        -
             // ------------------------------------------------------------------------
             // Convenience base classes for code sharing:
         
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotBinaryFunc.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotBinaryFunc.java
        index a748a0ab93..c6d9f28dc7 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotBinaryFunc.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotBinaryFunc.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,8 +40,9 @@
          */
         package com.oracle.graal.python.builtins.objects.type.slots;
         
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ADD__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GETITEM__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GETITEM__;
        +import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
         
         import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionInvokeNode;
        @@ -50,16 +51,13 @@
         import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming;
         import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.NativeToPythonTransferNode;
         import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode;
        -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyAsHandleNode;
        -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyAsPythonObjectNode;
         import com.oracle.graal.python.builtins.objects.function.PArguments;
         import com.oracle.graal.python.builtins.objects.type.slots.PythonDispatchers.BinaryPythonSlotDispatcherNode;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltinBase;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotCExtNative;
        -import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotHPyNative;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPythonSingle;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
        -import com.oracle.graal.python.runtime.ExecutionContext.CallContext;
         import com.oracle.graal.python.runtime.PythonContext;
         import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
         import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
        @@ -73,9 +71,7 @@
         import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
        -import com.oracle.truffle.api.nodes.IndirectCallNode;
         import com.oracle.truffle.api.nodes.Node;
        -import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         import com.oracle.truffle.api.strings.TruffleString;
         
         public class TpSlotBinaryFunc {
        @@ -97,7 +93,7 @@ final PythonBinaryBuiltinNode createSlotNode() {
         
                 @Override
                 public void initialize(PythonLanguage language) {
        -            RootCallTarget target = createBuiltinCallTarget(language, BuiltinSlotWrapperSignature.BINARY, getNodeFactory(), builtinName);
        +            RootCallTarget target = createSlotCallTarget(language, BuiltinSlotWrapperSignature.BINARY, getNodeFactory(), builtinName);
                     language.setBuiltinSlotCallTarget(callTargetIndex, target);
                 }
             }
        @@ -110,7 +106,7 @@ protected TpSlotMpSubscript(NodeFactory nodeFactory) {
         
             public abstract static class TpSlotSqConcat extends TpSlotBinaryFuncBuiltin {
                 protected TpSlotSqConcat(NodeFactory nodeFactory) {
        -            super(nodeFactory, PExternalFunctionWrapper.BINARYFUNC, J___GETITEM__);
        +            super(nodeFactory, PExternalFunctionWrapper.BINARYFUNC, J___ADD__);
                 }
             }
         
        @@ -126,6 +122,7 @@ public abstract static class SqConcatBuiltinNode extends PythonBinaryBuiltinNode
             @GenerateCached(false)
             @GenerateUncached
             public abstract static class CallSlotBinaryFuncNode extends Node {
        +        private static final TruffleString T_BINARY_SLOT = tsLiteral("");
                 private static final CApiTiming C_API_TIMING = CApiTiming.create(true, "binaryfunc");
         
                 public abstract Object execute(VirtualFrame frame, Node inliningTarget, TpSlot slot, Object self, Object arg);
        @@ -153,38 +150,20 @@ static Object callNative(VirtualFrame frame, Node inliningTarget, TpSlotCExtNati
                                 @Exclusive @Cached(inline = false) PyObjectCheckFunctionResultNode checkResultNode) {
                     PythonContext ctx = PythonContext.get(inliningTarget);
                     PythonThreadState state = getThreadStateNode.execute(inliningTarget, ctx);
        -            TruffleString name = T___GETITEM__; // TODO: how to determine...
        -            Object result = externalInvokeNode.call(frame, inliningTarget, state, C_API_TIMING, name, slot.callable,
        +            Object result = externalInvokeNode.call(frame, inliningTarget, state, C_API_TIMING, T_BINARY_SLOT, slot.callable,
                                     selfToNativeNode.execute(self), argToNativeNode.execute(arg));
        -            return checkResultNode.execute(state, name, toPythonNode.execute(result));
        -        }
        -
        -        @Specialization
        -        @InliningCutoff
        -        static Object callHPy(VirtualFrame frame, Node inliningTarget, TpSlotHPyNative slot, Object self, Object index,
        -                        @Exclusive @Cached GetThreadStateNode getThreadStateNode,
        -                        @Cached(inline = false) HPyAsHandleNode selfToNativeNode,
        -                        @Cached(inline = false) HPyAsHandleNode indexToNativeNode,
        -                        @Exclusive @Cached ExternalFunctionInvokeNode externalInvokeNode,
        -                        @Cached(inline = false) HPyAsPythonObjectNode toPythonNode,
        -                        @Exclusive @Cached(inline = false) PyObjectCheckFunctionResultNode checkResultNode) {
        -            PythonContext ctx = PythonContext.get(inliningTarget);
        -            PythonThreadState threadState = getThreadStateNode.execute(inliningTarget, ctx);
        -            Object result = externalInvokeNode.call(frame, inliningTarget, threadState, C_API_TIMING, T___GETITEM__, slot.callable,
        -                            ctx.getHPyContext().getBackend(), selfToNativeNode.execute(self), indexToNativeNode.execute(index));
        -            return checkResultNode.execute(threadState, T___GETITEM__, toPythonNode.execute(result));
        +            return checkResultNode.execute(state, T_BINARY_SLOT, toPythonNode.execute(result));
                 }
         
                 @Specialization(replaces = "callCachedBuiltin")
                 @InliningCutoff
                 static Object callGenericComplexBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotBinaryFuncBuiltin slot, Object self, Object arg,
        -                        @Cached(inline = false) CallContext callContext,
        -                        @Cached InlinedConditionProfile isNullFrameProfile,
        -                        @Cached(inline = false) IndirectCallNode indirectCallNode) {
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
                     Object[] arguments = PArguments.create(2);
                     PArguments.setArgument(arguments, 0, self);
                     PArguments.setArgument(arguments, 1, arg);
        -            return BuiltinDispatchers.callGenericBuiltin(frame, inliningTarget, slot.callTargetIndex, arguments, callContext, isNullFrameProfile, indirectCallNode);
        +            RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
        +            return invoke.execute(frame, inliningTarget, callTarget, arguments);
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotBinaryOp.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotBinaryOp.java
        index f776aed79b..d80f51a275 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotBinaryOp.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotBinaryOp.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -41,9 +41,33 @@
         package com.oracle.graal.python.builtins.objects.type.slots;
         
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ADD__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___AND__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DIVMOD__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FLOORDIV__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LSHIFT__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MATMUL__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MOD__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MUL__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___OR__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___POW__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RADD__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RAND__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RDIVMOD__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RFLOORDIV__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RLSHIFT__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RMATMUL__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RMOD__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RMUL__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ROR__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RPOW__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RRSHIFT__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RSHIFT__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RSUB__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RTRUEDIV__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RXOR__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SUB__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___TRUEDIV__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___XOR__;
         
         import java.util.Arrays;
         
        @@ -69,11 +93,12 @@
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPython;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.TpSlotBinaryFuncBuiltin;
         import com.oracle.graal.python.lib.PyObjectRichCompareBool;
        +import com.oracle.graal.python.lib.RichCmpOp;
         import com.oracle.graal.python.nodes.PGuards;
         import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
         import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
        -import com.oracle.graal.python.runtime.ExecutionContext.CallContext;
         import com.oracle.graal.python.runtime.PythonContext;
         import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
         import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
        @@ -90,7 +115,6 @@
         import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
        -import com.oracle.truffle.api.nodes.IndirectCallNode;
         import com.oracle.truffle.api.nodes.Node;
         import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         import com.oracle.truffle.api.strings.TruffleString;
        @@ -104,15 +128,27 @@ public class TpSlotBinaryOp {
             private TpSlotBinaryOp() {
             }
         
        -    public enum BinaryOpSlot {
        +    public enum ReversibleSlot {
                 NB_ADD(T___ADD__, T___RADD__),
        -        NB_MULTIPLY(T___MUL__, T___RMUL__);
        -
        -        private static final BinaryOpSlot[] VALUES = values();
        +        NB_SUBTRACT(T___SUB__, T___RSUB__),
        +        NB_MULTIPLY(T___MUL__, T___RMUL__),
        +        NB_REMAINDER(T___MOD__, T___RMOD__),
        +        NB_LSHIFT(T___LSHIFT__, T___RLSHIFT__),
        +        NB_RSHIFT(T___RSHIFT__, T___RRSHIFT__),
        +        NB_AND(T___AND__, T___RAND__),
        +        NB_XOR(T___XOR__, T___RXOR__),
        +        NB_OR(T___OR__, T___ROR__),
        +        NB_FLOOR_DIVIDE(T___FLOORDIV__, T___RFLOORDIV__),
        +        NB_TRUE_DIVIDE(T___TRUEDIV__, T___RTRUEDIV__),
        +        NB_DIVMOD(T___DIVMOD__, T___RDIVMOD__),
        +        NB_MATRIX_MULTIPLY(T___MATMUL__, T___RMATMUL__),
        +        NB_POWER_BINARY(T___POW__, T___RPOW__);
        +
        +        private static final ReversibleSlot[] VALUES = values();
                 private final TruffleString name;
                 private final TruffleString rname;
         
        -        BinaryOpSlot(TruffleString name, TruffleString rname) {
        +        ReversibleSlot(TruffleString name, TruffleString rname) {
                     this.name = name;
                     this.rname = rname;
                 }
        @@ -121,12 +157,24 @@ public TpSlot getSlotValue(TpSlots slots) {
                     // switch instead of using TpSlotMeta for better inlining on fast-path
                     return switch (this) {
                         case NB_ADD -> slots.nb_add();
        +                case NB_SUBTRACT -> slots.nb_subtract();
                         case NB_MULTIPLY -> slots.nb_multiply();
        +                case NB_REMAINDER -> slots.nb_remainder();
        +                case NB_LSHIFT -> slots.nb_lshift();
        +                case NB_RSHIFT -> slots.nb_rshift();
        +                case NB_AND -> slots.nb_and();
        +                case NB_XOR -> slots.nb_xor();
        +                case NB_OR -> slots.nb_or();
        +                case NB_FLOOR_DIVIDE -> slots.nb_floor_divide();
        +                case NB_TRUE_DIVIDE -> slots.nb_true_divide();
        +                case NB_DIVMOD -> slots.nb_divmod();
        +                case NB_MATRIX_MULTIPLY -> slots.nb_matrix_multiply();
        +                case NB_POWER_BINARY -> slots.nb_power();
                     };
                 }
         
        -        public static BinaryOpSlot fromCallableNames(TruffleString[] names) {
        -            for (BinaryOpSlot op : VALUES) {
        +        public static ReversibleSlot fromCallableNames(TruffleString[] names) {
        +            for (ReversibleSlot op : VALUES) {
                         if (names[0].equals(op.name) && names[1].equals(op.rname)) {
                             return op;
                         }
        @@ -135,6 +183,49 @@ public static BinaryOpSlot fromCallableNames(TruffleString[] names) {
                 }
             }
         
        +    public enum InplaceSlot {
        +        NB_INPLACE_ADD(ReversibleSlot.NB_ADD),
        +        NB_INPLACE_SUBTRACT(ReversibleSlot.NB_SUBTRACT),
        +        NB_INPLACE_MULTIPLY(ReversibleSlot.NB_MULTIPLY),
        +        NB_INPLACE_REMAINDER(ReversibleSlot.NB_REMAINDER),
        +        NB_INPLACE_LSHIFT(ReversibleSlot.NB_LSHIFT),
        +        NB_INPLACE_RSHIFT(ReversibleSlot.NB_RSHIFT),
        +        NB_INPLACE_AND(ReversibleSlot.NB_AND),
        +        NB_INPLACE_XOR(ReversibleSlot.NB_XOR),
        +        NB_INPLACE_OR(ReversibleSlot.NB_OR),
        +        NB_INPLACE_FLOOR_DIVIDE(ReversibleSlot.NB_FLOOR_DIVIDE),
        +        NB_INPLACE_TRUE_DIVIDE(ReversibleSlot.NB_TRUE_DIVIDE),
        +        NB_INPLACE_MATRIX_MULTIPLY(ReversibleSlot.NB_MATRIX_MULTIPLY);
        +
        +        private final ReversibleSlot reversibleSlot;
        +
        +        InplaceSlot(ReversibleSlot reversibleSlot) {
        +            this.reversibleSlot = reversibleSlot;
        +        }
        +
        +        public TpSlot getSlotValue(TpSlots slots) {
        +            // switch instead of using TpSlotMeta for better inlining on fast-path
        +            return switch (this) {
        +                case NB_INPLACE_ADD -> slots.nb_inplace_add();
        +                case NB_INPLACE_SUBTRACT -> slots.nb_inplace_subtract();
        +                case NB_INPLACE_MULTIPLY -> slots.nb_inplace_multiply();
        +                case NB_INPLACE_REMAINDER -> slots.nb_inplace_remainder();
        +                case NB_INPLACE_LSHIFT -> slots.nb_inplace_lshift();
        +                case NB_INPLACE_RSHIFT -> slots.nb_inplace_rshift();
        +                case NB_INPLACE_AND -> slots.nb_inplace_and();
        +                case NB_INPLACE_XOR -> slots.nb_inplace_xor();
        +                case NB_INPLACE_OR -> slots.nb_inplace_or();
        +                case NB_INPLACE_FLOOR_DIVIDE -> slots.nb_inplace_floor_divide();
        +                case NB_INPLACE_TRUE_DIVIDE -> slots.nb_inplace_true_divide();
        +                case NB_INPLACE_MATRIX_MULTIPLY -> slots.nb_inplace_matrix_multiply();
        +            };
        +        }
        +
        +        public ReversibleSlot getReversibleSlot() {
        +            return reversibleSlot;
        +        }
        +    }
        +
             public abstract static class TpSlotBinaryOpBuiltin extends TpSlotBuiltin {
                 private final int callTargetIndex = TpSlotBuiltinCallTargetRegistry.getNextCallTargetIndex();
                 private final String builtinName;
        @@ -150,7 +241,7 @@ final BinaryOpBuiltinNode createOpSlotNode() {
         
                 @Override
                 public void initialize(PythonLanguage language) {
        -            RootCallTarget callTarget = createBuiltinCallTarget(language, BuiltinSlotWrapperSignature.BINARY, getNodeFactory(), builtinName);
        +            RootCallTarget callTarget = createSlotCallTarget(language, BuiltinSlotWrapperSignature.BINARY, getNodeFactory(), builtinName);
                     language.setBuiltinSlotCallTarget(callTargetIndex, callTarget);
                 }
         
        @@ -169,6 +260,13 @@ private PBuiltinFunction createRBuiltin(Python3Core core, Object type, TruffleSt
                 }
             }
         
        +    public abstract static class TpSlotBinaryIOpBuiltin extends TpSlotBinaryFuncBuiltin {
        +
        +        protected TpSlotBinaryIOpBuiltin(NodeFactory nodeFactory, String builtinName) {
        +            super(nodeFactory, PExternalFunctionWrapper.BINARYFUNC, builtinName);
        +        }
        +    }
        +
             static final class SwapArgumentsNode extends PythonBinaryBuiltinNode {
                 @Child private BinaryOpBuiltinNode wrapped;
         
        @@ -191,24 +289,24 @@ public Object execute(VirtualFrame frame, Object self, Object other) {
             public abstract static class BinaryOpBuiltinNode extends PythonBinaryBuiltinNode {
             }
         
        -    public static final class TpSlotBinaryOpPython extends TpSlotPython {
        -        private final BinaryOpSlot op;
        +    public static final class TpSlotReversiblePython extends TpSlotPython {
        +        private final ReversibleSlot op;
                 private final TruffleWeakReference left;
                 private final TruffleWeakReference right;
                 private final TruffleWeakReference type;
         
        -        public TpSlotBinaryOpPython(BinaryOpSlot op, Object setattr, Object delattr, Object type) {
        +        public TpSlotReversiblePython(ReversibleSlot op, Object left, Object right, Object type) {
                     this.op = op;
        -            this.left = asWeakRef(setattr);
        -            this.right = asWeakRef(delattr);
        +            this.left = asWeakRef(left);
        +            this.right = asWeakRef(right);
                     this.type = new TruffleWeakReference<>(type);
                 }
         
        -        public static TpSlotBinaryOpPython create(Object[] callables, TruffleString[] callableNames, Object type) {
        +        public static TpSlotReversiblePython create(Object[] callables, TruffleString[] callableNames, Object type) {
                     assert callables.length == 2;
        -            BinaryOpSlot op = BinaryOpSlot.fromCallableNames(callableNames);
        +            ReversibleSlot op = ReversibleSlot.fromCallableNames(callableNames);
                     assert op != null : "Unexpected callable names: " + Arrays.toString(callableNames);
        -            return new TpSlotBinaryOpPython(op, callables[0], callables[1], type);
        +            return new TpSlotReversiblePython(op, callables[0], callables[1], type);
                 }
         
                 @Override
        @@ -216,7 +314,7 @@ public TpSlotPython forNewType(Object klass) {
                     Object newLeft = LookupAttributeInMRONode.Dynamic.getUncached().execute(klass, op.name);
                     Object newRight = LookupAttributeInMRONode.Dynamic.getUncached().execute(klass, op.rname);
                     if (newLeft != getLeft() || newRight != getRight()) {
        -                return new TpSlotBinaryOpPython(op, newLeft, newRight, getType());
        +                return new TpSlotReversiblePython(op, newLeft, newRight, getType());
                     }
                     return this;
                 }
        @@ -245,27 +343,27 @@ public abstract static class CallSlotBinaryOpNode extends Node {
                 // This happens in CallBinaryOp1Node (cpython:binary_op1)
         
                 public abstract Object execute(VirtualFrame frame, Node inliningTarget, TpSlot slot, Object self, Object selfType, Object other, TpSlot otherSlot, Object otherType, boolean sameTypes,
        -                        BinaryOpSlot op);
        +                        ReversibleSlot op);
         
                 @SuppressWarnings("unused")
                 @Specialization(guards = "cachedSlot == slot", limit = "3")
                 static Object callCachedBuiltin(VirtualFrame frame, TpSlotBinaryOpBuiltin slot, Object self,
        -                        Object selfType, Object other, TpSlot otherSlot, Object otherType, boolean sameTypes, BinaryOpSlot op,
        +                        Object selfType, Object other, TpSlot otherSlot, Object otherType, boolean sameTypes, ReversibleSlot op,
                                 @Cached("slot") TpSlotBinaryOpBuiltin cachedSlot,
                                 @Cached("cachedSlot.createOpSlotNode()") BinaryOpBuiltinNode slotNode) {
                     return slotNode.execute(frame, self, other);
                 }
         
                 @Specialization
        -        static Object callPython(VirtualFrame frame, TpSlotBinaryOpPython slot, Object self, Object selfType, Object other, TpSlot otherSlot, Object otherType, boolean sameTypes, BinaryOpSlot op,
        -                        @Cached(inline = false) CallBinaryOpPythonSlotNode callPython) {
        +        static Object callPython(VirtualFrame frame, TpSlotReversiblePython slot, Object self, Object selfType, Object other, TpSlot otherSlot, Object otherType, boolean sameTypes, ReversibleSlot op,
        +                        @Cached(inline = false) CallReversiblePythonSlotNode callPython) {
                     return callPython.execute(frame, slot, self, selfType, other, otherSlot, otherType, sameTypes, op);
                 }
         
                 @SuppressWarnings("unused")
                 @Specialization
                 static Object callNative(VirtualFrame frame, Node inliningTarget, TpSlotCExtNative slot, Object self,
        -                        Object selfType, Object arg, TpSlot otherSlot, Object otherType, boolean sameTypes, BinaryOpSlot op,
        +                        Object selfType, Object arg, TpSlot otherSlot, Object otherType, boolean sameTypes, ReversibleSlot op,
                                 @Exclusive @Cached GetThreadStateNode getThreadStateNode,
                                 @Cached(inline = false) PythonToNativeNode selfToNativeNode,
                                 @Cached(inline = false) PythonToNativeNode argToNativeNode,
        @@ -279,46 +377,28 @@ static Object callNative(VirtualFrame frame, Node inliningTarget, TpSlotCExtNati
                     return checkResultNode.execute(state, op.name, toPythonNode.execute(result));
                 }
         
        -        /*- TODO
        -        @Specialization
        -        @InliningCutoff
        -        static Object callHPy(VirtualFrame frame, Node inliningTarget, TpSlotHPyNative slot, Object self, Object index,
        -                        @Exclusive @Cached GetThreadStateNode getThreadStateNode,
        -                        @Cached(inline = false) HPyAsHandleNode selfToNativeNode,
        -                        @Cached(inline = false) HPyAsHandleNode indexToNativeNode,
        -                        @Exclusive @Cached ExternalFunctionInvokeNode externalInvokeNode,
        -                        @Cached(inline = false) HPyAsPythonObjectNode toPythonNode,
        -                        @Exclusive @Cached(inline = false) PyObjectCheckFunctionResultNode checkResultNode) {
        -            PythonContext ctx = PythonContext.get(inliningTarget);
        -            PythonThreadState threadState = getThreadStateNode.execute(inliningTarget, ctx);
        -            Object result = externalInvokeNode.call(frame, inliningTarget, threadState, C_API_TIMING, T___GETITEM__, slot.callable,
        -                            ctx.getHPyContext().getBackend(), selfToNativeNode.execute(self), indexToNativeNode.execute(index));
        -            return checkResultNode.execute(threadState, T___GETITEM__, toPythonNode.execute(result));
        -        }
        -        */
        -
                 @SuppressWarnings("unused")
                 @Specialization(replaces = "callCachedBuiltin")
                 @InliningCutoff
        -        static Object callGenericComplexBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotBinaryFuncBuiltin slot,
        -                        Object self, Object selfType, Object other, TpSlot otherSlot, Object otherType, boolean sameTypes, BinaryOpSlot op,
        -                        @Cached(inline = false) CallContext callContext,
        -                        @Cached InlinedConditionProfile isNullFrameProfile,
        -                        @Cached(inline = false) IndirectCallNode indirectCallNode) {
        +        static Object callGenericComplexBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotBinaryOpBuiltin slot,
        +                        Object self, Object selfType, Object other, TpSlot otherSlot, Object otherType, boolean sameTypes, ReversibleSlot op,
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
                     Object[] arguments = PArguments.create(2);
                     PArguments.setArgument(arguments, 0, self);
                     PArguments.setArgument(arguments, 1, other);
        -            return BuiltinDispatchers.callGenericBuiltin(frame, inliningTarget, slot.callTargetIndex, arguments, callContext, isNullFrameProfile, indirectCallNode);
        +            RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
        +            return invoke.execute(frame, inliningTarget, callTarget, arguments);
                 }
             }
         
             @GenerateUncached
             @GenerateInline(false) // intentional explicit "data-class"
        -    abstract static class CallBinaryOpPythonSlotNode extends Node {
        -        public abstract Object execute(VirtualFrame frame, TpSlot slot, Object self, Object selfType, Object other, TpSlot otherSlot, Object otherType, boolean sameTypes, BinaryOpSlot op);
        +    abstract static class CallReversiblePythonSlotNode extends Node {
        +        public abstract Object execute(VirtualFrame frame, TpSlotReversiblePython slot, Object self, Object selfType, Object other, TpSlot otherSlot, Object otherType, boolean sameTypes,
        +                        ReversibleSlot op);
         
                 @Specialization
        -        static Object callPython(VirtualFrame frame, TpSlotBinaryOpPython slot, Object self, Object selfType, Object other, TpSlot otherSlot, Object otherType, boolean sameTypes, BinaryOpSlot op,
        +        static Object callPython(VirtualFrame frame, TpSlotReversiblePython slot, Object self, Object selfType, Object other, TpSlot otherSlot, Object otherType, boolean sameTypes, ReversibleSlot op,
                                 @Bind("this") Node inliningTarget,
                                 @Cached IsSubtypeNode isSubtypeNode,
                                 @Cached GetCachedTpSlotsNode getSelfSlotsNode,
        @@ -328,11 +408,11 @@ static Object callPython(VirtualFrame frame, TpSlotBinaryOpPython slot, Object s
                                 @Cached InlinedConditionProfile dispatchR2Profile,
                                 @Cached BinaryPythonSlotDispatcherNode dispatcherNode) {
                     // Implements the logic of SLOT1BINFULL macro from CPython
        -            TpSlotBinaryOpPython otherSlotValue = null;
        +            TpSlotReversiblePython otherSlotValue = null;
                     boolean doOther = false;
                     if (!sameTypes) {
        -                if (isBinOpWrapper(otherSlot, op)) {
        -                    otherSlotValue = (TpSlotBinaryOpPython) otherSlot;
        +                if (isSameReversibleWrapper(otherSlot, op)) {
        +                    otherSlotValue = (TpSlotReversiblePython) otherSlot;
                             doOther = true;
                         }
                     }
        @@ -340,8 +420,8 @@ static Object callPython(VirtualFrame frame, TpSlotBinaryOpPython slot, Object s
                     TpSlots selfSlots = getSelfSlotsNode.execute(inliningTarget, selfType);
                     TpSlot selfSlotValue = op.getSlotValue(selfSlots);
                     // Note: the slot may be other's slot, not self's slot, so this test may not pass
        -            if (isBinOpWrapper(selfSlotValue, op)) {
        -                if (doOther && isSubtypeNode.execute(frame, otherType, selfType)) {
        +            if (isSameReversibleWrapper(selfSlotValue, op)) {
        +                if (doOther && isSubtypeNode.execute(otherType, selfType)) {
                             if (methodIsOverloaded(frame, inliningTarget, slot, otherSlotValue, neNode)) {
                                 Object result = dispatchIfAvailable(frame, inliningTarget, dispatchR1Profile, dispatcherNode, other, self, otherSlotValue.getRight(), otherSlotValue.getType());
                                 if (result != PNotImplemented.NOT_IMPLEMENTED) {
        @@ -372,14 +452,14 @@ private static Object dispatchIfAvailable(VirtualFrame frame, Node inliningTarge
                     }
                 }
         
        -        static boolean isBinOpWrapper(TpSlot s, BinaryOpSlot op) {
        +        static boolean isSameReversibleWrapper(TpSlot s, ReversibleSlot op) {
                     // Equivalent to CPython test: Py_TYPE(other)->tp_as_number->SLOTNAME == TESTFUNC
                     // We have multiple wrappers, because we cache state (MRO lookups) in the wrapper too
        -            return s instanceof TpSlotBinaryOpPython p && p.op == op;
        +            return s instanceof TpSlotReversiblePython p && p.op == op;
                 }
         
                 static boolean methodIsOverloaded(VirtualFrame frame, Node inliningTarget,
        -                        TpSlotBinaryOpPython leftSlot, TpSlotBinaryOpPython rightSlot, RichCompareCallablesNotEqual neNode) {
        +                        TpSlotReversiblePython leftSlot, TpSlotReversiblePython rightSlot, RichCompareCallablesNotEqual neNode) {
                     // CPython uses _PyObject_LookupAttr(Py_TYPE(x), name) as opposed to
                     // _PyType_Lookup(Py_TYPE(x), name). Moreover, we cache the MRO lookup results in the
                     // slot, CPython doesn't, presumably because the slot cannot (easily) hold the extra
        @@ -440,8 +520,8 @@ static boolean doMethods(PMethodBase a, PMethodBase b) {
         
                 @Fallback
                 static boolean doGenericRuntimeObjects(VirtualFrame frame, Node inliningTarget, Object a, Object b,
        -                        @Cached PyObjectRichCompareBool.NeNode neNode) {
        -            return neNode.compare(frame, inliningTarget, a, b);
        +                        @Cached PyObjectRichCompareBool neNode) {
        +            return neNode.execute(frame, inliningTarget, a, b, RichCmpOp.Py_NE);
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotDescrGet.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotDescrGet.java
        index 5f6824670b..c0e7923e55 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotDescrGet.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotDescrGet.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -66,14 +66,13 @@
         import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PGuards;
         import com.oracle.graal.python.nodes.PRaiseNode;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
         import com.oracle.graal.python.nodes.call.CallNode;
        -import com.oracle.graal.python.nodes.call.FunctionInvokeNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
        -import com.oracle.graal.python.runtime.ExecutionContext.CallContext;
         import com.oracle.graal.python.runtime.PythonContext;
         import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
         import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
        -import com.oracle.truffle.api.CompilerDirectives;
        +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
         import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
         import com.oracle.truffle.api.RootCallTarget;
         import com.oracle.truffle.api.dsl.Cached;
        @@ -81,11 +80,13 @@
         import com.oracle.truffle.api.dsl.GenerateCached;
         import com.oracle.truffle.api.dsl.GenerateInline;
         import com.oracle.truffle.api.dsl.GenerateUncached;
        +import com.oracle.truffle.api.dsl.ImportStatic;
         import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
        -import com.oracle.truffle.api.nodes.IndirectCallNode;
        +import com.oracle.truffle.api.nodes.DirectCallNode;
         import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.profiles.BranchProfile;
         import com.oracle.truffle.api.profiles.ConditionProfile;
         import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         import com.oracle.truffle.api.strings.TruffleString;
        @@ -143,7 +144,7 @@ protected TpSlotDescrGetBuiltinComplex(NodeFactory nodeFactory) {
                 public void initialize(PythonLanguage language) {
                     // We need a different call-target for the "raw" slot. It must not normalize None to
                     // NO_VALUE (NULL in CPython) like the __get__ wrapper.
        -            RootCallTarget callTarget = createBuiltinCallTarget(language, SIGNATURE, getNodeFactory(), J___GET__);
        +            RootCallTarget callTarget = createSlotCallTarget(language, SIGNATURE, getNodeFactory(), J___GET__);
                     language.setBuiltinSlotCallTarget(callTargetIndex, callTarget);
                 }
             }
        @@ -151,7 +152,7 @@ public void initialize(PythonLanguage language) {
             static final class DescrGetWrapperNode extends PythonTernaryBuiltinNode {
                 private final ConditionProfile objIsNoneProfile = ConditionProfile.create();
                 private final ConditionProfile typeIsNoneProfile = ConditionProfile.create();
        -        @Child private PRaiseNode raiseNode;
        +        private final BranchProfile errorProfile = BranchProfile.create();
                 @Child private DescrGetBuiltinNode wrapped;
         
                 DescrGetWrapperNode(DescrGetBuiltinNode wrapped) {
        @@ -167,11 +168,8 @@ public Object execute(VirtualFrame frame, Object self, Object objIn, Object type
                     Object obj = normalizeNone(objIsNoneProfile, objIn);
                     Object type = normalizeNone(typeIsNoneProfile, typeIn);
                     if (obj == PNone.NO_VALUE && type == PNone.NO_VALUE) {
        -                if (raiseNode == null) {
        -                    CompilerDirectives.transferToInterpreterAndInvalidate();
        -                    raiseNode = insert(PRaiseNode.create());
        -                }
        -                raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.GET_NONE_NONE_IS_INVALID);
        +                errorProfile.enter();
        +                throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.TypeError, ErrorMessages.GET_NONE_NONE_IS_INVALID);
                     }
                     return wrapped.execute(frame, self, obj, type);
                 }
        @@ -233,6 +231,7 @@ static Object callNative(VirtualFrame frame, Node inliningTarget, TpSlotNative s
                     return checkResultNode.execute(threadState, T___GET__, toPythonNode.execute(result));
                 }
         
        +        @TruffleBoundary
                 @Specialization(replaces = "callCachedBuiltin")
                 static Object callGenericSimpleBuiltin(TpSlotDescrGetBuiltinSimple slot, Object self, Object obj, Object type) {
                     // Simple builtins should not need a frame
        @@ -242,14 +241,13 @@ static Object callGenericSimpleBuiltin(TpSlotDescrGetBuiltinSimple slot, Object
                 @Specialization(replaces = "callCachedBuiltin")
                 @InliningCutoff
                 static Object callGenericBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotDescrGetBuiltinComplex slot, Object self, Object obj, Object type,
        -                        @Cached(inline = false) CallContext callContext,
        -                        @Cached InlinedConditionProfile isNullFrameProfile,
        -                        @Cached(inline = false) IndirectCallNode indirectCallNode) {
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
                     Object[] arguments = PArguments.create(3);
                     PArguments.setArgument(arguments, 0, self);
                     PArguments.setArgument(arguments, 1, obj);
                     PArguments.setArgument(arguments, 2, type);
        -            return BuiltinDispatchers.callGenericBuiltin(frame, inliningTarget, slot.callTargetIndex, arguments, callContext, isNullFrameProfile, indirectCallNode);
        +            RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
        +            return invoke.execute(frame, inliningTarget, callTarget, arguments);
                 }
             }
         
        @@ -261,6 +259,7 @@ static Object callGenericBuiltin(VirtualFrame frame, Node inliningTarget, TpSlot
             @GenerateUncached
             @GenerateInline
             @GenerateCached(false)
        +    @ImportStatic(CallDispatchers.class)
             abstract static class DescrGetPythonSlotDispatcherNode extends PythonSlotDispatcherNodeBase {
                 abstract Object execute(VirtualFrame frame, Node inliningTarget, Object callable, Object type, Object self, Object arg1, Object arg2);
         
        @@ -271,12 +270,13 @@ protected static Object doCachedPFunction(VirtualFrame frame, Node inliningTarge
                                 @SuppressWarnings("unused") @Cached("callee") PFunction cachedCallee,
                                 @Cached @Shared InlinedConditionProfile arg1Profile,
                                 @Cached @Shared InlinedConditionProfile arg2Profile,
        -                        @Cached("createInvokeNode(cachedCallee)") FunctionInvokeNode invoke) {
        +                        @Cached("createDirectCallNodeFor(callee)") DirectCallNode callNode,
        +                        @Cached CallDispatchers.FunctionDirectInvokeNode invoke) {
                     Object[] arguments = PArguments.create(3);
                     PArguments.setArgument(arguments, 0, self);
                     PArguments.setArgument(arguments, 1, normalizeNoValue(arg1Profile, inliningTarget, arg1));
                     PArguments.setArgument(arguments, 2, normalizeNoValue(arg2Profile, inliningTarget, arg2));
        -            return invoke.execute(frame, arguments);
        +            return invoke.execute(frame, inliningTarget, callNode, cachedCallee, arguments);
                 }
         
                 private static Object normalizeNoValue(InlinedConditionProfile profile, Node inlinintTarget, Object o) {
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotDescrSet.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotDescrSet.java
        index b336adedd6..f2010e0ca9 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotDescrSet.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotDescrSet.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -68,8 +68,8 @@
         import com.oracle.graal.python.nodes.PGuards;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode.Dynamic;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
         import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
        -import com.oracle.graal.python.runtime.ExecutionContext.CallContext;
         import com.oracle.graal.python.runtime.PythonContext;
         import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
         import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
        @@ -86,9 +86,7 @@
         import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
        -import com.oracle.truffle.api.nodes.IndirectCallNode;
         import com.oracle.truffle.api.nodes.Node;
        -import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         import com.oracle.truffle.api.strings.TruffleString;
         import com.oracle.truffle.api.utilities.TruffleWeakReference;
         
        @@ -115,7 +113,7 @@ final DescrSetBuiltinNode createSlotNode() {
         
                 @Override
                 public void initialize(PythonLanguage language) {
        -            RootCallTarget target = createBuiltinCallTarget(language, SET_SIGNATURE, getNodeFactory(), J___SET__);
        +            RootCallTarget target = createSlotCallTarget(language, SET_SIGNATURE, getNodeFactory(), J___SET__);
                     language.setBuiltinSlotCallTarget(callTargetIndex, target);
                 }
         
        @@ -210,8 +208,8 @@ static void callNative(VirtualFrame frame, Node inliningTarget, TpSlotNative slo
                 }
             }
         
        -    private static PException raiseAttributeError(Node inliningTarget, PRaiseNode.Lazy raiseNode, TruffleString attrName) {
        -        return raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.AttributeError, attrName);
        +    private static PException raiseAttributeError(Node inliningTarget, PRaiseNode raiseNode, TruffleString attrName) {
        +        return raiseNode.raise(inliningTarget, PythonBuiltinClassType.AttributeError, attrName);
             }
         
             @GenerateInline(inlineByDefault = true)
        @@ -241,7 +239,7 @@ static void callCachedBuiltin(VirtualFrame frame, @SuppressWarnings("unused") Tp
                 @Specialization(guards = "!isNoValue(value)")
                 static void callPythonSet(VirtualFrame frame, Node inliningTarget, TpSlotDescrSetPython slot, Object self, Object obj, Object value,
                                 @Cached TernaryPythonSlotDispatcherNode dispatcherNode,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Exclusive @Cached PRaiseNode raiseNode) {
                     Object callable = slot.getSetCallable();
                     if (callable == null) {
                         throw raiseAttributeError(inliningTarget, raiseNode, T___SET__);
        @@ -253,7 +251,7 @@ static void callPythonSet(VirtualFrame frame, Node inliningTarget, TpSlotDescrSe
                 @InliningCutoff
                 static void callPythonDel(VirtualFrame frame, Node inliningTarget, TpSlotDescrSetPython slot, Object self, Object obj, @SuppressWarnings("unused") Object value,
                                 @Cached BinaryPythonSlotDispatcherNode dispatcherNode,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Exclusive @Cached PRaiseNode raiseNode) {
                     Object callable = slot.getDelCallable();
                     if (callable == null) {
                         throw raiseAttributeError(inliningTarget, raiseNode, T___DEL__);
        @@ -271,14 +269,13 @@ static void callNative(VirtualFrame frame, Node inliningTarget, TpSlotNative slo
                 @Specialization(replaces = "callCachedBuiltin")
                 @InliningCutoff
                 static void callGenericBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotDescrSetBuiltin slot, Object self, Object obj, Object value,
        -                        @Cached(inline = false) CallContext callContext,
        -                        @Cached InlinedConditionProfile isNullFrameProfile,
        -                        @Cached(inline = false) IndirectCallNode indirectCallNode) {
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
                     Object[] arguments = PArguments.create(3);
                     PArguments.setArgument(arguments, 0, self);
                     PArguments.setArgument(arguments, 1, obj);
                     PArguments.setArgument(arguments, 2, value);
        -            BuiltinDispatchers.callGenericBuiltin(frame, inliningTarget, slot.callTargetIndex, arguments, callContext, isNullFrameProfile, indirectCallNode);
        +            RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
        +            invoke.execute(frame, inliningTarget, callTarget, arguments);
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotGetAttr.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotGetAttr.java
        index e77f3f868f..369e4da197 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotGetAttr.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotGetAttr.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -63,9 +63,11 @@
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPython;
         import com.oracle.graal.python.nodes.PGuards;
         import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode.Dynamic;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
        +import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode;
        +import com.oracle.graal.python.nodes.call.special.MaybeBindDescriptorNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
         import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile;
        -import com.oracle.graal.python.runtime.ExecutionContext.CallContext;
         import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
         import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
         import com.oracle.graal.python.runtime.exception.PException;
        @@ -81,7 +83,6 @@
         import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
        -import com.oracle.truffle.api.nodes.IndirectCallNode;
         import com.oracle.truffle.api.nodes.Node;
         import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         import com.oracle.truffle.api.strings.TruffleString;
        @@ -108,7 +109,7 @@ final GetAttrBuiltinNode createSlotNode() {
         
                 @Override
                 public void initialize(PythonLanguage language) {
        -            RootCallTarget target = createBuiltinCallTarget(language, BuiltinSlotWrapperSignature.BINARY, getNodeFactory(), J___GETATTRIBUTE__);
        +            RootCallTarget target = createSlotCallTarget(language, BuiltinSlotWrapperSignature.BINARY, getNodeFactory(), J___GETATTRIBUTE__);
                     language.setBuiltinSlotCallTarget(callTargetIndex, target);
                 }
             }
        @@ -297,6 +298,8 @@ static Object callPythonSimple(VirtualFrame frame, Node inliningTarget, TpSlotGe
         
                 @Specialization(guards = "slot.hasGetattr()")
                 static Object callPythonSimple(VirtualFrame frame, Node inliningTarget, TpSlotGetAttrPython slot, Object self, Object name,
        +                        @Cached MaybeBindDescriptorNode bindDescriptorNode,
        +                        @Cached CallBinaryMethodNode callGetAttributeNode,
                                 @Exclusive @Cached BinaryPythonSlotDispatcherNode callPythonFun,
                                 @Cached IsBuiltinObjectProfile errorProfile) {
                     // equivalent of slot_tp_getattr_hook
        @@ -309,7 +312,13 @@ static Object callPythonSimple(VirtualFrame frame, Node inliningTarget, TpSlotGe
                         // TODO: CPython calls PyObject_GenericGetAttr if there is no __getattribute__. Can
                         // we create a type that does not inherit tp_getattro and so no __getattribute__ is
                         // created for it in add_operators?
        -                return callPythonFun.execute(frame, inliningTarget, slot.getGetattribute(), type, self, name);
        +
        +                // NOTE: we use CallBinaryMethodNode, because it is common that the __getattribute__
        +                // callable is PBuiltinFunction wrapper is wrapping raw tp_getattro slot. This
        +                // happens if a Python class declares __getattr__ and inherits __getattribute__
        +                // wrapping some builtin slot.
        +                Object bound = bindDescriptorNode.execute(frame, inliningTarget, slot.getGetattribute(), self, type);
        +                return callGetAttributeNode.executeObject(frame, bound, self, name);
                     } catch (PException pe) {
                         pe.expect(inliningTarget, AttributeError, errorProfile);
                         if (getattr == null) {
        @@ -323,13 +332,12 @@ static Object callPythonSimple(VirtualFrame frame, Node inliningTarget, TpSlotGe
                 @Specialization(replaces = "callCachedBuiltin")
                 @InliningCutoff
                 static Object callGenericBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotGetAttrBuiltin slot, Object self, Object name,
        -                        @Cached(inline = false) CallContext callContext,
        -                        @Cached InlinedConditionProfile isNullFrameProfile,
        -                        @Cached(inline = false) IndirectCallNode indirectCallNode) {
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
                     Object[] arguments = PArguments.create(2);
                     PArguments.setArgument(arguments, 0, self);
                     PArguments.setArgument(arguments, 1, name);
        -            return BuiltinDispatchers.callGenericBuiltin(frame, inliningTarget, slot.callTargetIndex, arguments, callContext, isNullFrameProfile, indirectCallNode);
        +            RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
        +            return invoke.execute(frame, inliningTarget, callTarget, arguments);
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotHashFun.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotHashFun.java
        new file mode 100644
        index 0000000000..0cb77594f1
        --- /dev/null
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotHashFun.java
        @@ -0,0 +1,241 @@
        +/*
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
        + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        + *
        + * The Universal Permissive License (UPL), Version 1.0
        + *
        + * Subject to the condition set forth below, permission is hereby granted to any
        + * person obtaining a copy of this software, associated documentation and/or
        + * data (collectively the "Software"), free of charge and under any and all
        + * copyright rights in the Software, and any and all patent rights owned or
        + * freely licensable by each licensor hereunder covering either (i) the
        + * unmodified Software as contributed to or provided by such licensor, or (ii)
        + * the Larger Works (as defined below), to deal in both
        + *
        + * (a) the Software, and
        + *
        + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
        + * one is included with the Software each a "Larger Work" to which the Software
        + * is contributed by such licensors),
        + *
        + * without restriction, including without limitation the rights to copy, create
        + * derivative works of, display, perform, and distribute the Software and make,
        + * use, sell, offer for sale, import, export, have made, and have sold the
        + * Software and the Larger Work(s), and to sublicense the foregoing rights on
        + * either these or other terms.
        + *
        + * This license is subject to the following condition:
        + *
        + * The above copyright notice and either this complete permission notice or at a
        + * minimum a reference to the UPL must be included in all copies or substantial
        + * portions of the Software.
        + *
        + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        + * SOFTWARE.
        + */
        +package com.oracle.graal.python.builtins.objects.type.slots;
        +
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___HASH__;
        +
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.CheckPrimitiveFunctionResultNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionInvokeNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode;
        +import com.oracle.graal.python.builtins.objects.function.PArguments;
        +import com.oracle.graal.python.builtins.objects.ints.IntBuiltins;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots.TpSlotMeta;
        +import com.oracle.graal.python.builtins.objects.type.slots.PythonDispatchers.UnaryPythonSlotDispatcherNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltinBase;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotCExtNative;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotManaged;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPythonSingle;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.PyObjectHashNotImplemented.HashNotImplementedNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFunFactory.CallSlotHashFunNodeGen;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFunFactory.PyObjectHashNotImplementedFactory.HashNotImplementedNodeFactory;
        +import com.oracle.graal.python.lib.PyLongAsLongAndOverflowNode;
        +import com.oracle.graal.python.lib.PyLongCheckNode;
        +import com.oracle.graal.python.nodes.ErrorMessages;
        +import com.oracle.graal.python.nodes.PRaiseNode;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
        +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.runtime.PythonContext;
        +import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
        +import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
        +import com.oracle.graal.python.util.OverflowException;
        +import com.oracle.truffle.api.CompilerDirectives;
        +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
        +import com.oracle.truffle.api.RootCallTarget;
        +import com.oracle.truffle.api.dsl.Bind;
        +import com.oracle.truffle.api.dsl.Cached;
        +import com.oracle.truffle.api.dsl.Cached.Exclusive;
        +import com.oracle.truffle.api.dsl.GenerateCached;
        +import com.oracle.truffle.api.dsl.GenerateInline;
        +import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        +import com.oracle.truffle.api.dsl.GenerateUncached;
        +import com.oracle.truffle.api.dsl.NodeFactory;
        +import com.oracle.truffle.api.dsl.Specialization;
        +import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.profiles.InlinedConditionProfile;
        +
        +public abstract class TpSlotHashFun {
        +    public static final TpSlotManaged HASH_NOT_IMPLEMENTED = new PyObjectHashNotImplemented();
        +
        +    private TpSlotHashFun() {
        +    }
        +
        +    /**
        +     * Mirror of the {@code PyObject_HashNotImplemented} slot on the managed side. We translate this
        +     * slot singleton instance to a pointer to the {@code PyObject_HashNotImplemented} C function in
        +     * {@link TpSlot#toNative(TpSlotMeta, TpSlot, Object)} and vice versa in
        +     * {@code TpSlot#fromNative(PythonContext, Object, InteropLibrary)}.
        +     */
        +    public static class PyObjectHashNotImplemented extends TpSlotHashBuiltin {
        +        private PyObjectHashNotImplemented() {
        +            super(HashNotImplementedNodeFactory.getInstance());
        +        }
        +
        +        @GenerateNodeFactory
        +        public abstract static class HashNotImplementedNode extends HashBuiltinNode {
        +            @Specialization
        +            static long doIt(@SuppressWarnings("unused") Object obj,
        +                            @Bind Node nodeForRaise) {
        +                throw PRaiseNode.raiseStatic(nodeForRaise, PythonBuiltinClassType.TypeError, ErrorMessages.UNHASHABLE_TYPE_P, obj);
        +            }
        +        }
        +    }
        +
        +    public abstract static class TpSlotHashBuiltin
        +                    extends TpSlotBuiltinBase {
        +        static final BuiltinSlotWrapperSignature SIGNATURE = BuiltinSlotWrapperSignature.UNARY;
        +        private final int callTargetIndex = TpSlotBuiltinCallTargetRegistry.getNextCallTargetIndex();
        +
        +        public TpSlotHashBuiltin(NodeFactory nodeFactory) {
        +            super(nodeFactory, SIGNATURE, PExternalFunctionWrapper.HASHFUNC);
        +        }
        +
        +        HashBuiltinNode createSlotNode() {
        +            return createNode();
        +        }
        +
        +        @Override
        +        public void initialize(PythonLanguage language) {
        +            RootCallTarget callTarget = createSlotCallTarget(language, SIGNATURE, getNodeFactory(), J___HASH__);
        +            language.setBuiltinSlotCallTarget(callTargetIndex, callTarget);
        +        }
        +    }
        +
        +    @GenerateInline(value = false, inherit = true)
        +    public abstract static class HashBuiltinNode extends PythonUnaryBuiltinNode {
        +        public abstract long executeLong(VirtualFrame frame, Object obj);
        +
        +        @Override
        +        public final Object execute(VirtualFrame frame, Object obj) {
        +            return executeLong(frame, obj);
        +        }
        +    }
        +
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @GenerateUncached
        +    public abstract static class CallSlotHashFunNode extends Node {
        +        private static final CApiTiming C_API_TIMING = CApiTiming.create(true, "tp_hash");
        +
        +        public abstract long execute(VirtualFrame frame, Node inliningTarget, TpSlot slot, Object self);
        +
        +        @Specialization(guards = "cachedSlot == slot", limit = "3")
        +        static long callCachedBuiltin(VirtualFrame frame, @SuppressWarnings("unused") TpSlotHashBuiltin slot, Object self,
        +                        @SuppressWarnings("unused") @Cached("slot") TpSlotHashBuiltin cachedSlot,
        +                        @Cached("cachedSlot.createSlotNode()") HashBuiltinNode slotNode) {
        +            return slotNode.executeLong(frame, self);
        +        }
        +
        +        @Specialization
        +        static long callPython(VirtualFrame frame, TpSlotPythonSingle slot, Object self,
        +                        @Cached(inline = false) CallSlotHashFunPythonNode callSlotNode) {
        +            return callSlotNode.execute(frame, slot, self);
        +        }
        +
        +        @Specialization
        +        static long callNative(VirtualFrame frame, Node inliningTarget, TpSlotCExtNative slot, Object self,
        +                        @Exclusive @Cached GetThreadStateNode getThreadStateNode,
        +                        @Cached(inline = false) PythonToNativeNode toNativeNode,
        +                        @Exclusive @Cached ExternalFunctionInvokeNode externalInvokeNode,
        +                        @Exclusive @Cached(inline = false) CheckPrimitiveFunctionResultNode checkResultNode) {
        +            PythonContext ctx = PythonContext.get(inliningTarget);
        +            PythonThreadState state = getThreadStateNode.execute(inliningTarget, ctx);
        +            Object result = externalInvokeNode.call(frame, inliningTarget, state, C_API_TIMING, T___HASH__, slot.callable, toNativeNode.execute(self));
        +            return checkResultNode.executeLong(state, T___HASH__, result);
        +        }
        +
        +        @Specialization(replaces = "callCachedBuiltin")
        +        @InliningCutoff
        +        static long callGenericComplexBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotHashBuiltin slot, Object self,
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
        +            Object[] arguments = PArguments.create(1);
        +            PArguments.setArgument(arguments, 0, self);
        +            RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
        +            return (long) invoke.execute(frame, inliningTarget, callTarget, arguments);
        +        }
        +
        +        public static CallSlotHashFunNode getUncached() {
        +            return CallSlotHashFunNodeGen.getUncached();
        +        }
        +    }
        +
        +    @GenerateUncached
        +    @GenerateInline(false) // intentionally lazy
        +    abstract static class CallSlotHashFunPythonNode extends Node {
        +        abstract long execute(VirtualFrame frame, TpSlotPythonSingle slot, Object obj);
        +
        +        @Specialization
        +        static long doIt(VirtualFrame frame, TpSlotPythonSingle slot, Object self,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached UnaryPythonSlotDispatcherNode dispatcherNode,
        +                        @Cached PyLongCheckNode longCheckNode,
        +                        @Cached PyLongAsLongAndOverflowNode asLongNode,
        +                        @Cached IntBuiltins.HashNode intHashNode,
        +                        @Cached InlinedConditionProfile minusOneProfile,
        +                        @Cached PRaiseNode raiseNode) {
        +            // See CPython: slot_sq_length
        +            Object callable = slot.getCallable();
        +            if (callable == null) {
        +                CompilerDirectives.transferToInterpreterAndInvalidate();
        +                throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.UNHASHABLE_TYPE_P, self);
        +            }
        +            Object result = dispatcherNode.execute(frame, inliningTarget, callable, slot.getType(), self);
        +            if (!longCheckNode.execute(inliningTarget, result)) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.HASH_SHOULD_RETURN_INTEGER);
        +            }
        +            /*
        +             * CPython transforms to Py_hash_t using PyLong_AsSsize_t. For us the equivalent is Java
        +             * long. In any case: our transformation must preserve values that already lie within
        +             * this range, to ensure that if x.__hash__() returns hash(y) then hash(x) == hash(y)
        +             */
        +            long hash;
        +            try {
        +                hash = asLongNode.execute(frame, inliningTarget, result);
        +            } catch (OverflowException e) {
        +                /*
        +                 * CPython note: res was not within the range of a Py_hash_t, so we're free to use
        +                 * any sufficiently bit-mixing transformation; long.__hash__ will do nicely.
        +                 */
        +                return intHashNode.executeLong(frame, result);
        +            }
        +            /* -1 is reserved for errors. */
        +            if (minusOneProfile.profile(inliningTarget, hash == -1)) {
        +                return -2;
        +            }
        +            return hash;
        +        }
        +    }
        +}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotInquiry.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotInquiry.java
        index 6242d67a2d..9f0d8244b3 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotInquiry.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotInquiry.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -152,7 +152,7 @@ static boolean doIt(VirtualFrame frame, TpSlotPythonSingle slot, Object self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached UnaryPythonSlotDispatcherNode dispatcherNode,
                                 @Cached PyBoolCheckNode pyBoolCheckNode,
        -                        @Cached PRaiseNode.Lazy raiseNode,
        +                        @Cached PRaiseNode raiseNode,
                                 @Cached PyObjectIsTrueNode pyObjectIsTrueNode) {
                     // See CPython: slot_nb_bool
                     // TODO: it is not clear to me why CPython lookups __len__ in the slot wrapper although
        @@ -160,9 +160,9 @@ static boolean doIt(VirtualFrame frame, TpSlotPythonSingle slot, Object self,
                     // __len__. We ignore the __len__ lookup for now.
                     Object result = dispatcherNode.execute(frame, inliningTarget, slot.getCallable(), slot.getType(), self);
                     if (!pyBoolCheckNode.execute(inliningTarget, result)) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.BOOL_SHOULD_RETURN_BOOL, result);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.BOOL_SHOULD_RETURN_BOOL, result);
                     }
        -            return pyObjectIsTrueNode.execute(frame, inliningTarget, result);
        +            return pyObjectIsTrueNode.execute(frame, result);
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotIterNext.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotIterNext.java
        new file mode 100644
        index 0000000000..6c1684830d
        --- /dev/null
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotIterNext.java
        @@ -0,0 +1,213 @@
        +/*
        + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
        + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        + *
        + * The Universal Permissive License (UPL), Version 1.0
        + *
        + * Subject to the condition set forth below, permission is hereby granted to any
        + * person obtaining a copy of this software, associated documentation and/or
        + * data (collectively the "Software"), free of charge and under any and all
        + * copyright rights in the Software, and any and all patent rights owned or
        + * freely licensable by each licensor hereunder covering either (i) the
        + * unmodified Software as contributed to or provided by such licensor, or (ii)
        + * the Larger Works (as defined below), to deal in both
        + *
        + * (a) the Software, and
        + *
        + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
        + * one is included with the Software each a "Larger Work" to which the Software
        + * is contributed by such licensors),
        + *
        + * without restriction, including without limitation the rights to copy, create
        + * derivative works of, display, perform, and distribute the Software and make,
        + * use, sell, offer for sale, import, export, have made, and have sold the
        + * Software and the Larger Work(s), and to sublicense the foregoing rights on
        + * either these or other terms.
        + *
        + * This license is subject to the following condition:
        + *
        + * The above copyright notice and either this complete permission notice or at a
        + * minimum a reference to the UPL must be included in all copies or substantial
        + * portions of the Software.
        + *
        + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        + * SOFTWARE.
        + */
        +package com.oracle.graal.python.builtins.objects.type.slots;
        +
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEXT__;
        +
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.builtins.Python3Core;
        +import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        +import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionInvokeNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.NativeToPythonTransferNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode;
        +import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.ClearCurrentExceptionNode;
        +import com.oracle.graal.python.builtins.objects.function.PArguments;
        +import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
        +import com.oracle.graal.python.builtins.objects.type.slots.NodeFactoryUtils.WrapperNodeFactory;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltin;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotCExtNative;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPythonSingle;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotUnaryFunc.CallSlotUnaryPythonNode;
        +import com.oracle.graal.python.lib.IteratorExhausted;
        +import com.oracle.graal.python.nodes.ErrorMessages;
        +import com.oracle.graal.python.nodes.PRaiseNode;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
        +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
        +import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
        +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
        +import com.oracle.truffle.api.RootCallTarget;
        +import com.oracle.truffle.api.dsl.Bind;
        +import com.oracle.truffle.api.dsl.Cached;
        +import com.oracle.truffle.api.dsl.GenerateCached;
        +import com.oracle.truffle.api.dsl.GenerateInline;
        +import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        +import com.oracle.truffle.api.dsl.GenerateUncached;
        +import com.oracle.truffle.api.dsl.NodeFactory;
        +import com.oracle.truffle.api.dsl.Specialization;
        +import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.strings.TruffleString;
        +
        +public final class TpSlotIterNext {
        +    private TpSlotIterNext() {
        +    }
        +
        +    /** Equivalent of {@code _PyObject_NextNotImplemented} */
        +    public static final TpSlot NEXT_NOT_IMPLEMENTED = TpSlotIterNextSlotsGen.SLOTS.tp_iternext();
        +
        +    public abstract static class TpSlotIterNextBuiltin extends TpSlotBuiltin {
        +        final int callTargetIndex = TpSlotBuiltinCallTargetRegistry.getNextCallTargetIndex();
        +
        +        protected TpSlotIterNextBuiltin(NodeFactory nodeFactory) {
        +            super(nodeFactory);
        +        }
        +
        +        final PythonUnaryBuiltinNode createSlotNode() {
        +            return createNode();
        +        }
        +
        +        @Override
        +        public final void initialize(PythonLanguage language) {
        +            RootCallTarget callTarget = createSlotCallTarget(language, BuiltinSlotWrapperSignature.UNARY, getNodeFactory(), J___NEXT__);
        +            language.setBuiltinSlotCallTarget(callTargetIndex, callTarget);
        +        }
        +
        +        @Override
        +        public PBuiltinFunction createBuiltin(Python3Core core, Object type, TruffleString tsName, PExternalFunctionWrapper wrapper) {
        +            var factory = new WrapperNodeFactory<>(getNodeFactory(), TpIterNextBuiltinWrapperNode.class, TpIterNextBuiltinWrapperNode::new);
        +            return createBuiltin(core, type, tsName, BuiltinSlotWrapperSignature.UNARY, wrapper, factory);
        +        }
        +    }
        +
        +    public static final class TpIterNextBuiltinWrapperNode extends PythonUnaryBuiltinNode {
        +        @Child PythonUnaryBuiltinNode delegate;
        +
        +        public TpIterNextBuiltinWrapperNode(PythonUnaryBuiltinNode delegate) {
        +            this.delegate = delegate;
        +        }
        +
        +        @Override
        +        public Object execute(VirtualFrame frame, Object arg) {
        +            try {
        +                return delegate.execute(frame, arg);
        +            } catch (IteratorExhausted e) {
        +                throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.StopIteration);
        +            }
        +        }
        +    }
        +
        +    /**
        +     * Convenience base class for {@code tp_iternext} builtin implementations.
        +     * {@code PythonUnaryBuiltinNode} can be used instead if necessitated by existing inheritance
        +     * hierarchy.
        +     */
        +    @GenerateInline(value = false, inherit = true)
        +    public abstract static class TpIterNextBuiltin extends PythonUnaryBuiltinNode {
        +        /**
        +         * Raise a control flow exception that signals iterator exhaustion. A faster equivalent to
        +         * raising {@code StopIteration} python exception. Should not be used outside of
        +         * {@code tp_iternext} implementations.
        +         */
        +        public static IteratorExhausted iteratorExhausted() {
        +            throw IteratorExhausted.INSTANCE;
        +        }
        +    }
        +
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
        +    @GenerateNodeFactory
        +    abstract static class NextNotImplementedNode extends PythonUnaryBuiltinNode {
        +        @Specialization
        +        static Object error(Object iterable,
        +                        @Bind Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.OBJ_NOT_ITERABLE, iterable);
        +        }
        +    }
        +
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @GenerateUncached
        +    public abstract static class CallSlotTpIterNextNode extends Node {
        +        private static final CApiTiming C_API_TIMING = CApiTiming.create(true, "iternext");
        +
        +        public abstract Object execute(VirtualFrame frame, Node inliningTarget, TpSlot slot, Object self);
        +
        +        @Specialization(guards = "cachedSlot == slot", limit = "3")
        +        static Object callCachedBuiltin(VirtualFrame frame, @SuppressWarnings("unused") TpSlotIterNextBuiltin slot, Object self,
        +                        @SuppressWarnings("unused") @Cached("slot") TpSlotIterNextBuiltin cachedSlot,
        +                        @Cached("cachedSlot.createSlotNode()") PythonUnaryBuiltinNode slotNode) {
        +            return slotNode.execute(frame, self);
        +        }
        +
        +        @Specialization
        +        static Object callPython(VirtualFrame frame, TpSlotPythonSingle slot, Object self,
        +                        @Cached(inline = false) CallSlotUnaryPythonNode callSlotNode) {
        +            return callSlotNode.execute(frame, slot, self);
        +        }
        +
        +        @Specialization
        +        static Object callNative(VirtualFrame frame, Node inliningTarget, TpSlotCExtNative slot, Object self,
        +                        @Cached GetThreadStateNode getThreadStateNode,
        +                        @Cached(inline = false) PythonToNativeNode toNativeNode,
        +                        @Cached ExternalFunctionInvokeNode externalInvokeNode,
        +                        @Cached(inline = false) NativeToPythonTransferNode toPythonNode,
        +                        @Cached ClearCurrentExceptionNode clearCurrentExceptionNode) {
        +            PythonThreadState state = getThreadStateNode.execute(inliningTarget);
        +            Object nativeResult = externalInvokeNode.call(frame, inliningTarget, state, C_API_TIMING, T___NEXT__, slot.callable,
        +                            toNativeNode.execute(self));
        +            Object pythonResult = toPythonNode.execute(nativeResult);
        +            if (pythonResult == PNone.NO_VALUE) {
        +                if (state.getCurrentException() != null) {
        +                    throw clearCurrentExceptionNode.getCurrentExceptionForReraise(inliningTarget, state);
        +                } else {
        +                    throw TpIterNextBuiltin.iteratorExhausted();
        +                }
        +            }
        +            return pythonResult;
        +        }
        +
        +        @Specialization(replaces = "callCachedBuiltin")
        +        @InliningCutoff
        +        static Object callGenericBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotIterNextBuiltin slot, Object self,
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
        +            Object[] arguments = PArguments.create(1);
        +            PArguments.setArgument(arguments, 0, self);
        +            RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
        +            return invoke.execute(frame, inliningTarget, callTarget, arguments);
        +        }
        +    }
        +}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotLen.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotLen.java
        index faca264b47..33630a7d05 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotLen.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotLen.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -51,25 +51,20 @@
         import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper;
         import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming;
         import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode;
        -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyAsHandleNode;
         import com.oracle.graal.python.builtins.objects.function.PArguments;
         import com.oracle.graal.python.builtins.objects.ints.PInt;
        -import com.oracle.graal.python.builtins.objects.type.slots.HPyDispatchers.UnaryHPySlotDispatcherNode;
         import com.oracle.graal.python.builtins.objects.type.slots.PythonDispatchers.UnaryPythonSlotDispatcherNode;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltinBase;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotCExtNative;
        -import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotHPyNative;
        -import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotNative;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPythonSingle;
         import com.oracle.graal.python.lib.PyNumberAsSizeNode;
         import com.oracle.graal.python.lib.PyNumberIndexNode;
         import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PGuards;
         import com.oracle.graal.python.nodes.PRaiseNode;
        -import com.oracle.graal.python.nodes.PRaiseNode.Lazy;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
         import com.oracle.graal.python.nodes.util.CastToJavaIntLossyNode;
        -import com.oracle.graal.python.runtime.ExecutionContext.CallContext;
         import com.oracle.graal.python.runtime.PythonContext;
         import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
         import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
        @@ -85,11 +80,9 @@
         import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
        -import com.oracle.truffle.api.nodes.IndirectCallNode;
         import com.oracle.truffle.api.nodes.Node;
         import com.oracle.truffle.api.nodes.UnexpectedResultException;
         import com.oracle.truffle.api.profiles.InlinedBranchProfile;
        -import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         
         public abstract class TpSlotLen {
             private TpSlotLen() {
        @@ -134,7 +127,7 @@ protected TpSlotLenBuiltinComplex(NodeFactory nodeFactory) {
         
                 @Override
                 public final void initialize(PythonLanguage language) {
        -            RootCallTarget callTarget = createBuiltinCallTarget(language, SIGNATURE, getNodeFactory(), J___LEN__);
        +            RootCallTarget callTarget = createSlotCallTarget(language, SIGNATURE, getNodeFactory(), J___LEN__);
                     language.setBuiltinSlotCallTarget(callTargetIndex, callTarget);
                 }
             }
        @@ -175,7 +168,7 @@ static int callNative(VirtualFrame frame, Node inliningTarget, TpSlotCExtNative
                                 @Exclusive @Cached GetThreadStateNode getThreadStateNode,
                                 @Cached(inline = false) PythonToNativeNode toNativeNode,
                                 @Exclusive @Cached ExternalFunctionInvokeNode externalInvokeNode,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode,
        +                        @Exclusive @Cached PRaiseNode raiseNode,
                                 @Exclusive @Cached(inline = false) CheckPrimitiveFunctionResultNode checkResultNode) {
                     PythonContext ctx = PythonContext.get(inliningTarget);
                     PythonThreadState state = getThreadStateNode.execute(inliningTarget, ctx);
        @@ -187,26 +180,9 @@ static int callNative(VirtualFrame frame, Node inliningTarget, TpSlotCExtNative
                     return (int) l;
                 }
         
        -        @Specialization
        -        static int callNative(VirtualFrame frame, Node inliningTarget, TpSlotHPyNative slot, Object self,
        -                        @Exclusive @Cached GetThreadStateNode getThreadStateNode,
        -                        @Cached(inline = false) HPyAsHandleNode toNativeNode,
        -                        @Exclusive @Cached ExternalFunctionInvokeNode externalInvokeNode,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode,
        -                        @Exclusive @Cached(inline = false) CheckPrimitiveFunctionResultNode checkResultNode) {
        -            PythonContext ctx = PythonContext.get(inliningTarget);
        -            PythonThreadState state = getThreadStateNode.execute(inliningTarget, ctx);
        -            Object result = externalInvokeNode.call(frame, inliningTarget, state, C_API_TIMING, T___LEN__, slot.callable, ctx.getHPyContext().getBackend(), toNativeNode.execute(self));
        -            long l = checkResultNode.executeLong(state, T___LEN__, result);
        -            if (!PInt.isIntRange(l)) {
        -                raiseOverflow(inliningTarget, raiseNode, l);
        -            }
        -            return (int) l;
        -        }
        -
                 @InliningCutoff
        -        private static void raiseOverflow(Node inliningTarget, Lazy raiseNode, long l) {
        -            throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, l);
        +        private static void raiseOverflow(Node inliningTarget, PRaiseNode raiseNode, long l) {
        +            throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, l);
                 }
         
                 @Specialization(replaces = "callCachedBuiltin")
        @@ -217,30 +193,11 @@ static int callGenericSimpleBuiltin(TpSlotLenBuiltinSimple slot, Object self)
                 @Specialization(replaces = "callCachedBuiltin")
                 @InliningCutoff
                 static int callGenericComplexBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotLenBuiltinComplex slot, Object self,
        -                        @Cached(inline = false) CallContext callContext,
        -                        @Cached InlinedConditionProfile isNullFrameProfile,
        -                        @Cached(inline = false) IndirectCallNode indirectCallNode) {
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
                     Object[] arguments = PArguments.create(1);
                     PArguments.setArgument(arguments, 0, self);
        -            return (int) BuiltinDispatchers.callGenericBuiltin(frame, inliningTarget, slot.callTargetIndex, arguments, callContext, isNullFrameProfile, indirectCallNode);
        -        }
        -
        -        // @Specialization(guards = "slot.isHPySlot()")
        -        // @InliningCutoff
        -        @SuppressWarnings("unused")
        -        static int callHPy(VirtualFrame frame, Node inliningTarget, TpSlotNative slot, Object self,
        -                        @Cached GetThreadStateNode getThreadStateNode,
        -                        @Cached UnaryHPySlotDispatcherNode hpyDispatcher,
        -                        @Cached PRaiseNode.Lazy raiseNode,
        -                        @Cached(inline = false) CheckPrimitiveFunctionResultNode checkResultNode) {
        -            PythonContext ctx = PythonContext.get(inliningTarget);
        -            PythonThreadState state = getThreadStateNode.execute(inliningTarget, ctx);
        -            Object result = hpyDispatcher.execute(frame, inliningTarget, ctx, state, slot.callable, self);
        -            long l = checkResultNode.executeLong(state, T___LEN__, result);
        -            if (!PInt.isIntRange(l)) {
        -                raiseOverflow(inliningTarget, raiseNode, l);
        -            }
        -            return (int) l;
        +            RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
        +            return (int) invoke.execute(frame, inliningTarget, callTarget, arguments);
                 }
             }
         
        @@ -257,7 +214,7 @@ static int doIt(VirtualFrame frame, TpSlotPythonSingle slot, Object self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached UnaryPythonSlotDispatcherNode dispatcherNode,
                                 @Cached InlinedBranchProfile genericCheck,
        -                        @Cached PRaiseNode.Lazy raiseNode,
        +                        @Cached PRaiseNode raiseNode,
                                 @Cached PyNumberIndexNode indexNode,
                                 @Cached CastToJavaIntLossyNode castLossy,
                                 @Cached PyNumberAsSizeNode asSizeNode) {
        @@ -274,7 +231,7 @@ static int doIt(VirtualFrame frame, TpSlotPythonSingle slot, Object self,
                     return convertAndCheckLen(frame, inliningTarget, result, indexNode, castLossy, asSizeNode, raiseNode);
                 }
         
        -        static int checkLen(Node inliningTarget, PRaiseNode.Lazy raiseNode, int len) {
        +        static int checkLen(Node inliningTarget, PRaiseNode raiseNode, int len) {
                     if (len < 0) {
                         raiseLenGt0(inliningTarget, raiseNode);
                     }
        @@ -282,12 +239,12 @@ static int checkLen(Node inliningTarget, PRaiseNode.Lazy raiseNode, int len) {
                 }
         
                 @InliningCutoff
        -        private static void raiseLenGt0(Node inliningTarget, Lazy raiseNode) {
        -            throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.LEN_SHOULD_RETURN_GT_ZERO);
        +        private static void raiseLenGt0(Node inliningTarget, PRaiseNode raiseNode) {
        +            throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.LEN_SHOULD_RETURN_GT_ZERO);
                 }
         
                 public static int convertAndCheckLen(VirtualFrame frame, Node inliningTarget, Object result, PyNumberIndexNode indexNode,
        -                        CastToJavaIntLossyNode castLossy, PyNumberAsSizeNode asSizeNode, PRaiseNode.Lazy raiseNode) {
        +                        CastToJavaIntLossyNode castLossy, PyNumberAsSizeNode asSizeNode, PRaiseNode raiseNode) {
                     int len;
                     Object index = indexNode.execute(frame, inliningTarget, result);
                     try {
        @@ -305,7 +262,7 @@ public static int convertAndCheckLen(VirtualFrame frame, Node inliningTarget, Ob
                 }
         
                 @InliningCutoff
        -        private static PException checkNegative(Node inliningTarget, CastToJavaIntLossyNode castLossy, Lazy raiseNode, PException e, Object index) {
        +        private static PException checkNegative(Node inliningTarget, CastToJavaIntLossyNode castLossy, PRaiseNode raiseNode, PException e, Object index) {
                     int len;
                     len = castLossy.execute(inliningTarget, index);
                     checkLen(inliningTarget, raiseNode, len);
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotMpAssSubscript.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotMpAssSubscript.java
        new file mode 100644
        index 0000000000..487d1264bb
        --- /dev/null
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotMpAssSubscript.java
        @@ -0,0 +1,276 @@
        +/*
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
        + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        + *
        + * The Universal Permissive License (UPL), Version 1.0
        + *
        + * Subject to the condition set forth below, permission is hereby granted to any
        + * person obtaining a copy of this software, associated documentation and/or
        + * data (collectively the "Software"), free of charge and under any and all
        + * copyright rights in the Software, and any and all patent rights owned or
        + * freely licensable by each licensor hereunder covering either (i) the
        + * unmodified Software as contributed to or provided by such licensor, or (ii)
        + * the Larger Works (as defined below), to deal in both
        + *
        + * (a) the Software, and
        + *
        + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
        + * one is included with the Software each a "Larger Work" to which the Software
        + * is contributed by such licensors),
        + *
        + * without restriction, including without limitation the rights to copy, create
        + * derivative works of, display, perform, and distribute the Software and make,
        + * use, sell, offer for sale, import, export, have made, and have sold the
        + * Software and the Larger Work(s), and to sublicense the foregoing rights on
        + * either these or other terms.
        + *
        + * This license is subject to the following condition:
        + *
        + * The above copyright notice and either this complete permission notice or at a
        + * minimum a reference to the UPL must be included in all copies or substantial
        + * portions of the Software.
        + *
        + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        + * SOFTWARE.
        + */
        +package com.oracle.graal.python.builtins.objects.type.slots;
        +
        +import static com.oracle.graal.python.builtins.objects.type.slots.BuiltinSlotWrapperSignature.J_DOLLAR_SELF;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETITEM__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DELITEM__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETITEM__;
        +
        +import java.util.Objects;
        +
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.builtins.Python3Core;
        +import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        +import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.CheckInquiryResultNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionInvokeNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode;
        +import com.oracle.graal.python.builtins.objects.function.PArguments;
        +import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
        +import com.oracle.graal.python.builtins.objects.type.slots.PythonDispatchers.BinaryPythonSlotDispatcherNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.PythonDispatchers.TernaryPythonSlotDispatcherNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltinBase;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotManaged;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotNative;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPython;
        +import com.oracle.graal.python.nodes.PGuards;
        +import com.oracle.graal.python.nodes.PRaiseNode;
        +import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
        +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
        +import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
        +import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
        +import com.oracle.graal.python.runtime.exception.PException;
        +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
        +import com.oracle.truffle.api.RootCallTarget;
        +import com.oracle.truffle.api.dsl.Bind;
        +import com.oracle.truffle.api.dsl.Cached;
        +import com.oracle.truffle.api.dsl.Cached.Exclusive;
        +import com.oracle.truffle.api.dsl.GenerateCached;
        +import com.oracle.truffle.api.dsl.GenerateInline;
        +import com.oracle.truffle.api.dsl.GenerateUncached;
        +import com.oracle.truffle.api.dsl.ImportStatic;
        +import com.oracle.truffle.api.dsl.NodeFactory;
        +import com.oracle.truffle.api.dsl.Specialization;
        +import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.strings.TruffleString;
        +import com.oracle.truffle.api.utilities.TruffleWeakReference;
        +
        +public final class TpSlotMpAssSubscript {
        +    private TpSlotMpAssSubscript() {
        +    }
        +
        +    public abstract static class TpSlotMpAssSubscriptBuiltin extends TpSlotBuiltinBase {
        +        public static final BuiltinSlotWrapperSignature SET_SIGNATURE = BuiltinSlotWrapperSignature.of(J_DOLLAR_SELF, "key", "value");
        +        private final int callTargetIndex = TpSlotBuiltinCallTargetRegistry.getNextCallTargetIndex();
        +
        +        protected TpSlotMpAssSubscriptBuiltin(NodeFactory nodeFactory) {
        +            super(nodeFactory, BuiltinSlotWrapperSignature.BINARY, PExternalFunctionWrapper.BINARYFUNC);
        +        }
        +
        +        final MpAssSubscriptBuiltinNode createSlotNode() {
        +            return createNode();
        +        }
        +
        +        @Override
        +        public void initialize(PythonLanguage language) {
        +            RootCallTarget target = createSlotCallTarget(language, SET_SIGNATURE, getNodeFactory(), J___SETITEM__);
        +            language.setBuiltinSlotCallTarget(callTargetIndex, target);
        +        }
        +
        +        @Override
        +        public PBuiltinFunction createBuiltin(Python3Core core, Object type, TruffleString tsName, PExternalFunctionWrapper wrapper) {
        +            return switch (wrapper) {
        +                case OBJOBJARGPROC -> createBuiltin(core, type, T___SETITEM__, SET_SIGNATURE, wrapper, getNodeFactory());
        +                case MP_DELITEM -> createBuiltin(core, type, T___DELITEM__, BuiltinSlotWrapperSignature.BINARY, wrapper,
        +                                NodeFactoryUtils.BinaryToTernaryBuiltinNode.wrapFactory(getNodeFactory()));
        +                default ->
        +                    throw new IllegalStateException(Objects.toString(wrapper));
        +            };
        +        }
        +    }
        +
        +    @GenerateInline(value = false, inherit = true)
        +    public abstract static class MpAssSubscriptBuiltinNode extends PythonTernaryBuiltinNode {
        +        public abstract void executeVoid(VirtualFrame frame, Object self, Object key, Object value);
        +
        +        @Override
        +        public final Object execute(VirtualFrame frame, Object self, Object key, Object value) {
        +            executeVoid(frame, self, key, value);
        +            return PNone.NONE;
        +        }
        +    }
        +
        +    public static final class TpSlotMpAssSubscriptPython extends TpSlotPython {
        +        private final TruffleWeakReference setitem;
        +        private final TruffleWeakReference delitem;
        +        private final TruffleWeakReference type;
        +
        +        public TpSlotMpAssSubscriptPython(Object setitem, Object delitem, Object type) {
        +            this.setitem = asWeakRef(setitem);
        +            this.delitem = asWeakRef(delitem);
        +            this.type = new TruffleWeakReference<>(type);
        +        }
        +
        +        public static TpSlotMpAssSubscriptPython create(Object[] callables, TruffleString[] callableNames, Object type) {
        +            assert callables.length == 2;
        +            assert callableNames == null || (callableNames[0].equals(T___SETITEM__) && callableNames[1].equals(T___DELITEM__));
        +            return new TpSlotMpAssSubscriptPython(callables[0], callables[1], type);
        +        }
        +
        +        @Override
        +        public TpSlotPython forNewType(Object klass) {
        +            Object newSet = LookupAttributeInMRONode.Dynamic.getUncached().execute(klass, T___SETITEM__);
        +            Object newDel = LookupAttributeInMRONode.Dynamic.getUncached().execute(klass, T___DELITEM__);
        +            if (newSet != getSetitem() || newDel != getDelitem()) {
        +                return new TpSlotMpAssSubscriptPython(newSet, newDel, getType());
        +            }
        +            return this;
        +        }
        +
        +        public Object getSetitem() {
        +            return safeGet(setitem);
        +        }
        +
        +        public Object getDelitem() {
        +            return safeGet(delitem);
        +        }
        +
        +        public Object getType() {
        +            return safeGet(type);
        +        }
        +    }
        +
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @GenerateUncached
        +    public abstract static class CallSlotMpAssSubscriptNode extends Node {
        +        public abstract void execute(VirtualFrame frame, Node inliningTarget, TpSlot slot, Object self, Object key, Object value);
        +
        +        @Specialization
        +        static void callManagedSlot(VirtualFrame frame, Node inliningTarget, TpSlotManaged slot, Object self, Object key, Object value,
        +                        @Cached CallManagedSlotMpAssSubscriptNode slotNode) {
        +            slotNode.execute(frame, inliningTarget, slot, self, key, value);
        +        }
        +
        +        @Specialization
        +        @InliningCutoff
        +        static void callNative(VirtualFrame frame, TpSlotNative slot, Object self, Object key, Object value,
        +                        @Cached(inline = false) CallNativeSlotMpAssSubscriptNode callNativeSlot) {
        +            callNativeSlot.execute(frame, slot, self, key, value);
        +        }
        +    }
        +
        +    @GenerateInline(false) // Used lazily
        +    @GenerateUncached
        +    abstract static class CallNativeSlotMpAssSubscriptNode extends Node {
        +        private static final CApiTiming C_API_TIMING = CApiTiming.create(true, "sq_ass_item");
        +
        +        abstract void execute(VirtualFrame frame, TpSlotNative slot, Object self, Object key, Object value);
        +
        +        @Specialization
        +        static void callNative(VirtualFrame frame, TpSlotNative slot, Object self, Object key, Object value,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached GetThreadStateNode getThreadStateNode,
        +                        @Cached PythonToNativeNode selfToNativeNode,
        +                        @Cached PythonToNativeNode keyToNativeNode,
        +                        @Cached PythonToNativeNode valueToNativeNode,
        +                        @Cached ExternalFunctionInvokeNode externalInvokeNode,
        +                        @Cached CheckInquiryResultNode checkResultNode) {
        +            Object result;
        +            PythonThreadState threadState = getThreadStateNode.execute(inliningTarget);
        +            result = externalInvokeNode.call(frame, inliningTarget, threadState, C_API_TIMING, T___SETITEM__, slot.callable,
        +                            selfToNativeNode.execute(self), keyToNativeNode.execute(key), valueToNativeNode.execute(value));
        +            checkResultNode.execute(threadState, T___SETITEM__, result);
        +        }
        +    }
        +
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @GenerateUncached
        +    @ImportStatic(PGuards.class)
        +    @SuppressWarnings("rawtypes")
        +    public abstract static class CallManagedSlotMpAssSubscriptNode extends Node {
        +
        +        public abstract void execute(VirtualFrame frame, Node inliningTarget, TpSlotManaged slot, Object self, Object key, Object value);
        +
        +        @Specialization(guards = "slot == cachedSlot", limit = "3")
        +        static void callCachedBuiltin(VirtualFrame frame, @SuppressWarnings("unused") TpSlotMpAssSubscriptBuiltin slot, Object self, Object key, Object value,
        +                        @SuppressWarnings("unused") @Cached("slot") TpSlotMpAssSubscriptBuiltin cachedSlot,
        +                        @Cached("cachedSlot.createSlotNode()") MpAssSubscriptBuiltinNode slotNode) {
        +            slotNode.executeVoid(frame, self, key, value);
        +        }
        +
        +        @Specialization(guards = "!isNoValue(value)")
        +        static void callPythonSimpleSet(VirtualFrame frame, Node inliningTarget, TpSlotMpAssSubscriptPython slot, Object self, Object key, Object value,
        +                        @Exclusive @Cached PRaiseNode raiseNode,
        +                        @Cached TernaryPythonSlotDispatcherNode callPythonFun) {
        +            Object callable = slot.getSetitem();
        +            if (callable == null) {
        +                throw raiseAttributeError(inliningTarget, raiseNode, T___SETITEM__);
        +            }
        +            callPythonFun.execute(frame, inliningTarget, callable, slot.getType(), self, key, value);
        +        }
        +
        +        @Specialization(guards = "isNoValue(value)")
        +        @InliningCutoff
        +        static void callPythonSimpleDel(VirtualFrame frame, Node inliningTarget, TpSlotMpAssSubscriptPython slot, Object self, Object key, @SuppressWarnings("unused") Object value,
        +                        @Exclusive @Cached PRaiseNode raiseNode,
        +                        @Cached BinaryPythonSlotDispatcherNode callPythonFun) {
        +            Object callable = slot.getDelitem();
        +            if (callable == null) {
        +                throw raiseAttributeError(inliningTarget, raiseNode, T___DELITEM__);
        +            }
        +            callPythonFun.execute(frame, inliningTarget, callable, slot.getType(), self, key);
        +        }
        +
        +        @InliningCutoff
        +        private static PException raiseAttributeError(Node inliningTarget, PRaiseNode raiseNode, TruffleString attrName) {
        +            return raiseNode.raise(inliningTarget, PythonBuiltinClassType.AttributeError, attrName);
        +        }
        +
        +        @Specialization(replaces = "callCachedBuiltin")
        +        @InliningCutoff
        +        static void callGenericBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotMpAssSubscriptBuiltin slot, Object self, Object key, Object value,
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
        +            Object[] arguments = PArguments.create(3);
        +            PArguments.setArgument(arguments, 0, self);
        +            PArguments.setArgument(arguments, 1, key);
        +            PArguments.setArgument(arguments, 2, value);
        +            RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
        +            invoke.execute(frame, inliningTarget, callTarget, arguments);
        +        }
        +    }
        +}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotNbPower.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotNbPower.java
        new file mode 100644
        index 0000000000..0abdde3f10
        --- /dev/null
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotNbPower.java
        @@ -0,0 +1,264 @@
        +/*
        + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
        + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        + *
        + * The Universal Permissive License (UPL), Version 1.0
        + *
        + * Subject to the condition set forth below, permission is hereby granted to any
        + * person obtaining a copy of this software, associated documentation and/or
        + * data (collectively the "Software"), free of charge and under any and all
        + * copyright rights in the Software, and any and all patent rights owned or
        + * freely licensable by each licensor hereunder covering either (i) the
        + * unmodified Software as contributed to or provided by such licensor, or (ii)
        + * the Larger Works (as defined below), to deal in both
        + *
        + * (a) the Software, and
        + *
        + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
        + * one is included with the Software each a "Larger Work" to which the Software
        + * is contributed by such licensors),
        + *
        + * without restriction, including without limitation the rights to copy, create
        + * derivative works of, display, perform, and distribute the Software and make,
        + * use, sell, offer for sale, import, export, have made, and have sold the
        + * Software and the Larger Work(s), and to sublicense the foregoing rights on
        + * either these or other terms.
        + *
        + * This license is subject to the following condition:
        + *
        + * The above copyright notice and either this complete permission notice or at a
        + * minimum a reference to the UPL must be included in all copies or substantial
        + * portions of the Software.
        + *
        + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        + * SOFTWARE.
        + */
        +package com.oracle.graal.python.builtins.objects.type.slots;
        +
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___POW__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IPOW__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___POW__;
        +
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.builtins.Python3Core;
        +import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.PNotImplemented;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionInvokeNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PyObjectCheckFunctionResultNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.NativeToPythonTransferNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode;
        +import com.oracle.graal.python.builtins.objects.function.PArguments;
        +import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.NodeFactoryUtils.WrapperNodeFactory;
        +import com.oracle.graal.python.builtins.objects.type.slots.PythonDispatchers.BinaryPythonSlotDispatcherNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.PythonDispatchers.TernaryPythonSlotDispatcherNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltin;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotCExtNative;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPythonSingle;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.CallReversiblePythonSlotNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.ReversibleSlot;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.TpSlotReversiblePython;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
        +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
        +import com.oracle.graal.python.runtime.PythonContext;
        +import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
        +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
        +import com.oracle.truffle.api.RootCallTarget;
        +import com.oracle.truffle.api.dsl.Bind;
        +import com.oracle.truffle.api.dsl.Cached;
        +import com.oracle.truffle.api.dsl.Fallback;
        +import com.oracle.truffle.api.dsl.GenerateCached;
        +import com.oracle.truffle.api.dsl.GenerateInline;
        +import com.oracle.truffle.api.dsl.GenerateUncached;
        +import com.oracle.truffle.api.dsl.NodeFactory;
        +import com.oracle.truffle.api.dsl.Specialization;
        +import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.profiles.InlinedBranchProfile;
        +import com.oracle.truffle.api.strings.TruffleString;
        +
        +public final class TpSlotNbPower {
        +    private TpSlotNbPower() {
        +    }
        +
        +    public abstract static class TpSlotNbPowerBuiltin extends TpSlotBuiltin {
        +        private final int callTargetIndex = TpSlotBuiltinCallTargetRegistry.getNextCallTargetIndex();
        +
        +        private static final BuiltinSlotWrapperSignature SIGNATURE = BuiltinSlotWrapperSignature.of(2, "v", "w", "z");
        +
        +        protected TpSlotNbPowerBuiltin(NodeFactory nodeFactory) {
        +            super(nodeFactory);
        +        }
        +
        +        final PythonTernaryBuiltinNode createOpSlotNode() {
        +            return createNode();
        +        }
        +
        +        @Override
        +        public void initialize(PythonLanguage language) {
        +            RootCallTarget callTarget = createSlotCallTarget(language, SIGNATURE, getNodeFactory(), J___POW__);
        +            language.setBuiltinSlotCallTarget(callTargetIndex, callTarget);
        +        }
        +
        +        @Override
        +        public PBuiltinFunction createBuiltin(Python3Core core, Object type, TruffleString tsName, PExternalFunctionWrapper wrapper) {
        +            return switch (wrapper) {
        +                case TERNARYFUNC -> createBuiltin(core, type, tsName, SIGNATURE, wrapper, getNodeFactory());
        +                case TERNARYFUNC_R -> createRBuiltin(core, type, tsName);
        +                default -> null;
        +            };
        +        }
        +
        +        private PBuiltinFunction createRBuiltin(Python3Core core, Object type, TruffleString tsName) {
        +            var factory = WrapperNodeFactory.wrap(getNodeFactory(), SwapArgumentsNode.class, SwapArgumentsNode::new);
        +            return createBuiltin(core, type, tsName, SIGNATURE, PExternalFunctionWrapper.TERNARYFUNC_R, factory);
        +        }
        +    }
        +
        +    static final class SwapArgumentsNode extends PythonTernaryBuiltinNode {
        +        @Child private PythonTernaryBuiltinNode wrapped;
        +
        +        SwapArgumentsNode(PythonTernaryBuiltinNode wrapped) {
        +            this.wrapped = wrapped;
        +        }
        +
        +        @Override
        +        public Object execute(VirtualFrame frame, Object self, Object w, Object z) {
        +            return wrapped.execute(frame, w, self, z);
        +        }
        +    }
        +
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @GenerateUncached
        +    public abstract static class CallSlotNbPowerNode extends Node {
        +        private static final CApiTiming C_API_TIMING = CApiTiming.create(true, "ternaryfunc");
        +
        +        public abstract Object execute(VirtualFrame frame, Node inliningTarget, TpSlot slot,
        +                        Object v, Object vType, Object w, TpSlot wSlot, Object wType, Object z, boolean sameTypes);
        +
        +        @SuppressWarnings("unused")
        +        @Specialization(guards = "cachedSlot == slot", limit = "3")
        +        static Object callCachedBuiltin(VirtualFrame frame, TpSlotNbPowerBuiltin slot,
        +                        Object v, Object vType, Object w, TpSlot wSlot, Object wType, Object z, boolean sameTypes,
        +                        @Cached("slot") TpSlotNbPowerBuiltin cachedSlot,
        +                        @Cached("cachedSlot.createOpSlotNode()") PythonTernaryBuiltinNode slotNode) {
        +            return slotNode.execute(frame, v, w, z);
        +        }
        +
        +        @Specialization
        +        static Object callPython(VirtualFrame frame, TpSlotReversiblePython slot,
        +                        Object v, Object vType, Object w, TpSlot wSlot, Object wType, Object z, boolean sameTypes,
        +                        @Cached(inline = false) CallNbPowerPythonNode callPython) {
        +            return callPython.execute(frame, slot, v, vType, w, wSlot, wType, z, sameTypes);
        +        }
        +
        +        @SuppressWarnings("unused")
        +        @Specialization
        +        static Object callNative(VirtualFrame frame, Node inliningTarget, TpSlotCExtNative slot,
        +                        Object v, Object vType, Object w, TpSlot wSlot, Object wType, Object z, boolean sameTypes,
        +                        @Cached GetThreadStateNode getThreadStateNode,
        +                        @Cached(inline = false) PythonToNativeNode vToNative,
        +                        @Cached(inline = false) PythonToNativeNode wToNative,
        +                        @Cached(inline = false) PythonToNativeNode zToNative,
        +                        @Cached ExternalFunctionInvokeNode externalInvokeNode,
        +                        @Cached(inline = false) NativeToPythonTransferNode toPythonNode,
        +                        @Cached(inline = false) PyObjectCheckFunctionResultNode checkResultNode) {
        +            PythonContext ctx = PythonContext.get(inliningTarget);
        +            PythonContext.PythonThreadState state = getThreadStateNode.execute(inliningTarget, ctx);
        +            Object result = externalInvokeNode.call(frame, inliningTarget, state, C_API_TIMING, T___POW__, slot.callable,
        +                            vToNative.execute(v), wToNative.execute(w), zToNative.execute(z));
        +            return checkResultNode.execute(state, T___POW__, toPythonNode.execute(result));
        +        }
        +
        +        @SuppressWarnings("unused")
        +        @Specialization(replaces = "callCachedBuiltin")
        +        @InliningCutoff
        +        static Object callGenericComplexBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotNbPowerBuiltin slot,
        +                        Object v, Object vType, Object w, TpSlot wSlot, Object wType, Object z, boolean sameTypes,
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
        +            Object[] arguments = PArguments.create(3);
        +            PArguments.setArgument(arguments, 0, v);
        +            PArguments.setArgument(arguments, 1, w);
        +            PArguments.setArgument(arguments, 2, z);
        +            RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
        +            return invoke.execute(frame, inliningTarget, callTarget, arguments);
        +        }
        +    }
        +
        +    @GenerateUncached
        +    @GenerateInline(false) // intentional explicit "data-class"
        +    abstract static class CallNbPowerPythonNode extends Node {
        +        public abstract Object execute(VirtualFrame frame, TpSlotReversiblePython slot, Object v, Object vType, Object w, TpSlot wSlot, Object wType, Object z, boolean sameTypes);
        +
        +        @Specialization
        +        static Object callPythonAsBinary(VirtualFrame frame, TpSlotReversiblePython slot,
        +                        Object v, Object vType, Object w, TpSlot wSlot, Object wType, @SuppressWarnings("unused") PNone z, boolean sameTypes,
        +                        @Cached CallReversiblePythonSlotNode callPython) {
        +            return callPython.execute(frame, slot, v, vType, w, wSlot, wType, sameTypes, ReversibleSlot.NB_POWER_BINARY);
        +        }
        +
        +        @Fallback
        +        @SuppressWarnings("unused")
        +        static Object callPythonAsTernary(VirtualFrame frame, TpSlotReversiblePython slot,
        +                        Object v, Object vType, Object w, TpSlot wSlot, Object wType, Object z, boolean sameTypes,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached GetCachedTpSlotsNode getSelfSlotsNode,
        +                        @Cached TernaryPythonSlotDispatcherNode dispatcherNode,
        +                        @Cached InlinedBranchProfile notImplementedProfile) {
        +            /*
        +             * Three-arg power doesn't use __rpow__. But ternary_op can call this when the second
        +             * argument's type uses slot_nb_power, so check before calling self.__pow__.
        +             */
        +            TpSlots selfSlots = getSelfSlotsNode.execute(inliningTarget, vType);
        +            if (CallReversiblePythonSlotNode.isSameReversibleWrapper(selfSlots.nb_power(), ReversibleSlot.NB_POWER_BINARY)) {
        +                return dispatcherNode.execute(frame, inliningTarget, slot.getLeft(), slot.getType(), v, w, z);
        +            }
        +            notImplementedProfile.enter(inliningTarget);
        +            return PNotImplemented.NOT_IMPLEMENTED;
        +        }
        +    }
        +
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @GenerateUncached
        +    public abstract static class CallSlotNbInPlacePowerNode extends Node {
        +        private static final CApiTiming C_API_TIMING = CApiTiming.create(true, "ternaryfunc");
        +
        +        public abstract Object execute(VirtualFrame frame, Node inliningTarget, TpSlot slot, Object v, Object w, Object z);
        +
        +        // There are no builtin implementations
        +
        +        @Specialization
        +        static Object callPython(VirtualFrame frame, Node inliningTarget, TpSlotPythonSingle slot, Object v, Object w, @SuppressWarnings("unused") Object z,
        +                        @Cached BinaryPythonSlotDispatcherNode dispatcherNode) {
        +            // CPython doesn't pass the third argument to __ipow__
        +            return dispatcherNode.execute(frame, inliningTarget, slot.getCallable(), slot.getType(), v, w);
        +        }
        +
        +        @Specialization
        +        static Object callNative(VirtualFrame frame, Node inliningTarget, TpSlotCExtNative slot, Object v, Object w, Object z,
        +                        @Cached GetThreadStateNode getThreadStateNode,
        +                        @Cached(inline = false) PythonToNativeNode vToNative,
        +                        @Cached(inline = false) PythonToNativeNode wToNative,
        +                        @Cached(inline = false) PythonToNativeNode zToNative,
        +                        @Cached ExternalFunctionInvokeNode externalInvokeNode,
        +                        @Cached(inline = false) NativeToPythonTransferNode toPythonNode,
        +                        @Cached(inline = false) PyObjectCheckFunctionResultNode checkResultNode) {
        +            PythonContext ctx = PythonContext.get(inliningTarget);
        +            PythonContext.PythonThreadState state = getThreadStateNode.execute(inliningTarget, ctx);
        +            Object result = externalInvokeNode.call(frame, inliningTarget, state, C_API_TIMING, T___IPOW__, slot.callable,
        +                            vToNative.execute(v), wToNative.execute(w), zToNative.execute(z));
        +            return checkResultNode.execute(state, T___IPOW__, toPythonNode.execute(result));
        +        }
        +    }
        +}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotRepr.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotRepr.java
        new file mode 100644
        index 0000000000..f4a87474a9
        --- /dev/null
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotRepr.java
        @@ -0,0 +1,191 @@
        +/*
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
        + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        + *
        + * The Universal Permissive License (UPL), Version 1.0
        + *
        + * Subject to the condition set forth below, permission is hereby granted to any
        + * person obtaining a copy of this software, associated documentation and/or
        + * data (collectively the "Software"), free of charge and under any and all
        + * copyright rights in the Software, and any and all patent rights owned or
        + * freely licensable by each licensor hereunder covering either (i) the
        + * unmodified Software as contributed to or provided by such licensor, or (ii)
        + * the Larger Works (as defined below), to deal in both
        + *
        + * (a) the Software, and
        + *
        + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
        + * one is included with the Software each a "Larger Work" to which the Software
        + * is contributed by such licensors),
        + *
        + * without restriction, including without limitation the rights to copy, create
        + * derivative works of, display, perform, and distribute the Software and make,
        + * use, sell, offer for sale, import, export, have made, and have sold the
        + * Software and the Larger Work(s), and to sublicense the foregoing rights on
        + * either these or other terms.
        + *
        + * This license is subject to the following condition:
        + *
        + * The above copyright notice and either this complete permission notice or at a
        + * minimum a reference to the UPL must be included in all copies or substantial
        + * portions of the Software.
        + *
        + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        + * SOFTWARE.
        + */
        +package com.oracle.graal.python.builtins.objects.type.slots;
        +
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REPR__;
        +
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionInvokeNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PyObjectCheckFunctionResultNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.NativeToPythonTransferNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode;
        +import com.oracle.graal.python.builtins.objects.function.PArguments;
        +import com.oracle.graal.python.builtins.objects.function.PFunction;
        +import com.oracle.graal.python.builtins.objects.object.ObjectNodes;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotCExtNative;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPythonSingle;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotUnaryFunc.TpSlotUnaryFuncBuiltin;
        +import com.oracle.graal.python.nodes.call.BoundDescriptor;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
        +import com.oracle.graal.python.nodes.call.CallNode;
        +import com.oracle.graal.python.nodes.call.special.MaybeBindDescriptorNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
        +import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
        +import com.oracle.graal.python.util.PythonUtils;
        +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
        +import com.oracle.truffle.api.RootCallTarget;
        +import com.oracle.truffle.api.dsl.Bind;
        +import com.oracle.truffle.api.dsl.Cached;
        +import com.oracle.truffle.api.dsl.GenerateCached;
        +import com.oracle.truffle.api.dsl.GenerateInline;
        +import com.oracle.truffle.api.dsl.GenerateUncached;
        +import com.oracle.truffle.api.dsl.ImportStatic;
        +import com.oracle.truffle.api.dsl.Specialization;
        +import com.oracle.truffle.api.exception.AbstractTruffleException;
        +import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.nodes.DirectCallNode;
        +import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.utilities.TruffleWeakReference;
        +
        +public final class TpSlotRepr {
        +    private TpSlotRepr() {
        +    }
        +
        +    // The only difference from CallSlotUnaryNode is the fallback for failed descriptor bind
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @GenerateUncached
        +    public abstract static class CallSlotReprNode extends Node {
        +        private static final CApiTiming C_API_TIMING = CApiTiming.create(true, "repr");
        +
        +        public abstract Object execute(VirtualFrame frame, Node inliningTarget, TpSlot slot, Object self);
        +
        +        @Specialization(guards = "cachedSlot == slot", limit = "3")
        +        static Object callCachedBuiltin(VirtualFrame frame, @SuppressWarnings("unused") TpSlotUnaryFuncBuiltin slot, Object self,
        +                        @SuppressWarnings("unused") @Cached("slot") TpSlotUnaryFuncBuiltin cachedSlot,
        +                        @Cached("cachedSlot.createSlotNode()") PythonUnaryBuiltinNode slotNode) {
        +            return slotNode.execute(frame, self);
        +        }
        +
        +        @Specialization
        +        static Object callPython(VirtualFrame frame, TpSlotPythonSingle slot, Object self,
        +                        @Cached(inline = false) CallSlotReprPythonNode callSlotNode) {
        +            return callSlotNode.execute(frame, slot, self);
        +        }
        +
        +        @Specialization
        +        static Object callNative(VirtualFrame frame, Node inliningTarget, TpSlotCExtNative slot, Object self,
        +                        @Cached GetThreadStateNode getThreadStateNode,
        +                        @Cached(inline = false) PythonToNativeNode toNativeNode,
        +                        @Cached ExternalFunctionInvokeNode externalInvokeNode,
        +                        @Cached(inline = false) NativeToPythonTransferNode toPythonNode,
        +                        @Cached(inline = false) PyObjectCheckFunctionResultNode checkResultNode) {
        +            PythonThreadState state = getThreadStateNode.execute(inliningTarget);
        +            Object result = externalInvokeNode.call(frame, inliningTarget, state, C_API_TIMING, T___REPR__, slot.callable,
        +                            toNativeNode.execute(self));
        +            return checkResultNode.execute(state, T___REPR__, toPythonNode.execute(result));
        +        }
        +
        +        @Specialization(replaces = "callCachedBuiltin")
        +        @InliningCutoff
        +        static Object callGenericBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotUnaryFuncBuiltin slot, Object self,
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
        +            Object[] arguments = PArguments.create(1);
        +            PArguments.setArgument(arguments, 0, self);
        +            RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
        +            return invoke.execute(frame, inliningTarget, callTarget, arguments);
        +        }
        +    }
        +
        +    @GenerateUncached
        +    @GenerateInline(false) // intentionally lazy
        +    abstract static class CallSlotReprPythonNode extends Node {
        +        abstract Object execute(VirtualFrame frame, TpSlotPythonSingle slot, Object obj);
        +
        +        @Specialization
        +        static Object doIt(VirtualFrame frame, TpSlotPythonSingle slot, Object self,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached ReprPythonSlotDispatcherNode dispatcherNode) {
        +            return dispatcherNode.execute(frame, inliningTarget, slot.getCallable(), slot.getType(), self);
        +        }
        +    }
        +
        +    @GenerateUncached
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @ImportStatic(CallDispatchers.class)
        +    abstract static class ReprPythonSlotDispatcherNode extends PythonDispatchers.PythonSlotDispatcherNodeBase {
        +        final Object execute(VirtualFrame frame, Node inliningTarget, Object callable, Object type, Object self) {
        +            assert !(callable instanceof TruffleWeakReference);
        +            assert !(type instanceof TruffleWeakReference);
        +            return executeImpl(frame, inliningTarget, callable, type, self);
        +        }
        +
        +        abstract Object executeImpl(VirtualFrame frame, Node inliningTarget, Object callable, Object type, Object self);
        +
        +        @Specialization(guards = {"isSingleContext()", "callee == cachedCallee", "isSimpleSignature(cachedCallee, 1)"}, //
        +                        limit = "getCallSiteInlineCacheMaxDepth()", assumptions = "cachedCallee.getCodeStableAssumption()")
        +        protected static Object doCachedPFunction(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") PFunction callee, @SuppressWarnings("unused") Object type, Object self,
        +                        @SuppressWarnings("unused") @Cached("callee") PFunction cachedCallee,
        +                        @Cached("createDirectCallNodeFor(callee)") DirectCallNode callNode,
        +                        @Cached CallDispatchers.FunctionDirectInvokeNode invoke) {
        +            Object[] arguments = PArguments.create(1);
        +            PArguments.setArgument(arguments, 0, self);
        +            return invoke.execute(frame, inliningTarget, callNode, cachedCallee, arguments);
        +        }
        +
        +        @Specialization(replaces = "doCachedPFunction")
        +        @InliningCutoff
        +        static Object doGeneric(VirtualFrame frame, Node inliningTarget, Object callableObj, Object type, Object self,
        +                        @Cached MaybeBindDescriptorNode bindDescriptorNode,
        +                        @Cached(inline = false) CallNode callNode,
        +                        @Cached(inline = false) ObjectNodes.DefaultObjectReprNode defaultRepr) {
        +            Object bound;
        +            try {
        +                bound = bindDescriptorNode.execute(frame, inliningTarget, callableObj, self, type);
        +            } catch (AbstractTruffleException e) {
        +                return defaultRepr.executeCached(frame, self);
        +            }
        +            Object[] arguments;
        +            Object callable;
        +            if (bound instanceof BoundDescriptor boundDescr) {
        +                callable = boundDescr.descriptor;
        +                arguments = PythonUtils.EMPTY_OBJECT_ARRAY;
        +            } else {
        +                callable = bound;
        +                arguments = new Object[]{self};
        +            }
        +            return callNode.execute(frame, callable, arguments);
        +        }
        +    }
        +}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotRichCompare.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotRichCompare.java
        new file mode 100644
        index 0000000000..6b05f997b9
        --- /dev/null
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotRichCompare.java
        @@ -0,0 +1,274 @@
        +/*
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
        + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        + *
        + * The Universal Permissive License (UPL), Version 1.0
        + *
        + * Subject to the condition set forth below, permission is hereby granted to any
        + * person obtaining a copy of this software, associated documentation and/or
        + * data (collectively the "Software"), free of charge and under any and all
        + * copyright rights in the Software, and any and all patent rights owned or
        + * freely licensable by each licensor hereunder covering either (i) the
        + * unmodified Software as contributed to or provided by such licensor, or (ii)
        + * the Larger Works (as defined below), to deal in both
        + *
        + * (a) the Software, and
        + *
        + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
        + * one is included with the Software each a "Larger Work" to which the Software
        + * is contributed by such licensors),
        + *
        + * without restriction, including without limitation the rights to copy, create
        + * derivative works of, display, perform, and distribute the Software and make,
        + * use, sell, offer for sale, import, export, have made, and have sold the
        + * Software and the Larger Work(s), and to sublicense the foregoing rights on
        + * either these or other terms.
        + *
        + * This license is subject to the following condition:
        + *
        + * The above copyright notice and either this complete permission notice or at a
        + * minimum a reference to the UPL must be included in all copies or substantial
        + * portions of the Software.
        + *
        + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        + * SOFTWARE.
        + */
        +package com.oracle.graal.python.builtins.objects.type.slots;
        +
        +import static com.oracle.graal.python.builtins.objects.type.slots.BuiltinSlotWrapperSignature.J_DOLLAR_SELF;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.J_TP_RICHCOMPARE;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T_TP_RICHCOMPARE;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___HASH__;
        +import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
        +
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.builtins.Python3Core;
        +import com.oracle.graal.python.builtins.objects.PNotImplemented;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionInvokeNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PyObjectCheckFunctionResultNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.NativeToPythonTransferNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode;
        +import com.oracle.graal.python.builtins.objects.function.PArguments;
        +import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
        +import com.oracle.graal.python.builtins.objects.type.slots.NodeFactoryUtils.WrapperNodeFactory;
        +import com.oracle.graal.python.builtins.objects.type.slots.PythonDispatchers.BinaryPythonSlotDispatcherNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltinBase;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotCExtNative;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPython;
        +import com.oracle.graal.python.lib.RichCmpOp;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
        +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
        +import com.oracle.graal.python.runtime.PythonContext;
        +import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
        +import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
        +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
        +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
        +import com.oracle.truffle.api.RootCallTarget;
        +import com.oracle.truffle.api.dsl.Cached;
        +import com.oracle.truffle.api.dsl.Cached.Exclusive;
        +import com.oracle.truffle.api.dsl.GenerateCached;
        +import com.oracle.truffle.api.dsl.GenerateInline;
        +import com.oracle.truffle.api.dsl.GenerateUncached;
        +import com.oracle.truffle.api.dsl.NodeFactory;
        +import com.oracle.truffle.api.dsl.Specialization;
        +import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.profiles.InlinedBranchProfile;
        +import com.oracle.truffle.api.strings.TruffleString;
        +import com.oracle.truffle.api.utilities.TruffleWeakReference;
        +
        +public abstract class TpSlotRichCompare {
        +
        +    private TpSlotRichCompare() {
        +    }
        +
        +    public abstract static sealed class TpSlotRichCmpBuiltin
        +                    extends TpSlotBuiltinBase permits TpSlotRichCmpBuiltinSimple, TpSlotRichCmpBuiltinComplex {
        +        static final BuiltinSlotWrapperSignature SIGNATURE = BuiltinSlotWrapperSignature.of(J_DOLLAR_SELF, "other", "op");
        +
        +        protected TpSlotRichCmpBuiltin(NodeFactory nodeFactory) {
        +            super(nodeFactory, SIGNATURE, PExternalFunctionWrapper.BINARYFUNC);
        +        }
        +
        +        final RichCmpBuiltinNode createSlotNode() {
        +            return createNode();
        +        }
        +
        +        @Override
        +        public PBuiltinFunction createBuiltin(Python3Core core, Object type, TruffleString tsName, PExternalFunctionWrapper wrapper) {
        +            RichCmpOp op = RichCmpOp.fromName(tsName);
        +            assert op != null : "Unexpected richcmp name: " + tsName.toJavaStringUncached();
        +            var factory = WrapperNodeFactory.wrap(getNodeFactory(), RichCmpWrapperNode.class, n -> new RichCmpWrapperNode(op, n));
        +            return createBuiltin(core, type, tsName, BuiltinSlotWrapperSignature.BINARY, wrapper, factory);
        +        }
        +    }
        +
        +    public abstract static non-sealed class TpSlotRichCmpBuiltinSimple extends TpSlotRichCmpBuiltin {
        +        protected TpSlotRichCmpBuiltinSimple(NodeFactory nodeFactory) {
        +            super(nodeFactory);
        +        }
        +
        +        protected abstract Object executeUncached(Object a, Object b, RichCmpOp op);
        +
        +        @Override
        +        public final void initialize(PythonLanguage language) {
        +            // nop: we do not need a call target
        +        }
        +    }
        +
        +    public abstract static non-sealed class TpSlotRichCmpBuiltinComplex extends TpSlotRichCmpBuiltin {
        +        private final int callTargetIndex = TpSlotBuiltinCallTargetRegistry.getNextCallTargetIndex();
        +
        +        protected TpSlotRichCmpBuiltinComplex(NodeFactory nodeFactory) {
        +            super(nodeFactory);
        +        }
        +
        +        @Override
        +        public final void initialize(PythonLanguage language) {
        +            RootCallTarget callTarget = createSlotCallTarget(language, SIGNATURE, getNodeFactory(), "tp_richcompare");
        +            language.setBuiltinSlotCallTarget(callTargetIndex, callTarget);
        +        }
        +    }
        +
        +    @GenerateInline(value = false, inherit = true)
        +    public abstract static class RichCmpBuiltinNode extends PythonTernaryBuiltinNode {
        +        @Override
        +        public final Object execute(VirtualFrame frame, Object arg, Object arg2, Object arg3) {
        +            return execute(frame, arg, arg2, (RichCmpOp) arg3);
        +        }
        +
        +        public abstract Object execute(VirtualFrame frame, Object a, Object b, RichCmpOp op);
        +    }
        +
        +    public static final class RichCmpWrapperNode extends PythonBinaryBuiltinNode {
        +        private final RichCmpOp op;
        +        @Child RichCmpBuiltinNode slotNode;
        +
        +        public RichCmpWrapperNode(RichCmpOp op, RichCmpBuiltinNode slotNode) {
        +            this.op = op;
        +            this.slotNode = slotNode;
        +        }
        +
        +        @Override
        +        public Object execute(VirtualFrame frame, Object arg, Object arg2) {
        +            return slotNode.execute(frame, arg, arg2, op);
        +        }
        +    }
        +
        +    public static final class TpSlotRichCmpPython extends TpSlotPython {
        +        private final TruffleWeakReference lt;
        +        private final TruffleWeakReference le;
        +        private final TruffleWeakReference eq;
        +        private final TruffleWeakReference ne;
        +        private final TruffleWeakReference gt;
        +        private final TruffleWeakReference ge;
        +        private final TruffleWeakReference type;
        +
        +        public TpSlotRichCmpPython(Object type, Object lt, Object le, Object eq, Object ne, Object gt, Object ge) {
        +            this.type = asWeakRef(type);
        +            this.lt = asWeakRef(lt);
        +            this.le = asWeakRef(le);
        +            this.eq = asWeakRef(eq);
        +            this.ne = asWeakRef(ne);
        +            this.gt = asWeakRef(gt);
        +            this.ge = asWeakRef(ge);
        +        }
        +
        +        public static TpSlotRichCmpPython create(Object[] callables, TruffleString[] callableNames, Object type) {
        +            assert callables.length == RichCmpOp.VALUES.length;
        +            assert callableNames == null || checkCallableNames(callableNames);
        +            return new TpSlotRichCmpPython(type, callables[0], callables[1], callables[2], callables[3], callables[4], callables[5]);
        +        }
        +
        +        private static boolean checkCallableNames(TruffleString[] callableNames) {
        +            for (int i = 0; i < RichCmpOp.VALUES.length; i++) {
        +                assert RichCmpOp.VALUES[i].getPythonName().equalsUncached(callableNames[i], TS_ENCODING);
        +            }
        +            return true;
        +        }
        +
        +        @Override
        +        public TpSlotPython forNewType(Object klass) {
        +            return new TpSlotRichCmpPython(type.get(), lt.get(), le.get(), eq.get(), ne.get(), gt.get(), ge.get());
        +        }
        +    }
        +
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @GenerateUncached
        +    public abstract static class CallSlotRichCmpNode extends Node {
        +        private static final CApiTiming C_API_TIMING = CApiTiming.create(true, J_TP_RICHCOMPARE);
        +
        +        public abstract Object execute(VirtualFrame frame, Node inliningTarget, TpSlot slot, Object a, Object b, RichCmpOp op);
        +
        +        @Specialization(guards = "cachedSlot == slot", limit = "3")
        +        static Object callCachedBuiltin(VirtualFrame frame, @SuppressWarnings("unused") TpSlotRichCmpBuiltin slot, Object a, Object b, RichCmpOp op,
        +                        @SuppressWarnings("unused") @Cached("slot") TpSlotRichCmpBuiltin cachedSlot,
        +                        @Cached("cachedSlot.createSlotNode()") RichCmpBuiltinNode slotNode) {
        +            return slotNode.execute(frame, a, b, op);
        +        }
        +
        +        @Specialization
        +        static Object callPython(VirtualFrame frame, Node inliningTarget, TpSlotRichCmpPython slot, Object a, Object b, RichCmpOp op,
        +                        @Cached BinaryPythonSlotDispatcherNode dispatcher,
        +                        @Cached InlinedBranchProfile notImplementedProfile) {
        +            TruffleWeakReference callableRef = switch (op) {
        +                case Py_LT -> slot.lt;
        +                case Py_LE -> slot.le;
        +                case Py_EQ -> slot.eq;
        +                case Py_NE -> slot.ne;
        +                case Py_GT -> slot.gt;
        +                case Py_GE -> slot.ge;
        +            };
        +            Object callable = slot.safeGet(callableRef);
        +            Object type = slot.safeGet(slot.type);
        +            if (callable != null && type != null) {
        +                return dispatcher.executeIgnoreDescriptorBindErrors(frame, inliningTarget, callable, type, a, b);
        +            } else {
        +                notImplementedProfile.enter(inliningTarget);
        +                return PNotImplemented.NOT_IMPLEMENTED;
        +            }
        +        }
        +
        +        @Specialization
        +        static Object callNative(VirtualFrame frame, Node inliningTarget, TpSlotCExtNative slot, Object a, Object b, RichCmpOp op,
        +                        @Exclusive @Cached GetThreadStateNode getThreadStateNode,
        +                        @Cached(inline = false) PythonToNativeNode toNativeNodeA,
        +                        @Cached(inline = false) PythonToNativeNode toNativeNodeB,
        +                        @Exclusive @Cached ExternalFunctionInvokeNode externalInvokeNode,
        +                        @Exclusive @Cached(inline = false) NativeToPythonTransferNode toPythonNode,
        +                        @Exclusive @Cached(inline = false) PyObjectCheckFunctionResultNode checkResultNode) {
        +            PythonContext ctx = PythonContext.get(inliningTarget);
        +            PythonThreadState state = getThreadStateNode.execute(inliningTarget, ctx);
        +            Object result = externalInvokeNode.call(frame, inliningTarget, state, C_API_TIMING, T_TP_RICHCOMPARE, slot.callable, toNativeNodeA.execute(a), toNativeNodeB.execute(b),
        +                            op.asNative());
        +            return checkResultNode.execute(state, T___HASH__, toPythonNode.execute(result));
        +        }
        +
        +        @Specialization(replaces = "callCachedBuiltin")
        +        @TruffleBoundary
        +        static Object callGenericSimpleBuiltin(TpSlotRichCmpBuiltinSimple slot, Object a, Object b, RichCmpOp op) {
        +            return slot.executeUncached(a, b, op);
        +        }
        +
        +        @Specialization(replaces = "callCachedBuiltin")
        +        @InliningCutoff
        +        static Object callGenericComplexBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotRichCmpBuiltinComplex slot, Object a, Object b, RichCmpOp op,
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
        +            Object[] arguments = PArguments.create(3);
        +            PArguments.setArgument(arguments, 0, a);
        +            PArguments.setArgument(arguments, 1, b);
        +            PArguments.setArgument(arguments, 2, op);
        +            RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
        +            return invoke.execute(frame, inliningTarget, callTarget, arguments);
        +        }
        +    }
        +}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotSetAttr.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotSetAttr.java
        index f6d1884cbe..6163b212d3 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotSetAttr.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotSetAttr.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -43,7 +43,6 @@
         import static com.oracle.graal.python.builtins.objects.type.slots.BuiltinSlotWrapperSignature.J_DOLLAR_SELF;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETATTR__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DELATTR__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GETATTR__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETATTR__;
         
         import com.oracle.graal.python.PythonLanguage;
        @@ -71,8 +70,8 @@
         import com.oracle.graal.python.nodes.PGuards;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode.Dynamic;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
         import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
        -import com.oracle.graal.python.runtime.ExecutionContext.CallContext;
         import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
         import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
         import com.oracle.graal.python.runtime.exception.PException;
        @@ -88,7 +87,6 @@
         import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
        -import com.oracle.truffle.api.nodes.IndirectCallNode;
         import com.oracle.truffle.api.nodes.Node;
         import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         import com.oracle.truffle.api.strings.TruffleString;
        @@ -116,7 +114,7 @@ final SetAttrBuiltinNode createSlotNode() {
         
                 @Override
                 public void initialize(PythonLanguage language) {
        -            RootCallTarget target = createBuiltinCallTarget(language, SET_SIGNATURE, getNodeFactory(), J___SETATTR__);
        +            RootCallTarget target = createSlotCallTarget(language, SET_SIGNATURE, getNodeFactory(), J___SETATTR__);
                     language.setBuiltinSlotCallTarget(callTargetIndex, target);
                 }
         
        @@ -187,11 +185,11 @@ public Object getType() {
             }
         
             /**
        -     * For managed types, this calls {@link TpSlots#combined_tp_getattro_getattr()}, because their
        +     * For managed types, this calls {@link TpSlots#combined_tp_setattro_setattr()}, because their
              * signature difference is not visible on the managed level. For native slots, this calls
        -     * {@link TpSlots#tp_getattro()} if available, otherwise {@link TpSlots#tp_getattr()} - at least
        +     * {@link TpSlots#tp_setattro()} if available, otherwise {@link TpSlots#tp_setattr()} - at least
              * one of those must be available, i.e., the caller is expected to check precondition
        -     * {@code combined_tp_getattro_getattr() != null}.
        +     * {@code combined_tp_setattro_setattr() != null}.
              */
             @GenerateInline
             @GenerateCached(false)
        @@ -278,14 +276,14 @@ static void callNative(VirtualFrame frame, TpSlots slots, TpSlotNative slot, Obj
                     Object result;
                     PythonThreadState threadState = getThreadStateNode.execute(inliningTarget, null);
                     try {
        -                result = externalInvokeNode.call(frame, inliningTarget, threadState, C_API_TIMING, T___GETATTR__, slot.callable, selfToNativeNode.execute(self), nameArg,
        +                result = externalInvokeNode.call(frame, inliningTarget, threadState, C_API_TIMING, T___SETATTR__, slot.callable, selfToNativeNode.execute(self), nameArg,
                                         valueToNativeNode.execute(value));
                     } finally {
                         if (isSetAttr) {
                             freeNode.free(nameArg);
                         }
                     }
        -            checkResultNode.execute(threadState, T___GETATTR__, result);
        +            checkResultNode.execute(threadState, T___SETATTR__, result);
                 }
             }
         
        @@ -319,7 +317,7 @@ static void callCachedBuiltin(VirtualFrame frame, @SuppressWarnings("unused") Tp
         
                 @Specialization(guards = "!isNoValue(value)")
                 static void callPythonSimpleSet(VirtualFrame frame, Node inliningTarget, TpSlotSetAttrPython slot, Object self, Object name, Object value,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode,
        +                        @Exclusive @Cached PRaiseNode raiseNode,
                                 @Cached TernaryPythonSlotDispatcherNode callPythonFun) {
                     Object callable = slot.getSetattr();
                     if (callable == null) {
        @@ -331,7 +329,7 @@ static void callPythonSimpleSet(VirtualFrame frame, Node inliningTarget, TpSlotS
                 @Specialization(guards = "isNoValue(value)")
                 @InliningCutoff
                 static void callPythonSimpleDel(VirtualFrame frame, Node inliningTarget, TpSlotSetAttrPython slot, Object self, Object name, @SuppressWarnings("unused") Object value,
        -                        @Exclusive @Cached PRaiseNode.Lazy raiseNode,
        +                        @Exclusive @Cached PRaiseNode raiseNode,
                                 @Cached BinaryPythonSlotDispatcherNode callPythonFun) {
                     Object callable = slot.getDelattr();
                     if (callable == null) {
        @@ -341,21 +339,20 @@ static void callPythonSimpleDel(VirtualFrame frame, Node inliningTarget, TpSlotS
                 }
         
                 @InliningCutoff
        -        private static PException raiseAttributeError(Node inliningTarget, PRaiseNode.Lazy raiseNode, TruffleString attrName) {
        -            return raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.AttributeError, attrName);
        +        private static PException raiseAttributeError(Node inliningTarget, PRaiseNode raiseNode, TruffleString attrName) {
        +            return raiseNode.raise(inliningTarget, PythonBuiltinClassType.AttributeError, attrName);
                 }
         
                 @Specialization(replaces = "callCachedBuiltin")
                 @InliningCutoff
                 static void callGenericBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotSetAttrBuiltin slot, Object self, Object name, Object value,
        -                        @Cached(inline = false) CallContext callContext,
        -                        @Cached InlinedConditionProfile isNullFrameProfile,
        -                        @Cached(inline = false) IndirectCallNode indirectCallNode) {
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
                     Object[] arguments = PArguments.create(3);
                     PArguments.setArgument(arguments, 0, self);
                     PArguments.setArgument(arguments, 1, name);
                     PArguments.setArgument(arguments, 2, value);
        -            BuiltinDispatchers.callGenericBuiltin(frame, inliningTarget, slot.callTargetIndex, arguments, callContext, isNullFrameProfile, indirectCallNode);
        +            RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
        +            invoke.execute(frame, inliningTarget, callTarget, arguments);
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotSizeArgFun.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotSizeArgFun.java
        index c7a26f57ef..cfd58eb67f 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotSizeArgFun.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotSizeArgFun.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,7 +40,6 @@
          */
         package com.oracle.graal.python.builtins.objects.type.slots;
         
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___GETITEM__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GETITEM__;
         
         import java.util.Objects;
        @@ -54,8 +53,6 @@
         import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming;
         import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.NativeToPythonTransferNode;
         import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode;
        -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyAsHandleNode;
        -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyNodes.HPyAsPythonObjectNode;
         import com.oracle.graal.python.builtins.objects.function.PArguments;
         import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
         import com.oracle.graal.python.builtins.objects.type.TpSlots;
        @@ -64,15 +61,14 @@
         import com.oracle.graal.python.builtins.objects.type.slots.PythonDispatchers.BinaryPythonSlotDispatcherNode;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltin;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotCExtNative;
        -import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotHPyNative;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPythonSingle;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.CallSlotLenNode;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFunFactory.FixNegativeIndexNodeGen;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFunFactory.WrapIndexArgFuncBuiltinNodeGen;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFunFactory.WrapSqItemBuiltinNodeGen;
         import com.oracle.graal.python.lib.PyNumberAsSizeNode;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
        -import com.oracle.graal.python.runtime.ExecutionContext.CallContext;
         import com.oracle.graal.python.runtime.PythonContext;
         import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
         import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
        @@ -85,12 +81,11 @@
         import com.oracle.truffle.api.dsl.GenerateCached;
         import com.oracle.truffle.api.dsl.GenerateInline;
         import com.oracle.truffle.api.dsl.GenerateUncached;
        +import com.oracle.truffle.api.dsl.NeverDefault;
         import com.oracle.truffle.api.dsl.NodeFactory;
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
        -import com.oracle.truffle.api.nodes.IndirectCallNode;
         import com.oracle.truffle.api.nodes.Node;
        -import com.oracle.truffle.api.profiles.InlinedConditionProfile;
         import com.oracle.truffle.api.strings.TruffleString;
         
         public class TpSlotSizeArgFun {
        @@ -99,9 +94,11 @@ private TpSlotSizeArgFun() {
         
             public abstract static class TpSlotSizeArgFunBuiltin extends TpSlotBuiltin {
                 private final int callTargetIndex = TpSlotBuiltinCallTargetRegistry.getNextCallTargetIndex();
        +        private final String name;
         
        -        protected TpSlotSizeArgFunBuiltin(NodeFactory nodeFactory) {
        +        protected TpSlotSizeArgFunBuiltin(NodeFactory nodeFactory, String name) {
                     super(nodeFactory);
        +            this.name = name;
                 }
         
                 final SizeArgFunBuiltinNode createSlotNode() {
        @@ -110,7 +107,7 @@ final SizeArgFunBuiltinNode createSlotNode() {
         
                 @Override
                 public void initialize(PythonLanguage language) {
        -            RootCallTarget target = createBuiltinCallTarget(language, BuiltinSlotWrapperSignature.BINARY, getNodeFactory(), J___GETITEM__);
        +            RootCallTarget target = createSlotCallTarget(language, BuiltinSlotWrapperSignature.BINARY, getNodeFactory(), name);
                     language.setBuiltinSlotCallTarget(callTargetIndex, target);
                 }
         
        @@ -171,7 +168,7 @@ Object doGeneric(VirtualFrame frame, Object self, Object index,
                     if (size < 0) {
                         if (fixNegativeIndex == null) {
                             CompilerDirectives.transferToInterpreterAndInvalidate();
        -                    fixNegativeIndex = insert(FixNegativeIndexNodeGen.create());
        +                    fixNegativeIndex = insert(FixNegativeIndex.create());
                         }
                         size = fixNegativeIndex.execute(frame, size, index);
                     }
        @@ -224,6 +221,11 @@ static int doIt(VirtualFrame frame, int indexAsSize, Object indexObj,
                     }
                     return indexAsSize;
                 }
        +
        +        @NeverDefault
        +        public static FixNegativeIndex create() {
        +            return FixNegativeIndexNodeGen.create();
        +        }
             }
         
             @GenerateInline
        @@ -260,31 +262,15 @@ static Object callNative(VirtualFrame frame, Node inliningTarget, TpSlotCExtNati
                     return checkResultNode.execute(threadState, T___GETITEM__, toPythonNode.execute(result));
                 }
         
        -        @Specialization
        -        @InliningCutoff
        -        static Object callHPy(VirtualFrame frame, Node inliningTarget, TpSlotHPyNative slot, Object self, int index,
        -                        @Exclusive @Cached GetThreadStateNode getThreadStateNode,
        -                        @Cached(inline = false) HPyAsHandleNode toNativeNode,
        -                        @Exclusive @Cached ExternalFunctionInvokeNode externalInvokeNode,
        -                        @Cached(inline = false) HPyAsPythonObjectNode toPythonNode,
        -                        @Exclusive @Cached(inline = false) PyObjectCheckFunctionResultNode checkResultNode) {
        -            PythonContext ctx = PythonContext.get(inliningTarget);
        -            PythonThreadState threadState = getThreadStateNode.execute(inliningTarget, ctx);
        -            Object result = externalInvokeNode.call(frame, inliningTarget, threadState, C_API_TIMING, T___GETITEM__, slot.callable, ctx.getHPyContext().getBackend(), toNativeNode.execute(self),
        -                            (long) index);
        -            return checkResultNode.execute(threadState, T___GETITEM__, toPythonNode.execute(result));
        -        }
        -
                 @Specialization(replaces = "callCachedBuiltin")
                 @InliningCutoff
                 static Object callGenericBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotSizeArgFunBuiltin slot, Object self, int index,
        -                        @Cached(inline = false) CallContext callContext,
        -                        @Cached InlinedConditionProfile isNullFrameProfile,
        -                        @Cached(inline = false) IndirectCallNode indirectCallNode) {
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
                     Object[] arguments = PArguments.create(2);
                     PArguments.setArgument(arguments, 0, self);
                     PArguments.setArgument(arguments, 1, index);
        -            return BuiltinDispatchers.callGenericBuiltin(frame, inliningTarget, slot.callTargetIndex, arguments, callContext, isNullFrameProfile, indirectCallNode);
        +            RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
        +            return invoke.execute(frame, inliningTarget, callTarget, arguments);
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotSqAssItem.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotSqAssItem.java
        new file mode 100644
        index 0000000000..2da698a4a5
        --- /dev/null
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotSqAssItem.java
        @@ -0,0 +1,353 @@
        +/*
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
        + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        + *
        + * The Universal Permissive License (UPL), Version 1.0
        + *
        + * Subject to the condition set forth below, permission is hereby granted to any
        + * person obtaining a copy of this software, associated documentation and/or
        + * data (collectively the "Software"), free of charge and under any and all
        + * copyright rights in the Software, and any and all patent rights owned or
        + * freely licensable by each licensor hereunder covering either (i) the
        + * unmodified Software as contributed to or provided by such licensor, or (ii)
        + * the Larger Works (as defined below), to deal in both
        + *
        + * (a) the Software, and
        + *
        + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
        + * one is included with the Software each a "Larger Work" to which the Software
        + * is contributed by such licensors),
        + *
        + * without restriction, including without limitation the rights to copy, create
        + * derivative works of, display, perform, and distribute the Software and make,
        + * use, sell, offer for sale, import, export, have made, and have sold the
        + * Software and the Larger Work(s), and to sublicense the foregoing rights on
        + * either these or other terms.
        + *
        + * This license is subject to the following condition:
        + *
        + * The above copyright notice and either this complete permission notice or at a
        + * minimum a reference to the UPL must be included in all copies or substantial
        + * portions of the Software.
        + *
        + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        + * SOFTWARE.
        + */
        +package com.oracle.graal.python.builtins.objects.type.slots;
        +
        +import static com.oracle.graal.python.builtins.objects.type.slots.BuiltinSlotWrapperSignature.J_DOLLAR_SELF;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SETITEM__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DELITEM__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SETITEM__;
        +
        +import java.util.Objects;
        +
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.builtins.Python3Core;
        +import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        +import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.CheckInquiryResultNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionInvokeNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode;
        +import com.oracle.graal.python.builtins.objects.function.PArguments;
        +import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
        +import com.oracle.graal.python.builtins.objects.type.slots.NodeFactoryUtils.WrapperNodeFactory;
        +import com.oracle.graal.python.builtins.objects.type.slots.PythonDispatchers.BinaryPythonSlotDispatcherNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.PythonDispatchers.TernaryPythonSlotDispatcherNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltinBase;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotManaged;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotNative;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPython;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.FixNegativeIndex;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqAssItemFactory.WrapSqDelItemBuiltinNodeGen;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqAssItemFactory.WrapSqSetItemBuiltinNodeGen;
        +import com.oracle.graal.python.lib.PyNumberAsSizeNode;
        +import com.oracle.graal.python.nodes.PGuards;
        +import com.oracle.graal.python.nodes.PRaiseNode;
        +import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
        +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
        +import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
        +import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
        +import com.oracle.graal.python.runtime.exception.PException;
        +import com.oracle.truffle.api.CompilerDirectives;
        +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
        +import com.oracle.truffle.api.RootCallTarget;
        +import com.oracle.truffle.api.dsl.Bind;
        +import com.oracle.truffle.api.dsl.Cached;
        +import com.oracle.truffle.api.dsl.Cached.Exclusive;
        +import com.oracle.truffle.api.dsl.GenerateCached;
        +import com.oracle.truffle.api.dsl.GenerateInline;
        +import com.oracle.truffle.api.dsl.GenerateUncached;
        +import com.oracle.truffle.api.dsl.ImportStatic;
        +import com.oracle.truffle.api.dsl.NodeFactory;
        +import com.oracle.truffle.api.dsl.Specialization;
        +import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.strings.TruffleString;
        +import com.oracle.truffle.api.utilities.TruffleWeakReference;
        +
        +public final class TpSlotSqAssItem {
        +    private TpSlotSqAssItem() {
        +    }
        +
        +    public abstract static class TpSlotSqAssItemBuiltin extends TpSlotBuiltinBase {
        +        public static final BuiltinSlotWrapperSignature SET_SIGNATURE = BuiltinSlotWrapperSignature.of(J_DOLLAR_SELF, "key", "value");
        +        private final int callTargetIndex = TpSlotBuiltinCallTargetRegistry.getNextCallTargetIndex();
        +
        +        protected TpSlotSqAssItemBuiltin(NodeFactory nodeFactory) {
        +            super(nodeFactory, BuiltinSlotWrapperSignature.BINARY, PExternalFunctionWrapper.BINARYFUNC);
        +        }
        +
        +        final SqAssItemBuiltinNode createSlotNode() {
        +            return createNode();
        +        }
        +
        +        @Override
        +        public void initialize(PythonLanguage language) {
        +            RootCallTarget target = createSlotCallTarget(language, SET_SIGNATURE, getNodeFactory(), J___SETITEM__);
        +            language.setBuiltinSlotCallTarget(callTargetIndex, target);
        +        }
        +
        +        @Override
        +        public PBuiltinFunction createBuiltin(Python3Core core, Object type, TruffleString tsName, PExternalFunctionWrapper wrapper) {
        +            return switch (wrapper) {
        +                case SETITEM -> createBuiltin(core, type, T___SETITEM__, SET_SIGNATURE, wrapper,
        +                                WrapperNodeFactory.wrap(getNodeFactory(), WrapSqSetItemBuiltinNode.class, WrapSqSetItemBuiltinNodeGen::create));
        +                case DELITEM -> createBuiltin(core, type, T___DELITEM__, BuiltinSlotWrapperSignature.BINARY, wrapper,
        +                                WrapperNodeFactory.wrap(getNodeFactory(), WrapSqDelItemBuiltinNode.class, WrapSqDelItemBuiltinNodeGen::create));
        +                default ->
        +                    throw new IllegalStateException(Objects.toString(wrapper));
        +            };
        +        }
        +    }
        +
        +    @GenerateInline(value = false, inherit = true)
        +    public abstract static class SqAssItemBuiltinNode extends PythonTernaryBuiltinNode {
        +        public abstract void executeIntKey(VirtualFrame frame, Object obj, int key, Object value);
        +
        +        @Override
        +        public final Object execute(VirtualFrame frame, Object obj, Object key, Object value) {
        +            executeIntKey(frame, obj, (int) key, value);
        +            return PNone.NONE;
        +        }
        +    }
        +
        +    /**
        +     * Implements semantics of {@code typeobject.c: wrap_sq_setitem}.
        +     */
        +    public abstract static class WrapSqSetItemBuiltinNode extends PythonTernaryBuiltinNode {
        +        private @Child SqAssItemBuiltinNode slotNode;
        +        private @Child FixNegativeIndex fixNegativeIndex;
        +
        +        protected WrapSqSetItemBuiltinNode(SqAssItemBuiltinNode slotNode) {
        +            this.slotNode = slotNode;
        +        }
        +
        +        @Specialization(guards = "index >= 0")
        +        Object doIntIndex(VirtualFrame frame, Object self, int index, Object value) {
        +            slotNode.executeIntKey(frame, self, index, value);
        +            return PNone.NONE;
        +        }
        +
        +        @Specialization(replaces = "doIntIndex")
        +        @SuppressWarnings("truffle-static-method")
        +        Object doGeneric(VirtualFrame frame, Object self, Object index, Object value,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached PyNumberAsSizeNode asSizeNode) {
        +            int size = asSizeNode.executeExact(frame, inliningTarget, index, PythonBuiltinClassType.OverflowError);
        +            if (size < 0) {
        +                if (fixNegativeIndex == null) {
        +                    CompilerDirectives.transferToInterpreterAndInvalidate();
        +                    fixNegativeIndex = insert(FixNegativeIndex.create());
        +                }
        +                size = fixNegativeIndex.execute(frame, size, index);
        +            }
        +            slotNode.executeIntKey(frame, self, size, value);
        +            return PNone.NONE;
        +        }
        +    }
        +
        +    /**
        +     * Implements semantics of {@code typeobject.c: wrap_sq_delitem}.
        +     */
        +    public abstract static class WrapSqDelItemBuiltinNode extends PythonBinaryBuiltinNode {
        +        private @Child SqAssItemBuiltinNode slotNode;
        +        private @Child FixNegativeIndex fixNegativeIndex;
        +
        +        protected WrapSqDelItemBuiltinNode(SqAssItemBuiltinNode slotNode) {
        +            this.slotNode = slotNode;
        +        }
        +
        +        @Specialization(guards = "index >= 0")
        +        Object doIntIndex(VirtualFrame frame, Object self, int index) {
        +            slotNode.executeIntKey(frame, self, index, PNone.NO_VALUE);
        +            return PNone.NONE;
        +        }
        +
        +        @Specialization(replaces = "doIntIndex")
        +        @SuppressWarnings("truffle-static-method")
        +        Object doGeneric(VirtualFrame frame, Object self, Object index,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached PyNumberAsSizeNode asSizeNode) {
        +            int size = asSizeNode.executeExact(frame, inliningTarget, index, PythonBuiltinClassType.OverflowError);
        +            if (size < 0) {
        +                if (fixNegativeIndex == null) {
        +                    CompilerDirectives.transferToInterpreterAndInvalidate();
        +                    fixNegativeIndex = insert(FixNegativeIndex.create());
        +                }
        +                size = fixNegativeIndex.execute(frame, size, index);
        +            }
        +            slotNode.executeIntKey(frame, self, size, PNone.NO_VALUE);
        +            return PNone.NONE;
        +        }
        +    }
        +
        +    public static final class TpSlotSqAssItemPython extends TpSlotPython {
        +        private final TruffleWeakReference setitem;
        +        private final TruffleWeakReference delitem;
        +        private final TruffleWeakReference type;
        +
        +        public TpSlotSqAssItemPython(Object setitem, Object delitem, Object type) {
        +            this.setitem = asWeakRef(setitem);
        +            this.delitem = asWeakRef(delitem);
        +            this.type = new TruffleWeakReference<>(type);
        +        }
        +
        +        public static TpSlotSqAssItemPython create(Object[] callables, TruffleString[] callableNames, Object type) {
        +            assert callables.length == 2;
        +            assert callableNames == null || (callableNames[0].equals(T___SETITEM__) && callableNames[1].equals(T___DELITEM__));
        +            return new TpSlotSqAssItemPython(callables[0], callables[1], type);
        +        }
        +
        +        @Override
        +        public TpSlotPython forNewType(Object klass) {
        +            Object newSet = LookupAttributeInMRONode.Dynamic.getUncached().execute(klass, T___SETITEM__);
        +            Object newDel = LookupAttributeInMRONode.Dynamic.getUncached().execute(klass, T___DELITEM__);
        +            if (newSet != getSetitem() || newDel != getDelitem()) {
        +                return new TpSlotSqAssItemPython(newSet, newDel, getType());
        +            }
        +            return this;
        +        }
        +
        +        public Object getSetitem() {
        +            return safeGet(setitem);
        +        }
        +
        +        public Object getDelitem() {
        +            return safeGet(delitem);
        +        }
        +
        +        public Object getType() {
        +            return safeGet(type);
        +        }
        +    }
        +
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @GenerateUncached
        +    public abstract static class CallSlotSqAssItemNode extends Node {
        +        public abstract void execute(VirtualFrame frame, Node inliningTarget, TpSlot slot, Object self, int key, Object value);
        +
        +        @Specialization
        +        static void callManagedSlot(VirtualFrame frame, Node inliningTarget, TpSlotManaged slot, Object self, int key, Object value,
        +                        @Cached CallManagedSlotSqAssItemNode slotNode) {
        +            slotNode.execute(frame, inliningTarget, slot, self, key, value);
        +        }
        +
        +        @Specialization
        +        @InliningCutoff
        +        static void callNative(VirtualFrame frame, TpSlotNative slot, Object self, int key, Object value,
        +                        @Cached(inline = false) CallNativeSlotSqAssItemNode callNativeSlot) {
        +            callNativeSlot.execute(frame, slot, self, key, value);
        +        }
        +    }
        +
        +    @GenerateInline(false) // Used lazily
        +    @GenerateUncached
        +    abstract static class CallNativeSlotSqAssItemNode extends Node {
        +        private static final CApiTiming C_API_TIMING = CApiTiming.create(true, "sq_ass_item");
        +
        +        abstract void execute(VirtualFrame frame, TpSlotNative slot, Object self, long key, Object value);
        +
        +        @Specialization
        +        static void callNative(VirtualFrame frame, TpSlotNative slot, Object self, long key, Object value,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached GetThreadStateNode getThreadStateNode,
        +                        @Cached PythonToNativeNode selfToNativeNode,
        +                        @Cached PythonToNativeNode valueToNativeNode,
        +                        @Cached ExternalFunctionInvokeNode externalInvokeNode,
        +                        @Cached CheckInquiryResultNode checkResultNode) {
        +            Object result;
        +            PythonThreadState threadState = getThreadStateNode.execute(inliningTarget);
        +            result = externalInvokeNode.call(frame, inliningTarget, threadState, C_API_TIMING, T___SETITEM__, slot.callable,
        +                            selfToNativeNode.execute(self), key, valueToNativeNode.execute(value));
        +            checkResultNode.execute(threadState, T___SETITEM__, result);
        +        }
        +    }
        +
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @GenerateUncached
        +    @ImportStatic(PGuards.class)
        +    @SuppressWarnings("rawtypes")
        +    public abstract static class CallManagedSlotSqAssItemNode extends Node {
        +
        +        public abstract void execute(VirtualFrame frame, Node inliningTarget, TpSlotManaged slot, Object self, int key, Object value);
        +
        +        @Specialization(guards = "slot == cachedSlot", limit = "3")
        +        static void callCachedBuiltin(VirtualFrame frame, @SuppressWarnings("unused") TpSlotSqAssItemBuiltin slot, Object self, int key, Object value,
        +                        @SuppressWarnings("unused") @Cached("slot") TpSlotSqAssItemBuiltin cachedSlot,
        +                        @Cached("cachedSlot.createSlotNode()") SqAssItemBuiltinNode slotNode) {
        +            slotNode.executeIntKey(frame, self, key, value);
        +        }
        +
        +        @Specialization(guards = "!isNoValue(value)")
        +        static void callPythonSimpleSet(VirtualFrame frame, Node inliningTarget, TpSlotSqAssItemPython slot, Object self, int key, Object value,
        +                        @Exclusive @Cached PRaiseNode raiseNode,
        +                        @Cached TernaryPythonSlotDispatcherNode callPythonFun) {
        +            Object callable = slot.getSetitem();
        +            if (callable == null) {
        +                throw raiseAttributeError(inliningTarget, raiseNode, T___SETITEM__);
        +            }
        +            callPythonFun.execute(frame, inliningTarget, callable, slot.getType(), self, key, value);
        +        }
        +
        +        @Specialization(guards = "isNoValue(value)")
        +        @InliningCutoff
        +        static void callPythonSimpleDel(VirtualFrame frame, Node inliningTarget, TpSlotSqAssItemPython slot, Object self, int key, @SuppressWarnings("unused") Object value,
        +                        @Exclusive @Cached PRaiseNode raiseNode,
        +                        @Cached BinaryPythonSlotDispatcherNode callPythonFun) {
        +            Object callable = slot.getDelitem();
        +            if (callable == null) {
        +                throw raiseAttributeError(inliningTarget, raiseNode, T___DELITEM__);
        +            }
        +            callPythonFun.execute(frame, inliningTarget, callable, slot.getType(), self, key);
        +        }
        +
        +        @InliningCutoff
        +        private static PException raiseAttributeError(Node inliningTarget, PRaiseNode raiseNode, TruffleString attrName) {
        +            return raiseNode.raise(inliningTarget, PythonBuiltinClassType.AttributeError, attrName);
        +        }
        +
        +        @Specialization(replaces = "callCachedBuiltin")
        +        @InliningCutoff
        +        static void callGenericBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotSqAssItemBuiltin slot, Object self, int key, Object value,
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
        +            Object[] arguments = PArguments.create(3);
        +            PArguments.setArgument(arguments, 0, self);
        +            PArguments.setArgument(arguments, 1, key);
        +            PArguments.setArgument(arguments, 2, value);
        +            RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
        +            invoke.execute(frame, inliningTarget, callTarget, arguments);
        +        }
        +    }
        +}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotSqContains.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotSqContains.java
        new file mode 100644
        index 0000000000..9a6fba5593
        --- /dev/null
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotSqContains.java
        @@ -0,0 +1,155 @@
        +/*
        + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
        + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        + *
        + * The Universal Permissive License (UPL), Version 1.0
        + *
        + * Subject to the condition set forth below, permission is hereby granted to any
        + * person obtaining a copy of this software, associated documentation and/or
        + * data (collectively the "Software"), free of charge and under any and all
        + * copyright rights in the Software, and any and all patent rights owned or
        + * freely licensable by each licensor hereunder covering either (i) the
        + * unmodified Software as contributed to or provided by such licensor, or (ii)
        + * the Larger Works (as defined below), to deal in both
        + *
        + * (a) the Software, and
        + *
        + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
        + * one is included with the Software each a "Larger Work" to which the Software
        + * is contributed by such licensors),
        + *
        + * without restriction, including without limitation the rights to copy, create
        + * derivative works of, display, perform, and distribute the Software and make,
        + * use, sell, offer for sale, import, export, have made, and have sold the
        + * Software and the Larger Work(s), and to sublicense the foregoing rights on
        + * either these or other terms.
        + *
        + * This license is subject to the following condition:
        + *
        + * The above copyright notice and either this complete permission notice or at a
        + * minimum a reference to the UPL must be included in all copies or substantial
        + * portions of the Software.
        + *
        + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        + * SOFTWARE.
        + */
        +package com.oracle.graal.python.builtins.objects.type.slots;
        +
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CONTAINS__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___CONTAINS__;
        +
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        +import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.CheckInquiryResultNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionInvokeNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode;
        +import com.oracle.graal.python.builtins.objects.function.PArguments;
        +import com.oracle.graal.python.builtins.objects.type.slots.PythonDispatchers.BinaryPythonSlotDispatcherNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotCExtNative;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPythonSingle;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.TpSlotBinaryFuncBuiltin;
        +import com.oracle.graal.python.lib.PyObjectIsTrueNode;
        +import com.oracle.graal.python.nodes.ErrorMessages;
        +import com.oracle.graal.python.nodes.PRaiseNode;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
        +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
        +import com.oracle.graal.python.runtime.PythonContext;
        +import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
        +import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
        +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
        +import com.oracle.truffle.api.RootCallTarget;
        +import com.oracle.truffle.api.dsl.Cached;
        +import com.oracle.truffle.api.dsl.GenerateCached;
        +import com.oracle.truffle.api.dsl.GenerateInline;
        +import com.oracle.truffle.api.dsl.GenerateUncached;
        +import com.oracle.truffle.api.dsl.NodeFactory;
        +import com.oracle.truffle.api.dsl.Specialization;
        +import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.nodes.Node;
        +
        +public final class TpSlotSqContains {
        +    private TpSlotSqContains() {
        +    }
        +
        +    public abstract static class TpSlotSqContainsBuiltin extends TpSlotBinaryFuncBuiltin {
        +
        +        protected TpSlotSqContainsBuiltin(NodeFactory nodeFactory) {
        +            super(nodeFactory, PExternalFunctionWrapper.OBJOBJPROC, J___CONTAINS__);
        +        }
        +
        +        final SqContainsBuiltinNode createOpSlotNode() {
        +            return createNode();
        +        }
        +    }
        +
        +    @GenerateInline(value = false, inherit = true)
        +    public abstract static class SqContainsBuiltinNode extends PythonBinaryBuiltinNode {
        +        public abstract boolean executeBoolean(VirtualFrame frame, Object obj, Object value);
        +
        +        @Override
        +        public final Object execute(VirtualFrame frame, Object obj, Object value) {
        +            return executeBoolean(frame, obj, value);
        +        }
        +    }
        +
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @GenerateUncached
        +    public abstract static class CallSlotSqContainsNode extends Node {
        +        private static final CApiTiming C_API_TIMING = CApiTiming.create(true, "sq_contains");
        +
        +        public abstract boolean execute(VirtualFrame frame, Node inliningTarget, TpSlot slot, Object self, Object arg);
        +
        +        @Specialization(guards = "cachedSlot == slot", limit = "3")
        +        static boolean callCachedBuiltin(VirtualFrame frame, @SuppressWarnings("unused") TpSlotSqContainsBuiltin slot, Object self, Object arg,
        +                        @SuppressWarnings("unused") @Cached("slot") TpSlotSqContainsBuiltin cachedSlot,
        +                        @Cached("cachedSlot.createOpSlotNode()") SqContainsBuiltinNode slotNode) {
        +            return slotNode.executeBoolean(frame, self, arg);
        +        }
        +
        +        @Specialization
        +        static boolean callPython(VirtualFrame frame, Node inliningTarget, TpSlotPythonSingle slot, Object self, Object arg,
        +                        @Cached BinaryPythonSlotDispatcherNode dispatcherNode,
        +                        @Cached PyObjectIsTrueNode isTrueNode,
        +                        @Cached PRaiseNode raiseNode) {
        +            if (slot.getCallable() == PNone.NONE) {
        +                throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.IS_NOT_A_CONTAINER, self);
        +            }
        +            Object result = dispatcherNode.execute(frame, inliningTarget, slot.getCallable(), slot.getType(), self, arg);
        +            return isTrueNode.execute(frame, result);
        +        }
        +
        +        @Specialization
        +        static boolean callNative(VirtualFrame frame, Node inliningTarget, TpSlotCExtNative slot, Object self, Object arg,
        +                        @Cached GetThreadStateNode getThreadStateNode,
        +                        @Cached(inline = false) PythonToNativeNode selfToNativeNode,
        +                        @Cached(inline = false) PythonToNativeNode argToNativeNode,
        +                        @Cached ExternalFunctionInvokeNode externalInvokeNode,
        +                        @Cached(inline = false) CheckInquiryResultNode checkResultNode) {
        +            PythonContext ctx = PythonContext.get(inliningTarget);
        +            PythonThreadState state = getThreadStateNode.execute(inliningTarget, ctx);
        +            Object result = externalInvokeNode.call(frame, inliningTarget, state, C_API_TIMING, T___CONTAINS__, slot.callable,
        +                            selfToNativeNode.execute(self), argToNativeNode.execute(arg));
        +            return checkResultNode.executeBool(state, T___CONTAINS__, result);
        +        }
        +
        +        @Specialization(replaces = "callCachedBuiltin")
        +        @InliningCutoff
        +        static boolean callGenericComplexBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotBinaryFuncBuiltin slot, Object self, Object arg,
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
        +            Object[] arguments = PArguments.create(2);
        +            PArguments.setArgument(arguments, 0, self);
        +            PArguments.setArgument(arguments, 1, arg);
        +            RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
        +            return (boolean) invoke.execute(frame, inliningTarget, callTarget, arguments);
        +        }
        +    }
        +}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotUnaryFunc.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotUnaryFunc.java
        new file mode 100644
        index 0000000000..046e1cf601
        --- /dev/null
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotUnaryFunc.java
        @@ -0,0 +1,156 @@
        +/*
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
        + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        + *
        + * The Universal Permissive License (UPL), Version 1.0
        + *
        + * Subject to the condition set forth below, permission is hereby granted to any
        + * person obtaining a copy of this software, associated documentation and/or
        + * data (collectively the "Software"), free of charge and under any and all
        + * copyright rights in the Software, and any and all patent rights owned or
        + * freely licensable by each licensor hereunder covering either (i) the
        + * unmodified Software as contributed to or provided by such licensor, or (ii)
        + * the Larger Works (as defined below), to deal in both
        + *
        + * (a) the Software, and
        + *
        + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
        + * one is included with the Software each a "Larger Work" to which the Software
        + * is contributed by such licensors),
        + *
        + * without restriction, including without limitation the rights to copy, create
        + * derivative works of, display, perform, and distribute the Software and make,
        + * use, sell, offer for sale, import, export, have made, and have sold the
        + * Software and the Larger Work(s), and to sublicense the foregoing rights on
        + * either these or other terms.
        + *
        + * This license is subject to the following condition:
        + *
        + * The above copyright notice and either this complete permission notice or at a
        + * minimum a reference to the UPL must be included in all copies or substantial
        + * portions of the Software.
        + *
        + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        + * SOFTWARE.
        + */
        +package com.oracle.graal.python.builtins.objects.type.slots;
        +
        +import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
        +
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionInvokeNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PyObjectCheckFunctionResultNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.NativeToPythonTransferNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode;
        +import com.oracle.graal.python.builtins.objects.function.PArguments;
        +import com.oracle.graal.python.builtins.objects.type.slots.PythonDispatchers.UnaryPythonSlotDispatcherNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltinBase;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotCExtNative;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPythonSingle;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
        +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
        +import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
        +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
        +import com.oracle.truffle.api.RootCallTarget;
        +import com.oracle.truffle.api.dsl.Bind;
        +import com.oracle.truffle.api.dsl.Cached;
        +import com.oracle.truffle.api.dsl.GenerateCached;
        +import com.oracle.truffle.api.dsl.GenerateInline;
        +import com.oracle.truffle.api.dsl.GenerateUncached;
        +import com.oracle.truffle.api.dsl.NodeFactory;
        +import com.oracle.truffle.api.dsl.Specialization;
        +import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.strings.TruffleString;
        +
        +public final class TpSlotUnaryFunc {
        +    private TpSlotUnaryFunc() {
        +    }
        +
        +    public abstract static class TpSlotUnaryFuncBuiltin extends TpSlotBuiltinBase {
        +        final int callTargetIndex = TpSlotBuiltinCallTargetRegistry.getNextCallTargetIndex();
        +        private final String builtinName;
        +
        +        protected TpSlotUnaryFuncBuiltin(NodeFactory nodeFactory, String builtinName) {
        +            super(nodeFactory, BuiltinSlotWrapperSignature.UNARY, PExternalFunctionWrapper.UNARYFUNC);
        +            this.builtinName = builtinName;
        +        }
        +
        +        final PythonUnaryBuiltinNode createSlotNode() {
        +            return createNode();
        +        }
        +
        +        @Override
        +        public final void initialize(PythonLanguage language) {
        +            RootCallTarget callTarget = createSlotCallTarget(language, BuiltinSlotWrapperSignature.UNARY, getNodeFactory(), builtinName);
        +            language.setBuiltinSlotCallTarget(callTargetIndex, callTarget);
        +        }
        +    }
        +
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @GenerateUncached
        +    public abstract static class CallSlotUnaryNode extends Node {
        +        private static final TruffleString T_UNARY_SLOT = tsLiteral("");
        +        private static final CApiTiming C_API_TIMING = CApiTiming.create(true, "unaryfunc");
        +
        +        public abstract Object execute(VirtualFrame frame, Node inliningTarget, TpSlot slot, Object self);
        +
        +        @Specialization(guards = "cachedSlot == slot", limit = "3")
        +        static Object callCachedBuiltin(VirtualFrame frame, @SuppressWarnings("unused") TpSlotUnaryFuncBuiltin slot, Object self,
        +                        @SuppressWarnings("unused") @Cached("slot") TpSlotUnaryFuncBuiltin cachedSlot,
        +                        @Cached("cachedSlot.createSlotNode()") PythonUnaryBuiltinNode slotNode) {
        +            return slotNode.execute(frame, self);
        +        }
        +
        +        @Specialization
        +        static Object callPython(VirtualFrame frame, TpSlotPythonSingle slot, Object self,
        +                        @Cached(inline = false) CallSlotUnaryPythonNode callSlotNode) {
        +            return callSlotNode.execute(frame, slot, self);
        +        }
        +
        +        @Specialization
        +        static Object callNative(VirtualFrame frame, Node inliningTarget, TpSlotCExtNative slot, Object self,
        +                        @Cached GetThreadStateNode getThreadStateNode,
        +                        @Cached(inline = false) PythonToNativeNode toNativeNode,
        +                        @Cached ExternalFunctionInvokeNode externalInvokeNode,
        +                        @Cached(inline = false) NativeToPythonTransferNode toPythonNode,
        +                        @Cached(inline = false) PyObjectCheckFunctionResultNode checkResultNode) {
        +            PythonThreadState state = getThreadStateNode.execute(inliningTarget);
        +            Object result = externalInvokeNode.call(frame, inliningTarget, state, C_API_TIMING, T_UNARY_SLOT, slot.callable,
        +                            toNativeNode.execute(self));
        +            return checkResultNode.execute(state, T_UNARY_SLOT, toPythonNode.execute(result));
        +        }
        +
        +        @Specialization(replaces = "callCachedBuiltin")
        +        @InliningCutoff
        +        static Object callGenericBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotUnaryFuncBuiltin slot, Object self,
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
        +            Object[] arguments = PArguments.create(1);
        +            PArguments.setArgument(arguments, 0, self);
        +            RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
        +            return invoke.execute(frame, inliningTarget, callTarget, arguments);
        +        }
        +    }
        +
        +    @GenerateUncached
        +    @GenerateInline(false) // intentionally lazy
        +    abstract static class CallSlotUnaryPythonNode extends Node {
        +        abstract Object execute(VirtualFrame frame, TpSlotPythonSingle slot, Object obj);
        +
        +        @Specialization
        +        static Object doIt(VirtualFrame frame, TpSlotPythonSingle slot, Object self,
        +                        @Bind("this") Node inliningTarget,
        +                        @Cached UnaryPythonSlotDispatcherNode dispatcherNode) {
        +            return dispatcherNode.execute(frame, inliningTarget, slot.getCallable(), slot.getType(), self);
        +        }
        +    }
        +}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotVarargs.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotVarargs.java
        new file mode 100644
        index 0000000000..f4fec1cf7f
        --- /dev/null
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotVarargs.java
        @@ -0,0 +1,445 @@
        +/*
        + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
        + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        + *
        + * The Universal Permissive License (UPL), Version 1.0
        + *
        + * Subject to the condition set forth below, permission is hereby granted to any
        + * person obtaining a copy of this software, associated documentation and/or
        + * data (collectively the "Software"), free of charge and under any and all
        + * copyright rights in the Software, and any and all patent rights owned or
        + * freely licensable by each licensor hereunder covering either (i) the
        + * unmodified Software as contributed to or provided by such licensor, or (ii)
        + * the Larger Works (as defined below), to deal in both
        + *
        + * (a) the Software, and
        + *
        + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
        + * one is included with the Software each a "Larger Work" to which the Software
        + * is contributed by such licensors),
        + *
        + * without restriction, including without limitation the rights to copy, create
        + * derivative works of, display, perform, and distribute the Software and make,
        + * use, sell, offer for sale, import, export, have made, and have sold the
        + * Software and the Larger Work(s), and to sublicense the foregoing rights on
        + * either these or other terms.
        + *
        + * This license is subject to the following condition:
        + *
        + * The above copyright notice and either this complete permission notice or at a
        + * minimum a reference to the UPL must be included in all copies or substantial
        + * portions of the Software.
        + *
        + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        + * SOFTWARE.
        + */
        +package com.oracle.graal.python.builtins.objects.type.slots;
        +
        +import static com.oracle.graal.python.builtins.objects.PNone.NO_VALUE;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEW__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___CALL__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___INIT__;
        +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEW__;
        +import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
        +
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
        +import com.oracle.graal.python.builtins.Python3Core;
        +import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        +import com.oracle.graal.python.builtins.PythonBuiltins;
        +import com.oracle.graal.python.builtins.objects.PNone;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.CreateArgsTupleNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.DefaultCheckFunctionResultNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.EagerTupleState;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionInvokeNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.InitCheckFunctionResultNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.NativeToPythonTransferNode;
        +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode;
        +import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.CheckFunctionResultNode;
        +import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
        +import com.oracle.graal.python.builtins.objects.function.PFunction;
        +import com.oracle.graal.python.builtins.objects.function.PKeyword;
        +import com.oracle.graal.python.builtins.objects.function.Signature;
        +import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
        +import com.oracle.graal.python.builtins.objects.method.PDecoratedMethod;
        +import com.oracle.graal.python.builtins.objects.object.PythonObject;
        +import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltin;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotCExtNative;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPythonSingle;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.CallSlotDescrGet;
        +import com.oracle.graal.python.nodes.ErrorMessages;
        +import com.oracle.graal.python.nodes.PRaiseNode;
        +import com.oracle.graal.python.nodes.argument.CreateArgumentsNode;
        +import com.oracle.graal.python.nodes.call.BoundDescriptor;
        +import com.oracle.graal.python.nodes.call.CallDispatchers;
        +import com.oracle.graal.python.nodes.call.CallNode;
        +import com.oracle.graal.python.nodes.call.special.MaybeBindDescriptorNode;
        +import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode;
        +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
        +import com.oracle.graal.python.runtime.PythonContext;
        +import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
        +import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
        +import com.oracle.graal.python.runtime.object.PFactory;
        +import com.oracle.graal.python.util.PythonUtils;
        +import com.oracle.truffle.api.CompilerAsserts;
        +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
        +import com.oracle.truffle.api.RootCallTarget;
        +import com.oracle.truffle.api.Truffle;
        +import com.oracle.truffle.api.dsl.Bind;
        +import com.oracle.truffle.api.dsl.Cached;
        +import com.oracle.truffle.api.dsl.Fallback;
        +import com.oracle.truffle.api.dsl.GenerateCached;
        +import com.oracle.truffle.api.dsl.GenerateInline;
        +import com.oracle.truffle.api.dsl.GenerateUncached;
        +import com.oracle.truffle.api.dsl.NodeFactory;
        +import com.oracle.truffle.api.dsl.ReportPolymorphism;
        +import com.oracle.truffle.api.dsl.Specialization;
        +import com.oracle.truffle.api.frame.VirtualFrame;
        +import com.oracle.truffle.api.nodes.DirectCallNode;
        +import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.strings.TruffleString;
        +
        +public final class TpSlotVarargs {
        +    private TpSlotVarargs() {
        +    }
        +
        +    public abstract static class TpSlotVarargsBuiltin extends TpSlotBuiltin {
        +        final int callTargetIndex = TpSlotBuiltinCallTargetRegistry.getNextCallTargetIndex();
        +        private final String name;
        +        private final TruffleString tsName;
        +        protected final boolean directInvocation;
        +        protected final Signature signature;
        +        protected final Object[] defaults;
        +        protected final PKeyword[] kwDefaults;
        +
        +        protected TpSlotVarargsBuiltin(NodeFactory nodeFactory, String name) {
        +            this(nodeFactory, name, false);
        +        }
        +
        +        protected TpSlotVarargsBuiltin(NodeFactory nodeFactory, String name, boolean takesClass) {
        +            super(nodeFactory);
        +            this.name = name;
        +            this.tsName = PythonUtils.tsLiteral(name);
        +            Class nodeClass = getNodeFactory().getNodeClass();
        +            SlotSignature slotSignature = nodeClass.getAnnotation(SlotSignature.class);
        +            Slot2Builtin builtin = new Slot2Builtin(slotSignature, name, null);
        +            signature = BuiltinFunctionRootNode.createSignature(getNodeFactory(), builtin, true, takesClass);
        +            defaults = PBuiltinFunction.generateDefaults(PythonBuiltins.numDefaults(builtin));
        +            kwDefaults = PBuiltinFunction.generateKwDefaults(signature);
        +            directInvocation = PythonUnaryBuiltinNode.class.isAssignableFrom(nodeClass) || PythonBinaryBuiltinNode.class.isAssignableFrom(nodeClass) || //
        +                            PythonTernaryBuiltinNode.class.isAssignableFrom(nodeClass) || PythonVarargsBuiltinNode.class.isAssignableFrom(nodeClass) || //
        +                            PythonQuaternaryBuiltinNode.class.isAssignableFrom(nodeClass);
        +        }
        +
        +        final PythonBuiltinBaseNode createSlotNodeIfDirect() {
        +            return directInvocation ? createNode() : null;
        +        }
        +
        +        public Signature getSignature() {
        +            return signature;
        +        }
        +
        +        public Object[] getDefaults() {
        +            return defaults;
        +        }
        +
        +        public PKeyword[] getKwDefaults() {
        +            return kwDefaults;
        +        }
        +
        +        public TruffleString getName() {
        +            return tsName;
        +        }
        +
        +        @Override
        +        public final void initialize(PythonLanguage language) {
        +            RootCallTarget callTarget = createSlotCallTarget(language, null, getNodeFactory(), name);
        +            language.setBuiltinSlotCallTarget(callTargetIndex, callTarget);
        +        }
        +
        +        @Override
        +        public PythonObject createBuiltin(Python3Core core, Object type, TruffleString tsName, PExternalFunctionWrapper wrapper) {
        +            return createBuiltin(core, type, tsName, null, wrapper, getNodeFactory());
        +        }
        +    }
        +
        +    public abstract static class TpSlotNewBuiltin extends TpSlotVarargsBuiltin {
        +
        +        protected TpSlotNewBuiltin(NodeFactory nodeFactory) {
        +            super(nodeFactory, J___NEW__, true);
        +        }
        +
        +        @Override
        +        public PBuiltinMethod createBuiltin(Python3Core core, Object type, TruffleString tsName, PExternalFunctionWrapper wrapper) {
        +            PythonLanguage language = core.getLanguage();
        +            NodeFactory factory = getNodeFactory();
        +            Class nodeClass = factory.getNodeClass();
        +            SlotSignature slotSignature = nodeClass.getAnnotation(SlotSignature.class);
        +            Slot2Builtin builtin = new Slot2Builtin(slotSignature, J___NEW__, null);
        +            PythonBuiltinClassType builtinType = type instanceof PythonBuiltinClassType bt ? bt : null;
        +            /*
        +             * Note: '__new__' is not a 'wrapper_descriptor', but a 'builtin_function_or_method'.
        +             * The method holds the declaring type as self and the actual 'cls' argument comes after
        +             * it. The underlying slot doesn't take the first self. In CPython 'tp_new_wrapper' uses
        +             * the self to check the call safety and then drops it for the slot call. Our
        +             * 'WrapTpNew' holds the type in a field and uses that to do the check. The dropping is
        +             * achieved by using `declaresExplicitSelf = false`.
        +             */
        +            RootCallTarget callTarget = language.createCachedCallTarget(l -> new BuiltinFunctionRootNode(l, builtin, factory, false, builtinType),
        +                            nodeClass, nodeClass, builtinType, J___NEW__);
        +            return PFactory.createNewWrapper(language, type, defaults, kwDefaults, callTarget, this);
        +        }
        +    }
        +
        +    @GenerateCached(false)
        +    abstract static class CallVarargsTpSlotBaseNode extends Node {
        +        public abstract Object execute(VirtualFrame frame, Node inliningTarget, TpSlot slot, Object self, Object[] args, PKeyword[] keywords);
        +
        +        @Specialization(guards = {"frame != null", "cachedSlot == slot"}, limit = "3")
        +        static Object callCachedBuiltin(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") TpSlotVarargsBuiltin slot, Object self, Object[] args, PKeyword[] keywords,
        +                        @SuppressWarnings("unused") @Cached("slot") TpSlotVarargsBuiltin cachedSlot,
        +                        @Cached("cachedSlot.createSlotNodeIfDirect()") PythonBuiltinBaseNode slotNode,
        +                        @Cached DispatchVarargsBuiltinFullDirectNode dispatchFullNode) {
        +            if (slotNode != null) {
        +                if (slotNode instanceof PythonUnaryBuiltinNode unaryBuiltinNode) {
        +                    if (keywords.length == 0 && args.length == 0) {
        +                        return unaryBuiltinNode.execute(frame, self);
        +                    }
        +                } else if (slotNode instanceof PythonBinaryBuiltinNode binaryBuiltinNode) {
        +                    if (keywords.length == 0 && (args.length == 1 || args.length + cachedSlot.getDefaults().length >= 1 && args.length <= 1)) {
        +                        return binaryBuiltinNode.execute(frame, self, args.length == 1 ? args[0] : PNone.NO_VALUE);
        +                    }
        +                } else if (slotNode instanceof PythonTernaryBuiltinNode ternaryBuiltinNode) {
        +                    if (keywords.length == 0 && (args.length == 2 || args.length + cachedSlot.getDefaults().length >= 2 && args.length <= 2)) {
        +                        return ternaryBuiltinNode.execute(frame, self, args.length >= 1 ? args[0] : PNone.NO_VALUE, args.length == 2 ? args[1] : PNone.NO_VALUE);
        +                    }
        +                } else if (slotNode instanceof PythonQuaternaryBuiltinNode quaternaryBuiltinNode) {
        +                    if (keywords.length == 0 && (args.length == 3 || args.length + cachedSlot.getDefaults().length >= 3 && args.length <= 3)) {
        +                        return quaternaryBuiltinNode.execute(frame, self,
        +                                        args.length >= 1 ? args[0] : PNone.NO_VALUE,
        +                                        args.length >= 2 ? args[1] : PNone.NO_VALUE,
        +                                        args.length == 3 ? args[2] : PNone.NO_VALUE);
        +                    }
        +                } else if (slotNode instanceof PythonVarargsBuiltinNode varargsBuiltinNode) {
        +                    return varargsBuiltinNode.execute(frame, self, args, keywords);
        +                }
        +            }
        +            return dispatchFullNode.execute(frame, inliningTarget, cachedSlot, self, args, keywords);
        +        }
        +
        +        @Specialization(replaces = "callCachedBuiltin")
        +        @InliningCutoff
        +        static Object callGenericBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotVarargsBuiltin slot, Object self, Object[] args, PKeyword[] keywords,
        +                        @Cached CreateArgumentsNode createArgumentsNode,
        +                        @Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
        +            Object[] arguments = createArgumentsNode.execute(inliningTarget, slot.getName(), args, keywords, slot.getSignature(), self, null, slot.getDefaults(), slot.getKwDefaults(),
        +                            false);
        +            RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
        +            return invoke.execute(frame, inliningTarget, callTarget, arguments);
        +        }
        +    }
        +
        +    @GenerateInline
        +    @GenerateCached(false)
        +    abstract static class DispatchVarargsBuiltinFullDirectNode extends Node {
        +
        +        public abstract Object execute(VirtualFrame frame, Node inliningTarget, TpSlotVarargsBuiltin slot, Object self, Object[] args, PKeyword[] keywords);
        +
        +        @Specialization
        +        static Object call(VirtualFrame frame, Node inliningTarget, TpSlotVarargsBuiltin slot, Object self, Object[] args, PKeyword[] keywords,
        +                        @Cached CreateArgumentsNode createArgumentsNode,
        +                        @Cached("createDirectCallNode(slot)") DirectCallNode callNode,
        +                        @Cached CallDispatchers.SimpleDirectInvokeNode invoke) {
        +            CompilerAsserts.partialEvaluationConstant(slot);
        +            Object[] arguments = createArgumentsNode.execute(inliningTarget, slot.getName(), args, keywords, slot.getSignature(), self, null, slot.getDefaults(), slot.getKwDefaults(), false);
        +            return invoke.execute(frame, inliningTarget, callNode, arguments);
        +        }
        +
        +        protected static DirectCallNode createDirectCallNode(TpSlotVarargsBuiltin slot) {
        +            return Truffle.getRuntime().createDirectCallNode(PythonLanguage.get(null).getBuiltinSlotCallTarget(slot.callTargetIndex));
        +        }
        +    }
        +
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @GenerateUncached
        +    abstract static class CallSlotVarargsPythonNode extends Node {
        +        abstract Object execute(VirtualFrame frame, Node inliningTarget, TpSlotPythonSingle slot, Object self, Object[] args, PKeyword[] keywords);
        +
        +        @Specialization
        +        static Object callPython(VirtualFrame frame, Node inliningTarget, TpSlotPythonSingle slot, Object self, Object[] args, PKeyword[] keywords,
        +                        @Cached MaybeBindDescriptorNode bindDescriptorNode,
        +                        @Cached(inline = false) CallNode callNode) {
        +            Object bound = bindDescriptorNode.execute(frame, inliningTarget, slot.getCallable(), self, slot.getType());
        +            Object callable;
        +            Object[] callArgs;
        +            if (bound instanceof BoundDescriptor boundDescriptor) {
        +                callable = boundDescriptor.descriptor;
        +                callArgs = args;
        +            } else {
        +                callable = slot.getCallable();
        +                callArgs = new Object[args.length + 1];
        +                callArgs[0] = self;
        +                PythonUtils.arraycopy(args, 0, callArgs, 1, args.length);
        +            }
        +            return callNode.execute(frame, callable, callArgs, keywords);
        +        }
        +    }
        +
        +    private static final CApiTiming C_API_TIMING = CApiTiming.create(true, "");
        +
        +    @GenerateInline(false)
        +    @GenerateUncached
        +    abstract static class CallSlotVarargsNativeNode extends Node {
        +
        +        abstract Object execute(VirtualFrame frame, TpSlotCExtNative slot, Object self, Object[] args, PKeyword[] keywords, TruffleString name, CheckFunctionResultNode checkResultNode,
        +                        NativeToPythonTransferNode toPythonNode);
        +
        +        @Specialization
        +        static Object callNative(VirtualFrame frame, TpSlotCExtNative slot, Object self, Object[] args, PKeyword[] keywords, TruffleString name, CheckFunctionResultNode checkResultNode,
        +                        NativeToPythonTransferNode toPythonNode,
        +                        @Bind Node inliningTarget,
        +                        @Bind PythonContext context,
        +                        @Cached GetThreadStateNode getThreadStateNode,
        +                        @Cached(inline = false) PythonToNativeNode toNativeNode,
        +                        @Cached CreateArgsTupleNode createArgsTupleNode,
        +                        @Cached EagerTupleState eagerTupleState,
        +                        @Cached ExternalFunctionInvokeNode externalInvokeNode) {
        +            PythonLanguage language = context.getLanguage(inliningTarget);
        +            PythonThreadState state = getThreadStateNode.execute(inliningTarget, context);
        +            PTuple argsTuple = createArgsTupleNode.execute(inliningTarget, language, args, eagerTupleState);
        +            Object kwargsDict = PFactory.createDict(language, keywords);
        +            Object nativeResult = externalInvokeNode.call(frame, inliningTarget, state, C_API_TIMING, name, slot.callable,
        +                            toNativeNode.execute(self), toNativeNode.execute(argsTuple), toNativeNode.execute(kwargsDict));
        +            eagerTupleState.report(inliningTarget, argsTuple);
        +            checkResultNode.execute(state, name, nativeResult);
        +            if (toPythonNode != null) {
        +                return toPythonNode.execute(nativeResult);
        +            }
        +            return NO_VALUE;
        +        }
        +    }
        +
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @GenerateUncached
        +    @ReportPolymorphism
        +    public abstract static class CallSlotTpInitNode extends CallVarargsTpSlotBaseNode {
        +
        +        @Specialization
        +        static Object callPython(VirtualFrame frame, Node inliningTarget, TpSlotPythonSingle slot, Object self, Object[] args, PKeyword[] keywords,
        +                        @Cached CallSlotVarargsPythonNode callNode,
        +                        @Cached PRaiseNode raiseNode) {
        +            Object result = callNode.execute(frame, inliningTarget, slot, self, args, keywords);
        +            if (result != PNone.NONE) {
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.SHOULD_RETURN_NONE, "__init__()");
        +            }
        +            return PNone.NO_VALUE;
        +        }
        +
        +        @Specialization
        +        @InliningCutoff
        +        static Object callNative(VirtualFrame frame, TpSlotCExtNative slot, Object self, Object[] args, PKeyword[] keywords,
        +                        @Cached InitCheckFunctionResultNode checkResult,
        +                        @Cached CallSlotVarargsNativeNode callNode) {
        +            return callNode.execute(frame, slot, self, args, keywords, T___INIT__, checkResult, null);
        +        }
        +    }
        +
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @GenerateUncached
        +    public abstract static class BindNewMethodNode extends Node {
        +        public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object descriptor, Object type);
        +
        +        @Specialization(guards = "isStaticmethod(descriptor)")
        +        static Object doStaticmethod(PDecoratedMethod descriptor, @SuppressWarnings("unused") Object type) {
        +            return descriptor.getCallable();
        +        }
        +
        +        protected static boolean isStaticmethod(PDecoratedMethod descriptor) {
        +            return descriptor.getInitialPythonClass() == PythonBuiltinClassType.PStaticmethod;
        +        }
        +
        +        @Specialization
        +        static Object doBuiltinMethod(PBuiltinMethod descriptor, @SuppressWarnings("unused") Object type) {
        +            return descriptor;
        +        }
        +
        +        @Specialization
        +        static Object doFunction(PFunction descriptor, @SuppressWarnings("unused") Object type) {
        +            return descriptor;
        +        }
        +
        +        @Fallback
        +        static Object doBind(VirtualFrame frame, Node inliningTarget, Object descriptor, Object type,
        +                        @Cached GetObjectSlotsNode getSlotsNode,
        +                        @Cached CallSlotDescrGet callGetSlot) {
        +            var getMethod = getSlotsNode.execute(inliningTarget, descriptor).tp_descr_get();
        +            if (getMethod != null) {
        +                return callGetSlot.execute(frame, inliningTarget, getMethod, descriptor, NO_VALUE, type);
        +            }
        +            return descriptor;
        +        }
        +    }
        +
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @GenerateUncached
        +    @ReportPolymorphism
        +    public abstract static class CallSlotTpNewNode extends CallVarargsTpSlotBaseNode {
        +
        +        @Specialization
        +        static Object callPython(VirtualFrame frame, Node inliningTarget, TpSlotPythonSingle slot, Object self, Object[] args, PKeyword[] keywords,
        +                        @Cached BindNewMethodNode bindNew,
        +                        @Cached(inline = false) CallNode callNode) {
        +            Object callable = bindNew.execute(frame, inliningTarget, slot.getCallable(), self);
        +            return callNode.execute(frame, callable, PythonUtils.prependArgument(self, args), keywords);
        +        }
        +
        +        @Specialization
        +        @InliningCutoff
        +        static Object callNative(VirtualFrame frame, TpSlotCExtNative slot, Object self, Object[] args, PKeyword[] keywords,
        +                        @Cached DefaultCheckFunctionResultNode checkResult,
        +                        @Cached NativeToPythonTransferNode toPythonNode,
        +                        @Cached CallSlotVarargsNativeNode callNode) {
        +            return callNode.execute(frame, slot, self, args, keywords, T___NEW__, checkResult, toPythonNode);
        +        }
        +    }
        +
        +    @GenerateInline
        +    @GenerateCached(false)
        +    @GenerateUncached
        +    @ReportPolymorphism
        +    public abstract static class CallSlotTpCallNode extends CallVarargsTpSlotBaseNode {
        +
        +        @Specialization
        +        static Object callPython(VirtualFrame frame, Node inliningTarget, TpSlotPythonSingle slot, Object self, Object[] args, PKeyword[] keywords,
        +                        @Cached CallSlotVarargsPythonNode callNode) {
        +            return callNode.execute(frame, inliningTarget, slot, self, args, keywords);
        +        }
        +
        +        @Specialization
        +        @InliningCutoff
        +        static Object callNative(VirtualFrame frame, TpSlotCExtNative slot, Object self, Object[] args, PKeyword[] keywords,
        +                        @Cached DefaultCheckFunctionResultNode checkResult,
        +                        @Cached NativeToPythonTransferNode toPythonNode,
        +                        @Cached CallSlotVarargsNativeNode callNode) {
        +            return callNode.execute(frame, slot, self, args, keywords, T___CALL__, checkResult, toPythonNode);
        +        }
        +    }
        +}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/types/GenericAliasBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/types/GenericAliasBuiltins.java
        index 450f364f2f..35330b8ceb 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/types/GenericAliasBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/types/GenericAliasBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -54,17 +54,10 @@
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___ORIG_CLASS__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___PARAMETERS__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___UNPACKED__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DIR__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INSTANCECHECK__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ITER__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___MRO_ENTRIES__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OR__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROR__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SUBCLASSCHECK__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___COPY__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.T___DEEPCOPY__;
        @@ -76,8 +69,10 @@
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.annotations.Slot;
         import com.oracle.graal.python.annotations.Slot.SlotKind;
        +import com.oracle.graal.python.annotations.Slot.SlotSignature;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        @@ -94,7 +89,10 @@
         import com.oracle.graal.python.builtins.objects.type.TpSlots;
         import com.oracle.graal.python.builtins.objects.type.TypeNodes;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.MpSubscriptBuiltinNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotGetAttr.GetAttrBuiltinNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.HashBuiltinNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare.RichCmpBuiltinNode;
         import com.oracle.graal.python.lib.PyObjectDir;
         import com.oracle.graal.python.lib.PyObjectGetAttr;
         import com.oracle.graal.python.lib.PyObjectGetIter;
        @@ -102,6 +100,7 @@
         import com.oracle.graal.python.lib.PyObjectRichCompareBool;
         import com.oracle.graal.python.lib.PyObjectSetAttr;
         import com.oracle.graal.python.lib.PySequenceContainsNode;
        +import com.oracle.graal.python.lib.RichCmpOp;
         import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.StringLiterals;
        @@ -109,6 +108,7 @@
         import com.oracle.graal.python.nodes.call.CallNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
        +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
         import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile;
        @@ -117,7 +117,7 @@
         import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
         import com.oracle.graal.python.runtime.PythonContext;
         import com.oracle.graal.python.runtime.exception.PException;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
         import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
         import com.oracle.truffle.api.dsl.Bind;
        @@ -129,6 +129,7 @@
         import com.oracle.truffle.api.frame.VirtualFrame;
         import com.oracle.truffle.api.nodes.ExplodeLoop;
         import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.profiles.InlinedBranchProfile;
         import com.oracle.truffle.api.strings.TruffleString;
         import com.oracle.truffle.api.strings.TruffleStringBuilder;
         
        @@ -155,6 +156,18 @@ protected List> getNodeFa
                 return GenericAliasBuiltinsFactory.getFactories();
             }
         
        +    @Slot(value = SlotKind.tp_new, isComplex = true)
        +    @SlotSignature(name = "GenericAlias", minNumOfPositionalArgs = 3)
        +    @GenerateNodeFactory
        +    public abstract static class GenericAliasNode extends PythonTernaryBuiltinNode {
        +        @Specialization
        +        static PGenericAlias doit(Object cls, Object origin, Object arguments,
        +                        @Bind PythonLanguage language,
        +                        @Cached TypeNodes.GetInstanceShape getInstanceShape) {
        +            return PFactory.createGenericAlias(language, cls, getInstanceShape.execute(cls), origin, arguments, false);
        +        }
        +    }
        +
             @Builtin(name = J___ORIGIN__, minNumOfPositionalArgs = 1, isGetter = true)
             @GenerateNodeFactory
             abstract static class OriginNode extends PythonUnaryBuiltinNode {
        @@ -179,9 +192,10 @@ abstract static class ParametersNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static Object parameters(PGenericAlias self,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached PythonObjectFactory.Lazy factory) {
        +                        @Cached InlinedBranchProfile createProfile) {
                     if (self.getParameters() == null) {
        -                self.setParameters(factory.get(inliningTarget).createTuple(GenericTypeNodes.makeParameters(self.getArgs())));
        +                createProfile.enter(inliningTarget);
        +                self.setParameters(PFactory.createTuple(PythonLanguage.get(inliningTarget), GenericTypeNodes.makeParameters(self.getArgs())));
                     }
                     return self.getParameters();
                 }
        @@ -196,10 +210,9 @@ static Object unpacked(PGenericAlias self) {
                 }
             }
         
        -    @Builtin(name = J___OR__, minNumOfPositionalArgs = 2)
        -    @Builtin(name = J___ROR__, minNumOfPositionalArgs = 2, reverseOperation = true)
        +    @Slot(value = SlotKind.nb_or, isComplex = true)
             @GenerateNodeFactory
        -    abstract static class OrNode extends PythonBinaryBuiltinNode {
        +    abstract static class OrNode extends BinaryOpBuiltinNode {
                 @Specialization
                 static Object union(Object self, Object other,
                                 @Cached GenericTypeNodes.UnionTypeOrNode orNode) {
        @@ -207,7 +220,7 @@ static Object union(Object self, Object other,
                 }
             }
         
        -    @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
             @GenerateNodeFactory
             abstract static class ReprNode extends PythonUnaryBuiltinNode {
                 private static final TruffleString SEPARATOR = tsLiteral(", ");
        @@ -247,9 +260,9 @@ private static void reprItem(TruffleStringBuilder sb, Object obj) {
                 }
             }
         
        -    @Builtin(name = J___HASH__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_hash, isComplex = true)
             @GenerateNodeFactory
        -    abstract static class HashNode extends PythonUnaryBuiltinNode {
        +    abstract static class HashNode extends HashBuiltinNode {
                 @Specialization
                 static long hash(VirtualFrame frame, PGenericAlias self,
                                 @Bind("this") Node inliningTarget,
        @@ -261,7 +274,8 @@ static long hash(VirtualFrame frame, PGenericAlias self,
                 }
             }
         
        -    @Builtin(name = J___CALL__, minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
        +    @Slot(value = SlotKind.tp_call, isComplex = true)
        +    @SlotSignature(minNumOfPositionalArgs = 1, takesVarArgs = true, takesVarKeywordArgs = true)
             @GenerateNodeFactory
             abstract static class CallMethodNode extends PythonVarargsBuiltinNode {
                 @Specialization
        @@ -310,23 +324,26 @@ static Object getattribute(VirtualFrame frame, PGenericAlias self, Object nameOb
                 }
             }
         
        -    @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2)
        +    @Slot(value = SlotKind.tp_richcompare, isComplex = true)
             @GenerateNodeFactory
        -    abstract static class EqNode extends PythonBinaryBuiltinNode {
        -        @Specialization
        -        static boolean eq(VirtualFrame frame, PGenericAlias self, PGenericAlias other,
        +    abstract static class EqNode extends RichCmpBuiltinNode {
        +        @Specialization(guards = "op.isEqOrNe()")
        +        static boolean eq(VirtualFrame frame, PGenericAlias self, PGenericAlias other, RichCmpOp op,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached PyObjectRichCompareBool.EqNode eqOrigin,
        -                        @Cached PyObjectRichCompareBool.EqNode eqArgs) {
        +                        @Cached PyObjectRichCompareBool eqOrigin,
        +                        @Cached PyObjectRichCompareBool eqArgs) {
                     if (self.isStarred() != other.isStarred()) {
        -                return false;
        +                return op.isNe();
        +            }
        +            if (!eqOrigin.executeEq(frame, inliningTarget, self.getOrigin(), other.getOrigin())) {
        +                return op.isNe();
                     }
        -            return eqOrigin.compare(frame, inliningTarget, self.getOrigin(), other.getOrigin()) && eqArgs.compare(frame, inliningTarget, self.getArgs(), other.getArgs());
        +            return eqArgs.executeEq(frame, inliningTarget, self.getArgs(), other.getArgs()) == op.isEq();
                 }
         
                 @Fallback
                 @SuppressWarnings("unused")
        -        static Object eq(Object self, Object other) {
        +        static Object eq(Object self, Object other, RichCmpOp op) {
                     return PNotImplemented.NOT_IMPLEMENTED;
                 }
             }
        @@ -336,8 +353,8 @@ static Object eq(Object self, Object other) {
             abstract static class MroEntriesNode extends PythonBinaryBuiltinNode {
                 @Specialization
                 static Object mro(PGenericAlias self, @SuppressWarnings("unused") Object bases,
        -                        @Cached PythonObjectFactory factory) {
        -            return factory.createTuple(new Object[]{self.getOrigin()});
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createTuple(language, new Object[]{self.getOrigin()});
                 }
             }
         
        @@ -347,8 +364,8 @@ abstract static class InstanceCheckNode extends PythonBinaryBuiltinNode {
                 @Specialization
                 @SuppressWarnings("unused")
                 static Object check(PGenericAlias self, Object other,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(TypeError, ErrorMessages.ISINSTANCE_ARG_2_CANNOT_BE_A_PARAMETERIZED_GENERIC);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.ISINSTANCE_ARG_2_CANNOT_BE_A_PARAMETERIZED_GENERIC);
                 }
             }
         
        @@ -358,8 +375,8 @@ abstract static class SubclassCheckNode extends PythonBinaryBuiltinNode {
                 @Specialization
                 @SuppressWarnings("unused")
                 static Object check(PGenericAlias self, Object other,
        -                        @Cached PRaiseNode raiseNode) {
        -            throw raiseNode.raise(TypeError, ErrorMessages.ISSUBCLASS_ARG_2_CANNOT_BE_A_PARAMETERIZED_GENERIC);
        +                        @Bind("this") Node inliningTarget) {
        +            throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.ISSUBCLASS_ARG_2_CANNOT_BE_A_PARAMETERIZED_GENERIC);
                 }
             }
         
        @@ -372,16 +389,16 @@ static Object reduce(VirtualFrame frame, PGenericAlias self,
                                 @Cached GetClassNode getClassNode,
                                 @Cached PyObjectGetIter getIter,
                                 @Cached PyObjectGetAttr getAttr,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     if (self.isStarred()) {
        -                PGenericAlias copy = factory.createGenericAlias(self.getOrigin(), self.getArgs());
        +                PGenericAlias copy = PFactory.createGenericAlias(language, self.getOrigin(), self.getArgs());
                         PythonModule builtins = PythonContext.get(inliningTarget).getBuiltins();
                         Object next = getAttr.execute(frame, inliningTarget, builtins, T_NEXT);
        -                Object args = factory.createTuple(new Object[]{getIter.execute(frame, inliningTarget, copy)});
        -                return factory.createTuple(new Object[]{next, args});
        +                Object args = PFactory.createTuple(language, new Object[]{getIter.execute(frame, inliningTarget, copy)});
        +                return PFactory.createTuple(language, new Object[]{next, args});
                     }
        -            Object args = factory.createTuple(new Object[]{self.getOrigin(), self.getArgs()});
        -            return factory.createTuple(new Object[]{getClassNode.execute(inliningTarget, self), args});
        +            Object args = PFactory.createTuple(language, new Object[]{self.getOrigin(), self.getArgs()});
        +            return PFactory.createTuple(language, new Object[]{getClassNode.execute(inliningTarget, self), args});
                 }
             }
         
        @@ -411,13 +428,13 @@ abstract static class GetItemNode extends MpSubscriptBuiltinNode {
                 @Specialization
                 static Object getitem(PGenericAlias self, Object item,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     if (self.getParameters() == null) {
        -                self.setParameters(factory.createTuple(GenericTypeNodes.makeParameters(self.getArgs())));
        +                self.setParameters(PFactory.createTuple(language, GenericTypeNodes.makeParameters(self.getArgs())));
                     }
                     Object[] newargs = GenericTypeNodes.subsParameters(inliningTarget, self, self.getArgs(), self.getParameters(), item);
        -            PTuple newargsTuple = factory.createTuple(newargs);
        -            return factory.createGenericAlias(self.getOrigin(), newargsTuple, self.isStarred());
        +            PTuple newargsTuple = PFactory.createTuple(language, newargs);
        +            return PFactory.createGenericAlias(language, self.getOrigin(), newargsTuple, self.isStarred());
                 }
             }
         
        @@ -435,13 +452,13 @@ static Object get(PGenericAlias self,
                 }
             }
         
        -    @Builtin(name = J___ITER__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iter, isComplex = true)
             @GenerateNodeFactory
             abstract static class IterNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static Object iter(PGenericAlias self,
        -                        @Cached PythonObjectFactory factory) {
        -            return factory.createGenericAliasIterator(self);
        +                        @Bind PythonLanguage language) {
        +            return PFactory.createGenericAliasIterator(language, self);
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/types/GenericAliasIteratorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/types/GenericAliasIteratorBuiltins.java
        index 9904ac8ec5..a1baec9e90 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/types/GenericAliasIteratorBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/types/GenericAliasIteratorBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -41,22 +41,25 @@
         package com.oracle.graal.python.builtins.objects.types;
         
         import static com.oracle.graal.python.nodes.BuiltinNames.T_ITER;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___NEXT__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
        +import com.oracle.graal.python.annotations.Slot;
        +import com.oracle.graal.python.annotations.Slot.SlotKind;
         import com.oracle.graal.python.builtins.Builtin;
         import com.oracle.graal.python.builtins.CoreFunctions;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.PythonBuiltins;
         import com.oracle.graal.python.builtins.objects.module.PythonModule;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
         import com.oracle.graal.python.lib.PyObjectGetAttr;
        -import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
         import com.oracle.graal.python.runtime.PythonContext;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.truffle.api.dsl.Bind;
         import com.oracle.truffle.api.dsl.Cached;
         import com.oracle.truffle.api.dsl.GenerateNodeFactory;
        @@ -67,23 +70,25 @@
         
         @CoreFunctions(extendClasses = PythonBuiltinClassType.PGenericAliasIterator)
         public final class GenericAliasIteratorBuiltins extends PythonBuiltins {
        +
        +    public static final TpSlots SLOTS = GenericAliasIteratorBuiltinsSlotsGen.SLOTS;
        +
             @Override
             protected List> getNodeFactories() {
                 return GenericAliasIteratorBuiltinsFactory.getFactories();
             }
         
        -    @Builtin(name = J___NEXT__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_iternext, isComplex = true)
             @GenerateNodeFactory
        -    abstract static class NextNode extends PythonUnaryBuiltinNode {
        +    abstract static class NextNode extends TpIterNextBuiltin {
                 @Specialization
                 static Object next(PGenericAliasIterator self,
        -                        @Cached PRaiseNode raiseNode,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     if (self.isExhausted()) {
        -                throw raiseNode.raise(PythonBuiltinClassType.StopIteration);
        +                throw iteratorExhausted();
                     }
                     PGenericAlias alias = self.getObj();
        -            PGenericAlias starredAlias = factory.createGenericAlias(alias.getOrigin(), alias.getArgs(), true);
        +            PGenericAlias starredAlias = PFactory.createGenericAlias(language, alias.getOrigin(), alias.getArgs(), true);
                     self.markExhausted();
                     return starredAlias;
                 }
        @@ -96,16 +101,16 @@ abstract static class ReduceNode extends PythonUnaryBuiltinNode {
                 static Object reduce(VirtualFrame frame, PGenericAliasIterator self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached PyObjectGetAttr getAttr,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     PythonModule builtins = PythonContext.get(inliningTarget).getBuiltins();
                     Object iter = getAttr.execute(frame, inliningTarget, builtins, T_ITER);
                     Object[] args;
                     if (!self.isExhausted()) {
                         args = new Object[]{self.getObj()};
                     } else {
        -                args = new Object[]{factory.createEmptyTuple()};
        +                args = new Object[]{PFactory.createEmptyTuple(language)};
                     }
        -            return factory.createTuple(new Object[]{iter, factory.createTuple(args)});
        +            return PFactory.createTuple(language, new Object[]{iter, PFactory.createTuple(language, args)});
                 }
             }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/types/GenericTypeNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/types/GenericTypeNodes.java
        index 844b9d7b1f..fcc9ea419d 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/types/GenericTypeNodes.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/types/GenericTypeNodes.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -52,13 +52,14 @@
         import java.util.Arrays;
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.builtins.PythonBuiltinClassType;
         import com.oracle.graal.python.builtins.objects.PNone;
         import com.oracle.graal.python.builtins.objects.PNotImplemented;
         import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
         import com.oracle.graal.python.builtins.objects.ellipsis.PEllipsis;
         import com.oracle.graal.python.builtins.objects.tuple.PTuple;
        -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot;
        +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode;
         import com.oracle.graal.python.builtins.objects.type.TypeNodes;
         import com.oracle.graal.python.lib.PyObjectGetItem;
         import com.oracle.graal.python.lib.PyObjectIsTrueNode;
        @@ -72,12 +73,10 @@
         import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PNodeWithContext;
         import com.oracle.graal.python.nodes.PRaiseNode;
        -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode;
         import com.oracle.graal.python.nodes.call.CallNode;
         import com.oracle.graal.python.nodes.object.GetClassNode;
         import com.oracle.graal.python.nodes.object.IsNode;
        -import com.oracle.graal.python.runtime.PythonContext;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
         import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
         import com.oracle.truffle.api.dsl.Bind;
        @@ -124,7 +123,7 @@ static void reprItem(TruffleStringBuilder sb, Object obj) {
                     Object module = lookup.execute(null, null, obj, T___MODULE__);
                     if (!(module instanceof PNone)) {
                         // Looks like a class
        -                if (PyUnicodeCheckNode.executeUncached(module) && PyObjectRichCompareBool.EqNode.compareUncached(module, BuiltinNames.T_BUILTINS)) {
        +                if (PyUnicodeCheckNode.executeUncached(module) && PyObjectRichCompareBool.executeEqUncached(module, BuiltinNames.T_BUILTINS)) {
                             // builtins don't need a module name
                             sb.appendStringUncached(str.execute(null, null, qualname));
                             return;
        @@ -264,24 +263,24 @@ private static void unpackArgsInner(List newargs, Object item) {
             // Equivalent of _Py_subs_parameters
             @TruffleBoundary
             static Object[] subsParameters(Node node, Object self, PTuple args, PTuple parameters, Object item) {
        +        PythonLanguage language = PythonLanguage.get(null);
                 SequenceStorage paramsStorage = parameters.getSequenceStorage();
                 int nparams = paramsStorage.length();
                 if (nparams == 0) {
        -            throw PRaiseNode.raiseUncached(node, TypeError, ErrorMessages.S_IS_NOT_A_GENERIC_CLASS, PyObjectReprAsTruffleStringNode.executeUncached(self));
        +            throw PRaiseNode.raiseStatic(node, TypeError, ErrorMessages.S_IS_NOT_A_GENERIC_CLASS, PyObjectReprAsTruffleStringNode.executeUncached(self));
                 }
                 Object[] argitems = unpackArgs(item);
                 for (int i = 0; i < nparams; i++) {
                     Object param = getItemUncached(paramsStorage, i);
                     Object prepare = PyObjectLookupAttr.executeUncached(param, T___TYPING_PREPARE_SUBST__);
                     if (!(prepare instanceof PNone)) {
        -                Object itemarg = item instanceof PTuple ? item : PythonContext.get(node).factory().createTuple(new Object[]{item});
        +                Object itemarg = item instanceof PTuple ? item : PFactory.createTuple(language, new Object[]{item});
                         item = CallNode.executeUncached(prepare, self, itemarg);
                     }
                 }
                 if (argitems.length != nparams) {
        -            throw PRaiseNode.raiseUncached(node, TypeError, ErrorMessages.TOO_S_ARGUMENTS_FOR_S_ACTUAL_D_EXPECTED_D,
        -                            argitems.length > nparams ? "many" : "few", PyObjectReprAsTruffleStringNode.executeUncached(self),
        -                            argitems.length, nparams);
        +            throw PRaiseNode.raiseStatic(node, TypeError, ErrorMessages.TOO_S_ARGUMENTS_FOR_S_ACTUAL_D_EXPECTED_D, argitems.length > nparams ? "many" : "few",
        +                            PyObjectReprAsTruffleStringNode.executeUncached(self), argitems.length, nparams);
                 }
                 SequenceStorage argsStorage = args.getSequenceStorage();
                 List newargs = new ArrayList<>(argsStorage.length());
        @@ -298,7 +297,7 @@ static Object[] subsParameters(Node node, Object self, PTuple args, PTuple param
                         assert iparam >= 0;
                         arg = CallNode.executeUncached(subst, argitems[iparam]);
                     } else {
        -                arg = subsTvars(node, arg, parameters, argitems);
        +                arg = subsTvars(arg, parameters, argitems);
                     }
                     if (unpack && arg instanceof PTuple tuple /* CPython doesn't check the cast?! */) {
                         listExtend(newargs, tuple);
        @@ -310,7 +309,7 @@ static Object[] subsParameters(Node node, Object self, PTuple args, PTuple param
             }
         
             @TruffleBoundary
        -    private static Object subsTvars(Node node, Object obj, PTuple parameters, Object[] argitems) {
        +    private static Object subsTvars(Object obj, PTuple parameters, Object[] argitems) {
                 Object subparams = PyObjectLookupAttr.executeUncached(obj, T___PARAMETERS__);
                 if (subparams instanceof PTuple tuple && tuple.getSequenceStorage().length() > 0) {
                     SequenceStorage subparamsStorage = tuple.getSequenceStorage();
        @@ -324,14 +323,14 @@ private static Object subsTvars(Node node, Object obj, PTuple parameters, Object
                             // TypeVarTuple
                             if (arg instanceof PTuple tuple1) {
                                 Object paramType = GetClassNode.executeUncached(param);
        -                        if (LookupCallableSlotInMRONode.getUncached(SpecialMethodSlot.Iter).execute(paramType) != PNone.NO_VALUE) {
        +                        if (GetObjectSlotsNode.executeUncached(paramType).tp_iter() != null) {
                                     listExtend(subargs, tuple1);
                                 }
                             }
                         }
                         subargs.add(arg);
                     }
        -            PTuple subargsTuple = PythonContext.get(node).factory().createTuple(subargs.toArray());
        +            PTuple subargsTuple = PFactory.createTuple(PythonLanguage.get(null), subargs.toArray());
                     obj = PyObjectGetItem.executeUncached(obj, subargsTuple);
                 }
                 return obj;
        @@ -345,13 +344,13 @@ public abstract static class UnionTypeOrNode extends PNodeWithContext {
                 static Object union(Object self, Object other,
                                 @SuppressWarnings("unused") @Bind("this") Node inliningTarget,
                                 @SuppressWarnings("unused") @Cached PyObjectTypeCheck typeCheck,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     Object[] args = dedupAndFlattenArgs(new Object[]{self, other});
                     if (args.length == 1) {
                         return args[0];
                     }
                     assert args.length > 1;
        -            return factory.createUnionType(args);
        +            return PFactory.createUnionType(language, args);
                 }
         
                 @Fallback
        @@ -369,7 +368,7 @@ protected static boolean isUnionable(Node inliningTarget, PyObjectTypeCheck type
             @TruffleBoundary
             private static Object[] dedupAndFlattenArgs(Object[] args) {
                 args = flattenArgs(args);
        -        PyObjectRichCompareBool.EqNode eq = PyObjectRichCompareBool.EqNode.getUncached();
        +        PyObjectRichCompareBool eq = PyObjectRichCompareBool.getUncached();
                 Object[] newArgs = new Object[args.length];
                 int addedItems = 0;
                 for (int i = 0; i < args.length; i++) {
        @@ -379,7 +378,7 @@ private static Object[] dedupAndFlattenArgs(Object[] args) {
                         Object jElement = newArgs[j];
                         boolean isGA = iElement instanceof PGenericAlias && jElement instanceof PGenericAlias;
                         // RichCompare to also deduplicate GenericAlias types (slower)
        -                isDuplicate = isGA ? eq.compare(null, null, iElement, jElement) : IsNode.getUncached().execute(iElement, jElement);
        +                isDuplicate = isGA ? eq.executeEq(null, null, iElement, jElement) : IsNode.getUncached().execute(iElement, jElement);
                         if (isDuplicate) {
                             break;
                         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/types/UnionTypeBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/types/UnionTypeBuiltins.java
        index 0b4fdb69c2..a39de9cde7 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/types/UnionTypeBuiltins.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/types/UnionTypeBuiltins.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -44,18 +44,14 @@
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___ARGS__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___PARAMETERS__;
         import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___MODULE__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___EQ__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___HASH__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INSTANCECHECK__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OR__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REPR__;
        -import static com.oracle.graal.python.nodes.SpecialMethodNames.J___ROR__;
         import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SUBCLASSCHECK__;
         import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
         import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
         
         import java.util.List;
         
        +import com.oracle.graal.python.PythonLanguage;
         import com.oracle.graal.python.annotations.Slot;
         import com.oracle.graal.python.annotations.Slot.SlotKind;
         import com.oracle.graal.python.builtins.Builtin;
        @@ -72,22 +68,25 @@
         import com.oracle.graal.python.builtins.objects.type.TypeNodes;
         import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.MpSubscriptBuiltinNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpBuiltinNode;
         import com.oracle.graal.python.builtins.objects.type.slots.TpSlotGetAttr.GetAttrBuiltinNode;
        +import com.oracle.graal.python.lib.PyNumberOrNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.HashBuiltinNode;
        +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare.RichCmpBuiltinNode;
        +import com.oracle.graal.python.lib.RichCmpOp;
         import com.oracle.graal.python.lib.PyObjectGetAttr;
         import com.oracle.graal.python.lib.PyObjectHashNode;
         import com.oracle.graal.python.lib.PyObjectRichCompareBool;
         import com.oracle.graal.python.nodes.ErrorMessages;
         import com.oracle.graal.python.nodes.PRaiseNode;
         import com.oracle.graal.python.nodes.StringLiterals;
        -import com.oracle.graal.python.nodes.expression.BinaryArithmetic;
        -import com.oracle.graal.python.nodes.expression.BinaryOpNode;
         import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
         import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
         import com.oracle.graal.python.nodes.object.GetClassNode;
         import com.oracle.graal.python.nodes.util.CannotCastException;
         import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
        +import com.oracle.graal.python.runtime.object.PFactory;
         import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
         import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
         import com.oracle.truffle.api.dsl.Bind;
        @@ -98,6 +97,7 @@
         import com.oracle.truffle.api.dsl.Specialization;
         import com.oracle.truffle.api.frame.VirtualFrame;
         import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.profiles.InlinedBranchProfile;
         import com.oracle.truffle.api.strings.TruffleString;
         import com.oracle.truffle.api.strings.TruffleStringBuilder;
         
        @@ -124,18 +124,17 @@ Object args(PUnionType self) {
             abstract static class ParametersNode extends PythonUnaryBuiltinNode {
                 @Specialization
                 static Object parameters(PUnionType self,
        -                        @Cached PythonObjectFactory factory) {
        +                        @Bind PythonLanguage language) {
                     if (self.getParameters() == null) {
        -                self.setParameters(factory.createTuple(GenericTypeNodes.makeParameters(self.getArgs())));
        +                self.setParameters(PFactory.createTuple(language, GenericTypeNodes.makeParameters(self.getArgs())));
                     }
                     return self.getParameters();
                 }
             }
         
        -    @Builtin(name = J___OR__, minNumOfPositionalArgs = 2)
        -    @Builtin(name = J___ROR__, minNumOfPositionalArgs = 2, reverseOperation = true)
        +    @Slot(value = SlotKind.nb_or, isComplex = true)
             @GenerateNodeFactory
        -    abstract static class OrNode extends PythonBinaryBuiltinNode {
        +    abstract static class OrNode extends BinaryOpBuiltinNode {
                 @Specialization
                 Object union(Object self, Object other,
                                 @Cached GenericTypeNodes.UnionTypeOrNode orNode) {
        @@ -143,7 +142,7 @@ Object union(Object self, Object other,
                 }
             }
         
        -    @Builtin(name = J___REPR__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_repr, isComplex = true)
             @GenerateNodeFactory
             abstract static class ReprNode extends PythonUnaryBuiltinNode {
                 private static final TruffleString SEPARATOR = tsLiteral(" | ");
        @@ -172,16 +171,16 @@ private static void reprItem(TruffleStringBuilder sb, Object obj) {
                 }
             }
         
        -    @Builtin(name = J___HASH__, minNumOfPositionalArgs = 1)
        +    @Slot(value = SlotKind.tp_hash, isComplex = true)
             @GenerateNodeFactory
        -    abstract static class HashNode extends PythonUnaryBuiltinNode {
        +    abstract static class HashNode extends HashBuiltinNode {
                 @Specialization
                 static long hash(VirtualFrame frame, PUnionType self,
                                 @Bind("this") Node inliningTarget,
                                 @Cached PyObjectHashNode hashNode,
                                 @Cached HashingCollectionNodes.GetClonedHashingStorageNode getHashingStorageNode,
        -                        @Cached PythonObjectFactory factory) {
        -            PFrozenSet argSet = factory.createFrozenSet(getHashingStorageNode.doNoValue(frame, inliningTarget, self.getArgs()));
        +                        @Bind PythonLanguage language) {
        +            PFrozenSet argSet = PFactory.createFrozenSet(language, getHashingStorageNode.getForSets(frame, inliningTarget, self.getArgs()));
                     return hashNode.execute(frame, inliningTarget, argSet);
                 }
             }
        @@ -219,13 +218,13 @@ static boolean check(VirtualFrame frame, PUnionType self, Object other,
                                 @Bind("this") Node inliningTarget,
                                 @Cached SequenceStorageNodes.GetItemScalarNode getItem,
                                 @Cached BuiltinFunctions.IsInstanceNode isInstanceNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     SequenceStorage argsStorage = self.getArgs().getSequenceStorage();
                     boolean result = false;
                     for (int i = 0; i < argsStorage.length(); i++) {
                         Object arg = getItem.execute(inliningTarget, argsStorage, i);
                         if (arg instanceof PGenericAlias) {
        -                    throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.ISINSTANCE_ARG_2_CANNOT_CONTAIN_A_PARAMETERIZED_GENERIC);
        +                    throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ISINSTANCE_ARG_2_CANNOT_CONTAIN_A_PARAMETERIZED_GENERIC);
                         }
                         if (!result) {
                             result = isInstanceNode.executeWith(frame, other, arg);
        @@ -245,16 +244,16 @@ static boolean check(VirtualFrame frame, PUnionType self, Object other,
                                 @Cached TypeNodes.IsTypeNode isTypeNode,
                                 @Cached SequenceStorageNodes.GetItemScalarNode getItem,
                                 @Cached BuiltinFunctions.IsSubClassNode isSubClassNode,
        -                        @Cached PRaiseNode.Lazy raiseNode) {
        +                        @Cached PRaiseNode raiseNode) {
                     if (!isTypeNode.execute(inliningTarget, other)) {
        -                throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.ISSUBCLASS_ARG_1_MUST_BE_A_CLASS);
        +                throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ISSUBCLASS_ARG_1_MUST_BE_A_CLASS);
                     }
                     SequenceStorage argsStorage = self.getArgs().getSequenceStorage();
                     boolean result = false;
                     for (int i = 0; i < argsStorage.length(); i++) {
                         Object arg = getItem.execute(inliningTarget, argsStorage, i);
                         if (arg instanceof PGenericAlias) {
        -                    throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.ISSUBCLASS_ARG_2_CANNOT_CONTAIN_A_PARAMETERIZED_GENERIC);
        +                    throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ISSUBCLASS_ARG_2_CANNOT_CONTAIN_A_PARAMETERIZED_GENERIC);
                         }
                         if (!result) {
                             result = isSubClassNode.executeWith(frame, other, arg);
        @@ -265,23 +264,23 @@ static boolean check(VirtualFrame frame, PUnionType self, Object other,
                 }
             }
         
        -    @Builtin(name = J___EQ__, minNumOfPositionalArgs = 2)
        +    @Slot(value = SlotKind.tp_richcompare, isComplex = true)
             @GenerateNodeFactory
        -    abstract static class EqNode extends PythonBinaryBuiltinNode {
        -        @Specialization
        -        static boolean eq(VirtualFrame frame, PUnionType self, PUnionType other,
        +    abstract static class EqNode extends RichCmpBuiltinNode {
        +        @Specialization(guards = "op.isEqOrNe()")
        +        static boolean eq(VirtualFrame frame, PUnionType self, PUnionType other, RichCmpOp op,
                                 @Bind("this") Node inliningTarget,
                                 @Cached HashingCollectionNodes.GetClonedHashingStorageNode getHashingStorageNode,
        -                        @Cached PyObjectRichCompareBool.EqNode eqNode,
        -                        @Cached PythonObjectFactory factory) {
        -            PFrozenSet argSet1 = factory.createFrozenSet(getHashingStorageNode.doNoValue(frame, inliningTarget, self.getArgs()));
        -            PFrozenSet argSet2 = factory.createFrozenSet(getHashingStorageNode.doNoValue(frame, inliningTarget, other.getArgs()));
        -            return eqNode.compare(frame, inliningTarget, argSet1, argSet2);
        +                        @Cached PyObjectRichCompareBool eqNode,
        +                        @Bind PythonLanguage language) {
        +            PFrozenSet argSet1 = PFactory.createFrozenSet(language, getHashingStorageNode.getForSets(frame, inliningTarget, self.getArgs()));
        +            PFrozenSet argSet2 = PFactory.createFrozenSet(language, getHashingStorageNode.getForSets(frame, inliningTarget, other.getArgs()));
        +            return eqNode.execute(frame, inliningTarget, argSet1, argSet2, op);
                 }
         
                 @Fallback
                 @SuppressWarnings("unused")
        -        Object eq(Object self, Object other) {
        +        Object eq(Object self, Object other, RichCmpOp op) {
                     return PNotImplemented.NOT_IMPLEMENTED;
                 }
             }
        @@ -289,19 +288,20 @@ Object eq(Object self, Object other) {
             @Slot(value = SlotKind.mp_subscript, isComplex = true)
             @GenerateNodeFactory
             abstract static class GetItemNode extends MpSubscriptBuiltinNode {
        -        @Child BinaryOpNode orNode = BinaryArithmetic.Or.create();
         
                 @Specialization
                 Object getitem(VirtualFrame frame, PUnionType self, Object item,
                                 @Bind("this") Node inliningTarget,
        -                        @Cached PythonObjectFactory.Lazy factory) {
        +                        @Cached InlinedBranchProfile createProfile,
        +                        @Cached PyNumberOrNode orNode) {
                     if (self.getParameters() == null) {
        -                self.setParameters(factory.get(inliningTarget).createTuple(GenericTypeNodes.makeParameters(self.getArgs())));
        +                createProfile.enter(inliningTarget);
        +                self.setParameters(PFactory.createTuple(PythonLanguage.get(inliningTarget), GenericTypeNodes.makeParameters(self.getArgs())));
                     }
                     Object[] newargs = GenericTypeNodes.subsParameters(this, self, self.getArgs(), self.getParameters(), item);
                     Object result = newargs[0];
                     for (int i = 1; i < newargs.length; i++) {
        -                result = orNode.executeObject(frame, result, newargs[i]);
        +                result = orNode.execute(frame, result, newargs[i]);
                     }
                     return result;
                 }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/BytecodeCodeUnit.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/BytecodeCodeUnit.java
        new file mode 100644
        index 0000000000..8e4c3acede
        --- /dev/null
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/BytecodeCodeUnit.java
        @@ -0,0 +1,685 @@
        +/*
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
        + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
        + *
        + * The Universal Permissive License (UPL), Version 1.0
        + *
        + * Subject to the condition set forth below, permission is hereby granted to any
        + * person obtaining a copy of this software, associated documentation and/or
        + * data (collectively the "Software"), free of charge and under any and all
        + * copyright rights in the Software, and any and all patent rights owned or
        + * freely licensable by each licensor hereunder covering either (i) the
        + * unmodified Software as contributed to or provided by such licensor, or (ii)
        + * the Larger Works (as defined below), to deal in both
        + *
        + * (a) the Software, and
        + *
        + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
        + * one is included with the Software each a "Larger Work" to which the Software
        + * is contributed by such licensors),
        + *
        + * without restriction, including without limitation the rights to copy, create
        + * derivative works of, display, perform, and distribute the Software and make,
        + * use, sell, offer for sale, import, export, have made, and have sold the
        + * Software and the Larger Work(s), and to sublicense the foregoing rights on
        + * either these or other terms.
        + *
        + * This license is subject to the following condition:
        + *
        + * The above copyright notice and either this complete permission notice or at a
        + * minimum a reference to the UPL must be included in all copies or substantial
        + * portions of the Software.
        + *
        + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        + * SOFTWARE.
        + */
        +package com.oracle.graal.python.compiler;
        +
        +import java.util.ArrayDeque;
        +import java.util.ArrayList;
        +import java.util.Arrays;
        +import java.util.Collections;
        +import java.util.HashMap;
        +import java.util.List;
        +import java.util.Objects;
        +
        +import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        +import com.oracle.graal.python.builtins.objects.bytes.BytesUtils;
        +import com.oracle.graal.python.builtins.objects.code.PCode;
        +import com.oracle.graal.python.builtins.objects.str.StringNodes;
        +import com.oracle.graal.python.compiler.OpCodes.CollectionBits;
        +import com.oracle.graal.python.nodes.ErrorMessages;
        +import com.oracle.graal.python.nodes.PRaiseNode;
        +import com.oracle.graal.python.util.PythonUtils;
        +import com.oracle.truffle.api.CompilerDirectives;
        +import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
        +import com.oracle.truffle.api.nodes.Node;
        +import com.oracle.truffle.api.strings.TruffleString;
        +
        +public final class BytecodeCodeUnit extends CodeUnit {
        +    private static final int DISASSEMBLY_NUM_COLUMNS = 8;
        +
        +    // Note this is being mutated when quickening
        +    @CompilationFinal(dimensions = 1) public final byte[] code;
        +    @CompilationFinal(dimensions = 1) public final byte[] srcOffsetTable;
        +    @CompilationFinal(dimensions = 1) public final long[] primitiveConstants;
        +    @CompilationFinal(dimensions = 1) public final int[] exceptionHandlerRanges;
        +    public final int stacksize;
        +    public final int conditionProfileCount;
        +
        +    /* Quickening data. See docs in PBytecodeRootNode */
        +    @CompilationFinal(dimensions = 1) public final byte[] outputCanQuicken;
        +    @CompilationFinal(dimensions = 1) public final byte[] variableShouldUnbox;
        +    @CompilationFinal(dimensions = 1) public final int[][] generalizeInputsMap;
        +    @CompilationFinal(dimensions = 1) public final int[][] generalizeVarsMap;
        +
        +    /* Lazily initialized source map */
        +    @CompilationFinal SourceMap sourceMap;
        +
        +    public BytecodeCodeUnit(TruffleString name, TruffleString qualname,
        +                    int argCount, int kwOnlyArgCount, int positionalOnlyArgCount, int flags,
        +                    TruffleString[] names, TruffleString[] varnames, TruffleString[] cellvars,
        +                    TruffleString[] freevars, int[] cell2arg, Object[] constants, int startLine, int startColumn,
        +                    int endLine, int endColumn,
        +                    byte[] code, byte[] linetable,
        +                    long[] primitiveConstants, int[] exceptionHandlerRanges, int stacksize, int conditionProfileCount,
        +                    byte[] outputCanQuicken, byte[] variableShouldUnbox, int[][] generalizeInputsMap, int[][] generalizeVarsMap) {
        +        super(name, qualname, argCount, kwOnlyArgCount, positionalOnlyArgCount, flags, names, varnames, cellvars, freevars, cell2arg, constants, startLine, startColumn, endLine, endColumn);
        +        this.code = code;
        +        this.srcOffsetTable = linetable;
        +        this.primitiveConstants = primitiveConstants;
        +        this.exceptionHandlerRanges = exceptionHandlerRanges;
        +        this.stacksize = stacksize;
        +        this.conditionProfileCount = conditionProfileCount;
        +        this.outputCanQuicken = outputCanQuicken;
        +        this.variableShouldUnbox = variableShouldUnbox;
        +        this.generalizeInputsMap = generalizeInputsMap;
        +        this.generalizeVarsMap = generalizeVarsMap;
        +    }
        +
        +    public SourceMap getSourceMap() {
        +        if (sourceMap == null) {
        +            CompilerDirectives.transferToInterpreterAndInvalidate();
        +            sourceMap = new SourceMap(code, srcOffsetTable, startLine, startColumn);
        +        }
        +        return sourceMap;
        +    }
        +
        +    public int bciToLine(int bci) {
        +        if (bci < 0 || bci >= code.length) {
        +            return -1;
        +        }
        +        return getSourceMap().startLineMap[bci];
        +    }
        +
        +    public int bciToColumn(int bci) {
        +        if (bci < 0 || bci >= code.length) {
        +            return -1;
        +        }
        +        return getSourceMap().startColumnMap[bci];
        +    }
        +
        +    @Override
        +    protected void dumpBytecode(StringBuilder sb, boolean quickened) {
        +        int bci = 0;
        +        int oparg = 0;
        +        SourceMap map = getSourceMap();
        +        HashMap lines = new HashMap<>();
        +        while (bci < code.length) {
        +            int bcBCI = bci;
        +            OpCodes opcode = OpCodes.fromOpCode(code[bci++]);
        +
        +            if (!quickened) {
        +                opcode = unquicken(opcode);
        +            }
        +
        +            String[] line = lines.computeIfAbsent(bcBCI, k -> new String[DISASSEMBLY_NUM_COLUMNS]);
        +            line[0] = String.format("%3d:%-3d - %3d:%-3d", map.startLineMap[bcBCI], map.startColumnMap[bcBCI], map.endLineMap[bcBCI], map.endColumnMap[bcBCI]);
        +            if (line[1] == null) {
        +                line[1] = "";
        +            }
        +            line[2] = String.valueOf(bcBCI);
        +            line[3] = opcode.toString();
        +            byte[] followingArgs = PythonUtils.EMPTY_BYTE_ARRAY;
        +            if (!opcode.hasArg()) {
        +                line[4] = "";
        +            } else {
        +                oparg |= Byte.toUnsignedInt(code[bci++]);
        +                if (opcode.argLength > 1) {
        +                    followingArgs = new byte[opcode.argLength - 1];
        +                    for (int i = 0; i < opcode.argLength - 1; i++) {
        +                        followingArgs[i] = code[bci++];
        +                    }
        +                }
        +                line[4] = String.format("% 2d", oparg);
        +            }
        +
        +            while (true) {
        +                switch (opcode) {
        +                    case EXTENDED_ARG:
        +                        line[4] = "";
        +                        break;
        +                    case LOAD_BYTE:
        +                        line[4] = String.format("% 2d", (byte) oparg);
        +                        break;
        +                    case LOAD_CONST:
        +                    case LOAD_BIGINT:
        +                    case LOAD_STRING:
        +                    case LOAD_BYTES:
        +                    case LOAD_CONST_COLLECTION:
        +                    case MAKE_KEYWORD: {
        +                        Object constant = constants[oparg];
        +                        if (constant instanceof CodeUnit) {
        +                            line[5] = ((CodeUnit) constant).qualname.toJavaStringUncached();
        +                        } else {
        +                            if (constant instanceof TruffleString) {
        +                                line[5] = StringNodes.StringReprNode.getUncached().execute((TruffleString) constant).toJavaStringUncached();
        +                            } else if (constant instanceof byte[]) {
        +                                byte[] bytes = (byte[]) constant;
        +                                line[5] = BytesUtils.bytesRepr(bytes, bytes.length);
        +                            } else if (constant instanceof int[]) {
        +                                line[5] = Arrays.toString((int[]) constant);
        +                            } else if (constant instanceof long[]) {
        +                                line[5] = Arrays.toString((long[]) constant);
        +                            } else if (constant instanceof boolean[]) {
        +                                line[5] = Arrays.toString((boolean[]) constant);
        +                            } else if (constant instanceof double[]) {
        +                                line[5] = Arrays.toString((double[]) constant);
        +                            } else if (constant instanceof Object[]) {
        +                                line[5] = Arrays.toString((Object[]) constant);
        +                            } else {
        +                                line[5] = Objects.toString(constant);
        +                            }
        +                        }
        +                        if (opcode == OpCodes.LOAD_CONST_COLLECTION) {
        +                            line[5] += " type " + collectionTypeToString(followingArgs[0]) + " into " + collectionKindToString(followingArgs[0]);
        +                        }
        +                        break;
        +                    }
        +                    case MAKE_FUNCTION: {
        +                        line[4] = String.format("% 2d", followingArgs[0]);
        +                        CodeUnit codeUnit = (CodeUnit) constants[oparg];
        +                        line[5] = line[5] = codeUnit.qualname.toJavaStringUncached();
        +                        break;
        +                    }
        +                    case LOAD_INT:
        +                    case LOAD_LONG:
        +                        line[5] = Objects.toString(primitiveConstants[oparg]);
        +                        break;
        +                    case LOAD_DOUBLE:
        +                        line[5] = Objects.toString(Double.longBitsToDouble(primitiveConstants[oparg]));
        +                        break;
        +                    case LOAD_COMPLEX: {
        +                        double[] num = (double[]) constants[oparg];
        +                        if (num[0] == 0.0) {
        +                            line[5] = String.format("%gj", num[1]);
        +                        } else {
        +                            line[5] = String.format("%g%+gj", num[0], num[1]);
        +                        }
        +                        break;
        +                    }
        +                    case LOAD_CLOSURE:
        +                    case LOAD_DEREF:
        +                    case STORE_DEREF:
        +                    case DELETE_DEREF:
        +                        if (oparg >= cellvars.length) {
        +                            line[5] = freevars[oparg - cellvars.length].toJavaStringUncached();
        +                        } else {
        +                            line[5] = cellvars[oparg].toJavaStringUncached();
        +                        }
        +                        break;
        +                    case LOAD_FAST:
        +                    case STORE_FAST:
        +                    case DELETE_FAST:
        +                        line[5] = varnames[oparg].toJavaStringUncached();
        +                        break;
        +                    case LOAD_NAME:
        +                    case LOAD_METHOD:
        +                    case STORE_NAME:
        +                    case DELETE_NAME:
        +                    case IMPORT_NAME:
        +                    case IMPORT_FROM:
        +                    case LOAD_GLOBAL:
        +                    case STORE_GLOBAL:
        +                    case DELETE_GLOBAL:
        +                    case LOAD_ATTR:
        +                    case STORE_ATTR:
        +                    case DELETE_ATTR:
        +                        line[5] = names[oparg].toJavaStringUncached();
        +                        break;
        +                    case FORMAT_VALUE: {
        +                        int type = oparg & FormatOptions.FVC_MASK;
        +                        switch (type) {
        +                            case FormatOptions.FVC_STR:
        +                                line[5] = "STR";
        +                                break;
        +                            case FormatOptions.FVC_REPR:
        +                                line[5] = "REPR";
        +                                break;
        +                            case FormatOptions.FVC_ASCII:
        +                                line[5] = "ASCII";
        +                                break;
        +                            case FormatOptions.FVC_NONE:
        +                                line[5] = "NONE";
        +                                break;
        +                        }
        +                        if ((oparg & FormatOptions.FVS_MASK) == FormatOptions.FVS_HAVE_SPEC) {
        +                            line[5] += " + SPEC";
        +                        }
        +                        break;
        +                    }
        +                    case CALL_METHOD: {
        +                        line[4] = String.format("% 2d", oparg);
        +                        break;
        +                    }
        +                    case UNARY_OP:
        +                        line[5] = UnaryOps.values()[oparg].toString();
        +                        break;
        +                    case BINARY_OP:
        +                        line[5] = BinaryOps.values()[oparg].toString();
        +                        break;
        +                    case COLLECTION_FROM_STACK:
        +                    case COLLECTION_ADD_STACK:
        +                    case COLLECTION_FROM_COLLECTION:
        +                    case COLLECTION_ADD_COLLECTION:
        +                    case ADD_TO_COLLECTION:
        +                        line[4] = String.format("% 2d", CollectionBits.elementCount(oparg));
        +                        line[5] = collectionKindToString(oparg);
        +                        break;
        +                    case UNPACK_EX:
        +                        line[5] = String.format("%d, %d", oparg, Byte.toUnsignedInt(followingArgs[0]));
        +                        break;
        +                    case JUMP_BACKWARD:
        +                        lines.computeIfAbsent(bcBCI - oparg, k -> new String[DISASSEMBLY_NUM_COLUMNS])[1] = ">>";
        +                        line[5] = String.format("to %d", bcBCI - oparg);
        +                        break;
        +                    case FOR_ITER:
        +                    case JUMP_FORWARD:
        +                    case POP_AND_JUMP_IF_FALSE:
        +                    case POP_AND_JUMP_IF_TRUE:
        +                    case JUMP_IF_FALSE_OR_POP:
        +                    case JUMP_IF_TRUE_OR_POP:
        +                    case MATCH_EXC_OR_JUMP:
        +                    case SEND:
        +                    case THROW:
        +                        lines.computeIfAbsent(bcBCI + oparg, k -> new String[DISASSEMBLY_NUM_COLUMNS])[1] = ">>";
        +                        line[5] = String.format("to %d", bcBCI + oparg);
        +                        break;
        +                    default:
        +                        if (opcode.quickens != null) {
        +                            opcode = opcode.quickens;
        +                            continue;
        +                        }
        +                }
        +                if (opcode == OpCodes.EXTENDED_ARG) {
        +                    oparg <<= 8;
        +                } else {
        +                    oparg = 0;
        +                }
        +                break;
        +            }
        +        }
        +
        +        for (int i = 0; i < exceptionHandlerRanges.length; i += 4) {
        +            int start = exceptionHandlerRanges[i];
        +            int stop = exceptionHandlerRanges[i + 1];
        +            int handler = exceptionHandlerRanges[i + 2];
        +            int stackAtHandler = exceptionHandlerRanges[i + 3];
        +            String[] line = lines.get(handler);
        +            assert line != null;
        +            String handlerStr = String.format("exc handler %d - %d; stack: %d", start, stop, stackAtHandler);
        +            if (line[6] == null) {
        +                line[6] = handlerStr;
        +            } else {
        +                line[6] += " | " + handlerStr;
        +            }
        +        }
        +
        +        for (bci = 0; bci < code.length; bci++) {
        +            String[] line = lines.get(bci);
        +            if (line != null) {
        +                line[5] = line[5] == null ? "" : String.format("(%s)", line[5]);
        +                line[6] = line[6] == null ? "" : String.format("(%s)", line[6]);
        +                line[7] = "";
        +                if (outputCanQuicken != null && (outputCanQuicken[bci] != 0 || generalizeInputsMap[bci] != null)) {
        +                    StringBuilder quickenSb = new StringBuilder();
        +                    if (outputCanQuicken[bci] != 0) {
        +                        quickenSb.append("can quicken");
        +                    }
        +                    if (generalizeInputsMap[bci] != null) {
        +                        if (quickenSb.length() > 0) {
        +                            quickenSb.append(", ");
        +                        }
        +                        quickenSb.append("generalizes: ");
        +                        for (int i = 0; i < generalizeInputsMap[bci].length; i++) {
        +                            if (i > 0) {
        +                                quickenSb.append(", ");
        +                            }
        +                            quickenSb.append(generalizeInputsMap[bci][i]);
        +                        }
        +                    }
        +                    line[7] = quickenSb.toString();
        +                }
        +                String formatted = String.format("%-8s %2s %4s %-32s %-3s   %-32s %s %s", (Object[]) line);
        +                sb.append(formatted.stripTrailing());
        +                sb.append('\n');
        +            }
        +        }
        +    }
        +
        +    private static String collectionKindToString(int oparg) {
        +        switch (CollectionBits.collectionKind(oparg)) {
        +            case CollectionBits.KIND_LIST:
        +                return "list";
        +            case CollectionBits.KIND_TUPLE:
        +                return "tuple";
        +            case CollectionBits.KIND_SET:
        +                return "set";
        +            case CollectionBits.KIND_DICT:
        +                return "dict";
        +            case CollectionBits.KIND_KWORDS:
        +                return "PKeyword[]";
        +            case CollectionBits.KIND_OBJECT:
        +                return "Object[]";
        +        }
        +        throw new IllegalStateException("Unknown kind");
        +    }
        +
        +    private static String collectionTypeToString(int oparg) {
        +        switch (CollectionBits.elementType(oparg)) {
        +            case CollectionBits.ELEMENT_BOOLEAN:
        +                return "boolean";
        +            case CollectionBits.ELEMENT_INT:
        +                return "int";
        +            case CollectionBits.ELEMENT_LONG:
        +                return "long";
        +            case CollectionBits.ELEMENT_DOUBLE:
        +                return "double";
        +            case CollectionBits.ELEMENT_OBJECT:
        +                return "Object";
        +        }
        +        throw new IllegalStateException("Unknown type");
        +    }
        +
        +    public static final int LINE_TO_BCI_LINE_AFTER_CODEBLOCK = -1;
        +    public static final int LINE_TO_BCI_LINE_BEFORE_CODEBLOCK = -2;
        +
        +    // -1 for line after the code block, -2 for line before the code block, line number otherwise
        +    public int lineToBci(int line) {
        +        if (startLine == line) {
        +            return 0;
        +        }
        +        if ((flags & PCode.CO_GRAALPYHON_MODULE) != 0 && line < startLine) {
        +            // allow jump to the first line of a file, even if it is a comment
        +            return 0;
        +        }
        +        int[] map = getSourceMap().startLineMap;
        +        int bestBci = LINE_TO_BCI_LINE_AFTER_CODEBLOCK;
        +        int lineDiff = Integer.MAX_VALUE;
        +        boolean afterFirst = false;
        +        for (int bci = 0; bci < map.length; ++bci) {
        +            if (map[bci] >= line) {
        +                int lineDiff2 = map[bci] - line;
        +                // the first bci found is the start of the line
        +                if (lineDiff2 < lineDiff) {
        +                    bestBci = bci;
        +                    lineDiff = lineDiff2;
        +                }
        +            }
        +            if (map[bci] > 0 && map[bci] <= line) {
        +                // the line is actually within the codeblock.
        +                afterFirst = true;
        +            }
        +        }
        +        // bestBci being -1 means the line is outside the code block
        +        return afterFirst ? bestBci : LINE_TO_BCI_LINE_BEFORE_CODEBLOCK;
        +    }
        +
        +    public enum StackItem {
        +        With("the body of a with statement"),
        +        Iterable("the body of a for loop"),
        +        Except("an 'except' block as there's no exception"),
        +        Object("Incompatible stack");
        +
        +        public final String error;
        +
        +        StackItem(String error) {
        +            this.error = error;
        +        }
        +
        +        ArrayList push(ArrayList v) {
        +            ArrayList ret = v == null ? new ArrayList<>() : new ArrayList<>(v);
        +            ret.add(this);
        +            return ret;
        +        }
        +    }
        +
        +    private void setNextStack(ArrayDeque todo, List> stacks, int target, ArrayList value) {
        +        ArrayList blocksAtTarget = stacks.get(target);
        +        if (blocksAtTarget == null) {
        +            stacks.set(target, value);
        +            todo.addLast(target);
        +        } else {
        +            assert value.equals(blocksAtTarget) : "found conflicting stacks depending on code path: " + this.name + "\t at " + target;
        +        }
        +    }
        +
        +    private static ArrayList popStack(ArrayList blocks) {
        +        assert blocks != null : "Pop from null stack";
        +        assert blocks.size() >= 1 : "Pop from empty stack";
        +        return new ArrayList<>(blocks.subList(0, blocks.size() - 1));
        +    }
        +
        +    // returns null if the jump is fine
        +    public String checkJump(Node node, List> stackElems, int from, int to) {
        +        ArrayList blkFrom = stackElems.get(from);
        +        if (blkFrom == null) {
        +            // this should not happen
        +            throw PRaiseNode.raiseStatic(node, PythonBuiltinClassType.ValueError, ErrorMessages.LINE_D_COMES_BEFORE_THE_CURRENT_CODE_BLOCK, bciToLine(from));
        +        }
        +        ArrayList blkTo = stackElems.get(to);
        +        if (blkTo == null) {
        +            throw PRaiseNode.raiseStatic(node, PythonBuiltinClassType.ValueError, ErrorMessages.LINE_D_COMES_AFTER_THE_CURRENT_CODE_BLOCK, bciToLine(from));
        +        }
        +        if (blkTo.size() > blkFrom.size()) {
        +            return blkTo.get(blkTo.size() - 1).error;
        +        }
        +        for (int i = blkTo.size() - 1; i >= 0; --i) {
        +            if (blkTo.get(i) != blkFrom.get(i)) {
        +                return blkTo.get(i).error;
        +            }
        +        }
        +        return null;
        +    }
        +
        +    public List> computeStackElems() {
        +        List> blocks = new ArrayList<>(Collections.nCopies(code.length + 1, null));
        +        blocks.set(0, new ArrayList<>());
        +        ArrayDeque todo = new ArrayDeque<>();
        +        todo.addFirst(0);
        +        while (!todo.isEmpty()) {
        +            int firstBci = todo.removeLast();
        +            assert blocks.get(firstBci) != null : "Reached block without determining its stack state";
        +            opCodeAt(code, firstBci, (bci, op, oparg, followingArgs) -> {
        +                // firstBci can be different from bci if EXTEND_ARG is used
        +                // the stack is kept both at firstBci and bci
        +                ArrayList next = blocks.get(firstBci);
        +                if (firstBci != bci) {
        +                    blocks.set(bci, next);
        +                }
        +                for (int j = 0; j < exceptionHandlerRanges.length; j += 4) {
        +                    int start = exceptionHandlerRanges[j];
        +                    int handler = exceptionHandlerRanges[j + 2];
        +                    int stack = exceptionHandlerRanges[j + 3];
        +                    if (start == bci) {
        +                        ArrayList handlerStack = StackItem.Except.push(new ArrayList<>(blocks.get(bci).subList(0, stack)));
        +                        // an exception handler is like a jump
        +                        // the except block is added in the lines below
        +                        setNextStack(todo, blocks, handler, handlerStack);
        +                    }
        +                }
        +                switch (op) {
        +                    case GET_ITER:
        +                    case GET_AITER:
        +                        next = StackItem.Iterable.push(popStack(blocks.get(bci)));
        +                        setNextStack(todo, blocks, bci + 1, next);
        +                        break;
        +                    case FOR_ITER:
        +                        setNextStack(todo, blocks, op.getNextBci(bci, oparg, false), StackItem.Object.push(next));
        +                        setNextStack(todo, blocks, op.getNextBci(bci, oparg, true), popStack(next));
        +                        break;
        +                    case PUSH_EXC_INFO:
        +                        next = StackItem.Except.push(StackItem.Object.push(popStack(blocks.get(bci))));
        +                        setNextStack(todo, blocks, bci + 1, next);
        +                        break;
        +                    case MATCH_EXC_OR_JUMP:
        +                        next = popStack(next);
        +                        setNextStack(todo, blocks, op.getNextBci(bci, oparg, false), next);
        +                        setNextStack(todo, blocks, op.getNextBci(bci, oparg, true), next);
        +                        break;
        +                    case SETUP_WITH:
        +                    case SETUP_AWITH:
        +                        next = StackItem.Object.push(StackItem.With.push(blocks.get(bci)));
        +                        setNextStack(todo, blocks, op.getNextBci(bci, oparg, false), next);
        +                        break;
        +                    case GET_AEXIT_CORO:
        +                        next = StackItem.Object.push(StackItem.Except.push(popStack(popStack(popStack(blocks.get(bci))))));
        +                        setNextStack(todo, blocks, op.getNextBci(bci, oparg, false), next);
        +                        break;
        +                    case DUP_TOP:
        +                        next = next.get(next.size() - 1).push(next);
        +                        setNextStack(todo, blocks, op.getNextBci(bci, oparg, false), next);
        +                        break;
        +                    case ROT_TWO: {
        +                        StackItem top = next.get(next.size() - 1);
        +                        StackItem belowTop = next.get(next.size() - 2);
        +                        next = belowTop.push(top.push(popStack(popStack(next))));
        +                        setNextStack(todo, blocks, op.getNextBci(bci, oparg, false), next);
        +                        break;
        +                    }
        +                    case ROT_THREE: {
        +                        StackItem top = next.get(next.size() - 1);
        +                        StackItem second = next.get(next.size() - 2);
        +                        StackItem third = next.get(next.size() - 3);
        +                        next = second.push(third.push(top.push(top.push(popStack(popStack(popStack(next)))))));
        +                        setNextStack(todo, blocks, op.getNextBci(bci, oparg, false), next);
        +                        break;
        +                    }
        +                    case LOAD_NONE:
        +                        opCodeAt(code, op.getNextBci(bci, oparg, false), (ignored, nextOp, ignored2, ignored3) -> {
        +                            // Usually, when compiling bytecode around exception handlers, the code
        +                            // is generated twice, once for the path with no exception, and
        +                            // once for the path with the exception. However, when generating code
        +                            // for a with statement exit, the code is generated as follows (and in a
        +                            // similar manner for async with).
        +                            // ...
        +                            // LOAD_NONE
        +                            // EXIT_WITH (exception handler starts here)
        +                            // ...
        +                            // This means that setting the stack at EXIT_WITH to have Object on top,
        +                            // as LOAD_NONE usually would, would cause a conflict with the exception
        +                            // handler starting at that position, which has the stack top be an
        +                            // Exception.
        +                            if (nextOp != OpCodes.GET_AEXIT_CORO && nextOp != OpCodes.EXIT_WITH) {
        +                                setNextStack(todo, blocks, op.getNextBci(bci, oparg, false), StackItem.Object.push(blocks.get(bci)));
        +                            }
        +                        });
        +                        break;
        +
        +                    default: {
        +                        int nextWJump = op.getNextBci(bci, oparg, true);
        +                        int nextWOJump = op.getNextBci(bci, oparg, false);
        +                        int stackLostWJump = op.getNumberOfConsumedStackItems(oparg, followingArgs, true);
        +                        int stackLostWOJump = op.getNumberOfConsumedStackItems(oparg, followingArgs, false);
        +                        int stackGainWJump = op.getNumberOfProducedStackItems(oparg, followingArgs, true);
        +                        int stackGainWOJump = op.getNumberOfProducedStackItems(oparg, followingArgs, false);
        +                        handleGeneralOp(blocks, todo, bci, nextWJump, stackLostWJump, stackGainWJump);
        +                        if (nextWJump != nextWOJump) {
        +                            handleGeneralOp(blocks, todo, bci, nextWOJump, stackLostWOJump, stackGainWOJump);
        +                        }
        +                        break;
        +                    }
        +                }
        +            });
        +        }
        +        return blocks;
        +    }
        +
        +    private void handleGeneralOp(List> blocks, ArrayDeque todo, int bci, int next, int stackLost, int stackGain) {
        +        if (next >= 0) {
        +            ArrayList blocksHere = new ArrayList<>(blocks.get(bci));
        +            for (int k = 0; k < stackLost; ++k) {
        +                blocksHere.remove(blocksHere.size() - 1);
        +            }
        +            for (int k = 0; k < stackGain; ++k) {
        +                blocksHere.add(StackItem.Object);
        +            }
        +            setNextStack(todo, blocks, next, blocksHere);
        +        }
        +    }
        +
        +    @FunctionalInterface
        +    public interface BytecodeAction {
        +        void run(int bci, OpCodes op, int oparg, byte[] followingArgs);
        +    }
        +
        +    // returns the following bci
        +    private static int opCodeAt(byte[] bytecode, int bci, BytecodeAction action) {
        +        int oparg = 0;
        +        OpCodes op = OpCodes.fromOpCode(bytecode[bci]);
        +        while (op == OpCodes.EXTENDED_ARG) {
        +            oparg |= Byte.toUnsignedInt(bytecode[bci + 1]);
        +            oparg <<= 8;
        +            bci += 2;
        +            op = OpCodes.fromOpCode(bytecode[bci]);
        +        }
        +        op = unquicken(op);
        +        byte[] followingArgs = null;
        +        if (op.argLength > 0) {
        +            oparg |= Byte.toUnsignedInt(bytecode[bci + 1]);
        +            if (op.argLength > 1) {
        +                followingArgs = new byte[op.argLength - 1];
        +                System.arraycopy(bytecode, bci + 2, followingArgs, 0, followingArgs.length);
        +            }
        +        }
        +        action.run(bci, op, oparg, followingArgs);
        +        return bci + op.length();
        +    }
        +
        +    public static void iterateBytecode(byte[] bytecode, BytecodeAction action) {
        +        for (int bci = 0; bci < bytecode.length;) {
        +            bci = opCodeAt(bytecode, bci, action);
        +        }
        +    }
        +
        +    public void iterateBytecode(BytecodeAction action) {
        +        iterateBytecode(code, action);
        +    }
        +
        +    public byte[] getBytecodeForSerialization() {
        +        byte[] bytecode = Arrays.copyOf(code, code.length);
        +        for (int bci = 0; bci < bytecode.length;) {
        +            OpCodes op = OpCodes.fromOpCode(bytecode[bci]);
        +            bytecode[bci] = (byte) unquicken(op).ordinal();
        +            bci += op.length();
        +        }
        +        return bytecode;
        +    }
        +
        +    private static OpCodes unquicken(OpCodes op) {
        +        if (op.quickens == null) {
        +            return op;
        +        }
        +        return switch (op.quickens) {
        +            // These are already quickened by the compiler, so keep them quickened
        +            // See CompilationUnit.emitBytecode
        +            case LOAD_BYTE, LOAD_INT, LOAD_LONG, LOAD_DOUBLE, LOAD_TRUE, LOAD_FALSE -> op;
        +            default -> op.quickens;
        +        };
        +    }
        +}
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/CodeUnit.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/CodeUnit.java
        index a9f29ef5fb..2f671177bd 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/CodeUnit.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/CodeUnit.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,23 +40,12 @@
          */
         package com.oracle.graal.python.compiler;
         
        -import java.util.ArrayDeque;
         import java.util.ArrayList;
         import java.util.Arrays;
        -import java.util.Collections;
        -import java.util.HashMap;
         import java.util.List;
        -import java.util.Objects;
         
        -import com.oracle.graal.python.builtins.PythonBuiltinClassType;
        -import com.oracle.graal.python.builtins.objects.bytes.BytesUtils;
         import com.oracle.graal.python.builtins.objects.code.PCode;
        -import com.oracle.graal.python.builtins.objects.str.StringNodes;
        -import com.oracle.graal.python.compiler.OpCodes.CollectionBits;
        -import com.oracle.graal.python.nodes.ErrorMessages;
        -import com.oracle.graal.python.nodes.PRaiseNode;
        -import com.oracle.graal.python.util.PythonUtils;
        -import com.oracle.truffle.api.CompilerDirectives;
        +import com.oracle.graal.python.builtins.objects.function.Signature;
         import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
         import com.oracle.truffle.api.source.Source;
         import com.oracle.truffle.api.source.SourceSection;
        @@ -67,9 +56,7 @@
          * bytecode and all the related data, like constants or exception handler ranges. It doesn't contain
          * the filename to make it easier to keep in native images.
          */
        -public final class CodeUnit {
        -    private static final int DISASSEMBLY_NUM_COLUMNS = 8;
        -
        +public abstract class CodeUnit {
             public final TruffleString name;
             public final TruffleString qualname;
         
        @@ -77,10 +64,6 @@ public final class CodeUnit {
             public final int kwOnlyArgCount;
             public final int positionalOnlyArgCount;
         
        -    public final int stacksize;
        -
        -    @CompilationFinal(dimensions = 1) public final byte[] code;
        -    @CompilationFinal(dimensions = 1) public final byte[] srcOffsetTable;
             public final int flags;
         
             @CompilationFinal(dimensions = 1) public final TruffleString[] names;
        @@ -91,42 +74,22 @@ public final class CodeUnit {
             @CompilationFinal(dimensions = 1) public final int[] arg2cell;
         
             @CompilationFinal(dimensions = 1) public final Object[] constants;
        -    @CompilationFinal(dimensions = 1) public final long[] primitiveConstants;
        -
        -    @CompilationFinal(dimensions = 1) public final int[] exceptionHandlerRanges;
        -
        -    public final int conditionProfileCount;
         
             public final int startLine;
             public final int startColumn;
             public final int endLine;
             public final int endColumn;
         
        -    /* Lazily initialized source map */
        -    @CompilationFinal SourceMap sourceMap;
        -
        -    /* Quickening data. See docs in PBytecodeRootNode */
        -    @CompilationFinal(dimensions = 1) public final byte[] outputCanQuicken;
        -    @CompilationFinal(dimensions = 1) public final byte[] variableShouldUnbox;
        -    @CompilationFinal(dimensions = 1) public final int[][] generalizeInputsMap;
        -    @CompilationFinal(dimensions = 1) public final int[][] generalizeVarsMap;
        -
             public CodeUnit(TruffleString name, TruffleString qualname,
        -                    int argCount, int kwOnlyArgCount, int positionalOnlyArgCount, int stacksize,
        -                    byte[] code, byte[] linetable, int flags,
        -                    TruffleString[] names, TruffleString[] varnames, TruffleString[] cellvars, TruffleString[] freevars, int[] cell2arg,
        -                    Object[] constants, long[] primitiveConstants,
        -                    int[] exceptionHandlerRanges, int conditionProfileCount,
        -                    int startLine, int startColumn, int endLine, int endColumn,
        -                    byte[] outputCanQuicken, byte[] variableShouldUnbox, int[][] generalizeInputsMap, int[][] generalizeVarsMap) {
        +                    int argCount, int kwOnlyArgCount, int positionalOnlyArgCount, int flags,
        +                    TruffleString[] names, TruffleString[] varnames, TruffleString[] cellvars,
        +                    TruffleString[] freevars, int[] cell2arg, Object[] constants, int startLine, int startColumn,
        +                    int endLine, int endColumn) {
                 this.name = name;
                 this.qualname = qualname != null ? qualname : name;
                 this.argCount = argCount;
                 this.kwOnlyArgCount = kwOnlyArgCount;
                 this.positionalOnlyArgCount = positionalOnlyArgCount;
        -        this.stacksize = stacksize;
        -        this.code = code;
        -        this.srcOffsetTable = linetable;
                 this.flags = flags;
                 this.names = names;
                 this.varnames = varnames;
        @@ -145,39 +108,11 @@ public CodeUnit(TruffleString name, TruffleString qualname,
                 }
                 this.arg2cell = arg2cellValue;
                 this.constants = constants;
        -        this.primitiveConstants = primitiveConstants;
        -        this.exceptionHandlerRanges = exceptionHandlerRanges;
        -        this.conditionProfileCount = conditionProfileCount;
        +
                 this.startLine = startLine;
                 this.startColumn = startColumn;
                 this.endLine = endLine;
                 this.endColumn = endColumn;
        -        this.outputCanQuicken = outputCanQuicken;
        -        this.variableShouldUnbox = variableShouldUnbox;
        -        this.generalizeInputsMap = generalizeInputsMap;
        -        this.generalizeVarsMap = generalizeVarsMap;
        -    }
        -
        -    public SourceMap getSourceMap() {
        -        if (sourceMap == null) {
        -            CompilerDirectives.transferToInterpreterAndInvalidate();
        -            sourceMap = new SourceMap(code, srcOffsetTable, startLine, startColumn);
        -        }
        -        return sourceMap;
        -    }
        -
        -    public int bciToLine(int bci) {
        -        if (bci < 0 || bci >= code.length) {
        -            return -1;
        -        }
        -        return getSourceMap().startLineMap[bci];
        -    }
        -
        -    public int bciToColumn(int bci) {
        -        if (bci < 0 || bci >= code.length) {
        -            return -1;
        -        }
        -        return getSourceMap().startColumnMap[bci];
             }
         
             public SourceSection getSourceSection(Source source) {
        @@ -223,16 +158,31 @@ public int getTotalArgCount() {
                 return count;
             }
         
        -    @SuppressWarnings("fallthrough")
        +    public final Signature computeSignature() {
        +        int posArgCount = argCount + positionalOnlyArgCount;
        +        TruffleString[] parameterNames = Arrays.copyOf(varnames, posArgCount);
        +        TruffleString[] kwOnlyNames = Arrays.copyOfRange(varnames, posArgCount, posArgCount + kwOnlyArgCount);
        +        int varArgsIndex = takesVarArgs() ? posArgCount : -1;
        +        return new Signature(positionalOnlyArgCount,
        +                        takesVarKeywordArgs(),
        +                        varArgsIndex,
        +                        parameterNames,
        +                        kwOnlyNames);
        +    }
        +
             @Override
             public String toString() {
        -        return toString(code);
        +        return toString(false);
             }
         
        -    public String toString(byte[] bytecode) {
        -        StringBuilder sb = new StringBuilder();
        +    protected abstract void dumpBytecode(StringBuilder sb, boolean optimized);
         
        -        HashMap lines = new HashMap<>();
        +    /**
        +     * @param optimized Whether to print the initial state of the bytecode or current state, if
        +     *            available, where some instructions may be transformed, e.g., quickened.
        +     */
        +    public String toString(boolean optimized) {
        +        StringBuilder sb = new StringBuilder();
         
                 sb.append("Disassembly of ").append(qualname).append(":\n");
         
        @@ -250,541 +200,15 @@ public String toString(byte[] bytecode) {
                     sb.append("Flags: ").append(String.join(" | ", flagNames)).append("\n");
                 }
         
        -        int bci = 0;
        -        int oparg = 0;
        -        SourceMap map = getSourceMap();
        -        while (bci < bytecode.length) {
        -            int bcBCI = bci;
        -            OpCodes opcode = OpCodes.fromOpCode(bytecode[bci++]);
        -
        -            String[] line = lines.computeIfAbsent(bcBCI, k -> new String[DISASSEMBLY_NUM_COLUMNS]);
        -            line[0] = String.format("%3d:%-3d - %3d:%-3d", map.startLineMap[bcBCI], map.startColumnMap[bcBCI], map.endLineMap[bcBCI], map.endColumnMap[bcBCI]);
        -            if (line[1] == null) {
        -                line[1] = "";
        -            }
        -            line[2] = String.valueOf(bcBCI);
        -            line[3] = opcode.toString();
        -            byte[] followingArgs = PythonUtils.EMPTY_BYTE_ARRAY;
        -            if (!opcode.hasArg()) {
        -                line[4] = "";
        -            } else {
        -                oparg |= Byte.toUnsignedInt(bytecode[bci++]);
        -                if (opcode.argLength > 1) {
        -                    followingArgs = new byte[opcode.argLength - 1];
        -                    for (int i = 0; i < opcode.argLength - 1; i++) {
        -                        followingArgs[i] = bytecode[bci++];
        -                    }
        -                }
        -                line[4] = String.format("% 2d", oparg);
        -            }
        -
        -            while (true) {
        -                switch (opcode) {
        -                    case EXTENDED_ARG:
        -                        line[4] = "";
        -                        break;
        -                    case LOAD_BYTE:
        -                        line[4] = String.format("% 2d", (byte) oparg);
        -                        break;
        -                    case LOAD_CONST:
        -                    case LOAD_BIGINT:
        -                    case LOAD_STRING:
        -                    case LOAD_BYTES:
        -                    case LOAD_CONST_COLLECTION:
        -                    case MAKE_KEYWORD: {
        -                        Object constant = constants[oparg];
        -                        if (constant instanceof CodeUnit) {
        -                            line[5] = ((CodeUnit) constant).qualname.toJavaStringUncached();
        -                        } else {
        -                            if (constant instanceof TruffleString) {
        -                                line[5] = StringNodes.StringReprNode.getUncached().execute((TruffleString) constant).toJavaStringUncached();
        -                            } else if (constant instanceof byte[]) {
        -                                byte[] bytes = (byte[]) constant;
        -                                line[5] = BytesUtils.bytesRepr(bytes, bytes.length);
        -                            } else if (constant instanceof int[]) {
        -                                line[5] = Arrays.toString((int[]) constant);
        -                            } else if (constant instanceof long[]) {
        -                                line[5] = Arrays.toString((long[]) constant);
        -                            } else if (constant instanceof boolean[]) {
        -                                line[5] = Arrays.toString((boolean[]) constant);
        -                            } else if (constant instanceof double[]) {
        -                                line[5] = Arrays.toString((double[]) constant);
        -                            } else if (constant instanceof Object[]) {
        -                                line[5] = Arrays.toString((Object[]) constant);
        -                            } else {
        -                                line[5] = Objects.toString(constant);
        -                            }
        -                        }
        -                        if (opcode == OpCodes.LOAD_CONST_COLLECTION) {
        -                            line[5] += " type " + collectionTypeToString(followingArgs[0]) + " into " + collectionKindToString(followingArgs[0]);
        -                        }
        -                        break;
        -                    }
        -                    case MAKE_FUNCTION: {
        -                        line[4] = String.format("% 2d", followingArgs[0]);
        -                        CodeUnit codeUnit = (CodeUnit) constants[oparg];
        -                        line[5] = line[5] = codeUnit.qualname.toJavaStringUncached();
        -                        break;
        -                    }
        -                    case LOAD_INT:
        -                    case LOAD_LONG:
        -                        line[5] = Objects.toString(primitiveConstants[oparg]);
        -                        break;
        -                    case LOAD_DOUBLE:
        -                        line[5] = Objects.toString(Double.longBitsToDouble(primitiveConstants[oparg]));
        -                        break;
        -                    case LOAD_COMPLEX: {
        -                        double[] num = (double[]) constants[oparg];
        -                        if (num[0] == 0.0) {
        -                            line[5] = String.format("%gj", num[1]);
        -                        } else {
        -                            line[5] = String.format("%g%+gj", num[0], num[1]);
        -                        }
        -                        break;
        -                    }
        -                    case LOAD_CLOSURE:
        -                    case LOAD_DEREF:
        -                    case STORE_DEREF:
        -                    case DELETE_DEREF:
        -                        if (oparg >= cellvars.length) {
        -                            line[5] = freevars[oparg - cellvars.length].toJavaStringUncached();
        -                        } else {
        -                            line[5] = cellvars[oparg].toJavaStringUncached();
        -                        }
        -                        break;
        -                    case LOAD_FAST:
        -                    case STORE_FAST:
        -                    case DELETE_FAST:
        -                        line[5] = varnames[oparg].toJavaStringUncached();
        -                        break;
        -                    case LOAD_NAME:
        -                    case LOAD_METHOD:
        -                    case STORE_NAME:
        -                    case DELETE_NAME:
        -                    case IMPORT_NAME:
        -                    case IMPORT_FROM:
        -                    case LOAD_GLOBAL:
        -                    case STORE_GLOBAL:
        -                    case DELETE_GLOBAL:
        -                    case LOAD_ATTR:
        -                    case STORE_ATTR:
        -                    case DELETE_ATTR:
        -                        line[5] = names[oparg].toJavaStringUncached();
        -                        break;
        -                    case FORMAT_VALUE: {
        -                        int type = oparg & FormatOptions.FVC_MASK;
        -                        switch (type) {
        -                            case FormatOptions.FVC_STR:
        -                                line[5] = "STR";
        -                                break;
        -                            case FormatOptions.FVC_REPR:
        -                                line[5] = "REPR";
        -                                break;
        -                            case FormatOptions.FVC_ASCII:
        -                                line[5] = "ASCII";
        -                                break;
        -                            case FormatOptions.FVC_NONE:
        -                                line[5] = "NONE";
        -                                break;
        -                        }
        -                        if ((oparg & FormatOptions.FVS_MASK) == FormatOptions.FVS_HAVE_SPEC) {
        -                            line[5] += " + SPEC";
        -                        }
        -                        break;
        -                    }
        -                    case CALL_METHOD: {
        -                        line[4] = String.format("% 2d", oparg);
        -                        break;
        -                    }
        -                    case UNARY_OP:
        -                        line[5] = UnaryOps.values()[oparg].toString();
        -                        break;
        -                    case BINARY_OP:
        -                        line[5] = BinaryOps.values()[oparg].toString();
        -                        break;
        -                    case COLLECTION_FROM_STACK:
        -                    case COLLECTION_ADD_STACK:
        -                    case COLLECTION_FROM_COLLECTION:
        -                    case COLLECTION_ADD_COLLECTION:
        -                    case ADD_TO_COLLECTION:
        -                        line[4] = String.format("% 2d", CollectionBits.elementCount(oparg));
        -                        line[5] = collectionKindToString(oparg);
        -                        break;
        -                    case UNPACK_EX:
        -                        line[5] = String.format("%d, %d", oparg, Byte.toUnsignedInt(followingArgs[0]));
        -                        break;
        -                    case JUMP_BACKWARD:
        -                        lines.computeIfAbsent(bcBCI - oparg, k -> new String[DISASSEMBLY_NUM_COLUMNS])[1] = ">>";
        -                        line[5] = String.format("to %d", bcBCI - oparg);
        -                        break;
        -                    case FOR_ITER:
        -                    case JUMP_FORWARD:
        -                    case POP_AND_JUMP_IF_FALSE:
        -                    case POP_AND_JUMP_IF_TRUE:
        -                    case JUMP_IF_FALSE_OR_POP:
        -                    case JUMP_IF_TRUE_OR_POP:
        -                    case MATCH_EXC_OR_JUMP:
        -                    case SEND:
        -                    case THROW:
        -                        lines.computeIfAbsent(bcBCI + oparg, k -> new String[DISASSEMBLY_NUM_COLUMNS])[1] = ">>";
        -                        line[5] = String.format("to %d", bcBCI + oparg);
        -                        break;
        -                    default:
        -                        if (opcode.quickens != null) {
        -                            opcode = opcode.quickens;
        -                            continue;
        -                        }
        -                }
        -                if (opcode == OpCodes.EXTENDED_ARG) {
        -                    oparg <<= 8;
        -                } else {
        -                    oparg = 0;
        -                }
        -                break;
        -            }
        -        }
        -
        -        for (int i = 0; i < exceptionHandlerRanges.length; i += 4) {
        -            int start = exceptionHandlerRanges[i];
        -            int stop = exceptionHandlerRanges[i + 1];
        -            int handler = exceptionHandlerRanges[i + 2];
        -            int stackAtHandler = exceptionHandlerRanges[i + 3];
        -            String[] line = lines.get(handler);
        -            assert line != null;
        -            String handlerStr = String.format("exc handler %d - %d; stack: %d", start, stop, stackAtHandler);
        -            if (line[6] == null) {
        -                line[6] = handlerStr;
        -            } else {
        -                line[6] += " | " + handlerStr;
        -            }
        -        }
        -
        -        for (bci = 0; bci < bytecode.length; bci++) {
        -            String[] line = lines.get(bci);
        -            if (line != null) {
        -                line[5] = line[5] == null ? "" : String.format("(%s)", line[5]);
        -                line[6] = line[6] == null ? "" : String.format("(%s)", line[6]);
        -                line[7] = "";
        -                if (outputCanQuicken != null && (outputCanQuicken[bci] != 0 || generalizeInputsMap[bci] != null)) {
        -                    StringBuilder quickenSb = new StringBuilder();
        -                    if (outputCanQuicken[bci] != 0) {
        -                        quickenSb.append("can quicken");
        -                    }
        -                    if (generalizeInputsMap[bci] != null) {
        -                        if (quickenSb.length() > 0) {
        -                            quickenSb.append(", ");
        -                        }
        -                        quickenSb.append("generalizes: ");
        -                        for (int i = 0; i < generalizeInputsMap[bci].length; i++) {
        -                            if (i > 0) {
        -                                quickenSb.append(", ");
        -                            }
        -                            quickenSb.append(generalizeInputsMap[bci][i]);
        -                        }
        -                    }
        -                    line[7] = quickenSb.toString();
        -                }
        -                String formatted = String.format("%-8s %2s %4s %-32s %-3s   %-32s %s %s", (Object[]) line);
        -                sb.append(formatted.stripTrailing());
        -                sb.append('\n');
        -            }
        -        }
        +        dumpBytecode(sb, optimized);
         
                 for (Object c : constants) {
        -            if (c instanceof CodeUnit) {
        +            if (c instanceof CodeUnit cd) {
                         sb.append('\n');
        -                sb.append(c);
        +                sb.append(cd.toString(optimized));
                     }
                 }
         
                 return sb.toString();
             }
        -
        -    private static String collectionKindToString(int oparg) {
        -        switch (CollectionBits.collectionKind(oparg)) {
        -            case CollectionBits.KIND_LIST:
        -                return "list";
        -            case CollectionBits.KIND_TUPLE:
        -                return "tuple";
        -            case CollectionBits.KIND_SET:
        -                return "set";
        -            case CollectionBits.KIND_DICT:
        -                return "dict";
        -            case CollectionBits.KIND_KWORDS:
        -                return "PKeyword[]";
        -            case CollectionBits.KIND_OBJECT:
        -                return "Object[]";
        -        }
        -        throw new IllegalStateException("Unknown kind");
        -    }
        -
        -    private static String collectionTypeToString(int oparg) {
        -        switch (CollectionBits.elementType(oparg)) {
        -            case CollectionBits.ELEMENT_BOOLEAN:
        -                return "boolean";
        -            case CollectionBits.ELEMENT_INT:
        -                return "int";
        -            case CollectionBits.ELEMENT_LONG:
        -                return "long";
        -            case CollectionBits.ELEMENT_DOUBLE:
        -                return "double";
        -            case CollectionBits.ELEMENT_OBJECT:
        -                return "Object";
        -        }
        -        throw new IllegalStateException("Unknown type");
        -    }
        -
        -    public static final int LINE_TO_BCI_LINE_AFTER_CODEBLOCK = -1;
        -    public static final int LINE_TO_BCI_LINE_BEFORE_CODEBLOCK = -2;
        -
        -    // -1 for line after the code block, -2 for line before the code block, line number otherwise
        -    public int lineToBci(int line) {
        -        if (startLine == line) {
        -            return 0;
        -        }
        -        if ((flags & PCode.CO_GRAALPYHON_MODULE) != 0 && line < startLine) {
        -            // allow jump to the first line of a file, even if it is a comment
        -            return 0;
        -        }
        -        int[] map = getSourceMap().startLineMap;
        -        int bestBci = LINE_TO_BCI_LINE_AFTER_CODEBLOCK;
        -        int lineDiff = Integer.MAX_VALUE;
        -        boolean afterFirst = false;
        -        for (int bci = 0; bci < map.length; ++bci) {
        -            if (map[bci] >= line) {
        -                int lineDiff2 = map[bci] - line;
        -                // the first bci found is the start of the line
        -                if (lineDiff2 < lineDiff) {
        -                    bestBci = bci;
        -                    lineDiff = lineDiff2;
        -                }
        -            }
        -            if (map[bci] > 0 && map[bci] <= line) {
        -                // the line is actually within the codeblock.
        -                afterFirst = true;
        -            }
        -        }
        -        // bestBci being -1 means the line is outside the code block
        -        return afterFirst ? bestBci : LINE_TO_BCI_LINE_BEFORE_CODEBLOCK;
        -    }
        -
        -    public enum StackItem {
        -        With("the body of a with statement"),
        -        Iterable("the body of a for loop"),
        -        Except("an 'except' block as there's no exception"),
        -        Object("Incompatible stack");
        -
        -        public final String error;
        -
        -        StackItem(String error) {
        -            this.error = error;
        -        }
        -
        -        ArrayList push(ArrayList v) {
        -            ArrayList ret = v == null ? new ArrayList<>() : new ArrayList<>(v);
        -            ret.add(this);
        -            return ret;
        -        }
        -    }
        -
        -    private void setNextStack(ArrayDeque todo, List> stacks, int target, ArrayList value) {
        -        ArrayList blocksAtTarget = stacks.get(target);
        -        if (blocksAtTarget == null) {
        -            stacks.set(target, value);
        -            todo.addLast(target);
        -        } else {
        -            assert value.equals(blocksAtTarget) : "found conflicting stacks depending on code path: " + this.name + "\t at " + target;
        -        }
        -    }
        -
        -    private static ArrayList popStack(ArrayList blocks) {
        -        assert blocks != null : "Pop from null stack";
        -        assert blocks.size() >= 1 : "Pop from empty stack";
        -        return new ArrayList<>(blocks.subList(0, blocks.size() - 1));
        -    }
        -
        -    // returns null if the jump is fine
        -    public String checkJump(List> stackElems, int from, int to) {
        -        ArrayList blkFrom = stackElems.get(from);
        -        if (blkFrom == null) {
        -            // this should not happen
        -            PRaiseNode.getUncached().raise(PythonBuiltinClassType.ValueError, ErrorMessages.LINE_D_COMES_BEFORE_THE_CURRENT_CODE_BLOCK, bciToLine(from));
        -        }
        -        ArrayList blkTo = stackElems.get(to);
        -        if (blkTo == null) {
        -            PRaiseNode.getUncached().raise(PythonBuiltinClassType.ValueError, ErrorMessages.LINE_D_COMES_AFTER_THE_CURRENT_CODE_BLOCK, bciToLine(from));
        -        }
        -        if (blkTo.size() > blkFrom.size()) {
        -            return blkTo.get(blkTo.size() - 1).error;
        -        }
        -        for (int i = blkTo.size() - 1; i >= 0; --i) {
        -            if (blkTo.get(i) != blkFrom.get(i)) {
        -                return blkTo.get(i).error;
        -            }
        -        }
        -        return null;
        -    }
        -
        -    public List> computeStackElems() {
        -        List> blocks = new ArrayList<>(Collections.nCopies(code.length + 1, null));
        -        blocks.set(0, new ArrayList<>());
        -        ArrayDeque todo = new ArrayDeque<>();
        -        todo.addFirst(0);
        -        while (!todo.isEmpty()) {
        -            int firstBci = todo.removeLast();
        -            assert blocks.get(firstBci) != null : "Reached block without determining its stack state";
        -            opCodeAt(code, firstBci, (bci, op, oparg, followingArgs) -> {
        -                // firstBci can be different from bci if EXTEND_ARG is used
        -                // the stack is kept both at firstBci and bci
        -                ArrayList next = blocks.get(firstBci);
        -                if (firstBci != bci) {
        -                    blocks.set(bci, next);
        -                }
        -                for (int j = 0; j < exceptionHandlerRanges.length; j += 4) {
        -                    int start = exceptionHandlerRanges[j];
        -                    int handler = exceptionHandlerRanges[j + 2];
        -                    int stack = exceptionHandlerRanges[j + 3];
        -                    if (start == bci) {
        -                        ArrayList handlerStack = StackItem.Except.push(new ArrayList<>(blocks.get(bci).subList(0, stack)));
        -                        // an exception handler is like a jump
        -                        // the except block is added in the lines below
        -                        setNextStack(todo, blocks, handler, handlerStack);
        -                    }
        -                }
        -                switch (op) {
        -                    case GET_ITER:
        -                    case GET_AITER:
        -                        next = StackItem.Iterable.push(popStack(blocks.get(bci)));
        -                        setNextStack(todo, blocks, bci + 1, next);
        -                        break;
        -                    case FOR_ITER:
        -                        setNextStack(todo, blocks, op.getNextBci(bci, oparg, false), StackItem.Object.push(next));
        -                        setNextStack(todo, blocks, op.getNextBci(bci, oparg, true), popStack(next));
        -                        break;
        -                    case PUSH_EXC_INFO:
        -                        next = StackItem.Except.push(StackItem.Object.push(popStack(blocks.get(bci))));
        -                        setNextStack(todo, blocks, bci + 1, next);
        -                        break;
        -                    case MATCH_EXC_OR_JUMP:
        -                        next = popStack(next);
        -                        setNextStack(todo, blocks, op.getNextBci(bci, oparg, false), next);
        -                        setNextStack(todo, blocks, op.getNextBci(bci, oparg, true), next);
        -                        break;
        -                    case SETUP_WITH:
        -                    case SETUP_AWITH:
        -                        next = StackItem.Object.push(StackItem.With.push(blocks.get(bci)));
        -                        setNextStack(todo, blocks, op.getNextBci(bci, oparg, false), next);
        -                        break;
        -                    case GET_AEXIT_CORO:
        -                        next = StackItem.Object.push(StackItem.Except.push(popStack(popStack(popStack(blocks.get(bci))))));
        -                        setNextStack(todo, blocks, op.getNextBci(bci, oparg, false), next);
        -                        break;
        -                    case DUP_TOP:
        -                        next = next.get(next.size() - 1).push(next);
        -                        setNextStack(todo, blocks, op.getNextBci(bci, oparg, false), next);
        -                        break;
        -                    case ROT_TWO: {
        -                        StackItem top = next.get(next.size() - 1);
        -                        StackItem belowTop = next.get(next.size() - 2);
        -                        next = belowTop.push(top.push(popStack(popStack(next))));
        -                        setNextStack(todo, blocks, op.getNextBci(bci, oparg, false), next);
        -                        break;
        -                    }
        -                    case ROT_THREE: {
        -                        StackItem top = next.get(next.size() - 1);
        -                        StackItem second = next.get(next.size() - 2);
        -                        StackItem third = next.get(next.size() - 3);
        -                        next = second.push(third.push(top.push(top.push(popStack(popStack(popStack(next)))))));
        -                        setNextStack(todo, blocks, op.getNextBci(bci, oparg, false), next);
        -                        break;
        -                    }
        -                    case LOAD_NONE:
        -                        opCodeAt(code, op.getNextBci(bci, oparg, false), (ignored, nextOp, ignored2, ignored3) -> {
        -                            // Usually, when compiling bytecode around exception handlers, the code
        -                            // is generated twice, once for the path with no exception, and
        -                            // once for the path with the exception. However, when generating code
        -                            // for a with statement exit, the code is generated as follows (and in a
        -                            // similar manner for async with).
        -                            // ...
        -                            // LOAD_NONE
        -                            // EXIT_WITH (exception handler starts here)
        -                            // ...
        -                            // This means that setting the stack at EXIT_WITH to have Object on top,
        -                            // as LOAD_NONE usually would, would cause a conflict with the exception
        -                            // handler starting at that position, which has the stack top be an
        -                            // Exception.
        -                            if (nextOp != OpCodes.GET_AEXIT_CORO && nextOp != OpCodes.EXIT_WITH) {
        -                                setNextStack(todo, blocks, op.getNextBci(bci, oparg, false), StackItem.Object.push(blocks.get(bci)));
        -                            }
        -                        });
        -                        break;
        -
        -                    default: {
        -                        int nextWJump = op.getNextBci(bci, oparg, true);
        -                        int nextWOJump = op.getNextBci(bci, oparg, false);
        -                        int stackLostWJump = op.getNumberOfConsumedStackItems(oparg, followingArgs, true);
        -                        int stackLostWOJump = op.getNumberOfConsumedStackItems(oparg, followingArgs, false);
        -                        int stackGainWJump = op.getNumberOfProducedStackItems(oparg, followingArgs, true);
        -                        int stackGainWOJump = op.getNumberOfProducedStackItems(oparg, followingArgs, false);
        -                        handleGeneralOp(blocks, todo, bci, nextWJump, stackLostWJump, stackGainWJump);
        -                        if (nextWJump != nextWOJump) {
        -                            handleGeneralOp(blocks, todo, bci, nextWOJump, stackLostWOJump, stackGainWOJump);
        -                        }
        -                        break;
        -                    }
        -                }
        -            });
        -        }
        -        return blocks;
        -    }
        -
        -    private void handleGeneralOp(List> blocks, ArrayDeque todo, int bci, int next, int stackLost, int stackGain) {
        -        if (next >= 0) {
        -            ArrayList blocksHere = new ArrayList<>(blocks.get(bci));
        -            for (int k = 0; k < stackLost; ++k) {
        -                blocksHere.remove(blocksHere.size() - 1);
        -            }
        -            for (int k = 0; k < stackGain; ++k) {
        -                blocksHere.add(StackItem.Object);
        -            }
        -            setNextStack(todo, blocks, next, blocksHere);
        -        }
        -    }
        -
        -    @FunctionalInterface
        -    public interface BytecodeAction {
        -        void run(int bci, OpCodes op, int oparg, byte[] followingArgs);
        -    }
        -
        -    // returns the following bci
        -    private static int opCodeAt(byte[] bytecode, int bci, BytecodeAction action) {
        -        int oparg = 0;
        -        OpCodes op = OpCodes.fromOpCode(bytecode[bci]);
        -        while (op == OpCodes.EXTENDED_ARG) {
        -            oparg |= Byte.toUnsignedInt(bytecode[bci + 1]);
        -            oparg <<= 8;
        -            bci += 2;
        -            op = OpCodes.fromOpCode(bytecode[bci]);
        -        }
        -        byte[] followingArgs = null;
        -        if (op.argLength > 0) {
        -            oparg |= Byte.toUnsignedInt(bytecode[bci + 1]);
        -            if (op.argLength > 1) {
        -                followingArgs = new byte[op.argLength - 1];
        -                System.arraycopy(bytecode, bci + 2, followingArgs, 0, followingArgs.length);
        -            }
        -        }
        -        action.run(bci, op, oparg, followingArgs);
        -        return bci + op.length();
        -    }
        -
        -    public static void iterateBytecode(byte[] bytecode, BytecodeAction action) {
        -        for (int bci = 0; bci < bytecode.length;) {
        -            bci = opCodeAt(bytecode, bci, action);
        -        }
        -    }
        -
        -    public void iterateBytecode(BytecodeAction action) {
        -        iterateBytecode(code, action);
        -    }
         }
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/CompilationScope.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/CompilationScope.java
        index dee34b0461..148cc15f37 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/CompilationScope.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/CompilationScope.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -40,7 +40,7 @@
          */
         package com.oracle.graal.python.compiler;
         
        -enum CompilationScope {
        +public enum CompilationScope {
             Module,
             Class,
             Function,
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/CompilationUnit.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/CompilationUnit.java
        index 1bb92cce55..6f4d2cc4cf 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/CompilationUnit.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/CompilationUnit.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -183,7 +183,7 @@ private void addImplicitReturn() {
                 }
             }
         
        -    public CodeUnit assemble() {
        +    public BytecodeCodeUnit assemble() {
                 addImplicitReturn();
                 calculateJumpInstructionArguments();
         
        @@ -321,19 +321,20 @@ public CodeUnit assemble() {
                         }
                     }
                 }
        -        return new CodeUnit(toTruffleStringUncached(name), toTruffleStringUncached(qualName),
        -                        argCount, kwOnlyArgCount, positionalOnlyArgCount, maxStackSize,
        -                        buf.toByteArray(), sourceMapBuilder.build(), flags,
        -                        orderedKeys(names, new TruffleString[0], PythonUtils::toTruffleStringUncached),
        -                        orderedKeys(varnames, new TruffleString[0], PythonUtils::toTruffleStringUncached),
        +        return new BytecodeCodeUnit(toTruffleStringUncached(name), toTruffleStringUncached(qualName),
        +                        argCount, kwOnlyArgCount, positionalOnlyArgCount, flags,
        +                        orderedKeys(names, new TruffleString[0], PythonUtils::toTruffleStringUncached), orderedKeys(varnames, new TruffleString[0], PythonUtils::toTruffleStringUncached),
                                 orderedKeys(cellvars, new TruffleString[0], PythonUtils::toTruffleStringUncached),
                                 orderedKeys(freevars, new TruffleString[0], cellvars.size(), PythonUtils::toTruffleStringUncached),
                                 cell2arg,
                                 orderedKeys(constants, new Object[0]),
        -                        orderedLong(primitiveConstants),
        -                        exceptionHandlerRanges,
        -                        conditionProfileCount,
        -                        startLocation.startLine, startLocation.startColumn, startLocation.endLine, startLocation.endColumn,
        +                        startLocation.startLine,
        +                        startLocation.startColumn,
        +                        startLocation.endLine,
        +                        startLocation.endColumn,
        +                        buf.toByteArray(),
        +                        sourceMapBuilder.build(),
        +                        orderedLong(primitiveConstants), exceptionHandlerRanges, maxStackSize, conditionProfileCount,
                                 finishedCanQuickenOutput, shouldUnboxVariable, finishedGeneralizeInputsMap, finishedGeneralizeVarsMap);
             }
         
        diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/Compiler.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/Compiler.java
        index f8cfc842fd..f7aaaf07df 100644
        --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/Compiler.java
        +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/Compiler.java
        @@ -1,5 +1,5 @@
         /*
        - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
        + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
          * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
          *
          * The Universal Permissive License (UPL), Version 1.0
        @@ -196,7 +196,6 @@
         import com.oracle.graal.python.pegparser.sst.UnaryOpTy;
         import com.oracle.graal.python.pegparser.sst.WithItemTy;
         import com.oracle.graal.python.pegparser.tokenizer.SourceRange;
        -import com.oracle.graal.python.runtime.object.PythonObjectFactory;
         import com.oracle.graal.python.util.PythonUtils;
         import com.oracle.graal.python.util.SuppressFBWarnings;
         import com.oracle.truffle.api.memory.ByteArraySupport;
        @@ -238,9 +237,9 @@ public Compiler(ErrorCallback errorCallback) {
             public CompilationUnit compile(ModTy mod, EnumSet flags, int optimizationLevel, EnumSet futureFeatures) {
                 this.flags = flags;
                 if (mod instanceof ModTy.Module) {
        -            parseFuture(((ModTy.Module) mod).body);
        +            futureLineno = parseFuture(((ModTy.Module) mod).body, futureFeatures, errorCallback);
                 } else if (mod instanceof ModTy.Interactive) {
        -            parseFuture(((ModTy.Interactive) mod).body);
        +            futureLineno = parseFuture(((ModTy.Interactive) mod).body, futureFeatures, errorCallback);
                 }
                 this.futureFeatures.addAll(futureFeatures);
                 this.env = ScopeEnvironment.analyze(mod, errorCallback, this.futureFeatures);
        @@ -252,21 +251,23 @@ public CompilationUnit compile(ModTy mod, EnumSet flags, int optimization
                 return topUnit;
             }
         
        -    private void parseFuture(StmtTy[] modBody) {
        +    public static int parseFuture(StmtTy[] modBody, EnumSet futureFeatures, ErrorCallback errorCallback) {
        +        int lastFutureLine = -1;
                 if (modBody == null || modBody.length == 0) {
        -            return;
        +            return lastFutureLine;
                 }
                 boolean done = false;
                 int prevLine = 0;
                 int i = 0;
        -        if (getDocstring(modBody) != null) {
        +        if (findDocstring(modBody) != null) {
                     i++;
                 }
        +
                 for (; i < modBody.length; i++) {
                     StmtTy s = modBody[i];
                     int line = s.getSourceRange().startLine;
                     if (done && line > prevLine) {
        -                return;
        +                return lastFutureLine;
                     }
                     prevLine = line;
                     if (s instanceof StmtTy.ImportFrom) {
        @@ -275,8 +276,8 @@ private void parseFuture(StmtTy[] modBody) {
                             if (done) {
                                 errorCallback.onError(ErrorType.Syntax, s.getSourceRange(), "from __future__ imports must occur at the beginning of the file");
                             }
        -                    parseFutureFeatures(importFrom, futureFeatures);
        -                    futureLineno = line;
        +                    parseFutureFeatures(importFrom, futureFeatures, errorCallback);
        +                    lastFutureLine = line;
                         } else {
                             done = true;
                         }
        @@ -284,9 +285,10 @@ private void parseFuture(StmtTy[] modBody) {
                         done = true;
                     }
                 }
        +        return lastFutureLine;
             }
         
        -    private void parseFutureFeatures(StmtTy.ImportFrom node, EnumSet features) {
        +    private static void parseFutureFeatures(StmtTy.ImportFrom node, EnumSet features, ErrorCallback errorCallback) {
                 for (AliasTy alias : node.names) {
                     if (alias.name != null) {
                         switch (alias.name) {
        @@ -446,7 +448,7 @@ private void exitScope() {
                 }
             }
         
        -    private void checkForbiddenName(String id, ExprContextTy context) {
        +    protected final void checkForbiddenName(String id, ExprContextTy context) {
                 if (context == ExprContextTy.Store) {
                     if (id.equals("__debug__")) {
                         errorCallback.onError(ErrorType.Syntax, unit.currentLocation, "cannot assign to __debug__");
        @@ -658,10 +660,7 @@ private static  int addObject(HashMap dict, T o) {
                 return v;
             }
         
        -    private TruffleString getDocstring(StmtTy[] body) {
        -        if (optimizationLevel >= 2) {
        -            return null;
        -        }
        +    private static TruffleString findDocstring(StmtTy[] body) {
                 if (body != null && body.length > 0) {
                     StmtTy stmt = body[0];
                     if (stmt instanceof StmtTy.Expr) {
        @@ -677,6 +676,13 @@ private TruffleString getDocstring(StmtTy[] body) {
                 return null;
             }
         
        +    private TruffleString getDocstring(StmtTy[] body) {
        +        if (optimizationLevel >= 2) {
        +            return null;
        +        }
        +        return findDocstring(body);
        +    }
        +
             private SourceRange setLocation(SourceRange location) {
                 SourceRange savedLocation = unit.currentLocation;
                 unit.currentLocation = location;
        @@ -843,6 +849,19 @@ public boolean isEmpty() {
                 }
             }
         
        +    /**
        +     * After these bytecodes are executed, there will a Python collection on the stack containing
        +     * all the arguments.
        +     * 

        + * We push individual arguments to the stack and when we reach certain size threshold, we emit + * instruction to collect N stack items (N is immediate operand) to the collection, which will + * now be on TOS. Next time this happens we emit instruction that adds the stack items to the + * collection. This way we accumulate the arguments into the collection and also never overflow + * certain stack size. + *

        + * When we encounter starred argument: we accumulate what we have on stack to the collection and + * then add the values in the starred arg to it. + */ private void collectIntoArray(ExprTy[] nodes, int bits, int alreadyOnStack) { Collector collector = new Collector(bits, alreadyOnStack); if (nodes != null) { @@ -887,7 +906,7 @@ private void collectIntoDict(ExprTy[] keys, ExprTy[] values) { collector.finishCollection(); } - private void validateKeywords(KeywordTy[] keywords) { + protected final void validateKeywords(KeywordTy[] keywords) { for (int i = 0; i < keywords.length; i++) { if (keywords[i].arg != null) { checkForbiddenName(keywords[i].arg, ExprContextTy.Store); @@ -1547,7 +1566,7 @@ public Void visit(ExprTy.List node) { case Store: return unpackInto(node.elements); case Load: - boolean emittedConstant = tryCollectConstantCollection(node.elements, CollectionBits.KIND_LIST); + boolean emittedConstant = tryLoadConstantCollection(node.elements, CollectionBits.KIND_LIST); if (emittedConstant) { return null; } @@ -1830,7 +1849,7 @@ public Void visit(ExprTy.Tuple node) { } } } - boolean emittedConstant = tryCollectConstantCollection(node.elements, CollectionBits.KIND_TUPLE); + boolean emittedConstant = tryLoadConstantCollection(node.elements, CollectionBits.KIND_TUPLE); if (emittedConstant) { return null; } @@ -1850,13 +1869,33 @@ public Void visit(ExprTy.Tuple node) { } } - private boolean tryCollectConstantCollection(ExprTy[] elements, int collectionKind) { + private boolean tryLoadConstantCollection(ExprTy[] elements, int collectionKind) { + ConstantCollection constantCollection = tryCollectConstantCollection(elements); + if (constantCollection == null) { + return false; + } + + addOp(LOAD_CONST_COLLECTION, addObject(unit.constants, constantCollection.collection), new byte[]{(byte) (constantCollection.elementType | collectionKind)}); + return true; + } + + public static final class ConstantCollection { + public final Object collection; + public final int elementType; + + ConstantCollection(Object collection, int elementType) { + this.collection = collection; + this.elementType = elementType; + } + } + + public static ConstantCollection tryCollectConstantCollection(ExprTy[] elements) { /* * We try to store the whole tuple as a Java array constant when all the elements are * constant and context-independent. */ if (elements == null || elements.length == 0) { - return false; + return null; } int constantType = -1; @@ -1886,10 +1925,10 @@ private boolean tryCollectConstantCollection(ExprTy[] elements, int collectionKi constantType = determineConstantType(constantType, CollectionBits.ELEMENT_OBJECT); constants.add(PNone.NONE); } else { - return false; + return null; } } else { - return false; + return null; } } Object newConstant = null; @@ -1930,11 +1969,10 @@ private boolean tryCollectConstantCollection(ExprTy[] elements, int collectionKi break; } } - addOp(LOAD_CONST_COLLECTION, addObject(unit.constants, newConstant), new byte[]{(byte) (constantType | collectionKind)}); - return true; + return new ConstantCollection(newConstant, constantType); } - int determineConstantType(int existing, int type) { + private static int determineConstantType(int existing, int type) { if (existing == -1 || existing == type) { return type; } @@ -3138,10 +3176,10 @@ public Void visit(PatternTy.MatchMapping node, PatternContext pc) { errorCallback.onError(ErrorType.Syntax, unit.currentLocation, "mapping pattern keys may only match literals and attribute lookups"); } assert constantValue != null; - Object pythonValue = PythonUtils.pythonObjectFromConstantValue(constantValue, PythonObjectFactory.getUncached()); + Object pythonValue = PythonUtils.pythonObjectFromConstantValue(constantValue); for (Object o : seen) { // need python like equal - e.g. 1 equals True - if (PyObjectRichCompareBool.EqNode.compareUncached(o, pythonValue)) { + if (PyObjectRichCompareBool.executeEqUncached(o, pythonValue)) { errorCallback.onError(ErrorType.Syntax, unit.currentLocation, "mapping pattern checks duplicate key (%s)", pythonValue); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/RaisePythonExceptionErrorCallback.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/RaisePythonExceptionErrorCallback.java index 1aef184604..f010568304 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/RaisePythonExceptionErrorCallback.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/RaisePythonExceptionErrorCallback.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -48,6 +48,7 @@ import java.util.ArrayList; import java.util.List; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins; import com.oracle.graal.python.builtins.objects.PNone; @@ -61,7 +62,7 @@ import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PIncompleteSourceException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.nodes.Node; @@ -163,7 +164,7 @@ public SourceSection getSourceSection() { cls = PythonBuiltinClassType.TabError; break; } - instance = PythonObjectFactory.getUncached().createBaseException(cls, message, PythonUtils.EMPTY_OBJECT_ARRAY); + instance = PFactory.createBaseException(PythonLanguage.get(null), cls, message, PythonUtils.EMPTY_OBJECT_ARRAY); final Object[] excAttrs = SyntaxErrorBuiltins.SYNTAX_ERROR_ATTR_FACTORY.create(); TruffleString filename = getFilename(source); excAttrs[SyntaxErrorBuiltins.IDX_FILENAME] = filename; @@ -174,7 +175,7 @@ public SourceSection getSourceSection() { // Not very nice. This counts on the implementation in traceback.py where if the value of // text attribute is NONE, then the line is not printed Object text = PNone.NONE; - if (sourceRange.startLine <= source.getLineCount()) { + if (source.hasCharacters() && sourceRange.startLine <= source.getLineCount()) { text = toTruffleStringUncached(source.getCharacters(sourceRange.startLine).toString()); } excAttrs[SyntaxErrorBuiltins.IDX_MSG] = message; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/SourceMap.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/SourceMap.java index ca2faf8422..2d12bf55f6 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/SourceMap.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/SourceMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -198,6 +198,9 @@ public void appendLocation(int startLine, int startColumn, int endLine, int endC if (endLine == 0) { endLine = startLine; } + if (endColumn == 0) { + endColumn = startColumn; + } assert startLine >= 0 && endLine >= startLine && (startLine != endLine || endColumn >= startColumn); int lineDelta = startLine - lastLine; int lineSpan = endLine - startLine; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/Unparser.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/Unparser.java index 8f8502ff61..5bbd6d1753 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/Unparser.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/Unparser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -652,7 +652,7 @@ public Void visit(ExprTy.FormattedValue node) { conversion = "!s"; break; default: - throw PRaiseNode.getUncached().raise(PythonBuiltinClassType.SystemError, ErrorMessages.UNKNOWN_F_VALUE_CONVERSION_KIND); + throw PRaiseNode.raiseStatic(null, PythonBuiltinClassType.SystemError, ErrorMessages.UNKNOWN_F_VALUE_CONVERSION_KIND); } appendStr(conversion); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/BaseBytecodeDSLVisitor.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/BaseBytecodeDSLVisitor.java new file mode 100644 index 0000000000..d0910aee08 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/BaseBytecodeDSLVisitor.java @@ -0,0 +1,493 @@ +/* + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.compiler.bytecode_dsl; + +import com.oracle.graal.python.pegparser.sst.AliasTy; +import com.oracle.graal.python.pegparser.sst.ArgTy; +import com.oracle.graal.python.pegparser.sst.ArgumentsTy; +import com.oracle.graal.python.pegparser.sst.ComprehensionTy; +import com.oracle.graal.python.pegparser.sst.ExceptHandlerTy; +import com.oracle.graal.python.pegparser.sst.ExprTy; +import com.oracle.graal.python.pegparser.sst.KeywordTy; +import com.oracle.graal.python.pegparser.sst.MatchCaseTy; +import com.oracle.graal.python.pegparser.sst.ModTy; +import com.oracle.graal.python.pegparser.sst.PatternTy; +import com.oracle.graal.python.pegparser.sst.SSTNode; +import com.oracle.graal.python.pegparser.sst.SSTreeVisitor; +import com.oracle.graal.python.pegparser.sst.StmtTy; +import com.oracle.graal.python.pegparser.sst.TypeIgnoreTy.TypeIgnore; +import com.oracle.graal.python.pegparser.sst.WithItemTy; + +/** + * This interface provides default implementations of all {@code SSTreeVisitor} methods, which makes + * it easier to incrementally add support to the Bytecode DSL compiler. Once the compiler is stable, + * this interface should be removed. + */ +public interface BaseBytecodeDSLVisitor extends SSTreeVisitor { + + default T defaultValue(SSTNode node) { + throw new UnsupportedOperationException(getClass().getSimpleName() + ": " + node.getClass().getSimpleName()); + } + + default void visitNode(SSTNode node) { + if (node != null) { + node.accept(this); + } + } + + default T visit(AliasTy node) { + return defaultValue(node); + } + + default T visit(ArgTy node) { + return defaultValue(node); + } + + default T visit(ArgumentsTy node) { + visitSequence(node.defaults); + visitSequence(node.kwDefaults); + return defaultValue(node); + } + + default T visit(ComprehensionTy node) { + visitNode(node.iter); + visitSequence(node.ifs); + visitNode(node.target); + return defaultValue(node); + } + + default T visit(ExprTy.Attribute node) { + visitNode(node.value); + return defaultValue(node); + } + + default T visit(ExprTy.Await node) { + visitNode(node.value); + return defaultValue(node); + } + + default T visit(ExprTy.BinOp node) { + visitNode(node.left); + visitNode(node.right); + return defaultValue(node); + } + + default T visit(ExprTy.BoolOp node) { + visitSequence(node.values); + return defaultValue(node); + } + + default T visit(ExprTy.Call node) { + visitNode(node.func); + visitSequence(node.args); + visitSequence(node.keywords); + return defaultValue(node); + } + + default T visit(ExprTy.Compare node) { + visitNode(node.left); + visitSequence(node.comparators); + return defaultValue(node); + } + + default T visit(ExprTy.Constant node) { + return defaultValue(node); + } + + default T visit(ExprTy.Dict node) { + visitSequence(node.keys); + visitSequence(node.values); + return defaultValue(node); + } + + default T visit(ExprTy.DictComp node) { + visitSequence(node.generators); + visitNode(node.key); + visitNode(node.value); + return defaultValue(node); + } + + default T visit(ExprTy.FormattedValue node) { + visitNode(node.formatSpec); + visitNode(node.value); + return defaultValue(node); + } + + default T visit(ExprTy.GeneratorExp node) { + visitNode(node.element); + visitSequence(node.generators); + return defaultValue(node); + } + + default T visit(ExprTy.IfExp node) { + visitNode(node.test); + visitNode(node.body); + visitNode(node.orElse); + return defaultValue(node); + } + + default T visit(ExprTy.JoinedStr node) { + visitSequence(node.values); + return defaultValue(node); + } + + default T visit(ExprTy.Lambda node) { + visitNode(node.body); + return defaultValue(node); + } + + default T visit(ExprTy.List node) { + visitSequence(node.elements); + return defaultValue(node); + } + + default T visit(ExprTy.ListComp node) { + visitSequence(node.generators); + visitNode(node.element); + return defaultValue(node); + } + + default T visit(ExprTy.Name node) { + return defaultValue(node); + } + + default T visit(ExprTy.NamedExpr node) { + visitNode(node.target); + visitNode(node.value); + return defaultValue(node); + } + + default T visit(ExprTy.Set node) { + visitSequence(node.elements); + return defaultValue(node); + } + + default T visit(ExprTy.SetComp node) { + visitSequence(node.generators); + visitNode(node.element); + return defaultValue(node); + } + + default T visit(ExprTy.Slice node) { + visitNode(node.lower); + visitNode(node.upper); + visitNode(node.step); + return defaultValue(node); + } + + default T visit(ExprTy.Starred node) { + visitNode(node.value); + return defaultValue(node); + } + + default T visit(ExprTy.Subscript node) { + visitNode(node.value); + visitNode(node.slice); + return defaultValue(node); + } + + default T visit(ExprTy.Tuple node) { + visitSequence(node.elements); + return defaultValue(node); + } + + default T visit(ExprTy.UnaryOp node) { + visitNode(node.operand); + return defaultValue(node); + } + + default T visit(ExprTy.Yield node) { + visitNode(node.value); + return defaultValue(node); + } + + default T visit(ExprTy.YieldFrom node) { + visitNode(node.value); + return defaultValue(node); + } + + default T visit(KeywordTy node) { + visitNode(node.value); + return defaultValue(node); + } + + default T visit(ModTy.Expression node) { + visitNode(node.body); + return defaultValue(node); + } + + default T visit(ModTy.FunctionType node) { + visitNode(node.returns); + return defaultValue(node); + } + + default T visit(ModTy.Interactive node) { + visitSequence(node.body); + return defaultValue(node); + } + + default T visit(ModTy.Module node) { + visitSequence(node.body); + return defaultValue(node); + } + + default T visit(StmtTy.AnnAssign node) { + visitNode(node.target); + visitNode(node.annotation); + visitNode(node.value); + return defaultValue(node); + } + + default T visit(StmtTy.Assert node) { + visitNode(node.test); + visitNode(node.msg); + return defaultValue(node); + } + + default T visit(StmtTy.Assign node) { + visitNode(node.value); + visitSequence(node.targets); + return defaultValue(node); + } + + default T visit(StmtTy.AsyncFor node) { + visitNode(node.target); + visitNode(node.iter); + visitSequence(node.body); + visitSequence(node.orElse); + return defaultValue(node); + } + + default T visit(StmtTy.AsyncFunctionDef node) { + visitSequence(node.decoratorList); + visitNode(node.args); + visitNode(node.returns); + visitSequence(node.body); + return defaultValue(node); + } + + default T visit(StmtTy.AsyncWith node) { + visitSequence(node.items); + visitSequence(node.body); + return defaultValue(node); + } + + default T visit(StmtTy.AugAssign node) { + visitNode(node.target); + visitNode(node.value); + return defaultValue(node); + } + + default T visit(StmtTy.ClassDef node) { + visitSequence(node.decoratorList); + visitSequence(node.bases); + visitSequence(node.keywords); + visitSequence(node.body); + return defaultValue(node); + } + + default T visit(StmtTy.Delete node) { + visitSequence(node.targets); + return defaultValue(node); + } + + default T visit(StmtTy.Expr node) { + visitNode(node.value); + return defaultValue(node); + } + + default T visit(StmtTy.For node) { + visitNode(node.iter); + visitNode(node.target); + visitSequence(node.body); + visitSequence(node.orElse); + return defaultValue(node); + } + + default T visit(StmtTy.FunctionDef node) { + visitSequence(node.decoratorList); + visitNode(node.args); + visitNode(node.returns); + visitSequence(node.body); + return defaultValue(node); + } + + default T visit(StmtTy.Global node) { + return defaultValue(node); + } + + default T visit(StmtTy.If node) { + visitNode(node.test); + visitSequence(node.body); + visitSequence(node.orElse); + return defaultValue(node); + } + + default T visit(StmtTy.Import node) { + return defaultValue(node); + } + + default T visit(StmtTy.ImportFrom node) { + return defaultValue(node); + } + + default T visit(StmtTy.Match node) { + visitNode(node.subject); + visitSequence(node.cases); + return defaultValue(node); + } + + default T visit(MatchCaseTy node) { + visitNode(node.pattern); + visitNode(node.guard); + visitSequence(node.body); + return defaultValue(node); + } + + default T visit(PatternTy.MatchAs node) { + visitNode(node.pattern); + return defaultValue(node); + } + + default T visit(PatternTy.MatchClass node) { + visitSequence(node.patterns); + visitSequence(node.kwdPatterns); + visitNode(node.cls); + return defaultValue(node); + } + + default T visit(PatternTy.MatchMapping node) { + visitSequence(node.keys); + visitSequence(node.patterns); + return defaultValue(node); + } + + default T visit(PatternTy.MatchOr node) { + visitSequence(node.patterns); + return defaultValue(node); + } + + default T visit(PatternTy.MatchSequence node) { + visitSequence(node.patterns); + return defaultValue(node); + } + + default T visit(PatternTy.MatchSingleton node) { + return defaultValue(node); + } + + default T visit(PatternTy.MatchStar node) { + return defaultValue(node); + } + + default T visit(PatternTy.MatchValue node) { + visitNode(node.value); + return defaultValue(node); + } + + default T visit(StmtTy.Nonlocal node) { + return defaultValue(node); + } + + default T visit(StmtTy.Raise node) { + visitNode(node.exc); + visitNode(node.cause); + return defaultValue(node); + } + + default T visit(StmtTy.Return node) { + visitNode(node.value); + return defaultValue(node); + } + + default T visit(StmtTy.Try node) { + visitSequence(node.body); + visitSequence(node.orElse); + visitSequence(node.finalBody); + visitSequence(node.handlers); + return defaultValue(node); + } + + default T visit(StmtTy.TryStar node) { + return defaultValue(node); + } + + default T visit(ExceptHandlerTy.ExceptHandler node) { + visitNode(node.type); + visitSequence(node.body); + return defaultValue(node); + } + + default T visit(StmtTy.While node) { + visitNode(node.test); + visitSequence(node.body); + visitSequence(node.orElse); + return defaultValue(node); + } + + default T visit(StmtTy.With node) { + visitSequence(node.items); + visitSequence(node.body); + return defaultValue(node); + } + + default T visit(WithItemTy node) { + visitNode(node.contextExpr); + visitNode(node.optionalVars); + return defaultValue(node); + } + + default T visit(StmtTy.Break node) { + return defaultValue(node); + } + + default T visit(StmtTy.Continue node) { + return defaultValue(node); + } + + default T visit(StmtTy.Pass node) { + return defaultValue(node); + } + + default T visit(TypeIgnore node) { + return defaultValue(node); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/BytecodeDSLCompiler.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/BytecodeDSLCompiler.java new file mode 100644 index 0000000000..11e21db32b --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/BytecodeDSLCompiler.java @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.compiler.bytecode_dsl; + +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.compiler.Compiler; +import com.oracle.graal.python.compiler.RaisePythonExceptionErrorCallback; +import com.oracle.graal.python.nodes.bytecode_dsl.BytecodeDSLCodeUnit; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode; +import com.oracle.graal.python.pegparser.FutureFeature; +import com.oracle.graal.python.pegparser.scope.Scope; +import com.oracle.graal.python.pegparser.scope.ScopeEnvironment; +import com.oracle.graal.python.pegparser.sst.ModTy; +import com.oracle.graal.python.pegparser.sst.StmtTy; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.truffle.api.source.Source; + +public class BytecodeDSLCompiler { + + public static final record BytecodeDSLCompilerResult(PBytecodeDSLRootNode rootNode, BytecodeDSLCodeUnit codeUnit) { + } + + public static BytecodeDSLCompilerResult compile(PythonLanguage language, PythonContext context, ModTy mod, Source source, int optimize, RaisePythonExceptionErrorCallback errorCallback, + EnumSet futureFeatures) { + /** + * Parse __future__ annotations before the analysis step. The analysis does extra validation + * when __future__.annotations is imported. + */ + int futureLineNumber = parseFuture(mod, futureFeatures, errorCallback); + ScopeEnvironment scopeEnvironment = ScopeEnvironment.analyze(mod, errorCallback, futureFeatures); + BytecodeDSLCompilerContext ctx = new BytecodeDSLCompilerContext(language, context, mod, source, optimize, futureFeatures, futureLineNumber, errorCallback, scopeEnvironment); + RootNodeCompiler compiler = new RootNodeCompiler(ctx, mod, futureFeatures); + return compiler.compile(); + } + + private static int parseFuture(ModTy mod, EnumSet futureFeatures, RaisePythonExceptionErrorCallback errorCallback) { + StmtTy[] stmts = null; + if (mod instanceof ModTy.Module module) { + stmts = module.body; + } else if (mod instanceof ModTy.Interactive interactive) { + stmts = interactive.body; + } else { + return -1; + } + return Compiler.parseFuture(stmts, futureFeatures, errorCallback); + } + + public static class BytecodeDSLCompilerContext { + + public final PythonLanguage language; + public final PythonContext pythonContext; + public final ModTy mod; + public final Source source; + public final int optimizationLevel; + public final EnumSet futureFeatures; + public final int futureLineNumber; + public final RaisePythonExceptionErrorCallback errorCallback; + public final ScopeEnvironment scopeEnvironment; + public final Map qualifiedNames; + + public BytecodeDSLCompilerContext(PythonLanguage language, PythonContext context, ModTy mod, Source source, int optimizationLevel, + EnumSet futureFeatures, int futureLineNumber, RaisePythonExceptionErrorCallback errorCallback, ScopeEnvironment scopeEnvironment) { + this.language = language; + this.pythonContext = context; + this.mod = mod; + this.source = source; + this.optimizationLevel = optimizationLevel; + this.futureFeatures = futureFeatures; + this.futureLineNumber = futureLineNumber; + this.errorCallback = errorCallback; + this.scopeEnvironment = scopeEnvironment; + this.qualifiedNames = new HashMap<>(); + } + + String mangle(Scope scope, String name) { + return ScopeEnvironment.mangle(getClassName(scope), name); + } + + String getClassName(Scope s) { + Scope cur = s; + while (cur != null) { + if (cur.isClass()) { + return cur.getName(); + } + cur = scopeEnvironment.lookupParent(cur); + } + return null; + } + + String getQualifiedName(Scope scope) { + if (qualifiedNames.containsKey(scope)) { + return qualifiedNames.get(scope); + } else { + String qualifiedName = computeQualifiedName(scope); + qualifiedNames.put(scope, qualifiedName); + return qualifiedName; + } + } + + private String computeQualifiedName(Scope scope) { + String qualifiedName = scope.getName(); + Scope parentScope = scopeEnvironment.lookupParent(scope); + if (parentScope != null && parentScope != scopeEnvironment.getTopScope()) { + if (!((scope.isFunction() || scope.isClass()) && parentScope.getUseOfName(mangle(scope, scope.getName())).contains(Scope.DefUse.GlobalExplicit))) { + // Qualify the name, unless it's a function/class and the parent declared the + // name as a global (in which case the function/class doesn't belong to the + // parent). + if (parentScope.isFunction()) { + qualifiedName = getQualifiedName(parentScope) + ".." + scope.getName(); + } else { + qualifiedName = getQualifiedName(parentScope) + "." + scope.getName(); + } + } + } + + return qualifiedName; + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/RootNodeCompiler.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/RootNodeCompiler.java new file mode 100644 index 0000000000..3ebcfbb43d --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/compiler/bytecode_dsl/RootNodeCompiler.java @@ -0,0 +1,5089 @@ +/* + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.compiler.bytecode_dsl; + +import static com.oracle.graal.python.compiler.CompilationScope.Class; +import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___CLASS__; +import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.code.PCode; +import com.oracle.graal.python.builtins.objects.ellipsis.PEllipsis; +import com.oracle.graal.python.builtins.objects.function.PArguments; +import com.oracle.graal.python.builtins.objects.function.PKeyword; +import com.oracle.graal.python.builtins.objects.type.TypeFlags; +import com.oracle.graal.python.compiler.CompilationScope; +import com.oracle.graal.python.compiler.Compiler; +import com.oracle.graal.python.compiler.Compiler.ConstantCollection; +import com.oracle.graal.python.compiler.OpCodes.CollectionBits; +import com.oracle.graal.python.compiler.Unparser; +import com.oracle.graal.python.compiler.bytecode_dsl.BytecodeDSLCompiler.BytecodeDSLCompilerContext; +import com.oracle.graal.python.compiler.bytecode_dsl.BytecodeDSLCompiler.BytecodeDSLCompilerResult; +import com.oracle.graal.python.lib.PyObjectRichCompareBool; +import com.oracle.graal.python.nodes.StringLiterals; +import com.oracle.graal.python.nodes.bytecode_dsl.BytecodeDSLCodeUnit; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNodeGen; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNodeGen.Builder; +import com.oracle.graal.python.pegparser.ErrorCallback.ErrorType; +import com.oracle.graal.python.pegparser.ErrorCallback.WarningType; +import com.oracle.graal.python.pegparser.FutureFeature; +import com.oracle.graal.python.pegparser.scope.Scope; +import com.oracle.graal.python.pegparser.scope.Scope.DefUse; +import com.oracle.graal.python.pegparser.sst.AliasTy; +import com.oracle.graal.python.pegparser.sst.ArgTy; +import com.oracle.graal.python.pegparser.sst.ArgumentsTy; +import com.oracle.graal.python.pegparser.sst.BoolOpTy; +import com.oracle.graal.python.pegparser.sst.CmpOpTy; +import com.oracle.graal.python.pegparser.sst.ComprehensionTy; +import com.oracle.graal.python.pegparser.sst.ConstantValue; +import com.oracle.graal.python.pegparser.sst.ConstantValue.Kind; +import com.oracle.graal.python.pegparser.sst.ExceptHandlerTy; +import com.oracle.graal.python.pegparser.sst.ExprContextTy; +import com.oracle.graal.python.pegparser.sst.ExprTy; +import com.oracle.graal.python.pegparser.sst.ExprTy.Constant; +import com.oracle.graal.python.pegparser.sst.ExprTy.DictComp; +import com.oracle.graal.python.pegparser.sst.ExprTy.GeneratorExp; +import com.oracle.graal.python.pegparser.sst.ExprTy.Lambda; +import com.oracle.graal.python.pegparser.sst.ExprTy.ListComp; +import com.oracle.graal.python.pegparser.sst.ExprTy.SetComp; +import com.oracle.graal.python.pegparser.sst.KeywordTy; +import com.oracle.graal.python.pegparser.sst.MatchCaseTy; +import com.oracle.graal.python.pegparser.sst.ModTy; +import com.oracle.graal.python.pegparser.sst.OperatorTy; +import com.oracle.graal.python.pegparser.sst.PatternTy; +import com.oracle.graal.python.pegparser.sst.SSTNode; +import com.oracle.graal.python.pegparser.sst.StmtTy; +import com.oracle.graal.python.pegparser.sst.StmtTy.AsyncFunctionDef; +import com.oracle.graal.python.pegparser.sst.UnaryOpTy; +import com.oracle.graal.python.pegparser.sst.WithItemTy; +import com.oracle.graal.python.pegparser.tokenizer.SourceRange; +import com.oracle.graal.python.util.PythonUtils; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.bytecode.BytecodeConfig; +import com.oracle.truffle.api.bytecode.BytecodeLabel; +import com.oracle.truffle.api.bytecode.BytecodeLocal; +import com.oracle.truffle.api.bytecode.BytecodeParser; +import com.oracle.truffle.api.bytecode.BytecodeRootNodes; +import com.oracle.truffle.api.instrumentation.StandardTags.StatementTag; +import com.oracle.truffle.api.strings.TruffleString; + +/** + * Compiles a top-level AST (modules, functions, classes, etc.) to a root node. Produces a + * {@link BytecodeDSLCompilerResult}. Every instance is associated with corresponding + * {@link SSTNode} that represents the compiled top level AST. + *

        + * The class implements SST visitor, so that it can have a separate handler for each top-level AST + * node type, the handler (one of the {@code visit} methods) then creates a lambda of type + * {@link BytecodeParser}, which captures the node being compiled and the instance of + * {@link RootNodeCompiler}, and it uses the {@link RootNodeCompiler} to do the parsing itself. The + * {@link BytecodeParser} instance is passed to Truffle API + * {@link PBytecodeDSLRootNodeGen#create(PythonLanguage, BytecodeConfig, BytecodeParser)} to trigger + * the parsing. Truffle keeps the lambda, and it may invoke it again when it needs to perform the + * parsing of the given node again. + *

        + * The parsing must happen within the {@link BytecodeParser} lambda invocation. + *

        + * This visitor also captures compilation unit state, such as the map of local variables, and serves + * the same purpose as the {@code compiler_unit} struct in the CPython compiler. Instead of explicit + * stack of compiler units, we use implicitly Java stack and new instances of + * {@link RootNodeCompiler}. + *

        + * For the parsing of the body of the top level AST element, this visitor delegates to the + * {@link StatementCompiler}, which does all the heavy lifting. + */ +public final class RootNodeCompiler implements BaseBytecodeDSLVisitor { + /** + * Because a {@link RootNodeCompiler} instance gets reused on reparse, it should be idempotent. + * Consequently, most of its fields are final and immutable/not mutated after construction. For + * some tables updated during parsing (e.g., the constants map), we ensure these updates are + * idempotent. Any remaining fields must be {@link #reset()} at the beginning of the parse. + */ + // Immutable + private final BytecodeDSLCompilerContext ctx; + private final SSTNode startNode; + private final Scope scope; + private final CompilationScope scopeType; + private final boolean isInteractive; + private final EnumSet futureFeatures; + + // Immutable after construction + private final HashMap varnames; + private final HashMap cellvars; + private final HashMap freevars; + private final int[] cell2arg; + private final String selfCellName; + + // Updated idempotently: the keys are filled during first parsing, on subsequent parsings the + // values will be just overridden, but no new keys should be added. + private final Map locals = new HashMap<>(); + private final Map cellLocals = new HashMap<>(); + private final Map freeLocals = new HashMap<>(); + private final HashMap constants = new HashMap<>(); + private final HashMap names = new HashMap<>(); + + // Mutable (must be reset) + private SourceRange currentLocation; + + public RootNodeCompiler(BytecodeDSLCompilerContext ctx, SSTNode rootNode, EnumSet futureFeatures) { + this.ctx = ctx; + this.startNode = rootNode; + this.scope = ctx.scopeEnvironment.lookupScope(rootNode); + this.scopeType = getScopeType(scope, rootNode); + this.isInteractive = rootNode instanceof ModTy.Interactive; + this.futureFeatures = futureFeatures; + + this.varnames = new HashMap<>(); + if (scope.isFunction()) { + /* + * scope.getVarnames only returns parameters. We use the scope to collect the rest of + * the regular variables. + */ + for (int i = 0; i < scope.getVarnames().size(); i++) { + varnames.put(scope.getVarnames().get(i), i); + } + varnames.putAll(scope.getSymbolsByType(EnumSet.of(DefUse.Local), EnumSet.of(DefUse.DefParam, DefUse.Cell, DefUse.Free), varnames.size())); + } + + this.cellvars = scope.getSymbolsByType(EnumSet.of(Scope.DefUse.Cell), 0); + if (scope.needsClassClosure()) { + assert scopeType == Class; + assert cellvars.isEmpty(); + cellvars.put("__class__", 0); + } + + this.freevars = scope.getSymbolsByType(EnumSet.of(Scope.DefUse.Free, Scope.DefUse.DefFreeClass), 0); + + int[] cell2argValue = new int[cellvars.size()]; + boolean hasArgCell = false; + Arrays.fill(cell2argValue, -1); + String selfCellNameValue = null; + for (String cellvar : cellvars.keySet()) { + if (varnames.containsKey(cellvar)) { + int argIndex = varnames.get(cellvar); + cell2argValue[cellvars.get(cellvar)] = argIndex; + hasArgCell = true; + if (argIndex == 0) { + assert selfCellNameValue == null; + selfCellNameValue = cellvar; + } + } + } + this.cell2arg = hasArgCell ? cell2argValue : null; + this.selfCellName = selfCellNameValue; + } + + private static CompilationScope getScopeType(Scope scope, SSTNode rootNode) { + if (scope.isModule()) { + return CompilationScope.Module; + } else if (scope.isClass()) { + return CompilationScope.Class; + } else if (scope.isFunction()) { + if (rootNode instanceof Lambda) { + return CompilationScope.Lambda; + } else if (rootNode instanceof AsyncFunctionDef) { + return CompilationScope.AsyncFunction; + } else if (rootNode instanceof DictComp || rootNode instanceof ListComp || rootNode instanceof SetComp || rootNode instanceof GeneratorExp) { + return CompilationScope.Comprehension; + } else { + return CompilationScope.Function; + } + } else { + throw new IllegalStateException("Unexpected scope: " + scope); + } + } + + private static U[] orderedKeys(HashMap map, U[] base, Function converter) { + U[] result = Arrays.copyOf(base, map.size()); + for (Map.Entry e : map.entrySet()) { + result[e.getValue()] = converter.apply(e.getKey()); + } + return result; + } + + private static T[] orderedKeys(HashMap map, T[] base) { + return orderedKeys(map, base, x -> x); + } + + private Object addConstant(Object c) { + Integer v = constants.get(c); + if (v == null) { + v = constants.size(); + constants.put(c, v); + } + return c; + } + + private static TruffleString[] orderedTruffleStringArray(HashMap map) { + return orderedKeys(map, new TruffleString[0], PythonUtils::toTruffleStringUncached); + } + + private BytecodeDSLCompilerResult compileRootNode(String name, ArgumentInfo argumentInfo, SourceRange sourceRange, BytecodeParser parser) { + BytecodeRootNodes nodes = PBytecodeDSLRootNodeGen.create(ctx.language, BytecodeConfig.WITH_SOURCE, parser); + List nodeList = nodes.getNodes(); + assert nodeList.size() == 1; + PBytecodeDSLRootNode rootNode = nodeList.get(0); + + int flags = PCode.CO_OPTIMIZED | PCode.CO_NEWLOCALS; + flags |= argumentInfo.takesVarArgs ? PCode.CO_VARARGS : 0; + flags |= argumentInfo.takesVarKeywordArgs ? PCode.CO_VARKEYWORDS : 0; + if (scope.isNested()) { + flags |= PCode.CO_NESTED; + } + if (scope.isModule()) { + flags |= PCode.CO_GRAALPYHON_MODULE; + } + if (scope.isGenerator() && scope.isCoroutine()) { + flags |= PCode.CO_ASYNC_GENERATOR; + } else if (scope.isGenerator()) { + flags |= PCode.CO_GENERATOR; + } else if (scope.isCoroutine()) { + flags |= PCode.CO_COROUTINE; + } + for (FutureFeature flag : futureFeatures) { + flags |= flag.flagValue; + } + + int classcellIndex = -1; + if (freeLocals.containsKey(J___CLASS__)) { + classcellIndex = freeLocals.get(J___CLASS__).getLocalOffset(); + } + + int selfIndex = -1; + if (argumentInfo.nonEmpty()) { + selfIndex = 0; + if (selfCellName != null) { + selfIndex = cellLocals.get(selfCellName).getLocalOffset(); + } + } + + BytecodeDSLCodeUnit codeUnit = new BytecodeDSLCodeUnit(toTruffleStringUncached(name), toTruffleStringUncached(ctx.getQualifiedName(scope)), + argumentInfo.argCount, argumentInfo.kwOnlyArgCount, argumentInfo.positionalOnlyArgCount, + flags, orderedTruffleStringArray(names), + orderedTruffleStringArray(varnames), + orderedTruffleStringArray(cellvars), + orderedTruffleStringArray(freevars), + cell2arg, + orderedKeys(constants, new Object[0]), + sourceRange.startLine, + sourceRange.startColumn, + sourceRange.endLine, + sourceRange.endColumn, + classcellIndex, + selfIndex, + null, + nodes); + rootNode.setMetadata(codeUnit, ctx.errorCallback); + return new BytecodeDSLCompilerResult(rootNode, codeUnit); + } + + private static class ArgumentInfo { + static final ArgumentInfo NO_ARGS = new ArgumentInfo(0, 0, 0, false, false); + + final int argCount; + final int positionalOnlyArgCount; + final int kwOnlyArgCount; + final boolean takesVarArgs; + final boolean takesVarKeywordArgs; + + ArgumentInfo(int argCount, int positionalOnlyArgCount, int kwOnlyArgCount, boolean takesVarArgs, boolean takesVarKeywordArgs) { + this.argCount = argCount; + this.positionalOnlyArgCount = positionalOnlyArgCount; + this.kwOnlyArgCount = kwOnlyArgCount; + this.takesVarArgs = takesVarArgs; + this.takesVarKeywordArgs = takesVarKeywordArgs; + } + + static ArgumentInfo fromArguments(ArgumentsTy args) { + int argc, pargc, kwargc; + boolean splat, kwSplat; + if (args == null) { + argc = pargc = kwargc = 0; + splat = kwSplat = false; + } else { + argc = args.args == null ? 0 : args.args.length; + pargc = args.posOnlyArgs == null ? 0 : args.posOnlyArgs.length; + kwargc = args.kwOnlyArgs == null ? 0 : args.kwOnlyArgs.length; + splat = args.varArg != null; + kwSplat = args.kwArg != null; + } + return new ArgumentInfo(argc, pargc, kwargc, splat, kwSplat); + } + + private boolean nonEmpty() { + return argCount + positionalOnlyArgCount + kwOnlyArgCount > 0 || takesVarArgs || takesVarKeywordArgs; + } + } + + private void checkForbiddenName(String id, NameOperation context) { + checkForbiddenName(id, context, currentLocation); + } + + private void checkForbiddenName(String id, NameOperation context, SourceRange location) { + if (context == NameOperation.BeginWrite) { + if (id.equals("__debug__")) { + ctx.errorCallback.onError(ErrorType.Syntax, location, "cannot assign to __debug__"); + } + } + if (context == NameOperation.Delete) { + if (id.equals("__debug__")) { + ctx.errorCallback.onError(ErrorType.Syntax, location, "cannot delete __debug__"); + } + } + } + + private void checkForbiddenArgs(ArgumentsTy args, SourceRange location) { + if (args != null) { + if (args.posOnlyArgs != null) { + for (ArgTy arg : args.posOnlyArgs) { + checkForbiddenName(arg.arg, NameOperation.BeginWrite, location); + } + } + if (args.args != null) { + for (ArgTy arg : args.args) { + checkForbiddenName(arg.arg, NameOperation.BeginWrite, location); + } + } + if (args.kwOnlyArgs != null) { + for (ArgTy arg : args.kwOnlyArgs) { + checkForbiddenName(arg.arg, NameOperation.BeginWrite, location); + } + } + if (args.varArg != null) { + checkForbiddenName(args.varArg.arg, NameOperation.BeginWrite, location); + } + if (args.kwArg != null) { + checkForbiddenName(args.kwArg.arg, NameOperation.BeginWrite, location); + } + } + } + + private boolean containsAnnotations(StmtTy[] stmts) { + if (stmts == null) { + return false; + } + for (StmtTy stmt : stmts) { + if (containsAnnotations(stmt)) { + return true; + } + } + return false; + } + + private boolean containsAnnotations(StmtTy stmt) { + if (stmt instanceof StmtTy.AnnAssign) { + return true; + } else if (stmt instanceof StmtTy.For) { + return containsAnnotations(((StmtTy.For) stmt).body) || containsAnnotations(((StmtTy.For) stmt).orElse); + } else if (stmt instanceof StmtTy.While) { + return containsAnnotations(((StmtTy.While) stmt).body) || containsAnnotations(((StmtTy.While) stmt).orElse); + } else if (stmt instanceof StmtTy.If) { + return containsAnnotations(((StmtTy.If) stmt).body) || containsAnnotations(((StmtTy.If) stmt).orElse); + } else if (stmt instanceof StmtTy.With) { + return containsAnnotations(((StmtTy.With) stmt).body); + } else if (stmt instanceof StmtTy.Try) { + StmtTy.Try tryStmt = (StmtTy.Try) stmt; + if (tryStmt.handlers != null) { + for (ExceptHandlerTy h : tryStmt.handlers) { + if (containsAnnotations(((ExceptHandlerTy.ExceptHandler) h).body)) { + return true; + } + } + } + return containsAnnotations(tryStmt.body) || containsAnnotations(tryStmt.finalBody) || containsAnnotations(tryStmt.orElse); + } + return false; + } + + private static final class ParamAnnotation { + final TruffleString name; + final ExprTy annotation; + + ParamAnnotation(TruffleString name, ExprTy annotation) { + this.name = name; + this.annotation = annotation; + } + } + + private List collectParamAnnotations(ArgumentsTy args, ExprTy returns) { + List result = new ArrayList<>(); + if (args != null) { + visitParamAnnotations(result, args.args); + visitParamAnnotations(result, args.posOnlyArgs); + if (args.varArg != null) { + visitParamAnnotation(result, args.varArg.arg, args.varArg.annotation); + } + visitParamAnnotations(result, args.kwOnlyArgs); + if (args.kwArg != null) { + visitParamAnnotation(result, args.kwArg.arg, args.kwArg.annotation); + } + } + visitParamAnnotation(result, "return", returns); + return result; + } + + private void visitParamAnnotations(List result, ArgTy[] args) { + for (int i = 0; i < args.length; i++) { + visitParamAnnotation(result, args[i].arg, args[i].annotation); + } + } + + private void visitParamAnnotation(List result, String name, ExprTy annotation) { + if (annotation != null) { + String mangled = mangle(name); + result.add(new ParamAnnotation(toTruffleStringUncached(mangled), annotation)); + } + } + + public BytecodeDSLCompilerResult compile() { + return startNode.accept(this); + } + + public void reset() { + this.currentLocation = null; + } + + // -------------- helpers -------------- + + void beginRootNode(SSTNode node, ArgumentsTy args, Builder b) { + reset(); + b.beginSource(ctx.source); + beginRootSourceSection(node, b); + + b.beginRoot(); + + checkForbiddenArgs(args, node.getSourceRange()); + setUpFrame(args, b); + + b.emitTraceOrProfileCall(); + } + + void endRootNode(Builder b) { + b.endRoot(); + endRootSourceSection(b); + b.endSource(); + } + + /** + * Opens a new SourceSection operation. Emits TraceLine and starts a new Tag(Statement) if this + * location has a different line from the previous location. + *

        + * Returns whether this call opened a new Tag(Statement). The result should be passed to the + * corresponding {@link #endSourceSection} call to ensure the Tag is closed. + */ + boolean beginSourceSection(SSTNode node, Builder b) { + SourceRange sourceRange = node.getSourceRange(); + SourceRange oldSourceRange = this.currentLocation; + this.currentLocation = sourceRange; + + if (ctx.source.hasCharacters()) { + int startOffset = getStartOffset(sourceRange); + int endOffset = getEndOffset(sourceRange); + int length = endOffset - startOffset; + if (length == 0) { + startOffset = 0; + } + b.beginSourceSection(startOffset, length); + + if (oldSourceRange == null || oldSourceRange.startLine != sourceRange.startLine) { + b.beginTag(StatementTag.class); + b.beginBlock(); + b.emitTraceLine(sourceRange.startLine); + return true; + } + } + return false; + } + + /** + * Same as {@link #beginSourceSection(SSTNode, Builder)}, but does not emit tags or trace events + * (since the root has not been started yet). Avoids setting {@link #currentLocation} so that + * {{@link #beginSourceSection(SSTNode, Builder)} will emit a TraceLine for a statement on the + * first line. + */ + void beginRootSourceSection(SSTNode node, Builder b) { + SourceRange sourceRange = node.getSourceRange(); + + if (ctx.source.hasCharacters()) { + int startOffset = getStartOffset(sourceRange); + int endOffset = getEndOffset(sourceRange); + int length = endOffset - startOffset; + if (length == 0) { + startOffset = 0; + } + b.beginSourceSection(startOffset, length); + } + } + + void endSourceSection(Builder b, boolean closeTag) { + if (ctx.source.hasCharacters()) { + if (closeTag) { + b.endBlock(); + b.endTag(StatementTag.class); + } + b.endSourceSection(); + } + } + + void endRootSourceSection(Builder b) { + if (ctx.source.hasCharacters()) { + b.endSourceSection(); + } + } + + int getStartOffset(SourceRange sourceRange) { + return ctx.source.getLineStartOffset(sourceRange.startLine) + sourceRange.startColumn; + } + + int getEndOffset(SourceRange sourceRange) { + return ctx.source.getLineStartOffset(sourceRange.endLine) + sourceRange.endColumn; + } + + void beginReturn(Builder b) { + b.beginReturn(); + b.beginTraceOrProfileReturn(); + } + + void endReturn(Builder b) { + b.endTraceOrProfileReturn(); + b.endReturn(); + } + + // --------------------- visitor --------------------------- + + @Override + public BytecodeDSLCompilerResult visit(ModTy.Module node) { + return compileRootNode("", ArgumentInfo.NO_ARGS, node.getSourceRange(), b -> { + beginRootNode(node, null, b); + visitModuleBody(node.body, b); + endRootNode(b); + }); + } + + @Override + public BytecodeDSLCompilerResult visit(ModTy.Expression node) { + return compileRootNode("", ArgumentInfo.NO_ARGS, node.getSourceRange(), b -> { + beginRootNode(node, null, b); + beginReturn(b); + new StatementCompiler(b).visitNode(node.body); + endReturn(b); + endRootNode(b); + }); + } + + @Override + public BytecodeDSLCompilerResult visit(ModTy.Interactive node) { + return compileRootNode("", ArgumentInfo.NO_ARGS, node.getSourceRange(), b -> { + beginRootNode(node, null, b); + visitModuleBody(node.body, b); + endRootNode(b); + }); + } + + private void visitModuleBody(StmtTy[] body, Builder b) { + if (body != null) { + if (containsAnnotations(body)) { + b.emitSetupAnnotations(); + } + + StatementCompiler statementCompiler = new StatementCompiler(b); + if (isInteractive) { + for (int i = 0; i < body.length; i++) { + StmtTy bodyNode = body[i]; + if (i == body.length - 1) { + bodyNode.accept(statementCompiler); + + // For interactive code, always return None. + beginReturn(b); + b.emitLoadConstant(PNone.NONE); + endReturn(b); + } else { + bodyNode.accept(statementCompiler); + } + } + } else { + int i = 0; + TruffleString docstring = getDocstring(body); + if (docstring != null) { + /* + * Skip over the docstring so it does not get evaluated (and registered as a + * constant) for higher optimization levels. We manually add it as a constant + * for lower levels. + */ + i++; + if (ctx.optimizationLevel < 2) { + beginStoreLocal("__doc__", b); + emitPythonConstant(docstring, b); + endStoreLocal("__doc__", b); + } + } + if (i == body.length) { + // Special case: module body just consists of a docstring. + beginReturn(b); + b.emitLoadConstant(PNone.NONE); + endReturn(b); + return; + } + + for (; i < body.length; i++) { + StmtTy bodyNode = body[i]; + if (i == body.length - 1) { + if (bodyNode instanceof StmtTy.Expr expr) { + // Return the value of the last statement for interop eval. + beginReturn(b); + expr.value.accept(statementCompiler); + endReturn(b); + } else { + bodyNode.accept(statementCompiler); + beginReturn(b); + b.emitLoadConstant(PNone.NONE); + endReturn(b); + } + } else { + bodyNode.accept(statementCompiler); + } + } + } + } else { + beginReturn(b); + b.emitLoadConstant(PNone.NONE); + endReturn(b); + } + } + + private static TruffleString getDocstring(StmtTy[] body) { + if (body != null && body.length > 0) { + StmtTy stmt = body[0]; + if (stmt instanceof StmtTy.Expr expr // + && expr.value instanceof ExprTy.Constant constant // + && constant.value.kind == ConstantValue.Kind.RAW) { + return constant.value.getRaw(TruffleString.class); + } + } + return null; + } + + @Override + public BytecodeDSLCompilerResult visit(StmtTy.FunctionDef node) { + return compileRootNode(node.name, ArgumentInfo.fromArguments(node.args), node.getSourceRange(), + b -> emitFunctionDef(node, node.args, node.body, b, getDocstring(node.body), false)); + } + + @Override + public BytecodeDSLCompilerResult visit(StmtTy.AsyncFunctionDef node) { + return compileRootNode(node.name, ArgumentInfo.fromArguments(node.args), node.getSourceRange(), + b -> emitFunctionDef(node, node.args, node.body, b, getDocstring(node.body), false)); + } + + @Override + public BytecodeDSLCompilerResult visit(ExprTy.Lambda node) { + return compileRootNode("", ArgumentInfo.fromArguments(node.args), node.getSourceRange(), + b -> emitFunctionDef(node, node.args, new SSTNode[]{node.body}, b, null, !scope.isGenerator())); + } + + private void emitFunctionDef(SSTNode node, ArgumentsTy args, SSTNode[] body, Builder b, Object docstring, boolean isRegularLambda) { + beginRootNode(node, args, b); + + int i = 0; + if (docstring != null) { + i++; + if (ctx.optimizationLevel < 2) { + addConstant(docstring); + } else { + addConstant(PNone.NONE); + } + } else { + addConstant(PNone.NONE); + } + + StatementCompiler statementCompiler = new StatementCompiler(b); + + if (isRegularLambda) { + assert i == 0; + assert body[0] instanceof ExprTy; + beginReturn(b); + body[0].accept(statementCompiler); + endReturn(b); + } else { + for (; i < body.length; i++) { + body[i].accept(statementCompiler); + } + beginReturn(b); + emitPythonConstant(PNone.NONE, b); + endReturn(b); + } + + endRootNode(b); + } + + @Override + public BytecodeDSLCompilerResult visit(StmtTy.ClassDef node) { + return compileRootNode(node.name, ArgumentInfo.NO_ARGS, node.getSourceRange(), b -> { + beginRootNode(node, null, b); + + beginStoreLocal("__module__", b); + emitReadLocal("__name__", b); + endStoreLocal("__module__", b); + + beginStoreLocal("__qualname__", b); + emitPythonConstant(toTruffleStringUncached(ctx.getQualifiedName(scope)), b); + endStoreLocal("__qualname__", b); + + if (containsAnnotations(node.body)) { + b.emitSetupAnnotations(); + } + + int i = 0; + TruffleString docstring = getDocstring(node.body); + if (docstring != null) { + i++; + if (ctx.optimizationLevel < 2) { + beginStoreLocal("__doc__", b); + emitPythonConstant(docstring, b); + endStoreLocal("__doc__", b); + } + } + + StatementCompiler statementCompiler = new StatementCompiler(b); + for (; i < node.body.length; i++) { + node.body[i].accept(statementCompiler); + } + + if (scope.needsClassClosure()) { + beginStoreLocal("__classcell__", b); + b.emitLoadLocal(cellLocals.get("__class__")); + endStoreLocal("__classcell__", b); + + beginReturn(b); + b.emitLoadLocal(cellLocals.get("__class__")); + endReturn(b); + } else { + beginReturn(b); + b.emitLoadConstant(PNone.NONE); + endReturn(b); + } + + endRootNode(b); + }); + } + + private boolean beginComprehension(ComprehensionTy comp, int index, Builder b) { + boolean newStatement = beginSourceSection(comp, b); + + BytecodeLocal localIter = b.createLocal(); + BytecodeLocal localValue = b.createLocal(); + StatementCompiler statementCompiler = new StatementCompiler(b); + + b.beginStoreLocal(localIter); + b.beginGetIter(); + if (index == 0) { + b.emitLoadArgument(PArguments.USER_ARGUMENTS_OFFSET); + } else { + comp.iter.accept(statementCompiler); + } + b.endGetIter(); + b.endStoreLocal(); + + b.beginWhile(); + + b.beginBlock(); + b.emitTraceLineAtLoopHeader(currentLocation.startLine); + b.beginForIterate(localValue); + b.emitLoadLocal(localIter); + b.endForIterate(); + b.endBlock(); + + b.beginBlock(); + + comp.target.accept(statementCompiler.new StoreVisitor(() -> b.emitLoadLocal(localValue))); + + if (comp.ifs != null) { + for (int i = 0; i < comp.ifs.length; i++) { + b.beginIfThen(); + statementCompiler.visitCondition(comp.ifs[i]); + b.beginBlock(); + } + } + + return newStatement; + } + + private void endComprehension(ComprehensionTy comp, Builder b, boolean newStatement) { + if (comp.ifs != null) { + for (int i = 0; i < len(comp.ifs); i++) { + b.endBlock(); + b.endIfThen(); + } + } + + b.endBlock(); + b.endWhile(); + + endSourceSection(b, newStatement); + } + + private BytecodeDSLCompilerResult buildComprehensionCodeUnit(SSTNode node, ComprehensionTy[] generators, String name, + Consumer emptyCollectionProducer, + BiConsumer accumulateProducer) { + return compileRootNode(name, new ArgumentInfo(1, 0, 0, false, false), node.getSourceRange(), b -> { + beginRootNode(node, null, b); + + StatementCompiler statementCompiler = new StatementCompiler(b); + boolean isGenerator = emptyCollectionProducer == null; + BytecodeLocal collectionLocal = null; + if (!isGenerator) { + collectionLocal = b.createLocal(); + b.beginStoreLocal(collectionLocal); + emptyCollectionProducer.accept(statementCompiler); + b.endStoreLocal(); + } + + boolean[] newStatement = new boolean[generators.length]; + for (int i = 0; i < generators.length; i++) { + newStatement[i] = beginComprehension(generators[i], i, b); + } + accumulateProducer.accept(statementCompiler, collectionLocal); + for (int i = generators.length - 1; i >= 0; i--) { + endComprehension(generators[i], b, newStatement[i]); + } + + beginReturn(b); + if (isGenerator) { + b.emitLoadConstant(PNone.NONE); + } else { + b.emitLoadLocal(collectionLocal); + } + endReturn(b); + + endRootNode(b); + }); + } + + @Override + public BytecodeDSLCompilerResult visit(ExprTy.ListComp node) { + return buildComprehensionCodeUnit(node, node.generators, "", + (statementCompiler) -> { + statementCompiler.b.beginMakeList(); + statementCompiler.b.emitLoadConstant(PythonUtils.EMPTY_OBJECT_ARRAY); + statementCompiler.b.endMakeList(); + }, + (statementCompiler, collection) -> { + statementCompiler.b.beginListAppend(); + statementCompiler.b.emitLoadLocal(collection); + node.element.accept(statementCompiler); + statementCompiler.b.endListAppend(); + }); + } + + @Override + public BytecodeDSLCompilerResult visit(ExprTy.DictComp node) { + return buildComprehensionCodeUnit(node, node.generators, "", + (statementCompiler) -> { + statementCompiler.b.beginMakeDict(0); + statementCompiler.b.endMakeDict(); + }, + (statementCompiler, collection) -> { + statementCompiler.b.beginSetDictItem(); + statementCompiler.b.emitLoadLocal(collection); + node.key.accept(statementCompiler); + node.value.accept(statementCompiler); + statementCompiler.b.endSetDictItem(); + }); + } + + @Override + public BytecodeDSLCompilerResult visit(ExprTy.SetComp node) { + return buildComprehensionCodeUnit(node, node.generators, "", + (statementCompiler) -> { + statementCompiler.b.beginMakeSet(); + statementCompiler.b.emitLoadConstant(PythonUtils.EMPTY_OBJECT_ARRAY); + statementCompiler.b.endMakeSet(); + }, + (statementCompiler, collection) -> { + statementCompiler.b.beginSetAdd(); + statementCompiler.b.emitLoadLocal(collection); + node.element.accept(statementCompiler); + statementCompiler.b.endSetAdd(); + }); + } + + @Override + public BytecodeDSLCompilerResult visit(ExprTy.GeneratorExp node) { + return buildComprehensionCodeUnit(node, node.generators, "", + null, + (statementCompiler, collection) -> emitYield((statementCompiler_) -> node.element.accept(statementCompiler_), statementCompiler)); + } + + enum NameOperation { + Read, + BeginWrite, + EndWrite, + Delete + } + + private String mangle(String name) { + return ctx.mangle(scope, name); + } + + private void emitNotImplemented(String what, Builder b) { + b.beginRaiseNotImplementedError(); + emitPythonConstant(toTruffleStringUncached(what), b); + b.endRaiseNotImplementedError(); + } + + /** + * Use this method for values that should show up in co_consts. + */ + private void emitPythonConstant(Object constant, Builder b) { + b.emitLoadConstant(addConstant(constant)); + } + + /** + * This helper encapsulates all of the logic needed to yield and resume. Yields should not be + * emitted directly. + */ + private static void emitYield(Consumer yieldValueProducer, StatementCompiler statementCompiler) { + statementCompiler.b.beginResumeYield(); + statementCompiler.b.beginYield(); + statementCompiler.b.beginPreYield(); + yieldValueProducer.accept(statementCompiler); + statementCompiler.b.endPreYield(); + statementCompiler.b.endYield(); + statementCompiler.b.endResumeYield(); + } + + private void emitNameCellOperation(String mangled, NameOperation op, Builder b) { + int index; + BytecodeLocal local; + if (freevars.containsKey(mangled)) { + index = freevars.get(mangled) + cellvars.size(); + local = freeLocals.get(mangled); + } else { + index = cellvars.get(mangled); + local = cellLocals.get(mangled); + } + + switch (op) { + case Read: + if (scope.isClass()) { + b.beginClassLoadCell(index); + b.emitLoadLocal(local); + b.endClassLoadCell(); + } else { + b.beginLoadCell(index); + b.emitLoadLocal(local); + b.endLoadCell(); + } + break; + case Delete: + b.beginClearCell(index); + b.emitLoadLocal(local); + b.endClearCell(); + break; + case BeginWrite: + b.beginStoreCell(); + b.emitLoadLocal(local); + break; + case EndWrite: + b.endStoreCell(); + break; + default: + throw new UnsupportedOperationException("unknown value: " + op); + } + } + + private void emitNameFastOperation(String mangled, NameOperation op, Builder b) { + BytecodeLocal local = locals.get(mangled); + switch (op) { + case Read: + b.emitCheckAndLoadLocal(local, varnames.get(mangled)); + break; + case Delete: + b.emitDeleteLocal(local, varnames.get(mangled)); + break; + case BeginWrite: + if (local == null) { + throw new NullPointerException("local " + mangled + " not defined"); + } + b.beginStoreLocal(local); + break; + case EndWrite: + b.endStoreLocal(); + break; + default: + throw new UnsupportedOperationException("unknown value: " + op); + } + } + + private void emitNameGlobalOperation(String name, NameOperation op, Builder b) { + assert locals.get(name) == null; + names.putIfAbsent(name, names.size()); + TruffleString tsName = toTruffleStringUncached(name); + switch (op) { + case Read: + b.emitReadGlobal(tsName); + break; + case Delete: + b.emitDeleteGlobal(tsName); + break; + case BeginWrite: + b.beginWriteGlobal(tsName); + break; + case EndWrite: + b.endWriteGlobal(); + break; + default: + throw new UnsupportedOperationException("unknown value: " + op); + } + } + + private void emitNameSlowOperation(String name, NameOperation op, Builder b) { + assert locals.get(name) == null; + names.putIfAbsent(name, names.size()); + TruffleString tsName = toTruffleStringUncached(name); + switch (op) { + case Read: + b.emitReadName(tsName); + break; + case Delete: + b.emitDeleteName(tsName); + break; + case BeginWrite: + b.beginWriteName(tsName); + break; + case EndWrite: + b.endWriteName(); + break; + default: + throw new UnsupportedOperationException("unknown value: " + op); + } + } + + private void emitNameOperation(String name, NameOperation op, Builder b) { + checkForbiddenName(name, op); + + String mangled = mangle(name); + EnumSet uses = scope.getUseOfName(mangled); + + if (uses != null) { + if (uses.contains(DefUse.Free)) { + assert freevars.containsKey(mangled) : String.format("scope analysis did not mark %s as a free variable", mangled); + emitNameCellOperation(mangled, op, b); + return; + } else if (uses.contains(DefUse.Cell)) { + assert cellvars.containsKey(mangled) : String.format("scope analysis did not mark %s as a cell variable", mangled); + emitNameCellOperation(mangled, op, b); + return; + } else if (uses.contains(DefUse.Local)) { + if (scope.isFunction()) { + assert varnames.containsKey(mangled) : String.format("scope analysis did not mark %s as a regular variable", mangled); + emitNameFastOperation(mangled, op, b); + return; + } + } else if (uses.contains(DefUse.GlobalImplicit)) { + if (scope.isFunction()) { + emitNameGlobalOperation(mangled, op, b); + return; + } + } else if (uses.contains(DefUse.GlobalExplicit)) { + emitNameGlobalOperation(mangled, op, b); + return; + } + } + emitNameSlowOperation(mangled, op, b); + } + + private void emitReadLocal(String name, Builder b) { + emitNameOperation(name, NameOperation.Read, b); + } + + private void emitDelLocal(String name, Builder b) { + emitNameOperation(name, NameOperation.Delete, b); + } + + private void beginStoreLocal(String name, Builder b) { + emitNameOperation(name, NameOperation.BeginWrite, b); + } + + private void endStoreLocal(String name, Builder b) { + emitNameOperation(name, NameOperation.EndWrite, b); + } + + private BytecodeLocal getLocal(String name) { + return locals.get(mangle(name)); + } + + public void setUpFrame(ArgumentsTy args, Builder b) { + /** + * This method does two things: + * + * 1. It allocates a contiguous region in the frame for Python variables. Some nodes in the + * GraalPy AST expect locals to be allocated contiguously starting at index 0. The resultant + * frame has the following layout: + * + * [var1, var2, ..., cell1, cell2, ..., free1, free2, ..., temp1, temp2, ..., stack] + * + * The temp variables are allocated elsewhere during compilation (e.g., to store an + * intermediate computation) and the stack space is automatically reserved by the DSL. + * + * 2. It emits code to copy arguments, initialize cells, and copy free variables. + */ + + // 1. Allocate space in the frame. + if (scope.isFunction()) { + String[] regularVariables = orderedKeys(varnames, new String[0]); + for (int i = 0; i < regularVariables.length; i++) { + locals.put(regularVariables[i], b.createLocal()); + } + } + + String[] cellVariables = orderedKeys(cellvars, new String[0]); + BytecodeLocal[] cellVariableLocals = new BytecodeLocal[cellVariables.length]; + for (int i = 0; i < cellVariables.length; i++) { + BytecodeLocal local = b.createLocal(); + cellLocals.put(cellVariables[i], local); + cellVariableLocals[i] = local; + } + + String[] freeVariables = orderedKeys(freevars, new String[0]); + BytecodeLocal[] freeVariableLocals = new BytecodeLocal[freeVariables.length]; + for (int i = 0; i < freeVariables.length; i++) { + BytecodeLocal local = b.createLocal(); + freeLocals.put(freeVariables[i], local); + freeVariableLocals[i] = local; + } + + // 2. Copy arguments, initialize cells, and copy free variables. + copyArguments(args, b); + + if (cellVariableLocals.length > 0) { + List toClear = new ArrayList<>(); + + b.beginStoreRange(cellVariableLocals); + b.beginCollectToObjectArray(); + for (int i = 0; i < cellVariableLocals.length; i++) { + b.beginCreateCell(); + if (scope.getUseOfName(cellVariables[i]).contains(DefUse.DefParam)) { + /* + * To simplify the argument copying performed above, we copy cell params into + * regular locals just like all other arguments. Then, here we move the value + * into a cell and clear the regular local. + */ + BytecodeLocal param = getLocal(cellVariables[i]); + b.emitLoadLocal(param); + toClear.add(param); + } else { + b.emitLoadNull(); + } + b.endCreateCell(); + } + b.endCollectToObjectArray(); + b.endStoreRange(); + + for (BytecodeLocal local : toClear) { + b.emitClearLocal(local); + } + } + + if (freeVariableLocals.length > 0) { + b.beginStoreRange(freeVariableLocals); + b.emitLoadClosure(); + b.endStoreRange(); + } + } + + private void copyArguments(ArgumentsTy args, Builder b) { + if (args == null) { + return; + } + + int argIdx = PArguments.USER_ARGUMENTS_OFFSET; + if (args.posOnlyArgs != null) { + for (int i = 0; i < args.posOnlyArgs.length; i++) { + BytecodeLocal local = getLocal(args.posOnlyArgs[i].arg); + assert local != null; + b.beginStoreLocal(local); + b.emitLoadArgument(argIdx++); + b.endStoreLocal(); + } + } + + if (args.args != null) { + for (int i = 0; i < args.args.length; i++) { + BytecodeLocal local = getLocal(args.args[i].arg); + assert local != null; + b.beginStoreLocal(local); + b.emitLoadArgument(argIdx++); + b.endStoreLocal(); + } + } + + if (args.kwOnlyArgs != null) { + for (int i = 0; i < args.kwOnlyArgs.length; i++) { + BytecodeLocal local = getLocal(args.kwOnlyArgs[i].arg); + assert local != null; + b.beginStoreLocal(local); + b.emitLoadArgument(argIdx++); + b.endStoreLocal(); + } + } + + if (args.varArg != null) { + BytecodeLocal local = getLocal(args.varArg.arg); + assert local != null; + b.beginStoreLocal(local); + b.emitLoadVariableArguments(); + b.endStoreLocal(); + } + + if (args.kwArg != null) { + BytecodeLocal local = getLocal(args.kwArg.arg); + assert local != null; + b.beginStoreLocal(local); + b.emitLoadKeywordArguments(); + b.endStoreLocal(); + } + } + + private static int len(T[] arr) { + return arr == null ? 0 : arr.length; + } + + /* ---------------- StatementCompiler -------------------- */ + + public class StatementCompiler implements BaseBytecodeDSLVisitor { + private final Builder b; + + private BytecodeLabel breakLabel; + private BytecodeLabel continueLabel; + + public StatementCompiler(Builder b) { + this.b = b; + } + + // --------------------- visitor --------------------------- + + @Override + public Void visit(AliasTy node) { + throw new UnsupportedOperationException("" + node.getClass()); + } + + @Override + public Void visit(ArgTy node) { + throw new UnsupportedOperationException("" + node.getClass()); + } + + @Override + public Void visit(ArgumentsTy node) { + throw new UnsupportedOperationException("" + node.getClass()); + } + + @Override + public Void visit(ComprehensionTy node) { + throw new UnsupportedOperationException("" + node.getClass()); + } + + @Override + public Void visit(ExprTy.Attribute node) { + boolean newStatement = beginSourceSection(node, b); + + b.beginGetAttribute(toTruffleStringUncached(mangle(node.attr))); + node.value.accept(this); + b.endGetAttribute(); + + endSourceSection(b, newStatement); + + return null; + } + + @Override + public Void visit(ExprTy.Await node) { + // TODO if !IS_TOP_LEVEL_AWAIT + // TODO handle await in comprehension correctly (currently, it is always allowed) + if (!scope.isFunction()) { + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "'await' outside function"); + } + if (scopeType != CompilationScope.AsyncFunction && scopeType != CompilationScope.Comprehension) { + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "'await' outside async function"); + } + boolean newStatement = beginSourceSection(node, b); + emitAwait(() -> node.value.accept(this)); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.BinOp node) { + boolean newStatement = beginSourceSection(node, b); + switch (node.op) { + case Add: + b.beginPyNumberAdd(); + node.left.accept(this); + node.right.accept(this); + b.endPyNumberAdd(); + break; + case BitAnd: + b.beginPyNumberAnd(); + node.left.accept(this); + node.right.accept(this); + b.endPyNumberAnd(); + break; + case BitOr: + b.beginPyNumberOr(); + node.left.accept(this); + node.right.accept(this); + b.endPyNumberOr(); + break; + case BitXor: + b.beginPyNumberXor(); + node.left.accept(this); + node.right.accept(this); + b.endPyNumberXor(); + break; + case Div: + b.beginPyNumberTrueDivide(); + node.left.accept(this); + node.right.accept(this); + b.endPyNumberTrueDivide(); + break; + case FloorDiv: + b.beginPyNumberFloorDivide(); + node.left.accept(this); + node.right.accept(this); + b.endPyNumberFloorDivide(); + break; + case LShift: + b.beginPyNumberLshift(); + node.left.accept(this); + node.right.accept(this); + b.endPyNumberLshift(); + break; + case MatMult: + b.beginPyNumberMatrixMultiply(); + node.left.accept(this); + node.right.accept(this); + b.endPyNumberMatrixMultiply(); + break; + case Mod: + b.beginPyNumberRemainder(); + node.left.accept(this); + node.right.accept(this); + b.endPyNumberRemainder(); + break; + case Mult: + b.beginPyNumberMultiply(); + node.left.accept(this); + node.right.accept(this); + b.endPyNumberMultiply(); + break; + case Pow: + b.beginPow(); + node.left.accept(this); + node.right.accept(this); + b.endPow(); + break; + case RShift: + b.beginPyNumberRshift(); + node.left.accept(this); + node.right.accept(this); + b.endPyNumberRshift(); + break; + case Sub: + b.beginPyNumberSubtract(); + node.left.accept(this); + node.right.accept(this); + b.endPyNumberSubtract(); + break; + default: + throw new UnsupportedOperationException("" + node.getClass()); + } + + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.BoolOp node) { + boolean newStatement = beginSourceSection(node, b); + + if (node.op == BoolOpTy.And) { + b.beginBoolAnd(); + } else { + b.beginBoolOr(); + } + + visitSequence(node.values); + + if (node.op == BoolOpTy.And) { + b.endBoolAnd(); + } else { + b.endBoolOr(); + } + + endSourceSection(b, newStatement); + return null; + } + + private static boolean anyIsStarred(SSTNode[] nodes) { + for (int i = 0; i < nodes.length; i++) { + if (nodes[i] instanceof ExprTy.Starred) { + return true; + } + } + + return false; + } + + protected final void validateKeywords(KeywordTy[] keywords) { + for (int i = 0; i < keywords.length; i++) { + if (keywords[i].arg != null) { + checkForbiddenName(keywords[i].arg, NameOperation.BeginWrite); + for (int j = i + 1; j < keywords.length; j++) { + if (keywords[i].arg.equals(keywords[j].arg)) { + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "keyword argument repeated: " + keywords[i].arg); + } + } + } + } + } + + private static boolean isAttributeLoad(ExprTy node) { + return node instanceof ExprTy.Attribute && ((ExprTy.Attribute) node).context == ExprContextTy.Load; + } + + private static final int NUM_ARGS_MAX_FIXED = 4; + + private void emitCall(ExprTy func, ExprTy[] args, KeywordTy[] keywords) { + validateKeywords(keywords); + + boolean isMethodCall = isAttributeLoad(func) && keywords.length == 0; + int numArgs = len(args) + (isMethodCall ? 1 : 0); + boolean useVariadic = anyIsStarred(args) || len(keywords) > 0 || numArgs > NUM_ARGS_MAX_FIXED; + + // @formatter:off + if (useVariadic) { + b.beginCallVarargsMethod(); + } else { + switch (numArgs) { + case 0: b.beginCallNilaryMethod(); break; + case 1: b.beginCallUnaryMethod(); break; + case 2: b.beginCallBinaryMethod(); break; + case 3: b.beginCallTernaryMethod(); break; + case 4: b.beginCallQuaternaryMethod(); break; + } + } + + // @formatter:on + + if (isMethodCall) { + // The receiver is needed for method lookup and for the first argument. + BytecodeLocal receiver = b.createLocal(); + + if (useVariadic) { + BytecodeLocal function = b.createLocal(); + b.beginBlock(); + b.beginStoreLocal(function); + emitGetMethod(func, receiver); + b.endStoreLocal(); + b.emitLoadLocal(function); + b.endBlock(); + + emitUnstar(() -> b.emitLoadLocal(receiver), args); + emitKeywords(keywords, function); + } else { + assert len(keywords) == 0; + + emitGetMethod(func, receiver); + b.emitLoadLocal(receiver); + visitSequence(args); + } + + } else { + if (useVariadic) { + BytecodeLocal function = b.createLocal(); + + b.beginBlock(); + b.beginStoreLocal(function); + func.accept(this); + b.endStoreLocal(); + b.emitLoadLocal(function); + b.endBlock(); + + emitUnstar(args); + emitKeywords(keywords, function); + } else { + assert len(keywords) == 0; + + func.accept(this); + visitSequence(args); + } + } + + // @formatter:off + if (useVariadic) { + b.endCallVarargsMethod(); + } else { + switch (numArgs) { + case 0: b.endCallNilaryMethod(); break; + case 1: b.endCallUnaryMethod(); break; + case 2: b.endCallBinaryMethod(); break; + case 3: b.endCallTernaryMethod(); break; + case 4: b.endCallQuaternaryMethod(); break; + } + } + // @formatter:on + } + + private void emitGetMethod(ExprTy func, BytecodeLocal receiver) { + assert isAttributeLoad(func); + ExprTy.Attribute attrAccess = (ExprTy.Attribute) func; + b.beginBlock(); + b.beginStoreLocal(receiver); + attrAccess.value.accept(this); + b.endStoreLocal(); + + String mangled = mangle(attrAccess.attr); + b.beginGetMethod(toTruffleStringUncached(mangled)); + b.emitLoadLocal(receiver); + b.endGetMethod(); + b.endBlock(); + } + + @Override + public Void visit(ExprTy.Call node) { + boolean newStatement = beginSourceSection(node, b); + emitCall(node.func, node.args, node.keywords); + endSourceSection(b, newStatement); + return null; + } + + private void beginComparison(CmpOpTy op) { + switch (op) { + case Eq: + b.beginEq(); + break; + case NotEq: + b.beginNe(); + break; + case Lt: + b.beginLt(); + break; + case LtE: + b.beginLe(); + break; + case Gt: + b.beginGt(); + break; + case GtE: + b.beginGe(); + break; + case Is: + b.beginIs(); + break; + case IsNot: + b.beginNot(); + b.beginIs(); + break; + case In: + b.beginContains(); + break; + case NotIn: + b.beginNot(); + b.beginContains(); + break; + default: + throw new UnsupportedOperationException("" + op); + } + } + + private void endComparison(CmpOpTy op) { + switch (op) { + case Eq: + b.endEq(); + break; + case NotEq: + b.endNe(); + break; + case Lt: + b.endLt(); + break; + case LtE: + b.endLe(); + break; + case Gt: + b.endGt(); + break; + case GtE: + b.endGe(); + break; + case Is: + b.endIs(); + break; + case IsNot: + b.endIs(); + b.endNot(); + break; + case In: + b.endContains(); + break; + case NotIn: + b.endContains(); + b.endNot(); + break; + default: + throw new UnsupportedOperationException("" + op); + } + } + + @Override + public Void visit(ExprTy.Compare node) { + boolean newStatement = beginSourceSection(node, b); + checkCompare(node); + + boolean multipleComparisons = node.comparators.length > 1; + + if (multipleComparisons) { + b.beginBoolAnd(); + } + + BytecodeLocal tmp = b.createLocal(); + + for (int i = 0; i < node.comparators.length; i++) { + beginComparison(node.ops[i]); + + if (i == 0) { + node.left.accept(this); + } else { + b.emitLoadLocal(tmp); + } + + if (i != node.comparators.length - 1) { + b.beginTeeLocal(tmp); + } + node.comparators[i].accept(this); + if (i != node.comparators.length - 1) { + b.endTeeLocal(); + } + + endComparison(node.ops[i]); + } + + if (multipleComparisons) { + b.endBoolAnd(); + } + + endSourceSection(b, newStatement); + return null; + } + + private void warn(SSTNode node, String message, Object... arguments) { + ctx.errorCallback.onWarning(WarningType.Syntax, node.getSourceRange(), message, arguments); + } + + private void checkCompare(ExprTy node) { + if (!(node instanceof ExprTy.Compare compare)) { + return; + } + boolean left = checkIsArg(compare.left); + int n = compare.ops == null ? 0 : compare.ops.length; + for (int i = 0; i < n; ++i) { + CmpOpTy op = compare.ops[i]; + boolean right = checkIsArg(compare.comparators[i]); + if (op == CmpOpTy.Is || op == CmpOpTy.IsNot) { + if (!right || !left) { + warn(compare, op == CmpOpTy.Is ? "\"is\" with a literal. Did you mean \"==\"?" : "\"is not\" with a literal. Did you mean \"!=\"?"); + } + } + left = right; + } + } + + private static boolean checkIsArg(ExprTy e) { + if (e instanceof ExprTy.Constant) { + ConstantValue.Kind kind = ((Constant) e).value.kind; + return kind == Kind.NONE || kind == Kind.BOOLEAN || kind == Kind.ELLIPSIS; + } + return true; + } + + private void createConstant(ConstantValue value) { + switch (value.kind) { + case NONE: + b.emitLoadConstant(PNone.NONE); + break; + case ELLIPSIS: + b.emitLoadConstant(PEllipsis.INSTANCE); + break; + case BOOLEAN: + emitPythonConstant(value.getBoolean(), b); + break; + case LONG: + emitPythonConstant(getConstantNumber(value.getLong()), b); + break; + case DOUBLE: + emitPythonConstant(value.getDouble(), b); + break; + case COMPLEX: { + double[] complex = value.getComplex(); + addConstant(complex); + b.emitLoadComplex(complex[0], complex[1]); + break; + } + case BIGINTEGER: + addConstant(value.getBigInteger()); + b.emitLoadBigInt(value.getBigInteger()); + break; + case RAW: + emitPythonConstant(value.getRaw(TruffleString.class), b); + break; + case BYTES: + addConstant(value.getBytes()); + b.emitLoadBytes(value.getBytes()); + break; + case TUPLE: + b.beginMakeTuple(); + b.beginCollectToObjectArray(); + for (ConstantValue cv : value.getTupleElements()) { + createConstant(cv); + } + b.endCollectToObjectArray(); + b.endMakeTuple(); + break; + case FROZENSET: + b.beginMakeFrozenSet(); + for (ConstantValue cv : value.getFrozensetElements()) { + createConstant(cv); + } + b.endMakeFrozenSet(); + break; + + default: + throw new UnsupportedOperationException("not supported: " + value.kind); + } + } + + /** + * Some AST nodes have type guards expecting ints rather than long. When the actual constant + * fits into something smaller, convert it accordingly. + */ + private Object getConstantNumber(long value) { + if (value == (int) value) { + return (int) value; + } else { + return value; + } + } + + @Override + public Void visit(ExprTy.Constant node) { + boolean newStatement = beginSourceSection(node, b); + createConstant(node.value); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.Dict node) { + boolean newStatement = beginSourceSection(node, b); + + if (len(node.keys) == 0) { + b.beginMakeDict(0); + b.endMakeDict(); + } else { + b.beginMakeDict(node.keys.length); + for (int i = 0; i < node.keys.length; i++) { + if (node.keys[i] == null) { + b.emitLoadConstant(PNone.NO_VALUE); + } else { + node.keys[i].accept(this); + } + node.values[i].accept(this); + } + b.endMakeDict(); + } + + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.DictComp node) { + boolean newStatement = beginSourceSection(node, b); + + b.beginCallUnaryMethod(); + emitMakeFunction(node, "", COMPREHENSION_ARGS, null); + node.generators[0].iter.accept(this); + b.endCallUnaryMethod(); + + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.FormattedValue node) { + boolean newStatement = beginSourceSection(node, b); + b.beginFormat(); + + // @formatter:off + switch (node.conversion) { + case 's': b.beginFormatStr(); break; + case 'r': b.beginFormatRepr(); break; + case 'a': b.beginFormatAscii(); break; + case -1: break; + default: throw new UnsupportedOperationException("unknown conversion: " + node.conversion); + } + // @formatter:on + + node.value.accept(this); + + // @formatter:off + switch (node.conversion) { + case 's': b.endFormatStr(); break; + case 'r': b.endFormatRepr(); break; + case 'a': b.endFormatAscii(); break; + case -1: break; + default: throw new UnsupportedOperationException("unknown conversion: " + node.conversion); + } + // @formatter:on + + if (node.formatSpec != null) { + node.formatSpec.accept(this); + } else { + b.emitLoadConstant(StringLiterals.T_EMPTY_STRING); + } + + b.endFormat(); + endSourceSection(b, newStatement); + + return null; + } + + @Override + public Void visit(ExprTy.GeneratorExp node) { + boolean newStatement = beginSourceSection(node, b); + + b.beginCallUnaryMethod(); + emitMakeFunction(node, "", COMPREHENSION_ARGS, null); + node.generators[0].iter.accept(this); + b.endCallUnaryMethod(); + + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.IfExp node) { + boolean newStatement = beginSourceSection(node, b); + + b.beginConditional(); + visitCondition(node.test); + node.body.accept(this); + node.orElse.accept(this); + b.endConditional(); + + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.JoinedStr node) { + boolean newStatement = beginSourceSection(node, b); + + if (node.values.length == 1) { + node.values[0].accept(this); + } else { + b.beginBuildString(node.values.length); + visitSequence(node.values); + b.endBuildString(); + } + + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.Lambda node) { + boolean newStatement = beginSourceSection(node, b); + emitMakeFunction(node, "", node.args, null); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.List node) { + boolean newStatement = beginSourceSection(node, b); + + ConstantCollection constantCollection = Compiler.tryCollectConstantCollection(node.elements); + if (constantCollection != null) { + emitConstantList(constantCollection); + } else { + b.beginMakeList(); + emitUnstar(node.elements); + b.endMakeList(); + } + + endSourceSection(b, newStatement); + return null; + } + + private static final String COMPREHENSION_ARGUMENT_NAME = ".0"; + private static final ArgumentsTy COMPREHENSION_ARGS = new ArgumentsTy(new ArgTy[]{new ArgTy(COMPREHENSION_ARGUMENT_NAME, null, null, null)}, null, null, null, null, null, null, null); + + @Override + public Void visit(ExprTy.ListComp node) { + boolean newStatement = beginSourceSection(node, b); + + b.beginCallUnaryMethod(); + emitMakeFunction(node, "", COMPREHENSION_ARGS, null); + node.generators[0].iter.accept(this); + b.endCallUnaryMethod(); + + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.Name node) { + boolean newStatement = beginSourceSection(node, b); + emitReadLocal(node.id, b); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.NamedExpr node) { + boolean newStatement = beginSourceSection(node, b); + b.beginBlock(); + + // save expr result to "tmp" + BytecodeLocal tmp = b.createLocal(); + b.beginStoreLocal(tmp); + node.value.accept(this); + b.endStoreLocal(); + + node.target.accept(new StoreVisitor(() -> { + b.emitLoadLocal(tmp); + })); + + b.emitLoadLocal(tmp); + + b.endBlock(); + endSourceSection(b, newStatement); + return null; + } + + private void emitConstantList(ConstantCollection constantCollection) { + addConstant(constantCollection.collection); + switch (constantCollection.elementType) { + case CollectionBits.ELEMENT_INT: + b.emitMakeConstantIntList((int[]) constantCollection.collection); + break; + case CollectionBits.ELEMENT_LONG: + b.emitMakeConstantLongList((long[]) constantCollection.collection); + break; + case CollectionBits.ELEMENT_BOOLEAN: + b.emitMakeConstantBooleanList((boolean[]) constantCollection.collection); + break; + case CollectionBits.ELEMENT_DOUBLE: + b.emitMakeConstantDoubleList((double[]) constantCollection.collection); + break; + case CollectionBits.ELEMENT_OBJECT: + b.emitMakeConstantObjectList((Object[]) constantCollection.collection); + break; + default: + throw CompilerDirectives.shouldNotReachHere(); + } + } + + private void emitConstantTuple(ConstantCollection constantCollection) { + addConstant(constantCollection.collection); + switch (constantCollection.elementType) { + case CollectionBits.ELEMENT_INT: + b.emitMakeConstantIntTuple((int[]) constantCollection.collection); + break; + case CollectionBits.ELEMENT_LONG: + b.emitMakeConstantLongTuple((long[]) constantCollection.collection); + break; + case CollectionBits.ELEMENT_BOOLEAN: + b.emitMakeConstantBooleanTuple((boolean[]) constantCollection.collection); + break; + case CollectionBits.ELEMENT_DOUBLE: + b.emitMakeConstantDoubleTuple((double[]) constantCollection.collection); + break; + case CollectionBits.ELEMENT_OBJECT: + b.emitMakeConstantObjectTuple((Object[]) constantCollection.collection); + break; + default: + throw CompilerDirectives.shouldNotReachHere(); + } + } + + /** + * Converts a sequence of expressions of which some may be starred into just an Object[]. + * + * @param args the sequence of expressions + */ + private void emitUnstar(ExprTy[] args) { + emitUnstar(null, args); + } + + /** + * Same as above, but takes an optional Runnable to produce elements at the beginning of the + * sequence. + * + * @param initialElementsProducer a runnable to produce the first element(s) of the + * sequence. + * @param args the sequence of expressions to unstar + */ + private void emitUnstar(Runnable initialElementsProducer, ExprTy[] args) { + if (initialElementsProducer == null && len(args) == 0) { + b.emitLoadConstant(PythonUtils.EMPTY_OBJECT_ARRAY); + } else if (initialElementsProducer == null && len(args) == 1 && args[0] instanceof ExprTy.Starred) { + // Optimization for single starred argument: we can just upack it. For generic + // algorithm see the next branch + b.beginUnpackStarred(); + ((ExprTy.Starred) args[0]).value.accept(this); + b.endUnpackStarred(); + } else if (anyIsStarred(args)) { + /** + * We emit one or more arrays and concatenate them using Unstar. Each array + * corresponds to a contiguous sequence of arguments or the result of unpacking a + * single starred argument. + * + * For example, for the argument list a, b, *c, d, e, *f, g we would emit: + * + * @formatter:off + * Unstar( + * CollectToObjectArray(a, b), + * UnpackStarred(c), + * CollectToObjectArray(d, e), + * UnpackStarred(f), + * CollectToObjectArray(g) + * ) + * @formatter:on + */ + b.beginUnstar(); + boolean inVariadic = false; + int numOperands = 0; + + if (initialElementsProducer != null) { + b.beginCollectToObjectArray(); + initialElementsProducer.run(); + inVariadic = true; + } + + for (int i = 0; i < args.length; i++) { + if (args[i] instanceof ExprTy.Starred) { + if (inVariadic) { + b.endCollectToObjectArray(); + inVariadic = false; + numOperands++; + } + + b.beginUnpackStarred(); + ((ExprTy.Starred) args[i]).value.accept(this); + b.endUnpackStarred(); + numOperands++; + } else { + if (!inVariadic) { + b.beginCollectToObjectArray(); + inVariadic = true; + } + + args[i].accept(this); + } + } + + if (inVariadic) { + b.endCollectToObjectArray(); + numOperands++; + } + + b.endUnstar(numOperands); + } else { + b.beginCollectToObjectArray(); + if (initialElementsProducer != null) { + initialElementsProducer.run(); + } + visitSequence(args); + b.endCollectToObjectArray(); + } + } + + @Override + public Void visit(ExprTy.Set node) { + boolean newStatement = beginSourceSection(node, b); + b.beginMakeSet(); + if (len(node.elements) == 0) { + b.emitLoadConstant(PythonUtils.EMPTY_OBJECT_ARRAY); + } else { + emitUnstar(node.elements); + } + b.endMakeSet(); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.SetComp node) { + boolean newStatement = beginSourceSection(node, b); + + b.beginCallUnaryMethod(); + emitMakeFunction(node, "", COMPREHENSION_ARGS, null); + node.generators[0].iter.accept(this); + b.endCallUnaryMethod(); + + endSourceSection(b, newStatement); + return null; + } + + private void visitNoneable(ExprTy node) { + if (node == null) { + b.emitLoadConstant(PNone.NONE); + } else { + node.accept(this); + } + } + + @Override + public Void visit(ExprTy.Slice node) { + boolean newStatement = beginSourceSection(node, b); + + b.beginMakeSlice(); + + visitNoneable(node.lower); + visitNoneable(node.upper); + visitNoneable(node.step); + + b.endMakeSlice(); + + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.Starred node) { + throw new UnsupportedOperationException("" + node.getClass()); + } + + @Override + public Void visit(ExprTy.Subscript node) { + boolean newStatement = beginSourceSection(node, b); + b.beginBinarySubscript(); + node.value.accept(this); + node.slice.accept(this); + b.endBinarySubscript(); + + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.Tuple node) { + boolean newStatement = beginSourceSection(node, b); + + ConstantCollection constantCollection = Compiler.tryCollectConstantCollection(node.elements); + if (constantCollection != null) { + emitConstantTuple(constantCollection); + } else { + b.beginMakeTuple(); + emitUnstar(node.elements); + b.endMakeTuple(); + } + + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.UnaryOp node) { + // Basic constant folding for unary negation + if (node.op == UnaryOpTy.USub && node.operand instanceof ExprTy.Constant c) { + if (c.value.kind == ConstantValue.Kind.BIGINTEGER || c.value.kind == ConstantValue.Kind.DOUBLE || c.value.kind == ConstantValue.Kind.LONG || + c.value.kind == ConstantValue.Kind.COMPLEX) { + ConstantValue cv = c.value.negate(); + boolean newStatement = beginSourceSection(node, b); + visit(new ExprTy.Constant(cv, null, c.getSourceRange())); + endSourceSection(b, newStatement); + return null; + } + } + boolean newStatement = beginSourceSection(node, b); + switch (node.op) { + case UAdd: + b.beginPyNumberPositive(); + node.operand.accept(this); + b.endPyNumberPositive(); + break; + case Invert: + b.beginPyNumberInvert(); + node.operand.accept(this); + b.endPyNumberInvert(); + break; + case USub: + b.beginPyNumberNegative(); + node.operand.accept(this); + b.endPyNumberNegative(); + break; + case Not: + b.beginNot(); + node.operand.accept(this); + b.endNot(); + break; + default: + throw new UnsupportedOperationException("" + node.getClass()); + } + + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.Yield node) { + if (!scope.isFunction()) { + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "'yield' outside function"); + } + boolean newStatement = beginSourceSection(node, b); + emitYield((statementCompiler) -> { + if (node.value != null) { + node.value.accept(this); + } else { + statementCompiler.b.emitLoadConstant(PNone.NONE); + } + }, this); + + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.YieldFrom node) { + if (!scope.isFunction()) { + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "'yield' outside function"); + } + if (scopeType == CompilationScope.AsyncFunction) { + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "'yield from' inside async function"); + } + boolean newStatement = beginSourceSection(node, b); + emitYieldFrom(() -> { + b.beginGetYieldFromIter(); + node.value.accept(this); + b.endGetYieldFromIter(); + }); + endSourceSection(b, newStatement); + return null; + } + + public void emitYieldFrom(Runnable generatorOrCoroutineProducer) { + /** + * @formatter:off + * generator = + * returnValue = None + * sentValue = None + * + * # Step 1: prime the generator + * try: + * yieldValue = generator.send(sentValue) + * except StopIteration as e: + * returnValue = e.value + * goto end + * + * while True: + * # Step 2: yield yieldValue to the caller + * try: + * sentValue = yield yieldValue + * except Exception as e: + * # throw/close generator + * if generator returned a value: + * goto end + * else: + * continue (generator yielded a value) + * + * # Step 3: send sentValue into the generator + * try: + * yieldValue = generator.send(sentValue) + * except StopIteration as e: + * returnValue = e.value + * goto end + * + * end: + * # Step 4: return returnValue + * returnValue (result) + * @formatter:on + */ + b.beginBlock(); + + BytecodeLocal generator = b.createLocal(); + BytecodeLocal returnValue = b.createLocal(); + BytecodeLocal sentValue = b.createLocal(); + BytecodeLocal yieldValue = b.createLocal(); + BytecodeLabel end = b.createLabel(); + + b.beginStoreLocal(generator); + generatorOrCoroutineProducer.run(); + b.endStoreLocal(); + + b.beginStoreLocal(returnValue); + b.emitLoadConstant(PNone.NONE); + b.endStoreLocal(); + + b.beginStoreLocal(sentValue); + b.emitLoadConstant(PNone.NONE); + b.endStoreLocal(); + + // Step 1: prime the generator + emitSend(generator, sentValue, yieldValue, returnValue, end); + + b.beginWhile(); + b.emitLoadConstant(true); + + b.beginBlock(); + BytecodeLabel loopEnd = b.createLabel(); + // Step 2: yield yieldValue to the caller + b.beginTryCatch(); + + // try clause: yield + b.beginStoreLocal(sentValue); + emitYield((statementCompiler) -> statementCompiler.b.emitLoadLocal(yieldValue), this); + b.endStoreLocal(); + + // catch clause: handle throw/close exceptions. + b.beginIfThenElse(); + b.beginYieldFromThrow(yieldValue, returnValue); + b.emitLoadLocal(generator); + b.emitLoadException(); + b.endYieldFromThrow(); + + // StopIteration was raised; go to the end. + b.emitBranch(end); + + // The generator yielded a value; go to top of the loop. + b.emitBranch(loopEnd); + + b.endIfThenElse(); + + b.endTryCatch(); + + // Step 3: send sentValue into the generator + emitSend(generator, sentValue, yieldValue, returnValue, end); + + b.emitLabel(loopEnd); + b.endBlock(); + b.endWhile(); + + // Step 4: return returnValue + b.emitLabel(end); + b.emitLoadLocal(returnValue); + + b.endBlock(); + } + + private void emitSend(BytecodeLocal generator, BytecodeLocal sentValue, BytecodeLocal yieldValue, BytecodeLocal returnValue, BytecodeLabel end) { + b.beginIfThen(); + // When the generator raises StopIteration, send evaluates to true; branch to the end. + b.beginYieldFromSend(yieldValue, returnValue); + b.emitLoadLocal(generator); + b.emitLoadLocal(sentValue); + b.endYieldFromSend(); + + b.emitBranch(end); + + b.endIfThen(); + } + + private void emitAwait(Runnable producer) { + emitYieldFrom(() -> { + b.beginGetAwaitable(); + producer.run(); + b.endGetAwaitable(); + }); + } + + @Override + public Void visit(KeywordTy node) { + throw new UnsupportedOperationException("" + node.getClass()); + } + + @Override + public Void visit(StmtTy.AnnAssign node) { + boolean newStatement = beginSourceSection(node, b); + b.beginBlock(); + if (node.value != null) { + // Emit the assignment if there's an RHS. + emitAssignment(new ExprTy[]{node.target}, node.value); + } + if (node.target instanceof ExprTy.Name) { + String name = ((ExprTy.Name) node.target).id; + checkForbiddenName(name, NameOperation.BeginWrite); + /* If we have a simple name in a module or class, store annotation. */ + if (node.isSimple && + (scopeType == CompilationScope.Module || scopeType == CompilationScope.Class)) { + b.beginSetDictItem(); + emitNameOperation("__annotations__", NameOperation.Read, b); + + String mangled = mangle(name); + emitPythonConstant(toTruffleStringUncached(mangled), b); + + if (futureFeatures.contains(FutureFeature.ANNOTATIONS)) { + emitPythonConstant(Unparser.unparse(node.annotation), b); + } else { + node.annotation.accept(this); + } + + b.endSetDictItem(); + } + } else if (node.target instanceof ExprTy.Attribute) { + if (node.value == null) { + ExprTy.Attribute attr = (ExprTy.Attribute) node.target; + checkForbiddenName(attr.attr, NameOperation.BeginWrite); + if (attr.value != null) { + checkAnnExpr(attr.value); + } + } + } else if (node.target instanceof ExprTy.Subscript) { + if (node.value == null) { + ExprTy.Subscript subscript = (ExprTy.Subscript) node.target; + if (subscript.value != null) { + checkAnnExpr(subscript.value); + } + checkAnnSubscr(subscript.slice); + } + } else { + ctx.errorCallback.onError(ErrorType.Syntax, node.getSourceRange(), "invalid node type for annotated assignment"); + } + if (!node.isSimple) { + /* + * Annotations of complex targets does not produce anything under annotations + * future. Annotations are only evaluated in a module or class. + */ + if (!futureFeatures.contains(FutureFeature.ANNOTATIONS) && (scopeType == CompilationScope.Module || scopeType == CompilationScope.Class)) { + checkAnnExpr(node.annotation); + } + } + b.endBlock(); + endSourceSection(b, newStatement); + return null; + } + + private void checkAnnExpr(ExprTy expr) { + expr.accept(this); + } + + private void checkAnnSubscr(ExprTy expr) { + if (expr instanceof ExprTy.Slice) { + ExprTy.Slice slice = (ExprTy.Slice) expr; + if (slice.lower != null) { + checkAnnExpr(slice.lower); + } + if (slice.upper != null) { + checkAnnExpr(slice.upper); + } + if (slice.step != null) { + checkAnnExpr(slice.step); + } + } else if (expr instanceof ExprTy.Tuple) { + ExprTy.Tuple tuple = (ExprTy.Tuple) expr; + for (int i = 0; i < tuple.elements.length; i++) { + checkAnnSubscr(tuple.elements[i]); + } + } else { + checkAnnExpr(expr); + } + } + + @Override + public Void visit(StmtTy.Assert node) { + if (ctx.optimizationLevel <= 0) { + boolean newStatement = beginSourceSection(node, b); + b.beginIfThen(); + + b.beginNot(); + node.test.accept(this); + b.endNot(); + + b.beginAssertFailed(); + if (node.msg == null) { + b.emitLoadConstant(PNone.NO_VALUE); + } else { + node.msg.accept(this); + } + b.endAssertFailed(); + + b.endIfThen(); + endSourceSection(b, newStatement); + } + return null; + } + + // --------------------- assign ------------------------ + + /** + * Generates code to store the value produced by {@link #generateValue} into the visited + * expression. + */ + public class StoreVisitor implements BaseBytecodeDSLVisitor { + private final Builder b = StatementCompiler.this.b; + private final Runnable generateValue; + + StoreVisitor(Runnable generateValue) { + this.generateValue = generateValue; + } + + @Override + public Void visit(ExprTy.Name node) { + boolean newStatement = beginSourceSection(node, b); + beginStoreLocal(node.id, b); + generateValue.run(); + endStoreLocal(node.id, b); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.Attribute node) { + boolean newStatement = beginSourceSection(node, b); + checkForbiddenName(node.attr, NameOperation.BeginWrite); + b.beginSetAttribute(toTruffleStringUncached(mangle(node.attr))); + generateValue.run(); + node.value.accept(StatementCompiler.this); + b.endSetAttribute(); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.Subscript node) { + boolean newStatement = beginSourceSection(node, b); + b.beginSetItem(); + generateValue.run(); + node.value.accept(StatementCompiler.this); + node.slice.accept(StatementCompiler.this); + b.endSetItem(); + endSourceSection(b, newStatement); + return null; + } + + /** + * This method unpacks the rhs (a sequence/iterable) to the elements on the lhs + * (specified by {@code nodes}. + */ + private void visitIterableAssign(ExprTy[] nodes) { + b.beginBlock(); + + /** + * The rhs should be fully evaluated and unpacked into the expected number of + * elements before storing values into the lhs (e.g., if an lhs element is f().attr, + * but computing or unpacking rhs throws, f() is not computed). Thus, the unpacking + * step stores the unpacked values into intermediate variables, and then those + * variables are copied into the lhs elements afterward. + */ + BytecodeLocal[] targets = new BytecodeLocal[nodes.length]; + for (int i = 0; i < targets.length; i++) { + targets[i] = b.createLocal(); + } + + int indexOfStarred = -1; + for (int i = 0; i < nodes.length; i++) { + if (nodes[i] instanceof ExprTy.Starred) { + indexOfStarred = i; + break; + } + } + + if (indexOfStarred == -1) { + b.beginUnpackToLocals(targets); + } else { + b.beginUnpackStarredToLocals(indexOfStarred, targets); + } + + generateValue.run(); + + if (indexOfStarred == -1) { + b.endUnpackToLocals(); + } else { + b.endUnpackStarredToLocals(); + } + + for (int i = 0; i < nodes.length; i++) { + final int index = i; + + ExprTy target = nodes[i]; + if (nodes[i] instanceof ExprTy.Starred) { + target = ((ExprTy.Starred) target).value; + } + + target.accept(new StoreVisitor(() -> { + b.emitLoadLocal(targets[index]); + })); + } + + b.endBlock(); + } + + @Override + public Void visit(ExprTy.Tuple node) { + boolean newStatement = beginSourceSection(node, b); + visitIterableAssign(node.elements); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.List node) { + boolean newStatement = beginSourceSection(node, b); + visitIterableAssign(node.elements); + endSourceSection(b, newStatement); + return null; + } + } + + private class AugStoreVisitor implements BaseBytecodeDSLVisitor { + private final Builder b = StatementCompiler.this.b; + private final ExprTy value; + private final OperatorTy op; + + AugStoreVisitor(OperatorTy op, ExprTy value) { + this.op = op; + this.value = value; + } + + private void beginAugAssign() { + switch (op) { + case Add -> b.beginPyNumberInPlaceAdd(); + case Sub -> b.beginPyNumberInPlaceSubtract(); + case Mult -> b.beginPyNumberInPlaceMultiply(); + case FloorDiv -> b.beginPyNumberInPlaceFloorDivide(); + case BitAnd -> b.beginPyNumberInPlaceAnd(); + case BitOr -> b.beginPyNumberInPlaceOr(); + case BitXor -> b.beginPyNumberInPlaceXor(); + case RShift -> b.beginPyNumberInPlaceRshift(); + case LShift -> b.beginPyNumberInPlaceLshift(); + case Div -> b.beginPyNumberInPlaceTrueDivide(); + case Mod -> b.beginPyNumberInPlaceRemainder(); + case MatMult -> b.beginPyNumberInPlaceMatrixMultiply(); + case Pow -> b.beginInPlacePow(); + default -> throw new UnsupportedOperationException("aug ass: " + op); + } + } + + private void endAugAssign() { + switch (op) { + case Add -> b.endPyNumberInPlaceAdd(); + case Sub -> b.endPyNumberInPlaceSubtract(); + case Mult -> b.endPyNumberInPlaceMultiply(); + case FloorDiv -> b.endPyNumberInPlaceFloorDivide(); + case BitAnd -> b.endPyNumberInPlaceAnd(); + case BitOr -> b.endPyNumberInPlaceOr(); + case BitXor -> b.endPyNumberInPlaceXor(); + case RShift -> b.endPyNumberInPlaceRshift(); + case LShift -> b.endPyNumberInPlaceLshift(); + case Div -> b.endPyNumberInPlaceTrueDivide(); + case Mod -> b.endPyNumberInPlaceRemainder(); + case MatMult -> b.endPyNumberInPlaceMatrixMultiply(); + case Pow -> b.endInPlacePow(); + default -> throw new UnsupportedOperationException("aug ass: " + op); + } + } + + @Override + public Void visit(ExprTy.Name node) { + boolean newStatement = beginSourceSection(node, b); + + beginStoreLocal(node.id, b); + beginAugAssign(); + emitReadLocal(node.id, b); + value.accept(StatementCompiler.this); + endAugAssign(); + endStoreLocal(node.id, b); + + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.Attribute node) { + boolean newStatement = beginSourceSection(node, b); + checkForbiddenName(node.attr, NameOperation.BeginWrite); + b.beginBlock(); + // { + BytecodeLocal target = b.createLocal(); + + b.beginStoreLocal(target); + node.value.accept(StatementCompiler.this); + b.endStoreLocal(); + + TruffleString attrName = toTruffleStringUncached(mangle(node.attr)); + b.beginSetAttribute(attrName); + beginAugAssign(); + + b.beginGetAttribute(attrName); + b.emitLoadLocal(target); + b.endGetAttribute(); + + value.accept(StatementCompiler.this); + + endAugAssign(); + + b.emitLoadLocal(target); + b.endSetAttribute(); + // } + b.endBlock(); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.Subscript node) { + boolean newStatement = beginSourceSection(node, b); + b.beginBlock(); + // { + BytecodeLocal target = b.createLocal(); + BytecodeLocal slice = b.createLocal(); + + b.beginStoreLocal(target); + node.value.accept(StatementCompiler.this); + b.endStoreLocal(); + + b.beginStoreLocal(slice); + node.slice.accept(StatementCompiler.this); + b.endStoreLocal(); + + b.beginSetItem(); + beginAugAssign(); + + b.beginBinarySubscript(); + b.emitLoadLocal(target); + b.emitLoadLocal(slice); + b.endBinarySubscript(); + + value.accept(StatementCompiler.this); + + endAugAssign(); + + b.emitLoadLocal(target); + b.emitLoadLocal(slice); + b.endSetItem(); + // } + b.endBlock(); + endSourceSection(b, newStatement); + return null; + } + } + + @Override + public Void visit(StmtTy.Assign node) { + boolean newStatement = beginSourceSection(node, b); + b.beginBlock(); + emitAssignment(node.targets, node.value); + b.endBlock(); + endSourceSection(b, newStatement); + return null; + } + + private void emitAssignment(ExprTy[] targets, ExprTy value) { + if (targets.length == 1) { + targets[0].accept(new StoreVisitor(() -> { + value.accept(this); + })); + } else { + BytecodeLocal tmp = b.createLocal(); + b.beginStoreLocal(tmp); + value.accept(this); + b.endStoreLocal(); + + for (ExprTy target : targets) { + target.accept(new StoreVisitor(() -> { + b.emitLoadLocal(tmp); + })); + } + } + } + + @Override + public Void visit(StmtTy.AsyncFor node) { + emitNotImplemented("async for", b); + return null; + } + + @Override + public Void visit(StmtTy.AsyncWith node) { + if (!scope.isFunction()) { + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "'async with' outside function"); + } + if (scopeType != CompilationScope.AsyncFunction && scopeType != CompilationScope.Comprehension) { + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "'async with' outside async function"); + } + boolean newStatement = beginSourceSection(node, b); + visitWithRecurse(node.items, 0, node.body, true); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(StmtTy.AugAssign node) { + boolean newStatement = beginSourceSection(node, b); + node.target.accept(new AugStoreVisitor(node.op, node.value)); + endSourceSection(b, newStatement); + return null; + } + + private abstract static sealed class KeywordGroup permits NamedKeywords, SplatKeywords { + } + + private static final class NamedKeywords extends KeywordGroup { + final ArrayList names; + final ArrayList values; + + NamedKeywords(ArrayList names, ArrayList values) { + this.names = names; + this.values = values; + } + } + + private static final class SplatKeywords extends KeywordGroup { + final ExprTy expr; + + SplatKeywords(ExprTy expr) { + this.expr = expr; + } + } + + private void emitKeywords(KeywordTy[] kws, BytecodeLocal function) { + if (len(kws) == 0) { + b.emitLoadConstant(PKeyword.EMPTY_KEYWORDS); + } else { + KeywordGroup[] groups = partitionKeywords(kws); + // The nodes that validate keyword arguments operate on PDicts, so we convert into + // a list of PKeywords after validation. + b.beginMappingToKeywords(); + emitKeywordsRecursive(groups, groups.length - 1, function); + b.endMappingToKeywords(); + } + } + + private KeywordGroup[] partitionKeywords(KeywordTy[] kws) { + ArrayList groups = new ArrayList<>(); + + int i = 0; + while (i < kws.length) { + if (kws[i].arg == null) { + // splat + groups.add(new SplatKeywords(kws[i].value)); + i++; + } else { + // named keyword + ArrayList kwNames = new ArrayList<>(); + ArrayList kwValues = new ArrayList<>(); + while (i < kws.length && kws[i].arg != null) { + kwNames.add(toTruffleStringUncached(kws[i].arg)); + kwValues.add(kws[i].value); + i++; + } + groups.add(new NamedKeywords(kwNames, kwValues)); + } + } + + return groups.toArray(KeywordGroup[]::new); + } + + private void emitKeywordsRecursive(KeywordGroup[] groups, int i, BytecodeLocal function) { + /* + * Keyword groups should be merged left-to-right. For example, for groups [A, B, C] we + * should emit KwArgsMerge(KwArgsMerge(A, B), C). + */ + if (i == 0) { + emitKeywordGroup(groups[i], true, function); + } else { + b.beginKwargsMerge(function); + emitKeywordsRecursive(groups, i - 1, function); + emitKeywordGroup(groups[i], false, function); + b.endKwargsMerge(); + } + } + + private void emitKeywordGroup(KeywordGroup group, boolean copy, BytecodeLocal function) { + if (group instanceof NamedKeywords namedKeywords) { + b.beginMakeDict(namedKeywords.names.size()); + for (int i = 0; i < namedKeywords.names.size(); i++) { + emitPythonConstant(namedKeywords.names.get(i), b); + namedKeywords.values.get(i).accept(this); + } + b.endMakeDict(); + } else { + SplatKeywords splatKeywords = (SplatKeywords) group; + + if (copy) { + b.beginKwargsMerge(function); + b.beginMakeDict(0); + b.endMakeDict(); + splatKeywords.expr.accept(this); + b.endKwargsMerge(); + } else { + splatKeywords.expr.accept(this); + } + } + } + + @Override + public Void visit(StmtTy.ClassDef node) { + boolean newStatement = beginSourceSection(node, b); + b.beginBlock(); + BytecodeLocal buildClassFunction = b.createLocal(); + + // compute __build_class__ (we need it in multiple places, so store it) + b.beginStoreLocal(buildClassFunction); + b.emitBuildClass(); + b.endStoreLocal(); + + // ClassName = __build_class__(, "ClassName", bases, keywords) + beginStoreLocal(node.name, b); + + int numDeco = len(node.decoratorList); + for (int i = 0; i < numDeco; i++) { + b.beginCallUnaryMethod(); + node.decoratorList[i].accept(this); + } + + b.beginCallVarargsMethod(); + + b.emitLoadLocal(buildClassFunction); + + // positional args + emitUnstar(() -> { + emitMakeFunction(node, node.name, null, null); + emitPythonConstant(toTruffleStringUncached(node.name), b); + }, node.bases); + + // keyword args + validateKeywords(node.keywords); + emitKeywords(node.keywords, buildClassFunction); + + b.endCallVarargsMethod(); + + for (int i = 0; i < numDeco; i++) { + b.endCallUnaryMethod(); + } + + endStoreLocal(node.name, b); + + b.endBlock(); + endSourceSection(b, newStatement); + + return null; + } + + private class DeleteVisitor implements BaseBytecodeDSLVisitor { + + @Override + public Void visit(ExprTy.Subscript node) { + boolean newStatement = beginSourceSection(node, b); + + b.beginDeleteItem(); + node.value.accept(StatementCompiler.this); + node.slice.accept(StatementCompiler.this); + b.endDeleteItem(); + + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.Attribute node) { + boolean newStatement = beginSourceSection(node, b); + checkForbiddenName(node.attr, NameOperation.BeginWrite); + b.beginDeleteAttribute(toTruffleStringUncached(node.attr)); + node.value.accept(StatementCompiler.this); + b.endDeleteAttribute(); + + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.Name node) { + boolean newStatement = beginSourceSection(node, b); + emitNameOperation(node.id, NameOperation.Delete, b); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.Tuple node) { + boolean newStatement = beginSourceSection(node, b); + b.beginBlock(); + visitSequence(node.elements); + b.endBlock(); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(ExprTy.List node) { + boolean newStatement = beginSourceSection(node, b); + b.beginBlock(); + visitSequence(node.elements); + b.endBlock(); + endSourceSection(b, newStatement); + return null; + } + } + + @Override + public Void visit(StmtTy.Delete node) { + new DeleteVisitor().visitSequence(node.targets); + return null; + } + + @Override + public Void visit(StmtTy.Expr node) { + boolean newStatement = beginSourceSection(node, b); + if (isInteractive) { + b.beginPrintExpr(); + node.value.accept(this); + b.endPrintExpr(); + } else { + node.value.accept(this); + } + endSourceSection(b, newStatement); + + return null; + } + + @Override + public Void visit(StmtTy.For node) { + // @formatter:off + // iter = GetIter(<>); value; + // while (ForIterate(iter, &value)) { + // store value + // <> + // continueLabel: + // } + // < + // breakLabel: + // @formatter:on + boolean newStatement = beginSourceSection(node, b); + b.beginBlock(); + + BytecodeLocal iter = b.createLocal(); + + b.beginStoreLocal(iter); + b.beginGetIter(); + node.iter.accept(this); + b.endGetIter(); + b.endStoreLocal(); + + BytecodeLabel oldBreakLabel = breakLabel; + BytecodeLabel oldContinueLabel = continueLabel; + + BytecodeLabel currentBreakLabel = b.createLabel(); + breakLabel = currentBreakLabel; + + b.beginWhile(); + BytecodeLocal value = b.createLocal(); + + // condition + b.beginBlock(); + b.emitTraceLineAtLoopHeader(currentLocation.startLine); + b.beginForIterate(value); + b.emitLoadLocal(iter); + b.endForIterate(); + b.endBlock(); + + // body + b.beginBlock(); + continueLabel = b.createLabel(); + node.target.accept(new StoreVisitor(() -> { + b.emitLoadLocal(value); + })); + + visitSequence(node.body); + b.emitLabel(continueLabel); + b.endBlock(); + + b.endWhile(); + + breakLabel = oldBreakLabel; + continueLabel = oldContinueLabel; + visitSequence(node.orElse); + b.emitLabel(currentBreakLabel); + + b.endBlock(); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(StmtTy.FunctionDef node) { + boolean newStatement = beginSourceSection(node, b); + b.beginBlock(); + + beginStoreLocal(node.name, b); + + int numDeco = len(node.decoratorList); + for (int i = 0; i < numDeco; i++) { + b.beginCallUnaryMethod(); + node.decoratorList[i].accept(this); + } + + List annotations = collectParamAnnotations(node.args, node.returns); + emitMakeFunction(node, node.name, node.args, annotations); + + for (int i = 0; i < numDeco; i++) { + b.endCallUnaryMethod(); + } + + endStoreLocal(node.name, b); + + b.endBlock(); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(StmtTy.AsyncFunctionDef node) { + boolean newStatement = beginSourceSection(node, b); + beginStoreLocal(node.name, b); + + int numDeco = len(node.decoratorList); + for (int i = 0; i < numDeco; i++) { + b.beginCallUnaryMethod(); + node.decoratorList[i].accept(this); + } + + List annotations = collectParamAnnotations(node.args, node.returns); + emitMakeFunction(node, node.name, node.args, annotations); + + for (int i = 0; i < numDeco; i++) { + b.endCallUnaryMethod(); + } + + endStoreLocal(node.name, b); + endSourceSection(b, newStatement); + return null; + } + + private void emitParamAnnotation(ParamAnnotation paramAnnotation) { + emitPythonConstant(paramAnnotation.name, b); + + if (futureFeatures.contains(FutureFeature.ANNOTATIONS)) { + emitPythonConstant(Unparser.unparse(paramAnnotation.annotation), b); + } else { + if (paramAnnotation.annotation instanceof ExprTy.Starred starred) { + // *args: *Ts (where Ts is a TypeVarTuple). + // Do [annotation_value] = [*Ts]. + b.beginBlock(); + BytecodeLocal local = b.createLocal(); + b.beginUnpackToLocals(new BytecodeLocal[]{local}); + starred.value.accept(this); + b.endUnpackToLocals(); + b.emitLoadLocal(local); + b.endBlock(); + } else { + paramAnnotation.annotation.accept(this); + } + } + } + + private void emitMakeFunction(SSTNode node, String name, ArgumentsTy args, List annotations) { + BytecodeDSLCompilerResult compilerResult = compileNode(node); + BytecodeDSLCodeUnit codeUnit = compilerResult.codeUnit(); + + TruffleString functionName = toTruffleStringUncached(name); + Scope targetScope = ctx.scopeEnvironment.lookupScope(node); + TruffleString qualifiedName = toTruffleStringUncached(ctx.getQualifiedName(targetScope)); + + // Register these in the Python constants list. + addConstant(qualifiedName); + addConstant(codeUnit); + + b.beginMakeFunction(functionName, qualifiedName, codeUnit); + + if (args == null || len(args.defaults) == 0) { + b.emitLoadConstant(PythonUtils.EMPTY_OBJECT_ARRAY); + } else { + b.beginCollectToObjectArray(); + for (int i = 0; i < args.defaults.length; i++) { + args.defaults[i].accept(this); + } + b.endCollectToObjectArray(); + } + + boolean hasKeywords = false; + if (args != null && len(args.kwDefaults) != 0) { + // We only emit keywords with default values. Check if any exist. + for (int i = 0; i < args.kwDefaults.length; i++) { + if (args.kwDefaults[i] != null) { + hasKeywords = true; + break; + } + } + } + + if (!hasKeywords) { + b.emitLoadConstant(PKeyword.EMPTY_KEYWORDS); + } else { + ArgTy[] kwOnlyArgs = args.kwOnlyArgs; + + List keys = new ArrayList<>(); + b.beginMakeKeywords(); + for (int i = 0; i < args.kwDefaults.length; i++) { + // Only emit keywords with default values. + if (args.kwDefaults[i] != null) { + keys.add(toTruffleStringUncached(mangle(kwOnlyArgs[i].arg))); + args.kwDefaults[i].accept(this); + } + } + b.endMakeKeywords(keys.toArray(new TruffleString[0])); + } + + if (codeUnit.freevars.length == 0) { + b.emitLoadNull(); + } else { + b.beginMakeCellArray(); + for (int i = 0; i < codeUnit.freevars.length; i++) { + String fv = codeUnit.freevars[i].toJavaStringUncached(); + BytecodeLocal local; + if (scopeType == CompilationScope.Class && "__class__".equals(fv) || scope.getUseOfName(fv).contains(Scope.DefUse.Cell)) { + local = cellLocals.get(fv); + } else { + local = freeLocals.get(fv); + } + b.emitLoadLocal(local); + } + b.endMakeCellArray(); + } + + // __annotations__ + if (annotations != null && annotations.size() > 0) { + b.beginMakeDict(annotations.size()); + for (ParamAnnotation annotation : annotations) { + emitParamAnnotation(annotation); + } + b.endMakeDict(); + } else { + b.emitLoadNull(); + } + + b.endMakeFunction(); + } + + private BytecodeDSLCompilerResult compileNode(SSTNode node) { + return (new RootNodeCompiler(ctx, node, futureFeatures)).compile(); + } + + @Override + public Void visit(StmtTy.Global node) { + return null; + } + + private void visitStatements(StmtTy[] stmts) { + b.beginBlock(); + if (stmts != null) { + for (StmtTy stmt : stmts) { + stmt.accept(this); + } + } + b.endBlock(); + } + + @Override + public Void visit(StmtTy.If node) { + boolean newStatement = beginSourceSection(node, b); + if (node.orElse == null || node.orElse.length == 0) { + b.beginIfThen(); + visitCondition(node.test); + visitStatements(node.body); + b.endIfThen(); + } else { + b.beginIfThenElse(); + visitCondition(node.test); + visitStatements(node.body); + visitStatements(node.orElse); + b.endIfThenElse(); + } + + endSourceSection(b, newStatement); + return null; + } + + private boolean producesBoolean(ExprTy node) { + // NB: Binary and/or operations evaluate to their operands, which are not necessarily + // booleans. + return node instanceof ExprTy.UnaryOp unOp && unOp.op == UnaryOpTy.Not || + node instanceof ExprTy.Constant c && c.value.kind == Kind.BOOLEAN; + } + + private void visitCondition(ExprTy node) { + boolean mayNeedCoercion = !producesBoolean(node); + if (mayNeedCoercion) { + b.beginYes(); + } + + node.accept(this); + + if (mayNeedCoercion) { + b.endYes(); + } + } + + @Override + public Void visit(StmtTy.Import node) { + boolean newStatement = beginSourceSection(node, b); + b.beginBlock(); + + for (AliasTy name : node.names) { + addConstant(PythonUtils.EMPTY_TRUFFLESTRING_ARRAY); + if (name.asName == null) { + // import a.b.c + // --> a = (Import "a.b.c" [] 0) + // import a + // --> a = (Import "a" [] 0) + String resName = name.name.contains(".") + ? name.name.substring(0, name.name.indexOf('.')) + : name.name; + + beginStoreLocal(resName, b); + b.emitImport(toTruffleStringUncached(name.name), PythonUtils.EMPTY_TRUFFLESTRING_ARRAY, 0); + endStoreLocal(resName, b); + } else { + // import a.b.c as x + // --> x = (ImportFrom (ImportFrom (Import "a.b.c" [] 0) "b") "c") + // import a as x + // --> x = (Import "a" [] 0) + String[] parts = name.name.split("\\."); + + beginStoreLocal(name.asName, b); + + for (int i = parts.length - 1; i >= 0; i--) { + if (i != 0) { + b.beginImportFrom(toTruffleStringUncached(parts[i])); + } else { + b.emitImport(toTruffleStringUncached(name.name), PythonUtils.EMPTY_TRUFFLESTRING_ARRAY, 0); + } + } + + for (int i = 1; i < parts.length; i++) { + b.endImportFrom(); + } + + endStoreLocal(name.asName, b); + } + } + + b.endBlock(); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(StmtTy.ImportFrom node) { + boolean newStatement = beginSourceSection(node, b); + if (node.getSourceRange().startLine > ctx.futureLineNumber && "__future__".equals(node.module)) { + ctx.errorCallback.onError(ErrorType.Syntax, node.getSourceRange(), "from __future__ imports must occur at the beginning of the file"); + } + + TruffleString tsModuleName = toTruffleStringUncached(node.module == null ? "" : node.module); + + if (node.names[0].name.equals("*")) { + b.emitImportStar(tsModuleName, node.level); + } else { + b.beginBlock(); + + BytecodeLocal module = b.createLocal(); + + TruffleString[] fromList = new TruffleString[node.names.length]; + for (int i = 0; i < fromList.length; i++) { + fromList[i] = toTruffleStringUncached(node.names[i].name); + } + + b.beginStoreLocal(module); + b.emitImport(tsModuleName, fromList, node.level); + b.endStoreLocal(); + + TruffleString[] importedNames = new TruffleString[node.names.length]; + for (int i = 0; i < node.names.length; i++) { + AliasTy alias = node.names[i]; + String asName = alias.asName == null ? alias.name : alias.asName; + beginStoreLocal(asName, b); + + TruffleString name = toTruffleStringUncached(alias.name); + importedNames[i] = name; + b.beginImportFrom(name); + b.emitLoadLocal(module); + b.endImportFrom(); + + endStoreLocal(asName, b); + } + addConstant(importedNames); + + b.endBlock(); + } + + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(StmtTy.Match node) { + boolean newStatement = beginSourceSection(node, b); + b.beginBlock(); + // Compute and store the subject in a local. + BytecodeLocal subject = b.createLocal(); + b.beginStoreLocal(subject); + node.subject.accept(this); + b.endStoreLocal(); + + visitMatchCaseRecursively(node.cases, 0, new PatternContext(subject)); + + b.endBlock(); + endSourceSection(b, newStatement); + return null; + } + + private final class PatternContext { + private final Map bindVariables = new HashMap<>(); + private final BytecodeLocal subject; + private boolean allowIrrefutable = false; + + PatternContext(BytecodeLocal subject) { + this.subject = subject; + } + + public void copySubjectToTemporary(String name) { + BytecodeLocal temporary = allocateBindVariable(name); + b.beginStoreLocal(temporary); + b.emitLoadLocal(subject); + b.endStoreLocal(); + } + + private BytecodeLocal allocateBindVariable(String name) { + checkForbiddenName(name, NameOperation.BeginWrite); + if (bindVariables.containsKey(name)) { + duplicateStoreError(name); + } + BytecodeLocal result = b.createLocal(); + bindVariables.put(name, result); + return result; + } + + private void duplicateStoreError(String name) { + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "multiple assignments to name '%s' in pattern", name); + } + + } + + private void visitMatchCaseRecursively(MatchCaseTy[] cases, int index, PatternContext pc) { + /** + * Cases are chained as a sequence of if-then-else clauses, as in: + * + * @formatter:off + * IfThenElse( + * , + * , + * IfThenElse( + * , + * , + * ... + * ) + * ) + * @formatter:on + */ + MatchCaseTy c = cases[index]; + boolean newStatement = beginSourceSection(c, b); + + if (index != cases.length - 1) { + b.beginIfThenElse(); + + // A case that isn't last can be irrefutable only if it is guarded. + pc.allowIrrefutable = c.guard != null; + + emitPatternCondition(c, pc); + visitStatements(c.body); + pc.bindVariables.clear(); + visitMatchCaseRecursively(cases, index + 1, pc); + b.endIfThenElse(); + } else { + /** + * For the last pattern: if it's an unguarded wildcard _, just emit the body. + * Otherwise, emit an IfThen (no else). + */ + if (wildcardCheck(c.pattern) && c.guard == null) { + visitStatements(c.body); + } else { + b.beginIfThen(); + + // The last case can be irrefutable. + pc.allowIrrefutable = true; + + emitPatternCondition(c, pc); + visitStatements(c.body); + b.endIfThen(); + } + } + + endSourceSection(b, newStatement); + } + + private void emitPatternCondition(MatchCaseTy currentCase, PatternContext pc) { + PatternTy pattern = currentCase.pattern; + ExprTy guard = currentCase.guard; + + /** + * We evaluate conditions using a sequence of boolean computations chained with + * short-circuiting ANDs. If a condition fails at any point, we abort and continue with + * the next pattern. + * + * Patterns can bind variables, but a variable is only bound if the full pattern + * matches. We accumulate the bound values into temporary variables and copy them all + * over only if the pattern matches. For example: + * + * @formatter:off + * IfThenElse( + * And( + * , + * Block( + * + * ... + * , + * true // continue unconditionally + * ), + * + * ), + * , + * ... + * ) + * @formatter:on + */ + b.beginPrimitiveBoolAnd(); + + visitPattern(pattern, pc); + + if (!pc.bindVariables.isEmpty()) { + b.beginBlock(); + + for (Map.Entry entry : pc.bindVariables.entrySet()) { + beginStoreLocal(entry.getKey(), b); + b.emitLoadLocal(entry.getValue()); + endStoreLocal(entry.getKey(), b); + } + + b.emitLoadConstant(true); + b.endBlock(); + } + if (guard != null) { + visitCondition(guard); + } + b.endPrimitiveBoolAnd(); + } + + /** + * Generates code to test a {@code pattern} against the value stored in {@code subject}. + * + * Invariants: + *

          + *
        • The code for each pattern produces a boolean value. + *
        • When the pattern has a variable binding, the code will use the {@code pc} to allocate + * a new temporary variable to store the value of the binding. If the pattern match + * succeeds, only then will we copy the temporaries into Python-level variables. + *
        • The {@code pc.subject} variable always contains the value to match against a pattern. + * When performing structural recursion on a value, the original value will be overwritten + * unless saved in a new local. + *
        + */ + private void visitPattern(PatternTy pattern, PatternContext pc) { + boolean newStatement = beginSourceSection(pattern, b); + if (pattern instanceof PatternTy.MatchAs matchAs) { + doVisitPattern(matchAs, pc); + } else if (pattern instanceof PatternTy.MatchClass matchClass) { + doVisitPattern(matchClass, pc); + } else if (pattern instanceof PatternTy.MatchMapping matchMapping) { + doVisitPattern(matchMapping, pc); + } else if (pattern instanceof PatternTy.MatchOr matchOr) { + doVisitPattern(matchOr, pc); + } else if (pattern instanceof PatternTy.MatchSequence matchSequence) { + doVisitPattern(matchSequence, pc); + } else if (pattern instanceof PatternTy.MatchSingleton matchSingleton) { + doVisitPattern(matchSingleton, pc); + } else if (pattern instanceof PatternTy.MatchStar matchStar) { + doVisitPattern(matchStar, pc); + } else if (pattern instanceof PatternTy.MatchValue matchValue) { + doVisitPattern(matchValue, pc); + } else { + throw CompilerDirectives.shouldNotReachHere(); + } + endSourceSection(b, newStatement); + } + + // In a subpattern, irrefutable patterns are OK. + private void visitSubpattern(PatternTy pattern, PatternContext pc) { + boolean allowIrrefutable = pc.allowIrrefutable; + pc.allowIrrefutable = true; + visitPattern(pattern, pc); + pc.allowIrrefutable = allowIrrefutable; + } + + private void doVisitPattern(PatternTy.MatchAs node, PatternContext pc) { + b.beginBlock(); + if (node.name != null) { + pc.copySubjectToTemporary(node.name); + } + + if (node.pattern == null) { + // If there's no pattern (e.g., _), it trivially matches. Ensure this is permitted. + if (!pc.allowIrrefutable) { + if (node.name != null) { + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "name capture '%s' makes remaining patterns unreachable", node.name); + } + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "wildcard makes remaining patterns unreachable"); + } + b.emitLoadConstant(true); + } else { + assert node.name != null : "name should only be null for the empty wildcard pattern '_'"; + visitPattern(node.pattern, pc); + } + + b.endBlock(); + } + + private void emitPatternNotImplemented(String kind) { + b.beginBlock(); + emitNotImplemented(kind + " pattern matching", b); + // we need a value producing operation + b.emitLoadConstant(false); + b.endBlock(); + } + + /** + * Saves subject of the pattern context into BytecodeLocal variable, to be restored + * eventually. + * + * @param pc Pattern context, which subject needs to be saved. + * @return Subject saved in local variable. + */ + private BytecodeLocal patternContextSubjectSave(PatternContext pc) { + BytecodeLocal pcSave = b.createLocal(); + b.beginStoreLocal(pcSave); + b.emitLoadLocal(pc.subject); + b.endStoreLocal(); + return pcSave; + } + + /** + * Loads pattern context subject back into pattern context. + * + * @param pcSave Variable to restore pattern context subject from. + * @param pc Pattern context into which the subject should be restored. + */ + private void patternContextSubjectLoad(BytecodeLocal pcSave, PatternContext pc) { + b.beginStoreLocal(pc.subject); + b.emitLoadLocal(pcSave); + b.endStoreLocal(); + } + + /** + * Check if attribute and keyword attribute lengths match, or if there isn't too much + * patterns or attributes. Throws error on fail. + * + * @param patLen Patterns count + * @param attrsLen Attributes count + * @param kwdPatLen Keyword attributes count + * @param node MatchClass node for errors + */ + private void classMatchLengthChecks(int patLen, int attrsLen, int kwdPatLen, PatternTy.MatchClass node) { + if (attrsLen != kwdPatLen) { + ctx.errorCallback.onError(ErrorType.Syntax, node.getSourceRange(), "kwd_attrs (%d) / kwd_patterns (%d) length mismatch in class pattern", attrsLen, kwdPatLen); + } + if (Integer.MAX_VALUE < patLen + attrsLen - 1) { + String id = node.cls instanceof ExprTy.Name ? ((ExprTy.Name) node.cls).id : node.cls.toString(); + ctx.errorCallback.onError(ErrorType.Syntax, node.getSourceRange(), "too many sub-patterns in class pattern %s", id); + } + + } + + /** + * Visits sub-patterns for class pattern matching. Regular, positional patterns are handled + * first, then the keyword patterns (e.g. the "class.attribute = [keyword] pattern"). + * Generates boolean value based on results of the subpatterns; values are evaluated using + * the AND operator. + * + * @param patterns Patterns to check as subpatterns. + * @param kwdPatterns Keyword patterns to check as subpatterns. + * @param attrsValueUnpacked Values to use as `pc.subject` in sub-pattern check. + * @param pc Pattern context (subject is saved then restored). + * @param patLen Number of patterns. + * @param attrsLen Number of attributes (also keyword patterns). + */ + private void classMatchVisitSubpatterns(PatternTy[] patterns, PatternTy[] kwdPatterns, BytecodeLocal attrsValueUnpacked, PatternContext pc, int patLen, int attrsLen) { + BytecodeLocal pcSave = patternContextSubjectSave(pc); + + if (patLen + attrsLen == 0) { + b.emitLoadConstant(true); + } else { + BytecodeLocal temp = b.createLocal(); + b.beginStoreLocal(temp); + b.beginPrimitiveBoolAnd(); + for (int i = 0; i < patLen; i++) { + b.beginBlock(); + b.beginStoreLocal(pc.subject); + b.beginArrayIndex(i); + b.emitLoadLocal(attrsValueUnpacked); + b.endArrayIndex(); + b.endStoreLocal(); + + visitSubpattern(patterns[i], pc); + b.endBlock(); + } + + for (int i = 0, j = patLen; i < attrsLen; i++, j++) { + b.beginBlock(); + b.beginStoreLocal(pc.subject); + b.beginArrayIndex(j); + b.emitLoadLocal(attrsValueUnpacked); + b.endArrayIndex(); + b.endStoreLocal(); + + visitSubpattern(kwdPatterns[i], pc); + b.endBlock(); + } + b.endPrimitiveBoolAnd(); + b.endStoreLocal(); + + patternContextSubjectLoad(pcSave, pc); + + b.emitLoadLocal(temp); + } + } + + private void doVisitPattern(PatternTy.MatchClass node, PatternContext pc) { + /** + * Class pattern matching consists of subject and pattern. Pattern is split into: + *
          + *
        • patterns: These are positional and match the {@code __match_args__} arguments of the class, and are + * evaluated as sub-patterns with respective positional class attributes as subjects. + *
        • keyword attributes (kwdAttrs): These are non-positional, named class attributes that need to match + * the accompanying keyword patterns. + *
        • keyword patterns (kwdPatterns): Patterns that accompany keyword attributes, these are evaluated as + * sub-patterns with provided class attributes as subjects. Note that the number of keyword attributes + * and keyword patterns do need to match. + *
        + * + * Example: + * @formatter:off + * x = + * match x: + * case (x, 42 as y, a = ("test1" | "test2") as z): + * ... + * @formatter:on + * Here, {@code x} and {@code 42 as y} are "patterns" (positional), {@code a} is "keyword attribute" and + * {@code ... as z} is its accompanying "keyword pattern". + */ + + b.beginBlock(); + + PatternTy[] patterns = node.patterns; + String[] kwdAttrs = node.kwdAttrs; + PatternTy[] kwdPatterns = node.kwdPatterns; + int patLen = lengthOrZero(patterns); + int attrsLen = lengthOrZero(kwdAttrs); + int kwdPatLen = lengthOrZero(kwdPatterns); + + classMatchLengthChecks(patLen, attrsLen, kwdPatLen, node); + if (attrsLen > 0) { + validateKwdAttrs(kwdAttrs, kwdPatterns); + } + + //@formatter:off + // attributes needs to be converted into truffle strings + TruffleString[] tsAttrs = new TruffleString[attrsLen]; + for (int i = 0; i < attrsLen; i++) { + tsAttrs[i] = toTruffleStringUncached(kwdAttrs[i]); + } + + b.beginPrimitiveBoolAnd(); + BytecodeLocal attrsValue = b.createLocal(); + // match class that's in the subject + b.beginMatchClass(attrsValue); + b.emitLoadLocal(pc.subject); + node.cls.accept(this); // get class type + b.emitLoadConstant(patLen); + b.emitLoadConstant(tsAttrs); + b.endMatchClass(); + + b.beginBlock(); + // attributes from match class needs to be unpacked first + BytecodeLocal attrsValueUnpacked = b.createLocal(); + b.beginStoreLocal(attrsValueUnpacked); + b.beginUnpackSequence(patLen + attrsLen); + b.emitLoadLocal(attrsValue); + b.endUnpackSequence(); + b.endStoreLocal(); + + classMatchVisitSubpatterns(patterns, kwdPatterns, attrsValueUnpacked, pc, patLen, attrsLen); + b.endBlock(); + b.endPrimitiveBoolAnd(); + + b.endBlock(); + //@formatter:on + } + + /** + * Checks if keyword argument names aren't the same or if their name isn't forbidden. Raises + * error at fail. + * + * @param attrs Attributes to check. + * @param patterns Patterns for error source range. + */ + private void validateKwdAttrs(String[] attrs, PatternTy[] patterns) { + // Any errors will point to the pattern rather than the arg name as the + // parser is only supplying identifiers rather than Name or keyword nodes + int attrsLen = lengthOrZero(attrs); + for (int i = 0; i < attrsLen; i++) { + String attr = attrs[i]; + checkForbiddenName(attr, NameOperation.BeginWrite, patterns[i].getSourceRange()); + for (int j = i + 1; j < attrsLen; j++) { + String other = attrs[j]; + if (attr.equals(other)) { + ctx.errorCallback.onError(ErrorType.Syntax, patterns[j].getSourceRange(), "attribute name repeated in class pattern: `%s`", attr); + } + } + } + } + + private static int lengthOrZero(Object[] p) { + return p == null ? 0 : p.length; + } + + /** + * Checks if keys in pattern are, if present, longer than keys in subject. If yes, pattern + * should fail, otherwise, we should continue with evaluation. + * + * Generates result of the comparison (boolean). + * + * @param keyLen Number of keys in pattern. + * @param pc Pattern context. + */ + private void checkPatternKeysLength(int keyLen, PatternContext pc) { + b.beginGe(); + b.beginGetLen(); + b.emitLoadLocal(pc.subject); + b.endGetLen(); + b.emitLoadConstant(keyLen); + b.endGe(); + } + + /** + * Will process pattern keys: Attributes evaluation and constant folding. Checks for + * duplicate keys and that only literals and attributes lookups are being matched. + * + * Generates array. + * + * @param keys Pattern keys. + * @param keyLen Length of pattern keys. + * @param node Pattern matching node, for source range in errors. + */ + private void processPatternKeys(ExprTy[] keys, int keyLen, PatternTy.MatchMapping node) { + b.beginCollectToObjectArray(); // keys (from pattern) + List seen = new ArrayList<>(); + for (int i = 0; i < keyLen; i++) { + ExprTy key = keys[i]; + if (key instanceof ExprTy.Attribute) { + key.accept(this); + } else { + ConstantValue constantValue = null; + if (key instanceof ExprTy.UnaryOp || key instanceof ExprTy.BinOp) { + constantValue = foldConstantOp(key); + } else if (key instanceof ExprTy.Constant) { + constantValue = ((ExprTy.Constant) key).value; + } else { + ctx.errorCallback.onError(ErrorType.Syntax, node.getSourceRange(), "mapping pattern keys may only match literals and attribute lookups"); + } + assert constantValue != null; + Object pythonValue = PythonUtils.pythonObjectFromConstantValue(constantValue); + for (Object o : seen) { + // need python like equal - e.g. 1 equals True + if (PyObjectRichCompareBool.executeEqUncached(o, pythonValue)) { + ctx.errorCallback.onError(ErrorType.Syntax, node.getSourceRange(), "mapping pattern checks duplicate key (%s)", pythonValue); + } + } + seen.add(pythonValue); + createConstant(constantValue); + } + } + b.endCollectToObjectArray(); + } + + /** + * Visit all sub-patterns for mapping in pattern (not subject). + * + * Generates boolean value (AND of result of all sub-patterns). + * + * @param patterns Sub-patterns to iterate through. + * @param values Patterns from subject to set as subject for evaluated sub-patterns. + * @param pc Pattern context. + */ + private void mappingVisitSubpatterns(PatternTy[] patterns, BytecodeLocal values, PatternContext pc) { + int patLen = patterns.length; + + b.beginBlock(); + // unpack values from pc.subject + BytecodeLocal valuesUnpacked = b.createLocal(); + b.beginStoreLocal(valuesUnpacked); + b.beginUnpackSequence(patLen); + b.emitLoadLocal(values); + b.endUnpackSequence(); + b.endStoreLocal(); + + // backup pc.subject, it will get replaced for sub-patterns + BytecodeLocal pcSave = patternContextSubjectSave(pc); + + BytecodeLocal temp = b.createLocal(); + b.beginStoreLocal(temp); + b.beginPrimitiveBoolAnd(); + boolean hadNonWildcardPattern = false; + for (int i = 0; i < patLen; i++) { + if (wildcardCheck(patterns[i])) { + continue; + } + hadNonWildcardPattern = true; + b.beginBlock(); + b.beginStoreLocal(pc.subject); + b.beginArrayIndex(i); + b.emitLoadLocal(valuesUnpacked); + b.endArrayIndex(); + b.endStoreLocal(); + + visitSubpattern(patterns[i], pc); + b.endBlock(); + } + if (!hadNonWildcardPattern) { + b.emitLoadConstant(true); + } + b.endPrimitiveBoolAnd(); + b.endStoreLocal(); + + patternContextSubjectLoad(pcSave, pc); + + b.emitLoadLocal(temp); + b.endBlock(); + } + + private void doVisitPattern(PatternTy.MatchMapping node, PatternContext pc) { + /** + * Mapping pattern match will take the keys and check, whether the keys in the pattern + * are present in the subject. This is good enough, since the pattern needs only to be a + * subset of the subject. Keys aren't evaluated as subpatterns. + * + * After the key check, the values of the pattern are patterns as well and are evaluated + * as sub-patterns with values in the subject used as separate respective subjects. + */ + ExprTy[] keys = node.keys; + PatternTy[] patterns = node.patterns; + + int keyLen = lengthOrZero(keys); + int patLen = lengthOrZero(patterns); + + if (keyLen != patLen) { + ctx.errorCallback.onError(ErrorType.Syntax, node.getSourceRange(), "keys (%d) / patterns (%d) length mismatch in mapping pattern", keyLen, patLen); + } + // @formatter:off + + b.beginPrimitiveBoolAnd(); // AND for type, trivial and key length matching + // check that type matches + b.beginCheckTypeFlags(TypeFlags.MAPPING); + b.emitLoadLocal(pc.subject); + b.endCheckTypeFlags(); + + String starTarget = node.rest; + if (keyLen == 0 && starTarget == null) { + b.emitLoadConstant(true); + b.endPrimitiveBoolAnd(); + return; + } + if (Integer.MAX_VALUE < keyLen - 1) { + ctx.errorCallback.onError(ErrorType.Syntax, node.getSourceRange(), "too many sub-patterns in mapping pattern"); + } + + // If the pattern has any keys in it, perform a length check: + if (keyLen > 0) { + checkPatternKeysLength(keyLen, pc); + } + + b.beginBlock(); + BytecodeLocal subjectPatterns = b.createLocal(); + BytecodeLocal temp = b.createLocal(); + BytecodeLocal keysChecked = b.createLocal(); + + b.beginStoreLocal(temp); + b.beginPrimitiveBoolAnd(); // AND process keys and sub-patterns + b.beginBlock(); + b.beginStoreLocal(keysChecked); + processPatternKeys(keys, keyLen, node); + b.endStoreLocal(); + + // save match result together with values + b.beginMatchKeys(subjectPatterns); + b.emitLoadLocal(pc.subject); + b.emitLoadLocal(keysChecked); + b.endMatchKeys(); + b.endBlock(); + + if (patLen > 0) { + mappingVisitSubpatterns(patterns, subjectPatterns, pc); + } + b.endPrimitiveBoolAnd(); // AND process keys and sub-patterns + b.endStoreLocal(); // temp + + if (starTarget != null) { + BytecodeLocal starVariable = pc.allocateBindVariable(starTarget); + b.beginStoreLocal(starVariable); + b.beginCopyDictWithoutKeys(); + b.emitLoadLocal(pc.subject); + b.emitLoadLocal(keysChecked); + b.endCopyDictWithoutKeys(); + b.endStoreLocal(); + } + + b.emitLoadLocal(temp); + b.endBlock(); + b.endPrimitiveBoolAnd(); // AND for key length matching + + // @formatter:on + } + + private void checkAlternativePatternDifferentNames(Set control, Map bindVariables) { + if (!control.equals(bindVariables.keySet())) { + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "alternative patterns bind different names"); + } + } + + private void fromPatternContextToLocal(PatternContext pc, BytecodeLocal local_temp) { + b.beginIfThen(); + + // condition + b.emitLoadLocal(local_temp); + + // if-then + b.beginBlock(); + + if (!pc.bindVariables.isEmpty()) { + for (Map.Entry entry : pc.bindVariables.entrySet()) { + beginStoreLocal(entry.getKey(), b); + b.emitLoadLocal(entry.getValue()); + endStoreLocal(entry.getKey(), b); + } + } + + b.endBlock(); + b.endIfThen(); + } + + private void visitMatchOrRecursively(PatternTy[] patterns, int index, PatternContext pc, Set control, boolean allowIrrefutable) { + /** + * Case patterns joined by OR operator are chained as a sequence of binary OR operators, as in: + * + * @formatter:off + * case pattern1 | (pattern2 | (pattern3 | ... (patternN-1 | patternN))): + * ... + * @formatter:on + */ + b.beginBoolOr(); + b.beginBlock(); + + pc = new PatternContext(pc.subject); + + // store the (boolean) result of the sub-pattern + BytecodeLocal local_temp = b.createLocal(); + b.beginStoreLocal(local_temp); + visitPattern(patterns[index], pc); + b.endStoreLocal(); + + if (index == 0) { + control = new HashSet<>(pc.bindVariables.keySet()); + } + checkAlternativePatternDifferentNames(control, pc.bindVariables); + fromPatternContextToLocal(pc, local_temp); + + b.emitLoadLocal(local_temp); + b.endBlock(); + + if (index + 2 < patterns.length) { + visitMatchOrRecursively(patterns, index + 1, pc, control, allowIrrefutable); + b.endBoolOr(); + } else { + // Only last sub-pattern can be irrefutable -- if it was allowed in the first place + pc = new PatternContext(pc.subject); + pc.allowIrrefutable = allowIrrefutable; + + b.beginBlock(); + + // store the (boolean) result of the sub-pattern + local_temp = b.createLocal(); + b.beginStoreLocal(local_temp); + visitPattern(patterns[index + 1], pc); + b.endStoreLocal(); + + checkAlternativePatternDifferentNames(control, pc.bindVariables); + fromPatternContextToLocal(pc, local_temp); + + b.emitLoadLocal(local_temp); + b.endBlock(); + b.endBoolOr(); + } + } + + private void doVisitPattern(PatternTy.MatchOr node, PatternContext pc) { + boolean saveIrrefutable = pc.allowIrrefutable; + // sub-patterns are not irrefutable by default, only last one is + // this needs to be restored before last sub-pattern is visited + pc.allowIrrefutable = false; + visitMatchOrRecursively(node.patterns, 0, pc, null, saveIrrefutable); + } + + private void patternHelperSequenceUnpack(PatternTy[] patterns, PatternContext pc) { + int n = len(patterns); + + b.beginBlock(); + // We need to remember the unpacked array, since subject will be overwritten in + // recursive calls. + BytecodeLocal unpacked = b.createLocal(); + b.beginStoreLocal(unpacked); + patternUnpackHelper(patterns, pc); + b.endStoreLocal(); + + b.beginPrimitiveBoolAnd(); + for (int i = 0; i < n; i++) { + b.beginBlock(); + b.beginStoreLocal(pc.subject); + b.beginArrayIndex(i); + b.emitLoadLocal(unpacked); + b.endArrayIndex(); + b.endStoreLocal(); + + visitSubpattern(patterns[i], pc); + b.endBlock(); + } + + b.endPrimitiveBoolAnd(); + b.endBlock(); + } + + private void patternUnpackHelper(PatternTy[] patterns, PatternContext pc) { + int n = len(patterns); + + boolean seenStar = false; + for (int i = 0; i < n; i++) { + PatternTy pattern = patterns[i]; + if (pattern instanceof PatternTy.MatchStar) { + if (seenStar) { + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "multiple starred expressions in sequence pattern"); + } + seenStar = true; + int countAfter = n - i - 1; + if (countAfter != (byte) countAfter) { + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "too many expressions in star-unpacking sequence pattern"); + } + // If there's a star pattern, emit UnpackEx. + b.beginUnpackEx(i, countAfter); + b.emitLoadLocal(pc.subject); + b.endUnpackEx(); + // Continue in the loop to ensure there are no additional starred patterns. + } + } + // If there were no star patterns, emit UnpackSequence. + if (!seenStar) { + b.beginUnpackSequence(n); + b.emitLoadLocal(pc.subject); + b.endUnpackSequence(); + } + } + + /** + * Like patternHelperSequenceUnpack, but uses subscripting, which is (likely) more efficient + * for patterns with a starred wildcard like [first, *_], [first, *_, last], [*_, last], + * etc. + */ + private void patternHelperSequenceSubscr(PatternTy[] patterns, int star, PatternContext pc) { + int n = len(patterns); + + b.beginBlock(); + // We need to remember the sequence, since subject will be overwritten in recursive + // calls. + BytecodeLocal sequence = b.createLocal(); + b.beginStoreLocal(sequence); + b.emitLoadLocal(pc.subject); + b.endStoreLocal(); + + for (int i = 0; i < n; i++) { + PatternTy pattern = patterns[i]; + if (wildcardCheck(pattern)) { + // nothing to check + continue; + } else if (i == star) { + // nothing to check + assert wildcardStarCheck(pattern); + continue; + } + + b.beginStoreLocal(pc.subject); + b.beginBinarySubscript(); + b.emitLoadLocal(sequence); + if (i < star) { + b.emitLoadConstant(i); + } else { + // The subject may not support negative indexing! Compute a + // nonnegative index: + b.beginPyNumberSubtract(); + + b.beginGetLen(); + b.emitLoadLocal(sequence); + b.endGetLen(); + + b.emitLoadConstant(n - i); + + b.endPyNumberSubtract(); + } + b.endBinarySubscript(); + b.endStoreLocal(); + + visitSubpattern(pattern, pc); + } + b.endBlock(); + } + + private void doVisitPattern(PatternTy.MatchSequence node, PatternContext pc) { + int size = len(node.patterns); + int star = -1; + boolean onlyWildcard = true; + boolean starWildcard = false; + + // Find a starred name, if it exists. There may be at most one: + for (int i = 0; i < size; i++) { + PatternTy pattern = node.patterns[i]; + if (pattern instanceof PatternTy.MatchStar) { + if (star >= 0) { + ctx.errorCallback.onError(ErrorType.Syntax, node.getSourceRange(), "multiple starred names in sequence pattern"); + } + starWildcard = wildcardStarCheck(pattern); + onlyWildcard &= starWildcard; + star = i; + continue; + } + onlyWildcard &= wildcardCheck(pattern); + } + + b.beginBlock(); + BytecodeLocal resultOfAnd = b.createLocal(); + + // oldSubject <- pc.subject + // store pc.subject for eventual return from sub-pattern + BytecodeLocal oldSubject = b.createLocal(); + b.beginStoreLocal(oldSubject); + b.emitLoadLocal(pc.subject); + b.endStoreLocal(); + + b.beginStoreLocal(resultOfAnd); + b.beginPrimitiveBoolAnd(); + + b.beginCheckTypeFlags(TypeFlags.SEQUENCE); + b.emitLoadLocal(pc.subject); + b.endCheckTypeFlags(); + + if (star < 0) { + // No star: len(subject) == size + b.beginEq(); + b.beginGetLen(); + b.emitLoadLocal(pc.subject); + b.endGetLen(); + b.emitLoadConstant(size); + b.endEq(); + } else if (size > 1) { + // Star: len(subject) >= size - 1 + b.beginGe(); + b.beginGetLen(); + b.emitLoadLocal(pc.subject); + b.endGetLen(); + b.emitLoadConstant(size - 1); + b.endGe(); + } + + if (onlyWildcard) { + /** + * For patterns like: [] / [_] / [_, _] / [*_] / [_, *_] / [_, _, *_] / etc., there + * is nothing more to check. + */ + } else if (starWildcard) { + /** + * For sequences with a *_ pattern, it is (likely) more efficient to extract the + * bound elements with subscripting rather than iterating the entire collection. + */ + patternHelperSequenceSubscr(node.patterns, star, pc); + } else { + /** + * Otherwise, unpack the sequence element-by-element. If there's a named * pattern, + * collect the rest into it. + */ + patternHelperSequenceUnpack(node.patterns, pc); + } + + b.endPrimitiveBoolAnd(); + b.endStoreLocal(); + + // pc.subject <- oldSubject + // load old subject when returning from sub-pattern + b.beginStoreLocal(pc.subject); + b.emitLoadLocal(oldSubject); + b.endStoreLocal(); + + b.emitLoadLocal(resultOfAnd); + b.endBlock(); + + } + + private void doVisitPattern(PatternTy.MatchSingleton node, PatternContext pc) { + b.beginIs(); + b.emitLoadLocal(pc.subject); + + switch (node.value.kind) { + case BOOLEAN: + b.emitLoadConstant(node.value.getBoolean()); + break; + case NONE: + b.emitLoadConstant(PNone.NONE); + break; + default: + throw new IllegalStateException("wrong MatchSingleton value kind " + node.value.kind); + } + b.endIs(); + } + + private void doVisitPattern(PatternTy.MatchStar node, PatternContext pc) { + if (node.name != null) { + b.beginBlock(); + pc.copySubjectToTemporary(node.name); + b.emitLoadConstant(true); + b.endBlock(); + } + /** + * If there's no name, no need to emit anything. A MatchStar can only appear as a + * subpattern of a mapping/sequence pattern, at which point in code generation we will + * be in the middle of a short-circuiting AND (that already has at least one operand) + */ + } + + private void doVisitPattern(PatternTy.MatchValue node, PatternContext pc) { + b.beginEq(); + b.emitLoadLocal(pc.subject); + + if (node.value instanceof ExprTy.UnaryOp || node.value instanceof ExprTy.BinOp) { + createConstant(foldConstantOp(node.value)); + } else if (node.value instanceof ExprTy.Constant || node.value instanceof ExprTy.Attribute) { + node.value.accept(this); + } else { + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "patterns may only match literals and attribute lookups"); + } + b.endEq(); + } + + private static boolean wildcardCheck(PatternTy pattern) { + return pattern instanceof PatternTy.MatchAs && ((PatternTy.MatchAs) pattern).name == null; + } + + private static boolean wildcardStarCheck(PatternTy pattern) { + return pattern instanceof PatternTy.MatchStar && ((PatternTy.MatchStar) pattern).name == null; + } + + /** + * handles only particular cases when a constant comes either as a unary or binary op + */ + private ConstantValue foldConstantOp(ExprTy value) { + if (value instanceof ExprTy.UnaryOp unaryOp) { + return foldUnaryOpConstant(unaryOp); + } else if (value instanceof ExprTy.BinOp binOp) { + return foldBinOpComplexConstant(binOp); + } + throw new IllegalStateException("should not reach here"); + } + + /** + * handles only unary sub and a numeric constant + */ + private ConstantValue foldUnaryOpConstant(ExprTy.UnaryOp unaryOp) { + assert unaryOp.op == UnaryOpTy.USub; + assert unaryOp.operand instanceof ExprTy.Constant : unaryOp.operand; + ExprTy.Constant c = (ExprTy.Constant) unaryOp.operand; + ConstantValue ret = c.value.negate(); + assert ret != null; + return ret; + } + + /** + * handles only complex which comes as a BinOp + */ + private ConstantValue foldBinOpComplexConstant(ExprTy.BinOp binOp) { + assert (binOp.left instanceof ExprTy.UnaryOp || binOp.left instanceof ExprTy.Constant) && binOp.right instanceof ExprTy.Constant : binOp.left + " " + binOp.right; + assert binOp.op == OperatorTy.Sub || binOp.op == OperatorTy.Add; + ConstantValue left; + if (binOp.left instanceof ExprTy.UnaryOp) { + left = foldUnaryOpConstant((ExprTy.UnaryOp) binOp.left); + } else { + left = ((ExprTy.Constant) binOp.left).value; + } + ExprTy.Constant right = (ExprTy.Constant) binOp.right; + switch (binOp.op) { + case Add: + return left.addComplex(right.value); + case Sub: + return left.subComplex(right.value); + default: + throw new IllegalStateException("wrong constant BinOp operator " + binOp.op); + } + } + + @Override + public Void visit(MatchCaseTy node) { + throw new UnsupportedOperationException("" + node.getClass()); + } + + @Override + public Void visit(PatternTy.MatchAs node) { + throw new UnsupportedOperationException("" + node.getClass()); + } + + @Override + public Void visit(PatternTy.MatchClass node) { + throw new UnsupportedOperationException("" + node.getClass()); + } + + @Override + public Void visit(PatternTy.MatchMapping node) { + throw new UnsupportedOperationException("" + node.getClass()); + } + + @Override + public Void visit(PatternTy.MatchOr node) { + throw new UnsupportedOperationException("" + node.getClass()); + } + + @Override + public Void visit(PatternTy.MatchSequence node) { + throw new UnsupportedOperationException("" + node.getClass()); + } + + @Override + public Void visit(PatternTy.MatchSingleton node) { + throw new UnsupportedOperationException("" + node.getClass()); + } + + @Override + public Void visit(PatternTy.MatchStar node) { + throw new UnsupportedOperationException("" + node.getClass()); + } + + @Override + public Void visit(PatternTy.MatchValue node) { + throw new UnsupportedOperationException("" + node.getClass()); + } + + @Override + public Void visit(StmtTy.Nonlocal node) { + return null; + } + + @Override + public Void visit(StmtTy.Raise node) { + boolean newStatement = beginSourceSection(node, b); + b.beginRaise(); + + if (node.exc != null) { + node.exc.accept(this); + } else { + b.emitLoadConstant(PNone.NO_VALUE); + } + + if (node.cause != null) { + node.cause.accept(this); + } else { + b.emitLoadConstant(PNone.NO_VALUE); + } + + b.endRaise(); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(StmtTy.Return node) { + boolean newStatement = beginSourceSection(node, b); + if (!scope.isFunction()) { + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "'return' outside function"); + } + beginReturn(b); + if (node.value != null) { + node.value.accept(this); + } else { + b.emitLoadConstant(PNone.NONE); + } + endReturn(b); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(StmtTy.Try node) { + boolean newStatement = beginSourceSection(node, b); + if (node.finalBody != null && node.finalBody.length != 0) { + /** + * In Python, an uncaught exception becomes the "current" exception inside a finally + * block. The finally body can itself throw, in which case it replaces the exception + * being thrown. For such a scenario, we have to be careful to restore the "current" + * exception using a try-finally. + * + * In pseudocode, the implementation looks like: + * @formatter:off + * try { + * try_catch_else + * } catch uncaught_ex { + * save current exception + * set the current exception to uncaught_ex + * markCaught(uncaught_ex) + * try { + * finally_body + * } catch handler_ex { + * restore current exception + * markCaught(handler_ex) + * reraise handler_ex + * } otherwise { + * restore current exception + * } + * reraise uncaught_ex + * } otherwise { + * finally_body + * } + */ + b.beginTryCatchOtherwise(() -> { + b.beginBlock(); // finally + visitSequence(node.finalBody); + b.endBlock(); + }); + + emitTryExceptElse(node); // try + + b.beginBlock(); // catch + BytecodeLocal savedException = b.createLocal(); + emitSaveCurrentException(savedException); + emitSetCurrentException(); + // Mark this location for the stack trace. + b.beginMarkExceptionAsCaught(); + b.emitLoadException(); + b.endMarkExceptionAsCaught(); + + b.beginTryCatchOtherwise(() -> emitRestoreCurrentException(savedException)); + b.beginBlock(); // try + visitSequence(node.finalBody); + b.endBlock(); // try + + b.beginBlock(); // catch + emitRestoreCurrentException(savedException); + + b.beginMarkExceptionAsCaught(); + b.emitLoadException(); + b.endMarkExceptionAsCaught(); + + b.beginReraise(); + b.emitLoadException(); + b.endReraise(); + b.endBlock(); // catch + b.endTryCatchOtherwise(); + + b.beginReraise(); + b.emitLoadException(); + b.endReraise(); + b.endBlock(); // catch + b.endTryCatchOtherwise(); + // @formatter:on + } else { + emitTryExceptElse(node); + } + + endSourceSection(b, newStatement); + return null; + } + + /** + * Emit the "try-except-else" part of a Try node. The "finally" part, if it exists, should + * be handled by the caller of this method. + */ + private void emitTryExceptElse(StmtTy.Try node) { + if (node.handlers != null && node.handlers.length != 0) { + /** + * There are two orthogonal issues that complicate Python try-except clauses. + * + * First, when in an exception handler, the "current" exception (accessible via, e.g., + * sys.exc_info) gets set to the caught exception. After leaving the handler, this + * "current" exception must be restored to the one previously stored. Since except + * clauses can themselves raise exceptions, the restoring process must happen inside + * a finally block. + * + * Second, when an exception is bound to an identifier (e.g., except BaseException as + * ex), the identifier must be deleted after leaving the except clause. Again, since + * the except clause may raise an exception, the deletion must happen inside a finally + * block. Since the bound name is different in each clause, this block is specific to + * each handler. + * + * @formatter:off + * try { + * try_body + * # fall through to else_body + * } catch ex { + * save current exception + * set current exception to ex + * markCaught(ex) + * try { + * if (handler_1_matches(ex)) { + * assign ex to handler_1_name + * try { + * handler_1_body + * } catch handler_1_ex { + * unbind handler_1_name + * // Freeze the bci before it gets rethrown. + * markCaught(handler_ex) + * throw handler_1_ex + * } otherwise { + * unbind handler_1_name + * } + * goto afterElse + * } + * ... // more handlers + * + * // case 1: bare except + * bare_except_body + * goto afterElse + * } catch handler_ex { + * // A handler raised or no handler was found. Restore exception state and reraise. + * restore current exception + * markCaught(handler_ex) // (no-op if handler_ex is the original exception) + * reraise handler_ex + * } otherwise { + * // Exception handled. Restore the exception state. + * restore current exception + * } + * // case 2: no bare except (we only reach this point if no handler matched/threw) + * reraise ex + * } + * else_body + * afterElse: + */ + b.beginBlock(); // outermost block + + BytecodeLocal savedException = b.createLocal(); + BytecodeLabel afterElse = b.createLabel(); + + b.beginTryCatch(); + + b.beginBlock(); // try + visitSequence(node.body); + b.endBlock(); // try + + b.beginBlock(); // catch + emitSaveCurrentException(savedException); + emitSetCurrentException(); + // Mark this location for the stack trace. + b.beginMarkExceptionAsCaught(); + b.emitLoadException(); // ex + b.endMarkExceptionAsCaught(); + + b.beginTryCatchOtherwise(() -> emitRestoreCurrentException(savedException)); + b.beginBlock(); // try + SourceRange bareExceptRange = null; + for (ExceptHandlerTy h : node.handlers) { + boolean newStatement = beginSourceSection(h, b); + if (bareExceptRange != null) { + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "default 'except:' must be last"); + } + + ExceptHandlerTy.ExceptHandler handler = (ExceptHandlerTy.ExceptHandler) h; + if (handler.type != null) { + b.beginIfThen(); + b.beginExceptMatch(); + b.emitLoadException(); // ex + handler.type.accept(this); + b.endExceptMatch(); + } else { + bareExceptRange = handler.getSourceRange(); + } + + b.beginBlock(); // handler body + + if (handler.name != null) { + // Assign exception to handler name. + beginStoreLocal(handler.name, b); + b.beginUnwrapException(); + b.emitLoadException(); // ex + b.endUnwrapException(); + endStoreLocal(handler.name, b); + + b.beginTryCatchOtherwise(() -> emitUnbindHandlerVariable(handler)); + b.beginBlock(); // try + visitSequence(handler.body); + b.endBlock(); // try + + b.beginBlock(); // catch + emitUnbindHandlerVariable(handler); + + b.beginMarkExceptionAsCaught(); + b.emitLoadException(); // handler_i_ex + b.endMarkExceptionAsCaught(); + + b.beginThrow(); + b.emitLoadException(); // handler_i_ex + b.endThrow(); + b.endBlock(); // catch + b.endTryCatchOtherwise(); + } else { // bare except + b.beginBlock(); + visitSequence(handler.body); + b.endBlock(); + } + + b.emitBranch(afterElse); + + b.endBlock(); // handler body + + if (handler.type != null) { + b.endIfThen(); + } + + endSourceSection(b, newStatement); + } + b.endBlock(); // try + + b.beginBlock(); // catch + emitRestoreCurrentException(savedException); + + b.beginMarkExceptionAsCaught(); + b.emitLoadException(); // handler_ex + b.endMarkExceptionAsCaught(); + + b.beginReraise(); + b.emitLoadException(); // handler_ex + b.endReraise(); + b.endBlock(); // catch + b.endTryCatchOtherwise(); + + /** + * Each handler branches to afterElse. If we reach this point and there was not a + * bare exception, none of the handlers matched, and we should reraise. + * Optimization: If there's a bare except clause, control will never fall through + * and we can omit the rethrow. + */ + if (bareExceptRange == null) { + b.beginReraise(); + b.emitLoadException(); // ex + b.endReraise(); + } + + b.endBlock(); // catch + + b.endTryCatch(); + + if (node.orElse != null) { + visitSequence(node.orElse); + } + b.emitLabel(afterElse); + + b.endBlock(); // outermost block + // @formatter:on + } else { + // Optimization: If there's no except clauses, there's no point in generating a + // TryCatch with a catch that just rethrows the caught exception. + b.beginBlock(); + visitSequence(node.body); + b.endBlock(); + } + } + + private void emitSaveCurrentException(BytecodeLocal savedException) { + b.beginStoreLocal(savedException); + b.emitGetCurrentException(); + b.endStoreLocal(); + } + + private void emitSetCurrentException() { + b.beginSetCurrentException(); + b.emitLoadException(); + b.endSetCurrentException(); + } + + private void emitRestoreCurrentException(BytecodeLocal savedException) { + b.beginSetCurrentException(); + b.emitLoadLocal(savedException); + b.endSetCurrentException(); + } + + private void emitUnbindHandlerVariable(ExceptHandlerTy.ExceptHandler handler) { + b.beginBlock(); + // Store None to the variable just in case the handler deleted it. + beginStoreLocal(handler.name, b); + b.emitLoadConstant(PNone.NONE); + endStoreLocal(handler.name, b); + emitDelLocal(handler.name, b); + b.endBlock(); + } + + @Override + public Void visit(StmtTy.TryStar node) { + emitNotImplemented("try star", b); + return null; + } + + @Override + public Void visit(ExceptHandlerTy.ExceptHandler node) { + throw new UnsupportedOperationException("" + node.getClass()); + } + + @Override + public Void visit(StmtTy.While node) { + boolean newStatement = beginSourceSection(node, b); + b.beginBlock(); + + BytecodeLabel oldBreakLabel = breakLabel; + BytecodeLabel oldContinueLabel = continueLabel; + + BytecodeLabel currentBreakLabel = b.createLabel(); + breakLabel = currentBreakLabel; + + b.beginWhile(); + + b.beginBlock(); + b.emitTraceLineAtLoopHeader(currentLocation.startLine); + visitCondition(node.test); + b.endBlock(); + + b.beginBlock(); + continueLabel = b.createLabel(); + visitStatements(node.body); + b.emitLabel(continueLabel); + b.endBlock(); + + b.endWhile(); + + breakLabel = oldBreakLabel; + continueLabel = oldContinueLabel; + visitStatements(node.orElse); + b.emitLabel(currentBreakLabel); + + b.endBlock(); + endSourceSection(b, newStatement); + return null; + } + + private void visitWithRecurse(WithItemTy[] items, int index, StmtTy[] body, boolean async) { + /** + * For a with-statement like + * + * with foo as x: + * bar + * + * we generate code that performs (roughly) + * + * @formatter:off + * contextManager = foo + * resolve __enter__ and __exit__ + * value = __enter__() + * try { + * x = value + * bar + * } catch ex { + * if not __exit__(...): + * raise + * } otherwise { + * call __exit__(None, None, None) + * } + * @formatter:on + * + * When there are multiple context managers, they are recursively generated (where "bar" + * is). Once we have entered all of the context managers, we emit the body. + */ + WithItemTy item = items[index]; + boolean newStatement = beginSourceSection(item, b); + b.beginBlock(); + + BytecodeLocal contextManager = b.createLocal(); + b.beginStoreLocal(contextManager); + item.contextExpr.accept(this); + b.endStoreLocal(); + + BytecodeLocal exit = b.createLocal(); + BytecodeLocal value = b.createLocal(); + if (async) { + // call __aenter__ + b.beginAsyncContextManagerEnter(exit, value); + b.emitLoadLocal(contextManager); + b.endAsyncContextManagerEnter(); + // await the result + emitAwait(() -> b.emitLoadLocal(value)); + } else { + // call __enter__ + b.beginContextManagerEnter(exit, value); + b.emitLoadLocal(contextManager); + b.endContextManagerEnter(); + } + + Runnable finallyHandler; + if (async) { + finallyHandler = () -> emitAwait(() -> { + b.beginAsyncContextManagerCallExit(); + b.emitLoadConstant(PNone.NONE); + b.emitLoadLocal(exit); + b.emitLoadLocal(contextManager); + b.endAsyncContextManagerCallExit(); + }); + } else { + finallyHandler = () -> { + // call __exit__ + b.beginContextManagerExit(); + b.emitLoadConstant(PNone.NONE); + b.emitLoadLocal(exit); + b.emitLoadLocal(contextManager); + b.endContextManagerExit(); + }; + } + b.beginTryCatchOtherwise(finallyHandler); + b.beginBlock(); // try + if (item.optionalVars != null) { + item.optionalVars.accept(new StoreVisitor(() -> b.emitLoadLocal(value))); + } + if (index < items.length - 1) { + visitWithRecurse(items, index + 1, body, async); + } else { + visitSequence(body); + } + b.endBlock(); // try + + b.beginBlock(); // catch + + // Mark this location for the stack trace. + b.beginMarkExceptionAsCaught(); + b.emitLoadException(); + b.endMarkExceptionAsCaught(); + + // exceptional exit + if (async) { + // call, await, and handle result of __aexit__ + b.beginAsyncContextManagerExit(); + b.emitLoadException(); + emitAwait(() -> { + b.beginAsyncContextManagerCallExit(); + b.emitLoadException(); + b.emitLoadLocal(exit); + b.emitLoadLocal(contextManager); + b.endAsyncContextManagerCallExit(); + }); + b.endAsyncContextManagerExit(); + } else { + // call __exit__ + b.beginContextManagerExit(); + b.emitLoadException(); + b.emitLoadLocal(exit); + b.emitLoadLocal(contextManager); + b.endContextManagerExit(); + } + b.endBlock(); // catch + + b.endTryCatchOtherwise(); + b.endBlock(); + endSourceSection(b, newStatement); + } + + @Override + public Void visit(StmtTy.With node) { + boolean newStatement = beginSourceSection(node, b); + visitWithRecurse(node.items, 0, node.body, false); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(WithItemTy node) { + throw new UnsupportedOperationException("" + node.getClass()); + } + + @Override + public Void visit(StmtTy.Break aThis) { + boolean newStatement = beginSourceSection(aThis, b); + if (breakLabel == null) { + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "'break' outside loop"); + } + b.emitBranch(breakLabel); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(StmtTy.Continue aThis) { + boolean newStatement = beginSourceSection(aThis, b); + if (continueLabel == null) { + ctx.errorCallback.onError(ErrorType.Syntax, currentLocation, "'continue' not properly in loop"); + } + b.emitBranch(continueLabel); + endSourceSection(b, newStatement); + return null; + } + + @Override + public Void visit(StmtTy.Pass aThis) { + return null; + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallBinaryIOp1Node.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallBinaryIOp1Node.java new file mode 100644 index 0000000000..a873681881 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallBinaryIOp1Node.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.CallSlotBinaryFuncNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.InplaceSlot; +import com.oracle.graal.python.nodes.PNodeWithContext; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; + +/** + * Equivalent of cpython://Objects/abstract.c#binary_iop1. + */ +@GenerateInline +@GenerateCached(false) +@GenerateUncached +public abstract class CallBinaryIOp1Node extends PNodeWithContext { + public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object v, Object classV, TpSlots slotsV, + Object w, Object classW, TpSlots slotsW, InplaceSlot op); + + @Specialization + static Object doIt(VirtualFrame frame, Node inliningTarget, Object v, Object classV, TpSlots slotsV, Object w, Object classW, TpSlots slotsW, InplaceSlot iop, + @Cached CallSlotBinaryFuncNode callSlotNode, + @Cached InlinedBranchProfile resultProfile, + @Cached CallBinaryOp1Node callBinaryOp1Node) { + TpSlot slot = iop.getSlotValue(slotsV); + if (slot != null) { + Object result = callSlotNode.execute(frame, inliningTarget, slot, v, w); + if (result != PNotImplemented.NOT_IMPLEMENTED) { + resultProfile.enter(inliningTarget); + return result; + } + } + return callBinaryOp1Node.execute(frame, inliningTarget, v, classV, slotsV, w, classW, slotsW, iop.getReversibleSlot()); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallBinaryIOpNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallBinaryIOpNode.java new file mode 100644 index 0000000000..b52455725d --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallBinaryIOpNode.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import static com.oracle.graal.python.lib.CallBinaryOpNode.raiseNotSupported; + +import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.InplaceSlot; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +/** + * Equivalent of cpython://Objects/abstract.c#binary_op. + */ +@GenerateInline +@GenerateCached(false) +@GenerateUncached +public abstract class CallBinaryIOpNode extends Node { + public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object v, Object w, InplaceSlot slot, String opName); + + @Specialization + static Object doIt(VirtualFrame frame, Node inliningTarget, Object v, Object w, InplaceSlot slot, String opName, + @Cached GetClassNode getVClass, + @Cached GetCachedTpSlotsNode getVSlots, + @Cached GetCachedTpSlotsNode getWSlots, + @Cached GetClassNode getWClass, + @Cached CallBinaryIOp1Node callBinaryIOp1Node, + @Cached PRaiseNode raiseNode) { + Object classV = getVClass.execute(inliningTarget, v); + Object classW = getWClass.execute(inliningTarget, w); + TpSlots slotsV = getVSlots.execute(inliningTarget, classV); + TpSlots slotsW = getWSlots.execute(inliningTarget, classW); + Object result = callBinaryIOp1Node.execute(frame, inliningTarget, v, classV, slotsV, w, classW, slotsW, slot); + if (result != PNotImplemented.NOT_IMPLEMENTED) { + return result; + } + throw raiseNotSupported(inliningTarget, v, w, opName, raiseNode); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallBinaryOp1Node.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallBinaryOp1Node.java index 5da1edf36f..63e4204dab 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallBinaryOp1Node.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallBinaryOp1Node.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,16 +41,18 @@ package com.oracle.graal.python.lib; import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.IsSameSlotNode; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpSlot; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.CallSlotBinaryOpNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.ReversibleSlot; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; @@ -62,9 +64,10 @@ */ @GenerateInline @GenerateCached(false) +@GenerateUncached public abstract class CallBinaryOp1Node extends PNodeWithContext { - public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object v, Object classV, TpSlot slotV, - Object w, Object classW, TpSlot slotW, BinaryOpSlot op); + public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object v, Object classV, TpSlots slotsV, + Object w, Object classW, TpSlots slotsW, ReversibleSlot op); // CPython binary_op1 may end up calling SLOT1BINFULL - wrapper around the dunder methods, which // duplicates some of the logic checking the right operand, its slot, and whether it is subtype. @@ -86,47 +89,50 @@ public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object v // we just try __rxxx__, again, without any subclass check. @Specialization - static Object doIt(VirtualFrame frame, Node inliningTarget, Object v, Object classV, TpSlot slotV, Object w, Object classW, TpSlot slotWIn, BinaryOpSlot op, + static Object doIt(VirtualFrame frame, Node inliningTarget, Object v, Object classV, TpSlots slotsV, Object w, Object classW, TpSlots slotsW, ReversibleSlot op, @Cached IsSameTypeNode isSameTypeNode, @Cached IsSameSlotNode isSameSlotNode, @Cached InlinedConditionProfile isSameTypeProfile, @Cached InlinedConditionProfile isSameSlotProfile, @Cached(inline = false) IsSubtypeNode isSubtypeNode, - @Cached InlinedBranchProfile wResultBranch, - @Cached InlinedBranchProfile vResultBranch, + @Cached InlinedConditionProfile vResultProfile, + @Cached InlinedConditionProfile wResultProfile, @Cached InlinedBranchProfile notImplementedBranch, @Cached CallSlotBinaryOpNode callSlotWNode, @Cached CallSlotBinaryOpNode callSlotVNode) { - TpSlot slotW = null; - boolean sameTypes = isSameTypeProfile.profile(inliningTarget, isSameTypeNode.execute(inliningTarget, classW, classV)); - if (!sameTypes) { - slotW = slotWIn; - if (isSameSlotProfile.profile(inliningTarget, slotV != null && slotW != null && isSameSlotNode.execute(inliningTarget, slotW, slotV))) { - slotW = null; - } - } + final TpSlot slotV = op.getSlotValue(slotsV); + final TpSlot slotW = op.getSlotValue(slotsW); + boolean skipReverse = false; // Note: we call slotW with v as the receiver. This appears to be the semantics of // CPython reversible binop slots. This is supposed to allow the slot to handle // the reversible case, if the slot does not want to handle it, it should detect that // the first receiver argument is not of the right type and just return NotImplemented. if (slotV != null) { - if (slotW != null && isSubtypeNode.execute(frame, classW, classV)) { - assert !sameTypes; - Object result = callSlotWNode.execute(frame, inliningTarget, slotW, v, classV, w, slotW, classW, false, op); - if (result != PNotImplemented.NOT_IMPLEMENTED) { - wResultBranch.enter(inliningTarget); - return result; + boolean sameTypes = false; + if (slotW != null) { + sameTypes = isSameTypeProfile.profile(inliningTarget, isSameTypeNode.execute(inliningTarget, classW, classV)); + if (!sameTypes) { + if (!isSameSlotProfile.profile(inliningTarget, isSameSlotNode.execute(inliningTarget, slotW, slotV))) { + if (isSubtypeNode.execute(classW, classV)) { + Object result = callSlotWNode.execute(frame, inliningTarget, slotW, v, classV, w, slotW, classW, false, op); + if (wResultProfile.profile(inliningTarget, result != PNotImplemented.NOT_IMPLEMENTED)) { + return result; + } + skipReverse = true; + } + } else { + skipReverse = true; + } + } else { + skipReverse = true; } - slotW = null; } - Object result = callSlotVNode.execute(frame, inliningTarget, slotV, v, classV, w, slotWIn, classW, sameTypes, op); - if (result != PNotImplemented.NOT_IMPLEMENTED) { - vResultBranch.enter(inliningTarget); + Object result = callSlotVNode.execute(frame, inliningTarget, slotV, v, classV, w, slotW, classW, sameTypes, op); + if (vResultProfile.profile(inliningTarget, result != PNotImplemented.NOT_IMPLEMENTED)) { return result; } } - if (slotW != null) { - assert !sameTypes; + if (slotW != null && !skipReverse) { return callSlotWNode.execute(frame, inliningTarget, slotW, v, classV, w, slotW, classW, false, op); } notImplementedBranch.enter(inliningTarget); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallBinaryOpNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallBinaryOpNode.java new file mode 100644 index 0000000000..e09fb2c59d --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallBinaryOpNode.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.ReversibleSlot; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +/** + * Equivalent of cpython://Objects/abstract.c#binary_op. + */ +@GenerateInline +@GenerateCached(false) +@GenerateUncached +public abstract class CallBinaryOpNode extends Node { + public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object v, Object w, ReversibleSlot slot, String opName); + + @Specialization + static Object doIt(VirtualFrame frame, Node inliningTarget, Object v, Object w, ReversibleSlot slot, String opName, + @Cached GetClassNode getVClass, + @Cached GetCachedTpSlotsNode getVSlots, + @Cached GetCachedTpSlotsNode getWSlots, + @Cached GetClassNode getWClass, + @Cached CallBinaryOp1Node callBinaryOp1Node, + @Cached PRaiseNode raiseNode) { + Object classV = getVClass.execute(inliningTarget, v); + Object classW = getWClass.execute(inliningTarget, w); + TpSlots slotsV = getVSlots.execute(inliningTarget, classV); + TpSlots slotsW = getWSlots.execute(inliningTarget, classW); + Object result = callBinaryOp1Node.execute(frame, inliningTarget, v, classV, slotsV, w, classW, slotsW, slot); + if (result != PNotImplemented.NOT_IMPLEMENTED) { + return result; + } + throw raiseNotSupported(inliningTarget, v, w, opName, raiseNode); + } + + @InliningCutoff + static PException raiseNotSupported(Node inliningTarget, Object v, Object w, String opName, PRaiseNode raiseNode) { + return raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_FOR_S_P_AND_P, opName, v, w); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallTernaryIOpNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallTernaryIOpNode.java new file mode 100644 index 0000000000..eda627ab2d --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallTernaryIOpNode.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotNbPower.CallSlotNbInPlacePowerNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline +@GenerateCached(false) +@GenerateUncached +public abstract class CallTernaryIOpNode extends Node { + public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object v, Object w, Object z); + + @Specialization + static Object doGeneric(VirtualFrame frame, Node inliningTarget, Object v, Object w, Object z, + @Cached GetClassNode getVClass, + @Cached GetClassNode getWClass, + @Cached GetCachedTpSlotsNode getVSlots, + @Cached GetCachedTpSlotsNode getWSlots, + @Cached CallSlotNbInPlacePowerNode callInplacePower, + @Cached CallTernaryOpNode callTernaryOpNode) { + Object classV = getVClass.execute(inliningTarget, v); + TpSlots slotsV = getVSlots.execute(inliningTarget, classV); + TpSlot slotV = slotsV.nb_inplace_power(); + if (slotV != null) { + Object result = callInplacePower.execute(frame, inliningTarget, slotV, v, w, z); + if (result != PNotImplemented.NOT_IMPLEMENTED) { + return result; + } + } + slotV = slotsV.nb_power(); + Object classW = getWClass.execute(inliningTarget, w); + TpSlot slotW = getWSlots.execute(inliningTarget, classW).nb_power(); + return callTernaryOpNode.execute(frame, inliningTarget, v, classV, slotV, w, classW, slotW, z); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallTernaryOpNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallTernaryOpNode.java new file mode 100644 index 0000000000..b86d30c4d5 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CallTernaryOpNode.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.IsSameSlotNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotNbPower.CallSlotNbPowerNode; +import com.oracle.graal.python.nodes.classes.IsSubtypeNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; + +@GenerateInline +@GenerateCached(value = false) +@GenerateUncached +public abstract class CallTernaryOpNode extends Node { + public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object v, Object classV, TpSlot slotV, Object w, Object classW, TpSlot slotW, Object z); + + @Specialization + static Object doGeneric(VirtualFrame frame, Node inliningTarget, Object v, Object classV, TpSlot slotV, Object w, Object classW, TpSlot slotWIn, Object z, + @Cached IsSameTypeNode isSameTypeNode, + @Cached IsSameSlotNode isSameSlotNode, + @Cached InlinedConditionProfile isSameTypeProfile, + @Cached InlinedConditionProfile isSameSlotProfile, + @Cached(inline = false) IsSubtypeNode isSubtypeNode, + @Cached InlinedBranchProfile wResultBranch, + @Cached InlinedBranchProfile vResultBranch, + @Cached InlinedBranchProfile wResult2Branch, + @Cached InlinedBranchProfile notImplementedBranch, + @Cached CallSlotNbPowerNode callSlotWNode, + @Cached CallSlotNbPowerNode callSlotVNode, + @Cached CallSlotNbPowerNode callSlotZNode, + @Cached GetClassNode getZClass, + @Cached GetCachedTpSlotsNode getZSlots) { + TpSlot slotW = null; + boolean sameTypes = isSameTypeProfile.profile(inliningTarget, isSameTypeNode.execute(inliningTarget, classW, classV)); + if (!sameTypes) { + slotW = slotWIn; + if (isSameSlotProfile.profile(inliningTarget, slotV != null && slotW != null && isSameSlotNode.execute(inliningTarget, slotW, slotV))) { + slotW = null; + } + } + + if (slotV != null) { + if (slotW != null && isSubtypeNode.execute(classW, classV)) { + assert !sameTypes; + Object result = callSlotWNode.execute(frame, inliningTarget, slotW, v, classV, w, slotW, classW, z, false); + if (result != PNotImplemented.NOT_IMPLEMENTED) { + wResultBranch.enter(inliningTarget); + return result; + } + slotW = null; + } + Object result = callSlotVNode.execute(frame, inliningTarget, slotV, v, classV, w, slotWIn, classW, z, sameTypes); + if (result != PNotImplemented.NOT_IMPLEMENTED) { + vResultBranch.enter(inliningTarget); + return result; + } + } + + if (slotW != null) { + assert !sameTypes; + Object result = callSlotWNode.execute(frame, inliningTarget, slotW, v, classV, w, slotW, classW, z, false); + if (result != PNotImplemented.NOT_IMPLEMENTED) { + wResult2Branch.enter(inliningTarget); + return result; + } + } + + if (z != PNone.NONE) { + Object classZ = getZClass.execute(inliningTarget, z); + TpSlot slotZ = getZSlots.execute(inliningTarget, classZ).nb_power(); + if (slotZ != null) { + if ((slotV == null || !isSameSlotNode.execute(inliningTarget, slotZ, slotV)) && (slotW == null || !isSameSlotNode.execute(inliningTarget, slotZ, slotW))) { + return callSlotZNode.execute(frame, inliningTarget, slotZ, v, classV, w, slotWIn, classW, z, false); + } + } + } + + notImplementedBranch.enter(inliningTarget); + return PNotImplemented.NOT_IMPLEMENTED; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CanBeDoubleNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CanBeDoubleNode.java index 4845c6e946..6a6d4b9deb 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CanBeDoubleNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/CanBeDoubleNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,32 +41,26 @@ package com.oracle.graal.python.lib; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.util.LazyInteropLibrary; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; /** - * Checks whether a value can be converted to {@code double} using {@link PyFloatAsDoubleNode} o + * Checks whether a value can be converted to {@code double} using {@link PyFloatAsDoubleNode} or * {@link PyNumberFloatNode}. There is no direct CPython function equivalent, as CPython typically * checks for the {@code nb_float} and {@code nb_index} slots directly. */ @GenerateUncached @GenerateInline @GenerateCached(false) -@ImportStatic(SpecialMethodSlot.class) public abstract class CanBeDoubleNode extends PNodeWithContext { public static boolean executeUncached(Object receiver) { return CanBeDoubleNodeGen.getUncached().execute(null, receiver); @@ -106,15 +100,8 @@ static boolean doPBCT(@SuppressWarnings("unused") PythonBuiltinClassType object) @Fallback static boolean doGeneric(Node inliningTarget, Object object, - @Cached LazyInteropLibrary lazyInteropLibrary, - @Cached(parameters = "Float", inline = false) LookupCallableSlotInMRONode lookupFloat, - @Cached(parameters = "Index", inline = false) LookupCallableSlotInMRONode lookupIndex, - @Cached GetClassNode getClassNode) { - Object type = getClassNode.execute(inliningTarget, object); - if (type == PythonBuiltinClassType.ForeignObject) { - InteropLibrary interopLibrary = lazyInteropLibrary.get(inliningTarget); - return interopLibrary.fitsInDouble(object) || interopLibrary.fitsInLong(object) || interopLibrary.isBoolean(object); - } - return lookupFloat.execute(type) != PNone.NO_VALUE || lookupIndex.execute(type) != PNone.NO_VALUE; + @Cached GetObjectSlotsNode getSlots) { + TpSlots slots = getSlots.execute(inliningTarget, object); + return slots.nb_float() != null || slots.nb_index() != null; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/GetMethodsFlagsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/GetMethodsFlagsNode.java deleted file mode 100644 index 488fc884c9..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/GetMethodsFlagsNode.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.lib; - -import static com.oracle.graal.python.nodes.HiddenAttr.METHODS_FLAGS; - -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; -import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PCallCapiFunction; -import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol; -import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; -import com.oracle.graal.python.nodes.HiddenAttr; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.truffle.api.Assumption; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Fallback; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.nodes.Node; - -/** - * Retrieve slots occupation of `cls->tp_as_number`, `cls->tp_as_sequence` and `cls->tp_as_mapping` - * for a given class. - */ -@GenerateUncached -@GenerateInline(inlineByDefault = true) -public abstract class GetMethodsFlagsNode extends Node { - - public abstract long execute(Node inliningTarget, Object cls); - - @Specialization - protected static long pythonbuiltinclasstype(PythonManagedClass cls) { - return cls.getMethodsFlags(); - } - - @Specialization - protected static long pythonclasstype(PythonBuiltinClassType cls) { - return cls.getMethodsFlags(); - } - - @TruffleBoundary - private static long populateMethodsFlags(PythonAbstractNativeObject cls) { - Long flags = (Long) PCallCapiFunction.callUncached(NativeCAPISymbol.FUN_GET_METHODS_FLAGS, cls.getPtr()); - HiddenAttr.WriteNode.executeUncached(cls, METHODS_FLAGS, flags); - return flags; - } - - protected static long getMethodsFlags(PythonAbstractNativeObject cls) { - return doNative(null, cls, HiddenAttr.ReadNode.getUncached()); - } - - // The assumption should hold unless `PyType_Modified` is called. - protected static Assumption nativeAssumption(PythonAbstractNativeObject cls) { - return PythonContext.get(null).getNativeClassStableAssumption(cls, true).getAssumption(); - } - - @Specialization(guards = "cachedCls == cls", limit = "5", assumptions = "nativeAssumption(cachedCls)") - static long doNativeCached(@SuppressWarnings("unused") PythonAbstractNativeObject cls, - @SuppressWarnings("unused") @Cached("cls") PythonAbstractNativeObject cachedCls, - @Cached("getMethodsFlags(cls)") long flags) { - return flags; - } - - @Specialization(replaces = "doNativeCached") - static long doNative(Node inliningTarget, PythonAbstractNativeObject cls, - @Cached HiddenAttr.ReadNode readFlagsNode) { - // classes must have tp_dict since they are set during PyType_Ready - Long flags = (Long) readFlagsNode.execute(inliningTarget, cls, METHODS_FLAGS, null); - if (flags == null) { - return populateMethodsFlags(cls); - } - return flags; - } - - @Fallback - protected static long zero(@SuppressWarnings("unused") Object cls) { - return 0; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/GetNextNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/GetNextNode.java deleted file mode 100644 index e36648c901..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/GetNextNode.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.lib; - -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NEXT__; - -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PGuards; -import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode.NoAttributeHandler; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.frame.Frame; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.UnexpectedResultException; - -public abstract class GetNextNode extends PNodeWithContext { - public abstract Object execute(Frame frame, Object iterator); - - public Object execute(Object iterator) { - return execute(null, iterator); - } - - public abstract boolean executeBoolean(VirtualFrame frame, Object iterator) throws UnexpectedResultException; - - public abstract int executeInt(VirtualFrame frame, Object iterator) throws UnexpectedResultException; - - public abstract long executeLong(VirtualFrame frame, Object iterator) throws UnexpectedResultException; - - public abstract double executeDouble(VirtualFrame frame, Object iterator) throws UnexpectedResultException; - - private static final class GetNextCached extends GetNextNode { - - @Child private LookupAndCallUnaryNode nextCall = LookupAndCallUnaryNode.create(SpecialMethodSlot.Next, () -> new NoAttributeHandler() { - @Child private PRaiseNode raiseNode = PRaiseNode.create(); - - @Override - public Object execute(Object receiver) { - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.OBJ_NOT_ITERABLE, receiver); - } - }); - - @Override - public Object execute(Frame frame, Object iterator) { - return nextCall.executeObject((VirtualFrame) frame, iterator); - } - - @Override - public boolean executeBoolean(VirtualFrame frame, Object iterator) throws UnexpectedResultException { - return PGuards.expectBoolean(nextCall.executeObject(frame, iterator)); - } - - @Override - public int executeInt(VirtualFrame frame, Object iterator) throws UnexpectedResultException { - return PGuards.expectInteger(nextCall.executeObject(frame, iterator)); - } - - @Override - public long executeLong(VirtualFrame frame, Object iterator) throws UnexpectedResultException { - return PGuards.expectLong(nextCall.executeObject(frame, iterator)); - } - - @Override - public double executeDouble(VirtualFrame frame, Object iterator) throws UnexpectedResultException { - return PGuards.expectDouble(nextCall.executeObject(frame, iterator)); - } - } - - private static final class GetNextUncached extends GetNextNode { - static final GetNextUncached INSTANCE = new GetNextUncached(); - - @Override - public Object execute(Frame frame, Object iterator) { - return executeImpl(iterator); - } - - @SuppressWarnings("static-method") - @TruffleBoundary - private Object executeImpl(Object iterator) { - Object nextMethod = LookupSpecialMethodSlotNode.getUncached(SpecialMethodSlot.Next).execute(null, GetClassNode.executeUncached(iterator), iterator); - if (nextMethod == PNone.NO_VALUE) { - throw PRaiseNode.getUncached().raise(PythonErrorType.AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, iterator, T___NEXT__); - } - return CallUnaryMethodNode.getUncached().executeObject(nextMethod, iterator); - } - - @Override - public boolean executeBoolean(VirtualFrame frame, Object iterator) throws UnexpectedResultException { - Object value = execute(frame, iterator); - if (value instanceof Boolean) { - return (boolean) value; - } - throw new UnexpectedResultException(value); - } - - @Override - public int executeInt(VirtualFrame frame, Object iterator) throws UnexpectedResultException { - Object value = execute(frame, iterator); - if (value instanceof Integer) { - return (int) value; - } - throw new UnexpectedResultException(value); - } - - @Override - public long executeLong(VirtualFrame frame, Object iterator) throws UnexpectedResultException { - Object value = execute(frame, iterator); - if (value instanceof Long) { - return (long) value; - } - throw new UnexpectedResultException(value); - } - - @Override - public double executeDouble(VirtualFrame frame, Object iterator) throws UnexpectedResultException { - Object value = execute(frame, iterator); - if (value instanceof Double) { - return (double) value; - } - throw new UnexpectedResultException(value); - } - } - - @NeverDefault - public static GetNextNode create() { - return new GetNextCached(); - } - - public static GetNextNode getUncached() { - return GetNextUncached.INSTANCE; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/IteratorExhausted.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/IteratorExhausted.java new file mode 100644 index 0000000000..a9b775d7d3 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/IteratorExhausted.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.runtime.exception.PythonControlFlowException; + +public class IteratorExhausted extends PythonControlFlowException { + public static final IteratorExhausted INSTANCE = new IteratorExhausted(); + + private IteratorExhausted() { + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyAIterCheckNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyAIterCheckNode.java new file mode 100644 index 0000000000..ffbe391281 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyAIterCheckNode.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.asyncio.PANextAwaitable; +import com.oracle.graal.python.builtins.objects.asyncio.PAsyncGen; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline +@GenerateUncached +@GenerateCached(false) +public abstract class PyAIterCheckNode extends Node { + public abstract boolean execute(Node inliningTarget, Object object); + + @Specialization + static boolean doIterator(@SuppressWarnings("unused") PAsyncGen object) { + return true; + } + + @Specialization + static boolean doAnextAwaitable(@SuppressWarnings("unused") PANextAwaitable object) { + return true; + } + + @Fallback + static boolean doGeneric(Node inliningTarget, Object object, + @Cached TpSlots.GetObjectSlotsNode getSlots) { + TpSlots slots = getSlots.execute(inliningTarget, object); + return slots.am_anext() != null; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyArgCheckPositionalNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyArgCheckPositionalNode.java index dbc3fec985..70fa3f5d5b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyArgCheckPositionalNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyArgCheckPositionalNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -66,16 +66,16 @@ public final boolean execute(Node inliningTarget, TruffleString name, Object[] a @Specialization static boolean doGeneric(Node inliningTarget, TruffleString name, int nargs, int min, int max, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { assert min >= 0; assert min <= max; if (nargs < min) { if (name != null) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, S_EXPECTED_SD_ARGS_GOT_D, + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, S_EXPECTED_SD_ARGS_GOT_D, name, (min == max ? "" : "at least "), min, min == 1 ? "" : "s", nargs); } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, UNPACKED_TUPLE_SHOULD_HAVE_D_ELEMS, + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, UNPACKED_TUPLE_SHOULD_HAVE_D_ELEMS, (min == max ? "" : "at least "), min, min == 1 ? "" : "s", nargs); } } @@ -86,10 +86,10 @@ static boolean doGeneric(Node inliningTarget, TruffleString name, int nargs, int if (nargs > max) { if (name != null) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, S_EXPECTED_SD_ARGS_GOT_D, + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, S_EXPECTED_SD_ARGS_GOT_D, name, (min == max ? "" : "at most "), max, max == 1 ? "" : "s", nargs); } else { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, UNPACKED_TUPLE_SHOULD_HAVE_D_ELEMS, + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, UNPACKED_TUPLE_SHOULD_HAVE_D_ELEMS, (min == max ? "" : "at most "), max, max == 1 ? "" : "s", nargs); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyCallableCheckNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyCallableCheckNode.java index e224572654..0673c361f7 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyCallableCheckNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyCallableCheckNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,26 +41,20 @@ package com.oracle.graal.python.lib; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; import com.oracle.graal.python.builtins.objects.function.PFunction; import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; import com.oracle.graal.python.builtins.objects.method.PMethod; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; import com.oracle.graal.python.builtins.objects.type.PythonClass; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.util.LazyInteropLibrary; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.nodes.Node; /** @@ -69,7 +63,6 @@ @GenerateUncached @GenerateInline(inlineByDefault = true) @GenerateCached -@ImportStatic(SpecialMethodSlot.class) public abstract class PyCallableCheckNode extends PNodeWithContext { public static boolean executeUncached(Object object) { return PyCallableCheckNodeGen.getUncached().execute(null, object); @@ -121,15 +114,8 @@ static boolean doType(@SuppressWarnings("unused") PythonBuiltinClassType o) { @Fallback static boolean doObject(Node inliningTarget, Object o, - @Cached GetClassNode getClassNode, - @Cached LazyInteropLibrary lazyInteropLib, - @Cached(parameters = "Call", inline = false) LookupCallableSlotInMRONode lookupCall) { - Object type = getClassNode.execute(inliningTarget, o); - if (type == PythonBuiltinClassType.ForeignObject) { - InteropLibrary lib = lazyInteropLib.get(inliningTarget); - return lib.isExecutable(o) || lib.isInstantiable(o); - } - return lookupCall.execute(type) != PNone.NO_VALUE; + @Cached GetObjectSlotsNode getSlots) { + return getSlots.execute(inliningTarget, o).tp_call() != null; } public static PyCallableCheckNode create() { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyContextCopyCurrent.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyContextCopyCurrent.java index cf62d0f058..0159df5e47 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyContextCopyCurrent.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyContextCopyCurrent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,8 +44,7 @@ import com.oracle.graal.python.builtins.objects.contextvars.PContextVarsContext; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.dsl.Cached; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.Specialization; @@ -60,10 +59,10 @@ public abstract class PyContextCopyCurrent extends PNodeWithContext { public abstract PContextVarsContext execute(Node inliningTarget); @Specialization - static PContextVarsContext doIt(Node inliningTarget, - @Cached(inline = false) PythonObjectFactory factory) { - PythonLanguage language = PythonLanguage.get(inliningTarget); - PythonContext.PythonThreadState threadState = PythonContext.get(inliningTarget).getThreadState(language); - return factory.copyContextVarsContext(threadState.getContextVarsContext()); + static PContextVarsContext doIt(Node inliningTarget) { + PythonContext context = PythonContext.get(inliningTarget); + PythonLanguage language = context.getLanguage(inliningTarget); + PythonContext.PythonThreadState threadState = context.getThreadState(language); + return PFactory.copyContextVarsContext(language, threadState.getContextVarsContext()); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyConvertOptionalToSizeNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyConvertOptionalToSizeNode.java index 5fc303b88c..fab20906aa 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyConvertOptionalToSizeNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyConvertOptionalToSizeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -69,14 +69,14 @@ int doOptional(@SuppressWarnings("unused") PNone value, int defaultValue) { @Specialization(guards = {"!isNone(value)", "!isNoValue(value)"}) static int doObject(VirtualFrame frame, Node inliningTarget, Object value, @SuppressWarnings("unused") int defaultValue, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached PyIndexCheckNode indexCheckNode, @Cached PyNumberAsSizeNode asSizeNode) { int limit; if (indexCheckNode.execute(inliningTarget, value)) { limit = asSizeNode.executeExact(frame, inliningTarget, value); } else { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.ARG_SHOULD_BE_INT_OR_NONE, value); + throw raiseNode.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.ARG_SHOULD_BE_INT_OR_NONE, value); } return limit; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyDictCheckNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyDictCheckNode.java index 64b69d9746..644924d33e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyDictCheckNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyDictCheckNode.java @@ -40,7 +40,10 @@ */ package com.oracle.graal.python.lib; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.dict.PDict; +import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; @@ -62,7 +65,8 @@ static boolean managed(@SuppressWarnings("unused") PDict object) { // We don't support native dicts atm @Fallback - static boolean other(@SuppressWarnings("unused") Object object) { - return false; + static boolean other(Object object, + @Cached(inline = false) IsBuiltinObjectProfile isDictNode) { + return isDictNode.profileObjectCached(object, PythonBuiltinClassType.PDict); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyDictDelItem.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyDictDelItem.java index 07f9607196..db133c06ef 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyDictDelItem.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyDictDelItem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,10 +40,11 @@ */ package com.oracle.graal.python.lib; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageDelItem; import com.oracle.graal.python.builtins.objects.dict.PDict; +import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; @@ -51,7 +52,6 @@ import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.strings.TruffleString; /** * Equivalent to use for PyDict_DelItem and PyDict_DelItemString functions available in CPython. @@ -62,33 +62,15 @@ @GenerateInline @GenerateCached(false) public abstract class PyDictDelItem extends Node { - // Note: for now this simply delegates to HashingStorageDelItem, but in the future, this should, - // unlike HashingStorageDelItem, also handle native subclasses of dict - - public final void execute(Node inliningTarget, PDict dict, TruffleString key) { - execute(null, inliningTarget, dict, key); - } - - public abstract void execute(Frame frame, Node inliningTarget, PDict dict, TruffleString key); public abstract void execute(Frame frame, Node inliningTarget, PDict dict, Object key); - // We never need a frame for reading string keys @Specialization - static void delItemWithStringKey(Node inliningTarget, @SuppressWarnings("unused") PDict dict, TruffleString key, - @Shared("delStorageItem") @Cached HashingStorageDelItem delItem) { - delItem.execute(inliningTarget, dict.getDictStorage(), key, dict); - } - - @Specialization(replaces = "delItemWithStringKey") - static void delItemCached(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") PDict dict, Object key, - @Shared("delStorageItem") @Cached HashingStorageDelItem delItem) { - delItem.execute(frame, inliningTarget, dict.getDictStorage(), key, dict); - } - - @Specialization(replaces = "delItemCached") - static void delItem(Node inliningTarget, PDict dict, Object key, - @Shared("delStorageItem") @Cached HashingStorageDelItem delItem) { - delItem.execute(null, inliningTarget, dict.getDictStorage(), key, dict); + static void delItem(VirtualFrame frame, Node inliningTarget, PDict dict, Object key, + @Cached HashingStorageDelItem delItem, + @Cached PRaiseNode raiseNode) { + if (!delItem.execute(frame, inliningTarget, dict.getDictStorage(), key, dict)) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.KeyError, new Object[]{key}); + } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyDictKeys.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyDictKeys.java index f928bdc036..ea0ede1ae7 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyDictKeys.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyDictKeys.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,6 +40,7 @@ */ package com.oracle.graal.python.lib; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.common.HashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetIterator; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIterator; @@ -47,7 +48,8 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIteratorNext; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageLen; import com.oracle.graal.python.builtins.objects.dict.PDict; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; @@ -67,7 +69,7 @@ public abstract class PyDictKeys extends Node { @Specialization static Object getString(Node inliningTarget, PDict dict, - @Cached(inline = false) PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached HashingStorageLen lenNode, @Cached HashingStorageGetIterator getIter, @Cached HashingStorageIteratorNext iterNext, @@ -80,6 +82,6 @@ static Object getString(Node inliningTarget, PDict dict, while (iterNext.execute(inliningTarget, storage, it)) { keys[i++] = iterKey.execute(inliningTarget, storage, it); } - return factory.createList(keys); + return PFactory.createList(language, keys); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyDictSetDefault.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyDictSetDefault.java index 6948644a43..fde58665f5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyDictSetDefault.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyDictSetDefault.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,7 +43,7 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetItemWithHash; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItemWithHash; -import com.oracle.graal.python.builtins.objects.dict.PDict; +import com.oracle.graal.python.builtins.objects.dict.DictNodes; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Cached; @@ -68,18 +68,21 @@ public static Object executeUncached(Object dict, Object key, Object defaultValu } @Specialization - public static Object doIt(VirtualFrame frame, Node inliningTarget, PDict dict, Object key, Object defaultValue, + public static Object doIt(VirtualFrame frame, Node inliningTarget, Object dict, Object key, Object defaultValue, + @Cached DictNodes.GetDictStorageNode getStorageNode, + @Cached DictNodes.UpdateDictStorageNode updateStorageNode, @Cached PyObjectHashNode hashNode, @Cached HashingStorageGetItemWithHash getItem, @Cached HashingStorageSetItemWithHash setItem, @Cached InlinedConditionProfile hasValue) { + var storage = getStorageNode.execute(inliningTarget, dict); long keyHash = hashNode.execute(frame, inliningTarget, key); - Object value = getItem.execute(frame, inliningTarget, dict.getDictStorage(), key, keyHash); + Object value = getItem.execute(frame, inliningTarget, storage, key, keyHash); if (hasValue.profile(inliningTarget, value != null)) { return value; } - HashingStorage newStorage = setItem.execute(frame, inliningTarget, dict.getDictStorage(), key, keyHash, defaultValue); - dict.setDictStorage(newStorage); + HashingStorage newStorage = setItem.execute(frame, inliningTarget, storage, key, keyHash, defaultValue); + updateStorageNode.execute(inliningTarget, dict, storage, newStorage); return defaultValue; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyFloatAsDoubleNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyFloatAsDoubleNode.java index 44bf033f36..b39af80a79 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyFloatAsDoubleNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyFloatAsDoubleNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,28 +47,28 @@ import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins; -import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.FromNativeSubclassNode; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; import com.oracle.graal.python.builtins.objects.floats.PFloat; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotUnaryFunc.CallSlotUnaryNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassExactProfile; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.util.CastToJavaDoubleNode; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; +import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; @@ -82,7 +82,6 @@ @GenerateUncached @GenerateInline @GenerateCached(false) -@ImportStatic(SpecialMethodSlot.class) public abstract class PyFloatAsDoubleNode extends PNodeWithContext { public static double executeUncached(Object object) { @@ -118,52 +117,72 @@ static double doBoolean(boolean object) { @Specialization(guards = "isFloatSubtype(inliningTarget, object, getClassNode, isSubtype)", limit = "1") @InliningCutoff - static double doNative(Node inliningTarget, PythonAbstractNativeObject object, + static double doNative(@SuppressWarnings("unused") Node inliningTarget, PythonAbstractNativeObject object, @SuppressWarnings("unused") @Exclusive @Cached GetClassNode getClassNode, @SuppressWarnings("unused") @Exclusive @Cached(inline = false) IsSubtypeNode isSubtype, @Cached(inline = false) CStructAccess.ReadDoubleNode read) { return read.readFromObj(object, PyFloatObject__ob_fval); } - @Specialization(guards = {"!isDouble(object)", "!isInteger(object)", "!isBoolean(object)", "!isPFloat(object)", - "!isFloatSubtype(inliningTarget, object, getClassNode, isSubtype)"}, limit = "1") + @Fallback @InliningCutoff static double doObject(VirtualFrame frame, Node inliningTarget, Object object, @Exclusive @Cached GetClassNode getClassNode, - @SuppressWarnings("unused") @Exclusive @Cached(inline = false) IsSubtypeNode isSubtype, - @Cached(parameters = "Float", inline = false) LookupSpecialMethodSlotNode lookup, - @Cached(inline = false) CallUnaryMethodNode call, - @Exclusive @Cached GetClassNode resultClassNode, - @Exclusive @Cached IsBuiltinClassExactProfile resultProfile, - @Exclusive @Cached(inline = false) IsSubtypeNode resultSubtypeNode, - @Cached PyIndexCheckNode indexCheckNode, + @Cached GetCachedTpSlotsNode getSlots, + @Cached CallSlotUnaryNode callFloat, @Cached PyNumberIndexNode indexNode, - @Cached CastToJavaDoubleNode cast, - @Cached(inline = false) WarningsModuleBuiltins.WarnNode warnNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PyLongAsDoubleNode asDoubleNode, + @Cached HandleFloatResultNode handleFloatResultNode, + @Cached PRaiseNode raiseNode) { Object type = getClassNode.execute(inliningTarget, object); - Object floatDescr = lookup.execute(frame, type, object); - if (floatDescr != PNone.NO_VALUE) { - Object result = call.executeObject(frame, floatDescr, object); + TpSlots slots = getSlots.execute(inliningTarget, type); + if (slots.nb_float() != null) { + Object result = callFloat.execute(frame, inliningTarget, slots.nb_float(), object); + if (result instanceof Double doubleResult) { + return doubleResult; + } + return handleFloatResult(frame, result, object, handleFloatResultNode); + } + if (slots.nb_index() != null) { + Object index = indexNode.execute(frame, inliningTarget, object); + return asDoubleNode.execute(inliningTarget, index); + } + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MUST_BE_REAL_NUMBER, object); + } + + @InliningCutoff + static double handleFloatResult(VirtualFrame frame, Object result, Object object, HandleFloatResultNode handleFloatResultNode) { + return handleFloatResultNode.execute(frame, result, object); + } + + static boolean isFloatSubtype(Node inliningTarget, Object object, GetClassNode getClass, IsSubtypeNode isSubtype) { + return FromNativeSubclassNode.isFloatSubtype(inliningTarget, object, getClass, isSubtype); + } + + @GenerateInline(false) // Uncommon + @GenerateUncached + abstract static class HandleFloatResultNode extends Node { + public abstract double execute(VirtualFrame frame, Object result, Object original); + + @Specialization + static double handle(VirtualFrame frame, Object result, Object original, + @Bind("this") Node inliningTarget, + @Cached GetClassNode resultClassNode, + @Cached IsBuiltinClassExactProfile resultProfile, + @Cached IsSubtypeNode resultSubtypeNode, + @Cached CastToJavaDoubleNode cast, + @Cached WarningsModuleBuiltins.WarnNode warnNode, + @Cached PRaiseNode raiseNode) { Object resultType = resultClassNode.execute(inliningTarget, result); if (!resultProfile.profileClass(inliningTarget, resultType, PythonBuiltinClassType.PFloat)) { if (!resultSubtypeNode.execute(resultType, PythonBuiltinClassType.PFloat)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.RETURNED_NON_FLOAT, object, result); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.RETURNED_NON_FLOAT, original, result); } else { warnNode.warnFormat(frame, null, DeprecationWarning, 1, - ErrorMessages.WARN_P_RETURNED_NON_P, object, T___FLOAT__, "float", result, "float"); + ErrorMessages.WARN_P_RETURNED_NON_P, original, T___FLOAT__, "float", result, "float"); } } return cast.execute(inliningTarget, result); } - if (indexCheckNode.execute(inliningTarget, object)) { - Object index = indexNode.execute(frame, inliningTarget, object); - return cast.execute(inliningTarget, index); - } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MUST_BE_REAL_NUMBER, object); - } - - static boolean isFloatSubtype(Node inliningTarget, Object object, GetClassNode getClass, IsSubtypeNode isSubtype) { - return FromNativeSubclassNode.isFloatSubtype(null, inliningTarget, object, getClass, isSubtype); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyFloatFromString.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyFloatFromString.java index 6d9902091a..3d4c9b99ac 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyFloatFromString.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyFloatFromString.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -82,18 +82,18 @@ public abstract class PyFloatFromString extends PNodeWithContext { static double doString(VirtualFrame frame, Node inliningTarget, TruffleString object, @Cached(inline = false) TruffleString.ToJavaStringNode toJavaStringNode, @Shared @Cached PyObjectReprAsTruffleStringNode reprNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { return convertStringToDouble(frame, inliningTarget, toJavaStringNode.execute(object), object, reprNode, raiseNode); } - @Specialization(limit = "3") + @Specialization static double doGeneric(VirtualFrame frame, Node inliningTarget, Object object, @Cached(value = "createFor(this)") IndirectCallData indirectCallData, - @CachedLibrary("object") PythonBufferAcquireLibrary acquireLib, + @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib, @CachedLibrary(limit = "3") PythonBufferAccessLibrary accessLib, @Cached(inline = false) CastToJavaStringNode cast, @Shared @Cached PyObjectReprAsTruffleStringNode reprNode, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { String string = null; try { string = cast.execute(object); @@ -117,7 +117,7 @@ static double doGeneric(VirtualFrame frame, Node inliningTarget, Object object, if (string != null) { return convertStringToDouble(frame, inliningTarget, string, object, reprNode, raiseNode); } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.ARG_MUST_BE_STRING_OR_NUMBER, "float()", object); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ARG_MUST_BE_STRING_OR_NUMBER, "float()", object); } @TruffleBoundary(allowInlining = true) @@ -125,7 +125,7 @@ private static String newString(byte[] bytes, int offset, int length) { return new String(bytes, offset, length); } - private static double convertStringToDouble(VirtualFrame frame, Node inliningTarget, String src, Object origObj, PyObjectReprAsTruffleStringNode reprNode, PRaiseNode.Lazy raiseNode) { + private static double convertStringToDouble(VirtualFrame frame, Node inliningTarget, String src, Object origObj, PyObjectReprAsTruffleStringNode reprNode, PRaiseNode raiseNode) { String str = FloatUtils.removeUnicodeAndUnderscores(src); // Adapted from CPython's float_from_string_inner if (str != null) { @@ -144,9 +144,9 @@ private static double convertStringToDouble(VirtualFrame frame, Node inliningTar repr = reprNode.execute(frame, inliningTarget, origObj); } catch (PException e) { // Failed to format the message. Mirrors CPython behavior when the repr fails - throw raiseNode.get(inliningTarget).raise(ValueError); + throw raiseNode.raise(inliningTarget, ValueError); } - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.COULD_NOT_CONVERT_STRING_TO_FLOAT, repr); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.COULD_NOT_CONVERT_STRING_TO_FLOAT, repr); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyImportGetModule.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyImportGetModule.java index 309647e411..76e4cfc828 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyImportGetModule.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyImportGetModule.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -70,10 +70,10 @@ static Object doGeneric(VirtualFrame frame, Node node, Object name, @Bind("this") Node inliningTarget, @Cached InlinedConditionProfile noSysModulesProfile, @Cached(inline = false) DictBuiltins.GetItemNode getDictItemNode, - @Cached PRaiseNode.Lazy raise) { + @Cached PRaiseNode raise) { final PDict sysModules = PythonContext.get(node).getSysModules(); if (noSysModulesProfile.profile(inliningTarget, sysModules == null)) { - throw raise.get(inliningTarget).raise(PythonBuiltinClassType.RuntimeError, UNABLE_TO_GET_S, "sys.modules"); + throw raise.raise(inliningTarget, PythonBuiltinClassType.RuntimeError, UNABLE_TO_GET_S, "sys.modules"); } return getDictItemNode.execute(frame, sysModules, name); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyImportImport.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyImportImport.java index 3db032bdf8..7c056c7d2c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyImportImport.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyImportImport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,13 +47,15 @@ import static com.oracle.graal.python.nodes.BuiltinNames.T___IMPORT__; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.object.GetDictFromGlobalsNode; import com.oracle.graal.python.nodes.statement.AbstractImportNode; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; @@ -86,7 +88,7 @@ static Object doGeneric(VirtualFrame frame, Node inliningTarget, TruffleString m @Cached(inline = false) AbstractImportNode.PyImportImportModuleLevelObject importModuleLevelObject, @Cached PyEvalGetGlobals getGlobals, @Cached(inline = false) GetDictFromGlobalsNode getDictFromGlobals, - @Cached(inline = false) PythonObjectFactory factory) { + @Bind PythonLanguage language) { // Get the builtins from current globals Object globals = getGlobals.execute(frame, inliningTarget); Object builtins; @@ -95,7 +97,7 @@ static Object doGeneric(VirtualFrame frame, Node inliningTarget, TruffleString m } else { // No globals -- use standard builtins, and fake globals builtins = importModuleLevelObject.execute(frame, PythonContext.get(inliningTarget), T_BUILTINS, null, null, 0); - globals = factory.createDict(new PKeyword[]{new PKeyword(T___BUILTINS__, builtins)}); + globals = PFactory.createDict(language, new PKeyword[]{new PKeyword(T___BUILTINS__, builtins)}); } // Get the __import__ function from the builtins @@ -110,7 +112,7 @@ static Object doGeneric(VirtualFrame frame, Node inliningTarget, TruffleString m // here. Calling for side-effect of import. callNode.execute(frame, importFunc, new Object[]{moduleName}, new PKeyword[]{ new PKeyword(T_GLOBALS, globals), new PKeyword(T_LOCALS, globals), - new PKeyword(T_FROMLIST, factory.createList()), new PKeyword(T_LEVEL, 0) + new PKeyword(T_FROMLIST, PFactory.createList(language)), new PKeyword(T_LEVEL, 0) }); return importGetModule.execute(frame, inliningTarget, moduleName); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyIndexCheckNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyIndexCheckNode.java index f6759b3229..cf5ccb7dbf 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyIndexCheckNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyIndexCheckNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,21 +41,15 @@ package com.oracle.graal.python.lib; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.util.LazyInteropLibrary; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @@ -63,7 +57,6 @@ * Check if the object supports conversion to index (integer). Equivalent of CPython's * {@code PyIndex_Check}. The return value doesn't need to be profiled in most cases. */ -@ImportStatic(SpecialMethodSlot.class) @GenerateUncached @GenerateInline @GenerateCached(false) @@ -113,15 +106,7 @@ static boolean doPBCT(@SuppressWarnings("unused") PythonBuiltinClassType object) @InliningCutoff @Fallback static boolean doGeneric(Node inliningTarget, Object object, - @Cached LazyInteropLibrary lazyInteropLibrary, - @Cached GetClassNode getClassNode, - @Cached(parameters = "Index", inline = false) LookupCallableSlotInMRONode lookupIndex) { - Object type = getClassNode.execute(inliningTarget, object); - if (type == PythonBuiltinClassType.ForeignObject) { - InteropLibrary interop = lazyInteropLibrary.get(inliningTarget); - return interop.fitsInLong(object) || - interop.isBoolean(object); - } - return lookupIndex.execute(type) != PNone.NO_VALUE; + @Cached GetObjectSlotsNode getSlots) { + return getSlots.execute(inliningTarget, object).nb_index() != null; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyIterCheckNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyIterCheckNode.java index d681dc26b6..a985574977 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyIterCheckNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyIterCheckNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,30 +40,22 @@ */ package com.oracle.graal.python.lib; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.PythonAbstractObject; import com.oracle.graal.python.builtins.objects.iterator.PBuiltinIterator; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; -import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; +import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.interop.InteropLibrary; -import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; /** * Check if the object is iterable - has {@code __next__} method. Equivalent of CPython's * {@code PyIter_Check}. */ -@ImportStatic(SpecialMethodSlot.class) @GenerateInline(inlineByDefault = true) @GenerateUncached public abstract class PyIterCheckNode extends PNodeWithContext { @@ -83,48 +75,14 @@ static boolean doIterator(@SuppressWarnings("unused") PBuiltinIterator object) { } @InliningCutoff - @Specialization - static boolean doPythonObject(Node inliningTarget, PythonAbstractObject object, - @Shared @Cached GetClassNode getClassNode, - @Shared @Cached(parameters = "Next", inline = false) LookupCallableSlotInMRONode lookupNext) { - return !(lookupNext.execute(getClassNode.execute(inliningTarget, object)) instanceof PNone); - } - - @Specialization - static boolean doInt(@SuppressWarnings("unused") Integer object) { - return false; - } - - @Specialization - static boolean doLong(@SuppressWarnings("unused") Long object) { - return false; - } - - @Specialization - static boolean doBoolean(@SuppressWarnings("unused") Boolean object) { - return false; - } - - @Specialization - static boolean doDouble(@SuppressWarnings("unused") Double object) { - return false; - } - - @Specialization - static boolean doPBCT(@SuppressWarnings("unused") PythonBuiltinClassType object) { - return false; + @Fallback + static boolean doGeneric(Node inliningTarget, Object object, + @Cached TpSlots.GetObjectSlotsNode getSlots) { + TpSlots slots = getSlots.execute(inliningTarget, object); + return checkSlots(slots); } - @InliningCutoff - @Specialization(replaces = "doPythonObject") - static boolean doGeneric(Node inliningTarget, Object object, - @CachedLibrary(limit = "3") InteropLibrary interopLibrary, - @Shared @Cached GetClassNode getClassNode, - @Shared @Cached(parameters = "Next", inline = false) LookupCallableSlotInMRONode lookupNext) { - Object type = getClassNode.execute(inliningTarget, object); - if (type == PythonBuiltinClassType.ForeignObject) { - return interopLibrary.isIterator(object); - } - return !(lookupNext.execute(type) instanceof PNone); + public static boolean checkSlots(TpSlots slots) { + return slots.tp_iternext() != null && slots.tp_iternext() != TpSlotIterNext.NEXT_NOT_IMPLEMENTED; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyIterNextNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyIterNextNode.java index 5861c329e1..f311dab578 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyIterNextNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyIterNextNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,78 +40,57 @@ */ package com.oracle.graal.python.lib; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.iterator.PBigRangeIterator; -import com.oracle.graal.python.builtins.objects.iterator.PIntRangeIterator; -import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.CallSlotTpIterNextNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; /** - * Obtains the next value of an iterator. When the iterator is exhausted it returns {@code null}. It - * never raises {@code StopIteration}. + * Obtains the next value of an iterator. It throws {@link IteratorExhausted} upon exhaustion. It + * never raises python {@code StopIteration}. */ @GenerateUncached -@GenerateInline(false) +@GenerateInline(inlineByDefault = true) public abstract class PyIterNextNode extends PNodeWithContext { - public abstract Object execute(Frame frame, Object iterator); + public abstract Object execute(Frame frame, Node inliningTarget, Object iterator); - @Specialization - Object doIntRange(PIntRangeIterator iterator) { - if (iterator.hasNextInt()) { - return iterator.nextInt(); - } - iterator.setExhausted(); - return null; + public final Object executeCached(VirtualFrame frame, Object iterator) { + return execute(frame, this, iterator); } - @Specialization - Object doBigIntRange(PBigRangeIterator iterator, - @Cached PythonObjectFactory factory) { - if (iterator.hasNextBigInt()) { - return factory.createInt(iterator.nextBigInt()); - } - iterator.setExhausted(); - return null; + public static Object executeUncached(Object iterator) { + return PyIterNextNodeGen.getUncached().execute(null, null, iterator); } - // TODO list, tuple, enumerate, dict keys, dict values, dict items, string, bytes - @Specialization - static Object doGeneric(VirtualFrame frame, Object iterator, - @Bind("this") Node inliningTarget, + static Object doGeneric(VirtualFrame frame, Node inliningTarget, Object iterator, @Cached GetClassNode getClassNode, - @Cached(parameters = "Next") LookupSpecialMethodSlotNode lookupNext, - @Cached CallUnaryMethodNode callNext, - @Cached IsBuiltinObjectProfile stopIterationProfile, - @Cached PRaiseNode.Lazy raiseNode) { - Object nextMethod = lookupNext.execute(frame, getClassNode.execute(inliningTarget, iterator), iterator); - if (nextMethod == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.OBJ_NOT_ITERABLE, iterator); - } + @Cached GetCachedTpSlotsNode getSlots, + @Cached CallSlotTpIterNextNode callNext, + @Cached IsBuiltinObjectProfile stopIterationProfile) { + TpSlots slots = getSlots.execute(inliningTarget, getClassNode.execute(inliningTarget, iterator)); + assert slots.tp_iternext() != null; try { - return callNext.executeObject(frame, nextMethod, iterator); + return callNext.execute(frame, inliningTarget, slots.tp_iternext(), iterator); } catch (PException e) { e.expectStopIteration(inliningTarget, stopIterationProfile); - return null; + throw TpIterNextBuiltin.iteratorExhausted(); } } + @NeverDefault public static PyIterNextNode create() { return PyIterNextNodeGen.create(); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyListCheckNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyListCheckNode.java index 102661d0bc..ab2546dbac 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyListCheckNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyListCheckNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,7 +41,6 @@ package com.oracle.graal.python.lib; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.truffle.api.dsl.Cached; @@ -61,14 +60,9 @@ static boolean managed(@SuppressWarnings("unused") PList object) { return true; } - @Specialization - static boolean doNative(PythonAbstractNativeObject object, - @Cached(inline = false) IsBuiltinObjectProfile check) { - return check.profileObjectCached(object, PythonBuiltinClassType.PList); - } - @Fallback - static boolean other(@SuppressWarnings("unused") Object object) { - return false; + static boolean other(Object object, + @Cached(inline = false) IsBuiltinObjectProfile isListNode) { + return isListNode.profileObjectCached(object, PythonBuiltinClassType.PList); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongAsDoubleNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongAsDoubleNode.java index 4f4efd8c6b..464655747d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongAsDoubleNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongAsDoubleNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -97,14 +97,13 @@ static double doPInt(Node inliningTarget, PInt self) { static double doNative(Node inliningTarget, @SuppressWarnings("unused") PythonAbstractNativeObject self, @SuppressWarnings("unused") @Cached PyLongCheckNode check) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, NotImplementedError, ErrorMessages.CASTING_A_NATIVE_INT_OBJECT_IS_NOT_IMPLEMENTED_YET); + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, ErrorMessages.CASTING_A_NATIVE_INT_OBJECT_IS_NOT_IMPLEMENTED_YET); } @Fallback @InliningCutoff @SuppressWarnings("unused") - static double fallback(Node inliningTarget, Object object, - @Cached(inline = false) PRaiseNode raiseNode) { - throw raiseNode.raise(TypeError, ErrorMessages.INTEGER_REQUIRED); + static double fallback(Node inliningTarget, Object object) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.INTEGER_REQUIRED); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongAsIntNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongAsIntNode.java index c230fe81ab..f4134e8506 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongAsIntNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongAsIntNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,7 +45,6 @@ import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.PRaiseNode.Lazy; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.util.OverflowException; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; @@ -81,7 +80,7 @@ static int doInt(int object) { @Specialization static int doObject(VirtualFrame frame, Node inliningTarget, Object object, @Cached PyLongAsLongAndOverflowNode pyLongAsLongAndOverflow, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { long result = pyLongAsLongAndOverflow.execute(frame, inliningTarget, object); int intResult = (int) result; @@ -95,7 +94,7 @@ static int doObject(VirtualFrame frame, Node inliningTarget, Object object, } @InliningCutoff - private static PException raiseOverflow(Node inliningTarget, Lazy raiseNode) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "Java int"); + private static PException raiseOverflow(Node inliningTarget, PRaiseNode raiseNode) { + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "Java int"); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongAsLongAndOverflowNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongAsLongAndOverflowNode.java index 2d1e75fd10..679553a0f8 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongAsLongAndOverflowNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongAsLongAndOverflowNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,7 +42,6 @@ import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr; import com.oracle.graal.python.builtins.objects.ints.PInt; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.util.OverflowException; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; @@ -51,7 +50,6 @@ import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; @@ -66,7 +64,6 @@ @GenerateUncached @GenerateInline(inlineByDefault = true) @GenerateCached(false) -@ImportStatic(SpecialMethodSlot.class) public abstract class PyLongAsLongAndOverflowNode extends PNodeWithContext { public abstract long execute(Frame frame, Node inliningTarget, Object object) throws OverflowException; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongAsLongNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongAsLongNode.java index 1656ee5464..0e08ac4a5f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongAsLongNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongAsLongNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -73,11 +73,11 @@ public final long executeCached(Frame frame, Object object) { @Specialization static long doObject(VirtualFrame frame, Node inliningTarget, Object object, @Cached PyLongAsLongAndOverflowNode pyLongAsLongAndOverflow, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { return pyLongAsLongAndOverflow.execute(frame, inliningTarget, object); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "Java long"); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "Java long"); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongCheckNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongCheckNode.java index f14ca46097..a63ff2b290 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongCheckNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongCheckNode.java @@ -46,6 +46,7 @@ import com.oracle.graal.python.nodes.SpecialMethodNames; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.nodes.object.IsForeignObjectNode; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; @@ -96,11 +97,12 @@ static boolean doPInt(@SuppressWarnings("unused") PInt object) { static boolean doGeneric(Node inliningTarget, Object object, @Cached GetClassNode getClassNode, @Cached(inline = false) IsSubtypeNode isSubtypeNode, + @Cached IsForeignObjectNode isForeignObjectNode, @CachedLibrary(limit = "3") InteropLibrary interopLibrary) { Object type = getClassNode.execute(inliningTarget, object); if (isSubtypeNode.execute(type, PythonBuiltinClassType.PInt)) { return true; - } else if (type == PythonBuiltinClassType.ForeignObject) { + } else if (isForeignObjectNode.execute(inliningTarget, object)) { return interopLibrary.fitsInLong(object); } return false; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongCopy.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongCopy.java new file mode 100644 index 0000000000..b894177240 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongCopy.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr; +import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.nodes.PGuards; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.graal.python.util.OverflowException; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.ImportStatic; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; + +/** + * Creates a new builtin int object from a given int, which might be a subclass. Equivalent of + * {@code _PyLong_Copy}. + */ +@GenerateInline +@GenerateCached(false) +@GenerateUncached +@ImportStatic(PGuards.class) +public abstract class PyLongCopy extends Node { + public abstract Object execute(Node inliningTarget, Object obj); + + @Specialization + static int doB(boolean obj) { + return obj ? 1 : 0; + } + + @Specialization + static int doI(int obj) { + return obj; + } + + @Specialization + static long doL(long obj) { + return obj; + } + + @Specialization(guards = "isBuiltinPInt(obj)") + static PInt doPInt(PInt obj) { + return obj; + } + + @Specialization(guards = "!isBuiltinPInt(obj)", rewriteOn = OverflowException.class) + static int doPIntOverridenNarrowInt(PInt obj) throws OverflowException { + return obj.intValueExact(); + } + + @Specialization(guards = "!isBuiltinPInt(obj)", replaces = "doPIntOverridenNarrowInt", rewriteOn = OverflowException.class) + static long doPIntOverridenNarrowLong(PInt obj) throws OverflowException { + return obj.longValueExact(); + } + + @Specialization(guards = "!isBuiltinPInt(obj)", replaces = "doPIntOverridenNarrowLong") + static PInt doPIntOverriden(PInt obj, + @Bind PythonLanguage language) { + return PFactory.createInt(language, obj.getValue()); + } + + @Specialization + static PythonNativeVoidPtr doL(PythonNativeVoidPtr obj) { + return obj; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongFromDoubleNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongFromDoubleNode.java index f633950d5c..9ee63ec787 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongFromDoubleNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongFromDoubleNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,11 +47,13 @@ import java.math.BigInteger; import java.math.MathContext; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.MathGuards; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; @@ -83,18 +85,18 @@ static long doLong(double value) { @Specialization(guards = {"!fitLong(value)", "isFinite(value)"}) static Object doFinite(double value, - @Cached(inline = false) PythonObjectFactory factory) { - return factory.createInt(toBigInteger(value)); + @Bind PythonLanguage language) { + return PFactory.createInt(language, toBigInteger(value)); } @Specialization(guards = "!isFinite(value)") - static Object doInfinite(double value, - @Cached(inline = false) PRaiseNode raiseNode) { + static Object doInfinite(Node inliningTarget, double value, + @Cached PRaiseNode raiseNode) { if (Double.isNaN(value)) { - throw raiseNode.raise(ValueError, ErrorMessages.CANNOT_CONVERT_FLOAT_NAN_TO_INTEGER); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.CANNOT_CONVERT_FLOAT_NAN_TO_INTEGER); } assert Double.isInfinite(value); - throw raiseNode.raise(OverflowError, ErrorMessages.CANNOT_CONVERT_FLOAT_INFINITY_TO_INTEGER); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.CANNOT_CONVERT_FLOAT_INFINITY_TO_INTEGER); } @TruffleBoundary diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongFromUnicodeObject.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongFromUnicodeObject.java new file mode 100644 index 0000000000..34f6d556eb --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongFromUnicodeObject.java @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import java.math.BigInteger; + +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.modules.SysModuleBuiltins; +import com.oracle.graal.python.builtins.objects.bytes.BytesNodes; +import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.builtins.objects.str.StringNodes; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; +import com.oracle.truffle.api.strings.TruffleString; + +/** + * Parse an integer from a string. + */ +@GenerateInline(inlineByDefault = true) +@GenerateUncached +public abstract class PyLongFromUnicodeObject extends Node { + public final Object execute(Node inliningTarget, Object string, int base) { + return execute(inliningTarget, string, base, null, 0); + } + + public abstract Object execute(Node inliningTarget, Object string, int base, byte[] originalBytes, int originalBytesLen); + + public final Object executeCached(Object string, int base) { + return execute(null, string, base); + } + + public static Object executeUncached(Object string, int base) { + return PyLongFromUnicodeObjectNodeGen.getUncached().execute(null, string, base); + } + + @Specialization + static Object doString(Node inliningTarget, Object stringObj, int base, byte[] originalBytes, int originalBytesLen, + @Cached CastToTruffleStringNode cast, + @Cached TruffleString.ParseLongNode parseLongNode, + @Cached InlinedConditionProfile intOrLongResult, + @Cached GenericIntParserNode genericParser) { + TruffleString string = cast.castKnownString(inliningTarget, stringObj); + /* + * For other bases, we would have to pre-process the possible 0? prefix. That applies even + * to decimal literals with base 0 as they have to reject leading zeros. + */ + if (base == 10) { + try { + long result = parseLongNode.execute(string, 10); + if (intOrLongResult.profile(inliningTarget, PInt.isIntRange(result))) { + return (int) result; + } + return result; + } catch (TruffleString.NumberFormatException e) { + // Fall through to the generic parser + } + } + return parseGeneric(string, base, originalBytes, originalBytesLen, genericParser); + } + + @InliningCutoff + private static Object parseGeneric(TruffleString string, int base, byte[] originalBytes, int originalBytesLen, GenericIntParserNode fromString) { + return fromString.execute(string, base, originalBytes, originalBytesLen); + } + + @GenerateInline(false) // Slow path + @GenerateUncached + abstract static class GenericIntParserNode extends Node { + public abstract Object execute(TruffleString number, int base, byte[] originalBytes, int originalBytesLen); + + @Specialization + static Object doGeneric(TruffleString numberTs, int base, byte[] originalBytes, int originalBytesLen, + @Bind("this") Node inliningTarget, + @Cached TruffleString.ToJavaStringNode toJavaStringNode, + @Cached InlinedBranchProfile invalidBase, + @Cached InlinedBranchProfile notSimpleDecimalLiteralProfile, + @Cached InlinedBranchProfile invalidValueProfile, + @Cached PRaiseNode raiseNode, + @Cached StringNodes.StringReprNode stringReprNode, + @Cached BytesNodes.BytesReprNode bytesReprNode) { + String number = toJavaStringNode.execute(numberTs); + if ((base != 0 && base < 2) || base > 36) { + invalidBase.enter(inliningTarget); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.INT_BASE_MUST_BE_2_AND_36_OR_0); + } + notSimpleDecimalLiteralProfile.enter(inliningTarget); + PythonContext context = PythonContext.get(inliningTarget); + Object value = stringToIntInternal(inliningTarget, number, base, context); + if (value == null) { + invalidValueProfile.enter(inliningTarget); + Object repr; + if (originalBytes == null) { + repr = stringReprNode.execute(numberTs); + } else { + repr = bytesReprNode.execute(inliningTarget, PFactory.createBytes(context.getLanguage(inliningTarget), originalBytes, originalBytesLen)); + } + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.INVALID_LITERAL_FOR_INT_WITH_BASE, base, repr); + } + return value; + } + + @TruffleBoundary + private static Object stringToIntInternal(Node inliningTarget, String num, int base, PythonContext context) { + try { + BigInteger bi = asciiToBigInteger(inliningTarget, num, base, context); + if (bi == null) { + return null; + } + if (bi.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) > 0 || bi.compareTo(BigInteger.valueOf(Integer.MIN_VALUE)) < 0) { + return PFactory.createInt(context.getLanguage(), bi); + } else { + return bi.intValue(); + } + } catch (NumberFormatException e) { + return null; + } + } + + @TruffleBoundary + private static BigInteger asciiToBigInteger(Node inliningTarget, String str, int possibleBase, PythonContext context) throws NumberFormatException { + int base = possibleBase; + int b = 0; + int e = str.length(); + + while (b < e && Character.isWhitespace(str.charAt(b))) { + b++; + } + + while (e > b && Character.isWhitespace(str.charAt(e - 1))) { + e--; + } + + boolean acceptUnderscore = false; + boolean raiseIfNotZero = false; + char sign = 0; + if (b < e) { + sign = str.charAt(b); + if (sign == '-' || sign == '+') { + b++; + } + + if (b < e && str.charAt(b) == '0') { + char next = b + 1 < e ? Character.toUpperCase(str.charAt(b + 1)) : '?'; + if (base == 0) { + if (next == 'X') { + base = 16; + } else if (next == 'O') { + base = 8; + } else if (next == 'B') { + base = 2; + } else { + raiseIfNotZero = true; + } + } + if (base == 16 && next == 'X' || base == 8 && next == 'O' || base == 2 && next == 'B') { + b += 2; + acceptUnderscore = true; + } + } + } + + if (base == 0) { + base = 10; + } + + // reject invalid characters without going to BigInteger + for (int i = b; i < e; i++) { + char c = str.charAt(i); + if (c == '_') { + if (!acceptUnderscore || i == e - 1) { + throw new NumberFormatException("Illegal underscore in int literal"); + } else { + acceptUnderscore = false; + } + } else { + acceptUnderscore = true; + if (Character.digit(c, base) == -1) { + // invalid char + return null; + } + } + } + + String s = str; + if (b > 0 || e < str.length()) { + s = str.substring(b, e); + } + s = s.replace("_", ""); + + checkMaxDigits(inliningTarget, context, s.length(), base); + + BigInteger bi; + if (sign == '-') { + bi = new BigInteger("-" + s, base); + } else { + bi = new BigInteger(s, base); + } + + if (raiseIfNotZero && !bi.equals(BigInteger.ZERO)) { + throw new NumberFormatException("Obsolete octal int literal"); + } + return bi; + } + + private static void checkMaxDigits(Node inliningTarget, PythonContext context, int digits, int base) { + if (digits > SysModuleBuiltins.INT_MAX_STR_DIGITS_THRESHOLD && Integer.bitCount(base) != 1) { + int maxDigits = context.getIntMaxStrDigits(); + if (maxDigits > 0 && digits > maxDigits) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.EXCEEDS_THE_LIMIT_FOR_INTEGER_STRING_CONVERSION_D, maxDigits, + digits); + } + } + } + } + + @NeverDefault + public static PyLongFromUnicodeObject create() { + return PyLongFromUnicodeObjectNodeGen.create(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyMappingCheckNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyMappingCheckNode.java index c1995082d9..d1cafad63f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyMappingCheckNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyMappingCheckNode.java @@ -40,12 +40,10 @@ */ package com.oracle.graal.python.lib; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.util.LazyInteropLibrary; import com.oracle.graal.python.runtime.sequence.PSequence; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; @@ -86,12 +84,8 @@ static boolean doSequence(@SuppressWarnings("unused") PSequence object) { @Specialization static boolean doGeneric(Node inliningTarget, Object object, @Cached GetClassNode getClassNode, - @Cached GetCachedTpSlotsNode getSlotsNode, - @Cached LazyInteropLibrary lazyLib) { + @Cached GetCachedTpSlotsNode getSlotsNode) { Object type = getClassNode.execute(inliningTarget, object); - if (type == PythonBuiltinClassType.ForeignObject) { - return lazyLib.get(inliningTarget).hasHashEntries(object); - } return getSlotsNode.execute(inliningTarget, type).mp_subscript() != null; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyMemoryViewFromObject.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyMemoryViewFromObject.java index 2d02aa4da8..d9a2ae7cfe 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyMemoryViewFromObject.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyMemoryViewFromObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -64,7 +64,7 @@ import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.NativeByteSequenceStorage; import com.oracle.graal.python.util.BufferFormat; import com.oracle.truffle.api.CompilerDirectives; @@ -89,10 +89,10 @@ public abstract class PyMemoryViewFromObject extends PNodeWithContext { @Specialization static PMemoryView fromMemoryView(PMemoryView object, @Bind("this") Node inliningTarget, - @Shared @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { object.checkReleased(inliningTarget, raiseNode); - return factory.createMemoryView(PythonContext.get(inliningTarget), object.getLifecycleManager(), object.getBuffer(), object.getOwner(), object.getLength(), + PythonContext context = PythonContext.get(inliningTarget); + return PFactory.createMemoryView(context.getLanguage(inliningTarget), context, object.getLifecycleManager(), object.getBuffer(), object.getOwner(), object.getLength(), object.isReadOnly(), object.getItemSize(), object.getFormat(), object.getFormatString(), object.getDimensions(), object.getBufferPointer(), object.getOffset(), object.getBufferShape(), object.getBufferStrides(), object.getBufferSuboffsets(), object.getFlags()); @@ -110,7 +110,7 @@ static PMemoryView fromPickleBuffer(VirtualFrame frame, PPickleBuffer object, @Bind("this") Node inliningTarget, @Shared @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, @Cached PyMemoryViewFromObject recursive, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { /* * PickleBuffer is just a buffer proxy for other objects, including native objects or other * memoryviews, we need to process the delegate recursively. @@ -120,7 +120,7 @@ static PMemoryView fromPickleBuffer(VirtualFrame frame, PPickleBuffer object, owner = bufferLib.getOwner(object.getView()); } if (owner == null) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.OP_FORBIDDEN_ON_OBJECT, "PickleBuffer"); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.OP_FORBIDDEN_ON_OBJECT, "PickleBuffer"); } return recursive.execute(frame, owner); } @@ -137,16 +137,16 @@ static PMemoryView fromManaged(VirtualFrame frame, Object object, @Cached HiddenAttr.ReadNode readGetBufferNode, @Cached HiddenAttr.ReadNode readReleaseBufferNode, @Cached CallNode callNode, - @Shared @Cached PythonObjectFactory factory, @Cached MemoryViewNodes.InitFlagsNode initFlagsNode, @Cached TruffleString.CodePointLengthNode lengthNode, @Cached TruffleString.CodePointAtIndexNode atIndexNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { Object typeObj = getClassNode.execute(inliningTarget, object); assert typeObj instanceof PythonBuiltinClassType || typeObj instanceof PythonAbstractObject; PythonAbstractObject type; + PythonContext context = PythonContext.get(inliningTarget); if (isBuiltinClassTypeProfile.profile(inliningTarget, typeObj instanceof PythonBuiltinClassType)) { - type = PythonContext.get(inliningTarget).lookupType((PythonBuiltinClassType) typeObj); + type = context.lookupType((PythonBuiltinClassType) typeObj); } else { type = (PythonAbstractObject) typeObj; } @@ -179,16 +179,18 @@ static PMemoryView fromManaged(VirtualFrame frame, Object object, // TODO when Sulong allows exposing pointers as interop buffer, we can get rid of this Object pythonBuffer = NativeByteSequenceStorage.create(cBuffer.getBuf(), cBuffer.getLen(), cBuffer.getLen(), false); TruffleString format = cBuffer.getFormat(); - return factory.createMemoryView(PythonContext.get(inliningTarget), bufferLifecycleManager, pythonBuffer, cBuffer.getObj(), cBuffer.getLen(), cBuffer.isReadOnly(), cBuffer.getItemSize(), + return PFactory.createMemoryView(context.getLanguage(inliningTarget), context, bufferLifecycleManager, pythonBuffer, cBuffer.getObj(), cBuffer.getLen(), cBuffer.isReadOnly(), + cBuffer.getItemSize(), BufferFormat.forMemoryView(format, lengthNode, atIndexNode), format, cBuffer.getDims(), cBuffer.getBuf(), 0, shape, strides, suboffsets, flags); } else if (bufferAcquireLib.hasBuffer(object)) { // Managed object that implements PythonBufferAcquireLibrary Object buffer = bufferAcquireLib.acquire(object, BufferFlags.PyBUF_FULL_RO, frame, indirectCallData); - return factory.createMemoryViewForManagedObject(buffer, bufferLib.getOwner(buffer), bufferLib.getItemSize(buffer), bufferLib.getBufferLength(buffer), bufferLib.isReadonly(buffer), + return PFactory.createMemoryViewForManagedObject(context.getLanguage(inliningTarget), buffer, bufferLib.getOwner(buffer), bufferLib.getItemSize(buffer), bufferLib.getBufferLength(buffer), + bufferLib.isReadonly(buffer), bufferLib.getFormatString(buffer), lengthNode, atIndexNode); } else { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.MEMORYVIEW_A_BYTES_LIKE_OBJECT_REQUIRED_NOT_P, object); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.MEMORYVIEW_A_BYTES_LIKE_OBJECT_REQUIRED_NOT_P, object); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberAbsoluteNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberAbsoluteNode.java new file mode 100644 index 0000000000..9c634f5901 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberAbsoluteNode.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotUnaryFunc.CallSlotUnaryNode; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.expression.UnaryOpNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateUncached +@GenerateInline(false) +public abstract class PyNumberAbsoluteNode extends UnaryOpNode { + protected static final int INT_MIN_VALUE = Integer.MIN_VALUE; + protected static final long LONG_MIN_VALUE = Long.MIN_VALUE; + + @Specialization(guards = "object != INT_MIN_VALUE") + static int doInt(int object) { + return Math.abs(object); + } + + @Specialization(guards = "object == INT_MIN_VALUE") + static long doIntMin(@SuppressWarnings("unused") int object) { + return -(long) INT_MIN_VALUE; + } + + @Specialization(guards = "object != LONG_MIN_VALUE") + static long doLong(long object) { + return Math.abs(object); + } + + @Specialization + static double doDouble(double object) { + return Math.abs(object); + } + + @Fallback + @InliningCutoff + static Object doObject(VirtualFrame frame, Object object, + @Bind Node inliningTarget, + @Cached GetClassNode getClassNode, + @Cached GetCachedTpSlotsNode getSlots, + @Cached CallSlotUnaryNode callSlot, + @Cached PRaiseNode raiseNode) { + Object type = getClassNode.execute(inliningTarget, object); + TpSlots slots = getSlots.execute(inliningTarget, type); + if (slots.nb_absolute() != null) { + return callSlot.execute(frame, inliningTarget, slots.nb_absolute(), object); + } + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.BAD_OPERAND_FOR, "abs()", "", object); + } + + @NeverDefault + public static PyNumberAbsoluteNode create() { + return PyNumberAbsoluteNodeGen.create(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberAddNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberAddNode.java index 483757851e..efeb878f58 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberAddNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberAddNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,133 +40,70 @@ */ package com.oracle.graal.python.lib; +import static com.oracle.graal.python.lib.CallBinaryOpNode.raiseNotSupported; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.PNotImplemented; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; -import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ListGeneralizationNode; import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.CallSlotBinaryFuncNode; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpSlot; -import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.ReversibleSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberAddFastPathsBase; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.PRaiseNode.Lazy; -import com.oracle.graal.python.nodes.expression.BinaryOpNode; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; -import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.nodes.UnexpectedResultException; import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.strings.TruffleString; -@GenerateInline(inlineByDefault = true) -public abstract class PyNumberAddNode extends BinaryOpNode { - public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object v, Object w); +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberAddNode extends PyNumberAddFastPathsBase { - @Override - public final Object executeObject(VirtualFrame frame, Object left, Object right) { - return executeCached(frame, left, right); - } - - public final Object executeCached(VirtualFrame frame, Object v, Object w) { - return execute(frame, this, v, w); - } - - public abstract int executeInt(VirtualFrame frame, Node inliningTarget, int left, int right) throws UnexpectedResultException; - - public abstract double executeDouble(VirtualFrame frame, Node inliningTarget, double left, double right) throws UnexpectedResultException; - - /* - * All the following fast paths need to be kept in sync with the corresponding builtin functions - * in IntBuiltins, FloatBuiltins, ListBuiltins, ... - */ - - @Specialization(rewriteOn = ArithmeticException.class) - public static int add(int left, int right) { - return Math.addExact(left, right); - } - - @Specialization - public static long doIIOvf(int x, int y) { - return x + (long) y; - } - - @Specialization(rewriteOn = ArithmeticException.class) - public static long addLong(long left, long right) { - return Math.addExact(left, right); - } - - @Specialization - public static double doDD(double left, double right) { - return left + right; - } - - @Specialization - public static double doDL(double left, long right) { - return left + right; - } - - @Specialization - public static double doLD(long left, double right) { - return left + right; - } - - @Specialization - public static double doDI(double left, int right) { - return left + right; - } - - @Specialization - public static double doID(int left, double right) { - return left + right; - } - - @NeverDefault - protected static SequenceStorageNodes.ConcatNode createConcat() { - return SequenceStorageNodes.ConcatNode.create(ListGeneralizationNode::create); - } - - @Specialization - static PList doPList(Node inliningTarget, PList left, PList right, - @Exclusive @Cached GetClassNode getClassNode, - @Shared @Cached(value = "createConcat()", inline = false) SequenceStorageNodes.ConcatNode concatNode, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - SequenceStorage newStore = concatNode.execute(left.getSequenceStorage(), right.getSequenceStorage()); - return factory.createList(getClassNode.execute(inliningTarget, left), newStore); + @Specialization(guards = {"isBuiltinList(left)", "isBuiltinList(right)"}) + public static PList doPList(PList left, PList right, + @Bind PythonLanguage language, + @Bind Node inliningTarget, + @Shared @Cached SequenceStorageNodes.ConcatListOrTupleNode concatNode) { + SequenceStorage newStore = concatNode.execute(inliningTarget, left.getSequenceStorage(), right.getSequenceStorage()); + return PFactory.createList(language, newStore); } @Specialization(guards = {"isBuiltinTuple(left)", "isBuiltinTuple(right)"}) - static PTuple doTuple(Node inliningTarget, PTuple left, PTuple right, - @Shared @Cached(value = "createConcat()", inline = false) SequenceStorageNodes.ConcatNode concatNode, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - SequenceStorage concatenated = concatNode.execute(left.getSequenceStorage(), right.getSequenceStorage()); - return factory.createTuple(concatenated); + public static PTuple doTuple(PTuple left, PTuple right, + @Bind PythonLanguage language, + @Bind Node inliningTarget, + @Shared @Cached SequenceStorageNodes.ConcatListOrTupleNode concatNode) { + SequenceStorage concatenated = concatNode.execute(inliningTarget, left.getSequenceStorage(), right.getSequenceStorage()); + return PFactory.createTuple(language, concatenated); } @Specialization - static TruffleString doIt(TruffleString left, TruffleString right, + public static TruffleString doIt(TruffleString left, TruffleString right, @Cached(inline = false) TruffleString.ConcatNode concatNode) { return concatNode.execute(left, right, TS_ENCODING, false); } @Fallback - static Object doIt(VirtualFrame frame, Node inliningTarget, Object v, Object w, + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, @Exclusive @Cached GetClassNode getVClass, @Cached GetCachedTpSlotsNode getVSlots, @Cached GetCachedTpSlotsNode getWSlots, @@ -174,33 +111,28 @@ static Object doIt(VirtualFrame frame, Node inliningTarget, Object v, Object w, @Cached CallBinaryOp1Node callBinaryOp1Node, @Cached InlinedBranchProfile hasNbAddResult, @Cached CallSlotBinaryFuncNode callBinarySlotNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object classV = getVClass.execute(inliningTarget, v); Object classW = getWClass.execute(inliningTarget, w); TpSlots slotsV = getVSlots.execute(inliningTarget, classV); TpSlots slotsW = getWSlots.execute(inliningTarget, classW); - TpSlot slotV = slotsV.nb_add(); - TpSlot slotW = slotsW.nb_add(); - if (slotV != null || slotW != null) { - Object result = callBinaryOp1Node.execute(frame, inliningTarget, v, classV, slotV, w, classW, slotW, BinaryOpSlot.NB_ADD); - if (result != PNotImplemented.NOT_IMPLEMENTED) { - hasNbAddResult.enter(inliningTarget); - return result; - } + Object result = callBinaryOp1Node.execute(frame, inliningTarget, v, classV, slotsV, w, classW, slotsW, ReversibleSlot.NB_ADD); + if (result != PNotImplemented.NOT_IMPLEMENTED) { + hasNbAddResult.enter(inliningTarget); + return result; } if (slotsV.sq_concat() != null) { return callBinarySlotNode.execute(frame, inliningTarget, slotsV.sq_concat(), v, w); } - return raiseNotSupported(inliningTarget, v, w, raiseNode); - } - - @InliningCutoff - private static PException raiseNotSupported(Node inliningTarget, Object v, Object w, Lazy raiseNode) { - return raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_FOR_S_P_AND_P, "+", v, w); + return raiseNotSupported(inliningTarget, v, w, "+", raiseNode); } @NeverDefault public static PyNumberAddNode create() { return PyNumberAddNodeGen.create(); } + + public static PyNumberAddNode getUncached() { + return PyNumberAddNodeGen.getUncached(); + } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberAndNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberAndNode.java new file mode 100644 index 0000000000..0ad79e2a87 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberAndNode.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.ReversibleSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberAndFastPathsBase; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberAndNode extends PyNumberAndFastPathsBase { + + @Fallback + @InliningCutoff + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, ReversibleSlot.NB_AND, "&"); + } + + @NeverDefault + public static PyNumberAndNode create() { + return PyNumberAndNodeGen.create(); + } + + public static PyNumberAndNode getUncached() { + return PyNumberAndNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberAsSizeNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberAsSizeNode.java index 4f311bd2dd..e25f5d02e5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberAsSizeNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberAsSizeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -115,7 +115,7 @@ public final int executeExact(Frame frame, Node inliningTarget, Object object, P return execute(frame, inliningTarget, object, errorClass); } - protected abstract int execute(Frame frame, Node inliningTarget, Object object, Object errorClass); + public abstract int execute(Frame frame, Node inliningTarget, Object object, Object errorClass); @Specialization static int doInt(int object, @SuppressWarnings("unused") Object errorClass) { @@ -124,12 +124,12 @@ static int doInt(int object, @SuppressWarnings("unused") Object errorClass) { @Specialization public static int doLongExact(Node inliningTarget, long object, PythonBuiltinClassType errorClass, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { int converted = (int) object; if (object == converted) { return converted; } - throw raiseNode.get(inliningTarget).raise(errorClass, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, object); + throw raiseNode.raise(inliningTarget, errorClass, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, object); } @Specialization @@ -157,13 +157,13 @@ abstract static class PyNumberAsSizeObjectNode extends Node { static int doObjectExact(VirtualFrame frame, Object object, PythonBuiltinClassType errorClass, @Bind("this") Node inliningTarget, @Exclusive @Cached PyNumberIndexNode indexNode, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PRaiseNode raiseNode, @Cached CastToJavaIntExactNode cast) { Object index = indexNode.execute(frame, inliningTarget, object); try { return cast.execute(inliningTarget, index); } catch (PException pe) { - throw raiseNode.get(inliningTarget).raise(errorClass, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, object); + throw raiseNode.raise(inliningTarget, errorClass, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, object); } catch (CannotCastException cannotCastException) { throw CompilerDirectives.shouldNotReachHere("PyNumberIndexNode didn't return a python integer"); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberCheckNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberCheckNode.java index 52151f22cd..ef416998a8 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberCheckNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberCheckNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,19 +40,16 @@ */ package com.oracle.graal.python.lib; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.complex.PComplex; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.util.LazyInteropLibrary; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @@ -64,10 +61,13 @@ @GenerateUncached @GenerateInline @GenerateCached(false) -@ImportStatic(SpecialMethodSlot.class) public abstract class PyNumberCheckNode extends PNodeWithContext { public abstract boolean execute(Node inliningTarget, Object object); + public static boolean executeUncached(Object object) { + return PyNumberCheckNodeGen.getUncached().execute(null, object); + } + @Specialization static boolean doString(@SuppressWarnings("unused") TruffleString object) { return false; @@ -103,18 +103,16 @@ static boolean doNone(PNone object) { return false; } + @Specialization + static boolean doComplex(@SuppressWarnings("unused") PComplex object) { + return true; + } + @Fallback static boolean doOthers(Node inliningTarget, Object object, - @Cached LazyInteropLibrary interopLibrary, - @Cached GetClassNode getClassNode, - @Cached(parameters = "Index", inline = false) LookupCallableSlotInMRONode lookupIndex, - @Cached(parameters = "Float", inline = false) LookupCallableSlotInMRONode lookupFloat, - @Cached(parameters = "Int", inline = false) LookupCallableSlotInMRONode lookupInt, + @Cached GetObjectSlotsNode getSlots, @Cached PyComplexCheckNode checkComplex) { - Object type = getClassNode.execute(inliningTarget, object); - if (type == PythonBuiltinClassType.ForeignObject) { - return interopLibrary.get(inliningTarget).isNumber(object); - } - return lookupIndex.execute(type) != PNone.NO_VALUE || lookupInt.execute(type) != PNone.NO_VALUE || lookupFloat.execute(type) != PNone.NO_VALUE || checkComplex.execute(inliningTarget, object); + TpSlots slots = getSlots.execute(inliningTarget, object); + return slots.nb_index() != null || slots.nb_int() != null || slots.nb_float() != null || checkComplex.execute(inliningTarget, object); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberDivmodNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberDivmodNode.java new file mode 100644 index 0000000000..0cc37fd903 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberDivmodNode.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.ReversibleSlot; +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(inlineByDefault = true) +@GenerateUncached +public abstract class PyNumberDivmodNode extends BinaryOpNode { + public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object v, Object w); + + @Override + public final Object execute(VirtualFrame frame, Object left, Object right) { + return executeCached(frame, left, right); + } + + public final Object executeCached(VirtualFrame frame, Object v, Object w) { + return execute(frame, this, v, w); + } + + @Specialization + public static Object doIt(VirtualFrame frame, Node inliningTarget, Object v, Object w, + @Cached CallBinaryOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, ReversibleSlot.NB_DIVMOD, "divmod()"); + } + + @NeverDefault + public static PyNumberDivmodNode create() { + return PyNumberDivmodNodeGen.create(); + } + + public static PyNumberDivmodNode getUncached() { + return PyNumberDivmodNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberFloatNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberFloatNode.java index f507aa57a8..a4d3e6b434 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberFloatNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberFloatNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,29 +40,18 @@ */ package com.oracle.graal.python.lib; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.DeprecationWarning; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FLOAT__; - -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotUnaryFunc.CallSlotUnaryNode; +import com.oracle.graal.python.lib.PyFloatAsDoubleNode.HandleFloatResultNode; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; -import com.oracle.graal.python.nodes.classes.IsSubtypeNode; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassExactProfile; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.util.CastToJavaDoubleNode; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; @@ -78,7 +67,6 @@ @GenerateUncached @GenerateInline @GenerateCached(false) -@ImportStatic(SpecialMethodSlot.class) public abstract class PyNumberFloatNode extends PNodeWithContext { public abstract double execute(Frame frame, Node inliningTarget, Object object); @@ -106,38 +94,28 @@ static double doBoolean(boolean object) { return object ? 1.0 : 0.0; } - @Specialization(guards = {"!isDouble(object)", "!isInteger(object)", "!isBoolean(object)"}) + @Fallback @InliningCutoff static double doObject(VirtualFrame frame, Node inliningTarget, Object object, @Cached GetClassNode getClassNode, - @Cached(parameters = "Float", inline = false) LookupSpecialMethodSlotNode lookup, - @Cached(inline = false) CallUnaryMethodNode call, - @Cached GetClassNode resultClassNode, - @Cached IsBuiltinClassExactProfile resultProfile, - @Cached(inline = false) IsSubtypeNode resultSubtypeNode, - @Cached PyIndexCheckNode indexCheckNode, + @Cached GetCachedTpSlotsNode getSlots, + @Cached CallSlotUnaryNode callFloat, @Cached PyNumberIndexNode indexNode, - @Cached CastToJavaDoubleNode cast, - @Cached(inline = false) WarningsModuleBuiltins.WarnNode warnNode, - @Cached PRaiseNode.Lazy raiseNode, + @Cached PyLongAsDoubleNode asDoubleNode, + @Cached HandleFloatResultNode handleFloatResultNode, @Cached PyFloatFromString fromString) { - Object floatDescr = lookup.execute(frame, getClassNode.execute(inliningTarget, object), object); - if (floatDescr != PNone.NO_VALUE) { - Object result = call.executeObject(frame, floatDescr, object); - Object resultType = resultClassNode.execute(inliningTarget, result); - if (!resultProfile.profileClass(inliningTarget, resultType, PythonBuiltinClassType.PFloat)) { - if (!resultSubtypeNode.execute(resultType, PythonBuiltinClassType.PFloat)) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.RETURNED_NON_FLOAT, object, result); - } else { - warnNode.warnFormat(frame, null, DeprecationWarning, 1, - ErrorMessages.WARN_P_RETURNED_NON_P, object, T___FLOAT__, "float", result, "float"); - } + Object type = getClassNode.execute(inliningTarget, object); + TpSlots slots = getSlots.execute(inliningTarget, type); + if (slots.nb_float() != null) { + Object result = callFloat.execute(frame, inliningTarget, slots.nb_float(), object); + if (result instanceof Double doubleResult) { + return doubleResult; } - return cast.execute(inliningTarget, result); + return PyFloatAsDoubleNode.handleFloatResult(frame, result, object, handleFloatResultNode); } - if (indexCheckNode.execute(inliningTarget, object)) { + if (slots.nb_index() != null) { Object index = indexNode.execute(frame, inliningTarget, object); - return cast.execute(inliningTarget, index); + return asDoubleNode.execute(inliningTarget, index); } return fromString.execute(frame, inliningTarget, object); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberFloorDivideNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberFloorDivideNode.java new file mode 100644 index 0000000000..710904e665 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberFloorDivideNode.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.ReversibleSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberFloorDivideFastPathsBase; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberFloorDivideNode extends PyNumberFloorDivideFastPathsBase { + + @Fallback + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, ReversibleSlot.NB_FLOOR_DIVIDE, "//"); + } + + @NeverDefault + public static PyNumberFloorDivideNode create() { + return PyNumberFloorDivideNodeGen.create(); + } + + public static PyNumberFloorDivideNode getUncached() { + return PyNumberFloorDivideNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceAddNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceAddNode.java new file mode 100644 index 0000000000..c700c6ef4d --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceAddNode.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import static com.oracle.graal.python.lib.CallBinaryOpNode.raiseNotSupported; + +import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.CallSlotBinaryFuncNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.InplaceSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberAddFastPathsBase; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Exclusive; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberInPlaceAddNode extends PyNumberAddFastPathsBase { + + @Fallback + @InliningCutoff + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Exclusive @Cached GetClassNode getVClass, + @Cached GetCachedTpSlotsNode getVSlots, + @Cached GetCachedTpSlotsNode getWSlots, + @Exclusive @Cached GetClassNode getWClass, + @Cached CallBinaryIOp1Node callBinaryIOp1Node, + @Cached InlinedBranchProfile hasNbAddResult, + @Cached InlinedBranchProfile hasInplaceConcat, + @Cached InlinedBranchProfile hasConcat, + @Cached CallSlotBinaryFuncNode callBinarySlotNode, + @Cached PRaiseNode raiseNode) { + Object classV = getVClass.execute(inliningTarget, v); + Object classW = getWClass.execute(inliningTarget, w); + TpSlots slotsV = getVSlots.execute(inliningTarget, classV); + TpSlots slotsW = getWSlots.execute(inliningTarget, classW); + Object result = callBinaryIOp1Node.execute(frame, inliningTarget, v, classV, slotsV, w, classW, slotsW, InplaceSlot.NB_INPLACE_ADD); + if (result != PNotImplemented.NOT_IMPLEMENTED) { + hasNbAddResult.enter(inliningTarget); + return result; + } + TpSlot concatSlot; + if (slotsV.sq_inplace_concat() != null) { + hasInplaceConcat.enter(inliningTarget); + concatSlot = slotsV.sq_inplace_concat(); + } else if (slotsV.sq_concat() != null) { + hasConcat.enter(inliningTarget); + concatSlot = slotsV.sq_concat(); + } else { + return raiseNotSupported(inliningTarget, v, w, "+=", raiseNode); + } + return callBinarySlotNode.execute(frame, inliningTarget, concatSlot, v, w); + } + + @NeverDefault + public static PyNumberInPlaceAddNode create() { + return PyNumberInPlaceAddNodeGen.create(); + } + + public static PyNumberInPlaceAddNode getUncached() { + return PyNumberInPlaceAddNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceAndNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceAndNode.java new file mode 100644 index 0000000000..25f56faf46 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceAndNode.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.InplaceSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberAndFastPathsBase; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberInPlaceAndNode extends PyNumberAndFastPathsBase { + @Fallback + @InliningCutoff + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryIOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, InplaceSlot.NB_INPLACE_AND, "&="); + } + + @NeverDefault + public static PyNumberInPlaceAndNode create() { + return PyNumberInPlaceAndNodeGen.create(); + } + + public static PyNumberInPlaceAndNode getUncached() { + return PyNumberInPlaceAndNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceFloorDivideNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceFloorDivideNode.java new file mode 100644 index 0000000000..b0eb213ec5 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceFloorDivideNode.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.InplaceSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberFloorDivideFastPathsBase; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberInPlaceFloorDivideNode extends PyNumberFloorDivideFastPathsBase { + @Fallback + @InliningCutoff + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryIOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, InplaceSlot.NB_INPLACE_FLOOR_DIVIDE, "//="); + } + + @NeverDefault + public static PyNumberInPlaceFloorDivideNode create() { + return PyNumberInPlaceFloorDivideNodeGen.create(); + } + + public static PyNumberInPlaceFloorDivideNode getUncached() { + return PyNumberInPlaceFloorDivideNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceLshiftNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceLshiftNode.java new file mode 100644 index 0000000000..9ede290b1f --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceLshiftNode.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.InplaceSlot; +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +// TODO: should inherit from PyNumberLshiftFastPathsBase, blocked by GR-64005 +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberInPlaceLshiftNode extends BinaryOpNode { + @Specialization // (replaces = {"doII", "doLL"}) + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryIOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, InplaceSlot.NB_INPLACE_LSHIFT, "<<="); + } + + @NeverDefault + public static PyNumberInPlaceLshiftNode create() { + return PyNumberInPlaceLshiftNodeGen.create(); + } + + public static PyNumberInPlaceLshiftNode getUncached() { + return PyNumberInPlaceLshiftNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceMatrixMultiplyNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceMatrixMultiplyNode.java new file mode 100644 index 0000000000..76f26e8e4b --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceMatrixMultiplyNode.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.InplaceSlot; +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberInPlaceMatrixMultiplyNode extends BinaryOpNode { + @Specialization + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryIOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, InplaceSlot.NB_INPLACE_MATRIX_MULTIPLY, "@="); + } + + @NeverDefault + public static PyNumberInPlaceMatrixMultiplyNode create() { + return PyNumberInPlaceMatrixMultiplyNodeGen.create(); + } + + public static PyNumberInPlaceMatrixMultiplyNode getUncached() { + return PyNumberInPlaceMatrixMultiplyNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceMultiplyNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceMultiplyNode.java new file mode 100644 index 0000000000..aa0b005f2c --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceMultiplyNode.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import static com.oracle.graal.python.lib.CallBinaryOpNode.raiseNotSupported; + +import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.InplaceSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberMultiplyFastPathsBase; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Exclusive; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberInPlaceMultiplyNode extends PyNumberMultiplyFastPathsBase { + + @Fallback + @InliningCutoff + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Exclusive @Cached GetClassNode getVClass, + @Cached GetCachedTpSlotsNode getVSlots, + @Cached GetCachedTpSlotsNode getWSlots, + @Exclusive @Cached GetClassNode getWClass, + @Cached CallBinaryIOp1Node callBinaryIOp1Node, + @Cached InlinedBranchProfile hasNbMultiplyResult, + @Cached InlinedBranchProfile hasInplaceRepeat, + @Cached InlinedBranchProfile hasRepeat, + @Cached InlinedBranchProfile wHasRepeat, + @Cached SequenceRepeatHelperNode sequenceRepeatNode, + @Cached PRaiseNode raiseNode) { + Object classV = getVClass.execute(inliningTarget, v); + Object classW = getWClass.execute(inliningTarget, w); + TpSlots slotsV = getVSlots.execute(inliningTarget, classV); + TpSlots slotsW = getWSlots.execute(inliningTarget, classW); + Object result = callBinaryIOp1Node.execute(frame, inliningTarget, v, classV, slotsV, w, classW, slotsW, InplaceSlot.NB_INPLACE_MULTIPLY); + if (result != PNotImplemented.NOT_IMPLEMENTED) { + hasNbMultiplyResult.enter(inliningTarget); + return result; + } + if (slotsV.has_as_sequence()) { + TpSlot repeatSlot = null; + if (slotsV.sq_inplace_repeat() != null) { + hasInplaceRepeat.enter(inliningTarget); + repeatSlot = slotsV.sq_inplace_repeat(); + } else if (slotsV.sq_repeat() != null) { + hasRepeat.enter(inliningTarget); + repeatSlot = slotsV.sq_repeat(); + } + if (repeatSlot != null) { + return sequenceRepeatNode.execute(frame, repeatSlot, v, w); + } + } else if (slotsW.has_as_sequence()) { + /* + * Note that the right hand operand should not be mutated in this case so + * sq_inplace_repeat is not used. + */ + if (slotsW.sq_repeat() != null) { + wHasRepeat.enter(inliningTarget); + return sequenceRepeatNode.execute(frame, slotsW.sq_repeat(), w, v); + } + } + return raiseNotSupported(inliningTarget, v, w, "*=", raiseNode); + } + + @NeverDefault + public static PyNumberInPlaceMultiplyNode create() { + return PyNumberInPlaceMultiplyNodeGen.create(); + } + + public static PyNumberInPlaceMultiplyNode getUncached() { + return PyNumberInPlaceMultiplyNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceOrNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceOrNode.java new file mode 100644 index 0000000000..28edd9a3d5 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceOrNode.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.InplaceSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberOrFastPathsBase; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberInPlaceOrNode extends PyNumberOrFastPathsBase { + @Fallback + @InliningCutoff + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryIOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, InplaceSlot.NB_INPLACE_OR, "|="); + } + + @NeverDefault + public static PyNumberInPlaceOrNode create() { + return PyNumberInPlaceOrNodeGen.create(); + } + + public static PyNumberInPlaceOrNode getUncached() { + return PyNumberInPlaceOrNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlacePowerNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlacePowerNode.java new file mode 100644 index 0000000000..def6460240 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlacePowerNode.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberInPlacePowerNode extends BinaryOpNode { + + public abstract Object execute(VirtualFrame frame, Object v, Object w, Object z); + + @Override + public final Object execute(VirtualFrame frame, Object left, Object right) { + return execute(frame, left, right, PNone.NONE); + } + + @Specialization + public static Object doIt(VirtualFrame frame, Object v, Object w, Object z, + @Bind Node inliningTarget, + @Cached CallTernaryIOpNode callTernaryOpNode, + @Cached PRaiseNode raiseNode) { + Object result = callTernaryOpNode.execute(frame, inliningTarget, v, w, z); + if (result != PNotImplemented.NOT_IMPLEMENTED) { + return result; + } + return raiseNotSupported(inliningTarget, v, w, z, raiseNode); + } + + @InliningCutoff + private static PException raiseNotSupported(Node inliningTarget, Object v, Object w, Object z, PRaiseNode raiseNode) { + if (z == PNone.NONE) { + return raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_FOR_S_P_AND_P, "**=", v, w); + } else { + return raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_FOR_S_P_P_P, "**=", v, w, z); + } + } + + @NeverDefault + public static PyNumberInPlacePowerNode create() { + return PyNumberInPlacePowerNodeGen.create(); + } + + public static PyNumberInPlacePowerNode getUncached() { + return PyNumberInPlacePowerNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceRemainderNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceRemainderNode.java new file mode 100644 index 0000000000..19c3df7d0e --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceRemainderNode.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.InplaceSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberRemainderFastPathsBase; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberInPlaceRemainderNode extends PyNumberRemainderFastPathsBase { + @Fallback + @InliningCutoff + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryIOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, InplaceSlot.NB_INPLACE_REMAINDER, "%="); + } + + @NeverDefault + public static PyNumberInPlaceRemainderNode create() { + return PyNumberInPlaceRemainderNodeGen.create(); + } + + public static PyNumberInPlaceRemainderNode getUncached() { + return PyNumberInPlaceRemainderNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceRshiftNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceRshiftNode.java new file mode 100644 index 0000000000..3e961b7892 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceRshiftNode.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.InplaceSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberRshiftFastPathsBase; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberInPlaceRshiftNode extends PyNumberRshiftFastPathsBase { + @Fallback + @InliningCutoff + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryIOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, InplaceSlot.NB_INPLACE_RSHIFT, ">>="); + } + + @NeverDefault + public static PyNumberInPlaceRshiftNode create() { + return PyNumberInPlaceRshiftNodeGen.create(); + } + + public static PyNumberInPlaceRshiftNode getUncached() { + return PyNumberInPlaceRshiftNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceSubtractNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceSubtractNode.java new file mode 100644 index 0000000000..c8e642dba0 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceSubtractNode.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.InplaceSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberSubtractFastPathsBase; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberInPlaceSubtractNode extends PyNumberSubtractFastPathsBase { + @Fallback + @InliningCutoff + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryIOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, InplaceSlot.NB_INPLACE_SUBTRACT, "-="); + } + + @NeverDefault + public static PyNumberInPlaceSubtractNode create() { + return PyNumberInPlaceSubtractNodeGen.create(); + } + + public static PyNumberInPlaceSubtractNode getUncached() { + return PyNumberInPlaceSubtractNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceTrueDivideNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceTrueDivideNode.java new file mode 100644 index 0000000000..423ea1a51b --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceTrueDivideNode.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.InplaceSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberTrueDivideFastPathsBase; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberInPlaceTrueDivideNode extends PyNumberTrueDivideFastPathsBase { + @Fallback + @InliningCutoff + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryIOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, InplaceSlot.NB_INPLACE_TRUE_DIVIDE, "/="); + } + + @NeverDefault + public static PyNumberInPlaceTrueDivideNode create() { + return PyNumberInPlaceTrueDivideNodeGen.create(); + } + + public static PyNumberInPlaceTrueDivideNode getUncached() { + return PyNumberInPlaceTrueDivideNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceXorNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceXorNode.java new file mode 100644 index 0000000000..c2665ccf1c --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInPlaceXorNode.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.InplaceSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberXorFastPathsBase; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberInPlaceXorNode extends PyNumberXorFastPathsBase { + @Fallback + @InliningCutoff + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryIOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, InplaceSlot.NB_INPLACE_XOR, "^="); + } + + @NeverDefault + public static PyNumberInPlaceXorNode create() { + return PyNumberInPlaceXorNodeGen.create(); + } + + public static PyNumberInPlaceXorNode getUncached() { + return PyNumberInPlaceXorNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberIndexNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberIndexNode.java index bc26b7252a..96b8dcd0f4 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberIndexNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberIndexNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,32 +46,26 @@ import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins; -import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; import com.oracle.graal.python.builtins.objects.ints.PInt; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotUnaryFunc.CallSlotUnaryNode; import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; +import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.nodes.UnexpectedResultException; /** * Equivalent of CPython's {@code PyNumber_Index}. Converts objects to Python integral types (can be @@ -79,13 +73,16 @@ * {@link PythonAbstractNativeObject}) using their {@code __index__} method. Raises * {@code TypeError} if they don't have any. */ -@ImportStatic(SpecialMethodSlot.class) @GenerateUncached @GenerateCached(false) @GenerateInline public abstract class PyNumberIndexNode extends PNodeWithContext { public abstract Object execute(Frame frame, Node inliningTarget, Object object); + public static Object executeUncached(Object object) { + return PyNumberIndexNodeGen.getUncached().execute(null, null, object); + } + @Specialization static int doInt(int object) { return object; @@ -96,80 +93,60 @@ static long doLong(long object) { return object; } - @Specialization + @Specialization(guards = "isBuiltinPInt(object)") static PInt doPInt(PInt object) { return object; } - @Specialization(rewriteOn = UnexpectedResultException.class) - static int doCallIndexInt(VirtualFrame frame, Node inliningTarget, Object object, - @Exclusive @Cached GetClassNode getClassNode, - @Shared("lookupIndex") @Cached(parameters = "Index", inline = false) LookupSpecialMethodSlotNode lookupIndex, - @Shared("callIndex") @Cached(inline = false) CallUnaryMethodNode callIndex, - @Shared("isSubtype") @Cached(inline = false) IsSubtypeNode isSubtype, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) throws UnexpectedResultException { + @Fallback + static Object doCallIndex(VirtualFrame frame, Node inliningTarget, Object object, + @Cached GetClassNode getClassNode, + @Cached TpSlots.GetCachedTpSlotsNode getSlots, + @Cached CallSlotUnaryNode callIndex, + @Cached(inline = false) IsSubtypeNode isSubtype, + @Cached PRaiseNode raiseNode, + @Cached PyLongCheckExactNode checkNode, + @Cached CheckIndexResultNotInt checkResult, + @Cached PyLongCopy copy) { Object type = getClassNode.execute(inliningTarget, object); if (isSubtype.execute(type, PythonBuiltinClassType.PInt)) { - throw new UnexpectedResultException(object); + return copy.execute(inliningTarget, object); } - Object indexDescr = lookupIndex.execute(frame, type, object); - if (indexDescr == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, object); + TpSlots slots = getSlots.execute(inliningTarget, type); + if (slots.nb_index() == null) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, object); } - try { - return PGuards.expectInteger(callIndex.executeObject(frame, indexDescr, object)); - } catch (UnexpectedResultException e) { - // Implicit CompilerDirectives.transferToInterpreterAndInvalidate() - Object result = checkResult(frame, object, e.getResult(), null, GetClassNode.getUncached(), - IsSubtypeNode.getUncached(), PyLongCheckExactNode.getUncached(), PRaiseNode.Lazy.getUncached(), - WarningsModuleBuiltins.WarnNode.getUncached(), PythonObjectFactory.getUncached()); - throw new UnexpectedResultException(result); + Object result = callIndex.execute(frame, inliningTarget, slots.nb_index(), object); + if (checkNode.execute(inliningTarget, result)) { + return result; } + return checkResult(frame, result, object, checkResult); } - @Specialization(replaces = "doCallIndexInt") - static Object doCallIndex(VirtualFrame frame, Node inliningTarget, Object object, - @Exclusive @Cached GetClassNode getClassNode, - @Shared("lookupIndex") @Cached(parameters = "Index", inline = false) LookupSpecialMethodSlotNode lookupIndex, - @Shared("callIndex") @Cached(inline = false) CallUnaryMethodNode callIndex, - @Shared("isSubtype") @Cached(inline = false) IsSubtypeNode isSubtype, - @Exclusive @Cached PRaiseNode.Lazy raiseNode, - @Exclusive @Cached GetClassNode resultClassNode, - @Exclusive @Cached(inline = false) IsSubtypeNode resultSubtype, - @Cached PyLongCheckExactNode isInt, - @Cached(inline = false) WarningsModuleBuiltins.WarnNode warnNode, - @Cached(inline = false) PythonObjectFactory factory) { - Object type = getClassNode.execute(inliningTarget, object); - if (isSubtype.execute(type, PythonBuiltinClassType.PInt)) { - return object; - } - Object indexDescr = lookupIndex.execute(frame, type, object); - if (indexDescr == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, object); - } - Object result = callIndex.executeObject(frame, indexDescr, object); - return checkResult(frame, object, result, inliningTarget, resultClassNode, resultSubtype, isInt, raiseNode, warnNode, factory); + @InliningCutoff + private static Object checkResult(VirtualFrame frame, Object result, Object object, CheckIndexResultNotInt checkResult) { + return checkResult.execute(frame, object, result); } - private static Object checkResult(VirtualFrame frame, Object originalObject, Object result, Node inliningTarget, GetClassNode getClassNode, IsSubtypeNode isSubtype, - PyLongCheckExactNode isInt, PRaiseNode.Lazy raiseNode, - WarningsModuleBuiltins.WarnNode warnNode, PythonObjectFactory factory) { - if (isInt.execute(inliningTarget, result)) { - return result; - } - if (!isSubtype.execute(getClassNode.execute(inliningTarget, result), PythonBuiltinClassType.PInt)) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.INDEX_RETURNED_NON_INT, result); - } - warnNode.warnFormat(frame, null, DeprecationWarning, 1, - ErrorMessages.WARN_P_RETURNED_NON_P, originalObject, T___INDEX__, "int", result, "int"); - if (result instanceof PInt) { - return factory.createInt(((PInt) result).getValue()); - } else if (result instanceof Boolean) { - return (boolean) result ? 1 : 0; - } else if (result instanceof PythonAbstractNativeObject) { - throw CompilerDirectives.shouldNotReachHere("Cannot convert native result from __index__"); - } else { - throw CompilerDirectives.shouldNotReachHere("Unexpected type returned from __index__"); + @GenerateInline(false) // Slow path + @GenerateUncached + abstract static class CheckIndexResultNotInt extends Node { + abstract Object execute(VirtualFrame frame, Object original, Object result); + + @Specialization + static Object doGeneric(VirtualFrame frame, Object original, Object result, + @Bind("this") Node inliningTarget, + @Cached GetClassNode getClassNode, + @Cached IsSubtypeNode isSubtype, + @Cached PRaiseNode raiseNode, + @Cached WarningsModuleBuiltins.WarnNode warnNode, + @Cached PyLongCopy copy) { + if (!isSubtype.execute(getClassNode.execute(inliningTarget, result), PythonBuiltinClassType.PInt)) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.INDEX_RETURNED_NON_INT, result); + } + warnNode.warnFormat(frame, null, DeprecationWarning, 1, + ErrorMessages.WARN_P_RETURNED_NON_P, original, T___INDEX__, "int", result, "int"); + return copy.execute(inliningTarget, result); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInvertNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInvertNode.java new file mode 100644 index 0000000000..fd35b6dddb --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberInvertNode.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotUnaryFunc.CallSlotUnaryNode; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.expression.UnaryOpNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateUncached +@GenerateInline(false) +@OperationProxy.Proxyable +public abstract class PyNumberInvertNode extends UnaryOpNode { + + @Specialization + public static int doInt(int object) { + return ~object; + } + + @Specialization + public static long doLong(long object) { + return ~object; + } + + @Fallback + @InliningCutoff + public static Object doObject(VirtualFrame frame, Object object, + @Bind Node inliningTarget, + @Cached GetClassNode getClassNode, + @Cached GetCachedTpSlotsNode getSlots, + @Cached CallSlotUnaryNode callSlot, + @Cached PRaiseNode raiseNode) { + Object type = getClassNode.execute(inliningTarget, object); + TpSlots slots = getSlots.execute(inliningTarget, type); + if (slots.nb_invert() != null) { + return callSlot.execute(frame, inliningTarget, slots.nb_invert(), object); + } + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.BAD_OPERAND_FOR, "unary", "~", object); + } + + @NeverDefault + public static PyNumberInvertNode create() { + return PyNumberInvertNodeGen.create(); + } + + public static PyNumberInvertNode getUncached() { + return PyNumberInvertNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberLongNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberLongNode.java new file mode 100644 index 0000000000..7023f671ae --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberLongNode.java @@ -0,0 +1,267 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___INT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.J___TRUNC__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___TRUNC__; +import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; + +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; +import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary; +import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotUnaryFunc.CallSlotUnaryNode; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PNodeWithContext; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode; +import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; +import com.oracle.graal.python.nodes.call.special.MaybeBindDescriptorNode; +import com.oracle.graal.python.nodes.classes.IsSubtypeNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.runtime.IndirectCallData; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.exception.AbstractTruffleException; +import com.oracle.truffle.api.frame.Frame; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.library.CachedLibrary; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.strings.TruffleString; + +/** + * Equivalent of CPython's {@code PyNumber_Long}. Converts objects to Python int using their + * {@code __int__} or {@code __index__} or {@code __trunc__} methods. Raises {@code TypeError} if + * they don't have any. + */ +@GenerateUncached +@GenerateCached(false) +@GenerateInline +public abstract class PyNumberLongNode extends PNodeWithContext { + public abstract Object execute(Frame frame, Node inliningTarget, Object object); + + public static Object executeUncached(Object object) { + return PyNumberLongNodeGen.getUncached().execute(null, null, object); + } + + @Specialization + static int doInt(int object) { + return object; + } + + @Specialization + static long doLong(long object) { + return object; + } + + @Specialization(guards = "isBuiltinPInt(object)") + static PInt doPInt(PInt object) { + return object; + } + + @Specialization + static Object doDouble(Node inliningTarget, double object, + @Cached PyLongFromDoubleNode fromDoubleNode) { + return fromDoubleNode.execute(inliningTarget, object); + } + + @Specialization + static Object doString(Node inliningTarget, TruffleString string, + @Cached PyLongFromUnicodeObject fromUnicodeObject) { + return fromUnicodeObject.execute(inliningTarget, string, 10); + } + + @Fallback + @InliningCutoff + static Object doOther(VirtualFrame frame, Node inliningTarget, Object object, + @Cached GetClassNode getClassNode, + @Cached GetCachedTpSlotsNode getSlots, + @Cached CallSlotUnaryNode callInt, + @Cached PyLongCheckExactNode longCheckExactNode, + @Cached PyNumberIndexNode indexNode, + @Cached HandleIntResult handleIntResult, + @Cached ComplexCasesHelperNode helperNode) { + Object type = getClassNode.execute(inliningTarget, object); + TpSlots slots = getSlots.execute(inliningTarget, type); + if (slots.nb_int() != null) { + Object result = callInt.execute(frame, inliningTarget, slots.nb_int(), object); + if (longCheckExactNode.execute(inliningTarget, result)) { + return result; + } + return handleIntResult(frame, object, handleIntResult, result); + } + if (slots.nb_index() != null) { + return indexNode.execute(frame, inliningTarget, object); + } + return complexCase(frame, object, helperNode); + } + + @InliningCutoff + private static Object handleIntResult(VirtualFrame frame, Object object, HandleIntResult handleIntResult, Object result) { + return handleIntResult.execute(frame, object, result); + } + + @InliningCutoff + private static Object complexCase(VirtualFrame frame, Object object, ComplexCasesHelperNode helperNode) { + return helperNode.execute(frame, object); + } + + @GenerateInline(false) // Slow path + @GenerateUncached + abstract static class HandleIntResult extends Node { + abstract Object execute(VirtualFrame frame, Object original, Object result); + + @Specialization + static Object doGeneric(VirtualFrame frame, Object original, Object result, + @Bind("this") Node inliningTarget, + @Cached GetClassNode getClassNode, + @Cached IsSubtypeNode isSubtype, + @Cached PRaiseNode raiseNode, + @Cached WarningsModuleBuiltins.WarnNode warnNode, + @Cached PyLongCopy copy) { + if (!isSubtype.execute(getClassNode.execute(inliningTarget, result), PythonBuiltinClassType.PInt)) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.RETURNED_NON_INT, J___INT__, result); + } + warnNode.warnFormat(frame, null, PythonBuiltinClassType.DeprecationWarning, 1, + ErrorMessages.WARN_P_RETURNED_NON_P, original, J___INT__, "int", result, "int"); + return copy.execute(inliningTarget, result); + } + } + + @GenerateInline(false) // Slow path + @GenerateUncached + abstract static class ComplexCasesHelperNode extends Node { + abstract Object execute(VirtualFrame frame, Object object); + + @Specialization + static Object doGeneric(VirtualFrame frame, Object object, + @Bind("this") Node inliningTarget, + @Cached GetClassNode getClassNode, + @Cached LookupAttributeInMRONode.Dynamic lookup, + @Cached WarningsModuleBuiltins.WarnNode warnNode, + @Cached CallUnaryMethodNode call, + @Cached MaybeBindDescriptorNode bindDescriptorNode, + @Cached PyLongCheckExactNode longCheckExactNode, + @Cached PyLongCheckNode longCheckNode, + @Cached PyLongCopy longCopy, + @Cached PyIndexCheckNode indexCheckNode, + @Cached PyNumberIndexNode indexNode, + @Cached PyUnicodeCheckNode unicodeCheckNode, + @Cached PyLongFromUnicodeObject fromUnicodeObject, + @Cached LongFromBufferNode fromBufferNode, + @Cached PRaiseNode raiseNode) { + Object type = getClassNode.execute(inliningTarget, object); + Object truncMethod = lookup.execute(type, T___TRUNC__); + if (truncMethod != PNone.NO_VALUE) { + truncMethod = bindDescriptorNode.execute(frame, inliningTarget, truncMethod, object, type); + warnNode.warnEx(frame, PythonBuiltinClassType.DeprecationWarning, + ErrorMessages.WARN_DELEGATION_OF_INT_TO_TRUNC_IS_DEPRECATED, 1); + Object result = call.executeObject(frame, truncMethod, object); + if (longCheckExactNode.execute(inliningTarget, result)) { + return result; + } + if (longCheckNode.execute(inliningTarget, result)) { + return longCopy.execute(inliningTarget, result); + } + if (!indexCheckNode.execute(inliningTarget, result)) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.RETURNED_NON_INTEGRAL, J___TRUNC__, result); + } + return indexNode.execute(frame, inliningTarget, result); + } + + if (unicodeCheckNode.execute(inliningTarget, object)) { + return fromUnicodeObject.execute(inliningTarget, object, 10); + } + + Object result = fromBufferNode.execute(frame, object, 10); + if (result != null) { + return result; + } + + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ARG_MUST_BE_STRING_OR_BYTELIKE_OR_NUMBER, "int()", object); + } + } + + @GenerateInline(false) // Uncommon case + @GenerateUncached + public abstract static class LongFromBufferNode extends Node { + public abstract Object execute(VirtualFrame frame, Object object, int base); + + @Specialization + @InliningCutoff + static Object doGeneric(VirtualFrame frame, Object object, int base, + @Bind("this") Node inliningTarget, + @Cached TruffleString.FromByteArrayNode fromByteArrayNode, + @Cached TruffleString.SwitchEncodingNode switchEncodingNode, + @Cached PyLongFromUnicodeObject fromString, + @Cached(value = "createFor(this)") IndirectCallData indirectCallData, + @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib, + @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib) { + Object buffer; + try { + buffer = acquireLib.acquireReadonly(object, frame, indirectCallData); + } catch (AbstractTruffleException e) { + return null; + } + try { + byte[] bytes = bufferLib.getInternalOrCopiedByteArray(buffer); + int len = bufferLib.getBufferLength(buffer); + TruffleString string = fromByteArrayNode.execute(bytes, 0, len, TruffleString.Encoding.US_ASCII, false); + string = switchEncodingNode.execute(string, TS_ENCODING); + return fromString.execute(inliningTarget, string, base, bytes, len); + } finally { + bufferLib.release(buffer); + } + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberLshiftNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberLshiftNode.java new file mode 100644 index 0000000000..df9e53e00f --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberLshiftNode.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.ReversibleSlot; +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +// TODO: should inherit from PyNumberLshiftFastPathsBase, blocked by GR-64005 +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberLshiftNode extends BinaryOpNode { + + @Specialization // (replaces = {"doII", "doLL"}) + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, ReversibleSlot.NB_LSHIFT, "<<"); + } + + @NeverDefault + public static PyNumberLshiftNode create() { + return PyNumberLshiftNodeGen.create(); + } + + public static PyNumberLshiftNode getUncached() { + return PyNumberLshiftNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberMatrixMultiplyNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberMatrixMultiplyNode.java new file mode 100644 index 0000000000..bdc6dbfbe7 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberMatrixMultiplyNode.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.ReversibleSlot; +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@OperationProxy.Proxyable +@GenerateUncached +public abstract class PyNumberMatrixMultiplyNode extends BinaryOpNode { + + @Specialization + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, ReversibleSlot.NB_MATRIX_MULTIPLY, "@"); + } + + @NeverDefault + public static PyNumberMatrixMultiplyNode create() { + return PyNumberMatrixMultiplyNodeGen.create(); + } + + public static PyNumberMatrixMultiplyNode getUncached() { + return PyNumberMatrixMultiplyNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberMultiplyNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberMultiplyNode.java index 2f58fa3bce..a7d60a4e5f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberMultiplyNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberMultiplyNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,85 +40,35 @@ */ package com.oracle.graal.python.lib; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import static com.oracle.graal.python.lib.CallBinaryOpNode.raiseNotSupported; + import com.oracle.graal.python.builtins.objects.PNotImplemented; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpSlot; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.CallSlotSizeArgFun; -import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.ReversibleSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberMultiplyFastPathsBase; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.PRaiseNode.Lazy; -import com.oracle.graal.python.nodes.expression.BinaryOpNode; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.nodes.UnexpectedResultException; import com.oracle.truffle.api.profiles.InlinedBranchProfile; -@GenerateInline(inlineByDefault = true) -public abstract class PyNumberMultiplyNode extends BinaryOpNode { - public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object v, Object w); - - @Override - public final Object executeObject(VirtualFrame frame, Object left, Object right) { - return executeCached(frame, left, right); - } - - public final Object executeCached(VirtualFrame frame, Object v, Object w) { - return execute(frame, this, v, w); - } - - public abstract int executeInt(VirtualFrame frame, Node inliningTarget, int left, int right) throws UnexpectedResultException; - - public abstract double executeDouble(VirtualFrame frame, Node inliningTarget, double left, double right) throws UnexpectedResultException; - - /* - * All the following fast paths need to be kept in sync with the corresponding builtin functions - * in IntBuiltins, FloatBuiltins, ListBuiltins, ... - */ - - @Specialization(rewriteOn = ArithmeticException.class) - public static int doII(int x, int y) throws ArithmeticException { - return Math.multiplyExact(x, y); - } - - @Specialization(replaces = "doII") - public static long doIIL(int x, int y) { - return x * (long) y; - } - - @Specialization(rewriteOn = ArithmeticException.class) - public static long doLL(long x, long y) { - return Math.multiplyExact(x, y); - } - - @Specialization - public static double doDL(double left, long right) { - return left * right; - } - - @Specialization - public static double doLD(long left, double right) { - return left * right; - } - - @Specialization - public static double doDD(double left, double right) { - return left * right; - } +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberMultiplyNode extends PyNumberMultiplyFastPathsBase { @Fallback - static Object doIt(VirtualFrame frame, Node inliningTarget, Object v, Object w, + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, @Exclusive @Cached GetClassNode getVClass, @Cached GetCachedTpSlotsNode getVSlots, @Cached GetCachedTpSlotsNode getWSlots, @@ -127,60 +77,33 @@ static Object doIt(VirtualFrame frame, Node inliningTarget, Object v, Object w, @Cached InlinedBranchProfile hasNbMulResult, @Cached InlinedBranchProfile vHasSqRepeat, @Cached InlinedBranchProfile wHasSqRepeat, - @Cached PyIndexCheckNode indexCheckNode, - @Cached PyNumberAsSizeNode asSizeNode, - @Cached CallSlotSizeArgFun callSlotNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached SequenceRepeatHelperNode sequenceRepeatNode, + @Cached PRaiseNode raiseNode) { Object classV = getVClass.execute(inliningTarget, v); Object classW = getWClass.execute(inliningTarget, w); TpSlots slotsV = getVSlots.execute(inliningTarget, classV); TpSlots slotsW = getWSlots.execute(inliningTarget, classW); - TpSlot slotV = slotsV.nb_multiply(); - TpSlot slotW = slotsW.nb_multiply(); - if (slotV != null || slotW != null) { - Object result = callBinaryOp1Node.execute(frame, inliningTarget, v, classV, slotV, w, classW, slotW, BinaryOpSlot.NB_MULTIPLY); - if (result != PNotImplemented.NOT_IMPLEMENTED) { - hasNbMulResult.enter(inliningTarget); - return result; - } + Object result = callBinaryOp1Node.execute(frame, inliningTarget, v, classV, slotsV, w, classW, slotsW, ReversibleSlot.NB_MULTIPLY); + if (result != PNotImplemented.NOT_IMPLEMENTED) { + hasNbMulResult.enter(inliningTarget); + return result; } if (slotsV.sq_repeat() != null) { vHasSqRepeat.enter(inliningTarget); - return sequenceRepeat(frame, inliningTarget, slotsV.sq_repeat(), v, w, - indexCheckNode, asSizeNode, callSlotNode, raiseNode); + return sequenceRepeatNode.execute(frame, slotsV.sq_repeat(), v, w); } else if (slotsW.sq_repeat() != null) { wHasSqRepeat.enter(inliningTarget); - return sequenceRepeat(frame, inliningTarget, slotsW.sq_repeat(), w, v, - indexCheckNode, asSizeNode, callSlotNode, raiseNode); - } - return raiseNotSupported(inliningTarget, v, w, raiseNode); - } - - @InliningCutoff - private static PException raiseNotSupported(Node inliningTarget, Object v, Object w, Lazy raiseNode) { - return raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_FOR_S_P_AND_P, "+", v, w); - } - - private static Object sequenceRepeat(VirtualFrame frame, Node inliningTarget, TpSlot slot, Object seq, Object n, - PyIndexCheckNode indexCheckNode, - PyNumberAsSizeNode asSizeNode, - CallSlotSizeArgFun callSlotNode, - PRaiseNode.Lazy raiseNode) { - if (indexCheckNode.execute(inliningTarget, n)) { - int count = asSizeNode.execute(frame, inliningTarget, n, PythonBuiltinClassType.OverflowError); - return callSlotNode.execute(frame, inliningTarget, slot, seq, count); - } else { - throw raiseNonIntSqMul(inliningTarget, n, raiseNode); + return sequenceRepeatNode.execute(frame, slotsW.sq_repeat(), w, v); } - } - - @InliningCutoff - private static PException raiseNonIntSqMul(Node inliningTarget, Object n, Lazy raiseNode) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.CANT_MULTIPLY_SEQ_BY_NON_INT, n); + return raiseNotSupported(inliningTarget, v, w, "*", raiseNode); } @NeverDefault public static PyNumberMultiplyNode create() { return PyNumberMultiplyNodeGen.create(); } + + public static PyNumberMultiplyNode getUncached() { + return PyNumberMultiplyNodeGen.getUncached(); + } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberNegativeNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberNegativeNode.java new file mode 100644 index 0000000000..399fe6c422 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberNegativeNode.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotUnaryFunc.CallSlotUnaryNode; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.expression.UnaryOpNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateUncached +@GenerateInline(false) +@OperationProxy.Proxyable +public abstract class PyNumberNegativeNode extends UnaryOpNode { + + public static final int INT_MIN_VALUE = Integer.MIN_VALUE; + public static final long LONG_MIN_VALUE = Long.MIN_VALUE; + + @Specialization(guards = "object != INT_MIN_VALUE") + public static int doInt(int object) { + return -object; + } + + @Specialization(guards = "object == INT_MIN_VALUE") + public static long doIntMin(@SuppressWarnings("unused") int object) { + return -(long) INT_MIN_VALUE; + } + + @Specialization(guards = "object != LONG_MIN_VALUE") + public static long doLong(long object) { + return -object; + } + + @Specialization + public static double doDouble(double object) { + return -object; + } + + @Fallback + @InliningCutoff + public static Object doObject(VirtualFrame frame, Object object, + @Bind Node inliningTarget, + @Cached GetClassNode getClassNode, + @Cached GetCachedTpSlotsNode getSlots, + @Cached CallSlotUnaryNode callSlot, + @Cached PRaiseNode raiseNode) { + Object type = getClassNode.execute(inliningTarget, object); + TpSlots slots = getSlots.execute(inliningTarget, type); + if (slots.nb_negative() != null) { + return callSlot.execute(frame, inliningTarget, slots.nb_negative(), object); + } + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.BAD_OPERAND_FOR, "unary", "-", object); + } + + @NeverDefault + public static PyNumberNegativeNode create() { + return PyNumberNegativeNodeGen.create(); + } + + public static PyNumberNegativeNode getUncached() { + return PyNumberNegativeNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberOrNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberOrNode.java new file mode 100644 index 0000000000..a91292e253 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberOrNode.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.ReversibleSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberOrFastPathsBase; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberOrNode extends PyNumberOrFastPathsBase { + + @Fallback + @InliningCutoff + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, ReversibleSlot.NB_OR, "|"); + } + + @NeverDefault + public static PyNumberOrNode create() { + return PyNumberOrNodeGen.create(); + } + + public static PyNumberOrNode getUncached() { + return PyNumberOrNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberPositiveNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberPositiveNode.java new file mode 100644 index 0000000000..6689a5b541 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberPositiveNode.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotUnaryFunc.CallSlotUnaryNode; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.expression.UnaryOpNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateUncached +@GenerateInline(false) +@OperationProxy.Proxyable +public abstract class PyNumberPositiveNode extends UnaryOpNode { + + @Specialization + public static Object doNumber(Number object) { + return object; + } + + @Fallback + @InliningCutoff + public static Object doObject(VirtualFrame frame, Object object, + @Bind Node inliningTarget, + @Cached GetClassNode getClassNode, + @Cached GetCachedTpSlotsNode getSlots, + @Cached CallSlotUnaryNode callSlot, + @Cached PRaiseNode raiseNode) { + Object type = getClassNode.execute(inliningTarget, object); + TpSlots slots = getSlots.execute(inliningTarget, type); + if (slots.nb_positive() != null) { + return callSlot.execute(frame, inliningTarget, slots.nb_positive(), object); + } + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.BAD_OPERAND_FOR, "unary", "+", object); + } + + @NeverDefault + public static PyNumberPositiveNode create() { + return PyNumberPositiveNodeGen.create(); + } + + public static PyNumberPositiveNode getUncached() { + return PyNumberPositiveNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberPowerNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberPowerNode.java new file mode 100644 index 0000000000..2b7d4848b3 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberPowerNode.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberPowerNode extends BinaryOpNode { + public abstract Object execute(VirtualFrame frame, Object v, Object w, Object z); + + @Override + public final Object execute(VirtualFrame frame, Object left, Object right) { + return execute(frame, left, right, PNone.NONE); + } + + @Specialization + public static Object doIt(VirtualFrame frame, Object v, Object w, Object z, + @Bind Node inliningTarget, + @Cached GetClassNode getVClass, + @Cached GetClassNode getWClass, + @Cached GetCachedTpSlotsNode getVSlots, + @Cached GetCachedTpSlotsNode getWSlots, + @Cached CallTernaryOpNode callTernaryOpNode, + @Cached PRaiseNode raiseNode) { + Object classV = getVClass.execute(inliningTarget, v); + Object classW = getWClass.execute(inliningTarget, w); + TpSlot slotV = getVSlots.execute(inliningTarget, classV).nb_power(); + TpSlot slotW = getWSlots.execute(inliningTarget, classW).nb_power(); + Object result = callTernaryOpNode.execute(frame, inliningTarget, v, classV, slotV, w, classW, slotW, z); + if (result != PNotImplemented.NOT_IMPLEMENTED) { + return result; + } + return raiseNotSupported(inliningTarget, v, w, z, raiseNode); + } + + @InliningCutoff + private static PException raiseNotSupported(Node inliningTarget, Object v, Object w, Object z, PRaiseNode raiseNode) { + if (z == PNone.NONE) { + return raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_FOR_S_P_AND_P, "** or pow()", v, w); + } else { + return raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_FOR_S_P_P_P, "** or pow()", v, w, z); + } + } + + @NeverDefault + public static PyNumberPowerNode create() { + return PyNumberPowerNodeGen.create(); + } + + public static PyNumberPowerNode getUncached() { + return PyNumberPowerNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberRemainderNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberRemainderNode.java new file mode 100644 index 0000000000..88dee651ef --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberRemainderNode.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.ReversibleSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberRemainderFastPathsBase; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberRemainderNode extends PyNumberRemainderFastPathsBase { + + @Fallback + @InliningCutoff + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, ReversibleSlot.NB_REMAINDER, "%"); + } + + @NeverDefault + public static PyNumberRemainderNode create() { + return PyNumberRemainderNodeGen.create(); + } + + public static PyNumberRemainderNode getUncached() { + return PyNumberRemainderNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberRshiftNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberRshiftNode.java new file mode 100644 index 0000000000..9ede62d455 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberRshiftNode.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import static com.oracle.graal.python.nodes.BuiltinNames.T_PRINT; +import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; + +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.ReversibleSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberRshiftFastPathsBase; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberRshiftNode extends PyNumberRshiftFastPathsBase { + + @Fallback + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached GetClassNode getVClass, + @Cached GetCachedTpSlotsNode getVSlots, + @Cached GetCachedTpSlotsNode getWSlots, + @Cached GetClassNode getWClass, + @Cached CallBinaryOp1Node callBinaryOp1Node, + @Cached PRaiseNode raiseNode) { + Object classV = getVClass.execute(inliningTarget, v); + Object classW = getWClass.execute(inliningTarget, w); + TpSlots slotsV = getVSlots.execute(inliningTarget, classV); + TpSlots slotsW = getWSlots.execute(inliningTarget, classW); + Object result = callBinaryOp1Node.execute(frame, inliningTarget, v, classV, slotsV, w, classW, slotsW, ReversibleSlot.NB_RSHIFT); + if (result != PNotImplemented.NOT_IMPLEMENTED) { + return result; + } + throw raiseNotSupported(inliningTarget, v, w, raiseNode); + } + + @InliningCutoff + private static PException raiseNotSupported(Node inliningTarget, Object v, Object w, PRaiseNode raiseNode) { + if (v instanceof PBuiltinMethod) { + handlePossiblePrint(inliningTarget, v, w); + } + return raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_FOR_S_P_AND_P, ">>", v, w); + } + + @TruffleBoundary + private static void handlePossiblePrint(Node inliningTarget, Object v, Object w) { + if (v instanceof PBuiltinMethod method && method.getBuiltinFunction().getName().equalsUncached(T_PRINT, TS_ENCODING)) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_FOR_S_P_AND_P_PRINT, ">>", v, w); + } + } + + @NeverDefault + public static PyNumberRshiftNode create() { + return PyNumberRshiftNodeGen.create(); + } + + public static PyNumberRshiftNode getUncached() { + return PyNumberRshiftNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberSubtractNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberSubtractNode.java new file mode 100644 index 0000000000..ee8db9dad3 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberSubtractNode.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.ReversibleSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberSubtractFastPathsBase; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberSubtractNode extends PyNumberSubtractFastPathsBase { + + @Fallback + @InliningCutoff + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, ReversibleSlot.NB_SUBTRACT, "-"); + } + + @NeverDefault + public static PyNumberSubtractNode create() { + return PyNumberSubtractNodeGen.create(); + } + + public static PyNumberSubtractNode getUncached() { + return PyNumberSubtractNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberTrueDivideNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberTrueDivideNode.java new file mode 100644 index 0000000000..b63c97a07c --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberTrueDivideNode.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.ReversibleSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberTrueDivideFastPathsBase; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberTrueDivideNode extends PyNumberTrueDivideFastPathsBase { + + @Fallback + @InliningCutoff + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, ReversibleSlot.NB_TRUE_DIVIDE, "/"); + } + + @NeverDefault + public static PyNumberTrueDivideNode create() { + return PyNumberTrueDivideNodeGen.create(); + } + + public static PyNumberTrueDivideNode getUncached() { + return PyNumberTrueDivideNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberXorNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberXorNode.java new file mode 100644 index 0000000000..e58dd7d03d --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyNumberXorNode.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.ReversibleSlot; +import com.oracle.graal.python.lib.fastpath.PyNumberXorFastPathsBase; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +@OperationProxy.Proxyable +public abstract class PyNumberXorNode extends PyNumberXorFastPathsBase { + + @Fallback + @InliningCutoff + public static Object doIt(VirtualFrame frame, Object v, Object w, + @Bind Node inliningTarget, + @Cached CallBinaryOpNode callBinaryOpNode) { + return callBinaryOpNode.execute(frame, inliningTarget, v, w, ReversibleSlot.NB_XOR, "^"); + } + + @NeverDefault + public static PyNumberXorNode create() { + return PyNumberXorNodeGen.create(); + } + + public static PyNumberXorNode getUncached() { + return PyNumberXorNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyOSFSPathNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyOSFSPathNode.java index 9e7c546a56..dd49945815 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyOSFSPathNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyOSFSPathNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -94,17 +94,17 @@ static Object callFspath(VirtualFrame frame, Node inliningTarget, Object object, @Cached GetClassNode getClassNode, @Cached LookupSpecialMethodNode.Dynamic lookupFSPath, @Cached(inline = false) CallUnaryMethodNode callFSPath, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object type = getClassNode.execute(inliningTarget, object); Object fspathMethod = lookupFSPath.execute(frame, inliningTarget, type, T___FSPATH__, object); if (fspathMethod == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.EXPECTED_STR_BYTE_OSPATHLIKE_OBJ, object); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.EXPECTED_STR_BYTE_OSPATHLIKE_OBJ, object); } Object result = callFSPath.executeObject(frame, fspathMethod, object); assert !isJavaString(result); if (result instanceof TruffleString || result instanceof PString || result instanceof PBytes) { return result; } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.EXPECTED_FSPATH_TO_RETURN_STR_OR_BYTES, object, result); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.EXPECTED_FSPATH_TO_RETURN_STR_OR_BYTES, object, result); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectAsFileDescriptor.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectAsFileDescriptor.java index c3c9d73083..3efcae5e8c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectAsFileDescriptor.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectAsFileDescriptor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -71,7 +71,7 @@ public abstract class PyObjectAsFileDescriptor extends PNodeWithContext { @Specialization static int doInt(Node inliningTarget, @SuppressWarnings("unused") int object, - @Exclusive @Cached PRaiseNode.Lazy raise) { + @Exclusive @Cached PRaiseNode raise) { return checkResult(object, inliningTarget, raise); } @@ -79,7 +79,7 @@ static int doInt(Node inliningTarget, @SuppressWarnings("unused") int object, static int doPyLong(VirtualFrame frame, @SuppressWarnings("unused") Node inliningTarget, Object object, @SuppressWarnings("unused") @Exclusive @Cached PyLongCheckNode longCheckNode, @Exclusive @Cached PyLongAsIntNode asIntNode, - @Exclusive @Cached PRaiseNode.Lazy raise) { + @Exclusive @Cached PRaiseNode raise) { return checkResult(asIntNode.execute(frame, inliningTarget, object), inliningTarget, raise); } @@ -89,21 +89,21 @@ static int doNotLong(VirtualFrame frame, Node inliningTarget, Object object, @Cached(inline = false) CallNode callFileno, @Exclusive @Cached PyLongCheckNode checkResultNode, @Exclusive @Cached PyLongAsIntNode asIntNode, - @Exclusive @Cached PRaiseNode.Lazy raise) { + @Exclusive @Cached PRaiseNode raise) { Object filenoMethod = lookupFileno.execute(frame, inliningTarget, object, T_FILENO); if (filenoMethod != PNone.NO_VALUE) { Object result = callFileno.execute(frame, filenoMethod); if (checkResultNode.execute(inliningTarget, result)) { return checkResult(asIntNode.execute(frame, inliningTarget, result), inliningTarget, raise); } - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.RETURNED_NON_INTEGER, "fileno()"); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.RETURNED_NON_INTEGER, "fileno()"); } - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.ARG_MUST_BE_INT_OR_HAVE_FILENO_METHOD); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.ARG_MUST_BE_INT_OR_HAVE_FILENO_METHOD); } - private static int checkResult(int result, Node inliningTarget, PRaiseNode.Lazy raiseNode) { + private static int checkResult(int result, Node inliningTarget, PRaiseNode raiseNode) { if (result < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.S_CANNOT_BE_NEGATIVE_INTEGER_D, "file descriptor", result); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.S_CANNOT_BE_NEGATIVE_INTEGER_D, "file descriptor", result); } return result; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectCallMethodObjArgs.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectCallMethodObjArgs.java index 7694f46cfe..b846cc4d38 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectCallMethodObjArgs.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectCallMethodObjArgs.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,7 +41,6 @@ package com.oracle.graal.python.lib; import com.oracle.graal.python.builtins.objects.function.PKeyword; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.nodes.call.BoundDescriptor; import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode; @@ -55,7 +54,6 @@ import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; @@ -69,7 +67,6 @@ @GenerateUncached @GenerateCached @GenerateInline(inlineByDefault = true) -@ImportStatic(SpecialMethodSlot.class) public abstract class PyObjectCallMethodObjArgs extends Node { public static Object executeUncached(Object receiver, TruffleString name, Object... arguments) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectDelItem.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectDelItem.java index 643f98bf6a..dc74ce0ebe 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectDelItem.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectDelItem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,16 +43,21 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.list.ListBuiltins; +import com.oracle.graal.python.builtins.objects.list.PList; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotMpAssSubscript.CallSlotMpAssSubscriptNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqAssItem.CallSlotSqAssItemNode; +import com.oracle.graal.python.lib.PySequenceGetItemNode.IndexForSqSlot; import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; -import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; -import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; +import com.oracle.truffle.api.dsl.Cached.Exclusive; +import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; @@ -69,7 +74,7 @@ @GenerateUncached @GenerateCached @GenerateInline(inlineByDefault = true) -@ImportStatic(SpecialMethodSlot.class) +@ImportStatic(PGuards.class) public abstract class PyObjectDelItem extends Node { public final void executeCached(Frame frame, Object container, Object index) { execute(frame, this, container, index); @@ -77,31 +82,54 @@ public final void executeCached(Frame frame, Object container, Object index) { public abstract void execute(Frame frame, Node inliningTarget, Object container, Object index); - @Specialization - static void doWithFrame(VirtualFrame frame, Node inliningTarget, Object primary, Object index, - @Shared("getclass") @Cached GetClassNode getClassNode, - @Cached("create(DelItem)") LookupSpecialMethodSlotNode lookupDelitem, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raise, - @Shared("callNode") @Cached(inline = false) CallBinaryMethodNode callDelitem) { - Object delitem = lookupDelitem.execute(frame, getClassNode.execute(inliningTarget, primary), primary); - if (delitem == PNone.NO_VALUE) { - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.OBJ_DOESNT_SUPPORT_DELETION, primary); - } - callDelitem.executeObject(frame, delitem, primary, index); + @Specialization(guards = "isBuiltinList(object)") + static void doList(VirtualFrame frame, PList object, Object key, + @Cached(inline = false) ListBuiltins.SetSubscriptNode setItemNode) { + setItemNode.executeVoid(frame, object, key, PNone.NO_VALUE); } - @Specialization(replaces = "doWithFrame") @InliningCutoff - static void doGeneric(Node inliningTarget, Object primary, Object index, - @Shared("getclass") @Cached GetClassNode getClassNode, - @Cached(parameters = "DelItem", inline = false) LookupCallableSlotInMRONode lookupDelitem, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raise, - @Shared("callNode") @Cached(inline = false) CallBinaryMethodNode callDelitem) { - Object setitem = lookupDelitem.execute(getClassNode.execute(inliningTarget, primary)); - if (setitem == PNone.NO_VALUE) { - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.OBJ_DOESNT_SUPPORT_DELETION, primary); + @Specialization(replaces = "doList") + static void doGeneric(VirtualFrame frame, Node inliningTarget, Object object, Object key, + @Cached GetObjectSlotsNode getSlotsNode, + @Cached PyObjectDelItemGeneric genericNode) { + TpSlots slots = getSlotsNode.execute(inliningTarget, object); + genericNode.execute(frame, inliningTarget, object, slots, key); + } + + @GenerateUncached + @GenerateInline + @GenerateCached(false) + abstract static class PyObjectDelItemGeneric extends Node { + public abstract void execute(Frame frame, Node inliningTarget, Object object, TpSlots objectKlassSlots, Object key); + + @Specialization(guards = "slots.mp_ass_subscript() != null") + static void doMapping(VirtualFrame frame, Node inliningTarget, Object object, TpSlots slots, Object key, + @Cached CallSlotMpAssSubscriptNode callNode) { + callNode.execute(frame, inliningTarget, slots.mp_ass_subscript(), object, key, PNone.NO_VALUE); + } + + @Specialization(guards = {"slots.mp_ass_subscript() == null", "slots.sq_ass_item() != null", "key >= 0"}) + static void doSequenceFastPath(VirtualFrame frame, Node inliningTarget, Object object, TpSlots slots, int key, + @Exclusive @Cached CallSlotSqAssItemNode callSqItem) { + callSqItem.execute(frame, inliningTarget, slots.sq_ass_item(), object, key, PNone.NO_VALUE); + } + + @Specialization(guards = {"slots.mp_ass_subscript() == null", "slots.sq_ass_item() != null"}, replaces = "doSequenceFastPath") + @InliningCutoff + static void doSequence(VirtualFrame frame, Node inliningTarget, Object object, TpSlots slots, Object key, + @Cached IndexForSqSlot indexForSqSlot, + @Exclusive @Cached CallSlotSqAssItemNode callSqItem) { + int index = indexForSqSlot.execute(frame, inliningTarget, object, slots, key); + callSqItem.execute(frame, inliningTarget, slots.sq_ass_item(), object, index, PNone.NO_VALUE); + } + + @Fallback + @InliningCutoff + static void error(Object object, @SuppressWarnings("unused") TpSlots slots, @SuppressWarnings("unused") Object key, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.OBJ_DOES_NOT_SUPPORT_ITEM_DELETION, object); } - callDelitem.executeObject(null, setitem, primary, index); } @NeverDefault diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectDir.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectDir.java index 2184d0bb60..93f75625cd 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectDir.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectDir.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -71,10 +71,10 @@ static PList dir(VirtualFrame frame, Node inliningTarget, Object object, @Cached(inline = false) ListBuiltins.ListSortNode sortNode, @Cached(inline = false) ListNodes.ConstructListNode constructListNode, @Cached(value = "create(T___DIR__)", inline = false) LookupAndCallUnaryNode callDir, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { Object result = callDir.executeObject(frame, object); if (result == PNone.NO_VALUE) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.OBJ_DOES_NOT_PROVIDE_DIR); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.OBJ_DOES_NOT_PROVIDE_DIR); } PList list = constructListNode.execute(frame, result); sortNode.execute(frame, list); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectFormat.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectFormat.java index c4c295dfea..c4c9f0c51b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectFormat.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectFormat.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,23 +40,20 @@ */ package com.oracle.graal.python.lib; -import static com.oracle.graal.python.builtins.objects.PNone.NO_VALUE; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FORMAT__; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode; +import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodNode; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.util.PythonUtils; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Cached.Shared; @@ -120,32 +117,28 @@ static Object doLong(long obj, Object formatSpec) { // Note: PRaiseNode is @Exclusive to workaround a bug in DSL @Specialization(guards = "isString(formatSpec)") - static Object doGeneric(VirtualFrame frame, Object obj, Object formatSpec, - @Cached(parameters = "Format", inline = false) LookupAndCallBinaryNode callFormat, - @Exclusive @Cached(inline = false) PRaiseNode raiseNode) { - Object res = callFormat.executeObject(frame, obj, formatSpec); - if (res == NO_VALUE) { - throw raiseNode.raise(TypeError, ErrorMessages.TYPE_DOESNT_DEFINE_FORMAT, obj); + static Object doGeneric(VirtualFrame frame, Node inliningTarget, Object obj, Object formatSpec, + @Cached GetClassNode getClassNode, + @Cached LookupSpecialMethodNode.Dynamic lookupFormat, + @Cached CallBinaryMethodNode callFormat, + @Exclusive @Cached PRaiseNode raiseNode) { + Object formatMethod = lookupFormat.execute(frame, inliningTarget, getClassNode.execute(inliningTarget, obj), T___FORMAT__, obj); + if (formatMethod != PNone.NO_VALUE) { + Object res = callFormat.executeObject(frame, obj, formatSpec); + if (!PGuards.isString(res)) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_MUST_RETURN_S_NOT_P, T___FORMAT__, "str", res); + } + return res; + } else { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.TYPE_DOESNT_DEFINE_FORMAT, obj); } - if (!PGuards.isString(res)) { - throw raiseNode.raise(TypeError, ErrorMessages.S_MUST_RETURN_S_NOT_P, T___FORMAT__, "str", res); - } - return res; - } - - @Specialization(guards = "isString(formatSpec)", replaces = "doGeneric") - static Object doGenericUncached(VirtualFrame frame, Object obj, Object formatSpec) { - PythonUtils.assertUncached(); - Object klass = GetClassNode.executeUncached(obj); - Object slot = LookupCallableSlotInMRONode.getUncached(SpecialMethodSlot.Format).execute(klass); - return CallBinaryMethodNode.getUncached().executeObject(frame, slot, obj, formatSpec); } // Note: PRaiseNode is @Exclusive to workaround a bug in DSL @Fallback static Object doNonStringFormat(Object obj, Object formatSpec, - @Exclusive @Cached(inline = false) PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.SystemError, ErrorMessages.S_MUST_BE_S_NOT_P, "Format specifier", "a string", formatSpec); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.SystemError, ErrorMessages.S_MUST_BE_S_NOT_P, "Format specifier", "a string", formatSpec); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetAttr.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetAttr.java index 1cbd75ed35..19944d57aa 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetAttr.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetAttr.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,21 +40,19 @@ */ package com.oracle.graal.python.lib; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.exception.AttributeErrorBuiltins; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotGetAttr.CallSlotGetAttrNode; -import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.attributes.GetAttributeNode.GetFixedAttributeNode; import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.runtime.exception.PException; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; @@ -70,7 +68,6 @@ @GenerateUncached @GenerateInline(inlineByDefault = true) @GenerateCached -@ImportStatic(SpecialMethodSlot.class) public abstract class PyObjectGetAttr extends Node { public static Object executeUncached(Object receiver, TruffleString name) { return PyObjectGetAttr.getUncached().execute(null, null, receiver, name); @@ -99,6 +96,7 @@ static Object getDynamicAttr(Frame frame, Node inliningTarget, Object receiver, @Cached GetClassNode getClass, @Cached GetObjectSlotsNode getSlotsNode, @Cached CallSlotGetAttrNode callGetAttrNode, + @Cached AttributeErrorBuiltins.SetAttributeErrorContext setContext, @Cached(inline = false) TruffleString.CodePointLengthNode codePointLengthNode, @Cached(inline = false) TruffleString.CodePointAtIndexNode codePointAtIndexNode) { Object type = getClass.execute(inliningTarget, receiver); @@ -108,12 +106,16 @@ static Object getDynamicAttr(Frame frame, Node inliningTarget, Object receiver, Object result = PyObjectLookupAttr.readAttributeQuickly(type, slots, receiver, name, codePointLengthNode, codePointAtIndexNode); if (result != null) { if (result == PNone.NO_VALUE) { - throw PRaiseNode.getUncached().raise(PythonBuiltinClassType.AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, receiver, name); + throw PRaiseNode.raiseAttributeErrorStatic(inliningTarget, receiver, name); } return result; } } - return callGetAttrNode.execute((VirtualFrame) frame, inliningTarget, slots, receiver, name); + try { + return callGetAttrNode.execute((VirtualFrame) frame, inliningTarget, slots, receiver, name); + } catch (PException e) { + throw setContext.execute(inliningTarget, e, receiver, name); + } } @NeverDefault diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetAttrO.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetAttrO.java index a2e0f0cd42..86d8f6da84 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetAttrO.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetAttrO.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -84,7 +84,7 @@ static Object getDynamicAttr(Frame frame, Node inliningTarget, Object receiver, Object result = PyObjectLookupAttr.readAttributeQuickly(type, slots, receiver, tsName, codePointLengthNode, codePointAtIndexNode); if (result != null) { if (result == PNone.NO_VALUE) { - throw PRaiseNode.getUncached().raise(PythonBuiltinClassType.AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, receiver, name); + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, receiver, name); } return result; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetItem.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetItem.java index 5dd568f519..fcc826e684 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetItem.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetItem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,11 +40,10 @@ */ package com.oracle.graal.python.lib; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.IndexError; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; -import static com.oracle.graal.python.nodes.ErrorMessages.SEQUENCE_INDEX_MUST_BE_INT_NOT_P; import static com.oracle.graal.python.nodes.SpecialMethodNames.T___CLASS_GETITEM__; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.dict.DictBuiltins; @@ -57,15 +56,14 @@ import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.CallSlotBinaryFuncNode; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.CallSlotLenNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.CallSlotSizeArgFun; +import com.oracle.graal.python.lib.PySequenceGetItemNode.IndexForSqSlot; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.PRaiseNode.Lazy; import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassExactProfile; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; @@ -78,7 +76,6 @@ import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; /** * Equivalent of CPython's {@code PyObject_GetItem}. @@ -127,38 +124,30 @@ static Object doGeneric(VirtualFrame frame, Node inliningTarget, Object object, @GenerateUncached @GenerateInline @GenerateCached(false) - abstract static class PyObjectGetItemGeneric extends PNodeWithContext { + public abstract static class PyObjectGetItemGeneric extends PNodeWithContext { public abstract Object execute(Frame frame, Node inliningTarget, Object object, TpSlots objectKlassSlots, Object key); @Specialization(guards = "slots.mp_subscript() != null") - static Object doMapping(Frame frame, Node inliningTarget, Object object, TpSlots slots, Object key, + static Object doMapping(VirtualFrame frame, Node inliningTarget, Object object, TpSlots slots, Object key, @Cached CallSlotBinaryFuncNode callNode) { - return callNode.execute((VirtualFrame) frame, inliningTarget, slots.mp_subscript(), object, key); + return callNode.execute(frame, inliningTarget, slots.mp_subscript(), object, key); + } + + @Specialization(guards = {"slots.mp_subscript() == null", "slots.sq_item() != null", "key >= 0"}) + static Object doSequenceFastPath(VirtualFrame frame, Node inliningTarget, Object object, TpSlots slots, int key, + @Exclusive @Cached CallSlotSizeArgFun callSqItem) { + return callSqItem.execute(frame, inliningTarget, slots.sq_item(), object, key); } // Note: this is uncommon path, but DSL wouldn't know, so it does not generate // specialization data-class. - @Specialization(guards = {"slots.sq_item() != null", "slots.mp_subscript() == null"}) + @Specialization(guards = {"slots.mp_subscript() == null", "slots.sq_item() != null"}, replaces = "doSequenceFastPath") @InliningCutoff // uncommon case: defining sq_item, but not mp_subscript - static Object doSequence(Frame frame, Node inliningTarget, Object object, TpSlots slots, Object key, - @Exclusive @Cached PRaiseNode.Lazy raiseNode, - @Cached PyIndexCheckNode indexCheckNode, - @Cached PyNumberAsSizeNode asSizeNode, - @Cached InlinedConditionProfile negativeIndexProfile, - @Cached CallSlotLenNode callLenSlot, - @Cached CallSlotSizeArgFun callSqItem) { - - if (!indexCheckNode.execute(inliningTarget, key)) { - raiseSeqIndexMustBeInt(inliningTarget, key, raiseNode); - } - int intKey = asSizeNode.executeExact(frame, inliningTarget, key, IndexError); - return PySequenceGetItemNode.getItem((VirtualFrame) frame, inliningTarget, object, slots, intKey, - negativeIndexProfile, callLenSlot, callSqItem, raiseNode); - } - - @InliningCutoff - private static void raiseSeqIndexMustBeInt(Node inliningTarget, Object key, Lazy raiseNode) { - raiseNode.get(inliningTarget).raise(TypeError, SEQUENCE_INDEX_MUST_BE_INT_NOT_P, key); + static Object doSequence(VirtualFrame frame, Node inliningTarget, Object object, TpSlots slots, Object key, + @Cached IndexForSqSlot indexForSqSlot, + @Exclusive @Cached CallSlotSizeArgFun callSqItem) { + int index = indexForSqSlot.execute(frame, inliningTarget, object, slots, key); + return callSqItem.execute(frame, inliningTarget, slots.sq_item(), object, index); } @Fallback @@ -167,9 +156,8 @@ static Object tryType(VirtualFrame frame, Node inliningTarget, Object maybeType, @Cached TypeNodes.IsTypeNode isTypeNode, @Cached PyObjectLookupAttr lookupClassGetItem, @Cached IsBuiltinClassExactProfile isBuiltinClassProfile, - @Cached(inline = false) PythonObjectFactory factory, @Cached(inline = false) CallNode callClassGetItem, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (isTypeNode.execute(inliningTarget, maybeType)) { Object classGetitem = lookupClassGetItem.execute(frame, inliningTarget, maybeType, T___CLASS_GETITEM__); if (!(classGetitem instanceof PNone)) { @@ -177,11 +165,11 @@ static Object tryType(VirtualFrame frame, Node inliningTarget, Object maybeType, } if (isBuiltinClassProfile.profileClass(inliningTarget, maybeType, PythonBuiltinClassType.PythonClass)) { // Special case type[int], but disallow other types so str[int] fails - return factory.createGenericAlias(maybeType, key); + return PFactory.createGenericAlias(PythonLanguage.get(inliningTarget), maybeType, key); } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.TYPE_NOT_SUBSCRIPTABLE, maybeType); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.TYPE_NOT_SUBSCRIPTABLE, maybeType); } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.OBJ_NOT_SUBSCRIPTABLE, maybeType); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.OBJ_NOT_SUBSCRIPTABLE, maybeType); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetIter.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetIter.java index d6c04509b2..8f76c8c9cd 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetIter.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetIter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,26 +42,25 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; -import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.range.PIntRange; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotUnaryFunc.CallSlotUnaryNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; +import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; /** @@ -70,7 +69,6 @@ @GenerateUncached @GenerateCached @GenerateInline(inlineByDefault = true) -@ImportStatic(SpecialMethodSlot.class) public abstract class PyObjectGetIter extends Node { public static Object executeUncached(Object obj) { return PyObjectGetIterNodeGen.getUncached().execute(null, null, obj); @@ -84,39 +82,33 @@ public final Object executeCached(Frame frame, Object receiver) { @Specialization static Object getIterRange(PIntRange object, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - return factory.createIntRangeIterator(object); + @Bind PythonLanguage language) { + return PFactory.createIntRangeIterator(language, object); } @Specialization @InliningCutoff - static Object getIter(Frame frame, Node inliningTarget, Object receiver, + static Object getIter(VirtualFrame frame, Node inliningTarget, Object receiver, @Cached GetClassNode getReceiverClass, - @Cached(parameters = "Iter", inline = false) LookupSpecialMethodSlotNode lookupIter, + @Cached GetCachedTpSlotsNode getSlots, @Cached PySequenceCheckNode sequenceCheckNode, - @Shared @Cached(inline = false) PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raise, - @Cached(inline = false) CallUnaryMethodNode callIter, + @Cached PRaiseNode raise, + @Cached CallSlotUnaryNode callSlot, @Cached PyIterCheckNode checkNode) { Object type = getReceiverClass.execute(inliningTarget, receiver); - Object iterMethod = PNone.NO_VALUE; - try { - iterMethod = lookupIter.execute(frame, type, receiver); - } catch (PException e) { - // ignore - } - if (iterMethod instanceof PNone) { - if (sequenceCheckNode.execute(inliningTarget, receiver)) { - return factory.createSequenceIterator(receiver); - } - } else { - Object result = callIter.executeObject(frame, iterMethod, receiver); + TpSlots slots = getSlots.execute(inliningTarget, type); + if (slots.tp_iter() != null) { + Object result = callSlot.execute(frame, inliningTarget, slots.tp_iter(), receiver); if (!checkNode.execute(inliningTarget, result)) { - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.RETURNED_NONITER, result); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.RETURNED_NONITER, result); } return result; + } else { + if (sequenceCheckNode.execute(inliningTarget, receiver)) { + return PFactory.createSequenceIterator(PythonLanguage.get(inliningTarget), receiver); + } } - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.OBJ_NOT_ITERABLE, receiver); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.OBJ_NOT_ITERABLE, receiver); } @NeverDefault diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetMethod.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetMethod.java index 3940bb317b..5cc725f3a2 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetMethod.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectGetMethod.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,20 +40,16 @@ */ package com.oracle.graal.python.lib; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError; - import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.PythonAbstractObject; import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.CallSlotDescrGet; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrSet; -import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; @@ -75,7 +71,6 @@ import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; @@ -96,7 +91,6 @@ @GenerateUncached @GenerateInline(inlineByDefault = true) @GenerateCached -@ImportStatic(SpecialMethodSlot.class) public abstract class PyObjectGetMethod extends Node { public final Object executeCached(Frame frame, Object receiver, TruffleString name) { return execute(frame, this, receiver, name); @@ -120,7 +114,7 @@ static Object getFixedAttr(VirtualFrame frame, Node inliningTarget, Object recei @Exclusive @Cached GetObjectSlotsNode getSlotsNode, @Exclusive @Cached CallSlotDescrGet callGetNode, @Shared("readAttr") @Cached(inline = false) ReadAttributeFromObjectNode readAttr, - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Cached InlinedBranchProfile hasDescr, @Cached InlinedBranchProfile returnDataDescr, @Cached InlinedBranchProfile returnAttr, @@ -163,7 +157,7 @@ static Object getFixedAttr(VirtualFrame frame, Node inliningTarget, Object recei if (descr != PNone.NO_VALUE) { return new BoundDescriptor(descr); } - throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, receiver, name); + throw raiseNode.raiseAttributeError(inliningTarget, receiver, name); } // No explicit branch profiling when we're looking up multiple things @@ -178,7 +172,7 @@ static Object getDynamicAttr(Frame frame, Node inliningTarget, Object receiver, @Exclusive @Cached GetObjectSlotsNode getSlotsNode, @Exclusive @Cached CallSlotDescrGet callGetNode, @Shared("readAttr") @Cached(inline = false) ReadAttributeFromObjectNode readAttr, - /* Truffle bug: @Shared("raiseNode") */ @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + /* Truffle bug: @Shared("raiseNode") */ @Exclusive @Cached PRaiseNode raiseNode) { boolean methodFound = false; Object descr = lookupNode.execute(lazyClass, name); TpSlot getMethod = null; @@ -208,7 +202,7 @@ static Object getDynamicAttr(Frame frame, Node inliningTarget, Object receiver, if (descr != PNone.NO_VALUE) { return new BoundDescriptor(descr); } - throw raiseNode.get(inliningTarget).raise(AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, receiver, name); + throw raiseNode.raiseAttributeError(inliningTarget, receiver, name); } @Specialization(guards = "isForeignObject(inliningTarget, isForeignObjectNode, receiver)", limit = "1") diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectHashNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectHashNode.java index 72334ce735..e0e087a41d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectHashNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectHashNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,25 +40,34 @@ */ package com.oracle.graal.python.lib; +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import com.oracle.graal.python.builtins.modules.MathModuleBuiltins; import com.oracle.graal.python.builtins.modules.SysModuleBuiltins; -import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; +import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PCallCapiFunction; +import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.PythonToNativeNode; +import com.oracle.graal.python.builtins.objects.cext.structs.CFields; +import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; +import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess.ReadI64Node; import com.oracle.graal.python.builtins.objects.str.PString; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.TypeFlags; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotHashFun.CallSlotHashFunNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.MaybeBindDescriptorNode; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.nodes.util.CastUnsignedToJavaLongHashNode; +import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext; +import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; @@ -66,14 +75,13 @@ import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.strings.TruffleString; -@ImportStatic(SpecialMethodSlot.class) @GenerateUncached @GenerateCached(false) @GenerateInline @@ -160,34 +168,71 @@ public static long hash(double object) { @Fallback @InliningCutoff - static long hash(VirtualFrame frame, Node inliningTarget, Object object, + static long genericHash(VirtualFrame frame, Node inliningTarget, Object object, @Cached GetClassNode getClassNode, - @Cached(parameters = "Hash", inline = false) LookupCallableSlotInMRONode lookupHash, - @Cached MaybeBindDescriptorNode bindDescriptorNode, - @Cached(inline = false) CallUnaryMethodNode callHash, - @Cached CastUnsignedToJavaLongHashNode cast, - @Cached PRaiseNode.Lazy raiseNode) { - /* This combines the logic from abstract.c:PyObject_Hash and typeobject.c:slot_tp_hash */ - Object type = getClassNode.execute(inliningTarget, object); - // We have to do the lookup and bind steps separately to avoid binding possible None - Object hashDescr = lookupHash.execute(type); - if (hashDescr != PNone.NO_VALUE && hashDescr != PNone.NONE) { - try { - hashDescr = bindDescriptorNode.execute(frame, inliningTarget, hashDescr, object, type); - } catch (PException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.UNHASHABLE_TYPE_P, object); - } - Object result = callHash.executeObject(frame, hashDescr, object); - try { - return avoidNegative1(cast.execute(inliningTarget, result)); - } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.HASH_SHOULD_RETURN_INTEGER); + @Cached GetCachedTpSlotsNode getSlotsNode, + @Cached CStructAccess.ReadI64Node readTypeObjectFieldNode, + @Cached InlinedConditionProfile typeIsNotReadyProfile, + @Cached("createFor(this)") IndirectCallData indirectCallData, + @Cached CallSlotHashFunNode callHashFun, + @Cached PRaiseNode raiseNode) { + Object klass = getClassNode.execute(inliningTarget, object); + TpSlots slots = getSlotsNode.execute(inliningTarget, klass); + if (slots.tp_hash() == null) { + slots = handleNoHash(frame, inliningTarget, object, readTypeObjectFieldNode, + typeIsNotReadyProfile, indirectCallData, raiseNode, klass, slots); + } + return callHashFun.execute(frame, inliningTarget, slots.tp_hash(), object); + } + + @InliningCutoff + private static TpSlots handleNoHash(VirtualFrame frame, Node inliningTarget, Object object, ReadI64Node readTypeObjectFieldNode, + InlinedConditionProfile typeIsNotReadyProfile, + IndirectCallData indirectCallData, PRaiseNode raiseNode, Object klass, TpSlots slots) { + boolean initialized = false; + if (klass instanceof PythonAbstractNativeObject nativeKlass) { + // Comment from CPython: + /* + * To keep to the general practice that inheriting solely from object in C code should + * work without an explicit call to PyType_Ready, we implicitly call PyType_Ready here + * and then check the tp_hash slot again + */ + long flags = readTypeObjectFieldNode.readFromObj(nativeKlass, CFields.PyTypeObject__tp_flags); + if (typeIsNotReadyProfile.profile(inliningTarget, (flags & TypeFlags.READY) == 0)) { + Object savedState = IndirectCallContext.enter(frame, indirectCallData); + try { + slots = callTypeReady(inliningTarget, object, nativeKlass); + initialized = true; + } finally { + IndirectCallContext.exit(frame, indirectCallData, savedState); + } } } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.UNHASHABLE_TYPE_P, object); + if (!initialized) { + throw raiseUnhashable(inliningTarget, object, raiseNode); + } + return slots; } - public static PyObjectHashNode getUncached() { - return PyObjectHashNodeGen.getUncached(); + @TruffleBoundary + private static TpSlots callTypeReady(Node inliningTarget, Object object, PythonAbstractNativeObject klass) { + int res = (int) PCallCapiFunction.getUncached().call(NativeCAPISymbol.FUN_PY_TYPE_READY, PythonToNativeNode.executeUncached(klass)); + if (res < 0) { + throw raiseSystemError(inliningTarget, klass); + } + TpSlots slots = GetTpSlotsNode.executeUncached(klass); + if (slots.tp_hash() == null) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.UNHASHABLE_TYPE_P, object); + } + return slots; + } + + private static PException raiseSystemError(Node inliningTarget, Object klass) { + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, ErrorMessages.LAZY_INITIALIZATION_FAILED, klass); + } + + @InliningCutoff + private static PException raiseUnhashable(Node inliningTarget, Object object, PRaiseNode raiseNode) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.UNHASHABLE_TYPE_P, object); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectIsNotTrueNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectIsNotTrueNode.java new file mode 100644 index 0000000000..27c7af8a60 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectIsNotTrueNode.java @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageLen; +import com.oracle.graal.python.builtins.objects.dict.PDict; +import com.oracle.graal.python.builtins.objects.list.PList; +import com.oracle.graal.python.builtins.objects.set.PBaseSet; +import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.lib.PyObjectIsTrueNode.PyObjectIsTrueNodeGeneric; +import com.oracle.graal.python.nodes.PNodeWithContext; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Exclusive; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.Frame; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.strings.TruffleString; + +/** + * Equivalent of a negation of CPython's {@code PyObject_IsTrue}. This class exists only so that we + * can have quickening fast-paths for this operation. The fast-paths should be synchronized with + * {@link PyObjectIsNotTrueNode}. + */ +@GenerateInline(false) +@OperationProxy.Proxyable +public abstract class PyObjectIsNotTrueNode extends PNodeWithContext { + public abstract boolean execute(Frame frame, Object object); + + @Specialization + public static boolean doBoolean(boolean object) { + return !object; + } + + @Specialization + public static boolean doNone(@SuppressWarnings("unused") PNone object) { + return true; + } + + @Specialization + public static boolean doInt(int object) { + return object == 0; + } + + @Specialization + public static boolean doLong(long object) { + return object == 0; + } + + @Specialization + public static boolean doDouble(double object) { + return object == 0.0; + } + + @Specialization + public static boolean doString(TruffleString object) { + return object.isEmpty(); + } + + @Specialization(guards = "isBuiltinList(object)") + public static boolean doList(PList object) { + return object.getSequenceStorage().length() == 0; + } + + @Specialization(guards = "isBuiltinTuple(object)") + public static boolean doTuple(PTuple object) { + return object.getSequenceStorage().length() == 0; + } + + @Specialization(guards = "isBuiltinDict(object)") + public static boolean doDict(PDict object, + @Bind Node inliningTarget, + @Exclusive @Cached HashingStorageLen lenNode) { + return lenNode.execute(inliningTarget, object.getDictStorage()) == 0; + } + + @Specialization(guards = "isBuiltinAnySet(object)") + @InliningCutoff + public static boolean doSet(PBaseSet object, + @Bind Node inliningTarget, + @Exclusive @Cached HashingStorageLen lenNode) { + return lenNode.execute(inliningTarget, object.getDictStorage()) == 0; + } + + @Specialization(guards = {"!isBoolean(object)", "!isPNone(object)", "!isInt(object)", "!isLong(object)", "!isDouble(object)", "!isTruffleString(object)"}, // + replaces = {"doList", "doTuple", "doDict", "doSet"}) + @InliningCutoff + public static boolean doOthers(VirtualFrame frame, Object object, + @Cached(inline = false) PyObjectIsTrueNodeGeneric internalNode) { + return !internalNode.execute(frame, object); + } + + @NeverDefault + public static PyObjectIsNotTrueNode create() { + return PyObjectIsNotTrueNodeGen.create(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectIsTrueNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectIsTrueNode.java index 1125460072..c4170433d0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectIsTrueNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectIsTrueNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,7 +46,6 @@ import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.set.PBaseSet; import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; @@ -54,13 +53,13 @@ import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.CallSlotLenNode; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; @@ -76,71 +75,67 @@ * to true if neither is defined. */ @GenerateUncached -@GenerateInline(inlineByDefault = true) +@GenerateInline(false) @GenerateCached -@ImportStatic(SpecialMethodSlot.class) +@OperationProxy.Proxyable public abstract class PyObjectIsTrueNode extends PNodeWithContext { - public final boolean executeCached(Frame frame, Object object) { - return execute(frame, this, object); - } - - public abstract boolean execute(Frame frame, Node inliningTarget, Object object); - - protected abstract Object executeObject(Frame frame, Node inliningTarget, Object object); + public abstract boolean execute(Frame frame, Object object); public static boolean executeUncached(Object object) { - return getUncached().execute(null, null, object); + return getUncached().execute(null, object); } @Specialization - static boolean doBoolean(boolean object) { + public static boolean doBoolean(boolean object) { return object; } @Specialization - static boolean doNone(@SuppressWarnings("unused") PNone object) { + public static boolean doNone(@SuppressWarnings("unused") PNone object) { return false; } @Specialization - static boolean doInt(int object) { + public static boolean doInt(int object) { return object != 0; } @Specialization - static boolean doLong(long object) { + public static boolean doLong(long object) { return object != 0; } @Specialization - static boolean doDouble(double object) { + public static boolean doDouble(double object) { return object != 0.0; } @Specialization - static boolean doString(TruffleString object) { + public static boolean doString(TruffleString object) { return !object.isEmpty(); } @Specialization(guards = "isBuiltinList(object)") - static boolean doList(PList object) { + public static boolean doList(PList object) { return object.getSequenceStorage().length() != 0; } @Specialization(guards = "isBuiltinTuple(object)") - static boolean doTuple(PTuple object) { + public static boolean doTuple(PTuple object) { return object.getSequenceStorage().length() != 0; } @Specialization(guards = "isBuiltinDict(object)") - static boolean doDict(Node inliningTarget, PDict object, + public static boolean doDict(PDict object, + @Bind Node inliningTarget, @Exclusive @Cached HashingStorageLen lenNode) { return lenNode.execute(inliningTarget, object.getDictStorage()) != 0; } @Specialization(guards = "isBuiltinAnySet(object)") @InliningCutoff - static boolean doSet(Node inliningTarget, PBaseSet object, + public static boolean doSet(PBaseSet object, + @Bind Node inliningTarget, @Exclusive @Cached HashingStorageLen lenNode) { return lenNode.execute(inliningTarget, object.getDictStorage()) != 0; } @@ -152,7 +147,7 @@ static boolean doSet(Node inliningTarget, PBaseSet object, @Specialization(guards = {"!isBoolean(object)", "!isPNone(object)", "!isInt(object)", "!isLong(object)", "!isDouble(object)", "!isTruffleString(object)"}, // replaces = {"doList", "doTuple", "doDict", "doSet"}) @InliningCutoff - static boolean doOthers(Frame frame, Object object, + public static boolean doOthers(VirtualFrame frame, Object object, @Cached(inline = false) PyObjectIsTrueNodeGeneric internalNode) { // Cached PyObjectItTrue nodes used in PBytecodeRootNode are significant contributors to // footprint, so we use indirection to save all the fields for the nodes used in the generic diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectLookupAttr.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectLookupAttr.java index da0e9ffa2f..f537089835 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectLookupAttr.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectLookupAttr.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -51,7 +51,6 @@ import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; @@ -94,7 +93,7 @@ @GenerateUncached @GenerateInline(inlineByDefault = true) @GenerateCached -@ImportStatic({SpecialMethodSlot.class, SpecialMethodNames.class, PGuards.class}) +@ImportStatic({SpecialMethodNames.class, PGuards.class}) public abstract class PyObjectLookupAttr extends Node { public static Object executeUncached(Object receiver, TruffleString name) { return PyObjectLookupAttrNodeGen.getUncached().execute(null, null, receiver, name); @@ -133,9 +132,7 @@ protected static boolean isBuiltinTypeType(Object type) { } protected static boolean isTypeSlot(TruffleString name, TruffleString.CodePointLengthNode codePointLengthNode, TruffleString.CodePointAtIndexNode codePointAtIndexNode) { - return SpecialMethodSlot.canBeSpecial(name, codePointLengthNode, codePointAtIndexNode) || // - TpSlots.canBeSpecialMethod(name, codePointLengthNode, codePointAtIndexNode) || // - name.equalsUncached(T_MRO, TS_ENCODING); + return TpSlots.canBeSpecialMethod(name, codePointLengthNode, codePointAtIndexNode) || name.equalsUncached(T_MRO, TS_ENCODING); } // simple version that needs no calls and only reads from the object directly @@ -341,7 +338,7 @@ static Object readAttributeQuickly(Object type, TpSlots slots, Object receiver, // this is slightly simpler than the previous case, since we don't need to check // the type. There may be a module-level __getattr__, however. Since that would be // a call anyway, we return to the generic code in that case - if (!SpecialMethodSlot.canBeSpecial(stringName, codePointLengthNode, codePointAtIndexNode)) { + if (!TpSlots.canBeSpecialMethod(stringName, codePointLengthNode, codePointAtIndexNode)) { // not a special name, so this attribute cannot be on the module class ReadAttributeFromObjectNode readUncached = ReadAttributeFromObjectNode.getUncached(); Object result = readUncached.execute(receiver, stringName); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectReprAsObjectNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectReprAsObjectNode.java index 8dd2e460cc..961e07ca9c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectReprAsObjectNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectReprAsObjectNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,29 +44,25 @@ import static com.oracle.graal.python.nodes.truffle.TruffleStringMigrationHelpers.assertNoJavaString; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; -import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.object.ObjectNodes; import com.oracle.graal.python.builtins.objects.str.PString; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRepr.CallSlotReprNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; -import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.strings.TruffleString; /** @@ -80,7 +76,6 @@ @GenerateUncached @GenerateCached @GenerateInline(inlineByDefault = true) -@ImportStatic(SpecialMethodSlot.class) public abstract class PyObjectReprAsObjectNode extends PNodeWithContext { public static Object executeUncached(Object object) { @@ -99,37 +94,27 @@ public final Object executeCached(Frame frame, Object object) { @Specialization static Object repr(VirtualFrame frame, Node inliningTarget, Object obj, - @Cached GetClassNode getClassNode, - @Cached(parameters = "Repr", inline = false) LookupSpecialMethodSlotNode lookupRepr, - @Cached(inline = false) CallUnaryMethodNode callRepr, + @Cached GetObjectSlotsNode getSlots, + @Cached CallSlotReprNode callSlot, @Cached(inline = false) ObjectNodes.DefaultObjectReprNode defaultRepr, - @Cached InlinedConditionProfile isString, - @Cached InlinedConditionProfile isPString, - @Cached PRaiseNode.Lazy raiseNode) { - Object type = getClassNode.execute(inliningTarget, obj); - Object reprMethod; - try { - reprMethod = lookupRepr.execute(frame, type, obj); - } catch (PException e) { + @Cached PyUnicodeCheckNode checkNode, + @Cached PRaiseNode raiseNode) { + TpSlots slots = getSlots.execute(inliningTarget, obj); + if (slots.tp_repr() == null) { return defaultRepr.execute(frame, inliningTarget, obj); } - if (reprMethod != PNone.NO_VALUE) { - Object result = callRepr.executeObject(frame, reprMethod, obj); - result = assertNoJavaString(result); - if (isString.profile(inliningTarget, result instanceof TruffleString) || - isPString.profile(inliningTarget, result instanceof PString)) { - return result; - } - if (result != PNone.NO_VALUE) { - throw raiseTypeError(inliningTarget, obj, raiseNode); - } + Object result = callSlot.execute(frame, inliningTarget, slots.tp_repr(), obj); + assertNoJavaString(result); + if (checkNode.execute(inliningTarget, result)) { + return result; + } else { + throw raiseTypeError(inliningTarget, obj, raiseNode); } - return defaultRepr.execute(frame, inliningTarget, obj); } @InliningCutoff - private static PException raiseTypeError(Node inliningTarget, Object obj, PRaiseNode.Lazy raiseNode) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.RETURNED_NON_STRING, T___REPR__, obj); + private static PException raiseTypeError(Node inliningTarget, Object obj, PRaiseNode raiseNode) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.RETURNED_NON_STRING, T___REPR__, obj); } @NeverDefault diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectRichCompare.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectRichCompare.java new file mode 100644 index 0000000000..08a6e4bd9c --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectRichCompare.java @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotRichCompare.CallSlotRichCmpNode; +import com.oracle.graal.python.lib.PyObjectRichCompareNodeGen.RichCompareBinaryOpNodeGen; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.classes.IsSubtypeNode; +import com.oracle.graal.python.nodes.expression.BinaryOp; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.nodes.object.IsNode; +import com.oracle.graal.python.nodes.truffle.PythonIntegerAndFloatTypes; +import com.oracle.graal.python.util.PythonUtils; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.dsl.TypeSystemReference; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; +import com.oracle.truffle.api.strings.TruffleString; +import com.oracle.truffle.api.strings.TruffleString.EqualNode; + +@GenerateInline +@GenerateUncached +@GenerateCached(false) +@TypeSystemReference(PythonIntegerAndFloatTypes.class) +public abstract class PyObjectRichCompare extends Node { + public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object a, Object b, RichCmpOp op); + + public static Object executeUncached(Object a, Object b, RichCmpOp op) { + return PyObjectRichCompareNodeGen.getUncached().execute(null, null, a, b, op); + } + + @Specialization + static boolean doInts(int a, int b, RichCmpOp op) { + return op.compare(a, b); + } + + @Specialization + static boolean doDoubles(double a, double b, RichCmpOp op) { + return op.compare(a, b); + } + + @Specialization + static boolean doLongs(long a, long b, RichCmpOp op) { + return op.compare(a, b); + } + + @Specialization(guards = "op.isEqOrNe()") + static boolean doStrings(TruffleString a, TruffleString b, RichCmpOp op, + @Cached EqualNode equalNode) { + return equalNode.execute(a, b, PythonUtils.TS_ENCODING) == op.isEq(); + } + + @Fallback + @InliningCutoff + static Object doIt(VirtualFrame frame, Object v, Object w, RichCmpOp op, + @Cached(inline = false) GenericRichCompare richCompare) { + return richCompare.execute(frame, v, w, op); + } + + @GenerateInline(false) + public abstract static class RichCompareBinaryOp extends Node implements BinaryOp { + private final RichCmpOp op; + + protected RichCompareBinaryOp(RichCmpOp op) { + this.op = op; + } + + public static RichCompareBinaryOp create(RichCmpOp op) { + return RichCompareBinaryOpNodeGen.create(op); + } + + @Specialization + final Object doIt(VirtualFrame frame, Object left, Object right, + @Cached PyObjectRichCompare richCmpNode) { + return richCmpNode.execute(frame, this, left, right, op); + } + } + + @GenerateInline(false) + @GenerateUncached + public abstract static class GenericRichCompare extends Node { + public abstract Object execute(VirtualFrame frame, Object a, Object b, RichCmpOp op); + + @Specialization + static Object doIt(VirtualFrame frame, Object v, Object w, RichCmpOp op, + @Bind Node inliningTarget, + @Cached GetClassNode getVClass, + @Cached GetClassNode getWClass, + @Cached GetCachedTpSlotsNode getVSlots, + @Cached GetCachedTpSlotsNode getWSlots, + @Cached InlinedConditionProfile checkRevOpProfile, + @Cached IsSameTypeNode isSameTypeNode, + @Cached IsSubtypeNode isSubtypeNode, + @Cached CallSlotRichCmpNode callRichCmpSwapped, + @Cached CallSlotRichCmpNode callRichCmp, + @Cached IsNode isNode, + @Cached InlinedConditionProfile notImplemented1Profile, + @Cached InlinedConditionProfile notImplemented2Profile, + @Cached InlinedConditionProfile notImplemented3Profile, + @Cached PRaiseNode raiseNode) { + Object vClass = getVClass.execute(inliningTarget, v); + Object wClass = getWClass.execute(inliningTarget, w); + TpSlots wSlots = getWSlots.execute(inliningTarget, wClass); + boolean checkedReverseOp = false; + if (checkRevOpProfile.profile(inliningTarget, wSlots.tp_richcmp() != null && + !isSameTypeNode.execute(inliningTarget, vClass, wClass) && isSubtypeNode.execute(wClass, vClass))) { + checkedReverseOp = true; + Object result = callRichCmpSwapped.execute(frame, inliningTarget, wSlots.tp_richcmp(), w, v, op.getSwapped()); + if (notImplemented1Profile.profile(inliningTarget, result != PNotImplemented.NOT_IMPLEMENTED)) { + return result; + } + } + TpSlots vSlots = getVSlots.execute(inliningTarget, vClass); + if (vSlots.tp_richcmp() != null) { + Object result = callRichCmp.execute(frame, inliningTarget, vSlots.tp_richcmp(), v, w, op); + if (notImplemented2Profile.profile(inliningTarget, result != PNotImplemented.NOT_IMPLEMENTED)) { + return result; + } + } + if (wSlots.tp_richcmp() != null && !checkedReverseOp) { + Object result = callRichCmpSwapped.execute(frame, inliningTarget, wSlots.tp_richcmp(), w, v, op.getSwapped()); + if (notImplemented3Profile.profile(inliningTarget, result != PNotImplemented.NOT_IMPLEMENTED)) { + return result; + } + } + // If neither object implements it, provide a sensible default for == and !=, but raise + // an exception for ordering. + return switch (op) { + case Py_EQ, Py_NE -> isNode.execute(v, w) == op.isEq(); + default -> + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.NOT_SUPPORTED_BETWEEN_INSTANCES, op.getOpName(), v, w); + }; + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectRichCompareBool.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectRichCompareBool.java index 9becdc45f5..f4449ef6dd 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectRichCompareBool.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectRichCompareBool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,650 +40,134 @@ */ package com.oracle.graal.python.lib; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; -import static com.oracle.graal.python.builtins.objects.str.StringUtils.compareStrings; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; - -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.PNotImplemented; -import com.oracle.graal.python.builtins.objects.ints.PInt; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode; -import com.oracle.graal.python.lib.PyObjectRichCompareBoolFactory.EqNodeGen; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.PRaiseNode.Lazy; -import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; -import com.oracle.graal.python.nodes.classes.IsSubtypeNode; -import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.builtins.objects.floats.PFloat; +import com.oracle.graal.python.lib.PyObjectRichCompare.GenericRichCompare; +import com.oracle.graal.python.lib.PyObjectRichCompareBoolNodeGen.CachedPyObjectRichCompareBoolNodeGen; import com.oracle.graal.python.nodes.object.IsNode; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.util.OverflowException; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; +import com.oracle.graal.python.util.PythonUtils; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.strings.TruffleString; +import com.oracle.truffle.api.strings.TruffleString.EqualNode; /** - * Performs one of comparison operations. The nodes for all operations are inner classes of this - * class - {@link EqNode}, {@link NeNode}, {@link LtNode}, {@link LeNode}, {@link GtNode} and - * {@link GeNode}. Equivalent of CPython's {@code PyObject_RichCompareBool} with the difference that - * the operation is selected by picking particular inner class. Note there is a small difference in - * behavior between {@code PyObject_RichCompareBool} and {@code PyObject_RichCompare} followed by - * {@code PyObject_IsTrue} - the objects are compared for referential equality first (when doing - * equality comparison) before calling the special method. This makes a difference for objects that - * report they are unequal to themselves (i.e. {@code NaN}). + * Performs one of comparison operations. Equivalent of CPython's {@code PyObject_RichCompareBool}. + * Note there is a small difference in behavior between {@code PyObject_RichCompareBool} and + * {@code PyObject_RichCompare} followed by {@code PyObject_IsTrue} (see + * bpo4296) - the objects are compared for + * referential equality first (when doing equality comparison) before calling the special method. + * This makes a difference for objects that report they are unequal to themselves (i.e. + * {@code NaN}). Since we do not maintain identity for unboxed float objects, we cannot fully match + * the CPython behavior - we treat all NaNs with exactly the same bits as equal. */ -public abstract class PyObjectRichCompareBool { - - public abstract static class Comparison { - protected boolean op(boolean a, boolean b) { - throw CompilerDirectives.shouldNotReachHere("abstract method"); - } - - protected boolean op(int a, int b) { - throw CompilerDirectives.shouldNotReachHere("abstract method"); - } - - protected boolean op(long a, long b) { - throw CompilerDirectives.shouldNotReachHere("abstract method"); - } - - protected boolean op(double a, double b) { - throw CompilerDirectives.shouldNotReachHere("abstract method"); - } - - protected SpecialMethodSlot getSlot() { - throw CompilerDirectives.shouldNotReachHere("abstract method"); - } - - protected SpecialMethodSlot getReverseSlot() { - throw CompilerDirectives.shouldNotReachHere("abstract method"); - } - - protected boolean needsIdentityComparison() { - return false; - } - - protected boolean identityComparisonResult() { - throw CompilerDirectives.shouldNotReachHere("abstract method"); - } - - protected boolean doDefault(Node inliningTarget, PRaiseNode.Lazy raiseNode, Object a, Object b) { - throw CompilerDirectives.shouldNotReachHere("abstract method"); - } +@GenerateInline +@GenerateCached(false) +@GenerateUncached +@TypeSystemReference(PythonIntegerTypes.class) +public abstract class PyObjectRichCompareBool extends Node { + public abstract boolean execute(Frame frame, Node inliningTarget, Object a, Object b, RichCmpOp op); + + public final boolean executeEq(Frame frame, Node inliningTarget, Object a, Object b) { + return execute(frame, inliningTarget, a, b, RichCmpOp.Py_EQ); } - @SuppressWarnings("unused") - @GenerateCached(false) - @GenerateInline(false) - @GenerateUncached(false) - public abstract static class ComparisonBaseNode extends PNodeWithContext { - // Overridden by the implementors to call execute with the right Comparison strategy - public boolean compare(Frame frame, Node inliningTarget, Object a, Object b) { - throw CompilerDirectives.shouldNotReachHere("abstract method"); - } - - protected abstract boolean execute(Frame frame, Node inliningTarget, Object a, Object b, Comparison cmp); - - @Specialization - static boolean doBB(boolean a, boolean b, Comparison cmp) { - return cmp.op(a, b); - } - - @Specialization - static boolean doII(int a, int b, Comparison cmp) { - return cmp.op(a, b); - } - - @Specialization - static boolean doIL(int a, long b, Comparison cmp) { - return cmp.op(a, b); - } - - @Specialization - static boolean doID(int a, double b, Comparison cmp) { - return cmp.op(a, b); - } - - @Specialization(guards = "isBuiltinPInt(b)", rewriteOn = OverflowException.class) - static boolean doIPNoOVerflow(int a, PInt b, Comparison cmp) throws OverflowException { - return cmp.op(a, b.intValueExact()); - } - - @Specialization(guards = "isBuiltinPInt(b)", replaces = "doIPNoOVerflow") - static boolean doIP(int a, PInt b, Comparison cmp) { - try { - return cmp.op(a, b.intValueExact()); - } catch (OverflowException e) { - return false; - } - } - - @Specialization - static boolean doLL(long a, long b, Comparison cmp) { - return cmp.op(a, b); - } - - @Specialization - static boolean doLI(long a, int b, Comparison cmp) { - return cmp.op(a, b); - } - - @Specialization - static boolean doLD(long a, double b, Comparison cmp) { - return cmp.op(a, b); - } - - @Specialization(guards = "isBuiltinPInt(b)", rewriteOn = OverflowException.class) - static boolean doLPNoOVerflow(long a, PInt b, Comparison cmp) throws OverflowException { - return cmp.op(a, b.longValueExact()); - } - - @Specialization(guards = "isBuiltinPInt(b)", replaces = "doLPNoOVerflow") - static boolean doLP(long a, PInt b, Comparison cmp) { - try { - return cmp.op(a, b.longValueExact()); - } catch (OverflowException e) { - return false; - } - } - - @Specialization(guards = "isBuiltinPInt(a)", rewriteOn = OverflowException.class) - static boolean doPINoOverflow(PInt a, int b, Comparison cmp) throws OverflowException { - return cmp.op(a.intValueExact(), b); - } - - @Specialization(guards = "isBuiltinPInt(a)", replaces = "doPINoOverflow") - static boolean doPI(PInt a, int b, Comparison cmp) { - try { - return cmp.op(a.intValueExact(), b); - } catch (OverflowException e) { - return false; - } - } - - @Specialization(guards = "isBuiltinPInt(a)", rewriteOn = OverflowException.class) - static boolean doPLNoOverflow(PInt a, long b, Comparison cmp) throws OverflowException { - return cmp.op(a.longValueExact(), b); - } - - @Specialization(guards = "isBuiltinPInt(a)", replaces = "doPLNoOverflow") - static boolean doPL(PInt a, long b, Comparison cmp) { - try { - return cmp.op(a.longValueExact(), b); - } catch (OverflowException e) { - return false; - } - } - - @Specialization(guards = {"isBuiltinPInt(a)", "isBuiltinPInt(b)"}) - @TruffleBoundary - static boolean doPP(PInt a, PInt b, Comparison cmp) { - return cmp.op(a.compareTo(b), 0); - } - - @Specialization - static boolean doDD(double a, double b, Comparison cmp) { - // nb: Eq subclass handles NaN identity - return cmp.op(a, b); - } - - @Specialization - static boolean doDI(double a, int b, Comparison cmp) { - return cmp.op(a, b); - } - - @Specialization - static boolean doDL(double a, long b, Comparison cmp) { - return cmp.op(a, b); - } - - @Specialization - @InliningCutoff - static boolean doGeneric(VirtualFrame frame, Node inliningTarget, Object a, Object b, Comparison cmp, - @Cached(inline = false) IsNode isNode, - @Cached GetClassNode getClassA, - @Cached GetClassNode getClassB, - @Cached InlinedConditionProfile reversedFirst, - @Cached IsSameTypeNode isSameTypeNode, - @Cached(inline = false) IsSubtypeNode isSubtypeNode, - @Cached(parameters = "cmp.getSlot()", inline = false) LookupSpecialMethodSlotNode lookupMethod, - @Cached(parameters = "cmp.getReverseSlot()", inline = false) LookupSpecialMethodSlotNode lookupReverseMethod, - @Cached(inline = false) CallBinaryMethodNode callMethod, - @Cached(inline = false) CallBinaryMethodNode callReverseMethod, - @Cached PyObjectIsTrueNode isTrueNode, - @Cached PRaiseNode.Lazy raiseNode) { - if (cmp.needsIdentityComparison()) { - if (isNode.execute(a, b)) { - return cmp.identityComparisonResult(); - } - } - boolean checkedReverseOp = false; - Object aType = getClassA.execute(inliningTarget, a); - Object bType = getClassB.execute(inliningTarget, b); - if (reversedFirst.profile(inliningTarget, !isSameTypeNode.execute(inliningTarget, aType, bType) && - isSubtypeNode.execute(bType, aType))) { - checkedReverseOp = true; - Object reverseMethod = lookupMethodIgnoreDescriptorError(frame, lookupReverseMethod, bType, b); - if (reverseMethod != PNone.NO_VALUE) { - Object result = callReverseMethod.executeObject(frame, reverseMethod, b, a); - if (result != PNotImplemented.NOT_IMPLEMENTED) { - return isTrueNode.execute(frame, inliningTarget, result); - } - } - } - Object method = lookupMethodIgnoreDescriptorError(frame, lookupMethod, aType, a); - if (method != PNone.NO_VALUE) { - Object result = callMethod.executeObject(frame, method, a, b); - if (result != PNotImplemented.NOT_IMPLEMENTED) { - return isTrueNode.execute(frame, inliningTarget, result); - } - } - if (!checkedReverseOp) { - Object reverseMethod = lookupMethodIgnoreDescriptorError(frame, lookupReverseMethod, bType, b); - if (reverseMethod != PNone.NO_VALUE) { - Object result = callReverseMethod.executeObject(frame, reverseMethod, b, a); - if (result != PNotImplemented.NOT_IMPLEMENTED) { - return isTrueNode.execute(frame, inliningTarget, result); - } - } - } - return cmp.doDefault(inliningTarget, raiseNode, a, b); - } - - private static Object lookupMethodIgnoreDescriptorError(VirtualFrame frame, LookupSpecialMethodSlotNode lookupMethod, Object aType, Object a) { - try { - return lookupMethod.execute(frame, aType, a); - } catch (PException e) { - return PNone.NO_VALUE; - } - } + public final boolean executeCached(Frame frame, Object a, Object b, RichCmpOp op) { + return execute(frame, null, a, b, op); } - @GenerateUncached - @GenerateInline(inlineByDefault = true) - public abstract static class EqNode extends ComparisonBaseNode { - private static final class EqComparison extends Comparison { - @Override - protected boolean op(boolean a, boolean b) { - return a == b; - } - - @Override - protected boolean op(int a, int b) { - return a == b; - } - - @Override - protected boolean op(long a, long b) { - return a == b; - } - - @Override - protected boolean op(double a, double b) { - return a == b || (Double.isNaN(a) && Double.isNaN(b)); - } - - @Override - protected SpecialMethodSlot getSlot() { - return SpecialMethodSlot.Eq; - } - - @Override - protected SpecialMethodSlot getReverseSlot() { - return SpecialMethodSlot.Eq; - } - - @Override - protected boolean needsIdentityComparison() { - return true; - } - - @Override - protected boolean identityComparisonResult() { - return true; - } - - @Override - protected boolean doDefault(Node inliningTarget, PRaiseNode.Lazy raiseNode, Object a, Object b) { - // Already compared for identity - return false; - } - } - - private static final EqComparison CMP = new EqComparison(); - - public final boolean compareCached(Frame frame, Object a, Object b) { - return compare(frame, this, a, b); - } - - @Override - public final boolean compare(Frame frame, Node inliningTarget, Object a, Object b) { - return execute(frame, inliningTarget, a, b, CMP); - } - - public static boolean compareUncached(Object a, Object b) { - return EqNodeGen.getUncached().compare(null, null, a, b); - } - - @Specialization(insertBefore = "doGeneric") - @InliningCutoff - static boolean doSS(TruffleString a, TruffleString b, @SuppressWarnings("unused") Comparison cmp, - @Cached(inline = false) TruffleString.EqualNode equalNode) { - return equalNode.execute(a, b, TS_ENCODING); - } - - @NeverDefault - public static EqNode create() { - return PyObjectRichCompareBoolFactory.EqNodeGen.create(); - } - - public static EqNode getUncached() { - return PyObjectRichCompareBoolFactory.EqNodeGen.getUncached(); - } + public static boolean executeUncached(Object a, Object b, RichCmpOp op) { + return getUncached().execute(null, null, a, b, op); } - @GenerateUncached - @GenerateInline - @GenerateCached(false) - public abstract static class NeNode extends ComparisonBaseNode { - private static final class NeComparison extends Comparison { - @Override - protected boolean op(boolean a, boolean b) { - return a != b; - } - - @Override - protected boolean op(int a, int b) { - return a != b; - } - - @Override - protected boolean op(long a, long b) { - return a != b; - } - - @Override - protected boolean op(double a, double b) { - return a != b; - } - - @Override - protected SpecialMethodSlot getSlot() { - return SpecialMethodSlot.Ne; - } - - @Override - protected SpecialMethodSlot getReverseSlot() { - return SpecialMethodSlot.Ne; - } - - @Override - protected boolean needsIdentityComparison() { - return true; - } - - @Override - protected boolean identityComparisonResult() { - return false; - } - - @Override - @SuppressWarnings("unused") - protected boolean doDefault(Node inliningTarget, PRaiseNode.Lazy raiseNode, Object a, Object b) { - // Already compared for identity - return true; - } - } - - private static final NeComparison CMP = new NeComparison(); - - @Override - public final boolean compare(Frame frame, Node inliningTarget, Object a, Object b) { - return execute(frame, inliningTarget, a, b, CMP); - } - - @Specialization(insertBefore = "doGeneric") - static boolean doSS(TruffleString a, TruffleString b, @SuppressWarnings("unused") Comparison cmp, - @Cached(inline = false) TruffleString.EqualNode equalNode) { - return !equalNode.execute(a, b, TS_ENCODING); - } + public static boolean executeEqUncached(Object a, Object b) { + return executeUncached(a, b, RichCmpOp.Py_EQ); } - @GenerateUncached - @GenerateInline - @GenerateCached(false) - public abstract static class LtNode extends ComparisonBaseNode { - - private static final class LtComparison extends Comparison { - @Override - protected boolean op(boolean a, boolean b) { - return !a && b; - } - - @Override - protected boolean op(int a, int b) { - return a < b; - } - - @Override - protected boolean op(long a, long b) { - return a < b; - } - - @Override - protected boolean op(double a, double b) { - return a < b; - } - - @Override - protected SpecialMethodSlot getSlot() { - return SpecialMethodSlot.Lt; - } - - @Override - protected SpecialMethodSlot getReverseSlot() { - return SpecialMethodSlot.Gt; - } - - @Override - @SuppressWarnings("unused") - protected boolean doDefault(Node inliningTarget, PRaiseNode.Lazy raiseNode, Object a, Object b) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.NOT_SUPPORTED_BETWEEN_INSTANCES, "<", a, b); - } - } - - public static final LtComparison CMP = new LtComparison(); - - @Override - public boolean compare(Frame frame, Node inliningTarget, Object a, Object b) { - return execute(frame, inliningTarget, a, b, CMP); - } - - @Specialization(insertBefore = "doGeneric") - static boolean doSS(TruffleString a, TruffleString b, @SuppressWarnings("unused") Comparison cmp, - @Cached(inline = false) TruffleString.CompareIntsUTF32Node compareIntsUTF32Node) { - return compareStrings(a, b, compareIntsUTF32Node) < 0; - } + @Specialization + static boolean doInts(int a, int b, RichCmpOp op) { + return op.compare(a, b); } - @GenerateUncached - @GenerateInline(inlineByDefault = true) - public abstract static class LeNode extends ComparisonBaseNode { - - private static final class LeComparison extends Comparison { - @Override - protected boolean op(boolean a, boolean b) { - return b || !a; - } - - @Override - protected boolean op(int a, int b) { - return a <= b; - } - - @Override - protected boolean op(long a, long b) { - return a <= b; - } - - @Override - protected boolean op(double a, double b) { - return a <= b; - } - - @Override - protected SpecialMethodSlot getSlot() { - return SpecialMethodSlot.Le; - } - - @Override - protected SpecialMethodSlot getReverseSlot() { - return SpecialMethodSlot.Ge; - } - - @Override - protected boolean doDefault(Node inliningTarget, PRaiseNode.Lazy raiseNode, Object a, Object b) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.NOT_SUPPORTED_BETWEEN_INSTANCES, "<=", a, b); - } - } - - public static final LeComparison CMP = new LeComparison(); - - @Override - public final boolean compare(Frame frame, Node inliningTarget, Object a, Object b) { - return execute(frame, inliningTarget, a, b, CMP); - } - - @Specialization(insertBefore = "doGeneric") - static boolean doSS(TruffleString a, TruffleString b, @SuppressWarnings("unused") Comparison cmp, - @Cached(inline = false) TruffleString.CompareIntsUTF32Node compareIntsUTF32Node) { - return compareStrings(a, b, compareIntsUTF32Node) <= 0; - } + public static boolean compareWithFakeIdentity(RichCmpOp op, double a, double b) { + // CPython checks identity of the float objects first, we cannot do that so we chose to + // report the same NaN bit patterns as identical + return switch (op) { + case Py_LT -> a < b; + case Py_LE -> a <= b; + case Py_EQ, Py_NE -> PFloat.areIdentical(a, b) == op.isEq(); + case Py_GT -> a > b; + case Py_GE -> a >= b; + }; } - @GenerateUncached - @GenerateInline - @GenerateCached(false) - public abstract static class GtNode extends ComparisonBaseNode { - - private static final class GtComparison extends Comparison { - @Override - protected boolean op(boolean a, boolean b) { - return a && !b; - } - - @Override - protected boolean op(int a, int b) { - return a > b; - } - - @Override - protected boolean op(long a, long b) { - return a > b; - } - - @Override - protected boolean op(double a, double b) { - return a > b; - } + @Specialization + static boolean doDoubles(double a, double b, RichCmpOp op) { + return compareWithFakeIdentity(op, a, b); + } - @Override - protected SpecialMethodSlot getSlot() { - return SpecialMethodSlot.Gt; - } + @Specialization + static boolean doLongs(long a, long b, RichCmpOp op) { + return op.compare(a, b); + } - @Override - protected SpecialMethodSlot getReverseSlot() { - return SpecialMethodSlot.Lt; - } + @Specialization(guards = "op.isEqOrNe()") + static boolean doStrings(TruffleString a, TruffleString b, RichCmpOp op, + @Cached EqualNode equalNode) { + return equalNode.execute(a, b, PythonUtils.TS_ENCODING) == op.isEq(); + } - @Override - protected boolean doDefault(Node inliningTarget, PRaiseNode.Lazy raiseNode, Object a, Object b) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.NOT_SUPPORTED_BETWEEN_INSTANCES, ">", a, b); + @Fallback + static boolean doIt(VirtualFrame frame, Object a, Object b, RichCmpOp op, + @Cached IsNode isNode, + @Cached(inline = false) GenericRichCompare richCompare, + @Cached PyObjectIsTrueNode isTrueNode) { + // CPython fast-path: Quick result when objects are the same. Guarantees that identity + // implies equality. + if (op.isEqOrNe()) { + if (isNode.execute(a, b)) { + return op.isEq(); } } + Object result = richCompare.execute(frame, a, b, op); + return isTrueNode.execute(frame, result); + } - public static final GtComparison CMP = new GtComparison(); - - @Override - public final boolean compare(Frame frame, Node inliningTarget, Object a, Object b) { - return execute(frame, inliningTarget, a, b, CMP); - } - - @Specialization(insertBefore = "doGeneric") - static boolean doSS(TruffleString a, TruffleString b, @SuppressWarnings("unused") Comparison cmp, - @Cached(inline = false) TruffleString.CompareIntsUTF32Node compareIntsUTF32Node) { - return compareStrings(a, b, compareIntsUTF32Node) > 0; - } + public static PyObjectRichCompareBool getUncached() { + return PyObjectRichCompareBoolNodeGen.getUncached(); } + @GenerateInline(false) @GenerateUncached - @GenerateInline - @GenerateCached(false) - public abstract static class GeNode extends ComparisonBaseNode { - - private static final class GeComparison extends Comparison { - @Override - protected boolean op(boolean a, boolean b) { - return a || !b; - } + public abstract static class CachedPyObjectRichCompareBool extends Node { + public abstract boolean execute(Frame frame, Object a, Object b, RichCmpOp op); - @Override - protected boolean op(int a, int b) { - return a >= b; - } - - @Override - protected boolean op(long a, long b) { - return a >= b; - } - - @Override - protected boolean op(double a, double b) { - return a >= b; - } - - @Override - protected SpecialMethodSlot getSlot() { - return SpecialMethodSlot.Ge; - } - - @Override - protected SpecialMethodSlot getReverseSlot() { - return SpecialMethodSlot.Le; - } - - @Override - protected boolean doDefault(Node inliningTarget, Lazy raiseNode, Object a, Object b) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.NOT_SUPPORTED_BETWEEN_INSTANCES, ">=", a, b); - } + public final boolean executeEq(Frame frame, Object a, Object b) { + return execute(frame, a, b, RichCmpOp.Py_EQ); } - public static final GeComparison CMP = new GeComparison(); + @Specialization + static boolean doIt(Frame frame, Object a, Object b, RichCmpOp op, + @Bind Node inliningTarget, + @Cached PyObjectRichCompareBool delegate) { + return delegate.execute(frame, inliningTarget, a, b, op); + } - @Override - public final boolean compare(Frame frame, Node inliningTarget, Object a, Object b) { - return execute(frame, inliningTarget, a, b, CMP); + public static CachedPyObjectRichCompareBool create() { + return CachedPyObjectRichCompareBoolNodeGen.create(); } - @Specialization(insertBefore = "doGeneric") - static boolean doSS(TruffleString a, TruffleString b, @SuppressWarnings("unused") Comparison cmp, - @Cached(inline = false) TruffleString.CompareIntsUTF32Node compareIntsUTF32Node) { - return compareStrings(a, b, compareIntsUTF32Node) >= 0; + public static CachedPyObjectRichCompareBool getUncached() { + return CachedPyObjectRichCompareBoolNodeGen.getUncached(); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSetAttr.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSetAttr.java index f760e83822..a819ccc2ce 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSetAttr.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSetAttr.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,20 +47,17 @@ import static com.oracle.graal.python.nodes.ErrorMessages.P_HAS_RO_ATTRS_S_TO_DELETE; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSetAttr.CallSlotSetAttrNode; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.PRaiseNode.Lazy; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; @@ -76,7 +73,6 @@ @GenerateUncached @GenerateInline(inlineByDefault = true) @GenerateCached -@ImportStatic(SpecialMethodSlot.class) public abstract class PyObjectSetAttr extends PNodeWithContext { public static void executeUncached(Object receiver, TruffleString name, Object value) { PyObjectSetAttr.getUncached().execute(null, null, receiver, name, value); @@ -96,6 +92,10 @@ public final void deleteCached(Frame frame, Object receiver, TruffleString name) execute(frame, null, receiver, name, PNone.NO_VALUE); } + public static void deleteUncached(Object receiver, TruffleString name) { + executeUncached(receiver, name, PNone.NO_VALUE); + } + public final void delete(Frame frame, Node inliningTarget, Object receiver, TruffleString name) { execute(frame, inliningTarget, receiver, name, PNone.NO_VALUE); } @@ -104,7 +104,7 @@ public final void delete(Frame frame, Node inliningTarget, Object receiver, Truf static void setFixedAttr(Frame frame, Node inliningTarget, Object self, @SuppressWarnings("unused") TruffleString name, Object value, @SuppressWarnings("unused") @Cached("name") TruffleString cachedName, @Shared @Cached GetObjectSlotsNode getSlotsNode, - @Shared @Cached PRaiseNode.Lazy raise, + @Shared @Cached PRaiseNode raise, @Shared @Cached CallSlotSetAttrNode callSetAttr) { assert value != null; // should use PNone.NO_VALUE TpSlots slots = getSlotsNode.execute(inliningTarget, self); @@ -119,13 +119,13 @@ static void setFixedAttr(Frame frame, Node inliningTarget, Object self, @Suppres @InliningCutoff static void doDynamicAttr(Frame frame, Node inliningTarget, Object self, TruffleString name, Object value, @Shared @Cached GetObjectSlotsNode getSlotsNode, - @Shared @Cached PRaiseNode.Lazy raise, + @Shared @Cached PRaiseNode raise, @Shared @Cached CallSlotSetAttrNode callSetAttr) { setFixedAttr(frame, inliningTarget, self, name, value, name, getSlotsNode, raise, callSetAttr); } @InliningCutoff - static void raiseNoSlotError(Node inliningTarget, Object self, Object name, Object value, Lazy raise, TpSlots slots) { + static void raiseNoSlotError(Node inliningTarget, Object self, Object name, Object value, PRaiseNode raise, TpSlots slots) { TruffleString message; boolean isDelete = value == PNone.NO_VALUE; if (slots.combined_tp_getattro_getattr() == null) { @@ -133,7 +133,7 @@ static void raiseNoSlotError(Node inliningTarget, Object self, Object name, Obje } else { message = isDelete ? P_HAS_RO_ATTRS_S_TO_DELETE : P_HAS_RO_ATTRS_S_TO_ASSIGN; } - throw raise.get(inliningTarget).raise(TypeError, message, self, name); + throw raise.raise(inliningTarget, TypeError, message, self, name); } @NeverDefault diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSetAttrO.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSetAttrO.java index 11f29f6414..88c52f2a02 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSetAttrO.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSetAttrO.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,7 +44,6 @@ import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.str.PString; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSetAttr.CallSlotSetAttrONode; @@ -59,7 +58,6 @@ import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; @@ -72,7 +70,6 @@ @GenerateUncached @GenerateInline(inlineByDefault = true) @GenerateCached -@ImportStatic(SpecialMethodSlot.class) public abstract class PyObjectSetAttrO extends PNodeWithContext { public static void executeUncached(Object receiver, Object name, Object value) { PyObjectSetAttrONodeGen.getUncached().execute(null, null, receiver, name, value); @@ -117,11 +114,11 @@ public abstract static class PyObjectSetAttrOGeneric extends Node { static void doIt(Frame frame, Object self, Object nameObj, Object value, @Bind("this") Node inliningTarget, @Cached PyUnicodeCheckNode unicodeCheckNode, - @Cached PRaiseNode.Lazy raise, + @Cached PRaiseNode raise, @Cached GetObjectSlotsNode getSlotsNode, @Cached CallSlotSetAttrONode callSetAttr) { if (!unicodeCheckNode.execute(inliningTarget, nameObj)) { - throw raise.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ATTR_NAME_MUST_BE_STRING, nameObj); + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ATTR_NAME_MUST_BE_STRING, nameObj); } assert value != null; // should use PNone.NO_VALUE TpSlots slots = getSlotsNode.execute(inliningTarget, self); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSetItem.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSetItem.java index b16c7593ac..67e44e2ca2 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSetItem.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSetItem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,18 +42,21 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; -import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.list.ListBuiltins; import com.oracle.graal.python.builtins.objects.list.PList; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotMpAssSubscript.CallSlotMpAssSubscriptNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqAssItem.CallSlotSqAssItemNode; +import com.oracle.graal.python.lib.PySequenceGetItemNode.IndexForSqSlot; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.CallTernaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; -import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Exclusive; +import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; @@ -70,7 +73,7 @@ @GenerateUncached @GenerateInline(inlineByDefault = true) @GenerateCached -@ImportStatic({SpecialMethodSlot.class, PGuards.class}) +@ImportStatic(PGuards.class) public abstract class PyObjectSetItem extends Node { public static void executeUncached(Frame frame, Object container, Object index, Object value) { PyObjectSetItemNodeGen.getUncached().execute(frame, null, container, index, value); @@ -88,22 +91,52 @@ public final void executeCached(Frame frame, Object container, Object index, Obj @Specialization(guards = "isBuiltinList(object)") static void doList(VirtualFrame frame, PList object, Object key, Object value, - @Cached(inline = false) ListBuiltins.SetItemNode setItemNode) { - setItemNode.execute(frame, object, key, value); + @Cached(inline = false) ListBuiltins.SetSubscriptNode setItemNode) { + setItemNode.executeVoid(frame, object, key, value); } @InliningCutoff @Specialization(replaces = "doList") - static void doWithFrame(Frame frame, Node inliningTarget, Object primary, Object index, Object value, - @Cached GetClassNode getClassNode, - @Cached(parameters = "SetItem", inline = false) LookupSpecialMethodSlotNode lookupSetitem, - @Cached PRaiseNode.Lazy raise, - @Cached(inline = false) CallTernaryMethodNode callSetitem) { - Object setitem = lookupSetitem.execute(frame, getClassNode.execute(inliningTarget, primary), primary); - if (setitem == PNone.NO_VALUE) { - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.P_OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT, primary); + static void doGeneric(VirtualFrame frame, Node inliningTarget, Object object, Object key, Object value, + @Cached GetObjectSlotsNode getSlotsNode, + @Cached PyObjectSetItemGeneric genericNode) { + TpSlots slots = getSlotsNode.execute(inliningTarget, object); + genericNode.execute(frame, inliningTarget, object, slots, key, value); + } + + @GenerateUncached + @GenerateInline + @GenerateCached(false) + abstract static class PyObjectSetItemGeneric extends Node { + public abstract void execute(Frame frame, Node inliningTarget, Object object, TpSlots objectKlassSlots, Object key, Object value); + + @Specialization(guards = "slots.mp_ass_subscript() != null") + static void doMapping(VirtualFrame frame, Node inliningTarget, Object object, TpSlots slots, Object key, Object value, + @Cached CallSlotMpAssSubscriptNode callNode) { + callNode.execute(frame, inliningTarget, slots.mp_ass_subscript(), object, key, value); + } + + @Specialization(guards = {"slots.mp_ass_subscript() == null", "slots.sq_ass_item() != null", "key >= 0"}) + static void doSequenceFastPath(VirtualFrame frame, Node inliningTarget, Object object, TpSlots slots, int key, Object value, + @Exclusive @Cached CallSlotSqAssItemNode callSqItem) { + callSqItem.execute(frame, inliningTarget, slots.sq_ass_item(), object, key, value); + } + + @Specialization(guards = {"slots.mp_ass_subscript() == null", "slots.sq_ass_item() != null"}, replaces = "doSequenceFastPath") + @InliningCutoff + static void doSequence(VirtualFrame frame, Node inliningTarget, Object object, TpSlots slots, Object key, Object value, + @Cached IndexForSqSlot indexForSqSlot, + @Exclusive @Cached CallSlotSqAssItemNode callSqItem) { + int index = indexForSqSlot.execute(frame, inliningTarget, object, slots, key); + callSqItem.execute(frame, inliningTarget, slots.sq_ass_item(), object, index, value); + } + + @Fallback + @InliningCutoff + static void error(Object object, @SuppressWarnings("unused") TpSlots slots, @SuppressWarnings("unused") Object key, @SuppressWarnings("unused") Object value, + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT, object); } - callSetitem.execute(frame, setitem, primary, index, value); } @NeverDefault diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSizeGenericNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSizeGenericNode.java index c4fe6172d2..be578b19c1 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSizeGenericNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSizeGenericNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,7 +42,6 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen; @@ -52,7 +51,6 @@ import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; @@ -60,7 +58,6 @@ // Note: this has to be a top-level class because of bug/restriction in Truffle DSL @GenerateUncached -@ImportStatic(SpecialMethodSlot.class) @GenerateInline(false) // intentionally lazy initialized... abstract class PyObjectSizeGenericNode extends Node { abstract int execute(Frame frame, Object object); @@ -70,11 +67,11 @@ static int doIt(VirtualFrame frame, Object object, @Bind("this") Node inliningTarget, @Cached GetObjectSlotsNode getTpSlotsNode, @Cached TpSlotLen.CallSlotLenNode callSlotLenNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { TpSlots slots = getTpSlotsNode.execute(inliningTarget, object); if (slots.combined_sq_mp_length() != null) { return callSlotLenNode.execute(frame, inliningTarget, slots.combined_sq_mp_length(), object); } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.OBJ_HAS_NO_LEN, object); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.OBJ_HAS_NO_LEN, object); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSizeNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSizeNode.java index c77ef6c297..aeee82ce9e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSizeNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSizeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -79,9 +79,6 @@ @GenerateInline(inlineByDefault = true) @GenerateCached() public abstract class PyObjectSizeNode extends PNodeWithContext { - public static int executeUncached(Frame frame, Object object) { - return PyObjectSizeNodeGen.getUncached().execute(frame, null, object); - } public static int executeUncached(Object object) { return PyObjectSizeNodeGen.getUncached().execute(null, null, object); @@ -146,9 +143,9 @@ static int doOthers(VirtualFrame frame, Object object, return genericNode.execute(frame, object); } - static int checkLen(PRaiseNode raiseNode, int len) { + static int checkLen(Node inliningTarget, PRaiseNode raiseNode, int len) { if (len < 0) { - throw raiseNode.raise(ValueError, ErrorMessages.LEN_SHOULD_RETURN_GT_ZERO); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.LEN_SHOULD_RETURN_GT_ZERO); } return len; } @@ -167,10 +164,10 @@ public static int convertAndCheckLen(VirtualFrame frame, Node inliningTarget, Ob * error. */ len = castLossy.execute(inliningTarget, index); - checkLen(raiseNode, len); + checkLen(inliningTarget, raiseNode, len); throw e; } - return checkLen(raiseNode, len); + return checkLen(inliningTarget, raiseNode, len); } @NeverDefault diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectStrAsObjectNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectStrAsObjectNode.java index dfb4dfb002..ddf29de641 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectStrAsObjectNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectStrAsObjectNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,22 +47,19 @@ import static com.oracle.graal.python.nodes.truffle.TruffleStringMigrationHelpers.assertNoJavaString; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.str.PString; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotUnaryFunc.CallSlotUnaryNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; -import com.oracle.graal.python.nodes.classes.IsSubtypeNode; -import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; @@ -81,7 +78,6 @@ @GenerateUncached @GenerateInline(inlineByDefault = true) @GenerateCached -@ImportStatic(SpecialMethodSlot.class) public abstract class PyObjectStrAsObjectNode extends PNodeWithContext { public final Object executeCached(Frame frame, Object object) { return execute(frame, this, object); @@ -111,25 +107,29 @@ TruffleString str(long object, @Specialization(guards = "!isTruffleString(obj)") static Object str(VirtualFrame frame, Node inliningTarget, Object obj, - @Cached GetClassNode getClassNode, - @Cached(parameters = "Str", inline = false) LookupSpecialMethodSlotNode lookupStr, - @Cached(inline = false) CallUnaryMethodNode callStr, - @Cached GetClassNode getResultClassNode, - @Cached(inline = false) IsSubtypeNode isSubtypeNode, - @Cached PRaiseNode.Lazy raiseNode) { - Object type = getClassNode.execute(inliningTarget, obj); - Object strDescr = lookupStr.execute(frame, type, obj); - // All our objects should have __str__ - assert strDescr != PNone.NO_VALUE; - Object result = callStr.executeObject(frame, strDescr, obj); - result = assertNoJavaString(result); - if (result instanceof TruffleString || isSubtypeNode.execute(getResultClassNode.execute(inliningTarget, result), PythonBuiltinClassType.PString)) { + @Cached GetObjectSlotsNode getSlots, + @Cached CallSlotUnaryNode callSlot, + @Cached PyObjectReprAsObjectNode repr, + @Cached PyUnicodeCheckNode checkNode, + @Cached PRaiseNode raiseNode) { + TpSlots slots = getSlots.execute(inliningTarget, obj); + if (slots.tp_str() == null) { + return repr.execute(frame, inliningTarget, obj); + } + Object result = callSlot.execute(frame, inliningTarget, slots.tp_str(), obj); + assertNoJavaString(result); + if (checkNode.execute(inliningTarget, result)) { return result; } else { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.RETURNED_NON_STRING, T___STR__, result); + throw raiseTypeError(inliningTarget, raiseNode, result); } } + @InliningCutoff + private static PException raiseTypeError(Node inliningTarget, PRaiseNode raiseNode, Object result) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.RETURNED_NON_STRING, T___STR__, result); + } + @NeverDefault public static PyObjectStrAsObjectNode create() { return PyObjectStrAsObjectNodeGen.create(); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectStrAsTruffleStringNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectStrAsTruffleStringNode.java index a3a06130c4..bf84d07495 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectStrAsTruffleStringNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectStrAsTruffleStringNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceCheckNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceCheckNode.java index 27cc41fbc9..bdc9410347 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceCheckNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceCheckNode.java @@ -40,14 +40,11 @@ */ package com.oracle.graal.python.lib; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.util.LazyInteropLibrary; import com.oracle.graal.python.runtime.sequence.PSequence; -import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; @@ -89,20 +86,11 @@ static boolean doDict(@SuppressWarnings("unused") PDict object) { static boolean doGeneric(Node inliningTarget, Object object, @Cached PyDictCheckNode dictCheckNode, @Cached GetClassNode getClassNode, - @Cached GetCachedTpSlotsNode getSlotsNode, - @Cached LazyInteropLibrary lazyLib) { + @Cached GetCachedTpSlotsNode getSlotsNode) { if (dictCheckNode.execute(inliningTarget, object)) { return false; } Object type = getClassNode.execute(inliningTarget, object); - if (type == PythonBuiltinClassType.ForeignObject) { - return checkForeign(inliningTarget, object, lazyLib); - } return getSlotsNode.execute(inliningTarget, type).sq_item() != null; } - - @InliningCutoff - private static boolean checkForeign(Node inliningTarget, Object object, LazyInteropLibrary lazyLib) { - return lazyLib.get(inliningTarget).hasArrayElements(object); - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceConcat.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceConcat.java deleted file mode 100644 index b428605f03..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceConcat.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.lib; - -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; - -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNotImplemented; -import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; -import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ListGeneralizationNode; -import com.oracle.graal.python.builtins.objects.list.PList; -import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.type.TpSlots; -import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.CallSlotBinaryFuncNode; -import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.BinaryOpSlot; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; -import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.Fallback; -import com.oracle.truffle.api.dsl.GenerateCached; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedBranchProfile; -import com.oracle.truffle.api.strings.TruffleString; - -@GenerateInline -@GenerateCached(false) -public abstract class PySequenceConcat extends PNodeWithContext { - public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object v, Object w); - - @NeverDefault - protected static SequenceStorageNodes.ConcatNode createConcat() { - return SequenceStorageNodes.ConcatNode.create(ListGeneralizationNode::create); - } - - @Specialization - static PList doPList(Node inliningTarget, PList left, PList right, - @Exclusive @Cached GetClassNode getClassNode, - @Shared @Cached(value = "createConcat()", inline = false) SequenceStorageNodes.ConcatNode concatNode, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - SequenceStorage newStore = concatNode.execute(left.getSequenceStorage(), right.getSequenceStorage()); - return factory.createList(getClassNode.execute(inliningTarget, left), newStore); - } - - @Specialization(guards = {"isBuiltinTuple(left)", "isBuiltinTuple(right)"}) - static PTuple doTuple(PTuple left, PTuple right, - @Shared @Cached(value = "createConcat()", inline = false) SequenceStorageNodes.ConcatNode concatNode, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - SequenceStorage concatenated = concatNode.execute(left.getSequenceStorage(), right.getSequenceStorage()); - return factory.createTuple(concatenated); - } - - @Specialization - static TruffleString doIt(TruffleString left, TruffleString right, - @Cached(inline = false) TruffleString.ConcatNode concatNode) { - return concatNode.execute(left, right, TS_ENCODING, false); - } - - @Fallback - static Object doIt(VirtualFrame frame, Node inliningTarget, Object v, Object w, - @Exclusive @Cached GetClassNode getVClass, - @Cached GetCachedTpSlotsNode getVSlots, - @Cached GetCachedTpSlotsNode getWSlots, - @Exclusive @Cached GetClassNode getWClass, - @Cached PySequenceCheckNode pySeqCheckV, - @Cached PySequenceCheckNode pySeqCheckW, - @Cached CallBinaryOp1Node callBinaryOp1Node, - @Cached InlinedBranchProfile hasNbAddSlot, - @Cached InlinedBranchProfile hasNbAddResult, - @Cached CallSlotBinaryFuncNode callBinarySlotNode, - @Cached PRaiseNode.Lazy raiseNode) { - Object classV = getVClass.execute(inliningTarget, v); - TpSlots slotsV = getVSlots.execute(inliningTarget, classV); - if (slotsV.sq_concat() != null) { - return callBinarySlotNode.execute(frame, inliningTarget, slotsV.sq_concat(), v, w); - } - if (pySeqCheckV.execute(inliningTarget, v) && pySeqCheckW.execute(inliningTarget, w)) { - Object classW = getWClass.execute(inliningTarget, w); - TpSlots slotsW = getWSlots.execute(inliningTarget, classW); - TpSlot slotV = slotsV.nb_add(); - TpSlot slotW = slotsW.nb_add(); - if (slotV != null || slotW != null) { - hasNbAddSlot.enter(inliningTarget); - Object result = callBinaryOp1Node.execute(frame, inliningTarget, v, classV, slotV, w, classW, slotW, BinaryOpSlot.NB_ADD); - if (result != PNotImplemented.NOT_IMPLEMENTED) { - hasNbAddResult.enter(inliningTarget); - return result; - } - } - } - return raiseNotSupported(inliningTarget, v, raiseNode); - } - - @InliningCutoff - private static PException raiseNotSupported(Node inliningTarget, Object v, PRaiseNode.Lazy raiseNode) { - return raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.OBJ_CANT_BE_CONCATENATED, v); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceConcatNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceConcatNode.java new file mode 100644 index 0000000000..e7984682bb --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceConcatNode.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; +import com.oracle.graal.python.builtins.objects.list.PList; +import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.CallSlotBinaryFuncNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.ReversibleSlot; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PNodeWithContext; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Exclusive; +import com.oracle.truffle.api.dsl.Cached.Shared; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; +import com.oracle.truffle.api.strings.TruffleString; + +@GenerateInline +@GenerateCached(false) +public abstract class PySequenceConcatNode extends PNodeWithContext { + public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object v, Object w); + + @Specialization(guards = {"isBuiltinList(left)", "isBuiltinList(right)"}) + static PList doPList(Node inliningTarget, PList left, PList right, + @Shared @Cached SequenceStorageNodes.ConcatListOrTupleNode concatNode, + @Bind PythonLanguage language) { + SequenceStorage newStore = concatNode.execute(inliningTarget, left.getSequenceStorage(), right.getSequenceStorage()); + return PFactory.createList(language, newStore); + } + + @Specialization(guards = {"isBuiltinTuple(left)", "isBuiltinTuple(right)"}) + static PTuple doTuple(Node inliningTarget, PTuple left, PTuple right, + @Shared @Cached SequenceStorageNodes.ConcatListOrTupleNode concatNode, + @Bind PythonLanguage language) { + SequenceStorage concatenated = concatNode.execute(inliningTarget, left.getSequenceStorage(), right.getSequenceStorage()); + return PFactory.createTuple(language, concatenated); + } + + @Specialization + static TruffleString doIt(TruffleString left, TruffleString right, + @Cached(inline = false) TruffleString.ConcatNode concatNode) { + return concatNode.execute(left, right, TS_ENCODING, false); + } + + @Fallback + static Object doIt(VirtualFrame frame, Node inliningTarget, Object v, Object w, + @Exclusive @Cached GetClassNode getVClass, + @Cached GetCachedTpSlotsNode getVSlots, + @Cached GetCachedTpSlotsNode getWSlots, + @Exclusive @Cached GetClassNode getWClass, + @Cached PySequenceCheckNode pySeqCheckV, + @Cached PySequenceCheckNode pySeqCheckW, + @Cached CallBinaryOp1Node callBinaryOp1Node, + @Cached InlinedBranchProfile hasNbAddSlot, + @Cached InlinedBranchProfile hasNbAddResult, + @Cached CallSlotBinaryFuncNode callBinarySlotNode, + @Cached PRaiseNode raiseNode) { + Object classV = getVClass.execute(inliningTarget, v); + TpSlots slotsV = getVSlots.execute(inliningTarget, classV); + if (slotsV.sq_concat() != null) { + return callBinarySlotNode.execute(frame, inliningTarget, slotsV.sq_concat(), v, w); + } + if (pySeqCheckV.execute(inliningTarget, v) && pySeqCheckW.execute(inliningTarget, w)) { + Object classW = getWClass.execute(inliningTarget, w); + TpSlots slotsW = getWSlots.execute(inliningTarget, classW); + hasNbAddSlot.enter(inliningTarget); + Object result = callBinaryOp1Node.execute(frame, inliningTarget, v, classV, slotsV, w, classW, slotsW, ReversibleSlot.NB_ADD); + if (result != PNotImplemented.NOT_IMPLEMENTED) { + hasNbAddResult.enter(inliningTarget); + return result; + } + } + return raiseNotSupported(inliningTarget, v, raiseNode); + } + + @InliningCutoff + private static PException raiseNotSupported(Node inliningTarget, Object v, PRaiseNode raiseNode) { + return raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.OBJ_CANT_BE_CONCATENATED, v); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceContainsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceContainsNode.java index c4a7aa41f3..7fd3e1120a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceContainsNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceContainsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,24 +40,20 @@ */ package com.oracle.graal.python.lib; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.PNotImplemented; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqContains.CallSlotSqContainsNode; import com.oracle.graal.python.lib.PySequenceIterSearchNode.LazyPySequenceIterSeachNode; -import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.exception.PException; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; +import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; /** * Equivalent of CPython's {@code PySequence_Contains}. @@ -65,33 +61,21 @@ @GenerateUncached @GenerateInline @GenerateCached(false) -@ImportStatic(SpecialMethodSlot.class) -public abstract class PySequenceContainsNode extends PNodeWithContext { - public abstract boolean execute(Frame frame, Node inlining, Object container, Object key); +public abstract class PySequenceContainsNode extends Node { + public abstract boolean execute(Frame frame, Node inliningTarget, Object container, Object key); @Specialization - static boolean contains(Frame frame, Node inliningTarget, Object container, Object key, - @Cached GetClassNode getReceiverClass, - @Cached(parameters = "Contains", inline = false) LookupSpecialMethodSlotNode lookupContains, - @Cached IsBuiltinObjectProfile noContainsProfile, - @Cached(inline = false) CallBinaryMethodNode callContains, - @Cached LazyPySequenceIterSeachNode iterSearch, - @Cached PyObjectIsTrueNode isTrue) { - Object type = getReceiverClass.execute(inliningTarget, container); - Object contains = PNone.NO_VALUE; - try { - contains = lookupContains.execute(frame, type, container); - } catch (PException e) { - e.expectAttributeError(inliningTarget, noContainsProfile); - } - Object result = PNotImplemented.NOT_IMPLEMENTED; - if (!(contains instanceof PNone)) { - result = callContains.executeObject(frame, contains, container, key); - } - if (result == PNotImplemented.NOT_IMPLEMENTED) { - return iterSearch.get(inliningTarget).executeCached(frame, container, key, PySequenceIterSearchNode.PY_ITERSEARCH_CONTAINS) == 1; + static boolean contains(VirtualFrame frame, Node inliningTarget, Object container, Object key, + @Cached GetClassNode getClassNode, + @Cached GetCachedTpSlotsNode getSlots, + @Cached InlinedConditionProfile hasContains, + @Cached CallSlotSqContainsNode callSlot, + @Cached LazyPySequenceIterSeachNode iterSearch) { + TpSlots slots = getSlots.execute(inliningTarget, getClassNode.execute(inliningTarget, container)); + if (hasContains.profile(inliningTarget, slots.sq_contains() != null)) { + return callSlot.execute(frame, inliningTarget, slots.sq_contains(), container, key); } else { - return isTrue.execute(frame, inliningTarget, result); + return iterSearch.get(inliningTarget).executeCached(frame, container, key, PySequenceIterSearchNode.PY_ITERSEARCH_CONTAINS) == 1; } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceDelItemNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceDelItemNode.java index d0a5f83b01..582aa71259 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceDelItemNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceDelItemNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,27 +40,21 @@ */ package com.oracle.graal.python.lib; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; -import static com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper.DELITEM; - +import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; -import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; -import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes; -import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionWrapperInvokeNode; -import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol; -import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming; -import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; -import com.oracle.graal.python.builtins.objects.type.MethodsFlags; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.list.ListBuiltins; +import com.oracle.graal.python.builtins.objects.list.PList; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqAssItem.CallSlotSqAssItemNode; +import com.oracle.graal.python.lib.PySequenceGetItemNode.IndexForSqSlotInt; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.truffle.api.dsl.Bind; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.ImportStatic; @@ -68,51 +62,47 @@ import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.strings.TruffleString; /** * Equivalent of CPython's {@code PySequence_DelItem}. For native object it would only call * {@code sq_ass_item} and never {@code mp_ass_subscript}. */ -@ImportStatic({PGuards.class, SpecialMethodSlot.class, ExternalFunctionNodes.PExternalFunctionWrapper.class}) -@GenerateInline(false) // One lazy usage, one eager usage => not worth it @GenerateUncached +@GenerateInline +@GenerateCached(false) +@ImportStatic(PGuards.class) public abstract class PySequenceDelItemNode extends Node { - private static final NativeCAPISymbol SYMBOL = NativeCAPISymbol.FUN_PY_SEQUENCE_DEL_ITEM; - private static final CApiTiming C_API_TIMING = CApiTiming.create(true, SYMBOL.getName()); - - public abstract Object execute(Frame frame, Object object, int index); + public abstract void execute(Frame frame, Node inliningTarget, Object container, int index); - public final Object execute(Object object, int index) { - return execute(null, object, index); + @Specialization(guards = "isBuiltinList(object)") + static void doList(VirtualFrame frame, PList object, int key, + @Cached(inline = false) ListBuiltins.SetItemNode setItemNode) { + setItemNode.executeIntKey(frame, object, key, PNone.NO_VALUE); } - @Specialization(guards = "!isNativeObject(object)") - static Object doGenericManaged(VirtualFrame frame, Object object, int index, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached GetMethodsFlagsNode getMethodsFlagsNode, - @Cached(parameters = "DelItem") LookupSpecialMethodSlotNode lookupDelItem, - @Cached CallBinaryMethodNode callDelItem, - @Cached PRaiseNode.Lazy raise) { - Object type = getClassNode.execute(inliningTarget, object); - if ((getMethodsFlagsNode.execute(inliningTarget, type) & MethodsFlags.SQ_ASS_ITEM) != 0) { - Object delItem = lookupDelItem.execute(frame, type, object); - assert delItem != PNone.NO_VALUE; - return callDelItem.executeObject(frame, delItem, object, index); - } - if ((getMethodsFlagsNode.execute(inliningTarget, type) & MethodsFlags.MP_ASS_SUBSCRIPT) != 0) { - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_A_SEQUENCE, object); + @InliningCutoff + @Specialization(replaces = "doList") + static void doGeneric(VirtualFrame frame, Node inliningTarget, Object object, int index, + @Cached GetObjectSlotsNode getSlotsNode, + @Cached IndexForSqSlotInt indexForSqSlot, + @Cached CallSlotSqAssItemNode callSetItem, + @Cached PRaiseNode raiseNode) { + TpSlots slots = getSlotsNode.execute(inliningTarget, object); + index = indexForSqSlot.execute(frame, inliningTarget, object, slots, index); + if (slots.sq_ass_item() != null) { + callSetItem.execute(frame, inliningTarget, slots.sq_ass_item(), object, index, PNone.NO_VALUE); } else { - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.OBJ_DOES_NOT_SUPPORT_ITEM_DELETION, object); + throw raiseNotSupported(object, inliningTarget, raiseNode, slots); } } - @Specialization - static Object doNative(VirtualFrame frame, PythonAbstractNativeObject object, int index, - @Bind("this") Node inliningTarget, - @Cached CApiTransitions.PythonToNativeNode toNativeNode, - @Cached ExternalFunctionWrapperInvokeNode invokeNode) { - Object executable = CApiContext.getNativeSymbol(inliningTarget, SYMBOL); - return invokeNode.execute(frame, DELITEM, C_API_TIMING, SYMBOL.getTsName(), executable, new Object[]{toNativeNode.execute(object), index}); + @InliningCutoff + static PException raiseNotSupported(Object object, Node inliningTarget, PRaiseNode raiseNode, TpSlots slots) { + TruffleString message = ErrorMessages.OBJ_DOES_NOT_SUPPORT_ITEM_DELETION; + if (slots.mp_subscript() != null) { + message = ErrorMessages.IS_NOT_A_SEQUENCE; + } + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, message, object); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceGetItemNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceGetItemNode.java index f58609af0c..e2c3e73f7f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceGetItemNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceGetItemNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,9 +40,10 @@ */ package com.oracle.graal.python.lib; +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; + import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotLen.CallSlotLenNode; @@ -50,11 +51,13 @@ import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.PRaiseNode.Lazy; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Exclusive; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.ImportStatic; @@ -69,7 +72,7 @@ * Equivalent of CPython's {@code PySequence_GetItem}. For native object it would only call * {@code sq_item} and never {@code mp_subscript}. */ -@ImportStatic({PGuards.class, SpecialMethodSlot.class, ExternalFunctionNodes.PExternalFunctionWrapper.class}) +@ImportStatic({PGuards.class, ExternalFunctionNodes.PExternalFunctionWrapper.class}) @GenerateInline(false) // One lazy usage, one eager usage => not worth it @GenerateUncached public abstract class PySequenceGetItemNode extends Node { @@ -80,26 +83,14 @@ public final Object execute(Object object, int index) { } @Specialization - static Object doGeneric(Frame frame, Object object, int indexIn, + static Object doGeneric(VirtualFrame frame, Object object, int index, @Bind("this") Node inliningTarget, @Cached GetObjectSlotsNode getSlotsNode, - @Cached InlinedConditionProfile negativeIndexProfile, - @Cached CallSlotLenNode callLenSlot, + @Cached IndexForSqSlotInt indexForSqSlot, @Cached CallSlotSizeArgFun callSqItem, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { TpSlots slots = getSlotsNode.execute(inliningTarget, object); - return getItem((VirtualFrame) frame, inliningTarget, object, slots, indexIn, negativeIndexProfile, callLenSlot, callSqItem, raiseNode); - } - - public static Object getItem(VirtualFrame frame, Node inliningTarget, Object object, TpSlots slots, int indexIn, - InlinedConditionProfile negativeIndexProfile, CallSlotLenNode callLenSlot, CallSlotSizeArgFun callSqItem, PRaiseNode.Lazy raiseNode) { - int index = indexIn; - if (negativeIndexProfile.profile(inliningTarget, index < 0)) { - if (slots.sq_length() != null) { - int len = callLenSlot.execute(frame, inliningTarget, slots.sq_length(), object); - index += len; - } - } + index = indexForSqSlot.execute(frame, inliningTarget, object, slots, index); if (slots.sq_item() != null) { return callSqItem.execute(frame, inliningTarget, slots.sq_item(), object, index); } else { @@ -108,11 +99,64 @@ public static Object getItem(VirtualFrame frame, Node inliningTarget, Object obj } @InliningCutoff - private static PException raiseNotSupported(Object object, Node inliningTarget, Lazy raiseNode, TpSlots slots) { + private static PException raiseNotSupported(Object object, Node inliningTarget, PRaiseNode raiseNode, TpSlots slots) { TruffleString message = ErrorMessages.OBJ_DOES_NOT_SUPPORT_INDEXING; if (slots.mp_subscript() != null) { message = ErrorMessages.IS_NOT_A_SEQUENCE; } - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, message, object); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, message, object); + } + + @GenerateInline + @GenerateCached(false) + @GenerateUncached + abstract static class IndexForSqSlotInt extends Node { + public abstract int execute(VirtualFrame frame, Node inliningTarget, Object object, TpSlots slots, int index); + + @Specialization(guards = "index >= 0") + static int doInt(@SuppressWarnings("unused") Object object, @SuppressWarnings("unused") TpSlots slots, int index) { + return index; + } + + @Fallback + @InliningCutoff + static int doNegativeInt(VirtualFrame frame, Node inliningTarget, Object object, TpSlots slots, int index, + @Cached InlinedConditionProfile negativeIndexProfile, + @Cached CallSlotLenNode callLenSlot) { + if (negativeIndexProfile.profile(inliningTarget, index < 0)) { + if (slots.sq_length() != null) { + int len = callLenSlot.execute(frame, inliningTarget, slots.sq_length(), object); + index += len; + } + } + return index; + } + } + + @GenerateInline + @GenerateCached(false) + @GenerateUncached + abstract static class IndexForSqSlot extends Node { + public abstract int execute(VirtualFrame frame, Node inliningTarget, Object object, TpSlots slots, Object index); + + @Specialization + static int doInt(VirtualFrame frame, Node inliningTarget, Object object, TpSlots slots, int index, + @Exclusive @Cached IndexForSqSlotInt indexForSqSlotInt) { + return indexForSqSlotInt.execute(frame, inliningTarget, object, slots, index); + } + + @Specialization(replaces = "doInt") + @InliningCutoff + static int doGeneric(VirtualFrame frame, Node inliningTarget, Object object, TpSlots slots, Object indexObj, + @Cached PyIndexCheckNode checkNode, + @Cached PyNumberAsSizeNode asSizeNode, + @Exclusive @Cached IndexForSqSlotInt indexForSqSlotInt, + @Cached PRaiseNode raiseNode) { + if (!checkNode.execute(inliningTarget, indexObj)) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.SEQUENCE_INDEX_MUST_BE_INT_NOT_P, indexObj); + } + int index = asSizeNode.executeExact(frame, inliningTarget, indexObj, PythonBuiltinClassType.IndexError); + return indexForSqSlotInt.execute(frame, inliningTarget, object, slots, index); + } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceInPlaceConcatNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceInPlaceConcatNode.java new file mode 100644 index 0000000000..e1b4970142 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceInPlaceConcatNode.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryFunc.CallSlotBinaryFuncNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.InplaceSlot; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PNodeWithContext; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; + +@GenerateInline +@GenerateCached(false) +public abstract class PySequenceInPlaceConcatNode extends PNodeWithContext { + public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object v, Object w); + + @Specialization + static Object doIt(VirtualFrame frame, Node inliningTarget, Object v, Object w, + @Cached GetClassNode getVClass, + @Cached GetCachedTpSlotsNode getVSlots, + @Cached GetCachedTpSlotsNode getWSlots, + @Cached GetClassNode getWClass, + @Cached PySequenceCheckNode pySeqCheckV, + @Cached PySequenceCheckNode pySeqCheckW, + @Cached CallBinaryIOp1Node callBinaryIOp1Node, + @Cached InlinedBranchProfile hasInplaceConcat, + @Cached InlinedBranchProfile hasConcat, + @Cached InlinedBranchProfile hasNbAddSlot, + @Cached InlinedBranchProfile hasNbAddResult, + @Cached CallSlotBinaryFuncNode callBinarySlotNode, + @Cached PRaiseNode raiseNode) { + Object classV = getVClass.execute(inliningTarget, v); + TpSlots slotsV = getVSlots.execute(inliningTarget, classV); + TpSlot concatSlot = null; + if (slotsV.sq_inplace_concat() != null) { + hasInplaceConcat.enter(inliningTarget); + concatSlot = slotsV.sq_inplace_concat(); + } else if (slotsV.sq_concat() != null) { + hasConcat.enter(inliningTarget); + concatSlot = slotsV.sq_concat(); + } + if (concatSlot != null) { + return callBinarySlotNode.execute(frame, inliningTarget, concatSlot, v, w); + } + if (pySeqCheckV.execute(inliningTarget, v) && pySeqCheckW.execute(inliningTarget, w)) { + Object classW = getWClass.execute(inliningTarget, w); + TpSlots slotsW = getWSlots.execute(inliningTarget, classW); + hasNbAddSlot.enter(inliningTarget); + Object result = callBinaryIOp1Node.execute(frame, inliningTarget, v, classV, slotsV, w, classW, slotsW, InplaceSlot.NB_INPLACE_ADD); + if (result != PNotImplemented.NOT_IMPLEMENTED) { + hasNbAddResult.enter(inliningTarget); + return result; + } + } + return raiseNotSupported(inliningTarget, v, raiseNode); + } + + @InliningCutoff + private static PException raiseNotSupported(Node inliningTarget, Object v, PRaiseNode raiseNode) { + return raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.OBJ_CANT_BE_CONCATENATED, v); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceInPlaceRepeatNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceInPlaceRepeatNode.java new file mode 100644 index 0000000000..e33fe8544a --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceInPlaceRepeatNode.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.PNotImplemented; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotBinaryOp.InplaceSlot; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun.CallSlotSizeArgFun; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PNodeWithContext; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; + +@GenerateInline +@GenerateCached(false) +public abstract class PySequenceInPlaceRepeatNode extends PNodeWithContext { + public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object o, int count); + + @Specialization + static Object doIt(VirtualFrame frame, Node inliningTarget, Object o, int count, + @Cached GetClassNode getClassNode, + @Cached GetCachedTpSlotsNode slotsNode, + @Cached PySequenceCheckNode sequenceCheckNode, + @Cached CallBinaryIOp1Node callBinaryIOp1Node, + @Cached InlinedBranchProfile hasInplaceRepeat, + @Cached InlinedBranchProfile hasRepeat, + @Cached InlinedBranchProfile isSequence, + @Cached InlinedBranchProfile hasNbMultiplyResult, + @Cached CallSlotSizeArgFun callSlot, + @Cached PRaiseNode raiseNode) { + Object classV = getClassNode.execute(inliningTarget, o); + TpSlots slotsV = slotsNode.execute(inliningTarget, classV); + TpSlot repeatSlot = null; + if (slotsV.sq_inplace_repeat() != null) { + hasInplaceRepeat.enter(inliningTarget); + repeatSlot = slotsV.sq_inplace_repeat(); + } else if (slotsV.sq_repeat() != null) { + hasRepeat.enter(inliningTarget); + repeatSlot = slotsV.sq_repeat(); + } + if (repeatSlot != null) { + return callSlot.execute(frame, inliningTarget, repeatSlot, o, count); + } + if (sequenceCheckNode.execute(inliningTarget, o)) { + isSequence.enter(inliningTarget); + PythonBuiltinClassType countType = PythonBuiltinClassType.PInt; + Object result = callBinaryIOp1Node.execute(frame, inliningTarget, o, classV, slotsV, count, countType, countType.getSlots(), InplaceSlot.NB_INPLACE_MULTIPLY); + if (result != PNotImplemented.NOT_IMPLEMENTED) { + hasNbMultiplyResult.enter(inliningTarget); + return result; + } + } + return raiseNotSupported(inliningTarget, o, raiseNode); + } + + @InliningCutoff + private static PException raiseNotSupported(Node inliningTarget, Object v, PRaiseNode raiseNode) { + return raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.OBJ_CANT_BE_REPEATED, v); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceIterSearchNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceIterSearchNode.java index 8d96d229df..a41b191157 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceIterSearchNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceIterSearchNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,33 +41,27 @@ package com.oracle.graal.python.lib; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; -import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.nodes.LoopNode; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.InlinedIntValueProfile; +import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile; /** * Equivalent of CPython's {@code _PySequence_IterSearch}. */ @GenerateUncached -@ImportStatic(SpecialMethodSlot.class) @GenerateInline(inlineByDefault = true) public abstract class PySequenceIterSearchNode extends PNodeWithContext { // return # of times obj appears in seq. @@ -91,37 +85,28 @@ public final int execute(Node inliningTarget, Object container, Object key, int static int search(Frame frame, Node inliningTarget, Object container, Object key, int operation, @Cached PyObjectGetIter getIter, @Cached IsBuiltinObjectProfile noIterProfile, - @Cached PRaiseNode.Lazy raiseNode, - @Cached GetClassNode getIterClass, - @Cached(parameters = "Next", inline = false) LookupSpecialMethodSlotNode lookupIternext, - @Cached IsBuiltinObjectProfile noNextProfile, - @Cached(inline = false) CallUnaryMethodNode callNext, - @Cached(inline = false) PyObjectRichCompareBool.EqNode eqNode, - @Cached IsBuiltinObjectProfile stopIterationProfile, + @Cached PRaiseNode raiseNode, + @Cached PyIterNextNode nextNode, + @Cached InlinedLoopConditionProfile loopProfile, + @Cached PyObjectRichCompareBool eqNode, @Cached InlinedIntValueProfile opProfile) { Object iterator; try { iterator = getIter.execute(frame, inliningTarget, container); } catch (PException e) { e.expectTypeError(inliningTarget, noIterProfile); - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.IS_NOT_A_CONTAINER, container); - } - Object next = PNone.NO_VALUE; - try { - next = lookupIternext.execute(frame, getIterClass.execute(inliningTarget, iterator), iterator); - } catch (PException e) { - e.expect(inliningTarget, PythonBuiltinClassType.AttributeError, noNextProfile); - } - if (next instanceof PNone) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.OBJ_NOT_ITERABLE, iterator); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ARGUMENT_OF_TYPE_P_IS_NOT_ITERABLE, container); } + operation = opProfile.profile(inliningTarget, operation); int i = 0; int n = 0; boolean wrapped = false; - while (true) { + boolean exhausted = false; + do { try { - if (eqNode.compare(frame, inliningTarget, callNext.executeObject(frame, next, iterator), key)) { - switch (opProfile.profile(inliningTarget, operation)) { + Object next = nextNode.execute(frame, inliningTarget, iterator); + if (eqNode.executeEq(frame, inliningTarget, next, key)) { + switch (operation) { case PY_ITERSEARCH_COUNT: n++; break; @@ -130,7 +115,7 @@ static int search(Frame frame, Node inliningTarget, Object container, Object key LoopNode.reportLoopCount(inliningTarget, wrapped ? Integer.MAX_VALUE : i + 1); } if (wrapped) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.OverflowError, ErrorMessages.INDEX_EXCEEDS_INT); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.OverflowError, ErrorMessages.INDEX_EXCEEDS_INT); } else { return i; } @@ -141,21 +126,21 @@ static int search(Frame frame, Node inliningTarget, Object container, Object key return 1; } } - } catch (PException e) { - e.expectStopIteration(inliningTarget, stopIterationProfile); - if (CompilerDirectives.hasNextTier()) { - LoopNode.reportLoopCount(inliningTarget, wrapped ? Integer.MAX_VALUE : i + 1); + if (operation == PY_ITERSEARCH_INDEX && i == Integer.MAX_VALUE) { + wrapped = true; } - if (opProfile.profile(inliningTarget, operation) == PY_ITERSEARCH_INDEX) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.X_NOT_IN_SEQUENCE); - } - return n; - } - if (opProfile.profile(inliningTarget, operation) == PY_ITERSEARCH_INDEX && i == Integer.MAX_VALUE) { - wrapped = true; + i++; + } catch (IteratorExhausted e) { + exhausted = true; } - i++; + } while (loopProfile.profile(inliningTarget, !exhausted)); + if (CompilerDirectives.hasNextTier()) { + LoopNode.reportLoopCount(inliningTarget, wrapped ? Integer.MAX_VALUE : i + 1); + } + if (operation == PY_ITERSEARCH_INDEX) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.X_NOT_IN_SEQUENCE); } + return n; } @GenerateInline diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceSetItemNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceSetItemNode.java index 8ee4597212..aa3ccaab98 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceSetItemNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceSetItemNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,27 +40,20 @@ */ package com.oracle.graal.python.lib; -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; -import static com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.PExternalFunctionWrapper.SETITEM; - -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; -import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; -import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes; -import com.oracle.graal.python.builtins.objects.cext.capi.ExternalFunctionNodes.ExternalFunctionWrapperInvokeNode; -import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol; -import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTiming; -import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions; -import com.oracle.graal.python.builtins.objects.type.MethodsFlags; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.list.ListBuiltins; +import com.oracle.graal.python.builtins.objects.list.PList; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqAssItem.CallSlotSqAssItemNode; +import com.oracle.graal.python.lib.PySequenceGetItemNode.IndexForSqSlotInt; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.CallTernaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.truffle.api.dsl.Bind; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.ImportStatic; @@ -68,51 +61,47 @@ import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.strings.TruffleString; /** * Equivalent of CPython's {@code PySequence_SetItem}. For native object it would only call * {@code sq_ass_item} and never {@code mp_ass_subscript}. */ -@ImportStatic({PGuards.class, SpecialMethodSlot.class, ExternalFunctionNodes.PExternalFunctionWrapper.class}) -@GenerateInline(false) // One lazy usage, one eager usage => not worth it @GenerateUncached +@GenerateInline +@GenerateCached(false) +@ImportStatic(PGuards.class) public abstract class PySequenceSetItemNode extends Node { - private static final NativeCAPISymbol SYMBOL = NativeCAPISymbol.FUN_PY_SEQUENCE_SET_ITEM; - private static final CApiTiming C_API_TIMING = CApiTiming.create(true, SYMBOL.getName()); - - public abstract Object execute(Frame frame, Object object, int index, Object value); + public abstract void execute(Frame frame, Node inliningTarget, Object container, int index, Object item); - public final Object execute(Object object, int index, Object value) { - return execute(null, object, index, value); + @Specialization(guards = "isBuiltinList(object)") + static void doList(VirtualFrame frame, PList object, int key, Object value, + @Cached(inline = false) ListBuiltins.SetItemNode setItemNode) { + setItemNode.executeIntKey(frame, object, key, value); } - @Specialization(guards = "!isNativeObject(object)") - static Object doGenericManaged(VirtualFrame frame, Object object, int index, Object value, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached GetMethodsFlagsNode getMethodsFlagsNode, - @Cached(parameters = "SetItem") LookupSpecialMethodSlotNode lookupSetItem, - @Cached CallTernaryMethodNode callSetItem, - @Cached PRaiseNode.Lazy raise) { - Object type = getClassNode.execute(inliningTarget, object); - if ((getMethodsFlagsNode.execute(inliningTarget, type) & MethodsFlags.SQ_ASS_ITEM) != 0) { - Object setItem = lookupSetItem.execute(frame, type, object); - assert setItem != PNone.NO_VALUE; - return callSetItem.execute(frame, setItem, object, index, value); - } - if ((getMethodsFlagsNode.execute(inliningTarget, type) & MethodsFlags.MP_ASS_SUBSCRIPT) != 0) { - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.IS_NOT_A_SEQUENCE, object); + @InliningCutoff + @Specialization(replaces = "doList") + static void doGeneric(VirtualFrame frame, Node inliningTarget, Object object, int index, Object value, + @Cached GetObjectSlotsNode getSlotsNode, + @Cached IndexForSqSlotInt indexForSqSlot, + @Cached CallSlotSqAssItemNode callSetItem, + @Cached PRaiseNode raiseNode) { + TpSlots slots = getSlotsNode.execute(inliningTarget, object); + index = indexForSqSlot.execute(frame, inliningTarget, object, slots, index); + if (slots.sq_ass_item() != null) { + callSetItem.execute(frame, inliningTarget, slots.sq_ass_item(), object, index, value); } else { - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT, object); + throw raiseNotSupported(object, inliningTarget, raiseNode, slots); } } - @Specialization - static Object doNative(VirtualFrame frame, PythonAbstractNativeObject object, int index, Object value, - @Bind("this") Node inliningTarget, - @Cached CApiTransitions.PythonToNativeNode toNativeNode, - @Cached ExternalFunctionWrapperInvokeNode invokeNode) { - Object executable = CApiContext.getNativeSymbol(inliningTarget, SYMBOL); - return invokeNode.execute(frame, SETITEM, C_API_TIMING, SYMBOL.getTsName(), executable, new Object[]{toNativeNode.execute(object), index, toNativeNode.execute(value)}); + @InliningCutoff + static PException raiseNotSupported(Object object, Node inliningTarget, PRaiseNode raiseNode, TpSlots slots) { + TruffleString message = ErrorMessages.OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT; + if (slots.mp_subscript() != null) { + message = ErrorMessages.IS_NOT_A_SEQUENCE; + } + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, message, object); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceSizeNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceSizeNode.java index 652ec34014..b48b8b0a62 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceSizeNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySequenceSizeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -56,7 +56,6 @@ import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.PRaiseNode.Lazy; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Cached; @@ -125,7 +124,7 @@ static int doPBytes(PBytesLike object) { static int doOthers(Frame frame, Node inliningTarget, Object object, @Cached GetObjectSlotsNode getTpSlotsNode, @Cached TpSlotLen.CallSlotLenNode callSlotLenNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Exclusive @Cached PRaiseNode raiseNode) { TpSlots slots = getTpSlotsNode.execute(inliningTarget, object); if (slots.sq_length() != null) { return callSlotLenNode.execute((VirtualFrame) frame, inliningTarget, slots.sq_length(), object); @@ -134,11 +133,11 @@ static int doOthers(Frame frame, Node inliningTarget, Object object, } @InliningCutoff - private static PException raiseError(Object object, Node inliningTarget, Lazy raiseNode, TpSlots slots) { + private static PException raiseError(Object object, Node inliningTarget, PRaiseNode raiseNode, TpSlots slots) { TruffleString error = ErrorMessages.OBJ_HAS_NO_LEN; if (slots.mp_length() == null) { error = ErrorMessages.IS_NOT_A_SEQUENCE; } - throw raiseNode.get(inliningTarget).raise(TypeError, error, object); + throw raiseNode.raise(inliningTarget, TypeError, error, object); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySliceNew.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySliceNew.java index e4380f48dd..516c0b2c29 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySliceNew.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PySliceNew.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,12 +40,13 @@ */ package com.oracle.graal.python.lib; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.slice.PSlice; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.dsl.Cached; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; @@ -66,42 +67,42 @@ public abstract class PySliceNew extends PNodeWithContext { @SuppressWarnings("unused") static PSlice doInt(int start, int stop, PNone step, - @Cached.Shared("factory") @Cached(inline = false) PythonObjectFactory factory) { - return factory.createIntSlice(start, stop, 1, false, true); + @Bind PythonLanguage language) { + return PFactory.createIntSlice(language, start, stop, 1, false, true); } @Specialization static PSlice doInt(int start, int stop, int step, - @Cached.Shared("factory") @Cached(inline = false) PythonObjectFactory factory) { - return factory.createIntSlice(start, stop, step); + @Bind PythonLanguage language) { + return PFactory.createIntSlice(language, start, stop, step); } @Specialization @SuppressWarnings("unused") static PSlice doInt(PNone start, int stop, PNone step, - @Cached.Shared("factory") @Cached(inline = false) PythonObjectFactory factory) { - return factory.createIntSlice(0, stop, 1, true, true); + @Bind PythonLanguage language) { + return PFactory.createIntSlice(language, 0, stop, 1, true, true); } @Specialization @SuppressWarnings("unused") static PSlice doInt(PNone start, int stop, int step, - @Cached.Shared("factory") @Cached(inline = false) PythonObjectFactory factory) { - return factory.createIntSlice(0, stop, step, true, false); + @Bind PythonLanguage language) { + return PFactory.createIntSlice(language, 0, stop, step, true, false); } // This specialization is often used when called from C builtins @Specialization(guards = {"isIntRange(start)", "isIntRange(stop)"}) @SuppressWarnings("unused") static PSlice doLong(long start, long stop, PNone step, - @Cached.Shared("factory") @Cached(inline = false) PythonObjectFactory factory) { - return factory.createIntSlice((int) start, (int) stop, 1, false, true); + @Bind PythonLanguage language) { + return PFactory.createIntSlice(language, (int) start, (int) stop, 1, false, true); } @Fallback static PSlice doGeneric(Object start, Object stop, Object step, - @Cached.Shared("factory") @Cached(inline = false) PythonObjectFactory factory) { + @Bind PythonLanguage language) { assert start != PNone.NO_VALUE && stop != PNone.NO_VALUE && step != PNone.NO_VALUE; - return factory.createObjectSlice(start, stop, step); + return PFactory.createObjectSlice(language, start, stop, step); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTimeFromObjectNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTimeFromObjectNode.java index 629782b3bd..ebd030ea24 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTimeFromObjectNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTimeFromObjectNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,7 +47,7 @@ import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; +import com.oracle.graal.python.nodes.truffle.PythonIntegerAndFloatTypes; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaDoubleNode; import com.oracle.graal.python.runtime.exception.PException; @@ -66,7 +66,7 @@ /** * Equivalent of {@code _PyTime_FromObject} from CPython. */ -@TypeSystemReference(PythonArithmeticTypes.class) +@TypeSystemReference(PythonIntegerAndFloatTypes.class) @GenerateInline @GenerateCached(false) public abstract class PyTimeFromObjectNode extends PNodeWithContext { @@ -82,10 +82,10 @@ public enum RoundType { @Specialization static long doDouble(Node inliningTarget, double d, RoundType round, long unitToNs, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { // Implements _PyTime_FromDouble, rounding mode (HALF_UP) is hard-coded for now if (Double.isNaN(d)) { - throw raiseNode.get(inliningTarget).raise(ValueError, INVALID_VALUE_NAN); + throw raiseNode.raise(inliningTarget, ValueError, INVALID_VALUE_NAN); } double value = d * unitToNs; @@ -102,25 +102,25 @@ static long doDouble(Node inliningTarget, double d, RoundType round, long unitTo break; } if (value < Long.MIN_VALUE || value > Long.MAX_VALUE) { - throw raiseTimeOverflow(raiseNode.get(inliningTarget)); + throw raiseTimeOverflow(inliningTarget, raiseNode); } return (long) value; } @Specialization static long doLong(Node inliningTarget, long l, @SuppressWarnings("unused") RoundType round, long unitToNs, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { try { return PythonUtils.multiplyExact(l, unitToNs); } catch (OverflowException e) { - throw raiseTimeOverflow(raiseNode.get(inliningTarget)); + throw raiseTimeOverflow(inliningTarget, raiseNode); } } @Specialization static long doOther(VirtualFrame frame, Node inliningTarget, Object value, RoundType round, long unitToNs, @Cached CastToJavaDoubleNode castToDouble, - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Cached PyLongAsLongAndOverflowNode asLongNode) { try { return doDouble(inliningTarget, castToDouble.execute(inliningTarget, value), round, unitToNs, raiseNode); @@ -128,12 +128,12 @@ static long doOther(VirtualFrame frame, Node inliningTarget, Object value, Round try { return doLong(inliningTarget, asLongNode.execute(frame, inliningTarget, value), round, unitToNs, raiseNode); } catch (OverflowException e1) { - throw raiseTimeOverflow(raiseNode.get(inliningTarget)); + throw raiseTimeOverflow(inliningTarget, raiseNode); } } } - private static PException raiseTimeOverflow(PRaiseNode raise) { - throw raise.raise(PythonBuiltinClassType.OverflowError, TOO_LARGE_TO_CONVERT_TO, "timestamp", "long"); + private static PException raiseTimeOverflow(Node inliningTarget, PRaiseNode raise) { + throw raise.raise(inliningTarget, PythonBuiltinClassType.OverflowError, TOO_LARGE_TO_CONVERT_TO, "timestamp", "long"); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTraceBackPrintNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTraceBackPrintNode.java index 29e4b6c947..ae90fd3f61 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTraceBackPrintNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTraceBackPrintNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,6 +44,7 @@ import static com.oracle.graal.python.builtins.modules.io.IONodes.T_FLUSH; import static com.oracle.graal.python.builtins.modules.io.IONodes.T_WRITE; import static com.oracle.graal.python.nodes.BuiltinNames.T_TRACEBACKLIMIT; +import static com.oracle.graal.python.nodes.ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC; import static com.oracle.graal.python.nodes.StringLiterals.J_NEWLINE; import static com.oracle.graal.python.nodes.StringLiterals.T_SPACE; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; @@ -55,6 +56,8 @@ import java.nio.charset.StandardCharsets; import com.oracle.graal.python.PythonFileDetector; +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.code.PCode; import com.oracle.graal.python.builtins.objects.exception.ExceptionNodes; @@ -73,7 +76,7 @@ import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.OverflowException; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; @@ -109,7 +112,7 @@ public static boolean fileWriteObject(VirtualFrame frame, Object file, Object da } else { value = objectRepr(frame, data); } - if (value == null) { + if (value == PNone.NONE) { return false; } fileWriteString(frame, file, castToString(value)); @@ -142,7 +145,7 @@ public static Object objectStr(VirtualFrame frame, Node inliningTarget, Object v try { return strAsObjectNode.execute(frame, inliningTarget, value); } catch (PException pe) { - return null; + return PNone.NONE; } } @@ -185,7 +188,7 @@ public static boolean objectHasAttr(VirtualFrame frame, Object object, TruffleSt } public static TruffleString getTypeName(Object type) { - return TypeNodes.GetNameNode.executeUncached(type); + return TypeNodes.GetTpNameNode.executeUncached(type); } public static Object getObjectClass(Object object) { @@ -229,9 +232,9 @@ public static TruffleString classNameNoDot(TruffleString name) { return (i > 0) ? name.substringUncached(i + 1, len - i - 1, TS_ENCODING, true) : name; } - public PCode getCode(VirtualFrame frame, PythonObjectFactory factory, TracebackBuiltins.GetTracebackFrameNode getTbFrameNode, PTraceback tb) { + public PCode getCode(VirtualFrame frame, PythonLanguage language, TracebackBuiltins.GetTracebackFrameNode getTbFrameNode, PTraceback tb) { final PFrame pFrame = getTbFrameNode.execute(frame, tb); - return factory.createCode(pFrame.getTarget()); + return PFactory.createCode(language, pFrame.getTarget()); } protected PTraceback getNextTb(Node inliningTarget, TracebackBuiltins.MaterializeTruffleStacktraceNode materializeStNode, PTraceback traceback) { @@ -333,7 +336,7 @@ private static String trimLeft(CharSequence sequence) { return (st > 0 ? sequence.subSequence(st, len) : sequence).toString(); } - private void printInternal(VirtualFrame frame, Node inliningTarget, PythonObjectFactory factory, TracebackBuiltins.GetTracebackFrameNode getTbFrameNode, + private void printInternal(VirtualFrame frame, Node inliningTarget, TracebackBuiltins.GetTracebackFrameNode getTbFrameNode, TracebackBuiltins.MaterializeTruffleStacktraceNode materializeStNode, Object out, PTraceback traceback, long limit, TruffleString.EqualNode equalNode) { int depth = 0; @@ -351,8 +354,9 @@ private void printInternal(VirtualFrame frame, Node inliningTarget, PythonObject depth--; tb = getNextTb(inliningTarget, materializeStNode, tb); } + PythonLanguage language = PythonLanguage.get(inliningTarget); while (tb != null) { - final PCode code = getCode(frame, factory, getTbFrameNode, tb); + final PCode code = getCode(frame, language, getTbFrameNode, tb); if (lastFile == null || !equalNode.execute(code.getFilename(), lastFile, TS_ENCODING) || lastLine == -1 || tb.getLineno() != lastLine || @@ -383,7 +387,6 @@ public void printTraceBack(VirtualFrame frame, PythonModule sys, Object out, PTr @Bind("this") Node inliningTarget, @Cached TracebackBuiltins.GetTracebackFrameNode getTbFrameNode, @Cached TracebackBuiltins.MaterializeTruffleStacktraceNode materializeStNode, - @Cached PythonObjectFactory factory, @Cached TruffleString.EqualNode equalNode) { long limit = TRACEBACK_LIMIT; final Object limitv = objectReadAttr(sys, T_TRACEBACKLIMIT); @@ -394,14 +397,14 @@ public void printTraceBack(VirtualFrame frame, PythonModule sys, Object out, PTr } } fileWriteString(frame, out, "Traceback (most recent call last):\n"); - printInternal(frame, inliningTarget, factory, getTbFrameNode, materializeStNode, out, tb, limit, equalNode); + printInternal(frame, inliningTarget, getTbFrameNode, materializeStNode, out, tb, limit, equalNode); } @Specialization(guards = "!isPTraceback(tb)") @SuppressWarnings("unused") public void printTraceBack(VirtualFrame frame, PythonModule sys, Object out, Object tb, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raiseBadInternalCall(); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.SystemError, BAD_ARG_TO_INTERNAL_FUNC); } @NeverDefault diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTupleSizeNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTupleSizeNode.java index b90c4c9b89..11dcd453dc 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTupleSizeNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTupleSizeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -54,6 +54,7 @@ import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; @@ -86,8 +87,8 @@ static int sizeNative(Node inliningTarget, PythonAbstractNativeObject tuple, @Fallback @InliningCutoff static int size(Object obj, - @Cached(inline = false) PRaiseNode raiseNode) { - throw raiseNode.raise(SystemError, BAD_ARG_TO_INTERNAL_FUNC_S, "PyTuple_Size"); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, BAD_ARG_TO_INTERNAL_FUNC_S, "PyTuple_Size"); } protected boolean isTupleSubtype(Object obj, Node inliningTarget, GetClassNode getClassNode, IsSubtypeNode isSubtypeNode) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeAsEncodedString.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeAsEncodedString.java index 4ec03aba27..44e1c12f05 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeAsEncodedString.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeAsEncodedString.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,6 +45,7 @@ import static com.oracle.graal.python.runtime.exception.PythonErrorType.RuntimeWarning; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.CodecsModuleBuiltins; import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins; import com.oracle.graal.python.builtins.objects.PNone; @@ -53,7 +54,7 @@ import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; @@ -127,7 +128,7 @@ static Object doRegistry(VirtualFrame frame, Node inliningTarget, Object unicode @Cached InlinedConditionProfile isByteArrayProfile, @Cached SequenceStorageNodes.CopyNode copyNode, @Cached(inline = false) WarningsModuleBuiltins.WarnNode warnNode, - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @SuppressWarnings("unused") @Shared("ts2js") @Cached(inline = false) TruffleString.ToJavaStringNode toJavaStringNode) { final Object v = encodeNode.execute(frame, unicode, encoding, errors); // the normal path @@ -137,10 +138,10 @@ static Object doRegistry(VirtualFrame frame, Node inliningTarget, Object unicode // If the codec returns a buffer, raise a warning and convert to bytes if (isByteArrayProfile.profile(inliningTarget, v instanceof PByteArray)) { warnNode.warnFormat(frame, RuntimeWarning, ENCODER_S_RETURNED_S_INSTEAD_OF_BYTES, encoding, "bytearray"); - return PythonContext.get(inliningTarget).factory().createBytes(copyNode.execute(inliningTarget, ((PByteArray) v).getSequenceStorage())); + return PFactory.createBytes(PythonLanguage.get(inliningTarget), copyNode.execute(inliningTarget, ((PByteArray) v).getSequenceStorage())); } - throw raiseNode.get(inliningTarget).raise(TypeError, S_ENCODER_RETURNED_P_INSTEAD_OF_BYTES, encoding, v); + throw raiseNode.raise(inliningTarget, TypeError, S_ENCODER_RETURNED_P_INSTEAD_OF_BYTES, encoding, v); } @Specialization(guards = {"isString(unicode)", "isNoValue(encoding)"}) @@ -152,7 +153,7 @@ static Object doNoEncoding(VirtualFrame frame, Object unicode, @SuppressWarnings @Specialization(guards = "!isString(unicode)") @SuppressWarnings("unused") static Object doGeneric(VirtualFrame frame, Node inliningTarget, Object unicode, Object encoding, Object errors, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { - throw raiseNode.get(inliningTarget).raiseBadInternalCall(); + @Exclusive @Cached PRaiseNode raiseNode) { + throw raiseNode.raiseBadInternalCall(inliningTarget); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeCheckNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeCheckNode.java index 20f4380075..a8dda5fefc 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeCheckNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeCheckNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,7 +41,6 @@ package com.oracle.graal.python.lib; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; import com.oracle.graal.python.builtins.objects.str.PString; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; @@ -79,16 +78,11 @@ static boolean doPString(@SuppressWarnings("unused") PString object) { return true; } - @Specialization - static boolean doNative(Node inliningTarget, PythonAbstractNativeObject object, + @Fallback + static boolean doOther(Node inliningTarget, Object object, @Cached GetClassNode getClass, @Cached(inline = false) IsSubtypeNode isSubtype) { Object type = getClass.execute(inliningTarget, object); return isSubtype.execute(type, PythonBuiltinClassType.PString); } - - @Fallback - static boolean doOther(@SuppressWarnings("unused") Object object) { - return false; - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeDecode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeDecode.java index 4dac6d3f1a..fc22e2ecae 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeDecode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeDecode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -73,10 +73,10 @@ public abstract class PyUnicodeDecode extends PNodeWithContext { @Specialization(guards = "frame != null") static Object doFast(VirtualFrame frame, Node inliningTarget, Object object, Object encoding, Object errors, @Cached(inline = false) CodecsModuleBuiltins.DecodeNode decodeNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { final Object unicode = decodeNode.execute(frame, object, encoding, errors); if (!PGuards.isString(unicode)) { - throw raiseNode.get(inliningTarget).raise(TypeError, DECODER_S_RETURNED_P_INSTEAD_OF_STR, encoding, unicode); + throw raiseNode.raise(inliningTarget, TypeError, DECODER_S_RETURNED_P_INSTEAD_OF_STR, encoding, unicode); } return unicode; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeFSDecoderNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeFSDecoderNode.java index 6f73e45799..e75124026e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeFSDecoderNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeFSDecoderNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -110,7 +110,7 @@ static TruffleString doPathLike(VirtualFrame frame, Object object, private static TruffleString checkString(Node raisingNode, TruffleString str, TruffleString.ByteIndexOfCodePointNode byteIndexOfCodePointNode) { if (byteIndexOfCodePointNode.execute(str, 0, 0, str.byteLength(TS_ENCODING), TS_ENCODING) >= 0) { - throw PRaiseNode.raiseUncached(raisingNode, ValueError, ErrorMessages.EMBEDDED_NULL_BYTE); + throw PRaiseNode.raiseStatic(raisingNode, ValueError, ErrorMessages.EMBEDDED_NULL_BYTE); } return str; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeFromEncodedObject.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeFromEncodedObject.java index 7544a87173..30858aa95d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeFromEncodedObject.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeFromEncodedObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -53,10 +53,10 @@ import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; @@ -91,32 +91,33 @@ static Object doBytes(VirtualFrame frame, Node inliningTarget, PBytes object, Ob @Specialization @SuppressWarnings("unused") static Object doString(VirtualFrame frame, TruffleString object, Object encoding, Object errors, - @Shared @Cached(inline = false) PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, DECODING_STR_NOT_SUPPORTED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, DECODING_STR_NOT_SUPPORTED); } @Specialization @SuppressWarnings("unused") static Object doPString(VirtualFrame frame, PString object, Object encoding, Object errors, - @Shared @Cached(inline = false) PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, DECODING_STR_NOT_SUPPORTED); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, DECODING_STR_NOT_SUPPORTED); } @Specialization(guards = {"!isPBytes(object)", "!isString(object)"}, limit = "3") static Object doBuffer(VirtualFrame frame, Node inliningTarget, Object object, Object encoding, Object errors, + @Bind PythonLanguage language, @Cached("createFor(this)") IndirectCallData indirectCallNode, @Exclusive @Cached InlinedConditionProfile emptyStringProfile, @CachedLibrary("object") PythonBufferAcquireLibrary bufferAcquireLib, @Exclusive @Cached PyUnicodeDecode decode, - @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib, - @Cached(inline = false) PythonObjectFactory factory) { - Object buffer = bufferAcquireLib.acquireReadonly(object, frame, PythonContext.get(inliningTarget), PythonLanguage.get(inliningTarget), indirectCallNode); + @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib) { + PythonContext context = PythonContext.get(inliningTarget); + Object buffer = bufferAcquireLib.acquireReadonly(object, frame, context, context.getLanguage(inliningTarget), indirectCallNode); try { int len = bufferLib.getBufferLength(buffer); if (emptyStringProfile.profile(inliningTarget, len == 0)) { return T_EMPTY_STRING; } - PBytes bytes = factory.createBytes(bufferLib.getInternalOrCopiedByteArray(buffer), len); + PBytes bytes = PFactory.createBytes(language, bufferLib.getInternalOrCopiedByteArray(buffer), len); return decode.execute(frame, inliningTarget, bytes, encoding, errors); } finally { bufferLib.release(buffer, frame, indirectCallNode); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeReadCharNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeReadCharNode.java index c34ceb59ad..789eda9bee 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeReadCharNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyUnicodeReadCharNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -74,19 +74,19 @@ static int doGeneric(Node inliningTarget, Object type, long lindex, @Cached CastToTruffleStringNode castToStringNode, @Cached(inline = false) TruffleString.CodePointLengthNode codePointLengthNode, @Cached(inline = false) TruffleString.CodePointAtIndexNode codePointAtIndexNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { TruffleString s = castToStringNode.execute(inliningTarget, type); int index = PInt.intValueExact(lindex); // avoid StringIndexOutOfBoundsException if (index < 0 || index >= codePointLengthNode.execute(s, TS_ENCODING)) { - throw raiseNode.get(inliningTarget).raise(IndexError, ErrorMessages.STRING_INDEX_OUT_OF_RANGE); + throw raiseNode.raise(inliningTarget, IndexError, ErrorMessages.STRING_INDEX_OUT_OF_RANGE); } return codePointAtIndexNode.execute(s, index, TS_ENCODING); } catch (CannotCastException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.BAD_ARG_TYPE_FOR_BUILTIN_OP); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(IndexError, ErrorMessages.STRING_INDEX_OUT_OF_RANGE); + throw raiseNode.raise(inliningTarget, IndexError, ErrorMessages.STRING_INDEX_OUT_OF_RANGE); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/RichCmpOp.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/RichCmpOp.java new file mode 100644 index 0000000000..823421149e --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/RichCmpOp.java @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___EQ__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GE__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LE__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___NE__; +import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; + +import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.strings.TruffleString; + +/** + * Mirror of the CPython constants of the same name. The order is important: the ordinal should be + * the same as the constant value on the CPython side. + */ +public enum RichCmpOp { + Py_LT(T___LT__, "<"), + Py_LE(T___LE__, "<="), + Py_EQ(T___EQ__, "=="), + Py_NE(T___NE__, "!="), + Py_GT(T___GT__, ">"), + Py_GE(T___GE__, ">="); + + public static final RichCmpOp[] VALUES = values(); + private final TruffleString pythonName; + private final String opName; + + RichCmpOp(TruffleString pythonName, String opName) { + this.pythonName = pythonName; + this.opName = opName; + } + + public static RichCmpOp fromNative(int value) { + try { + return VALUES[value]; + } catch (IndexOutOfBoundsException ex) { + throw CompilerDirectives.shouldNotReachHere("Wrong 'op' argument to tp_richcompare"); + } + } + + public static RichCmpOp fromName(TruffleString name) { + for (RichCmpOp value : VALUES) { + if (value.pythonName.equalsUncached(name, TS_ENCODING)) { + return value; + } + } + return null; + } + + public final TruffleString getPythonName() { + return pythonName; + } + + public final String getOpName() { + return opName; + } + + /** + * Returns the numeric value that is used by CPython C API. + */ + public final int asNative() { + return ordinal(); + } + + // Convenience shortcuts: + public final boolean isEqOrNe() { + return this == Py_EQ || this == Py_NE; + } + + public final boolean isEq() { + return this == Py_EQ; + } + + public final boolean isNe() { + return this == Py_NE; + } + + public final boolean isLe() { + return this == Py_LE; + } + + public final boolean isLt() { + return this == Py_LT; + } + + public final boolean isGt() { + return this == Py_GT; + } + + public final boolean isGe() { + return this == Py_GE; + } + + /** + * Converts the result of Java's "compare" static method, such as + * {@link Integer#compare(int, int)} to a boolean value according to the given operation. If the + * result is computed, make sure that it can never overflow! + */ + public final boolean compareResultToBool(int result) { + return switch (this) { + case Py_LT -> result < 0; + case Py_LE -> result <= 0; + case Py_EQ -> result == 0; + case Py_NE -> result != 0; + case Py_GT -> result > 0; + case Py_GE -> result >= 0; + }; + } + + public final boolean compare(double a, double b) { + return switch (this) { + case Py_LT -> a < b; + case Py_LE -> a <= b; + case Py_EQ -> a == b; + case Py_NE -> a != b; + case Py_GT -> a > b; + case Py_GE -> a >= b; + }; + } + + public final boolean compare(long a, long b) { + return switch (this) { + case Py_LT -> a < b; + case Py_LE -> a <= b; + case Py_EQ -> a == b; + case Py_NE -> a != b; + case Py_GT -> a > b; + case Py_GE -> a >= b; + }; + } + + public final boolean compare(int a, int b) { + return switch (this) { + case Py_LT -> a < b; + case Py_LE -> a <= b; + case Py_EQ -> a == b; + case Py_NE -> a != b; + case Py_GT -> a > b; + case Py_GE -> a >= b; + }; + } + + public final boolean compare(byte a, byte b) { + return switch (this) { + case Py_LT -> a < b; + case Py_LE -> a <= b; + case Py_EQ -> a == b; + case Py_NE -> a != b; + case Py_GT -> a > b; + case Py_GE -> a >= b; + }; + } + + /** + * Equivalent of {@code Py_RETURN_RICHCOMPARE} macro from CPython. + */ + public final boolean compare(boolean a, boolean b) { + return compareResultToBool(PInt.intValue(a) - PInt.intValue(b)); + } + + public final RichCmpOp getSwapped() { + return switch (this) { + case Py_LT -> Py_GT; + case Py_LE -> Py_GE; + case Py_EQ -> Py_EQ; + case Py_NE -> Py_NE; + case Py_GT -> Py_LT; + case Py_GE -> Py_LE; + }; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/SequenceRepeatHelperNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/SequenceRepeatHelperNode.java new file mode 100644 index 0000000000..07213af746 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/SequenceRepeatHelperNode.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib; + +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSizeArgFun; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@GenerateUncached +public abstract class SequenceRepeatHelperNode extends Node { + abstract Object execute(VirtualFrame frame, TpSlot slot, Object seq, Object n); + + @Specialization + static Object sequenceRepeat(VirtualFrame frame, TpSlot slot, Object seq, Object n, + @Bind Node inliningTarget, + @Cached PyIndexCheckNode indexCheckNode, + @Cached PyNumberAsSizeNode asSizeNode, + @Cached TpSlotSizeArgFun.CallSlotSizeArgFun callSlotNode, + @Cached PRaiseNode raiseNode) { + if (indexCheckNode.execute(inliningTarget, n)) { + int count = asSizeNode.execute(frame, inliningTarget, n, PythonBuiltinClassType.OverflowError); + return callSlotNode.execute(frame, inliningTarget, slot, seq, count); + } else { + throw raiseNonIntSqMul(inliningTarget, n, raiseNode); + } + } + + @InliningCutoff + private static PException raiseNonIntSqMul(Node inliningTarget, Object n, PRaiseNode raiseNode) { + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.CANT_MULTIPLY_SEQ_BY_NON_INT, n); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberAddFastPathsBase.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberAddFastPathsBase.java new file mode 100644 index 0000000000..a0aa6904be --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberAddFastPathsBase.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib.fastpath; + +import static com.oracle.graal.python.builtins.objects.ints.IntBuiltins.AddNode.add; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.dsl.TypeSystemReference; + +/** + * Helper class with shared fast-paths. Must be public so that it is accessible by the Bytecode DSL + * generated code. + */ +@GenerateCached(false) +@TypeSystemReference(PythonIntegerTypes.class) +public abstract class PyNumberAddFastPathsBase extends BinaryOpNode { + + /* + * All the following fast paths need to be kept in sync with the corresponding builtin functions + * in IntBuiltins + */ + @Specialization(rewriteOn = ArithmeticException.class) + public static int doII(int left, int right) { + return Math.addExact(left, right); + } + + @Specialization(replaces = "doII", rewriteOn = ArithmeticException.class) + public static long doLL(long left, long right) { + return Math.addExact(left, right); + } + + @Specialization(replaces = "doLL") + public static Object doLLOvf(long x, long y, + @Bind PythonLanguage language) { + /* Inlined version of Math.addExact(x, y) with BigInteger fallback. */ + long r = x + y; + // HD 2-12 Overflow iff both arguments have the opposite sign of the result + if (((x ^ r) & (y ^ r)) < 0) { + return PFactory.createInt(language, add(PInt.longToBigInteger(x), PInt.longToBigInteger(y))); + } + return r; + } + + /* + * All the following fast paths need to be kept in sync with the corresponding builtin functions + * in FloatBuiltins + */ + @Specialization + public static double doDD(double left, double right) { + return left + right; + } + + @Specialization + public static double doDL(double left, long right) { + return left + right; + } + + @Specialization + public static double doLD(long left, double right) { + return left + right; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberAndFastPathsBase.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberAndFastPathsBase.java new file mode 100644 index 0000000000..2aa536d5a1 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberAndFastPathsBase.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib.fastpath; + +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.dsl.TypeSystemReference; + +/** + * Helper class with shared fast-paths. Must be public so that it is accessible by the Bytecode DSL + * generated code. + */ +@GenerateCached(false) +@TypeSystemReference(PythonIntegerTypes.class) +public abstract class PyNumberAndFastPathsBase extends BinaryOpNode { + + @Specialization + public static boolean op(boolean left, boolean right) { + return left && right; + } + + @Specialization + public static int op(int left, int right) { + return left & right; + } + + @Specialization + public static long op(long left, long right) { + return left & right; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberFloorDivideFastPathsBase.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberFloorDivideFastPathsBase.java new file mode 100644 index 0000000000..451cdeeb44 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberFloorDivideFastPathsBase.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib.fastpath; + +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.dsl.TypeSystemReference; + +/** + * Helper class with shared fast-paths. Must be public so that it is accessible by the Bytecode DSL + * generated code. + */ +@GenerateCached(false) +@TypeSystemReference(PythonIntegerTypes.class) +public abstract class PyNumberFloorDivideFastPathsBase extends BinaryOpNode { + + /* + * All the following fast paths need to be kept in sync with the corresponding builtin functions + * in IntBuiltins, FloatBuiltins, ... + */ + @Specialization(guards = "!specialCase(left, right)") + public static int doII(int left, int right) { + return Math.floorDiv(left, right); + } + + @Specialization(guards = "!specialCase(left, right)") + public static long doLL(long left, long right) { + return Math.floorDiv(left, right); + } + + @Specialization(guards = "!isZero(right)") + public static double doLD(long left, double right) { + return doDD(left, right); + } + + @Specialization(guards = "right != 0") + public static double doDL(double left, long right) { + return doDD(left, right); + } + + @Specialization(guards = "!isZero(right)") + public static double doDD(double left, double right) { + return Math.floor(left / right); + } + + public static boolean specialCase(int left, int right) { + return right == 0 || left == Integer.MIN_VALUE && right == -1; + } + + public static boolean specialCase(long left, long right) { + return right == 0 || left == Long.MIN_VALUE && right == -1; + } + + public static boolean isZero(double right) { + return right == 0.0; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberLshiftFastPathsBase.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberLshiftFastPathsBase.java new file mode 100644 index 0000000000..3662fe3a00 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberLshiftFastPathsBase.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib.fastpath; + +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.graal.python.util.OverflowException; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.Specialization; + +/** + * Helper class with shared fast-paths. Must be public so that it is accessible by the Bytecode DSL + * generated code. TODO: unused due to GR-64005 + */ +@GenerateCached(false) +public abstract class PyNumberLshiftFastPathsBase extends BinaryOpNode { + + @Specialization(guards = {"right < 32", "right >= 0"}, rewriteOn = OverflowException.class) + public static int doII(int left, int right) throws OverflowException { + int result = left << right; + if (left != result >> right) { + throw OverflowException.INSTANCE; + } + return result; + } + + @Specialization(guards = {"right < 64", "right >= 0"}, rewriteOn = OverflowException.class) + public static long doLL(long left, long right) throws OverflowException { + long result = left << right; + if (left != result >> right) { + throw OverflowException.INSTANCE; + } + return result; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberMultiplyFastPathsBase.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberMultiplyFastPathsBase.java new file mode 100644 index 0000000000..e2975b0a4b --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberMultiplyFastPathsBase.java @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib.fastpath; + +import static com.oracle.graal.python.builtins.objects.ints.IntBuiltins.MulNode.mul; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.dsl.TypeSystemReference; +import com.oracle.truffle.api.nodes.Node; + +/** + * Helper class with shared fast-paths. Must be public so that it is accessible by the Bytecode DSL + * generated code. + */ +@GenerateCached(false) +@TypeSystemReference(PythonIntegerTypes.class) +public abstract class PyNumberMultiplyFastPathsBase extends BinaryOpNode { + + /* + * All the following fast paths need to be kept in sync with the corresponding builtin functions + * in IntBuiltins + */ + @Specialization(rewriteOn = ArithmeticException.class) + public static int doII(int x, int y) throws ArithmeticException { + return Math.multiplyExact(x, y); + } + + @Specialization(replaces = "doII") + public static long doIIL(int x, int y) { + return x * (long) y; + } + + @Specialization(rewriteOn = ArithmeticException.class) + public static long doLL(long x, long y) { + return Math.multiplyExact(x, y); + } + + @Specialization(replaces = "doLL") + public static Object doLongWithOverflow(long x, long y, + @Bind("this") Node inliningTarget) { + /* Inlined version of Math.multiplyExact(x, y) with BigInteger fallback. */ + long r = x * y; + long ax = Math.abs(x); + long ay = Math.abs(y); + if (((ax | ay) >>> 31 != 0)) { + // Some bits greater than 2^31 that might cause overflow + // Check the result using the divide operator + // and check for the special case of Long.MIN_VALUE * -1 + if (((y != 0) && (r / y != x)) || + (x == Long.MIN_VALUE && y == -1)) { + return PFactory.createInt(PythonLanguage.get(inliningTarget), mul(PInt.longToBigInteger(x), PInt.longToBigInteger(y))); + } + } + return r; + } + + /* + * All the following fast paths need to be kept in sync with the corresponding builtin functions + * in FloatBuiltins + */ + @Specialization + public static double doDL(double left, long right) { + return left * right; + } + + @Specialization + public static double doLD(long left, double right) { + return left * right; + } + + @Specialization + public static double doDD(double left, double right) { + return left * right; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberOrFastPathsBase.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberOrFastPathsBase.java new file mode 100644 index 0000000000..513f8f0224 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberOrFastPathsBase.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib.fastpath; + +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.dsl.TypeSystemReference; + +/** + * Helper class with shared fast-paths. Must be public so that it is accessible by the Bytecode DSL + * generated code. + */ +@GenerateCached(false) +@TypeSystemReference(PythonIntegerTypes.class) +public abstract class PyNumberOrFastPathsBase extends BinaryOpNode { + + @Specialization + public static boolean op(boolean left, boolean right) { + return left || right; + } + + @Specialization + public static int op(int left, int right) { + return left | right; + } + + @Specialization + public static long op(long left, long right) { + return left | right; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberRemainderFastPathsBase.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberRemainderFastPathsBase.java new file mode 100644 index 0000000000..09b0c57412 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberRemainderFastPathsBase.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib.fastpath; + +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.dsl.TypeSystemReference; + +/** + * Helper class with shared fast-paths. Must be public so that it is accessible by the Bytecode DSL + * generated code. + */ +@GenerateCached(false) +@TypeSystemReference(PythonIntegerTypes.class) +public abstract class PyNumberRemainderFastPathsBase extends BinaryOpNode { + + @Specialization(guards = "right != 0") + public static int doII(int left, int right) { + return Math.floorMod(left, right); + } + + @Specialization(guards = "right != 0") + public static long doLL(long left, long right) { + return Math.floorMod(left, right); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberRshiftFastPathsBase.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberRshiftFastPathsBase.java new file mode 100644 index 0000000000..d56ebea294 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberRshiftFastPathsBase.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib.fastpath; + +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.dsl.TypeSystemReference; + +/** + * Helper class with shared fast-paths. Must be public so that it is accessible by the Bytecode DSL + * generated code. + */ +@GenerateCached(false) +@TypeSystemReference(PythonIntegerTypes.class) +public abstract class PyNumberRshiftFastPathsBase extends BinaryOpNode { + + @Specialization(guards = {"right < 32", "right >= 0"}) + public static int doIISmall(int left, int right) { + return left >> right; + } + + @Specialization(guards = {"right < 64", "right >= 0"}) + public static long doIISmall(long left, long right) { + return left >> right; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberSubtractFastPathsBase.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberSubtractFastPathsBase.java new file mode 100644 index 0000000000..64fd91a4d2 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberSubtractFastPathsBase.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib.fastpath; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.builtins.objects.ints.IntBuiltins; +import com.oracle.graal.python.builtins.objects.ints.PInt; +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.dsl.TypeSystemReference; +import com.oracle.truffle.api.nodes.Node; + +@GenerateCached(false) +@TypeSystemReference(PythonIntegerTypes.class) +public abstract class PyNumberSubtractFastPathsBase extends BinaryOpNode { + + /* + * All the following fast paths need to be kept in sync with the corresponding builtin functions + * in IntBuiltins + */ + @Specialization(rewriteOn = ArithmeticException.class) + public static int doII(int x, int y) throws ArithmeticException { + return Math.subtractExact(x, y); + } + + @Specialization(replaces = "doII") + public static long doIIOvf(int x, int y) { + return (long) x - (long) y; + } + + @Specialization(rewriteOn = ArithmeticException.class) + public static long doLL(long x, long y) throws ArithmeticException { + return Math.subtractExact(x, y); + } + + @Specialization(replaces = "doLL") + public static Object doLongWithOverflow(long x, long y, + @Bind("this") Node inliningTarget) { + /* Inlined version of Math.subtractExact(x, y) with BigInteger fallback. */ + long r = x - y; + // HD 2-12 Overflow iff the arguments have different signs and + // the sign of the result is different than the sign of x + if (((x ^ y) & (x ^ r)) < 0) { + return PFactory.createInt(PythonLanguage.get(inliningTarget), IntBuiltins.SubNode.sub(PInt.longToBigInteger(x), PInt.longToBigInteger(y))); + } + return r; + } + + /* + * All the following fast paths need to be kept in sync with the corresponding builtin functions + * in FloatBuiltins + */ + @Specialization + public static double doDD(double left, double right) { + return left - right; + } + + @Specialization + public static double doDL(double left, long right) { + return left - right; + } + + @Specialization + public static double doLD(long left, double right) { + return left - right; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberTrueDivideFastPathsBase.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberTrueDivideFastPathsBase.java new file mode 100644 index 0000000000..cdc180ab9b --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberTrueDivideFastPathsBase.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib.fastpath; + +import com.oracle.graal.python.builtins.objects.ints.IntBuiltins; +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.ImportStatic; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.dsl.TypeSystemReference; + +/** + * Helper class with shared fast-paths. Must be public so that it is accessible by the Bytecode DSL + * generated code. + */ +@GenerateCached(false) +@TypeSystemReference(PythonIntegerTypes.class) +@ImportStatic(IntBuiltins.TrueDivNode.class) +public abstract class PyNumberTrueDivideFastPathsBase extends BinaryOpNode { + + /* + * All the following fast paths need to be kept in sync with the corresponding builtin functions + * in IntBuiltins, FloatBuiltins, ... + */ + + @Specialization(guards = "!isZero(right)") + public static double doDD(double left, double right) { + return left / right; + } + + @Specialization(guards = "right != 0") + public static double doDL(double left, long right) { + return doDD(left, right); + } + + @Specialization(guards = "!isZero(right)") + public static double doLD(long left, double right) { + return doDD(left, right); + } + + @Specialization(guards = "right != 0") + public static double doII(int left, int right) { + return doDD(left, right); + } + + @Specialization(guards = {"right != 0", "fitsIntoDouble(left)", "fitsIntoDouble(right)"}) + public static double doLL(long left, long right) { + return doDD(left, right); + } + + public static boolean isZero(double right) { + return right == 0.0; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberXorFastPathsBase.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberXorFastPathsBase.java new file mode 100644 index 0000000000..7aa8ec2e39 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/fastpath/PyNumberXorFastPathsBase.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.lib.fastpath; + +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.dsl.TypeSystemReference; + +/** + * Helper class with shared fast-paths. Must be public so that it is accessible by the Bytecode DSL + * generated code. + */ +@GenerateCached(false) +@TypeSystemReference(PythonIntegerTypes.class) +public abstract class PyNumberXorFastPathsBase extends BinaryOpNode { + + @Specialization + public static boolean op(boolean left, boolean right) { + return left != right; + } + + @Specialization + public static int op(int left, int right) { + return left ^ right; + } + + @Specialization + public static long op(long left, long right) { + return left ^ right; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/BuiltinNames.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/BuiltinNames.java index 6d5dd9f7ad..616387769c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/BuiltinNames.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/BuiltinNames.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -167,8 +167,6 @@ public abstract class BuiltinNames { public static final String J_OBJECT = "object"; - public static final String J_FOREIGN = "foreign"; - public static final String J_SORTED = "sorted"; public static final String J_ASCII = "ascii"; @@ -302,6 +300,8 @@ public abstract class BuiltinNames { public static final TruffleString T___IMPORT__ = tsLiteral("__import__"); + public static final TruffleString T_ZIPIMPORT = tsLiteral("zipimport"); + public static final String J_COMPLEX = "complex"; public static final String J_HASATTR = "hasattr"; @@ -326,10 +326,6 @@ public abstract class BuiltinNames { public static final String J___GRAALPYTHON__ = "__graalpython__"; public static final TruffleString T___GRAALPYTHON__ = tsLiteral(J___GRAALPYTHON__); - public static final String J_INTEROP_BEHAVIOR = "interop_behavior"; - public static final String J_REGISTER_INTEROP_BEHAVIOR = "register_interop_behavior"; - public static final TruffleString T_REGISTER_INTEROP_BEHAVIOR = tsLiteral(J_REGISTER_INTEROP_BEHAVIOR); - public static final String J_GET_REGISTERED_INTEROP_BEHAVIOR = "get_registered_interop_behavior"; public static final String J___GRAALPYTHON_INTEROP_BEHAVIOR__ = "__graalpython_interop_behavior__"; @@ -455,6 +451,8 @@ public abstract class BuiltinNames { public static final TruffleString T_SHA3 = tsLiteral(J_SHA3); public static final TruffleString T_SEND = tsLiteral("send"); + public static final TruffleString T_THROW = tsLiteral("throw"); + public static final TruffleString T_CLOSE = tsLiteral("close"); public static final String J__ASYNCIO = "_asyncio"; public static final TruffleString T__ASYNCIO = tsLiteral(J__ASYNCIO); @@ -482,4 +480,7 @@ public abstract class BuiltinNames { public static final String J_EXCEPTION_GROUP = "ExceptionGroup"; public static final TruffleString T_EXCEPTION_GROUP = tsLiteral(J_EXCEPTION_GROUP); + + public static final String J_UNICODEDATA = "unicodedata"; + public static final TruffleString T_UNICODEDATA = tsLiteral(J_UNICODEDATA); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/ErrorMessages.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/ErrorMessages.java index b28f9258ce..42d0352eed 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/ErrorMessages.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/ErrorMessages.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,8 +41,10 @@ package com.oracle.graal.python.nodes; import static com.oracle.graal.python.builtins.objects.str.StringUtils.cat; +import static com.oracle.graal.python.nodes.StringLiterals.J_MAX_CAPI_COPIES; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; +import com.oracle.graal.python.builtins.PythonOS; import com.oracle.truffle.api.strings.TruffleString; public abstract class ErrorMessages { @@ -81,6 +83,7 @@ public abstract class ErrorMessages { public static final TruffleString ARG_MUST_NOT_BE_EMPTY = tsLiteral("%s arg %d must not be empty"); public static final TruffleString ARG_NOT_IN_RANGE = tsLiteral("%s arg not in range(%s)"); public static final TruffleString ARG_SHOULD_BE_INT_OR_NONE = tsLiteral("argument should be integer or None, not %p"); + public static final TruffleString ARG_SHOULD_BE_INT_OR_NONE_T = tsLiteral("argument should be integer or None, not %P"); public static final TruffleString ARGS_CHANGED_DURING_ITERATION = tsLiteral("args changed during iteration"); public static final TruffleString ARGS_MUST_HAVE_SAME_LENGTH = tsLiteral("%s arguments must have same length"); public static final TruffleString ARG_SHOULD_BE_BYTES_BUFFER_OR_ASCII_NOT_P = tsLiteral("argument should be bytes, buffer or ASCII string, not '%p'"); @@ -100,9 +103,11 @@ public abstract class ErrorMessages { public static final TruffleString ATTR_NAME_MUST_BE_STRING = tsLiteral("attribute name must be string, not '%p'"); public static final TruffleString S_MUST_BE_STRING_NOT_S = tsLiteral("\"%s\" must be string, not %.200s"); public static final TruffleString S_MUST_BE_STRING_OR_NONE_NOT_S = tsLiteral("\"%s\" must be string or None, not %.200s"); - public static final TruffleString ATTR_S_OF_S_IS_NOT_READABLE = tsLiteral("attribute %s of %s objects is not readable"); + public static final TruffleString ATTR_S_OF_N_IS_NOT_READABLE = tsLiteral("attribute %s of %N objects is not readable"); public static final TruffleString ATTR_S_OF_S_IS_NOT_WRITABLE = tsLiteral("attribute %s of %s is not writable"); + public static final TruffleString ATTR_S_OF_N_OBJ_IS_NOT_WRITABLE = tsLiteral("attribute %s of %N object is not writable"); public static final TruffleString ATTR_S_OF_S_OBJ_IS_NOT_WRITABLE = tsLiteral("attribute %s of %s object is not writable"); + public static final TruffleString ATTR_S_OF_S_OBJ_IS_NOT_READABLE = tsLiteral("attribute %s of %s object is not readable"); public static final TruffleString ATTR_S_OF_S_OBJ_IS_NOT_INSERTABLE = tsLiteral("attribute %s of %s object is not insertable"); public static final TruffleString ATTR_S_OF_S_OBJ_IS_NOT_REMOVABLE = tsLiteral("attribute %s of %s object is not removable"); public static final TruffleString ITEM_S_OF_S_OBJ_IS_NOT_READABLE = tsLiteral("item %s of %s object is not readable"); @@ -131,7 +136,7 @@ public abstract class ErrorMessages { public static final TruffleString BAD_OPERAND_FOR = tsLiteral("bad operand type for %s%s: '%p'"); public static final TruffleString BAD_VALUES_IN_FDS_TO_KEEP = tsLiteral("bad value(s) in fds_to_keep"); public static final TruffleString BAD_TYPECODE = tsLiteral("bad typecode (must be b, B, u, h, H, i, I, l, L, q, Q, f or d)"); - public static final TruffleString BASE_OUT_OF_RANGE_FOR_INT = tsLiteral("base is out of range for int()"); + public static final TruffleString INT_BASE_MUST_BE_2_AND_36_OR_0 = tsLiteral("int() base must be >= 2 and <= 36, or 0"); public static final TruffleString BASES_ITEM_CAUSES_INHERITANCE_CYCLE = tsLiteral("a __bases__ item causes an inheritance cycle"); public static final TruffleString BASE_MUST_BE = tsLiteral("PyNumber_ToBase: base must be 2, 8, 10 or 16"); public static final TruffleString BOOL_SHOULD_RETURN_BOOL = tsLiteral("__bool__ should return bool, returned %p"); @@ -174,8 +179,9 @@ public abstract class ErrorMessages { public static final TruffleString CANNOT_CONVERT_S_TO_INT_RATIO = tsLiteral("cannot convert %s to integer ratio"); public static final TruffleString CANNOT_CREATE_CALL_TARGET = tsLiteral("cannot create a call target from the code object: %p"); public static final TruffleString CANNOT_CREATE_INSTANCES = tsLiteral("cannot create '%s' instances"); + public static final TruffleString CANNOT_CREATE_N_INSTANCES = tsLiteral("cannot create '%N' instances"); public static final TruffleString CANNOT_CREATE_WEAK_REFERENCE_TO = tsLiteral("cannot create weak reference to '%p' object"); - public static final TruffleString CANNOT_DELETE_ATTRIBUTE = tsLiteral("can't delete %s.%s"); + public static final TruffleString CANNOT_DELETE_ATTRIBUTE = tsLiteral("can't delete %N.%s"); public static final TruffleString CANNOT_DELETE_MEMORY = tsLiteral("cannot delete memory"); public static final TruffleString CANNOT_MODIFY_READONLY_MEMORY = tsLiteral("cannot modify read-only memory"); public static final TruffleString CANNOT_EXTEND_INCOMPLETE_P = tsLiteral("Cannot extend an incomplete type '%p'"); @@ -189,7 +195,9 @@ public abstract class ErrorMessages { public static final TruffleString CANNOT_IMPORT_NAME_CIRCULAR = tsLiteral("cannot import name '%s' from partially initialized module '%s' (most likely due to a circular import)"); public static final TruffleString CANNOT_INITIALIZE_WITH = tsLiteral("cannot initialize %s with %s%s"); public static final TruffleString CANNOT_LOAD = tsLiteral("cannot load %s: %s"); - public static final TruffleString CANNOT_LOAD_M = tsLiteral("cannot load %s: %m"); + public static final TruffleString CANNOT_LOAD_M = (PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32) ? tsLiteral( + "cannot load %s: %m. Error 126 indicates missing DLLs, please make sure you have the latest Microsoft Visual C++ Redistributable from https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist.") + : tsLiteral("cannot load %s: %m"); public static final TruffleString CANNOT_RELEASE_UNAQUIRED_LOCK = tsLiteral("cannot release un-acquired lock"); public static final TruffleString CANNOT_REENTER_TEE_ITERATOR = tsLiteral("cannot re-enter the tee iterator"); public static final TruffleString CANNOT_SPECIFY_BOTH_COMMA_AND_UNDERSCORE = tsLiteral("Cannot specify both ',' and '_'."); @@ -200,6 +208,7 @@ public abstract class ErrorMessages { public static final TruffleString CANNOT_CONVERT_FLOAT_NAN_TO_INTEGER = tsLiteral("cannot convert float NaN to integer"); public static final TruffleString CANT_CAPTURE_NAME_UNDERSCORE_IN_PATTERNS = tsLiteral("can't capture name '_' in patterns"); public static final TruffleString CANT_CONCAT_P_TO_S = tsLiteral("can't concat %p to %s"); + public static final TruffleString CANT_CONCAT_P_TO_P = tsLiteral("can't concat %p to %p"); public static final TruffleString CANT_CONVERT_TO_STR_IMPLICITLY = tsLiteral("Can't convert '%p' object to str implicitly"); public static final TruffleString CANT_COMPARE = tsLiteral("Can't compare %p and %p"); public static final TruffleString CAN_T_DELETE_NUMERIC_CHAR_ATTRIBUTE = tsLiteral("can't delete numeric/char attribute"); @@ -223,7 +232,7 @@ public abstract class ErrorMessages { public static final TruffleString CHARACTER_MAPPING_MUST_RETURN_INT_NONE_OR_STR = tsLiteral("character mapping must return integer, None or str"); public static final TruffleString CHARACTER_MAPPING_MUST_RETURN_INT_BYTES_OR_NONE_NOT_P = tsLiteral("character mapping must return integer, bytes or None, not %p"); public static final TruffleString CHARACTER_MAPS_TO_UNDEFINED = tsLiteral("character maps to "); - public static final TruffleString CLASS_ASSIGNMENT_S_LAYOUT_DIFFERS_FROM_S = tsLiteral("__class__ assignment: '%s' object layout differs from '%s'"); + public static final TruffleString CLASS_ASSIGNMENT_N_LAYOUT_DIFFERS_FROM_N = tsLiteral("__class__ assignment: '%N' object layout differs from '%N'"); public static final TruffleString CLASS_ASSIGNMENT_ONLY_SUPPORTED_FOR_HEAP_TYPES_OR_MODTYPE_SUBCLASSES = tsLiteral("__class__ assignment only supported for heap types or ModuleType subclasses"); public static final TruffleString CLASS_MUST_BE_SET_TO_CLASS = tsLiteral("__class__ must be set to a class, not '%p' object"); public static final TruffleString MUST_BE_SET_TO_S_NOT_P = tsLiteral("%s must be set to a %s, not a '%p'"); @@ -293,7 +302,7 @@ public abstract class ErrorMessages { public static final TruffleString EXPECTED_BYTES_P_FOUND = tsLiteral("expected bytes, %p found"); public static final TruffleString EXPECTED_CHARACTER_BUT_STRING_FOUND = tsLiteral("%s expected a character, but string of length %d found"); public static final TruffleString EXPECTED_CONVERSION = tsLiteral("expected conversion"); - public static final TruffleString EXPECTED_FSPATH_TO_RETURN_STR_OR_BYTES = tsLiteral("expected %p.__fspath__() to return str or bytes, not %p"); + public static final TruffleString EXPECTED_FSPATH_TO_RETURN_STR_OR_BYTES = tsLiteral("expected %p.__fspath__() to return str or bytes, not %P"); public static final TruffleString EXPECTED_OBJ_TYPE_S_GOT_P = tsLiteral("expected object of type %s, got %p"); public static final TruffleString EXPECTED_OBJ_TYPE_P_GOT_P = tsLiteral("expected object of type %p, got %p"); public static final TruffleString EXPECTED_S_GOT_P = tsLiteral("expected %s, got %p"); @@ -302,7 +311,7 @@ public abstract class ErrorMessages { public static final TruffleString EXPECTED_S_AFTER_FORMAT_CONVERSION = tsLiteral("expected '%s' after conversion specifier"); public static final TruffleString EXPECTED_S_NODE_GOT_P = tsLiteral("expected %s node, got %p"); public static final TruffleString EXPECTED_SOME_SORT_OF_S_BUT_GOT_S = tsLiteral("expected some sort of %s, but got %s"); - public static final TruffleString EXPECTED_STR_BYTE_OSPATHLIKE_OBJ = tsLiteral("expected str, bytes or os.PathLike object, not %p"); + public static final TruffleString EXPECTED_STR_BYTE_OSPATHLIKE_OBJ = tsLiteral("expected str, bytes or os.PathLike object, not %P"); public static final TruffleString EXPECTED_STR_OR_BYTESLIKE_OBJ = tsLiteral("expected string or bytes-like object"); public static final TruffleString S_EXPECTED_STRING_OF_LEN_BUT_P = tsLiteral("%s expected string of length %s, but %p found"); public static final TruffleString EXPECTED_UNICODE_CHAR_NOT_P = tsLiteral("expected a unicode character, not %p"); @@ -329,7 +338,7 @@ public abstract class ErrorMessages { public static final TruffleString FAILED_TO_CONVERT_SEQ = tsLiteral("failed to convert sequence"); public static final TruffleString FLOAT_ARG_REQUIRED = tsLiteral("float argument required, not %p"); public static final TruffleString FOREIGN_OBJ_HAS_NO_ATTR_S = tsLiteral("foreign object has no attribute '%s'"); - public static final TruffleString FOREIGN_OBJ_ISNT_ITERABLE = tsLiteral("foreign object is not iterable"); + public static final TruffleString FOREIGN_OBJ_ISNT_REVERSE_ITERABLE = tsLiteral("foreign object cannot be iterated in reverse"); public static final TruffleString FORMAT_REQUIRES_MAPPING = tsLiteral("format requires a mapping"); public static final TruffleString FORMAT_STR_CONTAINS_POS_FIELDS = tsLiteral("Format string contains positional fields"); public static final TruffleString FORMATED_S_TOO_LONG = tsLiteral("formatted %s is too long (precision too large?)"); @@ -346,14 +355,14 @@ public abstract class ErrorMessages { public static final TruffleString GLOBALS_MUST_BE_DICT = tsLiteral("%s() globals must be a dict, not %p"); public static final TruffleString GOT_AN_INVALID_TYPE_IN_CONSTANT = tsLiteral("got an invalid type in Constant: %p"); public static final TruffleString S_GOT_MULTIPLE_SUBPATTERNS_FOR_ATTR_S = tsLiteral("%s() got multiple sub-patterns for attribute '%s'"); - public static final TruffleString S_PAREN_GOT_MULTIPLE_VALUES_FOR_KEYWORD_ARG = tsLiteral("%s() got multiple values for keyword argument '%s'"); + public static final TruffleString S_PAREN_GOT_MULTIPLE_VALUES_FOR_ARG = tsLiteral("%s() got multiple values for argument '%s'"); public static final TruffleString S_GOT_MULTIPLE_VALUES_FOR_KEYWORD_ARG = tsLiteral("%s got multiple values for keyword argument '%s'"); public static final TruffleString GOT_MULTIPLE_VALUES_FOR_KEYWORD_ARG = tsLiteral("got multiple values for keyword argument '%s'"); public static final TruffleString GOT_SOME_POS_ONLY_ARGS_PASSED_AS_KEYWORD = tsLiteral("%s() got some positional-only arguments passed as keyword arguments: '%s'"); public static final TruffleString GOT_UNEXPECTED_KEYWORD_ARG = tsLiteral("%s() got an unexpected keyword argument '%s'"); public static final TruffleString HANDLER_MUST_BE_CALLABLE = tsLiteral("handler must be callable"); public static final TruffleString HAS_NO_ATTR = tsLiteral("%p has no attribute '%s'"); - public static final TruffleString TYPE_S_HAS_NO_ATTR = tsLiteral("type object %s has no attribute '%s'"); + public static final TruffleString TYPE_N_HAS_NO_ATTR = tsLiteral("type object %s has no attribute '%s'"); public static final TruffleString P_HAS_NO_ATTRS_S_TO_ASSIGN = tsLiteral("'%p' object has no attributes (assign to .%s)"); public static final TruffleString P_HAS_NO_ATTRS_S_TO_DELETE = tsLiteral("'%p' object has no attributes (del .%s)"); public static final TruffleString P_HAS_RO_ATTRS_S_TO_ASSIGN = tsLiteral("'%p' object has only read-only attributes (assign to .%s)"); @@ -377,11 +386,12 @@ public abstract class ErrorMessages { public static final TruffleString INDEX_OUT_OF_BOUNDS_ON_DIMENSION_D = tsLiteral("index out of bounds on dimension %d"); public static final TruffleString INDEX_OUT_OF_RANGE = tsLiteral("index out of range"); public static final TruffleString INDEX_RETURNED_NON_INT = tsLiteral("__index__ returned non-int (type %p)"); + public static final TruffleString INITIALIZATION_ARGUMENTS_ARE_NOT_SUPPORTED = tsLiteral("Initialization arguments are not supported"); public static final TruffleString INPUT_TOO_LONG = tsLiteral("input too long"); public static final TruffleString INSTANCE_EX_MAY_NOT_HAVE_SEP_VALUE = tsLiteral("instance exception may not have a separate value"); public static final TruffleString INT_CANT_CONVERT_STRING_WITH_EXPL_BASE = tsLiteral("int() can't convert non-string with explicit base"); public static final TruffleString INT_TOO_LARGE_TO_CONVERT_TO_FLOAT = tsLiteral("int too large to convert to float"); - public static final TruffleString INTEGER_DIVISION_BY_ZERO = tsLiteral("ZeroDivisionError: integer division or modulo by zero"); + public static final TruffleString INT_MISSING_STRING_ARGUMENT = tsLiteral("int() missing string argument"); public static final TruffleString INTEGER_DIVISION_RESULT_TOO_LARGE = tsLiteral("integer division result too large for a float"); public static final TruffleString S_EXPECTED_GOT_P = tsLiteral("%s argument expected, got %p"); public static final TruffleString REC_LIMIT_GREATER_THAN_1 = tsLiteral("recursion limit must be greater or equal than 1"); @@ -389,9 +399,12 @@ public abstract class ErrorMessages { public static final TruffleString INTEGER_REQUIRED_GOT = tsLiteral("an integer is required (got type %p)"); public static final TruffleString INTERMEDIATE_OVERFLOW_IN = tsLiteral("intermediate overflow in %s"); public static final TruffleString CANNOT_SET_PROPERTY_ON_INTEROP_EXCEPTION = tsLiteral("Cannot set property on interop exception"); + public static final TruffleString INTEROP_TYPE_ALREADY_REGISTERED = tsLiteral("interop type for '%s' already registered"); + public static final TruffleString INTEROP_TYPE_NOT_MERGABLE = tsLiteral("cannot register '%s' and '%s' on the same type, because both types define '%s'"); + public static final TruffleString INTEROP_CLASS_CREATION_NOT_POSSIBLE = tsLiteral("cannot create the python class for '%s' with collected classes: %s"); public static final TruffleString INVALD_OR_UNREADABLE_CLASSPATH = tsLiteral("invalid or unreadable classpath: '%s' - %m"); public static final TruffleString INVALID_ARGS = tsLiteral("%s: invalid arguments"); - public static final TruffleString INVALID_BASE_TYPE_OBJ_FOR_CLASS = tsLiteral("Invalid base type object for class %s (base type was '%p' object)."); + public static final TruffleString INVALID_BASE_TYPE_OBJ_FOR_CLASS = tsLiteral("Invalid base type object for class %N (base type was '%p' object)."); public static final TruffleString INVALID_CAPI_FUNC = tsLiteral("invalid C API function: %s"); public static final TruffleString INVALID_CONTAINER_FORMAT = tsLiteral("Invalid container format: %d"); public static final TruffleString INVALID_CONVERSION = tsLiteral("invalid conversion"); @@ -435,10 +448,14 @@ public abstract class ErrorMessages { public static final TruffleString ISINSTANCE_ARG_2_MUST_BE_TYPE_OR_TUPLE_OF_TYPE = tsLiteral("isinstance() arg 2 must be a type or tuple of types (was: %s)"); public static final TruffleString ISSUBCLASS_MUST_BE_CLASS_OR_TUPLE = tsLiteral("issubclass() arg 2 must be a class or tuple of classes"); public static final TruffleString ITER_V_MUST_BE_CALLABLE = tsLiteral("iter(v, w): v must be callable"); + public static final TruffleString ITERATION_VALUE_MUST_BE_GREATER_THAN_ZERO = tsLiteral("iteration value must be greater than 0."); + public static final TruffleString ITERATION_VALUE_IS_TOO_GREAT = tsLiteral("iteration value is too great."); + public static final TruffleString KEY_LENGTH_MUST_BE_GREATER_THAN_ZERO = tsLiteral("key length must be greater than 0."); + public static final TruffleString KEY_LENGTH_IS_TOO_GREAT = tsLiteral("key length is too great."); public static final TruffleString KEYWORD_NAMES_MUST_BE_STR_GOT_P = tsLiteral("keyword names must be str, get %p"); public static final TruffleString KEYWORDS_S_MUST_BE_STRINGS = tsLiteral("keywords must be strings"); public static final TruffleString KLASS_ARG_IS_NOT_HOST_OBJ = tsLiteral("klass argument '%p' is not a host object"); - public static final TruffleString LAZY_INITIALIZATION_FAILED = tsLiteral("lazy initialization of type %s failed"); + public static final TruffleString LAZY_INITIALIZATION_FAILED = tsLiteral("lazy initialization of type %N failed"); public static final TruffleString LEFT_BRACKET_WO_RIGHT_BRACKET_IN_ARG = tsLiteral("')' without '(' in argument parsing"); public static final TruffleString LEN_OF_UNSIZED_OBJECT = tsLiteral("len() of unsized object"); public static final TruffleString LEN_SHOULD_RETURN_GT_ZERO = tsLiteral("__len__() should return >= 0"); @@ -493,6 +510,7 @@ public abstract class ErrorMessages { public static final TruffleString MISSING_S = tsLiteral("Missing %s"); public static final TruffleString S_MISSING_REQUIRED_ARG_POS_D = tsLiteral("%s missing required argument (pos %d)"); public static final TruffleString MMAP_INDEX_OUT_OF_RANGE = tsLiteral("mmap index out of range"); + public static final TruffleString MODULE_FILENAME_MISSING = tsLiteral("module filename missing"); public static final TruffleString MODULE_HAS_NO_ATTR_S = tsLiteral("module has no attribute '%s'"); public static final TruffleString MODULE_PARTIALLY_INITIALIZED_S_HAS_NO_ATTR_S = tsLiteral("partially initialized module '%s' has no attribute '%s' (most likely due to a circular import)"); public static final TruffleString MODULE_S_HAS_NO_ATTR_S = tsLiteral("module '%s' has no attribute '%s'"); @@ -519,8 +537,8 @@ public abstract class ErrorMessages { public static final TruffleString MUST_BE_STRING = tsLiteral("%s must be a string"); public static final TruffleString MUST_BE_STRING_QUOTED = tsLiteral("\"%s\" must be a string"); public static final TruffleString MUST_BE_STRINGS_NOT_P = tsLiteral("%s must be strings, not %p"); - public static final TruffleString MUST_BE_TUPLE_OF_CLASSES_NOT_P = tsLiteral("%s.%s must be tuple of classes, not '%p'"); - public static final TruffleString MUST_RETURN_2TUPLE = tsLiteral("%p.__divmod__() must return a 2-tuple, not %p"); + public static final TruffleString MUST_BE_TUPLE_OF_CLASSES_NOT_P = tsLiteral("%N.%s must be tuple of classes, not '%p'"); + public static final TruffleString MUST_RETURN_2TUPLE = tsLiteral("%p.__divmod__() must return a 2-tuple, not %P"); public static final TruffleString S_MUST_RETURN_TUPLE = tsLiteral("%s must return a tuple (object, integer)"); public static final TruffleString MUST_S_ITER_RETURN_2TUPLE = tsLiteral("%s iterator must return 2-tuples"); public static final TruffleString S_MUST_RETURN_S_NOT_P = tsLiteral("%s must return a %s, not %p"); @@ -558,7 +576,7 @@ public abstract class ErrorMessages { public static final TruffleString NUMBER_IS_REQUIRED = tsLiteral("a number is required"); public static final TruffleString NUMBER_S_CANNOT_FIT_INTO_INDEXSIZED_INT = tsLiteral("number %s cannot fit into index-sized integer"); public static final TruffleString OBJ_INDEX_MUST_BE_INT_OR_SLICES = tsLiteral("%s indices must be integers or slices, not %p"); - public static final TruffleString OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER = tsLiteral("'%p' object cannot be interpreted as an int"); + public static final TruffleString OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER = tsLiteral("'%p' object cannot be interpreted as an integer"); public static final TruffleString OBJ_DOES_NOT_SUPPORT_INDEXING = tsLiteral("'%p' object does not support indexing"); public static final TruffleString OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT = tsLiteral("'%s' object does not support item assignment"); public static final TruffleString OBJ_DOES_NOT_SUPPORT_ITEM_DELETION = tsLiteral("'%s' object does not support item deletion"); @@ -573,6 +591,7 @@ public abstract class ErrorMessages { public static final TruffleString OBJ_ISNT_MAPPING = tsLiteral("'%p' object is not a mapping"); public static final TruffleString OBJ_ISNT_REVERSIBLE = tsLiteral("'%p' object is not reversible"); public static final TruffleString OBJ_NOT_ITERABLE = tsLiteral("'%p' object is not iterable"); + public static final TruffleString ARGUMENT_OF_TYPE_P_IS_NOT_ITERABLE = tsLiteral("argument of type '%p' is not iterable"); public static final TruffleString OBJ_NOT_SUBSCRIPTABLE = tsLiteral("'%p' object is not subscriptable"); public static final TruffleString TYPE_NOT_SUBSCRIPTABLE = tsLiteral("type '%N' is not subscriptable"); public static final TruffleString OBJ_OR_KLASS_ARGS_IS_NOT_HOST_OBJ = tsLiteral("the object '%p' or klass '%p' arguments is not a host object"); @@ -590,8 +609,8 @@ public abstract class ErrorMessages { public static final TruffleString PATTERNS_MAY_ONLY_MATCH_LITERALS_AND_ATTRIBUTE_LOOKUPS = tsLiteral("patterns may only match literals and attribute lookups"); public static final TruffleString POLYGLOT_ACCESS_NOT_ALLOWED = tsLiteral("polyglot access is not allowed"); public static final TruffleString POLYGLOT_ACCESS_NOT_ALLOWED_FOR_LANGUAGE_S = tsLiteral("polyglot access is not allowed for language '%s'"); - public static final TruffleString POLYGLOT_EVAL_MUST_PASS_STRING_OR_PATH = tsLiteral("polyglot.eval() must pass either 'path' or 'string' keyword argument"); - public static final TruffleString POLYGLOT_EVAL_MUST_PASS_LANG = tsLiteral("polyglot.eval() must pass 'language' keyword argument"); + public static final TruffleString POLYGLOT_EVAL_MUST_PASS_LANG_AND_STRING_OR_PATH = tsLiteral( + "polyglot.eval() must pass 'language' keyword argument, and either 'string' or 'path' keyword argument"); public static final TruffleString POP_FROM_EMPTY_SET = tsLiteral("pop from an emtpy set"); public static final TruffleString POP_INDEX_OUT_OF_RANGE = tsLiteral("pop index out of range"); public static final TruffleString POSITION_D_FROM_ERROR_HANDLER_OUT_OF_BOUNDS = tsLiteral("position %d from error handler out of bounds"); @@ -618,7 +637,7 @@ public abstract class ErrorMessages { public static final TruffleString S_FORMAT_INTEGER_IS_REQUIRED_NOT_S = tsLiteral("%%%s format: an integer is required, not %p"); public static final TruffleString C_ARG_NOT_IN_RANGE256_DECIMAL = tsLiteral("%%c arg not in range(256)"); public static final TruffleString C_REQUIRES_INT_IN_BYTE_RANGE_OR_SINGLE_BYTE = tsLiteral("%%c requires an integer in range(256) or a single byte"); - public static final TruffleString REQUIRES_STRING_AS_LEFT_OPERAND = tsLiteral("'in ' requires string as left operand, not %P"); + public static final TruffleString REQUIRES_STRING_AS_LEFT_OPERAND = tsLiteral("'in ' requires string as left operand, not %p"); public static final TruffleString REQUIRES_STR_OBJECT_BUT_RECEIVED_P = tsLiteral("'%s' requires a 'str' object but received a '%p'"); public static final TruffleString REQUIRED_FIELD_S_MISSING_FROM_S = tsLiteral("required field \"%s\" missing from %s"); public static final TruffleString S_RETURNED_BASE_WITH_UNSUITABLE_LAYOUT = tsLiteral("%s returned base with unsuitable layout ('%p')"); @@ -646,7 +665,7 @@ public abstract class ErrorMessages { public static final TruffleString SHOULD_BE_USED_ONLY_NEW_SETS = tsLiteral("Should be used only on newly allocated empty sets"); public static final TruffleString S_MUST_BE_S = tsLiteral("%s must be %s"); public static final TruffleString S_NOT_SUPPORTED = tsLiteral("%s not supported"); - public static final TruffleString S_S_SHOULD_BE_S_NOT_P = tsLiteral("%s%s should be %s, not %p"); + public static final TruffleString S_S_SHOULD_BE_S_NOT_P = tsLiteral("%s%s should be %s, not %P"); public static final TruffleString S_S_CONFLICTS_WITH_CLASS_VARIABLE = tsLiteral("'%s' in %s conflicts with class variable"); public static final TruffleString S_SHOULD_BE_ASCII_OR_BYTELIKE = tsLiteral("%s should be an ASCII string or a bytes-like object"); public static final TruffleString S_FLOWINFO_RANGE = tsLiteral("%s(): flowinfo must be 0-1048575."); @@ -681,7 +700,6 @@ public abstract class ErrorMessages { public static final TruffleString STATE_IS_NOT_A_DICT = tsLiteral("state is not a dictionary"); public static final TruffleString STATE_VECTOR_INVALID = tsLiteral("state vector invalid."); public static final TruffleString STATE_VECTOR_MUST_BE_A_TUPLE = tsLiteral("state vector must be a tuple"); - public static final TruffleString STEP_1_NOT_SUPPORTED = tsLiteral("step != 1 not supported"); public static final TruffleString STEP_FOR_ISLICE_MUST_BE = tsLiteral("Step for islice() must be a positive integer or None."); public static final TruffleString STRING_ARG_WO_ENCODING = tsLiteral("string argument without an encoding"); public static final TruffleString STRING_ARG_SHOULD_CONTAIN_ONLY_ASCII = tsLiteral("string argument should contain only ASCII characters"); @@ -701,6 +719,7 @@ public abstract class ErrorMessages { public static final TruffleString TAKES_A_D_SEQUENCE = tsLiteral("%s() takes a %d-sequence (%d-sequence given)"); public static final TruffleString TAKES_AN_AT_LEAST_D_SEQUENCE = tsLiteral("%s() takes an at least %d-sequence (%d-sequence given)"); public static final TruffleString TAKES_AN_AT_MOST_D_SEQUENCE = tsLiteral("%s() takes an at most %d-sequence (%d-sequence given)"); + public static final TruffleString UNSUPPORTED_ACCESS_OF_STRUCT_SEQUENCE_NATIVE_STORAGE = tsLiteral("Unsupported access of struct sequence native storage"); public static final TruffleString TAKES_D_OR_D_ARGS = tsLiteral("%s takes %d or %d arguments"); public static final TruffleString TAKES_D_POS_ARG_S_BUT_D_POS_ARG_S = tsLiteral("%s() takes %d positional argument%s but %d positional argument%s (and %d keyword-only argument%s) were given%s"); public static final TruffleString TAKES_D_POS_ARG_S_BUT_GIVEN_S = tsLiteral("%s() takes %d positional argument%s but %d %s given%s"); @@ -762,6 +781,7 @@ public abstract class ErrorMessages { public static final TruffleString UNSIGNED_BYTE_INT_GREATER_THAN_MAX = tsLiteral("unsigned byte integer is greater than maximum"); public static final TruffleString UNSIGNED_BYTE_INT_LESS_THAN_MIN = tsLiteral("unsigned byte integer is less than minimum"); public static final TruffleString UNSUPPORTED_FORMAT_CHAR_AT_INDEX = tsLiteral("unsupported format character '%c' (0x%x) at index %d"); + public static final TruffleString UNSUPPORTED_HASH_TYPE = tsLiteral("unsupported hash type %s"); public static final TruffleString UNSUPPORTED_INSTANCEOF = tsLiteral("unsupported instanceof(%p, %p)"); public static final TruffleString UNSUPPORTED_LOCALE_SETTING = tsLiteral("unsupported locale setting"); public static final TruffleString UNSUPPORTED_OBJ_IN = tsLiteral("unsupported object in '%s'"); @@ -769,7 +789,7 @@ public abstract class ErrorMessages { public static final TruffleString UNSUPPORTED_OPERAND_TYPES_FOR_S_P_AND_P = tsLiteral("unsupported operand type(s) for %s: '%p' and '%p'"); public static final TruffleString UNSUPPORTED_OPERAND_TYPES_FOR_S_P_AND_P_PRINT = cat(UNSUPPORTED_OPERAND_TYPES_FOR_S_P_AND_P, tsLiteral(". Did you mean \"print(, file=)\"?")); - public static final TruffleString UNSUPPORTED_OPERAND_TYPES_FOR_S_P_P_P = tsLiteral("unsupported operand type(s) for %s(): '%p', '%p', '%p'"); + public static final TruffleString UNSUPPORTED_OPERAND_TYPES_FOR_S_P_P_P = tsLiteral("unsupported operand type(s) for %s: '%p', '%p', '%p'"); public static final TruffleString UNSUPPORTED_OPERAND_TYPES_FOR_S_PR_S_P_AND_P = tsLiteral("unsupported operand type(s) for %s or %s(): '%p' and '%p'"); public static final TruffleString UNSUPPORTED_SIZE_WAS = tsLiteral("unsupported %s size; was: %d"); public static final TruffleString UNSUPPORTED_STR_TYPE = tsLiteral("unsupported string type: %s"); @@ -800,6 +820,7 @@ public abstract class ErrorMessages { public static final TruffleString ALTERNATE_NOT_ALLOWED_WITH_C_FOR_INT = tsLiteral("Alternate form (#) not allowed with integer format specifier 'c'"); public static final TruffleString ALTERNATE_NOT_ALLOWED_WITH_STRING_FMT = tsLiteral("Alternate form (#) not allowed in string format specifier"); public static final TruffleString NATIVE_ACCESS_NOT_ALLOWED = tsLiteral("Cannot run any C extensions because native access is not allowed."); + public static final TruffleString NATIVE_ACCESS_NOT_INITIALIZED_FOR_MULTI_CONTEXT = tsLiteral("Failed to initialize C API for multiple contexts."); public static final TruffleString CANNOT_CONVERT_NEGATIVE_VALUE_TO_UNSIGNED_INT = tsLiteral("can't convert negative value to unsigned int"); public static final TruffleString SEND_NON_NONE_TO_UNSTARTED_GENERATOR = tsLiteral("can't send non-None value to a just-started generator"); public static final TruffleString UNSUPPORTED_FORMAT_STRING_PASSED_TO_P_FORMAT = tsLiteral("unsupported format string passed to %p.__format__"); @@ -867,6 +888,7 @@ public abstract class ErrorMessages { public static final TruffleString BYTES_OR_INT_ADDR_EXPECTED_INSTEAD_OF_P = tsLiteral("bytes or integer address expected instead of %p instance"); public static final TruffleString UNICODE_STR_OR_INT_ADDR_EXPECTED_INSTEAD_OF_P = tsLiteral("unicode string or integer address expected instead of %p instance"); public static final TruffleString N_NOT_SUBTYPE_OF_ARRAY = tsLiteral("%n is not a subtype of array"); + public static final TruffleString FIRST_ARGUMENT_MUST_BE_A_TYPE_OBJECT_NOT_P = tsLiteral("first argument must be a type object, not %p"); public static final TruffleString CANNOT_BE_CONVERTED_TO_POINTER = tsLiteral("cannot be converted to pointer"); public static final TruffleString PY_OBJ_IS_NULL = tsLiteral("PyObject is NULL"); public static final TruffleString OUT_OF_RANGE_FLOAT_NOT_JSON_COMPLIANT = tsLiteral("Out of range float values are not JSON compliant"); @@ -889,7 +911,7 @@ public abstract class ErrorMessages { public static final TruffleString MESSAGE_LENGTH_ARGUMENT = tsLiteral("length argument must be non-negative"); public static final TruffleString MESSAGE_CONVERT_NEGATIVE = tsLiteral("can't convert negative int to unsigned"); public static final TruffleString NOT_IN_LIST_MESSAGE = tsLiteral("list.index(x): x not in list"); - public static final TruffleString LIST_MODIFIED_DURING_SOFT = tsLiteral("list modified during sort"); + public static final TruffleString LIST_MODIFIED_DURING_SORT = tsLiteral("list modified during sort"); public static final TruffleString RESIZING_NOT_AVAILABLE = tsLiteral("mmap: resizing not available--no mremap()"); public static final TruffleString FLUSH_VALUES_OUT_OF_RANGE = tsLiteral("flush values out of range"); public static final TruffleString AF_INET_VALUES_MUST_BE_PAIR = tsLiteral("AF_INET address must be a pair (host, port)"); @@ -945,7 +967,7 @@ public abstract class ErrorMessages { public static final TruffleString WARN_MUST_BE_SET_CALLABLE = tsLiteral("warnings._showwarnmsg() must be set to a callable"); public static final TruffleString UNABLE_GET_WARN_MSG = tsLiteral("unable to get warnings.WarningMessage"); public static final TruffleString REGISTRY_MUST_BE_DICT = tsLiteral("'registry' must be a dict or None"); - public static final TruffleString CATEGORY_MUST_BE_WARN_SUBCLS = tsLiteral("category must be a Warning subclass, not '%P'"); + public static final TruffleString CATEGORY_MUST_BE_WARN_SUBCLS = tsLiteral("category must be a Warning subclass, not '%p'"); public static final TruffleString INVALID_FILTER_SPECIFIED_FOR_FILTER = tsLiteral("Invalid filter specifier for %s filter"); public static final TruffleString UNSUPPORTED_INTEGRITY_CHECK = tsLiteral("Unsupported integrity check"); public static final TruffleString MEM_USAGE_LIMIT_EXCEEDED = tsLiteral("Memory usage limit exceeded"); @@ -976,6 +998,8 @@ public abstract class ErrorMessages { public static final TruffleString CASTING_A_NATIVE_INT_OBJECT_IS_NOT_IMPLEMENTED_YET = tsLiteral("casting a native int object is not implemented yet"); public static final TruffleString PUTTING_NON_MODULE_OBJECTS_IN_SYS_MODULES_IS_NOT_SUPPORTED = tsLiteral("Putting non-module objects in sys.modules is not supported"); public static final TruffleString GETTING_POLYGLOT_STORAGE_FOR_NATIVE_STORAGE_NOT_IMPLEMENTED = tsLiteral("Getting polyglot storage for native storage not implemented"); + public static final TruffleString P_OBJECT_DOESNT_SUPPORT_SLICE_ASSIGNMENT = tsLiteral("%p object doesn't support slice assignment"); + public static final TruffleString P_OBJECT_DOESNT_SUPPORT_SLICE_DELETION = tsLiteral("%p object doesn't support slice deletion"); // SSL errors public static final TruffleString SSL_SESSION_CLOSED = tsLiteral("SSL/TLS session closed cleanly."); @@ -1023,6 +1047,7 @@ public abstract class ErrorMessages { public static final TruffleString N_OBJECT_DOES_NOT_SUPPORT_THE_ASYNC_CONTEXT_MANAGER_PROTOCOL_AEXIT = tsLiteral( "'%N' object does not support the asynchronous context manager protocol (missed __aexit__ method)"); public static final TruffleString IOCTL_STRING_ARG_TOO_LONG = tsLiteral("ioctl string arg too long"); + public static final TruffleString S_NOT_SUPPORTED_ON_JAVA_POSIX_BACKEND = tsLiteral("'%s' not supported when using 'java' posix backend"); // mmap public static final TruffleString MEM_MAPPED_LENGTH_MUST_BE_POSITIVE = tsLiteral("memory mapped length must be positive"); @@ -1034,6 +1059,14 @@ public abstract class ErrorMessages { public static final TruffleString TOO_MANY_REMAINING_BYTES_TO_BE_STORED = tsLiteral("There are too many remaining bytes to be stored in a bytes object."); public static final TruffleString MMAP_CANNOT_MODIFY_READONLY_MEMORY = tsLiteral("mmap can't modify a readonly memory map."); public static final TruffleString DATA_OUT_OF_RANGE = tsLiteral("data out of range"); + public static final TruffleString MMAP_CLOSED_OR_INVALID = tsLiteral("mmap closed or invalid"); + public static final TruffleString MMAP_OBJECT_DOESNT_SUPPORT_ITEM_DELETION = tsLiteral("mmap object doesn't support item deletion"); + public static final TruffleString MMAP_OBJECT_DOESNT_SUPPORT_SLICE_DELETION = tsLiteral("mmap object doesn't support slice deletion"); + public static final TruffleString MMAP_ASSIGNMENT_MUST_BE_LENGTH_1_BYTES = tsLiteral("mmap assignment must be length-1 bytes()"); + public static final TruffleString MMAP_INDICES_MUST_BE_INTEGER = tsLiteral("mmap indices must be integer"); + public static final TruffleString MMAP_ITEM_VALUE_MUST_BE_AN_INT = tsLiteral("mmap item value must be an int"); + public static final TruffleString MMAP_ITEM_VALUE_MUST_BE_IN_RANGE = tsLiteral("mmap item value must be in range(0, 256)"); + public static final TruffleString MMAP_SLICE_ASSIGNMENT_IS_WRONG_SIZE = tsLiteral("mmap slice assignment is wrong size"); // zlib errors public static final TruffleString WHILE_FLUSHING = tsLiteral("while flushing"); @@ -1174,6 +1207,7 @@ public abstract class ErrorMessages { // ctypes public static final TruffleString PASSING_STRUCTS_BY_VALUE_NOT_SUPPORTED = tsLiteral("Passing structs by value is not supported on NFI backend"); + public static final TruffleString RETURNING_STRUCT_BY_VALUE_NOT_SUPPORTED = tsLiteral("ctypes: returning struct by value is not supported."); public static final TruffleString MEMORYVIEW_CANNOT_BE_CONVERTED_TO_NATIVE_MEMORY = tsLiteral("Memoryview cannot be converted to native memory"); public static final TruffleString CANNOT_CONVERT_OBJECT_POINTER_TO_NATIVE = tsLiteral("Cannot convert Object pointer to native"); public static final TruffleString CANNOT_APPLY_OFFSET_TO_AN_OBJECT_POINTER = tsLiteral("Cannot apply offset to an object pointer"); @@ -1182,7 +1216,7 @@ public abstract class ErrorMessages { public static final TruffleString FIELDS_MUST_BE_A_SEQUENCE_OF_PAIRS = tsLiteral("'_fields_' must be a sequence of pairs"); public static final TruffleString FIELDS_IS_FINAL = tsLiteral("_fields_ is final"); public static final TruffleString SECOND_ITEM_IN_FIELDS_TUPLE_INDEX_D_MUST_BE_A_C_TYPE = tsLiteral("second item in _fields_ tuple (index %d) must be a C type"); - public static final TruffleString BIT_FIELDS_NOT_ALLOWED_FOR_TYPE_S = tsLiteral("bit fields not allowed for type %s"); + public static final TruffleString BIT_FIELDS_NOT_ALLOWED_FOR_TYPE_N = tsLiteral("bit fields not allowed for type %N"); public static final TruffleString NUMBER_OF_BITS_INVALID_FOR_BIT_FIELD = tsLiteral("number of bits invalid for bit field"); public static final TruffleString STRUCTURE_OR_UNION_CANNOT_CONTAIN_ITSELF = tsLiteral("Structure or union cannot contain itself"); public static final TruffleString FIELDS_MUST_BE_A_SEQUENCE_OF_NAME_C_TYPE_PAIRS = tsLiteral("'_fields_' must be a sequence of (name, C type) pairs"); @@ -1208,14 +1242,14 @@ public abstract class ErrorMessages { public static final TruffleString COULD_NOT_CONVERT_THE_HANDLE_ATTRIBUTE_TO_A_POINTER = tsLiteral("could not convert the _handle attribute to a pointer"); public static final TruffleString NO_ALIGNMENT_INFO = tsLiteral("no alignment info"); public static final TruffleString THIS_TYPE_HAS_NO_SIZE = tsLiteral("this type has no size"); - public static final TruffleString BYREF_ARGUMENT_MUST_BE_A_CTYPES_INSTANCE_NOT_S = tsLiteral("byref() argument must be a ctypes instance, not '%s'"); + public static final TruffleString BYREF_ARGUMENT_MUST_BE_A_CTYPES_INSTANCE_NOT_P = tsLiteral("byref() argument must be a ctypes instance, not '%p'"); public static final TruffleString INVALID_TYPE = tsLiteral("invalid type"); public static final TruffleString TOO_MANY_ARGUMENTS_D_MAXIMUM_IS_D = tsLiteral("too many arguments (%d), maximum is %d"); public static final TruffleString ARGUMENT_D = tsLiteral("argument %d: "); public static final TruffleString FFI_CALL_FAILED = tsLiteral("ffi_call failed"); public static final TruffleString FFI_PREP_CIF_FAILED = tsLiteral("ffi_prep_cif failed"); public static final TruffleString INT_TOO_LONG_TO_CONVERT = tsLiteral("int too long to convert"); - public static final TruffleString CAST_ARGUMENT_2_MUST_BE_A_POINTER_TYPE_NOT_S = tsLiteral("cast() argument 2 must be a pointer type, not %s"); + public static final TruffleString CAST_ARGUMENT_2_MUST_BE_A_POINTER_TYPE_NOT_N = tsLiteral("cast() argument 2 must be a pointer type, not %N"); public static final TruffleString WRONG_TYPE = tsLiteral("wrong type"); public static final TruffleString INVALID_RESULT_TYPE_FOR_CALLBACK_FUNCTION = tsLiteral("invalid result type for callback function"); public static final TruffleString INVALID_INDEX = tsLiteral("invalid index"); @@ -1230,7 +1264,7 @@ public abstract class ErrorMessages { public static final TruffleString CLASS_MUST_DEFINE_A_TYPE_ATTRIBUTE = tsLiteral("class must define a '_type_' attribute"); public static final TruffleString TYPE_MUST_HAVE_STORAGE_INFO = tsLiteral("_type_ must have storage info"); public static final TruffleString ARRAY_TOO_LARGE = tsLiteral("array too large"); - public static final TruffleString OUT_PARAMETER_D_MUST_BE_A_POINTER_TYPE_NOT_S = tsLiteral("'out' parameter %d must be a pointer type, not %s"); + public static final TruffleString OUT_PARAMETER_D_MUST_BE_A_POINTER_TYPE_NOT_N = tsLiteral("'out' parameter %d must be a pointer type, not %N"); public static final TruffleString ARGUMENT_MUST_BE_CALLABLE_OR_INTEGER_FUNCTION_ADDRESS = tsLiteral("argument must be callable or integer function address"); public static final TruffleString CANNOT_CONSTRUCT_INSTANCE_OF_THIS_CLASS_NO_ARGTYPES = tsLiteral("cannot construct instance of this class: no argtypes"); public static final TruffleString THE_ERRCHECK_ATTRIBUTE_MUST_BE_CALLABLE = tsLiteral("the errcheck attribute must be callable"); @@ -1241,7 +1275,7 @@ public abstract class ErrorMessages { public static final TruffleString NOT_ENOUGH_ARGUMENTS = tsLiteral("not enough arguments"); public static final TruffleString NO_POSITIONAL_ARGUMENTS_EXPECTED = tsLiteral("no positional arguments expected"); public static final TruffleString NULL_STGDICT_UNEXPECTED = tsLiteral("NULL stgdict unexpected"); - public static final TruffleString S_OUT_PARAMETER_MUST_BE_PASSED_AS_DEFAULT_VALUE = tsLiteral("%s 'out' parameter must be passed as default value"); + public static final TruffleString N_OUT_PARAMETER_MUST_BE_PASSED_AS_DEFAULT_VALUE = tsLiteral("%N 'out' parameter must be passed as default value"); public static final TruffleString PARAMFLAG_D_NOT_YET_IMPLEMENTED = tsLiteral("paramflag %d not yet implemented"); public static final TruffleString CALL_TAKES_EXACTLY_D_ARGUMENTS_D_GIVEN = tsLiteral("call takes exactly %d arguments (%d given)"); public static final TruffleString PARAMFLAGS_MUST_BE_A_TUPLE_OR_NONE = tsLiteral("paramflags must be a tuple or None"); @@ -1275,7 +1309,7 @@ public abstract class ErrorMessages { public static final TruffleString DUPLICATE_VALUES_FOR_FIELD_S = tsLiteral("duplicate values for field %s"); public static final TruffleString EXPECTED_P_INSTANCE_INSTEAD_OF_POINTER_TO_P = tsLiteral("expected %p instance instead of pointer to %p"); public static final TruffleString CTYPES_OBJECTS_CONTAINING_POINTERS_CANNOT_BE_PICKLED = tsLiteral("ctypes objects containing pointers cannot be pickled"); - public static final TruffleString S_DICT_MUST_BE_A_DICTIONARY_NOT_S = tsLiteral("%s.__dict__ must be a dictionary, not %s"); + public static final TruffleString P_DICT_MUST_BE_A_DICTIONARY_NOT_P = tsLiteral("%p.__dict__ must be a dictionary, not %p"); public static final TruffleString STRING_TOO_LONG = tsLiteral("string too long"); public static final TruffleString UNICODE_STRING_EXPECTED_INSTEAD_OF_P_INSTANCE = tsLiteral("unicode string expected instead of %p instance"); public static final TruffleString BYTES_EXPECTED_INSTEAD_OF_P_INSTANCE = tsLiteral("bytes expected instead of %p instance"); @@ -1407,64 +1441,10 @@ public abstract class ErrorMessages { public static final TruffleString NULL_ARG_INTERNAL = tsLiteral("null argument to internal routine"); - // HPy - - public static final TruffleString UNSUPPORTED_HYPMETH_SIG = tsLiteral("Unsupported HPyMeth signature"); - public static final TruffleString NULL_CHAR_PASSED = tsLiteral("NULL char * passed to HPyBytes_FromStringAndSize"); - public static final TruffleString CAPSULE_GETDESTRUCTOR_WITH_INVALID_CAPSULE = tsLiteral("HPyCapsule_GetDestructor called with invalid PyCapsule object"); - public static final TruffleString CAPSULE_GETPOINTER_WITH_INVALID_CAPSULE = tsLiteral("HPyCapsule_GetPointer called with invalid PyCapsule object"); - public static final TruffleString CAPSULE_GETCONTEXT_WITH_INVALID_CAPSULE = tsLiteral("HPyCapsule_GetContext called with invalid PyCapsule object"); - public static final TruffleString CAPSULE_GETNAME_WITH_INVALID_CAPSULE = tsLiteral("HPyCapsule_GetName called with invalid PyCapsule object"); - public static final TruffleString HPY_NEW_ARG_1_MUST_BE_A_TYPE = tsLiteral("HPy_New arg 1 must be a type"); - public static final TruffleString ERROR_LOADING_HPY_EXT_S_S = tsLiteral("Error during loading of the HPy extension module at path '%s'. Function HPyInit_'%s' returned NULL."); - public static final TruffleString HPY_CAPI_SYM_NOT_CALLABLE = tsLiteral("HPy C API symbol %s is not callable"); - public static final TruffleString HPY_CALLTUPLEDICT_REQUIRES_ARGS_TUPLE_OR_NULL = tsLiteral("HPy_CallTupleDict requires args to be a tuple or null handle"); - public static final TruffleString HPY_CALLTUPLEDICT_REQUIRES_KW_DICT_OR_NULL = tsLiteral("HPy_CallTupleDict requires kw to be a dict or null handle"); - public static final TruffleString CANNOT_INITIALIZE_EXT_NO_ENTRY = tsLiteral("cannot initialize extension '%s' at path '%s', entry point '%s' not found"); - public static final TruffleString HPY_S_MODE_NOT_AVAILABLE = tsLiteral("HPy %s mode is not available"); - public static final TruffleString HPY_UNEXPECTED_HPY_NULL = tsLiteral("unexpected HPy_NULL"); - public static final TruffleString HPY_MOD_CREATE_RETURNED_BUILTIN_MOD = tsLiteral("HPy_mod_create slot returned a builtin module object. This is currently not supported."); - public static final TruffleString HPYCAPSULE_NEW_NULL_PTR_ERROR = tsLiteral("HPyCapsule_New called with null pointer"); - public static final TruffleString INVALID_HPYCAPSULE_DESTRUCTOR = tsLiteral("Invalid HPyCapsule destructor"); - public static final TruffleString HPY_MODE_VALUE_MUST_BE_STRING = tsLiteral("Value of HPy mode environment variable must be a string"); - public static final TruffleString HPY_METACLASS_IS_NOT_A_TYPE = tsLiteral("Metaclass '%s' is not a subclass of 'type'."); - public static final TruffleString HPY_METACLASS_WITH_CUSTOM_CONS_NOT_SUPPORTED = tsLiteral("Metaclasses with custom constructor are not supported."); - public static final TruffleString HPY_ERROR_LOADING_EXT_MODULE = tsLiteral("Error during loading of the HPy extension module at path '%s'. " + - "Cannot locate the required minimal HPy versions as symbols '%s' and `%s`. Error message from dlopen/WinAPI: %s"); - public static final TruffleString HPY_ABI_VERSION_ERROR = tsLiteral("HPy extension module '%s' requires unsupported version of the HPy runtime. " + - "Requested version: %d.%d. Current HPy version: %d.%d."); - public static final TruffleString HPY_ABI_TAG_MISMATCH = tsLiteral("HPy extension module '%s' at path '%s': mismatch between the HPy ABI tag encoded in the filename " + - "and the major version requested by the HPy extension itself. Major version tag parsed from filename: %d. Requested version: %d.%d."); - public static final TruffleString HPY_NO_ABI_TAG = tsLiteral("HPy extension module '%s' at path '%s': could not find HPy ABI tag encoded in the filename. " + - "The extension claims to be compiled with HPy ABI version: %d.%d."); - public static final TruffleString HPY_INVALID_SOURCE_KIND = tsLiteral("invalid source kind"); - public static final TruffleString HPY_OBJECT_DOES_NOT_SUPPORT_CALL = tsLiteral("'%p' object does not support HPy call protocol"); - public static final TruffleString HPY_TYPE_DOES_NOT_IMPLEMENT_CALL_PROTOCOL = tsLiteral("type '%p' does not implement the HPy call protocol"); - public static final TruffleString HPY_METACLASS_SPECIFIED_MULTIPLE_TIMES = tsLiteral("metaclass was specified multiple times"); - public static final TruffleString HPY_INVALID_BUILTIN_SHAPE = tsLiteral("invalid shape: %d"); - public static final TruffleString HPY_CANNOT_USE_CALL_WITH_VAR_OBJECTS = tsLiteral("Cannot use HPy call protocol with var objects"); - public static final TruffleString HPY_CANNOT_HAVE_CALL_AND_VECTORCALLOFFSET = tsLiteral("Cannot have HPy_tp_call and explicit member '__vectorcalloffset__'. Specify just one of them."); - public static final TruffleString HPY_CANNOT_SPECIFY_LEG_SLOTS_WO_SETTING_LEG = tsLiteral("cannot specify .legacy_slots without setting .builtin_shape=HPyType_BuiltinShape_Legacy"); - public static final TruffleString HPY_CANNOT_USE_CALL_WITH_LEGACY = tsLiteral("Cannot use HPy call protocol with legacy types that inherit the struct. " + - "Either set the basicsize to a non-zero value or use legacy slot 'Py_tp_call'."); public static final TruffleString NFI_NOT_AVAILABLE = tsLiteral("GraalPy option '%s' is set to '%s, but the 'nfi' language, which is required for this feature, is not available. " + "If this is a GraalPy standalone distribution: this indicates internal error. If GraalPy was used as a Maven dependency: " + "are you missing a runtime dependency 'org.graalvm.truffle:truffle-nfi-libffi', which should be a dependency of 'org.graalvm.polyglot:python{-community}'?"); - public static final TruffleString LLVM_NOT_AVAILABLE = tsLiteral("GraalPy option 'NativeModules' is set to false, but the 'llvm' language, which is required for this feature, is not available. " + - "If this is a GraalPy standalone distribution: this indicates internal error. If GraalPy was used as a Maven dependency: are you missing a runtime dependency " + - "'org.graalvm.polyglot:llvm{-community}'?"); - public static final TruffleString HPY_CANNOT_USE_JNI_BACKEND = tsLiteral("Cannot use HPy JNI backend because JNI access is forbidden."); - public static final TruffleString HPY_NFI_NOT_YET_IMPLEMENTED = tsLiteral("HPy NFI backend is not yet implemented"); - public static final TruffleString HPY_UNKNOWN_BACKEND = tsLiteral("unknown HPy backend: "); - private static final String HPY_NON_DEFAULT_MESSAGE = "This is not allowed because custom HPy_mod_create slot cannot return a builtin module object and cannot make any use of any other " + - "data defined in the HPyModuleDef. Either do not define HPy_mod_create slot and let the runtime create a builtin module object from the provided HPyModuleDef, or do not " + - "define anything else but the HPy_mod_create slot."; - public static final TruffleString HPY_DEFINES_CREATE_AND_NON_DEFAULT = tsLiteral("HPyModuleDef defines a HPy_mod_create slot and some of the other fields are not set to their default value. " + - HPY_NON_DEFAULT_MESSAGE); - public static final TruffleString HPY_DEFINES_CREATE_AND_OTHER_SLOTS = tsLiteral("HPyModuleDef defines a HPy_mod_create slot and some other slots or methods. " + - HPY_NON_DEFAULT_MESSAGE); - // AST Validator public static final TruffleString ANN_ASSIGN_WITH_SIMPLE_NON_NAME_TARGET = tsLiteral("AnnAssign with simple non-Name target"); public static final TruffleString BOOL_OP_WITH_LESS_THAN_2_VALUES = tsLiteral("BoolOp with less than 2 values"); @@ -1493,12 +1473,14 @@ public abstract class ErrorMessages { public static final TruffleString ONLY_DEFAULT_DIGEST_LENGTHS = tsLiteral("only default digest lengths supported for shake"); public static final TruffleString ONLY_DIGEST_SIZE_BLAKE_ARGUMENT = tsLiteral("blake2b/blake2s only supported for digest_size with non-default value"); public static final TruffleString CALLED_WITH_INVALID_PY_CAPSULE_OBJECT = tsLiteral("%s called with invalid PyCapsule object"); + public static final TruffleString CALLED_WITH_INCORRECT_NAME = tsLiteral("%s called with incorrect name"); + public static final TruffleString CALLED_WITH_NULL_POINTER = tsLiteral("%s called with null pointer"); public static final TruffleString PY_CAPSULE_IMPORT_S_IS_NOT_VALID = tsLiteral("PyCapsule_Import \"%s\" is not valid"); // asyncio - public static final TruffleString CANNOT_BE_USED_AWAIT = tsLiteral("object %s can't be used in 'await' expression"); + public static final TruffleString CANNOT_BE_USED_AWAIT = tsLiteral("object %N can't be used in 'await' expression"); public static final TruffleString AWAIT_RETURN_COROUTINE = tsLiteral("__await__() returned a coroutine"); - public static final TruffleString AWAIT_RETURN_NON_ITER = tsLiteral("__await__() returned non-iterator of type '%s'"); + public static final TruffleString AWAIT_RETURN_NON_ITER = tsLiteral("__await__() returned non-iterator of type '%N'"); public static final TruffleString NO_RUNNING_EVENT_LOOP = tsLiteral("no running event loop"); public static final TruffleString CANT_ENTER_TASK_ALREADY_RUNNING = tsLiteral("Cannot enter into task %s while another task %s is being executed."); public static final TruffleString TASK_NOT_ENTERED = tsLiteral("Leaving task %s does not match the current task %s."); @@ -1519,7 +1501,7 @@ public abstract class ErrorMessages { public static final TruffleString DECODING_ERROR_HANDLER_MUST_RETURN = tsLiteral("decoding error handler must return (str, int) tuple"); public static final TruffleString ARG_MUST_BE_A_SEQUENCE_OBJECT = tsLiteral("arg must be a sequence object"); - public static final TruffleString STREAM_FUNCTION_RETURNED_A_NON_BYTES_OBJECT_S = tsLiteral("stream function returned a non-bytes object (%s)"); + public static final TruffleString STREAM_FUNCTION_RETURNED_A_NON_BYTES_OBJECT_P = tsLiteral("stream function returned a non-bytes object (%p)"); public static final TruffleString CANNOT_BUILD_PARAMETER = tsLiteral("cannot build parameter"); public static final TruffleString ON_CALLING_CTYPES_CALLBACK_FUNCTION = tsLiteral("on calling ctypes callback function"); @@ -1528,12 +1510,12 @@ public abstract class ErrorMessages { public static final TruffleString INDEX_EXCEEDS_INT = tsLiteral("index exceeds integer size"); public static final TruffleString X_NOT_IN_SEQUENCE = tsLiteral("sequence.index(x): x not in sequence"); - public static final TruffleString ASYNC_FOR_NO_AITER = tsLiteral("'async for' requires object with __aiter__ method, got %s"); - public static final TruffleString ASYNC_FOR_NO_ANEXT_INITIAL = tsLiteral("'async for' received an object from __aiter__ that does not implement __anext__: %s"); + public static final TruffleString ASYNC_FOR_NO_AITER = tsLiteral("'async for' requires object with __aiter__ method, got %N"); + public static final TruffleString ASYNC_FOR_NO_ANEXT_INITIAL = tsLiteral("'async for' received an object from __aiter__ that does not implement __anext__: %p"); public static final TruffleString ASYNC_FOR_NO_ANEXT_ITERATION = tsLiteral("'async for' requires an iterator with __anext__ method, got %p"); public static final TruffleString CANNOT_REUSE_ASEND = tsLiteral("cannot reuse already awaited __anext__()/asend()"); - public static final TruffleString OBJECT_NOT_ASYNCGEN = tsLiteral("'%s' object is not an async generator"); + public static final TruffleString OBJECT_NOT_ASYNCGEN = tsLiteral("'%p' object is not an async generator"); public static final TruffleString CANNOT_REUSE_ATHROW = tsLiteral("cannot reuse already awaited aclose()/athrow()"); public static final TruffleString CANNOT_REUSE_CORO = tsLiteral("cannot reuse already awaited coroutine"); public static final TruffleString AGEN_ALREADY_RUNNING = tsLiteral("anext(): asynchronous generator is already running"); @@ -1654,4 +1636,15 @@ public abstract class ErrorMessages { public static final TruffleString STRUCT_ITER_CANNOT_UNPACK_FROM_STRUCT_OF_SIZE_0 = tsLiteral("cannot iteratively unpack with a struct of length 0"); public static final TruffleString STRUCT_ITER_UNPACK_REQ_A_BUFFER_OF_A_MUL_OF_BYTES = tsLiteral("iterative unpacking requires a buffer of a multiple of %d bytes"); public static final TruffleString CANNOT_CREATE_P_OBJECTS = tsLiteral("Cannot create %p objects"); + public static final TruffleString ARROW_ARRAY_ALREADY_RELEASED = tsLiteral("Cannot release already released ArrowArray"); + public static final TruffleString ARROW_SCHEMA_ALREADY_RELEASED = tsLiteral("Cannot release already released ArrowSchema"); + public static final TruffleString CAPI_ISOLATION_CAPPED_AT_D = tsLiteral( + "There is no available slot for C API isolation. The current limit for concurrent Python contexts accessing the Python C API is %d. This can be changed with the" + + J_MAX_CAPI_COPIES + " System property."); + public static final TruffleString SYS_PREFIX_MUST_BE_STRING_NOT_P_FOR_CAPI_ISOLATION = tsLiteral( + "The sys.prefix must be a str, not '%p' when the `IsolateNativeModules' option is used, because it is the base path for searching the relocated C API. " + + "Refer to https://www.graalvm.org/latest/reference-manual/python/Native-Extensions for details on native module isolation."); + public static final TruffleString SYS_PREFIX_MUST_POINT_TO_A_VENV_FOR_CAPI_ISOLATION = tsLiteral( + "The sys.prefix must point to a writable venv folder or the system default temporary directory needs to be writable when the `IsolateNativeModules' option is used, because it is the base path for searching and creating the relocated C API and extension modules. " + + "Refer to https://www.graalvm.org/latest/reference-manual/python/Native-Extensions for details on native module isolation."); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/HiddenAttr.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/HiddenAttr.java index 0b1d055618..ae1b21cf81 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/HiddenAttr.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/HiddenAttr.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -80,6 +80,8 @@ public final class HiddenAttr { public static final HiddenAttr DEALLOC = new HiddenAttr("__dealloc__"); public static final HiddenAttr DEL = new HiddenAttr("__del__"); public static final HiddenAttr FREE = new HiddenAttr("__free__"); + public static final HiddenAttr TRAVERSE = new HiddenAttr("tp_traverse"); + public static final HiddenAttr IS_GC = new HiddenAttr("tp_is_gc"); public static final HiddenAttr CLEAR = new HiddenAttr("__clear__"); public static final HiddenAttr AS_BUFFER = new HiddenAttr("__tp_as_buffer__"); public static final HiddenAttr FLAGS = new HiddenAttr(J___FLAGS__); @@ -99,10 +101,10 @@ public final class HiddenAttr { public static final HiddenAttr PROMOTED_START = new HiddenAttr("promoted_start"); // PythonCextSlotBuiltins public static final HiddenAttr PROMOTED_STEP = new HiddenAttr("promoted_step"); // PythonCextSlotBuiltins public static final HiddenAttr PROMOTED_STOP = new HiddenAttr("promoted_stop"); // PythonCextSlotBuiltins - public static final HiddenAttr METHODS_FLAGS = new HiddenAttr("__methods_flags__"); // GetMethodsFlagsNode public static final HiddenAttr NATIVE_STORAGE = new HiddenAttr("native_storage"); public static final HiddenAttr NATIVE_SLOTS = new HiddenAttr("__native_slots__"); public static final HiddenAttr INSTANCESHAPE = new HiddenAttr("instanceshape"); + public static final HiddenAttr STRUCTSEQ_FIELD_NAMES = new HiddenAttr("struct_seq_field_names"); private final HiddenKey key; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PConstructAndRaiseNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PConstructAndRaiseNode.java index 42e4771020..0011380ccc 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PConstructAndRaiseNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PConstructAndRaiseNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -54,7 +54,7 @@ import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.ssl.SSLErrorCode; import com.oracle.graal.python.nodes.PConstructAndRaiseNodeGen.LazyNodeGen; -import com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode; +import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PosixSupportLibrary.UnsupportedPosixFeatureException; import com.oracle.graal.python.runtime.PythonContext; @@ -95,7 +95,7 @@ private static TruffleString getFormattedMessage(TruffleString format, Object[] } private PException raiseInternal(VirtualFrame frame, PythonBuiltinClassType type, Object cause, Object[] arguments, PKeyword[] keywords, - CallVarargsMethodNode callNode, Python3Core core, TruffleString.FromJavaStringNode fromJavaStringNode) { + CallNode callNode, Python3Core core, TruffleString.FromJavaStringNode fromJavaStringNode) { if (arguments != null) { for (int i = 0; i < arguments.length; ++i) { if (arguments[i] instanceof String) { @@ -115,7 +115,7 @@ private PException raiseInternal(VirtualFrame frame, PythonBuiltinClassType type PException constructAndRaiseNoFormatString(VirtualFrame frame, PythonBuiltinClassType type, Object cause, @SuppressWarnings("unused") TruffleString format, @SuppressWarnings("unused") Object[] formatArgs, Object[] arguments, PKeyword[] keywords, - @Cached.Shared("callNode") @Cached CallVarargsMethodNode callNode, + @Cached.Shared("callNode") @Cached CallNode callNode, @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode) { Python3Core core = PythonContext.get(this); return raiseInternal(frame, type, cause, arguments, keywords, callNode, core, fromJavaStringNode); @@ -124,7 +124,7 @@ PException constructAndRaiseNoFormatString(VirtualFrame frame, PythonBuiltinClas @Specialization(guards = {"format != null", "arguments == null"}) PException constructAndRaiseNoArgs(VirtualFrame frame, PythonBuiltinClassType type, Object cause, TruffleString format, Object[] formatArgs, @SuppressWarnings("unused") Object[] arguments, PKeyword[] keywords, - @Cached.Shared("callNode") @Cached CallVarargsMethodNode callNode, + @Cached.Shared("callNode") @Cached CallNode callNode, @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode) { Python3Core core = PythonContext.get(this); Object[] args = new Object[]{formatArgs != null ? getFormattedMessage(format, formatArgs) : format}; @@ -134,7 +134,7 @@ PException constructAndRaiseNoArgs(VirtualFrame frame, PythonBuiltinClassType ty @Specialization(guards = {"format != null", "arguments != null"}) PException constructAndRaise(VirtualFrame frame, PythonBuiltinClassType type, Object cause, TruffleString format, Object[] formatArgs, Object[] arguments, PKeyword[] keywords, - @Cached.Shared("callNode") @Cached CallVarargsMethodNode callNode, + @Cached.Shared("callNode") @Cached CallNode callNode, @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode) { Python3Core core = PythonContext.get(this); Object[] args = new Object[arguments.length + 1]; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PGuards.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PGuards.java index c693b01b50..b25e29ddaf 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PGuards.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PGuards.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -57,30 +57,22 @@ import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject; import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper; import com.oracle.graal.python.builtins.objects.cext.common.NativePointer; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyHandle; -import com.oracle.graal.python.builtins.objects.cext.hpy.PythonHPyObject; import com.oracle.graal.python.builtins.objects.code.PCode; import com.oracle.graal.python.builtins.objects.common.EconomicMapStorage; import com.oracle.graal.python.builtins.objects.common.EmptyStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorage; import com.oracle.graal.python.builtins.objects.common.PHashingCollection; import com.oracle.graal.python.builtins.objects.complex.PComplex; +import com.oracle.graal.python.builtins.objects.dict.DictBuiltins; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.dict.PDictView; import com.oracle.graal.python.builtins.objects.ellipsis.PEllipsis; import com.oracle.graal.python.builtins.objects.exception.PBaseException; import com.oracle.graal.python.builtins.objects.floats.PFloat; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.BinaryBuiltinDescriptor; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.TernaryBuiltinDescriptor; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.UnaryBuiltinDescriptor; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptors; -import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; import com.oracle.graal.python.builtins.objects.function.PFunction; import com.oracle.graal.python.builtins.objects.getsetdescriptor.DescriptorDeleteMarker; import com.oracle.graal.python.builtins.objects.ints.PInt; -import com.oracle.graal.python.builtins.objects.iterator.PSequenceIterator; import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView; import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; @@ -99,74 +91,38 @@ import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; -import com.oracle.graal.python.builtins.objects.type.PythonClass; import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyIndexCheckNode; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.sequence.PSequence; import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.DoubleSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.EmptySequenceStorage; +import com.oracle.graal.python.runtime.sequence.storage.ForeignSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.IntSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.LongSequenceStorage; +import com.oracle.graal.python.runtime.sequence.storage.NativeObjectSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage; -import com.oracle.graal.python.util.OverflowException; +import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Idempotent; import com.oracle.truffle.api.exception.AbstractTruffleException; -import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.UnexpectedResultException; -import com.oracle.truffle.api.profiles.ConditionProfile; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.strings.TruffleString.CodeRange; public abstract class PGuards { - /** - * Specialization guards. - */ - - public static boolean stringEquals(String expected, String other, ConditionProfile profile) { - if (profile.profile(expected == other)) { - return true; - } - return expected.equals(other); - } - - public static boolean stringEquals(String expected, String other, Node inliningTarget, InlinedConditionProfile profile) { - if (profile.profile(inliningTarget, expected == other)) { - return true; - } - return expected.equals(other); - } - - public static boolean stringEquals(TruffleString expected, TruffleString other, TruffleString.EqualNode equalNode, ConditionProfile profile) { - if (profile.profile(expected == other)) { - return true; - } - return equalNode.execute(expected, other, TS_ENCODING); - } - - public static boolean stringEquals(TruffleString expected, TruffleString other, TruffleString.EqualNode equalNode, Node inliningTarget, InlinedConditionProfile profile) { - if (profile.profile(inliningTarget, expected == other)) { - return true; - } - return equalNode.execute(expected, other, TS_ENCODING); - } public static boolean stringEquals(TruffleString key, TruffleString cachedKey, TruffleString.EqualNode equalNode) { return equalNode.execute(cachedKey, key, TS_ENCODING); } - public static boolean isSameObject(Object left, Object right) { - return left == right; - } - public static boolean isEmpty(Object[] array) { return array.length == 0; } @@ -226,27 +182,10 @@ public static boolean isCallable(Object value) { return value instanceof PBuiltinFunction || value instanceof PFunction || value instanceof PBuiltinMethod || value instanceof PMethod; } - /** - * Use instead of {@link #isCallable(Object)} for objects coming from - * {@link com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode}. Note that such - * objects can be then forwarded only to call nodes that support them. - */ - public static boolean isCallableOrDescriptor(Object value) { - return isCallable(value) || BuiltinMethodDescriptor.isInstance(value); - } - - public static boolean isBuiltinDescriptor(Object value) { - return BuiltinMethodDescriptor.isInstance(value); - } - public static boolean isClass(Node inliningTarget, Object obj, TypeNodes.IsTypeNode isTypeNode) { return isTypeNode.execute(inliningTarget, obj); } - public static boolean isClassUncached(Object obj) { - return TypeNodes.IsTypeNode.executeUncached(obj); - } - public static boolean isEmptyStorage(PSequence sequence) { return sequence.getSequenceStorage() instanceof EmptySequenceStorage; } @@ -259,36 +198,24 @@ public static boolean isByteStorage(PSequence array) { return array.getSequenceStorage() instanceof ByteSequenceStorage; } - public static boolean areBothIntStorage(PSequence first, PSequence second) { - return first.getSequenceStorage() instanceof IntSequenceStorage && second.getSequenceStorage() instanceof IntSequenceStorage; - } - - public static boolean areBothByteStorage(PSequence first, PSequence second) { - return first.getSequenceStorage() instanceof ByteSequenceStorage && second.getSequenceStorage() instanceof ByteSequenceStorage; - } - public static boolean isLongStorage(PSequence sequence) { return sequence.getSequenceStorage() instanceof LongSequenceStorage; } - public static boolean areBothLongStorage(PList first, PList second) { - return first.getSequenceStorage() instanceof LongSequenceStorage && second.getSequenceStorage() instanceof LongSequenceStorage; - } - public static boolean isDoubleStorage(PSequence sequence) { return sequence.getSequenceStorage() instanceof DoubleSequenceStorage; } - public static boolean areBothDoubleStorage(PList first, PList second) { - return first.getSequenceStorage() instanceof DoubleSequenceStorage && second.getSequenceStorage() instanceof DoubleSequenceStorage; - } - public static boolean isObjectStorage(PSequence list) { return list.getSequenceStorage() instanceof ObjectSequenceStorage; } - public static boolean areBothObjectStorage(PList first, PList second) { - return first.getSequenceStorage() instanceof ObjectSequenceStorage && second.getSequenceStorage() instanceof ObjectSequenceStorage; + public static boolean isForeignSequenceStorage(SequenceStorage sequenceStorage) { + return sequenceStorage instanceof ForeignSequenceStorage; + } + + public static boolean isNativeObjectStorage(SequenceStorage sequenceStorage) { + return sequenceStorage instanceof NativeObjectSequenceStorage; } public static boolean isList(Object o) { @@ -299,21 +226,6 @@ public static boolean isEconomicMapOrEmpty(HashingStorage self) { return self instanceof EconomicMapStorage || self instanceof EmptyStorage; } - public static boolean isObjectStorageIterator(PSequenceIterator iterator) { - if (!iterator.isPSequence()) { - return false; - } - - PSequence sequence = iterator.getPSequence(); - - if (sequence instanceof PList) { - PList list = (PList) sequence; - return list.getSequenceStorage() instanceof ObjectSequenceStorage; - } - - return false; - } - public static boolean isPythonObject(Object obj) { return obj instanceof PythonObject; } @@ -322,41 +234,6 @@ public static boolean isPythonModule(Object obj) { return obj instanceof PythonModule; } - /** - * Argument guards. - */ - public static boolean emptyArguments(VirtualFrame frame) { - return PArguments.getUserArgumentLength(frame) == 0; - } - - public static boolean argGiven(Object object) { - return object == PNone.NO_VALUE; - } - - public static boolean emptyArguments(PNone none) { - return none == PNone.NO_VALUE; - } - - public static boolean isIndexPositive(int idx) { - return idx >= 0; - } - - public static boolean isIndexNegative(int idx) { - return idx < 0; - } - - public static boolean isIndexPositive(long idx) { - return idx >= 0; - } - - public static boolean isIndexNegative(long idx) { - return idx < 0; - } - - public static boolean isPythonUserClass(Object klass) { - return klass instanceof PythonClass || PythonNativeClass.isInstance(klass); - } - public static boolean isPythonBuiltinClassType(Object klass) { return klass instanceof PythonBuiltinClassType; } @@ -542,10 +419,6 @@ public static boolean isPFrozenSet(Object o) { return o instanceof PFrozenSet; } - public static boolean canDoSetBinOp(Object o) { - return isAnySet(o) || isDictView(o); - } - public static boolean isPSlice(Object obj) { return obj instanceof PSlice; } @@ -558,14 +431,6 @@ public static boolean isCDataObject(Object obj) { return obj instanceof CDataObject; } - public static boolean isHPyHandle(Object obj) { - return obj instanceof GraalHPyHandle; - } - - public static boolean isHPyObject(Object obj) { - return obj instanceof PythonHPyObject; - } - public static boolean expectBoolean(Object result) throws UnexpectedResultException { if (result instanceof Boolean) { return (Boolean) result; @@ -580,16 +445,6 @@ public static int expectInteger(Object result) throws UnexpectedResultException throw new UnexpectedResultException(result); } - public static int expectInt(Object result) throws UnexpectedResultException, OverflowException { - if (result instanceof Integer) { - return (Integer) result; - } - if (result instanceof Long) { - return PInt.intValueExact((Long) result); - } - throw new UnexpectedResultException(result); - } - public static long expectLong(Object result) throws UnexpectedResultException { if (result instanceof Long) { return (Long) result; @@ -667,22 +522,6 @@ public static boolean isKindOfBuiltinClass(Object clazz) { return clazz instanceof PythonBuiltinClassType || clazz instanceof PythonBuiltinClass; } - public static boolean isUnaryBuiltinDescriptor(Object value) { - return value instanceof UnaryBuiltinDescriptor; - } - - public static boolean isBinaryBuiltinDescriptor(Object value) { - return value instanceof BinaryBuiltinDescriptor; - } - - public static boolean isTernaryBuiltinDescriptor(Object value) { - return value instanceof TernaryBuiltinDescriptor; - } - - public static boolean isMinusOne(long l) { - return l == -1; - } - public static boolean isAscii(TruffleString str, TruffleString.GetCodeRangeNode getCodeRangeNode) { return getCodeRangeNode.execute(str, TS_ENCODING) == CodeRange.ASCII; } @@ -709,7 +548,12 @@ public static boolean isNullOrZero(Object value, InteropLibrary lib) { } /* CPython tests that tp_iter is dict_iter */ - public static boolean hasBuiltinDictIter(Node inliningTarget, PDict dict, GetPythonObjectClassNode getClassNode, LookupCallableSlotInMRONode lookupIter) { - return isBuiltinDict(dict) || lookupIter.execute(getClassNode.execute(inliningTarget, dict)) == BuiltinMethodDescriptors.DICT_ITER; + public static boolean hasBuiltinDictIter(Node inliningTarget, PDict dict, GetPythonObjectClassNode getClassNode, GetCachedTpSlotsNode getSlots) { + return isBuiltinDict(dict) || getSlots.execute(inliningTarget, getClassNode.execute(inliningTarget, dict)).tp_iter() == DictBuiltins.SLOTS.tp_iter(); + } + + @Idempotent + public static boolean isBytecodeDSLInterpreter() { + return PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PNodeWithContext.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PNodeWithContext.java index 1785649c1b..03ebc57a10 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PNodeWithContext.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PNodeWithContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,7 +41,6 @@ package com.oracle.graal.python.nodes; import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.runtime.PosixSupport; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonOptions; @@ -51,20 +50,10 @@ import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NonIdempotent; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.ValueProfile; -@ImportStatic({PGuards.class, PythonOptions.class, SpecialMethodNames.class, SpecialAttributeNames.class, SpecialMethodSlot.class, BuiltinNames.class}) +@ImportStatic({PGuards.class, PythonOptions.class, SpecialMethodNames.class, SpecialAttributeNames.class, BuiltinNames.class}) public abstract class PNodeWithContext extends Node { - /** - * @return {@code true} if this node can be shared statically. - */ - @Idempotent - // conflicting with Node.isUncached(). Should be migrated to Node.isUncached() in the future. - protected final boolean isUncachedNode() { - return !isAdoptable(); - } - @TruffleBoundary public static void printStack() { // a convenience methods for debugging @@ -96,10 +85,6 @@ public static boolean isSingleContext(Node node) { return PythonLanguage.get(node).isSingleContext(); } - public ValueProfile createValueIdentityProfile() { - return getLanguage().isSingleContext() ? ValueProfile.createIdentityProfile() : ValueProfile.createClassProfile(); - } - public final PosixSupport getPosixSupport() { return getContext().getPosixSupport(); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PRaiseNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PRaiseNode.java index 4d0883a97f..64c1668d8f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PRaiseNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PRaiseNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,233 +41,215 @@ package com.oracle.graal.python.nodes; import static com.oracle.graal.python.nodes.ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC; -import static com.oracle.graal.python.nodes.truffle.TruffleStringMigrationHelpers.assertNoJavaString; import static com.oracle.graal.python.runtime.exception.PythonErrorType.OverflowError; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; -import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.exception.AttributeErrorBuiltins; import com.oracle.graal.python.builtins.objects.exception.PBaseException; -import com.oracle.graal.python.nodes.PRaiseNodeGen.LazyNodeGen; +import com.oracle.graal.python.lib.PyExceptionInstanceCheckNode; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.EncapsulatingNodeReference; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.strings.TruffleString; -@ImportStatic(PGuards.class) +@GenerateInline +@GenerateCached(false) @GenerateUncached -@SuppressWarnings("truffle-inlining") // footprint reduction 32 -> 13 public abstract class PRaiseNode extends Node { - public final PException execute(Node raisingNode, PythonBuiltinClassType type, Object cause, Object format, Object[] arguments) { - return execute(raisingNode, type, null, cause, format, arguments); - } - - public abstract PException execute(Node raisingNode, PythonBuiltinClassType type, Object[] data, Object cause, Object format, Object[] arguments); + protected abstract void executeEnterProfile(Node inliningTarget); - public final PException raise(PythonBuiltinClassType type) { - throw execute(this, type, null, PNone.NO_VALUE, PNone.NO_VALUE, PythonUtils.EMPTY_OBJECT_ARRAY); + @Specialization + static void doProfile(Node inliningTarget, + @Cached InlinedBranchProfile profile) { + profile.enter(inliningTarget); } - public final PException raise(PythonBuiltinClassType type, TruffleString message) { - throw execute(this, type, null, PNone.NO_VALUE, message, PythonUtils.EMPTY_OBJECT_ARRAY); + public final PException raise(Node inliningTarget, PythonBuiltinClassType type) { + executeEnterProfile(inliningTarget); + throw raiseStatic(inliningTarget, type); } - public final PException raise(PythonBuiltinClassType type, TruffleString format, Object... arguments) { - throw execute(this, type, null, PNone.NO_VALUE, format, arguments); + public static PException raiseStatic(Node node, PythonBuiltinClassType type) { + PythonLanguage language = PythonLanguage.get(node); + PBaseException pythonException = PFactory.createBaseException(language, type); + throw raiseExceptionObject(node, pythonException, language); } - public final PException raise(PythonBuiltinClassType type, Object[] arguments) { - throw execute(this, type, null, PNone.NO_VALUE, PNone.NO_VALUE, arguments); + public final PException raise(Node inliningTarget, PythonBuiltinClassType type, TruffleString message) { + executeEnterProfile(inliningTarget); + throw raiseStatic(inliningTarget, type, message); } - public final PException raiseWithData(PythonBuiltinClassType type, Object[] data, Object... arguments) { - throw execute(this, type, data, PNone.NO_VALUE, PNone.NO_VALUE, arguments); + public static PException raiseStatic(Node node, PythonBuiltinClassType type, TruffleString message) { + PythonLanguage language = PythonLanguage.get(node); + PBaseException pythonException = PFactory.createBaseException(language, type, message); + throw raiseExceptionObject(node, pythonException, language); } - public final PException raise(PythonBuiltinClassType type, Exception e) { - throw execute(this, type, null, PNone.NO_VALUE, getMessage(e), PythonUtils.EMPTY_OBJECT_ARRAY); + public final PException raise(Node inliningTarget, PythonBuiltinClassType type, TruffleString format, Object... formatArgs) { + executeEnterProfile(inliningTarget); + throw raiseStatic(inliningTarget, type, format, formatArgs); } - public final PException raiseWithCause(PythonBuiltinClassType type, Object cause, TruffleString format, Object... arguments) { - throw execute(this, type, null, cause, format, arguments); + public static PException raiseStatic(Node node, PythonBuiltinClassType type, TruffleString message, Object... formatArgs) { + PythonLanguage language = PythonLanguage.get(node); + PBaseException pythonException = PFactory.createBaseException(language, type, message, formatArgs); + throw raiseExceptionObject(node, pythonException, language); } - public final PException raiseWithCause(PythonBuiltinClassType errorType, PException e, TruffleString message, Object... arguments) { - return raiseWithCause(errorType, e.getEscapedException(), message, arguments); + public final PException raise(Node inliningTarget, PythonBuiltinClassType type, Object[] arguments) { + executeEnterProfile(inliningTarget); + throw raiseStatic(inliningTarget, type, arguments); } - public static PException raiseUncached(Node raisingNode, PythonBuiltinClassType exceptionType) { - throw PRaiseNodeGen.getUncached().execute(raisingNode, exceptionType, null, PNone.NO_VALUE, PNone.NO_VALUE, PythonUtils.EMPTY_OBJECT_ARRAY); + public static PException raiseStatic(Node node, PythonBuiltinClassType type, Object[] arguments) { + PythonLanguage language = PythonLanguage.get(node); + PBaseException pythonException = PFactory.createBaseException(language, type, PFactory.createTuple(language, arguments)); + throw raiseExceptionObject(node, pythonException, language); } - public static PException raiseUncached(Node raisingNode, PythonBuiltinClassType exceptionType, TruffleString message) { - throw PRaiseNodeGen.getUncached().execute(raisingNode, exceptionType, null, PNone.NO_VALUE, assertNoJavaString(message), PythonUtils.EMPTY_OBJECT_ARRAY); + public final PException raiseWithData(Node inliningTarget, PythonBuiltinClassType type, Object[] data) { + executeEnterProfile(inliningTarget); + throw raiseWithDataStatic(inliningTarget, type, data); } - public static PException raiseUncached(Node raisingNode, PythonBuiltinClassType type, TruffleString format, Object... arguments) { - throw PRaiseNodeGen.getUncached().execute(raisingNode, type, null, PNone.NO_VALUE, format, arguments); + public static PException raiseWithDataStatic(Node node, PythonBuiltinClassType type, Object[] data) { + PythonLanguage language = PythonLanguage.get(node); + PBaseException pythonException = PFactory.createBaseException(language, type, data, null); + throw raiseExceptionObject(node, pythonException, language); } - public static PException raiseUncached(Node raisingNode, PythonBuiltinClassType type, Exception e) { - throw PRaiseNodeGen.getUncached().execute(raisingNode, type, null, PNone.NO_VALUE, getMessage(e), PythonUtils.EMPTY_OBJECT_ARRAY); + public final PException raiseAttributeError(Node inliningTarget, Object obj, Object key) { + executeEnterProfile(inliningTarget); + throw raiseAttributeErrorStatic(inliningTarget, obj, key); } - /** - * Raise an error saying that the {@code result} cannot fit into an index-sized integer. Use the - * specified {@code type} as exception class. - */ - public final PException raiseNumberTooLarge(PythonBuiltinClassType type, Object result) { - return execute(this, type, null, PNone.NO_VALUE, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, new Object[]{result}); + public static PException raiseAttributeErrorStatic(Node inliningTarget, Object obj, Object key) { + throw raiseWithDataStatic(inliningTarget, PythonBuiltinClassType.AttributeError, AttributeErrorBuiltins.dataForObjKey(obj, key), ErrorMessages.OBJ_P_HAS_NO_ATTR_S, obj, key); } - public final PException raiseOverflow() { - return raiseNumberTooLarge(OverflowError, 0); + public final PException raiseWithData(Node inliningTarget, PythonBuiltinClassType type, Object[] data, TruffleString format, Object... formatArgs) { + executeEnterProfile(inliningTarget); + throw raiseWithDataStatic(inliningTarget, type, data, format, formatArgs); } - public final PException raiseSystemExit(Object code) { - return raiseWithData(PythonBuiltinClassType.SystemExit, new Object[]{code}, code); + public static PException raiseWithDataStatic(Node node, PythonBuiltinClassType type, Object[] data, TruffleString format, Object... formatArgs) { + PythonLanguage language = PythonLanguage.get(node); + PBaseException pythonException = PFactory.createBaseException(language, type, data, format, formatArgs); + throw raiseExceptionObject(node, pythonException, language); } - public final PException raiseStopIteration() { - return raise(PythonBuiltinClassType.StopIteration); + public final PException raiseWithData(Node inliningTarget, PythonBuiltinClassType type, Object[] data, Object... arguments) { + executeEnterProfile(inliningTarget); + throw raiseWithDataStatic(inliningTarget, type, data, arguments); } - public final PException raiseStopIteration(Object value) { - final Object retVal = value != null ? value : PNone.NONE; - final Object[] args = {retVal}; - return raiseWithData(PythonBuiltinClassType.StopIteration, args, retVal); + public static PException raiseWithDataStatic(Node node, PythonBuiltinClassType type, Object[] data, Object[] arguments) { + PythonLanguage language = PythonLanguage.get(node); + PBaseException pythonException = PFactory.createBaseException(language, type, data, PFactory.createTuple(language, arguments)); + throw raiseExceptionObject(node, pythonException, language); } - public final PException raiseIntegerInterpretationError(Object result) { - return raise(PythonBuiltinClassType.TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, result); + public final PException raise(Node inliningTarget, PythonBuiltinClassType type, Exception e) { + executeEnterProfile(inliningTarget); + throw raiseStatic(inliningTarget, type, e); } - public final PException raiseBadInternalCall() { - return raise(PythonBuiltinClassType.SystemError, BAD_ARG_TO_INTERNAL_FUNC); + public static PException raiseStatic(Node node, PythonBuiltinClassType type, Exception e) { + PythonLanguage language = PythonLanguage.get(node); + PBaseException pythonException = PFactory.createBaseException(language, type, ErrorMessages.M, new Object[]{e}); + throw raiseExceptionObject(node, pythonException, language); } - public final PException raiseMemoryError() { - return raise(PythonBuiltinClassType.MemoryError); + private static void setCause(PBaseException pythonException, PException cause) { + // _PyErr_FormatFromCause sets both cause and context + Object causePythonException = cause.getEscapedException(); + pythonException.setCause(causePythonException); + pythonException.setContext(causePythonException); } - public final PException raiseExceptionObject(Object exc) { - throw raiseExceptionObject(this, exc, PythonOptions.isPExceptionWithJavaStacktrace(PythonLanguage.get(this))); + public final PException raiseWithCause(Node inliningTarget, PythonBuiltinClassType type, PException cause, TruffleString format) { + executeEnterProfile(inliningTarget); + throw raiseWithCauseStatic(inliningTarget, type, cause, format); } - public static PException raiseExceptionObject(Node raisingNode, Object exc) { - throw raiseExceptionObject(raisingNode, exc, PythonOptions.isPExceptionWithJavaStacktrace(PythonLanguage.get(raisingNode))); + public static PException raiseWithCauseStatic(Node node, PythonBuiltinClassType type, PException cause, TruffleString format) { + PythonLanguage language = PythonLanguage.get(node); + PBaseException pythonException = PFactory.createBaseException(language, type, format); + setCause(pythonException, cause); + throw raiseExceptionObject(node, pythonException, language); } - public static PException raiseExceptionObject(Node raisingNode, Object exc, boolean withJavaStacktrace) { - if (raisingNode != null && raisingNode.isAdoptable()) { - throw PException.fromObject(exc, raisingNode, withJavaStacktrace); - } else { - throw PException.fromObject(exc, EncapsulatingNodeReference.getCurrent().get(), withJavaStacktrace); - } + public final PException raiseWithCause(Node inliningTarget, PythonBuiltinClassType type, PException cause, TruffleString format, Object... arguments) { + assert PyExceptionInstanceCheckNode.executeUncached(cause); + executeEnterProfile(inliningTarget); + throw raiseWithCauseStatic(inliningTarget, type, cause, format, arguments); } - @Specialization(guards = {"isNoValue(cause)", "isNoValue(format)", "arguments.length == 0", "exceptionType == cachedType"}, limit = "8") - static PException doPythonBuiltinTypeCached(Node raisingNode, @SuppressWarnings("unused") PythonBuiltinClassType exceptionType, Object[] data, @SuppressWarnings("unused") PNone cause, - @SuppressWarnings("unused") PNone format, - @SuppressWarnings("unused") Object[] arguments, - @Cached("exceptionType") PythonBuiltinClassType cachedType, - @Shared("factory") @Cached PythonObjectFactory factory) { - throw raiseExceptionObject(raisingNode, factory.createBaseException(cachedType, data)); + public static PException raiseWithCauseStatic(Node node, PythonBuiltinClassType type, PException cause, TruffleString format, Object... formatArgs) { + assert PyExceptionInstanceCheckNode.executeUncached(cause); + PythonLanguage language = PythonLanguage.get(node); + PBaseException pythonException = PFactory.createBaseException(language, type, format, formatArgs); + setCause(pythonException, cause); + throw raiseExceptionObject(node, pythonException, language); } - @Specialization(guards = {"isNoValue(cause)", "isNoValue(format)", "arguments.length == 0"}, replaces = "doPythonBuiltinTypeCached") - static PException doPythonBuiltinType(Node raisingNode, PythonBuiltinClassType exceptionType, Object[] data, @SuppressWarnings("unused") PNone cause, - @SuppressWarnings("unused") PNone format, - @SuppressWarnings("unused") Object[] arguments, - @Shared("factory") @Cached PythonObjectFactory factory) { - throw raiseExceptionObject(raisingNode, factory.createBaseException(exceptionType, data)); + public final PException raiseOverflow(Node inliningTarget) { + throw raise(inliningTarget, OverflowError, ErrorMessages.CANNOT_FIT_P_INTO_INDEXSIZED_INT, 0); } - @Specialization(guards = {"isNoValue(cause)", "isNoValue(format)", "arguments.length > 0"}) - static PException doBuiltinType(Node raisingNode, PythonBuiltinClassType type, Object[] data, @SuppressWarnings("unused") PNone cause, @SuppressWarnings("unused") PNone format, - Object[] arguments, - @Shared("factory") @Cached PythonObjectFactory factory, - @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode) { - ensureNoJavaStrings(arguments, fromJavaStringNode); - throw raiseExceptionObject(raisingNode, factory.createBaseException(type, data, factory.createTuple(arguments))); + public static PException raiseSystemExitStatic(Node inliningTarget, Object code) { + throw raiseWithDataStatic(inliningTarget, PythonBuiltinClassType.SystemExit, new Object[]{code}, new Object[]{code}); } - @Specialization(guards = {"isNoValue(cause)"}) - static PException doBuiltinType(Node raisingNode, PythonBuiltinClassType type, Object[] data, @SuppressWarnings("unused") PNone cause, TruffleString format, Object[] arguments, - @Shared("factory") @Cached PythonObjectFactory factory, - @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode) { - assert format != null; - ensureNoJavaStrings(arguments, fromJavaStringNode); - throw raiseExceptionObject(raisingNode, factory.createBaseException(type, data, format, arguments)); + public final PException raiseStopIteration(Node inliningTarget, Object value) { + final Object retVal = value != null ? value : PNone.NONE; + final Object[] args = {retVal}; + throw raiseWithData(inliningTarget, PythonBuiltinClassType.StopIteration, args, retVal); } - @Specialization(guards = {"!isNoValue(cause)"}) - static PException doBuiltinTypeWithCause(Node raisingNode, PythonBuiltinClassType type, Object[] data, PBaseException cause, TruffleString format, Object[] arguments, - @Shared("factory") @Cached PythonObjectFactory factory, - @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode) { - assert format != null; - ensureNoJavaStrings(arguments, fromJavaStringNode); - PBaseException baseException = factory.createBaseException(type, data, format, arguments); - baseException.setContext(cause); - baseException.setCause(cause); - throw raiseExceptionObject(raisingNode, baseException); + public final PException raiseStopAsyncIteration(Node inliningTarget, Object value) { + final Object retVal = value != null ? value : PNone.NONE; + final Object[] args = {retVal}; + throw raiseWithData(inliningTarget, PythonBuiltinClassType.StopAsyncIteration, args, retVal); } - @TruffleBoundary - private static TruffleString getMessage(Exception e) { - String msg = e.getMessage(); - return toTruffleStringUncached(msg != null ? msg : e.getClass().getSimpleName()); + public final PException raiseBadInternalCall(Node inliningTarget) { + throw raise(inliningTarget, PythonBuiltinClassType.SystemError, BAD_ARG_TO_INTERNAL_FUNC); } - @NeverDefault - public static PRaiseNode create() { - return PRaiseNodeGen.create(); + public final PException raiseExceptionObject(Object exc) { + throw raiseExceptionObject(this, exc, PythonOptions.isPExceptionWithJavaStacktrace(PythonLanguage.get(this))); } - public static PRaiseNode getUncached() { - return PRaiseNodeGen.getUncached(); + public static PException raiseExceptionObject(Node raisingNode, Object exc) { + throw raiseExceptionObject(raisingNode, exc, PythonOptions.isPExceptionWithJavaStacktrace(PythonLanguage.get(raisingNode))); } - private static void ensureNoJavaStrings(Object[] arguments, TruffleString.FromJavaStringNode fromJavaStringNode) { - for (int i = 0; i < arguments.length; i++) { - if (arguments[i] instanceof String) { - arguments[i] = fromJavaStringNode.execute((String) arguments[i], TS_ENCODING); - } - } + public static PException raiseExceptionObject(Node raisingNode, Object exc, PythonLanguage language) { + throw raiseExceptionObject(raisingNode, exc, PythonOptions.isPExceptionWithJavaStacktrace(language)); } - @GenerateInline - @GenerateUncached - @GenerateCached(false) - public abstract static class Lazy extends Node { - public static Lazy getUncached() { - return LazyNodeGen.getUncached(); - } - - public final PRaiseNode get(Node inliningTarget) { - return execute(inliningTarget); + public static PException raiseExceptionObject(Node raisingNode, Object exc, boolean withJavaStacktrace) { + if (raisingNode != null && raisingNode.isAdoptable()) { + throw PException.fromObject(exc, raisingNode, withJavaStacktrace); + } else { + throw PException.fromObject(exc, EncapsulatingNodeReference.getCurrent().get(), withJavaStacktrace); } + } - abstract PRaiseNode execute(Node inliningTarget); - - @Specialization - static PRaiseNode doIt(@Cached(inline = false) PRaiseNode node) { - return node; - } + public static PRaiseNode getUncached() { + return PRaiseNodeGen.getUncached(); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PRootNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PRootNode.java index 1f56957fff..46b56a408e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PRootNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PRootNode.java @@ -61,19 +61,19 @@ public abstract class PRootNode extends RootNode { private final ConditionProfile frameEscaped = ConditionProfile.create(); - @CompilationFinal private Assumption dontNeedCallerFrame = createCallerFrameAssumption(); + @CompilationFinal private transient Assumption dontNeedCallerFrame = createCallerFrameAssumption(); /** * Flag indicating if some child node of this root node (or a callee) eventually needs the * exception state. Hence, the caller of this root node should provide the exception state in * the arguments. */ - @CompilationFinal private Assumption dontNeedExceptionState = createExceptionStateAssumption(); + @CompilationFinal private transient Assumption dontNeedExceptionState = createExceptionStateAssumption(); - private int nodeCount = -1; + private transient int nodeCount = -1; // contains the code of this root node in marshaled/serialized form - private byte[] code; + private transient byte[] code; protected PRootNode(TruffleLanguage language) { super(language); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/SpecialAttributeNames.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/SpecialAttributeNames.java index 9b53e57fc4..c3c378ce98 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/SpecialAttributeNames.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/SpecialAttributeNames.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -120,7 +120,7 @@ public abstract class SpecialAttributeNames { public static final TruffleString T___TEXT_SIGNATURE__ = tsLiteral(J___TEXT_SIGNATURE__); public static final String J___SIGNATURE__ = "__signature__"; - public static final TruffleString T__SIGNATURE__ = tsLiteral(J___SIGNATURE__); + public static final TruffleString T___SIGNATURE__ = tsLiteral(J___SIGNATURE__); public static final String J___TRACEBACK__ = "__traceback__"; public static final TruffleString T___TRACEBACK__ = tsLiteral(J___TRACEBACK__); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/SpecialMethodNames.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/SpecialMethodNames.java index 33a6a74639..d56e65a2d5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/SpecialMethodNames.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/SpecialMethodNames.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -462,8 +462,8 @@ public abstract class SpecialMethodNames { public static final TruffleString T_UPDATE = tsLiteral("update"); - public static final String J___TRUFFLE_RICHCOMPARE__ = "__truffle_richcompare__"; - public static final TruffleString T___TRUFFLE_RICHCOMPARE__ = tsLiteral(J___TRUFFLE_RICHCOMPARE__); + public static final String J_TP_RICHCOMPARE = "tp_richcompare"; + public static final TruffleString T_TP_RICHCOMPARE = tsLiteral(J_TP_RICHCOMPARE); public static final String J_TRUFFLE_SOURCE = "__truffle_source__"; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/StringLiterals.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/StringLiterals.java index 3259a130f0..048b9a32ef 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/StringLiterals.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/StringLiterals.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -68,6 +68,7 @@ public abstract class StringLiterals { public static final TruffleString T_QUESTIONMARK = tsLiteral("?"); public static final TruffleString T_COMMA = tsLiteral(","); public static final TruffleString T_COLON = tsLiteral(":"); + public static final TruffleString T_COLON_SPACE = tsLiteral(": "); public static final TruffleString T_COMMA_SPACE = tsLiteral(", "); public static final TruffleString T_LBRACE = tsLiteral("{"); public static final TruffleString T_RBRACE = tsLiteral("}"); @@ -84,6 +85,7 @@ public abstract class StringLiterals { public static final TruffleString T_ELLIPSIS = tsLiteral("..."); public static final TruffleString T_ELLIPSIS_IN_PARENS = tsLiteral("(...)"); public static final TruffleString T_ELLIPSIS_IN_BRACKETS = tsLiteral("[...]"); + public static final TruffleString T_ELLIPSIS_IN_BRACES = tsLiteral("{...}"); public static final TruffleString T_DATE = tsLiteral("date"); public static final TruffleString T_DATETIME = tsLiteral("datetime"); public static final TruffleString T_TIME = tsLiteral("time"); @@ -126,13 +128,12 @@ public abstract class StringLiterals { public static final String J_JAVA = "java"; public static final TruffleString T_JAVA = tsLiteral(J_JAVA); public static final TruffleString T_VALUE_UNKNOWN = tsLiteral(""); + public static final TruffleString T_NO_MESSAGE = tsLiteral(""); public static final String J_PY_EXTENSION = ".py"; public static final TruffleString T_PY_EXTENSION = tsLiteral(J_PY_EXTENSION); public static final TruffleString T_VERSION = tsLiteral("version"); public static final String J_DEFAULT = "default"; public static final TruffleString T_DEFAULT = tsLiteral(J_DEFAULT); - public static final String J_LLVM_LANGUAGE = "llvm"; - public static final TruffleString T_LLVM_LANGUAGE = tsLiteral(J_LLVM_LANGUAGE); public static final String J_NFI_LANGUAGE = "nfi"; public static final TruffleString T_ID = tsLiteral("id"); public static final TruffleString T_SITE = tsLiteral("site"); @@ -144,6 +145,7 @@ public abstract class StringLiterals { public static final TruffleString T_EXEC = tsLiteral("exec"); public static final TruffleString T_EVAL = tsLiteral("eval"); public static final TruffleString T_FUNC_TYPE = tsLiteral("func_type"); + public static final TruffleString T_SUPER = tsLiteral("super"); public static final String J_OB_REFCNT = "ob_refcnt"; public static final String J_DEBUG = "debug"; public static final String J_TRACE = "trace"; @@ -154,4 +156,8 @@ public abstract class StringLiterals { public static final TruffleString T_STAR_KWARGS = tsLiteral("**kwargs"); public static final TruffleString T_ARGS = tsLiteral("args"); public static final TruffleString T_KWARGS = tsLiteral("kwargs"); + public static final TruffleString T_VISIT = tsLiteral("visit"); + public static final TruffleString T_PREFIX = tsLiteral("prefix"); + public static final TruffleString T_BASE_PREFIX = tsLiteral("base_prefix"); + public static final String J_MAX_CAPI_COPIES = "python.MaximumNumberOfCextCopies"; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/WriteUnraisableNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/WriteUnraisableNode.java index 3d87604cbc..e25713eb89 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/WriteUnraisableNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/WriteUnraisableNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,6 +46,7 @@ import java.io.IOException; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.SysModuleBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.exception.ExceptionNodes; @@ -55,7 +56,7 @@ import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Bind; @@ -89,7 +90,7 @@ static void writeUnraisable(VirtualFrame frame, Object exception, TruffleString @Cached PyObjectLookupAttr lookup, @Cached CallNode callNode, @Cached GetClassNode getClassNode, - @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached ExceptionNodes.GetTracebackNode getTracebackNode, @Cached TruffleString.ConcatNode concatNode, @Cached TruffleString.CopyToByteArrayNode copyToByteArrayNode) { @@ -103,7 +104,8 @@ static void writeUnraisable(VirtualFrame frame, Object exception, TruffleString if (message != null) { messageObj = formatMessage(message, concatNode); } - Object hookArguments = factory.createStructSeq(SysModuleBuiltins.UNRAISABLEHOOK_ARGS_DESC, exceptionType, exception, traceback, messageObj, object != null ? object : PNone.NONE); + Object hookArguments = PFactory.createStructSeq(language, SysModuleBuiltins.UNRAISABLEHOOK_ARGS_DESC, exceptionType, exception, traceback, messageObj, + object != null ? object : PNone.NONE); callNode.execute(frame, unraisablehook, hookArguments); } catch (PException e) { ignoreException(context, message, concatNode, copyToByteArrayNode); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/CreateArgumentsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/CreateArgumentsNode.java index 7f033f00a4..f875c307d0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/CreateArgumentsNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/CreateArgumentsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -52,7 +52,6 @@ import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.code.CodeNodes; import com.oracle.graal.python.builtins.objects.code.PCode; import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; @@ -61,28 +60,19 @@ import com.oracle.graal.python.builtins.objects.function.Signature; import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; import com.oracle.graal.python.builtins.objects.method.PMethod; -import com.oracle.graal.python.builtins.objects.method.PMethodBase; import com.oracle.graal.python.builtins.objects.module.PythonModule; -import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.argument.CreateArgumentsNodeGen.ApplyPositionalArgumentsNodeGen; import com.oracle.graal.python.nodes.argument.CreateArgumentsNodeGen.HandleTooManyArgumentsNodeGen; -import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetCallTargetNode; -import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetDefaultsNode; -import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetKeywordDefaultsNode; -import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetSignatureNode; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; @@ -102,288 +92,132 @@ import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.strings.TruffleStringBuilder; -@ImportStatic({PythonOptions.class, PGuards.class}) @GenerateUncached -@GenerateInline(false) // footprint reduction 48 -> 29 +@GenerateInline +@GenerateCached(false) public abstract class CreateArgumentsNode extends PNodeWithContext { - public abstract Object[] execute(PMethodBase callable, Object[] userArguments, PKeyword[] keywords); - - public abstract Object[] execute(PFunction callable, Object[] userArguments, PKeyword[] keywords); - - public abstract Object[] execute(PBuiltinFunction callable, Object[] userArguments, PKeyword[] keywords); - - @Specialization(guards = {"isSingleContext()", "method == cachedMethod"}, limit = "getVariableArgumentInlineCacheLimit()") - static Object[] doMethodCached(@SuppressWarnings("unused") PMethodBase method, Object[] userArguments, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Exclusive @Cached CreateAndCheckArgumentsNode createAndCheckArgumentsNode, - @Cached(value = "method", weak = true) PMethodBase cachedMethod) { - - CompilerAsserts.partialEvaluationConstant(getFunction(cachedMethod)); - // Following getters should fold since getFunction(cachedMethod) is constant - Signature signature = GetSignatureNode.getMethodSignatureSingleContext(cachedMethod, inliningTarget); - Object[] defaults = GetDefaultsNode.getMethodDefaults(cachedMethod); - PKeyword[] kwdefaults = GetKeywordDefaultsNode.getMethodKeywords(cachedMethod); - Object self = cachedMethod.getSelf(); - CompilerAsserts.partialEvaluationConstant(self); - Object classObject = getClassObject(cachedMethod); - CompilerAsserts.partialEvaluationConstant(classObject); - return createAndCheckArgumentsNode.execute(inliningTarget, cachedMethod, userArguments, keywords, signature, self, classObject, defaults, kwdefaults, isMethodCall(self)); - } - - @Specialization(guards = {"isSingleContext()", "getFunction(method) == cachedFunction", - "getSelf(method) == cachedSelf"}, limit = "getVariableArgumentInlineCacheLimit()", replaces = "doMethodCached") - static Object[] doMethodFunctionAndSelfCached(PMethodBase method, Object[] userArguments, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Exclusive @Cached CreateAndCheckArgumentsNode createAndCheckArgumentsNode, - @Cached(value = "getFunction(method)", weak = true) @SuppressWarnings("unused") Object cachedFunction, - @Cached(value = "method.getSelf()", weak = true) Object cachedSelf, - @Cached(value = "getClassObject(method)", weak = true) Object cachedClassObject) { - // Following getters should fold since getFunction(cachedMethod) is constant - Signature signature = GetSignatureNode.getFunctionSignatureSingleContext(inliningTarget, cachedFunction); - Object[] defaults = GetDefaultsNode.getFunctionDefaults(cachedFunction); - PKeyword[] kwdefaults = GetKeywordDefaultsNode.getFunctionKeywords(cachedFunction); - return createAndCheckArgumentsNode.execute(inliningTarget, method, userArguments, keywords, signature, cachedSelf, cachedClassObject, defaults, kwdefaults, isMethodCall(cachedSelf)); - } - - @Specialization(guards = {"isSingleContext()", "getFunction(method) == cachedFunction"}, limit = "getVariableArgumentInlineCacheLimit()", replaces = "doMethodFunctionAndSelfCached") - static Object[] doMethodFunctionCached(PMethodBase method, Object[] userArguments, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Exclusive @Cached CreateAndCheckArgumentsNode createAndCheckArgumentsNode, - @Cached(value = "getFunction(method)", weak = true) @SuppressWarnings("unused") Object cachedFunction) { - // Following getters should fold since getFunction(cachedMethod) is constant - Signature signature = GetSignatureNode.getFunctionSignatureSingleContext(inliningTarget, cachedFunction); - Object[] defaults = GetDefaultsNode.getFunctionDefaults(cachedFunction); - PKeyword[] kwdefaults = GetKeywordDefaultsNode.getFunctionKeywords(cachedFunction); - Object self = method.getSelf(); - Object classObject = getClassObject(method); - return createAndCheckArgumentsNode.execute(inliningTarget, method, userArguments, keywords, signature, self, classObject, defaults, kwdefaults, isMethodCall(self)); - } - - @Specialization(guards = {"isSingleContext()", "callable == cachedCallable"}, limit = "getVariableArgumentInlineCacheLimit()") - static Object[] doFunctionCached(PFunction callable, Object[] userArguments, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Exclusive @Cached CreateAndCheckArgumentsNode createAndCheckArgumentsNode, - @Cached(value = "callable", weak = true) @SuppressWarnings("unused") PFunction cachedCallable) { - Signature signature = CodeNodes.GetCodeSignatureNode.getInSingleContextMode(inliningTarget, cachedCallable); - Object[] defaults = cachedCallable.getDefaults(); - PKeyword[] kwdefaults = cachedCallable.getKwDefaults(); - return createAndCheckArgumentsNode.execute(inliningTarget, callable, userArguments, keywords, signature, null, null, defaults, kwdefaults, false); - } - - @Specialization(guards = {"isSingleContext()", "callable == cachedCallable"}, limit = "getVariableArgumentInlineCacheLimit()") - static Object[] doBuiltinFunctionCached(PBuiltinFunction callable, Object[] userArguments, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Exclusive @Cached CreateAndCheckArgumentsNode createAndCheckArgumentsNode, - @Cached(value = "callable", weak = true) @SuppressWarnings("unused") PBuiltinFunction cachedCallable) { - - Signature signature = cachedCallable.getSignature(); - Object[] defaults = cachedCallable.getDefaults(); - PKeyword[] kwdefaults = cachedCallable.getKwDefaults(); - return createAndCheckArgumentsNode.execute(inliningTarget, callable, userArguments, keywords, signature, null, null, defaults, kwdefaults, false); - } - - @Specialization(guards = {"getCt.execute(callable) == cachedCallTarget", "cachedCallTarget != null"}, limit = "getVariableArgumentInlineCacheLimit()", replaces = {"doMethodFunctionCached", - "doFunctionCached"}) - static Object[] doCallTargetCached(PythonObject callable, Object[] userArguments, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached GetCallTargetNode getCt, - @Exclusive @Cached CreateAndCheckArgumentsNode createAndCheckArgumentsNode, - @Exclusive @SuppressWarnings("unused") @Cached GetSignatureNode getSignatureNode, - // signatures are attached to PRootNodes - @Cached("getSignatureNode.execute(inliningTarget, callable)") Signature signature, - @Cached InlinedConditionProfile gotMethod, - @Exclusive @Cached GetDefaultsNode getDefaultsNode, - @Exclusive @Cached GetKeywordDefaultsNode getKwDefaultsNode, - @Cached("getCt.execute(callable)") @SuppressWarnings("unused") RootCallTarget cachedCallTarget) { - Object[] defaults = getDefaultsNode.execute(inliningTarget, callable); - PKeyword[] kwdefaults = getKwDefaultsNode.execute(inliningTarget, callable); - Object self = null; - Object classObject = null; - if (gotMethod.profile(inliningTarget, PGuards.isMethod(callable))) { - self = getSelf(callable); - classObject = getClassObject(callable); - } - return createAndCheckArgumentsNode.execute(inliningTarget, callable, userArguments, keywords, signature, self, classObject, defaults, kwdefaults, isMethodCall(self)); - } - - @Specialization(replaces = {"doFunctionCached", "doMethodCached", "doMethodFunctionAndSelfCached", "doMethodFunctionCached", "doCallTargetCached"}) - static Object[] uncached(PythonObject callable, Object[] userArguments, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Exclusive @Cached CreateAndCheckArgumentsNode createAndCheckArgumentsNode, - @Exclusive @Cached GetSignatureNode getSignatureNode, - @Exclusive @Cached GetDefaultsNode getDefaultsNode, - @Exclusive @Cached GetKeywordDefaultsNode getKwDefaultsNode) { - - // mostly we will be calling proper functions directly here, - // but sometimes also methods that have functions directly. - // In all other cases, the arguments... TODO: unfinished comment? - Signature signature = getSignatureNode.execute(inliningTarget, callable); - Object[] defaults = getDefaultsNode.execute(inliningTarget, callable); - PKeyword[] kwdefaults = getKwDefaultsNode.execute(inliningTarget, callable); - Object self = getSelf(callable); - Object classObject = getClassObject(callable); - boolean methodcall = !(self instanceof PythonModule); - return createAndCheckArgumentsNode.execute(inliningTarget, callable, userArguments, keywords, signature, self, classObject, defaults, kwdefaults, methodcall); - } - - @GenerateUncached - @GenerateInline - @GenerateCached(false) - public abstract static class CreateAndCheckArgumentsNode extends PNodeWithContext { - /** - * Creates a {@link PArguments} array from the provided arguments and metadata. - * - * @param inliningTarget The inlining target. - * @param callableOrName This object can either be the function/method object or just a name - * ({@link TruffleString)}. It is primarily used to create error messages. It is - * also used to check if the function - * @param userArguments The positional arguments as provided by the caller (must not be - * {@code null} but may be empty). - * @param keywords The keyword arguments as provided by the caller (must not be {@code null} - * but may be empty). - * @param signature The callee's signature (i.e. specifies how the callee needs to be - * invoked). - * @param self The primary (aka. self) object. - * @param classObject The class object (if the invoked method is a class method). - * @param defaults Array of default values for positional arguments. - * @param kwdefaults Array of default values for keyword arguments. - * @param methodcall Indicates if this creates arguments for a method call. This is only - * used for creating better error messages. - * @return A {@link PArguments} array. - */ - public abstract Object[] execute(Node inliningTarget, Object callableOrName, Object[] userArguments, PKeyword[] keywords, Signature signature, Object self, Object classObject, - Object[] defaults, PKeyword[] kwdefaults, boolean methodcall); - - @Specialization - static Object[] doIt(Node inliningTarget, Object callableOrName, Object[] userArguments, PKeyword[] keywords, Signature signature, Object self, Object classObject, Object[] defaults, - PKeyword[] kwdefaults, boolean methodcall, - @Cached InlinedIntValueProfile lenProfile, - @Cached InlinedIntValueProfile maxPosProfile, - @Cached InlinedIntValueProfile numKwdsProfile, - @Cached LazyApplyKeywordsNode applyKeywords, - @Cached LazyHandleTooManyArgumentsNode handleTooManyArgumentsNode, - @Cached ApplyPositionalArguments applyPositional, - @Cached LazyFillDefaultsNode fillDefaultsNode, - @Cached LazyFillKwDefaultsNode fillKwDefaultsNode, - @Cached CheckEnclosingTypeNode checkEnclosingTypeNode) { - int cachedLen = lenProfile.profile(inliningTarget, userArguments.length); - int cachedMaxPos = maxPosProfile.profile(inliningTarget, signature.getMaxNumOfPositionalArgs()); - int cachedNumKwds = numKwdsProfile.profile(inliningTarget, signature.getNumOfRequiredKeywords()); - return createAndCheckArguments(inliningTarget, callableOrName, userArguments, cachedLen, keywords, signature, self, classObject, defaults, kwdefaults, methodcall, - cachedMaxPos, cachedNumKwds, applyPositional, applyKeywords, handleTooManyArgumentsNode, fillDefaultsNode, fillKwDefaultsNode, checkEnclosingTypeNode); - } - - private static Object[] createAndCheckArguments(Node inliningTarget, Object callableOrName, Object[] args_w, int num_args, PKeyword[] keywords, Signature signature, Object self, - Object classObject, - Object[] defaults, PKeyword[] kwdefaults, boolean methodcall, int co_argcount, int co_kwonlyargcount, - ApplyPositionalArguments applyPositional, - LazyApplyKeywordsNode applyKeywords, - LazyHandleTooManyArgumentsNode handleTooMany, - LazyFillDefaultsNode fillDefaults, - LazyFillKwDefaultsNode fillKwDefaults, - CheckEnclosingTypeNode checkEnclosingTypeNode) { - assert args_w.length == num_args; - - // see PyPy's Argument#_match_signature method - // expected formal arguments, without * and ** - boolean too_many_args = false; - - // positional args, kwd only args, varargs, var kwds - Object[] scope_w = PArguments.create(co_argcount + co_kwonlyargcount); - - int upfront = 0; - // put the special w_firstarg into the scope, if it exists - if (self != null) { - upfront++; - if (co_argcount > 0) { - PArguments.setArgument(scope_w, 0, self); - } - if (classObject != null) { - upfront++; - PArguments.setArgument(scope_w, 1, classObject); - } - } - - int avail = num_args + upfront; - - // put as many positional input arguments into place as available - int input_argcount = applyPositional.execute(inliningTarget, args_w, scope_w, upfront, co_argcount, num_args); - - // collect extra positional arguments into the *vararg - if (signature.takesVarArgs()) { - int args_left = co_argcount - upfront; - if (args_left < 0) { - // everything goes to starargs, including any magic self - assert upfront == 1; - Object[] varargs = new Object[num_args + 1]; - varargs[0] = self; - PythonUtils.arraycopy(args_w, 0, varargs, 1, num_args); - PArguments.setVariableArguments(scope_w, varargs); - } else if (num_args > args_left) { - PArguments.setVariableArguments(scope_w, Arrays.copyOfRange(args_w, args_left, args_w.length)); - } else { - // no varargs - } - } else if (avail > co_argcount) { - too_many_args = true; - } - - // handle keyword arguments - // match the keywords given at the call site to the argument names. - // the called node takes and collect the rest in the keywords. - if (keywords.length > 0) { - // the lazy node acts as a profile - applyKeywords(callableOrName, signature, scope_w, keywords, applyKeywords.get(inliningTarget)); + /** + * Creates a {@link PArguments} array from the provided arguments and metadata. + * + * @param inliningTarget The inlining target. + * @param callableOrName This object can either be the function/method object or just a name + * ({@link TruffleString}). It is primarily used to create error messages. It is also + * used to check if the function + * @param userArguments The positional arguments as provided by the caller (must not be + * {@code null} but may be empty). + * @param keywords The keyword arguments as provided by the caller (must not be {@code null} but + * may be empty). + * @param signature The callee's signature (i.e. specifies how the callee needs to be invoked). + * @param self The primary (aka. self) object. + * @param classObject The class object (if the invoked method is a class method). + * @param defaults Array of default values for positional arguments. + * @param kwdefaults Array of default values for keyword arguments. + * @param methodcall Indicates if this creates arguments for a method call. This is only used + * for creating better error messages. + * @return A {@link PArguments} array. + */ + public abstract Object[] execute(Node inliningTarget, Object callableOrName, Object[] userArguments, PKeyword[] keywords, Signature signature, Object self, Object classObject, + Object[] defaults, PKeyword[] kwdefaults, boolean methodcall); + + @Specialization + static Object[] doIt(Node inliningTarget, Object callableOrName, Object[] userArguments, PKeyword[] keywords, Signature signature, Object self, Object classObject, Object[] defaults, + PKeyword[] kwdefaults, boolean methodcall, + @Cached InlinedIntValueProfile lenProfile, + @Cached InlinedIntValueProfile maxPosProfile, + @Cached InlinedIntValueProfile numKwdsProfile, + @Cached LazyApplyKeywordsNode applyKeywords, + @Cached LazyHandleTooManyArgumentsNode handleTooManyArgumentsNode, + @Cached ApplyPositionalArguments applyPositional, + @Cached LazyFillDefaultsNode fillDefaultsNode, + @Cached LazyFillKwDefaultsNode fillKwDefaultsNode, + @Cached CheckEnclosingTypeNode checkEnclosingTypeNode) { + int cachedLen = lenProfile.profile(inliningTarget, userArguments.length); + int cachedMaxPos = maxPosProfile.profile(inliningTarget, signature.getMaxNumOfPositionalArgs()); + int cachedNumKwds = numKwdsProfile.profile(inliningTarget, signature.getNumOfRequiredKeywords()); + assert userArguments.length == cachedLen; + + // see PyPy's Argument#_match_signature method + + // expected formal arguments, without * and ** + boolean too_many_args = false; + + // positional args, kwd only args, varargs, var kwds + Object[] scope_w = PArguments.create(cachedMaxPos + cachedNumKwds); + + int upfront = 0; + // put the special w_firstarg into the scope, if it exists + if (self != null) { + upfront++; + if (cachedMaxPos > 0) { + PArguments.setArgument(scope_w, 0, self); } - - if (too_many_args) { - // the node acts as a profile - throw handleTooManyArguments(scope_w, callableOrName, signature, co_argcount, co_kwonlyargcount, defaults.length, avail, methodcall, handleTooMany.get(inliningTarget), - self instanceof PythonModule ? 1 : 0); + if (classObject != null) { + upfront++; + PArguments.setArgument(scope_w, 1, classObject); } + } - boolean more_filling = input_argcount < co_argcount + co_kwonlyargcount; - if (more_filling) { + int avail = cachedLen + upfront; - // then, fill the normal arguments with defaults_w (if needed) - fillDefaults(callableOrName, signature, scope_w, defaults, input_argcount, co_argcount, fillDefaults.get(inliningTarget)); + // put as many positional input arguments into place as available + int input_argcount = applyPositional.execute(inliningTarget, userArguments, scope_w, upfront, cachedMaxPos, cachedLen); - // finally, fill kwonly arguments with w_kw_defs (if needed) - fillKwDefaults(callableOrName, scope_w, signature, kwdefaults, co_argcount, co_kwonlyargcount, fillKwDefaults.get(inliningTarget)); + // collect extra positional arguments into the *vararg + if (signature.takesVarArgs()) { + int args_left = cachedMaxPos - upfront; + if (args_left < 0) { + // everything goes to starargs, including any magic self + assert upfront == 1; + Object[] varargs = new Object[cachedLen + 1]; + varargs[0] = self; + PythonUtils.arraycopy(userArguments, 0, varargs, 1, cachedLen); + PArguments.setVariableArguments(scope_w, varargs); + } else if (cachedLen > args_left) { + PArguments.setVariableArguments(scope_w, Arrays.copyOfRange(userArguments, args_left, userArguments.length)); + } else { + // no varargs } - - // Now we know that everything is fine, so check compatibility of the enclosing type. - // If we are calling a built-in method, and it's function has an enclosing type, we - // need to check if 'self' is a subtype of the function's enclosing type. - checkEnclosingTypeNode.execute(inliningTarget, signature, callableOrName, scope_w); - - return scope_w; + } else if (avail > cachedMaxPos) { + too_many_args = true; } - private static void applyKeywords(Object callable, Signature signature, Object[] scope_w, PKeyword[] keywords, ApplyKeywordsNode node) { - node.execute(callable, signature, scope_w, keywords); + // handle keyword arguments + // match the keywords given at the call site to the argument names. + // the called node takes and collect the rest in the keywords. + if (keywords.length > 0) { + // the lazy node acts as a profile + applyKeywords.get(inliningTarget).execute(callableOrName, signature, scope_w, keywords); } - private static PException handleTooManyArguments(Object[] scope_w, Object callable, Signature signature, int co_argcount, int co_kwonlyargcount, int ndefaults, int avail, boolean methodcall, - HandleTooManyArgumentsNode node, int adjustCount) { - return node.execute(scope_w, callable, signature, co_argcount, co_kwonlyargcount, ndefaults, avail, methodcall, adjustCount); + if (too_many_args) { + // the node acts as a profile + int adjustCount = self instanceof PythonModule ? 1 : 0; + throw handleTooManyArgumentsNode.get(inliningTarget).execute(scope_w, callableOrName, signature, cachedMaxPos, cachedNumKwds, defaults.length, avail, methodcall, adjustCount); } - private static void fillDefaults(Object callable, Signature signature, Object[] scope_w, Object[] defaults, int input_argcount, int co_argcount, FillDefaultsNode node) { - node.execute(callable, signature, scope_w, defaults, input_argcount, co_argcount); - } + boolean more_filling = input_argcount < cachedMaxPos + cachedNumKwds; + if (more_filling) { - private static void fillKwDefaults(Object callable, Object[] scope_w, Signature signature, PKeyword[] kwdefaults, int co_argcount, int co_kwonlyargcount, FillKwDefaultsNode node) { - node.execute(callable, scope_w, signature, kwdefaults, co_argcount, co_kwonlyargcount); + // then, fill the normal arguments with defaults_w (if needed) + fillDefaultsNode.get(inliningTarget).execute(callableOrName, signature, scope_w, defaults, input_argcount, cachedMaxPos); + + // finally, fill kwonly arguments with w_kw_defs (if needed) + fillKwDefaultsNode.get(inliningTarget).execute(callableOrName, scope_w, signature, kwdefaults, cachedMaxPos, cachedNumKwds); } + // Now we know that everything is fine, so check compatibility of the enclosing type. + // If we are calling a built-in method, and it's function has an enclosing type, we + // need to check if 'self' is a subtype of the function's enclosing type. + checkEnclosingTypeNode.execute(inliningTarget, signature, callableOrName, scope_w); + + return scope_w; } @GenerateInline @GenerateCached(false) @GenerateUncached - public abstract static class LazyHandleTooManyArgumentsNode extends Node { + abstract static class LazyHandleTooManyArgumentsNode extends Node { public final HandleTooManyArgumentsNode get(Node inliningTarget) { return execute(inliningTarget); } @@ -407,6 +241,7 @@ public abstract PException execute(Object[] scope_w, Object callable, Signature @ExplodeLoop static PException doCached(Object[] scope_w, Object callable, Signature signature, int co_argcount, @SuppressWarnings("unused") int co_kwonlyargcount, int ndefaults, int avail, boolean methodcall, int adjustCount, + @Bind("this") Node inliningTarget, @Shared @Cached PRaiseNode raise, @Shared @Cached TruffleString.EqualNode equalNode, @Cached("co_kwonlyargcount") int cachedKwOnlyArgCount) { @@ -417,12 +252,13 @@ static PException doCached(Object[] scope_w, Object callable, Signature signatur } } boolean forgotSelf = methodcall && avail + 1 == co_argcount && (signature.getParameterIds().length == 0 || !equalNode.execute(signature.getParameterIds()[0], T_SELF, TS_ENCODING)); - TruffleString name = signature.getRaiseErrorName().isEmpty() ? getName(callable) : signature.getRaiseErrorName(); - throw raiseTooManyArguments(name, co_argcount - adjustCount, ndefaults, avail - adjustCount, forgotSelf, kwonly_given, raise); + TruffleString name = getName(callable, signature); + throw raiseTooManyArguments(inliningTarget, name, co_argcount - adjustCount, ndefaults, avail - adjustCount, forgotSelf, kwonly_given, raise); } @Specialization(replaces = "doCached") static PException doUncached(Object[] scope_w, Object callable, Signature signature, int co_argcount, int co_kwonlyargcount, int ndefaults, int avail, boolean methodcall, int adjustCount, + @Bind("this") Node inliningTarget, @Shared @Cached PRaiseNode raise, @Shared @Cached TruffleString.EqualNode equalNode) { int kwonly_given = 0; @@ -432,15 +268,15 @@ static PException doUncached(Object[] scope_w, Object callable, Signature signat } } boolean forgotSelf = methodcall && avail + 1 == co_argcount && (signature.getParameterIds().length == 0 || !equalNode.execute(signature.getParameterIds()[0], T_SELF, TS_ENCODING)); - TruffleString name = signature.getRaiseErrorName().isEmpty() ? getName(callable) : signature.getRaiseErrorName(); - throw raiseTooManyArguments(name, co_argcount - adjustCount, ndefaults, avail - adjustCount, forgotSelf, kwonly_given, raise); + TruffleString name = getName(callable, signature); + throw raiseTooManyArguments(inliningTarget, name, co_argcount - adjustCount, ndefaults, avail - adjustCount, forgotSelf, kwonly_given, raise); } - private static PException raiseTooManyArguments(TruffleString name, int co_argcount, int ndefaults, int avail, boolean forgotSelf, int kwonly_given, PRaiseNode raise) { + private static PException raiseTooManyArguments(Node inliningTarget, TruffleString name, int co_argcount, int ndefaults, int avail, boolean forgotSelf, int kwonly_given, PRaiseNode raise) { String forgotSelfMsg = forgotSelf ? ". Did you forget 'self' in the function definition?" : ""; if (ndefaults > 0) { if (kwonly_given == 0) { - throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.TAKES_FROM_D_TO_D_POS_ARG_S_BUT_D_S_GIVEN_S, + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.TAKES_FROM_D_TO_D_POS_ARG_S_BUT_D_S_GIVEN_S, name, co_argcount - ndefaults, co_argcount, @@ -449,7 +285,7 @@ private static PException raiseTooManyArguments(TruffleString name, int co_argco avail == 1 ? "was" : "were", forgotSelfMsg); } else { - throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.TAKES_FROM_D_TO_D_POS_ARG_S_BUT_D_POS_ARG_S, + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.TAKES_FROM_D_TO_D_POS_ARG_S_BUT_D_POS_ARG_S, name, co_argcount - ndefaults, co_argcount, @@ -462,7 +298,7 @@ private static PException raiseTooManyArguments(TruffleString name, int co_argco } } else { if (kwonly_given == 0) { - throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.TAKES_D_POS_ARG_S_BUT_GIVEN_S, + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.TAKES_D_POS_ARG_S_BUT_GIVEN_S, name, co_argcount - ndefaults, co_argcount == 1 ? "" : "s", @@ -470,7 +306,7 @@ private static PException raiseTooManyArguments(TruffleString name, int co_argco avail == 1 ? "was" : "were", forgotSelfMsg); } else { - throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.TAKES_D_POS_ARG_S_BUT_D_POS_ARG_S, + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.TAKES_D_POS_ARG_S_BUT_D_POS_ARG_S, name, co_argcount, co_argcount == 1 ? "" : "s", @@ -501,10 +337,10 @@ static void doEnclosingTypeCheck(Node inliningTarget, @SuppressWarnings("unused" @Bind("getSelf(scope_w)") Object self, @Cached GetClassNode getClassNode, @Cached(inline = false) IsSubtypeNode isSubtypeMRONode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (!isSubtypeMRONode.execute(getClassNode.execute(inliningTarget, self), callable.getEnclosingType())) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.DESCR_S_FOR_P_OBJ_DOESNT_APPLY_TO_P, + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.DESCR_S_FOR_P_OBJ_DOESNT_APPLY_TO_P, callable.getName(), callable.getEnclosingType(), self); } } @@ -532,7 +368,7 @@ protected abstract static class ApplyPositionalArguments extends Node { public abstract int execute(Node inliningTarget, Object[] args_w, Object[] scope_w, int upfront, int co_argcount, int num_args); @Specialization(guards = "upfront < co_argcount") - int doIt(Object[] args_w, Object[] scope_w, int upfront, int co_argcount, int num_args) { + static int doIt(Object[] args_w, Object[] scope_w, int upfront, int co_argcount, int num_args) { int take = Math.min(num_args, co_argcount - upfront); PythonUtils.arraycopy(args_w, 0, scope_w, PArguments.USER_ARGUMENTS_OFFSET + upfront, take); return upfront + take; @@ -540,7 +376,7 @@ int doIt(Object[] args_w, Object[] scope_w, int upfront, int co_argcount, int nu @Specialization(guards = "upfront >= co_argcount") @SuppressWarnings("unused") - int doNothing(Object[] args_w, Object[] scope_w, int upfront, int co_argcount, int num_args) { + static int doNothing(Object[] args_w, Object[] scope_w, int upfront, int co_argcount, int num_args) { return 0; } @@ -552,7 +388,7 @@ protected static ApplyPositionalArguments getUncached() { @GenerateCached(false) @GenerateInline @GenerateUncached - public abstract static class LazyApplyKeywordsNode extends Node { + abstract static class LazyApplyKeywordsNode extends Node { public final ApplyKeywordsNode get(Node inliningTarget) { return execute(inliningTarget); } @@ -560,7 +396,7 @@ public final ApplyKeywordsNode get(Node inliningTarget) { public abstract ApplyKeywordsNode execute(Node inliningTarget); @Specialization - ApplyKeywordsNode doIt(@Cached(inline = false) ApplyKeywordsNode applyKeywordsNode) { + static ApplyKeywordsNode doIt(@Cached(inline = false) ApplyKeywordsNode applyKeywordsNode) { return applyKeywordsNode; } } @@ -623,7 +459,7 @@ static Object[] applyCached(Object callee, @SuppressWarnings("unused") Signature } } else { if (PArguments.getArgument(arguments, kwIdx) != null) { - throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.S_PAREN_GOT_MULTIPLE_VALUES_FOR_KEYWORD_ARG, CreateArgumentsNode.getName(callee), name); + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.S_PAREN_GOT_MULTIPLE_VALUES_FOR_ARG, getName(callee, cachedSignature), name); } PArguments.setArgument(arguments, kwIdx, kwArg.getValue()); } @@ -634,7 +470,8 @@ static Object[] applyCached(Object callee, @SuppressWarnings("unused") Signature lastWrongKeyword = name; } } - storeKeywordsOrRaise(callee, arguments, unusedKeywords, k, additionalKwds, lastWrongKeyword, posArgOnlyPassedAsKeywordNames, inliningTarget, posArgOnlyPassedAsKeywordProfile, raise); + storeKeywordsOrRaise(callee, arguments, unusedKeywords, k, additionalKwds, lastWrongKeyword, posArgOnlyPassedAsKeywordNames, inliningTarget, posArgOnlyPassedAsKeywordProfile, raise, + cachedSignature); return arguments; } @@ -679,7 +516,7 @@ static Object[] applyUncached(Object callee, Signature calleeSignature, Object[] } } else { if (PArguments.getArgument(arguments, kwIdx) != null) { - throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.S_PAREN_GOT_MULTIPLE_VALUES_FOR_KEYWORD_ARG, CreateArgumentsNode.getName(callee), name); + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.S_PAREN_GOT_MULTIPLE_VALUES_FOR_ARG, getName(callee, calleeSignature), name); } PArguments.setArgument(arguments, kwIdx, kwArg.getValue()); } @@ -691,7 +528,7 @@ static Object[] applyUncached(Object callee, Signature calleeSignature, Object[] } } storeKeywordsOrRaise(callee, arguments, unusedKeywords, k, additionalKwds, lastWrongKeyword, - posArgOnlyPassedAsKeywordNames, inliningTarget, posArgOnlyPassedAsKeywordProfile, raise); + posArgOnlyPassedAsKeywordNames, inliningTarget, posArgOnlyPassedAsKeywordProfile, raise, calleeSignature); return arguments; } @@ -707,15 +544,15 @@ private static List addPosArgOnlyPassedAsKeyword(List posArgOnlyPassedAsKeywordNames, Node inliningTarget, InlinedBranchProfile posArgOnlyPassedAsKeywordProfile, PRaiseNode raise) { + List posArgOnlyPassedAsKeywordNames, Node inliningTarget, InlinedBranchProfile posArgOnlyPassedAsKeywordProfile, PRaiseNode raise, Signature signature) { if (tooManyKeywords == 1) { - throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.GOT_UNEXPECTED_KEYWORD_ARG, CreateArgumentsNode.getName(callee), lastWrongKeyword); + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.GOT_UNEXPECTED_KEYWORD_ARG, getName(callee, signature), lastWrongKeyword); } else if (tooManyKeywords > 1) { - throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.GOT_UNEXPECTED_KEYWORD_ARG, CreateArgumentsNode.getName(callee), tooManyKeywords); + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.GOT_UNEXPECTED_KEYWORD_ARG, getName(callee, signature), tooManyKeywords); } else if (posArgOnlyPassedAsKeywordNames != null) { posArgOnlyPassedAsKeywordProfile.enter(inliningTarget); TruffleString names = joinUncached(T_COMMA_SPACE, posArgOnlyPassedAsKeywordNames); - throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.GOT_SOME_POS_ONLY_ARGS_PASSED_AS_KEYWORD, CreateArgumentsNode.getName(callee), names); + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.GOT_SOME_POS_ONLY_ARGS_PASSED_AS_KEYWORD, getName(callee, signature), names); } else if (unusedKeywords != null) { PArguments.setKeywordArguments(arguments, Arrays.copyOf(unusedKeywords, unusedKeywordCount)); } @@ -771,9 +608,9 @@ static int uncached(TruffleString[] parameters, TruffleString name, protected abstract static class FillBaseNode extends PNodeWithContext { - protected static PException raiseMissing(Object callable, TruffleString[] missingNames, int missingCnt, TruffleString type, PRaiseNode raise) { - throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.MISSING_D_REQUIRED_S_ARGUMENT_S_S, - getName(callable), + protected static PException raiseMissing(Node inliningTarget, Object callable, TruffleString[] missingNames, int missingCnt, TruffleString type, PRaiseNode raise, Signature signature) { + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.MISSING_D_REQUIRED_S_ARGUMENT_S_S, + getName(callable, signature), missingCnt, type, missingCnt == 1 ? "" : "s", @@ -849,7 +686,7 @@ static void doCached(Object callable, Signature signature, Object[] scope_w, Obj } } if (missingProfile.profile(inliningTarget, missingCnt > 0)) { - throw raiseMissing(callable, missingNames, missingCnt, toTruffleStringUncached("positional"), raise); + throw raiseMissing(inliningTarget, callable, missingNames, missingCnt, toTruffleStringUncached("positional"), raise, signature); } } @@ -873,7 +710,7 @@ static void doUncached(Object callable, Signature signature, Object[] scope_w, O } } if (missingProfile.profile(inliningTarget, missingCnt > 0)) { - throw raiseMissing(callable, missingNames, missingCnt, toTruffleStringUncached("positional"), raise); + throw raiseMissing(inliningTarget, callable, missingNames, missingCnt, toTruffleStringUncached("positional"), raise, signature); } } } @@ -904,7 +741,7 @@ protected abstract static class FillKwDefaultsNode extends FillBaseNode { static void doCached(Object callable, Object[] scope_w, Signature signature, PKeyword[] kwdefaults, @SuppressWarnings("unused") int co_argcount, @SuppressWarnings("unused") int co_kwonlyargcount, @Bind("this") Node inliningTarget, - @Exclusive @Cached PRaiseNode.Lazy raise, + @Exclusive @Cached PRaiseNode raise, @Exclusive @Cached FindKwDefaultNode findKwDefaultNode, @Cached("co_argcount") int cachedArgcount, @Cached("co_kwonlyargcount") int cachedKwOnlyArgcount, @@ -925,14 +762,14 @@ static void doCached(Object callable, Object[] scope_w, Signature signature, PKe } } if (missingProfile.profile(inliningTarget, missingCnt > 0)) { - throw raiseMissing(callable, missingNames, missingCnt, toTruffleStringUncached("keyword-only"), raise.get(inliningTarget)); + throw raiseMissing(inliningTarget, callable, missingNames, missingCnt, toTruffleStringUncached("keyword-only"), raise, signature); } } @Specialization(replaces = "doCached") static void doUncached(Object callable, Object[] scope_w, Signature signature, PKeyword[] kwdefaults, int co_argcount, int co_kwonlyargcount, @Bind("this") Node inliningTarget, - @Exclusive @Cached PRaiseNode.Lazy raise, + @Exclusive @Cached PRaiseNode raise, @Exclusive @Cached FindKwDefaultNode findKwDefaultNode, @Exclusive @Cached InlinedConditionProfile missingProfile) { TruffleString[] missingNames = new TruffleString[co_kwonlyargcount]; @@ -951,12 +788,14 @@ static void doUncached(Object callable, Object[] scope_w, Signature signature, P } } if (missingProfile.profile(inliningTarget, missingCnt > 0)) { - throw raiseMissing(callable, missingNames, missingCnt, toTruffleStringUncached("keyword-only"), raise.get(inliningTarget)); + throw raiseMissing(inliningTarget, callable, missingNames, missingCnt, toTruffleStringUncached("keyword-only"), raise, signature); } } } - /** finds a keyword-default value by a given name */ + /** + * finds a keyword-default value by a given name + */ @GenerateUncached @GenerateInline @GenerateCached(false) @@ -1012,19 +851,10 @@ static PKeyword doUncached(PKeyword[] kwdefaults, TruffleString kwname, } } - protected static Signature getSignatureUncached(Object callable) { - return getProperty(callable, UncachedSignatureGetter.INSTANCE); - } - - protected static Object[] getDefaultsUncached(Object callable) { - return getProperty(callable, UncachedDefaultsGetter.INSTANCE); - } - - protected static PKeyword[] getKwDefaultsUncached(Object callable) { - return getProperty(callable, UncachedKwDefaultsGetter.INSTANCE); - } - - protected static TruffleString getName(Object callable) { + protected static TruffleString getName(Object callable, Signature signature) { + if (!signature.getRaiseErrorName().isEmpty()) { + return signature.getRaiseErrorName(); + } if (callable instanceof TruffleString ts) { return ts; } @@ -1059,10 +889,6 @@ protected static Object getFunction(Object callable) { return null; } - protected static boolean isMethodCall(Object self) { - return !(self instanceof PythonModule); - } - private static T getProperty(Object callable, Getter getter) { if (callable instanceof PFunction) { return getter.fromPFunction((PFunction) callable); @@ -1089,48 +915,6 @@ private abstract static class Getter { public abstract T fromPBuiltinFunction(PBuiltinFunction fun); } - private static final class UncachedSignatureGetter extends Getter { - private static final UncachedSignatureGetter INSTANCE = new UncachedSignatureGetter(); - - @Override - public Signature fromPFunction(PFunction fun) { - return GetSignatureNode.executeUncached(fun); - } - - @Override - public Signature fromPBuiltinFunction(PBuiltinFunction fun) { - return fun.getSignature(); - } - } - - private static final class UncachedDefaultsGetter extends Getter { - private static final UncachedDefaultsGetter INSTANCE = new UncachedDefaultsGetter(); - - @Override - public Object[] fromPFunction(PFunction fun) { - return fun.getDefaults(); - } - - @Override - public Object[] fromPBuiltinFunction(PBuiltinFunction fun) { - return fun.getDefaults(); - } - } - - private static final class UncachedKwDefaultsGetter extends Getter { - private static final UncachedKwDefaultsGetter INSTANCE = new UncachedKwDefaultsGetter(); - - @Override - public PKeyword[] fromPFunction(PFunction fun) { - return fun.getKwDefaults(); - } - - @Override - public PKeyword[] fromPBuiltinFunction(PBuiltinFunction fun) { - return fun.getKwDefaults(); - } - } - private static final class QualnameGetter extends Getter { private static final QualnameGetter INSTANCE = new QualnameGetter(); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/ReadVarArgsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/ReadVarArgsNode.java index 716e488391..10f3ad8cc6 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/ReadVarArgsNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/ReadVarArgsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -25,16 +25,17 @@ */ package com.oracle.graal.python.nodes.argument; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.function.PArguments; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; public abstract class ReadVarArgsNode extends ReadArgumentNode { - @Child private PythonObjectFactory factory; + private final boolean isBuiltin; ReadVarArgsNode(boolean isBuiltin) { - factory = isBuiltin ? null : PythonObjectFactory.create(); + this.isBuiltin = isBuiltin; } public static ReadVarArgsNode create() { @@ -56,11 +57,11 @@ private Object output(Object[] varArgs) { if (isBuiltin()) { return varArgs; } else { - return factory.createTuple(varArgs); + return PFactory.createTuple(PythonLanguage.get(this), varArgs); } } public boolean isBuiltin() { - return factory == null; + return isBuiltin; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/ReadVarKeywordsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/ReadVarKeywordsNode.java index e09a866e44..8f6a0f059b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/ReadVarKeywordsNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/ReadVarKeywordsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -33,7 +33,7 @@ import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; @@ -47,7 +47,7 @@ public abstract class ReadVarKeywordsNode extends ReadArgumentNode { @CompilationFinal(dimensions = 1) private final TruffleString[] keywordNames; - @Child private PythonObjectFactory factory; + private final boolean doWrap; public abstract PKeyword[] executePKeyword(VirtualFrame frame); @@ -65,7 +65,7 @@ public static ReadVarKeywordsNode createForUserFunction(TruffleString[] names) { ReadVarKeywordsNode(TruffleString[] keywordNames, boolean doWrap) { this.keywordNames = keywordNames; - this.factory = doWrap ? PythonObjectFactory.create() : null; + this.doWrap = doWrap; } protected int getLimit() { @@ -86,8 +86,8 @@ protected static int getKwargLen(VirtualFrame frame) { } private Object returnValue(PKeyword[] keywords) { - if (factory != null) { - return factory.createDict(keywords); + if (doWrap) { + return PFactory.createDict(PythonLanguage.get(this), keywords); } else { return keywords; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/keywords/ConcatDictToStorageNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/keywords/ConcatDictToStorageNode.java index 6fa89a74ea..e51aa1bcef 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/keywords/ConcatDictToStorageNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/keywords/ConcatDictToStorageNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -49,12 +49,12 @@ import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.str.StringNodes; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.lib.PyObjectGetItem; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; import com.oracle.graal.python.nodes.builtins.ListNodes; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; @@ -64,6 +64,7 @@ import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; +import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.Specialization; @@ -78,20 +79,20 @@ public abstract class ConcatDictToStorageNode extends PNodeWithContext { public abstract HashingStorage execute(VirtualFrame frame, HashingStorage dest, Object other) throws SameDictKeyException, NonMappingException; - @Specialization(guards = "hasBuiltinDictIter(inliningTarget, other, getClassNode, lookupIter)", limit = "1") + @Specialization(guards = "hasBuiltinDictIter(inliningTarget, other, getClassNode, getSlots)", limit = "1") static HashingStorage doBuiltinDictEmptyDest(@SuppressWarnings("unused") EmptyStorage dest, PDict other, @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Exclusive @Cached GetPythonObjectClassNode getClassNode, - @SuppressWarnings("unused") @Cached.Shared("lookupIter") @Cached(parameters = "Iter") LookupCallableSlotInMRONode lookupIter, + @SuppressWarnings("unused") @Shared @Cached GetCachedTpSlotsNode getSlots, @Cached HashingStorageNodes.HashingStorageCopy copyNode) { return copyNode.execute(inliningTarget, other.getDictStorage()); } - @Specialization(guards = "hasBuiltinDictIter(inliningTarget, other, getClassNode, lookupIter)", limit = "1") + @Specialization(guards = "hasBuiltinDictIter(inliningTarget, other, getClassNode, getSlots)", limit = "1") static HashingStorage doBuiltinDict(VirtualFrame frame, HashingStorage dest, PDict other, @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Exclusive @Cached GetPythonObjectClassNode getClassNode, - @SuppressWarnings("unused") @Cached.Shared("lookupIter") @Cached(parameters = "Iter") LookupCallableSlotInMRONode lookupIter, + @SuppressWarnings("unused") @Shared @Cached GetCachedTpSlotsNode getSlots, @Exclusive @Cached HashingStorageNodes.HashingStorageGetItem resultGetItem, @Exclusive @Cached HashingStorageNodes.HashingStorageSetItem resultSetItem, @Cached HashingStorageNodes.HashingStorageGetIterator getIterator, @@ -118,15 +119,15 @@ static HashingStorage doBuiltinDict(VirtualFrame frame, HashingStorage dest, PDi } // Not using @Fallback because of GR-43912 - static boolean isFallback(Node inliningTarget, Object other, GetPythonObjectClassNode getClassNode, LookupCallableSlotInMRONode lookupIter) { - return !(other instanceof PDict otherDict && PGuards.hasBuiltinDictIter(inliningTarget, otherDict, getClassNode, lookupIter)); + static boolean isFallback(Node inliningTarget, Object other, GetPythonObjectClassNode getClassNode, GetCachedTpSlotsNode getSlots) { + return !(other instanceof PDict otherDict && PGuards.hasBuiltinDictIter(inliningTarget, otherDict, getClassNode, getSlots)); } - @Specialization(guards = "isFallback(inliningTarget, other, getClassNode, lookupIter)", limit = "1") + @Specialization(guards = "isFallback(inliningTarget, other, getClassNode, getSlots)", limit = "1") static HashingStorage doMapping(VirtualFrame frame, HashingStorage dest, Object other, @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Exclusive @Cached GetPythonObjectClassNode getClassNode, - @SuppressWarnings("unused") @Cached.Shared("lookupIter") @Cached(parameters = "Iter") LookupCallableSlotInMRONode lookupIter, + @SuppressWarnings("unused") @Shared @Cached GetCachedTpSlotsNode getSlots, @Exclusive @Cached InlinedBranchProfile sameKeyProfile, @Exclusive @Cached StringNodes.CastToTruffleStringCheckedNode castToStringNode, @Cached PyObjectCallMethodObjArgs callKeys, diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/keywords/ExpandKeywordStarargsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/keywords/ExpandKeywordStarargsNode.java index 4e62c70612..76e6d8b836 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/keywords/ExpandKeywordStarargsNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/keywords/ExpandKeywordStarargsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -75,13 +75,13 @@ static PKeyword[] convert(@SuppressWarnings("unused") Object starargs) { @Specialization(guards = "!isNoValue(starargs)") static PKeyword[] convert(VirtualFrame frame, Node inliningTarget, Object starargs, @Cached MappingToKeywordsNode convertNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { return convertNode.execute(frame, inliningTarget, starargs); } catch (SameDictKeyException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.GOT_MULTIPLE_VALUES_FOR_KEYWORD_ARG, e.getKey()); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.GOT_MULTIPLE_VALUES_FOR_KEYWORD_ARG, e.getKey()); } catch (NonMappingException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.OBJ_ISNT_MAPPING, starargs); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.OBJ_ISNT_MAPPING, starargs); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/keywords/MappingToKeywordsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/keywords/MappingToKeywordsNode.java index 4e4d461b31..8075f04481 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/keywords/MappingToKeywordsNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/keywords/MappingToKeywordsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -50,10 +50,10 @@ import com.oracle.graal.python.builtins.objects.common.KeywordsStorage; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.function.PKeyword; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; @@ -81,10 +81,10 @@ public abstract class MappingToKeywordsNode extends PNodeWithContext { public abstract PKeyword[] execute(VirtualFrame frame, Node inliningTarget, Object starargs) throws SameDictKeyException, NonMappingException; - @Specialization(guards = "hasBuiltinDictIter(inliningTarget, starargs, getClassNode, lookupIter)", limit = "1") + @Specialization(guards = "hasBuiltinDictIter(inliningTarget, starargs, getClassNode, getSlots)", limit = "1") public static PKeyword[] doDict(VirtualFrame frame, Node inliningTarget, PDict starargs, @SuppressWarnings("unused") @Cached GetPythonObjectClassNode getClassNode, - @SuppressWarnings("unused") @Cached(parameters = "Iter", inline = false) LookupCallableSlotInMRONode lookupIter, + @SuppressWarnings("unused") @Cached GetCachedTpSlotsNode getSlots, @Exclusive @Cached HashingStorageToKeywords convert) { return convert.execute(frame, inliningTarget, starargs.getDictStorage()); } @@ -102,10 +102,10 @@ public static PKeyword[] doMapping(VirtualFrame frame, Node inliningTarget, Obje @GenerateInline(false) // footprint reduction 44 to 26 abstract static class AddKeywordNode extends HashingStorageNodes.HashingStorageForEachCallback { @Override - public abstract CopyKeywordsState execute(Frame frame, Node Node, HashingStorage storage, HashingStorageIterator it, CopyKeywordsState accumulator); + public abstract CopyKeywordsState execute(Frame frame, Node node, HashingStorage storage, HashingStorageIterator it, CopyKeywordsState accumulator); @Specialization - public CopyKeywordsState add(@SuppressWarnings("unused") Node Node, HashingStorage storage, HashingStorageNodes.HashingStorageIterator it, CopyKeywordsState state, + public CopyKeywordsState add(Frame frame, @SuppressWarnings("unused") Node node, HashingStorage storage, HashingStorageNodes.HashingStorageIterator it, CopyKeywordsState state, @Bind("this") Node inliningTarget, @Cached PRaiseNode raiseNode, @Cached CastToTruffleStringNode castToTruffleStringNode, @@ -113,12 +113,12 @@ public CopyKeywordsState add(@SuppressWarnings("unused") Node Node, HashingStora @Cached HashingStorageNodes.HashingStorageIteratorKeyHash itKeyHash, @Cached HashingStorageNodes.HashingStorageGetItemWithHash getItem) { Object key = itKey.execute(inliningTarget, storage, it); - long hash = itKeyHash.execute(inliningTarget, storage, it); + long hash = itKeyHash.execute(frame, inliningTarget, storage, it); Object value = getItem.execute(null, inliningTarget, storage, key, hash); try { state.addKeyword(castToTruffleStringNode.execute(inliningTarget, key), value); } catch (CannotCastException e) { - throw raiseNode.raise(TypeError, ErrorMessages.KEYWORDS_S_MUST_BE_STRINGS); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.KEYWORDS_S_MUST_BE_STRINGS); } return state; } @@ -157,7 +157,6 @@ static PKeyword[] doEmptyStorage(@SuppressWarnings("unused") EmptyStorage storag @Specialization(guards = {"!isKeywordsStorage(storage)", "!isEmptyStorage(storage)"}) static PKeyword[] doCached(VirtualFrame frame, Node inliningTarget, HashingStorage storage, - @SuppressWarnings("unused") @Cached(parameters = "Iter", inline = false) LookupCallableSlotInMRONode lookupIter, @Cached(inline = false) AddKeywordNode addKeywordNode, @Cached HashingStorageNodes.HashingStorageForEach forEachNode, @SuppressWarnings("unused") @Cached HashingStorageLen lenNode, diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/positional/ExecutePositionalStarargsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/positional/ExecutePositionalStarargsNode.java index c9b2e9118e..3d7171a0e0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/positional/ExecutePositionalStarargsNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/positional/ExecutePositionalStarargsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -52,13 +52,12 @@ import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.set.PSet; import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonErrorType; import com.oracle.graal.python.util.ArrayBuilder; import com.oracle.truffle.api.dsl.Bind; @@ -118,30 +117,29 @@ static Object[] doSet(PSet starargs, @Specialization static Object[] doNone(PNone none, - @Shared("raise") @Cached PRaiseNode raise) { - throw raise.raise(PythonErrorType.TypeError, ErrorMessages.ARG_AFTER_MUST_BE_ITERABLE, none); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.TypeError, ErrorMessages.ARG_AFTER_MUST_BE_ITERABLE, none); } @Specialization static Object[] starargs(VirtualFrame frame, Object object, @Bind("this") Node inliningTarget, - @Shared("raise") @Cached PRaiseNode raise, + @Cached PRaiseNode raise, @Cached PyObjectGetIter getIter, - @Cached GetNextNode nextNode, - @Cached IsBuiltinObjectProfile errorProfile) { + @Cached PyIterNextNode nextNode) { Object iterator = getIter.execute(frame, inliningTarget, object); if (iterator != PNone.NO_VALUE && iterator != PNone.NONE) { ArrayBuilder internalStorage = new ArrayBuilder<>(); while (true) { try { - internalStorage.add(nextNode.execute(frame, iterator)); - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); + Object next = nextNode.execute(frame, inliningTarget, iterator); + internalStorage.add(next); + } catch (IteratorExhausted e) { return internalStorage.toArray(new Object[0]); } } } - throw raise.raise(PythonErrorType.TypeError, ErrorMessages.ARG_AFTER_MUST_BE_ITERABLE, object); + throw raise.raise(inliningTarget, PythonErrorType.TypeError, ErrorMessages.ARG_AFTER_MUST_BE_ITERABLE, object); } @NeverDefault diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/arrow/ArrowArray.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/arrow/ArrowArray.java new file mode 100644 index 0000000000..5d2b56f03f --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/arrow/ArrowArray.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.arrow; + +import com.oracle.graal.python.builtins.objects.capsule.PyCapsule; +import com.oracle.graal.python.util.PythonUtils; +import sun.misc.Unsafe; + +import static com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess.POINTER_SIZE; + +/** + * C Data Interface ArrowArray. + *

        + * Represents a wrapper for the following C structure: + * + *

        + * struct ArrowArray {
        + *     // Array data description
        + *     int64_t length;                          0
        + *     int64_t null_count;                      8
        + *     int64_t offset;                          16
        + *     int64_t n_buffers;                       24
        + *     int64_t n_children;                      32
        + *     const void** buffers;                    40
        + *     struct ArrowArray** children;            48
        + *     struct ArrowArray* dictionary;           56
        + *
        + *     // Release callback
        + *     void (*release)(struct ArrowArray*);     64
        + *     // Opaque producer-specific data
        + *     void* private_data;                      72
        + * };
        + * 
        + */ +public class ArrowArray { + + private static final Unsafe unsafe = PythonUtils.initUnsafe(); + public static final byte[] CAPSULE_NAME = PyCapsule.capsuleName("arrow_array"); + + public static final byte NULL = 0; + private static final byte SIZE_OF = 80; + + private static final long LENGTH_INDEX = 0; + private static final long NULL_COUNT_INDEX = POINTER_SIZE; + private static final long OFFSET_INDEX = 2 * POINTER_SIZE; + private static final long N_BUFFERS_INDEX = 3 * POINTER_SIZE; + private static final long N_CHILDREN_INDEX = 4 * POINTER_SIZE; + private static final long BUFFERS_INDEX = 5 * POINTER_SIZE; + private static final long CHILDREN_INDEX = 6 * POINTER_SIZE; + private static final long DICTIONARY_INDEX = 7 * POINTER_SIZE; + private static final long RELEASE_CALLBACK_INDEX = 8 * POINTER_SIZE; + private static final long PRIVATE_DATA_INDEX = 9 * POINTER_SIZE; + + private final long memoryAddr; + + private ArrowArray(long memoryAddr) { + this.memoryAddr = memoryAddr; + } + + public static ArrowArray allocate(long length, long nullCount, long offset, long nBuffers, long nChildren, long buffers, long children, long dictionary, long release, long privateData) { + var memoryAddr = unsafe.allocateMemory(SIZE_OF); + unsafe.putLong(memoryAddr + LENGTH_INDEX, length); + unsafe.putLong(memoryAddr + NULL_COUNT_INDEX, nullCount); + unsafe.putLong(memoryAddr + OFFSET_INDEX, offset); + unsafe.putLong(memoryAddr + N_BUFFERS_INDEX, nBuffers); + unsafe.putLong(memoryAddr + N_CHILDREN_INDEX, nChildren); + unsafe.putLong(memoryAddr + BUFFERS_INDEX, buffers); + unsafe.putLong(memoryAddr + CHILDREN_INDEX, children); + unsafe.putLong(memoryAddr + DICTIONARY_INDEX, dictionary); + unsafe.putLong(memoryAddr + RELEASE_CALLBACK_INDEX, release); + unsafe.putLong(memoryAddr + PRIVATE_DATA_INDEX, privateData); + + return new ArrowArray(memoryAddr); + } + + public long memoryAddress() { + return memoryAddr; + } + + public long releaseCallback() { + return unsafe.getLong(memoryAddr + RELEASE_CALLBACK_INDEX); + } + + public static ArrowArray wrap(long arrowArrayPointer) { + return new ArrowArray(arrowArrayPointer); + } + + public boolean isReleased() { + return releaseCallback() == NULL; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/arrow/ArrowSchema.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/arrow/ArrowSchema.java new file mode 100644 index 0000000000..0ac28db944 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/arrow/ArrowSchema.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.arrow; + +import com.oracle.graal.python.builtins.objects.capsule.PyCapsule; +import com.oracle.graal.python.util.PythonUtils; +import sun.misc.Unsafe; + +import static com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess.POINTER_SIZE; + +/** + * C Data Interface of ArrowSchema + *

        + * Represents a wrapper for the following C structure: + * + *

        + *   struct ArrowSchema {
        + *       // Array type description
        + *       const char* format;                            0
        + *       const char* name;                              8
        + *       const char* metadata;                          16
        + *       int64_t flags;                                 24
        + *       int64_t n_children;                            32
        + *       struct ArrowSchema** children;                 40
        + *       struct ArrowSchema* dictionary;                48
        + *
        + *       // Release callback
        + *       void (*release)(struct ArrowSchema*);          56
        + *       // Opaque producer-specific data
        + *       void* private_data;                            64
        + *   };
        + * 
        + */ +public class ArrowSchema { + + private static final Unsafe unsafe = PythonUtils.initUnsafe(); + private static final int SIZE_OF = 72; + public static final byte[] CAPSULE_NAME = PyCapsule.capsuleName("arrow_schema"); + private static final byte NULL = 0; + + private static final long FORMAT_INDEX = 0; + private static final long NAME_INDEX = POINTER_SIZE; + private static final long METADATA_INDEX = 2 * POINTER_SIZE; + private static final long FLAGS_INDEX = 3 * POINTER_SIZE; + private static final long N_CHILDREN_INDEX = 4 * POINTER_SIZE; + private static final long CHILDREN_INDEX = 5 * POINTER_SIZE; + private static final long DICTIONARY_INDEX = 6 * POINTER_SIZE; + private static final long RELEASE_CALLBACK_INDEX = 7 * POINTER_SIZE; + private static final long PRIVATE_DATA_INDEX = 8 * POINTER_SIZE; + + private final long memoryAddr; + + private ArrowSchema(long memoryAddr) { + this.memoryAddr = memoryAddr; + } + + public static ArrowSchema allocate(long format, long name, long metadata, long flags, long nChildren, long children, long dictionary, long release, long privateData) { + var memoryAddr = unsafe.allocateMemory(SIZE_OF); + unsafe.putLong(memoryAddr + FORMAT_INDEX, format); + unsafe.putLong(memoryAddr + NAME_INDEX, name); + unsafe.putLong(memoryAddr + METADATA_INDEX, metadata); + unsafe.putLong(memoryAddr + FLAGS_INDEX, flags); + unsafe.putLong(memoryAddr + N_CHILDREN_INDEX, nChildren); + unsafe.putLong(memoryAddr + CHILDREN_INDEX, children); + unsafe.putLong(memoryAddr + DICTIONARY_INDEX, dictionary); + unsafe.putLong(memoryAddr + RELEASE_CALLBACK_INDEX, release); + unsafe.putLong(memoryAddr + PRIVATE_DATA_INDEX, privateData); + return new ArrowSchema(memoryAddr); + } + + public static ArrowSchema wrap(long arrowSchemaPointer) { + return new ArrowSchema(arrowSchemaPointer); + } + + public long memoryAddress() { + return memoryAddr; + } + + public long releaseCallback() { + return unsafe.getLong(memoryAddr + RELEASE_CALLBACK_INDEX); + } + + public boolean isReleased() { + return releaseCallback() == NULL; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/arrow/InvokeArrowReleaseCallbackNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/arrow/InvokeArrowReleaseCallbackNode.java new file mode 100644 index 0000000000..5a3da6a038 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/arrow/InvokeArrowReleaseCallbackNode.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.arrow; + +import com.oracle.graal.python.builtins.objects.cext.common.NativePointer; +import com.oracle.graal.python.nodes.PNodeWithContext; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.arrow.ArrowUtil; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.library.CachedLibrary; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.nfi.api.SignatureLibrary; + +@GenerateCached +@GenerateInline(inlineByDefault = true) +@GenerateUncached +public abstract class InvokeArrowReleaseCallbackNode extends PNodeWithContext { + + public abstract void execute(Node inliningTarget, long releaseCallback, long baseStructure); + + public final void executeCached(long releaseCallback, long baseStructure) { + execute(this, releaseCallback, baseStructure); + } + + @Specialization + static void doIt(Node inliningTarget, long releaseCallback, long baseStructure, + @Bind("getContext(inliningTarget)") PythonContext ctx, + @Cached(value = "createReleaseCallbackSignature(ctx)", allowUncached = true) Object callbackSignature, + @CachedLibrary(limit = "1") SignatureLibrary signatureLibrary) { + try { + signatureLibrary.call(callbackSignature, new NativePointer(releaseCallback), baseStructure); + } catch (Exception e) { + throw CompilerDirectives.shouldNotReachHere("Unable to call release callback. Error:", e); + } + } + + static Object createReleaseCallbackSignature(PythonContext context) { + return ArrowUtil.createNfiSignature("(UINT64):VOID", context); + } + + @GenerateCached(false) + @GenerateInline + @GenerateUncached + public abstract static class Lazy extends Node { + public final InvokeArrowReleaseCallbackNode get(Node inliningTarget) { + return execute(inliningTarget); + } + + abstract InvokeArrowReleaseCallbackNode execute(Node inliningTarget); + + @Specialization + static InvokeArrowReleaseCallbackNode doIt(@Cached(inline = false) InvokeArrowReleaseCallbackNode node) { + return node; + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/arrow/capsule/ArrowArrayCapsuleDestructor.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/arrow/capsule/ArrowArrayCapsuleDestructor.java new file mode 100644 index 0000000000..1a84e3d306 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/arrow/capsule/ArrowArrayCapsuleDestructor.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.arrow.capsule; + +import com.oracle.graal.python.builtins.modules.cext.PythonCextCapsuleBuiltins.PyCapsuleGetPointerNode; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.NativeToPythonNode; +import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers; +import com.oracle.graal.python.nodes.arrow.ArrowArray; +import com.oracle.graal.python.nodes.arrow.InvokeArrowReleaseCallbackNode; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.TruffleObject; +import com.oracle.truffle.api.library.CachedLibrary; +import com.oracle.truffle.api.library.ExportLibrary; +import com.oracle.truffle.api.library.ExportMessage; +import com.oracle.truffle.api.nodes.Node; + +@ExportLibrary(InteropLibrary.class) +public class ArrowArrayCapsuleDestructor implements TruffleObject { + + @ExportMessage + boolean isExecutable() { + return true; + } + + @ExportMessage + static class Execute { + + @Specialization(guards = "isPointer(args, interopLib)") + static Object doRelease(ArrowArrayCapsuleDestructor self, Object[] args, + @Bind("$node") Node inliningTarget, + @CachedLibrary(limit = "1") InteropLibrary interopLib, + @Cached NativeToPythonNode nativeToPythonNode, + @Cached PyCapsuleGetPointerNode capsuleGetPointerNode, + @Cached InvokeArrowReleaseCallbackNode.Lazy invokeReleaseCallbackNode) { + Object capsule = nativeToPythonNode.execute(args[0]); + var capsuleName = new CArrayWrappers.CByteArrayWrapper(ArrowArray.CAPSULE_NAME); + var arrowArray = ArrowArray.wrap((long) capsuleGetPointerNode.execute(inliningTarget, capsule, capsuleName)); + /* + * The exported PyCapsules should have a destructor that calls the release callback of + * the Arrow struct, if it is not already null. This prevents a memory leak in case the + * capsule was never passed to another consumer. + * + * For more information see: + * https://arrow.apache.org/docs/format/CDataInterface/PyCapsuleInterface.html#lifetime- + * semantics + */ + if (!arrowArray.isReleased()) { + invokeReleaseCallbackNode.get(inliningTarget).executeCached(arrowArray.releaseCallback(), arrowArray.memoryAddress()); + } + PythonContext.get(inliningTarget).getUnsafe().freeMemory(arrowArray.memoryAddress()); + return PNone.NO_VALUE; + } + + @Fallback + static Object doError(ArrowArrayCapsuleDestructor self, Object[] args) { + throw CompilerDirectives.shouldNotReachHere(); + } + + static boolean isPointer(Object[] args, InteropLibrary interopLib) { + return args.length == 1 && interopLib.isPointer(args[0]); + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/arrow/capsule/ArrowSchemaCapsuleDestructor.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/arrow/capsule/ArrowSchemaCapsuleDestructor.java new file mode 100644 index 0000000000..020b871a8a --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/arrow/capsule/ArrowSchemaCapsuleDestructor.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.arrow.capsule; + +import com.oracle.graal.python.builtins.modules.cext.PythonCextCapsuleBuiltins.PyCapsuleGetPointerNode; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.NativeToPythonNode; +import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers; +import com.oracle.graal.python.nodes.arrow.ArrowSchema; +import com.oracle.graal.python.nodes.arrow.InvokeArrowReleaseCallbackNode; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.TruffleObject; +import com.oracle.truffle.api.library.CachedLibrary; +import com.oracle.truffle.api.library.ExportLibrary; +import com.oracle.truffle.api.library.ExportMessage; +import com.oracle.truffle.api.nodes.Node; + +@ExportLibrary(InteropLibrary.class) +public class ArrowSchemaCapsuleDestructor implements TruffleObject { + + @ExportMessage + boolean isExecutable() { + return true; + } + + @ExportMessage + static class Execute { + + @Specialization(guards = "isPointer(args, interopLib)") + static Object doRelease(ArrowSchemaCapsuleDestructor self, Object[] args, + @Bind("$node") Node inliningTarget, + @CachedLibrary(limit = "1") InteropLibrary interopLib, + @Cached NativeToPythonNode nativeToPythonNode, + @Cached PyCapsuleGetPointerNode pyCapsuleGetPointerNode, @Cached InvokeArrowReleaseCallbackNode.Lazy invokeReleaseCallbackNode) { + Object capsule = nativeToPythonNode.execute(args[0]); + var capsuleName = new CArrayWrappers.CByteArrayWrapper(ArrowSchema.CAPSULE_NAME); + var arrowSchema = ArrowSchema.wrap((long) pyCapsuleGetPointerNode.execute(inliningTarget, capsule, capsuleName)); + + if (!arrowSchema.isReleased()) { + invokeReleaseCallbackNode.get(inliningTarget).executeCached(arrowSchema.releaseCallback(), arrowSchema.memoryAddress()); + } + + PythonContext.get(inliningTarget).getUnsafe().freeMemory(arrowSchema.memoryAddress()); + return PNone.NO_VALUE; + } + + @Fallback + static Object doError(ArrowSchemaCapsuleDestructor self, Object[] args) { + throw CompilerDirectives.shouldNotReachHere(); + } + + static boolean isPointer(Object[] args, InteropLibrary interopLib) { + return args.length == 1 && interopLib.isPointer(args[0]); + } + } + +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/DeleteAttributeNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/DeleteAttributeNode.java deleted file mode 100644 index 0878e51610..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/DeleteAttributeNode.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.attributes; - -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.GenerateCached; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; - -@GenerateUncached -@GenerateInline -@GenerateCached(false) -public abstract class DeleteAttributeNode extends PNodeWithContext { - public abstract void execute(VirtualFrame frame, Node inliningTarget, Object object, Object key); - - @Specialization - protected void doIt(VirtualFrame frame, Object object, Object key, - @Cached(value = "create(DelAttr)", inline = false) LookupAndCallBinaryNode call) { - call.executeObject(frame, object, key); - } - - @Specialization(replaces = "doIt") - protected void doItUncached(VirtualFrame frame, Object object, Object key) { - PythonUtils.assertUncached(); - Object klass = GetClassNode.executeUncached(object); - Object method = LookupCallableSlotInMRONode.getUncached(SpecialMethodSlot.DelAttr).execute(klass); - CallBinaryMethodNode.getUncached().executeObject(frame, method, object, key); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/GetAttributeNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/GetAttributeNode.java index c4e5a4f83c..889b74f54d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/GetAttributeNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/GetAttributeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,6 +43,7 @@ import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GETATTR__; import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.exception.AttributeErrorBuiltins; import com.oracle.graal.python.builtins.objects.module.ModuleBuiltins; import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins; import com.oracle.graal.python.builtins.objects.type.TpSlots; @@ -52,6 +53,7 @@ import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.attributes.GetAttributeNodeFactory.GetFixedAttributeNodeGen; import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.runtime.exception.PException; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.NeverDefault; @@ -133,7 +135,7 @@ final Object doBuiltinType(VirtualFrame frame, Object object, @SuppressWarnings( @Specialization(guards = "isModuleGetAttribute(slots)") final Object doBuiltinModule(VirtualFrame frame, Object object, @SuppressWarnings("unused") TpSlots slots, - @Cached ModuleBuiltins.ModuleGetattritbuteNode getAttributeNode) { + @Cached ModuleBuiltins.ModuleGetattributeNode getAttributeNode) { assert hasNoGetAttr(object); return getAttributeNode.execute(frame, object, key); } @@ -141,8 +143,13 @@ final Object doBuiltinModule(VirtualFrame frame, Object object, @SuppressWarning @Specialization(replaces = {"doBuiltinObject", "doBuiltinType", "doBuiltinModule"}) final Object doGeneric(VirtualFrame frame, Object object, TpSlots slots, @Bind("this") Node inliningTarget, - @Cached CallSlotGetAttrNode callGetAttrNode) { - return callGetAttrNode.execute(frame, inliningTarget, slots, object, key); + @Cached CallSlotGetAttrNode callGetAttrNode, + @Cached AttributeErrorBuiltins.SetAttributeErrorContext setContext) { + try { + return callGetAttrNode.execute(frame, inliningTarget, slots, object, key); + } catch (PException e) { + throw setContext.execute(inliningTarget, e, object, key); + } } @NeverDefault diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupAttributeInMRONode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupAttributeInMRONode.java index a6d6af6b19..4cdb7b7215 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupAttributeInMRONode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupAttributeInMRONode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -84,7 +84,10 @@ import com.oracle.truffle.api.strings.TruffleString; @ImportStatic(PythonOptions.class) -public abstract class LookupAttributeInMRONode extends LookupInMROBaseNode { +public abstract class LookupAttributeInMRONode extends PNodeWithContext { + + public abstract Object execute(Object klass); + @GenerateUncached @GenerateInline(false) // footprint reduction 36 -> 17 public abstract static class Dynamic extends PNodeWithContext { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupCallableSlotInMRONode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupCallableSlotInMRONode.java deleted file mode 100644 index 9ef8490ac4..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupCallableSlotInMRONode.java +++ /dev/null @@ -1,308 +0,0 @@ -/* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.attributes; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.BinaryBuiltinDescriptor; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.TernaryBuiltinDescriptor; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.UnaryBuiltinDescriptor; -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.function.PFunction; -import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; -import com.oracle.graal.python.builtins.objects.type.PythonClass; -import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.nodes.PGuards; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.GenerateCached; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.Idempotent; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.nodes.Node; - -/** - * The same as {@link LookupAttributeInMRONode}, but this may also return an instance of - * {@link BuiltinMethodDescriptor}. - * {@link com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode} and similar should accept - * such objects as a callable. - */ -@ImportStatic({PythonOptions.class, PythonLanguage.class}) -public abstract class LookupCallableSlotInMRONode extends LookupInMROBaseNode { - - protected abstract static class CachedLookup extends LookupCallableSlotInMRONode { - protected final SpecialMethodSlot slot; - - protected CachedLookup(SpecialMethodSlot slot) { - this.slot = slot; - } - - // Single and multi context: - // PythonBuiltinClassType: if there is a value for the slot in PythonBuiltinClassType, then - // we can just cache it even in multi-context case - @Specialization(guards = {"klass == cachedKlass", "result != null"}, limit = "getAttributeAccessInlineCacheMaxDepth()") - static Object doBuiltinTypeCached(@SuppressWarnings("unused") PythonBuiltinClassType klass, - @SuppressWarnings("unused") @Cached(value = "klass") PythonBuiltinClassType cachedKlass, - @Cached(value = "slot.getValue(klass)") Object result) { - assert isCacheable(result) : result; - return result; - } - - // Single-context - - @Specialization(guards = {"isSingleContext()", "klass == cachedKlass"}, // - assumptions = "cachedKlass.getSlotsFinalAssumption()", // - limit = "getAttributeAccessInlineCacheMaxDepth()") - static Object doSlotCachedSingleCtx(@SuppressWarnings("unused") PythonClass klass, - @SuppressWarnings("unused") @Cached(value = "klass", weak = true) PythonClass cachedKlass, - @Cached(value = "slot.getValue(klass)", weak = true) Object result) { - return result; - } - - @Specialization(guards = {"isSingleContext()", "klass == cachedKlass"}, limit = "getAttributeAccessInlineCacheMaxDepth()") - static Object doBuiltinCachedSingleCtx(@SuppressWarnings("unused") PythonBuiltinClass klass, - @SuppressWarnings("unused") @Cached("klass") PythonBuiltinClass cachedKlass, - @Cached("slot.getValue(klass)") Object result) { - return result; - } - - // PythonBuiltinClassType: if the value of the slot is not node factory or None, we must - // read - // the slot from the resolved builtin class - @Specialization(guards = {"isSingleContext()", "klassType == cachedKlassType", "slot.getValue(cachedKlassType) == null"}, // - limit = "getAttributeAccessInlineCacheMaxDepth()") - static Object doBuiltinTypeCachedSingleCtx(@SuppressWarnings("unused") PythonBuiltinClassType klassType, - @SuppressWarnings("unused") @Cached("klassType") PythonBuiltinClassType cachedKlassType, - @Cached("slot.getValue(getContext().lookupType(cachedKlassType))") Object value) { - return value; - } - - // Multi-context: - - @Specialization(replaces = "doSlotCachedSingleCtx", guards = {"slot.getValue(klass) == result", "isCacheable(result)"}, // - limit = "getAttributeAccessInlineCacheMaxDepth()") - static Object doSlotCachedMultiCtx(@SuppressWarnings("unused") PythonClass klass, - @Cached("slot.getValue(klass)") Object result) { - // in multi-context we can still cache primitives and BuiltinMethodDescriptor instances - return result; - } - - @Specialization(replaces = "doSlotCachedMultiCtx") - Object doSlotUncachedMultiCtx(PythonClass klass, - @Bind("this") Node inliningTarget, - @Shared("slotValueProfile") @Cached SlotValueProfile slotValueProfile) { - return slotValueProfile.profile(inliningTarget, slot.getValue(klass)); - } - - // For PythonBuiltinClass it depends on whether we can cache the result: - - @Idempotent - protected static boolean isCacheable(Object value) { - return PythonLanguage.canCache(value) || BuiltinMethodDescriptor.isInstance(value); - } - - @Specialization(guards = {"klass.getType() == cachedType", "isCacheable(result)"}, // - replaces = "doBuiltinCachedSingleCtx", limit = "getAttributeAccessInlineCacheMaxDepth()") - static Object doBuiltinCachedMultiCtx(@SuppressWarnings("unused") PythonBuiltinClass klass, - @SuppressWarnings("unused") @Cached("klass.getType()") PythonBuiltinClassType cachedType, - @Cached("slot.getValue(klass)") Object result) { - return result; - } - - @Specialization(replaces = {"doBuiltinCachedSingleCtx", "doBuiltinCachedMultiCtx"}) - Object doBuiltinUncachableMultiCtx(PythonBuiltinClass klass, - @Bind("this") Node inliningTarget, - @Shared("slotValueProfile") @Cached SlotValueProfile slotValueProfile) { - return slotValueProfile.profile(inliningTarget, slot.getValue(klass)); - } - - // PythonBuiltinClassType: if the value of the slot is null, we must read the slot from the - // resolved builtin class - @Specialization(guards = {"klassType == cachedKlassType", "slot.getValue(cachedKlassType) == null"}, limit = "1") - static Object doBuiltinTypeMultiContext(@SuppressWarnings("unused") PythonBuiltinClassType klassType, - @Bind("this") Node inliningTarget, - @Exclusive @Cached SlotValueProfile slotValueProfile, - @SuppressWarnings("unused") @Cached("klassType") PythonBuiltinClassType cachedKlassType, - @Bind("slot.getValue(getContext().lookupType(cachedKlassType))") Object value) { - return slotValueProfile.profile(inliningTarget, value); - } - - // Fallback when the cache with PythonBuiltinClassType overflows: - - @Specialization(replaces = {"doBuiltinTypeCached", "doBuiltinTypeCachedSingleCtx", "doBuiltinTypeMultiContext"}) - Object doBuiltinTypeGeneric(PythonBuiltinClassType klass, - @Bind("this") Node inliningTarget, - @Shared("slotValueProfile") @Cached SlotValueProfile slotValueProfile) { - Object result = slot.getValue(klass); - if (result == null) { - result = slot.getValue(PythonContext.get(this).lookupType(klass)); - } - return slotValueProfile.profile(inliningTarget, result); - } - - // Native classes: - - @Specialization - @InliningCutoff - static Object doNativeClass(PythonAbstractNativeObject klass, - @Bind("this") Node inliningTarget, - @Shared("slotValueProfile") @Cached SlotValueProfile slotValueProfile, - @Cached("create(slot.getName())") LookupAttributeInMRONode lookup) { - return slotValueProfile.profile(inliningTarget, lookup.execute(klass)); - } - } - - @NeverDefault - public static LookupCallableSlotInMRONode create(SpecialMethodSlot slot) { - return LookupCallableSlotInMRONodeFactory.CachedLookupNodeGen.create(slot); - } - - protected static final class UncachedLookup extends LookupCallableSlotInMRONode { - - private final SpecialMethodSlot slot; - - private UncachedLookup(SpecialMethodSlot slot) { - this.slot = slot; - } - - @Override - @TruffleBoundary - public final Object execute(Object klass) { - if (klass instanceof PythonBuiltinClassType) { - Object result = slot.getValue((PythonBuiltinClassType) klass); - if (result == null) { - result = slot.getValue(PythonContext.get(null).lookupType((PythonBuiltinClassType) klass)); - } - return result; - } else if (klass instanceof PythonManagedClass) { - return slot.getValue((PythonManagedClass) klass); - } else { - assert klass instanceof PythonAbstractNativeObject; - return LookupAttributeInMRONode.Dynamic.getUncached().execute(klass, slot.getName()); - } - } - - @Override - public boolean isAdoptable() { - return false; - } - - private static final UncachedLookup[] UNCACHEDS = new UncachedLookup[SpecialMethodSlot.values().length]; - static { - SpecialMethodSlot[] values = SpecialMethodSlot.values(); - for (int i = 0; i < values.length; i++) { - SpecialMethodSlot slot = values[i]; - UNCACHEDS[i] = new UncachedLookup(slot); - } - } - } - - public static LookupCallableSlotInMRONode getUncached(SpecialMethodSlot slot) { - return UncachedLookup.UNCACHEDS[slot.ordinal()]; - } - - @GenerateUncached - @GenerateInline - @GenerateCached(false) - @ImportStatic(PGuards.class) - protected abstract static class SlotValueProfile extends Node { - final Object profile(Node inliningTarget, Object value) { - return execute(inliningTarget, value); - } - - abstract Object execute(Node inliningTarget, Object value); - - @Specialization - static UnaryBuiltinDescriptor unaryDescr(UnaryBuiltinDescriptor value) { - return value; - } - - @Specialization - static BinaryBuiltinDescriptor binaryDescr(BinaryBuiltinDescriptor value) { - return value; - } - - @Specialization - static TernaryBuiltinDescriptor ternaryDescr(TernaryBuiltinDescriptor value) { - return value; - } - - @Specialization - static PBuiltinFunction builtin(PBuiltinFunction builtin) { - return builtin; - } - - @Specialization - static PFunction fun(PFunction fun) { - return fun; - } - - @Specialization(guards = "isNoValue(none)") - static PNone noValue(@SuppressWarnings("unused") PNone none) { - return PNone.NO_VALUE; - } - - @Specialization(guards = "isNone(none)") - static PNone none(@SuppressWarnings("unused") PNone none) { - return PNone.NONE; - } - - // Intentionally not guarded, if it is activated first, we want to just bail out from - // profiling - @Specialization(replaces = {"unaryDescr", "binaryDescr", "ternaryDescr", "builtin", "fun", "noValue", "none"}) - static Object other(Object value) { - return value; - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupInMROBaseNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupInMROBaseNode.java deleted file mode 100644 index 1b04c0d8ac..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupInMROBaseNode.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.attributes; - -import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.truffle.api.dsl.ImportStatic; - -@ImportStatic(PythonOptions.class) -public abstract class LookupInMROBaseNode extends PNodeWithContext { - public abstract Object execute(Object klass); -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupInheritedSlotNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupInheritedSlotNode.java deleted file mode 100644 index 9bf93bdaa3..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupInheritedSlotNode.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.attributes; - -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.truffle.api.dsl.NeverDefault; - -/** - * Variant of {@link LookupInheritedAttributeNode} for special attributes cached in internal slots. - * Unlike {@link LookupInheritedAttributeNode}, this node may return - * {@link com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor}. - * - * @see SpecialMethodSlot - */ -public final class LookupInheritedSlotNode extends PNodeWithContext { - - @Child private LookupCallableSlotInMRONode lookupInMRONode; - @Child private GetClassNode getClassNode = GetClassNode.create(); - - private LookupInheritedSlotNode(SpecialMethodSlot slot) { - lookupInMRONode = LookupCallableSlotInMRONode.create(slot); - } - - @NeverDefault - public static LookupInheritedSlotNode create(SpecialMethodSlot slot) { - return new LookupInheritedSlotNode(slot); - } - - public Object execute(Object object) { - return lookupInMRONode.execute(getClassNode.executeCached(object)); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupNativeSlotNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupNativeSlotNode.java deleted file mode 100644 index aeb2714b01..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/LookupNativeSlotNode.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.attributes; - -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; -import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; -import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol; -import com.oracle.graal.python.builtins.objects.cext.capi.SlotMethodDef; -import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; -import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; -import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; -import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetMroStorageNode; -import com.oracle.graal.python.nodes.PGuards; -import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.interop.InteropLibrary; - -/** - * Lookup a suitable slot function. When the slot is found to be inherited from a native superclass, - * this returns the same function pointer, so behaves just like CPython would. For inheriting - * managed slots we differ, however. CPython installs some slot functions in PyHeapTypeObjects that - * do a lookup of the method in the type's dict and call it. We avoid this and instead return a - * function pointer that directly calls the correct method (see {@link #wrapManagedMethod}). - * However, there are two caveats: - * - * 1) In CPython, were a PyHeapTypeObject supertype to change a magic method in its dict after a - * subclass inherited from it, the slot lookup will (correctly) go to the new method. In our case it - * will not, since we have created a closure over the method at the time of inheritance. So far this - * has not been an issue, so we ignore it. - * - * 2) Some slots that map to the same Python method cannot be treated in this way. Consider what - * happens if we inherit from a managed type with a __len__ method and a native type with - * tp_as_mapping->mp_length. We would copy the mp_length slot from the native type, and create a - * closure to call the managed __len__ method for tp_as_sequence->sq_length. This is not what - * CPython does. In CPython, the sq_length slot would be set to a C function that does a dynamic - * lookup and call of __len__! So it depends on the MRO order if we end up in the managed __len__ or - * in fact bounce back into native to invoke the mp_length function when calling - * tp_as_sequence->sq_length on the subtype! As for 1), we ignore the potential of later __dict__ - * updates along the MRO chain and return the pointer to the native slot, if that should take - * precedence. - */ -public abstract class LookupNativeSlotNode extends PNodeWithContext { - private LookupNativeSlotNode() { - } - - @TruffleBoundary - public static Object executeUncached(PythonManagedClass klass, SlotMethodDef slot) { - var mro = GetMroStorageNode.getUncached().execute(null, klass); - var readAttrNode = ReadAttributeFromObjectNode.getUncachedForceType(); - var readPointerNode = CStructAccess.ReadPointerNode.getUncached(); - var interopLibrary = InteropLibrary.getUncached(); - var overlappingSlot = slot.overlappingSlot; - Object foundNativeSlotOverlap = null; - for (int i = 0; i < mro.length(); i++) { - PythonAbstractClass kls = mro.getPythonClassItemNormalized(i); - Object value = readSlot(slot, kls, readAttrNode, readPointerNode, interopLibrary); - if (value != null) { - if (foundNativeSlotOverlap != null && kls instanceof PythonManagedClass) { - // we found managed method with the same name as a previous slot. the slot - // should shadow the method - return foundNativeSlotOverlap; - } - return value; - } - if (overlappingSlot != null && foundNativeSlotOverlap == null && kls instanceof PythonAbstractNativeObject nativeObject) { - foundNativeSlotOverlap = readSlot(overlappingSlot, kls, readAttrNode, readPointerNode, interopLibrary); - } - } - if (foundNativeSlotOverlap != null) { - return foundNativeSlotOverlap; - } - return getNULL(); - } - - private static Object getNULL() { - return PythonContext.get(null).getNativeNull(); - } - - private static Object readSlot(SlotMethodDef slot, PythonAbstractClass currentType, ReadAttributeFromObjectNode readNode, CStructAccess.ReadPointerNode readPointerNode, - InteropLibrary interopLibrary) { - if (currentType instanceof PythonAbstractNativeObject nativeObject) { - Object value = readPointerNode.readFromObj(nativeObject, slot.typeField); - if (!PGuards.isNullOrZero(value, interopLibrary)) { - if (slot.methodsField == null) { - return value; - } else { - value = readPointerNode.read(value, slot.methodsField); - if (!PGuards.isNullOrZero(value, interopLibrary)) { - return value; - } - } - } - } else { - assert currentType instanceof PythonManagedClass; - if (slot.methodFlag != 0 && currentType instanceof PythonBuiltinClass builtinClass) { - if ((builtinClass.getType().getMethodsFlags() & slot.methodFlag) == 0) { - return null; - } - } - Object value = readNode.execute(currentType, slot.methodName); - if (value != PNone.NO_VALUE) { - if (slot == SlotMethodDef.TP_HASH && value == PNone.NONE) { - return CApiContext.getNativeSymbol(null, NativeCAPISymbol.FUN_PYOBJECT_HASH_NOT_IMPLEMENTED); - } - return wrapManagedMethod(slot, (PythonManagedClass) currentType, value); - } - } - return null; - } - - private static Object wrapManagedMethod(SlotMethodDef slot, PythonManagedClass owner, Object value) { - if (value instanceof PNone) { - return getNULL(); - } - return PythonContext.get(null).getCApiContext().getOrCreateProcWrapper(owner, slot, () -> slot.wrapperFactory.apply(value)); - } - - @Override - public boolean isAdoptable() { - return false; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/WriteAttributeToObjectNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/WriteAttributeToObjectNode.java index 012300b2b4..6dc8a40ddf 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/WriteAttributeToObjectNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/WriteAttributeToObjectNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -50,13 +50,13 @@ import com.oracle.graal.python.builtins.objects.cext.structs.CFields; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; import com.oracle.graal.python.builtins.objects.common.HashingStorage; +import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItem; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; import com.oracle.graal.python.builtins.objects.type.PythonClass; import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TypeFlags; import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode; @@ -151,7 +151,7 @@ boolean writeToDynamicStorageBuiltinType(PythonBuiltinClass klass, TruffleString @Shared("cpLen") @Cached TruffleString.CodePointLengthNode codePointLengthNode, @Shared("cpAtIndex") @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode) { if (PythonContext.get(this).isInitialized()) { - throw PRaiseNode.raiseUncached(this, TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_R_OF_IMMUTABLE_TYPE_N, key, klass); + throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_R_OF_IMMUTABLE_TYPE_N, key, klass); } else { return writeToDynamicStorageManagedClass(klass, key, value, inliningTarget, callAttrUpdate, dylib, codePointLengthNode, codePointAtIndexNode); } @@ -188,7 +188,7 @@ private static boolean writeToDynamicStorageManagedClass(PythonManagedClass klas } // write to the dict: the basic specialization for non-classes - @Specialization(guards = {"dict != null", "!isManagedClass(object)"}) + @Specialization(guards = {"dict != null", "!isManagedClass(object)", "!isNoValue(value)"}) static boolean writeToDictNoType(@SuppressWarnings("unused") PythonObject object, TruffleString key, Object value, @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared("getDict") @Cached GetDictIfExistsNode getDict, @@ -199,7 +199,7 @@ static boolean writeToDictNoType(@SuppressWarnings("unused") PythonObject object } // write to the dict & PythonManagedClass -> requires calling onAttributeUpdate - @Specialization(guards = {"dict != null"}) + @Specialization(guards = {"dict != null", "!isNoValue(value)"}) boolean writeToDictBuiltinType(PythonBuiltinClass klass, TruffleString key, Object value, @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared("getDict") @Cached GetDictIfExistsNode getDict, @@ -210,13 +210,13 @@ boolean writeToDictBuiltinType(PythonBuiltinClass klass, TruffleString key, Obje @Shared("cpLen") @Cached TruffleString.CodePointLengthNode codePointLengthNode, @Shared("cpAtIndex") @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode) { if (PythonContext.get(this).isInitialized()) { - throw PRaiseNode.raiseUncached(this, TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_R_OF_IMMUTABLE_TYPE_N, PyObjectReprAsTruffleStringNode.executeUncached(key), klass); + throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_R_OF_IMMUTABLE_TYPE_N, PyObjectReprAsTruffleStringNode.executeUncached(key), klass); } else { return writeToDictManagedClass(klass, dict, key, value, inliningTarget, callAttrUpdate, updateStorage, setHashingStorageItem, codePointLengthNode, codePointAtIndexNode); } } - @Specialization(guards = {"dict != null"}) + @Specialization(guards = {"dict != null", "!isNoValue(value)"}) static boolean writeToDictClass(PythonClass klass, TruffleString key, Object value, @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Shared("getDict") @Cached GetDictIfExistsNode getDict, @@ -229,6 +229,36 @@ static boolean writeToDictClass(PythonClass klass, TruffleString key, Object val return writeToDictManagedClass(klass, dict, key, value, inliningTarget, callAttrUpdate, updateStorage, setHashingStorageItem, codePointLengthNode, codePointAtIndexNode); } + @Specialization(guards = {"dict != null", "isNoValue(value)", "!isPythonBuiltinClass(obj)"}) + static boolean deleteFromPythonObject(PythonObject obj, TruffleString key, Object value, + @Bind("this") Node inliningTarget, + @SuppressWarnings("unused") @Shared("getDict") @Cached GetDictIfExistsNode getDict, + @Bind("getDict.execute(obj)") PDict dict, + @Shared("callAttrUpdate") @Cached InlinedBranchProfile callAttrUpdate, + @Cached HashingStorageNodes.HashingStorageDelItem hashingStorageDelItem, + @Shared("cpLen") @Cached TruffleString.CodePointLengthNode codePointLengthNode, + @Shared("cpAtIndex") @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode) { + try { + HashingStorage dictStorage = dict.getDictStorage(); + return hashingStorageDelItem.execute(inliningTarget, dictStorage, key, dict); + } finally { + if (obj instanceof PythonManagedClass klass) { + if (!klass.canSkipOnAttributeUpdate(key, value, codePointLengthNode, codePointAtIndexNode)) { + callAttrUpdate.enter(inliningTarget); + klass.onAttributeUpdate(key, value); + } + } + } + } + + @Specialization(guards = {"dict != null", "isNoValue(value)"}) + static boolean deleteFromPythonBuiltinClass(PythonBuiltinClass klass, TruffleString key, Object value, + @Bind("this") Node inliningTarget, + @SuppressWarnings("unused") @Shared("getDict") @Cached GetDictIfExistsNode getDict, + @Bind("getDict.execute(klass)") PDict dict) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_R_OF_IMMUTABLE_TYPE_N, key, klass); + } + private static boolean writeToDictManagedClass(PythonManagedClass klass, PDict dict, TruffleString key, Object value, Node inliningTarget, InlinedBranchProfile callAttrUpdate, InlinedBranchProfile updateStorage, HashingStorageSetItem setHashingStorageItem, TruffleString.CodePointLengthNode codePointLengthNode, TruffleString.CodePointAtIndexNode codePointAtIndexNode) { @@ -292,7 +322,7 @@ static boolean writeNativeObject(PythonAbstractNativeObject object, TruffleStrin @Shared("getDict") @Cached GetDictIfExistsNode getDict, @Shared("setHashingStorageItem") @Cached HashingStorageSetItem setHashingStorageItem, @Shared("updateStorage") @Cached InlinedBranchProfile updateStorage, - @Shared("raiseNode") @Cached PRaiseNode raiseNode) { + @Cached PRaiseNode raiseNode) { /* * The dict of native objects that stores the object attributes is located at 'objectPtr * + Py_TYPE(objectPtr)->tp_dictoffset'. 'PythonObjectLibrary.getDict' will exactly load @@ -302,28 +332,28 @@ static boolean writeNativeObject(PythonAbstractNativeObject object, TruffleStrin if (dict != null) { return writeToDict(dict, key, value, inliningTarget, updateStorage, setHashingStorageItem); } - throw raiseNode.raise(PythonBuiltinClassType.AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, object, key); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, object, key); } @Specialization(guards = "isErrorCase(getDict, object)") static boolean doError(Object object, TruffleString key, @SuppressWarnings("unused") Object value, @SuppressWarnings("unused") @Shared("getDict") @Cached GetDictIfExistsNode getDict, - @Shared("raiseNode") @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, object, key); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, object, key); } } @GenerateUncached - @ImportStatic(SpecialMethodSlot.class) @GenerateInline(false) // footprint reduction 132 -> 115 + @ImportStatic(TpSlots.class) protected abstract static class WriteAttributeToObjectTpDictNode extends WriteAttributeToObjectNode { - private static void checkNativeImmutable(PythonAbstractNativeObject object, TruffleString key, + private static void checkNativeImmutable(Node inliningTarget, PythonAbstractNativeObject object, TruffleString key, CStructAccess.ReadI64Node getNativeFlags, PRaiseNode raiseNode) { long flags = getNativeFlags.readFromObj(object, CFields.PyTypeObject__tp_flags); if ((flags & TypeFlags.IMMUTABLETYPE) != 0) { - throw raiseNode.raise(TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_R_OF_IMMUTABLE_TYPE_N, key, object); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANT_SET_ATTRIBUTE_R_OF_IMMUTABLE_TYPE_N, key, object); } } @@ -331,7 +361,7 @@ private static void checkNativeImmutable(PythonAbstractNativeObject object, Truf * Simplest case: the key object is a String (so it cannot be a hidden key) and it's not a * special method slot. */ - @Specialization(guards = "!canBeSpecial(key, codePointLengthNode, codePointAtIndexNode)") + @Specialization(guards = "!canBeSpecialMethod(key, codePointLengthNode, codePointAtIndexNode)") static boolean writeNativeClassSimple(PythonAbstractNativeObject object, TruffleString key, Object value, @Bind("this") Node inliningTarget, @Shared @Cached CStructAccess.ReadI64Node getNativeFlags, @@ -341,7 +371,7 @@ static boolean writeNativeClassSimple(PythonAbstractNativeObject object, Truffle @Shared("raiseNode") @Cached PRaiseNode raiseNode, @SuppressWarnings("unused") @Shared("cpLen") @Cached TruffleString.CodePointLengthNode codePointLengthNode, @SuppressWarnings("unused") @Shared("cpAtIndex") @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode) { - checkNativeImmutable(object, key, getNativeFlags, raiseNode); + checkNativeImmutable(inliningTarget, object, key, getNativeFlags, raiseNode); /* * For native types, the type attributes are stored in a dict that is located in * 'typePtr->tp_dict'. So, this is different to a native object (that is not a type) and @@ -352,7 +382,7 @@ static boolean writeNativeClassSimple(PythonAbstractNativeObject object, Truffle if (dict instanceof PDict) { return writeToDict((PDict) dict, key, value, inliningTarget, updateStorage, setHashingStorageItem); } - throw raiseNode.raise(PythonBuiltinClassType.AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, object, key); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, object, key); } @Specialization(replaces = "writeNativeClassSimple") @@ -366,10 +396,9 @@ static boolean writeNativeClassGeneric(PythonAbstractNativeObject object, Truffl @Cached IsTypeNode isTypeNode, @Shared("raiseNode") @Cached PRaiseNode raiseNode, @Shared("cpLen") @Cached TruffleString.CodePointLengthNode codePointLengthNode, - @Shared("cpAtIndex") @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode, - @Cached TruffleString.EqualNode equalNode) { + @Shared("cpAtIndex") @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode) { try { - checkNativeImmutable(object, key, getNativeFlags, raiseNode); + checkNativeImmutable(inliningTarget, object, key, getNativeFlags, raiseNode); /* * For native types, the type attributes are stored in a dict that is located in * 'typePtr->tp_dict'. So, this is different to a native object (that is not a type) @@ -380,7 +409,7 @@ static boolean writeNativeClassGeneric(PythonAbstractNativeObject object, Truffl if (dict instanceof PDict) { return writeToDict((PDict) dict, key, value, inliningTarget, updateStorage, setHashingStorageItem); } - throw raiseNode.raise(PythonBuiltinClassType.AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, object, key); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, object, key); } finally { if (TpSlots.canBeSpecialMethod(key, codePointLengthNode, codePointAtIndexNode)) { canBeSpecialSlot.enter(inliningTarget); @@ -391,11 +420,6 @@ static boolean writeNativeClassGeneric(PythonAbstractNativeObject object, Truffl if (isTypeNode.execute(inliningTarget, object)) { TpSlots.updateSlot(object, key); } - // TODO: will be removed: - SpecialMethodSlot slot = SpecialMethodSlot.findSpecialSlot(key, codePointLengthNode, codePointAtIndexNode, equalNode); - if (slot != null) { - SpecialMethodSlot.fixupSpecialMethodSlot(object, slot, value); - } } } } @@ -403,8 +427,8 @@ static boolean writeNativeClassGeneric(PythonAbstractNativeObject object, Truffl @Specialization(guards = "isErrorCase(getDict, object)") static boolean doError(Object object, TruffleString key, @SuppressWarnings("unused") Object value, @SuppressWarnings("unused") @Shared("getDict") @Cached GetDictIfExistsNode getDict, - @Shared("raiseNode") @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, object, key); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, object, key); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/builtins/ListNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/builtins/ListNodes.java index 48c7b8935c..9bdcccd688 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/builtins/ListNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/builtins/ListNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,267 +43,219 @@ import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyListObject__allocated; import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyListObject__ob_item; import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyVarObject__ob_size; -import static com.oracle.graal.python.builtins.objects.str.StringUtils.cat; -import static com.oracle.graal.python.nodes.BuiltinNames.T_LIST; -import static com.oracle.graal.python.nodes.StringLiterals.T_SPACE; +import static com.oracle.graal.python.nodes.ErrorMessages.DESCRIPTOR_REQUIRES_S_OBJ_RECEIVED_P; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.modules.MathGuards; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; -import com.oracle.graal.python.builtins.objects.common.SequenceNodes; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ListGeneralizationNode; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.list.PList; -import com.oracle.graal.python.builtins.objects.slice.PSlice; -import com.oracle.graal.python.builtins.objects.str.PString; -import com.oracle.graal.python.builtins.objects.str.StringUtils; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.lib.PyObjectGetIter; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.builtins.ListNodesFactory.AppendNodeGen; import com.oracle.graal.python.nodes.builtins.ListNodesFactory.ConstructListNodeGen; -import com.oracle.graal.python.nodes.builtins.ListNodesFactory.IndexNodeGen; -import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; -import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; -import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.runtime.sequence.PSequence; +import com.oracle.graal.python.nodes.object.IsForeignObjectNode; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.ArrayBasedSequenceStorage; +import com.oracle.graal.python.runtime.sequence.storage.EmptySequenceStorage; +import com.oracle.graal.python.runtime.sequence.storage.ForeignSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.NativeObjectSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.NativeSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; +import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.Idempotent; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.BranchProfile; -import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.api.strings.TruffleStringIterator; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; +/** See the docs on {@link com.oracle.graal.python.builtins.objects.list.ListBuiltins}. */ public abstract class ListNodes { @GenerateUncached - @ImportStatic({PGuards.class, PythonOptions.class}) - @GenerateInline(false) // footprint reduction 40 -> 21 - public abstract static class ConstructListNode extends PNodeWithContext { - - public final PList execute(Frame frame, Object value) { - return execute(frame, PythonBuiltinClassType.PList, value); - } + @GenerateInline(inlineByDefault = true) + public abstract static class GetListStorageNode extends PNodeWithContext { - protected abstract PList execute(Frame frame, Object cls, Object value); + public abstract SequenceStorage execute(Node inliningTarget, Object seq); @Specialization - static PList listString(Object cls, TruffleString arg, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached TruffleString.CodePointLengthNode codePointLengthNode, - @Shared @Cached TruffleString.CreateCodePointIteratorNode createCodePointIteratorNode, - @Shared @Cached TruffleStringIterator.NextNode nextNode, - @Shared @Cached TruffleString.FromCodePointNode fromCodePointNode) { - return factory.createList(cls, StringUtils.toCharacterArray(arg, codePointLengthNode, createCodePointIteratorNode, nextNode, fromCodePointNode)); + static SequenceStorage doPList(PList list) { + return list.getSequenceStorage(); } - @Specialization - static PList listString(Object cls, PString arg, - @Bind("this") Node inliningTarget, - @Shared @Cached PythonObjectFactory factory, - @Cached CastToTruffleStringNode castToStringNode, - @Shared @Cached TruffleString.CodePointLengthNode codePointLengthNode, - @Shared @Cached TruffleString.CreateCodePointIteratorNode createCodePointIteratorNode, - @Shared @Cached TruffleStringIterator.NextNode nextNode, - @Shared @Cached TruffleString.FromCodePointNode fromCodePointNode) { - return listString(cls, castToStringNode.execute(inliningTarget, arg), factory, codePointLengthNode, createCodePointIteratorNode, nextNode, fromCodePointNode); + @InliningCutoff + @Specialization(guards = {"isForeignObjectNode.execute(inliningTarget, seq)", "interop.hasArrayElements(seq)"}, limit = "1") + static SequenceStorage doForeign(Node inliningTarget, Object seq, + @Cached IsForeignObjectNode isForeignObjectNode, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop, + @Cached InlinedBranchProfile errorProfile) { + try { + long size = interop.getArraySize(seq); + return new ForeignSequenceStorage(seq, PInt.long2int(inliningTarget, size, errorProfile)); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(); + } } - @Specialization(guards = "isNoValue(none)") - static PList none(Object cls, @SuppressWarnings("unused") PNone none, - @Shared @Cached PythonObjectFactory factory) { - return factory.createList(cls); + @InliningCutoff + @Fallback + static SequenceStorage doFallback(Node inliningTarget, Object seq) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, DESCRIPTOR_REQUIRES_S_OBJ_RECEIVED_P, "list", seq); } + } - @Specialization(guards = "isBuiltinList(list)") - // Don't use PSequence, that might copy storages that we don't allow for lists - static PList fromList(Object cls, PList list, - @Bind("this") Node inliningTarget, - @Shared @Cached PythonObjectFactory factory, - @Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode, - @Cached SequenceStorageNodes.CopyNode copyNode) { - return factory.createList(cls, copyNode.execute(inliningTarget, getSequenceStorageNode.execute(inliningTarget, list))); - } + @GenerateInline + @GenerateCached(false) + public abstract static class UpdateListStorageNode extends PNodeWithContext { - @Specialization(guards = {"!isNoValue(iterable)", "!isString(iterable)"}) - static PList listIterable(VirtualFrame frame, Object cls, Object iterable, - @Bind("this") Node inliningTarget, - @Cached PyObjectGetIter getIter, - @Cached SequenceStorageNodes.CreateStorageFromIteratorNode createStorageFromIteratorNode, - @Shared @Cached PythonObjectFactory factory) { - Object iterObj = getIter.execute(frame, inliningTarget, iterable); - SequenceStorage storage = createStorageFromIteratorNode.execute(frame, iterObj); - return factory.createList(cls, storage); - } + public abstract void execute(Node inliningTarget, Object list, SequenceStorage oldStorage, SequenceStorage newStorage); - @Fallback - static PList listObject(@SuppressWarnings("unused") Object cls, Object value) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw CompilerDirectives.shouldNotReachHere("list does not support iterable object " + value); + @Specialization + static void doPList(Node inliningTarget, PList list, SequenceStorage oldStorage, SequenceStorage newStorage, + @Exclusive @Cached InlinedConditionProfile generalizedProfile) { + if (generalizedProfile.profile(inliningTarget, oldStorage != newStorage)) { + list.setSequenceStorage(newStorage); + } } - @NeverDefault - public static ConstructListNode create() { - return ConstructListNodeGen.create(); + @Fallback + static void doForeign(Node inliningTarget, Object list, SequenceStorage oldStorage, SequenceStorage newStorage, + @Exclusive @Cached InlinedConditionProfile generalizedProfile, + @Cached ForeignSequenceStorage.ClearNode clearNode, + @Cached(inline = false) SequenceStorageNodes.ConcatBaseNode concatNode) { + if (generalizedProfile.profile(inliningTarget, oldStorage != newStorage)) { + // clear() + extend() to replace the contents + clearNode.execute(inliningTarget, (ForeignSequenceStorage) oldStorage); + var afterExtendStorage = concatNode.execute(oldStorage, oldStorage, newStorage); + assert afterExtendStorage == oldStorage; + } } - public static ConstructListNode getUncached() { - return ConstructListNodeGen.getUncached(); - } } - @GenerateUncached @GenerateInline @GenerateCached(false) - public abstract static class FastConstructListNode extends PNodeWithContext { + public abstract static class ClearListStorageNode extends PNodeWithContext { - public abstract PSequence execute(Frame frame, Node inliningTarget, Object value); + public abstract void execute(Node inliningTarget, Object list); - @Specialization(guards = "isBuiltinList(value)") - protected static PSequence doPList(PSequence value) { - return value; + @Specialization + static void doPList(PList list) { + list.setSequenceStorage(EmptySequenceStorage.INSTANCE); } @Fallback - protected PSequence doGeneric(VirtualFrame frame, Object value, - @Cached(inline = false) ConstructListNode constructListNode) { - return constructListNode.execute(frame, PythonBuiltinClassType.PList, value); + static void doForeign(Node inliningTarget, Object list, + @Cached GetListStorageNode getStorageNode, + @Cached ForeignSequenceStorage.ClearNode clearNode) { + var sequenceStorage = getStorageNode.execute(inliningTarget, list); + clearNode.execute(inliningTarget, (ForeignSequenceStorage) sequenceStorage); } - } - @TypeSystemReference(PythonArithmeticTypes.class) - public abstract static class IndexNode extends PNodeWithContext { - @Child private PRaiseNode raise; - private static final TruffleString DEFAULT_ERROR_MSG = cat(T_LIST, T_SPACE, ErrorMessages.OBJ_INDEX_MUST_BE_INT_OR_SLICES); - @Child LookupAndCallUnaryNode getIndexNode; - private final CheckType checkType; - private final TruffleString errorMessage; - - protected static enum CheckType { - SUBSCRIPT, - INTEGER, - NUMBER; - } + @GenerateInline + @GenerateCached(false) + public abstract static class GetClassForNewListNode extends PNodeWithContext { - protected IndexNode(TruffleString message, CheckType type) { - checkType = type; - getIndexNode = LookupAndCallUnaryNode.create(SpecialMethodSlot.Index); - errorMessage = message; - } + public abstract Object execute(Node inliningTarget, Object list); - @NeverDefault - public static IndexNode create(TruffleString message) { - return IndexNodeGen.create(message, CheckType.SUBSCRIPT); - } - - @NeverDefault - public static IndexNode create() { - return IndexNodeGen.create(DEFAULT_ERROR_MSG, CheckType.SUBSCRIPT); + @Specialization + static Object doPList(Node inliningTarget, PList list, + @Cached GetClassNode.GetPythonObjectClassNode getClassNode) { + return getClassNode.execute(inliningTarget, list); } - @NeverDefault - public static IndexNode createInteger(TruffleString msg) { - return IndexNodeGen.create(msg, CheckType.INTEGER); + @Fallback + static Object doForeign(Object list) { + assert InteropLibrary.getUncached().hasArrayElements(list); + // Avoid creating a PList object with type ForeignList + return PythonBuiltinClassType.PList; } + } - @NeverDefault - public static IndexNode createNumber(TruffleString msg) { - return IndexNodeGen.create(msg, CheckType.NUMBER); - } + @GenerateUncached + @GenerateInline(false) // footprint reduction 40 -> 21 + public abstract static class ConstructListNode extends PNodeWithContext { - public abstract Object execute(VirtualFrame frame, Object object); + public abstract PList execute(Frame frame, Object value); - @Idempotent - protected boolean isSubscript() { - return checkType == CheckType.SUBSCRIPT; + @Specialization(guards = "isNoValue(none)") + static PList none(@SuppressWarnings("unused") PNone none, + @Bind PythonLanguage language) { + return PFactory.createList(language); } - @Idempotent - protected boolean isNumber() { - return checkType == CheckType.NUMBER; + @Specialization(guards = "isBuiltinList(list)") + // Don't use PSequence, that might copy storages that we don't allow for lists + static PList fromList(PList list, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Cached SequenceStorageNodes.CopyNode copyNode) { + return PFactory.createList(language, copyNode.execute(inliningTarget, list.getSequenceStorage())); } - @Specialization - long doLong(long slice) { - return slice; + @Specialization(guards = "!isNoValue(iterable)") + static PList listIterable(VirtualFrame frame, Object iterable, + @Bind("this") Node inliningTarget, + @Cached PyObjectGetIter getIter, + @Cached SequenceStorageNodes.CreateStorageFromIteratorNode createStorageFromIteratorNode, + @Bind PythonLanguage language) { + Object iterObj = getIter.execute(frame, inliningTarget, iterable); + SequenceStorage storage = createStorageFromIteratorNode.execute(frame, iterObj); + return PFactory.createList(language, storage); } - @Specialization - PInt doPInt(PInt slice) { - return slice; + @NeverDefault + public static ConstructListNode create() { + return ConstructListNodeGen.create(); } - @Specialization(guards = "isSubscript()") - PSlice doSlice(PSlice slice) { - return slice; + public static ConstructListNode getUncached() { + return ConstructListNodeGen.getUncached(); } + } - @Specialization(guards = "isNumber()") - float doFloat(float slice) { - return slice; - } + @GenerateUncached + @GenerateInline + @GenerateCached(false) + public abstract static class FastConstructListNode extends PNodeWithContext { + + public abstract PList execute(Frame frame, Node inliningTarget, Object value); - @Specialization(guards = "isNumber()") - double doDouble(double slice) { - return slice; + @Specialization(guards = "isBuiltinList(value)") + protected static PList doPList(PList value) { + return value; } @Fallback - @InliningCutoff - Object doGeneric(VirtualFrame frame, Object object) { - Object idx = getIndexNode.executeObject(frame, object); - boolean valid = false; - switch (checkType) { - case SUBSCRIPT: - valid = MathGuards.isInteger(idx) || idx instanceof PSlice; - break; - case NUMBER: - valid = MathGuards.isNumber(idx); - break; - case INTEGER: - valid = MathGuards.isInteger(idx); - break; - } - if (valid) { - return idx; - } else { - if (raise == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - raise = insert(PRaiseNode.create()); - } - throw raise.raise(TypeError, errorMessage, idx); - } + protected PList doGeneric(VirtualFrame frame, Object value, + @Cached(inline = false) ConstructListNode constructListNode) { + return constructListNode.execute(frame, value); } + } /** @@ -316,10 +268,11 @@ Object doGeneric(VirtualFrame frame, Object object) { */ @GenerateUncached @GenerateInline(false) // footprint reduction 36 -> 17 + @OperationProxy.Proxyable public abstract static class AppendNode extends PNodeWithContext { private static final BranchProfile[] DISABLED = new BranchProfile[]{BranchProfile.getUncached()}; - public abstract void execute(PList list, Object value); + public abstract void execute(Object list, Object value); @NeverDefault public static BranchProfile[] getUpdateStoreProfile() { @@ -333,7 +286,8 @@ public static BranchProfile[] getUpdateStoreProfileUncached() { @Specialization public static void appendObjectGeneric(PList list, Object value, @Bind("this") Node inliningTarget, - @Cached SequenceStorageNodes.AppendNode appendNode, + // @Exclusive for truffle-interpreted-performance + @Exclusive @Cached SequenceStorageNodes.AppendNode appendNode, @Cached(value = "getUpdateStoreProfile()", uncached = "getUpdateStoreProfileUncached()", dimensions = 1) BranchProfile[] updateStoreProfile) { if (updateStoreProfile[0] == null) { // Executed for the first time. We don't pollute the AppendNode specializations, @@ -358,6 +312,16 @@ public static void appendObjectGeneric(PList list, Object value, } } + @Fallback + public static void appendObjectForeign(Object list, Object value, + @Bind("this") Node inliningTarget, + @Cached GetListStorageNode getStorageNode, + @Exclusive @Cached SequenceStorageNodes.AppendNode appendNode) { + var storage = getStorageNode.execute(inliningTarget, list); + SequenceStorage newStore = appendNode.execute(inliningTarget, storage, value, ListGeneralizationNode.SUPPLIER); + assert newStore == storage; + } + @NeverDefault public static AppendNode create() { return AppendNodeGen.create(); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/builtins/TupleNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/builtins/TupleNodes.java index 583ef42436..144d6c65bb 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/builtins/TupleNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/builtins/TupleNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,23 +43,23 @@ import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTupleObject__ob_item; import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyVarObject__ob_size; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; +import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.CreateStorageFromIteratorNode; +import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.lib.PyTupleCheckNode; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.NativeObjectSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; @@ -75,38 +75,36 @@ public abstract class TupleNodes { @GenerateUncached @GenerateInline(false) // footprint reduction 40 -> 21 public abstract static class ConstructTupleNode extends PNodeWithContext { - public final PTuple execute(VirtualFrame frame, Object value) { - return execute(frame, PythonBuiltinClassType.PTuple, value); - } - - public abstract PTuple execute(Frame frame, Object cls, Object value); + public abstract PTuple execute(Frame frame, Object value); @Specialization(guards = "isNoValue(none)") - static PTuple tuple(Object cls, @SuppressWarnings("unused") PNone none, - @Shared("factory") @Cached PythonObjectFactory factory) { - return factory.createEmptyTuple(cls); + static PTuple tuple(@SuppressWarnings("unused") PNone none, + @Bind PythonLanguage language) { + return PFactory.createEmptyTuple(language); } - @Specialization(guards = {"isBuiltinTupleType(inliningTarget, cls, isSameTypeNode)", "isBuiltinTuple(iterable)"}, limit = "1") - static PTuple tuple(@SuppressWarnings("unused") Object cls, PTuple iterable, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached TypeNodes.IsSameTypeNode isSameTypeNode) { + @Specialization(guards = "isBuiltinTuple(iterable)") + static PTuple tuple(PTuple iterable) { return iterable; } + @Specialization(guards = "isBuiltinList(iterable)") + static PTuple list(PList iterable, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, + @Cached SequenceStorageNodes.CopyNode copyNode) { + return PFactory.createTuple(language, copyNode.execute(inliningTarget, iterable.getSequenceStorage())); + } + @Fallback @InliningCutoff - static PTuple tuple(VirtualFrame frame, Object cls, Object iterable, + static PTuple generic(VirtualFrame frame, Object iterable, @Bind("this") Node inliningTarget, - @Shared("factory") @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached CreateStorageFromIteratorNode storageNode, @Cached PyObjectGetIter getIter) { Object iterObj = getIter.execute(frame, inliningTarget, iterable); - return factory.createTuple(cls, storageNode.execute(frame, iterObj)); - } - - protected static boolean isBuiltinTupleType(Node inliningTarget, Object cls, TypeNodes.IsSameTypeNode isSameTypeNode) { - return isSameTypeNode.execute(inliningTarget, cls, PythonBuiltinClassType.PTuple); + return PFactory.createTuple(language, storageNode.execute(frame, iterObj)); } @NeverDefault diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/AbstractKwargsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/AbstractKwargsNode.java index 49408f54df..251ea87c36 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/AbstractKwargsNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/AbstractKwargsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -49,16 +49,17 @@ import com.oracle.graal.python.nodes.argument.keywords.SameDictKeyException; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; public class AbstractKwargsNode extends PNodeWithContext { - protected static PException handleNonMapping(VirtualFrame frame, PRaiseNode raise, int stackTop, NonMappingException e) { + protected static PException handleNonMapping(VirtualFrame frame, Node inliningTarget, PRaiseNode raise, int stackTop, NonMappingException e) { Object functionName = AbstractKwargsNode.getFunctionName(frame, stackTop); - throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.ARG_AFTER_MUST_BE_MAPPING, functionName, e.getObject()); + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ARG_AFTER_MUST_BE_MAPPING, functionName, e.getObject()); } - protected static PException handleSameKey(VirtualFrame frame, PRaiseNode raise, int stackTop, SameDictKeyException e) { + protected static PException handleSameKey(VirtualFrame frame, Node inliningTarget, PRaiseNode raise, int stackTop, SameDictKeyException e) { Object functionName = AbstractKwargsNode.getFunctionName(frame, stackTop); - throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.S_GOT_MULTIPLE_VALUES_FOR_KEYWORD_ARG, functionName, e.getKey()); + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.S_GOT_MULTIPLE_VALUES_FOR_KEYWORD_ARG, functionName, e.getKey()); } private static Object getFunctionName(VirtualFrame frame, int stackTop) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/BytecodeFrameInfo.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/BytecodeFrameInfo.java new file mode 100644 index 0000000000..5d0761210e --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/BytecodeFrameInfo.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.bytecode; + +import com.oracle.graal.python.compiler.CodeUnit; +import com.oracle.graal.python.compiler.OpCodesConstants; +import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; +import com.oracle.truffle.api.frame.Frame; + +public class BytecodeFrameInfo implements FrameInfo { + @CompilationFinal PBytecodeRootNode rootNode; + + void setRootNode(PBytecodeRootNode rootNode) { + this.rootNode = rootNode; + } + + @Override + public PBytecodeRootNode getRootNode() { + return rootNode; + } + + public int getBci(Frame frame) { + if (frame.isInt(rootNode.bcioffset)) { + return frame.getInt(rootNode.bcioffset); + } else { + return -1; + } + } + + public int getLineForBci(int bci) { + return rootNode.bciToLine(bci); + } + + public int getLine(Frame frame) { + return getLineForBci(getBci(frame)); + } + + @Override + public int getFirstLineNumber() { + return rootNode.getFirstLineno(); + } + + @Override + public Object getYieldFrom(Frame generatorFrame, int bci, int stackTop) { + /* Match the `yield from` bytecode pattern and get the object from stack */ + if (bci > 3 && bci < rootNode.bytecode.length && rootNode.bytecode[bci - 3] == OpCodesConstants.SEND && rootNode.bytecode[bci - 1] == OpCodesConstants.YIELD_VALUE && + rootNode.bytecode[bci] == OpCodesConstants.RESUME_YIELD) { + return generatorFrame.getObject(stackTop); + } + return null; + } + + @Override + public CodeUnit getCodeUnit() { + return rootNode.getCodeUnit(); + } + + @Override + public boolean includeInTraceback() { + return rootNode.frameIsVisibleToPython(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/CallComprehensionNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/CallComprehensionNode.java new file mode 100644 index 0000000000..f6d4a0087c --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/CallComprehensionNode.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.bytecode; + +import com.oracle.graal.python.builtins.objects.function.PFunction; +import com.oracle.graal.python.nodes.call.CallDispatchers; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.ImportStatic; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.DirectCallNode; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +@ImportStatic(CallDispatchers.class) +public abstract class CallComprehensionNode extends Node { + public abstract Object execute(VirtualFrame frame, PFunction callee, Object[] arguments); + + // No guard, comprehension functions don't change + @Specialization + static Object call(VirtualFrame frame, PFunction callee, Object[] arguments, + @Bind Node inliningTarget, + @Cached("createDirectCallNodeFor(callee)") DirectCallNode callNode, + @Cached CallDispatchers.FunctionDirectInvokeNode invoke) { + return invoke.execute(frame, inliningTarget, callNode, callee, arguments); + } + + @NeverDefault + public static CallComprehensionNode create() { + return CallComprehensionNodeGen.create(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/CopyDictWithoutKeysNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/CopyDictWithoutKeysNode.java index 9c2a9238d9..11806cacb2 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/CopyDictWithoutKeysNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/CopyDictWithoutKeysNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,12 +40,15 @@ */ package com.oracle.graal.python.nodes.bytecode; -import com.oracle.graal.python.builtins.objects.dict.DictBuiltins; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.dict.DictNodes; import com.oracle.graal.python.builtins.objects.dict.PDict; +import com.oracle.graal.python.lib.PyDictDelItem; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerAsserts; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateInline; @@ -54,40 +57,44 @@ import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.ExplodeLoop; +import com.oracle.truffle.api.nodes.Node; @GenerateInline(false) // used in BCI root node +@OperationProxy.Proxyable public abstract class CopyDictWithoutKeysNode extends PNodeWithContext { public abstract PDict execute(Frame frame, Object subject, Object[] keys); @Specialization(guards = {"keys.length == keysLength", "keysLength <= 32"}, limit = "1") - static PDict copy(VirtualFrame frame, Object subject, @NeverDefault @SuppressWarnings("unused") Object[] keys, + public static PDict copy(VirtualFrame frame, Object subject, @NeverDefault @SuppressWarnings("unused") Object[] keys, + @Bind("this") Node inliningTarget, @Cached("keys.length") int keysLength, - @Shared @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Shared @Cached DictNodes.UpdateNode updateNode, - @Shared @Cached DictBuiltins.DelItemNode delItemNode) { - PDict rest = factory.createDict(); + @Shared @Cached PyDictDelItem delItem) { + PDict rest = PFactory.createDict(language); updateNode.execute(frame, rest, subject); - deleteKeys(frame, keys, keysLength, delItemNode, rest); + deleteKeys(frame, inliningTarget, keys, keysLength, delItem, rest); return rest; } @ExplodeLoop - private static void deleteKeys(VirtualFrame frame, Object[] keys, int keysLen, DictBuiltins.DelItemNode delItemNode, PDict rest) { + private static void deleteKeys(VirtualFrame frame, Node inliningTarget, Object[] keys, int keysLen, PyDictDelItem delItem, PDict rest) { CompilerAsserts.partialEvaluationConstant(keysLen); for (int i = 0; i < keysLen; i++) { - delItemNode.execute(frame, rest, keys[i]); + delItem.execute(frame, inliningTarget, rest, keys[i]); } } @Specialization(guards = "keys.length > 32") - static PDict copy(VirtualFrame frame, Object subject, Object[] keys, - @Shared @Cached PythonObjectFactory factory, + public static PDict copy(VirtualFrame frame, Object subject, Object[] keys, + @Bind("this") Node inliningTarget, + @Bind PythonLanguage language, @Shared @Cached DictNodes.UpdateNode updateNode, - @Shared @Cached DictBuiltins.DelItemNode delItemNode) { - PDict rest = factory.createDict(); + @Shared @Cached PyDictDelItem delItem) { + PDict rest = PFactory.createDict(language); updateNode.execute(frame, rest, subject); for (int i = 0; i < keys.length; i++) { - delItemNode.execute(frame, rest, keys[i]); + delItem.execute(frame, inliningTarget, rest, keys[i]); } return rest; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/EndAsyncForNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/EndAsyncForNode.java index 14c0f0245e..998ef78a82 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/EndAsyncForNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/EndAsyncForNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -74,7 +74,7 @@ void doNone(PNone none, boolean rootNodeVisible) { } @Specialization - void doPException(PException exception, boolean rootNodeVisible, + static void doPException(PException exception, boolean rootNodeVisible, @Bind("this") Node inliningTarget, @Cached IsBuiltinObjectProfile isStopAsyncIteration) { if (!isStopAsyncIteration.profileException(inliningTarget, exception, PythonBuiltinClassType.StopAsyncIteration)) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ExitAWithNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ExitAWithNode.java index 6b1964778f..3ee0d871b3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ExitAWithNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ExitAWithNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,7 +46,6 @@ import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; @@ -54,7 +53,6 @@ import com.oracle.truffle.api.exception.AbstractTruffleException; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; @GenerateUncached @GenerateInline(false) // Used in BCI @@ -63,7 +61,6 @@ public abstract class ExitAWithNode extends PNodeWithContext { @Specialization int exit(VirtualFrame virtualFrame, int stackTopIn, boolean rootNodeVisible, - @Bind("this") Node inliningTarget, @Cached PyObjectIsTrueNode isTrueNode) { int stackTop = stackTopIn; Object result = virtualFrame.getObject(stackTop); @@ -72,7 +69,7 @@ int exit(VirtualFrame virtualFrame, int stackTopIn, boolean rootNodeVisible, virtualFrame.setObject(stackTop--, null); AbstractTruffleException savedExcState = PArguments.getException(virtualFrame); try { - if (!isTrueNode.execute(virtualFrame, inliningTarget, result) && exception != PNone.NONE) { + if (!isTrueNode.execute(virtualFrame, result) && exception != PNone.NONE) { if (exception instanceof PException) { throw ((PException) exception).getExceptionForReraise(rootNodeVisible); } else if (exception instanceof AbstractTruffleException) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ExitWithNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ExitWithNode.java index f47bce0519..ae7e59d39f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ExitWithNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ExitWithNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,7 +43,6 @@ import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.exception.ExceptionNodes; import com.oracle.graal.python.builtins.objects.function.PArguments; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.lib.PyObjectIsTrueNode; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.call.special.CallQuaternaryMethodNode; @@ -54,7 +53,6 @@ import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.exception.AbstractTruffleException; @@ -63,7 +61,6 @@ import com.oracle.truffle.api.nodes.Node; @GenerateUncached -@ImportStatic(SpecialMethodSlot.class) @GenerateInline(false) // Used in BCI public abstract class ExitWithNode extends PNodeWithContext { public abstract int execute(Frame frame, int stackTop, boolean rootNodeVisible); @@ -97,7 +94,7 @@ int exit(VirtualFrame virtualFrame, int stackTopIn, boolean rootNodeVisible, Object excType = getClassNode.execute(inliningTarget, pythonException); Object excTraceback = getTracebackNode.execute(inliningTarget, pythonException); Object result = callExit.execute(virtualFrame, exit, contextManager, excType, pythonException, excTraceback); - if (!isTrueNode.execute(virtualFrame, inliningTarget, result)) { + if (!isTrueNode.execute(virtualFrame, result)) { if (exception instanceof PException) { throw ((PException) exception).getExceptionForReraise(rootNodeVisible); } else if (exception instanceof AbstractTruffleException) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ForIterINode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ForIterINode.java index 701a7839a8..c35c64eb89 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ForIterINode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ForIterINode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,18 +40,11 @@ */ package com.oracle.graal.python.nodes.bytecode; -import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.iterator.PIntRangeIterator; import com.oracle.graal.python.compiler.QuickeningTypes; -import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.exception.PythonErrorType; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; @@ -64,10 +57,6 @@ import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.InlinedCountingConditionProfile; -/** - * Obtains the next value of an iterator. When the iterator is exhausted it returns {@code null}. It - * never raises {@code StopIteration}. - */ @GenerateUncached @GenerateInline(false) // Used in BCI public abstract class ForIterINode extends PNodeWithContext { @@ -94,29 +83,19 @@ boolean doIntRange(VirtualFrame frame, PIntRangeIterator iterator, int stackTop, @Specialization @InliningCutoff static boolean doGeneric(VirtualFrame frame, Object iterator, int stackTop, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached(parameters = "Next") LookupSpecialMethodSlotNode lookupNext, - @Cached CallUnaryMethodNode callNext, - @Cached IsBuiltinObjectProfile stopIterationProfile, - @Cached PRaiseNode raiseNode) throws QuickeningGeneralizeException { - Object nextMethod = lookupNext.execute(frame, getClassNode.execute(inliningTarget, iterator), iterator); - if (nextMethod == PNone.NO_VALUE) { - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.OBJ_NOT_ITERABLE, iterator); - } + @Bind Node inliningTarget, + @Cached PyIterNextNode nextNode) throws QuickeningGeneralizeException { try { - Object res = callNext.executeObject(frame, nextMethod, iterator); + Object res = nextNode.execute(frame, inliningTarget, iterator); if (res instanceof Integer) { frame.setInt(stackTop, (int) res); return true; } else { CompilerDirectives.transferToInterpreterAndInvalidate(); - // TODO other types frame.setObject(stackTop, res); throw new QuickeningGeneralizeException(QuickeningTypes.OBJECT); } - } catch (PException e) { - e.expectStopIteration(inliningTarget, stopIterationProfile); + } catch (IteratorExhausted e) { return false; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ForIterONode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ForIterONode.java index 06f8a9dabe..1e4084a8c7 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ForIterONode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ForIterONode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,17 +40,10 @@ */ package com.oracle.graal.python.nodes.bytecode; -import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.iterator.PIntRangeIterator; -import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.exception.PythonErrorType; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -62,10 +55,6 @@ import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.InlinedCountingConditionProfile; -/** - * Obtains the next value of an iterator. When the iterator is exhausted it returns {@code null}. It - * never raises {@code StopIteration}. - */ @GenerateUncached @GenerateInline(false) // Used in BCI public abstract class ForIterONode extends PNodeWithContext { @@ -92,22 +81,13 @@ boolean doIntRange(VirtualFrame frame, PIntRangeIterator iterator, int stackTop, @Specialization @InliningCutoff static boolean doGeneric(VirtualFrame frame, Object iterator, int stackTop, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached(parameters = "Next") LookupSpecialMethodSlotNode lookupNext, - @Cached CallUnaryMethodNode callNext, - @Cached IsBuiltinObjectProfile stopIterationProfile, - @Cached PRaiseNode raiseNode) { - assert iterator != null; - Object nextMethod = lookupNext.execute(frame, getClassNode.execute(inliningTarget, iterator), iterator); - if (nextMethod == PNone.NO_VALUE) { - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.OBJ_NOT_ITERABLE, iterator); - } + @Bind Node inliningTarget, + @Cached PyIterNextNode nextNode) { try { - frame.setObject(stackTop, callNext.executeObject(frame, nextMethod, iterator)); + Object res = nextNode.execute(frame, inliningTarget, iterator); + frame.setObject(stackTop, res); return true; - } catch (PException e) { - e.expectStopIteration(inliningTarget, stopIterationProfile); + } catch (IteratorExhausted e) { return false; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/FrameInfo.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/FrameInfo.java index 97a4d69844..3fbc8a948f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/FrameInfo.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/FrameInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,8 +41,7 @@ package com.oracle.graal.python.nodes.bytecode; import com.oracle.graal.python.compiler.CodeUnit; -import com.oracle.graal.python.compiler.OpCodesConstants; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; +import com.oracle.graal.python.nodes.PRootNode; import com.oracle.truffle.api.dsl.Idempotent; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.FrameDescriptor; @@ -53,38 +52,30 @@ * returned by {@link FrameDescriptor#getInfo()} if and only if the frame is coming from the * bytecode interpreter. */ -public final class FrameInfo { - @CompilationFinal PBytecodeRootNode rootNode; +public interface FrameInfo { - public PBytecodeRootNode getRootNode() { - return rootNode; - } + public PRootNode getRootNode(); - public int getBci(Frame frame) { - if (frame.isInt(rootNode.bcioffset)) { - return frame.getInt(rootNode.bcioffset); - } else { - return -1; - } - } + public int getFirstLineNumber(); - public Object getYieldFrom(Frame generatorFrame, int bci, int stackTop) { - /* Match the `yield from` bytecode pattern and get the object from stack */ - if (bci > 3 && bci < rootNode.bytecode.length && rootNode.bytecode[bci - 3] == OpCodesConstants.SEND && rootNode.bytecode[bci - 1] == OpCodesConstants.YIELD_VALUE && - rootNode.bytecode[bci] == OpCodesConstants.RESUME_YIELD) { - return generatorFrame.getObject(stackTop); - } - return null; - } + public Object getYieldFrom(Frame generatorFrame, int bci, int stackTop); + + public boolean includeInTraceback(); + + public CodeUnit getCodeUnit(); @Idempotent - public int getVariableCount() { - CodeUnit code = rootNode.getCodeUnit(); + public default int getVariableCount() { + CodeUnit code = getCodeUnit(); return code.varnames.length + code.cellvars.length + code.freevars.length; } - public TruffleString getVariableName(int slot) { - CodeUnit code = rootNode.getCodeUnit(); + public default int getRegularVariableCount() { + return getCodeUnit().varnames.length; + } + + public default TruffleString getVariableName(int slot) { + CodeUnit code = getCodeUnit(); if (slot < code.varnames.length) { return code.varnames[slot]; } else if (slot < code.varnames.length + code.cellvars.length) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetAExitCoroNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetAExitCoroNode.java index 214d78c0fb..6c264869f9 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetAExitCoroNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetAExitCoroNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,7 +43,6 @@ import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.exception.ExceptionNodes; import com.oracle.graal.python.builtins.objects.function.PArguments; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.call.special.CallQuaternaryMethodNode; import com.oracle.graal.python.nodes.object.GetClassNode; @@ -52,14 +51,12 @@ import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; @GenerateUncached -@ImportStatic(SpecialMethodSlot.class) @GenerateInline(false) // used in BCI root node public abstract class GetAExitCoroNode extends PNodeWithContext { public abstract int execute(Frame frame, int stackTop); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetAIterNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetAIterNode.java index 2465b85a28..c6140ef39d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetAIterNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetAIterNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,30 +42,26 @@ import static com.oracle.graal.python.nodes.ErrorMessages.ASYNC_FOR_NO_AITER; import static com.oracle.graal.python.nodes.ErrorMessages.ASYNC_FOR_NO_ANEXT_INITIAL; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ANEXT__; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotUnaryFunc.CallSlotUnaryNode; +import com.oracle.graal.python.lib.PyAIterCheckNode; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.attributes.LookupInheritedAttributeNode; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; +import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; +import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedBranchProfile; @GenerateUncached -@ImportStatic(SpecialMethodSlot.class) @GenerateInline(false) // used in bytecode root node public abstract class GetAIterNode extends PNodeWithContext { public abstract Object execute(Frame frame, Object receiver); @@ -74,32 +70,28 @@ public static GetAIterNode getUncached() { return GetAIterNodeGen.getUncached(); } + @NeverDefault public static GetAIterNode create() { return GetAIterNodeGen.create(); } @Specialization - Object doGeneric(Frame frame, Object receiver, + Object doGeneric(VirtualFrame frame, Object receiver, @Bind("this") Node inliningTarget, - @Cached(parameters = "AIter") LookupSpecialMethodSlotNode getAIter, @Cached GetClassNode getAsyncIterType, - @Cached PRaiseNode.Lazy raiseNoAIter, - @Cached TypeNodes.GetNameNode getName, - @Cached InlinedBranchProfile errorProfile, - @Cached CallUnaryMethodNode callAIter, - @Cached LookupInheritedAttributeNode.Dynamic lookupANext) { - + @Cached GetCachedTpSlotsNode getSlots, + @Cached CallSlotUnaryNode callSlot, + @Cached PRaiseNode raiseNoAIter, + @Cached PRaiseNode raiseNoANext, + @Cached PyAIterCheckNode checkNode) { Object type = getAsyncIterType.execute(inliningTarget, receiver); - Object getter = getAIter.execute(frame, type, receiver); - if (getter == PNone.NO_VALUE) { - errorProfile.enter(this); - throw raiseNoAIter.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ASYNC_FOR_NO_AITER, getName.execute(inliningTarget, type)); + TpSlots slots = getSlots.execute(inliningTarget, type); + if (slots.am_aiter() == null) { + throw raiseNoAIter.raise(inliningTarget, PythonBuiltinClassType.TypeError, ASYNC_FOR_NO_AITER, type); } - Object asyncIterator = callAIter.executeObject(frame, getter, receiver); - Object anext = lookupANext.execute(inliningTarget, asyncIterator, T___ANEXT__); - if (anext == PNone.NO_VALUE) { - errorProfile.enter(this); - throw raiseNoAIter.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ASYNC_FOR_NO_ANEXT_INITIAL, getName.execute(inliningTarget, type)); + Object asyncIterator = callSlot.execute(frame, inliningTarget, slots.am_aiter(), receiver); + if (!checkNode.execute(inliningTarget, asyncIterator)) { + throw raiseNoANext.raise(inliningTarget, PythonBuiltinClassType.TypeError, ASYNC_FOR_NO_ANEXT_INITIAL, asyncIterator); } return asyncIterator; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetANextNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetANextNode.java index deb1141529..98d34fb242 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetANextNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetANextNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,30 +44,26 @@ import static com.oracle.graal.python.nodes.ErrorMessages.ASYNC_FOR_NO_ANEXT_ITERATION; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.asyncio.GetAwaitableNode; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotUnaryFunc.CallSlotUnaryNode; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.Frame; +import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedBranchProfile; @GenerateUncached -@ImportStatic(SpecialMethodSlot.class) @GenerateInline(false) // used in bytecode root node public abstract class GetANextNode extends PNodeWithContext { - public abstract Object execute(Frame frame, Object receiver); + public abstract Object execute(VirtualFrame frame, Object receiver); public static GetANextNode getUncached() { return GetANextNodeGen.getUncached(); @@ -78,27 +74,24 @@ public static GetANextNode create() { } @Specialization - Object doGeneric(Frame frame, Object receiver, + Object doGeneric(VirtualFrame frame, Object receiver, @Bind("this") Node inliningTarget, - @Cached(parameters = "ANext") LookupSpecialMethodSlotNode getANext, @Cached GetClassNode getAsyncIterType, + @Cached GetCachedTpSlotsNode getSlots, + @Cached CallSlotUnaryNode callSlot, @Cached PRaiseNode raiseNoANext, - @Cached InlinedBranchProfile errorProfile, - @Cached CallUnaryMethodNode callANext, @Cached PRaiseNode raiseInvalidObject, - @Cached(neverDefault = true) GetAwaitableNode getAwaitable) { + @Cached GetAwaitableNode getAwaitable) { Object type = getAsyncIterType.execute(inliningTarget, receiver); - Object getter = getANext.execute(frame, type, receiver); - if (getter == PNone.NO_VALUE) { - errorProfile.enter(inliningTarget); - throw raiseNoANext.raise(PythonBuiltinClassType.TypeError, ASYNC_FOR_NO_ANEXT_ITERATION, receiver); + TpSlots slots = getSlots.execute(inliningTarget, type); + if (slots.am_anext() == null) { + throw raiseNoANext.raise(inliningTarget, PythonBuiltinClassType.TypeError, ASYNC_FOR_NO_ANEXT_ITERATION, receiver); } - Object anext = callANext.executeObject(frame, getter, receiver); + Object anext = callSlot.execute(frame, inliningTarget, slots.am_anext(), receiver); try { return getAwaitable.execute(frame, anext); } catch (PException e) { - errorProfile.enter(inliningTarget); - throw raiseInvalidObject.raiseWithCause(PythonBuiltinClassType.TypeError, e, ANEXT_INVALID_OBJECT, anext); + throw raiseInvalidObject.raiseWithCause(inliningTarget, PythonBuiltinClassType.TypeError, e, ANEXT_INVALID_OBJECT, anext); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetSendValueNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetSendValueNode.java index 45587123f8..a9149f87ef 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetSendValueNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetSendValueNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,6 +47,7 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; @GenerateUncached @@ -69,6 +70,7 @@ Object doSend(Object obj) { return obj; } + @NeverDefault public static GetSendValueNode create() { return GetSendValueNodeGen.create(); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetTPFlagsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetTPFlagsNode.java index 73f593079c..c958a54986 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetTPFlagsNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetTPFlagsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,6 +47,7 @@ import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.Node; @@ -63,6 +64,7 @@ long get(Object object, return getTypeFlagsNode.execute(getClassNode.execute(inliningTarget, object)); } + @NeverDefault public static GetTPFlagsNode create() { return GetTPFlagsNodeGen.create(); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetYieldFromIterNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetYieldFromIterNode.java index 274e748b5a..c746d74f2e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetYieldFromIterNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/GetYieldFromIterNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,18 +44,20 @@ import com.oracle.graal.python.builtins.objects.generator.PGenerator; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectExactProfile; +import com.oracle.truffle.api.bytecode.OperationProxy; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.Frame; +import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; @GenerateUncached @GenerateInline(false) // used in BCI root node +@OperationProxy.Proxyable public abstract class GetYieldFromIterNode extends Node { - public abstract Object execute(Frame frame, Object receiver); + public abstract Object execute(VirtualFrame frame, Object receiver); @Specialization public static Object getGeneratorOrCoroutine(PGenerator arg) { @@ -64,7 +66,7 @@ public static Object getGeneratorOrCoroutine(PGenerator arg) { } @Specialization - public static Object getGeneric(Frame frame, Object arg, + public static Object getGeneric(VirtualFrame frame, Object arg, @Bind("this") Node inliningTarget, @Cached PyObjectGetIter getIter, @Cached IsBuiltinObjectExactProfile isCoro) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ImportFromNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ImportFromNode.java index 98e70f902c..c064de5fbc 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ImportFromNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ImportFromNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -62,6 +62,7 @@ import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; @@ -128,6 +129,7 @@ private Object tryResolveCircularImport(Object module, TruffleString name) { } } + @NeverDefault public static ImportFromNode create() { return ImportFromNodeGen.create(); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ImportNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ImportNode.java index a55b537958..637f93662e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ImportNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ImportNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -63,6 +63,7 @@ Object doImport(VirtualFrame frame, TruffleString name, Object globals, @NeverDe return importModule(frame, name, globals, cachedFromList, level, importName); } + @NeverDefault public static ImportNode create() { return ImportNodeGen.create(); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ImportStarNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ImportStarNode.java index 5210ab2ea2..dc27691d43 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ImportStarNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/ImportStarNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -35,7 +35,8 @@ import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.builtins.objects.mappingproxy.PMappingproxy; import com.oracle.graal.python.builtins.objects.module.PythonModule; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyObjectGetAttr; import com.oracle.graal.python.lib.PyObjectGetItem; import com.oracle.graal.python.lib.PyObjectGetIter; @@ -83,15 +84,14 @@ void doImport(VirtualFrame frame, TruffleString moduleName, int level, @Cached GetOrCreateDictNode getDictNode, @Cached PyObjectGetAttr getAttrNode, @Cached PyObjectGetIter getIterNode, - @Cached GetNextNode getNextNode, + @Cached PyIterNextNode nextNode, @Cached PyObjectSizeNode sizeNode, @Cached PyObjectGetItem getItemNode, @Cached InlinedConditionProfile javaImport, @Cached CastToTruffleStringNode castToTruffleStringNode, @Cached TruffleString.CodePointLengthNode codePointLengthNode, @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode, - @Cached IsBuiltinObjectProfile isAttributeErrorProfile, - @Cached IsBuiltinObjectProfile isStopIterationProfile) { + @Cached IsBuiltinObjectProfile isAttributeErrorProfile) { Object importedModule = importModule(frame, moduleName, PArguments.getGlobals(frame), T_IMPORT_ALL, level, importNameNode); Object locals = PArguments.getSpecialArgument(frame); if (locals == null) { @@ -128,14 +128,14 @@ void doImport(VirtualFrame frame, TruffleString moduleName, int level, assert importedModule instanceof PythonModule; Object keysIterator = getIterNode.execute(frame, inliningTarget, getDictNode.execute(inliningTarget, importedModule)); while (true) { + Object key; try { - Object key = getNextNode.execute(frame, keysIterator); - writeAttributeToLocals(frame, inliningTarget, moduleName, (PythonModule) importedModule, locals, key, false, castToTruffleStringNode, codePointLengthNode, - codePointAtIndexNode, getAttrNode, setItemNode, setAttrNode); - } catch (PException iterException) { - iterException.expectStopIteration(inliningTarget, isStopIterationProfile); + key = nextNode.execute(frame, inliningTarget, keysIterator); + } catch (IteratorExhausted e1) { break; } + writeAttributeToLocals(frame, inliningTarget, moduleName, (PythonModule) importedModule, locals, key, false, castToTruffleStringNode, codePointLengthNode, + codePointAtIndexNode, getAttrNode, setItemNode, setAttrNode); } } } @@ -164,8 +164,8 @@ private void writeAttributeToLocals(VirtualFrame frame, Node inliningTarget, Tru writeAttribute(frame, inliningTarget, locals, name, moduleAttr, dictWriteNode, setAttrNode); } } catch (CannotCastException cce) { - throw PRaiseNode.raiseUncached(this, TypeError, fromAll ? ErrorMessages.ITEM_IN_S_MUST_BE_STRING : ErrorMessages.KEY_IN_S_MUST_BE_STRING, - moduleName, fromAll ? T___ALL__ : T___DICT__, attrName); + TruffleString format = fromAll ? ErrorMessages.ITEM_IN_S_MUST_BE_STRING : ErrorMessages.KEY_IN_S_MUST_BE_STRING; + throw PRaiseNode.raiseStatic(this, TypeError, format, moduleName, fromAll ? T___ALL__ : T___DICT__, attrName); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/InNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/InNode.java new file mode 100644 index 0000000000..2d928803f2 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/InNode.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.bytecode; + +import com.oracle.graal.python.lib.PySequenceContainsNode; +import com.oracle.graal.python.nodes.expression.BinaryOpNode; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; + +@GenerateInline(false) +abstract class InNode extends BinaryOpNode { + + @Specialization + Object contains(VirtualFrame frame, Object item, Object container, + @Bind Node inliningTarget, + @Cached PySequenceContainsNode containsNode) { + return containsNode.execute(frame, inliningTarget, container, item); + } + + @NeverDefault + public static InNode create() { + return InNodeGen.create(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/KeywordsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/KeywordsNode.java index 5dd96fb4bf..480590e93a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/KeywordsNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/KeywordsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -66,15 +66,15 @@ static PKeyword[] kwords(VirtualFrame frame, Object sourceCollection, int stackT @Cached MappingToKeywordsNode expandKeywordStarargsNode, @Cached InlinedBranchProfile keywordsError1, @Cached InlinedBranchProfile keywordsError2, - @Cached PRaiseNode.Lazy raise) { + @Cached PRaiseNode raise) { try { return expandKeywordStarargsNode.execute(frame, inliningTarget, sourceCollection); } catch (SameDictKeyException e) { keywordsError1.enter(inliningTarget); - throw handleSameKey(frame, raise.get(inliningTarget), stackTop, e); + throw handleSameKey(frame, inliningTarget, raise, stackTop, e); } catch (NonMappingException e) { keywordsError2.enter(inliningTarget); - throw handleNonMapping(frame, raise.get(inliningTarget), stackTop, e); + throw handleNonMapping(frame, inliningTarget, raise, stackTop, e); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/KwargsMergeNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/KwargsMergeNode.java index f0326ea589..b6165bc651 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/KwargsMergeNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/KwargsMergeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -65,7 +65,7 @@ public abstract class KwargsMergeNode extends AbstractKwargsNode { static int merge(VirtualFrame frame, int initialStackTop, @Bind("this") Node inliningTarget, @Cached ConcatDictToStorageNode concatNode, - @Cached PRaiseNode.Lazy raise, + @Cached PRaiseNode raise, @Cached InlinedBranchProfile keywordsError1, @Cached InlinedBranchProfile keywordsError2) { int stackTop = initialStackTop; @@ -77,10 +77,10 @@ static int merge(VirtualFrame frame, int initialStackTop, dict.setDictStorage(resultStorage); } catch (SameDictKeyException e) { keywordsError1.enter(inliningTarget); - throw handleSameKey(frame, raise.get(inliningTarget), stackTop, e); + throw handleSameKey(frame, inliningTarget, raise, stackTop, e); } catch (NonMappingException e) { keywordsError2.enter(inliningTarget); - throw handleNonMapping(frame, raise.get(inliningTarget), stackTop, e); + throw handleNonMapping(frame, inliningTarget, raise, stackTop, e); } return stackTop; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/MakeFunctionNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/MakeFunctionNode.java index b032f7da80..afa5ff1048 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/MakeFunctionNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/MakeFunctionNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -49,16 +49,17 @@ import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.function.Signature; import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.graal.python.compiler.CodeUnit; +import com.oracle.graal.python.compiler.BytecodeCodeUnit; import com.oracle.graal.python.compiler.OpCodes; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.attributes.WriteAttributeToPythonObjectNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.Assumption; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.Truffle; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; @@ -66,16 +67,15 @@ public abstract class MakeFunctionNode extends PNodeWithContext { private final RootCallTarget callTarget; - private final CodeUnit code; + private final BytecodeCodeUnit code; private final Signature signature; @CompilationFinal private PCode cachedCode; - private final Assumption sharedCodeStableAssumption = Truffle.getRuntime().createAssumption("shared code stable assumption"); - private final Assumption sharedDefaultsStableAssumption = Truffle.getRuntime().createAssumption("shared defaults stable assumption"); + private final Assumption codeStableAssumption = Truffle.getRuntime().createAssumption("code stable assumption"); public abstract int execute(VirtualFrame frame, Object globals, int initialStackTop, int flags); - public MakeFunctionNode(RootCallTarget callTarget, CodeUnit code, Signature signature) { + public MakeFunctionNode(RootCallTarget callTarget, BytecodeCodeUnit code, Signature signature) { this.callTarget = callTarget; this.code = code; this.signature = signature; @@ -83,7 +83,7 @@ public MakeFunctionNode(RootCallTarget callTarget, CodeUnit code, Signature sign @Specialization int makeFunction(VirtualFrame frame, Object globals, int initialStackTop, int flags, - @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached WriteAttributeToPythonObjectNode writeAttrNode) { int stackTop = initialStackTop; @@ -95,10 +95,10 @@ int makeFunction(VirtualFrame frame, Object globals, int initialStackTop, int fl * We cannot initialize the cached code in create, because that may be called * without langauge context when materializing nodes for instrumentation */ - cachedCode = codeObj = factory.createCode(callTarget, signature, code); + cachedCode = codeObj = PFactory.createCode(language, callTarget, signature, code); } else { // In multi-context mode we have to create the code for every execution - codeObj = factory.createCode(callTarget, signature, code); + codeObj = PFactory.createCode(language, callTarget, signature, code); } } @@ -124,16 +124,7 @@ int makeFunction(VirtualFrame frame, Object globals, int initialStackTop, int fl frame.setObject(stackTop--, null); } - Assumption codeStableAssumption; - Assumption defaultsStableAssumption; - if (CompilerDirectives.inCompiledCode()) { - codeStableAssumption = sharedCodeStableAssumption; - defaultsStableAssumption = sharedDefaultsStableAssumption; - } else { - codeStableAssumption = Truffle.getRuntime().createAssumption(); - defaultsStableAssumption = Truffle.getRuntime().createAssumption(); - } - PFunction function = factory.createFunction(code.name, code.qualname, codeObj, (PythonObject) globals, defaults, kwdefaults, closure, codeStableAssumption, defaultsStableAssumption); + PFunction function = PFactory.createFunction(language, code.name, code.qualname, codeObj, (PythonObject) globals, defaults, kwdefaults, closure, codeStableAssumption); if (annotations != null) { writeAttrNode.execute(function, T___ANNOTATIONS__, annotations); @@ -143,7 +134,7 @@ int makeFunction(VirtualFrame frame, Object globals, int initialStackTop, int fl return stackTop; } - public static MakeFunctionNode create(PythonLanguage language, CodeUnit code, Source source) { + public static MakeFunctionNode create(PythonLanguage language, BytecodeCodeUnit code, Source source) { RootCallTarget callTarget; PBytecodeRootNode bytecodeRootNode = PBytecodeRootNode.create(language, code, source); if (code.isGeneratorOrCoroutine()) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/MatchClassNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/MatchClassNode.java index e943d7bf1e..bf3c37fd01 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/MatchClassNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/MatchClassNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,10 +44,12 @@ import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MATCH_ARGS; import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.BuiltinFunctions; import com.oracle.graal.python.builtins.objects.str.StringBuiltins; import com.oracle.graal.python.builtins.objects.tuple.TupleBuiltins; import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.lib.PyObjectGetAttrO; import com.oracle.graal.python.lib.PyTupleCheckExactNode; import com.oracle.graal.python.lib.PyTupleSizeNode; @@ -57,7 +59,7 @@ import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -83,16 +85,16 @@ Object match(VirtualFrame frame, Object subject, Object type, int nargs, @NeverD @Cached PyObjectGetAttrO getAttr, @Cached TypeNodes.GetTypeFlagsNode getTypeFlagsNode, @Cached IsBuiltinObjectProfile isClassProfile, - @Cached StringBuiltins.EqNode eqStrNode, + @Cached StringBuiltins.StringRichCmpNode eqStrNode, @Cached PyTupleCheckExactNode tupleCheckExactNode, - @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached PyTupleSizeNode tupleSizeNode, @Cached TupleBuiltins.GetItemNode getItemNode, @Cached PyUnicodeCheckNode unicodeCheckNode, @Cached PRaiseNode raise) { if (!isTypeNode.execute(inliningTarget, type)) { - throw raise.raise(TypeError, ErrorMessages.CALLED_MATCH_PAT_MUST_BE_TYPE); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.CALLED_MATCH_PAT_MUST_BE_TYPE); } if (!isInstanceNode.executeWith(frame, subject, type)) { @@ -110,7 +112,7 @@ Object match(VirtualFrame frame, Object subject, Object type, int nargs, @NeverD try { matchArgs = getAttr.execute(frame, inliningTarget, type, T___MATCH_ARGS); if (!tupleCheckExactNode.execute(inliningTarget, matchArgs)) { - throw raise.raise(TypeError, ErrorMessages.P_MATCH_ARGS_MUST_BE_A_TUPLE_GOT_P, type, matchArgs); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.P_MATCH_ARGS_MUST_BE_A_TUPLE_GOT_P, type, matchArgs); } } catch (PException e) { // _Py_TPFLAGS_MATCH_SELF is only acknowledged if the type does not @@ -118,12 +120,12 @@ Object match(VirtualFrame frame, Object subject, Object type, int nargs, @NeverD // it's as if __match_args__ is some "magic" value that is lost as // soon as they redefine it. e.expectAttributeError(inliningTarget, isClassProfile); - matchArgs = factory.createEmptyTuple(); + matchArgs = PFactory.createEmptyTuple(language); matchSelf = (getTypeFlagsNode.execute(type) & MATCH_SELF) != 0; } int allowed = matchSelf ? 1 : tupleSizeNode.execute(inliningTarget, matchArgs); if (allowed < nargs) { - throw raise.raise(TypeError, ErrorMessages.P_ACCEPTS_D_POS_SUBARG_S_D_GIVEN, type, allowed, (allowed == 1) ? "" : "s", nargs); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.P_ACCEPTS_D_POS_SUBARG_S_D_GIVEN, type, allowed, (allowed == 1) ? "" : "s", nargs); } if (matchSelf) { // Easy. Copy the subject itself, and move on to kwargs. @@ -138,20 +140,20 @@ Object match(VirtualFrame frame, Object subject, Object type, int nargs, @NeverD } // Finally, the keyword subpatterns: getKwArgs(frame, inliningTarget, subject, type, kwArgs, seen, seenLength, attrs, attrsLength, getAttr, eqStrNode, raise); - return factory.createList(attrs); + return PFactory.createList(language, attrs); } @ExplodeLoop private static void getArgs(VirtualFrame frame, Node inliningTarget, Object subject, Object type, int nargs, Object[] seen, int[] seenLength, Object[] attrs, int[] attrsLength, Object matchArgs, PyObjectGetAttrO getAttr, - StringBuiltins.EqNode eqStrNode, TupleBuiltins.GetItemNode getItemNode, PyUnicodeCheckNode unicodeCheckNode, PRaiseNode raise) { + StringBuiltins.StringRichCmpNode eqStrNode, TupleBuiltins.GetItemNode getItemNode, PyUnicodeCheckNode unicodeCheckNode, PRaiseNode raise) { CompilerAsserts.partialEvaluationConstant(nargs); for (int i = 0; i < nargs; i++) { Object name = getItemNode.execute(frame, matchArgs, i); if (!unicodeCheckNode.execute(inliningTarget, name)) { - throw raise.raise(TypeError, ErrorMessages.MATCH_ARGS_ELEMENTS_MUST_BE_STRINGS_GOT_P, name); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.MATCH_ARGS_ELEMENTS_MUST_BE_STRINGS_GOT_P, name); } - setName(frame, type, name, seen, seenLength, eqStrNode, raise); + setName(frame, inliningTarget, type, name, seen, seenLength, eqStrNode, raise); attrs[attrsLength[0]++] = getAttr.execute(frame, inliningTarget, subject, name); } } @@ -159,27 +161,27 @@ private static void getArgs(VirtualFrame frame, Node inliningTarget, Object subj @ExplodeLoop private static void getKwArgs(VirtualFrame frame, Node inliningTarget, Object subject, Object type, TruffleString[] kwArgs, Object[] seen, int[] seenLength, Object[] attrs, int[] attrsLength, PyObjectGetAttrO getAttr, - StringBuiltins.EqNode eqStrNode, PRaiseNode raise) { + StringBuiltins.StringRichCmpNode eqStrNode, PRaiseNode raise) { CompilerAsserts.partialEvaluationConstant(kwArgs); for (int i = 0; i < kwArgs.length; i++) { TruffleString name = kwArgs[i]; CompilerAsserts.partialEvaluationConstant(name); - setName(frame, type, name, seen, seenLength, eqStrNode, raise); + setName(frame, inliningTarget, type, name, seen, seenLength, eqStrNode, raise); attrs[attrsLength[0]++] = getAttr.execute(frame, inliningTarget, subject, name); } } - private static void setName(VirtualFrame frame, Object type, Object name, Object[] seen, int[] seenLength, StringBuiltins.EqNode eqNode, PRaiseNode raise) { + private static void setName(VirtualFrame frame, Node inliningTarget, Object type, Object name, Object[] seen, int[] seenLength, StringBuiltins.StringRichCmpNode eqNode, PRaiseNode raise) { if (seenLength[0] > 0 && contains(frame, seen, name, eqNode)) { - throw raise.raise(TypeError, ErrorMessages.S_GOT_MULTIPLE_SUBPATTERNS_FOR_ATTR_S, type, name); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.S_GOT_MULTIPLE_SUBPATTERNS_FOR_ATTR_S, type, name); } seen[seenLength[0]++] = name; } @ExplodeLoop - private static boolean contains(VirtualFrame frame, Object[] seen, Object name, StringBuiltins.EqNode eqNode) { + private static boolean contains(VirtualFrame frame, Object[] seen, Object name, StringBuiltins.StringRichCmpNode eqNode) { for (int i = 0; i < seen.length; i++) { - if (seen[i] != null && (boolean) eqNode.execute(frame, seen[i], name)) { + if (seen[i] != null && (boolean) eqNode.execute(frame, seen[i], name, RichCmpOp.Py_EQ)) { return true; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/MatchKeysNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/MatchKeysNode.java index 78329dbc91..a1119fee86 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/MatchKeysNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/MatchKeysNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,13 +43,14 @@ import static com.oracle.graal.python.nodes.SpecialMethodNames.T_GET; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.lib.PyObjectRichCompareBool; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.dsl.Bind; @@ -71,17 +72,16 @@ public abstract class MatchKeysNode extends PNodeWithContext { static Object matchCached(VirtualFrame frame, Object map, @NeverDefault Object[] keys, @Bind("this") Node inliningTarget, @Cached("keys.length") int keysLen, - @Shared @Cached PyObjectRichCompareBool.EqNode compareNode, + @Shared @Cached PyObjectRichCompareBool compareNode, @Shared @Cached PyObjectCallMethodObjArgs callMethod, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raise) { + @Shared @Cached PRaiseNode raise) { Object[] values = getValues(frame, inliningTarget, map, keys, keysLen, compareNode, callMethod, raise); - return values != null ? factory.createTuple(values) : PNone.NONE; + return values != null ? PFactory.createTuple(PythonLanguage.get(inliningTarget), values) : PNone.NONE; } @ExplodeLoop - private static Object[] getValues(VirtualFrame frame, Node inliningTarget, Object map, Object[] keys, int keysLen, PyObjectRichCompareBool.EqNode compareNode, PyObjectCallMethodObjArgs callMethod, - PRaiseNode.Lazy raise) { + private static Object[] getValues(VirtualFrame frame, Node inliningTarget, Object map, Object[] keys, int keysLen, PyObjectRichCompareBool compareNode, PyObjectCallMethodObjArgs callMethod, + PRaiseNode raise) { CompilerAsserts.partialEvaluationConstant(keysLen); Object[] values = new Object[keysLen]; Object dummy = new Object(); @@ -100,10 +100,10 @@ private static Object[] getValues(VirtualFrame frame, Node inliningTarget, Objec } @ExplodeLoop - private static void checkSeen(VirtualFrame frame, Node inliningTarget, PRaiseNode.Lazy raise, Object[] seen, Object key, PyObjectRichCompareBool.EqNode compareNode) { + private static void checkSeen(VirtualFrame frame, Node inliningTarget, PRaiseNode raise, Object[] seen, Object key, PyObjectRichCompareBool compareNode) { for (int i = 0; i < seen.length; i++) { - if (seen[i] != null && compareNode.compare(frame, inliningTarget, seen[i], key)) { - raise.get(inliningTarget).raise(ValueError, ErrorMessages.MAPPING_PATTERN_CHECKS_DUPE_KEY_S, key); + if (seen[i] != null && compareNode.executeEq(frame, inliningTarget, seen[i], key)) { + raise.raise(inliningTarget, ValueError, ErrorMessages.MAPPING_PATTERN_CHECKS_DUPE_KEY_S, key); } } } @@ -111,19 +111,18 @@ private static void checkSeen(VirtualFrame frame, Node inliningTarget, PRaiseNod @Specialization(guards = "keys.length > 0", replaces = "matchCached") static Object match(VirtualFrame frame, Object map, Object[] keys, @Bind("this") Node inliningTarget, - @Shared @Cached PyObjectRichCompareBool.EqNode compareNode, + @Shared @Cached PyObjectRichCompareBool compareNode, @Shared @Cached PyObjectCallMethodObjArgs callMethod, - @Shared @Cached PythonObjectFactory factory, - @Shared @Cached PRaiseNode.Lazy raise) { + @Shared @Cached PRaiseNode raise) { if (keys.length == 0) { - return factory.createTuple(PythonUtils.EMPTY_OBJECT_ARRAY); + return PFactory.createTuple(PythonLanguage.get(inliningTarget), PythonUtils.EMPTY_OBJECT_ARRAY); } Object[] values = getValuesLongArray(frame, inliningTarget, map, keys, compareNode, callMethod, raise); - return values != null ? factory.createTuple(values) : PNone.NONE; + return values != null ? PFactory.createTuple(PythonLanguage.get(inliningTarget), values) : PNone.NONE; } - private static Object[] getValuesLongArray(VirtualFrame frame, Node inliningTarget, Object map, Object[] keys, PyObjectRichCompareBool.EqNode compareNode, PyObjectCallMethodObjArgs callMethod, - PRaiseNode.Lazy raise) { + private static Object[] getValuesLongArray(VirtualFrame frame, Node inliningTarget, Object map, Object[] keys, PyObjectRichCompareBool compareNode, PyObjectCallMethodObjArgs callMethod, + PRaiseNode raise) { Object[] values = new Object[keys.length]; Object dummy = new Object(); Object[] seen = new Object[keys.length]; @@ -140,18 +139,18 @@ private static Object[] getValuesLongArray(VirtualFrame frame, Node inliningTarg return values; } - private static void checkSeenLongArray(VirtualFrame frame, Node inliningTarget, PRaiseNode.Lazy raise, Object[] seen, Object key, PyObjectRichCompareBool.EqNode compareNode) { + private static void checkSeenLongArray(VirtualFrame frame, Node inliningTarget, PRaiseNode raise, Object[] seen, Object key, PyObjectRichCompareBool compareNode) { for (int i = 0; i < seen.length; i++) { - if (seen[i] != null && compareNode.compare(frame, inliningTarget, seen[i], key)) { - raise.get(inliningTarget).raise(ValueError, ErrorMessages.MAPPING_PATTERN_CHECKS_DUPE_KEY_S, key); + if (seen[i] != null && compareNode.executeEq(frame, inliningTarget, seen[i], key)) { + raise.raise(inliningTarget, ValueError, ErrorMessages.MAPPING_PATTERN_CHECKS_DUPE_KEY_S, key); } } } @Specialization(guards = "keys.length == 0") static Object matchNoKeys(@SuppressWarnings("unused") Object map, @SuppressWarnings("unused") Object[] keys, - @Shared @Cached PythonObjectFactory factory) { - return factory.createTuple(PythonUtils.EMPTY_OBJECT_ARRAY); + @Bind PythonLanguage language) { + return PFactory.createTuple(language, PythonUtils.EMPTY_OBJECT_ARRAY); } public static MatchKeysNode create() { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/NotNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/NotNode.java new file mode 100644 index 0000000000..83a68bac42 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/NotNode.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.bytecode; + +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageLen; +import com.oracle.graal.python.builtins.objects.dict.PDict; +import com.oracle.graal.python.builtins.objects.list.PList; +import com.oracle.graal.python.builtins.objects.set.PBaseSet; +import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.lib.PyObjectIsTrueNode; +import com.oracle.graal.python.lib.PyObjectIsTrueNode.PyObjectIsTrueNodeGeneric; +import com.oracle.graal.python.nodes.expression.UnaryOpNode; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Exclusive; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.strings.TruffleString; + +/** + * Equivalent of a negation of CPython's {@code PyObject_IsTrue}. This class exists only so that we + * can have quickening fast-paths for this operation. The fast-paths should be synchronized with + * {@link PyObjectIsTrueNode}. + */ +@GenerateInline(false) +@OperationProxy.Proxyable +public abstract class NotNode extends UnaryOpNode { + + @Specialization + public static boolean doBoolean(boolean object) { + return !object; + } + + @Specialization + public static boolean doNone(@SuppressWarnings("unused") PNone object) { + return true; + } + + @Specialization + public static boolean doInt(int object) { + return object == 0; + } + + @Specialization + public static boolean doLong(long object) { + return object == 0; + } + + @Specialization + public static boolean doDouble(double object) { + return object == 0.0; + } + + @Specialization + public static boolean doString(TruffleString object) { + return object.isEmpty(); + } + + @Specialization(guards = "isBuiltinList(object)") + public static boolean doList(PList object) { + return object.getSequenceStorage().length() == 0; + } + + @Specialization(guards = "isBuiltinTuple(object)") + public static boolean doTuple(PTuple object) { + return object.getSequenceStorage().length() == 0; + } + + @Specialization(guards = "isBuiltinDict(object)") + public static boolean doDict(PDict object, + @Bind Node inliningTarget, + @Exclusive @Cached HashingStorageLen lenNode) { + return lenNode.execute(inliningTarget, object.getDictStorage()) == 0; + } + + @Specialization(guards = "isBuiltinAnySet(object)") + @InliningCutoff + public static boolean doSet(PBaseSet object, + @Bind Node inliningTarget, + @Exclusive @Cached HashingStorageLen lenNode) { + return lenNode.execute(inliningTarget, object.getDictStorage()) == 0; + } + + @Specialization(guards = {"!isBoolean(object)", "!isPNone(object)", "!isInt(object)", "!isLong(object)", "!isDouble(object)", "!isTruffleString(object)"}, // + replaces = {"doList", "doTuple", "doDict", "doSet"}) + @InliningCutoff + public static boolean doOthers(VirtualFrame frame, Object object, + @Cached(inline = false) PyObjectIsTrueNodeGeneric internalNode) { + return !internalNode.execute(frame, object); + } + + @NeverDefault + public static NotNode create() { + return NotNodeGen.create(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PBytecodeGeneratorFunctionRootNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PBytecodeGeneratorFunctionRootNode.java index d3d8e9abe7..01dec11746 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PBytecodeGeneratorFunctionRootNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PBytecodeGeneratorFunctionRootNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,7 +45,7 @@ import com.oracle.graal.python.builtins.objects.function.PFunction; import com.oracle.graal.python.builtins.objects.function.Signature; import com.oracle.graal.python.nodes.PRootNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; @@ -63,7 +63,6 @@ public class PBytecodeGeneratorFunctionRootNode extends PRootNode { @CompilationFinal(dimensions = 1) private final RootCallTarget[] callTargets; - @Child private PythonObjectFactory factory = PythonObjectFactory.create(); private final ConditionProfile isIterableCoroutine = ConditionProfile.create(); @TruffleBoundary @@ -80,7 +79,8 @@ public PBytecodeGeneratorFunctionRootNode(PythonLanguage language, FrameDescript public Object execute(VirtualFrame frame) { Object[] arguments = frame.getArguments(); - // This is passed from InvokeNode node + PythonLanguage language = PythonLanguage.get(this); + // This is passed from the dispatch node PFunction generatorFunction = PArguments.getGeneratorFunction(arguments); assert generatorFunction != null; if (rootNode.getCodeUnit().isGenerator()) { @@ -88,14 +88,14 @@ public Object execute(VirtualFrame frame) { // pass the information to the generator // .gi_code.co_flags will still be wrong, but at least await will work correctly if (isIterableCoroutine.profile((generatorFunction.getCode().getFlags() & 0x100) != 0)) { - return factory.createIterableCoroutine(generatorFunction.getName(), generatorFunction.getQualname(), rootNode, callTargets, arguments); + return PFactory.createIterableCoroutine(language, generatorFunction.getName(), generatorFunction.getQualname(), rootNode, callTargets, arguments); } else { - return factory.createGenerator(generatorFunction.getName(), generatorFunction.getQualname(), rootNode, callTargets, arguments); + return PFactory.createGenerator(language, generatorFunction.getName(), generatorFunction.getQualname(), rootNode, callTargets, arguments); } } else if (rootNode.getCodeUnit().isCoroutine()) { - return factory.createCoroutine(generatorFunction.getName(), generatorFunction.getQualname(), rootNode, callTargets, arguments); + return PFactory.createCoroutine(language, generatorFunction.getName(), generatorFunction.getQualname(), rootNode, callTargets, arguments); } else if (rootNode.getCodeUnit().isAsyncGenerator()) { - return factory.createAsyncGenerator(generatorFunction.getName(), generatorFunction.getQualname(), rootNode, callTargets, arguments); + return PFactory.createAsyncGenerator(language, generatorFunction.getName(), generatorFunction.getQualname(), rootNode, callTargets, arguments); } throw CompilerDirectives.shouldNotReachHere("Unknown generator/coroutine type"); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PBytecodeRootNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PBytecodeRootNode.java index 8d5ed625b3..2ef13f97bc 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PBytecodeRootNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PBytecodeRootNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -52,7 +52,6 @@ import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; import java.math.BigInteger; -import java.util.Arrays; import java.util.Collections; import java.util.Set; import java.util.concurrent.locks.Lock; @@ -66,11 +65,13 @@ import com.oracle.graal.python.builtins.objects.asyncio.GetAwaitableNode; import com.oracle.graal.python.builtins.objects.asyncio.GetAwaitableNodeGen; import com.oracle.graal.python.builtins.objects.cell.PCell; +import com.oracle.graal.python.builtins.objects.common.EconomicMapStorage; import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes; import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes.SetItemNode; import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodesFactory; import com.oracle.graal.python.builtins.objects.common.HashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorageFactory; +import com.oracle.graal.python.builtins.objects.common.ObjectHashMap; import com.oracle.graal.python.builtins.objects.dict.DictNodes; import com.oracle.graal.python.builtins.objects.dict.DictNodesFactory; import com.oracle.graal.python.builtins.objects.dict.PDict; @@ -101,7 +102,7 @@ import com.oracle.graal.python.builtins.objects.slice.SliceNodes.CreateSliceNode; import com.oracle.graal.python.builtins.objects.slice.SliceNodesFactory.CreateSliceNodeGen; import com.oracle.graal.python.compiler.BinaryOpsConstants; -import com.oracle.graal.python.compiler.CodeUnit; +import com.oracle.graal.python.compiler.BytecodeCodeUnit; import com.oracle.graal.python.compiler.FormatOptions; import com.oracle.graal.python.compiler.OpCodes; import com.oracle.graal.python.compiler.OpCodes.CollectionBits; @@ -109,6 +110,35 @@ import com.oracle.graal.python.compiler.QuickeningTypes; import com.oracle.graal.python.compiler.RaisePythonExceptionErrorCallback; import com.oracle.graal.python.compiler.UnaryOpsConstants; +import com.oracle.graal.python.lib.PyNumberAddNode; +import com.oracle.graal.python.lib.PyNumberAndNode; +import com.oracle.graal.python.lib.PyNumberFloorDivideNode; +import com.oracle.graal.python.lib.PyNumberInPlaceAddNode; +import com.oracle.graal.python.lib.PyNumberInPlaceAndNode; +import com.oracle.graal.python.lib.PyNumberInPlaceFloorDivideNode; +import com.oracle.graal.python.lib.PyNumberInPlaceLshiftNode; +import com.oracle.graal.python.lib.PyNumberInPlaceMatrixMultiplyNode; +import com.oracle.graal.python.lib.PyNumberInPlaceMultiplyNode; +import com.oracle.graal.python.lib.PyNumberInPlaceOrNode; +import com.oracle.graal.python.lib.PyNumberInPlacePowerNode; +import com.oracle.graal.python.lib.PyNumberInPlaceRemainderNode; +import com.oracle.graal.python.lib.PyNumberInPlaceRshiftNode; +import com.oracle.graal.python.lib.PyNumberInPlaceSubtractNode; +import com.oracle.graal.python.lib.PyNumberInPlaceTrueDivideNode; +import com.oracle.graal.python.lib.PyNumberInPlaceXorNode; +import com.oracle.graal.python.lib.PyNumberInvertNode; +import com.oracle.graal.python.lib.PyNumberLshiftNode; +import com.oracle.graal.python.lib.PyNumberMatrixMultiplyNode; +import com.oracle.graal.python.lib.PyNumberMultiplyNode; +import com.oracle.graal.python.lib.PyNumberNegativeNode; +import com.oracle.graal.python.lib.PyNumberOrNode; +import com.oracle.graal.python.lib.PyNumberPositiveNode; +import com.oracle.graal.python.lib.PyNumberPowerNode; +import com.oracle.graal.python.lib.PyNumberRemainderNode; +import com.oracle.graal.python.lib.PyNumberRshiftNode; +import com.oracle.graal.python.lib.PyNumberSubtractNode; +import com.oracle.graal.python.lib.PyNumberTrueDivideNode; +import com.oracle.graal.python.lib.PyNumberXorNode; import com.oracle.graal.python.lib.PyObjectAsciiNode; import com.oracle.graal.python.lib.PyObjectAsciiNodeGen; import com.oracle.graal.python.lib.PyObjectDelItem; @@ -121,10 +151,12 @@ import com.oracle.graal.python.lib.PyObjectGetIterNodeGen; import com.oracle.graal.python.lib.PyObjectGetMethod; import com.oracle.graal.python.lib.PyObjectGetMethodNodeGen; +import com.oracle.graal.python.lib.PyObjectHashNode; import com.oracle.graal.python.lib.PyObjectIsTrueNode; import com.oracle.graal.python.lib.PyObjectIsTrueNodeGen; import com.oracle.graal.python.lib.PyObjectReprAsObjectNode; import com.oracle.graal.python.lib.PyObjectReprAsObjectNodeGen; +import com.oracle.graal.python.lib.PyObjectRichCompare.RichCompareBinaryOp; import com.oracle.graal.python.lib.PyObjectSetAttr; import com.oracle.graal.python.lib.PyObjectSetAttrNodeGen; import com.oracle.graal.python.lib.PyObjectSetItem; @@ -133,9 +165,9 @@ import com.oracle.graal.python.lib.PyObjectSizeNodeGen; import com.oracle.graal.python.lib.PyObjectStrAsObjectNode; import com.oracle.graal.python.lib.PyObjectStrAsObjectNodeGen; +import com.oracle.graal.python.lib.RichCmpOp; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.PRaiseNodeGen; import com.oracle.graal.python.nodes.PRootNode; import com.oracle.graal.python.nodes.argument.positional.ExecutePositionalStarargsNode; import com.oracle.graal.python.nodes.argument.positional.ExecutePositionalStarargsNodeGen; @@ -143,6 +175,7 @@ import com.oracle.graal.python.nodes.builtins.ListNodesFactory; import com.oracle.graal.python.nodes.builtins.TupleNodes; import com.oracle.graal.python.nodes.builtins.TupleNodesFactory; +import com.oracle.graal.python.nodes.bytecode.PBytecodeRootNodeFactory.ObjHashMapPutNodeGen; import com.oracle.graal.python.nodes.bytecode.SequenceFromStackNode.ListFromStackNode; import com.oracle.graal.python.nodes.bytecode.SequenceFromStackNode.TupleFromStackNode; import com.oracle.graal.python.nodes.bytecode.SequenceFromStackNodeFactory.ListFromStackNodeGen; @@ -152,8 +185,6 @@ import com.oracle.graal.python.nodes.call.BoundDescriptor; import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.call.CallNodeGen; -import com.oracle.graal.python.nodes.call.CallTargetInvokeNode; -import com.oracle.graal.python.nodes.call.CallTargetInvokeNodeGen; import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode; import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNodeGen; import com.oracle.graal.python.nodes.call.special.CallQuaternaryMethodNode; @@ -164,15 +195,7 @@ import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNodeGen; import com.oracle.graal.python.nodes.exception.ExceptMatchNode; import com.oracle.graal.python.nodes.exception.ExceptMatchNodeGen; -import com.oracle.graal.python.nodes.expression.BinaryArithmetic; -import com.oracle.graal.python.nodes.expression.BinaryComparisonNode; import com.oracle.graal.python.nodes.expression.BinaryOp; -import com.oracle.graal.python.nodes.expression.CoerceToBooleanNode; -import com.oracle.graal.python.nodes.expression.ContainsNode; -import com.oracle.graal.python.nodes.expression.InplaceArithmetic; -import com.oracle.graal.python.nodes.expression.UnaryArithmetic.InvertNode; -import com.oracle.graal.python.nodes.expression.UnaryArithmetic.NegNode; -import com.oracle.graal.python.nodes.expression.UnaryArithmetic.PosNode; import com.oracle.graal.python.nodes.expression.UnaryOpNode; import com.oracle.graal.python.nodes.frame.DeleteGlobalNode; import com.oracle.graal.python.nodes.frame.DeleteGlobalNodeGen; @@ -200,7 +223,7 @@ import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonExitException; import com.oracle.graal.python.runtime.exception.PythonThreadKillException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.PSequence; import com.oracle.graal.python.runtime.sequence.storage.BoolSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.DoubleSequenceStorage; @@ -218,7 +241,11 @@ import com.oracle.truffle.api.HostCompilerDirectives.BytecodeInterpreterSwitch; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.Truffle; -import com.oracle.truffle.api.TruffleSafepoint; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.exception.AbstractTruffleException; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.FrameDescriptor; @@ -253,6 +280,8 @@ public final class PBytecodeRootNode extends PRootNode implements BytecodeOSRNod private static final NodeSupplier NODE_SET_ITEM = HashingCollectionNodes.SetItemNode::create; private static final SetItemNode UNCACHED_SET_ITEM = HashingCollectionNodes.SetItemNode.getUncached(); + private static final NodeSupplier NODE_OBJ_HASHMAP_PUT = ObjHashMapPutNodeGen::create; + private static final ObjHashMapPutNode UNCACHED_OBJ_HASHMAP_PUT = ObjHashMapPutNodeGen.getUncached(); private static final NodeSupplier NODE_CAST_TO_JAVA_INT_EXACT = CastToJavaIntExactNode::create; private static final CastToJavaIntExactNode UNCACHED_CAST_TO_JAVA_INT_EXACT = CastToJavaIntExactNode.getUncached(); private static final ImportNode UNCACHED_IMPORT = ImportNode.getUncached(); @@ -263,8 +292,8 @@ public final class PBytecodeRootNode extends PRootNode implements BytecodeOSRNod private static final NodeSupplier NODE_IMPORT_STAR = ImportStarNode::create; private static final NodeSupplier NODE_OBJECT_GET_ATTR = PyObjectGetAttr::create; private static final PyObjectGetAttr UNCACHED_OBJECT_GET_ATTR = PyObjectGetAttr.getUncached(); - private static final NodeSupplier NODE_RAISE = PRaiseNode::create; - private static final PRaiseNode UNCACHED_RAISE = PRaiseNode.getUncached(); + private static final NodeSupplier NODE_RAISE = PRaiseCachedNode::create; + private static final PRaiseCachedNode UNCACHED_RAISE = PRaiseCachedNode.getUncached(); private static final NodeSupplier NODE_CALL = CallNode::create; private static final CallNode UNCACHED_CALL = CallNode.getUncached(); private static final NodeSupplier NODE_CALL_QUATERNARY_METHOD = CallQuaternaryMethodNode::create; @@ -380,6 +409,7 @@ public final class PBytecodeRootNode extends PRootNode implements BytecodeOSRNod private static final NodeSupplier NODE_STORE_SUBSCR_SEQ_O = StoreSubscrSeq.ONode::create; private static final NodeSupplier NODE_STORE_SUBSCR_SEQ_I = StoreSubscrSeq.INode::create; private static final NodeSupplier NODE_STORE_SUBSCR_SEQ_D = StoreSubscrSeq.DNode::create; + private static final NodeSupplier NODE_CALL_COMPREHENSION = CallComprehensionNode::create; private static final NodeSupplier NODE_INT_ADD = IntBuiltins.AddNode::create; private static final NodeSupplier NODE_INT_SUB = IntBuiltins.SubNode::create; @@ -400,13 +430,13 @@ public final class PBytecodeRootNode extends PRootNode implements BytecodeOSRNod private static final IntNodeFunction UNARY_OP_FACTORY = (int op) -> { switch (op) { case UnaryOpsConstants.NOT: - return CoerceToBooleanNode.createIfFalseNode(); + return NotNode.create(); case UnaryOpsConstants.POSITIVE: - return PosNode.create(); + return PyNumberPositiveNode.create(); case UnaryOpsConstants.NEGATIVE: - return NegNode.create(); + return PyNumberNegativeNode.create(); case UnaryOpsConstants.INVERT: - return InvertNode.create(); + return PyNumberInvertNode.create(); default: throw CompilerDirectives.shouldNotReachHere(); } @@ -415,73 +445,73 @@ public final class PBytecodeRootNode extends PRootNode implements BytecodeOSRNod private static final IntNodeFunction BINARY_OP_FACTORY = (int op) -> { switch (op) { case BinaryOpsConstants.ADD: - return BinaryArithmetic.Add.create(); + return PyNumberAddNode.create(); case BinaryOpsConstants.SUB: - return BinaryArithmetic.Sub.create(); + return PyNumberSubtractNode.create(); case BinaryOpsConstants.MUL: - return BinaryArithmetic.Mul.create(); + return PyNumberMultiplyNode.create(); case BinaryOpsConstants.TRUEDIV: - return BinaryArithmetic.TrueDiv.create(); + return PyNumberTrueDivideNode.create(); case BinaryOpsConstants.FLOORDIV: - return BinaryArithmetic.FloorDiv.create(); + return PyNumberFloorDivideNode.create(); case BinaryOpsConstants.MOD: - return BinaryArithmetic.Mod.create(); + return PyNumberRemainderNode.create(); case BinaryOpsConstants.LSHIFT: - return BinaryArithmetic.LShift.create(); + return PyNumberLshiftNode.create(); case BinaryOpsConstants.RSHIFT: - return BinaryArithmetic.RShift.create(); + return PyNumberRshiftNode.create(); case BinaryOpsConstants.AND: - return BinaryArithmetic.And.create(); + return PyNumberAndNode.create(); case BinaryOpsConstants.OR: - return BinaryArithmetic.Or.create(); + return PyNumberOrNode.create(); case BinaryOpsConstants.XOR: - return BinaryArithmetic.Xor.create(); + return PyNumberXorNode.create(); case BinaryOpsConstants.POW: - return BinaryArithmetic.Pow.create(); + return PyNumberPowerNode.create(); case BinaryOpsConstants.MATMUL: - return BinaryArithmetic.MatMul.create(); + return PyNumberMatrixMultiplyNode.create(); case BinaryOpsConstants.INPLACE_ADD: - return InplaceArithmetic.IAdd.create(); + return PyNumberInPlaceAddNode.create(); case BinaryOpsConstants.INPLACE_SUB: - return InplaceArithmetic.ISub.create(); + return PyNumberInPlaceSubtractNode.create(); case BinaryOpsConstants.INPLACE_MUL: - return InplaceArithmetic.IMul.create(); + return PyNumberInPlaceMultiplyNode.create(); case BinaryOpsConstants.INPLACE_TRUEDIV: - return InplaceArithmetic.ITrueDiv.create(); + return PyNumberInPlaceTrueDivideNode.create(); case BinaryOpsConstants.INPLACE_FLOORDIV: - return InplaceArithmetic.IFloorDiv.create(); + return PyNumberInPlaceFloorDivideNode.create(); case BinaryOpsConstants.INPLACE_MOD: - return InplaceArithmetic.IMod.create(); + return PyNumberInPlaceRemainderNode.create(); case BinaryOpsConstants.INPLACE_LSHIFT: - return InplaceArithmetic.ILShift.create(); + return PyNumberInPlaceLshiftNode.create(); case BinaryOpsConstants.INPLACE_RSHIFT: - return InplaceArithmetic.IRShift.create(); + return PyNumberInPlaceRshiftNode.create(); case BinaryOpsConstants.INPLACE_AND: - return InplaceArithmetic.IAnd.create(); + return PyNumberInPlaceAndNode.create(); case BinaryOpsConstants.INPLACE_OR: - return InplaceArithmetic.IOr.create(); + return PyNumberInPlaceOrNode.create(); case BinaryOpsConstants.INPLACE_XOR: - return InplaceArithmetic.IXor.create(); + return PyNumberInPlaceXorNode.create(); case BinaryOpsConstants.INPLACE_POW: - return InplaceArithmetic.IPow.create(); + return PyNumberInPlacePowerNode.create(); case BinaryOpsConstants.INPLACE_MATMUL: - return InplaceArithmetic.IMatMul.create(); + return PyNumberInPlaceMatrixMultiplyNode.create(); case BinaryOpsConstants.EQ: - return BinaryComparisonNode.EqNode.create(); + return RichCompareBinaryOp.create(RichCmpOp.Py_EQ); case BinaryOpsConstants.NE: - return BinaryComparisonNode.NeNode.create(); + return RichCompareBinaryOp.create(RichCmpOp.Py_NE); case BinaryOpsConstants.LT: - return BinaryComparisonNode.LtNode.create(); + return RichCompareBinaryOp.create(RichCmpOp.Py_LT); case BinaryOpsConstants.LE: - return BinaryComparisonNode.LeNode.create(); + return RichCompareBinaryOp.create(RichCmpOp.Py_LE); case BinaryOpsConstants.GT: - return BinaryComparisonNode.GtNode.create(); + return RichCompareBinaryOp.create(RichCmpOp.Py_GT); case BinaryOpsConstants.GE: - return BinaryComparisonNode.GeNode.create(); + return RichCompareBinaryOp.create(RichCmpOp.Py_GE); case BinaryOpsConstants.IS: return IsNode.create(); case BinaryOpsConstants.IN: - return ContainsNode.create(); + return InNode.create(); default: throw CompilerDirectives.shouldNotReachHere(); } @@ -503,7 +533,7 @@ public final class PBytecodeRootNode extends PRootNode implements BytecodeOSRNod final int selfIndex; final int classcellIndex; - private final CodeUnit co; + private final BytecodeCodeUnit co; private final Source source; private SourceSection sourceSection; // For deferred deprecation warnings @@ -517,7 +547,7 @@ public final class PBytecodeRootNode extends PRootNode implements BytecodeOSRNod @CompilationFinal(dimensions = 1) private final TruffleString[] freevars; @CompilationFinal(dimensions = 1) private final TruffleString[] cellvars; @CompilationFinal(dimensions = 1) private final int[] cell2arg; - @CompilationFinal(dimensions = 1) protected final Assumption[] cellEffectivelyFinalAssumptions; + @CompilationFinal(dimensions = 1) private final Assumption[] cellEffectivelyFinalAssumptions; @CompilationFinal(dimensions = 1) private final int[] exceptionHandlerRanges; @@ -560,10 +590,9 @@ public final class PBytecodeRootNode extends PRootNode implements BytecodeOSRNod * When instrumentation is in use, InstrumentationSupport#bciToHelper node is used instead of * this array. Use getChildNodes() to get the right array. */ - @Children private final Node[] adoptedNodes; + @Children private Node[] adoptedNodes; @Child private CalleeContext calleeContext = CalleeContext.create(); // TODO: make some of those lazy? - @Child private PythonObjectFactory factory = PythonObjectFactory.create(); @Child private ExceptionStateNodes.GetCaughtExceptionNode getCaughtExceptionNode; @Child private MaterializeFrameNode traceMaterializeFrameNode = null; @Child private ChainExceptionsNode chainExceptionsNode; @@ -575,7 +604,7 @@ public final class PBytecodeRootNode extends PRootNode implements BytecodeOSRNod @Child private InstrumentationRoot instrumentationRoot = InstrumentationRoot.create(); - private static FrameDescriptor makeFrameDescriptor(CodeUnit co, FrameInfo info) { + private static FrameDescriptor makeFrameDescriptor(BytecodeCodeUnit co, FrameInfo info) { int capacity = co.varnames.length + co.cellvars.length + co.freevars.length + co.stacksize + 1; FrameDescriptor.Builder newBuilder = FrameDescriptor.newBuilder(capacity); newBuilder.info(info); @@ -613,40 +642,27 @@ private static FrameDescriptor makeFrameDescriptor(CodeUnit co, FrameInfo info) return newBuilder.build(); } - private static Signature makeSignature(CodeUnit co) { - int posArgCount = co.argCount + co.positionalOnlyArgCount; - TruffleString[] parameterNames = Arrays.copyOf(co.varnames, posArgCount); - TruffleString[] kwOnlyNames = Arrays.copyOfRange(co.varnames, posArgCount, posArgCount + co.kwOnlyArgCount); - int varArgsIndex = co.takesVarArgs() ? posArgCount : -1; - return new Signature(co.positionalOnlyArgCount, - co.takesVarKeywordArgs(), - varArgsIndex, - co.positionalOnlyArgCount > 0, - parameterNames, - kwOnlyNames); - } - @TruffleBoundary - public static PBytecodeRootNode create(PythonLanguage language, CodeUnit co, Source source) { + public static PBytecodeRootNode create(PythonLanguage language, BytecodeCodeUnit co, Source source) { return create(language, co, source, null); } @TruffleBoundary - public static PBytecodeRootNode create(PythonLanguage language, CodeUnit co, Source source, RaisePythonExceptionErrorCallback parserErrorCallback) { - FrameInfo frameInfo = new FrameInfo(); + public static PBytecodeRootNode create(PythonLanguage language, BytecodeCodeUnit co, Source source, RaisePythonExceptionErrorCallback parserErrorCallback) { + BytecodeFrameInfo frameInfo = new BytecodeFrameInfo(); FrameDescriptor fd = makeFrameDescriptor(co, frameInfo); - PBytecodeRootNode rootNode = new PBytecodeRootNode(language, fd, makeSignature(co), co, source, parserErrorCallback); + PBytecodeRootNode rootNode = new PBytecodeRootNode(language, fd, co.computeSignature(), co, source, parserErrorCallback); PythonContext context = PythonContext.get(rootNode); if (context != null && context.getOption(PythonOptions.EagerlyMaterializeInstrumentationNodes)) { rootNode.adoptChildren(); rootNode.instrumentationRoot.materializeInstrumentableNodes(Collections.singleton(StandardTags.StatementTag.class)); } - frameInfo.rootNode = rootNode; + frameInfo.setRootNode(rootNode); return rootNode; } @TruffleBoundary - private PBytecodeRootNode(PythonLanguage language, FrameDescriptor fd, Signature sign, CodeUnit co, Source source, RaisePythonExceptionErrorCallback parserErrorCallback) { + private PBytecodeRootNode(PythonLanguage language, FrameDescriptor fd, Signature sign, BytecodeCodeUnit co, Source source, RaisePythonExceptionErrorCallback parserErrorCallback) { super(language, fd); assert source != null; this.celloffset = co.varnames.length; @@ -657,9 +673,7 @@ private PBytecodeRootNode(PythonLanguage language, FrameDescriptor fd, Signature this.internal = source.isInternal(); this.parserErrorCallback = parserErrorCallback; this.signature = sign; - this.bytecode = PythonUtils.arrayCopyOf(co.code, co.code.length); - this.adoptedNodes = new Node[co.code.length]; - this.conditionProfiles = new int[co.conditionProfileCount]; + this.bytecode = co.code; this.outputCanQuicken = co.outputCanQuicken; this.variableShouldUnbox = co.variableShouldUnbox; this.generalizeInputsMap = co.generalizeInputsMap; @@ -734,7 +748,7 @@ public void setPythonInternal(boolean pythonInternal) { this.pythonInternal = pythonInternal; } - public CodeUnit getCodeUnit() { + public BytecodeCodeUnit getCodeUnit() { return co; } @@ -748,7 +762,22 @@ public byte[] getBytecode() { private Node[] getChildNodes() { InstrumentationSupport instrumentation = instrumentationRoot.getInstrumentation(); - return instrumentation == null ? adoptedNodes : instrumentation.bciToHelperNode; + if (instrumentation != null) { + return instrumentation.bciToHelperNode; + } + if (adoptedNodes == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + Lock lock = getLock(); + lock.lock(); + try { + if (adoptedNodes == null) { + adoptedNodes = new Node[bytecode.length]; + } + } finally { + lock.unlock(); + } + } + return adoptedNodes; } @FunctionalInterface @@ -757,66 +786,30 @@ private interface NodeSupplier { T get(); } - @FunctionalInterface - private interface NodeFunction { - T apply(A argument); - } - @FunctionalInterface private interface IntNodeFunction { T apply(int argument); } - @SuppressWarnings("unchecked") - private T insertChildNode(Node[] nodes, int nodeIndex, Class cachedClass, NodeFunction nodeSupplier, A argument) { - Node node = nodes[nodeIndex]; - if (node != null && node.getClass() == cachedClass) { - return CompilerDirectives.castExact(node, cachedClass); - } - return CompilerDirectives.castExact(doInsertChildNode(nodes, nodeIndex, nodeSupplier, argument), cachedClass); - } - - @SuppressWarnings("unchecked") - private T doInsertChildNode(Node[] nodes, int nodeIndex, NodeFunction nodeSupplier, A argument) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - Lock lock = getLock(); - lock.lock(); - try { - T newNode = nodeSupplier.apply(argument); - doInsertChildNode(nodes, nodeIndex, newNode); - return newNode; - } finally { - lock.unlock(); - } - } - - @SuppressWarnings("unchecked") - private T insertChildNode(Node[] nodes, int nodeIndex, T uncached, Class cachedClass, NodeFunction nodeSupplier, A argument, boolean useCachedNodes) { - if (!useCachedNodes) { - return uncached; - } - Node node = nodes[nodeIndex]; - if (node != null && node.getClass() == cachedClass) { - return CompilerDirectives.castExact(node, cachedClass); - } - return CompilerDirectives.castExact(doInsertChildNode(nodes, nodeIndex, nodeSupplier, argument), cachedClass); - } - @SuppressWarnings("unchecked") private T insertChildNodeInt(Node[] nodes, int nodeIndex, Class expectedClass, IntNodeFunction nodeSupplier, int argument) { Node node = nodes[nodeIndex]; if (expectedClass.isInstance(node)) { return (T) node; } - return doInsertChildNodeInt(nodes, nodeIndex, nodeSupplier, argument); + return doInsertChildNodeInt(nodes, nodeIndex, expectedClass, nodeSupplier, argument); } @SuppressWarnings("unchecked") - private T doInsertChildNodeInt(Node[] nodes, int nodeIndex, IntNodeFunction nodeSupplier, int argument) { + private T doInsertChildNodeInt(Node[] nodes, int nodeIndex, Class expectedClass, IntNodeFunction nodeSupplier, int argument) { CompilerDirectives.transferToInterpreterAndInvalidate(); Lock lock = getLock(); lock.lock(); try { + Node node = nodes[nodeIndex]; + if (expectedClass.isInstance(node)) { + return (T) node; + } T newNode = nodeSupplier.apply(argument); doInsertChildNode(nodes, nodeIndex, newNode); return newNode; @@ -831,15 +824,19 @@ private U insertChildNode(Node[] nodes, int nodeIn if (node != null && node.getClass() == cachedClass) { return CompilerDirectives.castExact(node, cachedClass); } - return CompilerDirectives.castExact(doInsertChildNode(nodes, nodeIndex, nodeSupplier), cachedClass); + return CompilerDirectives.castExact(doInsertChildNode(nodes, nodeIndex, cachedClass, nodeSupplier), cachedClass); } @SuppressWarnings("unchecked") - private T doInsertChildNode(Node[] nodes, int nodeIndex, NodeSupplier nodeSupplier) { + private T doInsertChildNode(Node[] nodes, int nodeIndex, Class cachedClass, NodeSupplier nodeSupplier) { CompilerDirectives.transferToInterpreterAndInvalidate(); Lock lock = getLock(); lock.lock(); try { + Node node = nodes[nodeIndex]; + if (node != null && node.getClass() == cachedClass) { + return (T) node; + } T newNode = nodeSupplier.get(); doInsertChildNode(nodes, nodeIndex, newNode); return newNode; @@ -857,7 +854,7 @@ private T insertChildNode(Node[] nodes, int nodeIndex, T uncach if (node != null && node.getClass() == cachedClass) { return CompilerDirectives.castExact(node, cachedClass); } - return CompilerDirectives.castExact(doInsertChildNode(nodes, nodeIndex, nodeSupplier), cachedClass); + return CompilerDirectives.castExact(doInsertChildNode(nodes, nodeIndex, cachedClass, nodeSupplier), cachedClass); } private void doInsertChildNode(Node[] nodes, int nodeIndex, Node newNode) { @@ -869,6 +866,10 @@ private void doInsertChildNode(Node[] nodes, int nodeIndex, Node newNode) { } } + private PythonLanguage getLanguage() { + return getLanguage(PythonLanguage.class); + } + private static final int CONDITION_PROFILE_MAX_VALUE = 0x3fffffff; // Inlined from ConditionProfile.Counting#profile @@ -876,6 +877,10 @@ private boolean profileCondition(boolean value, byte[] localBC, int bci, boolean if (!useCachedNodes) { return value; } + if (conditionProfiles == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + conditionProfiles = new int[co.conditionProfileCount]; + } int index = Byte.toUnsignedInt(localBC[bci + 2]) | Byte.toUnsignedInt(localBC[bci + 3]) << 8; int t = conditionProfiles[index]; int f = conditionProfiles[index + 1]; @@ -1053,10 +1058,10 @@ private void copyArgsAndCells(Frame localFrame, Object[] arguments) { copyArgs(arguments, localFrame); int varIdx = co.getRegularArgCount(); if (co.takesVarArgs()) { - localFrame.setObject(varIdx++, factory.createTuple(PArguments.getVariableArguments(arguments))); + localFrame.setObject(varIdx++, PFactory.createTuple(getLanguage(), PArguments.getVariableArguments(arguments))); } if (co.takesVarKeywordArgs()) { - localFrame.setObject(varIdx, factory.createDict(PArguments.getKeywordArguments(arguments))); + localFrame.setObject(varIdx, PFactory.createDict(getLanguage(), PArguments.getKeywordArguments(arguments))); } initCellVars(localFrame); initFreeVars(localFrame, arguments); @@ -1073,7 +1078,6 @@ public Object execute(VirtualFrame virtualFrame) { if (!co.isGeneratorOrCoroutine()) { copyArgsAndCells(virtualFrame, virtualFrame.getArguments()); } - return executeFromBci(virtualFrame, virtualFrame, this, 0, getInitialStackTop()); } finally { calleeContext.exit(virtualFrame, this); @@ -1173,9 +1177,10 @@ private InstrumentationData getTraceData() { return instrumentationData; } - public PythonContext.PythonThreadState getThreadState(Node node) { + public PythonContext.PythonThreadState getThreadState(PBytecodeRootNode node) { if (this.getTraceData().threadState == null) { - return this.getTraceData().threadState = PythonContext.get(node).getThreadState(PythonLanguage.get(node)); + PythonContext context = PythonContext.get(node); + return this.getTraceData().threadState = context.getThreadState(node.getLanguage()); } return this.getTraceData().threadState; } @@ -1260,7 +1265,7 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod unboxVariables(localFrame); } - final PythonLanguage language = PythonLanguage.get(this); + final PythonLanguage language = getLanguage(PythonLanguage.class); final Assumption noTraceOrProfile = language.noTracingOrProfilingAssumption; final InstrumentationSupport instrumentation = instrumentationRoot.getInstrumentation(); if (instrumentation != null && !fromOSR) { @@ -1381,7 +1386,7 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod } case OpCodesConstants.LOAD_BIGINT: { oparg |= Byte.toUnsignedInt(localBC[++bci]); - virtualFrame.setObject(++stackTop, factory.createInt((BigInteger) localConsts[oparg])); + virtualFrame.setObject(++stackTop, PFactory.createInt(language, (BigInteger) localConsts[oparg])); break; } case OpCodesConstants.LOAD_STRING: @@ -1392,7 +1397,7 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod } case OpCodesConstants.LOAD_BYTES: { oparg |= Byte.toUnsignedInt(localBC[++bci]); - virtualFrame.setObject(++stackTop, factory.createBytes((byte[]) localConsts[oparg])); + virtualFrame.setObject(++stackTop, PFactory.createBytes(language, (byte[]) localConsts[oparg])); break; } case OpCodesConstants.LOAD_CONST_COLLECTION: { @@ -1405,7 +1410,7 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod case OpCodesConstants.LOAD_COMPLEX: { oparg |= Byte.toUnsignedInt(localBC[++bci]); double[] num = (double[]) localConsts[oparg]; - virtualFrame.setObject(++stackTop, factory.createComplex(num[0], num[1])); + virtualFrame.setObject(++stackTop, PFactory.createComplex(language, num[0], num[1])); break; } case OpCodesConstants.MAKE_KEYWORD: { @@ -1652,7 +1657,7 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod break; } case OpCodesConstants.POP_TOP: - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); break; case OpCodesConstants.ROT_TWO: { Object top = virtualFrame.getObject(stackTop); @@ -1830,6 +1835,7 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod throw bytecodeRaiseVarargs(virtualFrame, stackTop, beginBci, count, localNodes); } case OpCodesConstants.RETURN_VALUE: { + setCurrentBci(virtualFrame, bciSlot, bci); return bytecodeReturnValue(virtualFrame, isGeneratorOrCoroutine, instrumentation, mutableData, stackTop, tracingOrProfilingEnabled, beginBci); } case OpCodesConstants.LOAD_BUILD_CLASS: { @@ -1891,7 +1897,7 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod } case OpCodesConstants.DELETE_FAST: { oparg |= Byte.toUnsignedInt(localBC[++bci]); - bytecodeDeleteFast(localFrame, beginBci, localNodes, oparg, useCachedNodes); + bytecodeDeleteFast(localFrame, beginBci, localNodes, oparg); break; } case OpCodesConstants.LOAD_ATTR: { @@ -1963,7 +1969,9 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod generalizePopAndJumpIfFalseB(bci); continue; } - if (profileCondition(!virtualFrame.getBoolean(stackTop--), localBC, bci, useCachedNodes)) { + boolean cond = virtualFrame.getBoolean(stackTop); + clearInCompiledCode(virtualFrame, stackTop--); + if (profileCondition(!cond, localBC, bci, useCachedNodes)) { oparg |= Byte.toUnsignedInt(localBC[bci + 1]); bci += oparg; oparg = 0; @@ -1979,7 +1987,9 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod generalizePopAndJumpIfTrueB(bci); continue; } - if (profileCondition(virtualFrame.getBoolean(stackTop--), localBC, bci, useCachedNodes)) { + boolean cond = virtualFrame.getBoolean(stackTop); + clearInCompiledCode(virtualFrame, stackTop--); + if (profileCondition(cond, localBC, bci, useCachedNodes)) { oparg |= Byte.toUnsignedInt(localBC[bci + 1]); bci += oparg; oparg = 0; @@ -1994,7 +2004,7 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod setCurrentBci(virtualFrame, bciSlot, bci); boolean cond = evaluateObjectCondition(virtualFrame, useCachedNodes, stackTop, bci, localBC, localNodes, beginBci); if (cond) { - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); bci += 3; } else { oparg |= Byte.toUnsignedInt(localBC[bci + 1]); @@ -2015,7 +2025,7 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod notifyStatement(virtualFrame, instrumentation, mutableData, bci, beginBci); continue; } else { - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); bci += 3; } break; @@ -2063,7 +2073,7 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod } } } - TruffleSafepoint.poll(this); + PythonContext.triggerAsyncActions(this); oparg = 0; continue; } @@ -2088,7 +2098,7 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod stackTop++; bci++; } else { - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); oparg |= Byte.toUnsignedInt(localBC[bci + 1]); bci += oparg; oparg = 0; @@ -2104,7 +2114,7 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod stackTop++; bci++; } else { - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); oparg |= Byte.toUnsignedInt(localBC[bci + 1]); bci += oparg; oparg = 0; @@ -2221,7 +2231,7 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod break; } case OpCodesConstants.ASYNCGEN_WRAP: { - bytecodeAsyncGenWrap(virtualFrame, useCachedNodes, stackTop, localNodes, beginBci); + virtualFrame.setObject(stackTop, PFactory.createAsyncGeneratorWrappedValue(language, virtualFrame.getObject(stackTop))); break; } case OpCodesConstants.PUSH_EXC_INFO: { @@ -2230,7 +2240,7 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod } case OpCodesConstants.POP_EXCEPT: { mutableData.localException = popExceptionState(arguments, virtualFrame.getObject(stackTop), mutableData.outerException); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); break; } case OpCodesConstants.END_EXC_HANDLER: { @@ -2317,7 +2327,7 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod if (e instanceof AbstractTruffleException) { exception = (AbstractTruffleException) e; } else { - exception = wrapJavaExceptionIfApplicable(e); + exception = wrapJavaExceptionIfApplicable(language, e); if (exception == null) { throw e; } @@ -2381,11 +2391,6 @@ private Object bytecodeLoop(VirtualFrame virtualFrame, Frame localFrame, Bytecod } } - @BytecodeInterpreterSwitch - private void bytecodeAsyncGenWrap(VirtualFrame virtualFrame, boolean useCachedNodes, int stackTop, Node[] localNodes, int beginBci) { - virtualFrame.setObject(stackTop, factory.createAsyncGeneratorWrappedValue(virtualFrame.getObject(stackTop))); - } - @BytecodeInterpreterSwitch private int bytecodeGetAIter(VirtualFrame virtualFrame, boolean useCachedNodes, int stackTop, Node[] localNodes, int bci) { GetAIterNode node = insertChildNode(localNodes, bci, UNCACHED_GET_AITER, GetAIterNodeGen.class, NODE_GET_AITER, useCachedNodes); @@ -2404,9 +2409,9 @@ private int bytecodeGetANext(VirtualFrame virtualFrame, boolean useCachedNodes, private int bytecodeEndAsyncFor(VirtualFrame virtualFrame, boolean useCachedNodes, int stackTop, Node[] localNodes, int bci) { EndAsyncForNode node = insertChildNode(localNodes, bci, UNCACHED_END_ASYNC_FOR, EndAsyncForNodeGen.class, NODE_END_ASYNC_FOR, useCachedNodes); node.execute(virtualFrame.getObject(stackTop), frameIsVisibleToPython()); - virtualFrame.setObject(stackTop, null); // pop the exception - virtualFrame.setObject(stackTop - 1, null); // the coroutine that raised the exception - virtualFrame.setObject(stackTop - 2, null); // the async iterator + virtualFrame.clear(stackTop); // pop the exception + virtualFrame.clear(stackTop - 1); // the coroutine that raised the exception + virtualFrame.clear(stackTop - 2); // the async iterator return stackTop - 3; } @@ -2491,7 +2496,7 @@ private int bytecodeKwargsMerge(VirtualFrame virtualFrame, boolean useCachedNode private boolean evaluateObjectCondition(VirtualFrame virtualFrame, boolean useCachedNodes, int stackTop, int bci, byte[] localBC, Node[] localNodes, int beginBci) { PyObjectIsTrueNode isTrue = insertChildNode(localNodes, beginBci, UNCACHED_OBJECT_IS_TRUE, PyObjectIsTrueNodeGen.class, NODE_OBJECT_IS_TRUE, useCachedNodes); Object condObj = virtualFrame.getObject(stackTop); - boolean cond = isTrue.executeCached(virtualFrame, condObj); + boolean cond = isTrue.execute(virtualFrame, condObj); return profileCondition(cond, localBC, bci, useCachedNodes); } @@ -2529,7 +2534,7 @@ private boolean bytecodeForIterI(VirtualFrame virtualFrame, boolean useCachedNod private boolean bytecodeMatchExc(VirtualFrame virtualFrame, boolean useCachedNodes, int stackTop, Node[] localNodes, int beginBci) { Object exception = virtualFrame.getObject(stackTop - 1); Object matchType = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop, null); + virtualFrame.clear(stackTop); ExceptMatchNode matchNode = insertChildNode(localNodes, beginBci, UNCACHED_EXCEPT_MATCH, ExceptMatchNodeGen.class, NODE_EXCEPT_MATCH, useCachedNodes); return matchNode.executeMatch(virtualFrame, exception, matchType); } @@ -2598,7 +2603,7 @@ private void bytecodeSetupAnnotations(VirtualFrame virtualFrame, boolean useCach @BytecodeInterpreterSwitch private int bytecodeMakeFunction(VirtualFrame virtualFrame, Object globals, int stackTop, Node[] localNodes, int beginBci, int flags, Object localConsts) { - CodeUnit codeUnit = (CodeUnit) localConsts; + BytecodeCodeUnit codeUnit = (BytecodeCodeUnit) localConsts; MakeFunctionNode makeFunctionNode = insertMakeFunctionNode(localNodes, beginBci, codeUnit); return makeFunctionNode.execute(virtualFrame, globals, stackTop, flags); } @@ -2633,8 +2638,16 @@ private GeneratorYieldResult bytecodeYieldValue(VirtualFrame virtualFrame, Frame LoopNode.reportLoopCount(this, mutableData.loopCount); } Object value = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); PArguments.setException(PArguments.getGeneratorFrame(arguments), mutableData.localException); + if (mutableData.localException instanceof PException pe) { + /* + * The frame reference is only valid for this particular resumption of the generator, so + * we need to materialize the frame to make sure the traceback will still be valid in + * the next resumption. + */ + pe.markEscaped(); + } // See PBytecodeGeneratorRootNode#execute if (localFrame != virtualFrame) { copyStackSlotsToGeneratorFrame(virtualFrame, localFrame, stackTop); @@ -2763,15 +2776,15 @@ private Object notifyEnter(VirtualFrame virtualFrame, InstrumentationSupport ins return null; } - private MakeFunctionNode insertMakeFunctionNode(Node[] localNodes, int beginBci, CodeUnit codeUnit) { + private MakeFunctionNode insertMakeFunctionNode(Node[] localNodes, int beginBci, BytecodeCodeUnit codeUnit) { return insertChildNode(localNodes, beginBci, MakeFunctionNodeGen.class, () -> MakeFunctionNode.create(getLanguage(PythonLanguage.class), codeUnit, source)); } public void materializeContainedFunctionsForInstrumentation(Set> materializedTags) { usingCachedNodes = true; - CodeUnit.iterateBytecode(bytecode, (bci, op, oparg, followingArgs) -> { + BytecodeCodeUnit.iterateBytecode(bytecode, (bci, op, oparg, followingArgs) -> { if (op == OpCodes.MAKE_FUNCTION) { - CodeUnit codeUnit = (CodeUnit) consts[oparg]; + BytecodeCodeUnit codeUnit = (BytecodeCodeUnit) consts[oparg]; MakeFunctionNode makeFunctionNode = insertMakeFunctionNode(getChildNodes(), bci, codeUnit); RootNode rootNode = makeFunctionNode.getCallTarget().getRootNode(); if (rootNode instanceof PBytecodeGeneratorFunctionRootNode) { @@ -2791,7 +2804,7 @@ private int bytecodePrintExpr(VirtualFrame virtualFrame, boolean useCachedNodes, setCurrentBci(virtualFrame, bciSlot, bci); PrintExprNode printExprNode = insertChildNode(localNodes, beginBci, UNCACHED_PRINT_EXPR, PrintExprNodeGen.class, NODE_PRINT_EXPR, useCachedNodes); printExprNode.execute(virtualFrame, virtualFrame.getObject(stackTop)); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); return stackTop; } @@ -2868,7 +2881,7 @@ private void traceException(VirtualFrame virtualFrame, MutableLoopData mutableDa Object peType = GetClassNode.executeUncached(exceptionObject); Object traceback = ExceptionNodes.GetTracebackNode.executeUncached(exception); invokeTraceFunction(virtualFrame, - factory.createTuple(new Object[]{peType, exceptionObject, traceback}), mutableData.getThreadState(this), + PFactory.createTuple(getLanguage(), new Object[]{peType, exceptionObject, traceback}), mutableData.getThreadState(this), mutableData, PythonContext.TraceEvent.EXCEPTION, bciToLine(bci), true); } @@ -2939,12 +2952,12 @@ private int traceLine(VirtualFrame virtualFrame, MutableLoopData mutableData, by if (pyFrame.didJump()) { int newBci = lineToBci(pyFrame.getJumpDestLine()); mutableData.setPastBci(bci); - if (newBci == CodeUnit.LINE_TO_BCI_LINE_AFTER_CODEBLOCK) { + if (newBci == BytecodeCodeUnit.LINE_TO_BCI_LINE_AFTER_CODEBLOCK) { // line after the code block - throw PRaiseNode.getUncached().raise(ValueError, ErrorMessages.LINE_D_COMES_AFTER_THE_CURRENT_CODE_BLOCK, pyFrame.getLine()); - } else if (newBci == CodeUnit.LINE_TO_BCI_LINE_BEFORE_CODEBLOCK) { + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.LINE_D_COMES_AFTER_THE_CURRENT_CODE_BLOCK, pyFrame.getLine()); + } else if (newBci == BytecodeCodeUnit.LINE_TO_BCI_LINE_BEFORE_CODEBLOCK) { // line before the code block - throw PRaiseNode.getUncached().raise(ValueError, ErrorMessages.LINE_D_COMES_BEFORE_THE_CURRENT_CODE_BLOCK, pyFrame.getJumpDestLine()); + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.LINE_D_COMES_BEFORE_THE_CURRENT_CODE_BLOCK, pyFrame.getJumpDestLine()); } else { ret = computeJumpStackDifference(bci, newBci); mutableData.setJumpBci(newBci); @@ -2961,9 +2974,9 @@ private int traceLine(VirtualFrame virtualFrame, MutableLoopData mutableData, by private int computeJumpStackDifference(int bci, int newBci) { int ret; var stacks = co.computeStackElems(); - String error = co.checkJump(stacks, bci, newBci); + String error = co.checkJump(this, stacks, bci, newBci); if (error != null) { - throw PRaiseNode.getUncached().raise(ValueError, ErrorMessages.CANT_JUMP_INTO_S, error); + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.CANT_JUMP_INTO_S, error); } ret = stacks.get(newBci).size() - stacks.get(bci).size(); return ret; @@ -3007,7 +3020,7 @@ private int bytecodeBinarySubscrOO(VirtualFrame virtualFrame, int stackTop, int // Should only happen in multi-context mode return generalizeBinarySubscr(virtualFrame, stackTop, bci, localNodes); } - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); virtualFrame.setObject(stackTop, getItemNode.executeCached(virtualFrame, virtualFrame.getObject(stackTop), index)); return stackTop; } @@ -3026,7 +3039,7 @@ private int bytecodeBinarySubscrSeqIO(VirtualFrame virtualFrame, int stackTop, i } catch (QuickeningGeneralizeException e) { return generalizeBinarySubscrSeq(virtualFrame, stackTop, bci, localNodes, e); } - virtualFrame.setObject(stackTop--, null); + clearInCompiledCode(virtualFrame, stackTop--); virtualFrame.setObject(stackTop, value); return stackTop; } @@ -3045,7 +3058,7 @@ private int bytecodeBinarySubscrSeqII(VirtualFrame virtualFrame, int stackTop, i } catch (QuickeningGeneralizeException e) { return generalizeBinarySubscrSeq(virtualFrame, stackTop, bci, localNodes, e); } - virtualFrame.setObject(stackTop--, null); + clearInCompiledCode(virtualFrame, stackTop--); virtualFrame.setInt(stackTop, value); return stackTop; } @@ -3064,7 +3077,7 @@ private int bytecodeBinarySubscrSeqID(VirtualFrame virtualFrame, int stackTop, i } catch (QuickeningGeneralizeException e) { return generalizeBinarySubscrSeq(virtualFrame, stackTop, bci, localNodes, e); } - virtualFrame.setObject(stackTop--, null); + clearInCompiledCode(virtualFrame, stackTop--); virtualFrame.setDouble(stackTop, value); return stackTop; } @@ -3133,7 +3146,7 @@ private void invokeTraceFunction(VirtualFrame virtualFrame, Object arg, PythonCo pyFrame.setLocalTraceFun(null); } } catch (Throwable e) { - threadState.setTraceFun(null, PythonLanguage.get(this)); + threadState.setTraceFun(null, getLanguage()); throw e; } finally { if (line != -1) { @@ -3148,7 +3161,7 @@ private void syncLocalsBackToFrame(VirtualFrame virtualFrame, PFrame pyFrame) { if (co.isGeneratorOrCoroutine()) { localFrame = PArguments.getGeneratorFrame(virtualFrame); } - GetFrameLocalsNode.syncLocalsBackToFrame(co, pyFrame, localFrame); + GetFrameLocalsNode.syncLocalsBackToFrame(co, this, pyFrame, localFrame); } private void profileCEvent(VirtualFrame virtualFrame, Object callable, PythonContext.ProfileEvent event, MutableLoopData mutableData, byte tracingOrProfilingEnabled) { @@ -3194,7 +3207,7 @@ private void invokeProfileFunction(VirtualFrame virtualFrame, Object arg, Python Object realResult = result == PNone.NONE ? null : result; pyFrame.setLocalTraceFun(realResult); } catch (Throwable e) { - threadState.setProfileFun(null, PythonLanguage.get(this)); + threadState.setProfileFun(null, getLanguage()); throw e; } finally { threadState.profilingStop(); @@ -3267,7 +3280,14 @@ private void chainPythonExceptions(PException current, PException context) { private PException raiseUnknownBytecodeError(byte bc) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(this, SystemError, toTruffleStringUncached("not implemented bytecode %s"), OpCodes.fromOpCode(bc)); + TruffleString format = toTruffleStringUncached("not implemented bytecode %s"); + throw PRaiseNode.raiseStatic(this, SystemError, format, OpCodes.fromOpCode(bc)); + } + + private static void clearInCompiledCode(VirtualFrame virtualFrame, int stackTop) { + if (CompilerDirectives.inCompiledCode()) { + virtualFrame.clear(stackTop); + } } private void generalizeForIterI(int bci, QuickeningGeneralizeException e) { @@ -3314,8 +3334,8 @@ private boolean bytecodePopCondition(VirtualFrame virtualFrame, int stackTop, No // Can happen when multiple code paths produce different types cond = generalizePopCondition(virtualFrame, stackTop, bci); } - virtualFrame.setObject(stackTop, null); - return isTrue.executeCached(virtualFrame, cond); + virtualFrame.clear(stackTop); + return isTrue.execute(virtualFrame, cond); } private Object generalizePopCondition(VirtualFrame virtualFrame, int stackTop, int bci) { @@ -3462,6 +3482,7 @@ private void bytecodeBinaryOpIIB(VirtualFrame virtualFrame, int stackTop, int bc default: throw CompilerDirectives.shouldNotReachHere("Invalid operation for BINARY_OP_II_B"); } + clearInCompiledCode(virtualFrame, stackTop); virtualFrame.setBoolean(stackTop - 1, result); } @@ -3556,7 +3577,7 @@ private void bytecodeBinaryOpIIO(VirtualFrame virtualFrame, int stackTop, int bc default: throw CompilerDirectives.shouldNotReachHere("Invalid operation for BINARY_OP_II_O"); } - virtualFrame.setObject(stackTop, null); + clearInCompiledCode(virtualFrame, stackTop); virtualFrame.setObject(stackTop - 1, result); } @@ -3649,12 +3670,13 @@ private void bytecodeBinaryOpIII(VirtualFrame virtualFrame, int stackTop, int bc generalizeBinaryOpIIIOverflow(virtualFrame, stackTop, bci, localNodes, op); return; } + clearInCompiledCode(virtualFrame, stackTop); virtualFrame.setInt(stackTop - 1, result); } @InliningCutoff private void raiseDivOrModByZero(int bci, Node[] localNodes, boolean useCachedNodes) { - PRaiseNode raiseNode = insertChildNode(localNodes, bci, UNCACHED_RAISE, PRaiseNodeGen.class, NODE_RAISE, useCachedNodes); + PRaiseCachedNode raiseNode = insertChildNode(localNodes, bci, UNCACHED_RAISE, PRaiseCachedNodeGen.class, NODE_RAISE, useCachedNodes); throw raiseNode.raise(ZeroDivisionError, ErrorMessages.S_DIVISION_OR_MODULO_BY_ZERO, "integer"); } @@ -3701,6 +3723,7 @@ private void bytecodeBinaryOpDDD(VirtualFrame virtualFrame, int stackTop, int bc generalizeBinaryOpDDDOverflow(virtualFrame, stackTop, bci, localNodes, op, useCachedNodes); return; } + clearInCompiledCode(virtualFrame, stackTop); virtualFrame.setDouble(stackTop - 1, result); } @@ -3737,6 +3760,7 @@ private void bytecodeBinaryOpDDB(VirtualFrame virtualFrame, int stackTop, int bc default: throw CompilerDirectives.shouldNotReachHere("Invalid operation for BINARY_OP_DD_B"); } + clearInCompiledCode(virtualFrame, stackTop); virtualFrame.setBoolean(stackTop - 1, result); } @@ -3798,13 +3822,13 @@ private void bytecodeBinaryOpDDO(VirtualFrame virtualFrame, int stackTop, int bc default: throw CompilerDirectives.shouldNotReachHere("Invalid operation for BINARY_OP_DD_O"); } - virtualFrame.setObject(stackTop, null); + clearInCompiledCode(virtualFrame, stackTop); virtualFrame.setObject(stackTop - 1, result); } @InliningCutoff private void raiseDivByZero(int bci, Node[] localNodes, boolean useCachedNodes) { - PRaiseNode raiseNode = insertChildNode(localNodes, bci, UNCACHED_RAISE, PRaiseNodeGen.class, NODE_RAISE, useCachedNodes); + PRaiseCachedNode raiseNode = insertChildNode(localNodes, bci, UNCACHED_RAISE, PRaiseCachedNodeGen.class, NODE_RAISE, useCachedNodes); throw raiseNode.raise(ZeroDivisionError, ErrorMessages.DIVISION_BY_ZERO); } @@ -3841,8 +3865,8 @@ private void bytecodeBinaryOpOOO(VirtualFrame virtualFrame, int stackTop, int bc right = generalizePopCondition(virtualFrame, stackTop, bci); left = virtualFrame.getValue(stackTop - 1); } - virtualFrame.setObject(stackTop, null); - Object result = opNode.executeObject(virtualFrame, left, right); + virtualFrame.clear(stackTop); + Object result = opNode.execute(virtualFrame, left, right); virtualFrame.setObject(stackTop - 1, result); } @@ -4060,7 +4084,7 @@ private void bytecodeUnaryOpOO(VirtualFrame virtualFrame, int stackTop, int bci, generalizeInputs(bci); value = virtualFrame.getValue(stackTop); } - Object result = opNode.executeCached(virtualFrame, value); + Object result = opNode.execute(virtualFrame, value); virtualFrame.setObject(stackTop, result); } @@ -4185,6 +4209,7 @@ private void bytecodeStoreFastAdaptive(VirtualFrame virtualFrame, Frame localFra private void bytecodeStoreFastI(VirtualFrame virtualFrame, Frame localFrame, int stackTop, int bci, int index) { if (virtualFrame.isInt(stackTop)) { localFrame.setInt(index, virtualFrame.getInt(stackTop)); + clearInCompiledCode(virtualFrame, stackTop); } else { generalizeStoreFast(virtualFrame, localFrame, stackTop, bci, index); } @@ -4202,7 +4227,7 @@ private void bytecodeStoreFastUnboxI(VirtualFrame virtualFrame, Frame localFrame } if (object instanceof Integer) { localFrame.setInt(index, (int) object); - virtualFrame.setObject(stackTop, null); + virtualFrame.clear(stackTop); } else { generalizeStoreFast(virtualFrame, localFrame, stackTop, bci, index); } @@ -4227,13 +4252,14 @@ private void bytecodeStoreFastBoxedI(VirtualFrame virtualFrame, Frame localFrame } else { localFrame.setObject(index, object); } - virtualFrame.setObject(stackTop, null); + virtualFrame.clear(stackTop); } @BytecodeInterpreterSwitch private void bytecodeStoreFastL(VirtualFrame virtualFrame, Frame localFrame, int stackTop, int bci, int index) { if (virtualFrame.isLong(stackTop)) { localFrame.setLong(index, virtualFrame.getLong(stackTop)); + clearInCompiledCode(virtualFrame, stackTop); } else { generalizeStoreFast(virtualFrame, localFrame, stackTop, bci, index); } @@ -4251,7 +4277,7 @@ private void bytecodeStoreFastUnboxL(VirtualFrame virtualFrame, Frame localFrame } if (object instanceof Long) { localFrame.setLong(index, (long) object); - virtualFrame.setObject(stackTop, null); + virtualFrame.clear(stackTop); } else { generalizeStoreFast(virtualFrame, localFrame, stackTop, bci, index); } @@ -4276,13 +4302,14 @@ private void bytecodeStoreFastBoxedL(VirtualFrame virtualFrame, Frame localFrame } else { localFrame.setObject(index, object); } - virtualFrame.setObject(stackTop, null); + virtualFrame.clear(stackTop); } @BytecodeInterpreterSwitch private void bytecodeStoreFastD(VirtualFrame virtualFrame, Frame localFrame, int stackTop, int bci, int index) { if (virtualFrame.isDouble(stackTop)) { localFrame.setDouble(index, virtualFrame.getDouble(stackTop)); + clearInCompiledCode(virtualFrame, stackTop); } else { generalizeStoreFast(virtualFrame, localFrame, stackTop, bci, index); } @@ -4300,7 +4327,7 @@ private void bytecodeStoreFastUnboxD(VirtualFrame virtualFrame, Frame localFrame } if (object instanceof Double) { localFrame.setDouble(index, (double) object); - virtualFrame.setObject(stackTop, null); + virtualFrame.clear(stackTop); } else { generalizeStoreFast(virtualFrame, localFrame, stackTop, bci, index); } @@ -4325,13 +4352,14 @@ private void bytecodeStoreFastBoxedD(VirtualFrame virtualFrame, Frame localFrame } else { localFrame.setObject(index, object); } - virtualFrame.setObject(stackTop, null); + virtualFrame.clear(stackTop); } @BytecodeInterpreterSwitch private void bytecodeStoreFastB(VirtualFrame virtualFrame, Frame localFrame, int stackTop, int bci, int index) { if (virtualFrame.isBoolean(stackTop)) { localFrame.setBoolean(index, virtualFrame.getBoolean(stackTop)); + clearInCompiledCode(virtualFrame, stackTop); } else { generalizeStoreFast(virtualFrame, localFrame, stackTop, bci, index); } @@ -4349,7 +4377,7 @@ private void bytecodeStoreFastUnboxB(VirtualFrame virtualFrame, Frame localFrame } if (object instanceof Boolean) { localFrame.setBoolean(index, (boolean) object); - virtualFrame.setObject(stackTop, null); + virtualFrame.clear(stackTop); } else { generalizeStoreFast(virtualFrame, localFrame, stackTop, bci, index); } @@ -4374,7 +4402,7 @@ private void bytecodeStoreFastBoxedB(VirtualFrame virtualFrame, Frame localFrame } else { localFrame.setObject(index, object); } - virtualFrame.setObject(stackTop, null); + virtualFrame.clear(stackTop); } private void generalizeStoreFast(VirtualFrame virtualFrame, Frame localFrame, int stackTop, int bci, int index) { @@ -4397,7 +4425,7 @@ private void bytecodeStoreFastO(VirtualFrame virtualFrame, Frame localFrame, int object = virtualFrame.getValue(stackTop); } localFrame.setObject(index, object); - virtualFrame.setObject(stackTop, null); + virtualFrame.clear(stackTop); } @InliningCutoff @@ -4552,7 +4580,7 @@ private void bytecodeLoadFastO(VirtualFrame virtualFrame, Frame localFrame, int @InliningCutoff private PException raiseVarReferencedBeforeAssignment(Node[] localNodes, int bci, int index) { - PRaiseNode raiseNode = insertChildNode(localNodes, bci, PRaiseNodeGen.class, NODE_RAISE); + PRaiseCachedNode raiseNode = insertChildNode(localNodes, bci, PRaiseCachedNodeGen.class, NODE_RAISE); throw raiseNode.raise(PythonBuiltinClassType.UnboundLocalError, ErrorMessages.LOCAL_VAR_REFERENCED_BEFORE_ASSIGMENT, varnames[index]); } @@ -4621,17 +4649,17 @@ private void generalizeVariableStores(int index) { } @InliningCutoff - protected PException wrapJavaExceptionIfApplicable(Throwable e) { + private PException wrapJavaExceptionIfApplicable(PythonLanguage language, Throwable e) { if (e instanceof AbstractTruffleException) { return null; } if (e instanceof ControlFlowException) { return null; } - if (PythonLanguage.get(this).getEngineOption(PythonOptions.CatchAllExceptions) && (e instanceof Exception || e instanceof AssertionError)) { - return ExceptionUtils.wrapJavaException(e, this, factory.createBaseException(SystemError, ErrorMessages.M, new Object[]{e})); + if (language.getEngineOption(PythonOptions.CatchAllExceptions) && (e instanceof Exception || e instanceof AssertionError)) { + return ExceptionUtils.wrapJavaException(e, this, PFactory.createBaseException(language, SystemError, ErrorMessages.M, new Object[]{e})); } - return ExceptionUtils.wrapJavaExceptionIfApplicable(this, e, factory); + return ExceptionUtils.wrapJavaExceptionIfApplicable(this, e); } @ExplodeLoop @@ -4669,7 +4697,7 @@ private int bytecodeFormatValue(VirtualFrame virtualFrame, int initialStackTop, Object spec = PNone.NO_VALUE; if ((options & FormatOptions.FVS_MASK) == FormatOptions.FVS_HAVE_SPEC) { spec = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); } Object value = virtualFrame.getObject(stackTop); switch (type) { @@ -4704,7 +4732,7 @@ private void bytecodeDeleteDeref(Frame localFrame, int bci, Node[] localNodes, i private int bytecodeStoreDeref(VirtualFrame virtualFrame, Frame localFrame, int stackTop, int oparg, int cachedCelloffset) { PCell cell = (PCell) localFrame.getObject(cachedCelloffset + oparg); Object value = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); cell.setRef(value); return stackTop; } @@ -4775,11 +4803,11 @@ private void bytecodeLoadAttr(VirtualFrame virtualFrame, int stackTop, int bci, virtualFrame.setObject(stackTop, value); } - private void bytecodeDeleteFast(Frame localFrame, int bci, Node[] localNodes, int oparg, boolean useCachedNodes) { + private void bytecodeDeleteFast(Frame localFrame, int bci, Node[] localNodes, int oparg) { if (localFrame.isObject(oparg)) { Object value = localFrame.getObject(oparg); if (value == null) { - raiseVarReferencedBeforeAssignment(localNodes, bci, oparg); + throw raiseVarReferencedBeforeAssignment(localNodes, bci, oparg); } } else { generalizeVariableStores(oparg); @@ -4806,7 +4834,7 @@ private int bytecodeStoreGlobal(VirtualFrame virtualFrame, Object globals, int s TruffleString varname = localNames[oparg]; WriteGlobalNode writeGlobalNode = insertChildNode(localNodes, bci, UNCACHED_WRITE_GLOBAL, WriteGlobalNodeGen.class, NODE_WRITE_GLOBAL, useCachedNodes); writeGlobalNode.write(virtualFrame, globals, varname, virtualFrame.getObject(stackTop)); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); return stackTop; } @@ -4814,7 +4842,7 @@ private int bytecodeDeleteAttr(VirtualFrame virtualFrame, int stackTop, int bci, PyObjectSetAttr callNode = insertChildNode(localNodes, bci, UNCACHED_OBJECT_SET_ATTR, PyObjectSetAttrNodeGen.class, NODE_OBJECT_SET_ATTR, useCachedNodes); TruffleString varname = localNames[oparg]; Object owner = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); callNode.deleteCached(virtualFrame, owner, varname); return stackTop; } @@ -4824,9 +4852,9 @@ private int bytecodeStoreAttr(VirtualFrame virtualFrame, int stackTop, int bci, PyObjectSetAttr callNode = insertChildNode(localNodes, bci, UNCACHED_OBJECT_SET_ATTR, PyObjectSetAttrNodeGen.class, NODE_OBJECT_SET_ATTR, useCachedNodes); TruffleString varname = localNames[oparg]; Object owner = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); Object value = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); callNode.executeCached(virtualFrame, owner, varname, value); return stackTop; } @@ -4839,7 +4867,7 @@ private void bytecodeDeleteName(VirtualFrame virtualFrame, Object globals, Objec try { delItemNode.executeCached(virtualFrame, locals, varname); } catch (PException e) { - PRaiseNode raiseNode = insertChildNode(localNodes, bci, UNCACHED_RAISE, PRaiseNodeGen.class, NODE_RAISE, useCachedNodes); + PRaiseCachedNode raiseNode = insertChildNode(localNodes, bci, UNCACHED_RAISE, PRaiseCachedNodeGen.class, NODE_RAISE, useCachedNodes); throw raiseNode.raise(NameError, ErrorMessages.NAME_NOT_DEFINED, varname); } } else { @@ -4851,9 +4879,9 @@ private void bytecodeDeleteName(VirtualFrame virtualFrame, Object globals, Objec private int bytecodeDeleteSubscr(VirtualFrame virtualFrame, int stackTop, int bci, Node[] localNodes, boolean useCachedNodes) { PyObjectDelItem delItem = insertChildNode(localNodes, bci, UNCACHED_OBJECT_DEL_ITEM, PyObjectDelItemNodeGen.class, NODE_OBJECT_DEL_ITEM, useCachedNodes); Object slice = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); Object container = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); delItem.executeCached(virtualFrame, container, slice); return stackTop; } @@ -4895,9 +4923,9 @@ private int bytecodeStoreSubscrOOO(VirtualFrame virtualFrame, int stackTop, int // Should only happen in multi-context mode return generalizeStoreSubscr(virtualFrame, stackTop, bci, localNodes, useCachedNodes); } - virtualFrame.setObject(stackTop--, null); - virtualFrame.setObject(stackTop--, null); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); + virtualFrame.clear(stackTop--); + virtualFrame.clear(stackTop--); return stackTop; } @@ -4921,9 +4949,9 @@ private int bytecodeStoreSubscrSeqIOO(VirtualFrame virtualFrame, int stackTop, i } catch (QuickeningGeneralizeException e) { return generalizeStoreSubscr(virtualFrame, stackTop, bci, localNodes, useCachedNodes); } - virtualFrame.setObject(stackTop--, null); - virtualFrame.setObject(stackTop--, null); - virtualFrame.setObject(stackTop--, null); + clearInCompiledCode(virtualFrame, stackTop--); + virtualFrame.clear(stackTop--); + virtualFrame.clear(stackTop--); return stackTop; } @@ -4944,9 +4972,9 @@ private int bytecodeStoreSubscrSeqIIO(VirtualFrame virtualFrame, int stackTop, i } catch (QuickeningGeneralizeException e) { return generalizeStoreSubscr(virtualFrame, stackTop, bci, localNodes, useCachedNodes); } - virtualFrame.setObject(stackTop--, null); - virtualFrame.setObject(stackTop--, null); - virtualFrame.setObject(stackTop--, null); + clearInCompiledCode(virtualFrame, stackTop--); + virtualFrame.clear(stackTop--); + clearInCompiledCode(virtualFrame, stackTop--); return stackTop; } @@ -4967,9 +4995,9 @@ private int bytecodeStoreSubscrSeqIDO(VirtualFrame virtualFrame, int stackTop, i } catch (QuickeningGeneralizeException e) { return generalizeStoreSubscr(virtualFrame, stackTop, bci, localNodes, useCachedNodes); } - virtualFrame.setObject(stackTop--, null); - virtualFrame.setObject(stackTop--, null); - virtualFrame.setObject(stackTop--, null); + clearInCompiledCode(virtualFrame, stackTop--); + virtualFrame.clear(stackTop--); + clearInCompiledCode(virtualFrame, stackTop--); return stackTop; } @@ -5003,13 +5031,13 @@ private int bytecodeBuildSlice(VirtualFrame virtualFrame, int stackTop, int bci, Object step; if (count == 3) { step = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); } else { assert count == 2; step = PNone.NONE; } Object stop = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); Object start = virtualFrame.getObject(stackTop); CreateSliceNode sliceNode = insertChildNode(localNodes, bci, UNCACHED_CREATE_SLICE, CreateSliceNodeGen.class, NODE_CREATE_SLICE, useCachedNodes); PSlice slice = sliceNode.execute(start, stop, step); @@ -5024,10 +5052,11 @@ private void bytecodeLoadConstCollection(VirtualFrame virtualFrame, int stackTop int kind = CollectionBits.collectionKind(typeAndKind); assert kind == CollectionBits.KIND_LIST || kind == CollectionBits.KIND_TUPLE; boolean list = kind == CollectionBits.KIND_LIST; - var context = PythonContext.get(this); - boolean useNativePrimitiveStorage = context.getLanguage().getEngineOption(PythonOptions.UseNativePrimitiveStorageStrategy); + PythonLanguage language = getLanguage(); + boolean useNativePrimitiveStorage = language.getEngineOption(PythonOptions.UseNativePrimitiveStorageStrategy); switch (CollectionBits.elementType(typeAndKind)) { case CollectionBits.ELEMENT_INT: { + var context = PythonContext.get(this); int[] a = (int[]) array; if (useNativePrimitiveStorage) { storage = context.nativeBufferContext.toNativeIntStorage(a); @@ -5075,9 +5104,9 @@ private void bytecodeLoadConstCollection(VirtualFrame virtualFrame, int stackTop throw CompilerDirectives.shouldNotReachHere(); } if (list) { - result = factory.createList(storage); + result = PFactory.createList(language, storage); } else { - result = factory.createTuple(storage); + result = PFactory.createTuple(language, storage); } virtualFrame.setObject(stackTop, result); } @@ -5101,8 +5130,8 @@ private int bytecodeCallFunctionKw(VirtualFrame virtualFrame, int initialStackTo } virtualFrame.setObject(stackTop - 2, result); - virtualFrame.setObject(stackTop--, null); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); + virtualFrame.clear(stackTop--); return stackTop; } @@ -5125,7 +5154,7 @@ private int bytecodeCallFunctionVarargs(VirtualFrame virtualFrame, int initialSt } virtualFrame.setObject(stackTop - 1, result); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); return stackTop; } @@ -5148,7 +5177,7 @@ private int bytecodeCallMethodVarargs(VirtualFrame virtualFrame, int initialStac } virtualFrame.setObject(stackTop - 1, result); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); return stackTop; } @@ -5193,16 +5222,16 @@ private int bytecodeCallFunction(VirtualFrame virtualFrame, int stackTop, int bc throw e; } - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); virtualFrame.setObject(stackTop, result); break; } case 2: { CallBinaryMethodNode callNode = insertChildNode(localNodes, bci, UNCACHED_CALL_BINARY_METHOD, CallBinaryMethodNodeGen.class, NODE_CALL_BINARY_METHOD, useCachedNodes); Object arg1 = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); Object arg0 = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); profileCEvent(virtualFrame, func, PythonContext.ProfileEvent.C_CALL, mutableData, tracingOrProfilingEnabled); try { @@ -5219,11 +5248,11 @@ private int bytecodeCallFunction(VirtualFrame virtualFrame, int stackTop, int bc case 3: { CallTernaryMethodNode callNode = insertChildNode(localNodes, bci, UNCACHED_CALL_TERNARY_METHOD, CallTernaryMethodNodeGen.class, NODE_CALL_TERNARY_METHOD, useCachedNodes); Object arg2 = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); Object arg1 = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); Object arg0 = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); profileCEvent(virtualFrame, func, PythonContext.ProfileEvent.C_CALL, mutableData, tracingOrProfilingEnabled); try { @@ -5240,13 +5269,13 @@ private int bytecodeCallFunction(VirtualFrame virtualFrame, int stackTop, int bc case 4: { CallQuaternaryMethodNode callNode = insertChildNode(localNodes, bci, UNCACHED_CALL_QUATERNARY_METHOD, CallQuaternaryMethodNodeGen.class, NODE_CALL_QUATERNARY_METHOD, useCachedNodes); Object arg3 = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); Object arg2 = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); Object arg1 = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); Object arg0 = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); profileCEvent(virtualFrame, func, PythonContext.ProfileEvent.C_CALL, mutableData, tracingOrProfilingEnabled); try { @@ -5267,21 +5296,21 @@ private int bytecodeCallFunction(VirtualFrame virtualFrame, int stackTop, int bc @BytecodeInterpreterSwitch private int bytecodeCallComprehension(VirtualFrame virtualFrame, int stackTop, int bci, Node[] localNodes, MutableLoopData mutableData, byte tracingOrProfilingEnabled) { PFunction func = (PFunction) virtualFrame.getObject(stackTop - 1); - CallTargetInvokeNode callNode = insertChildNode(localNodes, bci, CallTargetInvokeNodeGen.class, () -> CallTargetInvokeNode.create(func)); + CallComprehensionNode callNode = insertChildNode(localNodes, bci, CallComprehensionNodeGen.class, NODE_CALL_COMPREHENSION); Object result; profileCEvent(virtualFrame, func, PythonContext.ProfileEvent.C_CALL, mutableData, tracingOrProfilingEnabled); try { Object[] arguments = PArguments.create(1); PArguments.setArgument(arguments, 0, virtualFrame.getObject(stackTop)); - result = callNode.execute(virtualFrame, func, func.getGlobals(), func.getClosure(), arguments); + result = callNode.execute(virtualFrame, func, arguments); profileCEvent(virtualFrame, func, PythonContext.ProfileEvent.C_RETURN, mutableData, tracingOrProfilingEnabled); } catch (AbstractTruffleException e) { profileCEvent(virtualFrame, func, PythonContext.ProfileEvent.C_EXCEPTION, mutableData, tracingOrProfilingEnabled); throw e; } - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); virtualFrame.setObject(stackTop, result); return stackTop; } @@ -5317,7 +5346,7 @@ private int bytecodeCallMethod(VirtualFrame virtualFrame, int stackTop, int bci, throw e; } - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); virtualFrame.setObject(stackTop, result); break; } @@ -5333,18 +5362,18 @@ private int bytecodeCallMethod(VirtualFrame virtualFrame, int stackTop, int bci, throw e; } - virtualFrame.setObject(stackTop--, null); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); + virtualFrame.clear(stackTop--); virtualFrame.setObject(stackTop, result); break; } case 2: { CallTernaryMethodNode callNode = insertChildNode(localNodes, bci + 1, UNCACHED_CALL_TERNARY_METHOD, CallTernaryMethodNodeGen.class, NODE_CALL_TERNARY_METHOD, useCachedNodes); Object arg1 = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); Object arg0 = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); + virtualFrame.clear(stackTop--); profileCEvent(virtualFrame, func, PythonContext.ProfileEvent.C_CALL, mutableData, tracingOrProfilingEnabled); try { @@ -5363,12 +5392,12 @@ private int bytecodeCallMethod(VirtualFrame virtualFrame, int stackTop, int bci, CallQuaternaryMethodNode callNode = insertChildNode(localNodes, bci + 1, UNCACHED_CALL_QUATERNARY_METHOD, CallQuaternaryMethodNodeGen.class, NODE_CALL_QUATERNARY_METHOD, useCachedNodes); Object arg2 = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); Object arg1 = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); Object arg0 = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); + virtualFrame.clear(stackTop--); profileCEvent(virtualFrame, func, PythonContext.ProfileEvent.C_CALL, mutableData, tracingOrProfilingEnabled); try { @@ -5389,7 +5418,7 @@ private int bytecodeCallMethod(VirtualFrame virtualFrame, int stackTop, int bci, private int bytecodeStoreName(VirtualFrame virtualFrame, int initialStackTop, int bci, int oparg, TruffleString[] localNames, Node[] localNodes, boolean useCachedNodes) { int stackTop = initialStackTop; Object value = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); WriteNameNode writeNameNode = insertChildNode(localNodes, bci, UNCACHED_WRITE_NAME, WriteNameNodeGen.class, NODE_WRITE_NAME, useCachedNodes); writeNameNode.execute(virtualFrame, localNames[oparg], value); return stackTop; @@ -5402,13 +5431,13 @@ private AbstractTruffleException bytecodeRaiseVarargs(VirtualFrame virtualFrame, Object exception; if (count > 1) { cause = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); } else { cause = PNone.NO_VALUE; } if (count > 0) { exception = virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); } else { exception = PNone.NO_VALUE; } @@ -5418,7 +5447,7 @@ private AbstractTruffleException bytecodeRaiseVarargs(VirtualFrame virtualFrame, @InliningCutoff private void raiseUnboundCell(Node[] localNodes, int bci, int oparg, boolean useCachedNodes) { - PRaiseNode raiseNode = insertChildNode(localNodes, bci, UNCACHED_RAISE, PRaiseNodeGen.class, NODE_RAISE, useCachedNodes); + PRaiseCachedNode raiseNode = insertChildNode(localNodes, bci, UNCACHED_RAISE, PRaiseCachedNodeGen.class, NODE_RAISE, useCachedNodes); if (oparg < cellvars.length) { throw raiseNode.raise(PythonBuiltinClassType.UnboundLocalError, ErrorMessages.LOCAL_VAR_REFERENCED_BEFORE_ASSIGMENT, cellvars[oparg]); } else { @@ -5433,7 +5462,7 @@ private int bytecodeImportName(VirtualFrame virtualFrame, Object globals, int in TruffleString modname = localNames[oparg]; int stackTop = initialStackTop; TruffleString[] fromlist = (TruffleString[]) virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); int level = castNode.executeCached(virtualFrame.getObject(stackTop)); ImportNode importNode = insertChildNode(localNodes, bci + 1, UNCACHED_IMPORT, ImportNodeGen.class, NODE_IMPORT, useCachedNodes); Object result = importNode.execute(virtualFrame, modname, globals, fromlist, level); @@ -5457,28 +5486,14 @@ private int bytecodeImportStar(VirtualFrame virtualFrame, int initialStackTop, i int stackTop = initialStackTop; TruffleString importName = localNames[oparg]; int level = (int) virtualFrame.getObject(stackTop); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); ImportStarNode importStarNode = insertChildNode(localNodes, bci, UNCACHED_IMPORT_STAR, ImportStarNodeGen.class, NODE_IMPORT_STAR, useCachedNodes); importStarNode.execute(virtualFrame, importName, level); return stackTop; } - private void initCellVars(Frame localFrame) { - if (cellvars.length <= 32) { - initCellVarsExploded(localFrame); - } else { - initCellVarsLoop(localFrame); - } - } - @ExplodeLoop - private void initCellVarsExploded(Frame localFrame) { - for (int i = 0; i < cellvars.length; i++) { - initCell(localFrame, i); - } - } - - private void initCellVarsLoop(Frame localFrame) { + private void initCellVars(Frame localFrame) { for (int i = 0; i < cellvars.length; i++) { initCell(localFrame, i); } @@ -5498,31 +5513,16 @@ private void initCell(Frame localFrame, int i) { } } + @ExplodeLoop private void initFreeVars(Frame localFrame, Object[] originalArgs) { if (freevars.length > 0) { - if (freevars.length <= 32) { - initFreeVarsExploded(localFrame, originalArgs); - } else { - initFreeVarsLoop(localFrame, originalArgs); + PCell[] closure = PArguments.getClosure(originalArgs); + for (int i = 0; i < freevars.length; i++) { + localFrame.setObject(freeoffset + i, closure[i]); } } } - @ExplodeLoop - private void initFreeVarsExploded(Frame localFrame, Object[] originalArgs) { - PCell[] closure = PArguments.getClosure(originalArgs); - for (int i = 0; i < freevars.length; i++) { - localFrame.setObject(freeoffset + i, closure[i]); - } - } - - private void initFreeVarsLoop(Frame localFrame, Object[] originalArgs) { - PCell[] closure = PArguments.getClosure(originalArgs); - for (int i = 0; i < freevars.length; i++) { - localFrame.setObject(freeoffset + i, closure[i]); - } - } - @ExplodeLoop @SuppressWarnings("unchecked") private static void moveFromStack(VirtualFrame virtualFrame, int start, int stop, T[] target) { @@ -5530,29 +5530,48 @@ private static void moveFromStack(VirtualFrame virtualFrame, int start, int CompilerAsserts.partialEvaluationConstant(stop); for (int j = 0, i = start; i < stop; i++, j++) { target[j] = (T) virtualFrame.getObject(i); - virtualFrame.setObject(i, null); + virtualFrame.clear(i); + } + } + + @GenerateInline(false) + @GenerateUncached + abstract static class ObjHashMapPutNode extends Node { + public abstract void execute(VirtualFrame frame, ObjectHashMap map, Object key, Object value); + + @Specialization + static void doIt(VirtualFrame frame, ObjectHashMap map, Object key, Object value, + @Bind Node inliningTarget, + @Cached PyObjectHashNode hashNode, + @Cached ObjectHashMap.PutNode putNode) { + long hash = hashNode.execute(frame, inliningTarget, key); + putNode.put(frame, inliningTarget, map, key, hash, value); } } @ExplodeLoop - private static void moveFromStack(VirtualFrame virtualFrame, int start, int stop, PSet target, HashingCollectionNodes.SetItemNode setItem) { + private static ObjectHashMap moveFromStackToSetHashMap(VirtualFrame virtualFrame, int start, int stop, ObjHashMapPutNode putNode) { CompilerAsserts.partialEvaluationConstant(start); CompilerAsserts.partialEvaluationConstant(stop); + var result = new ObjectHashMap(stop - start, false); for (int i = start; i < stop; i++) { - setItem.executeCached(virtualFrame, target, virtualFrame.getObject(i), PNone.NONE); - virtualFrame.setObject(i, null); + putNode.execute(virtualFrame, result, virtualFrame.getObject(i), PNone.NONE); + virtualFrame.clear(i); } + return result; } @ExplodeLoop - private static void moveFromStack(VirtualFrame virtualFrame, int start, int stop, PDict target, HashingCollectionNodes.SetItemNode setItem) { + private static ObjectHashMap moveFromStackToDictHashMap(VirtualFrame virtualFrame, int start, int stop, ObjHashMapPutNode putNode) { CompilerAsserts.partialEvaluationConstant(start); CompilerAsserts.partialEvaluationConstant(stop); + var result = new ObjectHashMap((stop - start) / 2, false); for (int i = start; i + 1 < stop; i += 2) { - setItem.executeCached(virtualFrame, target, virtualFrame.getObject(i), virtualFrame.getObject(i + 1)); - virtualFrame.setObject(i, null); - virtualFrame.setObject(i + 1, null); + putNode.execute(virtualFrame, result, virtualFrame.getObject(i), virtualFrame.getObject(i + 1)); + virtualFrame.clear(i); + virtualFrame.clear(i + 1); } + return result; } @BytecodeInterpreterSwitch @@ -5563,30 +5582,28 @@ private int bytecodeCollectionFromStack(VirtualFrame virtualFrame, int type, int case CollectionBits.KIND_LIST: { ListFromStackNode storageFromStackNode = insertChildNodeInt(localNodes, nodeIndex, ListFromStackNodeGen.class, LIST_FROM_STACK_NODE, count); SequenceStorage store = storageFromStackNode.execute(virtualFrame, stackTop - count + 1, stackTop + 1); - res = factory.createList(store, storageFromStackNode); + res = PFactory.createList(getLanguage(), store, storageFromStackNode); break; } case CollectionBits.KIND_TUPLE: { TupleFromStackNode storageFromStackNode = insertChildNodeInt(localNodes, nodeIndex, TupleFromStackNodeGen.class, TUPLE_FROM_STACK_NODE, count); SequenceStorage store = storageFromStackNode.execute(virtualFrame, stackTop - count + 1, stackTop + 1); - res = factory.createTuple(store); + res = PFactory.createTuple(getLanguage(), store); break; } case CollectionBits.KIND_SET: { - PSet set = factory.createSet(); - HashingCollectionNodes.SetItemNode newNode = insertChildNode(localNodes, nodeIndex, UNCACHED_SET_ITEM, HashingCollectionNodesFactory.SetItemNodeGen.class, NODE_SET_ITEM, + ObjHashMapPutNode putNode = insertChildNode(localNodes, nodeIndex, UNCACHED_OBJ_HASHMAP_PUT, ObjHashMapPutNodeGen.class, NODE_OBJ_HASHMAP_PUT, useCachedNodes); - moveFromStack(virtualFrame, stackTop - count + 1, stackTop + 1, set, newNode); - res = set; + ObjectHashMap storage = moveFromStackToSetHashMap(virtualFrame, stackTop - count + 1, stackTop + 1, putNode); + res = PFactory.createSet(getLanguage(), new EconomicMapStorage(storage, false)); break; } case CollectionBits.KIND_DICT: { - PDict dict = factory.createDict(); - HashingCollectionNodes.SetItemNode setItem = insertChildNode(localNodes, nodeIndex, UNCACHED_SET_ITEM, HashingCollectionNodesFactory.SetItemNodeGen.class, NODE_SET_ITEM, + ObjHashMapPutNode putNode = insertChildNode(localNodes, nodeIndex, UNCACHED_OBJ_HASHMAP_PUT, ObjHashMapPutNodeGen.class, NODE_OBJ_HASHMAP_PUT, useCachedNodes); assert count % 2 == 0; - moveFromStack(virtualFrame, stackTop - count + 1, stackTop + 1, dict, setItem); - res = dict; + ObjectHashMap storage = moveFromStackToDictHashMap(virtualFrame, stackTop - count + 1, stackTop + 1, putNode); + res = PFactory.createDict(getLanguage(), new EconomicMapStorage(storage, false)); break; } case CollectionBits.KIND_KWORDS: { @@ -5626,14 +5643,14 @@ private void bytecodeCollectionFromCollection(VirtualFrame virtualFrame, int typ } case CollectionBits.KIND_SET: { SetNodes.ConstructSetNode constructNode = insertChildNode(localNodes, nodeIndex, UNCACHED_CONSTRUCT_SET, SetNodesFactory.ConstructSetNodeGen.class, NODE_CONSTRUCT_SET, useCachedNodes); - result = constructNode.executeWith(virtualFrame, sourceCollection); + result = constructNode.execute(virtualFrame, sourceCollection); break; } case CollectionBits.KIND_DICT: { // TODO create uncached node HashingStorage.InitNode initNode = insertChildNode(localNodes, nodeIndex, HashingStorageFactory.InitNodeGen.class, NODE_HASHING_STORAGE_INIT); HashingStorage storage = initNode.execute(virtualFrame, sourceCollection, PKeyword.EMPTY_KEYWORDS); - result = factory.createDict(storage); + result = PFactory.createDict(getLanguage(), storage); break; } case CollectionBits.KIND_OBJECT: { @@ -5704,9 +5721,9 @@ private int bytecodeCollectionAddCollection(VirtualFrame virtualFrame, int type, } default: CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.getUncached().raise(SystemError, ErrorMessages.INVALID_TYPE_FOR_S, "COLLECTION_ADD_COLLECTION"); + throw PRaiseNode.raiseStatic(this, SystemError, ErrorMessages.INVALID_TYPE_FOR_S, "COLLECTION_ADD_COLLECTION"); } - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); virtualFrame.setObject(stackTop, result); return stackTop; } @@ -5732,21 +5749,21 @@ private int bytecodeAddToCollection(VirtualFrame virtualFrame, int initialStackT HashingCollectionNodes.SetItemNode setItem = insertChildNode(localNodes, nodeIndex, UNCACHED_SET_ITEM, HashingCollectionNodesFactory.SetItemNodeGen.class, NODE_SET_ITEM, useCachedNodes); setItem.executeCached(virtualFrame, (PDict) collection, key, item); - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); break; } default: CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.getUncached().raise(SystemError, ErrorMessages.INVALID_TYPE_FOR_S, "ADD_TO_COLLECTION"); + throw PRaiseNode.raiseStatic(this, SystemError, ErrorMessages.INVALID_TYPE_FOR_S, "ADD_TO_COLLECTION"); } - virtualFrame.setObject(stackTop--, null); + virtualFrame.clear(stackTop--); return stackTop; } @BytecodeInterpreterSwitch private void bytecodeTupleFromList(VirtualFrame virtualFrame, int stackTop) { PList list = (PList) virtualFrame.getObject(stackTop); - Object result = factory.createTuple(list.getSequenceStorage()); + Object result = PFactory.createTuple(getLanguage(), list.getSequenceStorage()); virtualFrame.setObject(stackTop, result); } @@ -5754,7 +5771,7 @@ private void bytecodeTupleFromList(VirtualFrame virtualFrame, int stackTop) { private void bytecodeFrozensetFromList(VirtualFrame virtualFrame, int stackTop, int nodeIndex, Node[] localNodes) { PList list = (PList) virtualFrame.getObject(stackTop); HashingStorageFromListSequenceStorageNode node = insertChildNode(localNodes, nodeIndex, HashingStorageFromListSequenceStorageNodeGen.class, NODE_HASHING_STORAGE_FROM_SEQUENCE); - Object result = factory.createFrozenSet(node.execute(virtualFrame, list.getSequenceStorage())); + Object result = PFactory.createFrozenSet(getLanguage(), node.execute(virtualFrame, list.getSequenceStorage())); virtualFrame.setObject(stackTop, result); } @@ -5795,7 +5812,7 @@ private static int unwindBlock(VirtualFrame virtualFrame, int stackTop, int stac CompilerAsserts.partialEvaluationConstant(stackTop); CompilerAsserts.partialEvaluationConstant(stackTopBeforeBlock); for (int i = stackTop; i > stackTopBeforeBlock; i--) { - virtualFrame.setObject(i, null); + virtualFrame.clear(i); } return stackTopBeforeBlock; } @@ -5910,7 +5927,7 @@ protected byte[] extractCode() { * * TODO We should revisit this when the AST interpreter is removed. */ - return MarshalModuleBuiltins.serializeCodeUnit(co); + return MarshalModuleBuiltins.serializeCodeUnit(this, PythonContext.get(this), co); } @Override @@ -5920,7 +5937,7 @@ protected boolean isCloneUninitializedSupported() { @Override protected RootNode cloneUninitialized() { - return new PBytecodeRootNode(PythonLanguage.get(this), getFrameDescriptor(), getSignature(), co, source, parserErrorCallback); + return new PBytecodeRootNode(getLanguage(), getFrameDescriptor(), getSignature(), co, source, parserErrorCallback); } public void triggerDeferredDeprecationWarnings() { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PRaiseCachedNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PRaiseCachedNode.java new file mode 100644 index 0000000000..965bae46d2 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PRaiseCachedNode.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.bytecode; + +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.strings.TruffleString; + +@GenerateUncached +abstract class PRaiseCachedNode extends Node { + public final PException raise(PythonBuiltinClassType type, TruffleString format, Object... formatArgs) { + throw execute(type, format, formatArgs); + } + + protected abstract PException execute(PythonBuiltinClassType type, TruffleString format, Object[] formatArgs); + + @Specialization + PException doRaise(PythonBuiltinClassType type, TruffleString format, Object[] formatArgs) { + throw PRaiseNode.raiseStatic(this, type, format, formatArgs); + } + + @NeverDefault + public static PRaiseCachedNode create() { + return PRaiseCachedNodeGen.create(); + } + + public static PRaiseCachedNode getUncached() { + return PRaiseCachedNodeGen.getUncached(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PrintExprNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PrintExprNode.java index c8e0576ba8..8e3044132c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PrintExprNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PrintExprNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -55,6 +55,7 @@ import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; @@ -74,11 +75,12 @@ void print(VirtualFrame frame, Object object, Object displayhook = lookupAttr.execute(frame, inliningTarget, sysModule, BuiltinNames.T_DISPLAYHOOK); if (displayhook == PNone.NO_VALUE) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(this, RuntimeError, ErrorMessages.LOST_SYSDISPLAYHOOK); + throw PRaiseNode.raiseStatic(this, RuntimeError, ErrorMessages.LOST_SYSDISPLAYHOOK); } callNode.execute(frame, displayhook, object); } + @NeverDefault public static PrintExprNode create() { return PrintExprNodeGen.create(); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/RaiseNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/RaiseNode.java index 4202c74e1e..14cd3802a9 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/RaiseNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/RaiseNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -51,6 +51,7 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.ImportStatic; +import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.exception.AbstractTruffleException; import com.oracle.truffle.api.frame.VirtualFrame; @@ -95,12 +96,11 @@ static void setCause(VirtualFrame frame, Object exception, Object causeClass, @Exclusive @Cached InlinedBranchProfile baseCheckFailedProfile, @Exclusive @Cached ValidExceptionNode validException, @Exclusive @Cached CallNode callConstructor, - @Exclusive @Cached PRaiseNode.Lazy raise, @Exclusive @Cached PyExceptionInstanceCheckNode check, @Exclusive @Cached ExceptionNodes.SetCauseNode setCauseNode) { if (!validException.execute(frame, causeClass)) { baseCheckFailedProfile.enter(inliningTarget); - throw raise.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.EXCEPTION_CAUSES_MUST_DERIVE_FROM_BASE_EX); + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.EXCEPTION_CAUSES_MUST_DERIVE_FROM_BASE_EX); } Object cause = callConstructor.execute(frame, causeClass); if (check.execute(inliningTarget, cause)) { @@ -118,11 +118,10 @@ static void setCause(VirtualFrame frame, Object exception, Object causeClass, // raise * from @Specialization(guards = {"!check.execute(inliningTarget, cause)", "!isTypeNode.execute(inliningTarget, cause)"}, limit = "1") static void setCause(@SuppressWarnings("unused") VirtualFrame frame, @SuppressWarnings("unused") Object exception, @SuppressWarnings("unused") Object cause, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @Exclusive @SuppressWarnings("unused") @Cached TypeNodes.IsTypeNode isTypeNode, @SuppressWarnings("unused") @Exclusive @Cached PyExceptionInstanceCheckNode check, - @Cached PRaiseNode raise) { - throw raise.raise(PythonBuiltinClassType.TypeError, ErrorMessages.EXCEPTION_CAUSES_MUST_DERIVE_FROM_BASE_EX); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.EXCEPTION_CAUSES_MUST_DERIVE_FROM_BASE_EX); } } @@ -139,7 +138,7 @@ static void reraise(VirtualFrame frame, @SuppressWarnings("unused") PNone type, } else if (caughtException != null) { throw caughtException; } else { - throw raise.raise(RuntimeError, ErrorMessages.NO_ACTIVE_EX_TO_RERAISE); + throw raise.raise(inliningTarget, RuntimeError, ErrorMessages.NO_ACTIVE_EX_TO_RERAISE); } } @@ -178,11 +177,11 @@ public static void doRaiseNative(@SuppressWarnings("unused") VirtualFrame frame, throw PRaiseNode.raiseExceptionObject(inliningTarget, exception); } - private static void checkBaseClass(VirtualFrame frame, Node inliningTarget, Object pythonClass, ValidExceptionNode validException, PRaiseNode.Lazy raise, + private static void checkBaseClass(VirtualFrame frame, Node inliningTarget, Object pythonClass, ValidExceptionNode validException, PRaiseNode raise, InlinedBranchProfile baseCheckFailedProfile) { if (!validException.execute(frame, pythonClass)) { baseCheckFailedProfile.enter(inliningTarget); - throw raiseNoException(raise.get(inliningTarget)); + throw raiseNoException(inliningTarget, raise); } } @@ -195,13 +194,13 @@ public static void doRaise(@SuppressWarnings("unused") VirtualFrame frame, Objec @Exclusive @Cached CallNode callConstructor, @Exclusive @Cached PyExceptionInstanceCheckNode check, @Exclusive @Cached InlinedBranchProfile baseCheckFailedProfile, - @Exclusive @Cached PRaiseNode.Lazy raise) { + @Exclusive @Cached PRaiseNode raise) { checkBaseClass(frame, inliningTarget, pythonClass, validException, raise, baseCheckFailedProfile); Object newException = callConstructor.execute(frame, pythonClass); if (check.execute(inliningTarget, newException)) { throw PRaiseNode.raiseExceptionObject(inliningTarget, newException); } else { - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.SHOULD_HAVE_RETURNED_EXCEPTION, pythonClass, newException); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.SHOULD_HAVE_RETURNED_EXCEPTION, pythonClass, newException); } } @@ -211,7 +210,7 @@ public static void doRaise(@SuppressWarnings("unused") VirtualFrame frame, Objec @Bind("this") Node inliningTarget, @Exclusive @SuppressWarnings("unused") @Cached TypeNodes.IsTypeNode isTypeNode, @Exclusive @Cached ValidExceptionNode validException, - @Exclusive @Cached PRaiseNode.Lazy raise, + @Exclusive @Cached PRaiseNode raise, @Exclusive @Cached CallNode callConstructor, @Exclusive @Cached PyExceptionInstanceCheckNode check, @Exclusive @Cached InlinedBranchProfile baseCheckFailedProfile, @@ -222,7 +221,7 @@ public static void doRaise(@SuppressWarnings("unused") VirtualFrame frame, Objec setExceptionCauseNode.execute(frame, newException, cause); throw PRaiseNode.raiseExceptionObject(inliningTarget, newException); } else { - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.SHOULD_HAVE_RETURNED_EXCEPTION, pythonClass, newException); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.SHOULD_HAVE_RETURNED_EXCEPTION, pythonClass, newException); } } @@ -232,7 +231,7 @@ public static void doRaise(@SuppressWarnings("unused") VirtualFrame frame, Objec public static void doRaise(VirtualFrame frame, Object exception, Object cause, @SuppressWarnings("unused") boolean rootNodeVisible, @Bind("this") Node inliningTarget, @CachedLibrary(limit = "1") InteropLibrary lib, - @Exclusive @Cached PRaiseNode.Lazy raise) { + @Exclusive @Cached PRaiseNode raise) { if (lib.isException(exception)) { try { throw lib.throwException(exception); @@ -240,13 +239,14 @@ public static void doRaise(VirtualFrame frame, Object exception, Object cause, @ throw CompilerDirectives.shouldNotReachHere(); } } - throw raiseNoException(raise.get(inliningTarget)); + throw raiseNoException(inliningTarget, raise); } - private static PException raiseNoException(PRaiseNode raise) { - throw raise.raise(TypeError, ErrorMessages.EXCEPTIONS_MUST_DERIVE_FROM_BASE_EX); + private static PException raiseNoException(Node inliningTarget, PRaiseNode raise) { + throw raise.raise(inliningTarget, TypeError, ErrorMessages.EXCEPTIONS_MUST_DERIVE_FROM_BASE_EX); } + @NeverDefault public static RaiseNode create() { return RaiseNodeGen.create(); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SendNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SendNode.java index 96fcfa8022..b1627795ec 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SendNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SendNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,7 +47,10 @@ import com.oracle.graal.python.builtins.objects.exception.StopIterationBuiltins; import com.oracle.graal.python.builtins.objects.generator.CommonGeneratorBuiltins; import com.oracle.graal.python.builtins.objects.generator.PGenerator; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.CallSlotTpIterNextNode; +import com.oracle.graal.python.lib.IteratorExhausted; import com.oracle.graal.python.lib.PyIterCheckNode; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; import com.oracle.graal.python.nodes.PNodeWithContext; @@ -61,6 +64,7 @@ import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; @GenerateInline(false) // used in BCI root node public abstract class SendNode extends PNodeWithContext { @@ -84,23 +88,34 @@ static boolean doGenerator(VirtualFrame virtualFrame, int stackTop, PGenerator g } } - @Specialization(guards = "iterCheck.execute(inliningTarget, iter)", limit = "1") + @Specialization(guards = "hasIterSlot(slots)", limit = "1") static boolean doIterator(VirtualFrame virtualFrame, int stackTop, Object iter, @SuppressWarnings("unused") PNone arg, @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached PyIterCheckNode iterCheck, - @Cached GetNextNode getNextNode, + @SuppressWarnings("unused") @Cached GetObjectSlotsNode getSlots, + @Bind("getSlots.execute(inliningTarget, iter)") TpSlots slots, + @Cached CallSlotTpIterNextNode callIterNext, + @Exclusive @Cached InlinedBranchProfile exhaustedNoException, @Exclusive @Cached IsBuiltinObjectProfile stopIterationProfile, @Exclusive @Cached StopIterationBuiltins.StopIterationValueNode getValue) { try { - Object value = getNextNode.execute(virtualFrame, iter); + Object value = callIterNext.execute(virtualFrame, inliningTarget, slots.tp_iternext(), iter); virtualFrame.setObject(stackTop, value); return false; + } catch (IteratorExhausted e) { + exhaustedNoException.enter(inliningTarget); + virtualFrame.setObject(stackTop, null); + virtualFrame.setObject(stackTop - 1, PNone.NONE); + return true; } catch (PException e) { handleException(virtualFrame, e, inliningTarget, stopIterationProfile, getValue, stackTop); return true; } } + protected static boolean hasIterSlot(TpSlots slots) { + return PyIterCheckNode.checkSlots(slots); + } + @Fallback static boolean doOther(VirtualFrame virtualFrame, int stackTop, Object obj, Object arg, @Bind("this") Node inliningTarget, diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SetupAnnotationsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SetupAnnotationsNode.java index ab7481b702..af6bb2069b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SetupAnnotationsNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SetupAnnotationsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,6 +43,7 @@ import static com.oracle.graal.python.builtins.objects.function.PArguments.getSpecialArgument; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___ANNOTATIONS__; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.dict.PDict; @@ -57,10 +58,10 @@ import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.bytecode.OperationProxy; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; @@ -70,11 +71,13 @@ import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.profiles.InlinedConditionProfile; @GenerateUncached @ImportStatic(PArguments.class) @GenerateInline(false) // used in BCI root node +@OperationProxy.Proxyable public abstract class SetupAnnotationsNode extends PNodeWithContext { public abstract void execute(Frame frame); @@ -98,13 +101,14 @@ public abstract static class SetupAnnotationsFromDictOrModuleNode extends PNodeW public abstract void execute(Frame frame, Node inliningTarget, Object locals); @Specialization - static void doModule(PythonModule locals, + static void doModule(Node inliningTarget, PythonModule locals, @Cached(inline = false) ReadAttributeFromObjectNode read, @Cached(inline = false) WriteAttributeToObjectNode write, - @Shared("factory") @Cached(inline = false) PythonObjectFactory factory) { + @Cached InlinedBranchProfile create) { Object annotations = read.execute(locals, T___ANNOTATIONS__); if (annotations == PNone.NO_VALUE) { - write.execute(locals, T___ANNOTATIONS__, factory.createDict()); + create.enter(inliningTarget); + write.execute(locals, T___ANNOTATIONS__, PFactory.createDict(PythonLanguage.get(inliningTarget))); } } @@ -112,10 +116,11 @@ static void doModule(PythonModule locals, static void doBuiltinDict(VirtualFrame frame, Node inliningTarget, PDict locals, @Cached PyDictGetItem getItem, @Cached PyDictSetItem setItem, - @Shared("factory") @Cached(inline = false) PythonObjectFactory factory) { + @Cached InlinedBranchProfile create) { Object annotations = getItem.execute(frame, inliningTarget, locals, T___ANNOTATIONS__); if (annotations == null) { - setItem.execute(frame, inliningTarget, locals, T___ANNOTATIONS__, factory.createDict()); + create.enter(inliningTarget); + setItem.execute(frame, inliningTarget, locals, T___ANNOTATIONS__, PFactory.createDict(PythonLanguage.get(inliningTarget))); } } @@ -123,13 +128,12 @@ static void doBuiltinDict(VirtualFrame frame, Node inliningTarget, PDict locals, static void doOther(VirtualFrame frame, Node inliningTarget, Object locals, @Cached PyObjectGetItem getItem, @Cached PyObjectSetItem setItem, - @Cached IsBuiltinObjectProfile errorProfile, - @Shared("factory") @Cached(inline = false) PythonObjectFactory factory) { + @Cached IsBuiltinObjectProfile errorProfile) { try { getItem.execute(frame, inliningTarget, locals, T___ANNOTATIONS__); } catch (PException e) { e.expect(inliningTarget, PythonBuiltinClassType.KeyError, errorProfile); - setItem.execute(frame, inliningTarget, locals, T___ANNOTATIONS__, factory.createDict()); + setItem.execute(frame, inliningTarget, locals, T___ANNOTATIONS__, PFactory.createDict(PythonLanguage.get(inliningTarget))); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SetupAwithNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SetupAwithNode.java index b680d4ea7e..5c5bdfafd9 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SetupAwithNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SetupAwithNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,27 +41,26 @@ package com.oracle.graal.python.nodes.bytecode; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___AENTER__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___AEXIT__; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; +import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; @GenerateUncached -@ImportStatic(SpecialMethodSlot.class) @GenerateInline(false) // used in BCI root node public abstract class SetupAwithNode extends PNodeWithContext { public abstract int execute(Frame frame, int stackTop); @@ -70,20 +69,20 @@ public abstract class SetupAwithNode extends PNodeWithContext { static int setup(VirtualFrame frame, int stackTopIn, @Bind("this") Node inliningTarget, @Cached GetClassNode getClassNode, - @Cached(parameters = "AEnter") LookupSpecialMethodSlotNode lookupAEnter, - @Cached(parameters = "AExit") LookupSpecialMethodSlotNode lookupAExit, + @Cached LookupSpecialMethodNode.Dynamic lookupAEnter, + @Cached LookupSpecialMethodNode.Dynamic lookupAExit, @Cached CallUnaryMethodNode callEnter, @Cached PRaiseNode raiseNode) { int stackTop = stackTopIn; Object contextManager = frame.getObject(stackTop); Object type = getClassNode.execute(inliningTarget, contextManager); - Object enter = lookupAEnter.execute(frame, type, contextManager); + Object enter = lookupAEnter.execute(frame, inliningTarget, type, T___AENTER__, contextManager); if (enter == PNone.NO_VALUE) { - throw raiseNode.raise(TypeError, ErrorMessages.N_OBJECT_DOES_NOT_SUPPORT_THE_ASYNC_CONTEXT_MANAGER_PROTOCOL, type); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.N_OBJECT_DOES_NOT_SUPPORT_THE_ASYNC_CONTEXT_MANAGER_PROTOCOL, type); } - Object exit = lookupAExit.execute(frame, type, contextManager); + Object exit = lookupAExit.execute(frame, inliningTarget, type, T___AEXIT__, contextManager); if (exit == PNone.NO_VALUE) { - throw raiseNode.raise(TypeError, ErrorMessages.N_OBJECT_DOES_NOT_SUPPORT_THE_ASYNC_CONTEXT_MANAGER_PROTOCOL_AEXIT, type); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.N_OBJECT_DOES_NOT_SUPPORT_THE_ASYNC_CONTEXT_MANAGER_PROTOCOL_AEXIT, type); } Object res = callEnter.executeObject(frame, enter, contextManager); frame.setObject(++stackTop, exit); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SetupWithNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SetupWithNode.java index ab61c3e4f6..935368bd8d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SetupWithNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/SetupWithNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,27 +41,26 @@ package com.oracle.graal.python.nodes.bytecode; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ENTER__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___EXIT__; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; +import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; @GenerateUncached -@ImportStatic(SpecialMethodSlot.class) @GenerateInline(false) // used in BCI root node public abstract class SetupWithNode extends PNodeWithContext { public abstract int execute(Frame frame, int stackTop); @@ -70,20 +69,20 @@ public abstract class SetupWithNode extends PNodeWithContext { static int setup(VirtualFrame frame, int stackTopIn, @Bind("this") Node inliningTarget, @Cached GetClassNode getClassNode, - @Cached(parameters = "Enter") LookupSpecialMethodSlotNode lookupEnter, - @Cached(parameters = "Exit") LookupSpecialMethodSlotNode lookupExit, + @Cached LookupSpecialMethodNode.Dynamic lookupEnter, + @Cached LookupSpecialMethodNode.Dynamic lookupExit, @Cached CallUnaryMethodNode callEnter, @Cached PRaiseNode raiseNode) { int stackTop = stackTopIn; Object contextManager = frame.getObject(stackTop); Object type = getClassNode.execute(inliningTarget, contextManager); - Object enter = lookupEnter.execute(frame, type, contextManager); + Object enter = lookupEnter.execute(frame, inliningTarget, type, T___ENTER__, contextManager); if (enter == PNone.NO_VALUE) { - throw raiseNode.raise(TypeError, ErrorMessages.N_OBJECT_DOES_NOT_SUPPORT_CONTEXT_MANAGER_PROTOCOL, type); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.N_OBJECT_DOES_NOT_SUPPORT_CONTEXT_MANAGER_PROTOCOL, type); } - Object exit = lookupExit.execute(frame, type, contextManager); + Object exit = lookupExit.execute(frame, inliningTarget, type, T___EXIT__, contextManager); if (exit == PNone.NO_VALUE) { - throw raiseNode.raise(TypeError, ErrorMessages.N_OBJECT_DOES_NOT_SUPPORT_CONTEXT_MANAGER_PROTOCOL_EXIT, type); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.N_OBJECT_DOES_NOT_SUPPORT_CONTEXT_MANAGER_PROTOCOL_EXIT, type); } Object res = callEnter.executeObject(frame, enter, contextManager); frame.setObject(++stackTop, exit); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/UnpackExNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/UnpackExNode.java index 9813e6c1da..2d143f816d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/UnpackExNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/UnpackExNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,10 +43,12 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.common.SequenceNodes; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.builtins.objects.list.PList; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; @@ -54,14 +56,13 @@ import com.oracle.graal.python.nodes.builtins.ListNodes; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.PSequence; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; @@ -82,8 +83,8 @@ static int doUnpackSequence(VirtualFrame frame, int initialStackTop, PSequence s @Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode, @Exclusive @Cached SequenceStorageNodes.GetItemScalarNode getItemNode, @Exclusive @Cached SequenceStorageNodes.GetItemSliceNode getItemSliceNode, - @Shared("factory") @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Exclusive @Cached PRaiseNode raiseNode) { CompilerAsserts.partialEvaluationConstant(countBefore); CompilerAsserts.partialEvaluationConstant(countAfter); int resultStackTop = initialStackTop + countBefore + 1 + countAfter; @@ -92,10 +93,10 @@ static int doUnpackSequence(VirtualFrame frame, int initialStackTop, PSequence s int len = storage.length(); int starLen = len - countBefore - countAfter; if (starLen < 0) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK_EX, countBefore + countAfter, len); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK_EX, countBefore + countAfter, len); } stackTop = moveItemsToStack(frame, inliningTarget, storage, stackTop, 0, countBefore, getItemNode); - PList starList = factory.createList(getItemSliceNode.execute(storage, countBefore, countBefore + starLen, 1, starLen)); + PList starList = PFactory.createList(language, getItemSliceNode.execute(storage, countBefore, countBefore + starLen, 1, starLen)); frame.setObject(stackTop--, starList); moveItemsToStack(frame, inliningTarget, storage, stackTop, len - countAfter, countAfter, getItemNode); return resultStackTop; @@ -105,14 +106,13 @@ static int doUnpackSequence(VirtualFrame frame, int initialStackTop, PSequence s static int doUnpackIterable(VirtualFrame frame, int initialStackTop, Object collection, int countBefore, int countAfter, @Bind("this") Node inliningTarget, @Cached PyObjectGetIter getIter, - @Cached GetNextNode getNextNode, + @Cached PyIterNextNode nextNode, @Cached IsBuiltinObjectProfile notIterableProfile, - @Cached IsBuiltinObjectProfile stopIterationProfile, @Cached ListNodes.ConstructListNode constructListNode, @Exclusive @Cached SequenceStorageNodes.GetItemScalarNode getItemNode, @Exclusive @Cached SequenceStorageNodes.GetItemSliceNode getItemSliceNode, - @Shared("factory") @Cached PythonObjectFactory factory, - @Exclusive @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Exclusive @Cached PRaiseNode raiseNode) { CompilerAsserts.partialEvaluationConstant(countBefore); CompilerAsserts.partialEvaluationConstant(countAfter); int resultStackTop = initialStackTop + countBefore + 1 + countAfter; @@ -122,20 +122,20 @@ static int doUnpackIterable(VirtualFrame frame, int initialStackTop, Object coll iterator = getIter.execute(frame, inliningTarget, collection); } catch (PException e) { e.expectTypeError(inliningTarget, notIterableProfile); - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.CANNOT_UNPACK_NON_ITERABLE, collection); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANNOT_UNPACK_NON_ITERABLE, collection); } - stackTop = moveItemsToStack(frame, inliningTarget, iterator, stackTop, 0, countBefore, countBefore + countAfter, getNextNode, stopIterationProfile, raiseNode); + stackTop = moveItemsToStack(frame, inliningTarget, iterator, stackTop, 0, countBefore, countBefore + countAfter, nextNode, raiseNode); PList starAndAfter = constructListNode.execute(frame, iterator); SequenceStorage storage = starAndAfter.getSequenceStorage(); int lenAfter = storage.length(); if (lenAfter < countAfter) { - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK_EX, countBefore + countAfter, countBefore + lenAfter); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK_EX, countBefore + countAfter, countBefore + lenAfter); } if (countAfter == 0) { frame.setObject(stackTop, starAndAfter); } else { int starLen = lenAfter - countAfter; - PList starList = factory.createList(getItemSliceNode.execute(storage, 0, starLen, 1, starLen)); + PList starList = PFactory.createList(language, getItemSliceNode.execute(storage, 0, starLen, 1, starLen)); frame.setObject(stackTop--, starList); moveItemsToStack(frame, inliningTarget, storage, stackTop, starLen, countAfter, getItemNode); } @@ -143,17 +143,16 @@ static int doUnpackIterable(VirtualFrame frame, int initialStackTop, Object coll } @ExplodeLoop - private static int moveItemsToStack(VirtualFrame frame, Node inliningTarget, Object iterator, int initialStackTop, int offset, int length, int totalLength, GetNextNode getNextNode, - IsBuiltinObjectProfile stopIterationProfile, PRaiseNode.Lazy raiseNode) { + private static int moveItemsToStack(VirtualFrame frame, Node inliningTarget, Object iterator, int initialStackTop, int offset, int length, int totalLength, PyIterNextNode nextNode, + PRaiseNode raiseNode) { CompilerAsserts.partialEvaluationConstant(length); int stackTop = initialStackTop; for (int i = 0; i < length; i++) { try { - Object item = getNextNode.execute(frame, iterator); + Object item = nextNode.execute(frame, inliningTarget, iterator); frame.setObject(stackTop--, item); - } catch (PException e) { - e.expectStopIteration(inliningTarget, stopIterationProfile); - throw raiseNode.get(inliningTarget).raise(ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK_EX, totalLength, offset + i); + } catch (IteratorExhausted e) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK_EX, totalLength, offset + i); } } return stackTop; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/UnpackSequenceNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/UnpackSequenceNode.java index ba0058e701..a2a4d5e5d9 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/UnpackSequenceNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/UnpackSequenceNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,7 +45,8 @@ import com.oracle.graal.python.builtins.objects.common.SequenceNodes; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; -import com.oracle.graal.python.lib.GetNextNode; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyIterNextNode; import com.oracle.graal.python.lib.PyObjectGetIter; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; @@ -90,9 +91,9 @@ static int doUnpackSequence(VirtualFrame frame, int initialStackTop, PSequence s } } else { if (len < count) { - throw raiseNode.raise(ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK, count, len); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK, count, len); } else { - throw raiseNode.raise(ValueError, ErrorMessages.TOO_MANY_VALUES_TO_UNPACK, count); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.TOO_MANY_VALUES_TO_UNPACK, count); } } return resultStackTop; @@ -103,10 +104,8 @@ static int doUnpackSequence(VirtualFrame frame, int initialStackTop, PSequence s static int doUnpackIterable(Frame frame, int initialStackTop, Object collection, int count, @Bind("this") Node inliningTarget, @Cached PyObjectGetIter getIter, - @Cached GetNextNode getNextNode, + @Cached PyIterNextNode nextNode, @Cached IsBuiltinObjectProfile notIterableProfile, - @Cached IsBuiltinObjectProfile stopIterationProfile1, - @Cached IsBuiltinObjectProfile stopIterationProfile2, @Shared("raise") @Cached PRaiseNode raiseNode) { CompilerAsserts.partialEvaluationConstant(count); int resultStackTop = initialStackTop + count; @@ -116,24 +115,22 @@ static int doUnpackIterable(Frame frame, int initialStackTop, Object collection, iterator = getIter.execute(frame, inliningTarget, collection); } catch (PException e) { e.expectTypeError(inliningTarget, notIterableProfile); - throw raiseNode.raise(TypeError, ErrorMessages.CANNOT_UNPACK_NON_ITERABLE, collection); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.CANNOT_UNPACK_NON_ITERABLE, collection); } for (int i = 0; i < count; i++) { try { - Object item = getNextNode.execute(frame, iterator); + Object item = nextNode.execute(frame, inliningTarget, iterator); frame.setObject(stackTop--, item); - } catch (PException e) { - e.expectStopIteration(inliningTarget, stopIterationProfile1); - throw raiseNode.raise(ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK, count, i); + } catch (IteratorExhausted e) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK, count, i); } } try { - getNextNode.execute(frame, iterator); - } catch (PException e) { - e.expectStopIteration(inliningTarget, stopIterationProfile2); + nextNode.execute(frame, inliningTarget, iterator); + } catch (IteratorExhausted e) { return resultStackTop; } - throw raiseNode.raise(ValueError, ErrorMessages.TOO_MANY_VALUES_TO_UNPACK, count); + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.TOO_MANY_VALUES_TO_UNPACK, count); } public static UnpackSequenceNode create() { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/instrumentation/InstrumentationSupport.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/instrumentation/InstrumentationSupport.java index ca1734135a..28c0807e52 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/instrumentation/InstrumentationSupport.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/instrumentation/InstrumentationSupport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,7 +40,7 @@ */ package com.oracle.graal.python.nodes.bytecode.instrumentation; -import com.oracle.graal.python.compiler.CodeUnit; +import com.oracle.graal.python.compiler.BytecodeCodeUnit; import com.oracle.graal.python.compiler.OpCodes; import com.oracle.graal.python.nodes.BuiltinNames; import com.oracle.graal.python.nodes.bytecode.PBytecodeRootNode; @@ -62,7 +62,7 @@ * @see InstrumentationRoot */ public final class InstrumentationSupport extends Node { - final CodeUnit code; + final BytecodeCodeUnit code; @Children InstrumentedBytecodeStatement[] statements; /* * When instrumentation is active, this array is used instead of PBytecodeRootNode#adoptedNodes diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/BytecodeDSLCodeUnit.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/BytecodeDSLCodeUnit.java new file mode 100644 index 0000000000..d43796c1ec --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/BytecodeDSLCodeUnit.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.bytecode_dsl; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import com.oracle.graal.python.builtins.modules.MarshalModuleBuiltins; +import com.oracle.graal.python.builtins.modules.MarshalModuleBuiltins.PBytecodeDSLSerializer; +import com.oracle.graal.python.compiler.CodeUnit; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.truffle.api.CompilerAsserts; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.bytecode.BytecodeRootNodes; +import com.oracle.truffle.api.bytecode.serialization.BytecodeSerializer; +import com.oracle.truffle.api.source.Source; +import com.oracle.truffle.api.strings.TruffleString; + +public final class BytecodeDSLCodeUnit extends CodeUnit { + /* + * A {@link BytecodeDSLCodeUnit} is a context-independent representation of a root node. It + * contains the bytes produced from Bytecode DSL serialization. + * + * Since it is expensive to serialize every root node, we perform serialization lazily using the + * {@link BytecodeNodes} produced during parsing. + * + * When this code unit is directly instantiated via unmarshaling, there is no {@link + * BytecodeNodes}; instead, we store the serialized bytes directly. + */ + private volatile byte[] serialized; + private final BytecodeRootNodes nodes; + public final int classcellIndex; + public final int selfIndex; + + public BytecodeDSLCodeUnit(TruffleString name, TruffleString qualname, int argCount, int kwOnlyArgCount, int positionalOnlyArgCount, int flags, TruffleString[] names, TruffleString[] varnames, + TruffleString[] cellvars, TruffleString[] freevars, int[] cell2arg, Object[] constants, int startLine, int startColumn, int endLine, int endColumn, + int classcellIndex, int selfIndex, byte[] serialized, BytecodeRootNodes nodes) { + super(name, qualname, argCount, kwOnlyArgCount, positionalOnlyArgCount, flags, names, varnames, cellvars, freevars, cell2arg, constants, startLine, startColumn, endLine, endColumn); + // Only one of these fields should be set. The other gets computed dynamically. + assert serialized == null ^ nodes == null; + this.serialized = serialized; + this.nodes = nodes; + this.classcellIndex = classcellIndex; + this.selfIndex = selfIndex; + } + + @TruffleBoundary + public PBytecodeDSLRootNode createRootNode(PythonContext context, Source source) { + byte[] toDeserialize = getSerialized(context); + BytecodeRootNodes deserialized = MarshalModuleBuiltins.deserializeBytecodeNodes(context, source, toDeserialize); + assert deserialized.count() == 1; + PBytecodeDSLRootNode result = deserialized.getNode(0); + result.setMetadata(this, null); + return result; + } + + public byte[] getSerialized(PythonContext context) { + CompilerAsserts.neverPartOfCompilation(); + byte[] result = serialized; + if (result == null) { + synchronized (this) { + result = serialized; + if (result == null) { + result = serialized = computeSerialized(context); + } + } + } + return result; + } + + @SuppressWarnings("unchecked") + @TruffleBoundary + private byte[] computeSerialized(PythonContext context) { + try { + BytecodeSerializer serializer = new PBytecodeDSLSerializer(context); + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + nodes.serialize(new DataOutputStream(bytes), serializer); + return bytes.toByteArray(); + } catch (IOException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } + + public TruffleString getDocstring() { + // The first constant in the code unit is the docstring (if available) or PNone. + if (constants.length > 0 && constants[0] instanceof TruffleString docstring) { + return docstring; + } + return null; + } + + @Override + protected void dumpBytecode(StringBuilder sb, boolean optimized) { + for (int i = 0; i < nodes.count(); i++) { + if (i != 0) { + sb.append('\n'); + } + sb.append(nodes.getNode(i).dump()); + sb.append('\n'); // dump does not print newline at the end + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/BytecodeDSLFrameInfo.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/BytecodeDSLFrameInfo.java new file mode 100644 index 0000000000..1ef3e7a87e --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/BytecodeDSLFrameInfo.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.bytecode_dsl; + +import com.oracle.graal.python.compiler.CodeUnit; +import com.oracle.graal.python.nodes.bytecode.FrameInfo; +import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; +import com.oracle.truffle.api.frame.Frame; + +public class BytecodeDSLFrameInfo implements FrameInfo { + @CompilationFinal PBytecodeDSLRootNode rootNode; + + /** + * The root node cannot be created without a frame descriptor, which cannot be created without + * the frame info, so we have to set the root node after the frame info is constructed. + */ + void setRootNode(PBytecodeDSLRootNode rootNode) { + this.rootNode = rootNode; + } + + @Override + public PBytecodeDSLRootNode getRootNode() { + return rootNode; + } + + @Override + public int getFirstLineNumber() { + return rootNode.getFirstLineno(); + } + + @Override + public Object getYieldFrom(Frame generatorFrame, int bci, int stackTop) { + // TODO implement + throw new UnsupportedOperationException("not implemented"); + } + + @Override + public CodeUnit getCodeUnit() { + return rootNode.getCodeUnit(); + } + + @Override + public boolean includeInTraceback() { + return !rootNode.isInternal(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/MakeSetStorageNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/MakeSetStorageNode.java new file mode 100644 index 0000000000..357c09f1ec --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/MakeSetStorageNode.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.bytecode_dsl; + +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.common.EconomicMapStorage; +import com.oracle.graal.python.builtins.objects.common.ObjectHashMap; +import com.oracle.graal.python.builtins.objects.common.ObjectHashMap.PutNode; +import com.oracle.graal.python.lib.PyObjectHashNode; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedIntValueProfile; + +@GenerateInline +@GenerateUncached +@GenerateCached(false) +public abstract class MakeSetStorageNode extends Node { + public abstract EconomicMapStorage execute(VirtualFrame frame, Node inliningTarget, Object[] elements); + + @Specialization + public static EconomicMapStorage doNonEmpty(VirtualFrame frame, Node inliningTarget, Object[] elements, + @Cached InlinedIntValueProfile lengthProfile, + @Cached PyObjectHashNode hashNode, + @Cached PutNode putNode) { + int profiledLen = lengthProfile.profile(inliningTarget, elements.length); + ObjectHashMap map = new ObjectHashMap(profiledLen, false); + for (int i = 0; i < profiledLen; i++) { + Object key = elements[i]; + long keyHash = hashNode.execute(frame, inliningTarget, key); + putNode.put(frame, inliningTarget, map, key, keyHash, PNone.NONE); + } + return new EconomicMapStorage(map, false); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/PBytecodeDSLGeneratorFunctionRootNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/PBytecodeDSLGeneratorFunctionRootNode.java new file mode 100644 index 0000000000..1d3840e2d2 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/PBytecodeDSLGeneratorFunctionRootNode.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.bytecode_dsl; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.function.PArguments; +import com.oracle.graal.python.builtins.objects.function.PFunction; +import com.oracle.graal.python.builtins.objects.function.Signature; +import com.oracle.graal.python.nodes.PRootNode; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.CompilerAsserts; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.frame.FrameDescriptor; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.profiles.ConditionProfile; +import com.oracle.truffle.api.source.SourceSection; +import com.oracle.truffle.api.strings.TruffleString; + +public final class PBytecodeDSLGeneratorFunctionRootNode extends PRootNode { + private final PBytecodeDSLRootNode rootNode; + private final TruffleString originalName; + private final ConditionProfile isIterableCoroutine = ConditionProfile.create(); + + public PBytecodeDSLGeneratorFunctionRootNode(PythonLanguage language, FrameDescriptor frameDescriptor, PBytecodeDSLRootNode rootNode, TruffleString originalName) { + super(language, frameDescriptor); + CompilerAsserts.neverPartOfCompilation(); + this.rootNode = rootNode; + this.originalName = originalName; + } + + @Override + public Object execute(VirtualFrame frame) { + Object[] arguments = frame.getArguments(); + + // This is passed from InvokeNode node + PFunction generatorFunction = PArguments.getGeneratorFunction(arguments); + assert generatorFunction != null; + if (rootNode.getCodeUnit().isGenerator()) { + // if CO_ITERABLE_COROUTINE was explicitly set (likely by types.coroutine), we have to + // pass the information to the generator + // .gi_code.co_flags will still be wrong, but at least await will work correctly + if (isIterableCoroutine.profile((generatorFunction.getCode().getFlags() & 0x100) != 0)) { + return PFactory.createIterableCoroutine(rootNode.getLanguage(), generatorFunction.getName(), generatorFunction.getQualname(), rootNode, arguments); + } else { + return PFactory.createGenerator(rootNode.getLanguage(), generatorFunction.getName(), generatorFunction.getQualname(), rootNode, arguments); + } + } else if (rootNode.getCodeUnit().isCoroutine()) { + return PFactory.createCoroutine(rootNode.getLanguage(), generatorFunction.getName(), generatorFunction.getQualname(), rootNode, arguments); + } else if (rootNode.getCodeUnit().isAsyncGenerator()) { + /* + * TODO: Support async generators. + * + * We need to produce something instead of failing here because async generators are + * instantiated in frozen module code. + */ + return PNone.NONE; + } + throw CompilerDirectives.shouldNotReachHere("Unknown generator/coroutine type"); + } + + @Override + public String getName() { + return originalName.toJavaStringUncached(); + } + + @Override + public String toString() { + CompilerAsserts.neverPartOfCompilation(); + return ""; + } + + @Override + public Signature getSignature() { + return rootNode.getSignature(); + } + + @Override + public boolean isPythonInternal() { + return rootNode.isPythonInternal(); + } + + @Override + public SourceSection getSourceSection() { + return rootNode.getSourceSection(); + } + + @Override + protected byte[] extractCode() { + return rootNode.extractCode(); + } + + public PBytecodeDSLRootNode getBytecodeRootNode() { + return rootNode; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/PBytecodeDSLRootNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/PBytecodeDSLRootNode.java new file mode 100644 index 0000000000..c293129ab7 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode_dsl/PBytecodeDSLRootNode.java @@ -0,0 +1,3370 @@ +/* + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.bytecode_dsl; + +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.AttributeError; +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.GeneratorExit; +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError; +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError; +import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___ANNOTATIONS__; +import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DOC__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___AENTER__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___AEXIT__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ENTER__; +import static com.oracle.graal.python.nodes.SpecialMethodNames.T___EXIT__; +import static com.oracle.graal.python.runtime.exception.PythonErrorType.AssertionError; +import static com.oracle.graal.python.util.PythonUtils.tsLiteral; + +import java.math.BigInteger; +import java.util.Iterator; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.modules.BuiltinFunctions.FormatNode; +import com.oracle.graal.python.builtins.modules.MarshalModuleBuiltins; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.asyncio.GetAwaitableNode; +import com.oracle.graal.python.builtins.objects.cell.PCell; +import com.oracle.graal.python.builtins.objects.code.PCode; +import com.oracle.graal.python.builtins.objects.common.EconomicMapStorage; +import com.oracle.graal.python.builtins.objects.common.HashingStorage; +import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItem; +import com.oracle.graal.python.builtins.objects.common.ObjectHashMap; +import com.oracle.graal.python.builtins.objects.common.SequenceNodes; +import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; +import com.oracle.graal.python.builtins.objects.dict.DictNodes; +import com.oracle.graal.python.builtins.objects.dict.PDict; +import com.oracle.graal.python.builtins.objects.exception.ChainExceptionsNode; +import com.oracle.graal.python.builtins.objects.exception.ExceptionNodes; +import com.oracle.graal.python.builtins.objects.exception.PBaseException; +import com.oracle.graal.python.builtins.objects.exception.StopIterationBuiltins; +import com.oracle.graal.python.builtins.objects.frame.PFrame; +import com.oracle.graal.python.builtins.objects.function.PArguments; +import com.oracle.graal.python.builtins.objects.function.PFunction; +import com.oracle.graal.python.builtins.objects.function.PKeyword; +import com.oracle.graal.python.builtins.objects.function.Signature; +import com.oracle.graal.python.builtins.objects.generator.CommonGeneratorBuiltins; +import com.oracle.graal.python.builtins.objects.generator.PGenerator; +import com.oracle.graal.python.builtins.objects.iterator.PDoubleSequenceIterator; +import com.oracle.graal.python.builtins.objects.iterator.PIntRangeIterator; +import com.oracle.graal.python.builtins.objects.iterator.PIntegerIterator; +import com.oracle.graal.python.builtins.objects.iterator.PIntegerSequenceIterator; +import com.oracle.graal.python.builtins.objects.iterator.PLongSequenceIterator; +import com.oracle.graal.python.builtins.objects.iterator.PObjectSequenceIterator; +import com.oracle.graal.python.builtins.objects.list.PList; +import com.oracle.graal.python.builtins.objects.set.PFrozenSet; +import com.oracle.graal.python.builtins.objects.set.PSet; +import com.oracle.graal.python.builtins.objects.set.SetNodes; +import com.oracle.graal.python.builtins.objects.tuple.PTuple; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; +import com.oracle.graal.python.compiler.CodeUnit; +import com.oracle.graal.python.compiler.RaisePythonExceptionErrorCallback; +import com.oracle.graal.python.lib.IteratorExhausted; +import com.oracle.graal.python.lib.PyIterCheckNode; +import com.oracle.graal.python.lib.PyIterNextNode; +import com.oracle.graal.python.lib.PyNumberAddNode; +import com.oracle.graal.python.lib.PyNumberAndNode; +import com.oracle.graal.python.lib.PyNumberFloorDivideNode; +import com.oracle.graal.python.lib.PyNumberInPlaceAddNode; +import com.oracle.graal.python.lib.PyNumberInPlaceAndNode; +import com.oracle.graal.python.lib.PyNumberInPlaceFloorDivideNode; +import com.oracle.graal.python.lib.PyNumberInPlaceLshiftNode; +import com.oracle.graal.python.lib.PyNumberInPlaceMatrixMultiplyNode; +import com.oracle.graal.python.lib.PyNumberInPlaceMultiplyNode; +import com.oracle.graal.python.lib.PyNumberInPlaceOrNode; +import com.oracle.graal.python.lib.PyNumberInPlacePowerNode; +import com.oracle.graal.python.lib.PyNumberInPlaceRemainderNode; +import com.oracle.graal.python.lib.PyNumberInPlaceRshiftNode; +import com.oracle.graal.python.lib.PyNumberInPlaceSubtractNode; +import com.oracle.graal.python.lib.PyNumberInPlaceTrueDivideNode; +import com.oracle.graal.python.lib.PyNumberInPlaceXorNode; +import com.oracle.graal.python.lib.PyNumberInvertNode; +import com.oracle.graal.python.lib.PyNumberLshiftNode; +import com.oracle.graal.python.lib.PyNumberMatrixMultiplyNode; +import com.oracle.graal.python.lib.PyNumberMultiplyNode; +import com.oracle.graal.python.lib.PyNumberNegativeNode; +import com.oracle.graal.python.lib.PyNumberOrNode; +import com.oracle.graal.python.lib.PyNumberPositiveNode; +import com.oracle.graal.python.lib.PyNumberPowerNode; +import com.oracle.graal.python.lib.PyNumberRemainderNode; +import com.oracle.graal.python.lib.PyNumberRshiftNode; +import com.oracle.graal.python.lib.PyNumberSubtractNode; +import com.oracle.graal.python.lib.PyNumberTrueDivideNode; +import com.oracle.graal.python.lib.PyNumberXorNode; +import com.oracle.graal.python.lib.PyObjectAsciiNode; +import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; +import com.oracle.graal.python.lib.PyObjectDelItem; +import com.oracle.graal.python.lib.PyObjectFunctionStr; +import com.oracle.graal.python.lib.PyObjectGetItem; +import com.oracle.graal.python.lib.PyObjectGetIter; +import com.oracle.graal.python.lib.PyObjectGetMethod; +import com.oracle.graal.python.lib.PyObjectHashNode; +import com.oracle.graal.python.lib.PyObjectIsNotTrueNode; +import com.oracle.graal.python.lib.PyObjectIsTrueNode; +import com.oracle.graal.python.lib.PyObjectLookupAttr; +import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode; +import com.oracle.graal.python.lib.PyObjectRichCompare.GenericRichCompare; +import com.oracle.graal.python.lib.PyObjectSetAttr; +import com.oracle.graal.python.lib.PyObjectSetAttrO; +import com.oracle.graal.python.lib.PyObjectSetItem; +import com.oracle.graal.python.lib.PyObjectSizeNode; +import com.oracle.graal.python.lib.PyObjectStrAsTruffleStringNode; +import com.oracle.graal.python.lib.PySequenceContainsNode; +import com.oracle.graal.python.lib.RichCmpOp; +import com.oracle.graal.python.nodes.BuiltinNames; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PGuards; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.PRootNode; +import com.oracle.graal.python.nodes.WriteUnraisableNode; +import com.oracle.graal.python.nodes.argument.keywords.ConcatDictToStorageNode; +import com.oracle.graal.python.nodes.argument.keywords.ExpandKeywordStarargsNode; +import com.oracle.graal.python.nodes.argument.keywords.NonMappingException; +import com.oracle.graal.python.nodes.argument.keywords.SameDictKeyException; +import com.oracle.graal.python.nodes.attributes.GetAttributeNode.GetFixedAttributeNode; +import com.oracle.graal.python.nodes.builtins.ListNodes; +import com.oracle.graal.python.nodes.bytecode.CopyDictWithoutKeysNode; +import com.oracle.graal.python.nodes.bytecode.GetSendValueNode; +import com.oracle.graal.python.nodes.bytecode.GetTPFlagsNode; +import com.oracle.graal.python.nodes.bytecode.GetYieldFromIterNode; +import com.oracle.graal.python.nodes.bytecode.ImportFromNode; +import com.oracle.graal.python.nodes.bytecode.ImportNode; +import com.oracle.graal.python.nodes.bytecode.ImportStarNode; +import com.oracle.graal.python.nodes.bytecode.MatchClassNode; +import com.oracle.graal.python.nodes.bytecode.MatchKeysNode; +import com.oracle.graal.python.nodes.bytecode.PrintExprNode; +import com.oracle.graal.python.nodes.bytecode.RaiseNode; +import com.oracle.graal.python.nodes.bytecode.SetupAnnotationsNode; +import com.oracle.graal.python.nodes.call.CallNode; +import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode; +import com.oracle.graal.python.nodes.call.special.CallQuaternaryMethodNode; +import com.oracle.graal.python.nodes.call.special.CallTernaryMethodNode; +import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode; +import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodNode; +import com.oracle.graal.python.nodes.exception.ExceptMatchNode; +import com.oracle.graal.python.nodes.frame.DeleteGlobalNode; +import com.oracle.graal.python.nodes.frame.GetFrameLocalsNode; +import com.oracle.graal.python.nodes.frame.MaterializeFrameNode; +import com.oracle.graal.python.nodes.frame.ReadFromLocalsNode; +import com.oracle.graal.python.nodes.frame.ReadGlobalOrBuiltinNode; +import com.oracle.graal.python.nodes.frame.ReadNameNode; +import com.oracle.graal.python.nodes.frame.WriteGlobalNode; +import com.oracle.graal.python.nodes.frame.WriteNameNode; +import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; +import com.oracle.graal.python.nodes.object.IsNode; +import com.oracle.graal.python.nodes.util.ExceptionStateNodes; +import com.oracle.graal.python.runtime.ExecutionContext.CalleeContext; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.PythonContext.ProfileEvent; +import com.oracle.graal.python.runtime.PythonContext.PythonThreadState; +import com.oracle.graal.python.runtime.PythonContext.TraceEvent; +import com.oracle.graal.python.runtime.PythonOptions; +import com.oracle.graal.python.runtime.exception.ExceptionUtils; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.graal.python.runtime.exception.PythonErrorType; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.graal.python.runtime.sequence.PSequence; +import com.oracle.graal.python.runtime.sequence.storage.BoolSequenceStorage; +import com.oracle.graal.python.runtime.sequence.storage.DoubleSequenceStorage; +import com.oracle.graal.python.runtime.sequence.storage.IntSequenceStorage; +import com.oracle.graal.python.runtime.sequence.storage.LongSequenceStorage; +import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage; +import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; +import com.oracle.graal.python.util.ArrayBuilder; +import com.oracle.graal.python.util.PythonUtils; +import com.oracle.truffle.api.Assumption; +import com.oracle.truffle.api.CompilerAsserts; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.BytecodeConfig; +import com.oracle.truffle.api.bytecode.BytecodeLocation; +import com.oracle.truffle.api.bytecode.BytecodeNode; +import com.oracle.truffle.api.bytecode.BytecodeRootNode; +import com.oracle.truffle.api.bytecode.ConstantOperand; +import com.oracle.truffle.api.bytecode.EpilogExceptional; +import com.oracle.truffle.api.bytecode.EpilogReturn; +import com.oracle.truffle.api.bytecode.GenerateBytecode; +import com.oracle.truffle.api.bytecode.Instruction; +import com.oracle.truffle.api.bytecode.Instrumentation; +import com.oracle.truffle.api.bytecode.LocalAccessor; +import com.oracle.truffle.api.bytecode.LocalRangeAccessor; +import com.oracle.truffle.api.bytecode.Operation; +import com.oracle.truffle.api.bytecode.OperationProxy; +import com.oracle.truffle.api.bytecode.Prolog; +import com.oracle.truffle.api.bytecode.ShortCircuitOperation; +import com.oracle.truffle.api.bytecode.ShortCircuitOperation.Operator; +import com.oracle.truffle.api.bytecode.Variadic; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Exclusive; +import com.oracle.truffle.api.dsl.Cached.Shared; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.Idempotent; +import com.oracle.truffle.api.dsl.ImportStatic; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.NonIdempotent; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.exception.AbstractTruffleException; +import com.oracle.truffle.api.frame.Frame; +import com.oracle.truffle.api.frame.FrameDescriptor; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.library.CachedLibrary; +import com.oracle.truffle.api.nodes.EncapsulatingNodeReference; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.nodes.UnexpectedResultException; +import com.oracle.truffle.api.object.DynamicObjectLibrary; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; +import com.oracle.truffle.api.source.Source; +import com.oracle.truffle.api.source.SourceSection; +import com.oracle.truffle.api.strings.TruffleString; +import com.oracle.truffle.api.strings.TruffleStringBuilder; +import com.oracle.truffle.api.strings.TruffleStringBuilderUTF32; + +@GenerateBytecode(// + languageClass = PythonLanguage.class, // + enableBlockScoping = false, // + enableYield = true, // + enableSerialization = true, // + enableTagInstrumentation = true, // + boxingEliminationTypes = {int.class}, // + storeBytecodeIndexInFrame = true // +) +@OperationProxy(PyNumberSubtractNode.class) +@OperationProxy(PyNumberTrueDivideNode.class) +@OperationProxy(PyNumberFloorDivideNode.class) +@OperationProxy(PyNumberRemainderNode.class) +@OperationProxy(PyNumberLshiftNode.class) +@OperationProxy(PyNumberRshiftNode.class) +@OperationProxy(PyNumberAndNode.class) +@OperationProxy(PyNumberOrNode.class) +@OperationProxy(PyNumberXorNode.class) +@OperationProxy(PyNumberMatrixMultiplyNode.class) +@OperationProxy(PyNumberMultiplyNode.class) +@OperationProxy(PyNumberAddNode.class) +@OperationProxy(PyNumberPositiveNode.class) +@OperationProxy(PyNumberNegativeNode.class) +@OperationProxy(PyNumberInvertNode.class) +@OperationProxy(PyNumberInPlaceAddNode.class) +@OperationProxy(PyNumberInPlaceSubtractNode.class) +@OperationProxy(PyNumberInPlaceMultiplyNode.class) +@OperationProxy(PyNumberInPlaceTrueDivideNode.class) +@OperationProxy(PyNumberInPlaceFloorDivideNode.class) +@OperationProxy(PyNumberInPlaceRemainderNode.class) +@OperationProxy(PyNumberInPlaceMatrixMultiplyNode.class) +@OperationProxy(PyNumberInPlaceAndNode.class) +@OperationProxy(PyNumberInPlaceOrNode.class) +@OperationProxy(PyNumberInPlaceXorNode.class) +@OperationProxy(PyNumberInPlaceLshiftNode.class) +@OperationProxy(PyNumberInPlaceRshiftNode.class) +@OperationProxy(IsNode.class) +@OperationProxy(FormatNode.class) +@OperationProxy(ExceptMatchNode.class) +@OperationProxy(GetYieldFromIterNode.class) +@OperationProxy(GetAwaitableNode.class) +@OperationProxy(SetupAnnotationsNode.class) +@OperationProxy(value = CopyDictWithoutKeysNode.class, name = "CopyDictWithoutKeys") +@OperationProxy(value = PyObjectIsTrueNode.class, name = "Yes") +@OperationProxy(value = PyObjectIsNotTrueNode.class, name = "Not") +@OperationProxy(value = ListNodes.AppendNode.class, name = "ListAppend") +@OperationProxy(value = SetNodes.AddNode.class, name = "SetAdd") +@ShortCircuitOperation(name = "BoolAnd", booleanConverter = PyObjectIsTrueNode.class, operator = Operator.AND_RETURN_VALUE) +@ShortCircuitOperation(name = "BoolOr", booleanConverter = PyObjectIsTrueNode.class, operator = Operator.OR_RETURN_VALUE) +@ShortCircuitOperation(name = "PrimitiveBoolAnd", operator = Operator.AND_RETURN_VALUE) +@SuppressWarnings("unused") +public abstract class PBytecodeDSLRootNode extends PRootNode implements BytecodeRootNode { + public static final int EXPLODE_LOOP_THRESHOLD = 30; + private static final BytecodeConfig TRACE_AND_PROFILE_CONFIG = PBytecodeDSLRootNodeGen.newConfigBuilder().// + addInstrumentation(TraceOrProfileCall.class).// + addInstrumentation(TraceLine.class).// + addInstrumentation(TraceLineAtLoopHeader.class).// + addInstrumentation(TraceOrProfileReturn.class).// + addInstrumentation(TraceException.class).// + build(); + + @Child private transient CalleeContext calleeContext = CalleeContext.create(); + @Child private transient ExceptionStateNodes.GetCaughtExceptionNode getCaughtExceptionNode; + @Child private transient MaterializeFrameNode traceMaterializeFrameNode = null; + @Child private transient ChainExceptionsNode chainExceptionsNode; + + // These fields are effectively final, but can only be set after construction. + @CompilationFinal protected transient BytecodeDSLCodeUnit co; + @CompilationFinal protected transient Signature signature; + @CompilationFinal protected transient int selfIndex; + @CompilationFinal protected transient int classcellIndex; + + private transient boolean pythonInternal; + @CompilationFinal private transient boolean internal; + + // For deferred deprecation warnings + @CompilationFinal private transient RaisePythonExceptionErrorCallback parserErrorCallback; + + @SuppressWarnings("this-escape") + protected PBytecodeDSLRootNode(PythonLanguage language, FrameDescriptor.Builder frameDescriptorBuilder) { + super(language, frameDescriptorBuilder.info(new BytecodeDSLFrameInfo()).build()); + ((BytecodeDSLFrameInfo) getFrameDescriptor().getInfo()).setRootNode(this); + } + + public final PythonLanguage getLanguage() { + return getLanguage(PythonLanguage.class); + } + + public void setMetadata(BytecodeDSLCodeUnit co, RaisePythonExceptionErrorCallback parserErrorCallback) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + this.co = co; + this.signature = co.computeSignature(); + this.classcellIndex = co.classcellIndex; + this.selfIndex = co.selfIndex; + this.internal = getSource().isInternal(); + this.parserErrorCallback = parserErrorCallback; + } + + @Override + public final boolean isInternal() { + return internal; + } + + @Override + public final boolean isPythonInternal() { + return pythonInternal; + } + + public final void setPythonInternal(boolean pythonInternal) { + this.pythonInternal = pythonInternal; + } + + public final void triggerDeferredDeprecationWarnings() { + if (parserErrorCallback != null) { + parserErrorCallback.triggerDeprecationWarnings(); + } + } + + @Override + public String toString() { + return ""; + } + + @Prolog + public static final class EnterCalleeContext { + @Specialization + public static void doEnter(VirtualFrame frame, + @Bind PBytecodeDSLRootNode root) { + root.calleeContext.enter(frame); + + if (root.needsTraceAndProfileInstrumentation()) { + root.ensureTraceAndProfileEnabled(); + root.getThreadState().pushInstrumentationData(root); + } + } + } + + @EpilogReturn + public static final class EpilogForReturn { + @Specialization + public static Object doExit(VirtualFrame frame, Object returnValue, + @Bind PBytecodeDSLRootNode root, + @Bind Node location) { + if (root.needsTraceAndProfileInstrumentation()) { + root.getThreadState().popInstrumentationData(root); + } + + root.calleeContext.exit(frame, root, location); + return returnValue; + } + } + + @EpilogExceptional + public static final class EpilogForException { + @Specialization + public static void doExit(VirtualFrame frame, AbstractTruffleException ate, + @Bind PBytecodeDSLRootNode root, + @Bind Node location) { + if (ate instanceof PException pe) { + pe.notifyAddedTracebackFrame(!root.isInternal()); + } + + if (root.needsTraceAndProfileInstrumentation()) { + root.traceOrProfileReturn(frame, location, null); + root.getThreadState().popInstrumentationData(root); + } + + root.calleeContext.exit(frame, root, location); + } + } + + /* + * Data for tracing, profiling and instrumentation + */ + public static final class InstrumentationData { + private final InstrumentationData previous; + private final PBytecodeDSLRootNode rootNode; + private int pastLine; + + public InstrumentationData(PBytecodeDSLRootNode rootNode, InstrumentationData previous) { + this.previous = previous; + this.rootNode = rootNode; + this.pastLine = -1; + } + + public InstrumentationData getPrevious() { + return previous; + } + + public PBytecodeDSLRootNode getRootNode() { + return rootNode; + } + + int getPastLine() { + return pastLine; + } + + void setPastLine(int pastLine) { + this.pastLine = pastLine; + } + + void clearPastLine() { + this.pastLine = -1; + } + } + + @NonIdempotent + public final boolean needsTraceAndProfileInstrumentation() { + // We need instrumentation only if the assumption is invalid and the root node is visible. + return !getLanguage().noTracingOrProfilingAssumption.isValid() && !isInternal(); + } + + @NonIdempotent + public final PythonThreadState getThreadState() { + return PythonContext.get(this).getThreadState(getLanguage()); + } + + /** + * Reparses with instrumentations for settrace and setprofile enabled. + */ + public final void ensureTraceAndProfileEnabled() { + assert !isInternal(); + getRootNodes().update(TRACE_AND_PROFILE_CONFIG); + } + + private PFrame ensurePyFrame(VirtualFrame frame, Node location) { + if (traceMaterializeFrameNode == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + traceMaterializeFrameNode = insert(MaterializeFrameNode.create()); + } + return traceMaterializeFrameNode.execute(frame, location, true, true); + } + + private void syncLocalsBackToFrame(VirtualFrame frame, PFrame pyFrame) { + GetFrameLocalsNode.syncLocalsBackToFrame(co, this, pyFrame, frame); + } + + /** + * When tracing/profiling is enabled, we emit a lot of extra operations. Reduce compiled code + * size by putting the calls behind a boundary (the uncached invoke will eventually perform an + * indirect call anyway). + */ + @TruffleBoundary + private static Object doInvokeProfileOrTraceFunction(Object fun, PFrame pyFrame, TruffleString eventName, Object arg) { + return CallTernaryMethodNode.getUncached().execute(null, fun, pyFrame, eventName, arg == null ? PNone.NONE : arg); + } + + @InliningCutoff + private void invokeProfileFunction(VirtualFrame virtualFrame, Node location, Object profileFun, + PythonContext.PythonThreadState threadState, PythonContext.ProfileEvent event, Object arg) { + if (threadState.isProfiling()) { + return; + } + threadState.profilingStart(); + PFrame pyFrame = ensurePyFrame(virtualFrame, location); + EncapsulatingNodeReference encapsulating = EncapsulatingNodeReference.getCurrent(); + Node oldEncapsulatingNode = encapsulating.set(location); + try { + // Force locals dict sync, so that we can sync them back later + GetFrameLocalsNode.executeUncached(pyFrame); + Object result = doInvokeProfileOrTraceFunction(profileFun, pyFrame, event.name, arg); + syncLocalsBackToFrame(virtualFrame, pyFrame); + Object realResult = result == PNone.NONE ? null : result; + pyFrame.setLocalTraceFun(realResult); + } catch (Throwable e) { + threadState.setProfileFun(null, getLanguage()); + throw e; + } finally { + threadState.profilingStop(); + encapsulating.set(oldEncapsulatingNode); + } + } + + @InliningCutoff + private void invokeTraceFunction(VirtualFrame virtualFrame, Node location, Object traceFun, PythonContext.PythonThreadState threadState, + PythonContext.TraceEvent event, Object arg, int line) { + if (threadState.isTracing()) { + return; + } + assert event != PythonContext.TraceEvent.DISABLED; + threadState.tracingStart(event); + PFrame pyFrame = ensurePyFrame(virtualFrame, location); + /** + * Call events use the thread-local trace function, which returns a "local" trace function + * to use for other trace events. + */ + boolean useLocalFn = event != TraceEvent.CALL; + Object traceFn = useLocalFn ? pyFrame.getLocalTraceFun() : traceFun; + if (traceFn == null) { + threadState.tracingStop(); + return; + } + Object nonNullArg = arg == null ? PNone.NONE : arg; + + EncapsulatingNodeReference encapsulating = EncapsulatingNodeReference.getCurrent(); + Node oldEncapsulatingNode = encapsulating.set(location); + try { + /** + * The PFrame syncs to the line of the current bci. Sometimes this location is + * inaccurate and needs to be overridden (e.g., when tracing an implicit return at the + * end of a function, we need to trace the line of the last statement executed). + */ + if (line != -1) { + pyFrame.setLineLock(line); + } + + // Force locals dict sync, so that we can sync them back later + GetFrameLocalsNode.executeUncached(pyFrame); + Object result = doInvokeProfileOrTraceFunction(traceFn, pyFrame, event.pythonName, nonNullArg); + syncLocalsBackToFrame(virtualFrame, pyFrame); + // https://github.com/python/cpython/issues/104232 + if (useLocalFn) { + Object realResult = result == PNone.NONE ? traceFn : result; + pyFrame.setLocalTraceFun(realResult); + } else if (result != PNone.NONE) { + pyFrame.setLocalTraceFun(result); + } else { + pyFrame.setLocalTraceFun(null); + } + } catch (Throwable e) { + threadState.setTraceFun(null, getLanguage()); + throw e; + } finally { + if (line != -1) { + pyFrame.lineUnlock(); + } + threadState.tracingStop(); + encapsulating.set(oldEncapsulatingNode); + } + } + + private void traceOrProfileCall(VirtualFrame frame, Node location, BytecodeNode bytecode, int bci) { + PythonThreadState threadState = getThreadState(); + Object traceFun = threadState.getTraceFun(); + if (traceFun != null) { + int line = bciToLine(bci, bytecode); + invokeTraceFunction(frame, location, traceFun, threadState, TraceEvent.CALL, null, line); + } + Object profileFun = threadState.getProfileFun(); + if (profileFun != null) { + invokeProfileFunction(frame, location, profileFun, threadState, ProfileEvent.CALL, null); + } + } + + @InliningCutoff + private void traceLine(VirtualFrame frame, Node location, int line) { + PythonThreadState threadState = getThreadState(); + InstrumentationData instrumentationData = threadState.getInstrumentationData(this); + + // TODO: this should never happen by nature of how we emit TraceLine, but sometimes does. + // needs investigation. + if (line == instrumentationData.getPastLine()) { + return; + } + instrumentationData.setPastLine(line); + + PFrame pyFrame = ensurePyFrame(frame, location); + if (pyFrame.getTraceLine()) { + Object traceFun = threadState.getTraceFun(); + if (traceFun != null) { + invokeTraceFunction(frame, location, traceFun, threadState, TraceEvent.LINE, null, line); + } + } + } + + @InliningCutoff + private void traceLineAtLoopHeader(VirtualFrame frame, Node location, int line) { + PythonThreadState threadState = getThreadState(); + InstrumentationData instrumentationData = threadState.getInstrumentationData(this); + int pastLine = instrumentationData.getPastLine(); + + /** + * A loop should always be traced once, even if it is not entered. We also need to trace the + * loop header on each iteration. To accomplish this, we emit a TraceLine at the top of each + * loop (before loop initialization) and a TraceLineAtLoopHeader before the loop condition + * evaluates. To avoid tracing twice on the first iteration, we need to check our line + * against pastLine. + */ + if (line != pastLine) { + Object traceFun = threadState.getTraceFun(); + if (traceFun != null) { + invokeTraceFunction(frame, location, traceFun, threadState, TraceEvent.LINE, null, line); + } + } + /** + * If the loop is all on one line, we need to trace on each iteration (even though the line + * hasn't changed). Clear pastLine so the line comparison above succeeds. + */ + instrumentationData.clearPastLine(); + } + + private void traceOrProfileReturn(VirtualFrame frame, Node location, Object value) { + PythonThreadState threadState = getThreadState(); + Object traceFun = threadState.getTraceFun(); + if (traceFun != null) { + invokeTraceFunction(frame, location, traceFun, threadState, TraceEvent.RETURN, value, threadState.getInstrumentationData(this).getPastLine()); + } + Object profileFun = threadState.getProfileFun(); + if (profileFun != null) { + invokeProfileFunction(frame, location, profileFun, threadState, ProfileEvent.RETURN, value); + } + } + + @InliningCutoff + private PException traceException(VirtualFrame frame, BytecodeNode bytecode, int bci, PException pe) { + PException result = pe; + + PythonThreadState threadState = getThreadState(); + // We should only trace the exception if tracing is enabled. + if (threadState.getTraceFun() != null) { + PFrame pyFrame = ensurePyFrame(frame, bytecode); + // We use the local function for tracing exceptions. + if (pyFrame.getLocalTraceFun() != null) { + pe.markAsCaught(frame, this); + Object peForPython = pe.getEscapedException(); + Object peType = GetClassNode.executeUncached(peForPython); + Object traceback = ExceptionNodes.GetTracebackNode.executeUncached(peForPython); + try { + invokeTraceFunction(frame, bytecode, null, threadState, TraceEvent.EXCEPTION, + PFactory.createTuple(getLanguage(), new Object[]{peType, peForPython, traceback}), + bciToLine(bci, bytecode)); + } catch (PException newPe) { + // If the trace function raises, handle its exception instead. + result = newPe; + // Below, we get the exception for reraise in order to hide the original + // raising site that's being traced (i.e., hiding the original cause). + } + // The exception was reified already. Return a new exception that looks like this + // catch didn't happen. + result = result.getExceptionForReraise(!isInternal()); + result.setCatchLocation(bci, bytecode); + } + } + return result; + } + + @Instrumentation + public static final class TraceOrProfileCall { + @Specialization + public static void perform(VirtualFrame frame, + @Bind Node location, + @Bind PBytecodeDSLRootNode root, + @Bind BytecodeNode bytecode, + @Bind("$bytecodeIndex") int bci) { + root.traceOrProfileCall(frame, location, bytecode, bci); + } + } + + @Instrumentation + @ConstantOperand(type = int.class) + public static final class TraceLine { + @Specialization + public static void perform(VirtualFrame frame, + int line, + @Bind Node location, + @Bind PBytecodeDSLRootNode root) { + root.traceLine(frame, location, line); + } + } + + @Instrumentation + @ConstantOperand(type = int.class) + public static final class TraceLineAtLoopHeader { + @Specialization + public static void perform(VirtualFrame frame, + int line, + @Bind Node location, + @Bind PBytecodeDSLRootNode root) { + root.traceLineAtLoopHeader(frame, location, line); + } + } + + @Instrumentation + public static final class TraceOrProfileReturn { + @Specialization + public static Object perform(VirtualFrame frame, Object value, + @Bind Node location, + @Bind PBytecodeDSLRootNode root) { + root.traceOrProfileReturn(frame, location, value); + return value; + } + } + + @Instrumentation + public static final class TraceException { + @Specialization + public static void perform() { + throw new UnsupportedOperationException("trace exception not implemented"); + } + } + + @Override + public Throwable interceptInternalException(Throwable throwable, VirtualFrame frame, BytecodeNode bytecodeNode, int bci) { + PythonLanguage language = getLanguage(); + if (language.getEngineOption(PythonOptions.CatchAllExceptions) && (throwable instanceof Exception || throwable instanceof AssertionError)) { + return ExceptionUtils.wrapJavaException(throwable, this, PFactory.createBaseException(language, SystemError, ErrorMessages.M, new Object[]{throwable})); + } + PException wrapped = ExceptionUtils.wrapJavaExceptionIfApplicable(this, throwable); + return wrapped != null ? wrapped : throwable; + } + + @Override + public AbstractTruffleException interceptTruffleException(AbstractTruffleException ex, VirtualFrame frame, BytecodeNode bytecodeNode, int bci) { + if (ex instanceof PException pe) { + pe.setCatchLocation(bci, bytecodeNode); + + if (needsTraceAndProfileInstrumentation() && !getThreadState().isTracing()) { + pe = traceException(frame, bytecodeNode, bci, pe); + } + + // Fill in the __context__, if available. + if (getCaughtExceptionNode == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + getCaughtExceptionNode = insert(ExceptionStateNodes.GetCaughtExceptionNode.create()); + } + AbstractTruffleException context = getCaughtExceptionNode.execute(frame); + if (context instanceof PException pe2) { + if (chainExceptionsNode == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + chainExceptionsNode = insert(ChainExceptionsNode.create()); + } + chainExceptionsNode.execute(pe, pe2); + } + return pe; + } + + return ex; + } + + // TODO: ContinuationRootNodeImpl does not provide this, nor it is PRootNode, do we need to + // handle it in ReadCallerFrame#getFrame, and other places that iterate frames and/or check if a + // root node is PRootNode? + @Override + public boolean setsUpCalleeContext() { + return true; + } + + @Override + public String getName() { + if (co == null) { + // getName can be called by validation code before the code unit has been set. + return null; + } + return co.name.toJavaStringUncached(); + } + + @Override + public Signature getSignature() { + return signature; + } + + public BytecodeDSLCodeUnit getCodeUnit() { + return co; + } + + public int getFirstLineno() { + return co.startLine; + } + + protected Source getSource() { + SourceSection section = getSourceSection(); + if (section == null) { + return PythonUtils.createFakeSource(); + } + return section.getSource(); + } + + @TruffleBoundary + public int bciToLine(int bci, BytecodeNode bytecodeNode) { + return getSourceSectionForLocation(bci, bytecodeNode).getStartLine(); + } + + @TruffleBoundary + public SourceSection getSourceSectionForLocation(BytecodeLocation location) { + SourceSection sourceSection = null; + if (location != null) { + sourceSection = location.getSourceLocation(); + } + + if (sourceSection == null) { + /** + * If we don't have a source section, fall back on the root node's source section. This + * can happen, for example, when throwing into an unstarted generator, where we don't + * have an actual location (and the first line of the root node is expected). + */ + sourceSection = getSourceSection(); + } + + return sourceSection; + } + + @TruffleBoundary + public SourceSection getSourceSectionForLocation(int bci, BytecodeNode bytecodeNode) { + BytecodeLocation location = null; + if (bytecodeNode != null) { + location = bytecodeNode.getBytecodeLocation(bci); + } + return getSourceSectionForLocation(location); + } + + public static int bciToLasti(int bci, BytecodeNode bytecodeNode) { + if (bci <= 0) { + return bci; + } + int number = 0; + for (Instruction instruction : bytecodeNode.getInstructions()) { + if (instruction.isInstrumentation()) { + continue; + } + if (instruction.getBytecodeIndex() >= bci) { + return number; + } + // Emulate CPython's fixed 2-word instructions. + number += 2; + } + return -1; + } + + public static int lastiToBci(int lasti, BytecodeNode bytecodeNode) { + if (lasti < 0) { + return 0; + } + Iterator iter = bytecodeNode.getInstructions().iterator(); + assert iter.hasNext(); + + int nexti = 0; + Instruction result; + do { + result = iter.next(); + if (result.isInstrumentation()) { + continue; + } + nexti += 2; + } while (nexti <= lasti && iter.hasNext()); + return result.getBytecodeIndex(); + } + + @Override + protected byte[] extractCode() { + return MarshalModuleBuiltins.serializeCodeUnit(this, PythonContext.get(this), co); + } + + private static Object checkUnboundCell(PCell cell, int index, PBytecodeDSLRootNode rootNode, Node inliningTarget, PRaiseNode raiseNode) { + Object result = cell.getRef(); + if (result == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + CodeUnit codeUnit = rootNode.getCodeUnit(); + if (index < codeUnit.cellvars.length) { + TruffleString localName = codeUnit.cellvars[index]; + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.UnboundLocalError, ErrorMessages.LOCAL_VAR_REFERENCED_BEFORE_ASSIGMENT, localName); + } else { + TruffleString localName = codeUnit.freevars[index - codeUnit.cellvars.length]; + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.NameError, ErrorMessages.UNBOUNDFREEVAR, localName); + } + } + return result; + } + + public PCell readClassCell(Frame frame) { + if (classcellIndex < 0) { + return null; + } + return (PCell) getBytecodeNode().getLocalValue(0, frame, classcellIndex); + } + + public Object readSelf(Frame frame) { + if (selfIndex < 0) { + return null; + } else if (selfIndex == 0) { + return getBytecodeNode().getLocalValue(0, frame, 0); + } else { + PCell selfCell = (PCell) getBytecodeNode().getLocalValue(0, frame, selfIndex); + return selfCell.getRef(); + } + } + + @Operation + @ConstantOperand(type = int.class) + public static final class ArrayIndex { + @Specialization + public static Object doObject(int i, Object[] array) { + return array[i]; + } + } + + @Operation + public static final class UnwrapException { + @Specialization + public static Object doPException(PException ex) { + return ex.getEscapedException(); + } + + @Fallback + public static Object doOther(Object ex) { + // Let interop exceptions be + assert ex instanceof AbstractTruffleException; + return ex; + } + } + + /** + * Some operations take a single Object[] operand (e.g., {@link MakeTuple}). To pass a + * fixed-length sequence of elements to these operands (e.g., to instantiate a constant tuple) + * we need to first collect the values into an Object[]. + */ + @Operation + public static final class CollectToObjectArray { + @Specialization + public static Object[] perform(@Variadic Object[] values) { + return values; + } + } + + @Operation + public static final class Contains { + @Specialization + static Object contains(VirtualFrame frame, Object item, Object container, + @Bind Node inliningTarget, + @Cached PySequenceContainsNode containsNode) { + return containsNode.execute(frame, inliningTarget, container, item); + } + } + + @Operation + @ConstantOperand(type = TruffleString.class) + public static final class WriteName { + @Specialization + public static void perform(VirtualFrame frame, TruffleString name, Object value, + @Cached WriteNameNode writeNode) { + writeNode.execute(frame, name, value); + } + } + + @Operation + @ConstantOperand(type = TruffleString.class) + public static final class ReadName { + @Specialization + public static Object perform(VirtualFrame frame, TruffleString name, + @Cached ReadNameNode readNode) { + return readNode.execute(frame, name); + } + } + + @Operation + @ConstantOperand(type = TruffleString.class) + public static final class DeleteName { + @Specialization(guards = "hasLocals(frame)") + public static void performLocals(VirtualFrame frame, TruffleString name, + @Bind Node inliningTarget, + @Cached PyObjectDelItem deleteNode) { + deleteNode.execute(frame, inliningTarget, PArguments.getSpecialArgument(frame), name); + } + + @Specialization(guards = "!hasLocals(frame)") + public static void performGlobals(VirtualFrame frame, TruffleString name, + @Cached DeleteGlobalNode deleteNode) { + deleteNode.executeWithGlobals(frame, PArguments.getGlobals(frame), name); + } + + public static boolean hasLocals(VirtualFrame frame) { + return PArguments.getSpecialArgument(frame) != null; + } + } + + @Operation + public static final class LoadVariableArguments { + @Specialization + public static Object perform(VirtualFrame frame, + @Bind PBytecodeDSLRootNode rootNode) { + return PFactory.createTuple(rootNode.getLanguage(), PArguments.getVariableArguments(frame)); + } + } + + @Operation + public static final class LoadKeywordArguments { + @Specialization + public static Object perform(VirtualFrame frame, + @Bind PBytecodeDSLRootNode rootNode) { + return PFactory.createDict(rootNode.getLanguage(), PArguments.getKeywordArguments(frame)); + } + } + + @Operation + @ConstantOperand(type = double.class) + @ConstantOperand(type = double.class) + public static final class LoadComplex { + @Specialization + public static Object perform(double real, double imag, + @Bind PBytecodeDSLRootNode rootNode) { + return PFactory.createComplex(rootNode.getLanguage(), real, imag); + } + } + + @Operation + @ConstantOperand(type = BigInteger.class) + public static final class LoadBigInt { + @Specialization + public static Object perform(BigInteger bigInt, + @Bind PBytecodeDSLRootNode rootNode) { + return PFactory.createInt(rootNode.getLanguage(), bigInt); + } + } + + @Operation + @ConstantOperand(type = byte[].class, dimensions = 0) + public static final class LoadBytes { + @Specialization + public static Object perform(byte[] bytes, + @Bind PBytecodeDSLRootNode rootNode) { + return PFactory.createBytes(rootNode.getLanguage(), bytes); + } + } + + @Operation + public static final class GetIter { + @Specialization + public static Object perform(VirtualFrame frame, Object receiver, + @Bind Node inliningTarget, + @Cached PyObjectGetIter getIterNode) { + return getIterNode.execute(frame, inliningTarget, receiver); + } + } + + @Operation + public static final class FormatStr { + @Specialization + public static TruffleString perform(VirtualFrame frame, Object object, + @Bind Node inliningTarget, + @Cached PyObjectStrAsTruffleStringNode asTruffleStringNode) { + return asTruffleStringNode.execute(frame, inliningTarget, object); + } + } + + @Operation + public static final class FormatRepr { + @Specialization + public static TruffleString perform(VirtualFrame frame, Object object, + @Bind Node inliningTarget, + @Cached PyObjectReprAsTruffleStringNode asTruffleStringNode) { + return asTruffleStringNode.execute(frame, inliningTarget, object); + } + } + + @Operation + public static final class FormatAscii { + @Specialization + public static TruffleString perform(VirtualFrame frame, Object object, + @Bind Node inliningTarget, + @Cached PyObjectAsciiNode asTruffleStringNode) { + return asTruffleStringNode.execute(frame, inliningTarget, object); + } + } + + @Operation + public static final class PrintExpr { + @Specialization + public static void perform(VirtualFrame frame, Object object, + @Cached PrintExprNode printExprNode) { + printExprNode.execute(frame, object); + } + } + + @Operation + @ConstantOperand(type = LocalAccessor.class) + public static final class MatchKeys { + @Specialization + public static boolean perform(VirtualFrame frame, LocalAccessor values, Object map, Object[] keys, @Bind BytecodeNode bytecodeNode, @Cached MatchKeysNode node) { + values.setObject(bytecodeNode, frame, node.execute(frame, map, keys)); + return node.execute(frame, map, keys) != PNone.NONE; + } + } + + @Operation + @ConstantOperand(type = LocalAccessor.class) + public static final class MatchClass { + @Specialization + public static Object perform(VirtualFrame frame, LocalAccessor attributes, Object subject, Object type, int nargs, TruffleString[] kwArgs, @Bind BytecodeNode bytecodeNode, + @Cached MatchClassNode node) { + Object attrs = node.execute(frame, subject, type, nargs, kwArgs); + attributes.setObject(bytecodeNode, frame, attrs); + return attrs != null; + } + } + + @Operation + @ConstantOperand(type = TruffleString.class, name = "name") + @ConstantOperand(type = TruffleString.class, name = "qualifiedName") + @ConstantOperand(type = BytecodeDSLCodeUnit.class) + public static final class MakeFunction { + @Specialization(guards = {"isSingleContext(rootNode)", "!codeUnit.isGeneratorOrCoroutine()"}) + public static Object functionSingleContext(VirtualFrame frame, + TruffleString name, + TruffleString qualifiedName, + BytecodeDSLCodeUnit codeUnit, + Object[] defaults, + Object[] kwDefaultsObject, + Object closure, + Object annotations, + @Bind PBytecodeDSLRootNode rootNode, + @Cached(value = "createFunctionRootNode(rootNode, codeUnit)", adopt = false) PBytecodeDSLRootNode functionRootNode, + @Cached("createCode(rootNode, codeUnit, functionRootNode)") PCode cachedCode, + @Shared @CachedLibrary(limit = "1") DynamicObjectLibrary dylib) { + return createFunction(frame, name, qualifiedName, codeUnit.getDocstring(), cachedCode, defaults, kwDefaultsObject, closure, annotations, rootNode, dylib); + } + + @Specialization(replaces = "functionSingleContext", guards = "!codeUnit.isGeneratorOrCoroutine()") + public static Object functionMultiContext(VirtualFrame frame, + TruffleString name, + TruffleString qualifiedName, + BytecodeDSLCodeUnit codeUnit, + Object[] defaults, + Object[] kwDefaultsObject, + Object closure, + Object annotations, + @Bind PBytecodeDSLRootNode rootNode, + @Cached(value = "createFunctionRootNode(rootNode, codeUnit)", adopt = false) PBytecodeDSLRootNode functionRootNode, + @Shared @CachedLibrary(limit = "1") DynamicObjectLibrary dylib) { + PCode code = createCode(rootNode, codeUnit, functionRootNode); + return createFunction(frame, name, qualifiedName, codeUnit.getDocstring(), code, defaults, kwDefaultsObject, closure, annotations, rootNode, dylib); + } + + @Specialization(guards = {"isSingleContext(rootNode)", "codeUnit.isGeneratorOrCoroutine()"}) + public static Object generatorOrCoroutineSingleContext(VirtualFrame frame, + TruffleString name, + TruffleString qualifiedName, + BytecodeDSLCodeUnit codeUnit, + Object[] defaults, + Object[] kwDefaultsObject, + Object closure, + Object annotations, + @Bind PBytecodeDSLRootNode rootNode, + @Cached(value = "createFunctionRootNode(rootNode, codeUnit)", adopt = false) PBytecodeDSLRootNode functionRootNode, + @Cached(value = "createGeneratorRootNode(rootNode, functionRootNode, codeUnit)", adopt = false) PBytecodeDSLGeneratorFunctionRootNode generatorRootNode, + @Cached("createCode(rootNode, codeUnit, generatorRootNode)") PCode cachedCode, + @Shared @CachedLibrary(limit = "1") DynamicObjectLibrary dylib) { + return createFunction(frame, name, qualifiedName, codeUnit.getDocstring(), cachedCode, defaults, kwDefaultsObject, closure, annotations, rootNode, dylib); + } + + @Specialization(replaces = "generatorOrCoroutineSingleContext", guards = "codeUnit.isGeneratorOrCoroutine()") + public static Object generatorOrCoroutineMultiContext(VirtualFrame frame, + TruffleString name, + TruffleString qualifiedName, + BytecodeDSLCodeUnit codeUnit, + Object[] defaults, + Object[] kwDefaultsObject, + Object closure, + Object annotations, + @Bind PBytecodeDSLRootNode rootNode, + @Cached(value = "createFunctionRootNode(rootNode, codeUnit)", adopt = false) PBytecodeDSLRootNode functionRootNode, + @Cached(value = "createGeneratorRootNode(rootNode, functionRootNode, codeUnit)", adopt = false) PBytecodeDSLGeneratorFunctionRootNode generatorRootNode, + @Shared @CachedLibrary(limit = "1") DynamicObjectLibrary dylib) { + PCode code = createCode(rootNode, codeUnit, generatorRootNode); + return createFunction(frame, name, qualifiedName, codeUnit.getDocstring(), code, defaults, kwDefaultsObject, closure, annotations, rootNode, dylib); + } + + @Idempotent + protected static boolean isSingleContext(Node node) { + return PythonLanguage.get(node).isSingleContext(); + } + + @NeverDefault + protected static PBytecodeDSLRootNode createFunctionRootNode(PBytecodeDSLRootNode outerRootNode, BytecodeDSLCodeUnit codeUnit) { + return codeUnit.createRootNode(PythonContext.get(outerRootNode), outerRootNode.getSource()); + } + + @NeverDefault + protected static PBytecodeDSLGeneratorFunctionRootNode createGeneratorRootNode(PBytecodeDSLRootNode outerRootNode, PBytecodeDSLRootNode functionRootNode, + BytecodeDSLCodeUnit codeUnit) { + return new PBytecodeDSLGeneratorFunctionRootNode(PythonLanguage.get(outerRootNode), functionRootNode.getFrameDescriptor(), functionRootNode, codeUnit.name); + } + + @NeverDefault + protected static PCode createCode(PBytecodeDSLRootNode outerRootNode, BytecodeDSLCodeUnit codeUnit, PRootNode rootNode) { + return PFactory.createCode( + PythonLanguage.get(outerRootNode), + rootNode.getCallTarget(), + rootNode.getSignature(), + codeUnit); + } + + protected static PFunction createFunction(VirtualFrame frame, + TruffleString name, TruffleString qualifiedName, TruffleString doc, + PCode code, Object[] defaults, + Object[] kwDefaultsObject, Object closure, Object annotations, + PBytecodeDSLRootNode node, + DynamicObjectLibrary dylib) { + PKeyword[] kwDefaults = new PKeyword[kwDefaultsObject.length]; + // Note: kwDefaultsObject should be a result of operation MakeKeywords, which produces + // PKeyword[] + System.arraycopy(kwDefaultsObject, 0, kwDefaults, 0, kwDefaults.length); + PFunction function = PFactory.createFunction(PythonLanguage.get(node), name, qualifiedName, code, PArguments.getGlobals(frame), defaults, kwDefaults, (PCell[]) closure); + + if (annotations != null) { + dylib.put(function, T___ANNOTATIONS__, annotations); + } + if (doc != null) { + dylib.put(function, T___DOC__, doc); + } + + return function; + } + } + + @Operation + public static final class Pow { + @Specialization + public static Object doIt(VirtualFrame frame, Object left, Object right, + @Cached PyNumberPowerNode powNode) { + return powNode.execute(frame, left, right); + } + } + + @Operation + public static final class InPlacePow { + @Specialization + public static Object doIt(VirtualFrame frame, Object left, Object right, + @Cached PyNumberInPlacePowerNode ipowNode) { + return ipowNode.execute(frame, left, right); + } + } + + @Operation + @ConstantOperand(type = LocalAccessor.class) + public static final class ForIterate { + + @Specialization + public static boolean doIntegerSequence(VirtualFrame frame, LocalAccessor output, PIntegerSequenceIterator iterator, + @Bind BytecodeNode bytecode) { + return doInteger(frame, output, iterator, bytecode); + } + + @Specialization + public static boolean doIntRange(VirtualFrame frame, LocalAccessor output, PIntRangeIterator iterator, + @Bind BytecodeNode bytecode) { + return doInteger(frame, output, iterator, bytecode); + } + + private static boolean doInteger(VirtualFrame frame, LocalAccessor output, + PIntegerIterator iterator, BytecodeNode bytecode) { + if (!iterator.hasNext()) { + iterator.setExhausted(); + return false; + } + output.setInt(bytecode, frame, iterator.next()); + return true; + } + + @Specialization + public static boolean doObjectIterator(VirtualFrame frame, LocalAccessor output, PObjectSequenceIterator iterator, + @Bind BytecodeNode bytecode) { + if (!iterator.hasNext()) { + iterator.setExhausted(); + output.setObject(bytecode, frame, null); + return false; + } + Object value = iterator.next(); + output.setObject(bytecode, frame, value); + return value != null; + } + + @Specialization + public static boolean doLongIterator(VirtualFrame frame, LocalAccessor output, PLongSequenceIterator iterator, + @Bind BytecodeNode bytecode) { + if (!iterator.hasNext()) { + iterator.setExhausted(); + return false; + } + output.setLong(bytecode, frame, iterator.next()); + return true; + } + + @Specialization + public static boolean doDoubleIterator(VirtualFrame frame, LocalAccessor output, PDoubleSequenceIterator iterator, + @Bind BytecodeNode bytecode) { + if (!iterator.hasNext()) { + iterator.setExhausted(); + return false; + } + output.setDouble(bytecode, frame, iterator.next()); + return true; + } + + @Specialization + @InliningCutoff + public static boolean doIterator(VirtualFrame frame, LocalAccessor output, Object object, + @Bind Node inliningTarget, + @Bind BytecodeNode bytecode, + @Cached PyIterNextNode next, + @Cached IsBuiltinObjectProfile errorProfile) { + try { + Object value = next.execute(frame, inliningTarget, object); + output.setObject(bytecode, frame, value); + return true; + } catch (IteratorExhausted e) { + output.setObject(bytecode, frame, null); + return false; + } + } + } + + @Operation + @ConstantOperand(type = TruffleString.class) + public static final class GetMethod { + @Specialization + public static Object doIt(VirtualFrame frame, + TruffleString name, Object obj, + @Bind Node inliningTarget, + @Cached PyObjectGetMethod getMethod) { + return getMethod.execute(frame, inliningTarget, obj, name); + } + } + + @Operation + @ConstantOperand(type = TruffleString.class) + public static final class GetAttribute { + @Specialization + @InliningCutoff + public static Object doIt(VirtualFrame frame, + TruffleString name, + Object obj, + @Cached("create(name)") GetFixedAttributeNode getAttributeNode) { + return getAttributeNode.execute(frame, obj); + } + } + + @Operation + @ConstantOperand(type = TruffleString.class) + public static final class SetAttribute { + @Specialization + @InliningCutoff + public static void doIt(VirtualFrame frame, + TruffleString key, + Object value, + Object object, + @Bind Node inliningTarget, + @Cached PyObjectSetAttr setAttrNode) { + setAttrNode.execute(frame, inliningTarget, object, key, value); + } + } + + @Operation + @ConstantOperand(type = TruffleString.class) + public static final class DeleteAttribute { + @Specialization + @InliningCutoff + public static void doObject(VirtualFrame frame, + TruffleString key, + Object object, + @Bind Node inliningTarget, + @Cached PyObjectSetAttrO setAttrO) { + setAttrO.execute(frame, inliningTarget, object, key, PNone.NO_VALUE); + + } + } + + @Operation + public static final class DeleteItem { + @Specialization + public static void doWithFrame(VirtualFrame frame, Object primary, Object index, + @Bind Node inliningTarget, + @Cached PyObjectDelItem delItemNode) { + delItemNode.execute(frame, inliningTarget, primary, index); + } + } + + @Operation + @ConstantOperand(type = TruffleString.class) + public static final class ReadGlobal { + @Specialization + public static Object perform(VirtualFrame frame, TruffleString name, + @Cached ReadGlobalOrBuiltinNode readNode) { + return readNode.execute(frame, name); + } + } + + @Operation + @ConstantOperand(type = TruffleString.class) + public static final class WriteGlobal { + @Specialization + public static void perform(VirtualFrame frame, TruffleString name, Object value, + @Cached WriteGlobalNode writeNode) { + writeNode.executeObject(frame, name, value); + } + } + + @Operation + @ConstantOperand(type = TruffleString.class) + public static final class DeleteGlobal { + @Specialization + public static void perform(VirtualFrame frame, TruffleString name, + @Cached DeleteGlobalNode deleteNode) { + deleteNode.executeWithGlobals(frame, PArguments.getGlobals(frame), name); + } + } + + @Operation + public static final class BuildClass { + + public static final TruffleString NAME = BuiltinNames.T___BUILD_CLASS__; + + @Specialization + @InliningCutoff + public static Object perform(VirtualFrame frame, + @Cached ReadGlobalOrBuiltinNode readNode) { + return readNode.execute(frame, NAME); + } + } + + @Operation + public static final class MakeList { + @Specialization + public static PList perform(Object[] elements, + @Bind PBytecodeDSLRootNode rootNode) { + return PFactory.createList(rootNode.getLanguage(), elements); + } + } + + @Operation + @ImportStatic({PBytecodeDSLRootNode.class}) + public static final class MakeSet { + @Specialization(guards = "elements.length == 0") + public static PSet doEmpty(VirtualFrame frame, Object[] elements, + @Bind PBytecodeDSLRootNode rootNode) { + // creates set backed by empty HashingStorage + return PFactory.createSet(rootNode.getLanguage()); + } + + @Specialization(guards = "elements.length != 0") + public static PSet doNonEmpty(VirtualFrame frame, Object[] elements, + @Bind PBytecodeDSLRootNode rootNode, + @Bind Node inliningTarget, + @Cached MakeSetStorageNode makeSetStorageNode) { + return PFactory.createSet(rootNode.getLanguage(), makeSetStorageNode.execute(frame, inliningTarget, elements)); + } + } + + @Operation + public static final class MakeFrozenSet { + @Specialization(guards = "elements.length == 0") + public static PFrozenSet doEmpty(VirtualFrame frame, @Variadic Object[] elements, + @Bind PBytecodeDSLRootNode rootNode) { + // creates set backed by empty HashingStorage + return PFactory.createFrozenSet(rootNode.getLanguage()); + } + + @Specialization(guards = "elements.length != 0") + public static PFrozenSet doNonEmpty(VirtualFrame frame, @Variadic Object[] elements, + @Bind PBytecodeDSLRootNode rootNode, + @Bind Node inliningTarget, + @Cached MakeSetStorageNode makeSetStorageNode) { + return PFactory.createFrozenSet(rootNode.getLanguage(), makeSetStorageNode.execute(frame, inliningTarget, elements)); + } + } + + @Operation + public static final class MakeTuple { + @Specialization + public static Object perform(Object[] elements, + @Bind PBytecodeDSLRootNode rootNode) { + return PFactory.createTuple(rootNode.getLanguage(), elements); + } + } + + @Operation + @ConstantOperand(type = int[].class, dimensions = 0) + public static final class MakeConstantIntList { + @Specialization + public static PList perform(int[] array, + @Bind PBytecodeDSLRootNode rootNode) { + SequenceStorage storage = new IntSequenceStorage(PythonUtils.arrayCopyOf(array, array.length)); + return PFactory.createList(rootNode.getLanguage(), storage); + } + } + + @Operation + @ConstantOperand(type = long[].class, dimensions = 0) + public static final class MakeConstantLongList { + @Specialization + public static PList perform(long[] array, + @Bind PBytecodeDSLRootNode rootNode) { + SequenceStorage storage = new LongSequenceStorage(PythonUtils.arrayCopyOf(array, array.length)); + return PFactory.createList(rootNode.getLanguage(), storage); + } + } + + @Operation + @ConstantOperand(type = boolean[].class, dimensions = 0) + public static final class MakeConstantBooleanList { + @Specialization + public static PList perform(boolean[] array, + @Bind PBytecodeDSLRootNode rootNode) { + SequenceStorage storage = new BoolSequenceStorage(PythonUtils.arrayCopyOf(array, array.length)); + return PFactory.createList(rootNode.getLanguage(), storage); + } + } + + @Operation + @ConstantOperand(type = double[].class, dimensions = 0) + public static final class MakeConstantDoubleList { + @Specialization + public static PList perform(double[] array, + @Bind PBytecodeDSLRootNode rootNode) { + SequenceStorage storage = new DoubleSequenceStorage(PythonUtils.arrayCopyOf(array, array.length)); + return PFactory.createList(rootNode.getLanguage(), storage); + } + } + + @Operation + @ConstantOperand(type = Object[].class, dimensions = 0) + public static final class MakeConstantObjectList { + @Specialization + public static PList perform(Object[] array, + @Bind PBytecodeDSLRootNode rootNode) { + SequenceStorage storage = new ObjectSequenceStorage(PythonUtils.arrayCopyOf(array, array.length)); + return PFactory.createList(rootNode.getLanguage(), storage); + } + } + + @Operation + @ConstantOperand(type = int[].class, dimensions = 0) + public static final class MakeConstantIntTuple { + @Specialization + public static PTuple perform(int[] array, + @Bind PBytecodeDSLRootNode rootNode) { + SequenceStorage storage = new IntSequenceStorage(array); + return PFactory.createTuple(rootNode.getLanguage(), storage); + } + } + + @Operation + @ConstantOperand(type = long[].class, dimensions = 0) + public static final class MakeConstantLongTuple { + @Specialization + public static PTuple perform(long[] array, + @Bind PBytecodeDSLRootNode rootNode) { + SequenceStorage storage = new LongSequenceStorage(array); + return PFactory.createTuple(rootNode.getLanguage(), storage); + } + } + + @Operation + @ConstantOperand(type = boolean[].class, dimensions = 0) + public static final class MakeConstantBooleanTuple { + @Specialization + public static PTuple perform(boolean[] array, + @Bind PBytecodeDSLRootNode rootNode) { + SequenceStorage storage = new BoolSequenceStorage(array); + return PFactory.createTuple(rootNode.getLanguage(), storage); + } + } + + @Operation + @ConstantOperand(type = double[].class, dimensions = 0) + public static final class MakeConstantDoubleTuple { + @Specialization + public static PTuple perform(double[] array, + @Bind PBytecodeDSLRootNode rootNode) { + SequenceStorage storage = new DoubleSequenceStorage(array); + return PFactory.createTuple(rootNode.getLanguage(), storage); + } + } + + @Operation + @ConstantOperand(type = Object[].class, dimensions = 0) + public static final class MakeConstantObjectTuple { + @Specialization + public static PTuple perform(Object[] array, + @Bind PBytecodeDSLRootNode rootNode) { + SequenceStorage storage = new ObjectSequenceStorage(array); + return PFactory.createTuple(rootNode.getLanguage(), storage); + } + } + + @Operation + public static final class MakeSlice { + + @Specialization + public static Object doIII(int start, int end, int step, + @Bind PBytecodeDSLRootNode rootNode) { + return PFactory.createIntSlice(rootNode.getLanguage(), start, end, step); + } + + @Specialization + public static Object doNIN(PNone start, int end, PNone step, + @Bind PBytecodeDSLRootNode rootNode) { + return PFactory.createIntSlice(rootNode.getLanguage(), 0, end, 1, true, true); + } + + @Specialization + public static Object doIIN(int start, int end, PNone step, + @Bind PBytecodeDSLRootNode rootNode) { + return PFactory.createIntSlice(rootNode.getLanguage(), start, end, 1, false, true); + } + + @Specialization + public static Object doNII(PNone start, int end, int step, + @Bind PBytecodeDSLRootNode rootNode) { + return PFactory.createIntSlice(rootNode.getLanguage(), 0, end, step, true, false); + } + + @Specialization + @InliningCutoff + public static Object doGeneric(Object start, Object end, Object step, + @Bind PBytecodeDSLRootNode rootNode) { + return PFactory.createObjectSlice(rootNode.getLanguage(), start, end, step); + } + } + + @Operation + @ConstantOperand(type = TruffleString[].class, dimensions = 0, specifyAtEnd = true) + public static final class MakeKeywords { + @Specialization + public static PKeyword[] perform(@Variadic Object[] values, TruffleString[] keys) { + CompilerAsserts.partialEvaluationConstant(keys.length); + PKeyword[] result = new PKeyword[keys.length]; + for (int i = 0; i < keys.length; i++) { + result[i] = new PKeyword(keys[i], values[i]); + } + return result; + } + } + + @Operation + public static final class MappingToKeywords { + @Specialization + public static PKeyword[] perform(Object sourceCollection, + @Bind Node inliningTarget, + @Cached ExpandKeywordStarargsNode expandKeywordStarargsNode, + @Cached PRaiseNode raise) { + return expandKeywordStarargsNode.execute(inliningTarget, sourceCollection); + } + } + + @Operation + @ConstantOperand(type = int.class) + public static final class MakeDict { + @Specialization(guards = "entries == 0") + public static PDict empty(VirtualFrame frame, int entries, @Variadic Object[] keysAndValues, + @Bind PBytecodeDSLRootNode rootNode) { + // creates a dict with empty hashing storage + return PFactory.createDict(rootNode.getLanguage()); + } + + @Specialization + public static PDict empty(VirtualFrame frame, int entries, @Variadic Object[] keysAndValues, + @Bind PBytecodeDSLRootNode rootNode, + @Bind Node inliningTarget, + @Cached PyObjectHashNode hashNode, + @Cached ObjectHashMap.PutNode putNode, + @Cached DictNodes.UpdateNode updateNode) { + if (keysAndValues.length != entries * 2) { + throw CompilerDirectives.shouldNotReachHere(); + } + ObjectHashMap map = new ObjectHashMap(keysAndValues.length / 2, false); + PDict dict = PFactory.createDict(rootNode.getLanguage(), new EconomicMapStorage(map, false)); + for (int i = 0; i < entries; i++) { + Object key = keysAndValues[i * 2]; + Object value = keysAndValues[i * 2 + 1]; + // Each entry represents either a k: v pair or a **splats. splats have no key. + if (key == PNone.NO_VALUE) { + updateNode.execute(frame, dict, value); + assert dict.getDictStorage() instanceof EconomicMapStorage es && es.mapIsEqualTo(map); + } else { + long hash = hashNode.execute(frame, inliningTarget, key); + putNode.put(frame, inliningTarget, map, key, hash, value); + } + } + return dict; + } + } + + @Operation + public static final class SetDictItem { + @Specialization + public static void perform(VirtualFrame frame, PDict item, Object key, Object value, + @Bind Node inliningTarget, + @Cached HashingStorageSetItem setItem) { + item.setDictStorage(setItem.execute(frame, inliningTarget, item.getDictStorage(), key, value)); + } + } + + public static final class LiteralBoolean { + @Specialization + public static boolean doBoolean(boolean value) { + return value; + } + } + + @Operation + public static final class SetItem { + @Specialization + public static void doIt(VirtualFrame frame, Object value, Object primary, Object slice, + @Bind Node inliningTarget, + @Shared @Cached PyObjectSetItem setItemNode) { + setItemNode.execute(frame, inliningTarget, primary, slice, value); + } + } + + @Operation + @ConstantOperand(type = LocalRangeAccessor.class) + @ImportStatic({PGuards.class}) + public static final class UnpackToLocals { + @Specialization(guards = "isBuiltinSequence(sequence)") + public static void doUnpackSequence(VirtualFrame localFrame, LocalRangeAccessor results, PSequence sequence, + @Bind Node inliningTarget, + @Bind BytecodeNode bytecode, + @Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode, + @Cached SequenceStorageNodes.GetItemScalarNode getItemNode, + @Shared @Cached PRaiseNode raiseNode) { + SequenceStorage storage = getSequenceStorageNode.execute(inliningTarget, sequence); + int len = storage.length(); + int count = results.getLength(); + CompilerAsserts.partialEvaluationConstant(count); + + if (len != count) { + raiseError(inliningTarget, raiseNode, len, count); + } + + for (int i = 0; i < count; i++) { + results.setObject(bytecode, localFrame, i, getItemNode.execute(inliningTarget, storage, i)); + } + } + + @InliningCutoff + private static void raiseError(Node inliningTarget, PRaiseNode raiseNode, int len, int count) { + if (len < count) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK, count, len); + } else { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.TOO_MANY_VALUES_TO_UNPACK, count); + } + } + + @Specialization + @InliningCutoff + public static void doUnpackIterable(VirtualFrame virtualFrame, LocalRangeAccessor results, Object collection, + @Bind Node inliningTarget, + @Bind BytecodeNode bytecode, + @Cached PyObjectGetIter getIter, + @Cached PyIterNextNode getNextNode, + @Cached IsBuiltinObjectProfile notIterableProfile, + @Shared @Cached PRaiseNode raiseNode) { + int count = results.getLength(); + CompilerAsserts.partialEvaluationConstant(count); + + Object iterator; + try { + iterator = getIter.execute(virtualFrame, inliningTarget, collection); + } catch (PException e) { + e.expectTypeError(inliningTarget, notIterableProfile); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_UNPACK_NON_ITERABLE, collection); + } + for (int i = 0; i < count; i++) { + try { + Object value = getNextNode.execute(virtualFrame, inliningTarget, iterator); + results.setObject(bytecode, virtualFrame, i, value); + } catch (IteratorExhausted e) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK, count, i); + } + } + try { + Object value = getNextNode.execute(virtualFrame, inliningTarget, iterator); + } catch (IteratorExhausted e) { + return; + } + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.TOO_MANY_VALUES_TO_UNPACK, count); + } + } + + @Operation + @ConstantOperand(type = int.class) + @ConstantOperand(type = LocalRangeAccessor.class) + @ImportStatic({PGuards.class}) + @SuppressWarnings("truffle-interpreted-performance") + public static final class UnpackStarredToLocals { + @Specialization(guards = "isBuiltinSequence(sequence)") + public static void doUnpackSequence(VirtualFrame localFrame, + int starIndex, + LocalRangeAccessor results, + PSequence sequence, + @Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode, + @Shared @Cached SequenceStorageNodes.GetItemScalarNode getItemNode, + @Shared @Cached SequenceStorageNodes.GetItemSliceNode getItemSliceNode, + @Bind PBytecodeDSLRootNode rootNode, + @Bind BytecodeNode bytecode, + @Bind Node inliningTarget, + @Shared @Cached PRaiseNode raiseNode) { + int resultsLength = results.getLength(); + int countBefore = starIndex; + int countAfter = resultsLength - starIndex - 1; + + SequenceStorage storage = getSequenceStorageNode.execute(inliningTarget, sequence); + int len = storage.length(); + + int starLen = len - resultsLength + 1; + if (starLen < 0) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK_EX, countBefore + countAfter, len); + } + + copyToLocalsFromSequence(storage, 0, 0, countBefore, results, localFrame, inliningTarget, bytecode, getItemNode); + PList starList = PFactory.createList(rootNode.getLanguage(), getItemSliceNode.execute(storage, countBefore, countBefore + starLen, 1, starLen)); + results.setObject(bytecode, localFrame, starIndex, starList); + copyToLocalsFromSequence(storage, starIndex + 1, len - countAfter, countAfter, results, localFrame, inliningTarget, bytecode, getItemNode); + } + + @Specialization + @InliningCutoff + public static void doUnpackIterable(VirtualFrame frame, + int starIndex, + LocalRangeAccessor results, + Object collection, + @Cached PyObjectGetIter getIter, + @Cached PyIterNextNode getNextNode, + @Cached IsBuiltinObjectProfile notIterableProfile, + @Cached ListNodes.ConstructListNode constructListNode, + @Shared @Cached SequenceStorageNodes.GetItemScalarNode getItemNode, + @Shared @Cached SequenceStorageNodes.GetItemSliceNode getItemSliceNode, + @Bind PBytecodeDSLRootNode rootNode, + @Bind BytecodeNode bytecode, + @Bind Node inliningTarget, + @Shared @Cached PRaiseNode raiseNode) { + int resultsLength = results.getLength(); + int countBefore = starIndex; + int countAfter = resultsLength - starIndex - 1; + + Object iterator; + try { + iterator = getIter.execute(frame, inliningTarget, collection); + } catch (PException e) { + e.expectTypeError(inliningTarget, notIterableProfile); + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.CANNOT_UNPACK_NON_ITERABLE, collection); + } + + copyToLocalsFromIterator(frame, inliningTarget, iterator, countBefore, results, bytecode, countBefore + countAfter, getNextNode, raiseNode); + + PList starAndAfter = constructListNode.execute(frame, iterator); + SequenceStorage storage = starAndAfter.getSequenceStorage(); + int lenAfter = storage.length(); + if (lenAfter < countAfter) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK_EX, countBefore + countAfter, countBefore + lenAfter); + } + if (countAfter == 0) { + results.setObject(bytecode, frame, starIndex, starAndAfter); + } else { + int starLen = lenAfter - countAfter; + PList starList = PFactory.createList(rootNode.getLanguage(), getItemSliceNode.execute(storage, 0, starLen, 1, starLen)); + results.setObject(bytecode, frame, starIndex, starList); + + copyToLocalsFromSequence(storage, starIndex + 1, starLen, countAfter, results, frame, inliningTarget, bytecode, getItemNode); + } + } + + private static void copyToLocalsFromIterator(VirtualFrame frame, Node inliningTarget, Object iterator, int length, LocalRangeAccessor results, + BytecodeNode bytecode, int requiredLength, + PyIterNextNode getNextNode, PRaiseNode raiseNode) { + CompilerAsserts.partialEvaluationConstant(length); + for (int i = 0; i < length; i++) { + try { + Object item = getNextNode.execute(frame, inliningTarget, iterator); + results.setObject(bytecode, frame, i, item); + } catch (IteratorExhausted e) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK_EX, requiredLength, i); + } + } + } + + private static void copyToLocalsFromSequence(SequenceStorage storage, int runOffset, int offset, int length, LocalRangeAccessor run, + VirtualFrame localFrame, Node inliningTarget, BytecodeNode bytecode, SequenceStorageNodes.GetItemScalarNode getItemNode) { + CompilerAsserts.partialEvaluationConstant(length); + for (int i = 0; i < length; i++) { + run.setObject(bytecode, localFrame, runOffset + i, getItemNode.execute(inliningTarget, storage, offset + i)); + } + } + } + + private static RuntimeException notSupported(Object left, Object right, Node nodeForRaise, TruffleString operator) { + throw PRaiseNode.raiseStatic(nodeForRaise, PythonErrorType.TypeError, ErrorMessages.NOT_SUPPORTED_BETWEEN_INSTANCES, operator, left, right); + } + + @Operation + public static final class Le { + @Specialization + public static boolean cmp(int left, int right) { + return left <= right; + } + + @Specialization + public static boolean cmp(long left, long right) { + return left <= right; + } + + @Specialization + public static boolean cmp(char left, char right) { + return left <= right; + } + + @Specialization + public static boolean cmp(byte left, byte right) { + return left <= right; + } + + @Specialization + public static boolean cmp(double left, double right) { + return left <= right; + } + + @Specialization + public static boolean cmp(int left, double right) { + return left <= right; + } + + @Specialization + public static boolean cmp(double left, int right) { + return left <= right; + } + + @Specialization + @InliningCutoff + public static Object doGeneric(VirtualFrame frame, Object left, Object right, + @Cached GenericRichCompare richCompareNode) { + return richCompareNode.execute(frame, left, right, RichCmpOp.Py_LE); + } + } + + @Operation + public static final class Lt { + @Specialization + public static boolean cmp(int left, int right) { + return left < right; + } + + @Specialization + public static boolean cmp(long left, long right) { + return left < right; + } + + @Specialization + public static boolean cmp(char left, char right) { + return left < right; + } + + @Specialization + public static boolean cmp(byte left, byte right) { + return left < right; + } + + @Specialization + public static boolean cmp(double left, double right) { + return left < right; + } + + @Specialization + public static boolean cmp(int left, double right) { + return left < right; + } + + @Specialization + public static boolean cmp(double left, int right) { + return left < right; + } + + @Specialization + @InliningCutoff + public static Object doGeneric(VirtualFrame frame, Object left, Object right, + @Cached GenericRichCompare richCompareNode) { + return richCompareNode.execute(frame, left, right, RichCmpOp.Py_LT); + } + } + + @Operation + public static final class Ge { + @Specialization + public static boolean cmp(int left, int right) { + return left >= right; + } + + @Specialization + public static boolean cmp(long left, long right) { + return left >= right; + } + + @Specialization + public static boolean cmp(char left, char right) { + return left >= right; + } + + @Specialization + public static boolean cmp(byte left, byte right) { + return left >= right; + } + + @Specialization + public static boolean cmp(double left, double right) { + return left >= right; + } + + @Specialization + public static boolean cmp(int left, double right) { + return left >= right; + } + + @Specialization + public static boolean cmp(double left, int right) { + return left >= right; + } + + @Specialization + @InliningCutoff + public static Object doGeneric(VirtualFrame frame, Object left, Object right, + @Cached GenericRichCompare richCompareNode) { + return richCompareNode.execute(frame, left, right, RichCmpOp.Py_GE); + } + } + + @Operation + public static final class Gt { + @Specialization + public static boolean cmp(int left, int right) { + return left > right; + } + + @Specialization + public static boolean cmp(long left, long right) { + return left > right; + } + + @Specialization + public static boolean cmp(char left, char right) { + return left > right; + } + + @Specialization + public static boolean cmp(byte left, byte right) { + return left > right; + } + + @Specialization + public static boolean cmp(double left, double right) { + return left > right; + } + + @Specialization + public static boolean cmp(int left, double right) { + return left > right; + } + + @Specialization + public static boolean cmp(double left, int right) { + return left > right; + } + + @Specialization + @InliningCutoff + public static final Object doGeneric(VirtualFrame frame, Object left, Object right, + @Cached GenericRichCompare richCompareNode) { + return richCompareNode.execute(frame, left, right, RichCmpOp.Py_GT); + } + } + + @Operation + public static final class Eq { + @Specialization + public static boolean cmp(int left, int right) { + return left == right; + } + + @Specialization + public static boolean cmp(long left, long right) { + return left == right; + } + + @Specialization + public static boolean cmp(char left, char right) { + return left == right; + } + + @Specialization + public static boolean cmp(byte left, byte right) { + return left == right; + } + + @Specialization + public static boolean cmp(double left, double right) { + return left == right; + } + + @Specialization + public static boolean cmp(TruffleString left, TruffleString right, + @Cached TruffleString.EqualNode equalNode) { + return equalNode.execute(left, right, PythonUtils.TS_ENCODING); + } + + @Specialization + public static boolean cmp(int left, double right) { + return left == right; + } + + @Specialization + public static boolean cmp(double left, int right) { + return left == right; + } + + @Specialization + @InliningCutoff + public static Object doGeneric(VirtualFrame frame, Object left, Object right, + @Cached GenericRichCompare richCompareNode) { + return richCompareNode.execute(frame, left, right, RichCmpOp.Py_EQ); + } + } + + @Operation + public static final class Ne { + @Specialization + public static boolean cmp(int left, int right) { + return left != right; + } + + @Specialization + public static boolean cmp(long left, long right) { + return left != right; + } + + @Specialization + public static boolean cmp(char left, char right) { + return left != right; + } + + @Specialization + public static boolean cmp(byte left, byte right) { + return left != right; + } + + @Specialization + public static boolean cmp(double left, double right) { + return left != right; + } + + @Specialization + public static boolean cmp(TruffleString left, TruffleString right, + @Cached TruffleString.EqualNode equalNode) { + return !equalNode.execute(left, right, PythonUtils.TS_ENCODING); + } + + @Specialization + public static boolean cmp(int left, double right) { + return left != right; + } + + @Specialization + public static boolean cmp(double left, int right) { + return left != right; + } + + @Specialization + @InliningCutoff + public static Object doGeneric(VirtualFrame frame, Object left, Object right, + @Cached GenericRichCompare richCompareNode) { + return richCompareNode.execute(frame, left, right, RichCmpOp.Py_NE); + } + } + + @Operation + @ConstantOperand(type = TruffleString.class) + @ConstantOperand(type = TruffleString[].class, dimensions = 0) + @ConstantOperand(type = int.class) + public static final class Import { + @Specialization + @InliningCutoff + public static Object doImport(VirtualFrame frame, TruffleString name, TruffleString[] fromList, int level, + @Cached ImportNode node) { + return node.execute(frame, name, PArguments.getGlobals(frame), fromList, level); + } + } + + @Operation + @ConstantOperand(type = TruffleString.class) + public static final class ImportFrom { + @Specialization + @InliningCutoff + public static Object doImport(VirtualFrame frame, TruffleString name, Object module, + @Cached ImportFromNode node) { + return node.execute(frame, module, name); + } + } + + @Operation + @ConstantOperand(type = TruffleString.class) + @ConstantOperand(type = int.class) + public static final class ImportStar { + @Specialization + @InliningCutoff + public static void doImport(VirtualFrame frame, TruffleString name, int level, + @Cached("create(name, level)") ImportStarNode node) { + node.execute(frame, name, level); + } + + @NeverDefault + static ImportStarNode create(TruffleString name, int level) { + return ImportStarNode.create(); + } + } + + @Operation + public static final class Raise { + @Specialization + public static void perform(VirtualFrame frame, Object typeOrExceptionObject, Object cause, + @Bind PBytecodeDSLRootNode root, + @Cached RaiseNode raiseNode) { + raiseNode.execute(frame, typeOrExceptionObject, cause, !root.isInternal()); + } + } + + @Operation + public static final class Reraise { + @Specialization + public static void doPException(PException ex, + @Bind PBytecodeDSLRootNode root) { + throw ex.getExceptionForReraise(!root.isInternal()); + } + + @Specialization + public static void doAbstractTruffleException(AbstractTruffleException ex) { + throw ex; + } + } + + /** + * Throw is used internally for our try-catch-finally implementation when we need to throw an + * exception and catch it elsewhere. We don't need to do any of the work done by RaiseNode. + */ + @Operation + public static final class Throw { + @Specialization + public static void doAbstractTruffleException(AbstractTruffleException ex) { + throw ex; + } + } + + @Operation + public static final class GetCurrentException { + @Specialization + public static AbstractTruffleException doPException(VirtualFrame frame) { + return PArguments.getException(frame); + } + } + + @Operation + public static final class SetCurrentException { + @Specialization + @InliningCutoff + public static void doPException(VirtualFrame frame, AbstractTruffleException ex) { + PArguments.setException(frame, ex); + } + } + + @Operation + public static final class MarkExceptionAsCaught { + @Specialization + @InliningCutoff + public static void doPException(VirtualFrame frame, PException ex, + @Bind PBytecodeDSLRootNode rootNode) { + ex.markAsCaught(frame, rootNode); + } + + @Fallback + @InliningCutoff + public static void doNothing(@SuppressWarnings("unused") Object ex) { + } + } + + @Operation + public static final class AssertFailed { + @Specialization + public static void doAssertFailed(VirtualFrame frame, Object assertionMessage, + @Bind PBytecodeDSLRootNode rooNode) { + if (assertionMessage == PNone.NO_VALUE) { + throw PRaiseNode.raiseStatic(rooNode, AssertionError); + } else { + throw PRaiseNode.raiseStatic(rooNode, AssertionError, new Object[]{assertionMessage}); + } + } + } + + @Operation + @ConstantOperand(type = int.class) + public static final class LoadCell { + @Specialization + public static Object doLoadCell(int index, PCell cell, + @Bind PBytecodeDSLRootNode rootNode, + @Bind Node inliningTarget, + @Cached PRaiseNode raiseNode) { + return checkUnboundCell(cell, index, rootNode, inliningTarget, raiseNode); + } + } + + @Operation + @ConstantOperand(type = int.class) + public static final class ClassLoadCell { + @Specialization + public static Object doLoadCell(VirtualFrame frame, int index, PCell cell, + @Bind PBytecodeDSLRootNode rootNode, + @Bind Node inliningTarget, + @Cached ReadFromLocalsNode readLocalsNode, + @Cached PRaiseNode raiseNode) { + CodeUnit co = rootNode.getCodeUnit(); + TruffleString name = co.freevars[index - co.cellvars.length]; + Object locals = PArguments.getSpecialArgument(frame); + Object value = readLocalsNode.execute(frame, inliningTarget, locals, name); + if (value != PNone.NO_VALUE) { + return value; + } else { + return checkUnboundCell(cell, index, rootNode, inliningTarget, raiseNode); + } + } + } + + @Operation + public static final class StoreCell { + @Specialization + public static void doStoreCell(PCell cell, Object value) { + cell.setRef(value); + } + } + + @Operation + public static final class CreateCell { + @Specialization + public static PCell doCreateCell(Object value) { + PCell cell = new PCell(Assumption.create()); + cell.setRef(value); + return cell; + } + } + + @Operation + @ConstantOperand(type = int.class) + public static final class ClearCell { + @Specialization + public static void doClearCell(int index, PCell cell, + @Bind PBytecodeDSLRootNode rootNode, + @Bind Node inliningTarget, + @Cached PRaiseNode raiseNode) { + checkUnboundCell(cell, index, rootNode, inliningTarget, raiseNode); + cell.clearRef(); + } + } + + @Operation + @ConstantOperand(type = LocalAccessor.class) + public static final class ClearLocal { + @Specialization + public static void doClearLocal(VirtualFrame frame, LocalAccessor localAccessor, + @Bind BytecodeNode bytecode) { + localAccessor.setObject(bytecode, frame, null); + } + } + + @Operation + public static final class LoadClosure { + @Specialization + public static PCell[] doLoadClosure(VirtualFrame frame) { + return PArguments.getClosure(frame); + } + } + + @Operation + @ConstantOperand(type = LocalRangeAccessor.class) + public static final class StoreRange { + @Specialization + public static void perform(VirtualFrame frame, LocalRangeAccessor locals, Object[] values, + @Bind BytecodeNode bytecode) { + CompilerAsserts.partialEvaluationConstant(locals.getLength()); + assert values.length == locals.getLength(); + for (int i = 0; i < locals.getLength(); i++) { + locals.setObject(bytecode, frame, i, values[i]); + } + } + } + + @Operation + public static final class MakeCellArray { + @Specialization + public static PCell[] doMakeCellArray(@Variadic Object[] cells) { + return PCell.toCellArray(cells); + } + } + + /** + * Flattens an array of arrays. Used for splatting Starred expressions. + */ + @Operation + @ConstantOperand(type = int.class, specifyAtEnd = true) + public static final class Unstar { + @Specialization(guards = "length != 1") + public static Object[] perform(@Variadic Object[] values, int length) { + // if len <= 1, we should emit load constant "empty array", or emit just unpack starred + assert length > 1; + CompilerAsserts.partialEvaluationConstant(length); + int totalLength = 0; + for (int i = 0; i < length; i++) { + totalLength += ((Object[]) values[i]).length; + } + Object[] result = new Object[totalLength]; + int idx = 0; + for (int i = 0; i < length; i++) { + int nl = ((Object[]) values[i]).length; + System.arraycopy(values[i], 0, result, idx, nl); + idx += nl; + } + return result; + } + } + + @Operation + @ConstantOperand(type = LocalAccessor.class) + public static final class KwargsMerge { + @Specialization + public static PDict doMerge(VirtualFrame frame, + LocalAccessor callee, + PDict dict, + Object toMerge, + @Bind PBytecodeDSLRootNode rootNode, + @Bind Node inliningTarget, + @Bind BytecodeNode bytecodeNode, + @Cached ConcatDictToStorageNode concatNode, + @Cached PRaiseNode raise) { + try { + HashingStorage resultStorage = concatNode.execute(frame, dict.getDictStorage(), toMerge); + dict.setDictStorage(resultStorage); + } catch (SameDictKeyException e) { + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.S_GOT_MULTIPLE_VALUES_FOR_KEYWORD_ARG, + PyObjectFunctionStr.execute(callee.getObject(bytecodeNode, frame)), + e.getKey()); + } catch (NonMappingException e) { + throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.ARG_AFTER_MUST_BE_MAPPING, PyObjectFunctionStr.execute(callee.getObject(bytecodeNode, frame)), + toMerge); + } + return dict; + } + } + + @Operation + @ImportStatic({PGuards.class}) + public static final class UnpackStarred { + public static boolean isListOrTuple(PSequence obj, Node inliningTarget, InlinedConditionProfile isListProfile) { + return isListProfile.profile(inliningTarget, PGuards.isBuiltinList(obj)) || PGuards.isBuiltinTuple(obj); + } + + @Specialization(guards = "isListOrTuple(seq, inliningTarget, isListProfile)", limit = "1") + static Object[] fromListOrTuple(PSequence seq, + @Bind Node inliningTarget, + @SuppressWarnings("unused") @Cached InlinedConditionProfile isListProfile, + @Exclusive @Cached SequenceNodes.GetPSequenceStorageNode getStorage, + @Exclusive @Cached SequenceStorageNodes.ToArrayNode toArrayNode) { + return toArrayNode.execute(inliningTarget, getStorage.execute(inliningTarget, seq)); + } + + @Specialization(guards = "isNoValue(none)") + static Object[] none(@SuppressWarnings("unused") PNone none) { + return PythonUtils.EMPTY_OBJECT_ARRAY; + } + + @Fallback + @InliningCutoff + public static Object[] doUnpackIterable(VirtualFrame virtualFrame, Object collection, + @Bind Node inliningTarget, + @Cached PyObjectGetIter getIter, + @Cached PyIterNextNode getNextNode, + @Cached IsBuiltinObjectProfile notIterableProfile, + @Shared @Cached PRaiseNode raiseNode) { + + Object iterator; + try { + iterator = getIter.execute(virtualFrame, inliningTarget, collection); + } catch (PException e) { + e.expectTypeError(inliningTarget, notIterableProfile); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_UNPACK_NON_ITERABLE, collection); + } + ArrayBuilder result = new ArrayBuilder<>(); + while (true) { + try { + Object item = getNextNode.execute(virtualFrame, inliningTarget, iterator); + result.add(item); + } catch (IteratorExhausted e) { + return result.toArray(new Object[0]); + } + } + } + } + + @Operation + @ConstantOperand(type = int.class) + @ImportStatic({PGuards.class}) + public static final class UnpackSequence { + @Specialization(guards = "isBuiltinSequence(sequence)") + public static Object[] doUnpackSequence(VirtualFrame localFrame, int count, PSequence sequence, + @Bind Node inliningTarget, + @Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode, + @Cached SequenceStorageNodes.GetItemScalarNode getItemNode, + @Exclusive @Cached PRaiseNode raiseNode) { + CompilerAsserts.partialEvaluationConstant(count); + SequenceStorage storage = getSequenceStorageNode.execute(inliningTarget, sequence); + int len = storage.length(); + if (len != count) { + throw raiseError(inliningTarget, raiseNode, len, count); + } + Object[] result = new Object[len]; + for (int i = 0; i < count; i++) { + result[i] = getItemNode.execute(inliningTarget, storage, i); + } + return result; + } + + @InliningCutoff + private static PException raiseError(Node inliningTarget, PRaiseNode raiseNode, int len, int count) { + if (len < count) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK, count, len); + } else { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.TOO_MANY_VALUES_TO_UNPACK, count); + } + } + + @Specialization + @InliningCutoff + public static Object[] doUnpackIterable(VirtualFrame virtualFrame, + int count, + Object collection, + @Bind Node inliningTarget, + @Cached PyObjectGetIter getIter, + @Cached PyIterNextNode getNextNode, + @Cached IsBuiltinObjectProfile notIterableProfile, + @Exclusive @Cached PRaiseNode raiseNode) { + CompilerAsserts.partialEvaluationConstant(count); + Object iterator; + try { + iterator = getIter.execute(virtualFrame, inliningTarget, collection); + } catch (PException e) { + e.expectTypeError(inliningTarget, notIterableProfile); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_UNPACK_NON_ITERABLE, collection); + } + + Object[] result = new Object[count]; + for (int i = 0; i < count; i++) { + try { + Object value = getNextNode.execute(virtualFrame, inliningTarget, iterator); + result[i] = value; + } catch (IteratorExhausted e) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK, count, i); + } + } + try { + Object value = getNextNode.execute(virtualFrame, inliningTarget, iterator); + } catch (IteratorExhausted e) { + return result; + } + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.TOO_MANY_VALUES_TO_UNPACK, count); + } + } + + @Operation + @ConstantOperand(type = int.class) + @ConstantOperand(type = int.class) + @ImportStatic({PGuards.class}) + public static final class UnpackEx { + @Specialization(guards = "isBuiltinSequence(sequence)") + public static Object[] doUnpackSequence(VirtualFrame localFrame, + int countBefore, + int countAfter, + PSequence sequence, + @Bind Node inliningTarget, + @SuppressWarnings("unused") @Cached GetPythonObjectClassNode getClassNode, + @Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode, + @Exclusive @Cached SequenceStorageNodes.GetItemScalarNode getItemNode, + @Exclusive @Cached SequenceStorageNodes.GetItemSliceNode getItemSliceNode, + @Exclusive @Cached PRaiseNode raiseNode) { + SequenceStorage storage = getSequenceStorageNode.execute(inliningTarget, sequence); + int len = storage.length(); + int starLen = len - countBefore - countAfter; + if (starLen < 0) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK_EX, countBefore + countAfter, len); + } + + Object[] result = new Object[countBefore + 1 + countAfter]; + copyItemsToArray(inliningTarget, storage, 0, result, 0, countBefore, getItemNode); + result[countBefore] = PFactory.createList(PythonLanguage.get(inliningTarget), getItemSliceNode.execute(storage, countBefore, countBefore + starLen, 1, starLen)); + copyItemsToArray(inliningTarget, storage, len - countAfter, result, countBefore + 1, countAfter, getItemNode); + return result; + } + + @Specialization + @InliningCutoff + public static Object[] doUnpackIterable(VirtualFrame virtualFrame, + int countBefore, + int countAfter, + Object collection, + @Bind Node inliningTarget, + @Cached PyObjectGetIter getIter, + @Cached PyIterNextNode getNextNode, + @Cached IsBuiltinObjectProfile notIterableProfile, + @Cached ListNodes.ConstructListNode constructListNode, + @Exclusive @Cached SequenceStorageNodes.GetItemScalarNode getItemNode, + @Exclusive @Cached SequenceStorageNodes.GetItemSliceNode getItemSliceNode, + @Exclusive @Cached PRaiseNode raiseNode) { + Object iterator; + try { + iterator = getIter.execute(virtualFrame, inliningTarget, collection); + } catch (PException e) { + e.expectTypeError(inliningTarget, notIterableProfile); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.CANNOT_UNPACK_NON_ITERABLE, collection); + } + + Object[] result = new Object[countBefore + 1 + countAfter]; + copyItemsToArray(virtualFrame, inliningTarget, iterator, result, 0, countBefore, countBefore + countAfter, getNextNode, raiseNode); + PList starAndAfter = constructListNode.execute(virtualFrame, iterator); + SequenceStorage storage = starAndAfter.getSequenceStorage(); + int lenAfter = storage.length(); + if (lenAfter < countAfter) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK_EX, countBefore + countAfter, countBefore + lenAfter); + } + if (countAfter == 0) { + result[countBefore] = starAndAfter; + } else { + int starLen = lenAfter - countAfter; + PList starList = PFactory.createList(PythonLanguage.get(inliningTarget), getItemSliceNode.execute(storage, 0, starLen, 1, starLen)); + result[countBefore] = starList; + copyItemsToArray(inliningTarget, storage, starLen, result, countBefore + 1, countAfter, getItemNode); + } + return result; + } + + private static void copyItemsToArray(VirtualFrame frame, Node inliningTarget, Object iterator, Object[] destination, int destinationOffset, int length, int totalLength, + PyIterNextNode getNextNode, PRaiseNode raiseNode) { + CompilerAsserts.partialEvaluationConstant(destinationOffset); + CompilerAsserts.partialEvaluationConstant(length); + CompilerAsserts.partialEvaluationConstant(totalLength); + for (int i = 0; i < length; i++) { + try { + Object value = getNextNode.execute(frame, inliningTarget, iterator); + destination[destinationOffset + i] = value; + } catch (IteratorExhausted e) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.NOT_ENOUGH_VALUES_TO_UNPACK_EX, totalLength, destinationOffset + i); + } + } + } + + private static void copyItemsToArray(Node inliningTarget, SequenceStorage source, int sourceOffset, Object[] destination, int destinationOffset, int length, + SequenceStorageNodes.GetItemScalarNode getItemNode) { + CompilerAsserts.partialEvaluationConstant(sourceOffset); + CompilerAsserts.partialEvaluationConstant(destinationOffset); + CompilerAsserts.partialEvaluationConstant(length); + for (int i = 0; i < length; i++) { + destination[destinationOffset + i] = getItemNode.execute(inliningTarget, source, sourceOffset + i); + } + } + } + + @Operation + public static final class CallNilaryMethod { + @Specialization + @InliningCutoff + public static Object doCall(VirtualFrame frame, Object callable, + @Cached CallNode node) { + return node.execute(frame, callable, PythonUtils.EMPTY_OBJECT_ARRAY, PKeyword.EMPTY_KEYWORDS); + } + } + + @Operation + public static final class CallUnaryMethod { + @Specialization + @InliningCutoff + public static Object doCall(VirtualFrame frame, Object callable, Object arg0, + @Cached CallUnaryMethodNode node) { + return node.executeObject(frame, callable, arg0); + } + } + + @Operation + public static final class CallBinaryMethod { + @Specialization + @InliningCutoff + public static Object doObject(VirtualFrame frame, Object callable, Object arg0, Object arg1, + @Cached CallBinaryMethodNode node) { + return node.executeObject(frame, callable, arg0, arg1); + } + } + + @Operation + public static final class CallTernaryMethod { + @Specialization + @InliningCutoff + public static Object doCall(VirtualFrame frame, Object callable, Object arg0, Object arg1, Object arg2, + @Cached CallTernaryMethodNode node) { + return node.execute(frame, callable, arg0, arg1, arg2); + } + } + + @Operation + public static final class CallQuaternaryMethod { + @Specialization + @InliningCutoff + public static Object doCall(VirtualFrame frame, Object callable, Object arg0, Object arg1, Object arg2, Object arg3, + @Cached CallQuaternaryMethodNode node) { + return node.execute(frame, callable, arg0, arg1, arg2, arg3); + } + } + + @Operation + public static final class CallVarargsMethod { + @Specialization + @InliningCutoff + public static Object doCall(VirtualFrame frame, Object callable, Object[] args, PKeyword[] keywords, + @Cached CallNode node) { + return node.execute(frame, callable, args, keywords); + } + } + + @Operation + @ConstantOperand(type = LocalAccessor.class) + @ConstantOperand(type = LocalAccessor.class) + public static final class ContextManagerEnter { + @Specialization + @InliningCutoff + public static void doEnter(VirtualFrame frame, + LocalAccessor exitSetter, + LocalAccessor resultSetter, + Object contextManager, + @Bind Node inliningTarget, + @Bind BytecodeNode bytecode, + @Cached GetClassNode getClass, + @Cached LookupSpecialMethodNode.Dynamic lookupEnter, + @Cached LookupSpecialMethodNode.Dynamic lookupExit, + @Cached CallUnaryMethodNode callEnter, + @Cached PRaiseNode raiseNode) { + Object type = getClass.execute(inliningTarget, contextManager); + Object enter = lookupEnter.execute(frame, inliningTarget, type, T___ENTER__, contextManager); + if (enter == PNone.NO_VALUE) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.N_OBJECT_DOES_NOT_SUPPORT_CONTEXT_MANAGER_PROTOCOL, type); + } + Object exit = lookupExit.execute(frame, inliningTarget, type, T___EXIT__, contextManager); + if (exit == PNone.NO_VALUE) { + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.N_OBJECT_DOES_NOT_SUPPORT_CONTEXT_MANAGER_PROTOCOL_EXIT, type); + } + Object result = callEnter.executeObject(frame, enter, contextManager); + exitSetter.setObject(bytecode, frame, exit); + resultSetter.setObject(bytecode, frame, result); + } + } + + @Operation + public static final class ContextManagerExit { + @Specialization + public static void doRegular(VirtualFrame frame, PNone none, Object exit, Object contextManager, + @Shared @Cached CallQuaternaryMethodNode callExit) { + callExit.execute(frame, exit, contextManager, PNone.NONE, PNone.NONE, PNone.NONE); + } + + @Specialization + @InliningCutoff + public static void doExceptional(VirtualFrame frame, + Object exception, Object exit, Object contextManager, + @Bind Node inliningTarget, + @Bind PBytecodeDSLRootNode rootNode, + @Shared @Cached CallQuaternaryMethodNode callExit, + @Cached GetClassNode getClass, + @Cached ExceptionNodes.GetTracebackNode getTraceback, + @Cached PyObjectIsTrueNode isTrue) { + AbstractTruffleException savedExcState = PArguments.getException(frame); + try { + Object pythonException = exception; + if (exception instanceof PException pException) { + PArguments.setException(frame, pException); + pythonException = pException.getEscapedException(); + } + Object excType = getClass.execute(inliningTarget, pythonException); + Object excTraceback = getTraceback.execute(inliningTarget, pythonException); + Object result = callExit.execute(frame, exit, contextManager, excType, pythonException, excTraceback); + if (!isTrue.execute(frame, result)) { + if (exception instanceof PException pException) { + throw pException.getExceptionForReraise(!rootNode.isInternal()); + } else if (exception instanceof AbstractTruffleException ate) { + throw ate; + } else { + throw CompilerDirectives.shouldNotReachHere("Exception not on stack"); + } + } + } finally { + PArguments.setException(frame, savedExcState); + } + } + } + + @Operation + @ConstantOperand(type = LocalAccessor.class) + @ConstantOperand(type = LocalAccessor.class) + public static final class AsyncContextManagerEnter { + @Specialization + @InliningCutoff + public static void doEnter(VirtualFrame frame, + LocalAccessor exitSetter, + LocalAccessor resultSetter, + Object contextManager, + @Bind Node inliningTarget, + @Bind BytecodeNode bytecode, + @Cached GetClassNode getClass, + @Cached LookupSpecialMethodNode.Dynamic lookupEnter, + @Cached LookupSpecialMethodNode.Dynamic lookupExit, + @Cached CallUnaryMethodNode callEnter, + @Cached PRaiseNode raiseNode) { + Object type = getClass.execute(inliningTarget, contextManager); + Object enter = lookupEnter.execute(frame, inliningTarget, type, T___AENTER__, contextManager); + if (enter == PNone.NO_VALUE) { + throw raiseNode.raise(inliningTarget, AttributeError, new Object[]{T___AENTER__}); + } + Object exit = lookupExit.execute(frame, inliningTarget, type, T___AEXIT__, contextManager); + if (exit == PNone.NO_VALUE) { + throw raiseNode.raise(inliningTarget, AttributeError, new Object[]{T___AEXIT__}); + } + Object result = callEnter.executeObject(frame, enter, contextManager); + exitSetter.setObject(bytecode, frame, exit); + resultSetter.setObject(bytecode, frame, result); + } + } + + @Operation + public static final class AsyncContextManagerCallExit { + @Specialization + public static Object doRegular(VirtualFrame frame, + PNone none, Object exit, Object contextManager, + @Shared @Cached CallQuaternaryMethodNode callExit) { + return callExit.execute(frame, exit, contextManager, PNone.NONE, PNone.NONE, PNone.NONE); + } + + @Specialization + @InliningCutoff + public static Object doExceptional(VirtualFrame frame, + Object exception, Object exit, Object contextManager, + @Bind Node inliningTarget, + @Bind PBytecodeDSLRootNode rootNode, + @Shared @Cached CallQuaternaryMethodNode callExit, + @Cached GetClassNode getClass, + @Cached ExceptionNodes.GetTracebackNode getTraceback, + @Cached PyObjectIsTrueNode isTrue) { + AbstractTruffleException savedExcState = PArguments.getException(frame); + try { + Object pythonException = exception; + if (exception instanceof PException) { + PArguments.setException(frame, (PException) exception); + pythonException = ((PException) exception).getEscapedException(); + } + Object excType = getClass.execute(inliningTarget, pythonException); + Object excTraceback = getTraceback.execute(inliningTarget, pythonException); + return callExit.execute(frame, exit, contextManager, excType, pythonException, excTraceback); + } finally { + PArguments.setException(frame, savedExcState); + } + } + } + + @Operation + public static final class AsyncContextManagerExit { + /** + * NB: There is nothing to do after awaiting __exit__(None, None, None), so this operation + * is only emitted for the case where the context manager exits due to an exception. + */ + @Specialization + @InliningCutoff + public static void doExceptional(VirtualFrame frame, + Object exception, Object result, + @Bind Node inliningTarget, + @Bind PBytecodeDSLRootNode rootNode, + @Cached CallQuaternaryMethodNode callExit, + @Cached GetClassNode getClass, + @Cached ExceptionNodes.GetTracebackNode getTraceback, + @Cached PyObjectIsTrueNode isTrue) { + if (!isTrue.execute(frame, result)) { + if (exception instanceof PException) { + throw ((PException) exception).getExceptionForReraise(!rootNode.isInternal()); + } else if (exception instanceof AbstractTruffleException) { + throw (AbstractTruffleException) exception; + } else { + throw CompilerDirectives.shouldNotReachHere("Exception not on stack"); + } + } + } + } + + @Operation + @ConstantOperand(type = int.class) + public static final class BuildString { + @Specialization + public static Object perform( + int length, + @Variadic Object[] strings, + @Cached TruffleStringBuilder.AppendStringNode appendNode, + @Cached TruffleStringBuilder.ToStringNode toString) { + var tsb = TruffleStringBuilderUTF32.create(PythonUtils.TS_ENCODING); + CompilerAsserts.partialEvaluationConstant(length); + for (int i = 0; i < length; i++) { + appendNode.execute(tsb, (TruffleString) strings[i]); + } + return toString.execute(tsb); + } + } + + @Operation + @ConstantOperand(type = LocalAccessor.class) + public static final class TeeLocal { + @Specialization + public static int doInt(VirtualFrame frame, LocalAccessor local, int value, + @Bind BytecodeNode bytecode) { + local.setInt(bytecode, frame, value); + return value; + } + + @Specialization + public static double doDouble(VirtualFrame frame, LocalAccessor local, double value, + @Bind BytecodeNode bytecode) { + local.setDouble(bytecode, frame, value); + return value; + } + + @Specialization + public static long doLong(VirtualFrame frame, LocalAccessor local, long value, + @Bind BytecodeNode bytecode) { + local.setLong(bytecode, frame, value); + return value; + } + + @Specialization(replaces = {"doInt", "doDouble", "doLong"}) + public static Object doObject(VirtualFrame frame, LocalAccessor local, Object value, + @Bind BytecodeNode bytecode) { + local.setObject(bytecode, frame, value); + return value; + } + } + + @Operation + public static final class GetLen { + @Specialization + public static int doObject(VirtualFrame frame, Object value, + @Bind Node inliningTarget, + @Cached PyObjectSizeNode sizeNode) { + return sizeNode.execute(frame, inliningTarget, value); + } + } + + @Operation + @ConstantOperand(type = long.class) + public static final class CheckTypeFlags { + @Specialization + public static boolean doObject(long typeFlags, Object value, + @Cached GetTPFlagsNode getTPFlagsNode) { + return (getTPFlagsNode.execute(value) & typeFlags) != 0; + } + } + + @Operation + @ImportStatic(PGuards.class) + public static final class BinarySubscript { + // TODO: GR-64248, the result is not BE'd because of the UnexpectedResultException. maybe we + // should explicitly check for an int storage type? + @Specialization(rewriteOn = UnexpectedResultException.class, guards = "isBuiltinList(list)") + public static int doIntList(PList list, int index, + @Shared @Cached("createForList()") SequenceStorageNodes.GetItemNode getListItemNode) throws UnexpectedResultException { + return getListItemNode.executeInt(list.getSequenceStorage(), index); + } + + @Specialization(rewriteOn = UnexpectedResultException.class, guards = "isBuiltinList(list)") + public static double doDoubleList(PList list, int index, + @Shared @Cached("createForList()") SequenceStorageNodes.GetItemNode getListItemNode) throws UnexpectedResultException { + return getListItemNode.executeDouble(list.getSequenceStorage(), index); + } + + @Specialization(replaces = {"doIntList", "doDoubleList"}, guards = "isBuiltinList(list)") + public static Object doObjectList(PList list, int index, + @Shared @Cached("createForList()") SequenceStorageNodes.GetItemNode getListItemNode) { + return getListItemNode.execute(list.getSequenceStorage(), index); + } + + @Specialization(rewriteOn = UnexpectedResultException.class, guards = "isBuiltinTuple(tuple)") + public static int doIntTuple(PTuple tuple, int index, + @Shared @Cached("createForTuple()") SequenceStorageNodes.GetItemNode getTupleItemNode) throws UnexpectedResultException { + return getTupleItemNode.executeInt(tuple.getSequenceStorage(), index); + + } + + @Specialization(rewriteOn = UnexpectedResultException.class, guards = "isBuiltinTuple(tuple)") + public static double doDoubleTuple(PTuple tuple, int index, + @Shared @Cached("createForTuple()") SequenceStorageNodes.GetItemNode getTupleItemNode) throws UnexpectedResultException { + return getTupleItemNode.executeDouble(tuple.getSequenceStorage(), index); + } + + @Specialization(replaces = {"doIntTuple", "doDoubleTuple"}, guards = "isBuiltinTuple(tuple)") + public static Object doObjectTuple(PTuple tuple, int index, + @Shared @Cached("createForTuple()") SequenceStorageNodes.GetItemNode getTupleItemNode) { + return getTupleItemNode.execute(tuple.getSequenceStorage(), index); + } + + @Fallback + public static Object doOther(VirtualFrame frame, Object receiver, Object key, + @Bind("this") Node inliningTarget, + @Cached GetObjectSlotsNode getSlotsNode, + @Cached PyObjectGetItem.PyObjectGetItemGeneric getItemNode) { + TpSlots slots = getSlotsNode.execute(inliningTarget, receiver); + return getItemNode.execute(frame, inliningTarget, receiver, slots, key); + } + } + + /** + * Performs some clean-up steps before suspending execution. + */ + @Operation + public static final class PreYield { + @Specialization + public static Object doObject(VirtualFrame frame, Object value, + @Bind Node location, + @Bind PBytecodeDSLRootNode root) { + if (root.needsTraceAndProfileInstrumentation()) { + root.traceOrProfileReturn(frame, location, value); + root.getThreadState().popInstrumentationData(root); + } + return value; + } + } + + /** + * Resumes execution after yield. + */ + @Operation + public static final class ResumeYield { + @Specialization + public static Object doObject(VirtualFrame frame, Object sendValue, + @Bind Node location, + @Bind PBytecodeDSLRootNode root, + @Bind BytecodeNode bytecode, + @Bind("$bytecodeIndex") int bci, + @Cached GetSendValueNode getSendValue) { + if (root.needsTraceAndProfileInstrumentation()) { + // We may not have reparsed the root with instrumentation yet. + root.ensureTraceAndProfileEnabled(); + root.getThreadState().pushInstrumentationData(root); + root.traceOrProfileCall(frame, location, bytecode, bci); + } + + return getSendValue.execute(sendValue); + } + } + + @Operation + @ConstantOperand(type = LocalAccessor.class) + @ConstantOperand(type = LocalAccessor.class) + @SuppressWarnings("truffle-interpreted-performance") + public static final class YieldFromSend { + private static final TruffleString T_SEND = tsLiteral("send"); + + @Specialization + static boolean doGenerator(VirtualFrame virtualFrame, + LocalAccessor yieldedValue, + LocalAccessor returnedValue, + PGenerator generator, + Object arg, + @Bind Node inliningTarget, + @Bind BytecodeNode bytecode, + @Cached CommonGeneratorBuiltins.SendNode sendNode, + @Shared @Cached IsBuiltinObjectProfile stopIterationProfile, + @Shared @Cached StopIterationBuiltins.StopIterationValueNode getValue) { + try { + Object value = sendNode.execute(virtualFrame, generator, arg); + yieldedValue.setObject(bytecode, virtualFrame, value); + return false; + } catch (PException e) { + handleException(virtualFrame, e, inliningTarget, bytecode, stopIterationProfile, getValue, returnedValue); + return true; + } + } + + @Specialization(guards = "iterCheck.execute(inliningTarget, iter)", limit = "1") + static boolean doIterator(VirtualFrame virtualFrame, + LocalAccessor yieldedValue, + LocalAccessor returnedValue, + Object iter, + @SuppressWarnings("unused") PNone arg, + @Bind Node inliningTarget, + @Bind BytecodeNode bytecode, + @SuppressWarnings("unused") @Cached PyIterCheckNode iterCheck, + @Cached PyIterNextNode getNextNode, + @Shared @Cached IsBuiltinObjectProfile stopIterationProfile, + @Shared @Cached StopIterationBuiltins.StopIterationValueNode getValue) { + try { + Object value = getNextNode.execute(virtualFrame, inliningTarget, iter); + yieldedValue.setObject(bytecode, virtualFrame, value); + return false; + } catch (IteratorExhausted e) { + returnedValue.setObject(bytecode, virtualFrame, PNone.NONE); + return true; + } + } + + @Fallback + static boolean doOther(VirtualFrame virtualFrame, + LocalAccessor yieldedValue, + LocalAccessor returnedValue, + Object obj, + Object arg, + @Bind Node inliningTarget, + @Bind BytecodeNode bytecode, + @Bind("$bytecodeIndex") int bci, + @Cached PyObjectCallMethodObjArgs callMethodNode, + @Shared @Cached IsBuiltinObjectProfile stopIterationProfile, + @Shared @Cached StopIterationBuiltins.StopIterationValueNode getValue) { + try { + Object value = callMethodNode.execute(virtualFrame, inliningTarget, obj, T_SEND, arg); + yieldedValue.setObject(bytecode, virtualFrame, value); + return false; + } catch (PException e) { + handleException(virtualFrame, e, inliningTarget, bytecode, stopIterationProfile, getValue, returnedValue); + return true; + } + } + + private static void handleException(VirtualFrame frame, PException e, Node inliningTarget, BytecodeNode bytecode, + IsBuiltinObjectProfile stopIterationProfile, + StopIterationBuiltins.StopIterationValueNode getValue, + LocalAccessor returnedValue) { + e.expectStopIteration(inliningTarget, stopIterationProfile); + returnedValue.setObject(bytecode, frame, getValue.execute((PBaseException) e.getUnreifiedException())); + } + + } + + @Operation + @ConstantOperand(type = LocalAccessor.class) + @ConstantOperand(type = LocalAccessor.class) + @SuppressWarnings("truffle-interpreted-performance") + public static final class YieldFromThrow { + + private static final TruffleString T_CLOSE = tsLiteral("close"); + private static final TruffleString T_THROW = tsLiteral("throw"); + + @Specialization + static boolean doGenerator(VirtualFrame frame, + LocalAccessor yieldedValue, + LocalAccessor returnedValue, + PGenerator generator, + PException exception, + @Bind Node inliningTarget, + @Bind BytecodeNode bytecode, + @Cached CommonGeneratorBuiltins.ThrowNode throwNode, + @Cached CommonGeneratorBuiltins.CloseNode closeNode, + @Shared @Cached IsBuiltinObjectProfile profileExit, + @Shared @Cached IsBuiltinObjectProfile stopIterationProfile, + @Shared @Cached StopIterationBuiltins.StopIterationValueNode getValue) { + if (profileExit.profileException(inliningTarget, exception, GeneratorExit)) { + closeNode.execute(frame, generator); + throw exception; + } else { + try { + Object value = throwNode.execute(frame, generator, exception.getEscapedException(), PNone.NO_VALUE, PNone.NO_VALUE); + yieldedValue.setObject(bytecode, frame, value); + return false; + } catch (PException e) { + handleException(frame, e, inliningTarget, bytecode, stopIterationProfile, getValue, returnedValue); + return true; + } + } + } + + @Fallback + static boolean doOther(VirtualFrame frame, + LocalAccessor yieldedValue, + LocalAccessor returnedValue, + Object obj, + Object exception, + @Bind Node inliningTarget, + @Bind BytecodeNode bytecode, + @Cached PyObjectLookupAttr lookupThrow, + @Cached PyObjectLookupAttr lookupClose, + @Cached CallNode callThrow, + @Cached CallNode callClose, + @Cached WriteUnraisableNode writeUnraisableNode, + @Shared @Cached IsBuiltinObjectProfile profileExit, + @Shared @Cached IsBuiltinObjectProfile stopIterationProfile, + @Shared @Cached StopIterationBuiltins.StopIterationValueNode getValue) { + PException pException = (PException) exception; + if (profileExit.profileException(inliningTarget, pException, GeneratorExit)) { + Object close = PNone.NO_VALUE; + try { + close = lookupClose.execute(frame, inliningTarget, obj, T_CLOSE); + } catch (PException e) { + writeUnraisableNode.execute(frame, e.getEscapedException(), null, obj); + } + if (close != PNone.NO_VALUE) { + callClose.execute(frame, close); + } + throw pException; + } else { + Object throwMethod = lookupThrow.execute(frame, inliningTarget, obj, T_THROW); + if (throwMethod == PNone.NO_VALUE) { + throw pException; + } + try { + Object value = callThrow.execute(frame, throwMethod, pException.getEscapedException()); + yieldedValue.setObject(bytecode, frame, value); + return false; + } catch (PException e) { + handleException(frame, e, inliningTarget, bytecode, stopIterationProfile, getValue, returnedValue); + return true; + } + } + } + + private static void handleException(VirtualFrame frame, PException e, Node inliningTarget, BytecodeNode bytecode, + IsBuiltinObjectProfile stopIterationProfile, StopIterationBuiltins.StopIterationValueNode getValue, + LocalAccessor returnedValue) { + e.expectStopIteration(inliningTarget, stopIterationProfile); + returnedValue.setObject(bytecode, frame, getValue.execute((PBaseException) e.getUnreifiedException())); + } + } + + /** + * Loads a user-defined local variable. Unlike a built-in LoadLocal, this operation raises an + * unbound local error if the local has not been set. + *

        + * This operation makes use of Truffle's boxing overloads. When an operation tries to quicken + * this one for boxing elimination, the correct overload will be selected. + */ + @Operation + @ConstantOperand(type = LocalAccessor.class) + @ConstantOperand(type = int.class) + public static final class CheckAndLoadLocal { + @Specialization(rewriteOn = UnexpectedResultException.class) + public static int doInt(VirtualFrame frame, LocalAccessor accessor, int index, + @Bind PBytecodeDSLRootNode rootNode, + @Bind BytecodeNode bytecodeNode, + @Bind Node inliningTarget, + @Shared @Cached InlinedBranchProfile localUnboundProfile) throws UnexpectedResultException { + if (accessor.isCleared(bytecodeNode, frame)) { + localUnboundProfile.enter(inliningTarget); + throw raiseUnbound(rootNode, inliningTarget, index); + } + return accessor.getInt(bytecodeNode, frame); + } + + @Specialization(rewriteOn = UnexpectedResultException.class) + public static boolean doBoolean(VirtualFrame frame, LocalAccessor accessor, int index, + @Bind PBytecodeDSLRootNode rootNode, + @Bind BytecodeNode bytecodeNode, + @Bind Node inliningTarget, + @Shared @Cached InlinedBranchProfile localUnboundProfile) throws UnexpectedResultException { + if (accessor.isCleared(bytecodeNode, frame)) { + localUnboundProfile.enter(inliningTarget); + throw raiseUnbound(rootNode, inliningTarget, index); + } + return accessor.getBoolean(bytecodeNode, frame); + } + + @Specialization(replaces = {"doInt", "doBoolean"}) + public static Object doObject(VirtualFrame frame, LocalAccessor accessor, int index, + @Bind PBytecodeDSLRootNode rootNode, + @Bind BytecodeNode bytecodeNode, + @Bind Node inliningTarget, + @Cached InlinedBranchProfile localUnboundProfile) { + if (accessor.isCleared(bytecodeNode, frame)) { + localUnboundProfile.enter(inliningTarget); + throw raiseUnbound(rootNode, inliningTarget, index); + } + return accessor.getObject(bytecodeNode, frame); + } + } + + @Operation + @ConstantOperand(type = LocalAccessor.class) + @ConstantOperand(type = int.class) + public static final class DeleteLocal { + @Specialization + public static void doObject(VirtualFrame frame, LocalAccessor accessor, int index, + @Bind PBytecodeDSLRootNode rootNode, + @Bind BytecodeNode bytecodeNode, + @Bind Node inliningTarget, + @Cached InlinedBranchProfile localUnboundProfile) { + if (accessor.isCleared(bytecodeNode, frame)) { + localUnboundProfile.enter(inliningTarget); + throw raiseUnbound(rootNode, inliningTarget, index); + } + accessor.clear(bytecodeNode, frame); + } + } + + @TruffleBoundary + private static PException raiseUnbound(PBytecodeDSLRootNode rootNode, Node inliningTarget, int index) { + TruffleString localName = rootNode.getCodeUnit().varnames[index]; + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.UnboundLocalError, ErrorMessages.LOCAL_VAR_REFERENCED_BEFORE_ASSIGMENT, localName); + } + + @Operation + public static final class RaiseNotImplementedError { + @Specialization + public static void doRaise(VirtualFrame frame, TruffleString name, + @Bind Node node) { + throw PRaiseNode.raiseStatic(node, PythonBuiltinClassType.NotImplementedError, name); + + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/CallDispatchNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/CallDispatchNode.java deleted file mode 100644 index 48816e085d..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/CallDispatchNode.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. - * Copyright (c) 2014, Regents of the University of California - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.oracle.graal.python.nodes.call; - -import com.oracle.graal.python.builtins.objects.code.CodeNodes.GetCodeCallTargetNode; -import com.oracle.graal.python.builtins.objects.code.PCode; -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.function.PFunction; -import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetCallTargetNode; -import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetFunctionCodeNode; -import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.RootCallTarget; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.ReportPolymorphism.Megamorphic; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.Frame; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; - -@ImportStatic(PythonOptions.class) -@GenerateUncached -@SuppressWarnings("truffle-inlining") // footprint reduction 48 -> 29 -public abstract class CallDispatchNode extends PNodeWithContext { - - @NeverDefault - protected static FunctionInvokeNode createInvokeNode(PFunction callee) { - return FunctionInvokeNode.create(callee); - } - - @NeverDefault - protected static FunctionInvokeNode createInvokeNode(PBuiltinFunction callee) { - return FunctionInvokeNode.create(callee); - } - - @NeverDefault - protected static CallTargetInvokeNode createCtInvokeNode(PFunction callee) { - return CallTargetInvokeNode.create(callee); - } - - @NeverDefault - protected static CallTargetInvokeNode createCtInvokeNode(PBuiltinFunction callee) { - return CallTargetInvokeNode.create(callee); - } - - @NeverDefault - public static CallDispatchNode create() { - return CallDispatchNodeGen.create(); - } - - public static CallDispatchNode getUncached() { - return CallDispatchNodeGen.getUncached(); - } - - public final Object executeCall(VirtualFrame frame, PFunction callee, Object[] arguments) { - return executeInternal(frame, callee, arguments); - } - - public final Object executeCall(VirtualFrame frame, PBuiltinFunction callee, Object[] arguments) { - return executeInternal(frame, callee, arguments); - } - - protected abstract Object executeInternal(Frame frame, PFunction callee, Object[] arguments); - - protected abstract Object executeInternal(Frame frame, PBuiltinFunction callee, Object[] arguments); - - // We only have a single context and this function never changed its code - @Specialization(guards = {"isSingleContext()", "callee == cachedCallee"}, limit = "getCallSiteInlineCacheMaxDepth()", assumptions = "cachedCallee.getCodeStableAssumption()") - protected static Object callFunctionCached(VirtualFrame frame, @SuppressWarnings("unused") PFunction callee, Object[] arguments, - @SuppressWarnings("unused") @Cached("callee") PFunction cachedCallee, - @Cached("createInvokeNode(cachedCallee)") FunctionInvokeNode invoke) { - return invoke.execute(frame, arguments); - } - - // We only have a single context and this function changed its code before, but now it's - // constant - protected PCode getCode(Node inliningTarget, GetFunctionCodeNode getFunctionCodeNode, PFunction function) { - return getFunctionCodeNode.execute(inliningTarget, function); - } - - @Specialization(guards = {"isSingleContext()", "callee == cachedCallee", "getCode(inliningTarget, getFunctionCodeNode, callee) == cachedCode"}, // - replaces = "callFunctionCached", limit = "getCallSiteInlineCacheMaxDepth()") - protected static Object callFunctionCachedCode(VirtualFrame frame, @SuppressWarnings("unused") PFunction callee, Object[] arguments, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached("callee") PFunction cachedCallee, - @SuppressWarnings("unused") @Cached GetFunctionCodeNode getFunctionCodeNode, - @SuppressWarnings("unused") @Cached("getCode(inliningTarget, getFunctionCodeNode, callee)") PCode cachedCode, - @Cached("createInvokeNode(cachedCallee)") FunctionInvokeNode invoke) { - return invoke.execute(frame, arguments); - } - - protected static RootCallTarget getCallTargetUncached(PFunction callee) { - CompilerAsserts.neverPartOfCompilation(); - return GetCallTargetNode.getUncached().execute(callee); - } - - // We have multiple contexts, don't cache the objects so that contexts can be cleaned up - @Specialization(guards = {"getCt.execute(inliningTarget, callee.getCode()) == ct"}, limit = "getCallSiteInlineCacheMaxDepth()", replaces = "callFunctionCachedCode") - protected static Object callFunctionCachedCt(VirtualFrame frame, PFunction callee, Object[] arguments, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached("getCallTargetUncached(callee)") RootCallTarget ct, - @SuppressWarnings("unused") @Cached GetCodeCallTargetNode getCt, - @Cached("createCtInvokeNode(callee)") CallTargetInvokeNode invoke) { - return invoke.execute(frame, callee, callee.getGlobals(), callee.getClosure(), arguments); - } - - @Specialization(guards = {"isSingleContext()", "callee == cachedCallee"}, limit = "getCallSiteInlineCacheMaxDepth()") - protected static Object callBuiltinFunctionCached(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinFunction callee, Object[] arguments, - @SuppressWarnings("unused") @Cached("callee") PBuiltinFunction cachedCallee, - @Cached("createInvokeNode(cachedCallee)") FunctionInvokeNode invoke) { - return invoke.execute(frame, arguments); - } - - @Specialization(guards = "callee.getCallTarget() == ct", limit = "getCallSiteInlineCacheMaxDepth()") - protected static Object callBuiltinFunctionCachedCt(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinFunction callee, Object[] arguments, - @SuppressWarnings("unused") @Cached("callee.getCallTarget()") RootCallTarget ct, - @Cached("createCtInvokeNode(callee)") CallTargetInvokeNode invoke) { - return invoke.execute(frame, null, null, null, arguments); - } - - @Specialization(replaces = {"callFunctionCached", "callFunctionCachedCode", "callFunctionCachedCt"}) - @Megamorphic - protected static Object callFunctionUncached(Frame frame, PFunction callee, Object[] arguments, - @Shared @Cached GenericInvokeNode invoke) { - return invoke.executeInternal(frame, callee, arguments); - } - - @Specialization(replaces = {"callBuiltinFunctionCached", "callBuiltinFunctionCachedCt"}) - @Megamorphic - protected static Object callBuiltinFunctionUncached(Frame frame, PBuiltinFunction callee, Object[] arguments, - @Shared @Cached GenericInvokeNode invoke) { - return invoke.executeInternal(frame, callee, arguments); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/CallDispatchers.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/CallDispatchers.java new file mode 100644 index 0000000000..afb61882f0 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/CallDispatchers.java @@ -0,0 +1,508 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.call; + +import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.builtins.objects.function.PArguments; +import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; +import com.oracle.graal.python.builtins.objects.function.PFunction; +import com.oracle.graal.python.builtins.objects.function.PKeyword; +import com.oracle.graal.python.builtins.objects.function.Signature; +import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; +import com.oracle.graal.python.builtins.objects.module.PythonModule; +import com.oracle.graal.python.nodes.PNodeWithContext; +import com.oracle.graal.python.nodes.argument.CreateArgumentsNode; +import com.oracle.graal.python.nodes.bytecode.PBytecodeGeneratorFunctionRootNode; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLGeneratorFunctionRootNode; +import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode; +import com.oracle.graal.python.runtime.ExecutionContext; +import com.oracle.graal.python.runtime.ExecutionContext.IndirectCalleeContext; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.PythonContext.PythonThreadState; +import com.oracle.graal.python.runtime.PythonOptions; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.RootCallTarget; +import com.oracle.truffle.api.Truffle; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.ImportStatic; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.ReportPolymorphism.Megamorphic; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.Frame; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.nodes.DirectCallNode; +import com.oracle.truffle.api.nodes.IndirectCallNode; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; + +public class CallDispatchers { + + private static boolean isGeneratorFunction(RootCallTarget callTarget) { + return callTarget.getRootNode() instanceof PBytecodeGeneratorFunctionRootNode || callTarget.getRootNode() instanceof PBytecodeDSLGeneratorFunctionRootNode; + } + + @NeverDefault + public static DirectCallNode createDirectCallNodeFor(PBuiltinFunction callee) { + DirectCallNode callNode = Truffle.getRuntime().createDirectCallNode(callee.getCallTarget()); + if (PythonLanguage.get(null).getEngineOption(PythonOptions.EnableForcedSplits) || + (callee.getFunctionRootNode() instanceof BuiltinFunctionRootNode root && root.getBuiltin().forceSplitDirectCalls())) { + callNode.cloneCallTarget(); + } + return callNode; + } + + @NeverDefault + public static DirectCallNode createDirectCallNodeFor(PFunction callee) { + boolean isGenerator = isGeneratorFunction(callee.getCallTarget()); + DirectCallNode callNode = Truffle.getRuntime().createDirectCallNode(callee.getCallTarget()); + if (callee.forceSplitDirectCalls()) { + callNode.cloneCallTarget(); + } + if (isGenerator && PythonLanguage.get(null).getEngineOption(PythonOptions.ForceInlineGeneratorCalls)) { + callNode.forceInlining(); + } + return callNode; + } + + public static boolean sameCallTarget(RootCallTarget callTarget, DirectCallNode callNode) { + return callTarget == callNode.getCallTarget(); + } + + /** + * Node for invoking call targets of builtin functions, modules or generators when the call + * target is a PE constant. Use {@link #createDirectCallNodeFor(PBuiltinFunction)} to create the + * direct call node for builtin functions. Takes PArguments + */ + @GenerateInline + @GenerateCached(false) + public abstract static class SimpleDirectInvokeNode extends Node { + + public abstract Object execute(VirtualFrame frame, Node inliningTarget, DirectCallNode callNode, Object[] arguments); + + @Specialization + static Object doDirect(VirtualFrame frame, Node inliningTarget, DirectCallNode callNode, Object[] arguments, + @Cached InlinedConditionProfile profileIsNullFrame, + @Cached ExecutionContext.CallContext callContext) { + RootCallTarget callTarget = (RootCallTarget) callNode.getCurrentCallTarget(); + if (profileIsNullFrame.profile(inliningTarget, frame == null)) { + PythonContext context = PythonContext.get(inliningTarget); + PythonThreadState threadState = context.getThreadState(context.getLanguage(inliningTarget)); + Object state = IndirectCalleeContext.enter(threadState, arguments, callTarget); + try { + return callNode.call(arguments); + } finally { + IndirectCalleeContext.exit(threadState, state); + } + } else { + callContext.prepareCall(frame, arguments, callTarget, callNode); + return callNode.call(arguments); + } + } + } + + /** + * Node for invoking call targets of builtin functions, modules or generators when the call + * target is dynamic. Takes PArguments + */ + @GenerateInline(inlineByDefault = true) + @GenerateUncached + public abstract static class SimpleIndirectInvokeNode extends Node { + + public abstract Object execute(Frame frame, Node inliningTarget, RootCallTarget callTarget, Object[] arguments); + + public final Object executeCached(VirtualFrame frame, RootCallTarget callTarget, Object[] arguments) { + return execute(frame, this, callTarget, arguments); + } + + public static Object executeUncached(RootCallTarget callTarget, Object[] arguments) { + return CallDispatchersFactory.SimpleIndirectInvokeNodeGen.getUncached().execute(null, null, callTarget, arguments); + } + + @Specialization + static Object doDirect(VirtualFrame frame, Node inliningTarget, RootCallTarget callTarget, Object[] arguments, + @Cached InlinedConditionProfile profileIsNullFrame, + @Cached ExecutionContext.CallContext callContext, + @Cached IndirectCallNode callNode) { + if (profileIsNullFrame.profile(inliningTarget, frame == null)) { + PythonContext context = PythonContext.get(inliningTarget); + PythonThreadState threadState = context.getThreadState(context.getLanguage(inliningTarget)); + Object state = IndirectCalleeContext.enterIndirect(threadState, arguments); + try { + return callNode.call(callTarget, arguments); + } finally { + IndirectCalleeContext.exit(threadState, state); + } + } else { + callContext.prepareIndirectCall(frame, arguments, callNode); + return callNode.call(callTarget, arguments); + } + } + + @NeverDefault + public static SimpleIndirectInvokeNode create() { + return CallDispatchersFactory.SimpleIndirectInvokeNodeGen.create(); + } + } + + /** + * Node for invoking builtin functions with an inline cache on the function object and a + * secondary inline cache on the call target. Takes PArguments + */ + @GenerateInline + @GenerateCached(false) + @GenerateUncached + @ImportStatic({CallDispatchers.class, PythonOptions.class}) + public abstract static class BuiltinFunctionCachedInvokeNode extends PNodeWithContext { + public abstract Object execute(VirtualFrame frame, Node inliningTarget, PBuiltinFunction callee, Object[] arguments); + + @Specialization(guards = {"isSingleContext()", "callee == cachedCallee"}, limit = "getCallSiteInlineCacheMaxDepth()") + static Object callBuiltinFunctionCached(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") PBuiltinFunction callee, Object[] arguments, + @SuppressWarnings("unused") @Cached("callee") PBuiltinFunction cachedCallee, + @Cached("createDirectCallNodeFor(callee)") DirectCallNode callNode, + @Cached SimpleDirectInvokeNode invoke) { + return invoke.execute(frame, inliningTarget, callNode, arguments); + } + + @Specialization(guards = "sameCallTarget(callee.getCallTarget(), callNode)", limit = "getCallSiteInlineCacheMaxDepth()", replaces = "callBuiltinFunctionCached") + static Object callBuiltinFunctionCachedCt(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") PBuiltinFunction callee, Object[] arguments, + @Cached("createDirectCallNodeFor(callee)") DirectCallNode callNode, + @Cached SimpleDirectInvokeNode invoke) { + return invoke.execute(frame, inliningTarget, callNode, arguments); + } + + @Specialization(replaces = {"callBuiltinFunctionCached", "callBuiltinFunctionCachedCt"}) + @Megamorphic + @InliningCutoff + static Object callBuiltinFunctionMegamorphic(VirtualFrame frame, Node inliningTarget, PBuiltinFunction callee, Object[] arguments, + @Cached SimpleIndirectInvokeNode invoke) { + return invoke.execute(frame, inliningTarget, callee.getCallTarget(), arguments); + } + } + + /** + * Node for calling builtin functions with an inline cache on the function object and a + * secondary inline cache on the call target. + */ + @GenerateInline + @GenerateCached(false) + @GenerateUncached + @ImportStatic({CallDispatchers.class, PythonOptions.class}) + public abstract static class BuiltinFunctionCachedCallNode extends PNodeWithContext { + + public abstract Object execute(VirtualFrame frame, Node inliningTarget, PBuiltinFunction callee, Object[] arguments, PKeyword[] keywords); + + @Specialization(guards = {"isSingleContext()", "callee == cachedCallee"}, limit = "getCallSiteInlineCacheMaxDepth()") + static Object callBuiltinFunctionCached(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") PBuiltinFunction callee, Object[] arguments, PKeyword[] keywords, + @Cached("callee") PBuiltinFunction cachedCallee, + @Cached CreateArgumentsNode createArgs, + @Cached("createDirectCallNodeFor(callee)") DirectCallNode callNode, + @Cached SimpleDirectInvokeNode invoke) { + Object[] pArguments = createArgs.execute(inliningTarget, cachedCallee, arguments, keywords, cachedCallee.getSignature(), null, null, + cachedCallee.getDefaults(), cachedCallee.getKwDefaults(), false); + return invoke.execute(frame, inliningTarget, callNode, pArguments); + } + + @Specialization(guards = "sameCallTarget(callee.getCallTarget(), callNode)", limit = "getCallSiteInlineCacheMaxDepth()", replaces = "callBuiltinFunctionCached") + static Object callBuiltinFunctionCachedCt(VirtualFrame frame, Node inliningTarget, PBuiltinFunction callee, Object[] arguments, PKeyword[] keywords, + @Cached CreateArgumentsNode createArgs, + @Cached("createDirectCallNodeFor(callee)") DirectCallNode callNode, + @Cached SimpleDirectInvokeNode invoke) { + Signature signature; + /* + * The signature is PE-constant for a given callTarget, but getting it from there needs + * multiple virtual calls in the interpreter. + */ + if (CompilerDirectives.inCompiledCode()) { + signature = Signature.fromCallTarget((RootCallTarget) callNode.getCallTarget()); + } else { + signature = callee.getSignature(); + } + Object[] pArguments = createArgs.execute(inliningTarget, callee, arguments, keywords, signature, null, null, + callee.getDefaults(), callee.getKwDefaults(), false); + return invoke.execute(frame, inliningTarget, callNode, pArguments); + } + + @Specialization(replaces = {"callBuiltinFunctionCached", "callBuiltinFunctionCachedCt"}) + @Megamorphic + @InliningCutoff + static Object callBuiltinFunctionMegamorphic(VirtualFrame frame, Node inliningTarget, PBuiltinFunction callee, Object[] arguments, PKeyword[] keywords, + @Cached CreateArgumentsNode createArgs, + @Cached SimpleIndirectInvokeNode invoke) { + Object[] pArguments = createArgs.execute(inliningTarget, callee, arguments, keywords, callee.getSignature(), null, null, + callee.getDefaults(), callee.getKwDefaults(), false); + return invoke.execute(frame, inliningTarget, callee.getCallTarget(), pArguments); + } + } + + /** + * Node for calling builtin functions with an inline cache on the method object and a secondary + * inline cache on the call target. + */ + @GenerateInline + @GenerateCached(false) + @GenerateUncached + @ImportStatic({CallDispatchers.class, PythonOptions.class}) + public abstract static class BuiltinMethodCachedCallNode extends PNodeWithContext { + + public abstract Object execute(VirtualFrame frame, Node inliningTarget, PBuiltinMethod callee, Object[] arguments, PKeyword[] keywords); + + @Specialization(guards = {"isSingleContext()", "callee == cachedCallee"}, limit = "getCallSiteInlineCacheMaxDepth()") + static Object callBuiltinMethodCached(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") PBuiltinMethod callee, Object[] arguments, PKeyword[] keywords, + @Cached(value = "callee", weak = true) PBuiltinMethod cachedCallee, + @Bind("cachedCallee.getBuiltinFunction()") PBuiltinFunction function, + @Cached CreateArgumentsNode createArgs, + @Cached("createDirectCallNodeFor(function)") DirectCallNode callNode, + @Cached SimpleDirectInvokeNode invoke) { + Object[] pArguments = createArgs.execute(inliningTarget, cachedCallee, arguments, keywords, function.getSignature(), callee.getSelf(), callee.getClassObject(), + function.getDefaults(), function.getKwDefaults(), isMethodcall(callee)); + return invoke.execute(frame, inliningTarget, callNode, pArguments); + } + + @Specialization(guards = "sameCallTarget(function.getCallTarget(), callNode)", limit = "getCallSiteInlineCacheMaxDepth()", replaces = "callBuiltinMethodCached") + static Object callBuiltinMethodCachedCt(VirtualFrame frame, Node inliningTarget, PBuiltinMethod callee, Object[] arguments, PKeyword[] keywords, + @Bind("callee.getBuiltinFunction()") PBuiltinFunction function, + @Cached CreateArgumentsNode createArgs, + @Cached("createDirectCallNodeFor(function)") DirectCallNode callNode, + @Cached SimpleDirectInvokeNode invoke) { + Signature signature; + /* + * The signature is PE-constant for a given callTarget, but getting it from there needs + * multiple virtual calls in the interpreter. + */ + if (CompilerDirectives.inCompiledCode()) { + signature = Signature.fromCallTarget((RootCallTarget) callNode.getCallTarget()); + } else { + signature = function.getSignature(); + } + Object[] pArguments = createArgs.execute(inliningTarget, callee, arguments, keywords, signature, callee.getSelf(), callee.getClassObject(), + function.getDefaults(), function.getKwDefaults(), isMethodcall(callee)); + return invoke.execute(frame, inliningTarget, callNode, pArguments); + } + + @Specialization(replaces = {"callBuiltinMethodCached", "callBuiltinMethodCachedCt"}) + @Megamorphic + @InliningCutoff + static Object callBuiltinMethodMegamorphic(VirtualFrame frame, Node inliningTarget, PBuiltinMethod callee, Object[] arguments, PKeyword[] keywords, + @Cached CreateArgumentsNode createArgs, + @Cached SimpleIndirectInvokeNode invoke) { + PBuiltinFunction function = callee.getBuiltinFunction(); + Object[] pArguments = createArgs.execute(inliningTarget, callee, arguments, keywords, function.getSignature(), callee.getSelf(), callee.getClassObject(), + function.getDefaults(), function.getKwDefaults(), isMethodcall(callee)); + return invoke.execute(frame, inliningTarget, function.getCallTarget(), pArguments); + } + + private static boolean isMethodcall(PBuiltinMethod callee) { + return !(callee.getSelf() instanceof PythonModule); + } + } + + /** + * Node for invoking python functions when the call target of the function is PE constant (the + * function itself doesn't have to be). Use {@link #createDirectCallNodeFor(PFunction)} to + * create the call node. Takes PArguments + */ + @GenerateInline + @GenerateCached(false) + public abstract static class FunctionDirectInvokeNode extends Node { + + public abstract Object execute(VirtualFrame frame, Node inliningTarget, DirectCallNode callNode, PFunction callee, Object[] arguments); + + @Specialization + static Object doDirect(VirtualFrame frame, Node inliningTarget, DirectCallNode callNode, PFunction callee, Object[] arguments, + @Cached SimpleDirectInvokeNode invoke) { + assert callee.getCallTarget() == callNode.getCallTarget(); + PArguments.setGlobals(arguments, callee.getGlobals()); + PArguments.setClosure(arguments, callee.getClosure()); + RootCallTarget callTarget = (RootCallTarget) callNode.getCurrentCallTarget(); + if (isGeneratorFunction(callTarget)) { + PArguments.setGeneratorFunction(arguments, callee); + } + return invoke.execute(frame, inliningTarget, callNode, arguments); + } + } + + /** + * Node for invoking python functions when the call target is dynamic. Takes PArguments + */ + @GenerateInline + @GenerateCached(false) + @GenerateUncached + public abstract static class FunctionIndirectInvokeNode extends Node { + + public abstract Object execute(Frame frame, Node inliningTarget, PFunction callee, Object[] arguments); + + @Specialization + static Object doDirect(VirtualFrame frame, Node inliningTarget, PFunction callee, Object[] arguments, + @Cached SimpleIndirectInvokeNode invoke, + @Cached InlinedConditionProfile generatorProfile) { + PArguments.setGlobals(arguments, callee.getGlobals()); + PArguments.setClosure(arguments, callee.getClosure()); + RootCallTarget callTarget = callee.getCallTarget(); + if (generatorProfile.profile(inliningTarget, isGeneratorFunction(callTarget))) { + PArguments.setGeneratorFunction(arguments, callee); + } + return invoke.execute(frame, inliningTarget, callTarget, arguments); + } + } + + /** + * Node for invoking python functions with an inline cache on the function object and a + * secondary inline cache on the call target. Takes PArguments + */ + @GenerateInline + @GenerateCached(false) + @GenerateUncached + @ImportStatic({CallDispatchers.class, PythonOptions.class}) + public abstract static class FunctionCachedInvokeNode extends PNodeWithContext { + public abstract Object execute(VirtualFrame frame, Node inliningTarget, PFunction callee, Object[] arguments); + + // We only have a single context and this function never changed its code + @Specialization(guards = {"isSingleContext()", "callee == cachedCallee"}, limit = "getCallSiteInlineCacheMaxDepth()", assumptions = "cachedCallee.getCodeStableAssumption()") + static Object callFunctionCached(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") PFunction callee, Object[] arguments, + @SuppressWarnings("unused") @Cached(value = "callee", weak = true) PFunction cachedCallee, + @Cached("createDirectCallNodeFor(callee)") DirectCallNode callNode, + @Cached FunctionDirectInvokeNode invoke) { + return invoke.execute(frame, inliningTarget, callNode, cachedCallee, arguments); + } + + // We have multiple contexts, don't cache the objects so that contexts can be cleaned up + @Specialization(guards = {"sameCallTarget(callee.getCallTarget(), callNode)"}, limit = "getCallSiteInlineCacheMaxDepth()", replaces = "callFunctionCached") + static Object callFunctionCachedCt(VirtualFrame frame, Node inliningTarget, PFunction callee, Object[] arguments, + @Cached("createDirectCallNodeFor(callee)") DirectCallNode callNode, + @Cached FunctionDirectInvokeNode invoke) { + return invoke.execute(frame, inliningTarget, callNode, callee, arguments); + } + + @Specialization(replaces = {"callFunctionCached", "callFunctionCachedCt"}) + @Megamorphic + @InliningCutoff + static Object callFunctionMegamorphic(VirtualFrame frame, Node inliningTarget, PFunction callee, Object[] arguments, + @Cached FunctionIndirectInvokeNode invoke) { + return invoke.execute(frame, inliningTarget, callee, arguments); + } + } + + /** + * Node for calling python functions with an inline cache on the function object and a secondary + * inline cache on the call target. Takes PArguments + */ + @GenerateInline + @GenerateCached(false) + @GenerateUncached + @ImportStatic({CallDispatchers.class, PythonOptions.class}) + public abstract static class FunctionCachedCallNode extends PNodeWithContext { + public abstract Object execute(VirtualFrame frame, Node inliningTarget, PFunction callee, Object[] arguments, PKeyword[] keywords); + + // We only have a single context and this function never changed its code + @Specialization(guards = {"isSingleContext()", "callee == cachedCallee"}, limit = "getCallSiteInlineCacheMaxDepth()", assumptions = "cachedCallee.getCodeStableAssumption()") + static Object callFunctionCached(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") PFunction callee, Object[] arguments, PKeyword[] keywords, + @SuppressWarnings("unused") @Cached(value = "callee", weak = true) PFunction cachedCallee, + @Cached CreateArgumentsNode createArgs, + @Cached("createDirectCallNodeFor(callee)") DirectCallNode callNode, + @Cached FunctionDirectInvokeNode invoke) { + Object[] pArguments = createArgs.execute(inliningTarget, cachedCallee, arguments, keywords, cachedCallee.getCode().getSignature(), null, null, + cachedCallee.getDefaults(), cachedCallee.getKwDefaults(), false); + return invoke.execute(frame, inliningTarget, callNode, cachedCallee, pArguments); + } + + // We have multiple contexts, don't cache the objects so that contexts can be cleaned up + @Specialization(guards = {"sameCallTarget(callee.getCallTarget(), callNode)"}, limit = "getCallSiteInlineCacheMaxDepth()", replaces = "callFunctionCached") + static Object callFunctionCachedCt(VirtualFrame frame, Node inliningTarget, PFunction callee, Object[] arguments, PKeyword[] keywords, + @Cached CreateArgumentsNode createArgs, + @Cached("createDirectCallNodeFor(callee)") DirectCallNode callNode, + @Cached FunctionDirectInvokeNode invoke) { + Signature signature; + /* + * The signature is PE-constant for a given callTarget, but getting it from there needs + * multiple virtual calls in the interpreter. + */ + if (CompilerDirectives.inCompiledCode()) { + signature = Signature.fromCallTarget((RootCallTarget) callNode.getCallTarget()); + } else { + signature = callee.getCode().getSignature(); + } + Object[] pArguments = createArgs.execute(inliningTarget, callee, arguments, keywords, signature, null, null, + callee.getDefaults(), callee.getKwDefaults(), false); + return invoke.execute(frame, inliningTarget, callNode, callee, pArguments); + } + + @Specialization(replaces = {"callFunctionCached", "callFunctionCachedCt"}) + @Megamorphic + @InliningCutoff + static Object callFunctionMegamorphic(VirtualFrame frame, Node inliningTarget, PFunction callee, Object[] arguments, PKeyword[] keywords, + @Cached CreateArgumentsNode createArgs, + @Cached FunctionIndirectInvokeNode invoke) { + Object[] pArguments = createArgs.execute(inliningTarget, callee, arguments, keywords, callee.getCode().getSignature(), null, null, + callee.getDefaults(), callee.getKwDefaults(), false); + return invoke.execute(frame, inliningTarget, callee, pArguments); + } + } + + /** + * Node for invoking a call target with an inline cache. Takes PArguments + */ + @GenerateInline + @GenerateCached(false) + @GenerateUncached + @ImportStatic({CallDispatchers.class, PythonOptions.class}) + public abstract static class CallTargetCachedInvokeNode extends Node { + + public abstract Object execute(VirtualFrame frame, Node inliningTarget, RootCallTarget callTarget, Object[] pythonArguments); + + @Specialization(guards = "sameCallTarget(callTarget, callNode)", limit = "getCallSiteInlineCacheMaxDepth()") + static Object doCallTargetDirect(VirtualFrame frame, Node inliningTarget, @SuppressWarnings("unused") RootCallTarget callTarget, Object[] args, + @Cached(parameters = "callTarget") DirectCallNode callNode, + @Cached SimpleDirectInvokeNode invoke) { + return invoke.execute(frame, inliningTarget, callNode, args); + } + + @Specialization(replaces = "doCallTargetDirect") + static Object doCallTargetIndirect(VirtualFrame frame, Node inliningTarget, RootCallTarget callTarget, Object[] args, + @Cached SimpleIndirectInvokeNode invoke) { + return invoke.execute(frame, inliningTarget, callTarget, args); + } + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/CallNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/CallNode.java index 05bd298067..b7b8793a4d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/CallNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/CallNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,24 +42,20 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; import com.oracle.graal.python.builtins.objects.function.PFunction; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; -import com.oracle.graal.python.builtins.objects.method.PMethod; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlotVarargs.CallSlotTpCallNode; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.nodes.argument.CreateArgumentsNode; -import com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupSpecialMethodSlotNode; import com.oracle.graal.python.nodes.interop.PForeignToPTypeNode; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.truffle.PythonTypes; import com.oracle.graal.python.runtime.GilNode; import com.oracle.graal.python.runtime.exception.PythonErrorType; import com.oracle.graal.python.util.PythonUtils; @@ -67,15 +63,13 @@ import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; +import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.ReportPolymorphism.Megamorphic; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.interop.ArityException; @@ -87,7 +81,6 @@ import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.InlinedBranchProfile; -@TypeSystemReference(PythonTypes.class) @ImportStatic({PGuards.class, SpecialMethodNames.class}) @GenerateUncached @SuppressWarnings("truffle-inlining") // footprint reduction 60 -> 44 @@ -138,63 +131,29 @@ public final Object execute(Frame frame, Object callableObject, Object... argume } @Specialization - protected static Object boundDescriptor(VirtualFrame frame, BoundDescriptor descriptor, Object[] arguments, PKeyword[] keywords, + static Object boundDescriptor(VirtualFrame frame, BoundDescriptor descriptor, Object[] arguments, PKeyword[] keywords, @Cached CallNode subNode) { return subNode.executeInternal(frame, descriptor.descriptor, PythonUtils.arrayCopyOfRange(arguments, 1, arguments.length), keywords); } @Specialization - protected static Object functionCall(VirtualFrame frame, PFunction callable, Object[] arguments, PKeyword[] keywords, - @Shared("dispatchNode") @Cached CallDispatchNode dispatch, - @Shared("argsNode") @Cached CreateArgumentsNode createArgs) { - return dispatch.executeCall(frame, callable, createArgs.execute(callable, arguments, keywords)); + static Object functionCall(VirtualFrame frame, PFunction callable, Object[] arguments, PKeyword[] keywords, + @Bind Node inliningTarget, + @Cached CallDispatchers.FunctionCachedCallNode callNode) { + return callNode.execute(frame, inliningTarget, callable, arguments, keywords); } @Specialization - protected static Object builtinFunctionCall(VirtualFrame frame, PBuiltinFunction callable, Object[] arguments, PKeyword[] keywords, - @Shared("dispatchNode") @Cached CallDispatchNode dispatch, - @Shared("argsNode") @Cached CreateArgumentsNode createArgs) { - return dispatch.executeCall(frame, callable, createArgs.execute(callable, arguments, keywords)); - } - - @Specialization - protected static Object doType(VirtualFrame frame, PythonBuiltinClassType callableObject, Object[] arguments, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Shared("raise") @Cached PRaiseNode raise, - @Shared("getClassNode") @Cached GetClassNode getClassNode, - @Shared("lookupCall") @Cached(parameters = "Call") LookupSpecialMethodSlotNode lookupCall, - @Shared("callCall") @Cached CallVarargsMethodNode callCallNode) { - Object call = lookupCall.execute(frame, getClassNode.execute(inliningTarget, callableObject), callableObject); - return callCall(frame, callableObject, arguments, keywords, raise, callCallNode, call); - } - - @Specialization(guards = "isPythonClass(callableObject)", replaces = "doType") - protected static Object doPythonClass(VirtualFrame frame, Object callableObject, Object[] arguments, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Shared("raise") @Cached PRaiseNode raise, - @Shared("getClassNode") @Cached GetClassNode getClassNode, - @Shared("lookupCall") @Cached(parameters = "Call") LookupSpecialMethodSlotNode lookupCall, - @Shared("callCall") @Cached CallVarargsMethodNode callCallNode) { - Object call = lookupCall.execute(frame, getClassNode.execute(inliningTarget, callableObject), callableObject); - return callCall(frame, callableObject, arguments, keywords, raise, callCallNode, call); - } - - @Specialization(guards = {"!isCallable(callableObject)", "!isForeignMethod(callableObject)"}, replaces = {"doType", "doPythonClass"}) - protected static Object doObjectAndType(VirtualFrame frame, Object callableObject, Object[] arguments, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Shared("raise") @Cached PRaiseNode raise, - @Shared("getClassNode") @Cached GetClassNode getClassNode, - @Shared("lookupCall") @Cached(parameters = "Call") LookupSpecialMethodSlotNode lookupCall, - @Shared("callCall") @Cached CallVarargsMethodNode callCallNode) { - Object call = lookupCall.execute(frame, getClassNode.execute(inliningTarget, callableObject), callableObject); - return callCall(frame, callableObject, arguments, keywords, raise, callCallNode, call); + static Object builtinFunctionCall(VirtualFrame frame, PBuiltinFunction callable, Object[] arguments, PKeyword[] keywords, + @Bind Node inliningTarget, + @Cached CallDispatchers.BuiltinFunctionCachedCallNode callNode) { + return callNode.execute(frame, inliningTarget, callable, arguments, keywords); } @Specialization @InliningCutoff protected static Object doForeignMethod(ForeignMethod callable, Object[] arguments, PKeyword[] keywords, @Bind("this") Node inliningTarget, - @Shared("raise") @Cached PRaiseNode raise, @Cached PForeignToPTypeNode fromForeign, @Cached InlinedBranchProfile keywordsError, @Cached InlinedBranchProfile typeError, @@ -202,14 +161,14 @@ protected static Object doForeignMethod(ForeignMethod callable, Object[] argumen @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop) { if (keywords.length != 0) { keywordsError.enter(inliningTarget); - throw raise.raise(PythonErrorType.TypeError, ErrorMessages.INVALID_INSTANTIATION_OF_FOREIGN_OBJ); + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.TypeError, ErrorMessages.INVALID_INSTANTIATION_OF_FOREIGN_OBJ); } gil.release(true); try { return fromForeign.executeConvert(interop.invokeMember(callable.receiver, callable.methodName, arguments)); } catch (ArityException | UnsupportedTypeException | UnsupportedMessageException e) { typeError.enter(inliningTarget); - throw raise.raise(TypeError, e); + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, e); } catch (UnknownIdentifierException e) { // PyObjectGetMethod is supposed to have checked isMemberInvocable throw CompilerDirectives.shouldNotReachHere("Cannot invoke member"); @@ -218,104 +177,26 @@ protected static Object doForeignMethod(ForeignMethod callable, Object[] argumen } } - private static Object callCall(VirtualFrame frame, Object callableObject, Object[] arguments, PKeyword[] keywords, PRaiseNode raise, CallVarargsMethodNode callCallNode, Object call) { - if (call == PNone.NO_VALUE) { - throw raise.raise(TypeError, ErrorMessages.OBJ_ISNT_CALLABLE, callableObject); - } - return callCallNode.execute(frame, call, PythonUtils.prependArgument(callableObject, arguments), keywords); - } - - @Specialization(guards = "isPBuiltinFunction(callable.getFunction())") - protected static Object methodCallBuiltinDirect(VirtualFrame frame, PMethod callable, Object[] arguments, PKeyword[] keywords, - @Shared("dispatchNode") @Cached CallDispatchNode dispatch, - @Shared("argsNode") @Cached CreateArgumentsNode createArgs) { - // functions must be called directly otherwise the call stack is incorrect - return dispatch.executeCall(frame, (PBuiltinFunction) callable.getFunction(), createArgs.execute(callable, arguments, keywords)); - } - - @Specialization(guards = "isPFunction(callable.getFunction())", replaces = "methodCallBuiltinDirect") - protected static Object methodCallDirect(VirtualFrame frame, PMethod callable, Object[] arguments, PKeyword[] keywords, - @Shared("dispatchNode") @Cached CallDispatchNode dispatch, - @Shared("argsNode") @Cached CreateArgumentsNode createArgs) { - // functions must be called directly otherwise the call stack is incorrect - return dispatch.executeCall(frame, (PFunction) callable.getFunction(), createArgs.execute(callable, arguments, keywords)); - } - - @Specialization(limit = "1", guards = {"isSingleContext()", "callable == cachedCallable", "isPBuiltinFunction(cachedCallable.getFunction())"}) - protected static Object builtinMethodCallBuiltinDirectCached(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinMethod callable, Object[] arguments, PKeyword[] keywords, - @Cached(value = "callable", weak = true) PBuiltinMethod cachedCallable, - @Shared("dispatchNode") @Cached CallDispatchNode dispatch, - @Shared("argsNode") @Cached CreateArgumentsNode createArgs) { - // functions must be called directly otherwise the call stack is incorrect - return dispatch.executeCall(frame, cachedCallable.getBuiltinFunction(), createArgs.execute(cachedCallable, arguments, keywords)); - } - - @Specialization(guards = "isPBuiltinFunction(callable.getFunction())", replaces = "builtinMethodCallBuiltinDirectCached") - protected static Object builtinMethodCallBuiltinDirect(VirtualFrame frame, PBuiltinMethod callable, Object[] arguments, PKeyword[] keywords, - @Shared("dispatchNode") @Cached CallDispatchNode dispatch, - @Shared("argsNode") @Cached CreateArgumentsNode createArgs) { - // functions must be called directly otherwise the call stack is incorrect - return dispatch.executeCall(frame, callable.getBuiltinFunction(), createArgs.execute(callable, arguments, keywords)); - } - - @Specialization(guards = "!isFunction(callable.getFunction())") - protected static Object methodCall(VirtualFrame frame, PMethod callable, Object[] arguments, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Shared("raise") @Cached PRaiseNode raise, - @Shared("getClassNode") @Cached GetClassNode getClassNode, - @Shared("lookupCall") @Cached(parameters = "Call") LookupSpecialMethodSlotNode lookupCall, - @Shared("callCall") @Cached CallVarargsMethodNode callCallNode) { - return doObjectAndType(frame, callable, arguments, keywords, inliningTarget, raise, getClassNode, lookupCall, callCallNode); + @Specialization + static Object builtinMethodCall(VirtualFrame frame, PBuiltinMethod callable, Object[] arguments, PKeyword[] keywords, + @Bind Node inliningTarget, + @Cached CallDispatchers.BuiltinMethodCachedCallNode callNode) { + return callNode.execute(frame, inliningTarget, callable, arguments, keywords); } - @Specialization(guards = "!isFunction(callable.getFunction())") - protected static Object builtinMethodCall(VirtualFrame frame, PBuiltinMethod callable, Object[] arguments, PKeyword[] keywords, + @Fallback + static Object doGeneric(VirtualFrame frame, Object callableObject, Object[] arguments, PKeyword[] keywords, @Bind("this") Node inliningTarget, - @Shared("raise") @Cached PRaiseNode raise, - @Shared("getClassNode") @Cached GetClassNode getClassNode, - @Shared("lookupCall") @Cached(parameters = "Call") LookupSpecialMethodSlotNode lookupCall, - @Shared("callVarargs") @Cached CallVarargsMethodNode callCallNode) { - return doObjectAndType(frame, callable, arguments, keywords, inliningTarget, raise, getClassNode, lookupCall, callCallNode); - } - - @Specialization(replaces = {"doObjectAndType", "methodCallBuiltinDirect", "methodCallDirect", "builtinMethodCallBuiltinDirectCached", - "builtinMethodCallBuiltinDirect", "methodCall", "builtinMethodCall", "functionCall", "builtinFunctionCall"}, guards = "!isForeignMethod(callableObject)") - @Megamorphic - @InliningCutoff - protected static Object doGeneric(VirtualFrame frame, Object callableObject, Object[] arguments, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Shared("dispatchNode") @Cached CallDispatchNode dispatch, - @Shared("argsNode") @Cached CreateArgumentsNode createArgs, - @Shared("raise") @Cached PRaiseNode raise, - @Shared("getClassNode") @Cached GetClassNode getClassNode, - @Shared("lookupCall") @Cached(parameters = "Call") LookupSpecialMethodSlotNode lookupCall, - @Shared("callVarargs") @Cached CallVarargsMethodNode callCallNode) { - if (callableObject instanceof PFunction) { - return functionCall(frame, (PFunction) callableObject, arguments, keywords, dispatch, createArgs); - } else if (callableObject instanceof PBuiltinFunction) { - return builtinFunctionCall(frame, (PBuiltinFunction) callableObject, arguments, keywords, dispatch, createArgs); - } else if (callableObject instanceof PMethod) { - PMethod method = (PMethod) callableObject; - Object func = method.getFunction(); - if (func instanceof PFunction) { - return methodCallDirect(frame, method, arguments, keywords, dispatch, createArgs); - } else if (func instanceof PBuiltinFunction) { - return methodCallBuiltinDirect(frame, method, arguments, keywords, dispatch, createArgs); - } - } else if (callableObject instanceof PBuiltinMethod) { - PBuiltinMethod method = (PBuiltinMethod) callableObject; - return builtinMethodCallBuiltinDirect(frame, method, arguments, keywords, dispatch, createArgs); - } else if (callableObject instanceof BoundDescriptor) { - return doGeneric(frame, ((BoundDescriptor) callableObject).descriptor, - PythonUtils.arrayCopyOfRange(arguments, 1, arguments.length), keywords, - inliningTarget, dispatch, createArgs, raise, getClassNode, lookupCall, callCallNode); + @Cached PRaiseNode raise, + @Cached GetClassNode getClassNode, + @Cached GetCachedTpSlotsNode getSlots, + @Cached CallSlotTpCallNode callSlot) { + Object type = getClassNode.execute(inliningTarget, callableObject); + TpSlots slots = getSlots.execute(inliningTarget, type); + if (slots.tp_call() != null) { + return callSlot.execute(frame, inliningTarget, slots.tp_call(), callableObject, arguments, keywords); } - Object callableType = getClassNode.execute(inliningTarget, callableObject); - return callCall(frame, callableObject, arguments, keywords, raise, callCallNode, lookupCall.execute(frame, callableType, callableObject)); - } - - protected static boolean isForeignMethod(Object object) { - return object instanceof ForeignMethod; + throw raise.raise(inliningTarget, TypeError, ErrorMessages.OBJ_ISNT_CALLABLE, callableObject); } @GenerateInline diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/CallTargetInvokeNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/CallTargetInvokeNode.java deleted file mode 100644 index 09f6fa348b..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/CallTargetInvokeNode.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.call; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.objects.cell.PCell; -import com.oracle.graal.python.builtins.objects.function.PArguments; -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.function.PFunction; -import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.graal.python.nodes.bytecode.PBytecodeGeneratorFunctionRootNode; -import com.oracle.graal.python.runtime.ExecutionContext.CallContext; -import com.oracle.graal.python.runtime.ExecutionContext.IndirectCalleeContext; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.PythonContext.PythonThreadState; -import com.oracle.truffle.api.CallTarget; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.RootCallTarget; -import com.oracle.truffle.api.Truffle; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.DirectCallNode; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.nodes.RootNode; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; - -public abstract class CallTargetInvokeNode extends DirectInvokeNode { - @Child private DirectCallNode callNode; - @Child private CallContext callContext; - protected final boolean isBuiltin; - - protected CallTargetInvokeNode(CallTarget callTarget, boolean isBuiltin, boolean isGenerator) { - this.callNode = Truffle.getRuntime().createDirectCallNode(callTarget); - if (isBuiltin) { - callNode.cloneCallTarget(); - } - if (isGenerator && shouldInlineGenerators()) { - this.callNode.forceInlining(); - } - this.callContext = CallContext.create(); - this.isBuiltin = isBuiltin; - } - - @TruffleBoundary - public static CallTargetInvokeNode create(PFunction callee) { - RootCallTarget callTarget = getCallTarget(callee); - boolean builtin = isBuiltin(callee); - boolean isGenerator = callTarget.getRootNode() instanceof PBytecodeGeneratorFunctionRootNode; - return CallTargetInvokeNodeGen.create(callTarget, builtin, isGenerator); - } - - @TruffleBoundary - public static CallTargetInvokeNode create(PBuiltinFunction callee) { - RootCallTarget callTarget = getCallTarget(callee); - boolean builtin = isBuiltin(callee); - return CallTargetInvokeNodeGen.create(callTarget, builtin, false); - } - - public static CallTargetInvokeNode create(CallTarget callTarget, boolean isBuiltin, boolean isGenerator) { - return CallTargetInvokeNodeGen.create(callTarget, isBuiltin, isGenerator); - } - - /** - * @param callee A PFunction if the callee is one, otherwise null. Used for generator functions - * only. - */ - public abstract Object execute(VirtualFrame frame, PFunction callee, PythonObject globals, PCell[] closure, Object[] arguments); - - @Specialization(guards = {"globals == null", "closure == null"}) - protected Object doNoClosure(VirtualFrame frame, PFunction callee, @SuppressWarnings("unused") PythonObject globals, @SuppressWarnings("unused") PCell[] closure, Object[] arguments, - @Bind("this") Node inliningTarget, - @Shared @Cached InlinedConditionProfile generatorFunctionProfile) { - RootCallTarget ct = (RootCallTarget) callNode.getCurrentCallTarget(); - optionallySetGeneratorFunction(inliningTarget, arguments, ct, generatorFunctionProfile, callee); - // If the frame is 'null', we expect the execution state (i.e. caller info and exception - // state) in the context. There are two common reasons for having a 'null' frame: - // 1. This node is the first invoke node used via interop. - // 2. This invoke node is (indirectly) used behind a TruffleBoundary. - // This is preferably prepared using 'IndirectCallContext.enter'. - if (profileIsNullFrame(frame == null)) { - PythonThreadState threadState = PythonContext.get(this).getThreadState(PythonLanguage.get(this)); - Object state = IndirectCalleeContext.enter(threadState, arguments, ct); - try { - return callNode.call(arguments); - } finally { - IndirectCalleeContext.exit(threadState, state); - } - } else { - callContext.prepareCall(frame, arguments, ct, this); - return callNode.call(arguments); - } - } - - @Specialization(replaces = "doNoClosure") - protected Object doGeneric(VirtualFrame frame, PFunction callee, PythonObject globals, PCell[] closure, Object[] arguments, - @Bind("this") Node inliningTarget, - @Shared @Cached InlinedConditionProfile generatorFunctionProfile) { - PArguments.setGlobals(arguments, globals); - PArguments.setClosure(arguments, closure); - return doNoClosure(frame, callee, null, null, arguments, inliningTarget, generatorFunctionProfile); - } - - public final CallTarget getCallTarget() { - return callNode.getCallTarget(); - } - - public final RootNode getCurrentRootNode() { - return callNode.getCurrentRootNode(); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/FunctionInvokeNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/FunctionInvokeNode.java deleted file mode 100644 index fae8ba6810..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/FunctionInvokeNode.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.call; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.objects.cell.PCell; -import com.oracle.graal.python.builtins.objects.function.PArguments; -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.function.PFunction; -import com.oracle.graal.python.builtins.objects.object.PythonObject; -import com.oracle.graal.python.nodes.bytecode.PBytecodeGeneratorFunctionRootNode; -import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode; -import com.oracle.graal.python.runtime.ExecutionContext.CallContext; -import com.oracle.graal.python.runtime.ExecutionContext.IndirectCalleeContext; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.PythonContext.PythonThreadState; -import com.oracle.truffle.api.CallTarget; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.RootCallTarget; -import com.oracle.truffle.api.Truffle; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.DirectCallNode; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.nodes.RootNode; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; - -public abstract class FunctionInvokeNode extends DirectInvokeNode { - @Child private DirectCallNode callNode; - @Child private CallContext callContext; - - // Needed only for generator functions, will be null for builtins - private final PFunction callee; - private final PythonObject globals; - private final PCell[] closure; - protected final boolean isBuiltin; - - protected FunctionInvokeNode(PFunction callee, CallTarget callTarget, PythonObject globals, PCell[] closure, boolean isBuiltin, boolean isGenerator, boolean split) { - this.callee = callee; - this.callNode = Truffle.getRuntime().createDirectCallNode(callTarget); - if (split) { - callNode.cloneCallTarget(); - } - if (isGenerator && shouldInlineGenerators()) { - this.callNode.forceInlining(); - } - this.globals = globals; - this.closure = closure; - this.isBuiltin = isBuiltin; - this.callContext = CallContext.create(); - } - - public abstract Object execute(VirtualFrame frame, Object[] arguments); - - @Specialization - protected Object doDirect(VirtualFrame frame, Object[] arguments, - @Bind("this") Node inliningTarget, - @Cached InlinedConditionProfile isGeneratorFunctionProfile) { - PArguments.setGlobals(arguments, globals); - PArguments.setClosure(arguments, closure); - RootCallTarget ct = (RootCallTarget) callNode.getCurrentCallTarget(); - optionallySetGeneratorFunction(inliningTarget, arguments, ct, isGeneratorFunctionProfile, callee); - if (profileIsNullFrame(frame == null)) { - PythonThreadState threadState = PythonContext.get(this).getThreadState(PythonLanguage.get(this)); - Object state = IndirectCalleeContext.enter(threadState, arguments, ct); - try { - return callNode.call(arguments); - } finally { - IndirectCalleeContext.exit(threadState, state); - } - } else { - callContext.prepareCall(frame, arguments, ct, this); - return callNode.call(arguments); - } - } - - public final RootNode getCurrentRootNode() { - return callNode.getCurrentRootNode(); - } - - @TruffleBoundary - public static FunctionInvokeNode create(PFunction callee) { - RootCallTarget callTarget = getCallTarget(callee); - return FunctionInvokeNodeGen.create(callee, callTarget, callee.getGlobals(), callee.getClosure(), false, callTarget.getRootNode() instanceof PBytecodeGeneratorFunctionRootNode, - callee.forceSplitDirectCalls()); - } - - @TruffleBoundary - public static FunctionInvokeNode create(PBuiltinFunction callee) { - RootCallTarget callTarget = getCallTarget(callee); - boolean split = forceSplitBuiltins() || (callee.getFunctionRootNode() instanceof BuiltinFunctionRootNode root && root.getBuiltin().forceSplitDirectCalls()); - return FunctionInvokeNodeGen.create(null, callTarget, null, null, true, false, split); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/GenericInvokeNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/GenericInvokeNode.java deleted file mode 100644 index 119c9d3e23..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/GenericInvokeNode.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.call; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.objects.function.PArguments; -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.function.PFunction; -import com.oracle.graal.python.runtime.ExecutionContext.CallContext; -import com.oracle.graal.python.runtime.ExecutionContext.IndirectCalleeContext; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.PythonContext.PythonThreadState; -import com.oracle.truffle.api.RootCallTarget; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.Frame; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.IndirectCallNode; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; - -@GenerateUncached -@SuppressWarnings("truffle-inlining") // footprint reduction 28 -> 10 -// Not inlined because it passes "this" to prepareIndirectCall() -public abstract class GenericInvokeNode extends InvokeNode { - - @NeverDefault - public static GenericInvokeNode create() { - return GenericInvokeNodeGen.create(); - } - - public static GenericInvokeNode getUncached() { - return GenericInvokeNodeGen.getUncached(); - } - - protected GenericInvokeNode() { - } - - /** - * To be used when this node is called adopted. - * - * @param frame - the current frame - * @param callee - either a {@link PFunction}, {@link PBuiltinFunction}, or - * {@link RootCallTarget}. - * @param arguments - the complete (runtime + user) frame arguments for the call - */ - public final Object execute(VirtualFrame frame, Object callee, Object[] arguments) { - return executeInternal(frame, callee, arguments); - } - - protected abstract Object executeInternal(Frame frame, Object callee, Object[] arguments); - - /** - * Can be used when this node is called unadopted or from a place where no frame is available. - * However, it will be slower than passing a frame, because the threadstate is read from the - * Python context. - * - * @param callee - either a {@link PFunction}, {@link PBuiltinFunction}, or - * {@link RootCallTarget}. - * @param arguments - the complete (runtime + user) frame arguments for the call - */ - public final Object execute(Object callee, Object[] arguments) { - return executeInternal(null, callee, arguments); - } - - private Object doCall(Frame frame, Node inliningTarget, PFunction callee, RootCallTarget callTarget, Object[] arguments, - PythonLanguage language, PythonContext context, - IndirectCallNode callNode, CallContext callContext, - InlinedConditionProfile isNullFrameProfile, InlinedConditionProfile isGeneratorFunctionProfile) { - optionallySetGeneratorFunction(inliningTarget, arguments, callTarget, isGeneratorFunctionProfile, callee); - if (isNullFrameProfile.profile(inliningTarget, frame == null)) { - PythonThreadState threadState = context.getThreadState(language); - Object state = IndirectCalleeContext.enterIndirect(threadState, arguments); - try { - return callNode.call(callTarget, arguments); - } finally { - IndirectCalleeContext.exit(threadState, state); - } - } else { - assert frame instanceof VirtualFrame : "GenericInvokeNode should not be executed with non-virtual frames"; - callContext.prepareIndirectCall((VirtualFrame) frame, arguments, this); - return callNode.call(callTarget, arguments); - } - } - - private Object doCallWithFrame(Frame frame, Node inlinlingTarget, PFunction callee, RootCallTarget callTarget, Object[] arguments, - IndirectCallNode callNode, CallContext callContext, InlinedConditionProfile isGeneratorFunctionProfile) { - optionallySetGeneratorFunction(inlinlingTarget, arguments, callTarget, isGeneratorFunctionProfile, callee); - assert frame instanceof VirtualFrame : "GenericInvokeNode should not be executed with non-virtual frames"; - callContext.prepareIndirectCall((VirtualFrame) frame, arguments, this); - return callNode.call(callTarget, arguments); - } - - @Specialization(guards = "frame != null") - Object invokeFunctionWithFrame(Frame frame, PFunction callee, Object[] arguments, - @Bind("this") Node inliningTarget, - @Shared("callNode") @Cached IndirectCallNode callNode, - @Shared("callContext") @Cached CallContext callContext, - @Shared("isGeneratorFunctionProfile") @Cached InlinedConditionProfile isGeneratorFunctionProfile) { - PArguments.setGlobals(arguments, callee.getGlobals()); - PArguments.setClosure(arguments, callee.getClosure()); - RootCallTarget callTarget = getCallTarget(callee); - return doCallWithFrame(frame, inliningTarget, callee, callTarget, arguments, callNode, callContext, isGeneratorFunctionProfile); - } - - @Specialization(guards = "frame != null") - Object invokeBuiltinWithFrame(Frame frame, PBuiltinFunction callee, Object[] arguments, - @Bind("this") Node inliningTarget, - @Shared("callNode") @Cached IndirectCallNode callNode, - @Shared("callContext") @Cached CallContext callContext, - @Shared("isGeneratorFunctionProfile") @Cached InlinedConditionProfile isGeneratorFunctionProfile) { - RootCallTarget callTarget = getCallTarget(callee); - return doCallWithFrame(frame, inliningTarget, null, callTarget, arguments, callNode, callContext, isGeneratorFunctionProfile); - } - - @Specialization(guards = "frame != null") - Object invokeCallTargetWithFrame(Frame frame, RootCallTarget callTarget, Object[] arguments, - @Bind("this") Node inliningTarget, - @Shared("callNode") @Cached IndirectCallNode callNode, - @Shared("callContext") @Cached CallContext callContext, - @Shared("isGeneratorFunctionProfile") @Cached InlinedConditionProfile isGeneratorFunctionProfile) { - return doCallWithFrame(frame, inliningTarget, null, callTarget, arguments, callNode, callContext, isGeneratorFunctionProfile); - } - - @Specialization(replaces = "invokeFunctionWithFrame") - Object invokeFunction(Frame frame, PFunction callee, Object[] arguments, - @Bind("this") Node inliningTarget, - @Shared("callNode") @Cached IndirectCallNode callNode, - @Shared("callContext") @Cached CallContext callContext, - @Shared("isNullFrameProfile") @Cached InlinedConditionProfile isNullFrameProfile, - @Shared("isGeneratorFunctionProfile") @Cached InlinedConditionProfile isGeneratorFunctionProfile) { - PArguments.setGlobals(arguments, callee.getGlobals()); - PArguments.setClosure(arguments, callee.getClosure()); - RootCallTarget callTarget = getCallTarget(callee); - return doCall(frame, inliningTarget, callee, callTarget, arguments, PythonLanguage.get(this), PythonContext.get(this), callNode, callContext, isNullFrameProfile, isGeneratorFunctionProfile); - } - - @Specialization(replaces = "invokeBuiltinWithFrame") - Object invokeBuiltin(Frame frame, PBuiltinFunction callee, Object[] arguments, - @Bind("this") Node inliningTarget, - @Shared("callNode") @Cached IndirectCallNode callNode, - @Shared("callContext") @Cached CallContext callContext, - @Shared("isNullFrameProfile") @Cached InlinedConditionProfile isNullFrameProfile, - @Shared("isGeneratorFunctionProfile") @Cached InlinedConditionProfile isGeneratorFunctionProfile) { - RootCallTarget callTarget = getCallTarget(callee); - return doCall(frame, inliningTarget, null, callTarget, arguments, PythonLanguage.get(this), PythonContext.get(this), callNode, callContext, isNullFrameProfile, isGeneratorFunctionProfile); - } - - @Specialization(replaces = "invokeCallTargetWithFrame") - Object invokeCallTarget(Frame frame, RootCallTarget callTarget, Object[] arguments, - @Bind("this") Node inliningTarget, - @Shared("callNode") @Cached IndirectCallNode callNode, - @Shared("callContext") @Cached CallContext callContext, - @Shared("isNullFrameProfile") @Cached InlinedConditionProfile isNullFrameProfile, - @Shared("isGeneratorFunctionProfile") @Cached InlinedConditionProfile isGeneratorFunctionProfile) { - return doCall(frame, inliningTarget, null, callTarget, arguments, PythonLanguage.get(this), PythonContext.get(this), callNode, callContext, isNullFrameProfile, isGeneratorFunctionProfile); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/InvokeNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/InvokeNode.java deleted file mode 100644 index 68fbf82cfe..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/InvokeNode.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. - * Copyright (c) 2014, Regents of the University of California - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.oracle.graal.python.nodes.call; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.objects.function.PArguments; -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.function.PFunction; -import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; -import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetCallTargetNode; -import com.oracle.graal.python.nodes.bytecode.PBytecodeGeneratorFunctionRootNode; -import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.truffle.api.CallTarget; -import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.RootCallTarget; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.nodes.RootNode; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; - -public abstract class InvokeNode extends Node { - protected static boolean shouldInlineGenerators() { - CompilerAsserts.neverPartOfCompilation(); - return PythonLanguage.get(null).getEngineOption(PythonOptions.ForceInlineGeneratorCalls); - } - - protected static boolean forceSplitBuiltins() { - CompilerAsserts.neverPartOfCompilation(); - return PythonLanguage.get(null).getEngineOption(PythonOptions.EnableForcedSplits); - } - - @TruffleBoundary - protected static RootCallTarget getCallTarget(Object callee) { - Object actualCallee = callee; - RootCallTarget callTarget = GetCallTargetNode.getUncached().execute(actualCallee); - if (callTarget == null) { - throw CompilerDirectives.shouldNotReachHere("Unsupported callee type " + actualCallee); - } - return callTarget; - } - - protected static void optionallySetGeneratorFunction(Node inliningTarget, Object[] arguments, CallTarget callTarget, InlinedConditionProfile isGeneratorFunctionProfile, PFunction callee) { - RootNode rootNode = ((RootCallTarget) callTarget).getRootNode(); - if (isGeneratorFunctionProfile.profile(inliningTarget, rootNode instanceof PBytecodeGeneratorFunctionRootNode)) { - assert callee != null : "generator function callee not passed to invoke node"; - PArguments.setGeneratorFunction(arguments, callee); - } - } - - protected static boolean isBuiltin(Object callee) { - return callee instanceof PBuiltinFunction || callee instanceof PBuiltinMethod; - } - - public static Object invokeUncached(PBuiltinFunction callee, Object[] arguments) { - return GenericInvokeNode.getUncached().execute(callee, arguments); - } - - public static Object invokeUncached(RootCallTarget ct, Object[] arguments) { - return GenericInvokeNode.getUncached().execute(ct, arguments); - } -} - -abstract class DirectInvokeNode extends InvokeNode { - - @CompilationFinal private int state = 0; - - protected boolean profileIsNullFrame(boolean isNullFrame) { - if (state == 0) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - if (isNullFrame) { - state = 0x1; - } else { - state = 0x2; - } - } - - if (state == 0x1) { - if (!isNullFrame) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("Invoke node was initialized for a null frame. Cannot use it with non-null frame now."); - } - return true; - } - assert state == 0x2; - if (isNullFrame) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new IllegalStateException("Invoke node was initialized for a non-null frame. Cannot use it with null frame now."); - } - return false; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/AbstractCallMethodNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/AbstractCallMethodNode.java index 26e15e4b76..7515225fce 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/AbstractCallMethodNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/AbstractCallMethodNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,24 +40,16 @@ */ package com.oracle.graal.python.nodes.call.special; -import static com.oracle.graal.python.nodes.ErrorMessages.EXPECTED_D_ARGS; - import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.Slot.SlotSignature; import com.oracle.graal.python.builtins.Builtin; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.BinaryBuiltinDescriptor; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.TernaryBuiltinDescriptor; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.UnaryBuiltinDescriptor; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; import com.oracle.graal.python.builtins.objects.method.PMethod; import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltin; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.PRootNode; import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetCallTargetNode; import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode; @@ -66,23 +58,18 @@ import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; -import com.oracle.graal.python.nodes.truffle.PythonTypes; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.util.PythonUtils.NodeCounterWithLimit; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NodeFactory; import com.oracle.truffle.api.dsl.NodeField; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.RootNode; -@TypeSystemReference(PythonTypes.class) @ImportStatic({PythonOptions.class, PGuards.class}) @NodeField(name = "maxSizeExceeded", type = boolean.class) abstract class AbstractCallMethodNode extends PNodeWithContext { @@ -101,6 +88,11 @@ protected PythonBuiltinBaseNode getBuiltin(VirtualFrame frame, PBuiltinFunction if (builtinNodeFactory == null) { return null; // see for example MethodDescriptorRoot and subclasses } + if (TpSlotBuiltin.isSlotFactory(builtinNodeFactory)) { + // slot wrapper must perform validation implemented in WrapperDescrCall inside the + // PBuiltinRootNode + return null; + } Class nodeClass = builtinNodeFactory.getNodeClass(); int builtinNodeArity = getBuiltinNodeArity(nodeClass); if (builtinNodeArity == -1 || builtinNodeArity < nargs) { @@ -111,7 +103,7 @@ protected PythonBuiltinBaseNode getBuiltin(VirtualFrame frame, PBuiltinFunction if (slotSignature.needsFrame() || nargs < slotSignature.minNumOfPositionalArgs()) { return null; } - int maxArgs = Math.max(slotSignature.minNumOfPositionalArgs(), slotSignature.parameterNames().length); + int maxArgs = Math.max(Math.max(slotSignature.maxNumOfPositionalArgs(), slotSignature.minNumOfPositionalArgs()), slotSignature.parameterNames().length); if (nargs > maxArgs) { return null; } @@ -127,9 +119,6 @@ protected PythonBuiltinBaseNode getBuiltin(VirtualFrame frame, PBuiltinFunction if (nargs < builtinAnnotation.minNumOfPositionalArgs() || nargs > maxArgs) { return null; } - } else { - // for slots without SlotSignature the max args is implied by the node class - assert TpSlotBuiltin.isSlotFactory(builtinNodeFactory) : nodeClass.getName(); } } PythonBuiltinBaseNode builtinNode = builtinNodeFactory.createNode(); @@ -152,30 +141,6 @@ private static int getBuiltinNodeArity(Class no return -1; } - public PythonUnaryBuiltinNode getBuiltin(UnaryBuiltinDescriptor descriptor) { - PythonUnaryBuiltinNode builtin = descriptor.createNode(); - if (!callerExceedsMaxSize(builtin)) { - return builtin; - } - return null; - } - - public PythonBinaryBuiltinNode getBuiltin(BinaryBuiltinDescriptor descriptor) { - PythonBinaryBuiltinNode builtin = descriptor.createNode(); - if (!callerExceedsMaxSize(builtin)) { - return builtin; - } - return null; - } - - public PythonTernaryBuiltinNode getBuiltin(TernaryBuiltinDescriptor descriptor) { - PythonTernaryBuiltinNode builtin = descriptor.createNode(); - if (!callerExceedsMaxSize(builtin)) { - return builtin; - } - return null; - } - private boolean callerExceedsMaxSize(T builtinNode) { CompilerAsserts.neverPartOfCompilation(); if (isAdoptable() && !isMaxSizeExceeded()) { @@ -184,9 +149,10 @@ private boolean callerExceedsMaxSize(T builtin Class builtinClass = builtinNode.getClass(); Node parent = getParent(); int recursiveCalls = 0; + PythonLanguage language = PythonLanguage.get(this); while (parent != null && !(parent instanceof RootNode)) { if (parent.getClass() == builtinClass) { - int recursionLimit = PythonLanguage.get(this).getEngineOption(PythonOptions.NodeRecursionLimit); + int recursionLimit = language.getEngineOption(PythonOptions.NodeRecursionLimit); if (recursiveCalls == recursionLimit) { return true; } @@ -198,7 +164,7 @@ private boolean callerExceedsMaxSize(T builtin RootNode root = getRootNode(); // nb: option 'BuiltinsInliningMaxCallerSize' is defined as a compatible option, i.e., // ASTs will only be shared between contexts that have the same value for this option. - int maxSize = PythonLanguage.get(this).getEngineOption(PythonOptions.BuiltinsInliningMaxCallerSize); + int maxSize = language.getEngineOption(PythonOptions.BuiltinsInliningMaxCallerSize); if (root instanceof PRootNode) { PRootNode pRoot = (PRootNode) root; int rootNodeCount = pRoot.getNodeCountForInlining(); @@ -227,29 +193,6 @@ private boolean callerExceedsMaxSize(T builtin return true; } - PythonVarargsBuiltinNode getVarargs(VirtualFrame frame, Object func) { - CompilerAsserts.neverPartOfCompilation(); - if (func instanceof PBuiltinFunction builtinFunc) { - NodeFactory builtinNodeFactory = builtinFunc.getBuiltinNodeFactory(); - if (builtinNodeFactory == null) { - return null; // see for example MethodDescriptorRoot and subclasses - } - if (!PythonVarargsBuiltinNode.class.isAssignableFrom(builtinNodeFactory.getNodeClass())) { - // This filters out slots for now. They do not have @Builtin annotation - return null; - } - assert builtinNodeFactory.getNodeClass().getAnnotationsByType(Builtin.class).length > 0 : "PBuiltinFunction " + builtinFunc + " is expected to have a Builtin annotated node."; - if (builtinNodeFactory.getNodeClass().getAnnotationsByType(Builtin.class)[0].needsFrame() && frame == null) { - return null; - } - PythonVarargsBuiltinNode builtinNode = (PythonVarargsBuiltinNode) builtinFunc.getBuiltinNodeFactory().createNode(); - if (!callerExceedsMaxSize(builtinNode)) { - return builtinNode; - } - } - return null; - } - protected static boolean takesSelfArg(Object func) { if (func instanceof PBuiltinFunction) { RootNode functionRootNode = ((PBuiltinFunction) func).getFunctionRootNode(); @@ -270,17 +213,6 @@ protected static RootCallTarget getCallTarget(PBuiltinMethod meth, GetCallTarget return getCtNode.execute(meth.getFunction()); } - protected void raiseInvalidArgsNumUncached(boolean hasValidArgsNum, BuiltinMethodDescriptor descr) { - if (!hasValidArgsNum) { - raiseInvalidArgsNumUncached(descr); - } - } - - @TruffleBoundary - private void raiseInvalidArgsNumUncached(BuiltinMethodDescriptor descr) { - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.TypeError, EXPECTED_D_ARGS, descr.minNumOfPositionalArgs()); - } - protected static Object callUnaryBuiltin(VirtualFrame frame, PythonBuiltinBaseNode builtin, Object arg1) { CompilerAsserts.partialEvaluationConstant(builtin); if (builtin instanceof PythonUnaryBuiltinNode) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallBinaryMethodNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallBinaryMethodNode.java index b8a6919a62..49f334de7e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallBinaryMethodNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallBinaryMethodNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,22 +40,13 @@ */ package com.oracle.graal.python.nodes.call.special; -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.BinaryBuiltinDescriptor; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.TernaryBuiltinDescriptor; -import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetCallTargetNode; import com.oracle.graal.python.nodes.call.BoundDescriptor; import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.call.GenericInvokeNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.dsl.Bind; @@ -73,7 +64,7 @@ import com.oracle.truffle.api.profiles.InlinedConditionProfile; @GenerateUncached -public abstract class CallBinaryMethodNode extends CallReversibleMethodNode { +public abstract class CallBinaryMethodNode extends AbstractCallMethodNode { @NeverDefault public static CallBinaryMethodNode create() { return CallBinaryMethodNodeGen.create(); @@ -95,74 +86,19 @@ public final Object executeObject(Object callable, Object arg1, Object arg2) { return executeObject(null, callable, arg1, arg2); } - @Specialization(guards = {"cachedInfo == info", "node != null"}, limit = "getCallSiteInlineCacheMaxDepth()") - static Object callBinarySpecialMethodSlotInlined(VirtualFrame frame, @SuppressWarnings("unused") BinaryBuiltinDescriptor info, Object arg1, Object arg2, - @SuppressWarnings("unused") @Cached("info") BinaryBuiltinDescriptor cachedInfo, - @Cached("getBuiltin(cachedInfo)") PythonBinaryBuiltinNode node) { - if (cachedInfo.isReverseOperation()) { - return node.execute(frame, arg2, arg1); - } else { - return node.execute(frame, arg1, arg2); - } - } - - protected static boolean hasAllowedArgsNum(BuiltinMethodDescriptor descr) { - return descr.minNumOfPositionalArgs() <= 2; - } - - @Specialization(guards = {"cachedInfo == info", "node != null"}, limit = "getCallSiteInlineCacheMaxDepth()") - Object callTernarySpecialMethodSlotInlined(VirtualFrame frame, @SuppressWarnings("unused") TernaryBuiltinDescriptor info, Object arg1, Object arg2, - @SuppressWarnings("unused") @Cached("info") TernaryBuiltinDescriptor cachedInfo, - @Cached("hasAllowedArgsNum(cachedInfo)") boolean hasValidArgsNum, - @Cached("getBuiltin(cachedInfo)") PythonTernaryBuiltinNode node) { - raiseInvalidArgsNumUncached(hasValidArgsNum, cachedInfo); - if (cachedInfo.isReverseOperation()) { - return node.execute(frame, arg2, arg1, PNone.NO_VALUE); - } - return node.execute(frame, arg1, arg2, PNone.NO_VALUE); - } - - protected static boolean isBinaryOrTernaryBuiltinDescriptor(Object value) { - return value instanceof BinaryBuiltinDescriptor || value instanceof TernaryBuiltinDescriptor; - } - - @Specialization(guards = "isBinaryOrTernaryBuiltinDescriptor(info)", replaces = {"callBinarySpecialMethodSlotInlined", "callTernarySpecialMethodSlotInlined"}) - @InliningCutoff - Object callSpecialMethodSlotCallTarget(VirtualFrame frame, BuiltinMethodDescriptor info, Object arg1, Object arg2, - @Bind("this") Node inliningTarget, - @Exclusive @Cached InlinedConditionProfile invalidArgsProfile, - @Cached GenericInvokeNode invokeNode) { - raiseInvalidArgsNumUncached(invalidArgsProfile.profile(inliningTarget, hasAllowedArgsNum(info)), info); - RootCallTarget callTarget = PythonLanguage.get(this).getDescriptorCallTarget(info); - Object[] arguments = PArguments.create(2); - PArguments.setArgument(arguments, 0, arg1); - PArguments.setArgument(arguments, 1, arg2); - return invokeNode.execute(frame, callTarget, arguments); - } - @Specialization(guards = {"isSingleContext()", "func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()") static Object callObjectSingleContext(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinFunction func, Object arg1, Object arg2, @SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc, - @SuppressWarnings("unused") @Cached("isForReverseBinaryOperation(func.getCallTarget())") boolean isReverse, @Cached("getBuiltin(frame, func, 2)") PythonBuiltinBaseNode builtinNode) { - if (isReverse) { - return callBinaryBuiltin(frame, builtinNode, arg2, arg1); - } else { - return callBinaryBuiltin(frame, builtinNode, arg1, arg2); - } + return callBinaryBuiltin(frame, builtinNode, arg1, arg2); } @Specialization(guards = {"func.getCallTarget() == ct", "builtinNode != null"}, // limit = "getCallSiteInlineCacheMaxDepth()") static Object callObject(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinFunction func, Object arg1, Object arg2, @SuppressWarnings("unused") @Cached("func.getCallTarget()") RootCallTarget ct, - @SuppressWarnings("unused") @Cached("isForReverseBinaryOperation(func.getCallTarget())") boolean isReverse, @Cached("getBuiltin(frame, func, 2)") PythonBuiltinBaseNode builtinNode) { - if (isReverse) { - return callBinaryBuiltin(frame, builtinNode, arg2, arg1); - } else { - return callBinaryBuiltin(frame, builtinNode, arg1, arg2); - } + return callBinaryBuiltin(frame, builtinNode, arg1, arg2); } @Specialization(guards = {"isSingleContext()", "func == cachedFunc", "builtinNode != null", "!takesSelfArg"}, limit = "getCallSiteInlineCacheMaxDepth()") @@ -199,8 +135,7 @@ static Object callMethodSelf(VirtualFrame frame, @SuppressWarnings("unused") PBu return callTernaryBuiltin(frame, builtinNode, func.getSelf(), arg1, arg2); } - @Specialization(guards = "!isBinaryOrTernaryBuiltinDescriptor(func)", // - replaces = {"callObjectSingleContext", "callObject", "callMethodSingleContext", "callMethod", "callMethodSingleContextSelf", "callMethodSelf"}) + @Specialization(replaces = {"callObjectSingleContext", "callObject", "callMethodSingleContext", "callMethod", "callMethodSingleContextSelf", "callMethodSelf"}) @Megamorphic @InliningCutoff static Object call(VirtualFrame frame, Object func, Object arg1, Object arg2, diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallReversibleMethodNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallReversibleMethodNode.java deleted file mode 100644 index 46a95d623e..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallReversibleMethodNode.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.call.special; - -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.RootCallTarget; - -abstract class CallReversibleMethodNode extends AbstractCallMethodNode { - protected boolean isForReverseBinaryOperation(RootCallTarget ct) { - CompilerAsserts.neverPartOfCompilation(); - return PBuiltinFunction.isReverseOperationSlot(ct); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallTernaryMethodNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallTernaryMethodNode.java index d630b50122..5a368adefb 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallTernaryMethodNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallTernaryMethodNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,18 +40,13 @@ */ package com.oracle.graal.python.nodes.call.special; -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.TernaryBuiltinDescriptor; -import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetCallTargetNode; import com.oracle.graal.python.nodes.call.BoundDescriptor; import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.call.GenericInvokeNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.dsl.Bind; @@ -67,7 +62,7 @@ import com.oracle.truffle.api.profiles.InlinedConditionProfile; @GenerateUncached -public abstract class CallTernaryMethodNode extends CallReversibleMethodNode { +public abstract class CallTernaryMethodNode extends AbstractCallMethodNode { @NeverDefault public static CallTernaryMethodNode create() { return CallTernaryMethodNodeGen.create(); @@ -79,59 +74,21 @@ public static CallTernaryMethodNode getUncached() { public abstract Object execute(Frame frame, Object callable, Object arg1, Object arg2, Object arg3); - @Specialization(guards = {"cachedInfo == info", "node != null"}, limit = "getCallSiteInlineCacheMaxDepth()") - static Object callSpecialMethodSlotInlined(VirtualFrame frame, @SuppressWarnings("unused") TernaryBuiltinDescriptor info, Object arg1, Object arg2, Object arg3, - @SuppressWarnings("unused") @Cached("info") TernaryBuiltinDescriptor cachedInfo, - @Cached("getBuiltin(cachedInfo)") PythonTernaryBuiltinNode node) { - return node.execute(frame, arg1, arg2, arg3); - } - - @Specialization(replaces = "callSpecialMethodSlotInlined") - @InliningCutoff - static Object callSpecialMethodSlotCallTarget(VirtualFrame frame, TernaryBuiltinDescriptor info, Object arg1, Object arg2, Object arg3, - @Cached GenericInvokeNode invokeNode) { - RootCallTarget callTarget = PythonLanguage.get(invokeNode).getDescriptorCallTarget(info); - Object[] arguments = PArguments.create(3); - PArguments.setArgument(arguments, 0, arg1); - PArguments.setArgument(arguments, 1, arg2); - PArguments.setArgument(arguments, 2, arg3); - return invokeNode.execute(frame, callTarget, arguments); - } - - @Specialization(guards = {"isSingleContext()", "func == cachedFunc", "builtinNode != null", "!isReverse"}, limit = "getCallSiteInlineCacheMaxDepth()") + @Specialization(guards = {"isSingleContext()", "func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()") static Object doBuiltinFunctionCached(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinFunction func, Object arg1, Object arg2, Object arg3, @SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc, - @SuppressWarnings("unused") @Cached("isForReverseBinaryOperation(func.getCallTarget())") boolean isReverse, @Cached("getBuiltin(frame, func, 3)") PythonBuiltinBaseNode builtinNode) { return callTernaryBuiltin(frame, builtinNode, arg1, arg2, arg3); } - @Specialization(guards = {"isSingleContext()", "func == cachedFunc", "builtinNode != null", "isReverse"}, limit = "getCallSiteInlineCacheMaxDepth()") - static Object doBuiltinFunctionCachedReverse(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinFunction func, Object arg1, Object arg2, Object arg3, - @SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc, - @SuppressWarnings("unused") @Cached("isForReverseBinaryOperation(func.getCallTarget())") boolean isReverse, - @Cached("getBuiltin(frame, func, 3)") PythonBuiltinBaseNode builtinNode) { - return callTernaryBuiltin(frame, builtinNode, arg2, arg1, arg3); - } - - @Specialization(guards = {"func.getCallTarget() == ct", "builtinNode != null", "!isReverse"}, // + @Specialization(guards = {"func.getCallTarget() == ct", "builtinNode != null"}, // limit = "getCallSiteInlineCacheMaxDepth()") static Object doBuiltinFunctionCtCached(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinFunction func, Object arg1, Object arg2, Object arg3, @SuppressWarnings("unused") @Cached("func.getCallTarget()") RootCallTarget ct, - @SuppressWarnings("unused") @Cached("isForReverseBinaryOperation(func.getCallTarget())") boolean isReverse, @Cached("getBuiltin(frame, func, 3)") PythonBuiltinBaseNode builtinNode) { return callTernaryBuiltin(frame, builtinNode, arg1, arg2, arg3); } - @Specialization(guards = {"func.getCallTarget() == ct", "builtinNode != null", "isReverse"}, // - limit = "getCallSiteInlineCacheMaxDepth()") - static Object doBuiltinFunctionCtCachedReverse(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinFunction func, Object arg1, Object arg2, Object arg3, - @SuppressWarnings("unused") @Cached("func.getCallTarget()") RootCallTarget ct, - @SuppressWarnings("unused") @Cached("isForReverseBinaryOperation(func.getCallTarget())") boolean isReverse, - @Cached("getBuiltin(frame, func, 3)") PythonBuiltinBaseNode builtinNode) { - return callTernaryBuiltin(frame, builtinNode, arg2, arg1, arg3); - } - @Specialization(guards = {"isSingleContext()", "func == cachedFunc", "builtinNode != null", "!takesSelfArg"}, limit = "getCallSiteInlineCacheMaxDepth()") static Object doBuiltinMethodCached(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinMethod func, Object arg1, Object arg2, Object arg3, @SuppressWarnings("unused") @Cached("func") PBuiltinMethod cachedFunc, @@ -166,8 +123,8 @@ static Object callSelfMethod(VirtualFrame frame, @SuppressWarnings("unused") PBu return callQuaternaryBuiltin(frame, builtinNode, func.getSelf(), arg1, arg2, arg3); } - @Specialization(guards = "!isTernaryBuiltinDescriptor(func)", replaces = {"doBuiltinFunctionCached", "doBuiltinFunctionCtCached", "doBuiltinFunctionCachedReverse", - "doBuiltinFunctionCtCachedReverse", "doBuiltinMethodCached", "doBuiltinMethodCtCached", "callSelfMethodSingleContext", "callSelfMethod"}) + @Specialization(replaces = {"doBuiltinFunctionCached", "doBuiltinFunctionCtCached", + "doBuiltinMethodCached", "doBuiltinMethodCtCached", "callSelfMethodSingleContext", "callSelfMethod"}) @Megamorphic @InliningCutoff static Object call(VirtualFrame frame, Object func, Object arg1, Object arg2, Object arg3, diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallUnaryMethodNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallUnaryMethodNode.java index d7a5053b05..8c2934ce7e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallUnaryMethodNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallUnaryMethodNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,24 +40,13 @@ */ package com.oracle.graal.python.nodes.call.special; -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.BinaryBuiltinDescriptor; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.TernaryBuiltinDescriptor; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.UnaryBuiltinDescriptor; -import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; import com.oracle.graal.python.builtins.objects.function.PKeyword; import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetCallTargetNode; import com.oracle.graal.python.nodes.call.BoundDescriptor; import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.call.GenericInvokeNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.RootCallTarget; @@ -92,48 +81,6 @@ public final Object executeObject(Object callable, Object receiver) { return executeObject(null, callable, receiver); } - @Specialization(guards = {"cachedInfo == info", "node != null"}, limit = "getCallSiteInlineCacheMaxDepth()") - Object callUnarySpecialMethodSlotInlined(VirtualFrame frame, @SuppressWarnings("unused") UnaryBuiltinDescriptor info, Object receiver, - @SuppressWarnings("unused") @Cached("info") UnaryBuiltinDescriptor cachedInfo, - @Cached("getBuiltin(cachedInfo)") PythonUnaryBuiltinNode node) { - return node.execute(frame, receiver); - } - - protected static boolean hasAllowedArgsNum(BuiltinMethodDescriptor descr) { - return descr.minNumOfPositionalArgs() <= 1; - } - - @Specialization(guards = {"cachedInfo == info", "node != null"}, limit = "getCallSiteInlineCacheMaxDepth()") - Object callBinarySpecialMethodSlotInlined(VirtualFrame frame, @SuppressWarnings("unused") BinaryBuiltinDescriptor info, Object receiver, - @SuppressWarnings("unused") @Cached("info") BinaryBuiltinDescriptor cachedInfo, - @Cached("hasAllowedArgsNum(cachedInfo)") boolean hasValidArgsNum, - @Cached("getBuiltin(cachedInfo)") PythonBinaryBuiltinNode node) { - raiseInvalidArgsNumUncached(hasValidArgsNum, cachedInfo); - return node.execute(frame, receiver, PNone.NO_VALUE); - } - - @Specialization(guards = {"cachedInfo == info", "node != null"}, limit = "getCallSiteInlineCacheMaxDepth()") - Object callTernarySpecialMethodSlotInlined(VirtualFrame frame, @SuppressWarnings("unused") TernaryBuiltinDescriptor info, Object receiver, - @SuppressWarnings("unused") @Cached("info") TernaryBuiltinDescriptor cachedInfo, - @Cached("hasAllowedArgsNum(cachedInfo)") boolean hasValidArgsNum, - @Cached("getBuiltin(cachedInfo)") PythonTernaryBuiltinNode node) { - raiseInvalidArgsNumUncached(hasValidArgsNum, cachedInfo); - return node.execute(frame, receiver, PNone.NO_VALUE, PNone.NO_VALUE); - } - - @Specialization(guards = "isBuiltinDescriptor(info)", replaces = {"callUnarySpecialMethodSlotInlined", "callBinarySpecialMethodSlotInlined", "callTernarySpecialMethodSlotInlined"}) - @InliningCutoff - Object callSpecialMethodSlotCallTarget(VirtualFrame frame, BuiltinMethodDescriptor info, Object receiver, - @Bind("this") Node inliningTarget, - @Exclusive @Cached InlinedConditionProfile invalidArgsProfile, - @Cached GenericInvokeNode invokeNode) { - raiseInvalidArgsNumUncached(invalidArgsProfile.profile(inliningTarget, hasAllowedArgsNum(info)), info); - RootCallTarget callTarget = PythonLanguage.get(this).getDescriptorCallTarget(info); - Object[] arguments = PArguments.create(1); - PArguments.setArgument(arguments, 0, receiver); - return invokeNode.execute(frame, callTarget, arguments); - } - @Specialization(guards = {"isSingleContext()", "func == cachedFunc", "builtinNode != null"}, // limit = "getCallSiteInlineCacheMaxDepth()") Object callObjectSingle(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinFunction func, Object receiver, @@ -184,7 +131,7 @@ Object callSelfMethod(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinMe return callBinaryBuiltin(frame, builtinNode, func.getSelf(), arg); } - @Specialization(guards = "!isBuiltinDescriptor(func)", replaces = {"callObjectSingle", "callObject", "callMethodSingleContext", "callSelfMethodSingleContext", "callMethod", "callSelfMethod"}) + @Specialization(replaces = {"callObjectSingle", "callObject", "callMethodSingleContext", "callSelfMethodSingleContext", "callMethod", "callSelfMethod"}) @Megamorphic @InliningCutoff static Object call(VirtualFrame frame, Object func, Object receiver, diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallVarargsMethodNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallVarargsMethodNode.java deleted file mode 100644 index 47ee314679..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallVarargsMethodNode.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.call.special; - -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.function.PKeyword; -import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; -import com.oracle.graal.python.nodes.builtins.FunctionNodes.GetCallTargetNode; -import com.oracle.graal.python.nodes.call.BoundDescriptor; -import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode.VarargsBuiltinDirectInvocationNotSupported; -import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; -import com.oracle.truffle.api.RootCallTarget; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.ReportPolymorphism.Megamorphic; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.Frame; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; - -@GenerateUncached -public abstract class CallVarargsMethodNode extends AbstractCallMethodNode { - - public abstract Object execute(Frame frame, Object callable, Object[] arguments, PKeyword[] keywords); - - @NeverDefault - public static CallVarargsMethodNode create() { - return CallVarargsMethodNodeGen.create(); - } - - public static CallVarargsMethodNode getUncached() { - return CallVarargsMethodNodeGen.getUncached(); - } - - @Specialization(guards = {"isSingleContext()", "func == cachedFunc", "builtinNode != null"}, // - limit = "getCallSiteInlineCacheMaxDepth()", // - rewriteOn = VarargsBuiltinDirectInvocationNotSupported.class) - static Object callVarargsDirect(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinFunction func, Object[] arguments, PKeyword[] keywords, - @Cached("func") @SuppressWarnings("unused") PBuiltinFunction cachedFunc, - @Cached("getVarargs(frame, func)") PythonVarargsBuiltinNode builtinNode) throws VarargsBuiltinDirectInvocationNotSupported { - return builtinNode.varArgExecute(frame, PNone.NO_VALUE, arguments, keywords); - } - - @Specialization(guards = {"func.getCallTarget() == ct", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = VarargsBuiltinDirectInvocationNotSupported.class) - static Object callVarargs(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinFunction func, Object[] arguments, PKeyword[] keywords, - @SuppressWarnings("unused") @Cached("func.getCallTarget()") RootCallTarget ct, - @Cached("getVarargs(frame, func)") PythonVarargsBuiltinNode builtinNode) throws VarargsBuiltinDirectInvocationNotSupported { - return builtinNode.varArgExecute(frame, PNone.NO_VALUE, arguments, keywords); - } - - @Specialization(guards = {"isSingleContext()", "func == cachedFunc", "builtinNode != null", - "takesSelfArg"}, rewriteOn = VarargsBuiltinDirectInvocationNotSupported.class, limit = "getCallSiteInlineCacheMaxDepth()") - static Object callSelfMethodSingleContext(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinMethod func, Object[] arguments, PKeyword[] keywords, - @SuppressWarnings("unused") @Cached(value = "func", weak = true) PBuiltinMethod cachedFunc, - @SuppressWarnings("unused") @Cached("takesSelfArg(func)") boolean takesSelfArg, - @Cached("getVarargs(frame, func.getBuiltinFunction())") PythonVarargsBuiltinNode builtinNode) { - return builtinNode.varArgExecute(frame, func.getSelf(), arguments, keywords); - } - - @Specialization(guards = {"builtinNode != null", "getCallTarget(func, getCt) == ct", "takesSelfArg"}, // - limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = VarargsBuiltinDirectInvocationNotSupported.class) - static Object callSelfMethod(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinMethod func, Object[] arguments, PKeyword[] keywords, - @SuppressWarnings("unused") @Shared @Cached GetCallTargetNode getCt, - @SuppressWarnings("unused") @Cached("getCallTarget(func, getCt)") RootCallTarget ct, - @SuppressWarnings("unused") @Cached("takesSelfArg(func)") boolean takesSelfArg, - @Cached("getVarargs(frame, func.getBuiltinFunction())") PythonVarargsBuiltinNode builtinNode) { - return builtinNode.varArgExecute(frame, func.getSelf(), arguments, keywords); - } - - @Specialization(guards = {"isSingleContext()", "func == cachedFunc", "builtinNode != null", - "!takesSelfArg"}, rewriteOn = VarargsBuiltinDirectInvocationNotSupported.class, limit = "getCallSiteInlineCacheMaxDepth()") - static Object callSelfMethodSingleContextNoSelf(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinMethod func, Object[] arguments, PKeyword[] keywords, - @SuppressWarnings("unused") @Cached("func") PBuiltinMethod cachedFunc, - @SuppressWarnings("unused") @Cached("takesSelfArg(func)") boolean takesSelfArg, - @Cached("getVarargs(frame, func.getBuiltinFunction())") PythonVarargsBuiltinNode builtinNode) { - return builtinNode.varArgExecute(frame, PNone.NO_VALUE, arguments, keywords); - } - - @Specialization(guards = {"builtinNode != null", "getCallTarget(func, getCt) == ct", "!takesSelfArg"}, // - rewriteOn = VarargsBuiltinDirectInvocationNotSupported.class, limit = "getCallSiteInlineCacheMaxDepth()") - static Object callSelfMethodNoSelf(VirtualFrame frame, @SuppressWarnings("unused") PBuiltinMethod func, Object[] arguments, PKeyword[] keywords, - @SuppressWarnings("unused") @Shared @Cached GetCallTargetNode getCt, - @SuppressWarnings("unused") @Cached("getCallTarget(func, getCt)") RootCallTarget ct, - @SuppressWarnings("unused") @Cached("takesSelfArg(func)") boolean takesSelfArg, - @Cached("getVarargs(frame, func.getBuiltinFunction())") PythonVarargsBuiltinNode builtinNode) { - return builtinNode.varArgExecute(frame, PNone.NO_VALUE, arguments, keywords); - } - - @Specialization(guards = {"arguments.length == 1", "keywords.length == 0"}) - static Object callUnary(VirtualFrame frame, Object callable, Object[] arguments, @SuppressWarnings("unused") PKeyword[] keywords, - @Cached CallUnaryMethodNode callUnaryMethodNode) { - return callUnaryMethodNode.executeObject(frame, callable, arguments[0]); - } - - @Specialization(guards = {"arguments.length == 2", "keywords.length == 0"}) - static Object callBinary(VirtualFrame frame, Object callable, Object[] arguments, @SuppressWarnings("unused") PKeyword[] keywords, - @Cached CallBinaryMethodNode callBinaryMethodNode) { - return callBinaryMethodNode.executeObject(frame, callable, arguments[0], arguments[1]); - } - - @Specialization(guards = {"arguments.length == 3", "keywords.length == 0"}) - static Object callTernary(VirtualFrame frame, Object callable, Object[] arguments, @SuppressWarnings("unused") PKeyword[] keywords, - @Cached CallTernaryMethodNode callTernaryMethodNode) { - return callTernaryMethodNode.execute(frame, callable, arguments[0], arguments[1], arguments[2]); - } - - @Specialization(guards = {"arguments.length == 4", "keywords.length == 0"}) - static Object callQuaternary(VirtualFrame frame, Object callable, Object[] arguments, @SuppressWarnings("unused") PKeyword[] keywords, - @Cached CallQuaternaryMethodNode callQuaternaryMethodNode) { - return callQuaternaryMethodNode.execute(frame, callable, arguments[0], arguments[1], arguments[2], arguments[3]); - } - - @Specialization(replaces = {"callVarargsDirect", "callVarargs", "callSelfMethodSingleContext", "callSelfMethod", "callSelfMethodSingleContextNoSelf", "callSelfMethodNoSelf", "callUnary", - "callBinary", "callTernary", "callQuaternary"}) - @Megamorphic - @InliningCutoff - static Object call(VirtualFrame frame, Object func, Object[] arguments, PKeyword[] keywords, - @Bind("this") Node inliningTarget, - @Cached CallNode callNode, - @Cached InlinedConditionProfile isBoundProfile) { - if (isBoundProfile.profile(inliningTarget, func instanceof BoundDescriptor)) { - Object[] boundArguments = new Object[arguments.length - 1]; - PythonUtils.arraycopy(arguments, 1, boundArguments, 0, boundArguments.length); - return callNode.execute(frame, ((BoundDescriptor) func).descriptor, boundArguments, keywords); - } else { - return callNode.execute(frame, func, arguments, keywords); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallBinaryNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallBinaryNode.java index 5831bc7937..a6a30e33a3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallBinaryNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallBinaryNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,186 +40,113 @@ */ package com.oracle.graal.python.nodes.call.special; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.nodes.PGuards; -import com.oracle.graal.python.nodes.PNodeWithContext; +import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode; +import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.util.Supplier; import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Fallback; -import com.oracle.truffle.api.dsl.GenerateCached; -import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.ReportPolymorphism.Megamorphic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; -// cpython://Objects/abstract.c#binary_op1 -// Order operations are tried until either a valid result or error: w.op(v,w)[*], v.op(v,w), w.op(v,w) -// -// [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of v->ob_type -// -// The (long, double) and (double, long) specializations are needed since long->double conversion -// is not always correct (it can lose information). See FloatBuiltins.EqNode.compareDoubleToLong(). -// The (int, double) and (double, int) specializations are needed to avoid int->long conversion. -// Although it would produce correct results, the special handling of long to double comparison -// is slower than converting int->double, which is always correct. +/** + * Helper node for what would be a sequence of {@code _PyObject_LookupSpecial} and + * {@code PyObject_CallXXXA}. Callers should handle exception {@link SpecialMethodNotFound}, which + * indicates that the method was not found. + */ @ImportStatic(PythonOptions.class) public abstract class LookupAndCallBinaryNode extends Node { - - public abstract static class NotImplementedHandler extends PNodeWithContext { - public abstract Object execute(VirtualFrame frame, Object arg, Object arg2); - } - - protected final Supplier handlerFactory; - protected final boolean ignoreDescriptorException; - @Child private CallBinaryMethodNode dispatchNode; - @Child private NotImplementedHandler handler; + protected final TruffleString name; - LookupAndCallBinaryNode(Supplier handlerFactory, boolean ignoreDescriptorException) { - this.handlerFactory = handlerFactory; - this.ignoreDescriptorException = ignoreDescriptorException; + LookupAndCallBinaryNode(TruffleString name) { + this.name = name; } - public abstract Object executeObject(VirtualFrame frame, Object arg, Object arg2); + public abstract Object executeObject(VirtualFrame frame, Object arg, Object arg2) throws SpecialMethodNotFound; @NeverDefault public static LookupAndCallBinaryNode create(TruffleString name) { - // Use SpecialMethodSlot overload for special slots, if there is a need to create - // LookupAndCallBinaryNode for dynamic name, then we should change this method or the caller - // to try to lookup a slot and use that if found - assert SpecialMethodSlot.findSpecialSlotUncached(name) == null : name; - return LookupAndCallNonReversibleBinaryNodeGen.create(name, null, false); + return LookupAndCallBinaryNodeGen.create(name); } - @NeverDefault - public static LookupAndCallBinaryNode create(SpecialMethodSlot slot) { - return LookupAndCallNonReversibleBinaryNodeGen.create(slot, null, false); + protected final CallBinaryMethodNode ensureDispatch() { + // this also serves as a branch profile + if (dispatchNode == null) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + dispatchNode = insert(CallBinaryMethodNode.create()); + } + return dispatchNode; } - @NeverDefault - public static LookupAndCallBinaryNode create(SpecialMethodSlot slot, Supplier handlerFactory) { - return LookupAndCallNonReversibleBinaryNodeGen.create(slot, handlerFactory, false); + protected final PythonBinaryBuiltinNode getBinaryBuiltin(PythonBuiltinClassType clazz) { + Object attribute = LookupAttributeInMRONode.Dynamic.getUncached().execute(clazz, name); + if (attribute instanceof PBuiltinFunction) { + PBuiltinFunction builtinFunction = (PBuiltinFunction) attribute; + if (PythonBinaryBuiltinNode.class.isAssignableFrom(builtinFunction.getBuiltinNodeFactory().getNodeClass())) { + return (PythonBinaryBuiltinNode) builtinFunction.getBuiltinNodeFactory().createNode(); + } + } + return null; } - @NeverDefault - public static LookupAndCallBinaryNode createReversible(SpecialMethodSlot slot, SpecialMethodSlot rslot, Supplier handlerFactory) { - return LookupAndCallReversibleBinaryNodeGen.create(slot, rslot, handlerFactory, false, false); + protected static PythonBuiltinClassType getBuiltinClass(Node inliningTarget, Object receiver, GetClassNode getClassNode) { + Object clazz = getClassNode.execute(inliningTarget, receiver); + return clazz instanceof PythonBuiltinClassType ? (PythonBuiltinClassType) clazz : null; } - @NeverDefault - public static LookupAndCallBinaryNode createBinaryOp(SpecialMethodSlot slot, SpecialMethodSlot rslot, Supplier handlerFactory) { - return LookupAndCallNbNumbersBinaryNodeFactory.BinaryOpNodeGen.create(slot, rslot, handlerFactory); + protected static boolean isClazz(Node inliningTarget, PythonBuiltinClassType clazz, Object receiver, GetClassNode getClassNode) { + return getClassNode.execute(inliningTarget, receiver) == clazz; } - @NeverDefault - public static LookupAndCallBinaryNode create(SpecialMethodSlot slot, SpecialMethodSlot rslot, boolean alwaysCheckReverse, boolean ignoreDescriptorException) { - return LookupAndCallReversibleBinaryNodeGen.create(slot, rslot, null, alwaysCheckReverse, ignoreDescriptorException); - } + // Object, Object - protected static Object getMethod(Object receiver, TruffleString methodName) { - return LookupSpecialMethodNode.Dynamic.executeUncached(null, GetClassNode.executeUncached(receiver), methodName, receiver); + @Specialization(guards = {"clazz != null", "function != null", "isClazz(inliningTarget, clazz, left, getClassNode)"}, limit = "getCallSiteInlineCacheMaxDepth()") + static Object callObjectBuiltin(VirtualFrame frame, Object left, Object right, + @SuppressWarnings("unused") @Bind("this") Node inliningTarget, + @SuppressWarnings("unused") @Exclusive @Cached GetClassNode getClassNode, + @SuppressWarnings("unused") @Cached("getBuiltinClass(this, left, getClassNode)") PythonBuiltinClassType clazz, + @Cached("getBinaryBuiltin(clazz)") PythonBinaryBuiltinNode function) { + return function.execute(frame, left, right); } - @ImportStatic(PGuards.class) - @GenerateInline - @GenerateCached(false) - protected abstract static class AreSameCallables extends Node { - public abstract boolean execute(Node inliningTarget, Object left, Object right); - - @Specialization(guards = "a == b") - static boolean areIdenticalFastPath(@SuppressWarnings("unused") Object a, @SuppressWarnings("unused") Object b) { - return true; - } - - @Specialization(guards = "isNone(a) || isNone(b)") - static boolean noneFastPath(@SuppressWarnings("unused") Object a, @SuppressWarnings("unused") Object b) { - return a == b; - } - - @Specialization(replaces = "areIdenticalFastPath") - static boolean doDescrs(BuiltinMethodDescriptor a, BuiltinMethodDescriptor b) { - return a == b; - } - - @Specialization(replaces = "areIdenticalFastPath") - static boolean doDescrFun1(BuiltinMethodDescriptor a, PBuiltinFunction b) { - return a.isDescriptorOf(b); - } - - @Specialization(replaces = "areIdenticalFastPath") - static boolean doDescrFun2(PBuiltinFunction a, BuiltinMethodDescriptor b) { - return b.isDescriptorOf(a); - } - - @Specialization(replaces = "areIdenticalFastPath") - static boolean doDescrMeth1(BuiltinMethodDescriptor a, PBuiltinMethod b) { - return doDescrFun1(a, b.getBuiltinFunction()); - } - - @Specialization(replaces = "areIdenticalFastPath") - static boolean doDescrMeth2(PBuiltinMethod a, BuiltinMethodDescriptor b) { - return doDescrFun2(a.getBuiltinFunction(), b); - } - - @Fallback - static boolean doGenericRuntimeObjects(Object a, Object b) { - return a == b; - } + @Specialization(guards = {"left.getClass() == cachedLeftClass", "right.getClass() == cachedRightClass"}, limit = "5") + @SuppressWarnings("truffle-static-method") + Object callObjectGeneric(VirtualFrame frame, Object left, Object right, + @Bind("this") Node inliningTarget, + @SuppressWarnings("unused") @Cached("left.getClass()") Class cachedLeftClass, + @SuppressWarnings("unused") @Cached("right.getClass()") Class cachedRightClass, + @Exclusive @Cached GetClassNode getClassNode, + @Exclusive @Cached("create(name)") LookupSpecialMethodNode getattr) { + return doCallObject(frame, inliningTarget, left, right, getClassNode, getattr); } - @ImportStatic(PGuards.class) - @GenerateInline - @GenerateCached(false) - protected abstract static class GetEnclosingType extends Node { - public abstract Object execute(Node inliningTarget, Object callable); - - @Specialization - static Object doDescrs(BuiltinMethodDescriptor descriptor) { - return descriptor.getEnclosingType(); - } - - @Specialization - static Object doBuiltinFun(PBuiltinFunction fun) { - return fun.getEnclosingType(); - } - - @Specialization - static Object doBuiltinMethod(PBuiltinMethod a) { - return doBuiltinFun(a.getBuiltinFunction()); - } - - @Fallback - static Object doOthers(@SuppressWarnings("unused") Object callable) { - return null; - } + @Specialization(replaces = "callObjectGeneric") + @Megamorphic + @SuppressWarnings("truffle-static-method") + Object callObjectMegamorphic(VirtualFrame frame, Object left, Object right, + @Bind("this") Node inliningTarget, + @Exclusive @Cached GetClassNode getClassNode, + @Exclusive @Cached("create(name)") LookupSpecialMethodNode getattr) { + return doCallObject(frame, inliningTarget, left, right, getClassNode, getattr); } - public abstract TruffleString getName(); - - public abstract TruffleString getRname(); - - protected final CallBinaryMethodNode ensureDispatch() { - // this also serves as a branch profile - if (dispatchNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - dispatchNode = insert(CallBinaryMethodNode.create()); - } - return dispatchNode; - } - - protected final Object runErrorHandler(VirtualFrame frame, Object left, Object right) { - if (handler == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - handler = insert(handlerFactory.get()); + private Object doCallObject(VirtualFrame frame, Node inliningTarget, Object left, Object right, GetClassNode getClassNode, LookupSpecialMethodNode getattr) { + Object leftClass = getClassNode.execute(inliningTarget, left); + Object leftCallable = getattr.execute(frame, leftClass, left); + if (PGuards.isNoValue(leftCallable)) { + throw SpecialMethodNotFound.INSTANCE; } - return handler.execute(frame, left, right); + return ensureDispatch().executeObject(frame, leftCallable, left, right); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallNbNumbersBinaryNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallNbNumbersBinaryNode.java deleted file mode 100644 index 935585a3fe..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallNbNumbersBinaryNode.java +++ /dev/null @@ -1,517 +0,0 @@ -/* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.call.special; - -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; -import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.SLOT1BINFULL; -import static com.oracle.truffle.api.dsl.Cached.Shared; - -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.PNotImplemented; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode; -import com.oracle.graal.python.lib.GetMethodsFlagsNode; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.classes.IsSubtypeNode; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.util.Supplier; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; -import com.oracle.truffle.api.strings.TruffleString; - -// cpython://Objects/abstract.c#binary_op1 -// cpython://Objects/typeobject.c#SLOT1BINFULL -@ImportStatic({PythonOptions.class, SpecialMethodSlot.class}) -abstract class LookupAndCallNbNumbersBinaryNode extends LookupAndCallBinaryNode { - - LookupAndCallNbNumbersBinaryNode(Supplier handlerFactory) { - super(handlerFactory, false); - } - - private static Object lookupAttrId(VirtualFrame frame, Object obj, Object objClass, - LookupSpecialMethodSlotNode getattr) { - return getattr.execute(frame, objClass, obj); - } - - // cpython://Objects/abstract.c#binary_op - protected abstract static class BinaryOpNode extends LookupAndCallNbNumbersBinaryNode { - - protected final SpecialMethodSlot slot; - protected final SpecialMethodSlot rslot; - - BinaryOpNode(SpecialMethodSlot slot, SpecialMethodSlot rslot, Supplier handlerFactory) { - super(handlerFactory); - assert slot != null; - assert rslot != null; - this.slot = slot; - this.rslot = rslot; - } - - @Specialization(guards = {"left.getClass() == cachedLeftClass", "right.getClass() == cachedRightClass"}, limit = "5") - @SuppressWarnings("truffle-static-method") - Object binaryOpC(VirtualFrame frame, Object left, Object right, - @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached("left.getClass()") Class cachedLeftClass, - @SuppressWarnings("unused") @Cached("right.getClass()") Class cachedRightClass, - @Exclusive @Cached GetMethodsFlagsNode getMethodsFlagsNode, - @Exclusive @Cached GetClassNode getlClassNode, - @Exclusive @Cached GetClassNode getrClassNode, - @Exclusive @Cached InlinedConditionProfile p1, - @Exclusive @Cached InlinedConditionProfile p2, - @Exclusive @Cached BinaryOp1Node binaryOp1Node, - @Exclusive @Cached Slot1BINFULLNode slot1BINFULLNode) { - return binaryOp(frame, left, right, inliningTarget, getMethodsFlagsNode, getlClassNode, getrClassNode, p1, p2, - binaryOp1Node, slot1BINFULLNode); - } - - @Specialization(replaces = "binaryOpC") - @SuppressWarnings("truffle-static-method") - Object binaryOp(VirtualFrame frame, Object left, Object right, - @Bind("this") Node inliningTarget, - @Exclusive @Cached GetMethodsFlagsNode getMethodsFlagsNode, - @Exclusive @Cached GetClassNode getlClassNode, - @Exclusive @Cached GetClassNode getrClassNode, - @Exclusive @Cached InlinedConditionProfile p1, - @Exclusive @Cached InlinedConditionProfile p2, - @Exclusive @Cached BinaryOp1Node binaryOp1Node, - @Exclusive @Cached Slot1BINFULLNode slot1BINFULLNode) { - Object lClass = getlClassNode.execute(inliningTarget, left); - Object rClass = getrClassNode.execute(inliningTarget, right); - long lFlags = getMethodsFlagsNode.execute(inliningTarget, lClass); - long rFlags = getMethodsFlagsNode.execute(inliningTarget, rClass); - if (p1.profile(inliningTarget, ((lFlags | rFlags) & slot.getMethodsFlag()) != 0)) { - Object result; - if (p2.profile(inliningTarget, BinaryOp1Node.isBothSLOT1BINFULL(lFlags, rFlags) || doSLOT1BINFULL(slot, lFlags, rFlags))) { - result = slot1BINFULLNode.execute(frame, left, right, slot, rslot, lFlags, rFlags, lClass, rClass); - } else { - result = binaryOp1Node.execute(frame, left, right, slot, rslot, lFlags, rFlags, lClass, rClass); - } - if (result != PNotImplemented.NOT_IMPLEMENTED) { - return result; - } - } - return runErrorHandler(frame, left, right); - } - - @Override - public TruffleString getName() { - return slot.getName(); - } - - @Override - public TruffleString getRname() { - return rslot.getName(); - } - } - - @GenerateInline(inlineByDefault = true) - abstract static class DispatchSpecialMethodSlotNode extends Node { - - abstract Object execute(VirtualFrame frame, Node inliningTarget, Object callable, - Object leftValue, Object rightValue, Object lClass, SpecialMethodSlot op); - - @Specialization - static Object dispatch(VirtualFrame frame, Node inliningTarget, Object callable, - Object leftValue, Object rightValue, Object lClass, SpecialMethodSlot op, - @Cached InlinedConditionProfile isEnclosingProfile, - @Cached(inline = false) CallBinaryMethodNode dispatch, - @Cached(inline = false) IsSubtypeNode isSubtype, - @Cached GetEnclosingType getEnclosingType, - @Cached PRaiseNode.Lazy raiseNode, - @Cached GetNameNode getNameNode) { - // see descrobject.c/wrapperdescr_call() - Object enclosing = getEnclosingType.execute(inliningTarget, callable); - if (isEnclosingProfile.profile(inliningTarget, enclosing != null && !isSubtype.execute(lClass, enclosing))) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, op.getName(), getNameNode.execute(inliningTarget, lClass), leftValue); - } - return dispatch.executeObject(frame, callable, leftValue, rightValue); - } - } - - @SuppressWarnings("truffle-inlining") // footprint reduction 56 -> 38 - protected abstract static class BinaryOp1Node extends Node { - - abstract Object execute(VirtualFrame frame, Object left, Object right, - SpecialMethodSlot slot, SpecialMethodSlot rslot, - long lFlags, long rFlags, - Object lClass, Object rClass); - - protected static boolean isSLOT1BINFULL(long mflags) { - return (mflags & SLOT1BINFULL) != 0; - } - - protected static boolean canDoOp(SpecialMethodSlot slot, long mflags) { - return (mflags & slot.getMethodsFlag()) != 0; - } - - // This specialization implements the logic from cpython://Objects/abstract.c#binary_op1 - @Specialization(guards = { - "!isSLOT1BINFULL(vMethodsFlags)", - "canDoOp(slot, vMethodsFlags)", - "!canDoOp(slot, wMethodsFlags)", - }) - @SuppressWarnings("truffle-static-method") - Object binaryOp1vOnlySlot(VirtualFrame frame, Object v, Object w, - SpecialMethodSlot slot, @SuppressWarnings("unused") SpecialMethodSlot rslot, - @SuppressWarnings("unused") long vMethodsFlags, @SuppressWarnings("unused") long wMethodsFlags, - Object vClass, @SuppressWarnings("unused") Object wClass, - @Bind("this") Node node, - @Exclusive @Cached InlinedConditionProfile p1, - @Shared @Cached("create(slot)") LookupSpecialMethodSlotNode opSlot, - @Exclusive @Cached DispatchSpecialMethodSlotNode dispatchNode) { - Object slotv = lookupAttrId(frame, v, vClass, opSlot); - if (p1.profile(node, slotv != PNone.NO_VALUE)) { - // x = slotv(v, w); - return dispatchNode.execute(frame, node, slotv, v, w, vClass, slot); - } - return PNotImplemented.NOT_IMPLEMENTED; - } - - @Specialization(guards = { - "!isSLOT1BINFULL(wMethodsFlags)", - "!canDoOp(slot, vMethodsFlags)", - "canDoOp(slot, wMethodsFlags)", - }) - @SuppressWarnings("truffle-static-method") - Object binaryOp1wOnlySlot(VirtualFrame frame, Object v, Object w, - SpecialMethodSlot slot, @SuppressWarnings("unused") SpecialMethodSlot rslot, - @SuppressWarnings("unused") long vMethodsFlags, @SuppressWarnings("unused") long wMethodsFlags, - @SuppressWarnings("unused") Object vClass, Object wClass, - @Bind("this") Node node, - @Exclusive @Cached InlinedConditionProfile p2, - @Shared @Cached("create(slot)") LookupSpecialMethodSlotNode opSlot, - @Exclusive @Cached DispatchSpecialMethodSlotNode dispatchNode) { - Object slotw = lookupAttrId(frame, w, wClass, opSlot); - if (p2.profile(node, slotw != PNone.NO_VALUE)) { - // x = slotw(v, w); - // mq: TODO: swap back `v, w` once all specializations are covered (GR-<1????>) - return dispatchNode.execute(frame, node, slotw, w, v, wClass, slot); - } - return PNotImplemented.NOT_IMPLEMENTED; - } - - @Specialization(guards = { - "!isSLOT1BINFULL(vMethodsFlags)", - "!isSLOT1BINFULL(wMethodsFlags)", - "canDoOp(slot, vMethodsFlags)", - "canDoOp(slot, wMethodsFlags)", - }) - @SuppressWarnings("truffle-static-method") - Object binaryOp1fullSlots(VirtualFrame frame, Object v, Object w, - SpecialMethodSlot slot, @SuppressWarnings("unused") SpecialMethodSlot rslot, - @SuppressWarnings("unused") long vMethodsFlags, @SuppressWarnings("unused") long wMethodsFlags, - Object vClass, Object wClass, - @Bind("this") Node node, - @Shared @Cached("create(slot)") LookupSpecialMethodSlotNode opSlot, - @Exclusive @Cached InlinedConditionProfile p1, - @Exclusive @Cached InlinedConditionProfile p2, - @Exclusive @Cached InlinedConditionProfile p3, - @Exclusive @Cached InlinedConditionProfile p4, - @Exclusive @Cached IsSubtypeNode isSubtype, - @Exclusive @Cached AreSameCallables areSameCallables, - @Exclusive @Cached IsSameTypeNode isSameTypeNode, - @Exclusive @Cached DispatchSpecialMethodSlotNode dispatchNode) { - Object slotv = lookupAttrId(frame, v, vClass, opSlot); - Object slotw = PNone.NO_VALUE; - if (!isSameTypeNode.execute(node, wClass, vClass)) { - slotw = lookupAttrId(frame, w, wClass, opSlot); - if (areSameCallables.execute(node, slotv, slotw)) { - slotw = PNone.NO_VALUE; - } - } - - if (p1.profile(node, slotv != PNone.NO_VALUE)) { - Object x; - if (p3.profile(node, slotw != PNone.NO_VALUE && isSubtype.execute(frame, wClass, vClass))) { - // x = slotw(v, w); - x = dispatchNode.execute(frame, node, slotw, v, w, wClass, slot); - - if (x != PNotImplemented.NOT_IMPLEMENTED) { - return x; - } - slotw = PNone.NO_VALUE; - } - // x = slotv(v, w); - x = dispatchNode.execute(frame, node, slotv, v, w, vClass, slot); - if (p4.profile(node, maybeMissingSpecialization(x, slot, slotw, vClass, wClass))) { - x = dispatchNode.execute(frame, node, slotv, w, v, vClass, slot); - } - - if (x != PNotImplemented.NOT_IMPLEMENTED) { - return x; - } - } - if (p2.profile(node, slotw != PNone.NO_VALUE)) { - // x = slotw(v, w); - // mq: TODO: swap back `v, w` once all specializations are covered (GR-<1????>) - return dispatchNode.execute(frame, node, slotw, w, v, wClass, slot); - } - return PNotImplemented.NOT_IMPLEMENTED; - } - - protected static boolean isBothSLOT1BINFULL(long left, long right) { - return (left & right & SLOT1BINFULL) != 0; - } - - @Specialization(guards = { - "!isBothSLOT1BINFULL(vMethodsFlags, wMethodsFlags)", - "isSLOT1BINFULL(vMethodsFlags) || isSLOT1BINFULL(wMethodsFlags)", - "canDoOp(slot, vMethodsFlags)", - "canDoOp(slot, wMethodsFlags)", - }) - @SuppressWarnings("truffle-static-method") - Object binaryOp1full(VirtualFrame frame, Object v, Object w, - SpecialMethodSlot slot, SpecialMethodSlot rslot, - long vMethodsFlags, long wMethodsFlags, - Object vClass, Object wClass, - @Bind("this") Node node, - @Shared @Cached("create(slot)") LookupSpecialMethodSlotNode opSlot, - @Exclusive @Cached InlinedConditionProfile p1, - @Exclusive @Cached InlinedConditionProfile p2, - @Exclusive @Cached InlinedConditionProfile p3, - @Exclusive @Cached InlinedConditionProfile p4, - @Exclusive @Cached InlinedConditionProfile p5, - @Exclusive @Cached InlinedConditionProfile p6, - @Exclusive @Cached InlinedConditionProfile p7, - @Exclusive @Cached InlinedConditionProfile p8, - @Exclusive @Cached IsSubtypeNode isSubtype, - @Exclusive @Cached AreSameCallables areSameCallables, - @Exclusive @Cached IsSameTypeNode isSameTypeNode, - @Cached Slot1BINFULLNode slot1BINFULLNode, - @Exclusive @Cached DispatchSpecialMethodSlotNode dispatchNode) { - long op = slot.getMethodsFlag(); - boolean slotvIsBinFullOp = (vMethodsFlags & SLOT1BINFULL) != 0; - boolean slotwIsBinFullOp = (wMethodsFlags & SLOT1BINFULL) != 0; - Object slotv = PNone.NO_VALUE; - if ((vMethodsFlags & op) != 0) { - slotv = slotvIsBinFullOp ? null : lookupAttrId(frame, v, vClass, opSlot); - } - - Object slotw = PNone.NO_VALUE; - if (p5.profile(node, (wMethodsFlags & op) != 0 && !isSameTypeNode.execute(node, wClass, vClass))) { - slotw = p7.profile(node, slotwIsBinFullOp) ? null : lookupAttrId(frame, w, wClass, opSlot); - if (p6.profile(node, !slotvIsBinFullOp && !slotwIsBinFullOp && areSameCallables.execute(node, slotv, slotw))) { - slotw = PNone.NO_VALUE; - } - } - - if (p1.profile(node, slotv != PNone.NO_VALUE)) { - Object x; - if (p3.profile(node, slotw != PNone.NO_VALUE && isSubtype.execute(frame, wClass, vClass))) { - if (p7.profile(node, slotwIsBinFullOp)) { - x = slot1BINFULLNode.execute(frame, - v, w, slot, rslot, vMethodsFlags, wMethodsFlags, vClass, wClass); - } else { - // x = slotw(v, w); - x = dispatchNode.execute(frame, node, slotw, v, w, wClass, slot); - } - - if (x != PNotImplemented.NOT_IMPLEMENTED) { - return x; - } - slotw = PNone.NO_VALUE; - } - if (p8.profile(node, slotvIsBinFullOp)) { - x = slot1BINFULLNode.execute(frame, v, w, slot, rslot, vMethodsFlags, wMethodsFlags, vClass, wClass); - } else { - // x = slotv(v, w); - x = dispatchNode.execute(frame, node, slotv, v, w, vClass, slot); - if (p4.profile(node, maybeMissingSpecialization(x, slot, slotw, vClass, wClass))) { - x = dispatchNode.execute(frame, node, slotv, w, v, vClass, slot); - } - } - - if (x != PNotImplemented.NOT_IMPLEMENTED) { - return x; - } - } - if (p2.profile(node, slotw != PNone.NO_VALUE)) { - if (p7.profile(node, slotwIsBinFullOp)) { - return slot1BINFULLNode.execute(frame, v, w, slot, rslot, vMethodsFlags, wMethodsFlags, vClass, wClass); - } else { - // x = slotw(v, w); - // mq: TODO: swap back `v, w` once all specializations are covered (GR-<1????>) - return dispatchNode.execute(frame, node, slotw, w, v, wClass, slot); - } - } - return PNotImplemented.NOT_IMPLEMENTED; - } - - private static boolean maybeMissingSpecialization(Object result, SpecialMethodSlot slot, Object otherSlot, Object lClass, Object rClass) { - // Special case in our builtins since we might be missing some specializations. - // e.g. int builtins - return result == PNotImplemented.NOT_IMPLEMENTED && - otherSlot == PNone.NO_VALUE && - lClass == rClass && - (slot == SpecialMethodSlot.And || - slot == SpecialMethodSlot.Or || - slot == SpecialMethodSlot.Xor); - } - } - - protected static boolean doSLOT1BINFULL(SpecialMethodSlot slot, long left, long right) { - long op = slot.getMethodsFlag(); - return ((left & SLOT1BINFULL) != 0 && (left & op) != 0 && (right & op) == 0) || - ((right & SLOT1BINFULL) != 0 && (right & op) != 0 && (left & op) == 0); - } - - // This specialization implements the logic in cpython://Objects/typeobject.c#SLOT1BINFULL - @SuppressWarnings("truffle-inlining") // footprint reduction 48 -> 31 - protected abstract static class Slot1BINFULLNode extends Node { - - abstract Object execute(VirtualFrame frame, Object left, Object right, - SpecialMethodSlot slot, SpecialMethodSlot rslot, - long lFlags, long rFlags, - Object lClass, Object rClass); - - protected static boolean isSLOT1BINFULL(long mflags) { - return (mflags & SLOT1BINFULL) != 0; - } - - @Specialization(guards = {"isSLOT1BINFULL(lFlags)", "!isSLOT1BINFULL(rFlags)"}) - static Object slot1binfullLeftOnly(VirtualFrame frame, Object left, Object right, - SpecialMethodSlot slot, @SuppressWarnings("unused") SpecialMethodSlot rslot, - long lFlags, @SuppressWarnings("unused") long rFlags, - Object lClass, @SuppressWarnings("unused") Object rClass, - @Bind("this") Node inliningTarget, - @Exclusive @Cached InlinedConditionProfile p1, - @Shared @Cached("create(slot)") LookupSpecialMethodSlotNode opId, - @Exclusive @Cached DispatchSpecialMethodSlotNode dispatchNode) { - if (p1.profile(inliningTarget, (lFlags & SLOT1BINFULL) != 0)) { - Object leftCallable = lookupAttrId(frame, left, lClass, opId); - return dispatchNode.execute(frame, inliningTarget, leftCallable, left, right, lClass, slot); - } - return PNotImplemented.NOT_IMPLEMENTED; - } - - @Specialization(guards = {"!isSLOT1BINFULL(lFlags)", "isSLOT1BINFULL(rFlags)"}) - static Object slot1binfullRightOnly(VirtualFrame frame, Object left, Object right, - @SuppressWarnings("unused") SpecialMethodSlot slot, SpecialMethodSlot rslot, - @SuppressWarnings("unused") long lFlags, @SuppressWarnings("unused") long rFlags, - @SuppressWarnings("unused") Object lClass, Object rClass, - @Bind("this") Node inliningTarget, - @Exclusive @Cached InlinedConditionProfile p2, - @Shared @Cached("create(rslot)") LookupSpecialMethodSlotNode ropId, - @Exclusive @Cached DispatchSpecialMethodSlotNode dispatchNode) { - Object rOpRightCallable = lookupAttrId(frame, right, rClass, ropId); - if (p2.profile(inliningTarget, rOpRightCallable != PNone.NO_VALUE)) { - return dispatchNode.execute(frame, inliningTarget, rOpRightCallable, right, left, rClass, rslot); - } - return PNotImplemented.NOT_IMPLEMENTED; - } - - @Specialization(guards = {"isSLOT1BINFULL(lFlags)", "isSLOT1BINFULL(rFlags)"}) - static Object slot1binfull(VirtualFrame frame, Object left, Object right, - SpecialMethodSlot slot, SpecialMethodSlot rslot, - long lFlags, long rFlags, - Object lClass, Object rClass, - @Bind("this") Node inliningTarget, - @Shared @Cached("create(slot)") LookupSpecialMethodSlotNode opId, - @Shared @Cached("create(rslot)") LookupSpecialMethodSlotNode ropId, - @Exclusive @Cached InlinedConditionProfile p1, - @Exclusive @Cached InlinedConditionProfile p2, - @Exclusive @Cached InlinedConditionProfile p3, - @Exclusive @Cached InlinedConditionProfile p4, - @Exclusive @Cached InlinedConditionProfile p5, - @Exclusive @Cached InlinedConditionProfile p6, - @Exclusive @Cached InlinedConditionProfile p7, - @Cached IsSameTypeNode isSameTypeNode, - @Cached IsSubtypeNode isSubtype, - @Cached AreSameCallables areSameCallables, - @Exclusive @Cached DispatchSpecialMethodSlotNode dispatchNode) { - boolean pyIsType = isSameTypeNode.execute(inliningTarget, lClass, rClass); - boolean doRight = !pyIsType && (rFlags & SLOT1BINFULL) != 0; - Object rOpRightCallable = null; - if (p1.profile(inliningTarget, (lFlags & SLOT1BINFULL) != 0)) { - Object r; - if (p3.profile(inliningTarget, doRight && isSubtype.execute(frame, rClass, lClass))) { - // method_is_overloaded inlined - boolean isOverloaded; - rOpRightCallable = lookupAttrId(frame, right, rClass, ropId); - if (p2.profile(inliningTarget, rOpRightCallable != PNone.NO_VALUE)) { - Object rOpLeftCallable = lookupAttrId(frame, left, lClass, ropId); - if (p4.profile(inliningTarget, rOpLeftCallable == PNone.NO_VALUE)) { - isOverloaded = true; - } else { - isOverloaded = !areSameCallables.execute(inliningTarget, rOpLeftCallable, rOpRightCallable); - } - } else { - isOverloaded = false; - } - if (p5.profile(inliningTarget, isOverloaded)) { - r = dispatchNode.execute(frame, inliningTarget, rOpRightCallable, right, left, rClass, rslot); - if (r != PNotImplemented.NOT_IMPLEMENTED) { - return r; - } - doRight = false; - } - } - Object leftCallable = lookupAttrId(frame, left, lClass, opId); - if (p7.profile(inliningTarget, leftCallable != PNone.NO_VALUE)) { - r = dispatchNode.execute(frame, inliningTarget, leftCallable, left, right, lClass, slot); - if (r != PNotImplemented.NOT_IMPLEMENTED || pyIsType) { - return r; - } - } - } - if (p6.profile(inliningTarget, doRight)) { - if (rOpRightCallable == null) { - rOpRightCallable = lookupAttrId(frame, right, rClass, ropId); - } - if (p2.profile(inliningTarget, rOpRightCallable != PNone.NO_VALUE)) { - return dispatchNode.execute(frame, inliningTarget, rOpRightCallable, right, left, rClass, rslot); - } - } - return PNotImplemented.NOT_IMPLEMENTED; - } - } - -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallNonReversibleBinaryNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallNonReversibleBinaryNode.java deleted file mode 100644 index 6476c04568..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallNonReversibleBinaryNode.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.call.special; - -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.PNotImplemented; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.BinaryBuiltinDescriptor; -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode; -import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.util.Supplier; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.ReportPolymorphism.Megamorphic; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.strings.TruffleString; - -@ImportStatic(PythonOptions.class) -abstract class LookupAndCallNonReversibleBinaryNode extends LookupAndCallBinaryNode { - protected final SpecialMethodSlot slot; - protected final TruffleString name; - - LookupAndCallNonReversibleBinaryNode(TruffleString name, Supplier handlerFactory, boolean ignoreDescriptorException) { - super(handlerFactory, ignoreDescriptorException); - this.name = name; - this.slot = null; - } - - LookupAndCallNonReversibleBinaryNode(SpecialMethodSlot slot, Supplier handlerFactory, boolean ignoreDescriptorException) { - super(handlerFactory, ignoreDescriptorException); - // If the slot is reversible, use LookupAndCallReversibleBinaryNode via factory in - // LookupAndCallBinaryNode - assert slot.getReverse() == null; - this.name = slot.getName(); - this.slot = slot; - } - - protected final PythonBinaryBuiltinNode getBinaryBuiltin(PythonBuiltinClassType clazz) { - if (slot != null) { - Object attribute = slot.getValue(clazz); - if (attribute instanceof BinaryBuiltinDescriptor) { - return ((BinaryBuiltinDescriptor) attribute).createNode(); - } - // If the slot does not contain builtin, full lookup wouldn't find a builtin either - return null; - } - Object attribute = LookupAttributeInMRONode.Dynamic.getUncached().execute(clazz, name); - if (attribute instanceof PBuiltinFunction) { - PBuiltinFunction builtinFunction = (PBuiltinFunction) attribute; - if (PythonBinaryBuiltinNode.class.isAssignableFrom(builtinFunction.getBuiltinNodeFactory().getNodeClass())) { - return (PythonBinaryBuiltinNode) builtinFunction.getBuiltinNodeFactory().createNode(); - } - } - return null; - } - - protected static PythonBuiltinClassType getBuiltinClass(Node inliningTarget, Object receiver, GetClassNode getClassNode) { - Object clazz = getClassNode.execute(inliningTarget, receiver); - return clazz instanceof PythonBuiltinClassType ? (PythonBuiltinClassType) clazz : null; - } - - protected static boolean isClazz(Node inliningTarget, PythonBuiltinClassType clazz, Object receiver, GetClassNode getClassNode) { - return getClassNode.execute(inliningTarget, receiver) == clazz; - } - - // Object, Object - - @Specialization(guards = {"clazz != null", "function != null", "isClazz(inliningTarget, clazz, left, getClassNode)"}, limit = "getCallSiteInlineCacheMaxDepth()") - static Object callObjectBuiltin(VirtualFrame frame, Object left, Object right, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached GetClassNode getClassNode, - @SuppressWarnings("unused") @Cached("getBuiltinClass(this, left, getClassNode)") PythonBuiltinClassType clazz, - @Cached("getBinaryBuiltin(clazz)") PythonBinaryBuiltinNode function) { - return function.execute(frame, left, right); - } - - @Specialization(guards = {"left.getClass() == cachedLeftClass", "right.getClass() == cachedRightClass"}, limit = "5") - @SuppressWarnings("truffle-static-method") - Object callObjectGeneric(VirtualFrame frame, Object left, Object right, - @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached("left.getClass()") Class cachedLeftClass, - @SuppressWarnings("unused") @Cached("right.getClass()") Class cachedRightClass, - @Exclusive @Cached GetClassNode getClassNode, - @Exclusive @Cached("createLookup()") LookupSpecialBaseNode getattr) { - return doCallObject(frame, inliningTarget, left, right, getClassNode, getattr); - } - - @Specialization(replaces = "callObjectGeneric") - @Megamorphic - @SuppressWarnings("truffle-static-method") - Object callObjectMegamorphic(VirtualFrame frame, Object left, Object right, - @Bind("this") Node inliningTarget, - @Exclusive @Cached GetClassNode getClassNode, - @Exclusive @Cached("createLookup()") LookupSpecialBaseNode getattr) { - return doCallObject(frame, inliningTarget, left, right, getClassNode, getattr); - } - - private Object doCallObject(VirtualFrame frame, Node inliningTarget, Object left, Object right, GetClassNode getClassNode, LookupSpecialBaseNode getattr) { - Object leftClass = getClassNode.execute(inliningTarget, left); - Object leftCallable; - try { - leftCallable = getattr.execute(frame, leftClass, left); - } catch (PException e) { - if (ignoreDescriptorException) { - leftCallable = PNone.NO_VALUE; - } else { - throw e; - } - } - if (leftCallable == PNone.NO_VALUE) { - if (handlerFactory != null) { - return runErrorHandler(frame, left, right); - } else { - return PNotImplemented.NOT_IMPLEMENTED; - } - } - return ensureDispatch().executeObject(frame, leftCallable, left, right); - } - - @NeverDefault - protected final LookupSpecialBaseNode createLookup() { - if (slot != null) { - return LookupSpecialMethodSlotNode.create(slot); - } - return LookupSpecialMethodNode.create(name); - } - - @Override - public final TruffleString getName() { - return name; - } - - @Override - public final TruffleString getRname() { - return null; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallNonReversibleTernaryNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallNonReversibleTernaryNode.java deleted file mode 100644 index e6b0a0413f..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallNonReversibleTernaryNode.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.call.special; - -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.TernaryBuiltinDescriptor; -import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode; -import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.ReportPolymorphism.Megamorphic; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.strings.TruffleString; - -// cpython://Objects/abstract.c#ternary_op -// Order operations are tried until either a valid result or error: v.op(v,w,z), w.op(v,w,z), z.op(v,w,z) -@ImportStatic({SpecialMethodNames.class, PythonOptions.class}) -public abstract class LookupAndCallNonReversibleTernaryNode extends LookupAndCallTernaryNode { - - LookupAndCallNonReversibleTernaryNode(TruffleString name) { - super(name); - } - - LookupAndCallNonReversibleTernaryNode(SpecialMethodSlot slot) { - super(slot); - } - - protected static PythonBuiltinClassType getBuiltinClass(Node inliningTarget, Object receiver, GetClassNode getClassNode) { - Object clazz = getClassNode.execute(inliningTarget, receiver); - return clazz instanceof PythonBuiltinClassType ? (PythonBuiltinClassType) clazz : null; - } - - protected static boolean isClazz(Node inliningTarget, PythonBuiltinClassType clazz, Object receiver, GetClassNode getClassNode) { - return getClassNode.execute(inliningTarget, receiver) == clazz; - } - - protected final PythonTernaryBuiltinNode getTernaryBuiltin(PythonBuiltinClassType clazz) { - if (slot != null) { - Object attribute = slot.getValue(clazz); - if (attribute instanceof TernaryBuiltinDescriptor) { - return ((TernaryBuiltinDescriptor) attribute).createNode(); - } - // If the slot does not contain builtin, full lookup wouldn't find a builtin either - return null; - } - Object attribute = LookupAttributeInMRONode.Dynamic.getUncached().execute(clazz, name); - if (attribute instanceof PBuiltinFunction) { - PBuiltinFunction builtinFunction = (PBuiltinFunction) attribute; - if (PythonTernaryBuiltinNode.class.isAssignableFrom(builtinFunction.getBuiltinNodeFactory().getNodeClass())) { - return (PythonTernaryBuiltinNode) builtinFunction.getBuiltinNodeFactory().createNode(); - } - } - return null; - } - - @Specialization(guards = {"clazz != null", "function != null", "isClazz(inliningTarget, clazz, v, getClassNode)"}, limit = "getCallSiteInlineCacheMaxDepth()") - static Object callObjectBuiltin(VirtualFrame frame, Object v, Object w, Object z, - @SuppressWarnings("unused") @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached GetClassNode getClassNode, - @SuppressWarnings("unused") @Cached("getBuiltinClass(this, v, getClassNode)") PythonBuiltinClassType clazz, - @Cached("getTernaryBuiltin(clazz)") PythonTernaryBuiltinNode function) { - return function.execute(frame, v, w, z); - } - - @Specialization(guards = "arg1.getClass() == cachedArg1Class", limit = "getCallSiteInlineCacheMaxDepth()") - static Object callObject(VirtualFrame frame, Object arg1, Object arg2, Object arg3, - @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached("arg1.getClass()") Class cachedArg1Class, - @Exclusive @Cached GetClassNode getClassNode, - @Exclusive @Cached("createLookup()") LookupSpecialBaseNode getattr, - @Exclusive @Cached CallTernaryMethodNode dispatchNode) { - Object klass = getClassNode.execute(inliningTarget, arg1); - return dispatchNode.execute(frame, getattr.execute(frame, klass, arg1), arg1, arg2, arg3); - } - - @Specialization(replaces = "callObject") - @Megamorphic - static Object callObjectMegamorphic(VirtualFrame frame, Object arg1, Object arg2, Object arg3, - @Bind("this") Node inliningTarget, - @Exclusive @Cached GetClassNode getClassNode, - @Exclusive @Cached("createLookup()") LookupSpecialBaseNode getattr, - @Exclusive @Cached CallTernaryMethodNode dispatchNode) { - Object klass = getClassNode.execute(inliningTarget, arg1); - return dispatchNode.execute(frame, getattr.execute(frame, klass, arg1), arg1, arg2, arg3); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallReversibleBinaryNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallReversibleBinaryNode.java deleted file mode 100644 index 35c3e04b9a..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallReversibleBinaryNode.java +++ /dev/null @@ -1,288 +0,0 @@ -/* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.call.special; - -import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; - -import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.PNotImplemented; -import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.classes.IsSubtypeNode; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.util.Supplier; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.ReportPolymorphism.Megamorphic; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedBranchProfile; -import com.oracle.truffle.api.profiles.InlinedConditionProfile; -import com.oracle.truffle.api.strings.TruffleString; - -// cpython://Objects/abstract.c#binary_op1 -// Order operations are tried until either a valid result or error: w.op(v,w)[*], v.op(v,w), w.op(v,w) -// -// [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of v->ob_type -@ImportStatic(PythonOptions.class) -abstract class LookupAndCallReversibleBinaryNode extends LookupAndCallBinaryNode { - - protected final SpecialMethodSlot slot; - protected final SpecialMethodSlot rslot; - private final boolean alwaysCheckReverse; - - @Child private PRaiseNode raiseNode; - @Child private GetNameNode getNameNode; - @Child private CallBinaryMethodNode reverseDispatchNode; - - LookupAndCallReversibleBinaryNode(SpecialMethodSlot slot, SpecialMethodSlot rslot, Supplier handlerFactory, boolean alwaysCheckReverse, boolean ignoreDescriptorException) { - super(handlerFactory, ignoreDescriptorException); - assert slot != null; - assert rslot != null; - this.slot = slot; - this.rslot = rslot; - this.alwaysCheckReverse = alwaysCheckReverse; - } - - private PRaiseNode ensureRaiseNode() { - if (raiseNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - raiseNode = insert(PRaiseNode.create()); - } - return raiseNode; - } - - private GetNameNode ensureGetNameNode() { - if (getNameNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - getNameNode = insert(GetNameNode.create()); - } - return getNameNode; - } - - private CallBinaryMethodNode ensureReverseDispatch() { - // this also serves as a branch profile - if (reverseDispatchNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - reverseDispatchNode = insert(CallBinaryMethodNode.create()); - } - return reverseDispatchNode; - } - - @Specialization(guards = {"left.getClass() == cachedLeftClass", "right.getClass() == cachedRightClass"}, limit = "5") - @SuppressWarnings("truffle-static-method") - Object callObjectGenericR(VirtualFrame frame, Object left, Object right, - @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached("left.getClass()") Class cachedLeftClass, - @SuppressWarnings("unused") @Cached("right.getClass()") Class cachedRightClass, - @Exclusive @Cached("create(slot)") LookupSpecialMethodSlotNode getattr, - @Exclusive @Cached("create(rslot)") LookupSpecialMethodSlotNode getattrR, - @Exclusive @Cached GetClassNode getLeftClassNode, - @Exclusive @Cached GetClassNode getRightClassNode, - @Exclusive @Cached IsSameTypeNode isSameTypeNode, - @Exclusive @Cached IsSubtypeNode isSubtype, - @Exclusive @Cached InlinedConditionProfile hasLeftCallable, - @Exclusive @Cached InlinedConditionProfile hasRightCallable, - @Exclusive @Cached InlinedConditionProfile notImplementedProfile, - @Exclusive @Cached InlinedBranchProfile noLeftBuiltinClassType, - @Exclusive @Cached InlinedBranchProfile noRightBuiltinClassType, - @Exclusive @Cached InlinedBranchProfile gotResultBranch, - @Exclusive @Cached AreSameCallables areSameCallables, - @Exclusive @Cached GetEnclosingType getEnclosingType) { - return doCallObjectR(frame, inliningTarget, left, right, getattr, getattrR, getLeftClassNode, getRightClassNode, isSameTypeNode, isSubtype, hasLeftCallable, hasRightCallable, - notImplementedProfile, noLeftBuiltinClassType, noRightBuiltinClassType, gotResultBranch, areSameCallables, getEnclosingType); - } - - @Specialization(replaces = "callObjectGenericR") - @Megamorphic - @SuppressWarnings("truffle-static-method") - Object callObjectRMegamorphic(VirtualFrame frame, Object left, Object right, - @Bind("this") Node inliningTarget, - @Exclusive @Cached("create(slot)") LookupSpecialMethodSlotNode getattr, - @Exclusive @Cached("create(rslot)") LookupSpecialMethodSlotNode getattrR, - @Exclusive @Cached GetClassNode getLeftClassNode, - @Exclusive @Cached GetClassNode getRightClassNode, - @Exclusive @Cached IsSameTypeNode isSameTypeNode, - @Exclusive @Cached IsSubtypeNode isSubtype, - @Exclusive @Cached InlinedConditionProfile hasLeftCallable, - @Exclusive @Cached InlinedConditionProfile hasRightCallable, - @Exclusive @Cached InlinedConditionProfile notImplementedProfile, - @Exclusive @Cached InlinedBranchProfile noLeftBuiltinClassType, - @Exclusive @Cached InlinedBranchProfile noRightBuiltinClassType, - @Exclusive @Cached InlinedBranchProfile gotResultBranch, - @Exclusive @Cached AreSameCallables areSameCallables, - @Exclusive @Cached GetEnclosingType getEnclosingType) { - return doCallObjectR(frame, inliningTarget, left, right, getattr, getattrR, getLeftClassNode, getRightClassNode, isSameTypeNode, isSubtype, hasLeftCallable, hasRightCallable, - notImplementedProfile, noLeftBuiltinClassType, noRightBuiltinClassType, gotResultBranch, areSameCallables, getEnclosingType); - } - - private Object doCallObjectR(VirtualFrame frame, Node inliningTarget, Object left, Object right, LookupSpecialMethodSlotNode getattr, LookupSpecialMethodSlotNode getattrR, - GetClassNode getLeftClassNode, GetClassNode getRightClassNode, IsSameTypeNode isSameTypeNode, IsSubtypeNode isSubtype, - InlinedConditionProfile hasLeftCallable, InlinedConditionProfile hasRightCallable, InlinedConditionProfile notImplementedProfile, InlinedBranchProfile noLeftBuiltinClassType, - InlinedBranchProfile noRightBuiltinClassType, InlinedBranchProfile gotResultBranch, AreSameCallables areSameCallables, GetEnclosingType getEnclosingType) { - // This specialization implements the logic from cpython://Objects/abstract.c#binary_op1 - // (the structure is modelled closely on it), as well as the additional logic in - // cpython://Objects/typeobject.c#SLOT1BINFULL. The latter has the addition that it swaps - // the arguments around. The swapping of arguments is undone when the call ends up in a - // builtin function using a wrapper in CPython. We implement this reversal in our - // BuiltinFunctionRootNode. This is opposite to what CPython does (and more in line with - // what PyPy does), in that CPython always dispatches with the same argument order and has - // slot wrappers for heap types __r*__ methods to swap the arguments, but we don't wrap heap - // types' methods and instead have our swapping for the builtin types. - - Object result = PNotImplemented.NOT_IMPLEMENTED; - Object leftClass = getLeftClassNode.execute(inliningTarget, left); - Object leftCallable; - try { - leftCallable = getattr.execute(frame, leftClass, left); - } catch (PException e) { - if (ignoreDescriptorException) { - leftCallable = PNone.NO_VALUE; - } else { - throw e; - } - } - Object rightClass = getRightClassNode.execute(inliningTarget, right); - Object rightCallable; - try { - rightCallable = getattrR.execute(frame, rightClass, right); - } catch (PException e) { - if (ignoreDescriptorException) { - rightCallable = PNone.NO_VALUE; - } else { - throw e; - } - } - - if (!alwaysCheckReverse && areSameCallables.execute(inliningTarget, leftCallable, rightCallable)) { - rightCallable = PNone.NO_VALUE; - } - - if (hasLeftCallable.profile(inliningTarget, leftCallable != PNone.NO_VALUE)) { - if (hasRightCallable.profile(inliningTarget, rightCallable != PNone.NO_VALUE) && - (!isSameTypeNode.execute(inliningTarget, leftClass, rightClass) && isSubtype.execute(frame, rightClass, leftClass) || - isFlagSequenceCompat(inliningTarget, leftClass, rightClass, slot, noLeftBuiltinClassType, noRightBuiltinClassType))) { - result = dispatch(frame, inliningTarget, ensureReverseDispatch(), rightCallable, right, left, rightClass, rslot, isSubtype, getEnclosingType); - if (result != PNotImplemented.NOT_IMPLEMENTED) { - return result; - } - gotResultBranch.enter(inliningTarget); - rightCallable = PNone.NO_VALUE; - } - result = dispatch(frame, inliningTarget, ensureDispatch(), leftCallable, left, right, leftClass, slot, isSubtype, getEnclosingType); - if (result != PNotImplemented.NOT_IMPLEMENTED) { - return result; - } - gotResultBranch.enter(inliningTarget); - } - if (notImplementedProfile.profile(inliningTarget, rightCallable != PNone.NO_VALUE)) { - result = dispatch(frame, inliningTarget, ensureReverseDispatch(), rightCallable, right, left, rightClass, rslot, isSubtype, getEnclosingType); - } - if (handlerFactory != null && result == PNotImplemented.NOT_IMPLEMENTED) { - return runErrorHandler(frame, left, right); - } - return result; - } - - private Object dispatch(VirtualFrame frame, Node inliningTarget, CallBinaryMethodNode dispatch, Object callable, Object leftValue, - Object rightValue, Object leftClass, SpecialMethodSlot op, IsSubtypeNode isSubtype, GetEnclosingType getEnclosingType) { - // see descrobject.c/wrapperdescr_call() - Object enclosing = getEnclosingType.execute(inliningTarget, callable); - if (enclosing != null && !isSubtype.execute(leftClass, enclosing)) { - throw ensureRaiseNode().raise(TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, op.getName(), ensureGetNameNode().executeCached(leftClass), leftValue); - } - return dispatch.executeObject(frame, callable, leftValue, rightValue); - } - - @SuppressWarnings("unused") - private static boolean isFlagSequenceCompat(Node inliningTarget, Object leftClass, Object rightClass, SpecialMethodSlot slot, InlinedBranchProfile gotLeftBuiltinClassType, - InlinedBranchProfile gotRightBuiltinClassType) { - return false; - // Mul slot was converted to CPython like slots, this flag should never apply here - /*- - if (PGuards.isNativeClass(leftClass) || PGuards.isNativeClass(rightClass)) { - return false; - } - // see pypy descroperation.py#_make_binop_impl() - boolean isSeqBugCompatOperation = (slot == SpecialMethodSlot.Mul); - return isSeqBugCompatOperation && isFlagSequenceBugCompat(inliningTarget, leftClass, gotLeftBuiltinClassType) && !isFlagSequenceBugCompat(inliningTarget, rightClass, gotRightBuiltinClassType); - */ - } - - private static boolean isFlagSequenceBugCompat(Node inliningTarget, Object clazz, InlinedBranchProfile gotBuiltinClassType) { - PythonBuiltinClassType type = null; - if (clazz instanceof PythonBuiltinClassType) { - type = (PythonBuiltinClassType) clazz; - } else if (clazz instanceof PythonBuiltinClass) { - type = ((PythonBuiltinClass) clazz).getType(); - } else { - return false; - } - gotBuiltinClassType.enter(inliningTarget); - return type == PythonBuiltinClassType.PString || - type == PythonBuiltinClassType.PByteArray || - type == PythonBuiltinClassType.PBytes || - type == PythonBuiltinClassType.PList || - type == PythonBuiltinClassType.PTuple; - } - - @Override - public TruffleString getName() { - return slot.getName(); - } - - @Override - public TruffleString getRname() { - return rslot.getName(); - } - -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallReversibleTernaryNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallReversibleTernaryNode.java deleted file mode 100644 index 9bf7623ace..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallReversibleTernaryNode.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.call.special; - -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.PNotImplemented; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode; -import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.nodes.classes.IsSubtypeNode; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.util.Supplier; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.ReportPolymorphism.Megamorphic; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.InlinedBranchProfile; -import com.oracle.truffle.api.strings.TruffleString; - -@ImportStatic({SpecialMethodNames.class, PythonOptions.class}) -public abstract class LookupAndCallReversibleTernaryNode extends LookupAndCallTernaryNode { - - @Child private CallTernaryMethodNode reverseDispatchNode; - @Child private CallTernaryMethodNode thirdDispatchNode; - @Child protected LookupSpecialMethodNode getThirdAttrNode; - - @Child protected NotImplementedHandler handler; - protected final Supplier handlerFactory; - - LookupAndCallReversibleTernaryNode(TruffleString name, Supplier handlerFactory) { - super(name); - this.handlerFactory = handlerFactory; - } - - public LookupAndCallReversibleTernaryNode(SpecialMethodSlot slot, Supplier handlerFactory) { - super(slot); - this.handlerFactory = handlerFactory; - } - - @Specialization(guards = "v.getClass() == cachedVClass", limit = "getCallSiteInlineCacheMaxDepth()") - @SuppressWarnings("truffle-static-method") - Object callObjectR(VirtualFrame frame, Object v, Object w, Object z, - @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached("v.getClass()") Class cachedVClass, - @Exclusive @Cached("createLookup()") LookupSpecialBaseNode getattr, - @Exclusive @Cached("createLookup()") LookupSpecialBaseNode getattrR, - @Exclusive @Cached GetClassNode getClass, - @Exclusive @Cached GetClassNode getClassR, - @Exclusive @Cached GetClassNode getThirdClass, - @Exclusive @Cached IsSubtypeNode isSubtype, - @Exclusive @Cached IsSameTypeNode isSameTypeNode, - @Exclusive @Cached InlinedBranchProfile notImplementedBranch, - @Exclusive @Cached CallTernaryMethodNode dispatchNode) { - return doCallObjectR(frame, inliningTarget, v, w, z, getattr, getattrR, getClass, getClassR, getThirdClass, isSubtype, isSameTypeNode, notImplementedBranch, dispatchNode); - } - - @Specialization(replaces = "callObjectR") - @Megamorphic - @SuppressWarnings("truffle-static-method") - Object callObjectRMegamorphic(VirtualFrame frame, Object v, Object w, Object z, - @Bind("this") Node inliningTarget, - @Exclusive @Cached("createLookup()") LookupSpecialBaseNode getattr, - @Exclusive @Cached("createLookup()") LookupSpecialBaseNode getattrR, - @Exclusive @Cached GetClassNode getClass, - @Exclusive @Cached GetClassNode getClassR, - @Exclusive @Cached GetClassNode getThirdClass, - @Exclusive @Cached IsSubtypeNode isSubtype, - @Exclusive @Cached IsSameTypeNode isSameTypeNode, - @Exclusive @Cached InlinedBranchProfile notImplementedBranch, - @Exclusive @Cached CallTernaryMethodNode dispatchNode) { - return doCallObjectR(frame, inliningTarget, v, w, z, getattr, getattrR, getClass, getClassR, getThirdClass, isSubtype, isSameTypeNode, notImplementedBranch, dispatchNode); - } - - private Object doCallObjectR(VirtualFrame frame, Node inliningTarget, Object v, Object w, Object z, LookupSpecialBaseNode getattr, - LookupSpecialBaseNode getattrR, GetClassNode getClass, GetClassNode getClassR, GetClassNode getThirdClass, - IsSubtypeNode isSubtype, IsSameTypeNode isSameTypeNode, InlinedBranchProfile notImplementedBranch, - CallTernaryMethodNode dispatchNode) { - // c.f. mostly slot_nb_power and wrap_ternaryfunc_r. like - // cpython://Object/abstract.c#ternary_op we try all three combinations, and the structure - // of this method is modeled after this. However, this method also merges the logic from - // slot_nb_power/wrap_ternaryfunc_r in that it swaps arguments around. The reversal is - // undone for builtin functions in BuiltinFunctionRootNode, just like it would be undone in - // CPython using its slot wrappers - Object leftClass = getClass.execute(inliningTarget, v); - Object rightClass = getClassR.execute(inliningTarget, w); - - Object result = PNotImplemented.NOT_IMPLEMENTED; - Object leftCallable = getattr.execute(frame, leftClass, v); - Object rightCallable = PNone.NO_VALUE; - - if (!isSameTypeNode.execute(inliningTarget, leftClass, rightClass)) { - rightCallable = getattrR.execute(frame, rightClass, w); - if (rightCallable == leftCallable) { - rightCallable = PNone.NO_VALUE; - } - } - if (leftCallable != PNone.NO_VALUE) { - if (rightCallable != PNone.NO_VALUE && isSubtype.execute(frame, rightClass, leftClass)) { - result = ensureReverseDispatch().execute(frame, rightCallable, v, w, z); - if (result != PNotImplemented.NOT_IMPLEMENTED) { - return result; - } - rightCallable = PNone.NO_VALUE; - } - result = dispatchNode.execute(frame, leftCallable, v, w, z); - if (result != PNotImplemented.NOT_IMPLEMENTED) { - return result; - } - } - if (rightCallable != PNone.NO_VALUE) { - result = ensureReverseDispatch().execute(frame, rightCallable, v, w, z); - if (result != PNotImplemented.NOT_IMPLEMENTED) { - return result; - } - } - - Object zCallable = ensureGetAttrZ().execute(frame, getThirdClass.execute(inliningTarget, z), z); - if (zCallable != PNone.NO_VALUE && zCallable != leftCallable && zCallable != rightCallable) { - result = ensureThirdDispatch().execute(frame, zCallable, v, w, z); - if (result != PNotImplemented.NOT_IMPLEMENTED) { - return result; - } - } - - notImplementedBranch.enter(inliningTarget); - if (handlerFactory != null) { - if (handler == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - handler = insert(handlerFactory.get()); - } - return handler.execute(v, w, z); - } - return result; - } - - protected CallTernaryMethodNode ensureReverseDispatch() { - // this also serves as a branch profile - if (reverseDispatchNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - reverseDispatchNode = insert(CallTernaryMethodNode.create()); - } - return reverseDispatchNode; - } - - protected CallTernaryMethodNode ensureThirdDispatch() { - // this also serves as a branch profile - if (thirdDispatchNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - thirdDispatchNode = insert(CallTernaryMethodNode.create()); - } - return thirdDispatchNode; - } - - protected LookupSpecialMethodNode ensureGetAttrZ() { - // this also serves as a branch profile - if (getThirdAttrNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - getThirdAttrNode = insert(LookupSpecialMethodNode.create(name)); - } - return getThirdAttrNode; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallTernaryNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallTernaryNode.java deleted file mode 100644 index 07ca21e71c..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallTernaryNode.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.call.special; - -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.util.Supplier; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.strings.TruffleString; - -// actual implementation is in the subclasses: one for reversible, other for non-reversible. -@ImportStatic({SpecialMethodNames.class, PythonOptions.class}) -public abstract class LookupAndCallTernaryNode extends Node { - public abstract static class NotImplementedHandler extends PNodeWithContext { - public abstract Object execute(Object arg, Object arg2, Object arg3); - } - - protected final TruffleString name; - protected final SpecialMethodSlot slot; - - public abstract Object execute(VirtualFrame frame, Object arg1, Object arg2, Object arg3); - - @NeverDefault - public static LookupAndCallTernaryNode create(TruffleString name) { - // Use SpecialMethodSlot overload for special slots, if there is a need to create - // LookupAndCallBinaryNode for dynamic name, then we should change this method or the caller - // to try to lookup a slot and use that if found - assert SpecialMethodSlot.findSpecialSlotUncached(name) == null : name; - return LookupAndCallNonReversibleTernaryNodeGen.create(name); - } - - @NeverDefault - public static LookupAndCallTernaryNode create(SpecialMethodSlot slot) { - return LookupAndCallNonReversibleTernaryNodeGen.create(slot); - } - - @NeverDefault - public static LookupAndCallTernaryNode createReversible(TruffleString name, Supplier handlerFactory) { - return LookupAndCallReversibleTernaryNodeGen.create(name, handlerFactory); - } - - @NeverDefault - public static LookupAndCallTernaryNode createReversible(SpecialMethodSlot slot, Supplier handlerFactory) { - return LookupAndCallReversibleTernaryNodeGen.create(slot, handlerFactory); - } - - LookupAndCallTernaryNode(TruffleString name) { - this.name = name; - this.slot = null; - } - - LookupAndCallTernaryNode(SpecialMethodSlot slot) { - this.slot = slot; - this.name = slot.getName(); - } - - @NeverDefault - protected final LookupSpecialBaseNode createLookup() { - if (slot != null) { - return LookupSpecialMethodSlotNode.create(slot); - } - return LookupSpecialMethodNode.create(name); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallUnaryNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallUnaryNode.java index 6b0549a2b0..c4ec60d959 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallUnaryNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallUnaryNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,11 +42,10 @@ import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.UnaryBuiltinDescriptor; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode; +import com.oracle.graal.python.nodes.expression.UnaryOpNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.runtime.PythonOptions; @@ -66,27 +65,26 @@ import com.oracle.truffle.api.strings.TruffleString; @ImportStatic(PythonOptions.class) -public abstract class LookupAndCallUnaryNode extends Node { +public abstract class LookupAndCallUnaryNode extends UnaryOpNode { public abstract static class NoAttributeHandler extends PNodeWithContext { public abstract Object execute(Object receiver); } protected final TruffleString name; - private final SpecialMethodSlot slot; protected final Supplier handlerFactory; @Child private NoAttributeHandler handler; public abstract Object executeObject(VirtualFrame frame, Object receiver); - @NeverDefault - public static LookupAndCallUnaryNode create(TruffleString name) { - return LookupAndCallUnaryNodeGen.create(name, null); + @Override + public Object execute(VirtualFrame frame, Object receiver) { + return executeObject(frame, receiver); } @NeverDefault - public static LookupAndCallUnaryNode create(SpecialMethodSlot slot) { - return LookupAndCallUnaryNodeGen.create(slot, null); + public static LookupAndCallUnaryNode create(TruffleString name) { + return LookupAndCallUnaryNodeGen.create(name, null); } @NeverDefault @@ -94,19 +92,7 @@ public static LookupAndCallUnaryNode create(TruffleString name, Supplier handlerFactory) { - return LookupAndCallUnaryNodeGen.create(slot, handlerFactory); - } - - LookupAndCallUnaryNode(SpecialMethodSlot slot, Supplier handlerFactory) { - this.slot = slot; - this.name = slot.getName(); - this.handlerFactory = handlerFactory; - } - LookupAndCallUnaryNode(TruffleString name, Supplier handlerFactory) { - this.slot = null; this.name = name; this.handlerFactory = handlerFactory; } @@ -116,14 +102,6 @@ public TruffleString getMethodName() { } protected final PythonUnaryBuiltinNode getUnaryBuiltin(PythonBuiltinClassType clazz) { - if (slot != null) { - Object attribute = slot.getValue(clazz); - if (attribute instanceof UnaryBuiltinDescriptor) { - return ((UnaryBuiltinDescriptor) attribute).createNode(); - } - // If the slot does not contain builtin, full lookup wouldn't find a builtin either - return null; - } Object attribute = LookupAttributeInMRONode.Dynamic.getUncached().execute(clazz, name); if (attribute instanceof PBuiltinFunction) { PBuiltinFunction builtinFunction = (PBuiltinFunction) attribute; @@ -159,7 +137,7 @@ Object callObjectGeneric(VirtualFrame frame, Object receiver, @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Cached("receiver.getClass()") Class cachedClass, @Shared @Cached GetClassNode getClassNode, - @Shared @Cached("createLookup()") LookupSpecialBaseNode getattr, + @Shared @Cached("create(name)") LookupSpecialMethodNode getattr, @Shared @Cached CallUnaryMethodNode dispatchNode) { return doCallObject(frame, inliningTarget, receiver, getClassNode, getattr, dispatchNode); } @@ -170,7 +148,7 @@ Object callObjectGeneric(VirtualFrame frame, Object receiver, Object callObjectMegamorphic(VirtualFrame frame, Object receiver, @Bind("this") Node inliningTarget, @Shared @Cached GetClassNode getClassNode, - @Shared @Cached("createLookup()") LookupSpecialBaseNode getattr, + @Shared @Cached("create(name)") LookupSpecialMethodNode getattr, @Shared @Cached CallUnaryMethodNode dispatchNode) { return doCallObject(frame, inliningTarget, receiver, getClassNode, getattr, dispatchNode); } @@ -179,7 +157,7 @@ protected Class getObjectClass(Object object) { return object.getClass(); } - private Object doCallObject(VirtualFrame frame, Node inliningTarget, Object receiver, GetClassNode getClassNode, LookupSpecialBaseNode getattr, CallUnaryMethodNode dispatchNode) { + private Object doCallObject(VirtualFrame frame, Node inliningTarget, Object receiver, GetClassNode getClassNode, LookupSpecialMethodNode getattr, CallUnaryMethodNode dispatchNode) { Object attr = getattr.execute(frame, getClassNode.execute(inliningTarget, receiver), receiver); if (attr == PNone.NO_VALUE) { if (handlerFactory != null) { @@ -195,14 +173,6 @@ private Object doCallObject(VirtualFrame frame, Node inliningTarget, Object rece } } - @NeverDefault - protected final LookupSpecialBaseNode createLookup() { - if (slot != null) { - return LookupSpecialMethodSlotNode.create(slot); - } - return LookupSpecialMethodNode.create(name); - } - @GenerateUncached @SuppressWarnings("truffle-inlining") // footprint reduction 36 -> 20 public abstract static class LookupAndCallUnaryDynamicNode extends PNodeWithContext { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallVarargsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallVarargsNode.java deleted file mode 100644 index 56bdeab352..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupAndCallVarargsNode.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.call.special; - -import com.oracle.graal.python.builtins.objects.function.PKeyword; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.ReportPolymorphism.Megamorphic; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.strings.TruffleString; - -public abstract class LookupAndCallVarargsNode extends Node { - protected final TruffleString name; - - public abstract Object execute(VirtualFrame frame, Object callable, Object[] arguments); - - @NeverDefault - public static LookupAndCallVarargsNode create(TruffleString name) { - return LookupAndCallVarargsNodeGen.create(name); - } - - LookupAndCallVarargsNode(TruffleString name) { - this.name = name; - } - - @Specialization(guards = {"callable.getClass() == cachedClass"}, limit = "3") - static Object callObject(VirtualFrame frame, Object callable, Object[] arguments, - @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Cached("callable.getClass()") Class cachedClass, - @Shared @Cached GetClassNode getClassNode, - @Shared @Cached("create(name)") LookupSpecialMethodNode getattr, - @Shared @Cached CallVarargsMethodNode dispatchNode) { - return dispatchNode.execute(frame, getattr.execute(frame, getClassNode.execute(inliningTarget, callable), callable), arguments, PKeyword.EMPTY_KEYWORDS); - } - - @Specialization(replaces = "callObject") - @InliningCutoff - @Megamorphic - static Object callObjectMegamorphic(VirtualFrame frame, Object callable, Object[] arguments, - @Bind("this") Node inliningTarget, - @Shared @Cached GetClassNode getClassNode, - @Shared @Cached("create(name)") LookupSpecialMethodNode getattr, - @Shared @Cached CallVarargsMethodNode dispatchNode) { - return dispatchNode.execute(frame, getattr.execute(frame, getClassNode.execute(inliningTarget, callable), callable), arguments, PKeyword.EMPTY_KEYWORDS); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupSpecialBaseNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupSpecialBaseNode.java deleted file mode 100644 index e7922117a9..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupSpecialBaseNode.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.call.special; - -import com.oracle.truffle.api.frame.Frame; -import com.oracle.truffle.api.nodes.Node; - -public abstract class LookupSpecialBaseNode extends Node { - public abstract Object execute(Frame frame, Object type, Object receiver); -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupSpecialMethodNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupSpecialMethodNode.java index cb6df06c89..130c97d3af 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupSpecialMethodNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupSpecialMethodNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,6 +40,7 @@ */ package com.oracle.graal.python.nodes.call.special; +import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -60,13 +61,15 @@ * differentiate it from the unbound case. {@link CallUnaryMethodNode} and other method calling * nodes handle this wrapper. */ -public abstract class LookupSpecialMethodNode extends LookupSpecialBaseNode { +public abstract class LookupSpecialMethodNode extends PNodeWithContext { protected final TruffleString name; public LookupSpecialMethodNode(TruffleString name) { this.name = name; } + public abstract Object execute(Frame frame, Object type, Object receiver); + @NeverDefault public static LookupSpecialMethodNode create(TruffleString name) { return LookupSpecialMethodNodeGen.create(name); @@ -87,8 +90,8 @@ public abstract static class Dynamic extends Node { public abstract Object execute(Frame frame, Node inliningTarget, Object type, TruffleString name, Object receiver); - public static Object executeUncached(Frame frame, Object type, TruffleString name, Object receiver) { - return LookupSpecialMethodNodeGen.DynamicNodeGen.getUncached().execute(frame, null, type, name, receiver); + public static Object executeUncached(Object type, TruffleString name, Object receiver) { + return LookupSpecialMethodNodeGen.DynamicNodeGen.getUncached().execute(null, null, type, name, receiver); } @Specialization diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupSpecialMethodSlotNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupSpecialMethodSlotNode.java deleted file mode 100644 index 3e3c6bd5ba..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/LookupSpecialMethodSlotNode.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.call.special; - -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.Frame; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; - -/** - * The same as {@link LookupSpecialMethodNode}, but this searches the special slots first. On top of - * the possible types of return values of {@link LookupSpecialMethodNode}, this node may also return - * {@link BuiltinMethodDescriptor}, which all the {@link CallBinaryMethodNode} and similar should - * handle as well. - */ -public abstract class LookupSpecialMethodSlotNode extends LookupSpecialBaseNode { - protected abstract static class CachedLookup extends LookupSpecialMethodSlotNode { - protected final SpecialMethodSlot slot; - - public CachedLookup(SpecialMethodSlot slot) { - this.slot = slot; - } - - @Specialization - Object lookup(VirtualFrame frame, Object type, Object receiver, - @Bind("this") Node inliningTarget, - @Cached(parameters = "slot") LookupCallableSlotInMRONode lookupSlot, - @Cached MaybeBindDescriptorNode bind) { - return bind.execute(frame, inliningTarget, lookupSlot.execute(type), receiver, type); - } - } - - @NeverDefault - public static LookupSpecialMethodSlotNode create(SpecialMethodSlot slot) { - return LookupSpecialMethodSlotNodeFactory.CachedLookupNodeGen.create(slot); - } - - private static final class UncachedLookup extends LookupSpecialMethodSlotNode { - protected final LookupCallableSlotInMRONode lookup; - - public UncachedLookup(SpecialMethodSlot slot) { - this.lookup = LookupCallableSlotInMRONode.getUncached(slot); - } - - @Override - public Object execute(Frame frame, Object type, Object receiver) { - return executeImpl(type, receiver); - } - - @TruffleBoundary - private Object executeImpl(Object type, Object receiver) { - return MaybeBindDescriptorNode.executeUncached(null, lookup.execute(type), receiver, type); - } - - @Override - public boolean isAdoptable() { - return false; - } - - private static final UncachedLookup[] UNCACHEDS = new UncachedLookup[SpecialMethodSlot.values().length]; - static { - SpecialMethodSlot[] values = SpecialMethodSlot.values(); - for (int i = 0; i < values.length; i++) { - SpecialMethodSlot slot = values[i]; - UNCACHEDS[i] = new UncachedLookup(slot); - } - } - } - - public static LookupSpecialMethodSlotNode getUncached(SpecialMethodSlot slot) { - return UncachedLookup.UNCACHEDS[slot.ordinal()]; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/MaybeBindDescriptorNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/MaybeBindDescriptorNode.java index 117967d873..4efcba0dc6 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/MaybeBindDescriptorNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/MaybeBindDescriptorNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,11 +41,9 @@ package com.oracle.graal.python.nodes.call.special; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor; import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction; import com.oracle.graal.python.builtins.objects.function.PFunction; import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; import com.oracle.graal.python.builtins.objects.type.TpSlots; import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode; import com.oracle.graal.python.builtins.objects.type.slots.TpSlotDescrGet.CallSlotDescrGet; @@ -55,7 +53,6 @@ import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; @@ -68,7 +65,6 @@ @GenerateUncached @GenerateInline @GenerateCached(false) -@ImportStatic(SpecialMethodSlot.class) public abstract class MaybeBindDescriptorNode extends PNodeWithContext { public abstract Object execute(Frame frame, Node inliningTarget, Object descriptor, Object receiver, Object receiverType); @@ -82,11 +78,6 @@ static Object doNoValue(Object descriptor, @SuppressWarnings("unused") Object re return descriptor; } - @Specialization - static Object doBuiltin(BuiltinMethodDescriptor descriptor, @SuppressWarnings("unused") Object receiver, @SuppressWarnings("unused") Object receiverType) { - return descriptor; - } - @Specialization static Object doBuiltin(PBuiltinFunction descriptor, @SuppressWarnings("unused") Object receiver, @SuppressWarnings("unused") Object receiverType) { return descriptor; @@ -103,8 +94,7 @@ static Object doFunction(PFunction descriptor, @SuppressWarnings("unused") Objec } public static boolean isMethodDescriptor(Object descriptor) { - return descriptor instanceof BuiltinMethodDescriptor || (descriptor instanceof PBuiltinFunction pbf && !pbf.needsDeclaringType()) || - descriptor instanceof PFunction; + return (descriptor instanceof PBuiltinFunction pbf && !pbf.needsDeclaringType()) || descriptor instanceof PFunction; } public static boolean needsToBind(Object descriptor) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/SpecialMethodNotFound.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/SpecialMethodNotFound.java new file mode 100644 index 0000000000..04ed6925b8 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/SpecialMethodNotFound.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.call.special; + +import com.oracle.truffle.api.nodes.ControlFlowException; + +/** + * Thrown from {@code LookupAndCallNAry} nodes when the method does not exist. + */ +public final class SpecialMethodNotFound extends ControlFlowException { + public static final SpecialMethodNotFound INSTANCE = new SpecialMethodNotFound(); + + private SpecialMethodNotFound() { + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/classes/AbstractObjectGetBasesNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/classes/AbstractObjectGetBasesNode.java index 0a7f68af11..42f8123f57 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/classes/AbstractObjectGetBasesNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/classes/AbstractObjectGetBasesNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,72 +41,32 @@ package com.oracle.graal.python.nodes.classes; import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___BASES__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___GETATTRIBUTE__; import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.lib.PyObjectGetAttr; +import com.oracle.graal.python.lib.PyObjectLookupAttr; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.nodes.attributes.LookupInheritedAttributeNode; -import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +@GenerateInline +@GenerateCached(false) @GenerateUncached -@ImportStatic({SpecialMethodNames.class}) -@SuppressWarnings("truffle-inlining") // footprint reduction 44 -> 26 public abstract class AbstractObjectGetBasesNode extends PNodeWithContext { - @NeverDefault - public static AbstractObjectGetBasesNode create() { - return AbstractObjectGetBasesNodeGen.create(); - } - - protected abstract PTuple executeInternal(Frame frame, Object cls); - - public final PTuple execute(VirtualFrame frame, Object cls) { - return executeInternal(frame, cls); - } - @Specialization(guards = "!isUncachedNode()") - static PTuple getBasesCached(VirtualFrame frame, Object cls, - @Bind("this") Node inliningTarget, - @Cached PyObjectGetAttr getAttributeNode, - @Exclusive @Cached IsBuiltinObjectProfile exceptionMaskProfile) { - try { - Object bases = getAttributeNode.execute(frame, inliningTarget, cls, T___BASES__); - if (bases instanceof PTuple) { - return (PTuple) bases; - } - } catch (PException pe) { - pe.expectAttributeError(inliningTarget, exceptionMaskProfile); - } - return null; - } + public abstract PTuple execute(Frame frame, Node inliningTarget, Object cls); - @Specialization(replaces = "getBasesCached") - static PTuple getBasesUncached(VirtualFrame frame, Object cls, - @Bind("this") Node inliningTarget, - @Cached LookupInheritedAttributeNode.Dynamic lookupGetattributeNode, - @Cached CallNode callGetattributeNode, - @Exclusive @Cached IsBuiltinObjectProfile exceptionMaskProfile) { - Object getattr = lookupGetattributeNode.execute(inliningTarget, cls, T___GETATTRIBUTE__); - try { - Object bases = callGetattributeNode.execute(frame, getattr, cls, T___BASES__); - if (bases instanceof PTuple) { - return (PTuple) bases; - } - } catch (PException pe) { - pe.expectAttributeError(inliningTarget, exceptionMaskProfile); + @Specialization + static PTuple getBasesCached(VirtualFrame frame, Node inliningTarget, Object cls, + @Cached PyObjectLookupAttr lookupAttr) { + Object bases = lookupAttr.execute(frame, inliningTarget, cls, T___BASES__); + if (bases instanceof PTuple) { + return (PTuple) bases; } return null; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/classes/AbstractObjectIsSubclassNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/classes/AbstractObjectIsSubclassNode.java index 2d78aee141..6084e71f71 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/classes/AbstractObjectIsSubclassNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/classes/AbstractObjectIsSubclassNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -106,7 +106,7 @@ static boolean doSubclass(VirtualFrame frame, @SuppressWarnings("unused") Object @Cached AbstractObjectIsSubclassNode isSubclassNode, @Shared @Cached GetObjectArrayNode getObjectArrayNode) { CompilerAsserts.partialEvaluationConstant(depth); - PTuple bases = getBasesNode.execute(frame, cachedDerived); + PTuple bases = getBasesNode.execute(frame, inliningTarget, cachedDerived); if (bases == null || isEmpty(bases)) { return false; } @@ -158,7 +158,7 @@ static boolean doGeneric(VirtualFrame frame, Object derived, Object cls, int dep return true; } - PTuple bases = getBasesNode.execute(frame, derived); + PTuple bases = getBasesNode.execute(frame, inliningTarget, derived); if (bases == null || isEmpty(bases)) { return false; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/classes/IsSubtypeNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/classes/IsSubtypeNode.java index 5522c20922..78869215aa 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/classes/IsSubtypeNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/classes/IsSubtypeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,12 +46,9 @@ import com.oracle.graal.python.builtins.objects.type.TypeNodes; import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetMroStorageNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode; -import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.runtime.exception.PythonErrorType; import com.oracle.graal.python.runtime.sequence.storage.MroSequenceStorage; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; @@ -64,25 +61,24 @@ import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.ReportPolymorphism.Megamorphic; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.Frame; -import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.ExplodeLoop; import com.oracle.truffle.api.nodes.ExplodeLoop.LoopExplosionKind; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.profiles.InlinedConditionProfile; +/** + * Equivalent of CPython's {@code PyType_IsSubtype}. + */ @GenerateUncached @ImportStatic({PythonOptions.class, PGuards.class}) @SuppressWarnings("truffle-inlining") // footprint reduction 84 -> 67 public abstract class IsSubtypeNode extends PNodeWithContext { - protected abstract boolean executeInternal(Frame frame, Object derived, Object cls); - - public final boolean execute(VirtualFrame frame, Object derived, Object cls) { - return executeInternal(frame, derived, cls); - } + protected abstract boolean executeInternal(Object derived, Object cls); public final boolean execute(Object derived, Object cls) { - return executeInternal(null, derived, cls); + assert TypeNodes.IsTypeNode.executeUncached(derived); + assert TypeNodes.IsTypeNode.executeUncached(cls); + return executeInternal(derived, cls); } protected static boolean isSameType(Node inliningTarget, IsSameTypeNode isSameTypeNode, Object cls, Object cachedCls) { @@ -191,7 +187,6 @@ static boolean isVariableSubtypeOfConstantTypeCachedMultiContext(@SuppressWarnin @Specialization(guards = { "isSingleContext()", - "isTypeDerived.execute(inliningTarget, derived)", "isTypeCls.execute(inliningTarget, cls)", "isSameType(inliningTarget, isSameDerivedNode, derived, cachedDerived)", "isSameType(inliningTarget, isSameClsNode, cls, cachedCls)", }, limit = "getVariableArgumentInlineCacheLimit()", replaces = { @@ -206,8 +201,6 @@ static boolean isSubtypeOfCached(Object derived, Object cls, @Bind("this") Node inliningTarget, @Cached("derived") Object cachedDerived, @Cached("cls") Object cachedCls, - @Shared @Cached TypeNodes.IsTypeNode isTypeDerived, - @Shared @Cached TypeNodes.IsTypeNode isTypeCls, @Shared @Cached IsSameTypeNode isSameDerivedNode, @Shared @Cached IsSameTypeNode isSameClsNode, @Shared @Cached IsSameTypeNode isSameTypeInLoopNode, @@ -219,7 +212,6 @@ static boolean isSubtypeOfCached(Object derived, Object cls, @Specialization(guards = { "isSingleContext()", - "isTypeDerived.execute(inliningTarget, derived)", "isTypeCls.execute(inliningTarget, cls)", "isSameType(inliningTarget, isSameDerivedNode, derived, cachedDerived)", "mro.getInternalClassArray().length < 32" }, limit = "getVariableArgumentInlineCacheLimit()", replaces = { @@ -233,8 +225,6 @@ static boolean isSubtypeOfCached(Object derived, Object cls, static boolean isSubtypeOfVariableTypeCached(@SuppressWarnings("unused") Object derived, Object cls, @Bind("this") Node inliningTarget, @Cached("derived") @SuppressWarnings("unused") Object cachedDerived, - @SuppressWarnings("unused") @Shared @Cached TypeNodes.IsTypeNode isTypeDerived, - @SuppressWarnings("unused") @Shared @Cached TypeNodes.IsTypeNode isTypeCls, @SuppressWarnings("unused") @Shared @Cached GetMroStorageNode getMro, @Cached("getMro.execute(inliningTarget, cachedDerived)") MroSequenceStorage mro, @Cached("mro.getInternalClassArray().length") int sz, @@ -273,7 +263,6 @@ static boolean isVariableSubtypeOfConstantTypeCached(@SuppressWarnings("unused") } @Specialization(guards = { - "isTypeDerived.execute(inliningTarget, derived)", "isTypeCls.execute(inliningTarget, cls)", "mro.getInternalClassArray().length == sz", "sz < 16" }, limit = "getVariableArgumentInlineCacheLimit()", replaces = { @@ -286,8 +275,6 @@ static boolean isVariableSubtypeOfConstantTypeCached(@SuppressWarnings("unused") @InliningCutoff static boolean isSubtypeGenericCachedLen(@SuppressWarnings("unused") Object derived, Object cls, @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Shared @Cached TypeNodes.IsTypeNode isTypeDerived, - @SuppressWarnings("unused") @Shared @Cached TypeNodes.IsTypeNode isTypeCls, @SuppressWarnings("unused") @Shared @Cached GetMroStorageNode getMro, @Bind("getMro.execute(inliningTarget, derived)") MroSequenceStorage mro, @Cached("mro.getInternalClassArray().length") int sz, @@ -295,7 +282,7 @@ static boolean isSubtypeGenericCachedLen(@SuppressWarnings("unused") Object deri return isInMro(inliningTarget, cls, mro, sz, isSameTypeInLoopNode); } - @Specialization(guards = {"isTypeDerived.execute(inliningTarget, derived)", "isTypeCls.execute(inliningTarget, cls)"}, replaces = { + @Specialization(replaces = { "isVariableSubtypeOfConstantTypeCached", "isSubtypeOfCachedMultiContext", "isVariableSubtypeOfConstantTypeCachedMultiContext", @@ -307,8 +294,6 @@ static boolean isSubtypeGenericCachedLen(@SuppressWarnings("unused") Object deri @Megamorphic static boolean issubTypeGeneric(Object derived, Object cls, @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached TypeNodes.IsTypeNode isTypeDerived, - @SuppressWarnings("unused") @Exclusive @Cached TypeNodes.IsTypeNode isTypeCls, @Exclusive @Cached InlinedConditionProfile builtinClassIsSubtypeProfile, @Exclusive @Cached IsSameTypeNode isSameTypeNode, @Exclusive @Cached GetMroStorageNode getMro) { @@ -324,29 +309,6 @@ static boolean issubTypeGeneric(Object derived, Object cls, return false; } - @Specialization(guards = {"!isTypeDerived.execute(inliningTarget, derived) || !isTypeCls.execute(inliningTarget, cls)"}, limit = "1") - @Megamorphic - @InliningCutoff - static boolean fallback(VirtualFrame frame, Object derived, Object cls, - @Bind("this") Node inliningTarget, - @SuppressWarnings("unused") @Exclusive @Cached TypeNodes.IsTypeNode isTypeDerived, - @SuppressWarnings("unused") @Exclusive @Cached TypeNodes.IsTypeNode isTypeCls, - @Cached AbstractObjectGetBasesNode getBasesNode, - @Cached AbstractObjectIsSubclassNode abstractIsSubclassNode, - @Exclusive @Cached InlinedConditionProfile exceptionDerivedProfile, - @Exclusive @Cached InlinedConditionProfile exceptionClsProfile, - @Cached PRaiseNode.Lazy raise) { - if (exceptionDerivedProfile.profile(inliningTarget, getBasesNode.execute(frame, derived) == null)) { - throw raise.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.ARG_D_MUST_BE_S, "issubclass()", 1, "class"); - } - - if (exceptionClsProfile.profile(inliningTarget, getBasesNode.execute(frame, cls) == null)) { - throw raise.get(inliningTarget).raise(PythonErrorType.TypeError, ErrorMessages.ISSUBCLASS_MUST_BE_CLASS_OR_TUPLE); - } - - return abstractIsSubclassNode.execute(frame, derived, cls); - } - private static boolean isBuiltinClass(Object cls) { return cls instanceof PythonBuiltinClass || cls instanceof PythonBuiltinClassType; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/exception/ExceptMatchNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/exception/ExceptMatchNode.java index 589bae4724..a782944922 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/exception/ExceptMatchNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/exception/ExceptMatchNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -51,6 +51,7 @@ import com.oracle.graal.python.runtime.exception.PythonErrorType; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.bytecode.OperationProxy; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; @@ -68,39 +69,35 @@ @ImportStatic(PGuards.class) @GenerateUncached +@OperationProxy.Proxyable @SuppressWarnings("truffle-inlining") // footprint reduction 44 -> 25 public abstract class ExceptMatchNode extends Node { public abstract boolean executeMatch(Frame frame, Object exception, Object clause); - private static void raiseIfNoException(VirtualFrame frame, Object clause, ValidExceptionNode isValidException, PRaiseNode raiseNode) { + private static void raiseIfNoException(VirtualFrame frame, Node inliningTarget, Object clause, ValidExceptionNode isValidException) { if (!isValidException.execute(frame, clause)) { - raiseNoException(raiseNode); + throw PRaiseNode.raiseStatic(inliningTarget, PythonErrorType.TypeError, ErrorMessages.CATCHING_CLS_NOT_ALLOWED); } } - private static void raiseNoException(PRaiseNode raiseNode) { - throw raiseNode.raise(PythonErrorType.TypeError, ErrorMessages.CATCHING_CLS_NOT_ALLOWED); - } - @Specialization(guards = "!isPTuple(clause)") public static boolean matchPythonSingle(VirtualFrame frame, PException e, Object clause, @Bind("this") Node inliningTarget, @Shared @Cached ValidExceptionNode isValidException, @Cached GetClassNode getClassNode, - @Cached IsSubtypeNode isSubtype, - @Shared @Cached PRaiseNode raiseNode) { - raiseIfNoException(frame, clause, isValidException, raiseNode); - return isSubtype.execute(frame, getClassNode.execute(inliningTarget, e.getUnreifiedException()), clause); + @Cached IsSubtypeNode isSubtype) { + raiseIfNoException(frame, inliningTarget, clause, isValidException); + return isSubtype.execute(getClassNode.execute(inliningTarget, e.getUnreifiedException()), clause); } @Specialization(guards = {"!isPTuple(clause)", "!isPException(e)"}, limit = "1") public static boolean matchJava(VirtualFrame frame, AbstractTruffleException e, Object clause, + @Bind("this") Node inliningTarget, @Shared @Cached ValidExceptionNode isValidException, - @CachedLibrary("clause") InteropLibrary clauseLib, - @Shared @Cached PRaiseNode raiseNode) { + @CachedLibrary("clause") InteropLibrary clauseLib) { // n.b.: we can only allow Java exceptions in clauses, because we cannot tell for other // foreign exception types if they *are* exception types - raiseIfNoException(frame, clause, isValidException, raiseNode); + raiseIfNoException(frame, inliningTarget, clause, isValidException); if (clauseLib.isMetaObject(clause)) { try { return clauseLib.isMetaInstance(clause, e); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/exception/TopLevelExceptionHandler.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/exception/TopLevelExceptionHandler.java index f1d2eafe66..34eab35e83 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/exception/TopLevelExceptionHandler.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/exception/TopLevelExceptionHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,7 +42,6 @@ import static com.oracle.graal.python.builtins.modules.io.IONodes.T_WRITE; import static com.oracle.graal.python.nodes.BuiltinNames.T_SYS; -import static com.oracle.graal.python.runtime.exception.ExceptionUtils.printToStdErr; import static com.oracle.graal.python.runtime.exception.PythonErrorType.SystemExit; import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; @@ -71,11 +70,14 @@ import com.oracle.graal.python.runtime.exception.ExceptionUtils; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonExitException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.exception.PythonInterruptedException; +import com.oracle.graal.python.runtime.exception.PythonThreadKillException; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.RootCallTarget; +import com.oracle.truffle.api.exception.AbstractTruffleException; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.interop.ExceptionType; import com.oracle.truffle.api.interop.InteropLibrary; @@ -143,10 +145,13 @@ public Object execute(VirtualFrame frame) { assert pythonContext.getThreadState(lang).getCurrentException() == null; try { return run(frame); - } catch (PException e) { + } catch (PythonExitException e) { + throw e; + } catch (PythonThreadKillException e) { + throw new PythonInterruptedException(); + } catch (AbstractTruffleException e) { assert !PArguments.isPythonFrame(frame); - Object pythonException = e.getEscapedException(); - if (pythonException instanceof PBaseException managedException && getContext().isChildContext() && isSystemExit(managedException)) { + if (e instanceof PException pe && pe.getEscapedException() instanceof PBaseException managedException && getContext().isChildContext() && isSystemExit(managedException)) { return handleChildContextExit(managedException); } throw handlePythonException(e); @@ -172,8 +177,8 @@ private void checkInitialized() { } @TruffleBoundary - private PException handlePythonException(PException pException) { - Object pythonException = pException.getEscapedException(); + private AbstractTruffleException handlePythonException(AbstractTruffleException e) { + Object pythonException = e instanceof PException pe ? pe.getEscapedException() : e; if (pythonException instanceof PBaseException managedException && isSystemExit(managedException)) { handleSystemExit(managedException); } @@ -187,21 +192,25 @@ private PException handlePythonException(PException pException) { sys.setAttribute(BuiltinNames.T_LAST_TRACEBACK, tb); ExceptionUtils.printExceptionTraceback(getContext(), pythonException); - if (PythonOptions.isPExceptionWithJavaStacktrace(getPythonLanguage())) { - ExceptionUtils.printJavaStackTrace(pException); - } - if (!getSourceSection().getSource().isInteractive()) { - if (getContext().isChildContext()) { - getContext().getChildContextData().setExitCode(1); - } - throw new PythonExitException(this, 1); + if (PythonOptions.isPExceptionWithJavaStacktrace(getPythonLanguage()) && e instanceof PException pe) { + ExceptionUtils.printJavaStackTrace(pe); } + exit(1); } // Before we leave Python, format the message since outside the context - if (pythonException instanceof PBaseException managedException) { - pException.setMessage(managedException.getFormattedMessage()); + if (e instanceof PException pe) { + pe.materializeMessage(); + } + throw e; + } + + private void exit(int exitCode) { + if (!getSourceSection().getSource().isInteractive()) { + if (getContext().isChildContext()) { + getContext().getChildContextData().setExitCode(1); + } + throw new PythonExitException(this, exitCode); } - throw pException; } private static boolean isSystemExit(PBaseException pythonException) { @@ -210,24 +219,23 @@ private static boolean isSystemExit(PBaseException pythonException) { @TruffleBoundary private void handleJavaException(Throwable e) { - PException pe = ExceptionUtils.wrapJavaExceptionIfApplicable(this, e, PythonObjectFactory.getUncached()); + PException pe = ExceptionUtils.wrapJavaExceptionIfApplicable(this, e); if (pe != null) { throw handlePythonException(pe); } - try { - boolean exitException = InteropLibrary.getUncached().isException(e) && InteropLibrary.getUncached().getExceptionType(e) == ExceptionType.EXIT; - if (!exitException) { - ExceptionUtils.printPythonLikeStackTrace(getContext(), e); - boolean withJavaStacktrace = PythonOptions.isWithJavaStacktrace(getPythonLanguage()); - if (e instanceof AssertionError && !withJavaStacktrace) { - printToStdErr("To get more information about the failed assertion rerun with --python.WithJavaStacktrace=3\n"); - } - if (withJavaStacktrace) { - e.printStackTrace(); + if (getContext().getOption(PythonOptions.AlwaysRunExcepthook)) { + try { + boolean exitException = InteropLibrary.getUncached().isException(e) && InteropLibrary.getUncached().getExceptionType(e) == ExceptionType.EXIT; + if (!exitException) { + ExceptionUtils.printPythonLikeStackTrace(getContext(), e); + if (PythonOptions.shouldPrintJavaStacktrace(getPythonLanguage(), e)) { + e.printStackTrace(); + } + exit(1); } + } catch (UnsupportedMessageException unsupportedMessageException) { + throw CompilerDirectives.shouldNotReachHere(); } - } catch (UnsupportedMessageException unsupportedMessageException) { - throw CompilerDirectives.shouldNotReachHere(); } } @@ -247,12 +255,12 @@ private void handleSystemExit(PBaseException pythonException) { int exitcode = getExitCode(pythonException); throw new PythonExitException(this, exitcode); } catch (CannotCastException e) { - // fall through - } - if (handleAlwaysRunExceptHook(theContext, pythonException)) { - throw new PythonExitException(this, 1); + if (handleAlwaysRunExceptHook(theContext, pythonException)) { + throw new PythonExitException(this, 1); + } else { + throw pythonException.getExceptionForReraise(pythonException.getTraceback()); + } } - throw pythonException.getExceptionForReraise(pythonException.getTraceback()); } @TruffleBoundary @@ -261,12 +269,12 @@ private Object handleChildContextExit(PBaseException pythonException) throws PEx try { return getExitCode(pythonException); } catch (CannotCastException cce) { - // fall through - } - if (handleAlwaysRunExceptHook(getContext(), pythonException)) { - return 1; + if (handleAlwaysRunExceptHook(getContext(), pythonException)) { + return 1; + } else { + throw pythonException.getExceptionForReraise(pythonException.getTraceback()); + } } - throw pythonException.getExceptionForReraise(pythonException.getTraceback()); } private static int getExitCode(PBaseException pythonException) throws CannotCastException { @@ -300,9 +308,10 @@ private Object run(VirtualFrame frame) { } PythonContext pythonContext = getContext(); PythonModule mainModule = null; + PythonLanguage language = getPythonLanguage(); if (source.isInternal()) { // internal sources are not run in the main module - PArguments.setGlobals(arguments, pythonContext.factory().createDict()); + PArguments.setGlobals(arguments, PFactory.createDict(language)); } else { mainModule = pythonContext.getMainModule(); PDict mainDict = GetOrCreateDictNode.executeUncached(mainModule); @@ -310,7 +319,7 @@ private Object run(VirtualFrame frame) { PArguments.setSpecialArgument(arguments, mainDict); PArguments.setException(arguments, PException.NO_EXCEPTION); } - Object state = IndirectCalleeContext.enterIndirect(getPythonLanguage(), pythonContext, arguments); + Object state = IndirectCalleeContext.enterIndirect(language, pythonContext, arguments); try { Object result = innerCallTarget.call(arguments); if (mainModule != null && result == PNone.NONE && !source.isInteractive()) { @@ -319,7 +328,7 @@ private Object run(VirtualFrame frame) { return result; } } finally { - IndirectCalleeContext.exit(getPythonLanguage(), pythonContext, state); + IndirectCalleeContext.exit(language, pythonContext, state); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/exception/ValidExceptionNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/exception/ValidExceptionNode.java index 0c8098cc17..e08bc79185 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/exception/ValidExceptionNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/exception/ValidExceptionNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,33 +40,27 @@ */ package com.oracle.graal.python.nodes.exception; -import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; -import com.oracle.graal.python.runtime.PythonContext; -import com.oracle.graal.python.runtime.PythonOptions; +import com.oracle.graal.python.nodes.object.IsForeignObjectNode; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.Idempotent; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.Frame; -import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; @GenerateUncached @SuppressWarnings("truffle-inlining") // footprint reduction 36 -> 18 -public abstract class ValidExceptionNode extends Node { +public abstract class ValidExceptionNode extends PNodeWithContext { public abstract boolean execute(Frame frame, Object type); - @Idempotent - protected boolean emulateJython() { - return PythonLanguage.get(this).getEngineOption(PythonOptions.EmulateJython); - } - protected static boolean isPythonExceptionType(PythonBuiltinClassType type) { PythonBuiltinClassType base = type; while (base != null) { @@ -93,26 +87,27 @@ static boolean isPythonExceptionClassCached(@SuppressWarnings("unused") PythonBu } @Specialization(guards = "isTypeNode.execute(inliningTarget, type)", limit = "1", replaces = {"isPythonExceptionTypeCached", "isPythonExceptionClassCached"}) - static boolean isPythonException(VirtualFrame frame, Object type, + static boolean isPythonException(Object type, @SuppressWarnings("unused") @Bind("this") Node inliningTarget, @SuppressWarnings("unused") @Cached TypeNodes.IsTypeNode isTypeNode, @Cached IsSubtypeNode isSubtype) { - return isSubtype.execute(frame, type, PythonBuiltinClassType.PBaseException); - } - - protected boolean isHostObject(Object object) { - return PythonContext.get(this).getEnv().isHostObject(object); + return isSubtype.execute(type, PythonBuiltinClassType.PBaseException); } - @Specialization(guards = {"emulateJython()", "isHostObject(type)"}) - @SuppressWarnings("unused") - boolean isJavaException(@SuppressWarnings("unused") VirtualFrame frame, Object type) { - Object hostType = PythonContext.get(this).getEnv().asHostObject(type); - return hostType instanceof Class && Throwable.class.isAssignableFrom((Class) hostType); + @Specialization(guards = "isForeignObjectNode.execute(inliningTarget, type)", limit = "1") + static boolean isForeign(Object type, + @Bind("this") Node inliningTarget, + @Cached IsForeignObjectNode isForeignObjectNode, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop) { + /* + * There is no way to tell if a meta object is some kind of foreign exception class, so we + * allow any foreign meta object + */ + return interop.isMetaObject(type); } @Fallback - static boolean isAnException(@SuppressWarnings("unused") VirtualFrame frame, @SuppressWarnings("unused") Object type) { + static boolean isAnException(@SuppressWarnings("unused") Object type) { return false; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/BinaryArithmetic.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/BinaryArithmetic.java deleted file mode 100644 index 460af66496..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/BinaryArithmetic.java +++ /dev/null @@ -1,587 +0,0 @@ -/* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.expression; - -import static com.oracle.graal.python.nodes.BuiltinNames.T_PRINT; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; -import static com.oracle.graal.python.util.PythonUtils.tsArray; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.objects.floats.FloatBuiltins; -import com.oracle.graal.python.builtins.objects.function.PArguments; -import com.oracle.graal.python.builtins.objects.function.Signature; -import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; -import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.lib.PyNumberAddNode; -import com.oracle.graal.python.lib.PyNumberMultiplyNode; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode.NotImplementedHandler; -import com.oracle.graal.python.runtime.exception.PythonErrorType; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.graal.python.util.OverflowException; -import com.oracle.graal.python.util.Supplier; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.nodes.RootNode; -import com.oracle.truffle.api.strings.TruffleString; - -@SuppressWarnings("truffle-inlining") -public enum BinaryArithmetic { - Add(PyNumberAddNode::create), - Sub(BinaryArithmeticFactory.SubNodeGen::create), - Mul(PyNumberMultiplyNode::create), - TrueDiv(BinaryArithmeticFactory.TrueDivNodeGen::create), - FloorDiv(BinaryArithmeticFactory.FloorDivNodeGen::create), - Mod(BinaryArithmeticFactory.ModNodeGen::create), - LShift(BinaryArithmeticFactory.LShiftNodeGen::create), - RShift(BinaryArithmeticFactory.RShiftNodeGen::create), - And(BinaryArithmeticFactory.BitAndNodeGen::create), - Or(BinaryArithmeticFactory.BitOrNodeGen::create), - Xor(BinaryArithmeticFactory.BitXorNodeGen::create), - MatMul(BinaryArithmeticFactory.MatMulNodeGen::create), - Pow(BinaryArithmeticFactory.PowNodeGen::create), - DivMod(BinaryArithmeticFactory.DivModNodeGen::create); - - interface CreateBinaryOp { - BinaryOpNode create(); - } - - private final CreateBinaryOp create; - - BinaryArithmetic(CreateBinaryOp create) { - this.create = create; - } - - /** - * A helper root node that dispatches to {@link LookupAndCallBinaryNode} to execute the provided - * ternary operator. Note: this is just a root node and won't do any signature checking. - */ - static final class CallBinaryArithmeticRootNode extends CallArithmeticRootNode { - static final Signature SIGNATURE_BINARY = new Signature(2, false, -1, false, tsArray("$self", "other"), null); - - @Child private BinaryOpNode callBinaryNode; - - private final BinaryArithmetic binaryOperator; - - CallBinaryArithmeticRootNode(PythonLanguage language, BinaryArithmetic binaryOperator) { - super(language); - this.binaryOperator = binaryOperator; - } - - @Override - public Signature getSignature() { - return SIGNATURE_BINARY; - } - - @Override - protected Object doCall(VirtualFrame frame) { - if (callBinaryNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - callBinaryNode = insert(binaryOperator.create()); - } - return callBinaryNode.executeObject(frame, PArguments.getArgument(frame, 0), PArguments.getArgument(frame, 1)); - } - } - - @NeverDefault - public BinaryOpNode create() { - return create.create(); - } - - /** - * Creates a root node for this binary operator such that the operator can be executed via a - * full call. - */ - public RootNode createRootNode(PythonLanguage language) { - return new CallBinaryArithmeticRootNode(language, this); - } - - @ImportStatic(SpecialMethodNames.class) - public abstract static class BinaryArithmeticNode extends BinaryOpNode { - - static Supplier createHandler(String operator) { - return () -> new NotImplementedHandler() { - @Child private PRaiseNode raiseNode = PRaiseNode.create(); - - @Override - public Object execute(VirtualFrame frame, Object arg, Object arg2) { - throw raiseNode.raise(TypeError, getErrorMessage(arg), operator, arg, arg2); - } - - @CompilerDirectives.TruffleBoundary - private TruffleString getErrorMessage(Object arg) { - if (operator.equals(">>") && arg instanceof PBuiltinMethod && ((PBuiltinMethod) arg).getBuiltinFunction().getName().equalsUncached(T_PRINT, TS_ENCODING)) { - return ErrorMessages.UNSUPPORTED_OPERAND_TYPES_FOR_S_P_AND_P_PRINT; - } - return ErrorMessages.UNSUPPORTED_OPERAND_TYPES_FOR_S_P_AND_P; - } - }; - } - - @NeverDefault - public static LookupAndCallBinaryNode createCallNode(SpecialMethodSlot slot, Supplier handler) { - assert slot.getReverse() != null; - return LookupAndCallBinaryNode.createReversible(slot, slot.getReverse(), handler); - } - - @NeverDefault - public static LookupAndCallBinaryNode createBinaryOp(SpecialMethodSlot slot, Supplier handler) { - return LookupAndCallBinaryNode.createBinaryOp(slot, slot.getReverse(), handler); - } - } - - public abstract static class SubNode extends BinaryArithmeticNode { - - public static final Supplier NOT_IMPLEMENTED = createHandler("-"); - - @Specialization(rewriteOn = ArithmeticException.class) - public static int doII(int x, int y) throws ArithmeticException { - return Math.subtractExact(x, y); - } - - @Specialization - public static long doIIOvf(int x, int y) { - return x - (long) y; - } - - @Specialization - public static double doDD(double left, double right) { - return left - right; - } - - @Specialization - public static double doDL(double left, long right) { - return left - right; - } - - @Specialization - public static double doLD(long left, double right) { - return left - right; - } - - @Specialization(rewriteOn = ArithmeticException.class) - public static long doLL(long x, long y) throws ArithmeticException { - return Math.subtractExact(x, y); - } - - @Specialization - public static Object doGeneric(VirtualFrame frame, Object left, Object right, - // TODO: replace with 'createBinaryOp' once (GR-<1????>) is fixed - @Cached("createCallNode(Sub, NOT_IMPLEMENTED)") LookupAndCallBinaryNode callNode) { - return callNode.executeObject(frame, left, right); - } - } - - public abstract static class BinaryArithmeticRaiseNode extends BinaryArithmeticNode { - - protected static void raiseIntDivisionByZero(boolean cond, Node inliningTarget, PRaiseNode.Lazy raiseNode) { - if (cond) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.ZeroDivisionError, ErrorMessages.S_DIVISION_OR_MODULO_BY_ZERO, "integer"); - } - } - - protected static void raiseDivisionByZero(boolean cond, Node inliningTarget, PRaiseNode.Lazy raiseNode) { - if (cond) { - throw raiseNode.get(inliningTarget).raise(PythonErrorType.ZeroDivisionError, ErrorMessages.DIVISION_BY_ZERO); - } - } - } - - public abstract static class TrueDivNode extends BinaryArithmeticRaiseNode { - - public static final Supplier NOT_IMPLEMENTED = createHandler("/"); - - @Specialization - public static double doII(int x, int y, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { - return doDD(x, y, inliningTarget, raiseNode); - } - - @Specialization - public static double doLD(long x, double y, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { - return doDD(x, y, inliningTarget, raiseNode); - } - - @Specialization - public static double doDL(double x, long y, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { - return doDD(x, y, inliningTarget, raiseNode); - } - - @Specialization - public static double doDD(double x, double y, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { - raiseDivisionByZero(y == 0.0, inliningTarget, raiseNode); - return x / y; - } - - @Specialization - public static Object doGeneric(VirtualFrame frame, Object left, Object right, - // TODO: replace with 'createBinaryOp' once (GR-<1????>) is fixed - @Cached("createCallNode(TrueDiv, NOT_IMPLEMENTED)") LookupAndCallBinaryNode callNode) { - return callNode.executeObject(frame, left, right); - } - } - - public abstract static class FloorDivNode extends BinaryArithmeticRaiseNode { - - public static final Supplier NOT_IMPLEMENTED = createHandler("//"); - - @Specialization - public static int doII(int left, int right, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { - raiseIntDivisionByZero(right == 0, inliningTarget, raiseNode); - return Math.floorDiv(left, right); - } - - @Specialization(rewriteOn = OverflowException.class) - public static long doLL(long left, long right, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) throws OverflowException { - if (left == Long.MIN_VALUE && right == -1) { - throw OverflowException.INSTANCE; - } - raiseIntDivisionByZero(right == 0, inliningTarget, raiseNode); - return Math.floorDiv(left, right); - } - - @Specialization - public static double doDL(double left, long right, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { - raiseDivisionByZero(right == 0, inliningTarget, raiseNode); - return Math.floor(left / right); - } - - @Specialization - public static double doDD(double left, double right, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { - raiseDivisionByZero(right == 0.0, inliningTarget, raiseNode); - return Math.floor(left / right); - } - - @Specialization - public static double doLD(long left, double right, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { - raiseDivisionByZero(right == 0.0, inliningTarget, raiseNode); - return Math.floor(left / right); - } - - @Specialization - public static Object doGeneric(VirtualFrame frame, Object left, Object right, - // TODO: replace with 'createBinaryOp' once (GR-<1????>) is fixed - @Cached("createCallNode(FloorDiv, NOT_IMPLEMENTED)") LookupAndCallBinaryNode callNode) { - return callNode.executeObject(frame, left, right); - } - } - - public abstract static class ModNode extends BinaryArithmeticRaiseNode { - - public static final Supplier NOT_IMPLEMENTED = createHandler("%"); - - @Specialization - public static int doII(int left, int right, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { - raiseIntDivisionByZero(right == 0, inliningTarget, raiseNode); - return Math.floorMod(left, right); - } - - @Specialization - public static long doLL(long left, long right, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { - raiseIntDivisionByZero(right == 0, inliningTarget, raiseNode); - return Math.floorMod(left, right); - } - - @Specialization - public static double doDL(double left, long right, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { - raiseDivisionByZero(right == 0, inliningTarget, raiseNode); - return FloatBuiltins.ModNode.mod(left, right); - } - - @Specialization - public static double doDD(double left, double right, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { - raiseDivisionByZero(right == 0.0, inliningTarget, raiseNode); - return FloatBuiltins.ModNode.mod(left, right); - } - - @Specialization - public static double doLD(long left, double right, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { - raiseDivisionByZero(right == 0.0, inliningTarget, raiseNode); - return FloatBuiltins.ModNode.mod(left, right); - } - - @Specialization - public static Object doGeneric(VirtualFrame frame, Object left, Object right, - @Cached("createCallNode(Mod, NOT_IMPLEMENTED)") LookupAndCallBinaryNode callNode) { - return callNode.executeObject(frame, left, right); - } - } - - public abstract static class LShiftNode extends BinaryArithmeticNode { - - public static final Supplier NOT_IMPLEMENTED = createHandler("<<"); - - @Specialization(guards = {"right < 32", "right >= 0"}, rewriteOn = OverflowException.class) - public static int doII(int left, int right) throws OverflowException { - int result = left << right; - if (left != result >> right) { - throw OverflowException.INSTANCE; - } - return result; - } - - @Specialization(guards = {"right < 64", "right >= 0"}, rewriteOn = OverflowException.class) - public static long doLL(long left, long right) throws OverflowException { - long result = left << right; - if (left != result >> right) { - throw OverflowException.INSTANCE; - } - return result; - } - - @Specialization - public static Object doGeneric(VirtualFrame frame, Object left, Object right, - // TODO: replace with 'createBinaryOp' once (GR-<1????>) is fixed - @Cached("createCallNode(LShift, NOT_IMPLEMENTED)") LookupAndCallBinaryNode callNode) { - return callNode.executeObject(frame, left, right); - } - } - - public abstract static class RShiftNode extends BinaryArithmeticNode { - - public static final Supplier NOT_IMPLEMENTED = createHandler(">>"); - - @Specialization(guards = {"right < 32", "right >= 0"}) - public static int doIISmall(int left, int right) { - return left >> right; - } - - @Specialization(guards = {"right < 64", "right >= 0"}) - public static long doIISmall(long left, long right) { - return left >> right; - } - - @Specialization - public static Object doGeneric(VirtualFrame frame, Object left, Object right, - // TODO: replace with 'createBinaryOp' once (GR-<1????>) is fixed - @Cached("createCallNode(RShift, NOT_IMPLEMENTED)") LookupAndCallBinaryNode callNode) { - return callNode.executeObject(frame, left, right); - } - } - - public abstract static class BitAndNode extends BinaryArithmeticNode { - - public static final Supplier NOT_IMPLEMENTED = createHandler("&"); - - @Specialization - public static int op(int left, int right) { - return left & right; - } - - @Specialization - public static long op(long left, long right) { - return left & right; - } - - @Specialization - public static Object doGeneric(VirtualFrame frame, Object left, Object right, - @Cached("createBinaryOp(And, NOT_IMPLEMENTED)") LookupAndCallBinaryNode callNode) { - return callNode.executeObject(frame, left, right); - } - - } - - public abstract static class BitOrNode extends BinaryArithmeticNode { - - public static final Supplier NOT_IMPLEMENTED = createHandler("|"); - - @Specialization - public static int op(int left, int right) { - return left | right; - } - - @Specialization - public static long op(long left, long right) { - return left | right; - } - - @Specialization - public static Object doGeneric(VirtualFrame frame, Object left, Object right, - // (mq) TODO: use 'createBinaryOp' once 'type(int | str)' is avoided - // during forzen module build. - @Cached("createCallNode(Or, NOT_IMPLEMENTED)") LookupAndCallBinaryNode callNode) { - return callNode.executeObject(frame, left, right); - } - - } - - public abstract static class BitXorNode extends BinaryArithmeticNode { - - public static final Supplier NOT_IMPLEMENTED = createHandler("^"); - - @Specialization - public static int op(int left, int right) { - return left ^ right; - } - - @Specialization - public static long op(long left, long right) { - return left ^ right; - } - - @Specialization - public static Object doGeneric(VirtualFrame frame, Object left, Object right, - @Cached("createBinaryOp(Xor, NOT_IMPLEMENTED)") LookupAndCallBinaryNode callNode) { - return callNode.executeObject(frame, left, right); - } - - } - - public abstract static class MatMulNode extends BinaryArithmeticNode { - - public static final Supplier NOT_IMPLEMENTED = createHandler("@"); - - @Specialization - public static Object doGeneric(VirtualFrame frame, Object left, Object right, - // TODO: replace with 'createBinaryOp' once (GR-<1????>) is fixed - @Cached("createCallNode(MatMul, NOT_IMPLEMENTED)") LookupAndCallBinaryNode callNode) { - return callNode.executeObject(frame, left, right); - } - } - - public abstract static class PowNode extends BinaryArithmeticNode { - - public static final Supplier NOT_IMPLEMENTED = createHandler("** or pow()"); - - @Specialization - public static Object doGeneric(VirtualFrame frame, Object left, Object right, - // TODO: ternary_op is not implemented (GR-<2????>) - @Cached("createCallNode(Pow, NOT_IMPLEMENTED)") LookupAndCallBinaryNode callNode) { - return callNode.executeObject(frame, left, right); - } - } - - public abstract static class DivModNode extends BinaryArithmeticRaiseNode { - - public static final Supplier NOT_IMPLEMENTED = createHandler("divmod"); - - @Specialization - public static PTuple doLL(int left, int right, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode, - @Shared("factory") @Cached PythonObjectFactory factory) { - raiseIntDivisionByZero(right == 0, inliningTarget, raiseNode); - return factory.createTuple(new Object[]{Math.floorDiv(left, right), Math.floorMod(left, right)}); - } - - @Specialization - public static PTuple doLL(long left, long right, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode, - @Shared("factory") @Cached PythonObjectFactory factory) { - raiseIntDivisionByZero(right == 0, inliningTarget, raiseNode); - return factory.createTuple(new Object[]{Math.floorDiv(left, right), Math.floorMod(left, right)}); - } - - @Specialization - public static PTuple doDL(double left, long right, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode, - @Shared("factory") @Cached PythonObjectFactory factory) { - raiseDivisionByZero(right == 0, inliningTarget, raiseNode); - return factory.createTuple(new Object[]{Math.floor(left / right), FloatBuiltins.ModNode.mod(left, right)}); - } - - @Specialization - public static PTuple doDD(double left, double right, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode, - @Shared("factory") @Cached PythonObjectFactory factory) { - raiseDivisionByZero(right == 0.0, inliningTarget, raiseNode); - return factory.createTuple(new Object[]{Math.floor(left / right), FloatBuiltins.ModNode.mod(left, right)}); - } - - @Specialization - public static PTuple doLD(long left, double right, - @Bind("this") Node inliningTarget, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode, - @Shared("factory") @Cached PythonObjectFactory factory) { - raiseDivisionByZero(right == 0.0, inliningTarget, raiseNode); - return factory.createTuple(new Object[]{Math.floor(left / right), FloatBuiltins.ModNode.mod(left, right)}); - } - - @Specialization - public static Object doGeneric(VirtualFrame frame, Object left, Object right, - // TODO: replace with 'createBinaryOp' once (GR-<1????>) is fixed - @Cached("createCallNode(DivMod, NOT_IMPLEMENTED)") LookupAndCallBinaryNode callNode) { - return callNode.executeObject(frame, left, right); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/BinaryComparisonNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/BinaryComparisonNode.java deleted file mode 100644 index 535b57ecf4..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/BinaryComparisonNode.java +++ /dev/null @@ -1,542 +0,0 @@ -/* - * Copyright (c) 2017, 2022, Oracle and/or its affiliates. - * Copyright (c) 2013, Regents of the University of California - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.oracle.graal.python.nodes.expression; - -import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; - -import com.oracle.graal.python.builtins.objects.PNotImplemented; -import com.oracle.graal.python.builtins.objects.str.StringUtils; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode; -import com.oracle.graal.python.nodes.expression.BinaryComparisonNodeFactory.EqNodeGen; -import com.oracle.graal.python.nodes.expression.BinaryComparisonNodeFactory.GeNodeGen; -import com.oracle.graal.python.nodes.expression.BinaryComparisonNodeFactory.GtNodeGen; -import com.oracle.graal.python.nodes.expression.BinaryComparisonNodeFactory.LeNodeGen; -import com.oracle.graal.python.nodes.expression.BinaryComparisonNodeFactory.LtNodeGen; -import com.oracle.graal.python.nodes.expression.BinaryComparisonNodeFactory.NeNodeGen; -import com.oracle.graal.python.nodes.object.IsNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.UnexpectedResultException; -import com.oracle.truffle.api.strings.TruffleString; - -@TypeSystemReference(PythonArithmeticTypes.class) -public abstract class BinaryComparisonNode extends BinaryOpNode { - - private abstract static class ErrorNode extends BinaryComparisonNode { - @Child private PRaiseNode raiseNode; - - protected final RuntimeException noSupported(Object left, Object right) { - if (raiseNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - raiseNode = insert(PRaiseNode.create()); - } - throw raiseNode.raise(TypeError, ErrorMessages.NOT_SUPPORTED_BETWEEN_INSTANCES, operator(), left, right); - } - - protected abstract String operator(); - - public abstract boolean cmp(TruffleString l, TruffleString r, TruffleString.CompareIntsUTF32Node compareIntsUTF32Node); - } - - private abstract static class FallbackNode extends BinaryComparisonNode { - @Child private IsNode isNode; - - protected final IsNode ensureIsNode() { - if (isNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - isNode = insert(IsNode.create()); - } - return isNode; - } - - public abstract boolean cmp(TruffleString l, TruffleString r, TruffleString.EqualNode equalNode); - } - - public abstract boolean cmp(int l, int r); - - public abstract boolean cmp(long l, long r); - - public abstract boolean cmp(char l, char r); - - public abstract boolean cmp(byte l, byte r); - - public abstract boolean cmp(double l, double r); - - public abstract boolean executeBool(VirtualFrame frame, Object left, Object right) throws UnexpectedResultException; - - public abstract static class LeNode extends ErrorNode { - - @Specialization - @Override - public final boolean cmp(int l, int r) { - return l <= r; - } - - @Specialization - @Override - public final boolean cmp(long l, long r) { - return l <= r; - } - - @Specialization - @Override - public final boolean cmp(char l, char r) { - return l <= r; - } - - @Specialization - @Override - public final boolean cmp(byte l, byte r) { - return l <= r; - } - - @Specialization - @Override - public final boolean cmp(double l, double r) { - return l <= r; - } - - @Specialization - @Override - public final boolean cmp(TruffleString l, TruffleString r, - @Cached TruffleString.CompareIntsUTF32Node compareIntsUTF32Node) { - return StringUtils.compareStrings(l, r, compareIntsUTF32Node) <= 0; - } - - @Specialization - static boolean cmp(int l, double r) { - return l <= r; - } - - @Specialization - static boolean cmp(double l, int r) { - return l <= r; - } - - @Specialization - protected final Object doGeneric(VirtualFrame frame, Object left, Object right, - @Cached("createCallNode()") LookupAndCallBinaryNode callNode) { - Object result = callNode.executeObject(frame, left, right); - if (result == PNotImplemented.NOT_IMPLEMENTED) { - throw noSupported(left, right); - } - return result; - } - - @NeverDefault - protected static LookupAndCallBinaryNode createCallNode() { - return LookupAndCallBinaryNode.create(SpecialMethodSlot.Le, SpecialMethodSlot.Ge, true, true); - } - - @Override - protected final String operator() { - return "<="; - } - - @NeverDefault - public static LeNode create() { - return LeNodeGen.create(); - } - } - - public abstract static class LtNode extends ErrorNode { - - @Specialization - @Override - public final boolean cmp(int l, int r) { - return l < r; - } - - @Specialization - @Override - public final boolean cmp(long l, long r) { - return l < r; - } - - @Specialization - @Override - public final boolean cmp(char l, char r) { - return l < r; - } - - @Specialization - @Override - public final boolean cmp(byte l, byte r) { - return l < r; - } - - @Specialization - @Override - public final boolean cmp(double l, double r) { - return l < r; - } - - @Specialization - @Override - public final boolean cmp(TruffleString l, TruffleString r, - @Cached TruffleString.CompareIntsUTF32Node compareIntsUTF32Node) { - return StringUtils.compareStrings(l, r, compareIntsUTF32Node) < 0; - } - - @Specialization - static boolean cmp(int l, double r) { - return l < r; - } - - @Specialization - static boolean cmp(double l, int r) { - return l < r; - } - - @Specialization - protected final Object doGeneric(VirtualFrame frame, Object left, Object right, - @Cached("createCallNode()") LookupAndCallBinaryNode callNode) { - Object result = callNode.executeObject(frame, left, right); - if (result == PNotImplemented.NOT_IMPLEMENTED) { - throw noSupported(left, right); - } - return result; - } - - @NeverDefault - protected static LookupAndCallBinaryNode createCallNode() { - return LookupAndCallBinaryNode.create(SpecialMethodSlot.Lt, SpecialMethodSlot.Gt, true, true); - } - - @Override - protected String operator() { - return "<"; - } - - @NeverDefault - public static LtNode create() { - return LtNodeGen.create(); - } - } - - public abstract static class GeNode extends ErrorNode { - - @Specialization - @Override - public final boolean cmp(int l, int r) { - return l >= r; - } - - @Specialization - @Override - public final boolean cmp(long l, long r) { - return l >= r; - } - - @Specialization - @Override - public final boolean cmp(char l, char r) { - return l >= r; - } - - @Specialization - @Override - public final boolean cmp(byte l, byte r) { - return l >= r; - } - - @Specialization - @Override - public final boolean cmp(double l, double r) { - return l >= r; - } - - @Specialization - @Override - public final boolean cmp(TruffleString l, TruffleString r, - @Cached TruffleString.CompareIntsUTF32Node compareIntsUTF32Node) { - return StringUtils.compareStrings(l, r, compareIntsUTF32Node) >= 0; - } - - @Specialization - static boolean cmp(int l, double r) { - return l >= r; - } - - @Specialization - static boolean cmp(double l, int r) { - return l >= r; - } - - @Specialization - protected final Object doGeneric(VirtualFrame frame, Object left, Object right, - @Cached("createCallNode()") LookupAndCallBinaryNode callNode) { - Object result = callNode.executeObject(frame, left, right); - if (result == PNotImplemented.NOT_IMPLEMENTED) { - throw noSupported(left, right); - } - return result; - } - - @NeverDefault - protected static LookupAndCallBinaryNode createCallNode() { - return LookupAndCallBinaryNode.create(SpecialMethodSlot.Ge, SpecialMethodSlot.Le, true, true); - } - - @Override - protected String operator() { - return ">="; - } - - @NeverDefault - public static GeNode create() { - return GeNodeGen.create(); - } - } - - public abstract static class GtNode extends ErrorNode { - - @Specialization - @Override - public final boolean cmp(int l, int r) { - return l > r; - } - - @Specialization - @Override - public final boolean cmp(long l, long r) { - return l > r; - } - - @Specialization - @Override - public final boolean cmp(char l, char r) { - return l > r; - } - - @Specialization - @Override - public final boolean cmp(byte l, byte r) { - return l > r; - } - - @Specialization - @Override - public final boolean cmp(double l, double r) { - return l > r; - } - - @Specialization - @Override - public final boolean cmp(TruffleString l, TruffleString r, - @Cached TruffleString.CompareIntsUTF32Node compareIntsUTF32Node) { - return StringUtils.compareStrings(l, r, compareIntsUTF32Node) > 0; - } - - @Specialization - static boolean cmp(int l, double r) { - return l > r; - } - - @Specialization - static boolean cmp(double l, int r) { - return l > r; - } - - @Specialization - protected final Object doGeneric(VirtualFrame frame, Object left, Object right, - @Cached("createCallNode()") LookupAndCallBinaryNode callNode) { - Object result = callNode.executeObject(frame, left, right); - if (result == PNotImplemented.NOT_IMPLEMENTED) { - throw noSupported(left, right); - } - return result; - } - - @NeverDefault - protected static LookupAndCallBinaryNode createCallNode() { - return LookupAndCallBinaryNode.create(SpecialMethodSlot.Gt, SpecialMethodSlot.Lt, true, true); - } - - @Override - protected String operator() { - return ">"; - } - - @NeverDefault - public static GtNode create() { - return GtNodeGen.create(); - } - } - - public abstract static class EqNode extends FallbackNode { - - @Specialization - @Override - public final boolean cmp(int l, int r) { - return l == r; - } - - @Specialization - @Override - public final boolean cmp(long l, long r) { - return l == r; - } - - @Specialization - @Override - public final boolean cmp(char l, char r) { - return l == r; - } - - @Specialization - @Override - public final boolean cmp(byte l, byte r) { - return l == r; - } - - @Specialization - @Override - public final boolean cmp(double l, double r) { - return l == r; - } - - @Specialization - @Override - public final boolean cmp(TruffleString l, TruffleString r, - @Cached TruffleString.EqualNode equalNode) { - return equalNode.execute(l, r, TS_ENCODING); - } - - @Specialization - static boolean cmp(int l, double r) { - return l == r; - } - - @Specialization - static boolean cmp(double l, int r) { - return l == r; - } - - @Specialization - protected final Object doGeneric(VirtualFrame frame, Object left, Object right, - @Cached("createCallNode()") LookupAndCallBinaryNode callNode) { - Object result = callNode.executeObject(frame, left, right); - if (result == PNotImplemented.NOT_IMPLEMENTED) { - // just like python, if no implementation is available, do something sensible for - // == and != - return ensureIsNode().execute(left, right); - } - return result; - } - - @NeverDefault - protected static LookupAndCallBinaryNode createCallNode() { - return LookupAndCallBinaryNode.create(SpecialMethodSlot.Eq, SpecialMethodSlot.Eq, true, true); - } - - @NeverDefault - public static EqNode create() { - return EqNodeGen.create(); - } - } - - public abstract static class NeNode extends FallbackNode { - - @Specialization - @Override - public final boolean cmp(int l, int r) { - return l != r; - } - - @Specialization - @Override - public final boolean cmp(long l, long r) { - return l != r; - } - - @Specialization - @Override - public final boolean cmp(char l, char r) { - return l != r; - } - - @Specialization - @Override - public final boolean cmp(byte l, byte r) { - return l != r; - } - - @Specialization - @Override - public final boolean cmp(double l, double r) { - return l != r; - } - - @Specialization - @Override - public final boolean cmp(TruffleString l, TruffleString r, - @Cached TruffleString.EqualNode equalNode) { - return !equalNode.execute(l, r, TS_ENCODING); - } - - @Specialization - static boolean cmp(int l, double r) { - return l != r; - } - - @Specialization - static boolean cmp(double l, int r) { - return l != r; - } - - @Specialization - protected final Object doGeneric(VirtualFrame frame, Object left, Object right, - @Cached("createCallNode()") LookupAndCallBinaryNode callNode) { - Object result = callNode.executeObject(frame, left, right); - if (result == PNotImplemented.NOT_IMPLEMENTED) { - // just like python, if no implementation is available, do something sensible for - // == and != - return !ensureIsNode().execute(left, right); - } - return result; - } - - @NeverDefault - protected static LookupAndCallBinaryNode createCallNode() { - return LookupAndCallBinaryNode.create(SpecialMethodSlot.Ne, SpecialMethodSlot.Ne, true, true); - } - - @NeverDefault - public static NeNode create() { - return NeNodeGen.create(); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/BinaryOp.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/BinaryOp.java index de1eb5746b..4dce665264 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/BinaryOp.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/BinaryOp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,5 +43,5 @@ import com.oracle.truffle.api.frame.VirtualFrame; public interface BinaryOp { - Object executeObject(VirtualFrame frame, Object left, Object right); + Object execute(VirtualFrame frame, Object left, Object right); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/BinaryOpNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/BinaryOpNode.java index f0b51431bd..86039e7a50 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/BinaryOpNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/BinaryOpNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -30,5 +30,5 @@ public abstract class BinaryOpNode extends PNodeWithContext implements BinaryOp { @Override - public abstract Object executeObject(VirtualFrame frame, Object left, Object right); + public abstract Object execute(VirtualFrame frame, Object left, Object right); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/CallArithmeticRootNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/CallArithmeticRootNode.java deleted file mode 100644 index 3fc2045168..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/CallArithmeticRootNode.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.expression; - -import com.oracle.graal.python.nodes.PRootNode; -import com.oracle.graal.python.runtime.ExecutionContext.CalleeContext; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.TruffleLanguage; -import com.oracle.truffle.api.frame.VirtualFrame; - -/** - * A simple base class for root nodes that call an arithmetic operation. - */ -abstract class CallArithmeticRootNode extends PRootNode { - - @Child private CalleeContext calleeContext; - - protected CallArithmeticRootNode(TruffleLanguage language) { - super(language); - } - - @Override - public boolean isInternal() { - return true; - } - - @Override - public boolean isPythonInternal() { - return true; - } - - @Override - public Object execute(VirtualFrame frame) { - if (calleeContext == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - calleeContext = insert(CalleeContext.create()); - } - - calleeContext.enter(frame); - try { - return doCall(frame); - } finally { - calleeContext.exit(frame, this); - } - } - - protected abstract Object doCall(VirtualFrame frame); - - @Override - public boolean setsUpCalleeContext() { - return true; - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/CastToListExpressionNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/CastToListExpressionNode.java index 44a721cf9f..9033de6eae 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/CastToListExpressionNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/CastToListExpressionNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,19 +43,16 @@ import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; import com.oracle.graal.python.PythonLanguage; +import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetObjectArrayNode; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.builtins.objects.list.PList; import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.tuple.PTuple; -import com.oracle.graal.python.nodes.BuiltinNames; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.nodes.attributes.LookupInheritedAttributeNode; -import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; import com.oracle.graal.python.nodes.builtins.ListNodes.ConstructListNode; import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.expression.CastToListExpressionNodeGen.CastToListNodeGen; @@ -64,11 +61,10 @@ import com.oracle.graal.python.runtime.IndirectCallData; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; @@ -79,7 +75,7 @@ import com.oracle.truffle.api.nodes.ExplodeLoop; import com.oracle.truffle.api.nodes.Node; -@GenerateInline(inlineByDefault = true) +@GenerateInline(false) @GenerateCached public abstract class CastToListExpressionNode extends UnaryOpNode { @@ -95,14 +91,10 @@ public abstract static class CastToListNode extends Node { public abstract PList execute(VirtualFrame frame, Object list); - protected PythonLanguage getLanguage() { - return PythonLanguage.get(this); - } - @Specialization(guards = {"isBuiltinTuple(v)", "cachedLength == getLength(v)", "cachedLength < 32"}, limit = "2") @ExplodeLoop static PList starredTupleCachedLength(PTuple v, - @Exclusive @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached("getLength(v)") int cachedLength, @Cached SequenceStorageNodes.GetItemNode getItemNode) { SequenceStorage s = v.getSequenceStorage(); @@ -110,15 +102,15 @@ static PList starredTupleCachedLength(PTuple v, for (int i = 0; i < cachedLength; i++) { array[i] = getItemNode.execute(s, i); } - return factory.createList(array); + return PFactory.createList(language, array); } @Specialization(replaces = "starredTupleCachedLength", guards = "isBuiltinTuple(v)") static PList starredTuple(PTuple v, @Bind("this") Node inliningTarget, - @Exclusive @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Cached GetObjectArrayNode getObjectArrayNode) { - return factory.createList(getObjectArrayNode.execute(inliningTarget, v).clone()); + return PFactory.createList(language, getObjectArrayNode.execute(inliningTarget, v).clone()); } @Specialization(guards = "isBuiltinList(v)") @@ -131,8 +123,8 @@ static PList starredIterable(VirtualFrame frame, PythonObject value, @Bind("this") Node inliningTarget, @Shared @Cached("createFor(this)") IndirectCallData indirectCallData, @Shared @Cached ConstructListNode constructListNode) { - PythonLanguage language = PythonLanguage.get(inliningTarget); PythonContext context = PythonContext.get(inliningTarget); + PythonLanguage language = context.getLanguage(inliningTarget); Object state = IndirectCallContext.enter(frame, language, context, indirectCallData); try { return constructListNode.execute(frame, value); @@ -148,15 +140,16 @@ static PList starredGeneric(VirtualFrame frame, Object v, @Shared @Cached ConstructListNode constructListNode, @Cached IsBuiltinObjectProfile attrProfile, @Cached PRaiseNode raise) { - PythonLanguage language = PythonLanguage.get(inliningTarget); - Object state = IndirectCallContext.enter(frame, language, PythonContext.get(inliningTarget), indirectCallData); + PythonContext context = PythonContext.get(inliningTarget); + PythonLanguage language = context.getLanguage(inliningTarget); + Object state = IndirectCallContext.enter(frame, language, context, indirectCallData); try { return constructListNode.execute(frame, v); } catch (PException e) { e.expectAttributeError(inliningTarget, attrProfile); - throw raise.raise(TypeError, ErrorMessages.OBJ_NOT_ITERABLE, v); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.OBJ_NOT_ITERABLE, v); } finally { - IndirectCallContext.exit(frame, language, PythonContext.get(inliningTarget), state); + IndirectCallContext.exit(frame, language, context, state); } } @@ -203,9 +196,7 @@ private static final class CastToListUncachedNode extends CastToListInteropNode @Override public PList executeWithGlobalState(Object list) { - Object builtins = PythonContext.get(this).getBuiltins(); - Object listType = ReadAttributeFromObjectNode.getUncached().execute(builtins, BuiltinNames.T_LIST); - return (PList) CallNode.executeUncached(LookupInheritedAttributeNode.Dynamic.executeUncached(listType, SpecialMethodNames.T___CALL__), listType, list); + return (PList) CallNode.executeUncached(PythonBuiltinClassType.PList, list); } @Override diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/CoerceToBooleanNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/CoerceToBooleanNode.java deleted file mode 100644 index 242123de7b..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/CoerceToBooleanNode.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. - * Copyright (c) 2013, Regents of the University of California - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.oracle.graal.python.nodes.expression; - -import com.oracle.graal.python.lib.PyObjectIsTrueNode; -import com.oracle.graal.python.nodes.expression.CoerceToBooleanNodeFactory.NotNodeGen; -import com.oracle.graal.python.nodes.expression.CoerceToBooleanNodeFactory.YesNodeGen; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.GenerateCached; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.ReportPolymorphism.Megamorphic; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.strings.TruffleString; - -public abstract class CoerceToBooleanNode extends UnaryOpNode { - - @NeverDefault - public static CoerceToBooleanNode createIfTrueNode() { - return YesNodeGen.create(); - } - - @NeverDefault - public static CoerceToBooleanNode createIfFalseNode() { - return NotNodeGen.create(); - } - - public abstract boolean executeBoolean(VirtualFrame frame, Node inliningTarget, Object value); - - public final boolean executeBooleanCached(VirtualFrame frame, Object value) { - return executeBoolean(frame, this, value); - } - - @GenerateInline(inlineByDefault = true) - @GenerateCached - public abstract static class YesNode extends CoerceToBooleanNode { - @Specialization - public static boolean doBoolean(boolean operand) { - return operand; - } - - @Specialization - public static boolean doInteger(int operand) { - return operand != 0; - } - - @Specialization - public static boolean doLong(long operand) { - return operand != 0L; - } - - @Specialization - public static boolean doDouble(double operand) { - return operand != 0; - } - - @Specialization - public static boolean doString(TruffleString operand) { - return !operand.isEmpty(); - } - - @Megamorphic - @Specialization - public static boolean doObject(VirtualFrame frame, Node inliningTarget, Object object, - @Cached PyObjectIsTrueNode isTrue) { - return isTrue.execute(frame, inliningTarget, object); - } - } - - @GenerateInline(inlineByDefault = true) - @GenerateCached - public abstract static class NotNode extends CoerceToBooleanNode { - @Specialization - public static boolean doBool(boolean operand) { - return !operand; - } - - @Specialization - public static boolean doInteger(int operand) { - return operand == 0; - } - - @Specialization - public static boolean doLong(long operand) { - return operand == 0L; - } - - @Specialization - public static boolean doDouble(double operand) { - return operand == 0; - } - - @Specialization - public static boolean doString(TruffleString operand) { - return operand.isEmpty(); - } - - @Megamorphic - @Specialization - public static boolean doObject(VirtualFrame frame, Node inliningTarget, Object object, - @Cached PyObjectIsTrueNode isTrue) { - return !isTrue.execute(frame, inliningTarget, object); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/ContainsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/ContainsNode.java deleted file mode 100644 index 755cdd8a19..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/ContainsNode.java +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.expression; - -import com.oracle.graal.python.builtins.objects.PNotImplemented; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.lib.GetNextNode; -import com.oracle.graal.python.lib.PyObjectGetIter; -import com.oracle.graal.python.lib.PyObjectRichCompareBool; -import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode; -import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.nodes.UnexpectedResultException; - -@GenerateInline(false) -public abstract class ContainsNode extends BinaryOpNode { - @NeverDefault - public static ContainsNode create() { - return ContainsNodeGen.create(); - } - - @NeverDefault - public static LookupAndCallBinaryNode createCallNode() { - return LookupAndCallBinaryNode.create(SpecialMethodSlot.Contains); - } - - @Specialization(rewriteOn = UnexpectedResultException.class) - public static boolean doBoolean(VirtualFrame frame, boolean item, Object iter, - @Bind("this") Node inliningTarget, - @Shared @Cached CoerceToBooleanNode.YesNode castBool, - @Shared("callNode") @Cached("createCallNode()") LookupAndCallBinaryNode callNode, - @Shared("errorProfile") @Cached IsBuiltinObjectProfile errorProfile, - @Shared("getIter") @Cached PyObjectGetIter getIter, - @Shared("eqNode") @Cached PyObjectRichCompareBool.EqNode eqNode, - @Shared("nextNode") @Cached GetNextNode nextNode) throws UnexpectedResultException { - Object result = callNode.executeObject(frame, iter, item); - if (result == PNotImplemented.NOT_IMPLEMENTED) { - Object iterator = getIter.execute(frame, inliningTarget, iter); - return sequenceContains(frame, iterator, item, eqNode, nextNode, inliningTarget, errorProfile); - } - return castBool.executeBoolean(frame, inliningTarget, result); - } - - @Specialization(rewriteOn = UnexpectedResultException.class) - public static boolean doInt(VirtualFrame frame, int item, Object iter, - @Bind("this") Node inliningTarget, - @Shared @Cached CoerceToBooleanNode.YesNode castBool, - @Shared("callNode") @Cached("createCallNode()") LookupAndCallBinaryNode callNode, - @Shared("errorProfile") @Cached IsBuiltinObjectProfile errorProfile, - @Shared("getIter") @Cached PyObjectGetIter getIter, - @Shared("eqNode") @Cached PyObjectRichCompareBool.EqNode eqNode, - @Shared("nextNode") @Cached GetNextNode nextNode) throws UnexpectedResultException { - Object result = callNode.executeObject(frame, iter, item); - if (result == PNotImplemented.NOT_IMPLEMENTED) { - return sequenceContains(frame, getIter.execute(frame, inliningTarget, iter), item, eqNode, nextNode, inliningTarget, errorProfile); - } - return castBool.executeBoolean(frame, inliningTarget, result); - } - - @Specialization(rewriteOn = UnexpectedResultException.class) - public static boolean doLong(VirtualFrame frame, long item, Object iter, - @Bind("this") Node inliningTarget, - @Shared @Cached CoerceToBooleanNode.YesNode castBool, - @Shared("callNode") @Cached("createCallNode()") LookupAndCallBinaryNode callNode, - @Shared("errorProfile") @Cached IsBuiltinObjectProfile errorProfile, - @Shared("getIter") @Cached PyObjectGetIter getIter, - @Shared("eqNode") @Cached PyObjectRichCompareBool.EqNode eqNode, - @Shared("nextNode") @Cached GetNextNode nextNode) throws UnexpectedResultException { - Object result = callNode.executeObject(frame, iter, item); - if (result == PNotImplemented.NOT_IMPLEMENTED) { - return sequenceContains(frame, getIter.execute(frame, inliningTarget, iter), item, eqNode, nextNode, inliningTarget, errorProfile); - } - return castBool.executeBoolean(frame, inliningTarget, result); - } - - @Specialization(rewriteOn = UnexpectedResultException.class) - public static boolean doDouble(VirtualFrame frame, double item, Object iter, - @Bind("this") Node inliningTarget, - @Shared @Cached CoerceToBooleanNode.YesNode castBool, - @Shared("callNode") @Cached("createCallNode()") LookupAndCallBinaryNode callNode, - @Shared("errorProfile") @Cached IsBuiltinObjectProfile errorProfile, - @Shared("getIter") @Cached PyObjectGetIter getIter, - @Shared("eqNode") @Cached PyObjectRichCompareBool.EqNode eqNode, - @Shared("nextNode") @Cached GetNextNode nextNode) throws UnexpectedResultException { - Object result = callNode.executeObject(frame, iter, item); - if (result == PNotImplemented.NOT_IMPLEMENTED) { - return sequenceContains(frame, getIter.execute(frame, inliningTarget, iter), item, eqNode, nextNode, inliningTarget, errorProfile); - } - return castBool.executeBoolean(frame, inliningTarget, result); - } - - @Specialization - public static boolean doGeneric(VirtualFrame frame, Object item, Object iter, - @Bind("this") Node inliningTarget, - @Shared @Cached CoerceToBooleanNode.YesNode castBool, - @Shared("callNode") @Cached("createCallNode()") LookupAndCallBinaryNode callNode, - @Shared("errorProfile") @Cached IsBuiltinObjectProfile errorProfile, - @Shared("getIter") @Cached PyObjectGetIter getIter, - @Shared("eqNode") @Cached PyObjectRichCompareBool.EqNode eqNode, - @Shared("nextNode") @Cached GetNextNode nextNode) { - Object result = callNode.executeObject(frame, iter, item); - if (result == PNotImplemented.NOT_IMPLEMENTED) { - return sequenceContainsObject(frame, getIter.execute(frame, inliningTarget, iter), item, eqNode, nextNode, inliningTarget, errorProfile); - } - return castBool.executeBoolean(frame, inliningTarget, result); - } - - private static void handleUnexpectedResult(VirtualFrame frame, Object iterator, Object item, UnexpectedResultException e, PyObjectRichCompareBool.EqNode eqNode, GetNextNode nextNode, - Node inliningTarget, IsBuiltinObjectProfile errorProfile) throws UnexpectedResultException { - // If we got an unexpected (non-primitive) result from the iterator, we need to compare it - // and continue iterating with "next" through the generic case. However, we also want the - // specialization to go away, so we wrap the boolean result in a new - // UnexpectedResultException. This will cause the DSL to disable the specialization with the - // primitive value and return the result we got, without iterating again. - Object result = e.getResult(); - if (eqNode.compare(frame, inliningTarget, result, item)) { - result = true; - } else { - result = sequenceContainsObject(frame, iterator, item, eqNode, nextNode, inliningTarget, errorProfile); - } - throw new UnexpectedResultException(result); - } - - private static boolean sequenceContains(VirtualFrame frame, Object iterator, boolean item, PyObjectRichCompareBool.EqNode eqNode, GetNextNode nextNode, - Node inliningTarget, IsBuiltinObjectProfile errorProfile) throws UnexpectedResultException { - while (true) { - try { - if (nextNode.executeBoolean(frame, iterator) == item) { - return true; - } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - return false; - } catch (UnexpectedResultException e) { - handleUnexpectedResult(frame, iterator, item, e, eqNode, nextNode, inliningTarget, errorProfile); - } - } - } - - private static boolean sequenceContains(VirtualFrame frame, Object iterator, int item, PyObjectRichCompareBool.EqNode eqNode, GetNextNode nextNode, - Node inliningTarget, IsBuiltinObjectProfile errorProfile) throws UnexpectedResultException { - while (true) { - try { - if (nextNode.executeInt(frame, iterator) == item) { - return true; - } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - return false; - } catch (UnexpectedResultException e) { - handleUnexpectedResult(frame, iterator, item, e, eqNode, nextNode, inliningTarget, errorProfile); - } - } - } - - private static boolean sequenceContains(VirtualFrame frame, Object iterator, long item, PyObjectRichCompareBool.EqNode eqNode, GetNextNode nextNode, - Node inliningTarget, IsBuiltinObjectProfile errorProfile) throws UnexpectedResultException { - while (true) { - try { - if (nextNode.executeLong(frame, iterator) == item) { - return true; - } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - return false; - } catch (UnexpectedResultException e) { - handleUnexpectedResult(frame, iterator, item, e, eqNode, nextNode, inliningTarget, errorProfile); - } - } - } - - private static boolean sequenceContains(VirtualFrame frame, Object iterator, double item, PyObjectRichCompareBool.EqNode eqNode, GetNextNode nextNode, - Node inliningTarget, IsBuiltinObjectProfile errorProfile) throws UnexpectedResultException { - while (true) { - try { - if (nextNode.executeDouble(frame, iterator) == item) { - return true; - } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - return false; - } catch (UnexpectedResultException e) { - handleUnexpectedResult(frame, iterator, item, e, eqNode, nextNode, inliningTarget, errorProfile); - } - } - } - - private static boolean sequenceContainsObject(VirtualFrame frame, Object iterator, Object item, PyObjectRichCompareBool.EqNode eqNode, GetNextNode nextNode, - Node inliningTarget, IsBuiltinObjectProfile errorProfile) { - while (true) { - try { - if (eqNode.compare(frame, inliningTarget, nextNode.execute(frame, iterator), item)) { - return true; - } - } catch (PException e) { - e.expectStopIteration(inliningTarget, errorProfile); - return false; - } - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/InplaceArithmetic.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/InplaceArithmetic.java deleted file mode 100644 index 4bf4b17619..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/InplaceArithmetic.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.expression; - -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ADD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___AND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FLOORDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IAND__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IFLOORDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ILSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IMATMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IMOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IPOW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IRSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ISUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___ITRUEDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___IXOR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MATMUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MOD__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MUL__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___OR__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___POW__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___RSHIFT__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___SUB__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___TRUEDIV__; -import static com.oracle.graal.python.nodes.SpecialMethodNames.T___XOR__; -import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.objects.function.PArguments; -import com.oracle.graal.python.builtins.objects.function.Signature; -import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.expression.BinaryArithmetic.CallBinaryArithmeticRootNode; -import com.oracle.graal.python.nodes.expression.TernaryArithmetic.CallTernaryArithmeticRootNode; -import com.oracle.graal.python.util.Supplier; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.RootNode; -import com.oracle.truffle.api.strings.TruffleString; - -public enum InplaceArithmetic { - IAdd(SpecialMethodSlot.IAdd, T___ADD__, "+=", BinaryArithmetic.Add), - ISub(T___ISUB__, T___SUB__, "-=", BinaryArithmetic.Sub), - IMul(SpecialMethodSlot.IMul, T___MUL__, "*=", BinaryArithmetic.Mul), - ITrueDiv(T___ITRUEDIV__, T___TRUEDIV__, "/=", BinaryArithmetic.TrueDiv), - IFloorDiv(T___IFLOORDIV__, T___FLOORDIV__, "//=", BinaryArithmetic.FloorDiv), - IMod(T___IMOD__, T___MOD__, "%=", BinaryArithmetic.Mod), - IPow(T___IPOW__, T___POW__, "**=", BinaryArithmetic.Pow, true), - ILShift(T___ILSHIFT__, T___LSHIFT__, "<<=", BinaryArithmetic.LShift), - IRShift(T___IRSHIFT__, T___RSHIFT__, ">>=", BinaryArithmetic.RShift), - IAnd(T___IAND__, T___AND__, "&=", BinaryArithmetic.And), - IOr(T___IOR__, T___OR__, "|=", BinaryArithmetic.Or), - IXor(T___IXOR__, T___XOR__, "^=", BinaryArithmetic.Xor), - IMatMul(T___IMATMUL__, T___MATMUL__, "@", BinaryArithmetic.MatMul); - - final TruffleString methodName; - final SpecialMethodSlot slot; - final boolean isTernary; - final Supplier notImplementedHandler; - final BinaryArithmetic binary; - final TruffleString binaryOpName; - - InplaceArithmetic(TruffleString methodName, TruffleString binaryOpName, String operator, BinaryArithmetic binary) { - this(methodName, binaryOpName, operator, binary, false); - } - - InplaceArithmetic(SpecialMethodSlot slot, TruffleString binaryOpName, String operator, BinaryArithmetic binary) { - this(slot.getName(), binaryOpName, operator, binary, false, slot); - } - - InplaceArithmetic(TruffleString methodName, TruffleString binaryOpName, String operator, BinaryArithmetic binary, boolean isTernary) { - this(methodName, binaryOpName, operator, binary, isTernary, null); - } - - InplaceArithmetic(TruffleString methodName, TruffleString binaryOpName, @SuppressWarnings("unused") String operator, BinaryArithmetic binary, boolean isTernary, SpecialMethodSlot slot) { - assert methodName.toJavaStringUncached().startsWith("__i") && methodName.toJavaStringUncached().substring(3).equals(binaryOpName.toJavaStringUncached().substring(2)); - this.methodName = methodName; - this.binary = binary; - this.isTernary = isTernary; - this.binaryOpName = binaryOpName; - this.slot = slot; - - this.notImplementedHandler = () -> new LookupAndCallInplaceNode.NotImplementedHandler() { - @Child private PRaiseNode raiseNode = PRaiseNode.create(); - - @Override - public Object execute(Object arg, Object arg2) { - throw raiseNode.raise(TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_FOR_S_P_AND_P, operator, arg, arg2); - } - }; - } - - public TruffleString getMethodName() { - return methodName; - } - - public boolean isTernary() { - return isTernary; - } - - /** - * A helper root node that dispatches to {@link LookupAndCallInplaceNode} to execute the - * provided in-place operator. This node is mostly useful to use such operators from a location - * without a frame (e.g. from interop). Note: this is just a root node and won't do any - * signature checking. - */ - static final class CallInplaceArithmeticRootNode extends CallArithmeticRootNode { - - @Child private LookupAndCallInplaceNode callInplaceNode; - - private final InplaceArithmetic inplaceOperator; - - CallInplaceArithmeticRootNode(PythonLanguage language, InplaceArithmetic inplaceOperator) { - super(language); - this.inplaceOperator = inplaceOperator; - } - - @Override - public Signature getSignature() { - if (inplaceOperator.isTernary()) { - return CallTernaryArithmeticRootNode.SIGNATURE_TERNARY; - } - return CallBinaryArithmeticRootNode.SIGNATURE_BINARY; - } - - @Override - protected Object doCall(VirtualFrame frame) { - if (callInplaceNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - callInplaceNode = insert(inplaceOperator.create()); - } - // most of the in-place operators are binary but there can also be ternary - if (inplaceOperator.isTernary()) { - return callInplaceNode.executeTernary(frame, PArguments.getArgument(frame, 0), PArguments.getArgument(frame, 1), PArguments.getArgument(frame, 2)); - } - return callInplaceNode.execute(frame, PArguments.getArgument(frame, 0), PArguments.getArgument(frame, 1)); - } - } - - public LookupAndCallInplaceNode create() { - return LookupAndCallInplaceNode.create(this); - } - - /** - * Creates a root node for this in-place operator such that the operator can be executed via a - * full call. - */ - public RootNode createRootNode(PythonLanguage language) { - return new CallInplaceArithmeticRootNode(language, this); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/LookupAndCallInplaceNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/LookupAndCallInplaceNode.java deleted file mode 100644 index 5753161223..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/LookupAndCallInplaceNode.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.expression; - -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.PNotImplemented; -import com.oracle.graal.python.nodes.PGuards; -import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode; -import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode; -import com.oracle.graal.python.nodes.attributes.LookupInMROBaseNode; -import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallTernaryNode; -import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Bind; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; - -public abstract class LookupAndCallInplaceNode extends PNodeWithContext implements BinaryOp { - - public abstract static class NotImplementedHandler extends PNodeWithContext { - public abstract Object execute(Object arg, Object arg2); - } - - @Child private CallBinaryMethodNode callBinaryMethodNode; - @Child private BinaryOpNode binaryOpNode; - @Child private LookupAndCallTernaryNode lookupAndCallTernaryNode; - @Child private NotImplementedHandler handler; - - final InplaceArithmetic arithmetic; - - LookupAndCallInplaceNode(InplaceArithmetic arithmetic) { - this.arithmetic = arithmetic; - } - - public static LookupAndCallInplaceNode create(InplaceArithmetic arithmetic) { - return LookupAndCallInplaceNodeGen.create(arithmetic); - } - - private CallBinaryMethodNode ensureBinaryCallNode() { - if (callBinaryMethodNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - callBinaryMethodNode = insert(CallBinaryMethodNode.create()); - } - return callBinaryMethodNode; - } - - private BinaryOpNode ensureLookupAndCallBinaryNode() { - if (binaryOpNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - binaryOpNode = insert(arithmetic.binary.create()); - } - return binaryOpNode; - } - - private LookupAndCallTernaryNode ensureLookupAndCallTernaryNode() { - if (lookupAndCallTernaryNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - lookupAndCallTernaryNode = insert(LookupAndCallTernaryNode.createReversible(arithmetic.binaryOpName, null)); - } - return lookupAndCallTernaryNode; - } - - @Override - public final Object executeObject(VirtualFrame frame, Object left, Object right) { - return execute(frame, left, right); - } - - public final Object execute(VirtualFrame frame, Object left, Object right) { - return executeTernary(frame, left, right, PNone.NO_VALUE); - } - - public abstract Object executeTernary(VirtualFrame frame, Object x, Object y, Object z); - - @NeverDefault - protected final LookupInMROBaseNode createInplaceLookup() { - if (arithmetic.slot != null) { - return LookupCallableSlotInMRONode.create(arithmetic.slot); - } else { - return LookupAttributeInMRONode.create(arithmetic.methodName); - } - } - - @Specialization - Object doBinary(VirtualFrame frame, Object left, Object right, Object z, - @Bind("this") Node inliningTarget, - @Cached GetClassNode getClassNode, - @Cached("createInplaceLookup()") LookupInMROBaseNode lookupInplace) { - Object result; - Object inplaceCallable = lookupInplace.execute(getClassNode.execute(inliningTarget, left)); - if (inplaceCallable != PNone.NO_VALUE) { - // nb.: The only ternary in-place operator is '__ipow__' but according to 'typeobject.c: - // slot_nb_inplace_power', this is always called as binary. - result = ensureBinaryCallNode().executeObject(frame, inplaceCallable, left, right); - if (result != PNotImplemented.NOT_IMPLEMENTED) { - return result; - } - } - - // try non-inplace variant - boolean isBinary = PGuards.isPNone(z); - if (isBinary) { - result = ensureLookupAndCallBinaryNode().executeObject(frame, left, right); - } else { - result = ensureLookupAndCallTernaryNode().execute(frame, left, right, z); - } - if (result != PNotImplemented.NOT_IMPLEMENTED) { - return result; - } - if (handler == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - handler = insert(arithmetic.notImplementedHandler.get()); - } - return handler.execute(left, right); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/TernaryArithmetic.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/TernaryArithmetic.java deleted file mode 100644 index 1a83d7d96e..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/TernaryArithmetic.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.expression; - -import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; -import static com.oracle.graal.python.util.PythonUtils.tsArray; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.function.PArguments; -import com.oracle.graal.python.builtins.objects.function.Signature; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.nodes.call.special.LookupAndCallTernaryNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallTernaryNode.NotImplementedHandler; -import com.oracle.graal.python.util.Supplier; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.RootNode; -import com.oracle.truffle.api.strings.TruffleString; - -public enum TernaryArithmetic { - Pow(SpecialMethodNames.T___POW__, "**", "pow"); - - private final TruffleString methodName; - private final Supplier notImplementedHandler; - - TernaryArithmetic(TruffleString methodName, @SuppressWarnings("unused") String operator, String operatorFunction) { - this.methodName = methodName; - this.notImplementedHandler = () -> new NotImplementedHandler() { - @Child private PRaiseNode raiseNode = PRaiseNode.create(); - - @Override - public Object execute(Object arg, Object arg2, Object arg3) { - if (arg3 instanceof PNone) { - throw raiseNode.raise(TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_FOR_S_PR_S_P_AND_P, operator, operatorFunction, arg, arg2); - } else { - throw raiseNode.raise(TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_FOR_S_P_P_P, operatorFunction, arg, arg2, arg3); - } - } - }; - } - - public TruffleString getMethodName() { - return methodName; - } - - /** - * A helper root node that dispatches to {@link LookupAndCallTernaryNode} to execute the - * provided ternary operator. This node is mostly useful to use such operators from a location - * without a frame (e.g. from interop). Note: this is just a root node and won't do any - * signature checking. - */ - static final class CallTernaryArithmeticRootNode extends CallArithmeticRootNode { - static final Signature SIGNATURE_TERNARY = new Signature(3, false, -1, false, tsArray("x", "y", "z"), null); - - @Child private LookupAndCallTernaryNode callTernaryNode; - - private final TernaryArithmetic ternaryOperator; - - private CallTernaryArithmeticRootNode(PythonLanguage language, TernaryArithmetic ternaryOperator) { - super(language); - this.ternaryOperator = ternaryOperator; - } - - @Override - public Signature getSignature() { - return SIGNATURE_TERNARY; - } - - @Override - protected Object doCall(VirtualFrame frame) { - if (callTernaryNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - callTernaryNode = insert(ternaryOperator.create()); - } - return callTernaryNode.execute(frame, PArguments.getArgument(frame, 0), PArguments.getArgument(frame, 1), PArguments.getArgument(frame, 2)); - } - } - - public LookupAndCallTernaryNode create() { - return LookupAndCallTernaryNode.createReversible(methodName, notImplementedHandler); - } - - /** - * Creates a root node for this ternary operator such that the operator can be executed via a - * full call. - */ - public RootNode createRootNode(PythonLanguage language) { - return new CallTernaryArithmeticRootNode(language, this); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/UnaryArithmetic.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/UnaryArithmetic.java deleted file mode 100644 index 6cd97b2904..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/UnaryArithmetic.java +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.expression; - -import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; -import static com.oracle.graal.python.util.PythonUtils.tsArray; - -import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.objects.function.PArguments; -import com.oracle.graal.python.builtins.objects.function.Signature; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; -import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode.NoAttributeHandler; -import com.oracle.graal.python.util.Supplier; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.GenerateCached; -import com.oracle.truffle.api.dsl.GenerateInline; -import com.oracle.truffle.api.dsl.ImportStatic; -import com.oracle.truffle.api.dsl.NeverDefault; -import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.RootNode; -import com.oracle.truffle.api.strings.TruffleString; - -public enum UnaryArithmetic { - Pos(UnaryArithmeticFactory.PosNodeGen::create), - Neg(UnaryArithmeticFactory.NegNodeGen::create), - Invert(UnaryArithmeticFactory.InvertNodeGen::create); - - interface CreateUnaryOp { - UnaryOpNode create(); - } - - private final CreateUnaryOp create; - - UnaryArithmetic(CreateUnaryOp create) { - this.create = create; - } - - /** - * A helper root node that dispatches to {@link LookupAndCallUnaryNode} to execute the provided - * unary operator. This node is mostly useful to use such operators from a location without a - * frame (e.g. from interop). Note: this is just a root node and won't do any signature - * checking. - */ - static final class CallUnaryArithmeticRootNode extends CallArithmeticRootNode { - private static final Signature SIGNATURE_UNARY = new Signature(1, false, -1, false, tsArray("$self"), null); - - @Child private UnaryOpNode callUnaryNode; - - private final UnaryArithmetic unaryOperator; - - CallUnaryArithmeticRootNode(PythonLanguage language, UnaryArithmetic unaryOperator) { - super(language); - this.unaryOperator = unaryOperator; - } - - @Override - public Signature getSignature() { - return SIGNATURE_UNARY; - } - - @Override - protected Object doCall(VirtualFrame frame) { - if (callUnaryNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - callUnaryNode = insert(unaryOperator.create()); - } - return callUnaryNode.executeCached(frame, PArguments.getArgument(frame, 0)); - } - } - - public UnaryOpNode create() { - return create.create(); - } - - /** - * Creates a root node for this unary operator such that the operator can be executed via a full - * call. - */ - public RootNode createRootNode(PythonLanguage language) { - return new CallUnaryArithmeticRootNode(language, this); - } - - @ImportStatic(SpecialMethodNames.class) - public abstract static class UnaryArithmeticNode extends UnaryOpNode { - - static Supplier createHandler(String operator) { - - return () -> new NoAttributeHandler() { - @Child private PRaiseNode raiseNode = PRaiseNode.create(); - - @Override - public Object execute(Object receiver) { - throw raiseNode.raise(TypeError, ErrorMessages.BAD_OPERAND_FOR, "unary ", operator, receiver); - } - }; - } - - @NeverDefault - public static LookupAndCallUnaryNode createCallNode(TruffleString name, Supplier handler) { - return LookupAndCallUnaryNode.create(name, handler); - } - } - - /* - * - * All the following fast paths need to be kept in sync with the corresponding builtin functions - * in IntBuiltins and FloatBuiltins. - * - */ - - @GenerateInline(inlineByDefault = true) - @GenerateCached - public abstract static class PosNode extends UnaryArithmeticNode { - - public static final Supplier NOT_IMPLEMENTED = createHandler("+"); - - @Specialization - public static int pos(int arg) { - return arg; - } - - @Specialization - public static long pos(long arg) { - return arg; - } - - @Specialization - public static double pos(double arg) { - return arg; - } - - @Specialization - public static Object doGeneric(VirtualFrame frame, Object arg, - @Cached(value = "createCallNode(T___POS__, NOT_IMPLEMENTED)", inline = false) LookupAndCallUnaryNode callNode) { - return callNode.executeObject(frame, arg); - } - - @NeverDefault - public static PosNode create() { - return UnaryArithmeticFactory.PosNodeGen.create(); - } - } - - @GenerateInline(inlineByDefault = true) - @GenerateCached - public abstract static class NegNode extends UnaryArithmeticNode { - - public static final Supplier NOT_IMPLEMENTED = createHandler("-"); - - @Specialization(rewriteOn = ArithmeticException.class) - public static int neg(int arg) { - return Math.negateExact(arg); - } - - @Specialization - public static long negOvf(int arg) { - return -((long) arg); - } - - @Specialization(rewriteOn = ArithmeticException.class) - public static long neg(long arg) { - return Math.negateExact(arg); - } - - @Specialization - public static double neg(double arg) { - return -arg; - } - - @Specialization - public static Object doGeneric(VirtualFrame frame, Object arg, - @Cached(value = "createCallNode(T___NEG__, NOT_IMPLEMENTED)", inline = false) LookupAndCallUnaryNode callNode) { - return callNode.executeObject(frame, arg); - } - - @NeverDefault - public static NegNode create() { - return UnaryArithmeticFactory.NegNodeGen.create(); - } - } - - @GenerateInline(inlineByDefault = true) - @GenerateCached - public abstract static class InvertNode extends UnaryArithmeticNode { - - public static final Supplier NOT_IMPLEMENTED = createHandler("~"); - - @Specialization - public static int invert(boolean arg) { - return ~(arg ? 1 : 0); - } - - @Specialization - public static int invert(int arg) { - return ~arg; - } - - @Specialization - public static long invert(long arg) { - return ~arg; - } - - @Specialization - public static Object doGeneric(VirtualFrame frame, Object arg, - @Cached(value = "createCallNode(T___INVERT__, NOT_IMPLEMENTED)", inline = false) LookupAndCallUnaryNode callNode) { - return callNode.executeObject(frame, arg); - } - - @NeverDefault - public static InvertNode create() { - return UnaryArithmeticFactory.InvertNodeGen.create(); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/UnaryOpNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/UnaryOpNode.java index e5b6a205c8..23d41297ca 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/UnaryOpNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/expression/UnaryOpNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -27,12 +27,7 @@ import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; public abstract class UnaryOpNode extends PNodeWithContext { - public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object value); - - public final Object executeCached(VirtualFrame frame, Object value) { - return execute(frame, this, value); - } + public abstract Object execute(VirtualFrame frame, Object value); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/DeleteGlobalNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/DeleteGlobalNode.java index e24332f33f..c5278467fb 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/DeleteGlobalNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/DeleteGlobalNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,13 +43,14 @@ import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.module.PythonModule; import com.oracle.graal.python.lib.PyObjectDelItem; +import com.oracle.graal.python.lib.PyObjectSetAttr; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.attributes.DeleteAttributeNode; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; @@ -58,6 +59,7 @@ @GenerateUncached @SuppressWarnings("truffle-inlining") // footprint reduction 52 -> 36 public abstract class DeleteGlobalNode extends PNodeWithContext { + @NeverDefault public static DeleteGlobalNode create() { return DeleteGlobalNodeGen.create(); } @@ -88,14 +90,14 @@ static void deleteDict(VirtualFrame frame, PDict globals, TruffleString attribut static void deleteModuleCached(VirtualFrame frame, @SuppressWarnings("unused") PythonModule globals, TruffleString attributeId, @Bind("this") Node inliningTarget, @Cached(value = "globals", weak = true) PythonModule cachedGlobals, - @Shared @Cached DeleteAttributeNode storeNode) { - storeNode.execute(frame, inliningTarget, cachedGlobals, attributeId); + @Shared @Cached PyObjectSetAttr setAttr) { + setAttr.delete(frame, inliningTarget, cachedGlobals, attributeId); } @Specialization(replaces = "deleteModuleCached") static void deleteModule(VirtualFrame frame, PythonModule globals, TruffleString attributeId, @Bind("this") Node inliningTarget, - @Shared @Cached DeleteAttributeNode storeNode) { - storeNode.execute(frame, inliningTarget, globals, attributeId); + @Shared @Cached PyObjectSetAttr setAttr) { + setAttr.delete(frame, inliningTarget, globals, attributeId); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/GetCurrentFrameRef.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/GetCurrentFrameRef.java index 4edcffb3fb..9236e1387f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/GetCurrentFrameRef.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/GetCurrentFrameRef.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,7 +40,6 @@ */ package com.oracle.graal.python.nodes.frame; -import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.frame.PFrame; import com.oracle.graal.python.builtins.objects.frame.PFrame.Reference; import com.oracle.graal.python.builtins.objects.function.PArguments; @@ -78,7 +77,8 @@ static Reference doWithFrame(Frame frame) { Reference doWithoutFrame(@SuppressWarnings("unused") Frame frame, @Cached(value = "getFlag()", uncached = "getFlagUncached()", dimensions = 1) ConditionProfile[] flag) { - PFrame.Reference ref = PythonContext.get(this).peekTopFrameInfo(PythonLanguage.get(this)); + PythonContext context = PythonContext.get(this); + PFrame.Reference ref = context.peekTopFrameInfo(context.getLanguage(this)); if (flag[0] == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); // executed the first time, don't pollute the profile, we'll mark the caller to @@ -99,7 +99,8 @@ Reference doWithoutFrame(@SuppressWarnings("unused") Frame frame, Reference doGeneric(Frame frame) { PFrame.Reference ref; if (frame == null) { - ref = PythonContext.get(this).peekTopFrameInfo(PythonLanguage.get(this)); + PythonContext context = PythonContext.get(this); + ref = context.peekTopFrameInfo(context.getLanguage(this)); if (ref == null) { return PArguments.getCurrentFrameInfo(ReadCallerFrameNode.getCurrentFrame(this, FrameInstance.FrameAccess.READ_ONLY)); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/GetFrameLocalsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/GetFrameLocalsNode.java index fc9a5628bd..27cded0b2a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/GetFrameLocalsNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/GetFrameLocalsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,15 +40,22 @@ */ package com.oracle.graal.python.nodes.frame; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.cell.PCell; +import com.oracle.graal.python.builtins.objects.common.HashingStorage; +import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageDelItem; +import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItem; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.frame.PFrame; import com.oracle.graal.python.compiler.CodeUnit; -import com.oracle.graal.python.lib.PyDictDelItem; import com.oracle.graal.python.lib.PyDictGetItem; -import com.oracle.graal.python.lib.PyDictSetItem; +import com.oracle.graal.python.nodes.PRootNode; import com.oracle.graal.python.nodes.bytecode.FrameInfo; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.nodes.bytecode_dsl.BytecodeDSLFrameInfo; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode; +import com.oracle.graal.python.runtime.PythonOptions; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.bytecode.BytecodeNode; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; @@ -63,6 +70,7 @@ import com.oracle.truffle.api.frame.MaterializedFrame; import com.oracle.truffle.api.nodes.ExplodeLoop; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.strings.TruffleString; /** @@ -85,14 +93,15 @@ public static Object executeUncached(PFrame pyFrame) { } @Specialization(guards = "!pyFrame.hasCustomLocals()") - static Object doLoop(PFrame pyFrame, - @Cached(inline = false) PythonObjectFactory factory, + static Object doLoop(Node inliningTarget, PFrame pyFrame, + @Cached InlinedBranchProfile create, @Cached(inline = false) CopyLocalsToDict copyLocalsToDict) { MaterializedFrame locals = pyFrame.getLocals(); // It doesn't have custom locals, so it has to be a builtin dict or null PDict localsDict = (PDict) pyFrame.getLocalsDict(); if (localsDict == null) { - localsDict = factory.createDict(); + create.enter(inliningTarget); + localsDict = PFactory.createDict(PythonLanguage.get(inliningTarget)); pyFrame.setLocalsDict(localsDict); } copyLocalsToDict.execute(locals, localsDict); @@ -118,39 +127,58 @@ void doCachedFd(MaterializedFrame locals, PDict dict, @SuppressWarnings("unused") @Cached("locals.getFrameDescriptor()") FrameDescriptor cachedFd, @Bind("getInfo(cachedFd)") FrameInfo info, @Bind("info.getVariableCount()") int count, - @Shared("setItem") @Cached PyDictSetItem setItem, - @Shared("delItem") @Cached PyDictDelItem delItem) { - CodeUnit co = info.getRootNode().getCodeUnit(); - int regularVarCount = co.varnames.length; - for (int i = 0; i < count; i++) { - copyItem(inliningTarget, locals, info, dict, setItem, delItem, i, i >= regularVarCount); + @Shared("setItem") @Cached HashingStorageSetItem setItem, + @Shared("delItem") @Cached HashingStorageDelItem delItem) { + int regularVarCount = info.getRegularVariableCount(); + + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + BytecodeDSLFrameInfo bytecodeDSLFrameInfo = (BytecodeDSLFrameInfo) info; + PBytecodeDSLRootNode rootNode = bytecodeDSLFrameInfo.getRootNode(); + Object[] localsArray = rootNode.getBytecodeNode().getLocalValues(0, locals); + for (int i = 0; i < count; i++) { + copyItem(inliningTarget, localsArray[i], info, dict, setItem, delItem, i, i >= regularVarCount); + } + } else { + for (int i = 0; i < count; i++) { + copyItem(inliningTarget, locals.getValue(i), info, dict, setItem, delItem, i, i >= regularVarCount); + } } } @Specialization(replaces = "doCachedFd") void doGeneric(MaterializedFrame locals, PDict dict, @Bind("this") Node inliningTarget, - @Shared("setItem") @Cached PyDictSetItem setItem, - @Shared("delItem") @Cached PyDictDelItem delItem) { + @Shared("setItem") @Cached HashingStorageSetItem setItem, + @Shared("delItem") @Cached HashingStorageDelItem delItem) { FrameInfo info = getInfo(locals.getFrameDescriptor()); int count = info.getVariableCount(); - CodeUnit co = info.getRootNode().getCodeUnit(); - int regularVarCount = co.varnames.length; - for (int i = 0; i < count; i++) { - copyItem(inliningTarget, locals, info, dict, setItem, delItem, i, i >= regularVarCount); + int regularVarCount = info.getRegularVariableCount(); + + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + BytecodeDSLFrameInfo bytecodeDSLFrameInfo = (BytecodeDSLFrameInfo) info; + PBytecodeDSLRootNode rootNode = bytecodeDSLFrameInfo.getRootNode(); + Object[] localsArray = rootNode.getBytecodeNode().getLocalValues(0, locals); + for (int i = 0; i < count; i++) { + copyItem(inliningTarget, localsArray[i], info, dict, setItem, delItem, i, i >= regularVarCount); + } + } else { + for (int i = 0; i < count; i++) { + copyItem(inliningTarget, locals.getValue(i), info, dict, setItem, delItem, i, i >= regularVarCount); + } } } - private static void copyItem(Node inliningTarget, MaterializedFrame locals, FrameInfo info, PDict dict, PyDictSetItem setItem, PyDictDelItem delItem, int i, boolean deref) { + private static void copyItem(Node inliningTarget, Object localValue, FrameInfo info, PDict dict, HashingStorageSetItem setItem, HashingStorageDelItem delItem, int i, boolean deref) { TruffleString name = info.getVariableName(i); - Object value = locals.getValue(i); + Object value = localValue; if (deref && value != null) { value = ((PCell) value).getRef(); } if (value == null) { - delItem.execute(inliningTarget, dict, name); + delItem.execute(inliningTarget, dict.getDictStorage(), name, dict); } else { - setItem.execute(inliningTarget, dict, name, value); + HashingStorage storage = setItem.execute(inliningTarget, dict.getDictStorage(), name, value); + dict.setDictStorage(storage); } } @@ -163,24 +191,39 @@ protected static FrameInfo getInfo(FrameDescriptor fd) { /** * Equivalent of CPython's {@code PyFrame_LocalsToFast} */ - public static void syncLocalsBackToFrame(CodeUnit co, PFrame pyFrame, Frame localFrame) { + public static void syncLocalsBackToFrame(CodeUnit co, PRootNode root, PFrame pyFrame, Frame localFrame) { if (!pyFrame.hasCustomLocals()) { PDict localsDict = (PDict) pyFrame.getLocalsDict(); - copyLocalsArray(localFrame, localsDict, co.varnames, 0, false); - copyLocalsArray(localFrame, localsDict, co.cellvars, co.varnames.length, true); - copyLocalsArray(localFrame, localsDict, co.freevars, co.varnames.length + co.cellvars.length, true); + copyLocalsArray(localFrame, root, localsDict, co.varnames, 0, false); + copyLocalsArray(localFrame, root, localsDict, co.cellvars, co.varnames.length, true); + copyLocalsArray(localFrame, root, localsDict, co.freevars, co.varnames.length + co.cellvars.length, true); } } - private static void copyLocalsArray(Frame localFrame, PDict localsDict, TruffleString[] namesArray, int offset, boolean deref) { - for (int i = 0; i < namesArray.length; i++) { - TruffleString varname = namesArray[i]; - Object value = PyDictGetItem.executeUncached(localsDict, varname); - if (deref) { - PCell cell = (PCell) localFrame.getObject(offset + i); - cell.setRef(value); - } else { - localFrame.setObject(offset + i, value); + private static void copyLocalsArray(Frame localFrame, PRootNode root, PDict localsDict, TruffleString[] namesArray, int offset, boolean deref) { + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + PBytecodeDSLRootNode bytecodeDSLRootNode = (PBytecodeDSLRootNode) root; + BytecodeNode bytecodeNode = bytecodeDSLRootNode.getBytecodeNode(); + for (int i = 0; i < namesArray.length; i++) { + TruffleString varname = namesArray[i]; + Object value = PyDictGetItem.executeUncached(localsDict, varname); + if (deref) { + PCell cell = (PCell) bytecodeNode.getLocalValue(0, localFrame, offset + i); + cell.setRef(value); + } else { + bytecodeNode.setLocalValue(0, localFrame, offset + i, value); + } + } + } else { + for (int i = 0; i < namesArray.length; i++) { + TruffleString varname = namesArray[i]; + Object value = PyDictGetItem.executeUncached(localsDict, varname); + if (deref) { + PCell cell = (PCell) localFrame.getObject(offset + i); + cell.setRef(value); + } else { + localFrame.setObject(offset + i, value); + } } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/MaterializeFrameNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/MaterializeFrameNode.java index 113f6234cc..396ecf6644 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/MaterializeFrameNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/MaterializeFrameNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,12 +40,18 @@ */ package com.oracle.graal.python.nodes.frame; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.frame.PFrame; import com.oracle.graal.python.builtins.objects.function.PArguments; +import com.oracle.graal.python.nodes.bytecode.BytecodeFrameInfo; import com.oracle.graal.python.nodes.bytecode.FrameInfo; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.nodes.bytecode_dsl.BytecodeDSLFrameInfo; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode; +import com.oracle.graal.python.runtime.PythonOptions; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.Truffle; +import com.oracle.truffle.api.bytecode.BytecodeNode; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; @@ -107,39 +113,38 @@ public final PFrame execute(Frame frame, Node location, boolean markAsEscaped, b "!hasCustomLocals(frameToMaterialize)"}, limit = "1") static PFrame freshPFrameCachedFD(Node location, boolean markAsEscaped, boolean forceSync, Frame frameToMaterialize, @Cached(value = "frameToMaterialize.getFrameDescriptor()") FrameDescriptor cachedFD, - @Shared("factory") @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Shared("syncValuesNode") @Cached SyncFrameValuesNode syncValuesNode) { MaterializedFrame locals = createLocalsFrame(cachedFD); - PFrame escapedFrame = factory.createPFrame(PArguments.getCurrentFrameInfo(frameToMaterialize), location, locals); - return doEscapeFrame(frameToMaterialize, escapedFrame, markAsEscaped, forceSync, syncValuesNode); + PFrame escapedFrame = PFactory.createPFrame(language, PArguments.getCurrentFrameInfo(frameToMaterialize), location, locals); + return doEscapeFrame(frameToMaterialize, escapedFrame, markAsEscaped, forceSync, location, syncValuesNode); } @Specialization(guards = {"getPFrame(frameToMaterialize) == null", "!hasGeneratorFrame(frameToMaterialize)", "!hasCustomLocals(frameToMaterialize)"}, replaces = "freshPFrameCachedFD") static PFrame freshPFrame(Node location, boolean markAsEscaped, boolean forceSync, Frame frameToMaterialize, - @Shared("factory") @Cached PythonObjectFactory factory, + @Bind PythonLanguage language, @Shared("syncValuesNode") @Cached SyncFrameValuesNode syncValuesNode) { MaterializedFrame locals = createLocalsFrame(frameToMaterialize.getFrameDescriptor()); - PFrame escapedFrame = factory.createPFrame(PArguments.getCurrentFrameInfo(frameToMaterialize), location, locals); - return doEscapeFrame(frameToMaterialize, escapedFrame, markAsEscaped, forceSync, syncValuesNode); + PFrame escapedFrame = PFactory.createPFrame(language, PArguments.getCurrentFrameInfo(frameToMaterialize), location, locals); + return doEscapeFrame(frameToMaterialize, escapedFrame, markAsEscaped, forceSync, location, syncValuesNode); } @Specialization(guards = {"getPFrame(frameToMaterialize) == null", "!hasGeneratorFrame(frameToMaterialize)", "hasCustomLocals(frameToMaterialize)"}) static PFrame freshPFrameCusstomLocals(Node location, boolean markAsEscaped, @SuppressWarnings("unused") boolean forceSync, Frame frameToMaterialize, - @Shared("factory") @Cached PythonObjectFactory factory) { - PFrame escapedFrame = factory.createPFrame(PArguments.getCurrentFrameInfo(frameToMaterialize), location, null); + @Bind PythonLanguage language) { + PFrame escapedFrame = PFactory.createPFrame(language, PArguments.getCurrentFrameInfo(frameToMaterialize), location, null); escapedFrame.setLocalsDict(PArguments.getSpecialArgument(frameToMaterialize)); - return doEscapeFrame(frameToMaterialize, escapedFrame, markAsEscaped, false, null); + return doEscapeFrame(frameToMaterialize, escapedFrame, markAsEscaped, false, location, null); } @Specialization(guards = {"getPFrame(frameToMaterialize) == null", "hasGeneratorFrame(frameToMaterialize)"}) - static PFrame freshPFrameForGenerator(Node location, @SuppressWarnings("unused") boolean markAsEscaped, @SuppressWarnings("unused") boolean forceSync, Frame frameToMaterialize, - @Shared("factory") @Cached PythonObjectFactory factory) { + static PFrame freshPFrameForGenerator(Node location, @SuppressWarnings("unused") boolean markAsEscaped, @SuppressWarnings("unused") boolean forceSync, Frame frameToMaterialize) { MaterializedFrame generatorFrame = PArguments.getGeneratorFrame(frameToMaterialize); PFrame.Reference frameRef = PArguments.getCurrentFrameInfo(frameToMaterialize); - PFrame escapedFrame = materializeGeneratorFrame(location, generatorFrame, frameRef, factory); + PFrame escapedFrame = materializeGeneratorFrame(location, generatorFrame, frameRef); frameRef.setPyFrame(escapedFrame); - return doEscapeFrame(frameToMaterialize, escapedFrame, markAsEscaped, false, null); + return doEscapeFrame(frameToMaterialize, escapedFrame, markAsEscaped, false, location, null); } @Specialization(guards = "getPFrame(frameToMaterialize) != null") @@ -154,7 +159,7 @@ static PFrame alreadyEscapedFrame(@SuppressWarnings("unused") Node location, boo if (markAsEscaped) { pyFrame.getRef().markAsEscaped(); } - processBytecodeFrame(frameToMaterialize, pyFrame); + processBytecodeFrame(frameToMaterialize, pyFrame, location); return pyFrame; } @@ -162,22 +167,40 @@ private static MaterializedFrame createLocalsFrame(FrameDescriptor cachedFD) { return Truffle.getRuntime().createMaterializedFrame(PythonUtils.EMPTY_OBJECT_ARRAY, cachedFD); } - public static PFrame materializeGeneratorFrame(Node location, MaterializedFrame generatorFrame, PFrame.Reference frameRef, PythonObjectFactory factory) { - PFrame escapedFrame = factory.createPFrame(frameRef, location, generatorFrame); + public static PFrame materializeGeneratorFrame(Node location, MaterializedFrame generatorFrame, PFrame.Reference frameRef) { + PFrame escapedFrame = PFactory.createPFrame(PythonLanguage.get(location), frameRef, location, generatorFrame); PArguments.synchronizeArgs(generatorFrame, escapedFrame); return escapedFrame; } - private static void processBytecodeFrame(Frame frameToMaterialize, PFrame pyFrame) { - FrameInfo info = (FrameInfo) frameToMaterialize.getFrameDescriptor().getInfo(); - if (info != null) { - pyFrame.setBci(info.getBci(frameToMaterialize)); - pyFrame.setLocation(info.getRootNode()); + private static void processBytecodeFrame(Frame frameToMaterialize, PFrame pyFrame, Node location) { + Object info = frameToMaterialize.getFrameDescriptor().getInfo(); + if (info == null) { + return; + } + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + BytecodeNode bytecodeNode = BytecodeNode.get(location); + if (bytecodeNode == null) { + /** + * Sometimes we don't have a precise location (see + * {@link ReadCallerFrameNode#getFrame}). Set bci to -1 to mark the location as + * unknown. + */ + pyFrame.setBci(-1); + pyFrame.setLocation(location); + } else { + pyFrame.setBci(bytecodeNode.getBytecodeIndex(frameToMaterialize)); + pyFrame.setLocation(bytecodeNode); + } + } else { + BytecodeFrameInfo bytecodeFrameInfo = (BytecodeFrameInfo) info; + pyFrame.setBci(bytecodeFrameInfo.getBci(frameToMaterialize)); + pyFrame.setLocation(bytecodeFrameInfo.getRootNode()); } } private static PFrame doEscapeFrame(Frame frameToMaterialize, PFrame escapedFrame, boolean markAsEscaped, boolean forceSync, - SyncFrameValuesNode syncValuesNode) { + Node location, SyncFrameValuesNode syncValuesNode) { PFrame.Reference topFrameRef = PArguments.getCurrentFrameInfo(frameToMaterialize); topFrameRef.setPyFrame(escapedFrame); @@ -189,12 +212,13 @@ private static PFrame doEscapeFrame(Frame frameToMaterialize, PFrame escapedFram if (markAsEscaped) { topFrameRef.markAsEscaped(); } - processBytecodeFrame(frameToMaterialize, escapedFrame); + processBytecodeFrame(frameToMaterialize, escapedFrame, location); return escapedFrame; } protected static boolean hasGeneratorFrame(Frame frame) { - return PArguments.getGeneratorFrame(frame) != null; + return !PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER && + PArguments.getGeneratorFrame(frame) != null; } protected static boolean hasCustomLocals(Frame frame) { @@ -216,7 +240,8 @@ public abstract static class SyncFrameValuesNode extends Node { public abstract void execute(PFrame pyFrame, Frame frameToSync); - @Specialization(guards = {"!pyFrame.hasCustomLocals()", "frameToSync.getFrameDescriptor() == cachedFd", + @Specialization(guards = {"!pyFrame.hasCustomLocals()", + "frameToSync.getFrameDescriptor() == cachedFd", "variableSlotCount(cachedFd) < 32"}, limit = "1") @ExplodeLoop static void doSyncExploded(PFrame pyFrame, Frame frameToSync, @@ -224,17 +249,37 @@ static void doSyncExploded(PFrame pyFrame, Frame frameToSync, MaterializedFrame target = pyFrame.getLocals(); assert cachedFd == target.getFrameDescriptor(); int slotCount = variableSlotCount(cachedFd); - for (int slot = 0; slot < slotCount; slot++) { - PythonUtils.copyFrameSlot(frameToSync, target, slot); + + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + FrameInfo info = (FrameInfo) cachedFd.getInfo(); + if (info instanceof BytecodeDSLFrameInfo bytecodeDSLFrameInfo) { + PBytecodeDSLRootNode rootNode = bytecodeDSLFrameInfo.getRootNode(); + rootNode.getBytecodeNode().copyLocalValues(0, frameToSync, target, 0, slotCount); + } + } else { + for (int i = 0; i < slotCount; i++) { + PythonUtils.copyFrameSlot(frameToSync, target, i); + } } } @Specialization(guards = "!pyFrame.hasCustomLocals()", replaces = "doSyncExploded") - static void doSyncLoop(PFrame pyFrame, Frame frameToSync) { + @ExplodeLoop + static void doSync(PFrame pyFrame, Frame frameToSync) { MaterializedFrame target = pyFrame.getLocals(); - int slotCount = variableSlotCount(frameToSync.getFrameDescriptor()); - for (int slot = 0; slot < slotCount; slot++) { - PythonUtils.copyFrameSlot(frameToSync, target, slot); + FrameDescriptor fd = target.getFrameDescriptor(); + int slotCount = variableSlotCount(fd); + + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + FrameInfo info = (FrameInfo) fd.getInfo(); + if (info instanceof BytecodeDSLFrameInfo bytecodeDSLFrameInfo) { + PBytecodeDSLRootNode rootNode = bytecodeDSLFrameInfo.getRootNode(); + rootNode.getBytecodeNode().copyLocalValues(0, frameToSync, target, 0, slotCount); + } + } else { + for (int i = 0; i < slotCount; i++) { + PythonUtils.copyFrameSlot(frameToSync, target, i); + } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/ReadCallerFrameNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/ReadCallerFrameNode.java index cb377ffbd2..82084a442b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/ReadCallerFrameNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/ReadCallerFrameNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,17 +42,16 @@ import java.util.Objects; -import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.frame.PFrame; import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.nodes.PRootNode; import com.oracle.graal.python.runtime.IndirectCallData; -import com.oracle.graal.python.runtime.PythonContext; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.Truffle; +import com.oracle.truffle.api.bytecode.ContinuationRootNode; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.FrameInstance; @@ -274,26 +273,22 @@ public static Frame getCallerFrame(PFrame.Reference startFrame, FrameInstance.Fr @TruffleBoundary private static Frame getFrame(Node requestingNode, PFrame.Reference startFrame, FrameInstance.FrameAccess frameAccess, FrameSelector selector, int level) { - final Frame[] outputFrame = new Frame[1]; - Truffle.getRuntime().iterateFrames(new FrameInstanceVisitor() { + Frame[] outputFrame = new Frame[1]; + Truffle.getRuntime().iterateFrames(new FrameInstanceVisitor<>() { int i = -1; /** * We may find the Python frame at the level we desire, but the {@link PRootNode} - * associated with it may have been called from a different language, and thus not have - * Python {@link IndirectCallData}. That means that we cannot immediately return when we + * associated with it may have been called from a different language, and thus not be + * able to pass the caller frame. That means that we cannot immediately return when we * find the correct level frame, but instead we need to remember the frame in * {@code outputFrame} and then keep going until we find the previous Python caller on - * the stack (or not). That last Python caller before the Python frame we need must push - * the info. - * - * This can easily be seen when this is used to - * {@link PythonContext#peekTopFrameInfo(PythonLanguage)} , because in that case, that - * info must be set by the caller that is somewhere up the stack. + * the stack (or not). That last Python caller should have {@link IndirectCallData} that + * will be marked to pass the frame through the context. * *

                      *                      ================
        -             *                   ,>| PythonCallNode |
        +             *                   ,>| IndirectCallData |
                      *                   |  ================
                      *                   | |  LLVMRootNode  |
                      *                   | |  LLVMCallNode  |
        @@ -308,14 +303,16 @@ private static Frame getFrame(Node requestingNode, PFrame.Reference startFrame,
                      * 
        */ public Frame visitFrame(FrameInstance frameInstance) { - RootCallTarget target = (RootCallTarget) frameInstance.getCallTarget(); - RootNode rootNode = target.getRootNode(); + RootNode rootNode = getRootNode(frameInstance); Node callNode = frameInstance.getCallNode(); boolean didMark = IndirectCallData.setEncapsulatingNeedsToPassCallerFrame(callNode != null ? callNode : requestingNode); - if (outputFrame[0] == null && rootNode instanceof PRootNode pRootNode && pRootNode.setsUpCalleeContext()) { - pRootNode.setNeedsCallerFrame(); + if (rootNode instanceof PRootNode pRootNode && pRootNode.setsUpCalleeContext()) { + if (outputFrame[0] != null) { + return outputFrame[0]; + } + boolean needsCallerFrame = true; if (i < 0 && startFrame != null) { - Frame roFrame = frameInstance.getFrame(FrameInstance.FrameAccess.READ_ONLY); + Frame roFrame = getFrame(frameInstance, FrameInstance.FrameAccess.READ_ONLY); if (PArguments.getCurrentFrameInfo(roFrame) == startFrame) { i = 0; } @@ -324,7 +321,7 @@ public Frame visitFrame(FrameInstance frameInstance) { // a Python frame in CPython. if (!selector.skip(pRootNode)) { if (i == level || startFrame == null) { - Frame frame = frameInstance.getFrame(frameAccess); + Frame frame = getFrame(frameInstance, frameAccess); assert PArguments.isPythonFrame(frame); PFrame.Reference info = PArguments.getCurrentFrameInfo(frame); // avoid overriding the location if we don't know it @@ -340,10 +337,14 @@ public Frame visitFrame(FrameInstance frameInstance) { // cannot materialize it. assert info.getCallNode() != null : "tried to read frame without location (root: " + pRootNode + ")"; outputFrame[0] = frame; + needsCallerFrame = false; } i += 1; } } + if (needsCallerFrame) { + pRootNode.setNeedsCallerFrame(); + } } if (didMark) { return outputFrame[0]; @@ -355,6 +356,25 @@ public Frame visitFrame(FrameInstance frameInstance) { return outputFrame[0]; } + private static RootNode getRootNode(FrameInstance frameInstance) { + RootCallTarget target = (RootCallTarget) frameInstance.getCallTarget(); + RootNode rootNode = target.getRootNode(); + if (rootNode instanceof ContinuationRootNode continuationRoot) { + return (RootNode) continuationRoot.getSourceRootNode(); + } + return rootNode; + } + + private static Frame getFrame(FrameInstance frameInstance, FrameInstance.FrameAccess frameAccess) { + Frame frame = frameInstance.getFrame(frameAccess); + + RootCallTarget target = (RootCallTarget) frameInstance.getCallTarget(); + if (target.getRootNode() instanceof ContinuationRootNode) { + return (Frame) frame.getArguments()[0]; + } + return frame; + } + private MaterializeFrameNode ensureMaterializeNode() { if (materializeNode == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/ReadGlobalOrBuiltinNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/ReadGlobalOrBuiltinNode.java index 465481c0aa..d91eaef145 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/ReadGlobalOrBuiltinNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/ReadGlobalOrBuiltinNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -215,7 +215,7 @@ abstract class ReadBuiltinNode extends PNodeWithContext { @Specialization(guards = "isSingleContext(this)") Object returnBuiltinFromConstantModule(TruffleString attributeId, @Bind("this") Node inliningTarget, - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Exclusive @Cached InlinedConditionProfile isBuiltinProfile, @Shared @Cached ReadAttributeFromObjectNode readFromBuiltinsNode, @SuppressWarnings("unused") @Cached("getBuiltins()") PythonModule builtins) { @@ -223,15 +223,15 @@ Object returnBuiltinFromConstantModule(TruffleString attributeId, } @InliningCutoff - private static PException raiseNameNotDefined(PRaiseNode raiseNode, TruffleString attributeId) { - throw raiseNode.raise(NameError, ErrorMessages.NAME_NOT_DEFINED, attributeId); + private static PException raiseNameNotDefined(Node inliningTarget, PRaiseNode raiseNode, TruffleString attributeId) { + throw raiseNode.raise(inliningTarget, NameError, ErrorMessages.NAME_NOT_DEFINED, attributeId); } @InliningCutoff @Specialization(replaces = "returnBuiltinFromConstantModule") Object returnBuiltin(TruffleString attributeId, @Bind("this") Node inliningTarget, - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Exclusive @Cached InlinedConditionProfile isBuiltinProfile, @Shared @Cached ReadAttributeFromObjectNode readFromBuiltinsNode, @Exclusive @Cached InlinedConditionProfile ctxInitializedProfile) { @@ -239,14 +239,14 @@ Object returnBuiltin(TruffleString attributeId, return returnBuiltinFromConstantModule(attributeId, inliningTarget, raiseNode, isBuiltinProfile, readFromBuiltinsNode, builtins); } - private static Object readBuiltinFromModule(TruffleString attributeId, PRaiseNode.Lazy raiseNode, Node inliningTarget, + private static Object readBuiltinFromModule(TruffleString attributeId, PRaiseNode raiseNode, Node inliningTarget, InlinedConditionProfile isBuiltinProfile, PythonModule builtins, ReadAttributeFromObjectNode readFromBuiltinsNode) { Object builtin = readFromBuiltinsNode.execute(builtins, attributeId); if (isBuiltinProfile.profile(inliningTarget, builtin != PNone.NO_VALUE)) { return builtin; } else { - throw raiseNameNotDefined(raiseNode.get(inliningTarget), attributeId); + throw raiseNameNotDefined(inliningTarget, raiseNode, attributeId); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/ReadNameNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/ReadNameNode.java index 2914a0f998..2ca8e9aba3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/ReadNameNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/ReadNameNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -53,6 +53,7 @@ import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; @@ -68,6 +69,7 @@ public final Object execute(VirtualFrame frame, TruffleString attributeId) { public abstract Object executeImpl(VirtualFrame frame, TruffleString attributeId); + @NeverDefault public static ReadNameNode create() { return ReadNameNodeGen.create(); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/WriteGlobalNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/WriteGlobalNode.java index ade2eadf09..59694b6a9d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/WriteGlobalNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/WriteGlobalNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/WriteNameNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/WriteNameNode.java index cadc06ea8e..d4d6641546 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/WriteNameNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/WriteNameNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/BuiltinFunctionRootNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/BuiltinFunctionRootNode.java index 448caf3553..7d76f1cfd8 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/BuiltinFunctionRootNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/BuiltinFunctionRootNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -56,8 +56,8 @@ import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.WrapBinaryfuncR; import com.oracle.graal.python.nodes.function.builtins.WrapTpNew; +import com.oracle.graal.python.nodes.function.builtins.WrapperDescrCall; import com.oracle.graal.python.runtime.ExecutionContext.CalleeContext; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerAsserts; @@ -89,10 +89,10 @@ public final class BuiltinFunctionRootNode extends PRootNode { private final boolean declaresExplicitSelf; @Child private BuiltinCallNode body; @Child private CalleeContext calleeContext = CalleeContext.create(); - private final PythonBuiltinClassType constructsClass; + private final PythonBuiltinClassType wrapsSlotForClass; public BuiltinFunctionRootNode(PythonLanguage language, Signature signature, Builtin builtin, NodeFactory factory, boolean declaresExplicitSelf, - PythonBuiltinClassType constructsClass) { + PythonBuiltinClassType wrapsSlotForClass) { super(language); CompilerAsserts.neverPartOfCompilation(); this.signature = signature; @@ -100,25 +100,25 @@ public BuiltinFunctionRootNode(PythonLanguage language, Signature signature, Bui this.name = builtin.name(); this.factory = factory; this.declaresExplicitSelf = declaresExplicitSelf; - this.constructsClass = constructsClass; + this.wrapsSlotForClass = wrapsSlotForClass; if (builtin.alwaysNeedsCallerFrame()) { setNeedsCallerFrame(); } } - public BuiltinFunctionRootNode(PythonLanguage language, Builtin builtin, NodeFactory factory, boolean declaresExplicitSelf, - PythonBuiltinClassType constructsClass) { - this(language, createSignature(factory, builtin, declaresExplicitSelf, constructsClass != PythonBuiltinClassType.nil), builtin, factory, declaresExplicitSelf, constructsClass); + public BuiltinFunctionRootNode(PythonLanguage language, Builtin builtin, NodeFactory factory, boolean declaresExplicitSelf) { + this(language, createSignature(factory, builtin, declaresExplicitSelf, false), builtin, factory, declaresExplicitSelf, null); } - public BuiltinFunctionRootNode(PythonLanguage language, Builtin builtin, NodeFactory factory, boolean declaresExplicitSelf) { - this(language, builtin, factory, declaresExplicitSelf, builtin.constructsClass()); + public BuiltinFunctionRootNode(PythonLanguage language, Builtin builtin, NodeFactory factory, boolean declaresExplicitSelf, + PythonBuiltinClassType wrapsSlotForClass) { + this(language, createSignature(factory, builtin, declaresExplicitSelf, false), builtin, factory, declaresExplicitSelf, wrapsSlotForClass); } /** * Should return a signature compatible with {@link #createArgumentsList(Builtin, boolean)} */ - private static Signature createSignature(NodeFactory factory, Builtin builtin, boolean declaresExplicitSelf, boolean constructsClass) { + public static Signature createSignature(NodeFactory factory, Builtin builtin, boolean declaresExplicitSelf, boolean constructsClass) { TruffleString[] parameterNames = toTruffleStringArrayUncached(builtin.parameterNames()); int maxNumPosArgs = Math.max(builtin.minNumOfPositionalArgs(), parameterNames.length); @@ -153,9 +153,6 @@ private static Signature createSignature(NodeFactory factory, Builtin builtin) { @@ -197,6 +194,9 @@ private static boolean validateBuiltin(NodeFactory 0 || + builtin.keywordOnlyNames().length > 0 : "PythonVararagsBuiltin subclass must not define any parameters on the @Builtin annotation, it must do all parameter parsing and validation themselves, builtin" + + nodeClass.getName(); } return true; } @@ -219,7 +219,7 @@ private static void validateBuiltinForArity(Builtin builtin, Class clazz) { @@ -321,10 +321,12 @@ public Object execute(VirtualFrame frame) { } } - if (builtin.reverseOperation()) { - body = insert(new WrapBinaryfuncR(newBody)); - } else if (constructsClass != PythonBuiltinClassType.nil) { - body = insert(new WrapTpNew(newBody, constructsClass)); + if (wrapsSlotForClass != null) { + if (declaresExplicitSelf) { + body = insert(new WrapperDescrCall(newBody, name, wrapsSlotForClass)); + } else { + body = insert(new WrapTpNew(newBody, wrapsSlotForClass)); + } } else { body = insert(newBody); } @@ -383,6 +385,6 @@ protected boolean isCloneUninitializedSupported() { @Override protected RootNode cloneUninitialized() { - return new BuiltinFunctionRootNode(getLanguage(PythonLanguage.class), signature, builtin, factory, declaresExplicitSelf, constructsClass); + return new BuiltinFunctionRootNode(getLanguage(PythonLanguage.class), signature, builtin, factory, declaresExplicitSelf, wrapsSlotForClass); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/PythonVarargsBuiltinNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/PythonVarargsBuiltinNode.java index 9e398bdd70..f9eb3df857 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/PythonVarargsBuiltinNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/PythonVarargsBuiltinNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,79 +40,11 @@ */ package com.oracle.graal.python.nodes.function.builtins; -import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.function.PKeyword; -import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; -import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.ControlFlowException; -import com.oracle.truffle.api.strings.TruffleString; -/** - * Subclasses must override {@link #varArgExecute(VirtualFrame, Object, Object[], PKeyword[])} to - * call the e.g. {@link #execute(VirtualFrame, Object, Object[], PKeyword[])} or whatever is right - * for them, otherwise they will never be on the direct call path. - */ public abstract class PythonVarargsBuiltinNode extends PythonBuiltinBaseNode { - @Child private PythonObjectFactory objectFactory; - @Child private PRaiseNode raiseNode; - - protected final PythonObjectFactory factory() { - if (objectFactory == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - if (isAdoptable()) { - objectFactory = insert(PythonObjectFactory.create()); - } else { - objectFactory = getContext().factory(); - } - } - return objectFactory; - } - - protected final PRaiseNode getRaiseNode() { - if (raiseNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - if (isAdoptable()) { - raiseNode = insert(PRaiseNode.create()); - } else { - raiseNode = PRaiseNode.getUncached(); - } - } - return raiseNode; - } - - public PException raise(PythonBuiltinClassType type, TruffleString string) { - return getRaiseNode().raise(type, string); - } - - public final PException raise(PythonBuiltinClassType type, TruffleString format, Object... arguments) { - return getRaiseNode().raise(type, format, arguments); - } - - public static final class VarargsBuiltinDirectInvocationNotSupported extends ControlFlowException { - public static final VarargsBuiltinDirectInvocationNotSupported INSTANCE = new VarargsBuiltinDirectInvocationNotSupported(); - private static final long serialVersionUID = 1L; - - private VarargsBuiltinDirectInvocationNotSupported() { - } - } - - /** - * {@code frame} may be null. This function must not be called "execute" - */ - @SuppressWarnings("unused") - public Object varArgExecute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords) - throws VarargsBuiltinDirectInvocationNotSupported { - throw VarargsBuiltinDirectInvocationNotSupported.INSTANCE; - } - - /** - * {@code frame} may be null. Most varargs invocations will be (self, *args, *kwargs), so this - * execute method won't hurt. - */ public abstract Object execute(VirtualFrame frame, Object self, Object[] arguments, PKeyword[] keywords); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/WrapBinaryfuncR.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/WrapBinaryfuncR.java deleted file mode 100644 index 51db45cf57..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/WrapBinaryfuncR.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.nodes.function.builtins; - -import com.oracle.graal.python.nodes.argument.ReadArgumentNode; - -// also implements wrap_ternaryfunc_r, because it's the same thing -public final class WrapBinaryfuncR extends SlotWrapper { - public WrapBinaryfuncR(BuiltinCallNode func) { - super(func); - if (func instanceof BuiltinBinaryCallNode) { - ReadArgumentNode arg1 = ((BuiltinBinaryCallNode) func).arg1; - ReadArgumentNode arg2 = ((BuiltinBinaryCallNode) func).arg2; - // they are already adopted as children, so no harm in swapping them - ((BuiltinBinaryCallNode) func).arg1 = arg2; - ((BuiltinBinaryCallNode) func).arg2 = arg1; - } else if (func instanceof BuiltinTernaryCallNode) { - ReadArgumentNode arg1 = ((BuiltinTernaryCallNode) func).arg1; - ReadArgumentNode arg2 = ((BuiltinTernaryCallNode) func).arg2; - // they are already adopted as children, so no harm in swapping them - ((BuiltinTernaryCallNode) func).arg1 = arg2; - ((BuiltinTernaryCallNode) func).arg2 = arg1; - } else { - throw new IllegalStateException("reverse wrappers can only apply to binary and ternary nodes"); - } - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/WrapTpNew.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/WrapTpNew.java index 828d30d799..445479956b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/WrapTpNew.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/WrapTpNew.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,50 +40,89 @@ */ package com.oracle.graal.python.nodes.function.builtins; -import org.graalvm.collections.Pair; - import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.function.PArguments; -import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; +import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode; +import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetBaseClassNode; import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsTypeNode; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot; +import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPythonSingle; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; -import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; -import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.NodeFactory; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.ExplodeLoop; -import com.oracle.truffle.api.profiles.ValueProfile; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedLoopConditionProfile; /** * Implements cpython://Objects/typeobject.c#tp_new_wrapper. */ public final class WrapTpNew extends SlotWrapper { - @Child private IsTypeNode isType; - @Child private IsSubtypeNode isSubtype; - @Child private PRaiseNode raiseNode; - @Child private LookupAttributeInMRONode lookupNewNode; - @CompilationFinal private ValueProfile builtinProfile; - @CompilationFinal private byte state = 0; private final PythonBuiltinClassType owner; - // we cache two node classes here, otherwise we use a truffle boundary lookup - @CompilationFinal(dimensions = 1) private final Pair[] cachedFactoriesNodeClasses = new Pair[2]; - - private static final byte NOT_SUBTP_STATE = 0b100; - private static final byte NOT_CLASS_STATE = 0b010; - private static final byte IS_UNSAFE_STATE = 0b001; + @Child private CheckNode checkNode; public WrapTpNew(BuiltinCallNode func, PythonBuiltinClassType owner) { super(func); this.owner = owner; } + @GenerateInline(false) + abstract static class CheckNode extends Node { + abstract void execute(PythonBuiltinClassType owner, Object cls); + + @Specialization + static void check(PythonBuiltinClassType owner, Object cls, + @Bind Node inliningTarget, + @Cached IsTypeNode isTypeNode, + @Cached IsSubtypeNode isSubtypeNode, + @Cached GetCachedTpSlotsNode getSlotsCls, + @Cached GetCachedTpSlotsNode getSlotsBase1, + @Cached GetCachedTpSlotsNode getSlotsBase2, + @Cached GetBaseClassNode getBase1, + @Cached GetBaseClassNode getBase2, + @Cached InlinedLoopConditionProfile loopProfile, + @Cached PRaiseNode raiseNotType, + @Cached PRaiseNode raiseNotSubytpe, + @Cached PRaiseNode raiseNotSafe) { + if (!isTypeNode.execute(inliningTarget, cls)) { + throw raiseNotType.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.NEW_X_ISNT_TYPE_OBJ, owner.getName(), cls); + } + if (!isSubtypeNode.execute(cls, owner)) { + throw raiseNotSubytpe.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.IS_NOT_SUBTYPE_OF, owner.getName(), cls, cls, owner.getName()); + } + /* + * CPython comment: Check that the use doesn't do something silly and unsafe like + * object.__new__(dict). To do this, we check that the most derived base that's not a + * heap type is this type. + */ + // We unroll the first iteration for better specialization + Object staticBase = cls; + TpSlot staticBaseNew = getSlotsCls.execute(inliningTarget, staticBase).tp_new(); + if (staticBaseNew instanceof TpSlotPythonSingle) { + staticBase = getBase1.execute(inliningTarget, staticBase); + staticBaseNew = getSlotsBase1.execute(inliningTarget, staticBase).tp_new(); + while (loopProfile.profile(inliningTarget, staticBaseNew instanceof TpSlotPythonSingle)) { + staticBase = getBase2.execute(inliningTarget, staticBase); + staticBaseNew = getSlotsBase2.execute(inliningTarget, staticBase).tp_new(); + } + } + if (staticBaseNew != owner.getSlots().tp_new()) { + throw raiseNotSafe.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.NEW_IS_NOT_SAFE_USE_ELSE, owner.getName(), cls, cls); + } + } + + @NeverDefault + public static CheckNode create() { + return WrapTpNewFactory.CheckNodeGen.create(); + } + } + @Override public Object execute(VirtualFrame frame) { Object cls; @@ -95,94 +134,12 @@ public Object execute(VirtualFrame frame) { throw new IllegalStateException(owner.getName() + ".__new__ called without arguments"); } if (cls != owner) { - if (isType == null) { + if (checkNode == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); - reportPolymorphicSpecialize(); - isType = insert(IsTypeNode.create()); - } - if (!isType.executeCached(cls)) { - if ((state & NOT_CLASS_STATE) == 0) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - reportPolymorphicSpecialize(); - state |= NOT_CLASS_STATE; - } - throw getRaiseNode().raise(PythonBuiltinClassType.TypeError, ErrorMessages.NEW_X_ISNT_TYPE_OBJ, owner.getName(), cls); - } - if (isSubtype == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - reportPolymorphicSpecialize(); - isSubtype = insert(IsSubtypeNode.create()); - } - if (!isSubtype.execute(cls, owner)) { - if ((state & NOT_SUBTP_STATE) == 0) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - reportPolymorphicSpecialize(); - state |= NOT_SUBTP_STATE; - } - throw getRaiseNode().raise(PythonBuiltinClassType.TypeError, - ErrorMessages.IS_NOT_SUBTYPE_OF, - owner.getName(), cls, cls, owner.getName()); - } - // CPython walks the bases and checks that the first non-heaptype base has the new that - // we're in. We have our optimizations for this lookup that the compiler can then - // (hopefully) merge with the initial lookup of the new method before entering it. - if (lookupNewNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - reportPolymorphicSpecialize(); - lookupNewNode = insert(LookupAttributeInMRONode.createForLookupOfUnmanagedClasses(SpecialMethodNames.T___NEW__)); - } - Object newMethod = lookupNewNode.execute(cls); - if (newMethod instanceof PBuiltinMethod) { - if (builtinProfile == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - builtinProfile = PythonUtils.createValueIdentityProfile(); - } - NodeFactory factory = ((PBuiltinMethod) builtinProfile.profile(newMethod)).getBuiltinFunction().getBuiltinNodeFactory(); - if (factory != null) { - if (!getFactoryNodeClass(factory).isInstance(getNode())) { - if ((state & IS_UNSAFE_STATE) == 0) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - reportPolymorphicSpecialize(); - state |= IS_UNSAFE_STATE; - } - throw getRaiseNode().raise(PythonBuiltinClassType.TypeError, ErrorMessages.NEW_IS_NOT_SAFE_USE_ELSE, owner.getName(), cls, cls); - } - } - // we explicitly allow non-Java functions to pass here, since a PythonBuiltinClass - // with a non-java function is explicitly written in the core to allow this + checkNode = insert(CheckNode.create()); } + checkNode.execute(owner, cls); } return super.execute(frame); } - - @ExplodeLoop - @SuppressWarnings("unchecked") - private final Class getFactoryNodeClass(NodeFactory factory) { - for (int i = 0; i < cachedFactoriesNodeClasses.length; i++) { - Pair, Class> pair = (Pair, Class>) cachedFactoriesNodeClasses[i]; - if (pair == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - reportPolymorphicSpecialize(); - Class nodeclass = factory.getNodeClass(); - cachedFactoriesNodeClasses[i] = Pair.create(factory, nodeclass); - return nodeclass; - } else if (pair.getLeft() == factory) { - return pair.getRight(); - } - } - return getFactoryNodeClassUncached(factory); - } - - @TruffleBoundary - private static final Class getFactoryNodeClassUncached(NodeFactory factory) { - return factory.getNodeClass(); - } - - private PRaiseNode getRaiseNode() { - if (raiseNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - raiseNode = insert(PRaiseNode.create()); - } - return raiseNode; - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/WrapperDescrCall.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/WrapperDescrCall.java new file mode 100644 index 0000000000..7a985b8de7 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/WrapperDescrCall.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.function.builtins; + +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.function.PArguments; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.classes.IsSubtypeNode; +import com.oracle.graal.python.nodes.object.GetClassNode; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.frame.VirtualFrame; + +/** + * Equivalent of {@code wrapperdescr_call} in CPython. We use this wrapper only for type slots. The + * assumption is that type slots are usually not called explicitly through the magic methods, so we + * can afford the extra checks for slot wrappers. + *

        + * TODO: handle this validation efficiently for wrappers of other builtin methods, where the + * performance is more important. + */ +public final class WrapperDescrCall extends SlotWrapper { + private final String name; + private final PythonBuiltinClassType type; + @Child IsSubtypeNode isSubtypeNode = IsSubtypeNode.create(); + @Child GetClassNode getClassNode = GetClassNode.create(); + + public WrapperDescrCall(BuiltinCallNode func, String name, PythonBuiltinClassType type) { + super(func); + this.name = name; + this.type = type; + } + + @Override + public Object execute(VirtualFrame frame) { + Object[] args = frame.getArguments(); + if (PArguments.getUserArgumentLength(args) <= 0) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.TypeError, ErrorMessages.DESCRIPTOR_NEED_OBJ, name, "_"); + } + Object self = PArguments.getArgument(args, 0); + Object selfClass = getClassNode.executeCached(self); + if (selfClass != type && !isSubtypeNode.execute(selfClass, type)) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.TypeError, ErrorMessages.DESCRIPTOR_S_REQUIRES_S_OBJ_RECEIVED_P, name, type, self); + } + return super.execute(frame); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/ArgumentCastNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/ArgumentCastNode.java index 2251038928..c2fc66a63b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/ArgumentCastNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/ArgumentCastNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,12 +40,10 @@ */ package com.oracle.graal.python.nodes.function.builtins.clinic; -import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.nodes.BuiltinNames; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.SpecialAttributeNames; import com.oracle.graal.python.nodes.SpecialMethodNames; -import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.ImportStatic; @@ -67,13 +65,4 @@ protected static boolean isHandledPNone(boolean useDefaultForNone, Object value) return PGuards.isNoValue(value); } } - - public final PythonLanguage getLanguage() { - return PythonLanguage.get(this); - } - - public final PythonContext getContext() { - return PythonContext.get(this); - } - } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/CodePointConversionNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/CodePointConversionNode.java index 51625b80c1..0d85c0e369 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/CodePointConversionNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/CodePointConversionNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -87,7 +87,7 @@ int doOthers(Object value, @Cached CastToTruffleStringNode castToStringNode, @Cached TruffleString.CodePointLengthNode codePointLengthNode, @Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { TruffleString str = castToStringNode.execute(inliningTarget, value); if (codePointLengthNode.execute(str, TS_ENCODING) == 1) { @@ -96,7 +96,7 @@ int doOthers(Object value, } catch (CannotCastException ex) { // handled below } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_BRACKETS_ARG_MUST_BE_S_NOT_P, builtinName, "unicode character", value); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_BRACKETS_ARG_MUST_BE_S_NOT_P, builtinName, "unicode character", value); } @ClinicConverterFactory diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/JavaBooleanConverterNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/JavaBooleanConverterNode.java index 2acce612b9..5050c41003 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/JavaBooleanConverterNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/JavaBooleanConverterNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,12 +46,10 @@ import com.oracle.graal.python.annotations.ClinicConverterFactory.UseDefaultForNone; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.lib.PyObjectIsTrueNode; -import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.nodes.Node; /** * Implements the {@code bool} argument clinic conversion, which in CPython calls to @@ -93,9 +91,8 @@ static boolean doInt(int i) { @Specialization(guards = "!isPNone(value)") static Object doOthers(VirtualFrame frame, Object value, - @Bind("this") Node inliningTarget, @Cached PyObjectIsTrueNode isTrueNode) { - return isTrueNode.execute(frame, inliningTarget, value); + return isTrueNode.execute(frame, value); } @ClinicConverterFactory(shortCircuitPrimitive = PrimitiveType.Boolean) diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/ReadableBufferConversionNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/ReadableBufferConversionNode.java index bbf6fca0d4..74d4afb260 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/ReadableBufferConversionNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/ReadableBufferConversionNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,11 +44,14 @@ import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary; import com.oracle.graal.python.runtime.IndirectCallData; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.library.CachedLibrary; +import com.oracle.truffle.api.nodes.Node; public abstract class ReadableBufferConversionNode extends ObjectConversionBaseNode { protected ReadableBufferConversionNode(Object defaultValue, boolean useDefaultForNone) { @@ -57,9 +60,11 @@ protected ReadableBufferConversionNode(Object defaultValue, boolean useDefaultFo @Specialization(guards = "!isHandledPNone(value)", limit = "getCallSiteInlineCacheMaxDepth()") Object doObject(VirtualFrame frame, Object value, + @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("value") PythonBufferAcquireLibrary acquireLib) { - return acquireLib.acquireReadonly(value, frame, getContext(), getLanguage(), indirectCallData); + return acquireLib.acquireReadonly(value, frame, context, context.getLanguage(inliningTarget), indirectCallData); } @ClinicConverterFactory diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/SliceIndexConversionNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/SliceIndexConversionNode.java index cc1758b9b4..71c314477b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/SliceIndexConversionNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/SliceIndexConversionNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -68,11 +68,11 @@ static int doOthers(VirtualFrame frame, Object value, @Bind("this") Node inliningTarget, @Cached PyIndexCheckNode indexCheckNode, @Cached PyNumberAsSizeNode asSizeNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { if (indexCheckNode.execute(inliningTarget, value)) { return asSizeNode.executeLossy(frame, inliningTarget, value); } - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.SLICE_INDICES_TYPE_ERROR); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.SLICE_INDICES_TYPE_ERROR); } @ClinicConverterFactory(shortCircuitPrimitive = PrimitiveType.Int) diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/TruffleStringConverterNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/TruffleStringConverterNode.java index 23b5470c1e..5a54fe5b76 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/TruffleStringConverterNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/TruffleStringConverterNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -71,11 +71,11 @@ static Object doString(TruffleString value) { Object doOthers(Object value, @Bind("this") Node inliningTarget, @Cached CastToTruffleStringNode castToStringNode, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { return castToStringNode.execute(inliningTarget, value); } catch (CannotCastException ex) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, ErrorMessages.S_BRACKETS_ARG_MUST_BE_S_NOT_P, builtinName, "str", value); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.S_BRACKETS_ARG_MUST_BE_S_NOT_P, builtinName, "str", value); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/TupleConversionNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/TupleConversionNode.java index e1f61306a5..173b0e94de 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/TupleConversionNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/TupleConversionNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -71,8 +71,8 @@ static Object[] doTuple(PTuple t, @Fallback static Object doOthers(Object value, - @Cached PRaiseNode raiseNode) { - throw raiseNode.raise(PythonBuiltinClassType.TypeError, S_MUST_BE_S_NOT_P, value, "a tuple", value); + @Bind("this") Node inliningTarget) { + throw PRaiseNode.raiseStatic(inliningTarget, PythonBuiltinClassType.TypeError, S_MUST_BE_S_NOT_P, value, "a tuple", value); } @ClinicConverterFactory diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/WritableBufferConversionNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/WritableBufferConversionNode.java index d4112b1660..1462c5e602 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/WritableBufferConversionNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/builtins/clinic/WritableBufferConversionNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -48,6 +48,7 @@ import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.runtime.IndirectCallData; +import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -68,13 +69,14 @@ public WritableBufferConversionNode(String builtinName) { @SuppressWarnings("truffle-static-method") Object doObject(VirtualFrame frame, Object value, @Bind("this") Node inliningTarget, + @Bind PythonContext context, @Cached("createFor(this)") IndirectCallData indirectCallData, @CachedLibrary("value") PythonBufferAcquireLibrary acquireLib, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { - return acquireLib.acquireWritable(value, frame, getContext(), getLanguage(), indirectCallData); + return acquireLib.acquireWritable(value, frame, context, context.getLanguage(inliningTarget), indirectCallData); } catch (PException e) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.S_BRACKETS_ARG_MUST_BE_READ_WRITE_BYTES_LIKE_NOT_P, builtinName, value); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.S_BRACKETS_ARG_MUST_BE_READ_WRITE_BYTES_LIKE_NOT_P, builtinName, value); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/interop/GetInteropBehaviorValueNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/interop/GetInteropBehaviorValueNode.java index 4b7ec502c3..efa8715cf0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/interop/GetInteropBehaviorValueNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/interop/GetInteropBehaviorValueNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -77,7 +77,7 @@ @SuppressWarnings("truffle-inlining") // some of the cached nodes in the specialization are not // inlineable public abstract class GetInteropBehaviorValueNode extends PNodeWithContext { - public final boolean executeBoolean(Node inliningTarget, InteropBehavior behavior, InteropBehaviorMethod method, CastToJavaBooleanNode toBooleanNode, PRaiseNode.Lazy raiseNode, + public final boolean executeBoolean(Node inliningTarget, InteropBehavior behavior, InteropBehaviorMethod method, CastToJavaBooleanNode toBooleanNode, PRaiseNode raiseNode, PythonAbstractObject receiver, Object... extraArguments) { assert extraArguments.length == method.extraArguments : "number of passed arguments to GetInteropBehaviorValueNode does not match expected number of arguments for method"; try { @@ -85,76 +85,76 @@ public final boolean executeBoolean(Node inliningTarget, InteropBehavior behavio try { return toBooleanNode.execute(inliningTarget, value); } catch (CannotCastException cce) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, S_MUST_BE_S_NOT_P, "return value", "a boolean", value); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, S_MUST_BE_S_NOT_P, "return value", "a boolean", value); } } catch (UnsupportedMessageException usm) { return false; } } - public final byte executeByte(Node inliningTarget, InteropBehavior behavior, InteropBehaviorMethod method, CastToJavaByteNode toByteNode, PRaiseNode.Lazy raiseNode, PythonAbstractObject receiver, + public final byte executeByte(Node inliningTarget, InteropBehavior behavior, InteropBehaviorMethod method, CastToJavaByteNode toByteNode, PRaiseNode raiseNode, PythonAbstractObject receiver, Object... extraArguments) throws UnsupportedMessageException { assert extraArguments.length == method.extraArguments : "number of passed arguments to GetInteropBehaviorValueNode does not match expected number of arguments for method"; Object value = execute(inliningTarget, behavior, method, receiver, extraArguments); try { return toByteNode.execute(inliningTarget, value); } catch (CannotCastException cce) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, S_MUST_BE_S_NOT_P, "return value", "a byte", value); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, S_MUST_BE_S_NOT_P, "return value", "a byte", value); } } - public final short executeShort(Node inliningTarget, InteropBehavior behavior, InteropBehaviorMethod method, CastToJavaShortNode toShortNode, PRaiseNode.Lazy raiseNode, + public final short executeShort(Node inliningTarget, InteropBehavior behavior, InteropBehaviorMethod method, CastToJavaShortNode toShortNode, PRaiseNode raiseNode, PythonAbstractObject receiver, Object... extraArguments) throws UnsupportedMessageException { assert extraArguments.length == method.extraArguments : "number of passed arguments to GetInteropBehaviorValueNode does not match expected number of arguments for method"; Object value = execute(inliningTarget, behavior, method, receiver, extraArguments); try { return toShortNode.execute(inliningTarget, value); } catch (CannotCastException cce) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, S_MUST_BE_S_NOT_P, "return value", "a short", value); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, S_MUST_BE_S_NOT_P, "return value", "a short", value); } } - public final int executeInt(Node inliningTarget, InteropBehavior behavior, InteropBehaviorMethod method, CastToJavaIntExactNode toIntNode, PRaiseNode.Lazy raiseNode, PythonAbstractObject receiver, + public final int executeInt(Node inliningTarget, InteropBehavior behavior, InteropBehaviorMethod method, CastToJavaIntExactNode toIntNode, PRaiseNode raiseNode, PythonAbstractObject receiver, Object... extraArguments) throws UnsupportedMessageException { assert extraArguments.length == method.extraArguments : "number of passed arguments to GetInteropBehaviorValueNode does not match expected number of arguments for method"; Object value = execute(inliningTarget, behavior, method, receiver, extraArguments); try { return toIntNode.execute(inliningTarget, value); } catch (CannotCastException cce) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, S_MUST_BE_S_NOT_P, "return value", "an int", value); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, S_MUST_BE_S_NOT_P, "return value", "an int", value); } } - public final long executeLong(Node inliningTarget, InteropBehavior behavior, InteropBehaviorMethod method, CastToJavaLongExactNode toLongNode, PRaiseNode.Lazy raiseNode, + public final long executeLong(Node inliningTarget, InteropBehavior behavior, InteropBehaviorMethod method, CastToJavaLongExactNode toLongNode, PRaiseNode raiseNode, PythonAbstractObject receiver, Object... extraArguments) throws UnsupportedMessageException { assert extraArguments.length == method.extraArguments : "number of passed arguments to GetInteropBehaviorValueNode does not match expected number of arguments for method"; Object value = execute(inliningTarget, behavior, method, receiver, extraArguments); try { return toLongNode.execute(inliningTarget, value); } catch (CannotCastException cce) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, S_MUST_BE_S_NOT_P, "return value", "a long", value); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, S_MUST_BE_S_NOT_P, "return value", "a long", value); } } - public final double executeDouble(Node inliningTarget, InteropBehavior behavior, InteropBehaviorMethod method, CastToJavaDoubleNode toDoubleNode, PRaiseNode.Lazy raiseNode, + public final double executeDouble(Node inliningTarget, InteropBehavior behavior, InteropBehaviorMethod method, CastToJavaDoubleNode toDoubleNode, PRaiseNode raiseNode, PythonAbstractObject receiver, Object... extraArguments) throws UnsupportedMessageException { assert extraArguments.length == method.extraArguments : "number of passed arguments to GetInteropBehaviorValueNode does not match expected number of arguments for method"; Object value = execute(inliningTarget, behavior, method, receiver, extraArguments); try { return toDoubleNode.execute(inliningTarget, value); } catch (CannotCastException cce) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, S_MUST_BE_S_NOT_P, "return value", "a double", value); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, S_MUST_BE_S_NOT_P, "return value", "a double", value); } } - public final String executeString(Node inliningTarget, InteropBehavior behavior, InteropBehaviorMethod method, CastToJavaStringNode toStringNode, PRaiseNode.Lazy raiseNode, + public final String executeString(Node inliningTarget, InteropBehavior behavior, InteropBehaviorMethod method, CastToJavaStringNode toStringNode, PRaiseNode raiseNode, PythonAbstractObject receiver, Object... extraArguments) throws UnsupportedMessageException { assert extraArguments.length == method.extraArguments : "number of passed arguments to GetInteropBehaviorValueNode does not match expected number of arguments for method"; Object value = execute(inliningTarget, behavior, method, receiver, extraArguments); try { return toStringNode.execute(value); } catch (CannotCastException cce) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.TypeError, S_MUST_BE_S_NOT_P, "return value", "a string", value); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, S_MUST_BE_S_NOT_P, "return value", "a string", value); } } @@ -209,7 +209,7 @@ static Object getValue(Node inliningTarget, InteropBehavior behavior, InteropBeh static Object getValueComputedWrongArity(Node inliningTarget, InteropBehavior behavior, InteropBehaviorMethod method, PythonAbstractObject receiver, Object[] extraArguments, @Cached PRaiseNode raiseNode) throws UnsupportedMessageException { assert behavior.isDefined(method) : "interop behavior method is not defined!"; - throw raiseNode.raise(PythonBuiltinClassType.TypeError, FUNC_TAKES_EXACTLY_D_ARGS, method.extraArguments, extraArguments.length); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, FUNC_TAKES_EXACTLY_D_ARGS, method.extraArguments, extraArguments.length); } @NeverDefault @@ -227,14 +227,14 @@ abstract static class SimpleInvokeNodeDispatch extends Node { public abstract Object execute(Node inliningTarget, CallTarget callTarget, Object[] arguments); @Specialization(guards = {"cachedCallTarget == callTarget"}, limit = "3") - static Object doDirectCall(Node inliningTarget, CallTarget callTarget, Object[] arguments, + static Object doDirectCall(CallTarget callTarget, Object[] arguments, @Cached("callTarget") CallTarget cachedCallTarget, @Cached("create(callTarget)") DirectCallNode directCallNode) { return directCallNode.call(arguments); } @Specialization(replaces = "doDirectCall") - static Object doIndirectCall(Node inliningTarget, CallTarget callTarget, Object[] arguments, + static Object doIndirectCall(CallTarget callTarget, Object[] arguments, @Cached IndirectCallNode indirectCallNode) { return indirectCallNode.call(callTarget, arguments); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/interop/PForeignToPTypeNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/interop/PForeignToPTypeNode.java index 942f3a8bc3..25613b9f1e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/interop/PForeignToPTypeNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/interop/PForeignToPTypeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -64,8 +64,7 @@ public abstract class PForeignToPTypeNode extends Node { protected static boolean isOtherClass(Class clazz) { // ATTENTION: this is basically a fallback guard, review it when adding a new specialization return !(clazz == Byte.class || clazz == Short.class || clazz == Float.class || - clazz == Character.class || clazz == PException.class || - clazz == String.class || clazz == TruffleString.class); + clazz == String.class || clazz == TruffleString.class || clazz == PException.class); } @Specialization(guards = {"isOtherClass(cachedClass)", "value.getClass() == cachedClass"}, limit = "1") @@ -94,18 +93,14 @@ protected static double fromFloat(float value) { return value; } - @Specialization - protected static TruffleString fromChar(char value, - @Cached TruffleString.FromCodePointNode fromCodePointNode) { - return fromCodePointNode.execute(value, TS_ENCODING, true); - } - + // Needed for TruffleStringMigrationHelpers.isJavaString to hold @Specialization protected static TruffleString fromString(String value, @Cached TruffleString.FromJavaStringNode fromJavaStringNode) { return fromJavaStringNode.execute(value, TS_ENCODING); } + // Needed to only have TruffleStrings with TS_ENCODING within GraalPy @Specialization protected static TruffleString fromTruffleString(TruffleString value, @Cached TruffleString.SwitchEncodingNode switchEncodingNode) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/BuiltinClassProfiles.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/BuiltinClassProfiles.java index f04b19ba6f..1593a01c9c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/BuiltinClassProfiles.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/BuiltinClassProfiles.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -102,18 +102,18 @@ public final boolean profileIsOtherBuiltinClass(Node inliningTarget, Object claz abstract boolean execute(Node inliningTarget, Object clazz, PythonBuiltinClassType forbiddenType); @Specialization - static boolean doType(Node inliningTarget, PythonBuiltinClassType clazz, PythonBuiltinClassType forbiddenType) { + static boolean doType(PythonBuiltinClassType clazz, PythonBuiltinClassType forbiddenType) { return clazz != forbiddenType; } @Specialization - static boolean doClass(Node inliningTarget, PythonBuiltinClass clazz, PythonBuiltinClassType forbiddenType) { + static boolean doClass(PythonBuiltinClass clazz, PythonBuiltinClassType forbiddenType) { return clazz.getType() != forbiddenType; } @Fallback @SuppressWarnings("unused") - static boolean doOthers(Node inliningTarget, Object clazz, PythonBuiltinClassType forbiddenType) { + static boolean doOthers(Object clazz, PythonBuiltinClassType forbiddenType) { return false; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/DeleteDictNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/DeleteDictNode.java index 13f5adfde0..3c41dce9fb 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/DeleteDictNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/DeleteDictNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,6 +40,7 @@ */ package com.oracle.graal.python.nodes.object; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.common.DynamicObjectStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageCopy; @@ -48,7 +49,7 @@ import com.oracle.graal.python.nodes.HiddenAttr; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateUncached; @@ -66,8 +67,7 @@ static void doPythonObject(PythonObject object, @Bind("this") Node inliningTarget, @Cached HiddenAttr.ReadNode readHiddenAttrNode, @Cached HiddenAttr.WriteNode writeHiddenAttrNode, - @Cached HashingStorageCopy copyNode, - @Cached PythonObjectFactory factory) { + @Cached HashingStorageCopy copyNode) { /* There is no special handling for class MROs because type.__dict__ cannot be deleted. */ assert !PGuards.isPythonClass(object); PDict oldDict = (PDict) readHiddenAttrNode.execute(inliningTarget, object, HiddenAttr.DICT, null); @@ -86,7 +86,7 @@ static void doPythonObject(PythonObject object, * empty dict dissociated from this object seems like the cleanest option. The disadvantage * is that the current values won't get garbage collected. */ - PDict newDict = factory.createDict(); + PDict newDict = PFactory.createDict(PythonLanguage.get(inliningTarget)); object.setDict(inliningTarget, writeHiddenAttrNode, newDict); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetClassNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetClassNode.java index 44e02f9fe0..92939aaae0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetClassNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetClassNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -54,10 +54,7 @@ import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; import com.oracle.graal.python.nodes.HiddenAttr; -import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.truffle.PythonTypes; -import com.oracle.graal.python.runtime.exception.PException; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -65,17 +62,12 @@ import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.Idempotent; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; -import com.oracle.truffle.api.exception.AbstractTruffleException; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.object.Shape; import com.oracle.truffle.api.strings.TruffleString; -@TypeSystemReference(PythonTypes.class) -@ImportStatic({PGuards.class}) @GenerateUncached @GenerateInline(inlineByDefault = true) public abstract class GetClassNode extends PNodeWithContext { @@ -223,8 +215,8 @@ protected static boolean hasInitialClass(Shape shape) { } @Specialization - static Object getPBCT(@SuppressWarnings("unused") PythonBuiltinClassType object) { - return PythonBuiltinClassType.PythonClass; + static Object getPBCT(PythonBuiltinClassType object) { + return object.getType(); } @Specialization @@ -247,19 +239,10 @@ static Object getNativeVoidPtr(@SuppressWarnings("unused") PythonNativeVoidPtr o return PythonBuiltinClassType.PInt; } - @Specialization - static Object getTruffleException(@SuppressWarnings("unused") AbstractTruffleException object) { - /* - * Special case: if Python code asks for the class of a foreign exception, we return a - * Python type that inherits from BaseException. We do this because Python users usually - * expect that every exception inherits from BaseException. - */ - assert !(object instanceof PException); - return PythonBuiltinClassType.PForeignException; - } - + @InliningCutoff @Fallback - static Object getForeign(@SuppressWarnings("unused") Object object) { - return PythonBuiltinClassType.ForeignObject; + static Object getForeign(Object object, + @Cached(inline = false) GetRegisteredClassNode getRegisteredClassNode) { + return getRegisteredClassNode.execute(object); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetDictIfExistsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetDictIfExistsNode.java index f1f11eb81d..701091e9b3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetDictIfExistsNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetDictIfExistsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,6 +43,7 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError; import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_OBJECT_GET_DICT_PTR; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes; @@ -56,7 +57,7 @@ import com.oracle.graal.python.nodes.HiddenAttr; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Bind; @@ -69,6 +70,7 @@ import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.object.Shape; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; @GenerateUncached @SuppressWarnings("truffle-inlining") // footprint reduction 36 -> 17 @@ -121,11 +123,12 @@ static PDict doPythonObject(PythonObject object, @Specialization @InliningCutoff PDict doNativeObject(PythonAbstractNativeObject object, + @Bind("this") Node inliningTarget, @CachedLibrary(limit = "1") InteropLibrary lib, @Cached PythonToNativeNode toNative, @Cached CStructAccess.ReadObjectNode readObjectNode, @Cached CStructAccess.WriteObjectNewRefNode writeObjectNode, - @Cached PythonObjectFactory factory, + @Cached InlinedBranchProfile createDict, @Cached CExtNodes.PCallCapiFunction callGetDictPtr) { Object dictPtr = callGetDictPtr.call(FUN_PY_OBJECT_GET_DICT_PTR, toNative.execute(object)); if (lib.isNull(dictPtr)) { @@ -133,14 +136,15 @@ PDict doNativeObject(PythonAbstractNativeObject object, } else { Object dictObject = readObjectNode.readGeneric(dictPtr, 0); if (dictObject == PNone.NO_VALUE) { - PDict dict = factory.createDict(); + createDict.enter(inliningTarget); + PDict dict = PFactory.createDict(PythonLanguage.get(inliningTarget)); writeObjectNode.write(dictPtr, dict); return dict; } else if (dictObject instanceof PDict dict) { return dict; } else { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(this, SystemError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, dictObject); + throw PRaiseNode.raiseStatic(this, SystemError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, dictObject); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetForeignObjectClassNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetForeignObjectClassNode.java new file mode 100644 index 0000000000..cd317456af --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetForeignObjectClassNode.java @@ -0,0 +1,277 @@ +/* + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.object; + +import static com.oracle.graal.python.nodes.BuiltinNames.T_POLYGLOT; +import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___MODULE__; + +import java.util.ArrayList; + +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.PNone; +import com.oracle.graal.python.builtins.objects.module.PythonModule; +import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; +import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; +import com.oracle.graal.python.builtins.objects.type.PythonClass; +import com.oracle.graal.python.builtins.objects.type.PythonManagedClass; +import com.oracle.graal.python.builtins.objects.type.TpSlots; +import com.oracle.graal.python.builtins.objects.type.TypeFlags; +import com.oracle.graal.python.builtins.objects.type.TypeNodes; +import com.oracle.graal.python.nodes.PNodeWithContext; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.graal.python.util.PythonUtils; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.library.CachedLibrary; +import com.oracle.truffle.api.strings.TruffleString; + +// there is no value to (DSL & host)-inline this node, it can only make the caller node bigger +@GenerateCached +@GenerateUncached +@GenerateInline(false) +public abstract class GetForeignObjectClassNode extends PNodeWithContext { + + public static GetForeignObjectClassNode getUncached() { + return GetForeignObjectClassNodeGen.getUncached(); + } + + /** Based on the types and traits of {@link InteropLibrary} */ + public enum Trait { + /* + * We need more specific traits before container traits, so that for example in R::c(1) + + * R::c(2), the + operator with two foreign list+number uses ForeignNumber.__add__ + and not + * list.__add__. + */ + + // The type field is only set for cases which are already implemented. + + // First in MRO + // Interop types first as they are the most concrete/specific types + NULL("None", PythonBuiltinClassType.PNone), + BOOLEAN("Boolean", PythonBuiltinClassType.ForeignBoolean), + NUMBER("Number", PythonBuiltinClassType.ForeignNumber), // int, float, complex + STRING("String", PythonBuiltinClassType.PString), + EXCEPTION("Exception", PythonBuiltinClassType.PBaseException), + META_OBJECT("AbstractClass", PythonBuiltinClassType.ForeignAbstractClass), + + // Interop traits + EXECUTABLE("Executable", PythonBuiltinClassType.ForeignExecutable), + INSTANTIABLE("Instantiable", PythonBuiltinClassType.ForeignInstantiable), + + // Container traits/types must be last, see comment above + // Hash before Array so that foreign dict+list prefers dict.[] + HASH("Dict", PythonBuiltinClassType.PDict), + // Array before Iterable so that foreign list+iterable prefers list.__iter__ + ARRAY("List", PythonBuiltinClassType.PList), + // Iterator before Iterable so that foreign iterator+iterable prefers iterator.__iter__ + ITERATOR("Iterator", PythonBuiltinClassType.PIterator), + ITERABLE("Iterable", PythonBuiltinClassType.ForeignIterable); + // Last in MRO + + public static final Trait[] VALUES = Trait.values(); + public static final int COMBINATIONS = 1 << VALUES.length; + + final String name; + final int bit; + final PythonBuiltinClassType type; + + Trait(String name, PythonBuiltinClassType type) { + this.name = name; + this.bit = 1 << ordinal(); + this.type = type; + } + + boolean isSet(int traits) { + return (traits & bit) != 0; + } + } + + public abstract PythonManagedClass execute(Object object); + + // isSingleContext() because making cachedTraits PE constant has no value in multi-context + @Specialization(guards = {"isSingleContext()", "traits == cachedTraits"}, limit = "getCallSiteInlineCacheMaxDepth()") + PythonManagedClass cached(Object object, + @CachedLibrary("object") InteropLibrary interop, + @Bind("getTraits(object, interop)") int traits, + @Bind PythonContext context, + @Cached("traits") int cachedTraits) { + assert IsForeignObjectNode.executeUncached(object); + return classForTraits(context, cachedTraits); + } + + @Specialization(replaces = "cached", limit = "getCallSiteInlineCacheMaxDepth()") + PythonManagedClass uncached(Object object, + @Bind PythonContext context, + @CachedLibrary("object") InteropLibrary interop) { + assert IsForeignObjectNode.executeUncached(object); + return classForTraits(context, getTraits(object, interop)); + } + + protected static int getTraits(Object object, InteropLibrary interop) { + // Alphabetic order here as it does not matter + return (interop.hasArrayElements(object) ? Trait.ARRAY.bit : 0) + + (interop.isBoolean(object) ? Trait.BOOLEAN.bit : 0) + + (interop.isException(object) ? Trait.EXCEPTION.bit : 0) + + (interop.isExecutable(object) ? Trait.EXECUTABLE.bit : 0) + + (interop.hasHashEntries(object) ? Trait.HASH.bit : 0) + + (interop.isInstantiable(object) ? Trait.INSTANTIABLE.bit : 0) + + (interop.hasIterator(object) ? Trait.ITERABLE.bit : 0) + + (interop.isIterator(object) ? Trait.ITERATOR.bit : 0) + + (interop.isMetaObject(object) ? Trait.META_OBJECT.bit : 0) + + (interop.isNull(object) ? Trait.NULL.bit : 0) + + (interop.isNumber(object) ? Trait.NUMBER.bit : 0) + + (interop.isString(object) ? Trait.STRING.bit : 0); + } + + private PythonManagedClass classForTraits(PythonContext context, int traits) { + PythonManagedClass pythonClass = context.polyglotForeignClasses[traits]; + if (pythonClass == null) { + if (isSingleContext(this)) { + CompilerDirectives.transferToInterpreterAndInvalidate(); + } + pythonClass = resolvePolyglotForeignClassAndSetInCache(context, traits); + } + return pythonClass; + } + + @TruffleBoundary + private PythonManagedClass resolvePolyglotForeignClassAndSetInCache(PythonContext context, int traits) { + PythonManagedClass pythonClass = resolvePolyglotForeignClass(context, traits); + context.polyglotForeignClasses[traits] = pythonClass; + return pythonClass; + } + + // Special naming rules: + // Foreign...Instantiable...AbstractClass -> Foreign......Class + // Foreign...List...Iterable -> Foreign...List... (since all Python lists are iterable) + // Foreign...Dict...Iterable -> Foreign...Dict... (since all Python dicts are iterable) + @TruffleBoundary + private PythonManagedClass resolvePolyglotForeignClass(PythonContext context, int traits) { + PythonBuiltinClass base = context.lookupType(PythonBuiltinClassType.ForeignObject); + if (traits == 0) { + return base; + } + + /* + * For foreign array/hash+iterable, ignore the iterable trait completely, foreign + * arrays/hashes inherit from the Python list/dict class and all lists/dicts are iterables + * (they have __iter__) + */ + if ((Trait.ARRAY.isSet(traits) || Trait.HASH.isSet(traits)) && Trait.ITERABLE.isSet(traits)) { + return classForTraits(context, traits - Trait.ITERABLE.bit); + } + + // If there is a single trait we build a new class using the trait.type + boolean singleTrait = Integer.bitCount(traits) == 1; + + var traitsList = new ArrayList(); + + var nameBuilder = new StringBuilder("Foreign"); + for (Trait trait : Trait.VALUES) { + if (trait.isSet(traits)) { + assert !(trait == Trait.ITERABLE && Trait.ARRAY.isSet(traits)); + + if (singleTrait) { + if (trait.type != null) { + traitsList.add(context.lookupType(trait.type)); + } + } else { + traitsList.add(classForTraits(context, trait.bit)); + } + + if (trait == Trait.META_OBJECT) { + if (Trait.INSTANTIABLE.isSet(traits)) { + nameBuilder.append("Class"); + } else { + nameBuilder.append("AbstractClass"); + } + } else if (trait == Trait.INSTANTIABLE && Trait.META_OBJECT.isSet(traits)) { + // Dealt with above + } else { + nameBuilder.append(trait.name); + } + } + } + + TruffleString name = PythonUtils.toTruffleStringUncached(nameBuilder.toString()); + + // If the single-trait class already inherits from ForeignObject, return it as-is, the name + // would clash and no need to create a composed class + if (singleTrait && traitsList.size() == 1 && traitsList.get(0) instanceof PythonBuiltinClass pbc && pbc.getType().getName().equals(name)) { + return pbc; + } + + traitsList.add(base); + + PythonAbstractClass[] bases = traitsList.toArray(PythonAbstractClass.EMPTY_ARRAY); + + PythonModule polyglotModule = context.lookupBuiltinModule(T_POLYGLOT); + + PythonClass pythonClass = PFactory.createPythonClassAndFixupSlots(context.getLanguage(), name, base, bases); + pythonClass.setAttribute(T___MODULE__, T_POLYGLOT); + if (!Trait.INSTANTIABLE.isSet(traits)) { + pythonClass.setTpSlots(pythonClass.getTpSlots().copy().set(TpSlots.TpSlotMeta.TP_NEW, null).build()); + TypeNodes.SetTypeFlagsNode.executeUncached(pythonClass, TypeNodes.GetTypeFlagsNode.executeUncached(pythonClass) | TypeFlags.DISALLOW_INSTANTIATION); + } + + assert polyglotModule.getAttribute(name) == PNone.NO_VALUE : name; + polyglotModule.setAttribute(name, pythonClass); + + return pythonClass; + } + + public void defineSingleTraitClasses(PythonContext context) { + PythonModule polyglotModule = context.lookupBuiltinModule(T_POLYGLOT); + for (Trait trait : Trait.VALUES) { + PythonManagedClass traitClass = classForTraits(context, trait.bit); + assert polyglotModule.getAttribute(traitClass.getName()) == traitClass : traitClass.getName(); + } + } + +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetOrCreateDictNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetOrCreateDictNode.java index 9290b4d348..cdf3323ca0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetOrCreateDictNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetOrCreateDictNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,14 +42,16 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.dict.PDict; import com.oracle.graal.python.builtins.objects.object.PythonObject; import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateCached; @@ -81,11 +83,11 @@ static PDict doPythonObject(Node inliningTarget, PythonObject object, @Shared("getDict") @Cached(inline = false) GetDictIfExistsNode getDictIfExistsNode, @Cached SetDictNode setDictNode, @Cached InlinedBranchProfile createDict, - @Cached(inline = false) PythonObjectFactory factory) { + @Bind PythonLanguage language) { PDict dict = getDictIfExistsNode.execute(object); if (dict == null) { createDict.enter(inliningTarget); - dict = factory.createDictFixedStorage(object); + dict = PFactory.createDictFixedStorage(language, object); setDictNode.execute(inliningTarget, object, dict); } return dict; @@ -97,7 +99,7 @@ static PDict doOther(Node inliningTarget, Object object, PDict dict = getDict.execute(object); if (dict == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, SystemError, ErrorMessages.UNABLE_SET_DICT_OF_OBJ, object); + throw PRaiseNode.raiseStatic(inliningTarget, SystemError, ErrorMessages.UNABLE_SET_DICT_OF_OBJ, object); } return dict; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetRegisteredClassNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetRegisteredClassNode.java new file mode 100644 index 0000000000..cdb38b382a --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetRegisteredClassNode.java @@ -0,0 +1,288 @@ +/* + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.object; + +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashSet; + +import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.objects.common.ObjectHashMap; +import com.oracle.graal.python.builtins.objects.common.ObjectHashMap.GetNode; +import com.oracle.graal.python.builtins.objects.common.ObjectHashMap.PutNode; +import com.oracle.graal.python.builtins.objects.common.ObjectHashMapFactory; +import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; +import com.oracle.graal.python.builtins.objects.type.PythonClass; +import com.oracle.graal.python.nodes.BuiltinNames; +import com.oracle.graal.python.nodes.ErrorMessages; +import com.oracle.graal.python.nodes.PNodeWithContext; +import com.oracle.graal.python.nodes.PRaiseNode; +import com.oracle.graal.python.nodes.SpecialAttributeNames; +import com.oracle.graal.python.runtime.PythonContext; +import com.oracle.graal.python.runtime.exception.PException; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.graal.python.util.ArrayBuilder; +import com.oracle.graal.python.util.PythonUtils; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Exclusive; +import com.oracle.truffle.api.dsl.Cached.Shared; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.InvalidArrayIndexException; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.library.CachedLibrary; +import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; + +// there is no value to (DSL & host)-inline this node, it can only make the caller node bigger +@GenerateCached +@GenerateUncached +@GenerateInline(false) +public abstract class GetRegisteredClassNode extends PNodeWithContext { + + public abstract Object execute(Object foreignObject); + + @Specialization(assumptions = "getLanguage().noInteropTypeRegisteredAssumption") + static Object noRegisteredClass(Object foreignObject, + @Shared @Cached GetForeignObjectClassNode getForeignObjectClassNode) { + return getForeignObjectClassNode.execute(foreignObject); + } + + // Always delegate to GetForeignObjectClassNode for meta objects (classes), because custom + // behavior should only be added to instances. + @Specialization(guards = "objectLibrary.isMetaObject(foreignObject) || !objectLibrary.hasMetaObject(foreignObject)") + static Object getClassLookup(Object foreignObject, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") @Exclusive InteropLibrary objectLibrary, + @Shared @Cached GetForeignObjectClassNode getForeignObjectClassNode) { + return getForeignObjectClassNode.execute(foreignObject); + } + + // Note: libraries except objectLibrary must not use @CachedLibrary("receiver") style as that + // would cause getMetaObject() to get called before the hasMetaObject guard, which can then + // cause a UnsupportedMessageException + @Specialization(guards = {"isSingleContext()", + "!objectLibrary.isMetaObject(foreignObject)", + "objectLibrary.hasMetaObject(foreignObject)", + "metaObjectLibrary.isIdentical(metaObject, cachedMetaObject, metaObjectLibrary)"}, limit = "getCallSiteInlineCacheMaxDepth()", assumptions = "getContext().interopTypeRegistryCacheValidAssumption.getAssumption()") + static Object getCachedClassLookup(Object foreignObject, + @CachedLibrary("foreignObject") InteropLibrary objectLibrary, + @Bind("getMetaObject(objectLibrary, foreignObject)") Object metaObject, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") @Exclusive InteropLibrary metaObjectLibrary, + @Cached("metaObject") Object cachedMetaObject, + @Cached(value = "lookupUncached($node, foreignObject, cachedMetaObject)") Object pythonClass) { + return pythonClass; + } + + // used to catch the exception + static Object getMetaObject(InteropLibrary objectLibrary, Object foreignObject) { + try { + return objectLibrary.getMetaObject(foreignObject); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } + + static Object lookupUncached(Node inliningTarget, Object foreignObject, Object metaObject) { + return lookup(inliningTarget, InlinedConditionProfile.getUncached(), foreignObject, metaObject, InteropLibrary.getUncached(), ObjectHashMapFactory.GetNodeGen.getUncached()); + } + + @Specialization(replaces = "getCachedClassLookup", guards = {"!objectLibrary.isMetaObject(foreignObject)", "objectLibrary.hasMetaObject(foreignObject)"}) + static Object getFullLookupNode(Object foreignObject, + @Bind("$node") Node node, + @Cached InlinedConditionProfile inlinedConditionProfile, + @Cached ObjectHashMap.GetNode getNode, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") @Exclusive InteropLibrary objectLibrary, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") @Exclusive InteropLibrary classLibrary) { + return lookup(node, inlinedConditionProfile, foreignObject, getMetaObject(objectLibrary, foreignObject), classLibrary, getNode); + } + + static Object lookup(Node inliningTarget, + InlinedConditionProfile builtClassFoundProfile, + Object foreignObject, + Object metaObject, + InteropLibrary metaObjectLibrary, + GetNode getNode) { + try { + // lookup generated classes + // For now, we assume that the keys in the InteropGeneratedClassCache and + // InteropTypeRegistry do not call back to any python code. + // Otherwise, the pattern listed in IndirectCallContext#enter must be used. + var possiblePythonClass = getNode.execute(null, + inliningTarget, + PythonContext.get(inliningTarget).interopGeneratedClassCache, + metaObject, + metaObjectLibrary.identityHashCode(metaObject)); + + return builtClassFoundProfile.profile(inliningTarget, possiblePythonClass != null) + ? possiblePythonClass + : lookupWithInheritance(inliningTarget, foreignObject, metaObject); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } + + private static PythonClass buildClassAndRegister(Object foreignObject, + Object metaObject, + Object[] bases, + Node inliningTarget, + PutNode putNode) throws UnsupportedMessageException { + InteropLibrary interopLibrary = InteropLibrary.getUncached(); + var context = PythonContext.get(inliningTarget); + String languageName; + try { + languageName = context.getEnv().getLanguageInfo(interopLibrary.getLanguage(metaObject)).getName(); + } catch (UnsupportedMessageException e) { + // some objects might not expose a language. Use "Foreign" as default + languageName = "Foreign"; + } + languageName = languageName.equals("Host") ? "Java" : languageName; + var className = PythonUtils.toTruffleStringUncached(String.format( + "%s_%s_generated", + languageName, + interopLibrary.getMetaQualifiedName(metaObject))); + + // use length + 1 to make space for the foreign class + var basesWithForeign = Arrays.copyOf(bases, bases.length + 1, PythonAbstractClass[].class); + basesWithForeign[basesWithForeign.length - 1] = GetForeignObjectClassNode.getUncached().execute(foreignObject); + PythonClass pythonClass; + try { + // The call might not succeed if, for instance, the MRO can't be constructed + pythonClass = PFactory.createPythonClassAndFixupSlots(context.getLanguage(), className, bases[0], basesWithForeign); + } catch (PException e) { + // Catch the error to additionally print the collected classes and specify the error + // occurred during class creation + throw PRaiseNode.raiseWithCauseStatic(inliningTarget, PythonBuiltinClassType.TypeError, e, ErrorMessages.INTEROP_CLASS_CREATION_NOT_POSSIBLE, + interopLibrary.getMetaQualifiedName(metaObject), + Arrays.toString(basesWithForeign)); + } + var module = context.lookupBuiltinModule(BuiltinNames.T_POLYGLOT); + // set module attribute for nicer debug print, but don't add it to the module to prevent + // access to the class + pythonClass.setAttribute(SpecialAttributeNames.T___MODULE__, module.getAttribute(SpecialAttributeNames.T___NAME__)); + putNode.put(null, inliningTarget, context.interopGeneratedClassCache, metaObject, InteropLibrary.getUncached().identityHashCode(metaObject), pythonClass); + return pythonClass; + } + + @TruffleBoundary + private static Object lookupWithInheritance(Node inliningTarget, Object foreignObject, Object metaObject) { + InteropLibrary interopLibrary = InteropLibrary.getUncached(); + // Try the full and expensive lookup + try { + var registry = PythonContext.get(inliningTarget).interopTypeRegistry; + var foundClasses = new LinkedHashSet<>(); + var getNode = ObjectHashMapFactory.GetNodeGen.getUncached(); + // Search first directly for the class as the key + // It always return an array of python classes or null + var possiblePythonClasses = (Object[]) getNode.execute(null, + inliningTarget, + registry, + metaObject, + interopLibrary.identityHashCode(metaObject)); + if (possiblePythonClasses != null) { + Collections.addAll(foundClasses, possiblePythonClasses); + } + + // Now search also for parent classes + searchAllParentClassesBfs(new Object[]{metaObject}, foundClasses, registry, getNode, inliningTarget); + + return foundClasses.isEmpty() + ? GetForeignObjectClassNode.getUncached().execute(foreignObject) + : buildClassAndRegister(foreignObject, + metaObject, + foundClasses.toArray(), + inliningTarget, + ObjectHashMap.PutNode.getUncached()); + } catch (UnsupportedMessageException | InvalidArrayIndexException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } + + private static void searchAllParentClassesBfs(Object[] children, + LinkedHashSet foundClasses, + ObjectHashMap registry, + ObjectHashMap.GetNode getNode, + Node inliningTarget) throws UnsupportedMessageException, InvalidArrayIndexException { + if (children == null || children.length == 0) { + // branch finished + return; + } + ArrayBuilder grandChildren = new ArrayBuilder<>(); + var interopLibrary = InteropLibrary.getUncached(); + for (var child : children) { + if (!interopLibrary.hasMetaParents(child)) { + continue; + } + var parents = interopLibrary.getMetaParents(child); + var size = interopLibrary.getArraySize(parents); + + // iterate over all parents of the current class/interface. + for (long i = 0; i < size; ++i) { + if (!interopLibrary.isArrayElementReadable(parents, i)) { + continue; + } + var metaObject = interopLibrary.readArrayElement(parents, i); + + // The registry stores either null or an array as values + Object[] possibleClasses = (Object[]) getNode.execute(null, + inliningTarget, + registry, + metaObject, + interopLibrary.identityHashCode(metaObject)); + + if (possibleClasses != null) { + Collections.addAll(foundClasses, possibleClasses); + } + grandChildren.add(metaObject); + } + } + searchAllParentClassesBfs(grandChildren.toArray(PythonUtils.EMPTY_OBJECT_ARRAY), + foundClasses, + registry, + getNode, + inliningTarget); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/IsForeignObjectNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/IsForeignObjectNode.java index 2e63b37cb3..8dfe622eb8 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/IsForeignObjectNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/IsForeignObjectNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,16 +42,12 @@ import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.objects.PythonAbstractObject; -import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.truffle.PythonTypes; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @@ -59,8 +55,6 @@ * Checks whether the object is a foreign object, i.e. is neither a python primitive value, nor a * python object. */ -@TypeSystemReference(PythonTypes.class) -@ImportStatic({PGuards.class}) @GenerateUncached @GenerateInline @GenerateCached(false) diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/IsNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/IsNode.java index fb5dd6d72e..80ed581381 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/IsNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/IsNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,26 +44,29 @@ import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; -import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject; -import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes; import com.oracle.graal.python.builtins.objects.code.CodeNodes; import com.oracle.graal.python.builtins.objects.code.PCode; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.builtins.objects.str.PString; import com.oracle.graal.python.builtins.objects.str.StringNodes; import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass; +import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.bytecode.PBytecodeGeneratorFunctionRootNode; import com.oracle.graal.python.nodes.bytecode.PBytecodeRootNode; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLGeneratorFunctionRootNode; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode; import com.oracle.graal.python.nodes.expression.BinaryOp; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsAnyBuiltinObjectProfile; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonOptions; -import com.oracle.graal.python.util.ComparisonOp; import com.oracle.graal.python.util.OverflowException; +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.RootCallTarget; +import com.oracle.truffle.api.bytecode.OperationProxy; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.Cached.Exclusive; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateUncached; @@ -79,6 +82,7 @@ @ImportStatic(PythonOptions.class) @GenerateUncached +@OperationProxy.Proxyable @SuppressWarnings("truffle-inlining") // footprint reduction 44 -> 26 public abstract class IsNode extends Node implements BinaryOp { @@ -87,7 +91,7 @@ public abstract class IsNode extends Node implements BinaryOp { protected abstract boolean executeInternal(boolean left, Object right); @Override - public final Object executeObject(VirtualFrame frame, Object left, Object right) { + public final Object execute(VirtualFrame frame, Object left, Object right) { return execute(left, right); } @@ -174,7 +178,7 @@ public static boolean doLP(long left, PInt right, public static boolean doDD(double left, double right) { // n.b. we simulate that the primitive NaN is a singleton; this is required to make // 'nan = float("nan"); nan is nan' work - return left == right || (Double.isNaN(left) && Double.isNaN(right)); + return left == right || (Double.doubleToRawLongBits(left) == Double.doubleToRawLongBits(right)); } @Specialization @@ -210,14 +214,19 @@ public static boolean doTC(PythonBuiltinClassType left, PythonBuiltinClass right // native objects @Specialization + @InliningCutoff public static boolean doNative(PythonAbstractNativeObject left, PythonAbstractNativeObject right, - @Bind("this") Node inliningTarget, - @Cached CExtNodes.PointerCompareNode pointerCompareNode) { - return pointerCompareNode.execute(inliningTarget, ComparisonOp.EQ, left, right); + @Exclusive @CachedLibrary(limit = "1") InteropLibrary interop) { + // Assumption: not perf critical, instead of refactoring + // PythonAbstractNativeObject.isIdentical into a separate node, we just piggy-back on + // interop library. We do not need two libraries, this will always specialize only to + // PythonAbstractNativeObject + return interop.isIdentical(left, right, interop); } // code @Specialization + @InliningCutoff public static boolean doCode(PCode left, PCode right, @Bind("this") Node inliningTarget, @Cached CodeNodes.GetCodeCallTargetNode getCt) { @@ -229,14 +238,28 @@ public static boolean doCode(PCode left, PCode right, if (leftCt != null && rightCt != null) { RootNode leftRootNode = leftCt.getRootNode(); RootNode rightRootNode = rightCt.getRootNode(); - if (leftRootNode instanceof PBytecodeGeneratorFunctionRootNode) { - leftRootNode = ((PBytecodeGeneratorFunctionRootNode) leftRootNode).getBytecodeRootNode(); - } - if (rightRootNode instanceof PBytecodeGeneratorFunctionRootNode) { - rightRootNode = ((PBytecodeGeneratorFunctionRootNode) rightRootNode).getBytecodeRootNode(); - } - if (leftRootNode instanceof PBytecodeRootNode && rightRootNode instanceof PBytecodeRootNode) { - return ((PBytecodeRootNode) leftRootNode).getCodeUnit() == ((PBytecodeRootNode) rightRootNode).getCodeUnit(); + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + if (leftRootNode instanceof PBytecodeDSLGeneratorFunctionRootNode l) { + leftRootNode = l.getBytecodeRootNode(); + } + if (rightRootNode instanceof PBytecodeDSLGeneratorFunctionRootNode r) { + rightRootNode = r.getBytecodeRootNode(); + } + + if (leftRootNode instanceof PBytecodeDSLRootNode l && rightRootNode instanceof PBytecodeDSLRootNode r) { + return l.getCodeUnit() == r.getCodeUnit(); + } + } else { + if (leftRootNode instanceof PBytecodeGeneratorFunctionRootNode l) { + leftRootNode = l.getBytecodeRootNode(); + } + if (rightRootNode instanceof PBytecodeGeneratorFunctionRootNode r) { + rightRootNode = r.getBytecodeRootNode(); + } + + if (leftRootNode instanceof PBytecodeRootNode l && rightRootNode instanceof PBytecodeRootNode r) { + return l.getCodeUnit() == r.getCodeUnit(); + } } return leftRootNode == rightRootNode; } else { @@ -246,29 +269,33 @@ public static boolean doCode(PCode left, PCode right, return true; } + public static boolean someIsNone(Object left, Object right) { + return PGuards.isPNone(left) || PGuards.isPNone(right); + } + // none - @Specialization - public static boolean doObjectPNone(Object left, PNone right, + @Specialization(guards = "someIsNone(left, right)") + public static boolean doPNone(Object left, Object right, @Bind("this") Node inliningTarget, @Shared @Cached IsForeignObjectNode isForeignObjectNode, @Shared @CachedLibrary(limit = "3") InteropLibrary lib) { if (left == right) { return true; } + return doPNoneSlowpath(left, right, inliningTarget, isForeignObjectNode, lib); + } + + @InliningCutoff + private static boolean doPNoneSlowpath(Object left, Object right, Node inliningTarget, IsForeignObjectNode isForeignObjectNode, InteropLibrary lib) { if (isForeignObjectNode.execute(inliningTarget, left)) { return lib.isNull(left); } + if (isForeignObjectNode.execute(inliningTarget, right)) { + return lib.isNull(right); + } return false; } - @Specialization - public static boolean doPNoneObject(PNone left, Object right, - @Bind("this") Node inliningTarget, - @Shared @Cached IsForeignObjectNode isForeignObjectNode, - @Shared @CachedLibrary(limit = "3") InteropLibrary lib) { - return doObjectPNone(right, left, inliningTarget, isForeignObjectNode, lib); - } - // pstring (may be interned) @Specialization public static boolean doPString(PString left, PString right, @@ -284,6 +311,7 @@ public static boolean doPString(PString left, PString right, // everything else @Fallback + @InliningCutoff public static boolean doOther(Object left, Object right, @Bind("this") Node inliningTarget, @Shared @Cached IsForeignObjectNode isForeignObjectNode, diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/statement/AbstractImportNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/statement/AbstractImportNode.java index 1add016e4d..3679765bb6 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/statement/AbstractImportNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/statement/AbstractImportNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -79,7 +79,7 @@ import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.ValueType; @@ -113,19 +113,19 @@ public static PythonModule importModule(TruffleString name) { if (builtinImport == PNone.NO_VALUE) { throw PConstructAndRaiseNode.getUncached().raiseImportError(null, IMPORT_NOT_FOUND); } - Object fromList = context.factory().createTuple(PythonUtils.EMPTY_TRUFFLESTRING_ARRAY); + Object fromList = PFactory.createTuple(context.getLanguage(), PythonUtils.EMPTY_TRUFFLESTRING_ARRAY); CallNode.executeUncached(builtinImport, name, PNone.NONE, PNone.NONE, fromList, 0); PythonModule sysModule = context.lookupBuiltinModule(T_SYS); Object modules = sysModule.getAttribute(T_MODULES); if (modules == PNone.NO_VALUE) { - throw PRaiseNode.getUncached().raise(RuntimeError, ErrorMessages.UNABLE_TO_GET_S, "sys.modules"); + throw PRaiseNode.raiseStatic(null, RuntimeError, ErrorMessages.UNABLE_TO_GET_S, "sys.modules"); } Object module = PyObjectGetItem.executeUncached(modules, name); if (module instanceof PythonModule pythonModule) { return pythonModule; } // FIXME CPython allows putting any object in sys.modules - throw PRaiseNode.getUncached().raise(NotImplementedError, ErrorMessages.PUTTING_NON_MODULE_OBJECTS_IN_SYS_MODULES_IS_NOT_SUPPORTED); + throw PRaiseNode.raiseStatic(null, NotImplementedError, ErrorMessages.PUTTING_NON_MODULE_OBJECTS_IN_SYS_MODULES_IS_NOT_SUPPORTED); } protected final Object importModule(VirtualFrame frame, TruffleString name, Object globals, TruffleString[] fromList, int level, ImportName importNameNode) { @@ -170,7 +170,6 @@ static Object importName(VirtualFrame frame, PythonContext context, PythonModule @Cached PConstructAndRaiseNode.Lazy raiseNode, @Cached CallNode importCallNode, @Cached GetDictFromGlobalsNode getDictNode, - @Cached PythonObjectFactory factory, @Cached PyImportImportModuleLevelObject importModuleLevel) { Object importFunc = readAttrNode.execute(builtins, T___IMPORT__, null); if (importFunc == null) { @@ -183,7 +182,7 @@ static Object importName(VirtualFrame frame, PythonContext context, PythonModule } else { globalsArg = getDictNode.execute(inliningTarget, globals); } - return importCallNode.execute(frame, importFunc, name, globalsArg, PNone.NONE, factory.createTuple(fromList), level); + return importCallNode.execute(frame, importFunc, name, globalsArg, PNone.NONE, PFactory.createTuple(PythonLanguage.get(inliningTarget), fromList), level); } return importModuleLevel.execute(frame, context, name, globals, fromList, level); } @@ -206,7 +205,7 @@ public abstract static class PyImportImportModuleLevelObject extends Node { @SuppressWarnings("unused") @Specialization(guards = "level < 0") Object levelLtZero(VirtualFrame frame, PythonContext context, TruffleString name, Object globals, TruffleString[] fromList, int level) { - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.TypeError, ErrorMessages.LEVEL_MUST_BE_AT_LEAST_ZERO); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.TypeError, ErrorMessages.LEVEL_MUST_BE_AT_LEAST_ZERO); } protected static boolean containsDot(TruffleString name, TruffleString.CodePointLengthNode codePointLengthNode, TruffleString.IndexOfCodePointNode indexOfCodePointNode) { @@ -218,7 +217,7 @@ public static Object levelZeroNoFromlist(VirtualFrame frame, PythonContext conte @SuppressWarnings("unused") TruffleString[] fromList, @SuppressWarnings("unused") int level, @Bind("this") Node inliningTarget, - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Exclusive @Cached PyDictGetItem getModuleNode, @Exclusive @Cached EnsureInitializedNode ensureInitialized, @Exclusive @Cached FindAndLoad findAndLoad, @@ -226,7 +225,7 @@ public static Object levelZeroNoFromlist(VirtualFrame frame, PythonContext conte @Exclusive @Cached @SuppressWarnings("unused") TruffleString.IndexOfCodePointNode indexOfCodePointNode) { final TruffleString absName = name; if (name.isEmpty()) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.EMPTY_MOD_NAME); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.EMPTY_MOD_NAME); } PDict sysModules = context.getSysModules(); Object mod = getModuleNode.execute(frame, inliningTarget, sysModules, absName); // import_get_module @@ -254,12 +253,11 @@ private ModuleFront(TruffleString front) { static Object genericImport(VirtualFrame frame, PythonContext context, TruffleString name, Object globals, TruffleString[] fromList, int level, @Bind("this") Node inliningTarget, @Cached ResolveName resolveName, - @Exclusive @Cached PRaiseNode.Lazy raiseNode, + @Exclusive @Cached PRaiseNode raiseNode, @Exclusive @Cached PyDictGetItem getModuleNode, @Exclusive @Cached EnsureInitializedNode ensureInitialized, @Cached PyObjectLookupAttr getPathNode, @Cached PyObjectCallMethodObjArgs callHandleFromlist, - @Cached PythonObjectFactory factory, @Exclusive @Cached FindAndLoad findAndLoad, @Cached InlinedConditionProfile recursiveCase, @Exclusive @Cached TruffleString.CodePointLengthNode codePointLengthNode, @@ -270,7 +268,7 @@ static Object genericImport(VirtualFrame frame, PythonContext context, TruffleSt absName = resolveName.execute(frame, name, globals, level); } else { if (name.isEmpty()) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.EMPTY_MOD_NAME); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.EMPTY_MOD_NAME); } absName = name; } @@ -312,7 +310,7 @@ static Object genericImport(VirtualFrame frame, PythonContext context, TruffleSt TruffleString toReturn = substringNode.execute(absName, 0, codePointLengthNode.execute(absName, TS_ENCODING) - cutoff, TS_ENCODING, true); Object finalModule = getModuleNode.execute(frame, inliningTarget, sysModules, toReturn); // import_get_module if (finalModule == null) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.KeyError, ErrorMessages.S_NOT_IN_SYS_MODS, toReturn); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.KeyError, ErrorMessages.S_NOT_IN_SYS_MODS, toReturn); } return finalModule; } @@ -324,7 +322,7 @@ static Object genericImport(VirtualFrame frame, PythonContext context, TruffleSt if (path != PNone.NO_VALUE) { return callHandleFromlist.execute(frame, inliningTarget, context.getImportlib(), T__HANDLE_FROMLIST, mod, - factory.createTuple(fromList), + PFactory.createTuple(PythonLanguage.get(inliningTarget), fromList), context.importFunc()); } else { return mod; @@ -333,7 +331,7 @@ static Object genericImport(VirtualFrame frame, PythonContext context, TruffleSt } static Object genericImportRecursion(VirtualFrame frame, Node inliningTarget, PythonContext context, ModuleFront front, - PRaiseNode.Lazy raiseNode, + PRaiseNode raiseNode, PyDictGetItem getModuleNode, EnsureInitializedNode ensureInitialized, FindAndLoad findAndLoad, @@ -342,7 +340,7 @@ static Object genericImportRecursion(VirtualFrame frame, Node inliningTarget, Py TruffleString.SubstringNode substringNode) { TruffleString absName = front.front; if (absName.isEmpty()) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.EMPTY_MOD_NAME); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.EMPTY_MOD_NAME); } PDict sysModules = context.getSysModules(); Object mod = getModuleNode.execute(frame, inliningTarget, sysModules, absName); // import_get_module @@ -384,7 +382,7 @@ static boolean isInitializing(VirtualFrame frame, Object mod, Object spec = getSpecNode.execute(frame, inliningTarget, mod, SpecialAttributeNames.T___SPEC__); if (hasSpec.profile(inliningTarget, spec != PNone.NO_VALUE)) { Object initializing = getInitNode.execute(frame, inliningTarget, spec, T__INITIALIZING); - return isTrue.execute(frame, inliningTarget, initializing); + return isTrue.execute(frame, initializing); } else { return false; } @@ -482,7 +480,7 @@ TruffleString resolveName(VirtualFrame frame, TruffleString name, Object globals CompilerDirectives.transferToInterpreterAndInvalidate(); branchStates[0] |= CANNOT_CAST; } - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.TypeError, ErrorMessages.PACKAGE_MUST_BE_A_STRING); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.TypeError, ErrorMessages.PACKAGE_MUST_BE_A_STRING); } if (spec != null && spec != PNone.NONE) { if ((branchStates[0] & SPEC_IS_STH) == 0) { @@ -508,7 +506,7 @@ TruffleString resolveName(VirtualFrame frame, TruffleString name, Object globals CompilerDirectives.transferToInterpreterAndInvalidate(); branchStates[0] |= CANNOT_CAST; } - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.TypeError, ErrorMessages.SPEC_PARENT_MUST_BE_A_STRING); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.TypeError, ErrorMessages.SPEC_PARENT_MUST_BE_A_STRING); } } else { if ((branchStates[0] & NO_SPEC_PKG) == 0) { @@ -528,7 +526,7 @@ TruffleString resolveName(VirtualFrame frame, TruffleString name, Object globals CompilerDirectives.transferToInterpreterAndInvalidate(); branchStates[0] |= GOT_NO_NAME; } - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.KeyError, ErrorMessages.NAME_NOT_IN_GLOBALS); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.KeyError, ErrorMessages.NAME_NOT_IN_GLOBALS); } try { pkgString = castPackageNode.execute(inliningTarget, pkg); @@ -537,7 +535,7 @@ TruffleString resolveName(VirtualFrame frame, TruffleString name, Object globals CompilerDirectives.transferToInterpreterAndInvalidate(); branchStates[0] |= CANNOT_CAST; } - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.TypeError, ErrorMessages.NAME_MUST_BE_A_STRING); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.TypeError, ErrorMessages.NAME_MUST_BE_A_STRING); } Object path = getPackageOrNameNode.execute(frame, inliningTarget, globalsDict, SpecialAttributeNames.T___PATH__); if (path == null) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/truffle/PythonArithmeticTypes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/truffle/PythonArithmeticTypes.java deleted file mode 100644 index c8b5d6b682..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/truffle/PythonArithmeticTypes.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2018, 2022, Oracle and/or its affiliates. - * Copyright (c) 2013, Regents of the University of California - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.oracle.graal.python.nodes.truffle; - -import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass; -import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject; -import com.oracle.graal.python.builtins.objects.floats.PFloat; -import com.oracle.graal.python.nodes.PGuards; -import com.oracle.truffle.api.dsl.ImplicitCast; -import com.oracle.truffle.api.dsl.TypeCast; -import com.oracle.truffle.api.dsl.TypeCheck; -import com.oracle.truffle.api.dsl.TypeSystem; - -/** - * This type system is supposed to be used in builtin nodes to reduce the number of specializations - * due to type combinations. A node that needs to handle all combinations of Python {@code int} and - * {@code float} types can just use the most general primitive type, i.e., in case of Python type - * {@code int} use Java {@code long} and in case of Python type {@code float} use Java - * {@code double}. {@code PInt} needs to be treated separately because of its arbitrary precision. - * - * Only use in nodes where it is known that {@code PInt} and {@code PFloat} objects are not - * subclassed! - */ -@TypeSystem -public abstract class PythonArithmeticTypes { - - @ImplicitCast - public static double PFloatToDouble(PFloat value) { - // NOTE: That's correct because we just use it in arithmetic operations where CPython also - // access the value ('f_val') directly. So, even if the object is subclassed, it is ignored. - return value.getValue(); - } - - @ImplicitCast - public static int booleanToInt(boolean value) { - return value ? 1 : 0; - } - - @ImplicitCast - public static long booleanToLong(boolean value) { - return value ? 1 : 0; - } - - @ImplicitCast - public static long intToLong(int value) { - return value; - } - - @TypeCheck(PythonNativeObject.class) - public static boolean isNativeObject(Object object) { - return PythonNativeObject.isInstance(object); - } - - @TypeCast(PythonNativeObject.class) - public static PythonNativeObject asNativeObject(Object object) { - return PythonNativeObject.cast(object); - } - - @TypeCheck(PythonNativeClass.class) - public static boolean isNativeClass(Object object) { - return PGuards.isNativeClass(object); - } - - @TypeCast(PythonNativeClass.class) - public static PythonNativeClass asNativeClass(Object object) { - return PythonNativeClass.cast(object); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/truffle/PythonIntegerAndFloatTypes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/truffle/PythonIntegerAndFloatTypes.java new file mode 100644 index 0000000000..fe6433b80f --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/truffle/PythonIntegerAndFloatTypes.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.nodes.truffle; + +import com.oracle.graal.python.builtins.objects.floats.PFloat; +import com.oracle.truffle.api.dsl.ImplicitCast; +import com.oracle.truffle.api.dsl.TypeSystem; + +/** + * Type system that automatically unpacks PFloat object to the contained double value. Should only + * be used in nodes where CPython directly accesses f_val. + */ +@TypeSystem +public class PythonIntegerAndFloatTypes extends PythonIntegerTypes { + @ImplicitCast + public static double PFloatToDouble(PFloat value) { + // NOTE: That's correct because we just use it in arithmetic operations where CPython also + // access the value ('f_val') directly. So, even if the object is subclassed, it is ignored. + return value.getValue(); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/truffle/PythonIntegerTypes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/truffle/PythonIntegerTypes.java new file mode 100644 index 0000000000..054c7a4508 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/truffle/PythonIntegerTypes.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. + * Copyright (c) 2013, Regents of the University of California + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.oracle.graal.python.nodes.truffle; + +import com.oracle.truffle.api.dsl.ImplicitCast; +import com.oracle.truffle.api.dsl.TypeSystem; + +/** + * This type system is supposed to be used in builtin nodes to reduce the number of specializations + * due to type combinations. Booleans and ints are converted to long. PInt needs to be handled + * separately. + */ +@TypeSystem +public abstract class PythonIntegerTypes { + + @ImplicitCast + public static int booleanToInt(boolean value) { + return value ? 1 : 0; + } + + @ImplicitCast + public static long booleanToLong(boolean value) { + return value ? 1 : 0; + } + + @ImplicitCast + public static long intToLong(int value) { + return value; + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/truffle/PythonTypes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/truffle/PythonTypes.java deleted file mode 100644 index 7815ff437a..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/truffle/PythonTypes.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2017, 2022, Oracle and/or its affiliates. - * Copyright (c) 2013, Regents of the University of California - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.oracle.graal.python.nodes.truffle; - -import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass; -import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject; -import com.oracle.graal.python.nodes.PGuards; -import com.oracle.truffle.api.dsl.ImplicitCast; -import com.oracle.truffle.api.dsl.TypeCast; -import com.oracle.truffle.api.dsl.TypeCheck; -import com.oracle.truffle.api.dsl.TypeSystem; - -@TypeSystem -public abstract class PythonTypes { - - @ImplicitCast - public static long intToLong(int value) { - return value; - } - - @TypeCheck(PythonNativeObject.class) - public static boolean isNativeObject(Object object) { - return PythonNativeObject.isInstance(object); - } - - @TypeCast(PythonNativeObject.class) - public static PythonNativeObject asNativeObject(Object object) { - return PythonNativeObject.cast(object); - } - - @TypeCheck(PythonNativeClass.class) - public static boolean isNativeClass(Object object) { - return PGuards.isNativeClass(object); - } - - @TypeCast(PythonNativeClass.class) - public static PythonNativeClass asNativeClass(Object object) { - return PythonNativeClass.cast(object); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/BadOPCodeNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/BadOPCodeNode.java index 6bf32be4ca..9af5d0866a 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/BadOPCodeNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/BadOPCodeNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -66,7 +66,7 @@ public BadOPCodeNode(TruffleLanguage language, TruffleString name) { @Override public Object execute(VirtualFrame frame) { - throw PRaiseNode.raiseUncached(this, PythonBuiltinClassType.SystemError, ErrorMessages.UNKNOWN_OPCODE); + throw PRaiseNode.raiseStatic(this, PythonBuiltinClassType.SystemError, ErrorMessages.UNKNOWN_OPCODE); } @Override diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToByteNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToByteNode.java index f3d49fb712..70db749531 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToByteNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToByteNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -53,7 +53,6 @@ import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.util.BiFunction; import com.oracle.graal.python.util.OverflowException; -import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.ImportStatic; @@ -61,18 +60,19 @@ import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; +import com.oracle.truffle.api.profiles.BranchProfile; @ImportStatic(PGuards.class) public abstract class CastToByteNode extends Node { public static final CastToByteNode UNCACHED_INSTANCE = CastToByteNode.create(); - @Child private PRaiseNode raiseNode; + private final BranchProfile errorProfile = BranchProfile.create(); - private final BiFunction rangeErrorHandler; - private final BiFunction typeErrorHandler; + private final BiFunction rangeErrorHandler; + private final BiFunction typeErrorHandler; protected final boolean coerce; - protected CastToByteNode(BiFunction rangeErrorHandler, BiFunction typeErrorHandler, boolean coerce) { + protected CastToByteNode(BiFunction rangeErrorHandler, BiFunction typeErrorHandler, boolean coerce) { this.rangeErrorHandler = rangeErrorHandler; this.typeErrorHandler = typeErrorHandler; this.coerce = coerce; @@ -170,27 +170,21 @@ protected byte doObject(VirtualFrame frame, Object value, return doError(value); } - private byte doError(@SuppressWarnings("unused") Object val) { - if (raiseNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - raiseNode = insert(PRaiseNode.create()); - } + private byte doError(Object val) { + errorProfile.enter(); if (typeErrorHandler != null) { - return typeErrorHandler.apply(val, raiseNode); + return typeErrorHandler.apply(this, val); } else { - throw raiseNode.raise(TypeError, ErrorMessages.INTEGER_REQUIRED_GOT, val); + throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.INTEGER_REQUIRED_GOT, val); } } private byte handleRangeError(Object val) { - if (raiseNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - raiseNode = insert(PRaiseNode.create()); - } + errorProfile.enter(); if (rangeErrorHandler != null) { - return rangeErrorHandler.apply(val, raiseNode); + return rangeErrorHandler.apply(this, val); } else { - throw raiseNode.raise(ValueError, ErrorMessages.BYTE_MUST_BE_IN_RANGE); + throw PRaiseNode.raiseStatic(this, ValueError, ErrorMessages.BYTE_MUST_BE_IN_RANGE); } } @@ -209,12 +203,7 @@ public static CastToByteNode create(boolean coerce) { } @NeverDefault - public static CastToByteNode create(BiFunction rangeErrorHandler, BiFunction typeErrorHandler) { + public static CastToByteNode create(BiFunction rangeErrorHandler, BiFunction typeErrorHandler) { return CastToByteNodeGen.create(rangeErrorHandler, typeErrorHandler, false); } - - @NeverDefault - public static CastToByteNode create(BiFunction rangeErrorHandler, BiFunction typeErrorHandler, boolean coerce) { - return CastToByteNodeGen.create(rangeErrorHandler, typeErrorHandler, coerce); - } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaBigIntegerNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaBigIntegerNode.java index a51aebe08b..2b1f875931 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaBigIntegerNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaBigIntegerNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -51,7 +51,6 @@ import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.object.GetClassNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; @@ -59,10 +58,8 @@ import com.oracle.truffle.api.dsl.GenerateUncached; import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.nodes.Node; -@TypeSystemReference(PythonArithmeticTypes.class) @GenerateUncached @GenerateInline(inlineByDefault = true) @GenerateCached @@ -101,7 +98,7 @@ protected static BigInteger fromPInt(PInt x) { @Specialization protected static BigInteger generic(Node inliningTarget, Object x, - @Cached PRaiseNode.Lazy raise, + @Cached PRaiseNode raise, @Cached(inline = false) CastToJavaBigIntegerNode rec, @Cached GetClassNode getClassNode, @Cached PyIndexCheckNode indexCheckNode, @@ -109,6 +106,6 @@ protected static BigInteger generic(Node inliningTarget, Object x, if (indexCheckNode.execute(inliningTarget, x)) { return rec.execute(null, indexNode.execute(null, inliningTarget, x)); } - throw raise.get(inliningTarget).raise(TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, getClassNode.execute(inliningTarget, x)); + throw raise.raise(inliningTarget, TypeError, ErrorMessages.OBJ_CANNOT_BE_INTERPRETED_AS_INTEGER, getClassNode.execute(inliningTarget, x)); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaBooleanNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaBooleanNode.java index 40fa79e60c..78ee5de6ac 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaBooleanNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaBooleanNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -106,7 +106,7 @@ static boolean doNativeObject(Node inliningTarget, PythonNativeObject x, @Shared @Cached(inline = false) IsSubtypeNode isSubtypeNode) { if (isSubtypeNode.execute(getClassNode.execute(inliningTarget, x), PythonBuiltinClassType.Boolean)) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, NotImplementedError, ErrorMessages.CASTING_A_NATIVE_INT_OBJECT_IS_NOT_IMPLEMENTED_YET); + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, ErrorMessages.CASTING_A_NATIVE_INT_OBJECT_IS_NOT_IMPLEMENTED_YET); } // the object's type is not a subclass of 'int' throw CannotCastException.INSTANCE; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaByteNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaByteNode.java index 4e90ebee00..84ecb014d8 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaByteNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaByteNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -94,33 +94,33 @@ static byte fromPInt(PInt x) { @Specialization(replaces = "fromInt") @InliningCutoff static byte fromIntErr(Node inliningTarget, int x, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { + @Shared("raiseNode") @Cached PRaiseNode raiseNode) { try { return PInt.byteValueExact(x); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.BYTE_MUST_BE_IN_RANGE); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.BYTE_MUST_BE_IN_RANGE); } } @Specialization(replaces = "fromLong") @InliningCutoff static byte fromLongErr(Node inliningTarget, long x, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { + @Shared("raiseNode") @Cached PRaiseNode raiseNode) { try { return PInt.byteValueExact(x); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.BYTE_MUST_BE_IN_RANGE); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.BYTE_MUST_BE_IN_RANGE); } } @Specialization(replaces = "fromPInt") @InliningCutoff static byte fromPIntErr(Node inliningTarget, PInt x, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { + @Shared("raiseNode") @Cached PRaiseNode raiseNode) { try { return x.byteValueExact(); } catch (ArithmeticException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.BYTE_MUST_BE_IN_RANGE); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.BYTE_MUST_BE_IN_RANGE); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaDoubleNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaDoubleNode.java index baadf51e10..7f9f6b80e1 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaDoubleNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaDoubleNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -50,7 +50,7 @@ import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.object.GetClassNode.GetPythonObjectClassNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; +import com.oracle.graal.python.nodes.truffle.PythonIntegerAndFloatTypes; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.dsl.Cached; @@ -73,8 +73,8 @@ @GenerateUncached @GenerateInline @GenerateCached(false) -@TypeSystemReference(PythonArithmeticTypes.class) @ImportStatic(MathGuards.class) +@TypeSystemReference(PythonIntegerAndFloatTypes.class) public abstract class CastToJavaDoubleNode extends PNodeWithContext { public abstract double execute(Node inliningTarget, Object x); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaIntExactNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaIntExactNode.java index 310b6d7e15..c9b3c77218 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaIntExactNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaIntExactNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -67,15 +67,15 @@ @GenerateCached public abstract class CastToJavaIntExactNode extends CastToJavaIntNode { - public final int executeWithThrowSystemError(Node inliningTarget, Object x, PRaiseNode.Lazy raiseNode) { + public final int executeWithThrowSystemError(Node inliningTarget, Object x, PRaiseNode raiseNode) { return executeWithThrow(inliningTarget, x, raiseNode, SystemError); } - public final int executeWithThrow(Node inliningTarget, Object x, PRaiseNode.Lazy raiseNode, PythonBuiltinClassType errType) { + public final int executeWithThrow(Node inliningTarget, Object x, PRaiseNode raiseNode, PythonBuiltinClassType errType) { try { return execute(inliningTarget, x); } catch (CannotCastException cce) { - throw raiseNode.get(inliningTarget).raise(errType, MUST_BE_S_NOT_P, "an int", x); + throw raiseNode.raise(inliningTarget, errType, MUST_BE_S_NOT_P, "an int", x); } } @@ -117,21 +117,21 @@ static int pIntToInt(PInt x) throws OverflowException { @Specialization(replaces = "longToInt") static int longToIntOverflow(Node inliningTarget, long x, - @Shared("raise") @Cached PRaiseNode.Lazy raiseNode) { + @Shared("raise") @Cached PRaiseNode raiseNode) { try { return PInt.intValueExact(x); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "int"); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "int"); } } @Specialization(replaces = "pIntToInt") static int pIntToIntOverflow(Node inliningTarget, PInt x, - @Shared("raise") @Cached PRaiseNode.Lazy raiseNode) { + @Shared("raise") @Cached PRaiseNode raiseNode) { try { return x.intValueExact(); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "int"); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "int"); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaIntNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaIntNode.java index d9584d01b7..7ab4b8ba5f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaIntNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaIntNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,7 +42,7 @@ import com.oracle.graal.python.builtins.modules.MathGuards; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; @@ -51,7 +51,7 @@ import com.oracle.truffle.api.dsl.TypeSystemReference; import com.oracle.truffle.api.nodes.Node; -@TypeSystemReference(PythonArithmeticTypes.class) +@TypeSystemReference(PythonIntegerTypes.class) @ImportStatic(MathGuards.class) @GenerateInline @GenerateCached(false) diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaLongExactNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaLongExactNode.java index 5557e336df..0bae6be64f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaLongExactNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaLongExactNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -65,15 +65,15 @@ @GenerateCached(false) public abstract class CastToJavaLongExactNode extends CastToJavaLongNode { - public final long executeWithThrowSystemError(Node inliningTarget, Object x, PRaiseNode.Lazy raiseNode) { + public final long executeWithThrowSystemError(Node inliningTarget, Object x, PRaiseNode raiseNode) { return executeWithThrow(inliningTarget, x, raiseNode, SystemError); } - public final long executeWithThrow(Node inliningTarget, Object x, PRaiseNode.Lazy raiseNode, PythonBuiltinClassType errType) { + public final long executeWithThrow(Node inliningTarget, Object x, PRaiseNode raiseNode, PythonBuiltinClassType errType) { try { return execute(inliningTarget, x); } catch (CannotCastException cce) { - throw raiseNode.get(inliningTarget).raise(errType, MUST_BE_S_NOT_P, "a long", x); + throw raiseNode.raise(inliningTarget, errType, MUST_BE_S_NOT_P, "a long", x); } } @@ -88,11 +88,11 @@ protected static long toLongNoOverflow(PInt x) throws OverflowException { @Specialization(replaces = "toLongNoOverflow") protected static long toLong(Node inliningTarget, PInt x, - @Cached PRaiseNode.Lazy raiseNode) { + @Cached PRaiseNode raiseNode) { try { return x.longValueExact(); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "long"); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "long"); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaLongNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaLongNode.java index 65f49c412c..42d2c10365 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaLongNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaLongNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -94,7 +94,7 @@ static long doNativeObject(Node inliningTarget, PythonNativeObject x, @Cached(inline = false) IsSubtypeNode isSubtypeNode) { if (isSubtypeNode.execute(getClassNode.execute(inliningTarget, x), PythonBuiltinClassType.PInt)) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(inliningTarget, NotImplementedError, ErrorMessages.CASTING_A_NATIVE_INT_OBJECT_IS_NOT_IMPLEMENTED_YET); + throw PRaiseNode.raiseStatic(inliningTarget, NotImplementedError, ErrorMessages.CASTING_A_NATIVE_INT_OBJECT_IS_NOT_IMPLEMENTED_YET); } // the object's type is not a subclass of 'int' throw CannotCastException.INSTANCE; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaShortNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaShortNode.java index a5f9b5c724..44c254f575 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaShortNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaShortNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -92,31 +92,31 @@ static short fromPInt(PInt x) { @Specialization(replaces = "fromInt") static short fromIntErr(Node inliningTarget, int x, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { + @Shared("raiseNode") @Cached PRaiseNode raiseNode) { try { return PInt.shortValueExact(x); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.SHORT_MUST_BE_IN_RANGE); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.SHORT_MUST_BE_IN_RANGE); } } @Specialization(replaces = "fromLong") static short fromLongErr(Node inliningTarget, long x, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { + @Shared("raiseNode") @Cached PRaiseNode raiseNode) { try { return PInt.shortValueExact(x); } catch (OverflowException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.SHORT_MUST_BE_IN_RANGE); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.SHORT_MUST_BE_IN_RANGE); } } @Specialization(replaces = "fromPInt") static short fromPIntErr(Node inliningTarget, PInt x, - @Shared("raiseNode") @Cached PRaiseNode.Lazy raiseNode) { + @Shared("raiseNode") @Cached PRaiseNode raiseNode) { try { return x.shortValueExact(); } catch (ArithmeticException e) { - throw raiseNode.get(inliningTarget).raise(PythonBuiltinClassType.ValueError, ErrorMessages.SHORT_MUST_BE_IN_RANGE); + throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.SHORT_MUST_BE_IN_RANGE); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaStringNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaStringNode.java index 0afdc6151a..508bf73310 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaStringNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaStringNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,17 +44,19 @@ import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject; import com.oracle.graal.python.builtins.objects.str.PString; import com.oracle.graal.python.builtins.objects.str.StringNodes.StringMaterializeNode; -import com.oracle.graal.python.nodes.PGuards; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.classes.IsSubtypeNode; import com.oracle.graal.python.nodes.object.GetClassNode; import com.oracle.graal.python.nodes.util.CastToTruffleStringNode.ReadNativeStringNode; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateUncached; -import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; +import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @@ -63,7 +65,6 @@ * because the object is not a Python string, the node will throw a {@link CannotCastException}. */ @GenerateUncached -@ImportStatic(PGuards.class) @SuppressWarnings("truffle-inlining") // footprint reduction 36 -> 17 public abstract class CastToJavaStringNode extends PNodeWithContext { @@ -104,8 +105,17 @@ static String doNativeObject(PythonNativeObject x, } @Specialization(guards = {"!isString(x)", "!isNativeObject(x)"}) - static String doUnsupported(@SuppressWarnings("unused") Object x) { - throw CannotCastException.INSTANCE; + static String other(Object x, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop) { + if (interop.isString(x)) { + try { + return interop.asString(x); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + } else { + throw CannotCastException.INSTANCE; + } } public static CastToJavaStringNode getUncached() { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaUnsignedLongNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaUnsignedLongNode.java index 729cf92e31..c825a8e1ae 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaUnsignedLongNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToJavaUnsignedLongNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -49,7 +49,7 @@ import com.oracle.graal.python.nodes.ErrorMessages; import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; +import com.oracle.graal.python.nodes.truffle.PythonIntegerTypes; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Cached.Shared; @@ -72,7 +72,7 @@ * Note that since Java {@code long} is signed, the values in the between 2^63 and 2^64-1 are * returned as negative numbers. */ -@TypeSystemReference(PythonArithmeticTypes.class) +@TypeSystemReference(PythonIntegerTypes.class) @GenerateUncached @GenerateInline @GenerateCached(false) @@ -85,34 +85,33 @@ public static long executeUncached(Object arg) { @Specialization static long toUnsignedLong(Node inliningTarget, long x, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { checkNegative(x < 0, inliningTarget, raiseNode); return x; } @Specialization static long toUnsignedLong(Node inliningTarget, PInt x, - @Shared @Cached PRaiseNode.Lazy raiseNode) { + @Shared @Cached PRaiseNode raiseNode) { checkNegative(x.isNegative(), inliningTarget, raiseNode); return convertBigInt(x.getValue(), inliningTarget); } @Fallback - static long doUnsupported(Node inliningTarget, @SuppressWarnings("unused") Object x, - @Shared @Cached PRaiseNode.Lazy raiseNode) { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.INTEGER_REQUIRED); + static long doUnsupported(Node inliningTarget, @SuppressWarnings("unused") Object x) { + throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.INTEGER_REQUIRED); } - private static void checkNegative(boolean negative, Node inliningTarget, PRaiseNode.Lazy raiseNode) { + private static void checkNegative(boolean negative, Node inliningTarget, PRaiseNode raiseNode) { if (negative) { - throw raiseNode.get(inliningTarget).raise(OverflowError, ErrorMessages.CANNOT_CONVERT_NEGATIVE_VALUE_TO_UNSIGNED_INT); + throw raiseNode.raise(inliningTarget, OverflowError, ErrorMessages.CANNOT_CONVERT_NEGATIVE_VALUE_TO_UNSIGNED_INT); } } @TruffleBoundary private static long convertBigInt(BigInteger bi, Node nodeForRaise) { if (bi.bitLength() > 64) { - throw PRaiseNode.raiseUncached(nodeForRaise, OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "unsigned long"); + throw PRaiseNode.raiseStatic(nodeForRaise, OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "unsigned long"); } return bi.longValue(); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToTruffleStringNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToTruffleStringNode.java index 22195e5b14..69e335c036 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToTruffleStringNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CastToTruffleStringNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,6 +44,7 @@ import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyASCIIObject__state; import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyASCIIObject__state_ready_shift; import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyUnicodeObject__data; +import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.isBitSet; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -67,6 +68,7 @@ import com.oracle.truffle.api.dsl.NeverDefault; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.interop.InteropLibrary; +import com.oracle.truffle.api.interop.UnsupportedMessageException; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.strings.TruffleString; @@ -111,6 +113,7 @@ static TruffleString doPStringMaterialized(PString x) { } @Specialization(guards = "!x.isMaterialized()") + @InliningCutoff static TruffleString doPStringGeneric(Node inliningTarget, PString x, @Cached StringMaterializeNode materializeNode) { return materializeNode.execute(inliningTarget, x); @@ -175,8 +178,21 @@ static TruffleString doNativeObject(Node inliningTarget, PythonNativeObject x, } @Specialization(guards = {"!isString(x)", "!isNativeObject(x)"}) - static TruffleString doUnsupported(@SuppressWarnings("unused") Object x) { - throw CannotCastException.INSTANCE; + @InliningCutoff + static TruffleString other(Object x, + @CachedLibrary(limit = "getCallSiteInlineCacheMaxDepth()") InteropLibrary interop, + @Cached(inline = false) TruffleString.SwitchEncodingNode switchEncodingNode) { + if (interop.isString(x)) { + TruffleString truffleString; + try { + truffleString = interop.asTruffleString(x); + } catch (UnsupportedMessageException e) { + throw CompilerDirectives.shouldNotReachHere(e); + } + return switchEncodingNode.execute(truffleString, TS_ENCODING); + } else { + throw CannotCastException.INSTANCE; + } } @NeverDefault diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CoerceToComplexNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CoerceToComplexNode.java index a601e6518a..848adfa7c2 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CoerceToComplexNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/CoerceToComplexNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,6 +42,7 @@ import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.complex.PComplex; import com.oracle.graal.python.lib.PyFloatAsDoubleNode; @@ -50,10 +51,10 @@ import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode; -import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.nodes.truffle.PythonIntegerAndFloatTypes; +import com.oracle.graal.python.runtime.object.PFactory; +import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; -import com.oracle.truffle.api.dsl.Cached.Shared; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.ImportStatic; @@ -64,7 +65,7 @@ @GenerateInline @GenerateCached(false) -@TypeSystemReference(PythonArithmeticTypes.class) +@TypeSystemReference(PythonIntegerAndFloatTypes.class) @ImportStatic(PGuards.class) public abstract class CoerceToComplexNode extends PNodeWithContext { @@ -72,14 +73,14 @@ public abstract class CoerceToComplexNode extends PNodeWithContext { @Specialization static PComplex doLong(long x, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - return factory.createComplex(x, 0); + @Bind PythonLanguage language) { + return PFactory.createComplex(language, x, 0); } @Specialization static PComplex doDouble(double x, - @Shared @Cached(inline = false) PythonObjectFactory factory) { - return factory.createComplex(x, 0); + @Bind PythonLanguage language) { + return PFactory.createComplex(language, x, 0); } @Specialization @@ -91,8 +92,8 @@ static PComplex doComplex(PComplex x) { static PComplex toComplex(VirtualFrame frame, Node inliningTarget, Object x, @Cached(value = "create(T___COMPLEX__)", inline = false) LookupAndCallUnaryNode callComplexFunc, @Cached PyFloatAsDoubleNode asDoubleNode, - @Shared @Cached(inline = false) PythonObjectFactory factory, - @Cached PRaiseNode.Lazy raiseNode) { + @Bind PythonLanguage language, + @Cached PRaiseNode raiseNode) { Object result = callComplexFunc.executeObject(frame, x); if (result != PNone.NO_VALUE) { if (result instanceof PComplex) { @@ -103,9 +104,9 @@ static PComplex toComplex(VirtualFrame frame, Node inliningTarget, Object x, // and may be removed in a future version of Python. return (PComplex) result; } else { - throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.SHOULD_RETURN, "__complex__", "complex object"); + throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.SHOULD_RETURN, "__complex__", "complex object"); } } - return factory.createComplex(asDoubleNode.execute(frame, inliningTarget, x), 0); + return PFactory.createComplex(language, asDoubleNode.execute(frame, inliningTarget, x), 0); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/NarrowBigIntegerNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/NarrowBigIntegerNode.java index 66c6f99559..ba7025a57e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/NarrowBigIntegerNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/util/NarrowBigIntegerNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,9 +42,10 @@ import java.math.BigInteger; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.ints.PInt; import com.oracle.graal.python.nodes.PNodeWithContext; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.GenerateCached; import com.oracle.truffle.api.dsl.GenerateInline; @@ -72,14 +73,13 @@ static Object narrowBigInteger0(@SuppressWarnings("unused") BigInteger x) { @Specialization(guards = "x.signum() != 0") static Object narrowBigInteger(Node inliningTarget, BigInteger x, @Cached InlinedConditionProfile fitsIntProfile, - @Cached InlinedConditionProfile fitsLongProfile, - @Cached(inline = false) PythonObjectFactory factory) { + @Cached InlinedConditionProfile fitsLongProfile) { if (fitsIntProfile.profile(inliningTarget, PInt.fitsIn(x, PInt.MIN_INT, PInt.MAX_INT))) { return PInt.intValue(x); } if (fitsLongProfile.profile(inliningTarget, PInt.fitsIn(x, PInt.MIN_LONG, PInt.MAX_LONG))) { return PInt.longValue(x); } - return factory.createInt(x); + return PFactory.createInt(PythonLanguage.get(inliningTarget), x); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/AsyncHandler.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/AsyncHandler.java index f506e70c11..026324c85e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/AsyncHandler.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/AsyncHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,6 +46,7 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; +import java.util.Objects; import java.util.Queue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedDeque; @@ -54,14 +55,12 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import org.graalvm.nativeimage.ImageInfo; - import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.function.PArguments; import com.oracle.graal.python.builtins.objects.function.Signature; import com.oracle.graal.python.nodes.PRootNode; import com.oracle.graal.python.nodes.call.CallNode; -import com.oracle.graal.python.nodes.call.GenericInvokeNode; +import com.oracle.graal.python.nodes.call.CallDispatchers; import com.oracle.graal.python.nodes.frame.ReadCallerFrameNode; import com.oracle.graal.python.runtime.ExecutionContext.CalleeContext; import com.oracle.graal.python.runtime.exception.ExceptionUtils; @@ -156,7 +155,7 @@ public final void execute(PythonContext context) { } debugger.disableStepping(); try { - GenericInvokeNode.getUncached().execute(context.getAsyncHandler().callTarget, args); + CallDispatchers.SimpleIndirectInvokeNode.executeUncached(context.getAsyncHandler().callTarget, args); } catch (PException e) { handleException(e); } finally { @@ -316,10 +315,11 @@ public boolean setsUpCalleeContext() { * regular intervals to run on a separate thread, or if it will be polled. The caller needs to * ensure that the AsyncAction passed into this method does not block in the latter case. */ - @SuppressFBWarnings(value = "NP_NULL_ON_SOME_PATH") // context.get() is never null here + @SuppressFBWarnings(value = "NP_NULL_ON_SOME_PATH") // incorrect warning void registerAction(Supplier actionSupplier) { CompilerAsserts.neverPartOfCompilation(); - if (ImageInfo.inImageBuildtimeCode() || context.get().getOption(PythonOptions.NoAsyncActions)) { + var context = Objects.requireNonNull(this.context.get()); + if (context.getEnv().isPreInitialization() || context.getOption(PythonOptions.NoAsyncActions)) { return; } if (PythonOptions.AUTOMATIC_ASYNC_ACTIONS) { @@ -363,7 +363,7 @@ public void run() { * Some other thread will run and eventually get another gil release * request. */ - ctx.getEnv().submitThreadLocal(new Thread[]{gilOwner}, new ThreadLocalAction(false, false) { + ctx.getEnv().submitThreadLocal(new Thread[]{gilOwner}, new ThreadLocalAction(true, false) { @Override protected void perform(ThreadLocalAction.Access access) { // it may happen that we request a GIL release and no thread is diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/EmulatedPosixSupport.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/EmulatedPosixSupport.java index 38a1c91f6c..d8d92c94d5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/EmulatedPosixSupport.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/EmulatedPosixSupport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,11 +40,11 @@ */ package com.oracle.graal.python.runtime; -import static com.oracle.graal.python.builtins.PythonOS.PLATFORM_WIN32; import static com.oracle.graal.python.builtins.PythonOS.PLATFORM_LINUX; +import static com.oracle.graal.python.builtins.PythonOS.PLATFORM_WIN32; import static com.oracle.graal.python.builtins.PythonOS.getPythonOS; +import static com.oracle.graal.python.builtins.modules.SignalModuleBuiltins.signalFromName; import static com.oracle.graal.python.builtins.objects.thread.PThread.getThreadId; -import static com.oracle.graal.python.nodes.BuiltinNames.T__SIGNAL; import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING; import static com.oracle.graal.python.nodes.StringLiterals.T_JAVA; import static com.oracle.graal.python.runtime.PosixConstants.AF_INET; @@ -125,12 +125,10 @@ import static com.oracle.graal.python.runtime.PosixConstants.S_IFREG; import static com.oracle.graal.python.runtime.PosixConstants.S_IFSOCK; import static com.oracle.graal.python.runtime.PosixConstants.TCP_NODELAY; -import static com.oracle.graal.python.runtime.PosixConstants.WNOHANG; import static com.oracle.graal.python.runtime.PosixConstants.W_OK; import static com.oracle.graal.python.runtime.PosixConstants.X_OK; import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; -import static com.oracle.graal.python.util.PythonUtils.tsArray; import static com.oracle.graal.python.util.PythonUtils.tsLiteral; import static com.oracle.truffle.api.CompilerAsserts.neverPartOfCompilation; import static com.oracle.truffle.api.CompilerDirectives.shouldNotReachHere; @@ -197,6 +195,7 @@ import java.nio.file.attribute.PosixFilePermission; import java.nio.file.attribute.PosixFilePermissions; import java.nio.file.attribute.UserPrincipal; +import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -217,13 +216,10 @@ import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonOS; +import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins; import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum; import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum.ErrorAndMessagePair; import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum.OperationWouldBlockException; -import com.oracle.graal.python.builtins.objects.module.PythonModule; -import com.oracle.graal.python.nodes.ErrorMessages; -import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; -import com.oracle.graal.python.nodes.object.IsNode; import com.oracle.graal.python.runtime.PosixSupportLibrary.AcceptResult; import com.oracle.graal.python.runtime.PosixSupportLibrary.AddrInfoCursor; import com.oracle.graal.python.runtime.PosixSupportLibrary.AddrInfoCursorLibrary; @@ -249,13 +245,13 @@ import com.oracle.graal.python.util.IPAddressUtil; import com.oracle.graal.python.util.OverflowException; import com.oracle.graal.python.util.PythonUtils; -import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.TruffleFile; import com.oracle.truffle.api.TruffleFile.Attributes; import com.oracle.truffle.api.TruffleLanguage; import com.oracle.truffle.api.TruffleLanguage.Env; import com.oracle.truffle.api.TruffleLogger; +import com.oracle.truffle.api.TruffleOptions; import com.oracle.truffle.api.TruffleSafepoint; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.Cached; @@ -357,11 +353,17 @@ public EmulatedPosixSupport(PythonContext context) { withoutIOSocket = !context.getContext().getEnv().isSocketIOAllowed(); } + @TruffleBoundary + static UnsupportedPosixFeatureException createUnsupportedFeature(String message) { + // TODO should have a link to some doc that tells you what to do about it + return new UnsupportedPosixFeatureException("Feature not supported on 'java' POSIX backend: " + message); + } + @Override public void setEnv(Env env) { super.setEnv(env); - if (!ImageInfo.inImageBuildtimeCode()) { - environ.putAll(System.getenv()); + if (!env.isPreInitialization()) { + environ.putAll(env.getEnvironment()); } } @@ -728,7 +730,6 @@ private SelectableChannel[] getSelectableChannels(int[] fds) throws PosixExcepti public long lseek(int fd, long offset, int how, @Bind("$node") Node inliningTarget, @Exclusive @Cached InlinedBranchProfile errorBranch, - @Exclusive @Cached InlinedConditionProfile notSupported, @Exclusive @Cached InlinedConditionProfile noFile, @Exclusive @Cached InlinedConditionProfile notSeekable, @Shared("eq") @Cached TruffleString.EqualNode eqNode) throws PosixException { @@ -739,6 +740,12 @@ public long lseek(int fd, long offset, int how, if (notSeekable.profile(inliningTarget, !(channel instanceof SeekableByteChannel))) { throw posixException(OSErrorEnum.ESPIPE); } + if (SEEK_DATA.defined && how == SEEK_DATA.getValueIfDefined()) { + throw createUnsupportedFeature("SEEK_DATA"); + } + if (SEEK_HOLE.defined && how == SEEK_HOLE.getValueIfDefined()) { + throw createUnsupportedFeature("SEEK_HOLE"); + } SeekableByteChannel fc = (SeekableByteChannel) channel; long newPos; try { @@ -747,15 +754,6 @@ public long lseek(int fd, long offset, int how, errorBranch.enter(inliningTarget); throw posixException(OSErrorEnum.fromException(e, eqNode)); } - if (notSupported.profile(inliningTarget, newPos < 0)) { - if (newPos == -2) { - throw new UnsupportedPosixFeatureException("SEEK_HOLE and SEEK_DATA are not supported"); - } else { - throw new UnsupportedPosixFeatureException("emulated lseek cannot seek beyond the file size. " + - "Please enable native posix support using " + - "the following option '--python.PosixModuleBackend=native'"); - } - } return newPos; } @@ -774,15 +772,11 @@ private static long setPosition(long pos, int how, SeekableByteChannel fc) throw newPos = pos + fc.size(); } else if (how == SEEK_SET.value) { newPos = pos; - } else if ((SEEK_DATA.defined && how == SEEK_DATA.getValueIfDefined()) || - (SEEK_HOLE.defined && how == SEEK_HOLE.getValueIfDefined())) { - return -2; } else { throw new IllegalArgumentException(); } fc.position(newPos); - long p = fc.position(); - return p != newPos ? -1 : p; + return fc.position(); } @ExportMessage(name = "ftruncate") @@ -1003,6 +997,36 @@ public int[] getTerminalSize(int fd) throws PosixException { return new int[]{context.getOption(PythonOptions.TerminalWidth), context.getOption(PythonOptions.TerminalHeight)}; } + @ExportMessage + @TruffleBoundary + public long sysconf(int name) throws PosixException { + // Constants derived from POSIX specs or common kernel configs + if (name == PosixConstants._SC_ARG_MAX.value) { + return 4096; + } else if (name == PosixConstants._SC_CHILD_MAX.value) { + return 25; + } else if (name == PosixConstants._SC_LOGIN_NAME_MAX.value) { + return 255; + } else if (name == PosixConstants._SC_CLK_TCK.value) { + return 100; + } else if (name == PosixConstants._SC_OPEN_MAX.value) { + return 20; + } else if (name == PosixConstants._SC_PAGESIZE.value) { + return 4096; + } else if (name == PosixConstants._SC_PAGE_SIZE.value) { + return 4096; + } else if (name == PosixConstants._SC_SEM_NSEMS_MAX.value) { + return 32; + } else if (name == PosixConstants._SC_PHYS_PAGES.value) { + return Runtime.getRuntime().totalMemory() / 4096; + } else if (name == PosixConstants._SC_NPROCESSORS_CONF.value) { + return Runtime.getRuntime().availableProcessors(); + } else if (name == PosixConstants._SC_NPROCESSORS_ONLN.value) { + return Runtime.getRuntime().availableProcessors(); + } + throw posixException(OSErrorEnum.EINVAL); + } + @ExportMessage public long[] fstatat(int dirFd, Object path, boolean followSymlinks, @Bind("$node") Node inliningTarget, @@ -1054,13 +1078,13 @@ public long[] fstat(int fd, @ExportMessage @SuppressWarnings("static-method") public long[] statvfs(Object path) { - throw new UnsupportedPosixFeatureException("Emulated statvfs not supported"); + throw createUnsupportedFeature("statvfs"); } @ExportMessage @SuppressWarnings("static-method") public long[] fstatvfs(int fd) { - throw new UnsupportedPosixFeatureException("Emulated fstatvfs not supported"); + throw createUnsupportedFeature("fstatvfs"); } private static long[] fstatWithoutPath(Channel fileChannel) { @@ -1296,7 +1320,7 @@ private static int posixPermissionsToMode(int inputMode, final Set { return new UnixSystem().getGroups(); } - default -> throw new UnsupportedPosixFeatureException("emulated getgroups is not available on this platform"); + default -> throw createUnsupportedFeature("getgroups on this platform"); } } throw new UnsupportedPosixFeatureException("getgroups was excluded"); @@ -2136,7 +2140,7 @@ public RusageResult getrusage(int who) throws PosixException { double ru_stime = 0; // time in system mode (float) long ru_maxrss; - if (!ImageInfo.inImageCode()) { + if (!TruffleOptions.AOT) { // once GR-44559 is fixed we can enable this branch on NI java.lang.management.ThreadMXBean threadMXBean = java.lang.management.ManagementFactory.getThreadMXBean(); if (PosixConstants.RUSAGE_THREAD.defined && @@ -2195,7 +2199,7 @@ public RusageResult getrusage(int who) throws PosixException { @ExportMessage @SuppressWarnings("static-method") public OpenPtyResult openpty() { - throw new UnsupportedPosixFeatureException("Emulated openpty not supported"); + throw createUnsupportedFeature("openpty"); } @ExportMessage @@ -2250,7 +2254,7 @@ public int forkExec(Object[] executables, Object[] args, Object cwd, Object[] en if (strings.length == 2) { envMap.put(strings[0], strings[1]); } else { - throw new UnsupportedPosixFeatureException("Only key=value environment variables are supported"); + throw createUnsupportedFeature("Only key=value environment variables are supported in fork_exec"); } } } @@ -2370,11 +2374,7 @@ private void handleIOError(int errpipe_write, IOException e) { // errno:description". The exception can be null if we did not find any file in the // execList that could be executed Channel err = getFileChannel(errpipe_write); - if (!(err instanceof WritableByteChannel)) { - // TODO if we are pretending to be the child, then we should probably ignore errors like - // we do below - throw new UnsupportedPosixFeatureException(ErrorMessages.ERROR_WRITING_FORKEXEC.toJavaStringUncached()); - } else { + if (err instanceof WritableByteChannel errChannel) { ErrorAndMessagePair pair; if (e == null) { pair = new ErrorAndMessagePair(OSErrorEnum.ENOENT, OSErrorEnum.ENOENT.getMessage()); @@ -2382,8 +2382,9 @@ private void handleIOError(int errpipe_write, IOException e) { pair = OSErrorEnum.fromException(e, TruffleString.EqualNode.getUncached()); } try { - ((WritableByteChannel) err).write(ByteBuffer.wrap(("OSError:" + Long.toHexString(pair.oserror.getNumber()) + ":" + pair.message).getBytes())); + errChannel.write(ByteBuffer.wrap(("OSError:" + Long.toHexString(pair.oserror.getNumber()) + ":" + pair.message).getBytes())); } catch (IOException e1) { + // ignored } } } @@ -2621,8 +2622,7 @@ final MMapHandle mmap(long length, int prot, int flags, int fd, long offset, try { return new MMapHandle(new AnonymousMap(PythonUtils.toIntExact(length)), 0); } catch (OverflowException e) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - throw new UnsupportedPosixFeatureException(String.format("Anonymous mapping in mmap for memory larger than %d", Integer.MAX_VALUE)); + throw createUnsupportedFeature(PythonUtils.formatJString("Anonymous mapping in mmap for memory larger than %d", Integer.MAX_VALUE)); } } @@ -2651,7 +2651,7 @@ private static Set mmapProtToOptions(int prot) { options.add(StandardOpenOption.WRITE); } if ((prot & PROT_EXEC.value) != 0) { - throw new UnsupportedPosixFeatureException("mmap: flag PROT_EXEC is not supported"); + throw createUnsupportedFeature("mmap flag PROT_EXEC"); } return options; } @@ -2786,7 +2786,7 @@ public void mmapUnmap(Object mmap, @SuppressWarnings("unused") long length, @ExportMessage @SuppressWarnings("static-method") public long mmapGetPointer(@SuppressWarnings("unused") Object mmap) { - throw new UnsupportedPosixFeatureException("Unable to obtain mmap pointer in emulated posix backend"); + throw createUnsupportedFeature("obtaining mmap pointer"); } @TruffleBoundary @@ -2824,7 +2824,7 @@ private static int readChannel(Object readableChannel, ByteBuffer dst) throws IO @ExportMessage @SuppressWarnings({"unused", "static-method"}) public TruffleString crypt(TruffleString word, TruffleString salt) throws PosixException { - throw new UnsupportedPosixFeatureException("crypt not supported"); + throw createUnsupportedFeature("crypt"); } @ExportMessage @@ -2885,12 +2885,12 @@ public PwdResult getpwuid(long uid) throws PosixException { case PLATFORM_DARWIN: UnixSystem unix = new UnixSystem(); if (unix.getUid() != uid) { - throw new UnsupportedPosixFeatureException("getpwuid with other uid than the current user"); + throw createUnsupportedFeature("getpwuid with other uid than the current user"); } compatibilityInfo("gtpwuid: default shell cannot be retrieved for %d, using '/bin/sh' instead.", uid); return createPwdResult(unix); default: - throw new UnsupportedPosixFeatureException("emulated getpwuid is not available on this platform"); + throw createUnsupportedFeature("getpwuid on this platform"); } } throw new UnsupportedPosixFeatureException("getpwuid was excluded"); @@ -2906,12 +2906,12 @@ public PwdResult getpwnam(Object name) { case PLATFORM_DARWIN: UnixSystem unix = new UnixSystem(); if (!unix.getUsername().equals(name)) { - throw new UnsupportedPosixFeatureException("getpwnam with other uid than the current user"); + throw createUnsupportedFeature("getpwnam with other uid than the current user"); } compatibilityInfo("gtpwuid: default shell cannot be retrieved for %s, using '/bin/sh' instead.", name); return createPwdResult(unix); default: - throw new UnsupportedPosixFeatureException("emulated getpwnam is not available on this platform"); + throw createUnsupportedFeature("getpwnam on this platform"); } } throw new UnsupportedPosixFeatureException("getpwnam was excluded"); @@ -2926,7 +2926,7 @@ public boolean hasGetpwentries() { @ExportMessage @SuppressWarnings("static-method") public PwdResult[] getpwentries() { - throw new UnsupportedPosixFeatureException("getpwent"); + throw createUnsupportedFeature("getpwent"); } private static PwdResult createPwdResult(UnixSystem unix) { @@ -2937,13 +2937,13 @@ private static PwdResult createPwdResult(UnixSystem unix) { @ExportMessage @SuppressWarnings("unused") public int ioctlBytes(int fd, long request, byte[] arg) { - throw new UnsupportedPosixFeatureException("ioctl is not available in Java posix backend"); + throw createUnsupportedFeature("ioctl"); } @ExportMessage @SuppressWarnings("unused") public int ioctlInt(int fd, long request, int arg) { - throw new UnsupportedPosixFeatureException("ioctl is not available in Java posix backend"); + throw createUnsupportedFeature("ioctl"); } @ExportMessage @@ -3626,7 +3626,7 @@ UniversalSockAddr createUniversalSockAddrInet6(Inet6SockAddr src) { @ExportMessage UniversalSockAddr createUniversalSockAddrUnix(UnixSockAddr src) { - throw new UnsupportedPosixFeatureException("AF_UNIX cannot be emulated"); + throw createUnsupportedFeature("AF_UNIX"); } @ExportLibrary(UniversalSockAddrLibrary.class) diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/ExecutionContext.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/ExecutionContext.java index 2dee13fd81..73b5e047d3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/ExecutionContext.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/ExecutionContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -52,6 +52,7 @@ import com.oracle.graal.python.nodes.frame.ReadCallerFrameNode; import com.oracle.graal.python.nodes.frame.ReadCallerFrameNode.FrameSelector; import com.oracle.graal.python.nodes.util.ExceptionStateNodes.GetCaughtExceptionNode; +import com.oracle.graal.python.runtime.ExecutionContextFactory.CallContextNodeGen; import com.oracle.graal.python.runtime.PythonContext.PythonThreadState; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.truffle.api.CompilerAsserts; @@ -59,147 +60,217 @@ import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.ValueType; import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; +import com.oracle.truffle.api.bytecode.ContinuationRootNode; import com.oracle.truffle.api.RootCallTarget; +import com.oracle.truffle.api.dsl.Bind; +import com.oracle.truffle.api.dsl.Cached; +import com.oracle.truffle.api.dsl.GenerateCached; +import com.oracle.truffle.api.dsl.GenerateInline; +import com.oracle.truffle.api.dsl.GenerateUncached; +import com.oracle.truffle.api.dsl.ImportStatic; import com.oracle.truffle.api.dsl.NeverDefault; +import com.oracle.truffle.api.dsl.ReportPolymorphism; +import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.exception.AbstractTruffleException; import com.oracle.truffle.api.frame.Frame; import com.oracle.truffle.api.frame.FrameInstance; +import com.oracle.truffle.api.frame.MaterializedFrame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.profiles.ConditionProfile; +import com.oracle.truffle.api.nodes.RootNode; +import com.oracle.truffle.api.profiles.InlinedConditionProfile; +import com.oracle.truffle.api.profiles.InlinedCountingConditionProfile; /** * An ExecutionContext ensures proper entry and exit for Python calls on both sides of the call, and * depending on whether the other side is also a Python frame. */ public abstract class ExecutionContext { - - public static final class CallContext extends Node { - @CompilationFinal boolean neededCallerFrame; - @CompilationFinal boolean neededExceptionState; - private static final CallContext INSTANCE = new CallContext(false); - - @Child private MaterializeFrameNode materializeNode; - - private final boolean adoptable; - - @CompilationFinal private ConditionProfile isPythonFrameProfile; - - private CallContext(boolean adoptable) { - this.adoptable = adoptable; - this.neededExceptionState = !adoptable; - this.neededCallerFrame = !adoptable; + @GenerateUncached + public abstract static class CallContext extends Node { + public static CallContext create() { + return CallContextNodeGen.create(); } /** * Prepare an indirect call from a Python frame to a Python function. */ public void prepareIndirectCall(VirtualFrame frame, Object[] callArguments, Node callNode) { - prepareCall(frame, callArguments, callNode, true, true); + executePrepareCall(frame, getActualCallArguments(callArguments), callNode, true, true); + } + + private static Object[] getActualCallArguments(Object[] callArguments) { + /** + * Bytecode DSL note: When resuming a generator/coroutine, the call target is a + * ContinuationRoot with a different calling convention from regular PRootNodes. The + * first argument is a materialized frame containing the arguments used for argument + * reads. + */ + if (callArguments.length == 2 && callArguments[0] instanceof MaterializedFrame materialized) { + return materialized.getArguments(); + } + return callArguments; } /** * Prepare a call from a Python frame to a Python function. */ public void prepareCall(VirtualFrame frame, Object[] callArguments, RootCallTarget callTarget, Node callNode) { - // n.b.: The class cast should always be correct, since this context - // must only be used when calling from Python to Python - PRootNode calleeRootNode = (PRootNode) callTarget.getRootNode(); - prepareCall(frame, callArguments, callNode, calleeRootNode.needsCallerFrame(), calleeRootNode.needsExceptionState()); + RootNode rootNode = callTarget.getRootNode(); + + PRootNode calleeRootNode; + Object[] actualCallArguments; + boolean needsExceptionState; + if (rootNode instanceof ContinuationRootNode continuationRoot) { + calleeRootNode = (PRootNode) continuationRoot.getSourceRootNode(); + assert callArguments.length == 2; + actualCallArguments = ((MaterializedFrame) callArguments[0]).getArguments(); + // Local exception state takes precedence over any exception in the caller's context + needsExceptionState = calleeRootNode.needsExceptionState() && !PArguments.hasException(actualCallArguments); + } else { + // n.b.: The class cast should always be correct, since this context + // must only be used when calling from Python to Python + calleeRootNode = (PRootNode) rootNode; + actualCallArguments = callArguments; + needsExceptionState = calleeRootNode.needsExceptionState(); + } + executePrepareCall(frame, actualCallArguments, callNode, calleeRootNode.needsCallerFrame(), needsExceptionState); } - private void prepareCall(VirtualFrame frame, Object[] callArguments, Node callNode, boolean needsCallerFrame, boolean needsExceptionState) { - // equivalent to PyPy's ExecutionContext.enter `frame.f_backref = - // self.topframeref` we here pass the current top frame reference to - // the next frame. An optimization we do is to only pass the frame - // info if the caller requested it, otherwise they'll have to deopt - // and walk the stack up once. + protected abstract void executePrepareCall(VirtualFrame frame, Object[] callArguments, Node callNode, boolean needsCallerFrame, boolean needsExceptionState); - if (needsCallerFrame) { - if (!neededCallerFrame) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - neededCallerFrame = true; - } - PFrame.Reference thisInfo; - - if (isPythonFrame(frame, callNode)) { - thisInfo = PArguments.getCurrentFrameInfo(frame); - - // We are handing the PFrame of the current frame to the caller, i.e., it does - // not 'escape' since it is still on the stack.Also, force synchronization of - // values - PFrame pyFrame = materialize(frame, callNode, false, true); - assert thisInfo.getPyFrame() == pyFrame; - assert pyFrame.getRef() == thisInfo; - } else { - thisInfo = PFrame.Reference.EMPTY; - } + /** + * Equivalent to PyPy's ExecutionContext.enter `frame.f_backref = self.topframeref` we here + * pass the current top frame reference to the next frame. An optimization we do is to only + * pass the frame info if the caller requested it, otherwise they'll have to deopt and walk + * the stack up once. + */ + @GenerateCached(false) + @GenerateUncached + @GenerateInline + @ImportStatic(PArguments.class) + protected abstract static class PassCallerFrameNode extends Node { + protected abstract void execute(VirtualFrame frame, Node inliningTarget, Object[] callArguments, Node callNode, boolean needsCallerFrame); + + @Specialization(guards = "!needsCallerFrame") + protected static void dontPassCallerFrame(VirtualFrame frame, Node inliningTarget, Object[] callArguments, Node callNode, boolean needsCallerFrame) { + } + @Specialization(guards = {"needsCallerFrame", "isPythonFrame(frame)"}) + protected static void passCallerFrame(VirtualFrame frame, Node inliningTarget, Object[] callArguments, Node callNode, boolean needsCallerFrame, + @Cached(inline = false) MaterializeFrameNode materialize) { + PFrame.Reference thisInfo = PArguments.getCurrentFrameInfo(frame); + // We are handing the PFrame of the current frame to the caller, i.e., it does + // not 'escape' since it is still on the stack.Also, force synchronization of + // values + PFrame pyFrame = materialize.execute(frame, callNode, false, true); + assert thisInfo.getPyFrame() == pyFrame; + assert pyFrame.getRef() == thisInfo; thisInfo.setCallNode(callNode); PArguments.setCallerFrameInfo(callArguments, thisInfo); } - if (needsExceptionState) { - if (!neededExceptionState) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - neededExceptionState = true; - } - AbstractTruffleException curExc; - if (isPythonFrame(frame, callNode)) { - curExc = PArguments.getException(frame); - if (curExc == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - AbstractTruffleException fromStackWalk = GetCaughtExceptionNode.fullStackWalk(); - curExc = fromStackWalk != null ? fromStackWalk : PException.NO_EXCEPTION; - // now, set in our args, such that we won't do this again - PArguments.setException(frame, curExc); - } - } else { - // If we're here, it can only be because some top-level call - // inside Python led us here - curExc = PException.NO_EXCEPTION; - } - PArguments.setException(callArguments, curExc); - } - } - private PFrame materialize(VirtualFrame frame, Node callNode, boolean markAsEscaped, boolean forceSync) { - if (adoptable) { - return ensureMaterializeNode().execute(frame, callNode, markAsEscaped, forceSync); + @Specialization(guards = {"needsCallerFrame", "!isPythonFrame(frame)"}) + protected static void passEmptyCallerFrame(VirtualFrame frame, Node inliningTarget, Object[] callArguments, Node callNode, boolean needsCallerFrame) { + PArguments.setCallerFrameInfo(callArguments, PFrame.Reference.EMPTY); } - return MaterializeFrameNode.getUncached().execute(frame, callNode, markAsEscaped, forceSync); } - private boolean isPythonFrame(VirtualFrame frame, Node callNode) { - if (isPythonFrameProfile == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - isPythonFrameProfile = ConditionProfile.create(); + @GenerateCached(false) + @GenerateUncached + @GenerateInline + @ImportStatic(PArguments.class) + protected abstract static class PassExceptionStateNode extends Node { + + /* + * This may seem a bit odd on first sight, but it's straightforward with a bit of + * explanation: + * + * 1. Most callees won't need exception state, so that is the first specialization. We + * pass the NO_EXCEPTION marker if we have it though. + * + * 2. If we call a callee that needs exception state, the first time around we likely do + * not have it, so we do a stack walk. If this is a top level function e.g. always + * called from a new Python lambda or something like that in an embedding, we will get + * stuck in this specialization, but that's the best we can do and it's straight line + * code with a boundary call. + * + * 3. If we come around again in normal Python code, we'll likely have exception state + * now because the caller passed it. If this caller is the only one that needs to pass + * exception state (maybe all other callers do not trigger code paths that need it) we + * will never have to walk the stack again. So we *replace* the specialization that does + * the stack walk with one that never does so there are just guards and no full branches + * in the compiled code. + * + * 4. If we get into the situation again that we need to pass exception state, but do + * not have it, this means we got invoked from another call site that did not pass the + * exception state. We resist the tempation to be fancy here. We'll switch to putting + * the stack walk in the compiled code with a profile to inject how probable the stack + * walk is. We'll just have to hope the compiler does something decent with it. We also + * report this as an expensive specialization using the @Megamorphic annotation, so + * Truffle might be more inclined to split. + * + * 5. The last and least likely scenario is that this is directly a call from an + * embedding, e.g. via the #execute interop message. We trivially won't have an active + * exception in this case. + */ + protected abstract void execute(VirtualFrame frame, Node inliningTarget, Object[] callArguments, boolean needsExceptionState); + + @Specialization(guards = {"!needsExceptionState"}) + protected static void dontPassExceptionState(VirtualFrame frame, Node inliningTarget, Object[] callArguments, boolean needsExceptionState, + @Cached InlinedConditionProfile hasNoException) { + AbstractTruffleException curExc = PArguments.getException(frame); + if (hasNoException.profile(inliningTarget, curExc == PException.NO_EXCEPTION)) { + PArguments.setException(callArguments, curExc); + } } - boolean result = isPythonFrameProfile.profile(PArguments.isPythonFrame(frame)); - assert result || callNode.getRootNode() instanceof TopLevelExceptionHandler : "calling from non-Python or non-top-level frame"; - return result; - } - private MaterializeFrameNode ensureMaterializeNode() { - if (materializeNode == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - materializeNode = insert(MaterializeFrameNodeGen.create()); + @Specialization(guards = {"needsExceptionState", "isPythonFrame(frame)", "getException(frame) == null"}) + protected static void passExceptionStateFromStackWalk(VirtualFrame frame, Node inliningTarget, Object[] callArguments, boolean needsExceptionState) { + AbstractTruffleException fromStackWalk = GetCaughtExceptionNode.fullStackWalk(); + if (fromStackWalk == null) { + fromStackWalk = PException.NO_EXCEPTION; + } + // set it also in our args, such that we won't stack walk again in later calls that + // start with this frame + PArguments.setException(frame, fromStackWalk); + PArguments.setException(callArguments, fromStackWalk); } - return materializeNode; - } + @Specialization(guards = {"needsExceptionState", "isPythonFrame(frame)", "curExc != null"}, replaces = "passExceptionStateFromStackWalk") + protected static void passGivenExceptionState(VirtualFrame frame, Node inliningTarget, Object[] callArguments, boolean needsExceptionState, + @Bind("getException(frame)") AbstractTruffleException curExc) { + PArguments.setException(callArguments, curExc); + } - @Override - public boolean isAdoptable() { - return adoptable; - } + @ReportPolymorphism.Megamorphic + @Specialization(guards = {"needsExceptionState", "isPythonFrame(frame)"}, replaces = "passGivenExceptionState") + protected static void passExceptionStateFromFrameOrStack(VirtualFrame frame, Node inliningTarget, Object[] callArguments, boolean needsExceptionState, + @Cached InlinedCountingConditionProfile needsStackWalk) { + AbstractTruffleException curExc = PArguments.getException(frame); + if (needsStackWalk.profile(inliningTarget, curExc == null)) { + passExceptionStateFromStackWalk(frame, inliningTarget, callArguments, needsExceptionState); + } else { + passGivenExceptionState(frame, inliningTarget, callArguments, needsExceptionState, curExc); + } + } - @NeverDefault - public static CallContext create() { - return new CallContext(true); + @Specialization(guards = {"needsExceptionState", "!isPythonFrame(frame)"}) + protected static void passNoExceptionState(VirtualFrame frame, Node inliningTarget, Object[] callArguments, boolean needsExceptionState) { + // If we're here, it can only be because some top-level call + // inside Python led us here + PArguments.setException(callArguments, PException.NO_EXCEPTION); + } } - public static CallContext getUncached() { - return INSTANCE; + @Specialization + protected static void prepareCall(VirtualFrame frame, Object[] callArguments, Node callNode, boolean needsCallerFrame, boolean needsExceptionState, + @Bind Node inliningTarget, + @Cached PassCallerFrameNode passCallerFrame, + @Cached PassExceptionStateNode passExceptionState) { + assert PArguments.isPythonFrame(frame) || callNode.getRootNode() instanceof TopLevelExceptionHandler : "calling from non-Python or non-top-level frame"; + passCallerFrame.execute(frame, inliningTarget, callArguments, callNode, needsCallerFrame); + passExceptionState.execute(frame, inliningTarget, callArguments, needsExceptionState); } } @@ -226,6 +297,10 @@ public void enter(VirtualFrame frame) { } public void exit(VirtualFrame frame, PRootNode node) { + exit(frame, node, node); + } + + public void exit(VirtualFrame frame, PRootNode node, Node location) { /* * equivalent to PyPy's ExecutionContext.leave. Note that got_exception in * their code is handled automatically by the Truffle lazy exceptions, so here we only @@ -234,12 +309,12 @@ public void exit(VirtualFrame frame, PRootNode node) { PFrame.Reference info = PArguments.getCurrentFrameInfo(frame); CompilerAsserts.partialEvaluationConstant(node); if (node.getFrameEscapedProfile().profile(info.isEscaped())) { - exitEscaped(frame, node, info); + exitEscaped(frame, node, location, info); } } @InliningCutoff - private void exitEscaped(VirtualFrame frame, PRootNode node, Reference info) { + private void exitEscaped(VirtualFrame frame, PRootNode node, Node location, Reference info) { if (!everEscaped) { CompilerDirectives.transferToInterpreterAndInvalidate(); everEscaped = true; @@ -267,7 +342,7 @@ private void exitEscaped(VirtualFrame frame, PRootNode node, Reference info) { } // force the frame so that it can be accessed later - ensureMaterializeNode().execute(frame, node, false, true); + ensureMaterializeNode().execute(frame, location, false, true); // if this frame escaped we must ensure that also f_back does callerInfo.markAsEscaped(); info.setBackref(callerInfo); @@ -361,7 +436,8 @@ public static Object enter(VirtualFrame frame, IndirectCallData indirectCallData } Node indirectCallNode = indirectCallData.getNode(); - PythonThreadState pythonThreadState = PythonContext.get(indirectCallNode).getThreadState(PythonLanguage.get(indirectCallNode)); + PythonContext context = PythonContext.get(indirectCallNode); + PythonThreadState pythonThreadState = context.getThreadState(context.getLanguage(indirectCallNode)); return enter(frame, pythonThreadState, needsCallerFrame, needsExceptionState, indirectCallNode); } @@ -418,7 +494,7 @@ public static void exit(VirtualFrame frame, IndirectCallData indirectCallData, O Node indirectCallNode = indirectCallData.getNode(); PythonContext context = PythonContext.get(indirectCallNode); if (context != null) { - PythonLanguage language = PythonLanguage.get(indirectCallNode); + PythonLanguage language = context.getLanguage(indirectCallNode); exit(frame, context.getThreadState(language), savedState); return; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/ImageBuildtimePosixSupport.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/ImageBuildtimePosixSupport.java deleted file mode 100644 index 078a154f4f..0000000000 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/ImageBuildtimePosixSupport.java +++ /dev/null @@ -1,1154 +0,0 @@ -/* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * The Universal Permissive License (UPL), Version 1.0 - * - * Subject to the condition set forth below, permission is hereby granted to any - * person obtaining a copy of this software, associated documentation and/or - * data (collectively the "Software"), free of charge and under any and all - * copyright rights in the Software, and any and all patent rights owned or - * freely licensable by each licensor hereunder covering either (i) the - * unmodified Software as contributed to or provided by such licensor, or (ii) - * the Larger Works (as defined below), to deal in both - * - * (a) the Software, and - * - * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if - * one is included with the Software each a "Larger Work" to which the Software - * is contributed by such licensors), - * - * without restriction, including without limitation the rights to copy, create - * derivative works of, display, perform, and distribute the Software and make, - * use, sell, offer for sale, import, export, have made, and have sold the - * Software and the Larger Work(s), and to sublicense the foregoing rights on - * either these or other terms. - * - * This license is subject to the following condition: - * - * The above copyright notice and either this complete permission notice or at a - * minimum a reference to the UPL must be included in all copies or substantial - * portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package com.oracle.graal.python.runtime; - -import static com.oracle.truffle.api.CompilerDirectives.shouldNotReachHere; - -import java.util.HashSet; -import java.util.IdentityHashMap; - -import org.graalvm.nativeimage.ImageInfo; - -import com.oracle.graal.python.runtime.PosixSupportLibrary.AcceptResult; -import com.oracle.graal.python.runtime.PosixSupportLibrary.AddrInfoCursor; -import com.oracle.graal.python.runtime.PosixSupportLibrary.Buffer; -import com.oracle.graal.python.runtime.PosixSupportLibrary.GetAddrInfoException; -import com.oracle.graal.python.runtime.PosixSupportLibrary.Inet4SockAddr; -import com.oracle.graal.python.runtime.PosixSupportLibrary.Inet6SockAddr; -import com.oracle.graal.python.runtime.PosixSupportLibrary.InvalidAddressException; -import com.oracle.graal.python.runtime.PosixSupportLibrary.InvalidUnixSocketPathException; -import com.oracle.graal.python.runtime.PosixSupportLibrary.OpenPtyResult; -import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; -import com.oracle.graal.python.runtime.PosixSupportLibrary.PwdResult; -import com.oracle.graal.python.runtime.PosixSupportLibrary.RecvfromResult; -import com.oracle.graal.python.runtime.PosixSupportLibrary.RusageResult; -import com.oracle.graal.python.runtime.PosixSupportLibrary.SelectResult; -import com.oracle.graal.python.runtime.PosixSupportLibrary.Timeval; -import com.oracle.graal.python.runtime.PosixSupportLibrary.UniversalSockAddr; -import com.oracle.graal.python.runtime.PosixSupportLibrary.UnixSockAddr; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.TruffleLanguage.Env; -import com.oracle.truffle.api.library.CachedLibrary; -import com.oracle.truffle.api.library.ExportLibrary; -import com.oracle.truffle.api.library.ExportMessage; -import com.oracle.truffle.api.strings.TruffleString; - -@ExportLibrary(PosixSupportLibrary.class) -public class ImageBuildtimePosixSupport extends PosixSupport { - - protected final PosixSupport nativePosixSupport; - private PosixSupport emulatedPosixSupport; - private HashSet emulatedFds; - private IdentityHashMap emulatedDirStreams; - - public ImageBuildtimePosixSupport(PosixSupport nativePosixSupport, PosixSupport emulatedPosixSupport) { - this.nativePosixSupport = nativePosixSupport; - this.emulatedPosixSupport = emulatedPosixSupport; - if (emulatedPosixSupport != null) { - emulatedFds = new HashSet<>(); - emulatedDirStreams = new IdentityHashMap<>(); - } - } - - @Override - public void setEnv(Env env) { - assert !ImageInfo.inImageBuildtimeCode(); - nativePosixSupport.setEnv(env); - } - - public void checkLeakingResources() { - assert ImageInfo.inImageBuildtimeCode(); - if (!emulatedFds.isEmpty()) { - throw shouldNotReachHere("Emulated fds leaked into the image"); - } - if (!emulatedDirStreams.isEmpty()) { - throw shouldNotReachHere("Emulated dirStreams leaked into the image"); - } - emulatedPosixSupport = null; - emulatedFds = null; - emulatedDirStreams = null; - } - - private static void checkNotInImageBuildtime() { - if (ImageInfo.inImageBuildtimeCode()) { - throw shouldNotReachHere("Posix call not expected during image buildtime"); - } - } - - @TruffleBoundary - private int addFd(int fd) { - if (emulatedFds.contains(fd)) { - throw shouldNotReachHere("duplicate fd"); - } - emulatedFds.add(fd); - return fd; - } - - @TruffleBoundary - private int removeFd(int fd) { - if (!emulatedFds.contains(fd)) { - throw shouldNotReachHere("Closing fd that has not been open"); - } - emulatedFds.remove(fd); - return fd; - } - - @TruffleBoundary - private Object addDirStream(Object dirStream) { - if (emulatedDirStreams.containsKey(dirStream)) { - throw shouldNotReachHere("Duplicate dirStream"); - } - emulatedDirStreams.put(dirStream, dirStream); - return dirStream; - } - - @TruffleBoundary - private Object removeDirStream(Object dirStream) { - if (!emulatedDirStreams.containsKey(dirStream)) { - throw shouldNotReachHere("Closing dirStream that has not been open"); - } - emulatedDirStreams.remove(dirStream); - return dirStream; - } - - @ExportMessage - final TruffleString getBackend(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.getBackend(nativePosixSupport); - } - - @ExportMessage - final TruffleString strerror(int errorCode, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.strerror(nativePosixSupport, errorCode); - } - - @ExportMessage - final long getpid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.getpid(nativePosixSupport); - } - - @ExportMessage - final int umask(int mask, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.umask(nativePosixSupport, mask); - } - - @ExportMessage - final int openat(int dirFd, Object pathname, int flags, int mode, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - if (ImageInfo.inImageBuildtimeCode()) { - return addFd(PosixSupportLibrary.getUncached().openat(emulatedPosixSupport, dirFd, pathname, flags, mode)); - } - return nativeLib.openat(nativePosixSupport, dirFd, pathname, flags, mode); - } - - @ExportMessage - final int close(int fd, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - if (ImageInfo.inImageBuildtimeCode()) { - return PosixSupportLibrary.getUncached().close(emulatedPosixSupport, removeFd(fd)); - } - return nativeLib.close(nativePosixSupport, fd); - } - - @ExportMessage - final Buffer read(int fd, long length, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - if (ImageInfo.inImageBuildtimeCode()) { - return PosixSupportLibrary.getUncached().read(emulatedPosixSupport, fd, length); - } - return nativeLib.read(nativePosixSupport, fd, length); - } - - @ExportMessage - final long write(int fd, Buffer data, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.write(nativePosixSupport, fd, data); - } - - @ExportMessage - final int dup(int fd, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.dup(nativePosixSupport, fd); - } - - @ExportMessage - final int dup2(int fd, int fd2, boolean inheritable, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.dup2(nativePosixSupport, fd, fd2, inheritable); - } - - @ExportMessage - final boolean getInheritable(int fd, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.getInheritable(nativePosixSupport, fd); - } - - @ExportMessage - final void setInheritable(int fd, boolean inheritable, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - if (ImageInfo.inImageBuildtimeCode()) { - PosixSupportLibrary.getUncached().setInheritable(emulatedPosixSupport, fd, inheritable); - return; - } - nativeLib.setInheritable(nativePosixSupport, fd, inheritable); - } - - @ExportMessage - final int[] pipe(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.pipe(nativePosixSupport); - } - - @ExportMessage - final SelectResult select(int[] readfds, int[] writefds, int[] errorfds, Timeval timeout, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.select(nativePosixSupport, readfds, writefds, errorfds, timeout); - } - - @ExportMessage - final long lseek(int fd, long offset, int how, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - if (ImageInfo.inImageBuildtimeCode()) { - return PosixSupportLibrary.getUncached().lseek(emulatedPosixSupport, fd, offset, how); - } - return nativeLib.lseek(nativePosixSupport, fd, offset, how); - } - - @ExportMessage - final void ftruncate(int fd, long length, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.ftruncate(nativePosixSupport, fd, length); - } - - @ExportMessage - final void truncate(Object path, long length, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.truncate(nativePosixSupport, path, length); - } - - @ExportMessage - final void fsync(int fd, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.fsync(nativePosixSupport, fd); - } - - @ExportMessage - final void flock(int fd, int operation, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.flock(nativePosixSupport, fd, operation); - } - - @ExportMessage - final void fcntlLock(int fd, boolean blocking, int lockType, int whence, long start, long length, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.fcntlLock(nativePosixSupport, fd, blocking, lockType, whence, start, length); - } - - @ExportMessage - final boolean getBlocking(int fd, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.getBlocking(nativePosixSupport, fd); - } - - @ExportMessage - final void setBlocking(int fd, boolean blocking, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.setBlocking(nativePosixSupport, fd, blocking); - } - - @ExportMessage - final int[] getTerminalSize(int fd, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.getTerminalSize(nativePosixSupport, fd); - } - - @ExportMessage - final long[] fstatat(int dirFd, Object pathname, boolean followSymlinks, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - if (ImageInfo.inImageBuildtimeCode()) { - return PosixSupportLibrary.getUncached().fstatat(emulatedPosixSupport, dirFd, pathname, followSymlinks); - } - return nativeLib.fstatat(nativePosixSupport, dirFd, pathname, followSymlinks); - } - - @ExportMessage - final long[] fstat(int fd, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - if (ImageInfo.inImageBuildtimeCode()) { - return PosixSupportLibrary.getUncached().fstat(emulatedPosixSupport, fd); - } - return nativeLib.fstat(nativePosixSupport, fd); - } - - @ExportMessage - final long[] statvfs(Object path, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - if (ImageInfo.inImageBuildtimeCode()) { - return PosixSupportLibrary.getUncached().statvfs(emulatedPosixSupport, path); - } - return nativeLib.statvfs(nativePosixSupport, path); - } - - @ExportMessage - final long[] fstatvfs(int fd, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - if (ImageInfo.inImageBuildtimeCode()) { - return PosixSupportLibrary.getUncached().fstatvfs(emulatedPosixSupport, fd); - } - return nativeLib.fstatvfs(nativePosixSupport, fd); - } - - @ExportMessage - final Object[] uname(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.uname(nativePosixSupport); - } - - @ExportMessage - final void unlinkat(int dirFd, Object pathname, boolean rmdir, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.unlinkat(nativePosixSupport, dirFd, pathname, rmdir); - } - - @ExportMessage - final void linkat(int oldFdDir, Object oldPath, int newFdDir, Object newPath, int flags, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.linkat(nativePosixSupport, oldFdDir, oldPath, newFdDir, newPath, flags); - } - - @ExportMessage - final void symlinkat(Object target, int linkpathDirFd, Object linkpath, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.symlinkat(nativePosixSupport, target, linkpathDirFd, linkpath); - } - - @ExportMessage - final void mkdirat(int dirFd, Object pathname, int mode, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.mkdirat(nativePosixSupport, dirFd, pathname, mode); - } - - @ExportMessage - final Object getcwd(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.getcwd(nativePosixSupport); - } - - @ExportMessage - final void chdir(Object path, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.chdir(nativePosixSupport, path); - } - - @ExportMessage - final void fchdir(int fd, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.fchdir(nativePosixSupport, fd); - } - - @ExportMessage - final boolean isatty(int fd, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.isatty(nativePosixSupport, fd); - } - - @ExportMessage - final Object opendir(Object path, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - if (ImageInfo.inImageBuildtimeCode()) { - return addDirStream(PosixSupportLibrary.getUncached().opendir(emulatedPosixSupport, path)); - } - return nativeLib.opendir(nativePosixSupport, path); - } - - @ExportMessage - final Object fdopendir(int fd, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.fdopendir(nativePosixSupport, fd); - } - - @ExportMessage - final void closedir(Object dirStream, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - if (ImageInfo.inImageBuildtimeCode()) { - PosixSupportLibrary.getUncached().closedir(emulatedPosixSupport, removeDirStream(dirStream)); - return; - } - nativeLib.closedir(nativePosixSupport, dirStream); - } - - @ExportMessage - final Object readdir(Object dirStream, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - if (ImageInfo.inImageBuildtimeCode()) { - return PosixSupportLibrary.getUncached().readdir(emulatedPosixSupport, dirStream); - } - return nativeLib.readdir(nativePosixSupport, dirStream); - } - - @ExportMessage - final void rewinddir(Object dirStream, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - if (ImageInfo.inImageBuildtimeCode()) { - PosixSupportLibrary.getUncached().rewinddir(emulatedPosixSupport, dirStream); - } - nativeLib.rewinddir(nativePosixSupport, dirStream); - } - - @ExportMessage - final Object dirEntryGetName(Object dirEntry, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - if (ImageInfo.inImageBuildtimeCode()) { - return PosixSupportLibrary.getUncached().dirEntryGetName(emulatedPosixSupport, dirEntry); - } - return nativeLib.dirEntryGetName(nativePosixSupport, dirEntry); - } - - @ExportMessage - final Object dirEntryGetPath(Object dirEntry, Object scandirPath, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.dirEntryGetPath(nativePosixSupport, dirEntry, scandirPath); - } - - @ExportMessage - final long dirEntryGetInode(Object dirEntry, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.dirEntryGetInode(nativePosixSupport, dirEntry); - } - - @ExportMessage - final int dirEntryGetType(Object dirEntry, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.dirEntryGetType(nativePosixSupport, dirEntry); - } - - @ExportMessage - final void utimensat(int dirFd, Object pathname, long[] timespec, boolean followSymlinks, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.utimensat(nativePosixSupport, dirFd, pathname, timespec, followSymlinks); - } - - @ExportMessage - final void futimens(int fd, long[] timespec, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.futimens(nativePosixSupport, fd, timespec); - } - - @ExportMessage - final void futimes(int fd, Timeval[] timeval, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.futimes(nativePosixSupport, fd, timeval); - } - - @ExportMessage - final void lutimes(Object filename, Timeval[] timeval, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.lutimes(nativePosixSupport, filename, timeval); - } - - @ExportMessage - final void utimes(Object filename, Timeval[] timeval, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.utimes(nativePosixSupport, filename, timeval); - } - - @ExportMessage - final void renameat(int oldDirFd, Object oldPath, int newDirFd, Object newPath, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.renameat(nativePosixSupport, oldDirFd, oldPath, newDirFd, newPath); - } - - @ExportMessage - final boolean faccessat(int dirFd, Object path, int mode, boolean effectiveIds, boolean followSymlinks, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.faccessat(nativePosixSupport, dirFd, path, mode, effectiveIds, followSymlinks); - } - - @ExportMessage - final void fchmodat(int dirFd, Object path, int mode, boolean followSymlinks, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.fchmodat(nativePosixSupport, dirFd, path, mode, followSymlinks); - } - - @ExportMessage - final void fchmod(int fd, int mode, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.fchmod(nativePosixSupport, fd, mode); - } - - @ExportMessage - final void fchownat(int dirFd, Object path, long owner, long group, boolean followSymlinks, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.fchownat(nativePosixSupport, dirFd, path, owner, group, followSymlinks); - } - - @ExportMessage - final void fchown(int fd, long owner, long group, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.fchown(nativePosixSupport, fd, owner, group); - } - - @ExportMessage - final Object readlinkat(int dirFd, Object path, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.readlinkat(nativePosixSupport, dirFd, path); - } - - @ExportMessage - final void kill(long pid, int signal, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.kill(nativePosixSupport, pid, signal); - } - - @ExportMessage - final void killpg(long pgid, int signal, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.killpg(nativePosixSupport, pgid, signal); - } - - @ExportMessage - final long[] waitpid(long pid, int options, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.waitpid(nativePosixSupport, pid, options); - } - - @ExportMessage - final void abort(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - nativeLib.abort(nativePosixSupport); - } - - @ExportMessage - final boolean wcoredump(int status, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.wcoredump(nativePosixSupport, status); - } - - @ExportMessage - final boolean wifcontinued(int status, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.wifcontinued(nativePosixSupport, status); - } - - @ExportMessage - final boolean wifstopped(int status, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.wifstopped(nativePosixSupport, status); - } - - @ExportMessage - final boolean wifsignaled(int status, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.wifsignaled(nativePosixSupport, status); - } - - @ExportMessage - final boolean wifexited(int status, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.wifexited(nativePosixSupport, status); - } - - @ExportMessage - final int wexitstatus(int status, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.wexitstatus(nativePosixSupport, status); - } - - @ExportMessage - final int wtermsig(int status, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.wtermsig(nativePosixSupport, status); - } - - @ExportMessage - final int wstopsig(int status, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.wstopsig(nativePosixSupport, status); - } - - @ExportMessage - final long getuid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.getuid(nativePosixSupport); - } - - @ExportMessage - final long geteuid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.geteuid(nativePosixSupport); - } - - @ExportMessage - final long getgid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.getgid(nativePosixSupport); - } - - @ExportMessage - final long getegid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.getegid(nativePosixSupport); - } - - @ExportMessage - final long getppid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.getppid(nativePosixSupport); - } - - @ExportMessage - final long getpgid(long pid, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.getpgid(nativePosixSupport, pid); - } - - @ExportMessage - final void setpgid(long pid, long pgid, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.setpgid(nativePosixSupport, pid, pgid); - } - - @ExportMessage - final long getpgrp(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.getpgrp(nativePosixSupport); - } - - @ExportMessage - final long getsid(long pid, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.getsid(nativePosixSupport, pid); - } - - @ExportMessage - final long setsid( - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.setsid(nativePosixSupport); - } - - @ExportMessage - final long[] getgroups( - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.getgroups(nativePosixSupport); - } - - @ExportMessage - final RusageResult getrusage(int who, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.getrusage(nativePosixSupport, who); - } - - @ExportMessage - final OpenPtyResult openpty(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.openpty(nativePosixSupport); - } - - @ExportMessage - final TruffleString ctermid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.ctermid(nativePosixSupport); - } - - @ExportMessage - final void setenv(Object name, Object value, boolean overwrite, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.setenv(nativePosixSupport, name, value, overwrite); - } - - @ExportMessage - final void unsetenv(Object name, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.unsetenv(nativePosixSupport, name); - } - - @ExportMessage - final int forkExec(Object[] executables, Object[] args, Object cwd, Object[] env, int stdinReadFd, int stdinWriteFd, int stdoutReadFd, int stdoutWriteFd, int stderrReadFd, int stderrWriteFd, - int errPipeReadFd, int errPipeWriteFd, boolean closeFds, boolean restoreSignals, boolean callSetsid, int[] fdsToKeep, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.forkExec(nativePosixSupport, executables, args, cwd, env, stdinReadFd, stdinWriteFd, stdoutReadFd, stdoutWriteFd, stderrReadFd, stderrWriteFd, errPipeReadFd, errPipeWriteFd, - closeFds, restoreSignals, callSetsid, fdsToKeep); - } - - @ExportMessage - final void execv(Object pathname, Object[] args, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.execv(nativePosixSupport, pathname, args); - } - - @ExportMessage - final int system(Object command, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.system(nativePosixSupport, command); - } - - @ExportMessage - final Object mmap(long length, int prot, int flags, int fd, long offset, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.mmap(nativePosixSupport, length, prot, flags, fd, offset); - } - - @ExportMessage - final byte mmapReadByte(Object mmap, long index, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.mmapReadByte(nativePosixSupport, mmap, index); - } - - @ExportMessage - final void mmapWriteByte(Object mmap, long index, byte value, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.mmapWriteByte(nativePosixSupport, mmap, index, value); - } - - @ExportMessage - final int mmapReadBytes(Object mmap, long index, byte[] bytes, int length, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.mmapReadBytes(nativePosixSupport, mmap, index, bytes, length); - } - - @ExportMessage - final void mmapWriteBytes(Object mmap, long index, byte[] bytes, int length, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.mmapWriteBytes(nativePosixSupport, mmap, index, bytes, length); - } - - @ExportMessage - final void mmapFlush(Object mmap, long offset, long length, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.mmapFlush(nativePosixSupport, mmap, offset, length); - } - - @ExportMessage - final void mmapUnmap(Object mmap, long length, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.mmapUnmap(nativePosixSupport, mmap, length); - } - - @ExportMessage - @SuppressWarnings("static-method") - final long mmapGetPointer(Object mmap, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.mmapGetPointer(nativePosixSupport, mmap); - } - - @ExportMessage - public PwdResult getpwuid(long uid, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.getpwuid(nativePosixSupport, uid); - } - - @ExportMessage - public PwdResult getpwnam(Object name, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.getpwnam(nativePosixSupport, name); - } - - @ExportMessage - public boolean hasGetpwentries(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - return nativeLib.hasGetpwentries(nativePosixSupport); - } - - @ExportMessage - public PwdResult[] getpwentries(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.getpwentries(nativePosixSupport); - } - - @ExportMessage - final int ioctlBytes(int fd, long request, byte[] arg, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.ioctlBytes(nativePosixSupport, fd, request, arg); - } - - @ExportMessage - final int ioctlInt(int fd, long request, int arg, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.ioctlInt(nativePosixSupport, fd, request, arg); - } - - @ExportMessage - final int socket(int domain, int type, int protocol, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.socket(nativePosixSupport, domain, type, protocol); - } - - @ExportMessage - final AcceptResult accept(int sockfd, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.accept(nativePosixSupport, sockfd); - } - - @ExportMessage - final void bind(int sockfd, UniversalSockAddr addr, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.bind(nativePosixSupport, sockfd, addr); - } - - @ExportMessage - final void connect(int sockfd, UniversalSockAddr addr, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.connect(nativePosixSupport, sockfd, addr); - } - - @ExportMessage - final void listen(int sockfd, int backlog, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.listen(nativePosixSupport, sockfd, backlog); - } - - @ExportMessage - final UniversalSockAddr getpeername(int sockfd, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.getpeername(nativePosixSupport, sockfd); - } - - @ExportMessage - final UniversalSockAddr getsockname(int sockfd, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.getsockname(nativePosixSupport, sockfd); - } - - @ExportMessage - final int send(int sockfd, byte[] buf, int offset, int len, int flags, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.send(nativePosixSupport, sockfd, buf, offset, len, flags); - } - - @ExportMessage - final int sendto(int sockfd, byte[] buf, int offset, int len, int flags, UniversalSockAddr destAddr, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.sendto(nativePosixSupport, sockfd, buf, offset, len, flags, destAddr); - } - - @ExportMessage - final int recv(int sockfd, byte[] buf, int offset, int len, int flags, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.recv(nativePosixSupport, sockfd, buf, offset, len, flags); - } - - @ExportMessage - final RecvfromResult recvfrom(int sockfd, byte[] buf, int offset, int len, int flags, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.recvfrom(nativePosixSupport, sockfd, buf, offset, len, flags); - } - - @ExportMessage - final void shutdown(int sockfd, int how, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.shutdown(nativePosixSupport, sockfd, how); - } - - @ExportMessage - final int getsockopt(int sockfd, int level, int optname, byte[] optval, int optlen, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.getsockopt(nativePosixSupport, sockfd, level, optname, optval, optlen); - } - - @ExportMessage - final void setsockopt(int sockfd, int level, int optname, byte[] optval, int optlen, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - nativeLib.setsockopt(nativePosixSupport, sockfd, level, optname, optval, optlen); - } - - @ExportMessage - final int inet_addr(Object src, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.inet_addr(nativePosixSupport, src); - } - - @ExportMessage - final int inet_aton(Object src, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws InvalidAddressException { - checkNotInImageBuildtime(); - return nativeLib.inet_aton(nativePosixSupport, src); - } - - @ExportMessage - final Object inet_ntoa(int address, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.inet_ntoa(nativePosixSupport, address); - } - - @ExportMessage - final byte[] inet_pton(int family, Object src, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException, InvalidAddressException { - checkNotInImageBuildtime(); - return nativeLib.inet_pton(nativePosixSupport, family, src); - } - - @ExportMessage - final Object inet_ntop(int family, byte[] src, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.inet_ntop(nativePosixSupport, family, src); - } - - @ExportMessage - final Object gethostname(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.gethostname(nativePosixSupport); - } - - @ExportMessage - final Object[] getnameinfo(UniversalSockAddr addr, int flags, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws GetAddrInfoException { - checkNotInImageBuildtime(); - return nativeLib.getnameinfo(nativePosixSupport, addr, flags); - } - - @ExportMessage - final AddrInfoCursor getaddrinfo(Object node, Object service, int family, int sockType, int protocol, int flags, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws GetAddrInfoException { - checkNotInImageBuildtime(); - return nativeLib.getaddrinfo(nativePosixSupport, node, service, family, sockType, protocol, flags); - } - - @ExportMessage - final TruffleString crypt(TruffleString word, TruffleString salt, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { - checkNotInImageBuildtime(); - return nativeLib.crypt(nativePosixSupport, word, salt); - } - - @ExportMessage - final long semOpen(Object name, int openFlags, int mode, int value, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary lib) throws PosixException { - checkNotInImageBuildtime(); - return lib.semOpen(nativePosixSupport, name, openFlags, mode, value); - } - - @ExportMessage - final void semClose(long handle, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary lib) throws PosixException { - checkNotInImageBuildtime(); - lib.semClose(nativePosixSupport, handle); - } - - @ExportMessage - final void semUnlink(Object name, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary lib) throws PosixException { - checkNotInImageBuildtime(); - lib.semUnlink(nativePosixSupport, name); - } - - @ExportMessage - final int semGetValue(long handle, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary lib) throws PosixException { - checkNotInImageBuildtime(); - return lib.semGetValue(nativePosixSupport, handle); - } - - @ExportMessage - final void semPost(long handle, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary lib) throws PosixException { - checkNotInImageBuildtime(); - lib.semPost(nativePosixSupport, handle); - } - - @ExportMessage - final void semWait(long handle, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary lib) throws PosixException { - checkNotInImageBuildtime(); - lib.semWait(nativePosixSupport, handle); - } - - @ExportMessage - final boolean semTryWait(long handle, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary lib) throws PosixException { - checkNotInImageBuildtime(); - return lib.semTryWait(nativePosixSupport, handle); - } - - @ExportMessage - final boolean semTimedWait(long handle, long deadlineNs, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary lib) throws PosixException { - checkNotInImageBuildtime(); - return lib.semTimedWait(nativePosixSupport, handle, deadlineNs); - } - - @ExportMessage - final UniversalSockAddr createUniversalSockAddrInet4(Inet4SockAddr src, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.createUniversalSockAddrInet4(nativePosixSupport, src); - } - - @ExportMessage - final UniversalSockAddr createUniversalSockAddrInet6(Inet6SockAddr src, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - checkNotInImageBuildtime(); - return nativeLib.createUniversalSockAddrInet6(nativePosixSupport, src); - } - - @ExportMessage - final UniversalSockAddr createUniversalSockAddrUnix(UnixSockAddr src, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws InvalidUnixSocketPathException { - checkNotInImageBuildtime(); - return nativeLib.createUniversalSockAddrUnix(nativePosixSupport, src); - } - - @ExportMessage - final Object createPathFromString(TruffleString path, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - if (ImageInfo.inImageBuildtimeCode()) { - return PosixSupportLibrary.getUncached().createPathFromString(emulatedPosixSupport, path); - } - return nativeLib.createPathFromString(nativePosixSupport, path); - } - - @ExportMessage - final Object createPathFromBytes(byte[] path, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - if (ImageInfo.inImageBuildtimeCode()) { - return PosixSupportLibrary.getUncached().createPathFromBytes(emulatedPosixSupport, path); - } - return nativeLib.createPathFromBytes(nativePosixSupport, path); - } - - @ExportMessage - final TruffleString getPathAsString(Object path, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - if (ImageInfo.inImageBuildtimeCode()) { - return PosixSupportLibrary.getUncached().getPathAsString(emulatedPosixSupport, path); - } - return nativeLib.getPathAsString(nativePosixSupport, path); - } - - @ExportMessage - final Buffer getPathAsBytes(Object path, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { - if (ImageInfo.inImageBuildtimeCode()) { - return PosixSupportLibrary.getUncached().getPathAsBytes(emulatedPosixSupport, path); - } - return nativeLib.getPathAsBytes(nativePosixSupport, path); - } -} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/IndirectCallData.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/IndirectCallData.java index f243370e36..ecb2d1b573 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/IndirectCallData.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/IndirectCallData.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -41,7 +41,6 @@ package com.oracle.graal.python.runtime; import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.nodes.call.InvokeNode; import com.oracle.truffle.api.Assumption; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; @@ -104,10 +103,6 @@ public void setCalleeNeedsExceptionState() { public static boolean setEncapsulatingNeedsToPassCallerFrame(final Node callNode) { Node pythonCallNode = callNode; while (pythonCallNode != null) { - if (pythonCallNode instanceof InvokeNode) { - // see GR-50465 - return true; - } IndirectCallData data = PythonLanguage.lookupIndirectCallData(pythonCallNode); if (data != null) { data.setCalleeNeedsCallerFrame(); @@ -121,10 +116,6 @@ public static boolean setEncapsulatingNeedsToPassCallerFrame(final Node callNode public static void setEncapsulatingNeedsToPassExceptionState(Node callNode) { Node pythonCallNode = callNode; while (pythonCallNode != null) { - if (pythonCallNode instanceof InvokeNode) { - // see GR-50465 - break; - } IndirectCallData data = PythonLanguage.lookupIndirectCallData(pythonCallNode); if (data != null) { data.setCalleeNeedsExceptionState(); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/LoggingPosixSupport.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/LoggingPosixSupport.java index 2c023ccfbc..042b782152 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/LoggingPosixSupport.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/LoggingPosixSupport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -361,6 +361,17 @@ final int[] getTerminalSize(int fd, } } + @ExportMessage + final long sysconf(int name, + @CachedLibrary("this.delegate") PosixSupportLibrary lib) throws PosixException { + logEnter("sysconf", "%d", name); + try { + return logExit("sysconf", "%s", lib.sysconf(delegate, name)); + } catch (PosixException e) { + throw logException("sysconf", e); + } + } + @ExportMessage final long[] fstatat(int dirFd, Object pathname, boolean followSymlinks, @CachedLibrary("this.delegate") PosixSupportLibrary lib) throws PosixException { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/NFIPosixSupport.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/NFIPosixSupport.java index 71da521d8c..ba4279a864 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/NFIPosixSupport.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/NFIPosixSupport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,7 +44,6 @@ import static com.oracle.graal.python.nodes.StringLiterals.J_DEFAULT; import static com.oracle.graal.python.nodes.StringLiterals.J_NATIVE; import static com.oracle.graal.python.nodes.StringLiterals.J_NFI_LANGUAGE; -import static com.oracle.graal.python.nodes.StringLiterals.T_LLVM_LANGUAGE; import static com.oracle.graal.python.nodes.StringLiterals.T_NATIVE; import static com.oracle.graal.python.runtime.NFIPosixConstants.OFFSETOF_STRUCT_IN6_ADDR_S6_ADDR; import static com.oracle.graal.python.runtime.NFIPosixConstants.OFFSETOF_STRUCT_IN_ADDR_S_ADDR; @@ -89,8 +88,6 @@ import java.util.concurrent.atomic.AtomicReferenceArray; import java.util.logging.Level; -import org.graalvm.nativeimage.ImageInfo; - import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonOS; @@ -307,6 +304,8 @@ private enum PosixNativeFunction { call_ioctl_bytes("(sint32, uint64, [sint8]):sint32"), call_ioctl_int("(sint32, uint64, sint32):sint32"), + call_sysconf("(sint32):sint64"), + crypt("([sint8], [sint8]):sint64"); private final String signature; @@ -455,7 +454,7 @@ public InteropLibrary getResultInterop() { @CompilationFinal(dimensions = 1) private long[] constantValues; public NFIPosixSupport(PythonContext context, TruffleString nfiBackend) { - assert nfiBackend.equalsUncached(T_NATIVE, TS_ENCODING) || nfiBackend.equalsUncached(T_LLVM_LANGUAGE, TS_ENCODING); + assert nfiBackend.equalsUncached(T_NATIVE, TS_ENCODING); this.context = context; this.nfiBackend = nfiBackend; this.cachedFunctions = new AtomicReferenceArray<>(PosixNativeFunction.values().length); @@ -476,7 +475,7 @@ long getConstant(NFIPosixConstants constant) { @Override public void setEnv(Env env) { - if (ImageInfo.inImageBuildtimeCode()) { + if (env.isPreInitialization()) { return; } // Java NIO (and TruffleFile) do not expect/support changing native working directory since @@ -752,6 +751,19 @@ public int[] getTerminalSize(int fd, return size; } + @ExportMessage + public long sysconf(int name, + @Shared("invoke") @Cached InvokeNativeFunction invokeNode) throws PosixException { + long result = invokeNode.callLong(this, PosixNativeFunction.call_sysconf, name); + if (result == -1) { + int errno = getErrno(invokeNode); + if (errno != 0) { + throw newPosixException(invokeNode, errno); + } + } + return result; + } + @ExportMessage public long[] fstatat(int dirFd, Object pathname, boolean followSymlinks, @Shared("invoke") @Cached InvokeNativeFunction invokeNode) throws PosixException { @@ -1902,7 +1914,7 @@ public TruffleString crypt(TruffleString word, TruffleString salt, cryptLibrary = InvokeNativeFunction.loadLibrary(this, PythonOS.getPythonOS() != PythonOS.PLATFORM_DARWIN ? "libcrypt.so" : null); } catch (Throwable e) { CompilerDirectives.transferToInterpreterAndInvalidate(); - throw PRaiseNode.raiseUncached(invokeNode, PythonBuiltinClassType.SystemError, ErrorMessages.UNABLE_TO_LOAD_LIBCRYPT); + throw PRaiseNode.raiseStatic(invokeNode, PythonBuiltinClassType.SystemError, ErrorMessages.UNABLE_TO_LOAD_LIBCRYPT); } } PosixNativeFunction function = PosixNativeFunction.crypt; @@ -2385,7 +2397,6 @@ boolean semTimedWait(long handle, long deadlineNs, } long delayMs = Math.min(deadlineMs - currentMs, 20); TruffleSafepoint.setBlockedThreadInterruptible(node, Thread::sleep, delayMs); - TruffleSafepoint.poll(node); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/NativeBufferContext.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/NativeBufferContext.java index 8ac55987f4..b42b0c932d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/NativeBufferContext.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/NativeBufferContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,21 +40,25 @@ */ package com.oracle.graal.python.runtime; +import java.lang.ref.ReferenceQueue; +import java.util.concurrent.ConcurrentHashMap; + import com.oracle.graal.python.PythonLanguage; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext; +import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext; import com.oracle.graal.python.runtime.native_memory.NativeBuffer; import com.oracle.graal.python.runtime.native_memory.NativePrimitiveReference; import com.oracle.graal.python.runtime.sequence.storage.NativeIntSequenceStorage; import com.oracle.graal.python.runtime.sequence.storage.NativePrimitiveSequenceStorage; import com.oracle.graal.python.util.PythonUtils; +import com.oracle.graal.python.util.PythonSystemThreadTask; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.TruffleLanguage; import com.oracle.truffle.api.TruffleLogger; -import sun.misc.Unsafe; +import com.oracle.truffle.api.TruffleSafepoint; +import com.oracle.truffle.api.nodes.RootNode; -import java.lang.ref.ReferenceQueue; -import java.util.concurrent.ConcurrentHashMap; +import sun.misc.Unsafe; public class NativeBufferContext { private static final Unsafe unsafe = PythonUtils.initUnsafe(); @@ -63,8 +67,6 @@ public class NativeBufferContext { // Storing references here to keep them alive private ConcurrentHashMap phantomReferences; - private Thread nativeBufferReferenceCleanerThread; - @TruffleBoundary public void initReferenceQueue() { var context = PythonContext.get(null); @@ -73,10 +75,7 @@ public void initReferenceQueue() { TruffleLanguage.Env env = context.getEnv(); if (env.isCreateThreadAllowed()) { var runnable = new NativeBufferDeallocatorRunnable(referenceQueue, this.phantomReferences); - Thread thread = env.newTruffleThreadBuilder(runnable).build(); - thread.setDaemon(true); - thread.start(); - this.nativeBufferReferenceCleanerThread = thread; + context.createSystemThread(runnable).start(); } } @@ -89,20 +88,6 @@ public NativeIntSequenceStorage createNativeIntStorage(NativeBuffer valueBuffer, return storage; } - public void finalizeContext() { - Thread thread = this.nativeBufferReferenceCleanerThread; - if (thread != null) { - if (thread.isAlive() && !thread.isInterrupted()) { - thread.interrupt(); - } - try { - thread.join(); - } catch (InterruptedException e) { - // ignore - } - } - } - public NativeIntSequenceStorage toNativeIntStorage(int[] arr) { long sizeInBytes = (long) arr.length * (long) Integer.BYTES; NativeBuffer nativeBuffer = NativeBuffer.allocateNew(sizeInBytes); @@ -121,35 +106,29 @@ private ReferenceQueue getReferenceQueue() { return referenceQueue; } - static final class NativeBufferDeallocatorRunnable implements Runnable { - private static final TruffleLogger LOGGER = GraalHPyContext.getLogger(NativeBufferDeallocatorRunnable.class); + static final class NativeBufferDeallocatorRunnable extends PythonSystemThreadTask { + private static final TruffleLogger LOGGER = CApiContext.getLogger(NativeBufferDeallocatorRunnable.class); private final ReferenceQueue referenceQueue; private final ConcurrentHashMap references; public NativeBufferDeallocatorRunnable(ReferenceQueue referenceQueue, ConcurrentHashMap references) { + super("Arrow cleaner", LOGGER); this.referenceQueue = referenceQueue; this.references = references; } @Override - public void run() { + public void doRun() { PythonContext pythonContext = PythonContext.get(null); PythonLanguage language = pythonContext.getLanguage(); - + RootNode location = language.unavailableSafepointLocation; while (!pythonContext.getThreadState(language).isShuttingDown()) { - try { - NativePrimitiveReference phantomRef = (NativePrimitiveReference) referenceQueue.remove(); - phantomRef.release(); - references.remove(phantomRef); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - LOGGER.fine("Native buffer reference cleaner thread was interrupted and is exiting"); - return; - } + NativePrimitiveReference phantomRef = (NativePrimitiveReference) TruffleSafepoint.setBlockedThreadInterruptibleFunction(location, ReferenceQueue::remove, referenceQueue); + phantomRef.release(); + references.remove(phantomRef); } - LOGGER.fine("Native buffer reference cleaner thread is exiting."); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixConstants.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixConstants.java index ce050b11e4..b67dedc9fa 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixConstants.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixConstants.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -332,6 +332,39 @@ public final class PosixConstants { public static final OptionalIntConstant IPV6_RECVPATHMTU; public static final OptionalIntConstant IPV6_TCLASS; public static final OptionalIntConstant IPV6_USE_MIN_MTU; + public static final MandatoryIntConstant _SC_ARG_MAX; + public static final MandatoryIntConstant _SC_CHILD_MAX; + public static final OptionalIntConstant _SC_HOST_NAME_MAX; + public static final MandatoryIntConstant _SC_LOGIN_NAME_MAX; + public static final OptionalIntConstant _SC_NGROUPS_MAX; + public static final MandatoryIntConstant _SC_CLK_TCK; + public static final MandatoryIntConstant _SC_OPEN_MAX; + public static final MandatoryIntConstant _SC_PAGESIZE; + public static final MandatoryIntConstant _SC_PAGE_SIZE; + public static final OptionalIntConstant _SC_RE_DUP_MAX; + public static final OptionalIntConstant _SC_STREAM_MAX; + public static final OptionalIntConstant _SC_SYMLOOP_MAX; + public static final OptionalIntConstant _SC_TTY_NAME_MAX; + public static final OptionalIntConstant _SC_TZNAME_MAX; + public static final OptionalIntConstant _SC_VERSION; + public static final OptionalIntConstant _SC_BC_BASE_MAX; + public static final OptionalIntConstant _SC_BC_DIM_MAX; + public static final OptionalIntConstant _SC_BC_SCALE_MAX; + public static final OptionalIntConstant _SC_BC_STRING_MAX; + public static final OptionalIntConstant _SC_COLL_WEIGHTS_MAX; + public static final OptionalIntConstant _SC_EXPR_NEST_MAX; + public static final OptionalIntConstant _SC_LINE_MAX; + public static final OptionalIntConstant _SC_2_VERSION; + public static final OptionalIntConstant _SC_2_C_DEV; + public static final OptionalIntConstant _SC_2_FORT_DEV; + public static final OptionalIntConstant _SC_2_FORT_RUN; + public static final OptionalIntConstant _SC_2_LOCALEDEF; + public static final OptionalIntConstant _SC_2_SW_DEV; + public static final MandatoryIntConstant _SC_SEM_NSEMS_MAX; + public static final MandatoryIntConstant _SC_PHYS_PAGES; + public static final OptionalIntConstant _SC_AVPHYS_PAGES; + public static final MandatoryIntConstant _SC_NPROCESSORS_CONF; + public static final MandatoryIntConstant _SC_NPROCESSORS_ONLN; public static final IntConstant[] openFlags; public static final IntConstant[] fileType; @@ -355,6 +388,7 @@ public final class PosixConstants { public static final IntConstant[] socketOptions; public static final IntConstant[] tcpOptions; public static final IntConstant[] ipv6Options; + public static final IntConstant[] sysconfigNames; static { Registry reg = Registry.create(); @@ -614,6 +648,39 @@ public final class PosixConstants { IPV6_RECVPATHMTU = reg.createOptionalInt("IPV6_RECVPATHMTU"); IPV6_TCLASS = reg.createOptionalInt("IPV6_TCLASS"); IPV6_USE_MIN_MTU = reg.createOptionalInt("IPV6_USE_MIN_MTU"); + _SC_ARG_MAX = reg.createMandatoryInt("_SC_ARG_MAX"); + _SC_CHILD_MAX = reg.createMandatoryInt("_SC_CHILD_MAX"); + _SC_HOST_NAME_MAX = reg.createOptionalInt("_SC_HOST_NAME_MAX"); + _SC_LOGIN_NAME_MAX = reg.createMandatoryInt("_SC_LOGIN_NAME_MAX"); + _SC_NGROUPS_MAX = reg.createOptionalInt("_SC_NGROUPS_MAX"); + _SC_CLK_TCK = reg.createMandatoryInt("_SC_CLK_TCK"); + _SC_OPEN_MAX = reg.createMandatoryInt("_SC_OPEN_MAX"); + _SC_PAGESIZE = reg.createMandatoryInt("_SC_PAGESIZE"); + _SC_PAGE_SIZE = reg.createMandatoryInt("_SC_PAGE_SIZE"); + _SC_RE_DUP_MAX = reg.createOptionalInt("_SC_RE_DUP_MAX"); + _SC_STREAM_MAX = reg.createOptionalInt("_SC_STREAM_MAX"); + _SC_SYMLOOP_MAX = reg.createOptionalInt("_SC_SYMLOOP_MAX"); + _SC_TTY_NAME_MAX = reg.createOptionalInt("_SC_TTY_NAME_MAX"); + _SC_TZNAME_MAX = reg.createOptionalInt("_SC_TZNAME_MAX"); + _SC_VERSION = reg.createOptionalInt("_SC_VERSION"); + _SC_BC_BASE_MAX = reg.createOptionalInt("_SC_BC_BASE_MAX"); + _SC_BC_DIM_MAX = reg.createOptionalInt("_SC_BC_DIM_MAX"); + _SC_BC_SCALE_MAX = reg.createOptionalInt("_SC_BC_SCALE_MAX"); + _SC_BC_STRING_MAX = reg.createOptionalInt("_SC_BC_STRING_MAX"); + _SC_COLL_WEIGHTS_MAX = reg.createOptionalInt("_SC_COLL_WEIGHTS_MAX"); + _SC_EXPR_NEST_MAX = reg.createOptionalInt("_SC_EXPR_NEST_MAX"); + _SC_LINE_MAX = reg.createOptionalInt("_SC_LINE_MAX"); + _SC_2_VERSION = reg.createOptionalInt("_SC_2_VERSION"); + _SC_2_C_DEV = reg.createOptionalInt("_SC_2_C_DEV"); + _SC_2_FORT_DEV = reg.createOptionalInt("_SC_2_FORT_DEV"); + _SC_2_FORT_RUN = reg.createOptionalInt("_SC_2_FORT_RUN"); + _SC_2_LOCALEDEF = reg.createOptionalInt("_SC_2_LOCALEDEF"); + _SC_2_SW_DEV = reg.createOptionalInt("_SC_2_SW_DEV"); + _SC_SEM_NSEMS_MAX = reg.createMandatoryInt("_SC_SEM_NSEMS_MAX"); + _SC_PHYS_PAGES = reg.createMandatoryInt("_SC_PHYS_PAGES"); + _SC_AVPHYS_PAGES = reg.createOptionalInt("_SC_AVPHYS_PAGES"); + _SC_NPROCESSORS_CONF = reg.createMandatoryInt("_SC_NPROCESSORS_CONF"); + _SC_NPROCESSORS_ONLN = reg.createMandatoryInt("_SC_NPROCESSORS_ONLN"); openFlags = new IntConstant[]{O_ACCMODE, O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_EXCL, O_TRUNC, O_APPEND, O_NONBLOCK, O_NOCTTY, O_NDELAY, O_DSYNC, O_CLOEXEC, O_SYNC, O_DIRECT, O_RSYNC, O_TMPFILE, O_TEMPORARY, O_DIRECTORY, O_BINARY, O_TEXT, O_XATTR, O_LARGEFILE, O_SHLOCK, O_EXLOCK, O_EXEC, O_SEARCH, O_PATH, O_TTY_INIT}; @@ -646,6 +713,10 @@ public final class PosixConstants { ipv6Options = new IntConstant[]{IPV6_JOIN_GROUP, IPV6_LEAVE_GROUP, IPV6_MULTICAST_HOPS, IPV6_MULTICAST_IF, IPV6_MULTICAST_LOOP, IPV6_UNICAST_HOPS, IPV6_V6ONLY, IPV6_CHECKSUM, IPV6_DONTFRAG, IPV6_DSTOPTS, IPV6_HOPLIMIT, IPV6_HOPOPTS, IPV6_NEXTHOP, IPV6_PATHMTU, IPV6_PKTINFO, IPV6_RECVDSTOPTS, IPV6_RECVHOPLIMIT, IPV6_RECVHOPOPTS, IPV6_RECVPKTINFO, IPV6_RECVRTHDR, IPV6_RECVTCLASS, IPV6_RTHDR, IPV6_RTHDRDSTOPTS, IPV6_RTHDR_TYPE_0, IPV6_RECVPATHMTU, IPV6_TCLASS, IPV6_USE_MIN_MTU}; + sysconfigNames = new IntConstant[]{_SC_ARG_MAX, _SC_CHILD_MAX, _SC_HOST_NAME_MAX, _SC_LOGIN_NAME_MAX, _SC_NGROUPS_MAX, _SC_CLK_TCK, _SC_OPEN_MAX, _SC_PAGESIZE, _SC_PAGE_SIZE, _SC_RE_DUP_MAX, + _SC_STREAM_MAX, _SC_SYMLOOP_MAX, _SC_TTY_NAME_MAX, _SC_TZNAME_MAX, _SC_VERSION, _SC_BC_BASE_MAX, _SC_BC_DIM_MAX, _SC_BC_SCALE_MAX, _SC_BC_STRING_MAX, _SC_COLL_WEIGHTS_MAX, + _SC_EXPR_NEST_MAX, _SC_LINE_MAX, _SC_2_VERSION, _SC_2_C_DEV, _SC_2_FORT_DEV, _SC_2_FORT_RUN, _SC_2_LOCALEDEF, _SC_2_SW_DEV, _SC_SEM_NSEMS_MAX, _SC_PHYS_PAGES, _SC_AVPHYS_PAGES, + _SC_NPROCESSORS_CONF, _SC_NPROCESSORS_ONLN}; } // end generated by gen_native_cfg.py // @formatter:on diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixConstantsDarwin.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixConstantsDarwin.java index 2ae39c5780..a6ac5ddfe8 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixConstantsDarwin.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixConstantsDarwin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -242,5 +242,22 @@ static void getConstants(PosixConstants.Registry constants) { constants.put("IPV6_RECVTCLASS", 35); constants.put("IPV6_RTHDR_TYPE_0", 0); constants.put("IPV6_TCLASS", 36); + constants.put("_SC_ARG_MAX", 1); + constants.put("_SC_CHILD_MAX", 2); + constants.put("_SC_LOGIN_NAME_MAX", 73); + constants.put("_SC_NGROUPS_MAX", 4); + constants.put("_SC_CLK_TCK", 3); + constants.put("_SC_OPEN_MAX", 5); + constants.put("_SC_PAGESIZE", 29); + constants.put("_SC_PAGE_SIZE", 29); + constants.put("_SC_RE_DUP_MAX", 16); + constants.put("_SC_STREAM_MAX", 26); + constants.put("_SC_TTY_NAME_MAX", 101); + constants.put("_SC_TZNAME_MAX", 27); + constants.put("_SC_VERSION", 8); + constants.put("_SC_SEM_NSEMS_MAX", 49); + constants.put("_SC_PHYS_PAGES", 200); + constants.put("_SC_NPROCESSORS_CONF", 83); + constants.put("_SC_NPROCESSORS_ONLN", 84); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixConstantsLinux.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixConstantsLinux.java index 97c90ef632..8b82c45635 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixConstantsLinux.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixConstantsLinux.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,8 +40,8 @@ */ package com.oracle.graal.python.runtime; -// Auto generated by gen_native_cfg.py at 2023-10-20 10:35:45.655413 -// on Linux arisu 6.5.7-100.fc37.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Oct 11 03:54:39 UTC 2023 x86_64 x86_64 +// Auto generated by gen_native_cfg.py at 2025-05-20 13:24:18.395774 +// on Linux FrankTheTank 5.15.167.4-microsoft-standard-WSL2 #1 SMP Tue Nov 5 00:21:55 UTC 2024 x86_64 x86_64 class PosixConstantsLinux { private PosixConstantsLinux() { @@ -290,5 +290,38 @@ static void getConstants(PosixConstants.Registry constants) { constants.put("IPV6_RTHDR_TYPE_0", 0); constants.put("IPV6_RECVPATHMTU", 60); constants.put("IPV6_TCLASS", 67); + constants.put("_SC_ARG_MAX", 0); + constants.put("_SC_CHILD_MAX", 1); + constants.put("_SC_HOST_NAME_MAX", 180); + constants.put("_SC_LOGIN_NAME_MAX", 71); + constants.put("_SC_NGROUPS_MAX", 3); + constants.put("_SC_CLK_TCK", 2); + constants.put("_SC_OPEN_MAX", 4); + constants.put("_SC_PAGESIZE", 30); + constants.put("_SC_PAGE_SIZE", 30); + constants.put("_SC_RE_DUP_MAX", 44); + constants.put("_SC_STREAM_MAX", 5); + constants.put("_SC_SYMLOOP_MAX", 173); + constants.put("_SC_TTY_NAME_MAX", 72); + constants.put("_SC_TZNAME_MAX", 6); + constants.put("_SC_VERSION", 29); + constants.put("_SC_BC_BASE_MAX", 36); + constants.put("_SC_BC_DIM_MAX", 37); + constants.put("_SC_BC_SCALE_MAX", 38); + constants.put("_SC_BC_STRING_MAX", 39); + constants.put("_SC_COLL_WEIGHTS_MAX", 40); + constants.put("_SC_EXPR_NEST_MAX", 42); + constants.put("_SC_LINE_MAX", 43); + constants.put("_SC_2_VERSION", 46); + constants.put("_SC_2_C_DEV", 48); + constants.put("_SC_2_FORT_DEV", 49); + constants.put("_SC_2_FORT_RUN", 50); + constants.put("_SC_2_LOCALEDEF", 52); + constants.put("_SC_2_SW_DEV", 51); + constants.put("_SC_SEM_NSEMS_MAX", 32); + constants.put("_SC_PHYS_PAGES", 85); + constants.put("_SC_AVPHYS_PAGES", 86); + constants.put("_SC_NPROCESSORS_CONF", 83); + constants.put("_SC_NPROCESSORS_ONLN", 84); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixConstantsWin32.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixConstantsWin32.java index 4d3f3529e8..fd441c7f4f 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixConstantsWin32.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixConstantsWin32.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,8 +40,8 @@ */ package com.oracle.graal.python.runtime; -// Auto generated by gen_native_cfg.py at 2023-07-06 09:43:02.003004 -// on Windows DESKTOP-UOQCHD2 10 10.0.22621 AMD64 Intel64 Family 6 Model 165 Stepping 2, GenuineIntel +// Auto generated by gen_native_cfg.py at 2024-12-11 11:43:19.772900 +// on Windows FrankTheTank 11 10.0.22631 AMD64 Intel64 Family 6 Model 186 Stepping 2, GenuineIntel class PosixConstantsWin32 { private PosixConstantsWin32() { @@ -84,13 +84,13 @@ static void getConstants(PosixConstants.Registry constants) { constants.put("S_IFDIR", 0x00004000); constants.put("S_IFCHR", 0x00002000); constants.put("S_IFIFO", 0); - constants.put("MAP_SHARED", 0); - constants.put("MAP_PRIVATE", 0); - constants.put("MAP_ANONYMOUS", 0); + constants.put("MAP_SHARED", 1); + constants.put("MAP_PRIVATE", 2); + constants.put("MAP_ANONYMOUS", 4); constants.put("PROT_NONE", 0); - constants.put("PROT_READ", 0); - constants.put("PROT_WRITE", 0); - constants.put("PROT_EXEC", 0); + constants.put("PROT_READ", 1); + constants.put("PROT_WRITE", 2); + constants.put("PROT_EXEC", 4); constants.put("LOCK_SH", 0); constants.put("LOCK_EX", 0); constants.put("LOCK_NB", 0); @@ -215,5 +215,16 @@ static void getConstants(PosixConstants.Registry constants) { constants.put("IPV6_RECVTCLASS", 40); constants.put("IPV6_RTHDR", 32); constants.put("IPV6_TCLASS", 39); + constants.put("_SC_ARG_MAX", 0); + constants.put("_SC_CHILD_MAX", 1); + constants.put("_SC_LOGIN_NAME_MAX", 2); + constants.put("_SC_CLK_TCK", 3); + constants.put("_SC_OPEN_MAX", 4); + constants.put("_SC_PAGESIZE", 5); + constants.put("_SC_PAGE_SIZE", 5); + constants.put("_SC_SEM_NSEMS_MAX", 7); + constants.put("_SC_PHYS_PAGES", 8); + constants.put("_SC_NPROCESSORS_CONF", 9); + constants.put("_SC_NPROCESSORS_ONLN", 9); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixSupportLibrary.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixSupportLibrary.java index e92f0af5fc..0e91cfba18 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixSupportLibrary.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixSupportLibrary.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -125,6 +125,8 @@ public abstract class PosixSupportLibrary extends Library { public abstract int[] getTerminalSize(Object receiver, int fd) throws PosixException; + public abstract long sysconf(Object receiver, int name) throws PosixException; + // see stat_struct_to_longs in posix.c for the layout of the array public abstract long[] fstatat(Object receiver, int dirFd, Object pathname, boolean followSymlinks) throws PosixException; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PreInitPosixSupport.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PreInitPosixSupport.java new file mode 100644 index 0000000000..a4d36183e5 --- /dev/null +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PreInitPosixSupport.java @@ -0,0 +1,1162 @@ +/* + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.graal.python.runtime; + +import static com.oracle.truffle.api.CompilerDirectives.shouldNotReachHere; + +import java.util.HashSet; +import java.util.IdentityHashMap; + +import com.oracle.graal.python.runtime.PosixSupportLibrary.AcceptResult; +import com.oracle.graal.python.runtime.PosixSupportLibrary.AddrInfoCursor; +import com.oracle.graal.python.runtime.PosixSupportLibrary.Buffer; +import com.oracle.graal.python.runtime.PosixSupportLibrary.GetAddrInfoException; +import com.oracle.graal.python.runtime.PosixSupportLibrary.Inet4SockAddr; +import com.oracle.graal.python.runtime.PosixSupportLibrary.Inet6SockAddr; +import com.oracle.graal.python.runtime.PosixSupportLibrary.InvalidAddressException; +import com.oracle.graal.python.runtime.PosixSupportLibrary.InvalidUnixSocketPathException; +import com.oracle.graal.python.runtime.PosixSupportLibrary.OpenPtyResult; +import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; +import com.oracle.graal.python.runtime.PosixSupportLibrary.PwdResult; +import com.oracle.graal.python.runtime.PosixSupportLibrary.RecvfromResult; +import com.oracle.graal.python.runtime.PosixSupportLibrary.RusageResult; +import com.oracle.graal.python.runtime.PosixSupportLibrary.SelectResult; +import com.oracle.graal.python.runtime.PosixSupportLibrary.Timeval; +import com.oracle.graal.python.runtime.PosixSupportLibrary.UniversalSockAddr; +import com.oracle.graal.python.runtime.PosixSupportLibrary.UnixSockAddr; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.TruffleLanguage.Env; +import com.oracle.truffle.api.library.CachedLibrary; +import com.oracle.truffle.api.library.ExportLibrary; +import com.oracle.truffle.api.library.ExportMessage; +import com.oracle.truffle.api.strings.TruffleString; + +@ExportLibrary(PosixSupportLibrary.class) +public class PreInitPosixSupport extends PosixSupport { + + protected final PosixSupport nativePosixSupport; + private PosixSupport emulatedPosixSupport; + private HashSet emulatedFds; + private IdentityHashMap emulatedDirStreams; + private boolean inPreInitialization; + + public PreInitPosixSupport(Env env, PosixSupport nativePosixSupport, PosixSupport emulatedPosixSupport) { + this.inPreInitialization = env.isPreInitialization(); + this.nativePosixSupport = nativePosixSupport; + this.emulatedPosixSupport = emulatedPosixSupport; + if (emulatedPosixSupport != null) { + emulatedFds = new HashSet<>(); + emulatedDirStreams = new IdentityHashMap<>(); + } + } + + @Override + public void setEnv(Env env) { + assert !env.isPreInitialization(); + this.inPreInitialization = env.isPreInitialization(); + nativePosixSupport.setEnv(env); + } + + public void checkLeakingResources() { + assert inPreInitialization; + if (!emulatedFds.isEmpty()) { + throw shouldNotReachHere("Emulated fds leaked into the image"); + } + if (!emulatedDirStreams.isEmpty()) { + throw shouldNotReachHere("Emulated dirStreams leaked into the image"); + } + emulatedPosixSupport = null; + emulatedFds = null; + emulatedDirStreams = null; + } + + private void checkNotInPreInitialization() { + if (inPreInitialization) { + throw shouldNotReachHere("Posix call not expected during pre-initialization"); + } + } + + @TruffleBoundary + private int addFd(int fd) { + if (emulatedFds.contains(fd)) { + throw shouldNotReachHere("duplicate fd"); + } + emulatedFds.add(fd); + return fd; + } + + @TruffleBoundary + private int removeFd(int fd) { + if (!emulatedFds.contains(fd)) { + throw shouldNotReachHere("Closing fd that has not been open"); + } + emulatedFds.remove(fd); + return fd; + } + + @TruffleBoundary + private Object addDirStream(Object dirStream) { + if (emulatedDirStreams.containsKey(dirStream)) { + throw shouldNotReachHere("Duplicate dirStream"); + } + emulatedDirStreams.put(dirStream, dirStream); + return dirStream; + } + + @TruffleBoundary + private Object removeDirStream(Object dirStream) { + if (!emulatedDirStreams.containsKey(dirStream)) { + throw shouldNotReachHere("Closing dirStream that has not been open"); + } + emulatedDirStreams.remove(dirStream); + return dirStream; + } + + @ExportMessage + final TruffleString getBackend(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.getBackend(nativePosixSupport); + } + + @ExportMessage + final TruffleString strerror(int errorCode, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.strerror(nativePosixSupport, errorCode); + } + + @ExportMessage + final long getpid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.getpid(nativePosixSupport); + } + + @ExportMessage + final int umask(int mask, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.umask(nativePosixSupport, mask); + } + + @ExportMessage + final int openat(int dirFd, Object pathname, int flags, int mode, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + if (inPreInitialization) { + return addFd(PosixSupportLibrary.getUncached().openat(emulatedPosixSupport, dirFd, pathname, flags, mode)); + } + return nativeLib.openat(nativePosixSupport, dirFd, pathname, flags, mode); + } + + @ExportMessage + final int close(int fd, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + if (inPreInitialization) { + return PosixSupportLibrary.getUncached().close(emulatedPosixSupport, removeFd(fd)); + } + return nativeLib.close(nativePosixSupport, fd); + } + + @ExportMessage + final Buffer read(int fd, long length, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + if (inPreInitialization) { + return PosixSupportLibrary.getUncached().read(emulatedPosixSupport, fd, length); + } + return nativeLib.read(nativePosixSupport, fd, length); + } + + @ExportMessage + final long write(int fd, Buffer data, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.write(nativePosixSupport, fd, data); + } + + @ExportMessage + final int dup(int fd, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.dup(nativePosixSupport, fd); + } + + @ExportMessage + final int dup2(int fd, int fd2, boolean inheritable, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.dup2(nativePosixSupport, fd, fd2, inheritable); + } + + @ExportMessage + final boolean getInheritable(int fd, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.getInheritable(nativePosixSupport, fd); + } + + @ExportMessage + final void setInheritable(int fd, boolean inheritable, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + if (inPreInitialization) { + PosixSupportLibrary.getUncached().setInheritable(emulatedPosixSupport, fd, inheritable); + return; + } + nativeLib.setInheritable(nativePosixSupport, fd, inheritable); + } + + @ExportMessage + final int[] pipe(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.pipe(nativePosixSupport); + } + + @ExportMessage + final SelectResult select(int[] readfds, int[] writefds, int[] errorfds, Timeval timeout, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.select(nativePosixSupport, readfds, writefds, errorfds, timeout); + } + + @ExportMessage + final long lseek(int fd, long offset, int how, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + if (inPreInitialization) { + return PosixSupportLibrary.getUncached().lseek(emulatedPosixSupport, fd, offset, how); + } + return nativeLib.lseek(nativePosixSupport, fd, offset, how); + } + + @ExportMessage + final void ftruncate(int fd, long length, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.ftruncate(nativePosixSupport, fd, length); + } + + @ExportMessage + final void truncate(Object path, long length, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.truncate(nativePosixSupport, path, length); + } + + @ExportMessage + final void fsync(int fd, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.fsync(nativePosixSupport, fd); + } + + @ExportMessage + final void flock(int fd, int operation, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.flock(nativePosixSupport, fd, operation); + } + + @ExportMessage + final void fcntlLock(int fd, boolean blocking, int lockType, int whence, long start, long length, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.fcntlLock(nativePosixSupport, fd, blocking, lockType, whence, start, length); + } + + @ExportMessage + final boolean getBlocking(int fd, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.getBlocking(nativePosixSupport, fd); + } + + @ExportMessage + final void setBlocking(int fd, boolean blocking, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.setBlocking(nativePosixSupport, fd, blocking); + } + + @ExportMessage + final int[] getTerminalSize(int fd, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.getTerminalSize(nativePosixSupport, fd); + } + + @ExportMessage + final long sysconf(int name, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.sysconf(nativePosixSupport, name); + } + + @ExportMessage + final long[] fstatat(int dirFd, Object pathname, boolean followSymlinks, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + if (inPreInitialization) { + return PosixSupportLibrary.getUncached().fstatat(emulatedPosixSupport, dirFd, pathname, followSymlinks); + } + return nativeLib.fstatat(nativePosixSupport, dirFd, pathname, followSymlinks); + } + + @ExportMessage + final long[] fstat(int fd, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + if (inPreInitialization) { + return PosixSupportLibrary.getUncached().fstat(emulatedPosixSupport, fd); + } + return nativeLib.fstat(nativePosixSupport, fd); + } + + @ExportMessage + final long[] statvfs(Object path, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + if (inPreInitialization) { + return PosixSupportLibrary.getUncached().statvfs(emulatedPosixSupport, path); + } + return nativeLib.statvfs(nativePosixSupport, path); + } + + @ExportMessage + final long[] fstatvfs(int fd, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + if (inPreInitialization) { + return PosixSupportLibrary.getUncached().fstatvfs(emulatedPosixSupport, fd); + } + return nativeLib.fstatvfs(nativePosixSupport, fd); + } + + @ExportMessage + final Object[] uname(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.uname(nativePosixSupport); + } + + @ExportMessage + final void unlinkat(int dirFd, Object pathname, boolean rmdir, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.unlinkat(nativePosixSupport, dirFd, pathname, rmdir); + } + + @ExportMessage + final void linkat(int oldFdDir, Object oldPath, int newFdDir, Object newPath, int flags, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.linkat(nativePosixSupport, oldFdDir, oldPath, newFdDir, newPath, flags); + } + + @ExportMessage + final void symlinkat(Object target, int linkpathDirFd, Object linkpath, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.symlinkat(nativePosixSupport, target, linkpathDirFd, linkpath); + } + + @ExportMessage + final void mkdirat(int dirFd, Object pathname, int mode, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.mkdirat(nativePosixSupport, dirFd, pathname, mode); + } + + @ExportMessage + final Object getcwd(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.getcwd(nativePosixSupport); + } + + @ExportMessage + final void chdir(Object path, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.chdir(nativePosixSupport, path); + } + + @ExportMessage + final void fchdir(int fd, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.fchdir(nativePosixSupport, fd); + } + + @ExportMessage + final boolean isatty(int fd, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.isatty(nativePosixSupport, fd); + } + + @ExportMessage + final Object opendir(Object path, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + if (inPreInitialization) { + return addDirStream(PosixSupportLibrary.getUncached().opendir(emulatedPosixSupport, path)); + } + return nativeLib.opendir(nativePosixSupport, path); + } + + @ExportMessage + final Object fdopendir(int fd, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.fdopendir(nativePosixSupport, fd); + } + + @ExportMessage + final void closedir(Object dirStream, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + if (inPreInitialization) { + PosixSupportLibrary.getUncached().closedir(emulatedPosixSupport, removeDirStream(dirStream)); + return; + } + nativeLib.closedir(nativePosixSupport, dirStream); + } + + @ExportMessage + final Object readdir(Object dirStream, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + if (inPreInitialization) { + return PosixSupportLibrary.getUncached().readdir(emulatedPosixSupport, dirStream); + } + return nativeLib.readdir(nativePosixSupport, dirStream); + } + + @ExportMessage + final void rewinddir(Object dirStream, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + if (inPreInitialization) { + PosixSupportLibrary.getUncached().rewinddir(emulatedPosixSupport, dirStream); + } + nativeLib.rewinddir(nativePosixSupport, dirStream); + } + + @ExportMessage + final Object dirEntryGetName(Object dirEntry, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + if (inPreInitialization) { + return PosixSupportLibrary.getUncached().dirEntryGetName(emulatedPosixSupport, dirEntry); + } + return nativeLib.dirEntryGetName(nativePosixSupport, dirEntry); + } + + @ExportMessage + final Object dirEntryGetPath(Object dirEntry, Object scandirPath, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.dirEntryGetPath(nativePosixSupport, dirEntry, scandirPath); + } + + @ExportMessage + final long dirEntryGetInode(Object dirEntry, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.dirEntryGetInode(nativePosixSupport, dirEntry); + } + + @ExportMessage + final int dirEntryGetType(Object dirEntry, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.dirEntryGetType(nativePosixSupport, dirEntry); + } + + @ExportMessage + final void utimensat(int dirFd, Object pathname, long[] timespec, boolean followSymlinks, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.utimensat(nativePosixSupport, dirFd, pathname, timespec, followSymlinks); + } + + @ExportMessage + final void futimens(int fd, long[] timespec, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.futimens(nativePosixSupport, fd, timespec); + } + + @ExportMessage + final void futimes(int fd, Timeval[] timeval, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.futimes(nativePosixSupport, fd, timeval); + } + + @ExportMessage + final void lutimes(Object filename, Timeval[] timeval, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.lutimes(nativePosixSupport, filename, timeval); + } + + @ExportMessage + final void utimes(Object filename, Timeval[] timeval, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.utimes(nativePosixSupport, filename, timeval); + } + + @ExportMessage + final void renameat(int oldDirFd, Object oldPath, int newDirFd, Object newPath, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.renameat(nativePosixSupport, oldDirFd, oldPath, newDirFd, newPath); + } + + @ExportMessage + final boolean faccessat(int dirFd, Object path, int mode, boolean effectiveIds, boolean followSymlinks, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.faccessat(nativePosixSupport, dirFd, path, mode, effectiveIds, followSymlinks); + } + + @ExportMessage + final void fchmodat(int dirFd, Object path, int mode, boolean followSymlinks, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.fchmodat(nativePosixSupport, dirFd, path, mode, followSymlinks); + } + + @ExportMessage + final void fchmod(int fd, int mode, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.fchmod(nativePosixSupport, fd, mode); + } + + @ExportMessage + final void fchownat(int dirFd, Object path, long owner, long group, boolean followSymlinks, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.fchownat(nativePosixSupport, dirFd, path, owner, group, followSymlinks); + } + + @ExportMessage + final void fchown(int fd, long owner, long group, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.fchown(nativePosixSupport, fd, owner, group); + } + + @ExportMessage + final Object readlinkat(int dirFd, Object path, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.readlinkat(nativePosixSupport, dirFd, path); + } + + @ExportMessage + final void kill(long pid, int signal, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.kill(nativePosixSupport, pid, signal); + } + + @ExportMessage + final void killpg(long pgid, int signal, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.killpg(nativePosixSupport, pgid, signal); + } + + @ExportMessage + final long[] waitpid(long pid, int options, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.waitpid(nativePosixSupport, pid, options); + } + + @ExportMessage + final void abort(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + nativeLib.abort(nativePosixSupport); + } + + @ExportMessage + final boolean wcoredump(int status, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.wcoredump(nativePosixSupport, status); + } + + @ExportMessage + final boolean wifcontinued(int status, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.wifcontinued(nativePosixSupport, status); + } + + @ExportMessage + final boolean wifstopped(int status, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.wifstopped(nativePosixSupport, status); + } + + @ExportMessage + final boolean wifsignaled(int status, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.wifsignaled(nativePosixSupport, status); + } + + @ExportMessage + final boolean wifexited(int status, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.wifexited(nativePosixSupport, status); + } + + @ExportMessage + final int wexitstatus(int status, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.wexitstatus(nativePosixSupport, status); + } + + @ExportMessage + final int wtermsig(int status, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.wtermsig(nativePosixSupport, status); + } + + @ExportMessage + final int wstopsig(int status, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.wstopsig(nativePosixSupport, status); + } + + @ExportMessage + final long getuid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.getuid(nativePosixSupport); + } + + @ExportMessage + final long geteuid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.geteuid(nativePosixSupport); + } + + @ExportMessage + final long getgid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.getgid(nativePosixSupport); + } + + @ExportMessage + final long getegid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.getegid(nativePosixSupport); + } + + @ExportMessage + final long getppid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.getppid(nativePosixSupport); + } + + @ExportMessage + final long getpgid(long pid, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.getpgid(nativePosixSupport, pid); + } + + @ExportMessage + final void setpgid(long pid, long pgid, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.setpgid(nativePosixSupport, pid, pgid); + } + + @ExportMessage + final long getpgrp(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.getpgrp(nativePosixSupport); + } + + @ExportMessage + final long getsid(long pid, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.getsid(nativePosixSupport, pid); + } + + @ExportMessage + final long setsid( + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.setsid(nativePosixSupport); + } + + @ExportMessage + final long[] getgroups( + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.getgroups(nativePosixSupport); + } + + @ExportMessage + final RusageResult getrusage(int who, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.getrusage(nativePosixSupport, who); + } + + @ExportMessage + final OpenPtyResult openpty(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.openpty(nativePosixSupport); + } + + @ExportMessage + final TruffleString ctermid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.ctermid(nativePosixSupport); + } + + @ExportMessage + final void setenv(Object name, Object value, boolean overwrite, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.setenv(nativePosixSupport, name, value, overwrite); + } + + @ExportMessage + final void unsetenv(Object name, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.unsetenv(nativePosixSupport, name); + } + + @ExportMessage + final int forkExec(Object[] executables, Object[] args, Object cwd, Object[] env, int stdinReadFd, int stdinWriteFd, int stdoutReadFd, int stdoutWriteFd, int stderrReadFd, int stderrWriteFd, + int errPipeReadFd, int errPipeWriteFd, boolean closeFds, boolean restoreSignals, boolean callSetsid, int[] fdsToKeep, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.forkExec(nativePosixSupport, executables, args, cwd, env, stdinReadFd, stdinWriteFd, stdoutReadFd, stdoutWriteFd, stderrReadFd, stderrWriteFd, errPipeReadFd, errPipeWriteFd, + closeFds, restoreSignals, callSetsid, fdsToKeep); + } + + @ExportMessage + final void execv(Object pathname, Object[] args, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.execv(nativePosixSupport, pathname, args); + } + + @ExportMessage + final int system(Object command, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.system(nativePosixSupport, command); + } + + @ExportMessage + final Object mmap(long length, int prot, int flags, int fd, long offset, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.mmap(nativePosixSupport, length, prot, flags, fd, offset); + } + + @ExportMessage + final byte mmapReadByte(Object mmap, long index, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.mmapReadByte(nativePosixSupport, mmap, index); + } + + @ExportMessage + final void mmapWriteByte(Object mmap, long index, byte value, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.mmapWriteByte(nativePosixSupport, mmap, index, value); + } + + @ExportMessage + final int mmapReadBytes(Object mmap, long index, byte[] bytes, int length, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.mmapReadBytes(nativePosixSupport, mmap, index, bytes, length); + } + + @ExportMessage + final void mmapWriteBytes(Object mmap, long index, byte[] bytes, int length, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.mmapWriteBytes(nativePosixSupport, mmap, index, bytes, length); + } + + @ExportMessage + final void mmapFlush(Object mmap, long offset, long length, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.mmapFlush(nativePosixSupport, mmap, offset, length); + } + + @ExportMessage + final void mmapUnmap(Object mmap, long length, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.mmapUnmap(nativePosixSupport, mmap, length); + } + + @ExportMessage + @SuppressWarnings("static-method") + final long mmapGetPointer(Object mmap, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.mmapGetPointer(nativePosixSupport, mmap); + } + + @ExportMessage + public PwdResult getpwuid(long uid, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.getpwuid(nativePosixSupport, uid); + } + + @ExportMessage + public PwdResult getpwnam(Object name, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.getpwnam(nativePosixSupport, name); + } + + @ExportMessage + public boolean hasGetpwentries(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + return nativeLib.hasGetpwentries(nativePosixSupport); + } + + @ExportMessage + public PwdResult[] getpwentries(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.getpwentries(nativePosixSupport); + } + + @ExportMessage + final int ioctlBytes(int fd, long request, byte[] arg, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.ioctlBytes(nativePosixSupport, fd, request, arg); + } + + @ExportMessage + final int ioctlInt(int fd, long request, int arg, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.ioctlInt(nativePosixSupport, fd, request, arg); + } + + @ExportMessage + final int socket(int domain, int type, int protocol, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.socket(nativePosixSupport, domain, type, protocol); + } + + @ExportMessage + final AcceptResult accept(int sockfd, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.accept(nativePosixSupport, sockfd); + } + + @ExportMessage + final void bind(int sockfd, UniversalSockAddr addr, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.bind(nativePosixSupport, sockfd, addr); + } + + @ExportMessage + final void connect(int sockfd, UniversalSockAddr addr, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.connect(nativePosixSupport, sockfd, addr); + } + + @ExportMessage + final void listen(int sockfd, int backlog, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.listen(nativePosixSupport, sockfd, backlog); + } + + @ExportMessage + final UniversalSockAddr getpeername(int sockfd, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.getpeername(nativePosixSupport, sockfd); + } + + @ExportMessage + final UniversalSockAddr getsockname(int sockfd, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.getsockname(nativePosixSupport, sockfd); + } + + @ExportMessage + final int send(int sockfd, byte[] buf, int offset, int len, int flags, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.send(nativePosixSupport, sockfd, buf, offset, len, flags); + } + + @ExportMessage + final int sendto(int sockfd, byte[] buf, int offset, int len, int flags, UniversalSockAddr destAddr, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.sendto(nativePosixSupport, sockfd, buf, offset, len, flags, destAddr); + } + + @ExportMessage + final int recv(int sockfd, byte[] buf, int offset, int len, int flags, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.recv(nativePosixSupport, sockfd, buf, offset, len, flags); + } + + @ExportMessage + final RecvfromResult recvfrom(int sockfd, byte[] buf, int offset, int len, int flags, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.recvfrom(nativePosixSupport, sockfd, buf, offset, len, flags); + } + + @ExportMessage + final void shutdown(int sockfd, int how, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.shutdown(nativePosixSupport, sockfd, how); + } + + @ExportMessage + final int getsockopt(int sockfd, int level, int optname, byte[] optval, int optlen, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.getsockopt(nativePosixSupport, sockfd, level, optname, optval, optlen); + } + + @ExportMessage + final void setsockopt(int sockfd, int level, int optname, byte[] optval, int optlen, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + nativeLib.setsockopt(nativePosixSupport, sockfd, level, optname, optval, optlen); + } + + @ExportMessage + final int inet_addr(Object src, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.inet_addr(nativePosixSupport, src); + } + + @ExportMessage + final int inet_aton(Object src, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws InvalidAddressException { + checkNotInPreInitialization(); + return nativeLib.inet_aton(nativePosixSupport, src); + } + + @ExportMessage + final Object inet_ntoa(int address, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.inet_ntoa(nativePosixSupport, address); + } + + @ExportMessage + final byte[] inet_pton(int family, Object src, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException, InvalidAddressException { + checkNotInPreInitialization(); + return nativeLib.inet_pton(nativePosixSupport, family, src); + } + + @ExportMessage + final Object inet_ntop(int family, byte[] src, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.inet_ntop(nativePosixSupport, family, src); + } + + @ExportMessage + final Object gethostname(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.gethostname(nativePosixSupport); + } + + @ExportMessage + final Object[] getnameinfo(UniversalSockAddr addr, int flags, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws GetAddrInfoException { + checkNotInPreInitialization(); + return nativeLib.getnameinfo(nativePosixSupport, addr, flags); + } + + @ExportMessage + final AddrInfoCursor getaddrinfo(Object node, Object service, int family, int sockType, int protocol, int flags, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws GetAddrInfoException { + checkNotInPreInitialization(); + return nativeLib.getaddrinfo(nativePosixSupport, node, service, family, sockType, protocol, flags); + } + + @ExportMessage + final TruffleString crypt(TruffleString word, TruffleString salt, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException { + checkNotInPreInitialization(); + return nativeLib.crypt(nativePosixSupport, word, salt); + } + + @ExportMessage + final long semOpen(Object name, int openFlags, int mode, int value, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary lib) throws PosixException { + checkNotInPreInitialization(); + return lib.semOpen(nativePosixSupport, name, openFlags, mode, value); + } + + @ExportMessage + final void semClose(long handle, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary lib) throws PosixException { + checkNotInPreInitialization(); + lib.semClose(nativePosixSupport, handle); + } + + @ExportMessage + final void semUnlink(Object name, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary lib) throws PosixException { + checkNotInPreInitialization(); + lib.semUnlink(nativePosixSupport, name); + } + + @ExportMessage + final int semGetValue(long handle, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary lib) throws PosixException { + checkNotInPreInitialization(); + return lib.semGetValue(nativePosixSupport, handle); + } + + @ExportMessage + final void semPost(long handle, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary lib) throws PosixException { + checkNotInPreInitialization(); + lib.semPost(nativePosixSupport, handle); + } + + @ExportMessage + final void semWait(long handle, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary lib) throws PosixException { + checkNotInPreInitialization(); + lib.semWait(nativePosixSupport, handle); + } + + @ExportMessage + final boolean semTryWait(long handle, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary lib) throws PosixException { + checkNotInPreInitialization(); + return lib.semTryWait(nativePosixSupport, handle); + } + + @ExportMessage + final boolean semTimedWait(long handle, long deadlineNs, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary lib) throws PosixException { + checkNotInPreInitialization(); + return lib.semTimedWait(nativePosixSupport, handle, deadlineNs); + } + + @ExportMessage + final UniversalSockAddr createUniversalSockAddrInet4(Inet4SockAddr src, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.createUniversalSockAddrInet4(nativePosixSupport, src); + } + + @ExportMessage + final UniversalSockAddr createUniversalSockAddrInet6(Inet6SockAddr src, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + checkNotInPreInitialization(); + return nativeLib.createUniversalSockAddrInet6(nativePosixSupport, src); + } + + @ExportMessage + final UniversalSockAddr createUniversalSockAddrUnix(UnixSockAddr src, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws InvalidUnixSocketPathException { + checkNotInPreInitialization(); + return nativeLib.createUniversalSockAddrUnix(nativePosixSupport, src); + } + + @ExportMessage + final Object createPathFromString(TruffleString path, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + if (inPreInitialization) { + return PosixSupportLibrary.getUncached().createPathFromString(emulatedPosixSupport, path); + } + return nativeLib.createPathFromString(nativePosixSupport, path); + } + + @ExportMessage + final Object createPathFromBytes(byte[] path, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + if (inPreInitialization) { + return PosixSupportLibrary.getUncached().createPathFromBytes(emulatedPosixSupport, path); + } + return nativeLib.createPathFromBytes(nativePosixSupport, path); + } + + @ExportMessage + final TruffleString getPathAsString(Object path, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + if (inPreInitialization) { + return PosixSupportLibrary.getUncached().getPathAsString(emulatedPosixSupport, path); + } + return nativeLib.getPathAsString(nativePosixSupport, path); + } + + @ExportMessage + final Buffer getPathAsBytes(Object path, + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + if (inPreInitialization) { + return PosixSupportLibrary.getUncached().getPathAsBytes(emulatedPosixSupport, path); + } + return nativeLib.getPathAsBytes(nativePosixSupport, path); + } +} diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java index 1e1bdbc4f7..79a6c80206 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -48,8 +48,6 @@ import static com.oracle.graal.python.nodes.StringLiterals.J_EXT_DYLIB; import static com.oracle.graal.python.nodes.StringLiterals.J_EXT_SO; import static com.oracle.graal.python.nodes.StringLiterals.J_LIB_PREFIX; -import static com.oracle.graal.python.nodes.StringLiterals.J_LLVM_LANGUAGE; -import static com.oracle.graal.python.nodes.StringLiterals.J_NATIVE; import static com.oracle.graal.python.nodes.StringLiterals.J_NFI_LANGUAGE; import static com.oracle.graal.python.nodes.StringLiterals.T_DASH; import static com.oracle.graal.python.nodes.StringLiterals.T_DOT; @@ -57,7 +55,6 @@ import static com.oracle.graal.python.nodes.StringLiterals.T_EXT_PYD; import static com.oracle.graal.python.nodes.StringLiterals.T_EXT_SO; import static com.oracle.graal.python.nodes.StringLiterals.T_JAVA; -import static com.oracle.graal.python.nodes.StringLiterals.T_LLVM_LANGUAGE; import static com.oracle.graal.python.nodes.StringLiterals.T_NATIVE; import static com.oracle.graal.python.nodes.StringLiterals.T_PATH; import static com.oracle.graal.python.nodes.StringLiterals.T_SITE; @@ -100,14 +97,12 @@ import java.util.concurrent.locks.ReentrantLock; import java.util.logging.Level; -import org.graalvm.nativeimage.ImageInfo; import org.graalvm.options.OptionKey; import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonOS; -import com.oracle.graal.python.builtins.modules.ImpModuleBuiltins; import com.oracle.graal.python.builtins.modules.MathGuards; import com.oracle.graal.python.builtins.modules.ctypes.CtypesModuleBuiltins.CtypesThreadState; import com.oracle.graal.python.builtins.objects.PNone; @@ -117,9 +112,7 @@ import com.oracle.graal.python.builtins.objects.cext.capi.PyTruffleObjectFree; import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper.PythonAbstractObjectNativeWrapper; import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions.HandleContext; -import com.oracle.graal.python.builtins.objects.cext.common.LoadCExtException.ApiInitException; import com.oracle.graal.python.builtins.objects.cext.common.NativePointer; -import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext; import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess; import com.oracle.graal.python.builtins.objects.common.HashingStorage; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetItem; @@ -127,6 +120,7 @@ import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIterator; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIteratorNext; import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageIteratorValue; +import com.oracle.graal.python.builtins.objects.common.ObjectHashMap; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.builtins.objects.contextvars.PContextVarsContext; import com.oracle.graal.python.builtins.objects.dict.PDict; @@ -157,22 +151,28 @@ import com.oracle.graal.python.nodes.SpecialMethodNames; import com.oracle.graal.python.nodes.WriteUnraisableNode; import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode; +import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode; import com.oracle.graal.python.nodes.call.CallNode; import com.oracle.graal.python.nodes.object.SetDictNode; import com.oracle.graal.python.nodes.statement.AbstractImportNode; +import com.oracle.graal.python.nodes.util.CannotCastException; import com.oracle.graal.python.nodes.util.CastToJavaIntLossyNode; +import com.oracle.graal.python.nodes.util.CastToTruffleStringNode; import com.oracle.graal.python.runtime.AsyncHandler.AsyncAction; import com.oracle.graal.python.runtime.PythonContextFactory.GetThreadStateNodeGen; +import com.oracle.graal.python.runtime.arrow.ArrowSupport; import com.oracle.graal.python.runtime.exception.ExceptionUtils; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.exception.PythonThreadKillException; import com.oracle.graal.python.runtime.locale.PythonLocale; import com.oracle.graal.python.runtime.object.IDUtils; -import com.oracle.graal.python.runtime.object.PythonObjectFactory; +import com.oracle.graal.python.runtime.object.PFactory; import com.oracle.graal.python.util.Consumer; +import com.oracle.graal.python.util.PythonSystemThreadTask; import com.oracle.graal.python.util.PythonUtils; import com.oracle.graal.python.util.ShutdownHook; import com.oracle.graal.python.util.Supplier; +import com.oracle.graal.python.util.SuppressFBWarnings; import com.oracle.truffle.api.CallTarget; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives; @@ -182,6 +182,7 @@ import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.ThreadLocalAction; +import com.oracle.truffle.api.Truffle; import com.oracle.truffle.api.TruffleContext; import com.oracle.truffle.api.TruffleContext.Builder; import com.oracle.truffle.api.TruffleFile; @@ -189,6 +190,7 @@ import com.oracle.truffle.api.TruffleLanguage.ContextReference; import com.oracle.truffle.api.TruffleLanguage.Env; import com.oracle.truffle.api.TruffleLogger; +import com.oracle.truffle.api.TruffleOptions; import com.oracle.truffle.api.TruffleSafepoint; import com.oracle.truffle.api.dsl.Bind; import com.oracle.truffle.api.dsl.GenerateInline; @@ -200,17 +202,16 @@ import com.oracle.truffle.api.interop.ExceptionType; import com.oracle.truffle.api.interop.InteropLibrary; import com.oracle.truffle.api.interop.UnsupportedMessageException; -import com.oracle.truffle.api.nodes.LanguageInfo; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.source.Source; import com.oracle.truffle.api.strings.TruffleString; import com.oracle.truffle.api.utilities.CyclicAssumption; import com.oracle.truffle.api.utilities.TriState; import com.oracle.truffle.api.utilities.TruffleWeakReference; -import com.oracle.truffle.llvm.api.Toolchain; import sun.misc.Unsafe; +@Bind.DefaultExpression("get($node)") public final class PythonContext extends Python3Core { public static final TruffleString T_IMPLEMENTATION = tsLiteral("implementation"); public static final boolean DEBUG_CAPI = Boolean.getBoolean("python.DebugCAPI"); @@ -219,6 +220,7 @@ public final class PythonContext extends Python3Core { public final HandleContext nativeContext = new HandleContext(DEBUG_CAPI); public final NativeBufferContext nativeBufferContext = new NativeBufferContext(); + public final ArrowSupport arrowSupport = new ArrowSupport(this); private volatile boolean finalizing; @TruffleBoundary @@ -237,8 +239,6 @@ public static String getSupportLibName(String libName) { return getSupportLibName(getPythonOS(), libName); } - public static final String J_PYTHON_JNI_LIBRARY_NAME = System.getProperty("python.jni.library", getSupportLibName("pythonjni")); - /** * An enum of events which can currently be traced using python's tracing */ @@ -275,6 +275,37 @@ public enum ProfileEvent { } } + public static final class GCState { + private boolean enabled = true; + private int debug; + + private int[] thresholds = { + 700, // { .threshold = 700, }, + 10, // { .threshold = 10, }, + 10, // { .threshold = 10, }, + }; + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public int getDebug() { + return debug; + } + + public void setDebug(int debug) { + this.debug = debug; + } + + public int[] getThresholds() { + return thresholds; + } + } + /** * A class to store thread-local data mostly like CPython's {@code PyThreadState}. */ @@ -350,6 +381,13 @@ public static final class PythonThreadState { */ Object asyncgenFirstIter; + /* + * Instrumentation data (Bytecode DSL interpreter only). For the manual bytecode + * interpreter, this data is stored in a local state variable, but the DSL interpreter must + * use a thread local. + */ + PBytecodeDSLRootNode.InstrumentationData instrumentationData; + /* * Counter for C-level recursion depth used for Py_(Enter/Leave)RecursiveCall. */ @@ -489,7 +527,7 @@ public void setNativeWrapper(PThreadState nativeWrapper) { public PContextVarsContext getContextVarsContext() { if (contextVarsContext == null) { - contextVarsContext = PythonObjectFactory.getUncached().createContextVarsContext(); + contextVarsContext = PFactory.createContextVarsContext(PythonLanguage.get(null)); } return contextVarsContext; } @@ -499,7 +537,7 @@ public void setContextVarsContext(PContextVarsContext contextVarsContext) { this.contextVarsContext = contextVarsContext; } - public void dispose(PythonContext context) { + public void dispose(PythonContext context, boolean canRunGuestCode) { // This method may be called twice on the same object. /* @@ -520,21 +558,58 @@ public void dispose(PythonContext context) { } /* * Write 'NULL' to the native thread-local variable used to store the PyThreadState - * struct such that it cannot accidentally be reused. + * struct such that it cannot accidentally be reused. Since this is done as a + * precaution, we just skip this if we cannot run guest code, because it may invoke + * LLVM. */ - if (nativeThreadLocalVarPointer != null) { + if (nativeThreadLocalVarPointer != null && canRunGuestCode) { CStructAccess.WritePointerNode.writeUncached(nativeThreadLocalVarPointer, 0, context.getNativeNull()); nativeThreadLocalVarPointer = null; } } + private static void invalidateNoTracingOrProfilingAssumption(PythonLanguage language) { + if (language.noTracingOrProfilingAssumption.isValid()) { + language.noTracingOrProfilingAssumption.invalidate(); + + if (PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER) { + enableTracingOrProfilingForActiveRootNodes(); + } + } + } + + @TruffleBoundary + private static void enableTracingOrProfilingForActiveRootNodes() { + final List rootNodes = new ArrayList<>(); + + // Ensure tracing + profiling are enabled for each method on the stack. + Truffle.getRuntime().iterateFrames((frameInstance) -> { + if (frameInstance.getCallTarget() instanceof RootCallTarget c && c.getRootNode() instanceof PBytecodeDSLRootNode r) { + if (r.needsTraceAndProfileInstrumentation()) { + r.ensureTraceAndProfileEnabled(); + } + rootNodes.add(r); + } + return null; + }); + + /** + * Normally, a root node will push + pop the instrumentation data in its prolog/epilog. + * Since these nodes are on stack, we need to push them manually, starting from the + * deepest stack frame. + */ + for (PBytecodeDSLRootNode rootNode : rootNodes.reversed()) { + rootNode.getThreadState().pushInstrumentationData(rootNode); + } + } + public Object getTraceFun() { return traceFun; } public void setTraceFun(Object traceFun, PythonLanguage language) { if (this.traceFun != traceFun) { - language.noTracingOrProfilingAssumption.invalidate(); + invalidateNoTracingOrProfilingAssumption(language); this.traceFun = traceFun; } } @@ -563,7 +638,7 @@ public void setTracingWhat(TraceEvent tracingWhat) { public void setProfileFun(Object profileFun, PythonLanguage language) { if (this.profileFun != profileFun) { - language.noTracingOrProfilingAssumption.invalidate(); + invalidateNoTracingOrProfilingAssumption(language); this.profileFun = profileFun; } } @@ -585,6 +660,24 @@ public void profilingStop() { this.profiling = false; } + public PBytecodeDSLRootNode.InstrumentationData getInstrumentationData(PBytecodeDSLRootNode rootNode) { + assert PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER; + assert instrumentationData != null && instrumentationData.getRootNode() == rootNode; + return instrumentationData; + } + + public void pushInstrumentationData(PBytecodeDSLRootNode rootNode) { + assert PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER; + instrumentationData = new PBytecodeDSLRootNode.InstrumentationData(rootNode, instrumentationData); + } + + public void popInstrumentationData(PBytecodeDSLRootNode rootNode) { + assert PythonOptions.ENABLE_BYTECODE_DSL_INTERPRETER; + assert instrumentationData != null; + assert instrumentationData.getRootNode() == rootNode : instrumentationData.getRootNode(); + instrumentationData = instrumentationData.getPrevious(); + } + public Object getAsyncgenFirstIter() { return asyncgenFirstIter; } @@ -672,7 +765,7 @@ static PythonThreadState doNoShutdownWithContext(Node inliningTarget, PythonCont @Specialization(replaces = "doNoShutdownWithContext") @InliningCutoff PythonThreadState doGenericWithContext(Node inliningTarget, PythonContext context) { - PythonThreadState curThreadState = PythonLanguage.get(inliningTarget).getThreadStateLocal().get(context.env.getContext()); + PythonThreadState curThreadState = context.getLanguage(inliningTarget).getThreadStateLocal().get(context.env.getContext()); if (CompilerDirectives.injectBranchProbability(CompilerDirectives.SLOWPATH_PROBABILITY, curThreadState.isShuttingDown())) { context.killThread(); } @@ -694,7 +787,6 @@ PythonThreadState getThreadState(Node n) { private static final String J_NO_CORE_WARNING = "could not determine Graal.Python's core path - you may need to pass --python.CoreHome."; private static final String J_NO_STDLIB = "could not determine Graal.Python's standard library path. You need to pass --python.StdLibHome if you want to use the standard library."; private static final String J_NO_CAPI = "could not determine Graal.Python's C API library path. You need to pass --python.CAPI if you want to use the C extension modules."; - private static final String J_NO_JNI = "could not determine Graal.Python's JNI library. You need to pass --python.JNILibrary if you want to run, for example, binary HPy extension modules."; private PythonModule mainModule; private final List shutdownHooks = new ArrayList<>(); @@ -722,10 +814,13 @@ PythonThreadState getThreadState(Node n) { @CompilationFinal private TruffleLanguage.Env env; - /* map of thread IDs to the corresponding 'threadStates' */ + /* map of Python threads' IDs to the corresponding 'threadStates' */ private final Map threadStateMapping = Collections.synchronizedMap(new WeakHashMap<>()); private WeakReference mainThread; + /* List of non-Python level threads. Those threads will be joined in finalizeContext. */ + private final ArrayList> systemThreads = new ArrayList<>(); + private final ReentrantLock importLock = new ReentrantLock(); @CompilationFinal private boolean isInitialized = false; @@ -733,7 +828,6 @@ PythonThreadState getThreadState(Node n) { private OutputStream err; private InputStream in; @CompilationFinal private CApiContext cApiContext; - @CompilationFinal private GraalHPyContext hPyContext; @CompilationFinal private boolean nativeAccessAllowed; private TruffleString soABI; // cache for soAPI @@ -764,7 +858,7 @@ public Thread getOwner() { private final AsyncHandler.SharedFinalizer sharedFinalizer; // decides if we run the async weakref callbacks and destructors - private boolean gcEnabled = true; + private final GCState gcState = new GCState(); // A thread-local to store the full path to the currently active import statement, for Jython // compat @@ -802,7 +896,7 @@ public Thread getOwner() { private final ConcurrentHashMap deserializationId = new ConcurrentHashMap<>(); - private final long perfCounterStart = ImageInfo.inImageBuildtimeCode() ? 0 : System.nanoTime(); + @CompilationFinal private long perfCounterStart = System.nanoTime(); public static final String CHILD_CONTEXT_DATA = "childContextData"; @CompilationFinal private List childContextFDs; @@ -828,6 +922,18 @@ public Thread getOwner() { public RootCallTarget signatureContainer; + // Used to store classes registered for interop behavior by the user + // Keys: MetaObject/Class | Value: PythonClass[] + public final ObjectHashMap interopTypeRegistry = new ObjectHashMap(); + + // Used to store classes generated for interop behavior by the user + // Keys: MetaObject/Class | Value: PythonClass + // Gets cleared every time a user registers a new class + public final ObjectHashMap interopGeneratedClassCache = new ObjectHashMap(); + + // Invalidated every time a user registers a class + public final CyclicAssumption interopTypeRegistryCacheValidAssumption = new CyclicAssumption("InteropTypeRegistryCacheValid"); + public TruffleString getPyPackageContext() { return pyPackageContext; } @@ -1197,7 +1303,7 @@ public void putChildContextData(long id, ChildContextData data) { } public PythonContext(PythonLanguage language, TruffleLanguage.Env env) { - super(language, env.isNativeAccessAllowed(), env.isSocketIOAllowed()); + super(language, env); this.env = env; this.allocationReporter = env.lookup(AllocationReporter.class); this.childContextData = (ChildContextData) env.getConfig().get(CHILD_CONTEXT_DATA); @@ -1243,7 +1349,7 @@ public long spawnTruffleContext(int fd, int sentinel, int[] fdsToKeep) { forceSharing(getOption(PythonOptions.ForceSharingForInnerContexts)).// inheritAllAccess(true).// initializeCreatorContext(true).// - option("python.NativeModules", "false").// + option("python.IsolateNativeModules", "true").// // TODO always force java posix in spawned: test_multiprocessing_spawn fails // with that. Gives "OSError: [Errno 9] Bad file number" // option("python.PosixModuleBackend", "java").// @@ -1457,7 +1563,7 @@ public long getPerfCounterStart() { * Get a SecureRandom instance using a non-blocking source. */ public SecureRandom getSecureRandom() { - assert !ImageInfo.inImageBuildtimeCode(); + assert !env.isPreInitialization(); if (secureRandom == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); try { @@ -1478,7 +1584,7 @@ public SecureRandom getSecureRandom() { } public byte[] getHashSecret() { - assert !ImageInfo.inImageBuildtimeCode(); + assert !env.isPreInitialization(); return hashSecret; } @@ -1509,18 +1615,23 @@ public void initialize() { initializePosixSupport(); initialize(this); setupRuntimeInformation(false); - postInitialize(); - if (!ImageInfo.inImageBuildtimeCode()) { + postInitialize(env); + if (!env.isPreInitialization()) { importSiteIfForced(); - } else if (posixSupport instanceof ImageBuildtimePosixSupport) { - ((ImageBuildtimePosixSupport) posixSupport).checkLeakingResources(); + } else if (posixSupport instanceof PreInitPosixSupport) { + ((PreInitPosixSupport) posixSupport).checkLeakingResources(); } } finally { - if (ImageInfo.inImageBuildtimeCode()) { + if (env.isPreInitialization()) { mainThread = null; } releaseGil(); } + PythonOptions.checkBytecodeDSLEnv(); + } + + public void resetPerfCounter() { + perfCounterStart = System.nanoTime(); } public void patch(Env newEnv) { @@ -1533,11 +1644,12 @@ public void patch(Env newEnv) { mainThread = new WeakReference<>(Thread.currentThread()); setEnv(newEnv); setupRuntimeInformation(true); - postInitialize(); + postInitialize(newEnv); importSiteIfForced(); } finally { releaseGil(); } + PythonOptions.checkBytecodeDSLEnv(); } private void importSiteIfForced() { @@ -1553,9 +1665,6 @@ private void importSiteIfForced() { // When InputFilePath is set, this is handled by __graalpython__.run_path addSysPath0(); } - if (getOption(PythonOptions.SetupLLVMLibraryPaths)) { - ImpModuleBuiltins.importFrozenModuleObject(this, toTruffleStringUncached("graalpy.sulong_support"), false); - } } catch (PException e) { flushStdFiles(); throw e; @@ -1622,21 +1731,16 @@ private void patchPackagePaths(TruffleString from, TruffleString to) { Object[] paths = SequenceStorageNodes.CopyInternalArrayNode.executeUncached(((PList) path).getSequenceStorage()); for (int i = 0; i < paths.length; i++) { Object pathElement = paths[i]; - TruffleString strPath; - if (pathElement instanceof PString) { - strPath = ((PString) pathElement).getValueUncached(); - } else if (isJavaString(pathElement)) { - strPath = toTruffleStringUncached((String) pathElement); - } else if (pathElement instanceof TruffleString) { - strPath = (TruffleString) pathElement; - } else { - continue; - } - if (strPath.regionEqualsUncached(0, from, 0, from.codePointLengthUncached(TS_ENCODING), TS_ENCODING)) { - paths[i] = StringReplaceNode.getUncached().execute(strPath, from, to, -1); + try { + TruffleString strPath = CastToTruffleStringNode.executeUncached(pathElement); + if (strPath.regionEqualsUncached(0, from, 0, from.codePointLengthUncached(TS_ENCODING), TS_ENCODING)) { + paths[i] = StringReplaceNode.getUncached().execute(strPath, from, to, -1); + } + } catch (CannotCastException e) { + // ignore } } - ((PythonModule) v).setAttribute(SpecialAttributeNames.T___PATH__, factory().createList(paths)); + ((PythonModule) v).setAttribute(SpecialAttributeNames.T___PATH__, PFactory.createList(PythonLanguage.get(null), paths)); } // Update module.__file__ @@ -1661,7 +1765,7 @@ private void initializeLocale() { } private void setupRuntimeInformation(boolean isPatching) { - if (!ImageInfo.inImageBuildtimeCode()) { + if (!env.isPreInitialization()) { initializeHashSecret(); } initializeLocale(); @@ -1672,17 +1776,17 @@ private void setupRuntimeInformation(boolean isPatching) { nativeLZMA = NFILZMASupport.createNative(this, ""); } - mainModule = factory().createPythonModule(T___MAIN__); + mainModule = PFactory.createPythonModule(getLanguage(), T___MAIN__); mainModule.setAttribute(T___BUILTINS__, getBuiltins()); - mainModule.setAttribute(T___ANNOTATIONS__, factory().createDict()); - SetDictNode.executeUncached(mainModule, factory().createDictFixedStorage(mainModule)); + mainModule.setAttribute(T___ANNOTATIONS__, PFactory.createDict(getLanguage())); + SetDictNode.executeUncached(mainModule, PFactory.createDictFixedStorage(getLanguage(), mainModule)); getSysModules().setItem(T___MAIN__, mainModule); - if (ImageInfo.inImageBuildtimeCode()) { + if (env.isPreInitialization()) { // Patch any pre-loaded packages' paths if we're running // pre-initialization patchPackagePaths(getStdlibHome(), T_STD_LIB_PLACEHOLDER); - } else if (isPatching && ImageInfo.inImageRuntimeCode()) { + } else if (isPatching) { // Patch any pre-loaded packages' paths to the new stdlib home if // we're patching a pre-initialized context patchPackagePaths(T_STD_LIB_PLACEHOLDER, getStdlibHome()); @@ -1693,7 +1797,7 @@ private void setupRuntimeInformation(boolean isPatching) { } private void initializeHashSecret() { - assert !ImageInfo.inImageBuildtimeCode(); + assert !env.isPreInitialization(); Optional hashSeed = getOption(PythonOptions.HashSeed); if (hashSeed.isPresent()) { int hashSeedValue = hashSeed.get(); @@ -1737,14 +1841,18 @@ private void initializePosixSupport() { "switching to Java backend."); } result = new EmulatedPosixSupport(this); - } else if (eqNode.execute(T_NATIVE, option, TS_ENCODING) || eqNode.execute(T_LLVM_LANGUAGE, option, TS_ENCODING)) { - if (ImageInfo.inImageBuildtimeCode()) { + } else if (eqNode.execute(T_NATIVE, option, TS_ENCODING)) { + if (env.isPreInitialization()) { EmulatedPosixSupport emulatedPosixSupport = new EmulatedPosixSupport(this); NFIPosixSupport nativePosixSupport = new NFIPosixSupport(this, option); - result = new ImageBuildtimePosixSupport(nativePosixSupport, emulatedPosixSupport); - } else if (ImageInfo.inImageRuntimeCode()) { + result = new PreInitPosixSupport(env, nativePosixSupport, emulatedPosixSupport); + } else if (TruffleOptions.AOT) { + // We always use a PreInitPosixSupport on SVM to keep the type of the posixSupport + // field consistent for both pre-initialized and not-pre-initialized contexts so + // that host inlining and PE see only one type, and also to avoid polymorphism when + // calling library methods. NFIPosixSupport nativePosixSupport = new NFIPosixSupport(this, option); - result = new ImageBuildtimePosixSupport(nativePosixSupport, null); + result = new PreInitPosixSupport(env, nativePosixSupport, null); } else { if (!getOption(PythonOptions.RunViaLauncher)) { writeWarning("Native Posix backend is not fully supported when embedding. For example, standard I/O always uses file " + @@ -1762,12 +1870,12 @@ private void initializePosixSupport() { } } - private TruffleString langHome, sysPrefix, basePrefix, coreHome, capiHome, jniHome, stdLibHome; + private TruffleString langHome, sysPrefix, basePrefix, coreHome, capiHome, stdLibHome; public void initializeHomeAndPrefixPaths(Env newEnv, String languageHome) { - if (ImageInfo.inImageBuildtimeCode()) { + if (env.isPreInitialization()) { // at buildtime we do not need these paths to be valid, since all boot files are frozen - basePrefix = sysPrefix = langHome = coreHome = stdLibHome = capiHome = jniHome = T_DOT; + basePrefix = sysPrefix = langHome = coreHome = stdLibHome = capiHome = T_DOT; return; } @@ -1813,7 +1921,6 @@ public void initializeHomeAndPrefixPaths(Env newEnv, String languageHome) { coreHome = newEnv.getOptions().get(PythonOptions.CoreHome); stdLibHome = newEnv.getOptions().get(PythonOptions.StdLibHome); capiHome = newEnv.getOptions().get(PythonOptions.CAPI); - jniHome = newEnv.getOptions().get(PythonOptions.JNIHome); final TruffleFile homeCandidate = (TruffleFile) homeCandidateSupplier.get(); if (homeCandidate == null) { continue; @@ -1827,16 +1934,16 @@ public void initializeHomeAndPrefixPaths(Env newEnv, String languageHome) { "\n\tCoreHome: {3}" + "\n\tStdLibHome: {4}" + "\n\tCAPI: {5}" + - "\n\tJNI library: {6}" + - "\n\tHome candidate: {7}", languageHome, sysPrefix, basePrefix, coreHome, stdLibHome, capiHome, jniHome, homeCandidate.toString())); + "\n\tHome candidate: {6}", languageHome, sysPrefix, basePrefix, coreHome, stdLibHome, capiHome, homeCandidate.toString())); langHome = toTruffleStringUncached(homeCandidate.toString()); + TruffleString prefix = toTruffleStringUncached(homeCandidate.getAbsoluteFile().getPath()); if (sysPrefix.isEmpty()) { - sysPrefix = toTruffleStringUncached(homeCandidate.getAbsoluteFile().getPath()); + sysPrefix = prefix; } if (basePrefix.isEmpty()) { - basePrefix = toTruffleStringUncached(homeCandidate.getAbsoluteFile().getPath()); + basePrefix = prefix; } if (coreHome.isEmpty()) { @@ -1895,10 +2002,6 @@ public void initializeHomeAndPrefixPaths(Env newEnv, String languageHome) { capiHome = coreHome; } - if (jniHome.isEmpty()) { - jniHome = coreHome; - } - if (homeSeemsValid) { break; } @@ -1911,9 +2014,7 @@ public void initializeHomeAndPrefixPaths(Env newEnv, String languageHome) { "\n\tCoreHome: {3}" + "\n\tStdLibHome: {4}" + "\n\tExecutable: {5}" + - "\n\tCAPI: {6}" + - "\n\tJNI library: {7}", langHome, sysPrefix, basePrefix, coreHome, stdLibHome, newEnv.getOptions().get(PythonOptions.Executable), capiHome, - jniHome)); + "\n\tCAPI: {6}", langHome, sysPrefix, basePrefix, coreHome, stdLibHome, newEnv.getOptions().get(PythonOptions.Executable), capiHome)); } @TruffleBoundary @@ -1976,15 +2077,6 @@ public TruffleString getCAPIHome() { return capiHome; } - @TruffleBoundary - public TruffleString getJNIHome() { - if (jniHome.isEmpty()) { - writeWarning(J_NO_JNI); - return jniHome; - } - return jniHome; - } - private static void writeWarning(String warning) { LOGGER.warning(warning); } @@ -2032,7 +2124,7 @@ public void finalizeContext() { handler.shutdown(); finalizing = true; // interrupt and join or kill python threads - joinThreads(); + joinPythonThreads(); flushStdFiles(); if (cApiContext != null) { cApiContext.finalizeCApi(); @@ -2040,8 +2132,8 @@ public void finalizeContext() { // destroy thread state data, if anything is still running, it will crash now disposeThreadStates(); } - cleanupHPyResources(); - nativeBufferContext.finalizeContext(); + // interrupt and join or kill system threads + joinSystemThreads(); for (int fd : getChildContextFDs()) { if (!getSharedMultiprocessingData().decrementFDRefCount(fd)) { getSharedMultiprocessingData().closePipe(fd); @@ -2108,7 +2200,8 @@ public void runShutdownHooks() { } catch (PException e) { // It was printed already, so just discard } - for (ShutdownHook h : shutdownHooks) { + for (int i = shutdownHooks.size() - 1; i >= 0; i--) { + ShutdownHook h = shutdownHooks.get(i); h.call(this); } } @@ -2120,17 +2213,11 @@ public void runShutdownHooks() { @TruffleBoundary private void disposeThreadStates() { for (PythonThreadState ts : threadStateMapping.values()) { - ts.dispose(this); + ts.dispose(this, true); } threadStateMapping.clear(); } - private void cleanupHPyResources() { - if (hPyContext != null) { - hPyContext.finalizeContext(); - } - } - /** * This method is the equivalent to {@code pylifecycle.c: wait_for_thread_shutdown} and calls * {@code threading._shutdown} (if the threading module was loaded) to tear down all threads @@ -2157,7 +2244,7 @@ private void shutdownThreads() { boolean exitException = InteropLibrary.getUncached().isException(e) && InteropLibrary.getUncached().getExceptionType(e) == ExceptionType.EXIT; if (!exitException) { ExceptionUtils.printPythonLikeStackTrace(e); - if (PythonOptions.isWithJavaStacktrace(getLanguage())) { + if (PythonOptions.shouldPrintJavaStacktrace(getLanguage(), e)) { e.printStackTrace(new PrintWriter(getStandardErr())); } } @@ -2175,10 +2262,12 @@ private void shutdownThreads() { /** * This method joins all threads created by this context after the GIL was released. This is - * required by Truffle. + * required by Truffle. This is a last resort: most of the threads will already be finished, + * because Truffle should have submitted to them a Thread Local Action that throws + * cancelling/interrupt AbstractTruffleException that should have bubbled up to the top. */ @SuppressWarnings("deprecation") - private void joinThreads() { + private void joinPythonThreads() { LOGGER.fine("joining threads"); try { // make a copy of the threads, because the threads will disappear one by one from the @@ -2197,7 +2286,7 @@ private void joinThreads() { // they are still running some GraalPython code, if they are embedder threads // that are not running GraalPython code anymore, they will just never receive // PythonThreadKillException and continue as if nothing happened. - disposeThread(thread); + disposeThread(thread, true); boolean isOurThread = runViaLauncher || thread.getThreadGroup() == threadGroup; // Do not try so hard when running in embedded mode and the thread may not be // running any GraalPython code anymore @@ -2236,6 +2325,72 @@ protected void perform(ThreadLocalAction.Access access) { } } + /** + * This method joins all system threads, i.e., threads without mapping in + * {@link #threadStateMapping}, created by this context. This is required by Truffle. This is a + * last resort: most of the threads will already be finished, because Truffle should have + * submitted to them a Thread Local Action that throws cancelling/interrupt + * AbstractTruffleException that should have bubbled up to the top. + */ + @SuppressWarnings("deprecation") + private void joinSystemThreads() { + LOGGER.fine("joining system threads"); + for (WeakReference threadRef : systemThreads) { + Thread thread = threadRef.get(); + if (thread == null) { + continue; + } + assert thread != Thread.currentThread(); + LOGGER.finest("joining thread " + thread); + int tries = 100; + for (int i = 0; i < tries && thread.isAlive(); i++) { + killSystemThread(thread); + try { + thread.join(tries - i); + } catch (InterruptedException e) { + LOGGER.finest("got interrupt while joining threads"); + Thread.currentThread().interrupt(); + return; + } + if (!thread.isAlive()) { + break; + } + LOGGER.fine("Trying to interrupt our " + thread.getName() + " failed after " + (tries - i) + "ms."); + } + } + } + + /** + * See {@link PythonSystemThreadTask}. + */ + public Thread createSystemThread(PythonSystemThreadTask task) { + // TODO: use env.createSystemThread where applicable. Some of our "system" threads need to + // execute Python - those can never be real Truffle system threads, and all of them use + // TruffleLogger, which needs entered Context, but there may be some way around that. + // Truffle system threads would not be killed by submitting TLA, but by plain Java interrupt + // and check of thread state isShuttingDown flag. + Thread thread = env.newTruffleThreadBuilder(task).threadGroup(getThreadGroup()).build(); + thread.setDaemon(true); + thread.setName(task.getName()); + systemThreads.add(new TruffleWeakReference<>(thread)); + return thread; + } + + public void killSystemThread(Thread thread) { + env.submitThreadLocal(new Thread[]{thread}, new ThreadLocalAction(true, false) { + @Override + protected void perform(ThreadLocalAction.Access access) { + // just in case the thread holds GIL + PythonContext ctx = PythonContext.get(null); + if (ctx.ownsGil()) { + ctx.releaseGil(); + } + throw new PythonThreadKillException(); + } + }); + thread.interrupt(); + } + public void initializeMainModule(TruffleString path) { if (path != null) { mainModule.setAttribute(T___FILE__, path); @@ -2249,7 +2404,7 @@ public boolean isExecutableAccessAllowed() { /** * Trigger any pending asynchronous actions */ - public static final void triggerAsyncActions(Node node) { + public static void triggerAsyncActions(Node node) { TruffleSafepoint.poll(node); } @@ -2363,9 +2518,26 @@ static final String dumpStackOnAssertionHelper(String msg) { * @see GilNode */ @TruffleBoundary + // intentional catch of IllegalMonitorStateException, see inline comments + @SuppressFBWarnings("IMSE_DONT_CATCH_IMSE") void releaseGil() { - assert globalInterpreterLock.getHoldCount() == 1 : dumpStackOnAssertionHelper("trying to release the GIL with invalid hold count " + globalInterpreterLock.getHoldCount()); - globalInterpreterLock.unlock(); + // We allow hold count == 0 when cancelling, because a thread may have given up the GIL, + // then a cancelling (subclass of ThreadDeath) exception is thrown inside the code running + // without GIL through thread local action and in such case, we do not try to reacquire the + // GIL and let the ThreadDeath bubble up the stack to the top level and along the way we + // may have some finally blocks that are trying to release the initially acquired GIL and + // reach this method + assert globalInterpreterLock.getHoldCount() == 1 || (env.getContext().isCancelling() && globalInterpreterLock.getHoldCount() == 0) : dumpStackOnAssertionHelper( + "trying to release the GIL with invalid hold count " + globalInterpreterLock.getHoldCount()); + try { + globalInterpreterLock.unlock(); + } catch (IllegalMonitorStateException ex) { + // IllegalMonitorStateException is thrown if the lock is not owned by this thread, see + // the comment above why we allow it if the context is cancelling + if (!env.getContext().isCancelling()) { + throw ex; + } + } } /** @@ -2378,8 +2550,8 @@ public TruffleFile getPublicTruffleFileRelaxed(TruffleString path, TruffleString TruffleFile f = env.getInternalTruffleFile(path.toJavaStringUncached()); // 'isDirectory' does deliberately not follow symlinks because otherwise this could allow to // escape the language home directory. - // Also, during image build time, we allow full internal access. - if (ImageInfo.inImageBuildtimeCode() || isPyFileInLanguageHome(f) && (f.isDirectory(LinkOption.NOFOLLOW_LINKS) || hasAllowedSuffix(path, allowedSuffixes))) { + // Also, during pre-initialization, we allow full internal access. + if (env.isPreInitialization() || isPyFileInLanguageHome(f) && (f.isDirectory(LinkOption.NOFOLLOW_LINKS) || hasAllowedSuffix(path, allowedSuffixes))) { return f; } else { return env.getPublicTruffleFile(path.toJavaStringUncached()); @@ -2406,7 +2578,7 @@ private static boolean hasAllowedSuffix(TruffleString path, TruffleString[] allo */ @TruffleBoundary public boolean isPyFileInLanguageHome(TruffleFile path) { - assert !ImageInfo.inImageBuildtimeCode() : "language home won't be available during image build time"; + assert !env.isPreInitialization() : "language home won't be available during pre-initialization"; // The language home may be 'null' if an embedder uses Python. In this case, IO must just be // allowed. if (langHome != null) { @@ -2496,7 +2668,7 @@ public synchronized void attachThread(Thread thread, ContextThreadLocal new AtomicLong()).incrementAndGet(); } - public void ensureLLVMLanguage(Node nodeForRaise) { - if (!env.getInternalLanguages().containsKey(J_LLVM_LANGUAGE)) { - throw PRaiseNode.raiseUncached(nodeForRaise, PythonBuiltinClassType.SystemError, ErrorMessages.LLVM_NOT_AVAILABLE); - } - } - public void ensureNFILanguage(Node nodeForRaise, String optionName, String optionValue) { if (!env.getInternalLanguages().containsKey(J_NFI_LANGUAGE)) { - throw PRaiseNode.raiseUncached(nodeForRaise, PythonBuiltinClassType.SystemError, ErrorMessages.NFI_NOT_AVAILABLE, optionName, optionValue); + throw PRaiseNode.raiseStatic(nodeForRaise, PythonBuiltinClassType.SystemError, ErrorMessages.NFI_NOT_AVAILABLE, optionName, optionValue); } } - @TruffleBoundary - public String getLLVMSupportExt(String libName) { - if (!getOption(PythonOptions.NativeModules)) { - ensureLLVMLanguage(null); - LanguageInfo llvmInfo = env.getInternalLanguages().get(J_LLVM_LANGUAGE); - Toolchain toolchain = env.lookup(llvmInfo, Toolchain.class); - String toolchainIdentifier = toolchain.getIdentifier(); - if (!J_NATIVE.equals(toolchainIdentifier)) { - // if not native, we always assume a Linux-like system - return PythonContext.getSupportLibName(PythonOS.PLATFORM_LINUX, libName + '-' + toolchainIdentifier); - } - } - return PythonContext.getSupportLibName(libName + '-' + J_NATIVE); - } - @TruffleBoundary public TruffleString getSoAbi() { if (soABI == null) { @@ -2642,36 +2761,23 @@ public TruffleString getSoAbi() { // sys.implementation._multiarch TruffleString multiArch = (TruffleString) PyObjectGetAttr.executeUncached(implementationObj, T__MULTIARCH); - TruffleString toolchainId = getPlatformId(); - // only use '.pyd' if we are on 'Win32-native' TruffleString soExt; - if (getPythonOS() == PLATFORM_DARWIN && T_NATIVE.equalsUncached(toolchainId, TS_ENCODING)) { + if (getPythonOS() == PLATFORM_DARWIN) { // not ".dylib", similar to CPython: // https://github.com/python/cpython/issues/37510 soExt = T_EXT_SO; - } else if (getPythonOS() == PLATFORM_WIN32 && T_NATIVE.equalsUncached(toolchainId, TS_ENCODING)) { + } else if (getPythonOS() == PLATFORM_WIN32) { soExt = T_EXT_PYD; } else { soExt = T_EXT_SO; } - soABI = cat(T_DOT, cacheTag, T_DASH, toolchainId, T_DASH, multiArch, soExt); + soABI = cat(T_DOT, cacheTag, T_DASH, T_NATIVE, T_DASH, multiArch, soExt); } return soABI; } - public TruffleString getPlatformId() { - if (!getOption(PythonOptions.NativeModules)) { - ensureLLVMLanguage(null); - LanguageInfo llvmInfo = env.getInternalLanguages().get(J_LLVM_LANGUAGE); - Toolchain toolchain = env.lookup(llvmInfo, Toolchain.class); - return toTruffleStringUncached(toolchain.getIdentifier()); - } else { - return T_NATIVE; - } - } - public Thread getMainThread() { if (mainThread != null) { return mainThread.get(); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonImageBuildOptions.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonImageBuildOptions.java index 31c1bb4324..5ddd8d29e0 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonImageBuildOptions.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonImageBuildOptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -76,10 +76,6 @@ public final class PythonImageBuildOptions { * This property can be used to exclude socket and inet support from the Java posix backend. */ public static final boolean WITHOUT_JAVA_INET = Boolean.getBoolean("python.WithoutJavaInet"); - /** - * This property can be used to disable any usage of JNI. - */ - public static final boolean WITHOUT_JNI = Boolean.getBoolean("python.WithoutJNI"); private PythonImageBuildOptions() { } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonOptions.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonOptions.java index e50de17175..d033d40536 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonOptions.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonOptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. * Copyright (c) 2013, Regents of the University of California * * All rights reserved. @@ -38,7 +38,6 @@ import java.lang.annotation.Target; import java.lang.reflect.Field; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -63,6 +62,7 @@ import com.oracle.truffle.api.Option; import com.oracle.truffle.api.TruffleLanguage.Env; import com.oracle.truffle.api.dsl.Idempotent; +import com.oracle.truffle.api.exception.AbstractTruffleException; import com.oracle.truffle.api.nodes.ExplodeLoop; import com.oracle.truffle.api.strings.TruffleString; @@ -82,26 +82,23 @@ public final class PythonOptions { */ public static final boolean AUTOMATIC_ASYNC_ACTIONS = !"false".equalsIgnoreCase(System.getProperty("python.AutomaticAsyncActions")); - public enum HPyBackendMode { - NFI, - JNI, - LLVM - } - - static final OptionType HPY_BACKEND_TYPE = new OptionType<>("HPyBackend", s -> { - try { - return HPyBackendMode.valueOf(s.toUpperCase()); - } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("Backend can be one of: " + Arrays.toString(HPyBackendMode.values())); - } - }); - + /** + * Whether to use the experimental Bytecode DSL interpreter instead of the manually-written + * bytecode interpreter. + */ + public static final boolean ENABLE_BYTECODE_DSL_INTERPRETER = Boolean.getBoolean("python.EnableBytecodeDSLInterpreter"); private static final OptionType TS_OPTION_TYPE = new OptionType<>("graal.python.TruffleString", PythonUtils::toTruffleStringUncached); private PythonOptions() { // no instances } + public static void checkBytecodeDSLEnv() { + if (!ENABLE_BYTECODE_DSL_INTERPRETER && "true".equalsIgnoreCase(System.getenv("BYTECODE_DSL_INTERPRETER"))) { + System.err.println("WARNING: found environment variable BYTECODE_DSL_INTERPRETER=true, but the python.EnableBytecodeDSLInterpreter Java property was not set."); + } + } + @Option(category = OptionCategory.EXPERT, help = "Set the home of Python. Equivalent of GRAAL_PYTHONHOME env variable. " + "Determines default values for the CoreHome, StdLibHome, SysBasePrefix, SysPrefix.", usageSyntax = "", stability = OptionStability.STABLE) // public static final OptionKey PythonHome = new OptionKey<>(""); @@ -230,11 +227,12 @@ private PythonOptions() { @EngineOption @Option(category = OptionCategory.INTERNAL, help = "Eagerly initialize source sections.", usageSyntax = "true|false") // public static final OptionKey ForceInitializeSourceSections = new OptionKey<>(false); - @EngineOption @Option(category = OptionCategory.INTERNAL, help = "Print the java stacktrace. Possible modes:" + - " 1 Print Java stacktrace for Java exceptions only." + + @EngineOption @Option(category = OptionCategory.INTERNAL, help = "Print the Java stacktrace for exceptions. Possible modes:" + + " 0 Do not print any Java stacktraces." + + " 1 Print Java stacktrace for Java exceptions only (default)." + " 2 Print Java stacktrace for Python exceptions only (ATTENTION: this will have a notable performance impact)." + - " 3 Combines 1 and 2.", usageSyntax = "1|2|3") // - public static final OptionKey WithJavaStacktrace = new OptionKey<>(0); + " 3 Combines 1 and 2.", usageSyntax = "0|1|2|3") // + public static final OptionKey WithJavaStacktrace = new OptionKey<>(1); @Option(category = OptionCategory.INTERNAL, usageSyntax = "true|false", help = "") // public static final OptionKey CatchGraalPythonExceptionForUnitTesting = new OptionKey<>(false); @@ -242,20 +240,6 @@ private PythonOptions() { @EngineOption @Option(category = OptionCategory.INTERNAL, usageSyntax = "true|false", help = "Enable catching all Exceptions in generic try-catch statements.") // public static final OptionKey CatchAllExceptions = new OptionKey<>(false); - @EngineOption @Option(category = OptionCategory.INTERNAL, help = "Choose the backend for HPy binary mode.", usageSyntax = "jni|nfi|llvm", stability = OptionStability.EXPERIMENTAL) // - public static final OptionKey HPyBackend = new OptionKey<>(HPyBackendMode.JNI, HPY_BACKEND_TYPE); - - @EngineOption @Option(category = OptionCategory.INTERNAL, usageSyntax = "true|false", help = "If {@code true}, code is enabled that tries to reduce expensive upcalls into the runtime" + - "when HPy API functions are used. This is achieved by mirroring data in native memory.", stability = OptionStability.EXPERIMENTAL) // - public static final OptionKey HPyEnableJNIFastPaths = new OptionKey<>(true); - - @EngineOption @Option(category = OptionCategory.INTERNAL, usageSyntax = "